Index: /for-distributions/trunk/bin/windows/perl/bin/c2ph.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/c2ph.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/c2ph.bat	(revision 14489)
@@ -0,0 +1,1383 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+#
+#
+#   c2ph (aka pstruct)
+#   Tom Christiansen, <tchrist@convex.com>
+#
+#   As pstruct, dump C structures as generated from 'cc -g -S' stabs.
+#   As c2ph, do this PLUS generate perl code for getting at the structures.
+#
+#   See the usage message for more.  If this isn't enough, read the code.
+#
+
+=head1 NAME
+
+c2ph, pstruct - Dump C structures as generated from C<cc -g -S> stabs
+
+=head1 SYNOPSIS
+
+    c2ph [-dpnP] [var=val] [files ...]
+
+=head2 OPTIONS
+
+    Options:
+
+    -w	wide; short for: type_width=45 member_width=35 offset_width=8
+    -x	hex; short for:  offset_fmt=x offset_width=08 size_fmt=x size_width=04
+
+    -n	do not generate perl code  (default when invoked as pstruct)
+    -p	generate perl code         (default when invoked as c2ph)
+    -v	generate perl code, with C decls as comments
+
+    -i	do NOT recompute sizes for intrinsic datatypes
+    -a	dump information on intrinsics also
+
+    -t	trace execution
+    -d	spew reams of debugging output
+
+    -slist  give comma-separated list a structures to dump
+
+=head1 DESCRIPTION
+
+The following is the old c2ph.doc documentation by Tom Christiansen
+<tchrist@perl.com>
+Date: 25 Jul 91 08:10:21 GMT
+
+Once upon a time, I wrote a program called pstruct.  It was a perl
+program that tried to parse out C structures and display their member
+offsets for you.  This was especially useful for people looking at
+binary dumps or poking around the kernel.
+
+Pstruct was not a pretty program.  Neither was it particularly robust.
+The problem, you see, was that the C compiler was much better at parsing
+C than I could ever hope to be.
+
+So I got smart:  I decided to be lazy and let the C compiler parse the C,
+which would spit out debugger stabs for me to read.  These were much
+easier to parse.  It's still not a pretty program, but at least it's more
+robust.
+
+Pstruct takes any .c or .h files, or preferably .s ones, since that's
+the format it is going to massage them into anyway, and spits out
+listings like this:
+
+ struct tty {
+   int                          tty.t_locker                         000      4
+   int                          tty.t_mutex_index                    004      4
+   struct tty *                 tty.t_tp_virt                        008      4
+   struct clist                 tty.t_rawq                           00c     20
+     int                        tty.t_rawq.c_cc                      00c      4
+     int                        tty.t_rawq.c_cmax                    010      4
+     int                        tty.t_rawq.c_cfx                     014      4
+     int                        tty.t_rawq.c_clx                     018      4
+     struct tty *               tty.t_rawq.c_tp_cpu                  01c      4
+     struct tty *               tty.t_rawq.c_tp_iop                  020      4
+     unsigned char *            tty.t_rawq.c_buf_cpu                 024      4
+     unsigned char *            tty.t_rawq.c_buf_iop                 028      4
+   struct clist                 tty.t_canq                           02c     20
+     int                        tty.t_canq.c_cc                      02c      4
+     int                        tty.t_canq.c_cmax                    030      4
+     int                        tty.t_canq.c_cfx                     034      4
+     int                        tty.t_canq.c_clx                     038      4
+     struct tty *               tty.t_canq.c_tp_cpu                  03c      4
+     struct tty *               tty.t_canq.c_tp_iop                  040      4
+     unsigned char *            tty.t_canq.c_buf_cpu                 044      4
+     unsigned char *            tty.t_canq.c_buf_iop                 048      4
+   struct clist                 tty.t_outq                           04c     20
+     int                        tty.t_outq.c_cc                      04c      4
+     int                        tty.t_outq.c_cmax                    050      4
+     int                        tty.t_outq.c_cfx                     054      4
+     int                        tty.t_outq.c_clx                     058      4
+     struct tty *               tty.t_outq.c_tp_cpu                  05c      4
+     struct tty *               tty.t_outq.c_tp_iop                  060      4
+     unsigned char *            tty.t_outq.c_buf_cpu                 064      4
+     unsigned char *            tty.t_outq.c_buf_iop                 068      4
+   (*int)()                     tty.t_oproc_cpu                      06c      4
+   (*int)()                     tty.t_oproc_iop                      070      4
+   (*int)()                     tty.t_stopproc_cpu                   074      4
+   (*int)()                     tty.t_stopproc_iop                   078      4
+   struct thread *              tty.t_rsel                           07c      4
+
+etc.
+
+
+Actually, this was generated by a particular set of options.  You can control
+the formatting of each column, whether you prefer wide or fat, hex or decimal,
+leading zeroes or whatever.
+
+All you need to be able to use this is a C compiler than generates
+BSD/GCC-style stabs.  The B<-g> option on native BSD compilers and GCC
+should get this for you.
+
+To learn more, just type a bogus option, like B<-\?>, and a long usage message
+will be provided.  There are a fair number of possibilities.
+
+If you're only a C programmer, than this is the end of the message for you.
+You can quit right now, and if you care to, save off the source and run it
+when you feel like it.  Or not.
+
+
+
+But if you're a perl programmer, then for you I have something much more
+wondrous than just a structure offset printer.
+
+You see, if you call pstruct by its other incybernation, c2ph, you have a code
+generator that translates C code into perl code!  Well, structure and union
+declarations at least, but that's quite a bit.
+
+Prior to this point, anyone programming in perl who wanted to interact
+with C programs, like the kernel, was forced to guess the layouts of
+the C structures, and then hardwire these into his program.  Of course,
+when you took your wonderfully crafted program to a system where the
+sgtty structure was laid out differently, your program broke.  Which is
+a shame.
+
+We've had Larry's h2ph translator, which helped, but that only works on
+cpp symbols, not real C, which was also very much needed.  What I offer
+you is a symbolic way of getting at all the C structures.  I've couched
+them in terms of packages and functions.  Consider the following program:
+
+    #!/usr/local/bin/perl
+
+    require 'syscall.ph';
+    require 'sys/time.ph';
+    require 'sys/resource.ph';
+
+    $ru = "\0" x &rusage'sizeof();
+
+    syscall(&SYS_getrusage, &RUSAGE_SELF, $ru)      && die "getrusage: $!";
+
+    @ru = unpack($t = &rusage'typedef(), $ru);
+
+    $utime =  $ru[ &rusage'ru_utime + &timeval'tv_sec  ]
+	   + ($ru[ &rusage'ru_utime + &timeval'tv_usec ]) / 1e6;
+
+    $stime =  $ru[ &rusage'ru_stime + &timeval'tv_sec  ]
+	   + ($ru[ &rusage'ru_stime + &timeval'tv_usec ]) / 1e6;
+
+    printf "you have used %8.3fs+%8.3fu seconds.\n", $utime, $stime;
+
+
+As you see, the name of the package is the name of the structure.  Regular
+fields are just their own names.  Plus the following accessor functions are
+provided for your convenience:
+
+    struct	This takes no arguments, and is merely the number of first-level
+		elements in the structure.  You would use this for indexing
+		into arrays of structures, perhaps like this
+
+
+		    $usec = $u[ &user'u_utimer
+				+ (&ITIMER_VIRTUAL * &itimerval'struct)
+				+ &itimerval'it_value
+				+ &timeval'tv_usec
+			      ];
+
+    sizeof   	Returns the bytes in the structure, or the member if
+	     	you pass it an argument, such as
+
+			&rusage'sizeof(&rusage'ru_utime)
+
+    typedef  	This is the perl format definition for passing to pack and
+	     	unpack.  If you ask for the typedef of a nothing, you get
+	     	the whole structure, otherwise you get that of the member
+	     	you ask for.  Padding is taken care of, as is the magic to
+	     	guarantee that a union is unpacked into all its aliases.
+	     	Bitfields are not quite yet supported however.
+
+    offsetof	This function is the byte offset into the array of that
+		member.  You may wish to use this for indexing directly
+		into the packed structure with vec() if you're too lazy
+		to unpack it.
+
+    typeof	Not to be confused with the typedef accessor function, this
+		one returns the C type of that field.  This would allow
+		you to print out a nice structured pretty print of some
+		structure without knoning anything about it beforehand.
+		No args to this one is a noop.  Someday I'll post such
+		a thing to dump out your u structure for you.
+
+
+The way I see this being used is like basically this:
+
+	% h2ph <some_include_file.h  >  /usr/lib/perl/tmp.ph
+	% c2ph  some_include_file.h  >> /usr/lib/perl/tmp.ph
+	% install
+
+It's a little tricker with c2ph because you have to get the includes right.
+I can't know this for your system, but it's not usually too terribly difficult.
+
+The code isn't pretty as I mentioned  -- I never thought it would be a 1000-
+line program when I started, or I might not have begun. :-)  But I would have
+been less cavalier in how the parts of the program communicated with each
+other, etc.  It might also have helped if I didn't have to divine the makeup
+of the stabs on the fly, and then account for micro differences between my
+compiler and gcc.
+
+Anyway, here it is.  Should run on perl v4 or greater.  Maybe less.
+
+
+ --tom
+
+=cut
+
+$RCSID = '$Id: c2ph,v 1.7 95/10/28 10:41:47 tchrist Exp Locker: tchrist $';
+
+use File::Temp;
+
+######################################################################
+
+# some handy data definitions.   many of these can be reset later.
+
+$bitorder = 'b';  # ascending; set to B for descending bit fields
+
+%intrinsics =
+%template = (
+    'char', 			'c',
+    'unsigned char', 		'C',
+    'short',			's',
+    'short int',		's',
+    'unsigned short',		'S',
+    'unsigned short int',	'S',
+    'short unsigned int',	'S',
+    'int',			'i',
+    'unsigned int',		'I',
+    'long',			'l',
+    'long int',			'l',
+    'unsigned long',		'L',
+    'unsigned long',		'L',
+    'long unsigned int',	'L',
+    'unsigned long int',	'L',
+    'long long',		'q',
+    'long long int',		'q',
+    'unsigned long long',	'Q',
+    'unsigned long long int',	'Q',
+    'float',			'f',
+    'double',			'd',
+    'pointer',			'p',
+    'null',			'x',
+    'neganull',			'X',
+    'bit',			$bitorder,
+);
+
+&buildscrunchlist;
+delete $intrinsics{'neganull'};
+delete $intrinsics{'bit'};
+delete $intrinsics{'null'};
+
+# use -s to recompute sizes
+%sizeof = (
+    'char', 			'1',
+    'unsigned char', 		'1',
+    'short',			'2',
+    'short int',		'2',
+    'unsigned short',		'2',
+    'unsigned short int',	'2',
+    'short unsigned int',	'2',
+    'int',			'4',
+    'unsigned int',		'4',
+    'long',			'4',
+    'long int',			'4',
+    'unsigned long',		'4',
+    'unsigned long int',	'4',
+    'long unsigned int',	'4',
+    'long long',		'8',
+    'long long int',		'8',
+    'unsigned long long',	'8',
+    'unsigned long long int',	'8',
+    'float',			'4',
+    'double',			'8',
+    'pointer',			'4',
+);
+
+($type_width, $member_width, $offset_width, $size_width) = (20, 20, 6, 5);
+
+($offset_fmt, $size_fmt) = ('d', 'd');
+
+$indent = 2;
+
+$CC = 'cc';
+$CFLAGS = '-g -S';
+$DEFINES = '';
+
+$perl++ if $0 =~ m#/?c2ph$#;
+
+require 'getopts.pl';
+
+use File::Temp 'tempdir';
+
+eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift;
+
+&Getopts('aixdpvtnws:') || &usage(0);
+
+$opt_d && $debug++;
+$opt_t && $trace++;
+$opt_p && $perl++;
+$opt_v && $verbose++;
+$opt_n && ($perl = 0);
+
+if ($opt_w) {
+    ($type_width, $member_width, $offset_width) = (45, 35, 8);
+}
+if ($opt_x) {
+    ($offset_fmt, $offset_width, $size_fmt, $size_width) = ( 'x', '08', 'x', 04 );
+}
+
+eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift;
+
+sub PLUMBER {
+    select(STDERR);
+    print "oops, apperent pager foulup\n";
+    $isatty++;
+    &usage(1);
+}
+
+sub usage {
+    local($oops) = @_;
+    unless (-t STDOUT) {
+	select(STDERR);
+    } elsif (!$oops) {
+	$isatty++;
+	$| = 1;
+	print "hit <RETURN> for further explanation: ";
+	<STDIN>;
+	open (PIPE, "|". ($ENV{PAGER} || 'more'));
+	$SIG{PIPE} = PLUMBER;
+	select(PIPE);
+    }
+
+    print "usage: $0 [-dpnP] [var=val] [files ...]\n";
+
+    exit unless $isatty;
+
+    print <<EOF;
+
+Options:
+
+-w	wide; short for: type_width=45 member_width=35 offset_width=8
+-x	hex; short for:  offset_fmt=x offset_width=08 size_fmt=x size_width=04
+
+-n  	do not generate perl code  (default when invoked as pstruct)
+-p  	generate perl code         (default when invoked as c2ph)
+-v	generate perl code, with C decls as comments
+
+-i	do NOT recompute sizes for intrinsic datatypes
+-a	dump information on intrinsics also
+
+-t 	trace execution
+-d	spew reams of debugging output
+
+-slist  give comma-separated list a structures to dump
+
+
+Var Name        Default Value    Meaning
+
+EOF
+
+    &defvar('CC', 'which_compiler to call');
+    &defvar('CFLAGS', 'how to generate *.s files with stabs');
+    &defvar('DEFINES','any extra cflags or cpp defines, like -I, -D, -U');
+
+    print "\n";
+
+    &defvar('type_width', 'width of type field   (column 1)');
+    &defvar('member_width', 'width of member field (column 2)');
+    &defvar('offset_width', 'width of offset field (column 3)');
+    &defvar('size_width', 'width of size field   (column 4)');
+
+    print "\n";
+
+    &defvar('offset_fmt', 'sprintf format type for offset');
+    &defvar('size_fmt', 'sprintf format type for size');
+
+    print "\n";
+
+    &defvar('indent', 'how far to indent each nesting level');
+
+   print <<'EOF';
+
+    If any *.[ch] files are given, these will be catted together into
+    a temporary *.c file and sent through:
+	    $CC $CFLAGS $DEFINES
+    and the resulting *.s groped for stab information.  If no files are
+    supplied, then stdin is read directly with the assumption that it
+    contains stab information.  All other lines will be ignored.  At
+    most one *.s file should be supplied.
+
+EOF
+    close PIPE;
+    exit 1;
+}
+
+sub defvar {
+    local($var, $msg) = @_;
+    printf "%-16s%-15s  %s\n", $var, eval "\$$var", $msg;
+}
+
+sub safedir {
+    $SAFEDIR = File::Temp::tempdir("c2ph.XXXXXX", TMPDIR => 1, CLEANUP => 1)
+      unless (defined($SAFEDIR));
+}
+
+undef $SAFEDIR;
+
+$recurse = 1;
+
+if (@ARGV) {
+    if (grep(!/\.[csh]$/,@ARGV)) {
+	warn "Only *.[csh] files expected!\n";
+	&usage;
+    }
+    elsif (grep(/\.s$/,@ARGV)) {
+	if (@ARGV > 1) {
+	    warn "Only one *.s file allowed!\n";
+	    &usage;
+	}
+    }
+    elsif (@ARGV == 1 && $ARGV[0] =~ /\.c$/) {
+	local($dir, $file) = $ARGV[0] =~ m#(.*/)?(.*)$#;
+	$chdir = "cd $dir && " if $dir;
+	&system("$chdir$CC $CFLAGS $DEFINES $file") && exit 1;
+	$ARGV[0] =~ s/\.c$/.s/;
+    }
+    else {
+	&safedir;
+	$TMP = "$SAFEDIR/c2ph.$$.c";
+	&system("cat @ARGV > $TMP") && exit 1;
+	&system("cd $SAFEDIR && $CC $CFLAGS $DEFINES $TMP") && exit 1;
+	unlink $TMP;
+	$TMP =~ s/\.c$/.s/;
+	@ARGV = ($TMP);
+    }
+}
+
+if ($opt_s) {
+    for (split(/[\s,]+/, $opt_s)) {
+	$interested{$_}++;
+    }
+}
+
+
+$| = 1 if $debug;
+
+main: {
+
+    if ($trace) {
+	if (-t && !@ARGV) {
+	    print STDERR "reading from your keyboard: ";
+	} else {
+	    print STDERR "reading from " . (@ARGV ? "@ARGV" : "<STDIN>").": ";
+	}
+    }
+
+STAB: while (<>) {
+	if ($trace && !($. % 10)) {
+	    $lineno = $..'';
+	    print STDERR $lineno, "\b" x length($lineno);
+	}
+	next unless /^\s*\.stabs\s+/;
+	$line = $_;
+	s/^\s*\.stabs\s+//;
+	if (s/\\\\"[d,]+$//) {
+	    $saveline .= $line;
+	    $savebar  = $_;
+	    next STAB;
+	}
+	if ($saveline) {
+	    s/^"//;
+	    $_ = $savebar . $_;
+	    $line = $saveline;
+	}
+	&stab;
+	$savebar = $saveline = undef;
+    }
+    print STDERR "$.\n" if $trace;
+    unlink $TMP if $TMP;
+
+    &compute_intrinsics if $perl && !$opt_i;
+
+    print STDERR "resolving types\n" if $trace;
+
+    &resolve_types;
+    &adjust_start_addrs;
+
+    $sum = 2 + $type_width + $member_width;
+    $pmask1 = "%-${type_width}s %-${member_width}s";
+    $pmask2 = "%-${sum}s %${offset_width}${offset_fmt}%s %${size_width}${size_fmt}%s";
+
+
+
+    if ($perl) {
+	# resolve template -- should be in stab define order, but even this isn't enough.
+	print STDERR "\nbuilding type templates: " if $trace;
+	for $i (reverse 0..$#type) {
+	    next unless defined($name = $type[$i]);
+	    next unless defined $struct{$name};
+	    ($iname = $name) =~ s/\..*//;
+	    $build_recursed = 0;
+	    &build_template($name) unless defined $template{&psou($name)} ||
+					$opt_s && !$interested{$iname};
+	}
+	print STDERR "\n\n" if $trace;
+    }
+
+    print STDERR "dumping structs: " if $trace;
+
+    local($iam);
+
+
+
+    foreach $name (sort keys %struct) {
+	($iname = $name) =~ s/\..*//;
+	next if $opt_s && !$interested{$iname};
+	print STDERR "$name " if $trace;
+
+	undef @sizeof;
+	undef @typedef;
+	undef @offsetof;
+	undef @indices;
+	undef @typeof;
+	undef @fieldnames;
+
+	$mname = &munge($name);
+
+	$fname = &psou($name);
+
+	print "# " if $perl && $verbose;
+	$pcode = '';
+	print "$fname {\n" if !$perl || $verbose;
+	$template{$fname} = &scrunch($template{$fname}) if $perl;
+	&pstruct($name,$name,0);
+	print "# " if $perl && $verbose;
+	print "}\n" if !$perl || $verbose;
+	print "\n" if $perl && $verbose;
+
+	if ($perl) {
+	    print "$pcode";
+
+	    printf("\nsub %-32s { %4d; }\n\n", "${mname}'struct", $countof{$name});
+
+	    print <<EOF;
+sub ${mname}'typedef {
+    local(\$${mname}'index) = shift;
+    defined \$${mname}'index
+	? \$${mname}'typedef[\$${mname}'index]
+	: \$${mname}'typedef;
+}
+EOF
+
+	    print <<EOF;
+sub ${mname}'sizeof {
+    local(\$${mname}'index) = shift;
+    defined \$${mname}'index
+	? \$${mname}'sizeof[\$${mname}'index]
+	: \$${mname}'sizeof;
+}
+EOF
+
+	    print <<EOF;
+sub ${mname}'offsetof {
+    local(\$${mname}'index) = shift;
+    defined \$${mname}index
+	? \$${mname}'offsetof[\$${mname}'index]
+	: \$${mname}'sizeof;
+}
+EOF
+
+	    print <<EOF;
+sub ${mname}'typeof {
+    local(\$${mname}'index) = shift;
+    defined \$${mname}index
+	? \$${mname}'typeof[\$${mname}'index]
+	: '$name';
+}
+EOF
+
+	    print <<EOF;
+sub ${mname}'fieldnames {
+    \@${mname}'fieldnames;
+}
+EOF
+
+	$iam = ($isastruct{$name} && 's') || ($isaunion{$name} && 'u');
+
+	    print <<EOF;
+sub ${mname}'isastruct {
+    '$iam';
+}
+EOF
+
+	    print "\$${mname}'typedef = '" . &scrunch($template{$fname})
+		. "';\n";
+
+	    print "\$${mname}'sizeof = $sizeof{$name};\n\n";
+
+
+	    print "\@${mname}'indices = (", &squishseq(@indices), ");\n";
+
+	    print "\n";
+
+	    print "\@${mname}'typedef[\@${mname}'indices] = (",
+			join("\n\t", '', @typedef), "\n    );\n\n";
+	    print "\@${mname}'sizeof[\@${mname}'indices] = (",
+			join("\n\t", '', @sizeof), "\n    );\n\n";
+	    print "\@${mname}'offsetof[\@${mname}'indices] = (",
+			join("\n\t", '', @offsetof), "\n    );\n\n";
+	    print "\@${mname}'typeof[\@${mname}'indices] = (",
+			join("\n\t", '', @typeof), "\n    );\n\n";
+	    print "\@${mname}'fieldnames[\@${mname}'indices] = (",
+			join("\n\t", '', @fieldnames), "\n    );\n\n";
+
+	    $template_printed{$fname}++;
+	    $size_printed{$fname}++;
+	}
+	print "\n";
+    }
+
+    print STDERR "\n" if $trace;
+
+    unless ($perl && $opt_a) {
+	print "\n1;\n" if $perl;
+	exit;
+    }
+
+
+
+    foreach $name (sort bysizevalue keys %intrinsics) {
+	next if $size_printed{$name};
+	print '$',&munge($name),"'sizeof = ", $sizeof{$name}, ";\n";
+    }
+
+    print "\n";
+
+    sub bysizevalue { $sizeof{$a} <=> $sizeof{$b}; }
+
+
+    foreach $name (sort keys %intrinsics) {
+	print '$',&munge($name),"'typedef = '", $template{$name}, "';\n";
+    }
+
+    print "\n1;\n" if $perl;
+
+    exit;
+}
+
+########################################################################################
+
+
+sub stab {
+    next unless $continued || /:[\$\w]+(\(\d+,\d+\))?=[\*\$\w]+/;  # (\d+,\d+) is for sun
+    s/"// 						|| next;
+    s/",([x\d]+),([x\d]+),([x\d]+),.*// 		|| next;
+
+    next if /^\s*$/;
+
+    $size = $3 if $3;
+    $_ = $continued . $_ if length($continued);
+    if (s/\\\\$//) {
+      # if last 2 chars of string are '\\' then stab is continued
+      # in next stab entry
+      chop;
+      $continued = $_;
+      next;
+    }
+    $continued = '';
+
+
+    $line = $_;
+
+    if (($name, $pdecl) = /^([\$ \w]+):[tT]((\d+)(=[rufs*](\d+))+)$/) {
+	print "$name is a typedef for some funky pointers: $pdecl\n" if $debug;
+	&pdecl($pdecl);
+	next;
+    }
+
+
+
+    if (/(([ \w]+):t(\d+|\(\d+,\d+\)))=r?(\d+|\(\d+,\d+\))(;\d+;\d+;)?/) {
+	local($ident) = $2;
+	push(@intrinsics, $ident);
+	$typeno = &typeno($3);
+	$type[$typeno] = $ident;
+	print STDERR "intrinsic $ident in new type $typeno\n" if $debug;
+	next;
+    }
+
+    if (($name, $typeordef, $typeno, $extra, $struct, $_)
+	= /^([\$ \w]+):([ustT])(\d+|\(\d+,\d+\))(=[rufs*](\d+))?(.*)$/)
+    {
+	$typeno = &typeno($typeno);  # sun foolery
+    }
+    elsif (/^[\$\w]+:/) {
+	next; # variable
+    }
+    else {
+	warn "can't grok stab: <$_> in: $line " if $_;
+	next;
+    }
+
+    #warn "got size $size for $name\n";
+    $sizeof{$name} = $size if $size;
+
+    s/;[-\d]*;[-\d]*;$//;  # we don't care about ranges
+
+    $typenos{$name} = $typeno;
+
+    unless (defined $type[$typeno]) {
+	&panic("type 0??") unless $typeno;
+	$type[$typeno] = $name unless defined $type[$typeno];
+	printf "new type $typeno is $name" if $debug;
+	if ($extra =~ /\*/ && defined $type[$struct]) {
+	    print ", a typedef for a pointer to " , $type[$struct] if $debug;
+	}
+    } else {
+	printf "%s is type %d", $name, $typeno if $debug;
+	print ", a typedef for " , $type[$typeno] if $debug;
+    }
+    print "\n" if $debug;
+    #next unless $extra =~ /[su*]/;
+
+    #$type[$struct] = $name;
+
+    if ($extra =~ /[us*]/) {
+	&sou($name, $extra);
+	$_ = &sdecl($name, $_, 0);
+    }
+    elsif (/^=ar/) {
+	print "it's a bare array typedef -- that's pretty sick\n" if $debug;
+	$_ = "$typeno$_";
+	$scripts = '';
+	$_ = &adecl($_,1);
+
+    }
+    elsif (s/((\w+):t(\d+|\(\d+,\d+\)))?=r?(;\d+;\d+;)?//) {  # the ?'s are for gcc
+	push(@intrinsics, $2);
+	$typeno = &typeno($3);
+	$type[$typeno] = $2;
+	print STDERR "intrinsic $2 in new type $typeno\n" if $debug;
+    }
+    elsif (s/^=e//) { # blessed be thy compiler; mine won't do this
+	&edecl;
+    }
+    else {
+	warn "Funny remainder for $name on line $_ left in $line " if $_;
+    }
+}
+
+sub typeno {  # sun thinks types are (0,27) instead of just 27
+    local($_) = @_;
+    s/\(\d+,(\d+)\)/$1/;
+    $_;
+}
+
+sub pstruct {
+    local($what,$prefix,$base) = @_;
+    local($field, $fieldname, $typeno, $count, $offset, $entry);
+    local($fieldtype);
+    local($type, $tname);
+    local($mytype, $mycount, $entry2);
+    local($struct_count) = 0;
+    local($pad, $revpad, $length, $prepad, $lastoffset, $lastlength, $fmt);
+    local($bits,$bytes);
+    local($template);
+
+
+    local($mname) = &munge($name);
+
+    sub munge {
+	local($_) = @_;
+	s/[\s\$\.]/_/g;
+	$_;
+    }
+
+    local($sname) = &psou($what);
+
+    $nesting++;
+
+    for $field (split(/;/, $struct{$what})) {
+	$pad = $prepad = 0;
+	$entry = '';
+	($fieldname, $typeno, $count, $offset, $length) = split(/,/, $field);
+
+	$type = $type[$typeno];
+
+	$type =~ /([^[]*)(\[.*\])?/;
+	$mytype = $1;
+	$count .= $2;
+	$fieldtype = &psou($mytype);
+
+	local($fname) = &psou($name);
+
+	if ($build_templates) {
+
+	    $pad = ($offset - ($lastoffset + $lastlength))/8
+		if defined $lastoffset;
+
+	    if (! $finished_template{$sname}) {
+		if ($isaunion{$what}) {
+		    $template{$sname} .= 'X' x $revpad . ' '    if $revpad;
+		} else {
+		    $template{$sname} .= 'x' x $pad    . ' '    if $pad;
+		}
+	    }
+
+	    $template = &fetch_template($type);
+	    &repeat_template($template,$count);
+
+	    if (! $finished_template{$sname}) {
+		$template{$sname} .= $template;
+	    }
+
+	    $revpad = $length/8 if $isaunion{$what};
+
+	    ($lastoffset, $lastlength) = ($offset, $length);
+
+	} else {
+	    print '# ' if $perl && $verbose;
+	    $entry = sprintf($pmask1,
+			' ' x ($nesting * $indent) . $fieldtype,
+			"$prefix.$fieldname" . $count);
+
+	    $entry =~ s/(\*+)( )/$2$1/;
+
+	    printf $pmask2,
+		    $entry,
+		    ($base+$offset)/8,
+		    ($bits = ($base+$offset)%8) ? ".$bits" : "  ",
+		    $length/8,
+		    ($bits = $length % 8) ? ".$bits": ""
+			if !$perl || $verbose;
+
+	    if ($perl) {
+		$template = &fetch_template($type);
+		&repeat_template($template,$count);
+	    }
+
+	    if ($perl && $nesting == 1) {
+
+		push(@sizeof, int($length/8) .",\t# $fieldname");
+		push(@offsetof, int($offset/8) .",\t# $fieldname");
+		local($little) = &scrunch($template);
+		push(@typedef, "'$little', \t# $fieldname");
+		$type =~ s/(struct|union) //;
+		push(@typeof, "'$mytype" . ($count ? $count : '') .
+		    "',\t# $fieldname");
+		push(@fieldnames, "'$fieldname',");
+	    }
+
+	    print '  ', ' ' x $indent x $nesting, $template
+				if $perl && $verbose;
+
+	    print "\n" if !$perl || $verbose;
+
+	}
+	if ($perl) {
+	    local($mycount) = defined $struct{$mytype} ? $countof{$mytype} : 1;
+	    $mycount *= &scripts2count($count) if $count;
+	    if ($nesting==1 && !$build_templates) {
+		$pcode .= sprintf("sub %-32s { %4d; }\n",
+			"${mname}'${fieldname}", $struct_count);
+		push(@indices, $struct_count);
+	    }
+	    $struct_count += $mycount;
+	}
+
+
+	&pstruct($type, "$prefix.$fieldname", $base+$offset)
+		if $recurse && defined $struct{$type};
+    }
+
+    $countof{$what} = $struct_count unless defined $countof{$whati};
+
+    $template{$sname} .= '$' if $build_templates;
+    $finished_template{$sname}++;
+
+    if ($build_templates && !defined $sizeof{$name}) {
+	local($fmt) = &scrunch($template{$sname});
+	print STDERR "no size for $name, punting with $fmt..." if $debug;
+	eval '$sizeof{$name} = length(pack($fmt, ()))';
+	if ($@) {
+	    chop $@;
+	    warn "couldn't get size for \$name: $@";
+	} else {
+	    print STDERR $sizeof{$name}, "\n" if $debUg;
+	}
+    }
+
+    --$nesting;
+}
+
+
+sub psize {
+    local($me) = @_;
+    local($amstruct) = $struct{$me} ?  'struct ' : '';
+
+    print '$sizeof{\'', $amstruct, $me, '\'} = ';
+    printf "%d;\n", $sizeof{$me};
+}
+
+sub pdecl {
+    local($pdecl) = @_;
+    local(@pdecls);
+    local($tname);
+
+    warn "pdecl: $pdecl\n" if $debug;
+
+    $pdecl =~ s/\(\d+,(\d+)\)/$1/g;
+    $pdecl =~ s/\*//g;
+    @pdecls = split(/=/, $pdecl);
+    $typeno = $pdecls[0];
+    $tname = pop @pdecls;
+
+    if ($tname =~ s/^f//) { $tname = "$tname&"; }
+    #else { $tname = "$tname*"; }
+
+    for (reverse @pdecls) {
+	$tname  .= s/^f// ? "&" : "*";
+	#$tname =~ s/^f(.*)/$1&/;
+	print "type[$_] is $tname\n" if $debug;
+	$type[$_] = $tname unless defined $type[$_];
+    }
+}
+
+
+
+sub adecl {
+    ($arraytype, $unknown, $lower, $upper) = ();
+    #local($typeno);
+    # global $typeno, @type
+    local($_, $typedef) = @_;
+
+    while (s/^((\d+|\(\d+,\d+\))=)?ar(\d+|\(\d+,\d+\));//) {
+	($arraytype, $unknown) = ($2, $3);
+	$arraytype = &typeno($arraytype);
+	$unknown = &typeno($unknown);
+	if (s/^(\d+);(\d+);//) {
+	    ($lower, $upper) = ($1, $2);
+	    $scripts .= '[' .  ($upper+1) . ']';
+	} else {
+	    warn "can't find array bounds: $_";
+	}
+    }
+    if (s/^([(,)\d*f=]*),(\d+),(\d+);//) {
+	($start, $length) = ($2, $3);
+	$whatis = $1;
+	if ($whatis =~ /^(\d+|\(\d+,\d+\))=/) {
+	    $typeno = &typeno($1);
+	    &pdecl($whatis);
+	} else {
+	    $typeno = &typeno($whatis);
+	}
+    } elsif (s/^(\d+)(=[*suf]\d*)//) {
+	local($whatis) = $2;
+
+	if ($whatis =~ /[f*]/) {
+	    &pdecl($whatis);
+	} elsif ($whatis =~ /[su]/) {  #
+	    print "$prefix.$fieldname is an array$scripts anon structs; disgusting\n"
+		if $debug;
+	    #$type[$typeno] = $name unless defined $type[$typeno];
+	    ##printf "new type $typeno is $name" if $debug;
+	    $typeno = $1;
+	    $type[$typeno] = "$prefix.$fieldname";
+	    local($name) = $type[$typeno];
+	    &sou($name, $whatis);
+	    $_ = &sdecl($name, $_, $start+$offset);
+	    1;
+	    $start = $start{$name};
+	    $offset = $sizeof{$name};
+	    $length = $offset;
+	} else {
+	    warn "what's this? $whatis in $line ";
+	}
+    } elsif (/^\d+$/) {
+	$typeno = $_;
+    } else {
+	warn "bad array stab: $_ in $line ";
+	next STAB;
+    }
+    #local($wasdef) = defined($type[$typeno]) && $debug;
+    #if ($typedef) {
+	#print "redefining $type[$typeno] to " if $wasdef;
+	#$type[$typeno] = "$whatis$scripts"; # unless defined $type[$typeno];
+	#print "$type[$typeno]\n" if $wasdef;
+    #} else {
+	#$type[$arraytype] = $type[$typeno] unless defined $type[$arraytype];
+    #}
+    $type[$arraytype] = "$type[$typeno]$scripts" if defined $type[$typeno];
+    print "type[$arraytype] is $type[$arraytype]\n" if $debug;
+    print "$prefix.$fieldname is an array of $type[$arraytype]\n" if $debug;
+    $_;
+}
+
+
+
+sub sdecl {
+    local($prefix, $_, $offset) = @_;
+
+    local($fieldname, $scripts, $type, $arraytype, $unknown,
+    $whatis, $pdecl, $upper,$lower, $start,$length) = ();
+    local($typeno,$sou);
+
+
+SFIELD:
+    while (/^([^;]+);/) {
+	$scripts = '';
+	warn "sdecl $_\n" if $debug;
+	if (s/^([\$\w]+)://) {
+	    $fieldname = $1;
+	} elsif (s/(\d+)=([us])(\d+|\(\d+,\d+\))//) { #
+	    $typeno = &typeno($1);
+	    $type[$typeno] = "$prefix.$fieldname";
+	    local($name) = "$prefix.$fieldname";
+	    &sou($name,$2);
+	    $_ = &sdecl("$prefix.$fieldname", $_, $start+$offset);
+	    $start = $start{$name};
+	    $offset += $sizeof{$name};
+	    #print "done with anon, start is $start, offset is $offset\n";
+	    #next SFIELD;
+	} else  {
+	    warn "weird field $_ of $line" if $debug;
+	    next STAB;
+	    #$fieldname = &gensym;
+	    #$_ = &sdecl("$prefix.$fieldname", $_, $start+$offset);
+	}
+
+	if (/^(\d+|\(\d+,\d+\))=ar/) {
+	    $_ = &adecl($_);
+	}
+	elsif (s/^(\d+|\(\d+,\d+\))?,(\d+),(\d+);//) {
+          ($start, $length) =  ($2, $3);
+          &panic("no length?") unless $length;
+          $typeno = &typeno($1) if $1;
+        }
+        elsif (s/^(\d+)=xs\w+:,(\d+),(\d+);//) {
+	    ($start, $length) =  ($2, $3);
+	    &panic("no length?") unless $length;
+	    $typeno = &typeno($1) if $1;
+	}
+	elsif (s/^((\d+|\(\d+,\d+\))(=[*f](\d+|\(\d+,\d+\)))+),(\d+),(\d+);//) {
+	    ($pdecl, $start, $length) =  ($1,$5,$6);
+	    &pdecl($pdecl);
+	}
+	elsif (s/(\d+)=([us])(\d+|\(\d+,\d+\))//) { # the dratted anon struct
+	    ($typeno, $sou) = ($1, $2);
+	    $typeno = &typeno($typeno);
+	    if (defined($type[$typeno])) {
+		warn "now how did we get type $1 in $fieldname of $line?";
+	    } else {
+		print "anon type $typeno is $prefix.$fieldname\n" if $debug;
+		$type[$typeno] = "$prefix.$fieldname" unless defined $type[$typeno];
+	    };
+	    local($name) = "$prefix.$fieldname";
+	    &sou($name,$sou);
+	    print "anon ".($isastruct{$name}) ? "struct":"union"." for $prefix.$fieldname\n" if $debug;
+	    $type[$typeno] = "$prefix.$fieldname";
+	    $_ = &sdecl("$prefix.$fieldname", $_, $start+$offset);
+	    $start = $start{$name};
+	    $length = $sizeof{$name};
+	}
+	else {
+	    warn "can't grok stab for $name ($_) in line $line ";
+	    next STAB;
+	}
+
+	&panic("no length for $prefix.$fieldname") unless $length;
+	$struct{$name} .= join(',', $fieldname, $typeno, $scripts, $start, $length) . ';';
+    }
+    if (s/;\d*,(\d+),(\d+);//) {
+	local($start, $size) = ($1, $2);
+	$sizeof{$prefix} = $size;
+	print "start of $prefix is $start, size of $sizeof{$prefix}\n" if $debug;
+	$start{$prefix} = $start;
+    }
+    $_;
+}
+
+sub edecl {
+    s/;$//;
+    $enum{$name} = $_;
+    $_ = '';
+}
+
+sub resolve_types {
+    local($sou);
+    for $i (0 .. $#type) {
+	next unless defined $type[$i];
+	$_ = $type[$i];
+	unless (/\d/) {
+	    print "type[$i] $type[$i]\n" if $debug;
+	    next;
+	}
+	print "type[$i] $_ ==> " if $debug;
+	s/^(\d+)(\**)\&\*(\**)/"$2($3".&type($1) . ')()'/e;
+	s/^(\d+)\&/&type($1)/e;
+	s/^(\d+)/&type($1)/e;
+	s/(\*+)([^*]+)(\*+)/$1$3$2/;
+	s/\((\*+)(\w+)(\*+)\)/$3($1$2)/;
+	s/^(\d+)([\*\[].*)/&type($1).$2/e;
+	#s/(\d+)(\*|(\[[\[\]\d\*]+]\])+)/&type($1).$2/ge;
+	$type[$i] = $_;
+	print "$_\n" if $debug;
+    }
+}
+sub type { &psou($type[$_[0]] || "<UNDEFINED>"); }
+
+sub adjust_start_addrs {
+    for (sort keys %start) {
+	($basename = $_) =~ s/\.[^.]+$//;
+	$start{$_} += $start{$basename};
+	print "start: $_ @ $start{$_}\n" if $debug;
+    }
+}
+
+sub sou {
+    local($what, $_) = @_;
+    /u/ && $isaunion{$what}++;
+    /s/ && $isastruct{$what}++;
+}
+
+sub psou {
+    local($what) = @_;
+    local($prefix) = '';
+    if ($isaunion{$what})  {
+	$prefix = 'union ';
+    } elsif ($isastruct{$what})  {
+	$prefix = 'struct ';
+    }
+    $prefix . $what;
+}
+
+sub scrunch {
+    local($_) = @_;
+
+    return '' if $_ eq '';
+
+    study;
+
+    s/\$//g;
+    s/  / /g;
+    1 while s/(\w) \1/$1$1/g;
+
+    # i wanna say this, but perl resists my efforts:
+    #	   s/(\w)(\1+)/$2 . length($1)/ge;
+
+    &quick_scrunch;
+
+    s/ $//;
+
+    $_;
+}
+
+sub buildscrunchlist {
+    $scrunch_code = "sub quick_scrunch {\n";
+    for (values %intrinsics) {
+        $scrunch_code .= "\ts/(${_}{2,})/'$_' . length(\$1)/ge;\n";
+    }
+    $scrunch_code .= "}\n";
+    print "$scrunch_code" if $debug;
+    eval $scrunch_code;
+    &panic("can't eval scrunch_code $@ \nscrunch_code") if $@;
+}
+
+sub fetch_template {
+    local($mytype) = @_;
+    local($fmt);
+    local($count) = 1;
+
+    &panic("why do you care?") unless $perl;
+
+    if ($mytype =~ s/(\[\d+\])+$//) {
+	$count .= $1;
+    }
+
+    if ($mytype =~ /\*/) {
+	$fmt = $template{'pointer'};
+    }
+    elsif (defined $template{$mytype}) {
+	$fmt = $template{$mytype};
+    }
+    elsif (defined $struct{$mytype}) {
+	if (!defined $template{&psou($mytype)}) {
+	    &build_template($mytype) unless $mytype eq $name;
+	}
+	elsif ($template{&psou($mytype)} !~ /\$$/) {
+	    #warn "incomplete template for $mytype\n";
+	}
+	$fmt = $template{&psou($mytype)} || '?';
+    }
+    else {
+	warn "unknown fmt for $mytype\n";
+	$fmt = '?';
+    }
+
+    $fmt x $count . ' ';
+}
+
+sub compute_intrinsics {
+    &safedir;
+    local($TMP) = "$SAFEDIR/c2ph-i.$$.c";
+    open (TMP, ">$TMP") || die "can't open $TMP: $!";
+    select(TMP);
+
+    print STDERR "computing intrinsic sizes: " if $trace;
+
+    undef %intrinsics;
+
+    print <<'EOF';
+main() {
+    char *mask = "%d %s\n";
+EOF
+
+    for $type (@intrinsics) {
+	next if !$type || $type eq 'void' || $type =~ /complex/; # sun stuff
+	print <<"EOF";
+    printf(mask,sizeof($type), "$type");
+EOF
+    }
+
+    print <<'EOF';
+    printf(mask,sizeof(char *), "pointer");
+    exit(0);
+}
+EOF
+    close TMP;
+
+    select(STDOUT);
+    open(PIPE, "cd $SAFEDIR && $CC $TMP && $SAFEDIR/a.out|");
+    while (<PIPE>) {
+	chop;
+	split(' ',$_,2);;
+	print "intrinsic $_[1] is size $_[0]\n" if $debug;
+	$sizeof{$_[1]} = $_[0];
+	$intrinsics{$_[1]} = $template{$_[0]};
+    }
+    close(PIPE) || die "couldn't read intrinsics!";
+    unlink($TMP, '$SAFEDIR/a.out');
+    print STDERR "done\n" if $trace;
+}
+
+sub scripts2count {
+    local($_) = @_;
+
+    s/^\[//;
+    s/\]$//;
+    s/\]\[/*/g;
+    $_ = eval;
+    &panic("$_: $@") if $@;
+    $_;
+}
+
+sub system {
+    print STDERR "@_\n" if $trace;
+    system @_;
+}
+
+sub build_template {
+    local($name) = @_;
+
+    &panic("already got a template for $name") if defined $template{$name};
+
+    local($build_templates) = 1;
+
+    local($lparen) = '(' x $build_recursed;
+    local($rparen) = ')' x $build_recursed;
+
+    print STDERR "$lparen$name$rparen " if $trace;
+    $build_recursed++;
+    &pstruct($name,$name,0);
+    print STDERR "TEMPLATE for $name is ", $template{&psou($name)}, "\n" if $debug;
+    --$build_recursed;
+}
+
+
+sub panic {
+
+    select(STDERR);
+
+    print "\npanic: @_\n";
+
+    exit 1 if $] <= 4.003;  # caller broken
+
+    local($i,$_);
+    local($p,$f,$l,$s,$h,$a,@a,@sub);
+    for ($i = 0; ($p,$f,$l,$s,$h,$w) = caller($i); $i++) {
+	@a = @DB'args;
+	for (@a) {
+	    if (/^StB\000/ && length($_) == length($_main{'_main'})) {
+		$_ = sprintf("%s",$_);
+	    }
+	    else {
+		s/'/\\'/g;
+		s/([^\0]*)/'$1'/ unless /^-?[\d.]+$/;
+		s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
+		s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
+	    }
+	}
+	$w = $w ? '@ = ' : '$ = ';
+	$a = $h ? '(' . join(', ', @a) . ')' : '';
+	push(@sub, "$w&$s$a from file $f line $l\n");
+	last if $signal;
+    }
+    for ($i=0; $i <= $#sub; $i++) {
+	last if $signal;
+	print $sub[$i];
+    }
+    exit 1;
+}
+
+sub squishseq {
+    local($num);
+    local($last) = -1e8;
+    local($string);
+    local($seq) = '..';
+
+    while (defined($num = shift)) {
+        if ($num == ($last + 1)) {
+            $string .= $seq unless $inseq++;
+            $last = $num;
+            next;
+        } elsif ($inseq) {
+            $string .= $last unless $last == -1e8;
+        }
+
+        $string .= ',' if defined $string;
+        $string .= $num;
+        $last = $num;
+        $inseq = 0;
+    }
+    $string .= $last if $inseq && $last != -e18;
+    $string;
+}
+
+sub repeat_template {
+    #  local($template, $scripts) = @_;  have to change caller's values
+
+    if ( $_[1] ) {
+	local($ncount) = &scripts2count($_[1]);
+	if ($_[0] =~ /^\s*c\s*$/i) {
+	    $_[0] = "A$ncount ";
+	    $_[1] = '';
+	} else {
+	    $_[0] = $template x $ncount;
+	}
+    }
+}
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/cpan.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/cpan.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/cpan.bat	(revision 14489)
@@ -0,0 +1,222 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+#!/usr/bin/perl
+# $Id: cpan,v 1.3 2002/08/30 08:55:15 k Exp $
+use strict;
+
+=head1 NAME
+
+cpan - easily interact with CPAN from the command line
+
+=head1 SYNOPSIS
+
+	# with arguments, installs specified modules
+	cpan module_name [ module_name ... ]
+	
+	# with switches, installs modules with extra behavior
+	cpan [-cimt] module_name [ module_name ... ]
+	
+	# without arguments, starts CPAN shell
+	cpan
+	
+	# without arguments, but some switches
+	cpan [-ahrv]
+
+=head1 DESCRIPTION
+
+This script provides a command interface (not a shell) to CPAN.pm.
+
+=head2 Meta Options
+
+These options are mutually exclusive, and the script processes
+them in this order: [ahvr].  Once the script finds one, it ignores
+the others, and then exits after it finishes the task.  The script
+ignores any other command line options.
+
+=over 4
+
+=item -a
+
+Creates the CPAN.pm autobundle with CPAN::Shell->autobundle.  
+
+=item -h
+
+Prints a help message.
+
+=item -r
+
+Recompiles dynamically loaded modules with CPAN::Shell->recompile.
+
+=item -v
+
+Print the script version and CPAN.pm version.
+
+=back
+
+=head2 Module options
+
+These options are mutually exclusive, and the script processes
+them in alphabetical order. 
+
+=over 4
+
+=item c
+
+Runs a `make clean` in the specified module's directories.
+
+=item i
+
+Installed the specified modules.
+
+=item m
+
+Makes the specified modules.
+
+=item t
+
+Runs a `make test` on the specified modules.
+
+=back
+
+=head2 Examples
+
+	# print a help message
+	cpan -h
+	
+	# print the version numbers
+	cpan -v
+	
+	# create an autobundle
+	cpan -a
+	
+	# recompile modules
+	cpan -r 
+	
+	# install modules
+	cpan -i Netscape::Booksmarks Business::ISBN
+
+=head1 TO DO
+
+* add options for other CPAN::Shell functions
+autobundle, clean, make, recompile, test
+
+=head1 BUGS
+
+* none noted
+
+=head1 SEE ALSO
+
+Most behaviour, including environment variables and configuration,
+comes directly from CPAN.pm.
+
+=head1 AUTHOR
+
+brian d foy <bdfoy@cpan.org>
+
+=cut
+
+use CPAN ();
+use Getopt::Std;
+
+my $VERSION = 
+	sprintf "%d.%02d", q$Revision: 1.3 $ =~ m/ (\d+) \. (\d+) /xg;
+
+my $Default = 'default';
+
+my $META_OPTIONS = 'ahvr';
+
+my %CPAN_METHODS = (
+	$Default => 'install',
+	'c'      => 'clean',
+	'i'      => 'install',
+	'm'      => 'make',
+	't'      => 'test',
+	);
+
+my @cpan_options = grep { $_ ne $Default } sort keys %CPAN_METHODS;
+
+my $arg_count = @ARGV;
+my %options;
+
+Getopt::Std::getopts( 
+	join( '', @cpan_options, $META_OPTIONS ), \%options );
+	
+if( $options{h} )
+	{
+	print STDERR "Printing help message -- ignoring other arguments\n"
+		if $arg_count > 1;
+
+	print STDERR "Use perldoc to read the documentation\n";
+	exit 0;
+	}
+elsif( $options{v} )
+	{
+	print STDERR "Printing version message -- ignoring other arguments\n"
+	
+		if $arg_count > 1;
+
+	my $CPAN_VERSION = CPAN->VERSION;
+	print STDERR "cpan script version $VERSION\n" .
+		"CPAN.pm version $CPAN_VERSION\n";
+	exit 0;
+	}
+elsif( $options{a} )
+	{
+	print "Creating autobundle in ", $CPAN::Config->{cpan_home}, 
+		"/Bundle\n";
+	print STDERR "Creating autobundle -- ignoring other arguments\n"
+		if $arg_count > 1;
+
+	CPAN::Shell->autobundle;
+	exit 0;
+	}
+elsif( $options{r} )
+	{
+	print STDERR "Creating autobundle -- ignoring other arguments\n"
+		if $arg_count > 1;
+		
+	CPAN::Shell->recompile;
+	}
+else
+	{
+	my $switch = '';
+	
+	foreach my $option ( @cpan_options )
+		{
+		next unless $options{$option};
+		$switch = $option;
+		last;
+		}
+	
+	   if( not $switch and     @ARGV ) { $switch = $Default;     }
+	elsif( not $switch and not @ARGV ) { CPAN::shell(); exit 0;  }	
+	elsif(     $switch and not @ARGV ) 
+		{ die "Nothing to $CPAN_METHODS{$switch}!\n"; }
+
+	my $method = $CPAN_METHODS{$switch};
+	die "CPAN.pm cannot $method!\n" unless CPAN::Shell->can( $method );
+	
+	foreach my $arg ( @ARGV )
+		{
+		CPAN::Shell->$method( $arg );
+		}
+	}
+	
+1;
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/dprofpp.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/dprofpp.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/dprofpp.bat	(revision 14489)
@@ -0,0 +1,945 @@
+@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
+    eval 'exec perl -S $0 "$@"'
+	if 0;
+
+require 5.003;
+
+my $VERSION = '20050603.00';
+my $stty    = undef;
+
+=head1 NAME
+
+dprofpp - display perl profile data
+
+=head1 SYNOPSIS
+
+dprofpp [B<-a>|B<-z>|B<-l>|B<-v>|B<-U>] [B<-d>] [B<-s>|B<-r>|B<-u>] [B<-q>] [B<-F>] [B<-I|-E>] [B<-O cnt>] [B<-A>] [B<-R>] [B<-S>] [B<-g subroutine>] [B<-G> <regexp> [B<-P>]] [B<-f> <regexp>] [profile]
+  
+dprofpp B<-T> [B<-F>] [B<-g subroutine>] [profile]
+
+dprofpp B<-t> [B<-F>] [B<-g subroutine>] [profile]
+
+dprofpp B<-G> <regexp> [B<-P>] [profile]
+ 
+dprofpp B<-p script> [B<-Q>] [other opts]
+
+dprofpp B<-V> [profile]
+
+=head1 DESCRIPTION
+
+The I<dprofpp> command interprets profile data produced by a profiler, such
+as the Devel::DProf profiler.  Dprofpp will read the file F<tmon.out> and
+display the 15 subroutines which are using the most time.  By default
+the times for each subroutine are given exclusive of the times of their
+child subroutines.
+
+To profile a Perl script run the perl interpreter with the B<-d> switch.  So
+to profile script F<test.pl> with Devel::DProf use the following:
+
+	$ perl5 -d:DProf test.pl
+
+Then run dprofpp to analyze the profile.  The output of dprofpp depends
+on the flags to the program and the version of Perl you're using.
+
+	$ dprofpp -u
+	Total Elapsed Time =    1.67 Seconds
+		 User Time =    0.61 Seconds
+	Exclusive Times
+	%Time Seconds     #Calls sec/call Name
+	 52.4   0.320          2   0.1600 main::foo
+	 45.9   0.280        200   0.0014 main::bar
+	 0.00   0.000          1   0.0000 DynaLoader::import
+	 0.00   0.000          1   0.0000 main::baz
+
+The dprofpp tool can also run the profiler before analyzing the profile
+data.  The above two commands can be executed with one dprofpp command.
+
+	$ dprofpp -u -p test.pl
+
+Consult L<Devel::DProf/"PROFILE FORMAT"> for a description of the raw profile.
+
+=head1 OUTPUT
+
+Columns are:
+
+=over 4
+
+=item %Time
+
+Percentage of time spent in this routine.
+
+=item #Calls
+
+Number of calls to this routine.
+
+=item sec/call
+
+Average number of seconds per call to this routine.
+
+=item Name
+
+Name of routine.
+
+=item CumulS
+
+Time (in seconds) spent in this routine and routines called from it.
+
+=item ExclSec
+
+Time (in seconds) spent in this routine (not including those called
+from it).
+
+=item Csec/c
+
+Average time (in seconds) spent in each call of this routine
+(including those called from it).
+
+=back
+
+=head1 OPTIONS
+
+=over 5
+
+=item B<-a>
+
+Sort alphabetically by subroutine names.
+
+=item B<-d>
+
+Reverse whatever sort is used
+
+=item B<-A>
+
+Count timing for autoloaded subroutine as timing for C<*::AUTOLOAD>.
+Otherwise the time to autoload it is counted as time of the subroutine
+itself (there is no way to separate autoload time from run time).
+
+This is going to be irrelevant with newer Perls.  They will inform
+C<Devel::DProf> I<when> the C<AUTOLOAD> switches to actual subroutine,
+so a separate statistics for C<AUTOLOAD> will be collected no matter
+whether this option is set.
+
+=item B<-R>
+
+Count anonymous subroutines defined in the same package separately.
+
+=item B<-E>
+
+(default)  Display all subroutine times exclusive of child subroutine times.
+
+=item B<-F>
+
+Force the generation of fake exit timestamps if dprofpp reports that the
+profile is garbled.  This is only useful if dprofpp determines that the
+profile is garbled due to missing exit timestamps.  You're on your own if
+you do this.  Consult the BUGS section.
+
+=item B<-I>
+
+Display all subroutine times inclusive of child subroutine times.
+
+=item B<-l>
+
+Sort by number of calls to the subroutines.  This may help identify
+candidates for inlining.
+
+=item B<-O cnt>
+
+Show only I<cnt> subroutines.  The default is 15.
+
+=item B<-p script>
+
+Tells dprofpp that it should profile the given script and then interpret its
+profile data.  See B<-Q>.
+
+=item B<-Q>
+
+Used with B<-p> to tell dprofpp to quit after profiling the script, without
+interpreting the data.
+
+=item B<-q>
+
+Do not display column headers.
+
+=item B<-r>
+
+Display elapsed real times rather than user+system times.
+
+=item B<-s>
+
+Display system times rather than user+system times.
+
+=item B<-T>
+
+Display subroutine call tree to stdout.  Subroutine statistics are
+not displayed.
+
+=item B<-t>
+
+Display subroutine call tree to stdout.  Subroutine statistics are not
+displayed.  When a function is called multiple consecutive times at the same
+calling level then it is displayed once with a repeat count.
+
+=item B<-S>
+
+Display I<merged> subroutine call tree to stdout.  Statistics are
+displayed for each branch of the tree.  
+
+When a function is called multiple (I<not necessarily consecutive>)
+times in the same branch then all these calls go into one branch of
+the next level.  A repeat count is output together with combined
+inclusive, exclusive and kids time.
+
+Branches are sorted with regard to inclusive time.
+
+=item B<-U>
+
+Do not sort.  Display in the order found in the raw profile.
+
+=item B<-u>
+
+Display user times rather than user+system times.
+
+=item B<-V>
+
+Print dprofpp's version number and exit.  If a raw profile is found then its
+XS_VERSION variable will be displayed, too.
+
+=item B<-v>
+
+Sort by average time spent in subroutines during each call.  This may help
+identify candidates for inlining. 
+
+=item B<-z>
+
+(default) Sort by amount of user+system time used.  The first few lines
+should show you which subroutines are using the most time.
+
+=item B<-g> C<subroutine>
+
+Ignore subroutines except C<subroutine> and whatever is called from it.
+
+=item B<-G> <regexp>
+
+Aggregate "Group" all calls matching the pattern together.
+For example this can be used to group all calls of a set of packages
+
+  -G "(package1::)|(package2::)|(package3::)"
+
+or to group subroutines by name:
+
+  -G "getNum"
+
+=item B<-P>
+
+Used with -G to aggregate "Pull" together all calls that did not match -G.
+
+=item B<-f> <regexp>
+
+Filter all calls matching the pattern.
+
+=item B<-h>
+
+Display brief help and exit.
+
+=item B<-H>
+
+Display long help and exit.
+
+=back
+
+=head1 ENVIRONMENT
+
+The environment variable B<DPROFPP_OPTS> can be set to a string containing
+options for dprofpp.  You might use this if you prefer B<-I> over B<-E> or
+if you want B<-F> on all the time.
+
+This was added fairly lazily, so there are some undesirable side effects.
+Options on the commandline should override options in DPROFPP_OPTS--but
+don't count on that in this version.
+
+=head1 BUGS
+
+Applications which call _exit() or exec() from within a subroutine
+will leave an incomplete profile.  See the B<-F> option.
+
+Any bugs in Devel::DProf, or any profiler generating the profile data, could
+be visible here.  See L<Devel::DProf/BUGS>.
+
+Mail bug reports and feature requests to the perl5-porters mailing list at
+F<E<lt>perl5-porters@perl.orgE<gt>>.  Bug reports should include the
+output of the B<-V> option.
+
+=head1 FILES
+
+	dprofpp		- profile processor
+	tmon.out	- raw profile
+
+=head1 SEE ALSO
+
+L<perl>, L<Devel::DProf>, times(2)
+
+=cut
+
+sub shortusage {
+    print <<'EOF';
+dprofpp [options] [profile]
+
+    -A          Count autoloaded to *AUTOLOAD
+    -a          Sort by alphabetic name of subroutines.
+    -d          Reverse sort
+    -E          Sub times are reported exclusive of child times. (default)
+    -f          Filter all calls mathcing the pattern.
+    -G          Group all calls matching the pattern together.
+    -g subr     Count only those who are SUBR or called from SUBR
+    -H          Display long manual page.
+    -h          Display this short usage message.
+    -I          Sub times are reported inclusive of child times.
+    -l          Sort by number of calls to subroutines.
+    -O cnt      Specifies maximum number of subroutines to display.
+    -P          Used with -G to pull all other calls together.
+    -p script   Specifies name of script to be profiled.
+    -Q          Used with -p to indicate the dprofpp should quit
+                after profiling the script, without interpreting the data.
+    -q          Do not print column headers.
+    -R          Count anonyms separately even if from the same package
+    -r          Use real elapsed time rather than user+system time.
+    -S          Create statistics for all the depths
+    -s          Use system time rather than user+system time.
+    -T          Show call tree.
+    -t          Show call tree, compressed.
+    -U          Do not sort subroutines.
+    -u          Use user time rather than user+system time.
+    -V          Print dprofpp's version.
+    -v          Sort by average amount of time spent in subroutines.
+    -z          Sort by user+system time spent in subroutines. (default)
+EOF
+}
+
+use Getopt::Std 'getopts';
+use Config '%Config';
+
+Setup: {
+	my $options = 'O:g:G:Pf:dlzaAvuTtqrRsUFEIp:QVShH';
+
+	$Monfile = 'tmon.out';
+	if( exists $ENV{DPROFPP_OPTS} ){
+		my @tmpargv = @ARGV;
+		@ARGV = split( ' ', $ENV{DPROFPP_OPTS} );
+		getopts( $options );
+		if( @ARGV ){
+			# there was a filename.
+			$Monfile = shift;
+		}
+		@ARGV = @tmpargv;
+	}
+
+	getopts( $options ) or die "Try 'dprofpp -h' for help.\n";
+	if( @ARGV ){
+		# there was a filename, it overrides any earlier name.
+		$Monfile = shift;
+	}
+
+        if ( defined $opt_h ) {
+                shortusage();
+                exit;
+        }
+        if ( defined $opt_H ) {
+                require Pod::Usage;
+                Pod::Usage::pod2usage( {-verbose => 2, -input => $0 } );
+                exit;
+        }
+
+	if( defined $opt_V ){
+		my $fh = 'main::fh';
+		print "$0 version: $VERSION\n";
+		open( $fh, "<$Monfile" ) && do {
+			local $XS_VERSION = 'early';
+			header($fh);
+			close( $fh );
+			print "XS_VERSION: $XS_VERSION\n";
+		};
+		exit(0);
+	}
+	$cnt = $opt_O || 15;
+	$sort = 'by_time';
+	$sort = 'by_ctime' if defined $opt_I;
+	$sort = 'by_calls' if defined $opt_l;
+	$sort = 'by_alpha' if defined $opt_a;
+	$sort = 'by_avgcpu' if defined $opt_v;
+	
+	if(defined $opt_d){
+		$sort = "r".$sort;
+	}
+	$incl_excl = 'Exclusive';
+	$incl_excl = 'Inclusive' if defined $opt_I;
+	$whichtime = 'User+System';
+	$whichtime = 'System' if defined $opt_s;
+	$whichtime = 'Real' if defined $opt_r;
+	$whichtime = 'User' if defined $opt_u;
+
+	if( defined $opt_p ){
+		my $prof = 'DProf';
+		my $startperl = $Config{'startperl'};
+
+		$startperl =~ s/^#!//; # remove shebang
+		run_profiler( $opt_p, $prof, $startperl );
+		$Monfile = 'tmon.out';  # because that's where it is
+		exit(0) if defined $opt_Q;
+	}
+	elsif( defined $opt_Q ){
+		die "-Q is meaningful only when used with -p\n";
+	}
+}
+
+Main: {
+	my $monout = $Monfile;
+	my $fh = 'main::fh';
+	local $names = {};
+	local $times = {};   # times in hz
+	local $ctimes = {};  # Cumulative times in hz
+	local $calls = {};
+	local $persecs = {}; # times in seconds
+	local $idkeys = [];
+	local $runtime; # runtime in seconds
+	my @a = ();
+	my $a;
+	local $rrun_utime = 0;	# user time in hz
+	local $rrun_stime = 0;	# system time in hz
+	local $rrun_rtime = 0;	# elapsed run time in hz
+	local $rrun_ustime = 0;	# user+system time in hz
+	local $hz = 0;
+	local $deep_times = {count => 0 , kids => {}, incl_time => 0};
+	local $time_precision = 2;
+	local $overhead = 0;
+
+	open( $fh, "<$monout" ) || die "Unable to open $monout\n";
+
+	header($fh);
+
+	$rrun_ustime = $rrun_utime + $rrun_stime;
+
+	$~ = 'STAT';
+	if( ! $opt_q ){
+		$^ = 'CSTAT_top';
+	}
+
+	parsestack( $fh, $names, $calls, $times, $ctimes, $idkeys );
+
+	#filter calls
+	if( $opt_f ){
+		for(my $i = 0;$i < @$idkeys - 2;){
+			$key = $$idkeys[$i];
+			if($key =~ /$opt_f/){
+				splice(@$idkeys, $i, 1);
+				$runtime -= $$times{$key};
+				next;
+			}
+			$i++;
+		}
+	}
+
+	if( $opt_G ){
+		group($names, $calls, $times, $ctimes, $idkeys );
+	}
+
+	settime( \$runtime, $hz ) unless $opt_g;
+
+	exit(0) if $opt_T || $opt_t;
+
+	if( $opt_v ){
+		percalc( $calls, ($opt_I ? $ctimes : $times), $persecs, $idkeys );
+	}
+	if( ! $opt_U ){
+		@a = sort $sort @$idkeys;
+		$a = \@a;
+	}
+	else {
+		$a = $idkeys;
+	}
+	display( $runtime, $hz, $names, $calls, $times, $ctimes, $cnt, $a,
+		 $deep_times);
+}
+
+sub group{
+	my ($names, $calls, $times, $ctimes, $idkeys ) = @_;
+		print "Option G Grouping: [$opt_G]\n";
+		# create entries to store grouping
+		$$names{$opt_G} = $opt_G;
+		$$calls{$opt_G} = 0;
+		$$times{$opt_G} = 0;
+		$$ctimes{$opt_G} = 0;
+		$$idkeys[@$idkeys] = $opt_G;
+		# Sum calls for the grouping
+
+		my $other = "other";
+		if($opt_P){
+			$$names{$other} = $other;
+			$$calls{$other} = 0;
+			$$times{$other} = 0;
+			$$ctimes{$other} = 0;
+			$$idkeys[@$idkeys] = $other;
+		}
+
+		for(my $i = 0;$i < @$idkeys - 2;){
+			$key = $$idkeys[$i];
+			if($key =~ /$opt_G/){
+				$$calls{$opt_G} += $$calls{$key};
+				$$times{$opt_G} += $$times{$key};
+				$$ctimes{$opt_G} += $$ctimes{$key};
+				splice(@$idkeys, $i, 1);
+				next;
+			}else{
+				if($opt_P){
+					$$calls{$other} += $$calls{$key};
+					$$times{$other} += $$times{$key};
+					$$ctimes{$other} += $$ctimes{$key};
+					splice(@$idkeys, $i, 1);
+					next;
+				}
+			}
+			$i++;
+		}
+		print "Grouping [$opt_G] Calls: [$$calls{$opt_G}]\n".
+			  "Grouping [$opt_G] Times: [$$times{$opt_G}]\n".
+			  "Grouping [$opt_G] IncTimes: [$$ctimes{$opt_G}]\n";
+}
+
+# Sets $runtime to user, system, real, or user+system time.  The
+# result is given in seconds.
+#
+sub settime {
+  my( $runtime, $hz ) = @_;
+
+  $hz ||= 1;
+  
+  if( $opt_r ){
+    $$runtime = ($rrun_rtime - $overhead)/$hz;
+  }
+  elsif( $opt_s ){
+    $$runtime = ($rrun_stime - $overhead)/$hz;
+  }
+  elsif( $opt_u ){
+    $$runtime = ($rrun_utime - $overhead)/$hz;
+  }
+  else{
+    $$runtime = ($rrun_ustime - $overhead)/$hz;
+  }
+  $$runtime = 0 unless $$runtime > 0;
+}
+
+sub exclusives_in_tree {
+  my( $deep_times ) = @_;
+  my $kids_time = 0;
+  my $kid;
+  # When summing, take into account non-rounded-up kids time.
+  for $kid (keys %{$deep_times->{kids}}) {
+    $kids_time += $deep_times->{kids}{$kid}{incl_time};
+  }
+  $kids_time = 0 unless $kids_time >= 0;
+  $deep_times->{excl_time} = $deep_times->{incl_time} - $kids_time;
+  $deep_times->{excl_time} = 0 unless $deep_times->{excl_time} >= 0;
+  for $kid (keys %{$deep_times->{kids}}) {
+    exclusives_in_tree($deep_times->{kids}{$kid});
+  }
+  $deep_times->{incl_time} = 0 unless $deep_times->{incl_time} >= 0;
+  $deep_times->{kids_time} = $kids_time;
+}
+
+sub kids_by_incl { $kids{$b}{incl_time} <=> $kids{$a}{excl_time} 
+		   or $a cmp $b }
+
+sub display_tree {
+  my( $deep_times, $name, $level ) = @_;
+  exclusives_in_tree($deep_times);
+  
+  my $kid;
+
+  my $time;
+  if (%{$deep_times->{kids}}) {
+    $time = sprintf '%.*fs = (%.*f + %.*f)', 
+      $time_precision, $deep_times->{incl_time}/$hz,
+        $time_precision, $deep_times->{excl_time}/$hz,
+          $time_precision, $deep_times->{kids_time}/$hz;
+  } else {
+    $time = sprintf '%.*f', $time_precision, $deep_times->{incl_time}/$hz;
+  }
+  print ' ' x (2*$level), "$name x $deep_times->{count}  \t${time}s\n"
+    if $deep_times->{count};
+
+  for $kid (sort kids_by_incl %{$deep_times->{kids}}) {
+    display_tree( $deep_times->{kids}{$kid}, $kid, $level + 1 );
+  }  
+}
+
+# Report the times in seconds.
+sub display {
+	my( $runtime, $hz, $names, $calls, $times, $ctimes, $cnt, 
+	    $idkeys, $deep_times ) = @_;
+	my( $x, $key, $s, $cs );
+	#format: $ncalls, $name, $secs, $percall, $pcnt
+
+	if ($opt_S) {
+	  display_tree( $deep_times, 'toplevel', -1 )
+	} else {
+	  for( $x = 0; $x < @$idkeys; ++$x ){
+	    $key = $idkeys->[$x];
+	    $ncalls = $calls->{$key};
+	    $name = $names->{$key};
+	    $s = $times->{$key}/$hz;
+	    $secs = sprintf("%.3f", $s );
+	    $cs = $ctimes->{$key}/$hz;
+	    $csecs = sprintf("%.3f", $cs );
+	    $percall = sprintf("%.4f", $s/$ncalls );
+	    $cpercall = sprintf("%.4f", $cs/$ncalls );
+	    $pcnt = sprintf("%.2f",
+			    $runtime? ((($opt_I ? $csecs : $secs) / $runtime) * 100.0): 0 );
+	    write;
+	    $pcnt = $secs = $ncalls = $percall = "";
+	    write while( length $name );
+	    last unless --$cnt;
+	  }	  
+	}
+}
+
+sub move_keys {
+  my ($source, $dest) = @_;
+
+  for my $kid_name (keys %$source) {
+    my $source_kid = delete $source->{$kid_name};
+
+    if (my $dest_kid = $dest->{$kid_name}) {
+      $dest_kid->{count} += $source_kid->{count};
+      $dest_kid->{incl_time} += $source_kid->{incl_time};
+      move_keys($source_kid->{kids},$dest_kid->{kids});
+    } else {
+      $dest->{$kid_name} = $source_kid;
+    }
+  }
+}
+
+sub add_to_tree {
+  my ($curdeep_times, $name, $t) = @_;
+  if ($name ne $curdeep_times->[-1]{name} and $opt_A) {
+    $name = $curdeep_times->[-1]{name};
+  }
+  die "Shorted?!" unless @$curdeep_times >= 2;
+  my $entry = $curdeep_times->[-2]{kids}{$name} ||= {
+    count => 0,
+    kids => {}, 
+    incl_time => 0,
+  };
+  # Now transfer to the new node (could not do earlier, since name can change)
+  $entry->{count}++;
+  $entry->{incl_time} += $t - $curdeep_times->[-1]{enter_stamp};
+  # Merge the kids?
+  move_keys($curdeep_times->[-1]->{kids},$entry->{kids});
+  pop @$curdeep_times;
+}
+
+
+sub parsestack {
+	my( $fh, $names, $calls, $times, $ctimes, $idkeys ) = @_;
+	my( $dir, $name );
+	my( $t, $syst, $realt, $usert );
+	my( $x, $z, $c, $id, $pack );
+	my @stack = ();
+	my @tstack = ();
+	my %outer;
+	my $tab = 3;
+	my $in = 0;
+
+	# remember last call depth and function name
+	my $l_in = $in;
+	my $l_name = '';
+	my $repcnt = 0;
+	my $repstr = '';
+	my $dprof_stamp;
+	my %cv_hash;
+	my $in_level = not defined $opt_g; # Level deep in report grouping
+	my $curdeep_times = [$deep_times];
+
+	my $over_per_call;
+	if   ( $opt_u )	{	$over_per_call = $over_utime		}
+	elsif( $opt_s )	{	$over_per_call = $over_stime		}
+	elsif( $opt_r )	{	$over_per_call = $over_rtime		}
+	else		{	$over_per_call = $over_utime + $over_stime }
+	$over_per_call /= 2*$over_tests; # distribute over entry and exit
+
+	while(<$fh>){
+		next if /^#/;
+		last if /^PART/;
+
+		chop;
+		if (/^&/) {
+		  ($dir, $id, $pack, $name) = split;
+		  if ($opt_R and ($name =~ /(?:::)?(__ANON__|END)$/)) {
+		    $name .= "($id)";
+		  }
+		  $cv_hash{$id} = "$pack\::$name";
+		  next;
+		}
+		($dir, $usert, $syst, $realt, $name) = split;
+
+		my $ot = $t;
+		if ( $dir eq '/' ) {
+		  $syst = $stack[-1][0] if scalar @stack;
+		  $usert = '&';
+		  $dir = '-';
+		  #warn("Inserted exit for $stack[-1][0].\n")
+		}
+		if (defined $realt) { # '+ times nam' '- times nam' or '@ incr'
+		  if   ( $opt_u )	{	$t = $usert		}
+		  elsif( $opt_s )	{	$t = $syst		}
+		  elsif( $opt_r )	{	$t = $realt		}
+		  else			{	$t = $usert + $syst	}
+		  $t += $ot, next if $dir eq '@'; # Increments there
+		} else {
+		  # "- id" or "- & name"
+		  $name = defined $syst ? $syst : $cv_hash{$usert};
+		}
+
+		next unless $in_level or $name eq $opt_g;
+		if ( $dir eq '-' or $dir eq '*' ) {
+		  	my $ename = $dir eq '*' ? $stack[-1][0]  : $name;
+			$overhead += $over_per_call;
+		  	if ($name eq "Devel::DProf::write") {
+			  $overhead += $t - $dprof_stamp;
+			  next;
+		  	} elsif (defined $opt_g and $ename eq $opt_g) {
+			  $in_level--;
+			}
+			add_to_tree($curdeep_times, $ename,
+				    $t - $overhead) if $opt_S;
+			exitstamp( \@stack, \@tstack,
+				   $t - $overhead,
+				   $times, $ctimes, $name, \$in, $tab,
+				   $curdeep_times, \%outer );
+		} 
+		next unless $in_level or $name eq $opt_g;
+		if( $dir eq '+' or $dir eq '*' ){
+		  	if ($name eq "Devel::DProf::write") {
+			  $dprof_stamp = $t;
+			  next;
+		  	} elsif (defined $opt_g and $name eq $opt_g) {
+			  $in_level++;
+		  	}
+			$overhead += $over_per_call;
+			if( $opt_T ){
+				print ' ' x $in, "$name\n";
+				$in += $tab;
+			}
+			elsif( $opt_t ){
+				# suppress output on same function if the
+				# same calling level is called.
+				if ($l_in == $in and $l_name eq $name) {
+					$repcnt++;
+				} else {
+					$repstr = ' ('.++$repcnt.'x)'
+						 if $repcnt;
+					print ' ' x $l_in, "$l_name$repstr\n"
+						if $l_name ne '';
+					$repstr = '';
+					$repcnt = 0;
+					$l_in = $in;
+					$l_name = $name;
+				}
+				$in += $tab;
+			}
+			if( ! defined $names->{$name} ){
+				$names->{$name} = $name;
+				$times->{$name} = 0;
+				$ctimes->{$name} = 0;
+				push( @$idkeys, $name );
+			}
+			$calls->{$name}++;
+                        $outer{$name}++;
+			push @$curdeep_times, { kids => {}, 
+						name => $name, 
+						enter_stamp => $t - $overhead,
+					      } if $opt_S;
+			$x = [ $name, $t - $overhead ];
+			push( @stack, $x );
+
+			# my children will put their time here
+			push( @tstack, 0 );
+		} elsif ($dir ne '-'){
+		    die "Bad profile: $_";
+	        }
+	}
+	if( $opt_t ){
+		$repstr = ' ('.++$repcnt.'x)' if $repcnt;
+		print ' ' x $l_in, "$l_name$repstr\n";
+	}
+
+        while (my ($key, $count) = each %outer) {
+            next unless $count;
+            warn "$key has $count unstacked calls in outer\n";
+        }
+
+	if( @stack ){
+		if( ! $opt_F ){
+			warn "Garbled profile is missing some exit time stamps:\n";
+			foreach $x (@stack) {
+				print $x->[0],"\n";
+			}
+			die "Try rerunning dprofpp with -F.\n";
+			# I don't want -F to be default behavior--yet
+			#  9/18/95 dmr
+		}
+		else{
+			warn( "Faking " . scalar( @stack ) . " exit timestamp(s).\n");
+			foreach $x ( reverse @stack ){
+				$name = $x->[0];
+				exitstamp( \@stack, \@tstack, 
+					   $t - $overhead, $times, 
+					   $ctimes, $name, \$in, $tab, 
+					   $curdeep_times, \%outer );
+				add_to_tree($curdeep_times, $name,
+					    $t - $overhead)
+				  if $opt_S;
+			}
+		}
+	}
+	if (defined $opt_g) {
+	  $runtime = $ctimes->{$opt_g}/$hz;
+	  $runtime = 0 unless $runtime > 0;
+	}
+}
+
+sub exitstamp {
+	my($stack, $tstack, $t, $times, $ctimes, $name, $in, $tab, $deep, $outer) = @_;
+	my( $x, $c, $z );
+
+	$x = pop( @$stack );
+	if( ! defined $x ){
+		die "Garbled profile, missing an enter time stamp";
+	}
+	if( $x->[0] ne $name and $opt_G and ($name =~ /$opt_G/)){
+	  if ($x->[0] =~ /(?:::)?AUTOLOAD$/) {
+	    if ($opt_A) {
+	      $name = $x->[0];
+	    }
+	  } elsif ( $opt_F ) {
+	    warn( "Garbled profile, faking exit timestamp:\n\t$name => $x->[0].\n");
+	    $name = $x->[0];
+	  } else {
+	    foreach $z (@stack, $x) {
+	      print $z->[0],"\n";
+	    }
+	    die "Garbled profile, unexpected exit time stamp";
+	  }
+	}
+	if( $opt_T || $opt_t ){
+		$$in -= $tab;
+	}
+	# collect childtime
+	$c = pop( @$tstack );
+	# total time this func has been active
+	$z = $t - $x->[1];
+	$ctimes->{$name} += $z
+            unless --$outer->{$name};
+	$times->{$name} += $z - $c;
+	# pass my time to my parent
+	if( @$tstack ){
+		$c = pop( @$tstack );
+		push( @$tstack, $c + $z );
+	}
+}
+
+
+sub header {
+	my $fh = shift;
+	chop($_ = <$fh>);
+	if( ! /^#fOrTyTwO$/ ){
+		die "Not a perl profile";
+	}
+	while(<$fh>){
+		next if /^#/;
+		last if /^PART/;
+		eval;
+	}
+	$over_tests = 1 unless $over_tests;
+	$time_precision = length int ($hz - 1);	# log ;-)
+}
+
+
+# Report avg time-per-function in seconds
+sub percalc {
+	my( $calls, $times, $persecs, $idkeys ) = @_;
+	my( $x, $t, $n, $key );
+
+	for( $x = 0; $x < @$idkeys; ++$x ){
+		$key = $idkeys->[$x];
+		$n = $calls->{$key};
+		$t = $times->{$key} / $hz;
+		$persecs->{$key} = $t ? $t / $n : 0;
+	}
+}
+
+
+# Runs the given script with the given profiler and the given perl.
+sub run_profiler {
+	my $script = shift;
+	my $profiler = shift;
+	my $startperl = shift;
+	my @script_parts = split /\s+/, $script;
+
+	system $startperl, "-d:$profiler", @script_parts;
+	if( $? / 256 > 0 ){
+		my $cmd = join ' ', @script_parts;
+		die "Failed: $startperl -d:$profiler $cmd: $!";
+	}
+}
+
+
+sub by_time { $times->{$b} <=> $times->{$a} }
+sub by_ctime { $ctimes->{$b} <=> $ctimes->{$a} }
+sub by_calls { $calls->{$b} <=> $calls->{$a} }
+sub by_alpha { $names->{$a} cmp $names->{$b} }
+sub by_avgcpu { $persecs->{$b} <=> $persecs->{$a} }
+# Reversed
+sub rby_time { $times->{$a} <=> $times->{$b} }
+sub rby_ctime { $ctimes->{$a} <=> $ctimes->{$b} }
+sub rby_calls { $calls->{$a} <=> $calls->{$b} }
+sub rby_alpha { $names->{$b} cmp $names->{$a} }
+sub rby_avgcpu { $persecs->{$a} <=> $persecs->{$b} }
+
+
+format CSTAT_top =
+Total Elapsed Time = @>>>>>>> Seconds
+(($rrun_rtime - $overhead) / $hz)
+  @>>>>>>>>>> Time = @>>>>>>> Seconds
+$whichtime, $runtime
+@<<<<<<<< Times
+$incl_excl
+%Time ExclSec CumulS #Calls sec/call Csec/c  Name
+.
+
+BEGIN {
+    my $fmt = ' ^>>>   ^>>>> ^>>>>> ^>>>>>   ^>>>>> ^>>>>>  ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<';
+    if (-t STDOUT and defined $stty and my ($cols) = `$stty -a` =~ /\bcolumns\s+(\d+)/)
+    {
+	$fmt .= '<' x ($cols - length $fmt) if $cols > 80;
+    }
+
+    eval "format STAT = \n$fmt" . '
+$pcnt, $secs, $csecs, $ncalls, $percall, $cpercall, $name
+.';
+}
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/enc2xs.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/enc2xs.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/enc2xs.bat	(revision 14489)
@@ -0,0 +1,1404 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+#!./perl
+BEGIN {
+    # @INC poking  no longer needed w/ new MakeMaker and Makefile.PL's
+    # with $ENV{PERL_CORE} set
+    # In case we need it in future...
+    require Config; import Config;
+}
+use strict;
+use warnings;
+use Getopt::Std;
+my @orig_ARGV = @ARGV;
+our $VERSION  = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+# These may get re-ordered.
+# RAW is a do_now as inserted by &enter
+# AGG is an aggreagated do_now, as built up by &process
+
+use constant {
+  RAW_NEXT => 0,
+  RAW_IN_LEN => 1,
+  RAW_OUT_BYTES => 2,
+  RAW_FALLBACK => 3,
+
+  AGG_MIN_IN => 0,
+  AGG_MAX_IN => 1,
+  AGG_OUT_BYTES => 2,
+  AGG_NEXT => 3,
+  AGG_IN_LEN => 4,
+  AGG_OUT_LEN => 5,
+  AGG_FALLBACK => 6,
+};
+
+# (See the algorithm in encengine.c - we're building structures for it)
+
+# There are two sorts of structures.
+# "do_now" (an array, two variants of what needs storing) is whatever we need
+# to do now we've read an input byte.
+# It's housed in a "do_next" (which is how we got to it), and in turn points
+# to a "do_next" which contains all the "do_now"s for the next input byte.
+
+# There will be a "do_next" which is the start state.
+# For a single byte encoding it's the only "do_next" - each "do_now" points
+# back to it, and each "do_now" will cause bytes. There is no state.
+
+# For a multi-byte encoding where all characters in the input are the same
+# length, then there will be a tree of "do_now"->"do_next"->"do_now"
+# branching out from the start state, one step for each input byte.
+# The leaf "do_now"s will all be at the same distance from the start state,
+# only the leaf "do_now"s cause output bytes, and they in turn point back to
+# the start state.
+
+# For an encoding where there are varaible length input byte sequences, you
+# will encounter a leaf "do_now" sooner for the shorter input sequences, but
+# as before the leaves will point back to the start state.
+
+# The system will cope with escape encodings (imagine them as a mostly
+# self-contained tree for each escape state, and cross links between trees
+# at the state-switching characters) but so far no input format defines these.
+
+# The system will also cope with having output "leaves" in the middle of
+# the bifurcating branches, not just at the extremities, but again no
+# input format does this yet.
+
+# There are two variants of the "do_now" structure. The first, smaller variant
+# is generated by &enter as the input file is read. There is one structure
+# for each input byte. Say we are mapping a single byte encoding to a
+# single byte encoding, with  "ABCD" going "abcd". There will be
+# 4 "do_now"s, {"A" => [...,"a",...], "B" => [...,"b",...], "C"=>..., "D"=>...}
+
+# &process then walks the tree, building aggregate "do_now" structres for
+# adjacent bytes where possible. The aggregate is for a contiguous range of
+# bytes which each produce the same length of output, each move to the
+# same next state, and each have the same fallback flag.
+# So our 4 RAW "do_now"s above become replaced by a single structure
+# containing:
+# ["A", "D", "abcd", 1, ...]
+# ie, for an input byte $_ in "A".."D", output 1 byte, found as
+# substr ("abcd", (ord $_ - ord "A") * 1, 1)
+# which maps very nicely into pointer arithmetic in C for encengine.c
+
+sub encode_U
+{
+ # UTF-8 encode long hand - only covers part of perl's range
+ ## my $uv = shift;
+ # chr() works in native space so convert value from table
+ # into that space before using chr().
+ my $ch = chr(utf8::unicode_to_native($_[0]));
+ # Now get core perl to encode that the way it likes.
+ utf8::encode($ch);
+ return $ch;
+}
+
+sub encode_S
+{
+ # encode single byte
+ ## my ($ch,$page) = @_; return chr($ch);
+ return chr $_[0];
+}
+
+sub encode_D
+{
+ # encode double byte MS byte first
+ ## my ($ch,$page) = @_; return chr($page).chr($ch);
+ return chr ($_[1]) . chr $_[0];
+}
+
+sub encode_M
+{
+ # encode Multi-byte - single for 0..255 otherwise double
+ ## my ($ch,$page) = @_;
+ ## return &encode_D if $page;
+ ## return &encode_S;
+ return chr ($_[1]) . chr $_[0] if $_[1];
+ return chr $_[0];
+}
+
+my %encode_types = (U => \&encode_U,
+                    S => \&encode_S,
+                    D => \&encode_D,
+                    M => \&encode_M,
+                   );
+
+# Win32 does not expand globs on command line
+eval "\@ARGV = map(glob(\$_),\@ARGV)" if ($^O eq 'MSWin32');
+
+my %opt;
+# I think these are:
+# -Q to disable the duplicate codepoint test
+# -S make mapping errors fatal
+# -q to remove comments written to output files
+# -O to enable the (brute force) substring optimiser
+# -o <output> to specify the output file name (else it's the first arg)
+# -f <inlist> to give a file with a list of input files (else use the args)
+# -n <name> to name the encoding (else use the basename of the input file.
+getopts('CM:SQqOo:f:n:',\%opt);
+
+$opt{M} and make_makefile_pl($opt{M}, @ARGV);
+$opt{C} and make_configlocal_pm($opt{C}, @ARGV);
+
+# This really should go first, else the die here causes empty (non-erroneous)
+# output files to be written.
+my @encfiles;
+if (exists $opt{'f'}) {
+    # -F is followed by name of file containing list of filenames
+    my $flist = $opt{'f'};
+    open(FLIST,$flist) || die "Cannot open $flist:$!";
+    chomp(@encfiles = <FLIST>);
+    close(FLIST);
+} else {
+    @encfiles = @ARGV;
+}
+
+my $cname = (exists $opt{'o'}) ? $opt{'o'} : shift(@ARGV);
+chmod(0666,$cname) if -f $cname && !-w $cname;
+open(C,">$cname") || die "Cannot open $cname:$!";
+
+my $dname = $cname;
+my $hname = $cname;
+
+my ($doC,$doEnc,$doUcm,$doPet);
+
+if ($cname =~ /\.(c|xs)$/i) # VMS may have upcased filenames with DECC$ARGV_PARSE_STYLE defined
+ {
+  $doC = 1;
+  $dname =~ s/(\.[^\.]*)?$/.exh/;
+  chmod(0666,$dname) if -f $cname && !-w $dname;
+  open(D,">$dname") || die "Cannot open $dname:$!";
+  $hname =~ s/(\.[^\.]*)?$/.h/;
+  chmod(0666,$hname) if -f $cname && !-w $hname;
+  open(H,">$hname") || die "Cannot open $hname:$!";
+
+  foreach my $fh (\*C,\*D,\*H)
+  {
+   print $fh <<"END" unless $opt{'q'};
+/*
+ !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ This file was autogenerated by:
+ $^X $0 @orig_ARGV
+*/
+END
+  }
+
+  if ($cname =~ /(\w+)\.xs$/)
+   {
+    print C "#include <EXTERN.h>\n";
+    print C "#include <perl.h>\n";
+    print C "#include <XSUB.h>\n";
+    print C "#define U8 U8\n";
+   }
+  print C "#include \"encode.h\"\n\n";
+
+ }
+elsif ($cname =~ /\.enc$/)
+ {
+  $doEnc = 1;
+ }
+elsif ($cname =~ /\.ucm$/)
+ {
+  $doUcm = 1;
+ }
+elsif ($cname =~ /\.pet$/)
+ {
+  $doPet = 1;
+ }
+
+my %encoding;
+my %strings;
+my $string_acc;
+my %strings_in_acc;
+
+my $saved = 0;
+my $subsave = 0;
+my $strings = 0;
+
+sub cmp_name
+{
+ if ($a =~ /^.*-(\d+)/)
+  {
+   my $an = $1;
+   if ($b =~ /^.*-(\d+)/)
+    {
+     my $r = $an <=> $1;
+     return $r if $r;
+    }
+  }
+ return $a cmp $b;
+}
+
+
+foreach my $enc (sort cmp_name @encfiles)
+ {
+  my ($name,$sfx) = $enc =~ /^.*?([\w-]+)\.(enc|ucm)$/;
+  $name = $opt{'n'} if exists $opt{'n'};
+  if (open(E,$enc))
+   {
+    if ($sfx eq 'enc')
+     {
+      compile_enc(\*E,lc($name));
+     }
+    else
+     {
+      compile_ucm(\*E,lc($name));
+     }
+   }
+  else
+   {
+    warn "Cannot open $enc for $name:$!";
+   }
+ }
+
+if ($doC)
+ {
+  print STDERR "Writing compiled form\n";
+  foreach my $name (sort cmp_name keys %encoding)
+   {
+    my ($e2u,$u2e,$erep,$min_el,$max_el) = @{$encoding{$name}};
+    process($name.'_utf8',$e2u);
+    addstrings(\*C,$e2u);
+
+    process('utf8_'.$name,$u2e);
+    addstrings(\*C,$u2e);
+   }
+  outbigstring(\*C,"enctable");
+  foreach my $name (sort cmp_name keys %encoding)
+   {
+    my ($e2u,$u2e,$erep,$min_el,$max_el) = @{$encoding{$name}};
+    outtable(\*C,$e2u, "enctable");
+    outtable(\*C,$u2e, "enctable");
+
+    # push(@{$encoding{$name}},outstring(\*C,$e2u->{Cname}.'_def',$erep));
+   }
+  foreach my $enc (sort cmp_name keys %encoding)
+   {
+    # my ($e2u,$u2e,$rep,$min_el,$max_el,$rsym) = @{$encoding{$enc}};
+    my ($e2u,$u2e,$rep,$min_el,$max_el) = @{$encoding{$enc}};
+    #my @info = ($e2u->{Cname},$u2e->{Cname},$rsym,length($rep),$min_el,$max_el);
+    my $replen = 0; 
+    $replen++ while($rep =~ /\G\\x[0-9A-Fa-f]/g);
+    my @info = ($e2u->{Cname},$u2e->{Cname},qq((U8 *)"$rep"),$replen,$min_el,$max_el);
+    my $sym = "${enc}_encoding";
+    $sym =~ s/\W+/_/g;
+    print C "encode_t $sym = \n";
+    # This is to make null encoding work -- dankogai
+    for (my $i = (scalar @info) - 1;  $i >= 0; --$i){
+	$info[$i] ||= 1;
+    }
+    # end of null tweak -- dankogai
+    print C " {",join(',',@info,"{\"$enc\",(const char *)0}"),"};\n\n";
+   }
+
+  foreach my $enc (sort cmp_name keys %encoding)
+   {
+    my $sym = "${enc}_encoding";
+    $sym =~ s/\W+/_/g;
+    print H "extern encode_t $sym;\n";
+    print D " Encode_XSEncoding(aTHX_ &$sym);\n";
+   }
+
+  if ($cname =~ /(\w+)\.xs$/)
+   {
+    my $mod = $1;
+    print C <<'END';
+
+static void
+Encode_XSEncoding(pTHX_ encode_t *enc)
+{
+ dSP;
+ HV *stash = gv_stashpv("Encode::XS", TRUE);
+ SV *sv    = sv_bless(newRV_noinc(newSViv(PTR2IV(enc))),stash);
+ int i = 0;
+ PUSHMARK(sp);
+ XPUSHs(sv);
+ while (enc->name[i])
+  {
+   const char *name = enc->name[i++];
+   XPUSHs(sv_2mortal(newSVpvn(name,strlen(name))));
+  }
+ PUTBACK;
+ call_pv("Encode::define_encoding",G_DISCARD);
+ SvREFCNT_dec(sv);
+}
+
+END
+
+    print C "\nMODULE = Encode::$mod\tPACKAGE = Encode::$mod\n\n";
+    print C "BOOT:\n{\n";
+    print C "#include \"$dname\"\n";
+    print C "}\n";
+   }
+  # Close in void context is bad, m'kay
+  close(D) or warn "Error closing '$dname': $!";
+  close(H) or warn "Error closing '$hname': $!";
+
+  my $perc_saved    = $saved/($strings + $saved) * 100;
+  my $perc_subsaved = $subsave/($strings + $subsave) * 100;
+  printf STDERR "%d bytes in string tables\n",$strings;
+  printf STDERR "%d bytes (%.3g%%) saved spotting duplicates\n",
+    $saved, $perc_saved              if $saved;
+  printf STDERR "%d bytes (%.3g%%) saved using substrings\n",
+    $subsave, $perc_subsaved         if $subsave;
+ }
+elsif ($doEnc)
+ {
+  foreach my $name (sort cmp_name keys %encoding)
+   {
+    my ($e2u,$u2e,$erep,$min_el,$max_el) = @{$encoding{$name}};
+    output_enc(\*C,$name,$e2u);
+   }
+ }
+elsif ($doUcm)
+ {
+  foreach my $name (sort cmp_name keys %encoding)
+   {
+    my ($e2u,$u2e,$erep,$min_el,$max_el) = @{$encoding{$name}};
+    output_ucm(\*C,$name,$u2e,$erep,$min_el,$max_el);
+   }
+ }
+
+# writing half meg files and then not checking to see if you just filled the
+# disk is bad, m'kay
+close(C) or die "Error closing '$cname': $!";
+
+# End of the main program.
+
+sub compile_ucm
+{
+ my ($fh,$name) = @_;
+ my $e2u = {};
+ my $u2e = {};
+ my $cs;
+ my %attr;
+ while (<$fh>)
+  {
+   s/#.*$//;
+   last if /^\s*CHARMAP\s*$/i;
+   if (/^\s*<(\w+)>\s+"?([^"]*)"?\s*$/i) # " # Grrr
+    {
+     $attr{$1} = $2;
+    }
+  }
+ if (!defined($cs =  $attr{'code_set_name'}))
+  {
+   warn "No <code_set_name> in $name\n";
+  }
+ else
+  {
+   $name = $cs unless exists $opt{'n'};
+  }
+ my $erep;
+ my $urep;
+ my $max_el;
+ my $min_el;
+ if (exists $attr{'subchar'})
+  {
+   #my @byte;
+   #$attr{'subchar'} =~ /^\s*/cg;
+   #push(@byte,$1) while $attr{'subchar'} =~ /\G\\x([0-9a-f]+)/icg;
+   #$erep = join('',map(chr(hex($_)),@byte));
+   $erep = $attr{'subchar'}; 
+   $erep =~ s/^\s+//; $erep =~ s/\s+$//;
+  }
+ print "Reading $name ($cs)\n";
+ my $nfb = 0;
+ my $hfb = 0;
+ while (<$fh>)
+  {
+   s/#.*$//;
+   last if /^\s*END\s+CHARMAP\s*$/i;
+   next if /^\s*$/;
+   my (@uni, @byte) = ();
+   my ($uni, $byte, $fb) = m/^(\S+)\s+(\S+)\s+(\S+)\s+/o
+       or die "Bad line: $_";
+   while ($uni =~  m/\G<([U0-9a-fA-F\+]+)>/g){
+       push @uni, map { substr($_, 1) } split(/\+/, $1);
+   }
+   while ($byte =~ m/\G\\x([0-9a-fA-F]+)/g){
+       push @byte, $1;
+   }
+   if (@uni)
+    {
+     my $uch =  join('', map { encode_U(hex($_)) } @uni );
+     my $ech = join('',map(chr(hex($_)),@byte));
+     my $el  = length($ech);
+     $max_el = $el if (!defined($max_el) || $el > $max_el);
+     $min_el = $el if (!defined($min_el) || $el < $min_el);
+     if (length($fb))
+      {
+       $fb = substr($fb,1);
+       $hfb++;
+      }
+     else
+      {
+       $nfb++;
+       $fb = '0';
+      }
+     # $fb is fallback flag
+     # 0 - round trip safe
+     # 1 - fallback for unicode -> enc
+     # 2 - skip sub-char mapping
+     # 3 - fallback enc -> unicode
+     enter($u2e,$uch,$ech,$u2e,$fb+0) if ($fb =~ /[01]/);
+     enter($e2u,$ech,$uch,$e2u,$fb+0) if ($fb =~ /[03]/);
+    }
+   else
+    {
+     warn $_;
+    }
+  }
+ if ($nfb && $hfb)
+  {
+   die "$nfb entries without fallback, $hfb entries with\n";
+  }
+ $encoding{$name} = [$e2u,$u2e,$erep,$min_el,$max_el];
+}
+
+
+
+sub compile_enc
+{
+ my ($fh,$name) = @_;
+ my $e2u = {};
+ my $u2e = {};
+
+ my $type;
+ while ($type = <$fh>)
+  {
+   last if $type !~ /^\s*#/;
+  }
+ chomp($type);
+ return if $type eq 'E';
+ # Do the hash lookup once, rather than once per function call. 4% speedup.
+ my $type_func = $encode_types{$type};
+ my ($def,$sym,$pages) = split(/\s+/,scalar(<$fh>));
+ warn "$type encoded $name\n";
+ my $rep = '';
+ # Save a defined test by setting these to defined values.
+ my $min_el = ~0; # A very big integer
+ my $max_el = 0;  # Anything must be longer than 0
+ {
+  my $v = hex($def);
+  $rep = &$type_func($v & 0xFF, ($v >> 8) & 0xffe);
+ }
+ my $errors;
+ my $seen;
+ # use -Q to silence the seen test. Makefile.PL uses this by default.
+ $seen = {} unless $opt{Q};
+ do
+  {
+   my $line = <$fh>;
+   chomp($line);
+   my $page = hex($line);
+   my $ch = 0;
+   my $i = 16;
+   do
+    {
+     # So why is it 1% faster to leave the my here?
+     my $line = <$fh>;
+     $line =~ s/\r\n$/\n/;
+     die "$.:${line}Line should be exactly 65 characters long including
+     newline (".length($line).")" unless length ($line) == 65;
+     # Split line into groups of 4 hex digits, convert groups to ints
+     # This takes 65.35		
+     # map {hex $_} $line =~ /(....)/g
+     # This takes 63.75 (2.5% less time)
+     # unpack "n*", pack "H*", $line
+     # There's an implicit loop in map. Loops are bad, m'kay. Ops are bad, m'kay
+     # Doing it as while ($line =~ /(....)/g) took 74.63
+     foreach my $val (unpack "n*", pack "H*", $line)
+      {
+       next if $val == 0xFFFD;
+       my $ech = &$type_func($ch,$page);
+       if ($val || (!$ch && !$page))
+        {
+         my $el  = length($ech);
+         $max_el = $el if $el > $max_el;
+         $min_el = $el if $el < $min_el;
+         my $uch = encode_U($val);
+         if ($seen) {
+           # We're doing the test.
+           # We don't need to read this quickly, so storing it as a scalar,
+           # rather than 3 (anon array, plus the 2 scalars it holds) saves
+           # RAM and may make us faster on low RAM systems. [see __END__]
+           if (exists $seen->{$uch})
+             {
+               warn sprintf("U%04X is %02X%02X and %04X\n",
+                            $val,$page,$ch,$seen->{$uch});
+               $errors++;
+             }
+           else
+             {
+               $seen->{$uch} = $page << 8 | $ch;
+             }
+         }
+         # Passing 2 extra args each time is 3.6% slower!
+         # Even with having to add $fallback ||= 0 later
+         enter_fb0($e2u,$ech,$uch);
+         enter_fb0($u2e,$uch,$ech);
+        }
+       else
+        {
+         # No character at this position
+         # enter($e2u,$ech,undef,$e2u);
+        }
+       $ch++;
+      }
+    } while --$i;
+  } while --$pages;
+ die "\$min_el=$min_el, \$max_el=$max_el - seems we read no lines"
+   if $min_el > $max_el;
+ die "$errors mapping conflicts\n" if ($errors && $opt{'S'});
+ $encoding{$name} = [$e2u,$u2e,$rep,$min_el,$max_el];
+}
+
+# my ($a,$s,$d,$t,$fb) = @_;
+sub enter {
+  my ($current,$inbytes,$outbytes,$next,$fallback) = @_;
+  # state we shift to after this (multibyte) input character defaults to same
+  # as current state.
+  $next ||= $current;
+  # Making sure it is defined seems to be faster than {no warnings;} in
+  # &process, or passing it in as 0 explicity.
+  # XXX $fallback ||= 0;
+
+  # Start at the beginning and work forwards through the string to zero.
+  # effectively we are removing 1 character from the front each time
+  # but we don't actually edit the string. [this alone seems to be 14% speedup]
+  # Hence -$pos is the length of the remaining string.
+  my $pos = -length $inbytes;
+  while (1) {
+    my $byte = substr $inbytes, $pos, 1;
+    #  RAW_NEXT => 0,
+    #  RAW_IN_LEN => 1,
+    #  RAW_OUT_BYTES => 2,
+    #  RAW_FALLBACK => 3,
+    # to unicode an array would seem to be better, because the pages are dense.
+    # from unicode can be very sparse, favouring a hash.
+    # hash using the bytes (all length 1) as keys rather than ord value,
+    # as it's easier to sort these in &process.
+
+    # It's faster to always add $fallback even if it's undef, rather than
+    # choosing between 3 and 4 element array. (hence why we set it defined
+    # above)
+    my $do_now = $current->{Raw}{$byte} ||= [{},-$pos,'',$fallback];
+    # When $pos was -1 we were at the last input character.
+    unless (++$pos) {
+      $do_now->[RAW_OUT_BYTES] = $outbytes;
+      $do_now->[RAW_NEXT] = $next;
+      return;
+    }
+    # Tail recursion. The intermdiate state may not have a name yet.
+    $current = $do_now->[RAW_NEXT];
+  }
+}
+
+# This is purely for optimistation. It's just &enter hard coded for $fallback
+# of 0, using only a 3 entry array ref to save memory for every entry.
+sub enter_fb0 {
+  my ($current,$inbytes,$outbytes,$next) = @_;
+  $next ||= $current;
+
+  my $pos = -length $inbytes;
+  while (1) {
+    my $byte = substr $inbytes, $pos, 1;
+    my $do_now = $current->{Raw}{$byte} ||= [{},-$pos,''];
+    unless (++$pos) {
+      $do_now->[RAW_OUT_BYTES] = $outbytes;
+      $do_now->[RAW_NEXT] = $next;
+      return;
+    }
+    $current = $do_now->[RAW_NEXT];
+  }
+}
+
+sub process
+{
+  my ($name,$a) = @_;
+  $name =~ s/\W+/_/g;
+  $a->{Cname} = $name;
+  my $raw = $a->{Raw};
+  my ($l, $agg_max_in, $agg_next, $agg_in_len, $agg_out_len, $agg_fallback);
+  my @ent;
+  $agg_max_in = 0;
+  foreach my $key (sort keys %$raw) {
+    #  RAW_NEXT => 0,
+    #  RAW_IN_LEN => 1,
+    #  RAW_OUT_BYTES => 2,
+    #  RAW_FALLBACK => 3,
+    my ($next, $in_len, $out_bytes, $fallback) = @{$raw->{$key}};
+    # Now we are converting from raw to aggregate, switch from 1 byte strings
+    # to numbers
+    my $b = ord $key;
+    $fallback ||= 0;
+    if ($l &&
+        # If this == fails, we're going to reset $agg_max_in below anyway.
+        $b == ++$agg_max_in &&
+        # References in numeric context give the pointer as an int.
+        $agg_next == $next &&
+        $agg_in_len == $in_len &&
+        $agg_out_len == length $out_bytes &&
+        $agg_fallback == $fallback
+        # && length($l->[AGG_OUT_BYTES]) < 16
+       ) {
+      #     my $i = ord($b)-ord($l->[AGG_MIN_IN]);
+      # we can aggregate this byte onto the end.
+      $l->[AGG_MAX_IN] = $b;
+      $l->[AGG_OUT_BYTES] .= $out_bytes;
+    } else {
+      # AGG_MIN_IN => 0,
+      # AGG_MAX_IN => 1,
+      # AGG_OUT_BYTES => 2,
+      # AGG_NEXT => 3,
+      # AGG_IN_LEN => 4,
+      # AGG_OUT_LEN => 5,
+      # AGG_FALLBACK => 6,
+      # Reset the last thing we saw, plus set 5 lexicals to save some derefs.
+      # (only gains .6% on euc-jp  -- is it worth it?)
+      push @ent, $l = [$b, $agg_max_in = $b, $out_bytes, $agg_next = $next,
+                       $agg_in_len = $in_len, $agg_out_len = length $out_bytes,
+                       $agg_fallback = $fallback];
+    }
+    if (exists $next->{Cname}) {
+      $next->{'Forward'} = 1 if $next != $a;
+    } else {
+      process(sprintf("%s_%02x",$name,$b),$next);
+    }
+  }
+  # encengine.c rules say that last entry must be for 255
+  if ($agg_max_in < 255) {
+    push @ent, [1+$agg_max_in, 255,undef,$a,0,0];
+  }
+  $a->{'Entries'} = \@ent;
+}
+
+
+sub addstrings
+{
+ my ($fh,$a) = @_;
+ my $name = $a->{'Cname'};
+ # String tables
+ foreach my $b (@{$a->{'Entries'}})
+  {
+   next unless $b->[AGG_OUT_LEN];
+   $strings{$b->[AGG_OUT_BYTES]} = undef;
+  }
+ if ($a->{'Forward'})
+  {
+   my $var = $^O eq 'MacOS' ? 'extern' : 'static';
+   print $fh "$var encpage_t $name\[",scalar(@{$a->{'Entries'}}),"];\n";
+  }
+ $a->{'DoneStrings'} = 1;
+ foreach my $b (@{$a->{'Entries'}})
+  {
+   my ($s,$e,$out,$t,$end,$l) = @$b;
+   addstrings($fh,$t) unless $t->{'DoneStrings'};
+  }
+}
+
+sub outbigstring
+{
+  my ($fh,$name) = @_;
+
+  $string_acc = '';
+
+  # Make the big string in the string accumulator. Longest first, on the hope
+  # that this makes it more likely that we find the short strings later on.
+  # Not sure if it helps sorting strings of the same length lexcically.
+  foreach my $s (sort {length $b <=> length $a || $a cmp $b} keys %strings) {
+    my $index = index $string_acc, $s;
+    if ($index >= 0) {
+      $saved += length($s);
+      $strings_in_acc{$s} = $index;
+    } else {
+    OPTIMISER: {
+	if ($opt{'O'}) {
+	  my $sublength = length $s;
+	  while (--$sublength > 0) {
+	    # progressively lop characters off the end, to see if the start of
+	    # the new string overlaps the end of the accumulator.
+	    if (substr ($string_acc, -$sublength)
+		eq substr ($s, 0, $sublength)) {
+	      $subsave += $sublength;
+	      $strings_in_acc{$s} = length ($string_acc) - $sublength;
+	      # append the last bit on the end.
+	      $string_acc .= substr ($s, $sublength);
+	      last OPTIMISER;
+	    }
+	    # or if the end of the new string overlaps the start of the
+	    # accumulator
+	    next unless substr ($string_acc, 0, $sublength)
+	      eq substr ($s, -$sublength);
+	    # well, the last $sublength characters of the accumulator match.
+	    # so as we're prepending to the accumulator, need to shift all our
+	    # existing offsets forwards
+	    $_ += $sublength foreach values %strings_in_acc;
+	    $subsave += $sublength;
+	    $strings_in_acc{$s} = 0;
+	    # append the first bit on the start.
+	    $string_acc = substr ($s, 0, -$sublength) . $string_acc;
+	    last OPTIMISER;
+	  }
+	}
+	# Optimiser (if it ran) found nothing, so just going have to tack the
+	# whole thing on the end.
+	$strings_in_acc{$s} = length $string_acc;
+	$string_acc .= $s;
+      };
+    }
+  }
+
+  $strings = length $string_acc;
+  my $definition = "\nstatic const U8 $name\[$strings] = { " .
+    join(',',unpack "C*",$string_acc);
+  # We have a single long line. Split it at convenient commas.
+  print $fh $1, "\n" while $definition =~ /\G(.{74,77},)/gcs;
+  print $fh substr ($definition, pos $definition), " };\n";
+}
+
+sub findstring {
+  my ($name,$s) = @_;
+  my $offset = $strings_in_acc{$s};
+  die "Can't find string " . join (',',unpack "C*",$s) . " in accumulator"
+    unless defined $offset;
+  "$name + $offset";
+}
+
+sub outtable
+{
+ my ($fh,$a,$bigname) = @_;
+ my $name = $a->{'Cname'};
+ $a->{'Done'} = 1;
+ foreach my $b (@{$a->{'Entries'}})
+  {
+   my ($s,$e,$out,$t,$end,$l) = @$b;
+   outtable($fh,$t,$bigname) unless $t->{'Done'};
+  }
+ print $fh "\nstatic encpage_t $name\[",scalar(@{$a->{'Entries'}}),"] = {\n";
+ foreach my $b (@{$a->{'Entries'}})
+  {
+   my ($sc,$ec,$out,$t,$end,$l,$fb) = @$b;
+   # $end |= 0x80 if $fb; # what the heck was on your mind, Nick?  -- Dan
+   print  $fh "{";
+   if ($l)
+    {
+     printf $fh findstring($bigname,$out);
+    }
+   else
+    {
+     print  $fh "0";
+    }
+   print  $fh ",",$t->{Cname};
+   printf $fh ",0x%02x,0x%02x,$l,$end},\n",$sc,$ec;
+  }
+ print $fh "};\n";
+}
+
+sub output_enc
+{
+ my ($fh,$name,$a) = @_;
+ die "Changed - fix me for new structure";
+ foreach my $b (sort keys %$a)
+  {
+   my ($s,$e,$out,$t,$end,$l,$fb) = @{$a->{$b}};
+  }
+}
+
+sub decode_U
+{
+ my $s = shift;
+}
+
+my @uname;
+sub char_names
+{
+ my $s = do "unicore/Name.pl";
+ die "char_names: unicore/Name.pl: $!\n" unless defined $s;
+ pos($s) = 0;
+ while ($s =~ /\G([0-9a-f]+)\t([0-9a-f]*)\t(.*?)\s*\n/igc)
+  {
+   my $name = $3;
+   my $s = hex($1);
+   last if $s >= 0x10000;
+   my $e = length($2) ? hex($2) : $s;
+   for (my $i = $s; $i <= $e; $i++)
+    {
+     $uname[$i] = $name;
+#    print sprintf("U%04X $name\n",$i);
+    }
+  }
+}
+
+sub output_ucm_page
+{
+  my ($cmap,$a,$t,$pre) = @_;
+  # warn sprintf("Page %x\n",$pre);
+  my $raw = $t->{Raw};
+  foreach my $key (sort keys %$raw) {
+    #  RAW_NEXT => 0,
+    #  RAW_IN_LEN => 1,
+    #  RAW_OUT_BYTES => 2,
+    #  RAW_FALLBACK => 3,
+    my ($next, $in_len, $out_bytes, $fallback) = @{$raw->{$key}};
+    my $u = ord $key;
+    $fallback ||= 0;
+
+    if ($next != $a && $next != $t) {
+      output_ucm_page($cmap,$a,$next,(($pre|($u &0x3F)) << 6)&0xFFFF);
+    } elsif (length $out_bytes) {
+      if ($pre) {
+        $u = $pre|($u &0x3f);
+      }
+      my $s = sprintf "<U%04X> ",$u;
+      #foreach my $c (split(//,$out_bytes)) {
+      #  $s .= sprintf "\\x%02X",ord($c);
+      #}
+      # 9.5% faster changing that loop to this:
+      $s .= sprintf +("\\x%02X" x length $out_bytes), unpack "C*", $out_bytes;
+      $s .= sprintf " |%d # %s\n",($fallback ? 1 : 0),$uname[$u];
+      push(@$cmap,$s);
+    } else {
+      warn join(',',$u, @{$raw->{$key}},$a,$t);
+    }
+  }
+}
+
+sub output_ucm
+{
+ my ($fh,$name,$h,$rep,$min_el,$max_el) = @_;
+ print $fh "# $0 @orig_ARGV\n" unless $opt{'q'};
+ print $fh "<code_set_name> \"$name\"\n";
+ char_names();
+ if (defined $min_el)
+  {
+   print $fh "<mb_cur_min> $min_el\n";
+  }
+ if (defined $max_el)
+  {
+   print $fh "<mb_cur_max> $max_el\n";
+  }
+ if (defined $rep)
+  {
+   print $fh "<subchar> ";
+   foreach my $c (split(//,$rep))
+    {
+     printf $fh "\\x%02X",ord($c);
+    }
+   print $fh "\n";
+  }
+ my @cmap;
+ output_ucm_page(\@cmap,$h,$h,0);
+ print $fh "#\nCHARMAP\n";
+ foreach my $line (sort { substr($a,8) cmp substr($b,8) } @cmap)
+  {
+   print $fh $line;
+  }
+ print $fh "END CHARMAP\n";
+}
+
+use vars qw(
+    $_Enc2xs
+    $_Version
+    $_Inc
+    $_E2X 
+    $_Name
+    $_TableFiles
+    $_Now
+);
+
+sub find_e2x{
+    eval { require File::Find; };
+    my (@inc, %e2x_dir);
+    for my $inc (@INC){
+	push @inc, $inc unless $inc eq '.'; #skip current dir
+    }
+    File::Find::find(
+	     sub {
+		 my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+		     $atime,$mtime,$ctime,$blksize,$blocks)
+		     = lstat($_) or return;
+		 -f _ or return;
+		 if (/^.*\.e2x$/o){
+		     no warnings 'once';
+		     $e2x_dir{$File::Find::dir} ||= $mtime;
+		 }
+		 return;
+	     }, @inc);
+    warn join("\n", keys %e2x_dir), "\n";
+    for my $d (sort {$e2x_dir{$a} <=> $e2x_dir{$b}} keys %e2x_dir){
+	$_E2X = $d;
+	# warn "$_E2X => ", scalar localtime($e2x_dir{$d});
+	return $_E2X;
+    }
+}
+
+sub make_makefile_pl
+{
+    eval { require Encode; };
+    $@ and die "You need to install Encode to use enc2xs -M\nerror: $@\n";
+    # our used for variable expanstion
+    $_Enc2xs = $0;
+    $_Version = $VERSION;
+    $_E2X = find_e2x();
+    $_Name = shift;
+    $_TableFiles = join(",", map {qq('$_')} @_);
+    $_Now = scalar localtime();
+
+    eval { require File::Spec; };
+    _print_expand(File::Spec->catfile($_E2X,"Makefile_PL.e2x"),"Makefile.PL");
+    _print_expand(File::Spec->catfile($_E2X,"_PM.e2x"),        "$_Name.pm");
+    _print_expand(File::Spec->catfile($_E2X,"_T.e2x"),         "t/$_Name.t");
+    _print_expand(File::Spec->catfile($_E2X,"README.e2x"),     "README");
+    _print_expand(File::Spec->catfile($_E2X,"Changes.e2x"),    "Changes");
+    exit;
+}
+
+use vars qw(
+	    $_ModLines
+	    $_LocalVer
+	    );
+
+sub make_configlocal_pm
+{
+    eval { require Encode; };
+    $@ and die "Unable to require Encode: $@\n";
+    eval { require File::Spec; };
+    # our used for variable expanstion
+    my %in_core = map {$_=>1}('ascii','iso-8859-1','utf8');
+    my %LocalMod = ();
+    for my $d (@INC){
+	my $inc = File::Spec->catfile($d, "Encode");
+	-d $inc or next;
+	opendir my $dh, $inc or die "$inc:$!";
+	warn "Checking $inc...\n";
+	for my $f (grep /\.pm$/o, readdir($dh)){
+	    -f File::Spec->catfile($inc, "$f") or next;
+	    $INC{"Encode/$f"} and next;
+	    warn "require Encode/$f;\n";
+	    eval { require "Encode/$f"; };
+	    $@ and die "Can't require Encode/$f: $@\n";
+	    for my $enc (Encode->encodings()){
+		no warnings 'once';
+		$in_core{$enc} and next;
+		$Encode::Config::ExtModule{$enc} and next;
+		my $mod = "Encode/$f"; 
+		$mod =~ s/\.pm$//o; $mod =~ s,/,::,og;
+		$LocalMod{$enc} ||= $mod;
+	    }
+	}
+    }
+    $_ModLines = "";
+    for my $enc (sort keys %LocalMod){
+	$_ModLines .= 
+	    qq(\$Encode::ExtModule{'$enc'} =\t"$LocalMod{$enc}";\n);
+    }
+    warn $_ModLines;
+    $_LocalVer = _mkversion();
+    $_E2X = find_e2x();
+    $_Inc = $INC{"Encode.pm"}; $_Inc =~ s/\.pm$//o;    
+    _print_expand(File::Spec->catfile($_E2X,"ConfigLocal_PM.e2x"),    
+		  File::Spec->catfile($_Inc,"ConfigLocal.pm"),
+		  1);
+    exit;
+}
+
+sub _mkversion{
+    my ($ss,$mm,$hh,$dd,$mo,$yyyy) = localtime();
+    $yyyy += 1900, $mo +=1;
+    return sprintf("v%04d.%04d.%04d", $yyyy, $mo*100+$dd, $hh*100+$mm);
+}
+
+sub _print_expand{
+    eval { require File::Basename; };
+    $@ and die "File::Basename needed.  Are you on miniperl?;\nerror: $@\n";
+    File::Basename->import();
+    my ($src, $dst, $clobber) = @_;
+    if (!$clobber and -e $dst){
+	warn "$dst exists. skipping\n";
+	return;
+    }
+    warn "Generating $dst...\n";
+    open my $in, $src or die "$src : $!";
+    if ((my $d = dirname($dst)) ne '.'){
+	-d $d or mkdir $d, 0755 or die  "mkdir $d : $!";
+    }	   
+    open my $out, ">$dst" or die "$!";
+    my $asis = 0;
+    while (<$in>){ 
+	if (/^#### END_OF_HEADER/){
+	    $asis = 1; next;
+	}	  
+	s/(\$_[A-Z][A-Za-z0-9]+)_/$1/gee unless $asis;
+	print $out $_;
+    }
+}
+__END__
+
+=head1 NAME
+
+enc2xs -- Perl Encode Module Generator
+
+=head1 SYNOPSIS
+
+  enc2xs -[options]
+  enc2xs -M ModName mapfiles...
+  enc2xs -C
+
+=head1 DESCRIPTION
+
+F<enc2xs> builds a Perl extension for use by Encode from either
+Unicode Character Mapping files (.ucm) or Tcl Encoding Files (.enc).
+Besides being used internally during the build process of the Encode
+module, you can use F<enc2xs> to add your own encoding to perl.
+No knowledge of XS is necessary.
+
+=head1 Quick Guide
+
+If you want to know as little about Perl as possible but need to
+add a new encoding, just read this chapter and forget the rest.
+
+=over 4
+
+=item 0.
+
+Have a .ucm file ready.  You can get it from somewhere or you can write
+your own from scratch or you can grab one from the Encode distribution
+and customize it.  For the UCM format, see the next Chapter.  In the
+example below, I'll call my theoretical encoding myascii, defined
+in I<my.ucm>.  C<$> is a shell prompt.
+
+  $ ls -F
+  my.ucm
+
+=item 1.
+
+Issue a command as follows;
+
+  $ enc2xs -M My my.ucm
+  generating Makefile.PL
+  generating My.pm
+  generating README
+  generating Changes
+
+Now take a look at your current directory.  It should look like this.
+
+  $ ls -F
+  Makefile.PL   My.pm         my.ucm        t/
+
+The following files were created.
+
+  Makefile.PL - MakeMaker script
+  My.pm       - Encode submodule
+  t/My.t      - test file
+
+=over 4
+
+=item 1.1.
+
+If you want *.ucm installed together with the modules, do as follows;
+
+  $ mkdir Encode
+  $ mv *.ucm Encode
+  $ enc2xs -M My Encode/*ucm
+
+=back
+
+=item 2.
+
+Edit the files generated.  You don't have to if you have no time AND no
+intention to give it to someone else.  But it is a good idea to edit
+the pod and to add more tests.
+
+=item 3.
+
+Now issue a command all Perl Mongers love:
+
+  $ perl Makefile.PL
+  Writing Makefile for Encode::My
+
+=item 4.
+
+Now all you have to do is make.
+
+  $ make
+  cp My.pm blib/lib/Encode/My.pm
+  /usr/local/bin/perl /usr/local/bin/enc2xs -Q -O \
+    -o encode_t.c -f encode_t.fnm
+  Reading myascii (myascii)
+  Writing compiled form
+  128 bytes in string tables
+  384 bytes (75%) saved spotting duplicates
+  1 bytes (0.775%) saved using substrings
+  ....
+  chmod 644 blib/arch/auto/Encode/My/My.bs
+  $
+
+The time it takes varies depending on how fast your machine is and
+how large your encoding is.  Unless you are working on something big
+like euc-tw, it won't take too long.
+
+=item 5.
+
+You can "make install" already but you should test first.
+
+  $ make test
+  PERL_DL_NONLAZY=1 /usr/local/bin/perl -Iblib/arch -Iblib/lib \
+    -e 'use Test::Harness  qw(&runtests $verbose); \
+    $verbose=0; runtests @ARGV;' t/*.t
+  t/My....ok
+  All tests successful.
+  Files=1, Tests=2,  0 wallclock secs
+   ( 0.09 cusr + 0.01 csys = 0.09 CPU)
+
+=item 6.
+
+If you are content with the test result, just "make install"
+
+=item 7.
+
+If you want to add your encoding to Encode's demand-loading list
+(so you don't have to "use Encode::YourEncoding"), run
+
+  enc2xs -C
+
+to update Encode::ConfigLocal, a module that controls local settings.
+After that, "use Encode;" is enough to load your encodings on demand.
+
+=back
+
+=head1 The Unicode Character Map
+
+Encode uses the Unicode Character Map (UCM) format for source character
+mappings.  This format is used by IBM's ICU package and was adopted
+by Nick Ing-Simmons for use with the Encode module.  Since UCM is
+more flexible than Tcl's Encoding Map and far more user-friendly,
+this is the recommended formet for Encode now.
+
+A UCM file looks like this.
+
+  #
+  # Comments
+  #
+  <code_set_name> "US-ascii" # Required
+  <code_set_alias> "ascii"   # Optional
+  <mb_cur_min> 1             # Required; usually 1
+  <mb_cur_max> 1             # Max. # of bytes/char
+  <subchar> \x3F             # Substitution char
+  #
+  CHARMAP
+  <U0000> \x00 |0 # <control>
+  <U0001> \x01 |0 # <control>
+  <U0002> \x02 |0 # <control>
+  ....
+  <U007C> \x7C |0 # VERTICAL LINE
+  <U007D> \x7D |0 # RIGHT CURLY BRACKET
+  <U007E> \x7E |0 # TILDE
+  <U007F> \x7F |0 # <control>
+  END CHARMAP
+
+=over 4
+
+=item *
+
+Anything that follows C<#> is treated as a comment.
+
+=item *
+
+The header section continues until a line containing the word
+CHARMAP. This section has a form of I<E<lt>keywordE<gt> value>, one
+pair per line.  Strings used as values must be quoted. Barewords are
+treated as numbers.  I<\xXX> represents a byte.
+
+Most of the keywords are self-explanatory. I<subchar> means
+substitution character, not subcharacter.  When you decode a Unicode
+sequence to this encoding but no matching character is found, the byte
+sequence defined here will be used.  For most cases, the value here is
+\x3F; in ASCII, this is a question mark.
+
+=item *
+
+CHARMAP starts the character map section.  Each line has a form as
+follows:
+
+  <UXXXX> \xXX.. |0 # comment
+    ^     ^      ^
+    |     |      +- Fallback flag
+    |     +-------- Encoded byte sequence
+    +-------------- Unicode Character ID in hex
+
+The format is roughly the same as a header section except for the
+fallback flag: | followed by 0..3.   The meaning of the possible
+values is as follows:
+
+=over 4
+
+=item |0 
+
+Round trip safe.  A character decoded to Unicode encodes back to the
+same byte sequence.  Most characters have this flag.
+
+=item |1
+
+Fallback for unicode -> encoding.  When seen, enc2xs adds this
+character for the encode map only.
+
+=item |2 
+
+Skip sub-char mapping should there be no code point.
+
+=item |3 
+
+Fallback for encoding -> unicode.  When seen, enc2xs adds this
+character for the decode map only.
+
+=back
+
+=item *
+
+And finally, END OF CHARMAP ends the section.
+
+=back
+
+When you are manually creating a UCM file, you should copy ascii.ucm
+or an existing encoding which is close to yours, rather than write
+your own from scratch.
+
+When you do so, make sure you leave at least B<U0000> to B<U0020> as
+is, unless your environment is EBCDIC.
+
+B<CAVEAT>: not all features in UCM are implemented.  For example,
+icu:state is not used.  Because of that, you need to write a perl
+module if you want to support algorithmical encodings, notably
+the ISO-2022 series.  Such modules include L<Encode::JP::2022_JP>,
+L<Encode::KR::2022_KR>, and L<Encode::TW::HZ>.
+
+=head2 Coping with duplicate mappings
+
+When you create a map, you SHOULD make your mappings round-trip safe.
+That is, C<encode('your-encoding', decode('your-encoding', $data)) eq
+$data> stands for all characters that are marked as C<|0>.  Here is
+how to make sure:
+
+=over 4
+
+=item * 
+
+Sort your map in Unicode order.
+
+=item *
+
+When you have a duplicate entry, mark either one with '|1' or '|3'.
+  
+=item * 
+
+And make sure the '|1' or '|3' entry FOLLOWS the '|0' entry.
+
+=back
+
+Here is an example from big5-eten.
+
+  <U2550> \xF9\xF9 |0
+  <U2550> \xA2\xA4 |3
+
+Internally Encoding -> Unicode and Unicode -> Encoding Map looks like
+this;
+
+  E to U               U to E
+  --------------------------------------
+  \xF9\xF9 => U2550    U2550 => \xF9\xF9
+  \xA2\xA4 => U2550
+ 
+So it is round-trip safe for \xF9\xF9.  But if the line above is upside
+down, here is what happens.
+
+  E to U               U to E
+  --------------------------------------
+  \xA2\xA4 => U2550    U2550 => \xF9\xF9
+  (\xF9\xF9 => U2550 is now overwritten!)
+
+The Encode package comes with F<ucmlint>, a crude but sufficient
+utility to check the integrity of a UCM file.  Check under the
+Encode/bin directory for this.
+
+When in doubt, you can use F<ucmsort>, yet another utility under
+Encode/bin directory.
+
+=head1 Bookmarks
+
+=over 4
+
+=item *
+
+ICU Home Page 
+L<http://oss.software.ibm.com/icu/>
+
+=item *
+
+ICU Character Mapping Tables
+L<http://oss.software.ibm.com/icu/charset/>
+
+=item *
+
+ICU:Conversion Data
+L<http://oss.software.ibm.com/icu/userguide/conversion-data.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Encode>,
+L<perlmod>,
+L<perlpod>
+
+=cut
+
+# -Q to disable the duplicate codepoint test
+# -S make mapping errors fatal
+# -q to remove comments written to output files
+# -O to enable the (brute force) substring optimiser
+# -o <output> to specify the output file name (else it's the first arg)
+# -f <inlist> to give a file with a list of input files (else use the args)
+# -n <name> to name the encoding (else use the basename of the input file.
+
+With %seen holding array refs:
+
+      865.66 real        28.80 user         8.79 sys
+      7904  maximum resident set size
+      1356  average shared memory size
+     18566  average unshared data size
+       229  average unshared stack size
+     46080  page reclaims
+     33373  page faults
+
+With %seen holding simple scalars:
+
+      342.16 real        27.11 user         3.54 sys
+      8388  maximum resident set size
+      1394  average shared memory size
+     14969  average unshared data size
+       236  average unshared stack size
+     28159  page reclaims
+      9839  page faults
+
+Yes, 5 minutes is faster than 15. Above is for CP936 in CN. Only difference is
+how %seen is storing things its seen. So it is pathalogically bad on a 16M
+RAM machine, but it's going to help even on modern machines.
+Swapping is bad, m'kay :-)
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/exetype.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/exetype.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/exetype.bat	(revision 14489)
@@ -0,0 +1,124 @@
+@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
+use strict;
+
+# All the IMAGE_* structures are defined in the WINNT.H file
+# of the Microsoft Platform SDK.
+
+my %subsys = (NATIVE    => 1,
+              WINDOWS   => 2,
+              CONSOLE   => 3,
+              POSIX     => 7,
+              WINDOWSCE => 9);
+
+unless (0 < @ARGV && @ARGV < 3) {
+    printf "Usage: $0 exefile [%s]\n", join '|', sort keys %subsys;
+    exit;
+}
+
+$ARGV[1] = uc $ARGV[1] if $ARGV[1];
+unless (@ARGV == 1 || defined $subsys{$ARGV[1]}) {
+    (my $subsys = join(', ', sort keys %subsys)) =~ s/, (\w+)$/ or $1/;
+    print "Invalid subsystem $ARGV[1], please use $subsys\n";
+    exit;
+}
+
+my ($record,$magic,$signature,$offset,$size);
+open EXE, "+< $ARGV[0]" or die "Cannot open $ARGV[0]: $!\n";
+binmode EXE;
+
+# read IMAGE_DOS_HEADER structure
+read EXE, $record, 64;
+($magic,$offset) = unpack "Sx58L", $record;
+
+die "$ARGV[0] is not an MSDOS executable file.\n"
+    unless $magic == 0x5a4d; # "MZ"
+
+# read signature, IMAGE_FILE_HEADER and first WORD of IMAGE_OPTIONAL_HEADER
+seek EXE, $offset, 0;
+read EXE, $record, 4+20+2;
+($signature,$size,$magic) = unpack "Lx16Sx2S", $record;
+
+die "PE header not found" unless $signature == 0x4550; # "PE\0\0"
+
+die "Optional header is neither in NT32 nor in NT64 format"
+    unless ($size == 224 && $magic == 0x10b) || # IMAGE_NT_OPTIONAL_HDR32_MAGIC
+           ($size == 240 && $magic == 0x20b);   # IMAGE_NT_OPTIONAL_HDR64_MAGIC
+
+# Offset 68 in the IMAGE_OPTIONAL_HEADER(32|64) is the 16 bit subsystem code
+seek EXE, $offset+4+20+68, 0;
+if (@ARGV == 1) {
+    read EXE, $record, 2;
+    my ($subsys) = unpack "S", $record;
+    $subsys = {reverse %subsys}->{$subsys} || "UNKNOWN($subsys)";
+    print "$ARGV[0] uses the $subsys subsystem.\n";
+}
+else {
+    print EXE pack "S", $subsys{$ARGV[1]};
+}
+close EXE;
+__END__
+
+=head1 NAME
+
+exetype - Change executable subsystem type between "Console" and "Windows"
+
+=head1 SYNOPSIS
+
+	C:\perl\bin> copy perl.exe guiperl.exe
+	C:\perl\bin> exetype guiperl.exe windows
+
+=head1 DESCRIPTION
+
+This program edits an executable file to indicate which subsystem the
+operating system must invoke for execution.
+
+You can specify any of the following subsystems:
+
+=over
+
+=item CONSOLE
+
+The CONSOLE subsystem handles a Win32 character-mode application that
+use a console supplied by the operating system.
+
+=item WINDOWS
+
+The WINDOWS subsystem handles an application that does not require a
+console and creates its own windows, if required.
+
+=item NATIVE
+
+The NATIVE subsystem handles a Windows NT device driver.
+
+=item WINDOWSCE
+
+The WINDOWSCE subsystem handles Windows CE consumer electronics
+applications.
+
+=item POSIX
+
+The POSIX subsystem handles a POSIX application in Windows NT.
+
+=back
+
+=head1 AUTHOR
+
+Jan Dubois <jand@activestate.com>
+
+=cut
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/find2perl.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/find2perl.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/find2perl.bat	(revision 14489)
@@ -0,0 +1,909 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+      if $running_under_some_shell;
+(my $perlpath = <<'/../') =~ s/\s*\z//;
+c:\shaoqunWu\perl\bin\perl.exe
+/../
+use strict;
+use vars qw/$statdone/;
+use File::Spec::Functions 'curdir';
+my $startperl = "#! $perlpath -w";
+
+#
+# Modified September 26, 1993 to provide proper handling of years after 1999
+#   Tom Link <tml+@pitt.edu>
+#   University of Pittsburgh
+#
+# Modified April 7, 1998 with nasty hacks to implement the troublesome -follow
+#  Billy Constantine <wdconsta@cs.adelaide.edu.au> <billy@smug.adelaide.edu.au>
+#  University of Adelaide, Adelaide, South Australia
+#
+# Modified 1999-06-10, 1999-07-07 to migrate to cleaner perl5 usage
+#   Ken Pizzini <ken@halcyon.com>
+#
+# Modified 2000-01-28 to use the 'follow' option of File::Find
+
+sub tab ();
+sub n ($$);
+sub fileglob_to_re ($);
+sub quote ($);
+
+my @roots = ();
+while ($ARGV[0] =~ /^[^-!(]/) {
+    push(@roots, shift);
+}
+@roots = (curdir()) unless @roots;
+for (@roots) { $_ = quote($_) }
+my $roots = join(', ', @roots);
+
+my $find = "find";
+my $indent_depth = 1;
+my $stat = 'lstat';
+my $decl = '';
+my $flushall = '';
+my $initfile = '';
+my $initnewer = '';
+my $out = '';
+my $declaresubs = "sub wanted;\n";
+my %init = ();
+my ($follow_in_effect,$Skip_And) = (0,0);
+my $print_needed = 1;
+
+while (@ARGV) {
+    $_ = shift;
+    s/^-// || /^[()!]/ || die "Unrecognized switch: $_\n";
+    if ($_ eq '(') {
+        $out .= tab . "(\n";
+        $indent_depth++;
+        next;
+    } elsif ($_ eq ')') {
+        --$indent_depth;
+        $out .= tab . ")";
+    } elsif ($_ eq 'follow') {
+        $follow_in_effect= 1;
+        $stat = 'stat';
+        $Skip_And= 1;
+    } elsif ($_ eq '!') {
+        $out .= tab . "!";
+        next;
+    } elsif (/^(i)?name$/) {
+        $out .= tab . '/' . fileglob_to_re(shift) . "/s$1";
+    } elsif (/^(i)?path$/) {
+        $out .= tab . '$File::Find::name =~ /' . fileglob_to_re(shift) . "/s$1";
+    } elsif ($_ eq 'perm') {
+        my $onum = shift;
+        $onum =~ /^-?[0-7]+$/
+            || die "Malformed -perm argument: $onum\n";
+        $out .= tab;
+        if ($onum =~ s/^-//) {
+            $onum = sprintf("0%o", oct($onum) & 07777);
+            $out .= "((\$mode & $onum) == $onum)";
+        } else {
+            $onum =~ s/^0*/0/;
+            $out .= "((\$mode & 0777) == $onum)";
+        }
+    } elsif ($_ eq 'type') {
+        (my $filetest = shift) =~ tr/s/S/;
+        $out .= tab . "-$filetest _";
+    } elsif ($_ eq 'print') {
+        $out .= tab . 'print("$name\n")';
+	$print_needed = 0;
+    } elsif ($_ eq 'print0') {
+        $out .= tab . 'print("$name\0")';
+	$print_needed = 0;
+    } elsif ($_ eq 'fstype') {
+        my $type = shift;
+        $out .= tab;
+        if ($type eq 'nfs') {
+            $out .= '($dev < 0)';
+        } else {
+            $out .= '($dev >= 0)'; #XXX
+        }
+    } elsif ($_ eq 'user') {
+        my $uname = shift;
+        $out .= tab . "(\$uid == \$uid{'$uname'})";
+        $init{user} = 1;
+    } elsif ($_ eq 'group') {
+        my $gname = shift;
+        $out .= tab . "(\$gid == \$gid{'$gname'})";
+        $init{group} = 1;
+    } elsif ($_ eq 'nouser') {
+        $out .= tab . '!exists $uid{$uid}';
+        $init{user} = 1;
+    } elsif ($_ eq 'nogroup') {
+        $out .= tab . '!exists $gid{$gid}';
+        $init{group} = 1;
+    } elsif ($_ eq 'links') {
+        $out .= tab . n('$nlink', shift);
+    } elsif ($_ eq 'inum') {
+        $out .= tab . n('$ino', shift);
+    } elsif ($_ eq 'size') {
+        $_ = shift;
+        my $n = 'int(((-s _) + 511) / 512)';
+        if (s/c\z//) {
+            $n = 'int(-s _)';
+        } elsif (s/k\z//) {
+            $n = 'int(((-s _) + 1023) / 1024)';
+        }
+        $out .= tab . n($n, $_);
+    } elsif ($_ eq 'atime') {
+        $out .= tab . n('int(-A _)', shift);
+    } elsif ($_ eq 'mtime') {
+        $out .= tab . n('int(-M _)', shift);
+    } elsif ($_ eq 'ctime') {
+        $out .= tab . n('int(-C _)', shift);
+    } elsif ($_ eq 'exec') {
+        my @cmd = ();
+        while (@ARGV && $ARGV[0] ne ';')
+            { push(@cmd, shift) }
+        shift;
+        $out .= tab;
+        if ($cmd[0] =~m#^(?:(?:/usr)?/bin/)?rm$#
+                && $cmd[$#cmd] eq '{}'
+                && (@cmd == 2 || (@cmd == 3 && $cmd[1] eq '-f'))) {
+            if (@cmd == 2) {
+                $out .= '(unlink($_) || warn "$name: $!\n")';
+            } elsif (!@ARGV) {
+                $out .= 'unlink($_)';
+            } else {
+                $out .= '(unlink($_) || 1)';
+            }
+        } else {
+            for (@cmd)
+                { s/'/\\'/g }
+            { local $" = "','"; $out .= "doexec(0, '@cmd')"; }
+            $declaresubs .= "sub doexec (\$\@);\n";
+            $init{doexec} = 1;
+        }
+	$print_needed = 0;
+    } elsif ($_ eq 'ok') {
+        my @cmd = ();
+        while (@ARGV && $ARGV[0] ne ';')
+            { push(@cmd, shift) }
+        shift;
+        $out .= tab;
+        for (@cmd)
+            { s/'/\\'/g }
+        { local $" = "','"; $out .= "doexec(1, '@cmd')"; }
+        $declaresubs .= "sub doexec (\$\@);\n";
+        $init{doexec} = 1;
+	$print_needed = 0;
+    } elsif ($_ eq 'prune') {
+        $out .= tab . '($File::Find::prune = 1)';
+    } elsif ($_ eq 'xdev') {
+        $out .= tab . '!($File::Find::prune |= ($dev != $File::Find::topdev))'
+;
+    } elsif ($_ eq 'newer') {
+        my $file = shift;
+        my $newername = 'AGE_OF' . $file;
+        $newername =~ s/\W/_/g;
+        $newername = '$' . $newername;
+        $out .= tab . "(-M _ < $newername)";
+        $initnewer .= "my $newername = -M " . quote($file) . ";\n";
+    } elsif ($_ eq 'eval') {
+        my $prog = shift;
+        $prog =~ s/'/\\'/g;
+        $out .= tab . "eval {$prog}";
+	$print_needed = 0;
+    } elsif ($_ eq 'depth') {
+        $find = 'finddepth';
+        next;
+    } elsif ($_ eq 'ls') {
+        $out .= tab . "ls";
+        $declaresubs .= "sub ls ();\n";
+        $init{ls} = 1;
+	$print_needed = 0;
+    } elsif ($_ eq 'tar') {
+        die "-tar must have a filename argument\n" unless @ARGV;
+        my $file = shift;
+        my $fh = 'FH' . $file;
+        $fh =~ s/\W/_/g;
+        $out .= tab . "tar(*$fh, \$name)";
+        $flushall .= "tflushall;\n";
+        $declaresubs .= "sub tar;\nsub tflushall ();\n";
+        $initfile .= "open($fh, " . quote('> ' . $file) .
+                     qq{) || die "Can't open $fh: \$!\\n";\n};
+        $init{tar} = 1;
+    } elsif (/^(n?)cpio\z/) {
+        die "-$_ must have a filename argument\n" unless @ARGV;
+        my $file = shift;
+        my $fh = 'FH' . $file;
+        $fh =~ s/\W/_/g;
+        $out .= tab . "cpio(*$fh, \$name, '$1')";
+        $find = 'finddepth';
+        $flushall .= "cflushall;\n";
+        $declaresubs .= "sub cpio;\nsub cflushall ();\n";
+        $initfile .= "open($fh, " . quote('> ' . $file) .
+                     qq{) || die "Can't open $fh: \$!\\n";\n};
+        $init{cpio} = 1;
+    } else {
+        die "Unrecognized switch: -$_\n";
+    }
+
+    if (@ARGV) {
+        if ($ARGV[0] eq '-o') {
+            { local($statdone) = 1; $out .= "\n" . tab . "||\n"; }
+            $statdone = 0 if $indent_depth == 1 && exists $init{delayedstat};
+            $init{saw_or} = 1;
+            shift;
+        } else {
+            $out .= " &&" unless $Skip_And || $ARGV[0] eq ')';
+            $out .= "\n";
+            shift if $ARGV[0] eq '-a';
+        }
+    }
+}
+
+if ($print_needed) {
+    my $t = tab;
+    if ($t !~ /&&\s*$/) { $t .= '&& ' }
+    $out .= "\n" . $t . 'print("$name\n")';
+}
+
+
+print <<"END";
+$startperl
+    eval 'exec $perlpath -S \$0 \${1+"\$@"}'
+        if 0; #\$running_under_some_shell
+
+use strict;
+use File::Find ();
+
+# Set the variable \$File::Find::dont_use_nlink if you're using AFS,
+# since AFS cheats.
+
+# for the convenience of &wanted calls, including -eval statements:
+use vars qw/*name *dir *prune/;
+*name   = *File::Find::name;
+*dir    = *File::Find::dir;
+*prune  = *File::Find::prune;
+
+$declaresubs
+
+END
+
+if (exists $init{doexec}) {
+    print <<'END';
+use Cwd ();
+my $cwd = Cwd::cwd();
+
+END
+}  
+
+if (exists $init{ls}) {
+    print <<'END';
+my @rwx = qw(--- --x -w- -wx r-- r-x rw- rwx);
+my @moname = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
+
+END
+}
+
+if (exists $init{user} || exists $init{ls} || exists $init{tar}) {
+    print "my (%uid, %user);\n";
+    print "while (my (\$name, \$pw, \$uid) = getpwent) {\n";
+    print '    $uid{$name} = $uid{$uid} = $uid;', "\n"
+        if exists $init{user};
+    print '    $user{$uid} = $name unless exists $user{$uid};', "\n"
+        if exists $init{ls} || exists $init{tar};
+    print "}\n\n";
+}
+
+if (exists $init{group} || exists $init{ls} || exists $init{tar}) {
+    print "my (%gid, %group);\n";
+    print "while (my (\$name, \$pw, \$gid) = getgrent) {\n";
+    print '    $gid{$name} = $gid{$gid} = $gid;', "\n"
+        if exists $init{group};
+    print '    $group{$gid} = $name unless exists $group{$gid};', "\n"
+        if exists $init{ls} || exists $init{tar};
+    print "}\n\n";
+}
+
+print $initnewer, "\n" if $initnewer ne '';
+print $initfile, "\n" if $initfile ne '';
+$flushall .= "exit;\n";
+if (exists $init{declarestat}) {
+    $out = <<'END' . $out;
+    my ($dev,$ino,$mode,$nlink,$uid,$gid);
+
+END
+}
+
+if ( $follow_in_effect ) {
+$out =~ s/lstat\(\$_\)/lstat(_)/;
+print <<"END";
+$decl
+# Traverse desired filesystems
+File::Find::$find( {wanted => \\&wanted, follow => 1}, $roots);
+$flushall
+
+sub wanted {
+$out;
+}
+
+END
+} else {
+print <<"END";
+$decl
+# Traverse desired filesystems
+File::Find::$find({wanted => \\&wanted}, $roots);
+$flushall
+
+sub wanted {
+$out;
+}
+
+END
+}
+
+if (exists $init{doexec}) {
+    print <<'END';
+
+sub doexec ($@) {
+    my $ok = shift;
+    my @command = @_; # copy so we don't try to s/// aliases to constants
+    for my $word (@command)
+        { $word =~ s#{}#$name#g }
+    if ($ok) {
+        my $old = select(STDOUT);
+        $| = 1;
+        print "@command";
+        select($old);
+        return 0 unless <STDIN> =~ /^y/;
+    }
+    chdir $cwd; #sigh
+    system @command;
+    chdir $File::Find::dir;
+    return !$?;
+}
+
+END
+}
+
+if (exists $init{ls}) {
+    print <<'INTRO', <<"SUB", <<'END';
+
+sub sizemm {
+    my $rdev = shift;
+    sprintf("%3d, %3d", ($rdev >> 8) & 0xff, $rdev & 0xff);
+}
+
+sub ls () {
+    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+INTRO
+        \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat(_);
+SUB
+    my $pname = $name;
+
+    $blocks
+        or $blocks = int(($size + 1023) / 1024);
+
+    my $perms = $rwx[$mode & 7];
+    $mode >>= 3;
+    $perms = $rwx[$mode & 7] . $perms;
+    $mode >>= 3;
+    $perms = $rwx[$mode & 7] . $perms;
+    substr($perms, 2, 1) =~ tr/-x/Ss/ if -u _;
+    substr($perms, 5, 1) =~ tr/-x/Ss/ if -g _;
+    substr($perms, 8, 1) =~ tr/-x/Tt/ if -k _;
+    if    (-f _) { $perms = '-' . $perms; }
+    elsif (-d _) { $perms = 'd' . $perms; }
+    elsif (-l _) { $perms = 'l' . $perms; $pname .= ' -> ' . readlink($_); }
+    elsif (-c _) { $perms = 'c' . $perms; $size = sizemm($rdev); }
+    elsif (-b _) { $perms = 'b' . $perms; $size = sizemm($rdev); }
+    elsif (-p _) { $perms = 'p' . $perms; }
+    elsif (-S _) { $perms = 's' . $perms; }
+    else         { $perms = '?' . $perms; }
+
+    my $user = $user{$uid} || $uid;
+    my $group = $group{$gid} || $gid;
+
+    my ($sec,$min,$hour,$mday,$mon,$timeyear) = localtime($mtime);
+    if (-M _ > 365.25 / 2) {
+        $timeyear += 1900;
+    } else {
+        $timeyear = sprintf("%02d:%02d", $hour, $min);
+    }
+
+    printf "%5lu %4ld %-10s %3d %-8s %-8s %8s %s %2d %5s %s\n",
+            $ino,
+                 $blocks,
+                      $perms,
+                            $nlink,
+                                $user,
+                                     $group,
+                                          $size,
+                                              $moname[$mon],
+                                                 $mday,
+                                                     $timeyear,
+                                                         $pname;
+    1;
+}
+
+END
+}
+
+
+if (exists $init{cpio} || exists $init{tar}) {
+print <<'END';
+
+my %blocks = ();
+
+sub flush {
+    my ($fh, $varref, $blksz) = @_;
+
+    while (length($$varref) >= $blksz) {
+        no strict qw/refs/;
+        syswrite($fh, $$varref, $blksz);
+        substr($$varref, 0, $blksz) = '';
+        ++$blocks{$fh};
+    }
+}
+
+END
+}
+
+
+if (exists $init{cpio}) {
+    print <<'INTRO', <<"SUB", <<'END';
+
+my %cpout = ();
+my %nc = ();
+
+sub cpio {
+    my ($fh, $fname, $nc) = @_;
+    my $text = '';
+    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+        $atime,$mtime,$ctime,$blksize,$blocks);
+    local (*IN);
+
+    if ( ! defined $fname ) {
+        $fname = 'TRAILER!!!';
+        ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+          $atime,$mtime,$ctime,$blksize,$blocks) = (0) x 13;
+    } else {
+        ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+INTRO
+          \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat(_);
+SUB
+        if (-f _) {
+            open(IN, "./$_\0") || do {
+                warn "Couldn't open $fname: $!\n";
+                return;
+            }
+        } else {
+            $text = readlink($_);
+            $size = 0 unless defined $text;
+        }
+    }
+
+    $fname =~ s#^\./##;
+    $nc{$fh} = $nc;
+    if ($nc eq 'n') {
+        $cpout{$fh} .=
+          sprintf("%06o%06o%06o%06o%06o%06o%06o%06o%011lo%06o%011lo%s\0",
+            070707,
+            $dev & 0777777,
+            $ino & 0777777,
+            $mode & 0777777,
+            $uid & 0777777,
+            $gid & 0777777,
+            $nlink & 0777777,
+            $rdev & 0177777,
+            $mtime,
+            length($fname)+1,
+            $size,
+            $fname);
+    } else {
+        $cpout{$fh} .= "\0" if length($cpout{$fh}) & 1;
+        $cpout{$fh} .= pack("SSSSSSSSLSLa*",
+            070707, $dev, $ino, $mode, $uid, $gid, $nlink, $rdev, $mtime,
+            length($fname)+1, $size,
+            $fname . (length($fname) & 1 ? "\0" : "\0\0"));
+    }
+
+    if ($text ne '') {
+        $cpout{$fh} .= $text;
+    } elsif ($size) {
+        my $l;
+        flush($fh, \$cpout{$fh}, 5120)
+            while ($l = length($cpout{$fh})) >= 5120;
+        while (sysread(IN, $cpout{$fh}, 5120 - $l, $l)) {
+            flush($fh, \$cpout{$fh}, 5120);
+            $l = length($cpout{$fh});
+        }
+        close IN;
+    }
+}
+
+sub cflushall () {
+    for my $fh (keys %cpout) {
+        cpio($fh, undef, $nc{$fh});
+        $cpout{$fh} .= "0" x (5120 - length($cpout{$fh}));
+        flush($fh, \$cpout{$fh}, 5120);
+        print $blocks{$fh} * 10, " blocks\n";
+    }
+}
+
+END
+}
+
+if (exists $init{tar}) {
+    print <<'INTRO', <<"SUB", <<'END';
+
+my %tarout = ();
+my %linkseen = ();
+
+sub tar {
+    my ($fh, $fname) = @_;
+    my $prefix = '';
+    my $typeflag = '0';
+    my $linkname;
+    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+INTRO
+        \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat(_);
+SUB
+    local (*IN);
+
+    if ($nlink > 1) {
+        if ($linkname = $linkseen{$fh, $dev, $ino}) {
+            if (length($linkname) > 100) {
+                warn "$0: omitting file with linkname ",
+                     "too long for tar output: $linkname\n";
+                return;
+            }
+            $typeflag = '1';
+            $size = 0;
+        } else {
+            $linkseen{$fh, $dev, $ino} = $fname;
+        }
+    }
+    if ($typeflag eq '0') {
+        if (-f _) {
+            open(IN, "./$_\0") || do {
+                warn "Couldn't open $fname: $!\n";
+                return;
+            }
+        } else {
+            $linkname = readlink($_);
+            if (defined $linkname) { $typeflag = '2' }
+            elsif (-c _) { $typeflag = '3' }
+            elsif (-b _) { $typeflag = '4' }
+            elsif (-d _) { $typeflag = '5' }
+            elsif (-p _) { $typeflag = '6' }
+        }
+    }
+
+    if (length($fname) > 100) {
+        ($prefix, $fname) = ($fname =~ m#\A(.*?)/(.{,100})\Z(?!\n)#);
+        if (!defined($fname) || length($prefix) > 155) {
+            warn "$0: omitting file with name too long for tar output: ",
+                 $fname, "\n";
+            return;
+        }
+    }
+
+    $size = 0 if $typeflag ne '0';
+    my $header = pack("a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155",
+                        $fname,
+                        sprintf("%7o ", $mode &    0777),
+                        sprintf("%7o ", $uid  & 0777777),
+                        sprintf("%7o ", $gid  & 0777777),
+                        sprintf("%11o ", $size),
+                        sprintf("%11o ", $mtime),
+                        ' 'x8,
+                        $typeflag,
+                        defined $linkname ? $linkname : '',
+                        "ustar\0",
+                        "00",
+                        $user{$uid},
+                        $group{$gid},
+                        ($rdev >> 8) & 0xff,
+                        $rdev & 0xff,
+                        $prefix,
+                     );
+    substr($header, 148, 8) = sprintf("%7o ", unpack("%16C*", $header));
+    my $l = length($header) % 512;
+    $tarout{$fh} .= $header;
+    $tarout{$fh} .= "\0" x (512 - $l) if $l;
+
+    if ($size) {
+        flush($fh, \$tarout{$fh}, 10240)
+            while ($l = length($tarout{$fh})) >= 10240;
+        while (sysread(IN, $tarout{$fh}, 10240 - $l, $l)) {
+            my $slop = length($tarout{$fh}) % 512;
+            $tarout{$fh} .= "\0" x (512 - $slop) if $slop;
+            flush($fh, \$tarout{$fh}, 10240);
+            $l = length($tarout{$fh});
+        }
+        close IN;
+    }
+}
+
+sub tflushall () {
+    my $len;
+    for my $fh (keys %tarout) {
+        $len = 10240 - length($tarout{$fh});
+        $len += 10240 if $len < 1024;
+        $tarout{$fh} .= "\0" x $len;
+        flush($fh, \$tarout{$fh}, 10240);
+    }
+}
+
+END
+}
+
+exit;
+
+############################################################################
+
+sub tab () {
+    my $tabstring;
+
+    $tabstring = "\t" x ($indent_depth/2) . ' ' x ($indent_depth%2 * 4);
+    if (!$statdone) {
+        if ($_ =~ /^(?:name|print|prune|exec|ok|\(|\))/) {
+            $init{delayedstat} = 1;
+        } else {
+            my $statcall = '(($dev,$ino,$mode,$nlink,$uid,$gid) = '
+                         . $stat . '($_))';
+            if (exists $init{saw_or}) {
+                $tabstring .= "(\$nlink || $statcall) &&\n" . $tabstring;
+            } else {
+                $tabstring .= "$statcall &&\n" . $tabstring;
+            }
+            $statdone = 1;
+            $init{declarestat} = 1;
+        }
+    }
+    $tabstring =~ s/^\s+/ / if $out =~ /!$/;
+    $tabstring;
+}
+
+sub fileglob_to_re ($) {
+    my $x = shift;
+    $x =~ s#([./^\$()+])#\\$1#g;
+    $x =~ s#([?*])#.$1#g;
+    "^$x\\z";
+}
+
+sub n ($$) {
+    my ($pre, $n) = @_;
+    $n =~ s/^-/< / || $n =~ s/^\+/> / || $n =~ s/^/== /;
+    $n =~ s/ 0*(\d)/ $1/;
+    "($pre $n)";
+}
+
+sub quote ($) {
+    my $string = shift;
+    $string =~ s/\\/\\\\/g;
+    $string =~ s/'/\\'/g;
+    "'$string'";
+}
+
+__END__
+
+=head1 NAME
+
+find2perl - translate find command lines to Perl code
+
+=head1 SYNOPSIS
+
+	find2perl [paths] [predicates] | perl
+
+=head1 DESCRIPTION
+
+find2perl is a little translator to convert find command lines to
+equivalent Perl code.  The resulting code is typically faster than
+running find itself.
+
+"paths" are a set of paths where find2perl will start its searches and
+"predicates" are taken from the following list.
+
+=over 4
+
+=item C<! PREDICATE>
+
+Negate the sense of the following predicate.  The C<!> must be passed as
+a distinct argument, so it may need to be surrounded by whitespace and/or
+quoted from interpretation by the shell using a backslash (just as with
+using C<find(1)>).
+
+=item C<( PREDICATES )>
+
+Group the given PREDICATES.  The parentheses must be passed as distinct
+arguments, so they may need to be surrounded by whitespace and/or
+quoted from interpretation by the shell using a backslash (just as with
+using C<find(1)>).
+
+=item C<PREDICATE1 PREDICATE2>
+
+True if _both_ PREDICATE1 and PREDICATE2 are true; PREDICATE2 is not
+evaluated if PREDICATE1 is false.
+
+=item C<PREDICATE1 -o PREDICATE2>
+
+True if either one of PREDICATE1 or PREDICATE2 is true; PREDICATE2 is
+not evaluated if PREDICATE1 is true.
+
+=item C<-follow>
+
+Follow (dereference) symlinks.  The checking of file attributes depends
+on the position of the C<-follow> option. If it precedes the file
+check option, an C<stat> is done which means the file check applies to the
+file the symbolic link is pointing to. If C<-follow> option follows the
+file check option, this now applies to the symbolic link itself, i.e.
+an C<lstat> is done.
+
+=item C<-depth>
+
+Change directory traversal algorithm from breadth-first to depth-first.
+
+=item C<-prune>
+
+Do not descend into the directory currently matched.
+
+=item C<-xdev>
+
+Do not traverse mount points (prunes search at mount-point directories).
+
+=item C<-name GLOB>
+
+File name matches specified GLOB wildcard pattern.  GLOB may need to be
+quoted to avoid interpretation by the shell (just as with using
+C<find(1)>).
+
+=item C<-iname GLOB>
+
+Like C<-name>, but the match is case insensitive.
+
+=item C<-path GLOB>
+
+Path name matches specified GLOB wildcard pattern.
+
+=item C<-ipath GLOB>
+
+Like C<-path>, but the match is case insensitive.
+
+=item C<-perm PERM>
+
+Low-order 9 bits of permission match octal value PERM.
+
+=item C<-perm -PERM>
+
+The bits specified in PERM are all set in file's permissions.
+
+=item C<-type X>
+
+The file's type matches perl's C<-X> operator.
+
+=item C<-fstype TYPE>
+
+Filesystem of current path is of type TYPE (only NFS/non-NFS distinction
+is implemented).
+
+=item C<-user USER>
+
+True if USER is owner of file.
+
+=item C<-group GROUP>
+
+True if file's group is GROUP.
+
+=item C<-nouser>
+
+True if file's owner is not in password database.
+
+=item C<-nogroup>
+
+True if file's group is not in group database.
+
+=item C<-inum INUM>
+
+True file's inode number is INUM.
+
+=item C<-links N>
+
+True if (hard) link count of file matches N (see below).
+
+=item C<-size N>
+
+True if file's size matches N (see below) N is normally counted in
+512-byte blocks, but a suffix of "c" specifies that size should be
+counted in characters (bytes) and a suffix of "k" specifes that
+size should be counted in 1024-byte blocks.
+
+=item C<-atime N>
+
+True if last-access time of file matches N (measured in days) (see
+below).
+
+=item C<-ctime N>
+
+True if last-changed time of file's inode matches N (measured in days,
+see below).
+
+=item C<-mtime N>
+
+True if last-modified time of file matches N (measured in days, see below).
+
+=item C<-newer FILE>
+
+True if last-modified time of file matches N.
+
+=item C<-print>
+
+Print out path of file (always true). If none of C<-exec>, C<-ls>,
+C<-print0>, or C<-ok> is specified, then C<-print> will be added
+implicitly.
+
+=item C<-print0>
+
+Like -print, but terminates with \0 instead of \n.
+
+=item C<-exec OPTIONS ;>
+
+exec() the arguments in OPTIONS in a subprocess; any occurrence of {} in
+OPTIONS will first be substituted with the path of the current
+file.  Note that the command "rm" has been special-cased to use perl's
+unlink() function instead (as an optimization).  The C<;> must be passed as
+a distinct argument, so it may need to be surrounded by whitespace and/or
+quoted from interpretation by the shell using a backslash (just as with
+using C<find(1)>).
+
+=item C<-ok OPTIONS ;>
+
+Like -exec, but first prompts user; if user's response does not begin
+with a y, skip the exec.  The C<;> must be passed as
+a distinct argument, so it may need to be surrounded by whitespace and/or
+quoted from interpretation by the shell using a backslash (just as with
+using C<find(1)>).
+
+=item C<-eval EXPR>
+
+Has the perl script eval() the EXPR.  
+
+=item C<-ls>
+
+Simulates C<-exec ls -dils {} ;>
+
+=item C<-tar FILE>
+
+Adds current output to tar-format FILE.
+
+=item C<-cpio FILE>
+
+Adds current output to old-style cpio-format FILE.
+
+=item C<-ncpio FILE>
+
+Adds current output to "new"-style cpio-format FILE.
+
+=back
+
+Predicates which take a numeric argument N can come in three forms:
+
+   * N is prefixed with a +: match values greater than N
+   * N is prefixed with a -: match values less than N
+   * N is not prefixed with either + or -: match only values equal to N
+
+=head1 SEE ALSO
+
+find
+
+=cut
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/h2ph.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/h2ph.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/h2ph.bat	(revision 14489)
@@ -0,0 +1,941 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+
+use strict;
+
+use Config;
+use File::Path qw(mkpath);
+use Getopt::Std;
+
+# Make sure read permissions for all are set:
+if (defined umask && (umask() & 0444)) {
+    umask (umask() & ~0444);
+}
+
+getopts('Dd:rlhaQe');
+use vars qw($opt_D $opt_d $opt_r $opt_l $opt_h $opt_a $opt_Q $opt_e);
+die "-r and -a options are mutually exclusive\n" if ($opt_r and $opt_a);
+my @inc_dirs = inc_dirs() if $opt_a;
+
+my $Exit = 0;
+
+my $Dest_dir = $opt_d || $Config{installsitearch};
+die "Destination directory $Dest_dir doesn't exist or isn't a directory\n"
+    unless -d $Dest_dir;
+
+my @isatype = qw(
+	char	uchar	u_char
+	short	ushort	u_short
+	int	uint	u_int
+	long	ulong	u_long
+	FILE	key_t	caddr_t
+	float	double	size_t
+);
+
+my %isatype;
+@isatype{@isatype} = (1) x @isatype;
+my $inif = 0;
+my %Is_converted;
+my %bad_file = ();
+
+@ARGV = ('-') unless @ARGV;
+
+build_preamble_if_necessary();
+
+sub reindent($) {
+    my($text) = shift;
+    $text =~ s/\n/\n    /g;
+    $text =~ s/        /\t/g;
+    $text;
+}
+
+my ($t, $tab, %curargs, $new, $eval_index, $dir, $name, $args, $outfile);
+my ($incl, $incl_type, $next);
+while (defined (my $file = next_file())) {
+    if (-l $file and -d $file) {
+        link_if_possible($file) if ($opt_l);
+        next;
+    }
+
+    # Recover from header files with unbalanced cpp directives
+    $t = '';
+    $tab = 0;
+
+    # $eval_index goes into ``#line'' directives, to help locate syntax errors:
+    $eval_index = 1;
+
+    if ($file eq '-') {
+	open(IN, "-");
+	open(OUT, ">-");
+    } else {
+	($outfile = $file) =~ s/\.h$/.ph/ || next;
+	print "$file -> $outfile\n" unless $opt_Q;
+	if ($file =~ m|^(.*)/|) {
+	    $dir = $1;
+	    mkpath "$Dest_dir/$dir";
+	}
+
+	if ($opt_a) { # automagic mode:  locate header file in @inc_dirs
+	    foreach (@inc_dirs) {
+		chdir $_;
+		last if -f $file;
+	    }
+	}
+
+	open(IN,"$file") || (($Exit = 1),(warn "Can't open $file: $!\n"),next);
+	open(OUT,">$Dest_dir/$outfile") || die "Can't create $outfile: $!\n";
+    }
+
+    print OUT
+        "require '_h2ph_pre.ph';\n\n",
+        "no warnings 'redefine';\n\n";
+
+    while (defined (local $_ = next_line($file))) {
+	if (s/^\s*\#\s*//) {
+	    if (s/^define\s+(\w+)//) {
+		$name = $1;
+		$new = '';
+		s/\s+$//;
+		s/\(\w+\s*\(\*\)\s*\(\w*\)\)\s*(-?\d+)/$1/; # (int (*)(foo_t))0
+		if (s/^\(([\w,\s]*)\)//) {
+		    $args = $1;
+		    my $proto = '() ';
+		    if ($args ne '') {
+			$proto = '';
+			foreach my $arg (split(/,\s*/,$args)) {
+			    $arg =~ s/^\s*([^\s].*[^\s])\s*$/$1/;
+			    $curargs{$arg} = 1;
+			}
+			$args =~ s/\b(\w)/\$$1/g;
+			$args = "my($args) = \@_;\n$t    ";
+		    }
+		    s/^\s+//;
+		    expr();
+		    $new =~ s/(["\\])/\\$1/g;       #"]);
+		  EMIT:
+		    $new = reindent($new);
+		    $args = reindent($args);
+		    if ($t ne '') {
+			$new =~ s/(['\\])/\\$1/g;   #']);
+			if ($opt_h) {
+			    print OUT $t,
+                            "eval \"\\n#line $eval_index $outfile\\n\" . 'sub $name $proto\{\n$t    ${args}eval q($new);\n$t}' unless defined(\&$name);\n";
+                            $eval_index++;
+			} else {
+			    print OUT $t,
+                            "eval 'sub $name $proto\{\n$t    ${args}eval q($new);\n$t}' unless defined(\&$name);\n";
+			}
+		    } else {
+                      print OUT "unless(defined(\&$name)) {\n    sub $name $proto\{\n\t${args}eval q($new);\n    }\n}\n";
+		    }
+		    %curargs = ();
+		} else {
+		    s/^\s+//;
+		    expr();
+		    $new = 1 if $new eq '';
+		    $new = reindent($new);
+		    $args = reindent($args);
+		    if ($t ne '') {
+			$new =~ s/(['\\])/\\$1/g;        #']);
+
+			if ($opt_h) {
+			    print OUT $t,"eval \"\\n#line $eval_index $outfile\\n\" . 'sub $name () {",$new,";}' unless defined(\&$name);\n";
+			    $eval_index++;
+			} else {
+			    print OUT $t,"eval 'sub $name () {",$new,";}' unless defined(\&$name);\n";
+			}
+		    } else {
+		    	# Shunt around such directives as `#define FOO FOO':
+		    	next if " \&$name" eq $new;
+
+                      print OUT $t,"unless(defined(\&$name)) {\n    sub $name () {\t",$new,";}\n}\n";
+		    }
+		}
+	    } elsif (/^(include|import|include_next)\s*[<\"](.*)[>\"]/) {
+                $incl_type = $1;
+                $incl = $2;
+                if (($incl_type eq 'include_next') ||
+                    ($opt_e && exists($bad_file{$incl}))) {
+                    $incl =~ s/\.h$/.ph/;
+		print OUT ($t,
+			   "eval {\n");
+                $tab += 4;
+                $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
+                    print OUT ($t, "my(\@REM);\n");
+                    if ($incl_type eq 'include_next') {
+		print OUT ($t,
+			   "my(\%INCD) = map { \$INC{\$_} => 1 } ",
+			           "(grep { \$_ eq \"$incl\" } ",
+                                   "keys(\%INC));\n");
+		print OUT ($t,
+			           "\@REM = map { \"\$_/$incl\" } ",
+			   "(grep { not exists(\$INCD{\"\$_/$incl\"})",
+			           " and -f \"\$_/$incl\" } \@INC);\n");
+                    } else {
+                        print OUT ($t,
+                                   "\@REM = map { \"\$_/$incl\" } ",
+                                   "(grep {-r \"\$_/$incl\" } \@INC);\n");
+                    }
+		print OUT ($t,
+			   "require \"\$REM[0]\" if \@REM;\n");
+                $tab -= 4;
+                $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
+                print OUT ($t,
+			   "};\n");
+		print OUT ($t,
+			   "warn(\$\@) if \$\@;\n");
+                } else {
+                    $incl =~ s/\.h$/.ph/;
+		    print OUT $t,"require '$incl';\n";
+                }
+	    } elsif (/^ifdef\s+(\w+)/) {
+		print OUT $t,"if(defined(&$1)) {\n";
+		$tab += 4;
+		$t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
+	    } elsif (/^ifndef\s+(\w+)/) {
+		print OUT $t,"unless(defined(&$1)) {\n";
+		$tab += 4;
+		$t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
+	    } elsif (s/^if\s+//) {
+		$new = '';
+		$inif = 1;
+		expr();
+		$inif = 0;
+		print OUT $t,"if($new) {\n";
+		$tab += 4;
+		$t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
+	    } elsif (s/^elif\s+//) {
+		$new = '';
+		$inif = 1;
+		expr();
+		$inif = 0;
+		$tab -= 4;
+		$t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
+		print OUT $t,"}\n elsif($new) {\n";
+		$tab += 4;
+		$t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
+	    } elsif (/^else/) {
+		$tab -= 4;
+		$t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
+		print OUT $t,"} else {\n";
+		$tab += 4;
+		$t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
+	    } elsif (/^endif/) {
+		$tab -= 4;
+		$t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
+		print OUT $t,"}\n";
+	    } elsif(/^undef\s+(\w+)/) {
+		print OUT $t, "undef(&$1) if defined(&$1);\n";
+	    } elsif(/^error\s+(".*")/) {
+		print OUT $t, "die($1);\n";
+	    } elsif(/^error\s+(.*)/) {
+		print OUT $t, "die(\"", quotemeta($1), "\");\n";
+	    } elsif(/^warning\s+(.*)/) {
+		print OUT $t, "warn(\"", quotemeta($1), "\");\n";
+	    } elsif(/^ident\s+(.*)/) {
+		print OUT $t, "# $1\n";
+	    }
+	} elsif (/^\s*(typedef\s*)?enum\s*(\s+[a-zA-Z_]\w*\s*)?/) { # { for vi
+	    until(/\{[^}]*\}.*;/ || /;/) {
+		last unless defined ($next = next_line($file));
+		chomp $next;
+		# drop "#define FOO FOO" in enums
+		$next =~ s/^\s*#\s*define\s+(\w+)\s+\1\s*$//;
+		# #defines in enums (aliases)
+		$next =~ s/^\s*#\s*define\s+(\w+)\s+(\w+)\s*$/$1 = $2,/;
+		$_ .= $next;
+		print OUT "# $next\n" if $opt_D;
+	    }
+	    s/#\s*if.*?#\s*endif//g; # drop #ifdefs
+	    s@/\*.*?\*/@@g;
+	    s/\s+/ /g;
+	    next unless /^\s?(typedef\s?)?enum\s?([a-zA-Z_]\w*)?\s?\{(.*)\}\s?([a-zA-Z_]\w*)?\s?;/;
+	    (my $enum_subs = $3) =~ s/\s//g;
+	    my @enum_subs = split(/,/, $enum_subs);
+	    my $enum_val = -1;
+	    foreach my $enum (@enum_subs) {
+		my ($enum_name, $enum_value) = $enum =~ /^([a-zA-Z_]\w*)(=.+)?$/;
+		$enum_name or next;
+		$enum_value =~ s/^=//;
+		$enum_val = (length($enum_value) ? $enum_value : $enum_val + 1);
+		if ($opt_h) {
+		    print OUT ($t,
+			       "eval(\"\\n#line $eval_index $outfile\\n",
+			       "sub $enum_name () \{ $enum_val; \}\") ",
+			       "unless defined(\&$enum_name);\n");
+		    ++ $eval_index;
+		} else {
+		    print OUT ($t,
+			       "eval(\"sub $enum_name () \{ $enum_val; \}\") ",
+			       "unless defined(\&$enum_name);\n");
+		}
+	    }
+	} elsif (/^(?:__extension__\s+)?(?:extern|static)\s+(?:__)?inline(?:__)?\s+/
+	    and !/;\s*$/ and !/{\s*}\s*$/)
+	{ # { for vi
+	    # This is a hack to parse the inline functions in the glibc headers.
+	    # Warning: massive kludge ahead. We suppose inline functions
+	    # are mainly constructed like macros.
+	    while (1) {
+		last unless defined ($next = next_line($file));
+		chomp $next;
+		undef $_, last if $next =~ /__THROW\s*;/
+			       or $next =~ /^(__extension__|extern|static)\b/;
+		$_ .= " $next";
+		print OUT "# $next\n" if $opt_D;
+		last if $next =~ /^}|^{.*}\s*$/;
+	    }
+	    next if not defined; # because it's only a prototype
+	    s/\b(__extension__|extern|static|(?:__)?inline(?:__)?)\b//g;
+	    # violently drop #ifdefs
+	    s/#\s*if.*?#\s*endif//g
+		and print OUT "# some #ifdef were dropped here -- fill in the blanks\n";
+	    if (s/^(?:\w|\s|\*)*\s(\w+)\s*//) {
+		$name = $1;
+	    } else {
+		warn "name not found"; next; # shouldn't occur...
+	    }
+	    my @args;
+	    if (s/^\(([^()]*)\)\s*(\w+\s*)*//) {
+		for my $arg (split /,/, $1) {
+		    if ($arg =~ /(\w+)\s*$/) {
+			$curargs{$1} = 1;
+			push @args, $1;
+		    }
+		}
+	    }
+	    $args = (
+		@args
+		? "my(" . (join ',', map "\$$_", @args) . ") = \@_;\n$t    "
+		: ""
+	    );
+	    my $proto = @args ? '' : '() ';
+	    $new = '';
+	    s/\breturn\b//g; # "return" doesn't occur in macros usually...
+	    expr();
+	    # try to find and perlify local C variables
+	    our @local_variables = (); # needs to be a our(): (?{...}) bug workaround
+	    {
+		use re "eval";
+		my $typelist = join '|', keys %isatype;
+		$new =~ s['
+		  (?:(?:__)?const(?:__)?\s+)?
+		  (?:(?:un)?signed\s+)?
+		  (?:long\s+)?
+		  (?:$typelist)\s+
+		  (\w+)
+		  (?{ push @local_variables, $1 })
+		  ']
+		 [my \$$1]gx;
+		$new =~ s['
+		  (?:(?:__)?const(?:__)?\s+)?
+		  (?:(?:un)?signed\s+)?
+		  (?:long\s+)?
+		  (?:$typelist)\s+
+		  ' \s+ &(\w+) \s* ;
+		  (?{ push @local_variables, $1 })
+		  ]
+		 [my \$$1;]gx;
+	     }
+	    $new =~ s/&$_\b/\$$_/g for @local_variables;
+	    $new =~ s/(["\\])/\\$1/g;       #"]);
+	    # now that's almost like a macro (we hope)
+	    goto EMIT;
+	}
+    }
+    $Is_converted{$file} = 1;
+    if ($opt_e && exists($bad_file{$file})) {
+        unlink($Dest_dir . '/' . $outfile);
+        $next = '';
+    } else {
+        print OUT "1;\n";
+	queue_includes_from($file) if $opt_a;
+    }
+}
+
+if ($opt_e && (scalar(keys %bad_file) > 0)) {
+    warn "Was unable to convert the following files:\n";
+    warn "\t" . join("\n\t",sort(keys %bad_file)) . "\n";
+}
+
+exit $Exit;
+
+sub expr {
+    $new = '"(assembly code)"' and return if /\b__asm__\b/; # freak out.
+    my $joined_args;
+    if(keys(%curargs)) {
+	$joined_args = join('|', keys(%curargs));
+    }
+    while ($_ ne '') {
+	s/^\&\&// && do { $new .= " &&"; next;}; # handle && operator
+	s/^\&([\(a-z\)]+)/$1/i;	# hack for things that take the address of
+	s/^(\s+)//		&& do {$new .= ' '; next;};
+	s/^0X([0-9A-F]+)[UL]*//i
+	    && do {my $hex = $1;
+		   $hex =~ s/^0+//;
+		   if (length $hex > 8 && !$Config{use64bitint}) {
+		       # Croak if nv_preserves_uv_bits < 64 ?
+		       $new .=         hex(substr($hex, -8)) +
+			       2**32 * hex(substr($hex,  0, -8));
+		       # The above will produce "errorneus" code
+		       # if the hex constant was e.g. inside UINT64_C
+		       # macro, but then again, h2ph is an approximation.
+		   } else {
+		       $new .= lc("0x$hex");
+		   }
+		   next;};
+	s/^(-?\d+\.\d+E[-+]?\d+)[FL]?//i	&& do {$new .= $1; next;};
+	s/^(\d+)\s*[LU]*//i	&& do {$new .= $1; next;};
+	s/^("(\\"|[^"])*")//	&& do {$new .= $1; next;};
+	s/^'((\\"|[^"])*)'//	&& do {
+	    if ($curargs{$1}) {
+		$new .= "ord('\$$1')";
+	    } else {
+		$new .= "ord('$1')";
+	    }
+	    next;
+	};
+        # replace "sizeof(foo)" with "{foo}"
+        # also, remove * (C dereference operator) to avoid perl syntax
+        # problems.  Where the %sizeof array comes from is anyone's
+        # guess (c2ph?), but this at least avoids fatal syntax errors.
+        # Behavior is undefined if sizeof() delimiters are unbalanced.
+        # This code was modified to able to handle constructs like this:
+        #   sizeof(*(p)), which appear in the HP-UX 10.01 header files.
+        s/^sizeof\s*\(// && do {
+            $new .= '$sizeof';
+            my $lvl = 1;  # already saw one open paren
+            # tack { on the front, and skip it in the loop
+            $_ = "{" . "$_";
+            my $index = 1;
+            # find balanced closing paren
+            while ($index <= length($_) && $lvl > 0) {
+                $lvl++ if substr($_, $index, 1) eq "(";
+                $lvl-- if substr($_, $index, 1) eq ")";
+                $index++;
+            }
+            # tack } on the end, replacing )
+            substr($_, $index - 1, 1) = "}";
+            # remove pesky * operators within the sizeof argument
+            substr($_, 0, $index - 1) =~ s/\*//g;
+            next;
+        };
+	# Eliminate typedefs
+	/\(([\w\s]+)[\*\s]*\)\s*[\w\(]/ && do {
+	    my $doit = 1;
+	    foreach (split /\s+/, $1) {  # Make sure all the words are types,
+	        unless($isatype{$_} or $_ eq 'struct' or $_ eq 'union'){
+		    $doit = 0;
+		    last;
+		}
+	    }
+	    if( $doit ){
+		s/\([\w\s]+[\*\s]*\)// && next;      # then eliminate them.
+	    }
+	};
+	# struct/union member, including arrays:
+	s/^([_A-Z]\w*(\[[^\]]+\])?((\.|->)[_A-Z]\w*(\[[^\]]+\])?)+)//i && do {
+	    my $id = $1;
+	    $id =~ s/(\.|(->))([^\.\-]*)/->\{$3\}/g;
+	    $id =~ s/\b([^\$])($joined_args)/$1\$$2/g if length($joined_args);
+	    while($id =~ /\[\s*([^\$\&\d\]]+)\]/) {
+		my($index) = $1;
+		$index =~ s/\s//g;
+		if(exists($curargs{$index})) {
+		    $index = "\$$index";
+		} else {
+		    $index = "&$index";
+		}
+		$id =~ s/\[\s*([^\$\&\d\]]+)\]/[$index]/;
+	    }
+	    $new .= " (\$$id)";
+	};
+	s/^([_a-zA-Z]\w*)//	&& do {
+	    my $id = $1;
+	    if ($id eq 'struct' || $id eq 'union') {
+		s/^\s+(\w+)//;
+		$id .= ' ' . $1;
+		$isatype{$id} = 1;
+	    } elsif ($id =~ /^((un)?signed)|(long)|(short)$/) {
+		while (s/^\s+(\w+)//) { $id .= ' ' . $1; }
+		$isatype{$id} = 1;
+	    }
+	    if ($curargs{$id}) {
+		$new .= "\$$id";
+		$new .= '->' if /^[\[\{]/;
+	    } elsif ($id eq 'defined') {
+		$new .= 'defined';
+	    } elsif (/^\s*\(/) {
+		s/^\s*\((\w),/("$1",/ if $id =~ /^_IO[WR]*$/i;	# cheat
+		$new .= " &$id";
+	    } elsif ($isatype{$id}) {
+		if ($new =~ /{\s*$/) {
+		    $new .= "'$id'";
+		} elsif ($new =~ /\(\s*$/ && /^[\s*]*\)/) {
+		    $new =~ s/\(\s*$//;
+		    s/^[\s*]*\)//;
+		} else {
+		    $new .= q(').$id.q(');
+		}
+	    } else {
+		if ($inif && $new !~ /defined\s*\($/) {
+		    $new .= '(defined(&' . $id . ') ? &' . $id . ' : 0)';
+		} elsif (/^\[/) {
+		    $new .= " \$$id";
+		} else {
+		    $new .= ' &' . $id;
+		}
+	    }
+	    next;
+	};
+	s/^(.)// && do { if ($1 ne '#') { $new .= $1; } next;};
+    }
+}
+
+
+sub next_line
+{
+    my $file = shift;
+    my ($in, $out);
+    my $pre_sub_tri_graphs = 1;
+
+    READ: while (not eof IN) {
+        $in  .= <IN>;
+        chomp $in;
+        next unless length $in;
+
+        while (length $in) {
+            if ($pre_sub_tri_graphs) {
+                # Preprocess all tri-graphs
+                # including things stuck in quoted string constants.
+                $in =~ s/\?\?=/#/g;                         # | ??=|  #|
+                $in =~ s/\?\?\!/|/g;                        # | ??!|  ||
+                $in =~ s/\?\?'/^/g;                         # | ??'|  ^|
+                $in =~ s/\?\?\(/[/g;                        # | ??(|  [|
+                $in =~ s/\?\?\)/]/g;                        # | ??)|  ]|
+                $in =~ s/\?\?\-/~/g;                        # | ??-|  ~|
+                $in =~ s/\?\?\//\\/g;                       # | ??/|  \|
+                $in =~ s/\?\?</{/g;                         # | ??<|  {|
+                $in =~ s/\?\?>/}/g;                         # | ??>|  }|
+            }
+	    if ($in =~ /^\#ifdef __LANGUAGE_PASCAL__/) {
+		# Tru64 disassembler.h evilness: mixed C and Pascal.
+		while (<IN>) {
+		    last if /^\#endif/;
+		}
+		$in = "";
+		next READ;
+	    }
+	    if ($in =~ /^extern inline / && # Inlined assembler.
+		$^O eq 'linux' && $file =~ m!(?:^|/)asm/[^/]+\.h$!) {
+		while (<IN>) {
+		    last if /^}/;
+		}
+		$in = "";
+		next READ;
+	    }
+            if ($in =~ s/\\$//) {                           # \-newline
+                $out    .= ' ';
+                next READ;
+            } elsif ($in =~ s/^([^"'\\\/]+)//) {            # Passthrough
+                $out    .= $1;
+            } elsif ($in =~ s/^(\\.)//) {                   # \...
+                $out    .= $1;
+            } elsif ($in =~ /^'/) {                         # '...
+                if ($in =~ s/^('(\\.|[^'\\])*')//) {
+                    $out    .= $1;
+                } else {
+                    next READ;
+                }
+            } elsif ($in =~ /^"/) {                         # "...
+                if ($in =~ s/^("(\\.|[^"\\])*")//) {
+                    $out    .= $1;
+                } else {
+                    next READ;
+                }
+            } elsif ($in =~ s/^\/\/.*//) {                  # //...
+                # fall through
+            } elsif ($in =~ m/^\/\*/) {                     # /*...
+                # C comment removal adapted from perlfaq6:
+                if ($in =~ s/^\/\*[^*]*\*+([^\/*][^*]*\*+)*\///) {
+                    $out    .= ' ';
+                } else {                                    # Incomplete /* */
+                    next READ;
+                }
+            } elsif ($in =~ s/^(\/)//) {                    # /...
+                $out    .= $1;
+            } elsif ($in =~ s/^([^\'\"\\\/]+)//) {
+                $out    .= $1;
+            } elsif ($^O eq 'linux' &&
+                     $file =~ m!(?:^|/)linux/byteorder/pdp_endian\.h$! &&
+                     $in   =~ s!\'T KNOW!!) {
+                $out    =~ s!I DON$!I_DO_NOT_KNOW!;
+            } else {
+                if ($opt_e) {
+                    warn "Cannot parse $file:\n$in\n";
+                    $bad_file{$file} = 1;
+                    $in = '';
+                    $out = undef;
+                    last READ;
+                } else {
+		die "Cannot parse:\n$in\n";
+                }
+            }
+        }
+
+        last READ if $out =~ /\S/;
+    }
+
+    return $out;
+}
+
+
+# Handle recursive subdirectories without getting a grotesquely big stack.
+# Could this be implemented using File::Find?
+sub next_file
+{
+    my $file;
+
+    while (@ARGV) {
+        $file = shift @ARGV;
+
+        if ($file eq '-' or -f $file or -l $file) {
+            return $file;
+        } elsif (-d $file) {
+            if ($opt_r) {
+                expand_glob($file);
+            } else {
+                print STDERR "Skipping directory `$file'\n";
+            }
+        } elsif ($opt_a) {
+            return $file;
+        } else {
+            print STDERR "Skipping `$file':  not a file or directory\n";
+        }
+    }
+
+    return undef;
+}
+
+
+# Put all the files in $directory into @ARGV for processing.
+sub expand_glob
+{
+    my ($directory)  = @_;
+
+    $directory =~ s:/$::;
+
+    opendir DIR, $directory;
+        foreach (readdir DIR) {
+            next if ($_ eq '.' or $_ eq '..');
+
+            # expand_glob() is going to be called until $ARGV[0] isn't a
+            # directory; so push directories, and unshift everything else.
+            if (-d "$directory/$_") { push    @ARGV, "$directory/$_" }
+            else                    { unshift @ARGV, "$directory/$_" }
+        }
+    closedir DIR;
+}
+
+
+# Given $file, a symbolic link to a directory in the C include directory,
+# make an equivalent symbolic link in $Dest_dir, if we can figure out how.
+# Otherwise, just duplicate the file or directory.
+sub link_if_possible
+{
+    my ($dirlink)  = @_;
+    my $target  = eval 'readlink($dirlink)';
+
+    if ($target =~ m:^\.\./: or $target =~ m:^/:) {
+        # The target of a parent or absolute link could leave the $Dest_dir
+        # hierarchy, so let's put all of the contents of $dirlink (actually,
+        # the contents of $target) into @ARGV; as a side effect down the
+        # line, $dirlink will get created as an _actual_ directory.
+        expand_glob($dirlink);
+    } else {
+        if (-l "$Dest_dir/$dirlink") {
+            unlink "$Dest_dir/$dirlink" or
+                print STDERR "Could not remove link $Dest_dir/$dirlink:  $!\n";
+        }
+
+        if (eval 'symlink($target, "$Dest_dir/$dirlink")') {
+            print "Linking $target -> $Dest_dir/$dirlink\n";
+
+            # Make sure that the link _links_ to something:
+            if (! -e "$Dest_dir/$target") {
+                mkpath("$Dest_dir/$target", 0755) or
+                    print STDERR "Could not create $Dest_dir/$target/\n";
+            }
+        } else {
+            print STDERR "Could not symlink $target -> $Dest_dir/$dirlink:  $!\n";
+        }
+    }
+}
+
+
+# Push all #included files in $file onto our stack, except for STDIN
+# and files we've already processed.
+sub queue_includes_from
+{
+    my ($file)    = @_;
+    my $line;
+
+    return if ($file eq "-");
+
+    open HEADER, $file or return;
+        while (defined($line = <HEADER>)) {
+            while (/\\$/) { # Handle continuation lines
+                chop $line;
+                $line .= <HEADER>;
+            }
+
+            if ($line =~ /^#\s*include\s+<(.*?)>/) {
+                push(@ARGV, $1) unless $Is_converted{$1};
+            }
+        }
+    close HEADER;
+}
+
+
+# Determine include directories; $Config{usrinc} should be enough for (all
+# non-GCC?) C compilers, but gcc uses an additional include directory.
+sub inc_dirs
+{
+    my $from_gcc    = `LC_ALL=C $Config{cc} -v 2>&1`;
+    if( !( $from_gcc =~ s:^Reading specs from (.*?)/specs\b.*:$1/include:s ) )
+    { # gcc-4+ :
+       $from_gcc   = `LC_ALL=C $Config{cc} -print-search-dirs 2>&1`;
+       if ( !($from_gcc =~ s/^install:\s*([^\s]+[^\s\/])([\s\/]*).*$/$1\/include/s) )
+       {
+           $from_gcc = '';
+       };
+    };
+    length($from_gcc) ? ($from_gcc, $Config{usrinc}) : ($Config{usrinc});
+}
+
+
+# Create "_h2ph_pre.ph", if it doesn't exist or was built by a different
+# version of h2ph.
+sub build_preamble_if_necessary
+{
+    # Increment $VERSION every time this function is modified:
+    my $VERSION     = 2;
+    my $preamble    = "$Dest_dir/_h2ph_pre.ph";
+
+    # Can we skip building the preamble file?
+    if (-r $preamble) {
+        # Extract version number from first line of preamble:
+        open  PREAMBLE, $preamble or die "Cannot open $preamble:  $!";
+            my $line = <PREAMBLE>;
+            $line =~ /(\b\d+\b)/;
+        close PREAMBLE            or die "Cannot close $preamble:  $!";
+
+        # Don't build preamble if a compatible preamble exists:
+        return if $1 == $VERSION;
+    }
+
+    my (%define) = _extract_cc_defines();
+
+    open  PREAMBLE, ">$preamble" or die "Cannot open $preamble:  $!";
+        print PREAMBLE "# This file was created by h2ph version $VERSION\n";
+
+        foreach (sort keys %define) {
+            if ($opt_D) {
+                print PREAMBLE "# $_=$define{$_}\n";
+            }
+
+            if ($define{$_} =~ /^(\d+)U?L{0,2}$/i) {
+                print PREAMBLE
+                    "unless (defined &$_) { sub $_() { $1 } }\n\n";
+            } elsif ($define{$_} =~ /^\w+$/) {
+                print PREAMBLE
+                    "unless (defined &$_) { sub $_() { &$define{$_} } }\n\n";
+            } else {
+                print PREAMBLE
+                    "unless (defined &$_) { sub $_() { \"",
+                    quotemeta($define{$_}), "\" } }\n\n";
+            }
+        }
+    close PREAMBLE               or die "Cannot close $preamble:  $!";
+}
+
+
+# %Config contains information on macros that are pre-defined by the
+# system's compiler.  We need this information to make the .ph files
+# function with perl as the .h files do with cc.
+sub _extract_cc_defines
+{
+    my %define;
+    my $allsymbols  = join " ",
+        @Config{'ccsymbols', 'cppsymbols', 'cppccsymbols'};
+
+    # Split compiler pre-definitions into `key=value' pairs:
+    foreach (split /\s+/, $allsymbols) {
+        /(.+?)=(.+)/ and $define{$1} = $2;
+
+        if ($opt_D) {
+            print STDERR "$_:  $1 -> $2\n";
+        }
+    }
+
+    return %define;
+}
+
+
+1;
+
+##############################################################################
+__END__
+
+=head1 NAME
+
+h2ph - convert .h C header files to .ph Perl header files
+
+=head1 SYNOPSIS
+
+B<h2ph [-d destination directory] [-r | -a] [-l] [headerfiles]>
+
+=head1 DESCRIPTION
+
+I<h2ph>
+converts any C header files specified to the corresponding Perl header file
+format.
+It is most easily run while in /usr/include:
+
+	cd /usr/include; h2ph * sys/*
+
+or
+
+	cd /usr/include; h2ph * sys/* arpa/* netinet/*
+
+or
+
+	cd /usr/include; h2ph -r -l .
+
+The output files are placed in the hierarchy rooted at Perl's
+architecture dependent library directory.  You can specify a different
+hierarchy with a B<-d> switch.
+
+If run with no arguments, filters standard input to standard output.
+
+=head1 OPTIONS
+
+=over 4
+
+=item -d destination_dir
+
+Put the resulting B<.ph> files beneath B<destination_dir>, instead of
+beneath the default Perl library location (C<$Config{'installsitsearch'}>).
+
+=item -r
+
+Run recursively; if any of B<headerfiles> are directories, then run I<h2ph>
+on all files in those directories (and their subdirectories, etc.).  B<-r>
+and B<-a> are mutually exclusive.
+
+=item -a
+
+Run automagically; convert B<headerfiles>, as well as any B<.h> files
+which they include.  This option will search for B<.h> files in all
+directories which your C compiler ordinarily uses.  B<-a> and B<-r> are
+mutually exclusive.
+
+=item -l
+
+Symbolic links will be replicated in the destination directory.  If B<-l>
+is not specified, then links are skipped over.
+
+=item -h
+
+Put ``hints'' in the .ph files which will help in locating problems with
+I<h2ph>.  In those cases when you B<require> a B<.ph> file containing syntax
+errors, instead of the cryptic
+
+	[ some error condition ] at (eval mmm) line nnn
+
+you will see the slightly more helpful
+
+	[ some error condition ] at filename.ph line nnn
+
+However, the B<.ph> files almost double in size when built using B<-h>.
+
+=item -D
+
+Include the code from the B<.h> file as a comment in the B<.ph> file.
+This is primarily used for debugging I<h2ph>.
+
+=item -Q
+
+``Quiet'' mode; don't print out the names of the files being converted.
+
+=back
+
+=head1 ENVIRONMENT
+
+No environment variables are used.
+
+=head1 FILES
+
+ /usr/include/*.h
+ /usr/include/sys/*.h
+
+etc.
+
+=head1 AUTHOR
+
+Larry Wall
+
+=head1 SEE ALSO
+
+perl(1)
+
+=head1 DIAGNOSTICS
+
+The usual warnings if it can't read or write the files involved.
+
+=head1 BUGS
+
+Doesn't construct the %sizeof array for you.
+
+It doesn't handle all C constructs, but it does attempt to isolate
+definitions inside evals so that you can get at the definitions
+that it can translate.
+
+It's only intended as a rough tool.
+You may need to dicker with the files produced.
+
+You have to run this program by hand; it's not run as part of the Perl
+installation.
+
+Doesn't handle complicated expressions built piecemeal, a la:
+
+    enum {
+        FIRST_VALUE,
+        SECOND_VALUE,
+    #ifdef ABC
+        THIRD_VALUE
+    #endif
+    };
+
+Doesn't necessarily locate all of your C compiler's internally-defined
+symbols.
+
+=cut
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/h2xs.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/h2xs.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/h2xs.bat	(revision 14489)
@@ -0,0 +1,2190 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+
+use warnings;
+
+=head1 NAME
+
+h2xs - convert .h C header files to Perl extensions
+
+=head1 SYNOPSIS
+
+B<h2xs> [B<OPTIONS> ...] [headerfile ... [extra_libraries]]
+
+B<h2xs> B<-h>|B<-?>|B<--help>
+
+=head1 DESCRIPTION
+
+I<h2xs> builds a Perl extension from C header files.  The extension
+will include functions which can be used to retrieve the value of any
+#define statement which was in the C header files.
+
+The I<module_name> will be used for the name of the extension.  If
+module_name is not supplied then the name of the first header file
+will be used, with the first character capitalized.
+
+If the extension might need extra libraries, they should be included
+here.  The extension Makefile.PL will take care of checking whether
+the libraries actually exist and how they should be loaded.  The extra
+libraries should be specified in the form -lm -lposix, etc, just as on
+the cc command line.  By default, the Makefile.PL will search through
+the library path determined by Configure.  That path can be augmented
+by including arguments of the form B<-L/another/library/path> in the
+extra-libraries argument.
+
+=head1 OPTIONS
+
+=over 5
+
+=item B<-A>, B<--omit-autoload>
+
+Omit all autoload facilities.  This is the same as B<-c> but also
+removes the S<C<use AutoLoader>> statement from the .pm file.
+
+=item B<-B>, B<--beta-version>
+
+Use an alpha/beta style version number.  Causes version number to
+be "0.00_01" unless B<-v> is specified.
+
+=item B<-C>, B<--omit-changes>
+
+Omits creation of the F<Changes> file, and adds a HISTORY section to
+the POD template.
+
+=item B<-F>, B<--cpp-flags>=I<addflags>
+
+Additional flags to specify to C preprocessor when scanning header for
+function declarations.  Writes these options in the generated F<Makefile.PL>
+too.
+
+=item B<-M>, B<--func-mask>=I<regular expression>
+
+selects functions/macros to process.
+
+=item B<-O>, B<--overwrite-ok>
+
+Allows a pre-existing extension directory to be overwritten.
+
+=item B<-P>, B<--omit-pod>
+
+Omit the autogenerated stub POD section.
+
+=item B<-X>, B<--omit-XS>
+
+Omit the XS portion.  Used to generate templates for a module which is not
+XS-based.  C<-c> and C<-f> are implicitly enabled.
+
+=item B<-a>, B<--gen-accessors>
+
+Generate an accessor method for each element of structs and unions. The
+generated methods are named after the element name; will return the current
+value of the element if called without additional arguments; and will set
+the element to the supplied value (and return the new value) if called with
+an additional argument. Embedded structures and unions are returned as a
+pointer rather than the complete structure, to facilitate chained calls.
+
+These methods all apply to the Ptr type for the structure; additionally
+two methods are constructed for the structure type itself, C<_to_ptr>
+which returns a Ptr type pointing to the same structure, and a C<new>
+method to construct and return a new structure, initialised to zeroes.
+
+=item B<-b>, B<--compat-version>=I<version>
+
+Generates a .pm file which is backwards compatible with the specified
+perl version.
+
+For versions < 5.6.0, the changes are.
+    - no use of 'our' (uses 'use vars' instead)
+    - no 'use warnings'
+
+Specifying a compatibility version higher than the version of perl you
+are using to run h2xs will have no effect.  If unspecified h2xs will default
+to compatibility with the version of perl you are using to run h2xs.
+
+=item B<-c>, B<--omit-constant>
+
+Omit C<constant()> from the .xs file and corresponding specialised
+C<AUTOLOAD> from the .pm file.
+
+=item B<-d>, B<--debugging>
+
+Turn on debugging messages.
+
+=item B<-e>, B<--omit-enums>=[I<regular expression>]
+
+If I<regular expression> is not given, skip all constants that are defined in
+a C enumeration. Otherwise skip only those constants that are defined in an
+enum whose name matches I<regular expression>.
+
+Since I<regular expression> is optional, make sure that this switch is followed
+by at least one other switch if you omit I<regular expression> and have some
+pending arguments such as header-file names. This is ok:
+
+    h2xs -e -n Module::Foo foo.h
+
+This is not ok:
+
+    h2xs -n Module::Foo -e foo.h
+
+In the latter, foo.h is taken as I<regular expression>.
+
+=item B<-f>, B<--force>
+
+Allows an extension to be created for a header even if that header is
+not found in standard include directories.
+
+=item B<-g>, B<--global>
+
+Include code for safely storing static data in the .xs file.
+Extensions that do no make use of static data can ignore this option.
+
+=item B<-h>, B<-?>, B<--help>
+
+Print the usage, help and version for this h2xs and exit.
+
+=item B<-k>, B<--omit-const-func>
+
+For function arguments declared as C<const>, omit the const attribute in the
+generated XS code.
+
+=item B<-m>, B<--gen-tied-var>
+
+B<Experimental>: for each variable declared in the header file(s), declare
+a perl variable of the same name magically tied to the C variable.
+
+=item B<-n>, B<--name>=I<module_name>
+
+Specifies a name to be used for the extension, e.g., S<-n RPC::DCE>
+
+=item B<-o>, B<--opaque-re>=I<regular expression>
+
+Use "opaque" data type for the C types matched by the regular
+expression, even if these types are C<typedef>-equivalent to types
+from typemaps.  Should not be used without B<-x>.
+
+This may be useful since, say, types which are C<typedef>-equivalent
+to integers may represent OS-related handles, and one may want to work
+with these handles in OO-way, as in C<$handle-E<gt>do_something()>.
+Use C<-o .> if you want to handle all the C<typedef>ed types as opaque
+types.
+
+The type-to-match is whitewashed (except for commas, which have no
+whitespace before them, and multiple C<*> which have no whitespace
+between them).
+
+=item B<-p>, B<--remove-prefix>=I<prefix>
+
+Specify a prefix which should be removed from the Perl function names,
+e.g., S<-p sec_rgy_> This sets up the XS B<PREFIX> keyword and removes
+the prefix from functions that are autoloaded via the C<constant()>
+mechanism.
+
+=item B<-s>, B<--const-subs>=I<sub1,sub2>
+
+Create a perl subroutine for the specified macros rather than autoload
+with the constant() subroutine.  These macros are assumed to have a
+return type of B<char *>, e.g.,
+S<-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid>.
+
+=item B<-t>, B<--default-type>=I<type>
+
+Specify the internal type that the constant() mechanism uses for macros.
+The default is IV (signed integer).  Currently all macros found during the
+header scanning process will be assumed to have this type.  Future versions
+of C<h2xs> may gain the ability to make educated guesses.
+
+=item B<--use-new-tests>
+
+When B<--compat-version> (B<-b>) is present the generated tests will use
+C<Test::More> rather than C<Test> which is the default for versions before
+5.7.2 .   C<Test::More> will be added to PREREQ_PM in the generated
+C<Makefile.PL>.
+
+=item B<--use-old-tests>
+
+Will force the generation of test code that uses the older C<Test> module.
+
+=item B<--skip-exporter>
+
+Do not use C<Exporter> and/or export any symbol.
+
+=item B<--skip-ppport>
+
+Do not use C<Devel::PPPort>: no portability to older version.
+
+=item B<--skip-autoloader>
+
+Do not use the module C<AutoLoader>; but keep the constant() function
+and C<sub AUTOLOAD> for constants.
+
+=item B<--skip-strict>
+
+Do not use the pragma C<strict>.
+
+=item B<--skip-warnings>
+
+Do not use the pragma C<warnings>.
+
+=item B<-v>, B<--version>=I<version>
+
+Specify a version number for this extension.  This version number is added
+to the templates.  The default is 0.01, or 0.00_01 if C<-B> is specified.
+The version specified should be numeric.
+
+=item B<-x>, B<--autogen-xsubs>
+
+Automatically generate XSUBs basing on function declarations in the
+header file.  The package C<C::Scan> should be installed. If this
+option is specified, the name of the header file may look like
+C<NAME1,NAME2>. In this case NAME1 is used instead of the specified
+string, but XSUBs are emitted only for the declarations included from
+file NAME2.
+
+Note that some types of arguments/return-values for functions may
+result in XSUB-declarations/typemap-entries which need
+hand-editing. Such may be objects which cannot be converted from/to a
+pointer (like C<long long>), pointers to functions, or arrays.  See
+also the section on L<LIMITATIONS of B<-x>>.
+
+=back
+
+=head1 EXAMPLES
+
+
+    # Default behavior, extension is Rusers
+    h2xs rpcsvc/rusers
+
+    # Same, but extension is RUSERS
+    h2xs -n RUSERS rpcsvc/rusers
+
+    # Extension is rpcsvc::rusers. Still finds <rpcsvc/rusers.h>
+    h2xs rpcsvc::rusers
+
+    # Extension is ONC::RPC.  Still finds <rpcsvc/rusers.h>
+    h2xs -n ONC::RPC rpcsvc/rusers
+
+    # Without constant() or AUTOLOAD
+    h2xs -c rpcsvc/rusers
+
+    # Creates templates for an extension named RPC
+    h2xs -cfn RPC
+
+    # Extension is ONC::RPC.
+    h2xs -cfn ONC::RPC
+
+    # Extension is Lib::Foo which works at least with Perl5.005_03.
+    # Constants are created for all #defines and enums h2xs can find
+    # in foo.h.
+    h2xs -b 5.5.3 -n Lib::Foo foo.h
+
+    # Extension is Lib::Foo which works at least with Perl5.005_03.
+    # Constants are created for all #defines but only for enums
+    # whose names do not start with 'bar_'.
+    h2xs -b 5.5.3 -e '^bar_' -n Lib::Foo foo.h
+
+    # Makefile.PL will look for library -lrpc in
+    # additional directory /opt/net/lib
+    h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
+
+    # Extension is DCE::rgynbase
+    # prefix "sec_rgy_" is dropped from perl function names
+    h2xs -n DCE::rgynbase -p sec_rgy_ dce/rgynbase
+
+    # Extension is DCE::rgynbase
+    # prefix "sec_rgy_" is dropped from perl function names
+    # subroutines are created for sec_rgy_wildcard_name and
+    # sec_rgy_wildcard_sid
+    h2xs -n DCE::rgynbase -p sec_rgy_ \
+    -s sec_rgy_wildcard_name,sec_rgy_wildcard_sid dce/rgynbase
+
+    # Make XS without defines in perl.h, but with function declarations
+    # visible from perl.h. Name of the extension is perl1.
+    # When scanning perl.h, define -DEXT=extern -DdEXT= -DINIT(x)=
+    # Extra backslashes below because the string is passed to shell.
+    # Note that a directory with perl header files would
+    #  be added automatically to include path.
+    h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h
+
+    # Same with function declaration in proto.h as visible from perl.h.
+    h2xs -xAn perl2 perl.h,proto.h
+
+    # Same but select only functions which match /^av_/
+    h2xs -M '^av_' -xAn perl2 perl.h,proto.h
+
+    # Same but treat SV* etc as "opaque" types
+    h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h
+
+=head2 Extension based on F<.h> and F<.c> files
+
+Suppose that you have some C files implementing some functionality,
+and the corresponding header files.  How to create an extension which
+makes this functionality accessible in Perl?  The example below
+assumes that the header files are F<interface_simple.h> and
+I<interface_hairy.h>, and you want the perl module be named as
+C<Ext::Ension>.  If you need some preprocessor directives and/or
+linking with external libraries, see the flags C<-F>, C<-L> and C<-l>
+in L<"OPTIONS">.
+
+=over
+
+=item Find the directory name
+
+Start with a dummy run of h2xs:
+
+  h2xs -Afn Ext::Ension
+
+The only purpose of this step is to create the needed directories, and
+let you know the names of these directories.  From the output you can
+see that the directory for the extension is F<Ext/Ension>.
+
+=item Copy C files
+
+Copy your header files and C files to this directory F<Ext/Ension>.
+
+=item Create the extension
+
+Run h2xs, overwriting older autogenerated files:
+
+  h2xs -Oxan Ext::Ension interface_simple.h interface_hairy.h
+
+h2xs looks for header files I<after> changing to the extension
+directory, so it will find your header files OK.
+
+=item Archive and test
+
+As usual, run
+
+  cd Ext/Ension
+  perl Makefile.PL
+  make dist
+  make
+  make test
+
+=item Hints
+
+It is important to do C<make dist> as early as possible.  This way you
+can easily merge(1) your changes to autogenerated files if you decide
+to edit your C<.h> files and rerun h2xs.
+
+Do not forget to edit the documentation in the generated F<.pm> file.
+
+Consider the autogenerated files as skeletons only, you may invent
+better interfaces than what h2xs could guess.
+
+Consider this section as a guideline only, some other options of h2xs
+may better suit your needs.
+
+=back
+
+=head1 ENVIRONMENT
+
+No environment variables are used.
+
+=head1 AUTHOR
+
+Larry Wall and others
+
+=head1 SEE ALSO
+
+L<perl>, L<perlxstut>, L<ExtUtils::MakeMaker>, and L<AutoLoader>.
+
+=head1 DIAGNOSTICS
+
+The usual warnings if it cannot read or write the files involved.
+
+=head1 LIMITATIONS of B<-x>
+
+F<h2xs> would not distinguish whether an argument to a C function
+which is of the form, say, C<int *>, is an input, output, or
+input/output parameter.  In particular, argument declarations of the
+form
+
+    int
+    foo(n)
+	int *n
+
+should be better rewritten as
+
+    int
+    foo(n)
+	int &n
+
+if C<n> is an input parameter.
+
+Additionally, F<h2xs> has no facilities to intuit that a function
+
+   int
+   foo(addr,l)
+	char *addr
+	int   l
+
+takes a pair of address and length of data at this address, so it is better
+to rewrite this function as
+
+    int
+    foo(sv)
+	    SV *addr
+	PREINIT:
+	    STRLEN len;
+	    char *s;
+	CODE:
+	    s = SvPV(sv,len);
+	    RETVAL = foo(s, len);
+	OUTPUT:
+	    RETVAL
+
+or alternately
+
+    static int
+    my_foo(SV *sv)
+    {
+	STRLEN len;
+	char *s = SvPV(sv,len);
+
+	return foo(s, len);
+    }
+
+    MODULE = foo	PACKAGE = foo	PREFIX = my_
+
+    int
+    foo(sv)
+	SV *sv
+
+See L<perlxs> and L<perlxstut> for additional details.
+
+=cut
+
+# ' # Grr
+use strict;
+
+
+my( $H2XS_VERSION ) = ' $Revision: 1.23 $ ' =~ /\$Revision:\s+([^\s]+)/;
+my $TEMPLATE_VERSION = '0.01';
+my @ARGS = @ARGV;
+my $compat_version = $];
+
+use Getopt::Long;
+use Config;
+use Text::Wrap;
+$Text::Wrap::huge = 'overflow';
+$Text::Wrap::columns = 80;
+use ExtUtils::Constant qw (WriteConstants WriteMakefileSnippet autoload);
+use File::Compare;
+use File::Path;
+
+sub usage {
+    warn "@_\n" if @_;
+    die <<EOFUSAGE;
+h2xs [OPTIONS ... ] [headerfile [extra_libraries]]
+version: $H2XS_VERSION
+OPTIONS:
+    -A, --omit-autoload   Omit all autoloading facilities (implies -c).
+    -B, --beta-version    Use beta \$VERSION of 0.00_01 (ignored if -v).
+    -C, --omit-changes    Omit creating the Changes file, add HISTORY heading
+                          to stub POD.
+    -F, --cpp-flags       Additional flags for C preprocessor/compile.
+    -M, --func-mask       Mask to select C functions/macros
+                          (default is select all).
+    -O, --overwrite-ok    Allow overwriting of a pre-existing extension directory.
+    -P, --omit-pod        Omit the stub POD section.
+    -X, --omit-XS         Omit the XS portion (implies both -c and -f).
+    -a, --gen-accessors   Generate get/set accessors for struct and union members
+                          (used with -x).
+    -b, --compat-version  Specify a perl version to be backwards compatibile with.
+    -c, --omit-constant   Omit the constant() function and specialised AUTOLOAD
+                          from the XS file.
+    -d, --debugging       Turn on debugging messages.
+    -e, --omit-enums      Omit constants from enums in the constant() function.
+                          If a pattern is given, only the matching enums are
+                          ignored.
+    -f, --force           Force creation of the extension even if the C header
+                          does not exist.
+    -g, --global          Include code for safely storing static data in the .xs file.
+    -h, -?, --help        Display this help message.
+    -k, --omit-const-func Omit 'const' attribute on function arguments
+                          (used with -x).
+    -m, --gen-tied-var    Generate tied variables for access to declared
+                          variables.
+    -n, --name            Specify a name to use for the extension (recommended).
+    -o, --opaque-re       Regular expression for \"opaque\" types.
+    -p, --remove-prefix   Specify a prefix which should be removed from the
+                          Perl function names.
+    -s, --const-subs      Create subroutines for specified macros.
+    -t, --default-type    Default type for autoloaded constants (default is IV).
+        --use-new-tests   Use Test::More in backward compatible modules.
+        --use-old-tests   Use the module Test rather than Test::More.
+        --skip-exporter   Do not export symbols.
+        --skip-ppport     Do not use portability layer.
+        --skip-autoloader Do not use the module C<AutoLoader>.
+        --skip-strict     Do not use the pragma C<strict>.
+        --skip-warnings   Do not use the pragma C<warnings>.
+    -v, --version         Specify a version number for this extension.
+    -x, --autogen-xsubs   Autogenerate XSUBs using C::Scan.
+        --use-xsloader    Use XSLoader in backward compatible modules (ignored
+                          when used with -X).
+
+extra_libraries
+         are any libraries that might be needed for loading the
+         extension, e.g. -lm would try to link in the math library.
+EOFUSAGE
+}
+
+my ($opt_A,
+    $opt_B,
+    $opt_C,
+    $opt_F,
+    $opt_M,
+    $opt_O,
+    $opt_P,
+    $opt_X,
+    $opt_a,
+    $opt_c,
+    $opt_d,
+    $opt_e,
+    $opt_f,
+    $opt_g,
+    $opt_h,
+    $opt_k,
+    $opt_m,
+    $opt_n,
+    $opt_o,
+    $opt_p,
+    $opt_s,
+    $opt_v,
+    $opt_x,
+    $opt_b,
+    $opt_t,
+    $new_test,
+    $old_test,
+    $skip_exporter,
+    $skip_ppport,
+    $skip_autoloader,
+    $skip_strict,
+    $skip_warnings,
+    $use_xsloader
+   );
+
+Getopt::Long::Configure('bundling');
+Getopt::Long::Configure('pass_through');
+
+my %options = (
+                'omit-autoload|A'    => \$opt_A,
+                'beta-version|B'     => \$opt_B,
+                'omit-changes|C'     => \$opt_C,
+                'cpp-flags|F=s'      => \$opt_F,
+                'func-mask|M=s'      => \$opt_M,
+                'overwrite_ok|O'     => \$opt_O,
+                'omit-pod|P'         => \$opt_P,
+                'omit-XS|X'          => \$opt_X,
+                'gen-accessors|a'    => \$opt_a,
+                'compat-version|b=s' => \$opt_b,
+                'omit-constant|c'    => \$opt_c,
+                'debugging|d'        => \$opt_d,
+                'omit-enums|e:s'     => \$opt_e,
+                'force|f'            => \$opt_f,
+                'global|g'           => \$opt_g,
+                'help|h|?'           => \$opt_h,
+                'omit-const-func|k'  => \$opt_k,
+                'gen-tied-var|m'     => \$opt_m,
+                'name|n=s'           => \$opt_n,
+                'opaque-re|o=s'      => \$opt_o,
+                'remove-prefix|p=s'  => \$opt_p,
+                'const-subs|s=s'     => \$opt_s,
+                'default-type|t=s'   => \$opt_t,
+                'version|v=s'        => \$opt_v,
+                'autogen-xsubs|x'    => \$opt_x,
+                'use-new-tests'      => \$new_test,
+                'use-old-tests'      => \$old_test,
+                'skip-exporter'      => \$skip_exporter,
+                'skip-ppport'        => \$skip_ppport,
+                'skip-autoloader'    => \$skip_autoloader,
+                'skip-warnings'      => \$skip_warnings,
+                'skip-strict'        => \$skip_strict,
+                'use-xsloader'       => \$use_xsloader,
+              );
+
+GetOptions(%options) || usage;
+
+usage if $opt_h;
+
+if( $opt_b ){
+    usage "You cannot use -b and -m at the same time.\n" if ($opt_b && $opt_m);
+    $opt_b =~ /^\d+\.\d+\.\d+/ ||
+    usage "You must provide the backwards compatibility version in X.Y.Z form. "
+          .  "(i.e. 5.5.0)\n";
+    my ($maj,$min,$sub) = split(/\./,$opt_b,3);
+    if ($maj < 5 || ($maj == 5 && $min < 6)) {
+        $compat_version =
+	    $sub ? sprintf("%d.%03d%02d",$maj,$min,$sub) :
+	           sprintf("%d.%03d",    $maj,$min);
+    } else {
+        $compat_version =
+	    $sub ? sprintf("%d.%03d%03d",$maj,$min,$sub) :
+		   sprintf("%d.%03d",    $maj,$min);
+    }
+} else {
+    my ($maj,$min,$sub) = $compat_version =~ /(\d+)\.(\d\d\d)(\d*)/;
+    $sub ||= 0;
+    warn sprintf <<'EOF', $maj,$min,$sub;
+Defaulting to backwards compatibility with perl %d.%d.%d
+If you intend this module to be compatible with earlier perl versions, please
+specify a minimum perl version with the -b option.
+
+EOF
+}
+
+if( $opt_B ){
+    $TEMPLATE_VERSION = '0.00_01';
+}
+
+if( $opt_v ){
+	$TEMPLATE_VERSION = $opt_v;
+
+    # check if it is numeric
+    my $temp_version = $TEMPLATE_VERSION;
+    my $beta_version = $temp_version =~ s/(\d)_(\d\d)/$1$2/;
+    my $notnum;
+    {
+        local $SIG{__WARN__} = sub { $notnum = 1 };
+        use warnings 'numeric';
+        $temp_version = 0+$temp_version;
+    }
+
+    if ($notnum) {
+        my $module = $opt_n || 'Your::Module';
+        warn <<"EOF";
+You have specified a non-numeric version.  Unless you supply an
+appropriate VERSION class method, users may not be able to specify a
+minimum required version with C<use $module versionnum>.
+
+EOF
+    }
+    else {
+        $opt_B = $beta_version;
+    }
+}
+
+# -A implies -c.
+$skip_autoloader = $opt_c = 1 if $opt_A;
+
+# -X implies -c and -f
+$opt_c = $opt_f = 1 if $opt_X;
+
+$opt_t ||= 'IV';
+
+my %const_xsub;
+%const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
+
+my $extralibs = '';
+
+my @path_h;
+
+while (my $arg = shift) {
+    if ($arg =~ /^-l/i) {
+        $extralibs .= "$arg ";
+        next;
+    }
+    last if $extralibs;
+    push(@path_h, $arg);
+}
+
+usage "Must supply header file or module name\n"
+        unless (@path_h or $opt_n);
+
+my $fmask;
+my $tmask;
+
+$fmask = qr{$opt_M} if defined $opt_M;
+$tmask = qr{$opt_o} if defined $opt_o;
+my $tmask_all = $tmask && $opt_o eq '.';
+
+if ($opt_x) {
+  eval {require C::Scan; 1}
+    or die <<EOD;
+C::Scan required if you use -x option.
+To install C::Scan, execute
+   perl -MCPAN -e "install C::Scan"
+EOD
+  unless ($tmask_all) {
+    $C::Scan::VERSION >= 0.70
+      or die <<EOD;
+C::Scan v. 0.70 or later required unless you use -o . option.
+You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
+To install C::Scan, execute
+   perl -MCPAN -e "install C::Scan"
+EOD
+  }
+  if (($opt_m || $opt_a) && $C::Scan::VERSION < 0.73) {
+    die <<EOD;
+C::Scan v. 0.73 or later required to use -m or -a options.
+You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
+To install C::Scan, execute
+   perl -MCPAN -e "install C::Scan"
+EOD
+  }
+}
+elsif ($opt_o or $opt_F) {
+  warn <<EOD if $opt_o;
+Option -o does not make sense without -x.
+EOD
+  warn <<EOD if $opt_F and $opt_X ;
+Option -F does not make sense with -X.
+EOD
+}
+
+my @path_h_ini = @path_h;
+my ($name, %fullpath, %prefix, %seen_define, %prefixless, %const_names);
+
+my $module = $opt_n;
+
+if( @path_h ){
+    use File::Spec;
+    my @paths;
+    my $pre_sub_tri_graphs = 1;
+    if ($^O eq 'VMS') {  # Consider overrides of default location
+      # XXXX This is not equivalent to what the older version did:
+      #		it was looking at $hadsys header-file per header-file...
+      my($hadsys) = grep s!^sys/!!i , @path_h;
+      @paths = qw( Sys$Library VAXC$Include );
+      push @paths, ($hadsys ? 'GNU_CC_Include[vms]' : 'GNU_CC_Include[000000]');
+      push @paths, qw( DECC$Library_Include DECC$System_Include );
+    }
+    else {
+      @paths = (File::Spec->curdir(), $Config{usrinc},
+		(split ' ', $Config{locincpth}), '/usr/include');
+    }
+    foreach my $path_h (@path_h) {
+        $name ||= $path_h;
+    $module ||= do {
+      $name =~ s/\.h$//;
+      if ( $name !~ /::/ ) {
+	$name =~ s#^.*/##;
+	$name = "\u$name";
+      }
+      $name;
+    };
+
+    if( $path_h =~ s#::#/#g && $opt_n ){
+	warn "Nesting of headerfile ignored with -n\n";
+    }
+    $path_h .= ".h" unless $path_h =~ /\.h$/;
+    my $fullpath = $path_h;
+    $path_h =~ s/,.*$// if $opt_x;
+    $fullpath{$path_h} = $fullpath;
+
+    # Minor trickery: we can't chdir() before we processed the headers
+    # (so know the name of the extension), but the header may be in the
+    # extension directory...
+    my $tmp_path_h = $path_h;
+    my $rel_path_h = $path_h;
+    my @dirs = @paths;
+    if (not -f $path_h) {
+      my $found;
+      for my $dir (@paths) {
+	$found++, last
+	  if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h));
+      }
+      if ($found) {
+	$rel_path_h = $path_h;
+	$fullpath{$path_h} = $fullpath;
+      } else {
+	(my $epath = $module) =~ s,::,/,g;
+	$epath = File::Spec->catdir('ext', $epath) if -d 'ext';
+	$rel_path_h = File::Spec->catfile($epath, $tmp_path_h);
+	$path_h = $tmp_path_h;	# Used during -x
+	push @dirs, $epath;
+      }
+    }
+
+    if (!$opt_c) {
+      die "Can't find $tmp_path_h in @dirs\n"
+	if ( ! $opt_f && ! -f "$rel_path_h" );
+      # Scan the header file (we should deal with nested header files)
+      # Record the names of simple #define constants into const_names
+            # Function prototypes are processed below.
+      open(CH, "<$rel_path_h") || die "Can't open $rel_path_h: $!\n";
+    defines:
+      while (<CH>) {
+	if ($pre_sub_tri_graphs) {
+	    # Preprocess all tri-graphs
+	    # including things stuck in quoted string constants.
+	    s/\?\?=/#/g;                         # | ??=|  #|
+	    s/\?\?\!/|/g;                        # | ??!|  ||
+	    s/\?\?'/^/g;                         # | ??'|  ^|
+	    s/\?\?\(/[/g;                        # | ??(|  [|
+	    s/\?\?\)/]/g;                        # | ??)|  ]|
+	    s/\?\?\-/~/g;                        # | ??-|  ~|
+	    s/\?\?\//\\/g;                       # | ??/|  \|
+	    s/\?\?</{/g;                         # | ??<|  {|
+	    s/\?\?>/}/g;                         # | ??>|  }|
+	}
+	if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^"\s])(.*)/) {
+	    my $def = $1;
+	    my $rest = $2;
+	    $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments
+	    $rest =~ s/^\s+//;
+	    $rest =~ s/\s+$//;
+	    # Cannot do: (-1) and ((LHANDLE)3) are OK:
+	    #print("Skip non-wordy $def => $rest\n"),
+	    #  next defines if $rest =~ /[^\w\$]/;
+	    if ($rest =~ /"/) {
+	      print("Skip stringy $def => $rest\n") if $opt_d;
+	      next defines;
+	    }
+	    print "Matched $_ ($def)\n" if $opt_d;
+	    $seen_define{$def} = $rest;
+	    $_ = $def;
+	    next if /^_.*_h_*$/i; # special case, but for what?
+	    if (defined $opt_p) {
+	      if (!/^$opt_p(\d)/) {
+		++$prefix{$_} if s/^$opt_p//;
+	      }
+	      else {
+		warn "can't remove $opt_p prefix from '$_'!\n";
+	      }
+	    }
+	    $prefixless{$def} = $_;
+	    if (!$fmask or /$fmask/) {
+		print "... Passes mask of -M.\n" if $opt_d and $fmask;
+		$const_names{$_}++;
+	    }
+	  }
+      }
+      if (defined $opt_e and !$opt_e) {
+        close(CH);
+      }
+      else {
+	# Work from miniperl too - on "normal" systems
+        my $SEEK_SET = eval 'use Fcntl qw/SEEK_SET/; SEEK_SET' or 0;
+        seek CH, 0, $SEEK_SET;
+        my $src = do { local $/; <CH> };
+        close CH;
+        no warnings 'uninitialized';
+
+        # Remove C and C++ comments
+        $src =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs;
+
+	while ($src =~ /\benum\s*([\w_]*)\s*\{\s([^}]+)\}/gsc) {
+	    my ($enum_name, $enum_body) = ($1, $2);
+            # skip enums matching $opt_e
+            next if $opt_e && $enum_name =~ /$opt_e/;
+            my $val = 0;
+            for my $item (split /,/, $enum_body) {
+                my ($key, $declared_val) = $item =~ /(\w+)\s*(?:=\s*(.*))?/;
+                $val = defined($declared_val) && length($declared_val) ? $declared_val : 1 + $val;
+                $seen_define{$key} = $val;
+                $const_names{$key}++;
+            }
+        } # while (...)
+      } # if (!defined $opt_e or $opt_e)
+    }
+    }
+}
+
+# Save current directory so that C::Scan can use it
+my $cwd = File::Spec->rel2abs( File::Spec->curdir );
+
+# As Ilya suggested, use a name that contains - and then it can't clash with
+# the names of any packages. A directory 'fallback' will clash with any
+# new pragmata down the fallback:: tree, but that seems unlikely.
+my $constscfname = 'const-c.inc';
+my $constsxsfname = 'const-xs.inc';
+my $fallbackdirname = 'fallback';
+
+my $ext = chdir 'ext' ? 'ext/' : '';
+
+my @modparts  = split(/::/,$module);
+my $modpname  = join('-', @modparts);
+my $modfname  = pop @modparts;
+my $modpmdir  = join '/', 'lib', @modparts;
+my $modpmname = join '/', $modpmdir, $modfname.'.pm';
+
+if ($opt_O) {
+	warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
+}
+else {
+	die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
+}
+-d "$modpname"   || mkpath([$modpname], 0, 0775);
+chdir($modpname) || die "Can't chdir $ext$modpname: $!\n";
+
+my %types_seen;
+my %std_types;
+my $fdecls = [];
+my $fdecls_parsed = [];
+my $typedef_rex;
+my %typedefs_pre;
+my %known_fnames;
+my %structs;
+
+my @fnames;
+my @fnames_no_prefix;
+my %vdecl_hash;
+my @vdecls;
+
+if( ! $opt_X ){  # use XS, unless it was disabled
+  unless ($skip_ppport) {
+    require Devel::PPPort;
+    warn "Writing $ext$modpname/ppport.h\n";
+    Devel::PPPort::WriteFile('ppport.h')
+        || die "Can't create $ext$modpname/ppport.h: $!\n";
+  }
+  open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
+  if ($opt_x) {
+    warn "Scanning typemaps...\n";
+    get_typemap();
+    my @td;
+    my @good_td;
+    my $addflags = $opt_F || '';
+
+    foreach my $filename (@path_h) {
+      my $c;
+      my $filter;
+
+      if ($fullpath{$filename} =~ /,/) {
+	$filename = $`;
+	$filter = $';
+      }
+      warn "Scanning $filename for functions...\n";
+      my @styles = $Config{gccversion} ? qw(C++ C9X GNU) : qw(C++ C9X);
+      $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
+	'add_cppflags' => $addflags, 'c_styles' => \@styles;
+      $c->set('includeDirs' => ["$Config::Config{archlib}/CORE", $cwd]);
+
+      $c->get('keywords')->{'__restrict'} = 1;
+
+      push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
+      push(@$fdecls, @{$c->get('fdecls')});
+
+      push @td, @{$c->get('typedefs_maybe')};
+      if ($opt_a) {
+	my $structs = $c->get('typedef_structs');
+	@structs{keys %$structs} = values %$structs;
+      }
+
+      if ($opt_m) {
+	%vdecl_hash = %{ $c->get('vdecl_hash') };
+	@vdecls = sort keys %vdecl_hash;
+	for (local $_ = 0; $_ < @vdecls; ++$_) {
+	  my $var = $vdecls[$_];
+	  my($type, $post) = @{ $vdecl_hash{$var} };
+	  if (defined $post) {
+	    warn "Can't handle variable '$type $var $post', skipping.\n";
+	    splice @vdecls, $_, 1;
+	    redo;
+	  }
+	  $type = normalize_type($type);
+	  $vdecl_hash{$var} = $type;
+	}
+      }
+
+      unless ($tmask_all) {
+	warn "Scanning $filename for typedefs...\n";
+	my $td = $c->get('typedef_hash');
+	# eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d;
+	my @f_good_td = grep $td->{$_}[1] eq '', keys %$td;
+	push @good_td, @f_good_td;
+	@typedefs_pre{@f_good_td}  = map $_->[0], @$td{@f_good_td};
+      }
+    }
+    { local $" = '|';
+      $typedef_rex = qr(\b(?<!struct )(?:@good_td)\b) if @good_td;
+    }
+    %known_fnames = map @$_[1,3], @$fdecls_parsed; # [1,3] is NAME, FULLTEXT
+    if ($fmask) {
+      my @good;
+      for my $i (0..$#$fdecls_parsed) {
+	next unless $fdecls_parsed->[$i][1] =~ /$fmask/; # [1] is NAME
+	push @good, $i;
+	print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n"
+	  if $opt_d;
+      }
+      $fdecls = [@$fdecls[@good]];
+      $fdecls_parsed = [@$fdecls_parsed[@good]];
+    }
+    @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME
+    # Sort declarations:
+    {
+      my %h = map( ($_->[1], $_), @$fdecls_parsed);
+      $fdecls_parsed = [ @h{@fnames} ];
+    }
+    @fnames_no_prefix = @fnames;
+    @fnames_no_prefix
+      = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix
+         if defined $opt_p;
+    # Remove macros which expand to typedefs
+    print "Typedefs are @td.\n" if $opt_d;
+    my %td = map {($_, $_)} @td;
+    # Add some other possible but meaningless values for macros
+    for my $k (qw(char double float int long short unsigned signed void)) {
+      $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned ');
+    }
+    # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@;
+    my $n = 0;
+    my %bad_macs;
+    while (keys %td > $n) {
+      $n = keys %td;
+      my ($k, $v);
+      while (($k, $v) = each %seen_define) {
+	# print("found '$k'=>'$v'\n"),
+	$bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
+      }
+    }
+    # Now %bad_macs contains names of bad macros
+    for my $k (keys %bad_macs) {
+      delete $const_names{$prefixless{$k}};
+      print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d;
+    }
+  }
+}
+my @const_names = sort keys %const_names;
+
+-d $modpmdir || mkpath([$modpmdir], 0, 0775);
+open(PM, ">$modpmname") || die "Can't create $ext$modpname/$modpmname: $!\n";
+
+$" = "\n\t";
+warn "Writing $ext$modpname/$modpmname\n";
+
+print PM <<"END";
+package $module;
+
+use $compat_version;
+END
+
+print PM <<"END" unless $skip_strict;
+use strict;
+END
+
+print PM "use warnings;\n" unless $skip_warnings or $compat_version < 5.006;
+
+unless( $opt_X || $opt_c || $opt_A ){
+	# we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
+	# will want Carp.
+	print PM <<'END';
+use Carp;
+END
+}
+
+print PM <<'END' unless $skip_exporter;
+
+require Exporter;
+END
+
+my $use_Dyna = (not $opt_X and $compat_version < 5.006 and not $use_xsloader);
+print PM <<"END" if $use_Dyna;  # use DynaLoader, unless XS was disabled
+require DynaLoader;
+END
+
+
+# Are we using AutoLoader or not?
+unless ($skip_autoloader) { # no autoloader whatsoever.
+	unless ($opt_c) { # we're doing the AUTOLOAD
+		print PM "use AutoLoader;\n";
+	}
+	else {
+		print PM "use AutoLoader qw(AUTOLOAD);\n"
+	}
+}
+
+if ( $compat_version < 5.006 ) {
+    my $vars = '$VERSION @ISA';
+    $vars .= ' @EXPORT @EXPORT_OK %EXPORT_TAGS' unless $skip_exporter;
+    $vars .= ' $AUTOLOAD' unless $opt_X || $opt_c || $opt_A;
+    $vars .= ' $XS_VERSION' if $opt_B && !$opt_X;
+    print PM "use vars qw($vars);";
+}
+
+# Determine @ISA.
+my @modISA;
+push @modISA, 'Exporter'	unless $skip_exporter;
+push @modISA, 'DynaLoader' 	if $use_Dyna;  # no XS
+my $myISA = "our \@ISA = qw(@modISA);";
+$myISA =~ s/^our // if $compat_version < 5.006;
+
+print PM "\n$myISA\n\n";
+
+my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls);
+
+my $tmp='';
+$tmp .= <<"END" unless $skip_exporter;
+# 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.
+
+# This allows declaration	use $module ':all';
+# If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK
+# will save memory.
+our %EXPORT_TAGS = ( 'all' => [ qw(
+	@exported_names
+) ] );
+
+our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } );
+
+our \@EXPORT = qw(
+	@const_names
+);
+
+END
+
+$tmp .= "our \$VERSION = '$TEMPLATE_VERSION';\n";
+if ($opt_B) {
+    $tmp .= "our \$XS_VERSION = \$VERSION;\n" unless $opt_X;
+    $tmp .= "\$VERSION = eval \$VERSION;  # see L<perlmodstyle>\n";
+}
+$tmp .= "\n";
+
+$tmp =~ s/^our //mg if $compat_version < 5.006;
+print PM $tmp;
+
+if (@vdecls) {
+    printf PM "our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n";
+}
+
+
+print PM autoload ($module, $compat_version) unless $opt_c or $opt_X;
+
+if( ! $opt_X ){ # print bootstrap, unless XS is disabled
+  if ($use_Dyna) {
+	$tmp = <<"END";
+bootstrap $module \$VERSION;
+END
+  } else {
+	$tmp = <<"END";
+require XSLoader;
+XSLoader::load('$module', \$VERSION);
+END
+  }
+  $tmp =~ s:\$VERSION:\$XS_VERSION:g if $opt_B;
+  print PM $tmp;
+}
+
+# tying the variables can happen only after bootstrap
+if (@vdecls) {
+    printf PM <<END;
+{
+@{[ join "\n", map "    _tievar_$_(\$$_);", @vdecls ]}
+}
+
+END
+}
+
+my $after;
+if( $opt_P ){ # if POD is disabled
+	$after = '__END__';
+}
+else {
+	$after = '=cut';
+}
+
+print PM <<"END";
+
+# Preloaded methods go here.
+END
+
+print PM <<"END" unless $opt_A;
+
+# Autoload methods go after $after, and are processed by the autosplit program.
+END
+
+print PM <<"END";
+
+1;
+__END__
+END
+
+my ($email,$author,$licence);
+
+eval {
+       my $username;
+       ($username,$author) = (getpwuid($>))[0,6];
+       if (defined $username && defined $author) {
+	   $author =~ s/,.*$//; # in case of sub fields
+	   my $domain = $Config{'mydomain'};
+	   $domain =~ s/^\.//;
+	   $email = "$username\@$domain";
+       }
+     };
+
+$author =~ s/'/\\'/g if defined $author;
+$author ||= "A. U. Thor";
+$email  ||= 'a.u.thor@a.galaxy.far.far.away';
+
+$licence = sprintf << "DEFAULT", $^V;
+Copyright (C) ${\(1900 + (localtime) [5])} by $author
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version %vd or,
+at your option, any later version of Perl 5 you may have available.
+DEFAULT
+
+my $revhist = '';
+$revhist = <<EOT if $opt_C;
+#
+#=head1 HISTORY
+#
+#=over 8
+#
+#=item $TEMPLATE_VERSION
+#
+#Original version; created by h2xs $H2XS_VERSION with options
+#
+#  @ARGS
+#
+#=back
+#
+EOT
+
+my $exp_doc = $skip_exporter ? '' : <<EOD;
+#
+#=head2 EXPORT
+#
+#None by default.
+#
+EOD
+
+if (@const_names and not $opt_P) {
+  $exp_doc .= <<EOD unless $skip_exporter;
+#=head2 Exportable constants
+#
+#  @{[join "\n  ", @const_names]}
+#
+EOD
+}
+
+if (defined $fdecls and @$fdecls and not $opt_P) {
+  $exp_doc .= <<EOD unless $skip_exporter;
+#=head2 Exportable functions
+#
+EOD
+
+#  $exp_doc .= <<EOD if $opt_p;
+#When accessing these functions from Perl, prefix C<$opt_p> should be removed.
+#
+#EOD
+  $exp_doc .= <<EOD unless $skip_exporter;
+#  @{[join "\n  ", @known_fnames{@fnames}]}
+#
+EOD
+}
+
+my $meth_doc = '';
+
+if ($opt_x && $opt_a) {
+  my($name, $struct);
+  $meth_doc .= accessor_docs($name, $struct)
+    while ($name, $struct) = each %structs;
+}
+
+# Prefix the default licence with hash symbols.
+# Is this just cargo cult - it seems that the first thing that happens to this
+# block is that all the hashes are then s///g out.
+my $licence_hash = $licence;
+$licence_hash =~ s/^/#/gm;
+
+my $pod;
+$pod = <<"END" unless $opt_P;
+## Below is stub documentation for your module. You'd better edit it!
+#
+#=head1 NAME
+#
+#$module - Perl extension for blah blah blah
+#
+#=head1 SYNOPSIS
+#
+#  use $module;
+#  blah blah blah
+#
+#=head1 DESCRIPTION
+#
+#Stub documentation for $module, created by h2xs. It looks like the
+#author of the extension was negligent enough to leave the stub
+#unedited.
+#
+#Blah blah blah.
+$exp_doc$meth_doc$revhist
+#
+#=head1 SEE ALSO
+#
+#Mention other useful documentation such as the documentation of
+#related modules or operating system documentation (such as man pages
+#in UNIX), or any relevant external documentation such as RFCs or
+#standards.
+#
+#If you have a mailing list set up for your module, mention it here.
+#
+#If you have a web site set up for your module, mention it here.
+#
+#=head1 AUTHOR
+#
+#$author, E<lt>${email}E<gt>
+#
+#=head1 COPYRIGHT AND LICENSE
+#
+$licence_hash
+#
+#=cut
+END
+
+$pod =~ s/^\#//gm unless $opt_P;
+print PM $pod unless $opt_P;
+
+close PM;
+
+
+if( ! $opt_X ){ # print XS, unless it is disabled
+warn "Writing $ext$modpname/$modfname.xs\n";
+
+print XS <<"END";
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+END
+
+print XS <<"END" unless $skip_ppport;
+#include "ppport.h"
+
+END
+
+if( @path_h ){
+    foreach my $path_h (@path_h_ini) {
+	my($h) = $path_h;
+	$h =~ s#^/usr/include/##;
+	if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
+        print XS qq{#include <$h>\n};
+    }
+    print XS "\n";
+}
+
+print XS <<"END" if $opt_g;
+
+/* Global Data */
+
+#define MY_CXT_KEY "${module}::_guts" XS_VERSION
+
+typedef struct {
+    /* Put Global Data in here */
+    int dummy;		/* you can access this elsewhere as MY_CXT.dummy */
+} my_cxt_t;
+
+START_MY_CXT
+
+END
+
+my %pointer_typedefs;
+my %struct_typedefs;
+
+sub td_is_pointer {
+  my $type = shift;
+  my $out = $pointer_typedefs{$type};
+  return $out if defined $out;
+  my $otype = $type;
+  $out = ($type =~ /\*$/);
+  # This converts only the guys which do not have trailing part in the typedef
+  if (not $out
+      and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
+    $type = normalize_type($type);
+    print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n"
+      if $opt_d;
+    $out = td_is_pointer($type);
+  }
+  return ($pointer_typedefs{$otype} = $out);
+}
+
+sub td_is_struct {
+  my $type = shift;
+  my $out = $struct_typedefs{$type};
+  return $out if defined $out;
+  my $otype = $type;
+  $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer($type);
+  # This converts only the guys which do not have trailing part in the typedef
+  if (not $out
+      and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
+    $type = normalize_type($type);
+    print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n"
+      if $opt_d;
+    $out = td_is_struct($type);
+  }
+  return ($struct_typedefs{$otype} = $out);
+}
+
+print_tievar_subs(\*XS, $_, $vdecl_hash{$_}) for @vdecls;
+
+if( ! $opt_c ) {
+  # We write the "sample" files used when this module is built by perl without
+  # ExtUtils::Constant.
+  # h2xs will later check that these are the same as those generated by the
+  # code embedded into Makefile.PL
+  unless (-d $fallbackdirname) {
+    mkdir "$fallbackdirname" or die "Cannot mkdir $fallbackdirname: $!\n";
+  }
+  warn "Writing $ext$modpname/$fallbackdirname/$constscfname\n";
+  warn "Writing $ext$modpname/$fallbackdirname/$constsxsfname\n";
+  my $cfallback = File::Spec->catfile($fallbackdirname, $constscfname);
+  my $xsfallback = File::Spec->catfile($fallbackdirname, $constsxsfname);
+  WriteConstants ( C_FILE =>       $cfallback,
+                   XS_FILE =>      $xsfallback,
+                   DEFAULT_TYPE => $opt_t,
+                   NAME =>         $module,
+                   NAMES =>        \@const_names,
+                 );
+  print XS "#include \"$constscfname\"\n";
+}
+
+
+my $prefix = defined $opt_p ? "PREFIX = $opt_p" : '';
+
+# Now switch from C to XS by issuing the first MODULE declaration:
+print XS <<"END";
+
+MODULE = $module		PACKAGE = $module		$prefix
+
+END
+
+# If a constant() function was #included then output a corresponding
+# XS declaration:
+print XS "INCLUDE: $constsxsfname\n" unless $opt_c;
+
+print XS <<"END" if $opt_g;
+
+BOOT:
+{
+    MY_CXT_INIT;
+    /* If any of the fields in the my_cxt_t struct need
+       to be initialised, do it here.
+     */
+}
+
+END
+
+foreach (sort keys %const_xsub) {
+    print XS <<"END";
+char *
+$_()
+
+    CODE:
+#ifdef $_
+	RETVAL = $_;
+#else
+	croak("Your vendor has not defined the $module macro $_");
+#endif
+
+    OUTPUT:
+	RETVAL
+
+END
+}
+
+my %seen_decl;
+my %typemap;
+
+sub print_decl {
+  my $fh = shift;
+  my $decl = shift;
+  my ($type, $name, $args) = @$decl;
+  return if $seen_decl{$name}++; # Need to do the same for docs as well?
+
+  my @argnames = map {$_->[1]} @$args;
+  my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args;
+  if ($opt_k) {
+    s/^\s*const\b\s*// for @argtypes;
+  }
+  my @argarrays = map { $_->[4] || '' } @$args;
+  my $numargs = @$args;
+  if ($numargs and $argtypes[-1] eq '...') {
+    $numargs--;
+    $argnames[-1] = '...';
+  }
+  local $" = ', ';
+  $type = normalize_type($type, 1);
+
+  print $fh <<"EOP";
+
+$type
+$name(@argnames)
+EOP
+
+  for my $arg (0 .. $numargs - 1) {
+    print $fh <<"EOP";
+	$argtypes[$arg]	$argnames[$arg]$argarrays[$arg]
+EOP
+  }
+}
+
+sub print_tievar_subs {
+  my($fh, $name, $type) = @_;
+  print $fh <<END;
+I32
+_get_$name(IV index, SV *sv) {
+    dSP;
+    PUSHMARK(SP);
+    XPUSHs(sv);
+    PUTBACK;
+    (void)call_pv("$module\::_get_$name", G_DISCARD);
+    return (I32)0;
+}
+
+I32
+_set_$name(IV index, SV *sv) {
+    dSP;
+    PUSHMARK(SP);
+    XPUSHs(sv);
+    PUTBACK;
+    (void)call_pv("$module\::_set_$name", G_DISCARD);
+    return (I32)0;
+}
+
+END
+}
+
+sub print_tievar_xsubs {
+  my($fh, $name, $type) = @_;
+  print $fh <<END;
+void
+_tievar_$name(sv)
+	SV* sv
+    PREINIT:
+	struct ufuncs uf;
+    CODE:
+	uf.uf_val = &_get_$name;
+	uf.uf_set = &_set_$name;
+	uf.uf_index = (IV)&_get_$name;
+	sv_magic(sv, 0, 'U', (char*)&uf, sizeof(uf));
+
+void
+_get_$name(THIS)
+	$type THIS = NO_INIT
+    CODE:
+	THIS = $name;
+    OUTPUT:
+	SETMAGIC: DISABLE
+	THIS
+
+void
+_set_$name(THIS)
+	$type THIS
+    CODE:
+	$name = THIS;
+
+END
+}
+
+sub print_accessors {
+  my($fh, $name, $struct) = @_;
+  return unless defined $struct && $name !~ /\s|_ANON/;
+  $name = normalize_type($name);
+  my $ptrname = normalize_type("$name *");
+  print $fh <<"EOF";
+
+MODULE = $module		PACKAGE = ${name}		$prefix
+
+$name *
+_to_ptr(THIS)
+	$name THIS = NO_INIT
+    PROTOTYPE: \$
+    CODE:
+	if (sv_derived_from(ST(0), "$name")) {
+	    STRLEN len;
+	    char *s = SvPV((SV*)SvRV(ST(0)), len);
+	    if (len != sizeof(THIS))
+		croak("Size \%d of packed data != expected \%d",
+			len, sizeof(THIS));
+	    RETVAL = ($name *)s;
+	}
+	else
+	    croak("THIS is not of type $name");
+    OUTPUT:
+	RETVAL
+
+$name
+new(CLASS)
+	char *CLASS = NO_INIT
+    PROTOTYPE: \$
+    CODE:
+	Zero((void*)&RETVAL, sizeof(RETVAL), char);
+    OUTPUT:
+	RETVAL
+
+MODULE = $module		PACKAGE = ${name}Ptr		$prefix
+
+EOF
+  my @items = @$struct;
+  while (@items) {
+    my $item = shift @items;
+    if ($item->[0] =~ /_ANON/) {
+      if (defined $item->[2]) {
+	push @items, map [
+	  @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
+	], @{ $structs{$item->[0]} };
+      } else {
+	push @items, @{ $structs{$item->[0]} };
+      }
+    } else {
+      my $type = normalize_type($item->[0]);
+      my $ttype = $structs{$type} ? normalize_type("$type *") : $type;
+      print $fh <<"EOF";
+$ttype
+$item->[2](THIS, __value = NO_INIT)
+	$ptrname THIS
+	$type __value
+    PROTOTYPE: \$;\$
+    CODE:
+	if (items > 1)
+	    THIS->$item->[-1] = __value;
+	RETVAL = @{[
+	    $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])"
+	]};
+    OUTPUT:
+	RETVAL
+
+EOF
+    }
+  }
+}
+
+sub accessor_docs {
+  my($name, $struct) = @_;
+  return unless defined $struct && $name !~ /\s|_ANON/;
+  $name = normalize_type($name);
+  my $ptrname = $name . 'Ptr';
+  my @items = @$struct;
+  my @list;
+  while (@items) {
+    my $item = shift @items;
+    if ($item->[0] =~ /_ANON/) {
+      if (defined $item->[2]) {
+	push @items, map [
+	  @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
+	], @{ $structs{$item->[0]} };
+      } else {
+	push @items, @{ $structs{$item->[0]} };
+      }
+    } else {
+      push @list, $item->[2];
+    }
+  }
+  my $methods = (join '(...)>, C<', @list) . '(...)';
+
+  my $pod = <<"EOF";
+#
+#=head2 Object and class methods for C<$name>/C<$ptrname>
+#
+#The principal Perl representation of a C object of type C<$name> is an
+#object of class C<$ptrname> which is a reference to an integer
+#representation of a C pointer.  To create such an object, one may use
+#a combination
+#
+#  my \$buffer = $name->new();
+#  my \$obj = \$buffer->_to_ptr();
+#
+#This exersizes the following two methods, and an additional class
+#C<$name>, the internal representation of which is a reference to a
+#packed string with the C structure.  Keep in mind that \$buffer should
+#better survive longer than \$obj.
+#
+#=over
+#
+#=item C<\$object_of_type_$name-E<gt>_to_ptr()>
+#
+#Converts an object of type C<$name> to an object of type C<$ptrname>.
+#
+#=item C<$name-E<gt>new()>
+#
+#Creates an empty object of type C<$name>.  The corresponding packed
+#string is zeroed out.
+#
+#=item C<$methods>
+#
+#return the current value of the corresponding element if called
+#without additional arguments.  Set the element to the supplied value
+#(and return the new value) if called with an additional argument.
+#
+#Applicable to objects of type C<$ptrname>.
+#
+#=back
+#
+EOF
+  $pod =~ s/^\#//gm;
+  return $pod;
+}
+
+# Should be called before any actual call to normalize_type().
+sub get_typemap {
+  # We do not want to read ./typemap by obvios reasons.
+  my @tm =  qw(../../../typemap ../../typemap ../typemap);
+  my $stdtypemap =  "$Config::Config{privlib}/ExtUtils/typemap";
+  unshift @tm, $stdtypemap;
+  my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
+
+  # Start with useful default values
+  $typemap{float} = 'T_NV';
+
+  foreach my $typemap (@tm) {
+    next unless -e $typemap ;
+    # skip directories, binary files etc.
+    warn " Scanning $typemap\n";
+    warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
+      unless -T $typemap ;
+    open(TYPEMAP, $typemap)
+      or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
+    my $mode = 'Typemap';
+    while (<TYPEMAP>) {
+      next if /^\s*\#/;
+      if (/^INPUT\s*$/)   { $mode = 'Input'; next; }
+      elsif (/^OUTPUT\s*$/)  { $mode = 'Output'; next; }
+      elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; }
+      elsif ($mode eq 'Typemap') {
+	next if /^\s*($|\#)/ ;
+	my ($type, $image);
+	if ( ($type, $image) =
+	     /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o
+	     # This may reference undefined functions:
+	     and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) {
+	  $typemap{normalize_type($type)} = $image;
+	}
+      }
+    }
+    close(TYPEMAP) or die "Cannot close $typemap: $!";
+  }
+  %std_types = %types_seen;
+  %types_seen = ();
+}
+
+
+sub normalize_type {		# Second arg: do not strip const's before \*
+  my $type = shift;
+  my $do_keep_deep_const = shift;
+  # If $do_keep_deep_const this is heuristical only
+  my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : '');
+  my $ignore_mods
+    = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
+  if ($do_keep_deep_const) {	# Keep different compiled /RExen/o separately!
+    $type =~ s/$ignore_mods//go;
+  }
+  else {
+    $type =~ s/$ignore_mods//go;
+  }
+  $type =~ s/([^\s\w])/ $1 /g;
+  $type =~ s/\s+$//;
+  $type =~ s/^\s+//;
+  $type =~ s/\s+/ /g;
+  $type =~ s/\* (?=\*)/*/g;
+  $type =~ s/\. \. \./.../g;
+  $type =~ s/ ,/,/g;
+  $types_seen{$type}++
+    unless $type eq '...' or $type eq 'void' or $std_types{$type};
+  $type;
+}
+
+my $need_opaque;
+
+sub assign_typemap_entry {
+  my $type = shift;
+  my $otype = $type;
+  my $entry;
+  if ($tmask and $type =~ /$tmask/) {
+    print "Type $type matches -o mask\n" if $opt_d;
+    $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
+  }
+  elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
+    $type = normalize_type $type;
+    print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d;
+    $entry = assign_typemap_entry($type);
+  }
+  # XXX good do better if our UV happens to be long long
+  return "T_NV" if $type =~ /^(unsigned\s+)?long\s+(long|double)\z/;
+  $entry ||= $typemap{$otype}
+    || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
+  $typemap{$otype} = $entry;
+  $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT";
+  return $entry;
+}
+
+for (@vdecls) {
+  print_tievar_xsubs(\*XS, $_, $vdecl_hash{$_});
+}
+
+if ($opt_x) {
+  for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
+  if ($opt_a) {
+    while (my($name, $struct) = each %structs) {
+      print_accessors(\*XS, $name, $struct);
+    }
+  }
+}
+
+close XS;
+
+if (%types_seen) {
+  my $type;
+  warn "Writing $ext$modpname/typemap\n";
+  open TM, ">typemap" or die "Cannot open typemap file for write: $!";
+
+  for $type (sort keys %types_seen) {
+    my $entry = assign_typemap_entry $type;
+    print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n"
+  }
+
+  print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry
+#############################################################################
+INPUT
+T_OPAQUE_STRUCT
+	if (sv_derived_from($arg, \"${ntype}\")) {
+	    STRLEN len;
+	    char  *s = SvPV((SV*)SvRV($arg), len);
+
+	    if (len != sizeof($var))
+		croak(\"Size %d of packed data != expected %d\",
+			len, sizeof($var));
+	    $var = *($type *)s;
+	}
+	else
+	    croak(\"$var is not of type ${ntype}\")
+#############################################################################
+OUTPUT
+T_OPAQUE_STRUCT
+	sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
+EOP
+
+  close TM or die "Cannot close typemap file for write: $!";
+}
+
+} # if( ! $opt_X )
+
+warn "Writing $ext$modpname/Makefile.PL\n";
+open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
+
+my $prereq_pm = '';
+
+if ( $compat_version < 5.00702 and $new_test )
+{
+  $prereq_pm .= q%'Test::More'  =>  0, %;
+}
+
+if ( $compat_version < 5.00600 and !$opt_X and $use_xsloader)
+{
+  $prereq_pm .= q%'XSLoader'  =>  0, %;
+}
+
+print PL <<"END";
+use $compat_version;
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+    NAME              => '$module',
+    VERSION_FROM      => '$modpmname', # finds \$VERSION
+    PREREQ_PM         => {$prereq_pm}, # e.g., Module::Name => 1.1
+    (\$] >= 5.005 ?     ## Add these new keywords supported since 5.005
+      (ABSTRACT_FROM  => '$modpmname', # retrieve abstract from module
+       AUTHOR         => '$author <$email>') : ()),
+END
+if (!$opt_X) { # print C stuff, unless XS is disabled
+  $opt_F = '' unless defined $opt_F;
+  my $I = (((glob '*.h') || (glob '*.hh')) ? '-I.' : '');
+  my $Ihelp = ($I ? '-I. ' : '');
+  my $Icomment = ($I ? '' : <<EOC);
+	# Insert -I. if you add *.h files later:
+EOC
+
+  print PL <<END;
+    LIBS              => ['$extralibs'], # e.g., '-lm'
+    DEFINE            => '$opt_F', # e.g., '-DHAVE_SOMETHING'
+$Icomment    INC               => '$I', # e.g., '${Ihelp}-I/usr/include/other'
+END
+
+  my $C = grep {$_ ne "$modfname.c"}
+    (glob '*.c'), (glob '*.cc'), (glob '*.C');
+  my $Cpre = ($C ? '' : '# ');
+  my $Ccomment = ($C ? '' : <<EOC);
+	# Un-comment this if you add C files to link with later:
+EOC
+
+  print PL <<END;
+$Ccomment    ${Cpre}OBJECT            => '\$(O_FILES)', # link all the C files too
+END
+} # ' # Grr
+print PL ");\n";
+if (!$opt_c) {
+  my $generate_code =
+    WriteMakefileSnippet ( C_FILE =>       $constscfname,
+                           XS_FILE =>      $constsxsfname,
+                           DEFAULT_TYPE => $opt_t,
+                           NAME =>         $module,
+                           NAMES =>        \@const_names,
+                 );
+  print PL <<"END";
+if  (eval {require ExtUtils::Constant; 1}) {
+  # If you edit these definitions to change the constants used by this module,
+  # you will need to use the generated $constscfname and $constsxsfname
+  # files to replace their "fallback" counterparts before distributing your
+  # changes.
+$generate_code
+}
+else {
+  use File::Copy;
+  use File::Spec;
+  foreach my \$file ('$constscfname', '$constsxsfname') {
+    my \$fallback = File::Spec->catfile('$fallbackdirname', \$file);
+    copy (\$fallback, \$file) or die "Can't copy \$fallback to \$file: \$!";
+  }
+}
+END
+
+  eval $generate_code;
+  if ($@) {
+    warn <<"EOM";
+Attempting to test constant code in $ext$modpname/Makefile.PL:
+$generate_code
+__END__
+gave unexpected error $@
+Please report the circumstances of this bug in h2xs version $H2XS_VERSION
+using the perlbug script.
+EOM
+  } else {
+    my $fail;
+
+    foreach my $file ($constscfname, $constsxsfname) {
+      my $fallback = File::Spec->catfile($fallbackdirname, $file);
+      if (compare($file, $fallback)) {
+        warn << "EOM";
+Files "$ext$modpname/$fallbackdirname/$file" and "$ext$modpname/$file" differ.
+EOM
+        $fail++;
+      }
+    }
+    if ($fail) {
+      warn fill ('','', <<"EOM") . "\n";
+It appears that the code in $ext$modpname/Makefile.PL does not autogenerate
+the files $ext$modpname/$constscfname and $ext$modpname/$constsxsfname
+correctly.
+
+Please report the circumstances of this bug in h2xs version $H2XS_VERSION
+using the perlbug script.
+EOM
+    } else {
+      unlink $constscfname, $constsxsfname;
+    }
+  }
+}
+close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
+
+# Create a simple README since this is a CPAN requirement
+# and it doesnt hurt to have one
+warn "Writing $ext$modpname/README\n";
+open(RM, ">README") || die "Can't create $ext$modpname/README:$!\n";
+my $thisyear = (gmtime)[5] + 1900;
+my $rmhead = "$modpname version $TEMPLATE_VERSION";
+my $rmheadeq = "=" x length($rmhead);
+
+my $rm_prereq;
+
+if ( $compat_version < 5.00702 and $new_test )
+{
+   $rm_prereq = 'Test::More';
+}
+else
+{
+   $rm_prereq = 'blah blah blah';
+}
+
+print RM <<_RMEND_;
+$rmhead
+$rmheadeq
+
+The README is used to introduce the module and provide instructions on
+how to install the module, any machine dependencies it may have (for
+example C compilers and installed libraries) and any other information
+that should be provided before the module is installed.
+
+A README file is required for CPAN modules since CPAN extracts the
+README file from a module distribution so that people browsing the
+archive can use it get an idea of the modules uses. It is usually a
+good idea to provide version information here so that people can
+decide whether fixes for the module are worth downloading.
+
+INSTALLATION
+
+To install this module type the following:
+
+   perl Makefile.PL
+   make
+   make test
+   make install
+
+DEPENDENCIES
+
+This module requires these other modules and libraries:
+
+  $rm_prereq
+
+COPYRIGHT AND LICENCE
+
+Put the correct copyright and licence information here.
+
+$licence
+
+_RMEND_
+close(RM) || die "Can't close $ext$modpname/README: $!\n";
+
+my $testdir  = "t";
+my $testfile = "$testdir/$modpname.t";
+unless (-d "$testdir") {
+  mkdir "$testdir" or die "Cannot mkdir $testdir: $!\n";
+}
+warn "Writing $ext$modpname/$testfile\n";
+my $tests = @const_names ? 2 : 1;
+
+open EX, ">$testfile" or die "Can't create $ext$modpname/$testfile: $!\n";
+
+print EX <<_END_;
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl $modpname.t'
+
+#########################
+
+# change 'tests => $tests' to 'tests => last_test_to_print';
+
+_END_
+
+my $test_mod = 'Test::More';
+
+if ( $old_test or ($compat_version < 5.007 and not $new_test ))
+{
+  my $test_mod = 'Test';
+
+  print EX <<_END_;
+use Test;
+BEGIN { plan tests => $tests };
+use $module;
+ok(1); # If we made it this far, we're ok.
+
+_END_
+
+   if (@const_names) {
+     my $const_names = join " ", @const_names;
+     print EX <<'_END_';
+
+my $fail;
+foreach my $constname (qw(
+_END_
+
+     print EX wrap ("\t", "\t", $const_names);
+     print EX (")) {\n");
+
+     print EX <<_END_;
+  next if (eval "my \\\$a = \$constname; 1");
+  if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
+    print "# pass: \$\@";
+  } else {
+    print "# fail: \$\@";
+    \$fail = 1;
+  }
+}
+if (\$fail) {
+  print "not ok 2\\n";
+} else {
+  print "ok 2\\n";
+}
+
+_END_
+  }
+}
+else
+{
+  print EX <<_END_;
+use Test::More tests => $tests;
+BEGIN { use_ok('$module') };
+
+_END_
+
+   if (@const_names) {
+     my $const_names = join " ", @const_names;
+     print EX <<'_END_';
+
+my $fail = 0;
+foreach my $constname (qw(
+_END_
+
+     print EX wrap ("\t", "\t", $const_names);
+     print EX (")) {\n");
+
+     print EX <<_END_;
+  next if (eval "my \\\$a = \$constname; 1");
+  if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
+    print "# pass: \$\@";
+  } else {
+    print "# fail: \$\@";
+    \$fail = 1;
+  }
+
+}
+
+ok( \$fail == 0 , 'Constants' );
+_END_
+  }
+}
+
+print EX <<_END_;
+#########################
+
+# Insert your test code below, the $test_mod module is use()ed here so read
+# its man page ( perldoc $test_mod ) for help writing this test script.
+
+_END_
+
+close(EX) || die "Can't close $ext$modpname/$testfile: $!\n";
+
+unless ($opt_C) {
+  warn "Writing $ext$modpname/Changes\n";
+  $" = ' ';
+  open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
+  @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
+  print EX <<EOP;
+Revision history for Perl extension $module.
+
+$TEMPLATE_VERSION  @{[scalar localtime]}
+\t- original version; created by h2xs $H2XS_VERSION with options
+\t\t@ARGS
+
+EOP
+  close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
+}
+
+warn "Writing $ext$modpname/MANIFEST\n";
+open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
+my @files = grep { -f } (<*>, <t/*>, <$fallbackdirname/*>, <$modpmdir/*>);
+if (!@files) {
+  eval {opendir(D,'.');};
+  unless ($@) { @files = readdir(D); closedir(D); }
+}
+if (!@files) { @files = map {chomp && $_} `ls`; }
+if ($^O eq 'VMS') {
+  foreach (@files) {
+    # Clip trailing '.' for portability -- non-VMS OSs don't expect it
+    s%\.$%%;
+    # Fix up for case-sensitive file systems
+    s/$modfname/$modfname/i && next;
+    $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes';
+    $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
+  }
+}
+print MANI join("\n",@files), "\n";
+close MANI;
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/instmodsh.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/instmodsh.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/instmodsh.bat	(revision 14489)
@@ -0,0 +1,211 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+#!/usr/bin/perl -w
+
+use strict;
+use IO::File;
+use ExtUtils::Packlist;
+use ExtUtils::Installed;
+
+use vars qw($Inst @Modules);
+
+
+=head1 NAME
+
+instmodsh - A shell to examine installed modules
+
+=head1 SYNOPSIS
+
+    instmodsh
+
+=head1 DESCRIPTION
+
+A little interface to ExtUtils::Installed to examine installed modules,
+validate your packlists and even create a tarball from an installed module.
+
+=head1 SEE ALSO
+
+ExtUtils::Installed
+
+=cut
+
+
+my $Module_Help = <<EOF;
+Available commands are:
+   f [all|prog|doc]   - List installed files of a given type
+   d [all|prog|doc]   - List the directories used by a module
+   v                  - Validate the .packlist - check for missing files
+   t <tarfile>        - Create a tar archive of the module
+   h                  - Display module help
+   q                  - Quit the module
+EOF
+
+my %Module_Commands = (
+                       f => \&list_installed,
+                       d => \&list_directories,
+                       v => \&validate_packlist,
+                       t => \&create_archive,
+                       h => \&module_help,
+                      );
+
+sub do_module($) {
+    my ($module) = @_;
+
+    print($Module_Help);
+    MODULE_CMD: while (1) {
+        print("$module cmd? ");
+
+        my $reply = <STDIN>; chomp($reply);
+        my($cmd) = $reply =~ /^(\w)\b/;
+
+        last if $cmd eq 'q';
+
+        if( $Module_Commands{$cmd} ) {
+            $Module_Commands{$cmd}->($reply, $module);
+        }
+        elsif( $cmd eq 'q' ) {
+            last MODULE_CMD;
+        }
+        else {
+            module_help();
+        }
+    }
+}
+
+
+sub list_installed {
+    my($reply, $module) = @_;
+
+    my $class = (split(' ', $reply))[1];
+    $class = 'all' unless $class;
+
+    my @files;
+    if (eval { @files = $Inst->files($module, $class); }) {
+        print("$class files in $module are:\n   ",
+              join("\n   ", @files), "\n");
+    }
+    else { 
+        print($@); 
+    }
+};
+
+
+sub list_directories {
+    my($reply, $module) = @_;
+
+    my $class = (split(' ', $reply))[1];
+    $class = 'all' unless $class;
+
+    my @dirs;
+    if (eval { @dirs = $Inst->directories($module, $class); }) {
+        print("$class directories in $module are:\n   ",
+              join("\n   ", @dirs), "\n");
+    }
+    else { 
+        print($@); 
+    }
+}
+
+
+sub create_archive {
+    my($reply, $module) = @_;
+
+    my $file = (split(' ', $reply))[1];
+
+    if( !(defined $file and length $file) ) {
+        print "No tar file specified\n";
+    }
+    elsif( eval { require Archive::Tar } ) {
+        Archive::Tar->create_archive($file, 0, $Inst->files($module));
+    }
+    else {
+        my($first, @rest) = $Inst->files($module);
+        system('tar', 'cvf', $file, $first);
+        for my $f (@rest) {
+            system('tar', 'rvf', $file, $f);
+        }
+        print "Can't use tar\n" if $?;
+    }
+}
+
+
+sub validate_packlist {
+    my($reply, $module) = @_;
+
+    if (my @missing = $Inst->validate($module)) {
+        print("Files missing from $module are:\n   ",
+              join("\n   ", @missing), "\n");
+    }
+    else {
+        print("$module has no missing files\n");
+    }
+}
+
+sub module_help {
+    print $Module_Help;
+}
+
+
+
+##############################################################################
+
+sub toplevel()
+{
+my $help = <<EOF;
+Available commands are:
+   l            - List all installed modules
+   m <module>   - Select a module
+   q            - Quit the program
+EOF
+print($help);
+while (1)
+   {
+   print("cmd? ");
+   my $reply = <STDIN>; chomp($reply);
+   CASE:
+      {
+      $reply eq 'l' and do
+         {
+         print("Installed modules are:\n   ", join("\n   ", @Modules), "\n");
+         last CASE;
+         };
+      $reply =~ /^m\s+/ and do
+         {
+         do_module((split(' ', $reply))[1]);
+         last CASE;
+         };
+      $reply eq 'q' and do
+         {
+         exit(0);
+         };
+      # Default
+         print($help);
+      }
+   }
+}
+
+
+###############################################################################
+
+$Inst = ExtUtils::Installed->new();
+@Modules = $Inst->modules();
+toplevel();
+
+###############################################################################
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/libnetcfg.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/libnetcfg.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/libnetcfg.bat	(revision 14489)
@@ -0,0 +1,737 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+
+=head1 NAME
+
+libnetcfg - configure libnet
+
+=head1 DESCRIPTION
+
+The libnetcfg utility can be used to configure the libnet.
+Starting from perl 5.8 libnet is part of the standard Perl
+distribution, but the libnetcfg can be used for any libnet
+installation.
+
+=head1 USAGE
+
+Without arguments libnetcfg displays the current configuration.
+
+    $ libnetcfg
+    # old config ./libnet.cfg
+    daytime_hosts        ntp1.none.such
+    ftp_int_passive      0
+    ftp_testhost         ftp.funet.fi
+    inet_domain          none.such
+    nntp_hosts           nntp.none.such
+    ph_hosts             
+    pop3_hosts           pop.none.such
+    smtp_hosts           smtp.none.such
+    snpp_hosts           
+    test_exist           1
+    test_hosts           1
+    time_hosts           ntp.none.such
+    # libnetcfg -h for help
+    $ 
+
+It tells where the old configuration file was found (if found).
+
+The C<-h> option will show a usage message.
+
+To change the configuration you will need to use either the C<-c> or
+the C<-d> options.
+
+The default name of the old configuration file is by default
+"libnet.cfg", unless otherwise specified using the -i option,
+C<-i oldfile>, and it is searched first from the current directory,
+and then from your module path.
+
+The default name of the new configuration file is "libnet.cfg", and by
+default it is written to the current directory, unless otherwise
+specified using the -o option, C<-o newfile>.
+
+=head1 SEE ALSO
+
+L<Net::Config>, L<Net::libnetFAQ>
+
+=head1 AUTHORS
+
+Graham Barr, the original Configure script of libnet.
+
+Jarkko Hietaniemi, conversion into libnetcfg for inclusion into Perl 5.8.
+
+=cut
+
+# $Id: Configure,v 1.8 1997/03/04 09:22:32 gbarr Exp $
+
+use strict;
+use IO::File;
+use Getopt::Std;
+use ExtUtils::MakeMaker qw(prompt);
+use File::Spec;
+
+use vars qw($opt_d $opt_c $opt_h $opt_o $opt_i);
+
+##
+##
+##
+
+my %cfg = ();
+my @cfg = ();
+
+my($libnet_cfg_in,$libnet_cfg_out,$msg,$ans,$def,$have_old);
+
+##
+##
+##
+
+sub valid_host
+{
+ my $h = shift;
+
+ defined($h) && (($cfg{'test_exist'} == 0) || gethostbyname($h));
+}
+
+##
+##
+##
+
+sub test_hostnames (\@)
+{
+ my $hlist = shift;
+ my @h = ();
+ my $host;
+ my $err = 0;
+
+ foreach $host (@$hlist)
+  {
+   if(valid_host($host))
+    {
+     push(@h, $host);
+     next;
+    }
+   warn "Bad hostname: '$host'\n";
+   $err++;
+  }
+ @$hlist = @h;
+ $err ? join(" ",@h) : undef;
+}
+
+##
+##
+##
+
+sub Prompt
+{
+ my($prompt,$def) = @_;
+
+ $def = "" unless defined $def;
+
+ chomp($prompt);
+
+ if($opt_d)
+  {
+   print $prompt,," [",$def,"]\n";
+   return $def;
+  }
+ prompt($prompt,$def);
+}
+
+##
+##
+##
+
+sub get_host_list
+{
+ my($prompt,$def) = @_;
+
+ $def = join(" ",@$def) if ref($def);
+
+ my @hosts;
+
+ do
+  {
+   my $ans = Prompt($prompt,$def);
+
+   $ans =~ s/(\A\s+|\s+\Z)//g;
+
+   @hosts = split(/\s+/, $ans);
+  }
+ while(@hosts && defined($def = test_hostnames(@hosts)));
+
+ \@hosts;
+}
+
+##
+##
+##
+
+sub get_hostname
+{
+ my($prompt,$def) = @_;
+
+ my $host;
+
+ while(1)
+  {
+   my $ans = Prompt($prompt,$def);
+   $host = ($ans =~ /(\S*)/)[0];
+   last
+	if(!length($host) || valid_host($host));
+
+   $def =""
+	if $def eq $host;
+
+   print <<"EDQ";
+
+*** ERROR:
+    Hostname `$host' does not seem to exist, please enter again
+    or a single space to clear any default
+
+EDQ
+  }
+
+ length $host
+	? $host
+	: undef;
+}
+
+##
+##
+##
+
+sub get_bool ($$)
+{
+ my($prompt,$def) = @_;
+
+ chomp($prompt);
+
+ my $val = Prompt($prompt,$def ? "yes" : "no");
+
+ $val =~ /^y/i ? 1 : 0;
+}
+
+##
+##
+##
+
+sub get_netmask ($$)
+{
+ my($prompt,$def) = @_;
+
+ chomp($prompt);
+
+ my %list;
+ @list{@$def} = ();
+
+MASK:
+ while(1) {
+   my $bad = 0;
+   my $ans = Prompt($prompt) or last;
+
+   if($ans eq '*') {
+     %list = ();
+     next;
+   }
+
+   if($ans eq '=') {
+     print "\n",( %list ? join("\n", sort keys %list) : 'none'),"\n\n";
+     next;
+   }
+
+   unless ($ans =~ m{^\s*(?:(-?\s*)(\d+(?:\.\d+){0,3})/(\d+))}) {
+     warn "Bad netmask '$ans'\n";
+     next;
+   }
+
+   my($remove,$bits,@ip) = ($1,$3,split(/\./, $2),0,0,0);
+   if ( $ip[0] < 1 || $bits < 1 || $bits > 32) {
+     warn "Bad netmask '$ans'\n";
+     next MASK;
+   }
+   foreach my $byte (@ip) {
+     if ( $byte > 255 ) {
+       warn "Bad netmask '$ans'\n";
+       next MASK;
+     }
+   } 
+
+   my $mask = sprintf("%d.%d.%d.%d/%d",@ip[0..3],$bits); 
+
+   if ($remove) {
+     delete $list{$mask};
+   }
+   else {
+     $list{$mask} = 1;
+   }
+
+  }
+
+ [ keys %list ];
+}
+
+##
+##
+##
+
+sub default_hostname
+{
+ my $host;
+ my @host;
+
+ foreach $host (@_)
+  {
+   if(defined($host) && valid_host($host))
+    {
+     return $host
+	unless wantarray;
+     push(@host,$host);
+    }
+  }
+
+ return wantarray ? @host : undef;
+}
+
+##
+##
+##
+
+getopts('dcho:i:');
+
+$libnet_cfg_in = "libnet.cfg"
+	unless(defined($libnet_cfg_in  = $opt_i));
+
+$libnet_cfg_out = "libnet.cfg"
+	unless(defined($libnet_cfg_out = $opt_o));
+
+my %oldcfg = ();
+
+$Net::Config::CONFIGURE = 1; # Suppress load of user overrides
+if( -f $libnet_cfg_in )
+ {
+  %oldcfg = ( %{ do $libnet_cfg_in } );
+ }
+elsif (eval { require Net::Config }) 
+ {
+  $have_old = 1;
+  %oldcfg = %Net::Config::NetConfig;
+ }
+
+map { $cfg{lc $_} = $cfg{$_}; delete $cfg{$_} if /[A-Z]/ } keys %cfg;
+
+#---------------------------------------------------------------------------
+
+if ($opt_h) {
+ print <<EOU;
+$0: Usage: $0 [-c] [-d] [-i oldconfigile] [-o newconfigfile] [-h]
+Without options, the old configuration is shown.
+
+   -c change the configuration
+   -d use defaults from the old config (implies -c, non-interactive)
+   -i use a specific file as the old config file
+   -o use a specific file as the new config file
+   -h show this help
+
+The default name of the old configuration file is by default
+"libnet.cfg", unless otherwise specified using the -i option,
+C<-i oldfile>, and it is searched first from the current directory,
+and then from your module path.
+
+The default name of the new configuration file is "libnet.cfg", and by
+default it is written to the current directory, unless otherwise
+specified using the -o option.
+
+EOU
+ exit(0);
+}
+
+#---------------------------------------------------------------------------
+
+{
+   my $oldcfgfile;
+   my @inc;
+   push @inc, $ENV{PERL5LIB} if exists $ENV{PERL5LIB};
+   push @inc, $ENV{PERLLIB}  if exists $ENV{PERLLIB};
+   push @inc, @INC;
+   for (@inc) {
+    my $trycfgfile = File::Spec->catfile($_, $libnet_cfg_in);
+    if (-f $trycfgfile && -r $trycfgfile) {
+     $oldcfgfile = $trycfgfile;
+     last;
+    }
+   }
+   print "# old config $oldcfgfile\n" if defined $oldcfgfile;
+   for (sort keys %oldcfg) {
+	printf "%-20s %s\n", $_,
+               ref $oldcfg{$_} ? @{$oldcfg{$_}} : $oldcfg{$_};
+   }
+   unless ($opt_c || $opt_d) {
+    print "# $0 -h for help\n";
+    exit(0);
+   }
+}
+
+#---------------------------------------------------------------------------
+
+$oldcfg{'test_exist'} = 1 unless exists $oldcfg{'test_exist'};
+$oldcfg{'test_hosts'} = 1 unless exists $oldcfg{'test_hosts'};
+
+#---------------------------------------------------------------------------
+
+if($have_old && !$opt_d)
+ {
+  $msg = <<EDQ;
+
+Ah, I see you already have installed libnet before.
+
+Do you want to modify/update your configuration (y|n) ?
+EDQ
+
+ $opt_d = 1
+	unless get_bool($msg,0);
+ }
+
+#---------------------------------------------------------------------------
+
+$msg = <<EDQ;
+
+This script will prompt you to enter hostnames that can be used as
+defaults for some of the modules in the libnet distribution.
+
+To ensure that you do not enter an invalid hostname, I can perform a
+lookup on each hostname you enter. If your internet connection is via
+a dialup line then you may not want me to perform these lookups, as
+it will require you to be on-line.
+
+Do you want me to perform hostname lookups (y|n) ?
+EDQ
+
+$cfg{'test_exist'} = get_bool($msg, $oldcfg{'test_exist'});
+
+print <<EDQ unless $cfg{'test_exist'};
+
+*** WARNING *** WARNING *** WARNING *** WARNING *** WARNING ***
+
+OK I will not check if the hostnames you give are valid
+so be very cafeful
+
+*** WARNING *** WARNING *** WARNING *** WARNING *** WARNING ***
+EDQ
+
+
+#---------------------------------------------------------------------------
+
+print <<EDQ;
+
+The following questions all require a list of host names, separated
+with spaces. If you do not have a host available for any of the
+services, then enter a single space, followed by <CR>. To accept the
+default, hit <CR>
+
+EDQ
+
+$msg = 'Enter a list of available NNTP hosts :';
+
+$def = $oldcfg{'nntp_hosts'} ||
+	[ default_hostname($ENV{NNTPSERVER},$ENV{NEWSHOST},'news') ];
+
+$cfg{'nntp_hosts'} = get_host_list($msg,$def);
+
+#---------------------------------------------------------------------------
+
+$msg = 'Enter a list of available SMTP hosts :';
+
+$def = $oldcfg{'smtp_hosts'} ||
+	[ default_hostname(split(/:/,$ENV{SMTPHOSTS} || ""), 'mailhost') ];
+
+$cfg{'smtp_hosts'} = get_host_list($msg,$def);
+
+#---------------------------------------------------------------------------
+
+$msg = 'Enter a list of available POP3 hosts :';
+
+$def = $oldcfg{'pop3_hosts'} || [];
+
+$cfg{'pop3_hosts'} = get_host_list($msg,$def);
+
+#---------------------------------------------------------------------------
+
+$msg = 'Enter a list of available SNPP hosts :';
+
+$def = $oldcfg{'snpp_hosts'} || [];
+
+$cfg{'snpp_hosts'} = get_host_list($msg,$def);
+
+#---------------------------------------------------------------------------
+
+$msg = 'Enter a list of available PH Hosts   :'  ;
+
+$def = $oldcfg{'ph_hosts'} ||
+	[ default_hostname('dirserv') ];
+
+$cfg{'ph_hosts'}   =  get_host_list($msg,$def);
+
+#---------------------------------------------------------------------------
+
+$msg = 'Enter a list of available TIME Hosts   :'  ;
+
+$def = $oldcfg{'time_hosts'} || [];
+
+$cfg{'time_hosts'} = get_host_list($msg,$def);
+
+#---------------------------------------------------------------------------
+
+$msg = 'Enter a list of available DAYTIME Hosts   :'  ;
+
+$def = $oldcfg{'daytime_hosts'} || $oldcfg{'time_hosts'};
+
+$cfg{'daytime_hosts'} = get_host_list($msg,$def);
+
+#---------------------------------------------------------------------------
+
+$msg = <<EDQ;
+
+Do you have a firewall/ftp proxy  between your machine and the internet 
+
+If you use a SOCKS firewall answer no
+
+(y|n) ?
+EDQ
+
+if(get_bool($msg,0)) {
+
+  $msg = <<'EDQ';
+What series of FTP commands do you need to send to your
+firewall to connect to an external host.
+
+user/pass     => external user & password
+fwuser/fwpass => firewall user & password
+
+0) None
+1) -----------------------
+     USER user@remote.host
+     PASS pass
+2) -----------------------
+     USER fwuser
+     PASS fwpass
+     USER user@remote.host
+     PASS pass
+3) -----------------------
+     USER fwuser
+     PASS fwpass
+     SITE remote.site
+     USER user
+     PASS pass
+4) -----------------------
+     USER fwuser
+     PASS fwpass
+     OPEN remote.site
+     USER user
+     PASS pass
+5) -----------------------
+     USER user@fwuser@remote.site
+     PASS pass@fwpass
+6) -----------------------
+     USER fwuser@remote.site
+     PASS fwpass
+     USER user
+     PASS pass
+7) -----------------------
+     USER user@remote.host
+     PASS pass
+     AUTH fwuser
+     RESP fwpass
+
+Choice:
+EDQ
+ $def = exists $oldcfg{'ftp_firewall_type'}  ? $oldcfg{'ftp_firewall_type'} : 1;
+ $ans = Prompt($msg,$def);
+ $cfg{'ftp_firewall_type'} = 0+$ans;
+ $def = $oldcfg{'ftp_firewall'} || $ENV{FTP_FIREWALL};
+
+ $cfg{'ftp_firewall'} = get_hostname("FTP proxy hostname :", $def);
+}
+else {
+ delete $cfg{'ftp_firewall'};
+}
+
+
+#---------------------------------------------------------------------------
+
+if (defined $cfg{'ftp_firewall'})
+ {
+  print <<EDQ;
+
+By default Net::FTP assumes that it only needs to use a firewall if it
+cannot resolve the name of the host given. This only works if your DNS
+system is setup to only resolve internal hostnames. If this is not the
+case and your DNS will resolve external hostnames, then another method
+is needed. Net::Config can do this if you provide the netmasks that
+describe your internal network. Each netmask should be entered in the
+form x.x.x.x/y, for example 127.0.0.0/8 or 214.8.16.32/24
+
+EDQ
+$def = [];
+if(ref($oldcfg{'local_netmask'}))
+ {
+  $def = $oldcfg{'local_netmask'};
+   print "Your current netmasks are :\n\n\t",
+	join("\n\t",@{$def}),"\n\n";
+ }
+
+print "
+Enter one netmask at each prompt, prefix with a - to remove a netmask
+from the list, enter a '*' to clear the whole list, an '=' to show the
+current list and an empty line to continue with Configure.
+
+";
+
+  my $mask = get_netmask("netmask :",$def);
+  $cfg{'local_netmask'} = $mask if ref($mask) && @$mask;
+ }
+
+#---------------------------------------------------------------------------
+
+###$msg =<<EDQ;
+###
+###SOCKS is a commonly used firewall protocol. If you use SOCKS firewalls
+###then enter a list of hostames
+###
+###Enter a list of available SOCKS hosts :
+###EDQ
+###
+###$def = $cfg{'socks_hosts'} ||
+###	[ default_hostname($ENV{SOCKS5_SERVER},
+###			   $ENV{SOCKS_SERVER},
+###			   $ENV{SOCKS4_SERVER}) ];
+###
+###$cfg{'socks_hosts'}   =  get_host_list($msg,$def);
+
+#---------------------------------------------------------------------------
+
+print <<EDQ;
+
+Normally when FTP needs a data connection the client tells the server
+a port to connect to, and the server initiates a connection to the client.
+
+Some setups, in particular firewall setups, can/do not work using this
+protocol. In these situations the client must make the connection to the
+server, this is called a passive transfer.
+EDQ
+
+if (defined $cfg{'ftp_firewall'}) {
+  $msg = "\nShould all FTP connections via a firewall/proxy be passive (y|n) ?";
+
+  $def = $oldcfg{'ftp_ext_passive'} || 0;
+
+  $cfg{'ftp_ext_passive'} = get_bool($msg,$def);
+
+  $msg = "\nShould all other FTP connections be passive (y|n) ?";
+
+}
+else {
+  $msg = "\nShould all FTP connections be passive (y|n) ?";
+}
+
+$def = $oldcfg{'ftp_int_passive'} || 0;
+
+$cfg{'ftp_int_passive'} = get_bool($msg,$def);
+
+
+#---------------------------------------------------------------------------
+
+$def = $oldcfg{'inet_domain'} || $ENV{LOCALDOMAIN};
+
+$ans = Prompt("\nWhat is your local internet domain name :",$def);
+
+$cfg{'inet_domain'} = ($ans =~ /(\S+)/)[0];
+
+#---------------------------------------------------------------------------
+
+$msg = <<EDQ;
+
+If you specified some default hosts above, it is possible for me to
+do some basic tests when you run `make test'
+
+This will cause `make test' to be quite a bit slower and, if your
+internet connection is via dialup, will require you to be on-line
+unless the hosts are local.
+
+Do you want me to run these tests (y|n) ?
+EDQ
+
+$cfg{'test_hosts'} = get_bool($msg,$oldcfg{'test_hosts'});
+
+#---------------------------------------------------------------------------
+
+$msg = <<EDQ;
+
+To allow Net::FTP to be tested I will need a hostname. This host
+should allow anonymous access and have a /pub directory
+
+What host can I use :
+EDQ
+
+$cfg{'ftp_testhost'} = get_hostname($msg,$oldcfg{'ftp_testhost'})
+	if $cfg{'test_hosts'};
+
+
+print "\n";
+
+#---------------------------------------------------------------------------
+
+my $fh = IO::File->new($libnet_cfg_out, "w") or
+	die "Cannot create `$libnet_cfg_out': $!";
+
+print "Writing $libnet_cfg_out\n";
+
+print $fh "{\n";
+
+my $key;
+foreach $key (keys %cfg) {
+    my $val = $cfg{$key};
+    if(!defined($val)) {
+	$val = "undef";
+    }
+    elsif(ref($val)) {
+	$val = '[' . join(",",
+	    map {
+		my $v = "undef";
+		if(defined $_) {
+		    ($v = $_) =~ s/'/\'/sog;
+		    $v = "'" . $v . "'";
+		}
+		$v;
+	    } @$val ) . ']';
+    }
+    else {
+	$val =~ s/'/\'/sog;
+	$val = "'" . $val . "'" if $val =~ /\D/;
+    }
+    print $fh "\t'",$key,"' => ",$val,",\n";
+}
+
+print $fh "}\n";
+
+$fh->close;
+
+############################################################################
+############################################################################
+
+exit 0;
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/perlbug.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/perlbug.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/perlbug.bat	(revision 14489)
@@ -0,0 +1,1223 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+
+my $config_tag1 = 'v5.8.8 - Wed Aug  2 11:33:07 2006';
+
+my $patchlevel_date = 1138720330;
+my $patch_tags = '';
+my @patches = (
+    ''
+);
+
+use Config;
+use File::Spec;		# keep perlbug Perl 5.005 compatible
+use Getopt::Std;
+use strict;
+
+sub paraprint;
+
+BEGIN {
+    eval "use Mail::Send;";
+    $::HaveSend = ($@ eq "");
+    eval "use Mail::Util;";
+    $::HaveUtil = ($@ eq "");
+    # use secure tempfiles wherever possible
+    eval "require File::Temp;";
+    $::HaveTemp = ($@ eq "");
+};
+
+my $Version = "1.35";
+
+# Changed in 1.06 to skip Mail::Send and Mail::Util if not available.
+# Changed in 1.07 to see more sendmail execs, and added pipe output.
+# Changed in 1.08 to use correct address for sendmail.
+# Changed in 1.09 to close the REP file before calling it up in the editor.
+#                 Also removed some old comments duplicated elsewhere.
+# Changed in 1.10 to run under VMS without Mail::Send; also fixed
+#                 temp filename generation.
+# Changed in 1.11 to clean up some text and removed Mail::Send deactivator.
+# Changed in 1.12 to check for editor errors, make save/send distinction
+#                 clearer and add $ENV{REPLYTO}.
+# Changed in 1.13 to hopefully make it more difficult to accidentally
+#                 send mail
+# Changed in 1.14 to make the prompts a little more clear on providing
+#                 helpful information. Also let file read fail gracefully.
+# Changed in 1.15 to add warnings to stop people using perlbug for non-bugs.
+#                 Also report selected environment variables.
+# Changed in 1.16 to include @INC, and allow user to re-edit if no changes.
+# Changed in 1.17 Win32 support added.  GSAR 97-04-12
+# Changed in 1.18 add '-ok' option for reporting build success. CFR 97-06-18
+# Changed in 1.19 '-ok' default not '-v'
+#                 add local patch information
+#                 warn on '-ok' if this is an old system; add '-okay'
+# Changed in 1.20 Added patchlevel.h reading and version/config checks
+# Changed in 1.21 Added '-nok' for reporting build failure DFD 98-05-05
+# Changed in 1.22 Heavy reformatting & minor bugfixes HVDS 98-05-10
+# Changed in 1.23 Restore -ok(ay): say 'success'; don't prompt
+# Changed in 1.24 Added '-F<file>' to save report HVDS 98-07-01
+# Changed in 1.25 Warn on failure to open save file. HVDS 98-07-12
+# Changed in 1.26 Don't require -t STDIN for -ok. HVDS 98-07-15
+# Changed in 1.27 Added Mac OS and File::Spec support CNANDOR 99-07-27
+# Changed in 1.28 Additional questions for Perlbugtron RFOLEY 20.03.2000
+# Changed in 1.29 Perlbug(tron): auto(-ok), short prompts RFOLEY 05-05-2000
+# Changed in 1.30 Added warnings on failure to open files MSTEVENS 13-07-2000
+# Changed in 1.31 Add checks on close().Fix my $var unless. TJENNESS 26-07-2000
+# Changed in 1.32 Use File::Spec->tmpdir TJENNESS 20-08-2000
+# Changed in 1.33 Don't require -t STDOUT for -ok.
+# Changed in 1.34 Added Message-Id RFOLEY 18-06-2002 
+# Changed in 1.35 Use File::Temp (patch from Solar Designer) NWCLARK 28-02-2004
+
+# TODO: - Allow the user to re-name the file on mail failure, and
+#       make sure failure (transmission-wise) of Mail::Send is
+#       accounted for.
+#       - Test -b option
+
+my( $file, $usefile, $cc, $address, $perlbug, $testaddress, $filename, $messageid, $domain,
+    $subject, $from, $verbose, $ed, $outfile, $Is_MacOS, $category, $severity,
+    $fh, $me, $Is_MSWin32, $Is_Linux, $Is_VMS, $msg, $body, $andcc, %REP, $ok,
+    $Is_OpenBSD);
+
+my $perl_version = $^V ? sprintf("v%vd", $^V) : $];
+
+my $config_tag2 = "$perl_version - $Config{cf_time}";
+
+Init();
+
+if ($::opt_h) { Help(); exit; }
+if ($::opt_d) { Dump(*STDOUT); exit; }
+if (!-t STDIN && !($ok and not $::opt_n)) {
+    paraprint <<EOF;
+Please use perlbug interactively. If you want to
+include a file, you can use the -f switch.
+EOF
+    die "\n";
+}
+
+Query();
+Edit() unless $usefile || ($ok and not $::opt_n);
+NowWhat();
+Send();
+
+exit;
+
+sub ask_for_alternatives { # (category|severity)
+    my $name = shift;
+    my %alts = (
+	'category' => {
+	    'default' => 'core',
+	    'ok'      => 'install',
+	    'opts'    => [qw(core docs install library utilities)], # patch, notabug
+	},
+	'severity' => {
+	    'default' => 'low',
+	    'ok'      => 'none',
+	    'opts'    => [qw(critical high medium low wishlist none)], # zero
+	},
+    );
+    die "Invalid alternative($name) requested\n" unless grep(/^$name$/, keys %alts);
+    my $alt = "";
+    if ($ok) {
+	$alt = $alts{$name}{'ok'};
+    } else {
+ 	my @alts = @{$alts{$name}{'opts'}};
+	paraprint <<EOF;
+Please pick a \u$name from the following:
+
+    @alts
+
+EOF
+	my $err = 0;
+	do {
+	    if ($err++ > 5) {
+		die "Invalid $name: aborting.\n";
+	    }
+	    print "Please enter a \u$name [$alts{$name}{'default'}]: ";
+	    $alt = <>;
+	    chomp $alt;
+	    if ($alt =~ /^\s*$/) {
+		$alt = $alts{$name}{'default'};
+	    }
+	} while !((($alt) = grep(/^$alt/i, @alts)));
+    }
+    lc $alt;
+}
+
+sub Init {
+    # -------- Setup --------
+
+    $Is_MSWin32 = $^O eq 'MSWin32';
+    $Is_VMS = $^O eq 'VMS';
+    $Is_Linux = lc($^O) eq 'linux';
+    $Is_OpenBSD = lc($^O) eq 'openbsd';
+    $Is_MacOS = $^O eq 'MacOS';
+
+    @ARGV = split m/\s+/,
+        MacPerl::Ask('Provide command-line args here (-h for help):')
+        if $Is_MacOS && $MacPerl::Version =~ /App/;
+
+    if (!getopts("Adhva:s:b:f:F:r:e:SCc:to:n:")) { Help(); exit; };
+
+    # This comment is needed to notify metaconfig that we are
+    # using the $perladmin, $cf_by, and $cf_time definitions.
+
+    # -------- Configuration ---------
+
+    # perlbug address
+    $perlbug = 'perlbug@perl.org';
+
+    # Test address
+    $testaddress = 'perlbug-test@perl.org';
+
+    # Target address
+    $address = $::opt_a || ($::opt_t ? $testaddress : $perlbug);
+
+    # Users address, used in message and in Reply-To header
+    $from = $::opt_r || "";
+
+    # Include verbose configuration information
+    $verbose = $::opt_v || 0;
+
+    # Subject of bug-report message
+    $subject = $::opt_s || "";
+
+    # Send a file
+    $usefile = ($::opt_f || 0);
+
+    # File to send as report
+    $file = $::opt_f || "";
+
+    # File to output to
+    $outfile = $::opt_F || "";
+
+    # Body of report
+    $body = $::opt_b || "";
+	
+    # Editor
+    $ed = $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT}
+	|| ($Is_VMS && "edit/tpu")
+	|| ($Is_MSWin32 && "notepad")
+	|| ($Is_MacOS && '')
+	|| "vi";
+
+    # Not OK - provide build failure template by finessing OK report
+    if ($::opt_n) {
+	if (substr($::opt_n, 0, 2) eq 'ok' )	{
+	    $::opt_o = substr($::opt_n, 1);
+	} else {
+	    Help();
+	    exit();
+	}
+    }
+
+    # OK - send "OK" report for build on this system
+    $ok = 0;
+    if ($::opt_o) {
+	if ($::opt_o eq 'k' or $::opt_o eq 'kay') {
+	    my $age = time - $patchlevel_date;
+	    if ($::opt_o eq 'k' and $age > 60 * 24 * 60 * 60 ) {
+		my $date = localtime $patchlevel_date;
+		print <<"EOF";
+"perlbug -ok" and "perlbug -nok" do not report on Perl versions which
+are more than 60 days old.  This Perl version was constructed on
+$date.  If you really want to report this, use
+"perlbug -okay" or "perlbug -nokay".
+EOF
+		exit();
+	    }
+	    # force these options
+	    unless ($::opt_n) {
+		$::opt_S = 1; # don't prompt for send
+		$::opt_b = 1; # we have a body
+		$body = "Perl reported to build OK on this system.\n";
+	    }
+	    $::opt_C = 1; # don't send a copy to the local admin
+	    $::opt_s = 1; # we have a subject line
+	    $subject = ($::opt_n ? 'Not ' : '')
+		    . "OK: perl $perl_version ${patch_tags}on"
+		    ." $::Config{'archname'} $::Config{'osvers'} $subject";
+	    $ok = 1;
+	} else {
+	    Help();
+	    exit();
+	}
+    }
+
+    # Possible administrator addresses, in order of confidence
+    # (Note that cf_email is not mentioned to metaconfig, since
+    # we don't really want it. We'll just take it if we have to.)
+    #
+    # This has to be after the $ok stuff above because of the way
+    # that $::opt_C is forced.
+    $cc = $::opt_C ? "" : (
+	$::opt_c || $::Config{'perladmin'}
+	|| $::Config{'cf_email'} || $::Config{'cf_by'}
+    );
+
+    if ($::HaveUtil) {
+		$domain = Mail::Util::maildomain();
+    } elsif ($Is_MSWin32) {
+		$domain = $ENV{'USERDOMAIN'};
+    } else {
+		require Sys::Hostname;
+		$domain = Sys::Hostname::hostname();
+    }
+
+    # Message-Id - rjsf
+    $messageid = "<$::Config{'version'}_${$}_".time."\@$domain>"; 
+
+    # My username
+    $me = $Is_MSWin32 ? $ENV{'USERNAME'}
+	    : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'}
+	    : $Is_MacOS ? $ENV{'USER'}
+	    : eval { getpwuid($<) };	# May be missing
+
+    $from = $::Config{'cf_email'}
+       if !$from && $::Config{'cf_email'} && $::Config{'cf_by'} && $me &&
+               ($me eq $::Config{'cf_by'});
+} # sub Init
+
+sub Query {
+    # Explain what perlbug is
+    unless ($ok) {
+	paraprint <<EOF;
+This program provides an easy way to create a message reporting a bug
+in perl, and e-mail it to $address.  It is *NOT* intended for
+sending test messages or simply verifying that perl works, *NOR* is it
+intended for reporting bugs in third-party perl modules.  It is *ONLY*
+a means of reporting verifiable problems with the core perl distribution,
+and any solutions to such problems, to the people who maintain perl.
+
+If you're just looking for help with perl, try posting to the Usenet
+newsgroup comp.lang.perl.misc.  If you're looking for help with using
+perl with CGI, try posting to comp.infosystems.www.programming.cgi.
+EOF
+    }
+
+    # Prompt for subject of message, if needed
+    
+    if (TrivialSubject($subject)) {
+	$subject = '';
+    }
+
+    unless ($subject) {
+	paraprint <<EOF;
+First of all, please provide a subject for the
+message. It should be a concise description of
+the bug or problem. "perl bug" or "perl problem"
+is not a concise description.
+EOF
+
+	my $err = 0;
+	do {
+	    print "Subject: ";
+	    $subject = <>;
+	    chomp $subject;
+	    if ($err++ == 5) {
+		die "Aborting.\n";
+	    }
+	} while (TrivialSubject($subject));
+    }
+
+    # Prompt for return address, if needed
+    unless ($from) {
+	# Try and guess return address
+	my $guess;
+
+	$guess = $ENV{'REPLY-TO'} || $ENV{'REPLYTO'} || '';
+        if ($Is_MacOS) {
+            require Mac::InternetConfig;
+            $guess = $Mac::InternetConfig::InternetConfig{
+                Mac::InternetConfig::kICEmail()
+            };
+        }
+
+	unless ($guess) {
+		# move $domain to where we can use it elsewhere	
+        if ($domain) {
+		if ($Is_VMS && !$::Config{'d_socket'}) {
+		    $guess = "$domain\:\:$me";
+		} else {
+		    $guess = "$me\@$domain" if $domain;
+		}
+	    }
+	}
+
+	if ($guess) {
+	    unless ($ok) {
+		paraprint <<EOF;
+Your e-mail address will be useful if you need to be contacted. If the
+default shown is not your full internet e-mail address, please correct it.
+EOF
+	    }
+	} else {
+	    paraprint <<EOF;
+So that you may be contacted if necessary, please enter
+your full internet e-mail address here.
+EOF
+	}
+
+	if ($ok && $guess) {
+	    # use it
+	    $from = $guess;
+	} else {
+	    # verify it
+	    print "Your address [$guess]: ";
+	    $from = <>;
+	    chomp $from;
+	    $from = $guess if $from eq '';
+	}
+    }
+
+    if ($from eq $cc or $me eq $cc) {
+	# Try not to copy ourselves
+	$cc = "yourself";
+    }
+
+    # Prompt for administrator address, unless an override was given
+    if( !$::opt_C and !$::opt_c ) {
+	paraprint <<EOF;
+A copy of this report can be sent to your local
+perl administrator. If the address is wrong, please
+correct it, or enter 'none' or 'yourself' to not send
+a copy.
+EOF
+	print "Local perl administrator [$cc]: ";
+	my $entry = scalar <>;
+	chomp $entry;
+
+	if ($entry ne "") {
+	    $cc = $entry;
+	    $cc = '' if $me eq $cc;
+	}
+    }
+
+    $cc = '' if $cc =~ /^(none|yourself|me|myself|ourselves)$/i;
+    $andcc = " and $cc" if $cc;
+
+    # Prompt for editor, if no override is given
+editor:
+    unless ($::opt_e || $::opt_f || $::opt_b) {
+	paraprint <<EOF;
+Now you need to supply the bug report. Try to make
+the report concise but descriptive. Include any
+relevant detail. If you are reporting something
+that does not work as you think it should, please
+try to include example of both the actual
+result, and what you expected.
+
+Some information about your local
+perl configuration will automatically be included
+at the end of the report. If you are using any
+unusual version of perl, please try and confirm
+exactly which versions are relevant.
+
+You will probably want to use an editor to enter
+the report. If "$ed" is the editor you want
+to use, then just press Enter, otherwise type in
+the name of the editor you would like to use.
+
+If you would like to use a prepared file, type
+"file", and you will be asked for the filename.
+EOF
+	print "Editor [$ed]: ";
+	my $entry =scalar <>;
+	chomp $entry;
+
+	$usefile = 0;
+	if ($entry eq "file") {
+	    $usefile = 1;
+	} elsif ($entry ne "") {
+	    $ed = $entry;
+	}
+    }
+
+    # Prompt for category of bug
+    $category ||= ask_for_alternatives('category');
+
+    # Prompt for severity of bug
+    $severity ||= ask_for_alternatives('severity');
+
+    # Generate scratch file to edit report in
+    $filename = filename();
+
+    # Prompt for file to read report from, if needed
+    if ($usefile and !$file) {
+filename:
+	paraprint <<EOF;
+What is the name of the file that contains your report?
+EOF
+	print "Filename: ";
+	my $entry = scalar <>;
+	chomp $entry;
+
+	if ($entry eq "") {
+	    paraprint <<EOF;
+No filename? I'll let you go back and choose an editor again.
+EOF
+	    goto editor;
+	}
+
+	unless (-f $entry and -r $entry) {
+	    paraprint <<EOF;
+I'm sorry, but I can't read from `$entry'. Maybe you mistyped the name of
+the file? If you don't want to send a file, just enter a blank line and you
+can get back to the editor selection.
+EOF
+	    goto filename;
+	}
+	$file = $entry;
+    }
+
+    # Generate report
+    open(REP,">$filename") or die "Unable to create report file `$filename': $!\n";
+    my $reptype = !$ok ? "bug" : $::opt_n ? "build failure" : "success";
+
+    print REP <<EOF;
+This is a $reptype report for perl from $from,
+generated with the help of perlbug $Version running under perl $perl_version.
+
+EOF
+
+    if ($body) {
+	print REP $body;
+    } elsif ($usefile) {
+	open(F, "<$file")
+		or die "Unable to read report file from `$file': $!\n";
+	while (<F>) {
+	    print REP $_
+	}
+	close(F) or die "Error closing `$file': $!";
+    } else {
+	print REP <<EOF;
+
+-----------------------------------------------------------------
+[Please enter your report here]
+
+
+
+[Please do not change anything below this line]
+-----------------------------------------------------------------
+EOF
+    }
+    Dump(*REP);
+    close(REP) or die "Error closing report file: $!";
+
+    # read in the report template once so that
+    # we can track whether the user does any editing.
+    # yes, *all* whitespace is ignored.
+    open(REP, "<$filename") or die "Unable to open report file `$filename': $!\n";
+    while (<REP>) {
+	s/\s+//g;
+	$REP{$_}++;
+    }
+    close(REP) or die "Error closing report file `$filename': $!";
+} # sub Query
+
+sub Dump {
+    local(*OUT) = @_;
+
+    print OUT <<EFF;
+---
+Flags:
+    category=$category
+    severity=$severity
+EFF
+    if ($::opt_A) {
+	print OUT <<EFF;
+    ack=no
+EFF
+    }
+    print OUT <<EFF;
+---
+EFF
+    print OUT "This perlbug was built using Perl $config_tag1\n",
+	    "It is being executed now by  Perl $config_tag2.\n\n"
+	if $config_tag2 ne $config_tag1;
+
+    print OUT <<EOF;
+Site configuration information for perl $perl_version:
+
+EOF
+    if ($::Config{cf_by} and $::Config{cf_time}) {
+	print OUT "Configured by $::Config{cf_by} at $::Config{cf_time}.\n\n";
+    }
+    print OUT Config::myconfig;
+
+    if (@patches) {
+	print OUT join "\n    ", "Locally applied patches:", @patches;
+	print OUT "\n";
+    };
+
+    print OUT <<EOF;
+
+---
+\@INC for perl $perl_version:
+EOF
+    for my $i (@INC) {
+	print OUT "    $i\n";
+    }
+
+    print OUT <<EOF;
+
+---
+Environment for perl $perl_version:
+EOF
+    my @env =
+        qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE);
+    push @env, $Config{ldlibpthname} if $Config{ldlibpthname} ne '';
+    push @env, grep /^(?:PERL|LC_|LANG|CYGWIN)/, keys %ENV;
+    my %env;
+    @env{@env} = @env;
+    for my $env (sort keys %env) {
+	print OUT "    $env",
+		exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)',
+		"\n";
+    }
+    if ($verbose) {
+	print OUT "\nComplete configuration data for perl $perl_version:\n\n";
+	my $value;
+	foreach (sort keys %::Config) {
+	    $value = $::Config{$_};
+	    $value =~ s/'/\\'/g;
+	    print OUT "$_='$value'\n";
+	}
+    }
+} # sub Dump
+
+sub Edit {
+    # Edit the report
+    if ($usefile || $body) {
+	paraprint <<EOF;
+Please make sure that the name of the editor you want to use is correct.
+EOF
+	print "Editor [$ed]: ";
+	my $entry =scalar <>;
+	chomp $entry;
+	$ed = $entry unless $entry eq '';
+    }
+
+tryagain:
+    my $sts;
+    $sts = system("$ed $filename") unless $Is_MacOS;
+    if ($Is_MacOS) {
+        require ExtUtils::MakeMaker;
+        ExtUtils::MM_MacOS::launch_file($filename);
+        paraprint <<EOF;
+Press Enter when done.
+EOF
+        scalar <>;
+    }
+    if ($sts) {
+	paraprint <<EOF;
+The editor you chose (`$ed') could apparently not be run!
+Did you mistype the name of your editor? If so, please
+correct it here, otherwise just press Enter.
+EOF
+	print "Editor [$ed]: ";
+	my $entry =scalar <>;
+	chomp $entry;
+
+	if ($entry ne "") {
+	    $ed = $entry;
+	    goto tryagain;
+	} else {
+	    paraprint <<EOF;
+You may want to save your report to a file, so you can edit and mail it
+yourself.
+EOF
+	}
+    }
+
+    return if ($ok and not $::opt_n) || $body;
+    # Check that we have a report that has some, eh, report in it.
+    my $unseen = 0;
+
+    open(REP, "<$filename") or die "Couldn't open `$filename': $!\n";
+    # a strange way to check whether any significant editing
+    # have been done: check whether any new non-empty lines
+    # have been added. Yes, the below code ignores *any* space
+    # in *any* line.
+    while (<REP>) {
+	s/\s+//g;
+	$unseen++ if $_ ne '' and not exists $REP{$_};
+    }
+
+    while ($unseen == 0) {
+	paraprint <<EOF;
+I am sorry but it looks like you did not report anything.
+EOF
+	print "Action (Retry Edit/Cancel) ";
+	my ($action) = scalar(<>);
+	if ($action =~ /^[re]/i) { # <R>etry <E>dit
+	    goto tryagain;
+	} elsif ($action =~ /^[cq]/i) { # <C>ancel, <Q>uit
+	    Cancel();
+	}
+    }
+} # sub Edit
+
+sub Cancel {
+    1 while unlink($filename);  # remove all versions under VMS
+    print "\nCancelling.\n";
+    exit(0);
+}
+
+sub NowWhat {
+    # Report is done, prompt for further action
+    if( !$::opt_S ) {
+	while(1) {
+	    paraprint <<EOF;
+Now that you have completed your report, would you like to send
+the message to $address$andcc, display the message on
+the screen, re-edit it, display/change the subject,
+or cancel without sending anything?
+You may also save the message as a file to mail at another time.
+EOF
+      retry:
+	    print "Action (Send/Display/Edit/Subject/Save to File): ";
+	    my $action = scalar <>;
+	    chomp $action;
+
+	    if ($action =~ /^(f|sa)/i) { # <F>ile/<Sa>ve
+		my $file_save = $outfile || "perlbug.rep";
+		print "\n\nName of file to save message in [$file_save]: ";
+		my $file = scalar <>;
+		chomp $file;
+		$file = $file_save if $file eq "";
+
+		unless (open(FILE, ">$file")) {
+		    print "\nError opening $file: $!\n\n";
+		    goto retry;
+		}
+		open(REP, "<$filename") or die "Couldn't open file `$filename': $!\n";
+		print FILE "To: $address\nSubject: $subject\n";
+		print FILE "Cc: $cc\n" if $cc;
+		print FILE "Reply-To: $from\n" if $from;
+		print FILE "Message-Id: $messageid\n" if $messageid;
+		print FILE "\n";
+		while (<REP>) { print FILE }
+		close(REP) or die "Error closing report file `$filename': $!";
+		close(FILE) or die "Error closing $file: $!";
+
+		print "\nMessage saved in `$file'.\n";
+		exit;
+	    } elsif ($action =~ /^(d|l|sh)/i ) { # <D>isplay, <L>ist, <Sh>ow
+		# Display the message
+		open(REP, "<$filename") or die "Couldn't open file `$filename': $!\n";
+		while (<REP>) { print $_ }
+		close(REP) or die "Error closing report file `$filename': $!";
+	    } elsif ($action =~ /^su/i) { # <Su>bject
+		print "Subject: $subject\n";
+		print "If the above subject is fine, just press Enter.\n";
+		print "If not, type in the new subject.\n";
+		print "Subject: ";
+		my $reply = scalar <STDIN>;
+		chomp $reply;
+		if ($reply ne '') {
+		    unless (TrivialSubject($reply)) {
+			$subject = $reply;
+			print "Subject: $subject\n";
+		    }
+		}
+	    } elsif ($action =~ /^se/i) { # <S>end
+		# Send the message
+		print "Are you certain you want to send this message?\n"
+		    . 'Please type "yes" if you are: ';
+		my $reply = scalar <STDIN>;
+		chomp $reply;
+		if ($reply eq "yes") {
+		    last;
+		} else {
+		    paraprint <<EOF;
+That wasn't a clear "yes", so I won't send your message. If you are sure
+your message should be sent, type in "yes" (without the quotes) at the
+confirmation prompt.
+EOF
+		}
+	    } elsif ($action =~ /^[er]/i) { # <E>dit, <R>e-edit
+		# edit the message
+		Edit();
+	    } elsif ($action =~ /^[qc]/i) { # <C>ancel, <Q>uit
+		Cancel();
+	    } elsif ($action =~ /^s/i) {
+		paraprint <<EOF;
+I'm sorry, but I didn't understand that. Please type "send" or "save".
+EOF
+	    }
+	}
+    }
+} # sub NowWhat
+
+sub TrivialSubject {
+    my $subject = shift;
+    if ($subject =~
+	/^(y(es)?|no?|help|perl( (bug|problem))?|bug|problem)$/i ||
+	length($subject) < 4 ||
+	$subject !~ /\s/) {
+	print "\nThat doesn't look like a good subject.  Please be more verbose.\n\n";
+        return 1;
+    } else {
+	return 0;
+    }
+}
+
+sub Send {
+    # Message has been accepted for transmission -- Send the message
+    if ($outfile) {
+	open SENDMAIL, ">$outfile" or die "Couldn't open '$outfile': $!\n";
+	goto sendout;
+    }
+
+    # on linux certain mail implementations won't accept the subject
+    # as "~s subject" and thus the Subject header will be corrupted
+    # so don't use Mail::Send to be safe
+    if ($::HaveSend && !$Is_Linux && !$Is_OpenBSD) {
+	$msg = new Mail::Send Subject => $subject, To => $address;
+	$msg->cc($cc) if $cc;
+	$msg->add("Reply-To",$from) if $from;
+
+	$fh = $msg->open;
+	open(REP, "<$filename") or die "Couldn't open `$filename': $!\n";
+	while (<REP>) { print $fh $_ }
+	close(REP) or die "Error closing $filename: $!";
+	$fh->close;
+
+	print "\nMessage sent.\n";
+    } elsif ($Is_VMS) {
+	if ( ($address =~ /@/ and $address !~ /^\w+%"/) or
+	     ($cc      =~ /@/ and $cc      !~ /^\w+%"/) ) {
+	    my $prefix;
+	    foreach (qw[ IN MX SMTP UCX PONY WINS ], '') {
+		$prefix = "$_%", last if $ENV{"MAIL\$PROTOCOL_$_"};
+	    }
+	    $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/;
+	    $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/;
+	}
+	$subject =~ s/"/""/g; $address =~ s/"/""/g; $cc =~ s/"/""/g;
+	my $sts = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]);
+	if ($sts) {
+	    die <<EOF;
+Can't spawn off mail
+	(leaving bug report in $filename): $sts
+EOF
+	}
+    } else {
+	my $sendmail = "";
+	for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) {
+	    $sendmail = $_, last if -e $_;
+	}
+	if ($^O eq 'os2' and $sendmail eq "") {
+	    my $path = $ENV{PATH};
+	    $path =~ s:\\:/: ;
+	    my @path = split /$Config{'path_sep'}/, $path;
+	    for (@path) {
+		$sendmail = "$_/sendmail", last if -e "$_/sendmail";
+		$sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe";
+	    }
+	}
+
+	paraprint(<<"EOF"), die "\n" if $sendmail eq "";
+I am terribly sorry, but I cannot find sendmail, or a close equivalent, and
+the perl package Mail::Send has not been installed, so I can't send your bug
+report. We apologize for the inconvenience.
+
+So you may attempt to find some way of sending your message, it has
+been left in the file `$filename'.
+EOF
+	open(SENDMAIL, "|$sendmail -t -oi") || die "'|$sendmail -t -oi' failed: $!";
+sendout:
+	print SENDMAIL "To: $address\n";
+	print SENDMAIL "Subject: $subject\n";
+	print SENDMAIL "Cc: $cc\n" if $cc;
+	print SENDMAIL "Reply-To: $from\n" if $from;
+	print SENDMAIL "Message-Id: $messageid\n" if $messageid;
+	print SENDMAIL "\n\n";
+	open(REP, "<$filename") or die "Couldn't open `$filename': $!\n";
+	while (<REP>) { print SENDMAIL $_ }
+	close(REP) or die "Error closing $filename: $!";
+
+	if (close(SENDMAIL)) {
+	    printf "\nMessage %s.\n", $outfile ? "saved" : "sent";
+	} else {
+	    warn "\nSendmail returned status '", $? >> 8, "'\n";
+	}
+    }
+    1 while unlink($filename);  # remove all versions under VMS
+} # sub Send
+
+sub Help {
+    print <<EOF;
+
+A program to help generate bug reports about perl5, and mail them.
+It is designed to be used interactively. Normally no arguments will
+be needed.
+
+Usage:
+$0  [-v] [-a address] [-s subject] [-b body | -f inpufile ] [ -F outputfile ]
+    [-r returnaddress] [-e editor] [-c adminaddress | -C] [-S] [-t] [-h]
+$0  [-v] [-r returnaddress] [-A] [-ok | -okay | -nok | -nokay]
+
+Simplest usage:  run "$0", and follow the prompts.
+
+Options:
+
+  -v    Include Verbose configuration data in the report
+  -f    File containing the body of the report. Use this to
+        quickly send a prepared message.
+  -F    File to output the resulting mail message to, instead of mailing.
+  -S    Send without asking for confirmation.
+  -a    Address to send the report to. Defaults to `$address'.
+  -c    Address to send copy of report to. Defaults to `$cc'.
+  -C    Don't send copy to administrator.
+  -s    Subject to include with the message. You will be prompted
+        if you don't supply one on the command line.
+  -b    Body of the report. If not included on the command line, or
+        in a file with -f, you will get a chance to edit the message.
+  -r    Your return address. The program will ask you to confirm
+        this if you don't give it here.
+  -e    Editor to use.
+  -t    Test mode. The target address defaults to `$testaddress'.
+  -d    Data mode.  This prints out your configuration data, without mailing
+        anything. You can use this with -v to get more complete data.
+  -A    Don't send a bug received acknowledgement to the return address.
+  -ok   Report successful build on this system to perl porters
+        (use alone or with -v). Only use -ok if *everything* was ok:
+        if there were *any* problems at all, use -nok.
+  -okay As -ok but allow report from old builds.
+  -nok  Report unsuccessful build on this system to perl porters
+        (use alone or with -v). You must describe what went wrong
+        in the body of the report which you will be asked to edit.
+  -nokay As -nok but allow report from old builds.
+  -h    Print this help message.
+
+EOF
+}
+
+sub filename {
+    if ($::HaveTemp) {
+	# Good. Use a secure temp file
+	my ($fh, $filename) = File::Temp::tempfile(UNLINK => 1);
+	close($fh);
+	return $filename;
+    } else {
+	# Bah. Fall back to doing things less securely.
+	my $dir = File::Spec->tmpdir();
+	$filename = "bugrep0$$";
+	$filename++ while -e File::Spec->catfile($dir, $filename);
+	$filename = File::Spec->catfile($dir, $filename);
+    }
+}
+
+sub paraprint {
+    my @paragraphs = split /\n{2,}/, "@_";
+    print "\n\n";
+    for (@paragraphs) {   # implicit local $_
+	s/(\S)\s*\n/$1 /g;
+	write;
+	print "\n";
+    }
+}
+
+format STDOUT =
+^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
+$_
+.
+
+__END__
+
+=head1 NAME
+
+perlbug - how to submit bug reports on Perl
+
+=head1 SYNOPSIS
+
+B<perlbug> S<[ B<-v> ]> S<[ B<-a> I<address> ]> S<[ B<-s> I<subject> ]>
+S<[ B<-b> I<body> | B<-f> I<inputfile> ]> S<[ B<-F> I<outputfile> ]>
+S<[ B<-r> I<returnaddress> ]>
+S<[ B<-e> I<editor> ]> S<[ B<-c> I<adminaddress> | B<-C> ]>
+S<[ B<-S> ]> S<[ B<-t> ]>  S<[ B<-d> ]>  S<[ B<-A> ]>  S<[ B<-h> ]>
+
+B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]>
+ S<[ B<-A> ]> S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]>
+
+=head1 DESCRIPTION
+
+A program to help generate bug reports about perl or the modules that
+come with it, and mail them.
+
+If you have found a bug with a non-standard port (one that was not part
+of the I<standard distribution>), a binary distribution, or a
+non-standard module (such as Tk, CGI, etc), then please see the
+documentation that came with that distribution to determine the correct
+place to report bugs.
+
+C<perlbug> is designed to be used interactively. Normally no arguments
+will be needed.  Simply run it, and follow the prompts.
+
+If you are unable to run B<perlbug> (most likely because you don't have
+a working setup to send mail that perlbug recognizes), you may have to
+compose your own report, and email it to B<perlbug@perl.org>.  You might
+find the B<-d> option useful to get summary information in that case.
+
+In any case, when reporting a bug, please make sure you have run through
+this checklist:
+
+=over 4
+
+=item What version of Perl you are running?
+
+Type C<perl -v> at the command line to find out.
+
+=item Are you running the latest released version of perl?
+
+Look at http://www.perl.com/ to find out.  If it is not the latest
+released version, get that one and see whether your bug has been
+fixed.  Note that bug reports about old versions of Perl, especially
+those prior to the 5.0 release, are likely to fall upon deaf ears.
+You are on your own if you continue to use perl1 .. perl4.
+
+=item Are you sure what you have is a bug?
+
+A significant number of the bug reports we get turn out to be documented
+features in Perl.  Make sure the behavior you are witnessing doesn't fall
+under that category, by glancing through the documentation that comes
+with Perl (we'll admit this is no mean task, given the sheer volume of
+it all, but at least have a look at the sections that I<seem> relevant).
+
+Be aware of the familiar traps that perl programmers of various hues
+fall into.  See L<perltrap>.
+
+Check in L<perldiag> to see what any Perl error message(s) mean.
+If message isn't in perldiag, it probably isn't generated by Perl.
+Consult your operating system documentation instead.
+
+If you are on a non-UNIX platform check also L<perlport>, as some
+features may be unimplemented or work differently.
+
+Try to study the problem under the Perl debugger, if necessary.
+See L<perldebug>.
+
+=item Do you have a proper test case?
+
+The easier it is to reproduce your bug, the more likely it will be
+fixed, because if no one can duplicate the problem, no one can fix it.
+A good test case has most of these attributes: fewest possible number
+of lines; few dependencies on external commands, modules, or
+libraries; runs on most platforms unimpeded; and is self-documenting.
+
+A good test case is almost always a good candidate to be on the perl
+test suite.  If you have the time, consider making your test case so
+that it will readily fit into the standard test suite.
+
+Remember also to include the B<exact> error messages, if any.
+"Perl complained something" is not an exact error message.
+
+If you get a core dump (or equivalent), you may use a debugger
+(B<dbx>, B<gdb>, etc) to produce a stack trace to include in the bug
+report.  NOTE: unless your Perl has been compiled with debug info
+(often B<-g>), the stack trace is likely to be somewhat hard to use
+because it will most probably contain only the function names and not
+their arguments.  If possible, recompile your Perl with debug info and
+reproduce the dump and the stack trace.
+
+=item Can you describe the bug in plain English?
+
+The easier it is to understand a reproducible bug, the more likely it
+will be fixed.  Anything you can provide by way of insight into the
+problem helps a great deal.  In other words, try to analyze the
+problem (to the extent you can) and report your discoveries.
+
+=item Can you fix the bug yourself?
+
+A bug report which I<includes a patch to fix it> will almost
+definitely be fixed.  Use the C<diff> program to generate your patches
+(C<diff> is being maintained by the GNU folks as part of the B<diffutils>
+package, so you should be able to get it from any of the GNU software
+repositories).  If you do submit a patch, the cool-dude counter at
+perlbug@perl.org will register you as a savior of the world.  Your
+patch may be returned with requests for changes, or requests for more
+detailed explanations about your fix.
+
+Here are some clues for creating quality patches: Use the B<-c> or
+B<-u> switches to the diff program (to create a so-called context or
+unified diff).  Make sure the patch is not reversed (the first
+argument to diff is typically the original file, the second argument
+your changed file).  Make sure you test your patch by applying it with
+the C<patch> program before you send it on its way.  Try to follow the
+same style as the code you are trying to patch.  Make sure your patch
+really does work (C<make test>, if the thing you're patching supports
+it).
+
+=item Can you use C<perlbug> to submit the report?
+
+B<perlbug> will, amongst other things, ensure your report includes
+crucial information about your version of perl.  If C<perlbug> is unable
+to mail your report after you have typed it in, you may have to compose
+the message yourself, add the output produced by C<perlbug -d> and email
+it to B<perlbug@perl.org>.  If, for some reason, you cannot run
+C<perlbug> at all on your system, be sure to include the entire output
+produced by running C<perl -V> (note the uppercase V).
+
+Whether you use C<perlbug> or send the email manually, please make
+your Subject line informative.  "a bug" not informative.  Neither is
+"perl crashes" nor "HELP!!!".  These don't help.
+A compact description of what's wrong is fine.
+
+=back
+
+Having done your bit, please be prepared to wait, to be told the bug
+is in your code, or even to get no reply at all.  The Perl maintainers
+are busy folks, so if your problem is a small one or if it is difficult
+to understand or already known, they may not respond with a personal reply.
+If it is important to you that your bug be fixed, do monitor the
+C<Changes> file in any development releases since the time you submitted
+the bug, and encourage the maintainers with kind words (but never any
+flames!).  Feel free to resend your bug report if the next released
+version of perl comes out and your bug is still present.
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-a>
+
+Address to send the report to.  Defaults to B<perlbug@perl.org>.
+
+=item B<-A>
+
+Don't send a bug received acknowledgement to the reply address.
+Generally it is only a sensible to use this option if you are a
+perl maintainer actively watching perl porters for your message to
+arrive.
+
+=item B<-b>
+
+Body of the report.  If not included on the command line, or
+in a file with B<-f>, you will get a chance to edit the message.
+
+=item B<-C>
+
+Don't send copy to administrator.
+
+=item B<-c>
+
+Address to send copy of report to.  Defaults to the address of the
+local perl administrator (recorded when perl was built).
+
+=item B<-d>
+
+Data mode (the default if you redirect or pipe output).  This prints out
+your configuration data, without mailing anything.  You can use this
+with B<-v> to get more complete data.
+
+=item B<-e>
+
+Editor to use.
+
+=item B<-f>
+
+File containing the body of the report.  Use this to quickly send a
+prepared message.
+
+=item B<-F>
+
+File to output the results to instead of sending as an email. Useful
+particularly when running perlbug on a machine with no direct internet
+connection.
+
+=item B<-h>
+
+Prints a brief summary of the options.
+
+=item B<-ok>
+
+Report successful build on this system to perl porters. Forces B<-S>
+and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only
+prompts for a return address if it cannot guess it (for use with
+B<make>). Honors return address specified with B<-r>.  You can use this
+with B<-v> to get more complete data.   Only makes a report if this
+system is less than 60 days old.
+
+=item B<-okay>
+
+As B<-ok> except it will report on older systems.
+
+=item B<-nok>
+
+Report unsuccessful build on this system.  Forces B<-C>.  Forces and
+supplies a value for B<-s>, then requires you to edit the report
+and say what went wrong.  Alternatively, a prepared report may be
+supplied using B<-f>.  Only prompts for a return address if it
+cannot guess it (for use with B<make>). Honors return address
+specified with B<-r>.  You can use this with B<-v> to get more
+complete data.  Only makes a report if this system is less than 60
+days old.
+
+=item B<-nokay>
+
+As B<-nok> except it will report on older systems.
+
+=item B<-r>
+
+Your return address.  The program will ask you to confirm its default
+if you don't use this option.
+
+=item B<-S>
+
+Send without asking for confirmation.
+
+=item B<-s>
+
+Subject to include with the message.  You will be prompted if you don't
+supply one on the command line.
+
+=item B<-t>
+
+Test mode.  The target address defaults to B<perlbug-test@perl.org>.
+
+=item B<-v>
+
+Include verbose configuration data in the report.
+
+=back
+
+=head1 AUTHORS
+
+Kenneth Albanowski (E<lt>kjahds@kjahds.comE<gt>), subsequently I<doc>tored
+by Gurusamy Sarathy (E<lt>gsar@activestate.comE<gt>), Tom Christiansen
+(E<lt>tchrist@perl.comE<gt>), Nathan Torkington (E<lt>gnat@frii.comE<gt>),
+Charles F. Randall (E<lt>cfr@pobox.comE<gt>), Mike Guy
+(E<lt>mjtg@cam.a.ukE<gt>), Dominic Dunlop (E<lt>domo@computer.orgE<gt>),
+Hugo van der Sanden (E<lt>hv@crypt.org<gt>),
+Jarkko Hietaniemi (E<lt>jhi@iki.fiE<gt>), Chris Nandor
+(E<lt>pudge@pobox.comE<gt>), Jon Orwant (E<lt>orwant@media.mit.eduE<gt>,
+and Richard Foley (E<lt>richard@rfi.netE<gt>).
+
+=head1 SEE ALSO
+
+perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1),
+diff(1), patch(1), dbx(1), gdb(1)
+
+=head1 BUGS
+
+None known (guess what must have been used to report them?)
+
+=cut
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/perlcc.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/perlcc.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/perlcc.bat	(revision 14489)
@@ -0,0 +1,666 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+    if $running_under_some_shell;
+--$running_under_some_shell;
+
+# Version 2.0, Simon Cozens, Thu Mar 30 17:52:45 JST 2000 
+# Version 2.01, Tom Christiansen, Thu Mar 30 08:25:14 MST 2000
+# Version 2.02, Simon Cozens, Sun Apr 16 01:53:36 JST 2000
+# Version 2.03, Edward Peschko, Mon Feb 26 12:04:17 PST 2001
+# Version 2.04, Enache Adrian,Fri, 18 Jul 2003 23:15:37 +0300
+
+use strict;
+use warnings;
+use 5.006_000;
+
+use FileHandle;
+use Config;
+use Fcntl qw(:DEFAULT :flock);
+use File::Temp qw(tempfile);
+use Cwd;
+our $VERSION = 2.04;
+$| = 1;
+
+$SIG{INT} = sub { exit(); }; # exit gracefully and clean up after ourselves.
+
+use subs qw{
+    cc_harness check_read check_write checkopts_byte choose_backend
+    compile_byte compile_cstyle compile_module generate_code
+    grab_stash parse_argv sanity_check vprint yclept spawnit
+};
+sub opt(*); # imal quoting
+sub is_win32();
+sub is_msvc();
+
+our ($Options, $BinPerl, $Backend);
+our ($Input => $Output);
+our ($logfh);
+our ($cfile);
+our (@begin_output); # output from BEGIN {}, for testsuite
+
+# eval { main(); 1 } or die;
+
+main();
+
+sub main {
+    parse_argv();
+    check_write($Output);
+    choose_backend();
+    generate_code();
+    run_code();
+    _die("XXX: Not reached?");
+}
+
+#######################################################################
+
+sub choose_backend {
+    # Choose the backend.
+    $Backend = 'C';
+    if (opt(B)) {
+        checkopts_byte();
+        $Backend = 'Bytecode';
+    }
+    if (opt(S) && opt(c)) {
+        # die "$0: Do you want me to compile this or not?\n";
+        delete $Options->{S};
+    }
+    $Backend = 'CC' if opt(O);
+}
+
+
+sub generate_code { 
+
+    vprint 0, "Compiling $Input";
+
+    $BinPerl  = yclept();  # Calling convention for perl.
+
+    if (opt(shared)) {
+        compile_module();
+    } else {
+        if ($Backend eq 'Bytecode') {
+            compile_byte();
+        } else {
+            compile_cstyle();
+        }
+    }
+    exit(0) if (!opt('r'));
+}
+
+sub run_code {
+    vprint 0, "Running code";
+    run("$Output @ARGV");
+    exit(0);
+}
+
+# usage: vprint [level] msg args
+sub vprint {
+    my $level;
+    if (@_ == 1) {
+        $level = 1;
+    } elsif ($_[0] =~ /^\d$/) {
+        $level = shift;
+    } else {
+        # well, they forgot to use a number; means >0
+        $level = 0;
+    } 
+    my $msg = "@_";
+    $msg .= "\n" unless substr($msg, -1) eq "\n";
+    if (opt(v) > $level)
+    {
+         print        "$0: $msg" if !opt('log');
+	 print $logfh "$0: $msg" if  opt('log');
+    }
+}
+
+sub parse_argv {
+
+    use Getopt::Long; 
+
+    # disallows using long arguments
+    # Getopt::Long::Configure("bundling");
+
+    Getopt::Long::Configure("no_ignore_case");
+
+    # no difference in exists and defined for %ENV; also, a "0"
+    # argument or a "" would not help cc, so skip
+    unshift @ARGV, split ' ', $ENV{PERLCC_OPTS} if $ENV{PERLCC_OPTS};
+
+    $Options = {};
+    Getopt::Long::GetOptions( $Options,
+        'L:s',          # lib directory
+        'I:s',          # include directories (FOR C, NOT FOR PERL)
+        'o:s',          # Output executable
+        'v:i',          # Verbosity level
+        'e:s',          # One-liner
+	'r',            # run resulting executable
+        'B',            # Byte compiler backend
+        'O',            # Optimised C backend
+        'c',            # Compile only
+        'h',            # Help me
+        'S',            # Dump C files
+	'r',            # run the resulting executable
+        'T',            # run the backend using perl -T
+        't',            # run the backend using perl -t
+        'static',       # Dirty hack to enable -shared/-static
+        'shared',       # Create a shared library (--shared for compat.)
+	'log:s',        # where to log compilation process information
+        'Wb:s',         # pass (comma-sepearated) options to backend
+        'testsuite',    # try to be nice to testsuite
+    );
+
+    $Options->{v} += 0;
+
+    if( opt(t) && opt(T) ) {
+        warn "Can't specify both -T and -t, -t ignored";
+        $Options->{t} = 0;
+    }
+
+    helpme() if opt(h); # And exit
+
+    $Output = opt(o) || ( is_win32 ? 'a.exe' : 'a.out' );
+    $Output = is_win32() ? $Output : relativize($Output);
+    $logfh  = new FileHandle(">> " . opt('log')) if (opt('log'));
+
+    if (opt(e)) {
+        warn "$0: using -e 'code' as input file, ignoring @ARGV\n" if @ARGV;
+        # We don't use a temporary file here; why bother?
+        # XXX: this is not bullet proof -- spaces or quotes in name!
+        $Input = is_win32() ? # Quotes eaten by shell
+            '-e "'.opt(e).'"' :
+            "-e '".opt(e)."'";
+    } else {
+        $Input = shift @ARGV;  # XXX: more files?
+        _usage_and_die("$0: No input file specified\n") unless $Input;
+        # DWIM modules. This is bad but necessary.
+        $Options->{shared}++ if $Input =~ /\.pm\z/;
+        warn "$0: using $Input as input file, ignoring @ARGV\n" if @ARGV;
+        check_read($Input);
+        check_perl($Input);
+        sanity_check();
+    }
+
+}
+
+sub opt(*) {
+    my $opt = shift;
+    return exists($Options->{$opt}) && ($Options->{$opt} || 0);
+} 
+
+sub compile_module { 
+    die "$0: Compiling to shared libraries is currently disabled\n";
+}
+
+sub compile_byte {
+    my $command = "$BinPerl -MO=Bytecode,-H,-o$Output $Input";
+    $Input =~ s/^-e.*$/-e/;
+
+    my ($output_r, $error_r) = spawnit($command);
+
+    if (@$error_r && $? != 0) {
+	_die("$0: $Input did not compile:\n@$error_r\n");
+    } else {
+	my @error = grep { !/^$Input syntax OK$/o } @$error_r;
+	warn "$0: Unexpected compiler output:\n@error" if @error;
+    }
+
+    chmod 0777 & ~umask, $Output    or _die("can't chmod $Output: $!");
+    exit 0;
+}
+
+sub compile_cstyle {
+    my $stash = grab_stash();
+    my $taint = opt(T) ? '-T' :
+                opt(t) ? '-t' : '';
+
+    # What are we going to call our output C file?
+    my $lose = 0;
+    my ($cfh);
+    my $testsuite = '';
+    my $addoptions = opt(Wb);
+
+    if( $addoptions ) {
+        $addoptions .= ',' if $addoptions !~ m/,$/;
+    }
+
+    if (opt(testsuite)) {
+        my $bo = join '', @begin_output;
+        $bo =~ s/\\/\\\\\\\\/gs;
+        $bo =~ s/\n/\\n/gs;
+        $bo =~ s/,/\\054/gs;
+        # don't look at that: it hurts
+        $testsuite = q{-fuse-script-name,-fsave-data,-fsave-sig-hash,}.
+            qq[-e"print q{$bo}",] .
+            q{-e"open(Test::Builder::TESTOUT\054 '>&STDOUT') or die $!",} .
+            q{-e"open(Test::Builder::TESTERR\054 '>&STDERR') or die $!",};
+    }
+    if (opt(S) || opt(c)) {
+        # We need to keep it.
+        if (opt(e)) {
+            $cfile = "a.out.c";
+        } else {
+            $cfile = $Input;
+            # File off extension if present
+            # hold on: plx is executable; also, careful of ordering!
+            $cfile =~ s/\.(?:p(?:lx|l|h)|m)\z//i;
+            $cfile .= ".c";
+            $cfile = $Output if opt(c) && $Output =~ /\.c\z/i;
+        }
+        check_write($cfile);
+    } else {
+        # Don't need to keep it, be safe with a tempfile.
+        $lose = 1;
+        ($cfh, $cfile) = tempfile("pccXXXXX", SUFFIX => ".c"); 
+        close $cfh; # See comment just below
+    }
+    vprint 1, "Writing C on $cfile";
+
+    my $max_line_len = '';
+    if ($^O eq 'MSWin32' && $Config{cc} =~ /^cl/i) {
+        $max_line_len = '-l2000,';
+    }
+
+    # This has to do the write itself, so we can't keep a lock. Life
+    # sucks.
+    my $command = "$BinPerl $taint -MO=$Backend,$addoptions$testsuite$max_line_len$stash,-o$cfile $Input";
+    vprint 1, "Compiling...";
+    vprint 1, "Calling $command";
+
+	my ($output_r, $error_r) = spawnit($command);
+	my @output = @$output_r;
+	my @error = @$error_r;
+
+    if (@error && $? != 0) {
+        _die("$0: $Input did not compile, which can't happen:\n@error\n");
+    }
+
+    is_msvc ?
+        cc_harness_msvc($cfile,$stash) :
+        cc_harness($cfile,$stash) unless opt(c);
+
+    if ($lose) {
+        vprint 2, "unlinking $cfile";
+        unlink $cfile or _die("can't unlink $cfile: $!"); 
+    }
+}
+
+sub cc_harness_msvc {
+    my ($cfile,$stash)=@_;
+    use ExtUtils::Embed ();
+    my $obj = "${Output}.obj";
+    my $compile = ExtUtils::Embed::ccopts." -c -Fo$obj $cfile ";
+    my $link = "-out:$Output $obj";
+    $compile .= " -I".$_ for split /\s+/, opt(I);
+    $link .= " -libpath:".$_ for split /\s+/, opt(L);
+    my @mods = split /-?u /, $stash;
+    $link .= " ".ExtUtils::Embed::ldopts("-std", \@mods);
+    $link .= " perl5$Config{PERL_VERSION}.lib kernel32.lib msvcrt.lib";
+    vprint 3, "running $Config{cc} $compile";
+    system("$Config{cc} $compile");
+    vprint 3, "running $Config{ld} $link";
+    system("$Config{ld} $link");
+}
+
+sub cc_harness {
+	my ($cfile,$stash)=@_;
+	use ExtUtils::Embed ();
+	my $command = ExtUtils::Embed::ccopts." -o $Output $cfile ";
+	$command .= " -I".$_ for split /\s+/, opt(I);
+	$command .= " -L".$_ for split /\s+/, opt(L);
+	my @mods = split /-?u /, $stash;
+	$command .= " ".ExtUtils::Embed::ldopts("-std", \@mods);
+        $command .= " -lperl";
+	vprint 3, "running $Config{cc} $command";
+	system("$Config{cc} $command");
+}
+
+# Where Perl is, and which include path to give it.
+sub yclept {
+    my $command = "$^X ";
+
+    # DWIM the -I to be Perl, not C, include directories.
+    if (opt(I) && $Backend eq "Bytecode") {
+        for (split /\s+/, opt(I)) {
+            if (-d $_) {
+                push @INC, $_;
+            } else {
+                warn "$0: Include directory $_ not found, skipping\n";
+            }
+        }
+    }
+            
+    $command .= "-I$_ " for @INC;
+    return $command;
+}
+
+# Use B::Stash to find additional modules and stuff.
+{
+    my $_stash;
+    sub grab_stash {
+
+        warn "already called get_stash once" if $_stash;
+
+        my $taint = opt(T) ? '-T' :
+                    opt(t) ? '-t' : '';
+        my $command = "$BinPerl $taint -MB::Stash -c $Input";
+        # Filename here is perfectly sanitised.
+        vprint 3, "Calling $command\n";
+
+		my ($stash_r, $error_r) = spawnit($command);
+		my @stash = @$stash_r;
+		my @error = @$error_r;
+
+    	if (@error && $? != 0) {
+            _die("$0: $Input did not compile:\n@error\n");
+        }
+
+        # band-aid for modules with noisy BEGIN {}
+        foreach my $i ( @stash ) {
+            $i =~ m/-u(?:[\w:]+|\<none\>)$/ and $stash[0] = $i and next;
+            push @begin_output, $i;
+        }
+        chomp $stash[0];
+        $stash[0] =~ s/,-u\<none\>//;
+        $stash[0] =~ s/^.*?-u/-u/s;
+        vprint 2, "Stash: ", join " ", split /,?-u/, $stash[0];
+        chomp $stash[0];
+        return $_stash = $stash[0];
+    }
+
+}
+
+# Check the consistency of options if -B is selected.
+# To wit, (-B|-O) ==> no -shared, no -S, no -c
+sub checkopts_byte {
+
+    _die("$0: Please choose one of either -B and -O.\n") if opt(O);
+
+    if (opt(shared)) {
+        warn "$0: Will not create a shared library for bytecode\n";
+        delete $Options->{shared};
+    }
+
+    for my $o ( qw[c S] ) { 
+        if (opt($o)) { 
+            warn "$0: Compiling to bytecode is a one-pass process--",
+                  "-$o ignored\n";
+            delete $Options->{$o};
+        }
+    }
+
+}
+
+# Check the input and output files make sense, are read/writeable.
+sub sanity_check {
+    if ($Input eq $Output) {
+        if ($Input eq 'a.out') {
+            _die("$0: Compiling a.out is probably not what you want to do.\n");
+            # You fully deserve what you get now. No you *don't*. typos happen.
+        } else {
+            warn "$0: Will not write output on top of input file, ",
+                "compiling to a.out instead\n";
+            $Output = "a.out";
+        }
+    }
+}
+
+sub check_read { 
+    my $file = shift;
+    unless (-r $file) {
+        _die("$0: Input file $file is a directory, not a file\n") if -d _;
+        unless (-e _) {
+            _die("$0: Input file $file was not found\n");
+        } else {
+            _die("$0: Cannot read input file $file: $!\n");
+        }
+    }
+    unless (-f _) {
+        # XXX: die?  don't try this on /dev/tty
+        warn "$0: WARNING: input $file is not a plain file\n";
+    } 
+}
+
+sub check_write {
+    my $file = shift;
+    if (-d $file) {
+        _die("$0: Cannot write on $file, is a directory\n");
+    }
+    if (-e _) {
+        _die("$0: Cannot write on $file: $!\n") unless -w _;
+    } 
+    unless (-w cwd()) { 
+        _die("$0: Cannot write in this directory: $!\n");
+    }
+}
+
+sub check_perl {
+    my $file = shift;
+    unless (-T $file) {
+        warn "$0: Binary `$file' sure doesn't smell like perl source!\n";
+        print "Checking file type... ";
+        system("file", $file);  
+        _die("Please try a perlier file!\n");
+    } 
+
+    open(my $handle, "<", $file)    or _die("XXX: can't open $file: $!");
+    local $_ = <$handle>;
+    if (/^#!/ && !/perl/) {
+        _die("$0: $file is a ", /^#!\s*(\S+)/, " script, not perl\n");
+    } 
+
+} 
+
+# File spawning and error collecting
+sub spawnit {
+	my ($command) = shift;
+	my (@error,@output);
+	my $errname;
+	(undef, $errname) = tempfile("pccXXXXX");
+	{ 
+	open (S_OUT, "$command 2>$errname |")
+		or _die("$0: Couldn't spawn the compiler.\n");
+	@output = <S_OUT>;
+	}
+	open (S_ERROR, $errname) or _die("$0: Couldn't read the error file.\n");
+	@error = <S_ERROR>;
+	close S_ERROR;
+	close S_OUT;
+	unlink $errname or _die("$0: Can't unlink error file $errname");
+	return (\@output, \@error);
+}
+
+sub helpme {
+       print "perlcc compiler frontend, version $VERSION\n\n";
+       { no warnings;
+       exec "pod2usage $0";
+       exec "perldoc $0";
+       exec "pod2text $0";
+       }
+}
+
+sub relativize {
+	my ($args) = @_;
+
+	return() if ($args =~ m"^[/\\]");
+	return("./$args");
+}
+
+sub _die {
+    $logfh->print(@_) if opt('log');
+    print STDERR @_;
+    exit(); # should die eventually. However, needed so that a 'make compile'
+            # can compile all the way through to the end for standard dist.
+}
+
+sub _usage_and_die {
+    _die(<<EOU);
+$0: Usage:
+$0 [-o executable] [-r] [-O|-B|-c|-S] [-I /foo] [-L /foo] [-log log] [source[.pl] | -e oneliner]
+EOU
+}
+
+sub run {
+    my (@commands) = @_;
+
+    print interruptrun(@commands) if (!opt('log'));
+    $logfh->print(interruptrun(@commands)) if (opt('log'));
+}
+
+sub interruptrun
+{
+    my (@commands) = @_;
+
+    my $command = join('', @commands);
+    local(*FD);
+    my $pid = open(FD, "$command |");
+    my $text;
+    
+    local($SIG{HUP}) = sub { kill 9, $pid; exit };
+    local($SIG{INT}) = sub { kill 9, $pid; exit };
+
+    my $needalarm = 
+          ($ENV{PERLCC_TIMEOUT} && 
+	  $Config{'osname'} ne 'MSWin32' && 
+	  $command =~ m"(^|\s)perlcc\s");
+
+    eval 
+    {
+         local($SIG{ALRM}) = sub { die "INFINITE LOOP"; };
+         alarm($ENV{PERLCC_TIMEOUT}) if ($needalarm);
+	 $text = join('', <FD>);
+	 alarm(0) if ($needalarm);
+    };
+
+    if ($@)
+    {
+        eval { kill 'HUP', $pid };
+        vprint 0, "SYSTEM TIMEOUT (infinite loop?)\n";
+    }
+
+    close(FD);
+    return($text);
+}
+
+sub is_win32() { $^O =~ m/^MSWin/ }
+sub is_msvc() { is_win32 && $Config{cc} =~ m/^cl/i }
+
+END {
+    unlink $cfile if ($cfile && !opt(S) && !opt(c));
+}
+
+__END__
+
+=head1 NAME
+
+perlcc - generate executables from Perl programs
+
+=head1 SYNOPSIS
+
+    $ perlcc hello              # Compiles into executable 'a.out'
+    $ perlcc -o hello hello.pl  # Compiles into executable 'hello'
+
+    $ perlcc -O file            # Compiles using the optimised C backend
+    $ perlcc -B file            # Compiles using the bytecode backend
+
+    $ perlcc -c file            # Creates a C file, 'file.c'
+    $ perlcc -S -o hello file   # Creates a C file, 'file.c',
+                                # then compiles it to executable 'hello'
+    $ perlcc -c out.c file      # Creates a C file, 'out.c' from 'file'
+
+    $ perlcc -e 'print q//'     # Compiles a one-liner into 'a.out'
+    $ perlcc -c -e 'print q//'  # Creates a C file 'a.out.c'
+
+    $ perlcc -I /foo hello	# extra headers (notice the space after -I)
+    $ perlcc -L /foo hello	# extra libraries (notice the space after -L)
+
+    $ perlcc -r hello           # compiles 'hello' into 'a.out', runs 'a.out'.
+    $ perlcc -r hello a b c     # compiles 'hello' into 'a.out', runs 'a.out'.
+                                # with arguments 'a b c' 
+
+    $ perlcc hello -log c       # compiles 'hello' into 'a.out' logs compile
+                                # log into 'c'. 
+
+=head1 DESCRIPTION
+
+F<perlcc> creates standalone executables from Perl programs, using the
+code generators provided by the L<B> module. At present, you may
+either create executable Perl bytecode, using the C<-B> option, or 
+generate and compile C files using the standard and 'optimised' C
+backends.
+
+The code generated in this way is not guaranteed to work. The whole
+codegen suite (C<perlcc> included) should be considered B<very>
+experimental. Use for production purposes is strongly discouraged.
+
+=head1 OPTIONS
+
+=over 4
+
+=item -LI<library directories>
+
+Adds the given directories to the library search path when C code is
+passed to your C compiler.
+
+=item -II<include directories>
+
+Adds the given directories to the include file search path when C code is
+passed to your C compiler; when using the Perl bytecode option, adds the
+given directories to Perl's include path.
+
+=item -o I<output file name>
+
+Specifies the file name for the final compiled executable.
+
+=item -c I<C file name>
+
+Create C code only; do not compile to a standalone binary.
+
+=item -e I<perl code>
+
+Compile a one-liner, much the same as C<perl -e '...'>
+
+=item -S
+
+Do not delete generated C code after compilation.
+
+=item -B
+
+Use the Perl bytecode code generator.
+
+=item -O
+
+Use the 'optimised' C code generator. This is more experimental than
+everything else put together, and the code created is not guaranteed to
+compile in finite time and memory, or indeed, at all.
+
+=item -v
+
+Increase verbosity of output; can be repeated for more verbose output.
+
+=item -r 
+
+Run the resulting compiled script after compiling it.
+
+=item -log
+
+Log the output of compiling to a file rather than to stdout.
+
+=back
+
+=cut
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/perldoc.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/perldoc.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/perldoc.bat	(revision 14489)
@@ -0,0 +1,27 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if 0;
+
+# This "perldoc" file was generated by "perldoc.PL"
+
+require 5;
+BEGIN { $^W = 1 if $ENV{'PERLDOCDEBUG'} }
+use Pod::Perldoc;
+exit( Pod::Perldoc->run() );
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/perlglob.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/perlglob.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/perlglob.bat	(revision 14489)
@@ -0,0 +1,69 @@
+@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
+use File::DosGlob;
+$| = 1;
+while (@ARGV) {
+    my $arg = shift;
+    my @m = File::DosGlob::doglob(1,$arg);
+    print (@m ? join("\0", sort @m) : $arg);
+    print "\0" if @ARGV;
+}
+__END__
+
+=head1 NAME
+
+perlglob.bat - a more capable perlglob.exe replacement
+
+=head1 SYNOPSIS
+
+    @perlfiles = glob  "..\\pe?l/*.p?";
+    print <..\\pe?l/*.p?>;
+
+    # more efficient version
+    > perl -MFile::DosGlob=glob -e "print <../pe?l/*.p?>"
+
+=head1 DESCRIPTION
+
+This file is a portable replacement for perlglob.exe.  It
+is largely compatible with perlglob.exe (the Microsoft setargv.obj
+version) in all but one respect--it understands wildcards in
+directory components.
+
+It prints null-separated filenames to standard output.
+
+For details of the globbing features implemented, see
+L<File::DosGlob>.
+
+While one may replace perlglob.exe with this, usage by overriding
+CORE::glob with File::DosGlob::glob should be much more efficient,
+because it avoids launching a separate process, and is therefore
+strongly recommended.  See L<perlsub> for details of overriding
+builtins.
+
+=head1 AUTHOR
+
+Gurusamy Sarathy <gsar@activestate.com>
+
+=head1 SEE ALSO
+
+perl
+
+File::DosGlob
+
+=cut
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/perlivp.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/perlivp.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/perlivp.bat	(revision 14489)
@@ -0,0 +1,446 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+        if $running_under_some_shell;
+
+# perlivp V 0.02
+
+
+sub usage {
+    warn "@_\n" if @_;
+    print << "    EOUSAGE";
+Usage:
+
+    $0 [-a] [-p] [-v] | [-h]
+
+    -a Run all tests (default is to skip .ph tests)
+    -p Print a preface before each test telling what it will test.
+    -v Verbose mode in which extra information about test results
+       is printed.  Test failures always print out some extra information
+       regardless of whether or not this switch is set.
+    -h Prints this help message.
+    EOUSAGE
+    exit;
+}
+
+use vars qw(%opt); # allow testing with older versions (do not use our)
+
+@opt{ qw/? H h P p V v/ } = qw(0 0 0 0 0 0 0);
+
+while ($ARGV[0] =~ /^-/) {
+    $ARGV[0] =~ s/^-//; 
+    for my $flag (split(//,$ARGV[0])) {
+        usage() if '?' =~ /\Q$flag/;
+        usage() if 'h' =~ /\Q$flag/;
+        usage() if 'H' =~ /\Q$flag/;
+        usage("unknown flag: `$flag'") unless 'HhPpVva' =~ /\Q$flag/;
+        warn "$0: `$flag' flag already set\n" if $opt{$flag}++;
+    } 
+    shift;
+}
+
+$opt{p}++ if $opt{P};
+$opt{v}++ if $opt{V};
+
+my $pass__total = 0;
+my $error_total = 0;
+my $tests_total = 0;
+
+my $perlpath = 'c:\shaoqunWu\perl\bin\perl.exe';
+my $useithreads = 'define';
+
+print "## Checking Perl binary via variable `\$perlpath' = $perlpath.\n" if $opt{'p'};
+
+if (-x $perlpath) {
+    print "## Perl binary `$perlpath' appears executable.\n" if $opt{'v'};
+    print "ok 1\n";
+    $pass__total++;
+}
+else {
+    print "# Perl binary `$perlpath' does not appear executable.\n";
+    print "not ok 1\n";
+    $error_total++;
+}
+$tests_total++;
+
+
+print "## Checking Perl version via variable `\$]'.\n" if $opt{'p'};
+
+my $ivp_VERSION = 5.008008;
+
+if ($ivp_VERSION eq $]) {
+    print "## Perl version `$]' appears installed as expected.\n" if $opt{'v'};
+    print "ok 2\n";
+    $pass__total++;
+}
+else {
+    print "# Perl version `$]' installed, expected $ivp_VERSION.\n";
+    print "not ok 2\n";
+    $error_total++;
+}
+$tests_total++;
+
+
+print "## Checking roots of the Perl library directory tree via variable `\@INC'.\n" if $opt{'p'};
+
+my $INC_total = 0;
+my $INC_there = 0;
+foreach (@INC) {
+    next if $_ eq '.'; # skip -d test here
+    if ($^O eq 'MacOS') {
+        next if $_ eq ':'; # skip -d test here
+        next if $_ eq 'Dev:Pseudo:'; # why is this in @INC?
+    }
+    if (-d $_) {
+        print "## Perl \@INC directory `$_' exists.\n" if $opt{'v'};
+        $INC_there++;
+    }
+    else {
+        print "# Perl \@INC directory `$_' does not appear to exist.\n";
+    }
+    $INC_total++;
+}
+if ($INC_total == $INC_there) {
+    print "ok 3\n";
+    $pass__total++;
+}
+else {
+    print "not ok 3\n";
+    $error_total++;
+}
+$tests_total++;
+
+
+print "## Checking installations of modules necessary for ivp.\n" if $opt{'p'};
+
+my $needed_total = 0;
+my $needed_there = 0;
+foreach (qw(Config.pm ExtUtils/Installed.pm)) {
+    $@ = undef;
+    $needed_total++;
+    eval "require \"$_\";";
+    if (!$@) {
+        print "## Module `$_' appears to be installed.\n" if $opt{'v'};
+        $needed_there++;
+    }
+    else {
+        print "# Needed module `$_' does not appear to be properly installed.\n";
+    }
+    $@ = undef;
+}
+if ($needed_total == $needed_there) {
+    print "ok 4\n";
+    $pass__total++;
+}
+else {
+    print "not ok 4\n";
+    $error_total++;
+}
+$tests_total++;
+
+
+print "## Checking installations of extensions built with perl.\n" if $opt{'p'};
+
+use Config;
+
+my $extensions_total = 0;
+my $extensions_there = 0;
+if (defined($Config{'extensions'})) {
+    my @extensions = split(/\s+/,$Config{'extensions'});
+    foreach (@extensions) {
+        next if ($_ eq '');
+        if ( $useithreads !~ /define/i ) {
+            next if ($_ eq 'threads');
+            next if ($_ eq 'threads/shared');
+        }
+        next if ($_ eq 'Devel/DProf'); 
+           # VMS$ perl  -e "eval ""require \""Devel/DProf.pm\"";"" print $@"
+           # \NT> perl  -e "eval \"require 'Devel/DProf.pm'\"; print $@"
+           # DProf: run perl with -d to use DProf.
+           # Compilation failed in require at (eval 1) line 1.
+        eval " require \"$_.pm\"; ";
+        if (!$@) {
+            print "## Module `$_' appears to be installed.\n" if $opt{'v'};
+            $extensions_there++;
+        }
+        else {
+            print "# Required module `$_' does not appear to be properly installed.\n";
+            $@ = undef;
+        }
+        $extensions_total++;
+    }
+
+    # A silly name for a module (that hopefully won't ever exist).
+    # Note that this test serves more as a check of the validity of the
+    # actuall required module tests above.
+    my $unnecessary = 'bLuRfle';
+
+    if (!grep(/$unnecessary/, @extensions)) {
+        $@ = undef;
+        eval " require \"$unnecessary.pm\"; ";
+        if ($@) {
+            print "## Unnecessary module `$unnecessary' does not appear to be installed.\n" if $opt{'v'};
+        }
+        else {
+            print "# Unnecessary module `$unnecessary' appears to be installed.\n";
+            $extensions_there++;
+        }
+    }
+    $@ = undef;
+}
+if ($extensions_total == $extensions_there) {
+    print "ok 5\n";
+    $pass__total++;
+}
+else {
+    print "not ok 5\n";
+    $error_total++;
+}
+$tests_total++;
+
+
+print "## Checking installations of later additional extensions.\n" if $opt{'p'};
+
+use ExtUtils::Installed;
+
+my $installed_total = 0;
+my $installed_there = 0;
+my $version_check = 0;
+my $installed = ExtUtils::Installed -> new();
+my @modules = $installed -> modules();
+my @missing = ();
+my $version = undef;
+for (@modules) {
+    $installed_total++;
+    # Consider it there if it contains one or more files,
+    # and has zero missing files,
+    # and has a defined version
+    $version = undef;
+    $version = $installed -> version($_);
+    if ($version) {
+        print "## $_; $version\n" if $opt{'v'};
+        $version_check++;
+    }
+    else {
+        print "# $_; NO VERSION\n" if $opt{'v'};
+    }
+    $version = undef;
+    @missing = ();
+    @missing = $installed -> validate($_);
+    if ($#missing >= 0) {
+        print "# file",+($#missing == 0) ? '' : 's'," missing from installation:\n";
+        print '# ',join(' ',@missing),"\n";
+    }
+    elsif ($#missing == -1) {
+        $installed_there++;
+    }
+    @missing = ();
+}
+if (($installed_total == $installed_there) && 
+    ($installed_total == $version_check)) {
+    print "ok 6\n";
+    $pass__total++;
+}
+else {
+    print "not ok 6\n";
+    $error_total++;
+}
+$tests_total++;
+
+
+if ($opt{'a'}) {
+print "## Checking installations of *.h -> *.ph header files.\n" if $opt{'p'};
+my $ph_there = 0;
+my $var = undef;
+my $val = undef;
+my $h_file = undef;
+# Just about "any" C implementation ought to have a stdio.h (even if 
+# Config.pm may not list a i_stdio var).
+my @ph_files = qw(stdio.ph);
+# Add the ones that we know that perl thinks are there:
+while (($var, $val) = each %Config) {
+    if ($var =~ m/i_(.+)/ && $val eq 'define') {
+        $h_file = $1;
+	# Some header and symbol names don't match for hysterical raisins.
+	$h_file = 'arpa/inet'    if $h_file eq 'arpainet';
+	$h_file = 'netinet/in'   if $h_file eq 'niin';
+	$h_file = 'netinet/tcp'  if $h_file eq 'netinettcp';
+	$h_file = 'sys/resource' if $h_file eq 'sysresrc';
+	$h_file = 'sys/select'   if $h_file eq 'sysselct';
+	$h_file = 'sys/security' if $h_file eq 'syssecrt';
+        $h_file = 'rpcsvc/dbm'   if $h_file eq 'rpcsvcdbm';
+        # This ought to distinguish syslog from sys/syslog.
+        # (NB syslog.ph is heavily used for the DBI pre-requisites).
+        $h_file =~ s{^sys(\w.+)}{sys/$1} unless $h_file eq 'syslog';
+        push(@ph_files, "$h_file.ph");
+    }
+}
+#foreach (qw(stdio.ph syslog.ph)) {
+foreach (@ph_files) {
+    $@ = undef;
+    eval "require \"$_\";";
+    if (!$@) {
+        print "## Perl header `$_' appears to be installed.\n" if $opt{'v'};
+        $ph_there++;
+    }
+    else {
+        print "# Perl header `$_' does not appear to be properly installed.\n";
+    }
+    $@ = undef;
+}
+
+if (scalar(@ph_files) == $ph_there) {
+    print "ok 7\n";
+    $pass__total++;
+}
+else {
+    print "not ok 7\n";
+    $error_total++;
+}
+$tests_total++;
+}
+else {
+    print "##  Skip checking of *.ph header files.\n" if $opt{'p'};
+}
+
+# Final report (rather than feed ousrselves to Test::Harness::runtests()
+# we simply format some output on our own to keep things simple and
+# easier to "fix" - at least for now.
+
+if ($error_total == 0 && $tests_total) {
+    print "All tests successful.\n";
+} elsif ($tests_total==0){
+        die "FAILED--no tests were run for some reason.\n";
+} else {
+    my $rate = 0.0;
+    if ($tests_total > 0) { $rate = sprintf "%.2f", 100.0 * ($pass__total / $tests_total); }
+    printf " %d/%d subtests failed, %.2f%% okay.\n",
+                              $error_total, $tests_total, $rate;
+}
+
+=head1 NAME
+
+perlivp - Perl Installation Verification Procedure
+
+=head1 SYNOPSIS
+
+B<perlivp> [B<-a>] [B<-p>] [B<-v>] [B<-h>]
+
+=head1 DESCRIPTION
+
+The B<perlivp> program is set up at Perl source code build time to test the
+Perl version it was built under.  It can be used after running:
+
+    make install
+
+(or your platform's equivalent procedure) to verify that B<perl> and its
+libraries have been installed correctly.  A correct installation is verified
+by output that looks like:
+
+    ok 1
+    ok 2
+
+etc.
+
+=head1 OPTIONS
+
+=over 5
+
+=item B<-h> help
+
+Prints out a brief help message.
+
+=item B<-a> run all tests
+
+Normally tests for optional features are skipped.  With -a all tests
+are executed.
+
+=item B<-p> print preface
+
+Gives a description of each test prior to performing it.
+
+=item B<-v> verbose
+
+Gives more detailed information about each test, after it has been performed.
+Note that any failed tests ought to print out some extra information whether
+or not -v is thrown.
+
+=back
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item * print "# Perl binary `$perlpath' does not appear executable.\n";
+
+Likely to occur for a perl binary that was not properly installed.
+Correct by conducting a proper installation.
+
+=item * print "# Perl version `$]' installed, expected $ivp_VERSION.\n";
+
+Likely to occur for a perl that was not properly installed.
+Correct by conducting a proper installation.
+
+=item * print "# Perl \@INC directory `$_' does not appear to exist.\n";
+
+Likely to occur for a perl library tree that was not properly installed.
+Correct by conducting a proper installation.
+
+=item * print "# Needed module `$_' does not appear to be properly installed.\n";
+
+One of the two modules that is used by perlivp was not present in the 
+installation.  This is a serious error since it adversely affects perlivp's
+ability to function.  You may be able to correct this by performing a
+proper perl installation.
+
+=item * print "# Required module `$_' does not appear to be properly installed.\n";
+
+An attempt to C<eval "require $module"> failed, even though the list of 
+extensions indicated that it should succeed.  Correct by conducting a proper 
+installation.
+
+=item * print "# Unnecessary module `bLuRfle' appears to be installed.\n";
+
+This test not coming out ok could indicate that you have in fact installed 
+a bLuRfle.pm module or that the C<eval " require \"$module_name.pm\"; ">
+test may give misleading results with your installation of perl.  If yours
+is the latter case then please let the author know.
+
+=item * print "# file",+($#missing == 0) ? '' : 's'," missing from installation:\n";
+
+One or more files turned up missing according to a run of 
+C<ExtUtils::Installed -E<gt> validate()> over your installation.
+Correct by conducting a proper installation.
+
+=item * print "# Perl header `$_' does not appear to be properly installed.\n";
+
+Correct by running B<h2ph> over your system's C header files.  If necessary, 
+edit the resulting *.ph files to eliminate perl syntax errors.
+
+=back
+
+For further information on how to conduct a proper installation consult the 
+INSTALL file that comes with the perl source and the README file for your 
+platform.
+
+=head1 AUTHOR
+
+Peter Prymmer
+
+=cut
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/piconv.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/piconv.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/piconv.bat	(revision 14489)
@@ -0,0 +1,262 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+#!./perl
+# $Id: piconv,v 2.1 2004/10/06 05:07:20 dankogai Exp $
+#
+use 5.8.0;
+use strict;
+use Encode ;
+use Encode::Alias;
+my %Scheme =  map {$_ => 1} qw(from_to decode_encode perlio);
+
+use File::Basename;
+my $name = basename($0);
+
+use Getopt::Long qw(:config no_ignore_case);
+
+my %Opt;
+
+help()
+    unless
+      GetOptions(\%Opt,
+		 'from|f=s',
+		 'to|t=s',
+		 'list|l',
+		 'string|s=s',
+		 'check|C=i',
+		 'c',
+		 'perlqq|p',
+		 'debug|D',
+		 'scheme|S=s',
+		 'resolve|r=s',
+		 'help',
+		 );
+
+$Opt{help} and help();
+$Opt{list} and list_encodings();
+my $locale = $ENV{LC_CTYPE} || $ENV{LC_ALL} || $ENV{LANG};
+defined $Opt{resolve} and resolve_encoding($Opt{resolve});
+$Opt{from} || $Opt{to} || help();
+my $from = $Opt{from} || $locale or help("from_encoding unspecified");
+my $to   = $Opt{to}   || $locale or help("to_encoding unspecified");
+$Opt{string} and Encode::from_to($Opt{string}, $from, $to) and print $Opt{string} and exit;
+my $scheme = exists $Scheme{$Opt{Scheme}} ? $Opt{Scheme} :  'from_to';
+$Opt{check} ||= $Opt{c};
+$Opt{perlqq} and $Opt{check} = Encode::FB_PERLQQ;
+
+if ($Opt{debug}){
+    my $cfrom = Encode->getEncoding($from)->name;
+    my $cto   = Encode->getEncoding($to)->name;
+    print <<"EOT";
+Scheme: $scheme
+From:   $from => $cfrom
+To:     $to => $cto
+EOT
+}
+
+# we do not use <> (or ARGV) for the sake of binmode()
+@ARGV or push @ARGV, \*STDIN; 
+
+unless ($scheme eq 'perlio'){
+    binmode STDOUT;
+    for my $argv (@ARGV){
+	my $ifh = ref $argv ? $argv : undef;
+	$ifh or open $ifh, "<", $argv or next;
+	binmode $ifh;
+	if ($scheme eq 'from_to'){ 	    # default
+	    while(<$ifh>){
+		Encode::from_to($_, $from, $to, $Opt{check}); 
+		print;
+	    }
+	}elsif ($scheme eq 'decode_encode'){ # step-by-step
+	    while(<$ifh>){
+		my $decoded = decode($from, $_, $Opt{check});
+		my $encoded = encode($to, $decoded);
+		print $encoded;
+	    }
+	} else { # won't reach
+	    die "$name: unknown scheme: $scheme";
+	}
+    }
+}else{
+    # NI-S favorite
+    binmode STDOUT => "raw:encoding($to)";
+    for my $argv (@ARGV){
+	my $ifh = ref $argv ? $argv : undef;
+	$ifh or open $ifh, "<", $argv or next;
+	binmode $ifh => "raw:encoding($from)";
+	print while(<$ifh>);
+    }
+}
+
+sub list_encodings{
+    print join("\n", Encode->encodings(":all")), "\n";
+    exit 0;
+}
+
+sub resolve_encoding {
+    if (my $alias = Encode::resolve_alias($_[0])) {
+	print $alias, "\n";
+	exit 0;
+    } else {
+	warn "$name: $_[0] is not known to Encode\n";
+	exit 1;
+    }
+}
+
+sub help{
+    my $message = shift;
+    $message and print STDERR "$name error: $message\n";
+    print STDERR <<"EOT";
+$name [-f from_encoding] [-t to_encoding] [-s string] [files...]
+$name -l
+$name -r encoding_alias
+  -l,--list
+     lists all available encodings
+  -r,--resolve encoding_alias
+    resolve encoding to its (Encode) canonical name
+  -f,--from from_encoding  
+     when omitted, the current locale will be used
+  -t,--to to_encoding    
+     when omitted, the current locale will be used
+  -s,--string string         
+     "string" will be the input instead of STDIN or files
+The following are mainly of interest to Encode hackers:
+  -D,--debug          show debug information
+  -C N | -c | -p      check the validity of the input
+  -S,--scheme scheme  use the scheme for conversion
+EOT
+  exit;
+}
+
+__END__
+
+=head1 NAME
+
+piconv -- iconv(1), reinvented in perl
+
+=head1 SYNOPSIS
+
+  piconv [-f from_encoding] [-t to_encoding] [-s string] [files...]
+  piconv -l
+  piconv [-C N|-c|-p]
+  piconv -S scheme ...
+  piconv -r encoding
+  piconv -D ...
+  piconv -h
+
+=head1 DESCRIPTION
+
+B<piconv> is perl version of B<iconv>, a character encoding converter
+widely available for various Unixen today.  This script was primarily
+a technology demonstrator for Perl 5.8.0, but you can use piconv in the
+place of iconv for virtually any case.
+
+piconv converts the character encoding of either STDIN or files
+specified in the argument and prints out to STDOUT.
+
+Here is the list of options.  Each option can be in short format (-f)
+or long (--from).
+
+=over 4
+
+=item -f,--from from_encoding
+
+Specifies the encoding you are converting from.  Unlike B<iconv>,
+this option can be omitted.  In such cases, the current locale is used.
+
+=item -t,--to to_encoding
+
+Specifies the encoding you are converting to.  Unlike B<iconv>,
+this option can be omitted.  In such cases, the current locale is used.
+
+Therefore, when both -f and -t are omitted, B<piconv> just acts
+like B<cat>.
+
+=item -s,--string I<string>
+
+uses I<string> instead of file for the source of text.
+
+=item -l,--list
+
+Lists all available encodings, one per line, in case-insensitive
+order.  Note that only the canonical names are listed; many aliases
+exist.  For example, the names are case-insensitive, and many standard
+and common aliases work, such as "latin1" for "ISO-8859-1", or "ibm850"
+instead of "cp850", or "winlatin1" for "cp1252".  See L<Encode::Supported>
+for a full discussion.
+
+=item -C,--check I<N>
+
+Check the validity of the stream if I<N> = 1.  When I<N> = -1, something
+interesting happens when it encounters an invalid character.
+
+=item -c
+
+Same as C<-C 1>.
+
+=item -p,--perlqq
+
+Same as C<-C -1>.
+
+=item -h,--help
+
+Show usage.
+
+=item -D,--debug
+
+Invokes debugging mode.  Primarily for Encode hackers.
+
+=item -S,--scheme scheme
+
+Selects which scheme is to be used for conversion.  Available schemes
+are as follows:
+
+=over 4
+
+=item from_to
+
+Uses Encode::from_to for conversion.  This is the default.
+
+=item decode_encode
+
+Input strings are decode()d then encode()d.  A straight two-step
+implementation.
+
+=item perlio
+
+The new perlIO layer is used.  NI-S' favorite.
+
+=back
+
+Like the I<-D> option, this is also for Encode hackers.
+
+=back
+
+=head1 SEE ALSO
+
+L<iconv/1>
+L<locale/3>
+L<Encode>
+L<Encode::Supported>
+L<Encode::Alias>
+L<PerlIO>
+
+=cut
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/pl2bat.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/pl2bat.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/pl2bat.bat	(revision 14489)
@@ -0,0 +1,430 @@
+@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
+    eval 'exec perl -x -S "$0" ${1+"$@"}'
+	if 0;	# In case running under some shell
+
+require 5;
+use Getopt::Std;
+use Config;
+
+$0 =~ s|.*[/\\]||;
+
+my $usage = <<EOT;
+Usage:  $0 [-h]
+   or:  $0 [-w] [-u] [-a argstring] [-s stripsuffix] [files]
+   or:  $0 [-w] [-u] [-n ntargs] [-o otherargs] [-s stripsuffix] [files]
+        -n ntargs       arguments to invoke perl with in generated file
+                            when run from Windows NT.  Defaults to
+                            '-x -S %0 %*'.
+        -o otherargs    arguments to invoke perl with in generated file
+                            other than when run from Windows NT.  Defaults
+                            to '-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9'.
+        -a argstring    arguments to invoke perl with in generated file
+                            ignoring operating system (for compatibility
+                            with previous pl2bat versions).
+        -u              update files that may have already been processed
+                            by (some version of) pl2bat.
+        -w              include "-w" on the /^#!.*perl/ line (unless
+                            a /^#!.*perl/ line was already present).
+        -s stripsuffix  strip this suffix from file before appending ".bat"
+                            Not case-sensitive
+                            Can be a regex if it begins with `/'
+                            Defaults to "/\.plx?/"
+        -h              show this help
+EOT
+
+my %OPT = ();
+warn($usage), exit(0) if !getopts('whun:o:a:s:',\%OPT) or $OPT{'h'};
+# NOTE: %0 is already enclosed in doublequotes by cmd.exe, as appropriate
+$OPT{'n'} = '-x -S %0 %*' unless exists $OPT{'n'};
+$OPT{'o'} = '-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9' unless exists $OPT{'o'};
+$OPT{'s'} = '/\\.plx?/' unless exists $OPT{'s'};
+$OPT{'s'} = ($OPT{'s'} =~ m#^/([^/]*[^/\$]|)\$?/?$# ? $1 : "\Q$OPT{'s'}\E");
+
+my $head;
+if(  defined( $OPT{'a'} )  ) {
+    $head = <<EOT;
+	\@rem = '--*-Perl-*--
+	\@echo off
+	perl $OPT{'a'}
+	goto endofperl
+	\@rem ';
+EOT
+} else {
+    $head = <<EOT;
+	\@rem = '--*-Perl-*--
+	\@echo off
+	if "%OS%" == "Windows_NT" goto WinNT
+	perl $OPT{'o'}
+	goto endofperl
+	:WinNT
+	perl $OPT{'n'}
+	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 ';
+EOT
+}
+$head =~ s/^\t//gm;
+my $headlines = 2 + ($head =~ tr/\n/\n/);
+my $tail = "\n__END__\n:endofperl\n";
+
+@ARGV = ('-') unless @ARGV;
+
+foreach ( @ARGV ) {
+    process($_);
+}
+
+sub process {
+ my( $file )= @_;
+    my $myhead = $head;
+    my $linedone = 0;
+    my $taildone = 0;
+    my $linenum = 0;
+    my $skiplines = 0;
+    my $line;
+    my $start= $Config{startperl};
+    $start= "#!perl"   unless  $start =~ /^#!.*perl/;
+    open( FILE, $file ) or die "$0: Can't open $file: $!";
+    @file = <FILE>;
+    foreach $line ( @file ) {
+	$linenum++;
+	if ( $line =~ /^:endofperl\b/ ) {
+	    if(  ! exists $OPT{'u'}  ) {
+		warn "$0: $file has already been converted to a batch file!\n";
+		return;
+	    }
+	    $taildone++;
+	}
+	if ( not $linedone and $line =~ /^#!.*perl/ ) {
+	    if(  exists $OPT{'u'}  ) {
+		$skiplines = $linenum - 1;
+		$line .= "#line ".(1+$headlines)."\n";
+	    } else {
+		$line .= "#line ".($linenum+$headlines)."\n";
+	    }
+	    $linedone++;
+	}
+	if ( $line =~ /^#\s*line\b/ and $linenum == 2 + $skiplines ) {
+	    $line = "";
+	}
+    }
+    close( FILE );
+    $file =~ s/$OPT{'s'}$//oi;
+    $file .= '.bat' unless $file =~ /\.bat$/i or $file =~ /^-$/;
+    open( FILE, ">$file" ) or die "Can't open $file: $!";
+    print FILE $myhead;
+    print FILE $start, ( $OPT{'w'} ? " -w" : "" ),
+	       "\n#line ", ($headlines+1), "\n" unless $linedone;
+    print FILE @file[$skiplines..$#file];
+    print FILE $tail unless $taildone;
+    close( FILE );
+}
+__END__
+
+=head1 NAME
+
+pl2bat - wrap perl code into a batch file
+
+=head1 SYNOPSIS
+
+B<pl2bat> B<-h>
+
+B<pl2bat> [B<-w>] S<[B<-a> I<argstring>]> S<[B<-s> I<stripsuffix>]> [files]
+
+B<pl2bat> [B<-w>] S<[B<-n> I<ntargs>]> S<[B<-o> I<otherargs>]> S<[B<-s> I<stripsuffix>]> [files]
+
+=head1 DESCRIPTION
+
+This utility converts a perl script into a batch file that can be
+executed on DOS-like operating systems.  This is intended to allow
+you to use a Perl script like regular programs and batch files where
+you just enter the name of the script [probably minus the extension]
+plus any command-line arguments and the script is found in your B<PATH>
+and run.
+
+=head2 ADVANTAGES
+
+There are several alternatives to this method of running a Perl script. 
+They each have disadvantages that help you understand the motivation
+for using B<pl2bat>.
+
+=over
+
+=item 1
+
+    C:> perl x:/path/to/script.pl [args]
+
+=item 2
+
+    C:> perl -S script.pl [args]
+
+=item 3
+
+    C:> perl -S script [args]
+
+=item 4
+
+    C:> ftype Perl=perl.exe "%1" %*
+    C:> assoc .pl=Perl
+    then
+    C:> script.pl [args]
+
+=item 5
+
+    C:> ftype Perl=perl.exe "%1" %*
+    C:> assoc .pl=Perl
+    C:> set PathExt=%PathExt%;.PL
+    then
+    C:> script [args]
+
+=back
+
+B<1> and B<2> are the most basic invocation methods that should work on
+any system [DOS-like or not].  They require extra typing and require
+that the script user know that the script is written in Perl.  This
+is a pain when you have lots of scripts, some written in Perl and some
+not.  It can be quite difficult to keep track of which scripts need to
+be run through Perl and which do not.  Even worse, scripts often get
+rewritten from simple batch files into more powerful Perl scripts in
+which case these methods would require all existing users of the scripts
+be updated.
+
+B<3> works on modern Win32 versions of Perl.  It allows the user to
+omit the ".pl" or ".bat" file extension, which is a minor improvement.
+
+B<4> and B<5> work on some Win32 operating systems with some command
+shells.  One major disadvantage with both is that you can't use them
+in pipelines nor with file redirection.  For example, none of the
+following will work properly if you used method B<4> or B<5>:
+
+    C:> script.pl <infile
+    C:> script.pl >outfile
+    C:> echo y | script.pl
+    C:> script.pl | more
+
+This is due to a Win32 bug which Perl has no control over.  This bug
+is the major motivation for B<pl2bat> [which was originally written
+for DOS] being used on Win32 systems.
+
+Note also that B<5> works on a smaller range of combinations of Win32
+systems and command shells while B<4> requires that the user know
+that the script is a Perl script [because the ".pl" extension must
+be entered].  This makes it hard to standardize on either of these
+methods.
+
+=head2 DISADVANTAGES
+
+There are several potential traps you should be aware of when you
+use B<pl2bat>.
+
+The generated batch file is initially processed as a batch file each
+time it is run.  This means that, to use it from within another batch
+file you should precede it with C<call> or else the calling batch
+file will not run any commands after the script:
+
+    call script [args]
+
+Except under Windows NT, if you specify more than 9 arguments to
+the generated batch file then the 10th and subsequent arguments
+are silently ignored.
+
+Except when using F<CMD.EXE> under Windows NT, if F<perl.exe> is not
+in your B<PATH>, then trying to run the script will give you a generic
+"Command not found"-type of error message that will probably make you
+think that the script itself is not in your B<PATH>.  When using
+F<CMD.EXE> under Windows NT, the generic error message is followed by
+"You do not have Perl in your PATH", to make this clearer.
+
+On most DOS-like operating systems, the only way to exit a batch file
+is to "fall off the end" of the file.  B<pl2bat> implements this by
+doing C<goto :endofperl> and adding C<__END__> and C<:endofperl> as
+the last two lines of the generated batch file.  This means:
+
+=over
+
+=item No line of your script should start with a colon.
+
+In particular, for this version of B<pl2bat>, C<:endofperl>,
+C<:WinNT>, and C<:script_failed_so_exit_with_non_zero_val> should not
+be used.
+
+=item Care must be taken when using C<__END__> and the C<DATA> file handle.
+
+One approach is:
+
+    .  #!perl
+    .  while( <DATA> ) {
+    .	  last   if  /^__END__$/;
+    .	  [...]
+    .  }
+    .  __END__
+    .  lines of data
+    .  to be processed
+    .  __END__
+    .  :endofperl
+
+The dots in the first column are only there to prevent F<cmd.exe> to interpret
+the C<:endofperl> line in this documentation.  Otherwise F<pl2bat.bat> itself
+wouldn't work.  See the previous item. :-)
+
+=item The batch file always "succeeds"
+
+The following commands illustrate the problem:
+
+    C:> echo exit(99); >fail.pl
+    C:> pl2bat fail.pl
+    C:> perl -e "print system('perl fail.pl')"
+    99
+    C:> perl -e "print system('fail.bat')"
+    0
+
+So F<fail.bat> always reports that it completed successfully.  Actually,
+under Windows NT, we have:
+
+    C:> perl -e "print system('fail.bat')"
+    1
+
+So, for Windows NT, F<fail.bat> fails when the Perl script fails, but
+the return code is always C<1>, not the return code from the Perl script.
+
+=back
+
+=head2 FUNCTION
+
+By default, the ".pl" suffix will be stripped before adding a ".bat" suffix
+to the supplied file names.  This can be controlled with the C<-s> option.
+
+The default behavior is to have the batch file compare the C<OS>
+environment variable against C<"Windows_NT">.  If they match, it
+uses the C<%*> construct to refer to all the command line arguments
+that were given to it, so you'll need to make sure that works on your
+variant of the command shell.  It is known to work in the F<CMD.EXE> shell
+under Windows NT.  4DOS/NT users will want to put a C<ParameterChar = *>
+line in their initialization file, or execute C<setdos /p*> in
+the shell startup file.
+
+On Windows95 and other platforms a nine-argument limit is imposed
+on command-line arguments given to the generated batch file, since
+they may not support C<%*> in batch files.
+
+These can be overridden using the C<-n> and C<-o> options or the
+deprecated C<-a> option.
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<-n> I<ntargs>
+
+Arguments to invoke perl with in generated batch file when run from
+Windows NT (or Windows 98, probably).  Defaults to S<'-x -S %0 %*'>.
+
+=item B<-o> I<otherargs>
+
+Arguments to invoke perl with in generated batch file except when
+run from Windows NT (ie. when run from DOS, Windows 3.1, or Windows 95).
+Defaults to S<'-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9'>.
+
+=item B<-a> I<argstring>
+
+Arguments to invoke perl with in generated batch file.  Specifying
+B<-a> prevents the batch file from checking the C<OS> environment
+variable to determine which operating system it is being run from.
+
+=item B<-s> I<stripsuffix>
+
+Strip a suffix string from file name before appending a ".bat"
+suffix.  The suffix is not case-sensitive.  It can be a regex if
+it begins with `/' (the trailing '/' is optional and a trailing
+C<$> is always assumed).  Defaults to C</.plx?/>.
+
+=item B<-w>
+
+If no line matching C</^#!.*perl/> is found in the script, then such
+a line is inserted just after the new preamble.  The exact line
+depends on C<$Config{startperl}> [see L<Config>].  With the B<-w>
+option, C<" -w"> is added after the value of C<$Config{startperl}>.
+If a line matching C</^#!.*perl/> already exists in the script,
+then it is not changed and the B<-w> option is ignored.
+
+=item B<-u>
+
+If the script appears to have already been processed by B<pl2bat>,
+then the script is skipped and not processed unless B<-u> was
+specified.  If B<-u> is specified, the existing preamble is replaced.
+
+=item B<-h>
+
+Show command line usage.
+
+=back
+
+=head1 EXAMPLES
+
+	C:\> pl2bat foo.pl bar.PM 
+	[..creates foo.bat, bar.PM.bat..]
+	
+	C:\> pl2bat -s "/\.pl|\.pm/" foo.pl bar.PM
+	[..creates foo.bat, bar.bat..]
+	
+	C:\> pl2bat < somefile > another.bat
+	
+	C:\> pl2bat > another.bat
+	print scalar reverse "rekcah lrep rehtona tsuj\n";
+	^Z
+	[..another.bat is now a certified japh application..]
+	
+	C:\> ren *.bat *.pl
+	C:\> pl2bat -u *.pl
+	[..updates the wrapping of some previously wrapped scripts..]
+	
+	C:\> pl2bat -u -s .bat *.bat
+	[..same as previous example except more dangerous..]
+
+=head1 BUGS
+
+C<$0> will contain the full name, including the ".bat" suffix
+when the generated batch file runs.  If you don't like this,
+see runperl.bat for an alternative way to invoke perl scripts.
+
+Default behavior is to invoke Perl with the B<-S> flag, so Perl will
+search the B<PATH> to find the script.   This may have undesirable
+effects.
+
+On really old versions of Win32 Perl, you can't run the script
+via
+
+    C:> script.bat [args]
+
+and must use
+
+    C:> script [args]
+
+A loop should be used to build up the argument list when not on
+Windows NT so more than 9 arguments can be processed.
+
+See also L</Disadvantages>.
+
+=head1 SEE ALSO
+
+perl, perlwin32, runperl.bat
+
+=cut
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/pl2pm.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/pl2pm.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/pl2pm.bat	(revision 14489)
@@ -0,0 +1,393 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+
+=head1 NAME
+
+pl2pm - Rough tool to translate Perl4 .pl files to Perl5 .pm modules.
+
+=head1 SYNOPSIS
+
+B<pl2pm> F<files>
+
+=head1 DESCRIPTION
+
+B<pl2pm> is a tool to aid in the conversion of Perl4-style .pl
+library files to Perl5-style library modules.  Usually, your old .pl
+file will still work fine and you should only use this tool if you
+plan to update your library to use some of the newer Perl 5 features,
+such as AutoLoading.
+
+=head1 LIMITATIONS
+
+It's just a first step, but it's usually a good first step.
+
+=head1 AUTHOR
+
+Larry Wall <larry@wall.org>
+
+=cut
+
+use strict;
+use warnings;
+
+my %keyword = ();
+
+while (<DATA>) {
+    chomp;
+    $keyword{$_} = 1;
+}
+
+local $/;
+
+while (<>) {
+    my $newname = $ARGV;
+    $newname =~ s/\.pl$/.pm/ || next;
+    $newname =~ s#(.*/)?(\w+)#$1\u$2#;
+    if (-f $newname) {
+	warn "Won't overwrite existing $newname\n";
+	next;
+    }
+    my $oldpack = $2;
+    my $newpack = "\u$2";
+    my @export = ();
+
+    s/\bstd(in|out|err)\b/\U$&/g;
+    s/(sub\s+)(\w+)(\s*\{[ \t]*\n)\s*package\s+$oldpack\s*;[ \t]*\n+/${1}main'$2$3/ig;
+    if (/sub\s+\w+'/) {
+	@export = m/sub\s+\w+'(\w+)/g;
+	s/(sub\s+)main'(\w+)/$1$2/g;
+    }
+    else {
+	@export = m/sub\s+([A-Za-z]\w*)/g;
+    }
+    my @export_ok = grep($keyword{$_}, @export);
+    @export = grep(!$keyword{$_}, @export);
+
+    my %export = ();
+    @export{@export} = (1) x @export;
+
+    s/(^\s*);#/$1#/g;
+    s/(#.*)require ['"]$oldpack\.pl['"]/$1use $newpack/;
+    s/(package\s*)($oldpack)\s*;[ \t]*\n+//ig;
+    s/([\$\@%&*])'(\w+)/&xlate($1,"",$2,$newpack,$oldpack,\%export)/eg;
+    s/([\$\@%&*]?)(\w+)'(\w+)/&xlate($1,$2,$3,$newpack,$oldpack,\%export)/eg;
+    if (!/\$\[\s*\)?\s*=\s*[^0\s]/) {
+	s/^\s*(local\s*\()?\s*\$\[\s*\)?\s*=\s*0\s*;[ \t]*\n//g;
+	s/\$\[\s*\+\s*//g;
+	s/\s*\+\s*\$\[//g;
+	s/\$\[/0/g;
+    }
+    s/open\s+(\w+)/open($1)/g;
+ 
+    my $export_ok = '';
+    my $carp      ='';
+
+
+    if (s/\bdie\b/croak/g) {
+	$carp = "use Carp;\n";
+	s/croak "([^"]*)\\n"/croak "$1"/g;
+    }
+
+    if (@export_ok) {
+	$export_ok = "\@EXPORT_OK = qw(@export_ok);\n";
+    }
+
+    if ( open(PM, ">$newname") ) {
+        print PM <<"END";
+package $newpack;
+use 5.006;
+require Exporter;
+$carp
+\@ISA = qw(Exporter);
+\@EXPORT = qw(@export);
+$export_ok
+$_
+END
+    }
+    else {
+      warn "Can't create $newname: $!\n";
+    }
+}
+
+sub xlate {
+    my ($prefix, $pack, $ident,$newpack,$oldpack,$export) = @_;
+
+    my $xlated ;
+    if ($prefix eq '' && $ident =~ /^(t|s|m|d|ing|ll|ed|ve|re)$/) {
+	$xlated = "${pack}'$ident";
+    }
+    elsif ($pack eq '' || $pack eq 'main') {
+	if ($export->{$ident}) {
+	    $xlated = "$prefix$ident";
+	}
+	else {
+	    $xlated = "$prefix${pack}::$ident";
+	}
+    }
+    elsif ($pack eq $oldpack) {
+	$xlated = "$prefix${newpack}::$ident";
+    }
+    else {
+	$xlated = "$prefix${pack}::$ident";
+    }
+
+    return $xlated;
+}
+__END__
+AUTOLOAD
+BEGIN
+CORE
+DESTROY
+END
+INIT
+CHECK
+abs
+accept
+alarm
+and
+atan2
+bind
+binmode
+bless
+caller
+chdir
+chmod
+chomp
+chop
+chown
+chr
+chroot
+close
+closedir
+cmp
+connect
+continue
+cos
+crypt
+dbmclose
+dbmopen
+defined
+delete
+die
+do
+dump
+each
+else
+elsif
+endgrent
+endhostent
+endnetent
+endprotoent
+endpwent
+endservent
+eof
+eq
+eval
+exec
+exists
+exit
+exp
+fcntl
+fileno
+flock
+for
+foreach
+fork
+format
+formline
+ge
+getc
+getgrent
+getgrgid
+getgrnam
+gethostbyaddr
+gethostbyname
+gethostent
+getlogin
+getnetbyaddr
+getnetbyname
+getnetent
+getpeername
+getpgrp
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getprotoent
+getpwent
+getpwnam
+getpwuid
+getservbyname
+getservbyport
+getservent
+getsockname
+getsockopt
+glob
+gmtime
+goto
+grep
+gt
+hex
+if
+index
+int
+ioctl
+join
+keys
+kill
+last
+lc
+lcfirst
+le
+length
+link
+listen
+local
+localtime
+lock
+log
+lstat
+lt
+m
+map
+mkdir
+msgctl
+msgget
+msgrcv
+msgsnd
+my
+ne
+next
+no
+not
+oct
+open
+opendir
+or
+ord
+our
+pack
+package
+pipe
+pop
+pos
+print
+printf
+prototype
+push
+q
+qq
+qr
+quotemeta
+qw
+qx
+rand
+read
+readdir
+readline
+readlink
+readpipe
+recv
+redo
+ref
+rename
+require
+reset
+return
+reverse
+rewinddir
+rindex
+rmdir
+s
+scalar
+seek
+seekdir
+select
+semctl
+semget
+semop
+send
+setgrent
+sethostent
+setnetent
+setpgrp
+setpriority
+setprotoent
+setpwent
+setservent
+setsockopt
+shift
+shmctl
+shmget
+shmread
+shmwrite
+shutdown
+sin
+sleep
+socket
+socketpair
+sort
+splice
+split
+sprintf
+sqrt
+srand
+stat
+study
+sub
+substr
+symlink
+syscall
+sysopen
+sysread
+sysseek
+system
+syswrite
+tell
+telldir
+tie
+tied
+time
+times
+tr
+truncate
+uc
+ucfirst
+umask
+undef
+unless
+unlink
+unpack
+unshift
+untie
+until
+use
+utime
+values
+vec
+wait
+waitpid
+wantarray
+warn
+while
+write
+x
+xor
+y
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/pod2html.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/pod2html.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/pod2html.bat	(revision 14489)
@@ -0,0 +1,160 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+=pod
+
+=head1 NAME
+
+pod2html - convert .pod files to .html files
+
+=head1 SYNOPSIS
+
+    pod2html --help --htmlroot=<name> --infile=<name> --outfile=<name>
+             --podpath=<name>:...:<name> --podroot=<name>
+             --libpods=<name>:...:<name> --recurse --norecurse --verbose
+             --index --noindex --title=<name>
+
+=head1 DESCRIPTION
+
+Converts files from pod format (see L<perlpod>) to HTML format.
+
+=head1 ARGUMENTS
+
+pod2html takes the following arguments:
+
+=over 4
+
+=item help
+
+  --help
+
+Displays the usage message.
+
+=item htmlroot
+
+  --htmlroot=name
+
+Sets the base URL for the HTML files.  When cross-references are made,
+the HTML root is prepended to the URL.
+
+=item infile
+
+  --infile=name
+
+Specify the pod file to convert.  Input is taken from STDIN if no
+infile is specified.
+
+=item outfile
+
+  --outfile=name
+
+Specify the HTML file to create.  Output goes to STDOUT if no outfile
+is specified.
+
+=item podroot
+
+  --podroot=name
+
+Specify the base directory for finding library pods.
+
+=item podpath
+
+  --podpath=name:...:name
+
+Specify which subdirectories of the podroot contain pod files whose
+HTML converted forms can be linked-to in cross-references.
+
+=item libpods
+
+  --libpods=name:...:name
+
+List of page names (eg, "perlfunc") which contain linkable C<=item>s.
+
+=item netscape
+
+  --netscape
+
+Use Netscape HTML directives when applicable.
+
+=item nonetscape
+
+  --nonetscape
+
+Do not use Netscape HTML directives (default).
+
+=item index
+
+  --index
+
+Generate an index at the top of the HTML file (default behaviour).
+
+=item noindex
+
+  --noindex
+
+Do not generate an index at the top of the HTML file.
+
+
+=item recurse
+
+  --recurse
+
+Recurse into subdirectories specified in podpath (default behaviour).
+
+=item norecurse
+
+  --norecurse
+
+Do not recurse into subdirectories specified in podpath.
+
+=item title
+
+  --title=title
+
+Specify the title of the resulting HTML file.
+
+=item verbose
+
+  --verbose
+
+Display progress messages.
+
+=back
+
+=head1 AUTHOR
+
+Tom Christiansen, E<lt>tchrist@perl.comE<gt>.
+
+=head1 BUGS
+
+See L<Pod::Html> for a list of known bugs in the translator.
+
+=head1 SEE ALSO
+
+L<perlpod>, L<Pod::Html>
+
+=head1 COPYRIGHT
+
+This program is distributed under the Artistic License.
+
+=cut
+
+use Pod::Html;
+
+pod2html @ARGV;
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/pod2latex.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/pod2latex.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/pod2latex.bat	(revision 14489)
@@ -0,0 +1,398 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+
+# pod2latex conversion program
+
+use strict;
+use Pod::LaTeX;
+use Pod::Find qw/ pod_find /;
+use Pod::Usage;
+use Getopt::Long;
+use File::Basename;
+use Symbol;
+
+my $VERSION = "1.01";
+
+# return the entire contents of a text file
+# whose name is given as argument
+sub _get {
+    my $fn = shift;
+    my $infh = gensym;
+    open $infh, $fn
+        or die "Could not open file $fn: $!\n";
+    local $/;
+    return <$infh>;
+}
+
+# Read command line arguments
+
+my %options = (
+	       "help"   => 0,
+	       "man"    => 0,
+	       "sections" => [],
+	       "full"   => 0,
+	       "out"    => undef,
+	       "verbose" => 0,
+	       "modify" => 0,
+	       "h1level" => 1,  # section is equivalent to H1
+	       "preamble" => [],
+	       "postamble" => [],
+	      );
+# "prefile" is just like "preamble", but the argument 
+# comes from the file named by the argument
+$options{"prefile"} = sub { shift; push @{$options{"preamble"}}, _get(shift) };
+# the same between "postfile" and "postamble"
+$options{"postfile"} = sub { shift; push @{$options{"postamble"}}, _get(shift) };
+
+GetOptions(\%options, 
+	   "help",
+	   "man",
+	   "verbose",
+	   "full",
+	   "sections=s@",
+	   "out=s",
+	   "modify",
+	   "h1level=i",
+	   "preamble=s@",
+	   "postamble=s@",
+	   "prefile=s", 
+	   "postfile=s"
+	  ) || pod2usage(2);
+
+pod2usage(1)  if ($options{help});
+pod2usage(-verbose => 2)  if ($options{man});
+
+
+# Read all the files from the command line
+my @files = @ARGV;
+
+# Now find which ones are real pods and convert 
+# directories to their contents.
+
+# Extract the pods from each arg since some of them might
+# be directories
+# This is not as efficient as using pod_find to search through
+# everything at once but it allows us to preserve the order 
+# supplied by the user
+
+my @pods;
+foreach my $arg (@files) {
+  my %pods = pod_find($arg);
+  push(@pods, sort keys %pods);
+}
+
+# Abort if nothing to do
+if ($#pods == -1) {
+  warn "None of the supplied Pod files actually exist\n";
+  exit;
+}
+
+# Only want to override the preamble and postamble if we have
+# been given values.
+my %User;
+$User{UserPreamble} = join("\n", @{$options{'preamble'}})
+  if ($options{preamble} && @{$options{preamble}});
+$User{UserPostamble} = join("\n", @{$options{'postamble'}})
+  if ($options{postamble} && @{$options{postamble}});
+
+
+
+# If $options{'out'} is set we are processing to a single output file
+my $multi_documents;
+if (exists $options{'out'} && defined $options{'out'}) {
+  $multi_documents = 0;
+} else {
+  $multi_documents = 1;
+}
+
+# If the output file is not specified it is assumed that
+# a single output file is required per input file using
+# a .tex extension rather than any exisiting extension
+
+if ($multi_documents) {
+
+  # Case where we just generate one input per output
+
+  foreach my $pod (@pods) {
+
+    if (-f $pod) {
+
+      my $output = $pod;
+      $output = basename($output, '.pm', '.pod','.pl') . '.tex';
+
+      # Create a new parser object
+      my $parser = new Pod::LaTeX(
+				  AddPreamble => $options{'full'},
+				  AddPostamble => $options{'full'},
+				  MakeIndex => $options{'full'},
+				  TableOfContents => $options{'full'},
+				  ReplaceNAMEwithSection => $options{'modify'},
+				  UniqueLabels => $options{'modify'},
+				  Head1Level => $options{'h1level'},
+				  LevelNoNum => $options{'h1level'} + 1,
+                                  %User,
+				 );
+
+      # Select sections if supplied
+      $parser->select(@{ $options{'sections'}})
+	if @{$options{'sections'}};
+
+      # Derive the input file from the output file
+      $parser->parse_from_file($pod, $output);
+
+      print "Written output to $output\n" if $options{'verbose'};
+
+    } else {
+      warn "File $pod not found\n";
+    }
+
+  }
+} else {
+
+  # Case where we want everything to be in a single document
+
+  # Need to open the output file ourselves
+  my $output = $options{'out'};
+  $output .= '.tex' unless $output =~ /\.tex$/;
+
+  # Use auto-vivified file handle in perl 5.6
+  my $outfh = gensym;
+  open ($outfh, ">$output") || die "Could not open output file: $!\n";
+
+  # Flag to indicate whether we have converted at least one file
+  # indicates how many files have been converted
+  my $converted = 0;
+
+  # Loop over the input files
+  foreach my $pod (@pods) {
+
+    if (-f $pod) {
+
+      warn "Converting $pod\n" if $options{'verbose'};
+
+      # Open the file (need the handle)
+      # Use auto-vivified handle in perl 5.6
+      my $podfh = gensym;
+      open ($podfh, "<$pod") || die "Could not open pod file $pod: $!\n";
+
+      # if this is the first file to be converted we may want to add
+      # a preamble (controlled by command line option)
+      my $preamble = 0;
+      $preamble = 1 if ($converted == 0 && $options{'full'});
+
+      # if this is the last file to be converted may want to add
+      # a postamble (controlled by command line option)
+      # relies on a previous pass to check existence of all pods we
+      # are converting.
+      my $postamble = ( ($converted == $#pods && $options{'full'}) ? 1 : 0 );
+
+      # Open parser object
+      # May want to start with a preamble for the first one and
+      # end with an index for the last
+      my $parser = new Pod::LaTeX(
+				  MakeIndex => $options{'full'},
+				  TableOfContents => $preamble,
+				  ReplaceNAMEwithSection => $options{'modify'},
+				  UniqueLabels => $options{'modify'},
+				  StartWithNewPage => $options{'full'},
+				  AddPreamble => $preamble,
+				  AddPostamble => $postamble,
+				  Head1Level => $options{'h1level'},
+				  LevelNoNum => $options{'h1level'} + 1,
+                                  %User
+				 );
+
+      # Store the file name for error messages
+      # This is a kluge that breaks the data hiding of the object
+      $parser->{_INFILE} = $pod;
+
+      # Select sections if supplied
+      $parser->select(@{ $options{'sections'}})
+	if @{$options{'sections'}};
+
+      # Parse it
+      $parser->parse_from_filehandle($podfh, $outfh);
+
+      # We have converted at least one file
+      $converted++;
+
+    } else {
+      warn "File $pod not found\n";
+    }
+
+  }
+
+  # Should unlink the file if we didn't convert anything!
+  # dont check for return status of unlink
+  # since there is not a lot to be done if the unlink failed
+  # and the program does not rely upon it.
+  unlink "$output" unless $converted;
+
+  # If verbose
+  warn "Converted $converted files\n" if $options{'verbose'};
+
+}
+
+exit;
+
+__END__
+
+=head1 NAME
+
+pod2latex - convert pod documentation to latex format
+
+=head1 SYNOPSIS
+
+  pod2latex *.pm
+
+  pod2latex -out mytex.tex *.pod
+
+  pod2latex -full -sections 'DESCRIPTION|NAME' SomeDir
+
+  pod2latex -prefile h.tex -postfile t.tex my.pod
+
+=head1 DESCRIPTION
+
+C<pod2latex> is a program to convert POD format documentation
+(L<perlpod>) into latex. It can process multiple input documents at a
+time and either generate a latex file per input document or a single
+combined output file.
+
+=head1 OPTIONS AND ARGUMENTS
+
+This section describes the supported command line options. Minimum
+matching is supported.
+
+=over 4
+
+=item B<-out>
+
+Name of the output file to be used. If there are multiple input pods
+it is assumed that the intention is to write all translated output
+into a single file. C<.tex> is appended if not present.  If the
+argument is not supplied, a single document will be created for each
+input file.
+
+=item B<-full>
+
+Creates a complete C<latex> file that can be processed immediately
+(unless C<=for/=begin> directives are used that rely on extra packages).
+Table of contents and index generation commands are included in the
+wrapper C<latex> code.
+
+=item B<-sections>
+
+Specify pod sections to include (or remove if negated) in the
+translation.  See L<Pod::Select/"SECTION SPECIFICATIONS"> for the
+format to use for I<section-spec>. This option may be given multiple
+times on the command line.This is identical to the similar option in
+the C<podselect()> command.
+
+=item B<-modify>
+
+This option causes the output C<latex> to be slightly
+modified from the input pod such that when a C<=head1 NAME>
+is encountered a section is created containing the actual
+pod name (rather than B<NAME>) and all subsequent C<=head1>
+directives are treated as subsections. This has the advantage
+that the description of a module will be in its own section
+which is helpful for including module descriptions in documentation.
+Also forces C<latex> label and index entries to be prefixed by the
+name of the module.
+
+=item B<-h1level>
+
+Specifies the C<latex> section that is equivalent to a C<H1> pod
+directive. This is an integer between 0 and 5 with 0 equivalent to a
+C<latex> chapter, 1 equivalent to a C<latex> section etc. The default
+is 1 (C<H1> equivalent to a latex section).
+
+=item B<-help>
+
+Print a brief help message and exit.
+
+=item B<-man>
+
+Print the manual page and exit.
+
+=item B<-verbose>
+
+Print information messages as each document is processed.
+
+=item B<-preamble>
+
+A user-supplied preamble for the LaTeX code. Multiple values
+are supported and appended in order separated by "\n".
+See B<-prefile> for reading the preamble from a file.
+
+=item B<-postamble>
+
+A user supplied postamble for the LaTeX code. Multiple values
+are supported and appended in order separated by "\n".
+See B<-postfile> for reading the postamble from a file.
+
+=item B<-prefile>
+
+A user-supplied preamble for the LaTeX code to be read from the
+named file. Multiple values are supported and appended in
+order. See B<-preamble>.
+
+=item B<-postfile>
+
+A user-supplied postamble for the LaTeX code to be read from the
+named file. Multiple values are supported and appended in
+order. See B<-postamble>.
+
+=back
+
+=head1 BUGS
+
+Known bugs are:
+
+=over 4
+
+=item *
+
+Cross references between documents are not resolved when multiple
+pod documents are converted into a single output C<latex> file.
+
+=item *
+
+Functions and variables are not automatically recognized
+and they will therefore not be marked up in any special way
+unless instructed by an explicit pod command.
+
+=back
+
+=head1 SEE ALSO
+
+L<Pod::LaTeX>
+
+=head1 AUTHOR
+
+Tim Jenness E<lt>tjenness@cpan.orgE<gt>
+
+This program is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+
+Copyright (C) 2000, 2003, 2004 Tim Jenness. All Rights Reserved.
+
+=cut
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/pod2man.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/pod2man.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/pod2man.bat	(revision 14489)
@@ -0,0 +1,529 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+        if $running_under_some_shell;
+
+# pod2man -- Convert POD data to formatted *roff input.
+# $Id: pod2man.PL,v 1.10 2002/07/15 05:45:56 eagle Exp $
+#
+# Copyright 1999, 2000, 2001 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+require 5.004;
+
+use Getopt::Long qw(GetOptions);
+use Pod::Man ();
+use Pod::Usage qw(pod2usage);
+
+use strict;
+
+# Silence -w warnings.
+use vars qw($running_under_some_shell);
+
+# Insert -- into @ARGV before any single dash argument to hide it from
+# Getopt::Long; we want to interpret it as meaning stdin (which Pod::Parser
+# does correctly).
+my $stdin;
+@ARGV = map { $_ eq '-' && !$stdin++ ? ('--', $_) : $_ } @ARGV;
+
+# Parse our options, trying to retain backwards compatibility with pod2man but
+# allowing short forms as well.  --lax is currently ignored.
+my %options;
+Getopt::Long::config ('bundling_override');
+GetOptions (\%options, 'section|s=s', 'release|r:s', 'center|c=s',
+            'date|d=s', 'fixed=s', 'fixedbold=s', 'fixeditalic=s',
+            'fixedbolditalic=s', 'name|n=s', 'official|o', 'quotes|q=s',
+            'lax|l', 'help|h', 'verbose|v') or exit 1;
+pod2usage (0) if $options{help};
+
+# Official sets --center, but don't override things explicitly set.
+if ($options{official} && !defined $options{center}) {
+    $options{center} = 'Perl Programmers Reference Guide';
+}
+
+# Verbose is only our flag, not a Pod::Man flag.
+my $verbose = $options{verbose};
+delete $options{verbose};
+
+# This isn't a valid Pod::Man option and is only accepted for backwards
+# compatibility.
+delete $options{lax};
+
+# Initialize and run the formatter, pulling a pair of input and output off at
+# a time.
+my $parser = Pod::Man->new (%options);
+my @files;
+do {
+    @files = splice (@ARGV, 0, 2);
+    print "  $files[1]\n" if $verbose;
+    $parser->parse_from_file (@files);
+} while (@ARGV);
+
+__END__
+
+=head1 NAME
+
+pod2man - Convert POD data to formatted *roff input
+
+=head1 SYNOPSIS
+
+pod2man [B<--section>=I<manext>] [B<--release>=I<version>]
+[B<--center>=I<string>] [B<--date>=I<string>] [B<--fixed>=I<font>]
+[B<--fixedbold>=I<font>] [B<--fixeditalic>=I<font>]
+[B<--fixedbolditalic>=I<font>] [B<--name>=I<name>] [B<--official>]
+[B<--lax>] [B<--quotes>=I<quotes>] [B<--verbose>]
+[I<input> [I<output>] ...]
+
+pod2man B<--help>
+
+=head1 DESCRIPTION
+
+B<pod2man> is a front-end for Pod::Man, using it to generate *roff input
+from POD source.  The resulting *roff code is suitable for display on a
+terminal using nroff(1), normally via man(1), or printing using troff(1).
+
+I<input> is the file to read for POD source (the POD can be embedded in
+code).  If I<input> isn't given, it defaults to STDIN.  I<output>, if given,
+is the file to which to write the formatted output.  If I<output> isn't
+given, the formatted output is written to STDOUT.  Several POD files can be
+processed in the same B<pod2man> invocation (saving module load and compile
+times) by providing multiple pairs of I<input> and I<output> files on the
+command line.
+
+B<--section>, B<--release>, B<--center>, B<--date>, and B<--official> can be
+used to set the headers and footers to use; if not given, Pod::Man will
+assume various defaults.  See below or L<Pod::Man> for details.
+
+B<pod2man> assumes that your *roff formatters have a fixed-width font named
+CW.  If yours is called something else (like CR), use B<--fixed> to specify
+it.  This generally only matters for troff output for printing.  Similarly,
+you can set the fonts used for bold, italic, and bold italic fixed-width
+output.
+
+Besides the obvious pod conversions, Pod::Man, and therefore pod2man also
+takes care of formatting func(), func(n), and simple variable references
+like $foo or @bar so you don't have to use code escapes for them; complex
+expressions like C<$fred{'stuff'}> will still need to be escaped, though.
+It also translates dashes that aren't used as hyphens into en dashes, makes
+long dashes--like this--into proper em dashes, fixes "paired quotes," and
+takes care of several other troff-specific tweaks.  See L<Pod::Man> for
+complete information.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-c> I<string>, B<--center>=I<string>
+
+Sets the centered page header to I<string>.  The default is "User
+Contributed Perl Documentation", but also see B<--official> below.
+
+=item B<-d> I<string>, B<--date>=I<string>
+
+Set the left-hand footer string to this value.  By default, the modification
+date of the input file will be used, or the current date if input comes from
+STDIN.
+
+=item B<--fixed>=I<font>
+
+The fixed-width font to use for vertabim text and code.  Defaults to CW.
+Some systems may want CR instead.  Only matters for troff(1) output.
+
+=item B<--fixedbold>=I<font>
+
+Bold version of the fixed-width font.  Defaults to CB.  Only matters for
+troff(1) output.
+
+=item B<--fixeditalic>=I<font>
+
+Italic version of the fixed-width font (actually, something of a misnomer,
+since most fixed-width fonts only have an oblique version, not an italic
+version).  Defaults to CI.  Only matters for troff(1) output.
+
+=item B<--fixedbolditalic>=I<font>
+
+Bold italic (probably actually oblique) version of the fixed-width font.
+Pod::Man doesn't assume you have this, and defaults to CB.  Some systems
+(such as Solaris) have this font available as CX.  Only matters for troff(1)
+output.
+
+=item B<-h>, B<--help>
+
+Print out usage information.
+
+=item B<-l>, B<--lax>
+
+No longer used.  B<pod2man> used to check its input for validity as a manual
+page, but this should now be done by L<podchecker(1)> instead.  Accepted for
+backwards compatibility; this option no longer does anything.
+
+=item B<-n> I<name>, B<--name>=I<name>
+
+Set the name of the manual page to I<name>.  Without this option, the manual
+name is set to the uppercased base name of the file being converted unless
+the manual section is 3, in which case the path is parsed to see if it is a
+Perl module path.  If it is, a path like C<.../lib/Pod/Man.pm> is converted
+into a name like C<Pod::Man>.  This option, if given, overrides any
+automatic determination of the name.
+
+Note that this option is probably not useful when converting multiple POD
+files at once.  The convention for Unix man pages for commands is for the
+man page title to be in all-uppercase even if the command isn't.
+
+=item B<-o>, B<--official>
+
+Set the default header to indicate that this page is part of the standard
+Perl release, if B<--center> is not also given.
+
+=item B<-q> I<quotes>, B<--quotes>=I<quotes>
+
+Sets the quote marks used to surround CE<lt>> text to I<quotes>.  If
+I<quotes> is a single character, it is used as both the left and right
+quote; if I<quotes> is two characters, the first character is used as the
+left quote and the second as the right quoted; and if I<quotes> is four
+characters, the first two are used as the left quote and the second two as
+the right quote.
+
+I<quotes> may also be set to the special value C<none>, in which case no
+quote marks are added around CE<lt>> text (but the font is still changed for
+troff output).
+
+=item B<-r>, B<--release>
+
+Set the centered footer.  By default, this is the version of Perl you run
+B<pod2man> under.  Note that some system an macro sets assume that the
+centered footer will be a modification date and will prepend something like
+"Last modified: "; if this is the case, you may want to set B<--release> to
+the last modified date and B<--date> to the version number.
+
+=item B<-s>, B<--section>
+
+Set the section for the C<.TH> macro.  The standard section numbering
+convention is to use 1 for user commands, 2 for system calls, 3 for
+functions, 4 for devices, 5 for file formats, 6 for games, 7 for
+miscellaneous information, and 8 for administrator commands.  There is a lot
+of variation here, however; some systems (like Solaris) use 4 for file
+formats, 5 for miscellaneous information, and 7 for devices.  Still others
+use 1m instead of 8, or some mix of both.  About the only section numbers
+that are reliably consistent are 1, 2, and 3.
+
+By default, section 1 will be used unless the file ends in .pm in which case
+section 3 will be selected.
+
+=item B<-v>, B<--verbose>
+
+Print out the name of each output file as it is being generated.
+
+=back
+
+=head1 DIAGNOSTICS
+
+If B<pod2man> fails with errors, see L<Pod::Man> and L<Pod::Parser> for
+information about what those errors might mean.
+
+=head1 EXAMPLES
+
+    pod2man program > program.1
+    pod2man SomeModule.pm /usr/perl/man/man3/SomeModule.3
+    pod2man --section=7 note.pod > note.7
+
+If you would like to print out a lot of man page continuously, you probably
+want to set the C and D registers to set contiguous page numbering and
+even/odd paging, at least on some versions of man(7).
+
+    troff -man -rC1 -rD1 perl.1 perldata.1 perlsyn.1 ...
+
+To get index entries on stderr, turn on the F register, as in:
+
+    troff -man -rF1 perl.1
+
+The indexing merely outputs messages via C<.tm> for each major page,
+section, subsection, item, and any C<XE<lt>E<gt>> directives.  See
+L<Pod::Man> for more details.
+
+=head1 BUGS
+
+Lots of this documentation is duplicated from L<Pod::Man>.
+
+=head1 NOTES
+
+For those not sure of the proper layout of a man page, here are some notes
+on writing a proper man page.
+
+The name of the program being documented is conventionally written in bold
+(using BE<lt>E<gt>) wherever it occurs, as are all program options.
+Arguments should be written in italics (IE<lt>E<gt>).  Functions are
+traditionally written in italics; if you write a function as function(),
+Pod::Man will take care of this for you.  Literal code or commands should
+be in CE<lt>E<gt>.  References to other man pages should be in the form
+C<manpage(section)>, and Pod::Man will automatically format those
+appropriately.  As an exception, it's traditional not to use this form when
+referring to module documentation; use C<LE<lt>Module::NameE<gt>> instead.
+
+References to other programs or functions are normally in the form of man
+page references so that cross-referencing tools can provide the user with
+links and the like.  It's possible to overdo this, though, so be careful not
+to clutter your documentation with too much markup.
+
+The major headers should be set out using a C<=head1> directive, and are
+historically written in the rather startling ALL UPPER CASE format, although
+this is not mandatory.  Minor headers may be included using C<=head2>, and
+are typically in mixed case.
+
+The standard sections of a manual page are:
+
+=over 4
+
+=item NAME
+
+Mandatory section; should be a comma-separated list of programs or functions
+documented by this podpage, such as:
+
+    foo, bar - programs to do something
+
+Manual page indexers are often extremely picky about the format of this
+section, so don't put anything in it except this line.  A single dash, and
+only a single dash, should separate the list of programs or functions from
+the description.  Functions should not be qualified with C<()> or the like.
+The description should ideally fit on a single line, even if a man program
+replaces the dash with a few tabs.
+
+=item SYNOPSIS
+
+A short usage summary for programs and functions.  This section is mandatory
+for section 3 pages.
+
+=item DESCRIPTION
+
+Extended description and discussion of the program or functions, or the body
+of the documentation for man pages that document something else.  If
+particularly long, it's a good idea to break this up into subsections
+C<=head2> directives like:
+
+    =head2 Normal Usage
+
+    =head2 Advanced Features
+
+    =head2 Writing Configuration Files
+
+or whatever is appropriate for your documentation.
+
+=item OPTIONS
+
+Detailed description of each of the command-line options taken by the
+program.  This should be separate from the description for the use of things
+like L<Pod::Usage|Pod::Usage>.  This is normally presented as a list, with
+each option as a separate C<=item>.  The specific option string should be
+enclosed in BE<lt>E<gt>.  Any values that the option takes should be
+enclosed in IE<lt>E<gt>.  For example, the section for the option
+B<--section>=I<manext> would be introduced with:
+
+    =item B<--section>=I<manext>
+
+Synonymous options (like both the short and long forms) are separated by a
+comma and a space on the same C<=item> line, or optionally listed as their
+own item with a reference to the canonical name.  For example, since
+B<--section> can also be written as B<-s>, the above would be:
+
+    =item B<-s> I<manext>, B<--section>=I<manext>
+
+(Writing the short option first is arguably easier to read, since the long
+option is long enough to draw the eye to it anyway and the short option can
+otherwise get lost in visual noise.)
+
+=item RETURN VALUE
+
+What the program or function returns, if successful.  This section can be
+omitted for programs whose precise exit codes aren't important, provided
+they return 0 on success as is standard.  It should always be present for
+functions.
+
+=item ERRORS
+
+Exceptions, error return codes, exit statuses, and errno settings.
+Typically used for function documentation; program documentation uses
+DIAGNOSTICS instead.  The general rule of thumb is that errors printed to
+STDOUT or STDERR and intended for the end user are documented in DIAGNOSTICS
+while errors passed internal to the calling program and intended for other
+programmers are documented in ERRORS.  When documenting a function that sets
+errno, a full list of the possible errno values should be given here.
+
+=item DIAGNOSTICS
+
+All possible messages the program can print out--and what they mean.  You
+may wish to follow the same documentation style as the Perl documentation;
+see perldiag(1) for more details (and look at the POD source as well).
+
+If applicable, please include details on what the user should do to correct
+the error; documenting an error as indicating "the input buffer is too
+small" without telling the user how to increase the size of the input buffer
+(or at least telling them that it isn't possible) aren't very useful.
+
+=item EXAMPLES
+
+Give some example uses of the program or function.  Don't skimp; users often
+find this the most useful part of the documentation.  The examples are
+generally given as verbatim paragraphs.
+
+Don't just present an example without explaining what it does.  Adding a
+short paragraph saying what the example will do can increase the value of
+the example immensely.
+
+=item ENVIRONMENT
+
+Environment variables that the program cares about, normally presented as a
+list using C<=over>, C<=item>, and C<=back>.  For example:
+
+    =over 6
+
+    =item HOME
+
+    Used to determine the user's home directory.  F<.foorc> in this
+    directory is read for configuration details, if it exists.
+
+    =back
+
+Since environment variables are normally in all uppercase, no additional
+special formatting is generally needed; they're glaring enough as it is.
+
+=item FILES
+
+All files used by the program or function, normally presented as a list, and
+what it uses them for.  File names should be enclosed in FE<lt>E<gt>.  It's
+particularly important to document files that will be potentially modified.
+
+=item CAVEATS
+
+Things to take special care with, sometimes called WARNINGS.
+
+=item BUGS
+
+Things that are broken or just don't work quite right.
+
+=item RESTRICTIONS
+
+Bugs you don't plan to fix.  :-)
+
+=item NOTES
+
+Miscellaneous commentary.
+
+=item SEE ALSO
+
+Other man pages to check out, like man(1), man(7), makewhatis(8), or
+catman(8).  Normally a simple list of man pages separated by commas, or a
+paragraph giving the name of a reference work.  Man page references, if they
+use the standard C<name(section)> form, don't have to be enclosed in
+LE<lt>E<gt> (although it's recommended), but other things in this section
+probably should be when appropriate.
+
+If the package has a mailing list, include a URL or subscription
+instructions here.
+
+If the package has a web site, include a URL here.
+
+=item AUTHOR
+
+Who wrote it (use AUTHORS for multiple people).  Including your current
+e-mail address (or some e-mail address to which bug reports should be sent)
+so that users have a way of contacting you is a good idea.  Remember that
+program documentation tends to roam the wild for far longer than you expect
+and pick an e-mail address that's likely to last if possible.
+
+=item COPYRIGHT AND LICENSE
+
+For copyright
+
+    Copyright YEAR(s) by YOUR NAME(s)
+
+(No, (C) is not needed.  No, "all rights reserved" is not needed.)
+
+For licensing the easiest way is to use the same licensing as Perl itself:
+
+    This library is free software; you may redistribute it and/or modify
+    it under the same terms as Perl itself.
+
+This makes it easy for people to use your module with Perl.  Note that
+this licensing is neither an endorsement or a requirement, you are of
+course free to choose any licensing.
+
+=item HISTORY
+
+Programs derived from other sources sometimes have this, or you might keep
+a modification log here.  If the log gets overly long or detailed,
+consider maintaining it in a separate file, though.
+
+=back
+
+In addition, some systems use CONFORMING TO to note conformance to relevant
+standards and MT-LEVEL to note safeness for use in threaded programs or
+signal handlers.  These headings are primarily useful when documenting parts
+of a C library.  Documentation of object-oriented libraries or modules may
+use CONSTRUCTORS and METHODS sections for detailed documentation of the
+parts of the library and save the DESCRIPTION section for an overview; other
+large modules may use FUNCTIONS for similar reasons.  Some people use
+OVERVIEW to summarize the description if it's quite long.
+
+Section ordering varies, although NAME should I<always> be the first section
+(you'll break some man page systems otherwise), and NAME, SYNOPSIS,
+DESCRIPTION, and OPTIONS generally always occur first and in that order if
+present.  In general, SEE ALSO, AUTHOR, and similar material should be left
+for last.  Some systems also move WARNINGS and NOTES to last.  The order
+given above should be reasonable for most purposes.
+
+Finally, as a general note, try not to use an excessive amount of markup.
+As documented here and in L<Pod::Man>, you can safely leave Perl variables,
+function names, man page references, and the like unadorned by markup and
+the POD translators will figure it out for you.  This makes it much easier
+to later edit the documentation.  Note that many existing translators
+(including this one currently) will do the wrong thing with e-mail addresses
+or URLs when wrapped in LE<lt>E<gt>, so don't do that.
+
+For additional information that may be more accurate for your specific
+system, see either L<man(5)> or L<man(7)> depending on your system manual
+section numbering conventions.
+
+=head1 SEE ALSO
+
+L<Pod::Man>, L<Pod::Parser>, L<man(1)>, L<nroff(1)>, L<podchecker(1)>,
+L<troff(1)>, L<man(7)>
+
+The man page documenting the an macro set may be L<man(5)> instead of
+L<man(7)> on your system.
+
+The current version of this script is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>, based I<very> heavily on the original
+B<pod2man> by Larry Wall and Tom Christiansen.  Large portions of this
+documentation, particularly the sections on the anatomy of a proper man
+page, are taken from the B<pod2man> documentation by Tom.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1999, 2000, 2001 by Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/pod2text.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/pod2text.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/pod2text.bat	(revision 14489)
@@ -0,0 +1,257 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+        if $running_under_some_shell;
+
+# pod2text -- Convert POD data to formatted ASCII text.
+#
+# Copyright 1999, 2000, 2001 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# The driver script for Pod::Text, Pod::Text::Termcap, and Pod::Text::Color,
+# invoked by perldoc -t among other things.
+
+require 5.004;
+
+use Getopt::Long qw(GetOptions);
+use Pod::Text ();
+use Pod::Usage qw(pod2usage);
+
+use strict;
+
+# Silence -w warnings.
+use vars qw($running_under_some_shell);
+
+# Take an initial pass through our options, looking for one of the form
+# -<number>.  We turn that into -w <number> for compatibility with the
+# original pod2text script.
+for (my $i = 0; $i < @ARGV; $i++) {
+    last if $ARGV[$i] =~ /^--$/;
+    if ($ARGV[$i] =~ /^-(\d+)$/) {
+        splice (@ARGV, $i++, 1, '-w', $1);
+    }
+}
+
+# Insert -- into @ARGV before any single dash argument to hide it from
+# Getopt::Long; we want to interpret it as meaning stdin (which Pod::Parser
+# does correctly).
+my $stdin;
+@ARGV = map { $_ eq '-' && !$stdin++ ? ('--', $_) : $_ } @ARGV;
+
+# Parse our options.  Use the same names as Pod::Text for simplicity, and
+# default to sentence boundaries turned off for compatibility.
+my %options;
+$options{sentence} = 0;
+Getopt::Long::config ('bundling');
+GetOptions (\%options, 'alt|a', 'code', 'color|c', 'help|h', 'indent|i=i',
+            'loose|l', 'margin|left-margin|m=i', 'overstrike|o',
+            'quotes|q=s', 'sentence|s', 'termcap|t', 'width|w=i') or exit 1;
+pod2usage (1) if $options{help};
+
+# Figure out what formatter we're going to use.  -c overrides -t.
+my $formatter = 'Pod::Text';
+if ($options{color}) {
+    $formatter = 'Pod::Text::Color';
+    eval { require Term::ANSIColor };
+    if ($@) { die "-c (--color) requires Term::ANSIColor be installed\n" }
+    require Pod::Text::Color;
+} elsif ($options{termcap}) {
+    $formatter = 'Pod::Text::Termcap';
+    require Pod::Text::Termcap;
+} elsif ($options{overstrike}) {
+    $formatter = 'Pod::Text::Overstrike';
+    require Pod::Text::Overstrike;
+}
+delete @options{'color', 'termcap', 'overstrike'};
+
+# Initialize and run the formatter.
+my $parser = $formatter->new (%options);
+$parser->parse_from_file (@ARGV);
+
+__END__
+
+=head1 NAME
+
+pod2text - Convert POD data to formatted ASCII text
+
+=head1 SYNOPSIS
+
+pod2text [B<-aclost>] [B<--code>] [B<-i> I<indent>] S<[B<-q> I<quotes>]>
+S<[B<-w> I<width>]> [I<input> [I<output>]]
+
+pod2text B<-h>
+
+=head1 DESCRIPTION
+
+B<pod2text> is a front-end for Pod::Text and its subclasses.  It uses them
+to generate formatted ASCII text from POD source.  It can optionally use
+either termcap sequences or ANSI color escape sequences to format the text.
+
+I<input> is the file to read for POD source (the POD can be embedded in
+code).  If I<input> isn't given, it defaults to STDIN.  I<output>, if given,
+is the file to which to write the formatted output.  If I<output> isn't
+given, the formatted output is written to STDOUT.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-a>, B<--alt>
+
+Use an alternate output format that, among other things, uses a different
+heading style and marks C<=item> entries with a colon in the left margin.
+
+=item B<--code>
+
+Include any non-POD text from the input file in the output as well.  Useful
+for viewing code documented with POD blocks with the POD rendered and the
+code left intact.
+
+=item B<-c>, B<--color>
+
+Format the output with ANSI color escape sequences.  Using this option
+requires that Term::ANSIColor be installed on your system.
+
+=item B<-i> I<indent>, B<--indent=>I<indent>
+
+Set the number of spaces to indent regular text, and the default indentation
+for C<=over> blocks.  Defaults to 4 spaces if this option isn't given.
+
+=item B<-h>, B<--help>
+
+Print out usage information and exit.
+
+=item B<-l>, B<--loose>
+
+Print a blank line after a C<=head1> heading.  Normally, no blank line is
+printed after C<=head1>, although one is still printed after C<=head2>,
+because this is the expected formatting for manual pages; if you're
+formatting arbitrary text documents, using this option is recommended.
+
+=item B<-m> I<width>, B<--left-margin>=I<width>, B<--margin>=I<width>
+
+The width of the left margin in spaces.  Defaults to 0.  This is the margin
+for all text, including headings, not the amount by which regular text is
+indented; for the latter, see B<-i> option.
+
+=item B<-o>, B<--overstrike>
+
+Format the output with overstruck printing.  Bold text is rendered as
+character, backspace, character.  Italics and file names are rendered as
+underscore, backspace, character.  Many pagers, such as B<less>, know how
+to convert this to bold or underlined text.
+
+=item B<-q> I<quotes>, B<--quotes>=I<quotes>
+
+Sets the quote marks used to surround CE<lt>> text to I<quotes>.  If
+I<quotes> is a single character, it is used as both the left and right
+quote; if I<quotes> is two characters, the first character is used as the
+left quote and the second as the right quoted; and if I<quotes> is four
+characters, the first two are used as the left quote and the second two as
+the right quote.
+
+I<quotes> may also be set to the special value C<none>, in which case no
+quote marks are added around CE<lt>> text.
+
+=item B<-s>, B<--sentence>
+
+Assume each sentence ends with two spaces and try to preserve that spacing.
+Without this option, all consecutive whitespace in non-verbatim paragraphs
+is compressed into a single space.
+
+=item B<-t>, B<--termcap>
+
+Try to determine the width of the screen and the bold and underline
+sequences for the terminal from termcap, and use that information in
+formatting the output.  Output will be wrapped at two columns less than the
+width of your terminal device.  Using this option requires that your system
+have a termcap file somewhere where Term::Cap can find it and requires that
+your system support termios.  With this option, the output of B<pod2text>
+will contain terminal control sequences for your current terminal type.
+
+=item B<-w>, B<--width=>I<width>, B<->I<width>
+
+The column at which to wrap text on the right-hand side.  Defaults to 76,
+unless B<-t> is given, in which case it's two columns less than the width of
+your terminal device.
+
+=back
+
+=head1 DIAGNOSTICS
+
+If B<pod2text> fails with errors, see L<Pod::Text> and L<Pod::Parser> for
+information about what those errors might mean.  Internally, it can also
+produce the following diagnostics:
+
+=over 4
+
+=item -c (--color) requires Term::ANSIColor be installed
+
+(F) B<-c> or B<--color> were given, but Term::ANSIColor could not be
+loaded.
+
+=item Unknown option: %s
+
+(F) An unknown command line option was given.
+
+=back
+
+In addition, other L<Getopt::Long|Getopt::Long> error messages may result
+from invalid command-line options.
+
+=head1 ENVIRONMENT
+
+=over 4
+
+=item COLUMNS
+
+If B<-t> is given, B<pod2text> will take the current width of your screen
+from this environment variable, if available.  It overrides terminal width
+information in TERMCAP.
+
+=item TERMCAP
+
+If B<-t> is given, B<pod2text> will use the contents of this environment
+variable if available to determine the correct formatting sequences for your
+current terminal device.
+
+=back
+
+=head1 SEE ALSO
+
+L<Pod::Text>, L<Pod::Text::Color>, L<Pod::Text::Overstrike>,
+L<Pod::Text::Termcap>, L<Pod::Parser>
+
+The current version of this script is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1999, 2000, 2001 by Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/pod2usage.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/pod2usage.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/pod2usage.bat	(revision 14489)
@@ -0,0 +1,157 @@
+@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
+    eval 'exec perl -S $0 "$@"'
+        if 0;
+
+#############################################################################
+# pod2usage -- command to print usage messages from embedded pod docs
+#
+# Copyright (c) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+use strict;
+use diagnostics;
+
+=head1 NAME
+
+pod2usage - print usage messages from embedded pod docs in files
+
+=head1 SYNOPSIS
+
+=over 12
+
+=item B<pod2usage>
+
+[B<-help>]
+[B<-man>]
+[B<-exit>S< >I<exitval>]
+[B<-output>S< >I<outfile>]
+[B<-verbose> I<level>]
+[B<-pathlist> I<dirlist>]
+I<file>
+
+=back
+
+=head1 OPTIONS AND ARGUMENTS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exit.
+
+=item B<-man>
+
+Print this command's manual page and exit.
+
+=item B<-exit> I<exitval>
+
+The exit status value to return.
+
+=item B<-output> I<outfile>
+
+The output file to print to. If the special names "-" or ">&1" or ">&STDOUT"
+are used then standard output is used. If ">&2" or ">&STDERR" is used then
+standard error is used.
+
+=item B<-verbose> I<level>
+
+The desired level of verbosity to use:
+
+    1 : print SYNOPSIS only
+    2 : print SYNOPSIS sections and any OPTIONS/ARGUMENTS sections
+    3 : print the entire manpage (similar to running pod2text)
+
+=item B<-pathlist> I<dirlist>
+
+Specifies one or more directories to search for the input file if it
+was not supplied with an absolute path. Each directory path in the given
+list should be separated by a ':' on Unix (';' on MSWin32 and DOS).
+
+=item I<file>
+
+The pathname of a file containing pod documentation to be output in
+usage mesage format (defaults to standard input).
+
+=back
+
+=head1 DESCRIPTION
+
+B<pod2usage> will read the given input file looking for pod
+documentation and will print the corresponding usage message.
+If no input file is specifed than standard input is read.
+
+B<pod2usage> invokes the B<pod2usage()> function in the B<Pod::Usage>
+module. Please see L<Pod::Usage/pod2usage()>.
+
+=head1 SEE ALSO
+
+L<Pod::Usage>, L<pod2text(1)>
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<pod2text(1)> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+use Pod::Usage;
+use Getopt::Long;
+
+## Define options
+my %options = ();
+my @opt_specs = (
+    "help",
+    "man",
+    "exit=i",
+    "output=s",
+    "pathlist=s",
+    "verbose=i",
+);
+
+## Parse options
+GetOptions(\%options, @opt_specs)  ||  pod2usage(2);
+pod2usage(1)  if ($options{help});
+pod2usage(VERBOSE => 2)  if ($options{man});
+
+## Dont default to STDIN if connected to a terminal
+pod2usage(2) if ((@ARGV == 0) && (-t STDIN));
+
+@ARGV = ("-")  unless (@ARGV > 0);
+if (@ARGV > 1) {
+    print STDERR "pod2usage: Too many filenames given\n\n";
+    pod2usage(2);
+}
+
+my %usage = ();
+$usage{-input}    = shift(@ARGV);
+$usage{-exitval}  = $options{"exit"}      if (defined $options{"exit"});
+$usage{-output}   = $options{"output"}    if (defined $options{"output"});
+$usage{-verbose}  = $options{"verbose"}   if (defined $options{"verbose"});
+$usage{-pathlist} = $options{"pathlist"}  if (defined $options{"pathlist"});
+
+pod2usage(\%usage);
+
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/podchecker.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/podchecker.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/podchecker.bat	(revision 14489)
@@ -0,0 +1,161 @@
+@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
+    eval 'exec perl -S $0 "$@"'
+        if 0;
+#############################################################################
+# podchecker -- command to invoke the podchecker function in Pod::Checker
+#
+# Copyright (c) 1998-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+use strict;
+#use diagnostics;
+
+=head1 NAME
+
+podchecker - check the syntax of POD format documentation files
+
+=head1 SYNOPSIS
+
+B<podchecker> [B<-help>] [B<-man>] [B<-(no)warnings>] [I<file>S< >...]
+
+=head1 OPTIONS AND ARGUMENTS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exit.
+
+=item B<-man>
+
+Print the manual page and exit.
+
+=item B<-warnings> B<-nowarnings>
+
+Turn on/off printing of warnings. Repeating B<-warnings> increases the
+warning level, i.e. more warnings are printed. Currently increasing to
+level two causes flagging of unescaped "E<lt>,E<gt>" characters.
+
+=item I<file>
+
+The pathname of a POD file to syntax-check (defaults to standard input).
+
+=back
+
+=head1 DESCRIPTION
+
+B<podchecker> will read the given input files looking for POD
+syntax errors in the POD documentation and will print any errors
+it find to STDERR. At the end, it will print a status message
+indicating the number of errors found.
+
+Directories are ignored, an appropriate warning message is printed.
+
+B<podchecker> invokes the B<podchecker()> function exported by B<Pod::Checker>
+Please see L<Pod::Checker/podchecker()> for more details.
+
+=head1 RETURN VALUE
+
+B<podchecker> returns a 0 (zero) exit status if all specified
+POD files are ok.
+
+=head1 ERRORS
+
+B<podchecker> returns the exit status 1 if at least one of
+the given POD files has syntax errors.
+
+The status 2 indicates that at least one of the specified 
+files does not contain I<any> POD commands.
+
+Status 1 overrides status 2. If you want unambigouus
+results, call B<podchecker> with one single argument only.
+
+=head1 SEE ALSO
+
+L<Pod::Parser> and L<Pod::Checker>
+
+=head1 AUTHORS
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>,
+Marek Rouchal E<lt>marekr@cpan.orgE<gt>
+
+Based on code for B<Pod::Text::pod2text(1)> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+
+use Pod::Checker;
+use Pod::Usage;
+use Getopt::Long;
+
+## Define options
+my %options;
+
+## Parse options
+GetOptions(\%options, qw(help man warnings+ nowarnings))  ||  pod2usage(2);
+pod2usage(1)  if ($options{help});
+pod2usage(-verbose => 2)  if ($options{man});
+
+if($options{nowarnings}) {
+  $options{warnings} = 0;
+}
+elsif(!defined $options{warnings}) {
+  $options{warnings} = 1; # default is warnings on
+}
+
+## Dont default to STDIN if connected to a terminal
+pod2usage(2) if ((@ARGV == 0) && (-t STDIN));
+
+## Invoke podchecker()
+my $status = 0;
+@ARGV = qw(-) unless(@ARGV);
+for my $podfile (@ARGV) {
+    if($podfile eq '-') {
+      $podfile = "<&STDIN";
+    }
+    elsif(-d $podfile) {
+      warn "podchecker: Warning: Ignoring directory '$podfile'\n";
+      next;
+    }
+    my $errors = 
+      podchecker($podfile, undef, '-warnings' => $options{warnings});
+    if($errors > 0) {
+        # errors occurred
+        $status = 1;
+        printf STDERR ("%s has %d pod syntax %s.\n",
+                       $podfile, $errors,
+                       ($errors == 1) ? "error" : "errors");
+    }
+    elsif($errors < 0) {
+        # no pod found
+        $status = 2 unless($status);
+        print STDERR "$podfile does not contain any pod commands.\n";
+    }
+    else {
+        print STDERR "$podfile pod syntax OK.\n";
+    }
+}
+exit $status;
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/podselect.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/podselect.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/podselect.bat	(revision 14489)
@@ -0,0 +1,120 @@
+@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
+    eval 'exec perl -S $0 "$@"'
+        if 0;
+
+#############################################################################
+# podselect -- command to invoke the podselect function in Pod::Select
+#
+# Copyright (c) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+use strict;
+use diagnostics;
+
+=head1 NAME
+
+podselect - print selected sections of pod documentation on standard output
+
+=head1 SYNOPSIS
+
+B<podselect> [B<-help>] [B<-man>] [B<-section>S< >I<section-spec>]
+[I<file>S< >...]
+
+=head1 OPTIONS AND ARGUMENTS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exit.
+
+=item B<-man>
+
+Print the manual page and exit.
+
+=item B<-section>S< >I<section-spec>
+
+Specify a section to include in the output.
+See L<Pod::Parser/"SECTION SPECIFICATIONS">
+for the format to use for I<section-spec>.
+This option may be given multiple times on the command line.
+
+=item I<file>
+
+The pathname of a file from which to select sections of pod
+documentation (defaults to standard input).
+
+=back
+
+=head1 DESCRIPTION
+
+B<podselect> will read the given input files looking for pod
+documentation and will print out (in raw pod format) all sections that
+match one ore more of the given section specifications. If no section
+specifications are given than all pod sections encountered are output.
+
+B<podselect> invokes the B<podselect()> function exported by B<Pod::Select>
+Please see L<Pod::Select/podselect()> for more details.
+
+=head1 SEE ALSO
+
+L<Pod::Parser> and L<Pod::Select>
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<Pod::Text::pod2text(1)> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+use Pod::Select;
+use Pod::Usage;
+use Getopt::Long;
+
+## Define options
+my %options = (
+        "help"     => 0,
+        "man"      => 0,
+        "sections" => [],
+);
+
+## Parse options
+GetOptions(\%options, "help", "man", "sections|select=s@")  ||  pod2usage(2);
+pod2usage(1)  if ($options{help});
+pod2usage(-verbose => 2)  if ($options{man});
+
+## Dont default to STDIN if connected to a terminal
+pod2usage(2) if ((@ARGV == 0) && (-t STDIN));
+
+## Invoke podselect().
+if (@{ $options{"sections"} } > 0) {
+    podselect({ -sections => $options{"sections"} }, @ARGV);
+}
+else {
+    podselect(@ARGV);
+}
+
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/prove.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/prove.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/prove.bat	(revision 14489)
@@ -0,0 +1,360 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+#!/usr/bin/perl -w
+
+use strict;
+
+use Test::Harness;
+use Getopt::Long;
+use Pod::Usage 1.12;
+use File::Spec;
+
+use vars qw( $VERSION );
+$VERSION = "1.04";
+
+my @ext = ();
+my $shuffle = 0;
+my $dry = 0;
+my $blib = 0;
+my $lib = 0;
+my $recurse = 0;
+my @includes = ();
+my @switches = ();
+
+# Allow cuddling the paths with the -I
+@ARGV = map { /^(-I)(.+)/ ? ($1,$2) : $_ } @ARGV;
+
+# Stick any default switches at the beginning, so they can be overridden
+# by the command line switches.
+unshift @ARGV, split( " ", $ENV{PROVE_SWITCHES} ) if defined $ENV{PROVE_SWITCHES};
+
+Getopt::Long::Configure( "no_ignore_case" );
+Getopt::Long::Configure( "bundling" );
+GetOptions(
+    'b|blib'        => \$blib,
+    'd|debug'       => \$Test::Harness::debug,
+    'D|dry'         => \$dry,
+    'h|help|?'      => sub {pod2usage({-verbose => 1}); exit},
+    'H|man'         => sub {pod2usage({-verbose => 2}); exit},
+    'I=s@'          => \@includes,
+    'l|lib'         => \$lib,
+    'r|recurse'     => \$recurse,
+    's|shuffle'     => \$shuffle,
+    't'             => sub { unshift @switches, "-t" }, # Always want -t up front
+    'T'             => sub { unshift @switches, "-T" }, # Always want -T up front
+    'timer'         => \$Test::Harness::Timer,
+    'v|verbose'     => \$Test::Harness::verbose,
+    'V|version'     => sub { print_version(); exit; },
+    'ext=s@'        => \@ext,
+) or exit 1;
+
+$ENV{TEST_VERBOSE} = 1 if $Test::Harness::verbose;
+
+# Build up extensions regex
+@ext = map { split /,/ } @ext;
+s/^\.// foreach @ext;
+@ext = ("t") unless @ext;
+my $ext_regex = join( "|", map { quotemeta } @ext );
+$ext_regex = qr/\.($ext_regex)$/;
+
+# Handle blib includes
+if ( $blib ) {
+    my @blibdirs = blibdirs();
+    if ( @blibdirs ) {
+        unshift @includes, @blibdirs;
+    } else {
+        warn "No blib directories found.\n";
+    }
+}
+
+# Handle lib includes
+if ( $lib ) {
+    unshift @includes, "lib";
+}
+
+# Build up TH switches
+push( @switches, map { /\s/ && !/^".*"$/ ? qq["-I$_"] : "-I$_" } @includes );
+$Test::Harness::Switches = join( " ", @switches );
+print "# \$Test::Harness::Switches: $Test::Harness::Switches\n" if $Test::Harness::debug;
+
+my @tests;
+@ARGV = File::Spec->curdir unless @ARGV;
+push( @tests, -d $_ ? all_in( $_ ) : $_ ) for map { glob } @ARGV;
+
+if ( @tests ) {
+    shuffle(@tests) if $shuffle;
+    if ( $dry ) {
+        print join( "\n", @tests, "" );
+    } else {
+        print "# ", scalar @tests, " tests to run\n" if $Test::Harness::debug;
+        runtests(@tests);
+    }
+}
+
+sub all_in {
+    my $start = shift;
+
+    my @hits = ();
+
+    local *DH;
+    if ( opendir( DH, $start ) ) {
+        my @files = sort readdir DH;
+        closedir DH;
+        for my $file ( @files ) {
+            next if $file eq File::Spec->updir || $file eq File::Spec->curdir;
+            next if $file eq ".svn";
+            next if $file eq "CVS";
+
+            my $currfile = File::Spec->catfile( $start, $file );
+            if ( -d $currfile ) {
+                push( @hits, all_in( $currfile ) ) if $recurse;
+            } else {
+                push( @hits, $currfile ) if $currfile =~ $ext_regex;
+            }
+        }
+    } else {
+        warn "$start: $!\n";
+    }
+
+    return @hits;
+}
+
+sub shuffle {
+    # Fisher-Yates shuffle
+    my $i = @_;
+    while ($i) {
+        my $j = rand $i--;
+        @_[$i, $j] = @_[$j, $i];
+    }
+}
+
+sub print_version {
+    printf( "prove v%s, using Test::Harness v%s and Perl v%vd\n",
+        $VERSION, $Test::Harness::VERSION, $^V );
+}
+
+# Stolen directly from blib.pm
+sub blibdirs {
+    my $dir = File::Spec->curdir;
+    if ($^O eq 'VMS') {
+        ($dir = VMS::Filespec::unixify($dir)) =~ s-/\z--;
+    }
+    my $archdir = "arch";
+    if ( $^O eq "MacOS" ) {
+        # Double up the MP::A so that it's not used only once.
+        $archdir = $MacPerl::Architecture = $MacPerl::Architecture;
+    }
+
+    my $i = 5;
+    while ($i--) {
+        my $blib      = File::Spec->catdir( $dir, "blib" );
+        my $blib_lib  = File::Spec->catdir( $blib, "lib" );
+        my $blib_arch = File::Spec->catdir( $blib, $archdir );
+
+        if ( -d $blib && -d $blib_arch && -d $blib_lib ) {
+            return ($blib_arch,$blib_lib);
+        }
+        $dir = File::Spec->catdir($dir, File::Spec->updir);
+    }
+    warn "$0: Cannot find blib\n";
+    return;
+}
+
+__END__
+
+=head1 NAME
+
+prove -- A command-line tool for running tests against Test::Harness
+
+=head1 SYNOPSIS
+
+prove [options] [files/directories]
+
+Options:
+
+    -b, --blib      Adds blib/lib to the path for your tests, a la "use blib".
+    -d, --debug     Includes extra debugging information.
+    -D, --dry       Dry run: Show the tests to run, but don't run them.
+        --ext=x     Extensions (defaults to .t)
+    -h, --help      Display this help
+    -H, --man       Longer manpage for prove
+    -I              Add libraries to @INC, as Perl's -I
+    -l, --lib       Add lib to the path for your tests.
+    -r, --recurse   Recursively descend into directories.
+    -s, --shuffle   Run the tests in a random order.
+    -T              Enable tainting checks
+    -t              Enable tainting warnings
+        --timer     Print elapsed time after each test file
+    -v, --verbose   Display standard output of test scripts while running them.
+    -V, --version   Display version info
+
+Single-character options may be stacked.  Default options may be set by
+specifying the PROVE_SWITCHES environment variable.
+
+=head1 OVERVIEW
+
+F<prove> is a command-line interface to the test-running functionality
+of C<Test::Harness>.  With no arguments, it will run all tests in the
+current directory.
+
+Shell metacharacters may be used with command lines options and will be exanded 
+via C<glob>.
+
+=head1 PROVE VS. "MAKE TEST"
+
+F<prove> has a number of advantages over C<make test> when doing development.
+
+=over 4
+
+=item * F<prove> is designed as a development tool
+
+Perl users typically run the test harness through a makefile via
+C<make test>.  That's fine for module distributions, but it's
+suboptimal for a test/code/debug development cycle.
+
+=item * F<prove> is granular 
+
+F<prove> lets your run against only the files you want to check.
+Running C<prove t/live/ t/master.t> checks every F<*.t> in F<t/live>,
+plus F<t/master.t>.
+
+=item * F<prove> has an easy verbose mode
+
+F<prove> has a C<-v> option to see the raw output from the tests.
+To do this with C<make test>, you must set C<HARNESS_VERBOSE=1> in
+the environment.
+
+=item * F<prove> can run under taint mode
+
+F<prove>'s C<-T> runs your tests under C<perl -T>, and C<-t> runs them
+under C<perl -t>.
+
+=item * F<prove> can shuffle tests
+
+You can use F<prove>'s C<--shuffle> option to try to excite problems
+that don't show up when tests are run in the same order every time.
+
+=item * F<prove> doesn't rely on a make tool
+
+Not everyone wants to write a makefile, or use L<ExtUtils::MakeMaker>
+to do so.  F<prove> has no external dependencies.
+
+=item * Not everything is a module
+
+More and more users are using Perl's testing tools outside the
+context of a module distribution, and may not even use a makefile
+at all.
+
+=back
+
+=head1 COMMAND LINE OPTIONS
+
+=head2 -b, --blib
+
+Adds blib/lib to the path for your tests, a la "use blib".
+
+=head2 -d, --debug
+
+Include debug information about how F<prove> is being run.  This
+option doesn't show the output from the test scripts.  That's handled
+by -v,--verbose.
+
+=head2 -D, --dry
+
+Dry run: Show the tests to run, but don't run them.
+
+=head2 --ext=extension
+
+Specify extensions of the test files to run.  By default, these are .t,
+but you may have other non-.t test files, most likely .sh shell scripts.
+The --ext is repeatable.
+
+=head2 -I
+
+Add libraries to @INC, as Perl's -I.
+
+=head2 -l, --lib
+
+Add C<lib> to @INC.  Equivalent to C<-Ilib>.
+
+=head2 -r, --recurse
+
+Descends into subdirectories of any directories specified, looking for tests.
+
+=head2 -s, --shuffle
+
+Sometimes tests are accidentally dependent on tests that have been
+run before.  This switch will shuffle the tests to be run prior to
+running them, thus ensuring that hidden dependencies in the test
+order are likely to be revealed.  The author hopes the run the
+algorithm on the preceding sentence to see if he can produce something
+slightly less awkward.
+
+=head2 -t
+
+Runs test programs under perl's -t taint warning mode.
+
+=head2 -T
+
+Runs test programs under perl's -T taint mode.
+
+=head2 --timer
+
+Print elapsed time after each test file
+
+=head2 -v, --verbose
+
+Display standard output of test scripts while running them.  Also sets
+TEST_VERBOSE in case your tests rely on them.
+
+=head2 -V, --version
+
+Display version info.
+
+=head1 BUGS
+
+Please use the CPAN bug ticketing system at L<http://rt.cpan.org/>.
+You can also mail bugs, fixes and enhancements to 
+C<< <bug-test-harness@rt.cpan.org> >>.
+
+=head1 TODO
+
+=over 4
+
+=item *
+
+Shuffled tests must be recreatable
+
+=back
+
+=head1 AUTHORS
+
+Andy Lester C<< <andy@petdance.com> >>
+
+=head1 COPYRIGHT
+
+Copyright 2005 by Andy Lester C<< <andy@petdance.com> >>.
+
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>.
+
+=cut
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/psed.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/psed.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/psed.bat	(revision 14489)
@@ -0,0 +1,2011 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+my $startperl;
+my $perlpath;
+($startperl = <<'/../') =~ s/\s*\z//;
+#!perl
+/../
+($perlpath = <<'/../') =~ s/\s*\z//;
+c:\shaoqunWu\perl\bin\perl.exe
+/../
+
+$0 =~ s/^.*?(\w+)[\.\w]*$/$1/;
+
+# (p)sed - a stream editor
+# History:  Aug 12 2000: Original version.
+#           Mar 25 2002: Rearrange generated Perl program.
+
+use strict;
+use integer;
+use Symbol;
+
+=head1 NAME
+
+psed - a stream editor
+
+=head1 SYNOPSIS
+
+   psed [-an] script [file ...]
+   psed [-an] [-e script] [-f script-file] [file ...]
+
+   s2p  [-an] [-e script] [-f script-file]
+
+=head1 DESCRIPTION
+
+A stream editor reads the input stream consisting of the specified files
+(or standard input, if none are given), processes is line by line by
+applying a script consisting of edit commands, and writes resulting lines
+to standard output. The filename `C<->' may be used to read standard input.
+
+The edit script is composed from arguments of B<-e> options and
+script-files, in the given order. A single script argument may be specified
+as the first parameter.
+
+If this program is invoked with the name F<s2p>, it will act as a
+sed-to-Perl translator. See L<"sed Script Translation">.
+
+B<sed> returns an exit code of 0 on success or >0 if an error occurred.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-a>
+
+A file specified as argument to the B<w> edit command is by default
+opened before input processing starts. Using B<-a>, opening of such
+files is delayed until the first line is actually written to the file.
+
+=item B<-e> I<script>
+
+The editing commands defined by I<script> are appended to the script.
+Multiple commands must be separated by newlines.
+
+=item B<-f> I<script-file>
+
+Editing commands from the specified I<script-file> are read and appended
+to the script.
+
+=item B<-n>
+
+By default, a line is written to standard output after the editing script
+has been applied to it. The B<-n> option suppresses automatic printing.
+
+=back
+
+=head1 COMMANDS
+
+B<sed> command syntax is defined as
+
+Z<> Z<> Z<> Z<>[I<address>[B<,>I<address>]][B<!>]I<function>[I<argument>]
+
+with whitespace being permitted before or after addresses, and between
+the function character and the argument. The I<address>es and the
+address inverter (C<!>) are used to restrict the application of a
+command to the selected line(s) of input.
+
+Each command must be on a line of its own, except where noted in
+the synopses below.
+
+The edit cycle performed on each input line consist of reading the line
+(without its trailing newline character) into the I<pattern space>,
+applying the applicable commands of the edit script, writing the final
+contents of the pattern space and a newline to the standard output.
+A I<hold space> is provided for saving the contents of the
+pattern space for later use.
+
+=head2 Addresses
+
+A sed address is either a line number or a pattern, which may be combined
+arbitrarily to construct ranges. Lines are numbered across all input files.
+
+Any address may be followed by an exclamation mark (`C<!>'), selecting
+all lines not matching that address.
+
+=over 4
+
+=item I<number>
+
+The line with the given number is selected.
+
+=item B<$>
+
+A dollar sign (C<$>) is the line number of the last line of the input stream.
+
+=item B</>I<regular expression>B</>
+
+A pattern address is a basic regular expression (see 
+L<"Basic Regular Expressions">), between the delimiting character C</>.
+Any other character except C<\> or newline may be used to delimit a
+pattern address when the initial delimiter is prefixed with a
+backslash (`C<\>').
+
+=back
+
+If no address is given, the command selects every line.
+
+If one address is given, it selects the line (or lines) matching the
+address.
+
+Two addresses select a range that begins whenever the first address
+matches, and ends (including that line) when the second address matches.
+If the first (second) address is a matching pattern, the second 
+address is not applied to the very same line to determine the end of
+the range. Likewise, if the second address is a matching pattern, the
+first address is not applied to the very same line to determine the
+begin of another range. If both addresses are line numbers,
+and the second line number is less than the first line number, then
+only the first line is selected.
+
+
+=head2 Functions
+
+The maximum permitted number of addresses is indicated with each
+function synopsis below.
+
+The argument I<text> consists of one or more lines following the command.
+Embedded newlines in I<text> must be preceded with a backslash.  Other
+backslashes in I<text> are deleted and the following character is taken
+literally.
+
+=over 4
+
+=cut
+
+my %ComTab;
+my %GenKey;
+#--------------------------------------------------------------------------
+$ComTab{'a'}=[ 1, 'txt', \&Emit,       '{ push( @Q, <<'."'TheEnd' ) }\n" ]; #ok
+
+=item [1addr]B<a\> I<text>
+
+Write I<text> (which must start on the line following the command)
+to standard output immediately before reading the next line
+of input, either by executing the B<N> function or by beginning a new cycle.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'b'}=[ 2, 'str', \&Branch,     '{ goto XXX; }'                   ]; #ok
+
+=item [2addr]B<b> [I<label>]
+
+Branch to the B<:> function with the specified I<label>. If no label
+is given, branch to the end of the script.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'c'}=[ 2, 'txt', \&Change,     <<'-X-'                           ]; #ok
+{ print <<'TheEnd'; } $doPrint = 0; goto EOS;
+-X-
+### continue OK => next CYCLE;
+
+=item [2addr]B<c\> I<text>
+
+The line, or range of lines, selected by the address is deleted. 
+The I<text> (which must start on the line following the command)
+is written to standard output. With an address range, this occurs at
+the end of the range.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'d'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ $doPrint = 0;
+  goto EOS;
+}
+-X-
+### continue OK => next CYCLE;
+
+=item [2addr]B<d>
+
+Deletes the pattern space and starts the next cycle.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'D'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ s/^.*\n?//;
+  if(length($_)){ goto BOS } else { goto EOS }
+}
+-X-
+### continue OK => next CYCLE;
+
+=item [2addr]B<D>
+
+Deletes the pattern space through the first embedded newline or to the end.
+If the pattern space becomes empty, a new cycle is started, otherwise
+execution of the script is restarted.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'g'}=[ 2, '',    \&Emit,       '{ $_ = $Hold };'                 ]; #ok
+
+=item [2addr]B<g>
+
+Replace the contents of the pattern space with the hold space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'G'}=[ 2, '',    \&Emit,       '{ $_ .= "\n"; $_ .= $Hold };'    ]; #ok
+
+=item [2addr]B<G>
+
+Append a newline and the contents of the hold space to the pattern space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'h'}=[ 2, '',    \&Emit,       '{ $Hold = $_ }'                  ]; #ok
+
+=item [2addr]B<h>
+
+Replace the contents of the hold space with the pattern space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'H'}=[ 2, '',    \&Emit,       '{ $Hold .= "\n"; $Hold .= $_; }' ]; #ok
+
+=item [2addr]B<H>
+
+Append a newline and the contents of the pattern space to the hold space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'i'}=[ 1, 'txt', \&Emit,       '{ print <<'."'TheEnd' }\n"       ]; #ok
+
+=item [1addr]B<i\> I<text>
+
+Write the I<text> (which must start on the line following the command)
+to standard output.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'l'}=[ 2, '',    \&Emit,       '{ _l() }'                        ]; #okUTF8
+
+=item [2addr]B<l>
+
+Print the contents of the pattern space: non-printable characters are
+shown in C-style escaped form; long lines are split and have a trailing
+`C<\>' at the point of the split; the true end of a line is marked with
+a `C<$>'. Escapes are: `\a', `\t', `\n', `\f', `\r', `\e' for
+BEL, HT, LF, FF, CR, ESC, respectively, and `\' followed by a three-digit
+octal number for all other non-printable characters.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'n'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ print $_, "\n" if $doPrint;
+  printQ() if @Q;
+  $CondReg = 0;
+  last CYCLE unless getsARGV();
+  chomp();
+}
+-X-
+
+=item [2addr]B<n>
+
+If automatic printing is enabled, write the pattern space to the standard
+output. Replace the pattern space with the next line of input. If
+there is no more input, processing is terminated.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'N'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ printQ() if @Q;
+  $CondReg = 0;
+  last CYCLE unless getsARGV( $h );
+  chomp( $h );
+  $_ .= "\n$h";
+}
+-X-
+
+=item [2addr]B<N>
+
+Append a newline and the next line of input to the pattern space. If
+there is no more input, processing is terminated.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'p'}=[ 2, '',    \&Emit,       '{ print $_, "\n"; }'             ]; #ok
+
+=item [2addr]B<p>
+
+Print the pattern space to the standard output. (Use the B<-n> option
+to suppress automatic printing at the end of a cycle if you want to
+avoid double printing of lines.)
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'P'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ if( /^(.*)/ ){ print $1, "\n"; } }
+-X-
+
+=item [2addr]B<P>
+
+Prints the pattern space through the first embedded newline or to the end.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'q'}=[ 1, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ print $_, "\n" if $doPrint;
+  last CYCLE;
+}
+-X-
+
+=item [1addr]B<q>
+
+Branch to the end of the script and quit without starting a new cycle.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'r'}=[ 1, 'str', \&Emit,       "{ _r( '-X-' ) }"                 ]; #ok
+
+=item [1addr]B<r> I<file>
+
+Copy the contents of the I<file> to standard output immediately before
+the next attempt to read a line of input. Any error encountered while
+reading I<file> is silently ignored.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'s'}=[ 2, 'sub', \&Emit,       ''                                ]; #ok
+
+=item [2addr]B<s/>I<regular expression>B</>I<replacement>B</>I<flags>
+
+Substitute the I<replacement> string for the first substring in
+the pattern space that matches the I<regular expression>.
+Any character other than backslash or newline can be used instead of a 
+slash to delimit the regular expression and the replacement.
+To use the delimiter as a literal character within the regular expression
+and the replacement, precede the character by a backslash (`C<\>').
+
+Literal newlines may be embedded in the replacement string by
+preceding a newline with a backslash.
+
+Within the replacement, an ampersand (`C<&>') is replaced by the string
+matching the regular expression. The strings `C<\1>' through `C<\9>' are
+replaced by the corresponding subpattern (see L<"Basic Regular Expressions">).
+To get a literal `C<&>' or `C<\>' in the replacement text, precede it
+by a backslash.
+
+The following I<flags> modify the behaviour of the B<s> command:
+
+=over 8
+
+=item B<g>
+
+The replacement is performed for all matching, non-overlapping substrings
+of the pattern space.
+
+=item B<1>..B<9>
+
+Replace only the n-th matching substring of the pattern space.
+
+=item B<p>
+
+If the substitution was made, print the new value of the pattern space.
+
+=item B<w> I<file>
+
+If the substitution was made, write the new value of the pattern space
+to the specified file.
+
+=back
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'t'}=[ 2, 'str', \&Branch,     '{ goto XXX if _t() }'            ]; #ok
+
+=item [2addr]B<t> [I<label>]
+
+Branch to the B<:> function with the specified I<label> if any B<s>
+substitutions have been made since the most recent reading of an input line
+or execution of a B<t> function. If no label is given, branch to the end of
+the script. 
+
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'w'}=[ 2, 'str', \&Write,      "{ _w( '-X-' ) }"                 ]; #ok
+
+=item [2addr]B<w> I<file>
+
+The contents of the pattern space are written to the I<file>.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'x'}=[ 2, '',    \&Emit,       '{ ($Hold, $_) = ($_, $Hold) }'   ]; #ok
+
+=item [2addr]B<x>
+
+Swap the contents of the pattern space and the hold space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'y'}=[ 2, 'tra', \&Emit,       ''                                ]; #ok
+=item [2addr]B<y>B</>I<string1>B</>I<string2>B</>
+
+In the pattern space, replace all characters occuring in I<string1> by the
+character at the corresponding position in I<string2>. It is possible
+to use any character (other than a backslash or newline) instead of a
+slash to delimit the strings.  Within I<string1> and I<string2>, a
+backslash followed by any character other than a newline is that literal
+character, and a backslash followed by an `n' is replaced by a newline
+character.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'='}=[ 1, '',    \&Emit,       '{ print "$.\n" }'                ]; #ok
+
+=item [1addr]B<=>
+
+Prints the current line number on the standard output.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{':'}=[ 0, 'str', \&Label,      ''                                ]; #ok
+ 
+=item [0addr]B<:> [I<label>]
+
+The command specifies the position of the I<label>. It has no other effect.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'{'}=[ 2, '',    \&BeginBlock, '{'                               ]; #ok
+$ComTab{'}'}=[ 0, '',    \&EndBlock,   ';}'                              ]; #ok
+# ';' to avoid warning on empty {}-block
+
+=item [2addr]B<{> [I<command>]
+
+=item [0addr]B<}>
+
+These two commands begin and end a command list. The first command may
+be given on the same line as the opening B<{> command. The commands
+within the list are jointly selected by the address(es) given on the
+B<{> command (but may still have individual addresses).
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'#'}=[ 0, 'str', \&Comment,    ''                                ]; #ok
+
+=item [0addr]B<#> [I<comment>]
+
+The entire line is ignored (treated as a comment). If, however, the first
+two characters in the script are `C<#n>', automatic printing of output is
+suppressed, as if the B<-n> option were given on the command line.
+
+=back
+
+=cut
+
+use vars qw{ $isEOF $Hold %wFiles @Q $CondReg $doPrint };
+
+my $useDEBUG    = exists( $ENV{PSEDDEBUG} );
+my $useEXTBRE   = $ENV{PSEDEXTBRE} || '';
+$useEXTBRE =~ s/[^<>wWyB]//g; # gawk RE's handle these
+
+my $doAutoPrint = 1;          # automatic printing of pattern space (-n => 0)
+my $doOpenWrite = 1;          # open w command output files at start (-a => 0)
+my $svOpenWrite = 0;          # save $doOpenWrite
+
+# lower case $0 below as a VMSism.  The VMS build procedure creates the
+# s2p file traditionally in upper case on the disk.  When VMS is in a
+# case preserved or case sensitive mode, $0 will be returned in the exact
+# case which will be on the disk, and that is not predictable at this time.
+
+my $doGenerate  = lc($0) eq 's2p';
+
+# Collected and compiled script
+#
+my( @Commands, %Defined, @BlockStack, %Label, $labNum, $Code, $Func );
+$Code = '';
+
+##################
+#  Compile Time
+#
+# Labels
+# 
+# Error handling
+#
+sub Warn($;$){
+    my( $msg, $loc ) = @_;
+    $loc ||= '';
+    $loc .= ': ' if length( $loc );
+    warn( "$0: $loc$msg\n" );
+}
+
+$labNum = 0;
+sub newLabel(){
+    return 'L_'.++$labNum;
+}
+
+# safeHere: create safe here delimiter and  modify opcode and argument
+#
+sub safeHere($$){
+    my( $codref, $argref ) = @_;
+    my $eod = 'EOD000';
+    while( $$argref =~ /^$eod$/m ){
+        $eod++;
+    }
+    $$codref =~ s/TheEnd/$eod/e;
+    $$argref .= "$eod\n"; 
+}
+
+# Emit: create address logic and emit command
+#
+sub Emit($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    my $cond = '';
+    if( defined( $addr1 ) ){
+        if( defined( $addr2 ) ){
+	    $addr1 .= $addr2 =~ /^\d+$/ ? "..$addr2" : "...$addr2";
+        } else {
+	    $addr1 .= ' == $.' if $addr1 =~ /^\d+$/;
+	}
+	$cond = $negated ? "unless( $addr1 )\n" : "if( $addr1 )\n";
+    }
+
+    if( $opcode eq '' ){
+	$Code .= "$cond$arg\n";
+
+    } elsif( $opcode =~ s/-X-/$arg/e ){
+	$Code .= "$cond$opcode\n";
+
+    } elsif( $opcode =~ /TheEnd/ ){
+	safeHere( \$opcode, \$arg );
+	$Code .= "$cond$opcode$arg";
+
+    } else {
+	$Code .= "$cond$opcode\n";
+    }
+    0;
+}
+
+# Write (w command, w flag): store pathname
+#
+sub Write($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $path, $fl ) = @_;
+    $wFiles{$path} = '';
+    Emit( $addr1, $addr2, $negated, $opcode, $path, $fl );
+}
+
+
+# Label (: command): label definition
+#
+sub Label($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $lab, $fl ) = @_;
+    my $rc = 0;
+    $lab =~ s/\s+//;
+    if( length( $lab ) ){
+	my $h;
+	if( ! exists( $Label{$lab} ) ){
+	    $h = $Label{$lab}{name} = newLabel();
+        } else {
+	    $h = $Label{$lab}{name};
+	    if( exists( $Label{$lab}{defined} ) ){
+		my $dl = $Label{$lab}{defined};
+		Warn( "duplicate label $lab (first defined at $dl)", $fl );
+		$rc = 1;
+	    }
+	}
+        $Label{$lab}{defined} = $fl;
+	$Code .= "$h:;\n";
+    }
+    $rc;
+}
+
+# BeginBlock ({ command): push block start
+#
+sub BeginBlock($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    push( @BlockStack, [ $fl, $addr1, $addr2, $negated ] );
+    Emit( $addr1, $addr2, $negated, $opcode, $arg, $fl );
+}
+
+# EndBlock (} command): check proper nesting
+#
+sub EndBlock($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    my $rc;
+    my $jcom = pop( @BlockStack );
+    if( defined( $jcom ) ){
+	$rc = Emit( $addr1, $addr2, $negated, $opcode, $arg, $fl );
+    } else {
+	Warn( "unexpected `}'", $fl );
+	$rc = 1;
+    }
+    $rc;
+}
+
+# Branch (t, b commands): check or create label, substitute default
+#
+sub Branch($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $lab, $fl ) = @_;
+    $lab =~ s/\s+//; # no spaces at end
+    my $h;
+    if( length( $lab ) ){
+	if( ! exists( $Label{$lab} ) ){
+	    $h = $Label{$lab}{name} = newLabel();
+        } else {
+	    $h = $Label{$lab}{name};
+	}
+	push( @{$Label{$lab}{used}}, $fl );
+    } else {
+	$h = 'EOS';
+    }
+    $opcode =~ s/XXX/$h/e;
+    Emit( $addr1, $addr2, $negated, $opcode, '', $fl );
+}
+
+# Change (c command): is special due to range end watching
+#
+sub Change($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    my $kwd = $negated ? 'unless' : 'if';
+    if( defined( $addr2 ) ){
+        $addr1 .= $addr2 =~ /^\d+$/ ? "..$addr2" : "...$addr2";
+	if( ! $negated ){
+	    $addr1  = '$icnt = ('.$addr1.')';
+	    $opcode = 'if( $icnt =~ /E0$/ )' . $opcode;
+	}
+    } else {
+	$addr1 .= ' == $.' if $addr1 =~ /^\d+$/;
+    }
+    safeHere( \$opcode, \$arg );
+    $Code .= "$kwd( $addr1 ){\n  $opcode$arg}\n";
+    0;
+}
+
+
+# Comment (# command): A no-op. Who would've thought that!
+#
+sub Comment($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+### $Code .= "# $arg\n";
+    0;
+}
+
+
+sub stripRegex($$){
+    my( $del, $sref ) = @_;
+    my $regex = $del;
+    print "stripRegex:$del:$$sref:\n" if $useDEBUG;
+    while( $$sref =~ s{^(.*?)(\\*)\Q$del\E(\s*)}{}s ){
+        my $sl = $2;
+	$regex .= $1.$sl.$del;
+	if( length( $sl ) % 2 == 0 ){
+	    return $regex;
+	}
+	$regex .= $3;
+    }
+    undef();
+}
+
+# stripTrans: take a <del> terminated string from y command
+#   honoring and cleaning up of \-escaped <del>'s
+#
+sub stripTrans($$){
+    my( $del, $sref ) = @_;
+    my $t = '';
+    print "stripTrans:$del:$$sref:\n" if $useDEBUG;
+    while( $$sref =~ s{^(.*?)(\\*)\Q$del\E}{}s ){
+        my $sl = $2;
+	$t .= $1;
+	if( length( $sl ) % 2 == 0 ){
+	    $t .= $sl;
+	    $t =~ s/\\\\/\\/g;
+	    return $t;
+	}
+	chop( $sl );
+	$t .= $sl.$del.$3;
+    }
+    undef();
+}
+
+# makey - construct Perl y/// from sed y///
+#
+sub makey($$$){
+    my( $fr, $to, $fl ) = @_;
+    my $error = 0;
+
+    # Ensure that any '-' is up front.
+    # Diagnose duplicate contradicting mappings
+    my %tr;
+    for( my $i = 0; $i < length($fr); $i++ ){
+	my $fc = substr($fr,$i,1);
+	my $tc = substr($to,$i,1);
+	if( exists( $tr{$fc} ) && $tr{$fc} ne $tc ){
+	    Warn( "ambiguous translation for character `$fc' in `y' command",
+		  $fl );
+	    $error++;
+	}
+	$tr{$fc} = $tc;
+    }
+    $fr = $to = '';
+    if( exists( $tr{'-'} ) ){
+	( $fr, $to ) = ( '-', $tr{'-'} );
+	delete( $tr{'-'} );
+    } else {
+	$fr = $to = '';
+    }
+    # might just as well sort it...
+    for my $fc ( sort keys( %tr ) ){
+	$fr .= $fc;
+	$to .= $tr{$fc};
+    }
+    # make embedded delimiters and newlines safe
+    $fr =~ s/([{}])/\$1/g;
+    $to =~ s/([{}])/\$1/g;
+    $fr =~ s/\n/\\n/g;
+    $to =~ s/\n/\\n/g;
+    return $error ? undef() : "{ y{$fr}{$to}; }";
+}
+
+######
+# makes - construct Perl s/// from sed s///
+#
+sub makes($$$$$$$){
+    my( $regex, $subst, $path, $global, $print, $nmatch, $fl ) = @_;
+
+    # make embedded newlines safe
+    $regex =~ s/\n/\\n/g;
+    $subst =~ s/\n/\\n/g;
+ 
+    my $code;
+    # n-th occurrence
+    #
+    if( length( $nmatch ) ){
+	$code = <<TheEnd;
+{ \$n = $nmatch;
+  while( --\$n && ( \$s = m ${regex}g ) ){}
+  \$s = ( substr( \$_, pos() ) =~ s ${regex}${subst}s ) if \$s;
+  \$CondReg ||= \$s;
+TheEnd
+    } else {
+        $code = <<TheEnd;
+{ \$s = s ${regex}${subst}s${global};
+  \$CondReg ||= \$s;
+TheEnd
+    }
+    if( $print ){
+        $code .= '  print $_, "\n" if $s;'."\n";
+    }
+    if( defined( $path ) ){
+        $wFiles{$path} = '';
+	$code .= " _w( '$path' ) if \$s;\n";
+        $GenKey{'w'} = 1;
+    }
+    $code .= "}";
+}
+
+=head1 BASIC REGULAR EXPRESSIONS
+
+A I<Basic Regular Expression> (BRE), as defined in POSIX 1003.2, consists
+of I<atoms>, for matching parts of a string, and I<bounds>, specifying
+repetitions of a preceding atom.
+
+=head2 Atoms
+
+The possible atoms of a BRE are: B<.>, matching any single character;
+B<^> and B<$>, matching the null string at the beginning or end
+of a string, respectively; a I<bracket expressions>, enclosed
+in B<[> and B<]> (see below); and any single character with no
+other significance (matching that character). A B<\> before one
+of: B<.>, B<^>, B<$>, B<[>, B<*>, B<\>, matching the character
+after the backslash. A sequence of atoms enclosed in B<\(> and B<\)>
+becomes an atom and establishes the target for a I<backreference>,
+consisting of the substring that actually matches the enclosed atoms.
+Finally, B<\> followed by one of the digits B<0> through B<9> is a
+backreference.
+
+A B<^> that is not first, or a B<$> that is not last does not have
+a special significance and need not be preceded by a backslash to
+become literal. The same is true for a B<]>, that does not terminate
+a bracket expression.
+
+An unescaped backslash cannot be last in a BRE.
+
+=head2 Bounds
+
+The BRE bounds are: B<*>, specifying 0 or more matches of the preceding
+atom; B<\{>I<count>B<\}>, specifying that many repetitions;
+B<\{>I<minimum>B<,\}>, giving a lower limit; and
+B<\{>I<minimum>B<,>I<maximum>B<\}> finally defines a lower and upper
+bound. 
+
+A bound appearing as the first item in a BRE is taken literally.
+
+=head2 Bracket Expressions
+
+A I<bracket expression> is a list of characters, character ranges
+and character classes enclosed in B<[> and B<]> and matches any
+single character from the represented set of characters.
+
+A character range is written as two characters separated by B<-> and
+represents all characters (according to the character collating sequence)
+that are not less than the first and not greater than the second.
+(Ranges are very collating-sequence-dependent, and portable programs
+should avoid relying on them.)
+
+A character class is one of the class names
+
+   alnum     digit     punct
+   alpha     graph     space
+   blank     lower     upper
+   cntrl     print     xdigit
+
+enclosed in B<[:> and B<:]> and represents the set of characters
+as defined in ctype(3).
+
+If the first character after B<[> is B<^>, the sense of matching is
+inverted.
+
+To include a literal `C<^>', place it anywhere else but first. To
+include a literal 'C<]>' place it first or immediately after an
+initial B<^>. To include a literal `C<->' make it the first (or
+second after B<^>) or last character, or the second endpoint of
+a range.
+
+The special bracket expression constructs C<[[:E<lt>:]]> and C<[[:E<gt>:]]> 
+match the null string at the beginning and end of a word respectively.
+(Note that neither is identical to Perl's `\b' atom.)
+
+=head2 Additional Atoms
+
+Since some sed implementations provide additional regular expression
+atoms (not defined in POSIX 1003.2), B<psed> is capable of translating
+the following backslash escapes:
+
+=over 4
+
+=item B<\E<lt>> This is the same as C<[[:E<gt>:]]>.
+
+=item B<\E<gt>> This is the same as C<[[:E<lt>:]]>.
+
+=item B<\w> This is an abbreviation for C<[[:alnum:]_]>.
+
+=item B<\W> This is an abbreviation for C<[^[:alnum:]_]>.
+
+=item B<\y> Match the empty string at a word boundary.
+
+=item B<\B> Match the empty string between any two either word or non-word characters.
+
+=back
+
+To enable this feature, the environment variable PSEDEXTBRE must be set
+to a string containing the requested characters, e.g.:
+C<PSEDEXTBRE='E<lt>E<gt>wW'>.
+
+=cut
+
+#####
+# bre2p - convert BRE to Perl RE
+#
+sub peek(\$$){
+    my( $pref, $ic ) = @_;
+    $ic < length($$pref)-1 ? substr( $$pref, $ic+1, 1 ) : '';
+}
+
+sub bre2p($$$){
+    my( $del, $pat, $fl ) = @_;
+    my $led = $del;
+    $led =~ tr/{([</})]>/;
+    $led = '' if $led eq $del;
+
+    $pat = substr( $pat, 1, length($pat) - 2 );
+    my $res = '';
+    my $bracklev = 0;
+    my $backref  = 0;
+    my $parlev = 0;
+    for( my $ic = 0; $ic < length( $pat ); $ic++ ){
+        my $c = substr( $pat, $ic, 1 );
+        if( $c eq '\\' ){
+	    ### backslash escapes
+            my $nc = peek($pat,$ic);
+            if( $nc eq '' ){
+                Warn( "`\\' cannot be last in pattern", $fl );
+                return undef();
+            }
+	    $ic++;
+            if( $nc eq $del ){ ## \<pattern del> => \<pattern del>
+                $res .= "\\$del";
+
+	    } elsif( $nc =~ /([[.*\\n])/ ){
+		## check for \-escaped magics and \n:
+		## \[ \. \* \\ \n stay as they are
+                $res .= '\\'.$nc;
+
+            } elsif( $nc eq '(' ){ ## \( => (
+                $parlev++;
+                $res .= '(';
+
+            } elsif( $nc eq ')' ){ ## \) => )
+                $parlev--;
+		$backref++;
+                if( $parlev < 0 ){
+                    Warn( "unmatched `\\)'", $fl );
+                    return undef();
+                }
+                $res .= ')';
+
+            } elsif( $nc eq '{' ){ ## repetition factor \{<i>[,[<j>]]\}
+                my $endpos = index( $pat, '\\}', $ic );
+                if( $endpos < 0 ){
+                    Warn( "unmatched `\\{'", $fl );
+                    return undef();
+                }
+                my $rep = substr( $pat, $ic+1, $endpos-($ic+1) );
+                $ic = $endpos + 1;
+
+  	        if( $res =~ /^\^?$/ ){
+		    $res .= "\\{$rep\}";
+                } elsif( $rep =~ /^(\d+)(,?)(\d*)?$/ ){
+                    my $min = $1;
+                    my $com = $2 || '';
+                    my $max = $3;
+                    if( length( $max ) ){
+                        if( $max < $min ){
+                            Warn( "maximum less than minimum in `\\{$rep\\}'",
+				  $fl );
+                            return undef();
+                        }
+                    } else {
+                        $max = '';
+                    }
+		    # simplify some
+		    if( $min == 0 && $max eq '1' ){
+			$res .= '?';
+		    } elsif( $min == 1 && "$com$max" eq ',' ){
+			$res .= '+';
+		    } elsif( $min == 0 && "$com$max" eq ',' ){
+			$res .= '*';
+		    } else {
+			$res .= "{$min$com$max}";
+		    }
+                } else {
+                    Warn( "invalid repeat clause `\\{$rep\\}'", $fl );
+                    return undef();
+                }
+
+            } elsif( $nc =~ /^[1-9]$/ ){
+		## \1 .. \9 => \1 .. \9, but check for a following digit
+		if( $nc > $backref ){
+                    Warn( "invalid backreference ($nc)", $fl );
+                    return undef();
+		}
+                $res .= "\\$nc";
+		if( peek($pat,$ic) =~ /[0-9]/ ){
+		    $res .= '(?:)';
+		}
+
+            } elsif( $useEXTBRE && ( $nc =~ /[$useEXTBRE]/ ) ){
+		## extensions - at most <>wWyB - not in POSIX
+                if(      $nc eq '<' ){ ## \< => \b(?=\w), be precise
+                    $res .= '\\b(?<=\\W)';
+                } elsif( $nc eq '>' ){ ## \> => \b(?=\W), be precise
+                    $res .= '\\b(?=\\W)';
+                } elsif( $nc eq 'y' ){ ## \y => \b
+                    $res .= '\\b';
+                } else {               ## \B, \w, \W remain the same
+                    $res .= "\\$nc";
+                } 
+	    } elsif( $nc eq $led ){
+		## \<closing bracketing-delimiter> - keep '\'
+		$res .= "\\$nc";
+
+            } else { ## \ <char> => <char> ("as if `\' were not present")
+                $res .= $nc;
+            }
+
+        } elsif( $c eq '.' ){ ## . => .
+            $res .= $c;
+
+	} elsif( $c eq '*' ){ ## * => * but \* if there's nothing preceding it
+	    if( $res =~ /^\^?$/ ){
+                $res .= '\\*';
+            } elsif( substr( $res, -1, 1 ) ne '*' ){
+		$res .= $c;
+	    }
+
+        } elsif( $c eq '[' ){
+	    ## parse []: [^...] [^]...] [-...]
+	    my $add = '[';
+	    if( peek($pat,$ic) eq '^' ){
+		$ic++;
+		$add .= '^';
+	    }
+	    my $nc = peek($pat,$ic);
+  	    if( $nc eq ']' || $nc eq '-' ){
+		$add .= $nc;
+                $ic++;
+	    }
+	    # check that [ is not trailing
+	    if( $ic >= length( $pat ) - 1 ){
+		Warn( "unmatched `['", $fl );
+		return undef();
+	    }
+	    # look for [:...:] and x-y
+	    my $rstr = substr( $pat, $ic+1 );
+	    if( $rstr =~ /^((?:\[:\(\w+|[><]\):\]|[^]-](?:-[^]])?)*)/ ){
+ 	        my $cnt = $1;
+		$ic += length( $cnt );
+		$cnt =~ s/([\\\$])/\\$1/g; # `\', `$' are magic in Perl []
+		# try some simplifications
+ 	        my $red = $cnt;
+		if( $red =~ s/0-9// ){
+		    $cnt = $red.'\d';
+		    if( $red =~ s/A-Z// && $red =~ s/a-z// && $red =~ s/_// ){
+			$cnt = $red.'\w';
+                    }
+		}
+		$add .= $cnt;
+
+		# POSIX 1003.2 has this (optional) for begin/end word
+		$add = '\\b(?=\\W)'  if $add eq '[[:<:]]';
+		$add = '\\b(?<=\\W)' if $add eq '[[:>:]]';
+
+	    }
+
+	    ## may have a trailing `-' before `]'
+	    if( $ic < length($pat) - 1 &&
+                substr( $pat, $ic+1 ) =~ /^(-?])/ ){
+		$ic += length( $1 );
+		$add .= $1;
+		# another simplification
+		$add =~ s/^\[(\^?)(\\[dw])]$/ $1 eq '^' ? uc($2) : $2 /e;
+		$res .= $add;
+	    } else {
+		Warn( "unmatched `['", $fl );
+		return undef();
+	    }
+
+        } elsif( $c eq $led ){ ## unescaped <closing bracketing-delimiter>
+            $res .= "\\$c";
+
+        } elsif( $c eq ']' ){ ## unmatched ] is not magic
+            $res .= ']';
+
+        } elsif( $c =~ /[|+?{}()]/ ){ ## not magic in BRE, but in Perl: \-quote
+            $res .= "\\$c";
+
+        } elsif( $c eq '^' ){ ## not magic unless 1st, but in Perl: \-quote
+            $res .= length( $res ) ? '\\^' : '^';
+
+        } elsif( $c eq '$' ){ ## not magic unless last, but in Perl: \-quote
+            $res .= $ic == length( $pat ) - 1 ? '$' : '\\$';
+
+        } else {
+            $res .= $c;
+        }
+    }
+
+    if( $parlev ){
+       Warn( "unmatched `\\('", $fl );
+       return undef();
+    }
+
+    # final cleanup: eliminate raw HTs
+    $res =~ s/\t/\\t/g;
+    return $del . $res . ( $led ? $led : $del );
+}
+
+
+#####
+# sub2p - convert sed substitution to Perl substitution
+#
+sub sub2p($$$){
+    my( $del, $subst, $fl ) = @_;
+    my $led = $del;
+    $led =~ tr/{([</})]>/;
+    $led = '' if $led eq $del;
+
+    $subst = substr( $subst, 1, length($subst) - 2 );
+    my $res = '';
+ 
+    for( my $ic = 0; $ic < length( $subst ); $ic++ ){
+        my $c = substr( $subst, $ic, 1 );
+        if( $c eq '\\' ){
+	    ### backslash escapes
+            my $nc = peek($subst,$ic);
+            if( $nc eq '' ){
+                Warn( "`\\' cannot be last in substitution", $fl );
+                return undef();
+            }
+	    $ic++;
+	    if( $nc =~ /[\\$del$led]/ ){ ## \ and delimiter
+		$res .= '\\' . $nc;
+            } elsif( $nc =~ /[1-9]/ ){ ## \1 - \9 => ${1} - ${9}
+                $res .= '${' . $nc . '}';
+	    } else { ## everything else (includes &): omit \
+		$res .= $nc;
+	    }
+        } elsif( $c eq '&' ){ ## & => $&
+            $res .= '$&';
+	} elsif( $c =~ /[\$\@$led]/ ){ ## magic in Perl's substitution string
+	    $res .= '\\' . $c;
+        } else {
+	    $res .= $c;
+	}
+    }
+
+    # final cleanup: eliminate raw HTs
+    $res =~ s/\t/\\t/g;
+    return ( $led ? $del : $led ) . $res . ( $led ? $led : $del );
+}
+
+
+sub Parse(){
+    my $error = 0;
+    my( $pdef, $pfil, $plin );
+    for( my $icom = 0; $icom < @Commands; $icom++ ){
+	my $cmd = $Commands[$icom];
+	print "Parse:$cmd:\n" if $useDEBUG;
+	$cmd =~ s/^\s+//;
+	next unless length( $cmd );
+	my $scom = $icom;
+	if( exists( $Defined{$icom} ) ){
+	    $pdef = $Defined{$icom};
+	    if( $pdef =~ /^ #(\d+)/ ){
+		$pfil = 'expression #';
+		$plin = $1;
+	    } else {
+		$pfil = "$pdef l.";
+		$plin = 1;
+            }
+        } else {
+	    $plin++;
+        }
+        my $fl = "$pfil$plin";
+
+        # insert command as comment in gnerated code
+	#
+	$Code .= "# $cmd\n" if $doGenerate;
+
+	# The Address(es)
+	#
+	my( $negated, $naddr, $addr1, $addr2 );
+	$naddr = 0;
+	if(      $cmd =~ s/^(\d+)\s*// ){
+	    $addr1 = "$1"; $naddr++;
+	} elsif( $cmd =~ s/^\$\s*// ){
+	    $addr1 = 'eofARGV()'; $naddr++;
+	} elsif( $cmd =~ s{^(/)}{} || $cmd =~ s{^\\(.)}{} ){
+	    my $del = $1;
+	    my $regex = stripRegex( $del, \$cmd );
+	    if( defined( $regex ) ){
+		$addr1 = 'm '.bre2p( $del, $regex, $fl ).'s';
+		$naddr++;
+	    } else {
+		Warn( "malformed regex, 1st address", $fl );
+		$error++;
+		next;
+	    }
+        }
+        if( defined( $addr1 ) && $cmd =~ s/,\s*// ){
+ 	    if(      $cmd =~ s/^(\d+)\s*// ){
+	        $addr2 = "$1"; $naddr++;
+	    } elsif( $cmd =~ s/^\$\s*// ){
+	        $addr2 = 'eofARGV()'; $naddr++;
+	    } elsif( $cmd =~ s{^(/)}{} || $cmd =~ s{^\\(.)}{} ){
+		my $del = $1;
+	        my $regex = stripRegex( $del, \$cmd );
+		if( defined( $regex ) ){
+		    $addr2 = 'm '. bre2p( $del, $regex, $fl ).'s';
+		    $naddr++;
+		} else {
+		    Warn( "malformed regex, 2nd address", $fl );
+		    $error++;
+		    next;
+		}
+            } else {
+		Warn( "invalid address after `,'", $fl );
+		$error++;
+		next;
+            }
+        }
+
+        # address modifier `!'
+        #
+        $negated = $cmd =~ s/^!\s*//;
+	if( defined( $addr1 ) ){
+	    print "Parse: addr1=$addr1" if $useDEBUG;
+	    if( defined( $addr2 ) ){
+		print ", addr2=$addr2 " if $useDEBUG;
+		# both numeric and addr1 > addr2 => eliminate addr2
+		undef( $addr2 ) if $addr1 =~ /^\d+$/ &&
+                                   $addr2 =~ /^\d+$/ && $addr1 > $addr2;
+	    }
+	}
+	print 'negated' if $useDEBUG && $negated;
+	print " command:$cmd\n" if $useDEBUG;
+
+	# The Command
+	#
+        if( $cmd !~ s/^([:#={}abcdDgGhHilnNpPqrstwxy])\s*// ){
+	    my $h = substr( $cmd, 0, 1 );
+ 	    Warn( "unknown command `$h'", $fl );
+	    $error++;
+	    next;
+	}
+        my $key = $1;
+
+	my $tabref = $ComTab{$key};
+	$GenKey{$key} = 1;
+	if( $naddr > $tabref->[0] ){
+	    Warn( "excess address(es)", $fl );
+	    $error++;
+	    next;
+	}
+
+	my $arg = '';
+	if(      $tabref->[1] eq 'str' ){
+	    # take remainder - don't care if it is empty
+	    $arg = $cmd;
+            $cmd = '';
+
+	} elsif( $tabref->[1] eq 'txt' ){
+	    # multi-line text
+	    my $goon = $cmd =~ /(.*)\\$/;
+	    if( length( $1 ) ){
+		Warn( "extra characters after command ($cmd)", $fl );
+		$error++;
+	    }
+	    while( $goon ){
+		$icom++;
+		if( $icom > $#Commands ){
+		    Warn( "unexpected end of script", $fl );
+		    $error++;
+		    last;
+		}
+		$cmd = $Commands[$icom];
+		$Code .= "# $cmd\n" if $doGenerate;
+		$goon = $cmd =~ s/\\$//;
+		$cmd =~ s/\\(.)/$1/g;
+		$arg .= "\n" if length( $arg );
+		$arg .= $cmd;
+	    }
+	    $arg .= "\n" if length( $arg );
+	    $cmd = '';
+
+	} elsif( $tabref->[1] eq 'sub' ){
+	    # s///
+	    if( ! length( $cmd ) ){
+		Warn( "`s' command requires argument", $fl );
+		$error++;
+		next;
+	    }
+	    if( $cmd =~ s{^([^\\\n])}{} ){
+		my $del = $1;
+		my $regex = stripRegex( $del, \$cmd );
+		if( ! defined( $regex ) ){
+		    Warn( "malformed regular expression", $fl );
+		    $error++;
+		    next;
+		}
+		$regex = bre2p( $del, $regex, $fl );
+
+		# a trailing \ indicates embedded NL (in replacement string)
+		while( $cmd =~ s/(?<!\\)\\$/\n/ ){
+		    $icom++;
+		    if( $icom > $#Commands ){
+			Warn( "unexpected end of script", $fl );
+			$error++;
+			last;
+		    }
+		    $cmd .= $Commands[$icom];
+	            $Code .= "# $Commands[$icom]\n" if $doGenerate;
+		}
+
+		my $subst = stripRegex( $del, \$cmd );
+		if( ! defined( $regex ) ){
+		    Warn( "malformed substitution expression", $fl );
+		    $error++;
+		    next;
+		}
+		$subst = sub2p( $del, $subst, $fl );
+
+		# parse s/// modifier: g|p|0-9|w <file>
+		my( $global, $nmatch, $print, $write ) =
+		  ( '',      '',      0,      undef );
+		while( $cmd =~ s/^([gp0-9])// ){
+		    $1 eq 'g' ? ( $global = 'g' ) :
+  		    $1 eq 'p' ? ( $print  = $1  ) : ( $nmatch .= $1 );
+                }
+		$write = $1 if $cmd =~ s/w\s*(.*)$//;
+  	        ### $nmatch =~ s/^(\d)\1*$/$1/; ### may be dangerous?
+		if( $global && length( $nmatch ) || length( $nmatch ) > 1 ){
+		    Warn( "conflicting flags `$global$nmatch'", $fl );
+		    $error++;
+		    next;
+		}
+
+		$arg = makes( $regex, $subst,
+			      $write, $global, $print, $nmatch, $fl );
+		if( ! defined( $arg ) ){
+		    $error++;
+		    next;
+		}
+
+            } else {
+		Warn( "improper delimiter in s command", $fl );
+		$error++;
+		next;
+            }
+
+	} elsif( $tabref->[1] eq 'tra' ){
+	    # y///
+	    # a trailing \ indicates embedded newline
+	    while( $cmd =~ s/(?<!\\)\\$/\n/ ){
+		$icom++;
+		if( $icom > $#Commands ){
+		    Warn( "unexpected end of script", $fl );
+		    $error++;
+		    last;
+		}
+		$cmd .= $Commands[$icom];
+                $Code .= "# $Commands[$icom]\n" if $doGenerate;
+	    }
+	    if( ! length( $cmd ) ){
+		Warn( "`y' command requires argument", $fl );
+		$error++;
+		next;
+	    }
+	    my $d = substr( $cmd, 0, 1 ); $cmd = substr( $cmd, 1 );
+	    if( $d eq '\\' ){
+		Warn( "`\\' not valid as delimiter in `y' command", $fl );
+		$error++;
+		next;
+	    }
+	    my $fr = stripTrans( $d, \$cmd );
+	    if( ! defined( $fr ) || ! length( $cmd ) ){
+		Warn( "malformed `y' command argument", $fl );
+		$error++;
+		next;
+	    }
+	    my $to = stripTrans( $d, \$cmd );
+	    if( ! defined( $to ) ){
+		Warn( "malformed `y' command argument", $fl );
+		$error++;
+		next;
+	    }
+	    if( length($fr) != length($to) ){
+		Warn( "string lengths in `y' command differ", $fl );
+		$error++;
+		next;
+	    }
+	    if( ! defined( $arg = makey( $fr, $to, $fl ) ) ){
+		$error++;
+		next;
+	    }
+
+	}
+
+	# $cmd must be now empty - exception is {
+	if( $cmd !~ /^\s*$/ ){
+	    if( $key eq '{' ){
+		# dirty hack to process command on '{' line
+		$Commands[$icom--] = $cmd;
+	    } else {
+		Warn( "extra characters after command ($cmd)", $fl );
+		$error++;
+		next;
+	    }
+	}
+
+	# Make Code
+        #
+	if( &{$tabref->[2]}( $addr1, $addr2, $negated,
+                             $tabref->[3], $arg, $fl ) ){
+	    $error++;
+	}
+    }
+
+    while( @BlockStack ){
+	my $bl = pop( @BlockStack );
+	Warn( "start of unterminated `{'", $bl );
+        $error++;
+    }
+
+    for my $lab ( keys( %Label ) ){
+	if( ! exists( $Label{$lab}{defined} ) ){
+	    for my $used ( @{$Label{$lab}{used}} ){
+ 	        Warn( "undefined label `$lab'", $used );
+	        $error++;
+	    }
+	}
+    }
+
+    exit( 1 ) if $error;
+}
+
+
+##############
+#### MAIN ####
+##############
+
+sub usage(){
+    print STDERR "Usage: sed [-an] command [file...]\n";
+    print STDERR "           [-an] [-e command] [-f script-file] [file...]\n";
+}
+
+###################
+# Here we go again...
+#
+my $expr = 0;
+while( @ARGV && $ARGV[0] =~ /^-(.)(.*)$/ ){
+    my $opt = $1;
+    my $arg = $2;
+    shift( @ARGV );
+    if(      $opt eq 'e' ){
+        if( length( $arg ) ){
+	    push( @Commands, split( "\n", $arg ) );
+        } elsif( @ARGV ){
+	    push( @Commands, shift( @ARGV ) ); 
+        } else {
+            Warn( "option -e requires an argument" );
+            usage();
+            exit( 1 );
+        }
+	$expr++;
+        $Defined{$#Commands} = " #$expr";
+	next;
+    }
+    if( $opt eq 'f' ){
+        my $path;
+        if( length( $arg ) ){
+	    $path = $arg;
+        } elsif( @ARGV ){
+	    $path = shift( @ARGV ); 
+        } else {
+            Warn( "option -f requires an argument" );
+            usage();
+            exit( 1 );
+        }
+	my $fst = $#Commands + 1;
+        open( SCRIPT, "<$path" ) || die( "$0: $path: could not open ($!)\n" );
+        my $cmd;
+        while( defined( $cmd = <SCRIPT> ) ){
+            chomp( $cmd );
+            push( @Commands, $cmd );
+        }
+        close( SCRIPT );
+	if( $#Commands >= $fst ){
+	    $Defined{$fst} = "$path";
+	}
+	next;
+    }
+    if( $opt eq '-' && $arg eq '' ){
+	last;
+    }
+    if( $opt eq 'h' || $opt eq '?' ){
+        usage();
+        exit( 0 );
+    }
+    if( $opt eq 'n' ){
+	$doAutoPrint = 0;
+    } elsif( $opt eq 'a' ){
+	$doOpenWrite = 0;
+    } else {
+        Warn( "illegal option `$opt'" );
+        usage();
+        exit( 1 );
+    }
+    if( length( $arg ) ){
+	unshift( @ARGV, "-$arg" );
+    }
+}
+
+# A singleton command may be the 1st argument when there are no options.
+#
+if( @Commands == 0 ){
+    if( @ARGV == 0 ){
+        Warn( "no script command given" );
+        usage();
+        exit( 1 );
+    }
+    push( @Commands, split( "\n", shift( @ARGV ) ) );
+    $Defined{0} = ' #1';
+}
+
+print STDERR "Files: @ARGV\n" if $useDEBUG;
+
+# generate leading code
+#
+$Func = <<'[TheEnd]';
+
+# openARGV: open 1st input file
+#
+sub openARGV(){
+    unshift( @ARGV, '-' ) unless @ARGV;
+    my $file = shift( @ARGV );
+    open( ARG, "<$file" )
+    || die( "$0: can't open $file for reading ($!)\n" );
+    $isEOF = 0;
+}
+
+# getsARGV: Read another input line into argument (default: $_).
+#           Move on to next input file, and reset EOF flag $isEOF.
+sub getsARGV(;\$){
+    my $argref = @_ ? shift() : \$_; 
+    while( $isEOF || ! defined( $$argref = <ARG> ) ){
+	close( ARG );
+	return 0 unless @ARGV;
+	my $file = shift( @ARGV );
+	open( ARG, "<$file" )
+	|| die( "$0: can't open $file for reading ($!)\n" );
+	$isEOF = 0;
+    }
+    1;
+}
+
+# eofARGV: end-of-file test
+#
+sub eofARGV(){
+    return @ARGV == 0 && ( $isEOF = eof( ARG ) );
+}
+
+# makeHandle: Generates another file handle for some file (given by its path)
+#             to be written due to a w command or an s command's w flag.
+sub makeHandle($){
+    my( $path ) = @_;
+    my $handle;
+    if( ! exists( $wFiles{$path} ) || $wFiles{$path} eq '' ){
+        $handle = $wFiles{$path} = gensym();
+	if( $doOpenWrite ){
+	    if( ! open( $handle, ">$path" ) ){
+		die( "$0: can't open $path for writing: ($!)\n" );
+	    }
+	}
+    } else {
+        $handle = $wFiles{$path};
+    }
+    return $handle;
+}
+
+# printQ: Print queued output which is either a string or a reference
+#         to a pathname.
+sub printQ(){
+    for my $q ( @Q ){
+	if( ref( $q ) ){
+            # flush open w files so that reading this file gets it all
+	    if( exists( $wFiles{$$q} ) && $wFiles{$$q} ne '' ){
+		open( $wFiles{$$q}, ">>$$q" );
+	    }
+            # copy file to stdout: slow, but safe
+	    if( open( RF, "<$$q" ) ){
+		while( defined( my $line = <RF> ) ){
+		    print $line;
+		}
+		close( RF );
+	    }
+	} else {
+	    print $q;
+	}
+    }
+    undef( @Q );
+}
+
+[TheEnd]
+
+# generate the sed loop
+#
+$Code .= <<'[TheEnd]';
+sub openARGV();
+sub getsARGV(;\$);
+sub eofARGV();
+sub printQ();
+
+# Run: the sed loop reading input and applying the script
+#
+sub Run(){
+    my( $h, $icnt, $s, $n );
+    # hack (not unbreakable :-/) to avoid // matching an empty string
+    my $z = "\000"; $z =~ /$z/;
+    # Initialize.
+    openARGV();
+    $Hold    = '';
+    $CondReg = 0;
+    $doPrint = $doAutoPrint;
+CYCLE:
+    while( getsARGV() ){
+	chomp();
+	$CondReg = 0;   # cleared on t
+BOS:;
+[TheEnd]
+
+    # parse - avoid opening files when doing s2p
+    #
+    ( $svOpenWrite, $doOpenWrite ) = (  $doOpenWrite, $svOpenWrite )
+      if $doGenerate;
+    Parse();
+    ( $svOpenWrite, $doOpenWrite ) = (  $doOpenWrite, $svOpenWrite )
+      if $doGenerate;
+
+    # append trailing code
+    #
+    $Code .= <<'[TheEnd]';
+EOS:    if( $doPrint ){
+            print $_, "\n";
+        } else {
+	    $doPrint = $doAutoPrint;
+	}
+        printQ() if @Q;
+    }
+
+    exit( 0 );
+}
+[TheEnd]
+
+
+# append optional functions, prepend prototypes
+#
+my $Proto = "# prototypes\n";
+if( $GenKey{'l'} ){
+    $Proto .= "sub _l();\n";
+    $Func .= <<'[TheEnd]';
+# _l: l command processing
+#
+sub _l(){        
+    my $h = $_;
+    my $mcpl = 70;
+    # transform non printing chars into escape notation
+    $h =~ s/\\/\\\\/g;
+    if( $h =~ /[^[:print:]]/ ){
+	$h =~ s/\a/\\a/g;
+	$h =~ s/\f/\\f/g;
+	$h =~ s/\n/\\n/g;
+	$h =~ s/\t/\\t/g;
+	$h =~ s/\r/\\r/g;
+	$h =~ s/\e/\\e/g;
+        $h =~ s/([^[:print:]])/sprintf("\\%03o", ord($1))/ge;
+    }
+    # split into lines of length $mcpl
+    while( length( $h ) > $mcpl ){
+	my $l = substr( $h, 0, $mcpl-1 );
+	$h = substr( $h, $mcpl );
+	# remove incomplete \-escape from end of line
+	if( $l =~ s/(?<!\\)(\\[0-7]{0,2})$// ){
+	    $h = $1 . $h;
+	}
+	print $l, "\\\n";
+    }
+    print "$h\$\n";
+}
+
+[TheEnd]
+}
+
+if( $GenKey{'r'} ){
+    $Proto .= "sub _r(\$);\n";
+    $Func .= <<'[TheEnd]';
+# _r: r command processing: Save a reference to the pathname.
+#
+sub _r($){
+    my $path = shift();
+    push( @Q, \$path );
+}
+
+[TheEnd]
+}
+
+if( $GenKey{'t'} ){
+    $Proto .= "sub _t();\n";
+    $Func .= <<'[TheEnd]';
+# _t: t command - condition register test/reset
+#
+sub _t(){
+    my $res = $CondReg;
+    $CondReg = 0;
+    $res;
+}
+
+[TheEnd]
+}
+
+if( $GenKey{'w'} ){
+    $Proto .= "sub _w(\$);\n";
+    $Func .= <<'[TheEnd]';
+# _w: w command and s command's w flag - write to file 
+#
+sub _w($){
+    my $path   = shift();
+    my $handle = $wFiles{$path};
+    if( ! $doOpenWrite && ! defined( fileno( $handle ) ) ){
+	open( $handle, ">$path" )
+	|| die( "$0: $path: cannot open ($!)\n" );
+    }
+    print $handle $_, "\n";
+}
+
+[TheEnd]
+}
+
+$Code = $Proto . $Code;
+
+# magic "#n" - same as -n option
+#
+$doAutoPrint = 0 if substr( $Commands[0], 0, 2 ) eq '#n';
+
+# eval code - check for errors
+#
+print "Code:\n$Code$Func" if $useDEBUG;
+eval $Code . $Func;
+if( $@ ){
+    print "Code:\n$Code$Func";
+    die( "$0: internal error - generated incorrect Perl code: $@\n" );
+}
+
+if( $doGenerate ){
+
+    # write full Perl program
+    #
+ 
+    # bang line, declarations, prototypes
+    print <<TheEnd;
+#!$perlpath -w
+eval 'exec $perlpath -S \$0 \${1+"\$@"}'
+  if 0;
+\$0 =~ s/^.*?(\\w+)\[\\.\\w+\]*\$/\$1/;
+
+use strict;
+use Symbol;
+use vars qw{ \$isEOF \$Hold \%wFiles \@Q \$CondReg
+	     \$doAutoPrint \$doOpenWrite \$doPrint };
+\$doAutoPrint = $doAutoPrint;
+\$doOpenWrite = $doOpenWrite;
+TheEnd
+
+    my $wf = "'" . join( "', '",  keys( %wFiles ) ) . "'";
+    if( $wf ne "''" ){
+	print <<TheEnd;
+sub makeHandle(\$);
+for my \$p ( $wf ){
+   exit( 1 ) unless makeHandle( \$p );
+}
+TheEnd
+   }
+
+   print $Code;
+   print "Run();\n";
+   print $Func;
+   exit( 0 );
+
+} else {
+
+    # execute: make handles (and optionally open) all w files; run!
+    for my $p ( keys( %wFiles ) ){
+        exit( 1 ) unless makeHandle( $p );
+    }
+    Run();
+}
+
+
+=head1 ENVIRONMENT
+
+The environment variable C<PSEDEXTBRE> may be set to extend BREs.
+See L<"Additional Atoms">.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item ambiguous translation for character `%s' in `y' command
+
+The indicated character appears twice, with different translations.
+
+=item `[' cannot be last in pattern
+
+A `[' in a BRE indicates the beginning of a I<bracket expression>.
+
+=item `\' cannot be last in pattern
+
+A `\' in a BRE is used to make the subsequent character literal.
+
+=item `\' cannot be last in substitution
+
+A `\' in a subsitution string is used to make the subsequent character literal.
+
+=item conflicting flags `%s'
+
+In an B<s> command, either the `g' flag and an n-th occurrence flag, or
+multiple n-th occurrence flags are specified. Note that only the digits
+`1' through `9' are permitted.
+
+=item duplicate label %s (first defined at %s)
+
+=item excess address(es)
+
+The command has more than the permitted number of addresses.
+
+=item extra characters after command (%s)
+
+=item illegal option `%s'
+
+=item improper delimiter in s command
+
+The BRE and substitution may not be delimited with `\' or newline.
+
+=item invalid address after `,'
+
+=item invalid backreference (%s)
+
+The specified backreference number exceeds the number of backreferences
+in the BRE.
+
+=item invalid repeat clause `\{%s\}'
+
+The repeat clause does not contain a valid integer value, or pair of
+values.
+
+=item malformed regex, 1st address
+
+=item malformed regex, 2nd address
+
+=item malformed regular expression
+
+=item malformed substitution expression
+
+=item malformed `y' command argument
+
+The first or second string of a B<y> command  is syntactically incorrect.
+
+=item maximum less than minimum in `\{%s\}'
+
+=item no script command given
+
+There must be at least one B<-e> or one B<-f> option specifying a
+script or script file.
+
+=item `\' not valid as delimiter in `y' command
+
+=item option -e requires an argument
+
+=item option -f requires an argument
+
+=item `s' command requires argument
+
+=item start of unterminated `{'
+
+=item string lengths in `y' command differ
+
+The translation table strings in a B<y> commanf must have equal lengths.
+
+=item undefined label `%s'
+
+=item unexpected `}'
+
+A B<}> command without a preceding B<{> command was encountered.
+
+=item unexpected end of script
+
+The end of the script was reached although a text line after a
+B<a>, B<c> or B<i> command indicated another line.
+
+=item unknown command `%s'
+
+=item unterminated `['
+
+A BRE contains an unterminated bracket expression.
+
+=item unterminated `\('
+
+A BRE contains an unterminated backreference.
+
+=item `\{' without closing `\}'
+
+A BRE contains an unterminated bounds specification.
+
+=item `\)' without preceding `\('
+
+=item `y' command requires argument
+
+=back
+
+=head1 EXAMPLE
+
+The basic material for the preceding section was generated by running
+the sed script
+
+   #no autoprint
+   s/^.*Warn( *"\([^"]*\)".*$/\1/
+   t process
+   b
+   :process
+   s/$!/%s/g
+   s/$[_[:alnum:]]\{1,\}/%s/g
+   s/\\\\/\\/g
+   s/^/=item /
+   p
+
+on the program's own text, and piping the output into C<sort -u>.
+
+
+=head1 SED SCRIPT TRANSLATION
+
+If this program is invoked with the name F<s2p> it will act as a
+sed-to-Perl translator. After option processing (all other
+arguments are ignored), a Perl program is printed on standard
+output, which will process the input stream (as read from all
+arguments) in the way defined by the sed script and the option setting
+used for the translation.
+
+=head1 SEE ALSO
+
+perl(1), re_format(7)
+
+=head1 BUGS
+
+The B<l> command will show escape characters (ESC) as `C<\e>', but
+a vertical tab (VT) in octal.
+
+Trailing spaces are truncated from labels in B<:>, B<t> and B<b> commands.
+
+The meaning of an empty regular expression (`C<//>'), as defined by B<sed>,
+is "the last pattern used, at run time". This deviates from the Perl
+interpretation, which will re-use the "last last successfully executed
+regular expression". Since keeping track of pattern usage would create
+terribly cluttered code, and differences would only appear in obscure
+context (where other B<sed> implementations appear to deviate, too),
+the Perl semantics was adopted. Note that common usage of this feature,
+such as in C</abc/s//xyz/>, will work as expected.
+
+Collating elements (of bracket expressions in BREs) are not implemented.
+
+=head1 STANDARDS
+
+This B<sed> implementation conforms to the IEEE Std1003.2-1992 ("POSIX.2")
+definition of B<sed>, and is compatible with the I<OpenBSD>
+implementation, except where otherwise noted (see L<"BUGS">).
+
+=head1 AUTHOR
+
+This Perl implementation of I<sed> was written by Wolfgang Laun,
+I<Wolfgang.Laun@alcatel.at>.
+
+=head1 COPYRIGHT and LICENSE
+
+This program is free and open software. You may use, modify,
+distribute, and sell this program (and any modified variants) in any
+way you wish, provided you do not restrict others from doing the same.
+
+=cut
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/pstruct.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/pstruct.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/pstruct.bat	(revision 14489)
@@ -0,0 +1,1383 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+#
+#
+#   c2ph (aka pstruct)
+#   Tom Christiansen, <tchrist@convex.com>
+#
+#   As pstruct, dump C structures as generated from 'cc -g -S' stabs.
+#   As c2ph, do this PLUS generate perl code for getting at the structures.
+#
+#   See the usage message for more.  If this isn't enough, read the code.
+#
+
+=head1 NAME
+
+c2ph, pstruct - Dump C structures as generated from C<cc -g -S> stabs
+
+=head1 SYNOPSIS
+
+    c2ph [-dpnP] [var=val] [files ...]
+
+=head2 OPTIONS
+
+    Options:
+
+    -w	wide; short for: type_width=45 member_width=35 offset_width=8
+    -x	hex; short for:  offset_fmt=x offset_width=08 size_fmt=x size_width=04
+
+    -n	do not generate perl code  (default when invoked as pstruct)
+    -p	generate perl code         (default when invoked as c2ph)
+    -v	generate perl code, with C decls as comments
+
+    -i	do NOT recompute sizes for intrinsic datatypes
+    -a	dump information on intrinsics also
+
+    -t	trace execution
+    -d	spew reams of debugging output
+
+    -slist  give comma-separated list a structures to dump
+
+=head1 DESCRIPTION
+
+The following is the old c2ph.doc documentation by Tom Christiansen
+<tchrist@perl.com>
+Date: 25 Jul 91 08:10:21 GMT
+
+Once upon a time, I wrote a program called pstruct.  It was a perl
+program that tried to parse out C structures and display their member
+offsets for you.  This was especially useful for people looking at
+binary dumps or poking around the kernel.
+
+Pstruct was not a pretty program.  Neither was it particularly robust.
+The problem, you see, was that the C compiler was much better at parsing
+C than I could ever hope to be.
+
+So I got smart:  I decided to be lazy and let the C compiler parse the C,
+which would spit out debugger stabs for me to read.  These were much
+easier to parse.  It's still not a pretty program, but at least it's more
+robust.
+
+Pstruct takes any .c or .h files, or preferably .s ones, since that's
+the format it is going to massage them into anyway, and spits out
+listings like this:
+
+ struct tty {
+   int                          tty.t_locker                         000      4
+   int                          tty.t_mutex_index                    004      4
+   struct tty *                 tty.t_tp_virt                        008      4
+   struct clist                 tty.t_rawq                           00c     20
+     int                        tty.t_rawq.c_cc                      00c      4
+     int                        tty.t_rawq.c_cmax                    010      4
+     int                        tty.t_rawq.c_cfx                     014      4
+     int                        tty.t_rawq.c_clx                     018      4
+     struct tty *               tty.t_rawq.c_tp_cpu                  01c      4
+     struct tty *               tty.t_rawq.c_tp_iop                  020      4
+     unsigned char *            tty.t_rawq.c_buf_cpu                 024      4
+     unsigned char *            tty.t_rawq.c_buf_iop                 028      4
+   struct clist                 tty.t_canq                           02c     20
+     int                        tty.t_canq.c_cc                      02c      4
+     int                        tty.t_canq.c_cmax                    030      4
+     int                        tty.t_canq.c_cfx                     034      4
+     int                        tty.t_canq.c_clx                     038      4
+     struct tty *               tty.t_canq.c_tp_cpu                  03c      4
+     struct tty *               tty.t_canq.c_tp_iop                  040      4
+     unsigned char *            tty.t_canq.c_buf_cpu                 044      4
+     unsigned char *            tty.t_canq.c_buf_iop                 048      4
+   struct clist                 tty.t_outq                           04c     20
+     int                        tty.t_outq.c_cc                      04c      4
+     int                        tty.t_outq.c_cmax                    050      4
+     int                        tty.t_outq.c_cfx                     054      4
+     int                        tty.t_outq.c_clx                     058      4
+     struct tty *               tty.t_outq.c_tp_cpu                  05c      4
+     struct tty *               tty.t_outq.c_tp_iop                  060      4
+     unsigned char *            tty.t_outq.c_buf_cpu                 064      4
+     unsigned char *            tty.t_outq.c_buf_iop                 068      4
+   (*int)()                     tty.t_oproc_cpu                      06c      4
+   (*int)()                     tty.t_oproc_iop                      070      4
+   (*int)()                     tty.t_stopproc_cpu                   074      4
+   (*int)()                     tty.t_stopproc_iop                   078      4
+   struct thread *              tty.t_rsel                           07c      4
+
+etc.
+
+
+Actually, this was generated by a particular set of options.  You can control
+the formatting of each column, whether you prefer wide or fat, hex or decimal,
+leading zeroes or whatever.
+
+All you need to be able to use this is a C compiler than generates
+BSD/GCC-style stabs.  The B<-g> option on native BSD compilers and GCC
+should get this for you.
+
+To learn more, just type a bogus option, like B<-\?>, and a long usage message
+will be provided.  There are a fair number of possibilities.
+
+If you're only a C programmer, than this is the end of the message for you.
+You can quit right now, and if you care to, save off the source and run it
+when you feel like it.  Or not.
+
+
+
+But if you're a perl programmer, then for you I have something much more
+wondrous than just a structure offset printer.
+
+You see, if you call pstruct by its other incybernation, c2ph, you have a code
+generator that translates C code into perl code!  Well, structure and union
+declarations at least, but that's quite a bit.
+
+Prior to this point, anyone programming in perl who wanted to interact
+with C programs, like the kernel, was forced to guess the layouts of
+the C structures, and then hardwire these into his program.  Of course,
+when you took your wonderfully crafted program to a system where the
+sgtty structure was laid out differently, your program broke.  Which is
+a shame.
+
+We've had Larry's h2ph translator, which helped, but that only works on
+cpp symbols, not real C, which was also very much needed.  What I offer
+you is a symbolic way of getting at all the C structures.  I've couched
+them in terms of packages and functions.  Consider the following program:
+
+    #!/usr/local/bin/perl
+
+    require 'syscall.ph';
+    require 'sys/time.ph';
+    require 'sys/resource.ph';
+
+    $ru = "\0" x &rusage'sizeof();
+
+    syscall(&SYS_getrusage, &RUSAGE_SELF, $ru)      && die "getrusage: $!";
+
+    @ru = unpack($t = &rusage'typedef(), $ru);
+
+    $utime =  $ru[ &rusage'ru_utime + &timeval'tv_sec  ]
+	   + ($ru[ &rusage'ru_utime + &timeval'tv_usec ]) / 1e6;
+
+    $stime =  $ru[ &rusage'ru_stime + &timeval'tv_sec  ]
+	   + ($ru[ &rusage'ru_stime + &timeval'tv_usec ]) / 1e6;
+
+    printf "you have used %8.3fs+%8.3fu seconds.\n", $utime, $stime;
+
+
+As you see, the name of the package is the name of the structure.  Regular
+fields are just their own names.  Plus the following accessor functions are
+provided for your convenience:
+
+    struct	This takes no arguments, and is merely the number of first-level
+		elements in the structure.  You would use this for indexing
+		into arrays of structures, perhaps like this
+
+
+		    $usec = $u[ &user'u_utimer
+				+ (&ITIMER_VIRTUAL * &itimerval'struct)
+				+ &itimerval'it_value
+				+ &timeval'tv_usec
+			      ];
+
+    sizeof   	Returns the bytes in the structure, or the member if
+	     	you pass it an argument, such as
+
+			&rusage'sizeof(&rusage'ru_utime)
+
+    typedef  	This is the perl format definition for passing to pack and
+	     	unpack.  If you ask for the typedef of a nothing, you get
+	     	the whole structure, otherwise you get that of the member
+	     	you ask for.  Padding is taken care of, as is the magic to
+	     	guarantee that a union is unpacked into all its aliases.
+	     	Bitfields are not quite yet supported however.
+
+    offsetof	This function is the byte offset into the array of that
+		member.  You may wish to use this for indexing directly
+		into the packed structure with vec() if you're too lazy
+		to unpack it.
+
+    typeof	Not to be confused with the typedef accessor function, this
+		one returns the C type of that field.  This would allow
+		you to print out a nice structured pretty print of some
+		structure without knoning anything about it beforehand.
+		No args to this one is a noop.  Someday I'll post such
+		a thing to dump out your u structure for you.
+
+
+The way I see this being used is like basically this:
+
+	% h2ph <some_include_file.h  >  /usr/lib/perl/tmp.ph
+	% c2ph  some_include_file.h  >> /usr/lib/perl/tmp.ph
+	% install
+
+It's a little tricker with c2ph because you have to get the includes right.
+I can't know this for your system, but it's not usually too terribly difficult.
+
+The code isn't pretty as I mentioned  -- I never thought it would be a 1000-
+line program when I started, or I might not have begun. :-)  But I would have
+been less cavalier in how the parts of the program communicated with each
+other, etc.  It might also have helped if I didn't have to divine the makeup
+of the stabs on the fly, and then account for micro differences between my
+compiler and gcc.
+
+Anyway, here it is.  Should run on perl v4 or greater.  Maybe less.
+
+
+ --tom
+
+=cut
+
+$RCSID = '$Id: c2ph,v 1.7 95/10/28 10:41:47 tchrist Exp Locker: tchrist $';
+
+use File::Temp;
+
+######################################################################
+
+# some handy data definitions.   many of these can be reset later.
+
+$bitorder = 'b';  # ascending; set to B for descending bit fields
+
+%intrinsics =
+%template = (
+    'char', 			'c',
+    'unsigned char', 		'C',
+    'short',			's',
+    'short int',		's',
+    'unsigned short',		'S',
+    'unsigned short int',	'S',
+    'short unsigned int',	'S',
+    'int',			'i',
+    'unsigned int',		'I',
+    'long',			'l',
+    'long int',			'l',
+    'unsigned long',		'L',
+    'unsigned long',		'L',
+    'long unsigned int',	'L',
+    'unsigned long int',	'L',
+    'long long',		'q',
+    'long long int',		'q',
+    'unsigned long long',	'Q',
+    'unsigned long long int',	'Q',
+    'float',			'f',
+    'double',			'd',
+    'pointer',			'p',
+    'null',			'x',
+    'neganull',			'X',
+    'bit',			$bitorder,
+);
+
+&buildscrunchlist;
+delete $intrinsics{'neganull'};
+delete $intrinsics{'bit'};
+delete $intrinsics{'null'};
+
+# use -s to recompute sizes
+%sizeof = (
+    'char', 			'1',
+    'unsigned char', 		'1',
+    'short',			'2',
+    'short int',		'2',
+    'unsigned short',		'2',
+    'unsigned short int',	'2',
+    'short unsigned int',	'2',
+    'int',			'4',
+    'unsigned int',		'4',
+    'long',			'4',
+    'long int',			'4',
+    'unsigned long',		'4',
+    'unsigned long int',	'4',
+    'long unsigned int',	'4',
+    'long long',		'8',
+    'long long int',		'8',
+    'unsigned long long',	'8',
+    'unsigned long long int',	'8',
+    'float',			'4',
+    'double',			'8',
+    'pointer',			'4',
+);
+
+($type_width, $member_width, $offset_width, $size_width) = (20, 20, 6, 5);
+
+($offset_fmt, $size_fmt) = ('d', 'd');
+
+$indent = 2;
+
+$CC = 'cc';
+$CFLAGS = '-g -S';
+$DEFINES = '';
+
+$perl++ if $0 =~ m#/?c2ph$#;
+
+require 'getopts.pl';
+
+use File::Temp 'tempdir';
+
+eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift;
+
+&Getopts('aixdpvtnws:') || &usage(0);
+
+$opt_d && $debug++;
+$opt_t && $trace++;
+$opt_p && $perl++;
+$opt_v && $verbose++;
+$opt_n && ($perl = 0);
+
+if ($opt_w) {
+    ($type_width, $member_width, $offset_width) = (45, 35, 8);
+}
+if ($opt_x) {
+    ($offset_fmt, $offset_width, $size_fmt, $size_width) = ( 'x', '08', 'x', 04 );
+}
+
+eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift;
+
+sub PLUMBER {
+    select(STDERR);
+    print "oops, apperent pager foulup\n";
+    $isatty++;
+    &usage(1);
+}
+
+sub usage {
+    local($oops) = @_;
+    unless (-t STDOUT) {
+	select(STDERR);
+    } elsif (!$oops) {
+	$isatty++;
+	$| = 1;
+	print "hit <RETURN> for further explanation: ";
+	<STDIN>;
+	open (PIPE, "|". ($ENV{PAGER} || 'more'));
+	$SIG{PIPE} = PLUMBER;
+	select(PIPE);
+    }
+
+    print "usage: $0 [-dpnP] [var=val] [files ...]\n";
+
+    exit unless $isatty;
+
+    print <<EOF;
+
+Options:
+
+-w	wide; short for: type_width=45 member_width=35 offset_width=8
+-x	hex; short for:  offset_fmt=x offset_width=08 size_fmt=x size_width=04
+
+-n  	do not generate perl code  (default when invoked as pstruct)
+-p  	generate perl code         (default when invoked as c2ph)
+-v	generate perl code, with C decls as comments
+
+-i	do NOT recompute sizes for intrinsic datatypes
+-a	dump information on intrinsics also
+
+-t 	trace execution
+-d	spew reams of debugging output
+
+-slist  give comma-separated list a structures to dump
+
+
+Var Name        Default Value    Meaning
+
+EOF
+
+    &defvar('CC', 'which_compiler to call');
+    &defvar('CFLAGS', 'how to generate *.s files with stabs');
+    &defvar('DEFINES','any extra cflags or cpp defines, like -I, -D, -U');
+
+    print "\n";
+
+    &defvar('type_width', 'width of type field   (column 1)');
+    &defvar('member_width', 'width of member field (column 2)');
+    &defvar('offset_width', 'width of offset field (column 3)');
+    &defvar('size_width', 'width of size field   (column 4)');
+
+    print "\n";
+
+    &defvar('offset_fmt', 'sprintf format type for offset');
+    &defvar('size_fmt', 'sprintf format type for size');
+
+    print "\n";
+
+    &defvar('indent', 'how far to indent each nesting level');
+
+   print <<'EOF';
+
+    If any *.[ch] files are given, these will be catted together into
+    a temporary *.c file and sent through:
+	    $CC $CFLAGS $DEFINES
+    and the resulting *.s groped for stab information.  If no files are
+    supplied, then stdin is read directly with the assumption that it
+    contains stab information.  All other lines will be ignored.  At
+    most one *.s file should be supplied.
+
+EOF
+    close PIPE;
+    exit 1;
+}
+
+sub defvar {
+    local($var, $msg) = @_;
+    printf "%-16s%-15s  %s\n", $var, eval "\$$var", $msg;
+}
+
+sub safedir {
+    $SAFEDIR = File::Temp::tempdir("c2ph.XXXXXX", TMPDIR => 1, CLEANUP => 1)
+      unless (defined($SAFEDIR));
+}
+
+undef $SAFEDIR;
+
+$recurse = 1;
+
+if (@ARGV) {
+    if (grep(!/\.[csh]$/,@ARGV)) {
+	warn "Only *.[csh] files expected!\n";
+	&usage;
+    }
+    elsif (grep(/\.s$/,@ARGV)) {
+	if (@ARGV > 1) {
+	    warn "Only one *.s file allowed!\n";
+	    &usage;
+	}
+    }
+    elsif (@ARGV == 1 && $ARGV[0] =~ /\.c$/) {
+	local($dir, $file) = $ARGV[0] =~ m#(.*/)?(.*)$#;
+	$chdir = "cd $dir && " if $dir;
+	&system("$chdir$CC $CFLAGS $DEFINES $file") && exit 1;
+	$ARGV[0] =~ s/\.c$/.s/;
+    }
+    else {
+	&safedir;
+	$TMP = "$SAFEDIR/c2ph.$$.c";
+	&system("cat @ARGV > $TMP") && exit 1;
+	&system("cd $SAFEDIR && $CC $CFLAGS $DEFINES $TMP") && exit 1;
+	unlink $TMP;
+	$TMP =~ s/\.c$/.s/;
+	@ARGV = ($TMP);
+    }
+}
+
+if ($opt_s) {
+    for (split(/[\s,]+/, $opt_s)) {
+	$interested{$_}++;
+    }
+}
+
+
+$| = 1 if $debug;
+
+main: {
+
+    if ($trace) {
+	if (-t && !@ARGV) {
+	    print STDERR "reading from your keyboard: ";
+	} else {
+	    print STDERR "reading from " . (@ARGV ? "@ARGV" : "<STDIN>").": ";
+	}
+    }
+
+STAB: while (<>) {
+	if ($trace && !($. % 10)) {
+	    $lineno = $..'';
+	    print STDERR $lineno, "\b" x length($lineno);
+	}
+	next unless /^\s*\.stabs\s+/;
+	$line = $_;
+	s/^\s*\.stabs\s+//;
+	if (s/\\\\"[d,]+$//) {
+	    $saveline .= $line;
+	    $savebar  = $_;
+	    next STAB;
+	}
+	if ($saveline) {
+	    s/^"//;
+	    $_ = $savebar . $_;
+	    $line = $saveline;
+	}
+	&stab;
+	$savebar = $saveline = undef;
+    }
+    print STDERR "$.\n" if $trace;
+    unlink $TMP if $TMP;
+
+    &compute_intrinsics if $perl && !$opt_i;
+
+    print STDERR "resolving types\n" if $trace;
+
+    &resolve_types;
+    &adjust_start_addrs;
+
+    $sum = 2 + $type_width + $member_width;
+    $pmask1 = "%-${type_width}s %-${member_width}s";
+    $pmask2 = "%-${sum}s %${offset_width}${offset_fmt}%s %${size_width}${size_fmt}%s";
+
+
+
+    if ($perl) {
+	# resolve template -- should be in stab define order, but even this isn't enough.
+	print STDERR "\nbuilding type templates: " if $trace;
+	for $i (reverse 0..$#type) {
+	    next unless defined($name = $type[$i]);
+	    next unless defined $struct{$name};
+	    ($iname = $name) =~ s/\..*//;
+	    $build_recursed = 0;
+	    &build_template($name) unless defined $template{&psou($name)} ||
+					$opt_s && !$interested{$iname};
+	}
+	print STDERR "\n\n" if $trace;
+    }
+
+    print STDERR "dumping structs: " if $trace;
+
+    local($iam);
+
+
+
+    foreach $name (sort keys %struct) {
+	($iname = $name) =~ s/\..*//;
+	next if $opt_s && !$interested{$iname};
+	print STDERR "$name " if $trace;
+
+	undef @sizeof;
+	undef @typedef;
+	undef @offsetof;
+	undef @indices;
+	undef @typeof;
+	undef @fieldnames;
+
+	$mname = &munge($name);
+
+	$fname = &psou($name);
+
+	print "# " if $perl && $verbose;
+	$pcode = '';
+	print "$fname {\n" if !$perl || $verbose;
+	$template{$fname} = &scrunch($template{$fname}) if $perl;
+	&pstruct($name,$name,0);
+	print "# " if $perl && $verbose;
+	print "}\n" if !$perl || $verbose;
+	print "\n" if $perl && $verbose;
+
+	if ($perl) {
+	    print "$pcode";
+
+	    printf("\nsub %-32s { %4d; }\n\n", "${mname}'struct", $countof{$name});
+
+	    print <<EOF;
+sub ${mname}'typedef {
+    local(\$${mname}'index) = shift;
+    defined \$${mname}'index
+	? \$${mname}'typedef[\$${mname}'index]
+	: \$${mname}'typedef;
+}
+EOF
+
+	    print <<EOF;
+sub ${mname}'sizeof {
+    local(\$${mname}'index) = shift;
+    defined \$${mname}'index
+	? \$${mname}'sizeof[\$${mname}'index]
+	: \$${mname}'sizeof;
+}
+EOF
+
+	    print <<EOF;
+sub ${mname}'offsetof {
+    local(\$${mname}'index) = shift;
+    defined \$${mname}index
+	? \$${mname}'offsetof[\$${mname}'index]
+	: \$${mname}'sizeof;
+}
+EOF
+
+	    print <<EOF;
+sub ${mname}'typeof {
+    local(\$${mname}'index) = shift;
+    defined \$${mname}index
+	? \$${mname}'typeof[\$${mname}'index]
+	: '$name';
+}
+EOF
+
+	    print <<EOF;
+sub ${mname}'fieldnames {
+    \@${mname}'fieldnames;
+}
+EOF
+
+	$iam = ($isastruct{$name} && 's') || ($isaunion{$name} && 'u');
+
+	    print <<EOF;
+sub ${mname}'isastruct {
+    '$iam';
+}
+EOF
+
+	    print "\$${mname}'typedef = '" . &scrunch($template{$fname})
+		. "';\n";
+
+	    print "\$${mname}'sizeof = $sizeof{$name};\n\n";
+
+
+	    print "\@${mname}'indices = (", &squishseq(@indices), ");\n";
+
+	    print "\n";
+
+	    print "\@${mname}'typedef[\@${mname}'indices] = (",
+			join("\n\t", '', @typedef), "\n    );\n\n";
+	    print "\@${mname}'sizeof[\@${mname}'indices] = (",
+			join("\n\t", '', @sizeof), "\n    );\n\n";
+	    print "\@${mname}'offsetof[\@${mname}'indices] = (",
+			join("\n\t", '', @offsetof), "\n    );\n\n";
+	    print "\@${mname}'typeof[\@${mname}'indices] = (",
+			join("\n\t", '', @typeof), "\n    );\n\n";
+	    print "\@${mname}'fieldnames[\@${mname}'indices] = (",
+			join("\n\t", '', @fieldnames), "\n    );\n\n";
+
+	    $template_printed{$fname}++;
+	    $size_printed{$fname}++;
+	}
+	print "\n";
+    }
+
+    print STDERR "\n" if $trace;
+
+    unless ($perl && $opt_a) {
+	print "\n1;\n" if $perl;
+	exit;
+    }
+
+
+
+    foreach $name (sort bysizevalue keys %intrinsics) {
+	next if $size_printed{$name};
+	print '$',&munge($name),"'sizeof = ", $sizeof{$name}, ";\n";
+    }
+
+    print "\n";
+
+    sub bysizevalue { $sizeof{$a} <=> $sizeof{$b}; }
+
+
+    foreach $name (sort keys %intrinsics) {
+	print '$',&munge($name),"'typedef = '", $template{$name}, "';\n";
+    }
+
+    print "\n1;\n" if $perl;
+
+    exit;
+}
+
+########################################################################################
+
+
+sub stab {
+    next unless $continued || /:[\$\w]+(\(\d+,\d+\))?=[\*\$\w]+/;  # (\d+,\d+) is for sun
+    s/"// 						|| next;
+    s/",([x\d]+),([x\d]+),([x\d]+),.*// 		|| next;
+
+    next if /^\s*$/;
+
+    $size = $3 if $3;
+    $_ = $continued . $_ if length($continued);
+    if (s/\\\\$//) {
+      # if last 2 chars of string are '\\' then stab is continued
+      # in next stab entry
+      chop;
+      $continued = $_;
+      next;
+    }
+    $continued = '';
+
+
+    $line = $_;
+
+    if (($name, $pdecl) = /^([\$ \w]+):[tT]((\d+)(=[rufs*](\d+))+)$/) {
+	print "$name is a typedef for some funky pointers: $pdecl\n" if $debug;
+	&pdecl($pdecl);
+	next;
+    }
+
+
+
+    if (/(([ \w]+):t(\d+|\(\d+,\d+\)))=r?(\d+|\(\d+,\d+\))(;\d+;\d+;)?/) {
+	local($ident) = $2;
+	push(@intrinsics, $ident);
+	$typeno = &typeno($3);
+	$type[$typeno] = $ident;
+	print STDERR "intrinsic $ident in new type $typeno\n" if $debug;
+	next;
+    }
+
+    if (($name, $typeordef, $typeno, $extra, $struct, $_)
+	= /^([\$ \w]+):([ustT])(\d+|\(\d+,\d+\))(=[rufs*](\d+))?(.*)$/)
+    {
+	$typeno = &typeno($typeno);  # sun foolery
+    }
+    elsif (/^[\$\w]+:/) {
+	next; # variable
+    }
+    else {
+	warn "can't grok stab: <$_> in: $line " if $_;
+	next;
+    }
+
+    #warn "got size $size for $name\n";
+    $sizeof{$name} = $size if $size;
+
+    s/;[-\d]*;[-\d]*;$//;  # we don't care about ranges
+
+    $typenos{$name} = $typeno;
+
+    unless (defined $type[$typeno]) {
+	&panic("type 0??") unless $typeno;
+	$type[$typeno] = $name unless defined $type[$typeno];
+	printf "new type $typeno is $name" if $debug;
+	if ($extra =~ /\*/ && defined $type[$struct]) {
+	    print ", a typedef for a pointer to " , $type[$struct] if $debug;
+	}
+    } else {
+	printf "%s is type %d", $name, $typeno if $debug;
+	print ", a typedef for " , $type[$typeno] if $debug;
+    }
+    print "\n" if $debug;
+    #next unless $extra =~ /[su*]/;
+
+    #$type[$struct] = $name;
+
+    if ($extra =~ /[us*]/) {
+	&sou($name, $extra);
+	$_ = &sdecl($name, $_, 0);
+    }
+    elsif (/^=ar/) {
+	print "it's a bare array typedef -- that's pretty sick\n" if $debug;
+	$_ = "$typeno$_";
+	$scripts = '';
+	$_ = &adecl($_,1);
+
+    }
+    elsif (s/((\w+):t(\d+|\(\d+,\d+\)))?=r?(;\d+;\d+;)?//) {  # the ?'s are for gcc
+	push(@intrinsics, $2);
+	$typeno = &typeno($3);
+	$type[$typeno] = $2;
+	print STDERR "intrinsic $2 in new type $typeno\n" if $debug;
+    }
+    elsif (s/^=e//) { # blessed be thy compiler; mine won't do this
+	&edecl;
+    }
+    else {
+	warn "Funny remainder for $name on line $_ left in $line " if $_;
+    }
+}
+
+sub typeno {  # sun thinks types are (0,27) instead of just 27
+    local($_) = @_;
+    s/\(\d+,(\d+)\)/$1/;
+    $_;
+}
+
+sub pstruct {
+    local($what,$prefix,$base) = @_;
+    local($field, $fieldname, $typeno, $count, $offset, $entry);
+    local($fieldtype);
+    local($type, $tname);
+    local($mytype, $mycount, $entry2);
+    local($struct_count) = 0;
+    local($pad, $revpad, $length, $prepad, $lastoffset, $lastlength, $fmt);
+    local($bits,$bytes);
+    local($template);
+
+
+    local($mname) = &munge($name);
+
+    sub munge {
+	local($_) = @_;
+	s/[\s\$\.]/_/g;
+	$_;
+    }
+
+    local($sname) = &psou($what);
+
+    $nesting++;
+
+    for $field (split(/;/, $struct{$what})) {
+	$pad = $prepad = 0;
+	$entry = '';
+	($fieldname, $typeno, $count, $offset, $length) = split(/,/, $field);
+
+	$type = $type[$typeno];
+
+	$type =~ /([^[]*)(\[.*\])?/;
+	$mytype = $1;
+	$count .= $2;
+	$fieldtype = &psou($mytype);
+
+	local($fname) = &psou($name);
+
+	if ($build_templates) {
+
+	    $pad = ($offset - ($lastoffset + $lastlength))/8
+		if defined $lastoffset;
+
+	    if (! $finished_template{$sname}) {
+		if ($isaunion{$what}) {
+		    $template{$sname} .= 'X' x $revpad . ' '    if $revpad;
+		} else {
+		    $template{$sname} .= 'x' x $pad    . ' '    if $pad;
+		}
+	    }
+
+	    $template = &fetch_template($type);
+	    &repeat_template($template,$count);
+
+	    if (! $finished_template{$sname}) {
+		$template{$sname} .= $template;
+	    }
+
+	    $revpad = $length/8 if $isaunion{$what};
+
+	    ($lastoffset, $lastlength) = ($offset, $length);
+
+	} else {
+	    print '# ' if $perl && $verbose;
+	    $entry = sprintf($pmask1,
+			' ' x ($nesting * $indent) . $fieldtype,
+			"$prefix.$fieldname" . $count);
+
+	    $entry =~ s/(\*+)( )/$2$1/;
+
+	    printf $pmask2,
+		    $entry,
+		    ($base+$offset)/8,
+		    ($bits = ($base+$offset)%8) ? ".$bits" : "  ",
+		    $length/8,
+		    ($bits = $length % 8) ? ".$bits": ""
+			if !$perl || $verbose;
+
+	    if ($perl) {
+		$template = &fetch_template($type);
+		&repeat_template($template,$count);
+	    }
+
+	    if ($perl && $nesting == 1) {
+
+		push(@sizeof, int($length/8) .",\t# $fieldname");
+		push(@offsetof, int($offset/8) .",\t# $fieldname");
+		local($little) = &scrunch($template);
+		push(@typedef, "'$little', \t# $fieldname");
+		$type =~ s/(struct|union) //;
+		push(@typeof, "'$mytype" . ($count ? $count : '') .
+		    "',\t# $fieldname");
+		push(@fieldnames, "'$fieldname',");
+	    }
+
+	    print '  ', ' ' x $indent x $nesting, $template
+				if $perl && $verbose;
+
+	    print "\n" if !$perl || $verbose;
+
+	}
+	if ($perl) {
+	    local($mycount) = defined $struct{$mytype} ? $countof{$mytype} : 1;
+	    $mycount *= &scripts2count($count) if $count;
+	    if ($nesting==1 && !$build_templates) {
+		$pcode .= sprintf("sub %-32s { %4d; }\n",
+			"${mname}'${fieldname}", $struct_count);
+		push(@indices, $struct_count);
+	    }
+	    $struct_count += $mycount;
+	}
+
+
+	&pstruct($type, "$prefix.$fieldname", $base+$offset)
+		if $recurse && defined $struct{$type};
+    }
+
+    $countof{$what} = $struct_count unless defined $countof{$whati};
+
+    $template{$sname} .= '$' if $build_templates;
+    $finished_template{$sname}++;
+
+    if ($build_templates && !defined $sizeof{$name}) {
+	local($fmt) = &scrunch($template{$sname});
+	print STDERR "no size for $name, punting with $fmt..." if $debug;
+	eval '$sizeof{$name} = length(pack($fmt, ()))';
+	if ($@) {
+	    chop $@;
+	    warn "couldn't get size for \$name: $@";
+	} else {
+	    print STDERR $sizeof{$name}, "\n" if $debUg;
+	}
+    }
+
+    --$nesting;
+}
+
+
+sub psize {
+    local($me) = @_;
+    local($amstruct) = $struct{$me} ?  'struct ' : '';
+
+    print '$sizeof{\'', $amstruct, $me, '\'} = ';
+    printf "%d;\n", $sizeof{$me};
+}
+
+sub pdecl {
+    local($pdecl) = @_;
+    local(@pdecls);
+    local($tname);
+
+    warn "pdecl: $pdecl\n" if $debug;
+
+    $pdecl =~ s/\(\d+,(\d+)\)/$1/g;
+    $pdecl =~ s/\*//g;
+    @pdecls = split(/=/, $pdecl);
+    $typeno = $pdecls[0];
+    $tname = pop @pdecls;
+
+    if ($tname =~ s/^f//) { $tname = "$tname&"; }
+    #else { $tname = "$tname*"; }
+
+    for (reverse @pdecls) {
+	$tname  .= s/^f// ? "&" : "*";
+	#$tname =~ s/^f(.*)/$1&/;
+	print "type[$_] is $tname\n" if $debug;
+	$type[$_] = $tname unless defined $type[$_];
+    }
+}
+
+
+
+sub adecl {
+    ($arraytype, $unknown, $lower, $upper) = ();
+    #local($typeno);
+    # global $typeno, @type
+    local($_, $typedef) = @_;
+
+    while (s/^((\d+|\(\d+,\d+\))=)?ar(\d+|\(\d+,\d+\));//) {
+	($arraytype, $unknown) = ($2, $3);
+	$arraytype = &typeno($arraytype);
+	$unknown = &typeno($unknown);
+	if (s/^(\d+);(\d+);//) {
+	    ($lower, $upper) = ($1, $2);
+	    $scripts .= '[' .  ($upper+1) . ']';
+	} else {
+	    warn "can't find array bounds: $_";
+	}
+    }
+    if (s/^([(,)\d*f=]*),(\d+),(\d+);//) {
+	($start, $length) = ($2, $3);
+	$whatis = $1;
+	if ($whatis =~ /^(\d+|\(\d+,\d+\))=/) {
+	    $typeno = &typeno($1);
+	    &pdecl($whatis);
+	} else {
+	    $typeno = &typeno($whatis);
+	}
+    } elsif (s/^(\d+)(=[*suf]\d*)//) {
+	local($whatis) = $2;
+
+	if ($whatis =~ /[f*]/) {
+	    &pdecl($whatis);
+	} elsif ($whatis =~ /[su]/) {  #
+	    print "$prefix.$fieldname is an array$scripts anon structs; disgusting\n"
+		if $debug;
+	    #$type[$typeno] = $name unless defined $type[$typeno];
+	    ##printf "new type $typeno is $name" if $debug;
+	    $typeno = $1;
+	    $type[$typeno] = "$prefix.$fieldname";
+	    local($name) = $type[$typeno];
+	    &sou($name, $whatis);
+	    $_ = &sdecl($name, $_, $start+$offset);
+	    1;
+	    $start = $start{$name};
+	    $offset = $sizeof{$name};
+	    $length = $offset;
+	} else {
+	    warn "what's this? $whatis in $line ";
+	}
+    } elsif (/^\d+$/) {
+	$typeno = $_;
+    } else {
+	warn "bad array stab: $_ in $line ";
+	next STAB;
+    }
+    #local($wasdef) = defined($type[$typeno]) && $debug;
+    #if ($typedef) {
+	#print "redefining $type[$typeno] to " if $wasdef;
+	#$type[$typeno] = "$whatis$scripts"; # unless defined $type[$typeno];
+	#print "$type[$typeno]\n" if $wasdef;
+    #} else {
+	#$type[$arraytype] = $type[$typeno] unless defined $type[$arraytype];
+    #}
+    $type[$arraytype] = "$type[$typeno]$scripts" if defined $type[$typeno];
+    print "type[$arraytype] is $type[$arraytype]\n" if $debug;
+    print "$prefix.$fieldname is an array of $type[$arraytype]\n" if $debug;
+    $_;
+}
+
+
+
+sub sdecl {
+    local($prefix, $_, $offset) = @_;
+
+    local($fieldname, $scripts, $type, $arraytype, $unknown,
+    $whatis, $pdecl, $upper,$lower, $start,$length) = ();
+    local($typeno,$sou);
+
+
+SFIELD:
+    while (/^([^;]+);/) {
+	$scripts = '';
+	warn "sdecl $_\n" if $debug;
+	if (s/^([\$\w]+)://) {
+	    $fieldname = $1;
+	} elsif (s/(\d+)=([us])(\d+|\(\d+,\d+\))//) { #
+	    $typeno = &typeno($1);
+	    $type[$typeno] = "$prefix.$fieldname";
+	    local($name) = "$prefix.$fieldname";
+	    &sou($name,$2);
+	    $_ = &sdecl("$prefix.$fieldname", $_, $start+$offset);
+	    $start = $start{$name};
+	    $offset += $sizeof{$name};
+	    #print "done with anon, start is $start, offset is $offset\n";
+	    #next SFIELD;
+	} else  {
+	    warn "weird field $_ of $line" if $debug;
+	    next STAB;
+	    #$fieldname = &gensym;
+	    #$_ = &sdecl("$prefix.$fieldname", $_, $start+$offset);
+	}
+
+	if (/^(\d+|\(\d+,\d+\))=ar/) {
+	    $_ = &adecl($_);
+	}
+	elsif (s/^(\d+|\(\d+,\d+\))?,(\d+),(\d+);//) {
+          ($start, $length) =  ($2, $3);
+          &panic("no length?") unless $length;
+          $typeno = &typeno($1) if $1;
+        }
+        elsif (s/^(\d+)=xs\w+:,(\d+),(\d+);//) {
+	    ($start, $length) =  ($2, $3);
+	    &panic("no length?") unless $length;
+	    $typeno = &typeno($1) if $1;
+	}
+	elsif (s/^((\d+|\(\d+,\d+\))(=[*f](\d+|\(\d+,\d+\)))+),(\d+),(\d+);//) {
+	    ($pdecl, $start, $length) =  ($1,$5,$6);
+	    &pdecl($pdecl);
+	}
+	elsif (s/(\d+)=([us])(\d+|\(\d+,\d+\))//) { # the dratted anon struct
+	    ($typeno, $sou) = ($1, $2);
+	    $typeno = &typeno($typeno);
+	    if (defined($type[$typeno])) {
+		warn "now how did we get type $1 in $fieldname of $line?";
+	    } else {
+		print "anon type $typeno is $prefix.$fieldname\n" if $debug;
+		$type[$typeno] = "$prefix.$fieldname" unless defined $type[$typeno];
+	    };
+	    local($name) = "$prefix.$fieldname";
+	    &sou($name,$sou);
+	    print "anon ".($isastruct{$name}) ? "struct":"union"." for $prefix.$fieldname\n" if $debug;
+	    $type[$typeno] = "$prefix.$fieldname";
+	    $_ = &sdecl("$prefix.$fieldname", $_, $start+$offset);
+	    $start = $start{$name};
+	    $length = $sizeof{$name};
+	}
+	else {
+	    warn "can't grok stab for $name ($_) in line $line ";
+	    next STAB;
+	}
+
+	&panic("no length for $prefix.$fieldname") unless $length;
+	$struct{$name} .= join(',', $fieldname, $typeno, $scripts, $start, $length) . ';';
+    }
+    if (s/;\d*,(\d+),(\d+);//) {
+	local($start, $size) = ($1, $2);
+	$sizeof{$prefix} = $size;
+	print "start of $prefix is $start, size of $sizeof{$prefix}\n" if $debug;
+	$start{$prefix} = $start;
+    }
+    $_;
+}
+
+sub edecl {
+    s/;$//;
+    $enum{$name} = $_;
+    $_ = '';
+}
+
+sub resolve_types {
+    local($sou);
+    for $i (0 .. $#type) {
+	next unless defined $type[$i];
+	$_ = $type[$i];
+	unless (/\d/) {
+	    print "type[$i] $type[$i]\n" if $debug;
+	    next;
+	}
+	print "type[$i] $_ ==> " if $debug;
+	s/^(\d+)(\**)\&\*(\**)/"$2($3".&type($1) . ')()'/e;
+	s/^(\d+)\&/&type($1)/e;
+	s/^(\d+)/&type($1)/e;
+	s/(\*+)([^*]+)(\*+)/$1$3$2/;
+	s/\((\*+)(\w+)(\*+)\)/$3($1$2)/;
+	s/^(\d+)([\*\[].*)/&type($1).$2/e;
+	#s/(\d+)(\*|(\[[\[\]\d\*]+]\])+)/&type($1).$2/ge;
+	$type[$i] = $_;
+	print "$_\n" if $debug;
+    }
+}
+sub type { &psou($type[$_[0]] || "<UNDEFINED>"); }
+
+sub adjust_start_addrs {
+    for (sort keys %start) {
+	($basename = $_) =~ s/\.[^.]+$//;
+	$start{$_} += $start{$basename};
+	print "start: $_ @ $start{$_}\n" if $debug;
+    }
+}
+
+sub sou {
+    local($what, $_) = @_;
+    /u/ && $isaunion{$what}++;
+    /s/ && $isastruct{$what}++;
+}
+
+sub psou {
+    local($what) = @_;
+    local($prefix) = '';
+    if ($isaunion{$what})  {
+	$prefix = 'union ';
+    } elsif ($isastruct{$what})  {
+	$prefix = 'struct ';
+    }
+    $prefix . $what;
+}
+
+sub scrunch {
+    local($_) = @_;
+
+    return '' if $_ eq '';
+
+    study;
+
+    s/\$//g;
+    s/  / /g;
+    1 while s/(\w) \1/$1$1/g;
+
+    # i wanna say this, but perl resists my efforts:
+    #	   s/(\w)(\1+)/$2 . length($1)/ge;
+
+    &quick_scrunch;
+
+    s/ $//;
+
+    $_;
+}
+
+sub buildscrunchlist {
+    $scrunch_code = "sub quick_scrunch {\n";
+    for (values %intrinsics) {
+        $scrunch_code .= "\ts/(${_}{2,})/'$_' . length(\$1)/ge;\n";
+    }
+    $scrunch_code .= "}\n";
+    print "$scrunch_code" if $debug;
+    eval $scrunch_code;
+    &panic("can't eval scrunch_code $@ \nscrunch_code") if $@;
+}
+
+sub fetch_template {
+    local($mytype) = @_;
+    local($fmt);
+    local($count) = 1;
+
+    &panic("why do you care?") unless $perl;
+
+    if ($mytype =~ s/(\[\d+\])+$//) {
+	$count .= $1;
+    }
+
+    if ($mytype =~ /\*/) {
+	$fmt = $template{'pointer'};
+    }
+    elsif (defined $template{$mytype}) {
+	$fmt = $template{$mytype};
+    }
+    elsif (defined $struct{$mytype}) {
+	if (!defined $template{&psou($mytype)}) {
+	    &build_template($mytype) unless $mytype eq $name;
+	}
+	elsif ($template{&psou($mytype)} !~ /\$$/) {
+	    #warn "incomplete template for $mytype\n";
+	}
+	$fmt = $template{&psou($mytype)} || '?';
+    }
+    else {
+	warn "unknown fmt for $mytype\n";
+	$fmt = '?';
+    }
+
+    $fmt x $count . ' ';
+}
+
+sub compute_intrinsics {
+    &safedir;
+    local($TMP) = "$SAFEDIR/c2ph-i.$$.c";
+    open (TMP, ">$TMP") || die "can't open $TMP: $!";
+    select(TMP);
+
+    print STDERR "computing intrinsic sizes: " if $trace;
+
+    undef %intrinsics;
+
+    print <<'EOF';
+main() {
+    char *mask = "%d %s\n";
+EOF
+
+    for $type (@intrinsics) {
+	next if !$type || $type eq 'void' || $type =~ /complex/; # sun stuff
+	print <<"EOF";
+    printf(mask,sizeof($type), "$type");
+EOF
+    }
+
+    print <<'EOF';
+    printf(mask,sizeof(char *), "pointer");
+    exit(0);
+}
+EOF
+    close TMP;
+
+    select(STDOUT);
+    open(PIPE, "cd $SAFEDIR && $CC $TMP && $SAFEDIR/a.out|");
+    while (<PIPE>) {
+	chop;
+	split(' ',$_,2);;
+	print "intrinsic $_[1] is size $_[0]\n" if $debug;
+	$sizeof{$_[1]} = $_[0];
+	$intrinsics{$_[1]} = $template{$_[0]};
+    }
+    close(PIPE) || die "couldn't read intrinsics!";
+    unlink($TMP, '$SAFEDIR/a.out');
+    print STDERR "done\n" if $trace;
+}
+
+sub scripts2count {
+    local($_) = @_;
+
+    s/^\[//;
+    s/\]$//;
+    s/\]\[/*/g;
+    $_ = eval;
+    &panic("$_: $@") if $@;
+    $_;
+}
+
+sub system {
+    print STDERR "@_\n" if $trace;
+    system @_;
+}
+
+sub build_template {
+    local($name) = @_;
+
+    &panic("already got a template for $name") if defined $template{$name};
+
+    local($build_templates) = 1;
+
+    local($lparen) = '(' x $build_recursed;
+    local($rparen) = ')' x $build_recursed;
+
+    print STDERR "$lparen$name$rparen " if $trace;
+    $build_recursed++;
+    &pstruct($name,$name,0);
+    print STDERR "TEMPLATE for $name is ", $template{&psou($name)}, "\n" if $debug;
+    --$build_recursed;
+}
+
+
+sub panic {
+
+    select(STDERR);
+
+    print "\npanic: @_\n";
+
+    exit 1 if $] <= 4.003;  # caller broken
+
+    local($i,$_);
+    local($p,$f,$l,$s,$h,$a,@a,@sub);
+    for ($i = 0; ($p,$f,$l,$s,$h,$w) = caller($i); $i++) {
+	@a = @DB'args;
+	for (@a) {
+	    if (/^StB\000/ && length($_) == length($_main{'_main'})) {
+		$_ = sprintf("%s",$_);
+	    }
+	    else {
+		s/'/\\'/g;
+		s/([^\0]*)/'$1'/ unless /^-?[\d.]+$/;
+		s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
+		s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
+	    }
+	}
+	$w = $w ? '@ = ' : '$ = ';
+	$a = $h ? '(' . join(', ', @a) . ')' : '';
+	push(@sub, "$w&$s$a from file $f line $l\n");
+	last if $signal;
+    }
+    for ($i=0; $i <= $#sub; $i++) {
+	last if $signal;
+	print $sub[$i];
+    }
+    exit 1;
+}
+
+sub squishseq {
+    local($num);
+    local($last) = -1e8;
+    local($string);
+    local($seq) = '..';
+
+    while (defined($num = shift)) {
+        if ($num == ($last + 1)) {
+            $string .= $seq unless $inseq++;
+            $last = $num;
+            next;
+        } elsif ($inseq) {
+            $string .= $last unless $last == -1e8;
+        }
+
+        $string .= ',' if defined $string;
+        $string .= $num;
+        $last = $num;
+        $inseq = 0;
+    }
+    $string .= $last if $inseq && $last != -e18;
+    $string;
+}
+
+sub repeat_template {
+    #  local($template, $scripts) = @_;  have to change caller's values
+
+    if ( $_[1] ) {
+	local($ncount) = &scripts2count($_[1]);
+	if ($_[0] =~ /^\s*c\s*$/i) {
+	    $_[0] = "A$ncount ";
+	    $_[1] = '';
+	} else {
+	    $_[0] = $template x $ncount;
+	}
+    }
+}
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/runperl.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/runperl.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/runperl.bat	(revision 14489)
@@ -0,0 +1,83 @@
+@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
Index: /for-distributions/trunk/bin/windows/perl/bin/s2p.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/s2p.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/s2p.bat	(revision 14489)
@@ -0,0 +1,2011 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+my $startperl;
+my $perlpath;
+($startperl = <<'/../') =~ s/\s*\z//;
+#!perl
+/../
+($perlpath = <<'/../') =~ s/\s*\z//;
+c:\shaoqunWu\perl\bin\perl.exe
+/../
+
+$0 =~ s/^.*?(\w+)[\.\w]*$/$1/;
+
+# (p)sed - a stream editor
+# History:  Aug 12 2000: Original version.
+#           Mar 25 2002: Rearrange generated Perl program.
+
+use strict;
+use integer;
+use Symbol;
+
+=head1 NAME
+
+psed - a stream editor
+
+=head1 SYNOPSIS
+
+   psed [-an] script [file ...]
+   psed [-an] [-e script] [-f script-file] [file ...]
+
+   s2p  [-an] [-e script] [-f script-file]
+
+=head1 DESCRIPTION
+
+A stream editor reads the input stream consisting of the specified files
+(or standard input, if none are given), processes is line by line by
+applying a script consisting of edit commands, and writes resulting lines
+to standard output. The filename `C<->' may be used to read standard input.
+
+The edit script is composed from arguments of B<-e> options and
+script-files, in the given order. A single script argument may be specified
+as the first parameter.
+
+If this program is invoked with the name F<s2p>, it will act as a
+sed-to-Perl translator. See L<"sed Script Translation">.
+
+B<sed> returns an exit code of 0 on success or >0 if an error occurred.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-a>
+
+A file specified as argument to the B<w> edit command is by default
+opened before input processing starts. Using B<-a>, opening of such
+files is delayed until the first line is actually written to the file.
+
+=item B<-e> I<script>
+
+The editing commands defined by I<script> are appended to the script.
+Multiple commands must be separated by newlines.
+
+=item B<-f> I<script-file>
+
+Editing commands from the specified I<script-file> are read and appended
+to the script.
+
+=item B<-n>
+
+By default, a line is written to standard output after the editing script
+has been applied to it. The B<-n> option suppresses automatic printing.
+
+=back
+
+=head1 COMMANDS
+
+B<sed> command syntax is defined as
+
+Z<> Z<> Z<> Z<>[I<address>[B<,>I<address>]][B<!>]I<function>[I<argument>]
+
+with whitespace being permitted before or after addresses, and between
+the function character and the argument. The I<address>es and the
+address inverter (C<!>) are used to restrict the application of a
+command to the selected line(s) of input.
+
+Each command must be on a line of its own, except where noted in
+the synopses below.
+
+The edit cycle performed on each input line consist of reading the line
+(without its trailing newline character) into the I<pattern space>,
+applying the applicable commands of the edit script, writing the final
+contents of the pattern space and a newline to the standard output.
+A I<hold space> is provided for saving the contents of the
+pattern space for later use.
+
+=head2 Addresses
+
+A sed address is either a line number or a pattern, which may be combined
+arbitrarily to construct ranges. Lines are numbered across all input files.
+
+Any address may be followed by an exclamation mark (`C<!>'), selecting
+all lines not matching that address.
+
+=over 4
+
+=item I<number>
+
+The line with the given number is selected.
+
+=item B<$>
+
+A dollar sign (C<$>) is the line number of the last line of the input stream.
+
+=item B</>I<regular expression>B</>
+
+A pattern address is a basic regular expression (see 
+L<"Basic Regular Expressions">), between the delimiting character C</>.
+Any other character except C<\> or newline may be used to delimit a
+pattern address when the initial delimiter is prefixed with a
+backslash (`C<\>').
+
+=back
+
+If no address is given, the command selects every line.
+
+If one address is given, it selects the line (or lines) matching the
+address.
+
+Two addresses select a range that begins whenever the first address
+matches, and ends (including that line) when the second address matches.
+If the first (second) address is a matching pattern, the second 
+address is not applied to the very same line to determine the end of
+the range. Likewise, if the second address is a matching pattern, the
+first address is not applied to the very same line to determine the
+begin of another range. If both addresses are line numbers,
+and the second line number is less than the first line number, then
+only the first line is selected.
+
+
+=head2 Functions
+
+The maximum permitted number of addresses is indicated with each
+function synopsis below.
+
+The argument I<text> consists of one or more lines following the command.
+Embedded newlines in I<text> must be preceded with a backslash.  Other
+backslashes in I<text> are deleted and the following character is taken
+literally.
+
+=over 4
+
+=cut
+
+my %ComTab;
+my %GenKey;
+#--------------------------------------------------------------------------
+$ComTab{'a'}=[ 1, 'txt', \&Emit,       '{ push( @Q, <<'."'TheEnd' ) }\n" ]; #ok
+
+=item [1addr]B<a\> I<text>
+
+Write I<text> (which must start on the line following the command)
+to standard output immediately before reading the next line
+of input, either by executing the B<N> function or by beginning a new cycle.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'b'}=[ 2, 'str', \&Branch,     '{ goto XXX; }'                   ]; #ok
+
+=item [2addr]B<b> [I<label>]
+
+Branch to the B<:> function with the specified I<label>. If no label
+is given, branch to the end of the script.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'c'}=[ 2, 'txt', \&Change,     <<'-X-'                           ]; #ok
+{ print <<'TheEnd'; } $doPrint = 0; goto EOS;
+-X-
+### continue OK => next CYCLE;
+
+=item [2addr]B<c\> I<text>
+
+The line, or range of lines, selected by the address is deleted. 
+The I<text> (which must start on the line following the command)
+is written to standard output. With an address range, this occurs at
+the end of the range.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'d'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ $doPrint = 0;
+  goto EOS;
+}
+-X-
+### continue OK => next CYCLE;
+
+=item [2addr]B<d>
+
+Deletes the pattern space and starts the next cycle.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'D'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ s/^.*\n?//;
+  if(length($_)){ goto BOS } else { goto EOS }
+}
+-X-
+### continue OK => next CYCLE;
+
+=item [2addr]B<D>
+
+Deletes the pattern space through the first embedded newline or to the end.
+If the pattern space becomes empty, a new cycle is started, otherwise
+execution of the script is restarted.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'g'}=[ 2, '',    \&Emit,       '{ $_ = $Hold };'                 ]; #ok
+
+=item [2addr]B<g>
+
+Replace the contents of the pattern space with the hold space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'G'}=[ 2, '',    \&Emit,       '{ $_ .= "\n"; $_ .= $Hold };'    ]; #ok
+
+=item [2addr]B<G>
+
+Append a newline and the contents of the hold space to the pattern space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'h'}=[ 2, '',    \&Emit,       '{ $Hold = $_ }'                  ]; #ok
+
+=item [2addr]B<h>
+
+Replace the contents of the hold space with the pattern space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'H'}=[ 2, '',    \&Emit,       '{ $Hold .= "\n"; $Hold .= $_; }' ]; #ok
+
+=item [2addr]B<H>
+
+Append a newline and the contents of the pattern space to the hold space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'i'}=[ 1, 'txt', \&Emit,       '{ print <<'."'TheEnd' }\n"       ]; #ok
+
+=item [1addr]B<i\> I<text>
+
+Write the I<text> (which must start on the line following the command)
+to standard output.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'l'}=[ 2, '',    \&Emit,       '{ _l() }'                        ]; #okUTF8
+
+=item [2addr]B<l>
+
+Print the contents of the pattern space: non-printable characters are
+shown in C-style escaped form; long lines are split and have a trailing
+`C<\>' at the point of the split; the true end of a line is marked with
+a `C<$>'. Escapes are: `\a', `\t', `\n', `\f', `\r', `\e' for
+BEL, HT, LF, FF, CR, ESC, respectively, and `\' followed by a three-digit
+octal number for all other non-printable characters.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'n'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ print $_, "\n" if $doPrint;
+  printQ() if @Q;
+  $CondReg = 0;
+  last CYCLE unless getsARGV();
+  chomp();
+}
+-X-
+
+=item [2addr]B<n>
+
+If automatic printing is enabled, write the pattern space to the standard
+output. Replace the pattern space with the next line of input. If
+there is no more input, processing is terminated.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'N'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ printQ() if @Q;
+  $CondReg = 0;
+  last CYCLE unless getsARGV( $h );
+  chomp( $h );
+  $_ .= "\n$h";
+}
+-X-
+
+=item [2addr]B<N>
+
+Append a newline and the next line of input to the pattern space. If
+there is no more input, processing is terminated.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'p'}=[ 2, '',    \&Emit,       '{ print $_, "\n"; }'             ]; #ok
+
+=item [2addr]B<p>
+
+Print the pattern space to the standard output. (Use the B<-n> option
+to suppress automatic printing at the end of a cycle if you want to
+avoid double printing of lines.)
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'P'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ if( /^(.*)/ ){ print $1, "\n"; } }
+-X-
+
+=item [2addr]B<P>
+
+Prints the pattern space through the first embedded newline or to the end.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'q'}=[ 1, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ print $_, "\n" if $doPrint;
+  last CYCLE;
+}
+-X-
+
+=item [1addr]B<q>
+
+Branch to the end of the script and quit without starting a new cycle.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'r'}=[ 1, 'str', \&Emit,       "{ _r( '-X-' ) }"                 ]; #ok
+
+=item [1addr]B<r> I<file>
+
+Copy the contents of the I<file> to standard output immediately before
+the next attempt to read a line of input. Any error encountered while
+reading I<file> is silently ignored.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'s'}=[ 2, 'sub', \&Emit,       ''                                ]; #ok
+
+=item [2addr]B<s/>I<regular expression>B</>I<replacement>B</>I<flags>
+
+Substitute the I<replacement> string for the first substring in
+the pattern space that matches the I<regular expression>.
+Any character other than backslash or newline can be used instead of a 
+slash to delimit the regular expression and the replacement.
+To use the delimiter as a literal character within the regular expression
+and the replacement, precede the character by a backslash (`C<\>').
+
+Literal newlines may be embedded in the replacement string by
+preceding a newline with a backslash.
+
+Within the replacement, an ampersand (`C<&>') is replaced by the string
+matching the regular expression. The strings `C<\1>' through `C<\9>' are
+replaced by the corresponding subpattern (see L<"Basic Regular Expressions">).
+To get a literal `C<&>' or `C<\>' in the replacement text, precede it
+by a backslash.
+
+The following I<flags> modify the behaviour of the B<s> command:
+
+=over 8
+
+=item B<g>
+
+The replacement is performed for all matching, non-overlapping substrings
+of the pattern space.
+
+=item B<1>..B<9>
+
+Replace only the n-th matching substring of the pattern space.
+
+=item B<p>
+
+If the substitution was made, print the new value of the pattern space.
+
+=item B<w> I<file>
+
+If the substitution was made, write the new value of the pattern space
+to the specified file.
+
+=back
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'t'}=[ 2, 'str', \&Branch,     '{ goto XXX if _t() }'            ]; #ok
+
+=item [2addr]B<t> [I<label>]
+
+Branch to the B<:> function with the specified I<label> if any B<s>
+substitutions have been made since the most recent reading of an input line
+or execution of a B<t> function. If no label is given, branch to the end of
+the script. 
+
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'w'}=[ 2, 'str', \&Write,      "{ _w( '-X-' ) }"                 ]; #ok
+
+=item [2addr]B<w> I<file>
+
+The contents of the pattern space are written to the I<file>.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'x'}=[ 2, '',    \&Emit,       '{ ($Hold, $_) = ($_, $Hold) }'   ]; #ok
+
+=item [2addr]B<x>
+
+Swap the contents of the pattern space and the hold space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'y'}=[ 2, 'tra', \&Emit,       ''                                ]; #ok
+=item [2addr]B<y>B</>I<string1>B</>I<string2>B</>
+
+In the pattern space, replace all characters occuring in I<string1> by the
+character at the corresponding position in I<string2>. It is possible
+to use any character (other than a backslash or newline) instead of a
+slash to delimit the strings.  Within I<string1> and I<string2>, a
+backslash followed by any character other than a newline is that literal
+character, and a backslash followed by an `n' is replaced by a newline
+character.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'='}=[ 1, '',    \&Emit,       '{ print "$.\n" }'                ]; #ok
+
+=item [1addr]B<=>
+
+Prints the current line number on the standard output.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{':'}=[ 0, 'str', \&Label,      ''                                ]; #ok
+ 
+=item [0addr]B<:> [I<label>]
+
+The command specifies the position of the I<label>. It has no other effect.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'{'}=[ 2, '',    \&BeginBlock, '{'                               ]; #ok
+$ComTab{'}'}=[ 0, '',    \&EndBlock,   ';}'                              ]; #ok
+# ';' to avoid warning on empty {}-block
+
+=item [2addr]B<{> [I<command>]
+
+=item [0addr]B<}>
+
+These two commands begin and end a command list. The first command may
+be given on the same line as the opening B<{> command. The commands
+within the list are jointly selected by the address(es) given on the
+B<{> command (but may still have individual addresses).
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'#'}=[ 0, 'str', \&Comment,    ''                                ]; #ok
+
+=item [0addr]B<#> [I<comment>]
+
+The entire line is ignored (treated as a comment). If, however, the first
+two characters in the script are `C<#n>', automatic printing of output is
+suppressed, as if the B<-n> option were given on the command line.
+
+=back
+
+=cut
+
+use vars qw{ $isEOF $Hold %wFiles @Q $CondReg $doPrint };
+
+my $useDEBUG    = exists( $ENV{PSEDDEBUG} );
+my $useEXTBRE   = $ENV{PSEDEXTBRE} || '';
+$useEXTBRE =~ s/[^<>wWyB]//g; # gawk RE's handle these
+
+my $doAutoPrint = 1;          # automatic printing of pattern space (-n => 0)
+my $doOpenWrite = 1;          # open w command output files at start (-a => 0)
+my $svOpenWrite = 0;          # save $doOpenWrite
+
+# lower case $0 below as a VMSism.  The VMS build procedure creates the
+# s2p file traditionally in upper case on the disk.  When VMS is in a
+# case preserved or case sensitive mode, $0 will be returned in the exact
+# case which will be on the disk, and that is not predictable at this time.
+
+my $doGenerate  = lc($0) eq 's2p';
+
+# Collected and compiled script
+#
+my( @Commands, %Defined, @BlockStack, %Label, $labNum, $Code, $Func );
+$Code = '';
+
+##################
+#  Compile Time
+#
+# Labels
+# 
+# Error handling
+#
+sub Warn($;$){
+    my( $msg, $loc ) = @_;
+    $loc ||= '';
+    $loc .= ': ' if length( $loc );
+    warn( "$0: $loc$msg\n" );
+}
+
+$labNum = 0;
+sub newLabel(){
+    return 'L_'.++$labNum;
+}
+
+# safeHere: create safe here delimiter and  modify opcode and argument
+#
+sub safeHere($$){
+    my( $codref, $argref ) = @_;
+    my $eod = 'EOD000';
+    while( $$argref =~ /^$eod$/m ){
+        $eod++;
+    }
+    $$codref =~ s/TheEnd/$eod/e;
+    $$argref .= "$eod\n"; 
+}
+
+# Emit: create address logic and emit command
+#
+sub Emit($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    my $cond = '';
+    if( defined( $addr1 ) ){
+        if( defined( $addr2 ) ){
+	    $addr1 .= $addr2 =~ /^\d+$/ ? "..$addr2" : "...$addr2";
+        } else {
+	    $addr1 .= ' == $.' if $addr1 =~ /^\d+$/;
+	}
+	$cond = $negated ? "unless( $addr1 )\n" : "if( $addr1 )\n";
+    }
+
+    if( $opcode eq '' ){
+	$Code .= "$cond$arg\n";
+
+    } elsif( $opcode =~ s/-X-/$arg/e ){
+	$Code .= "$cond$opcode\n";
+
+    } elsif( $opcode =~ /TheEnd/ ){
+	safeHere( \$opcode, \$arg );
+	$Code .= "$cond$opcode$arg";
+
+    } else {
+	$Code .= "$cond$opcode\n";
+    }
+    0;
+}
+
+# Write (w command, w flag): store pathname
+#
+sub Write($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $path, $fl ) = @_;
+    $wFiles{$path} = '';
+    Emit( $addr1, $addr2, $negated, $opcode, $path, $fl );
+}
+
+
+# Label (: command): label definition
+#
+sub Label($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $lab, $fl ) = @_;
+    my $rc = 0;
+    $lab =~ s/\s+//;
+    if( length( $lab ) ){
+	my $h;
+	if( ! exists( $Label{$lab} ) ){
+	    $h = $Label{$lab}{name} = newLabel();
+        } else {
+	    $h = $Label{$lab}{name};
+	    if( exists( $Label{$lab}{defined} ) ){
+		my $dl = $Label{$lab}{defined};
+		Warn( "duplicate label $lab (first defined at $dl)", $fl );
+		$rc = 1;
+	    }
+	}
+        $Label{$lab}{defined} = $fl;
+	$Code .= "$h:;\n";
+    }
+    $rc;
+}
+
+# BeginBlock ({ command): push block start
+#
+sub BeginBlock($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    push( @BlockStack, [ $fl, $addr1, $addr2, $negated ] );
+    Emit( $addr1, $addr2, $negated, $opcode, $arg, $fl );
+}
+
+# EndBlock (} command): check proper nesting
+#
+sub EndBlock($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    my $rc;
+    my $jcom = pop( @BlockStack );
+    if( defined( $jcom ) ){
+	$rc = Emit( $addr1, $addr2, $negated, $opcode, $arg, $fl );
+    } else {
+	Warn( "unexpected `}'", $fl );
+	$rc = 1;
+    }
+    $rc;
+}
+
+# Branch (t, b commands): check or create label, substitute default
+#
+sub Branch($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $lab, $fl ) = @_;
+    $lab =~ s/\s+//; # no spaces at end
+    my $h;
+    if( length( $lab ) ){
+	if( ! exists( $Label{$lab} ) ){
+	    $h = $Label{$lab}{name} = newLabel();
+        } else {
+	    $h = $Label{$lab}{name};
+	}
+	push( @{$Label{$lab}{used}}, $fl );
+    } else {
+	$h = 'EOS';
+    }
+    $opcode =~ s/XXX/$h/e;
+    Emit( $addr1, $addr2, $negated, $opcode, '', $fl );
+}
+
+# Change (c command): is special due to range end watching
+#
+sub Change($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    my $kwd = $negated ? 'unless' : 'if';
+    if( defined( $addr2 ) ){
+        $addr1 .= $addr2 =~ /^\d+$/ ? "..$addr2" : "...$addr2";
+	if( ! $negated ){
+	    $addr1  = '$icnt = ('.$addr1.')';
+	    $opcode = 'if( $icnt =~ /E0$/ )' . $opcode;
+	}
+    } else {
+	$addr1 .= ' == $.' if $addr1 =~ /^\d+$/;
+    }
+    safeHere( \$opcode, \$arg );
+    $Code .= "$kwd( $addr1 ){\n  $opcode$arg}\n";
+    0;
+}
+
+
+# Comment (# command): A no-op. Who would've thought that!
+#
+sub Comment($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+### $Code .= "# $arg\n";
+    0;
+}
+
+
+sub stripRegex($$){
+    my( $del, $sref ) = @_;
+    my $regex = $del;
+    print "stripRegex:$del:$$sref:\n" if $useDEBUG;
+    while( $$sref =~ s{^(.*?)(\\*)\Q$del\E(\s*)}{}s ){
+        my $sl = $2;
+	$regex .= $1.$sl.$del;
+	if( length( $sl ) % 2 == 0 ){
+	    return $regex;
+	}
+	$regex .= $3;
+    }
+    undef();
+}
+
+# stripTrans: take a <del> terminated string from y command
+#   honoring and cleaning up of \-escaped <del>'s
+#
+sub stripTrans($$){
+    my( $del, $sref ) = @_;
+    my $t = '';
+    print "stripTrans:$del:$$sref:\n" if $useDEBUG;
+    while( $$sref =~ s{^(.*?)(\\*)\Q$del\E}{}s ){
+        my $sl = $2;
+	$t .= $1;
+	if( length( $sl ) % 2 == 0 ){
+	    $t .= $sl;
+	    $t =~ s/\\\\/\\/g;
+	    return $t;
+	}
+	chop( $sl );
+	$t .= $sl.$del.$3;
+    }
+    undef();
+}
+
+# makey - construct Perl y/// from sed y///
+#
+sub makey($$$){
+    my( $fr, $to, $fl ) = @_;
+    my $error = 0;
+
+    # Ensure that any '-' is up front.
+    # Diagnose duplicate contradicting mappings
+    my %tr;
+    for( my $i = 0; $i < length($fr); $i++ ){
+	my $fc = substr($fr,$i,1);
+	my $tc = substr($to,$i,1);
+	if( exists( $tr{$fc} ) && $tr{$fc} ne $tc ){
+	    Warn( "ambiguous translation for character `$fc' in `y' command",
+		  $fl );
+	    $error++;
+	}
+	$tr{$fc} = $tc;
+    }
+    $fr = $to = '';
+    if( exists( $tr{'-'} ) ){
+	( $fr, $to ) = ( '-', $tr{'-'} );
+	delete( $tr{'-'} );
+    } else {
+	$fr = $to = '';
+    }
+    # might just as well sort it...
+    for my $fc ( sort keys( %tr ) ){
+	$fr .= $fc;
+	$to .= $tr{$fc};
+    }
+    # make embedded delimiters and newlines safe
+    $fr =~ s/([{}])/\$1/g;
+    $to =~ s/([{}])/\$1/g;
+    $fr =~ s/\n/\\n/g;
+    $to =~ s/\n/\\n/g;
+    return $error ? undef() : "{ y{$fr}{$to}; }";
+}
+
+######
+# makes - construct Perl s/// from sed s///
+#
+sub makes($$$$$$$){
+    my( $regex, $subst, $path, $global, $print, $nmatch, $fl ) = @_;
+
+    # make embedded newlines safe
+    $regex =~ s/\n/\\n/g;
+    $subst =~ s/\n/\\n/g;
+ 
+    my $code;
+    # n-th occurrence
+    #
+    if( length( $nmatch ) ){
+	$code = <<TheEnd;
+{ \$n = $nmatch;
+  while( --\$n && ( \$s = m ${regex}g ) ){}
+  \$s = ( substr( \$_, pos() ) =~ s ${regex}${subst}s ) if \$s;
+  \$CondReg ||= \$s;
+TheEnd
+    } else {
+        $code = <<TheEnd;
+{ \$s = s ${regex}${subst}s${global};
+  \$CondReg ||= \$s;
+TheEnd
+    }
+    if( $print ){
+        $code .= '  print $_, "\n" if $s;'."\n";
+    }
+    if( defined( $path ) ){
+        $wFiles{$path} = '';
+	$code .= " _w( '$path' ) if \$s;\n";
+        $GenKey{'w'} = 1;
+    }
+    $code .= "}";
+}
+
+=head1 BASIC REGULAR EXPRESSIONS
+
+A I<Basic Regular Expression> (BRE), as defined in POSIX 1003.2, consists
+of I<atoms>, for matching parts of a string, and I<bounds>, specifying
+repetitions of a preceding atom.
+
+=head2 Atoms
+
+The possible atoms of a BRE are: B<.>, matching any single character;
+B<^> and B<$>, matching the null string at the beginning or end
+of a string, respectively; a I<bracket expressions>, enclosed
+in B<[> and B<]> (see below); and any single character with no
+other significance (matching that character). A B<\> before one
+of: B<.>, B<^>, B<$>, B<[>, B<*>, B<\>, matching the character
+after the backslash. A sequence of atoms enclosed in B<\(> and B<\)>
+becomes an atom and establishes the target for a I<backreference>,
+consisting of the substring that actually matches the enclosed atoms.
+Finally, B<\> followed by one of the digits B<0> through B<9> is a
+backreference.
+
+A B<^> that is not first, or a B<$> that is not last does not have
+a special significance and need not be preceded by a backslash to
+become literal. The same is true for a B<]>, that does not terminate
+a bracket expression.
+
+An unescaped backslash cannot be last in a BRE.
+
+=head2 Bounds
+
+The BRE bounds are: B<*>, specifying 0 or more matches of the preceding
+atom; B<\{>I<count>B<\}>, specifying that many repetitions;
+B<\{>I<minimum>B<,\}>, giving a lower limit; and
+B<\{>I<minimum>B<,>I<maximum>B<\}> finally defines a lower and upper
+bound. 
+
+A bound appearing as the first item in a BRE is taken literally.
+
+=head2 Bracket Expressions
+
+A I<bracket expression> is a list of characters, character ranges
+and character classes enclosed in B<[> and B<]> and matches any
+single character from the represented set of characters.
+
+A character range is written as two characters separated by B<-> and
+represents all characters (according to the character collating sequence)
+that are not less than the first and not greater than the second.
+(Ranges are very collating-sequence-dependent, and portable programs
+should avoid relying on them.)
+
+A character class is one of the class names
+
+   alnum     digit     punct
+   alpha     graph     space
+   blank     lower     upper
+   cntrl     print     xdigit
+
+enclosed in B<[:> and B<:]> and represents the set of characters
+as defined in ctype(3).
+
+If the first character after B<[> is B<^>, the sense of matching is
+inverted.
+
+To include a literal `C<^>', place it anywhere else but first. To
+include a literal 'C<]>' place it first or immediately after an
+initial B<^>. To include a literal `C<->' make it the first (or
+second after B<^>) or last character, or the second endpoint of
+a range.
+
+The special bracket expression constructs C<[[:E<lt>:]]> and C<[[:E<gt>:]]> 
+match the null string at the beginning and end of a word respectively.
+(Note that neither is identical to Perl's `\b' atom.)
+
+=head2 Additional Atoms
+
+Since some sed implementations provide additional regular expression
+atoms (not defined in POSIX 1003.2), B<psed> is capable of translating
+the following backslash escapes:
+
+=over 4
+
+=item B<\E<lt>> This is the same as C<[[:E<gt>:]]>.
+
+=item B<\E<gt>> This is the same as C<[[:E<lt>:]]>.
+
+=item B<\w> This is an abbreviation for C<[[:alnum:]_]>.
+
+=item B<\W> This is an abbreviation for C<[^[:alnum:]_]>.
+
+=item B<\y> Match the empty string at a word boundary.
+
+=item B<\B> Match the empty string between any two either word or non-word characters.
+
+=back
+
+To enable this feature, the environment variable PSEDEXTBRE must be set
+to a string containing the requested characters, e.g.:
+C<PSEDEXTBRE='E<lt>E<gt>wW'>.
+
+=cut
+
+#####
+# bre2p - convert BRE to Perl RE
+#
+sub peek(\$$){
+    my( $pref, $ic ) = @_;
+    $ic < length($$pref)-1 ? substr( $$pref, $ic+1, 1 ) : '';
+}
+
+sub bre2p($$$){
+    my( $del, $pat, $fl ) = @_;
+    my $led = $del;
+    $led =~ tr/{([</})]>/;
+    $led = '' if $led eq $del;
+
+    $pat = substr( $pat, 1, length($pat) - 2 );
+    my $res = '';
+    my $bracklev = 0;
+    my $backref  = 0;
+    my $parlev = 0;
+    for( my $ic = 0; $ic < length( $pat ); $ic++ ){
+        my $c = substr( $pat, $ic, 1 );
+        if( $c eq '\\' ){
+	    ### backslash escapes
+            my $nc = peek($pat,$ic);
+            if( $nc eq '' ){
+                Warn( "`\\' cannot be last in pattern", $fl );
+                return undef();
+            }
+	    $ic++;
+            if( $nc eq $del ){ ## \<pattern del> => \<pattern del>
+                $res .= "\\$del";
+
+	    } elsif( $nc =~ /([[.*\\n])/ ){
+		## check for \-escaped magics and \n:
+		## \[ \. \* \\ \n stay as they are
+                $res .= '\\'.$nc;
+
+            } elsif( $nc eq '(' ){ ## \( => (
+                $parlev++;
+                $res .= '(';
+
+            } elsif( $nc eq ')' ){ ## \) => )
+                $parlev--;
+		$backref++;
+                if( $parlev < 0 ){
+                    Warn( "unmatched `\\)'", $fl );
+                    return undef();
+                }
+                $res .= ')';
+
+            } elsif( $nc eq '{' ){ ## repetition factor \{<i>[,[<j>]]\}
+                my $endpos = index( $pat, '\\}', $ic );
+                if( $endpos < 0 ){
+                    Warn( "unmatched `\\{'", $fl );
+                    return undef();
+                }
+                my $rep = substr( $pat, $ic+1, $endpos-($ic+1) );
+                $ic = $endpos + 1;
+
+  	        if( $res =~ /^\^?$/ ){
+		    $res .= "\\{$rep\}";
+                } elsif( $rep =~ /^(\d+)(,?)(\d*)?$/ ){
+                    my $min = $1;
+                    my $com = $2 || '';
+                    my $max = $3;
+                    if( length( $max ) ){
+                        if( $max < $min ){
+                            Warn( "maximum less than minimum in `\\{$rep\\}'",
+				  $fl );
+                            return undef();
+                        }
+                    } else {
+                        $max = '';
+                    }
+		    # simplify some
+		    if( $min == 0 && $max eq '1' ){
+			$res .= '?';
+		    } elsif( $min == 1 && "$com$max" eq ',' ){
+			$res .= '+';
+		    } elsif( $min == 0 && "$com$max" eq ',' ){
+			$res .= '*';
+		    } else {
+			$res .= "{$min$com$max}";
+		    }
+                } else {
+                    Warn( "invalid repeat clause `\\{$rep\\}'", $fl );
+                    return undef();
+                }
+
+            } elsif( $nc =~ /^[1-9]$/ ){
+		## \1 .. \9 => \1 .. \9, but check for a following digit
+		if( $nc > $backref ){
+                    Warn( "invalid backreference ($nc)", $fl );
+                    return undef();
+		}
+                $res .= "\\$nc";
+		if( peek($pat,$ic) =~ /[0-9]/ ){
+		    $res .= '(?:)';
+		}
+
+            } elsif( $useEXTBRE && ( $nc =~ /[$useEXTBRE]/ ) ){
+		## extensions - at most <>wWyB - not in POSIX
+                if(      $nc eq '<' ){ ## \< => \b(?=\w), be precise
+                    $res .= '\\b(?<=\\W)';
+                } elsif( $nc eq '>' ){ ## \> => \b(?=\W), be precise
+                    $res .= '\\b(?=\\W)';
+                } elsif( $nc eq 'y' ){ ## \y => \b
+                    $res .= '\\b';
+                } else {               ## \B, \w, \W remain the same
+                    $res .= "\\$nc";
+                } 
+	    } elsif( $nc eq $led ){
+		## \<closing bracketing-delimiter> - keep '\'
+		$res .= "\\$nc";
+
+            } else { ## \ <char> => <char> ("as if `\' were not present")
+                $res .= $nc;
+            }
+
+        } elsif( $c eq '.' ){ ## . => .
+            $res .= $c;
+
+	} elsif( $c eq '*' ){ ## * => * but \* if there's nothing preceding it
+	    if( $res =~ /^\^?$/ ){
+                $res .= '\\*';
+            } elsif( substr( $res, -1, 1 ) ne '*' ){
+		$res .= $c;
+	    }
+
+        } elsif( $c eq '[' ){
+	    ## parse []: [^...] [^]...] [-...]
+	    my $add = '[';
+	    if( peek($pat,$ic) eq '^' ){
+		$ic++;
+		$add .= '^';
+	    }
+	    my $nc = peek($pat,$ic);
+  	    if( $nc eq ']' || $nc eq '-' ){
+		$add .= $nc;
+                $ic++;
+	    }
+	    # check that [ is not trailing
+	    if( $ic >= length( $pat ) - 1 ){
+		Warn( "unmatched `['", $fl );
+		return undef();
+	    }
+	    # look for [:...:] and x-y
+	    my $rstr = substr( $pat, $ic+1 );
+	    if( $rstr =~ /^((?:\[:\(\w+|[><]\):\]|[^]-](?:-[^]])?)*)/ ){
+ 	        my $cnt = $1;
+		$ic += length( $cnt );
+		$cnt =~ s/([\\\$])/\\$1/g; # `\', `$' are magic in Perl []
+		# try some simplifications
+ 	        my $red = $cnt;
+		if( $red =~ s/0-9// ){
+		    $cnt = $red.'\d';
+		    if( $red =~ s/A-Z// && $red =~ s/a-z// && $red =~ s/_// ){
+			$cnt = $red.'\w';
+                    }
+		}
+		$add .= $cnt;
+
+		# POSIX 1003.2 has this (optional) for begin/end word
+		$add = '\\b(?=\\W)'  if $add eq '[[:<:]]';
+		$add = '\\b(?<=\\W)' if $add eq '[[:>:]]';
+
+	    }
+
+	    ## may have a trailing `-' before `]'
+	    if( $ic < length($pat) - 1 &&
+                substr( $pat, $ic+1 ) =~ /^(-?])/ ){
+		$ic += length( $1 );
+		$add .= $1;
+		# another simplification
+		$add =~ s/^\[(\^?)(\\[dw])]$/ $1 eq '^' ? uc($2) : $2 /e;
+		$res .= $add;
+	    } else {
+		Warn( "unmatched `['", $fl );
+		return undef();
+	    }
+
+        } elsif( $c eq $led ){ ## unescaped <closing bracketing-delimiter>
+            $res .= "\\$c";
+
+        } elsif( $c eq ']' ){ ## unmatched ] is not magic
+            $res .= ']';
+
+        } elsif( $c =~ /[|+?{}()]/ ){ ## not magic in BRE, but in Perl: \-quote
+            $res .= "\\$c";
+
+        } elsif( $c eq '^' ){ ## not magic unless 1st, but in Perl: \-quote
+            $res .= length( $res ) ? '\\^' : '^';
+
+        } elsif( $c eq '$' ){ ## not magic unless last, but in Perl: \-quote
+            $res .= $ic == length( $pat ) - 1 ? '$' : '\\$';
+
+        } else {
+            $res .= $c;
+        }
+    }
+
+    if( $parlev ){
+       Warn( "unmatched `\\('", $fl );
+       return undef();
+    }
+
+    # final cleanup: eliminate raw HTs
+    $res =~ s/\t/\\t/g;
+    return $del . $res . ( $led ? $led : $del );
+}
+
+
+#####
+# sub2p - convert sed substitution to Perl substitution
+#
+sub sub2p($$$){
+    my( $del, $subst, $fl ) = @_;
+    my $led = $del;
+    $led =~ tr/{([</})]>/;
+    $led = '' if $led eq $del;
+
+    $subst = substr( $subst, 1, length($subst) - 2 );
+    my $res = '';
+ 
+    for( my $ic = 0; $ic < length( $subst ); $ic++ ){
+        my $c = substr( $subst, $ic, 1 );
+        if( $c eq '\\' ){
+	    ### backslash escapes
+            my $nc = peek($subst,$ic);
+            if( $nc eq '' ){
+                Warn( "`\\' cannot be last in substitution", $fl );
+                return undef();
+            }
+	    $ic++;
+	    if( $nc =~ /[\\$del$led]/ ){ ## \ and delimiter
+		$res .= '\\' . $nc;
+            } elsif( $nc =~ /[1-9]/ ){ ## \1 - \9 => ${1} - ${9}
+                $res .= '${' . $nc . '}';
+	    } else { ## everything else (includes &): omit \
+		$res .= $nc;
+	    }
+        } elsif( $c eq '&' ){ ## & => $&
+            $res .= '$&';
+	} elsif( $c =~ /[\$\@$led]/ ){ ## magic in Perl's substitution string
+	    $res .= '\\' . $c;
+        } else {
+	    $res .= $c;
+	}
+    }
+
+    # final cleanup: eliminate raw HTs
+    $res =~ s/\t/\\t/g;
+    return ( $led ? $del : $led ) . $res . ( $led ? $led : $del );
+}
+
+
+sub Parse(){
+    my $error = 0;
+    my( $pdef, $pfil, $plin );
+    for( my $icom = 0; $icom < @Commands; $icom++ ){
+	my $cmd = $Commands[$icom];
+	print "Parse:$cmd:\n" if $useDEBUG;
+	$cmd =~ s/^\s+//;
+	next unless length( $cmd );
+	my $scom = $icom;
+	if( exists( $Defined{$icom} ) ){
+	    $pdef = $Defined{$icom};
+	    if( $pdef =~ /^ #(\d+)/ ){
+		$pfil = 'expression #';
+		$plin = $1;
+	    } else {
+		$pfil = "$pdef l.";
+		$plin = 1;
+            }
+        } else {
+	    $plin++;
+        }
+        my $fl = "$pfil$plin";
+
+        # insert command as comment in gnerated code
+	#
+	$Code .= "# $cmd\n" if $doGenerate;
+
+	# The Address(es)
+	#
+	my( $negated, $naddr, $addr1, $addr2 );
+	$naddr = 0;
+	if(      $cmd =~ s/^(\d+)\s*// ){
+	    $addr1 = "$1"; $naddr++;
+	} elsif( $cmd =~ s/^\$\s*// ){
+	    $addr1 = 'eofARGV()'; $naddr++;
+	} elsif( $cmd =~ s{^(/)}{} || $cmd =~ s{^\\(.)}{} ){
+	    my $del = $1;
+	    my $regex = stripRegex( $del, \$cmd );
+	    if( defined( $regex ) ){
+		$addr1 = 'm '.bre2p( $del, $regex, $fl ).'s';
+		$naddr++;
+	    } else {
+		Warn( "malformed regex, 1st address", $fl );
+		$error++;
+		next;
+	    }
+        }
+        if( defined( $addr1 ) && $cmd =~ s/,\s*// ){
+ 	    if(      $cmd =~ s/^(\d+)\s*// ){
+	        $addr2 = "$1"; $naddr++;
+	    } elsif( $cmd =~ s/^\$\s*// ){
+	        $addr2 = 'eofARGV()'; $naddr++;
+	    } elsif( $cmd =~ s{^(/)}{} || $cmd =~ s{^\\(.)}{} ){
+		my $del = $1;
+	        my $regex = stripRegex( $del, \$cmd );
+		if( defined( $regex ) ){
+		    $addr2 = 'm '. bre2p( $del, $regex, $fl ).'s';
+		    $naddr++;
+		} else {
+		    Warn( "malformed regex, 2nd address", $fl );
+		    $error++;
+		    next;
+		}
+            } else {
+		Warn( "invalid address after `,'", $fl );
+		$error++;
+		next;
+            }
+        }
+
+        # address modifier `!'
+        #
+        $negated = $cmd =~ s/^!\s*//;
+	if( defined( $addr1 ) ){
+	    print "Parse: addr1=$addr1" if $useDEBUG;
+	    if( defined( $addr2 ) ){
+		print ", addr2=$addr2 " if $useDEBUG;
+		# both numeric and addr1 > addr2 => eliminate addr2
+		undef( $addr2 ) if $addr1 =~ /^\d+$/ &&
+                                   $addr2 =~ /^\d+$/ && $addr1 > $addr2;
+	    }
+	}
+	print 'negated' if $useDEBUG && $negated;
+	print " command:$cmd\n" if $useDEBUG;
+
+	# The Command
+	#
+        if( $cmd !~ s/^([:#={}abcdDgGhHilnNpPqrstwxy])\s*// ){
+	    my $h = substr( $cmd, 0, 1 );
+ 	    Warn( "unknown command `$h'", $fl );
+	    $error++;
+	    next;
+	}
+        my $key = $1;
+
+	my $tabref = $ComTab{$key};
+	$GenKey{$key} = 1;
+	if( $naddr > $tabref->[0] ){
+	    Warn( "excess address(es)", $fl );
+	    $error++;
+	    next;
+	}
+
+	my $arg = '';
+	if(      $tabref->[1] eq 'str' ){
+	    # take remainder - don't care if it is empty
+	    $arg = $cmd;
+            $cmd = '';
+
+	} elsif( $tabref->[1] eq 'txt' ){
+	    # multi-line text
+	    my $goon = $cmd =~ /(.*)\\$/;
+	    if( length( $1 ) ){
+		Warn( "extra characters after command ($cmd)", $fl );
+		$error++;
+	    }
+	    while( $goon ){
+		$icom++;
+		if( $icom > $#Commands ){
+		    Warn( "unexpected end of script", $fl );
+		    $error++;
+		    last;
+		}
+		$cmd = $Commands[$icom];
+		$Code .= "# $cmd\n" if $doGenerate;
+		$goon = $cmd =~ s/\\$//;
+		$cmd =~ s/\\(.)/$1/g;
+		$arg .= "\n" if length( $arg );
+		$arg .= $cmd;
+	    }
+	    $arg .= "\n" if length( $arg );
+	    $cmd = '';
+
+	} elsif( $tabref->[1] eq 'sub' ){
+	    # s///
+	    if( ! length( $cmd ) ){
+		Warn( "`s' command requires argument", $fl );
+		$error++;
+		next;
+	    }
+	    if( $cmd =~ s{^([^\\\n])}{} ){
+		my $del = $1;
+		my $regex = stripRegex( $del, \$cmd );
+		if( ! defined( $regex ) ){
+		    Warn( "malformed regular expression", $fl );
+		    $error++;
+		    next;
+		}
+		$regex = bre2p( $del, $regex, $fl );
+
+		# a trailing \ indicates embedded NL (in replacement string)
+		while( $cmd =~ s/(?<!\\)\\$/\n/ ){
+		    $icom++;
+		    if( $icom > $#Commands ){
+			Warn( "unexpected end of script", $fl );
+			$error++;
+			last;
+		    }
+		    $cmd .= $Commands[$icom];
+	            $Code .= "# $Commands[$icom]\n" if $doGenerate;
+		}
+
+		my $subst = stripRegex( $del, \$cmd );
+		if( ! defined( $regex ) ){
+		    Warn( "malformed substitution expression", $fl );
+		    $error++;
+		    next;
+		}
+		$subst = sub2p( $del, $subst, $fl );
+
+		# parse s/// modifier: g|p|0-9|w <file>
+		my( $global, $nmatch, $print, $write ) =
+		  ( '',      '',      0,      undef );
+		while( $cmd =~ s/^([gp0-9])// ){
+		    $1 eq 'g' ? ( $global = 'g' ) :
+  		    $1 eq 'p' ? ( $print  = $1  ) : ( $nmatch .= $1 );
+                }
+		$write = $1 if $cmd =~ s/w\s*(.*)$//;
+  	        ### $nmatch =~ s/^(\d)\1*$/$1/; ### may be dangerous?
+		if( $global && length( $nmatch ) || length( $nmatch ) > 1 ){
+		    Warn( "conflicting flags `$global$nmatch'", $fl );
+		    $error++;
+		    next;
+		}
+
+		$arg = makes( $regex, $subst,
+			      $write, $global, $print, $nmatch, $fl );
+		if( ! defined( $arg ) ){
+		    $error++;
+		    next;
+		}
+
+            } else {
+		Warn( "improper delimiter in s command", $fl );
+		$error++;
+		next;
+            }
+
+	} elsif( $tabref->[1] eq 'tra' ){
+	    # y///
+	    # a trailing \ indicates embedded newline
+	    while( $cmd =~ s/(?<!\\)\\$/\n/ ){
+		$icom++;
+		if( $icom > $#Commands ){
+		    Warn( "unexpected end of script", $fl );
+		    $error++;
+		    last;
+		}
+		$cmd .= $Commands[$icom];
+                $Code .= "# $Commands[$icom]\n" if $doGenerate;
+	    }
+	    if( ! length( $cmd ) ){
+		Warn( "`y' command requires argument", $fl );
+		$error++;
+		next;
+	    }
+	    my $d = substr( $cmd, 0, 1 ); $cmd = substr( $cmd, 1 );
+	    if( $d eq '\\' ){
+		Warn( "`\\' not valid as delimiter in `y' command", $fl );
+		$error++;
+		next;
+	    }
+	    my $fr = stripTrans( $d, \$cmd );
+	    if( ! defined( $fr ) || ! length( $cmd ) ){
+		Warn( "malformed `y' command argument", $fl );
+		$error++;
+		next;
+	    }
+	    my $to = stripTrans( $d, \$cmd );
+	    if( ! defined( $to ) ){
+		Warn( "malformed `y' command argument", $fl );
+		$error++;
+		next;
+	    }
+	    if( length($fr) != length($to) ){
+		Warn( "string lengths in `y' command differ", $fl );
+		$error++;
+		next;
+	    }
+	    if( ! defined( $arg = makey( $fr, $to, $fl ) ) ){
+		$error++;
+		next;
+	    }
+
+	}
+
+	# $cmd must be now empty - exception is {
+	if( $cmd !~ /^\s*$/ ){
+	    if( $key eq '{' ){
+		# dirty hack to process command on '{' line
+		$Commands[$icom--] = $cmd;
+	    } else {
+		Warn( "extra characters after command ($cmd)", $fl );
+		$error++;
+		next;
+	    }
+	}
+
+	# Make Code
+        #
+	if( &{$tabref->[2]}( $addr1, $addr2, $negated,
+                             $tabref->[3], $arg, $fl ) ){
+	    $error++;
+	}
+    }
+
+    while( @BlockStack ){
+	my $bl = pop( @BlockStack );
+	Warn( "start of unterminated `{'", $bl );
+        $error++;
+    }
+
+    for my $lab ( keys( %Label ) ){
+	if( ! exists( $Label{$lab}{defined} ) ){
+	    for my $used ( @{$Label{$lab}{used}} ){
+ 	        Warn( "undefined label `$lab'", $used );
+	        $error++;
+	    }
+	}
+    }
+
+    exit( 1 ) if $error;
+}
+
+
+##############
+#### MAIN ####
+##############
+
+sub usage(){
+    print STDERR "Usage: sed [-an] command [file...]\n";
+    print STDERR "           [-an] [-e command] [-f script-file] [file...]\n";
+}
+
+###################
+# Here we go again...
+#
+my $expr = 0;
+while( @ARGV && $ARGV[0] =~ /^-(.)(.*)$/ ){
+    my $opt = $1;
+    my $arg = $2;
+    shift( @ARGV );
+    if(      $opt eq 'e' ){
+        if( length( $arg ) ){
+	    push( @Commands, split( "\n", $arg ) );
+        } elsif( @ARGV ){
+	    push( @Commands, shift( @ARGV ) ); 
+        } else {
+            Warn( "option -e requires an argument" );
+            usage();
+            exit( 1 );
+        }
+	$expr++;
+        $Defined{$#Commands} = " #$expr";
+	next;
+    }
+    if( $opt eq 'f' ){
+        my $path;
+        if( length( $arg ) ){
+	    $path = $arg;
+        } elsif( @ARGV ){
+	    $path = shift( @ARGV ); 
+        } else {
+            Warn( "option -f requires an argument" );
+            usage();
+            exit( 1 );
+        }
+	my $fst = $#Commands + 1;
+        open( SCRIPT, "<$path" ) || die( "$0: $path: could not open ($!)\n" );
+        my $cmd;
+        while( defined( $cmd = <SCRIPT> ) ){
+            chomp( $cmd );
+            push( @Commands, $cmd );
+        }
+        close( SCRIPT );
+	if( $#Commands >= $fst ){
+	    $Defined{$fst} = "$path";
+	}
+	next;
+    }
+    if( $opt eq '-' && $arg eq '' ){
+	last;
+    }
+    if( $opt eq 'h' || $opt eq '?' ){
+        usage();
+        exit( 0 );
+    }
+    if( $opt eq 'n' ){
+	$doAutoPrint = 0;
+    } elsif( $opt eq 'a' ){
+	$doOpenWrite = 0;
+    } else {
+        Warn( "illegal option `$opt'" );
+        usage();
+        exit( 1 );
+    }
+    if( length( $arg ) ){
+	unshift( @ARGV, "-$arg" );
+    }
+}
+
+# A singleton command may be the 1st argument when there are no options.
+#
+if( @Commands == 0 ){
+    if( @ARGV == 0 ){
+        Warn( "no script command given" );
+        usage();
+        exit( 1 );
+    }
+    push( @Commands, split( "\n", shift( @ARGV ) ) );
+    $Defined{0} = ' #1';
+}
+
+print STDERR "Files: @ARGV\n" if $useDEBUG;
+
+# generate leading code
+#
+$Func = <<'[TheEnd]';
+
+# openARGV: open 1st input file
+#
+sub openARGV(){
+    unshift( @ARGV, '-' ) unless @ARGV;
+    my $file = shift( @ARGV );
+    open( ARG, "<$file" )
+    || die( "$0: can't open $file for reading ($!)\n" );
+    $isEOF = 0;
+}
+
+# getsARGV: Read another input line into argument (default: $_).
+#           Move on to next input file, and reset EOF flag $isEOF.
+sub getsARGV(;\$){
+    my $argref = @_ ? shift() : \$_; 
+    while( $isEOF || ! defined( $$argref = <ARG> ) ){
+	close( ARG );
+	return 0 unless @ARGV;
+	my $file = shift( @ARGV );
+	open( ARG, "<$file" )
+	|| die( "$0: can't open $file for reading ($!)\n" );
+	$isEOF = 0;
+    }
+    1;
+}
+
+# eofARGV: end-of-file test
+#
+sub eofARGV(){
+    return @ARGV == 0 && ( $isEOF = eof( ARG ) );
+}
+
+# makeHandle: Generates another file handle for some file (given by its path)
+#             to be written due to a w command or an s command's w flag.
+sub makeHandle($){
+    my( $path ) = @_;
+    my $handle;
+    if( ! exists( $wFiles{$path} ) || $wFiles{$path} eq '' ){
+        $handle = $wFiles{$path} = gensym();
+	if( $doOpenWrite ){
+	    if( ! open( $handle, ">$path" ) ){
+		die( "$0: can't open $path for writing: ($!)\n" );
+	    }
+	}
+    } else {
+        $handle = $wFiles{$path};
+    }
+    return $handle;
+}
+
+# printQ: Print queued output which is either a string or a reference
+#         to a pathname.
+sub printQ(){
+    for my $q ( @Q ){
+	if( ref( $q ) ){
+            # flush open w files so that reading this file gets it all
+	    if( exists( $wFiles{$$q} ) && $wFiles{$$q} ne '' ){
+		open( $wFiles{$$q}, ">>$$q" );
+	    }
+            # copy file to stdout: slow, but safe
+	    if( open( RF, "<$$q" ) ){
+		while( defined( my $line = <RF> ) ){
+		    print $line;
+		}
+		close( RF );
+	    }
+	} else {
+	    print $q;
+	}
+    }
+    undef( @Q );
+}
+
+[TheEnd]
+
+# generate the sed loop
+#
+$Code .= <<'[TheEnd]';
+sub openARGV();
+sub getsARGV(;\$);
+sub eofARGV();
+sub printQ();
+
+# Run: the sed loop reading input and applying the script
+#
+sub Run(){
+    my( $h, $icnt, $s, $n );
+    # hack (not unbreakable :-/) to avoid // matching an empty string
+    my $z = "\000"; $z =~ /$z/;
+    # Initialize.
+    openARGV();
+    $Hold    = '';
+    $CondReg = 0;
+    $doPrint = $doAutoPrint;
+CYCLE:
+    while( getsARGV() ){
+	chomp();
+	$CondReg = 0;   # cleared on t
+BOS:;
+[TheEnd]
+
+    # parse - avoid opening files when doing s2p
+    #
+    ( $svOpenWrite, $doOpenWrite ) = (  $doOpenWrite, $svOpenWrite )
+      if $doGenerate;
+    Parse();
+    ( $svOpenWrite, $doOpenWrite ) = (  $doOpenWrite, $svOpenWrite )
+      if $doGenerate;
+
+    # append trailing code
+    #
+    $Code .= <<'[TheEnd]';
+EOS:    if( $doPrint ){
+            print $_, "\n";
+        } else {
+	    $doPrint = $doAutoPrint;
+	}
+        printQ() if @Q;
+    }
+
+    exit( 0 );
+}
+[TheEnd]
+
+
+# append optional functions, prepend prototypes
+#
+my $Proto = "# prototypes\n";
+if( $GenKey{'l'} ){
+    $Proto .= "sub _l();\n";
+    $Func .= <<'[TheEnd]';
+# _l: l command processing
+#
+sub _l(){        
+    my $h = $_;
+    my $mcpl = 70;
+    # transform non printing chars into escape notation
+    $h =~ s/\\/\\\\/g;
+    if( $h =~ /[^[:print:]]/ ){
+	$h =~ s/\a/\\a/g;
+	$h =~ s/\f/\\f/g;
+	$h =~ s/\n/\\n/g;
+	$h =~ s/\t/\\t/g;
+	$h =~ s/\r/\\r/g;
+	$h =~ s/\e/\\e/g;
+        $h =~ s/([^[:print:]])/sprintf("\\%03o", ord($1))/ge;
+    }
+    # split into lines of length $mcpl
+    while( length( $h ) > $mcpl ){
+	my $l = substr( $h, 0, $mcpl-1 );
+	$h = substr( $h, $mcpl );
+	# remove incomplete \-escape from end of line
+	if( $l =~ s/(?<!\\)(\\[0-7]{0,2})$// ){
+	    $h = $1 . $h;
+	}
+	print $l, "\\\n";
+    }
+    print "$h\$\n";
+}
+
+[TheEnd]
+}
+
+if( $GenKey{'r'} ){
+    $Proto .= "sub _r(\$);\n";
+    $Func .= <<'[TheEnd]';
+# _r: r command processing: Save a reference to the pathname.
+#
+sub _r($){
+    my $path = shift();
+    push( @Q, \$path );
+}
+
+[TheEnd]
+}
+
+if( $GenKey{'t'} ){
+    $Proto .= "sub _t();\n";
+    $Func .= <<'[TheEnd]';
+# _t: t command - condition register test/reset
+#
+sub _t(){
+    my $res = $CondReg;
+    $CondReg = 0;
+    $res;
+}
+
+[TheEnd]
+}
+
+if( $GenKey{'w'} ){
+    $Proto .= "sub _w(\$);\n";
+    $Func .= <<'[TheEnd]';
+# _w: w command and s command's w flag - write to file 
+#
+sub _w($){
+    my $path   = shift();
+    my $handle = $wFiles{$path};
+    if( ! $doOpenWrite && ! defined( fileno( $handle ) ) ){
+	open( $handle, ">$path" )
+	|| die( "$0: $path: cannot open ($!)\n" );
+    }
+    print $handle $_, "\n";
+}
+
+[TheEnd]
+}
+
+$Code = $Proto . $Code;
+
+# magic "#n" - same as -n option
+#
+$doAutoPrint = 0 if substr( $Commands[0], 0, 2 ) eq '#n';
+
+# eval code - check for errors
+#
+print "Code:\n$Code$Func" if $useDEBUG;
+eval $Code . $Func;
+if( $@ ){
+    print "Code:\n$Code$Func";
+    die( "$0: internal error - generated incorrect Perl code: $@\n" );
+}
+
+if( $doGenerate ){
+
+    # write full Perl program
+    #
+ 
+    # bang line, declarations, prototypes
+    print <<TheEnd;
+#!$perlpath -w
+eval 'exec $perlpath -S \$0 \${1+"\$@"}'
+  if 0;
+\$0 =~ s/^.*?(\\w+)\[\\.\\w+\]*\$/\$1/;
+
+use strict;
+use Symbol;
+use vars qw{ \$isEOF \$Hold \%wFiles \@Q \$CondReg
+	     \$doAutoPrint \$doOpenWrite \$doPrint };
+\$doAutoPrint = $doAutoPrint;
+\$doOpenWrite = $doOpenWrite;
+TheEnd
+
+    my $wf = "'" . join( "', '",  keys( %wFiles ) ) . "'";
+    if( $wf ne "''" ){
+	print <<TheEnd;
+sub makeHandle(\$);
+for my \$p ( $wf ){
+   exit( 1 ) unless makeHandle( \$p );
+}
+TheEnd
+   }
+
+   print $Code;
+   print "Run();\n";
+   print $Func;
+   exit( 0 );
+
+} else {
+
+    # execute: make handles (and optionally open) all w files; run!
+    for my $p ( keys( %wFiles ) ){
+        exit( 1 ) unless makeHandle( $p );
+    }
+    Run();
+}
+
+
+=head1 ENVIRONMENT
+
+The environment variable C<PSEDEXTBRE> may be set to extend BREs.
+See L<"Additional Atoms">.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item ambiguous translation for character `%s' in `y' command
+
+The indicated character appears twice, with different translations.
+
+=item `[' cannot be last in pattern
+
+A `[' in a BRE indicates the beginning of a I<bracket expression>.
+
+=item `\' cannot be last in pattern
+
+A `\' in a BRE is used to make the subsequent character literal.
+
+=item `\' cannot be last in substitution
+
+A `\' in a subsitution string is used to make the subsequent character literal.
+
+=item conflicting flags `%s'
+
+In an B<s> command, either the `g' flag and an n-th occurrence flag, or
+multiple n-th occurrence flags are specified. Note that only the digits
+`1' through `9' are permitted.
+
+=item duplicate label %s (first defined at %s)
+
+=item excess address(es)
+
+The command has more than the permitted number of addresses.
+
+=item extra characters after command (%s)
+
+=item illegal option `%s'
+
+=item improper delimiter in s command
+
+The BRE and substitution may not be delimited with `\' or newline.
+
+=item invalid address after `,'
+
+=item invalid backreference (%s)
+
+The specified backreference number exceeds the number of backreferences
+in the BRE.
+
+=item invalid repeat clause `\{%s\}'
+
+The repeat clause does not contain a valid integer value, or pair of
+values.
+
+=item malformed regex, 1st address
+
+=item malformed regex, 2nd address
+
+=item malformed regular expression
+
+=item malformed substitution expression
+
+=item malformed `y' command argument
+
+The first or second string of a B<y> command  is syntactically incorrect.
+
+=item maximum less than minimum in `\{%s\}'
+
+=item no script command given
+
+There must be at least one B<-e> or one B<-f> option specifying a
+script or script file.
+
+=item `\' not valid as delimiter in `y' command
+
+=item option -e requires an argument
+
+=item option -f requires an argument
+
+=item `s' command requires argument
+
+=item start of unterminated `{'
+
+=item string lengths in `y' command differ
+
+The translation table strings in a B<y> commanf must have equal lengths.
+
+=item undefined label `%s'
+
+=item unexpected `}'
+
+A B<}> command without a preceding B<{> command was encountered.
+
+=item unexpected end of script
+
+The end of the script was reached although a text line after a
+B<a>, B<c> or B<i> command indicated another line.
+
+=item unknown command `%s'
+
+=item unterminated `['
+
+A BRE contains an unterminated bracket expression.
+
+=item unterminated `\('
+
+A BRE contains an unterminated backreference.
+
+=item `\{' without closing `\}'
+
+A BRE contains an unterminated bounds specification.
+
+=item `\)' without preceding `\('
+
+=item `y' command requires argument
+
+=back
+
+=head1 EXAMPLE
+
+The basic material for the preceding section was generated by running
+the sed script
+
+   #no autoprint
+   s/^.*Warn( *"\([^"]*\)".*$/\1/
+   t process
+   b
+   :process
+   s/$!/%s/g
+   s/$[_[:alnum:]]\{1,\}/%s/g
+   s/\\\\/\\/g
+   s/^/=item /
+   p
+
+on the program's own text, and piping the output into C<sort -u>.
+
+
+=head1 SED SCRIPT TRANSLATION
+
+If this program is invoked with the name F<s2p> it will act as a
+sed-to-Perl translator. After option processing (all other
+arguments are ignored), a Perl program is printed on standard
+output, which will process the input stream (as read from all
+arguments) in the way defined by the sed script and the option setting
+used for the translation.
+
+=head1 SEE ALSO
+
+perl(1), re_format(7)
+
+=head1 BUGS
+
+The B<l> command will show escape characters (ESC) as `C<\e>', but
+a vertical tab (VT) in octal.
+
+Trailing spaces are truncated from labels in B<:>, B<t> and B<b> commands.
+
+The meaning of an empty regular expression (`C<//>'), as defined by B<sed>,
+is "the last pattern used, at run time". This deviates from the Perl
+interpretation, which will re-use the "last last successfully executed
+regular expression". Since keeping track of pattern usage would create
+terribly cluttered code, and differences would only appear in obscure
+context (where other B<sed> implementations appear to deviate, too),
+the Perl semantics was adopted. Note that common usage of this feature,
+such as in C</abc/s//xyz/>, will work as expected.
+
+Collating elements (of bracket expressions in BREs) are not implemented.
+
+=head1 STANDARDS
+
+This B<sed> implementation conforms to the IEEE Std1003.2-1992 ("POSIX.2")
+definition of B<sed>, and is compatible with the I<OpenBSD>
+implementation, except where otherwise noted (see L<"BUGS">).
+
+=head1 AUTHOR
+
+This Perl implementation of I<sed> was written by Wolfgang Laun,
+I<Wolfgang.Laun@alcatel.at>.
+
+=head1 COPYRIGHT and LICENSE
+
+This program is free and open software. You may use, modify,
+distribute, and sell this program (and any modified variants) in any
+way you wish, provided you do not restrict others from doing the same.
+
+=cut
+
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/search.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/search.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/search.bat	(revision 14489)
@@ -0,0 +1,1887 @@
+@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 ';
+#!/usr/local/bin/perl -w
+#line 15
+'di';
+'ig00';
+##############################################################################
+##
+## search
+##
+## Jeffrey Friedl (jfriedl@omron.co.jp), Dec 1994.
+## Copyright 19.... ah hell, just take it.
+##
+## BLURB:
+## A combo of find and grep -- more or less do a 'grep' on a whole
+## directory tree. Fast, with lots of options. Much more powerful than
+## the simple "find ... | xargs grep ....". Has a full man page.
+## Powerfully customizable.
+##
+## This file is big, but mostly comments and man page.
+##
+## See man page for usage info.
+## Return value: 2=error, 1=nothing found, 0=something found.
+##
+
+$version = "950918.5";
+##
+## "950918.5";
+##	Changed all 'sysread' to 'read' because Linux perl's don't seem
+##	to like sysread()
+##
+## "941227.4";
+##	Added -n, -u
+##
+## "941222.3"
+##      Added -nice (due to Lionel Cons <Lionel.Cons@cern.ch>)
+##	Removed any leading "./" from name.
+##      Added default flags for ~/.search, including TTY, -nice, -list, etc.
+##	Program name now has path removed when printed in diagnostics.
+##	Added simple tilde-expansion to -dir arg.
+##	Added -dskip, etc. Fixed -iregex bug.
+##	Changed -dir to be additive, adding -ddir.
+##	Now screen out devices, pipes, and sockets.
+##	More tidying and lots of expanding of the man page
+##
+##
+## "941217.2";
+##	initial release.
+
+$stripped=0;
+
+&init;
+if (exists $ENV{'HOME'}) {
+    $rc_file = join('/', $ENV{'HOME'}, ".search");
+}
+else {
+    $rc_file = "";
+}
+
+&check_args;
+
+## Make sure we've got a regex.
+## Don't need one if -find or -showrc was specified.
+$!=2, die "expecting regex arguments.\n"
+	if $FIND_ONLY == 0 && $showrc == 0 && @ARGV == 0;
+
+&prepare_to_search($rc_file);
+
+&import_program if !defined &dodir; ## BIG key to speed.
+
+## do search while there are directories to be done.
+&dodir(shift(@todo)) while @todo;
+
+&clear_message if $VERBOSE && $STDERR_IS_TTY;
+exit($retval);
+###############################################################################
+
+sub init
+{
+  ## initialize variables that might be reset by command-line args
+  $DOREP=0; 		## set true by -dorep (redo multi-hardlink files)
+  $DOREP=1 if $^O eq 'MSWin32';
+  $DO_SORT=0;           ## set by -sort (sort files in a dir before checking)
+  $FIND_ONLY=0;         ## set by -find (don't search files)
+  $LIST_ONLY=0;		## set true by -l (list filenames only)
+  $NEWER=0;             ## set by -newer, "-mtime -###"
+  $NICE=0;              ## set by -nice (print human-readable output)
+  $NOLINKS=0; 		## set true by -nolinks (don't follow symlinks)
+  $OLDER=0;             ## set by -older, "-mtime  ###"
+  $PREPEND_FILENAME=1;  ## set false by -h (don't prefix lines with filename)
+  $REPORT_LINENUM=0;    ## set true by -n (show line numbers)
+  $VERBOSE=0;		## set to a value by -v, -vv, etc. (verbose messages)
+  $WHY=0;		## set true by -why, -vvv+ (report why skipped)
+  $XDEV=0;		## set true by -xdev (stay on one filesystem)
+  $all=0;		## set true by -all (don't skip many kinds of files)
+  $iflag = '';		## set to 'i' by -i (ignore case);
+  $norc=0;              ## set by -norc (don't load rc file)
+  $showrc=0;            ## set by -showrc (show what happens with rc file)
+  $underlineOK=0;       ## set true by -u (watch for underline stuff)
+  $words=0;             ## set true by -w (match whole-words only)
+  $DELAY=0;		## inter-file delay (seconds)
+  $retval=1;            ## will set to 0 if we find anything.
+
+  ## various elements of stat() that we might access
+  $STAT_DEV   = 1;
+  $STAT_INODE = 2;
+  $STAT_MTIME = 9;
+
+  $VV_PRINT_COUNT = 50;  ## with -vv, print every VV_PRINT_COUNT files, or...
+  $VV_SIZE = 1024*1024;  ## ...every VV_SIZE bytes searched
+  $vv_print = $vv_size = 0; ## running totals.
+
+  ## set default options, in case the rc file wants them
+  $opt{'TTY'}= 1 if -t STDOUT;
+  
+  ## want to know this for debugging message stuff
+  $STDERR_IS_TTY = -t STDERR ? 1 : 0;
+  $STDERR_SCREWS_STDOUT = ($STDERR_IS_TTY && -t STDOUT) ? 1 : 0;
+
+  $0 =~ s,.*/,,;  ## clean up $0 for any diagnostics we'll be printing.
+}
+
+##
+## Check arguments.
+##
+sub check_args
+{
+  while (@ARGV && $ARGV[0] =~ m/^-/)
+  {
+      $arg = shift(@ARGV);
+
+      if ($arg eq '-version' || ($VERBOSE && $arg eq '-help')) {
+	  print qq/Jeffrey's file search, version "$version".\n/;
+	  exit(0) unless $arg eq '-help';
+      }
+      if ($arg eq '-help') {
+	  print <<INLINE_LITERAL_TEXT;
+usage: $0 [options] [-e] [PerlRegex ....]
+OPTIONS TELLING *WHERE* TO SEARCH:
+  -dir DIR       start search at the named directory (default is current dir).
+  -xdev          stay on starting file system.
+  -sort          sort the files in each directory before processing.
+  -nolinks       don't follow symbolic links.
+OPTIONS TELLING WHICH FILES TO EVEN CONSIDER:
+  -mtime #       consider files modified > # days ago (-# for < # days old)
+  -newer FILE    consider files modified more recently than FILE (also -older)
+  -name GLOB     consider files whose name matches pattern (also -regex).
+  -skip GLOB     opposite of -name: identifies files to not consider.
+  -path GLOB     like -name, but for files whose whole path is described.
+  -dpath/-dregex/-dskip versions for selecting or pruning directories.
+  -all           don't skip any files marked to be skipped by the startup file.
+  -x<SPECIAL>    (see manual, and/or try -showrc).
+  -why           report why a file isn't checked (also implied by -vvvv).
+OPTIONS TELLING WHAT TO DO WITH FILES THAT WILL BE CONSIDERED:
+  -f  | -find    just list files (PerlRegex ignored). Default is to grep them.
+  -ff | -ffind   Does a faster -find (implies -find -all -dorep)
+OPTIONS CONTROLLING HOW THE SEARCH IS DONE (AND WHAT IS PRINTED):
+  -l | -list     only list files with matches, not the lines themselves.
+  -nice | -nnice print more "human readable" output.
+  -n             prefix each output line with its line number in the file.
+  -h             don't prefix output lines with file name.
+  -u             also look "inside" manpage-style underlined text
+  -i             do case-insensitive searching.
+  -w             match words only (as defined by perl's \\b).
+OTHER OPTIONS:
+  -v, -vv, -vvv  various levels of message verbosity.
+  -e             end of options (in case a regex looks like an option).
+  -showrc        show what the rc file sets, then exit.
+  -norc          don't load the rc file.
+  -dorep         check files with multiple hard links multiple times.
+INLINE_LITERAL_TEXT
+	print "Use -v -help for more verbose help.\n" unless $VERBOSE;
+	print "This script file is also a man page.\n" unless $stripped;
+	print <<INLINE_LITERAL_TEXT if $VERBOSE;
+
+If -f (or -find) given, PerlRegex is optional and ignored.
+Otherwise, will search for files with lines matching any of the given regexes.
+
+Combining things like -name and -mtime implies boolean AND.
+However, duplicating things (such as -name '*.c' -name '*.txt') implies OR.
+
+-mtime may be given floating point (i.e. 1.5 is a day and a half).
+-iskip/-idskip/-ipath/... etc are case-insensitive versions.
+
+If any letter in -newer/-older is upper case, "or equal" is
+inserted into the test.
+
+You can always find the latest version on the World Wide Web in
+   http://www.wg.omron.co.jp/~jfriedl/perl/
+INLINE_LITERAL_TEXT
+	  exit(0);
+      }
+      $DOREP=1,             next if $arg eq '-dorep';   ## do repeats
+      $DO_SORT=1,           next if $arg eq '-sort';    ## sort files
+      $NOLINKS=1,           next if $arg eq '-nolinks'; ## no sym. links
+      $PREPEND_FILENAME=0,  next if $arg eq '-h';       ## no filename prefix
+      $REPORT_LINENUM=1,    next if $arg eq '-n';       ## show line numbers
+      $WHY=1,               next if $arg eq '-why';     ## tell why skipped
+      $XDEV=1,              next if $arg eq '-xdev';    ## don't leave F.S.
+      $all=1,$opt{'-all'}=1,next if $arg eq '-all';     ## don't skip *.Z, etc
+      $iflag='i',           next if $arg eq '-i';       ## ignore case
+      $norc=1,              next if $arg eq '-norc';    ## don't load rc file
+      $showrc=1,            next if $arg eq '-showrc';  ## show rc file
+      $underlineOK=1,       next if $arg eq '-u';       ## look throuh underln.
+      $words=1,             next if $arg eq '-w';       ## match "words" only
+      &strip                     if $arg eq '-strip';   ## dump this program
+      last                       if $arg eq '-e';
+      $DELAY=$1,            next if $arg =~ m/-delay(\d+)/;
+
+      $FIND_ONLY=1,         next if $arg =~/^-f(ind)?$/;## do "find" only
+
+      $FIND_ONLY=1, $DOREP=1, $all=1,
+                            next if $arg =~/^-ff(ind)?$/;## fast -find
+      $LIST_ONLY=1,$opt{'-list'}=1,
+		            next if $arg =~/^-l(ist)?$/;## only list files
+
+      if ($arg =~ m/^-(v+)$/) { ## verbosity
+	$VERBOSE =length($1);
+	foreach $len (1..$VERBOSE) { $opt{'-'.('v' x $len)}=1 }
+	next;
+      }
+      if ($arg =~ m/^-(n+)ice$/) { ## "nice" output
+        $NICE =length($1);
+	foreach $len (1..$NICE) { $opt{'-'.('n' x $len).'ice'}=1 }
+	next;
+      }
+
+      if ($arg =~ m/^-(i?)(d?)skip$/) {
+	  local($i) = $1 eq 'i';
+	  local($d) = $2 eq 'd';
+	  $! = 2, die qq/$0: expecting glob arg to -$arg\n/ unless @ARGV;
+	  foreach (split(/\s+/, shift @ARGV)) {
+	      if ($d) {
+		  $idskip{$_}=1 if $i;
+		   $dskip{$_}=1;
+	      } else {
+		  $iskip{$_}=1 if $i;
+		   $skip{$_}=1;
+	      }
+	  }
+	  next;
+      }
+
+
+      if ($arg =~ m/^-(i?)(d?)(regex|path|name)$/) {
+	  local($i) = $1 eq 'i';
+	  $! = 2, die qq/$0: expecting arg to -$arg\n/ unless @ARGV;
+	  foreach (split(/\s+/, shift @ARGV)) {
+	      $iname{join(',', $arg, $_)}=1 if $i;
+	       $name{join(',', $arg, $_)}=1;
+	  }
+	  next;
+      }
+
+      if ($arg =~ m/^-d?dir$/) {
+	  $opt{'-dir'}=1;
+	  $! = 2, die qq/$0: expecting filename arg to -$arg\n/ unless @ARGV;
+	  $start = shift(@ARGV);
+	  $start =~ s#^~(/+|$)#$ENV{'HOME'}$1# if defined $ENV{'HOME'};
+	  $! = 2, die qq/$0: can't find ${arg}'s "$start"\n/ unless -e $start;
+	  $! = 2, die qq/$0: ${arg}'s "$start" not a directory.\n/ unless -d _;
+	  undef(@todo), $opt{'-ddir'}=1 if $arg eq '-ddir';
+	  push(@todo, $start);
+	  next;
+      }
+
+      if ($arg =~ m/^-(new|old)er$/i) {
+	  $! = 2, die "$0: expecting filename arg to -$arg\n" unless @ARGV;
+	  local($file, $time) = shift(@ARGV);
+	  $! = 2, die qq/$0: can't stat -${arg}'s "$file"./
+		  unless $time = (stat($file))[$STAT_MTIME];
+	  local($upper) = $arg =~ tr/A-Z//;
+	  if ($arg =~ m/new/i) {
+	     $time++ unless $upper;
+	     $NEWER = $time if $NEWER < $time;
+	  } else {
+	     $time-- unless $upper;
+	     $OLDER = $time if $OLDER == 0 || $OLDER > $time;
+	  }
+	  next;
+      }
+
+      if ($arg =~ m/-mtime/) {
+	  $! = 2, die "$0: expecting numerical arg to -$arg\n" unless @ARGV;
+	  local($days) = shift(@ARGV);
+	  $! = 2, die qq/$0: inappropriate arg ($days) to $arg\n/ if $days==0;
+	  $days *= 3600 * 24;
+	  if ($days < 0) {
+	      local($time) = $^T + $days;
+	      $NEWER = $time if $NEWER < $time;
+	  } else {
+	      local($time) = $^T - $days;
+  	      $OLDER = $time if $OLDER == 0 || $OLDER > $time;
+	  }
+	  next;
+      }
+
+      ## special user options
+      if ($arg =~ m/^-x(.+)/) {
+	  foreach (split(/[\s,]+/, $1)) {  $user_opt{$_} = $opt{$_}= 1;  }
+	  next;
+      }
+
+      $! = 2, die "$0: unknown arg [$arg]\n";
+  }
+}
+
+##
+## Given a filename glob, return a regex.
+## If the glob has no globbing chars (no * ? or [..]), then
+## prepend an effective '*' to it.
+##
+sub glob_to_regex
+{
+    local($glob) = @_;
+    local(@parts) = $glob =~ m/\\.|[*?]|\[]?[^]]*]|[^[\\*?]+/g;
+    local($trueglob)=0;
+    foreach (@parts) {
+	if ($_ eq '*' || $_ eq '?') {
+	    $_ = ".$_";
+	    $trueglob=1;  ## * and ? are a real glob
+	} elsif (substr($_, 0, 1) eq '[') {
+	    $trueglob=1;  ## [..] is a real glob
+	} else {
+	    s/^\\//;     ## remove any leading backslash;
+	    s/\W/\\$&/g; ## now quote anything dangerous;
+	}
+    }
+    unshift(@parts, '.*') unless $trueglob;
+    join('', '^', @parts, '$');
+}
+
+sub prepare_to_search
+{
+  local($rc_file) = @_;
+
+  $HEADER_BYTES=0;          ## Might be set nonzero in &read_rc;
+  $last_message_length = 0; ## For &message and &clear_message.
+
+  &read_rc($rc_file, $showrc) unless $norc;
+  exit(0) if $showrc;
+
+  $NEXT_DIR_ENTRY = $DO_SORT ? 'shift @files' : 'readdir(DIR)';
+  $WHY = 1 if $VERBOSE > 3; ## Arg -vvvv or above implies  -why.
+  @todo = ('.') if @todo == 0; ## Where we'll start looking
+
+  ## see if any user options were specified that weren't accounted for
+  foreach $opt (keys %user_opt) {
+      next if defined $seen_opt{$opt};
+      warn "warning: -x$opt never considered.\n";
+  }
+
+  die "$0: multiple time constraints exclude all possible files.\n"
+      if ($NEWER && $OLDER) && ($NEWER > $OLDER);
+
+  ##
+  ## Process any -skip/-iskip args that had been given
+  ##
+  local(@skip_test);
+  foreach $glob (keys %skip) {
+      $i = defined($iskip{$glob}) ? 'i': '';
+      push(@skip_test, '$name =~ m/'. &glob_to_regex($glob). "/$i");
+  }
+  if (@skip_test) {
+      $SKIP_TEST = join('||',@skip_test);
+      $DO_SKIP_TEST = 1;
+  } else {
+      $DO_SKIP_TEST = $SKIP_TEST = 0;
+  }
+
+  ##
+  ## Process any -dskip/-idskip args that had been given
+  ##
+  local(@dskip_test);
+  foreach $glob (keys %dskip) {
+      $i = defined($idskip{$glob}) ? 'i': '';
+      push(@dskip_test, '$name =~ m/'. &glob_to_regex($glob). "/$i");
+  }
+  if (@dskip_test) {
+      $DSKIP_TEST = join('||',@dskip_test);
+      $DO_DSKIP_TEST = 1;
+  } else {
+      $DO_DSKIP_TEST = $DSKIP_TEST = 0;
+  }
+
+
+  ##
+  ## Process any -name, -path, -regex, etc. args that had been given.
+  ##
+  undef @name_test;
+  undef @dname_test;
+  foreach $key (keys %name) {
+      local($type, $pat) = split(/,/, $key, 2);
+      local($i) = defined($iname{$key}) ? 'i' : '';
+      if ($type =~ /regex/) {
+	  $pat =~ s/!/\\!/g;
+	  $test = "\$name =~ m!^$pat\$!$i";
+      } else {
+	  local($var) = $type eq 'name' ? '$name' : '$file';
+	  $test = "$var =~ m/". &glob_to_regex($pat). "/$i";
+      }
+      if ($type =~ m/^-i?d/) {
+	  push(@dname_test, $test);
+      } else {
+	  push(@name_test, $test);
+      }
+  }
+  if (@name_test) {
+      $GLOB_TESTS = join('||', @name_test);
+
+      $DO_GLOB_TESTS = 1;
+  } else {
+      $GLOB_TESTS = $DO_GLOB_TESTS = 0;
+  }
+  if (@dname_test) {
+      $DGLOB_TESTS = join('||', @dname_test);
+      $DO_DGLOB_TESTS = 1;
+  } else {
+      $DGLOB_TESTS = $DO_DGLOB_TESTS = 0;
+  }
+
+
+  ##
+  ## Process any 'magic' things from the startup file.
+  ##
+  if (@magic_tests && $HEADER_BYTES) {
+      ## the $magic' one is for when &dodir is not inlined
+      $tests = join('||',@magic_tests);
+      $MAGIC_TESTS = " { package magic; \$val = ($tests) }";
+      $DO_MAGIC_TESTS = 1;
+  } else {
+      $MAGIC_TESTS = 1;
+      $DO_MAGIC_TESTS = 0;
+  }
+
+  ##
+  ## Prepare regular expressions.
+  ##
+  {
+      local(@regex_tests);
+
+      if ($LIST_ONLY) {
+	 $mflag = '';
+	 ## need to have $* set, but perl5 just won''t shut up about it.
+	 if ($] >= 5) {
+	      $mflag = 'm';
+	 } else {
+	      eval ' $* = 1 ';
+	 }
+      }
+
+      ##
+      ## Until I figure out a better way to deal with it,
+      ## We have to worry about a regex like [^xyz] when doing $LIST_ONLY.
+      ## Such a regex *will* match \n, and if I'm pulling in multiple
+      ## lines, it can allow lines to match that would otherwise not match.
+      ##
+      ## Therefore, if there is a '[^' in a regex, we can NOT take a chance
+      ## an use the fast listonly.
+      ##
+      $CAN_USE_FAST_LISTONLY = $LIST_ONLY;
+
+      local(@extra);
+      local($underline_glue) = ($] >= 5) ? '(:?_\cH)?' : '(_\cH)?';
+      while (@ARGV) {
+          $regex = shift(@ARGV);
+	  ##
+	  ## If watching for underlined things too, add another regex.
+	  ##
+	  if ($underlineOK) {
+	     if ($regex =~ m/[?*+{}()\\.|^\$[]/) {
+		warn "$0: warning, can't underline-safe ``$regex''.\n";
+	     } else {
+		$regex = join($underline_glue, split(//, $regex));
+	     }
+	  }
+
+	  ## If nothing special in the regex, just use index...
+	  ## is quite a bit faster.
+	  if (($iflag eq '') && ($words == 0) &&
+			$regex !~ m/[?*+{}()\\.|^\$[]/)
+	  {
+	      push(@regex_tests, "(index(\$_, q+$regex+)>=0)");
+
+	  } else {
+	      $regex =~ s#[\$\@\/]\w#\\$&#;
+	      if ($words) {
+		  if ($regex =~ m/\|/) {
+		      ## could be dangerous -- see if we can wrap in parens.
+		      if ($regex =~ m/\\\d/) {
+			  warn "warning: -w and a | in a regex is dangerous.\n"
+		      } else {
+			  $regex = join($regex, '(', ')');
+		      }
+		  }
+		  $regex = join($regex, '\b', '\b');
+	      }
+	      $CAN_USE_FAST_LISTONLY = 0 if substr($regex, "[^") >= 0;
+	      push(@regex_tests, "m/$regex/$iflag$mflag");
+	  }
+
+	  ## If we're done, but still have @extra to do, get set for that.
+	  if (@ARGV == 0 && @extra) {
+	      @ARGV = @extra;   ## now deal with the extra stuff.
+	      $underlineOK = 0; ## but no more of this.
+	      undef @extra;     ## or this.
+	  }
+      }
+      if (@regex_tests) {
+	  $REGEX_TEST = join('||', @regex_tests);
+	  ## print STDERR $REGEX_TEST, "\n"; exit;
+      } else {
+	  ## must be doing -find -- just give something syntactically correct.
+	  $REGEX_TEST = 1;
+      }
+  }
+
+  ##
+  ## Make sure we can read the first item(s).
+  ##
+  foreach $start (@todo) {
+      $! = 2, die qq/$0: can't stat "$start"\n/
+	  unless ($dev,$inode) = (stat($start))[$STAT_DEV,$STAT_INODE];
+
+      if (defined $dir_done{"$dev,$inode"}) {
+	  ## ignore the repeat.
+	  warn(qq/ignoring "$start" (same as "$dir_done{"$dev,$inode"}").\n/)
+		if $VERBOSE;
+	  next;
+      }
+
+      ## if -xdev was given, remember the device.
+      $xdev{$dev} = 1 if $XDEV;
+
+      ## Note that we won't want to do it again
+      $dir_done{"$dev,$inode"} = $start;
+  }
+}
+
+
+##
+## See the comment above the __END__ above the 'sub dodir' below.
+##
+sub import_program
+{
+    sub bad {
+	print STDERR "$0: internal error (@_)\n";
+	exit 2;
+    }
+
+    ## Read from data, up to next __END__. This will be &dodir.
+    local($/) = "\n__END__";
+    $prog = <DATA>;
+    close(DATA);
+
+    $prog =~ s/\beval\b//g;       ## remove any 'eval'
+
+    ## Inline uppercase $-variables by their current values.
+    if ($] >= 5) {
+	$prog =~ s/\$([A-Z][A-Z0-9_]{2,}\b)/
+		    &bad($1) if !defined ${$main::{$1}}; ${$main::{$1}};/eg;
+    } else {
+	$prog =~ s/\$([A-Z][A-Z0-9_]{2,}\b)/local(*VAR) = $_main{$1};
+		    &bad($1) if !defined $VAR; $VAR;/eg;
+    }
+
+    eval $prog;  ## now do it. This will define &dodir;
+    $!=2, die "$0 internal error: $@\n" if $@;
+}
+
+###########################################################################
+
+##
+## Read the .search file:
+##    Blank lines and lines that are only #-comments ignored.
+##    Newlines may be escaped to create long lines
+##    Other lines are directives.
+##
+##    A directive may begin with an optional tag in the form <...>
+##    Things inside the <...> are evaluated as with:
+##	   <(this || that) && must>
+##    will be true if
+##       -xmust -xthis   or   -xmust -xthat
+##    were specified on the command line (order doesn't matter, though)
+##    A directive is not done if there is a tag and it's false.
+##    Any characters but whitespace and &|()>,! may appear after an -x
+##    (although "-xdev" is special).  -xmust,this is the same as -xmust -xthis.
+##    Something like -x~ would make <~> true, and <!~> false.
+##
+##    Directives are in the form:
+##      option: STRING
+##	magic : NUMBYTES : EXPR
+##
+##    With option:
+##      The STRING is parsed like a Bourne shell command line, and the
+##      options are used as if given on the command line.
+##      No comments are allowed on 'option' lines.
+##	Examples:
+##	    # skip objects and libraries
+##	    option: -skip '.o .a'
+##	    # skip emacs *~ and *# files, unless -x~ given:
+##	    <!~> option: -skip '~ #'
+##
+##    With magic:
+##	EXPR can be pretty much any perl (comments allowed!).
+##      If it evaluates to true for any particular file, it is skipped.
+##      The only info you'll have about a file is the variable $H, which
+##      will have at least the first NUMBYTES of the file (less if the file
+##      is shorter than that, of course, and maybe more). You'll also have
+##      any variables you set in previous 'magic' lines.
+##	Examples:
+##	    magic: 6 : ($x6 = substr($H, 0, 6)) eq 'GIF87a'
+##	    magic: 6 :  $x6                     eq 'GIF89a'
+##
+##          magic: 6 : (($x6 = substr($H, 0, 6)) eq 'GIF87a' ## old gif \
+##		                         || $x6  eq 'GIF89a' ## new gif
+##	(the above two sets are the same)
+##	    ## Check the first 32 bytes for "binarish" looking bytes.
+##	    ## Don't blindly dump on any high-bit set, as non-ASCII text
+##	    ## often has them set. \x80 and \xff seem to be special, though.
+##	    ## Require two in a row to not get things like perl's $^T.
+##	    ## This is known to get *.Z, *.gz, pkzip, *.elc and about any
+##	    ## executable you'll find.
+##	    magic: 32 : $H =~ m/[\x00-\x06\x10-\x1a\x1c-\x1f\x80\xff]{2}/
+##
+sub read_rc
+{
+    local($file, $show) = @_;
+    local($line_num, $ln, $tag) = 0;
+    local($use_default, @default) = 0;
+
+    { package magic; $^W= 0; } ## turn off warnings for when we run EXPR's
+
+    unless (open(RC, "$file")) {
+	$use_default=1;
+	$file = "<internal default startup file>";
+	## no RC file -- use this default.
+	@default = split(/\n/,<<'--------INLINE_LITERAL_TEXT');
+            magic: 32 : $H =~ m/[\x00-\x06\x10-\x1a\x1c-\x1f\x80\xff]{2}/
+	    option: -skip '.a .elc .gz .o .pbm .xbm .dvi'
+	    option: -iskip '.com .exe .lib .pdb .tarz .zip .z .lzh .jpg .jpeg .gif .uu'
+	    <!~> option: -skip '~ #'
+--------INLINE_LITERAL_TEXT
+    }
+
+    ##
+    ## Make an eval error pretty.
+    ##
+    sub clean_eval_error {
+	local($_) = @_;
+	s/ in file \(eval\) at line \d+,//g; ## perl4-style error
+	s/ at \(eval \d+\) line \d+,//g;     ## perl5-style error
+	$_ = $` if m/\n/;                    ## remove all but first line
+	"$_\n";
+    }
+
+    print "reading RC file: $file\n" if $show;
+
+    while (defined($_ = ($use_default ? shift(@default) : <RC>))) {
+	$ln = ++$line_num;			     ## note starting line num.
+        $_ .= <RC>, $line_num++ while s/\\\n?$/\n/;  ## allow continuations
+	next if /^\s*(#.*)?$/;          ## skip blank or comment-only lines.
+        $do = '';
+	
+	## look for an initial <...> tag.
+	if (s/^\s*<([^>]*)>//) {
+	    ## This simple s// will make the tag ready to eval.
+	    ($tag = $msg = $1) =~
+		s/[^\s&|(!)]+/
+			$seen_opt{$&}=1;         ## note seen option
+			"defined(\$opt{q>$&>})"  ## (q>> is safe quoting here)
+		/eg;
+	    
+	    ## see if the tag is true or not, abort this line if not.
+	    $dothis = (eval $tag);
+	    $!=2, die "$file $ln <$msg>: $_".&clean_eval_error($@) if $@;
+
+	    if ($show) {
+	        $msg =~ s/[^\s&|(!)]+/-x$&/;
+	        $msg =~ s/\s*!\s*/ no /g;
+	        $msg =~ s/\s*&&\s*/ and /g;
+	        $msg =~ s/\s*\|\|\s*/ or /g;
+		$msg =~ s/^\s+//; $msg =~ s/\s+$//;
+		$do = $dothis ? "(doing because $msg)" :
+				"(do if $msg)";
+	    } elsif (!$dothis) {
+	        next;
+	    }
+	}
+
+	if (m/^\s*option\s*:\s*/) {
+	    next if $all && !$show; ## -all turns off these checks;
+	    local($_) = $';
+            s/\n$//;
+	    local($orig) = $_;
+	    print " $do option: $_\n" if $show;
+	    local($0) = "$0 ($file)"; ## for any error message.
+	    local(@ARGV);
+	    local($this);
+	    ##
+	    ## Parse $_ as a Bourne shell line -- fill @ARGV
+	    ##
+	    while (length) {
+		if (s/^\s+//) {
+		    push(@ARGV, $this) if defined $this;
+		    undef $this;
+		    next;
+		}
+		$this = '' if !defined $this;
+		$this .= $1 while s/^'([^']*)'// ||
+				  s/^"([^"]*)"// ||
+				  s/^([^'"\s\\]+)//||
+				  s/^(\\[\D\d])//;
+		die "$file $ln: error parsing $orig at $_\n" if m/^\S/;
+	    }
+	    push(@ARGV, $this) if defined $this;
+	    &check_args;
+	    die qq/$file $ln: unused arg "@ARGV".\n/ if @ARGV;
+	    next;
+	}
+
+	if (m/^\s*magic\s*:\s*(\d+)\s*:\s*/) {
+	    next if $all && !$show; ## -all turns off these checks;
+	    local($bytes, $check) = ($1, $');
+
+	    if ($show) {
+		$check =~ s/\n?$/\n/;
+		print " $do contents: $check";
+	    }
+	    ## Check to make sure the thing at least compiles.
+	    eval  "package magic; (\$H = '1'x \$main'bytes) && (\n$check\n)\n";
+	    $! = 2, die "$file $ln: ".&clean_eval_error($@) if $@;
+
+	    $HEADER_BYTES = $bytes if $bytes > $HEADER_BYTES;
+	    push(@magic_tests, "(\n$check\n)");
+	    next;
+	}
+	$! = 2, die "$file $ln: unknown command\n";
+    }
+    close(RC);
+}
+
+sub message
+{
+    if (!$STDERR_IS_TTY) {
+	print STDERR $_[0], "\n";
+    } else {
+	local($text) = @_;
+	$thislength = length($text);
+	if ($thislength >= $last_message_length) {
+	    print STDERR $text, "\r";
+	} else {
+	    print STDERR $text, ' 'x ($last_message_length-$thislength),"\r";
+	}	
+	$last_message_length = $thislength;
+    }
+}
+
+sub clear_message
+{
+    print STDERR ' ' x $last_message_length, "\r" if $last_message_length;
+    $vv_print = $vv_size = $last_message_length = 0;
+}
+
+##
+## Output a copy of this program with comments, extra whitespace, and
+## the trailing man page removed. On an ultra slow machine, such a copy
+## might load faster (but I can't tell any difference on my machine).
+##
+sub strip {
+    seek(DATA, 0, 0) || die "$0: can't reset internal pointer.\n";
+    while(<DATA>) {
+      print, next if /INLINE_LITERAL_TEXT/.../INLINE_LITERAL_TEXT/;
+      ## must mention INLINE_LITERAL_TEXT on this line!
+      s/\#\#.*|^\s+|\s+$//; ## remove cruft
+      last if $_ eq '.00;';
+      next if ($_ eq '') || ($_ eq "'di'") || ($_ eq "'ig00'");
+      s/\$stripped=0;/\$stripped=1;/;
+      s/\s\s+/ /;  ## squish multiple whitespaces down to one.
+      print $_, "\n";
+    }
+    exit(0);
+}
+
+##
+## Just to shut up -w. Never executed.
+##
+sub dummy {
+
+    1 || &dummy || &dir_done || &bad || &message || $NEXT_DIR_ENTRY ||
+    $DELAY || $VV_SIZE || $VV_PRINT_COUNT || $STDERR_SCREWS_STDOUT ||
+    @files || @files || $magic'H || $magic'H || $xdev{''} || &clear_message;
+
+}
+
+##
+## If the following __END__ is in place, what follows will be
+## inlined when the program first starts up. Any $ variable name
+## all in upper case, specifically, any string matching
+##	\$([A-Z][A-Z0-9_]{2,}\b
+## will have the true value for that variable inlined. Also, any 'eval' is
+## removed
+##
+## The idea is that when the whole thing is then eval'ed to define &dodir,
+## the perl optimizer will make all the decisions that are based upon
+## command-line options (such as $VERBOSE), since they'll be inlined as
+## constants
+##
+## Also, and here's the big win, the tests for matching the regex, and a
+## few others, are all inlined. Should be blinding speed here.
+##
+## See the read from <DATA> above for where all this takes place.
+## But all-in-all, you *want* the __END__ here. Comment it out only for
+## debugging....
+##
+
+__END__
+
+##
+## Given a directory, check all "appropriate" files in it.
+## Shove any subdirectories into the global @todo, so they'll be done
+## later.
+##
+## Be careful about adding any upper-case variables, as they are subject
+## to being inlined. See comments above the __END__ above.
+##
+sub dodir
+{
+  local($dir) = @_;
+  $dir =~ s,/+$,,; ## remove any trailing slash.
+  unless (opendir(DIR, "$dir/.")) {
+      &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT;
+      warn qq($0: can't opendir "$dir/".\n);
+      return;
+  }
+
+  if ($VERBOSE) {
+      &message($dir);
+      $vv_print = $vv_size = 0;
+  }
+
+  @files = sort readdir(DIR) if $DO_SORT;
+
+  while (defined($name = eval $NEXT_DIR_ENTRY))
+  {
+    next if $name eq '.' || $name eq '..'; ## never follow these.
+
+    ## create full relative pathname.
+    $file = $dir eq '.' ? $name : "$dir/$name";
+
+    ## if link and skipping them, do so.
+    if ($NOLINKS && -l $file) {
+	warn qq/skip (symlink): $file\n/ if $WHY;
+	next;
+    }
+
+    ## skip things unless files or directories
+    unless (-f $file || -d _) {
+	if ($WHY) {
+	    $why = (-S _ && "socket")       ||
+		   (-p _ && "pipe")         ||
+		   (-b _ && "block special")||
+		   (-c _ && "char special") || "somekinda special";
+	    warn qq/skip ($why): $file\n/;
+	}
+	next;
+    }
+
+    ## skip things we can't read
+    unless (-r _) {
+	if ($WHY) {
+	    $why = (-l $file) ? "follow" : "read";
+	    warn qq/skip (can't $why): $file\n/;
+	}
+	next;
+    }
+
+    ## skip things that are empty
+    unless (-s _ || -d _) {
+	warn qq/skip (empty): $file\n/ if $WHY;
+	next;
+    }
+
+    ## Note file device & inode. If -xdev, skip if appropriate.
+    ($dev, $inode) = (stat(_))[$STAT_DEV, $STAT_INODE];
+    if ($XDEV && defined $xdev{$dev}) {
+	warn qq/skip (other device): $file\n/ if $WHY;
+	next;
+    }
+    $id = "$dev,$inode";
+
+    ## special work for a directory
+    if (-d _) {
+	## Do checks for directory file endings.
+	if ($DO_DSKIP_TEST && (eval $DSKIP_TEST)) {
+	    warn qq/skip (-dskip): $file\n/ if $WHY;
+	    next;
+	}
+	## do checks for -name/-regex/-path tests
+	if ($DO_DGLOB_TESTS && !(eval $DGLOB_TESTS)) {
+	    warn qq/skip (dirname): $file\n/ if $WHY;
+	    next;
+	}
+
+	## _never_ redo a directory
+	if (defined $dir_done{$id} and $^O ne 'MSWin32') {
+	    warn qq/skip (did as "$dir_done{$id}"): $file\n/ if $WHY;
+	    next;
+	}
+	$dir_done{$id} = $file;     ## mark it done.
+	unshift(@todo, $file);	    ## add to the list to do.
+	next;
+    }
+    if ($WHY == 0  && $VERBOSE > 1) {
+      if ($VERBOSE>2||$vv_print++>$VV_PRINT_COUNT||($vv_size+=-s _)>$VV_SIZE){
+	  &message($file);
+	  $vv_print = $vv_size = 0;
+      }
+    }
+
+    ## do time-related tests
+    if ($NEWER || $OLDER) {
+	$_ = (stat(_))[$STAT_MTIME];
+	if ($NEWER && $_ < $NEWER) {
+	    warn qq/skip (too old): $file\n/ if $WHY;
+	    next;
+	}
+	if ($OLDER && $_ > $OLDER) {
+	    warn qq/skip (too new): $file\n/ if $WHY;
+	    next;
+	}
+    }
+
+    ## do checks for file endings
+    if ($DO_SKIP_TEST && (eval $SKIP_TEST)) {
+	warn qq/skip (-skip): $file\n/ if $WHY;
+	next;
+    }
+
+    ## do checks for -name/-regex/-path tests
+    if ($DO_GLOB_TESTS && !(eval $GLOB_TESTS)) {
+	warn qq/skip (filename): $file\n/ if $WHY;
+	next;
+    }
+
+
+    ## If we're not repeating files,
+    ##	skip this one if we've done it, or note we're doing it.
+    unless ($DOREP) {
+	if (defined $file_done{$id}) {
+	    warn qq/skip (did as "$file_done{$id}"): $file\n/ if $WHY;
+	    next;
+	}
+	$file_done{$id} = $file;
+    }
+
+    if ($DO_MAGIC_TESTS) {
+	if (!open(FILE_IN, $file)) {
+	    &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT;
+	    warn qq/$0: can't open: $file\n/;
+	    next;
+	}
+	unless (read(FILE_IN, $magic'H, $HEADER_BYTES)) {
+	    &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT;
+	    warn qq/$0: can't read from "$file"\n"/;
+	    close(FILE_IN);
+	    next;
+	}
+
+	eval $MAGIC_TESTS;
+	if ($magic'val) {
+	    close(FILE_IN);
+	    warn qq/skip (magic): $file\n/ if $WHY;
+	    next;
+	}
+	seek(FILE_IN, 0, 0);  ## reset for later <FILE_IN>
+    }
+
+    if ($WHY != 0  && $VERBOSE > 1) {
+      if ($VERBOSE>2||$vv_print++>$VV_PRINT_COUNT||($vv_size+=-s _)>$VV_SIZE){
+	  &message($file);
+	  $vv_print = $vv_size = 0;
+      }
+    }
+
+    if ($DELAY) {
+	sleep($DELAY);
+    }
+
+    if ($FIND_ONLY) {
+	&clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT;
+	print $file, "\n";
+	$retval=0; ## we've found something
+	close(FILE_IN) if $DO_MAGIC_TESTS;
+	next;
+    } else {
+	## if we weren't doing magic tests, file won't be open yet...
+	if (!$DO_MAGIC_TESTS && !open(FILE_IN, $file)) {
+	    &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT;
+	    warn qq/$0: can't open: $file\n/;
+	    next;
+	}
+	if ($LIST_ONLY && $CAN_USE_FAST_LISTONLY) {
+	    ##
+	    ## This is rather complex, but buys us a LOT when we're just
+	    ## listing files and not the individual internal lines.
+	    ##
+	    local($size) = 4096;  ## block-size in which to do reads
+	    local($nl);           ## will point to $_'s ending newline.
+	    local($read);	  ## will be how many bytes read.
+	    local($_) = '';       ## Starts out empty
+	    local($hold);	  ## (see below)
+
+	    while (($read = read(FILE_IN,$_,$size,length($_)))||length($_))
+	    {
+		undef @parts;
+		## if read a full block, but no newline, need to read more.
+		while ($read == $size && ($nl = rindex($_, "\n")) < 0) {
+		    push(@parts, $_);                    ## save that part
+		    $read = read(FILE_IN, $_, $size); ## keep trying
+		}
+
+		##
+		## If we had to save parts, must now combine them together.
+		## adjusting $nl to reflect the now-larger $_. This should
+		## be a lot more efficient than using any kind of .= in the
+		## loop above.
+		##
+		if (@parts) {
+		    local($lastlen) = length($_); #only need if $nl >= 0
+		    $_ = join('', @parts, $_);
+		    $nl = length($_) - ($lastlen - $nl) if $nl >= 0;
+		}
+
+		##
+		## If we're at the end of the file, then we can use $_ as
+		## is.  Otherwise, we need to remove the final partial-line
+		## and save it so that it'll be at the beginning of the
+		## next read (where the rest of the line will be layed in
+		## right after it).  $hold will be what we should save
+		## until next time.
+		##
+		if ($read != $size || $nl < 0) {
+		    $hold = '';
+		} else {
+		    $hold = substr($_, $nl + 1);
+		    substr($_, $nl + 1) = '';
+		}
+
+		##
+		## Now have a bunch of full lines in $_. Use it.
+		##
+		if (eval $REGEX_TEST) {
+		    &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT;
+		    print $file, "\n";
+		    $retval=0; ## we've found something
+
+		    last;
+		}
+
+		## Prepare for next read....
+		$_ = $hold;
+	    }
+
+	} else {  ## else not using faster block scanning.....
+
+            $lines_printed = 0 if $NICE;
+	    while (<FILE_IN>) {
+		study;
+		next unless (eval $REGEX_TEST);
+
+		##
+		## We found a matching line.
+		##
+		$retval=0;
+		&clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT;
+		if ($LIST_ONLY) {
+		    print $file, "\n";
+		    last;
+		} else {
+		    ## prepare to print line.
+		    if ($NICE && $lines_printed++ == 0) {
+			print '-' x 70, "\n" if $NICE > 1;
+			print $file, ":\n";
+		    }
+
+		    ##
+		    ## Print all the prelim stuff. This looks less efficient
+		    ## than it needs to be, but that's so that when the eval
+		    ## is compiled (and the tests are optimized away), the
+		    ## result will be less actual PRINTs than the more natural
+		    ## way of doing these tests....
+		    ##
+		    if ($NICE) {
+			if ($REPORT_LINENUM) {
+			    print " line $.:  ";
+			} else {
+			    print "  ";
+			}
+		    } elsif ($REPORT_LINENUM && $PREPEND_FILENAME) {
+			print "$file,:$.: ";
+		    } elsif ($PREPEND_FILENAME) {
+			print "$file: ";
+		    } elsif ($REPORT_LINENUM) {
+			print "$.: ";
+		    }
+		    print $_;
+		    print "\n" unless m/\n$/;
+		}
+	    }
+	    print "\n" if ($NICE > 1) && $lines_printed;
+	}
+	close(FILE_IN);
+    }
+  }
+  closedir(DIR);
+}
+
+__END__
+.00;			## finish .ig
+ 
+'di			\" finish diversion--previous line must be blank
+.nr nl 0-1		\" fake up transition to first page again
+.nr % 0			\" start at page 1
+.\"__________________NORMAL_MAN_PAGE_BELOW_________________
+.ll+10n
+.TH search 1 "Dec 17, 1994"
+.SH SEARCH
+search \- search files (a'la grep) in a whole directory tree.
+.SH SYNOPSIS
+search [ grep-like and find-like options] [regex ....]
+.SH DESCRIPTION
+.I Search
+is more or less a combo of 'find' and 'grep' (although the regular
+expression flavor is that of the perl being used, which is closer to
+egrep's than grep's).
+
+.I Search
+does generally the same kind of thing that
+.nf
+   find <blah blah> | xargs egrep <blah blah>
+.fi
+does, but is
+.I much
+more powerful and efficient (and intuitive, I think).
+
+This manual describes
+.I search
+as of version "941227.4". You can always find the latest version at
+.nf
+   http://www.wg.omron.co.jp/~jfriedl/perl/index.html
+.fi
+
+.SH "QUICK EXAMPLE"
+Basic use is simple:
+.nf
+    % search jeff
+.fi
+will search files in the current directory, and all sub directories, for
+files that have "jeff" in them. The lines will be listed with the
+containing file's name prepended.
+.PP
+If you list more than one regex, such as with
+.nf
+    % search jeff Larry Randal+ 'Stoc?k' 'C.*son'
+.fi
+then a line containing any of the regexes will be listed.
+This makes it effectively the same as
+.nf
+    % search 'jeff|Larry|Randal+|Stoc?k|C.*son'
+.fi
+However, listing them separately is much more efficient (and is easier
+to type).
+.PP
+Note that in the case of these examples, the
+.B \-w
+(list whole-words only) option would be useful.
+.PP
+Normally, various kinds of files are automatically removed from consideration.
+If it has has a certain ending (such as ".tar", ".Z", ".o", .etc), or if
+the beginning of the file looks like a binary, it'll be excluded.
+You can control exactly how this works -- see below. One quick way to
+override this is to use the
+.B \-all
+option, which means to consider all the files that would normally be
+automatically excluded.
+Or, if you're curious, you can use
+.B \-why
+to have notes about what files are skipped (and why) printed to stderr.
+
+.SH "BASIC OVERVIEW"
+Normally, the search starts in the current directory, considering files in
+all subdirectories.
+
+You can use the
+.I ~/.search
+file to control ways to automatically exclude files.
+If you don't have this file, a default one will kick in, which automatically
+add
+.nf
+    -skip .o .Z .gif
+.fi
+(among others) to exclude those kinds of files (which you probably want to
+skip when searching for text, as is normal).
+Files that look to be be binary will also be excluded.
+
+Files ending with "#" and "~" will also be excluded unless the
+.B -x~
+option is given. 
+
+You can use
+.B -showrc
+to show what kinds of files will normally be skipped.
+See the section on the startup file
+for more info.
+
+You can use the
+.B -all
+option to indicate you want to consider all files that would otherwise be
+skipped by the startup file.
+
+Based upon various other flags (see "WHICH FILES TO CONSIDER" below),
+more files might be removed from consideration. For example
+.nf
+    -mtime 3
+.fi
+will exclude files that aren't at least three days old (change the 3 to -3
+to exclude files that are more than three days old), while
+.nf
+    -skip .*
+.fi
+would exclude any file beginning with a dot (of course, '.' and '..'  are
+special and always excluded).
+
+If you'd like to see what files are being excluded, and why, you can get the
+list via the
+.B \-why
+option.
+
+If a file makes it past all the checks, it is then "considered".
+This usually means it is greped for the regular expressions you gave
+on the command line.
+
+If any of the regexes match a line, the line is printed.
+However, if
+.B -list
+is given, just the filename is printed. Or, if
+.B -nice
+is given, a somewhat more (human-)readable output is generated.
+
+If you're searching a huge tree and want to keep informed about how
+the search is progressing,
+.B -v
+will print (to stderr) the current directory being searched.
+Using
+.B -vv
+will also print the current file "every so often", which could be useful
+if a directory is huge. Using
+.B -vvv
+will print the update with every file.
+
+Below is the full listing of options.
+
+.SH "OPTIONS TELLING *WHERE* TO SEARCH"
+.TP
+.BI -dir " DIR"
+Start searching at the named directory instead of the current directory.
+If multiple
+.B -dir
+arguments are given, multiple trees will be searched.
+.TP
+.BI -ddir " DIR"
+Like
+.B -dir
+except it flushes any previous
+.B -dir
+directories (i.e. "-dir A -dir B -dir C" will search A, B, and C, while
+"-dir A -ddir B -dir C" will search only B and C. This might be of use
+in the startup file (see that section below).
+.TP
+.B -xdev
+Stay on the same filesystem as the starting directory/directories.
+.TP
+.B -sort
+Sort the items in a directory before processing them.
+Normally they are processed in whatever order they happen to be read from
+the directory.
+.TP
+.B -nolinks
+Don't follow symbolic links. Normally they're followed.
+
+.SH "OPTIONS CONTROLLING WHICH FILES TO CONSIDER AND EXCLUDE"
+.TP
+.BI -mtime " NUM"
+Only consider files that were last changed more than
+.I NUM
+days ago
+(less than
+.I NUM
+days if
+.I NUM
+has '-' prepended, i.e. "-mtime -2.5" means to consider files that
+have been changed in the last two and a half days).
+.TP
+.B -older FILE
+Only consider files that have not changed since
+.I FILE
+was last changed.
+If there is any upper case in the "-older", "or equal" is added to the sense
+of the test.  Therefore, "search -older ./file regex" will never consider
+"./file", while "search -Older ./file regex" will.
+
+If a file is a symbolic link, the time used is that of the file and not the
+link.
+.TP
+.BI -newer " FILE"
+Opposite of
+.BR -older .
+.TP
+.BI -name " GLOB"
+Only consider files that match the shell filename pattern
+.IR GLOB .
+The check is only done on a file's name (use
+.B -path
+to check the whole path, and use
+.B -dname
+to check directory names).
+
+Multiple specifications can be given by separating them with spaces, a'la
+.nf
+    -name '*.c *.h'
+.fi
+to consider C source and header files.
+If
+.I GLOB
+doesn't contain any special pattern characters, a '*' is prepended.
+This last example could have been given as
+.nf
+   -name '.c .h'
+.fi
+It could also be given as
+.nf
+    -name .c -name .h
+.fi
+or
+.nf
+    -name '*.c' -name '*.h'
+.fi
+or
+.nf
+    -name '*.[ch]'
+.fi
+(among others)
+but in this last case, you have to be sure to supply the leading '*'.
+.TP
+.BI -path " GLOB"
+Like
+.B -name
+except the entire path is checked against the pattern.
+.TP
+.B -regex " REGEX"
+Considers files whose names (not paths) match the given perl regex
+exactly.
+.TP
+.BI -iname " GLOB"
+Case-insensitive version of
+.BR -name .
+.TP
+.BI -ipath " GLOB"
+Case-insensitive version of
+.BR -path .
+.TP
+.BI -iregex " REGEX"
+Case-insensitive version of
+.BR -regex .
+
+.TP
+.BI -dpath " GLOB"
+Only search down directories whose path matches the given pattern (this
+doesn't apply to the initial directory given by
+.BI -dir ,
+of course).
+Something like
+.nf
+    -dir /usr/man -dpath /usr/man/man*
+.fi
+would completely skip
+"/usr/man/cat1", "/usr/man/cat2", etc.
+.TP
+.BI -dskip " GLOB"
+Skips directories whose name (not path) matches the given pattern.
+Something like
+.nf
+    -dir /usr/man -dskip cat*
+.fi
+would completely skip any directory in the tree whose name begins with "cat"
+(including "/usr/man/cat1", "/usr/man/cat2", etc.).
+.TP
+.BI -dregex " REGEX"
+Like
+.BI -dpath ,
+but the pattern is a full perl regex. Note that this quite different
+from
+.B -regex
+which considers only file names (not paths). This option considers
+full directory paths (not just names). It's much more useful this way.
+Sorry if it's confusing.
+.TP
+.BI -dpath " GLOB"
+This option exists, but is probably not very useful. It probably wants to
+be like the '-below' or something I mention in the "TODO" section.
+.TP
+.BI -idpath " GLOB"
+Case-insensitive version of
+.BR -dpath .
+.TP
+.BI -idskip " GLOB"
+Case-insensitive version of
+.BR -dskip .
+.TP
+.BI -idregex " REGEX"
+Case-insensitive version of
+.BR -dregex .
+.TP
+.B -all
+Ignore any 'magic' or 'option' lines in the startup file.
+The effect is that all files that would otherwise be automatically
+excluded are considered.
+.TP
+.BI -x SPECIAL
+Arguments starting with
+.B -x
+(except
+.BR -xdev ,
+explained elsewhere) do special interaction with the
+.I ~/.search
+startup file. Something like
+.nf
+	-xflag1 -xflag2
+.fi
+will turn on "flag1" and "flag2" in the startup file (and is
+the same as "-xflag1,flag2"). You can use this to write your own
+rules for what kinds of files are to be considered.
+
+For example, the internal-default startup file contains the line
+.nf
+	<!~> option: -skip '~ #'
+.fi
+This means that if the
+.B -x~
+flag is
+.I not
+seen, the option
+.nf
+    -skip '~ #'
+.fi
+should be done.
+The effect is that emacs temp and backup files are not normally
+considered, but you can included them with the -x~ flag.
+
+You can write your own rules to customize
+.I search
+in powerful ways. See the STARTUP FILE section below.
+.TP
+.B -why
+Print a message (to stderr) when and why a file is not considered.
+
+.SH "OPTIONS TELLING WHAT TO DO WITH FILES THAT WILL BE CONSIDERED"
+.TP
+.B -find
+(you can use
+.B -f
+as well).
+This option changes the basic action of
+.IR search .
+
+Normally, if a file is considered, it is searched
+for the regular expressions as described earlier. However, if this option
+is given, the filename is printed and no searching takes place. This turns
+.I search
+into a 'find' of some sorts.
+
+In this case, no regular expressions are needed on the command line
+(any that are there are silently ignored).
+
+This is not intended to be a replacement for the 'find' program,
+but to aid
+you in understanding just what files are getting past the exclusion checks.
+If you really want to use it as a sort of replacement for the 'find' program,
+you might want to use
+.B -all
+so that it doesn't waste time checking to see if the file is binary, etc
+(unless you really want that, of course).
+
+If you use
+.BR -find ,
+none of the "GREP-LIKE OPTIONS" (below) matter.
+
+As a replacement for 'find',
+.I search
+is probably a bit slower (or in the case of GNU find, a lot slower --
+GNU find is
+.I unbelievably
+fast).
+However, "search -ffind"
+might be more useful than 'find' when options such as
+.B -skip
+are used (at least until 'find' gets such functionality).
+.TP
+.B -ffind
+(or
+.BR -ff )
+A faster more 'find'-like find. Does
+.nf
+    -find  -all -dorep
+.fi
+.SH "GREP-LIKE OPTIONS"
+These options control how a searched file is accessed,
+and how things are printed.
+.TP
+.B -i
+Ignore letter case when matching.
+.TP
+.B -w
+Consider only whole-word matches ("whole word" as defined by perl's "\\b"
+regex).
+.TP
+.B -u
+If the regex(es) is/are simple, try to modify them so that they'll work
+in manpage-like underlined text (i.e. like _^Ht_^Hh_^Hi_^Hs).
+This is very rudimentary at the moment.
+.TP
+.B -list
+(you can use
+.B -l
+too).
+Don't print matching lines, but the names of files that contain matching
+lines. This will likely be *much* faster, as special optimizations are
+made -- particularly with large files.
+.TP
+.B -n
+Pepfix each line by its line number.
+.TP
+.B -nice
+Not a grep-like option, but similar to
+.BR -list ,
+so included here.
+.B -nice
+will have the output be a bit more human-readable, with matching lines printed
+slightly indented after the filename, a'la
+.nf
+
+   % search foo
+   somedir/somefile: line with foo in it
+   somedir/somefile: some food for thought
+   anotherdir/x: don't be a buffoon!
+   %
+
+.fi
+will become
+.nf
+
+   % search -nice foo
+   somedir/somefile:
+     line with foo in it
+     some food for thought
+   anotherdir/x:
+     don't be a buffoon!
+   %
+
+.fi
+This option due to Lionel Cons.
+.TP
+.B -nnice
+Be a bit nicer than
+.BR -nice .
+Prefix each file's output by a rule line, and follow with an extra blank line.
+.TP
+.B -h
+Don't prepend each output line with the name of the file
+(meaningless when
+.B -find
+or
+.B -l
+are given).
+
+.SH "OTHER OPTIONS"
+.TP
+.B -help
+Print the usage information.
+.TP
+.B -version
+Print the version information and quit.
+.TP
+.B -v
+Set the level of message verbosity.
+.B -v
+will print a note whenever a new directory is entered.
+.B -vv
+will also print a note "every so often". This can be useful to see
+what's happening when searching huge directories.
+.B -vvv
+will print a new with every file.
+.B -vvvv
+is
+-vvv
+plus
+.BR -why .
+.TP
+.B -e
+This ends the options, and can be useful if the regex begins with '-'.
+.TP
+.B -showrc
+Shows what is being considered in the startup file, then exits.
+.TP
+.B -dorep
+Normally, an identical file won't be checked twice (even with multiple
+hard or symbolic links). If you're just trying to do a fast
+.BR -find ,
+the bookkeeping to remember which files have been seen is not desirable,
+so you can eliminate the bookkeeping with this flag.
+
+.SH "STARTUP FILE"
+When
+.I search
+starts up, it processes the directives in
+.IR ~/.search .
+If no such file exists, a default
+internal version is used.
+
+The internal version looks like:
+.nf
+
+   magic: 32 : $H =~ m/[\ex00-\ex06\ex10-\ex1a\ex1c-\ex1f\ex80\exff]{2}/
+   option: -skip '.a .COM .elc .EXE .gz .o .pbm .xbm .dvi'
+   option: -iskip '.tarz .zip .z .lzh .jpg .jpeg .gif .uu'
+   <!~> option: -skip '~ #'
+
+.fi
+If you wish to create your own "~/.search",
+you might consider copying the above, and then working from there.
+
+There are two kinds of directives in a startup file: "magic" and "option".
+.RS 0n
+.TP
+OPTION
+Option lines will automatically do the command-line options given.
+For example, the line
+.nf
+	option: -v
+.fi
+in you startup file will turn on -v every time, without needing to type it
+on the command line.
+
+The text on the line after the "option:" directive is processed
+like the Bourne shell, so make sure to pay attention to quoting.
+.nf
+	option: -skip .exe .com
+.fi
+will give an error (".com" by itself isn't a valid option), while
+.nf
+	option: -skip ".exe .com"
+.fi
+will properly include it as part of -skip's argument.
+
+.TP
+MAGIC
+Magic lines are used to determine if a file should be considered a binary
+or not (the term "magic" refers to checking a file's magic number).  These
+are described in more detail below.
+.RE
+
+Blank lines and comments (lines beginning with '#') are allowed.
+
+If a line begins with  <...>, then it's a check to see if the
+directive on the line should be done or not. The stuff inside the <...>
+can contain perl's && (and), || (or), ! (not), and parens for grouping,
+along with "flags" that might be indicated by the user with
+.BI -x flag
+options.
+
+For example, using "-xfoo" will cause "foo" to be true inside the <...>
+blocks. Therefore, a line beginning with "<foo>" would be done only when
+"-xfoo" had been specified, while a line beginning with "<!foo>" would be
+done only when "-xfoo" is not specified (of course, a line without any <...>
+is done in either case).
+
+A realistic example might be
+.nf
+	<!v> -vv
+.fi
+This will cause -vv messages to be the default, but allow "-xv" to override.
+
+There are a few flags that are set automatically:
+.RS
+.TP
+.B TTY
+true if the output is to the screen (as opposed to being redirected to a file).
+You can force this (as with all the other automatic flags) with -xTTY.
+.TP
+.B -v
+True if -v was specified. If -vv was specified, both 
+.B -v
+and
+.B -vv
+flags are true (and so on).
+.TP
+.B -nice
+True if -nice was specified. Same thing about -nnice as for -vv.
+.PP
+.TP
+.B -list
+true if -list (or -l) was given.
+.TP
+.B -dir
+true if -dir was given.
+.RE
+
+Using this info, you might change the last example to
+.nf
+
+    <!v && !-v> option: -vv
+
+.fi
+The added "&& !-v" means "and if the '-v' option not given".
+This will allow you to use "-v" alone on the command line, and not
+have this directive add the more verbose "-vv" automatically.
+
+.RS 0
+Some other examples:
+.TP
+<!-dir && !here> option: -dir ~/
+Effectively make the default directory your home directory (instead of the
+current directory). Using -dir or -xhere will undo this.
+.TP
+<tex> option: -name .tex -dir ~/pub
+Create '-xtex' to search only "*.tex" files in your ~/pub directory tree.
+Actually, this could be made a bit better. If you combine '-xtex' and '-dir'
+on the command line, this directive will add ~/pub to the list, when you
+probably want to use the -dir directory only. You could do
+.nf
+
+   <tex> option: -name .tex
+   <tex && !-dir> option: -dir ~/pub
+.fi
+
+to will allow '-xtex' to work as before, but allow a command-line "-dir"
+to take precedence with respect to ~/pub.
+.TP
+<fluff> option: -nnice -sort -i -vvv
+Combine a few user-friendly options into one '-xfluff' option.
+.TP
+<man> option: -ddir /usr/man -v -w
+When the '-xman' option is given, search "/usr/man" for whole-words
+(of whatever regex or regexes are given on the command line), with -v.
+.RE
+
+The lines in the startup file are executed from top to bottom, so something
+like
+.nf
+
+   <both> option: -xflag1 -xflag2
+   <flag1> option: ...whatever...
+   <flag2> option: ...whatever...
+
+.fi
+will allow '-xboth' to be the same as '-xflag1 -xflag2' (or '-xflag1,flag2'
+for that matter). However, if you put the "<both>" line below the others,
+they will not be true when encountered, so the result would be different
+(and probably undesired).
+
+The "magic" directives are used to determine if a file looks to be binary
+or not. The form of a magic line is
+.nf
+    magic: \fISIZE\fP : \fIPERLCODE\fP
+.fi
+where
+.I SIZE
+is the number of bytes of the file you need to check, and
+.I PERLCODE
+is the code to do the check. Within
+.IR PERLCODE ,
+the variable $H will hold at least the first
+.I SIZE
+bytes of the file (unless the file is shorter than that, of course).
+It might hold more bytes. The perl should evaluate to true if the file
+should be considered a binary.
+
+An example might be
+.nf
+    magic: 6 : substr($H, 0, 6) eq 'GIF87a'
+.fi
+to test for a GIF ("-iskip .gif" is better, but this might be useful
+if you have images in files without the ".gif" extension).
+
+Since the startup file is checked from top to bottom, you can be a bit
+efficient:
+.nf
+    magic: 6 : ($x6 = substr($H, 0, 6)) eq 'GIF87a'
+    magic: 6 :  $x6                     eq 'GIF89a'
+.fi
+You could also write the same thing as
+.nf
+  magic: 6 : (($x6 = substr($H, 0, 6)) eq 'GIF87a') || ## an old gif, or.. \e
+	       $x6                     eq 'GIF89a'     ## .. a new one.
+.fi
+since newlines may be escaped.
+
+The default internal startup file includes
+.nf
+   magic: 32 : $H =~ m/[\ex00-\ex06\ex10-\ex1a\ex1c-\ex1f\ex80\exff]{2}/
+.fi
+which checks for certain non-printable characters, and catches a large
+number of binary files, including most system's executables, linkable
+objects, compressed, tarred, and otherwise folded, spindled, and mutilated
+files.
+
+Another example might be
+.nf
+    ## an archive library
+    magic: 17 : substr($H, 0, 17) eq "!<arch>\en__.SYMDEF"
+.fi
+
+.SH "RETURN VALUE"
+.I Search
+returns zero if lines (or files, if appropriate) were found,
+or if no work was requested (such as with
+.BR -help ).
+Returns 1 if no lines (or files) were found.
+Returns 2 on error.
+
+.SH TODO
+Things I'd like to add some day:
+.nf
+  + show surrounding lines (context).
+  + highlight matched portions of lines.
+  + add '-and', which can go between regexes to override
+    the default logical or of the regexes.
+  + add something like
+      -below GLOB
+    which will examine a tree and only consider files that
+    lie in a directory deeper than one named by the pattern.
+  + add 'warning' and 'error' directives.
+  + add 'help' directive.
+.fi
+.SH BUGS
+If -xdev and multiple -dir arguments are given, any file in any of the
+target filesystems are allowed. It would be better to allow each filesystem
+for each separate tree.
+
+Multiple -dir args might also cause some confusing effects. Doing
+.nf
+   -dir some/dir -dir other
+.fi
+will search "some/dir" completely, then search "other" completely. This
+is good. However, something like
+.nf
+   -dir some/dir -dir some/dir/more/specific
+.fi
+will search "some/dir" completely *except for* "some/dir/more/specific",
+after which it will return and be searched. Not really a bug, but just sort
+of odd.
+
+File times (for -newer, etc.) of symbolic links are for the file, not the
+link. This could cause some misunderstandings.
+
+Probably more. Please let me know.
+.SH AUTHOR
+Jeffrey Friedl, Omron Corp (jfriedl@omron.co.jp)
+.br
+http://www.wg.omron.co.jp/cgi-bin/j-e/jfriedl.html
+
+.SH "LATEST SOURCE"
+See http://www.wg.omron.co.jp/~jfriedl/perl/index.html
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/splain.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/splain.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/splain.bat	(revision 14489)
@@ -0,0 +1,664 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+
+=head1 NAME
+
+diagnostics, splain - produce verbose warning diagnostics
+
+=head1 SYNOPSIS
+
+Using the C<diagnostics> pragma:
+
+    use diagnostics;
+    use diagnostics -verbose;
+
+    enable  diagnostics;
+    disable diagnostics;
+
+Using the C<splain> standalone filter program:
+
+    perl program 2>diag.out
+    splain [-v] [-p] diag.out
+
+Using diagnostics to get stack traces from a misbehaving script:
+
+    perl -Mdiagnostics=-traceonly my_script.pl
+
+=head1 DESCRIPTION
+
+=head2 The C<diagnostics> Pragma
+
+This module extends the terse diagnostics normally emitted by both the
+perl compiler and the perl interpreter (from running perl with a -w 
+switch or C<use warnings>), augmenting them with the more
+explicative and endearing descriptions found in L<perldiag>.  Like the
+other pragmata, it affects the compilation phase of your program rather
+than merely the execution phase.
+
+To use in your program as a pragma, merely invoke
+
+    use diagnostics;
+
+at the start (or near the start) of your program.  (Note 
+that this I<does> enable perl's B<-w> flag.)  Your whole
+compilation will then be subject(ed :-) to the enhanced diagnostics.
+These still go out B<STDERR>.
+
+Due to the interaction between runtime and compiletime issues,
+and because it's probably not a very good idea anyway,
+you may not use C<no diagnostics> to turn them off at compiletime.
+However, you may control their behaviour at runtime using the 
+disable() and enable() methods to turn them off and on respectively.
+
+The B<-verbose> flag first prints out the L<perldiag> introduction before
+any other diagnostics.  The $diagnostics::PRETTY variable can generate nicer
+escape sequences for pagers.
+
+Warnings dispatched from perl itself (or more accurately, those that match
+descriptions found in L<perldiag>) are only displayed once (no duplicate
+descriptions).  User code generated warnings a la warn() are unaffected,
+allowing duplicate user messages to be displayed.
+
+This module also adds a stack trace to the error message when perl dies.
+This is useful for pinpointing what caused the death. The B<-traceonly> (or
+just B<-t>) flag turns off the explanations of warning messages leaving just
+the stack traces. So if your script is dieing, run it again with
+
+  perl -Mdiagnostics=-traceonly my_bad_script
+
+to see the call stack at the time of death. By supplying the B<-warntrace>
+(or just B<-w>) flag, any warnings emitted will also come with a stack
+trace.
+
+=head2 The I<splain> Program
+
+While apparently a whole nuther program, I<splain> is actually nothing
+more than a link to the (executable) F<diagnostics.pm> module, as well as
+a link to the F<diagnostics.pod> documentation.  The B<-v> flag is like
+the C<use diagnostics -verbose> directive.
+The B<-p> flag is like the
+$diagnostics::PRETTY variable.  Since you're post-processing with 
+I<splain>, there's no sense in being able to enable() or disable() processing.
+
+Output from I<splain> is directed to B<STDOUT>, unlike the pragma.
+
+=head1 EXAMPLES
+
+The following file is certain to trigger a few errors at both
+runtime and compiletime:
+
+    use diagnostics;
+    print NOWHERE "nothing\n";
+    print STDERR "\n\tThis message should be unadorned.\n";
+    warn "\tThis is a user warning";
+    print "\nDIAGNOSTIC TESTER: Please enter a <CR> here: ";
+    my $a, $b = scalar <STDIN>;
+    print "\n";
+    print $x/$y;
+
+If you prefer to run your program first and look at its problem
+afterwards, do this:
+
+    perl -w test.pl 2>test.out
+    ./splain < test.out
+
+Note that this is not in general possible in shells of more dubious heritage, 
+as the theoretical 
+
+    (perl -w test.pl >/dev/tty) >& test.out
+    ./splain < test.out
+
+Because you just moved the existing B<stdout> to somewhere else.
+
+If you don't want to modify your source code, but still have on-the-fly
+warnings, do this:
+
+    exec 3>&1; perl -w test.pl 2>&1 1>&3 3>&- | splain 1>&2 3>&- 
+
+Nifty, eh?
+
+If you want to control warnings on the fly, do something like this.
+Make sure you do the C<use> first, or you won't be able to get
+at the enable() or disable() methods.
+
+    use diagnostics; # checks entire compilation phase 
+	print "\ntime for 1st bogus diags: SQUAWKINGS\n";
+	print BOGUS1 'nada';
+	print "done with 1st bogus\n";
+
+    disable diagnostics; # only turns off runtime warnings
+	print "\ntime for 2nd bogus: (squelched)\n";
+	print BOGUS2 'nada';
+	print "done with 2nd bogus\n";
+
+    enable diagnostics; # turns back on runtime warnings
+	print "\ntime for 3rd bogus: SQUAWKINGS\n";
+	print BOGUS3 'nada';
+	print "done with 3rd bogus\n";
+
+    disable diagnostics;
+	print "\ntime for 4th bogus: (squelched)\n";
+	print BOGUS4 'nada';
+	print "done with 4th bogus\n";
+
+=head1 INTERNALS
+
+Diagnostic messages derive from the F<perldiag.pod> file when available at
+runtime.  Otherwise, they may be embedded in the file itself when the
+splain package is built.   See the F<Makefile> for details.
+
+If an extant $SIG{__WARN__} handler is discovered, it will continue
+to be honored, but only after the diagnostics::splainthis() function 
+(the module's $SIG{__WARN__} interceptor) has had its way with your
+warnings.
+
+There is a $diagnostics::DEBUG variable you may set if you're desperately
+curious what sorts of things are being intercepted.
+
+    BEGIN { $diagnostics::DEBUG = 1 } 
+
+
+=head1 BUGS
+
+Not being able to say "no diagnostics" is annoying, but may not be
+insurmountable.
+
+The C<-pretty> directive is called too late to affect matters.
+You have to do this instead, and I<before> you load the module.
+
+    BEGIN { $diagnostics::PRETTY = 1 } 
+
+I could start up faster by delaying compilation until it should be
+needed, but this gets a "panic: top_level" when using the pragma form
+in Perl 5.001e.
+
+While it's true that this documentation is somewhat subserious, if you use
+a program named I<splain>, you should expect a bit of whimsy.
+
+=head1 AUTHOR
+
+Tom Christiansen <F<tchrist@mox.perl.com>>, 25 June 1995.
+
+=cut
+
+use strict;
+use 5.006;
+use Carp;
+$Carp::Internal{__PACKAGE__.""}++;
+
+our $VERSION = 1.15;
+our $DEBUG;
+our $VERBOSE;
+our $PRETTY;
+our $TRACEONLY = 0;
+our $WARNTRACE = 0;
+
+use Config;
+my($privlib, $archlib) = @Config{qw(privlibexp archlibexp)};
+if ($^O eq 'VMS') {
+    require VMS::Filespec;
+    $privlib = VMS::Filespec::unixify($privlib);
+    $archlib = VMS::Filespec::unixify($archlib);
+}
+my @trypod = (
+	   "$archlib/pod/perldiag.pod",
+	   "$privlib/pod/perldiag-$Config{version}.pod",
+	   "$privlib/pod/perldiag.pod",
+	   "$archlib/pods/perldiag.pod",
+	   "$privlib/pods/perldiag-$Config{version}.pod",
+	   "$privlib/pods/perldiag.pod",
+	  );
+# handy for development testing of new warnings etc
+unshift @trypod, "./pod/perldiag.pod" if -e "pod/perldiag.pod";
+(my $PODFILE) = ((grep { -e } @trypod), $trypod[$#trypod])[0];
+
+if ($^O eq 'MacOS') {
+    # just updir one from each lib dir, we'll find it ...
+    ($PODFILE) = grep { -e } map { "$_:pod:perldiag.pod" } @INC;
+}
+
+
+$DEBUG ||= 0;
+my $WHOAMI = ref bless [];  # nobody's business, prolly not even mine
+
+local $| = 1;
+local $_;
+
+my $standalone;
+my(%HTML_2_Troff, %HTML_2_Latin_1, %HTML_2_ASCII_7);
+
+CONFIG: {
+    our $opt_p = our $opt_d = our $opt_v = our $opt_f = '';
+
+    unless (caller) {
+	$standalone++;
+	require Getopt::Std;
+	Getopt::Std::getopts('pdvf:')
+	    or die "Usage: $0 [-v] [-p] [-f splainpod]";
+	$PODFILE = $opt_f if $opt_f;
+	$DEBUG = 2 if $opt_d;
+	$VERBOSE = $opt_v;
+	$PRETTY = $opt_p;
+    }
+
+    if (open(POD_DIAG, $PODFILE)) {
+	warn "Happy happy podfile from real $PODFILE\n" if $DEBUG;
+	last CONFIG;
+    } 
+
+    if (caller) {
+	INCPATH: {
+	    for my $file ( (map { "$_/$WHOAMI.pm" } @INC), $0) {
+		warn "Checking $file\n" if $DEBUG;
+		if (open(POD_DIAG, $file)) {
+		    while (<POD_DIAG>) {
+			next unless
+			    /^__END__\s*# wish diag dbase were more accessible/;
+			print STDERR "podfile is $file\n" if $DEBUG;
+			last INCPATH;
+		    }
+		}
+	    } 
+	}
+    } else { 
+	print STDERR "podfile is <DATA>\n" if $DEBUG;
+	*POD_DIAG = *main::DATA;
+    }
+}
+if (eof(POD_DIAG)) { 
+    die "couldn't find diagnostic data in $PODFILE @INC $0";
+}
+
+
+%HTML_2_Troff = (
+    'amp'	=>	'&',	#   ampersand
+    'lt'	=>	'<',	#   left chevron, less-than
+    'gt'	=>	'>',	#   right chevron, greater-than
+    'quot'	=>	'"',	#   double quote
+
+    "Aacute"	=>	"A\\*'",	#   capital A, acute accent
+    # etc
+
+);
+
+%HTML_2_Latin_1 = (
+    'amp'	=>	'&',	#   ampersand
+    'lt'	=>	'<',	#   left chevron, less-than
+    'gt'	=>	'>',	#   right chevron, greater-than
+    'quot'	=>	'"',	#   double quote
+
+    "Aacute"	=>	"\xC1"	#   capital A, acute accent
+
+    # etc
+);
+
+%HTML_2_ASCII_7 = (
+    'amp'	=>	'&',	#   ampersand
+    'lt'	=>	'<',	#   left chevron, less-than
+    'gt'	=>	'>',	#   right chevron, greater-than
+    'quot'	=>	'"',	#   double quote
+
+    "Aacute"	=>	"A"	#   capital A, acute accent
+    # etc
+);
+
+our %HTML_Escapes;
+*HTML_Escapes = do {
+    if ($standalone) {
+	$PRETTY ? \%HTML_2_Latin_1 : \%HTML_2_ASCII_7; 
+    } else {
+	\%HTML_2_Latin_1; 
+    }
+}; 
+
+*THITHER = $standalone ? *STDOUT : *STDERR;
+
+my %transfmt = (); 
+my $transmo = <<EOFUNC;
+sub transmo {
+    #local \$^W = 0;  # recursive warnings we do NOT need!
+    study;
+EOFUNC
+
+my %msg;
+{
+    print STDERR "FINISHING COMPILATION for $_\n" if $DEBUG;
+    local $/ = '';
+    local $_;
+    my $header;
+    my $for_item;
+    while (<POD_DIAG>) {
+
+	unescape();
+	if ($PRETTY) {
+	    sub noop   { return $_[0] }  # spensive for a noop
+	    sub bold   { my $str =$_[0];  $str =~ s/(.)/$1\b$1/g; return $str; } 
+	    sub italic { my $str = $_[0]; $str =~ s/(.)/_\b$1/g;  return $str; } 
+	    s/C<<< (.*?) >>>|C<< (.*?) >>|[BC]<(.*?)>/bold($+)/ges;
+	    s/[LIF]<(.*?)>/italic($1)/ges;
+	} else {
+	    s/C<<< (.*?) >>>|C<< (.*?) >>|[BC]<(.*?)>/$+/gs;
+	    s/[LIF]<(.*?)>/$1/gs;
+	} 
+	unless (/^=/) {
+	    if (defined $header) { 
+		if ( $header eq 'DESCRIPTION' && 
+		    (   /Optional warnings are enabled/ 
+		     || /Some of these messages are generic./
+		    ) )
+		{
+		    next;
+		}
+		s/^/    /gm;
+		$msg{$header} .= $_;
+	 	undef $for_item;	
+	    }
+	    next;
+	} 
+	unless ( s/=item (.*?)\s*\z//) {
+
+	    if ( s/=head1\sDESCRIPTION//) {
+		$msg{$header = 'DESCRIPTION'} = '';
+		undef $for_item;
+	    }
+	    elsif( s/^=for\s+diagnostics\s*\n(.*?)\s*\z// ) {
+		$for_item = $1;
+	    } 
+	    next;
+	}
+
+	if( $for_item ) { $header = $for_item; undef $for_item } 
+	else {
+	    $header = $1;
+	    while( $header =~ /[;,]\z/ ) {
+		<POD_DIAG> =~ /^\s*(.*?)\s*\z/;
+		$header .= ' '.$1;
+	    }
+	}
+
+	# strip formatting directives from =item line
+	$header =~ s/[A-Z]<(.*?)>/$1/g;
+
+        my @toks = split( /(%l?[dx]|%c|%(?:\.\d+)?s)/, $header );
+	if (@toks > 1) {
+            my $conlen = 0;
+            for my $i (0..$#toks){
+                if( $i % 2 ){
+                    if(      $toks[$i] eq '%c' ){
+                        $toks[$i] = '.';
+                    } elsif( $toks[$i] eq '%d' ){
+                        $toks[$i] = '\d+';
+                    } elsif( $toks[$i] eq '%s' ){
+                        $toks[$i] = $i == $#toks ? '.*' : '.*?';
+                    } elsif( $toks[$i] =~ '%.(\d+)s' ){
+                        $toks[$i] = ".{$1}";
+                     } elsif( $toks[$i] =~ '^%l*x$' ){
+                        $toks[$i] = '[\da-f]+';
+                   }
+                } elsif( length( $toks[$i] ) ){
+                    $toks[$i] =~ s/^.*$/\Q$&\E/;
+                    $conlen += length( $toks[$i] );
+                }
+            }  
+            my $lhs = join( '', @toks );
+	    $transfmt{$header}{pat} =
+              "    s{^$lhs}\n     {\Q$header\E}s\n\t&& return 1;\n";
+            $transfmt{$header}{len} = $conlen;
+	} else {
+            $transfmt{$header}{pat} =
+	      "    m{^\Q$header\E} && return 1;\n";
+            $transfmt{$header}{len} = length( $header );
+	} 
+
+	print STDERR "$WHOAMI: Duplicate entry: \"$header\"\n"
+	    if $msg{$header};
+
+	$msg{$header} = '';
+    } 
+
+
+    close POD_DIAG unless *main::DATA eq *POD_DIAG;
+
+    die "No diagnostics?" unless %msg;
+
+    # Apply patterns in order of decreasing sum of lengths of fixed parts
+    # Seems the best way of hitting the right one.
+    for my $hdr ( sort { $transfmt{$b}{len} <=> $transfmt{$a}{len} }
+                  keys %transfmt ){
+        $transmo .= $transfmt{$hdr}{pat};
+    }
+    $transmo .= "    return 0;\n}\n";
+    print STDERR $transmo if $DEBUG;
+    eval $transmo;
+    die $@ if $@;
+}
+
+if ($standalone) {
+    if (!@ARGV and -t STDIN) { print STDERR "$0: Reading from STDIN\n" } 
+    while (defined (my $error = <>)) {
+	splainthis($error) || print THITHER $error;
+    } 
+    exit;
+} 
+
+my $olddie;
+my $oldwarn;
+
+sub import {
+    shift;
+    $^W = 1; # yup, clobbered the global variable; 
+	     # tough, if you want diags, you want diags.
+    return if defined $SIG{__WARN__} && ($SIG{__WARN__} eq \&warn_trap);
+
+    for (@_) {
+
+	/^-d(ebug)?$/ 	   	&& do {
+				    $DEBUG++;
+				    next;
+				   };
+
+	/^-v(erbose)?$/ 	&& do {
+				    $VERBOSE++;
+				    next;
+				   };
+
+	/^-p(retty)?$/ 		&& do {
+				    print STDERR "$0: I'm afraid it's too late for prettiness.\n";
+				    $PRETTY++;
+				    next;
+			       };
+
+	/^-t(race)?$/ 		&& do {
+				    $TRACEONLY++;
+				    next;
+			       };
+	/^-w(arntrace)?$/ 		&& do {
+				    $WARNTRACE++;
+				    next;
+			       };
+
+	warn "Unknown flag: $_";
+    } 
+
+    $oldwarn = $SIG{__WARN__};
+    $olddie = $SIG{__DIE__};
+    $SIG{__WARN__} = \&warn_trap;
+    $SIG{__DIE__} = \&death_trap;
+} 
+
+sub enable { &import }
+
+sub disable {
+    shift;
+    return unless $SIG{__WARN__} eq \&warn_trap;
+    $SIG{__WARN__} = $oldwarn || '';
+    $SIG{__DIE__} = $olddie || '';
+} 
+
+sub warn_trap {
+    my $warning = $_[0];
+    if (caller eq $WHOAMI or !splainthis($warning)) {
+	if ($WARNTRACE) {
+	    print STDERR Carp::longmess($warning);
+	} else {
+	    print STDERR $warning;
+	}
+    } 
+    goto &$oldwarn if defined $oldwarn and $oldwarn and $oldwarn ne \&warn_trap;
+};
+
+sub death_trap {
+    my $exception = $_[0];
+
+    # See if we are coming from anywhere within an eval. If so we don't
+    # want to explain the exception because it's going to get caught.
+    my $in_eval = 0;
+    my $i = 0;
+    while (my $caller = (caller($i++))[3]) {
+      if ($caller eq '(eval)') {
+	$in_eval = 1;
+	last;
+      }
+    }
+
+    splainthis($exception) unless $in_eval;
+    if (caller eq $WHOAMI) { print STDERR "INTERNAL EXCEPTION: $exception"; } 
+    &$olddie if defined $olddie and $olddie and $olddie ne \&death_trap;
+
+    return if $in_eval;
+
+    # We don't want to unset these if we're coming from an eval because
+    # then we've turned off diagnostics.
+
+    # Switch off our die/warn handlers so we don't wind up in our own
+    # traps.
+    $SIG{__DIE__} = $SIG{__WARN__} = '';
+
+    # Have carp skip over death_trap() when showing the stack trace.
+    local($Carp::CarpLevel) = 1;
+
+    confess "Uncaught exception from user code:\n\t$exception";
+	# up we go; where we stop, nobody knows, but i think we die now
+	# but i'm deeply afraid of the &$olddie guy reraising and us getting
+	# into an indirect recursion loop
+};
+
+my %exact_duplicate;
+my %old_diag;
+my $count;
+my $wantspace;
+sub splainthis {
+    return 0 if $TRACEONLY;
+    local $_ = shift;
+    local $\;
+    ### &finish_compilation unless %msg;
+    s/\.?\n+$//;
+    my $orig = $_;
+    # return unless defined;
+
+    # get rid of the where-are-we-in-input part
+    s/, <.*?> (?:line|chunk).*$//;
+
+    # Discard 1st " at <file> line <no>" and all text beyond
+    # but be aware of messsages containing " at this-or-that"
+    my $real = 0;
+    my @secs = split( / at / );
+    $_ = $secs[0];
+    for my $i ( 1..$#secs ){
+        if( $secs[$i] =~ /.+? (?:line|chunk) \d+/ ){
+            $real = 1;
+            last;
+        } else {
+            $_ .= ' at ' . $secs[$i];
+	}
+    }
+    
+    # remove parenthesis occurring at the end of some messages 
+    s/^\((.*)\)$/$1/;
+
+    if ($exact_duplicate{$orig}++) {
+	return &transmo;
+    } else {
+	return 0 unless &transmo;
+    }
+
+    $orig = shorten($orig);
+    if ($old_diag{$_}) {
+	autodescribe();
+	print THITHER "$orig (#$old_diag{$_})\n";
+	$wantspace = 1;
+    } else {
+	autodescribe();
+	$old_diag{$_} = ++$count;
+	print THITHER "\n" if $wantspace;
+	$wantspace = 0;
+	print THITHER "$orig (#$old_diag{$_})\n";
+	if ($msg{$_}) {
+	    print THITHER $msg{$_};
+	} else {
+	    if (0 and $standalone) { 
+		print THITHER "    **** Error #$old_diag{$_} ",
+			($real ? "is" : "appears to be"),
+			" an unknown diagnostic message.\n\n";
+	    }
+	    return 0;
+	} 
+    }
+    return 1;
+} 
+
+sub autodescribe {
+    if ($VERBOSE and not $count) {
+	print THITHER &{$PRETTY ? \&bold : \&noop}("DESCRIPTION OF DIAGNOSTICS"),
+		"\n$msg{DESCRIPTION}\n";
+    } 
+} 
+
+sub unescape { 
+    s {
+            E<  
+            ( [A-Za-z]+ )       
+            >   
+    } { 
+         do {   
+             exists $HTML_Escapes{$1}
+                ? do { $HTML_Escapes{$1} }
+                : do {
+                    warn "Unknown escape: E<$1> in $_";
+                    "E<$1>";
+                } 
+         } 
+    }egx;
+}
+
+sub shorten {
+    my $line = $_[0];
+    if (length($line) > 79 and index($line, "\n") == -1) {
+	my $space_place = rindex($line, ' ', 79);
+	if ($space_place != -1) {
+	    substr($line, $space_place, 1) = "\n\t";
+	} 
+    } 
+    return $line;
+} 
+
+
+1 unless $standalone;  # or it'll complain about itself
+__END__ # wish diag dbase were more accessible
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/bin/xsubpp.bat
===================================================================
--- /for-distributions/trunk/bin/windows/perl/bin/xsubpp.bat	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/bin/xsubpp.bat	(revision 14489)
@@ -0,0 +1,1927 @@
+@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
+    eval 'exec c:\shaoqunWu\perl\bin\perl.exe -S $0 ${1+"$@"}'
+	if $running_under_some_shell;
+#!./miniperl
+
+=head1 NAME
+
+xsubpp - compiler to convert Perl XS code into C code
+
+=head1 SYNOPSIS
+
+B<xsubpp> [B<-v>] [B<-C++>] [B<-csuffix csuffix>] [B<-except>] [B<-s pattern>] [B<-prototypes>] [B<-noversioncheck>] [B<-nolinenumbers>] [B<-nooptimize>] [B<-typemap typemap>] ... file.xs
+
+=head1 DESCRIPTION
+
+This compiler is typically run by the makefiles created by L<ExtUtils::MakeMaker>.
+
+I<xsubpp> will compile XS code into C code by embedding the constructs
+necessary to let C functions manipulate Perl values and creates the glue
+necessary to let Perl access those functions.  The compiler uses typemaps to
+determine how to map C function parameters and variables to Perl values.
+
+The compiler will search for typemap files called I<typemap>.  It will use
+the following search path to find default typemaps, with the rightmost
+typemap taking precedence.
+
+	../../../typemap:../../typemap:../typemap:typemap
+
+=head1 OPTIONS
+
+Note that the C<XSOPT> MakeMaker option may be used to add these options to
+any makefiles generated by MakeMaker.
+
+=over 5
+
+=item B<-C++>
+
+Adds ``extern "C"'' to the C code.
+
+=item B<-csuffix csuffix>
+
+Set the suffix used for the generated C or C++ code.  Defaults to '.c'
+(even with B<-C++>), but some platforms might want to have e.g. '.cpp'.
+Don't forget the '.' from the front.
+
+=item B<-hiertype>
+
+Retains '::' in type names so that C++ hierachical types can be mapped.
+
+=item B<-except>
+
+Adds exception handling stubs to the C code.
+
+=item B<-typemap typemap>
+
+Indicates that a user-supplied typemap should take precedence over the
+default typemaps.  This option may be used multiple times, with the last
+typemap having the highest precedence.
+
+=item B<-v>
+
+Prints the I<xsubpp> version number to standard output, then exits.
+
+=item B<-prototypes>
+
+By default I<xsubpp> will not automatically generate prototype code for
+all xsubs. This flag will enable prototypes.
+
+=item B<-noversioncheck>
+
+Disables the run time test that determines if the object file (derived
+from the C<.xs> file) and the C<.pm> files have the same version
+number.
+
+=item B<-nolinenumbers>
+
+Prevents the inclusion of `#line' directives in the output.
+
+=item B<-nooptimize>
+
+Disables certain optimizations.  The only optimization that is currently
+affected is the use of I<target>s by the output C code (see L<perlguts>).
+This may significantly slow down the generated code, but this is the way
+B<xsubpp> of 5.005 and earlier operated.
+
+=item B<-noinout>
+
+Disable recognition of C<IN>, C<OUT_LIST> and C<INOUT_LIST> declarations.
+
+=item B<-noargtypes>
+
+Disable recognition of ANSI-like descriptions of function signature.
+
+=back
+
+=head1 ENVIRONMENT
+
+No environment variables are used.
+
+=head1 AUTHOR
+
+Larry Wall
+
+=head1 MODIFICATION HISTORY
+
+See the file F<changes.pod>.
+
+=head1 SEE ALSO
+
+perl(1), perlxs(1), perlxstut(1)
+
+=cut
+
+require 5.002;
+use Cwd;
+use vars qw($cplusplus $hiertype);
+use vars '%v';
+
+use Config;
+
+sub Q ;
+
+# Global Constants
+
+$XSUBPP_version = "1.9508";
+
+my ($Is_VMS, $SymSet);
+if ($^O eq 'VMS') {
+    $Is_VMS = 1;
+    # Establish set of global symbols with max length 28, since xsubpp
+    # will later add the 'XS_' prefix.
+    require ExtUtils::XSSymSet;
+    $SymSet = new ExtUtils::XSSymSet 28;
+}
+
+$FH = 'File0000' ;
+
+$usage = "Usage: xsubpp [-v] [-C++] [-csuffix csuffix] [-except] [-prototypes] [-noversioncheck] [-nolinenumbers] [-nooptimize] [-noinout] [-noargtypes] [-s pattern] [-typemap typemap]... file.xs\n";
+
+$proto_re = "[" . quotemeta('\$%&*@;[]') . "]" ;
+
+$except = "";
+$WantPrototypes = -1 ;
+$WantVersionChk = 1 ;
+$ProtoUsed = 0 ;
+$WantLineNumbers = 1 ;
+$WantOptimize = 1 ;
+$Overload = 0;
+$Fallback = 'PL_sv_undef';
+
+my $process_inout = 1;
+my $process_argtypes = 1;
+my $csuffix = '.c';
+
+SWITCH: while (@ARGV and $ARGV[0] =~ /^-./) {
+    $flag = shift @ARGV;
+    $flag =~ s/^-// ;
+    $spat = quotemeta shift,	next SWITCH	if $flag eq 's';
+    $cplusplus = 1,	next SWITCH	if $flag eq 'C++';
+    $csuffix   = shift,	next SWITCH	if $flag eq 'csuffix';
+    $hiertype  = 1,	next SWITCH	if $flag eq 'hiertype';
+    $WantPrototypes = 0, next SWITCH	if $flag eq 'noprototypes';
+    $WantPrototypes = 1, next SWITCH	if $flag eq 'prototypes';
+    $WantVersionChk = 0, next SWITCH	if $flag eq 'noversioncheck';
+    $WantVersionChk = 1, next SWITCH	if $flag eq 'versioncheck';
+    # XXX left this in for compat
+    next SWITCH                         if $flag eq 'object_capi';
+    $except = " TRY",	next SWITCH	if $flag eq 'except';
+    push(@tm,shift),	next SWITCH	if $flag eq 'typemap';
+    $WantLineNumbers = 0, next SWITCH	if $flag eq 'nolinenumbers';
+    $WantLineNumbers = 1, next SWITCH	if $flag eq 'linenumbers';
+    $WantOptimize = 0, next SWITCH	if $flag eq 'nooptimize';
+    $WantOptimize = 1, next SWITCH	if $flag eq 'optimize';
+    $process_inout = 0, next SWITCH	if $flag eq 'noinout';
+    $process_inout = 1, next SWITCH	if $flag eq 'inout';
+    $process_argtypes = 0, next SWITCH	if $flag eq 'noargtypes';
+    $process_argtypes = 1, next SWITCH	if $flag eq 'argtypes';
+    (print "xsubpp version $XSUBPP_version\n"), exit
+	if $flag eq 'v';
+    die $usage;
+}
+if ($WantPrototypes == -1)
+  { $WantPrototypes = 0}
+else
+  { $ProtoUsed = 1 }
+
+
+@ARGV == 1 or die $usage;
+($dir, $filename) = $ARGV[0] =~ m#(.*)/(.*)#
+	or ($dir, $filename) = $ARGV[0] =~ m#(.*)\\(.*)#
+	or ($dir, $filename) = $ARGV[0] =~ m#(.*[>\]])(.*)#
+	or ($dir, $filename) = ('.', $ARGV[0]);
+chdir($dir);
+$pwd = cwd();
+
+++ $IncludedFiles{$ARGV[0]} ;
+
+my(@XSStack) = ({type => 'none'});	# Stack of conditionals and INCLUDEs
+my($XSS_work_idx, $cpp_next_tmp) = (0, "XSubPPtmpAAAA");
+
+
+sub TrimWhitespace
+{
+    $_[0] =~ s/^\s+|\s+$//go ;
+}
+
+sub TidyType
+{
+    local ($_) = @_ ;
+
+    # rationalise any '*' by joining them into bunches and removing whitespace
+    s#\s*(\*+)\s*#$1#g;
+    s#(\*+)# $1 #g ;
+
+    # change multiple whitespace into a single space
+    s/\s+/ /g ;
+
+    # trim leading & trailing whitespace
+    TrimWhitespace($_) ;
+
+    $_ ;
+}
+
+$typemap = shift @ARGV;
+foreach $typemap (@tm) {
+    die "Can't find $typemap in $pwd\n" unless -r $typemap;
+}
+unshift @tm, qw(../../../../lib/ExtUtils/typemap ../../../lib/ExtUtils/typemap
+                ../../lib/ExtUtils/typemap ../../../typemap ../../typemap
+                ../typemap typemap);
+foreach $typemap (@tm) {
+    next unless -f $typemap ;
+    # skip directories, binary files etc.
+    warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
+	unless -T $typemap ;
+    open(TYPEMAP, $typemap)
+	or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
+    $mode = 'Typemap';
+    $junk = "" ;
+    $current = \$junk;
+    while (<TYPEMAP>) {
+	next if /^\s*#/;
+        my $line_no = $. + 1;
+	if (/^INPUT\s*$/)   { $mode = 'Input';   $current = \$junk;  next; }
+	if (/^OUTPUT\s*$/)  { $mode = 'Output';  $current = \$junk;  next; }
+	if (/^TYPEMAP\s*$/) { $mode = 'Typemap'; $current = \$junk;  next; }
+	if ($mode eq 'Typemap') {
+	    chomp;
+	    my $line = $_ ;
+            TrimWhitespace($_) ;
+	    # skip blank lines and comment lines
+	    next if /^$/ or /^#/ ;
+	    my($type,$kind, $proto) = /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/ or
+		warn("Warning: File '$typemap' Line $. '$line' TYPEMAP entry needs 2 or 3 columns\n"), next;
+            $type = TidyType($type) ;
+	    $type_kind{$type} = $kind ;
+            # prototype defaults to '$'
+            $proto = "\$" unless $proto ;
+            warn("Warning: File '$typemap' Line $. '$line' Invalid prototype '$proto'\n")
+                unless ValidProtoString($proto) ;
+            $proto_letter{$type} = C_string($proto) ;
+	}
+	elsif (/^\s/) {
+	    $$current .= $_;
+	}
+	elsif ($mode eq 'Input') {
+	    s/\s+$//;
+	    $input_expr{$_} = '';
+	    $current = \$input_expr{$_};
+	}
+	else {
+	    s/\s+$//;
+	    $output_expr{$_} = '';
+	    $current = \$output_expr{$_};
+	}
+    }
+    close(TYPEMAP);
+}
+
+foreach $key (keys %input_expr) {
+    $input_expr{$key} =~ s/;*\s+\z//;
+}
+
+$bal = qr[(?:(?>[^()]+)|\((??{ $bal })\))*];	# ()-balanced
+$cast = qr[(?:\(\s*SV\s*\*\s*\)\s*)?];		# Optional (SV*) cast
+$size = qr[,\s* (??{ $bal }) ]x;		# Third arg (to setpvn)
+
+foreach $key (keys %output_expr) {
+    use re 'eval';
+
+    my ($t, $with_size, $arg, $sarg) =
+      ($output_expr{$key} =~
+	 m[^ \s+ sv_set ( [iunp] ) v (n)? 	# Type, is_setpvn
+	     \s* \( \s* $cast \$arg \s* ,
+	     \s* ( (??{ $bal }) )		# Set from
+	     ( (??{ $size }) )?			# Possible sizeof set-from
+	     \) \s* ; \s* $
+	  ]x);
+    $targetable{$key} = [$t, $with_size, $arg, $sarg] if $t;
+}
+
+$END = "!End!\n\n";		# "impossible" keyword (multiple newline)
+
+# Match an XS keyword
+$BLOCK_re= '\s*(' . join('|', qw(
+	REQUIRE BOOT CASE PREINIT INPUT INIT CODE PPCODE OUTPUT
+	CLEANUP ALIAS ATTRS PROTOTYPES PROTOTYPE VERSIONCHECK INCLUDE
+	SCOPE INTERFACE INTERFACE_MACRO C_ARGS POSTCALL OVERLOAD FALLBACK
+	)) . "|$END)\\s*:";
+
+# Input:  ($_, @line) == unparsed input.
+# Output: ($_, @line) == (rest of line, following lines).
+# Return: the matched keyword if found, otherwise 0
+sub check_keyword {
+	$_ = shift(@line) while !/\S/ && @line;
+	s/^(\s*)($_[0])\s*:\s*(?:#.*)?/$1/s && $2;
+}
+
+my ($C_group_rex, $C_arg);
+# Group in C (no support for comments or literals)
+$C_group_rex = qr/ [({\[]
+		   (?: (?> [^()\[\]{}]+ ) | (??{ $C_group_rex }) )*
+		   [)}\]] /x ;
+# Chunk in C without comma at toplevel (no comments):
+$C_arg = qr/ (?: (?> [^()\[\]{},"']+ )
+	     |   (??{ $C_group_rex })
+	     |   " (?: (?> [^\\"]+ )
+		   |   \\.
+		   )* "		# String literal
+	     |   ' (?: (?> [^\\']+ ) | \\. )* ' # Char literal
+	     )* /xs;
+
+if ($WantLineNumbers) {
+    {
+	package xsubpp::counter;
+	sub TIEHANDLE {
+	    my ($class, $cfile) = @_;
+	    my $buf = "";
+	    $SECTION_END_MARKER = "#line --- \"$cfile\"";
+	    $line_no = 1;
+	    bless \$buf;
+	}
+
+	sub PRINT {
+	    my $self = shift;
+	    for (@_) {
+		$$self .= $_;
+		while ($$self =~ s/^([^\n]*\n)//) {
+		    my $line = $1;
+		    ++ $line_no;
+		    $line =~ s|^\#line\s+---(?=\s)|#line $line_no|;
+		    print STDOUT $line;
+		}
+	    }
+	}
+
+	sub PRINTF {
+	    my $self = shift;
+	    my $fmt = shift;
+	    $self->PRINT(sprintf($fmt, @_));
+	}
+
+	sub DESTROY {
+	    # Not necessary if we're careful to end with a "\n"
+	    my $self = shift;
+	    print STDOUT $$self;
+	}
+    }
+
+    my $cfile = $filename;
+    $cfile =~ s/\.xs$/$csuffix/i or $cfile .= $csuffix;
+    tie(*PSEUDO_STDOUT, 'xsubpp::counter', $cfile);
+    select PSEUDO_STDOUT;
+}
+
+sub print_section {
+    # the "do" is required for right semantics
+    do { $_ = shift(@line) } while !/\S/ && @line;
+
+    print("#line ", $line_no[@line_no - @line -1], " \"$filename\"\n")
+	if $WantLineNumbers && !/^\s*#\s*line\b/ && !/^#if XSubPPtmp/;
+    for (;  defined($_) && !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	print "$_\n";
+    }
+    print "$xsubpp::counter::SECTION_END_MARKER\n" if $WantLineNumbers;
+}
+
+sub merge_section {
+    my $in = '';
+
+    while (!/\S/ && @line) {
+        $_ = shift(@line);
+    }
+
+    for (;  defined($_) && !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	$in .= "$_\n";
+    }
+    chomp $in;
+    return $in;
+}
+
+sub process_keyword($)
+{
+    my($pattern) = @_ ;
+    my $kwd ;
+
+    &{"${kwd}_handler"}()
+        while $kwd = check_keyword($pattern) ;
+}
+
+sub CASE_handler {
+    blurt ("Error: `CASE:' after unconditional `CASE:'")
+	if $condnum && $cond eq '';
+    $cond = $_;
+    TrimWhitespace($cond);
+    print "   ", ($condnum++ ? " else" : ""), ($cond ? " if ($cond)\n" : "\n");
+    $_ = '' ;
+}
+
+sub INPUT_handler {
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	last if /^\s*NOT_IMPLEMENTED_YET/;
+	next unless /\S/;	# skip blank lines
+
+	TrimWhitespace($_) ;
+	my $line = $_ ;
+
+	# remove trailing semicolon if no initialisation
+	s/\s*;$//g unless /[=;+].*\S/ ;
+
+	# Process the length(foo) declarations
+	if (s/^([^=]*)\blength\(\s*(\w+)\s*\)\s*$/$1 XSauto_length_of_$2=NO_INIT/x) {
+	  print "\tSTRLEN\tSTRLEN_length_of_$2;\n";
+	  $lengthof{$2} = $name;
+	  # $islengthof{$name} = $1;
+	  $deferred .= "\n\tXSauto_length_of_$2 = STRLEN_length_of_$2;";
+	}
+
+	# check for optional initialisation code
+	my $var_init = '' ;
+	$var_init = $1 if s/\s*([=;+].*)$//s ;
+	$var_init =~ s/"/\\"/g;
+
+	s/\s+/ /g;
+	my ($var_type, $var_addr, $var_name) = /^(.*?[^&\s])\s*(\&?)\s*\b(\w+)$/s
+	    or blurt("Error: invalid argument declaration '$line'"), next;
+
+	# Check for duplicate definitions
+	blurt ("Error: duplicate definition of argument '$var_name' ignored"), next
+	    if $arg_list{$var_name}++
+	      or defined $argtype_seen{$var_name} and not $processing_arg_with_types;
+
+	$thisdone |= $var_name eq "THIS";
+	$retvaldone |= $var_name eq "RETVAL";
+	$var_types{$var_name} = $var_type;
+	# XXXX This check is a safeguard against the unfinished conversion of
+	# generate_init().  When generate_init() is fixed,
+	# one can use 2-args map_type() unconditionally.
+	if ($var_type =~ / \( \s* \* \s* \) /x) {
+	  # Function pointers are not yet supported with &output_init!
+	  print "\t" . &map_type($var_type, $var_name);
+	  $name_printed = 1;
+	} else {
+	  print "\t" . &map_type($var_type);
+	  $name_printed = 0;
+	}
+	$var_num = $args_match{$var_name};
+
+        $proto_arg[$var_num] = ProtoString($var_type)
+	    if $var_num ;
+	$func_args =~ s/\b($var_name)\b/&$1/ if $var_addr;
+	if ($var_init =~ /^[=;]\s*NO_INIT\s*;?\s*$/
+	    or $in_out{$var_name} and $in_out{$var_name} =~ /^OUT/
+	    and $var_init !~ /\S/) {
+	  if ($name_printed) {
+	    print ";\n";
+	  } else {
+	    print "\t$var_name;\n";
+	  }
+	} elsif ($var_init =~ /\S/) {
+	    &output_init($var_type, $var_num, $var_name, $var_init, $name_printed);
+	} elsif ($var_num) {
+	    # generate initialization code
+	    &generate_init($var_type, $var_num, $var_name, $name_printed);
+	} else {
+	    print ";\n";
+	}
+    }
+}
+
+sub OUTPUT_handler {
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	next unless /\S/;
+	if (/^\s*SETMAGIC\s*:\s*(ENABLE|DISABLE)\s*/) {
+	    $DoSetMagic = ($1 eq "ENABLE" ? 1 : 0);
+	    next;
+	}
+	my ($outarg, $outcode) = /^\s*(\S+)\s*(.*?)\s*$/s ;
+	blurt ("Error: duplicate OUTPUT argument '$outarg' ignored"), next
+	    if $outargs{$outarg} ++ ;
+	if (!$gotRETVAL and $outarg eq 'RETVAL') {
+	    # deal with RETVAL last
+	    $RETVAL_code = $outcode ;
+	    $gotRETVAL = 1 ;
+	    next ;
+	}
+	blurt ("Error: OUTPUT $outarg not an argument"), next
+	    unless defined($args_match{$outarg});
+	blurt("Error: No input definition for OUTPUT argument '$outarg' - ignored"), next
+	    unless defined $var_types{$outarg} ;
+	$var_num = $args_match{$outarg};
+	if ($outcode) {
+	    print "\t$outcode\n";
+	    print "\tSvSETMAGIC(ST(" , $var_num-1 , "));\n" if $DoSetMagic;
+	} else {
+	    &generate_output($var_types{$outarg}, $var_num, $outarg, $DoSetMagic);
+	}
+	delete $in_out{$outarg} 	# No need to auto-OUTPUT
+	  if exists $in_out{$outarg} and $in_out{$outarg} =~ /OUT$/;
+    }
+}
+
+sub C_ARGS_handler() {
+    my $in = merge_section();
+
+    TrimWhitespace($in);
+    $func_args = $in;
+}
+
+sub INTERFACE_MACRO_handler() {
+    my $in = merge_section();
+
+    TrimWhitespace($in);
+    if ($in =~ /\s/) {		# two
+        ($interface_macro, $interface_macro_set) = split ' ', $in;
+    } else {
+        $interface_macro = $in;
+	$interface_macro_set = 'UNKNOWN_CVT'; # catch later
+    }
+    $interface = 1;		# local
+    $Interfaces = 1;		# global
+}
+
+sub INTERFACE_handler() {
+    my $in = merge_section();
+
+    TrimWhitespace($in);
+
+    foreach (split /[\s,]+/, $in) {
+        $Interfaces{$_} = $_;
+    }
+    print Q<<"EOF";
+#	XSFUNCTION = $interface_macro($ret_type,cv,XSANY.any_dptr);
+EOF
+    $interface = 1;		# local
+    $Interfaces = 1;		# global
+}
+
+sub CLEANUP_handler() { print_section() }
+sub PREINIT_handler() { print_section() }
+sub POSTCALL_handler() { print_section() }
+sub INIT_handler()    { print_section() }
+
+sub GetAliases
+{
+    my ($line) = @_ ;
+    my ($orig) = $line ;
+    my ($alias) ;
+    my ($value) ;
+
+    # Parse alias definitions
+    # format is
+    #    alias = value alias = value ...
+
+    while ($line =~ s/^\s*([\w:]+)\s*=\s*(\w+)\s*//) {
+        $alias = $1 ;
+        $orig_alias = $alias ;
+        $value = $2 ;
+
+        # check for optional package definition in the alias
+	$alias = $Packprefix . $alias if $alias !~ /::/ ;
+
+        # check for duplicate alias name & duplicate value
+	Warn("Warning: Ignoring duplicate alias '$orig_alias'")
+	    if defined $XsubAliases{$alias} ;
+
+	Warn("Warning: Aliases '$orig_alias' and '$XsubAliasValues{$value}' have identical values")
+	    if $XsubAliasValues{$value} ;
+
+	$XsubAliases = 1;
+	$XsubAliases{$alias} = $value ;
+	$XsubAliasValues{$value} = $orig_alias ;
+    }
+
+    blurt("Error: Cannot parse ALIAS definitions from '$orig'")
+        if $line ;
+}
+
+sub ATTRS_handler ()
+{
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	next unless /\S/;
+	TrimWhitespace($_) ;
+        push @Attributes, $_;
+    }
+}
+
+sub ALIAS_handler ()
+{
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	next unless /\S/;
+	TrimWhitespace($_) ;
+        GetAliases($_) if $_ ;
+    }
+}
+
+sub OVERLOAD_handler()
+{
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	next unless /\S/;
+	TrimWhitespace($_) ;
+        while ( s/^\s*([\w:"\\)\+\-\*\/\%\<\>\.\&\|\^\!\~\{\}\=]+)\s*//) {
+	    $Overload = 1 unless $Overload;
+	    my $overload = "$Package\::(".$1 ;
+            push(@InitFileCode,
+    	     "        newXS(\"$overload\", XS_$Full_func_name, file$proto);\n");
+        }
+    }
+
+}
+
+sub FALLBACK_handler()
+{
+    # the rest of the current line should contain either TRUE, 
+    # FALSE or UNDEF
+
+    TrimWhitespace($_) ;
+    my %map = (
+	TRUE => "PL_sv_yes", 1 => "PL_sv_yes",
+	FALSE => "PL_sv_no", 0 => "PL_sv_no",
+	UNDEF => "PL_sv_undef",
+    ) ;
+
+    # check for valid FALLBACK value
+    death ("Error: FALLBACK: TRUE/FALSE/UNDEF") unless exists $map{uc $_} ;
+
+    $Fallback = $map{uc $_} ;
+}
+
+sub REQUIRE_handler ()
+{
+    # the rest of the current line should contain a version number
+    my ($Ver) = $_ ;
+
+    TrimWhitespace($Ver) ;
+
+    death ("Error: REQUIRE expects a version number")
+	unless $Ver ;
+
+    # check that the version number is of the form n.n
+    death ("Error: REQUIRE: expected a number, got '$Ver'")
+	unless $Ver =~ /^\d+(\.\d*)?/ ;
+
+    death ("Error: xsubpp $Ver (or better) required--this is only $XSUBPP_version.")
+        unless $XSUBPP_version >= $Ver ;
+}
+
+sub VERSIONCHECK_handler ()
+{
+    # the rest of the current line should contain either ENABLE or
+    # DISABLE
+
+    TrimWhitespace($_) ;
+
+    # check for ENABLE/DISABLE
+    death ("Error: VERSIONCHECK: ENABLE/DISABLE")
+        unless /^(ENABLE|DISABLE)/i ;
+
+    $WantVersionChk = 1 if $1 eq 'ENABLE' ;
+    $WantVersionChk = 0 if $1 eq 'DISABLE' ;
+
+}
+
+sub PROTOTYPE_handler ()
+{
+    my $specified ;
+
+    death("Error: Only 1 PROTOTYPE definition allowed per xsub")
+        if $proto_in_this_xsub ++ ;
+
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	next unless /\S/;
+	$specified = 1 ;
+	TrimWhitespace($_) ;
+        if ($_ eq 'DISABLE') {
+	   $ProtoThisXSUB = 0
+        }
+        elsif ($_ eq 'ENABLE') {
+	   $ProtoThisXSUB = 1
+        }
+        else {
+            # remove any whitespace
+            s/\s+//g ;
+            death("Error: Invalid prototype '$_'")
+                unless ValidProtoString($_) ;
+            $ProtoThisXSUB = C_string($_) ;
+        }
+    }
+
+    # If no prototype specified, then assume empty prototype ""
+    $ProtoThisXSUB = 2 unless $specified ;
+
+    $ProtoUsed = 1 ;
+
+}
+
+sub SCOPE_handler ()
+{
+    death("Error: Only 1 SCOPE declaration allowed per xsub")
+        if $scope_in_this_xsub ++ ;
+
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+		next unless /\S/;
+		TrimWhitespace($_) ;
+        if ($_ =~ /^DISABLE/i) {
+		   $ScopeThisXSUB = 0
+        }
+        elsif ($_ =~ /^ENABLE/i) {
+		   $ScopeThisXSUB = 1
+        }
+    }
+
+}
+
+sub PROTOTYPES_handler ()
+{
+    # the rest of the current line should contain either ENABLE or
+    # DISABLE
+
+    TrimWhitespace($_) ;
+
+    # check for ENABLE/DISABLE
+    death ("Error: PROTOTYPES: ENABLE/DISABLE")
+        unless /^(ENABLE|DISABLE)/i ;
+
+    $WantPrototypes = 1 if $1 eq 'ENABLE' ;
+    $WantPrototypes = 0 if $1 eq 'DISABLE' ;
+    $ProtoUsed = 1 ;
+
+}
+
+sub INCLUDE_handler ()
+{
+    # the rest of the current line should contain a valid filename
+
+    TrimWhitespace($_) ;
+
+    death("INCLUDE: filename missing")
+        unless $_ ;
+
+    death("INCLUDE: output pipe is illegal")
+        if /^\s*\|/ ;
+
+    # simple minded recursion detector
+    death("INCLUDE loop detected")
+        if $IncludedFiles{$_} ;
+
+    ++ $IncludedFiles{$_} unless /\|\s*$/ ;
+
+    # Save the current file context.
+    push(@XSStack, {
+	type		=> 'file',
+        LastLine        => $lastline,
+        LastLineNo      => $lastline_no,
+        Line            => \@line,
+        LineNo          => \@line_no,
+        Filename        => $filename,
+        Handle          => $FH,
+        }) ;
+
+    ++ $FH ;
+
+    # open the new file
+    open ($FH, "$_") or death("Cannot open '$_': $!") ;
+
+    print Q<<"EOF" ;
+#
+#/* INCLUDE:  Including '$_' from '$filename' */
+#
+EOF
+
+    $filename = $_ ;
+
+    # Prime the pump by reading the first
+    # non-blank line
+
+    # skip leading blank lines
+    while (<$FH>) {
+        last unless /^\s*$/ ;
+    }
+
+    $lastline = $_ ;
+    $lastline_no = $. ;
+
+}
+
+sub PopFile()
+{
+    return 0 unless $XSStack[-1]{type} eq 'file' ;
+
+    my $data     = pop @XSStack ;
+    my $ThisFile = $filename ;
+    my $isPipe   = ($filename =~ /\|\s*$/) ;
+
+    -- $IncludedFiles{$filename}
+        unless $isPipe ;
+
+    close $FH ;
+
+    $FH         = $data->{Handle} ;
+    $filename   = $data->{Filename} ;
+    $lastline   = $data->{LastLine} ;
+    $lastline_no = $data->{LastLineNo} ;
+    @line       = @{ $data->{Line} } ;
+    @line_no    = @{ $data->{LineNo} } ;
+
+    if ($isPipe and $? ) {
+        -- $lastline_no ;
+        print STDERR "Error reading from pipe '$ThisFile': $! in $filename, line $lastline_no\n"  ;
+        exit 1 ;
+    }
+
+    print Q<<"EOF" ;
+#
+#/* INCLUDE: Returning to '$filename' from '$ThisFile' */
+#
+EOF
+
+    return 1 ;
+}
+
+sub ValidProtoString ($)
+{
+    my($string) = @_ ;
+
+    if ( $string =~ /^$proto_re+$/ ) {
+        return $string ;
+    }
+
+    return 0 ;
+}
+
+sub C_string ($)
+{
+    my($string) = @_ ;
+
+    $string =~ s[\\][\\\\]g ;
+    $string ;
+}
+
+sub ProtoString ($)
+{
+    my ($type) = @_ ;
+
+    $proto_letter{$type} or "\$" ;
+}
+
+sub check_cpp {
+    my @cpp = grep(/^\#\s*(?:if|e\w+)/, @line);
+    if (@cpp) {
+	my ($cpp, $cpplevel);
+	for $cpp (@cpp) {
+	    if ($cpp =~ /^\#\s*if/) {
+		$cpplevel++;
+	    } elsif (!$cpplevel) {
+		Warn("Warning: #else/elif/endif without #if in this function");
+		print STDERR "    (precede it with a blank line if the matching #if is outside the function)\n"
+		    if $XSStack[-1]{type} eq 'if';
+		return;
+	    } elsif ($cpp =~ /^\#\s*endif/) {
+		$cpplevel--;
+	    }
+	}
+	Warn("Warning: #if without #endif in this function") if $cpplevel;
+    }
+}
+
+
+sub Q {
+    my($text) = @_;
+    $text =~ s/^#//gm;
+    $text =~ s/\[\[/{/g;
+    $text =~ s/\]\]/}/g;
+    $text;
+}
+
+open($FH, $filename) or die "cannot open $filename: $!\n";
+
+# Identify the version of xsubpp used
+print <<EOM ;
+/*
+ * This file was generated automatically by xsubpp version $XSUBPP_version from the
+ * contents of $filename. Do not edit this file, edit $filename instead.
+ *
+ *	ANY CHANGES MADE HERE WILL BE LOST!
+ *
+ */
+
+EOM
+
+
+print("#line 1 \"$filename\"\n")
+    if $WantLineNumbers;
+
+firstmodule:
+while (<$FH>) {
+    if (/^=/) {
+        my $podstartline = $.;
+    	do {
+	    if (/^=cut\s*$/) {
+		# We can't just write out a /* */ comment, as our embedded
+		# POD might itself be in a comment. We can't put a /**/
+		# comment inside #if 0, as the C standard says that the source
+		# file is decomposed into preprocessing characters in the stage
+		# before preprocessing commands are executed.
+		# I don't want to leave the text as barewords, because the spec
+		# isn't clear whether macros are expanded before or after
+		# preprocessing commands are executed, and someone pathological
+		# may just have defined one of the 3 words as a macro that does
+		# something strange. Multiline strings are illegal in C, so
+		# the "" we write must be a string literal. And they aren't
+		# concatenated until 2 steps later, so we are safe.
+		print("#if 0\n  \"Skipped embedded POD.\"\n#endif\n");
+		printf("#line %d \"$filename\"\n", $. + 1)
+		  if $WantLineNumbers;
+		next firstmodule
+	    }
+
+	} while (<$FH>);
+	# At this point $. is at end of file so die won't state the start
+	# of the problem, and as we haven't yet read any lines &death won't
+	# show the correct line in the message either.
+	die ("Error: Unterminated pod in $filename, line $podstartline\n")
+	  unless $lastline;
+    }
+    last if ($Module, $Package, $Prefix) =
+	/^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/;
+
+    print $_;
+}
+&Exit unless defined $_;
+
+print "$xsubpp::counter::SECTION_END_MARKER\n" if $WantLineNumbers;
+
+$lastline    = $_;
+$lastline_no = $.;
+
+# Read next xsub into @line from ($lastline, <$FH>).
+sub fetch_para {
+    # parse paragraph
+    death ("Error: Unterminated `#if/#ifdef/#ifndef'")
+	if !defined $lastline && $XSStack[-1]{type} eq 'if';
+    @line = ();
+    @line_no = () ;
+    return PopFile() if !defined $lastline;
+
+    if ($lastline =~
+	/^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/) {
+	$Module = $1;
+	$Package = defined($2) ? $2 : '';	# keep -w happy
+	$Prefix  = defined($3) ? $3 : '';	# keep -w happy
+	$Prefix = quotemeta $Prefix ;
+	($Module_cname = $Module) =~ s/\W/_/g;
+	($Packid = $Package) =~ tr/:/_/;
+	$Packprefix = $Package;
+	$Packprefix .= "::" if $Packprefix ne "";
+	$lastline = "";
+    }
+
+    for(;;) {
+	# Skip embedded PODs
+	while ($lastline =~ /^=/) {
+    	    while ($lastline = <$FH>) {
+	    	last if ($lastline =~ /^=cut\s*$/);
+	    }
+	    death ("Error: Unterminated pod") unless $lastline;
+	    $lastline = <$FH>;
+	    chomp $lastline;
+	    $lastline =~ s/^\s+$//;
+	}
+	if ($lastline !~ /^\s*#/ ||
+	    # CPP directives:
+	    #	ANSI:	if ifdef ifndef elif else endif define undef
+	    #		line error pragma
+	    #	gcc:	warning include_next
+	    #   obj-c:	import
+	    #   others:	ident (gcc notes that some cpps have this one)
+	    $lastline =~ /^#[ \t]*(?:(?:if|ifn?def|elif|else|endif|define|undef|pragma|error|warning|line\s+\d+|ident)\b|(?:include(?:_next)?|import)\s*["<].*[>"])/) {
+	    last if $lastline =~ /^\S/ && @line && $line[-1] eq "";
+	    push(@line, $lastline);
+	    push(@line_no, $lastline_no) ;
+	}
+
+	# Read next line and continuation lines
+	last unless defined($lastline = <$FH>);
+	$lastline_no = $.;
+	my $tmp_line;
+	$lastline .= $tmp_line
+	    while ($lastline =~ /\\$/ && defined($tmp_line = <$FH>));
+
+	chomp $lastline;
+	$lastline =~ s/^\s+$//;
+    }
+    pop(@line), pop(@line_no) while @line && $line[-1] eq "";
+    1;
+}
+
+PARAGRAPH:
+while (fetch_para()) {
+    # Print initial preprocessor statements and blank lines
+    while (@line && $line[0] !~ /^[^\#]/) {
+	my $line = shift(@line);
+	print $line, "\n";
+	next unless $line =~ /^\#\s*((if)(?:n?def)?|elsif|else|endif)\b/;
+	my $statement = $+;
+	if ($statement eq 'if') {
+	    $XSS_work_idx = @XSStack;
+	    push(@XSStack, {type => 'if'});
+	} else {
+	    death ("Error: `$statement' with no matching `if'")
+		if $XSStack[-1]{type} ne 'if';
+	    if ($XSStack[-1]{varname}) {
+		push(@InitFileCode, "#endif\n");
+		push(@BootCode,     "#endif");
+	    }
+
+	    my(@fns) = keys %{$XSStack[-1]{functions}};
+	    if ($statement ne 'endif') {
+		# Hide the functions defined in other #if branches, and reset.
+		@{$XSStack[-1]{other_functions}}{@fns} = (1) x @fns;
+		@{$XSStack[-1]}{qw(varname functions)} = ('', {});
+	    } else {
+		my($tmp) = pop(@XSStack);
+		0 while (--$XSS_work_idx
+			 && $XSStack[$XSS_work_idx]{type} ne 'if');
+		# Keep all new defined functions
+		push(@fns, keys %{$tmp->{other_functions}});
+		@{$XSStack[$XSS_work_idx]{functions}}{@fns} = (1) x @fns;
+	    }
+	}
+    }
+
+    next PARAGRAPH unless @line;
+
+    if ($XSS_work_idx && !$XSStack[$XSS_work_idx]{varname}) {
+	# We are inside an #if, but have not yet #defined its xsubpp variable.
+	print "#define $cpp_next_tmp 1\n\n";
+	push(@InitFileCode, "#if $cpp_next_tmp\n");
+	push(@BootCode,     "#if $cpp_next_tmp");
+	$XSStack[$XSS_work_idx]{varname} = $cpp_next_tmp++;
+    }
+
+    death ("Code is not inside a function"
+	   ." (maybe last function was ended by a blank line "
+	   ." followed by a statement on column one?)")
+	if $line[0] =~ /^\s/;
+
+    # initialize info arrays
+    undef(%args_match);
+    undef(%var_types);
+    undef(%defaults);
+    undef($class);
+    undef($externC);
+    undef($static);
+    undef($elipsis);
+    undef($wantRETVAL) ;
+    undef($RETVAL_no_return) ;
+    undef(%arg_list) ;
+    undef(@proto_arg) ;
+    undef(@fake_INPUT_pre) ;	# For length(s) generated variables
+    undef(@fake_INPUT) ;
+    undef($processing_arg_with_types) ;
+    undef(%argtype_seen) ;
+    undef(@outlist) ;
+    undef(%in_out) ;
+    undef(%lengthof) ;
+    # undef(%islengthof) ;
+    undef($proto_in_this_xsub) ;
+    undef($scope_in_this_xsub) ;
+    undef($interface);
+    undef($prepush_done);
+    $interface_macro = 'XSINTERFACE_FUNC' ;
+    $interface_macro_set = 'XSINTERFACE_FUNC_SET' ;
+    $ProtoThisXSUB = $WantPrototypes ;
+    $ScopeThisXSUB = 0;
+    $xsreturn = 0;
+
+    $_ = shift(@line);
+    while ($kwd = check_keyword("REQUIRE|PROTOTYPES|FALLBACK|VERSIONCHECK|INCLUDE")) {
+        &{"${kwd}_handler"}() ;
+        next PARAGRAPH unless @line ;
+        $_ = shift(@line);
+    }
+
+    if (check_keyword("BOOT")) {
+	&check_cpp;
+	push (@BootCode, "#line $line_no[@line_no - @line] \"$filename\"")
+	  if $WantLineNumbers && $line[0] !~ /^\s*#\s*line\b/;
+        push (@BootCode, @line, "") ;
+        next PARAGRAPH ;
+    }
+
+
+    # extract return type, function name and arguments
+    ($ret_type) = TidyType($_);
+    $RETVAL_no_return = 1 if $ret_type =~ s/^NO_OUTPUT\s+//;
+
+    # Allow one-line ANSI-like declaration
+    unshift @line, $2
+      if $process_argtypes
+	and $ret_type =~ s/^(.*?\w.*?)\s*\b(\w+\s*\(.*)/$1/s;
+
+    # a function definition needs at least 2 lines
+    blurt ("Error: Function definition too short '$ret_type'"), next PARAGRAPH
+	unless @line ;
+
+    $externC = 1 if $ret_type =~ s/^extern "C"\s+//;
+    $static  = 1 if $ret_type =~ s/^static\s+//;
+
+    $func_header = shift(@line);
+    blurt ("Error: Cannot parse function definition from '$func_header'"), next PARAGRAPH
+	unless $func_header =~ /^(?:([\w:]*)::)?(\w+)\s*\(\s*(.*?)\s*\)\s*(const)?\s*(;\s*)?$/s;
+
+    ($class, $func_name, $orig_args) =  ($1, $2, $3) ;
+    $class = "$4 $class" if $4;
+    ($pname = $func_name) =~ s/^($Prefix)?/$Packprefix/;
+    ($clean_func_name = $func_name) =~ s/^$Prefix//;
+    $Full_func_name = "${Packid}_$clean_func_name";
+    if ($Is_VMS) { $Full_func_name = $SymSet->addsym($Full_func_name); }
+
+    # Check for duplicate function definition
+    for $tmp (@XSStack) {
+	next unless defined $tmp->{functions}{$Full_func_name};
+	Warn("Warning: duplicate function definition '$clean_func_name' detected");
+	last;
+    }
+    $XSStack[$XSS_work_idx]{functions}{$Full_func_name} ++ ;
+    %XsubAliases = %XsubAliasValues = %Interfaces = @Attributes = ();
+    $DoSetMagic = 1;
+
+    $orig_args =~ s/\\\s*/ /g;		# process line continuations
+
+    my %only_C_inlist;	# Not in the signature of Perl function
+    if ($process_argtypes and $orig_args =~ /\S/) {
+	my $args = "$orig_args ,";
+	if ($args =~ /^( (??{ $C_arg }) , )* $ /x) {
+	    @args = ($args =~ /\G ( (??{ $C_arg }) ) , /xg);
+	    for ( @args ) {
+		s/^\s+//;
+		s/\s+$//;
+		my ($arg, $default) = / ( [^=]* ) ( (?: = .* )? ) /x;
+		my ($pre, $name) = ($arg =~ /(.*?) \s*
+					     \b ( \w+ | length\( \s*\w+\s* \) )
+					     \s* $ /x);
+		next unless length $pre;
+		my $out_type;
+		my $inout_var;
+		if ($process_inout and s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\s+//) {
+		    my $type = $1;
+		    $out_type = $type if $type ne 'IN';
+		    $arg =~ s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\s+//;
+		    $pre =~ s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\s+//;
+		}
+		my $islength;
+		if ($name =~ /^length\( \s* (\w+) \s* \)\z/x) {
+		  $name = "XSauto_length_of_$1";
+		  $islength = 1;
+		  die "Default value on length() argument: `$_'"
+		    if length $default;
+		}
+		if (length $pre or $islength) {	# Has a type
+		    if ($islength) {
+		      push @fake_INPUT_pre, $arg;
+		    } else {
+		      push @fake_INPUT, $arg;
+		    }
+		    # warn "pushing '$arg'\n";
+		    $argtype_seen{$name}++;
+		    $_ = "$name$default"; # Assigns to @args
+		}
+		$only_C_inlist{$_} = 1 if $out_type eq "OUTLIST" or $islength;
+		push @outlist, $name if $out_type =~ /OUTLIST$/;
+		$in_out{$name} = $out_type if $out_type;
+	    }
+	} else {
+	    @args = split(/\s*,\s*/, $orig_args);
+	    Warn("Warning: cannot parse argument list '$orig_args', fallback to split");
+	}
+    } else {
+	@args = split(/\s*,\s*/, $orig_args);
+	for (@args) {
+	    if ($process_inout and s/^(IN|IN_OUTLIST|OUTLIST|IN_OUT|OUT)\s+//) {
+		my $out_type = $1;
+		next if $out_type eq 'IN';
+		$only_C_inlist{$_} = 1 if $out_type eq "OUTLIST";
+		push @outlist, $name if $out_type =~ /OUTLIST$/;
+		$in_out{$_} = $out_type;
+	    }
+	}
+    }
+    if (defined($class)) {
+	my $arg0 = ((defined($static) or $func_name eq 'new')
+		    ? "CLASS" : "THIS");
+	unshift(@args, $arg0);
+	($report_args = "$arg0, $report_args") =~ s/^\w+, $/$arg0/;
+    }
+    my $extra_args = 0;
+    @args_num = ();
+    $num_args = 0;
+    my $report_args = '';
+    foreach $i (0 .. $#args) {
+	    if ($args[$i] =~ s/\.\.\.//) {
+		    $elipsis = 1;
+		    if ($args[$i] eq '' && $i == $#args) {
+		        $report_args .= ", ...";
+			pop(@args);
+			last;
+		    }
+	    }
+	    if ($only_C_inlist{$args[$i]}) {
+		push @args_num, undef;
+	    } else {
+		push @args_num, ++$num_args;
+		$report_args .= ", $args[$i]";
+	    }
+	    if ($args[$i] =~ /^([^=]*[^\s=])\s*=\s*(.*)/s) {
+		    $extra_args++;
+		    $args[$i] = $1;
+		    $defaults{$args[$i]} = $2;
+		    $defaults{$args[$i]} =~ s/"/\\"/g;
+	    }
+	    $proto_arg[$i+1] = "\$" ;
+    }
+    $min_args = $num_args - $extra_args;
+    $report_args =~ s/"/\\"/g;
+    $report_args =~ s/^,\s+//;
+    my @func_args = @args;
+    shift @func_args if defined($class);
+
+    for (@func_args) {
+	s/^/&/ if $in_out{$_};
+    }
+    $func_args = join(", ", @func_args);
+    @args_match{@args} = @args_num;
+
+    $PPCODE = grep(/^\s*PPCODE\s*:/, @line);
+    $CODE = grep(/^\s*CODE\s*:/, @line);
+    # Detect CODE: blocks which use ST(n)= or XST_m*(n,v)
+    #   to set explicit return values.
+    $EXPLICIT_RETURN = ($CODE &&
+		("@line" =~ /(\bST\s*\([^;]*=) | (\bXST_m\w+\s*\()/x ));
+    $ALIAS  = grep(/^\s*ALIAS\s*:/,  @line);
+    $INTERFACE  = grep(/^\s*INTERFACE\s*:/,  @line);
+
+    $xsreturn = 1 if $EXPLICIT_RETURN;
+
+    $externC = $externC ? qq[extern "C"] : "";
+
+    # print function header
+    print Q<<"EOF";
+#$externC
+#XS(XS_${Full_func_name}); /* prototype to pass -Wmissing-prototypes */
+#XS(XS_${Full_func_name})
+#[[
+#    dXSARGS;
+EOF
+    print Q<<"EOF" if $ALIAS ;
+#    dXSI32;
+EOF
+    print Q<<"EOF" if $INTERFACE ;
+#    dXSFUNCTION($ret_type);
+EOF
+    if ($elipsis) {
+	$cond = ($min_args ? qq(items < $min_args) : 0);
+    }
+    elsif ($min_args == $num_args) {
+	$cond = qq(items != $min_args);
+    }
+    else {
+	$cond = qq(items < $min_args || items > $num_args);
+    }
+
+    print Q<<"EOF" if $except;
+#    char errbuf[1024];
+#    *errbuf = '\0';
+EOF
+
+    if ($ALIAS)
+      { print Q<<"EOF" if $cond }
+#    if ($cond)
+#       Perl_croak(aTHX_ "Usage: %s($report_args)", GvNAME(CvGV(cv)));
+EOF
+    else
+      { print Q<<"EOF" if $cond }
+#    if ($cond)
+#	Perl_croak(aTHX_ "Usage: $pname($report_args)");
+EOF
+
+    #gcc -Wall: if an xsub has no arguments and PPCODE is used
+    #it is likely none of ST, XSRETURN or XSprePUSH macros are used
+    #hence `ax' (setup by dXSARGS) is unused
+    #XXX: could breakup the dXSARGS; into dSP;dMARK;dITEMS
+    #but such a move could break third-party extensions
+    print Q<<"EOF" if $PPCODE and $num_args == 0;
+#   PERL_UNUSED_VAR(ax); /* -Wall */
+EOF
+
+    print Q<<"EOF" if $PPCODE;
+#    SP -= items;
+EOF
+
+    # Now do a block of some sort.
+
+    $condnum = 0;
+    $cond = '';			# last CASE: condidional
+    push(@line, "$END:");
+    push(@line_no, $line_no[-1]);
+    $_ = '';
+    &check_cpp;
+    while (@line) {
+	&CASE_handler if check_keyword("CASE");
+	print Q<<"EOF";
+#   $except [[
+EOF
+
+	# do initialization of input variables
+	$thisdone = 0;
+	$retvaldone = 0;
+	$deferred = "";
+	%arg_list = () ;
+        $gotRETVAL = 0;
+
+	INPUT_handler() ;
+	process_keyword("INPUT|PREINIT|INTERFACE_MACRO|C_ARGS|ALIAS|ATTRS|PROTOTYPE|SCOPE|OVERLOAD") ;
+
+	print Q<<"EOF" if $ScopeThisXSUB;
+#   ENTER;
+#   [[
+EOF
+	
+	if (!$thisdone && defined($class)) {
+	    if (defined($static) or $func_name eq 'new') {
+		print "\tchar *";
+		$var_types{"CLASS"} = "char *";
+		&generate_init("char *", 1, "CLASS");
+	    }
+	    else {
+		print "\t$class *";
+		$var_types{"THIS"} = "$class *";
+		&generate_init("$class *", 1, "THIS");
+	    }
+	}
+
+	# do code
+	if (/^\s*NOT_IMPLEMENTED_YET/) {
+		print "\n\tPerl_croak(aTHX_ \"$pname: not implemented yet\");\n";
+		$_ = '' ;
+	} else {
+		if ($ret_type ne "void") {
+			print "\t" . &map_type($ret_type, 'RETVAL') . ";\n"
+				if !$retvaldone;
+			$args_match{"RETVAL"} = 0;
+			$var_types{"RETVAL"} = $ret_type;
+			print "\tdXSTARG;\n"
+				if $WantOptimize and $targetable{$type_kind{$ret_type}};
+		}
+
+		if (@fake_INPUT or @fake_INPUT_pre) {
+		    unshift @line, @fake_INPUT_pre, @fake_INPUT, $_;
+		    $_ = "";
+		    $processing_arg_with_types = 1;
+		    INPUT_handler() ;
+		}
+		print $deferred;
+
+        process_keyword("INIT|ALIAS|ATTRS|PROTOTYPE|INTERFACE_MACRO|INTERFACE|C_ARGS|OVERLOAD") ;
+
+		if (check_keyword("PPCODE")) {
+			print_section();
+			death ("PPCODE must be last thing") if @line;
+			print "\tLEAVE;\n" if $ScopeThisXSUB;
+			print "\tPUTBACK;\n\treturn;\n";
+		} elsif (check_keyword("CODE")) {
+			print_section() ;
+		} elsif (defined($class) and $func_name eq "DESTROY") {
+			print "\n\t";
+			print "delete THIS;\n";
+		} else {
+			print "\n\t";
+			if ($ret_type ne "void") {
+				print "RETVAL = ";
+				$wantRETVAL = 1;
+			}
+			if (defined($static)) {
+			    if ($func_name eq 'new') {
+				$func_name = "$class";
+			    } else {
+				print "${class}::";
+			    }
+			} elsif (defined($class)) {
+			    if ($func_name eq 'new') {
+				$func_name .= " $class";
+			    } else {
+				print "THIS->";
+			    }
+			}
+			$func_name =~ s/^($spat)//
+			    if defined($spat);
+			$func_name = 'XSFUNCTION' if $interface;
+			print "$func_name($func_args);\n";
+		}
+	}
+
+	# do output variables
+	$gotRETVAL = 0;		# 1 if RETVAL seen in OUTPUT section;
+	undef $RETVAL_code ;	# code to set RETVAL (from OUTPUT section);
+	# $wantRETVAL set if 'RETVAL =' autogenerated
+	($wantRETVAL, $ret_type) = (0, 'void') if $RETVAL_no_return;
+	undef %outargs ;
+	process_keyword("POSTCALL|OUTPUT|ALIAS|ATTRS|PROTOTYPE|OVERLOAD");
+
+	&generate_output($var_types{$_}, $args_match{$_}, $_, $DoSetMagic)
+	  for grep $in_out{$_} =~ /OUT$/, keys %in_out;
+
+	# all OUTPUT done, so now push the return value on the stack
+	if ($gotRETVAL && $RETVAL_code) {
+	    print "\t$RETVAL_code\n";
+	} elsif ($gotRETVAL || $wantRETVAL) {
+	    my $t = $WantOptimize && $targetable{$type_kind{$ret_type}};
+	    my $var = 'RETVAL';
+	    my $type = $ret_type;
+
+	    # 0: type, 1: with_size, 2: how, 3: how_size
+	    if ($t and not $t->[1] and $t->[0] eq 'p') {
+		# PUSHp corresponds to setpvn.  Treate setpv directly
+		my $what = eval qq("$t->[2]");
+		warn $@ if $@;
+
+		print "\tsv_setpv(TARG, $what); XSprePUSH; PUSHTARG;\n";
+		$prepush_done = 1;
+	    }
+	    elsif ($t) {
+		my $what = eval qq("$t->[2]");
+		warn $@ if $@;
+
+		my $size = $t->[3];
+		$size = '' unless defined $size;
+		$size = eval qq("$size");
+		warn $@ if $@;
+		print "\tXSprePUSH; PUSH$t->[0]($what$size);\n";
+		$prepush_done = 1;
+	    }
+	    else {
+		# RETVAL almost never needs SvSETMAGIC()
+		&generate_output($ret_type, 0, 'RETVAL', 0);
+	    }
+	}
+
+	$xsreturn = 1 if $ret_type ne "void";
+	my $num = $xsreturn;
+	my $c = @outlist;
+	# (PP)CODE set different values of SP; reset to PPCODE's with 0 output
+	print "\tXSprePUSH;"    if $c and not $prepush_done;
+	# Take into account stuff already put on stack
+	print "\t++SP;"         if $c and not $prepush_done and $xsreturn;
+	# Now SP corresponds to ST($xsreturn), so one can combine PUSH and ST()
+	print "\tEXTEND(SP,$c);\n" if $c;
+	$xsreturn += $c;
+	generate_output($var_types{$_}, $num++, $_, 0, 1) for @outlist;
+
+	# do cleanup
+	process_keyword("CLEANUP|ALIAS|ATTRS|PROTOTYPE|OVERLOAD") ;
+
+	print Q<<"EOF" if $ScopeThisXSUB;
+#   ]]
+EOF
+	print Q<<"EOF" if $ScopeThisXSUB and not $PPCODE;
+#   LEAVE;
+EOF
+
+	# print function trailer
+	print Q<<EOF;
+#    ]]
+EOF
+	print Q<<EOF if $except;
+#    BEGHANDLERS
+#    CATCHALL
+#	sprintf(errbuf, "%s: %s\\tpropagated", Xname, Xreason);
+#    ENDHANDLERS
+EOF
+	if (check_keyword("CASE")) {
+	    blurt ("Error: No `CASE:' at top of function")
+		unless $condnum;
+	    $_ = "CASE: $_";	# Restore CASE: label
+	    next;
+	}
+	last if $_ eq "$END:";
+	death(/^$BLOCK_re/o ? "Misplaced `$1:'" : "Junk at end of function");
+    }
+
+    print Q<<EOF if $except;
+#    if (errbuf[0])
+#	Perl_croak(aTHX_ errbuf);
+EOF
+
+    if ($xsreturn) {
+        print Q<<EOF unless $PPCODE;
+#    XSRETURN($xsreturn);
+EOF
+    } else {
+        print Q<<EOF unless $PPCODE;
+#    XSRETURN_EMPTY;
+EOF
+    }
+
+    print Q<<EOF;
+#]]
+#
+EOF
+
+    my $newXS = "newXS" ;
+    my $proto = "" ;
+
+    # Build the prototype string for the xsub
+    if ($ProtoThisXSUB) {
+	$newXS = "newXSproto";
+
+	if ($ProtoThisXSUB eq 2) {
+	    # User has specified empty prototype
+	    $proto = ', ""' ;
+	}
+        elsif ($ProtoThisXSUB ne 1) {
+            # User has specified a prototype
+            $proto = ', "' . $ProtoThisXSUB . '"';
+        }
+        else {
+	    my $s = ';';
+            if ($min_args < $num_args)  {
+                $s = '';
+		$proto_arg[$min_args] .= ";" ;
+	    }
+            push @proto_arg, "$s\@"
+                if $elipsis ;
+
+            $proto = ', "' . join ("", @proto_arg) . '"';
+        }
+    }
+
+    if (%XsubAliases) {
+	$XsubAliases{$pname} = 0
+	    unless defined $XsubAliases{$pname} ;
+	while ( ($name, $value) = each %XsubAliases) {
+	    push(@InitFileCode, Q<<"EOF");
+#        cv = newXS(\"$name\", XS_$Full_func_name, file);
+#        XSANY.any_i32 = $value ;
+EOF
+	push(@InitFileCode, Q<<"EOF") if $proto;
+#        sv_setpv((SV*)cv$proto) ;
+EOF
+        }
+    }
+    elsif (@Attributes) {
+	    push(@InitFileCode, Q<<"EOF");
+#        cv = newXS(\"$pname\", XS_$Full_func_name, file);
+#        apply_attrs_string("$Package", cv, "@Attributes", 0);
+EOF
+    }
+    elsif ($interface) {
+	while ( ($name, $value) = each %Interfaces) {
+	    $name = "$Package\::$name" unless $name =~ /::/;
+	    push(@InitFileCode, Q<<"EOF");
+#        cv = newXS(\"$name\", XS_$Full_func_name, file);
+#        $interface_macro_set(cv,$value) ;
+EOF
+	    push(@InitFileCode, Q<<"EOF") if $proto;
+#        sv_setpv((SV*)cv$proto) ;
+EOF
+        }
+    }
+    else {
+	push(@InitFileCode,
+	     "        ${newXS}(\"$pname\", XS_$Full_func_name, file$proto);\n");
+    }
+}
+
+if ($Overload) # make it findable with fetchmethod
+{
+    
+    print Q<<"EOF"; 
+#XS(XS_${Packid}_nil); /* prototype to pass -Wmissing-prototypes */
+#XS(XS_${Packid}_nil)
+#{
+#   XSRETURN_EMPTY;
+#}
+#
+EOF
+    unshift(@InitFileCode, <<"MAKE_FETCHMETHOD_WORK");
+    /* Making a sub named "${Package}::()" allows the package */
+    /* to be findable via fetchmethod(), and causes */
+    /* overload::Overloaded("${Package}") to return true. */
+    newXS("${Package}::()", XS_${Packid}_nil, file$proto);
+MAKE_FETCHMETHOD_WORK
+}
+
+# print initialization routine
+
+print Q<<"EOF";
+##ifdef __cplusplus
+#extern "C"
+##endif
+EOF
+
+print Q<<"EOF";
+#XS(boot_$Module_cname); /* prototype to pass -Wmissing-prototypes */
+#XS(boot_$Module_cname)
+EOF
+
+print Q<<"EOF";
+#[[
+#    dXSARGS;
+EOF
+
+#-Wall: if there is no $Full_func_name there are no xsubs in this .xs
+#so `file' is unused
+print Q<<"EOF" if $Full_func_name;
+#    char* file = __FILE__;
+EOF
+
+print Q "#\n";
+
+print Q<<"EOF" if $WantVersionChk ;
+#    XS_VERSION_BOOTCHECK ;
+#
+EOF
+
+print Q<<"EOF" if defined $XsubAliases or defined $Interfaces ;
+#    {
+#        CV * cv ;
+#
+EOF
+
+print Q<<"EOF" if ($Overload);
+#    /* register the overloading (type 'A') magic */
+#    PL_amagic_generation++;
+#    /* The magic for overload gets a GV* via gv_fetchmeth as */
+#    /* mentioned above, and looks in the SV* slot of it for */
+#    /* the "fallback" status. */
+#    sv_setsv(
+#        get_sv( "${Package}::()", TRUE ),
+#        $Fallback
+#    );
+EOF
+
+print @InitFileCode;
+
+print Q<<"EOF" if defined $XsubAliases or defined $Interfaces ;
+#    }
+EOF
+
+if (@BootCode)
+{
+    print "\n    /* Initialisation Section */\n\n" ;
+    @line = @BootCode;
+    print_section();
+    print "\n    /* End of Initialisation Section */\n\n" ;
+}
+
+print Q<<"EOF";;
+#    XSRETURN_YES;
+#]]
+#
+EOF
+
+warn("Please specify prototyping behavior for $filename (see perlxs manual)\n")
+    unless $ProtoUsed ;
+&Exit;
+
+sub output_init {
+    local($type, $num, $var, $init, $name_printed) = @_;
+    local($arg) = "ST(" . ($num - 1) . ")";
+
+    if(  $init =~ /^=/  ) {
+        if ($name_printed) {
+	  eval qq/print " $init\\n"/;
+	} else {
+	  eval qq/print "\\t$var $init\\n"/;
+	}
+	warn $@   if  $@;
+    } else {
+	if(  $init =~ s/^\+//  &&  $num  ) {
+	    &generate_init($type, $num, $var, $name_printed);
+	} elsif ($name_printed) {
+	    print ";\n";
+	    $init =~ s/^;//;
+	} else {
+	    eval qq/print "\\t$var;\\n"/;
+	    warn $@   if  $@;
+	    $init =~ s/^;//;
+	}
+	$deferred .= eval qq/"\\n\\t$init\\n"/;
+	warn $@   if  $@;
+    }
+}
+
+sub Warn
+{
+    # work out the line number
+    my $line_no = $line_no[@line_no - @line -1] ;
+
+    print STDERR "@_ in $filename, line $line_no\n" ;
+}
+
+sub blurt
+{
+    Warn @_ ;
+    $errors ++
+}
+
+sub death
+{
+    Warn @_ ;
+    exit 1 ;
+}
+
+sub generate_init {
+    local($type, $num, $var) = @_;
+    local($arg) = "ST(" . ($num - 1) . ")";
+    local($argoff) = $num - 1;
+    local($ntype);
+    local($tk);
+
+    $type = TidyType($type) ;
+    blurt("Error: '$type' not in typemap"), return
+	unless defined($type_kind{$type});
+
+    ($ntype = $type) =~ s/\s*\*/Ptr/g;
+    ($subtype = $ntype) =~ s/(?:Array)?(?:Ptr)?$//;
+    $tk = $type_kind{$type};
+    $tk =~ s/OBJ$/REF/ if $func_name =~ /DESTROY$/;
+    if ($tk eq 'T_PV' and exists $lengthof{$var}) {
+      print "\t$var" unless $name_printed;
+      print " = ($type)SvPV($arg, STRLEN_length_of_$var);\n";
+      die "default value not supported with length(NAME) supplied"
+	if defined $defaults{$var};
+      return;
+    }
+    $type =~ tr/:/_/ unless $hiertype;
+    blurt("Error: No INPUT definition for type '$type', typekind '$type_kind{$type}' found"), return
+        unless defined $input_expr{$tk} ;
+    $expr = $input_expr{$tk};
+    if ($expr =~ /DO_ARRAY_ELEM/) {
+        blurt("Error: '$subtype' not in typemap"), return
+	    unless defined($type_kind{$subtype});
+        blurt("Error: No INPUT definition for type '$subtype', typekind '$type_kind{$subtype}' found"), return
+            unless defined $input_expr{$type_kind{$subtype}} ;
+	$subexpr = $input_expr{$type_kind{$subtype}};
+        $subexpr =~ s/\$type/\$subtype/g;
+	$subexpr =~ s/ntype/subtype/g;
+	$subexpr =~ s/\$arg/ST(ix_$var)/g;
+	$subexpr =~ s/\n\t/\n\t\t/g;
+	$subexpr =~ s/is not of (.*\")/[arg %d] is not of $1, ix_$var + 1/g;
+	$subexpr =~ s/\$var/${var}[ix_$var - $argoff]/;
+	$expr =~ s/DO_ARRAY_ELEM/$subexpr/;
+    }
+    if ($expr =~ m#/\*.*scope.*\*/#i) { # "scope" in C comments
+    	$ScopeThisXSUB = 1;
+    }
+    if (defined($defaults{$var})) {
+	    $expr =~ s/(\t+)/$1    /g;
+	    $expr =~ s/        /\t/g;
+	    if ($name_printed) {
+	      print ";\n";
+	    } else {
+	      eval qq/print "\\t$var;\\n"/;
+	      warn $@   if  $@;
+	    }
+	    if ($defaults{$var} eq 'NO_INIT') {
+		$deferred .= eval qq/"\\n\\tif (items >= $num) {\\n$expr;\\n\\t}\\n"/;
+	    } else {
+		$deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t    $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
+	    }
+	    warn $@   if  $@;
+    } elsif ($ScopeThisXSUB or $expr !~ /^\s*\$var =/) {
+	    if ($name_printed) {
+	      print ";\n";
+	    } else {
+	      eval qq/print "\\t$var;\\n"/;
+	      warn $@   if  $@;
+	    }
+	    $deferred .= eval qq/"\\n$expr;\\n"/;
+	    warn $@   if  $@;
+    } else {
+	    die "panic: do not know how to handle this branch for function pointers"
+	      if $name_printed;
+	    eval qq/print "$expr;\\n"/;
+	    warn $@   if  $@;
+    }
+}
+
+sub generate_output {
+    local($type, $num, $var, $do_setmagic, $do_push) = @_;
+    local($arg) = "ST(" . ($num - ($num != 0)) . ")";
+    local($argoff) = $num - 1;
+    local($ntype);
+
+    $type = TidyType($type) ;
+    if ($type =~ /^array\(([^,]*),(.*)\)/) {
+            print "\t$arg = sv_newmortal();\n";
+	    print "\tsv_setpvn($arg, (char *)$var, $2 * sizeof($1));\n";
+	    print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
+    } else {
+	    blurt("Error: '$type' not in typemap"), return
+		unless defined($type_kind{$type});
+            blurt("Error: No OUTPUT definition for type '$type', typekind '$type_kind{$type}' found"), return
+                unless defined $output_expr{$type_kind{$type}} ;
+	    ($ntype = $type) =~ s/\s*\*/Ptr/g;
+	    $ntype =~ s/\(\)//g;
+	    ($subtype = $ntype) =~ s/(?:Array)?(?:Ptr)?$//;
+	    $expr = $output_expr{$type_kind{$type}};
+	    if ($expr =~ /DO_ARRAY_ELEM/) {
+	        blurt("Error: '$subtype' not in typemap"), return
+		    unless defined($type_kind{$subtype});
+                blurt("Error: No OUTPUT definition for type '$subtype', typekind '$type_kind{$subtype}' found"), return
+                    unless defined $output_expr{$type_kind{$subtype}} ;
+		$subexpr = $output_expr{$type_kind{$subtype}};
+		$subexpr =~ s/ntype/subtype/g;
+		$subexpr =~ s/\$arg/ST(ix_$var)/g;
+		$subexpr =~ s/\$var/${var}[ix_$var]/g;
+		$subexpr =~ s/\n\t/\n\t\t/g;
+		$expr =~ s/DO_ARRAY_ELEM\n/$subexpr/;
+		eval "print qq\a$expr\a";
+		warn $@   if  $@;
+		print "\t\tSvSETMAGIC(ST(ix_$var));\n" if $do_setmagic;
+	    }
+	    elsif ($var eq 'RETVAL') {
+		if ($expr =~ /^\t\$arg = new/) {
+		    # We expect that $arg has refcnt 1, so we need to
+		    # mortalize it.
+		    eval "print qq\a$expr\a";
+		    warn $@   if  $@;
+		    print "\tsv_2mortal(ST($num));\n";
+		    print "\tSvSETMAGIC(ST($num));\n" if $do_setmagic;
+		}
+		elsif ($expr =~ /^\s*\$arg\s*=/) {
+		    # We expect that $arg has refcnt >=1, so we need
+		    # to mortalize it!
+		    eval "print qq\a$expr\a";
+		    warn $@   if  $@;
+		    print "\tsv_2mortal(ST(0));\n";
+		    print "\tSvSETMAGIC(ST(0));\n" if $do_setmagic;
+		}
+		else {
+		    # Just hope that the entry would safely write it
+		    # over an already mortalized value. By
+		    # coincidence, something like $arg = &sv_undef
+		    # works too.
+		    print "\tST(0) = sv_newmortal();\n";
+		    eval "print qq\a$expr\a";
+		    warn $@   if  $@;
+		    # new mortals don't have set magic
+		}
+	    }
+	    elsif ($do_push) {
+	        print "\tPUSHs(sv_newmortal());\n";
+		$arg = "ST($num)";
+		eval "print qq\a$expr\a";
+		warn $@   if  $@;
+		print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
+	    }
+	    elsif ($arg =~ /^ST\(\d+\)$/) {
+		eval "print qq\a$expr\a";
+		warn $@   if  $@;
+		print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
+	    }
+    }
+}
+
+sub map_type {
+    my($type, $varname) = @_;
+
+    # C++ has :: in types too so skip this
+    $type =~ tr/:/_/ unless $hiertype;
+    $type =~ s/^array\(([^,]*),(.*)\).*/$1 */s;
+    if ($varname) {
+      if ($varname && $type =~ / \( \s* \* (?= \s* \) ) /xg) {
+	(substr $type, pos $type, 0) = " $varname ";
+      } else {
+	$type .= "\t$varname";
+      }
+    }
+    $type;
+}
+
+
+sub Exit {
+# If this is VMS, the exit status has meaning to the shell, so we
+# use a predictable value (SS$_Normal or SS$_Abort) rather than an
+# arbitrary number.
+#    exit ($Is_VMS ? ($errors ? 44 : 1) : $errors) ;
+    exit ($errors ? 1 : 0);
+}
+
+__END__
+:endofperl
Index: /for-distributions/trunk/bin/windows/perl/lib/.packlist
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/.packlist	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/.packlist	(revision 14489)
@@ -0,0 +1,1568 @@
+c:\shaoqunWu\perl\bin/a2p.exe type=file
+c:\shaoqunWu\perl\bin/c2ph.bat type=file
+c:\shaoqunWu\perl\bin/cpan.bat type=file
+c:\shaoqunWu\perl\bin/dprofpp.bat type=file
+c:\shaoqunWu\perl\bin/enc2xs.bat type=file
+c:\shaoqunWu\perl\bin/find2perl.bat type=file
+c:\shaoqunWu\perl\bin/h2ph.bat type=file
+c:\shaoqunWu\perl\bin/h2xs.bat type=file
+c:\shaoqunWu\perl\bin/instmodsh.bat type=file
+c:\shaoqunWu\perl\bin/libnetcfg.bat type=file
+c:\shaoqunWu\perl\bin/perl.exe from=c:\shaoqunWu\perl\bin/perl5.8.8.exe type=link
+c:\shaoqunWu\perl\bin/perl5.8.8.exe type=file
+c:\shaoqunWu\perl\bin/perl58.dll type=file
+c:\shaoqunWu\perl\bin/perlbug.bat type=file
+c:\shaoqunWu\perl\bin/perlcc.bat type=file
+c:\shaoqunWu\perl\bin/perldoc.bat type=file
+c:\shaoqunWu\perl\bin/perlivp.bat type=file
+c:\shaoqunWu\perl\bin/piconv.bat type=file
+c:\shaoqunWu\perl\bin/pl2pm.bat type=file
+c:\shaoqunWu\perl\bin/pod2html.bat type=file
+c:\shaoqunWu\perl\bin/pod2latex.bat type=file
+c:\shaoqunWu\perl\bin/pod2man.bat type=file
+c:\shaoqunWu\perl\bin/pod2text.bat type=file
+c:\shaoqunWu\perl\bin/pod2usage.bat type=file
+c:\shaoqunWu\perl\bin/podchecker.bat type=file
+c:\shaoqunWu\perl\bin/podselect.bat type=file
+c:\shaoqunWu\perl\bin/prove.bat type=file
+c:\shaoqunWu\perl\bin/psed.bat from=c:\shaoqunWu\perl\bin/s2p.bat type=link
+c:\shaoqunWu\perl\bin/pstruct.bat from=c:\shaoqunWu\perl\bin/c2ph.bat type=link
+c:\shaoqunWu\perl\bin/s2p.bat type=file
+c:\shaoqunWu\perl\bin/splain.bat type=file
+c:\shaoqunWu\perl\bin/xsubpp.bat type=file
+c:\shaoqunWu\perl\lib/AnyDBM_File.pm type=file
+c:\shaoqunWu\perl\lib/Attribute/Handlers.pm type=file
+c:\shaoqunWu\perl\lib/AutoLoader.pm type=file
+c:\shaoqunWu\perl\lib/AutoSplit.pm type=file
+c:\shaoqunWu\perl\lib/B.pm type=file
+c:\shaoqunWu\perl\lib/B/Asmdata.pm type=file
+c:\shaoqunWu\perl\lib/B/Assembler.pm type=file
+c:\shaoqunWu\perl\lib/B/Bblock.pm type=file
+c:\shaoqunWu\perl\lib/B/Bytecode.pm type=file
+c:\shaoqunWu\perl\lib/B/C.pm type=file
+c:\shaoqunWu\perl\lib/B/CC.pm type=file
+c:\shaoqunWu\perl\lib/B/Concise.pm type=file
+c:\shaoqunWu\perl\lib/B/Debug.pm type=file
+c:\shaoqunWu\perl\lib/B/Deparse.pm type=file
+c:\shaoqunWu\perl\lib/B/Disassembler.pm type=file
+c:\shaoqunWu\perl\lib/B/Lint.pm type=file
+c:\shaoqunWu\perl\lib/B/Showlex.pm type=file
+c:\shaoqunWu\perl\lib/B/Stackobj.pm type=file
+c:\shaoqunWu\perl\lib/B/Stash.pm type=file
+c:\shaoqunWu\perl\lib/B/Terse.pm type=file
+c:\shaoqunWu\perl\lib/B/Xref.pm type=file
+c:\shaoqunWu\perl\lib/B/assemble type=file
+c:\shaoqunWu\perl\lib/B/cc_harness type=file
+c:\shaoqunWu\perl\lib/B/disassemble type=file
+c:\shaoqunWu\perl\lib/B/makeliblinks type=file
+c:\shaoqunWu\perl\lib/Benchmark.pm type=file
+c:\shaoqunWu\perl\lib/ByteLoader.pm type=file
+c:\shaoqunWu\perl\lib/CGI.pm type=file
+c:\shaoqunWu\perl\lib/CGI/Apache.pm type=file
+c:\shaoqunWu\perl\lib/CGI/Carp.pm type=file
+c:\shaoqunWu\perl\lib/CGI/Cookie.pm type=file
+c:\shaoqunWu\perl\lib/CGI/Fast.pm type=file
+c:\shaoqunWu\perl\lib/CGI/Pretty.pm type=file
+c:\shaoqunWu\perl\lib/CGI/Push.pm type=file
+c:\shaoqunWu\perl\lib/CGI/Switch.pm type=file
+c:\shaoqunWu\perl\lib/CGI/Util.pm type=file
+c:\shaoqunWu\perl\lib/CGI/eg/RunMeFirst type=file
+c:\shaoqunWu\perl\lib/CGI/eg/caution.xbm type=file
+c:\shaoqunWu\perl\lib/CGI/eg/clickable_image.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/cookie.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/crash.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/customize.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/diff_upload.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/dna_small_gif.uu type=file
+c:\shaoqunWu\perl\lib/CGI/eg/file_upload.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/frameset.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/index.html type=file
+c:\shaoqunWu\perl\lib/CGI/eg/internal_links.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/javascript.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/make_links.pl type=file
+c:\shaoqunWu\perl\lib/CGI/eg/monty.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/multiple_forms.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/nph-clock.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/nph-multipart.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/popup.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/save_state.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/tryit.cgi type=file
+c:\shaoqunWu\perl\lib/CGI/eg/wilogo_gif.uu type=file
+c:\shaoqunWu\perl\lib/CORE/EXTERN.h type=file
+c:\shaoqunWu\perl\lib/CORE/INTERN.h type=file
+c:\shaoqunWu\perl\lib/CORE/XSUB.h type=file
+c:\shaoqunWu\perl\lib/CORE/arpa/inet.h type=file
+c:\shaoqunWu\perl\lib/CORE/av.h type=file
+c:\shaoqunWu\perl\lib/CORE/cc_runtime.h type=file
+c:\shaoqunWu\perl\lib/CORE/config.h type=file
+c:\shaoqunWu\perl\lib/CORE/cop.h type=file
+c:\shaoqunWu\perl\lib/CORE/cv.h type=file
+c:\shaoqunWu\perl\lib/CORE/dirent.h type=file
+c:\shaoqunWu\perl\lib/CORE/dosish.h type=file
+c:\shaoqunWu\perl\lib/CORE/embed.h type=file
+c:\shaoqunWu\perl\lib/CORE/embedvar.h type=file
+c:\shaoqunWu\perl\lib/CORE/fakesdio.h type=file
+c:\shaoqunWu\perl\lib/CORE/fakethr.h type=file
+c:\shaoqunWu\perl\lib/CORE/form.h type=file
+c:\shaoqunWu\perl\lib/CORE/gv.h type=file
+c:\shaoqunWu\perl\lib/CORE/handy.h type=file
+c:\shaoqunWu\perl\lib/CORE/hv.h type=file
+c:\shaoqunWu\perl\lib/CORE/intrpvar.h type=file
+c:\shaoqunWu\perl\lib/CORE/iperlsys.h type=file
+c:\shaoqunWu\perl\lib/CORE/keywords.h type=file
+c:\shaoqunWu\perl\lib/CORE/malloc_ctl.h type=file
+c:\shaoqunWu\perl\lib/CORE/mg.h type=file
+c:\shaoqunWu\perl\lib/CORE/netdb.h type=file
+c:\shaoqunWu\perl\lib/CORE/nostdio.h type=file
+c:\shaoqunWu\perl\lib/CORE/op.h type=file
+c:\shaoqunWu\perl\lib/CORE/opcode.h type=file
+c:\shaoqunWu\perl\lib/CORE/opnames.h type=file
+c:\shaoqunWu\perl\lib/CORE/pad.h type=file
+c:\shaoqunWu\perl\lib/CORE/patchlevel.h type=file
+c:\shaoqunWu\perl\lib/CORE/perl.h type=file
+c:\shaoqunWu\perl\lib/CORE/perl58.lib type=file
+c:\shaoqunWu\perl\lib/CORE/perlapi.h type=file
+c:\shaoqunWu\perl\lib/CORE/perlhost.h type=file
+c:\shaoqunWu\perl\lib/CORE/perlio.h type=file
+c:\shaoqunWu\perl\lib/CORE/perliol.h type=file
+c:\shaoqunWu\perl\lib/CORE/perlsdio.h type=file
+c:\shaoqunWu\perl\lib/CORE/perlsfio.h type=file
+c:\shaoqunWu\perl\lib/CORE/perlvars.h type=file
+c:\shaoqunWu\perl\lib/CORE/perly.h type=file
+c:\shaoqunWu\perl\lib/CORE/pp.h type=file
+c:\shaoqunWu\perl\lib/CORE/pp_proto.h type=file
+c:\shaoqunWu\perl\lib/CORE/proto.h type=file
+c:\shaoqunWu\perl\lib/CORE/reentr.h type=file
+c:\shaoqunWu\perl\lib/CORE/reentr.inc type=file
+c:\shaoqunWu\perl\lib/CORE/regcomp.h type=file
+c:\shaoqunWu\perl\lib/CORE/regexp.h type=file
+c:\shaoqunWu\perl\lib/CORE/regnodes.h type=file
+c:\shaoqunWu\perl\lib/CORE/scope.h type=file
+c:\shaoqunWu\perl\lib/CORE/sv.h type=file
+c:\shaoqunWu\perl\lib/CORE/sys/socket.h type=file
+c:\shaoqunWu\perl\lib/CORE/thrdvar.h type=file
+c:\shaoqunWu\perl\lib/CORE/thread.h type=file
+c:\shaoqunWu\perl\lib/CORE/uconfig.h type=file
+c:\shaoqunWu\perl\lib/CORE/unixish.h type=file
+c:\shaoqunWu\perl\lib/CORE/utf8.h type=file
+c:\shaoqunWu\perl\lib/CORE/utfebcdic.h type=file
+c:\shaoqunWu\perl\lib/CORE/util.h type=file
+c:\shaoqunWu\perl\lib/CORE/vdir.h type=file
+c:\shaoqunWu\perl\lib/CORE/vmem.h type=file
+c:\shaoqunWu\perl\lib/CORE/warnings.h type=file
+c:\shaoqunWu\perl\lib/CORE/win32.h type=file
+c:\shaoqunWu\perl\lib/CORE/win32iop.h type=file
+c:\shaoqunWu\perl\lib/CORE/win32thread.h type=file
+c:\shaoqunWu\perl\lib/CPAN.pm type=file
+c:\shaoqunWu\perl\lib/CPAN/FirstTime.pm type=file
+c:\shaoqunWu\perl\lib/CPAN/Nox.pm type=file
+c:\shaoqunWu\perl\lib/CPAN/PAUSE2003.pub type=file
+c:\shaoqunWu\perl\lib/CPAN/SIGNATURE type=file
+c:\shaoqunWu\perl\lib/Carp.pm type=file
+c:\shaoqunWu\perl\lib/Carp/Heavy.pm type=file
+c:\shaoqunWu\perl\lib/Class/ISA.pm type=file
+c:\shaoqunWu\perl\lib/Class/Struct.pm type=file
+c:\shaoqunWu\perl\lib/Config.pm type=file
+c:\shaoqunWu\perl\lib/Config.pod type=file
+c:\shaoqunWu\perl\lib/Config_heavy.pl type=file
+c:\shaoqunWu\perl\lib/Cwd.pm type=file
+c:\shaoqunWu\perl\lib/DB.pm type=file
+c:\shaoqunWu\perl\lib/DBM_Filter.pm type=file
+c:\shaoqunWu\perl\lib/DBM_Filter/compress.pm type=file
+c:\shaoqunWu\perl\lib/DBM_Filter/encode.pm type=file
+c:\shaoqunWu\perl\lib/DBM_Filter/int32.pm type=file
+c:\shaoqunWu\perl\lib/DBM_Filter/null.pm type=file
+c:\shaoqunWu\perl\lib/DBM_Filter/utf8.pm type=file
+c:\shaoqunWu\perl\lib/Data/Dumper.pm type=file
+c:\shaoqunWu\perl\lib/Devel/DProf.pm type=file
+c:\shaoqunWu\perl\lib/Devel/PPPort.pm type=file
+c:\shaoqunWu\perl\lib/Devel/Peek.pm type=file
+c:\shaoqunWu\perl\lib/Devel/SelfStubber.pm type=file
+c:\shaoqunWu\perl\lib/Digest.pm type=file
+c:\shaoqunWu\perl\lib/Digest/MD5.pm type=file
+c:\shaoqunWu\perl\lib/Digest/base.pm type=file
+c:\shaoqunWu\perl\lib/Digest/file.pm type=file
+c:\shaoqunWu\perl\lib/DirHandle.pm type=file
+c:\shaoqunWu\perl\lib/Dumpvalue.pm type=file
+c:\shaoqunWu\perl\lib/DynaLoader.pm type=file
+c:\shaoqunWu\perl\lib/Encode.pm type=file
+c:\shaoqunWu\perl\lib/Encode/Alias.pm type=file
+c:\shaoqunWu\perl\lib/Encode/Byte.pm type=file
+c:\shaoqunWu\perl\lib/Encode/CJKConstants.pm type=file
+c:\shaoqunWu\perl\lib/Encode/CN.pm type=file
+c:\shaoqunWu\perl\lib/Encode/CN/HZ.pm type=file
+c:\shaoqunWu\perl\lib/Encode/Changes.e2x type=file
+c:\shaoqunWu\perl\lib/Encode/Config.pm type=file
+c:\shaoqunWu\perl\lib/Encode/ConfigLocal_PM.e2x type=file
+c:\shaoqunWu\perl\lib/Encode/EBCDIC.pm type=file
+c:\shaoqunWu\perl\lib/Encode/Encoder.pm type=file
+c:\shaoqunWu\perl\lib/Encode/Encoding.pm type=file
+c:\shaoqunWu\perl\lib/Encode/Guess.pm type=file
+c:\shaoqunWu\perl\lib/Encode/JP.pm type=file
+c:\shaoqunWu\perl\lib/Encode/JP/H2Z.pm type=file
+c:\shaoqunWu\perl\lib/Encode/JP/JIS7.pm type=file
+c:\shaoqunWu\perl\lib/Encode/KR.pm type=file
+c:\shaoqunWu\perl\lib/Encode/KR/2022_KR.pm type=file
+c:\shaoqunWu\perl\lib/Encode/MIME/Header.pm type=file
+c:\shaoqunWu\perl\lib/Encode/MIME/Header/ISO_2022_JP.pm type=file
+c:\shaoqunWu\perl\lib/Encode/Makefile_PL.e2x type=file
+c:\shaoqunWu\perl\lib/Encode/PerlIO.pod type=file
+c:\shaoqunWu\perl\lib/Encode/README.e2x type=file
+c:\shaoqunWu\perl\lib/Encode/Supported.pod type=file
+c:\shaoqunWu\perl\lib/Encode/Symbol.pm type=file
+c:\shaoqunWu\perl\lib/Encode/TW.pm type=file
+c:\shaoqunWu\perl\lib/Encode/Unicode.pm type=file
+c:\shaoqunWu\perl\lib/Encode/Unicode/UTF7.pm type=file
+c:\shaoqunWu\perl\lib/Encode/_PM.e2x type=file
+c:\shaoqunWu\perl\lib/Encode/_T.e2x type=file
+c:\shaoqunWu\perl\lib/Encode/encode.h type=file
+c:\shaoqunWu\perl\lib/English.pm type=file
+c:\shaoqunWu\perl\lib/Env.pm type=file
+c:\shaoqunWu\perl\lib/Errno.pm type=file
+c:\shaoqunWu\perl\lib/Exporter.pm type=file
+c:\shaoqunWu\perl\lib/Exporter/Heavy.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Command.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Command/MM.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Constant.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Constant/Base.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Constant/Utils.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Constant/XS.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Embed.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Install.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Installed.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Liblist.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Liblist/Kid.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MANIFEST.SKIP type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_AIX.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_Any.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_BeOS.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_Cygwin.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_DOS.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_MacOS.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_NW5.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_OS2.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_QNX.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_UWIN.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_Unix.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_VMS.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_VOS.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_Win32.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MM_Win95.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MY.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MakeMaker.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MakeMaker/Config.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MakeMaker/FAQ.pod type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MakeMaker/Tutorial.pod type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MakeMaker/bytes.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/MakeMaker/vmsish.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Manifest.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Miniperl.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Mkbootstrap.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Mksymlists.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/NOTES type=file
+c:\shaoqunWu\perl\lib/ExtUtils/PATCHING type=file
+c:\shaoqunWu\perl\lib/ExtUtils/Packlist.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/testlib.pm type=file
+c:\shaoqunWu\perl\lib/ExtUtils/typemap type=file
+c:\shaoqunWu\perl\lib/ExtUtils/xsubpp type=file
+c:\shaoqunWu\perl\lib/Fatal.pm type=file
+c:\shaoqunWu\perl\lib/Fcntl.pm type=file
+c:\shaoqunWu\perl\lib/File/Basename.pm type=file
+c:\shaoqunWu\perl\lib/File/CheckTree.pm type=file
+c:\shaoqunWu\perl\lib/File/Compare.pm type=file
+c:\shaoqunWu\perl\lib/File/Copy.pm type=file
+c:\shaoqunWu\perl\lib/File/DosGlob.pm type=file
+c:\shaoqunWu\perl\lib/File/Find.pm type=file
+c:\shaoqunWu\perl\lib/File/Glob.pm type=file
+c:\shaoqunWu\perl\lib/File/Path.pm type=file
+c:\shaoqunWu\perl\lib/File/Spec.pm type=file
+c:\shaoqunWu\perl\lib/File/Spec/Cygwin.pm type=file
+c:\shaoqunWu\perl\lib/File/Spec/Epoc.pm type=file
+c:\shaoqunWu\perl\lib/File/Spec/Functions.pm type=file
+c:\shaoqunWu\perl\lib/File/Spec/Mac.pm type=file
+c:\shaoqunWu\perl\lib/File/Spec/OS2.pm type=file
+c:\shaoqunWu\perl\lib/File/Spec/Unix.pm type=file
+c:\shaoqunWu\perl\lib/File/Spec/VMS.pm type=file
+c:\shaoqunWu\perl\lib/File/Spec/Win32.pm type=file
+c:\shaoqunWu\perl\lib/File/Temp.pm type=file
+c:\shaoqunWu\perl\lib/File/stat.pm type=file
+c:\shaoqunWu\perl\lib/FileCache.pm type=file
+c:\shaoqunWu\perl\lib/FileHandle.pm type=file
+c:\shaoqunWu\perl\lib/Filter/Simple.pm type=file
+c:\shaoqunWu\perl\lib/Filter/Util/Call.pm type=file
+c:\shaoqunWu\perl\lib/FindBin.pm type=file
+c:\shaoqunWu\perl\lib/Getopt/Long.pm type=file
+c:\shaoqunWu\perl\lib/Getopt/Std.pm type=file
+c:\shaoqunWu\perl\lib/Hash/Util.pm type=file
+c:\shaoqunWu\perl\lib/I18N/Collate.pm type=file
+c:\shaoqunWu\perl\lib/I18N/LangTags.pm type=file
+c:\shaoqunWu\perl\lib/I18N/LangTags/Detect.pm type=file
+c:\shaoqunWu\perl\lib/I18N/LangTags/List.pm type=file
+c:\shaoqunWu\perl\lib/IO.pm type=file
+c:\shaoqunWu\perl\lib/IO/Dir.pm type=file
+c:\shaoqunWu\perl\lib/IO/File.pm type=file
+c:\shaoqunWu\perl\lib/IO/Handle.pm type=file
+c:\shaoqunWu\perl\lib/IO/Pipe.pm type=file
+c:\shaoqunWu\perl\lib/IO/Poll.pm type=file
+c:\shaoqunWu\perl\lib/IO/Seekable.pm type=file
+c:\shaoqunWu\perl\lib/IO/Select.pm type=file
+c:\shaoqunWu\perl\lib/IO/Socket.pm type=file
+c:\shaoqunWu\perl\lib/IO/Socket/INET.pm type=file
+c:\shaoqunWu\perl\lib/IO/Socket/UNIX.pm type=file
+c:\shaoqunWu\perl\lib/IPC/Open2.pm type=file
+c:\shaoqunWu\perl\lib/IPC/Open3.pm type=file
+c:\shaoqunWu\perl\lib/List/Util.pm type=file
+c:\shaoqunWu\perl\lib/Locale/Constants.pm type=file
+c:\shaoqunWu\perl\lib/Locale/Constants.pod type=file
+c:\shaoqunWu\perl\lib/Locale/Country.pm type=file
+c:\shaoqunWu\perl\lib/Locale/Country.pod type=file
+c:\shaoqunWu\perl\lib/Locale/Currency.pm type=file
+c:\shaoqunWu\perl\lib/Locale/Currency.pod type=file
+c:\shaoqunWu\perl\lib/Locale/Language.pm type=file
+c:\shaoqunWu\perl\lib/Locale/Language.pod type=file
+c:\shaoqunWu\perl\lib/Locale/Maketext.pm type=file
+c:\shaoqunWu\perl\lib/Locale/Maketext.pod type=file
+c:\shaoqunWu\perl\lib/Locale/Maketext/Guts.pm type=file
+c:\shaoqunWu\perl\lib/Locale/Maketext/GutsLoader.pm type=file
+c:\shaoqunWu\perl\lib/Locale/Maketext/TPJ13.pod type=file
+c:\shaoqunWu\perl\lib/Locale/Script.pm type=file
+c:\shaoqunWu\perl\lib/Locale/Script.pod type=file
+c:\shaoqunWu\perl\lib/MIME/Base64.pm type=file
+c:\shaoqunWu\perl\lib/MIME/QuotedPrint.pm type=file
+c:\shaoqunWu\perl\lib/Math/BigFloat.pm type=file
+c:\shaoqunWu\perl\lib/Math/BigFloat/Trace.pm type=file
+c:\shaoqunWu\perl\lib/Math/BigInt.pm type=file
+c:\shaoqunWu\perl\lib/Math/BigInt/Calc.pm type=file
+c:\shaoqunWu\perl\lib/Math/BigInt/CalcEmu.pm type=file
+c:\shaoqunWu\perl\lib/Math/BigInt/Trace.pm type=file
+c:\shaoqunWu\perl\lib/Math/BigRat.pm type=file
+c:\shaoqunWu\perl\lib/Math/Complex.pm type=file
+c:\shaoqunWu\perl\lib/Math/Trig.pm type=file
+c:\shaoqunWu\perl\lib/Memoize.pm type=file
+c:\shaoqunWu\perl\lib/Memoize/AnyDBM_File.pm type=file
+c:\shaoqunWu\perl\lib/Memoize/Expire.pm type=file
+c:\shaoqunWu\perl\lib/Memoize/ExpireFile.pm type=file
+c:\shaoqunWu\perl\lib/Memoize/ExpireTest.pm type=file
+c:\shaoqunWu\perl\lib/Memoize/NDBM_File.pm type=file
+c:\shaoqunWu\perl\lib/Memoize/SDBM_File.pm type=file
+c:\shaoqunWu\perl\lib/Memoize/Storable.pm type=file
+c:\shaoqunWu\perl\lib/NEXT.pm type=file
+c:\shaoqunWu\perl\lib/Net/Cmd.pm type=file
+c:\shaoqunWu\perl\lib/Net/Config.eg type=file
+c:\shaoqunWu\perl\lib/Net/Config.pm type=file
+c:\shaoqunWu\perl\lib/Net/Domain.pm type=file
+c:\shaoqunWu\perl\lib/Net/FTP.pm type=file
+c:\shaoqunWu\perl\lib/Net/FTP/A.pm type=file
+c:\shaoqunWu\perl\lib/Net/FTP/E.pm type=file
+c:\shaoqunWu\perl\lib/Net/FTP/I.pm type=file
+c:\shaoqunWu\perl\lib/Net/FTP/L.pm type=file
+c:\shaoqunWu\perl\lib/Net/FTP/dataconn.pm type=file
+c:\shaoqunWu\perl\lib/Net/Hostname.eg type=file
+c:\shaoqunWu\perl\lib/Net/NNTP.pm type=file
+c:\shaoqunWu\perl\lib/Net/Netrc.pm type=file
+c:\shaoqunWu\perl\lib/Net/POP3.pm type=file
+c:\shaoqunWu\perl\lib/Net/Ping.pm type=file
+c:\shaoqunWu\perl\lib/Net/SMTP.pm type=file
+c:\shaoqunWu\perl\lib/Net/Time.pm type=file
+c:\shaoqunWu\perl\lib/Net/hostent.pm type=file
+c:\shaoqunWu\perl\lib/Net/libnetFAQ.pod type=file
+c:\shaoqunWu\perl\lib/Net/netent.pm type=file
+c:\shaoqunWu\perl\lib/Net/protoent.pm type=file
+c:\shaoqunWu\perl\lib/Net/servent.pm type=file
+c:\shaoqunWu\perl\lib/O.pm type=file
+c:\shaoqunWu\perl\lib/Opcode.pm type=file
+c:\shaoqunWu\perl\lib/POSIX.pm type=file
+c:\shaoqunWu\perl\lib/POSIX.pod type=file
+c:\shaoqunWu\perl\lib/PerlIO.pm type=file
+c:\shaoqunWu\perl\lib/PerlIO/encoding.pm type=file
+c:\shaoqunWu\perl\lib/PerlIO/scalar.pm type=file
+c:\shaoqunWu\perl\lib/PerlIO/via.pm type=file
+c:\shaoqunWu\perl\lib/PerlIO/via/QuotedPrint.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Checker.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Find.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Functions.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Html.pm type=file
+c:\shaoqunWu\perl\lib/Pod/InputObjects.pm type=file
+c:\shaoqunWu\perl\lib/Pod/LaTeX.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Man.pm type=file
+c:\shaoqunWu\perl\lib/Pod/ParseLink.pm type=file
+c:\shaoqunWu\perl\lib/Pod/ParseUtils.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Parser.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc/BaseTo.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc/GetOptsOO.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc/ToChecker.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc/ToMan.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc/ToNroff.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc/ToPod.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc/ToRtf.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc/ToText.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc/ToTk.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Perldoc/ToXml.pm type=file
+c:\shaoqunWu\perl\lib/Pod/PlainText.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Plainer.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Select.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Text.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Text/Color.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Text/Overstrike.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Text/Termcap.pm type=file
+c:\shaoqunWu\perl\lib/Pod/Usage.pm type=file
+c:\shaoqunWu\perl\lib/SDBM_File.pm type=file
+c:\shaoqunWu\perl\lib/Safe.pm type=file
+c:\shaoqunWu\perl\lib/Scalar/Util.pm type=file
+c:\shaoqunWu\perl\lib/Search/Dict.pm type=file
+c:\shaoqunWu\perl\lib/SelectSaver.pm type=file
+c:\shaoqunWu\perl\lib/SelfLoader.pm type=file
+c:\shaoqunWu\perl\lib/Shell.pm type=file
+c:\shaoqunWu\perl\lib/Socket.pm type=file
+c:\shaoqunWu\perl\lib/Storable.pm type=file
+c:\shaoqunWu\perl\lib/Switch.pm type=file
+c:\shaoqunWu\perl\lib/Symbol.pm type=file
+c:\shaoqunWu\perl\lib/Sys/Hostname.pm type=file
+c:\shaoqunWu\perl\lib/Term/ANSIColor.pm type=file
+c:\shaoqunWu\perl\lib/Term/Cap.pm type=file
+c:\shaoqunWu\perl\lib/Term/Complete.pm type=file
+c:\shaoqunWu\perl\lib/Term/ReadLine.pm type=file
+c:\shaoqunWu\perl\lib/Test.pm type=file
+c:\shaoqunWu\perl\lib/Test/Builder.pm type=file
+c:\shaoqunWu\perl\lib/Test/Builder/Module.pm type=file
+c:\shaoqunWu\perl\lib/Test/Builder/Tester.pm type=file
+c:\shaoqunWu\perl\lib/Test/Builder/Tester/Color.pm type=file
+c:\shaoqunWu\perl\lib/Test/Harness.pm type=file
+c:\shaoqunWu\perl\lib/Test/Harness/Assert.pm type=file
+c:\shaoqunWu\perl\lib/Test/Harness/Iterator.pm type=file
+c:\shaoqunWu\perl\lib/Test/Harness/Point.pm type=file
+c:\shaoqunWu\perl\lib/Test/Harness/Straps.pm type=file
+c:\shaoqunWu\perl\lib/Test/Harness/TAP.pod type=file
+c:\shaoqunWu\perl\lib/Test/More.pm type=file
+c:\shaoqunWu\perl\lib/Test/Simple.pm type=file
+c:\shaoqunWu\perl\lib/Test/Tutorial.pod type=file
+c:\shaoqunWu\perl\lib/Text/Abbrev.pm type=file
+c:\shaoqunWu\perl\lib/Text/Balanced.pm type=file
+c:\shaoqunWu\perl\lib/Text/ParseWords.pm type=file
+c:\shaoqunWu\perl\lib/Text/Soundex.pm type=file
+c:\shaoqunWu\perl\lib/Text/Tabs.pm type=file
+c:\shaoqunWu\perl\lib/Text/Wrap.pm type=file
+c:\shaoqunWu\perl\lib/Thread.pm type=file
+c:\shaoqunWu\perl\lib/Thread/Queue.pm type=file
+c:\shaoqunWu\perl\lib/Thread/Semaphore.pm type=file
+c:\shaoqunWu\perl\lib/Thread/Signal.pm type=file
+c:\shaoqunWu\perl\lib/Thread/Specific.pm type=file
+c:\shaoqunWu\perl\lib/Tie/Array.pm type=file
+c:\shaoqunWu\perl\lib/Tie/File.pm type=file
+c:\shaoqunWu\perl\lib/Tie/Handle.pm type=file
+c:\shaoqunWu\perl\lib/Tie/Hash.pm type=file
+c:\shaoqunWu\perl\lib/Tie/Memoize.pm type=file
+c:\shaoqunWu\perl\lib/Tie/RefHash.pm type=file
+c:\shaoqunWu\perl\lib/Tie/Scalar.pm type=file
+c:\shaoqunWu\perl\lib/Tie/SubstrHash.pm type=file
+c:\shaoqunWu\perl\lib/Time/HiRes.pm type=file
+c:\shaoqunWu\perl\lib/Time/Local.pm type=file
+c:\shaoqunWu\perl\lib/Time/gmtime.pm type=file
+c:\shaoqunWu\perl\lib/Time/localtime.pm type=file
+c:\shaoqunWu\perl\lib/Time/tm.pm type=file
+c:\shaoqunWu\perl\lib/UNIVERSAL.pm type=file
+c:\shaoqunWu\perl\lib/Unicode/Collate.pm type=file
+c:\shaoqunWu\perl\lib/Unicode/Collate/keys.txt type=file
+c:\shaoqunWu\perl\lib/Unicode/Normalize.pm type=file
+c:\shaoqunWu\perl\lib/Unicode/UCD.pm type=file
+c:\shaoqunWu\perl\lib/User/grent.pm type=file
+c:\shaoqunWu\perl\lib/User/pwent.pm type=file
+c:\shaoqunWu\perl\lib/Win32.pm type=file
+c:\shaoqunWu\perl\lib/XS/APItest.pm type=file
+c:\shaoqunWu\perl\lib/XS/Typemap.pm type=file
+c:\shaoqunWu\perl\lib/XSLoader.pm type=file
+c:\shaoqunWu\perl\lib/abbrev.pl type=file
+c:\shaoqunWu\perl\lib/assert.pl type=file
+c:\shaoqunWu\perl\lib/attributes.pm type=file
+c:\shaoqunWu\perl\lib/attrs.pm type=file
+c:\shaoqunWu\perl\lib/auto/B/B.bs type=file
+c:\shaoqunWu\perl\lib/auto/B/B.dll type=file
+c:\shaoqunWu\perl\lib/auto/B/B.exp type=file
+c:\shaoqunWu\perl\lib/auto/B/B.lib type=file
+c:\shaoqunWu\perl\lib/auto/B/B.pdb type=file
+c:\shaoqunWu\perl\lib/auto/B/C/C.bs type=file
+c:\shaoqunWu\perl\lib/auto/B/C/C.dll type=file
+c:\shaoqunWu\perl\lib/auto/B/C/C.exp type=file
+c:\shaoqunWu\perl\lib/auto/B/C/C.lib type=file
+c:\shaoqunWu\perl\lib/auto/B/C/C.pdb type=file
+c:\shaoqunWu\perl\lib/auto/ByteLoader/ByteLoader.bs type=file
+c:\shaoqunWu\perl\lib/auto/ByteLoader/ByteLoader.dll type=file
+c:\shaoqunWu\perl\lib/auto/ByteLoader/ByteLoader.exp type=file
+c:\shaoqunWu\perl\lib/auto/ByteLoader/ByteLoader.lib type=file
+c:\shaoqunWu\perl\lib/auto/ByteLoader/ByteLoader.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Cwd/Cwd.bs type=file
+c:\shaoqunWu\perl\lib/auto/Cwd/Cwd.dll type=file
+c:\shaoqunWu\perl\lib/auto/Cwd/Cwd.exp type=file
+c:\shaoqunWu\perl\lib/auto/Cwd/Cwd.lib type=file
+c:\shaoqunWu\perl\lib/auto/Cwd/Cwd.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Data/Dumper/Dumper.bs type=file
+c:\shaoqunWu\perl\lib/auto/Data/Dumper/Dumper.dll type=file
+c:\shaoqunWu\perl\lib/auto/Data/Dumper/Dumper.exp type=file
+c:\shaoqunWu\perl\lib/auto/Data/Dumper/Dumper.lib type=file
+c:\shaoqunWu\perl\lib/auto/Data/Dumper/Dumper.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Devel/DProf/DProf.bs type=file
+c:\shaoqunWu\perl\lib/auto/Devel/DProf/DProf.dll type=file
+c:\shaoqunWu\perl\lib/auto/Devel/DProf/DProf.exp type=file
+c:\shaoqunWu\perl\lib/auto/Devel/DProf/DProf.lib type=file
+c:\shaoqunWu\perl\lib/auto/Devel/DProf/DProf.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Devel/PPPort/PPPort.bs type=file
+c:\shaoqunWu\perl\lib/auto/Devel/PPPort/PPPort.dll type=file
+c:\shaoqunWu\perl\lib/auto/Devel/PPPort/PPPort.exp type=file
+c:\shaoqunWu\perl\lib/auto/Devel/PPPort/PPPort.lib type=file
+c:\shaoqunWu\perl\lib/auto/Devel/PPPort/PPPort.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Devel/Peek/Peek.bs type=file
+c:\shaoqunWu\perl\lib/auto/Devel/Peek/Peek.dll type=file
+c:\shaoqunWu\perl\lib/auto/Devel/Peek/Peek.exp type=file
+c:\shaoqunWu\perl\lib/auto/Devel/Peek/Peek.lib type=file
+c:\shaoqunWu\perl\lib/auto/Devel/Peek/Peek.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Digest/MD5/MD5.bs type=file
+c:\shaoqunWu\perl\lib/auto/Digest/MD5/MD5.dll type=file
+c:\shaoqunWu\perl\lib/auto/Digest/MD5/MD5.exp type=file
+c:\shaoqunWu\perl\lib/auto/Digest/MD5/MD5.lib type=file
+c:\shaoqunWu\perl\lib/auto/Digest/MD5/MD5.pdb type=file
+c:\shaoqunWu\perl\lib/auto/DynaLoader/autosplit.ix type=file
+c:\shaoqunWu\perl\lib/auto/DynaLoader/dl_expandspec.al type=file
+c:\shaoqunWu\perl\lib/auto/DynaLoader/dl_find_symbol_anywhere.al type=file
+c:\shaoqunWu\perl\lib/auto/DynaLoader/dl_findfile.al type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Byte/Byte.bs type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Byte/Byte.dll type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Byte/Byte.exp type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Byte/Byte.lib type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Byte/Byte.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Encode/CN/CN.bs type=file
+c:\shaoqunWu\perl\lib/auto/Encode/CN/CN.dll type=file
+c:\shaoqunWu\perl\lib/auto/Encode/CN/CN.exp type=file
+c:\shaoqunWu\perl\lib/auto/Encode/CN/CN.lib type=file
+c:\shaoqunWu\perl\lib/auto/Encode/CN/CN.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Encode/EBCDIC/EBCDIC.bs type=file
+c:\shaoqunWu\perl\lib/auto/Encode/EBCDIC/EBCDIC.dll type=file
+c:\shaoqunWu\perl\lib/auto/Encode/EBCDIC/EBCDIC.exp type=file
+c:\shaoqunWu\perl\lib/auto/Encode/EBCDIC/EBCDIC.lib type=file
+c:\shaoqunWu\perl\lib/auto/Encode/EBCDIC/EBCDIC.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Encode.bs type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Encode.dll type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Encode.exp type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Encode.lib type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Encode.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Encode/JP/JP.bs type=file
+c:\shaoqunWu\perl\lib/auto/Encode/JP/JP.dll type=file
+c:\shaoqunWu\perl\lib/auto/Encode/JP/JP.exp type=file
+c:\shaoqunWu\perl\lib/auto/Encode/JP/JP.lib type=file
+c:\shaoqunWu\perl\lib/auto/Encode/JP/JP.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Encode/KR/KR.bs type=file
+c:\shaoqunWu\perl\lib/auto/Encode/KR/KR.dll type=file
+c:\shaoqunWu\perl\lib/auto/Encode/KR/KR.exp type=file
+c:\shaoqunWu\perl\lib/auto/Encode/KR/KR.lib type=file
+c:\shaoqunWu\perl\lib/auto/Encode/KR/KR.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Symbol/Symbol.bs type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Symbol/Symbol.dll type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Symbol/Symbol.exp type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Symbol/Symbol.lib type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Symbol/Symbol.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Encode/TW/TW.bs type=file
+c:\shaoqunWu\perl\lib/auto/Encode/TW/TW.dll type=file
+c:\shaoqunWu\perl\lib/auto/Encode/TW/TW.exp type=file
+c:\shaoqunWu\perl\lib/auto/Encode/TW/TW.lib type=file
+c:\shaoqunWu\perl\lib/auto/Encode/TW/TW.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Unicode/Unicode.bs type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Unicode/Unicode.dll type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Unicode/Unicode.exp type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Unicode/Unicode.lib type=file
+c:\shaoqunWu\perl\lib/auto/Encode/Unicode/Unicode.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Fcntl/Fcntl.bs type=file
+c:\shaoqunWu\perl\lib/auto/Fcntl/Fcntl.dll type=file
+c:\shaoqunWu\perl\lib/auto/Fcntl/Fcntl.exp type=file
+c:\shaoqunWu\perl\lib/auto/Fcntl/Fcntl.lib type=file
+c:\shaoqunWu\perl\lib/auto/Fcntl/Fcntl.pdb type=file
+c:\shaoqunWu\perl\lib/auto/File/Glob/Glob.bs type=file
+c:\shaoqunWu\perl\lib/auto/File/Glob/Glob.dll type=file
+c:\shaoqunWu\perl\lib/auto/File/Glob/Glob.exp type=file
+c:\shaoqunWu\perl\lib/auto/File/Glob/Glob.lib type=file
+c:\shaoqunWu\perl\lib/auto/File/Glob/Glob.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Filter/Util/Call/Call.bs type=file
+c:\shaoqunWu\perl\lib/auto/Filter/Util/Call/Call.dll type=file
+c:\shaoqunWu\perl\lib/auto/Filter/Util/Call/Call.exp type=file
+c:\shaoqunWu\perl\lib/auto/Filter/Util/Call/Call.lib type=file
+c:\shaoqunWu\perl\lib/auto/Filter/Util/Call/Call.pdb type=file
+c:\shaoqunWu\perl\lib/auto/IO/IO.bs type=file
+c:\shaoqunWu\perl\lib/auto/IO/IO.dll type=file
+c:\shaoqunWu\perl\lib/auto/IO/IO.exp type=file
+c:\shaoqunWu\perl\lib/auto/IO/IO.lib type=file
+c:\shaoqunWu\perl\lib/auto/IO/IO.pdb type=file
+c:\shaoqunWu\perl\lib/auto/List/Util/Util.bs type=file
+c:\shaoqunWu\perl\lib/auto/List/Util/Util.dll type=file
+c:\shaoqunWu\perl\lib/auto/List/Util/Util.exp type=file
+c:\shaoqunWu\perl\lib/auto/List/Util/Util.lib type=file
+c:\shaoqunWu\perl\lib/auto/List/Util/Util.pdb type=file
+c:\shaoqunWu\perl\lib/auto/MIME/Base64/Base64.bs type=file
+c:\shaoqunWu\perl\lib/auto/MIME/Base64/Base64.dll type=file
+c:\shaoqunWu\perl\lib/auto/MIME/Base64/Base64.exp type=file
+c:\shaoqunWu\perl\lib/auto/MIME/Base64/Base64.lib type=file
+c:\shaoqunWu\perl\lib/auto/MIME/Base64/Base64.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Opcode/Opcode.bs type=file
+c:\shaoqunWu\perl\lib/auto/Opcode/Opcode.dll type=file
+c:\shaoqunWu\perl\lib/auto/Opcode/Opcode.exp type=file
+c:\shaoqunWu\perl\lib/auto/Opcode/Opcode.lib type=file
+c:\shaoqunWu\perl\lib/auto/Opcode/Opcode.pdb type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/POSIX.bs type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/POSIX.dll type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/POSIX.exp type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/POSIX.lib type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/POSIX.pdb type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/SigAction/flags.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/SigAction/handler.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/SigAction/mask.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/SigAction/safe.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/abs.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/alarm.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/assert.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/atan2.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/atexit.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/atof.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/atoi.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/atol.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/autosplit.ix type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/bsearch.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/calloc.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/chdir.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/chmod.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/chown.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/clearerr.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/closedir.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/cos.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/creat.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/div.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/errno.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/execl.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/execle.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/execlp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/execv.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/execve.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/execvp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/exit.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/exp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fabs.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fclose.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fcntl.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fdopen.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/feof.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/ferror.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fflush.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fgetc.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fgetpos.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fgets.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fileno.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fopen.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fork.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fprintf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fputc.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fputs.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fread.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/free.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/freopen.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fscanf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fseek.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fsetpos.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fstat.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fsync.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/ftell.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/fwrite.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getc.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getchar.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getegid.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getenv.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/geteuid.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getgid.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getgrgid.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getgrnam.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getgroups.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getlogin.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getpgrp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getpid.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getppid.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getpwnam.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getpwuid.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/gets.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/getuid.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/gmtime.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/isatty.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/kill.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/labs.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/ldiv.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/link.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/load_imports.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/localtime.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/log.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/longjmp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/malloc.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/memchr.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/memcmp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/memcpy.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/memmove.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/memset.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/mkdir.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/offsetof.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/opendir.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/perror.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/pow.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/printf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/putc.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/putchar.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/puts.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/qsort.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/raise.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/rand.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/readdir.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/realloc.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/redef.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/remove.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/rename.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/rewind.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/rewinddir.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/rmdir.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/scanf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/setbuf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/setjmp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/setvbuf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/siglongjmp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/sigsetjmp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/sin.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/sleep.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/sprintf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/sqrt.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/srand.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/sscanf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/stat.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strcat.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strchr.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strcmp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strcpy.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strcspn.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strerror.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strlen.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strncat.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strncmp.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strncpy.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strpbrk.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strrchr.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strspn.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strstr.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/strtok.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/system.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/time.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/tmpfile.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/tolower.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/toupper.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/umask.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/ungetc.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/unimpl.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/unlink.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/usage.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/utime.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/vfprintf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/vprintf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/vsprintf.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/wait.al type=file
+c:\shaoqunWu\perl\lib/auto/POSIX/waitpid.al type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/encoding/encoding.bs type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/encoding/encoding.dll type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/encoding/encoding.exp type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/encoding/encoding.lib type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/encoding/encoding.pdb type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/scalar/scalar.bs type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/scalar/scalar.dll type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/scalar/scalar.exp type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/scalar/scalar.lib type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/scalar/scalar.pdb type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/via/via.bs type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/via/via.dll type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/via/via.exp type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/via/via.lib type=file
+c:\shaoqunWu\perl\lib/auto/PerlIO/via/via.pdb type=file
+c:\shaoqunWu\perl\lib/auto/SDBM_File/SDBM_File.bs type=file
+c:\shaoqunWu\perl\lib/auto/SDBM_File/SDBM_File.dll type=file
+c:\shaoqunWu\perl\lib/auto/SDBM_File/SDBM_File.exp type=file
+c:\shaoqunWu\perl\lib/auto/SDBM_File/SDBM_File.lib type=file
+c:\shaoqunWu\perl\lib/auto/SDBM_File/SDBM_File.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Socket/Socket.bs type=file
+c:\shaoqunWu\perl\lib/auto/Socket/Socket.dll type=file
+c:\shaoqunWu\perl\lib/auto/Socket/Socket.exp type=file
+c:\shaoqunWu\perl\lib/auto/Socket/Socket.lib type=file
+c:\shaoqunWu\perl\lib/auto/Socket/Socket.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Storable/CAN_FLOCK.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/Storable.bs type=file
+c:\shaoqunWu\perl\lib/auto/Storable/Storable.dll type=file
+c:\shaoqunWu\perl\lib/auto/Storable/Storable.exp type=file
+c:\shaoqunWu\perl\lib/auto/Storable/Storable.lib type=file
+c:\shaoqunWu\perl\lib/auto/Storable/Storable.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Storable/_freeze.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/_retrieve.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/_store.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/_store_fd.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/autosplit.ix type=file
+c:\shaoqunWu\perl\lib/auto/Storable/fd_retrieve.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/freeze.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/lock_nstore.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/lock_retrieve.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/lock_store.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/logcarp.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/logcroak.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/nfreeze.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/nstore.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/nstore_fd.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/read_magic.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/retrieve.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/show_file_magic.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/store.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/store_fd.al type=file
+c:\shaoqunWu\perl\lib/auto/Storable/thaw.al type=file
+c:\shaoqunWu\perl\lib/auto/Sys/Hostname/Hostname.bs type=file
+c:\shaoqunWu\perl\lib/auto/Sys/Hostname/Hostname.dll type=file
+c:\shaoqunWu\perl\lib/auto/Sys/Hostname/Hostname.exp type=file
+c:\shaoqunWu\perl\lib/auto/Sys/Hostname/Hostname.lib type=file
+c:\shaoqunWu\perl\lib/auto/Sys/Hostname/Hostname.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Sys/Hostname/autosplit.ix type=file
+c:\shaoqunWu\perl\lib/auto/Thread/Thread.bs type=file
+c:\shaoqunWu\perl\lib/auto/Thread/Thread.dll type=file
+c:\shaoqunWu\perl\lib/auto/Thread/Thread.exp type=file
+c:\shaoqunWu\perl\lib/auto/Thread/Thread.lib type=file
+c:\shaoqunWu\perl\lib/auto/Thread/Thread.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Time/HiRes/HiRes.bs type=file
+c:\shaoqunWu\perl\lib/auto/Time/HiRes/HiRes.dll type=file
+c:\shaoqunWu\perl\lib/auto/Time/HiRes/HiRes.exp type=file
+c:\shaoqunWu\perl\lib/auto/Time/HiRes/HiRes.lib type=file
+c:\shaoqunWu\perl\lib/auto/Time/HiRes/HiRes.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Unicode/Normalize/Normalize.bs type=file
+c:\shaoqunWu\perl\lib/auto/Unicode/Normalize/Normalize.dll type=file
+c:\shaoqunWu\perl\lib/auto/Unicode/Normalize/Normalize.exp type=file
+c:\shaoqunWu\perl\lib/auto/Unicode/Normalize/Normalize.lib type=file
+c:\shaoqunWu\perl\lib/auto/Unicode/Normalize/Normalize.pdb type=file
+c:\shaoqunWu\perl\lib/auto/Win32/Win32.bs type=file
+c:\shaoqunWu\perl\lib/auto/Win32/Win32.dll type=file
+c:\shaoqunWu\perl\lib/auto/Win32/Win32.exp type=file
+c:\shaoqunWu\perl\lib/auto/Win32/Win32.lib type=file
+c:\shaoqunWu\perl\lib/auto/Win32/Win32.pdb type=file
+c:\shaoqunWu\perl\lib/auto/XS/APItest/APItest.bs type=file
+c:\shaoqunWu\perl\lib/auto/XS/APItest/APItest.dll type=file
+c:\shaoqunWu\perl\lib/auto/XS/APItest/APItest.exp type=file
+c:\shaoqunWu\perl\lib/auto/XS/APItest/APItest.lib type=file
+c:\shaoqunWu\perl\lib/auto/XS/APItest/APItest.pdb type=file
+c:\shaoqunWu\perl\lib/auto/XS/Typemap/Typemap.bs type=file
+c:\shaoqunWu\perl\lib/auto/XS/Typemap/Typemap.dll type=file
+c:\shaoqunWu\perl\lib/auto/XS/Typemap/Typemap.exp type=file
+c:\shaoqunWu\perl\lib/auto/XS/Typemap/Typemap.lib type=file
+c:\shaoqunWu\perl\lib/auto/XS/Typemap/Typemap.pdb type=file
+c:\shaoqunWu\perl\lib/auto/attrs/attrs.bs type=file
+c:\shaoqunWu\perl\lib/auto/attrs/attrs.dll type=file
+c:\shaoqunWu\perl\lib/auto/attrs/attrs.exp type=file
+c:\shaoqunWu\perl\lib/auto/attrs/attrs.lib type=file
+c:\shaoqunWu\perl\lib/auto/attrs/attrs.pdb type=file
+c:\shaoqunWu\perl\lib/auto/re/re.bs type=file
+c:\shaoqunWu\perl\lib/auto/re/re.dll type=file
+c:\shaoqunWu\perl\lib/auto/re/re.exp type=file
+c:\shaoqunWu\perl\lib/auto/re/re.lib type=file
+c:\shaoqunWu\perl\lib/auto/re/re.pdb type=file
+c:\shaoqunWu\perl\lib/auto/sdbm/extralibs.ld type=file
+c:\shaoqunWu\perl\lib/auto/threads/shared/shared.bs type=file
+c:\shaoqunWu\perl\lib/auto/threads/shared/shared.dll type=file
+c:\shaoqunWu\perl\lib/auto/threads/shared/shared.exp type=file
+c:\shaoqunWu\perl\lib/auto/threads/shared/shared.lib type=file
+c:\shaoqunWu\perl\lib/auto/threads/shared/shared.pdb type=file
+c:\shaoqunWu\perl\lib/auto/threads/threads.bs type=file
+c:\shaoqunWu\perl\lib/auto/threads/threads.dll type=file
+c:\shaoqunWu\perl\lib/auto/threads/threads.exp type=file
+c:\shaoqunWu\perl\lib/auto/threads/threads.lib type=file
+c:\shaoqunWu\perl\lib/auto/threads/threads.pdb type=file
+c:\shaoqunWu\perl\lib/autouse.pm type=file
+c:\shaoqunWu\perl\lib/base.pm type=file
+c:\shaoqunWu\perl\lib/bigfloat.pl type=file
+c:\shaoqunWu\perl\lib/bigint.pl type=file
+c:\shaoqunWu\perl\lib/bigint.pm type=file
+c:\shaoqunWu\perl\lib/bignum.pm type=file
+c:\shaoqunWu\perl\lib/bigrat.pl type=file
+c:\shaoqunWu\perl\lib/bigrat.pm type=file
+c:\shaoqunWu\perl\lib/blib.pm type=file
+c:\shaoqunWu\perl\lib/bytes.pm type=file
+c:\shaoqunWu\perl\lib/bytes_heavy.pl type=file
+c:\shaoqunWu\perl\lib/cacheout.pl type=file
+c:\shaoqunWu\perl\lib/charnames.pm type=file
+c:\shaoqunWu\perl\lib/complete.pl type=file
+c:\shaoqunWu\perl\lib/constant.pm type=file
+c:\shaoqunWu\perl\lib/ctime.pl type=file
+c:\shaoqunWu\perl\lib/dbm_filter_util.pl type=file
+c:\shaoqunWu\perl\lib/diagnostics.pm type=file
+c:\shaoqunWu\perl\lib/dotsh.pl type=file
+c:\shaoqunWu\perl\lib/dumpvar.pl type=file
+c:\shaoqunWu\perl\lib/encoding.pm type=file
+c:\shaoqunWu\perl\lib/exceptions.pl type=file
+c:\shaoqunWu\perl\lib/fastcwd.pl type=file
+c:\shaoqunWu\perl\lib/fields.pm type=file
+c:\shaoqunWu\perl\lib/filetest.pm type=file
+c:\shaoqunWu\perl\lib/find.pl type=file
+c:\shaoqunWu\perl\lib/finddepth.pl type=file
+c:\shaoqunWu\perl\lib/flush.pl type=file
+c:\shaoqunWu\perl\lib/getcwd.pl type=file
+c:\shaoqunWu\perl\lib/getopt.pl type=file
+c:\shaoqunWu\perl\lib/getopts.pl type=file
+c:\shaoqunWu\perl\lib/hostname.pl type=file
+c:\shaoqunWu\perl\lib/if.pm type=file
+c:\shaoqunWu\perl\lib/importenv.pl type=file
+c:\shaoqunWu\perl\lib/integer.pm type=file
+c:\shaoqunWu\perl\lib/less.pm type=file
+c:\shaoqunWu\perl\lib/lib.pm type=file
+c:\shaoqunWu\perl\lib/locale.pm type=file
+c:\shaoqunWu\perl\lib/look.pl type=file
+c:\shaoqunWu\perl\lib/newgetopt.pl type=file
+c:\shaoqunWu\perl\lib/open.pm type=file
+c:\shaoqunWu\perl\lib/open2.pl type=file
+c:\shaoqunWu\perl\lib/open3.pl type=file
+c:\shaoqunWu\perl\lib/ops.pm type=file
+c:\shaoqunWu\perl\lib/overload.pm type=file
+c:\shaoqunWu\perl\lib/perl5db.pl type=file
+c:\shaoqunWu\perl\lib/pod/a2p.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl5004delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl5005delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl561delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl56delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl570delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl571delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl572delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl573delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl581delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl582delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl583delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl584delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl585delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl586delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl587delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl588delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perl58delta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlaix.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlamiga.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlapi.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlapio.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlapollo.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlartistic.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlbeos.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlbook.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlboot.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlbot.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlbs2000.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlcall.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlce.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlcheat.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlclib.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlcn.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlcompile.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlcygwin.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldata.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldbmfilter.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldebguts.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldebtut.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldebug.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldelta.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldgux.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldiag.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldoc.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldos.pod type=file
+c:\shaoqunWu\perl\lib/pod/perldsc.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlebcdic.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlembed.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlepoc.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfaq.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfaq1.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfaq2.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfaq3.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfaq4.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfaq5.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfaq6.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfaq7.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfaq8.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfaq9.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfilter.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfork.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlform.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfreebsd.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlfunc.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlglossary.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlgpl.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlguts.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlhack.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlhist.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlhpux.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlhurd.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlintern.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlintro.pod type=file
+c:\shaoqunWu\perl\lib/pod/perliol.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlipc.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlirix.pod type=file
+c:\shaoqunWu\perl\lib/pod/perljp.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlko.pod type=file
+c:\shaoqunWu\perl\lib/pod/perllexwarn.pod type=file
+c:\shaoqunWu\perl\lib/pod/perllinux.pod type=file
+c:\shaoqunWu\perl\lib/pod/perllocale.pod type=file
+c:\shaoqunWu\perl\lib/pod/perllol.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlmachten.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlmacos.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlmacosx.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlmint.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlmod.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlmodinstall.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlmodlib.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlmodstyle.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlmpeix.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlnetware.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlnewmod.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlnumber.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlobj.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlop.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlopenbsd.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlopentut.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlos2.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlos390.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlos400.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlothrtut.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlpacktut.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlplan9.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlpod.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlpodspec.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlport.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlqnx.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlre.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlref.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlreftut.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlrequick.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlreref.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlretut.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlrun.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlsec.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlsolaris.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlstyle.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlsub.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlsyn.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlthrtut.pod type=file
+c:\shaoqunWu\perl\lib/pod/perltie.pod type=file
+c:\shaoqunWu\perl\lib/pod/perltoc.pod type=file
+c:\shaoqunWu\perl\lib/pod/perltodo.pod type=file
+c:\shaoqunWu\perl\lib/pod/perltooc.pod type=file
+c:\shaoqunWu\perl\lib/pod/perltoot.pod type=file
+c:\shaoqunWu\perl\lib/pod/perltrap.pod type=file
+c:\shaoqunWu\perl\lib/pod/perltru64.pod type=file
+c:\shaoqunWu\perl\lib/pod/perltw.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlunicode.pod type=file
+c:\shaoqunWu\perl\lib/pod/perluniintro.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlutil.pod type=file
+c:\shaoqunWu\perl\lib/pod/perluts.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlvar.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlvmesa.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlvms.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlvos.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlwin32.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlxs.pod type=file
+c:\shaoqunWu\perl\lib/pod/perlxstut.pod type=file
+c:\shaoqunWu\perl\lib/pwd.pl type=file
+c:\shaoqunWu\perl\lib/re.pm type=file
+c:\shaoqunWu\perl\lib/shellwords.pl type=file
+c:\shaoqunWu\perl\lib/sigtrap.pm type=file
+c:\shaoqunWu\perl\lib/sort.pm type=file
+c:\shaoqunWu\perl\lib/stat.pl type=file
+c:\shaoqunWu\perl\lib/strict.pm type=file
+c:\shaoqunWu\perl\lib/subs.pm type=file
+c:\shaoqunWu\perl\lib/syslog.pl type=file
+c:\shaoqunWu\perl\lib/tainted.pl type=file
+c:\shaoqunWu\perl\lib/termcap.pl type=file
+c:\shaoqunWu\perl\lib/threads.pm type=file
+c:\shaoqunWu\perl\lib/threads/shared.pm type=file
+c:\shaoqunWu\perl\lib/timelocal.pl type=file
+c:\shaoqunWu\perl\lib/unicore/ArabicShaping.txt type=file
+c:\shaoqunWu\perl\lib/unicore/BidiMirroring.txt type=file
+c:\shaoqunWu\perl\lib/unicore/Blocks.txt type=file
+c:\shaoqunWu\perl\lib/unicore/Canonical.pl type=file
+c:\shaoqunWu\perl\lib/unicore/CaseFolding.txt type=file
+c:\shaoqunWu\perl\lib/unicore/CombiningClass.pl type=file
+c:\shaoqunWu\perl\lib/unicore/CompositionExclusions.txt type=file
+c:\shaoqunWu\perl\lib/unicore/Decomposition.pl type=file
+c:\shaoqunWu\perl\lib/unicore/EastAsianWidth.txt type=file
+c:\shaoqunWu\perl\lib/unicore/Exact.pl type=file
+c:\shaoqunWu\perl\lib/unicore/HangulSyllableType.txt type=file
+c:\shaoqunWu\perl\lib/unicore/Index.txt type=file
+c:\shaoqunWu\perl\lib/unicore/Jamo.txt type=file
+c:\shaoqunWu\perl\lib/unicore/LineBreak.txt type=file
+c:\shaoqunWu\perl\lib/unicore/Name.pl type=file
+c:\shaoqunWu\perl\lib/unicore/NamedSequences.txt type=file
+c:\shaoqunWu\perl\lib/unicore/NamesList.txt type=file
+c:\shaoqunWu\perl\lib/unicore/NormalizationCorrections.txt type=file
+c:\shaoqunWu\perl\lib/unicore/PVA.pl type=file
+c:\shaoqunWu\perl\lib/unicore/PropList.txt type=file
+c:\shaoqunWu\perl\lib/unicore/PropValueAliases.txt type=file
+c:\shaoqunWu\perl\lib/unicore/Properties type=file
+c:\shaoqunWu\perl\lib/unicore/PropertyAliases.txt type=file
+c:\shaoqunWu\perl\lib/unicore/ReadMe.txt type=file
+c:\shaoqunWu\perl\lib/unicore/Scripts.txt type=file
+c:\shaoqunWu\perl\lib/unicore/SpecialCasing.txt type=file
+c:\shaoqunWu\perl\lib/unicore/StandardizedVariants.txt type=file
+c:\shaoqunWu\perl\lib/unicore/To/Digit.pl type=file
+c:\shaoqunWu\perl\lib/unicore/To/Fold.pl type=file
+c:\shaoqunWu\perl\lib/unicore/To/Lower.pl type=file
+c:\shaoqunWu\perl\lib/unicore/To/Title.pl type=file
+c:\shaoqunWu\perl\lib/unicore/To/Upper.pl type=file
+c:\shaoqunWu\perl\lib/unicore/UnicodeData.txt type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/AL.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/AN.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/B.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/BN.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/CS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/EN.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/ES.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/ET.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/L.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/LRE.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/LRO.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/NSM.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/ON.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/PDF.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/R.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/RLE.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/RLO.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/S.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/bc/WS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/A.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/AL.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/AR.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/ATAR.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/ATB.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/ATBL.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/B.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/BL.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/BR.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/DA.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/DB.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/IS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/KV.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/L.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/NK.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/NR.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/OV.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/R.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ccc/VR.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/can.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/com.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/enc.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/fin.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/font.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/fra.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/init.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/iso.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/med.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/nar.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/nb.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/sml.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/sqr.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/sub.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/sup.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/vert.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/dt/wide.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ea/A.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ea/F.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ea/H.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ea/N.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ea/Na.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/ea/W.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/AHex.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/ASCII.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Alnum.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Alpha.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Alphabet.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Any.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Arab.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Armn.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/AsciiHex.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Assigned.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Beng.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/BidiC.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/BidiCont.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Blank.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Bopo.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Brai.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Bugi.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Buhd.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/C.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Canadian.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Cc.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Cf.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Cher.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Cn.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Cntrl.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Co.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Copt.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Cprt.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Cs.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Cyrl.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Dash.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Dash2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Dep.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Deprecat.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Deva.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Dia.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Diacriti.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Digit.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Dsrt.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Ethi.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Ext.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Extender.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Geor.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Glag.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Goth.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/GrLink.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Graph.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Grapheme.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Grek.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Gujr.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Guru.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Hang.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Hani.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Hano.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Hebr.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Hex.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/HexDigit.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Hira.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Hyphen.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Hyphen2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/IDSB.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/IDST.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/IdContin.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/IdStart.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Ideo.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Ideograp.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/IdsBinar.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/IdsTrina.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InAegean.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InAlphab.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InAncie2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InAncien.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InArabi2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InArabi3.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InArabi4.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InArabic.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InArmeni.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InArrows.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InBasicL.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InBengal.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InBlockE.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InBopom2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InBopomo.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InBoxDra.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InBraill.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InBugine.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InBuhid.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InByzant.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCherok.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCjkCo2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCjkCo3.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCjkCo4.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCjkCom.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCjkRad.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCjkStr.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCjkSym.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCjkUn2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCjkUn3.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCjkUni.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCombi2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCombi3.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCombi4.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCombin.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InContro.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCoptic.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCurren.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCyprio.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCyril2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InCyrill.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InDesere.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InDevana.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InDingba.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InEnclo2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InEnclos.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InEthio2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InEthio3.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InEthiop.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InGenera.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InGeomet.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InGeorg2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InGeorgi.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InGlagol.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InGothic.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InGreekA.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InGreekE.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InGujara.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InGurmuk.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InHalfwi.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InHangu2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InHangu3.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InHangul.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InHanuno.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InHebrew.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InHighPr.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InHighSu.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InHiraga.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InIdeogr.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InIpaExt.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InKanbun.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InKangxi.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InKannad.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InKatak2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InKataka.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InKharos.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InKhmer.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InKhmerS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InLao.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InLatin1.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InLatin2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InLatin3.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InLatinE.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InLetter.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InLimbu.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InLinea2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InLinear.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InLowSur.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMalaya.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMathe2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMathem.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMisce2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMisce3.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMisce4.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMisce5.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMiscel.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InModifi.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMongol.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMusica.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InMyanma.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InNewTai.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InNumber.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InOgham.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InOldIta.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InOldPer.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InOptica.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InOriya.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InOsmany.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InPhone2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InPhonet.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InPrivat.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InRunic.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InShavia.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSinhal.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSmallF.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSpacin.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSpecia.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSupers.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSuppl2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSuppl3.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSuppl4.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSuppl5.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSuppl6.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSupple.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSyloti.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InSyriac.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InTagalo.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InTagban.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InTags.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InTaiLe.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InTaiXua.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InTamil.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InTelugu.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InThaana.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InThai.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InTibeta.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InTifina.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InUgarit.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InUnifie.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InVaria2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InVariat.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InVertic.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InYiRadi.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InYiSyll.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/InYijing.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/JoinC.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/JoinCont.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Kana.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Khar.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Khmr.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Knda.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/L.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/LC.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/LOE.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Laoo.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Latn.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Limb.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/LinearB.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Ll.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Lm.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Lo.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/LogicalO.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Lower.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Lowercas.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Lt.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Lu.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/M.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Math.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Mc.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Me.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Mlym.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Mn.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Mong.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Mymr.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/N.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/NChar.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Nd.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/NewTaiLu.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Nl.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/No.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Nonchara.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OAlpha.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/ODI.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OGrExt.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OIDC.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OIDS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OLower.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OMath.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OUpper.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Ogam.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OldItali.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OldPersi.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Orya.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Osma.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OtherAlp.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OtherDef.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OtherGra.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OtherIdC.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OtherIdS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OtherLow.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OtherMat.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/OtherUpp.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/P.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/PatSyn.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/PatWS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/PatternS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/PatternW.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Pc.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Pd.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Pe.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Pf.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Pi.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Po.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Print.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Ps.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Punct.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/QMark.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Qaai.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Quotatio.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Radical.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Radical2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Runr.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/S.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/SD.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/STerm.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Sc.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Shaw.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Sinh.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Sk.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Sm.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/So.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/SoftDott.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Space.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/SpacePer.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Sterm2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/SylotiNa.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Syrc.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Tagb.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/TaiLe.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Taml.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Telu.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Term.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Terminal.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Tfng.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Tglg.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Thaa.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Thai.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Tibt.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Title.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/UIdeo.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Ugar.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/UnifiedI.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Upper.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Uppercas.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/VS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Variatio.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/WSpace.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/WhiteSpa.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Word.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/XDigit.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Yiii.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Z.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Zl.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Zp.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Zs.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/Zyyy.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/_CanonDC.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/_CaseIgn.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/gc_sc/_CombAbo.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/hst/L.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/hst/LV.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/hst/LVT.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/hst/T.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/hst/V.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/jt/C.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/jt/D.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/jt/R.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/jt/U.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/AI.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/AL.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/B2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/BA.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/BB.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/BK.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/CB.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/CL.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/CM.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/CR.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/EX.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/GL.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/H2.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/H3.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/HY.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/ID.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/IN.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/IS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/JL.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/JT.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/JV.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/LF.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/NL.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/NS.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/NU.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/OP.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/PO.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/PR.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/QU.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/SA.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/SG.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/SP.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/SY.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/WJ.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/XX.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/lb/ZW.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/nt/De.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/nt/Di.pl type=file
+c:\shaoqunWu\perl\lib/unicore/lib/nt/Nu.pl type=file
+c:\shaoqunWu\perl\lib/unicore/mktables type=file
+c:\shaoqunWu\perl\lib/unicore/mktables.lst type=file
+c:\shaoqunWu\perl\lib/unicore/version type=file
+c:\shaoqunWu\perl\lib/utf8.pm type=file
+c:\shaoqunWu\perl\lib/utf8_heavy.pl type=file
+c:\shaoqunWu\perl\lib/validate.pl type=file
+c:\shaoqunWu\perl\lib/vars.pm type=file
+c:\shaoqunWu\perl\lib/vmsish.pm type=file
+c:\shaoqunWu\perl\lib/warnings.pm type=file
+c:\shaoqunWu\perl\lib/warnings/register.pm type=file
Index: /for-distributions/trunk/bin/windows/perl/lib/AnyDBM_File.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/AnyDBM_File.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/AnyDBM_File.pm	(revision 14489)
@@ -0,0 +1,93 @@
+package AnyDBM_File;
+
+use 5.006_001;
+our $VERSION = '1.00';
+our @ISA = qw(NDBM_File DB_File GDBM_File SDBM_File ODBM_File) unless @ISA;
+
+my $mod;
+for $mod (@ISA) {
+    if (eval "require $mod") {
+	@ISA = ($mod);	# if we leave @ISA alone, warnings abound
+	return 1;
+    }
+}
+
+die "No DBM package was successfully found or installed";
+#return 0;
+
+=head1 NAME
+
+AnyDBM_File - provide framework for multiple DBMs
+
+NDBM_File, DB_File, GDBM_File, SDBM_File, ODBM_File - various DBM implementations
+
+=head1 SYNOPSIS
+
+    use AnyDBM_File;
+
+=head1 DESCRIPTION
+
+This module is a "pure virtual base class"--it has nothing of its own.
+It's just there to inherit from one of the various DBM packages.  It
+prefers ndbm for compatibility reasons with Perl 4, then Berkeley DB (See
+L<DB_File>), GDBM, SDBM (which is always there--it comes with Perl), and
+finally ODBM.   This way old programs that used to use NDBM via dbmopen()
+can still do so, but new ones can reorder @ISA:
+
+    BEGIN { @AnyDBM_File::ISA = qw(DB_File GDBM_File NDBM_File) }
+    use AnyDBM_File;
+
+Having multiple DBM implementations makes it trivial to copy database formats:
+
+    use POSIX; use NDBM_File; use DB_File;
+    tie %newhash,  'DB_File', $new_filename, O_CREAT|O_RDWR;
+    tie %oldhash,  'NDBM_File', $old_filename, 1, 0;
+    %newhash = %oldhash;
+
+=head2 DBM Comparisons
+
+Here's a partial table of features the different packages offer:
+
+                         odbm    ndbm    sdbm    gdbm    bsd-db
+			 ----	 ----    ----    ----    ------
+ Linkage comes w/ perl   yes     yes     yes     yes     yes
+ Src comes w/ perl       no      no      yes     no      no
+ Comes w/ many unix os   yes     yes[0]  no      no      no
+ Builds ok on !unix      ?       ?       yes     yes     ?
+ Code Size               ?       ?       small   big     big
+ Database Size           ?       ?       small   big?    ok[1]
+ Speed                   ?       ?       slow    ok      fast
+ FTPable                 no      no      yes     yes     yes
+ Easy to build          N/A     N/A      yes     yes     ok[2]
+ Size limits             1k      4k      1k[3]   none    none
+ Byte-order independent  no      no      no      no      yes
+ Licensing restrictions  ?       ?       no      yes     no
+
+
+=over 4
+
+=item [0] 
+
+on mixed universe machines, may be in the bsd compat library,
+which is often shunned.
+
+=item [1] 
+
+Can be trimmed if you compile for one access method.
+
+=item [2] 
+
+See L<DB_File>. 
+Requires symbolic links.  
+
+=item [3] 
+
+By default, but can be redefined.
+
+=back
+
+=head1 SEE ALSO
+
+dbm(3), ndbm(3), DB_File(3), L<perldbmfilter>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Attribute/Handlers.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Attribute/Handlers.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Attribute/Handlers.pm	(revision 14489)
@@ -0,0 +1,847 @@
+package Attribute::Handlers;
+use 5.006;
+use Carp;
+use warnings;
+$VERSION = '0.78_02';
+# $DB::single=1;
+
+my %symcache;
+sub findsym {
+	my ($pkg, $ref, $type) = @_;
+	return $symcache{$pkg,$ref} if $symcache{$pkg,$ref};
+	$type ||= ref($ref);
+	my $found;
+        foreach my $sym ( values %{$pkg."::"} ) {
+            return $symcache{$pkg,$ref} = \$sym
+		if *{$sym}{$type} && *{$sym}{$type} == $ref;
+	}
+}
+
+my %validtype = (
+	VAR	=> [qw[SCALAR ARRAY HASH]],
+        ANY	=> [qw[SCALAR ARRAY HASH CODE]],
+        ""	=> [qw[SCALAR ARRAY HASH CODE]],
+        SCALAR	=> [qw[SCALAR]],
+        ARRAY	=> [qw[ARRAY]],
+        HASH	=> [qw[HASH]],
+        CODE	=> [qw[CODE]],
+);
+my %lastattr;
+my @declarations;
+my %raw;
+my %phase;
+my %sigil = (SCALAR=>'$', ARRAY=>'@', HASH=>'%');
+my $global_phase = 0;
+my %global_phases = (
+	BEGIN	=> 0,
+	CHECK	=> 1,
+	INIT	=> 2,
+	END	=> 3,
+);
+my @global_phases = qw(BEGIN CHECK INIT END);
+
+sub _usage_AH_ {
+	croak "Usage: use $_[0] autotie => {AttrName => TieClassName,...}";
+}
+
+my $qual_id = qr/^[_a-z]\w*(::[_a-z]\w*)*$/i;
+
+sub import {
+    my $class = shift @_;
+    return unless $class eq "Attribute::Handlers";
+    while (@_) {
+	my $cmd = shift;
+        if ($cmd =~ /^autotie((?:ref)?)$/) {
+	    my $tiedata = ($1 ? '$ref, ' : '') . '@$data';
+            my $mapping = shift;
+	    _usage_AH_ $class unless ref($mapping) eq 'HASH';
+	    while (my($attr, $tieclass) = each %$mapping) {
+                $tieclass =~ s/^([_a-z]\w*(::[_a-z]\w*)*)(.*)/$1/is;
+		my $args = $3||'()';
+		_usage_AH_ $class unless $attr =~ $qual_id
+		                 && $tieclass =~ $qual_id
+		                 && eval "use base $tieclass; 1";
+	        if ($tieclass->isa('Exporter')) {
+		    local $Exporter::ExportLevel = 2;
+		    $tieclass->import(eval $args);
+	        }
+		$attr =~ s/__CALLER__/caller(1)/e;
+		$attr = caller()."::".$attr unless $attr =~ /::/;
+	        eval qq{
+	            sub $attr : ATTR(VAR) {
+			my (\$ref, \$data) = \@_[2,4];
+			my \$was_arrayref = ref \$data eq 'ARRAY';
+			\$data = [ \$data ] unless \$was_arrayref;
+			my \$type = ref(\$ref)||"value (".(\$ref||"<undef>").")";
+			 (\$type eq 'SCALAR')? tie \$\$ref,'$tieclass',$tiedata
+			:(\$type eq 'ARRAY') ? tie \@\$ref,'$tieclass',$tiedata
+			:(\$type eq 'HASH')  ? tie \%\$ref,'$tieclass',$tiedata
+			: die "Can't autotie a \$type\n"
+	            } 1
+	        } or die "Internal error: $@";
+	    }
+        }
+        else {
+            croak "Can't understand $_"; 
+        }
+    }
+}
+sub _resolve_lastattr {
+	return unless $lastattr{ref};
+	my $sym = findsym @lastattr{'pkg','ref'}
+		or die "Internal error: $lastattr{pkg} symbol went missing";
+	my $name = *{$sym}{NAME};
+	warn "Declaration of $name attribute in package $lastattr{pkg} may clash with future reserved word\n"
+		if $^W and $name !~ /[A-Z]/;
+	foreach ( @{$validtype{$lastattr{type}}} ) {
+		*{"$lastattr{pkg}::_ATTR_${_}_${name}"} = $lastattr{ref};
+	}
+	%lastattr = ();
+}
+
+sub AUTOLOAD {
+	my ($class) = $AUTOLOAD =~ m/(.*)::/g;
+	$AUTOLOAD =~ m/_ATTR_(.*?)_(.*)/ or
+	    croak "Can't locate class method '$AUTOLOAD' via package '$class'";
+	croak "Attribute handler '$2' doesn't handle $1 attributes";
+}
+
+sub DESTROY {}
+
+my $builtin = qr/lvalue|method|locked|unique|shared/;
+
+sub _gen_handler_AH_() {
+	return sub {
+	    _resolve_lastattr;
+	    my ($pkg, $ref, @attrs) = @_;
+	    foreach (@attrs) {
+		my ($attr, $data) = /^([a-z_]\w*)(?:[(](.*)[)])?$/is or next;
+		if ($attr eq 'ATTR') {
+			$data ||= "ANY";
+			$raw{$ref} = $data =~ s/\s*,?\s*RAWDATA\s*,?\s*//;
+			$phase{$ref}{BEGIN} = 1
+				if $data =~ s/\s*,?\s*(BEGIN)\s*,?\s*//;
+			$phase{$ref}{INIT} = 1
+				if $data =~ s/\s*,?\s*(INIT)\s*,?\s*//;
+			$phase{$ref}{END} = 1
+				if $data =~ s/\s*,?\s*(END)\s*,?\s*//;
+			$phase{$ref}{CHECK} = 1
+				if $data =~ s/\s*,?\s*(CHECK)\s*,?\s*//
+				|| ! keys %{$phase{$ref}};
+			# Added for cleanup to not pollute next call.
+			(%lastattr = ()),
+			croak "Can't have two ATTR specifiers on one subroutine"
+				if keys %lastattr;
+			croak "Bad attribute type: ATTR($data)"
+				unless $validtype{$data};
+			%lastattr=(pkg=>$pkg,ref=>$ref,type=>$data);
+		}
+		else {
+			my $type = ref $ref;
+			my $handler = $pkg->can("_ATTR_${type}_${attr}");
+			next unless $handler;
+		        my $decl = [$pkg, $ref, $attr, $data,
+				    $raw{$handler}, $phase{$handler}];
+			foreach my $gphase (@global_phases) {
+			    _apply_handler_AH_($decl,$gphase)
+				if $global_phases{$gphase} <= $global_phase;
+			}
+			if ($global_phase != 0) {
+				# if _gen_handler_AH_ is being called after 
+				# CHECK it's for a lexical, so make sure
+				# it didn't want to run anything later
+			
+				local $Carp::CarpLevel = 2;
+				carp "Won't be able to apply END handler"
+					if $phase{$handler}{END};
+			}
+			else {
+				push @declarations, $decl
+			}
+		}
+		$_ = undef;
+	    }
+	    return grep {defined && !/$builtin/} @attrs;
+	}
+}
+
+*{"Attribute::Handlers::UNIVERSAL::MODIFY_${_}_ATTRIBUTES"} =
+       _gen_handler_AH_ foreach @{$validtype{ANY}};
+push @UNIVERSAL::ISA, 'Attribute::Handlers::UNIVERSAL'
+       unless grep /^Attribute::Handlers::UNIVERSAL$/, @UNIVERSAL::ISA;
+
+sub _apply_handler_AH_ {
+	my ($declaration, $phase) = @_;
+	my ($pkg, $ref, $attr, $data, $raw, $handlerphase) = @$declaration;
+	return unless $handlerphase->{$phase};
+	# print STDERR "Handling $attr on $ref in $phase with [$data]\n";
+	my $type = ref $ref;
+	my $handler = "_ATTR_${type}_${attr}";
+	my $sym = findsym($pkg, $ref);
+	$sym ||= $type eq 'CODE' ? 'ANON' : 'LEXICAL';
+	no warnings;
+	my $evaled = !$raw && eval("package $pkg; no warnings;
+				    local \$SIG{__WARN__}=sub{die}; [$data]");
+	$data = ($evaled && $data =~ /^\s*\[/)  ? [$evaled]
+	      : ($evaled)			? $evaled
+	      :					  [$data];
+	$pkg->$handler($sym,
+		       (ref $sym eq 'GLOB' ? *{$sym}{ref $ref}||$ref : $ref),
+		       $attr,
+		       (@$data>1? $data : $data->[0]),
+		       $phase,
+		      );
+	return 1;
+}
+
+{
+        no warnings 'void';
+        CHECK {
+               $global_phase++;
+               _resolve_lastattr;
+               _apply_handler_AH_($_,'CHECK') foreach @declarations;
+        }
+
+        INIT {
+                $global_phase++;
+                _apply_handler_AH_($_,'INIT') foreach @declarations
+        }
+}
+
+END { $global_phase++; _apply_handler_AH_($_,'END') foreach @declarations }
+
+1;
+__END__
+
+=head1 NAME
+
+Attribute::Handlers - Simpler definition of attribute handlers
+
+=head1 VERSION
+
+This document describes version 0.78 of Attribute::Handlers,
+released October 5, 2002.
+
+=head1 SYNOPSIS
+
+	package MyClass;
+	require v5.6.0;
+	use Attribute::Handlers;
+	no warnings 'redefine';
+
+
+	sub Good : ATTR(SCALAR) {
+		my ($package, $symbol, $referent, $attr, $data) = @_;
+
+		# Invoked for any scalar variable with a :Good attribute,
+		# provided the variable was declared in MyClass (or
+		# a derived class) or typed to MyClass.
+
+		# Do whatever to $referent here (executed in CHECK phase).
+		...
+	}
+
+	sub Bad : ATTR(SCALAR) {
+		# Invoked for any scalar variable with a :Bad attribute,
+		# provided the variable was declared in MyClass (or
+		# a derived class) or typed to MyClass.
+		...
+	}
+
+	sub Good : ATTR(ARRAY) {
+		# Invoked for any array variable with a :Good attribute,
+		# provided the variable was declared in MyClass (or
+		# a derived class) or typed to MyClass.
+		...
+	}
+
+	sub Good : ATTR(HASH) {
+		# Invoked for any hash variable with a :Good attribute,
+		# provided the variable was declared in MyClass (or
+		# a derived class) or typed to MyClass.
+		...
+	}
+
+	sub Ugly : ATTR(CODE) {
+		# Invoked for any subroutine declared in MyClass (or a 
+		# derived class) with an :Ugly attribute.
+		...
+	}
+
+	sub Omni : ATTR {
+		# Invoked for any scalar, array, hash, or subroutine
+		# with an :Omni attribute, provided the variable or
+		# subroutine was declared in MyClass (or a derived class)
+		# or the variable was typed to MyClass.
+		# Use ref($_[2]) to determine what kind of referent it was.
+		...
+	}
+
+
+	use Attribute::Handlers autotie => { Cycle => Tie::Cycle };
+
+	my $next : Cycle(['A'..'Z']);
+
+
+=head1 DESCRIPTION
+
+This module, when inherited by a package, allows that package's class to
+define attribute handler subroutines for specific attributes. Variables
+and subroutines subsequently defined in that package, or in packages
+derived from that package may be given attributes with the same names as
+the attribute handler subroutines, which will then be called in one of
+the compilation phases (i.e. in a C<BEGIN>, C<CHECK>, C<INIT>, or C<END>
+block).
+
+To create a handler, define it as a subroutine with the same name as
+the desired attribute, and declare the subroutine itself with the  
+attribute C<:ATTR>. For example:
+
+	package LoudDecl;
+	use Attribute::Handlers;
+
+	sub Loud :ATTR {
+		my ($package, $symbol, $referent, $attr, $data, $phase) = @_;
+		print STDERR
+			ref($referent), " ",
+			*{$symbol}{NAME}, " ",
+			"($referent) ", "was just declared ",
+			"and ascribed the ${attr} attribute ",
+			"with data ($data)\n",
+			"in phase $phase\n";
+	}
+
+This creates a handler for the attribute C<:Loud> in the class LoudDecl.
+Thereafter, any subroutine declared with a C<:Loud> attribute in the class
+LoudDecl:
+
+	package LoudDecl;
+
+	sub foo: Loud {...}
+
+causes the above handler to be invoked, and passed:
+
+=over
+
+=item [0]
+
+the name of the package into which it was declared;
+
+=item [1]
+
+a reference to the symbol table entry (typeglob) containing the subroutine;
+
+=item [2]
+
+a reference to the subroutine;
+
+=item [3]
+
+the name of the attribute;
+
+=item [4]
+
+any data associated with that attribute;
+
+=item [5]
+
+the name of the phase in which the handler is being invoked.
+
+=back
+
+Likewise, declaring any variables with the C<:Loud> attribute within the
+package:
+
+        package LoudDecl;
+
+        my $foo :Loud;
+        my @foo :Loud;
+        my %foo :Loud;
+
+will cause the handler to be called with a similar argument list (except,
+of course, that C<$_[2]> will be a reference to the variable).
+
+The package name argument will typically be the name of the class into
+which the subroutine was declared, but it may also be the name of a derived
+class (since handlers are inherited).
+
+If a lexical variable is given an attribute, there is no symbol table to 
+which it belongs, so the symbol table argument (C<$_[1]>) is set to the
+string C<'LEXICAL'> in that case. Likewise, ascribing an attribute to
+an anonymous subroutine results in a symbol table argument of C<'ANON'>.
+
+The data argument passes in the value (if any) associated with the 
+attribute. For example, if C<&foo> had been declared:
+
+        sub foo :Loud("turn it up to 11, man!") {...}
+
+then the string C<"turn it up to 11, man!"> would be passed as the
+last argument.
+
+Attribute::Handlers makes strenuous efforts to convert
+the data argument (C<$_[4]>) to a useable form before passing it to
+the handler (but see L<"Non-interpretive attribute handlers">).
+For example, all of these:
+
+        sub foo :Loud(till=>ears=>are=>bleeding) {...}
+        sub foo :Loud(['till','ears','are','bleeding']) {...}
+        sub foo :Loud(qw/till ears are bleeding/) {...}
+        sub foo :Loud(qw/my, ears, are, bleeding/) {...}
+        sub foo :Loud(till,ears,are,bleeding) {...}
+
+causes it to pass C<['till','ears','are','bleeding']> as the handler's
+data argument. However, if the data can't be parsed as valid Perl, then
+it is passed as an uninterpreted string. For example:
+
+        sub foo :Loud(my,ears,are,bleeding) {...}
+        sub foo :Loud(qw/my ears are bleeding) {...}
+
+cause the strings C<'my,ears,are,bleeding'> and C<'qw/my ears are bleeding'>
+respectively to be passed as the data argument.
+
+If the attribute has only a single associated scalar data value, that value is
+passed as a scalar. If multiple values are associated, they are passed as an
+array reference. If no value is associated with the attribute, C<undef> is
+passed.
+
+
+=head2 Typed lexicals
+
+Regardless of the package in which it is declared, if a lexical variable is
+ascribed an attribute, the handler that is invoked is the one belonging to
+the package to which it is typed. For example, the following declarations:
+
+        package OtherClass;
+
+        my LoudDecl $loudobj : Loud;
+        my LoudDecl @loudobjs : Loud;
+        my LoudDecl %loudobjex : Loud;
+
+causes the LoudDecl::Loud handler to be invoked (even if OtherClass also
+defines a handler for C<:Loud> attributes).
+
+
+=head2 Type-specific attribute handlers
+
+If an attribute handler is declared and the C<:ATTR> specifier is
+given the name of a built-in type (C<SCALAR>, C<ARRAY>, C<HASH>, or C<CODE>),
+the handler is only applied to declarations of that type. For example,
+the following definition:
+
+        package LoudDecl;
+
+        sub RealLoud :ATTR(SCALAR) { print "Yeeeeow!" }
+
+creates an attribute handler that applies only to scalars:
+
+
+        package Painful;
+        use base LoudDecl;
+
+        my $metal : RealLoud;           # invokes &LoudDecl::RealLoud
+        my @metal : RealLoud;           # error: unknown attribute
+        my %metal : RealLoud;           # error: unknown attribute
+        sub metal : RealLoud {...}      # error: unknown attribute
+
+You can, of course, declare separate handlers for these types as well
+(but you'll need to specify C<no warnings 'redefine'> to do it quietly):
+
+        package LoudDecl;
+        use Attribute::Handlers;
+        no warnings 'redefine';
+
+        sub RealLoud :ATTR(SCALAR) { print "Yeeeeow!" }
+        sub RealLoud :ATTR(ARRAY) { print "Urrrrrrrrrr!" }
+        sub RealLoud :ATTR(HASH) { print "Arrrrrgggghhhhhh!" }
+        sub RealLoud :ATTR(CODE) { croak "Real loud sub torpedoed" }
+
+You can also explicitly indicate that a single handler is meant to be
+used for all types of referents like so:
+
+        package LoudDecl;
+        use Attribute::Handlers;
+
+        sub SeriousLoud :ATTR(ANY) { warn "Hearing loss imminent" }
+
+(I.e. C<ATTR(ANY)> is a synonym for C<:ATTR>).
+
+
+=head2 Non-interpretive attribute handlers
+
+Occasionally the strenuous efforts Attribute::Handlers makes to convert
+the data argument (C<$_[4]>) to a useable form before passing it to
+the handler get in the way.
+
+You can turn off that eagerness-to-help by declaring
+an attribute handler with the keyword C<RAWDATA>. For example:
+
+        sub Raw          : ATTR(RAWDATA) {...}
+        sub Nekkid       : ATTR(SCALAR,RAWDATA) {...}
+        sub Au::Naturale : ATTR(RAWDATA,ANY) {...}
+
+Then the handler makes absolutely no attempt to interpret the data it
+receives and simply passes it as a string:
+
+        my $power : Raw(1..100);        # handlers receives "1..100"
+
+=head2 Phase-specific attribute handlers
+
+By default, attribute handlers are called at the end of the compilation
+phase (in a C<CHECK> block). This seems to be optimal in most cases because
+most things that can be defined are defined by that point but nothing has
+been executed.
+
+However, it is possible to set up attribute handlers that are called at
+other points in the program's compilation or execution, by explicitly
+stating the phase (or phases) in which you wish the attribute handler to
+be called. For example:
+
+        sub Early    :ATTR(SCALAR,BEGIN) {...}
+        sub Normal   :ATTR(SCALAR,CHECK) {...}
+        sub Late     :ATTR(SCALAR,INIT) {...}
+        sub Final    :ATTR(SCALAR,END) {...}
+        sub Bookends :ATTR(SCALAR,BEGIN,END) {...}
+
+As the last example indicates, a handler may be set up to be (re)called in
+two or more phases. The phase name is passed as the handler's final argument.
+
+Note that attribute handlers that are scheduled for the C<BEGIN> phase
+are handled as soon as the attribute is detected (i.e. before any
+subsequently defined C<BEGIN> blocks are executed).
+
+
+=head2 Attributes as C<tie> interfaces
+
+Attributes make an excellent and intuitive interface through which to tie
+variables. For example:
+
+        use Attribute::Handlers;
+        use Tie::Cycle;
+
+        sub UNIVERSAL::Cycle : ATTR(SCALAR) {
+                my ($package, $symbol, $referent, $attr, $data, $phase) = @_;
+                $data = [ $data ] unless ref $data eq 'ARRAY';
+                tie $$referent, 'Tie::Cycle', $data;
+        }
+
+        # and thereafter...
+
+        package main;
+
+        my $next : Cycle('A'..'Z');     # $next is now a tied variable
+
+        while (<>) {
+                print $next;
+        }
+
+Note that, because the C<Cycle> attribute receives its arguments in the
+C<$data> variable, if the attribute is given a list of arguments, C<$data>
+will consist of a single array reference; otherwise, it will consist of the
+single argument directly. Since Tie::Cycle requires its cycling values to
+be passed as an array reference, this means that we need to wrap
+non-array-reference arguments in an array constructor:
+
+        $data = [ $data ] unless ref $data eq 'ARRAY';
+
+Typically, however, things are the other way around: the tieable class expects
+its arguments as a flattened list, so the attribute looks like:
+
+        sub UNIVERSAL::Cycle : ATTR(SCALAR) {
+                my ($package, $symbol, $referent, $attr, $data, $phase) = @_;
+                my @data = ref $data eq 'ARRAY' ? @$data : $data;
+                tie $$referent, 'Tie::Whatever', @data;
+        }
+
+
+This software pattern is so widely applicable that Attribute::Handlers
+provides a way to automate it: specifying C<'autotie'> in the
+C<use Attribute::Handlers> statement. So, the cycling example,
+could also be written:
+
+        use Attribute::Handlers autotie => { Cycle => 'Tie::Cycle' };
+
+        # and thereafter...
+
+        package main;
+
+        my $next : Cycle(['A'..'Z']);     # $next is now a tied variable
+
+        while (<>) {
+                print $next;
+
+Note that we now have to pass the cycling values as an array reference,
+since the C<autotie> mechanism passes C<tie> a list of arguments as a list
+(as in the Tie::Whatever example), I<not> as an array reference (as in
+the original Tie::Cycle example at the start of this section).
+
+The argument after C<'autotie'> is a reference to a hash in which each key is
+the name of an attribute to be created, and each value is the class to which
+variables ascribed that attribute should be tied.
+
+Note that there is no longer any need to import the Tie::Cycle module --
+Attribute::Handlers takes care of that automagically. You can even pass
+arguments to the module's C<import> subroutine, by appending them to the
+class name. For example:
+
+	use Attribute::Handlers
+		autotie => { Dir => 'Tie::Dir qw(DIR_UNLINK)' };
+
+If the attribute name is unqualified, the attribute is installed in the
+current package. Otherwise it is installed in the qualifier's package:
+
+        package Here;
+
+        use Attribute::Handlers autotie => {
+                Other::Good => Tie::SecureHash, # tie attr installed in Other::
+                        Bad => Tie::Taxes,      # tie attr installed in Here::
+            UNIVERSAL::Ugly => Software::Patent # tie attr installed everywhere
+        };
+
+Autoties are most commonly used in the module to which they actually tie, 
+and need to export their attributes to any module that calls them. To
+facilitate this, Attribute::Handlers recognizes a special "pseudo-class" --
+C<__CALLER__>, which may be specified as the qualifier of an attribute:
+
+        package Tie::Me::Kangaroo:Down::Sport;
+
+        use Attribute::Handlers autotie => { '__CALLER__::Roo' => __PACKAGE__ };
+
+This causes Attribute::Handlers to define the C<Roo> attribute in the package
+that imports the Tie::Me::Kangaroo:Down::Sport module.
+
+Note that it is important to quote the __CALLER__::Roo identifier because
+a bug in perl 5.8 will refuse to parse it and cause an unknown error.
+
+=head3 Passing the tied object to C<tie>
+
+Occasionally it is important to pass a reference to the object being tied
+to the TIESCALAR, TIEHASH, etc. that ties it. 
+
+The C<autotie> mechanism supports this too. The following code:
+
+	use Attribute::Handlers autotieref => { Selfish => Tie::Selfish };
+	my $var : Selfish(@args);
+
+has the same effect as:
+
+	tie my $var, 'Tie::Selfish', @args;
+
+But when C<"autotieref"> is used instead of C<"autotie">:
+
+	use Attribute::Handlers autotieref => { Selfish => Tie::Selfish };
+	my $var : Selfish(@args);
+
+the effect is to pass the C<tie> call an extra reference to the variable
+being tied:
+
+        tie my $var, 'Tie::Selfish', \$var, @args;
+
+
+
+=head1 EXAMPLES
+
+If the class shown in L<SYNOPSIS> were placed in the MyClass.pm
+module, then the following code:
+
+        package main;
+        use MyClass;
+
+        my MyClass $slr :Good :Bad(1**1-1) :Omni(-vorous);
+
+        package SomeOtherClass;
+        use base MyClass;
+
+        sub tent { 'acle' }
+
+        sub fn :Ugly(sister) :Omni('po',tent()) {...}
+        my @arr :Good :Omni(s/cie/nt/);
+        my %hsh :Good(q/bye) :Omni(q/bus/);
+
+
+would cause the following handlers to be invoked:
+
+        # my MyClass $slr :Good :Bad(1**1-1) :Omni(-vorous);
+
+        MyClass::Good:ATTR(SCALAR)( 'MyClass',          # class
+                                    'LEXICAL',          # no typeglob
+                                    \$slr,              # referent
+                                    'Good',             # attr name
+                                    undef               # no attr data
+                                    'CHECK',            # compiler phase
+                                  );
+
+        MyClass::Bad:ATTR(SCALAR)( 'MyClass',           # class
+                                   'LEXICAL',           # no typeglob
+                                   \$slr,               # referent
+                                   'Bad',               # attr name
+                                   0                    # eval'd attr data
+                                   'CHECK',             # compiler phase
+                                 );
+
+        MyClass::Omni:ATTR(SCALAR)( 'MyClass',          # class
+                                    'LEXICAL',          # no typeglob
+                                    \$slr,              # referent
+                                    'Omni',             # attr name
+                                    '-vorous'           # eval'd attr data
+                                    'CHECK',            # compiler phase
+                                  );
+
+
+        # sub fn :Ugly(sister) :Omni('po',tent()) {...}
+
+        MyClass::UGLY:ATTR(CODE)( 'SomeOtherClass',     # class
+                                  \*SomeOtherClass::fn, # typeglob
+                                  \&SomeOtherClass::fn, # referent
+                                  'Ugly',               # attr name
+                                  'sister'              # eval'd attr data
+                                  'CHECK',              # compiler phase
+                                );
+
+        MyClass::Omni:ATTR(CODE)( 'SomeOtherClass',     # class
+                                  \*SomeOtherClass::fn, # typeglob
+                                  \&SomeOtherClass::fn, # referent
+                                  'Omni',               # attr name
+                                  ['po','acle']         # eval'd attr data
+                                  'CHECK',              # compiler phase
+                                );
+
+
+        # my @arr :Good :Omni(s/cie/nt/);
+
+        MyClass::Good:ATTR(ARRAY)( 'SomeOtherClass',    # class
+                                   'LEXICAL',           # no typeglob
+                                   \@arr,               # referent
+                                   'Good',              # attr name
+                                   undef                # no attr data
+                                   'CHECK',             # compiler phase
+                                 );
+
+        MyClass::Omni:ATTR(ARRAY)( 'SomeOtherClass',    # class
+                                   'LEXICAL',           # no typeglob
+                                   \@arr,               # referent
+                                   'Omni',              # attr name
+                                   ""                   # eval'd attr data 
+                                   'CHECK',             # compiler phase
+                                 );
+
+
+        # my %hsh :Good(q/bye) :Omni(q/bus/);
+                                  
+        MyClass::Good:ATTR(HASH)( 'SomeOtherClass',     # class
+                                  'LEXICAL',            # no typeglob
+                                  \%hsh,                # referent
+                                  'Good',               # attr name
+                                  'q/bye'               # raw attr data
+                                  'CHECK',              # compiler phase
+                                );
+                        
+        MyClass::Omni:ATTR(HASH)( 'SomeOtherClass',     # class
+                                  'LEXICAL',            # no typeglob
+                                  \%hsh,                # referent
+                                  'Omni',               # attr name
+                                  'bus'                 # eval'd attr data
+                                  'CHECK',              # compiler phase
+                                );
+
+
+Installing handlers into UNIVERSAL, makes them...err..universal.
+For example:
+
+        package Descriptions;
+        use Attribute::Handlers;
+
+        my %name;
+        sub name { return $name{$_[2]}||*{$_[1]}{NAME} }
+
+        sub UNIVERSAL::Name :ATTR {
+                $name{$_[2]} = $_[4];
+        }
+
+        sub UNIVERSAL::Purpose :ATTR {
+                print STDERR "Purpose of ", &name, " is $_[4]\n";
+        }
+
+        sub UNIVERSAL::Unit :ATTR {
+                print STDERR &name, " measured in $_[4]\n";
+        }
+
+Let's you write:
+
+        use Descriptions;
+
+        my $capacity : Name(capacity)
+                     : Purpose(to store max storage capacity for files)
+                     : Unit(Gb);
+
+
+        package Other;
+
+        sub foo : Purpose(to foo all data before barring it) { }
+
+        # etc.
+
+
+=head1 DIAGNOSTICS
+
+=over
+
+=item C<Bad attribute type: ATTR(%s)>
+
+An attribute handler was specified with an C<:ATTR(I<ref_type>)>, but the
+type of referent it was defined to handle wasn't one of the five permitted:
+C<SCALAR>, C<ARRAY>, C<HASH>, C<CODE>, or C<ANY>.
+
+=item C<Attribute handler %s doesn't handle %s attributes>
+
+A handler for attributes of the specified name I<was> defined, but not
+for the specified type of declaration. Typically encountered whe trying
+to apply a C<VAR> attribute handler to a subroutine, or a C<SCALAR>
+attribute handler to some other type of variable.
+
+=item C<Declaration of %s attribute in package %s may clash with future reserved word>
+
+A handler for an attributes with an all-lowercase name was declared. An
+attribute with an all-lowercase name might have a meaning to Perl
+itself some day, even though most don't yet. Use a mixed-case attribute
+name, instead.
+
+=item C<Can't have two ATTR specifiers on one subroutine>
+
+You just can't, okay?
+Instead, put all the specifications together with commas between them
+in a single C<ATTR(I<specification>)>.
+
+=item C<Can't autotie a %s>
+
+You can only declare autoties for types C<"SCALAR">, C<"ARRAY">, and
+C<"HASH">. They're the only things (apart from typeglobs -- which are
+not declarable) that Perl can tie.
+
+=item C<Internal error: %s symbol went missing>
+
+Something is rotten in the state of the program. An attributed
+subroutine ceased to exist between the point it was declared and the point
+at which its attribute handler(s) would have been called.
+
+=item C<Won't be able to apply END handler>
+
+You have defined an END handler for an attribute that is being applied
+to a lexical variable.  Since the variable may not be available during END
+this won't happen.
+
+=back
+
+=head1 AUTHOR
+
+Damian Conway (damian@conway.org)
+
+=head1 BUGS
+
+There are undoubtedly serious bugs lurking somewhere in code this funky :-)
+Bug reports and other feedback are most welcome.
+
+=head1 COPYRIGHT
+
+         Copyright (c) 2001, Damian Conway. All Rights Reserved.
+       This module is free software. It may be used, redistributed
+           and/or modified under the same terms as Perl itself.
Index: /for-distributions/trunk/bin/windows/perl/lib/AutoLoader.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/AutoLoader.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/AutoLoader.pm	(revision 14489)
@@ -0,0 +1,343 @@
+package AutoLoader;
+
+use strict;
+use 5.006_001;
+
+our($VERSION, $AUTOLOAD);
+
+my $is_dosish;
+my $is_epoc;
+my $is_vms;
+my $is_macos;
+
+BEGIN {
+    $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'NetWare';
+    $is_epoc = $^O eq 'epoc';
+    $is_vms = $^O eq 'VMS';
+    $is_macos = $^O eq 'MacOS';
+    $VERSION = '5.60';
+}
+
+AUTOLOAD {
+    my $sub = $AUTOLOAD;
+    my $filename;
+    # Braces used to preserve $1 et al.
+    {
+	# Try to find the autoloaded file from the package-qualified
+	# name of the sub. e.g., if the sub needed is
+	# Getopt::Long::GetOptions(), then $INC{Getopt/Long.pm} is
+	# something like '/usr/lib/perl5/Getopt/Long.pm', and the
+	# autoload file is '/usr/lib/perl5/auto/Getopt/Long/GetOptions.al'.
+	#
+	# However, if @INC is a relative path, this might not work.  If,
+	# for example, @INC = ('lib'), then $INC{Getopt/Long.pm} is
+	# 'lib/Getopt/Long.pm', and we want to require
+	# 'auto/Getopt/Long/GetOptions.al' (without the leading 'lib').
+	# In this case, we simple prepend the 'auto/' and let the
+	# C<require> take care of the searching for us.
+
+	my ($pkg,$func) = ($sub =~ /(.*)::([^:]+)$/);
+	$pkg =~ s#::#/#g;
+	if (defined($filename = $INC{"$pkg.pm"})) {
+	    if ($is_macos) {
+		$pkg =~ tr#/#:#;
+		$filename =~ s#^(.*)$pkg\.pm\z#$1auto:$pkg:$func.al#s;
+	    } else {
+		$filename =~ s#^(.*)$pkg\.pm\z#$1auto/$pkg/$func.al#s;
+	    }
+
+	    # if the file exists, then make sure that it is a
+	    # a fully anchored path (i.e either '/usr/lib/auto/foo/bar.al',
+	    # or './lib/auto/foo/bar.al'.  This avoids C<require> searching
+	    # (and failing) to find the 'lib/auto/foo/bar.al' because it
+	    # looked for 'lib/lib/auto/foo/bar.al', given @INC = ('lib').
+
+	    if (-r $filename) {
+		unless ($filename =~ m|^/|s) {
+		    if ($is_dosish) {
+			unless ($filename =~ m{^([a-z]:)?[\\/]}is) {
+			     if ($^O ne 'NetWare') {
+					$filename = "./$filename";
+				} else {
+					$filename = "$filename";
+				}
+			}
+		    }
+		    elsif ($is_epoc) {
+			unless ($filename =~ m{^([a-z?]:)?[\\/]}is) {
+			     $filename = "./$filename";
+			}
+		    }
+		    elsif ($is_vms) {
+			# XXX todo by VMSmiths
+			$filename = "./$filename";
+		    }
+		    elsif (!$is_macos) {
+			$filename = "./$filename";
+		    }
+		}
+	    }
+	    else {
+		$filename = undef;
+	    }
+	}
+	unless (defined $filename) {
+	    # let C<require> do the searching
+	    $filename = "auto/$sub.al";
+	    $filename =~ s#::#/#g;
+	}
+    }
+    my $save = $@;
+    local $!; # Do not munge the value. 
+    eval { local $SIG{__DIE__}; require $filename };
+    if ($@) {
+	if (substr($sub,-9) eq '::DESTROY') {
+	    no strict 'refs';
+	    *$sub = sub {};
+	    $@ = undef;
+	} elsif ($@ =~ /^Can't locate/) {
+	    # The load might just have failed because the filename was too
+	    # long for some old SVR3 systems which treat long names as errors.
+	    # If we can successfully truncate a long name then it's worth a go.
+	    # There is a slight risk that we could pick up the wrong file here
+	    # but autosplit should have warned about that when splitting.
+	    if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){
+		eval { local $SIG{__DIE__}; require $filename };
+	    }
+	}
+	if ($@){
+	    $@ =~ s/ at .*\n//;
+	    my $error = $@;
+	    require Carp;
+	    Carp::croak($error);
+	}
+    }
+    $@ = $save;
+    goto &$sub;
+}
+
+sub import {
+    my $pkg = shift;
+    my $callpkg = caller;
+
+    #
+    # Export symbols, but not by accident of inheritance.
+    #
+
+    if ($pkg eq 'AutoLoader') {
+	no strict 'refs';
+	*{ $callpkg . '::AUTOLOAD' } = \&AUTOLOAD
+	    if @_ and $_[0] =~ /^&?AUTOLOAD$/;
+    }
+
+    #
+    # Try to find the autosplit index file.  Eg., if the call package
+    # is POSIX, then $INC{POSIX.pm} is something like
+    # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in
+    # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that.
+    #
+    # However, if @INC is a relative path, this might not work.  If,
+    # for example, @INC = ('lib'), then
+    # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require
+    # 'auto/POSIX/autosplit.ix' (without the leading 'lib').
+    #
+
+    (my $calldir = $callpkg) =~ s#::#/#g;
+    my $path = $INC{$calldir . '.pm'};
+    if (defined($path)) {
+	# Try absolute path name.
+	if ($is_macos) {
+	    (my $malldir = $calldir) =~ tr#/#:#;
+	    $path =~ s#^(.*)$malldir\.pm\z#$1auto:$malldir:autosplit.ix#s;
+	} else {
+	    $path =~ s#^(.*)$calldir\.pm\z#$1auto/$calldir/autosplit.ix#;
+	}
+
+	eval { require $path; };
+	# If that failed, try relative path with normal @INC searching.
+	if ($@) {
+	    $path ="auto/$calldir/autosplit.ix";
+	    eval { require $path; };
+	}
+	if ($@) {
+	    my $error = $@;
+	    require Carp;
+	    Carp::carp($error);
+	}
+    } 
+}
+
+sub unimport {
+    my $callpkg = caller;
+
+    no strict 'refs';
+    my $symname = $callpkg . '::AUTOLOAD';
+    undef *{ $symname } if \&{ $symname } == \&AUTOLOAD;
+    *{ $symname } = \&{ $symname };
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+AutoLoader - load subroutines only on demand
+
+=head1 SYNOPSIS
+
+    package Foo;
+    use AutoLoader 'AUTOLOAD';   # import the default AUTOLOAD subroutine
+
+    package Bar;
+    use AutoLoader;              # don't import AUTOLOAD, define our own
+    sub AUTOLOAD {
+        ...
+        $AutoLoader::AUTOLOAD = "...";
+        goto &AutoLoader::AUTOLOAD;
+    }
+
+=head1 DESCRIPTION
+
+The B<AutoLoader> module works with the B<AutoSplit> module and the
+C<__END__> token to defer the loading of some subroutines until they are
+used rather than loading them all at once.
+
+To use B<AutoLoader>, the author of a module has to place the
+definitions of subroutines to be autoloaded after an C<__END__> token.
+(See L<perldata>.)  The B<AutoSplit> module can then be run manually to
+extract the definitions into individual files F<auto/funcname.al>.
+
+B<AutoLoader> implements an AUTOLOAD subroutine.  When an undefined
+subroutine in is called in a client module of B<AutoLoader>,
+B<AutoLoader>'s AUTOLOAD subroutine attempts to locate the subroutine in a
+file with a name related to the location of the file from which the
+client module was read.  As an example, if F<POSIX.pm> is located in
+F</usr/local/lib/perl5/POSIX.pm>, B<AutoLoader> will look for perl
+subroutines B<POSIX> in F</usr/local/lib/perl5/auto/POSIX/*.al>, where
+the C<.al> file has the same name as the subroutine, sans package.  If
+such a file exists, AUTOLOAD will read and evaluate it,
+thus (presumably) defining the needed subroutine.  AUTOLOAD will then
+C<goto> the newly defined subroutine.
+
+Once this process completes for a given function, it is defined, so
+future calls to the subroutine will bypass the AUTOLOAD mechanism.
+
+=head2 Subroutine Stubs
+
+In order for object method lookup and/or prototype checking to operate
+correctly even when methods have not yet been defined it is necessary to
+"forward declare" each subroutine (as in C<sub NAME;>).  See
+L<perlsub/"SYNOPSIS">.  Such forward declaration creates "subroutine
+stubs", which are place holders with no code.
+
+The AutoSplit and B<AutoLoader> modules automate the creation of forward
+declarations.  The AutoSplit module creates an 'index' file containing
+forward declarations of all the AutoSplit subroutines.  When the
+AutoLoader module is 'use'd it loads these declarations into its callers
+package.
+
+Because of this mechanism it is important that B<AutoLoader> is always
+C<use>d and not C<require>d.
+
+=head2 Using B<AutoLoader>'s AUTOLOAD Subroutine
+
+In order to use B<AutoLoader>'s AUTOLOAD subroutine you I<must>
+explicitly import it:
+
+    use AutoLoader 'AUTOLOAD';
+
+=head2 Overriding B<AutoLoader>'s AUTOLOAD Subroutine
+
+Some modules, mainly extensions, provide their own AUTOLOAD subroutines.
+They typically need to check for some special cases (such as constants)
+and then fallback to B<AutoLoader>'s AUTOLOAD for the rest.
+
+Such modules should I<not> import B<AutoLoader>'s AUTOLOAD subroutine.
+Instead, they should define their own AUTOLOAD subroutines along these
+lines:
+
+    use AutoLoader;
+    use Carp;
+
+    sub AUTOLOAD {
+        my $sub = $AUTOLOAD;
+        (my $constname = $sub) =~ s/.*:://;
+        my $val = constant($constname, @_ ? $_[0] : 0);
+        if ($! != 0) {
+            if ($! =~ /Invalid/ || $!{EINVAL}) {
+                $AutoLoader::AUTOLOAD = $sub;
+                goto &AutoLoader::AUTOLOAD;
+            }
+            else {
+                croak "Your vendor has not defined constant $constname";
+            }
+        }
+        *$sub = sub { $val }; # same as: eval "sub $sub { $val }";
+        goto &$sub;
+    }
+
+If any module's own AUTOLOAD subroutine has no need to fallback to the
+AutoLoader's AUTOLOAD subroutine (because it doesn't have any AutoSplit
+subroutines), then that module should not use B<AutoLoader> at all.
+
+=head2 Package Lexicals
+
+Package lexicals declared with C<my> in the main block of a package
+using B<AutoLoader> will not be visible to auto-loaded subroutines, due to
+the fact that the given scope ends at the C<__END__> marker.  A module
+using such variables as package globals will not work properly under the
+B<AutoLoader>.
+
+The C<vars> pragma (see L<perlmod/"vars">) may be used in such
+situations as an alternative to explicitly qualifying all globals with
+the package namespace.  Variables pre-declared with this pragma will be
+visible to any autoloaded routines (but will not be invisible outside
+the package, unfortunately).
+
+=head2 Not Using AutoLoader
+
+You can stop using AutoLoader by simply
+
+	no AutoLoader;
+
+=head2 B<AutoLoader> vs. B<SelfLoader>
+
+The B<AutoLoader> is similar in purpose to B<SelfLoader>: both delay the
+loading of subroutines.
+
+B<SelfLoader> uses the C<__DATA__> marker rather than C<__END__>.
+While this avoids the use of a hierarchy of disk files and the
+associated open/close for each routine loaded, B<SelfLoader> suffers a
+startup speed disadvantage in the one-time parsing of the lines after
+C<__DATA__>, after which routines are cached.  B<SelfLoader> can also
+handle multiple packages in a file.
+
+B<AutoLoader> only reads code as it is requested, and in many cases
+should be faster, but requires a mechanism like B<AutoSplit> be used to
+create the individual files.  L<ExtUtils::MakeMaker> will invoke
+B<AutoSplit> automatically if B<AutoLoader> is used in a module source
+file.
+
+=head1 CAVEATS
+
+AutoLoaders prior to Perl 5.002 had a slightly different interface.  Any
+old modules which use B<AutoLoader> should be changed to the new calling
+style.  Typically this just means changing a require to a use, adding
+the explicit C<'AUTOLOAD'> import if needed, and removing B<AutoLoader>
+from C<@ISA>.
+
+On systems with restrictions on file name length, the file corresponding
+to a subroutine may have a shorter name that the routine itself.  This
+can lead to conflicting file names.  The I<AutoSplit> package warns of
+these potential conflicts when used to split a module.
+
+AutoLoader may fail to find the autosplit files (or even find the wrong
+ones) in cases where C<@INC> contains relative paths, B<and> the program
+does C<chdir>.
+
+=head1 SEE ALSO
+
+L<SelfLoader> - an autoloader that doesn't use external files.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/AutoSplit.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/AutoSplit.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/AutoSplit.pm	(revision 14489)
@@ -0,0 +1,500 @@
+package AutoSplit;
+
+use 5.006_001;
+use Exporter ();
+use Config qw(%Config);
+use Carp qw(carp);
+use File::Basename ();
+use File::Path qw(mkpath);
+use File::Spec::Functions qw(curdir catfile catdir);
+use strict;
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $Verbose, $Keep, $Maxlen,
+    $CheckForAutoloader, $CheckModTime);
+
+$VERSION = "1.04";
+@ISA = qw(Exporter);
+@EXPORT = qw(&autosplit &autosplit_lib_modules);
+@EXPORT_OK = qw($Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime);
+
+=head1 NAME
+
+AutoSplit - split a package for autoloading
+
+=head1 SYNOPSIS
+
+ autosplit($file, $dir, $keep, $check, $modtime);
+
+ autosplit_lib_modules(@modules);
+
+=head1 DESCRIPTION
+
+This function will split up your program into files that the AutoLoader
+module can handle. It is used by both the standard perl libraries and by
+the MakeMaker utility, to automatically configure libraries for autoloading.
+
+The C<autosplit> interface splits the specified file into a hierarchy 
+rooted at the directory C<$dir>. It creates directories as needed to reflect
+class hierarchy, and creates the file F<autosplit.ix>. This file acts as
+both forward declaration of all package routines, and as timestamp for the
+last update of the hierarchy.
+
+The remaining three arguments to C<autosplit> govern other options to
+the autosplitter.
+
+=over 2
+
+=item $keep
+
+If the third argument, I<$keep>, is false, then any
+pre-existing C<*.al> files in the autoload directory are removed if
+they are no longer part of the module (obsoleted functions).
+$keep defaults to 0.
+
+=item $check
+
+The
+fourth argument, I<$check>, instructs C<autosplit> to check the module
+currently being split to ensure that it includes a C<use>
+specification for the AutoLoader module, and skips the module if
+AutoLoader is not detected.
+$check defaults to 1.
+
+=item $modtime
+
+Lastly, the I<$modtime> argument specifies
+that C<autosplit> is to check the modification time of the module
+against that of the C<autosplit.ix> file, and only split the module if
+it is newer.
+$modtime defaults to 1.
+
+=back
+
+Typical use of AutoSplit in the perl MakeMaker utility is via the command-line
+with:
+
+ perl -e 'use AutoSplit; autosplit($ARGV[0], $ARGV[1], 0, 1, 1)'
+
+Defined as a Make macro, it is invoked with file and directory arguments;
+C<autosplit> will split the specified file into the specified directory and
+delete obsolete C<.al> files, after checking first that the module does use
+the AutoLoader, and ensuring that the module is not already currently split
+in its current form (the modtime test).
+
+The C<autosplit_lib_modules> form is used in the building of perl. It takes
+as input a list of files (modules) that are assumed to reside in a directory
+B<lib> relative to the current directory. Each file is sent to the 
+autosplitter one at a time, to be split into the directory B<lib/auto>.
+
+In both usages of the autosplitter, only subroutines defined following the
+perl I<__END__> token are split out into separate files. Some
+routines may be placed prior to this marker to force their immediate loading
+and parsing.
+
+=head2 Multiple packages
+
+As of version 1.01 of the AutoSplit module it is possible to have
+multiple packages within a single file. Both of the following cases
+are supported:
+
+   package NAME;
+   __END__
+   sub AAA { ... }
+   package NAME::option1;
+   sub BBB { ... }
+   package NAME::option2;
+   sub BBB { ... }
+
+   package NAME;
+   __END__
+   sub AAA { ... }
+   sub NAME::option1::BBB { ... }
+   sub NAME::option2::BBB { ... }
+
+=head1 DIAGNOSTICS
+
+C<AutoSplit> will inform the user if it is necessary to create the
+top-level directory specified in the invocation. It is preferred that
+the script or installation process that invokes C<AutoSplit> have
+created the full directory path ahead of time. This warning may
+indicate that the module is being split into an incorrect path.
+
+C<AutoSplit> will warn the user of all subroutines whose name causes
+potential file naming conflicts on machines with drastically limited
+(8 characters or less) file name length. Since the subroutine name is
+used as the file name, these warnings can aid in portability to such
+systems.
+
+Warnings are issued and the file skipped if C<AutoSplit> cannot locate
+either the I<__END__> marker or a "package Name;"-style specification.
+
+C<AutoSplit> will also emit general diagnostics for inability to
+create directories or files.
+
+=cut
+
+# for portability warn about names longer than $maxlen
+$Maxlen  = 8;	# 8 for dos, 11 (14-".al") for SYSVR3
+$Verbose = 1;	# 0=none, 1=minimal, 2=list .al files
+$Keep    = 0;
+$CheckForAutoloader = 1;
+$CheckModTime = 1;
+
+my $IndexFile = "autosplit.ix";	# file also serves as timestamp
+my $maxflen = 255;
+$maxflen = 14 if $Config{'d_flexfnam'} ne 'define';
+if (defined (&Dos::UseLFN)) {
+     $maxflen = Dos::UseLFN() ? 255 : 11;
+}
+my $Is_VMS = ($^O eq 'VMS');
+
+# allow checking for valid ': attrlist' attachments
+# (we use 'our' rather than 'my' here, due to the rather complex and buggy
+# behaviour of lexicals with qr// and (??{$lex}) )
+our $nested;
+$nested = qr{ \( (?: (?> [^()]+ ) | (??{ $nested }) )* \) }x;
+our $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) (?:\s*\:\s*|\s+(?!\:)) }x;
+our $attr_list = qr{ \s* : \s* (?: $one_attr )* }x;
+
+
+
+sub autosplit{
+    my($file, $autodir,  $keep, $ckal, $ckmt) = @_;
+    # $file    - the perl source file to be split (after __END__)
+    # $autodir - the ".../auto" dir below which to write split subs
+    # Handle optional flags:
+    $keep = $Keep unless defined $keep;
+    $ckal = $CheckForAutoloader unless defined $ckal;
+    $ckmt = $CheckModTime unless defined $ckmt;
+    autosplit_file($file, $autodir, $keep, $ckal, $ckmt);
+}
+
+
+# This function is used during perl building/installation
+# ./miniperl -e 'use AutoSplit; autosplit_lib_modules(@ARGV)' ...
+
+sub autosplit_lib_modules{
+    my(@modules) = @_; # list of Module names
+
+    while(defined($_ = shift @modules)){
+    	while (m#(.*?[^:])::([^:].*)#) { # in case specified as ABC::XYZ
+	    $_ = catfile($1, $2);
+	}
+	s|\\|/|g;		# bug in ksh OS/2
+	s#^lib/##s; # incase specified as lib/*.pm
+	my($lib) = catfile(curdir(), "lib");
+	if ($Is_VMS) { # may need to convert VMS-style filespecs
+	    $lib =~ s#^\[\]#.\/#;
+	}
+	s#^$lib\W+##s; # incase specified as ./lib/*.pm
+	if ($Is_VMS && /[:>\]]/) { # may need to convert VMS-style filespecs
+	    my ($dir,$name) = (/(.*])(.*)/s);
+	    $dir =~ s/.*lib[\.\]]//s;
+	    $dir =~ s#[\.\]]#/#g;
+	    $_ = $dir . $name;
+	}
+	autosplit_file(catfile($lib, $_), catfile($lib, "auto"),
+		       $Keep, $CheckForAutoloader, $CheckModTime);
+    }
+    0;
+}
+
+
+# private functions
+
+my $self_mod_time = (stat __FILE__)[9];
+
+sub autosplit_file {
+    my($filename, $autodir, $keep, $check_for_autoloader, $check_mod_time)
+	= @_;
+    my(@outfiles);
+    local($_);
+    local($/) = "\n";
+
+    # where to write output files
+    $autodir ||= catfile(curdir(), "lib", "auto");
+    if ($Is_VMS) {
+	($autodir = VMS::Filespec::unixpath($autodir)) =~ s|/\z||;
+	$filename = VMS::Filespec::unixify($filename); # may have dirs
+    }
+    unless (-d $autodir){
+	mkpath($autodir,0,0755);
+	# We should never need to create the auto dir
+	# here. installperl (or similar) should have done
+	# it. Expecting it to exist is a valuable sanity check against
+	# autosplitting into some random directory by mistake.
+	print "Warning: AutoSplit had to create top-level " .
+	    "$autodir unexpectedly.\n";
+    }
+
+    # allow just a package name to be used
+    $filename .= ".pm" unless ($filename =~ m/\.pm\z/);
+
+    open(my $in, "<$filename") or die "AutoSplit: Can't open $filename: $!\n";
+    my($pm_mod_time) = (stat($filename))[9];
+    my($autoloader_seen) = 0;
+    my($in_pod) = 0;
+    my($def_package,$last_package,$this_package,$fnr);
+    while (<$in>) {
+	# Skip pod text.
+	$fnr++;
+	$in_pod = 1 if /^=\w/;
+	$in_pod = 0 if /^=cut/;
+	next if ($in_pod || /^=cut/);
+        next if /^\s*#/;
+
+	# record last package name seen
+	$def_package = $1 if (m/^\s*package\s+([\w:]+)\s*;/);
+	++$autoloader_seen if m/^\s*(use|require)\s+AutoLoader\b/;
+	++$autoloader_seen if m/\bISA\s*=.*\bAutoLoader\b/;
+	last if /^__END__/;
+    }
+    if ($check_for_autoloader && !$autoloader_seen){
+	print "AutoSplit skipped $filename: no AutoLoader used\n"
+	    if ($Verbose>=2);
+	return 0;
+    }
+    $_ or die "Can't find __END__ in $filename\n";
+
+    $def_package or die "Can't find 'package Name;' in $filename\n";
+
+    my($modpname) = _modpname($def_package); 
+
+    # this _has_ to match so we have a reasonable timestamp file
+    die "Package $def_package ($modpname.pm) does not ".
+	"match filename $filename"
+	    unless ($filename =~ m/\Q$modpname.pm\E$/ or
+		    ($^O eq 'dos') or ($^O eq 'MSWin32') or ($^O eq 'NetWare') or
+	            $Is_VMS && $filename =~ m/$modpname.pm/i);
+
+    my($al_idx_file) = catfile($autodir, $modpname, $IndexFile);
+
+    if ($check_mod_time){
+	my($al_ts_time) = (stat("$al_idx_file"))[9] || 1;
+	if ($al_ts_time >= $pm_mod_time and
+	    $al_ts_time >= $self_mod_time){
+	    print "AutoSplit skipped ($al_idx_file newer than $filename)\n"
+		if ($Verbose >= 2);
+	    return undef;	# one undef, not a list
+	}
+    }
+
+    my($modnamedir) = catdir($autodir, $modpname);
+    print "AutoSplitting $filename ($modnamedir)\n"
+	if $Verbose;
+
+    unless (-d $modnamedir){
+	mkpath($modnamedir,0,0777);
+    }
+
+    # We must try to deal with some SVR3 systems with a limit of 14
+    # characters for file names. Sadly we *cannot* simply truncate all
+    # file names to 14 characters on these systems because we *must*
+    # create filenames which exactly match the names used by AutoLoader.pm.
+    # This is a problem because some systems silently truncate the file
+    # names while others treat long file names as an error.
+
+    my $Is83 = $maxflen==11;  # plain, case INSENSITIVE dos filenames
+
+    my(@subnames, $subname, %proto, %package);
+    my @cache = ();
+    my $caching = 1;
+    $last_package = '';
+    my $out;
+    while (<$in>) {
+	$fnr++;
+	$in_pod = 1 if /^=\w/;
+	$in_pod = 0 if /^=cut/;
+	next if ($in_pod || /^=cut/);
+	# the following (tempting) old coding gives big troubles if a
+	# cut is forgotten at EOF:
+	# next if /^=\w/ .. /^=cut/;
+	if (/^package\s+([\w:]+)\s*;/) {
+	    $this_package = $def_package = $1;
+	}
+
+	if (/^sub\s+([\w:]+)(\s*(?:\(.*?\))?(?:$attr_list)?)/) {
+	    print $out "# end of $last_package\::$subname\n1;\n"
+		if $last_package;
+	    $subname = $1;
+	    my $proto = $2 || '';
+	    if ($subname =~ s/(.*):://){
+		$this_package = $1;
+	    } else {
+		$this_package = $def_package;
+	    }
+	    my $fq_subname = "$this_package\::$subname";
+	    $package{$fq_subname} = $this_package;
+	    $proto{$fq_subname} = $proto;
+	    push(@subnames, $fq_subname);
+	    my($lname, $sname) = ($subname, substr($subname,0,$maxflen-3));
+	    $modpname = _modpname($this_package);
+            my($modnamedir) = catdir($autodir, $modpname);
+	    mkpath($modnamedir,0,0777);
+	    my($lpath) = catfile($modnamedir, "$lname.al");
+	    my($spath) = catfile($modnamedir, "$sname.al");
+	    my $path;
+
+	    if (!$Is83 and open($out, ">$lpath")){
+	        $path=$lpath;
+		print "  writing $lpath\n" if ($Verbose>=2);
+	    } else {
+		open($out, ">$spath") or die "Can't create $spath: $!\n";
+		$path=$spath;
+		print "  writing $spath (with truncated name)\n"
+			if ($Verbose>=1);
+	    }
+	    push(@outfiles, $path);
+	    my $lineno = $fnr - @cache;
+	    print $out <<EOT;
+# NOTE: Derived from $filename.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package $this_package;
+
+#line $lineno "$filename (autosplit into $path)"
+EOT
+	    print $out @cache;
+	    @cache = ();
+	    $caching = 0;
+	}
+	if($caching) {
+	    push(@cache, $_) if @cache || /\S/;
+	} else {
+	    print $out $_;
+	}
+	if(/^\}/) {
+	    if($caching) {
+		print $out @cache;
+		@cache = ();
+	    }
+	    print $out "\n";
+	    $caching = 1;
+	}
+	$last_package = $this_package if defined $this_package;
+    }
+    if ($subname) {
+	print $out @cache,"1;\n# end of $last_package\::$subname\n";
+	close($out);
+    }
+    close($in);
+    
+    if (!$keep){  # don't keep any obsolete *.al files in the directory
+	my(%outfiles);
+	# @outfiles{@outfiles} = @outfiles;
+	# perl downcases all filenames on VMS (which upcases all filenames) so
+	# we'd better downcase the sub name list too, or subs with upper case
+	# letters in them will get their .al files deleted right after they're
+	# created. (The mixed case sub name won't match the all-lowercase
+	# filename, and so be cleaned up as a scrap file)
+	if ($Is_VMS or $Is83) {
+	    %outfiles = map {lc($_) => lc($_) } @outfiles;
+	} else {
+	    @outfiles{@outfiles} = @outfiles;
+	}  
+	my(%outdirs,@outdirs);
+	for (@outfiles) {
+	    $outdirs{File::Basename::dirname($_)}||=1;
+	}
+	for my $dir (keys %outdirs) {
+	    opendir(my $outdir,$dir);
+	    foreach (sort readdir($outdir)){
+		next unless /\.al\z/;
+		my($file) = catfile($dir, $_);
+		$file = lc $file if $Is83 or $Is_VMS;
+		next if $outfiles{$file};
+		print "  deleting $file\n" if ($Verbose>=2);
+		my($deleted,$thistime);  # catch all versions on VMS
+		do { $deleted += ($thistime = unlink $file) } while ($thistime);
+		carp "Unable to delete $file: $!" unless $deleted;
+	    }
+	    closedir($outdir);
+	}
+    }
+
+    open(my $ts,">$al_idx_file") or
+	carp "AutoSplit: unable to create timestamp file ($al_idx_file): $!";
+    print $ts "# Index created by AutoSplit for $filename\n";
+    print $ts "#    (file acts as timestamp)\n";
+    $last_package = '';
+    for my $fqs (@subnames) {
+	my($subname) = $fqs;
+	$subname =~ s/.*:://;
+	print $ts "package $package{$fqs};\n"
+	    unless $last_package eq $package{$fqs};
+	print $ts "sub $subname $proto{$fqs};\n";
+	$last_package = $package{$fqs};
+    }
+    print $ts "1;\n";
+    close($ts);
+
+    _check_unique($filename, $Maxlen, 1, @outfiles);
+
+    @outfiles;
+}
+
+sub _modpname ($) {
+    my($package) = @_;
+    my $modpname = $package;
+    if ($^O eq 'MSWin32') {
+	$modpname =~ s#::#\\#g; 
+    } else {
+	my @modpnames = ();
+	while ($modpname =~ m#(.*?[^:])::([^:].*)#) {
+	       push @modpnames, $1;
+	       $modpname = $2;
+         }
+	$modpname = catfile(@modpnames, $modpname);
+    }
+    if ($Is_VMS) {
+        $modpname = VMS::Filespec::unixify($modpname); # may have dirs
+    }
+    $modpname;
+}
+
+sub _check_unique {
+    my($filename, $maxlen, $warn, @outfiles) = @_;
+    my(%notuniq) = ();
+    my(%shorts)  = ();
+    my(@toolong) = grep(
+			length(File::Basename::basename($_))
+			> $maxlen,
+			@outfiles
+		       );
+
+    foreach (@toolong){
+	my($dir) = File::Basename::dirname($_);
+	my($file) = File::Basename::basename($_);
+	my($trunc) = substr($file,0,$maxlen);
+	$notuniq{$dir}{$trunc} = 1 if $shorts{$dir}{$trunc};
+	$shorts{$dir}{$trunc} = $shorts{$dir}{$trunc} ?
+	    "$shorts{$dir}{$trunc}, $file" : $file;
+    }
+    if (%notuniq && $warn){
+	print "$filename: some names are not unique when " .
+	    "truncated to $maxlen characters:\n";
+	foreach my $dir (sort keys %notuniq){
+	    print " directory $dir:\n";
+	    foreach my $trunc (sort keys %{$notuniq{$dir}}) {
+		print "  $shorts{$dir}{$trunc} truncate to $trunc\n";
+	    }
+	}
+    }
+}
+
+1;
+__END__
+
+# test functions so AutoSplit.pm can be applied to itself:
+sub test1 ($)   { "test 1\n"; }
+sub test2 ($$)  { "test 2\n"; }
+sub test3 ($$$) { "test 3\n"; }
+sub testtesttesttest4_1  { "test 4\n"; }
+sub testtesttesttest4_2  { "duplicate test 4\n"; }
+sub Just::Another::test5 { "another test 5\n"; }
+sub test6       { return join ":", __FILE__,__LINE__; }
+package Yet::Another::AutoSplit;
+sub testtesttesttest4_1 ($)  { "another test 4\n"; }
+sub testtesttesttest4_2 ($$) { "another duplicate test 4\n"; }
+package Yet::More::Attributes;
+sub test_a1 ($) : locked :locked { 1; }
+sub test_a2 : locked { 1; }
Index: /for-distributions/trunk/bin/windows/perl/lib/B.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B.pm	(revision 14489)
@@ -0,0 +1,1111 @@
+#      B.pm
+#
+#      Copyright (c) 1996, 1997, 1998 Malcolm Beattie
+#
+#      You may distribute under the terms of either the GNU General Public
+#      License or the Artistic License, as specified in the README file.
+#
+package B;
+
+our $VERSION = '1.09_01';
+
+use XSLoader ();
+require Exporter;
+@ISA = qw(Exporter);
+
+# walkoptree_slow comes from B.pm (you are there),
+# walkoptree comes from B.xs
+@EXPORT_OK = qw(minus_c ppname save_BEGINs
+		class peekop cast_I32 cstring cchar hash threadsv_names
+		main_root main_start main_cv svref_2object opnumber
+		amagic_generation perlstring
+		walkoptree_slow walkoptree walkoptree_exec walksymtable
+		parents comppadlist sv_undef compile_stats timing_info
+		begin_av init_av check_av end_av regex_padav dowarn
+		defstash curstash warnhook diehook inc_gv
+		);
+
+sub OPf_KIDS ();
+use strict;
+@B::SV::ISA = 'B::OBJECT';
+@B::NULL::ISA = 'B::SV';
+@B::PV::ISA = 'B::SV';
+@B::IV::ISA = 'B::SV';
+@B::NV::ISA = 'B::SV';
+@B::RV::ISA = 'B::SV';
+@B::PVIV::ISA = qw(B::PV B::IV);
+@B::PVNV::ISA = qw(B::PVIV B::NV);
+@B::PVMG::ISA = 'B::PVNV';
+# Change in the inheritance hierarchy post 5.9.0
+@B::PVLV::ISA = $] > 5.009 ? 'B::GV' : 'B::PVMG';
+@B::BM::ISA = 'B::PVMG';
+@B::AV::ISA = 'B::PVMG';
+@B::GV::ISA = 'B::PVMG';
+@B::HV::ISA = 'B::PVMG';
+@B::CV::ISA = 'B::PVMG';
+@B::IO::ISA = 'B::PVMG';
+@B::FM::ISA = 'B::CV';
+
+@B::OP::ISA = 'B::OBJECT';
+@B::UNOP::ISA = 'B::OP';
+@B::BINOP::ISA = 'B::UNOP';
+@B::LOGOP::ISA = 'B::UNOP';
+@B::LISTOP::ISA = 'B::BINOP';
+@B::SVOP::ISA = 'B::OP';
+@B::PADOP::ISA = 'B::OP';
+@B::PVOP::ISA = 'B::OP';
+@B::LOOP::ISA = 'B::LISTOP';
+@B::PMOP::ISA = 'B::LISTOP';
+@B::COP::ISA = 'B::OP';
+
+@B::SPECIAL::ISA = 'B::OBJECT';
+
+{
+    # Stop "-w" from complaining about the lack of a real B::OBJECT class
+    package B::OBJECT;
+}
+
+sub B::GV::SAFENAME {
+  my $name = (shift())->NAME;
+
+  # The regex below corresponds to the isCONTROLVAR macro
+  # from toke.c
+
+  $name =~ s/^([\cA-\cZ\c\\c[\c]\c?\c_\c^])/"^".
+	chr( utf8::unicode_to_native( 64 ^ ord($1) ))/e;
+
+  # When we say unicode_to_native we really mean ascii_to_native,
+  # which matters iff this is a non-ASCII platform (EBCDIC).
+
+  return $name;
+}
+
+sub B::IV::int_value {
+  my ($self) = @_;
+  return (($self->FLAGS() & SVf_IVisUV()) ? $self->UVX : $self->IV);
+}
+
+sub B::NULL::as_string() {""}
+sub B::IV::as_string()   {goto &B::IV::int_value}
+sub B::PV::as_string()   {goto &B::PV::PV}
+
+my $debug;
+my $op_count = 0;
+my @parents = ();
+
+sub debug {
+    my ($class, $value) = @_;
+    $debug = $value;
+    walkoptree_debug($value);
+}
+
+sub class {
+    my $obj = shift;
+    my $name = ref $obj;
+    $name =~ s/^.*:://;
+    return $name;
+}
+
+sub parents { \@parents }
+
+# For debugging
+sub peekop {
+    my $op = shift;
+    return sprintf("%s (0x%x) %s", class($op), $$op, $op->name);
+}
+
+sub walkoptree_slow {
+    my($op, $method, $level) = @_;
+    $op_count++; # just for statistics
+    $level ||= 0;
+    warn(sprintf("walkoptree: %d. %s\n", $level, peekop($op))) if $debug;
+    $op->$method($level);
+    if ($$op && ($op->flags & OPf_KIDS)) {
+	my $kid;
+	unshift(@parents, $op);
+	for ($kid = $op->first; $$kid; $kid = $kid->sibling) {
+	    walkoptree_slow($kid, $method, $level + 1);
+	}
+	shift @parents;
+    }
+    if (class($op) eq 'PMOP' && ref($op->pmreplroot) && ${$op->pmreplroot}) {
+	unshift(@parents, $op);
+	walkoptree_slow($op->pmreplroot, $method, $level + 1);
+	shift @parents;
+    }
+}
+
+sub compile_stats {
+    return "Total number of OPs processed: $op_count\n";
+}
+
+sub timing_info {
+    my ($sec, $min, $hr) = localtime;
+    my ($user, $sys) = times;
+    sprintf("%02d:%02d:%02d user=$user sys=$sys",
+	    $hr, $min, $sec, $user, $sys);
+}
+
+my %symtable;
+
+sub clearsym {
+    %symtable = ();
+}
+
+sub savesym {
+    my ($obj, $value) = @_;
+#    warn(sprintf("savesym: sym_%x => %s\n", $$obj, $value)); # debug
+    $symtable{sprintf("sym_%x", $$obj)} = $value;
+}
+
+sub objsym {
+    my $obj = shift;
+    return $symtable{sprintf("sym_%x", $$obj)};
+}
+
+sub walkoptree_exec {
+    my ($op, $method, $level) = @_;
+    $level ||= 0;
+    my ($sym, $ppname);
+    my $prefix = "    " x $level;
+    for (; $$op; $op = $op->next) {
+	$sym = objsym($op);
+	if (defined($sym)) {
+	    print $prefix, "goto $sym\n";
+	    return;
+	}
+	savesym($op, sprintf("%s (0x%lx)", class($op), $$op));
+	$op->$method($level);
+	$ppname = $op->name;
+	if ($ppname =~
+	    /^(d?or(assign)?|and(assign)?|mapwhile|grepwhile|entertry|range|cond_expr)$/)
+	{
+	    print $prefix, uc($1), " => {\n";
+	    walkoptree_exec($op->other, $method, $level + 1);
+	    print $prefix, "}\n";
+	} elsif ($ppname eq "match" || $ppname eq "subst") {
+	    my $pmreplstart = $op->pmreplstart;
+	    if ($$pmreplstart) {
+		print $prefix, "PMREPLSTART => {\n";
+		walkoptree_exec($pmreplstart, $method, $level + 1);
+		print $prefix, "}\n";
+	    }
+	} elsif ($ppname eq "substcont") {
+	    print $prefix, "SUBSTCONT => {\n";
+	    walkoptree_exec($op->other->pmreplstart, $method, $level + 1);
+	    print $prefix, "}\n";
+	    $op = $op->other;
+	} elsif ($ppname eq "enterloop") {
+	    print $prefix, "REDO => {\n";
+	    walkoptree_exec($op->redoop, $method, $level + 1);
+	    print $prefix, "}\n", $prefix, "NEXT => {\n";
+	    walkoptree_exec($op->nextop, $method, $level + 1);
+	    print $prefix, "}\n", $prefix, "LAST => {\n";
+	    walkoptree_exec($op->lastop,  $method, $level + 1);
+	    print $prefix, "}\n";
+	} elsif ($ppname eq "subst") {
+	    my $replstart = $op->pmreplstart;
+	    if ($$replstart) {
+		print $prefix, "SUBST => {\n";
+		walkoptree_exec($replstart, $method, $level + 1);
+		print $prefix, "}\n";
+	    }
+	}
+    }
+}
+
+sub walksymtable {
+    my ($symref, $method, $recurse, $prefix) = @_;
+    my $sym;
+    my $ref;
+    my $fullname;
+    no strict 'refs';
+    $prefix = '' unless defined $prefix;
+    while (($sym, $ref) = each %$symref) {
+        $fullname = "*main::".$prefix.$sym;
+	if ($sym =~ /::$/) {
+	    $sym = $prefix . $sym;
+	    if ($sym ne "main::" && $sym ne "<none>::" && &$recurse($sym)) {
+               walksymtable(\%$fullname, $method, $recurse, $sym);
+	    }
+	} else {
+           svref_2object(\*$fullname)->$method();
+	}
+    }
+}
+
+{
+    package B::Section;
+    my $output_fh;
+    my %sections;
+
+    sub new {
+	my ($class, $section, $symtable, $default) = @_;
+	$output_fh ||= FileHandle->new_tmpfile;
+	my $obj = bless [-1, $section, $symtable, $default], $class;
+	$sections{$section} = $obj;
+	return $obj;
+    }
+
+    sub get {
+	my ($class, $section) = @_;
+	return $sections{$section};
+    }
+
+    sub add {
+	my $section = shift;
+	while (defined($_ = shift)) {
+	    print $output_fh "$section->[1]\t$_\n";
+	    $section->[0]++;
+	}
+    }
+
+    sub index {
+	my $section = shift;
+	return $section->[0];
+    }
+
+    sub name {
+	my $section = shift;
+	return $section->[1];
+    }
+
+    sub symtable {
+	my $section = shift;
+	return $section->[2];
+    }
+
+    sub default {
+	my $section = shift;
+	return $section->[3];
+    }
+
+    sub output {
+	my ($section, $fh, $format) = @_;
+	my $name = $section->name;
+	my $sym = $section->symtable || {};
+	my $default = $section->default;
+
+	seek($output_fh, 0, 0);
+	while (<$output_fh>) {
+	    chomp;
+	    s/^(.*?)\t//;
+	    if ($1 eq $name) {
+		s{(s\\_[0-9a-f]+)} {
+		    exists($sym->{$1}) ? $sym->{$1} : $default;
+		}ge;
+		printf $fh $format, $_;
+	    }
+	}
+    }
+}
+
+XSLoader::load 'B';
+
+1;
+
+__END__
+
+=head1 NAME
+
+B - The Perl Compiler
+
+=head1 SYNOPSIS
+
+	use B;
+
+=head1 DESCRIPTION
+
+The C<B> module supplies classes which allow a Perl program to delve
+into its own innards. It is the module used to implement the
+"backends" of the Perl compiler. Usage of the compiler does not
+require knowledge of this module: see the F<O> module for the
+user-visible part. The C<B> module is of use to those who want to
+write new compiler backends. This documentation assumes that the
+reader knows a fair amount about perl's internals including such
+things as SVs, OPs and the internal symbol table and syntax tree
+of a program.
+
+=head1 OVERVIEW
+
+The C<B> module contains a set of utility functions for querying the
+current state of the Perl interpreter; typically these functions
+return objects from the B::SV and B::OP classes, or their derived
+classes.  These classes in turn define methods for querying the
+resulting objects about their own internal state.
+
+=head1 Utility Functions
+
+The C<B> module exports a variety of functions: some are simple
+utility functions, others provide a Perl program with a way to
+get an initial "handle" on an internal object.
+
+=head2 Functions Returning C<B::SV>, C<B::AV>, C<B::HV>, and C<B::CV> objects
+
+For descriptions of the class hierarchy of these objects and the
+methods that can be called on them, see below, L<"OVERVIEW OF
+CLASSES"> and L<"SV-RELATED CLASSES">.
+
+=over 4
+
+=item sv_undef
+
+Returns the SV object corresponding to the C variable C<sv_undef>.
+
+=item sv_yes
+
+Returns the SV object corresponding to the C variable C<sv_yes>.
+
+=item sv_no
+
+Returns the SV object corresponding to the C variable C<sv_no>.
+
+=item svref_2object(SVREF)
+
+Takes a reference to any Perl value, and turns the referred-to value
+into an object in the appropriate B::OP-derived or B::SV-derived
+class. Apart from functions such as C<main_root>, this is the primary
+way to get an initial "handle" on an internal perl data structure
+which can then be followed with the other access methods.
+
+The returned object will only be valid as long as the underlying OPs
+and SVs continue to exist. Do not attempt to use the object after the
+underlying structures are freed.
+
+=item amagic_generation
+
+Returns the SV object corresponding to the C variable C<amagic_generation>.
+
+=item init_av
+
+Returns the AV object (i.e. in class B::AV) representing INIT blocks.
+
+=item check_av
+
+Returns the AV object (i.e. in class B::AV) representing CHECK blocks.
+
+=item begin_av
+
+Returns the AV object (i.e. in class B::AV) representing BEGIN blocks.
+
+=item end_av
+
+Returns the AV object (i.e. in class B::AV) representing END blocks.
+
+=item comppadlist
+
+Returns the AV object (i.e. in class B::AV) of the global comppadlist.
+
+=item regex_padav
+
+Only when perl was compiled with ithreads.
+
+=item main_cv
+
+Return the (faked) CV corresponding to the main part of the Perl
+program.
+
+=back
+
+=head2 Functions for Examining the Symbol Table
+
+=over 4
+
+=item walksymtable(SYMREF, METHOD, RECURSE, PREFIX)
+
+Walk the symbol table starting at SYMREF and call METHOD on each
+symbol (a B::GV object) visited.  When the walk reaches package
+symbols (such as "Foo::") it invokes RECURSE, passing in the symbol
+name, and only recurses into the package if that sub returns true.
+
+PREFIX is the name of the SYMREF you're walking.
+
+For example:
+
+  # Walk CGI's symbol table calling print_subs on each symbol.
+  # Recurse only into CGI::Util::
+  walksymtable(\%CGI::, 'print_subs', sub { $_[0] eq 'CGI::Util::' },
+               'CGI::');
+
+print_subs() is a B::GV method you have declared. Also see L<"B::GV
+Methods">, below.
+
+=back
+
+=head2 Functions Returning C<B::OP> objects or for walking op trees
+
+For descriptions of the class hierarchy of these objects and the
+methods that can be called on them, see below, L<"OVERVIEW OF
+CLASSES"> and L<"OP-RELATED CLASSES">.
+
+=over 4
+
+=item main_root
+
+Returns the root op (i.e. an object in the appropriate B::OP-derived
+class) of the main part of the Perl program.
+
+=item main_start
+
+Returns the starting op of the main part of the Perl program.
+
+=item walkoptree(OP, METHOD)
+
+Does a tree-walk of the syntax tree based at OP and calls METHOD on
+each op it visits. Each node is visited before its children. If
+C<walkoptree_debug> (see below) has been called to turn debugging on then
+the method C<walkoptree_debug> is called on each op before METHOD is
+called.
+
+=item walkoptree_debug(DEBUG)
+
+Returns the current debugging flag for C<walkoptree>. If the optional
+DEBUG argument is non-zero, it sets the debugging flag to that. See
+the description of C<walkoptree> above for what the debugging flag
+does.
+
+=back
+
+=head2 Miscellaneous Utility Functions
+
+=over 4
+
+=item ppname(OPNUM)
+
+Return the PP function name (e.g. "pp_add") of op number OPNUM.
+
+=item hash(STR)
+
+Returns a string in the form "0x..." representing the value of the
+internal hash function used by perl on string STR.
+
+=item cast_I32(I)
+
+Casts I to the internal I32 type used by that perl.
+
+=item minus_c
+
+Does the equivalent of the C<-c> command-line option. Obviously, this
+is only useful in a BEGIN block or else the flag is set too late.
+
+=item cstring(STR)
+
+Returns a double-quote-surrounded escaped version of STR which can
+be used as a string in C source code.
+
+=item perlstring(STR)
+
+Returns a double-quote-surrounded escaped version of STR which can
+be used as a string in Perl source code.
+
+=item class(OBJ)
+
+Returns the class of an object without the part of the classname
+preceding the first C<"::">. This is used to turn C<"B::UNOP"> into
+C<"UNOP"> for example.
+
+=item threadsv_names
+
+In a perl compiled for threads, this returns a list of the special
+per-thread threadsv variables.
+
+=back
+
+
+
+
+=head1 OVERVIEW OF CLASSES
+
+The C structures used by Perl's internals to hold SV and OP
+information (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) are modelled on a
+class hierarchy and the C<B> module gives access to them via a true
+object hierarchy. Structure fields which point to other objects
+(whether types of SV or types of OP) are represented by the C<B>
+module as Perl objects of the appropriate class.
+
+The bulk of the C<B> module is the methods for accessing fields of
+these structures.
+
+Note that all access is read-only.  You cannot modify the internals by
+using this module. Also, note that the B::OP and B::SV objects created
+by this module are only valid for as long as the underlying objects
+exist; their creation doesn't increase the reference counts of the
+underlying objects. Trying to access the fields of a freed object will
+give incomprehensible results, or worse.
+
+=head2 SV-RELATED CLASSES
+
+B::IV, B::NV, B::RV, B::PV, B::PVIV, B::PVNV, B::PVMG, B::BM, B::PVLV,
+B::AV, B::HV, B::CV, B::GV, B::FM, B::IO. These classes correspond in
+the obvious way to the underlying C structures of similar names. The
+inheritance hierarchy mimics the underlying C "inheritance". For 5.9.1
+and later this is:
+
+                             B::SV
+                               |
+                +--------------+----------+------------+
+                |              |          |            |
+              B::PV          B::IV      B::NV        B::RV
+                   \         /          /
+                    \       /          /
+                     B::PVIV          /
+                         \           /
+                          \         /
+                           \       /
+                            B::PVNV
+                               |
+                               |
+                            B::PVMG
+                               |
+                    +-----+----+------+-----+-----+
+                    |     |    |      |     |     |
+                  B::BM B::AV B::GV B::HV B::CV B::IO
+                               |            |
+                            B::PVLV         |
+                                          B::FM
+
+
+For 5.9.0 and earlier, PVLV is a direct subclass of PVMG, so the base
+of this diagram is
+
+                           |
+                        B::PVMG
+                           |
+         +------+-----+----+------+-----+-----+
+         |      |     |    |      |     |     |
+      B::PVLV B::BM B::AV B::GV B::HV B::CV B::IO
+                                        |
+                                        |
+                                      B::FM
+
+
+Access methods correspond to the underlying C macros for field access,
+usually with the leading "class indication" prefix removed (Sv, Av,
+Hv, ...). The leading prefix is only left in cases where its removal
+would cause a clash in method name. For example, C<GvREFCNT> stays
+as-is since its abbreviation would clash with the "superclass" method
+C<REFCNT> (corresponding to the C function C<SvREFCNT>).
+
+=head2 B::SV Methods
+
+=over 4
+
+=item REFCNT
+
+=item FLAGS
+
+=item object_2svref
+
+Returns a reference to the regular scalar corresponding to this
+B::SV object. In other words, this method is the inverse operation
+to the svref_2object() subroutine. This scalar and other data it points
+at should be considered read-only: modifying them is neither safe nor
+guaranteed to have a sensible effect.
+
+=back
+
+=head2 B::IV Methods
+
+=over 4
+
+=item IV
+
+Returns the value of the IV, I<interpreted as
+a signed integer>. This will be misleading
+if C<FLAGS & SVf_IVisUV>. Perhaps you want the
+C<int_value> method instead?
+
+=item IVX
+
+=item UVX
+
+=item int_value
+
+This method returns the value of the IV as an integer.
+It differs from C<IV> in that it returns the correct
+value regardless of whether it's stored signed or
+unsigned.
+
+=item needs64bits
+
+=item packiv
+
+=back
+
+=head2 B::NV Methods
+
+=over 4
+
+=item NV
+
+=item NVX
+
+=back
+
+=head2 B::RV Methods
+
+=over 4
+
+=item RV
+
+=back
+
+=head2 B::PV Methods
+
+=over 4
+
+=item PV
+
+This method is the one you usually want. It constructs a
+string using the length and offset information in the struct:
+for ordinary scalars it will return the string that you'd see
+from Perl, even if it contains null characters.
+
+=item RV
+
+Same as B::RV::RV, except that it will die() if the PV isn't
+a reference.
+
+=item PVX
+
+This method is less often useful. It assumes that the string
+stored in the struct is null-terminated, and disregards the
+length information.
+
+It is the appropriate method to use if you need to get the name
+of a lexical variable from a padname array. Lexical variable names
+are always stored with a null terminator, and the length field
+(SvCUR) is overloaded for other purposes and can't be relied on here.
+
+=back
+
+=head2 B::PVMG Methods
+
+=over 4
+
+=item MAGIC
+
+=item SvSTASH
+
+=back
+
+=head2 B::MAGIC Methods
+
+=over 4
+
+=item MOREMAGIC
+
+=item precomp
+
+Only valid on r-magic, returns the string that generated the regexp.
+
+=item PRIVATE
+
+=item TYPE
+
+=item FLAGS
+
+=item OBJ
+
+Will die() if called on r-magic.
+
+=item PTR
+
+=item REGEX
+
+Only valid on r-magic, returns the integer value of the REGEX stored
+in the MAGIC.
+
+=back
+
+=head2 B::PVLV Methods
+
+=over 4
+
+=item TARGOFF
+
+=item TARGLEN
+
+=item TYPE
+
+=item TARG
+
+=back
+
+=head2 B::BM Methods
+
+=over 4
+
+=item USEFUL
+
+=item PREVIOUS
+
+=item RARE
+
+=item TABLE
+
+=back
+
+=head2 B::GV Methods
+
+=over 4
+
+=item is_empty
+
+This method returns TRUE if the GP field of the GV is NULL.
+
+=item NAME
+
+=item SAFENAME
+
+This method returns the name of the glob, but if the first
+character of the name is a control character, then it converts
+it to ^X first, so that *^G would return "^G" rather than "\cG".
+
+It's useful if you want to print out the name of a variable.
+If you restrict yourself to globs which exist at compile-time
+then the result ought to be unambiguous, because code like
+C<${"^G"} = 1> is compiled as two ops - a constant string and
+a dereference (rv2gv) - so that the glob is created at runtime.
+
+If you're working with globs at runtime, and need to disambiguate
+*^G from *{"^G"}, then you should use the raw NAME method.
+
+=item STASH
+
+=item SV
+
+=item IO
+
+=item FORM
+
+=item AV
+
+=item HV
+
+=item EGV
+
+=item CV
+
+=item CVGEN
+
+=item LINE
+
+=item FILE
+
+=item FILEGV
+
+=item GvREFCNT
+
+=item FLAGS
+
+=back
+
+=head2 B::IO Methods
+
+=over 4
+
+=item LINES
+
+=item PAGE
+
+=item PAGE_LEN
+
+=item LINES_LEFT
+
+=item TOP_NAME
+
+=item TOP_GV
+
+=item FMT_NAME
+
+=item FMT_GV
+
+=item BOTTOM_NAME
+
+=item BOTTOM_GV
+
+=item SUBPROCESS
+
+=item IoTYPE
+
+=item IoFLAGS
+
+=item IsSTD
+
+Takes one arguments ( 'stdin' | 'stdout' | 'stderr' ) and returns true
+if the IoIFP of the object is equal to the handle whose name was
+passed as argument ( i.e. $io->IsSTD('stderr') is true if
+IoIFP($io) == PerlIO_stdin() ).
+
+=back
+
+=head2 B::AV Methods
+
+=over 4
+
+=item FILL
+
+=item MAX
+
+=item OFF
+
+=item ARRAY
+
+=item ARRAYelt
+
+Like C<ARRAY>, but takes an index as an argument to get only one element,
+rather than a list of all of them.
+
+=item AvFLAGS
+
+=back
+
+=head2 B::CV Methods
+
+=over 4
+
+=item STASH
+
+=item START
+
+=item ROOT
+
+=item GV
+
+=item FILE
+
+=item DEPTH
+
+=item PADLIST
+
+=item OUTSIDE
+
+=item OUTSIDE_SEQ
+
+=item XSUB
+
+=item XSUBANY
+
+For constant subroutines, returns the constant SV returned by the subroutine.
+
+=item CvFLAGS
+
+=item const_sv
+
+=back
+
+=head2 B::HV Methods
+
+=over 4
+
+=item FILL
+
+=item MAX
+
+=item KEYS
+
+=item RITER
+
+=item NAME
+
+=item PMROOT
+
+=item ARRAY
+
+=back
+
+=head2 OP-RELATED CLASSES
+
+C<B::OP>, C<B::UNOP>, C<B::BINOP>, C<B::LOGOP>, C<B::LISTOP>, C<B::PMOP>,
+C<B::SVOP>, C<B::PADOP>, C<B::PVOP>, C<B::LOOP>, C<B::COP>.
+
+These classes correspond in the obvious way to the underlying C
+structures of similar names. The inheritance hierarchy mimics the
+underlying C "inheritance":
+
+                                 B::OP
+                                   |
+                   +---------------+--------+--------+
+                   |               |        |        |
+                B::UNOP          B::SVOP B::PADOP  B::COP
+                 ,'  `-.
+                /       `--.
+           B::BINOP     B::LOGOP
+               |
+               |
+           B::LISTOP
+             ,' `.
+            /     \
+        B::LOOP B::PMOP
+
+Access methods correspond to the underlying C structre field names,
+with the leading "class indication" prefix (C<"op_">) removed.
+
+=head2 B::OP Methods
+
+These methods get the values of similarly named fields within the OP
+data structure.  See top of C<op.h> for more info.
+
+=over 4
+
+=item next
+
+=item sibling
+
+=item name
+
+This returns the op name as a string (e.g. "add", "rv2av").
+
+=item ppaddr
+
+This returns the function name as a string (e.g. "PL_ppaddr[OP_ADD]",
+"PL_ppaddr[OP_RV2AV]").
+
+=item desc
+
+This returns the op description from the global C PL_op_desc array
+(e.g. "addition" "array deref").
+
+=item targ
+
+=item type
+
+=item opt
+
+=item static
+
+=item flags
+
+=item private
+
+=item spare
+
+=back
+
+=head2 B::UNOP METHOD
+
+=over 4
+
+=item first
+
+=back
+
+=head2 B::BINOP METHOD
+
+=over 4
+
+=item last
+
+=back
+
+=head2 B::LOGOP METHOD
+
+=over 4
+
+=item other
+
+=back
+
+=head2 B::LISTOP METHOD
+
+=over 4
+
+=item children
+
+=back
+
+=head2 B::PMOP Methods
+
+=over 4
+
+=item pmreplroot
+
+=item pmreplstart
+
+=item pmnext
+
+=item pmregexp
+
+=item pmflags
+
+=item pmdynflags
+
+=item pmpermflags
+
+=item precomp
+
+=item pmoffset
+
+Only when perl was compiled with ithreads.
+
+=back
+
+=head2 B::SVOP METHOD
+
+=over 4
+
+=item sv
+
+=item gv
+
+=back
+
+=head2 B::PADOP METHOD
+
+=over 4
+
+=item padix
+
+=back
+
+=head2 B::PVOP METHOD
+
+=over 4
+
+=item pv
+
+=back
+
+=head2 B::LOOP Methods
+
+=over 4
+
+=item redoop
+
+=item nextop
+
+=item lastop
+
+=back
+
+=head2 B::COP Methods
+
+=over 4
+
+=item label
+
+=item stash
+
+=item stashpv
+
+=item file
+
+=item cop_seq
+
+=item arybase
+
+=item line
+
+=item warnings
+
+=item io
+
+=back
+
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Asmdata.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Asmdata.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Asmdata.pm	(revision 14489)
@@ -0,0 +1,250 @@
+# -#- buffer-read-only: t -#-
+#
+#      Copyright (c) 1996-1999 Malcolm Beattie
+#
+#      You may distribute under the terms of either the GNU General Public
+#      License or the Artistic License, as specified in the README file.
+#
+#
+#
+# This file is autogenerated from bytecode.pl. Changes made here will be lost.
+#
+package B::Asmdata;
+
+our $VERSION = '1.01';
+
+use Exporter;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(%insn_data @insn_name @optype @specialsv_name);
+our(%insn_data, @insn_name, @optype, @specialsv_name);
+
+@optype = qw(OP UNOP BINOP LOGOP LISTOP PMOP SVOP PADOP PVOP LOOP COP);
+@specialsv_name = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no pWARN_ALL pWARN_NONE);
+
+# XXX insn_data is initialised this way because with a large
+# %insn_data = (foo => [...], bar => [...], ...) initialiser
+# I get a hard-to-track-down stack underflow and segfault.
+$insn_data{comment} = [35, \&PUT_comment_t, "GET_comment_t"];
+$insn_data{nop} = [10, \&PUT_none, "GET_none"];
+$insn_data{ret} = [0, \&PUT_none, "GET_none"];
+$insn_data{ldsv} = [1, \&PUT_svindex, "GET_svindex"];
+$insn_data{ldop} = [2, \&PUT_opindex, "GET_opindex"];
+$insn_data{stsv} = [3, \&PUT_U32, "GET_U32"];
+$insn_data{stop} = [4, \&PUT_U32, "GET_U32"];
+$insn_data{stpv} = [5, \&PUT_U32, "GET_U32"];
+$insn_data{ldspecsv} = [6, \&PUT_U8, "GET_U8"];
+$insn_data{ldspecsvx} = [7, \&PUT_U8, "GET_U8"];
+$insn_data{newsv} = [8, \&PUT_U8, "GET_U8"];
+$insn_data{newsvx} = [9, \&PUT_U32, "GET_U32"];
+$insn_data{newop} = [11, \&PUT_U8, "GET_U8"];
+$insn_data{newopx} = [12, \&PUT_U16, "GET_U16"];
+$insn_data{newopn} = [13, \&PUT_U8, "GET_U8"];
+$insn_data{newpv} = [14, \&PUT_PV, "GET_PV"];
+$insn_data{pv_cur} = [15, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{pv_free} = [16, \&PUT_none, "GET_none"];
+$insn_data{sv_upgrade} = [17, \&PUT_U8, "GET_U8"];
+$insn_data{sv_refcnt} = [18, \&PUT_U32, "GET_U32"];
+$insn_data{sv_refcnt_add} = [19, \&PUT_I32, "GET_I32"];
+$insn_data{sv_flags} = [20, \&PUT_U32, "GET_U32"];
+$insn_data{xrv} = [21, \&PUT_svindex, "GET_svindex"];
+$insn_data{xpv} = [22, \&PUT_none, "GET_none"];
+$insn_data{xpv_cur} = [23, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{xpv_len} = [24, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{xiv} = [25, \&PUT_IV, "GET_IV"];
+$insn_data{xnv} = [26, \&PUT_NV, "GET_NV"];
+$insn_data{xlv_targoff} = [27, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{xlv_targlen} = [28, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{xlv_targ} = [29, \&PUT_svindex, "GET_svindex"];
+$insn_data{xlv_type} = [30, \&PUT_U8, "GET_U8"];
+$insn_data{xbm_useful} = [31, \&PUT_I32, "GET_I32"];
+$insn_data{xbm_previous} = [32, \&PUT_U16, "GET_U16"];
+$insn_data{xbm_rare} = [33, \&PUT_U8, "GET_U8"];
+$insn_data{xfm_lines} = [34, \&PUT_IV, "GET_IV"];
+$insn_data{xio_lines} = [36, \&PUT_IV, "GET_IV"];
+$insn_data{xio_page} = [37, \&PUT_IV, "GET_IV"];
+$insn_data{xio_page_len} = [38, \&PUT_IV, "GET_IV"];
+$insn_data{xio_lines_left} = [39, \&PUT_IV, "GET_IV"];
+$insn_data{xio_top_name} = [40, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{xio_top_gv} = [41, \&PUT_svindex, "GET_svindex"];
+$insn_data{xio_fmt_name} = [42, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{xio_fmt_gv} = [43, \&PUT_svindex, "GET_svindex"];
+$insn_data{xio_bottom_name} = [44, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{xio_bottom_gv} = [45, \&PUT_svindex, "GET_svindex"];
+$insn_data{xio_subprocess} = [46, \&PUT_U16, "GET_U16"];
+$insn_data{xio_type} = [47, \&PUT_U8, "GET_U8"];
+$insn_data{xio_flags} = [48, \&PUT_U8, "GET_U8"];
+$insn_data{xcv_xsubany} = [49, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_stash} = [50, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_start} = [51, \&PUT_opindex, "GET_opindex"];
+$insn_data{xcv_root} = [52, \&PUT_opindex, "GET_opindex"];
+$insn_data{xcv_gv} = [53, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_file} = [54, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{xcv_depth} = [55, \&PUT_long, "GET_long"];
+$insn_data{xcv_padlist} = [56, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_outside} = [57, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_outside_seq} = [58, \&PUT_U32, "GET_U32"];
+$insn_data{xcv_flags} = [59, \&PUT_U16, "GET_U16"];
+$insn_data{av_extend} = [60, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{av_pushx} = [61, \&PUT_svindex, "GET_svindex"];
+$insn_data{av_push} = [62, \&PUT_svindex, "GET_svindex"];
+$insn_data{xav_fill} = [63, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{xav_max} = [64, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{xav_flags} = [65, \&PUT_U8, "GET_U8"];
+$insn_data{xhv_riter} = [66, \&PUT_I32, "GET_I32"];
+$insn_data{xhv_name} = [67, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{xhv_pmroot} = [68, \&PUT_opindex, "GET_opindex"];
+$insn_data{hv_store} = [69, \&PUT_svindex, "GET_svindex"];
+$insn_data{sv_magic} = [70, \&PUT_U8, "GET_U8"];
+$insn_data{mg_obj} = [71, \&PUT_svindex, "GET_svindex"];
+$insn_data{mg_private} = [72, \&PUT_U16, "GET_U16"];
+$insn_data{mg_flags} = [73, \&PUT_U8, "GET_U8"];
+$insn_data{mg_name} = [74, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{mg_namex} = [75, \&PUT_svindex, "GET_svindex"];
+$insn_data{xmg_stash} = [76, \&PUT_svindex, "GET_svindex"];
+$insn_data{gv_fetchpv} = [77, \&PUT_strconst, "GET_strconst"];
+$insn_data{gv_fetchpvx} = [78, \&PUT_strconst, "GET_strconst"];
+$insn_data{gv_stashpv} = [79, \&PUT_strconst, "GET_strconst"];
+$insn_data{gv_stashpvx} = [80, \&PUT_strconst, "GET_strconst"];
+$insn_data{gp_sv} = [81, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_refcnt} = [82, \&PUT_U32, "GET_U32"];
+$insn_data{gp_refcnt_add} = [83, \&PUT_I32, "GET_I32"];
+$insn_data{gp_av} = [84, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_hv} = [85, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_cv} = [86, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_file} = [87, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{gp_io} = [88, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_form} = [89, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_cvgen} = [90, \&PUT_U32, "GET_U32"];
+$insn_data{gp_line} = [91, \&PUT_U32, "GET_U32"];
+$insn_data{gp_share} = [92, \&PUT_svindex, "GET_svindex"];
+$insn_data{xgv_flags} = [93, \&PUT_U8, "GET_U8"];
+$insn_data{op_next} = [94, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_sibling} = [95, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_ppaddr} = [96, \&PUT_strconst, "GET_strconst"];
+$insn_data{op_targ} = [97, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{op_type} = [98, \&PUT_U16, "GET_U16"];
+$insn_data{op_seq} = [99, \&PUT_U16, "GET_U16"];
+$insn_data{op_flags} = [100, \&PUT_U8, "GET_U8"];
+$insn_data{op_private} = [101, \&PUT_U8, "GET_U8"];
+$insn_data{op_first} = [102, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_last} = [103, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_other} = [104, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_pmreplroot} = [105, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_pmreplstart} = [106, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_pmnext} = [107, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_pmstashpv} = [108, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{op_pmreplrootpo} = [109, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{op_pmstash} = [110, \&PUT_svindex, "GET_svindex"];
+$insn_data{op_pmreplrootgv} = [111, \&PUT_svindex, "GET_svindex"];
+$insn_data{pregcomp} = [112, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{op_pmflags} = [113, \&PUT_U16, "GET_U16"];
+$insn_data{op_pmpermflags} = [114, \&PUT_U16, "GET_U16"];
+$insn_data{op_pmdynflags} = [115, \&PUT_U8, "GET_U8"];
+$insn_data{op_sv} = [116, \&PUT_svindex, "GET_svindex"];
+$insn_data{op_padix} = [117, \&PUT_PADOFFSET, "GET_PADOFFSET"];
+$insn_data{op_pv} = [118, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{op_pv_tr} = [119, \&PUT_op_tr_array, "GET_op_tr_array"];
+$insn_data{op_redoop} = [120, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_nextop} = [121, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_lastop} = [122, \&PUT_opindex, "GET_opindex"];
+$insn_data{cop_label} = [123, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{cop_stashpv} = [124, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{cop_file} = [125, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{cop_stash} = [126, \&PUT_svindex, "GET_svindex"];
+$insn_data{cop_filegv} = [127, \&PUT_svindex, "GET_svindex"];
+$insn_data{cop_seq} = [128, \&PUT_U32, "GET_U32"];
+$insn_data{cop_arybase} = [129, \&PUT_I32, "GET_I32"];
+$insn_data{cop_line} = [130, \&PUT_U32, "GET_U32"];
+$insn_data{cop_io} = [131, \&PUT_svindex, "GET_svindex"];
+$insn_data{cop_warnings} = [132, \&PUT_svindex, "GET_svindex"];
+$insn_data{main_start} = [133, \&PUT_opindex, "GET_opindex"];
+$insn_data{main_root} = [134, \&PUT_opindex, "GET_opindex"];
+$insn_data{main_cv} = [135, \&PUT_svindex, "GET_svindex"];
+$insn_data{curpad} = [136, \&PUT_svindex, "GET_svindex"];
+$insn_data{push_begin} = [137, \&PUT_svindex, "GET_svindex"];
+$insn_data{push_init} = [138, \&PUT_svindex, "GET_svindex"];
+$insn_data{push_end} = [139, \&PUT_svindex, "GET_svindex"];
+$insn_data{curstash} = [140, \&PUT_svindex, "GET_svindex"];
+$insn_data{defstash} = [141, \&PUT_svindex, "GET_svindex"];
+$insn_data{data} = [142, \&PUT_U8, "GET_U8"];
+$insn_data{incav} = [143, \&PUT_svindex, "GET_svindex"];
+$insn_data{load_glob} = [144, \&PUT_svindex, "GET_svindex"];
+$insn_data{regex_padav} = [145, \&PUT_svindex, "GET_svindex"];
+$insn_data{dowarn} = [146, \&PUT_U8, "GET_U8"];
+$insn_data{comppad_name} = [147, \&PUT_svindex, "GET_svindex"];
+$insn_data{xgv_stash} = [148, \&PUT_svindex, "GET_svindex"];
+$insn_data{signal} = [149, \&PUT_strconst, "GET_strconst"];
+$insn_data{formfeed} = [150, \&PUT_svindex, "GET_svindex"];
+
+my ($insn_name, $insn_data);
+while (($insn_name, $insn_data) = each %insn_data) {
+    $insn_name[$insn_data->[0]] = $insn_name;
+}
+# Fill in any gaps
+@insn_name = map($_ || "unused", @insn_name);
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Asmdata - Autogenerated data about Perl ops, used to generate bytecode
+
+=head1 SYNOPSIS
+
+	use B::Asmdata qw(%insn_data @insn_name @optype @specialsv_name);
+
+=head1 DESCRIPTION
+
+Provides information about Perl ops in order to generate bytecode via
+a bunch of exported variables.  Its mostly used by B::Assembler and
+B::Disassembler.
+
+=over 4
+
+=item %insn_data
+
+  my($bytecode_num, $put_sub, $get_meth) = @$insn_data{$op_name};
+
+For a given $op_name (for example, 'cop_label', 'sv_flags', etc...) 
+you get an array ref containing the bytecode number of the op, a
+reference to the subroutine used to 'PUT', and the name of the method
+used to 'GET'.
+
+=for _private
+Add more detail about what $put_sub and $get_meth are and how to use them.
+
+=item @insn_name
+
+  my $op_name = $insn_name[$bytecode_num];
+
+A simple mapping of the bytecode number to the name of the op.
+Suitable for using with %insn_data like so:
+
+  my $op_info = $insn_data{$insn_name[$bytecode_num]};
+
+=item @optype
+
+  my $op_type = $optype[$op_type_num];
+
+A simple mapping of the op type number to its type (like 'COP' or 'BINOP').
+
+=item @specialsv_name
+
+  my $sv_name = $specialsv_name[$sv_index];
+
+Certain SV types are considered 'special'.  They're represented by
+B::SPECIAL and are referred to by a number from the specialsv_list.
+This array maps that number back to the name of the SV (like 'Nullsv'
+or '&PL_sv_undef').
+
+=back
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
+
+# ex: set ro:
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Assembler.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Assembler.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Assembler.pm	(revision 14489)
@@ -0,0 +1,328 @@
+#      Assembler.pm
+#
+#      Copyright (c) 1996 Malcolm Beattie
+#
+#      You may distribute under the terms of either the GNU General Public
+#      License or the Artistic License, as specified in the README file.
+
+package B::Assembler;
+use Exporter;
+use B qw(ppname);
+use B::Asmdata qw(%insn_data @insn_name);
+use Config qw(%Config);
+require ByteLoader;		# we just need its $VERSION
+
+no warnings;			# XXX
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(assemble_fh newasm endasm assemble asm);
+$VERSION = 0.07;
+
+use strict;
+my %opnumber;
+my ($i, $opname);
+for ($i = 0; defined($opname = ppname($i)); $i++) {
+    $opnumber{$opname} = $i;
+}
+
+my($linenum, $errors, $out); #	global state, set up by newasm
+
+sub error {
+    my $str = shift;
+    warn "$linenum: $str\n";
+    $errors++;
+}
+
+my $debug = 0;
+sub debug { $debug = shift }
+
+sub limcheck($$$$){
+    my( $val, $lo, $hi, $loc ) = @_;
+    if( $val < $lo || $hi < $val ){
+        error "argument for $loc outside [$lo, $hi]: $val";
+        $val = $hi;
+    }
+    return $val;
+}
+
+#
+# First define all the data conversion subs to which Asmdata will refer
+#
+
+sub B::Asmdata::PUT_U8 {
+    my $arg = shift;
+    my $c = uncstring($arg);
+    if (defined($c)) {
+	if (length($c) != 1) {
+	    error "argument for U8 is too long: $c";
+	    $c = substr($c, 0, 1);
+	}
+    } else {
+        $arg = limcheck( $arg, 0, 0xff, 'U8' );
+	$c = chr($arg);
+    }
+    return $c;
+}
+
+sub B::Asmdata::PUT_U16 {
+    my $arg = limcheck( $_[0], 0, 0xffff, 'U16' );
+    pack("S", $arg);
+}
+sub B::Asmdata::PUT_U32 {
+    my $arg = limcheck( $_[0], 0, 0xffffffff, 'U32' );
+    pack("L", $arg);
+}
+sub B::Asmdata::PUT_I32 {
+    my $arg = limcheck( $_[0], -0x80000000, 0x7fffffff, 'I32' );
+    pack("l", $arg);
+}
+sub B::Asmdata::PUT_NV  { sprintf("%s\0", $_[0]) } # "%lf" looses precision and pack('d',...)
+						   # may not even be portable between compilers
+sub B::Asmdata::PUT_objindex { # could allow names here
+    my $arg = limcheck( $_[0], 0, 0xffffffff, '*index' );
+    pack("L", $arg);
+} 
+sub B::Asmdata::PUT_svindex { &B::Asmdata::PUT_objindex }
+sub B::Asmdata::PUT_opindex { &B::Asmdata::PUT_objindex }
+sub B::Asmdata::PUT_pvindex { &B::Asmdata::PUT_objindex }
+
+sub B::Asmdata::PUT_strconst {
+    my $arg = shift;
+    my $str = uncstring($arg);
+    if (!defined($str)) {
+	error "bad string constant: $arg";
+	$str = '';
+    }
+    if ($str =~ s/\0//g) {
+	error "string constant argument contains NUL: $arg";
+        $str = '';
+    }
+    return $str . "\0";
+}
+
+sub B::Asmdata::PUT_pvcontents {
+    my $arg = shift;
+    error "extraneous argument: $arg" if defined $arg;
+    return "";
+}
+sub B::Asmdata::PUT_PV {
+    my $arg = shift;
+    my $str = uncstring($arg);
+    if( ! defined($str) ){
+        error "bad string argument: $arg";
+        $str = '';
+    }
+    return pack("L", length($str)) . $str;
+}
+sub B::Asmdata::PUT_comment_t {
+    my $arg = shift;
+    $arg = uncstring($arg);
+    error "bad string argument: $arg" unless defined($arg);
+    if ($arg =~ s/\n//g) {
+	error "comment argument contains linefeed: $arg";
+    }
+    return $arg . "\n";
+}
+sub B::Asmdata::PUT_double { sprintf("%s\0", $_[0]) } # see PUT_NV above
+sub B::Asmdata::PUT_none {
+    my $arg = shift;
+    error "extraneous argument: $arg" if defined $arg;
+    return "";
+}
+sub B::Asmdata::PUT_op_tr_array {
+    my @ary = split /\s*,\s*/, shift;
+    return pack "S*", @ary;
+}
+
+sub B::Asmdata::PUT_IV64 {
+    return pack "Q", shift;
+}
+
+sub B::Asmdata::PUT_IV {
+    $Config{ivsize} == 4 ? &B::Asmdata::PUT_I32 : &B::Asmdata::PUT_IV64;
+}
+
+sub B::Asmdata::PUT_PADOFFSET {
+    $Config{ptrsize} == 8 ? &B::Asmdata::PUT_IV64 : &B::Asmdata::PUT_U32;
+}
+
+sub B::Asmdata::PUT_long {
+    $Config{longsize} == 8 ? &B::Asmdata::PUT_IV64 : &B::Asmdata::PUT_U32;
+}
+
+my %unesc = (n => "\n", r => "\r", t => "\t", a => "\a",
+	     b => "\b", f => "\f", v => "\013");
+
+sub uncstring {
+    my $s = shift;
+    $s =~ s/^"// and $s =~ s/"$// or return undef;
+    $s =~ s/\\(\d\d\d|.)/length($1) == 3 ? chr(oct($1)) : ($unesc{$1}||$1)/eg;
+    return $s;
+}
+
+sub strip_comments {
+    my $stmt = shift;
+    # Comments only allowed in instructions which don't take string arguments
+    # Treat string as a single line so .* eats \n characters.
+    $stmt =~ s{
+	^\s*	# Ignore leading whitespace
+	(
+	  [^"]*	# A double quote '"' indicates a string argument. If we
+		# find a double quote, the match fails and we strip nothing.
+	)
+	\s*\#	# Any amount of whitespace plus the comment marker...
+	.*$	# ...which carries on to end-of-string.
+    }{$1}sx;	# Keep only the instruction and optional argument.
+    return $stmt;
+}
+
+# create the ByteCode header: magic, archname, ByteLoader $VERSION, ivsize,
+# 	ptrsize, byteorder
+# nvtype is irrelevant (floats are stored as strings)
+# byteorder is strconst not U32 because of varying size issues
+
+sub gen_header {
+    my $header = "";
+
+    $header .= B::Asmdata::PUT_U32(0x43424c50);	# 'PLBC'
+    $header .= B::Asmdata::PUT_strconst('"' . $Config{archname}. '"');
+    $header .= B::Asmdata::PUT_strconst(qq["$ByteLoader::VERSION"]);
+    $header .= B::Asmdata::PUT_U32($Config{ivsize});
+    $header .= B::Asmdata::PUT_U32($Config{ptrsize});
+    $header;
+}
+
+sub parse_statement {
+    my $stmt = shift;
+    my ($insn, $arg) = $stmt =~ m{
+	^\s*	# allow (but ignore) leading whitespace
+	(.*?)	# Instruction continues up until...
+	(?:	# ...an optional whitespace+argument group
+	    \s+		# first whitespace.
+	    (.*)	# The argument is all the rest (newlines included).
+	)?$	# anchor at end-of-line
+    }sx;
+    if (defined($arg)) {
+	if ($arg =~ s/^0x(?=[0-9a-fA-F]+$)//) {
+	    $arg = hex($arg);
+	} elsif ($arg =~ s/^0(?=[0-7]+$)//) {
+	    $arg = oct($arg);
+	} elsif ($arg =~ /^pp_/) {
+	    $arg =~ s/\s*$//; # strip trailing whitespace
+	    my $opnum = $opnumber{$arg};
+	    if (defined($opnum)) {
+		$arg = $opnum;
+	    } else {
+		error qq(No such op type "$arg");
+		$arg = 0;
+	    }
+	}
+    }
+    return ($insn, $arg);
+}
+
+sub assemble_insn {
+    my ($insn, $arg) = @_;
+    my $data = $insn_data{$insn};
+    if (defined($data)) {
+	my ($bytecode, $putsub) = @{$data}[0, 1];
+	my $argcode = &$putsub($arg);
+	return chr($bytecode).$argcode;
+    } else {
+	error qq(no such instruction "$insn");
+	return "";
+    }
+}
+
+sub assemble_fh {
+    my ($fh, $out) = @_;
+    my $line;
+    my $asm = newasm($out);
+    while ($line = <$fh>) {
+	assemble($line);
+    }
+    endasm();
+}
+
+sub newasm {
+    my($outsub) = @_;
+
+    die "Invalid printing routine for B::Assembler\n" unless ref $outsub eq 'CODE';
+    die <<EOD if ref $out;
+Can't have multiple byteassembly sessions at once!
+	(perhaps you forgot an endasm()?)
+EOD
+
+    $linenum = $errors = 0;
+    $out = $outsub;
+
+    $out->(gen_header());
+}
+
+sub endasm {
+    if ($errors) {
+	die "There were $errors assembly errors\n";
+    }
+    $linenum = $errors = $out = 0;
+}
+
+sub assemble {
+    my($line) = @_;
+    my ($insn, $arg);
+    $linenum++;
+    chomp $line;
+    if ($debug) {
+	my $quotedline = $line;
+	$quotedline =~ s/\\/\\\\/g;
+	$quotedline =~ s/"/\\"/g;
+	$out->(assemble_insn("comment", qq("$quotedline")));
+    }
+    if( $line = strip_comments($line) ){
+        ($insn, $arg) = parse_statement($line);
+        $out->(assemble_insn($insn, $arg));
+        if ($debug) {
+	    $out->(assemble_insn("nop", undef));
+        }
+    }
+}
+
+### temporary workaround
+
+sub asm {
+    return if $_[0] =~ /\s*\W/;
+    if (defined $_[1]) {
+	return if $_[1] eq "0" and
+	    $_[0] !~ /^(?:newsvx?|av_pushx?|av_extend|xav_flags)$/;
+	return if $_[1] eq "1" and $_[0] =~ /^(?:sv_refcnt)$/;
+    }
+    assemble "@_";
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Assembler - Assemble Perl bytecode
+
+=head1 SYNOPSIS
+
+	use B::Assembler qw(newasm endasm assemble);
+	newasm(\&printsub);	# sets up for assembly
+	assemble($buf); 	# assembles one line
+	endasm();		# closes down
+
+	use B::Assembler qw(assemble_fh);
+	assemble_fh($fh, \&printsub);	# assemble everything in $fh
+
+=head1 DESCRIPTION
+
+See F<ext/B/B/Assembler.pm>.
+
+=head1 AUTHORS
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+Per-statement interface by Benjamin Stuhl, C<sho_pi@hotmail.com>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Bblock.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Bblock.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Bblock.pm	(revision 14489)
@@ -0,0 +1,224 @@
+package B::Bblock;
+
+our $VERSION = '1.02_01';
+
+use Exporter ();
+@ISA = "Exporter";
+@EXPORT_OK = qw(find_leaders);
+
+use B qw(peekop walkoptree walkoptree_exec
+	 main_root main_start svref_2object
+         OPf_SPECIAL OPf_STACKED );
+
+use B::Concise qw(concise_cv concise_main set_style_standard);
+use strict;
+
+my $bblock;
+my @bblock_ends;
+
+sub mark_leader {
+    my $op = shift;
+    if ($$op) {
+	$bblock->{$$op} = $op;
+    }
+}
+
+sub remove_sortblock{
+    foreach (keys %$bblock){
+        my $leader=$$bblock{$_};	
+	delete $$bblock{$_} if( $leader == 0);   
+    }
+}
+sub find_leaders {
+    my ($root, $start) = @_;
+    $bblock = {};
+    mark_leader($start) if ( ref $start ne "B::NULL" );
+    walkoptree($root, "mark_if_leader") if ((ref $root) ne "B::NULL") ;
+    remove_sortblock();
+    return $bblock;
+}
+
+# Debugging
+sub walk_bblocks {
+    my ($root, $start) = @_;
+    my ($op, $lastop, $leader, $bb);
+    $bblock = {};
+    mark_leader($start);
+    walkoptree($root, "mark_if_leader");
+    my @leaders = values %$bblock;
+    while ($leader = shift @leaders) {
+	$lastop = $leader;
+	$op = $leader->next;
+	while ($$op && !exists($bblock->{$$op})) {
+	    $bblock->{$$op} = $leader;
+	    $lastop = $op;
+	    $op = $op->next;
+	}
+	push(@bblock_ends, [$leader, $lastop]);
+    }
+    foreach $bb (@bblock_ends) {
+	($leader, $lastop) = @$bb;
+	printf "%s .. %s\n", peekop($leader), peekop($lastop);
+	for ($op = $leader; $$op != $$lastop; $op = $op->next) {
+	    printf "    %s\n", peekop($op);
+	}
+	printf "    %s\n", peekop($lastop);
+    }
+}
+
+sub walk_bblocks_obj {
+    my $cvref = shift;
+    my $cv = svref_2object($cvref);
+    walk_bblocks($cv->ROOT, $cv->START);
+}
+
+sub B::OP::mark_if_leader {}
+
+sub B::COP::mark_if_leader {
+    my $op = shift;
+    if ($op->label) {
+	mark_leader($op);
+    }
+}
+
+sub B::LOOP::mark_if_leader {
+    my $op = shift;
+    mark_leader($op->next);
+    mark_leader($op->nextop);
+    mark_leader($op->redoop);
+    mark_leader($op->lastop->next);
+}
+
+sub B::LOGOP::mark_if_leader {
+    my $op = shift;
+    my $opname = $op->name;
+    mark_leader($op->next);
+    if ($opname eq "entertry") {
+	mark_leader($op->other->next);
+    } else {
+	mark_leader($op->other);
+    }
+}
+
+sub B::LISTOP::mark_if_leader {
+    my $op = shift;
+    my $first=$op->first;
+    $first=$first->next while ($first->name eq "null");
+    mark_leader($op->first) unless (exists( $bblock->{$$first}));
+    mark_leader($op->next);
+    if ($op->name eq "sort" and $op->flags & OPf_SPECIAL
+	and $op->flags & OPf_STACKED){
+        my $root=$op->first->sibling->first;
+        my $leader=$root->first;
+        $bblock->{$$leader} = 0;
+    }
+}
+
+sub B::PMOP::mark_if_leader {
+    my $op = shift;
+    if ($op->name ne "pushre") {
+	my $replroot = $op->pmreplroot;
+	if ($$replroot) {
+	    mark_leader($replroot);
+	    mark_leader($op->next);
+	    mark_leader($op->pmreplstart);
+	}
+    }
+}
+
+# PMOP stuff omitted
+
+sub compile {
+    my @options = @_;
+    B::clearsym();
+    if (@options) {
+	return sub {
+	    my $objname;
+	    foreach $objname (@options) {
+		$objname = "main::$objname" unless $objname =~ /::/;
+		eval "walk_bblocks_obj(\\&$objname)";
+		die "walk_bblocks_obj(\\&$objname) failed: $@" if $@;
+		print "-------\n";
+		set_style_standard("terse");
+		eval "concise_cv('exec', \\&$objname)";
+		die "concise_cv('exec', \\&$objname) failed: $@" if $@;
+	    }
+	}
+    } else {
+	return sub {
+	    walk_bblocks(main_root, main_start);
+	    print "-------\n";
+	    set_style_standard("terse");
+	    concise_main("exec");
+	};
+    }
+}
+
+# Basic block leaders:
+#     Any COP (pp_nextstate) with a non-NULL label
+#     [The op after a pp_enter] Omit
+#     [The op after a pp_entersub. Don't count this one.]
+#     The ops pointed at by nextop, redoop and lastop->op_next of a LOOP
+#     The ops pointed at by op_next and op_other of a LOGOP, except
+#     for pp_entertry which has op_next and op_other->op_next
+#     The op pointed at by op_pmreplstart of a PMOP
+#     The op pointed at by op_other->op_pmreplstart of pp_substcont?
+#     [The op after a pp_return] Omit
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Bblock - Walk basic blocks
+
+=head1 SYNOPSIS
+
+  # External interface
+  perl -MO=Bblock[,OPTIONS] foo.pl
+
+  # Programmatic API
+  use B::Bblock qw(find_leaders);
+  my $leaders = find_leaders($root_op, $start_op);
+
+=head1 DESCRIPTION
+
+This module is used by the B::CC back end.  It walks "basic blocks".
+A basic block is a series of operations which is known to execute from
+start to finish, with no possibility of branching or halting.
+
+It can be used either stand alone or from inside another program.
+
+=for _private
+Somebody who understands the stand-alone options document them, please.
+
+=head2 Functions
+
+=over 4
+
+=item B<find_leaders>
+
+  my $leaders = find_leaders($root_op, $start_op);
+
+Given the root of the op tree and an op from which to start
+processing, it will return a hash ref representing all the ops which
+start a block.
+
+=for _private
+The above description may be somewhat wrong.
+
+The values of %$leaders are the op objects themselves.  Keys are $$op
+addresses.
+
+=for _private
+Above cribbed from B::CC's comments.  What's a $$op address?
+
+=back
+
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Bytecode.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Bytecode.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Bytecode.pm	(revision 14489)
@@ -0,0 +1,889 @@
+# B::Bytecode.pm
+# Copyright (c) 2003 Enache Adrian. All rights reserved.
+# This module is free software; you can redistribute and/or modify
+# it under the same terms as Perl itself.
+
+# Based on the original Bytecode.pm module written by Malcolm Beattie.
+
+package B::Bytecode;
+
+our $VERSION = '1.01_01';
+
+use strict;
+use Config;
+use B qw(class main_cv main_root main_start cstring comppadlist
+	defstash curstash begin_av init_av end_av inc_gv warnhook diehook
+	dowarn SVt_PVGV SVt_PVHV OPf_SPECIAL OPf_STACKED OPf_MOD
+	OPpLVAL_INTRO SVf_FAKE SVf_READONLY);
+use B::Asmdata qw(@specialsv_name);
+use B::Assembler qw(asm newasm endasm);
+
+#################################################
+
+my ($varix, $opix, $savebegins, %walked, %files, @cloop);
+my %strtab = (0,0);
+my %svtab = (0,0);
+my %optab = (0,0);
+my %spectab = (0,0);
+my $tix = 1;
+sub asm;
+sub nice ($) { }
+
+BEGIN {
+    my $ithreads = $Config{'useithreads'} eq 'define';
+    eval qq{
+	sub ITHREADS() { $ithreads }
+	sub VERSION() { $] }
+    }; die $@ if $@;
+}
+
+#################################################
+
+sub pvstring {
+    my $pv = shift;
+    defined($pv) ? cstring ($pv."\0") : "\"\"";
+}
+
+sub pvix {
+    my $str = pvstring shift;
+    my $ix = $strtab{$str};
+    defined($ix) ? $ix : do {
+	asm "newpv", $str;
+	asm "stpv", $strtab{$str} = $tix;
+	$tix++;
+    }
+}
+
+sub B::OP::ix {
+    my $op = shift;
+    my $ix = $optab{$$op};
+    defined($ix) ? $ix : do {
+	nice "[".$op->name." $tix]";
+	asm "newopx", $op->size | $op->type <<7;
+	$optab{$$op} = $opix = $ix = $tix++;
+	$op->bsave($ix);
+	$ix;
+    }
+}
+
+sub B::SPECIAL::ix {
+    my $spec = shift;
+    my $ix = $spectab{$$spec};
+    defined($ix) ? $ix : do {
+	nice '['.$specialsv_name[$$spec].']';
+	asm "ldspecsvx", $$spec;
+	$spectab{$$spec} = $varix = $tix++;
+    }
+}
+
+sub B::SV::ix {
+    my $sv = shift;
+    my $ix = $svtab{$$sv};
+    defined($ix) ? $ix : do {
+	nice '['.class($sv).']';
+	asm "newsvx", $sv->FLAGS;
+	$svtab{$$sv} = $varix = $ix = $tix++;
+	$sv->bsave($ix);
+	$ix;
+    }
+}
+
+sub B::GV::ix {
+    my ($gv,$desired) = @_;
+    my $ix = $svtab{$$gv};
+    defined($ix) ? $ix : do {
+	if ($gv->GP) {
+	    my ($svix, $avix, $hvix, $cvix, $ioix, $formix);
+	    nice "[GV]";
+	    my $name = $gv->STASH->NAME . "::" . $gv->NAME;
+	    asm "gv_fetchpvx", cstring $name;
+	    $svtab{$$gv} = $varix = $ix = $tix++;
+	    asm "sv_flags", $gv->FLAGS;
+	    asm "sv_refcnt", $gv->REFCNT;
+	    asm "xgv_flags", $gv->GvFLAGS;
+
+	    asm "gp_refcnt", $gv->GvREFCNT;
+	    asm "load_glob", $ix if $name eq "CORE::GLOBAL::glob";
+	    return $ix
+		    unless $desired || desired $gv;
+	    $svix = $gv->SV->ix;
+	    $avix = $gv->AV->ix;
+	    $hvix = $gv->HV->ix;
+
+    # XXX {{{{
+	    my $cv = $gv->CV;
+	    $cvix = $$cv && defined $files{$cv->FILE} ? $cv->ix : 0;
+	    my $form = $gv->FORM;
+	    $formix = $$form && defined $files{$form->FILE} ? $form->ix : 0;
+
+	    $ioix = $name !~ /STDOUT$/ ? $gv->IO->ix : 0;	
+							    # }}}} XXX
+
+	    nice "-GV-",
+	    asm "ldsv", $varix = $ix unless $ix == $varix;
+	    asm "gp_sv", $svix;
+	    asm "gp_av", $avix;
+	    asm "gp_hv", $hvix;
+	    asm "gp_cv", $cvix;
+	    asm "gp_io", $ioix;
+	    asm "gp_cvgen", $gv->CVGEN;
+	    asm "gp_form", $formix;
+	    asm "gp_file", pvix $gv->FILE;
+	    asm "gp_line", $gv->LINE;
+	    asm "formfeed", $svix if $name eq "main::\cL";
+	} else {
+	    nice "[GV]";
+	    asm "newsvx", $gv->FLAGS;
+	    $svtab{$$gv} = $varix = $ix = $tix++;
+	    my $stashix = $gv->STASH->ix;
+	    $gv->B::PVMG::bsave($ix);
+	    asm "xgv_flags", $gv->GvFLAGS;
+	    asm "xgv_stash", $stashix;
+	}
+	$ix;
+    }
+}
+
+sub B::HV::ix {
+    my $hv = shift;
+    my $ix = $svtab{$$hv};
+    defined($ix) ? $ix : do {
+	my ($ix,$i,@array);
+	my $name = $hv->NAME;
+	if ($name) {
+	    nice "[STASH]";
+	    asm "gv_stashpvx", cstring $name;
+	    asm "sv_flags", $hv->FLAGS;
+	    $svtab{$$hv} = $varix = $ix = $tix++;
+	    asm "xhv_name", pvix $name;
+	    # my $pmrootix = $hv->PMROOT->ix;	# XXX
+	    asm "ldsv", $varix = $ix unless $ix == $varix;
+	    # asm "xhv_pmroot", $pmrootix;	# XXX
+	} else {
+	    nice "[HV]";
+	    asm "newsvx", $hv->FLAGS;
+	    $svtab{$$hv} = $varix = $ix = $tix++;
+	    my $stashix = $hv->SvSTASH->ix;
+	    for (@array = $hv->ARRAY) {
+		next if $i = not $i;
+		$_ = $_->ix;
+	    }
+	    nice "-HV-",
+	    asm "ldsv", $varix = $ix unless $ix == $varix;
+	    ($i = not $i) ? asm ("newpv", pvstring $_) : asm("hv_store", $_)
+		for @array;
+	    if (VERSION < 5.009) {
+		asm "xnv", $hv->NVX;
+	    }
+	    asm "xmg_stash", $stashix;
+	    asm "xhv_riter", $hv->RITER;
+	}
+	asm "sv_refcnt", $hv->REFCNT;
+	$ix;
+    }
+}
+
+sub B::NULL::ix {
+    my $sv = shift;
+    $$sv ? $sv->B::SV::ix : 0;
+}
+
+sub B::NULL::opwalk { 0 }
+
+#################################################
+
+sub B::NULL::bsave {
+    my ($sv,$ix) = @_;
+
+    nice '-'.class($sv).'-',
+    asm "ldsv", $varix = $ix unless $ix == $varix;
+    asm "sv_refcnt", $sv->REFCNT;
+}
+
+sub B::SV::bsave;
+    *B::SV::bsave = *B::NULL::bsave;
+
+sub B::RV::bsave {
+    my ($sv,$ix) = @_;
+    my $rvix = $sv->RV->ix;
+    $sv->B::NULL::bsave($ix);
+    asm "xrv", $rvix;
+}
+
+sub B::PV::bsave {
+    my ($sv,$ix) = @_;
+    $sv->B::NULL::bsave($ix);
+    asm "newpv", pvstring $sv->PVBM;
+    asm "xpv";
+}
+
+sub B::IV::bsave {
+    my ($sv,$ix) = @_;
+    $sv->B::NULL::bsave($ix);
+    asm "xiv", $sv->IVX;
+}
+
+sub B::NV::bsave {
+    my ($sv,$ix) = @_;
+    $sv->B::NULL::bsave($ix);
+    asm "xnv", sprintf "%.40g", $sv->NVX;
+}
+
+sub B::PVIV::bsave {
+    my ($sv,$ix) = @_;
+    $sv->POK ?
+	$sv->B::PV::bsave($ix):
+    $sv->ROK ?
+	$sv->B::RV::bsave($ix):
+	$sv->B::NULL::bsave($ix);
+    if (VERSION >= 5.009) {
+	# See note below in B::PVNV::bsave
+	return if $sv->isa('B::AV');
+	return if $sv->isa('B::HV');
+    }
+    asm "xiv", !ITHREADS && $sv->FLAGS & (SVf_FAKE|SVf_READONLY) ?
+	"0 but true" : $sv->IVX;
+}
+
+sub B::PVNV::bsave {
+    my ($sv,$ix) = @_;
+    $sv->B::PVIV::bsave($ix);
+    if (VERSION >= 5.009) {
+	# Magical AVs end up here, but AVs now don't have an NV slot actually
+	# allocated. Hence don't write out assembly to store the NV slot if
+	# we're actually an array.
+	return if $sv->isa('B::AV');
+	# Likewise HVs have no NV slot actually allocated.
+	# I don't think that they can get here, but better safe than sorry
+	return if $sv->isa('B::HV');
+    }
+    asm "xnv", sprintf "%.40g", $sv->NVX;
+}
+
+sub B::PVMG::domagic {
+    my ($sv,$ix) = @_;
+    nice '-MAGICAL-';
+    my @mglist = $sv->MAGIC;
+    my (@mgix, @namix);
+    for (@mglist) {
+	push @mgix, $_->OBJ->ix;
+	push @namix, $_->PTR->ix if $_->LENGTH == B::HEf_SVKEY;
+    }
+
+    nice '-'.class($sv).'-',
+    asm "ldsv", $varix = $ix unless $ix == $varix;
+    for (@mglist) {
+	asm "sv_magic", cstring $_->TYPE;
+	asm "mg_obj", shift @mgix;
+	my $length = $_->LENGTH;
+	if ($length == B::HEf_SVKEY) {
+	    asm "mg_namex", shift @namix;
+	} elsif ($length) {
+	    asm "newpv", pvstring $_->PTR;
+	    asm "mg_name";
+	}
+    }
+}
+
+sub B::PVMG::bsave {
+    my ($sv,$ix) = @_;
+    my $stashix = $sv->SvSTASH->ix;
+    $sv->B::PVNV::bsave($ix);
+    asm "xmg_stash", $stashix;
+    $sv->domagic($ix) if $sv->MAGICAL;
+}
+
+sub B::PVLV::bsave {
+    my ($sv,$ix) = @_;
+    my $targix = $sv->TARG->ix;
+    $sv->B::PVMG::bsave($ix);
+    asm "xlv_targ", $targix;
+    asm "xlv_targoff", $sv->TARGOFF;
+    asm "xlv_targlen", $sv->TARGLEN;
+    asm "xlv_type", $sv->TYPE;
+
+}
+
+sub B::BM::bsave {
+    my ($sv,$ix) = @_;
+    $sv->B::PVMG::bsave($ix);
+    asm "xpv_cur", $sv->CUR;
+    asm "xbm_useful", $sv->USEFUL;
+    asm "xbm_previous", $sv->PREVIOUS;
+    asm "xbm_rare", $sv->RARE;
+}
+
+sub B::IO::bsave {
+    my ($io,$ix) = @_;
+    my $topix = $io->TOP_GV->ix;
+    my $fmtix = $io->FMT_GV->ix;
+    my $bottomix = $io->BOTTOM_GV->ix;
+    $io->B::PVMG::bsave($ix);
+    asm "xio_lines", $io->LINES;
+    asm "xio_page", $io->PAGE;
+    asm "xio_page_len", $io->PAGE_LEN;
+    asm "xio_lines_left", $io->LINES_LEFT;
+    asm "xio_top_name", pvix $io->TOP_NAME;
+    asm "xio_top_gv", $topix;
+    asm "xio_fmt_name", pvix $io->FMT_NAME;
+    asm "xio_fmt_gv", $fmtix;
+    asm "xio_bottom_name", pvix $io->BOTTOM_NAME;
+    asm "xio_bottom_gv", $bottomix;
+    asm "xio_subprocess", $io->SUBPROCESS;
+    asm "xio_type", ord $io->IoTYPE;
+    # asm "xio_flags", ord($io->IoFLAGS) & ~32;		# XXX XXX
+}
+
+sub B::CV::bsave {
+    my ($cv,$ix) = @_;
+    my $stashix = $cv->STASH->ix;
+    my $gvix = $cv->GV->ix;
+    my $padlistix = $cv->PADLIST->ix;
+    my $outsideix = $cv->OUTSIDE->ix;
+    my $constix = $cv->CONST ? $cv->XSUBANY->ix : 0;
+    my $startix = $cv->START->opwalk;
+    my $rootix = $cv->ROOT->ix;
+
+    $cv->B::PVMG::bsave($ix);
+    asm "xcv_stash", $stashix;
+    asm "xcv_start", $startix;
+    asm "xcv_root", $rootix;
+    asm "xcv_xsubany", $constix;
+    asm "xcv_gv", $gvix;
+    asm "xcv_file", pvix $cv->FILE if $cv->FILE;	# XXX AD
+    asm "xcv_padlist", $padlistix;
+    asm "xcv_outside", $outsideix;
+    asm "xcv_flags", $cv->CvFLAGS;
+    asm "xcv_outside_seq", $cv->OUTSIDE_SEQ;
+    asm "xcv_depth", $cv->DEPTH;
+}
+
+sub B::FM::bsave {
+    my ($form,$ix) = @_;
+
+    $form->B::CV::bsave($ix);
+    asm "xfm_lines", $form->LINES;
+}
+
+sub B::AV::bsave {
+    my ($av,$ix) = @_;
+    return $av->B::PVMG::bsave($ix) if $av->MAGICAL;
+    my @array = $av->ARRAY;
+    $_ = $_->ix for @array;
+    my $stashix = $av->SvSTASH->ix;
+
+    nice "-AV-",
+    asm "ldsv", $varix = $ix unless $ix == $varix;
+    asm "av_extend", $av->MAX if $av->MAX >= 0;
+    asm "av_pushx", $_ for @array;
+    asm "sv_refcnt", $av->REFCNT;
+    if (VERSION < 5.009) {
+	asm "xav_flags", $av->AvFLAGS;
+    }
+    asm "xmg_stash", $stashix;
+}
+
+sub B::GV::desired {
+    my $gv = shift;
+    my ($cv, $form);
+    $files{$gv->FILE} && $gv->LINE
+    || ${$cv = $gv->CV} && $files{$cv->FILE}
+    || ${$form = $gv->FORM} && $files{$form->FILE}
+}
+
+sub B::HV::bwalk {
+    my $hv = shift;
+    return if $walked{$$hv}++;
+    my %stash = $hv->ARRAY;
+    while (my($k,$v) = each %stash) {
+	if ($v->SvTYPE == SVt_PVGV) {
+	    my $hash = $v->HV;
+	    if ($$hash && $hash->NAME) {
+		$hash->bwalk;
+	    } 
+	    $v->ix(1) if desired $v;
+	} else {
+	    nice "[prototype]";
+	    asm "gv_fetchpvx", cstring $hv->NAME . "::$k";
+	    $svtab{$$v} = $varix = $tix;
+	    $v->bsave($tix++);
+	    asm "sv_flags", $v->FLAGS;
+	}
+    }
+}
+
+######################################################
+
+
+sub B::OP::bsave_thin {
+    my ($op, $ix) = @_;
+    my $next = $op->next;
+    my $nextix = $optab{$$next};
+    $nextix = 0, push @cloop, $op unless defined $nextix;
+    if ($ix != $opix) {
+	nice '-'.$op->name.'-',
+	asm "ldop", $opix = $ix;
+    }
+    asm "op_next", $nextix;
+    asm "op_targ", $op->targ if $op->type;		# tricky
+    asm "op_flags", $op->flags;
+    asm "op_private", $op->private;
+}
+
+sub B::OP::bsave;
+    *B::OP::bsave = *B::OP::bsave_thin;
+
+sub B::UNOP::bsave {
+    my ($op, $ix) = @_;
+    my $name = $op->name;
+    my $flags = $op->flags;
+    my $first = $op->first;
+    my $firstix = 
+	$name =~ /fl[io]p/
+			# that's just neat
+    ||	(!ITHREADS && $name eq 'regcomp')
+			# trick for /$a/o in pp_regcomp
+    ||	$name eq 'rv2sv'
+	    && $op->flags & OPf_MOD	
+	    && $op->private & OPpLVAL_INTRO
+			# change #18774 made my life hard
+    ?	$first->ix
+    :	0;
+
+    $op->B::OP::bsave($ix);
+    asm "op_first", $firstix;
+}
+
+sub B::BINOP::bsave {
+    my ($op, $ix) = @_;
+    if ($op->name eq 'aassign' && $op->private & B::OPpASSIGN_HASH()) {
+	my $last = $op->last;
+	my $lastix = do {
+	    local *B::OP::bsave = *B::OP::bsave_fat;
+	    local *B::UNOP::bsave = *B::UNOP::bsave_fat;
+	    $last->ix;
+	};
+	asm "ldop", $lastix unless $lastix == $opix;
+	asm "op_targ", $last->targ;
+	$op->B::OP::bsave($ix);
+	asm "op_last", $lastix;
+    } else {
+	$op->B::OP::bsave($ix);
+    }
+}
+
+# not needed if no pseudohashes
+
+*B::BINOP::bsave = *B::OP::bsave if VERSION >= 5.009;
+
+# deal with sort / formline 
+
+sub B::LISTOP::bsave {
+    my ($op, $ix) = @_;
+    my $name = $op->name;
+    sub blocksort() { OPf_SPECIAL|OPf_STACKED }
+    if ($name eq 'sort' && ($op->flags & blocksort) == blocksort) {
+	my $first = $op->first;
+	my $pushmark = $first->sibling;
+	my $rvgv = $pushmark->first;
+	my $leave = $rvgv->first;
+
+	my $leaveix = $leave->ix;
+
+	my $rvgvix = $rvgv->ix;
+	asm "ldop", $rvgvix unless $rvgvix == $opix;
+	asm "op_first", $leaveix;
+
+	my $pushmarkix = $pushmark->ix;
+	asm "ldop", $pushmarkix unless $pushmarkix == $opix;
+	asm "op_first", $rvgvix;
+
+	my $firstix = $first->ix;
+	asm "ldop", $firstix unless $firstix == $opix;
+	asm "op_sibling", $pushmarkix;
+
+	$op->B::OP::bsave($ix);
+	asm "op_first", $firstix;
+    } elsif ($name eq 'formline') {
+	$op->B::UNOP::bsave_fat($ix);
+    } else {
+	$op->B::OP::bsave($ix);
+    }
+}
+
+# fat versions
+
+sub B::OP::bsave_fat {
+    my ($op, $ix) = @_;
+    my $siblix = $op->sibling->ix;
+
+    $op->B::OP::bsave_thin($ix);
+    asm "op_sibling", $siblix;
+    # asm "op_seq", -1;			XXX don't allocate OPs piece by piece
+}
+
+sub B::UNOP::bsave_fat {
+    my ($op,$ix) = @_;
+    my $firstix = $op->first->ix;
+
+    $op->B::OP::bsave($ix);
+    asm "op_first", $firstix;
+}
+
+sub B::BINOP::bsave_fat {
+    my ($op,$ix) = @_;
+    my $last = $op->last;
+    my $lastix = $op->last->ix;
+    if (VERSION < 5.009 && $op->name eq 'aassign' && $last->name eq 'null') {
+	asm "ldop", $lastix unless $lastix == $opix;
+	asm "op_targ", $last->targ;
+    }
+
+    $op->B::UNOP::bsave($ix);
+    asm "op_last", $lastix;
+}
+
+sub B::LOGOP::bsave {
+    my ($op,$ix) = @_;
+    my $otherix = $op->other->ix;
+
+    $op->B::UNOP::bsave($ix);
+    asm "op_other", $otherix;
+}
+
+sub B::PMOP::bsave {
+    my ($op,$ix) = @_;
+    my ($rrop, $rrarg, $rstart);
+
+    # my $pmnextix = $op->pmnext->ix;	# XXX
+
+    if (ITHREADS) {
+	if ($op->name eq 'subst') {
+	    $rrop = "op_pmreplroot";
+	    $rrarg = $op->pmreplroot->ix;
+	    $rstart = $op->pmreplstart->ix;
+	} elsif ($op->name eq 'pushre') {
+	    $rrop = "op_pmreplrootpo";
+	    $rrarg = $op->pmreplroot;
+	}
+	$op->B::BINOP::bsave($ix);
+	asm "op_pmstashpv", pvix $op->pmstashpv;
+    } else {
+	$rrop = "op_pmreplrootgv";
+	$rrarg = $op->pmreplroot->ix;
+	$rstart = $op->pmreplstart->ix if $op->name eq 'subst';
+	my $stashix = $op->pmstash->ix;
+	$op->B::BINOP::bsave($ix);
+	asm "op_pmstash", $stashix;
+    }
+
+    asm $rrop, $rrarg if $rrop;
+    asm "op_pmreplstart", $rstart if $rstart;
+
+    asm "op_pmflags", $op->pmflags;
+    asm "op_pmpermflags", $op->pmpermflags;
+    asm "op_pmdynflags", $op->pmdynflags;
+    # asm "op_pmnext", $pmnextix;	# XXX
+    asm "newpv", pvstring $op->precomp;
+    asm "pregcomp";
+}
+
+sub B::SVOP::bsave {
+    my ($op,$ix) = @_;
+    my $svix = $op->sv->ix;
+
+    $op->B::OP::bsave($ix);
+    asm "op_sv", $svix;
+}
+
+sub B::PADOP::bsave {
+    my ($op,$ix) = @_;
+
+    $op->B::OP::bsave($ix);
+    asm "op_padix", $op->padix;
+}
+
+sub B::PVOP::bsave {
+    my ($op,$ix) = @_;
+    $op->B::OP::bsave($ix);
+    return unless my $pv = $op->pv;
+
+    if ($op->name eq 'trans') {
+        asm "op_pv_tr", join ',', length($pv)/2, unpack("s*", $pv);
+    } else {
+        asm "newpv", pvstring $pv;
+        asm "op_pv";
+    }
+}
+
+sub B::LOOP::bsave {
+    my ($op,$ix) = @_;
+    my $nextix = $op->nextop->ix;
+    my $lastix = $op->lastop->ix;
+    my $redoix = $op->redoop->ix;
+
+    $op->B::BINOP::bsave($ix);
+    asm "op_redoop", $redoix;
+    asm "op_nextop", $nextix;
+    asm "op_lastop", $lastix;
+}
+
+sub B::COP::bsave {
+    my ($cop,$ix) = @_;
+    my $warnix = $cop->warnings->ix;
+    my $ioix = $cop->io->ix;
+    if (ITHREADS) {
+	$cop->B::OP::bsave($ix);
+	asm "cop_stashpv", pvix $cop->stashpv;
+	asm "cop_file", pvix $cop->file;
+    } else {
+    	my $stashix = $cop->stash->ix;
+    	my $fileix = $cop->filegv->ix(1);
+	$cop->B::OP::bsave($ix);
+	asm "cop_stash", $stashix;
+	asm "cop_filegv", $fileix;
+    }
+    asm "cop_label", pvix $cop->label if $cop->label;	# XXX AD
+    asm "cop_seq", $cop->cop_seq;
+    asm "cop_arybase", $cop->arybase;
+    asm "cop_line", $cop->line;
+    asm "cop_warnings", $warnix;
+    asm "cop_io", $ioix;
+}
+
+sub B::OP::opwalk {
+    my $op = shift;
+    my $ix = $optab{$$op};
+    defined($ix) ? $ix : do {
+	my $ix;
+	my @oplist = $op->oplist;
+	push @cloop, undef;
+	$ix = $_->ix while $_ = pop @oplist;
+	while ($_ = pop @cloop) {
+	    asm "ldop", $optab{$$_};
+	    asm "op_next", $optab{${$_->next}};
+	}
+	$ix;
+    }
+}
+
+#################################################
+
+sub save_cq {
+    my $av;
+    if (($av=begin_av)->isa("B::AV")) {
+	if ($savebegins) {
+	    for ($av->ARRAY) {
+		next unless $_->FILE eq $0;
+		asm "push_begin", $_->ix;
+	    }
+	} else {
+	    for ($av->ARRAY) {
+		next unless $_->FILE eq $0;
+		# XXX BEGIN { goto A while 1; A: }
+		for (my $op = $_->START; $$op; $op = $op->next) {
+		    next unless $op->name eq 'require' || 
+			# this kludge needed for tests
+			$op->name eq 'gv' && do {
+			    my $gv = class($op) eq 'SVOP' ?
+				$op->gv :
+			    	(($_->PADLIST->ARRAY)[1]->ARRAY)[$op->padix];
+			    $$gv && $gv->NAME =~ /use_ok|plan/
+			};
+		    asm "push_begin", $_->ix;
+		    last;
+		}
+	    }
+	}
+    }
+    if (($av=init_av)->isa("B::AV")) {
+	for ($av->ARRAY) {
+	    next unless $_->FILE eq $0;
+	    asm "push_init", $_->ix;
+	}
+    }
+    if (($av=end_av)->isa("B::AV")) {
+	for ($av->ARRAY) {
+	    next unless $_->FILE eq $0;
+	    asm "push_end", $_->ix;
+	}
+    }
+}
+
+sub compile {
+    my ($head, $scan, $T_inhinc, $keep_syn);
+    my $cwd = '';
+    $files{$0} = 1;
+    sub keep_syn {
+	$keep_syn = 1;
+	*B::OP::bsave = *B::OP::bsave_fat;
+	*B::UNOP::bsave = *B::UNOP::bsave_fat;
+	*B::BINOP::bsave = *B::BINOP::bsave_fat;
+	*B::LISTOP::bsave = *B::LISTOP::bsave_fat;
+    }
+    sub bwarn { print STDERR "Bytecode.pm: @_\n" }
+
+    for (@_) {
+	if (/^-S/) {
+	    *newasm = *endasm = sub { };
+	    *asm = sub { print "    @_\n" };
+	    *nice = sub ($) { print "\n@_\n" };
+	} elsif (/^-H/) {
+	    require ByteLoader;
+	    $head = "#! $^X\nuse ByteLoader $ByteLoader::VERSION;\n";
+	} elsif (/^-k/) {
+	    keep_syn;
+	} elsif (/^-o(.*)$/) {
+	    open STDOUT, ">$1" or die "open $1: $!";
+	} elsif (/^-f(.*)$/) {
+	    $files{$1} = 1;
+	} elsif (/^-s(.*)$/) {
+	    $scan = length($1) ? $1 : $0;
+	} elsif (/^-b/) {
+	    $savebegins = 1;
+    # this is here for the testsuite
+	} elsif (/^-TI/) {
+	    $T_inhinc = 1;
+	} elsif (/^-TF(.*)/) {
+	    my $thatfile = $1;
+	    *B::COP::file = sub { $thatfile };
+	} else {
+	    bwarn "Ignoring '$_' option";
+	}
+    }
+    if ($scan) {
+	my $f;
+	if (open $f, $scan) {
+	    while (<$f>) {
+		/^#\s*line\s+\d+\s+("?)(.*)\1/ and $files{$2} = 1;
+		/^#/ and next;
+		if (/\bgoto\b\s*[^&]/ && !$keep_syn) {
+		    bwarn "keeping the syntax tree: \"goto\" op found";
+		    keep_syn;
+		}
+	    }
+	} else {
+	    bwarn "cannot rescan '$scan'";
+	}
+	close $f;
+    }
+    binmode STDOUT;
+    return sub {
+	print $head if $head;
+	newasm sub { print @_ };
+
+	defstash->bwalk;
+	asm "main_start", main_start->opwalk;
+	asm "main_root", main_root->ix;
+	asm "main_cv", main_cv->ix;
+	asm "curpad", (comppadlist->ARRAY)[1]->ix;
+
+	asm "signal", cstring "__WARN__"		# XXX
+	    if warnhook->ix;
+	asm "incav", inc_gv->AV->ix if $T_inhinc;
+	save_cq;
+	asm "incav", inc_gv->AV->ix if $T_inhinc;
+	asm "dowarn", dowarn;
+
+	{
+	    no strict 'refs';
+	    nice "<DATA>";
+	    my $dh = *{defstash->NAME."::DATA"};
+	    unless (eof $dh) {
+		local undef $/;
+		asm "data", ord 'D';
+		print <$dh>;
+	    } else {
+		asm "ret";
+	    }
+	}
+
+	endasm;
+    }
+}
+
+1;
+
+=head1 NAME
+
+B::Bytecode - Perl compiler's bytecode backend
+
+=head1 SYNOPSIS
+
+B<perl -MO=Bytecode>[B<,-H>][B<,-o>I<script.plc>] I<script.pl>
+
+=head1 DESCRIPTION
+
+Compiles a Perl script into a bytecode format that could be loaded
+later by the ByteLoader module and executed as a regular Perl script.
+
+=head1 EXAMPLE
+
+    $ perl -MO=Bytecode,-H,-ohi -e 'print "hi!\n"'
+    $ perl hi
+    hi!
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-b>
+
+Save all the BEGIN blocks. Normally only BEGIN blocks that C<require>
+other files (ex. C<use Foo;>) are saved.
+
+=item B<-H>
+
+prepend a C<use ByteLoader VERSION;> line to the produced bytecode.
+
+=item B<-k>
+
+keep the syntax tree - it is stripped by default.
+
+=item B<-o>I<outfile>
+
+put the bytecode in <outfile> instead of dumping it to STDOUT.
+
+=item B<-s>
+
+scan the script for C<# line ..> directives and for <goto LABEL>
+expressions. When gotos are found keep the syntax tree.
+
+=back
+
+=head1 KNOWN BUGS
+
+=over 4
+
+=item *
+
+C<BEGIN { goto A: while 1; A: }> won't even compile.
+
+=item *
+
+C<?...?> and C<reset> do not work as expected.
+
+=item *
+
+variables in C<(?{ ... })> constructs are not properly scoped.
+
+=item *
+
+scripts that use source filters will fail miserably. 
+
+=back
+
+=head1 NOTICE
+
+There are also undocumented bugs and options.
+
+THIS CODE IS HIGHLY EXPERIMENTAL. USE AT YOUR OWN RISK.
+
+=head1 AUTHORS
+
+Originally written by Malcolm Beattie <mbeattie@sable.ox.ac.uk> and
+modified by Benjamin Stuhl <sho_pi@hotmail.com>.
+
+Rewritten by Enache Adrian <enache@rdslink.ro>, 2003 a.d.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/C.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/C.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/C.pm	(revision 14489)
@@ -0,0 +1,2272 @@
+#      C.pm
+#
+#      Copyright (c) 1996, 1997, 1998 Malcolm Beattie
+#
+#      You may distribute under the terms of either the GNU General Public
+#      License or the Artistic License, as specified in the README file.
+#
+
+package B::C;
+
+our $VERSION = '1.04_01';
+
+package B::C::Section;
+
+use B ();
+use base B::Section;
+
+sub new
+{
+ my $class = shift;
+ my $o = $class->SUPER::new(@_);
+ push @$o, { values => [] };
+ return $o;
+}
+
+sub add
+{
+ my $section = shift;
+ push(@{$section->[-1]{values}},@_);
+}
+
+sub index
+{
+ my $section = shift;
+ return scalar(@{$section->[-1]{values}})-1;
+}
+
+sub output
+{
+ my ($section, $fh, $format) = @_;
+ my $sym = $section->symtable || {};
+ my $default = $section->default;
+ my $i;
+ foreach (@{$section->[-1]{values}})
+  {
+   s{(s\\_[0-9a-f]+)}{ exists($sym->{$1}) ? $sym->{$1} : $default; }ge;
+   printf $fh $format, $_, $i;
+   ++$i;
+  }
+}
+
+package B::C::InitSection;
+
+# avoid use vars
+@B::C::InitSection::ISA = qw(B::C::Section);
+
+sub new {
+    my $class = shift;
+    my $max_lines = 10000; #pop;
+    my $section = $class->SUPER::new( @_ );
+
+    $section->[-1]{evals} = [];
+    $section->[-1]{chunks} = [];
+    $section->[-1]{nosplit} = 0;
+    $section->[-1]{current} = [];
+    $section->[-1]{count} = 0;
+    $section->[-1]{max_lines} = $max_lines;
+
+    return $section;
+}
+
+sub split {
+    my $section = shift;
+    $section->[-1]{nosplit}--
+      if $section->[-1]{nosplit} > 0;
+}
+
+sub no_split {
+    shift->[-1]{nosplit}++;
+}
+
+sub inc_count {
+    my $section = shift;
+
+    $section->[-1]{count} += $_[0];
+    # this is cheating
+    $section->add();
+}
+
+sub add {
+    my $section = shift->[-1];
+    my $current = $section->{current};
+    my $nosplit = $section->{nosplit};
+
+    push @$current, @_;
+    $section->{count} += scalar(@_);
+    if( !$nosplit && $section->{count} >= $section->{max_lines} ) {
+        push @{$section->{chunks}}, $current;
+        $section->{current} = [];
+        $section->{count} = 0;
+    }
+}
+
+sub add_eval {
+    my $section = shift;
+    my @strings = @_;
+
+    foreach my $i ( @strings ) {
+        $i =~ s/\"/\\\"/g;
+    }
+    push @{$section->[-1]{evals}}, @strings;
+}
+
+sub output {
+    my( $section, $fh, $format, $init_name ) = @_;
+    my $sym = $section->symtable || {};
+    my $default = $section->default;
+    push @{$section->[-1]{chunks}}, $section->[-1]{current};
+
+    my $name = "aaaa";
+    foreach my $i ( @{$section->[-1]{chunks}} ) {
+        print $fh <<"EOT";
+static int perl_init_${name}()
+{
+	dTARG;
+	dSP;
+EOT
+        foreach my $j ( @$i ) {
+            $j =~ s{(s\\_[0-9a-f]+)}
+                   { exists($sym->{$1}) ? $sym->{$1} : $default; }ge;
+            print $fh "\t$j\n";
+        }
+        print $fh "\treturn 0;\n}\n";
+
+        $section->SUPER::add( "perl_init_${name}();" );
+        ++$name;
+    }
+    foreach my $i ( @{$section->[-1]{evals}} ) {
+        $section->SUPER::add( sprintf q{eval_pv("%s",1);}, $i );
+    }
+
+    print $fh <<"EOT";
+static int ${init_name}()
+{
+	dTARG;
+	dSP;
+EOT
+    $section->SUPER::output( $fh, $format );
+    print $fh "\treturn 0;\n}\n";
+}
+
+
+package B::C;
+use Exporter ();
+our %REGEXP;
+
+{ # block necessary for caller to work
+    my $caller = caller;
+    if( $caller eq 'O' ) {
+        require XSLoader;
+        XSLoader::load( 'B::C' );
+    }
+}
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(output_all output_boilerplate output_main mark_unused
+		init_sections set_callback save_unused_subs objsym save_context);
+
+use B qw(minus_c sv_undef walkoptree walksymtable main_root main_start peekop
+	 class cstring cchar svref_2object compile_stats comppadlist hash
+	 threadsv_names main_cv init_av end_av regex_padav opnumber amagic_generation
+	 HEf_SVKEY SVf_POK SVf_ROK CVf_CONST);
+use B::Asmdata qw(@specialsv_name);
+
+use FileHandle;
+use Carp;
+use strict;
+use Config;
+
+my $hv_index = 0;
+my $gv_index = 0;
+my $re_index = 0;
+my $pv_index = 0;
+my $cv_index = 0;
+my $anonsub_index = 0;
+my $initsub_index = 0;
+
+my %symtable;
+my %xsub;
+my $warn_undefined_syms;
+my $verbose;
+my %unused_sub_packages;
+my $use_xsloader;
+my $nullop_count;
+my $pv_copy_on_grow = 0;
+my $optimize_ppaddr = 0;
+my $optimize_warn_sv = 0;
+my $use_perl_script_name = 0;
+my $save_data_fh = 0;
+my $save_sig = 0;
+my ($debug_cops, $debug_av, $debug_cv, $debug_mg);
+my $max_string_len;
+
+my $ithreads = $Config{useithreads} eq 'define';
+
+my @threadsv_names;
+BEGIN {
+    @threadsv_names = threadsv_names();
+}
+
+# Code sections
+my ($init, $decl, $symsect, $binopsect, $condopsect, $copsect, 
+    $padopsect, $listopsect, $logopsect, $loopsect, $opsect, $pmopsect,
+    $pvopsect, $svopsect, $unopsect, $svsect, $xpvsect, $xpvavsect,
+    $xpvhvsect, $xpvcvsect, $xpvivsect, $xpvnvsect, $xpvmgsect, $xpvlvsect,
+    $xrvsect, $xpvbmsect, $xpviosect );
+my @op_sections = \( $binopsect, $condopsect, $copsect, $padopsect, $listopsect,
+                     $logopsect, $loopsect, $opsect, $pmopsect, $pvopsect, $svopsect,
+                     $unopsect );
+
+sub walk_and_save_optree;
+my $saveoptree_callback = \&walk_and_save_optree;
+sub set_callback { $saveoptree_callback = shift }
+sub saveoptree { &$saveoptree_callback(@_) }
+
+sub walk_and_save_optree {
+    my ($name, $root, $start) = @_;
+    walkoptree($root, "save");
+    return objsym($start);
+}
+
+# Look this up here so we can do just a number compare
+# rather than looking up the name of every BASEOP in B::OP
+my $OP_THREADSV = opnumber('threadsv');
+
+sub savesym {
+    my ($obj, $value) = @_;
+    my $sym = sprintf("s\\_%x", $$obj);
+    $symtable{$sym} = $value;
+}
+
+sub objsym {
+    my $obj = shift;
+    return $symtable{sprintf("s\\_%x", $$obj)};
+}
+
+sub getsym {
+    my $sym = shift;
+    my $value;
+
+    return 0 if $sym eq "sym_0";	# special case
+    $value = $symtable{$sym};
+    if (defined($value)) {
+	return $value;
+    } else {
+	warn "warning: undefined symbol $sym\n" if $warn_undefined_syms;
+	return "UNUSED";
+    }
+}
+
+sub savere {
+    my $re = shift;
+    my $sym = sprintf("re%d", $re_index++);
+    $decl->add(sprintf("static char *$sym = %s;", cstring($re)));
+
+    return ($sym,length(pack "a*",$re));
+}
+
+sub savepv {
+    my $pv = pack "a*", shift;
+    my $pvsym = 0;
+    my $pvmax = 0;
+    if ($pv_copy_on_grow) {
+        $pvsym = sprintf("pv%d", $pv_index++);
+
+        if( defined $max_string_len && length($pv) > $max_string_len ) {
+            my $chars = join ', ', map { cchar $_ } split //, $pv;
+            $decl->add(sprintf("static char %s[] = { %s };", $pvsym, $chars));
+        }
+        else {
+	     my $cstring = cstring($pv);
+            if ($cstring ne "0") { # sic
+                $decl->add(sprintf("static char %s[] = %s;",
+                                   $pvsym, $cstring));
+	    }
+        }
+    } else {
+	$pvmax = length(pack "a*",$pv) + 1;
+    }
+    return ($pvsym, $pvmax);
+}
+
+sub save_rv {
+    my $sv = shift;
+#    confess "Can't save RV: not ROK" unless $sv->FLAGS & SVf_ROK;
+    my $rv = $sv->RV->save;
+
+    $rv =~ s/^\(([AGHS]V|IO)\s*\*\)\s*(\&sv_list.*)$/$2/;
+
+    return $rv;
+}
+
+# savesym, pvmax, len, pv
+sub save_pv_or_rv {
+    my $sv = shift;
+
+    my $rok = $sv->FLAGS & SVf_ROK;
+    my $pok = $sv->FLAGS & SVf_POK;
+    my( $len, $pvmax, $savesym, $pv ) = ( 0, 0 );
+    if( $rok ) {
+       $savesym = '(char*)' . save_rv( $sv );
+    }
+    else {
+       $pv = $pok ? (pack "a*", $sv->PV) : undef;
+       $len = $pok ? length($pv) : 0;
+       ($savesym, $pvmax) = $pok ? savepv($pv) : ( 'NULL', 0 );
+    }
+
+    return ( $savesym, $pvmax, $len, $pv );
+}
+
+# see also init_op_ppaddr below; initializes the ppaddt to the
+# OpTYPE; init_op_ppaddr iterates over the ops and sets
+# op_ppaddr to PL_ppaddr[op_ppaddr]; this avoids an explicit assignmente
+# in perl_init ( ~10 bytes/op with GCC/i386 )
+sub B::OP::fake_ppaddr {
+    return $optimize_ppaddr ?
+      sprintf("INT2PTR(void*,OP_%s)", uc( $_[0]->name ) ) :
+      'NULL';
+}
+
+# This pair is needed becase B::FAKEOP::save doesn't scalar dereference
+# $op->next and $op->sibling
+
+{
+  # For 5.9 the hard coded text is the values for op_opt and op_static in each
+  # op.  The value of op_opt is irrelevant, and the value of op_static needs to
+  # be 1 to tell op_free that this is a statically defined op and that is
+  # shouldn't be freed.
+
+  # For 5.8:
+  # Current workaround/fix for op_free() trying to free statically
+  # defined OPs is to set op_seq = -1 and check for that in op_free().
+  # Instead of hardwiring -1 in place of $op->seq, we use $op_seq
+  # so that it can be changed back easily if necessary. In fact, to
+  # stop compilers from moaning about a U16 being initialised with an
+  # uncast -1 (the printf format is %d so we can't tweak it), we have
+  # to "know" that op_seq is a U16 and use 65535. Ugh.
+
+  my $static = $] > 5.009 ? '0, 1, 0' : sprintf "%u", 65535;
+  sub B::OP::_save_common_middle {
+    my $op = shift;
+    sprintf ("%s, %u, %u, $static, 0x%x, 0x%x",
+	     $op->fake_ppaddr, $op->targ, $op->type, $op->flags, $op->private);
+  }
+}
+
+sub B::OP::_save_common {
+ my $op = shift;
+ return sprintf("s\\_%x, s\\_%x, %s",
+		${$op->next}, ${$op->sibling}, $op->_save_common_middle);
+}
+
+sub B::OP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    my $type = $op->type;
+    $nullop_count++ unless $type;
+    if ($type == $OP_THREADSV) {
+	# saves looking up ppaddr but it's a bit naughty to hard code this
+	$init->add(sprintf("(void)find_threadsv(%s);",
+			   cstring($threadsv_names[$op->targ])));
+    }
+    $opsect->add($op->_save_common);
+    my $ix = $opsect->index;
+    $init->add(sprintf("op_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+    savesym($op, "&op_list[$ix]");
+}
+
+sub B::FAKEOP::new {
+    my ($class, %objdata) = @_;
+    bless \%objdata, $class;
+}
+
+sub B::FAKEOP::save {
+    my ($op, $level) = @_;
+    $opsect->add(sprintf("%s, %s, %s",
+			 $op->next, $op->sibling, $op->_save_common_middle));
+    my $ix = $opsect->index;
+    $init->add(sprintf("op_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+    return "&op_list[$ix]";
+}
+
+sub B::FAKEOP::next { $_[0]->{"next"} || 0 }
+sub B::FAKEOP::type { $_[0]->{type} || 0}
+sub B::FAKEOP::sibling { $_[0]->{sibling} || 0 }
+sub B::FAKEOP::ppaddr { $_[0]->{ppaddr} || 0 }
+sub B::FAKEOP::targ { $_[0]->{targ} || 0 }
+sub B::FAKEOP::flags { $_[0]->{flags} || 0 }
+sub B::FAKEOP::private { $_[0]->{private} || 0 }
+
+sub B::UNOP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    $unopsect->add(sprintf("%s, s\\_%x", $op->_save_common, ${$op->first}));
+    my $ix = $unopsect->index;
+    $init->add(sprintf("unop_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+    savesym($op, "(OP*)&unop_list[$ix]");
+}
+
+sub B::BINOP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    $binopsect->add(sprintf("%s, s\\_%x, s\\_%x",
+			    $op->_save_common, ${$op->first}, ${$op->last}));
+    my $ix = $binopsect->index;
+    $init->add(sprintf("binop_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+    savesym($op, "(OP*)&binop_list[$ix]");
+}
+
+sub B::LISTOP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    $listopsect->add(sprintf("%s, s\\_%x, s\\_%x",
+			     $op->_save_common, ${$op->first}, ${$op->last}));
+    my $ix = $listopsect->index;
+    $init->add(sprintf("listop_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+    savesym($op, "(OP*)&listop_list[$ix]");
+}
+
+sub B::LOGOP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    $logopsect->add(sprintf("%s, s\\_%x, s\\_%x",
+			    $op->_save_common, ${$op->first}, ${$op->other}));
+    my $ix = $logopsect->index;
+    $init->add(sprintf("logop_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+    savesym($op, "(OP*)&logop_list[$ix]");
+}
+
+sub B::LOOP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    #warn sprintf("LOOP: redoop %s, nextop %s, lastop %s\n",
+    #		 peekop($op->redoop), peekop($op->nextop),
+    #		 peekop($op->lastop)); # debug
+    $loopsect->add(sprintf("%s, s\\_%x, s\\_%x, s\\_%x, s\\_%x, s\\_%x",
+			   $op->_save_common, ${$op->first}, ${$op->last},
+			   ${$op->redoop}, ${$op->nextop},
+			   ${$op->lastop}));
+    my $ix = $loopsect->index;
+    $init->add(sprintf("loop_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+    savesym($op, "(OP*)&loop_list[$ix]");
+}
+
+sub B::PVOP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    $pvopsect->add(sprintf("%s, %s", $op->_save_common, cstring($op->pv)));
+    my $ix = $pvopsect->index;
+    $init->add(sprintf("pvop_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+    savesym($op, "(OP*)&pvop_list[$ix]");
+}
+
+sub B::SVOP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    my $sv = $op->sv;
+    my $svsym = '(SV*)' . $sv->save;
+    my $is_const_addr = $svsym =~ m/Null|\&/;
+    $svopsect->add(sprintf("%s, %s", $op->_save_common,
+			   ( $is_const_addr ? $svsym : 'Nullsv' )));
+    my $ix = $svopsect->index;
+    $init->add(sprintf("svop_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+    $init->add("svop_list[$ix].op_sv = $svsym;")
+        unless $is_const_addr;
+    savesym($op, "(OP*)&svop_list[$ix]");
+}
+
+sub B::PADOP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    $padopsect->add(sprintf("%s, %d",
+			    $op->_save_common, $op->padix));
+    my $ix = $padopsect->index;
+    $init->add(sprintf("padop_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+#    $init->add(sprintf("padop_list[$ix].op_padix = %ld;", $op->padix));
+    savesym($op, "(OP*)&padop_list[$ix]");
+}
+
+sub B::COP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    warn sprintf("COP: line %d file %s\n", $op->line, $op->file)
+	if $debug_cops;
+    # shameless cut'n'paste from B::Deparse
+    my $warn_sv;
+    my $warnings = $op->warnings;
+    my $is_special = $warnings->isa("B::SPECIAL");
+    if ($is_special && $$warnings == 4) {
+        # use warnings 'all';
+        $warn_sv = $optimize_warn_sv ?
+            'INT2PTR(SV*,1)' :
+            'pWARN_ALL';
+    }
+    elsif ($is_special && $$warnings == 5) {
+        # no warnings 'all';
+        $warn_sv = $optimize_warn_sv ?
+            'INT2PTR(SV*,2)' :
+            'pWARN_NONE';
+    }
+    elsif ($is_special) {
+        # use warnings;
+        $warn_sv = $optimize_warn_sv ?
+            'INT2PTR(SV*,3)' :
+            'pWARN_STD';
+    }
+    else {
+        # something else
+        $warn_sv = $warnings->save;
+    }
+
+    $copsect->add(sprintf("%s, %s, NULL, NULL, %u, %d, %u, %s",
+			  $op->_save_common, cstring($op->label), $op->cop_seq,
+			  $op->arybase, $op->line,
+                          ( $optimize_warn_sv ? $warn_sv : 'NULL' )));
+    my $ix = $copsect->index;
+    $init->add(sprintf("cop_list[$ix].op_ppaddr = %s;", $op->ppaddr))
+        unless $optimize_ppaddr;
+    $init->add(sprintf("cop_list[$ix].cop_warnings = %s;", $warn_sv ))
+        unless $optimize_warn_sv;
+    $init->add(sprintf("CopFILE_set(&cop_list[$ix], %s);", cstring($op->file)),
+	       sprintf("CopSTASHPV_set(&cop_list[$ix], %s);", cstring($op->stashpv)));
+
+    savesym($op, "(OP*)&cop_list[$ix]");
+}
+
+sub B::PMOP::save {
+    my ($op, $level) = @_;
+    my $sym = objsym($op);
+    return $sym if defined $sym;
+    my $replroot = $op->pmreplroot;
+    my $replstart = $op->pmreplstart;
+    my $replrootfield;
+    my $replstartfield = sprintf("s\\_%x", $$replstart);
+    my $gvsym;
+    my $ppaddr = $op->ppaddr;
+    # under ithreads, OP_PUSHRE.op_replroot is an integer
+    $replrootfield = sprintf("s\\_%x", $$replroot) if ref $replroot;
+    if($ithreads && $op->name eq "pushre") {
+        $replrootfield = "INT2PTR(OP*,${replroot})";
+    } elsif ($$replroot) {
+	# OP_PUSHRE (a mutated version of OP_MATCH for the regexp
+	# argument to a split) stores a GV in op_pmreplroot instead
+	# of a substitution syntax tree. We don't want to walk that...
+	if ($op->name eq "pushre") {
+	    $gvsym = $replroot->save;
+#	    warn "PMOP::save saving a pp_pushre with GV $gvsym\n"; # debug
+	    $replrootfield = 0;
+	} else {
+	    $replstartfield = saveoptree("*ignore*", $replroot, $replstart);
+	}
+    }
+    # pmnext handling is broken in perl itself, I think. Bad op_pmnext
+    # fields aren't noticed in perl's runtime (unless you try reset) but we
+    # segfault when trying to dereference it to find op->op_pmnext->op_type
+    $pmopsect->add(sprintf("%s, s\\_%x, s\\_%x, %s, %s, 0, %u, 0x%x, 0x%x, 0x%x",
+			   $op->_save_common, ${$op->first}, ${$op->last},
+			   $replrootfield, $replstartfield,
+                           ( $ithreads ? $op->pmoffset : 0 ),
+			   $op->pmflags, $op->pmpermflags, $op->pmdynflags ));
+    my $pm = sprintf("pmop_list[%d]", $pmopsect->index);
+    $init->add(sprintf("$pm.op_ppaddr = %s;", $ppaddr))
+        unless $optimize_ppaddr;
+    my $re = $op->precomp;
+    if (defined($re)) {
+	my( $resym, $relen ) = savere( $re );
+	$init->add(sprintf("PM_SETRE(&$pm,pregcomp($resym, $resym + %u, &$pm));",
+			   $relen));
+    }
+    if ($gvsym) {
+	$init->add("$pm.op_pmreplroot = (OP*)$gvsym;");
+    }
+    savesym($op, "(OP*)&$pm");
+}
+
+sub B::SPECIAL::save {
+    my ($sv) = @_;
+    # special case: $$sv is not the address but an index into specialsv_list
+#   warn "SPECIAL::save specialsv $$sv\n"; # debug
+    my $sym = $specialsv_name[$$sv];
+    if (!defined($sym)) {
+	confess "unknown specialsv index $$sv passed to B::SPECIAL::save";
+    }
+    return $sym;
+}
+
+sub B::OBJECT::save {}
+
+sub B::NULL::save {
+    my ($sv) = @_;
+    my $sym = objsym($sv);
+    return $sym if defined $sym;
+#   warn "Saving SVt_NULL SV\n"; # debug
+    # debug
+    if ($$sv == 0) {
+    	warn "NULL::save for sv = 0 called from @{[(caller(1))[3]]}\n";
+	return savesym($sv, "(void*)Nullsv /* XXX */");
+    }
+    $svsect->add(sprintf("0, %u, 0x%x", $sv->REFCNT , $sv->FLAGS));
+    return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
+}
+
+sub B::IV::save {
+    my ($sv) = @_;
+    my $sym = objsym($sv);
+    return $sym if defined $sym;
+    $xpvivsect->add(sprintf("0, 0, 0, %d", $sv->IVX));
+    $svsect->add(sprintf("&xpviv_list[%d], %lu, 0x%x",
+			 $xpvivsect->index, $sv->REFCNT , $sv->FLAGS));
+    return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
+}
+
+sub B::NV::save {
+    my ($sv) = @_;
+    my $sym = objsym($sv);
+    return $sym if defined $sym;
+    my $val= $sv->NVX;
+    $val .= '.00' if $val =~ /^-?\d+$/;
+    $xpvnvsect->add(sprintf("0, 0, 0, %d, %s", $sv->IVX, $val));
+    $svsect->add(sprintf("&xpvnv_list[%d], %lu, 0x%x",
+			 $xpvnvsect->index, $sv->REFCNT , $sv->FLAGS));
+    return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
+}
+
+sub savepvn {
+    my ($dest,$pv) = @_;
+    my @res;
+    # work with byte offsets/lengths
+    my $pv = pack "a*", $pv;
+    if (defined $max_string_len && length($pv) > $max_string_len) {
+	push @res, sprintf("Newx(%s,%u,char);", $dest, length($pv)+1);
+	my $offset = 0;
+	while (length $pv) {
+	    my $str = substr $pv, 0, $max_string_len, '';
+	    push @res, sprintf("Copy(%s,$dest+$offset,%u,char);",
+			       cstring($str), length($str));
+	    $offset += length $str;
+	}
+	push @res, sprintf("%s[%u] = '\\0';", $dest, $offset);
+    }
+    else {
+	push @res, sprintf("%s = savepvn(%s, %u);", $dest,
+			   cstring($pv), length($pv));
+    }
+    return @res;
+}
+
+sub B::PVLV::save {
+    my ($sv) = @_;
+    my $sym = objsym($sv);
+    return $sym if defined $sym;
+    my $pv = $sv->PV;
+    my $len = length($pv);
+    my ($pvsym, $pvmax) = savepv($pv);
+    my ($lvtarg, $lvtarg_sym);
+    $xpvlvsect->add(sprintf("%s, %u, %u, %d, %g, 0, 0, %u, %u, 0, %s",
+			    $pvsym, $len, $pvmax, $sv->IVX, $sv->NVX, 
+			    $sv->TARGOFF, $sv->TARGLEN, cchar($sv->TYPE)));
+    $svsect->add(sprintf("&xpvlv_list[%d], %lu, 0x%x",
+			 $xpvlvsect->index, $sv->REFCNT , $sv->FLAGS));
+    if (!$pv_copy_on_grow) {
+	$init->add(savepvn(sprintf("xpvlv_list[%d].xpv_pv",
+				   $xpvlvsect->index), $pv));
+    }
+    $sv->save_magic;
+    return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
+}
+
+sub B::PVIV::save {
+    my ($sv) = @_;
+    my $sym = objsym($sv);
+    return $sym if defined $sym;
+    my( $savesym, $pvmax, $len, $pv ) = save_pv_or_rv( $sv );
+    $xpvivsect->add(sprintf("%s, %u, %u, %d", $savesym, $len, $pvmax, $sv->IVX));
+    $svsect->add(sprintf("&xpviv_list[%d], %u, 0x%x",
+			 $xpvivsect->index, $sv->REFCNT , $sv->FLAGS));
+    if (defined($pv) && !$pv_copy_on_grow) {
+	$init->add(savepvn(sprintf("xpviv_list[%d].xpv_pv",
+				   $xpvivsect->index), $pv));
+    }
+    return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
+}
+
+sub B::PVNV::save {
+    my ($sv) = @_;
+    my $sym = objsym($sv);
+    return $sym if defined $sym;
+    my( $savesym, $pvmax, $len, $pv ) = save_pv_or_rv( $sv );
+    my $val= $sv->NVX;
+    $val .= '.00' if $val =~ /^-?\d+$/;
+    $xpvnvsect->add(sprintf("%s, %u, %u, %d, %s",
+			    $savesym, $len, $pvmax, $sv->IVX, $val));
+    $svsect->add(sprintf("&xpvnv_list[%d], %lu, 0x%x",
+			 $xpvnvsect->index, $sv->REFCNT , $sv->FLAGS));
+    if (defined($pv) && !$pv_copy_on_grow) {
+	$init->add(savepvn(sprintf("xpvnv_list[%d].xpv_pv",
+				   $xpvnvsect->index), $pv));
+    }
+    return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
+}
+
+sub B::BM::save {
+    my ($sv) = @_;
+    my $sym = objsym($sv);
+    return $sym if defined $sym;
+    my $pv = pack "a*", ($sv->PV . "\0" . $sv->TABLE);
+    my $len = length($pv);
+    $xpvbmsect->add(sprintf("0, %u, %u, %d, %s, 0, 0, %d, %u, 0x%x",
+			    $len, $len + 258, $sv->IVX, $sv->NVX,
+			    $sv->USEFUL, $sv->PREVIOUS, $sv->RARE));
+    $svsect->add(sprintf("&xpvbm_list[%d], %lu, 0x%x",
+			 $xpvbmsect->index, $sv->REFCNT , $sv->FLAGS));
+    $sv->save_magic;
+    $init->add(savepvn(sprintf("xpvbm_list[%d].xpv_pv",
+			       $xpvbmsect->index), $pv),
+	       sprintf("xpvbm_list[%d].xpv_cur = %u;",
+		       $xpvbmsect->index, $len - 257));
+    return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
+}
+
+sub B::PV::save {
+    my ($sv) = @_;
+    my $sym = objsym($sv);
+    return $sym if defined $sym;
+    my( $savesym, $pvmax, $len, $pv ) = save_pv_or_rv( $sv );
+    $xpvsect->add(sprintf("%s, %u, %u", $savesym, $len, $pvmax));
+    $svsect->add(sprintf("&xpv_list[%d], %lu, 0x%x",
+			 $xpvsect->index, $sv->REFCNT , $sv->FLAGS));
+    if (defined($pv) && !$pv_copy_on_grow) {
+	$init->add(savepvn(sprintf("xpv_list[%d].xpv_pv",
+				   $xpvsect->index), $pv));
+    }
+    return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
+}
+
+sub B::PVMG::save {
+    my ($sv) = @_;
+    my $sym = objsym($sv);
+    return $sym if defined $sym;
+    my( $savesym, $pvmax, $len, $pv ) = save_pv_or_rv( $sv );
+
+    $xpvmgsect->add(sprintf("%s, %u, %u, %d, %s, 0, 0",
+                            $savesym, $len, $pvmax,
+                            $sv->IVX, $sv->NVX));
+    $svsect->add(sprintf("&xpvmg_list[%d], %lu, 0x%x",
+                         $xpvmgsect->index, $sv->REFCNT , $sv->FLAGS));
+    if (defined($pv) && !$pv_copy_on_grow) {
+        $init->add(savepvn(sprintf("xpvmg_list[%d].xpv_pv",
+                                   $xpvmgsect->index), $pv));
+    }
+    $sym = savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
+    $sv->save_magic;
+    return $sym;
+}
+
+sub B::PVMG::save_magic {
+    my ($sv) = @_;
+    #warn sprintf("saving magic for %s (0x%x)\n", class($sv), $$sv); # debug
+    my $stash = $sv->SvSTASH;
+    $stash->save;
+    if ($$stash) {
+	warn sprintf("xmg_stash = %s (0x%x)\n", $stash->NAME, $$stash)
+	    if $debug_mg;
+	# XXX Hope stash is already going to be saved.
+	$init->add(sprintf("SvSTASH(s\\_%x) = s\\_%x;", $$sv, $$stash));
+    }
+    my @mgchain = $sv->MAGIC;
+    my ($mg, $type, $obj, $ptr,$len,$ptrsv);
+    foreach $mg (@mgchain) {
+	$type = $mg->TYPE;
+	$ptr = $mg->PTR;
+	$len=$mg->LENGTH;
+	if ($debug_mg) {
+	    warn sprintf("magic %s (0x%x), obj %s (0x%x), type %s, ptr %s\n",
+			 class($sv), $$sv, class($obj), $$obj,
+			 cchar($type), cstring($ptr));
+	}
+
+        unless( $type eq 'r' ) {
+          $obj = $mg->OBJ;
+          $obj->save;
+        }
+
+	if ($len == HEf_SVKEY){
+		#The pointer is an SV*
+		$ptrsv=svref_2object($ptr)->save;
+		$init->add(sprintf("sv_magic((SV*)s\\_%x, (SV*)s\\_%x, %s,(char *) %s, %d);",
+			   $$sv, $$obj, cchar($type),$ptrsv,$len));
+        }elsif( $type eq 'r' ){
+            my $rx = $mg->REGEX;
+            my $pmop = $REGEXP{$rx};
+
+            confess "PMOP not found for REGEXP $rx" unless $pmop;
+
+            my( $resym, $relen ) = savere( $mg->precomp );
+            my $pmsym = $pmop->save;
+            $init->add( split /\n/, sprintf <<CODE, $$sv, cchar($type), cstring($ptr) );
+{
+    REGEXP* rx = pregcomp($resym, $resym + $relen, (PMOP*)$pmsym);
+    sv_magic((SV*)s\\_%x, (SV*)rx, %s, %s, %d);
+}
+CODE
+        }else{
+		$init->add(sprintf("sv_magic((SV*)s\\_%x, (SV*)s\\_%x, %s, %s, %d);",
+			   $$sv, $$obj, cchar($type),cstring($ptr),$len));
+	}
+    }
+}
+
+sub B::RV::save {
+    my ($sv) = @_;
+    my $sym = objsym($sv);
+    return $sym if defined $sym;
+    my $rv = save_rv( $sv );
+    # GVs need to be handled at runtime
+    if( ref( $sv->RV ) eq 'B::GV' ) {
+        $xrvsect->add( "(SV*)Nullgv" );
+        $init->add(sprintf("xrv_list[%d].xrv_rv = (SV*)%s;\n", $xrvsect->index, $rv));
+    }
+    # and stashes, too
+    elsif( $sv->RV->isa( 'B::HV' ) && $sv->RV->NAME ) {
+        $xrvsect->add( "(SV*)Nullhv" );
+        $init->add(sprintf("xrv_list[%d].xrv_rv = (SV*)%s;\n", $xrvsect->index, $rv));
+    }
+    else {
+        $xrvsect->add($rv);
+    }
+    $svsect->add(sprintf("&xrv_list[%d], %lu, 0x%x",
+			 $xrvsect->index, $sv->REFCNT , $sv->FLAGS));
+    return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
+}
+
+sub try_autoload {
+    my ($cvstashname, $cvname) = @_;
+    warn sprintf("No definition for sub %s::%s\n", $cvstashname, $cvname);
+    # Handle AutoLoader classes explicitly. Any more general AUTOLOAD
+    # use should be handled by the class itself.
+    no strict 'refs';
+    my $isa = \@{"$cvstashname\::ISA"};
+    if (grep($_ eq "AutoLoader", @$isa)) {
+	warn "Forcing immediate load of sub derived from AutoLoader\n";
+	# Tweaked version of AutoLoader::AUTOLOAD
+	my $dir = $cvstashname;
+	$dir =~ s(::)(/)g;
+	eval { require "auto/$dir/$cvname.al" };
+	if ($@) {
+	    warn qq(failed require "auto/$dir/$cvname.al": $@\n);
+	    return 0;
+	} else {
+	    return 1;
+	}
+    }
+}
+sub Dummy_initxs{};
+sub B::CV::save {
+    my ($cv) = @_;
+    my $sym = objsym($cv);
+    if (defined($sym)) {
+#	warn sprintf("CV 0x%x already saved as $sym\n", $$cv); # debug
+	return $sym;
+    }
+    # Reserve a place in svsect and xpvcvsect and record indices
+    my $gv = $cv->GV;
+    my ($cvname, $cvstashname);
+    if ($$gv){
+    	$cvname = $gv->NAME;
+    	$cvstashname = $gv->STASH->NAME;
+    }
+    my $root = $cv->ROOT;
+    my $cvxsub = $cv->XSUB;
+    my $isconst = $cv->CvFLAGS & CVf_CONST;
+    if( $isconst ) {
+        my $value = $cv->XSUBANY;
+        my $stash = $gv->STASH;
+        my $vsym = $value->save;
+        my $stsym = $stash->save;
+        my $name = cstring($cvname);
+        $decl->add( "static CV* cv$cv_index;" );
+        $init->add( "cv$cv_index = newCONSTSUB( $stsym, NULL, $vsym );" );
+        my $sym = savesym( $cv, "cv$cv_index" );
+        $cv_index++;
+        return $sym;
+    }
+    #INIT is removed from the symbol table, so this call must come
+    # from PL_initav->save. Re-bootstrapping  will push INIT back in
+    # so nullop should be sent.
+    if (!$isconst && $cvxsub && ($cvname ne "INIT")) {
+	my $egv = $gv->EGV;
+	my $stashname = $egv->STASH->NAME;
+         if ($cvname eq "bootstrap")
+          { 
+           my $file = $gv->FILE;
+           $decl->add("/* bootstrap $file */"); 
+           warn "Bootstrap $stashname $file\n";
+           # if it not isa('DynaLoader'), it should hopefully be XSLoaded
+           # ( attributes being an exception, of course )
+           if( $stashname ne 'attributes' &&
+               !UNIVERSAL::isa($stashname,'DynaLoader') ) {
+            $xsub{$stashname}='Dynamic-XSLoaded';
+            $use_xsloader = 1;
+           }
+           else {
+            $xsub{$stashname}='Dynamic';
+           }
+	   # $xsub{$stashname}='Static' unless  $xsub{$stashname};
+           return qq/NULL/;
+          }
+         else
+          {
+           # XSUBs for IO::File, IO::Handle, IO::Socket,
+           # IO::Seekable and IO::Poll
+           # are defined in IO.xs, so let's bootstrap it
+           svref_2object( \&IO::bootstrap )->save
+            if grep { $stashname eq $_ } qw(IO::File IO::Handle IO::Socket
+                                              IO::Seekable IO::Poll);
+          }
+        warn sprintf("stub for XSUB $cvstashname\:\:$cvname CV 0x%x\n", $$cv) if $debug_cv;
+	return qq/(perl_get_cv("$stashname\:\:$cvname",TRUE))/;
+    }
+    if ($cvxsub && $cvname eq "INIT") {
+	 no strict 'refs';
+   	 return svref_2object(\&Dummy_initxs)->save;
+    }
+    my $sv_ix = $svsect->index + 1;
+    $svsect->add("svix$sv_ix");
+    my $xpvcv_ix = $xpvcvsect->index + 1;
+    $xpvcvsect->add("xpvcvix$xpvcv_ix");
+    # Save symbol now so that GvCV() doesn't recurse back to us via CvGV()
+    $sym = savesym($cv, "&sv_list[$sv_ix]");
+    warn sprintf("saving $cvstashname\:\:$cvname CV 0x%x as $sym\n", $$cv) if $debug_cv;
+    if (!$$root && !$cvxsub) {
+	if (try_autoload($cvstashname, $cvname)) {
+	    # Recalculate root and xsub
+	    $root = $cv->ROOT;
+	    $cvxsub = $cv->XSUB;
+	    if ($$root || $cvxsub) {
+		warn "Successful forced autoload\n";
+	    }
+	}
+    }
+    my $startfield = 0;
+    my $padlist = $cv->PADLIST;
+    my $pv = $cv->PV;
+    my $xsub = 0;
+    my $xsubany = "Nullany";
+    if ($$root) {
+	warn sprintf("saving op tree for CV 0x%x, root = 0x%x\n",
+		     $$cv, $$root) if $debug_cv;
+	my $ppname = "";
+	if ($$gv) {
+	    my $stashname = $gv->STASH->NAME;
+	    my $gvname = $gv->NAME;
+	    if ($gvname ne "__ANON__") {
+		$ppname = (${$gv->FORM} == $$cv) ? "pp_form_" : "pp_sub_";
+		$ppname .= ($stashname eq "main") ?
+			    $gvname : "$stashname\::$gvname";
+		$ppname =~ s/::/__/g;
+	        if ($gvname eq "INIT"){
+		       $ppname .= "_$initsub_index";
+		       $initsub_index++;
+		    }
+	    }
+	}
+	if (!$ppname) {
+	    $ppname = "pp_anonsub_$anonsub_index";
+	    $anonsub_index++;
+	}
+	$startfield = saveoptree($ppname, $root, $cv->START, $padlist->ARRAY);
+	warn sprintf("done saving op tree for CV 0x%x, name %s, root 0x%x\n",
+		     $$cv, $ppname, $$root) if $debug_cv;
+	if ($$padlist) {
+	    warn sprintf("saving PADLIST 0x%x for CV 0x%x\n",
+			 $$padlist, $$cv) if $debug_cv;
+	    $padlist->save;
+	    warn sprintf("done saving PADLIST 0x%x for CV 0x%x\n",
+			 $$padlist, $$cv) if $debug_cv;
+	}
+    }
+    else {
+	warn sprintf("No definition for sub %s::%s (unable to autoload)\n",
+		     $cvstashname, $cvname); # debug
+    }              
+    $pv = '' unless defined $pv; # Avoid use of undef warnings
+    $symsect->add(sprintf("xpvcvix%d\t%s, %u, 0, %d, %s, 0, Nullhv, Nullhv, %s, s\\_%x, $xsub, $xsubany, Nullgv, \"\", %d, s\\_%x, (CV*)s\\_%x, 0x%x, 0x%x",
+			  $xpvcv_ix, cstring($pv), length($pv), $cv->IVX,
+			  $cv->NVX, $startfield, ${$cv->ROOT}, $cv->DEPTH,
+                        $$padlist, ${$cv->OUTSIDE}, $cv->CvFLAGS,
+			$cv->OUTSIDE_SEQ));
+
+    if (${$cv->OUTSIDE} == ${main_cv()}){
+	$init->add(sprintf("CvOUTSIDE(s\\_%x)=PL_main_cv;",$$cv));
+	$init->add(sprintf("SvREFCNT_inc(PL_main_cv);"));
+    }
+
+    if ($$gv) {
+	$gv->save;
+	$init->add(sprintf("CvGV(s\\_%x) = s\\_%x;",$$cv,$$gv));
+	warn sprintf("done saving GV 0x%x for CV 0x%x\n",
+		     $$gv, $$cv) if $debug_cv;
+    }
+    if( $ithreads ) {
+        $init->add( savepvn( "CvFILE($sym)", $cv->FILE) );
+    }
+    else {
+        $init->add(sprintf("CvFILE($sym) = %s;", cstring($cv->FILE)));
+    }
+    my $stash = $cv->STASH;
+    if ($$stash) {
+	$stash->save;
+	$init->add(sprintf("CvSTASH(s\\_%x) = s\\_%x;", $$cv, $$stash));
+	warn sprintf("done saving STASH 0x%x for CV 0x%x\n",
+		     $$stash, $$cv) if $debug_cv;
+    }
+    $symsect->add(sprintf("svix%d\t(XPVCV*)&xpvcv_list[%u], %lu, 0x%x",
+			  $sv_ix, $xpvcv_ix, $cv->REFCNT +1*0 , $cv->FLAGS));
+    return $sym;
+}
+
+sub B::GV::save {
+    my ($gv) = @_;
+    my $sym = objsym($gv);
+    if (defined($sym)) {
+	#warn sprintf("GV 0x%x already saved as $sym\n", $$gv); # debug
+	return $sym;
+    } else {
+	my $ix = $gv_index++;
+	$sym = savesym($gv, "gv_list[$ix]");
+	#warn sprintf("Saving GV 0x%x as $sym\n", $$gv); # debug
+    }
+    my $is_empty = $gv->is_empty;
+    my $gvname = $gv->NAME;
+    my $fullname = $gv->STASH->NAME . "::" . $gvname;
+    my $name = cstring($fullname);
+    #warn "GV name is $name\n"; # debug
+    my $egvsym;
+    unless ($is_empty) {
+	my $egv = $gv->EGV;
+	if ($$gv != $$egv) {
+	    #warn(sprintf("EGV name is %s, saving it now\n",
+	    #	     $egv->STASH->NAME . "::" . $egv->NAME)); # debug
+	    $egvsym = $egv->save;
+	}
+    }
+    $init->add(qq[$sym = gv_fetchpv($name, TRUE, SVt_PV);],
+	       sprintf("SvFLAGS($sym) = 0x%x;", $gv->FLAGS ),
+	       sprintf("GvFLAGS($sym) = 0x%x;", $gv->GvFLAGS));
+    $init->add(sprintf("GvLINE($sym) = %u;", $gv->LINE)) unless $is_empty;
+    # XXX hack for when Perl accesses PVX of GVs
+    $init->add("SvPVX($sym) = emptystring;\n");
+    # Shouldn't need to do save_magic since gv_fetchpv handles that
+    #$gv->save_magic;
+    # XXX will always be > 1!!!
+    my $refcnt = $gv->REFCNT + 1;
+    $init->add(sprintf("SvREFCNT($sym) += %u;", $refcnt - 1 )) if $refcnt > 1;
+
+    return $sym if $is_empty;
+
+    # XXX B::walksymtable creates an extra reference to the GV
+    my $gvrefcnt = $gv->GvREFCNT;
+    if ($gvrefcnt > 1) {
+	$init->add(sprintf("GvREFCNT($sym) += %u;", $gvrefcnt - 1));
+    }
+    # some non-alphavetic globs require some parts to be saved
+    # ( ex. %!, but not $! )
+    sub Save_HV() { 1 }
+    sub Save_AV() { 2 }
+    sub Save_SV() { 4 }
+    sub Save_CV() { 8 }
+    sub Save_FORM() { 16 }
+    sub Save_IO() { 32 }
+    my $savefields = 0;
+    if( $gvname !~ /^([^A-Za-z]|STDIN|STDOUT|STDERR|ARGV|SIG|ENV)$/ ) {
+        $savefields = Save_HV|Save_AV|Save_SV|Save_CV|Save_FORM|Save_IO;
+    }
+    elsif( $gvname eq '!' ) {
+        $savefields = Save_HV;
+    }
+    # attributes::bootstrap is created in perl_parse
+    # saving it would overwrite it, because perl_init() is
+    # called after perl_parse()
+    $savefields&=~Save_CV if $fullname eq 'attributes::bootstrap';
+
+    # save it
+    # XXX is that correct?
+    if (defined($egvsym) && $egvsym !~ m/Null/ ) {
+	# Shared glob *foo = *bar
+	$init->add("gp_free($sym);",
+		   "GvGP($sym) = GvGP($egvsym);");
+    } elsif ($savefields) {
+	# Don't save subfields of special GVs (*_, *1, *# and so on)
+#	warn "GV::save saving subfields\n"; # debug
+	my $gvsv = $gv->SV;
+	if ($$gvsv && $savefields&Save_SV) {
+	    $gvsv->save;
+	    $init->add(sprintf("GvSV($sym) = s\\_%x;", $$gvsv));
+#	    warn "GV::save \$$name\n"; # debug
+	}
+	my $gvav = $gv->AV;
+	if ($$gvav && $savefields&Save_AV) {
+	    $gvav->save;
+	    $init->add(sprintf("GvAV($sym) = s\\_%x;", $$gvav));
+#	    warn "GV::save \@$name\n"; # debug
+	}
+	my $gvhv = $gv->HV;
+	if ($$gvhv && $savefields&Save_HV) {
+	    $gvhv->save;
+	    $init->add(sprintf("GvHV($sym) = s\\_%x;", $$gvhv));
+#	    warn "GV::save \%$name\n"; # debug
+	}
+	my $gvcv = $gv->CV;
+	if ($$gvcv && $savefields&Save_CV) {
+	    my $origname=cstring($gvcv->GV->EGV->STASH->NAME .
+		 "::" . $gvcv->GV->EGV->NAME);  
+	    if (0 && $gvcv->XSUB && $name ne $origname) { #XSUB alias
+	        # must save as a 'stub' so newXS() has a CV to populate
+                $init->add("{ CV *cv;");
+                $init->add("\tcv=perl_get_cv($origname,TRUE);");
+                $init->add("\tGvCV($sym)=cv;");
+                $init->add("\tSvREFCNT_inc((SV *)cv);");
+                $init->add("}");    
+	    } else {
+               $init->add(sprintf("GvCV($sym) = (CV*)(%s);", $gvcv->save));
+#              warn "GV::save &$name\n"; # debug
+	    } 
+        }     
+	$init->add(sprintf("GvFILE($sym) = %s;", cstring($gv->FILE)));
+#	warn "GV::save GvFILE(*$name)\n"; # debug
+	my $gvform = $gv->FORM;
+	if ($$gvform && $savefields&Save_FORM) {
+	    $gvform->save;
+	    $init->add(sprintf("GvFORM($sym) = (CV*)s\\_%x;", $$gvform));
+#	    warn "GV::save GvFORM(*$name)\n"; # debug
+	}
+	my $gvio = $gv->IO;
+	if ($$gvio && $savefields&Save_IO) {
+	    $gvio->save;
+	    $init->add(sprintf("GvIOp($sym) = s\\_%x;", $$gvio));
+            if( $fullname =~ m/::DATA$/ && $save_data_fh ) {
+                no strict 'refs';
+                my $fh = *{$fullname}{IO};
+                use strict 'refs';
+                $gvio->save_data( $fullname, <$fh> ) if $fh->opened;
+            }
+#	    warn "GV::save GvIO(*$name)\n"; # debug
+	}
+    }
+    return $sym;
+}
+
+sub B::AV::save {
+    my ($av) = @_;
+    my $sym = objsym($av);
+    return $sym if defined $sym;
+    my $line = "0, -1, -1, 0, 0.0, 0, Nullhv, 0, 0";
+    $line .= sprintf(", 0x%x", $av->AvFLAGS) if $] < 5.009;
+    $xpvavsect->add($line);
+    $svsect->add(sprintf("&xpvav_list[%d], %lu, 0x%x",
+			 $xpvavsect->index, $av->REFCNT  , $av->FLAGS));
+    my $sv_list_index = $svsect->index;
+    my $fill = $av->FILL;
+    $av->save_magic;
+    if ($debug_av) {
+	$line = sprintf("saving AV 0x%x FILL=$fill", $$av);
+	$line .= sprintf(" AvFLAGS=0x%x", $av->AvFLAGS) if $] < 5.009;
+	warn $line;
+    }
+    # XXX AVf_REAL is wrong test: need to save comppadlist but not stack
+    #if ($fill > -1 && ($avflags & AVf_REAL)) {
+    if ($fill > -1) {
+	my @array = $av->ARRAY;
+	if ($debug_av) {
+	    my $el;
+	    my $i = 0;
+	    foreach $el (@array) {
+		warn sprintf("AV 0x%x[%d] = %s 0x%x\n",
+			     $$av, $i++, class($el), $$el);
+	    }
+	}
+#	my @names = map($_->save, @array);
+	# XXX Better ways to write loop?
+	# Perhaps svp[0] = ...; svp[1] = ...; svp[2] = ...;
+	# Perhaps I32 i = 0; svp[i++] = ...; svp[i++] = ...; svp[i++] = ...;
+
+        # micro optimization: op/pat.t ( and other code probably )
+        # has very large pads ( 20k/30k elements ) passing them to
+        # ->add is a performance bottleneck: passing them as a
+        # single string cuts runtime from 6min20sec to 40sec
+
+        # you want to keep this out of the no_split/split
+        # map("\t*svp++ = (SV*)$_;", @names),
+        my $acc = '';
+        foreach my $i ( 0..$#array ) {
+              $acc .= "\t*svp++ = (SV*)" . $array[$i]->save . ";\n\t";
+        }
+        $acc .= "\n";
+
+        $init->no_split;
+	$init->add("{",
+		   "\tSV **svp;",
+		   "\tAV *av = (AV*)&sv_list[$sv_list_index];",
+		   "\tav_extend(av, $fill);",
+		   "\tsvp = AvARRAY(av);" );
+        $init->add($acc);
+	$init->add("\tAvFILLp(av) = $fill;",
+		   "}");
+        $init->split;
+        # we really added a lot of lines ( B::C::InitSection->add
+        # should really scan for \n, but that would slow
+        # it down
+        $init->inc_count( $#array );
+    } else {
+	my $max = $av->MAX;
+	$init->add("av_extend((AV*)&sv_list[$sv_list_index], $max);")
+	    if $max > -1;
+    }
+    return savesym($av, "(AV*)&sv_list[$sv_list_index]");
+}
+
+sub B::HV::save {
+    my ($hv) = @_;
+    my $sym = objsym($hv);
+    return $sym if defined $sym;
+    my $name = $hv->NAME;
+    if ($name) {
+	# It's a stash
+
+	# A perl bug means HvPMROOT isn't altered when a PMOP is freed. Usually
+	# the only symptom is that sv_reset tries to reset the PMf_USED flag of
+	# a trashed op but we look at the trashed op_type and segfault.
+	#my $adpmroot = ${$hv->PMROOT};
+	my $adpmroot = 0;
+	$decl->add("static HV *hv$hv_index;");
+	# XXX Beware of weird package names containing double-quotes, \n, ...?
+	$init->add(qq[hv$hv_index = gv_stashpv("$name", TRUE);]);
+	if ($adpmroot) {
+	    $init->add(sprintf("HvPMROOT(hv$hv_index) = (PMOP*)s\\_%x;",
+			       $adpmroot));
+	}
+	$sym = savesym($hv, "hv$hv_index");
+	$hv_index++;
+	return $sym;
+    }
+    # It's just an ordinary HV
+    $xpvhvsect->add(sprintf("0, 0, %d, 0, 0.0, 0, Nullhv, %d, 0, 0, 0",
+			    $hv->MAX, $hv->RITER));
+    $svsect->add(sprintf("&xpvhv_list[%d], %lu, 0x%x",
+			 $xpvhvsect->index, $hv->REFCNT  , $hv->FLAGS));
+    my $sv_list_index = $svsect->index;
+    my @contents = $hv->ARRAY;
+    if (@contents) {
+	my $i;
+	for ($i = 1; $i < @contents; $i += 2) {
+	    $contents[$i] = $contents[$i]->save;
+	}
+        $init->no_split;
+	$init->add("{", "\tHV *hv = (HV*)&sv_list[$sv_list_index];");
+	while (@contents) {
+	    my ($key, $value) = splice(@contents, 0, 2);
+	    $init->add(sprintf("\thv_store(hv, %s, %u, %s, %s);",
+			       cstring($key),length(pack "a*",$key),
+                               $value, hash($key)));
+#	    $init->add(sprintf("\thv_store(hv, %s, %u, %s, %s);",
+#			       cstring($key),length($key),$value, 0));
+	}
+	$init->add("}");
+        $init->split;
+    }
+    $hv->save_magic();
+    return savesym($hv, "(HV*)&sv_list[$sv_list_index]");
+}
+
+sub B::IO::save_data {
+    my( $io, $globname, @data ) = @_;
+    my $data = join '', @data;
+
+    # XXX using $DATA might clobber it!
+    my $sym = svref_2object( \\$data )->save;
+    $init->add( split /\n/, <<CODE );
+    {
+        GV* gv = (GV*)gv_fetchpv( "$globname", TRUE, SVt_PV );
+        SV* sv = $sym;
+        GvSV( gv ) = sv;
+    }
+CODE
+    # for PerlIO::scalar
+    $use_xsloader = 1;
+    $init->add_eval( sprintf 'open(%s, "<", $%s)', $globname, $globname );
+}
+
+sub B::IO::save {
+    my ($io) = @_;
+    my $sym = objsym($io);
+    return $sym if defined $sym;
+    my $pv = $io->PV;
+    $pv = '' unless defined $pv;
+    my $len = length($pv);
+    $xpviosect->add(sprintf("0, %u, %u, %d, %s, 0, 0, 0, 0, 0, %d, %d, %d, %d, %s, Nullgv, %s, Nullgv, %s, Nullgv, %d, %s, 0x%x",
+			    $len, $len+1, $io->IVX, $io->NVX, $io->LINES,
+			    $io->PAGE, $io->PAGE_LEN, $io->LINES_LEFT,
+			    cstring($io->TOP_NAME), cstring($io->FMT_NAME), 
+			    cstring($io->BOTTOM_NAME), $io->SUBPROCESS,
+			    cchar($io->IoTYPE), $io->IoFLAGS));
+    $svsect->add(sprintf("&xpvio_list[%d], %lu, 0x%x",
+			 $xpviosect->index, $io->REFCNT , $io->FLAGS));
+    $sym = savesym($io, sprintf("(IO*)&sv_list[%d]", $svsect->index));
+    # deal with $x = *STDIN/STDOUT/STDERR{IO}
+    my $perlio_func;
+    foreach ( qw(stdin stdout stderr) ) {
+        $io->IsSTD($_) and $perlio_func = $_;
+    }
+    if( $perlio_func ) {
+        $init->add( "IoIFP(${sym})=PerlIO_${perlio_func}();" );
+        $init->add( "IoOFP(${sym})=PerlIO_${perlio_func}();" );
+    }
+
+    my ($field, $fsym);
+    foreach $field (qw(TOP_GV FMT_GV BOTTOM_GV)) {
+      	$fsym = $io->$field();
+	if ($$fsym) {
+	    $init->add(sprintf("Io$field($sym) = (GV*)s\\_%x;", $$fsym));
+	    $fsym->save;
+	}
+    }
+    $io->save_magic;
+    return $sym;
+}
+
+sub B::SV::save {
+    my $sv = shift;
+    # This is where we catch an honest-to-goodness Nullsv (which gets
+    # blessed into B::SV explicitly) and any stray erroneous SVs.
+    return 0 unless $$sv;
+    confess sprintf("cannot save that type of SV: %s (0x%x)\n",
+		    class($sv), $$sv);
+}
+
+sub output_all {
+    my $init_name = shift;
+    my $section;
+    my @sections = ($opsect, $unopsect, $binopsect, $logopsect, $condopsect,
+		    $listopsect, $pmopsect, $svopsect, $padopsect, $pvopsect,
+		    $loopsect, $copsect, $svsect, $xpvsect,
+		    $xpvavsect, $xpvhvsect, $xpvcvsect, $xpvivsect, $xpvnvsect,
+		    $xpvmgsect, $xpvlvsect, $xrvsect, $xpvbmsect, $xpviosect);
+    $symsect->output(\*STDOUT, "#define %s\n");
+    print "\n";
+    output_declarations();
+    foreach $section (@sections) {
+	my $lines = $section->index + 1;
+	if ($lines) {
+	    my $name = $section->name;
+	    my $typename = ($name eq "xpvcv") ? "XPVCV_or_similar" : uc($name);
+	    print "Static $typename ${name}_list[$lines];\n";
+	}
+    }
+    # XXX hack for when Perl accesses PVX of GVs
+    print 'Static char emptystring[] = "\0";';
+
+    $decl->output(\*STDOUT, "%s\n");
+    print "\n";
+    foreach $section (@sections) {
+	my $lines = $section->index + 1;
+	if ($lines) {
+	    my $name = $section->name;
+	    my $typename = ($name eq "xpvcv") ? "XPVCV_or_similar" : uc($name);
+	    printf "static %s %s_list[%u] = {\n", $typename, $name, $lines;
+	    $section->output(\*STDOUT, "\t{ %s }, /* %d */\n");
+	    print "};\n\n";
+	}
+    }
+
+    $init->output(\*STDOUT, "\t%s\n", $init_name );
+    if ($verbose) {
+	warn compile_stats();
+	warn "NULLOP count: $nullop_count\n";
+    }
+}
+
+sub output_declarations {
+    print <<'EOT';
+#ifdef BROKEN_STATIC_REDECL
+#define Static extern
+#else
+#define Static static
+#endif /* BROKEN_STATIC_REDECL */
+
+#ifdef BROKEN_UNION_INIT
+/*
+ * Cribbed from cv.h with ANY (a union) replaced by void*.
+ * Some pre-Standard compilers can't cope with initialising unions. Ho hum.
+ */
+typedef struct {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xp_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    IV		xof_off;	/* integer value */
+    NV		xnv_nv;		/* numeric value, if any */
+    MAGIC*	xmg_magic;	/* magic for scalar array */
+    HV*		xmg_stash;	/* class package */
+
+    HV *	xcv_stash;
+    OP *	xcv_start;
+    OP *	xcv_root;
+    void      (*xcv_xsub) (pTHX_ CV*);
+    ANY		xcv_xsubany;
+    GV *	xcv_gv;
+    char *	xcv_file;
+    long	xcv_depth;	/* >= 2 indicates recursive call */
+    AV *	xcv_padlist;
+    CV *	xcv_outside;
+EOT
+    print <<'EOT' if $] < 5.009;
+#ifdef USE_5005THREADS
+    perl_mutex *xcv_mutexp;
+    struct perl_thread *xcv_owner;	/* current owner thread */
+#endif /* USE_5005THREADS */
+EOT
+    print <<'EOT';
+    cv_flags_t	xcv_flags;
+    U32		xcv_outside_seq; /* the COP sequence (at the point of our
+				  * compilation) in the lexically enclosing
+				  * sub */
+} XPVCV_or_similar;
+#define ANYINIT(i) i
+#else
+#define XPVCV_or_similar XPVCV
+#define ANYINIT(i) {i}
+#endif /* BROKEN_UNION_INIT */
+#define Nullany ANYINIT(0)
+
+#define UNUSED 0
+#define sym_0 0
+EOT
+    print "static GV *gv_list[$gv_index];\n" if $gv_index;
+    print "\n";
+}
+
+
+sub output_boilerplate {
+    print <<'EOT';
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+/* Workaround for mapstart: the only op which needs a different ppaddr */
+#undef Perl_pp_mapstart
+#define Perl_pp_mapstart Perl_pp_grepstart
+#undef OP_MAPSTART
+#define OP_MAPSTART OP_GREPSTART
+#define XS_DynaLoader_boot_DynaLoader boot_DynaLoader
+EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
+
+static void xs_init (pTHX);
+static void dl_init (pTHX);
+static PerlInterpreter *my_perl;
+EOT
+}
+
+sub init_op_addr {
+    my( $op_type, $num ) = @_;
+    my $op_list = $op_type."_list";
+
+    $init->add( split /\n/, <<EOT );
+    {
+        int i;
+
+        for( i = 0; i < ${num}; ++i )
+        {
+            ${op_list}\[i].op_ppaddr = PL_ppaddr[INT2PTR(int,${op_list}\[i].op_ppaddr)];
+        }
+    }
+EOT
+}
+
+sub init_op_warn {
+    my( $op_type, $num ) = @_;
+    my $op_list = $op_type."_list";
+
+    # for resons beyond imagination, MSVC5 considers pWARN_ALL non-const
+    $init->add( split /\n/, <<EOT );
+    {
+        int i;
+
+        for( i = 0; i < ${num}; ++i )
+        {
+            switch( (int)(${op_list}\[i].cop_warnings) )
+            {
+            case 1:
+                ${op_list}\[i].cop_warnings = pWARN_ALL;
+                break;
+            case 2:
+                ${op_list}\[i].cop_warnings = pWARN_NONE;
+                break;
+            case 3:
+                ${op_list}\[i].cop_warnings = pWARN_STD;
+                break;
+            default:
+                break;
+            }
+        }
+    }
+EOT
+}
+
+sub output_main {
+    print <<'EOT';
+/* if USE_IMPLICIT_SYS, we need a 'real' exit */
+#if defined(exit)
+#undef exit
+#endif
+
+int
+main(int argc, char **argv, char **env)
+{
+    int exitstatus;
+    int i;
+    char **fakeargv;
+    GV* tmpgv;
+    SV* tmpsv;
+    int options_count;
+
+    PERL_SYS_INIT3(&argc,&argv,&env);
+
+    if (!PL_do_undump) {
+	my_perl = perl_alloc();
+	if (!my_perl)
+	    exit(1);
+	perl_construct( my_perl );
+	PL_perl_destruct_level = 0;
+    }
+EOT
+    if( $ithreads ) {
+        # XXX init free elems!
+        my $pad_len = regex_padav->FILL + 1 - 1; # first is an avref
+
+        print <<EOT;
+#ifdef USE_ITHREADS
+    for( i = 0; i < $pad_len; ++i ) {
+        av_push( PL_regex_padav, newSViv(0) );
+    }
+    PL_regex_pad = AvARRAY( PL_regex_padav );
+#endif
+EOT
+    }
+
+    print <<'EOT';
+#ifdef CSH
+    if (!PL_cshlen) 
+      PL_cshlen = strlen(PL_cshname);
+#endif
+
+#ifdef ALLOW_PERL_OPTIONS
+#define EXTRA_OPTIONS 3
+#else
+#define EXTRA_OPTIONS 4
+#endif /* ALLOW_PERL_OPTIONS */
+    Newx(fakeargv, argc + EXTRA_OPTIONS + 1, char *);
+
+    fakeargv[0] = argv[0];
+    fakeargv[1] = "-e";
+    fakeargv[2] = "";
+    options_count = 3;
+EOT
+    # honour -T
+    print <<EOT;
+    if( ${^TAINT} ) {
+        fakeargv[options_count] = "-T";
+        ++options_count;
+    }
+EOT
+    print <<'EOT';
+#ifndef ALLOW_PERL_OPTIONS
+    fakeargv[options_count] = "--";
+    ++options_count;
+#endif /* ALLOW_PERL_OPTIONS */
+    for (i = 1; i < argc; i++)
+	fakeargv[i + options_count - 1] = argv[i];
+    fakeargv[argc + options_count - 1] = 0;
+
+    exitstatus = perl_parse(my_perl, xs_init, argc + options_count - 1,
+			    fakeargv, NULL);
+
+    if (exitstatus)
+	exit( exitstatus );
+
+    TAINT;
+EOT
+
+    if( $use_perl_script_name ) {
+        my $dollar_0 = $0;
+        $dollar_0 =~ s/\\/\\\\/g;
+        $dollar_0 = '"' . $dollar_0 . '"';
+
+        print <<EOT;
+    if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {/* $0 */
+        tmpsv = GvSV(tmpgv);
+        sv_setpv(tmpsv, ${dollar_0});
+        SvSETMAGIC(tmpsv);
+    }
+EOT
+    }
+    else {
+	print <<EOT;
+    if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {/* $0 */
+        tmpsv = GvSV(tmpgv);
+        sv_setpv(tmpsv, argv[0]);
+        SvSETMAGIC(tmpsv);
+    }
+EOT
+    }
+
+    print <<'EOT';
+    if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))) {/* $^X */
+        tmpsv = GvSV(tmpgv);
+#ifdef WIN32
+        sv_setpv(tmpsv,"perl.exe");
+#else
+        sv_setpv(tmpsv,"perl");
+#endif
+        SvSETMAGIC(tmpsv);
+    }
+
+    TAINT_NOT;
+
+    /* PL_main_cv = PL_compcv; */
+    PL_compcv = 0;
+
+    exitstatus = perl_init();
+    if (exitstatus)
+	exit( exitstatus );
+    dl_init(aTHX);
+
+    exitstatus = perl_run( my_perl );
+
+    perl_destruct( my_perl );
+    perl_free( my_perl );
+
+    PERL_SYS_TERM();
+
+    exit( exitstatus );
+}
+
+/* yanked from perl.c */
+static void
+xs_init(pTHX)
+{
+    char *file = __FILE__;
+    dTARG;
+    dSP;
+EOT
+    print "\n#ifdef USE_DYNAMIC_LOADING";
+    print qq/\n\tnewXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);/;
+    print "\n#endif\n" ;
+    # delete $xsub{'DynaLoader'}; 
+    delete $xsub{'UNIVERSAL'}; 
+    print("/* bootstrapping code*/\n\tSAVETMPS;\n");
+    print("\ttarg=sv_newmortal();\n");
+    print "#ifdef USE_DYNAMIC_LOADING\n";
+    print "\tPUSHMARK(sp);\n";
+    print qq/\tXPUSHp("DynaLoader",strlen("DynaLoader"));\n/;
+    print qq/\tPUTBACK;\n/;
+    print "\tboot_DynaLoader(aTHX_ NULL);\n";
+    print qq/\tSPAGAIN;\n/;
+    print "#endif\n";
+    foreach my $stashname (keys %xsub){
+	if ($xsub{$stashname} !~ m/Dynamic/ ) {
+	   my $stashxsub=$stashname;
+	   $stashxsub  =~ s/::/__/g; 
+	   print "\tPUSHMARK(sp);\n";
+	   print qq/\tXPUSHp("$stashname",strlen("$stashname"));\n/;
+	   print qq/\tPUTBACK;\n/;
+	   print "\tboot_$stashxsub(aTHX_ NULL);\n";
+	   print qq/\tSPAGAIN;\n/;
+	}   
+    }
+    print("\tFREETMPS;\n/* end bootstrapping code */\n");
+    print "}\n";
+    
+print <<'EOT';
+static void
+dl_init(pTHX)
+{
+    char *file = __FILE__;
+    dTARG;
+    dSP;
+EOT
+    print("/* Dynamicboot strapping code*/\n\tSAVETMPS;\n");
+    print("\ttarg=sv_newmortal();\n");
+    foreach my $stashname (@DynaLoader::dl_modules) {
+	warn "Loaded $stashname\n";
+	if (exists($xsub{$stashname}) && $xsub{$stashname} =~ m/Dynamic/) {
+  	   my $stashxsub=$stashname;
+	   $stashxsub  =~ s/::/__/g; 
+   	   print "\tPUSHMARK(sp);\n";
+   	   print qq/\tXPUSHp("$stashname",/,length($stashname),qq/);\n/;
+	   print qq/\tPUTBACK;\n/;
+           print "#ifdef USE_DYNAMIC_LOADING\n";
+	   warn "bootstrapping $stashname added to xs_init\n";
+           if( $xsub{$stashname} eq 'Dynamic' ) {
+              print qq/\tperl_call_method("bootstrap",G_DISCARD);\n/;
+           }
+           else {
+              print qq/\tperl_call_pv("XSLoader::load",G_DISCARD);\n/;
+           }
+           print "#else\n";
+	   print "\tboot_$stashxsub(aTHX_ NULL);\n";
+           print "#endif\n";
+	   print qq/\tSPAGAIN;\n/;
+	}   
+    }
+    print("\tFREETMPS;\n/* end Dynamic bootstrapping code */\n");
+    print "}\n";
+}
+sub dump_symtable {
+    # For debugging
+    my ($sym, $val);
+    warn "----Symbol table:\n";
+    while (($sym, $val) = each %symtable) {
+	warn "$sym => $val\n";
+    }
+    warn "---End of symbol table\n";
+}
+
+sub save_object {
+    my $sv;
+    foreach $sv (@_) {
+	svref_2object($sv)->save;
+    }
+}       
+
+sub Dummy_BootStrap { }            
+
+sub B::GV::savecv 
+{
+ my $gv = shift;
+ my $package=$gv->STASH->NAME;
+ my $name = $gv->NAME;
+ my $cv = $gv->CV;
+ my $sv = $gv->SV;
+ my $av = $gv->AV;
+ my $hv = $gv->HV;
+
+ my $fullname = $gv->STASH->NAME . "::" . $gv->NAME;
+
+ # We may be looking at this package just because it is a branch in the 
+ # symbol table which is on the path to a package which we need to save
+ # e.g. this is 'Getopt' and we need to save 'Getopt::Long'
+ # 
+ return unless ($unused_sub_packages{$package});
+ return unless ($$cv || $$av || $$sv || $$hv);
+ $gv->save;
+}
+
+sub mark_package
+{    
+ my $package = shift;
+ unless ($unused_sub_packages{$package})
+  {    
+   no strict 'refs';
+   $unused_sub_packages{$package} = 1;
+   if (defined @{$package.'::ISA'})
+    {
+     foreach my $isa (@{$package.'::ISA'}) 
+      {
+       if ($isa eq 'DynaLoader')
+        {
+         unless (defined(&{$package.'::bootstrap'}))
+          {                    
+           warn "Forcing bootstrap of $package\n";
+           eval { $package->bootstrap }; 
+          }
+        }
+#      else
+        {
+         unless ($unused_sub_packages{$isa})
+          {
+           warn "$isa saved (it is in $package\'s \@ISA)\n";
+           mark_package($isa);
+          }
+        }
+      }
+    }
+  }
+ return 1;
+}
+     
+sub should_save
+{
+ no strict qw(vars refs);
+ my $package = shift;
+ $package =~ s/::$//;
+ return $unused_sub_packages{$package} = 0 if ($package =~ /::::/);  # skip ::::ISA::CACHE etc.
+ # warn "Considering $package\n";#debug
+ foreach my $u (grep($unused_sub_packages{$_},keys %unused_sub_packages)) 
+  {  
+   # If this package is a prefix to something we are saving, traverse it 
+   # but do not mark it for saving if it is not already
+   # e.g. to get to Getopt::Long we need to traverse Getopt but need
+   # not save Getopt
+   return 1 if ($u =~ /^$package\:\:/);
+  }
+ if (exists $unused_sub_packages{$package})
+  {
+   # warn "Cached $package is ".$unused_sub_packages{$package}."\n"; 
+   delete_unsaved_hashINC($package) unless  $unused_sub_packages{$package} ;
+   return $unused_sub_packages{$package}; 
+  }
+ # Omit the packages which we use (and which cause grief
+ # because of fancy "goto &$AUTOLOAD" stuff).
+ # XXX Surely there must be a nicer way to do this.
+ if ($package eq "FileHandle" || $package eq "Config" || 
+     $package eq "SelectSaver" || $package =~/^(B|IO)::/) 
+  {
+   delete_unsaved_hashINC($package);
+   return $unused_sub_packages{$package} = 0;
+  }
+ # Now see if current package looks like an OO class this is probably too strong.
+ foreach my $m (qw(new DESTROY TIESCALAR TIEARRAY TIEHASH TIEHANDLE)) 
+  {
+   if (UNIVERSAL::can($package, $m))
+    {
+     warn "$package has method $m: saving package\n";#debug
+     return mark_package($package);
+    }
+  }
+ delete_unsaved_hashINC($package);
+ return $unused_sub_packages{$package} = 0;
+}
+sub delete_unsaved_hashINC{
+	my $packname=shift;
+	$packname =~ s/\:\:/\//g;
+	$packname .= '.pm';
+#	warn "deleting $packname" if $INC{$packname} ;# debug
+	delete $INC{$packname};
+}
+sub walkpackages 
+{
+ my ($symref, $recurse, $prefix) = @_;
+ my $sym;
+ my $ref;
+ no strict 'vars';
+ $prefix = '' unless defined $prefix;
+ while (($sym, $ref) = each %$symref) 
+  {             
+   local(*glob);
+   *glob = $ref;
+   if ($sym =~ /::$/) 
+    {
+     $sym = $prefix . $sym;
+     if ($sym ne "main::" && $sym ne "<none>::" && &$recurse($sym)) 
+      {
+       walkpackages(\%glob, $recurse, $sym);
+      }
+    } 
+  }
+}
+
+
+sub save_unused_subs 
+{
+ no strict qw(refs);
+ &descend_marked_unused;
+ warn "Prescan\n";
+ walkpackages(\%{"main::"}, sub { should_save($_[0]); return 1 });
+ warn "Saving methods\n";
+ walksymtable(\%{"main::"}, "savecv", \&should_save);
+}
+
+sub save_context
+{
+ my $curpad_nam = (comppadlist->ARRAY)[0]->save;
+ my $curpad_sym = (comppadlist->ARRAY)[1]->save;
+ my $inc_hv     = svref_2object(\%INC)->save;
+ my $inc_av     = svref_2object(\@INC)->save;
+ my $amagic_generate= amagic_generation;          
+ $init->add(   "PL_curpad = AvARRAY($curpad_sym);",
+	       "GvHV(PL_incgv) = $inc_hv;",
+	       "GvAV(PL_incgv) = $inc_av;",
+               "av_store(CvPADLIST(PL_main_cv),0,SvREFCNT_inc($curpad_nam));",
+               "av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc($curpad_sym));",
+  		"PL_amagic_generation= $amagic_generate;" );
+}
+
+sub descend_marked_unused {
+    foreach my $pack (keys %unused_sub_packages)
+    {
+    	mark_package($pack);
+    }
+}
+ 
+sub save_main {
+    # this is mainly for the test suite
+    my $warner = $SIG{__WARN__};
+    local $SIG{__WARN__} = sub { print STDERR @_ };
+
+    warn "Starting compile\n";
+    warn "Walking tree\n";
+    seek(STDOUT,0,0); #exclude print statements in BEGIN{} into output
+    walkoptree(main_root, "save");
+    warn "done main optree, walking symtable for extras\n" if $debug_cv;
+    save_unused_subs();
+    # XSLoader was used, force saving of XSLoader::load
+    if( $use_xsloader ) {
+        my $cv = svref_2object( \&XSLoader::load );
+        $cv->save;
+    }
+    # save %SIG ( in case it was set in a BEGIN block )
+    if( $save_sig ) {
+        local $SIG{__WARN__} = $warner;
+        $init->no_split;
+        $init->add("{", "\tHV* hv = get_hv(\"main::SIG\",1);" );
+        foreach my $k ( keys %SIG ) {
+            next unless ref $SIG{$k};
+            my $cv = svref_2object( \$SIG{$k} );
+            my $sv = $cv->save;
+            $init->add('{',sprintf 'SV* sv = (SV*)%s;', $sv );
+            $init->add(sprintf("\thv_store(hv, %s, %u, %s, %s);",
+                               cstring($k),length(pack "a*",$k),
+                               'sv', hash($k)));
+            $init->add('mg_set(sv);','}');
+        }
+        $init->add('}');
+        $init->split;
+    }
+    # honour -w
+    $init->add( sprintf "    PL_dowarn = ( %s ) ? G_WARN_ON : G_WARN_OFF;", $^W );
+    #
+    my $init_av = init_av->save;
+    my $end_av = end_av->save;
+    $init->add(sprintf("PL_main_root = s\\_%x;", ${main_root()}),
+	       sprintf("PL_main_start = s\\_%x;", ${main_start()}),
+              "PL_initav = (AV *) $init_av;",
+              "PL_endav = (AV*) $end_av;");
+    save_context();
+    # init op addrs ( must be the last action, otherwise
+    # some ops might not be initialized
+    if( $optimize_ppaddr ) {
+        foreach my $i ( @op_sections ) {
+            my $section = $$i;
+            next unless $section->index >= 0;
+            init_op_addr( $section->name, $section->index + 1);
+        }
+    }
+    init_op_warn( $copsect->name, $copsect->index + 1)
+      if $optimize_warn_sv && $copsect->index >= 0;
+
+    warn "Writing output\n";
+    output_boilerplate();
+    print "\n";
+    output_all("perl_init");
+    print "\n";
+    output_main();
+}
+
+sub init_sections {
+    my @sections = (decl => \$decl, sym => \$symsect,
+		    binop => \$binopsect, condop => \$condopsect,
+		    cop => \$copsect, padop => \$padopsect,
+		    listop => \$listopsect, logop => \$logopsect,
+		    loop => \$loopsect, op => \$opsect, pmop => \$pmopsect,
+		    pvop => \$pvopsect, svop => \$svopsect, unop => \$unopsect,
+		    sv => \$svsect, xpv => \$xpvsect, xpvav => \$xpvavsect,
+		    xpvhv => \$xpvhvsect, xpvcv => \$xpvcvsect,
+		    xpviv => \$xpvivsect, xpvnv => \$xpvnvsect,
+		    xpvmg => \$xpvmgsect, xpvlv => \$xpvlvsect,
+		    xrv => \$xrvsect, xpvbm => \$xpvbmsect,
+		    xpvio => \$xpviosect);
+    my ($name, $sectref);
+    while (($name, $sectref) = splice(@sections, 0, 2)) {
+	$$sectref = new B::C::Section $name, \%symtable, 0;
+    }
+    $init = new B::C::InitSection 'init', \%symtable, 0;
+}
+
+sub mark_unused
+{
+ my ($arg,$val) = @_;
+ $unused_sub_packages{$arg} = $val;
+}
+
+sub compile {
+    my @options = @_;
+    my ($option, $opt, $arg);
+    my @eval_at_startup;
+    my %option_map = ( 'cog' => \$pv_copy_on_grow,
+                       'save-data' => \$save_data_fh,
+                       'ppaddr' => \$optimize_ppaddr,
+                       'warn-sv' => \$optimize_warn_sv,
+                       'use-script-name' => \$use_perl_script_name,
+                       'save-sig-hash' => \$save_sig,
+                     );
+    my %optimization_map = ( 0 => [ qw() ], # special case
+                             1 => [ qw(-fcog) ],
+                             2 => [ qw(-fwarn-sv -fppaddr) ],
+                           );
+  OPTION:
+    while ($option = shift @options) {
+	if ($option =~ /^-(.)(.*)/) {
+	    $opt = $1;
+	    $arg = $2;
+	} else {
+	    unshift @options, $option;
+	    last OPTION;
+	}
+	if ($opt eq "-" && $arg eq "-") {
+	    shift @options;
+	    last OPTION;
+	}
+	if ($opt eq "w") {
+	    $warn_undefined_syms = 1;
+	} elsif ($opt eq "D") {
+	    $arg ||= shift @options;
+	    foreach $arg (split(//, $arg)) {
+		if ($arg eq "o") {
+		    B->debug(1);
+		} elsif ($arg eq "c") {
+		    $debug_cops = 1;
+		} elsif ($arg eq "A") {
+		    $debug_av = 1;
+		} elsif ($arg eq "C") {
+		    $debug_cv = 1;
+		} elsif ($arg eq "M") {
+		    $debug_mg = 1;
+		} else {
+		    warn "ignoring unknown debug option: $arg\n";
+		}
+	    }
+	} elsif ($opt eq "o") {
+	    $arg ||= shift @options;
+	    open(STDOUT, ">$arg") or return "$arg: $!\n";
+	} elsif ($opt eq "v") {
+	    $verbose = 1;
+	} elsif ($opt eq "u") {
+	    $arg ||= shift @options;
+	    mark_unused($arg,undef);
+	} elsif ($opt eq "f") {
+	    $arg ||= shift @options;
+            $arg =~ m/(no-)?(.*)/;
+            my $no = defined($1) && $1 eq 'no-';
+            $arg = $no ? $2 : $arg;
+            if( exists $option_map{$arg} ) {
+                ${$option_map{$arg}} = !$no;
+            } else {
+                die "Invalid optimization '$arg'";
+            }
+	} elsif ($opt eq "O") {
+	    $arg = 1 if $arg eq "";
+            my @opt;
+            foreach my $i ( 1 .. $arg ) {
+                push @opt, @{$optimization_map{$i}}
+                    if exists $optimization_map{$i};
+            }
+            unshift @options, @opt;
+        } elsif ($opt eq "e") {
+            push @eval_at_startup, $arg;
+	} elsif ($opt eq "l") {
+	    $max_string_len = $arg;
+	}
+    }
+    init_sections();
+    foreach my $i ( @eval_at_startup ) {
+        $init->add_eval( $i );
+    }
+    if (@options) {
+	return sub {
+	    my $objname;
+	    foreach $objname (@options) {
+		eval "save_object(\\$objname)";
+	    }
+	    output_all();
+	}
+    } else {
+	return sub { save_main() };
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::C - Perl compiler's C backend
+
+=head1 SYNOPSIS
+
+	perl -MO=C[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+This compiler backend takes Perl source and generates C source code
+corresponding to the internal structures that perl uses to run
+your program. When the generated C source is compiled and run, it
+cuts out the time which perl would have taken to load and parse
+your program into its internal semi-compiled form. That means that
+compiling with this backend will not help improve the runtime
+execution speed of your program but may improve the start-up time.
+Depending on the environment in which your program runs this may be
+either a help or a hindrance.
+
+=head1 OPTIONS
+
+If there are any non-option arguments, they are taken to be
+names of objects to be saved (probably doesn't work properly yet).
+Without extra arguments, it saves the main program.
+
+=over 4
+
+=item B<-ofilename>
+
+Output to filename instead of STDOUT
+
+=item B<-v>
+
+Verbose compilation (currently gives a few compilation statistics).
+
+=item B<-->
+
+Force end of options
+
+=item B<-uPackname>
+
+Force apparently unused subs from package Packname to be compiled.
+This allows programs to use eval "foo()" even when sub foo is never
+seen to be used at compile time. The down side is that any subs which
+really are never used also have code generated. This option is
+necessary, for example, if you have a signal handler foo which you
+initialise with C<$SIG{BAR} = "foo">.  A better fix, though, is just
+to change it to C<$SIG{BAR} = \&foo>. You can have multiple B<-u>
+options. The compiler tries to figure out which packages may possibly
+have subs in which need compiling but the current version doesn't do
+it very well. In particular, it is confused by nested packages (i.e.
+of the form C<A::B>) where package C<A> does not contain any subs.
+
+=item B<-D>
+
+Debug options (concatenated or separate flags like C<perl -D>).
+
+=item B<-Do>
+
+OPs, prints each OP as it's processed
+
+=item B<-Dc>
+
+COPs, prints COPs as processed (incl. file & line num)
+
+=item B<-DA>
+
+prints AV information on saving
+
+=item B<-DC>
+
+prints CV information on saving
+
+=item B<-DM>
+
+prints MAGIC information on saving
+
+=item B<-f>
+
+Force options/optimisations on or off one at a time. You can explicitly
+disable an option using B<-fno-option>. All options default to
+B<disabled>.
+
+=over 4
+
+=item B<-fcog>
+
+Copy-on-grow: PVs declared and initialised statically.
+
+=item B<-fsave-data>
+
+Save package::DATA filehandles ( only available with PerlIO ).
+
+=item B<-fppaddr>
+
+Optimize the initialization of op_ppaddr.
+
+=item B<-fwarn-sv>
+
+Optimize the initialization of cop_warnings.
+
+=item B<-fuse-script-name>
+
+Use the script name instead of the program name as $0.
+
+=item B<-fsave-sig-hash>
+
+Save compile-time modifications to the %SIG hash.
+
+=back
+
+=item B<-On>
+
+Optimisation level (n = 0, 1, 2, ...). B<-O> means B<-O1>.
+
+=over 4
+
+=item B<-O0>
+
+Disable all optimizations.
+
+=item B<-O1>
+
+Enable B<-fcog>.
+
+=item B<-O2>
+
+Enable B<-fppaddr>, B<-fwarn-sv>.
+
+=back
+
+=item B<-llimit>
+
+Some C compilers impose an arbitrary limit on the length of string
+constants (e.g. 2048 characters for Microsoft Visual C++).  The
+B<-llimit> options tells the C backend not to generate string literals
+exceeding that limit.
+
+=back
+
+=head1 EXAMPLES
+
+    perl -MO=C,-ofoo.c foo.pl
+    perl cc_harness -o foo foo.c
+
+Note that C<cc_harness> lives in the C<B> subdirectory of your perl
+library directory. The utility called C<perlcc> may also be used to
+help make use of this compiler.
+
+    perl -MO=C,-v,-DcA,-l2048 bar.pl > /dev/null
+
+=head1 BUGS
+
+Plenty. Current status: experimental.
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/CC.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/CC.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/CC.pm	(revision 14489)
@@ -0,0 +1,2005 @@
+#      CC.pm
+#
+#      Copyright (c) 1996, 1997, 1998 Malcolm Beattie
+#
+#      You may distribute under the terms of either the GNU General Public
+#      License or the Artistic License, as specified in the README file.
+#
+package B::CC;
+
+our $VERSION = '1.00_01';
+
+use Config;
+use strict;
+use B qw(main_start main_root class comppadlist peekop svref_2object
+	timing_info init_av sv_undef amagic_generation 
+	OPf_WANT_LIST OPf_WANT OPf_MOD OPf_STACKED OPf_SPECIAL
+	OPpASSIGN_BACKWARDS OPpLVAL_INTRO OPpDEREF_AV OPpDEREF_HV
+	OPpDEREF OPpFLIP_LINENUM G_ARRAY G_SCALAR    
+	CXt_NULL CXt_SUB CXt_EVAL CXt_LOOP CXt_SUBST CXt_BLOCK
+	);
+use B::C qw(save_unused_subs objsym init_sections mark_unused
+	    output_all output_boilerplate output_main);
+use B::Bblock qw(find_leaders);
+use B::Stackobj qw(:types :flags);
+
+# These should probably be elsewhere
+# Flags for $op->flags
+
+my $module;		# module name (when compiled with -m)
+my %done;		# hash keyed by $$op of leaders of basic blocks
+			# which have already been done.
+my $leaders;		# ref to hash of basic block leaders. Keys are $$op
+			# addresses, values are the $op objects themselves.
+my @bblock_todo;	# list of leaders of basic blocks that need visiting
+			# sometime.
+my @cc_todo;		# list of tuples defining what PP code needs to be
+			# saved (e.g. CV, main or PMOP repl code). Each tuple
+			# is [$name, $root, $start, @padlist]. PMOP repl code
+			# tuples inherit padlist.
+my @stack;		# shadows perl's stack when contents are known.
+			# Values are objects derived from class B::Stackobj
+my @pad;		# Lexicals in current pad as Stackobj-derived objects
+my @padlist;		# Copy of current padlist so PMOP repl code can find it
+my @cxstack;		# Shadows the (compile-time) cxstack for next,last,redo
+my $jmpbuf_ix = 0;	# Next free index for dynamically allocated jmpbufs
+my %constobj;		# OP_CONST constants as Stackobj-derived objects
+			# keyed by $$sv.
+my $need_freetmps = 0;	# We may postpone FREETMPS to the end of each basic
+			# block or even to the end of each loop of blocks,
+			# depending on optimisation options.
+my $know_op = 0;	# Set when C variable op already holds the right op
+			# (from an immediately preceding DOOP(ppname)).
+my $errors = 0;		# Number of errors encountered
+my %skip_stack;		# Hash of PP names which don't need write_back_stack
+my %skip_lexicals;	# Hash of PP names which don't need write_back_lexicals
+my %skip_invalidate;	# Hash of PP names which don't need invalidate_lexicals
+my %ignore_op;		# Hash of ops which do nothing except returning op_next
+my %need_curcop;	# Hash of ops which need PL_curcop
+
+my %lexstate;		#state of padsvs at the start of a bblock
+
+BEGIN {
+    foreach (qw(pp_scalar pp_regcmaybe pp_lineseq pp_scope pp_null)) {
+	$ignore_op{$_} = 1;
+    }
+}
+
+my ($module_name);
+my ($debug_op, $debug_stack, $debug_cxstack, $debug_pad, $debug_runtime,
+    $debug_shadow, $debug_queue, $debug_lineno, $debug_timings);
+
+# Optimisation options. On the command line, use hyphens instead of
+# underscores for compatibility with gcc-style options. We use
+# underscores here because they are OK in (strict) barewords.
+my ($freetmps_each_bblock, $freetmps_each_loop, $omit_taint);
+my %optimise = (freetmps_each_bblock	=> \$freetmps_each_bblock,
+		freetmps_each_loop	=> \$freetmps_each_loop,
+		omit_taint		=> \$omit_taint);
+# perl patchlevel to generate code for (defaults to current patchlevel)
+my $patchlevel = int(0.5 + 1000 * ($]  - 5));
+
+# Could rewrite push_runtime() and output_runtime() to use a
+# temporary file if memory is at a premium.
+my $ppname;		# name of current fake PP function
+my $runtime_list_ref;
+my $declare_ref;	# Hash ref keyed by C variable type of declarations.
+
+my @pp_list;		# list of [$ppname, $runtime_list_ref, $declare_ref]
+			# tuples to be written out.
+
+my ($init, $decl);
+
+sub init_hash { map { $_ => 1 } @_ }
+
+#
+# Initialise the hashes for the default PP functions where we can avoid
+# either write_back_stack, write_back_lexicals or invalidate_lexicals.
+#
+%skip_lexicals = init_hash qw(pp_enter pp_enterloop);
+%skip_invalidate = init_hash qw(pp_enter pp_enterloop);
+%need_curcop = init_hash qw(pp_rv2gv  pp_bless pp_repeat pp_sort pp_caller
+			pp_reset pp_rv2cv pp_entereval pp_require pp_dofile
+			pp_entertry pp_enterloop pp_enteriter pp_entersub
+			pp_enter pp_method);
+
+sub debug {
+    if ($debug_runtime) {
+	warn(@_);
+    } else {
+	my @tmp=@_;
+	runtime(map { chomp; "/* $_ */"} @tmp);
+    }
+}
+
+sub declare {
+    my ($type, $var) = @_;
+    push(@{$declare_ref->{$type}}, $var);
+}
+
+sub push_runtime {
+    push(@$runtime_list_ref, @_);
+    warn join("\n", @_) . "\n" if $debug_runtime;
+}
+
+sub save_runtime {
+    push(@pp_list, [$ppname, $runtime_list_ref, $declare_ref]);
+}
+
+sub output_runtime {
+    my $ppdata;
+    print qq(#include "cc_runtime.h"\n);
+    foreach $ppdata (@pp_list) {
+	my ($name, $runtime, $declare) = @$ppdata;
+	print "\nstatic\nCCPP($name)\n{\n";
+	my ($type, $varlist, $line);
+	while (($type, $varlist) = each %$declare) {
+	    print "\t$type ", join(", ", @$varlist), ";\n";
+	}
+	foreach $line (@$runtime) {
+	    print $line, "\n";
+	}
+	print "}\n";
+    }
+}
+
+sub runtime {
+    my $line;
+    foreach $line (@_) {
+	push_runtime("\t$line");
+    }
+}
+
+sub init_pp {
+    $ppname = shift;
+    $runtime_list_ref = [];
+    $declare_ref = {};
+    runtime("dSP;");
+    declare("I32", "oldsave");
+    declare("SV", "**svp");
+    map { declare("SV", "*$_") } qw(sv src dst left right);
+    declare("MAGIC", "*mg");
+    $decl->add("static OP * $ppname (pTHX);");
+    debug "init_pp: $ppname\n" if $debug_queue;
+}
+
+# Initialise runtime_callback function for Stackobj class
+BEGIN { B::Stackobj::set_callback(\&runtime) }
+
+# Initialise saveoptree_callback for B::C class
+sub cc_queue {
+    my ($name, $root, $start, @pl) = @_;
+    debug "cc_queue: name $name, root $root, start $start, padlist (@pl)\n"
+	if $debug_queue;
+    if ($name eq "*ignore*") {
+	$name = 0;
+    } else {
+	push(@cc_todo, [$name, $root, $start, (@pl ? @pl : @padlist)]);
+    }
+    my $fakeop = new B::FAKEOP ("next" => 0, sibling => 0, ppaddr => $name);
+    $start = $fakeop->save;
+    debug "cc_queue: name $name returns $start\n" if $debug_queue;
+    return $start;
+}
+BEGIN { B::C::set_callback(\&cc_queue) }
+
+sub valid_int { $_[0]->{flags} & VALID_INT }
+sub valid_double { $_[0]->{flags} & VALID_DOUBLE }
+sub valid_numeric { $_[0]->{flags} & (VALID_INT | VALID_DOUBLE) }
+sub valid_sv { $_[0]->{flags} & VALID_SV }
+
+sub top_int { @stack ? $stack[-1]->as_int : "TOPi" }
+sub top_double { @stack ? $stack[-1]->as_double : "TOPn" }
+sub top_numeric { @stack ? $stack[-1]->as_numeric : "TOPn" }
+sub top_sv { @stack ? $stack[-1]->as_sv : "TOPs" }
+sub top_bool { @stack ? $stack[-1]->as_bool : "SvTRUE(TOPs)" }
+
+sub pop_int { @stack ? (pop @stack)->as_int : "POPi" }
+sub pop_double { @stack ? (pop @stack)->as_double : "POPn" }
+sub pop_numeric { @stack ? (pop @stack)->as_numeric : "POPn" }
+sub pop_sv { @stack ? (pop @stack)->as_sv : "POPs" }
+sub pop_bool {
+    if (@stack) {
+	return ((pop @stack)->as_bool);
+    } else {
+	# Careful: POPs has an auto-decrement and SvTRUE evaluates
+	# its argument more than once.
+	runtime("sv = POPs;");
+	return "SvTRUE(sv)";
+    }
+}
+
+sub write_back_lexicals {
+    my $avoid = shift || 0;
+    debug "write_back_lexicals($avoid) called from @{[(caller(1))[3]]}\n"
+	if $debug_shadow;
+    my $lex;
+    foreach $lex (@pad) {
+	next unless ref($lex);
+	$lex->write_back unless $lex->{flags} & $avoid;
+    }
+}
+
+sub save_or_restore_lexical_state {
+    my $bblock=shift;
+    unless( exists $lexstate{$bblock}){
+    	foreach my $lex (@pad) {
+		next unless ref($lex);
+		${$lexstate{$bblock}}{$lex->{iv}} = $lex->{flags} ;
+	}
+    }
+    else {
+    	foreach my $lex (@pad) {
+	    next unless ref($lex);
+	    my $old_flags=${$lexstate{$bblock}}{$lex->{iv}}  ;
+	    next if ( $old_flags eq $lex->{flags});
+	    if  (($old_flags & VALID_SV)  && !($lex->{flags} & VALID_SV)){
+		$lex->write_back;
+	    }
+	    if (($old_flags & VALID_DOUBLE) && !($lex->{flags} & VALID_DOUBLE)){
+                $lex->load_double;
+            }
+            if (($old_flags & VALID_INT) && !($lex->{flags} & VALID_INT)){
+                $lex->load_int;
+            }
+        }
+    }
+}
+
+sub write_back_stack {
+    my $obj;
+    return unless @stack;
+    runtime(sprintf("EXTEND(sp, %d);", scalar(@stack)));
+    foreach $obj (@stack) {
+	runtime(sprintf("PUSHs((SV*)%s);", $obj->as_sv));
+    }
+    @stack = ();
+}
+
+sub invalidate_lexicals {
+    my $avoid = shift || 0;
+    debug "invalidate_lexicals($avoid) called from @{[(caller(1))[3]]}\n"
+	if $debug_shadow;
+    my $lex;
+    foreach $lex (@pad) {
+	next unless ref($lex);
+	$lex->invalidate unless $lex->{flags} & $avoid;
+    }
+}
+
+sub reload_lexicals {
+    my $lex;
+    foreach $lex (@pad) {
+	next unless ref($lex);
+	my $type = $lex->{type};
+	if ($type == T_INT) {
+	    $lex->as_int;
+	} elsif ($type == T_DOUBLE) {
+	    $lex->as_double;
+	} else {
+	    $lex->as_sv;
+	}
+    }
+}
+
+{
+    package B::Pseudoreg;
+    #
+    # This class allocates pseudo-registers (OK, so they're C variables).
+    #
+    my %alloc;		# Keyed by variable name. A value of 1 means the
+			# variable has been declared. A value of 2 means
+			# it's in use.
+    
+    sub new_scope { %alloc = () }
+    
+    sub new ($$$) {
+	my ($class, $type, $prefix) = @_;
+	my ($ptr, $i, $varname, $status, $obj);
+	$prefix =~ s/^(\**)//;
+	$ptr = $1;
+	$i = 0;
+	do {
+	    $varname = "$prefix$i";
+	    $status = $alloc{$varname};
+	} while $status == 2;
+	if ($status != 1) {
+	    # Not declared yet
+	    B::CC::declare($type, "$ptr$varname");
+	    $alloc{$varname} = 2;	# declared and in use
+	}
+	$obj = bless \$varname, $class;
+	return $obj;
+    }
+    sub DESTROY {
+	my $obj = shift;
+	$alloc{$$obj} = 1; # no longer in use but still declared
+    }
+}
+{
+    package B::Shadow;
+    #
+    # This class gives a standard API for a perl object to shadow a
+    # C variable and only generate reloads/write-backs when necessary.
+    #
+    # Use $obj->load($foo) instead of runtime("shadowed_c_var = foo").
+    # Use $obj->write_back whenever shadowed_c_var needs to be up to date.
+    # Use $obj->invalidate whenever an unknown function may have
+    # set shadow itself.
+
+    sub new {
+	my ($class, $write_back) = @_;
+	# Object fields are perl shadow variable, validity flag
+	# (for *C* variable) and callback sub for write_back
+	# (passed perl shadow variable as argument).
+	bless [undef, 1, $write_back], $class;
+    }
+    sub load {
+	my ($obj, $newval) = @_;
+	$obj->[1] = 0;		# C variable no longer valid
+	$obj->[0] = $newval;
+    }
+    sub write_back {
+	my $obj = shift;
+	if (!($obj->[1])) {
+	    $obj->[1] = 1;	# C variable will now be valid
+	    &{$obj->[2]}($obj->[0]);
+	}
+    }
+    sub invalidate { $_[0]->[1] = 0 } # force C variable to be invalid
+}
+my $curcop = new B::Shadow (sub {
+    my $opsym = shift->save;
+    runtime("PL_curcop = (COP*)$opsym;");
+});
+
+#
+# Context stack shadowing. Mimics stuff in pp_ctl.c, cop.h and so on.
+#
+sub dopoptoloop {
+    my $cxix = $#cxstack;
+    while ($cxix >= 0 && $cxstack[$cxix]->{type} != CXt_LOOP) {
+	$cxix--;
+    }
+    debug "dopoptoloop: returning $cxix" if $debug_cxstack;
+    return $cxix;
+}
+
+sub dopoptolabel {
+    my $label = shift;
+    my $cxix = $#cxstack;
+    while ($cxix >= 0 &&
+	   ($cxstack[$cxix]->{type} != CXt_LOOP ||
+	    $cxstack[$cxix]->{label} ne $label)) {
+	$cxix--;
+    }
+    debug "dopoptolabel: returning $cxix" if $debug_cxstack;
+    return $cxix;
+}
+
+sub error {
+    my $format = shift;
+    my $file = $curcop->[0]->file;
+    my $line = $curcop->[0]->line;
+    $errors++;
+    if (@_) {
+	warn sprintf("%s:%d: $format\n", $file, $line, @_);
+    } else {
+	warn sprintf("%s:%d: %s\n", $file, $line, $format);
+    }
+}
+
+#
+# Load pad takes (the elements of) a PADLIST as arguments and loads
+# up @pad with Stackobj-derived objects which represent those lexicals.
+# If/when perl itself can generate type information (my int $foo) then
+# we'll take advantage of that here. Until then, we'll use various hacks
+# to tell the compiler when we want a lexical to be a particular type
+# or to be a register.
+#
+sub load_pad {
+    my ($namelistav, $valuelistav) = @_;
+    @padlist = @_;
+    my @namelist = $namelistav->ARRAY;
+    my @valuelist = $valuelistav->ARRAY;
+    my $ix;
+    @pad = ();
+    debug "load_pad: $#namelist names, $#valuelist values\n" if $debug_pad;
+    # Temporary lexicals don't get named so it's possible for @valuelist
+    # to be strictly longer than @namelist. We count $ix up to the end of
+    # @valuelist but index into @namelist for the name. Any temporaries which
+    # run off the end of @namelist will make $namesv undefined and we treat
+    # that the same as having an explicit SPECIAL sv_undef object in @namelist.
+    # [XXX If/when @_ becomes a lexical, we must start at 0 here.]
+    for ($ix = 1; $ix < @valuelist; $ix++) {
+	my $namesv = $namelist[$ix];
+	my $type = T_UNKNOWN;
+	my $flags = 0;
+	my $name = "tmp$ix";
+	my $class = class($namesv);
+	if (!defined($namesv) || $class eq "SPECIAL") {
+	    # temporaries have &PL_sv_undef instead of a PVNV for a name
+	    $flags = VALID_SV|TEMPORARY|REGISTER;
+	} else {
+	    if ($namesv->PV =~ /^\$(.*)_([di])(r?)$/) {
+		$name = $1;
+		if ($2 eq "i") {
+		    $type = T_INT;
+		    $flags = VALID_SV|VALID_INT;
+		} elsif ($2 eq "d") {
+		    $type = T_DOUBLE;
+		    $flags = VALID_SV|VALID_DOUBLE;
+		}
+		$flags |= REGISTER if $3;
+	    }
+	}
+	$pad[$ix] = new B::Stackobj::Padsv ($type, $flags, $ix,
+					    "i_$name", "d_$name");
+
+	debug sprintf("PL_curpad[$ix] = %s\n", $pad[$ix]->peek) if $debug_pad;
+    }
+}
+
+sub declare_pad {
+    my $ix;
+    for ($ix = 1; $ix <= $#pad; $ix++) {
+	my $type = $pad[$ix]->{type};
+	declare("IV", $type == T_INT ? 
+		sprintf("%s=0",$pad[$ix]->{iv}):$pad[$ix]->{iv}) if $pad[$ix]->save_int;
+	declare("double", $type == T_DOUBLE ?
+		 sprintf("%s = 0",$pad[$ix]->{nv}):$pad[$ix]->{nv} )if $pad[$ix]->save_double;
+
+    }
+}
+#
+# Debugging stuff
+#
+sub peek_stack { sprintf "stack = %s\n", join(" ", map($_->minipeek, @stack)) }
+
+#
+# OP stuff
+#
+
+sub label {
+    my $op = shift;
+    # XXX Preserve original label name for "real" labels?
+    return sprintf("lab_%x", $$op);
+}
+
+sub write_label {
+    my $op = shift;
+    push_runtime(sprintf("  %s:", label($op)));
+}
+
+sub loadop {
+    my $op = shift;
+    my $opsym = $op->save;
+    runtime("PL_op = $opsym;") unless $know_op;
+    return $opsym;
+}
+
+sub doop {
+    my $op = shift;
+    my $ppname = $op->ppaddr;
+    my $sym = loadop($op);
+    runtime("DOOP($ppname);");
+    $know_op = 1;
+    return $sym;
+}
+
+sub gimme {
+    my $op = shift;
+    my $flags = $op->flags;
+    return (($flags & OPf_WANT) ? (($flags & OPf_WANT)== OPf_WANT_LIST? G_ARRAY:G_SCALAR) : "dowantarray()");
+}
+
+#
+# Code generation for PP code
+#
+
+sub pp_null {
+    my $op = shift;
+    return $op->next;
+}
+
+sub pp_stub {
+    my $op = shift;
+    my $gimme = gimme($op);
+    if ($gimme != G_ARRAY) {
+	my $obj= new B::Stackobj::Const(sv_undef);
+    	push(@stack, $obj);
+	# XXX Change to push a constant sv_undef Stackobj onto @stack
+	#write_back_stack();
+	#runtime("if ($gimme != G_ARRAY) XPUSHs(&PL_sv_undef);");
+    }
+    return $op->next;
+}
+
+sub pp_unstack {
+    my $op = shift;
+    @stack = ();
+    runtime("PP_UNSTACK;");
+    return $op->next;
+}
+
+sub pp_and {
+    my $op = shift;
+    my $next = $op->next;
+    reload_lexicals();
+    unshift(@bblock_todo, $next);
+    if (@stack >= 1) {
+	my $bool = pop_bool();
+	write_back_stack();
+        save_or_restore_lexical_state($$next);
+	runtime(sprintf("if (!$bool) {XPUSHs(&PL_sv_no); goto %s;}", label($next)));
+    } else {
+        save_or_restore_lexical_state($$next);
+	runtime(sprintf("if (!%s) goto %s;", top_bool(), label($next)),
+		"*sp--;");
+    }
+    return $op->other;
+}
+	    
+sub pp_or {
+    my $op = shift;
+    my $next = $op->next;
+    reload_lexicals();
+    unshift(@bblock_todo, $next);
+    if (@stack >= 1) {
+	my $bool = pop_bool @stack;
+	write_back_stack();
+        save_or_restore_lexical_state($$next);
+	runtime(sprintf("if (%s) { XPUSHs(&PL_sv_yes); goto %s; }",
+			$bool, label($next)));
+    } else {
+        save_or_restore_lexical_state($$next);
+	runtime(sprintf("if (%s) goto %s;", top_bool(), label($next)),
+		"*sp--;");
+    }
+    return $op->other;
+}
+	    
+sub pp_cond_expr {
+    my $op = shift;
+    my $false = $op->next;
+    unshift(@bblock_todo, $false);
+    reload_lexicals();
+    my $bool = pop_bool();
+    write_back_stack();
+    save_or_restore_lexical_state($$false);
+    runtime(sprintf("if (!$bool) goto %s;", label($false)));
+    return $op->other;
+}
+
+sub pp_padsv {
+    my $op = shift;
+    my $ix = $op->targ;
+    push(@stack, $pad[$ix]);
+    if ($op->flags & OPf_MOD) {
+	my $private = $op->private;
+	if ($private & OPpLVAL_INTRO) {
+	    runtime("SAVECLEARSV(PL_curpad[$ix]);");
+	} elsif ($private & OPpDEREF) {
+	    runtime(sprintf("vivify_ref(PL_curpad[%d], %d);",
+			    $ix, $private & OPpDEREF));
+	    $pad[$ix]->invalidate;
+	}
+    }
+    return $op->next;
+}
+
+sub pp_const {
+    my $op = shift;
+    my $sv = $op->sv;
+    my $obj;
+    # constant could be in the pad (under useithreads)
+    if ($$sv) {
+	$obj = $constobj{$$sv};
+	if (!defined($obj)) {
+	    $obj = $constobj{$$sv} = new B::Stackobj::Const ($sv);
+	}
+    }
+    else {
+	$obj = $pad[$op->targ];
+    }
+    push(@stack, $obj);
+    return $op->next;
+}
+
+sub pp_nextstate {
+    my $op = shift;
+    $curcop->load($op);
+    @stack = ();
+    debug(sprintf("%s:%d\n", $op->file, $op->line)) if $debug_lineno;
+    runtime("TAINT_NOT;") unless $omit_taint;
+    runtime("sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;");
+    if ($freetmps_each_bblock || $freetmps_each_loop) {
+	$need_freetmps = 1;
+    } else {
+	runtime("FREETMPS;");
+    }
+    return $op->next;
+}
+
+sub pp_dbstate {
+    my $op = shift;
+    $curcop->invalidate; # XXX?
+    return default_pp($op);
+}
+
+#default_pp will handle this:
+#sub pp_bless { $curcop->write_back; default_pp(@_) }
+#sub pp_repeat { $curcop->write_back; default_pp(@_) }
+# The following subs need $curcop->write_back if we decide to support arybase:
+# pp_pos, pp_substr, pp_index, pp_rindex, pp_aslice, pp_lslice, pp_splice
+#sub pp_caller { $curcop->write_back; default_pp(@_) }
+#sub pp_reset { $curcop->write_back; default_pp(@_) }
+
+sub pp_rv2gv{
+    my $op =shift;
+    $curcop->write_back;
+    write_back_lexicals() unless $skip_lexicals{$ppname};
+    write_back_stack() unless $skip_stack{$ppname};
+    my $sym=doop($op);
+    if ($op->private & OPpDEREF) {
+        $init->add(sprintf("((UNOP *)$sym)->op_first = $sym;"));	
+        $init->add(sprintf("((UNOP *)$sym)->op_type = %d;", 
+		$op->first->type));	
+    }
+    return $op->next;
+}
+sub pp_sort {
+    my $op = shift;
+    my $ppname = $op->ppaddr;
+    if ( $op->flags & OPf_SPECIAL && $op->flags  & OPf_STACKED){   
+        #this indicates the sort BLOCK Array case
+        #ugly surgery required.
+        my $root=$op->first->sibling->first;
+        my $start=$root->first;
+	$op->first->save;
+	$op->first->sibling->save;
+	$root->save;
+	my $sym=$start->save;
+        my $fakeop=cc_queue("pp_sort".$$op,$root,$start);
+	$init->add(sprintf("(%s)->op_next=%s;",$sym,$fakeop));
+    }
+    $curcop->write_back;
+    write_back_lexicals();
+    write_back_stack();
+    doop($op);
+    return $op->next;
+}
+
+sub pp_gv {
+    my $op = shift;
+    my $gvsym;
+    if ($Config{useithreads}) {
+	$gvsym = $pad[$op->padix]->as_sv;
+    }
+    else {
+	$gvsym = $op->gv->save;
+    }
+    write_back_stack();
+    runtime("XPUSHs((SV*)$gvsym);");
+    return $op->next;
+}
+
+sub pp_gvsv {
+    my $op = shift;
+    my $gvsym;
+    if ($Config{useithreads}) {
+	$gvsym = $pad[$op->padix]->as_sv;
+    }
+    else {
+	$gvsym = $op->gv->save;
+    }
+    write_back_stack();
+    if ($op->private & OPpLVAL_INTRO) {
+	runtime("XPUSHs(save_scalar($gvsym));");
+    } else {
+	runtime("XPUSHs(GvSV($gvsym));");
+    }
+    return $op->next;
+}
+
+sub pp_aelemfast {
+    my $op = shift;
+    my $gvsym;
+    if ($Config{useithreads}) {
+	$gvsym = $pad[$op->padix]->as_sv;
+    }
+    else {
+	$gvsym = $op->gv->save;
+    }
+    my $ix = $op->private;
+    my $flag = $op->flags & OPf_MOD;
+    write_back_stack();
+    runtime("svp = av_fetch(GvAV($gvsym), $ix, $flag);",
+	    "PUSHs(svp ? *svp : &PL_sv_undef);");
+    return $op->next;
+}
+
+sub int_binop {
+    my ($op, $operator) = @_;
+    if ($op->flags & OPf_STACKED) {
+	my $right = pop_int();
+	if (@stack >= 1) {
+	    my $left = top_int();
+	    $stack[-1]->set_int(&$operator($left, $right));
+	} else {
+	    runtime(sprintf("sv_setiv(TOPs, %s);",&$operator("TOPi", $right)));
+	}
+    } else {
+	my $targ = $pad[$op->targ];
+	my $right = new B::Pseudoreg ("IV", "riv");
+	my $left = new B::Pseudoreg ("IV", "liv");
+	runtime(sprintf("$$right = %s; $$left = %s;", pop_int(), pop_int));
+	$targ->set_int(&$operator($$left, $$right));
+	push(@stack, $targ);
+    }
+    return $op->next;
+}
+
+sub INTS_CLOSED () { 0x1 }
+sub INT_RESULT () { 0x2 }
+sub NUMERIC_RESULT () { 0x4 }
+
+sub numeric_binop {
+    my ($op, $operator, $flags) = @_;
+    my $force_int = 0;
+    $force_int ||= ($flags & INT_RESULT);
+    $force_int ||= ($flags & INTS_CLOSED && @stack >= 2
+		    && valid_int($stack[-2]) && valid_int($stack[-1]));
+    if ($op->flags & OPf_STACKED) {
+	my $right = pop_numeric();
+	if (@stack >= 1) {
+	    my $left = top_numeric();
+	    if ($force_int) {
+		$stack[-1]->set_int(&$operator($left, $right));
+	    } else {
+		$stack[-1]->set_numeric(&$operator($left, $right));
+	    }
+	} else {
+	    if ($force_int) {
+	        my $rightruntime = new B::Pseudoreg ("IV", "riv");
+	    	runtime(sprintf("$$rightruntime = %s;",$right));
+		runtime(sprintf("sv_setiv(TOPs, %s);",
+				&$operator("TOPi", $$rightruntime)));
+	    } else {
+	    	my $rightruntime = new B::Pseudoreg ("double", "rnv");
+	    	runtime(sprintf("$$rightruntime = %s;",$right));
+		runtime(sprintf("sv_setnv(TOPs, %s);",
+				&$operator("TOPn",$$rightruntime)));
+	    }
+	}
+    } else {
+	my $targ = $pad[$op->targ];
+	$force_int ||= ($targ->{type} == T_INT);
+	if ($force_int) {
+	    my $right = new B::Pseudoreg ("IV", "riv");
+	    my $left = new B::Pseudoreg ("IV", "liv");
+	    runtime(sprintf("$$right = %s; $$left = %s;",
+			    pop_numeric(), pop_numeric));
+	    $targ->set_int(&$operator($$left, $$right));
+	} else {
+	    my $right = new B::Pseudoreg ("double", "rnv");
+	    my $left = new B::Pseudoreg ("double", "lnv");
+	    runtime(sprintf("$$right = %s; $$left = %s;",
+			    pop_numeric(), pop_numeric));
+	    $targ->set_numeric(&$operator($$left, $$right));
+	}
+	push(@stack, $targ);
+    }
+    return $op->next;
+}
+
+sub pp_ncmp {
+    my ($op) = @_;
+    if ($op->flags & OPf_STACKED) {
+	my $right = pop_numeric();
+	if (@stack >= 1) {
+	    my $left = top_numeric();
+	    runtime sprintf("if (%s > %s){",$left,$right);
+		$stack[-1]->set_int(1);
+	    $stack[-1]->write_back();
+	    runtime sprintf("}else if (%s < %s ) {",$left,$right);
+		$stack[-1]->set_int(-1);
+	    $stack[-1]->write_back();
+	    runtime sprintf("}else if (%s == %s) {",$left,$right);
+		$stack[-1]->set_int(0);
+	    $stack[-1]->write_back();
+	    runtime sprintf("}else {"); 
+		$stack[-1]->set_sv("&PL_sv_undef");
+	    runtime "}";
+	} else {
+	    my $rightruntime = new B::Pseudoreg ("double", "rnv");
+	    runtime(sprintf("$$rightruntime = %s;",$right));
+	    runtime sprintf(qq/if ("TOPn" > %s){/,$rightruntime);
+	    runtime sprintf("sv_setiv(TOPs,1);");
+	    runtime sprintf(qq/}else if ( "TOPn" < %s ) {/,$$rightruntime);
+	    runtime sprintf("sv_setiv(TOPs,-1);");
+	    runtime sprintf(qq/} else if ("TOPn" == %s) {/,$$rightruntime);
+	    runtime sprintf("sv_setiv(TOPs,0);");
+	    runtime sprintf(qq/}else {/); 
+	    runtime sprintf("sv_setiv(TOPs,&PL_sv_undef;");
+	    runtime "}";
+	}
+    } else {
+       	my $targ = $pad[$op->targ];
+	 my $right = new B::Pseudoreg ("double", "rnv");
+	 my $left = new B::Pseudoreg ("double", "lnv");
+	 runtime(sprintf("$$right = %s; $$left = %s;",
+			    pop_numeric(), pop_numeric));
+	runtime sprintf("if (%s > %s){",$$left,$$right);
+		$targ->set_int(1);
+		$targ->write_back();
+	runtime sprintf("}else if (%s < %s ) {",$$left,$$right);
+		$targ->set_int(-1);
+		$targ->write_back();
+	runtime sprintf("}else if (%s == %s) {",$$left,$$right);
+		$targ->set_int(0);
+		$targ->write_back();
+	runtime sprintf("}else {"); 
+		$targ->set_sv("&PL_sv_undef");
+	runtime "}";
+	push(@stack, $targ);
+    }
+    return $op->next;
+}
+
+sub sv_binop {
+    my ($op, $operator, $flags) = @_;
+    if ($op->flags & OPf_STACKED) {
+	my $right = pop_sv();
+	if (@stack >= 1) {
+	    my $left = top_sv();
+	    if ($flags & INT_RESULT) {
+		$stack[-1]->set_int(&$operator($left, $right));
+	    } elsif ($flags & NUMERIC_RESULT) {
+		$stack[-1]->set_numeric(&$operator($left, $right));
+	    } else {
+		# XXX Does this work?
+		runtime(sprintf("sv_setsv($left, %s);",
+				&$operator($left, $right)));
+		$stack[-1]->invalidate;
+	    }
+	} else {
+	    my $f;
+	    if ($flags & INT_RESULT) {
+		$f = "sv_setiv";
+	    } elsif ($flags & NUMERIC_RESULT) {
+		$f = "sv_setnv";
+	    } else {
+		$f = "sv_setsv";
+	    }
+	    runtime(sprintf("%s(TOPs, %s);", $f, &$operator("TOPs", $right)));
+	}
+    } else {
+	my $targ = $pad[$op->targ];
+	runtime(sprintf("right = %s; left = %s;", pop_sv(), pop_sv));
+	if ($flags & INT_RESULT) {
+	    $targ->set_int(&$operator("left", "right"));
+	} elsif ($flags & NUMERIC_RESULT) {
+	    $targ->set_numeric(&$operator("left", "right"));
+	} else {
+	    # XXX Does this work?
+	    runtime(sprintf("sv_setsv(%s, %s);",
+			    $targ->as_sv, &$operator("left", "right")));
+	    $targ->invalidate;
+	}
+	push(@stack, $targ);
+    }
+    return $op->next;
+}
+    
+sub bool_int_binop {
+    my ($op, $operator) = @_;
+    my $right = new B::Pseudoreg ("IV", "riv");
+    my $left = new B::Pseudoreg ("IV", "liv");
+    runtime(sprintf("$$right = %s; $$left = %s;", pop_int(), pop_int()));
+    my $bool = new B::Stackobj::Bool (new B::Pseudoreg ("int", "b"));
+    $bool->set_int(&$operator($$left, $$right));
+    push(@stack, $bool);
+    return $op->next;
+}
+
+sub bool_numeric_binop {
+    my ($op, $operator) = @_;
+    my $right = new B::Pseudoreg ("double", "rnv");
+    my $left = new B::Pseudoreg ("double", "lnv");
+    runtime(sprintf("$$right = %s; $$left = %s;",
+		    pop_numeric(), pop_numeric()));
+    my $bool = new B::Stackobj::Bool (new B::Pseudoreg ("int", "b"));
+    $bool->set_numeric(&$operator($$left, $$right));
+    push(@stack, $bool);
+    return $op->next;
+}
+
+sub bool_sv_binop {
+    my ($op, $operator) = @_;
+    runtime(sprintf("right = %s; left = %s;", pop_sv(), pop_sv()));
+    my $bool = new B::Stackobj::Bool (new B::Pseudoreg ("int", "b"));
+    $bool->set_numeric(&$operator("left", "right"));
+    push(@stack, $bool);
+    return $op->next;
+}
+
+sub infix_op {
+    my $opname = shift;
+    return sub { "$_[0] $opname $_[1]" }
+}
+
+sub prefix_op {
+    my $opname = shift;
+    return sub { sprintf("%s(%s)", $opname, join(", ", @_)) }
+}
+
+BEGIN {
+    my $plus_op = infix_op("+");
+    my $minus_op = infix_op("-");
+    my $multiply_op = infix_op("*");
+    my $divide_op = infix_op("/");
+    my $modulo_op = infix_op("%");
+    my $lshift_op = infix_op("<<");
+    my $rshift_op = infix_op(">>");
+    my $scmp_op = prefix_op("sv_cmp");
+    my $seq_op = prefix_op("sv_eq");
+    my $sne_op = prefix_op("!sv_eq");
+    my $slt_op = sub { "sv_cmp($_[0], $_[1]) < 0" };
+    my $sgt_op = sub { "sv_cmp($_[0], $_[1]) > 0" };
+    my $sle_op = sub { "sv_cmp($_[0], $_[1]) <= 0" };
+    my $sge_op = sub { "sv_cmp($_[0], $_[1]) >= 0" };
+    my $eq_op = infix_op("==");
+    my $ne_op = infix_op("!=");
+    my $lt_op = infix_op("<");
+    my $gt_op = infix_op(">");
+    my $le_op = infix_op("<=");
+    my $ge_op = infix_op(">=");
+
+    #
+    # XXX The standard perl PP code has extra handling for
+    # some special case arguments of these operators.
+    #
+    sub pp_add { numeric_binop($_[0], $plus_op) }
+    sub pp_subtract { numeric_binop($_[0], $minus_op) }
+    sub pp_multiply { numeric_binop($_[0], $multiply_op) }
+    sub pp_divide { numeric_binop($_[0], $divide_op) }
+    sub pp_modulo { int_binop($_[0], $modulo_op) } # differs from perl's
+
+    sub pp_left_shift { int_binop($_[0], $lshift_op) }
+    sub pp_right_shift { int_binop($_[0], $rshift_op) }
+    sub pp_i_add { int_binop($_[0], $plus_op) }
+    sub pp_i_subtract { int_binop($_[0], $minus_op) }
+    sub pp_i_multiply { int_binop($_[0], $multiply_op) }
+    sub pp_i_divide { int_binop($_[0], $divide_op) }
+    sub pp_i_modulo { int_binop($_[0], $modulo_op) }
+
+    sub pp_eq { bool_numeric_binop($_[0], $eq_op) }
+    sub pp_ne { bool_numeric_binop($_[0], $ne_op) }
+    sub pp_lt { bool_numeric_binop($_[0], $lt_op) }
+    sub pp_gt { bool_numeric_binop($_[0], $gt_op) }
+    sub pp_le { bool_numeric_binop($_[0], $le_op) }
+    sub pp_ge { bool_numeric_binop($_[0], $ge_op) }
+
+    sub pp_i_eq { bool_int_binop($_[0], $eq_op) }
+    sub pp_i_ne { bool_int_binop($_[0], $ne_op) }
+    sub pp_i_lt { bool_int_binop($_[0], $lt_op) }
+    sub pp_i_gt { bool_int_binop($_[0], $gt_op) }
+    sub pp_i_le { bool_int_binop($_[0], $le_op) }
+    sub pp_i_ge { bool_int_binop($_[0], $ge_op) }
+
+    sub pp_scmp { sv_binop($_[0], $scmp_op, INT_RESULT) }
+    sub pp_slt { bool_sv_binop($_[0], $slt_op) }
+    sub pp_sgt { bool_sv_binop($_[0], $sgt_op) }
+    sub pp_sle { bool_sv_binop($_[0], $sle_op) }
+    sub pp_sge { bool_sv_binop($_[0], $sge_op) }
+    sub pp_seq { bool_sv_binop($_[0], $seq_op) }
+    sub pp_sne { bool_sv_binop($_[0], $sne_op) }
+}
+
+
+sub pp_sassign {
+    my $op = shift;
+    my $backwards = $op->private & OPpASSIGN_BACKWARDS;
+    my ($dst, $src);
+    if (@stack >= 2) {
+	$dst = pop @stack;
+	$src = pop @stack;
+	($src, $dst) = ($dst, $src) if $backwards;
+	my $type = $src->{type};
+	if ($type == T_INT) {
+	    $dst->set_int($src->as_int,$src->{flags} & VALID_UNSIGNED);
+	} elsif ($type == T_DOUBLE) {
+	    $dst->set_numeric($src->as_numeric);
+	} else {
+	    $dst->set_sv($src->as_sv);
+	}
+	push(@stack, $dst);
+    } elsif (@stack == 1) {
+	if ($backwards) {
+	    my $src = pop @stack;
+	    my $type = $src->{type};
+	    runtime("if (PL_tainting && PL_tainted) TAINT_NOT;");
+	    if ($type == T_INT) {
+                if ($src->{flags} & VALID_UNSIGNED){ 
+                     runtime sprintf("sv_setuv(TOPs, %s);", $src->as_int);
+                }else{
+                    runtime sprintf("sv_setiv(TOPs, %s);", $src->as_int);
+                }
+	    } elsif ($type == T_DOUBLE) {
+		runtime sprintf("sv_setnv(TOPs, %s);", $src->as_double);
+	    } else {
+		runtime sprintf("sv_setsv(TOPs, %s);", $src->as_sv);
+	    }
+	    runtime("SvSETMAGIC(TOPs);");
+	} else {
+	    my $dst = $stack[-1];
+	    my $type = $dst->{type};
+	    runtime("sv = POPs;");
+	    runtime("MAYBE_TAINT_SASSIGN_SRC(sv);");
+	    if ($type == T_INT) {
+		$dst->set_int("SvIV(sv)");
+	    } elsif ($type == T_DOUBLE) {
+		$dst->set_double("SvNV(sv)");
+	    } else {
+		runtime("SvSetMagicSV($dst->{sv}, sv);");
+		$dst->invalidate;
+	    }
+	}
+    } else {
+	if ($backwards) {
+	    runtime("src = POPs; dst = TOPs;");
+	} else {
+	    runtime("dst = POPs; src = TOPs;");
+	}
+	runtime("MAYBE_TAINT_SASSIGN_SRC(src);",
+		"SvSetSV(dst, src);",
+		"SvSETMAGIC(dst);",
+		"SETs(dst);");
+    }
+    return $op->next;
+}
+
+sub pp_preinc {
+    my $op = shift;
+    if (@stack >= 1) {
+	my $obj = $stack[-1];
+	my $type = $obj->{type};
+	if ($type == T_INT || $type == T_DOUBLE) {
+	    $obj->set_int($obj->as_int . " + 1");
+	} else {
+	    runtime sprintf("PP_PREINC(%s);", $obj->as_sv);
+	    $obj->invalidate();
+	}
+    } else {
+	runtime sprintf("PP_PREINC(TOPs);");
+    }
+    return $op->next;
+}
+
+
+sub pp_pushmark {
+    my $op = shift;
+    write_back_stack();
+    runtime("PUSHMARK(sp);");
+    return $op->next;
+}
+
+sub pp_list {
+    my $op = shift;
+    write_back_stack();
+    my $gimme = gimme($op);
+    if ($gimme == G_ARRAY) { # sic
+	runtime("POPMARK;"); # need this even though not a "full" pp_list
+    } else {
+	runtime("PP_LIST($gimme);");
+    }
+    return $op->next;
+}
+
+sub pp_entersub {
+    my $op = shift;
+    $curcop->write_back;
+    write_back_lexicals(REGISTER|TEMPORARY);
+    write_back_stack();
+    my $sym = doop($op);
+    runtime("while (PL_op != ($sym)->op_next && PL_op != (OP*)0 ){");
+    runtime("PL_op = (*PL_op->op_ppaddr)(aTHX);");
+    runtime("SPAGAIN;}");
+    $know_op = 0;
+    invalidate_lexicals(REGISTER|TEMPORARY);
+    return $op->next;
+}
+sub pp_formline {
+    my $op = shift;
+    my $ppname = $op->ppaddr;
+    write_back_lexicals() unless $skip_lexicals{$ppname};
+    write_back_stack() unless $skip_stack{$ppname};
+    my $sym=doop($op);
+    # See comment in pp_grepwhile to see why!
+    $init->add("((LISTOP*)$sym)->op_first = $sym;");    
+    runtime("if (PL_op == ((LISTOP*)($sym))->op_first){");
+    save_or_restore_lexical_state(${$op->first});
+    runtime( sprintf("goto %s;",label($op->first)));
+    runtime("}");
+    return $op->next;
+}
+
+sub pp_goto{
+
+    my $op = shift;
+    my $ppname = $op->ppaddr;
+    write_back_lexicals() unless $skip_lexicals{$ppname};
+    write_back_stack() unless $skip_stack{$ppname};
+    my $sym=doop($op);
+    runtime("if (PL_op != ($sym)->op_next && PL_op != (OP*)0){return PL_op;}");
+    invalidate_lexicals() unless $skip_invalidate{$ppname};
+    return $op->next;
+}
+sub pp_enterwrite {
+    my $op = shift;
+    pp_entersub($op);
+}
+sub pp_leavesub{
+    my $op = shift;
+    write_back_lexicals() unless $skip_lexicals{$ppname};
+    write_back_stack() unless $skip_stack{$ppname};
+    runtime("if (PL_curstackinfo->si_type == PERLSI_SORT){");   
+    runtime("\tPUTBACK;return 0;");
+    runtime("}");
+    doop($op);
+    return $op->next;
+}
+sub pp_leavewrite {
+    my $op = shift;
+    write_back_lexicals(REGISTER|TEMPORARY);
+    write_back_stack();
+    my $sym = doop($op);
+    # XXX Is this the right way to distinguish between it returning
+    # CvSTART(cv) (via doform) and pop_return()?
+    #runtime("if (PL_op) PL_op = (*PL_op->op_ppaddr)(aTHX);");
+    runtime("SPAGAIN;");
+    $know_op = 0;
+    invalidate_lexicals(REGISTER|TEMPORARY);
+    return $op->next;
+}
+
+sub doeval {
+    my $op = shift;
+    $curcop->write_back;
+    write_back_lexicals(REGISTER|TEMPORARY);
+    write_back_stack();
+    my $sym = loadop($op);
+    my $ppaddr = $op->ppaddr;
+    #runtime(qq/printf("$ppaddr type eval\n");/);
+    runtime("PP_EVAL($ppaddr, ($sym)->op_next);");
+    $know_op = 1;
+    invalidate_lexicals(REGISTER|TEMPORARY);
+    return $op->next;
+}
+
+sub pp_entereval { doeval(@_) }
+sub pp_dofile { doeval(@_) }
+
+#pp_require is protected by pp_entertry, so no protection for it.
+sub pp_require {
+    my $op = shift;
+    $curcop->write_back;
+    write_back_lexicals(REGISTER|TEMPORARY);
+    write_back_stack();
+    my $sym = doop($op);
+    runtime("while (PL_op != ($sym)->op_next && PL_op != (OP*)0 ){");
+    runtime("PL_op = (*PL_op->op_ppaddr)(ARGS);");
+    runtime("SPAGAIN;}");
+    $know_op = 1;
+    invalidate_lexicals(REGISTER|TEMPORARY);
+    return $op->next;
+}
+
+
+sub pp_entertry {
+    my $op = shift;
+    $curcop->write_back;
+    write_back_lexicals(REGISTER|TEMPORARY);
+    write_back_stack();
+    my $sym = doop($op);
+    my $jmpbuf = sprintf("jmpbuf%d", $jmpbuf_ix++);
+    declare("JMPENV", $jmpbuf);
+    runtime(sprintf("PP_ENTERTRY(%s,%s);", $jmpbuf, label($op->other->next)));
+    invalidate_lexicals(REGISTER|TEMPORARY);
+    return $op->next;
+}
+
+sub pp_leavetry{
+	my $op=shift;
+	default_pp($op);
+	runtime("PP_LEAVETRY;");
+    	return $op->next;
+}
+
+sub pp_grepstart {
+    my $op = shift;
+    if ($need_freetmps && $freetmps_each_loop) {
+	runtime("FREETMPS;"); # otherwise the grepwhile loop messes things up
+	$need_freetmps = 0;
+    }
+    write_back_stack();
+    my $sym= doop($op);
+    my $next=$op->next;
+    $next->save;
+    my $nexttonext=$next->next;
+    $nexttonext->save;
+    save_or_restore_lexical_state($$nexttonext);
+    runtime(sprintf("if (PL_op == (($sym)->op_next)->op_next) goto %s;",
+		    label($nexttonext)));
+    return $op->next->other;
+}
+
+sub pp_mapstart {
+    my $op = shift;
+    if ($need_freetmps && $freetmps_each_loop) {
+	runtime("FREETMPS;"); # otherwise the mapwhile loop messes things up
+	$need_freetmps = 0;
+    }
+    write_back_stack();
+    # pp_mapstart can return either op_next->op_next or op_next->op_other and
+    # we need to be able to distinguish the two at runtime. 
+    my $sym= doop($op);
+    my $next=$op->next;
+    $next->save;
+    my $nexttonext=$next->next;
+    $nexttonext->save;
+    save_or_restore_lexical_state($$nexttonext);
+    runtime(sprintf("if (PL_op == (($sym)->op_next)->op_next) goto %s;",
+		    label($nexttonext)));
+    return $op->next->other;
+}
+
+sub pp_grepwhile {
+    my $op = shift;
+    my $next = $op->next;
+    unshift(@bblock_todo, $next);
+    write_back_lexicals();
+    write_back_stack();
+    my $sym = doop($op);
+    # pp_grepwhile can return either op_next or op_other and we need to
+    # be able to distinguish the two at runtime. Since it's possible for
+    # both ops to be "inlined", the fields could both be zero. To get
+    # around that, we hack op_next to be our own op (purely because we
+    # know it's a non-NULL pointer and can't be the same as op_other).
+    $init->add("((LOGOP*)$sym)->op_next = $sym;");
+    save_or_restore_lexical_state($$next);
+    runtime(sprintf("if (PL_op == ($sym)->op_next) goto %s;", label($next)));
+    $know_op = 0;
+    return $op->other;
+}
+
+sub pp_mapwhile {
+    pp_grepwhile(@_);
+}
+
+sub pp_return {
+    my $op = shift;
+    write_back_lexicals(REGISTER|TEMPORARY);
+    write_back_stack();
+    doop($op);
+    runtime("PUTBACK;", "return PL_op;");
+    $know_op = 0;
+    return $op->next;
+}
+
+sub nyi {
+    my $op = shift;
+    warn sprintf("%s not yet implemented properly\n", $op->ppaddr);
+    return default_pp($op);
+}
+
+sub pp_range {
+    my $op = shift;
+    my $flags = $op->flags;
+    if (!($flags & OPf_WANT)) {
+	error("context of range unknown at compile-time");
+    }
+    write_back_lexicals();
+    write_back_stack();
+    unless (($flags & OPf_WANT)== OPf_WANT_LIST) {
+	# We need to save our UNOP structure since pp_flop uses
+	# it to find and adjust out targ. We don't need it ourselves.
+	$op->save;
+        save_or_restore_lexical_state(${$op->other});
+	runtime sprintf("if (SvTRUE(PL_curpad[%d])) goto %s;",
+			$op->targ, label($op->other));
+	unshift(@bblock_todo, $op->other);
+    }
+    return $op->next;
+}
+
+sub pp_flip {
+    my $op = shift;
+    my $flags = $op->flags;
+    if (!($flags & OPf_WANT)) {
+	error("context of flip unknown at compile-time");
+    }
+    if (($flags & OPf_WANT)==OPf_WANT_LIST) {
+	return $op->first->other;
+    }
+    write_back_lexicals();
+    write_back_stack();
+    # We need to save our UNOP structure since pp_flop uses
+    # it to find and adjust out targ. We don't need it ourselves.
+    $op->save;
+    my $ix = $op->targ;
+    my $rangeix = $op->first->targ;
+    runtime(($op->private & OPpFLIP_LINENUM) ?
+	    "if (PL_last_in_gv && SvIV(TOPs) == IoLINES(GvIOp(PL_last_in_gv))) {"
+	  : "if (SvTRUE(TOPs)) {");
+    runtime("\tsv_setiv(PL_curpad[$rangeix], 1);");
+    if ($op->flags & OPf_SPECIAL) {
+	runtime("sv_setiv(PL_curpad[$ix], 1);");
+    } else {
+    	save_or_restore_lexical_state(${$op->first->other});
+	runtime("\tsv_setiv(PL_curpad[$ix], 0);",
+		"\tsp--;",
+		sprintf("\tgoto %s;", label($op->first->other)));
+    }
+    runtime("}",
+	  qq{sv_setpv(PL_curpad[$ix], "");},
+	    "SETs(PL_curpad[$ix]);");
+    $know_op = 0;
+    return $op->next;
+}
+
+sub pp_flop {
+    my $op = shift;
+    default_pp($op);
+    $know_op = 0;
+    return $op->next;
+}
+
+sub enterloop {
+    my $op = shift;
+    my $nextop = $op->nextop;
+    my $lastop = $op->lastop;
+    my $redoop = $op->redoop;
+    $curcop->write_back;
+    debug "enterloop: pushing on cxstack" if $debug_cxstack;
+    push(@cxstack, {
+	type => CXt_LOOP,
+	op => $op,
+	"label" => $curcop->[0]->label,
+	nextop => $nextop,
+	lastop => $lastop,
+	redoop => $redoop
+    });
+    $nextop->save;
+    $lastop->save;
+    $redoop->save;
+    return default_pp($op);
+}
+
+sub pp_enterloop { enterloop(@_) }
+sub pp_enteriter { enterloop(@_) }
+
+sub pp_leaveloop {
+    my $op = shift;
+    if (!@cxstack) {
+	die "panic: leaveloop";
+    }
+    debug "leaveloop: popping from cxstack" if $debug_cxstack;
+    pop(@cxstack);
+    return default_pp($op);
+}
+
+sub pp_next {
+    my $op = shift;
+    my $cxix;
+    if ($op->flags & OPf_SPECIAL) {
+	$cxix = dopoptoloop();
+	if ($cxix < 0) {
+	    error('"next" used outside loop');
+	    return $op->next; # ignore the op
+	}
+    } else {
+	$cxix = dopoptolabel($op->pv);
+	if ($cxix < 0) {
+	    error('Label not found at compile time for "next %s"', $op->pv);
+	    return $op->next; # ignore the op
+	}
+    }
+    default_pp($op);
+    my $nextop = $cxstack[$cxix]->{nextop};
+    push(@bblock_todo, $nextop);
+    save_or_restore_lexical_state($$nextop);
+    runtime(sprintf("goto %s;", label($nextop)));
+    return $op->next;
+}
+
+sub pp_redo {
+    my $op = shift;
+    my $cxix;
+    if ($op->flags & OPf_SPECIAL) {
+	$cxix = dopoptoloop();
+	if ($cxix < 0) {
+	    error('"redo" used outside loop');
+	    return $op->next; # ignore the op
+	}
+    } else {
+	$cxix = dopoptolabel($op->pv);
+	if ($cxix < 0) {
+	    error('Label not found at compile time for "redo %s"', $op->pv);
+	    return $op->next; # ignore the op
+	}
+    }
+    default_pp($op);
+    my $redoop = $cxstack[$cxix]->{redoop};
+    push(@bblock_todo, $redoop);
+    save_or_restore_lexical_state($$redoop);
+    runtime(sprintf("goto %s;", label($redoop)));
+    return $op->next;
+}
+
+sub pp_last {
+    my $op = shift;
+    my $cxix;
+    if ($op->flags & OPf_SPECIAL) {
+	$cxix = dopoptoloop();
+	if ($cxix < 0) {
+	    error('"last" used outside loop');
+	    return $op->next; # ignore the op
+	}
+    } else {
+	$cxix = dopoptolabel($op->pv);
+	if ($cxix < 0) {
+	    error('Label not found at compile time for "last %s"', $op->pv);
+	    return $op->next; # ignore the op
+	}
+	# XXX Add support for "last" to leave non-loop blocks
+	if ($cxstack[$cxix]->{type} != CXt_LOOP) {
+	    error('Use of "last" for non-loop blocks is not yet implemented');
+	    return $op->next; # ignore the op
+	}
+    }
+    default_pp($op);
+    my $lastop = $cxstack[$cxix]->{lastop}->next;
+    push(@bblock_todo, $lastop);
+    save_or_restore_lexical_state($$lastop);
+    runtime(sprintf("goto %s;", label($lastop)));
+    return $op->next;
+}
+
+sub pp_subst {
+    my $op = shift;
+    write_back_lexicals();
+    write_back_stack();
+    my $sym = doop($op);
+    my $replroot = $op->pmreplroot;
+    if ($$replroot) {
+        save_or_restore_lexical_state($$replroot);
+	runtime sprintf("if (PL_op == ((PMOP*)(%s))->op_pmreplroot) goto %s;",
+			$sym, label($replroot));
+	$op->pmreplstart->save;
+	push(@bblock_todo, $replroot);
+    }
+    invalidate_lexicals();
+    return $op->next;
+}
+
+sub pp_substcont {
+    my $op = shift;
+    write_back_lexicals();
+    write_back_stack();
+    doop($op);
+    my $pmop = $op->other;
+    # warn sprintf("substcont: op = %s, pmop = %s\n",
+    # 		 peekop($op), peekop($pmop));#debug
+#   my $pmopsym = objsym($pmop);
+    my $pmopsym = $pmop->save; # XXX can this recurse?
+#   warn "pmopsym = $pmopsym\n";#debug
+    save_or_restore_lexical_state(${$pmop->pmreplstart});
+    runtime sprintf("if (PL_op == ((PMOP*)(%s))->op_pmreplstart) goto %s;",
+		    $pmopsym, label($pmop->pmreplstart));
+    invalidate_lexicals();
+    return $pmop->next;
+}
+
+sub default_pp {
+    my $op = shift;
+    my $ppname = "pp_" . $op->name;
+    if ($curcop and $need_curcop{$ppname}){
+	$curcop->write_back;
+    }
+    write_back_lexicals() unless $skip_lexicals{$ppname};
+    write_back_stack() unless $skip_stack{$ppname};
+    doop($op);
+    # XXX If the only way that ops can write to a TEMPORARY lexical is
+    # when it's named in $op->targ then we could call
+    # invalidate_lexicals(TEMPORARY) and avoid having to write back all
+    # the temporaries. For now, we'll play it safe and write back the lot.
+    invalidate_lexicals() unless $skip_invalidate{$ppname};
+    return $op->next;
+}
+
+sub compile_op {
+    my $op = shift;
+    my $ppname = "pp_" . $op->name;
+    if (exists $ignore_op{$ppname}) {
+	return $op->next;
+    }
+    debug peek_stack() if $debug_stack;
+    if ($debug_op) {
+	debug sprintf("%s [%s]\n",
+		     peekop($op),
+		     $op->flags & OPf_STACKED ? "OPf_STACKED" : $op->targ);
+    }
+    no strict 'refs';
+    if (defined(&$ppname)) {
+	$know_op = 0;
+	return &$ppname($op);
+    } else {
+	return default_pp($op);
+    }
+}
+
+sub compile_bblock {
+    my $op = shift;
+    #warn "compile_bblock: ", peekop($op), "\n"; # debug
+    save_or_restore_lexical_state($$op);
+    write_label($op);
+    $know_op = 0;
+    do {
+	$op = compile_op($op);
+    } while (defined($op) && $$op && !exists($leaders->{$$op}));
+    write_back_stack(); # boo hoo: big loss
+    reload_lexicals();
+    return $op;
+}
+
+sub cc {
+    my ($name, $root, $start, @padlist) = @_;
+    my $op;
+    if($done{$$start}){ 
+    	#warn "repeat=>".ref($start)."$name,\n";#debug
+	$decl->add(sprintf("#define $name  %s",$done{$$start}));
+	return;
+    }
+    init_pp($name);
+    load_pad(@padlist);
+    %lexstate=();
+    B::Pseudoreg->new_scope;
+    @cxstack = ();
+    if ($debug_timings) {
+	warn sprintf("Basic block analysis at %s\n", timing_info);
+    }
+    $leaders = find_leaders($root, $start);
+    my @leaders= keys %$leaders; 
+    if ($#leaders > -1) { 
+    	@bblock_todo = ($start, values %$leaders) ;
+    } else{
+	runtime("return PL_op?PL_op->op_next:0;");
+    }
+    if ($debug_timings) {
+	warn sprintf("Compilation at %s\n", timing_info);
+    }
+    while (@bblock_todo) {
+	$op = shift @bblock_todo;
+	#warn sprintf("Considering basic block %s\n", peekop($op)); # debug
+	next if !defined($op) || !$$op || $done{$$op};
+	#warn "...compiling it\n"; # debug
+	do {
+	    $done{$$op} = $name;
+	    $op = compile_bblock($op);
+	    if ($need_freetmps && $freetmps_each_bblock) {
+		runtime("FREETMPS;");
+		$need_freetmps = 0;
+	    }
+	} while defined($op) && $$op && !$done{$$op};
+	if ($need_freetmps && $freetmps_each_loop) {
+	    runtime("FREETMPS;");
+	    $need_freetmps = 0;
+	}
+	if (!$$op) {
+	    runtime("PUTBACK;","return PL_op;");
+	} elsif ($done{$$op}) {
+    	    save_or_restore_lexical_state($$op);
+	    runtime(sprintf("goto %s;", label($op)));
+	}
+    }
+    if ($debug_timings) {
+	warn sprintf("Saving runtime at %s\n", timing_info);
+    }
+    declare_pad(@padlist) ;
+    save_runtime();
+}
+
+sub cc_recurse {
+    my $ccinfo;
+    my $start;
+    $start = cc_queue(@_) if @_;
+    while ($ccinfo = shift @cc_todo) {
+	cc(@$ccinfo);
+    }
+    return $start;
+}    
+
+sub cc_obj {
+    my ($name, $cvref) = @_;
+    my $cv = svref_2object($cvref);
+    my @padlist = $cv->PADLIST->ARRAY;
+    my $curpad_sym = $padlist[1]->save;
+    cc_recurse($name, $cv->ROOT, $cv->START, @padlist);
+}
+
+sub cc_main {
+    my @comppadlist = comppadlist->ARRAY;
+    my $curpad_nam  = $comppadlist[0]->save;
+    my $curpad_sym  = $comppadlist[1]->save;
+    my $init_av     = init_av->save; 
+    my $start = cc_recurse("pp_main", main_root, main_start, @comppadlist);
+    # Do save_unused_subs before saving inc_hv
+    save_unused_subs();
+    cc_recurse();
+
+    my $inc_hv      = svref_2object(\%INC)->save;
+    my $inc_av      = svref_2object(\@INC)->save;
+    my $amagic_generate= amagic_generation;
+    return if $errors;
+    if (!defined($module)) {
+	$init->add(sprintf("PL_main_root = s\\_%x;", ${main_root()}),
+		   "PL_main_start = $start;",
+		   "PL_curpad = AvARRAY($curpad_sym);",
+		   "PL_initav = (AV *) $init_av;",
+		   "GvHV(PL_incgv) = $inc_hv;",
+		   "GvAV(PL_incgv) = $inc_av;",
+		   "av_store(CvPADLIST(PL_main_cv),0,SvREFCNT_inc($curpad_nam));",
+		   "av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc($curpad_sym));",
+		   "PL_amagic_generation= $amagic_generate;",
+		     );
+                 
+    }
+    seek(STDOUT,0,0); #prevent print statements from BEGIN{} into the output
+    output_boilerplate();
+    print "\n";
+    output_all("perl_init");
+    output_runtime();
+    print "\n";
+    output_main();
+    if (defined($module)) {
+	my $cmodule = $module;
+	$cmodule =~ s/::/__/g;
+	print <<"EOT";
+
+#include "XSUB.h"
+XS(boot_$cmodule)
+{
+    dXSARGS;
+    perl_init();
+    ENTER;
+    SAVETMPS;
+    SAVEVPTR(PL_curpad);
+    SAVEVPTR(PL_op);
+    PL_curpad = AvARRAY($curpad_sym);
+    PL_op = $start;
+    pp_main(aTHX);
+    FREETMPS;
+    LEAVE;
+    ST(0) = &PL_sv_yes;
+    XSRETURN(1);
+}
+EOT
+    }
+    if ($debug_timings) {
+	warn sprintf("Done at %s\n", timing_info);
+    }
+}
+
+sub compile {
+    my @options = @_;
+    my ($option, $opt, $arg);
+  OPTION:
+    while ($option = shift @options) {
+	if ($option =~ /^-(.)(.*)/) {
+	    $opt = $1;
+	    $arg = $2;
+	} else {
+	    unshift @options, $option;
+	    last OPTION;
+	}
+	if ($opt eq "-" && $arg eq "-") {
+	    shift @options;
+	    last OPTION;
+	} elsif ($opt eq "o") {
+	    $arg ||= shift @options;
+	    open(STDOUT, ">$arg") or return "open '>$arg': $!\n";
+	} elsif ($opt eq "n") {
+	    $arg ||= shift @options;
+	    $module_name = $arg;
+	} elsif ($opt eq "u") {
+	    $arg ||= shift @options;
+	    mark_unused($arg,undef);
+	} elsif ($opt eq "f") {
+	    $arg ||= shift @options;
+	    my $value = $arg !~ s/^no-//;
+	    $arg =~ s/-/_/g;
+	    my $ref = $optimise{$arg};
+	    if (defined($ref)) {
+		$$ref = $value;
+	    } else {
+		warn qq(ignoring unknown optimisation option "$arg"\n);
+	    }
+	} elsif ($opt eq "O") {
+	    $arg = 1 if $arg eq "";
+	    my $ref;
+	    foreach $ref (values %optimise) {
+		$$ref = 0;
+	    }
+	    if ($arg >= 2) {
+		$freetmps_each_loop = 1;
+	    }
+	    if ($arg >= 1) {
+		$freetmps_each_bblock = 1 unless $freetmps_each_loop;
+	    }
+	} elsif ($opt eq "m") {
+	    $arg ||= shift @options;
+	    $module = $arg;
+	    mark_unused($arg,undef);
+	} elsif ($opt eq "p") {
+	    $arg ||= shift @options;
+	    $patchlevel = $arg;
+	} elsif ($opt eq "D") {
+            $arg ||= shift @options;
+	    foreach $arg (split(//, $arg)) {
+		if ($arg eq "o") {
+		    B->debug(1);
+		} elsif ($arg eq "O") {
+		    $debug_op = 1;
+		} elsif ($arg eq "s") {
+		    $debug_stack = 1;
+		} elsif ($arg eq "c") {
+		    $debug_cxstack = 1;
+		} elsif ($arg eq "p") {
+		    $debug_pad = 1;
+		} elsif ($arg eq "r") {
+		    $debug_runtime = 1;
+		} elsif ($arg eq "S") {
+		    $debug_shadow = 1;
+		} elsif ($arg eq "q") {
+		    $debug_queue = 1;
+		} elsif ($arg eq "l") {
+		    $debug_lineno = 1;
+		} elsif ($arg eq "t") {
+		    $debug_timings = 1;
+		}
+	    }
+	}
+    }
+    init_sections();
+    $init = B::Section->get("init");
+    $decl = B::Section->get("decl");
+
+    if (@options) {
+	return sub {
+	    my ($objname, $ppname);
+	    foreach $objname (@options) {
+		$objname = "main::$objname" unless $objname =~ /::/;
+		($ppname = $objname) =~ s/^.*?:://;
+		eval "cc_obj(qq(pp_sub_$ppname), \\&$objname)";
+		die "cc_obj(qq(pp_sub_$ppname, \\&$objname) failed: $@" if $@;
+		return if $errors;
+	    }
+	    output_boilerplate();
+	    print "\n";
+	    output_all($module_name || "init_module");
+	    output_runtime();
+	}
+    } else {
+	return sub { cc_main() };
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::CC - Perl compiler's optimized C translation backend
+
+=head1 SYNOPSIS
+
+	perl -MO=CC[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+This compiler backend takes Perl source and generates C source code
+corresponding to the flow of your program. In other words, this
+backend is somewhat a "real" compiler in the sense that many people
+think about compilers. Note however that, currently, it is a very
+poor compiler in that although it generates (mostly, or at least
+sometimes) correct code, it performs relatively few optimisations.
+This will change as the compiler develops. The result is that
+running an executable compiled with this backend may start up more
+quickly than running the original Perl program (a feature shared
+by the B<C> compiler backend--see F<B::C>) and may also execute
+slightly faster. This is by no means a good optimising compiler--yet.
+
+=head1 OPTIONS
+
+If there are any non-option arguments, they are taken to be
+names of objects to be saved (probably doesn't work properly yet).
+Without extra arguments, it saves the main program.
+
+=over 4
+
+=item B<-ofilename>
+
+Output to filename instead of STDOUT
+
+=item B<-v>
+
+Verbose compilation (currently gives a few compilation statistics).
+
+=item B<-->
+
+Force end of options
+
+=item B<-uPackname>
+
+Force apparently unused subs from package Packname to be compiled.
+This allows programs to use eval "foo()" even when sub foo is never
+seen to be used at compile time. The down side is that any subs which
+really are never used also have code generated. This option is
+necessary, for example, if you have a signal handler foo which you
+initialise with C<$SIG{BAR} = "foo">.  A better fix, though, is just
+to change it to C<$SIG{BAR} = \&foo>. You can have multiple B<-u>
+options. The compiler tries to figure out which packages may possibly
+have subs in which need compiling but the current version doesn't do
+it very well. In particular, it is confused by nested packages (i.e.
+of the form C<A::B>) where package C<A> does not contain any subs.
+
+=item B<-mModulename>
+
+Instead of generating source for a runnable executable, generate
+source for an XSUB module. The boot_Modulename function (which
+DynaLoader can look for) does the appropriate initialisation and runs
+the main part of the Perl source that is being compiled.
+
+
+=item B<-D>
+
+Debug options (concatenated or separate flags like C<perl -D>).
+
+=item B<-Dr>
+
+Writes debugging output to STDERR just as it's about to write to the
+program's runtime (otherwise writes debugging info as comments in
+its C output).
+
+=item B<-DO>
+
+Outputs each OP as it's compiled
+
+=item B<-Ds>
+
+Outputs the contents of the shadow stack at each OP
+
+=item B<-Dp>
+
+Outputs the contents of the shadow pad of lexicals as it's loaded for
+each sub or the main program.
+
+=item B<-Dq>
+
+Outputs the name of each fake PP function in the queue as it's about
+to process it.
+
+=item B<-Dl>
+
+Output the filename and line number of each original line of Perl
+code as it's processed (C<pp_nextstate>).
+
+=item B<-Dt>
+
+Outputs timing information of compilation stages.
+
+=item B<-f>
+
+Force optimisations on or off one at a time.
+
+=item B<-ffreetmps-each-bblock>
+
+Delays FREETMPS from the end of each statement to the end of the each
+basic block.
+
+=item B<-ffreetmps-each-loop>
+
+Delays FREETMPS from the end of each statement to the end of the group
+of basic blocks forming a loop. At most one of the freetmps-each-*
+options can be used.
+
+=item B<-fomit-taint>
+
+Omits generating code for handling perl's tainting mechanism.
+
+=item B<-On>
+
+Optimisation level (n = 0, 1, 2, ...). B<-O> means B<-O1>.
+Currently, B<-O1> sets B<-ffreetmps-each-bblock> and B<-O2>
+sets B<-ffreetmps-each-loop>.
+
+=back
+
+=head1 EXAMPLES
+
+        perl -MO=CC,-O2,-ofoo.c foo.pl
+        perl cc_harness -o foo foo.c
+
+Note that C<cc_harness> lives in the C<B> subdirectory of your perl
+library directory. The utility called C<perlcc> may also be used to
+help make use of this compiler.
+
+        perl -MO=CC,-mFoo,-oFoo.c Foo.pm
+        perl cc_harness -shared -c -o Foo.so Foo.c
+
+=head1 BUGS
+
+Plenty. Current status: experimental.
+
+=head1 DIFFERENCES
+
+These aren't really bugs but they are constructs which are heavily
+tied to perl's compile-and-go implementation and with which this
+compiler backend cannot cope.
+
+=head2 Loops
+
+Standard perl calculates the target of "next", "last", and "redo"
+at run-time. The compiler calculates the targets at compile-time.
+For example, the program
+
+    sub skip_on_odd { next NUMBER if $_[0] % 2 }
+    NUMBER: for ($i = 0; $i < 5; $i++) {
+        skip_on_odd($i);
+        print $i;
+    }
+
+produces the output
+
+    024
+
+with standard perl but gives a compile-time error with the compiler.
+
+=head2 Context of ".."
+
+The context (scalar or array) of the ".." operator determines whether
+it behaves as a range or a flip/flop. Standard perl delays until
+runtime the decision of which context it is in but the compiler needs
+to know the context at compile-time. For example,
+
+    @a = (4,6,1,0,0,1);
+    sub range { (shift @a)..(shift @a) }
+    print range();
+    while (@a) { print scalar(range()) }
+
+generates the output
+
+    456123E0
+
+with standard Perl but gives a compile-time error with compiled Perl.
+
+=head2 Arithmetic
+
+Compiled Perl programs use native C arithmetic much more frequently
+than standard perl. Operations on large numbers or on boundary
+cases may produce different behaviour.
+
+=head2 Deprecated features
+
+Features of standard perl such as C<$[> which have been deprecated
+in standard perl since Perl5 was released have not been implemented
+in the compiler.
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Concise.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Concise.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Concise.pm	(revision 14489)
@@ -0,0 +1,1628 @@
+package B::Concise;
+# Copyright (C) 2000-2003 Stephen McCamant. All rights reserved.
+# This program is free software; you can redistribute and/or modify it
+# under the same terms as Perl itself.
+
+# Note: we need to keep track of how many use declarations/BEGIN
+# blocks this module uses, so we can avoid printing them when user
+# asks for the BEGIN blocks in her program. Update the comments and
+# the count in concise_specials if you add or delete one. The
+# -MO=Concise counts as use #1.
+
+use strict; # use #2
+use warnings; # uses #3 and #4, since warnings uses Carp
+
+use Exporter (); # use #5
+
+our $VERSION   = "0.66";
+our @ISA       = qw(Exporter);
+our @EXPORT_OK = qw( set_style set_style_standard add_callback
+		     concise_subref concise_cv concise_main
+		     add_style walk_output compile reset_sequence );
+our %EXPORT_TAGS =
+    ( io	=> [qw( walk_output compile reset_sequence )],
+      style	=> [qw( add_style set_style_standard )],
+      cb	=> [qw( add_callback )],
+      mech	=> [qw( concise_subref concise_cv concise_main )],  );
+
+# use #6
+use B qw(class ppname main_start main_root main_cv cstring svref_2object
+	 SVf_IOK SVf_NOK SVf_POK SVf_IVisUV SVf_FAKE OPf_KIDS OPf_SPECIAL
+	 CVf_ANON);
+
+my %style =
+  ("terse" =>
+   ["(?(#label =>\n)?)(*(    )*)#class (#addr) #name (?([#targ])?) "
+    . "#svclass~(?((#svaddr))?)~#svval~(?(label \"#coplabel\")?)\n",
+    "(*(    )*)goto #class (#addr)\n",
+    "#class pp_#name"],
+   "concise" =>
+   ["#hyphseq2 (*(   (x( ;)x))*)<#classsym> "
+    . "#exname#arg(?([#targarglife])?)~#flags(?(/#private)?)(x(;~->#next)x)\n"
+    , "  (*(    )*)     goto #seq\n",
+    "(?(<#seq>)?)#exname#arg(?([#targarglife])?)"],
+   "linenoise" =>
+   ["(x(;(*( )*))x)#noise#arg(?([#targarg])?)(x( ;\n)x)",
+    "gt_#seq ",
+    "(?(#seq)?)#noise#arg(?([#targarg])?)"],
+   "debug" =>
+   ["#class (#addr)\n\top_next\t\t#nextaddr\n\top_sibling\t#sibaddr\n\t"
+    . "op_ppaddr\tPL_ppaddr[OP_#NAME]\n\top_type\t\t#typenum\n" .
+    ($] > 5.009 ? '' : "\top_seq\t\t#seqnum\n")
+    . "\top_flags\t#flagval\n\top_private\t#privval\n"
+    . "(?(\top_first\t#firstaddr\n)?)(?(\top_last\t\t#lastaddr\n)?)"
+    . "(?(\top_sv\t\t#svaddr\n)?)",
+    "    GOTO #addr\n",
+    "#addr"],
+   "env" => [$ENV{B_CONCISE_FORMAT}, $ENV{B_CONCISE_GOTO_FORMAT},
+	     $ENV{B_CONCISE_TREE_FORMAT}],
+  );
+
+# Renderings, ie how Concise prints, is controlled by these vars
+# primary:
+our $stylename;		# selects current style from %style
+my $order = "basic";	# how optree is walked & printed: basic, exec, tree
+
+# rendering mechanics:
+# these 'formats' are the line-rendering templates
+# they're updated from %style when $stylename changes
+my ($format, $gotofmt, $treefmt);
+
+# lesser players:
+my $base = 36;		# how <sequence#> is displayed
+my $big_endian = 1;	# more <sequence#> display
+my $tree_style = 0;	# tree-order details
+my $banner = 1;		# print banner before optree is traversed
+my $do_main = 0;	# force printing of main routine
+
+# another factor: can affect all styles!
+our @callbacks;		# allow external management
+
+set_style_standard("concise");
+
+my $curcv;
+my $cop_seq_base;
+
+sub set_style {
+    ($format, $gotofmt, $treefmt) = @_;
+    #warn "set_style: deprecated, use set_style_standard instead\n"; # someday
+    die "expecting 3 style-format args\n" unless @_ == 3;
+}
+
+sub add_style {
+    my ($newstyle,@args) = @_;
+    die "style '$newstyle' already exists, choose a new name\n"
+	if exists $style{$newstyle};
+    die "expecting 3 style-format args\n" unless @args == 3;
+    $style{$newstyle} = [@args];
+    $stylename = $newstyle; # update rendering state
+}
+
+sub set_style_standard {
+    ($stylename) = @_; # update rendering state
+    die "err: style '$stylename' unknown\n" unless exists $style{$stylename};
+    set_style(@{$style{$stylename}});
+}
+
+sub add_callback {
+    push @callbacks, @_;
+}
+
+# output handle, used with all Concise-output printing
+our $walkHandle;	# public for your convenience
+BEGIN { $walkHandle = \*STDOUT }
+
+sub walk_output { # updates $walkHandle
+    my $handle = shift;
+    return $walkHandle unless $handle; # allow use as accessor
+
+    if (ref $handle eq 'SCALAR') {
+	require Config;
+	die "no perlio in this build, can't call walk_output (\\\$scalar)\n"
+	    unless $Config::Config{useperlio};
+	# in 5.8+, open(FILEHANDLE,MODE,REFERENCE) writes to string
+	open my $tmp, '>', $handle;	# but cant re-set existing STDOUT
+	$walkHandle = $tmp;		# so use my $tmp as intermediate var
+	return $walkHandle;
+    }
+    my $iotype = ref $handle;
+    die "expecting argument/object that can print\n"
+	unless $iotype eq 'GLOB' or $iotype and $handle->can('print');
+    $walkHandle = $handle;
+}
+
+sub concise_subref {
+    my($order, $coderef, $name) = @_;
+    my $codeobj = svref_2object($coderef);
+
+    return concise_stashref(@_)
+	unless ref $codeobj eq 'B::CV';
+    concise_cv_obj($order, $codeobj, $name);
+}
+
+sub concise_stashref {
+    my($order, $h) = @_;
+    foreach my $k (sort keys %$h) {
+	local *s = $h->{$k};
+	my $coderef = *s{CODE} or next;
+	reset_sequence();
+	print "FUNC: ", *s, "\n";
+	my $codeobj = svref_2object($coderef);
+	next unless ref $codeobj eq 'B::CV';
+	eval { concise_cv_obj($order, $codeobj) }
+	or warn "err $@ on $codeobj";
+    }
+}
+
+# This should have been called concise_subref, but it was exported
+# under this name in versions before 0.56
+*concise_cv = \&concise_subref;
+
+sub concise_cv_obj {
+    my ($order, $cv, $name) = @_;
+    # name is either a string, or a CODE ref (copy of $cv arg??)
+
+    $curcv = $cv;
+    if ($cv->XSUB) {
+	print $walkHandle "$name is XS code\n";
+	return;
+    }
+    if (class($cv->START) eq "NULL") {
+	no strict 'refs';
+	if (ref $name eq 'CODE') {
+	    print $walkHandle "coderef $name has no START\n";
+	}
+	elsif (exists &$name) {
+	    print $walkHandle "$name exists in stash, but has no START\n";
+	}
+	else {
+	    print $walkHandle "$name not in symbol table\n";
+	}
+	return;
+    }
+    sequence($cv->START);
+    if ($order eq "exec") {
+	walk_exec($cv->START);
+    }
+    elsif ($order eq "basic") {
+	# walk_topdown($cv->ROOT, sub { $_[0]->concise($_[1]) }, 0);
+	my $root = $cv->ROOT;
+	unless (ref $root eq 'B::NULL') {
+	    walk_topdown($root, sub { $_[0]->concise($_[1]) }, 0);
+	} else {
+	    print $walkHandle "B::NULL encountered doing ROOT on $cv. avoiding disaster\n";
+	}
+    } else {
+	print $walkHandle tree($cv->ROOT, 0);
+    }
+}
+
+sub concise_main {
+    my($order) = @_;
+    sequence(main_start);
+    $curcv = main_cv;
+    if ($order eq "exec") {
+	return if class(main_start) eq "NULL";
+	walk_exec(main_start);
+    } elsif ($order eq "tree") {
+	return if class(main_root) eq "NULL";
+	print $walkHandle tree(main_root, 0);
+    } elsif ($order eq "basic") {
+	return if class(main_root) eq "NULL";
+	walk_topdown(main_root,
+		     sub { $_[0]->concise($_[1]) }, 0);
+    }
+}
+
+sub concise_specials {
+    my($name, $order, @cv_s) = @_;
+    my $i = 1;
+    if ($name eq "BEGIN") {
+	splice(@cv_s, 0, 8); # skip 7 BEGIN blocks in this file. NOW 8 ??
+    } elsif ($name eq "CHECK") {
+	pop @cv_s; # skip the CHECK block that calls us
+    }
+    for my $cv (@cv_s) {
+	print $walkHandle "$name $i:\n";
+	$i++;
+	concise_cv_obj($order, $cv, $name);
+    }
+}
+
+my $start_sym = "\e(0"; # "\cN" sometimes also works
+my $end_sym   = "\e(B"; # "\cO" respectively
+
+my @tree_decorations =
+  (["  ", "--", "+-", "|-", "| ", "`-", "-", 1],
+   [" ", "-", "+", "+", "|", "`", "", 0],
+   ["  ", map("$start_sym$_$end_sym", "qq", "wq", "tq", "x ", "mq", "q"), 1],
+   [" ", map("$start_sym$_$end_sym", "q", "w", "t", "x", "m"), "", 0],
+  );
+
+
+sub compileOpts {
+    # set rendering state from options and args
+    my (@options,@args);
+    if (@_) {
+	@options = grep(/^-/, @_);
+	@args = grep(!/^-/, @_);
+    }
+    for my $o (@options) {
+	# mode/order
+	if ($o eq "-basic") {
+	    $order = "basic";
+	} elsif ($o eq "-exec") {
+	    $order = "exec";
+	} elsif ($o eq "-tree") {
+	    $order = "tree";
+	}
+	# tree-specific
+	elsif ($o eq "-compact") {
+	    $tree_style |= 1;
+	} elsif ($o eq "-loose") {
+	    $tree_style &= ~1;
+	} elsif ($o eq "-vt") {
+	    $tree_style |= 2;
+	} elsif ($o eq "-ascii") {
+	    $tree_style &= ~2;
+	}
+	# sequence numbering
+	elsif ($o =~ /^-base(\d+)$/) {
+	    $base = $1;
+	} elsif ($o eq "-bigendian") {
+	    $big_endian = 1;
+	} elsif ($o eq "-littleendian") {
+	    $big_endian = 0;
+	}
+	elsif ($o eq "-nobanner") {
+	    $banner = 0;
+	} elsif ($o eq "-banner") {
+	    $banner = 1;
+	}
+	elsif ($o eq "-main") {
+	    $do_main = 1;
+	} elsif ($o eq "-nomain") {
+	    $do_main = 0;
+	}
+	# line-style options
+	elsif (exists $style{substr($o, 1)}) {
+	    $stylename = substr($o, 1);
+	    set_style_standard($stylename);
+	} else {
+	    warn "Option $o unrecognized";
+	}
+    }
+    return (@args);
+}
+
+sub compile {
+    my (@args) = compileOpts(@_);
+    return sub {
+	my @newargs = compileOpts(@_); # accept new rendering options
+	warn "disregarding non-options: @newargs\n" if @newargs;
+
+	for my $objname (@args) {
+	    next unless $objname; # skip null args to avoid noisy responses
+
+	    if ($objname eq "BEGIN") {
+		concise_specials("BEGIN", $order,
+				 B::begin_av->isa("B::AV") ?
+				 B::begin_av->ARRAY : ());
+	    } elsif ($objname eq "INIT") {
+		concise_specials("INIT", $order,
+				 B::init_av->isa("B::AV") ?
+				 B::init_av->ARRAY : ());
+	    } elsif ($objname eq "CHECK") {
+		concise_specials("CHECK", $order,
+				 B::check_av->isa("B::AV") ?
+				 B::check_av->ARRAY : ());
+	    } elsif ($objname eq "END") {
+		concise_specials("END", $order,
+				 B::end_av->isa("B::AV") ?
+				 B::end_av->ARRAY : ());
+	    }
+	    else {
+		# convert function names to subrefs
+		my $objref;
+		if (ref $objname) {
+		    print $walkHandle "B::Concise::compile($objname)\n"
+			if $banner;
+		    $objref = $objname;
+		} else {
+		    $objname = "main::" . $objname unless $objname =~ /::/;
+		    print $walkHandle "$objname:\n";
+		    no strict 'refs';
+		    unless (exists &$objname) {
+			print $walkHandle "err: unknown function ($objname)\n";
+			return;
+		    }
+		    $objref = \&$objname;
+		}
+		concise_subref($order, $objref, $objname);
+	    }
+	}
+	if (!@args or $do_main) {
+	    print $walkHandle "main program:\n" if $do_main;
+	    concise_main($order);
+	}
+	return @args;	# something
+    }
+}
+
+my %labels;
+my $lastnext;	# remembers op-chain, used to insert gotos
+
+my %opclass = ('OP' => "0", 'UNOP' => "1", 'BINOP' => "2", 'LOGOP' => "|",
+	       'LISTOP' => "@", 'PMOP' => "/", 'SVOP' => "\$", 'GVOP' => "*",
+	       'PVOP' => '"', 'LOOP' => "{", 'COP' => ";", 'PADOP' => "#");
+
+no warnings 'qw'; # "Possible attempt to put comments..."; use #7
+my @linenoise =
+  qw'#  () sc (  @? 1  $* gv *{ m$ m@ m% m? p/ *$ $  $# & a& pt \\ s\\ rf bl
+     `  *? <> ?? ?/ r/ c/ // qr s/ /c y/ =  @= C  sC Cp sp df un BM po +1 +I
+     -1 -I 1+ I+ 1- I- ** *  i* /  i/ %$ i% x  +  i+ -  i- .  "  << >> <  i<
+     >  i> <= i, >= i. == i= != i! <? i? s< s> s, s. s= s! s? b& b^ b| -0 -i
+     !  ~  a2 si cs rd sr e^ lg sq in %x %o ab le ss ve ix ri sf FL od ch cy
+     uf lf uc lc qm @  [f [  @[ eh vl ky dl ex %  ${ @{ uk pk st jn )  )[ a@
+     a% sl +] -] [- [+ so rv GS GW MS MW .. f. .f && || ^^ ?: &= |= -> s{ s}
+     v} ca wa di rs ;; ;  ;d }{ {  }  {} f{ it {l l} rt }l }n }r dm }g }e ^o
+     ^c ^| ^# um bm t~ u~ ~d DB db ^s se ^g ^r {w }w pf pr ^O ^K ^R ^W ^d ^v
+     ^e ^t ^k t. fc ic fl .s .p .b .c .l .a .h g1 s1 g2 s2 ?. l? -R -W -X -r
+     -w -x -e -o -O -z -s -M -A -C -S -c -b -f -d -p -l -u -g -k -t -T -B cd
+     co cr u. cm ut r. l@ s@ r@ mD uD oD rD tD sD wD cD f$ w$ p$ sh e$ k$ g3
+     g4 s4 g5 s5 T@ C@ L@ G@ A@ S@ Hg Hc Hr Hw Mg Mc Ms Mr Sg Sc So rq do {e
+     e} {t t} g6 G6 6e g7 G7 7e g8 G8 8e g9 G9 9e 6s 7s 8s 9s 6E 7E 8E 9E Pn
+     Pu GP SP EP Gn Gg GG SG EG g0 c$ lk t$ ;s n> // /= CO';
+
+my $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+sub op_flags { # common flags (see BASOP.op_flags in op.h)
+    my($x) = @_;
+    my(@v);
+    push @v, "v" if ($x & 3) == 1;
+    push @v, "s" if ($x & 3) == 2;
+    push @v, "l" if ($x & 3) == 3;
+    push @v, "K" if $x & 4;
+    push @v, "P" if $x & 8;
+    push @v, "R" if $x & 16;
+    push @v, "M" if $x & 32;
+    push @v, "S" if $x & 64;
+    push @v, "*" if $x & 128;
+    return join("", @v);
+}
+
+sub base_n {
+    my $x = shift;
+    return "-" . base_n(-$x) if $x < 0;
+    my $str = "";
+    do { $str .= substr($chars, $x % $base, 1) } while $x = int($x / $base);
+    $str = reverse $str if $big_endian;
+    return $str;
+}
+
+my %sequence_num;
+my $seq_max = 1;
+
+sub reset_sequence {
+    # reset the sequence
+    %sequence_num = ();
+    $seq_max = 1;
+    $lastnext = 0;
+}
+
+sub seq {
+    my($op) = @_;
+    return "-" if not exists $sequence_num{$$op};
+    return base_n($sequence_num{$$op});
+}
+
+sub walk_topdown {
+    my($op, $sub, $level) = @_;
+    $sub->($op, $level);
+    if ($op->flags & OPf_KIDS) {
+	for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
+	    walk_topdown($kid, $sub, $level + 1);
+	}
+    }
+    elsif (class($op) eq "PMOP") {
+	my $maybe_root = $op->pmreplroot;
+	if (ref($maybe_root) and $maybe_root->isa("B::OP")) {
+	    # It really is the root of the replacement, not something
+	    # else stored here for lack of space elsewhere
+	    walk_topdown($maybe_root, $sub, $level + 1);
+	}
+    }
+}
+
+sub walklines {
+    my($ar, $level) = @_;
+    for my $l (@$ar) {
+	if (ref($l) eq "ARRAY") {
+	    walklines($l, $level + 1);
+	} else {
+	    $l->concise($level);
+	}
+    }
+}
+
+sub walk_exec {
+    my($top, $level) = @_;
+    my %opsseen;
+    my @lines;
+    my @todo = ([$top, \@lines]);
+    while (@todo and my($op, $targ) = @{shift @todo}) {
+	for (; $$op; $op = $op->next) {
+	    last if $opsseen{$$op}++;
+	    push @$targ, $op;
+	    my $name = $op->name;
+	    if (class($op) eq "LOGOP") {
+		my $ar = [];
+		push @$targ, $ar;
+		push @todo, [$op->other, $ar];
+	    } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
+		my $ar = [];
+		push @$targ, $ar;
+		push @todo, [$op->pmreplstart, $ar];
+	    } elsif ($name =~ /^enter(loop|iter)$/) {
+		if ($] > 5.009) {
+		    $labels{${$op->nextop}} = "NEXT";
+		    $labels{${$op->lastop}} = "LAST";
+		    $labels{${$op->redoop}} = "REDO";
+		} else {
+		    $labels{$op->nextop->seq} = "NEXT";
+		    $labels{$op->lastop->seq} = "LAST";
+		    $labels{$op->redoop->seq} = "REDO";		
+		}
+	    }
+	}
+    }
+    walklines(\@lines, 0);
+}
+
+# The structure of this routine is purposely modeled after op.c's peep()
+sub sequence {
+    my($op) = @_;
+    my $oldop = 0;
+    return if class($op) eq "NULL" or exists $sequence_num{$$op};
+    for (; $$op; $op = $op->next) {
+	last if exists $sequence_num{$$op};
+	my $name = $op->name;
+	if ($name =~ /^(null|scalar|lineseq|scope)$/) {
+	    next if $oldop and $ {$op->next};
+	} else {
+	    $sequence_num{$$op} = $seq_max++;
+	    if (class($op) eq "LOGOP") {
+		my $other = $op->other;
+		$other = $other->next while $other->name eq "null";
+		sequence($other);
+	    } elsif (class($op) eq "LOOP") {
+		my $redoop = $op->redoop;
+		$redoop = $redoop->next while $redoop->name eq "null";
+		sequence($redoop);
+		my $nextop = $op->nextop;
+		$nextop = $nextop->next while $nextop->name eq "null";
+		sequence($nextop);
+		my $lastop = $op->lastop;
+		$lastop = $lastop->next while $lastop->name eq "null";
+		sequence($lastop);
+	    } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
+		my $replstart = $op->pmreplstart;
+		$replstart = $replstart->next while $replstart->name eq "null";
+		sequence($replstart);
+	    }
+	}
+	$oldop = $op;
+    }
+}
+
+sub fmt_line {    # generate text-line for op.
+    my($hr, $op, $text, $level) = @_;
+
+    $_->($hr, $op, \$text, \$level, $stylename) for @callbacks;
+
+    return '' if $hr->{SKIP};	# suppress line if a callback said so
+    return '' if $hr->{goto} and $hr->{goto} eq '-';	# no goto nowhere
+
+    # spec: (?(text1#varText2)?)
+    $text =~ s/\(\?\(([^\#]*?)\#(\w+)([^\#]*?)\)\?\)/
+	$hr->{$2} ? $1.$hr->{$2}.$3 : ""/eg;
+
+    # spec: (x(exec_text;basic_text)x)
+    $text =~ s/\(x\((.*?);(.*?)\)x\)/$order eq "exec" ? $1 : $2/egs;
+
+    # spec: (*(text)*)
+    $text =~ s/\(\*\(([^;]*?)\)\*\)/$1 x $level/egs;
+
+    # spec: (*(text1;text2)*)
+    $text =~ s/\(\*\((.*?);(.*?)\)\*\)/$1 x ($level - 1) . $2 x ($level>0)/egs;
+
+    # convert #Var to tag=>val form: Var\t#var
+    $text =~ s/\#([A-Z][a-z]+)(\d+)?/\t\u$1\t\L#$1$2/gs;
+
+    # spec: #varN
+    $text =~ s/\#([a-zA-Z]+)(\d+)/sprintf("%-$2s", $hr->{$1})/eg;
+
+    $text =~ s/\#([a-zA-Z]+)/$hr->{$1}/eg;	# populate #var's
+    $text =~ s/[ \t]*~+[ \t]*/ /g;		# squeeze tildes
+    chomp $text;
+    return "$text\n" if $text ne "";
+    return $text; # suppress empty lines
+}
+
+our %priv; # used to display each opcode's BASEOP.op_private values
+
+$priv{$_}{128} = "LVINTRO"
+  for ("pos", "substr", "vec", "threadsv", "gvsv", "rv2sv", "rv2hv", "rv2gv",
+       "rv2av", "rv2arylen", "aelem", "helem", "aslice", "hslice", "padsv",
+       "padav", "padhv", "enteriter");
+$priv{$_}{64} = "REFC" for ("leave", "leavesub", "leavesublv", "leavewrite");
+$priv{"aassign"}{64} = "COMMON";
+$priv{"aassign"}{32} = "PHASH" if $] < 5.009;
+$priv{"sassign"}{64} = "BKWARD";
+$priv{$_}{64} = "RTIME" for ("match", "subst", "substcont", "qr");
+@{$priv{"trans"}}{1,2,4,8,16,64} = ("<UTF", ">UTF", "IDENT", "SQUASH", "DEL",
+				    "COMPL", "GROWS");
+$priv{"repeat"}{64} = "DOLIST";
+$priv{"leaveloop"}{64} = "CONT";
+@{$priv{$_}}{32,64,96} = ("DREFAV", "DREFHV", "DREFSV")
+  for (qw(rv2gv rv2sv padsv aelem helem));
+@{$priv{"entersub"}}{16,32,64} = ("DBG","TARG","NOMOD");
+@{$priv{$_}}{4,8,128} = ("INARGS","AMPER","NO()") for ("entersub", "rv2cv");
+$priv{"gv"}{32} = "EARLYCV";
+$priv{"aelem"}{16} = $priv{"helem"}{16} = "LVDEFER";
+$priv{$_}{16} = "OURINTR" for ("gvsv", "rv2sv", "rv2av", "rv2hv", "r2gv",
+	"enteriter");
+$priv{$_}{16} = "TARGMY"
+  for (map(($_,"s$_"),"chop", "chomp"),
+       map(($_,"i_$_"), "postinc", "postdec", "multiply", "divide", "modulo",
+	   "add", "subtract", "negate"), "pow", "concat", "stringify",
+       "left_shift", "right_shift", "bit_and", "bit_xor", "bit_or",
+       "complement", "atan2", "sin", "cos", "rand", "exp", "log", "sqrt",
+       "int", "hex", "oct", "abs", "length", "index", "rindex", "sprintf",
+       "ord", "chr", "crypt", "quotemeta", "join", "push", "unshift", "flock",
+       "chdir", "chown", "chroot", "unlink", "chmod", "utime", "rename",
+       "link", "symlink", "mkdir", "rmdir", "wait", "waitpid", "system",
+       "exec", "kill", "getppid", "getpgrp", "setpgrp", "getpriority",
+       "setpriority", "time", "sleep");
+$priv{$_}{4} = "REVERSED" for ("enteriter", "iter");
+@{$priv{"const"}}{4,8,16,32,64,128} = ("SHORT","STRICT","ENTERED",'$[',"BARE","WARN");
+$priv{"flip"}{64} = $priv{"flop"}{64} = "LINENUM";
+$priv{"list"}{64} = "GUESSED";
+$priv{"delete"}{64} = "SLICE";
+$priv{"exists"}{64} = "SUB";
+$priv{$_}{64} = "LOCALE"
+  for ("sort", "prtf", "sprintf", "slt", "sle", "seq", "sne", "sgt", "sge",
+       "scmp", "lc", "uc", "lcfirst", "ucfirst");
+@{$priv{"sort"}}{1,2,4,8,16} = ("NUM", "INT", "REV", "INPLACE","DESC");
+$priv{"threadsv"}{64} = "SVREFd";
+@{$priv{$_}}{16,32,64,128} = ("INBIN","INCR","OUTBIN","OUTCR")
+  for ("open", "backtick");
+$priv{"exit"}{128} = "VMS";
+$priv{$_}{2} = "FTACCESS"
+  for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec");
+if ($] >= 5.009) {
+  # Stacked filetests are post 5.8.x
+  $priv{$_}{4} = "FTSTACKED"
+    for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec",
+         "ftis", "fteowned", "ftrowned", "ftzero", "ftsize", "ftmtime",
+	 "ftatime", "ftctime", "ftsock", "ftchr", "ftblk", "ftfile", "ftdir",
+	 "ftpipe", "ftlink", "ftsuid", "ftsgid", "ftsvtx", "fttty", "fttext",
+	 "ftbinary");
+  # Lexical $_ is post 5.8.x
+  $priv{$_}{2} = "GREPLEX"
+    for ("mapwhile", "mapstart", "grepwhile", "grepstart");
+}
+
+sub private_flags {
+    my($name, $x) = @_;
+    my @s;
+    for my $flag (128, 96, 64, 32, 16, 8, 4, 2, 1) {
+	if ($priv{$name}{$flag} and $x & $flag and $x >= $flag) {
+	    $x -= $flag;
+	    push @s, $priv{$name}{$flag};
+	}
+    }
+    push @s, $x if $x;
+    return join(",", @s);
+}
+
+sub concise_sv {
+    my($sv, $hr, $preferpv) = @_;
+    $hr->{svclass} = class($sv);
+    $hr->{svclass} = "UV"
+      if $hr->{svclass} eq "IV" and $sv->FLAGS & SVf_IVisUV;
+    Carp::cluck("bad concise_sv: $sv") unless $sv and $$sv;
+    $hr->{svaddr} = sprintf("%#x", $$sv);
+    if ($hr->{svclass} eq "GV") {
+	my $gv = $sv;
+	my $stash = $gv->STASH->NAME;
+	if ($stash eq "main") {
+	    $stash = "";
+	} else {
+	    $stash = $stash . "::";
+	}
+	$hr->{svval} = "*$stash" . $gv->SAFENAME;
+	return "*$stash" . $gv->SAFENAME;
+    } else {
+	while (class($sv) eq "RV") {
+	    $hr->{svval} .= "\\";
+	    $sv = $sv->RV;
+	}
+	if (class($sv) eq "SPECIAL") {
+	    $hr->{svval} .= ["Null", "sv_undef", "sv_yes", "sv_no"]->[$$sv];
+	} elsif ($preferpv && $sv->FLAGS & SVf_POK) {
+	    $hr->{svval} .= cstring($sv->PV);
+	} elsif ($sv->FLAGS & SVf_NOK) {
+	    $hr->{svval} .= $sv->NV;
+	} elsif ($sv->FLAGS & SVf_IOK) {
+	    $hr->{svval} .= $sv->int_value;
+	} elsif ($sv->FLAGS & SVf_POK) {
+	    $hr->{svval} .= cstring($sv->PV);
+	} elsif (class($sv) eq "HV") {
+	    $hr->{svval} .= 'HASH';
+	}
+
+	$hr->{svval} = 'undef' unless defined $hr->{svval};
+	my $out = $hr->{svclass};
+	return $out .= " $hr->{svval}" ; 
+    }
+}
+
+sub concise_op {
+    my ($op, $level, $format) = @_;
+    my %h;
+    $h{exname} = $h{name} = $op->name;
+    $h{NAME} = uc $h{name};
+    $h{class} = class($op);
+    $h{extarg} = $h{targ} = $op->targ;
+    $h{extarg} = "" unless $h{extarg};
+    if ($h{name} eq "null" and $h{targ}) {
+	# targ holds the old type
+	$h{exname} = "ex-" . substr(ppname($h{targ}), 3);
+	$h{extarg} = "";
+    } elsif ($op->name =~ /^leave(sub(lv)?|write)?$/) {
+	# targ potentially holds a reference count
+	if ($op->private & 64) {
+	    my $refs = "ref" . ($h{targ} != 1 ? "s" : "");
+	    $h{targarglife} = $h{targarg} = "$h{targ} $refs";
+	}
+    } elsif ($h{targ}) {
+	my $padname = (($curcv->PADLIST->ARRAY)[0]->ARRAY)[$h{targ}];
+	if (defined $padname and class($padname) ne "SPECIAL") {
+	    $h{targarg}  = $padname->PVX;
+	    if ($padname->FLAGS & SVf_FAKE) {
+		if ($] < 5.009) {
+		    $h{targarglife} = "$h{targarg}:FAKE";
+		} else {
+		    # These changes relate to the jumbo closure fix.
+		    # See changes 19939 and 20005
+		    my $fake = '';
+		    $fake .= 'a' if $padname->IVX & 1; # PAD_FAKELEX_ANON
+		    $fake .= 'm' if $padname->IVX & 2; # PAD_FAKELEX_MULTI
+		    $fake .= ':' . $padname->NVX if $curcv->CvFLAGS & CVf_ANON;
+		    $h{targarglife} = "$h{targarg}:FAKE:$fake";
+		}
+	    }
+	    else {
+		my $intro = $padname->NVX - $cop_seq_base;
+		my $finish = int($padname->IVX) - $cop_seq_base;
+		$finish = "end" if $finish == 999999999 - $cop_seq_base;
+		$h{targarglife} = "$h{targarg}:$intro,$finish";
+	    }
+	} else {
+	    $h{targarglife} = $h{targarg} = "t" . $h{targ};
+	}
+    }
+    $h{arg} = "";
+    $h{svclass} = $h{svaddr} = $h{svval} = "";
+    if ($h{class} eq "PMOP") {
+	my $precomp = $op->precomp;
+	if (defined $precomp) {
+	    $precomp = cstring($precomp); # Escape literal control sequences
+ 	    $precomp = "/$precomp/";
+	} else {
+	    $precomp = "";
+	}
+	my $pmreplroot = $op->pmreplroot;
+	my $pmreplstart;
+	if (ref($pmreplroot) eq "B::GV") {
+	    # with C<@stash_array = split(/pat/, str);>,
+	    #  *stash_array is stored in /pat/'s pmreplroot.
+	    $h{arg} = "($precomp => \@" . $pmreplroot->NAME . ")";
+	} elsif (!ref($pmreplroot) and $pmreplroot) {
+	    # same as the last case, except the value is actually a
+	    # pad offset for where the GV is kept (this happens under
+	    # ithreads)
+	    my $gv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$pmreplroot];
+	    $h{arg} = "($precomp => \@" . $gv->NAME . ")";
+	} elsif ($ {$op->pmreplstart}) {
+	    undef $lastnext;
+	    $pmreplstart = "replstart->" . seq($op->pmreplstart);
+	    $h{arg} = "(" . join(" ", $precomp, $pmreplstart) . ")";
+	} else {
+	    $h{arg} = "($precomp)";
+	}
+    } elsif ($h{class} eq "PVOP" and $h{name} ne "trans") {
+	$h{arg} = '("' . $op->pv . '")';
+	$h{svval} = '"' . $op->pv . '"';
+    } elsif ($h{class} eq "COP") {
+	my $label = $op->label;
+	$h{coplabel} = $label;
+	$label = $label ? "$label: " : "";
+	my $loc = $op->file;
+	$loc =~ s[.*/][];
+	$loc .= ":" . $op->line;
+	my($stash, $cseq) = ($op->stash->NAME, $op->cop_seq - $cop_seq_base);
+	my $arybase = $op->arybase;
+	$arybase = $arybase ? ' $[=' . $arybase : "";
+	$h{arg} = "($label$stash $cseq $loc$arybase)";
+    } elsif ($h{class} eq "LOOP") {
+	$h{arg} = "(next->" . seq($op->nextop) . " last->" . seq($op->lastop)
+	  . " redo->" . seq($op->redoop) . ")";
+    } elsif ($h{class} eq "LOGOP") {
+	undef $lastnext;
+	$h{arg} = "(other->" . seq($op->other) . ")";
+    }
+    elsif ($h{class} eq "SVOP" or $h{class} eq "PADOP") {
+	unless ($h{name} eq 'aelemfast' and $op->flags & OPf_SPECIAL) {
+	    my $idx = ($h{class} eq "SVOP") ? $op->targ : $op->padix;
+	    my $preferpv = $h{name} eq "method_named";
+	    if ($h{class} eq "PADOP" or !${$op->sv}) {
+		my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$idx];
+		$h{arg} = "[" . concise_sv($sv, \%h, $preferpv) . "]";
+		$h{targarglife} = $h{targarg} = "";
+	    } else {
+		$h{arg} = "(" . concise_sv($op->sv, \%h, $preferpv) . ")";
+	    }
+	}
+    }
+    $h{seq} = $h{hyphseq} = seq($op);
+    $h{seq} = "" if $h{seq} eq "-";
+    if ($] > 5.009) {
+	$h{opt} = $op->opt;
+	$h{static} = $op->static;
+	$h{label} = $labels{$$op};
+    } else {
+	$h{seqnum} = $op->seq;
+	$h{label} = $labels{$op->seq};
+    }
+    $h{next} = $op->next;
+    $h{next} = (class($h{next}) eq "NULL") ? "(end)" : seq($h{next});
+    $h{nextaddr} = sprintf("%#x", $ {$op->next});
+    $h{sibaddr} = sprintf("%#x", $ {$op->sibling});
+    $h{firstaddr} = sprintf("%#x", $ {$op->first}) if $op->can("first");
+    $h{lastaddr} = sprintf("%#x", $ {$op->last}) if $op->can("last");
+
+    $h{classsym} = $opclass{$h{class}};
+    $h{flagval} = $op->flags;
+    $h{flags} = op_flags($op->flags);
+    $h{privval} = $op->private;
+    $h{private} = private_flags($h{name}, $op->private);
+    $h{addr} = sprintf("%#x", $$op);
+    $h{typenum} = $op->type;
+    $h{noise} = $linenoise[$op->type];
+
+    return fmt_line(\%h, $op, $format, $level);
+}
+
+sub B::OP::concise {
+    my($op, $level) = @_;
+    if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
+	# insert a 'goto' line
+	my $synth = {"seq" => seq($lastnext), "class" => class($lastnext),
+		     "addr" => sprintf("%#x", $$lastnext),
+		     "goto" => seq($lastnext), # simplify goto '-' removal
+	     };
+	print $walkHandle fmt_line($synth, $op, $gotofmt, $level+1);
+    }
+    $lastnext = $op->next;
+    print $walkHandle concise_op($op, $level, $format);
+}
+
+# B::OP::terse (see Terse.pm) now just calls this
+sub b_terse {
+    my($op, $level) = @_;
+
+    # This isn't necessarily right, but there's no easy way to get
+    # from an OP to the right CV. This is a limitation of the
+    # ->terse() interface style, and there isn't much to do about
+    # it. In particular, we can die in concise_op if the main pad
+    # isn't long enough, or has the wrong kind of entries, compared to
+    # the pad a sub was compiled with. The fix for that would be to
+    # make a backwards compatible "terse" format that never even
+    # looked at the pad, just like the old B::Terse. I don't think
+    # that's worth the effort, though.
+    $curcv = main_cv unless $curcv;
+
+    if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
+	# insert a 'goto'
+	my $h = {"seq" => seq($lastnext), "class" => class($lastnext),
+		 "addr" => sprintf("%#x", $$lastnext)};
+	print # $walkHandle
+	    fmt_line($h, $op, $style{"terse"}[1], $level+1);
+    }
+    $lastnext = $op->next;
+    print # $walkHandle 
+	concise_op($op, $level, $style{"terse"}[0]);
+}
+
+sub tree {
+    my $op = shift;
+    my $level = shift;
+    my $style = $tree_decorations[$tree_style];
+    my($space, $single, $kids, $kid, $nokid, $last, $lead, $size) = @$style;
+    my $name = concise_op($op, $level, $treefmt);
+    if (not $op->flags & OPf_KIDS) {
+	return $name . "\n";
+    }
+    my @lines;
+    for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
+	push @lines, tree($kid, $level+1);
+    }
+    my $i;
+    for ($i = $#lines; substr($lines[$i], 0, 1) eq " "; $i--) {
+	$lines[$i] = $space . $lines[$i];
+    }
+    if ($i > 0) {
+	$lines[$i] = $last . $lines[$i];
+	while ($i-- > 1) {
+	    if (substr($lines[$i], 0, 1) eq " ") {
+		$lines[$i] = $nokid . $lines[$i];
+	    } else {
+		$lines[$i] = $kid . $lines[$i];
+	    }
+	}
+	$lines[$i] = $kids . $lines[$i];
+    } else {
+	$lines[0] = $single . $lines[0];
+    }
+    return("$name$lead" . shift @lines,
+           map(" " x (length($name)+$size) . $_, @lines));
+}
+
+# *** Warning: fragile kludge ahead ***
+# Because the B::* modules run in the same interpreter as the code
+# they're compiling, their presence tends to distort the view we have of
+# the code we're looking at. In particular, perl gives sequence numbers
+# to COPs. If the program we're looking at were run on its own, this
+# would start at 1. Because all of B::Concise and all the modules it
+# uses are compiled first, though, by the time we get to the user's
+# program the sequence number is already pretty high, which could be
+# distracting if you're trying to tell OPs apart. Therefore we'd like to
+# subtract an offset from all the sequence numbers we display, to
+# restore the simpler view of the world. The trick is to know what that
+# offset will be, when we're still compiling B::Concise!  If we
+# hardcoded a value, it would have to change every time B::Concise or
+# other modules we use do. To help a little, what we do here is compile
+# a little code at the end of the module, and compute the base sequence
+# number for the user's program as being a small offset later, so all we
+# have to worry about are changes in the offset.
+
+# [For 5.8.x and earlier perl is generating sequence numbers for all ops,
+#  and using them to reference labels]
+
+
+# When you say "perl -MO=Concise -e '$a'", the output should look like:
+
+# 4  <@> leave[t1] vKP/REFC ->(end)
+# 1     <0> enter ->2
+ #^ smallest OP sequence number should be 1
+# 2     <;> nextstate(main 1 -e:1) v ->3
+ #                         ^ smallest COP sequence number should be 1
+# -     <1> ex-rv2sv vK/1 ->4
+# 3        <$> gvsv(*a) s ->4
+
+# If the second of the marked numbers there isn't 1, it means you need
+# to update the corresponding magic number in the next line.
+# Remember, this needs to stay the last things in the module.
+
+# Why is this different for MacOS?  Does it matter?
+my $cop_seq_mnum = $^O eq 'MacOS' ? 12 : 11;
+$cop_seq_base = svref_2object(eval 'sub{0;}')->START->cop_seq + $cop_seq_mnum;
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Concise - Walk Perl syntax tree, printing concise info about ops
+
+=head1 SYNOPSIS
+
+    perl -MO=Concise[,OPTIONS] foo.pl
+
+    use B::Concise qw(set_style add_callback);
+
+=head1 DESCRIPTION
+
+This compiler backend prints the internal OPs of a Perl program's syntax
+tree in one of several space-efficient text formats suitable for debugging
+the inner workings of perl or other compiler backends. It can print OPs in
+the order they appear in the OP tree, in the order they will execute, or
+in a text approximation to their tree structure, and the format of the
+information displayed is customizable. Its function is similar to that of
+perl's B<-Dx> debugging flag or the B<B::Terse> module, but it is more
+sophisticated and flexible.
+
+=head1 EXAMPLE
+
+Here's an example of 2 outputs (aka 'renderings'), using the
+-exec and -basic (i.e. default) formatting conventions on the same code
+snippet.
+
+    % perl -MO=Concise,-exec -e '$a = $b + 42'
+    1  <0> enter
+    2  <;> nextstate(main 1 -e:1) v
+    3  <#> gvsv[*b] s
+    4  <$> const[IV 42] s
+ *  5  <2> add[t3] sK/2
+    6  <#> gvsv[*a] s
+    7  <2> sassign vKS/2
+    8  <@> leave[1 ref] vKP/REFC
+
+Each line corresponds to an opcode. The opcode marked with '*' is used
+in a few examples below.
+
+The 1st column is the op's sequence number, starting at 1, and is
+displayed in base 36 by default.  This rendering is in -exec (i.e.
+execution) order.
+
+The symbol between angle brackets indicates the op's type, for
+example; <2> is a BINOP, <@> a LISTOP, and <#> is a PADOP, which is
+used in threaded perls. (see L</"OP class abbreviations">).
+
+The opname, as in B<'add[t1]'>, which may be followed by op-specific
+information in parentheses or brackets (ex B<'[t1]'>).
+
+The op-flags (ex B<'sK/2'>) follow, and are described in (L</"OP flags
+abbreviations">).
+
+    % perl -MO=Concise -e '$a = $b + 42'
+    8  <@> leave[1 ref] vKP/REFC ->(end)
+    1     <0> enter ->2
+    2     <;> nextstate(main 1 -e:1) v ->3
+    7     <2> sassign vKS/2 ->8
+ *  5        <2> add[t1] sK/2 ->6
+    -           <1> ex-rv2sv sK/1 ->4
+    3              <$> gvsv(*b) s ->4
+    4           <$> const(IV 42) s ->5
+    -        <1> ex-rv2sv sKRM*/1 ->7
+    6           <$> gvsv(*a) s ->7
+
+The default rendering is top-down, so they're not in execution order.
+This form reflects the way the stack is used to parse and evaluate
+expressions; the add operates on the two terms below it in the tree.
+
+Nullops appear as C<ex-opname>, where I<opname> is an op that has been
+optimized away by perl.  They're displayed with a sequence-number of
+'-', because they are not executed (they don't appear in previous
+example), they're printed here because they reflect the parse.
+
+The arrow points to the sequence number of the next op; they're not
+displayed in -exec mode, for obvious reasons.
+
+Note that because this rendering was done on a non-threaded perl, the
+PADOPs in the previous examples are now SVOPs, and some (but not all)
+of the square brackets have been replaced by round ones.  This is a
+subtle feature to provide some visual distinction between renderings
+on threaded and un-threaded perls.
+
+
+=head1 OPTIONS
+
+Arguments that don't start with a hyphen are taken to be the names of
+subroutines to print the OPs of; if no such functions are specified,
+the main body of the program (outside any subroutines, and not
+including use'd or require'd files) is rendered.  Passing C<BEGIN>,
+C<CHECK>, C<INIT>, or C<END> will cause all of the corresponding
+special blocks to be printed.
+
+Options affect how things are rendered (ie printed).  They're presented
+here by their visual effect, 1st being strongest.  They're grouped
+according to how they interrelate; within each group the options are
+mutually exclusive (unless otherwise stated).
+
+=head2 Options for Opcode Ordering
+
+These options control the 'vertical display' of opcodes.  The display
+'order' is also called 'mode' elsewhere in this document.
+
+=over 4
+
+=item B<-basic>
+
+Print OPs in the order they appear in the OP tree (a preorder
+traversal, starting at the root). The indentation of each OP shows its
+level in the tree, and the '->' at the end of the line indicates the
+next opcode in execution order.  This mode is the default, so the flag
+is included simply for completeness.
+
+=item B<-exec>
+
+Print OPs in the order they would normally execute (for the majority
+of constructs this is a postorder traversal of the tree, ending at the
+root). In most cases the OP that usually follows a given OP will
+appear directly below it; alternate paths are shown by indentation. In
+cases like loops when control jumps out of a linear path, a 'goto'
+line is generated.
+
+=item B<-tree>
+
+Print OPs in a text approximation of a tree, with the root of the tree
+at the left and 'left-to-right' order of children transformed into
+'top-to-bottom'. Because this mode grows both to the right and down,
+it isn't suitable for large programs (unless you have a very wide
+terminal).
+
+=back
+
+=head2 Options for Line-Style
+
+These options select the line-style (or just style) used to render
+each opcode, and dictates what info is actually printed into each line.
+
+=over 4
+
+=item B<-concise>
+
+Use the author's favorite set of formatting conventions. This is the
+default, of course.
+
+=item B<-terse>
+
+Use formatting conventions that emulate the output of B<B::Terse>. The
+basic mode is almost indistinguishable from the real B<B::Terse>, and the
+exec mode looks very similar, but is in a more logical order and lacks
+curly brackets. B<B::Terse> doesn't have a tree mode, so the tree mode
+is only vaguely reminiscent of B<B::Terse>.
+
+=item B<-linenoise>
+
+Use formatting conventions in which the name of each OP, rather than being
+written out in full, is represented by a one- or two-character abbreviation.
+This is mainly a joke.
+
+=item B<-debug>
+
+Use formatting conventions reminiscent of B<B::Debug>; these aren't
+very concise at all.
+
+=item B<-env>
+
+Use formatting conventions read from the environment variables
+C<B_CONCISE_FORMAT>, C<B_CONCISE_GOTO_FORMAT>, and C<B_CONCISE_TREE_FORMAT>.
+
+=back
+
+=head2 Options for tree-specific formatting
+
+=over 4
+
+=item B<-compact>
+
+Use a tree format in which the minimum amount of space is used for the
+lines connecting nodes (one character in most cases). This squeezes out
+a few precious columns of screen real estate.
+
+=item B<-loose>
+
+Use a tree format that uses longer edges to separate OP nodes. This format
+tends to look better than the compact one, especially in ASCII, and is
+the default.
+
+=item B<-vt>
+
+Use tree connecting characters drawn from the VT100 line-drawing set.
+This looks better if your terminal supports it.
+
+=item B<-ascii>
+
+Draw the tree with standard ASCII characters like C<+> and C<|>. These don't
+look as clean as the VT100 characters, but they'll work with almost any
+terminal (or the horizontal scrolling mode of less(1)) and are suitable
+for text documentation or email. This is the default.
+
+=back
+
+These are pairwise exclusive, i.e. compact or loose, vt or ascii.
+
+=head2 Options controlling sequence numbering
+
+=over 4
+
+=item B<-base>I<n>
+
+Print OP sequence numbers in base I<n>. If I<n> is greater than 10, the
+digit for 11 will be 'a', and so on. If I<n> is greater than 36, the digit
+for 37 will be 'A', and so on until 62. Values greater than 62 are not
+currently supported. The default is 36.
+
+=item B<-bigendian>
+
+Print sequence numbers with the most significant digit first. This is the
+usual convention for Arabic numerals, and the default.
+
+=item B<-littleendian>
+
+Print seqence numbers with the least significant digit first.  This is
+obviously mutually exclusive with bigendian.
+
+=back
+
+=head2 Other options
+
+These are pairwise exclusive.
+
+=over 4
+
+=item B<-main>
+
+Include the main program in the output, even if subroutines were also
+specified.  This rendering is normally suppressed when a subroutine
+name or reference is given.
+
+=item B<-nomain>
+
+This restores the default behavior after you've changed it with '-main'
+(it's not normally needed).  If no subroutine name/ref is given, main is
+rendered, regardless of this flag.
+
+=item B<-nobanner>
+
+Renderings usually include a banner line identifying the function name
+or stringified subref.  This suppresses the printing of the banner.
+
+TBC: Remove the stringified coderef; while it provides a 'cookie' for
+each function rendered, the cookies used should be 1,2,3.. not a
+random hex-address.  It also complicates string comparison of two
+different trees.
+
+=item B<-banner>
+
+restores default banner behavior.
+
+=item B<-banneris> => subref
+
+TBC: a hookpoint (and an option to set it) for a user-supplied
+function to produce a banner appropriate for users needs.  It's not
+ideal, because the rendering-state variables, which are a natural
+candidate for use in concise.t, are unavailable to the user.
+
+=back
+
+=head2 Option Stickiness
+
+If you invoke Concise more than once in a program, you should know that
+the options are 'sticky'.  This means that the options you provide in
+the first call will be remembered for the 2nd call, unless you
+re-specify or change them.
+
+=head1 ABBREVIATIONS
+
+The concise style uses symbols to convey maximum info with minimal
+clutter (like hex addresses).  With just a little practice, you can
+start to see the flowers, not just the branches, in the trees.
+
+=head2 OP class abbreviations
+
+These symbols appear before the op-name, and indicate the
+B:: namespace that represents the ops in your Perl code.
+
+    0      OP (aka BASEOP)  An OP with no children
+    1      UNOP             An OP with one child
+    2      BINOP            An OP with two children
+    |      LOGOP            A control branch OP
+    @      LISTOP           An OP that could have lots of children
+    /      PMOP             An OP with a regular expression
+    $      SVOP             An OP with an SV
+    "      PVOP             An OP with a string
+    {      LOOP             An OP that holds pointers for a loop
+    ;      COP              An OP that marks the start of a statement
+    #      PADOP            An OP with a GV on the pad
+
+=head2 OP flags abbreviations
+
+OP flags are either public or private.  The public flags alter the
+behavior of each opcode in consistent ways, and are represented by 0
+or more single characters.
+
+    v      OPf_WANT_VOID    Want nothing (void context)
+    s      OPf_WANT_SCALAR  Want single value (scalar context)
+    l      OPf_WANT_LIST    Want list of any length (list context)
+                            Want is unknown
+    K      OPf_KIDS         There is a firstborn child.
+    P      OPf_PARENS       This operator was parenthesized.
+                             (Or block needs explicit scope entry.)
+    R      OPf_REF          Certified reference.
+                             (Return container, not containee).
+    M      OPf_MOD          Will modify (lvalue).
+    S      OPf_STACKED      Some arg is arriving on the stack.
+    *      OPf_SPECIAL      Do something weird for this op (see op.h)
+
+Private flags, if any are set for an opcode, are displayed after a '/'
+
+    8  <@> leave[1 ref] vKP/REFC ->(end)
+    7     <2> sassign vKS/2 ->8
+
+They're opcode specific, and occur less often than the public ones, so
+they're represented by short mnemonics instead of single-chars; see
+F<op.h> for gory details, or try this quick 2-liner:
+
+  $> perl -MB::Concise -de 1
+  DB<1> |x \%B::Concise::priv
+
+=head1 FORMATTING SPECIFICATIONS
+
+For each line-style ('concise', 'terse', 'linenoise', etc.) there are
+3 format-specs which control how OPs are rendered.
+
+The first is the 'default' format, which is used in both basic and exec
+modes to print all opcodes.  The 2nd, goto-format, is used in exec
+mode when branches are encountered.  They're not real opcodes, and are
+inserted to look like a closing curly brace.  The tree-format is tree
+specific.
+
+When a line is rendered, the correct format-spec is copied and scanned
+for the following items; data is substituted in, and other
+manipulations like basic indenting are done, for each opcode rendered.
+
+There are 3 kinds of items that may be populated; special patterns,
+#vars, and literal text, which is copied verbatim.  (Yes, it's a set
+of s///g steps.)
+
+=head2 Special Patterns
+
+These items are the primitives used to perform indenting, and to
+select text from amongst alternatives.
+
+=over 4
+
+=item B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>
+
+Generates I<exec_text> in exec mode, or I<basic_text> in basic mode.
+
+=item B<(*(>I<text>B<)*)>
+
+Generates one copy of I<text> for each indentation level.
+
+=item B<(*(>I<text1>B<;>I<text2>B<)*)>
+
+Generates one fewer copies of I<text1> than the indentation level, followed
+by one copy of I<text2> if the indentation level is more than 0.
+
+=item B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>
+
+If the value of I<var> is true (not empty or zero), generates the
+value of I<var> surrounded by I<text1> and I<Text2>, otherwise
+nothing.
+
+=item B<~>
+
+Any number of tildes and surrounding whitespace will be collapsed to
+a single space.
+
+=back
+
+=head2 # Variables
+
+These #vars represent opcode properties that you may want as part of
+your rendering.  The '#' is intended as a private sigil; a #var's
+value is interpolated into the style-line, much like "read $this".
+
+These vars take 3 forms:
+
+=over 4
+
+=item B<#>I<var>
+
+A property named 'var' is assumed to exist for the opcodes, and is
+interpolated into the rendering.
+
+=item B<#>I<var>I<N>
+
+Generates the value of I<var>, left justified to fill I<N> spaces.
+Note that this means while you can have properties 'foo' and 'foo2',
+you cannot render 'foo2', but you could with 'foo2a'.  You would be
+wise not to rely on this behavior going forward ;-)
+
+=item B<#>I<Var>
+
+This ucfirst form of #var generates a tag-value form of itself for
+display; it converts '#Var' into a 'Var => #var' style, which is then
+handled as described above.  (Imp-note: #Vars cannot be used for
+conditional-fills, because the => #var transform is done after the check
+for #Var's value).
+
+=back
+
+The following variables are 'defined' by B::Concise; when they are
+used in a style, their respective values are plugged into the
+rendering of each opcode.
+
+Only some of these are used by the standard styles, the others are
+provided for you to delve into optree mechanics, should you wish to
+add a new style (see L</add_style> below) that uses them.  You can
+also add new ones using L</add_callback>.
+
+=over 4
+
+=item B<#addr>
+
+The address of the OP, in hexadecimal.
+
+=item B<#arg>
+
+The OP-specific information of the OP (such as the SV for an SVOP, the
+non-local exit pointers for a LOOP, etc.) enclosed in parentheses.
+
+=item B<#class>
+
+The B-determined class of the OP, in all caps.
+
+=item B<#classsym>
+
+A single symbol abbreviating the class of the OP.
+
+=item B<#coplabel>
+
+The label of the statement or block the OP is the start of, if any.
+
+=item B<#exname>
+
+The name of the OP, or 'ex-foo' if the OP is a null that used to be a foo.
+
+=item B<#extarg>
+
+The target of the OP, or nothing for a nulled OP.
+
+=item B<#firstaddr>
+
+The address of the OP's first child, in hexadecimal.
+
+=item B<#flags>
+
+The OP's flags, abbreviated as a series of symbols.
+
+=item B<#flagval>
+
+The numeric value of the OP's flags.
+
+=item B<#hyphseq>
+
+The sequence number of the OP, or a hyphen if it doesn't have one.
+
+=item B<#label>
+
+'NEXT', 'LAST', or 'REDO' if the OP is a target of one of those in exec
+mode, or empty otherwise.
+
+=item B<#lastaddr>
+
+The address of the OP's last child, in hexadecimal.
+
+=item B<#name>
+
+The OP's name.
+
+=item B<#NAME>
+
+The OP's name, in all caps.
+
+=item B<#next>
+
+The sequence number of the OP's next OP.
+
+=item B<#nextaddr>
+
+The address of the OP's next OP, in hexadecimal.
+
+=item B<#noise>
+
+A one- or two-character abbreviation for the OP's name.
+
+=item B<#private>
+
+The OP's private flags, rendered with abbreviated names if possible.
+
+=item B<#privval>
+
+The numeric value of the OP's private flags.
+
+=item B<#seq>
+
+The sequence number of the OP. Note that this is a sequence number
+generated by B::Concise.
+
+=item B<#seqnum>
+
+5.8.x and earlier only. 5.9 and later do not provide this.
+
+The real sequence number of the OP, as a regular number and not adjusted
+to be relative to the start of the real program. (This will generally be
+a fairly large number because all of B<B::Concise> is compiled before
+your program is).
+
+=item B<#opt>
+
+Whether or not the op has been optimised by the peephole optimiser.
+
+Only available in 5.9 and later.
+
+=item B<#static>
+
+Whether or not the op is statically defined.  This flag is used by the
+B::C compiler backend and indicates that the op should not be freed.
+
+Only available in 5.9 and later.
+
+=item B<#sibaddr>
+
+The address of the OP's next youngest sibling, in hexadecimal.
+
+=item B<#svaddr>
+
+The address of the OP's SV, if it has an SV, in hexadecimal.
+
+=item B<#svclass>
+
+The class of the OP's SV, if it has one, in all caps (e.g., 'IV').
+
+=item B<#svval>
+
+The value of the OP's SV, if it has one, in a short human-readable format.
+
+=item B<#targ>
+
+The numeric value of the OP's targ.
+
+=item B<#targarg>
+
+The name of the variable the OP's targ refers to, if any, otherwise the
+letter t followed by the OP's targ in decimal.
+
+=item B<#targarglife>
+
+Same as B<#targarg>, but followed by the COP sequence numbers that delimit
+the variable's lifetime (or 'end' for a variable in an open scope) for a
+variable.
+
+=item B<#typenum>
+
+The numeric value of the OP's type, in decimal.
+
+=back
+
+=head1 Using B::Concise outside of the O framework
+
+The common (and original) usage of B::Concise was for command-line
+renderings of simple code, as given in EXAMPLE.  But you can also use
+B<B::Concise> from your code, and call compile() directly, and
+repeatedly.  By doing so, you can avoid the compile-time only
+operation of O.pm, and even use the debugger to step through
+B::Concise::compile() itself.
+
+Once you're doing this, you may alter Concise output by adding new
+rendering styles, and by optionally adding callback routines which
+populate new variables, if such were referenced from those (just
+added) styles.  
+
+=head2 Example: Altering Concise Renderings
+
+    use B::Concise qw(set_style add_callback);
+    add_style($yourStyleName => $defaultfmt, $gotofmt, $treefmt);
+    add_callback
+      ( sub {
+            my ($h, $op, $format, $level, $stylename) = @_;
+            $h->{variable} = some_func($op);
+        });
+    $walker = B::Concise::compile(@options,@subnames,@subrefs);
+    $walker->();
+
+=head2 set_style()
+
+B<set_style> accepts 3 arguments, and updates the three format-specs
+comprising a line-style (basic-exec, goto, tree).  It has one minor
+drawback though; it doesn't register the style under a new name.  This
+can become an issue if you render more than once and switch styles.
+Thus you may prefer to use add_style() and/or set_style_standard()
+instead.
+
+=head2 set_style_standard($name)
+
+This restores one of the standard line-styles: C<terse>, C<concise>,
+C<linenoise>, C<debug>, C<env>, into effect.  It also accepts style
+names previously defined with add_style().
+
+=head2 add_style()
+
+This subroutine accepts a new style name and three style arguments as
+above, and creates, registers, and selects the newly named style.  It is
+an error to re-add a style; call set_style_standard() to switch between
+several styles.
+
+=head2 add_callback()
+
+If your newly minted styles refer to any new #variables, you'll need
+to define a callback subroutine that will populate (or modify) those
+variables.  They are then available for use in the style you've
+chosen.
+
+The callbacks are called for each opcode visited by Concise, in the
+same order as they are added.  Each subroutine is passed five
+parameters.
+
+  1. A hashref, containing the variable names and values which are
+     populated into the report-line for the op
+  2. the op, as a B<B::OP> object
+  3. a reference to the format string
+  4. the formatting (indent) level
+  5. the selected stylename
+
+To define your own variables, simply add them to the hash, or change
+existing values if you need to.  The level and format are passed in as
+references to scalars, but it is unlikely that they will need to be
+changed or even used.
+
+=head2 Running B::Concise::compile()
+
+B<compile> accepts options as described above in L</OPTIONS>, and
+arguments, which are either coderefs, or subroutine names.
+
+It constructs and returns a $treewalker coderef, which when invoked,
+traverses, or walks, and renders the optrees of the given arguments to
+STDOUT.  You can reuse this, and can change the rendering style used
+each time; thereafter the coderef renders in the new style.
+
+B<walk_output> lets you change the print destination from STDOUT to
+another open filehandle, or into a string passed as a ref (unless
+you've built perl with -Uuseperlio).
+
+    my $walker = B::Concise::compile('-terse','aFuncName', \&aSubRef);  # 1
+    walk_output(\my $buf);
+    $walker->();			# 1 renders -terse
+    set_style_standard('concise');	# 2
+    $walker->();			# 2 renders -concise
+    $walker->(@new);			# 3 renders whatever
+    print "3 different renderings: terse, concise, and @new: $buf\n";
+
+When $walker is called, it traverses the subroutines supplied when it
+was created, and renders them using the current style.  You can change
+the style afterwards in several different ways:
+
+  1. call C<compile>, altering style or mode/order
+  2. call C<set_style_standard>
+  3. call $walker, passing @new options
+
+Passing new options to the $walker is the easiest way to change
+amongst any pre-defined styles (the ones you add are automatically
+recognized as options), and is the only way to alter rendering order
+without calling compile again.  Note however that rendering state is
+still shared amongst multiple $walker objects, so they must still be
+used in a coordinated manner.
+
+=head2 B::Concise::reset_sequence()
+
+This function (not exported) lets you reset the sequence numbers (note
+that they're numbered arbitrarily, their goal being to be human
+readable).  Its purpose is mostly to support testing, i.e. to compare
+the concise output from two identical anonymous subroutines (but
+different instances).  Without the reset, B::Concise, seeing that
+they're separate optrees, generates different sequence numbers in
+the output.
+
+=head2 Errors
+
+Errors in rendering (non-existent function-name, non-existent coderef)
+are written to the STDOUT, or wherever you've set it via
+walk_output().
+
+Errors using the various *style* calls, and bad args to walk_output(),
+result in die().  Use an eval if you wish to catch these errors and
+continue processing.
+
+=head1 AUTHOR
+
+Stephen McCamant, E<lt>smcc@CSUA.Berkeley.EDUE<gt>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Debug.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Debug.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Debug.pm	(revision 14489)
@@ -0,0 +1,305 @@
+package B::Debug;
+
+our $VERSION = '1.02_01';
+
+use strict;
+use B qw(peekop class walkoptree walkoptree_exec
+         main_start main_root cstring sv_undef);
+use B::Asmdata qw(@specialsv_name);
+
+my %done_gv;
+
+sub B::OP::debug {
+    my ($op) = @_;
+    printf <<'EOT', class($op), $$op, ${$op->next}, ${$op->sibling}, $op->ppaddr, $op->targ, $op->type;
+%s (0x%lx)
+	op_next		0x%x
+	op_sibling	0x%x
+	op_ppaddr	%s
+	op_targ		%d
+	op_type		%d
+EOT
+    if ($] > 5.009) {
+	printf <<'EOT', $op->opt, $op->static;
+	op_opt		%d
+	op_static	%d
+EOT
+    } else {
+	printf <<'EOT', $op->seq;
+	op_seq		%d
+EOT
+    }
+    printf <<'EOT', $op->flags, $op->private;
+	op_flags	%d
+	op_private	%d
+EOT
+}
+
+sub B::UNOP::debug {
+    my ($op) = @_;
+    $op->B::OP::debug();
+    printf "\top_first\t0x%x\n", ${$op->first};
+}
+
+sub B::BINOP::debug {
+    my ($op) = @_;
+    $op->B::UNOP::debug();
+    printf "\top_last\t\t0x%x\n", ${$op->last};
+}
+
+sub B::LOOP::debug {
+    my ($op) = @_;
+    $op->B::BINOP::debug();
+    printf <<'EOT', ${$op->redoop}, ${$op->nextop}, ${$op->lastop};
+	op_redoop	0x%x
+	op_nextop	0x%x
+	op_lastop	0x%x
+EOT
+}
+
+sub B::LOGOP::debug {
+    my ($op) = @_;
+    $op->B::UNOP::debug();
+    printf "\top_other\t0x%x\n", ${$op->other};
+}
+
+sub B::LISTOP::debug {
+    my ($op) = @_;
+    $op->B::BINOP::debug();
+    printf "\top_children\t%d\n", $op->children;
+}
+
+sub B::PMOP::debug {
+    my ($op) = @_;
+    $op->B::LISTOP::debug();
+    printf "\top_pmreplroot\t0x%x\n", ${$op->pmreplroot};
+    printf "\top_pmreplstart\t0x%x\n", ${$op->pmreplstart};
+    printf "\top_pmnext\t0x%x\n", ${$op->pmnext};
+    printf "\top_pmregexp->precomp\t%s\n", cstring($op->precomp);
+    printf "\top_pmflags\t0x%x\n", $op->pmflags;
+    $op->pmreplroot->debug;
+}
+
+sub B::COP::debug {
+    my ($op) = @_;
+    $op->B::OP::debug();
+    my $cop_io = class($op->io) eq 'SPECIAL' ? '' : $op->io->as_string;
+    printf <<'EOT', $op->label, $op->stashpv, $op->file, $op->cop_seq, $op->arybase, $op->line, ${$op->warnings}, cstring($cop_io);
+	cop_label	%s
+	cop_stashpv	%s
+	cop_file	%s
+	cop_seq		%d
+	cop_arybase	%d
+	cop_line	%d
+	cop_warnings	0x%x
+	cop_io		%s
+EOT
+}
+
+sub B::SVOP::debug {
+    my ($op) = @_;
+    $op->B::OP::debug();
+    printf "\top_sv\t\t0x%x\n", ${$op->sv};
+    $op->sv->debug;
+}
+
+sub B::PVOP::debug {
+    my ($op) = @_;
+    $op->B::OP::debug();
+    printf "\top_pv\t\t%s\n", cstring($op->pv);
+}
+
+sub B::PADOP::debug {
+    my ($op) = @_;
+    $op->B::OP::debug();
+    printf "\top_padix\t\t%ld\n", $op->padix;
+}
+
+sub B::NULL::debug {
+    my ($sv) = @_;
+    if ($$sv == ${sv_undef()}) {
+	print "&sv_undef\n";
+    } else {
+	printf "NULL (0x%x)\n", $$sv;
+    }
+}
+
+sub B::SV::debug {
+    my ($sv) = @_;
+    if (!$$sv) {
+	print class($sv), " = NULL\n";
+	return;
+    }
+    printf <<'EOT', class($sv), $$sv, $sv->REFCNT, $sv->FLAGS;
+%s (0x%x)
+	REFCNT		%d
+	FLAGS		0x%x
+EOT
+}
+
+sub B::RV::debug {
+    my ($rv) = @_;
+    B::SV::debug($rv);
+    printf <<'EOT', ${$rv->RV};
+	RV		0x%x
+EOT
+    $rv->RV->debug;
+}
+
+sub B::PV::debug {
+    my ($sv) = @_;
+    $sv->B::SV::debug();
+    my $pv = $sv->PV();
+    printf <<'EOT', cstring($pv), length($pv);
+	xpv_pv		%s
+	xpv_cur		%d
+EOT
+}
+
+sub B::IV::debug {
+    my ($sv) = @_;
+    $sv->B::SV::debug();
+    printf "\txiv_iv\t\t%d\n", $sv->IV;
+}
+
+sub B::NV::debug {
+    my ($sv) = @_;
+    $sv->B::IV::debug();
+    printf "\txnv_nv\t\t%s\n", $sv->NV;
+}
+
+sub B::PVIV::debug {
+    my ($sv) = @_;
+    $sv->B::PV::debug();
+    printf "\txiv_iv\t\t%d\n", $sv->IV;
+}
+
+sub B::PVNV::debug {
+    my ($sv) = @_;
+    $sv->B::PVIV::debug();
+    printf "\txnv_nv\t\t%s\n", $sv->NV;
+}
+
+sub B::PVLV::debug {
+    my ($sv) = @_;
+    $sv->B::PVNV::debug();
+    printf "\txlv_targoff\t%d\n", $sv->TARGOFF;
+    printf "\txlv_targlen\t%u\n", $sv->TARGLEN;
+    printf "\txlv_type\t%s\n", cstring(chr($sv->TYPE));
+}
+
+sub B::BM::debug {
+    my ($sv) = @_;
+    $sv->B::PVNV::debug();
+    printf "\txbm_useful\t%d\n", $sv->USEFUL;
+    printf "\txbm_previous\t%u\n", $sv->PREVIOUS;
+    printf "\txbm_rare\t%s\n", cstring(chr($sv->RARE));
+}
+
+sub B::CV::debug {
+    my ($sv) = @_;
+    $sv->B::PVNV::debug();
+    my ($stash) = $sv->STASH;
+    my ($start) = $sv->START;
+    my ($root) = $sv->ROOT;
+    my ($padlist) = $sv->PADLIST;
+    my ($file) = $sv->FILE;
+    my ($gv) = $sv->GV;
+    printf <<'EOT', $$stash, $$start, $$root, $$gv, $file, $sv->DEPTH, $padlist, ${$sv->OUTSIDE}, $sv->OUTSIDE_SEQ;
+	STASH		0x%x
+	START		0x%x
+	ROOT		0x%x
+	GV		0x%x
+	FILE		%s
+	DEPTH		%d
+	PADLIST		0x%x
+	OUTSIDE		0x%x
+	OUTSIDE_SEQ	%d
+EOT
+    $start->debug if $start;
+    $root->debug if $root;
+    $gv->debug if $gv;
+    $padlist->debug if $padlist;
+}
+
+sub B::AV::debug {
+    my ($av) = @_;
+    $av->B::SV::debug;
+    my(@array) = $av->ARRAY;
+    print "\tARRAY\t\t(", join(", ", map("0x" . $$_, @array)), ")\n";
+    printf <<'EOT', scalar(@array), $av->MAX, $av->OFF;
+	FILL		%d
+	MAX		%d
+	OFF		%d
+EOT
+    printf <<'EOT', $av->AvFLAGS if $] < 5.009;
+	AvFLAGS		%d
+EOT
+}
+
+sub B::GV::debug {
+    my ($gv) = @_;
+    if ($done_gv{$$gv}++) {
+	printf "GV %s::%s\n", $gv->STASH->NAME, $gv->SAFENAME;
+	return;
+    }
+    my ($sv) = $gv->SV;
+    my ($av) = $gv->AV;
+    my ($cv) = $gv->CV;
+    $gv->B::SV::debug;
+    printf <<'EOT', $gv->SAFENAME, $gv->STASH->NAME, $gv->STASH, $$sv, $gv->GvREFCNT, $gv->FORM, $$av, ${$gv->HV}, ${$gv->EGV}, $$cv, $gv->CVGEN, $gv->LINE, $gv->FILE, $gv->GvFLAGS;
+	NAME		%s
+	STASH		%s (0x%x)
+	SV		0x%x
+	GvREFCNT	%d
+	FORM		0x%x
+	AV		0x%x
+	HV		0x%x
+	EGV		0x%x
+	CV		0x%x
+	CVGEN		%d
+	LINE		%d
+	FILE		%s
+	GvFLAGS		0x%x
+EOT
+    $sv->debug if $sv;
+    $av->debug if $av;
+    $cv->debug if $cv;
+}
+
+sub B::SPECIAL::debug {
+    my $sv = shift;
+    print $specialsv_name[$$sv], "\n";
+}
+
+sub compile {
+    my $order = shift;
+    B::clearsym();
+    if ($order && $order eq "exec") {
+        return sub { walkoptree_exec(main_start, "debug") }
+    } else {
+        return sub { walkoptree(main_root, "debug") }
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Debug - Walk Perl syntax tree, printing debug info about ops
+
+=head1 SYNOPSIS
+
+	perl -MO=Debug[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+See F<ext/B/README>.
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Deparse.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Deparse.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Deparse.pm	(revision 14489)
@@ -0,0 +1,4642 @@
+# B::Deparse.pm
+# Copyright (c) 1998-2000, 2002, 2003 Stephen McCamant. All rights reserved.
+# This module is free software; you can redistribute and/or modify
+# it under the same terms as Perl itself.
+
+# This is based on the module of the same name by Malcolm Beattie,
+# but essentially none of his code remains.
+
+package B::Deparse;
+use Carp;
+use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
+	 OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST
+	 OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD
+	 OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE
+	 OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
+	 OPpCONST_ARYBASE OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER
+	 OPpSORT_REVERSE OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED
+	 SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
+         CVf_METHOD CVf_LOCKED CVf_LVALUE CVf_ASSERTION
+	 PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE PMf_SKIPWHITE
+	 PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED);
+$VERSION = 0.71;
+use strict;
+use vars qw/$AUTOLOAD/;
+use warnings ();
+
+# Changes between 0.50 and 0.51:
+# - fixed nulled leave with live enter in sort { }
+# - fixed reference constants (\"str")
+# - handle empty programs gracefully
+# - handle infinte loops (for (;;) {}, while (1) {})
+# - differentiate between `for my $x ...' and `my $x; for $x ...'
+# - various minor cleanups
+# - moved globals into an object
+# - added `-u', like B::C
+# - package declarations using cop_stash
+# - subs, formats and code sorted by cop_seq
+# Changes between 0.51 and 0.52:
+# - added pp_threadsv (special variables under USE_5005THREADS)
+# - added documentation
+# Changes between 0.52 and 0.53:
+# - many changes adding precedence contexts and associativity
+# - added `-p' and `-s' output style options
+# - various other minor fixes
+# Changes between 0.53 and 0.54:
+# - added support for new `for (1..100)' optimization,
+#   thanks to Gisle Aas
+# Changes between 0.54 and 0.55:
+# - added support for new qr// construct
+# - added support for new pp_regcreset OP
+# Changes between 0.55 and 0.56:
+# - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t
+# - fixed $# on non-lexicals broken in last big rewrite
+# - added temporary fix for change in opcode of OP_STRINGIFY
+# - fixed problem in 0.54's for() patch in `for (@ary)'
+# - fixed precedence in conditional of ?:
+# - tweaked list paren elimination in `my($x) = @_'
+# - made continue-block detection trickier wrt. null ops
+# - fixed various prototype problems in pp_entersub
+# - added support for sub prototypes that never get GVs
+# - added unquoting for special filehandle first arg in truncate
+# - print doubled rv2gv (a bug) as `*{*GV}' instead of illegal `**GV'
+# - added semicolons at the ends of blocks
+# - added -l `#line' declaration option -- fixes cmd/subval.t 27,28
+# Changes between 0.56 and 0.561:
+# - fixed multiply-declared my var in pp_truncate (thanks to Sarathy)
+# - used new B.pm symbolic constants (done by Nick Ing-Simmons)
+# Changes between 0.561 and 0.57:
+# - stylistic changes to symbolic constant stuff
+# - handled scope in s///e replacement code
+# - added unquote option for expanding "" into concats, etc.
+# - split method and proto parts of pp_entersub into separate functions
+# - various minor cleanups
+# Changes after 0.57:
+# - added parens in \&foo (patch by Albert Dvornik)
+# Changes between 0.57 and 0.58:
+# - fixed `0' statements that weren't being printed
+# - added methods for use from other programs
+#   (based on patches from James Duncan and Hugo van der Sanden)
+# - added -si and -sT to control indenting (also based on a patch from Hugo)
+# - added -sv to print something else instead of '???'
+# - preliminary version of utf8 tr/// handling
+# Changes after 0.58:
+# - uses of $op->ppaddr changed to new $op->name (done by Sarathy)
+# - added support for Hugo's new OP_SETSTATE (like nextstate)
+# Changes between 0.58 and 0.59
+# - added support for Chip's OP_METHOD_NAMED
+# - added support for Ilya's OPpTARGET_MY optimization
+# - elided arrows before `()' subscripts when possible
+# Changes between 0.59 and 0.60
+# - support for method attribues was added
+# - some warnings fixed
+# - separate recognition of constant subs
+# - rewrote continue block handling, now recoginizing for loops
+# - added more control of expanding control structures
+# Changes between 0.60 and 0.61 (mostly by Robin Houston)
+# - many bug-fixes
+# - support for pragmas and 'use'
+# - support for the little-used $[ variable
+# - support for __DATA__ sections
+# - UTF8 support
+# - BEGIN, CHECK, INIT and END blocks
+# - scoping of subroutine declarations fixed
+# - compile-time output from the input program can be suppressed, so that the
+#   output is just the deparsed code. (a change to O.pm in fact)
+# - our() declarations
+# - *all* the known bugs are now listed in the BUGS section
+# - comprehensive test mechanism (TEST -deparse)
+# Changes between 0.62 and 0.63 (mostly by Rafael Garcia-Suarez)
+# - bug-fixes
+# - new switch -P
+# - support for command-line switches (-l, -0, etc.)
+# Changes between 0.63 and 0.64
+# - support for //, CHECK blocks, and assertions
+# - improved handling of foreach loops and lexicals
+# - option to use Data::Dumper for constants
+# - more bug fixes
+# - discovered lots more bugs not yet fixed
+
+# Todo:
+#  (See also BUGS section at the end of this file)
+#
+# - finish tr/// changes
+# - add option for even more parens (generalize \&foo change)
+# - left/right context
+# - copy comments (look at real text with $^P?)
+# - avoid semis in one-statement blocks
+# - associativity of &&=, ||=, ?:
+# - ',' => '=>' (auto-unquote?)
+# - break long lines ("\r" as discretionary break?)
+# - configurable syntax highlighting: ANSI color, HTML, TeX, etc.
+# - more style options: brace style, hex vs. octal, quotes, ...
+# - print big ints as hex/octal instead of decimal (heuristic?)
+# - handle `my $x if 0'?
+# - version using op_next instead of op_first/sibling?
+# - avoid string copies (pass arrays, one big join?)
+# - here-docs?
+
+# Current test.deparse failures
+# comp/assertions 38 - disabled assertions should be like "my($x) if 0"
+#    'sub f : assertion {}; no assertions; my $x=1; {f(my $x=2); print "$x\n"}'
+# comp/hints 6 - location of BEGIN blocks wrt. block openings
+# run/switchI 1 - missing -I switches entirely
+#    perl -Ifoo -e 'print @INC'
+# op/caller 2 - warning mask propagates backwards before warnings::register
+#    'use warnings; BEGIN {${^WARNING_BITS} eq "U"x12;} use warnings::register'
+# op/getpid 2 - can't assign to shared my() declaration (threads only)
+#    'my $x : shared = 5'
+# op/override 7 - parens on overriden require change v-string interpretation
+#    'BEGIN{*CORE::GLOBAL::require=sub {}} require v5.6'
+#    c.f. 'BEGIN { *f = sub {0} }; f 2'
+# op/pat 774 - losing Unicode-ness of Latin1-only strings
+#    'use charnames ":short"; $x="\N{latin:a with acute}"'
+# op/recurse 12 - missing parens on recursive call makes it look like method
+#    'sub f { f($x) }'
+# op/subst 90 - inconsistent handling of utf8 under "use utf8"
+# op/taint 29 - "use re 'taint'" deparsed in the wrong place wrt. block open
+# op/tiehandle compile - "use strict" deparsed in the wrong place
+# uni/tr_ several
+# ext/B/t/xref 11 - line numbers when we add newlines to one-line subs
+# ext/Data/Dumper/t/dumper compile
+# ext/DB_file/several
+# ext/Encode/several
+# ext/Ernno/Errno warnings
+# ext/IO/lib/IO/t/io_sel 23
+# ext/PerlIO/t/encoding compile
+# ext/POSIX/t/posix 6
+# ext/Socket/Socket 8
+# ext/Storable/t/croak compile
+# lib/Attribute/Handlers/t/multi compile
+# lib/bignum/ several
+# lib/charnames 35
+# lib/constant 32
+# lib/English 40
+# lib/ExtUtils/t/bytes 4
+# lib/File/DosGlob compile
+# lib/Filter/Simple/t/data 1
+# lib/Math/BigInt/t/constant 1
+# lib/Net/t/config Deparse-warning
+# lib/overload compile
+# lib/Switch/ several
+# lib/Symbol 4
+# lib/Test/Simple several
+# lib/Term/Complete
+# lib/Tie/File/t/29_downcopy 5
+# lib/vars 22
+
+# Object fields (were globals):
+#
+# avoid_local:
+# (local($a), local($b)) and local($a, $b) have the same internal
+# representation but the short form looks better. We notice we can
+# use a large-scale local when checking the list, but need to prevent
+# individual locals too. This hash holds the addresses of OPs that
+# have already had their local-ness accounted for. The same thing
+# is done with my().
+#
+# curcv:
+# CV for current sub (or main program) being deparsed
+#
+# curcvlex:
+# Cached hash of lexical variables for curcv: keys are names,
+# each value is an array of pairs, indicating the cop_seq of scopes
+# in which a var of that name is valid.
+#
+# curcop:
+# COP for statement being deparsed
+#
+# curstash:
+# name of the current package for deparsed code
+#
+# subs_todo:
+# array of [cop_seq, CV, is_format?] for subs and formats we still
+# want to deparse
+#
+# protos_todo:
+# as above, but [name, prototype] for subs that never got a GV
+#
+# subs_done, forms_done:
+# keys are addresses of GVs for subs and formats we've already
+# deparsed (or at least put into subs_todo)
+#
+# subs_declared
+# keys are names of subs for which we've printed declarations.
+# That means we can omit parentheses from the arguments.
+#
+# subs_deparsed
+# Keeps track of fully qualified names of all deparsed subs.
+#
+# parens: -p
+# linenums: -l
+# unquote: -q
+# cuddle: ` ' or `\n', depending on -sC
+# indent_size: -si
+# use_tabs: -sT
+# ex_const: -sv
+
+# A little explanation of how precedence contexts and associativity
+# work:
+#
+# deparse() calls each per-op subroutine with an argument $cx (short
+# for context, but not the same as the cx* in the perl core), which is
+# a number describing the op's parents in terms of precedence, whether
+# they're inside an expression or at statement level, etc.  (see
+# chart below). When ops with children call deparse on them, they pass
+# along their precedence. Fractional values are used to implement
+# associativity (`($x + $y) + $z' => `$x + $y + $y') and related
+# parentheses hacks. The major disadvantage of this scheme is that
+# it doesn't know about right sides and left sides, so say if you
+# assign a listop to a variable, it can't tell it's allowed to leave
+# the parens off the listop.
+
+# Precedences:
+# 26             [TODO] inside interpolation context ("")
+# 25 left        terms and list operators (leftward)
+# 24 left        ->
+# 23 nonassoc    ++ --
+# 22 right       **
+# 21 right       ! ~ \ and unary + and -
+# 20 left        =~ !~
+# 19 left        * / % x
+# 18 left        + - .
+# 17 left        << >>
+# 16 nonassoc    named unary operators
+# 15 nonassoc    < > <= >= lt gt le ge
+# 14 nonassoc    == != <=> eq ne cmp
+# 13 left        &
+# 12 left        | ^
+# 11 left        &&
+# 10 left        ||
+#  9 nonassoc    ..  ...
+#  8 right       ?:
+#  7 right       = += -= *= etc.
+#  6 left        , =>
+#  5 nonassoc    list operators (rightward)
+#  4 right       not
+#  3 left        and
+#  2 left        or xor
+#  1             statement modifiers
+#  0.5           statements, but still print scopes as do { ... }
+#  0             statement level
+
+# Nonprinting characters with special meaning:
+# \cS - steal parens (see maybe_parens_unop)
+# \n - newline and indent
+# \t - increase indent
+# \b - decrease indent (`outdent')
+# \f - flush left (no indent)
+# \cK - kill following semicolon, if any
+
+sub null {
+    my $op = shift;
+    return class($op) eq "NULL";
+}
+
+sub todo {
+    my $self = shift;
+    my($cv, $is_form) = @_;
+    return unless ($cv->FILE eq $0 || exists $self->{files}{$cv->FILE});
+    my $seq;
+    if ($cv->OUTSIDE_SEQ) {
+	$seq = $cv->OUTSIDE_SEQ;
+    } elsif (!null($cv->START) and is_state($cv->START)) {
+	$seq = $cv->START->cop_seq;
+    } else {
+	$seq = 0;
+    }
+    push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form];
+    unless ($is_form || class($cv->STASH) eq 'SPECIAL') {
+	$self->{'subs_deparsed'}{$cv->STASH->NAME."::".$cv->GV->NAME} = 1;
+    }
+}
+
+sub next_todo {
+    my $self = shift;
+    my $ent = shift @{$self->{'subs_todo'}};
+    my $cv = $ent->[1];
+    my $gv = $cv->GV;
+    my $name = $self->gv_name($gv);
+    if ($ent->[2]) {
+	return "format $name =\n"
+	    . $self->deparse_format($ent->[1]). "\n";
+    } else {
+	$self->{'subs_declared'}{$name} = 1;
+	if ($name eq "BEGIN") {
+	    my $use_dec = $self->begin_is_use($cv);
+	    if (defined ($use_dec) and $self->{'expand'} < 5) {
+		return () if 0 == length($use_dec);
+		return $use_dec;
+	    }
+	}
+	my $l = '';
+	if ($self->{'linenums'}) {
+	    my $line = $gv->LINE;
+	    my $file = $gv->FILE;
+	    $l = "\n\f#line $line \"$file\"\n";
+	}
+	my $p = '';
+	if (class($cv->STASH) ne "SPECIAL") {
+	    my $stash = $cv->STASH->NAME;
+	    if ($stash ne $self->{'curstash'}) {
+		$p = "package $stash;\n";
+		$name = "$self->{'curstash'}::$name" unless $name =~ /::/;
+		$self->{'curstash'} = $stash;
+	    }
+	    $name =~ s/^\Q$stash\E:://;
+	}
+        return "${p}${l}sub $name " . $self->deparse_sub($cv);
+    }
+}
+
+# Return a "use" declaration for this BEGIN block, if appropriate
+sub begin_is_use {
+    my ($self, $cv) = @_;
+    my $root = $cv->ROOT;
+    local @$self{qw'curcv curcvlex'} = ($cv);
+#require B::Debug;
+#B::walkoptree($cv->ROOT, "debug");
+    my $lineseq = $root->first;
+    return if $lineseq->name ne "lineseq";
+
+    my $req_op = $lineseq->first->sibling;
+    return if $req_op->name ne "require";
+
+    my $module;
+    if ($req_op->first->private & OPpCONST_BARE) {
+	# Actually it should always be a bareword
+	$module = $self->const_sv($req_op->first)->PV;
+	$module =~ s[/][::]g;
+	$module =~ s/.pm$//;
+    }
+    else {
+	$module = $self->const($self->const_sv($req_op->first), 6);
+    }
+
+    my $version;
+    my $version_op = $req_op->sibling;
+    return if class($version_op) eq "NULL";
+    if ($version_op->name eq "lineseq") {
+	# We have a version parameter; skip nextstate & pushmark
+	my $constop = $version_op->first->next->next;
+
+	return unless $self->const_sv($constop)->PV eq $module;
+	$constop = $constop->sibling;
+	$version = $self->const_sv($constop);
+	if (class($version) eq "IV") {
+	    $version = $version->int_value;
+	} elsif (class($version) eq "NV") {
+	    $version = $version->NV;
+	} elsif (class($version) ne "PVMG") {
+	    # Includes PVIV and PVNV
+	    $version = $version->PV;
+	} else {
+	    # version specified as a v-string
+	    $version = 'v'.join '.', map ord, split //, $version->PV;
+	}
+	$constop = $constop->sibling;
+	return if $constop->name ne "method_named";
+	return if $self->const_sv($constop)->PV ne "VERSION";
+    }
+
+    $lineseq = $version_op->sibling;
+    return if $lineseq->name ne "lineseq";
+    my $entersub = $lineseq->first->sibling;
+    if ($entersub->name eq "stub") {
+	return "use $module $version ();\n" if defined $version;
+	return "use $module ();\n";
+    }
+    return if $entersub->name ne "entersub";
+
+    # See if there are import arguments
+    my $args = '';
+
+    my $svop = $entersub->first->sibling; # Skip over pushmark
+    return unless $self->const_sv($svop)->PV eq $module;
+
+    # Pull out the arguments
+    for ($svop=$svop->sibling; $svop->name ne "method_named";
+		$svop = $svop->sibling) {
+	$args .= ", " if length($args);
+	$args .= $self->deparse($svop, 6);
+    }
+
+    my $use = 'use';
+    my $method_named = $svop;
+    return if $method_named->name ne "method_named";
+    my $method_name = $self->const_sv($method_named)->PV;
+
+    if ($method_name eq "unimport") {
+	$use = 'no';
+    }
+
+    # Certain pragmas are dealt with using hint bits,
+    # so we ignore them here
+    if ($module eq 'strict' || $module eq 'integer'
+	|| $module eq 'bytes' || $module eq 'warnings') {
+	return "";
+    }
+
+    if (defined $version && length $args) {
+	return "$use $module $version ($args);\n";
+    } elsif (defined $version) {
+	return "$use $module $version;\n";
+    } elsif (length $args) {
+	return "$use $module ($args);\n";
+    } else {
+	return "$use $module;\n";
+    }
+}
+
+sub stash_subs {
+    my ($self, $pack) = @_;
+    my (@ret, $stash);
+    if (!defined $pack) {
+	$pack = '';
+	$stash = \%::;
+    }
+    else {
+	$pack =~ s/(::)?$/::/;
+	no strict 'refs';
+	$stash = \%$pack;
+    }
+    my %stash = svref_2object($stash)->ARRAY;
+    while (my ($key, $val) = each %stash) {
+	next if $key eq 'main::';	# avoid infinite recursion
+	my $class = class($val);
+	if ($class eq "PV") {
+	    # Just a prototype. As an ugly but fairly effective way
+	    # to find out if it belongs here is to see if the AUTOLOAD
+	    # (if any) for the stash was defined in one of our files.
+	    my $A = $stash{"AUTOLOAD"};
+	    if (defined ($A) && class($A) eq "GV" && defined($A->CV)
+		&& class($A->CV) eq "CV") {
+		my $AF = $A->FILE;
+		next unless $AF eq $0 || exists $self->{'files'}{$AF};
+	    }
+	    push @{$self->{'protos_todo'}}, [$pack . $key, $val->PV];
+	} elsif ($class eq "IV") {
+	    # Just a name. As above.
+	    my $A = $stash{"AUTOLOAD"};
+	    if (defined ($A) && class($A) eq "GV" && defined($A->CV)
+		&& class($A->CV) eq "CV") {
+		my $AF = $A->FILE;
+		next unless $AF eq $0 || exists $self->{'files'}{$AF};
+	    }
+	    push @{$self->{'protos_todo'}}, [$pack . $key, undef];
+	} elsif ($class eq "GV") {
+	    if (class(my $cv = $val->CV) ne "SPECIAL") {
+		next if $self->{'subs_done'}{$$val}++;
+		next if $$val != ${$cv->GV};   # Ignore imposters
+		$self->todo($cv, 0);
+	    }
+	    if (class(my $cv = $val->FORM) ne "SPECIAL") {
+		next if $self->{'forms_done'}{$$val}++;
+		next if $$val != ${$cv->GV};   # Ignore imposters
+		$self->todo($cv, 1);
+	    }
+	    if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) {
+		$self->stash_subs($pack . $key);
+	    }
+	}
+    }
+}
+
+sub print_protos {
+    my $self = shift;
+    my $ar;
+    my @ret;
+    foreach $ar (@{$self->{'protos_todo'}}) {
+	my $proto = (defined $ar->[1] ? " (". $ar->[1] . ")" : "");
+	push @ret, "sub " . $ar->[0] .  "$proto;\n";
+    }
+    delete $self->{'protos_todo'};
+    return @ret;
+}
+
+sub style_opts {
+    my $self = shift;
+    my $opts = shift;
+    my $opt;
+    while (length($opt = substr($opts, 0, 1))) {
+	if ($opt eq "C") {
+	    $self->{'cuddle'} = " ";
+	    $opts = substr($opts, 1);
+	} elsif ($opt eq "i") {
+	    $opts =~ s/^i(\d+)//;
+	    $self->{'indent_size'} = $1;
+	} elsif ($opt eq "T") {
+	    $self->{'use_tabs'} = 1;
+	    $opts = substr($opts, 1);
+	} elsif ($opt eq "v") {
+	    $opts =~ s/^v([^.]*)(.|$)//;
+	    $self->{'ex_const'} = $1;
+	}
+    }
+}
+
+sub new {
+    my $class = shift;
+    my $self = bless {}, $class;
+    $self->{'cuddle'} = "\n";
+    $self->{'curcop'} = undef;
+    $self->{'curstash'} = "main";
+    $self->{'ex_const'} = "'???'";
+    $self->{'expand'} = 0;
+    $self->{'files'} = {};
+    $self->{'indent_size'} = 4;
+    $self->{'linenums'} = 0;
+    $self->{'parens'} = 0;
+    $self->{'subs_todo'} = [];
+    $self->{'unquote'} = 0;
+    $self->{'use_dumper'} = 0;
+    $self->{'use_tabs'} = 0;
+
+    $self->{'ambient_arybase'} = 0;
+    $self->{'ambient_warnings'} = undef; # Assume no lexical warnings
+    $self->{'ambient_hints'} = 0;
+    $self->init();
+
+    while (my $arg = shift @_) {
+	if ($arg eq "-d") {
+	    $self->{'use_dumper'} = 1;
+	    require Data::Dumper;
+	} elsif ($arg =~ /^-f(.*)/) {
+	    $self->{'files'}{$1} = 1;
+	} elsif ($arg eq "-l") {
+	    $self->{'linenums'} = 1;
+	} elsif ($arg eq "-p") {
+	    $self->{'parens'} = 1;
+	} elsif ($arg eq "-P") {
+	    $self->{'noproto'} = 1;
+	} elsif ($arg eq "-q") {
+	    $self->{'unquote'} = 1;
+	} elsif (substr($arg, 0, 2) eq "-s") {
+	    $self->style_opts(substr $arg, 2);
+	} elsif ($arg =~ /^-x(\d)$/) {
+	    $self->{'expand'} = $1;
+	}
+    }
+    return $self;
+}
+
+{
+    # Mask out the bits that L<warnings::register> uses
+    my $WARN_MASK;
+    BEGIN {
+	$WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all};
+    }
+    sub WARN_MASK () {
+	return $WARN_MASK;
+    }
+}
+
+# Initialise the contextual information, either from
+# defaults provided with the ambient_pragmas method,
+# or from perl's own defaults otherwise.
+sub init {
+    my $self = shift;
+
+    $self->{'arybase'}  = $self->{'ambient_arybase'};
+    $self->{'warnings'} = defined ($self->{'ambient_warnings'})
+				? $self->{'ambient_warnings'} & WARN_MASK
+				: undef;
+    $self->{'hints'}    = $self->{'ambient_hints'} & 0xFF;
+
+    # also a convenient place to clear out subs_declared
+    delete $self->{'subs_declared'};
+}
+
+sub compile {
+    my(@args) = @_;
+    return sub {
+	my $self = B::Deparse->new(@args);
+	# First deparse command-line args
+	if (defined $^I) { # deparse -i
+	    print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n);
+	}
+	if ($^W) { # deparse -w
+	    print qq(BEGIN { \$^W = $^W; }\n);
+	}
+	if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0
+	    my $fs = perlstring($/) || 'undef';
+	    my $bs = perlstring($O::savebackslash) || 'undef';
+	    print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n);
+	}
+	my @BEGINs  = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : ();
+	my @CHECKs  = B::check_av->isa("B::AV") ? B::check_av->ARRAY : ();
+	my @INITs   = B::init_av->isa("B::AV") ? B::init_av->ARRAY : ();
+	my @ENDs    = B::end_av->isa("B::AV") ? B::end_av->ARRAY : ();
+	for my $block (@BEGINs, @CHECKs, @INITs, @ENDs) {
+	    $self->todo($block, 0);
+	}
+	$self->stash_subs();
+	local($SIG{"__DIE__"}) =
+	  sub {
+	      if ($self->{'curcop'}) {
+		  my $cop = $self->{'curcop'};
+		  my($line, $file) = ($cop->line, $cop->file);
+		  print STDERR "While deparsing $file near line $line,\n";
+	      }
+	    };
+	$self->{'curcv'} = main_cv;
+	$self->{'curcvlex'} = undef;
+	print $self->print_protos;
+	@{$self->{'subs_todo'}} =
+	  sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
+	print $self->indent($self->deparse_root(main_root)), "\n"
+	  unless null main_root;
+	my @text;
+	while (scalar(@{$self->{'subs_todo'}})) {
+	    push @text, $self->next_todo;
+	}
+	print $self->indent(join("", @text)), "\n" if @text;
+
+	# Print __DATA__ section, if necessary
+	no strict 'refs';
+	my $laststash = defined $self->{'curcop'}
+	    ? $self->{'curcop'}->stash->NAME : $self->{'curstash'};
+	if (defined *{$laststash."::DATA"}{IO}) {
+	    print "package $laststash;\n"
+		unless $laststash eq $self->{'curstash'};
+	    print "__DATA__\n";
+	    print readline(*{$laststash."::DATA"});
+	}
+    }
+}
+
+sub coderef2text {
+    my $self = shift;
+    my $sub = shift;
+    croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE");
+
+    $self->init();
+    return $self->indent($self->deparse_sub(svref_2object($sub)));
+}
+
+sub ambient_pragmas {
+    my $self = shift;
+    my ($arybase, $hint_bits, $warning_bits) = (0, 0);
+
+    while (@_ > 1) {
+	my $name = shift();
+	my $val  = shift();
+
+	if ($name eq 'strict') {
+	    require strict;
+
+	    if ($val eq 'none') {
+		$hint_bits &= ~strict::bits(qw/refs subs vars/);
+		next();
+	    }
+
+	    my @names;
+	    if ($val eq "all") {
+		@names = qw/refs subs vars/;
+	    }
+	    elsif (ref $val) {
+		@names = @$val;
+	    }
+	    else {
+		@names = split' ', $val;
+	    }
+	    $hint_bits |= strict::bits(@names);
+	}
+
+	elsif ($name eq '$[') {
+	    $arybase = $val;
+	}
+
+	elsif ($name eq 'integer'
+	    || $name eq 'bytes'
+	    || $name eq 'utf8') {
+	    require "$name.pm";
+	    if ($val) {
+		$hint_bits |= ${$::{"${name}::"}{"hint_bits"}};
+	    }
+	    else {
+		$hint_bits &= ~${$::{"${name}::"}{"hint_bits"}};
+	    }
+	}
+
+	elsif ($name eq 're') {
+	    require re;
+	    if ($val eq 'none') {
+		$hint_bits &= ~re::bits(qw/taint eval/);
+		next();
+	    }
+
+	    my @names;
+	    if ($val eq 'all') {
+		@names = qw/taint eval/;
+	    }
+	    elsif (ref $val) {
+		@names = @$val;
+	    }
+	    else {
+		@names = split' ',$val;
+	    }
+	    $hint_bits |= re::bits(@names);
+	}
+
+	elsif ($name eq 'warnings') {
+	    if ($val eq 'none') {
+		$warning_bits = $warnings::NONE;
+		next();
+	    }
+
+	    my @names;
+	    if (ref $val) {
+		@names = @$val;
+	    }
+	    else {
+		@names = split/\s+/, $val;
+	    }
+
+	    $warning_bits = $warnings::NONE if !defined ($warning_bits);
+	    $warning_bits |= warnings::bits(@names);
+	}
+
+	elsif ($name eq 'warning_bits') {
+	    $warning_bits = $val;
+	}
+
+	elsif ($name eq 'hint_bits') {
+	    $hint_bits = $val;
+	}
+
+	else {
+	    croak "Unknown pragma type: $name";
+	}
+    }
+    if (@_) {
+	croak "The ambient_pragmas method expects an even number of args";
+    }
+
+    $self->{'ambient_arybase'} = $arybase;
+    $self->{'ambient_warnings'} = $warning_bits;
+    $self->{'ambient_hints'} = $hint_bits;
+}
+
+# This method is the inner loop, so try to keep it simple
+sub deparse {
+    my $self = shift;
+    my($op, $cx) = @_;
+
+    Carp::confess("Null op in deparse") if !defined($op)
+					|| class($op) eq "NULL";
+    my $meth = "pp_" . $op->name;
+    return $self->$meth($op, $cx);
+}
+
+sub indent {
+    my $self = shift;
+    my $txt = shift;
+    my @lines = split(/\n/, $txt);
+    my $leader = "";
+    my $level = 0;
+    my $line;
+    for $line (@lines) {
+	my $cmd = substr($line, 0, 1);
+	if ($cmd eq "\t" or $cmd eq "\b") {
+	    $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'};
+	    if ($self->{'use_tabs'}) {
+		$leader = "\t" x ($level / 8) . " " x ($level % 8);
+	    } else {
+		$leader = " " x $level;
+	    }
+	    $line = substr($line, 1);
+	}
+	if (substr($line, 0, 1) eq "\f") {
+	    $line = substr($line, 1); # no indent
+	} else {
+	    $line = $leader . $line;
+	}
+	$line =~ s/\cK;?//g;
+    }
+    return join("\n", @lines);
+}
+
+sub deparse_sub {
+    my $self = shift;
+    my $cv = shift;
+    my $proto = "";
+Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
+Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
+    local $self->{'curcop'} = $self->{'curcop'};
+    if ($cv->FLAGS & SVf_POK) {
+	$proto = "(". $cv->PV . ") ";
+    }
+    if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE|CVf_ASSERTION)) {
+        $proto .= ": ";
+        $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
+        $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
+        $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
+        $proto .= "assertion " if $cv->CvFLAGS & CVf_ASSERTION;
+    }
+
+    local($self->{'curcv'}) = $cv;
+    local($self->{'curcvlex'});
+    local(@$self{qw'curstash warnings hints'})
+		= @$self{qw'curstash warnings hints'};
+    my $body;
+    if (not null $cv->ROOT) {
+	my $lineseq = $cv->ROOT->first;
+	if ($lineseq->name eq "lineseq") {
+	    my @ops;
+	    for(my$o=$lineseq->first; $$o; $o=$o->sibling) {
+		push @ops, $o;
+	    }
+	    $body = $self->lineseq(undef, @ops).";";
+	    my $scope_en = $self->find_scope_en($lineseq);
+	    if (defined $scope_en) {
+		my $subs = join"", $self->seq_subs($scope_en);
+		$body .= ";\n$subs" if length($subs);
+	    }
+	}
+	else {
+	    $body = $self->deparse($cv->ROOT->first, 0);
+	}
+    }
+    else {
+	my $sv = $cv->const_sv;
+	if ($$sv) {
+	    # uh-oh. inlinable sub... format it differently
+	    return $proto . "{ " . $self->const($sv, 0) . " }\n";
+	} else { # XSUB? (or just a declaration)
+	    return "$proto;\n";
+	}
+    }
+    return $proto ."{\n\t$body\n\b}" ."\n";
+}
+
+sub deparse_format {
+    my $self = shift;
+    my $form = shift;
+    my @text;
+    local($self->{'curcv'}) = $form;
+    local($self->{'curcvlex'});
+    local($self->{'in_format'}) = 1;
+    local(@$self{qw'curstash warnings hints'})
+		= @$self{qw'curstash warnings hints'};
+    my $op = $form->ROOT;
+    my $kid;
+    return "\f." if $op->first->name eq 'stub'
+                || $op->first->name eq 'nextstate';
+    $op = $op->first->first; # skip leavewrite, lineseq
+    while (not null $op) {
+	$op = $op->sibling; # skip nextstate
+	my @exprs;
+	$kid = $op->first->sibling; # skip pushmark
+	push @text, "\f".$self->const_sv($kid)->PV;
+	$kid = $kid->sibling;
+	for (; not null $kid; $kid = $kid->sibling) {
+	    push @exprs, $self->deparse($kid, 0);
+	}
+	push @text, "\f".join(", ", @exprs)."\n" if @exprs;
+	$op = $op->sibling;
+    }
+    return join("", @text) . "\f.";
+}
+
+sub is_scope {
+    my $op = shift;
+    return $op->name eq "leave" || $op->name eq "scope"
+      || $op->name eq "lineseq"
+	|| ($op->name eq "null" && class($op) eq "UNOP"
+	    && (is_scope($op->first) || $op->first->name eq "enter"));
+}
+
+sub is_state {
+    my $name = $_[0]->name;
+    return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate";
+}
+
+sub is_miniwhile { # check for one-line loop (`foo() while $y--')
+    my $op = shift;
+    return (!null($op) and null($op->sibling)
+	    and $op->name eq "null" and class($op) eq "UNOP"
+	    and (($op->first->name =~ /^(and|or)$/
+		  and $op->first->first->sibling->name eq "lineseq")
+		 or ($op->first->name eq "lineseq"
+		     and not null $op->first->first->sibling
+		     and $op->first->first->sibling->name eq "unstack")
+		 ));
+}
+
+# Check if the op and its sibling are the initialization and the rest of a
+# for (..;..;..) { ... } loop
+sub is_for_loop {
+    my $op = shift;
+    # This OP might be almost anything, though it won't be a
+    # nextstate. (It's the initialization, so in the canonical case it
+    # will be an sassign.) The sibling is a lineseq whose first child
+    # is a nextstate and whose second is a leaveloop.
+    my $lseq = $op->sibling;
+    if (!is_state $op and !null($lseq) and $lseq->name eq "lineseq") {
+	if ($lseq->first && !null($lseq->first) && is_state($lseq->first)
+	    && (my $sib = $lseq->first->sibling)) {
+	    return (!null($sib) && $sib->name eq "leaveloop");
+	}
+    }
+    return 0;
+}
+
+sub is_scalar {
+    my $op = shift;
+    return ($op->name eq "rv2sv" or
+	    $op->name eq "padsv" or
+	    $op->name eq "gv" or # only in array/hash constructs
+	    $op->flags & OPf_KIDS && !null($op->first)
+	      && $op->first->name eq "gvsv");
+}
+
+sub maybe_parens {
+    my $self = shift;
+    my($text, $cx, $prec) = @_;
+    if ($prec < $cx              # unary ops nest just fine
+	or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21
+	or $self->{'parens'})
+    {
+	$text = "($text)";
+	# In a unop, let parent reuse our parens; see maybe_parens_unop
+	$text = "\cS" . $text if $cx == 16;
+	return $text;
+    } else {
+	return $text;
+    }
+}
+
+# same as above, but get around the `if it looks like a function' rule
+sub maybe_parens_unop {
+    my $self = shift;
+    my($name, $kid, $cx) = @_;
+    if ($cx > 16 or $self->{'parens'}) {
+	$kid =  $self->deparse($kid, 1);
+ 	if ($name eq "umask" && $kid =~ /^\d+$/) {
+	    $kid = sprintf("%#o", $kid);
+	}
+	return "$name($kid)";
+    } else {
+	$kid = $self->deparse($kid, 16);
+ 	if ($name eq "umask" && $kid =~ /^\d+$/) {
+	    $kid = sprintf("%#o", $kid);
+	}
+	if (substr($kid, 0, 1) eq "\cS") {
+	    # use kid's parens
+	    return $name . substr($kid, 1);
+	} elsif (substr($kid, 0, 1) eq "(") {
+	    # avoid looks-like-a-function trap with extra parens
+	    # (`+' can lead to ambiguities)
+	    return "$name(" . $kid  . ")";
+	} else {
+	    return "$name $kid";
+	}
+    }
+}
+
+sub maybe_parens_func {
+    my $self = shift;
+    my($func, $text, $cx, $prec) = @_;
+    if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
+	return "$func($text)";
+    } else {
+	return "$func $text";
+    }
+}
+
+sub maybe_local {
+    my $self = shift;
+    my($op, $cx, $text) = @_;
+    my $our_intro = ($op->name =~ /^(gv|rv2)[ash]v$/) ? OPpOUR_INTRO : 0;
+    if ($op->private & (OPpLVAL_INTRO|$our_intro)
+	and not $self->{'avoid_local'}{$$op}) {
+	my $our_local = ($op->private & OPpLVAL_INTRO) ? "local" : "our";
+	if( $our_local eq 'our' ) {
+	    # XXX This assertion fails code with non-ASCII identifiers,
+	    # like ./ext/Encode/t/jperl.t
+	    die "Unexpected our($text)\n" unless $text =~ /^\W(\w+::)*\w+\z/;
+	    $text =~ s/(\w+::)+//;
+	}
+        if (want_scalar($op)) {
+	    return "$our_local $text";
+	} else {
+	    return $self->maybe_parens_func("$our_local", $text, $cx, 16);
+	}
+    } else {
+	return $text;
+    }
+}
+
+sub maybe_targmy {
+    my $self = shift;
+    my($op, $cx, $func, @args) = @_;
+    if ($op->private & OPpTARGET_MY) {
+	my $var = $self->padname($op->targ);
+	my $val = $func->($self, $op, 7, @args);
+	return $self->maybe_parens("$var = $val", $cx, 7);
+    } else {
+	return $func->($self, $op, $cx, @args);
+    }
+}
+
+sub padname_sv {
+    my $self = shift;
+    my $targ = shift;
+    return $self->{'curcv'}->PADLIST->ARRAYelt(0)->ARRAYelt($targ);
+}
+
+sub maybe_my {
+    my $self = shift;
+    my($op, $cx, $text) = @_;
+    if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
+	if (want_scalar($op)) {
+	    return "my $text";
+	} else {
+	    return $self->maybe_parens_func("my", $text, $cx, 16);
+	}
+    } else {
+	return $text;
+    }
+}
+
+# The following OPs don't have functions:
+
+# pp_padany -- does not exist after parsing
+
+sub AUTOLOAD {
+    if ($AUTOLOAD =~ s/^.*::pp_//) {
+	warn "unexpected OP_".uc $AUTOLOAD;
+	return "XXX";
+    } else {
+	die "Undefined subroutine $AUTOLOAD called";
+    }
+}
+
+sub DESTROY {}	#	Do not AUTOLOAD
+
+# $root should be the op which represents the root of whatever
+# we're sequencing here. If it's undefined, then we don't append
+# any subroutine declarations to the deparsed ops, otherwise we
+# append appropriate declarations.
+sub lineseq {
+    my($self, $root, @ops) = @_;
+    my($expr, @exprs);
+
+    my $out_cop = $self->{'curcop'};
+    my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef;
+    my $limit_seq;
+    if (defined $root) {
+	$limit_seq = $out_seq;
+	my $nseq;
+	$nseq = $self->find_scope_st($root->sibling) if ${$root->sibling};
+	$limit_seq = $nseq if !defined($limit_seq)
+			   or defined($nseq) && $nseq < $limit_seq;
+    }
+    $limit_seq = $self->{'limit_seq'}
+	if defined($self->{'limit_seq'})
+	&& (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq);
+    local $self->{'limit_seq'} = $limit_seq;
+    for (my $i = 0; $i < @ops; $i++) {
+	$expr = "";
+	if (is_state $ops[$i]) {
+	    $expr = $self->deparse($ops[$i], 0);
+	    $i++;
+	    if ($i > $#ops) {
+		push @exprs, $expr;
+		last;
+	    }
+	}
+	if (!is_state $ops[$i] and (my $ls = $ops[$i+1]) and
+	    !null($ops[$i+1]) and $ops[$i+1]->name eq "lineseq")
+	{
+	    if ($ls->first && !null($ls->first) && is_state($ls->first)
+		&& (my $sib = $ls->first->sibling)) {
+		if (!null($sib) && $sib->name eq "leaveloop") {
+		    push @exprs, $expr . $self->for_loop($ops[$i], 0);
+		    $i++;
+		    next;
+		}
+	    }
+	}
+	$expr .= $self->deparse($ops[$i], (@ops != 1)/2);
+	$expr =~ s/;\n?\z//;
+	push @exprs, $expr;
+    }
+    my $body = join(";\n", grep {length} @exprs);
+    my $subs = "";
+    if (defined $root && defined $limit_seq && !$self->{'in_format'}) {
+	$subs = join "\n", $self->seq_subs($limit_seq);
+    }
+    return join(";\n", grep {length} $body, $subs);
+}
+
+sub scopeop {
+    my($real_block, $self, $op, $cx) = @_;
+    my $kid;
+    my @kids;
+
+    local(@$self{qw'curstash warnings hints'})
+		= @$self{qw'curstash warnings hints'} if $real_block;
+    if ($real_block) {
+	$kid = $op->first->sibling; # skip enter
+	if (is_miniwhile($kid)) {
+	    my $top = $kid->first;
+	    my $name = $top->name;
+	    if ($name eq "and") {
+		$name = "while";
+	    } elsif ($name eq "or") {
+		$name = "until";
+	    } else { # no conditional -> while 1 or until 0
+		return $self->deparse($top->first, 1) . " while 1";
+	    }
+	    my $cond = $top->first;
+	    my $body = $cond->sibling->first; # skip lineseq
+	    $cond = $self->deparse($cond, 1);
+	    $body = $self->deparse($body, 1);
+	    return "$body $name $cond";
+	}
+    } else {
+	$kid = $op->first;
+    }
+    for (; !null($kid); $kid = $kid->sibling) {
+	push @kids, $kid;
+    }
+    if ($cx > 0) { # inside an expression, (a do {} while for lineseq)
+	return "do {\n\t" . $self->lineseq($op, @kids) . "\n\b}";
+    } else {
+	my $lineseq = $self->lineseq($op, @kids);
+	return (length ($lineseq) ? "$lineseq;" : "");
+    }
+}
+
+sub pp_scope { scopeop(0, @_); }
+sub pp_lineseq { scopeop(0, @_); }
+sub pp_leave { scopeop(1, @_); }
+
+# This is a special case of scopeop and lineseq, for the case of the
+# main_root. The difference is that we print the output statements as
+# soon as we get them, for the sake of impatient users.
+sub deparse_root {
+    my $self = shift;
+    my($op) = @_;
+    local(@$self{qw'curstash warnings hints'})
+      = @$self{qw'curstash warnings hints'};
+    my @kids;
+    for (my $kid = $op->first->sibling; !null($kid); $kid = $kid->sibling) {
+	push @kids, $kid;
+    }
+    for (my $i = 0; $i < @kids; $i++) {
+	my $expr = "";
+	if (is_state $kids[$i]) {
+	    $expr = $self->deparse($kids[$i], 0);
+	    $i++;
+	    if ($i > $#kids) {
+		print $self->indent($expr);
+		last;
+	    }
+	}
+	if (is_for_loop($kids[$i])) {
+	    $expr .= $self->for_loop($kids[$i], 0);
+	    $expr .= ";\n" unless $i == $#kids;
+	    print $self->indent($expr);
+	    $i++;
+	    next;
+	}
+	$expr .= $self->deparse($kids[$i], (@kids != 1)/2);
+	$expr =~ s/;\n?\z//;
+	$expr .= ";";
+	print $self->indent($expr);
+	print "\n" unless $i == $#kids;
+    }
+}
+
+# The BEGIN {} is used here because otherwise this code isn't executed
+# when you run B::Deparse on itself.
+my %globalnames;
+BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC",
+	    "ENV", "ARGV", "ARGVOUT", "_"); }
+
+sub gv_name {
+    my $self = shift;
+    my $gv = shift;
+Carp::confess() unless ref($gv) eq "B::GV";
+    my $stash = $gv->STASH->NAME;
+    my $name = $gv->SAFENAME;
+    if (($stash eq 'main' && $globalnames{$name})
+	or ($stash eq $self->{'curstash'} && !$globalnames{$name})
+	or $name =~ /^[^A-Za-z_:]/)
+    {
+	$stash = "";
+    } else {
+	$stash = $stash . "::";
+    }
+    if ($name =~ /^(\^..|{)/) {
+        $name = "{$name}";       # ${^WARNING_BITS}, etc and ${
+    }
+    return $stash . $name;
+}
+
+# Return the name to use for a stash variable.
+# If a lexical with the same name is in scope, it may need to be
+# fully-qualified.
+sub stash_variable {
+    my ($self, $prefix, $name) = @_;
+
+    return "$prefix$name" if $name =~ /::/;
+
+    unless ($prefix eq '$' || $prefix eq '@' || #'
+	    $prefix eq '%' || $prefix eq '$#') {
+	return "$prefix$name";
+    }
+
+    my $v = ($prefix eq '$#' ? '@' : $prefix) . $name;
+    return $prefix .$self->{'curstash'}.'::'. $name if $self->lex_in_scope($v);
+    return "$prefix$name";
+}
+
+sub lex_in_scope {
+    my ($self, $name) = @_;
+    $self->populate_curcvlex() if !defined $self->{'curcvlex'};
+
+    return 0 if !defined($self->{'curcop'});
+    my $seq = $self->{'curcop'}->cop_seq;
+    return 0 if !exists $self->{'curcvlex'}{$name};
+    for my $a (@{$self->{'curcvlex'}{$name}}) {
+	my ($st, $en) = @$a;
+	return 1 if $seq > $st && $seq <= $en;
+    }
+    return 0;
+}
+
+sub populate_curcvlex {
+    my $self = shift;
+    for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) {
+	my $padlist = $cv->PADLIST;
+	# an undef CV still in lexical chain
+	next if class($padlist) eq "SPECIAL";
+	my @padlist = $padlist->ARRAY;
+	my @ns = $padlist[0]->ARRAY;
+
+	for (my $i=0; $i<@ns; ++$i) {
+	    next if class($ns[$i]) eq "SPECIAL";
+	    next if $ns[$i]->FLAGS & SVpad_OUR;  # Skip "our" vars
+	    if (class($ns[$i]) eq "PV") {
+		# Probably that pesky lexical @_
+		next;
+	    }
+            my $name = $ns[$i]->PVX;
+	    my ($seq_st, $seq_en) =
+		($ns[$i]->FLAGS & SVf_FAKE)
+		    ? (0, 999999)
+		    : ($ns[$i]->NVX, $ns[$i]->IVX);
+
+	    push @{$self->{'curcvlex'}{$name}}, [$seq_st, $seq_en];
+	}
+    }
+}
+
+sub find_scope_st { ((find_scope(@_))[0]); }
+sub find_scope_en { ((find_scope(@_))[1]); }
+
+# Recurses down the tree, looking for pad variable introductions and COPs
+sub find_scope {
+    my ($self, $op, $scope_st, $scope_en) = @_;
+    carp("Undefined op in find_scope") if !defined $op;
+    return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS;
+
+    for (my $o=$op->first; $$o; $o=$o->sibling) {
+	if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) {
+	    my $s = int($self->padname_sv($o->targ)->NVX);
+	    my $e = $self->padname_sv($o->targ)->IVX;
+	    $scope_st = $s if !defined($scope_st) || $s < $scope_st;
+	    $scope_en = $e if !defined($scope_en) || $e > $scope_en;
+	}
+	elsif (is_state($o)) {
+	    my $c = $o->cop_seq;
+	    $scope_st = $c if !defined($scope_st) || $c < $scope_st;
+	    $scope_en = $c if !defined($scope_en) || $c > $scope_en;
+	}
+	elsif ($o->flags & OPf_KIDS) {
+	    ($scope_st, $scope_en) =
+		$self->find_scope($o, $scope_st, $scope_en)
+	}
+    }
+
+    return ($scope_st, $scope_en);
+}
+
+# Returns a list of subs which should be inserted before the COP
+sub cop_subs {
+    my ($self, $op, $out_seq) = @_;
+    my $seq = $op->cop_seq;
+    # If we have nephews, then our sequence number indicates
+    # the cop_seq of the end of some sort of scope.
+    if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS
+	and my $nseq = $self->find_scope_st($op->sibling) ) {
+	$seq = $nseq;
+    }
+    $seq = $out_seq if defined($out_seq) && $out_seq < $seq;
+    return $self->seq_subs($seq);
+}
+
+sub seq_subs {
+    my ($self, $seq) = @_;
+    my @text;
+#push @text, "# ($seq)\n";
+
+    return "" if !defined $seq;
+    while (scalar(@{$self->{'subs_todo'}})
+	   and $seq > $self->{'subs_todo'}[0][0]) {
+	push @text, $self->next_todo;
+    }
+    return @text;
+}
+
+# Notice how subs and formats are inserted between statements here;
+# also $[ assignments and pragmas.
+sub pp_nextstate {
+    my $self = shift;
+    my($op, $cx) = @_;
+    $self->{'curcop'} = $op;
+    my @text;
+    push @text, $self->cop_subs($op);
+    push @text, $op->label . ": " if $op->label;
+    my $stash = $op->stashpv;
+    if ($stash ne $self->{'curstash'}) {
+	push @text, "package $stash;\n";
+	$self->{'curstash'} = $stash;
+    }
+
+    if ($self->{'arybase'} != $op->arybase) {
+	push @text, '$[ = '. $op->arybase .";\n";
+	$self->{'arybase'} = $op->arybase;
+    }
+
+    my $warnings = $op->warnings;
+    my $warning_bits;
+    if ($warnings->isa("B::SPECIAL") && $$warnings == 4) {
+	$warning_bits = $warnings::Bits{"all"} & WARN_MASK;
+    }
+    elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) {
+        $warning_bits = $warnings::NONE;
+    }
+    elsif ($warnings->isa("B::SPECIAL")) {
+	$warning_bits = undef;
+    }
+    else {
+	$warning_bits = $warnings->PV & WARN_MASK;
+    }
+
+    if (defined ($warning_bits) and
+       !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) {
+	push @text, declare_warnings($self->{'warnings'}, $warning_bits);
+	$self->{'warnings'} = $warning_bits;
+    }
+
+    if ($self->{'hints'} != $op->private) {
+	push @text, declare_hints($self->{'hints'}, $op->private);
+	$self->{'hints'} = $op->private;
+    }
+
+    # This should go after of any branches that add statements, to
+    # increase the chances that it refers to the same line it did in
+    # the original program.
+    if ($self->{'linenums'}) {
+	push @text, "\f#line " . $op->line .
+	  ' "' . $op->file, qq'"\n';
+    }
+
+    return join("", @text);
+}
+
+sub declare_warnings {
+    my ($from, $to) = @_;
+    if (($to & WARN_MASK) eq (warnings::bits("all") & WARN_MASK)) {
+	return "use warnings;\n";
+    }
+    elsif (($to & WARN_MASK) eq ("\0"x length($to) & WARN_MASK)) {
+	return "no warnings;\n";
+    }
+    return "BEGIN {\${^WARNING_BITS} = ".perlstring($to)."}\n";
+}
+
+sub declare_hints {
+    my ($from, $to) = @_;
+    my $use = $to   & ~$from;
+    my $no  = $from & ~$to;
+    my $decls = "";
+    for my $pragma (hint_pragmas($use)) {
+	$decls .= "use $pragma;\n";
+    }
+    for my $pragma (hint_pragmas($no)) {
+        $decls .= "no $pragma;\n";
+    }
+    return $decls;
+}
+
+sub hint_pragmas {
+    my ($bits) = @_;
+    my @pragmas;
+    push @pragmas, "integer" if $bits & 0x1;
+    push @pragmas, "strict 'refs'" if $bits & 0x2;
+    push @pragmas, "bytes" if $bits & 0x8;
+    return @pragmas;
+}
+
+sub pp_dbstate { pp_nextstate(@_) }
+sub pp_setstate { pp_nextstate(@_) }
+
+sub pp_unstack { return "" } # see also leaveloop
+
+sub baseop {
+    my $self = shift;
+    my($op, $cx, $name) = @_;
+    return $name;
+}
+
+sub pp_stub {
+    my $self = shift;
+    my($op, $cx, $name) = @_;
+    if ($cx >= 1) {
+	return "()";
+    }
+    else {
+	return "();";
+    }
+}
+sub pp_wantarray { baseop(@_, "wantarray") }
+sub pp_fork { baseop(@_, "fork") }
+sub pp_wait { maybe_targmy(@_, \&baseop, "wait") }
+sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") }
+sub pp_time { maybe_targmy(@_, \&baseop, "time") }
+sub pp_tms { baseop(@_, "times") }
+sub pp_ghostent { baseop(@_, "gethostent") }
+sub pp_gnetent { baseop(@_, "getnetent") }
+sub pp_gprotoent { baseop(@_, "getprotoent") }
+sub pp_gservent { baseop(@_, "getservent") }
+sub pp_ehostent { baseop(@_, "endhostent") }
+sub pp_enetent { baseop(@_, "endnetent") }
+sub pp_eprotoent { baseop(@_, "endprotoent") }
+sub pp_eservent { baseop(@_, "endservent") }
+sub pp_gpwent { baseop(@_, "getpwent") }
+sub pp_spwent { baseop(@_, "setpwent") }
+sub pp_epwent { baseop(@_, "endpwent") }
+sub pp_ggrent { baseop(@_, "getgrent") }
+sub pp_sgrent { baseop(@_, "setgrent") }
+sub pp_egrent { baseop(@_, "endgrent") }
+sub pp_getlogin { baseop(@_, "getlogin") }
+
+sub POSTFIX () { 1 }
+
+# I couldn't think of a good short name, but this is the category of
+# symbolic unary operators with interesting precedence
+
+sub pfixop {
+    my $self = shift;
+    my($op, $cx, $name, $prec, $flags) = (@_, 0);
+    my $kid = $op->first;
+    $kid = $self->deparse($kid, $prec);
+    return $self->maybe_parens(($flags & POSTFIX) ? "$kid$name" : "$name$kid",
+			       $cx, $prec);
+}
+
+sub pp_preinc { pfixop(@_, "++", 23) }
+sub pp_predec { pfixop(@_, "--", 23) }
+sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
+sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
+sub pp_i_preinc { pfixop(@_, "++", 23) }
+sub pp_i_predec { pfixop(@_, "--", 23) }
+sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
+sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
+sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
+
+sub pp_negate { maybe_targmy(@_, \&real_negate) }
+sub real_negate {
+    my $self = shift;
+    my($op, $cx) = @_;
+    if ($op->first->name =~ /^(i_)?negate$/) {
+	# avoid --$x
+	$self->pfixop($op, $cx, "-", 21.5);
+    } else {
+	$self->pfixop($op, $cx, "-", 21);	
+    }
+}
+sub pp_i_negate { pp_negate(@_) }
+
+sub pp_not {
+    my $self = shift;
+    my($op, $cx) = @_;
+    if ($cx <= 4) {
+	$self->pfixop($op, $cx, "not ", 4);
+    } else {
+	$self->pfixop($op, $cx, "!", 21);	
+    }
+}
+
+sub unop {
+    my $self = shift;
+    my($op, $cx, $name) = @_;
+    my $kid;
+    if ($op->flags & OPf_KIDS) {
+	$kid = $op->first;
+	if (defined prototype("CORE::$name")
+	   && prototype("CORE::$name") =~ /^;?\*/
+	   && $kid->name eq "rv2gv") {
+	    $kid = $kid->first;
+	}
+
+	return $self->maybe_parens_unop($name, $kid, $cx);
+    } else {
+	return $name .  ($op->flags & OPf_SPECIAL ? "()" : "");
+    }
+}
+
+sub pp_chop { maybe_targmy(@_, \&unop, "chop") }
+sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
+sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
+sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
+sub pp_defined { unop(@_, "defined") }
+sub pp_undef { unop(@_, "undef") }
+sub pp_study { unop(@_, "study") }
+sub pp_ref { unop(@_, "ref") }
+sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
+
+sub pp_sin { maybe_targmy(@_, \&unop, "sin") }
+sub pp_cos { maybe_targmy(@_, \&unop, "cos") }
+sub pp_rand { maybe_targmy(@_, \&unop, "rand") }
+sub pp_srand { unop(@_, "srand") }
+sub pp_exp { maybe_targmy(@_, \&unop, "exp") }
+sub pp_log { maybe_targmy(@_, \&unop, "log") }
+sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") }
+sub pp_int { maybe_targmy(@_, \&unop, "int") }
+sub pp_hex { maybe_targmy(@_, \&unop, "hex") }
+sub pp_oct { maybe_targmy(@_, \&unop, "oct") }
+sub pp_abs { maybe_targmy(@_, \&unop, "abs") }
+
+sub pp_length { maybe_targmy(@_, \&unop, "length") }
+sub pp_ord { maybe_targmy(@_, \&unop, "ord") }
+sub pp_chr { maybe_targmy(@_, \&unop, "chr") }
+
+sub pp_each { unop(@_, "each") }
+sub pp_values { unop(@_, "values") }
+sub pp_keys { unop(@_, "keys") }
+sub pp_pop { unop(@_, "pop") }
+sub pp_shift { unop(@_, "shift") }
+
+sub pp_caller { unop(@_, "caller") }
+sub pp_reset { unop(@_, "reset") }
+sub pp_exit { unop(@_, "exit") }
+sub pp_prototype { unop(@_, "prototype") }
+
+sub pp_close { unop(@_, "close") }
+sub pp_fileno { unop(@_, "fileno") }
+sub pp_umask { unop(@_, "umask") }
+sub pp_untie { unop(@_, "untie") }
+sub pp_tied { unop(@_, "tied") }
+sub pp_dbmclose { unop(@_, "dbmclose") }
+sub pp_getc { unop(@_, "getc") }
+sub pp_eof { unop(@_, "eof") }
+sub pp_tell { unop(@_, "tell") }
+sub pp_getsockname { unop(@_, "getsockname") }
+sub pp_getpeername { unop(@_, "getpeername") }
+
+sub pp_chdir { maybe_targmy(@_, \&unop, "chdir") }
+sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") }
+sub pp_readlink { unop(@_, "readlink") }
+sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") }
+sub pp_readdir { unop(@_, "readdir") }
+sub pp_telldir { unop(@_, "telldir") }
+sub pp_rewinddir { unop(@_, "rewinddir") }
+sub pp_closedir { unop(@_, "closedir") }
+sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") }
+sub pp_localtime { unop(@_, "localtime") }
+sub pp_gmtime { unop(@_, "gmtime") }
+sub pp_alarm { unop(@_, "alarm") }
+sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") }
+
+sub pp_dofile { unop(@_, "do") }
+sub pp_entereval { unop(@_, "eval") }
+
+sub pp_ghbyname { unop(@_, "gethostbyname") }
+sub pp_gnbyname { unop(@_, "getnetbyname") }
+sub pp_gpbyname { unop(@_, "getprotobyname") }
+sub pp_shostent { unop(@_, "sethostent") }
+sub pp_snetent { unop(@_, "setnetent") }
+sub pp_sprotoent { unop(@_, "setprotoent") }
+sub pp_sservent { unop(@_, "setservent") }
+sub pp_gpwnam { unop(@_, "getpwnam") }
+sub pp_gpwuid { unop(@_, "getpwuid") }
+sub pp_ggrnam { unop(@_, "getgrnam") }
+sub pp_ggrgid { unop(@_, "getgrgid") }
+
+sub pp_lock { unop(@_, "lock") }
+
+sub pp_exists {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $arg;
+    if ($op->private & OPpEXISTS_SUB) {
+	# Checking for the existence of a subroutine
+	return $self->maybe_parens_func("exists",
+				$self->pp_rv2cv($op->first, 16), $cx, 16);
+    }
+    if ($op->flags & OPf_SPECIAL) {
+	# Array element, not hash element
+	return $self->maybe_parens_func("exists",
+				$self->pp_aelem($op->first, 16), $cx, 16);
+    }
+    return $self->maybe_parens_func("exists", $self->pp_helem($op->first, 16),
+				    $cx, 16);
+}
+
+sub pp_delete {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $arg;
+    if ($op->private & OPpSLICE) {
+	if ($op->flags & OPf_SPECIAL) {
+	    # Deleting from an array, not a hash
+	    return $self->maybe_parens_func("delete",
+					$self->pp_aslice($op->first, 16),
+					$cx, 16);
+	}
+	return $self->maybe_parens_func("delete",
+					$self->pp_hslice($op->first, 16),
+					$cx, 16);
+    } else {
+	if ($op->flags & OPf_SPECIAL) {
+	    # Deleting from an array, not a hash
+	    return $self->maybe_parens_func("delete",
+					$self->pp_aelem($op->first, 16),
+					$cx, 16);
+	}
+	return $self->maybe_parens_func("delete",
+					$self->pp_helem($op->first, 16),
+					$cx, 16);
+    }
+}
+
+sub pp_require {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $opname = $op->flags & OPf_SPECIAL ? 'CORE::require' : 'require';
+    if (class($op) eq "UNOP" and $op->first->name eq "const"
+	and $op->first->private & OPpCONST_BARE)
+    {
+	my $name = $self->const_sv($op->first)->PV;
+	$name =~ s[/][::]g;
+	$name =~ s/\.pm//g;
+	return "$opname $name";
+    } else {	
+	$self->unop($op, $cx, $opname);
+    }
+}
+
+sub pp_scalar {
+    my $self = shift;
+    my($op, $cv) = @_;
+    my $kid = $op->first;
+    if (not null $kid->sibling) {
+	# XXX Was a here-doc
+	return $self->dquote($op);
+    }
+    $self->unop(@_, "scalar");
+}
+
+
+sub padval {
+    my $self = shift;
+    my $targ = shift;
+    return $self->{'curcv'}->PADLIST->ARRAYelt(1)->ARRAYelt($targ);
+}
+
+sub pp_refgen {
+    my $self = shift;	
+    my($op, $cx) = @_;
+    my $kid = $op->first;
+    if ($kid->name eq "null") {
+	$kid = $kid->first;
+	if ($kid->name eq "anonlist" || $kid->name eq "anonhash") {
+	    my($pre, $post) = @{{"anonlist" => ["[","]"],
+				 "anonhash" => ["{","}"]}->{$kid->name}};
+	    my($expr, @exprs);
+	    $kid = $kid->first->sibling; # skip pushmark
+	    for (; !null($kid); $kid = $kid->sibling) {
+		$expr = $self->deparse($kid, 6);
+		push @exprs, $expr;
+	    }
+	    return $pre . join(", ", @exprs) . $post;
+	} elsif (!null($kid->sibling) and
+		 $kid->sibling->name eq "anoncode") {
+	    return "sub " .
+		$self->deparse_sub($self->padval($kid->sibling->targ));
+	} elsif ($kid->name eq "pushmark") {
+            my $sib_name = $kid->sibling->name;
+            if ($sib_name =~ /^(pad|rv2)[ah]v$/
+                and not $kid->sibling->flags & OPf_REF)
+            {
+                # The @a in \(@a) isn't in ref context, but only when the
+                # parens are there.
+		return "\\(" . $self->pp_list($op->first) . ")";
+            } elsif ($sib_name eq 'entersub') {
+                my $text = $self->deparse($kid->sibling, 1);
+                # Always show parens for \(&func()), but only with -p otherwise
+                $text = "($text)" if $self->{'parens'}
+                                 or $kid->sibling->private & OPpENTERSUB_AMPER;
+                return "\\$text";
+            }
+        }
+    }
+    $self->pfixop($op, $cx, "\\", 20);
+}
+
+sub pp_srefgen { pp_refgen(@_) }
+
+sub pp_readline {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $kid = $op->first;
+    $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh>
+    return "<" . $self->deparse($kid, 1) . ">" if is_scalar($kid);
+    return $self->unop($op, $cx, "readline");
+}
+
+sub pp_rcatline {
+    my $self = shift;
+    my($op) = @_;
+    return "<" . $self->gv_name($self->gv_or_padgv($op)) . ">";
+}
+
+# Unary operators that can occur as pseudo-listops inside double quotes
+sub dq_unop {
+    my $self = shift;
+    my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
+    my $kid;
+    if ($op->flags & OPf_KIDS) {
+       $kid = $op->first;
+       # If there's more than one kid, the first is an ex-pushmark.
+       $kid = $kid->sibling if not null $kid->sibling;
+       return $self->maybe_parens_unop($name, $kid, $cx);
+    } else {
+       return $name .  ($op->flags & OPf_SPECIAL ? "()" : "");
+    }
+}
+
+sub pp_ucfirst { dq_unop(@_, "ucfirst") }
+sub pp_lcfirst { dq_unop(@_, "lcfirst") }
+sub pp_uc { dq_unop(@_, "uc") }
+sub pp_lc { dq_unop(@_, "lc") }
+sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
+
+sub loopex {
+    my $self = shift;
+    my ($op, $cx, $name) = @_;
+    if (class($op) eq "PVOP") {
+	return "$name " . $op->pv;
+    } elsif (class($op) eq "OP") {
+	return $name;
+    } elsif (class($op) eq "UNOP") {
+	# Note -- loop exits are actually exempt from the
+	# looks-like-a-func rule, but a few extra parens won't hurt
+	return $self->maybe_parens_unop($name, $op->first, $cx);
+    }
+}
+
+sub pp_last { loopex(@_, "last") }
+sub pp_next { loopex(@_, "next") }
+sub pp_redo { loopex(@_, "redo") }
+sub pp_goto { loopex(@_, "goto") }
+sub pp_dump { loopex(@_, "dump") }
+
+sub ftst {
+    my $self = shift;
+    my($op, $cx, $name) = @_;
+    if (class($op) eq "UNOP") {
+	# Genuine `-X' filetests are exempt from the LLAFR, but not
+	# l?stat(); for the sake of clarity, give'em all parens
+	return $self->maybe_parens_unop($name, $op->first, $cx);
+    } elsif (class($op) =~ /^(SV|PAD)OP$/) {
+	return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
+    } else { # I don't think baseop filetests ever survive ck_ftst, but...
+	return $name;
+    }
+}
+
+sub pp_lstat    { ftst(@_, "lstat") }
+sub pp_stat     { ftst(@_, "stat") }
+sub pp_ftrread  { ftst(@_, "-R") }
+sub pp_ftrwrite { ftst(@_, "-W") }
+sub pp_ftrexec  { ftst(@_, "-X") }
+sub pp_fteread  { ftst(@_, "-r") }
+sub pp_ftewrite { ftst(@_, "-w") }
+sub pp_fteexec  { ftst(@_, "-x") }
+sub pp_ftis     { ftst(@_, "-e") }
+sub pp_fteowned { ftst(@_, "-O") }
+sub pp_ftrowned { ftst(@_, "-o") }
+sub pp_ftzero   { ftst(@_, "-z") }
+sub pp_ftsize   { ftst(@_, "-s") }
+sub pp_ftmtime  { ftst(@_, "-M") }
+sub pp_ftatime  { ftst(@_, "-A") }
+sub pp_ftctime  { ftst(@_, "-C") }
+sub pp_ftsock   { ftst(@_, "-S") }
+sub pp_ftchr    { ftst(@_, "-c") }
+sub pp_ftblk    { ftst(@_, "-b") }
+sub pp_ftfile   { ftst(@_, "-f") }
+sub pp_ftdir    { ftst(@_, "-d") }
+sub pp_ftpipe   { ftst(@_, "-p") }
+sub pp_ftlink   { ftst(@_, "-l") }
+sub pp_ftsuid   { ftst(@_, "-u") }
+sub pp_ftsgid   { ftst(@_, "-g") }
+sub pp_ftsvtx   { ftst(@_, "-k") }
+sub pp_fttty    { ftst(@_, "-t") }
+sub pp_fttext   { ftst(@_, "-T") }
+sub pp_ftbinary { ftst(@_, "-B") }
+
+sub SWAP_CHILDREN () { 1 }
+sub ASSIGN () { 2 } # has OP= variant
+sub LIST_CONTEXT () { 4 } # Assignment is in list context
+
+my(%left, %right);
+
+sub assoc_class {
+    my $op = shift;
+    my $name = $op->name;
+    if ($name eq "concat" and $op->first->name eq "concat") {
+	# avoid spurious `=' -- see comment in pp_concat
+	return "concat";
+    }
+    if ($name eq "null" and class($op) eq "UNOP"
+	and $op->first->name =~ /^(and|x?or)$/
+	and null $op->first->sibling)
+    {
+	# Like all conditional constructs, OP_ANDs and OP_ORs are topped
+	# with a null that's used as the common end point of the two
+	# flows of control. For precedence purposes, ignore it.
+	# (COND_EXPRs have these too, but we don't bother with
+	# their associativity).
+	return assoc_class($op->first);
+    }
+    return $name . ($op->flags & OPf_STACKED ? "=" : "");
+}
+
+# Left associative operators, like `+', for which
+# $a + $b + $c is equivalent to ($a + $b) + $c
+
+BEGIN {
+    %left = ('multiply' => 19, 'i_multiply' => 19,
+	     'divide' => 19, 'i_divide' => 19,
+	     'modulo' => 19, 'i_modulo' => 19,
+	     'repeat' => 19,
+	     'add' => 18, 'i_add' => 18,
+	     'subtract' => 18, 'i_subtract' => 18,
+	     'concat' => 18,
+	     'left_shift' => 17, 'right_shift' => 17,
+	     'bit_and' => 13,
+	     'bit_or' => 12, 'bit_xor' => 12,
+	     'and' => 3,
+	     'or' => 2, 'xor' => 2,
+	    );
+}
+
+sub deparse_binop_left {
+    my $self = shift;
+    my($op, $left, $prec) = @_;
+    if ($left{assoc_class($op)} && $left{assoc_class($left)}
+	and $left{assoc_class($op)} == $left{assoc_class($left)})
+    {
+	return $self->deparse($left, $prec - .00001);
+    } else {
+	return $self->deparse($left, $prec);	
+    }
+}
+
+# Right associative operators, like `=', for which
+# $a = $b = $c is equivalent to $a = ($b = $c)
+
+BEGIN {
+    %right = ('pow' => 22,
+	      'sassign=' => 7, 'aassign=' => 7,
+	      'multiply=' => 7, 'i_multiply=' => 7,
+	      'divide=' => 7, 'i_divide=' => 7,
+	      'modulo=' => 7, 'i_modulo=' => 7,
+	      'repeat=' => 7,
+	      'add=' => 7, 'i_add=' => 7,
+	      'subtract=' => 7, 'i_subtract=' => 7,
+	      'concat=' => 7,
+	      'left_shift=' => 7, 'right_shift=' => 7,
+	      'bit_and=' => 7,
+	      'bit_or=' => 7, 'bit_xor=' => 7,
+	      'andassign' => 7,
+	      'orassign' => 7,
+	     );
+}
+
+sub deparse_binop_right {
+    my $self = shift;
+    my($op, $right, $prec) = @_;
+    if ($right{assoc_class($op)} && $right{assoc_class($right)}
+	and $right{assoc_class($op)} == $right{assoc_class($right)})
+    {
+	return $self->deparse($right, $prec - .00001);
+    } else {
+	return $self->deparse($right, $prec);	
+    }
+}
+
+sub binop {
+    my $self = shift;
+    my ($op, $cx, $opname, $prec, $flags) = (@_, 0);
+    my $left = $op->first;
+    my $right = $op->last;
+    my $eq = "";
+    if ($op->flags & OPf_STACKED && $flags & ASSIGN) {
+	$eq = "=";
+	$prec = 7;
+    }
+    if ($flags & SWAP_CHILDREN) {
+	($left, $right) = ($right, $left);
+    }
+    $left = $self->deparse_binop_left($op, $left, $prec);
+    $left = "($left)" if $flags & LIST_CONTEXT
+		&& $left !~ /^(my|our|local|)[\@\(]/;
+    $right = $self->deparse_binop_right($op, $right, $prec);
+    return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
+}
+
+sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
+sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
+sub pp_subtract { maybe_targmy(@_, \&binop, "-",18,  ASSIGN) }
+sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
+sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
+sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
+sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
+sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
+sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
+sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
+sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
+
+sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
+sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
+sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
+sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
+sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
+
+sub pp_eq { binop(@_, "==", 14) }
+sub pp_ne { binop(@_, "!=", 14) }
+sub pp_lt { binop(@_, "<", 15) }
+sub pp_gt { binop(@_, ">", 15) }
+sub pp_ge { binop(@_, ">=", 15) }
+sub pp_le { binop(@_, "<=", 15) }
+sub pp_ncmp { binop(@_, "<=>", 14) }
+sub pp_i_eq { binop(@_, "==", 14) }
+sub pp_i_ne { binop(@_, "!=", 14) }
+sub pp_i_lt { binop(@_, "<", 15) }
+sub pp_i_gt { binop(@_, ">", 15) }
+sub pp_i_ge { binop(@_, ">=", 15) }
+sub pp_i_le { binop(@_, "<=", 15) }
+sub pp_i_ncmp { binop(@_, "<=>", 14) }
+
+sub pp_seq { binop(@_, "eq", 14) }
+sub pp_sne { binop(@_, "ne", 14) }
+sub pp_slt { binop(@_, "lt", 15) }
+sub pp_sgt { binop(@_, "gt", 15) }
+sub pp_sge { binop(@_, "ge", 15) }
+sub pp_sle { binop(@_, "le", 15) }
+sub pp_scmp { binop(@_, "cmp", 14) }
+
+sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
+sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
+
+# `.' is special because concats-of-concats are optimized to save copying
+# by making all but the first concat stacked. The effect is as if the
+# programmer had written `($a . $b) .= $c', except legal.
+sub pp_concat { maybe_targmy(@_, \&real_concat) }
+sub real_concat {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $left = $op->first;
+    my $right = $op->last;
+    my $eq = "";
+    my $prec = 18;
+    if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
+	$eq = "=";
+	$prec = 7;
+    }
+    $left = $self->deparse_binop_left($op, $left, $prec);
+    $right = $self->deparse_binop_right($op, $right, $prec);
+    return $self->maybe_parens("$left .$eq $right", $cx, $prec);
+}
+
+# `x' is weird when the left arg is a list
+sub pp_repeat {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $left = $op->first;
+    my $right = $op->last;
+    my $eq = "";
+    my $prec = 19;
+    if ($op->flags & OPf_STACKED) {
+	$eq = "=";
+	$prec = 7;
+    }
+    if (null($right)) { # list repeat; count is inside left-side ex-list
+	my $kid = $left->first->sibling; # skip pushmark
+	my @exprs;
+	for (; !null($kid->sibling); $kid = $kid->sibling) {
+	    push @exprs, $self->deparse($kid, 6);
+	}
+	$right = $kid;
+	$left = "(" . join(", ", @exprs). ")";
+    } else {
+	$left = $self->deparse_binop_left($op, $left, $prec);
+    }
+    $right = $self->deparse_binop_right($op, $right, $prec);
+    return $self->maybe_parens("$left x$eq $right", $cx, $prec);
+}
+
+sub range {
+    my $self = shift;
+    my ($op, $cx, $type) = @_;
+    my $left = $op->first;
+    my $right = $left->sibling;
+    $left = $self->deparse($left, 9);
+    $right = $self->deparse($right, 9);
+    return $self->maybe_parens("$left $type $right", $cx, 9);
+}
+
+sub pp_flop {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $flip = $op->first;
+    my $type = ($flip->flags & OPf_SPECIAL) ? "..." : "..";
+    return $self->range($flip->first, $cx, $type);
+}
+
+# one-line while/until is handled in pp_leave
+
+sub logop {
+    my $self = shift;
+    my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
+    my $left = $op->first;
+    my $right = $op->first->sibling;
+    if ($cx < 1 and is_scope($right) and $blockname
+	and $self->{'expand'} < 7)
+    { # if ($a) {$b}
+	$left = $self->deparse($left, 1);
+	$right = $self->deparse($right, 0);
+	return "$blockname ($left) {\n\t$right\n\b}\cK";
+    } elsif ($cx < 1 and $blockname and not $self->{'parens'}
+	     and $self->{'expand'} < 7) { # $b if $a
+	$right = $self->deparse($right, 1);
+	$left = $self->deparse($left, 1);
+	return "$right $blockname $left";
+    } elsif ($cx > $lowprec and $highop) { # $a && $b
+	$left = $self->deparse_binop_left($op, $left, $highprec);
+	$right = $self->deparse_binop_right($op, $right, $highprec);
+	return $self->maybe_parens("$left $highop $right", $cx, $highprec);
+    } else { # $a and $b
+	$left = $self->deparse_binop_left($op, $left, $lowprec);
+	$right = $self->deparse_binop_right($op, $right, $lowprec);
+	return $self->maybe_parens("$left $lowop $right", $cx, $lowprec);
+    }
+}
+
+sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
+sub pp_or  { logop(@_, "or",  2, "||", 10, "unless") }
+sub pp_dor { logop(@_, "err", 2, "//", 10, "") }
+
+# xor is syntactically a logop, but it's really a binop (contrary to
+# old versions of opcode.pl). Syntax is what matters here.
+sub pp_xor { logop(@_, "xor", 2, "",   0,  "") }
+
+sub logassignop {
+    my $self = shift;
+    my ($op, $cx, $opname) = @_;
+    my $left = $op->first;
+    my $right = $op->first->sibling->first; # skip sassign
+    $left = $self->deparse($left, 7);
+    $right = $self->deparse($right, 7);
+    return $self->maybe_parens("$left $opname $right", $cx, 7);
+}
+
+sub pp_andassign { logassignop(@_, "&&=") }
+sub pp_orassign  { logassignop(@_, "||=") }
+sub pp_dorassign { logassignop(@_, "//=") }
+
+sub listop {
+    my $self = shift;
+    my($op, $cx, $name) = @_;
+    my(@exprs);
+    my $parens = ($cx >= 5) || $self->{'parens'};
+    my $kid = $op->first->sibling;
+    return $name if null $kid;
+    my $first;
+    $name = "socketpair" if $name eq "sockpair";
+    my $proto = prototype("CORE::$name");
+    if (defined $proto
+	&& $proto =~ /^;?\*/
+	&& $kid->name eq "rv2gv") {
+	$first = $self->deparse($kid->first, 6);
+    }
+    else {
+	$first = $self->deparse($kid, 6);
+    }
+    if ($name eq "chmod" && $first =~ /^\d+$/) {
+	$first = sprintf("%#o", $first);
+    }
+    $first = "+$first" if not $parens and substr($first, 0, 1) eq "(";
+    push @exprs, $first;
+    $kid = $kid->sibling;
+    if (defined $proto && $proto =~ /^\*\*/ && $kid->name eq "rv2gv") {
+	push @exprs, $self->deparse($kid->first, 6);
+	$kid = $kid->sibling;
+    }
+    for (; !null($kid); $kid = $kid->sibling) {
+	push @exprs, $self->deparse($kid, 6);
+    }
+    if ($parens) {
+	return "$name(" . join(", ", @exprs) . ")";
+    } else {
+	return "$name " . join(", ", @exprs);
+    }
+}
+
+sub pp_bless { listop(@_, "bless") }
+sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
+sub pp_substr { maybe_local(@_, listop(@_, "substr")) }
+sub pp_vec { maybe_local(@_, listop(@_, "vec")) }
+sub pp_index { maybe_targmy(@_, \&listop, "index") }
+sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
+sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
+sub pp_formline { listop(@_, "formline") } # see also deparse_format
+sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
+sub pp_unpack { listop(@_, "unpack") }
+sub pp_pack { listop(@_, "pack") }
+sub pp_join { maybe_targmy(@_, \&listop, "join") }
+sub pp_splice { listop(@_, "splice") }
+sub pp_push { maybe_targmy(@_, \&listop, "push") }
+sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
+sub pp_reverse { listop(@_, "reverse") }
+sub pp_warn { listop(@_, "warn") }
+sub pp_die { listop(@_, "die") }
+# Actually, return is exempt from the LLAFR (see examples in this very
+# module!), but for consistency's sake, ignore that fact
+sub pp_return { listop(@_, "return") }
+sub pp_open { listop(@_, "open") }
+sub pp_pipe_op { listop(@_, "pipe") }
+sub pp_tie { listop(@_, "tie") }
+sub pp_binmode { listop(@_, "binmode") }
+sub pp_dbmopen { listop(@_, "dbmopen") }
+sub pp_sselect { listop(@_, "select") }
+sub pp_select { listop(@_, "select") }
+sub pp_read { listop(@_, "read") }
+sub pp_sysopen { listop(@_, "sysopen") }
+sub pp_sysseek { listop(@_, "sysseek") }
+sub pp_sysread { listop(@_, "sysread") }
+sub pp_syswrite { listop(@_, "syswrite") }
+sub pp_send { listop(@_, "send") }
+sub pp_recv { listop(@_, "recv") }
+sub pp_seek { listop(@_, "seek") }
+sub pp_fcntl { listop(@_, "fcntl") }
+sub pp_ioctl { listop(@_, "ioctl") }
+sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
+sub pp_socket { listop(@_, "socket") }
+sub pp_sockpair { listop(@_, "sockpair") }
+sub pp_bind { listop(@_, "bind") }
+sub pp_connect { listop(@_, "connect") }
+sub pp_listen { listop(@_, "listen") }
+sub pp_accept { listop(@_, "accept") }
+sub pp_shutdown { listop(@_, "shutdown") }
+sub pp_gsockopt { listop(@_, "getsockopt") }
+sub pp_ssockopt { listop(@_, "setsockopt") }
+sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
+sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
+sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
+sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
+sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
+sub pp_link { maybe_targmy(@_, \&listop, "link") }
+sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
+sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
+sub pp_open_dir { listop(@_, "opendir") }
+sub pp_seekdir { listop(@_, "seekdir") }
+sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
+sub pp_system { maybe_targmy(@_, \&listop, "system") }
+sub pp_exec { maybe_targmy(@_, \&listop, "exec") }
+sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
+sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
+sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
+sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
+sub pp_shmget { listop(@_, "shmget") }
+sub pp_shmctl { listop(@_, "shmctl") }
+sub pp_shmread { listop(@_, "shmread") }
+sub pp_shmwrite { listop(@_, "shmwrite") }
+sub pp_msgget { listop(@_, "msgget") }
+sub pp_msgctl { listop(@_, "msgctl") }
+sub pp_msgsnd { listop(@_, "msgsnd") }
+sub pp_msgrcv { listop(@_, "msgrcv") }
+sub pp_semget { listop(@_, "semget") }
+sub pp_semctl { listop(@_, "semctl") }
+sub pp_semop { listop(@_, "semop") }
+sub pp_ghbyaddr { listop(@_, "gethostbyaddr") }
+sub pp_gnbyaddr { listop(@_, "getnetbyaddr") }
+sub pp_gpbynumber { listop(@_, "getprotobynumber") }
+sub pp_gsbyname { listop(@_, "getservbyname") }
+sub pp_gsbyport { listop(@_, "getservbyport") }
+sub pp_syscall { listop(@_, "syscall") }
+
+sub pp_glob {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $text = $self->dq($op->first->sibling);  # skip pushmark
+    if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline
+	or $text =~ /[<>]/) {
+	return 'glob(' . single_delim('qq', '"', $text) . ')';
+    } else {
+	return '<' . $text . '>';
+    }
+}
+
+# Truncate is special because OPf_SPECIAL makes a bareword first arg
+# be a filehandle. This could probably be better fixed in the core
+# by moving the GV lookup into ck_truc.
+
+sub pp_truncate {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my(@exprs);
+    my $parens = ($cx >= 5) || $self->{'parens'};
+    my $kid = $op->first->sibling;
+    my $fh;
+    if ($op->flags & OPf_SPECIAL) {
+	# $kid is an OP_CONST
+	$fh = $self->const_sv($kid)->PV;
+    } else {
+	$fh = $self->deparse($kid, 6);
+        $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
+    }
+    my $len = $self->deparse($kid->sibling, 6);
+    if ($parens) {
+	return "truncate($fh, $len)";
+    } else {
+	return "truncate $fh, $len";
+    }
+}
+
+sub indirop {
+    my $self = shift;
+    my($op, $cx, $name) = @_;
+    my($expr, @exprs);
+    my $kid = $op->first->sibling;
+    my $indir = "";
+    if ($op->flags & OPf_STACKED) {
+	$indir = $kid;
+	$indir = $indir->first; # skip rv2gv
+	if (is_scope($indir)) {
+	    $indir = "{" . $self->deparse($indir, 0) . "}";
+	    $indir = "{;}" if $indir eq "{}";
+	} elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) {
+	    $indir = $self->const_sv($indir)->PV;
+	} else {
+	    $indir = $self->deparse($indir, 24);
+	}
+	$indir = $indir . " ";
+	$kid = $kid->sibling;
+    }
+    if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) {
+	$indir = ($op->private & OPpSORT_DESCEND) ? '{$b <=> $a} '
+						  : '{$a <=> $b} ';
+    }
+    elsif ($name eq "sort" && $op->private & OPpSORT_DESCEND) {
+	$indir = '{$b cmp $a} ';
+    }
+    for (; !null($kid); $kid = $kid->sibling) {
+	$expr = $self->deparse($kid, 6);
+	push @exprs, $expr;
+    }
+    my $name2 = $name;
+    if ($name eq "sort" && $op->private & OPpSORT_REVERSE) {
+	$name2 = 'reverse sort';
+    }
+    if ($name eq "sort" && ($op->private & OPpSORT_INPLACE)) {
+	return "$exprs[0] = $name2 $indir $exprs[0]";
+    }
+
+    my $args = $indir . join(", ", @exprs);
+    if ($indir ne "" and $name eq "sort") {
+	# We don't want to say "sort(f 1, 2, 3)", since perl -w will
+	# give bareword warnings in that case. Therefore if context
+	# requires, we'll put parens around the outside "(sort f 1, 2,
+	# 3)". Unfortunately, we'll currently think the parens are
+	# necessary more often that they really are, because we don't
+	# distinguish which side of an assignment we're on.
+	if ($cx >= 5) {
+	    return "($name2 $args)";
+	} else {
+	    return "$name2 $args";
+	}
+    } else {
+	return $self->maybe_parens_func($name2, $args, $cx, 5);
+    }
+
+}
+
+sub pp_prtf { indirop(@_, "printf") }
+sub pp_print { indirop(@_, "print") }
+sub pp_sort { indirop(@_, "sort") }
+
+sub mapop {
+    my $self = shift;
+    my($op, $cx, $name) = @_;
+    my($expr, @exprs);
+    my $kid = $op->first; # this is the (map|grep)start
+    $kid = $kid->first->sibling; # skip a pushmark
+    my $code = $kid->first; # skip a null
+    if (is_scope $code) {
+	$code = "{" . $self->deparse($code, 0) . "} ";
+    } else {
+	$code = $self->deparse($code, 24) . ", ";
+    }
+    $kid = $kid->sibling;
+    for (; !null($kid); $kid = $kid->sibling) {
+	$expr = $self->deparse($kid, 6);
+	push @exprs, $expr if defined $expr;
+    }
+    return $self->maybe_parens_func($name, $code . join(", ", @exprs), $cx, 5);
+}
+
+sub pp_mapwhile { mapop(@_, "map") }
+sub pp_grepwhile { mapop(@_, "grep") }
+sub pp_mapstart { baseop(@_, "map") }
+sub pp_grepstart { baseop(@_, "grep") }
+
+sub pp_list {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my($expr, @exprs);
+    my $kid = $op->first->sibling; # skip pushmark
+    my $lop;
+    my $local = "either"; # could be local(...), my(...) or our(...)
+    for ($lop = $kid; !null($lop); $lop = $lop->sibling) {
+	# This assumes that no other private flags equal 128, and that
+	# OPs that store things other than flags in their op_private,
+	# like OP_AELEMFAST, won't be immediate children of a list.
+	#
+	# OP_ENTERSUB can break this logic, so check for it.
+	# I suspect that open and exit can too.
+
+	if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO)
+		or $lop->name eq "undef")
+	    or $lop->name eq "entersub"
+	    or $lop->name eq "exit"
+	    or $lop->name eq "open")
+	{
+	    $local = ""; # or not
+	    last;
+	}
+	if ($lop->name =~ /^pad[ash]v$/) { # my()
+	    ($local = "", last) if $local eq "local" || $local eq "our";
+	    $local = "my";
+	} elsif ($lop->name =~ /^(gv|rv2)[ash]v$/
+			&& $lop->private & OPpOUR_INTRO
+		or $lop->name eq "null" && $lop->first->name eq "gvsv"
+			&& $lop->first->private & OPpOUR_INTRO) { # our()
+	    ($local = "", last) if $local eq "my" || $local eq "local";
+	    $local = "our";
+	} elsif ($lop->name ne "undef"
+		# specifically avoid the "reverse sort" optimisation,
+		# where "reverse" is nullified
+		&& !($lop->name eq 'sort' && ($lop->flags & OPpSORT_REVERSE)))
+	{
+	    # local()
+	    ($local = "", last) if $local eq "my" || $local eq "our";
+	    $local = "local";
+	}
+    }
+    $local = "" if $local eq "either"; # no point if it's all undefs
+    return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
+    for (; !null($kid); $kid = $kid->sibling) {
+	if ($local) {
+	    if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
+		$lop = $kid->first;
+	    } else {
+		$lop = $kid;
+	    }
+	    $self->{'avoid_local'}{$$lop}++;
+	    $expr = $self->deparse($kid, 6);
+	    delete $self->{'avoid_local'}{$$lop};
+	} else {
+	    $expr = $self->deparse($kid, 6);
+	}
+	push @exprs, $expr;
+    }
+    if ($local) {
+	return "$local(" . join(", ", @exprs) . ")";
+    } else {
+	return $self->maybe_parens( join(", ", @exprs), $cx, 6);	
+    }
+}
+
+sub is_ifelse_cont {
+    my $op = shift;
+    return ($op->name eq "null" and class($op) eq "UNOP"
+	    and $op->first->name =~ /^(and|cond_expr)$/
+	    and is_scope($op->first->first->sibling));
+}
+
+sub pp_cond_expr {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $cond = $op->first;
+    my $true = $cond->sibling;
+    my $false = $true->sibling;
+    my $cuddle = $self->{'cuddle'};
+    unless ($cx < 1 and (is_scope($true) and $true->name ne "null") and
+	    (is_scope($false) || is_ifelse_cont($false))
+	    and $self->{'expand'} < 7) {
+	$cond = $self->deparse($cond, 8);
+	$true = $self->deparse($true, 8);
+	$false = $self->deparse($false, 8);
+	return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
+    }
+
+    $cond = $self->deparse($cond, 1);
+    $true = $self->deparse($true, 0);
+    my $head = "if ($cond) {\n\t$true\n\b}";
+    my @elsifs;
+    while (!null($false) and is_ifelse_cont($false)) {
+	my $newop = $false->first;
+	my $newcond = $newop->first;
+	my $newtrue = $newcond->sibling;
+	$false = $newtrue->sibling; # last in chain is OP_AND => no else
+	$newcond = $self->deparse($newcond, 1);
+	$newtrue = $self->deparse($newtrue, 0);
+	push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}";
+    }
+    if (!null($false)) {
+	$false = $cuddle . "else {\n\t" .
+	  $self->deparse($false, 0) . "\n\b}\cK";
+    } else {
+	$false = "\cK";
+    }
+    return $head . join($cuddle, "", @elsifs) . $false;
+}
+
+sub loop_common {
+    my $self = shift;
+    my($op, $cx, $init) = @_;
+    my $enter = $op->first;
+    my $kid = $enter->sibling;
+    local(@$self{qw'curstash warnings hints'})
+		= @$self{qw'curstash warnings hints'};
+    my $head = "";
+    my $bare = 0;
+    my $body;
+    my $cond = undef;
+    if ($kid->name eq "lineseq") { # bare or infinite loop
+	if ($kid->last->name eq "unstack") { # infinite
+	    $head = "while (1) "; # Can't use for(;;) if there's a continue
+	    $cond = "";
+	} else {
+	    $bare = 1;
+	}
+	$body = $kid;
+    } elsif ($enter->name eq "enteriter") { # foreach
+	my $ary = $enter->first->sibling; # first was pushmark
+	my $var = $ary->sibling;
+	if ($ary->name eq 'null' and $enter->private & OPpITER_REVERSED) {
+	    # "reverse" was optimised away
+	    $ary = listop($self, $ary->first->sibling, 1, 'reverse');
+	} elsif ($enter->flags & OPf_STACKED
+	    and not null $ary->first->sibling->sibling)
+	{
+	    $ary = $self->deparse($ary->first->sibling, 9) . " .. " .
+	      $self->deparse($ary->first->sibling->sibling, 9);
+	} else {
+	    $ary = $self->deparse($ary, 1);
+	}
+	if (null $var) {
+	    if ($enter->flags & OPf_SPECIAL) { # thread special var
+		$var = $self->pp_threadsv($enter, 1);
+	    } else { # regular my() variable
+		$var = $self->pp_padsv($enter, 1);
+	    }
+	} elsif ($var->name eq "rv2gv") {
+	    $var = $self->pp_rv2sv($var, 1);
+	    if ($enter->private & OPpOUR_INTRO) {
+		# our declarations don't have package names
+		$var =~ s/^(.).*::/$1/;
+		$var = "our $var";
+	    }
+	} elsif ($var->name eq "gv") {
+	    $var = "\$" . $self->deparse($var, 1);
+	}
+	$body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
+	if (!is_state $body->first and $body->first->name ne "stub") {
+	    confess unless $var eq '$_';
+	    $body = $body->first;
+	    return $self->deparse($body, 2) . " foreach ($ary)";
+	}
+	$head = "foreach $var ($ary) ";
+    } elsif ($kid->name eq "null") { # while/until
+	$kid = $kid->first;
+	my $name = {"and" => "while", "or" => "until"}->{$kid->name};
+	$cond = $self->deparse($kid->first, 1);
+	$head = "$name ($cond) ";
+	$body = $kid->first->sibling;
+    } elsif ($kid->name eq "stub") { # bare and empty
+	return "{;}"; # {} could be a hashref
+    }
+    # If there isn't a continue block, then the next pointer for the loop
+    # will point to the unstack, which is kid's last child, except
+    # in a bare loop, when it will point to the leaveloop. When neither of
+    # these conditions hold, then the second-to-last child is the continue
+    # block (or the last in a bare loop).
+    my $cont_start = $enter->nextop;
+    my $cont;
+    if ($$cont_start != $$op && ${$cont_start} != ${$body->last}) {
+	if ($bare) {
+	    $cont = $body->last;
+	} else {
+	    $cont = $body->first;
+	    while (!null($cont->sibling->sibling)) {
+		$cont = $cont->sibling;
+	    }
+	}
+	my $state = $body->first;
+	my $cuddle = $self->{'cuddle'};
+	my @states;
+	for (; $$state != $$cont; $state = $state->sibling) {
+	    push @states, $state;
+	}
+	$body = $self->lineseq(undef, @states);
+	if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
+	    $head = "for ($init; $cond; " . $self->deparse($cont, 1) .") ";
+	    $cont = "\cK";
+	} else {
+	    $cont = $cuddle . "continue {\n\t" .
+	      $self->deparse($cont, 0) . "\n\b}\cK";
+	}
+    } else {
+	return "" if !defined $body;
+	if (length $init) {
+	    $head = "for ($init; $cond;) ";
+	}
+	$cont = "\cK";
+	$body = $self->deparse($body, 0);
+    }
+    $body =~ s/;?$/;\n/;
+
+    return $head . "{\n\t" . $body . "\b}" . $cont;
+}
+
+sub pp_leaveloop { loop_common(@_, "") }
+
+sub for_loop {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $init = $self->deparse($op, 1);
+    return $self->loop_common($op->sibling->first->sibling, $cx, $init);
+}
+
+sub pp_leavetry {
+    my $self = shift;
+    return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
+}
+
+BEGIN { eval "sub OP_CONST () {" . opnumber("const") . "}" }
+BEGIN { eval "sub OP_STRINGIFY () {" . opnumber("stringify") . "}" }
+BEGIN { eval "sub OP_RV2SV () {" . opnumber("rv2sv") . "}" }
+BEGIN { eval "sub OP_LIST () {" . opnumber("list") . "}" }
+
+sub pp_null {
+    my $self = shift;
+    my($op, $cx) = @_;
+    if (class($op) eq "OP") {
+	# old value is lost
+	return $self->{'ex_const'} if $op->targ == OP_CONST;
+    } elsif ($op->first->name eq "pushmark") {
+	return $self->pp_list($op, $cx);
+    } elsif ($op->first->name eq "enter") {
+	return $self->pp_leave($op, $cx);
+    } elsif ($op->targ == OP_STRINGIFY) {
+	return $self->dquote($op, $cx);
+    } elsif (!null($op->first->sibling) and
+	     $op->first->sibling->name eq "readline" and
+	     $op->first->sibling->flags & OPf_STACKED) {
+	return $self->maybe_parens($self->deparse($op->first, 7) . " = "
+				   . $self->deparse($op->first->sibling, 7),
+				   $cx, 7);
+    } elsif (!null($op->first->sibling) and
+	     $op->first->sibling->name eq "trans" and
+	     $op->first->sibling->flags & OPf_STACKED) {
+	return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
+				   . $self->deparse($op->first->sibling, 20),
+				   $cx, 20);
+    } elsif ($op->flags & OPf_SPECIAL && $cx < 1 && !$op->targ) {
+	return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
+    } elsif (!null($op->first->sibling) and
+	     $op->first->sibling->name eq "null" and
+	     class($op->first->sibling) eq "UNOP" and
+	     $op->first->sibling->first->flags & OPf_STACKED and
+	     $op->first->sibling->first->name eq "rcatline") {
+	return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
+				   . $self->deparse($op->first->sibling, 18),
+				   $cx, 18);
+    } else {
+	return $self->deparse($op->first, $cx);
+    }
+}
+
+sub padname {
+    my $self = shift;
+    my $targ = shift;
+    return $self->padname_sv($targ)->PVX;
+}
+
+sub padany {
+    my $self = shift;
+    my $op = shift;
+    return substr($self->padname($op->targ), 1); # skip $/@/%
+}
+
+sub pp_padsv {
+    my $self = shift;
+    my($op, $cx) = @_;
+    return $self->maybe_my($op, $cx, $self->padname($op->targ));
+}
+
+sub pp_padav { pp_padsv(@_) }
+sub pp_padhv { pp_padsv(@_) }
+
+my @threadsv_names;
+
+BEGIN {
+    @threadsv_names = ("_", "1", "2", "3", "4", "5", "6", "7", "8", "9",
+		       "&", "`", "'", "+", "/", ".", ",", "\\", '"', ";",
+		       "^", "-", "%", "=", "|", "~", ":", "^A", "^E",
+		       "!", "@");
+}
+
+sub pp_threadsv {
+    my $self = shift;
+    my($op, $cx) = @_;
+    return $self->maybe_local($op, $cx, "\$" .  $threadsv_names[$op->targ]);
+}
+
+sub gv_or_padgv {
+    my $self = shift;
+    my $op = shift;
+    if (class($op) eq "PADOP") {
+	return $self->padval($op->padix);
+    } else { # class($op) eq "SVOP"
+	return $op->gv;
+    }
+}
+
+sub pp_gvsv {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $gv = $self->gv_or_padgv($op);
+    return $self->maybe_local($op, $cx, $self->stash_variable("\$",
+				 $self->gv_name($gv)));
+}
+
+sub pp_gv {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $gv = $self->gv_or_padgv($op);
+    return $self->gv_name($gv);
+}
+
+sub pp_aelemfast {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $name;
+    if ($op->flags & OPf_SPECIAL) { # optimised PADAV
+	$name = $self->padname($op->targ);
+	$name =~ s/^@/\$/;
+    }
+    else {
+	my $gv = $self->gv_or_padgv($op);
+	$name = $self->gv_name($gv);
+	$name = $self->{'curstash'}."::$name"
+	    if $name !~ /::/ && $self->lex_in_scope('@'.$name);
+	$name = '$' . $name;
+    }
+
+    return $name . "[" .  ($op->private + $self->{'arybase'}) . "]";
+}
+
+sub rv2x {
+    my $self = shift;
+    my($op, $cx, $type) = @_;
+
+    if (class($op) eq 'NULL' || !$op->can("first")) {
+	carp("Unexpected op in pp_rv2x");
+	return 'XXX';
+    }
+    my $kid = $op->first;
+    if ($kid->name eq "gv") {
+	return $self->stash_variable($type, $self->deparse($kid, 0));
+    } elsif (is_scalar $kid) {
+	my $str = $self->deparse($kid, 0);
+	if ($str =~ /^\$([^\w\d])\z/) {
+	    # "$$+" isn't a legal way to write the scalar dereference
+	    # of $+, since the lexer can't tell you aren't trying to
+	    # do something like "$$ + 1" to get one more than your
+	    # PID. Either "${$+}" or "$${+}" are workable
+	    # disambiguations, but if the programmer did the former,
+	    # they'd be in the "else" clause below rather than here.
+	    # It's not clear if this should somehow be unified with
+	    # the code in dq and re_dq that also adds lexer
+	    # disambiguation braces.
+	    $str = '$' . "{$1}"; #'
+	}
+	return $type . $str;
+    } else {
+	return $type . "{" . $self->deparse($kid, 0) . "}";
+    }
+}
+
+sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
+sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
+sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
+
+# skip rv2av
+sub pp_av2arylen {
+    my $self = shift;
+    my($op, $cx) = @_;
+    if ($op->first->name eq "padav") {
+	return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
+    } else {
+	return $self->maybe_local($op, $cx,
+				  $self->rv2x($op->first, $cx, '$#'));
+    }
+}
+
+# skip down to the old, ex-rv2cv
+sub pp_rv2cv {
+    my ($self, $op, $cx) = @_;
+    if (!null($op->first) && $op->first->name eq 'null' &&
+	$op->first->targ eq OP_LIST)
+    {
+	return $self->rv2x($op->first->first->sibling, $cx, "&")
+    }
+    else {
+	return $self->rv2x($op, $cx, "")
+    }
+}
+
+sub list_const {
+    my $self = shift;
+    my($cx, @list) = @_;
+    my @a = map $self->const($_, 6), @list;
+    if (@a == 0) {
+	return "()";
+    } elsif (@a == 1) {
+	return $a[0];
+    } elsif ( @a > 2 and !grep(!/^-?\d+$/, @a)) {
+	# collapse (-1,0,1,2) into (-1..2)
+	my ($s, $e) = @a[0,-1];
+	my $i = $s;
+	return $self->maybe_parens("$s..$e", $cx, 9)
+	  unless grep $i++ != $_, @a;
+    }
+    return $self->maybe_parens(join(", ", @a), $cx, 6);
+}
+
+sub pp_rv2av {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $kid = $op->first;
+    if ($kid->name eq "const") { # constant list
+	my $av = $self->const_sv($kid);
+	return $self->list_const($cx, $av->ARRAY);
+    } else {
+	return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
+    }
+ }
+
+sub is_subscriptable {
+    my $op = shift;
+    if ($op->name =~ /^[ahg]elem/) {
+	return 1;
+    } elsif ($op->name eq "entersub") {
+	my $kid = $op->first;
+	return 0 unless null $kid->sibling;
+	$kid = $kid->first;
+	$kid = $kid->sibling until null $kid->sibling;
+	return 0 if is_scope($kid);
+	$kid = $kid->first;
+	return 0 if $kid->name eq "gv";
+	return 0 if is_scalar($kid);
+	return is_subscriptable($kid);	
+    } else {
+	return 0;
+    }
+}
+
+sub elem {
+    my $self = shift;
+    my ($op, $cx, $left, $right, $padname) = @_;
+    my($array, $idx) = ($op->first, $op->first->sibling);
+    unless ($array->name eq $padname) { # Maybe this has been fixed	
+	$array = $array->first; # skip rv2av (or ex-rv2av in _53+)
+    }
+    if ($array->name eq $padname) {
+	$array = $self->padany($array);
+    } elsif (is_scope($array)) { # ${expr}[0]
+	$array = "{" . $self->deparse($array, 0) . "}";
+    } elsif ($array->name eq "gv") {
+	$array = $self->gv_name($self->gv_or_padgv($array));
+	if ($array !~ /::/) {
+	    my $prefix = ($left eq '[' ? '@' : '%');
+	    $array = $self->{curstash}.'::'.$array
+		if $self->lex_in_scope($prefix . $array);
+	}
+    } elsif (is_scalar $array) { # $x[0], $$x[0], ...
+	$array = $self->deparse($array, 24);
+    } else {
+	# $x[20][3]{hi} or expr->[20]
+	my $arrow = is_subscriptable($array) ? "" : "->";
+	return $self->deparse($array, 24) . $arrow .
+	    $left . $self->deparse($idx, 1) . $right;
+    }
+    $idx = $self->deparse($idx, 1);
+
+    # Outer parens in an array index will confuse perl
+    # if we're interpolating in a regular expression, i.e.
+    # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
+    #
+    # If $self->{parens}, then an initial '(' will
+    # definitely be paired with a final ')'. If
+    # !$self->{parens}, the misleading parens won't
+    # have been added in the first place.
+    #
+    # [You might think that we could get "(...)...(...)"
+    # where the initial and final parens do not match
+    # each other. But we can't, because the above would
+    # only happen if there's an infix binop between the
+    # two pairs of parens, and *that* means that the whole
+    # expression would be parenthesized as well.]
+    #
+    $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
+
+    # Hash-element braces will autoquote a bareword inside themselves.
+    # We need to make sure that C<$hash{warn()}> doesn't come out as
+    # C<$hash{warn}>, which has a quite different meaning. Currently
+    # B::Deparse will always quote strings, even if the string was a
+    # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
+    # for constant strings.) So we can cheat slightly here - if we see
+    # a bareword, we know that it is supposed to be a function call.
+    #
+    $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
+
+    return "\$" . $array . $left . $idx . $right;
+}
+
+sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
+sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
+
+sub pp_gelem {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my($glob, $part) = ($op->first, $op->last);
+    $glob = $glob->first; # skip rv2gv
+    $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
+    my $scope = is_scope($glob);
+    $glob = $self->deparse($glob, 0);
+    $part = $self->deparse($part, 1);
+    return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
+}
+
+sub slice {
+    my $self = shift;
+    my ($op, $cx, $left, $right, $regname, $padname) = @_;
+    my $last;
+    my(@elems, $kid, $array, $list);
+    if (class($op) eq "LISTOP") {
+	$last = $op->last;
+    } else { # ex-hslice inside delete()
+	for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
+	$last = $kid;
+    }
+    $array = $last;
+    $array = $array->first
+	if $array->name eq $regname or $array->name eq "null";
+    if (is_scope($array)) {
+	$array = "{" . $self->deparse($array, 0) . "}";
+    } elsif ($array->name eq $padname) {
+	$array = $self->padany($array);
+    } else {
+	$array = $self->deparse($array, 24);
+    }
+    $kid = $op->first->sibling; # skip pushmark
+    if ($kid->name eq "list") {
+	$kid = $kid->first->sibling; # skip list, pushmark
+	for (; !null $kid; $kid = $kid->sibling) {
+	    push @elems, $self->deparse($kid, 6);
+	}
+	$list = join(", ", @elems);
+    } else {
+	$list = $self->deparse($kid, 1);
+    }
+    return "\@" . $array . $left . $list . $right;
+}
+
+sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
+sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
+
+sub pp_lslice {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $idx = $op->first;
+    my $list = $op->last;
+    my(@elems, $kid);
+    $list = $self->deparse($list, 1);
+    $idx = $self->deparse($idx, 1);
+    return "($list)" . "[$idx]";
+}
+
+sub want_scalar {
+    my $op = shift;
+    return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
+}
+
+sub want_list {
+    my $op = shift;
+    return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
+}
+
+sub method {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $kid = $op->first->sibling; # skip pushmark
+    my($meth, $obj, @exprs);
+    if ($kid->name eq "list" and want_list $kid) {
+	# When an indirect object isn't a bareword but the args are in
+	# parens, the parens aren't part of the method syntax (the LLAFR
+	# doesn't apply), but they make a list with OPf_PARENS set that
+	# doesn't get flattened by the append_elem that adds the method,
+	# making a (object, arg1, arg2, ...) list where the object
+	# usually is. This can be distinguished from
+	# `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
+	# object) because in the later the list is in scalar context
+	# as the left side of -> always is, while in the former
+	# the list is in list context as method arguments always are.
+	# (Good thing there aren't method prototypes!)
+	$meth = $kid->sibling;
+	$kid = $kid->first->sibling; # skip pushmark
+	$obj = $kid;
+	$kid = $kid->sibling;
+	for (; not null $kid; $kid = $kid->sibling) {
+	    push @exprs, $self->deparse($kid, 6);
+	}
+    } else {
+	$obj = $kid;
+	$kid = $kid->sibling;
+	for (; !null ($kid->sibling) && $kid->name ne "method_named";
+	      $kid = $kid->sibling) {
+	    push @exprs, $self->deparse($kid, 6);
+	}
+	$meth = $kid;
+    }
+    $obj = $self->deparse($obj, 24);
+    if ($meth->name eq "method_named") {
+	$meth = $self->const_sv($meth)->PV;
+    } else {
+	$meth = $meth->first;
+	if ($meth->name eq "const") {
+	    # As of 5.005_58, this case is probably obsoleted by the
+	    # method_named case above
+	    $meth = $self->const_sv($meth)->PV; # needs to be bare
+	} else {
+	    $meth = $self->deparse($meth, 1);
+	}
+    }
+    my $args = join(", ", @exprs);	
+    $kid = $obj . "->" . $meth;
+    if (length $args) {
+	return $kid . "(" . $args . ")"; # parens mandatory
+    } else {
+	return $kid;
+    }
+}
+
+# returns "&" if the prototype doesn't match the args,
+# or ("", $args_after_prototype_demunging) if it does.
+sub check_proto {
+    my $self = shift;
+    return "&" if $self->{'noproto'};
+    my($proto, @args) = @_;
+    my($arg, $real);
+    my $doneok = 0;
+    my @reals;
+    # An unbackslashed @ or % gobbles up the rest of the args
+    1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
+    while ($proto) {
+	$proto =~ s/^(\\?[\$\@&%*]|\\\[[\$\@&%*]+\]|;)//;
+	my $chr = $1;
+	if ($chr eq "") {
+	    return "&" if @args;
+	} elsif ($chr eq ";") {
+	    $doneok = 1;
+	} elsif ($chr eq "@" or $chr eq "%") {
+	    push @reals, map($self->deparse($_, 6), @args);
+	    @args = ();
+	} else {
+	    $arg = shift @args;
+	    last unless $arg;
+	    if ($chr eq "\$") {
+		if (want_scalar $arg) {
+		    push @reals, $self->deparse($arg, 6);
+		} else {
+		    return "&";
+		}
+	    } elsif ($chr eq "&") {
+		if ($arg->name =~ /^(s?refgen|undef)$/) {
+		    push @reals, $self->deparse($arg, 6);
+		} else {
+		    return "&";
+		}
+	    } elsif ($chr eq "*") {
+		if ($arg->name =~ /^s?refgen$/
+		    and $arg->first->first->name eq "rv2gv")
+		  {
+		      $real = $arg->first->first; # skip refgen, null
+		      if ($real->first->name eq "gv") {
+			  push @reals, $self->deparse($real, 6);
+		      } else {
+			  push @reals, $self->deparse($real->first, 6);
+		      }
+		  } else {
+		      return "&";
+		  }
+	    } elsif (substr($chr, 0, 1) eq "\\") {
+		$chr =~ tr/\\[]//d;
+		if ($arg->name =~ /^s?refgen$/ and
+		    !null($real = $arg->first) and
+		    ($chr =~ /\$/ && is_scalar($real->first)
+		     or ($chr =~ /@/
+			 && class($real->first->sibling) ne 'NULL'
+			 && $real->first->sibling->name
+			 =~ /^(rv2|pad)av$/)
+		     or ($chr =~ /%/
+			 && class($real->first->sibling) ne 'NULL'
+			 && $real->first->sibling->name
+			 =~ /^(rv2|pad)hv$/)
+		     #or ($chr =~ /&/ # This doesn't work
+		     #   && $real->first->name eq "rv2cv")
+		     or ($chr =~ /\*/
+			 && $real->first->name eq "rv2gv")))
+		  {
+		      push @reals, $self->deparse($real, 6);
+		  } else {
+		      return "&";
+		  }
+	    }
+       }
+    }
+    return "&" if $proto and !$doneok; # too few args and no `;'
+    return "&" if @args;               # too many args
+    return ("", join ", ", @reals);
+}
+
+sub pp_entersub {
+    my $self = shift;
+    my($op, $cx) = @_;
+    return $self->method($op, $cx) unless null $op->first->sibling;
+    my $prefix = "";
+    my $amper = "";
+    my($kid, @exprs);
+    if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
+	$prefix = "do ";
+    } elsif ($op->private & OPpENTERSUB_AMPER) {
+	$amper = "&";
+    }
+    $kid = $op->first;
+    $kid = $kid->first->sibling; # skip ex-list, pushmark
+    for (; not null $kid->sibling; $kid = $kid->sibling) {
+	push @exprs, $kid;
+    }
+    my $simple = 0;
+    my $proto = undef;
+    if (is_scope($kid)) {
+	$amper = "&";
+	$kid = "{" . $self->deparse($kid, 0) . "}";
+    } elsif ($kid->first->name eq "gv") {
+	my $gv = $self->gv_or_padgv($kid->first);
+	if (class($gv->CV) ne "SPECIAL") {
+	    $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
+	}
+	$simple = 1; # only calls of named functions can be prototyped
+	$kid = $self->deparse($kid, 24);
+    } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
+	$amper = "&";
+	$kid = $self->deparse($kid, 24);
+    } else {
+	$prefix = "";
+	my $arrow = is_subscriptable($kid->first) ? "" : "->";
+	$kid = $self->deparse($kid, 24) . $arrow;
+    }
+
+    # Doesn't matter how many prototypes there are, if
+    # they haven't happened yet!
+    my $declared;
+    {
+	no strict 'refs';
+	no warnings 'uninitialized';
+	$declared = exists $self->{'subs_declared'}{$kid}
+	    || (
+		 defined &{ ${$self->{'curstash'}."::"}{$kid} }
+		 && !exists
+		     $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
+		 && defined prototype $self->{'curstash'}."::".$kid
+	       );
+	if (!$declared && defined($proto)) {
+	    # Avoid "too early to check prototype" warning
+	    ($amper, $proto) = ('&');
+	}
+    }
+
+    my $args;
+    if ($declared and defined $proto and not $amper) {
+	($amper, $args) = $self->check_proto($proto, @exprs);
+	if ($amper eq "&") {
+	    $args = join(", ", map($self->deparse($_, 6), @exprs));
+	}
+    } else {
+	$args = join(", ", map($self->deparse($_, 6), @exprs));
+    }
+    if ($prefix or $amper) {
+	if ($op->flags & OPf_STACKED) {
+	    return $prefix . $amper . $kid . "(" . $args . ")";
+	} else {
+	    return $prefix . $amper. $kid;
+	}
+    } else {
+	# glob() invocations can be translated into calls of
+	# CORE::GLOBAL::glob with a second parameter, a number.
+	# Reverse this.
+	if ($kid eq "CORE::GLOBAL::glob") {
+	    $kid = "glob";
+	    $args =~ s/\s*,[^,]+$//;
+	}
+
+	# It's a syntax error to call CORE::GLOBAL::foo without a prefix,
+	# so it must have been translated from a keyword call. Translate
+	# it back.
+	$kid =~ s/^CORE::GLOBAL:://;
+
+	my $dproto = defined($proto) ? $proto : "undefined";
+        if (!$declared) {
+	    return "$kid(" . $args . ")";
+	} elsif ($dproto eq "") {
+	    return $kid;
+	} elsif ($dproto eq "\$" and is_scalar($exprs[0])) {
+	    # is_scalar is an excessively conservative test here:
+	    # really, we should be comparing to the precedence of the
+	    # top operator of $exprs[0] (ala unop()), but that would
+	    # take some major code restructuring to do right.
+	    return $self->maybe_parens_func($kid, $args, $cx, 16);
+	} elsif ($dproto ne '$' and defined($proto) || $simple) { #'
+	    return $self->maybe_parens_func($kid, $args, $cx, 5);
+	} else {
+	    return "$kid(" . $args . ")";
+	}
+    }
+}
+
+sub pp_enterwrite { unop(@_, "write") }
+
+# escape things that cause interpolation in double quotes,
+# but not character escapes
+sub uninterp {
+    my($str) = @_;
+    $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
+    return $str;
+}
+
+{
+my $bal;
+BEGIN {
+    use re "eval";
+    # Matches any string which is balanced with respect to {braces}
+    $bal = qr(
+      (?:
+	[^\\{}]
+      | \\\\
+      | \\[{}]
+      | \{(??{$bal})\}
+      )*
+    )x;
+}
+
+# the same, but treat $|, $), $( and $ at the end of the string differently
+sub re_uninterp {
+    my($str) = @_;
+
+    $str =~ s/
+	  ( ^|\G                  # $1
+          | [^\\]
+          )
+
+          (                       # $2
+            (?:\\\\)*
+          )
+
+          (                       # $3
+            (\(\?\??\{$bal\}\))   # $4
+          | [\$\@]
+            (?!\||\)|\(|$)
+          | \\[uUlLQE]
+          )
+
+	/defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
+
+    return $str;
+}
+
+# This is for regular expressions with the /x modifier
+# We have to leave comments unmangled.
+sub re_uninterp_extended {
+    my($str) = @_;
+
+    $str =~ s/
+	  ( ^|\G                  # $1
+          | [^\\]
+          )
+
+          (                       # $2
+            (?:\\\\)*
+          )
+
+          (                       # $3
+            ( \(\?\??\{$bal\}\)   # $4  (skip over (?{}) and (??{}) blocks)
+            | \#[^\n]*            #     (skip over comments)
+            )
+          | [\$\@]
+            (?!\||\)|\(|$|\s)
+          | \\[uUlLQE]
+          )
+
+	/defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
+
+    return $str;
+}
+}
+
+my %unctrl = # portable to to EBCDIC
+    (
+     "\c@" => '\c@',	# unused
+     "\cA" => '\cA',
+     "\cB" => '\cB',
+     "\cC" => '\cC',
+     "\cD" => '\cD',
+     "\cE" => '\cE',
+     "\cF" => '\cF',
+     "\cG" => '\cG',
+     "\cH" => '\cH',
+     "\cI" => '\cI',
+     "\cJ" => '\cJ',
+     "\cK" => '\cK',
+     "\cL" => '\cL',
+     "\cM" => '\cM',
+     "\cN" => '\cN',
+     "\cO" => '\cO',
+     "\cP" => '\cP',
+     "\cQ" => '\cQ',
+     "\cR" => '\cR',
+     "\cS" => '\cS',
+     "\cT" => '\cT',
+     "\cU" => '\cU',
+     "\cV" => '\cV',
+     "\cW" => '\cW',
+     "\cX" => '\cX',
+     "\cY" => '\cY',
+     "\cZ" => '\cZ',
+     "\c[" => '\c[',	# unused
+     "\c\\" => '\c\\',	# unused
+     "\c]" => '\c]',	# unused
+     "\c_" => '\c_',	# unused
+    );
+
+# character escapes, but not delimiters that might need to be escaped
+sub escape_str { # ASCII, UTF8
+    my($str) = @_;
+    $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
+    $str =~ s/\a/\\a/g;
+#    $str =~ s/\cH/\\b/g; # \b means something different in a regex
+    $str =~ s/\t/\\t/g;
+    $str =~ s/\n/\\n/g;
+    $str =~ s/\e/\\e/g;
+    $str =~ s/\f/\\f/g;
+    $str =~ s/\r/\\r/g;
+    $str =~ s/([\cA-\cZ])/$unctrl{$1}/ge;
+    $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/ge;
+    return $str;
+}
+
+# For regexes with the /x modifier.
+# Leave whitespace unmangled.
+sub escape_extended_re {
+    my($str) = @_;
+    $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
+    $str =~ s/([[:^print:]])/
+	($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/ge;
+    $str =~ s/\n/\n\f/g;
+    return $str;
+}
+
+# Don't do this for regexen
+sub unback {
+    my($str) = @_;
+    $str =~ s/\\/\\\\/g;
+    return $str;
+}
+
+# Remove backslashes which precede literal control characters,
+# to avoid creating ambiguity when we escape the latter.
+sub re_unback {
+    my($str) = @_;
+
+    # the insane complexity here is due to the behaviour of "\c\"
+    $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g;
+    return $str;
+}
+
+sub balanced_delim {
+    my($str) = @_;
+    my @str = split //, $str;
+    my($ar, $open, $close, $fail, $c, $cnt);
+    for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
+	($open, $close) = @$ar;
+	$fail = 0; $cnt = 0;
+	for $c (@str) {
+	    if ($c eq $open) {
+		$cnt++;
+	    } elsif ($c eq $close) {
+		$cnt--;
+		if ($cnt < 0) {
+		    # qq()() isn't ")("
+		    $fail = 1;
+		    last;
+		}
+	    }
+	}
+	$fail = 1 if $cnt != 0;
+	return ($open, "$open$str$close") if not $fail;
+    }
+    return ("", $str);
+}
+
+sub single_delim {
+    my($q, $default, $str) = @_;
+    return "$default$str$default" if $default and index($str, $default) == -1;
+    if ($q ne 'qr') {
+	(my $succeed, $str) = balanced_delim($str);
+	return "$q$str" if $succeed;
+    }
+    for my $delim ('/', '"', '#') {
+	return "$q$delim" . $str . $delim if index($str, $delim) == -1;
+    }
+    if ($default) {
+	$str =~ s/$default/\\$default/g;
+	return "$default$str$default";
+    } else {
+	$str =~ s[/][\\/]g;
+	return "$q/$str/";
+    }
+}
+
+my $max_prec;
+BEGIN { $max_prec = int(0.999 + 8*length(pack("F", 42))*log(2)/log(10)); }
+
+# Split a floating point number into an integer mantissa and a binary
+# exponent. Assumes you've already made sure the number isn't zero or
+# some weird infinity or NaN.
+sub split_float {
+    my($f) = @_;
+    my $exponent = 0;
+    if ($f == int($f)) {
+	while ($f % 2 == 0) {
+	    $f /= 2;
+	    $exponent++;
+	}
+    } else {
+	while ($f != int($f)) {
+	    $f *= 2;
+	    $exponent--;
+	}
+    }
+    my $mantissa = sprintf("%.0f", $f);
+    return ($mantissa, $exponent);
+}
+
+sub const {
+    my $self = shift;
+    my($sv, $cx) = @_;
+    if ($self->{'use_dumper'}) {
+	return $self->const_dumper($sv, $cx);
+    }
+    if (class($sv) eq "SPECIAL") {
+	# sv_undef, sv_yes, sv_no
+	return ('undef', '1', $self->maybe_parens("!1", $cx, 21))[$$sv-1];
+    } elsif (class($sv) eq "NULL") {
+       return 'undef';
+    }
+    # convert a version object into the "v1.2.3" string in its V magic
+    if ($sv->FLAGS & SVs_RMG) {
+	for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
+	    return $mg->PTR if $mg->TYPE eq 'V';
+	}
+    }
+
+    if ($sv->FLAGS & SVf_IOK) {
+	my $str = $sv->int_value;
+	$str = $self->maybe_parens($str, $cx, 21) if $str < 0;
+	return $str;
+    } elsif ($sv->FLAGS & SVf_NOK) {
+	my $nv = $sv->NV;
+	if ($nv == 0) {
+	    if (pack("F", $nv) eq pack("F", 0)) {
+		# positive zero
+		return "0";
+	    } else {
+		# negative zero
+		return $self->maybe_parens("-.0", $cx, 21);
+	    }
+	} elsif (1/$nv == 0) {
+	    if ($nv > 0) {
+		# positive infinity
+		return $self->maybe_parens("9**9**9", $cx, 22);
+	    } else {
+		# negative infinity
+		return $self->maybe_parens("-9**9**9", $cx, 21);
+	    }
+	} elsif ($nv != $nv) {
+	    # NaN
+	    if (pack("F", $nv) eq pack("F", sin(9**9**9))) {
+		# the normal kind
+		return "sin(9**9**9)";
+	    } elsif (pack("F", $nv) eq pack("F", -sin(9**9**9))) {
+		# the inverted kind
+		return $self->maybe_parens("-sin(9**9**9)", $cx, 21);
+	    } else {
+		# some other kind
+		my $hex = unpack("h*", pack("F", $nv));
+		return qq'unpack("F", pack("h*", "$hex"))';
+	    }
+	}
+	# first, try the default stringification
+	my $str = "$nv";
+	if ($str != $nv) {
+	    # failing that, try using more precision
+	    $str = sprintf("%.${max_prec}g", $nv);
+#	    if (pack("F", $str) ne pack("F", $nv)) {
+	    if ($str != $nv) {
+		# not representable in decimal with whatever sprintf()
+		# and atof() Perl is using here.
+		my($mant, $exp) = split_float($nv);
+		return $self->maybe_parens("$mant * 2**$exp", $cx, 19);
+	    }
+	}
+	$str = $self->maybe_parens($str, $cx, 21) if $nv < 0;
+	return $str;
+    } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
+	my $ref = $sv->RV;
+	if (class($ref) eq "AV") {
+	    return "[" . $self->list_const(2, $ref->ARRAY) . "]";
+	} elsif (class($ref) eq "HV") {
+	    my %hash = $ref->ARRAY;
+	    my @elts;
+	    for my $k (sort keys %hash) {
+		push @elts, "$k => " . $self->const($hash{$k}, 6);
+	    }
+	    return "{" . join(", ", @elts) . "}";
+	} elsif (class($ref) eq "CV") {
+	    return "sub " . $self->deparse_sub($ref);
+	}
+	if ($ref->FLAGS & SVs_SMG) {
+	    for (my $mg = $ref->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
+		if ($mg->TYPE eq 'r') {
+		    my $re = re_uninterp(escape_str(re_unback($mg->precomp)));
+		    return single_delim("qr", "", $re);
+		}
+	    }
+	}
+	
+	return $self->maybe_parens("\\" . $self->const($ref, 20), $cx, 20);
+    } elsif ($sv->FLAGS & SVf_POK) {
+	my $str = $sv->PV;
+	if ($str =~ /[^ -~]/) { # ASCII for non-printing
+	    return single_delim("qq", '"', uninterp escape_str unback $str);
+	} else {
+	    return single_delim("q", "'", unback $str);
+	}
+    } else {
+	return "undef";
+    }
+}
+
+sub const_dumper {
+    my $self = shift;
+    my($sv, $cx) = @_;
+    my $ref = $sv->object_2svref();
+    my $dumper = Data::Dumper->new([$$ref], ['$v']);
+    $dumper->Purity(1)->Terse(1)->Deparse(1)->Indent(0)->Useqq(1)->Sortkeys(1);
+    my $str = $dumper->Dump();
+    if ($str =~ /^\$v/) {
+	return '${my ' . $str . ' \$v}';
+    } else {
+	return $str;
+    }
+}
+
+sub const_sv {
+    my $self = shift;
+    my $op = shift;
+    my $sv = $op->sv;
+    # the constant could be in the pad (under useithreads)
+    $sv = $self->padval($op->targ) unless $$sv;
+    return $sv;
+}
+
+sub pp_const {
+    my $self = shift;
+    my($op, $cx) = @_;
+    if ($op->private & OPpCONST_ARYBASE) {
+        return '$[';
+    }
+#    if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting
+#	return $self->const_sv($op)->PV;
+#    }
+    my $sv = $self->const_sv($op);
+    return $self->const($sv, $cx);
+}
+
+sub dq {
+    my $self = shift;
+    my $op = shift;
+    my $type = $op->name;
+    if ($type eq "const") {
+	return '$[' if $op->private & OPpCONST_ARYBASE;
+	return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
+    } elsif ($type eq "concat") {
+	my $first = $self->dq($op->first);
+	my $last  = $self->dq($op->last);
+
+	# Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]", "$foo\::bar"
+	($last =~ /^[A-Z\\\^\[\]_?]/ &&
+	    $first =~ s/([\$@])\^$/${1}{^}/)  # "${^}W" etc
+	    || ($last =~ /^[:'{\[\w_]/ && #'
+		$first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
+
+	return $first . $last;
+    } elsif ($type eq "uc") {
+	return '\U' . $self->dq($op->first->sibling) . '\E';
+    } elsif ($type eq "lc") {
+	return '\L' . $self->dq($op->first->sibling) . '\E';
+    } elsif ($type eq "ucfirst") {
+	return '\u' . $self->dq($op->first->sibling);
+    } elsif ($type eq "lcfirst") {
+	return '\l' . $self->dq($op->first->sibling);
+    } elsif ($type eq "quotemeta") {
+	return '\Q' . $self->dq($op->first->sibling) . '\E';
+    } elsif ($type eq "join") {
+	return $self->deparse($op->last, 26); # was join($", @ary)
+    } else {
+	return $self->deparse($op, 26);
+    }
+}
+
+sub pp_backtick {
+    my $self = shift;
+    my($op, $cx) = @_;
+    # skip pushmark
+    return single_delim("qx", '`', $self->dq($op->first->sibling));
+}
+
+sub dquote {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $kid = $op->first->sibling; # skip ex-stringify, pushmark
+    return $self->deparse($kid, $cx) if $self->{'unquote'};
+    $self->maybe_targmy($kid, $cx,
+			sub {single_delim("qq", '"', $self->dq($_[1]))});
+}
+
+# OP_STRINGIFY is a listop, but it only ever has one arg
+sub pp_stringify { maybe_targmy(@_, \&dquote) }
+
+# tr/// and s/// (and tr[][], tr[]//, tr###, etc)
+# note that tr(from)/to/ is OK, but not tr/from/(to)
+sub double_delim {
+    my($from, $to) = @_;
+    my($succeed, $delim);
+    if ($from !~ m[/] and $to !~ m[/]) {
+	return "/$from/$to/";
+    } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
+	if (($succeed, $to) = balanced_delim($to) and $succeed) {
+	    return "$from$to";
+	} else {
+	    for $delim ('/', '"', '#') { # note no `'' -- s''' is special
+		return "$from$delim$to$delim" if index($to, $delim) == -1;
+	    }
+	    $to =~ s[/][\\/]g;
+	    return "$from/$to/";
+	}
+    } else {
+	for $delim ('/', '"', '#') { # note no '
+	    return "$delim$from$delim$to$delim"
+		if index($to . $from, $delim) == -1;
+	}
+	$from =~ s[/][\\/]g;
+	$to =~ s[/][\\/]g;
+	return "/$from/$to/";	
+    }
+}
+
+# Only used by tr///, so backslashes hyphens
+sub pchr { # ASCII
+    my($n) = @_;
+    if ($n == ord '\\') {
+	return '\\\\';
+    } elsif ($n == ord "-") {
+	return "\\-";
+    } elsif ($n >= ord(' ') and $n <= ord('~')) {
+	return chr($n);
+    } elsif ($n == ord "\a") {
+	return '\\a';
+    } elsif ($n == ord "\b") {
+	return '\\b';
+    } elsif ($n == ord "\t") {
+	return '\\t';
+    } elsif ($n == ord "\n") {
+	return '\\n';
+    } elsif ($n == ord "\e") {
+	return '\\e';
+    } elsif ($n == ord "\f") {
+	return '\\f';
+    } elsif ($n == ord "\r") {
+	return '\\r';
+    } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
+	return '\\c' . chr(ord("@") + $n);
+    } else {
+#	return '\x' . sprintf("%02x", $n);
+	return '\\' . sprintf("%03o", $n);
+    }
+}
+
+sub collapse {
+    my(@chars) = @_;
+    my($str, $c, $tr) = ("");
+    for ($c = 0; $c < @chars; $c++) {
+	$tr = $chars[$c];
+	$str .= pchr($tr);
+	if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
+	    $chars[$c + 2] == $tr + 2)
+	{
+	    for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
+	      {}
+	    $str .= "-";
+	    $str .= pchr($chars[$c]);
+	}
+    }
+    return $str;
+}
+
+sub tr_decode_byte {
+    my($table, $flags) = @_;
+    my(@table) = unpack("s*", $table);
+    splice @table, 0x100, 1;   # Number of subsequent elements
+    my($c, $tr, @from, @to, @delfrom, $delhyphen);
+    if ($table[ord "-"] != -1 and
+	$table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
+    {
+	$tr = $table[ord "-"];
+	$table[ord "-"] = -1;
+	if ($tr >= 0) {
+	    @from = ord("-");
+	    @to = $tr;
+	} else { # -2 ==> delete
+	    $delhyphen = 1;
+	}
+    }
+    for ($c = 0; $c < @table; $c++) {
+	$tr = $table[$c];
+	if ($tr >= 0) {
+	    push @from, $c; push @to, $tr;
+	} elsif ($tr == -2) {
+	    push @delfrom, $c;
+	}
+    }
+    @from = (@from, @delfrom);
+    if ($flags & OPpTRANS_COMPLEMENT) {
+	my @newfrom = ();
+	my %from;
+	@from{@from} = (1) x @from;
+	for ($c = 0; $c < 256; $c++) {
+	    push @newfrom, $c unless $from{$c};
+	}
+	@from = @newfrom;
+    }
+    unless ($flags & OPpTRANS_DELETE || !@to) {
+	pop @to while $#to and $to[$#to] == $to[$#to -1];
+    }
+    my($from, $to);
+    $from = collapse(@from);
+    $to = collapse(@to);
+    $from .= "-" if $delhyphen;
+    return ($from, $to);
+}
+
+sub tr_chr {
+    my $x = shift;
+    if ($x == ord "-") {
+	return "\\-";
+    } elsif ($x == ord "\\") {
+	return "\\\\";
+    } else {
+	return chr $x;
+    }
+}
+
+# XXX This doesn't yet handle all cases correctly either
+
+sub tr_decode_utf8 {
+    my($swash_hv, $flags) = @_;
+    my %swash = $swash_hv->ARRAY;
+    my $final = undef;
+    $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
+    my $none = $swash{"NONE"}->IV;
+    my $extra = $none + 1;
+    my(@from, @delfrom, @to);
+    my $line;
+    foreach $line (split /\n/, $swash{'LIST'}->PV) {
+	my($min, $max, $result) = split(/\t/, $line);
+	$min = hex $min;
+	if (length $max) {
+	    $max = hex $max;
+	} else {
+	    $max = $min;
+	}
+	$result = hex $result;
+	if ($result == $extra) {
+	    push @delfrom, [$min, $max];
+	} else {
+	    push @from, [$min, $max];
+	    push @to, [$result, $result + $max - $min];
+	}
+    }
+    for my $i (0 .. $#from) {
+	if ($from[$i][0] == ord '-') {
+	    unshift @from, splice(@from, $i, 1);
+	    unshift @to, splice(@to, $i, 1);
+	    last;
+	} elsif ($from[$i][1] == ord '-') {
+	    $from[$i][1]--;
+	    $to[$i][1]--;
+	    unshift @from, ord '-';
+	    unshift @to, ord '-';
+	    last;
+	}
+    }
+    for my $i (0 .. $#delfrom) {
+	if ($delfrom[$i][0] == ord '-') {
+	    push @delfrom, splice(@delfrom, $i, 1);
+	    last;
+	} elsif ($delfrom[$i][1] == ord '-') {
+	    $delfrom[$i][1]--;
+	    push @delfrom, ord '-';
+	    last;
+	}
+    }
+    if (defined $final and $to[$#to][1] != $final) {
+	push @to, [$final, $final];
+    }
+    push @from, @delfrom;
+    if ($flags & OPpTRANS_COMPLEMENT) {
+	my @newfrom;
+	my $next = 0;
+	for my $i (0 .. $#from) {
+	    push @newfrom, [$next, $from[$i][0] - 1];
+	    $next = $from[$i][1] + 1;
+	}
+	@from = ();
+	for my $range (@newfrom) {
+	    if ($range->[0] <= $range->[1]) {
+		push @from, $range;
+	    }
+	}
+    }
+    my($from, $to, $diff);
+    for my $chunk (@from) {
+	$diff = $chunk->[1] - $chunk->[0];
+	if ($diff > 1) {
+	    $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
+	} elsif ($diff == 1) {
+	    $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
+	} else {
+	    $from .= tr_chr($chunk->[0]);
+	}
+    }
+    for my $chunk (@to) {
+	$diff = $chunk->[1] - $chunk->[0];
+	if ($diff > 1) {
+	    $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
+	} elsif ($diff == 1) {
+	    $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
+	} else {
+	    $to .= tr_chr($chunk->[0]);
+	}
+    }
+    #$final = sprintf("%04x", $final) if defined $final;
+    #$none = sprintf("%04x", $none) if defined $none;
+    #$extra = sprintf("%04x", $extra) if defined $extra;
+    #print STDERR "final: $final\n none: $none\nextra: $extra\n";
+    #print STDERR $swash{'LIST'}->PV;
+    return (escape_str($from), escape_str($to));
+}
+
+sub pp_trans {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my($from, $to);
+    if (class($op) eq "PVOP") {
+	($from, $to) = tr_decode_byte($op->pv, $op->private);
+    } else { # class($op) eq "SVOP"
+	($from, $to) = tr_decode_utf8($op->sv->RV, $op->private);
+    }
+    my $flags = "";
+    $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT;
+    $flags .= "d" if $op->private & OPpTRANS_DELETE;
+    $to = "" if $from eq $to and $flags eq "";
+    $flags .= "s" if $op->private & OPpTRANS_SQUASH;
+    return "tr" . double_delim($from, $to) . $flags;
+}
+
+# Like dq(), but different
+sub re_dq {
+    my $self = shift;
+    my ($op, $extended) = @_;
+
+    my $type = $op->name;
+    if ($type eq "const") {
+	return '$[' if $op->private & OPpCONST_ARYBASE;
+	my $unbacked = re_unback($self->const_sv($op)->as_string);
+	return re_uninterp_extended(escape_extended_re($unbacked))
+	    if $extended;
+	return re_uninterp(escape_str($unbacked));
+    } elsif ($type eq "concat") {
+	my $first = $self->re_dq($op->first, $extended);
+	my $last  = $self->re_dq($op->last,  $extended);
+
+	# Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
+	($last =~ /^[A-Z\\\^\[\]_?]/ &&
+	    $first =~ s/([\$@])\^$/${1}{^}/)  # "${^}W" etc
+	    || ($last =~ /^[{\[\w_]/ &&
+		$first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
+
+	return $first . $last;
+    } elsif ($type eq "uc") {
+	return '\U' . $self->re_dq($op->first->sibling, $extended) . '\E';
+    } elsif ($type eq "lc") {
+	return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E';
+    } elsif ($type eq "ucfirst") {
+	return '\u' . $self->re_dq($op->first->sibling, $extended);
+    } elsif ($type eq "lcfirst") {
+	return '\l' . $self->re_dq($op->first->sibling, $extended);
+    } elsif ($type eq "quotemeta") {
+	return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E';
+    } elsif ($type eq "join") {
+	return $self->deparse($op->last, 26); # was join($", @ary)
+    } else {
+	return $self->deparse($op, 26);
+    }
+}
+
+sub pure_string {
+    my ($self, $op) = @_;
+    return 0 if null $op;
+    my $type = $op->name;
+
+    if ($type eq 'const') {
+	return 1;
+    }
+    elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') {
+	return $self->pure_string($op->first->sibling);
+    }
+    elsif ($type eq 'join') {
+	my $join_op = $op->first->sibling;  # Skip pushmark
+	return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV;
+
+	my $gvop = $join_op->first;
+	return 0 unless $gvop->name eq 'gvsv';
+        return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
+
+	return 0 unless ${$join_op->sibling} eq ${$op->last};
+	return 0 unless $op->last->name =~ /^(rv2|pad)av$/;
+    }
+    elsif ($type eq 'concat') {
+	return $self->pure_string($op->first)
+            && $self->pure_string($op->last);
+    }
+    elsif (is_scalar($op) || $type =~ /^[ah]elem$/) {
+	return 1;
+    }
+    elsif ($type eq "null" and $op->can('first') and not null $op->first and
+	   $op->first->name eq "null" and $op->first->can('first')
+	   and not null $op->first->first and
+	   $op->first->first->name eq "aelemfast") {
+	return 1;
+    }
+    else {
+	return 0;
+    }
+
+    return 1;
+}
+
+sub regcomp {
+    my $self = shift;
+    my($op, $cx, $extended) = @_;
+    my $kid = $op->first;
+    $kid = $kid->first if $kid->name eq "regcmaybe";
+    $kid = $kid->first if $kid->name eq "regcreset";
+    if ($kid->name eq "null" and !null($kid->first)
+	and $kid->first->name eq 'pushmark')
+    {
+	my $str = '';
+	$kid = $kid->first->sibling;
+	while (!null($kid)) {
+	    $str .= $self->re_dq($kid, $extended);
+	    $kid = $kid->sibling;
+	}
+	return $str, 1;
+    }
+
+    return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid);
+    return ($self->deparse($kid, $cx), 0);
+}
+
+sub pp_regcomp {
+    my ($self, $op, $cx) = @_;
+    return (($self->regcomp($op, $cx, 0))[0]);
+}
+
+# osmic acid -- see osmium tetroxide
+
+my %matchwords;
+map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
+    'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic',
+    'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi');
+
+sub matchop {
+    my $self = shift;
+    my($op, $cx, $name, $delim) = @_;
+    my $kid = $op->first;
+    my ($binop, $var, $re) = ("", "", "");
+    if ($op->flags & OPf_STACKED) {
+	$binop = 1;
+	$var = $self->deparse($kid, 20);
+	$kid = $kid->sibling;
+    }
+    my $quote = 1;
+    my $extended = ($op->pmflags & PMf_EXTENDED);
+    if (null $kid) {
+	my $unbacked = re_unback($op->precomp);
+	if ($extended) {
+	    $re = re_uninterp_extended(escape_extended_re($unbacked));
+	} else {
+	    $re = re_uninterp(escape_str(re_unback($op->precomp)));
+	}
+    } elsif ($kid->name ne 'regcomp') {
+	carp("found ".$kid->name." where regcomp expected");
+    } else {
+	($re, $quote) = $self->regcomp($kid, 21, $extended);
+    }
+    my $flags = "";
+    $flags .= "c" if $op->pmflags & PMf_CONTINUE;
+    $flags .= "g" if $op->pmflags & PMf_GLOBAL;
+    $flags .= "i" if $op->pmflags & PMf_FOLD;
+    $flags .= "m" if $op->pmflags & PMf_MULTILINE;
+    $flags .= "o" if $op->pmflags & PMf_KEEP;
+    $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
+    $flags .= "x" if $op->pmflags & PMf_EXTENDED;
+    $flags = $matchwords{$flags} if $matchwords{$flags};
+    if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here
+	$re =~ s/\?/\\?/g;
+	$re = "?$re?";
+    } elsif ($quote) {
+	$re = single_delim($name, $delim, $re);
+    }
+    $re = $re . $flags if $quote;
+    if ($binop) {
+	return $self->maybe_parens("$var =~ $re", $cx, 20);
+    } else {
+	return $re;
+    }
+}
+
+sub pp_match { matchop(@_, "m", "/") }
+sub pp_pushre { matchop(@_, "m", "/") }
+sub pp_qr { matchop(@_, "qr", "") }
+
+sub pp_split {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my($kid, @exprs, $ary, $expr);
+    $kid = $op->first;
+
+    # For our kid (an OP_PUSHRE), pmreplroot is never actually the
+    # root of a replacement; it's either empty, or abused to point to
+    # the GV for an array we split into (an optimization to save
+    # assignment overhead). Depending on whether we're using ithreads,
+    # this OP* holds either a GV* or a PADOFFSET. Luckily, B.xs
+    # figures out for us which it is.
+    my $replroot = $kid->pmreplroot;
+    my $gv = 0;
+    if (ref($replroot) eq "B::GV") {
+	$gv = $replroot;
+    } elsif (!ref($replroot) and $replroot > 0) {
+	$gv = $self->padval($replroot);
+    }
+    $ary = $self->stash_variable('@', $self->gv_name($gv)) if $gv;
+
+    for (; !null($kid); $kid = $kid->sibling) {
+	push @exprs, $self->deparse($kid, 6);
+    }
+
+    # handle special case of split(), and split(" ") that compiles to /\s+/
+    $kid = $op->first;
+    if ($kid->flags & OPf_SPECIAL
+	&& $exprs[0] eq '/\\s+/'
+	&& $kid->pmflags & PMf_SKIPWHITE ) {
+	    $exprs[0] = '" "';
+    }
+
+    $expr = "split(" . join(", ", @exprs) . ")";
+    if ($ary) {
+	return $self->maybe_parens("$ary = $expr", $cx, 7);
+    } else {
+	return $expr;
+    }
+}
+
+# oxime -- any of various compounds obtained chiefly by the action of
+# hydroxylamine on aldehydes and ketones and characterized by the
+# bivalent grouping C=NOH [Webster's Tenth]
+
+my %substwords;
+map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
+    'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
+    'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
+    'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi');
+
+sub pp_subst {
+    my $self = shift;
+    my($op, $cx) = @_;
+    my $kid = $op->first;
+    my($binop, $var, $re, $repl) = ("", "", "", "");
+    if ($op->flags & OPf_STACKED) {
+	$binop = 1;
+	$var = $self->deparse($kid, 20);
+	$kid = $kid->sibling;
+    }
+    my $flags = "";
+    if (null($op->pmreplroot)) {
+	$repl = $self->dq($kid);
+	$kid = $kid->sibling;
+    } else {
+	$repl = $op->pmreplroot->first; # skip substcont
+	while ($repl->name eq "entereval") {
+	    $repl = $repl->first;
+	    $flags .= "e";
+	}
+	if ($op->pmflags & PMf_EVAL) {
+	    $repl = $self->deparse($repl->first, 0);
+	} else {
+	    $repl = $self->dq($repl);	
+	}
+    }
+    my $extended = ($op->pmflags & PMf_EXTENDED);
+    if (null $kid) {
+	my $unbacked = re_unback($op->precomp);
+	if ($extended) {
+	    $re = re_uninterp_extended(escape_extended_re($unbacked));
+	}
+	else {
+	    $re = re_uninterp(escape_str($unbacked));
+	}
+    } else {
+	($re) = $self->regcomp($kid, 1, $extended);
+    }
+    $flags .= "e" if $op->pmflags & PMf_EVAL;
+    $flags .= "g" if $op->pmflags & PMf_GLOBAL;
+    $flags .= "i" if $op->pmflags & PMf_FOLD;
+    $flags .= "m" if $op->pmflags & PMf_MULTILINE;
+    $flags .= "o" if $op->pmflags & PMf_KEEP;
+    $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
+    $flags .= "x" if $extended;
+    $flags = $substwords{$flags} if $substwords{$flags};
+    if ($binop) {
+	return $self->maybe_parens("$var =~ s"
+				   . double_delim($re, $repl) . $flags,
+				   $cx, 20);
+    } else {
+	return "s". double_delim($re, $repl) . $flags;	
+    }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+B::Deparse - Perl compiler backend to produce perl code
+
+=head1 SYNOPSIS
+
+B<perl> B<-MO=Deparse>[B<,-d>][B<,-f>I<FILE>][B<,-p>][B<,-q>][B<,-l>]
+        [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl>
+
+=head1 DESCRIPTION
+
+B::Deparse is a backend module for the Perl compiler that generates
+perl source code, based on the internal compiled structure that perl
+itself creates after parsing a program. The output of B::Deparse won't
+be exactly the same as the original source, since perl doesn't keep
+track of comments or whitespace, and there isn't a one-to-one
+correspondence between perl's syntactical constructions and their
+compiled form, but it will often be close. When you use the B<-p>
+option, the output also includes parentheses even when they are not
+required by precedence, which can make it easy to see if perl is
+parsing your expressions the way you intended.
+
+While B::Deparse goes to some lengths to try to figure out what your
+original program was doing, some parts of the language can still trip
+it up; it still fails even on some parts of Perl's own test suite. If
+you encounter a failure other than the most common ones described in
+the BUGS section below, you can help contribute to B::Deparse's
+ongoing development by submitting a bug report with a small
+example.
+
+=head1 OPTIONS
+
+As with all compiler backend options, these must follow directly after
+the '-MO=Deparse', separated by a comma but not any white space.
+
+=over 4
+
+=item B<-d>
+
+Output data values (when they appear as constants) using Data::Dumper.
+Without this option, B::Deparse will use some simple routines of its
+own for the same purpose. Currently, Data::Dumper is better for some
+kinds of data (such as complex structures with sharing and
+self-reference) while the built-in routines are better for others
+(such as odd floating-point values).
+
+=item B<-f>I<FILE>
+
+Normally, B::Deparse deparses the main code of a program, and all the subs
+defined in the same file. To include subs defined in other files, pass the
+B<-f> option with the filename. You can pass the B<-f> option several times, to
+include more than one secondary file.  (Most of the time you don't want to
+use it at all.)  You can also use this option to include subs which are
+defined in the scope of a B<#line> directive with two parameters.
+
+=item B<-l>
+
+Add '#line' declarations to the output based on the line and file
+locations of the original code.
+
+=item B<-p>
+
+Print extra parentheses. Without this option, B::Deparse includes
+parentheses in its output only when they are needed, based on the
+structure of your program. With B<-p>, it uses parentheses (almost)
+whenever they would be legal. This can be useful if you are used to
+LISP, or if you want to see how perl parses your input. If you say
+
+    if ($var & 0x7f == 65) {print "Gimme an A!"}
+    print ($which ? $a : $b), "\n";
+    $name = $ENV{USER} or "Bob";
+
+C<B::Deparse,-p> will print
+
+    if (($var & 0)) {
+        print('Gimme an A!')
+    };
+    (print(($which ? $a : $b)), '???');
+    (($name = $ENV{'USER'}) or '???')
+
+which probably isn't what you intended (the C<'???'> is a sign that
+perl optimized away a constant value).
+
+=item B<-P>
+
+Disable prototype checking. With this option, all function calls are
+deparsed as if no prototype was defined for them. In other words,
+
+    perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x'
+
+will print
+
+    sub foo (\@) {
+	1;
+    }
+    &foo(\@x);
+
+making clear how the parameters are actually passed to C<foo>.
+
+=item B<-q>
+
+Expand double-quoted strings into the corresponding combinations of
+concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
+instance, print
+
+    print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
+
+as
+
+    print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
+          . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
+
+Note that the expanded form represents the way perl handles such
+constructions internally -- this option actually turns off the reverse
+translation that B::Deparse usually does. On the other hand, note that
+C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
+of $y into a string before doing the assignment.
+
+=item B<-s>I<LETTERS>
+
+Tweak the style of B::Deparse's output. The letters should follow
+directly after the 's', with no space or punctuation. The following
+options are available:
+
+=over 4
+
+=item B<C>
+
+Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print
+
+    if (...) {
+         ...
+    } else {
+         ...
+    }
+
+instead of
+
+    if (...) {
+         ...
+    }
+    else {
+         ...
+    }
+
+The default is not to cuddle.
+
+=item B<i>I<NUMBER>
+
+Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
+
+=item B<T>
+
+Use tabs for each 8 columns of indent. The default is to use only spaces.
+For instance, if the style options are B<-si4T>, a line that's indented
+3 times will be preceded by one tab and four spaces; if the options were
+B<-si8T>, the same line would be preceded by three tabs.
+
+=item B<v>I<STRING>B<.>
+
+Print I<STRING> for the value of a constant that can't be determined
+because it was optimized away (mnemonic: this happens when a constant
+is used in B<v>oid context). The end of the string is marked by a period.
+The string should be a valid perl expression, generally a constant.
+Note that unless it's a number, it probably needs to be quoted, and on
+a command line quotes need to be protected from the shell. Some
+conventional values include 0, 1, 42, '', 'foo', and
+'Useless use of constant omitted' (which may need to be
+B<-sv"'Useless use of constant omitted'.">
+or something similar depending on your shell). The default is '???'.
+If you're using B::Deparse on a module or other file that's require'd,
+you shouldn't use a value that evaluates to false, since the customary
+true constant at the end of a module will be in void context when the
+file is compiled as a main program.
+
+=back
+
+=item B<-x>I<LEVEL>
+
+Expand conventional syntax constructions into equivalent ones that expose
+their internal operation. I<LEVEL> should be a digit, with higher values
+meaning more expansion. As with B<-q>, this actually involves turning off
+special cases in B::Deparse's normal operations.
+
+If I<LEVEL> is at least 3, C<for> loops will be translated into equivalent
+while loops with continue blocks; for instance
+
+    for ($i = 0; $i < 10; ++$i) {
+        print $i;
+    }
+
+turns into
+
+    $i = 0;
+    while ($i < 10) {
+        print $i;
+    } continue {
+        ++$i
+    }
+
+Note that in a few cases this translation can't be perfectly carried back
+into the source code -- if the loop's initializer declares a my variable,
+for instance, it won't have the correct scope outside of the loop.
+
+If I<LEVEL> is at least 5, C<use> declarations will be translated into
+C<BEGIN> blocks containing calls to C<require> and C<import>; for
+instance,
+
+    use strict 'refs';
+
+turns into
+
+    sub BEGIN {
+        require strict;
+        do {
+            'strict'->import('refs')
+        };
+    }
+
+If I<LEVEL> is at least 7, C<if> statements will be translated into
+equivalent expressions using C<&&>, C<?:> and C<do {}>; for instance
+
+    print 'hi' if $nice;
+    if ($nice) {
+        print 'hi';
+    }
+    if ($nice) {
+        print 'hi';
+    } else {
+        print 'bye';
+    }
+
+turns into
+
+    $nice and print 'hi';
+    $nice and do { print 'hi' };
+    $nice ? do { print 'hi' } : do { print 'bye' };
+
+Long sequences of elsifs will turn into nested ternary operators, which
+B::Deparse doesn't know how to indent nicely.
+
+=back
+
+=head1 USING B::Deparse AS A MODULE
+
+=head2 Synopsis
+
+    use B::Deparse;
+    $deparse = B::Deparse->new("-p", "-sC");
+    $body = $deparse->coderef2text(\&func);
+    eval "sub func $body"; # the inverse operation
+
+=head2 Description
+
+B::Deparse can also be used on a sub-by-sub basis from other perl
+programs.
+
+=head2 new
+
+    $deparse = B::Deparse->new(OPTIONS)
+
+Create an object to store the state of a deparsing operation and any
+options. The options are the same as those that can be given on the
+command line (see L</OPTIONS>); options that are separated by commas
+after B<-MO=Deparse> should be given as separate strings. Some
+options, like B<-u>, don't make sense for a single subroutine, so
+don't pass them.
+
+=head2 ambient_pragmas
+
+    $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
+
+The compilation of a subroutine can be affected by a few compiler
+directives, B<pragmas>. These are:
+
+=over 4
+
+=item *
+
+use strict;
+
+=item *
+
+use warnings;
+
+=item *
+
+Assigning to the special variable $[
+
+=item *
+
+use integer;
+
+=item *
+
+use bytes;
+
+=item *
+
+use utf8;
+
+=item *
+
+use re;
+
+=back
+
+Ordinarily, if you use B::Deparse on a subroutine which has
+been compiled in the presence of one or more of these pragmas,
+the output will include statements to turn on the appropriate
+directives. So if you then compile the code returned by coderef2text,
+it will behave the same way as the subroutine which you deparsed.
+
+However, you may know that you intend to use the results in a
+particular context, where some pragmas are already in scope. In
+this case, you use the B<ambient_pragmas> method to describe the
+assumptions you wish to make.
+
+Not all of the options currently have any useful effect. See
+L</BUGS> for more details.
+
+The parameters it accepts are:
+
+=over 4
+
+=item strict
+
+Takes a string, possibly containing several values separated
+by whitespace. The special values "all" and "none" mean what you'd
+expect.
+
+    $deparse->ambient_pragmas(strict => 'subs refs');
+
+=item $[
+
+Takes a number, the value of the array base $[.
+
+=item bytes
+
+=item utf8
+
+=item integer
+
+If the value is true, then the appropriate pragma is assumed to
+be in the ambient scope, otherwise not.
+
+=item re
+
+Takes a string, possibly containing a whitespace-separated list of
+values. The values "all" and "none" are special. It's also permissible
+to pass an array reference here.
+
+    $deparser->ambient_pragmas(re => 'eval');
+
+
+=item warnings
+
+Takes a string, possibly containing a whitespace-separated list of
+values. The values "all" and "none" are special, again. It's also
+permissible to pass an array reference here.
+
+    $deparser->ambient_pragmas(warnings => [qw[void io]]);
+
+If one of the values is the string "FATAL", then all the warnings
+in that list will be considered fatal, just as with the B<warnings>
+pragma itself. Should you need to specify that some warnings are
+fatal, and others are merely enabled, you can pass the B<warnings>
+parameter twice:
+
+    $deparser->ambient_pragmas(
+	warnings => 'all',
+	warnings => [FATAL => qw/void io/],
+    );
+
+See L<perllexwarn> for more information about lexical warnings.
+
+=item hint_bits
+
+=item warning_bits
+
+These two parameters are used to specify the ambient pragmas in
+the format used by the special variables $^H and ${^WARNING_BITS}.
+
+They exist principally so that you can write code like:
+
+    { my ($hint_bits, $warning_bits);
+    BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
+    $deparser->ambient_pragmas (
+	hint_bits    => $hint_bits,
+	warning_bits => $warning_bits,
+	'$['         => 0 + $[
+    ); }
+
+which specifies that the ambient pragmas are exactly those which
+are in scope at the point of calling.
+
+=back
+
+=head2 coderef2text
+
+    $body = $deparse->coderef2text(\&func)
+    $body = $deparse->coderef2text(sub ($$) { ... })
+
+Return source code for the body of a subroutine (a block, optionally
+preceded by a prototype in parens), given a reference to the
+sub. Because a subroutine can have no names, or more than one name,
+this method doesn't return a complete subroutine definition -- if you
+want to eval the result, you should prepend "sub subname ", or "sub "
+for an anonymous function constructor. Unless the sub was defined in
+the main:: package, the code will include a package declaration.
+
+=head1 BUGS
+
+=over 4
+
+=item *
+
+The only pragmas to be completely supported are: C<use warnings>,
+C<use strict 'refs'>, C<use bytes>, and C<use integer>. (C<$[>, which
+behaves like a pragma, is also supported.)
+
+Excepting those listed above, we're currently unable to guarantee that
+B::Deparse will produce a pragma at the correct point in the program.
+(Specifically, pragmas at the beginning of a block often appear right
+before the start of the block instead.)
+Since the effects of pragmas are often lexically scoped, this can mean
+that the pragma holds sway over a different portion of the program
+than in the input file.
+
+=item *
+
+In fact, the above is a specific instance of a more general problem:
+we can't guarantee to produce BEGIN blocks or C<use> declarations in
+exactly the right place. So if you use a module which affects compilation
+(such as by over-riding keywords, overloading constants or whatever)
+then the output code might not work as intended.
+
+This is the most serious outstanding problem, and will require some help
+from the Perl core to fix.
+
+=item *
+
+If a keyword is over-ridden, and your program explicitly calls
+the built-in version by using CORE::keyword, the output of B::Deparse
+will not reflect this. If you run the resulting code, it will call
+the over-ridden version rather than the built-in one. (Maybe there
+should be an option to B<always> print keyword calls as C<CORE::name>.)
+
+=item *
+
+Some constants don't print correctly either with or without B<-d>.
+For instance, neither B::Deparse nor Data::Dumper know how to print
+dual-valued scalars correctly, as in:
+
+    use constant E2BIG => ($!=7); $y = E2BIG; print $y, 0+$y;
+
+=item *
+
+An input file that uses source filtering probably won't be deparsed into
+runnable code, because it will still include the B<use> declaration
+for the source filtering module, even though the code that is
+produced is already ordinary Perl which shouldn't be filtered again.
+
+=item *
+
+Optimised away statements are rendered as '???'. This includes statements that
+have a compile-time side-effect, such as the obscure
+
+    my $x if 0;
+
+which is not, consequently, deparsed correctly.
+
+=item *
+
+There are probably many more bugs on non-ASCII platforms (EBCDIC).
+
+=back
+
+=head1 AUTHOR
+
+Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier version
+by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with contributions from
+Gisle Aas, James Duncan, Albert Dvornik, Robin Houston, Dave Mitchell,
+Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons, and Rafael
+Garcia-Suarez.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Disassembler.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Disassembler.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Disassembler.pm	(revision 14489)
@@ -0,0 +1,233 @@
+#      Disassembler.pm
+#
+#      Copyright (c) 1996 Malcolm Beattie
+#
+#      You may distribute under the terms of either the GNU General Public
+#      License or the Artistic License, as specified in the README file.
+
+$B::Disassembler::VERSION = '1.05';
+
+package B::Disassembler::BytecodeStream;
+
+use FileHandle;
+use Carp;
+use Config qw(%Config);
+use B qw(cstring cast_I32);
+@ISA = qw(FileHandle);
+sub readn {
+    my ($fh, $len) = @_;
+    my $data;
+    read($fh, $data, $len);
+    croak "reached EOF while reading $len bytes" unless length($data) == $len;
+    return $data;
+}
+
+sub GET_U8 {
+    my $fh = shift;
+    my $c = $fh->getc;
+    croak "reached EOF while reading U8" unless defined($c);
+    return ord($c);
+}
+
+sub GET_U16 {
+    my $fh = shift;
+    my $str = $fh->readn(2);
+    croak "reached EOF while reading U16" unless length($str) == 2;
+    return unpack("S", $str);
+}
+
+sub GET_NV {
+    my $fh = shift;
+    my ($str, $c);
+    while (defined($c = $fh->getc) && $c ne "\0") {
+        $str .= $c;
+    }
+    croak "reached EOF while reading double" unless defined($c);
+    return $str;
+}
+
+sub GET_U32 {
+    my $fh = shift;
+    my $str = $fh->readn(4);
+    croak "reached EOF while reading U32" unless length($str) == 4;
+    return unpack("L", $str);
+}
+
+sub GET_I32 {
+    my $fh = shift;
+    my $str = $fh->readn(4);
+    croak "reached EOF while reading I32" unless length($str) == 4;
+    return unpack("l", $str);
+}
+
+sub GET_objindex { 
+    my $fh = shift;
+    my $str = $fh->readn(4);
+    croak "reached EOF while reading objindex" unless length($str) == 4;
+    return unpack("L", $str);
+}
+
+sub GET_opindex { 
+    my $fh = shift;
+    my $str = $fh->readn(4);
+    croak "reached EOF while reading opindex" unless length($str) == 4;
+    return unpack("L", $str);
+}
+
+sub GET_svindex { 
+    my $fh = shift;
+    my $str = $fh->readn(4);
+    croak "reached EOF while reading svindex" unless length($str) == 4;
+    return unpack("L", $str);
+}
+
+sub GET_pvindex { 
+    my $fh = shift;
+    my $str = $fh->readn(4);
+    croak "reached EOF while reading pvindex" unless length($str) == 4;
+    return unpack("L", $str);
+}
+
+sub GET_strconst {
+    my $fh = shift;
+    my ($str, $c);
+    $str = '';
+    while (defined($c = $fh->getc) && $c ne "\0") {
+	$str .= $c;
+    }
+    croak "reached EOF while reading strconst" unless defined($c);
+    return cstring($str);
+}
+
+sub GET_pvcontents {}
+
+sub GET_PV {
+    my $fh = shift;
+    my $str;
+    my $len = $fh->GET_U32;
+    if ($len) {
+	read($fh, $str, $len);
+	croak "reached EOF while reading PV" unless length($str) == $len;
+	return cstring($str);
+    } else {
+	return '""';
+    }
+}
+
+sub GET_comment_t {
+    my $fh = shift;
+    my ($str, $c);
+    while (defined($c = $fh->getc) && $c ne "\n") {
+	$str .= $c;
+    }
+    croak "reached EOF while reading comment" unless defined($c);
+    return cstring($str);
+}
+
+sub GET_double {
+    my $fh = shift;
+    my ($str, $c);
+    while (defined($c = $fh->getc) && $c ne "\0") {
+	$str .= $c;
+    }
+    croak "reached EOF while reading double" unless defined($c);
+    return $str;
+}
+
+sub GET_none {}
+
+sub GET_op_tr_array {
+    my $fh = shift;
+    my $len = unpack "S", $fh->readn(2);
+    my @ary = unpack "S*", $fh->readn($len*2);
+    return join(",", $len, @ary);
+}
+
+sub GET_IV64 {
+    my $fh = shift;
+    my $str = $fh->readn(8);
+    croak "reached EOF while reading I32" unless length($str) == 8;
+    return sprintf "0x%09llx", unpack("q", $str);
+}
+
+sub GET_IV {
+    $Config{ivsize} == 4 ? &GET_I32 : &GET_IV64;
+}
+
+sub GET_PADOFFSET {
+    $Config{ptrsize} == 8 ? &GET_IV64 : &GET_U32;
+}
+
+sub GET_long {
+    $Config{longsize} == 8 ? &GET_IV64 : &GET_U32;
+}
+
+
+package B::Disassembler;
+use Exporter;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(disassemble_fh get_header);
+use Carp;
+use strict;
+
+use B::Asmdata qw(%insn_data @insn_name);
+
+our( $magic, $archname, $blversion, $ivsize, $ptrsize );
+
+sub dis_header($){
+    my( $fh ) = @_;
+    $magic = $fh->GET_U32();
+    warn( "bad magic" ) if $magic != 0x43424c50;
+    $archname  = $fh->GET_strconst();
+    $blversion = $fh->GET_strconst();
+    $ivsize    = $fh->GET_U32();
+    $ptrsize   = $fh->GET_U32();
+}
+
+sub get_header(){
+    return( $magic, $archname, $blversion, $ivsize, $ptrsize);
+}
+
+sub disassemble_fh {
+    my ($fh, $out) = @_;
+    my ($c, $getmeth, $insn, $arg);
+    bless $fh, "B::Disassembler::BytecodeStream";
+    dis_header( $fh );
+    while (defined($c = $fh->getc)) {
+	$c = ord($c);
+	$insn = $insn_name[$c];
+	if (!defined($insn) || $insn eq "unused") {
+	    my $pos = $fh->tell - 1;
+	    die "Illegal instruction code $c at stream offset $pos\n";
+	}
+	$getmeth = $insn_data{$insn}->[2];
+	$arg = $fh->$getmeth();
+	if (defined($arg)) {
+	    &$out($insn, $arg);
+	} else {
+	    &$out($insn);
+	}
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Disassembler - Disassemble Perl bytecode
+
+=head1 SYNOPSIS
+
+	use Disassembler;
+
+=head1 DESCRIPTION
+
+See F<ext/B/B/Disassembler.pm>.
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Lint.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Lint.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Lint.pm	(revision 14489)
@@ -0,0 +1,392 @@
+package B::Lint;
+
+our $VERSION = '1.03';
+
+=head1 NAME
+
+B::Lint - Perl lint
+
+=head1 SYNOPSIS
+
+perl -MO=Lint[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+The B::Lint module is equivalent to an extended version of the B<-w>
+option of B<perl>. It is named after the program F<lint> which carries
+out a similar process for C programs.
+
+=head1 OPTIONS AND LINT CHECKS
+
+Option words are separated by commas (not whitespace) and follow the
+usual conventions of compiler backend options. Following any options
+(indicated by a leading B<->) come lint check arguments. Each such
+argument (apart from the special B<all> and B<none> options) is a
+word representing one possible lint check (turning on that check) or
+is B<no-foo> (turning off that check). Before processing the check
+arguments, a standard list of checks is turned on. Later options
+override earlier ones. Available options are:
+
+=over 8
+
+=item B<context>
+
+Produces a warning whenever an array is used in an implicit scalar
+context. For example, both of the lines
+
+    $foo = length(@bar);
+    $foo = @bar;
+
+will elicit a warning. Using an explicit B<scalar()> silences the
+warning. For example,
+
+    $foo = scalar(@bar);
+
+=item B<implicit-read> and B<implicit-write>
+
+These options produce a warning whenever an operation implicitly
+reads or (respectively) writes to one of Perl's special variables.
+For example, B<implicit-read> will warn about these:
+
+    /foo/;
+
+and B<implicit-write> will warn about these:
+
+    s/foo/bar/;
+
+Both B<implicit-read> and B<implicit-write> warn about this:
+
+    for (@a) { ... }
+
+=item B<bare-subs>
+
+This option warns whenever a bareword is implicitly quoted, but is also
+the name of a subroutine in the current package. Typical mistakes that it will
+trap are:
+
+    use constant foo => 'bar';
+    @a = ( foo => 1 );
+    $b{foo} = 2;
+
+Neither of these will do what a naive user would expect.
+
+=item B<dollar-underscore>
+
+This option warns whenever C<$_> is used either explicitly anywhere or
+as the implicit argument of a B<print> statement.
+
+=item B<private-names>
+
+This option warns on each use of any variable, subroutine or
+method name that lives in a non-current package but begins with
+an underscore ("_"). Warnings aren't issued for the special case
+of the single character name "_" by itself (e.g. C<$_> and C<@_>).
+
+=item B<undefined-subs>
+
+This option warns whenever an undefined subroutine is invoked.
+This option will only catch explicitly invoked subroutines such
+as C<foo()> and not indirect invocations such as C<&$subref()>
+or C<$obj-E<gt>meth()>. Note that some programs or modules delay
+definition of subs until runtime by means of the AUTOLOAD
+mechanism.
+
+=item B<regexp-variables>
+
+This option warns whenever one of the regexp variables C<$`>, C<$&> or C<$'>
+is used. Any occurrence of any of these variables in your
+program can slow your whole program down. See L<perlre> for
+details.
+
+=item B<all>
+
+Turn all warnings on.
+
+=item B<none>
+
+Turn all warnings off.
+
+=back
+
+=head1 NON LINT-CHECK OPTIONS
+
+=over 8
+
+=item B<-u Package>
+
+Normally, Lint only checks the main code of the program together
+with all subs defined in package main. The B<-u> option lets you
+include other package names whose subs are then checked by Lint.
+
+=back
+
+=head1 BUGS
+
+This is only a very preliminary version.
+
+This module doesn't work correctly on thread-enabled perls.
+
+=head1 AUTHOR
+
+Malcolm Beattie, mbeattie@sable.ox.ac.uk.
+
+=cut
+
+use strict;
+use B qw(walkoptree_slow main_root walksymtable svref_2object parents
+         OPf_WANT_LIST OPf_WANT OPf_STACKED G_ARRAY SVf_POK
+        );
+
+my $file = "unknown";		# shadows current filename
+my $line = 0;			# shadows current line number
+my $curstash = "main";		# shadows current stash
+
+# Lint checks
+my %check;
+my %implies_ok_context;
+BEGIN {
+    map($implies_ok_context{$_}++,
+	qw(scalar av2arylen aelem aslice helem hslice
+	   keys values hslice defined undef delete));
+}
+
+# Lint checks turned on by default
+my @default_checks = qw(context);
+
+my %valid_check;
+# All valid checks
+BEGIN {
+    map($valid_check{$_}++,
+	qw(context implicit_read implicit_write dollar_underscore
+	   private_names bare_subs undefined_subs regexp_variables));
+}
+
+# Debugging options
+my ($debug_op);
+
+my %done_cv;		# used to mark which subs have already been linted
+my @extra_packages;	# Lint checks mainline code and all subs which are
+			# in main:: or in one of these packages.
+
+sub warning {
+    my $format = (@_ < 2) ? "%s" : shift;
+    warn sprintf("$format at %s line %d\n", @_, $file, $line);
+}
+
+# This gimme can't cope with context that's only determined
+# at runtime via dowantarray().
+sub gimme {
+    my $op = shift;
+    my $flags = $op->flags;
+    if ($flags & OPf_WANT) {
+	return(($flags & OPf_WANT) == OPf_WANT_LIST ? 1 : 0);
+    }
+    return undef;
+}
+
+sub B::OP::lint {}
+
+sub B::COP::lint {
+    my $op = shift;
+    if ($op->name eq "nextstate") {
+	$file = $op->file;
+	$line = $op->line;
+	$curstash = $op->stash->NAME;
+    }
+}
+
+sub B::UNOP::lint {
+    my $op = shift;
+    my $opname = $op->name;
+    if ($check{context} && ($opname eq "rv2av" || $opname eq "rv2hv")) {
+	my $parent = parents->[0];
+	my $pname = $parent->name;
+	return if gimme($op) || $implies_ok_context{$pname};
+	# Two special cases to deal with: "foreach (@foo)" and "delete $a{$b}"
+	# null out the parent so we have to check for a parent of pp_null and
+	# a grandparent of pp_enteriter or pp_delete
+	if ($pname eq "null") {
+	    my $gpname = parents->[1]->name;
+	    return if $gpname eq "enteriter" || $gpname eq "delete";
+	}
+	warning("Implicit scalar context for %s in %s",
+		$opname eq "rv2av" ? "array" : "hash", $parent->desc);
+    }
+    if ($check{private_names} && $opname eq "method") {
+	my $methop = $op->first;
+	if ($methop->name eq "const") {
+	    my $method = $methop->sv->PV;
+	    if ($method =~ /^_/ && !defined(&{"$curstash\::$method"})) {
+		warning("Illegal reference to private method name $method");
+	    }
+	}
+    }
+}
+
+sub B::PMOP::lint {
+    my $op = shift;
+    if ($check{implicit_read}) {
+	if ($op->name eq "match" && !($op->flags & OPf_STACKED)) {
+	    warning('Implicit match on $_');
+	}
+    }
+    if ($check{implicit_write}) {
+	if ($op->name eq "subst" && !($op->flags & OPf_STACKED)) {
+	    warning('Implicit substitution on $_');
+	}
+    }
+}
+
+sub B::LOOP::lint {
+    my $op = shift;
+    if ($check{implicit_read} || $check{implicit_write}) {
+	if ($op->name eq "enteriter") {
+	    my $last = $op->last;
+	    if ($last->name eq "gv" && $last->gv->NAME eq "_") {
+		warning('Implicit use of $_ in foreach');
+	    }
+	}
+    }
+}
+
+sub B::SVOP::lint {
+    my $op = shift;
+    if ( $check{bare_subs} && $op->name eq 'const'
+         && $op->private & 64 )		# OPpCONST_BARE = 64 in op.h
+    {
+	my $sv = $op->sv;
+	if( $sv->FLAGS & SVf_POK && exists &{$curstash.'::'.$sv->PV} ) {
+	    warning "Bare sub name '" . $sv->PV . "' interpreted as string";
+	}
+    }
+    if ($check{dollar_underscore} && $op->name eq "gvsv"
+	&& $op->gv->NAME eq "_")
+    {
+	warning('Use of $_');
+    }
+    if ($check{private_names}) {
+	my $opname = $op->name;
+	if ($opname eq "gv" || $opname eq "gvsv") {
+	    my $gv = $op->gv;
+	    if ($gv->NAME =~ /^_./ && $gv->STASH->NAME ne $curstash) {
+		warning('Illegal reference to private name %s', $gv->NAME);
+	    }
+	} elsif ($opname eq "method_named") {
+	    my $method = $op->gv->PV;
+	    if ($method =~ /^_./) {
+		warning("Illegal reference to private method name $method");
+	    }
+	}
+    }
+    if ($check{undefined_subs}) {
+	if ($op->name eq "gv"
+	    && $op->next->name eq "entersub")
+	{
+	    my $gv = $op->gv;
+	    my $subname = $gv->STASH->NAME . "::" . $gv->NAME;
+	    no strict 'refs';
+	    if (!defined(&$subname)) {
+		$subname =~ s/^main:://;
+		warning('Undefined subroutine %s called', $subname);
+	    }
+	}
+    }
+    if ($check{regexp_variables} && $op->name eq "gvsv") {
+	my $name = $op->gv->NAME;
+	if ($name =~ /^[&'`]$/) {
+	    warning('Use of regexp variable $%s', $name);
+	}
+    }
+}
+
+sub B::GV::lintcv {
+    my $gv = shift;
+    my $cv = $gv->CV;
+    #warn sprintf("lintcv: %s::%s (done=%d)\n",
+    #		 $gv->STASH->NAME, $gv->NAME, $done_cv{$$cv});#debug
+    return if !$$cv || $done_cv{$$cv}++;
+    my $root = $cv->ROOT;
+    #warn "    root = $root (0x$$root)\n";#debug
+    walkoptree_slow($root, "lint") if $$root;
+}
+
+sub do_lint {
+    my %search_pack;
+    walkoptree_slow(main_root, "lint") if ${main_root()};
+    
+    # Now do subs in main
+    no strict qw(vars refs);
+    local(*glob);
+    for my $sym (keys %main::) {
+	next if $sym =~ /::$/;
+	*glob = $main::{$sym};
+        svref_2object(\*glob)->EGV->lintcv;
+    }
+
+    # Now do subs in non-main packages given by -u options
+    map { $search_pack{$_} = 1 } @extra_packages;
+    walksymtable(\%{"main::"}, "lintcv", sub {
+	my $package = shift;
+	$package =~ s/::$//;
+	#warn "Considering $package\n";#debug
+	return exists $search_pack{$package};
+    });
+}
+
+sub compile {
+    my @options = @_;
+    my ($option, $opt, $arg);
+    # Turn on default lint checks
+    for $opt (@default_checks) {
+	$check{$opt} = 1;
+    }
+  OPTION:
+    while ($option = shift @options) {
+	if ($option =~ /^-(.)(.*)/) {
+	    $opt = $1;
+	    $arg = $2;
+	} else {
+	    unshift @options, $option;
+	    last OPTION;
+	}
+	if ($opt eq "-" && $arg eq "-") {
+	    shift @options;
+	    last OPTION;
+	} elsif ($opt eq "D") {
+            $arg ||= shift @options;
+	    foreach $arg (split(//, $arg)) {
+		if ($arg eq "o") {
+		    B->debug(1);
+		} elsif ($arg eq "O") {
+		    $debug_op = 1;
+		}
+	    }
+	} elsif ($opt eq "u") {
+	    $arg ||= shift @options;
+	    push(@extra_packages, $arg);
+	}
+    }
+    foreach $opt (@default_checks, @options) {
+	$opt =~ tr/-/_/;
+	if ($opt eq "all") {
+	    %check = %valid_check;
+	}
+	elsif ($opt eq "none") {
+	    %check = ();
+	}
+	else {
+	    if ($opt =~ s/^no_//) {
+		$check{$opt} = 0;
+	    }
+	    else {
+		$check{$opt} = 1;
+	    }
+	    warn "No such check: $opt\n" unless defined $valid_check{$opt};
+	}
+    }
+    # Remaining arguments are things to check
+    
+    return \&do_lint;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Showlex.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Showlex.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Showlex.pm	(revision 14489)
@@ -0,0 +1,205 @@
+package B::Showlex;
+
+our $VERSION = '1.02';
+
+use strict;
+use B qw(svref_2object comppadlist class);
+use B::Terse ();
+use B::Concise ();
+
+#
+# Invoke as
+#     perl -MO=Showlex,foo bar.pl
+# to see the names of lexical variables used by &foo
+# or as
+#     perl -MO=Showlex bar.pl
+# to see the names of file scope lexicals used by bar.pl
+#
+
+
+# borrowed from B::Concise
+our $walkHandle = \*STDOUT;
+
+sub walk_output { # updates $walkHandle
+    $walkHandle = B::Concise::walk_output(@_);
+    #print "got $walkHandle";
+    #print $walkHandle "using it";
+    $walkHandle;
+}
+
+sub shownamearray {
+    my ($name, $av) = @_;
+    my @els = $av->ARRAY;
+    my $count = @els;
+    my $i;
+    print $walkHandle "$name has $count entries\n";
+    for ($i = 0; $i < $count; $i++) {
+	my $sv = $els[$i];
+	if (class($sv) ne "SPECIAL") {
+	    printf $walkHandle "$i: %s (0x%lx) %s\n", class($sv), $$sv, $sv->PVX;
+	} else {
+	    printf $walkHandle "$i: %s\n", $sv->terse;
+	    #printf $walkHandle "$i: %s\n", B::Concise::concise_sv($sv);
+	}
+    }
+}
+
+sub showvaluearray {
+    my ($name, $av) = @_;
+    my @els = $av->ARRAY;
+    my $count = @els;
+    my $i;
+    print $walkHandle "$name has $count entries\n";
+    for ($i = 0; $i < $count; $i++) {
+	printf $walkHandle "$i: %s\n", $els[$i]->terse;
+	#print $walkHandle "$i: %s\n", B::Concise::concise_sv($els[$i]);
+    }
+}
+
+sub showlex {
+    my ($objname, $namesav, $valsav) = @_;
+    shownamearray("Pad of lexical names for $objname", $namesav);
+    showvaluearray("Pad of lexical values for $objname", $valsav);
+}
+
+my ($newlex, $nosp1); # rendering state vars
+
+sub newlex { # drop-in for showlex
+    my ($objname, $names, $vals) = @_;
+    my @names = $names->ARRAY;
+    my @vals  = $vals->ARRAY;
+    my $count = @names;
+    print $walkHandle "$objname Pad has $count entries\n";
+    printf $walkHandle "0: %s\n", $names[0]->terse unless $nosp1;
+    for (my $i = 1; $i < $count; $i++) {
+	printf $walkHandle "$i: %s = %s\n", $names[$i]->terse, $vals[$i]->terse
+	    unless $nosp1 and $names[$i]->terse =~ /SPECIAL/;
+    }
+}
+
+sub showlex_obj {
+    my ($objname, $obj) = @_;
+    $objname =~ s/^&main::/&/;
+    showlex($objname, svref_2object($obj)->PADLIST->ARRAY) if !$newlex;
+    newlex ($objname, svref_2object($obj)->PADLIST->ARRAY) if  $newlex;
+}
+
+sub showlex_main {
+    showlex("comppadlist", comppadlist->ARRAY)	if !$newlex;
+    newlex ("main", comppadlist->ARRAY)		if  $newlex;
+}
+
+sub compile {
+    my @options = grep(/^-/, @_);
+    my @args = grep(!/^-/, @_);
+    for my $o (@options) {
+	$newlex = 1 if $o eq "-newlex";
+	$nosp1  = 1 if $o eq "-nosp";
+    }
+
+    return \&showlex_main unless @args;
+    return sub {
+	my $objref;
+	foreach my $objname (@args) {
+	    next unless $objname;	# skip nulls w/o carping
+
+	    if (ref $objname) {
+		print $walkHandle "B::Showlex::compile($objname)\n";
+		$objref = $objname;
+	    } else {
+		$objname = "main::$objname" unless $objname =~ /::/;
+		print $walkHandle "$objname:\n";
+		no strict 'refs';
+		die "err: unknown function ($objname)\n"
+		    unless *{$objname}{CODE};
+		$objref = \&$objname;
+	    }
+	    showlex_obj($objname, $objref);
+	}
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Showlex - Show lexical variables used in functions or files
+
+=head1 SYNOPSIS
+
+	perl -MO=Showlex[,-OPTIONS][,SUBROUTINE] foo.pl
+
+=head1 DESCRIPTION
+
+When a comma-separated list of subroutine names is given as options, Showlex
+prints the lexical variables used in those subroutines.  Otherwise, it prints
+the file-scope lexicals in the file.
+
+=head1 EXAMPLES
+
+Traditional form:
+
+ $ perl -MO=Showlex -e 'my ($i,$j,$k)=(1,"foo")'
+ Pad of lexical names for comppadlist has 4 entries
+ 0: SPECIAL #1 &PL_sv_undef
+ 1: PVNV (0x9db0fb0) $i
+ 2: PVNV (0x9db0f38) $j
+ 3: PVNV (0x9db0f50) $k
+ Pad of lexical values for comppadlist has 5 entries
+ 0: SPECIAL #1 &PL_sv_undef
+ 1: NULL (0x9da4234)
+ 2: NULL (0x9db0f2c)
+ 3: NULL (0x9db0f44)
+ 4: NULL (0x9da4264)
+ -e syntax OK
+
+New-style form:
+
+ $ perl -MO=Showlex,-newlex -e 'my ($i,$j,$k)=(1,"foo")'
+ main Pad has 4 entries
+ 0: SPECIAL #1 &PL_sv_undef
+ 1: PVNV (0xa0c4fb8) "$i" = NULL (0xa0b8234)
+ 2: PVNV (0xa0c4f40) "$j" = NULL (0xa0c4f34)
+ 3: PVNV (0xa0c4f58) "$k" = NULL (0xa0c4f4c)
+ -e syntax OK
+
+New form, no specials, outside O framework:
+
+ $ perl -MB::Showlex -e \
+    'my ($i,$j,$k)=(1,"foo"); B::Showlex::compile(-newlex,-nosp)->()'
+ main Pad has 4 entries
+ 1: PVNV (0x998ffb0) "$i" = IV (0x9983234) 1
+ 2: PVNV (0x998ff68) "$j" = PV (0x998ff5c) "foo"
+ 3: PVNV (0x998ff80) "$k" = NULL (0x998ff74)
+
+Note that this example shows the values of the lexicals, whereas the other
+examples did not (as they're compile-time only).
+
+=head2 OPTIONS
+
+The C<-newlex> option produces a more readable C<< name => value >> format,
+and is shown in the second example above.
+
+The C<-nosp> option eliminates reporting of SPECIALs, such as C<0: SPECIAL
+#1 &PL_sv_undef> above.  Reporting of SPECIALs can sometimes overwhelm
+your declared lexicals.
+
+=head1 SEE ALSO
+
+C<B::Showlex> can also be used outside of the O framework, as in the third
+example.  See C<B::Concise> for a fuller explanation of reasons.
+
+=head1 TODO
+
+Some of the reported info, such as hex addresses, is not particularly
+valuable.  Other information would be more useful for the typical
+programmer, such as line-numbers, pad-slot reuses, etc..  Given this,
+-newlex isnt a particularly good flag-name.
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Stackobj.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Stackobj.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Stackobj.pm	(revision 14489)
@@ -0,0 +1,349 @@
+#      Stackobj.pm
+#
+#      Copyright (c) 1996 Malcolm Beattie
+#
+#      You may distribute under the terms of either the GNU General Public
+#      License or the Artistic License, as specified in the README file.
+#
+package B::Stackobj;  
+
+our $VERSION = '1.00';
+
+use Exporter ();
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(set_callback T_UNKNOWN T_DOUBLE T_INT VALID_UNSIGNED
+		VALID_INT VALID_DOUBLE VALID_SV REGISTER TEMPORARY);
+%EXPORT_TAGS = (types => [qw(T_UNKNOWN T_DOUBLE T_INT)],
+		flags => [qw(VALID_INT VALID_DOUBLE VALID_SV
+			     VALID_UNSIGNED REGISTER TEMPORARY)]);
+
+use Carp qw(confess);
+use strict;
+use B qw(class SVf_IOK SVf_NOK SVf_IVisUV);
+
+# Types
+sub T_UNKNOWN () { 0 }
+sub T_DOUBLE ()  { 1 }
+sub T_INT ()     { 2 }
+sub T_SPECIAL () { 3 }
+
+# Flags
+sub VALID_INT ()	{ 0x01 }
+sub VALID_UNSIGNED ()	{ 0x02 }
+sub VALID_DOUBLE ()	{ 0x04 }
+sub VALID_SV ()		{ 0x08 }
+sub REGISTER ()		{ 0x10 } # no implicit write-back when calling subs
+sub TEMPORARY ()	{ 0x20 } # no implicit write-back needed at all
+sub SAVE_INT () 	{ 0x40 } #if int part needs to be saved at all
+sub SAVE_DOUBLE () 	{ 0x80 } #if double part needs to be saved at all
+
+
+#
+# Callback for runtime code generation
+#
+my $runtime_callback = sub { confess "set_callback not yet called" };
+sub set_callback (&) { $runtime_callback = shift }
+sub runtime { &$runtime_callback(@_) }
+
+#
+# Methods
+#
+
+sub write_back { confess "stack object does not implement write_back" }
+
+sub invalidate { shift->{flags} &= ~(VALID_INT |VALID_UNSIGNED | VALID_DOUBLE) }
+
+sub as_sv {
+    my $obj = shift;
+    if (!($obj->{flags} & VALID_SV)) {
+	$obj->write_back;
+	$obj->{flags} |= VALID_SV;
+    }
+    return $obj->{sv};
+}
+
+sub as_int {
+    my $obj = shift;
+    if (!($obj->{flags} & VALID_INT)) {
+	$obj->load_int;
+	$obj->{flags} |= VALID_INT|SAVE_INT;
+    }
+    return $obj->{iv};
+}
+
+sub as_double {
+    my $obj = shift;
+    if (!($obj->{flags} & VALID_DOUBLE)) {
+	$obj->load_double;
+	$obj->{flags} |= VALID_DOUBLE|SAVE_DOUBLE;
+    }
+    return $obj->{nv};
+}
+
+sub as_numeric {
+    my $obj = shift;
+    return $obj->{type} == T_INT ? $obj->as_int : $obj->as_double;
+}
+
+sub as_bool {
+	my $obj=shift;
+	if ($obj->{flags} & VALID_INT ){
+		return $obj->{iv}; 
+	}
+	if ($obj->{flags} & VALID_DOUBLE ){
+		return $obj->{nv}; 
+	}
+	return sprintf("(SvTRUE(%s))", $obj->as_sv) ;
+}
+
+#
+# Debugging methods
+#
+sub peek {
+    my $obj = shift;
+    my $type = $obj->{type};
+    my $flags = $obj->{flags};
+    my @flags;
+    if ($type == T_UNKNOWN) {
+	$type = "T_UNKNOWN";
+    } elsif ($type == T_INT) {
+	$type = "T_INT";
+    } elsif ($type == T_DOUBLE) {
+	$type = "T_DOUBLE";
+    } else {
+	$type = "(illegal type $type)";
+    }
+    push(@flags, "VALID_INT") if $flags & VALID_INT;
+    push(@flags, "VALID_DOUBLE") if $flags & VALID_DOUBLE;
+    push(@flags, "VALID_SV") if $flags & VALID_SV;
+    push(@flags, "REGISTER") if $flags & REGISTER;
+    push(@flags, "TEMPORARY") if $flags & TEMPORARY;
+    @flags = ("none") unless @flags;
+    return sprintf("%s type=$type flags=%s sv=$obj->{sv}",
+		   class($obj), join("|", @flags));
+}
+
+sub minipeek {
+    my $obj = shift;
+    my $type = $obj->{type};
+    my $flags = $obj->{flags};
+    if ($type == T_INT || $flags & VALID_INT) {
+	return $obj->{iv};
+    } elsif ($type == T_DOUBLE || $flags & VALID_DOUBLE) {
+	return $obj->{nv};
+    } else {
+	return $obj->{sv};
+    }
+}
+
+#
+# Caller needs to ensure that set_int, set_double,
+# set_numeric and set_sv are only invoked on legal lvalues.
+#
+sub set_int {
+    my ($obj, $expr,$unsigned) = @_;
+    runtime("$obj->{iv} = $expr;");
+    $obj->{flags} &= ~(VALID_SV | VALID_DOUBLE);
+    $obj->{flags} |= VALID_INT|SAVE_INT;
+    $obj->{flags} |= VALID_UNSIGNED if $unsigned; 
+}
+
+sub set_double {
+    my ($obj, $expr) = @_;
+    runtime("$obj->{nv} = $expr;");
+    $obj->{flags} &= ~(VALID_SV | VALID_INT);
+    $obj->{flags} |= VALID_DOUBLE|SAVE_DOUBLE;
+}
+
+sub set_numeric {
+    my ($obj, $expr) = @_;
+    if ($obj->{type} == T_INT) {
+	$obj->set_int($expr);
+    } else {
+	$obj->set_double($expr);
+    }
+}
+
+sub set_sv {
+    my ($obj, $expr) = @_;
+    runtime("SvSetSV($obj->{sv}, $expr);");
+    $obj->invalidate;
+    $obj->{flags} |= VALID_SV;
+}
+
+#
+# Stackobj::Padsv
+#
+
+@B::Stackobj::Padsv::ISA = 'B::Stackobj';
+sub B::Stackobj::Padsv::new {
+    my ($class, $type, $extra_flags, $ix, $iname, $dname) = @_;
+    $extra_flags |= SAVE_INT if $extra_flags & VALID_INT;
+    $extra_flags |= SAVE_DOUBLE if $extra_flags & VALID_DOUBLE;
+    bless {
+	type => $type,
+	flags => VALID_SV | $extra_flags,
+	sv => "PL_curpad[$ix]",
+	iv => "$iname",
+	nv => "$dname"
+    }, $class;
+}
+
+sub B::Stackobj::Padsv::load_int {
+    my $obj = shift;
+    if ($obj->{flags} & VALID_DOUBLE) {
+	runtime("$obj->{iv} = $obj->{nv};");
+    } else {
+	runtime("$obj->{iv} = SvIV($obj->{sv});");
+    }
+    $obj->{flags} |= VALID_INT|SAVE_INT;
+}
+
+sub B::Stackobj::Padsv::load_double {
+    my $obj = shift;
+    $obj->write_back;
+    runtime("$obj->{nv} = SvNV($obj->{sv});");
+    $obj->{flags} |= VALID_DOUBLE|SAVE_DOUBLE;
+}
+sub B::Stackobj::Padsv::save_int {
+    my $obj = shift;
+    return $obj->{flags} & SAVE_INT;
+}
+
+sub B::Stackobj::Padsv::save_double {
+    my $obj = shift;
+    return $obj->{flags} & SAVE_DOUBLE;
+}
+
+sub B::Stackobj::Padsv::write_back {
+    my $obj = shift;
+    my $flags = $obj->{flags};
+    return if $flags & VALID_SV;
+    if ($flags & VALID_INT) {
+        if ($flags & VALID_UNSIGNED ){
+            runtime("sv_setuv($obj->{sv}, $obj->{iv});");
+        }else{
+            runtime("sv_setiv($obj->{sv}, $obj->{iv});");
+        }     
+    } elsif ($flags & VALID_DOUBLE) {
+	runtime("sv_setnv($obj->{sv}, $obj->{nv});");
+    } else {
+	confess "write_back failed for lexical @{[$obj->peek]}\n";
+    }
+    $obj->{flags} |= VALID_SV;
+}
+
+#
+# Stackobj::Const
+#
+
+@B::Stackobj::Const::ISA = 'B::Stackobj';
+sub B::Stackobj::Const::new {
+    my ($class, $sv) = @_;
+    my $obj = bless {
+	flags => 0,
+	sv => $sv    # holds the SV object until write_back happens
+    }, $class;
+    if ( ref($sv) eq  "B::SPECIAL" ){
+	$obj->{type}= T_SPECIAL;	
+    }else{
+    	my $svflags = $sv->FLAGS;
+    	if ($svflags & SVf_IOK) {
+		$obj->{flags} = VALID_INT|VALID_DOUBLE;
+		$obj->{type} = T_INT;
+                if ($svflags & SVf_IVisUV){
+                    $obj->{flags} |= VALID_UNSIGNED;
+                    $obj->{nv} = $obj->{iv} = $sv->UVX;
+                }else{
+                    $obj->{nv} = $obj->{iv} = $sv->IV;
+                }
+    	} elsif ($svflags & SVf_NOK) {
+		$obj->{flags} = VALID_INT|VALID_DOUBLE;
+		$obj->{type} = T_DOUBLE;
+		$obj->{iv} = $obj->{nv} = $sv->NV;
+    	} else {
+		$obj->{type} = T_UNKNOWN;
+    	}
+    }
+    return $obj;
+}
+
+sub B::Stackobj::Const::write_back {
+    my $obj = shift;
+    return if $obj->{flags} & VALID_SV;
+    # Save the SV object and replace $obj->{sv} by its C source code name
+    $obj->{sv} = $obj->{sv}->save;
+    $obj->{flags} |= VALID_SV|VALID_INT|VALID_DOUBLE;
+}
+
+sub B::Stackobj::Const::load_int {
+    my $obj = shift;
+    if (ref($obj->{sv}) eq "B::RV"){
+       $obj->{iv} = int($obj->{sv}->RV->PV);
+    }else{
+       $obj->{iv} = int($obj->{sv}->PV);
+    }
+    $obj->{flags} |= VALID_INT;
+}
+
+sub B::Stackobj::Const::load_double {
+    my $obj = shift;
+    if (ref($obj->{sv}) eq "B::RV"){
+        $obj->{nv} = $obj->{sv}->RV->PV + 0.0;
+    }else{
+        $obj->{nv} = $obj->{sv}->PV + 0.0;
+    }
+    $obj->{flags} |= VALID_DOUBLE;
+}
+
+sub B::Stackobj::Const::invalidate {}
+
+#
+# Stackobj::Bool
+#
+
+@B::Stackobj::Bool::ISA = 'B::Stackobj';
+sub B::Stackobj::Bool::new {
+    my ($class, $preg) = @_;
+    my $obj = bless {
+	type => T_INT,
+	flags => VALID_INT|VALID_DOUBLE,
+	iv => $$preg,
+	nv => $$preg,
+	preg => $preg		# this holds our ref to the pseudo-reg
+    }, $class;
+    return $obj;
+}
+
+sub B::Stackobj::Bool::write_back {
+    my $obj = shift;
+    return if $obj->{flags} & VALID_SV;
+    $obj->{sv} = "($obj->{iv} ? &PL_sv_yes : &PL_sv_no)";
+    $obj->{flags} |= VALID_SV;
+}
+
+# XXX Might want to handle as_double/set_double/load_double?
+
+sub B::Stackobj::Bool::invalidate {}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Stackobj - Helper module for CC backend
+
+=head1 SYNOPSIS
+
+	use B::Stackobj;
+
+=head1 DESCRIPTION
+
+See F<ext/B/README>.
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Stash.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Stash.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Stash.pm	(revision 14489)
@@ -0,0 +1,52 @@
+# Stash.pm -- show what stashes are loaded
+# vishalb@hotmail.com 
+package B::Stash;
+
+our $VERSION = '1.00';
+
+=pod
+
+=head1 NAME
+
+B::Stash - show what stashes are loaded
+
+=cut
+
+BEGIN { %Seen = %INC }
+
+CHECK {
+	my @arr=scan($main::{"main::"});
+       @arr=map{s/\:\:$//;$_ eq "<none>"?():$_;}  @arr;
+	print "-umain,-u", join (",-u",@arr) ,"\n";
+}
+sub scan{
+	my $start=shift;
+	my $prefix=shift;
+	$prefix = '' unless defined $prefix;
+	my @return;
+	foreach my $key ( keys %{$start}){
+#		print $prefix,$key,"\n";
+		if ($key =~ /::$/){
+			unless ($start  eq ${$start}{$key} or $key eq "B::" ){
+		 		push @return, $key unless omit($prefix.$key);
+				foreach my $subscan ( scan(${$start}{$key},$prefix.$key)){
+		 			push @return, "$key".$subscan; 	
+				}
+			}
+		}
+	}
+	return @return;
+}
+sub omit{
+	my $module = shift;
+	my %omit=("DynaLoader::" => 1 , "XSLoader::" => 1, "CORE::" => 1 ,
+		"CORE::GLOBAL::" => 1, "UNIVERSAL::" => 1 );
+	return 1 if $omit{$module};
+	if ($module eq "IO::" or $module eq "IO::Handle::"){
+		$module =~ s/::/\//g;	
+		return 1 unless  $INC{$module};
+	}
+
+	return 0;
+}
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Terse.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Terse.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Terse.pm	(revision 14489)
@@ -0,0 +1,103 @@
+package B::Terse;
+
+our $VERSION = '1.03_01';
+
+use strict;
+use B qw(class);
+use B::Asmdata qw(@specialsv_name);
+use B::Concise qw(concise_subref set_style_standard);
+use Carp;
+
+sub terse {
+    my ($order, $subref) = @_;
+    set_style_standard("terse");
+    if ($order eq "exec") {
+	concise_subref('exec', $subref);
+    } else {
+	concise_subref('basic', $subref);
+    }
+}
+
+sub compile {
+    my @args = @_;
+    my $order = @args ? shift(@args) : "";
+    $order = "-exec" if $order eq "exec";
+    unshift @args, $order if $order ne "";
+    B::Concise::compile("-terse", @args);
+}
+
+sub indent {
+    my ($level) = @_ ? shift : 0;
+    return "    " x $level;
+}
+
+# Don't use this, at least on OPs in subroutines: it has no way of
+# getting to the pad, and will give wrong answers or crash.
+sub B::OP::terse {
+    carp "B::OP::terse is deprecated; use B::Concise instead";
+    B::Concise::b_terse(@_);
+}
+
+sub B::SV::terse {
+    my($sv, $level) = (@_, 0);
+    my %info;
+    B::Concise::concise_sv($sv, \%info);
+    my $s = indent($level)
+	. B::Concise::fmt_line(\%info, $sv,
+				 "#svclass~(?((#svaddr))?)~#svval", 0);
+    chomp $s;
+    print "$s\n" unless defined wantarray;
+    $s;
+}
+
+sub B::NULL::terse {
+    my ($sv, $level) = (@_, 0);
+    my $s = indent($level) . sprintf "%s (0x%lx)", class($sv), $$sv;
+    print "$s\n" unless defined wantarray;
+    $s;
+}
+
+sub B::SPECIAL::terse {
+    my ($sv, $level) = (@_, 0);
+    my $s = indent($level)
+	. sprintf( "%s #%d %s", class($sv), $$sv, $specialsv_name[$$sv]);
+    print "$s\n" unless defined wantarray;
+    $s;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Terse - Walk Perl syntax tree, printing terse info about ops
+
+=head1 SYNOPSIS
+
+	perl -MO=Terse[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+This version of B::Terse is really just a wrapper that calls B::Concise
+with the B<-terse> option. It is provided for compatibility with old scripts
+(and habits) but using B::Concise directly is now recommended instead.
+
+For compatibility with the old B::Terse, this module also adds a
+method named C<terse> to B::OP and B::SV objects. The B::SV method is
+largely compatible with the old one, though authors of new software
+might be advised to choose a more user-friendly output format. The
+B::OP C<terse> method, however, doesn't work well. Since B::Terse was
+first written, much more information in OPs has migrated to the
+scratchpad datastructure, but the C<terse> interface doesn't have any
+way of getting to the correct pad. As a kludge, the new version will
+always use the pad for the main program, but for OPs in subroutines
+this will give the wrong answer or crash.
+
+=head1 AUTHOR
+
+The original version of B::Terse was written by Malcolm Beattie,
+E<lt>mbeattie@sable.ox.ac.ukE<gt>. This wrapper was written by Stephen
+McCamant, E<lt>smcc@MIT.EDUE<gt>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/B/Xref.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/Xref.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/Xref.pm	(revision 14489)
@@ -0,0 +1,430 @@
+package B::Xref;
+
+our $VERSION = '1.01';
+
+=head1 NAME
+
+B::Xref - Generates cross reference reports for Perl programs
+
+=head1 SYNOPSIS
+
+perl -MO=Xref[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+The B::Xref module is used to generate a cross reference listing of all
+definitions and uses of variables, subroutines and formats in a Perl program.
+It is implemented as a backend for the Perl compiler.
+
+The report generated is in the following format:
+
+    File filename1
+      Subroutine subname1
+	Package package1
+	  object1        line numbers
+	  object2        line numbers
+	  ...
+	Package package2
+	...
+
+Each B<File> section reports on a single file. Each B<Subroutine> section
+reports on a single subroutine apart from the special cases
+"(definitions)" and "(main)". These report, respectively, on subroutine
+definitions found by the initial symbol table walk and on the main part of
+the program or module external to all subroutines.
+
+The report is then grouped by the B<Package> of each variable,
+subroutine or format with the special case "(lexicals)" meaning
+lexical variables. Each B<object> name (implicitly qualified by its
+containing B<Package>) includes its type character(s) at the beginning
+where possible. Lexical variables are easier to track and even
+included dereferencing information where possible.
+
+The C<line numbers> are a comma separated list of line numbers (some
+preceded by code letters) where that object is used in some way.
+Simple uses aren't preceded by a code letter. Introductions (such as
+where a lexical is first defined with C<my>) are indicated with the
+letter "i". Subroutine and method calls are indicated by the character
+"&".  Subroutine definitions are indicated by "s" and format
+definitions by "f".
+
+=head1 OPTIONS
+
+Option words are separated by commas (not whitespace) and follow the
+usual conventions of compiler backend options.
+
+=over 8
+
+=item C<-oFILENAME>
+
+Directs output to C<FILENAME> instead of standard output.
+
+=item C<-r>
+
+Raw output. Instead of producing a human-readable report, outputs a line
+in machine-readable form for each definition/use of a variable/sub/format.
+
+=item C<-d>
+
+Don't output the "(definitions)" sections.
+
+=item C<-D[tO]>
+
+(Internal) debug options, probably only useful if C<-r> included.
+The C<t> option prints the object on the top of the stack as it's
+being tracked. The C<O> option prints each operator as it's being
+processed in the execution order of the program.
+
+=back
+
+=head1 BUGS
+
+Non-lexical variables are quite difficult to track through a program.
+Sometimes the type of a non-lexical variable's use is impossible to
+determine. Introductions of non-lexical non-scalars don't seem to be
+reported properly.
+
+=head1 AUTHOR
+
+Malcolm Beattie, mbeattie@sable.ox.ac.uk.
+
+=cut
+
+use strict;
+use Config;
+use B qw(peekop class comppadlist main_start svref_2object walksymtable
+         OPpLVAL_INTRO SVf_POK OPpOUR_INTRO cstring
+        );
+
+sub UNKNOWN { ["?", "?", "?"] }
+
+my @pad;			# lexicals in current pad
+				# as ["(lexical)", type, name]
+my %done;			# keyed by $$op: set when each $op is done
+my $top = UNKNOWN;		# shadows top element of stack as
+				# [pack, type, name] (pack can be "(lexical)")
+my $file;			# shadows current filename
+my $line;			# shadows current line number
+my $subname;			# shadows current sub name
+my %table;			# Multi-level hash to record all uses etc.
+my @todo = ();			# List of CVs that need processing
+
+my %code = (intro => "i", used => "",
+	    subdef => "s", subused => "&",
+	    formdef => "f", meth => "->");
+
+
+# Options
+my ($debug_op, $debug_top, $nodefs, $raw);
+
+sub process {
+    my ($var, $event) = @_;
+    my ($pack, $type, $name) = @$var;
+    if ($type eq "*") {
+	if ($event eq "used") {
+	    return;
+	} elsif ($event eq "subused") {
+	    $type = "&";
+	}
+    }
+    $type =~ s/(.)\*$/$1/g;
+    if ($raw) {
+	printf "%-16s %-12s %5d %-12s %4s %-16s %s\n",
+	    $file, $subname, $line, $pack, $type, $name, $event;
+    } else {
+	# Wheee
+	push(@{$table{$file}->{$subname}->{$pack}->{$type.$name}->{$event}},
+	    $line);
+    }
+}
+
+sub load_pad {
+    my $padlist = shift;
+    my ($namelistav, $vallistav, @namelist, $ix);
+    @pad = ();
+    return if class($padlist) eq "SPECIAL";
+    ($namelistav,$vallistav) = $padlist->ARRAY;
+    @namelist = $namelistav->ARRAY;
+    for ($ix = 1; $ix < @namelist; $ix++) {
+	my $namesv = $namelist[$ix];
+	next if class($namesv) eq "SPECIAL";
+	my ($type, $name) = $namesv->PV =~ /^(.)([^\0]*)(\0.*)?$/;
+	$pad[$ix] = ["(lexical)", $type || '?', $name || '?'];
+    }
+    if ($Config{useithreads}) {
+	my (@vallist);
+	@vallist = $vallistav->ARRAY;
+	for ($ix = 1; $ix < @vallist; $ix++) {
+	    my $valsv = $vallist[$ix];
+	    next unless class($valsv) eq "GV";
+	    # these pad GVs don't have corresponding names, so same @pad
+	    # array can be used without collisions
+	    $pad[$ix] = [$valsv->STASH->NAME, "*", $valsv->NAME];
+	}
+    }
+}
+
+sub xref {
+    my $start = shift;
+    my $op;
+    for ($op = $start; $$op; $op = $op->next) {
+	last if $done{$$op}++;
+	warn sprintf("top = [%s, %s, %s]\n", @$top) if $debug_top;
+	warn peekop($op), "\n" if $debug_op;
+	my $opname = $op->name;
+	if ($opname =~ /^(or|and|mapwhile|grepwhile|range|cond_expr)$/) {
+	    xref($op->other);
+	} elsif ($opname eq "match" || $opname eq "subst") {
+	    xref($op->pmreplstart);
+	} elsif ($opname eq "substcont") {
+	    xref($op->other->pmreplstart);
+	    $op = $op->other;
+	    redo;
+	} elsif ($opname eq "enterloop") {
+	    xref($op->redoop);
+	    xref($op->nextop);
+	    xref($op->lastop);
+	} elsif ($opname eq "subst") {
+	    xref($op->pmreplstart);
+	} else {
+	    no strict 'refs';
+	    my $ppname = "pp_$opname";
+	    &$ppname($op) if defined(&$ppname);
+	}
+    }
+}
+
+sub xref_cv {
+    my $cv = shift;
+    my $pack = $cv->GV->STASH->NAME;
+    $subname = ($pack eq "main" ? "" : "$pack\::") . $cv->GV->NAME;
+    load_pad($cv->PADLIST);
+    xref($cv->START);
+    $subname = "(main)";
+}
+
+sub xref_object {
+    my $cvref = shift;
+    xref_cv(svref_2object($cvref));
+}
+
+sub xref_main {
+    $subname = "(main)";
+    load_pad(comppadlist);
+    xref(main_start);
+    while (@todo) {
+	xref_cv(shift @todo);
+    }
+}
+
+sub pp_nextstate {
+    my $op = shift;
+    $file = $op->file;
+    $line = $op->line;
+    $top = UNKNOWN;
+}
+
+sub pp_padsv {
+    my $op = shift;
+    $top = $pad[$op->targ];
+    process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
+}
+
+sub pp_padav { pp_padsv(@_) }
+sub pp_padhv { pp_padsv(@_) }
+
+sub deref {
+    my ($op, $var, $as) = @_;
+    $var->[1] = $as . $var->[1];
+    process($var, $op->private & OPpOUR_INTRO ? "intro" : "used");
+}
+
+sub pp_rv2cv { deref(shift, $top, "&"); }
+sub pp_rv2hv { deref(shift, $top, "%"); }
+sub pp_rv2sv { deref(shift, $top, "\$"); }
+sub pp_rv2av { deref(shift, $top, "\@"); }
+sub pp_rv2gv { deref(shift, $top, "*"); }
+
+sub pp_gvsv {
+    my $op = shift;
+    my $gv;
+    if ($Config{useithreads}) {
+	$top = $pad[$op->padix];
+	$top = UNKNOWN unless $top;
+	$top->[1] = '$';
+    }
+    else {
+	$gv = $op->gv;
+	$top = [$gv->STASH->NAME, '$', $gv->SAFENAME];
+    }
+    process($top, $op->private & OPpLVAL_INTRO ||
+                  $op->private & OPpOUR_INTRO   ? "intro" : "used");
+}
+
+sub pp_gv {
+    my $op = shift;
+    my $gv;
+    if ($Config{useithreads}) {
+	$top = $pad[$op->padix];
+	$top = UNKNOWN unless $top;
+	$top->[1] = '*';
+    }
+    else {
+	$gv = $op->gv;
+	$top = [$gv->STASH->NAME, "*", $gv->SAFENAME];
+    }
+    process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
+}
+
+sub pp_const {
+    my $op = shift;
+    my $sv = $op->sv;
+    # constant could be in the pad (under useithreads)
+    if ($$sv) {
+	$top = ["?", "",
+		(class($sv) ne "SPECIAL" && $sv->FLAGS & SVf_POK)
+		? cstring($sv->PV) : "?"];
+    }
+    else {
+	$top = $pad[$op->targ];
+	$top = UNKNOWN unless $top;
+    }
+}
+
+sub pp_method {
+    my $op = shift;
+    $top = ["(method)", "->".$top->[1], $top->[2]];
+}
+
+sub pp_entersub {
+    my $op = shift;
+    if ($top->[1] eq "m") {
+	process($top, "meth");
+    } else {
+	process($top, "subused");
+    }
+    $top = UNKNOWN;
+}
+
+#
+# Stuff for cross referencing definitions of variables and subs
+#
+
+sub B::GV::xref {
+    my $gv = shift;
+    my $cv = $gv->CV;
+    if ($$cv) {
+	#return if $done{$$cv}++;
+	$file = $gv->FILE;
+	$line = $gv->LINE;
+	process([$gv->STASH->NAME, "&", $gv->NAME], "subdef");
+	push(@todo, $cv);
+    }
+    my $form = $gv->FORM;
+    if ($$form) {
+	return if $done{$$form}++;
+	$file = $gv->FILE;
+	$line = $gv->LINE;
+	process([$gv->STASH->NAME, "", $gv->NAME], "formdef");
+    }
+}
+
+sub xref_definitions {
+    my ($pack, %exclude);
+    return if $nodefs;
+    $subname = "(definitions)";
+    foreach $pack (qw(B O AutoLoader DynaLoader XSLoader Config DB VMS
+		      strict vars FileHandle Exporter Carp PerlIO::Layer
+		      attributes utf8 warnings)) {
+        $exclude{$pack."::"} = 1;
+    }
+    no strict qw(vars refs);
+    walksymtable(\%{"main::"}, "xref", sub { !defined($exclude{$_[0]}) });
+}
+
+sub output {
+    return if $raw;
+    my ($file, $subname, $pack, $name, $ev, $perfile, $persubname,
+	$perpack, $pername, $perev);
+    foreach $file (sort(keys(%table))) {
+	$perfile = $table{$file};
+	print "File $file\n";
+	foreach $subname (sort(keys(%$perfile))) {
+	    $persubname = $perfile->{$subname};
+	    print "  Subroutine $subname\n";
+	    foreach $pack (sort(keys(%$persubname))) {
+		$perpack = $persubname->{$pack};
+		print "    Package $pack\n";
+		foreach $name (sort(keys(%$perpack))) {
+		    $pername = $perpack->{$name};
+		    my @lines;
+		    foreach $ev (qw(intro formdef subdef meth subused used)) {
+			$perev = $pername->{$ev};
+			if (defined($perev) && @$perev) {
+			    my $code = $code{$ev};
+			    push(@lines, map("$code$_", @$perev));
+			}
+		    }
+		    printf "      %-16s  %s\n", $name, join(", ", @lines);
+		}
+	    }
+	}
+    }
+}
+
+sub compile {
+    my @options = @_;
+    my ($option, $opt, $arg);
+  OPTION:
+    while ($option = shift @options) {
+	if ($option =~ /^-(.)(.*)/) {
+	    $opt = $1;
+	    $arg = $2;
+	} else {
+	    unshift @options, $option;
+	    last OPTION;
+	}
+	if ($opt eq "-" && $arg eq "-") {
+	    shift @options;
+	    last OPTION;
+	} elsif ($opt eq "o") {
+	    $arg ||= shift @options;
+	    open(STDOUT, ">$arg") or return "$arg: $!\n";
+	} elsif ($opt eq "d") {
+	    $nodefs = 1;
+	} elsif ($opt eq "r") {
+	    $raw = 1;
+	} elsif ($opt eq "D") {
+            $arg ||= shift @options;
+	    foreach $arg (split(//, $arg)) {
+		if ($arg eq "o") {
+		    B->debug(1);
+		} elsif ($arg eq "O") {
+		    $debug_op = 1;
+		} elsif ($arg eq "t") {
+		    $debug_top = 1;
+		}
+	    }
+	}
+    }
+    if (@options) {
+	return sub {
+	    my $objname;
+	    xref_definitions();
+	    foreach $objname (@options) {
+		$objname = "main::$objname" unless $objname =~ /::/;
+		eval "xref_object(\\&$objname)";
+		die "xref_object(\\&$objname) failed: $@" if $@;
+	    }
+	    output();
+	}
+    } else {
+	return sub {
+	    xref_definitions();
+	    xref_main();
+	    output();
+	}
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/B/assemble
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/assemble	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/assemble	(revision 14489)
@@ -0,0 +1,30 @@
+use B::Assembler qw(assemble_fh);
+use FileHandle;
+
+my ($filename, $fh, $out);
+
+if ($ARGV[0] eq "-d") {
+    B::Assembler::debug(1);
+    shift;
+}
+
+$out = \*STDOUT;
+
+if (@ARGV == 0) {
+    $fh = \*STDIN;
+    $filename = "-";
+} elsif (@ARGV == 1) {
+    $filename = $ARGV[0];
+    $fh = new FileHandle "<$filename";
+} elsif (@ARGV == 2) {
+    $filename = $ARGV[0];
+    $fh = new FileHandle "<$filename";
+    $out = new FileHandle ">$ARGV[1]";
+} else {
+    die "Usage: assemble [filename] [outfilename]\n";
+}
+
+binmode $out;
+$SIG{__WARN__} = sub { warn "$filename:@_" };
+$SIG{__DIE__} = sub { die "$filename: @_" };
+assemble_fh($fh, sub { print $out @_ });
Index: /for-distributions/trunk/bin/windows/perl/lib/B/cc_harness
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/cc_harness	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/cc_harness	(revision 14489)
@@ -0,0 +1,12 @@
+use Config;
+
+$libdir = $ENV{PERL_SRC} || "$Config{installarchlib}/CORE";
+
+if (!grep(/^-[cS]$/, @ARGV)) {
+    $linkargs = sprintf("%s $libdir/$Config{libperl} %s",
+			@Config{qw(ldflags libs)});
+}
+
+$cccmd = "$Config{cc} $Config{ccflags} -I$libdir @ARGV $linkargs";
+print "$cccmd\n";
+exec $cccmd;
Index: /for-distributions/trunk/bin/windows/perl/lib/B/disassemble
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/disassemble	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/disassemble	(revision 14489)
@@ -0,0 +1,22 @@
+use B::Disassembler qw(disassemble_fh);
+use FileHandle;
+
+my $fh;
+if (@ARGV == 0) {
+    $fh = \*STDIN;
+} elsif (@ARGV == 1) {
+    $fh = new FileHandle "<$ARGV[0]";
+} else {
+    die "Usage: disassemble [filename]\n";
+}
+
+sub print_insn {
+    my ($insn, $arg) = @_;
+    if (defined($arg)) {
+	printf "%s %s\n", $insn, $arg;
+    } else {
+	print $insn, "\n";
+    }
+}
+
+disassemble_fh($fh, \&print_insn);
Index: /for-distributions/trunk/bin/windows/perl/lib/B/makeliblinks
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/B/makeliblinks	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/B/makeliblinks	(revision 14489)
@@ -0,0 +1,54 @@
+use File::Find;
+use Config;
+
+if (@ARGV != 2) {
+    warn <<"EOT";
+Usage: makeliblinks libautodir targetdir
+where libautodir is the architecture-dependent auto directory
+(e.g. $Config::Config{archlib}/auto).
+EOT
+    exit 2;
+}
+
+my ($libautodir, $targetdir) = @ARGV;
+
+# Calculate relative path prefix from $targetdir to $libautodir
+sub relprefix {
+    my ($to, $from) = @_;
+    my $up;
+    for ($up = 0; substr($to, 0, length($from)) ne $from; $up++) {
+	$from =~ s(
+		   [^/]+	(?# a group of non-slashes) 
+		   /*		(?# maybe with some trailing slashes)
+		   $		(?# at the end of the path)
+                  )()x;
+    }
+    return (("../" x $up) . substr($to, length($from)));
+}
+
+my $relprefix = relprefix($libautodir, $targetdir);
+
+my ($dlext, $lib_ext) = @Config::Config{qw(dlext lib_ext)};
+
+sub link_if_library {
+    if (/\.($dlext|$lib_ext)$/o) {
+	my $ext = $1;
+	my $name = $File::Find::name;
+	if (substr($name, 0, length($libautodir) + 1) ne "$libautodir/") {
+	    die "directory of $name doesn't match $libautodir\n";
+	}
+	substr($name, 0, length($libautodir) + 1) = '';
+	my @parts = split(m(/), $name);
+	if ($parts[-1] ne "$parts[-2].$ext") {
+	    die "module name $_ doesn't match its directory $libautodir\n";
+	}
+	pop @parts;
+	my $libpath = "$targetdir/lib" . join("__", @parts) . ".$ext";
+	print "$libpath -> $relprefix/$name\n";
+	symlink("$relprefix/$name", $libpath)
+	    or warn "above link failed with error: $!\n";
+    }
+}
+
+find(\&link_if_library, $libautodir);
+exit 0;
Index: /for-distributions/trunk/bin/windows/perl/lib/Benchmark.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Benchmark.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Benchmark.pm	(revision 14489)
@@ -0,0 +1,1015 @@
+package Benchmark;
+
+use strict;
+
+
+=head1 NAME
+
+Benchmark - benchmark running times of Perl code
+
+=head1 SYNOPSIS
+
+    use Benchmark qw(:all) ;
+
+    timethis ($count, "code");
+
+    # Use Perl code in strings...
+    timethese($count, {
+	'Name1' => '...code1...',
+	'Name2' => '...code2...',
+    });
+
+    # ... or use subroutine references.
+    timethese($count, {
+	'Name1' => sub { ...code1... },
+	'Name2' => sub { ...code2... },
+    });
+
+    # cmpthese can be used both ways as well
+    cmpthese($count, {
+	'Name1' => '...code1...',
+	'Name2' => '...code2...',
+    });
+
+    cmpthese($count, {
+	'Name1' => sub { ...code1... },
+	'Name2' => sub { ...code2... },
+    });
+
+    # ...or in two stages
+    $results = timethese($count, 
+        {
+	    'Name1' => sub { ...code1... },
+	    'Name2' => sub { ...code2... },
+        },
+	'none'
+    );
+    cmpthese( $results ) ;
+
+    $t = timeit($count, '...other code...')
+    print "$count loops of other code took:",timestr($t),"\n";
+
+    $t = countit($time, '...other code...')
+    $count = $t->iters ;
+    print "$count loops of other code took:",timestr($t),"\n";
+
+    # enable hires wallclock timing if possible
+    use Benchmark ':hireswallclock';
+
+=head1 DESCRIPTION
+
+The Benchmark module encapsulates a number of routines to help you
+figure out how long it takes to execute some code.
+
+timethis - run a chunk of code several times
+
+timethese - run several chunks of code several times
+
+cmpthese - print results of timethese as a comparison chart
+
+timeit - run a chunk of code and see how long it goes
+
+countit - see how many times a chunk of code runs in a given time
+
+
+=head2 Methods
+
+=over 10
+
+=item new
+
+Returns the current time.   Example:
+
+    use Benchmark;
+    $t0 = new Benchmark;
+    # ... your code here ...
+    $t1 = new Benchmark;
+    $td = timediff($t1, $t0);
+    print "the code took:",timestr($td),"\n";
+
+=item debug
+
+Enables or disable debugging by setting the C<$Benchmark::Debug> flag:
+
+    debug Benchmark 1;
+    $t = timeit(10, ' 5 ** $Global ');
+    debug Benchmark 0;
+
+=item iters
+
+Returns the number of iterations.
+
+=back
+
+=head2 Standard Exports
+
+The following routines will be exported into your namespace
+if you use the Benchmark module:
+
+=over 10
+
+=item timeit(COUNT, CODE)
+
+Arguments: COUNT is the number of times to run the loop, and CODE is
+the code to run.  CODE may be either a code reference or a string to
+be eval'd; either way it will be run in the caller's package.
+
+Returns: a Benchmark object.
+
+=item timethis ( COUNT, CODE, [ TITLE, [ STYLE ]] )
+
+Time COUNT iterations of CODE. CODE may be a string to eval or a
+code reference; either way the CODE will run in the caller's package.
+Results will be printed to STDOUT as TITLE followed by the times.
+TITLE defaults to "timethis COUNT" if none is provided. STYLE
+determines the format of the output, as described for timestr() below.
+
+The COUNT can be zero or negative: this means the I<minimum number of
+CPU seconds> to run.  A zero signifies the default of 3 seconds.  For
+example to run at least for 10 seconds:
+
+	timethis(-10, $code)
+
+or to run two pieces of code tests for at least 3 seconds:
+
+	timethese(0, { test1 => '...', test2 => '...'})
+
+CPU seconds is, in UNIX terms, the user time plus the system time of
+the process itself, as opposed to the real (wallclock) time and the
+time spent by the child processes.  Less than 0.1 seconds is not
+accepted (-0.01 as the count, for example, will cause a fatal runtime
+exception).
+
+Note that the CPU seconds is the B<minimum> time: CPU scheduling and
+other operating system factors may complicate the attempt so that a
+little bit more time is spent.  The benchmark output will, however,
+also tell the number of C<$code> runs/second, which should be a more
+interesting number than the actually spent seconds.
+
+Returns a Benchmark object.
+
+=item timethese ( COUNT, CODEHASHREF, [ STYLE ] )
+
+The CODEHASHREF is a reference to a hash containing names as keys
+and either a string to eval or a code reference for each value.
+For each (KEY, VALUE) pair in the CODEHASHREF, this routine will
+call
+
+	timethis(COUNT, VALUE, KEY, STYLE)
+
+The routines are called in string comparison order of KEY.
+
+The COUNT can be zero or negative, see timethis().
+
+Returns a hash of Benchmark objects, keyed by name.
+
+=item timediff ( T1, T2 )
+
+Returns the difference between two Benchmark times as a Benchmark
+object suitable for passing to timestr().
+
+=item timestr ( TIMEDIFF, [ STYLE, [ FORMAT ] ] )
+
+Returns a string that formats the times in the TIMEDIFF object in
+the requested STYLE. TIMEDIFF is expected to be a Benchmark object
+similar to that returned by timediff().
+
+STYLE can be any of 'all', 'none', 'noc', 'nop' or 'auto'. 'all' shows
+each of the 5 times available ('wallclock' time, user time, system time,
+user time of children, and system time of children). 'noc' shows all
+except the two children times. 'nop' shows only wallclock and the
+two children times. 'auto' (the default) will act as 'all' unless
+the children times are both zero, in which case it acts as 'noc'.
+'none' prevents output.
+
+FORMAT is the L<printf(3)>-style format specifier (without the
+leading '%') to use to print the times. It defaults to '5.2f'.
+
+=back
+
+=head2 Optional Exports
+
+The following routines will be exported into your namespace
+if you specifically ask that they be imported:
+
+=over 10
+
+=item clearcache ( COUNT )
+
+Clear the cached time for COUNT rounds of the null loop.
+
+=item clearallcache ( )
+
+Clear all cached times.
+
+=item cmpthese ( COUNT, CODEHASHREF, [ STYLE ] )
+
+=item cmpthese ( RESULTSHASHREF, [ STYLE ] )
+
+Optionally calls timethese(), then outputs comparison chart.  This:
+
+    cmpthese( -1, { a => "++\$i", b => "\$i *= 2" } ) ;
+
+outputs a chart like:
+
+           Rate    b    a
+    b 2831802/s   -- -61%
+    a 7208959/s 155%   --
+
+This chart is sorted from slowest to fastest, and shows the percent speed
+difference between each pair of tests.
+
+c<cmpthese> can also be passed the data structure that timethese() returns:
+
+    $results = timethese( -1, { a => "++\$i", b => "\$i *= 2" } ) ;
+    cmpthese( $results );
+
+in case you want to see both sets of results.
+
+Returns a reference to an ARRAY of rows, each row is an ARRAY of cells from the
+above chart, including labels. This:
+
+    my $rows = cmpthese( -1, { a => '++$i', b => '$i *= 2' }, "none" );
+
+returns a data structure like:
+
+    [
+        [ '',       'Rate',   'b',    'a' ],
+        [ 'b', '2885232/s',  '--', '-59%' ],
+        [ 'a', '7099126/s', '146%',  '--' ],
+    ]
+
+B<NOTE>: This result value differs from previous versions, which returned
+the C<timethese()> result structure.  If you want that, just use the two
+statement C<timethese>...C<cmpthese> idiom shown above.
+
+Incidently, note the variance in the result values between the two examples;
+this is typical of benchmarking.  If this were a real benchmark, you would
+probably want to run a lot more iterations.
+
+=item countit(TIME, CODE)
+
+Arguments: TIME is the minimum length of time to run CODE for, and CODE is
+the code to run.  CODE may be either a code reference or a string to
+be eval'd; either way it will be run in the caller's package.
+
+TIME is I<not> negative.  countit() will run the loop many times to
+calculate the speed of CODE before running it for TIME.  The actual
+time run for will usually be greater than TIME due to system clock
+resolution, so it's best to look at the number of iterations divided
+by the times that you are concerned with, not just the iterations.
+
+Returns: a Benchmark object.
+
+=item disablecache ( )
+
+Disable caching of timings for the null loop. This will force Benchmark
+to recalculate these timings for each new piece of code timed.
+
+=item enablecache ( )
+
+Enable caching of timings for the null loop. The time taken for COUNT
+rounds of the null loop will be calculated only once for each
+different COUNT used.
+
+=item timesum ( T1, T2 )
+
+Returns the sum of two Benchmark times as a Benchmark object suitable
+for passing to timestr().
+
+=back
+
+=head2 :hireswallclock
+
+If the Time::HiRes module has been installed, you can specify the
+special tag C<:hireswallclock> for Benchmark (if Time::HiRes is not
+available, the tag will be silently ignored).  This tag will cause the
+wallclock time to be measured in microseconds, instead of integer
+seconds.  Note though that the speed computations are still conducted
+in CPU time, not wallclock time.
+
+=head1 NOTES
+
+The data is stored as a list of values from the time and times
+functions:
+
+      ($real, $user, $system, $children_user, $children_system, $iters)
+
+in seconds for the whole loop (not divided by the number of rounds).
+
+The timing is done using time(3) and times(3).
+
+Code is executed in the caller's package.
+
+The time of the null loop (a loop with the same
+number of rounds but empty loop body) is subtracted
+from the time of the real loop.
+
+The null loop times can be cached, the key being the
+number of rounds. The caching can be controlled using
+calls like these:
+
+    clearcache($key);
+    clearallcache();
+
+    disablecache();
+    enablecache();
+
+Caching is off by default, as it can (usually slightly) decrease
+accuracy and does not usually noticably affect runtimes.
+
+=head1 EXAMPLES
+
+For example,
+
+    use Benchmark qw( cmpthese ) ;
+    $x = 3;
+    cmpthese( -5, {
+        a => sub{$x*$x},
+        b => sub{$x**2},
+    } );
+
+outputs something like this:
+
+   Benchmark: running a, b, each for at least 5 CPU seconds...
+          Rate    b    a
+   b 1559428/s   -- -62%
+   a 4152037/s 166%   --
+
+
+while 
+
+    use Benchmark qw( timethese cmpthese ) ;
+    $x = 3;
+    $r = timethese( -5, {
+        a => sub{$x*$x},
+        b => sub{$x**2},
+    } );
+    cmpthese $r;
+
+outputs something like this:
+
+    Benchmark: running a, b, each for at least 5 CPU seconds...
+             a: 10 wallclock secs ( 5.14 usr +  0.13 sys =  5.27 CPU) @ 3835055.60/s (n=20210743)
+             b:  5 wallclock secs ( 5.41 usr +  0.00 sys =  5.41 CPU) @ 1574944.92/s (n=8520452)
+           Rate    b    a
+    b 1574945/s   -- -59%
+    a 3835056/s 144%   --
+
+
+=head1 INHERITANCE
+
+Benchmark inherits from no other class, except of course
+for Exporter.
+
+=head1 CAVEATS
+
+Comparing eval'd strings with code references will give you
+inaccurate results: a code reference will show a slightly slower
+execution time than the equivalent eval'd string.
+
+The real time timing is done using time(2) and
+the granularity is therefore only one second.
+
+Short tests may produce negative figures because perl
+can appear to take longer to execute the empty loop
+than a short test; try:
+
+    timethis(100,'1');
+
+The system time of the null loop might be slightly
+more than the system time of the loop with the actual
+code and therefore the difference might end up being E<lt> 0.
+
+=head1 SEE ALSO
+
+L<Devel::DProf> - a Perl code profiler
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi <F<jhi@iki.fi>>, Tim Bunce <F<Tim.Bunce@ig.co.uk>>
+
+=head1 MODIFICATION HISTORY
+
+September 8th, 1994; by Tim Bunce.
+
+March 28th, 1997; by Hugo van der Sanden: added support for code
+references and the already documented 'debug' method; revamped
+documentation.
+
+April 04-07th, 1997: by Jarkko Hietaniemi, added the run-for-some-time
+functionality.
+
+September, 1999; by Barrie Slaymaker: math fixes and accuracy and 
+efficiency tweaks.  Added cmpthese().  A result is now returned from 
+timethese().  Exposed countit() (was runfor()).
+
+December, 2001; by Nicholas Clark: make timestr() recognise the style 'none'
+and return an empty string. If cmpthese is calling timethese, make it pass the
+style in. (so that 'none' will suppress output). Make sub new dump its
+debugging output to STDERR, to be consistent with everything else.
+All bugs found while writing a regression test.
+
+September, 2002; by Jarkko Hietaniemi: add ':hireswallclock' special tag.
+
+February, 2004; by Chia-liang Kao: make cmpthese and timestr use time
+statistics for children instead of parent when the style is 'nop'.
+
+=cut
+
+# evaluate something in a clean lexical environment
+sub _doeval { no strict;  eval shift }
+
+#
+# put any lexicals at file scope AFTER here
+#
+
+use Carp;
+use Exporter;
+
+our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
+
+@ISA=qw(Exporter);
+@EXPORT=qw(timeit timethis timethese timediff timestr);
+@EXPORT_OK=qw(timesum cmpthese countit
+	      clearcache clearallcache disablecache enablecache);
+%EXPORT_TAGS=( all => [ @EXPORT, @EXPORT_OK ] ) ;
+
+$VERSION = 1.07;
+
+# --- ':hireswallclock' special handling
+
+my $hirestime;
+
+sub mytime () { time }
+
+init();
+
+sub BEGIN {
+    if (eval 'require Time::HiRes') {
+	import Time::HiRes qw(time);
+	$hirestime = \&Time::HiRes::time;
+    }
+}
+
+sub import {
+    my $class = shift;
+    if (grep { $_ eq ":hireswallclock" } @_) {
+	@_ = grep { $_ ne ":hireswallclock" } @_;
+	*mytime = $hirestime if defined $hirestime;
+    }
+    Benchmark->export_to_level(1, $class, @_);
+}
+
+our($Debug, $Min_Count, $Min_CPU, $Default_Format, $Default_Style,
+    %_Usage, %Cache, $Do_Cache);
+
+sub init {
+    $Debug = 0;
+    $Min_Count = 4;
+    $Min_CPU   = 0.4;
+    $Default_Format = '5.2f';
+    $Default_Style = 'auto';
+    # The cache can cause a slight loss of sys time accuracy. If a
+    # user does many tests (>10) with *very* large counts (>10000)
+    # or works on a very slow machine the cache may be useful.
+    disablecache();
+    clearallcache();
+}
+
+sub debug { $Debug = ($_[1] != 0); }
+
+sub usage { 
+    my $calling_sub = (caller(1))[3];
+    $calling_sub =~ s/^Benchmark:://;
+    return $_Usage{$calling_sub} || '';
+}
+
+# The cache needs two branches: 's' for strings and 'c' for code.  The
+# empty loop is different in these two cases.
+
+$_Usage{clearcache} = <<'USAGE';
+usage: clearcache($count);
+USAGE
+
+sub clearcache    { 
+    die usage unless @_ == 1;
+    delete $Cache{"$_[0]c"}; delete $Cache{"$_[0]s"}; 
+}
+
+$_Usage{clearallcache} = <<'USAGE';
+usage: clearallcache();
+USAGE
+
+sub clearallcache { 
+    die usage if @_;
+    %Cache = (); 
+}
+
+$_Usage{enablecache} = <<'USAGE';
+usage: enablecache();
+USAGE
+
+sub enablecache   {
+    die usage if @_;
+    $Do_Cache = 1; 
+}
+
+$_Usage{disablecache} = <<'USAGE';
+usage: disablecache();
+USAGE
+
+sub disablecache  {
+    die usage if @_;
+    $Do_Cache = 0; 
+}
+
+
+# --- Functions to process the 'time' data type
+
+sub new { my @t = (mytime, times, @_ == 2 ? $_[1] : 0);
+	  print STDERR "new=@t\n" if $Debug;
+	  bless \@t; }
+
+sub cpu_p { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $pu+$ps         ; }
+sub cpu_c { my($r,$pu,$ps,$cu,$cs) = @{$_[0]};         $cu+$cs ; }
+sub cpu_a { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $pu+$ps+$cu+$cs ; }
+sub real  { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $r              ; }
+sub iters { $_[0]->[5] ; }
+
+
+$_Usage{timediff} = <<'USAGE';
+usage: $result_diff = timediff($result1, $result2);
+USAGE
+
+sub timediff {
+    my($a, $b) = @_;
+
+    die usage unless ref $a and ref $b;
+
+    my @r;
+    for (my $i=0; $i < @$a; ++$i) {
+	push(@r, $a->[$i] - $b->[$i]);
+    }
+    bless \@r;
+}
+
+$_Usage{timesum} = <<'USAGE';
+usage: $sum = timesum($result1, $result2);
+USAGE
+
+sub timesum {
+    my($a, $b) = @_;
+
+    die usage unless ref $a and ref $b;
+
+    my @r;
+    for (my $i=0; $i < @$a; ++$i) {
+ 	push(@r, $a->[$i] + $b->[$i]);
+    }
+    bless \@r;
+}
+
+
+$_Usage{timestr} = <<'USAGE';
+usage: $formatted_result = timestr($result1);
+USAGE
+
+sub timestr {
+    my($tr, $style, $f) = @_;
+
+    die usage unless ref $tr;
+
+    my @t = @$tr;
+    warn "bad time value (@t)" unless @t==6;
+    my($r, $pu, $ps, $cu, $cs, $n) = @t;
+    my($pt, $ct, $tt) = ($tr->cpu_p, $tr->cpu_c, $tr->cpu_a);
+    $f = $Default_Format unless defined $f;
+    # format a time in the required style, other formats may be added here
+    $style ||= $Default_Style;
+    return '' if $style eq 'none';
+    $style = ($ct>0) ? 'all' : 'noc' if $style eq 'auto';
+    my $s = "@t $style"; # default for unknown style
+    my $w = $hirestime ? "%2g" : "%2d";
+    $s=sprintf("$w wallclock secs (%$f usr %$f sys + %$f cusr %$f csys = %$f CPU)",
+			    $r,$pu,$ps,$cu,$cs,$tt) if $style eq 'all';
+    $s=sprintf("$w wallclock secs (%$f usr + %$f sys = %$f CPU)",
+			    $r,$pu,$ps,$pt) if $style eq 'noc';
+    $s=sprintf("$w wallclock secs (%$f cusr + %$f csys = %$f CPU)",
+			    $r,$cu,$cs,$ct) if $style eq 'nop';
+    $s .= sprintf(" @ %$f/s (n=$n)", $n / ( $style eq 'nop' ? $cu + $cs : $pu + $ps ))
+	if $n && ($style eq 'nop' ? $cu+$cs : $pu+$ps);
+    $s;
+}
+
+sub timedebug {
+    my($msg, $t) = @_;
+    print STDERR "$msg",timestr($t),"\n" if $Debug;
+}
+
+# --- Functions implementing low-level support for timing loops
+
+$_Usage{runloop} = <<'USAGE';
+usage: runloop($number, [$string | $coderef])
+USAGE
+
+sub runloop {
+    my($n, $c) = @_;
+
+    $n+=0; # force numeric now, so garbage won't creep into the eval
+    croak "negative loopcount $n" if $n<0;
+    confess usage unless defined $c;
+    my($t0, $t1, $td); # before, after, difference
+
+    # find package of caller so we can execute code there
+    my($curpack) = caller(0);
+    my($i, $pack)= 0;
+    while (($pack) = caller(++$i)) {
+	last if $pack ne $curpack;
+    }
+
+    my ($subcode, $subref);
+    if (ref $c eq 'CODE') {
+	$subcode = "sub { for (1 .. $n) { local \$_; package $pack; &\$c; } }";
+        $subref  = eval $subcode;
+    }
+    else {
+	$subcode = "sub { for (1 .. $n) { local \$_; package $pack; $c;} }";
+        $subref  = _doeval($subcode);
+    }
+    croak "runloop unable to compile '$c': $@\ncode: $subcode\n" if $@;
+    print STDERR "runloop $n '$subcode'\n" if $Debug;
+
+    # Wait for the user timer to tick.  This makes the error range more like 
+    # -0.01, +0.  If we don't wait, then it's more like -0.01, +0.01.  This
+    # may not seem important, but it significantly reduces the chances of
+    # getting a too low initial $n in the initial, 'find the minimum' loop
+    # in &countit.  This, in turn, can reduce the number of calls to
+    # &runloop a lot, and thus reduce additive errors.
+    my $tbase = Benchmark->new(0)->[1];
+    while ( ( $t0 = Benchmark->new(0) )->[1] == $tbase ) {} ;
+    $subref->();
+    $t1 = Benchmark->new($n);
+    $td = &timediff($t1, $t0);
+    timedebug("runloop:",$td);
+    $td;
+}
+
+$_Usage{timeit} = <<'USAGE';
+usage: $result = timeit($count, 'code' );        or
+       $result = timeit($count, sub { code } );
+USAGE
+
+sub timeit {
+    my($n, $code) = @_;
+    my($wn, $wc, $wd);
+
+    die usage unless defined $code and
+                     (!ref $code or ref $code eq 'CODE');
+
+    printf STDERR "timeit $n $code\n" if $Debug;
+    my $cache_key = $n . ( ref( $code ) ? 'c' : 's' );
+    if ($Do_Cache && exists $Cache{$cache_key} ) {
+	$wn = $Cache{$cache_key};
+    } else {
+	$wn = &runloop($n, ref( $code ) ? sub { } : '' );
+	# Can't let our baseline have any iterations, or they get subtracted
+	# out of the result.
+	$wn->[5] = 0;
+	$Cache{$cache_key} = $wn;
+    }
+
+    $wc = &runloop($n, $code);
+
+    $wd = timediff($wc, $wn);
+    timedebug("timeit: ",$wc);
+    timedebug("      - ",$wn);
+    timedebug("      = ",$wd);
+
+    $wd;
+}
+
+
+my $default_for = 3;
+my $min_for     = 0.1;
+
+
+$_Usage{countit} = <<'USAGE';
+usage: $result = countit($time, 'code' );        or
+       $result = countit($time, sub { code } );
+USAGE
+
+sub countit {
+    my ( $tmax, $code ) = @_;
+
+    die usage unless @_;
+
+    if ( not defined $tmax or $tmax == 0 ) {
+	$tmax = $default_for;
+    } elsif ( $tmax < 0 ) {
+	$tmax = -$tmax;
+    }
+
+    die "countit($tmax, ...): timelimit cannot be less than $min_for.\n"
+	if $tmax < $min_for;
+
+    my ($n, $tc);
+
+    # First find the minimum $n that gives a significant timing.
+    for ($n = 1; ; $n *= 2 ) {
+	my $td = timeit($n, $code);
+	$tc = $td->[1] + $td->[2];
+	last if $tc > 0.1;
+    }
+
+    my $nmin = $n;
+
+    # Get $n high enough that we can guess the final $n with some accuracy.
+    my $tpra = 0.1 * $tmax; # Target/time practice.
+    while ( $tc < $tpra ) {
+	# The 5% fudge is to keep us from iterating again all
+	# that often (this speeds overall responsiveness when $tmax is big
+	# and we guess a little low).  This does not noticably affect 
+	# accuracy since we're not couting these times.
+	$n = int( $tpra * 1.05 * $n / $tc ); # Linear approximation.
+	my $td = timeit($n, $code);
+	my $new_tc = $td->[1] + $td->[2];
+        # Make sure we are making progress.
+        $tc = $new_tc > 1.2 * $tc ? $new_tc : 1.2 * $tc;
+    }
+
+    # Now, do the 'for real' timing(s), repeating until we exceed
+    # the max.
+    my $ntot  = 0;
+    my $rtot  = 0;
+    my $utot  = 0.0;
+    my $stot  = 0.0;
+    my $cutot = 0.0;
+    my $cstot = 0.0;
+    my $ttot  = 0.0;
+
+    # The 5% fudge is because $n is often a few % low even for routines
+    # with stable times and avoiding extra timeit()s is nice for
+    # accuracy's sake.
+    $n = int( $n * ( 1.05 * $tmax / $tc ) );
+
+    while () {
+	my $td = timeit($n, $code);
+	$ntot  += $n;
+	$rtot  += $td->[0];
+	$utot  += $td->[1];
+	$stot  += $td->[2];
+	$cutot += $td->[3];
+	$cstot += $td->[4];
+	$ttot = $utot + $stot;
+	last if $ttot >= $tmax;
+
+        $ttot = 0.01 if $ttot < 0.01;
+	my $r = $tmax / $ttot - 1; # Linear approximation.
+	$n = int( $r * $ntot );
+	$n = $nmin if $n < $nmin;
+    }
+
+    return bless [ $rtot, $utot, $stot, $cutot, $cstot, $ntot ];
+}
+
+# --- Functions implementing high-level time-then-print utilities
+
+sub n_to_for {
+    my $n = shift;
+    return $n == 0 ? $default_for : $n < 0 ? -$n : undef;
+}
+
+$_Usage{timethis} = <<'USAGE';
+usage: $result = timethis($time, 'code' );        or
+       $result = timethis($time, sub { code } );
+USAGE
+
+sub timethis{
+    my($n, $code, $title, $style) = @_;
+    my($t, $forn);
+
+    die usage unless defined $code and
+                     (!ref $code or ref $code eq 'CODE');
+
+    if ( $n > 0 ) {
+	croak "non-integer loopcount $n, stopped" if int($n)<$n;
+	$t = timeit($n, $code);
+	$title = "timethis $n" unless defined $title;
+    } else {
+	my $fort  = n_to_for( $n );
+	$t     = countit( $fort, $code );
+	$title = "timethis for $fort" unless defined $title;
+	$forn  = $t->[-1];
+    }
+    local $| = 1;
+    $style = "" unless defined $style;
+    printf("%10s: ", $title) unless $style eq 'none';
+    print timestr($t, $style, $Default_Format),"\n" unless $style eq 'none';
+
+    $n = $forn if defined $forn;
+
+    # A conservative warning to spot very silly tests.
+    # Don't assume that your benchmark is ok simply because
+    # you don't get this warning!
+    print "            (warning: too few iterations for a reliable count)\n"
+	if     $n < $Min_Count
+	    || ($t->real < 1 && $n < 1000)
+	    || $t->cpu_a < $Min_CPU;
+    $t;
+}
+
+
+$_Usage{timethese} = <<'USAGE';
+usage: timethese($count, { Name1 => 'code1', ... });        or
+       timethese($count, { Name1 => sub { code1 }, ... });
+USAGE
+
+sub timethese{
+    my($n, $alt, $style) = @_;
+    die usage unless ref $alt eq 'HASH';
+
+    my @names = sort keys %$alt;
+    $style = "" unless defined $style;
+    print "Benchmark: " unless $style eq 'none';
+    if ( $n > 0 ) {
+	croak "non-integer loopcount $n, stopped" if int($n)<$n;
+	print "timing $n iterations of" unless $style eq 'none';
+    } else {
+	print "running" unless $style eq 'none';
+    }
+    print " ", join(', ',@names) unless $style eq 'none';
+    unless ( $n > 0 ) {
+	my $for = n_to_for( $n );
+	print ", each" if $n > 1 && $style ne 'none';
+	print " for at least $for CPU seconds" unless $style eq 'none';
+    }
+    print "...\n" unless $style eq 'none';
+
+    # we could save the results in an array and produce a summary here
+    # sum, min, max, avg etc etc
+    my %results;
+    foreach my $name (@names) {
+        $results{$name} = timethis ($n, $alt -> {$name}, $name, $style);
+    }
+
+    return \%results;
+}
+
+
+$_Usage{cmpthese} = <<'USAGE';
+usage: cmpthese($count, { Name1 => 'code1', ... });        or
+       cmpthese($count, { Name1 => sub { code1 }, ... });  or
+       cmpthese($result, $style);
+USAGE
+
+sub cmpthese{
+    my ($results, $style);
+
+    if( ref $_[0] ) {
+        ($results, $style) = @_;
+    }
+    else {
+        my($count, $code) = @_[0,1];
+        $style = $_[2] if defined $_[2];
+
+        die usage unless ref $code eq 'HASH';
+
+        $results = timethese($count, $code, ($style || "none"));
+    }
+
+    $style = "" unless defined $style;
+
+    # Flatten in to an array of arrays with the name as the first field
+    my @vals = map{ [ $_, @{$results->{$_}} ] } keys %$results;
+
+    for (@vals) {
+	# The epsilon fudge here is to prevent div by 0.  Since clock
+	# resolutions are much larger, it's below the noise floor.
+	my $rate = $_->[6] / (( $style eq 'nop' ? $_->[4] + $_->[5]
+						: $_->[2] + $_->[3]) + 0.000000000000001 );
+	$_->[7] = $rate;
+    }
+
+    # Sort by rate
+    @vals = sort { $a->[7] <=> $b->[7] } @vals;
+
+    # If more than half of the rates are greater than one...
+    my $display_as_rate = @vals ? ($vals[$#vals>>1]->[7] > 1) : 0;
+
+    my @rows;
+    my @col_widths;
+
+    my @top_row = ( 
+        '', 
+	$display_as_rate ? 'Rate' : 's/iter', 
+	map { $_->[0] } @vals 
+    );
+
+    push @rows, \@top_row;
+    @col_widths = map { length( $_ ) } @top_row;
+
+    # Build the data rows
+    # We leave the last column in even though it never has any data.  Perhaps
+    # it should go away.  Also, perhaps a style for a single column of
+    # percentages might be nice.
+    for my $row_val ( @vals ) {
+	my @row;
+
+        # Column 0 = test name
+	push @row, $row_val->[0];
+	$col_widths[0] = length( $row_val->[0] )
+	    if length( $row_val->[0] ) > $col_widths[0];
+
+        # Column 1 = performance
+	my $row_rate = $row_val->[7];
+
+	# We assume that we'll never get a 0 rate.
+	my $rate = $display_as_rate ? $row_rate : 1 / $row_rate;
+
+	# Only give a few decimal places before switching to sci. notation,
+	# since the results aren't usually that accurate anyway.
+	my $format = 
+	   $rate >= 100 ? 
+	       "%0.0f" : 
+	   $rate >= 10 ?
+	       "%0.1f" :
+	   $rate >= 1 ?
+	       "%0.2f" :
+	   $rate >= 0.1 ?
+	       "%0.3f" :
+	       "%0.2e";
+
+	$format .= "/s"
+	    if $display_as_rate;
+
+	my $formatted_rate = sprintf( $format, $rate );
+	push @row, $formatted_rate;
+	$col_widths[1] = length( $formatted_rate )
+	    if length( $formatted_rate ) > $col_widths[1];
+
+        # Columns 2..N = performance ratios
+	my $skip_rest = 0;
+	for ( my $col_num = 0 ; $col_num < @vals ; ++$col_num ) {
+	    my $col_val = $vals[$col_num];
+	    my $out;
+	    if ( $skip_rest ) {
+		$out = '';
+	    }
+	    elsif ( $col_val->[0] eq $row_val->[0] ) {
+		$out = "--";
+		# $skip_rest = 1;
+	    }
+	    else {
+		my $col_rate = $col_val->[7];
+		$out = sprintf( "%.0f%%", 100*$row_rate/$col_rate - 100 );
+	    }
+	    push @row, $out;
+	    $col_widths[$col_num+2] = length( $out )
+		if length( $out ) > $col_widths[$col_num+2];
+
+	    # A little wierdness to set the first column width properly
+	    $col_widths[$col_num+2] = length( $col_val->[0] )
+		if length( $col_val->[0] ) > $col_widths[$col_num+2];
+	}
+	push @rows, \@row;
+    }
+
+    return \@rows if $style eq "none";
+
+    # Equalize column widths in the chart as much as possible without
+    # exceeding 80 characters.  This does not use or affect cols 0 or 1.
+    my @sorted_width_refs = 
+       sort { $$a <=> $$b } map { \$_ } @col_widths[2..$#col_widths];
+    my $max_width = ${$sorted_width_refs[-1]};
+
+    my $total = @col_widths - 1 ;
+    for ( @col_widths ) { $total += $_ }
+
+    STRETCHER:
+    while ( $total < 80 ) {
+	my $min_width = ${$sorted_width_refs[0]};
+	last
+	   if $min_width == $max_width;
+	for ( @sorted_width_refs ) {
+	    last 
+		if $$_ > $min_width;
+	    ++$$_;
+	    ++$total;
+	    last STRETCHER
+		if $total >= 80;
+	}
+    }
+
+    # Dump the output
+    my $format = join( ' ', map { "%${_}s" } @col_widths ) . "\n";
+    substr( $format, 1, 0 ) = '-';
+    for ( @rows ) {
+	printf $format, @$_;
+    }
+
+    return \@rows ;
+}
+
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ByteLoader.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ByteLoader.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ByteLoader.pm	(revision 14489)
@@ -0,0 +1,40 @@
+package ByteLoader;
+
+use XSLoader ();
+
+our $VERSION = '0.06';
+
+XSLoader::load 'ByteLoader', $VERSION;
+
+1;
+__END__
+
+=head1 NAME
+
+ByteLoader - load byte compiled perl code
+
+=head1 SYNOPSIS
+
+  use ByteLoader 0.06;
+  <byte code>
+
+  or just
+
+  perl -MByteLoader bytecode_file
+
+=head1 DESCRIPTION
+
+This module is used to load byte compiled perl code as produced by
+C<perl -MO=Bytecode=...>. It uses the source filter mechanism to read
+the byte code and insert it into the compiled code at the appropriate point.
+
+=head1 AUTHOR
+
+Tom Hughes <tom@compton.nu> based on the ideas of Tim Bunce and others.
+Many changes by Enache Adrian <enache@rdslink.ro> 2003 a.d.
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI.pm	(revision 14489)
@@ -0,0 +1,7623 @@
+package CGI;
+require 5.004;
+use Carp 'croak';
+
+# See the bottom of this file for the POD documentation.  Search for the
+# string '=head'.
+
+# You can run this file through either pod2man or pod2html to produce pretty
+# documentation in manual or html file format (these utilities are part of the
+# Perl 5 distribution).
+
+# Copyright 1995-1998 Lincoln D. Stein.  All rights reserved.
+# It may be used and modified freely, but I do request that this copyright
+# notice remain attached to the file.  You may modify this module as you 
+# wish, but if you redistribute a modified version, please attach a note
+# listing the modifications you have made.
+
+# The most recent version and complete docs are available at:
+#   http://stein.cshl.org/WWW/software/CGI/
+
+$CGI::revision = '$Id: CGI.pm,v 1.194 2005/12/06 22:12:56 lstein Exp $';
+$CGI::VERSION='3.15';
+
+# HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES.
+# UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING.
+# $CGITempFile::TMPDIRECTORY = '/usr/tmp';
+use CGI::Util qw(rearrange make_attributes unescape escape expires ebcdic2ascii ascii2ebcdic);
+
+#use constant XHTML_DTD => ['-//W3C//DTD XHTML Basic 1.0//EN',
+#                           'http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd'];
+
+use constant XHTML_DTD => ['-//W3C//DTD XHTML 1.0 Transitional//EN',
+                           'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'];
+
+{
+  local $^W = 0;
+  $TAINTED = substr("$0$^X",0,0);
+}
+
+$MOD_PERL = 0; # no mod_perl by default
+@SAVED_SYMBOLS = ();
+
+# >>>>> Here are some globals that you might want to adjust <<<<<<
+sub initialize_globals {
+    # Set this to 1 to enable copious autoloader debugging messages
+    $AUTOLOAD_DEBUG = 0;
+
+    # Set this to 1 to generate XTML-compatible output
+    $XHTML = 1;
+
+    # Change this to the preferred DTD to print in start_html()
+    # or use default_dtd('text of DTD to use');
+    $DEFAULT_DTD = [ '-//W3C//DTD HTML 4.01 Transitional//EN',
+		     'http://www.w3.org/TR/html4/loose.dtd' ] ;
+
+    # Set this to 1 to enable NOSTICKY scripts
+    # or: 
+    #    1) use CGI qw(-nosticky)
+    #    2) $CGI::nosticky(1)
+    $NOSTICKY = 0;
+
+    # Set this to 1 to enable NPH scripts
+    # or: 
+    #    1) use CGI qw(-nph)
+    #    2) CGI::nph(1)
+    #    3) print header(-nph=>1)
+    $NPH = 0;
+
+    # Set this to 1 to enable debugging from @ARGV
+    # Set to 2 to enable debugging from STDIN
+    $DEBUG = 1;
+
+    # Set this to 1 to make the temporary files created
+    # during file uploads safe from prying eyes
+    # or do...
+    #    1) use CGI qw(:private_tempfiles)
+    #    2) CGI::private_tempfiles(1);
+    $PRIVATE_TEMPFILES = 0;
+
+    # Set this to 1 to generate automatic tab indexes
+    $TABINDEX = 0;
+
+    # Set this to 1 to cause files uploaded in multipart documents
+    # to be closed, instead of caching the file handle
+    # or:
+    #    1) use CGI qw(:close_upload_files)
+    #    2) $CGI::close_upload_files(1);
+    # Uploads with many files run out of file handles.
+    # Also, for performance, since the file is already on disk,
+    # it can just be renamed, instead of read and written.
+    $CLOSE_UPLOAD_FILES = 0;
+
+    # Set this to a positive value to limit the size of a POSTing
+    # to a certain number of bytes:
+    $POST_MAX = -1;
+
+    # Change this to 1 to disable uploads entirely:
+    $DISABLE_UPLOADS = 0;
+
+    # Automatically determined -- don't change
+    $EBCDIC = 0;
+
+    # Change this to 1 to suppress redundant HTTP headers
+    $HEADERS_ONCE = 0;
+
+    # separate the name=value pairs by semicolons rather than ampersands
+    $USE_PARAM_SEMICOLONS = 1;
+
+    # Do not include undefined params parsed from query string
+    # use CGI qw(-no_undef_params);
+    $NO_UNDEF_PARAMS = 0;
+
+    # Other globals that you shouldn't worry about.
+    undef $Q;
+    $BEEN_THERE = 0;
+    $DTD_PUBLIC_IDENTIFIER = "";
+    undef @QUERY_PARAM;
+    undef %EXPORT;
+    undef $QUERY_CHARSET;
+    undef %QUERY_FIELDNAMES;
+
+    # prevent complaints by mod_perl
+    1;
+}
+
+# ------------------ START OF THE LIBRARY ------------
+
+*end_form = \&endform;
+
+# make mod_perlhappy
+initialize_globals();
+
+# FIGURE OUT THE OS WE'RE RUNNING UNDER
+# Some systems support the $^O variable.  If not
+# available then require() the Config library
+unless ($OS) {
+    unless ($OS = $^O) {
+	require Config;
+	$OS = $Config::Config{'osname'};
+    }
+}
+if ($OS =~ /^MSWin/i) {
+  $OS = 'WINDOWS';
+} elsif ($OS =~ /^VMS/i) {
+  $OS = 'VMS';
+} elsif ($OS =~ /^dos/i) {
+  $OS = 'DOS';
+} elsif ($OS =~ /^MacOS/i) {
+    $OS = 'MACINTOSH';
+} elsif ($OS =~ /^os2/i) {
+    $OS = 'OS2';
+} elsif ($OS =~ /^epoc/i) {
+    $OS = 'EPOC';
+} elsif ($OS =~ /^cygwin/i) {
+    $OS = 'CYGWIN';
+} else {
+    $OS = 'UNIX';
+}
+
+# Some OS logic.  Binary mode enabled on DOS, NT and VMS
+$needs_binmode = $OS=~/^(WINDOWS|DOS|OS2|MSWin|CYGWIN)/;
+
+# This is the default class for the CGI object to use when all else fails.
+$DefaultClass = 'CGI' unless defined $CGI::DefaultClass;
+
+# This is where to look for autoloaded routines.
+$AutoloadClass = $DefaultClass unless defined $CGI::AutoloadClass;
+
+# The path separator is a slash, backslash or semicolon, depending
+# on the paltform.
+$SL = {
+     UNIX    => '/',  OS2 => '\\', EPOC      => '/', CYGWIN => '/',
+     WINDOWS => '\\', DOS => '\\', MACINTOSH => ':', VMS    => '/'
+    }->{$OS};
+
+# This no longer seems to be necessary
+# Turn on NPH scripts by default when running under IIS server!
+# $NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/;
+$IIS++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/;
+
+# Turn on special checking for Doug MacEachern's modperl
+if (exists $ENV{MOD_PERL}) {
+  # mod_perl handlers may run system() on scripts using CGI.pm;
+  # Make sure so we don't get fooled by inherited $ENV{MOD_PERL}
+  if (exists $ENV{MOD_PERL_API_VERSION} && $ENV{MOD_PERL_API_VERSION} == 2) {
+    $MOD_PERL = 2;
+    require Apache2::Response;
+    require Apache2::RequestRec;
+    require Apache2::RequestUtil;
+    require Apache2::RequestIO;
+    require APR::Pool;
+  } else {
+    $MOD_PERL = 1;
+    require Apache;
+  }
+}
+
+# Turn on special checking for ActiveState's PerlEx
+$PERLEX++ if defined($ENV{'GATEWAY_INTERFACE'}) && $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-PerlEx/;
+
+# Define the CRLF sequence.  I can't use a simple "\r\n" because the meaning
+# of "\n" is different on different OS's (sometimes it generates CRLF, sometimes LF
+# and sometimes CR).  The most popular VMS web server
+# doesn't accept CRLF -- instead it wants a LR.  EBCDIC machines don't
+# use ASCII, so \015\012 means something different.  I find this all 
+# really annoying.
+$EBCDIC = "\t" ne "\011";
+if ($OS eq 'VMS') {
+  $CRLF = "\n";
+} elsif ($EBCDIC) {
+  $CRLF= "\r\n";
+} else {
+  $CRLF = "\015\012";
+}
+
+if ($needs_binmode) {
+    $CGI::DefaultClass->binmode(\*main::STDOUT);
+    $CGI::DefaultClass->binmode(\*main::STDIN);
+    $CGI::DefaultClass->binmode(\*main::STDERR);
+}
+
+%EXPORT_TAGS = (
+		':html2'=>['h1'..'h6',qw/p br hr ol ul li dl dt dd menu code var strong em
+			   tt u i b blockquote pre img a address cite samp dfn html head
+			   base body Link nextid title meta kbd start_html end_html
+			   input Select option comment charset escapeHTML/],
+		':html3'=>[qw/div table caption th td TR Tr sup Sub strike applet Param 
+			   embed basefont style span layer ilayer font frameset frame script small big Area Map/],
+                ':html4'=>[qw/abbr acronym bdo col colgroup del fieldset iframe
+                            ins label legend noframes noscript object optgroup Q 
+                            thead tbody tfoot/], 
+		':netscape'=>[qw/blink fontsize center/],
+		':form'=>[qw/textfield textarea filefield password_field hidden checkbox checkbox_group 
+			  submit reset defaults radio_group popup_menu button autoEscape
+			  scrolling_list image_button start_form end_form startform endform
+			  start_multipart_form end_multipart_form isindex tmpFileName uploadInfo URL_ENCODED MULTIPART/],
+		':cgi'=>[qw/param upload path_info path_translated request_uri url self_url script_name 
+			 cookie Dump
+			 raw_cookie request_method query_string Accept user_agent remote_host content_type
+			 remote_addr referer server_name server_software server_port server_protocol virtual_port
+			 virtual_host remote_ident auth_type http append
+			 save_parameters restore_parameters param_fetch
+			 remote_user user_name header redirect import_names put 
+			 Delete Delete_all url_param cgi_error/],
+		':ssl' => [qw/https/],
+		':cgi-lib' => [qw/ReadParse PrintHeader HtmlTop HtmlBot SplitParam Vars/],
+		':html' => [qw/:html2 :html3 :html4 :netscape/],
+		':standard' => [qw/:html2 :html3 :html4 :form :cgi/],
+		':push' => [qw/multipart_init multipart_start multipart_end multipart_final/],
+		':all' => [qw/:html2 :html3 :netscape :form :cgi :internal :html4/]
+		);
+
+# Custom 'can' method for both autoloaded and non-autoloaded subroutines.
+# Author: Cees Hek <cees@sitesuite.com.au>
+
+sub can {
+	my($class, $method) = @_;
+
+	# See if UNIVERSAL::can finds it.
+
+	if (my $func = $class -> SUPER::can($method) ){
+		return $func;
+	}
+
+	# Try to compile the function.
+
+	eval {
+		# _compile looks at $AUTOLOAD for the function name.
+
+		local $AUTOLOAD = join "::", $class, $method;
+		&_compile;
+	};
+
+	# Now that the function is loaded (if it exists)
+	# just use UNIVERSAL::can again to do the work.
+
+	return $class -> SUPER::can($method);
+}
+
+# to import symbols into caller
+sub import {
+    my $self = shift;
+
+    # This causes modules to clash.
+    undef %EXPORT_OK;
+    undef %EXPORT;
+
+    $self->_setup_symbols(@_);
+    my ($callpack, $callfile, $callline) = caller;
+
+    # To allow overriding, search through the packages
+    # Till we find one in which the correct subroutine is defined.
+    my @packages = ($self,@{"$self\:\:ISA"});
+    foreach $sym (keys %EXPORT) {
+	my $pck;
+	my $def = ${"$self\:\:AutoloadClass"} || $DefaultClass;
+	foreach $pck (@packages) {
+	    if (defined(&{"$pck\:\:$sym"})) {
+		$def = $pck;
+		last;
+	    }
+	}
+	*{"${callpack}::$sym"} = \&{"$def\:\:$sym"};
+    }
+}
+
+sub compile {
+    my $pack = shift;
+    $pack->_setup_symbols('-compile',@_);
+}
+
+sub expand_tags {
+    my($tag) = @_;
+    return ("start_$1","end_$1") if $tag=~/^(?:\*|start_|end_)(.+)/;
+    my(@r);
+    return ($tag) unless $EXPORT_TAGS{$tag};
+    foreach (@{$EXPORT_TAGS{$tag}}) {
+	push(@r,&expand_tags($_));
+    }
+    return @r;
+}
+
+#### Method: new
+# The new routine.  This will check the current environment
+# for an existing query string, and initialize itself, if so.
+####
+sub new {
+  my($class,@initializer) = @_;
+  my $self = {};
+
+  bless $self,ref $class || $class || $DefaultClass;
+  if (ref($initializer[0])
+      && (UNIVERSAL::isa($initializer[0],'Apache')
+	  ||
+	  UNIVERSAL::isa($initializer[0],'Apache2::RequestRec')
+	 )) {
+    $self->r(shift @initializer);
+  }
+ if (ref($initializer[0]) 
+     && (UNIVERSAL::isa($initializer[0],'CODE'))) {
+    $self->upload_hook(shift @initializer, shift @initializer);
+  }
+  if ($MOD_PERL) {
+    if ($MOD_PERL == 1) {
+      $self->r(Apache->request) unless $self->r;
+      my $r = $self->r;
+      $r->register_cleanup(\&CGI::_reset_globals);
+    }
+    else {
+      # XXX: once we have the new API
+      # will do a real PerlOptions -SetupEnv check
+      $self->r(Apache2::RequestUtil->request) unless $self->r;
+      my $r = $self->r;
+      $r->subprocess_env unless exists $ENV{REQUEST_METHOD};
+      $r->pool->cleanup_register(\&CGI::_reset_globals);
+    }
+    undef $NPH;
+  }
+  $self->_reset_globals if $PERLEX;
+  $self->init(@initializer);
+  return $self;
+}
+
+# We provide a DESTROY method so that we can ensure that
+# temporary files are closed (via Fh->DESTROY) before they
+# are unlinked (via CGITempFile->DESTROY) because it is not
+# possible to unlink an open file on Win32. We explicitly
+# call DESTROY on each, rather than just undefing them and
+# letting Perl DESTROY them by garbage collection, in case the
+# user is still holding any reference to them as well.
+sub DESTROY {
+  my $self = shift;
+  if ($OS eq 'WINDOWS') {
+    foreach my $href (values %{$self->{'.tmpfiles'}}) {
+      $href->{hndl}->DESTROY if defined $href->{hndl};
+      $href->{name}->DESTROY if defined $href->{name};
+    }
+  }
+}
+
+sub r {
+  my $self = shift;
+  my $r = $self->{'.r'};
+  $self->{'.r'} = shift if @_;
+  $r;
+}
+
+sub upload_hook {
+  my $self;
+  if (ref $_[0] eq 'CODE') {
+    $CGI::Q = $self = $CGI::DefaultClass->new(@_);
+  } else {
+    $self = shift;
+  }
+  my ($hook,$data) = @_;
+  $self->{'.upload_hook'} = $hook;
+  $self->{'.upload_data'} = $data;
+}
+
+#### Method: param
+# Returns the value(s)of a named parameter.
+# If invoked in a list context, returns the
+# entire list.  Otherwise returns the first
+# member of the list.
+# If name is not provided, return a list of all
+# the known parameters names available.
+# If more than one argument is provided, the
+# second and subsequent arguments are used to
+# set the value of the parameter.
+####
+sub param {
+    my($self,@p) = self_or_default(@_);
+    return $self->all_parameters unless @p;
+    my($name,$value,@other);
+
+    # For compatibility between old calling style and use_named_parameters() style, 
+    # we have to special case for a single parameter present.
+    if (@p > 1) {
+	($name,$value,@other) = rearrange([NAME,[DEFAULT,VALUE,VALUES]],@p);
+	my(@values);
+
+	if (substr($p[0],0,1) eq '-') {
+	    @values = defined($value) ? (ref($value) && ref($value) eq 'ARRAY' ? @{$value} : $value) : ();
+	} else {
+	    foreach ($value,@other) {
+		push(@values,$_) if defined($_);
+	    }
+	}
+	# If values is provided, then we set it.
+	if (@values) {
+	    $self->add_parameter($name);
+	    $self->{$name}=[@values];
+	}
+    } else {
+	$name = $p[0];
+    }
+
+    return unless defined($name) && $self->{$name};
+    return wantarray ? @{$self->{$name}} : $self->{$name}->[0];
+}
+
+sub self_or_default {
+    return @_ if defined($_[0]) && (!ref($_[0])) &&($_[0] eq 'CGI');
+    unless (defined($_[0]) && 
+	    (ref($_[0]) eq 'CGI' || UNIVERSAL::isa($_[0],'CGI')) # slightly optimized for common case
+	    ) {
+	$Q = $CGI::DefaultClass->new unless defined($Q);
+	unshift(@_,$Q);
+    }
+    return wantarray ? @_ : $Q;
+}
+
+sub self_or_CGI {
+    local $^W=0;                # prevent a warning
+    if (defined($_[0]) &&
+	(substr(ref($_[0]),0,3) eq 'CGI' 
+	 || UNIVERSAL::isa($_[0],'CGI'))) {
+	return @_;
+    } else {
+	return ($DefaultClass,@_);
+    }
+}
+
+########################################
+# THESE METHODS ARE MORE OR LESS PRIVATE
+# GO TO THE __DATA__ SECTION TO SEE MORE
+# PUBLIC METHODS
+########################################
+
+# Initialize the query object from the environment.
+# If a parameter list is found, this object will be set
+# to an associative array in which parameter names are keys
+# and the values are stored as lists
+# If a keyword list is found, this method creates a bogus
+# parameter list with the single parameter 'keywords'.
+
+sub init {
+  my $self = shift;
+  my($query_string,$meth,$content_length,$fh,@lines) = ('','','','');
+
+  my $initializer = shift;  # for backward compatibility
+  local($/) = "\n";
+
+    # set autoescaping on by default
+    $self->{'escape'} = 1;
+
+    # if we get called more than once, we want to initialize
+    # ourselves from the original query (which may be gone
+    # if it was read from STDIN originally.)
+    if (defined(@QUERY_PARAM) && !defined($initializer)) {
+	foreach (@QUERY_PARAM) {
+	    $self->param('-name'=>$_,'-value'=>$QUERY_PARAM{$_});
+	}
+	$self->charset($QUERY_CHARSET);
+	$self->{'.fieldnames'} = {%QUERY_FIELDNAMES};
+	return;
+    }
+
+    $meth=$ENV{'REQUEST_METHOD'} if defined($ENV{'REQUEST_METHOD'});
+    $content_length = defined($ENV{'CONTENT_LENGTH'}) ? $ENV{'CONTENT_LENGTH'} : 0;
+
+    $fh = to_filehandle($initializer) if $initializer;
+
+    # set charset to the safe ISO-8859-1
+    $self->charset('ISO-8859-1');
+
+  METHOD: {
+
+      # avoid unreasonably large postings
+      if (($POST_MAX > 0) && ($content_length > $POST_MAX)) {
+	# quietly read and discard the post
+	  my $buffer;
+          my $tmplength = $content_length;
+          while($tmplength > 0) {
+                 my $maxbuffer = ($tmplength < 10000)?$tmplength:10000;
+                 my $bytesread = $MOD_PERL ? $self->r->read($buffer,$maxbuffer) : read(STDIN,$buffer,$maxbuffer);
+                 $tmplength -= $bytesread;
+          }
+          $self->cgi_error("413 Request entity too large");
+          last METHOD;
+       }
+
+      # Process multipart postings, but only if the initializer is
+      # not defined.
+      if ($meth eq 'POST'
+	  && defined($ENV{'CONTENT_TYPE'})
+	  && $ENV{'CONTENT_TYPE'}=~m|^multipart/form-data|
+	  && !defined($initializer)
+	  ) {
+	  my($boundary) = $ENV{'CONTENT_TYPE'} =~ /boundary=\"?([^\";,]+)\"?/;
+	  $self->read_multipart($boundary,$content_length);
+	  last METHOD;
+      } 
+
+      # If initializer is defined, then read parameters
+      # from it.
+      if (defined($initializer)) {
+	  if (UNIVERSAL::isa($initializer,'CGI')) {
+	      $query_string = $initializer->query_string;
+	      last METHOD;
+	  }
+	  if (ref($initializer) && ref($initializer) eq 'HASH') {
+	      foreach (keys %$initializer) {
+		  $self->param('-name'=>$_,'-value'=>$initializer->{$_});
+	      }
+	      last METHOD;
+	  }
+	  
+	  if (defined($fh) && ($fh ne '')) {
+	      while (<$fh>) {
+		  chomp;
+		  last if /^=/;
+		  push(@lines,$_);
+	      }
+	      # massage back into standard format
+	      if ("@lines" =~ /=/) {
+		  $query_string=join("&",@lines);
+	      } else {
+		  $query_string=join("+",@lines);
+	      }
+	      last METHOD;
+	  }
+
+          if (defined($fh) && ($fh ne '')) {
+              while (<$fh>) {
+                  chomp;
+                  last if /^=/;
+                  push(@lines,$_);
+              }
+              # massage back into standard format
+              if ("@lines" =~ /=/) {
+                  $query_string=join("&",@lines);
+              } else {
+                  $query_string=join("+",@lines);
+              }
+              last METHOD;
+          }
+
+	  # last chance -- treat it as a string
+	  $initializer = $$initializer if ref($initializer) eq 'SCALAR';
+	  $query_string = $initializer;
+
+	  last METHOD;
+      }
+
+      # If method is GET or HEAD, fetch the query from
+      # the environment.
+      if ($meth=~/^(GET|HEAD)$/) {
+	  if ($MOD_PERL) {
+	    $query_string = $self->r->args;
+	  } else {
+	      $query_string = $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
+	      $query_string ||= $ENV{'REDIRECT_QUERY_STRING'} if defined $ENV{'REDIRECT_QUERY_STRING'};
+	  }
+	  last METHOD;
+      }
+
+      if ($meth eq 'POST') {
+	  $self->read_from_client(\$query_string,$content_length,0)
+	      if $content_length > 0;
+	  # Some people want to have their cake and eat it too!
+	  # Uncomment this line to have the contents of the query string
+	  # APPENDED to the POST data.
+	  # $query_string .= (length($query_string) ? '&' : '') . $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
+	  last METHOD;
+      }
+
+      # If $meth is not of GET, POST or HEAD, assume we're being debugged offline.
+      # Check the command line and then the standard input for data.
+      # We use the shellwords package in order to behave the way that
+      # UN*X programmers expect.
+      if ($DEBUG)
+      {
+          my $cmdline_ret = read_from_cmdline();
+          $query_string = $cmdline_ret->{'query_string'};
+          if (defined($cmdline_ret->{'subpath'}))
+          {
+              $self->path_info($cmdline_ret->{'subpath'});
+          }
+      }
+  }
+
+# YL: Begin Change for XML handler 10/19/2001
+    if ($meth eq 'POST'
+        && defined($ENV{'CONTENT_TYPE'})
+        && $ENV{'CONTENT_TYPE'} !~ m|^application/x-www-form-urlencoded|
+	&& $ENV{'CONTENT_TYPE'} !~ m|^multipart/form-data| ) {
+        my($param) = 'POSTDATA' ;
+        $self->add_parameter($param) ;
+      push (@{$self->{$param}},$query_string);
+      undef $query_string ;
+    }
+# YL: End Change for XML handler 10/19/2001
+
+    # We now have the query string in hand.  We do slightly
+    # different things for keyword lists and parameter lists.
+    if (defined $query_string && length $query_string) {
+	if ($query_string =~ /[&=;]/) {
+	    $self->parse_params($query_string);
+	} else {
+	    $self->add_parameter('keywords');
+	    $self->{'keywords'} = [$self->parse_keywordlist($query_string)];
+	}
+    }
+
+    # Special case.  Erase everything if there is a field named
+    # .defaults.
+    if ($self->param('.defaults')) {
+      $self->delete_all();
+    }
+
+    # Associative array containing our defined fieldnames
+    $self->{'.fieldnames'} = {};
+    foreach ($self->param('.cgifields')) {
+	$self->{'.fieldnames'}->{$_}++;
+    }
+    
+    # Clear out our default submission button flag if present
+    $self->delete('.submit');
+    $self->delete('.cgifields');
+
+    $self->save_request unless defined $initializer;
+}
+
+# FUNCTIONS TO OVERRIDE:
+# Turn a string into a filehandle
+sub to_filehandle {
+    my $thingy = shift;
+    return undef unless $thingy;
+    return $thingy if UNIVERSAL::isa($thingy,'GLOB');
+    return $thingy if UNIVERSAL::isa($thingy,'FileHandle');
+    if (!ref($thingy)) {
+	my $caller = 1;
+	while (my $package = caller($caller++)) {
+	    my($tmp) = $thingy=~/[\':]/ ? $thingy : "$package\:\:$thingy"; 
+	    return $tmp if defined(fileno($tmp));
+	}
+    }
+    return undef;
+}
+
+# send output to the browser
+sub put {
+    my($self,@p) = self_or_default(@_);
+    $self->print(@p);
+}
+
+# print to standard output (for overriding in mod_perl)
+sub print {
+    shift;
+    CORE::print(@_);
+}
+
+# get/set last cgi_error
+sub cgi_error {
+    my ($self,$err) = self_or_default(@_);
+    $self->{'.cgi_error'} = $err if defined $err;
+    return $self->{'.cgi_error'};
+}
+
+sub save_request {
+    my($self) = @_;
+    # We're going to play with the package globals now so that if we get called
+    # again, we initialize ourselves in exactly the same way.  This allows
+    # us to have several of these objects.
+    @QUERY_PARAM = $self->param; # save list of parameters
+    foreach (@QUERY_PARAM) {
+      next unless defined $_;
+      $QUERY_PARAM{$_}=$self->{$_};
+    }
+    $QUERY_CHARSET = $self->charset;
+    %QUERY_FIELDNAMES = %{$self->{'.fieldnames'}};
+}
+
+sub parse_params {
+    my($self,$tosplit) = @_;
+    my(@pairs) = split(/[&;]/,$tosplit);
+    my($param,$value);
+    foreach (@pairs) {
+	($param,$value) = split('=',$_,2);
+	next unless defined $param;
+	next if $NO_UNDEF_PARAMS and not defined $value;
+	$value = '' unless defined $value;
+	$param = unescape($param);
+	$value = unescape($value);
+	$self->add_parameter($param);
+	push (@{$self->{$param}},$value);
+    }
+}
+
+sub add_parameter {
+    my($self,$param)=@_;
+    return unless defined $param;
+    push (@{$self->{'.parameters'}},$param) 
+	unless defined($self->{$param});
+}
+
+sub all_parameters {
+    my $self = shift;
+    return () unless defined($self) && $self->{'.parameters'};
+    return () unless @{$self->{'.parameters'}};
+    return @{$self->{'.parameters'}};
+}
+
+# put a filehandle into binary mode (DOS)
+sub binmode {
+    return unless defined($_[1]) && defined fileno($_[1]);
+    CORE::binmode($_[1]);
+}
+
+sub _make_tag_func {
+    my ($self,$tagname) = @_;
+    my $func = qq(
+	sub $tagname {
+         my (\$q,\$a,\@rest) = self_or_default(\@_);
+         my(\$attr) = '';
+	 if (ref(\$a) && ref(\$a) eq 'HASH') {
+	    my(\@attr) = make_attributes(\$a,\$q->{'escape'});
+	    \$attr = " \@attr" if \@attr;
+	  } else {
+	    unshift \@rest,\$a if defined \$a;
+	  }
+	);
+    if ($tagname=~/start_(\w+)/i) {
+	$func .= qq! return "<\L$1\E\$attr>";} !;
+    } elsif ($tagname=~/end_(\w+)/i) {
+	$func .= qq! return "<\L/$1\E>"; } !;
+    } else {
+	$func .= qq#
+	    return \$XHTML ? "\L<$tagname\E\$attr />" : "\L<$tagname\E\$attr>" unless \@rest;
+	    my(\$tag,\$untag) = ("\L<$tagname\E\$attr>","\L</$tagname>\E");
+	    my \@result = map { "\$tag\$_\$untag" } 
+                              (ref(\$rest[0]) eq 'ARRAY') ? \@{\$rest[0]} : "\@rest";
+	    return "\@result";
+            }#;
+    }
+return $func;
+}
+
+sub AUTOLOAD {
+    print STDERR "CGI::AUTOLOAD for $AUTOLOAD\n" if $CGI::AUTOLOAD_DEBUG;
+    my $func = &_compile;
+    goto &$func;
+}
+
+sub _compile {
+    my($func) = $AUTOLOAD;
+    my($pack,$func_name);
+    {
+	local($1,$2); # this fixes an obscure variable suicide problem.
+	$func=~/(.+)::([^:]+)$/;
+	($pack,$func_name) = ($1,$2);
+	$pack=~s/::SUPER$//;	# fix another obscure problem
+	$pack = ${"$pack\:\:AutoloadClass"} || $CGI::DefaultClass
+	    unless defined(${"$pack\:\:AUTOLOADED_ROUTINES"});
+
+        my($sub) = \%{"$pack\:\:SUBS"};
+        unless (%$sub) {
+	   my($auto) = \${"$pack\:\:AUTOLOADED_ROUTINES"};
+	   local ($@,$!);
+	   eval "package $pack; $$auto";
+	   croak("$AUTOLOAD: $@") if $@;
+           $$auto = '';  # Free the unneeded storage (but don't undef it!!!)
+       }
+       my($code) = $sub->{$func_name};
+
+       $code = "sub $AUTOLOAD { }" if (!$code and $func_name eq 'DESTROY');
+       if (!$code) {
+	   (my $base = $func_name) =~ s/^(start_|end_)//i;
+	   if ($EXPORT{':any'} || 
+	       $EXPORT{'-any'} ||
+	       $EXPORT{$base} || 
+	       (%EXPORT_OK || grep(++$EXPORT_OK{$_},&expand_tags(':html')))
+	           && $EXPORT_OK{$base}) {
+	       $code = $CGI::DefaultClass->_make_tag_func($func_name);
+	   }
+       }
+       croak("Undefined subroutine $AUTOLOAD\n") unless $code;
+       local ($@,$!);
+       eval "package $pack; $code";
+       if ($@) {
+	   $@ =~ s/ at .*\n//;
+	   croak("$AUTOLOAD: $@");
+       }
+    }       
+    CORE::delete($sub->{$func_name});  #free storage
+    return "$pack\:\:$func_name";
+}
+
+sub _selected {
+  my $self = shift;
+  my $value = shift;
+  return '' unless $value;
+  return $XHTML ? qq(selected="selected" ) : qq(selected );
+}
+
+sub _checked {
+  my $self = shift;
+  my $value = shift;
+  return '' unless $value;
+  return $XHTML ? qq(checked="checked" ) : qq(checked );
+}
+
+sub _reset_globals { initialize_globals(); }
+
+sub _setup_symbols {
+    my $self = shift;
+    my $compile = 0;
+
+    # to avoid reexporting unwanted variables
+    undef %EXPORT;
+
+    foreach (@_) {
+	$HEADERS_ONCE++,         next if /^[:-]unique_headers$/;
+	$NPH++,                  next if /^[:-]nph$/;
+	$NOSTICKY++,             next if /^[:-]nosticky$/;
+	$DEBUG=0,                next if /^[:-]no_?[Dd]ebug$/;
+	$DEBUG=2,                next if /^[:-][Dd]ebug$/;
+	$USE_PARAM_SEMICOLONS++, next if /^[:-]newstyle_urls$/;
+	$XHTML++,                next if /^[:-]xhtml$/;
+	$XHTML=0,                next if /^[:-]no_?xhtml$/;
+	$USE_PARAM_SEMICOLONS=0, next if /^[:-]oldstyle_urls$/;
+	$PRIVATE_TEMPFILES++,    next if /^[:-]private_tempfiles$/;
+	$TABINDEX++,             next if /^[:-]tabindex$/;
+	$CLOSE_UPLOAD_FILES++,   next if /^[:-]close_upload_files$/;
+	$EXPORT{$_}++,           next if /^[:-]any$/;
+	$compile++,              next if /^[:-]compile$/;
+	$NO_UNDEF_PARAMS++,      next if /^[:-]no_undef_params$/;
+	
+	# This is probably extremely evil code -- to be deleted some day.
+	if (/^[-]autoload$/) {
+	    my($pkg) = caller(1);
+	    *{"${pkg}::AUTOLOAD"} = sub { 
+		my($routine) = $AUTOLOAD;
+		$routine =~ s/^.*::/CGI::/;
+		&$routine;
+	    };
+	    next;
+	}
+
+	foreach (&expand_tags($_)) {
+	    tr/a-zA-Z0-9_//cd;  # don't allow weird function names
+	    $EXPORT{$_}++;
+	}
+    }
+    _compile_all(keys %EXPORT) if $compile;
+    @SAVED_SYMBOLS = @_;
+}
+
+sub charset {
+  my ($self,$charset) = self_or_default(@_);
+  $self->{'.charset'} = $charset if defined $charset;
+  $self->{'.charset'};
+}
+
+sub element_id {
+  my ($self,$new_value) = self_or_default(@_);
+  $self->{'.elid'} = $new_value if defined $new_value;
+  sprintf('%010d',$self->{'.elid'}++);
+}
+
+sub element_tab {
+  my ($self,$new_value) = self_or_default(@_);
+  $self->{'.etab'} ||= 1;
+  $self->{'.etab'} = $new_value if defined $new_value;
+  my $tab = $self->{'.etab'}++;
+  return '' unless $TABINDEX or defined $new_value;
+  return qq(tabindex="$tab" );
+}
+
+###############################################################################
+################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND ####################
+###############################################################################
+$AUTOLOADED_ROUTINES = '';      # get rid of -w warning
+$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
+
+%SUBS = (
+
+'URL_ENCODED'=> <<'END_OF_FUNC',
+sub URL_ENCODED { 'application/x-www-form-urlencoded'; }
+END_OF_FUNC
+
+'MULTIPART' => <<'END_OF_FUNC',
+sub MULTIPART {  'multipart/form-data'; }
+END_OF_FUNC
+
+'SERVER_PUSH' => <<'END_OF_FUNC',
+sub SERVER_PUSH { 'multipart/x-mixed-replace;boundary="' . shift() . '"'; }
+END_OF_FUNC
+
+'new_MultipartBuffer' => <<'END_OF_FUNC',
+# Create a new multipart buffer
+sub new_MultipartBuffer {
+    my($self,$boundary,$length) = @_;
+    return MultipartBuffer->new($self,$boundary,$length);
+}
+END_OF_FUNC
+
+'read_from_client' => <<'END_OF_FUNC',
+# Read data from a file handle
+sub read_from_client {
+    my($self, $buff, $len, $offset) = @_;
+    local $^W=0;                # prevent a warning
+    return $MOD_PERL
+        ? $self->r->read($$buff, $len, $offset)
+        : read(\*STDIN, $$buff, $len, $offset);
+}
+END_OF_FUNC
+
+'delete' => <<'END_OF_FUNC',
+#### Method: delete
+# Deletes the named parameter entirely.
+####
+sub delete {
+    my($self,@p) = self_or_default(@_);
+    my(@names) = rearrange([NAME],@p);
+    my @to_delete = ref($names[0]) eq 'ARRAY' ? @$names[0] : @names;
+    my %to_delete;
+    foreach my $name (@to_delete)
+    {
+        CORE::delete $self->{$name};
+        CORE::delete $self->{'.fieldnames'}->{$name};
+        $to_delete{$name}++;
+    }
+    @{$self->{'.parameters'}}=grep { !exists($to_delete{$_}) } $self->param();
+    return;
+}
+END_OF_FUNC
+
+#### Method: import_names
+# Import all parameters into the given namespace.
+# Assumes namespace 'Q' if not specified
+####
+'import_names' => <<'END_OF_FUNC',
+sub import_names {
+    my($self,$namespace,$delete) = self_or_default(@_);
+    $namespace = 'Q' unless defined($namespace);
+    die "Can't import names into \"main\"\n" if \%{"${namespace}::"} == \%::;
+    if ($delete || $MOD_PERL || exists $ENV{'FCGI_ROLE'}) {
+	# can anyone find an easier way to do this?
+	foreach (keys %{"${namespace}::"}) {
+	    local *symbol = "${namespace}::${_}";
+	    undef $symbol;
+	    undef @symbol;
+	    undef %symbol;
+	}
+    }
+    my($param,@value,$var);
+    foreach $param ($self->param) {
+	# protect against silly names
+	($var = $param)=~tr/a-zA-Z0-9_/_/c;
+	$var =~ s/^(?=\d)/_/;
+	local *symbol = "${namespace}::$var";
+	@value = $self->param($param);
+	@symbol = @value;
+	$symbol = $value[0];
+    }
+}
+END_OF_FUNC
+
+#### Method: keywords
+# Keywords acts a bit differently.  Calling it in a list context
+# returns the list of keywords.  
+# Calling it in a scalar context gives you the size of the list.
+####
+'keywords' => <<'END_OF_FUNC',
+sub keywords {
+    my($self,@values) = self_or_default(@_);
+    # If values is provided, then we set it.
+    $self->{'keywords'}=[@values] if @values;
+    my(@result) = defined($self->{'keywords'}) ? @{$self->{'keywords'}} : ();
+    @result;
+}
+END_OF_FUNC
+
+# These are some tie() interfaces for compatibility
+# with Steve Brenner's cgi-lib.pl routines
+'Vars' => <<'END_OF_FUNC',
+sub Vars {
+    my $q = shift;
+    my %in;
+    tie(%in,CGI,$q);
+    return %in if wantarray;
+    return \%in;
+}
+END_OF_FUNC
+
+# These are some tie() interfaces for compatibility
+# with Steve Brenner's cgi-lib.pl routines
+'ReadParse' => <<'END_OF_FUNC',
+sub ReadParse {
+    local(*in);
+    if (@_) {
+	*in = $_[0];
+    } else {
+	my $pkg = caller();
+	*in=*{"${pkg}::in"};
+    }
+    tie(%in,CGI);
+    return scalar(keys %in);
+}
+END_OF_FUNC
+
+'PrintHeader' => <<'END_OF_FUNC',
+sub PrintHeader {
+    my($self) = self_or_default(@_);
+    return $self->header();
+}
+END_OF_FUNC
+
+'HtmlTop' => <<'END_OF_FUNC',
+sub HtmlTop {
+    my($self,@p) = self_or_default(@_);
+    return $self->start_html(@p);
+}
+END_OF_FUNC
+
+'HtmlBot' => <<'END_OF_FUNC',
+sub HtmlBot {
+    my($self,@p) = self_or_default(@_);
+    return $self->end_html(@p);
+}
+END_OF_FUNC
+
+'SplitParam' => <<'END_OF_FUNC',
+sub SplitParam {
+    my ($param) = @_;
+    my (@params) = split ("\0", $param);
+    return (wantarray ? @params : $params[0]);
+}
+END_OF_FUNC
+
+'MethGet' => <<'END_OF_FUNC',
+sub MethGet {
+    return request_method() eq 'GET';
+}
+END_OF_FUNC
+
+'MethPost' => <<'END_OF_FUNC',
+sub MethPost {
+    return request_method() eq 'POST';
+}
+END_OF_FUNC
+
+'TIEHASH' => <<'END_OF_FUNC',
+sub TIEHASH {
+    my $class = shift;
+    my $arg   = $_[0];
+    if (ref($arg) && UNIVERSAL::isa($arg,'CGI')) {
+       return $arg;
+    }
+    return $Q ||= $class->new(@_);
+}
+END_OF_FUNC
+
+'STORE' => <<'END_OF_FUNC',
+sub STORE {
+    my $self = shift;
+    my $tag  = shift;
+    my $vals = shift;
+    my @vals = index($vals,"\0")!=-1 ? split("\0",$vals) : $vals;
+    $self->param(-name=>$tag,-value=>\@vals);
+}
+END_OF_FUNC
+
+'FETCH' => <<'END_OF_FUNC',
+sub FETCH {
+    return $_[0] if $_[1] eq 'CGI';
+    return undef unless defined $_[0]->param($_[1]);
+    return join("\0",$_[0]->param($_[1]));
+}
+END_OF_FUNC
+
+'FIRSTKEY' => <<'END_OF_FUNC',
+sub FIRSTKEY {
+    $_[0]->{'.iterator'}=0;
+    $_[0]->{'.parameters'}->[$_[0]->{'.iterator'}++];
+}
+END_OF_FUNC
+
+'NEXTKEY' => <<'END_OF_FUNC',
+sub NEXTKEY {
+    $_[0]->{'.parameters'}->[$_[0]->{'.iterator'}++];
+}
+END_OF_FUNC
+
+'EXISTS' => <<'END_OF_FUNC',
+sub EXISTS {
+    exists $_[0]->{$_[1]};
+}
+END_OF_FUNC
+
+'DELETE' => <<'END_OF_FUNC',
+sub DELETE {
+    $_[0]->delete($_[1]);
+}
+END_OF_FUNC
+
+'CLEAR' => <<'END_OF_FUNC',
+sub CLEAR {
+    %{$_[0]}=();
+}
+####
+END_OF_FUNC
+
+####
+# Append a new value to an existing query
+####
+'append' => <<'EOF',
+sub append {
+    my($self,@p) = self_or_default(@_);
+    my($name,$value) = rearrange([NAME,[VALUE,VALUES]],@p);
+    my(@values) = defined($value) ? (ref($value) ? @{$value} : $value) : ();
+    if (@values) {
+	$self->add_parameter($name);
+	push(@{$self->{$name}},@values);
+    }
+    return $self->param($name);
+}
+EOF
+
+#### Method: delete_all
+# Delete all parameters
+####
+'delete_all' => <<'EOF',
+sub delete_all {
+    my($self) = self_or_default(@_);
+    my @param = $self->param();
+    $self->delete(@param);
+}
+EOF
+
+'Delete' => <<'EOF',
+sub Delete {
+    my($self,@p) = self_or_default(@_);
+    $self->delete(@p);
+}
+EOF
+
+'Delete_all' => <<'EOF',
+sub Delete_all {
+    my($self,@p) = self_or_default(@_);
+    $self->delete_all(@p);
+}
+EOF
+
+#### Method: autoescape
+# If you want to turn off the autoescaping features,
+# call this method with undef as the argument
+'autoEscape' => <<'END_OF_FUNC',
+sub autoEscape {
+    my($self,$escape) = self_or_default(@_);
+    my $d = $self->{'escape'};
+    $self->{'escape'} = $escape;
+    $d;
+}
+END_OF_FUNC
+
+
+#### Method: version
+# Return the current version
+####
+'version' => <<'END_OF_FUNC',
+sub version {
+    return $VERSION;
+}
+END_OF_FUNC
+
+#### Method: url_param
+# Return a parameter in the QUERY_STRING, regardless of
+# whether this was a POST or a GET
+####
+'url_param' => <<'END_OF_FUNC',
+sub url_param {
+    my ($self,@p) = self_or_default(@_);
+    my $name = shift(@p);
+    return undef unless exists($ENV{QUERY_STRING});
+    unless (exists($self->{'.url_param'})) {
+	$self->{'.url_param'}={}; # empty hash
+	if ($ENV{QUERY_STRING} =~ /=/) {
+	    my(@pairs) = split(/[&;]/,$ENV{QUERY_STRING});
+	    my($param,$value);
+	    foreach (@pairs) {
+		($param,$value) = split('=',$_,2);
+		$param = unescape($param);
+		$value = unescape($value);
+		push(@{$self->{'.url_param'}->{$param}},$value);
+	    }
+	} else {
+	    $self->{'.url_param'}->{'keywords'} = [$self->parse_keywordlist($ENV{QUERY_STRING})];
+	}
+    }
+    return keys %{$self->{'.url_param'}} unless defined($name);
+    return () unless $self->{'.url_param'}->{$name};
+    return wantarray ? @{$self->{'.url_param'}->{$name}}
+                     : $self->{'.url_param'}->{$name}->[0];
+}
+END_OF_FUNC
+
+#### Method: Dump
+# Returns a string in which all the known parameter/value 
+# pairs are represented as nested lists, mainly for the purposes 
+# of debugging.
+####
+'Dump' => <<'END_OF_FUNC',
+sub Dump {
+    my($self) = self_or_default(@_);
+    my($param,$value,@result);
+    return '<ul></ul>' unless $self->param;
+    push(@result,"<ul>");
+    foreach $param ($self->param) {
+	my($name)=$self->escapeHTML($param);
+	push(@result,"<li><strong>$param</strong></li>");
+	push(@result,"<ul>");
+	foreach $value ($self->param($param)) {
+	    $value = $self->escapeHTML($value);
+            $value =~ s/\n/<br \/>\n/g;
+	    push(@result,"<li>$value</li>");
+	}
+	push(@result,"</ul>");
+    }
+    push(@result,"</ul>");
+    return join("\n",@result);
+}
+END_OF_FUNC
+
+#### Method as_string
+#
+# synonym for "dump"
+####
+'as_string' => <<'END_OF_FUNC',
+sub as_string {
+    &Dump(@_);
+}
+END_OF_FUNC
+
+#### Method: save
+# Write values out to a filehandle in such a way that they can
+# be reinitialized by the filehandle form of the new() method
+####
+'save' => <<'END_OF_FUNC',
+sub save {
+    my($self,$filehandle) = self_or_default(@_);
+    $filehandle = to_filehandle($filehandle);
+    my($param);
+    local($,) = '';  # set print field separator back to a sane value
+    local($\) = '';  # set output line separator to a sane value
+    foreach $param ($self->param) {
+	my($escaped_param) = escape($param);
+	my($value);
+	foreach $value ($self->param($param)) {
+	    print $filehandle "$escaped_param=",escape("$value"),"\n";
+	}
+    }
+    foreach (keys %{$self->{'.fieldnames'}}) {
+          print $filehandle ".cgifields=",escape("$_"),"\n";
+    }
+    print $filehandle "=\n";    # end of record
+}
+END_OF_FUNC
+
+
+#### Method: save_parameters
+# An alias for save() that is a better name for exportation.
+# Only intended to be used with the function (non-OO) interface.
+####
+'save_parameters' => <<'END_OF_FUNC',
+sub save_parameters {
+    my $fh = shift;
+    return save(to_filehandle($fh));
+}
+END_OF_FUNC
+
+#### Method: restore_parameters
+# A way to restore CGI parameters from an initializer.
+# Only intended to be used with the function (non-OO) interface.
+####
+'restore_parameters' => <<'END_OF_FUNC',
+sub restore_parameters {
+    $Q = $CGI::DefaultClass->new(@_);
+}
+END_OF_FUNC
+
+#### Method: multipart_init
+# Return a Content-Type: style header for server-push
+# This has to be NPH on most web servers, and it is advisable to set $| = 1
+#
+# Many thanks to Ed Jordan <ed@fidalgo.net> for this
+# contribution, updated by Andrew Benham (adsb@bigfoot.com)
+####
+'multipart_init' => <<'END_OF_FUNC',
+sub multipart_init {
+    my($self,@p) = self_or_default(@_);
+    my($boundary,@other) = rearrange([BOUNDARY],@p);
+    $boundary = $boundary || '------- =_aaaaaaaaaa0';
+    $self->{'separator'} = "$CRLF--$boundary$CRLF";
+    $self->{'final_separator'} = "$CRLF--$boundary--$CRLF";
+    $type = SERVER_PUSH($boundary);
+    return $self->header(
+	-nph => 0,
+	-type => $type,
+	(map { split "=", $_, 2 } @other),
+    ) . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $self->multipart_end;
+}
+END_OF_FUNC
+
+
+#### Method: multipart_start
+# Return a Content-Type: style header for server-push, start of section
+#
+# Many thanks to Ed Jordan <ed@fidalgo.net> for this
+# contribution, updated by Andrew Benham (adsb@bigfoot.com)
+####
+'multipart_start' => <<'END_OF_FUNC',
+sub multipart_start {
+    my(@header);
+    my($self,@p) = self_or_default(@_);
+    my($type,@other) = rearrange([TYPE],@p);
+    $type = $type || 'text/html';
+    push(@header,"Content-Type: $type");
+
+    # rearrange() was designed for the HTML portion, so we
+    # need to fix it up a little.
+    foreach (@other) {
+        # Don't use \s because of perl bug 21951
+        next unless my($header,$value) = /([^ \r\n\t=]+)=\"?(.+?)\"?$/;
+	($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ': '.$self->unescapeHTML($value)/e;
+    }
+    push(@header,@other);
+    my $header = join($CRLF,@header)."${CRLF}${CRLF}";
+    return $header;
+}
+END_OF_FUNC
+
+
+#### Method: multipart_end
+# Return a MIME boundary separator for server-push, end of section
+#
+# Many thanks to Ed Jordan <ed@fidalgo.net> for this
+# contribution
+####
+'multipart_end' => <<'END_OF_FUNC',
+sub multipart_end {
+    my($self,@p) = self_or_default(@_);
+    return $self->{'separator'};
+}
+END_OF_FUNC
+
+
+#### Method: multipart_final
+# Return a MIME boundary separator for server-push, end of all sections
+#
+# Contributed by Andrew Benham (adsb@bigfoot.com)
+####
+'multipart_final' => <<'END_OF_FUNC',
+sub multipart_final {
+    my($self,@p) = self_or_default(@_);
+    return $self->{'final_separator'} . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $CRLF;
+}
+END_OF_FUNC
+
+
+#### Method: header
+# Return a Content-Type: style header
+#
+####
+'header' => <<'END_OF_FUNC',
+sub header {
+    my($self,@p) = self_or_default(@_);
+    my(@header);
+
+    return "" if $self->{'.header_printed'}++ and $HEADERS_ONCE;
+
+    my($type,$status,$cookie,$target,$expires,$nph,$charset,$attachment,$p3p,@other) = 
+	rearrange([['TYPE','CONTENT_TYPE','CONTENT-TYPE'],
+			    'STATUS',['COOKIE','COOKIES'],'TARGET',
+                            'EXPIRES','NPH','CHARSET',
+                            'ATTACHMENT','P3P'],@p);
+
+    $nph     ||= $NPH;
+    if (defined $charset) {
+      $self->charset($charset);
+    } else {
+      $charset = $self->charset;
+    }
+
+    # rearrange() was designed for the HTML portion, so we
+    # need to fix it up a little.
+    foreach (@other) {
+        # Don't use \s because of perl bug 21951
+        next unless my($header,$value) = /([^ \r\n\t=]+)=\"?(.+?)\"?$/;
+        ($_ = $header) =~ s/^(\w)(.*)/"\u$1\L$2" . ': '.$self->unescapeHTML($value)/e;
+    }
+
+    $type ||= 'text/html' unless defined($type);
+    $type .= "; charset=$charset" if $type ne '' and $type =~ m!^text/! and $type !~ /\bcharset\b/ and $charset ne '';
+
+    # Maybe future compatibility.  Maybe not.
+    my $protocol = $ENV{SERVER_PROTOCOL} || 'HTTP/1.0';
+    push(@header,$protocol . ' ' . ($status || '200 OK')) if $nph;
+    push(@header,"Server: " . &server_software()) if $nph;
+
+    push(@header,"Status: $status") if $status;
+    push(@header,"Window-Target: $target") if $target;
+    if ($p3p) {
+       $p3p = join ' ',@$p3p if ref($p3p) eq 'ARRAY';
+       push(@header,qq(P3P: policyref="/w3c/p3p.xml", CP="$p3p"));
+    }
+    # push all the cookies -- there may be several
+    if ($cookie) {
+	my(@cookie) = ref($cookie) && ref($cookie) eq 'ARRAY' ? @{$cookie} : $cookie;
+	foreach (@cookie) {
+            my $cs = UNIVERSAL::isa($_,'CGI::Cookie') ? $_->as_string : $_;
+	    push(@header,"Set-Cookie: $cs") if $cs ne '';
+	}
+    }
+    # if the user indicates an expiration time, then we need
+    # both an Expires and a Date header (so that the browser is
+    # uses OUR clock)
+    push(@header,"Expires: " . expires($expires,'http'))
+	if $expires;
+    push(@header,"Date: " . expires(0,'http')) if $expires || $cookie || $nph;
+    push(@header,"Pragma: no-cache") if $self->cache();
+    push(@header,"Content-Disposition: attachment; filename=\"$attachment\"") if $attachment;
+    push(@header,map {ucfirst $_} @other);
+    push(@header,"Content-Type: $type") if $type ne '';
+    my $header = join($CRLF,@header)."${CRLF}${CRLF}";
+    if ($MOD_PERL and not $nph) {
+        $self->r->send_cgi_header($header);
+        return '';
+    }
+    return $header;
+}
+END_OF_FUNC
+
+
+#### Method: cache
+# Control whether header() will produce the no-cache
+# Pragma directive.
+####
+'cache' => <<'END_OF_FUNC',
+sub cache {
+    my($self,$new_value) = self_or_default(@_);
+    $new_value = '' unless $new_value;
+    if ($new_value ne '') {
+	$self->{'cache'} = $new_value;
+    }
+    return $self->{'cache'};
+}
+END_OF_FUNC
+
+
+#### Method: redirect
+# Return a Location: style header
+#
+####
+'redirect' => <<'END_OF_FUNC',
+sub redirect {
+    my($self,@p) = self_or_default(@_);
+    my($url,$target,$status,$cookie,$nph,@other) = 
+         rearrange([[LOCATION,URI,URL],TARGET,STATUS,['COOKIE','COOKIES'],NPH],@p);
+    $status = '302 Moved' unless defined $status;
+    $url ||= $self->self_url;
+    my(@o);
+    foreach (@other) { tr/\"//d; push(@o,split("=",$_,2)); }
+    unshift(@o,
+	 '-Status'  => $status,
+	 '-Location'=> $url,
+	 '-nph'     => $nph);
+    unshift(@o,'-Target'=>$target) if $target;
+    unshift(@o,'-Type'=>'');
+    my @unescaped;
+    unshift(@unescaped,'-Cookie'=>$cookie) if $cookie;
+    return $self->header((map {$self->unescapeHTML($_)} @o),@unescaped);
+}
+END_OF_FUNC
+
+
+#### Method: start_html
+# Canned HTML header
+#
+# Parameters:
+# $title -> (optional) The title for this HTML document (-title)
+# $author -> (optional) e-mail address of the author (-author)
+# $base -> (optional) if set to true, will enter the BASE address of this document
+#          for resolving relative references (-base) 
+# $xbase -> (optional) alternative base at some remote location (-xbase)
+# $target -> (optional) target window to load all links into (-target)
+# $script -> (option) Javascript code (-script)
+# $no_script -> (option) Javascript <noscript> tag (-noscript)
+# $meta -> (optional) Meta information tags
+# $head -> (optional) any other elements you'd like to incorporate into the <head> tag
+#           (a scalar or array ref)
+# $style -> (optional) reference to an external style sheet
+# @other -> (optional) any other named parameters you'd like to incorporate into
+#           the <body> tag.
+####
+'start_html' => <<'END_OF_FUNC',
+sub start_html {
+    my($self,@p) = &self_or_default(@_);
+    my($title,$author,$base,$xbase,$script,$noscript,
+        $target,$meta,$head,$style,$dtd,$lang,$encoding,$declare_xml,@other) = 
+	rearrange([TITLE,AUTHOR,BASE,XBASE,SCRIPT,NOSCRIPT,TARGET,
+                   META,HEAD,STYLE,DTD,LANG,ENCODING,DECLARE_XML],@p);
+
+    $self->element_id(0);
+    $self->element_tab(0);
+
+    $encoding = 'iso-8859-1' unless defined $encoding;
+
+    # Need to sort out the DTD before it's okay to call escapeHTML().
+    my(@result,$xml_dtd);
+    if ($dtd) {
+        if (defined(ref($dtd)) and (ref($dtd) eq 'ARRAY')) {
+            $dtd = $DEFAULT_DTD unless $dtd->[0] =~ m|^-//|;
+        } else {
+            $dtd = $DEFAULT_DTD unless $dtd =~ m|^-//|;
+        }
+    } else {
+        $dtd = $XHTML ? XHTML_DTD : $DEFAULT_DTD;
+    }
+
+    $xml_dtd++ if ref($dtd) eq 'ARRAY' && $dtd->[0] =~ /\bXHTML\b/i;
+    $xml_dtd++ if ref($dtd) eq '' && $dtd =~ /\bXHTML\b/i;
+    push @result,qq(<?xml version="1.0" encoding="$encoding"?>) if $xml_dtd && $declare_xml;
+
+    if (ref($dtd) && ref($dtd) eq 'ARRAY') {
+        push(@result,qq(<!DOCTYPE html\n\tPUBLIC "$dtd->[0]"\n\t "$dtd->[1]">));
+	$DTD_PUBLIC_IDENTIFIER = $dtd->[0];
+    } else {
+        push(@result,qq(<!DOCTYPE html\n\tPUBLIC "$dtd">));
+	$DTD_PUBLIC_IDENTIFIER = $dtd;
+    }
+
+    # Now that we know whether we're using the HTML 3.2 DTD or not, it's okay to
+    # call escapeHTML().  Strangely enough, the title needs to be escaped as
+    # HTML while the author needs to be escaped as a URL.
+    $title = $self->escapeHTML($title || 'Untitled Document');
+    $author = $self->escape($author);
+
+    if ($DTD_PUBLIC_IDENTIFIER =~ /[^X]HTML (2\.0|3\.2)/i) {
+	$lang = "" unless defined $lang;
+	$XHTML = 0;
+    }
+    else {
+	$lang = 'en-US' unless defined $lang;
+    }
+
+    my $lang_bits = $lang ne '' ? qq( lang="$lang" xml:lang="$lang") : '';
+    my $meta_bits = qq(<meta http-equiv="Content-Type" content="text/html; charset=$encoding" />) 
+                    if $XHTML && $encoding && !$declare_xml;
+
+    push(@result,$XHTML ? qq(<html xmlns="http://www.w3.org/1999/xhtml"$lang_bits>\n<head>\n<title>$title</title>)
+                        : ($lang ? qq(<html lang="$lang">) : "<html>")
+	                  . "<head><title>$title</title>");
+	if (defined $author) {
+    push(@result,$XHTML ? "<link rev=\"made\" href=\"mailto:$author\" />"
+			: "<link rev=\"made\" href=\"mailto:$author\">");
+	}
+
+    if ($base || $xbase || $target) {
+	my $href = $xbase || $self->url('-path'=>1);
+	my $t = $target ? qq/ target="$target"/ : '';
+	push(@result,$XHTML ? qq(<base href="$href"$t />) : qq(<base href="$href"$t>));
+    }
+
+    if ($meta && ref($meta) && (ref($meta) eq 'HASH')) {
+	foreach (keys %$meta) { push(@result,$XHTML ? qq(<meta name="$_" content="$meta->{$_}" />) 
+			: qq(<meta name="$_" content="$meta->{$_}">)); }
+    }
+
+    push(@result,ref($head) ? @$head : $head) if $head;
+
+    # handle the infrequently-used -style and -script parameters
+    push(@result,$self->_style($style))   if defined $style;
+    push(@result,$self->_script($script)) if defined $script;
+    push(@result,$meta_bits)              if defined $meta_bits;
+
+    # handle -noscript parameter
+    push(@result,<<END) if $noscript;
+<noscript>
+$noscript
+</noscript>
+END
+    ;
+    my($other) = @other ? " @other" : '';
+    push(@result,"</head>\n<body$other>\n");
+    return join("\n",@result);
+}
+END_OF_FUNC
+
+### Method: _style
+# internal method for generating a CSS style section
+####
+'_style' => <<'END_OF_FUNC',
+sub _style {
+    my ($self,$style) = @_;
+    my (@result);
+    my $type = 'text/css';
+
+    my $cdata_start = $XHTML ? "\n<!--/* <![CDATA[ */" : "\n<!-- ";
+    my $cdata_end   = $XHTML ? "\n/* ]]> */-->\n" : " -->\n";
+
+    my @s = ref($style) eq 'ARRAY' ? @$style : $style;
+
+    for my $s (@s) {
+      if (ref($s)) {
+       my($src,$code,$verbatim,$stype,$foo,@other) =
+           rearrange([qw(SRC CODE VERBATIM TYPE FOO)],
+                      ('-foo'=>'bar',
+                       ref($s) eq 'ARRAY' ? @$s : %$s));
+       $type  = $stype if $stype;
+       my $other = @other ? join ' ',@other : '';
+
+       if (ref($src) eq "ARRAY") # Check to see if the $src variable is an array reference
+       { # If it is, push a LINK tag for each one
+           foreach $src (@$src)
+         {
+           push(@result,$XHTML ? qq(<link rel="stylesheet" type="$type" href="$src" $other/>)
+                             : qq(<link rel="stylesheet" type="$type" href="$src"$other>)) if $src;
+         }
+       }
+       else
+       { # Otherwise, push the single -src, if it exists.
+         push(@result,$XHTML ? qq(<link rel="stylesheet" type="$type" href="$src" $other/>)
+                             : qq(<link rel="stylesheet" type="$type" href="$src"$other>)
+              ) if $src;
+        }
+     if ($verbatim) {
+           my @v = ref($verbatim) eq 'ARRAY' ? @$verbatim : $verbatim;
+           push(@result, "<style type=\"text/css\">\n$_\n</style>") foreach @v;
+      }
+      my @c = ref($code) eq 'ARRAY' ? @$code : $code if $code;
+      push(@result,style({'type'=>$type},"$cdata_start\n$_\n$cdata_end")) foreach @c;
+
+      } else {
+           my $src = $s;
+           push(@result,$XHTML ? qq(<link rel="stylesheet" type="$type" href="$src" $other/>)
+                               : qq(<link rel="stylesheet" type="$type" href="$src"$other>));
+      }
+    }
+    @result;
+}
+END_OF_FUNC
+
+'_script' => <<'END_OF_FUNC',
+sub _script {
+    my ($self,$script) = @_;
+    my (@result);
+
+    my (@scripts) = ref($script) eq 'ARRAY' ? @$script : ($script);
+    foreach $script (@scripts) {
+	my($src,$code,$language);
+	if (ref($script)) { # script is a hash
+	    ($src,$code,$language, $type) =
+		rearrange([SRC,CODE,LANGUAGE,TYPE],
+				 '-foo'=>'bar',	# a trick to allow the '-' to be omitted
+				 ref($script) eq 'ARRAY' ? @$script : %$script);
+            # User may not have specified language
+            $language ||= 'JavaScript';
+            unless (defined $type) {
+                $type = lc $language;
+                # strip '1.2' from 'javascript1.2'
+                $type =~ s/^(\D+).*$/text\/$1/;
+            }
+	} else {
+	    ($src,$code,$language, $type) = ('',$script,'JavaScript', 'text/javascript');
+	}
+
+    my $comment = '//';  # javascript by default
+    $comment = '#' if $type=~/perl|tcl/i;
+    $comment = "'" if $type=~/vbscript/i;
+
+    my ($cdata_start,$cdata_end);
+    if ($XHTML) {
+       $cdata_start    = "$comment<![CDATA[\n";
+       $cdata_end     .= "\n$comment]]>";
+    } else {
+       $cdata_start  =  "\n<!-- Hide script\n";
+       $cdata_end    = $comment;
+       $cdata_end   .= " End script hiding -->\n";
+   }
+     my(@satts);
+     push(@satts,'src'=>$src) if $src;
+     push(@satts,'language'=>$language) unless defined $type;
+     push(@satts,'type'=>$type);
+     $code = $cdata_start . $code . $cdata_end if defined $code;
+     push(@result,$self->script({@satts},$code || ''));
+    }
+    @result;
+}
+END_OF_FUNC
+
+#### Method: end_html
+# End an HTML document.
+# Trivial method for completeness.  Just returns "</body>"
+####
+'end_html' => <<'END_OF_FUNC',
+sub end_html {
+    return "\n</body>\n</html>";
+}
+END_OF_FUNC
+
+
+################################
+# METHODS USED IN BUILDING FORMS
+################################
+
+#### Method: isindex
+# Just prints out the isindex tag.
+# Parameters:
+#  $action -> optional URL of script to run
+# Returns:
+#   A string containing a <isindex> tag
+'isindex' => <<'END_OF_FUNC',
+sub isindex {
+    my($self,@p) = self_or_default(@_);
+    my($action,@other) = rearrange([ACTION],@p);
+    $action = qq/ action="$action"/ if $action;
+    my($other) = @other ? " @other" : '';
+    return $XHTML ? "<isindex$action$other />" : "<isindex$action$other>";
+}
+END_OF_FUNC
+
+
+#### Method: startform
+# Start a form
+# Parameters:
+#   $method -> optional submission method to use (GET or POST)
+#   $action -> optional URL of script to run
+#   $enctype ->encoding to use (URL_ENCODED or MULTIPART)
+'startform' => <<'END_OF_FUNC',
+sub startform {
+    my($self,@p) = self_or_default(@_);
+
+    my($method,$action,$enctype,@other) = 
+	rearrange([METHOD,ACTION,ENCTYPE],@p);
+
+    $method  = $self->escapeHTML(lc($method) || 'post');
+    $enctype = $self->escapeHTML($enctype || &URL_ENCODED);
+    if (defined $action) {
+       $action = $self->escapeHTML($action);
+    }
+    else {
+       $action = $self->escapeHTML($self->request_uri);
+    }
+    $action = qq(action="$action");
+    my($other) = @other ? " @other" : '';
+    $self->{'.parametersToAdd'}={};
+    return qq/<form method="$method" $action enctype="$enctype"$other>\n/;
+}
+END_OF_FUNC
+
+
+#### Method: start_form
+# synonym for startform
+'start_form' => <<'END_OF_FUNC',
+sub start_form {
+    $XHTML ? &start_multipart_form : &startform;
+}
+END_OF_FUNC
+
+'end_multipart_form' => <<'END_OF_FUNC',
+sub end_multipart_form {
+    &endform;
+}
+END_OF_FUNC
+
+#### Method: start_multipart_form
+# synonym for startform
+'start_multipart_form' => <<'END_OF_FUNC',
+sub start_multipart_form {
+    my($self,@p) = self_or_default(@_);
+    if (defined($p[0]) && substr($p[0],0,1) eq '-') {
+	my(%p) = @p;
+	$p{'-enctype'}=&MULTIPART;
+	return $self->startform(%p);
+    } else {
+	my($method,$action,@other) = 
+	    rearrange([METHOD,ACTION],@p);
+	return $self->startform($method,$action,&MULTIPART,@other);
+    }
+}
+END_OF_FUNC
+
+
+#### Method: endform
+# End a form
+'endform' => <<'END_OF_FUNC',
+sub endform {
+    my($self,@p) = self_or_default(@_);
+    if ( $NOSTICKY ) {
+    return wantarray ? ("</form>") : "\n</form>";
+    } else {
+      if (my @fields = $self->get_fields) {
+         return wantarray ? ("<div>",@fields,"</div>","</form>")
+                          : "<div>".(join '',@fields)."</div>\n</form>";
+      } else {
+         return "</form>";
+      }
+    }
+}
+END_OF_FUNC
+
+
+'_textfield' => <<'END_OF_FUNC',
+sub _textfield {
+    my($self,$tag,@p) = self_or_default(@_);
+    my($name,$default,$size,$maxlength,$override,$tabindex,@other) = 
+	rearrange([NAME,[DEFAULT,VALUE,VALUES],SIZE,MAXLENGTH,[OVERRIDE,FORCE],TABINDEX],@p);
+
+    my $current = $override ? $default : 
+	(defined($self->param($name)) ? $self->param($name) : $default);
+
+    $current = defined($current) ? $self->escapeHTML($current,1) : '';
+    $name = defined($name) ? $self->escapeHTML($name) : '';
+    my($s) = defined($size) ? qq/ size="$size"/ : '';
+    my($m) = defined($maxlength) ? qq/ maxlength="$maxlength"/ : '';
+    my($other) = @other ? " @other" : '';
+    # this entered at cristy's request to fix problems with file upload fields
+    # and WebTV -- not sure it won't break stuff
+    my($value) = $current ne '' ? qq(value="$current") : '';
+    $tabindex = $self->element_tab($tabindex);
+    return $XHTML ? qq(<input type="$tag" name="$name" $tabindex$value$s$m$other />) 
+                  : qq(<input type="$tag" name="$name" $value$s$m$other>);
+}
+END_OF_FUNC
+
+#### Method: textfield
+# Parameters:
+#   $name -> Name of the text field
+#   $default -> Optional default value of the field if not
+#                already defined.
+#   $size ->  Optional width of field in characaters.
+#   $maxlength -> Optional maximum number of characters.
+# Returns:
+#   A string containing a <input type="text"> field
+#
+'textfield' => <<'END_OF_FUNC',
+sub textfield {
+    my($self,@p) = self_or_default(@_);
+    $self->_textfield('text',@p);
+}
+END_OF_FUNC
+
+
+#### Method: filefield
+# Parameters:
+#   $name -> Name of the file upload field
+#   $size ->  Optional width of field in characaters.
+#   $maxlength -> Optional maximum number of characters.
+# Returns:
+#   A string containing a <input type="file"> field
+#
+'filefield' => <<'END_OF_FUNC',
+sub filefield {
+    my($self,@p) = self_or_default(@_);
+    $self->_textfield('file',@p);
+}
+END_OF_FUNC
+
+
+#### Method: password
+# Create a "secret password" entry field
+# Parameters:
+#   $name -> Name of the field
+#   $default -> Optional default value of the field if not
+#                already defined.
+#   $size ->  Optional width of field in characters.
+#   $maxlength -> Optional maximum characters that can be entered.
+# Returns:
+#   A string containing a <input type="password"> field
+#
+'password_field' => <<'END_OF_FUNC',
+sub password_field {
+    my ($self,@p) = self_or_default(@_);
+    $self->_textfield('password',@p);
+}
+END_OF_FUNC
+
+#### Method: textarea
+# Parameters:
+#   $name -> Name of the text field
+#   $default -> Optional default value of the field if not
+#                already defined.
+#   $rows ->  Optional number of rows in text area
+#   $columns -> Optional number of columns in text area
+# Returns:
+#   A string containing a <textarea></textarea> tag
+#
+'textarea' => <<'END_OF_FUNC',
+sub textarea {
+    my($self,@p) = self_or_default(@_);
+    my($name,$default,$rows,$cols,$override,$tabindex,@other) =
+	rearrange([NAME,[DEFAULT,VALUE],ROWS,[COLS,COLUMNS],[OVERRIDE,FORCE],TABINDEX],@p);
+
+    my($current)= $override ? $default :
+	(defined($self->param($name)) ? $self->param($name) : $default);
+
+    $name = defined($name) ? $self->escapeHTML($name) : '';
+    $current = defined($current) ? $self->escapeHTML($current) : '';
+    my($r) = $rows ? qq/ rows="$rows"/ : '';
+    my($c) = $cols ? qq/ cols="$cols"/ : '';
+    my($other) = @other ? " @other" : '';
+    $tabindex = $self->element_tab($tabindex);
+    return qq{<textarea name="$name" $tabindex$r$c$other>$current</textarea>};
+}
+END_OF_FUNC
+
+
+#### Method: button
+# Create a javascript button.
+# Parameters:
+#   $name ->  (optional) Name for the button. (-name)
+#   $value -> (optional) Value of the button when selected (and visible name) (-value)
+#   $onclick -> (optional) Text of the JavaScript to run when the button is
+#                clicked.
+# Returns:
+#   A string containing a <input type="button"> tag
+####
+'button' => <<'END_OF_FUNC',
+sub button {
+    my($self,@p) = self_or_default(@_);
+
+    my($label,$value,$script,$tabindex,@other) = rearrange([NAME,[VALUE,LABEL],
+						            [ONCLICK,SCRIPT],TABINDEX],@p);
+
+    $label=$self->escapeHTML($label);
+    $value=$self->escapeHTML($value,1);
+    $script=$self->escapeHTML($script);
+
+    my($name) = '';
+    $name = qq/ name="$label"/ if $label;
+    $value = $value || $label;
+    my($val) = '';
+    $val = qq/ value="$value"/ if $value;
+    $script = qq/ onclick="$script"/ if $script;
+    my($other) = @other ? " @other" : '';
+    $tabindex = $self->element_tab($tabindex);
+    return $XHTML ? qq(<input type="button" $tabindex$name$val$script$other />)
+                  : qq(<input type="button"$name$val$script$other>);
+}
+END_OF_FUNC
+
+
+#### Method: submit
+# Create a "submit query" button.
+# Parameters:
+#   $name ->  (optional) Name for the button.
+#   $value -> (optional) Value of the button when selected (also doubles as label).
+#   $label -> (optional) Label printed on the button(also doubles as the value).
+# Returns:
+#   A string containing a <input type="submit"> tag
+####
+'submit' => <<'END_OF_FUNC',
+sub submit {
+    my($self,@p) = self_or_default(@_);
+
+    my($label,$value,$tabindex,@other) = rearrange([NAME,[VALUE,LABEL],TABINDEX],@p);
+
+    $label=$self->escapeHTML($label);
+    $value=$self->escapeHTML($value,1);
+
+    my $name = $NOSTICKY ? '' : 'name=".submit" ';
+    $name = qq/name="$label" / if defined($label);
+    $value = defined($value) ? $value : $label;
+    my $val = '';
+    $val = qq/value="$value" / if defined($value);
+    $tabindex = $self->element_tab($tabindex);
+    my($other) = @other ? "@other " : '';
+    return $XHTML ? qq(<input type="submit" $tabindex$name$val$other/>)
+                  : qq(<input type="submit" $name$val$other>);
+}
+END_OF_FUNC
+
+
+#### Method: reset
+# Create a "reset" button.
+# Parameters:
+#   $name -> (optional) Name for the button.
+# Returns:
+#   A string containing a <input type="reset"> tag
+####
+'reset' => <<'END_OF_FUNC',
+sub reset {
+    my($self,@p) = self_or_default(@_);
+    my($label,$value,$tabindex,@other) = rearrange(['NAME',['VALUE','LABEL'],TABINDEX],@p);
+    $label=$self->escapeHTML($label);
+    $value=$self->escapeHTML($value,1);
+    my ($name) = ' name=".reset"';
+    $name = qq/ name="$label"/ if defined($label);
+    $value = defined($value) ? $value : $label;
+    my($val) = '';
+    $val = qq/ value="$value"/ if defined($value);
+    my($other) = @other ? " @other" : '';
+    $tabindex = $self->element_tab($tabindex);
+    return $XHTML ? qq(<input type="reset" $tabindex$name$val$other />)
+                  : qq(<input type="reset"$name$val$other>);
+}
+END_OF_FUNC
+
+
+#### Method: defaults
+# Create a "defaults" button.
+# Parameters:
+#   $name -> (optional) Name for the button.
+# Returns:
+#   A string containing a <input type="submit" name=".defaults"> tag
+#
+# Note: this button has a special meaning to the initialization script,
+# and tells it to ERASE the current query string so that your defaults
+# are used again!
+####
+'defaults' => <<'END_OF_FUNC',
+sub defaults {
+    my($self,@p) = self_or_default(@_);
+
+    my($label,$tabindex,@other) = rearrange([[NAME,VALUE],TABINDEX],@p);
+
+    $label=$self->escapeHTML($label,1);
+    $label = $label || "Defaults";
+    my($value) = qq/ value="$label"/;
+    my($other) = @other ? " @other" : '';
+    $tabindex = $self->element_tab($tabindex);
+    return $XHTML ? qq(<input type="submit" name=".defaults" $tabindex$value$other />)
+                  : qq/<input type="submit" NAME=".defaults"$value$other>/;
+}
+END_OF_FUNC
+
+
+#### Method: comment
+# Create an HTML <!-- comment -->
+# Parameters: a string
+'comment' => <<'END_OF_FUNC',
+sub comment {
+    my($self,@p) = self_or_CGI(@_);
+    return "<!-- @p -->";
+}
+END_OF_FUNC
+
+#### Method: checkbox
+# Create a checkbox that is not logically linked to any others.
+# The field value is "on" when the button is checked.
+# Parameters:
+#   $name -> Name of the checkbox
+#   $checked -> (optional) turned on by default if true
+#   $value -> (optional) value of the checkbox, 'on' by default
+#   $label -> (optional) a user-readable label printed next to the box.
+#             Otherwise the checkbox name is used.
+# Returns:
+#   A string containing a <input type="checkbox"> field
+####
+'checkbox' => <<'END_OF_FUNC',
+sub checkbox {
+    my($self,@p) = self_or_default(@_);
+
+    my($name,$checked,$value,$label,$override,$tabindex,@other) = 
+	rearrange([NAME,[CHECKED,SELECTED,ON],VALUE,LABEL,[OVERRIDE,FORCE],TABINDEX],@p);
+
+    $value = defined $value ? $value : 'on';
+
+    if (!$override && ($self->{'.fieldnames'}->{$name} || 
+		       defined $self->param($name))) {
+	$checked = grep($_ eq $value,$self->param($name)) ? $self->_checked(1) : '';
+    } else {
+	$checked = $self->_checked($checked);
+    }
+    my($the_label) = defined $label ? $label : $name;
+    $name = $self->escapeHTML($name);
+    $value = $self->escapeHTML($value,1);
+    $the_label = $self->escapeHTML($the_label);
+    my($other) = @other ? "@other " : '';
+    $tabindex = $self->element_tab($tabindex);
+    $self->register_parameter($name);
+    return $XHTML ? CGI::label(qq{<input type="checkbox" name="$name" value="$value" $tabindex$checked$other/>$the_label})
+                  : qq{<input type="checkbox" name="$name" value="$value"$checked$other>$the_label};
+}
+END_OF_FUNC
+
+
+
+# Escape HTML -- used internally
+'escapeHTML' => <<'END_OF_FUNC',
+sub escapeHTML {
+         # hack to work around  earlier hacks
+         push @_,$_[0] if @_==1 && $_[0] eq 'CGI';
+         my ($self,$toencode,$newlinestoo) = CGI::self_or_default(@_);
+         return undef unless defined($toencode);
+         return $toencode if ref($self) && !$self->{'escape'};
+         $toencode =~ s{&}{&amp;}gso;
+         $toencode =~ s{<}{&lt;}gso;
+         $toencode =~ s{>}{&gt;}gso;
+	 if ($DTD_PUBLIC_IDENTIFIER =~ /[^X]HTML 3\.2/i) {
+	     # $quot; was accidentally omitted from the HTML 3.2 DTD -- see
+	     # <http://validator.w3.org/docs/errors.html#bad-entity> /
+	     # <http://lists.w3.org/Archives/Public/www-html/1997Mar/0003.html>.
+	     $toencode =~ s{"}{&#34;}gso;
+         }
+         else {
+	     $toencode =~ s{"}{&quot;}gso;
+         }
+         my $latin = uc $self->{'.charset'} eq 'ISO-8859-1' ||
+                     uc $self->{'.charset'} eq 'WINDOWS-1252';
+         if ($latin) {  # bug in some browsers
+                $toencode =~ s{'}{&#39;}gso;
+                $toencode =~ s{\x8b}{&#8249;}gso;
+                $toencode =~ s{\x9b}{&#8250;}gso;
+                if (defined $newlinestoo && $newlinestoo) {
+                     $toencode =~ s{\012}{&#10;}gso;
+                     $toencode =~ s{\015}{&#13;}gso;
+                }
+         }
+         return $toencode;
+}
+END_OF_FUNC
+
+# unescape HTML -- used internally
+'unescapeHTML' => <<'END_OF_FUNC',
+sub unescapeHTML {
+    # hack to work around  earlier hacks
+    push @_,$_[0] if @_==1 && $_[0] eq 'CGI';
+    my ($self,$string) = CGI::self_or_default(@_);
+    return undef unless defined($string);
+    my $latin = defined $self->{'.charset'} ? $self->{'.charset'} =~ /^(ISO-8859-1|WINDOWS-1252)$/i
+                                            : 1;
+    # thanks to Randal Schwartz for the correct solution to this one
+    $string=~ s[&(.*?);]{
+	local $_ = $1;
+	/^amp$/i	? "&" :
+	/^quot$/i	? '"' :
+        /^gt$/i		? ">" :
+	/^lt$/i		? "<" :
+	/^#(\d+)$/ && $latin	     ? chr($1) :
+	/^#x([0-9a-f]+)$/i && $latin ? chr(hex($1)) :
+	$_
+	}gex;
+    return $string;
+}
+END_OF_FUNC
+
+# Internal procedure - don't use
+'_tableize' => <<'END_OF_FUNC',
+sub _tableize {
+    my($rows,$columns,$rowheaders,$colheaders,@elements) = @_;
+    my @rowheaders = $rowheaders ? @$rowheaders : ();
+    my @colheaders = $colheaders ? @$colheaders : ();
+    my($result);
+
+    if (defined($columns)) {
+	$rows = int(0.99 + @elements/$columns) unless defined($rows);
+    }
+    if (defined($rows)) {
+	$columns = int(0.99 + @elements/$rows) unless defined($columns);
+    }
+
+    # rearrange into a pretty table
+    $result = "<table>";
+    my($row,$column);
+    unshift(@colheaders,'') if @colheaders && @rowheaders;
+    $result .= "<tr>" if @colheaders;
+    foreach (@colheaders) {
+	$result .= "<th>$_</th>";
+    }
+    for ($row=0;$row<$rows;$row++) {
+	$result .= "<tr>";
+	$result .= "<th>$rowheaders[$row]</th>" if @rowheaders;
+	for ($column=0;$column<$columns;$column++) {
+	    $result .= "<td>" . $elements[$column*$rows + $row] . "</td>"
+		if defined($elements[$column*$rows + $row]);
+	}
+	$result .= "</tr>";
+    }
+    $result .= "</table>";
+    return $result;
+}
+END_OF_FUNC
+
+
+#### Method: radio_group
+# Create a list of logically-linked radio buttons.
+# Parameters:
+#   $name -> Common name for all the buttons.
+#   $values -> A pointer to a regular array containing the
+#             values for each button in the group.
+#   $default -> (optional) Value of the button to turn on by default.  Pass '-'
+#               to turn _nothing_ on.
+#   $linebreak -> (optional) Set to true to place linebreaks
+#             between the buttons.
+#   $labels -> (optional)
+#             A pointer to an associative array of labels to print next to each checkbox
+#             in the form $label{'value'}="Long explanatory label".
+#             Otherwise the provided values are used as the labels.
+# Returns:
+#   An ARRAY containing a series of <input type="radio"> fields
+####
+'radio_group' => <<'END_OF_FUNC',
+sub radio_group {
+    my($self,@p) = self_or_default(@_);
+   $self->_box_group('radio',@p);
+}
+END_OF_FUNC
+
+#### Method: checkbox_group
+# Create a list of logically-linked checkboxes.
+# Parameters:
+#   $name -> Common name for all the check boxes
+#   $values -> A pointer to a regular array containing the
+#             values for each checkbox in the group.
+#   $defaults -> (optional)
+#             1. If a pointer to a regular array of checkbox values,
+#             then this will be used to decide which
+#             checkboxes to turn on by default.
+#             2. If a scalar, will be assumed to hold the
+#             value of a single checkbox in the group to turn on. 
+#   $linebreak -> (optional) Set to true to place linebreaks
+#             between the buttons.
+#   $labels -> (optional)
+#             A pointer to an associative array of labels to print next to each checkbox
+#             in the form $label{'value'}="Long explanatory label".
+#             Otherwise the provided values are used as the labels.
+# Returns:
+#   An ARRAY containing a series of <input type="checkbox"> fields
+####
+
+'checkbox_group' => <<'END_OF_FUNC',
+sub checkbox_group {
+    my($self,@p) = self_or_default(@_);
+   $self->_box_group('checkbox',@p);
+}
+END_OF_FUNC
+
+'_box_group' => <<'END_OF_FUNC',
+sub _box_group {
+    my $self     = shift;
+    my $box_type = shift;
+
+    my($name,$values,$defaults,$linebreak,$labels,$attributes,
+       $rows,$columns,$rowheaders,$colheaders,
+       $override,$nolabels,$tabindex,@other) =
+       rearrange([      NAME,[VALUES,VALUE],[DEFAULT,DEFAULTS],LINEBREAK,LABELS,ATTRIBUTES,
+		        ROWS,[COLUMNS,COLS],ROWHEADERS,COLHEADERS,
+			[OVERRIDE,FORCE],NOLABELS,TABINDEX
+                 ],@_);
+    my($result,$checked);
+
+
+    my(@elements,@values);
+    @values = $self->_set_values_and_labels($values,\$labels,$name);
+    my %checked = $self->previous_or_default($name,$defaults,$override);
+
+    # If no check array is specified, check the first by default
+    $checked{$values[0]}++ if $box_type eq 'radio' && !%checked;
+
+    $name=$self->escapeHTML($name);
+
+    my %tabs = ();
+    if ($TABINDEX && $tabindex) {
+      if (!ref $tabindex) {
+          $self->element_tab($tabindex);
+      } elsif (ref $tabindex eq 'ARRAY') {
+          %tabs = map {$_=>$self->element_tab} @$tabindex;
+      } elsif (ref $tabindex eq 'HASH') {
+          %tabs = %$tabindex;
+      }
+    }
+    %tabs = map {$_=>$self->element_tab} @values unless %tabs;
+
+    my $other = @other ? "@other " : '';
+    my $radio_checked;
+    foreach (@values) {
+        my $checkit = $self->_checked($box_type eq 'radio' ? ($checked{$_} && !$radio_checked++)
+                                                           : $checked{$_});
+	my($break);
+	if ($linebreak) {
+          $break = $XHTML ? "<br />" : "<br>";
+	}
+	else {
+	  $break = '';
+	}
+	my($label)='';
+	unless (defined($nolabels) && $nolabels) {
+	    $label = $_;
+	    $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
+	    $label = $self->escapeHTML($label,1);
+	}
+        my $attribs = $self->_set_attributes($_, $attributes);
+        my $tab     = $tabs{$_};
+	$_=$self->escapeHTML($_);
+        if ($XHTML) {
+           push @elements,
+              CGI::label(
+                   qq(<input type="$box_type" name="$name" value="$_" $checkit$other$tab$attribs/>$label)).${break};
+        } else {
+           push(@elements,qq/<input type="$box_type" name="$name" value="$_"$checkit$other$tab$attribs>${label}${break}/);
+        }
+    }
+    $self->register_parameter($name);
+    return wantarray ? @elements : "@elements"
+           unless defined($columns) || defined($rows);
+    return _tableize($rows,$columns,$rowheaders,$colheaders,@elements);
+}
+END_OF_FUNC
+
+
+#### Method: popup_menu
+# Create a popup menu.
+# Parameters:
+#   $name -> Name for all the menu
+#   $values -> A pointer to a regular array containing the
+#             text of each menu item.
+#   $default -> (optional) Default item to display
+#   $labels -> (optional)
+#             A pointer to an associative array of labels to print next to each checkbox
+#             in the form $label{'value'}="Long explanatory label".
+#             Otherwise the provided values are used as the labels.
+# Returns:
+#   A string containing the definition of a popup menu.
+####
+'popup_menu' => <<'END_OF_FUNC',
+sub popup_menu {
+    my($self,@p) = self_or_default(@_);
+
+    my($name,$values,$default,$labels,$attributes,$override,$tabindex,@other) =
+       rearrange([NAME,[VALUES,VALUE],[DEFAULT,DEFAULTS],LABELS,
+       ATTRIBUTES,[OVERRIDE,FORCE],TABINDEX],@p);
+    my($result,$selected);
+
+    if (!$override && defined($self->param($name))) {
+	$selected = $self->param($name);
+    } else {
+	$selected = $default;
+    }
+    $name=$self->escapeHTML($name);
+    my($other) = @other ? " @other" : '';
+
+    my(@values);
+    @values = $self->_set_values_and_labels($values,\$labels,$name);
+    $tabindex = $self->element_tab($tabindex);
+    $result = qq/<select name="$name" $tabindex$other>\n/;
+    foreach (@values) {
+        if (/<optgroup/) {
+            foreach (split(/\n/)) {
+                my $selectit = $XHTML ? 'selected="selected"' : 'selected';
+                s/(value="$selected")/$selectit $1/ if defined $selected;
+                $result .= "$_\n";
+            }
+        }
+        else {
+            my $attribs = $self->_set_attributes($_, $attributes);
+	my($selectit) = defined($selected) ? $self->_selected($selected eq $_) : '';
+	my($label) = $_;
+	$label = $labels->{$_} if defined($labels) && defined($labels->{$_});
+	my($value) = $self->escapeHTML($_);
+	$label=$self->escapeHTML($label,1);
+            $result .= "<option $selectit${attribs}value=\"$value\">$label</option>\n";
+        }
+    }
+
+    $result .= "</select>";
+    return $result;
+}
+END_OF_FUNC
+
+
+#### Method: optgroup
+# Create a optgroup.
+# Parameters:
+#   $name -> Label for the group
+#   $values -> A pointer to a regular array containing the
+#              values for each option line in the group.
+#   $labels -> (optional)
+#              A pointer to an associative array of labels to print next to each item
+#              in the form $label{'value'}="Long explanatory label".
+#              Otherwise the provided values are used as the labels.
+#   $labeled -> (optional)
+#               A true value indicates the value should be used as the label attribute
+#               in the option elements.
+#               The label attribute specifies the option label presented to the user.
+#               This defaults to the content of the <option> element, but the label
+#               attribute allows authors to more easily use optgroup without sacrificing
+#               compatibility with browsers that do not support option groups.
+#   $novals -> (optional)
+#              A true value indicates to suppress the val attribute in the option elements
+# Returns:
+#   A string containing the definition of an option group.
+####
+'optgroup' => <<'END_OF_FUNC',
+sub optgroup {
+    my($self,@p) = self_or_default(@_);
+    my($name,$values,$attributes,$labeled,$noval,$labels,@other)
+        = rearrange([NAME,[VALUES,VALUE],ATTRIBUTES,LABELED,NOVALS,LABELS],@p);
+
+    my($result,@values);
+    @values = $self->_set_values_and_labels($values,\$labels,$name,$labeled,$novals);
+    my($other) = @other ? " @other" : '';
+
+    $name=$self->escapeHTML($name);
+    $result = qq/<optgroup label="$name"$other>\n/;
+    foreach (@values) {
+        if (/<optgroup/) {
+            foreach (split(/\n/)) {
+                my $selectit = $XHTML ? 'selected="selected"' : 'selected';
+                s/(value="$selected")/$selectit $1/ if defined $selected;
+                $result .= "$_\n";
+            }
+        }
+        else {
+            my $attribs = $self->_set_attributes($_, $attributes);
+            my($label) = $_;
+            $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
+            $label=$self->escapeHTML($label);
+            my($value)=$self->escapeHTML($_,1);
+            $result .= $labeled ? $novals ? "<option$attribs label=\"$value\">$label</option>\n"
+                                          : "<option$attribs label=\"$value\" value=\"$value\">$label</option>\n"
+                                : $novals ? "<option$attribs>$label</option>\n"
+                                          : "<option$attribs value=\"$value\">$label</option>\n";
+        }
+    }
+    $result .= "</optgroup>";
+    return $result;
+}
+END_OF_FUNC
+
+
+#### Method: scrolling_list
+# Create a scrolling list.
+# Parameters:
+#   $name -> name for the list
+#   $values -> A pointer to a regular array containing the
+#             values for each option line in the list.
+#   $defaults -> (optional)
+#             1. If a pointer to a regular array of options,
+#             then this will be used to decide which
+#             lines to turn on by default.
+#             2. Otherwise holds the value of the single line to turn on.
+#   $size -> (optional) Size of the list.
+#   $multiple -> (optional) If set, allow multiple selections.
+#   $labels -> (optional)
+#             A pointer to an associative array of labels to print next to each checkbox
+#             in the form $label{'value'}="Long explanatory label".
+#             Otherwise the provided values are used as the labels.
+# Returns:
+#   A string containing the definition of a scrolling list.
+####
+'scrolling_list' => <<'END_OF_FUNC',
+sub scrolling_list {
+    my($self,@p) = self_or_default(@_);
+    my($name,$values,$defaults,$size,$multiple,$labels,$attributes,$override,$tabindex,@other)
+	= rearrange([NAME,[VALUES,VALUE],[DEFAULTS,DEFAULT],
+          SIZE,MULTIPLE,LABELS,ATTRIBUTES,[OVERRIDE,FORCE],TABINDEX],@p);
+
+    my($result,@values);
+    @values = $self->_set_values_and_labels($values,\$labels,$name);
+
+    $size = $size || scalar(@values);
+
+    my(%selected) = $self->previous_or_default($name,$defaults,$override);
+    my($is_multiple) = $multiple ? qq/ multiple="multiple"/ : '';
+    my($has_size) = $size ? qq/ size="$size"/: '';
+    my($other) = @other ? " @other" : '';
+
+    $name=$self->escapeHTML($name);
+    $tabindex = $self->element_tab($tabindex);
+    $result = qq/<select name="$name" $tabindex$has_size$is_multiple$other>\n/;
+    foreach (@values) {
+	my($selectit) = $self->_selected($selected{$_});
+	my($label) = $_;
+	$label = $labels->{$_} if defined($labels) && defined($labels->{$_});
+	$label=$self->escapeHTML($label);
+	my($value)=$self->escapeHTML($_,1);
+        my $attribs = $self->_set_attributes($_, $attributes);
+        $result .= "<option ${selectit}${attribs}value=\"$value\">$label</option>\n";
+    }
+    $result .= "</select>";
+    $self->register_parameter($name);
+    return $result;
+}
+END_OF_FUNC
+
+
+#### Method: hidden
+# Parameters:
+#   $name -> Name of the hidden field
+#   @default -> (optional) Initial values of field (may be an array)
+#      or
+#   $default->[initial values of field]
+# Returns:
+#   A string containing a <input type="hidden" name="name" value="value">
+####
+'hidden' => <<'END_OF_FUNC',
+sub hidden {
+    my($self,@p) = self_or_default(@_);
+
+    # this is the one place where we departed from our standard
+    # calling scheme, so we have to special-case (darn)
+    my(@result,@value);
+    my($name,$default,$override,@other) = 
+	rearrange([NAME,[DEFAULT,VALUE,VALUES],[OVERRIDE,FORCE]],@p);
+
+    my $do_override = 0;
+    if ( ref($p[0]) || substr($p[0],0,1) eq '-') {
+	@value = ref($default) ? @{$default} : $default;
+	$do_override = $override;
+    } else {
+	foreach ($default,$override,@other) {
+	    push(@value,$_) if defined($_);
+	}
+    }
+
+    # use previous values if override is not set
+    my @prev = $self->param($name);
+    @value = @prev if !$do_override && @prev;
+
+    $name=$self->escapeHTML($name);
+    foreach (@value) {
+	$_ = defined($_) ? $self->escapeHTML($_,1) : '';
+	push @result,$XHTML ? qq(<input type="hidden" name="$name" value="$_" @other />)
+                            : qq(<input type="hidden" name="$name" value="$_" @other>);
+    }
+    return wantarray ? @result : join('',@result);
+}
+END_OF_FUNC
+
+
+#### Method: image_button
+# Parameters:
+#   $name -> Name of the button
+#   $src ->  URL of the image source
+#   $align -> Alignment style (TOP, BOTTOM or MIDDLE)
+# Returns:
+#   A string containing a <input type="image" name="name" src="url" align="alignment">
+####
+'image_button' => <<'END_OF_FUNC',
+sub image_button {
+    my($self,@p) = self_or_default(@_);
+
+    my($name,$src,$alignment,@other) =
+	rearrange([NAME,SRC,ALIGN],@p);
+
+    my($align) = $alignment ? " align=\U\"$alignment\"" : '';
+    my($other) = @other ? " @other" : '';
+    $name=$self->escapeHTML($name);
+    return $XHTML ? qq(<input type="image" name="$name" src="$src"$align$other />)
+                  : qq/<input type="image" name="$name" src="$src"$align$other>/;
+}
+END_OF_FUNC
+
+
+#### Method: self_url
+# Returns a URL containing the current script and all its
+# param/value pairs arranged as a query.  You can use this
+# to create a link that, when selected, will reinvoke the
+# script with all its state information preserved.
+####
+'self_url' => <<'END_OF_FUNC',
+sub self_url {
+    my($self,@p) = self_or_default(@_);
+    return $self->url('-path_info'=>1,'-query'=>1,'-full'=>1,@p);
+}
+END_OF_FUNC
+
+
+# This is provided as a synonym to self_url() for people unfortunate
+# enough to have incorporated it into their programs already!
+'state' => <<'END_OF_FUNC',
+sub state {
+    &self_url;
+}
+END_OF_FUNC
+
+
+#### Method: url
+# Like self_url, but doesn't return the query string part of
+# the URL.
+####
+'url' => <<'END_OF_FUNC',
+sub url {
+    my($self,@p) = self_or_default(@_);
+    my ($relative,$absolute,$full,$path_info,$query,$base,$rewrite) = 
+	rearrange(['RELATIVE','ABSOLUTE','FULL',['PATH','PATH_INFO'],['QUERY','QUERY_STRING'],'BASE','REWRITE'],@p);
+    my $url  = '';
+    $full++      if $base || !($relative || $absolute);
+    $rewrite++   unless defined $rewrite;
+
+    my $path        =  $self->path_info;
+    my $script_name =  $self->script_name;
+    my $request_uri = $self->request_uri || '';
+    my $query_str   =  $self->query_string;
+
+    my $rewrite_in_use = $request_uri && $request_uri !~ /^$script_name/;
+    undef $path if $rewrite_in_use && $rewrite;  # path not valid when rewriting active
+
+    my $uri         =  $rewrite && $request_uri ? $request_uri : $script_name;
+    $uri            =~ s/\?.*$//;                                 # remove query string
+    $uri            =~ s/$path$//      if defined $path;          # remove path
+
+    if ($full) {
+	my $protocol = $self->protocol();
+	$url = "$protocol://";
+	my $vh = http('x_forwarded_host') || http('host');
+	if ($vh) {
+	    $url .= $vh;
+	} else {
+	    $url .= server_name();
+	    my $port = $self->server_port;
+	    $url .= ":" . $port
+		unless (lc($protocol) eq 'http'  && $port == 80)
+		    || (lc($protocol) eq 'https' && $port == 443);
+	}
+        return $url if $base;
+	$url .= $uri;
+    } elsif ($relative) {
+	($url) = $script_name =~ m!([^/]+)$!;
+    } elsif ($absolute) {
+	$url = $uri;
+    }
+
+    $url .= $path         if $path_info and defined $path;
+    $url .= "?$query_str" if $query     and $query_str ne '';
+    $url =~ s/([^a-zA-Z0-9_.%;&?\/\\:+=~-])/sprintf("%%%02X",ord($1))/eg;
+    return $url;
+}
+
+END_OF_FUNC
+
+#### Method: cookie
+# Set or read a cookie from the specified name.
+# Cookie can then be passed to header().
+# Usual rules apply to the stickiness of -value.
+#  Parameters:
+#   -name -> name for this cookie (optional)
+#   -value -> value of this cookie (scalar, array or hash) 
+#   -path -> paths for which this cookie is valid (optional)
+#   -domain -> internet domain in which this cookie is valid (optional)
+#   -secure -> if true, cookie only passed through secure channel (optional)
+#   -expires -> expiry date in format Wdy, DD-Mon-YYYY HH:MM:SS GMT (optional)
+####
+'cookie' => <<'END_OF_FUNC',
+sub cookie {
+    my($self,@p) = self_or_default(@_);
+    my($name,$value,$path,$domain,$secure,$expires) =
+	rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES],@p);
+
+    require CGI::Cookie;
+
+    # if no value is supplied, then we retrieve the
+    # value of the cookie, if any.  For efficiency, we cache the parsed
+    # cookies in our state variables.
+    unless ( defined($value) ) {
+	$self->{'.cookies'} = CGI::Cookie->fetch
+	    unless $self->{'.cookies'};
+
+	# If no name is supplied, then retrieve the names of all our cookies.
+	return () unless $self->{'.cookies'};
+	return keys %{$self->{'.cookies'}} unless $name;
+	return () unless $self->{'.cookies'}->{$name};
+	return $self->{'.cookies'}->{$name}->value if defined($name) && $name ne '';
+    }
+
+    # If we get here, we're creating a new cookie
+    return undef unless defined($name) && $name ne '';	# this is an error
+
+    my @param;
+    push(@param,'-name'=>$name);
+    push(@param,'-value'=>$value);
+    push(@param,'-domain'=>$domain) if $domain;
+    push(@param,'-path'=>$path) if $path;
+    push(@param,'-expires'=>$expires) if $expires;
+    push(@param,'-secure'=>$secure) if $secure;
+
+    return new CGI::Cookie(@param);
+}
+END_OF_FUNC
+
+'parse_keywordlist' => <<'END_OF_FUNC',
+sub parse_keywordlist {
+    my($self,$tosplit) = @_;
+    $tosplit = unescape($tosplit); # unescape the keywords
+    $tosplit=~tr/+/ /;          # pluses to spaces
+    my(@keywords) = split(/\s+/,$tosplit);
+    return @keywords;
+}
+END_OF_FUNC
+
+'param_fetch' => <<'END_OF_FUNC',
+sub param_fetch {
+    my($self,@p) = self_or_default(@_);
+    my($name) = rearrange([NAME],@p);
+    unless (exists($self->{$name})) {
+	$self->add_parameter($name);
+	$self->{$name} = [];
+    }
+    
+    return $self->{$name};
+}
+END_OF_FUNC
+
+###############################################
+# OTHER INFORMATION PROVIDED BY THE ENVIRONMENT
+###############################################
+
+#### Method: path_info
+# Return the extra virtual path information provided
+# after the URL (if any)
+####
+'path_info' => <<'END_OF_FUNC',
+sub path_info {
+    my ($self,$info) = self_or_default(@_);
+    if (defined($info)) {
+	$info = "/$info" if $info ne '' &&  substr($info,0,1) ne '/';
+	$self->{'.path_info'} = $info;
+    } elsif (! defined($self->{'.path_info'}) ) {
+        my (undef,$path_info) = $self->_name_and_path_from_env;
+	$self->{'.path_info'} = $path_info || '';
+	# hack to fix broken path info in IIS
+	$self->{'.path_info'} =~ s/^\Q$ENV{'SCRIPT_NAME'}\E// if $IIS;
+
+    }
+    return $self->{'.path_info'};
+}
+END_OF_FUNC
+
+# WE USE THIS TO COMPENSATE FOR A BUG IN APACHE 2 PRESENT AT LEAST UP THROUGH 2.0.54
+'_name_and_path_from_env' => <<'END_OF_FUNC',
+sub _name_and_path_from_env {
+   my $self = shift;
+   my $raw_script_name = $ENV{SCRIPT_NAME} || '';
+   my $raw_path_info   = $ENV{PATH_INFO}   || '';
+   my $uri             = $ENV{REQUEST_URI} || '';
+
+   if ($raw_script_name =~ m/$raw_path_info$/) {
+     $raw_script_name =~ s/$raw_path_info$//;
+   }
+
+   my @uri_double_slashes  = $uri =~ m^(/{2,}?)^g;
+   my @path_double_slashes = "$raw_script_name $raw_path_info" =~ m^(/{2,}?)^g;
+
+   my $apache_bug      = @uri_double_slashes != @path_double_slashes;
+   return ($raw_script_name,$raw_path_info) unless $apache_bug;
+
+   my $path_info_search = $raw_path_info;
+   # these characters will not (necessarily) be escaped
+   $path_info_search    =~ s/([^a-zA-Z0-9$()':_.,+*\/;?=&-])/uc sprintf("%%%02x",ord($1))/eg;
+   $path_info_search    = quotemeta($path_info_search);
+   $path_info_search    =~ s!/!/+!g;
+   if ($uri =~ m/^(.+)($path_info_search)/) {
+       return ($1,$2);
+   } else {
+       return ($raw_script_name,$raw_path_info);
+   }
+}
+END_OF_FUNC
+
+
+#### Method: request_method
+# Returns 'POST', 'GET', 'PUT' or 'HEAD'
+####
+'request_method' => <<'END_OF_FUNC',
+sub request_method {
+    return $ENV{'REQUEST_METHOD'};
+}
+END_OF_FUNC
+
+#### Method: content_type
+# Returns the content_type string
+####
+'content_type' => <<'END_OF_FUNC',
+sub content_type {
+    return $ENV{'CONTENT_TYPE'};
+}
+END_OF_FUNC
+
+#### Method: path_translated
+# Return the physical path information provided
+# by the URL (if any)
+####
+'path_translated' => <<'END_OF_FUNC',
+sub path_translated {
+    return $ENV{'PATH_TRANSLATED'};
+}
+END_OF_FUNC
+
+
+#### Method: request_uri
+# Return the literal request URI
+####
+'request_uri' => <<'END_OF_FUNC',
+sub request_uri {
+    return $ENV{'REQUEST_URI'};
+}
+END_OF_FUNC
+
+
+#### Method: query_string
+# Synthesize a query string from our current
+# parameters
+####
+'query_string' => <<'END_OF_FUNC',
+sub query_string {
+    my($self) = self_or_default(@_);
+    my($param,$value,@pairs);
+    foreach $param ($self->param) {
+	my($eparam) = escape($param);
+	foreach $value ($self->param($param)) {
+	    $value = escape($value);
+            next unless defined $value;
+	    push(@pairs,"$eparam=$value");
+	}
+    }
+    foreach (keys %{$self->{'.fieldnames'}}) {
+      push(@pairs,".cgifields=".escape("$_"));
+    }
+    return join($USE_PARAM_SEMICOLONS ? ';' : '&',@pairs);
+}
+END_OF_FUNC
+
+
+#### Method: accept
+# Without parameters, returns an array of the
+# MIME types the browser accepts.
+# With a single parameter equal to a MIME
+# type, will return undef if the browser won't
+# accept it, 1 if the browser accepts it but
+# doesn't give a preference, or a floating point
+# value between 0.0 and 1.0 if the browser
+# declares a quantitative score for it.
+# This handles MIME type globs correctly.
+####
+'Accept' => <<'END_OF_FUNC',
+sub Accept {
+    my($self,$search) = self_or_CGI(@_);
+    my(%prefs,$type,$pref,$pat);
+    
+    my(@accept) = split(',',$self->http('accept'));
+
+    foreach (@accept) {
+	($pref) = /q=(\d\.\d+|\d+)/;
+	($type) = m#(\S+/[^;]+)#;
+	next unless $type;
+	$prefs{$type}=$pref || 1;
+    }
+
+    return keys %prefs unless $search;
+    
+    # if a search type is provided, we may need to
+    # perform a pattern matching operation.
+    # The MIME types use a glob mechanism, which
+    # is easily translated into a perl pattern match
+
+    # First return the preference for directly supported
+    # types:
+    return $prefs{$search} if $prefs{$search};
+
+    # Didn't get it, so try pattern matching.
+    foreach (keys %prefs) {
+	next unless /\*/;       # not a pattern match
+	($pat = $_) =~ s/([^\w*])/\\$1/g; # escape meta characters
+	$pat =~ s/\*/.*/g; # turn it into a pattern
+	return $prefs{$_} if $search=~/$pat/;
+    }
+}
+END_OF_FUNC
+
+
+#### Method: user_agent
+# If called with no parameters, returns the user agent.
+# If called with one parameter, does a pattern match (case
+# insensitive) on the user agent.
+####
+'user_agent' => <<'END_OF_FUNC',
+sub user_agent {
+    my($self,$match)=self_or_CGI(@_);
+    return $self->http('user_agent') unless $match;
+    return $self->http('user_agent') =~ /$match/i;
+}
+END_OF_FUNC
+
+
+#### Method: raw_cookie
+# Returns the magic cookies for the session.
+# The cookies are not parsed or altered in any way, i.e.
+# cookies are returned exactly as given in the HTTP
+# headers.  If a cookie name is given, only that cookie's
+# value is returned, otherwise the entire raw cookie
+# is returned.
+####
+'raw_cookie' => <<'END_OF_FUNC',
+sub raw_cookie {
+    my($self,$key) = self_or_CGI(@_);
+
+    require CGI::Cookie;
+
+    if (defined($key)) {
+	$self->{'.raw_cookies'} = CGI::Cookie->raw_fetch
+	    unless $self->{'.raw_cookies'};
+
+	return () unless $self->{'.raw_cookies'};
+	return () unless $self->{'.raw_cookies'}->{$key};
+	return $self->{'.raw_cookies'}->{$key};
+    }
+    return $self->http('cookie') || $ENV{'COOKIE'} || '';
+}
+END_OF_FUNC
+
+#### Method: virtual_host
+# Return the name of the virtual_host, which
+# is not always the same as the server
+######
+'virtual_host' => <<'END_OF_FUNC',
+sub virtual_host {
+    my $vh = http('x_forwarded_host') || http('host') || server_name();
+    $vh =~ s/:\d+$//;		# get rid of port number
+    return $vh;
+}
+END_OF_FUNC
+
+#### Method: remote_host
+# Return the name of the remote host, or its IP
+# address if unavailable.  If this variable isn't
+# defined, it returns "localhost" for debugging
+# purposes.
+####
+'remote_host' => <<'END_OF_FUNC',
+sub remote_host {
+    return $ENV{'REMOTE_HOST'} || $ENV{'REMOTE_ADDR'} 
+    || 'localhost';
+}
+END_OF_FUNC
+
+
+#### Method: remote_addr
+# Return the IP addr of the remote host.
+####
+'remote_addr' => <<'END_OF_FUNC',
+sub remote_addr {
+    return $ENV{'REMOTE_ADDR'} || '127.0.0.1';
+}
+END_OF_FUNC
+
+
+#### Method: script_name
+# Return the partial URL to this script for
+# self-referencing scripts.  Also see
+# self_url(), which returns a URL with all state information
+# preserved.
+####
+'script_name' => <<'END_OF_FUNC',
+sub script_name {
+    my ($self,@p) = self_or_default(@_);
+    if (@p) {
+        $self->{'.script_name'} = shift;
+    } elsif (!exists $self->{'.script_name'}) {
+        my ($script_name,$path_info) = $self->_name_and_path_from_env();
+        $self->{'.script_name'} = $script_name;
+    }
+    return $self->{'.script_name'};
+}
+END_OF_FUNC
+
+
+#### Method: referer
+# Return the HTTP_REFERER: useful for generating
+# a GO BACK button.
+####
+'referer' => <<'END_OF_FUNC',
+sub referer {
+    my($self) = self_or_CGI(@_);
+    return $self->http('referer');
+}
+END_OF_FUNC
+
+
+#### Method: server_name
+# Return the name of the server
+####
+'server_name' => <<'END_OF_FUNC',
+sub server_name {
+    return $ENV{'SERVER_NAME'} || 'localhost';
+}
+END_OF_FUNC
+
+#### Method: server_software
+# Return the name of the server software
+####
+'server_software' => <<'END_OF_FUNC',
+sub server_software {
+    return $ENV{'SERVER_SOFTWARE'} || 'cmdline';
+}
+END_OF_FUNC
+
+#### Method: virtual_port
+# Return the server port, taking virtual hosts into account
+####
+'virtual_port' => <<'END_OF_FUNC',
+sub virtual_port {
+    my($self) = self_or_default(@_);
+    my $vh = $self->http('x_forwarded_host') || $self->http('host');
+    my $protocol = $self->protocol;
+    if ($vh) {
+        return ($vh =~ /:(\d+)$/)[0] || ($protocol eq 'https' ? 443 : 80);
+    } else {
+        return $self->server_port();
+    }
+}
+END_OF_FUNC
+
+#### Method: server_port
+# Return the tcp/ip port the server is running on
+####
+'server_port' => <<'END_OF_FUNC',
+sub server_port {
+    return $ENV{'SERVER_PORT'} || 80; # for debugging
+}
+END_OF_FUNC
+
+#### Method: server_protocol
+# Return the protocol (usually HTTP/1.0)
+####
+'server_protocol' => <<'END_OF_FUNC',
+sub server_protocol {
+    return $ENV{'SERVER_PROTOCOL'} || 'HTTP/1.0'; # for debugging
+}
+END_OF_FUNC
+
+#### Method: http
+# Return the value of an HTTP variable, or
+# the list of variables if none provided
+####
+'http' => <<'END_OF_FUNC',
+sub http {
+    my ($self,$parameter) = self_or_CGI(@_);
+    return $ENV{$parameter} if $parameter=~/^HTTP/;
+    $parameter =~ tr/-/_/;
+    return $ENV{"HTTP_\U$parameter\E"} if $parameter;
+    my(@p);
+    foreach (keys %ENV) {
+	push(@p,$_) if /^HTTP/;
+    }
+    return @p;
+}
+END_OF_FUNC
+
+#### Method: https
+# Return the value of HTTPS
+####
+'https' => <<'END_OF_FUNC',
+sub https {
+    local($^W)=0;
+    my ($self,$parameter) = self_or_CGI(@_);
+    return $ENV{HTTPS} unless $parameter;
+    return $ENV{$parameter} if $parameter=~/^HTTPS/;
+    $parameter =~ tr/-/_/;
+    return $ENV{"HTTPS_\U$parameter\E"} if $parameter;
+    my(@p);
+    foreach (keys %ENV) {
+	push(@p,$_) if /^HTTPS/;
+    }
+    return @p;
+}
+END_OF_FUNC
+
+#### Method: protocol
+# Return the protocol (http or https currently)
+####
+'protocol' => <<'END_OF_FUNC',
+sub protocol {
+    local($^W)=0;
+    my $self = shift;
+    return 'https' if uc($self->https()) eq 'ON'; 
+    return 'https' if $self->server_port == 443;
+    my $prot = $self->server_protocol;
+    my($protocol,$version) = split('/',$prot);
+    return "\L$protocol\E";
+}
+END_OF_FUNC
+
+#### Method: remote_ident
+# Return the identity of the remote user
+# (but only if his host is running identd)
+####
+'remote_ident' => <<'END_OF_FUNC',
+sub remote_ident {
+    return $ENV{'REMOTE_IDENT'};
+}
+END_OF_FUNC
+
+
+#### Method: auth_type
+# Return the type of use verification/authorization in use, if any.
+####
+'auth_type' => <<'END_OF_FUNC',
+sub auth_type {
+    return $ENV{'AUTH_TYPE'};
+}
+END_OF_FUNC
+
+
+#### Method: remote_user
+# Return the authorization name used for user
+# verification.
+####
+'remote_user' => <<'END_OF_FUNC',
+sub remote_user {
+    return $ENV{'REMOTE_USER'};
+}
+END_OF_FUNC
+
+
+#### Method: user_name
+# Try to return the remote user's name by hook or by
+# crook
+####
+'user_name' => <<'END_OF_FUNC',
+sub user_name {
+    my ($self) = self_or_CGI(@_);
+    return $self->http('from') || $ENV{'REMOTE_IDENT'} || $ENV{'REMOTE_USER'};
+}
+END_OF_FUNC
+
+#### Method: nosticky
+# Set or return the NOSTICKY global flag
+####
+'nosticky' => <<'END_OF_FUNC',
+sub nosticky {
+    my ($self,$param) = self_or_CGI(@_);
+    $CGI::NOSTICKY = $param if defined($param);
+    return $CGI::NOSTICKY;
+}
+END_OF_FUNC
+
+#### Method: nph
+# Set or return the NPH global flag
+####
+'nph' => <<'END_OF_FUNC',
+sub nph {
+    my ($self,$param) = self_or_CGI(@_);
+    $CGI::NPH = $param if defined($param);
+    return $CGI::NPH;
+}
+END_OF_FUNC
+
+#### Method: private_tempfiles
+# Set or return the private_tempfiles global flag
+####
+'private_tempfiles' => <<'END_OF_FUNC',
+sub private_tempfiles {
+    my ($self,$param) = self_or_CGI(@_);
+    $CGI::PRIVATE_TEMPFILES = $param if defined($param);
+    return $CGI::PRIVATE_TEMPFILES;
+}
+END_OF_FUNC
+#### Method: close_upload_files
+# Set or return the close_upload_files global flag
+####
+'close_upload_files' => <<'END_OF_FUNC',
+sub close_upload_files {
+    my ($self,$param) = self_or_CGI(@_);
+    $CGI::CLOSE_UPLOAD_FILES = $param if defined($param);
+    return $CGI::CLOSE_UPLOAD_FILES;
+}
+END_OF_FUNC
+
+
+#### Method: default_dtd
+# Set or return the default_dtd global
+####
+'default_dtd' => <<'END_OF_FUNC',
+sub default_dtd {
+    my ($self,$param,$param2) = self_or_CGI(@_);
+    if (defined $param2 && defined $param) {
+        $CGI::DEFAULT_DTD = [ $param, $param2 ];
+    } elsif (defined $param) {
+        $CGI::DEFAULT_DTD = $param;
+    }
+    return $CGI::DEFAULT_DTD;
+}
+END_OF_FUNC
+
+# -------------- really private subroutines -----------------
+'previous_or_default' => <<'END_OF_FUNC',
+sub previous_or_default {
+    my($self,$name,$defaults,$override) = @_;
+    my(%selected);
+
+    if (!$override && ($self->{'.fieldnames'}->{$name} || 
+		       defined($self->param($name)) ) ) {
+	grep($selected{$_}++,$self->param($name));
+    } elsif (defined($defaults) && ref($defaults) && 
+	     (ref($defaults) eq 'ARRAY')) {
+	grep($selected{$_}++,@{$defaults});
+    } else {
+	$selected{$defaults}++ if defined($defaults);
+    }
+
+    return %selected;
+}
+END_OF_FUNC
+
+'register_parameter' => <<'END_OF_FUNC',
+sub register_parameter {
+    my($self,$param) = @_;
+    $self->{'.parametersToAdd'}->{$param}++;
+}
+END_OF_FUNC
+
+'get_fields' => <<'END_OF_FUNC',
+sub get_fields {
+    my($self) = @_;
+    return $self->CGI::hidden('-name'=>'.cgifields',
+			      '-values'=>[keys %{$self->{'.parametersToAdd'}}],
+			      '-override'=>1);
+}
+END_OF_FUNC
+
+'read_from_cmdline' => <<'END_OF_FUNC',
+sub read_from_cmdline {
+    my($input,@words);
+    my($query_string);
+    my($subpath);
+    if ($DEBUG && @ARGV) {
+	@words = @ARGV;
+    } elsif ($DEBUG > 1) {
+	require "shellwords.pl";
+	print STDERR "(offline mode: enter name=value pairs on standard input; press ^D or ^Z when done)\n";
+	chomp(@lines = <STDIN>); # remove newlines
+	$input = join(" ",@lines);
+	@words = &shellwords($input);    
+    }
+    foreach (@words) {
+	s/\\=/%3D/g;
+	s/\\&/%26/g;	    
+    }
+
+    if ("@words"=~/=/) {
+	$query_string = join('&',@words);
+    } else {
+	$query_string = join('+',@words);
+    }
+    if ($query_string =~ /^(.*?)\?(.*)$/)
+    {
+        $query_string = $2;
+        $subpath = $1;
+    }
+    return { 'query_string' => $query_string, 'subpath' => $subpath };
+}
+END_OF_FUNC
+
+#####
+# subroutine: read_multipart
+#
+# Read multipart data and store it into our parameters.
+# An interesting feature is that if any of the parts is a file, we
+# create a temporary file and open up a filehandle on it so that the
+# caller can read from it if necessary.
+#####
+'read_multipart' => <<'END_OF_FUNC',
+sub read_multipart {
+    my($self,$boundary,$length) = @_;
+    my($buffer) = $self->new_MultipartBuffer($boundary,$length);
+    return unless $buffer;
+    my(%header,$body);
+    my $filenumber = 0;
+    while (!$buffer->eof) {
+	%header = $buffer->readHeader;
+
+	unless (%header) {
+	    $self->cgi_error("400 Bad request (malformed multipart POST)");
+	    return;
+	}
+
+	my($param)= $header{'Content-Disposition'}=~/ name="([^;]*)"/;
+        $param .= $TAINTED;
+
+	# Bug:  Netscape doesn't escape quotation marks in file names!!!
+	my($filename) = $header{'Content-Disposition'}=~/ filename="([^;]*)"/;
+	# Test for Opera's multiple upload feature
+	my($multipart) = ( defined( $header{'Content-Type'} ) &&
+		$header{'Content-Type'} =~ /multipart\/mixed/ ) ?
+		1 : 0;
+
+	# add this parameter to our list
+	$self->add_parameter($param);
+
+	# If no filename specified, then just read the data and assign it
+	# to our parameter list.
+	if ( ( !defined($filename) || $filename eq '' ) && !$multipart ) {
+	    my($value) = $buffer->readBody;
+            $value .= $TAINTED;
+	    push(@{$self->{$param}},$value);
+	    next;
+	}
+
+	my ($tmpfile,$tmp,$filehandle);
+      UPLOADS: {
+	  # If we get here, then we are dealing with a potentially large
+	  # uploaded form.  Save the data to a temporary file, then open
+	  # the file for reading.
+
+	  # skip the file if uploads disabled
+	  if ($DISABLE_UPLOADS) {
+	      while (defined($data = $buffer->read)) { }
+	      last UPLOADS;
+	  }
+
+	  # set the filename to some recognizable value
+          if ( ( !defined($filename) || $filename eq '' ) && $multipart ) {
+              $filename = "multipart/mixed";
+          }
+
+	  # choose a relatively unpredictable tmpfile sequence number
+          my $seqno = unpack("%16C*",join('',localtime,grep {defined $_} values %ENV));
+          for (my $cnt=10;$cnt>0;$cnt--) {
+	    next unless $tmpfile = new CGITempFile($seqno);
+	    $tmp = $tmpfile->as_string;
+	    last if defined($filehandle = Fh->new($filename,$tmp,$PRIVATE_TEMPFILES));
+            $seqno += int rand(100);
+          }
+          die "CGI open of tmpfile: $!\n" unless defined $filehandle;
+	  $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode 
+                     && defined fileno($filehandle);
+
+	  # if this is an multipart/mixed attachment, save the header
+	  # together with the body for later parsing with an external
+	  # MIME parser module
+	  if ( $multipart ) {
+	      foreach ( keys %header ) {
+		  print $filehandle "$_: $header{$_}${CRLF}";
+	      }
+	      print $filehandle "${CRLF}";
+	  }
+
+	  my ($data);
+	  local($\) = '';
+          my $totalbytes;
+          while (defined($data = $buffer->read)) {
+              if (defined $self->{'.upload_hook'})
+               {
+                  $totalbytes += length($data);
+                   &{$self->{'.upload_hook'}}($filename ,$data, $totalbytes, $self->{'.upload_data'});
+              }
+	      print $filehandle $data;
+          }
+
+	  # back up to beginning of file
+	  seek($filehandle,0,0);
+
+      ## Close the filehandle if requested this allows a multipart MIME
+      ## upload to contain many files, and we won't die due to too many
+      ## open file handles. The user can access the files using the hash
+      ## below.
+      close $filehandle if $CLOSE_UPLOAD_FILES;
+	  $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode;
+
+	  # Save some information about the uploaded file where we can get
+	  # at it later.
+	  # Use the typeglob as the key, as this is guaranteed to be
+	  # unique for each filehandle.  Don't use the file descriptor as
+	  # this will be re-used for each filehandle if the
+	  # close_upload_files feature is used.
+	  $self->{'.tmpfiles'}->{$$filehandle}= {
+              hndl => $filehandle,
+	      name => $tmpfile,
+	      info => {%header},
+	  };
+	  push(@{$self->{$param}},$filehandle);
+      }
+    }
+}
+END_OF_FUNC
+
+'upload' =><<'END_OF_FUNC',
+sub upload {
+    my($self,$param_name) = self_or_default(@_);
+    my @param = grep(ref && fileno($_), $self->param($param_name));
+    return unless @param;
+    return wantarray ? @param : $param[0];
+}
+END_OF_FUNC
+
+'tmpFileName' => <<'END_OF_FUNC',
+sub tmpFileName {
+    my($self,$filename) = self_or_default(@_);
+    return $self->{'.tmpfiles'}->{$$filename}->{name} ?
+	$self->{'.tmpfiles'}->{$$filename}->{name}->as_string
+	    : '';
+}
+END_OF_FUNC
+
+'uploadInfo' => <<'END_OF_FUNC',
+sub uploadInfo {
+    my($self,$filename) = self_or_default(@_);
+    return $self->{'.tmpfiles'}->{$$filename}->{info};
+}
+END_OF_FUNC
+
+# internal routine, don't use
+'_set_values_and_labels' => <<'END_OF_FUNC',
+sub _set_values_and_labels {
+    my $self = shift;
+    my ($v,$l,$n) = @_;
+    $$l = $v if ref($v) eq 'HASH' && !ref($$l);
+    return $self->param($n) if !defined($v);
+    return $v if !ref($v);
+    return ref($v) eq 'HASH' ? keys %$v : @$v;
+}
+END_OF_FUNC
+
+# internal routine, don't use
+'_set_attributes' => <<'END_OF_FUNC',
+sub _set_attributes {
+    my $self = shift;
+    my($element, $attributes) = @_;
+    return '' unless defined($attributes->{$element});
+    $attribs = ' ';
+    foreach my $attrib (keys %{$attributes->{$element}}) {
+        (my $clean_attrib = $attrib) =~ s/^-//;
+        $attribs .= "@{[lc($clean_attrib)]}=\"$attributes->{$element}{$attrib}\" ";
+    }
+    $attribs =~ s/ $//;
+    return $attribs;
+}
+END_OF_FUNC
+
+'_compile_all' => <<'END_OF_FUNC',
+sub _compile_all {
+    foreach (@_) {
+	next if defined(&$_);
+	$AUTOLOAD = "CGI::$_";
+	_compile();
+    }
+}
+END_OF_FUNC
+
+);
+END_OF_AUTOLOAD
+;
+
+#########################################################
+# Globals and stubs for other packages that we use.
+#########################################################
+
+################### Fh -- lightweight filehandle ###############
+package Fh;
+use overload 
+    '""'  => \&asString,
+    'cmp' => \&compare,
+    'fallback'=>1;
+
+$FH='fh00000';
+
+*Fh::AUTOLOAD = \&CGI::AUTOLOAD;
+
+sub DESTROY {
+    my $self = shift;
+    close $self;
+}
+
+$AUTOLOADED_ROUTINES = '';      # prevent -w error
+$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
+%SUBS =  (
+'asString' => <<'END_OF_FUNC',
+sub asString {
+    my $self = shift;
+    # get rid of package name
+    (my $i = $$self) =~ s/^\*(\w+::fh\d{5})+//; 
+    $i =~ s/%(..)/ chr(hex($1)) /eg;
+    return $i.$CGI::TAINTED;
+# BEGIN DEAD CODE
+# This was an extremely clever patch that allowed "use strict refs".
+# Unfortunately it relied on another bug that caused leaky file descriptors.
+# The underlying bug has been fixed, so this no longer works.  However
+# "strict refs" still works for some reason.
+#    my $self = shift;
+#    return ${*{$self}{SCALAR}};
+# END DEAD CODE
+}
+END_OF_FUNC
+
+'compare' => <<'END_OF_FUNC',
+sub compare {
+    my $self = shift;
+    my $value = shift;
+    return "$self" cmp $value;
+}
+END_OF_FUNC
+
+'new'  => <<'END_OF_FUNC',
+sub new {
+    my($pack,$name,$file,$delete) = @_;
+    _setup_symbols(@SAVED_SYMBOLS) if @SAVED_SYMBOLS;
+    require Fcntl unless defined &Fcntl::O_RDWR;
+    (my $safename = $name) =~ s/([':%])/ sprintf '%%%02X', ord $1 /eg;
+    my $fv = ++$FH . $safename;
+    my $ref = \*{"Fh::$fv"};
+    $file =~ m!^([a-zA-Z0-9_ \'\":/.\$\\-]+)$! || return;
+    my $safe = $1;
+    sysopen($ref,$safe,Fcntl::O_RDWR()|Fcntl::O_CREAT()|Fcntl::O_EXCL(),0600) || return;
+    unlink($safe) if $delete;
+    CORE::delete $Fh::{$fv};
+    return bless $ref,$pack;
+}
+END_OF_FUNC
+
+);
+END_OF_AUTOLOAD
+
+######################## MultipartBuffer ####################
+package MultipartBuffer;
+
+use constant DEBUG => 0;
+
+# how many bytes to read at a time.  We use
+# a 4K buffer by default.
+$INITIAL_FILLUNIT = 1024 * 4;
+$TIMEOUT = 240*60;       # 4 hour timeout for big files
+$SPIN_LOOP_MAX = 2000;  # bug fix for some Netscape servers
+$CRLF=$CGI::CRLF;
+
+#reuse the autoload function
+*MultipartBuffer::AUTOLOAD = \&CGI::AUTOLOAD;
+
+# avoid autoloader warnings
+sub DESTROY {}
+
+###############################################################################
+################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND ####################
+###############################################################################
+$AUTOLOADED_ROUTINES = '';      # prevent -w error
+$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
+%SUBS =  (
+
+'new' => <<'END_OF_FUNC',
+sub new {
+    my($package,$interface,$boundary,$length) = @_;
+    $FILLUNIT = $INITIAL_FILLUNIT;
+    $CGI::DefaultClass->binmode($IN); # if $CGI::needs_binmode;  # just do it always
+
+    # If the user types garbage into the file upload field,
+    # then Netscape passes NOTHING to the server (not good).
+    # We may hang on this read in that case. So we implement
+    # a read timeout.  If nothing is ready to read
+    # by then, we return.
+
+    # Netscape seems to be a little bit unreliable
+    # about providing boundary strings.
+    my $boundary_read = 0;
+    if ($boundary) {
+
+	# Under the MIME spec, the boundary consists of the 
+	# characters "--" PLUS the Boundary string
+
+	# BUG: IE 3.01 on the Macintosh uses just the boundary -- not
+	# the two extra hyphens.  We do a special case here on the user-agent!!!!
+	$boundary = "--$boundary" unless CGI::user_agent('MSIE\s+3\.0[12];\s*Mac|DreamPassport');
+
+    } else { # otherwise we find it ourselves
+	my($old);
+	($old,$/) = ($/,$CRLF); # read a CRLF-delimited line
+	$boundary = <STDIN>;      # BUG: This won't work correctly under mod_perl
+	$length -= length($boundary);
+	chomp($boundary);               # remove the CRLF
+	$/ = $old;                      # restore old line separator
+        $boundary_read++;
+    }
+
+    my $self = {LENGTH=>$length,
+		CHUNKED=>!defined $length,
+		BOUNDARY=>$boundary,
+		INTERFACE=>$interface,
+		BUFFER=>'',
+	    };
+
+    $FILLUNIT = length($boundary)
+	if length($boundary) > $FILLUNIT;
+
+    my $retval = bless $self,ref $package || $package;
+
+    # Read the preamble and the topmost (boundary) line plus the CRLF.
+    unless ($boundary_read) {
+      while ($self->read(0)) { }
+    }
+    die "Malformed multipart POST: data truncated\n" if $self->eof;
+
+    return $retval;
+}
+END_OF_FUNC
+
+'readHeader' => <<'END_OF_FUNC',
+sub readHeader {
+    my($self) = @_;
+    my($end);
+    my($ok) = 0;
+    my($bad) = 0;
+
+    local($CRLF) = "\015\012" if $CGI::OS eq 'VMS' || $CGI::EBCDIC;
+
+    do {
+	$self->fillBuffer($FILLUNIT);
+	$ok++ if ($end = index($self->{BUFFER},"${CRLF}${CRLF}")) >= 0;
+	$ok++ if $self->{BUFFER} eq '';
+	$bad++ if !$ok && $self->{LENGTH} <= 0;
+	# this was a bad idea
+	# $FILLUNIT *= 2 if length($self->{BUFFER}) >= $FILLUNIT; 
+    } until $ok || $bad;
+    return () if $bad;
+
+    #EBCDIC NOTE: translate header into EBCDIC, but watch out for continuation lines!
+
+    my($header) = substr($self->{BUFFER},0,$end+2);
+    substr($self->{BUFFER},0,$end+4) = '';
+    my %return;
+
+    if ($CGI::EBCDIC) {
+      warn "untranslated header=$header\n" if DEBUG;
+      $header = CGI::Util::ascii2ebcdic($header);
+      warn "translated header=$header\n" if DEBUG;
+    }
+
+    # See RFC 2045 Appendix A and RFC 822 sections 3.4.8
+    #   (Folding Long Header Fields), 3.4.3 (Comments)
+    #   and 3.4.5 (Quoted-Strings).
+
+    my $token = '[-\w!\#$%&\'*+.^_\`|{}~]';
+    $header=~s/$CRLF\s+/ /og;		# merge continuation lines
+
+    while ($header=~/($token+):\s+([^$CRLF]*)/mgox) {
+        my ($field_name,$field_value) = ($1,$2);
+	$field_name =~ s/\b(\w)/uc($1)/eg; #canonicalize
+	$return{$field_name}=$field_value;
+    }
+    return %return;
+}
+END_OF_FUNC
+
+# This reads and returns the body as a single scalar value.
+'readBody' => <<'END_OF_FUNC',
+sub readBody {
+    my($self) = @_;
+    my($data);
+    my($returnval)='';
+
+    #EBCDIC NOTE: want to translate returnval into EBCDIC HERE
+
+    while (defined($data = $self->read)) {
+	$returnval .= $data;
+    }
+
+    if ($CGI::EBCDIC) {
+      warn "untranslated body=$returnval\n" if DEBUG;
+      $returnval = CGI::Util::ascii2ebcdic($returnval);
+      warn "translated body=$returnval\n"   if DEBUG;
+    }
+    return $returnval;
+}
+END_OF_FUNC
+
+# This will read $bytes or until the boundary is hit, whichever happens
+# first.  After the boundary is hit, we return undef.  The next read will
+# skip over the boundary and begin reading again;
+'read' => <<'END_OF_FUNC',
+sub read {
+    my($self,$bytes) = @_;
+
+    # default number of bytes to read
+    $bytes = $bytes || $FILLUNIT;
+
+    # Fill up our internal buffer in such a way that the boundary
+    # is never split between reads.
+    $self->fillBuffer($bytes);
+
+    my $boundary_start = $CGI::EBCDIC ? CGI::Util::ebcdic2ascii($self->{BOUNDARY})      : $self->{BOUNDARY};
+    my $boundary_end   = $CGI::EBCDIC ? CGI::Util::ebcdic2ascii($self->{BOUNDARY}.'--') : $self->{BOUNDARY}.'--';
+
+    # Find the boundary in the buffer (it may not be there).
+    my $start = index($self->{BUFFER},$boundary_start);
+
+    warn "boundary=$self->{BOUNDARY} length=$self->{LENGTH} start=$start\n" if DEBUG;
+
+    # protect against malformed multipart POST operations
+    die "Malformed multipart POST\n" unless $self->{CHUNKED} || ($start >= 0 || $self->{LENGTH} > 0);
+
+    #EBCDIC NOTE: want to translate boundary search into ASCII here.
+
+    # If the boundary begins the data, then skip past it
+    # and return undef.
+    if ($start == 0) {
+
+	# clear us out completely if we've hit the last boundary.
+	if (index($self->{BUFFER},$boundary_end)==0) {
+	    $self->{BUFFER}='';
+	    $self->{LENGTH}=0;
+	    return undef;
+	}
+
+	# just remove the boundary.
+	substr($self->{BUFFER},0,length($boundary_start))='';
+        $self->{BUFFER} =~ s/^\012\015?//;
+	return undef;
+    }
+
+    my $bytesToReturn;
+    if ($start > 0) {           # read up to the boundary
+        $bytesToReturn = $start-2 > $bytes ? $bytes : $start;
+    } else {    # read the requested number of bytes
+	# leave enough bytes in the buffer to allow us to read
+	# the boundary.  Thanks to Kevin Hendrick for finding
+	# this one.
+	$bytesToReturn = $bytes - (length($boundary_start)+1);
+    }
+
+    my $returnval=substr($self->{BUFFER},0,$bytesToReturn);
+    substr($self->{BUFFER},0,$bytesToReturn)='';
+    
+    # If we hit the boundary, remove the CRLF from the end.
+    return ($bytesToReturn==$start)
+           ? substr($returnval,0,-2) : $returnval;
+}
+END_OF_FUNC
+
+
+# This fills up our internal buffer in such a way that the
+# boundary is never split between reads
+'fillBuffer' => <<'END_OF_FUNC',
+sub fillBuffer {
+    my($self,$bytes) = @_;
+    return unless $self->{CHUNKED} || $self->{LENGTH};
+
+    my($boundaryLength) = length($self->{BOUNDARY});
+    my($bufferLength) = length($self->{BUFFER});
+    my($bytesToRead) = $bytes - $bufferLength + $boundaryLength + 2;
+    $bytesToRead = $self->{LENGTH} if !$self->{CHUNKED} && $self->{LENGTH} < $bytesToRead;
+
+    # Try to read some data.  We may hang here if the browser is screwed up.
+    my $bytesRead = $self->{INTERFACE}->read_from_client(\$self->{BUFFER},
+							 $bytesToRead,
+							 $bufferLength);
+    warn "bytesToRead=$bytesToRead, bufferLength=$bufferLength, buffer=$self->{BUFFER}\n" if DEBUG;
+    $self->{BUFFER} = '' unless defined $self->{BUFFER};
+
+    # An apparent bug in the Apache server causes the read()
+    # to return zero bytes repeatedly without blocking if the
+    # remote user aborts during a file transfer.  I don't know how
+    # they manage this, but the workaround is to abort if we get
+    # more than SPIN_LOOP_MAX consecutive zero reads.
+    if ($bytesRead <= 0) {
+	die  "CGI.pm: Server closed socket during multipart read (client aborted?).\n"
+	    if ($self->{ZERO_LOOP_COUNTER}++ >= $SPIN_LOOP_MAX);
+    } else {
+	$self->{ZERO_LOOP_COUNTER}=0;
+    }
+
+    $self->{LENGTH} -= $bytesRead if !$self->{CHUNKED} && $bytesRead;
+}
+END_OF_FUNC
+
+
+# Return true when we've finished reading
+'eof' => <<'END_OF_FUNC'
+sub eof {
+    my($self) = @_;
+    return 1 if (length($self->{BUFFER}) == 0)
+		 && ($self->{LENGTH} <= 0);
+    undef;
+}
+END_OF_FUNC
+
+);
+END_OF_AUTOLOAD
+
+####################################################################################
+################################## TEMPORARY FILES #################################
+####################################################################################
+package CGITempFile;
+
+sub find_tempdir {
+  $SL = $CGI::SL;
+  $MAC = $CGI::OS eq 'MACINTOSH';
+  my ($vol) = $MAC ? MacPerl::Volumes() =~ /:(.*)/ : "";
+  unless (defined $TMPDIRECTORY) {
+    @TEMP=("${SL}usr${SL}tmp","${SL}var${SL}tmp",
+	   "C:${SL}temp","${SL}tmp","${SL}temp",
+	   "${vol}${SL}Temporary Items",
+           "${SL}WWW_ROOT", "${SL}SYS\$SCRATCH",
+	   "C:${SL}system${SL}temp");
+    unshift(@TEMP,$ENV{'TMPDIR'}) if defined $ENV{'TMPDIR'};
+
+    # this feature was supposed to provide per-user tmpfiles, but
+    # it is problematic.
+    #    unshift(@TEMP,(getpwuid($<))[7].'/tmp') if $CGI::OS eq 'UNIX';
+    # Rob: getpwuid() is unfortunately UNIX specific. On brain dead OS'es this
+    #    : can generate a 'getpwuid() not implemented' exception, even though
+    #    : it's never called.  Found under DOS/Win with the DJGPP perl port.
+    #    : Refer to getpwuid() only at run-time if we're fortunate and have  UNIX.
+    # unshift(@TEMP,(eval {(getpwuid($>))[7]}).'/tmp') if $CGI::OS eq 'UNIX' and $> != 0;
+
+    foreach (@TEMP) {
+      do {$TMPDIRECTORY = $_; last} if -d $_ && -w _;
+    }
+  }
+  $TMPDIRECTORY  = $MAC ? "" : "." unless $TMPDIRECTORY;
+}
+
+find_tempdir();
+
+$MAXTRIES = 5000;
+
+# cute feature, but overload implementation broke it
+# %OVERLOAD = ('""'=>'as_string');
+*CGITempFile::AUTOLOAD = \&CGI::AUTOLOAD;
+
+sub DESTROY {
+    my($self) = @_;
+    $$self =~ m!^([a-zA-Z0-9_ \'\":/.\$\\-]+)$! || return;
+    my $safe = $1;             # untaint operation
+    unlink $safe;              # get rid of the file
+}
+
+###############################################################################
+################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND ####################
+###############################################################################
+$AUTOLOADED_ROUTINES = '';      # prevent -w error
+$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
+%SUBS = (
+
+'new' => <<'END_OF_FUNC',
+sub new {
+    my($package,$sequence) = @_;
+    my $filename;
+    find_tempdir() unless -w $TMPDIRECTORY;
+    for (my $i = 0; $i < $MAXTRIES; $i++) {
+	last if ! -f ($filename = sprintf("${TMPDIRECTORY}${SL}CGItemp%d",$sequence++));
+    }
+    # check that it is a more-or-less valid filename
+    return unless $filename =~ m!^([a-zA-Z0-9_ \'\":/.\$\\-]+)$!;
+    # this used to untaint, now it doesn't
+    # $filename = $1;
+    return bless \$filename;
+}
+END_OF_FUNC
+
+'as_string' => <<'END_OF_FUNC'
+sub as_string {
+    my($self) = @_;
+    return $$self;
+}
+END_OF_FUNC
+
+);
+END_OF_AUTOLOAD
+
+package CGI;
+
+# We get a whole bunch of warnings about "possibly uninitialized variables"
+# when running with the -w switch.  Touch them all once to get rid of the
+# warnings.  This is ugly and I hate it.
+if ($^W) {
+    $CGI::CGI = '';
+    $CGI::CGI=<<EOF;
+    $CGI::VERSION;
+    $MultipartBuffer::SPIN_LOOP_MAX;
+    $MultipartBuffer::CRLF;
+    $MultipartBuffer::TIMEOUT;
+    $MultipartBuffer::INITIAL_FILLUNIT;
+EOF
+    ;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+CGI - Simple Common Gateway Interface Class
+
+=head1 SYNOPSIS
+
+  # CGI script that creates a fill-out form
+  # and echoes back its values.
+
+  use CGI qw/:standard/;
+  print header,
+        start_html('A Simple Example'),
+        h1('A Simple Example'),
+        start_form,
+        "What's your name? ",textfield('name'),p,
+        "What's the combination?", p,
+        checkbox_group(-name=>'words',
+		       -values=>['eenie','meenie','minie','moe'],
+		       -defaults=>['eenie','minie']), p,
+        "What's your favorite color? ",
+        popup_menu(-name=>'color',
+	           -values=>['red','green','blue','chartreuse']),p,
+        submit,
+        end_form,
+        hr;
+
+   if (param()) {
+       my $name      = param('name');
+       my $keywords  = join ', ',param('words');
+       my $color     = param('color');
+       print "Your name is",em(escapeHTML($name)),p,
+	     "The keywords are: ",em(escapeHTML($keywords)),p,
+	     "Your favorite color is ",em(escapeHTML($color)),
+	     hr;
+   }
+
+=head1 ABSTRACT
+
+This perl library uses perl5 objects to make it easy to create Web
+fill-out forms and parse their contents.  This package defines CGI
+objects, entities that contain the values of the current query string
+and other state variables.  Using a CGI object's methods, you can
+examine keywords and parameters passed to your script, and create
+forms whose initial values are taken from the current query (thereby
+preserving state information).  The module provides shortcut functions
+that produce boilerplate HTML, reducing typing and coding errors. It
+also provides functionality for some of the more advanced features of
+CGI scripting, including support for file uploads, cookies, cascading
+style sheets, server push, and frames.
+
+CGI.pm also provides a simple function-oriented programming style for
+those who don't need its object-oriented features.
+
+The current version of CGI.pm is available at
+
+  http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html
+  ftp://ftp-genome.wi.mit.edu/pub/software/WWW/
+
+=head1 DESCRIPTION
+
+=head2 PROGRAMMING STYLE
+
+There are two styles of programming with CGI.pm, an object-oriented
+style and a function-oriented style.  In the object-oriented style you
+create one or more CGI objects and then use object methods to create
+the various elements of the page.  Each CGI object starts out with the
+list of named parameters that were passed to your CGI script by the
+server.  You can modify the objects, save them to a file or database
+and recreate them.  Because each object corresponds to the "state" of
+the CGI script, and because each object's parameter list is
+independent of the others, this allows you to save the state of the
+script and restore it later.
+
+For example, using the object oriented style, here is how you create
+a simple "Hello World" HTML page:
+
+   #!/usr/local/bin/perl -w
+   use CGI;                             # load CGI routines
+   $q = new CGI;                        # create new CGI object
+   print $q->header,                    # create the HTTP header
+         $q->start_html('hello world'), # start the HTML
+         $q->h1('hello world'),         # level 1 header
+         $q->end_html;                  # end the HTML
+
+In the function-oriented style, there is one default CGI object that
+you rarely deal with directly.  Instead you just call functions to
+retrieve CGI parameters, create HTML tags, manage cookies, and so
+on.  This provides you with a cleaner programming interface, but
+limits you to using one CGI object at a time.  The following example
+prints the same page, but uses the function-oriented interface.
+The main differences are that we now need to import a set of functions
+into our name space (usually the "standard" functions), and we don't
+need to create the CGI object.
+
+   #!/usr/local/bin/perl
+   use CGI qw/:standard/;           # load standard CGI routines
+   print header,                    # create the HTTP header
+         start_html('hello world'), # start the HTML
+         h1('hello world'),         # level 1 header
+         end_html;                  # end the HTML
+
+The examples in this document mainly use the object-oriented style.
+See HOW TO IMPORT FUNCTIONS for important information on
+function-oriented programming in CGI.pm
+
+=head2 CALLING CGI.PM ROUTINES
+
+Most CGI.pm routines accept several arguments, sometimes as many as 20
+optional ones!  To simplify this interface, all routines use a named
+argument calling style that looks like this:
+
+   print $q->header(-type=>'image/gif',-expires=>'+3d');
+
+Each argument name is preceded by a dash.  Neither case nor order
+matters in the argument list.  -type, -Type, and -TYPE are all
+acceptable.  In fact, only the first argument needs to begin with a
+dash.  If a dash is present in the first argument, CGI.pm assumes
+dashes for the subsequent ones.
+
+Several routines are commonly called with just one argument.  In the
+case of these routines you can provide the single argument without an
+argument name.  header() happens to be one of these routines.  In this
+case, the single argument is the document type.
+
+   print $q->header('text/html');
+
+Other such routines are documented below.
+
+Sometimes named arguments expect a scalar, sometimes a reference to an
+array, and sometimes a reference to a hash.  Often, you can pass any
+type of argument and the routine will do whatever is most appropriate.
+For example, the param() routine is used to set a CGI parameter to a
+single or a multi-valued value.  The two cases are shown below:
+
+   $q->param(-name=>'veggie',-value=>'tomato');
+   $q->param(-name=>'veggie',-value=>['tomato','tomahto','potato','potahto']);
+
+A large number of routines in CGI.pm actually aren't specifically
+defined in the module, but are generated automatically as needed.
+These are the "HTML shortcuts," routines that generate HTML tags for
+use in dynamically-generated pages.  HTML tags have both attributes
+(the attribute="value" pairs within the tag itself) and contents (the
+part between the opening and closing pairs.)  To distinguish between
+attributes and contents, CGI.pm uses the convention of passing HTML
+attributes as a hash reference as the first argument, and the
+contents, if any, as any subsequent arguments.  It works out like
+this:
+
+   Code                           Generated HTML
+   ----                           --------------
+   h1()                           <h1>
+   h1('some','contents');         <h1>some contents</h1>
+   h1({-align=>left});            <h1 align="LEFT">
+   h1({-align=>left},'contents'); <h1 align="LEFT">contents</h1>
+
+HTML tags are described in more detail later.
+
+Many newcomers to CGI.pm are puzzled by the difference between the
+calling conventions for the HTML shortcuts, which require curly braces
+around the HTML tag attributes, and the calling conventions for other
+routines, which manage to generate attributes without the curly
+brackets.  Don't be confused.  As a convenience the curly braces are
+optional in all but the HTML shortcuts.  If you like, you can use
+curly braces when calling any routine that takes named arguments.  For
+example:
+
+   print $q->header( {-type=>'image/gif',-expires=>'+3d'} );
+
+If you use the B<-w> switch, you will be warned that some CGI.pm argument
+names conflict with built-in Perl functions.  The most frequent of
+these is the -values argument, used to create multi-valued menus,
+radio button clusters and the like.  To get around this warning, you
+have several choices:
+
+=over 4
+
+=item 1.
+
+Use another name for the argument, if one is available. 
+For example, -value is an alias for -values.
+
+=item 2.
+
+Change the capitalization, e.g. -Values
+
+=item 3.
+
+Put quotes around the argument name, e.g. '-values'
+
+=back
+
+Many routines will do something useful with a named argument that it
+doesn't recognize.  For example, you can produce non-standard HTTP
+header fields by providing them as named arguments:
+
+  print $q->header(-type  =>  'text/html',
+                   -cost  =>  'Three smackers',
+                   -annoyance_level => 'high',
+                   -complaints_to   => 'bit bucket');
+
+This will produce the following nonstandard HTTP header:
+
+   HTTP/1.0 200 OK
+   Cost: Three smackers
+   Annoyance-level: high
+   Complaints-to: bit bucket
+   Content-type: text/html
+
+Notice the way that underscores are translated automatically into
+hyphens.  HTML-generating routines perform a different type of
+translation. 
+
+This feature allows you to keep up with the rapidly changing HTTP and
+HTML "standards".
+
+=head2 CREATING A NEW QUERY OBJECT (OBJECT-ORIENTED STYLE):
+
+     $query = new CGI;
+
+This will parse the input (from both POST and GET methods) and store
+it into a perl5 object called $query.  
+
+=head2 CREATING A NEW QUERY OBJECT FROM AN INPUT FILE
+
+     $query = new CGI(INPUTFILE);
+
+If you provide a file handle to the new() method, it will read
+parameters from the file (or STDIN, or whatever).  The file can be in
+any of the forms describing below under debugging (i.e. a series of
+newline delimited TAG=VALUE pairs will work).  Conveniently, this type
+of file is created by the save() method (see below).  Multiple records
+can be saved and restored.
+
+Perl purists will be pleased to know that this syntax accepts
+references to file handles, or even references to filehandle globs,
+which is the "official" way to pass a filehandle:
+
+    $query = new CGI(\*STDIN);
+
+You can also initialize the CGI object with a FileHandle or IO::File
+object.
+
+If you are using the function-oriented interface and want to
+initialize CGI state from a file handle, the way to do this is with
+B<restore_parameters()>.  This will (re)initialize the
+default CGI object from the indicated file handle.
+
+    open (IN,"test.in") || die;
+    restore_parameters(IN);
+    close IN;
+
+You can also initialize the query object from an associative array
+reference:
+
+    $query = new CGI( {'dinosaur'=>'barney',
+		       'song'=>'I love you',
+		       'friends'=>[qw/Jessica George Nancy/]}
+		    );
+
+or from a properly formatted, URL-escaped query string:
+
+    $query = new CGI('dinosaur=barney&color=purple');
+
+or from a previously existing CGI object (currently this clones the
+parameter list, but none of the other object-specific fields, such as
+autoescaping):
+
+    $old_query = new CGI;
+    $new_query = new CGI($old_query);
+
+To create an empty query, initialize it from an empty string or hash:
+
+   $empty_query = new CGI("");
+
+       -or-
+
+   $empty_query = new CGI({});
+
+=head2 FETCHING A LIST OF KEYWORDS FROM THE QUERY:
+
+     @keywords = $query->keywords
+
+If the script was invoked as the result of an <ISINDEX> search, the
+parsed keywords can be obtained as an array using the keywords() method.
+
+=head2 FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT:
+
+     @names = $query->param
+
+If the script was invoked with a parameter list
+(e.g. "name1=value1&name2=value2&name3=value3"), the param() method
+will return the parameter names as a list.  If the script was invoked
+as an <ISINDEX> script and contains a string without ampersands
+(e.g. "value1+value2+value3") , there will be a single parameter named
+"keywords" containing the "+"-delimited keywords.
+
+NOTE: As of version 1.5, the array of parameter names returned will
+be in the same order as they were submitted by the browser.
+Usually this order is the same as the order in which the 
+parameters are defined in the form (however, this isn't part
+of the spec, and so isn't guaranteed).
+
+=head2 FETCHING THE VALUE OR VALUES OF A SINGLE NAMED PARAMETER:
+
+    @values = $query->param('foo');
+
+	      -or-
+
+    $value = $query->param('foo');
+
+Pass the param() method a single argument to fetch the value of the
+named parameter. If the parameter is multivalued (e.g. from multiple
+selections in a scrolling list), you can ask to receive an array.  Otherwise
+the method will return a single value.
+
+If a value is not given in the query string, as in the queries
+"name1=&name2=" or "name1&name2", it will be returned as an empty
+string.  This feature is new in 2.63.
+
+
+If the parameter does not exist at all, then param() will return undef
+in a scalar context, and the empty list in a list context.
+
+
+=head2 SETTING THE VALUE(S) OF A NAMED PARAMETER:
+
+    $query->param('foo','an','array','of','values');
+
+This sets the value for the named parameter 'foo' to an array of
+values.  This is one way to change the value of a field AFTER
+the script has been invoked once before.  (Another way is with
+the -override parameter accepted by all methods that generate
+form elements.)
+
+param() also recognizes a named parameter style of calling described
+in more detail later:
+
+    $query->param(-name=>'foo',-values=>['an','array','of','values']);
+
+			      -or-
+
+    $query->param(-name=>'foo',-value=>'the value');
+
+=head2 APPENDING ADDITIONAL VALUES TO A NAMED PARAMETER:
+
+   $query->append(-name=>'foo',-values=>['yet','more','values']);
+
+This adds a value or list of values to the named parameter.  The
+values are appended to the end of the parameter if it already exists.
+Otherwise the parameter is created.  Note that this method only
+recognizes the named argument calling syntax.
+
+=head2 IMPORTING ALL PARAMETERS INTO A NAMESPACE:
+
+   $query->import_names('R');
+
+This creates a series of variables in the 'R' namespace.  For example,
+$R::foo, @R:foo.  For keyword lists, a variable @R::keywords will appear.
+If no namespace is given, this method will assume 'Q'.
+WARNING:  don't import anything into 'main'; this is a major security
+risk!!!!
+
+NOTE 1: Variable names are transformed as necessary into legal Perl
+variable names.  All non-legal characters are transformed into
+underscores.  If you need to keep the original names, you should use
+the param() method instead to access CGI variables by name.
+
+NOTE 2: In older versions, this method was called B<import()>.  As of version 2.20, 
+this name has been removed completely to avoid conflict with the built-in
+Perl module B<import> operator.
+
+=head2 DELETING A PARAMETER COMPLETELY:
+
+    $query->delete('foo','bar','baz');
+
+This completely clears a list of parameters.  It sometimes useful for
+resetting parameters that you don't want passed down between script
+invocations.
+
+If you are using the function call interface, use "Delete()" instead
+to avoid conflicts with Perl's built-in delete operator.
+
+=head2 DELETING ALL PARAMETERS:
+
+   $query->delete_all();
+
+This clears the CGI object completely.  It might be useful to ensure
+that all the defaults are taken when you create a fill-out form.
+
+Use Delete_all() instead if you are using the function call interface.
+
+=head2 HANDLING NON-URLENCODED ARGUMENTS
+
+
+If POSTed data is not of type application/x-www-form-urlencoded or
+multipart/form-data, then the POSTed data will not be processed, but
+instead be returned as-is in a parameter named POSTDATA.  To retrieve
+it, use code like this:
+
+   my $data = $query->param('POSTDATA');
+
+(If you don't know what the preceding means, don't worry about it.  It
+only affects people trying to use CGI for XML processing and other
+specialized tasks.)
+
+
+=head2 DIRECT ACCESS TO THE PARAMETER LIST:
+
+   $q->param_fetch('address')->[1] = '1313 Mockingbird Lane';
+   unshift @{$q->param_fetch(-name=>'address')},'George Munster';
+
+If you need access to the parameter list in a way that isn't covered
+by the methods above, you can obtain a direct reference to it by
+calling the B<param_fetch()> method with the name of the .  This
+will return an array reference to the named parameters, which you then
+can manipulate in any way you like.
+
+You can also use a named argument style using the B<-name> argument.
+
+=head2 FETCHING THE PARAMETER LIST AS A HASH:
+
+    $params = $q->Vars;
+    print $params->{'address'};
+    @foo = split("\0",$params->{'foo'});
+    %params = $q->Vars;
+
+    use CGI ':cgi-lib';
+    $params = Vars;
+
+Many people want to fetch the entire parameter list as a hash in which
+the keys are the names of the CGI parameters, and the values are the
+parameters' values.  The Vars() method does this.  Called in a scalar
+context, it returns the parameter list as a tied hash reference.
+Changing a key changes the value of the parameter in the underlying
+CGI parameter list.  Called in a list context, it returns the
+parameter list as an ordinary hash.  This allows you to read the
+contents of the parameter list, but not to change it.
+
+When using this, the thing you must watch out for are multivalued CGI
+parameters.  Because a hash cannot distinguish between scalar and
+list context, multivalued parameters will be returned as a packed
+string, separated by the "\0" (null) character.  You must split this
+packed string in order to get at the individual values.  This is the
+convention introduced long ago by Steve Brenner in his cgi-lib.pl
+module for Perl version 4.
+
+If you wish to use Vars() as a function, import the I<:cgi-lib> set of
+function calls (also see the section on CGI-LIB compatibility).
+
+=head2 SAVING THE STATE OF THE SCRIPT TO A FILE:
+
+    $query->save(\*FILEHANDLE)
+
+This will write the current state of the form to the provided
+filehandle.  You can read it back in by providing a filehandle
+to the new() method.  Note that the filehandle can be a file, a pipe,
+or whatever!
+
+The format of the saved file is:
+
+	NAME1=VALUE1
+	NAME1=VALUE1'
+	NAME2=VALUE2
+	NAME3=VALUE3
+	=
+
+Both name and value are URL escaped.  Multi-valued CGI parameters are
+represented as repeated names.  A session record is delimited by a
+single = symbol.  You can write out multiple records and read them
+back in with several calls to B<new>.  You can do this across several
+sessions by opening the file in append mode, allowing you to create
+primitive guest books, or to keep a history of users' queries.  Here's
+a short example of creating multiple session records:
+
+   use CGI;
+
+   open (OUT,">>test.out") || die;
+   $records = 5;
+   foreach (0..$records) {
+       my $q = new CGI;
+       $q->param(-name=>'counter',-value=>$_);
+       $q->save(\*OUT);
+   }
+   close OUT;
+
+   # reopen for reading
+   open (IN,"test.out") || die;
+   while (!eof(IN)) {
+       my $q = new CGI(\*IN);
+       print $q->param('counter'),"\n";
+   }
+
+The file format used for save/restore is identical to that used by the
+Whitehead Genome Center's data exchange format "Boulderio", and can be
+manipulated and even databased using Boulderio utilities.  See
+
+  http://stein.cshl.org/boulder/
+
+for further details.
+
+If you wish to use this method from the function-oriented (non-OO)
+interface, the exported name for this method is B<save_parameters()>.
+
+=head2 RETRIEVING CGI ERRORS
+
+Errors can occur while processing user input, particularly when
+processing uploaded files.  When these errors occur, CGI will stop
+processing and return an empty parameter list.  You can test for
+the existence and nature of errors using the I<cgi_error()> function.
+The error messages are formatted as HTTP status codes. You can either
+incorporate the error text into an HTML page, or use it as the value
+of the HTTP status:
+
+    my $error = $q->cgi_error;
+    if ($error) {
+	print $q->header(-status=>$error),
+	      $q->start_html('Problems'),
+              $q->h2('Request not processed'),
+	      $q->strong($error);
+        exit 0;
+    }
+
+When using the function-oriented interface (see the next section),
+errors may only occur the first time you call I<param()>. Be ready
+for this!
+
+=head2 USING THE FUNCTION-ORIENTED INTERFACE
+
+To use the function-oriented interface, you must specify which CGI.pm
+routines or sets of routines to import into your script's namespace.
+There is a small overhead associated with this importation, but it
+isn't much.
+
+   use CGI <list of methods>;
+
+The listed methods will be imported into the current package; you can
+call them directly without creating a CGI object first.  This example
+shows how to import the B<param()> and B<header()>
+methods, and then use them directly:
+
+   use CGI 'param','header';
+   print header('text/plain');
+   $zipcode = param('zipcode');
+
+More frequently, you'll import common sets of functions by referring
+to the groups by name.  All function sets are preceded with a ":"
+character as in ":html3" (for tags defined in the HTML 3 standard).
+
+Here is a list of the function sets you can import:
+
+=over 4
+
+=item B<:cgi>
+
+Import all CGI-handling methods, such as B<param()>, B<path_info()>
+and the like.
+
+=item B<:form>
+
+Import all fill-out form generating methods, such as B<textfield()>.
+
+=item B<:html2>
+
+Import all methods that generate HTML 2.0 standard elements.
+
+=item B<:html3>
+
+Import all methods that generate HTML 3.0 elements (such as
+<table>, <super> and <sub>).
+
+=item B<:html4>
+
+Import all methods that generate HTML 4 elements (such as
+<abbrev>, <acronym> and <thead>).
+
+=item B<:netscape>
+
+Import all methods that generate Netscape-specific HTML extensions.
+
+=item B<:html>
+
+Import all HTML-generating shortcuts (i.e. 'html2' + 'html3' +
+'netscape')...
+
+=item B<:standard>
+
+Import "standard" features, 'html2', 'html3', 'html4', 'form' and 'cgi'.
+
+=item B<:all>
+
+Import all the available methods.  For the full list, see the CGI.pm
+code, where the variable %EXPORT_TAGS is defined.
+
+=back
+
+If you import a function name that is not part of CGI.pm, the module
+will treat it as a new HTML tag and generate the appropriate
+subroutine.  You can then use it like any other HTML tag.  This is to
+provide for the rapidly-evolving HTML "standard."  For example, say
+Microsoft comes out with a new tag called <gradient> (which causes the
+user's desktop to be flooded with a rotating gradient fill until his
+machine reboots).  You don't need to wait for a new version of CGI.pm
+to start using it immediately:
+
+   use CGI qw/:standard :html3 gradient/;
+   print gradient({-start=>'red',-end=>'blue'});
+
+Note that in the interests of execution speed CGI.pm does B<not> use
+the standard L<Exporter> syntax for specifying load symbols.  This may
+change in the future.
+
+If you import any of the state-maintaining CGI or form-generating
+methods, a default CGI object will be created and initialized
+automatically the first time you use any of the methods that require
+one to be present.  This includes B<param()>, B<textfield()>,
+B<submit()> and the like.  (If you need direct access to the CGI
+object, you can find it in the global variable B<$CGI::Q>).  By
+importing CGI.pm methods, you can create visually elegant scripts:
+
+   use CGI qw/:standard/;
+   print 
+       header,
+       start_html('Simple Script'),
+       h1('Simple Script'),
+       start_form,
+       "What's your name? ",textfield('name'),p,
+       "What's the combination?",
+       checkbox_group(-name=>'words',
+		      -values=>['eenie','meenie','minie','moe'],
+		      -defaults=>['eenie','moe']),p,
+       "What's your favorite color?",
+       popup_menu(-name=>'color',
+		  -values=>['red','green','blue','chartreuse']),p,
+       submit,
+       end_form,
+       hr,"\n";
+
+    if (param) {
+       print 
+	   "Your name is ",em(param('name')),p,
+	   "The keywords are: ",em(join(", ",param('words'))),p,
+	   "Your favorite color is ",em(param('color')),".\n";
+    }
+    print end_html;
+
+=head2 PRAGMAS
+
+In addition to the function sets, there are a number of pragmas that
+you can import.  Pragmas, which are always preceded by a hyphen,
+change the way that CGI.pm functions in various ways.  Pragmas,
+function sets, and individual functions can all be imported in the
+same use() line.  For example, the following use statement imports the
+standard set of functions and enables debugging mode (pragma
+-debug):
+
+   use CGI qw/:standard -debug/;
+
+The current list of pragmas is as follows:
+
+=over 4
+
+=item -any
+
+When you I<use CGI -any>, then any method that the query object
+doesn't recognize will be interpreted as a new HTML tag.  This allows
+you to support the next I<ad hoc> Netscape or Microsoft HTML
+extension.  This lets you go wild with new and unsupported tags:
+
+   use CGI qw(-any);
+   $q=new CGI;
+   print $q->gradient({speed=>'fast',start=>'red',end=>'blue'});
+
+Since using <cite>any</cite> causes any mistyped method name
+to be interpreted as an HTML tag, use it with care or not at
+all.
+
+=item -compile
+
+This causes the indicated autoloaded methods to be compiled up front,
+rather than deferred to later.  This is useful for scripts that run
+for an extended period of time under FastCGI or mod_perl, and for
+those destined to be crunched by Malcom Beattie's Perl compiler.  Use
+it in conjunction with the methods or method families you plan to use.
+
+   use CGI qw(-compile :standard :html3);
+
+or even
+
+   use CGI qw(-compile :all);
+
+Note that using the -compile pragma in this way will always have
+the effect of importing the compiled functions into the current
+namespace.  If you want to compile without importing use the
+compile() method instead:
+
+   use CGI();
+   CGI->compile();
+
+This is particularly useful in a mod_perl environment, in which you
+might want to precompile all CGI routines in a startup script, and
+then import the functions individually in each mod_perl script.
+
+=item -nosticky
+
+By default the CGI module implements a state-preserving behavior
+called "sticky" fields.  The way this works is that if you are
+regenerating a form, the methods that generate the form field values
+will interrogate param() to see if similarly-named parameters are
+present in the query string. If they find a like-named parameter, they
+will use it to set their default values.
+
+Sometimes this isn't what you want.  The B<-nosticky> pragma prevents
+this behavior.  You can also selectively change the sticky behavior in
+each element that you generate.
+
+=item -tabindex
+
+Automatically add tab index attributes to each form field. With this
+option turned off, you can still add tab indexes manually by passing a
+-tabindex option to each field-generating method.
+
+=item -no_undef_params
+
+This keeps CGI.pm from including undef params in the parameter list.
+
+=item -no_xhtml
+
+By default, CGI.pm versions 2.69 and higher emit XHTML
+(http://www.w3.org/TR/xhtml1/).  The -no_xhtml pragma disables this
+feature.  Thanks to Michalis Kabrianis <kabrianis@hellug.gr> for this
+feature.
+
+If start_html()'s -dtd parameter specifies an HTML 2.0 or 3.2 DTD, 
+XHTML will automatically be disabled without needing to use this 
+pragma.
+
+=item -nph
+
+This makes CGI.pm produce a header appropriate for an NPH (no
+parsed header) script.  You may need to do other things as well
+to tell the server that the script is NPH.  See the discussion
+of NPH scripts below.
+
+=item -newstyle_urls
+
+Separate the name=value pairs in CGI parameter query strings with
+semicolons rather than ampersands.  For example:
+
+   ?name=fred;age=24;favorite_color=3
+
+Semicolon-delimited query strings are always accepted, but will not be
+emitted by self_url() and query_string() unless the -newstyle_urls
+pragma is specified.
+
+This became the default in version 2.64.
+
+=item -oldstyle_urls
+
+Separate the name=value pairs in CGI parameter query strings with
+ampersands rather than semicolons.  This is no longer the default.
+
+=item -autoload
+
+This overrides the autoloader so that any function in your program
+that is not recognized is referred to CGI.pm for possible evaluation.
+This allows you to use all the CGI.pm functions without adding them to
+your symbol table, which is of concern for mod_perl users who are
+worried about memory consumption.  I<Warning:> when
+I<-autoload> is in effect, you cannot use "poetry mode"
+(functions without the parenthesis).  Use I<hr()> rather
+than I<hr>, or add something like I<use subs qw/hr p header/> 
+to the top of your script.
+
+=item -no_debug
+
+This turns off the command-line processing features.  If you want to
+run a CGI.pm script from the command line to produce HTML, and you
+don't want it to read CGI parameters from the command line or STDIN,
+then use this pragma:
+
+   use CGI qw(-no_debug :standard);
+
+=item -debug
+
+This turns on full debugging.  In addition to reading CGI arguments
+from the command-line processing, CGI.pm will pause and try to read
+arguments from STDIN, producing the message "(offline mode: enter
+name=value pairs on standard input)" features.
+
+See the section on debugging for more details.
+
+=item -private_tempfiles
+
+CGI.pm can process uploaded file. Ordinarily it spools the uploaded
+file to a temporary directory, then deletes the file when done.
+However, this opens the risk of eavesdropping as described in the file
+upload section.  Another CGI script author could peek at this data
+during the upload, even if it is confidential information. On Unix
+systems, the -private_tempfiles pragma will cause the temporary file
+to be unlinked as soon as it is opened and before any data is written
+into it, reducing, but not eliminating the risk of eavesdropping
+(there is still a potential race condition).  To make life harder for
+the attacker, the program chooses tempfile names by calculating a 32
+bit checksum of the incoming HTTP headers.
+
+To ensure that the temporary file cannot be read by other CGI scripts,
+use suEXEC or a CGI wrapper program to run your script.  The temporary
+file is created with mode 0600 (neither world nor group readable).
+
+The temporary directory is selected using the following algorithm:
+
+    1. if the current user (e.g. "nobody") has a directory named
+    "tmp" in its home directory, use that (Unix systems only).
+
+    2. if the environment variable TMPDIR exists, use the location
+    indicated.
+
+    3. Otherwise try the locations /usr/tmp, /var/tmp, C:\temp,
+    /tmp, /temp, ::Temporary Items, and \WWW_ROOT.
+
+Each of these locations is checked that it is a directory and is
+writable.  If not, the algorithm tries the next choice.
+
+=back
+
+=head2 SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS
+
+Many of the methods generate HTML tags.  As described below, tag
+functions automatically generate both the opening and closing tags.
+For example:
+
+  print h1('Level 1 Header');
+
+produces
+
+  <h1>Level 1 Header</h1>
+
+There will be some times when you want to produce the start and end
+tags yourself.  In this case, you can use the form start_I<tag_name>
+and end_I<tag_name>, as in:
+
+  print start_h1,'Level 1 Header',end_h1;
+
+With a few exceptions (described below), start_I<tag_name> and
+end_I<tag_name> functions are not generated automatically when you
+I<use CGI>.  However, you can specify the tags you want to generate
+I<start/end> functions for by putting an asterisk in front of their
+name, or, alternatively, requesting either "start_I<tag_name>" or
+"end_I<tag_name>" in the import list.
+
+Example:
+
+  use CGI qw/:standard *table start_ul/;
+
+In this example, the following functions are generated in addition to
+the standard ones:
+
+=over 4
+
+=item 1. start_table() (generates a <table> tag)
+
+=item 2. end_table() (generates a </table> tag)
+
+=item 3. start_ul() (generates a <ul> tag)
+
+=item 4. end_ul() (generates a </ul> tag)
+
+=back
+
+=head1 GENERATING DYNAMIC DOCUMENTS
+
+Most of CGI.pm's functions deal with creating documents on the fly.
+Generally you will produce the HTTP header first, followed by the
+document itself.  CGI.pm provides functions for generating HTTP
+headers of various types as well as for generating HTML.  For creating
+GIF images, see the GD.pm module.
+
+Each of these functions produces a fragment of HTML or HTTP which you
+can print out directly so that it displays in the browser window,
+append to a string, or save to a file for later use.
+
+=head2 CREATING A STANDARD HTTP HEADER:
+
+Normally the first thing you will do in any CGI script is print out an
+HTTP header.  This tells the browser what type of document to expect,
+and gives other optional information, such as the language, expiration
+date, and whether to cache the document.  The header can also be
+manipulated for special purposes, such as server push and pay per view
+pages.
+
+	print header;
+
+	     -or-
+
+	print header('image/gif');
+
+	     -or-
+
+	print header('text/html','204 No response');
+
+	     -or-
+
+	print header(-type=>'image/gif',
+			     -nph=>1,
+			     -status=>'402 Payment required',
+			     -expires=>'+3d',
+			     -cookie=>$cookie,
+                             -charset=>'utf-7',
+                             -attachment=>'foo.gif',
+			     -Cost=>'$2.00');
+
+header() returns the Content-type: header.  You can provide your own
+MIME type if you choose, otherwise it defaults to text/html.  An
+optional second parameter specifies the status code and a human-readable
+message.  For example, you can specify 204, "No response" to create a
+script that tells the browser to do nothing at all.
+
+The last example shows the named argument style for passing arguments
+to the CGI methods using named parameters.  Recognized parameters are
+B<-type>, B<-status>, B<-expires>, and B<-cookie>.  Any other named
+parameters will be stripped of their initial hyphens and turned into
+header fields, allowing you to specify any HTTP header you desire.
+Internal underscores will be turned into hyphens:
+
+    print header(-Content_length=>3002);
+
+Most browsers will not cache the output from CGI scripts.  Every time
+the browser reloads the page, the script is invoked anew.  You can
+change this behavior with the B<-expires> parameter.  When you specify
+an absolute or relative expiration interval with this parameter, some
+browsers and proxy servers will cache the script's output until the
+indicated expiration date.  The following forms are all valid for the
+-expires field:
+
+	+30s                              30 seconds from now
+	+10m                              ten minutes from now
+	+1h                               one hour from now
+	-1d                               yesterday (i.e. "ASAP!")
+	now                               immediately
+	+3M                               in three months
+	+10y                              in ten years time
+	Thursday, 25-Apr-1999 00:40:33 GMT  at the indicated time & date
+
+The B<-cookie> parameter generates a header that tells the browser to provide
+a "magic cookie" during all subsequent transactions with your script.
+Netscape cookies have a special format that includes interesting attributes
+such as expiration time.  Use the cookie() method to create and retrieve
+session cookies.
+
+The B<-nph> parameter, if set to a true value, will issue the correct
+headers to work with a NPH (no-parse-header) script.  This is important
+to use with certain servers that expect all their scripts to be NPH.
+
+The B<-charset> parameter can be used to control the character set
+sent to the browser.  If not provided, defaults to ISO-8859-1.  As a
+side effect, this sets the charset() method as well.
+
+The B<-attachment> parameter can be used to turn the page into an
+attachment.  Instead of displaying the page, some browsers will prompt
+the user to save it to disk.  The value of the argument is the
+suggested name for the saved file.  In order for this to work, you may
+have to set the B<-type> to "application/octet-stream".
+
+The B<-p3p> parameter will add a P3P tag to the outgoing header.  The
+parameter can be an arrayref or a space-delimited string of P3P tags.
+For example:
+
+   print header(-p3p=>[qw(CAO DSP LAW CURa)]);
+   print header(-p3p=>'CAO DSP LAW CURa');
+
+In either case, the outgoing header will be formatted as:
+
+  P3P: policyref="/w3c/p3p.xml" cp="CAO DSP LAW CURa"
+
+=head2 GENERATING A REDIRECTION HEADER
+
+   print redirect('http://somewhere.else/in/movie/land');
+
+Sometimes you don't want to produce a document yourself, but simply
+redirect the browser elsewhere, perhaps choosing a URL based on the
+time of day or the identity of the user.  
+
+The redirect() function redirects the browser to a different URL.  If
+you use redirection like this, you should B<not> print out a header as
+well.
+
+You should always use full URLs (including the http: or ftp: part) in
+redirection requests.  Relative URLs will not work correctly.
+
+You can also use named arguments:
+
+    print redirect(-uri=>'http://somewhere.else/in/movie/land',
+			   -nph=>1,
+                           -status=>301);
+
+The B<-nph> parameter, if set to a true value, will issue the correct
+headers to work with a NPH (no-parse-header) script.  This is important
+to use with certain servers, such as Microsoft IIS, which
+expect all their scripts to be NPH.
+
+The B<-status> parameter will set the status of the redirect.  HTTP
+defines three different possible redirection status codes:
+
+     301 Moved Permanently
+     302 Found
+     303 See Other
+
+The default if not specified is 302, which means "moved temporarily."
+You may change the status to another status code if you wish.  Be
+advised that changing the status to anything other than 301, 302 or
+303 will probably break redirection.
+
+=head2 CREATING THE HTML DOCUMENT HEADER
+
+   print start_html(-title=>'Secrets of the Pyramids',
+			    -author=>'fred@capricorn.org',
+			    -base=>'true',
+			    -target=>'_blank',
+			    -meta=>{'keywords'=>'pharaoh secret mummy',
+				    'copyright'=>'copyright 1996 King Tut'},
+			    -style=>{'src'=>'/styles/style1.css'},
+			    -BGCOLOR=>'blue');
+
+After creating the HTTP header, most CGI scripts will start writing
+out an HTML document.  The start_html() routine creates the top of the
+page, along with a lot of optional information that controls the
+page's appearance and behavior.
+
+This method returns a canned HTML header and the opening <body> tag.
+All parameters are optional.  In the named parameter form, recognized
+parameters are -title, -author, -base, -xbase, -dtd, -lang and -target
+(see below for the explanation).  Any additional parameters you
+provide, such as the Netscape unofficial BGCOLOR attribute, are added
+to the <body> tag.  Additional parameters must be proceeded by a
+hyphen.
+
+The argument B<-xbase> allows you to provide an HREF for the <base> tag
+different from the current location, as in
+
+    -xbase=>"http://home.mcom.com/"
+
+All relative links will be interpreted relative to this tag.
+
+The argument B<-target> allows you to provide a default target frame
+for all the links and fill-out forms on the page.  B<This is a
+non-standard HTTP feature which only works with Netscape browsers!>
+See the Netscape documentation on frames for details of how to
+manipulate this.
+
+    -target=>"answer_window"
+
+All relative links will be interpreted relative to this tag.
+You add arbitrary meta information to the header with the B<-meta>
+argument.  This argument expects a reference to an associative array
+containing name/value pairs of meta information.  These will be turned
+into a series of header <meta> tags that look something like this:
+
+    <meta name="keywords" content="pharaoh secret mummy">
+    <meta name="description" content="copyright 1996 King Tut">
+
+To create an HTTP-EQUIV type of <meta> tag, use B<-head>, described
+below.
+
+The B<-style> argument is used to incorporate cascading stylesheets
+into your code.  See the section on CASCADING STYLESHEETS for more
+information.
+
+The B<-lang> argument is used to incorporate a language attribute into
+the <html> tag.  For example:
+
+    print $q->start_html(-lang=>'fr-CA');
+
+The default if not specified is "en-US" for US English, unless the 
+-dtd parameter specifies an HTML 2.0 or 3.2 DTD, in which case the
+lang attribute is left off.  You can force the lang attribute to left
+off in other cases by passing an empty string (-lang=>'').
+
+The B<-encoding> argument can be used to specify the character set for
+XHTML.  It defaults to iso-8859-1 if not specified.
+
+The B<-declare_xml> argument, when used in conjunction with XHTML,
+will put a <?xml> declaration at the top of the HTML header. The sole
+purpose of this declaration is to declare the character set
+encoding. In the absence of -declare_xml, the output HTML will contain
+a <meta> tag that specifies the encoding, allowing the HTML to pass
+most validators.  The default for -declare_xml is false.
+
+You can place other arbitrary HTML elements to the <head> section with the
+B<-head> tag.  For example, to place the rarely-used <link> element in the
+head section, use this:
+
+    print start_html(-head=>Link({-rel=>'next',
+		                  -href=>'http://www.capricorn.com/s2.html'}));
+
+To incorporate multiple HTML elements into the <head> section, just pass an
+array reference:
+
+    print start_html(-head=>[ 
+                             Link({-rel=>'next',
+				   -href=>'http://www.capricorn.com/s2.html'}),
+		             Link({-rel=>'previous',
+				   -href=>'http://www.capricorn.com/s1.html'})
+			     ]
+		     );
+
+And here's how to create an HTTP-EQUIV <meta> tag:
+
+      print start_html(-head=>meta({-http_equiv => 'Content-Type',
+                                    -content    => 'text/html'}))
+
+
+JAVASCRIPTING: The B<-script>, B<-noScript>, B<-onLoad>,
+B<-onMouseOver>, B<-onMouseOut> and B<-onUnload> parameters are used
+to add Netscape JavaScript calls to your pages.  B<-script> should
+point to a block of text containing JavaScript function definitions.
+This block will be placed within a <script> block inside the HTML (not
+HTTP) header.  The block is placed in the header in order to give your
+page a fighting chance of having all its JavaScript functions in place
+even if the user presses the stop button before the page has loaded
+completely.  CGI.pm attempts to format the script in such a way that
+JavaScript-naive browsers will not choke on the code: unfortunately
+there are some browsers, such as Chimera for Unix, that get confused
+by it nevertheless.
+
+The B<-onLoad> and B<-onUnload> parameters point to fragments of JavaScript
+code to execute when the page is respectively opened and closed by the
+browser.  Usually these parameters are calls to functions defined in the
+B<-script> field:
+
+      $query = new CGI;
+      print header;
+      $JSCRIPT=<<END;
+      // Ask a silly question
+      function riddle_me_this() {
+	 var r = prompt("What walks on four legs in the morning, " +
+		       "two legs in the afternoon, " +
+		       "and three legs in the evening?");
+	 response(r);
+      }
+      // Get a silly answer
+      function response(answer) {
+	 if (answer == "man")
+	    alert("Right you are!");
+	 else
+	    alert("Wrong!  Guess again.");
+      }
+      END
+      print start_html(-title=>'The Riddle of the Sphinx',
+			       -script=>$JSCRIPT);
+
+Use the B<-noScript> parameter to pass some HTML text that will be displayed on 
+browsers that do not have JavaScript (or browsers where JavaScript is turned
+off).
+
+Netscape 3.0 recognizes several attributes of the <script> tag,
+including LANGUAGE and SRC.  The latter is particularly interesting,
+as it allows you to keep the JavaScript code in a file or CGI script
+rather than cluttering up each page with the source.  To use these
+attributes pass a HASH reference in the B<-script> parameter containing
+one or more of -language, -src, or -code:
+
+    print $q->start_html(-title=>'The Riddle of the Sphinx',
+			 -script=>{-language=>'JAVASCRIPT',
+                                   -src=>'/javascript/sphinx.js'}
+			 );
+
+    print $q->(-title=>'The Riddle of the Sphinx',
+	       -script=>{-language=>'PERLSCRIPT',
+			 -code=>'print "hello world!\n;"'}
+	       );
+
+
+A final feature allows you to incorporate multiple <script> sections into the
+header.  Just pass the list of script sections as an array reference.
+this allows you to specify different source files for different dialects
+of JavaScript.  Example:     
+
+     print $q->start_html(-title=>'The Riddle of the Sphinx',
+                          -script=>[
+                                    { -language => 'JavaScript1.0',
+                                      -src      => '/javascript/utilities10.js'
+                                    },
+                                    { -language => 'JavaScript1.1',
+                                      -src      => '/javascript/utilities11.js'
+                                    },
+                                    { -language => 'JavaScript1.2',
+                                      -src      => '/javascript/utilities12.js'
+                                    },
+                                    { -language => 'JavaScript28.2',
+                                      -src      => '/javascript/utilities219.js'
+                                    }
+                                 ]
+                             );
+
+If this looks a bit extreme, take my advice and stick with straight CGI scripting.  
+
+See
+
+   http://home.netscape.com/eng/mozilla/2.0/handbook/javascript/
+
+for more information about JavaScript.
+
+The old-style positional parameters are as follows:
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The title
+
+=item 2.
+
+The author's e-mail address (will create a <link rev="MADE"> tag if present
+
+=item 3.
+
+A 'true' flag if you want to include a <base> tag in the header.  This
+helps resolve relative addresses to absolute ones when the document is moved, 
+but makes the document hierarchy non-portable.  Use with care!
+
+=item 4, 5, 6...
+
+Any other parameters you want to include in the <body> tag.  This is a good
+place to put Netscape extensions, such as colors and wallpaper patterns.
+
+=back
+
+=head2 ENDING THE HTML DOCUMENT:
+
+	print end_html
+
+This ends an HTML document by printing the </body></html> tags.
+
+=head2 CREATING A SELF-REFERENCING URL THAT PRESERVES STATE INFORMATION:
+
+    $myself = self_url;
+    print q(<a href="$myself">I'm talking to myself.</a>);
+
+self_url() will return a URL, that, when selected, will reinvoke
+this script with all its state information intact.  This is most
+useful when you want to jump around within the document using
+internal anchors but you don't want to disrupt the current contents
+of the form(s).  Something like this will do the trick.
+
+     $myself = self_url;
+     print "<a href=\"$myself#table1\">See table 1</a>";
+     print "<a href=\"$myself#table2\">See table 2</a>";
+     print "<a href=\"$myself#yourself\">See for yourself</a>";
+
+If you want more control over what's returned, using the B<url()>
+method instead.
+
+You can also retrieve the unprocessed query string with query_string():
+
+    $the_string = query_string;
+
+=head2 OBTAINING THE SCRIPT'S URL
+
+    $full_url      = url();
+    $full_url      = url(-full=>1);  #alternative syntax
+    $relative_url  = url(-relative=>1);
+    $absolute_url  = url(-absolute=>1);
+    $url_with_path = url(-path_info=>1);
+    $url_with_path_and_query = url(-path_info=>1,-query=>1);
+    $netloc        = url(-base => 1);
+
+B<url()> returns the script's URL in a variety of formats.  Called
+without any arguments, it returns the full form of the URL, including
+host name and port number
+
+    http://your.host.com/path/to/script.cgi
+
+You can modify this format with the following named arguments:
+
+=over 4
+
+=item B<-absolute>
+
+If true, produce an absolute URL, e.g.
+
+    /path/to/script.cgi
+
+=item B<-relative>
+
+Produce a relative URL.  This is useful if you want to reinvoke your
+script with different parameters. For example:
+
+    script.cgi
+
+=item B<-full>
+
+Produce the full URL, exactly as if called without any arguments.
+This overrides the -relative and -absolute arguments.
+
+=item B<-path> (B<-path_info>)
+
+Append the additional path information to the URL.  This can be
+combined with B<-full>, B<-absolute> or B<-relative>.  B<-path_info>
+is provided as a synonym.
+
+=item B<-query> (B<-query_string>)
+
+Append the query string to the URL.  This can be combined with
+B<-full>, B<-absolute> or B<-relative>.  B<-query_string> is provided
+as a synonym.
+
+=item B<-base>
+
+Generate just the protocol and net location, as in http://www.foo.com:8000
+
+=item B<-rewrite>
+
+If Apache's mod_rewrite is turned on, then the script name and path
+info probably won't match the request that the user sent. Set
+-rewrite=>1 (default) to return URLs that match what the user sent
+(the original request URI). Set -rewrite->0 to return URLs that match
+the URL after mod_rewrite's rules have run. Because the additional
+path information only makes sense in the context of the rewritten URL,
+-rewrite is set to false when you request path info in the URL.
+
+=back
+
+=head2 MIXING POST AND URL PARAMETERS
+
+   $color = url_param('color');
+
+It is possible for a script to receive CGI parameters in the URL as
+well as in the fill-out form by creating a form that POSTs to a URL
+containing a query string (a "?" mark followed by arguments).  The
+B<param()> method will always return the contents of the POSTed
+fill-out form, ignoring the URL's query string.  To retrieve URL
+parameters, call the B<url_param()> method.  Use it in the same way as
+B<param()>.  The main difference is that it allows you to read the
+parameters, but not set them.
+
+
+Under no circumstances will the contents of the URL query string
+interfere with similarly-named CGI parameters in POSTed forms.  If you
+try to mix a URL query string with a form submitted with the GET
+method, the results will not be what you expect.
+
+=head1 CREATING STANDARD HTML ELEMENTS:
+
+CGI.pm defines general HTML shortcut methods for most, if not all of
+the HTML 3 and HTML 4 tags.  HTML shortcuts are named after a single
+HTML element and return a fragment of HTML text that you can then
+print or manipulate as you like.  Each shortcut returns a fragment of
+HTML code that you can append to a string, save to a file, or, most
+commonly, print out so that it displays in the browser window.
+
+This example shows how to use the HTML methods:
+
+   print $q->blockquote(
+		     "Many years ago on the island of",
+		     $q->a({href=>"http://crete.org/"},"Crete"),
+		     "there lived a Minotaur named",
+		     $q->strong("Fred."),
+		    ),
+       $q->hr;
+
+This results in the following HTML code (extra newlines have been
+added for readability):
+
+   <blockquote>
+   Many years ago on the island of
+   <a href="http://crete.org/">Crete</a> there lived
+   a minotaur named <strong>Fred.</strong> 
+   </blockquote>
+   <hr>
+
+If you find the syntax for calling the HTML shortcuts awkward, you can
+import them into your namespace and dispense with the object syntax
+completely (see the next section for more details):
+
+   use CGI ':standard';
+   print blockquote(
+      "Many years ago on the island of",
+      a({href=>"http://crete.org/"},"Crete"),
+      "there lived a minotaur named",
+      strong("Fred."),
+      ),
+      hr;
+
+=head2 PROVIDING ARGUMENTS TO HTML SHORTCUTS
+
+The HTML methods will accept zero, one or multiple arguments.  If you
+provide no arguments, you get a single tag:
+
+   print hr;  	#  <hr>
+
+If you provide one or more string arguments, they are concatenated
+together with spaces and placed between opening and closing tags:
+
+   print h1("Chapter","1"); # <h1>Chapter 1</h1>"
+
+If the first argument is an associative array reference, then the keys
+and values of the associative array become the HTML tag's attributes:
+
+   print a({-href=>'fred.html',-target=>'_new'},
+      "Open a new frame");
+
+	    <a href="fred.html",target="_new">Open a new frame</a>
+
+You may dispense with the dashes in front of the attribute names if
+you prefer:
+
+   print img {src=>'fred.gif',align=>'LEFT'};
+
+	   <img align="LEFT" src="fred.gif">
+
+Sometimes an HTML tag attribute has no argument.  For example, ordered
+lists can be marked as COMPACT.  The syntax for this is an argument that
+that points to an undef string:
+
+   print ol({compact=>undef},li('one'),li('two'),li('three'));
+
+Prior to CGI.pm version 2.41, providing an empty ('') string as an
+attribute argument was the same as providing undef.  However, this has
+changed in order to accommodate those who want to create tags of the form 
+<img alt="">.  The difference is shown in these two pieces of code:
+
+   CODE                   RESULT
+   img({alt=>undef})      <img alt>
+   img({alt=>''})         <img alt="">
+
+=head2 THE DISTRIBUTIVE PROPERTY OF HTML SHORTCUTS
+
+One of the cool features of the HTML shortcuts is that they are
+distributive.  If you give them an argument consisting of a
+B<reference> to a list, the tag will be distributed across each
+element of the list.  For example, here's one way to make an ordered
+list:
+
+   print ul(
+             li({-type=>'disc'},['Sneezy','Doc','Sleepy','Happy'])
+           );
+
+This example will result in HTML output that looks like this:
+
+   <ul>
+     <li type="disc">Sneezy</li>
+     <li type="disc">Doc</li>
+     <li type="disc">Sleepy</li>
+     <li type="disc">Happy</li>
+   </ul>
+
+This is extremely useful for creating tables.  For example:
+
+   print table({-border=>undef},
+           caption('When Should You Eat Your Vegetables?'),
+           Tr({-align=>CENTER,-valign=>TOP},
+           [
+              th(['Vegetable', 'Breakfast','Lunch','Dinner']),
+              td(['Tomatoes' , 'no', 'yes', 'yes']),
+              td(['Broccoli' , 'no', 'no',  'yes']),
+              td(['Onions'   , 'yes','yes', 'yes'])
+           ]
+           )
+        );
+
+=head2 HTML SHORTCUTS AND LIST INTERPOLATION
+
+Consider this bit of code:
+
+   print blockquote(em('Hi'),'mom!'));
+
+It will ordinarily return the string that you probably expect, namely:
+
+   <blockquote><em>Hi</em> mom!</blockquote>
+
+Note the space between the element "Hi" and the element "mom!".
+CGI.pm puts the extra space there using array interpolation, which is
+controlled by the magic $" variable.  Sometimes this extra space is
+not what you want, for example, when you are trying to align a series
+of images.  In this case, you can simply change the value of $" to an
+empty string.
+
+   {
+      local($") = '';
+      print blockquote(em('Hi'),'mom!'));
+    }
+
+I suggest you put the code in a block as shown here.  Otherwise the
+change to $" will affect all subsequent code until you explicitly
+reset it.
+
+=head2 NON-STANDARD HTML SHORTCUTS
+
+A few HTML tags don't follow the standard pattern for various
+reasons.  
+
+B<comment()> generates an HTML comment (<!-- comment -->).  Call it
+like
+
+    print comment('here is my comment');
+
+Because of conflicts with built-in Perl functions, the following functions
+begin with initial caps:
+
+    Select
+    Tr
+    Link
+    Delete
+    Accept
+    Sub
+
+In addition, start_html(), end_html(), start_form(), end_form(),
+start_multipart_form() and all the fill-out form tags are special.
+See their respective sections.
+
+=head2 AUTOESCAPING HTML
+
+By default, all HTML that is emitted by the form-generating functions
+is passed through a function called escapeHTML():
+
+=over 4
+
+=item $escaped_string = escapeHTML("unescaped string");
+
+Escape HTML formatting characters in a string.
+
+=back
+
+Provided that you have specified a character set of ISO-8859-1 (the
+default), the standard HTML escaping rules will be used.  The "<"
+character becomes "&lt;", ">" becomes "&gt;", "&" becomes "&amp;", and
+the quote character becomes "&quot;".  In addition, the hexadecimal
+0x8b and 0x9b characters, which some browsers incorrectly interpret
+as the left and right angle-bracket characters, are replaced by their
+numeric character entities ("&#8249" and "&#8250;").  If you manually change
+the charset, either by calling the charset() method explicitly or by
+passing a -charset argument to header(), then B<all> characters will
+be replaced by their numeric entities, since CGI.pm has no lookup
+table for all the possible encodings.
+
+The automatic escaping does not apply to other shortcuts, such as
+h1().  You should call escapeHTML() yourself on untrusted data in
+order to protect your pages against nasty tricks that people may enter
+into guestbooks, etc..  To change the character set, use charset().
+To turn autoescaping off completely, use autoEscape(0):
+
+=over 4
+
+=item $charset = charset([$charset]);
+
+Get or set the current character set.
+
+=item $flag = autoEscape([$flag]);
+
+Get or set the value of the autoescape flag.
+
+=back
+
+=head2 PRETTY-PRINTING HTML
+
+By default, all the HTML produced by these functions comes out as one
+long line without carriage returns or indentation. This is yuck, but
+it does reduce the size of the documents by 10-20%.  To get
+pretty-printed output, please use L<CGI::Pretty>, a subclass
+contributed by Brian Paulsen.
+
+=head1 CREATING FILL-OUT FORMS:
+
+I<General note>  The various form-creating methods all return strings
+to the caller, containing the tag or tags that will create the requested
+form element.  You are responsible for actually printing out these strings.
+It's set up this way so that you can place formatting tags
+around the form elements.
+
+I<Another note> The default values that you specify for the forms are only
+used the B<first> time the script is invoked (when there is no query
+string).  On subsequent invocations of the script (when there is a query
+string), the former values are used even if they are blank.  
+
+If you want to change the value of a field from its previous value, you have two
+choices:
+
+(1) call the param() method to set it.
+
+(2) use the -override (alias -force) parameter (a new feature in version 2.15).
+This forces the default value to be used, regardless of the previous value:
+
+   print textfield(-name=>'field_name',
+			   -default=>'starting value',
+			   -override=>1,
+			   -size=>50,
+			   -maxlength=>80);
+
+I<Yet another note> By default, the text and labels of form elements are
+escaped according to HTML rules.  This means that you can safely use
+"<CLICK ME>" as the label for a button.  However, it also interferes with
+your ability to incorporate special HTML character sequences, such as &Aacute;,
+into your fields.  If you wish to turn off automatic escaping, call the
+autoEscape() method with a false value immediately after creating the CGI object:
+
+   $query = new CGI;
+   autoEscape(undef);
+
+I<A Lurking Trap!> Some of the form-element generating methods return
+multiple tags.  In a scalar context, the tags will be concatenated
+together with spaces, or whatever is the current value of the $"
+global.  In a list context, the methods will return a list of
+elements, allowing you to modify them if you wish.  Usually you will
+not notice this behavior, but beware of this:
+
+    printf("%s\n",end_form())
+
+end_form() produces several tags, and only the first of them will be
+printed because the format only expects one value.
+
+<p>
+
+
+=head2 CREATING AN ISINDEX TAG
+
+   print isindex(-action=>$action);
+
+	 -or-
+
+   print isindex($action);
+
+Prints out an <isindex> tag.  Not very exciting.  The parameter
+-action specifies the URL of the script to process the query.  The
+default is to process the query with the current script.
+
+=head2 STARTING AND ENDING A FORM
+
+    print start_form(-method=>$method,
+		    -action=>$action,
+		    -enctype=>$encoding);
+      <... various form stuff ...>
+    print endform;
+
+	-or-
+
+    print start_form($method,$action,$encoding);
+      <... various form stuff ...>
+    print endform;
+
+start_form() will return a <form> tag with the optional method,
+action and form encoding that you specify.  The defaults are:
+
+    method: POST
+    action: this script
+    enctype: application/x-www-form-urlencoded
+
+endform() returns the closing </form> tag.  
+
+Start_form()'s enctype argument tells the browser how to package the various
+fields of the form before sending the form to the server.  Two
+values are possible:
+
+B<Note:> This method was previously named startform(), and startform()
+is still recognized as an alias.
+
+=over 4
+
+=item B<application/x-www-form-urlencoded>
+
+This is the older type of encoding used by all browsers prior to
+Netscape 2.0.  It is compatible with many CGI scripts and is
+suitable for short fields containing text data.  For your
+convenience, CGI.pm stores the name of this encoding
+type in B<&CGI::URL_ENCODED>.
+
+=item B<multipart/form-data>
+
+This is the newer type of encoding introduced by Netscape 2.0.
+It is suitable for forms that contain very large fields or that
+are intended for transferring binary data.  Most importantly,
+it enables the "file upload" feature of Netscape 2.0 forms.  For
+your convenience, CGI.pm stores the name of this encoding type
+in B<&CGI::MULTIPART>
+
+Forms that use this type of encoding are not easily interpreted
+by CGI scripts unless they use CGI.pm or another library designed
+to handle them.
+
+If XHTML is activated (the default), then forms will be automatically
+created using this type of encoding.
+
+=back
+
+For compatibility, the start_form() method uses the older form of
+encoding by default.  If you want to use the newer form of encoding
+by default, you can call B<start_multipart_form()> instead of
+B<start_form()>.
+
+JAVASCRIPTING: The B<-name> and B<-onSubmit> parameters are provided
+for use with JavaScript.  The -name parameter gives the
+form a name so that it can be identified and manipulated by
+JavaScript functions.  -onSubmit should point to a JavaScript
+function that will be executed just before the form is submitted to your
+server.  You can use this opportunity to check the contents of the form 
+for consistency and completeness.  If you find something wrong, you
+can put up an alert box or maybe fix things up yourself.  You can 
+abort the submission by returning false from this function.  
+
+Usually the bulk of JavaScript functions are defined in a <script>
+block in the HTML header and -onSubmit points to one of these function
+call.  See start_html() for details.
+
+=head2 FORM ELEMENTS
+
+After starting a form, you will typically create one or more
+textfields, popup menus, radio groups and other form elements.  Each
+of these elements takes a standard set of named arguments.  Some
+elements also have optional arguments.  The standard arguments are as
+follows:
+
+=over 4
+
+=item B<-name>
+
+The name of the field. After submission this name can be used to
+retrieve the field's value using the param() method.
+
+=item B<-value>, B<-values>
+
+The initial value of the field which will be returned to the script
+after form submission.  Some form elements, such as text fields, take
+a single scalar -value argument. Others, such as popup menus, take a
+reference to an array of values. The two arguments are synonyms.
+
+=item B<-tabindex>
+
+A numeric value that sets the order in which the form element receives
+focus when the user presses the tab key. Elements with lower values
+receive focus first.
+
+=item B<-id>
+
+A string identifier that can be used to identify this element to
+JavaScript and DHTML.
+
+=item B<-override>
+
+A boolean, which, if true, forces the element to take on the value
+specified by B<-value>, overriding the sticky behavior described
+earlier for the B<-no_sticky> pragma.
+
+=item B<-onChange>, B<-onFocus>, B<-onBlur>, B<-onMouseOver>, B<-onMouseOut>, B<-onSelect>
+
+These are used to assign JavaScript event handlers. See the
+JavaScripting section for more details.
+
+=back
+
+Other common arguments are described in the next section. In addition
+to these, all attributes described in the HTML specifications are
+supported.
+
+=head2 CREATING A TEXT FIELD
+
+    print textfield(-name=>'field_name',
+		    -value=>'starting value',
+		    -size=>50,
+		    -maxlength=>80);
+	-or-
+
+    print textfield('field_name','starting value',50,80);
+
+textfield() will return a text input field. 
+
+=over 4
+
+=item B<Parameters>
+
+=item 1.
+
+The first parameter is the required name for the field (-name). 
+
+=item 2.
+
+The optional second parameter is the default starting value for the field
+contents (-value, formerly known as -default).
+
+=item 3.
+
+The optional third parameter is the size of the field in
+      characters (-size).
+
+=item 4.
+
+The optional fourth parameter is the maximum number of characters the
+      field will accept (-maxlength).
+
+=back
+
+As with all these methods, the field will be initialized with its 
+previous contents from earlier invocations of the script.
+When the form is processed, the value of the text field can be
+retrieved with:
+
+       $value = param('foo');
+
+If you want to reset it from its initial value after the script has been
+called once, you can do so like this:
+
+       param('foo',"I'm taking over this value!");
+
+=head2 CREATING A BIG TEXT FIELD
+
+   print textarea(-name=>'foo',
+			  -default=>'starting value',
+			  -rows=>10,
+			  -columns=>50);
+
+	-or
+
+   print textarea('foo','starting value',10,50);
+
+textarea() is just like textfield, but it allows you to specify
+rows and columns for a multiline text entry box.  You can provide
+a starting value for the field, which can be long and contain
+multiple lines.
+
+=head2 CREATING A PASSWORD FIELD
+
+   print password_field(-name=>'secret',
+				-value=>'starting value',
+				-size=>50,
+				-maxlength=>80);
+	-or-
+
+   print password_field('secret','starting value',50,80);
+
+password_field() is identical to textfield(), except that its contents 
+will be starred out on the web page.
+
+=head2 CREATING A FILE UPLOAD FIELD
+
+    print filefield(-name=>'uploaded_file',
+			    -default=>'starting value',
+			    -size=>50,
+			    -maxlength=>80);
+	-or-
+
+    print filefield('uploaded_file','starting value',50,80);
+
+filefield() will return a file upload field for Netscape 2.0 browsers.
+In order to take full advantage of this I<you must use the new 
+multipart encoding scheme> for the form.  You can do this either
+by calling B<start_form()> with an encoding type of B<&CGI::MULTIPART>,
+or by calling the new method B<start_multipart_form()> instead of
+vanilla B<start_form()>.
+
+=over 4
+
+=item B<Parameters>
+
+=item 1.
+
+The first parameter is the required name for the field (-name).  
+
+=item 2.
+
+The optional second parameter is the starting value for the field contents
+to be used as the default file name (-default).
+
+For security reasons, browsers don't pay any attention to this field,
+and so the starting value will always be blank.  Worse, the field
+loses its "sticky" behavior and forgets its previous contents.  The
+starting value field is called for in the HTML specification, however,
+and possibly some browser will eventually provide support for it.
+
+=item 3.
+
+The optional third parameter is the size of the field in
+characters (-size).
+
+=item 4.
+
+The optional fourth parameter is the maximum number of characters the
+field will accept (-maxlength).
+
+=back
+
+When the form is processed, you can retrieve the entered filename
+by calling param():
+
+       $filename = param('uploaded_file');
+
+Different browsers will return slightly different things for the
+name.  Some browsers return the filename only.  Others return the full
+path to the file, using the path conventions of the user's machine.
+Regardless, the name returned is always the name of the file on the
+I<user's> machine, and is unrelated to the name of the temporary file
+that CGI.pm creates during upload spooling (see below).
+
+The filename returned is also a file handle.  You can read the contents
+of the file using standard Perl file reading calls:
+
+	# Read a text file and print it out
+	while (<$filename>) {
+	   print;
+	}
+
+	# Copy a binary file to somewhere safe
+	open (OUTFILE,">>/usr/local/web/users/feedback");
+	while ($bytesread=read($filename,$buffer,1024)) {
+	   print OUTFILE $buffer;
+	}
+
+However, there are problems with the dual nature of the upload fields.
+If you C<use strict>, then Perl will complain when you try to use a
+string as a filehandle.  You can get around this by placing the file
+reading code in a block containing the C<no strict> pragma.  More
+seriously, it is possible for the remote user to type garbage into the
+upload field, in which case what you get from param() is not a
+filehandle at all, but a string.
+
+To be safe, use the I<upload()> function (new in version 2.47).  When
+called with the name of an upload field, I<upload()> returns a
+filehandle, or undef if the parameter is not a valid filehandle.
+
+     $fh = upload('uploaded_file');
+     while (<$fh>) {
+	   print;
+     }
+
+In an list context, upload() will return an array of filehandles.
+This makes it possible to create forms that use the same name for
+multiple upload fields.
+
+This is the recommended idiom.
+
+When a file is uploaded the browser usually sends along some
+information along with it in the format of headers.  The information
+usually includes the MIME content type.  Future browsers may send
+other information as well (such as modification date and size). To
+retrieve this information, call uploadInfo().  It returns a reference to
+an associative array containing all the document headers.
+
+       $filename = param('uploaded_file');
+       $type = uploadInfo($filename)->{'Content-Type'};
+       unless ($type eq 'text/html') {
+	  die "HTML FILES ONLY!";
+       }
+
+If you are using a machine that recognizes "text" and "binary" data
+modes, be sure to understand when and how to use them (see the Camel book).  
+Otherwise you may find that binary files are corrupted during file
+uploads.
+
+There are occasionally problems involving parsing the uploaded file.
+This usually happens when the user presses "Stop" before the upload is
+finished.  In this case, CGI.pm will return undef for the name of the
+uploaded file and set I<cgi_error()> to the string "400 Bad request
+(malformed multipart POST)".  This error message is designed so that
+you can incorporate it into a status code to be sent to the browser.
+Example:
+
+   $file = upload('uploaded_file');
+   if (!$file && cgi_error) {
+      print header(-status=>cgi_error);
+      exit 0;
+   }
+
+You are free to create a custom HTML page to complain about the error,
+if you wish.
+
+You can set up a callback that will be called whenever a file upload
+is being read during the form processing. This is much like the
+UPLOAD_HOOK facility available in Apache::Request, with the exception
+that the first argument to the callback is an Apache::Upload object,
+here it's the remote filename.
+
+ $q = CGI->new(\&hook,$data);
+
+ sub hook
+ {
+        my ($filename, $buffer, $bytes_read, $data) = @_;
+        print  "Read $bytes_read bytes of $filename\n";         
+ }
+
+If using the function-oriented interface, call the CGI::upload_hook()
+method before calling param() or any other CGI functions:
+
+  CGI::upload_hook(\&hook,$data);
+
+This method is not exported by default.  You will have to import it
+explicitly if you wish to use it without the CGI:: prefix.
+
+If you are using CGI.pm on a Windows platform and find that binary
+files get slightly larger when uploaded but that text files remain the
+same, then you have forgotten to activate binary mode on the output
+filehandle.  Be sure to call binmode() on any handle that you create
+to write the uploaded file to disk.
+
+JAVASCRIPTING: The B<-onChange>, B<-onFocus>, B<-onBlur>,
+B<-onMouseOver>, B<-onMouseOut> and B<-onSelect> parameters are
+recognized.  See textfield() for details.
+
+=head2 CREATING A POPUP MENU
+
+   print popup_menu('menu_name',
+			    ['eenie','meenie','minie'],
+			    'meenie');
+
+      -or-
+
+   %labels = ('eenie'=>'your first choice',
+	      'meenie'=>'your second choice',
+	      'minie'=>'your third choice');
+   %attributes = ('eenie'=>{'class'=>'class of first choice'});
+   print popup_menu('menu_name',
+			    ['eenie','meenie','minie'],
+          'meenie',\%labels,\%attributes);
+
+	-or (named parameter style)-
+
+   print popup_menu(-name=>'menu_name',
+			    -values=>['eenie','meenie','minie'],
+			    -default=>'meenie',
+          -labels=>\%labels,
+          -attributes=>\%attributes);
+
+popup_menu() creates a menu.
+
+=over 4
+
+=item 1.
+
+The required first argument is the menu's name (-name).
+
+=item 2.
+
+The required second argument (-values) is an array B<reference>
+containing the list of menu items in the menu.  You can pass the
+method an anonymous array, as shown in the example, or a reference to
+a named array, such as "\@foo".
+
+=item 3.
+
+The optional third parameter (-default) is the name of the default
+menu choice.  If not specified, the first item will be the default.
+The values of the previous choice will be maintained across queries.
+
+=item 4.
+
+The optional fourth parameter (-labels) is provided for people who
+want to use different values for the user-visible label inside the
+popup menu and the value returned to your script.  It's a pointer to an
+associative array relating menu values to user-visible labels.  If you
+leave this parameter blank, the menu values will be displayed by
+default.  (You can also leave a label undefined if you want to).
+
+=item 5.
+
+The optional fifth parameter (-attributes) is provided to assign
+any of the common HTML attributes to an individual menu item. It's
+a pointer to an associative array relating menu values to another
+associative array with the attribute's name as the key and the
+attribute's value as the value.
+
+=back
+
+When the form is processed, the selected value of the popup menu can
+be retrieved using:
+
+      $popup_menu_value = param('menu_name');
+
+=head2 CREATING AN OPTION GROUP
+
+Named parameter style
+
+  print popup_menu(-name=>'menu_name',
+                  -values=>[qw/eenie meenie minie/,
+                            optgroup(-name=>'optgroup_name',
+                                             -values => ['moe','catch'],
+                                             -attributes=>{'catch'=>{'class'=>'red'}})],
+                  -labels=>{'eenie'=>'one',
+                            'meenie'=>'two',
+                            'minie'=>'three'},
+                  -default=>'meenie');
+
+  Old style
+  print popup_menu('menu_name',
+                  ['eenie','meenie','minie',
+                   optgroup('optgroup_name', ['moe', 'catch'],
+                                   {'catch'=>{'class'=>'red'}})],'meenie',
+                  {'eenie'=>'one','meenie'=>'two','minie'=>'three'});
+
+optgroup() creates an option group within a popup menu.
+
+=over 4
+
+=item 1.
+
+The required first argument (B<-name>) is the label attribute of the
+optgroup and is B<not> inserted in the parameter list of the query.
+
+=item 2.
+
+The required second argument (B<-values>)  is an array reference
+containing the list of menu items in the menu.  You can pass the
+method an anonymous array, as shown in the example, or a reference
+to a named array, such as \@foo.  If you pass a HASH reference,
+the keys will be used for the menu values, and the values will be
+used for the menu labels (see -labels below).
+
+=item 3.
+
+The optional third parameter (B<-labels>) allows you to pass a reference
+to an associative array containing user-visible labels for one or more
+of the menu items.  You can use this when you want the user to see one
+menu string, but have the browser return your program a different one.
+If you don't specify this, the value string will be used instead
+("eenie", "meenie" and "minie" in this example).  This is equivalent
+to using a hash reference for the -values parameter.
+
+=item 4.
+
+An optional fourth parameter (B<-labeled>) can be set to a true value
+and indicates that the values should be used as the label attribute
+for each option element within the optgroup.
+
+=item 5.
+
+An optional fifth parameter (-novals) can be set to a true value and
+indicates to suppress the val attribut in each option element within
+the optgroup.
+
+See the discussion on optgroup at W3C
+(http://www.w3.org/TR/REC-html40/interact/forms.html#edef-OPTGROUP)
+for details.
+
+=item 6.
+
+An optional sixth parameter (-attributes) is provided to assign
+any of the common HTML attributes to an individual menu item. It's
+a pointer to an associative array relating menu values to another
+associative array with the attribute's name as the key and the
+attribute's value as the value.
+
+=back
+
+=head2 CREATING A SCROLLING LIST
+
+   print scrolling_list('list_name',
+				['eenie','meenie','minie','moe'],
+        ['eenie','moe'],5,'true',{'moe'=>{'class'=>'red'}});
+      -or-
+
+   print scrolling_list('list_name',
+				['eenie','meenie','minie','moe'],
+				['eenie','moe'],5,'true',
+        \%labels,%attributes);
+
+	-or-
+
+   print scrolling_list(-name=>'list_name',
+				-values=>['eenie','meenie','minie','moe'],
+				-default=>['eenie','moe'],
+				-size=>5,
+				-multiple=>'true',
+        -labels=>\%labels,
+        -attributes=>\%attributes);
+
+scrolling_list() creates a scrolling list.  
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first and second arguments are the list name (-name) and values
+(-values).  As in the popup menu, the second argument should be an
+array reference.
+
+=item 2.
+
+The optional third argument (-default) can be either a reference to a
+list containing the values to be selected by default, or can be a
+single value to select.  If this argument is missing or undefined,
+then nothing is selected when the list first appears.  In the named
+parameter version, you can use the synonym "-defaults" for this
+parameter.
+
+=item 3.
+
+The optional fourth argument is the size of the list (-size).
+
+=item 4.
+
+The optional fifth argument can be set to true to allow multiple
+simultaneous selections (-multiple).  Otherwise only one selection
+will be allowed at a time.
+
+=item 5.
+
+The optional sixth argument is a pointer to an associative array
+containing long user-visible labels for the list items (-labels).
+If not provided, the values will be displayed.
+
+=item 6.
+
+The optional sixth parameter (-attributes) is provided to assign
+any of the common HTML attributes to an individual menu item. It's
+a pointer to an associative array relating menu values to another
+associative array with the attribute's name as the key and the
+attribute's value as the value.
+
+When this form is processed, all selected list items will be returned as
+a list under the parameter name 'list_name'.  The values of the
+selected items can be retrieved with:
+
+      @selected = param('list_name');
+
+=back
+
+=head2 CREATING A GROUP OF RELATED CHECKBOXES
+
+   print checkbox_group(-name=>'group_name',
+				-values=>['eenie','meenie','minie','moe'],
+				-default=>['eenie','moe'],
+				-linebreak=>'true',
+        -labels=>\%labels,
+        -attributes=>\%attributes);
+
+   print checkbox_group('group_name',
+				['eenie','meenie','minie','moe'],
+        ['eenie','moe'],'true',\%labels,
+        {'moe'=>{'class'=>'red'}});
+
+   HTML3-COMPATIBLE BROWSERS ONLY:
+
+   print checkbox_group(-name=>'group_name',
+				-values=>['eenie','meenie','minie','moe'],
+				-rows=2,-columns=>2);
+
+
+checkbox_group() creates a list of checkboxes that are related
+by the same name.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first and second arguments are the checkbox name and values,
+respectively (-name and -values).  As in the popup menu, the second
+argument should be an array reference.  These values are used for the
+user-readable labels printed next to the checkboxes as well as for the
+values passed to your script in the query string.
+
+=item 2.
+
+The optional third argument (-default) can be either a reference to a
+list containing the values to be checked by default, or can be a
+single value to checked.  If this argument is missing or undefined,
+then nothing is selected when the list first appears.
+
+=item 3.
+
+The optional fourth argument (-linebreak) can be set to true to place
+line breaks between the checkboxes so that they appear as a vertical
+list.  Otherwise, they will be strung together on a horizontal line.
+
+=back
+
+
+The optional b<-labels> argument is a pointer to an associative array
+relating the checkbox values to the user-visible labels that will be
+printed next to them.  If not provided, the values will be used as the
+default.
+
+
+Modern browsers can take advantage of the optional parameters
+B<-rows>, and B<-columns>.  These parameters cause checkbox_group() to
+return an HTML3 compatible table containing the checkbox group
+formatted with the specified number of rows and columns.  You can
+provide just the -columns parameter if you wish; checkbox_group will
+calculate the correct number of rows for you.
+
+
+The optional B<-attributes> argument is provided to assign any of the
+common HTML attributes to an individual menu item. It's a pointer to
+an associative array relating menu values to another associative array
+with the attribute's name as the key and the attribute's value as the
+value.
+
+The optional B<-tabindex> argument can be used to control the order in which
+radio buttons receive focus when the user presses the tab button.  If
+passed a scalar numeric value, the first element in the group will
+receive this tab index and subsequent elements will be incremented by
+one.  If given a reference to an array of radio button values, then
+the indexes will be jiggered so that the order specified in the array
+will correspond to the tab order.  You can also pass a reference to a
+hash in which the hash keys are the radio button values and the values
+are the tab indexes of each button.  Examples:
+
+  -tabindex => 100    #  this group starts at index 100 and counts up
+  -tabindex => ['moe','minie','eenie','meenie']  # tab in this order
+  -tabindex => {meenie=>100,moe=>101,minie=>102,eenie=>200} # tab in this order
+
+When the form is processed, all checked boxes will be returned as
+a list under the parameter name 'group_name'.  The values of the
+"on" checkboxes can be retrieved with:
+
+      @turned_on = param('group_name');
+
+The value returned by checkbox_group() is actually an array of button
+elements.  You can capture them and use them within tables, lists,
+or in other creative ways:
+
+    @h = checkbox_group(-name=>'group_name',-values=>\@values);
+    &use_in_creative_way(@h);
+
+=head2 CREATING A STANDALONE CHECKBOX
+
+    print checkbox(-name=>'checkbox_name',
+			   -checked=>1,
+			   -value=>'ON',
+			   -label=>'CLICK ME');
+
+	-or-
+
+    print checkbox('checkbox_name','checked','ON','CLICK ME');
+
+checkbox() is used to create an isolated checkbox that isn't logically
+related to any others.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first parameter is the required name for the checkbox (-name).  It
+will also be used for the user-readable label printed next to the
+checkbox.
+
+=item 2.
+
+The optional second parameter (-checked) specifies that the checkbox
+is turned on by default.  Synonyms are -selected and -on.
+
+=item 3.
+
+The optional third parameter (-value) specifies the value of the
+checkbox when it is checked.  If not provided, the word "on" is
+assumed.
+
+=item 4.
+
+The optional fourth parameter (-label) is the user-readable label to
+be attached to the checkbox.  If not provided, the checkbox name is
+used.
+
+=back
+
+The value of the checkbox can be retrieved using:
+
+    $turned_on = param('checkbox_name');
+
+=head2 CREATING A RADIO BUTTON GROUP
+
+   print radio_group(-name=>'group_name',
+			     -values=>['eenie','meenie','minie'],
+			     -default=>'meenie',
+			     -linebreak=>'true',
+           -labels=>\%labels,
+           -attributes=>\%attributes);
+
+	-or-
+
+   print radio_group('group_name',['eenie','meenie','minie'],
+            'meenie','true',\%labels,\%attributes);
+
+
+   HTML3-COMPATIBLE BROWSERS ONLY:
+
+   print radio_group(-name=>'group_name',
+			     -values=>['eenie','meenie','minie','moe'],
+			     -rows=2,-columns=>2);
+
+radio_group() creates a set of logically-related radio buttons
+(turning one member of the group on turns the others off)
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first argument is the name of the group and is required (-name).
+
+=item 2.
+
+The second argument (-values) is the list of values for the radio
+buttons.  The values and the labels that appear on the page are
+identical.  Pass an array I<reference> in the second argument, either
+using an anonymous array, as shown, or by referencing a named array as
+in "\@foo".
+
+=item 3.
+
+The optional third parameter (-default) is the name of the default
+button to turn on. If not specified, the first item will be the
+default.  You can provide a nonexistent button name, such as "-" to
+start up with no buttons selected.
+
+=item 4.
+
+The optional fourth parameter (-linebreak) can be set to 'true' to put
+line breaks between the buttons, creating a vertical list.
+
+=item 5.
+
+The optional fifth parameter (-labels) is a pointer to an associative
+array relating the radio button values to user-visible labels to be
+used in the display.  If not provided, the values themselves are
+displayed.
+
+=back
+
+
+All modern browsers can take advantage of the optional parameters
+B<-rows>, and B<-columns>.  These parameters cause radio_group() to
+return an HTML3 compatible table containing the radio group formatted
+with the specified number of rows and columns.  You can provide just
+the -columns parameter if you wish; radio_group will calculate the
+correct number of rows for you.
+
+To include row and column headings in the returned table, you
+can use the B<-rowheader> and B<-colheader> parameters.  Both
+of these accept a pointer to an array of headings to use.
+The headings are just decorative.  They don't reorganize the
+interpretation of the radio buttons -- they're still a single named
+unit.
+
+The optional B<-tabindex> argument can be used to control the order in which
+radio buttons receive focus when the user presses the tab button.  If
+passed a scalar numeric value, the first element in the group will
+receive this tab index and subsequent elements will be incremented by
+one.  If given a reference to an array of radio button values, then
+the indexes will be jiggered so that the order specified in the array
+will correspond to the tab order.  You can also pass a reference to a
+hash in which the hash keys are the radio button values and the values
+are the tab indexes of each button.  Examples:
+
+  -tabindex => 100    #  this group starts at index 100 and counts up
+  -tabindex => ['moe','minie','eenie','meenie']  # tab in this order
+  -tabindex => {meenie=>100,moe=>101,minie=>102,eenie=>200} # tab in this order
+
+
+The optional B<-attributes> argument is provided to assign any of the
+common HTML attributes to an individual menu item. It's a pointer to
+an associative array relating menu values to another associative array
+with the attribute's name as the key and the attribute's value as the
+value.
+
+When the form is processed, the selected radio button can
+be retrieved using:
+
+      $which_radio_button = param('group_name');
+
+The value returned by radio_group() is actually an array of button
+elements.  You can capture them and use them within tables, lists,
+or in other creative ways:
+
+    @h = radio_group(-name=>'group_name',-values=>\@values);
+    &use_in_creative_way(@h);
+
+=head2 CREATING A SUBMIT BUTTON 
+
+   print submit(-name=>'button_name',
+			-value=>'value');
+
+	-or-
+
+   print submit('button_name','value');
+
+submit() will create the query submission button.  Every form
+should have one of these.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first argument (-name) is optional.  You can give the button a
+name if you have several submission buttons in your form and you want
+to distinguish between them.  
+
+=item 2.
+
+The second argument (-value) is also optional.  This gives the button
+a value that will be passed to your script in the query string. The
+name will also be used as the user-visible label.
+
+=item 3.
+
+You can use -label as an alias for -value.  I always get confused
+about which of -name and -value changes the user-visible label on the
+button.
+
+=back
+
+You can figure out which button was pressed by using different
+values for each one:
+
+     $which_one = param('button_name');
+
+=head2 CREATING A RESET BUTTON
+
+   print reset
+
+reset() creates the "reset" button.  Note that it restores the
+form to its value from the last time the script was called, 
+NOT necessarily to the defaults.
+
+Note that this conflicts with the Perl reset() built-in.  Use
+CORE::reset() to get the original reset function.
+
+=head2 CREATING A DEFAULT BUTTON
+
+   print defaults('button_label')
+
+defaults() creates a button that, when invoked, will cause the
+form to be completely reset to its defaults, wiping out all the
+changes the user ever made.
+
+=head2 CREATING A HIDDEN FIELD
+
+	print hidden(-name=>'hidden_name',
+			     -default=>['value1','value2'...]);
+
+		-or-
+
+	print hidden('hidden_name','value1','value2'...);
+
+hidden() produces a text field that can't be seen by the user.  It
+is useful for passing state variable information from one invocation
+of the script to the next.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first argument is required and specifies the name of this
+field (-name).
+
+=item 2.  
+
+The second argument is also required and specifies its value
+(-default).  In the named parameter style of calling, you can provide
+a single value here or a reference to a whole list
+
+=back
+
+Fetch the value of a hidden field this way:
+
+     $hidden_value = param('hidden_name');
+
+Note, that just like all the other form elements, the value of a
+hidden field is "sticky".  If you want to replace a hidden field with
+some other values after the script has been called once you'll have to
+do it manually:
+
+     param('hidden_name','new','values','here');
+
+=head2 CREATING A CLICKABLE IMAGE BUTTON
+
+     print image_button(-name=>'button_name',
+				-src=>'/source/URL',
+				-align=>'MIDDLE');      
+
+	-or-
+
+     print image_button('button_name','/source/URL','MIDDLE');
+
+image_button() produces a clickable image.  When it's clicked on the
+position of the click is returned to your script as "button_name.x"
+and "button_name.y", where "button_name" is the name you've assigned
+to it.
+
+=over 4
+
+=item B<Parameters:>
+
+=item 1.
+
+The first argument (-name) is required and specifies the name of this
+field.
+
+=item 2.
+
+The second argument (-src) is also required and specifies the URL
+
+=item 3.
+The third option (-align, optional) is an alignment type, and may be
+TOP, BOTTOM or MIDDLE
+
+=back
+
+Fetch the value of the button this way:
+     $x = param('button_name.x');
+     $y = param('button_name.y');
+
+=head2 CREATING A JAVASCRIPT ACTION BUTTON
+
+     print button(-name=>'button_name',
+			  -value=>'user visible label',
+			  -onClick=>"do_something()");
+
+	-or-
+
+     print button('button_name',"do_something()");
+
+button() produces a button that is compatible with Netscape 2.0's
+JavaScript.  When it's pressed the fragment of JavaScript code
+pointed to by the B<-onClick> parameter will be executed.  On
+non-Netscape browsers this form element will probably not even
+display.
+
+=head1 HTTP COOKIES
+
+Netscape browsers versions 1.1 and higher, and all versions of
+Internet Explorer, support a so-called "cookie" designed to help
+maintain state within a browser session.  CGI.pm has several methods
+that support cookies.
+
+A cookie is a name=value pair much like the named parameters in a CGI
+query string.  CGI scripts create one or more cookies and send
+them to the browser in the HTTP header.  The browser maintains a list
+of cookies that belong to a particular Web server, and returns them
+to the CGI script during subsequent interactions.
+
+In addition to the required name=value pair, each cookie has several
+optional attributes:
+
+=over 4
+
+=item 1. an expiration time
+
+This is a time/date string (in a special GMT format) that indicates
+when a cookie expires.  The cookie will be saved and returned to your
+script until this expiration date is reached if the user exits
+the browser and restarts it.  If an expiration date isn't specified, the cookie
+will remain active until the user quits the browser.
+
+=item 2. a domain
+
+This is a partial or complete domain name for which the cookie is 
+valid.  The browser will return the cookie to any host that matches
+the partial domain name.  For example, if you specify a domain name
+of ".capricorn.com", then the browser will return the cookie to
+Web servers running on any of the machines "www.capricorn.com", 
+"www2.capricorn.com", "feckless.capricorn.com", etc.  Domain names
+must contain at least two periods to prevent attempts to match
+on top level domains like ".edu".  If no domain is specified, then
+the browser will only return the cookie to servers on the host the
+cookie originated from.
+
+=item 3. a path
+
+If you provide a cookie path attribute, the browser will check it
+against your script's URL before returning the cookie.  For example,
+if you specify the path "/cgi-bin", then the cookie will be returned
+to each of the scripts "/cgi-bin/tally.pl", "/cgi-bin/order.pl",
+and "/cgi-bin/customer_service/complain.pl", but not to the script
+"/cgi-private/site_admin.pl".  By default, path is set to "/", which
+causes the cookie to be sent to any CGI script on your site.
+
+=item 4. a "secure" flag
+
+If the "secure" attribute is set, the cookie will only be sent to your
+script if the CGI request is occurring on a secure channel, such as SSL.
+
+=back
+
+The interface to HTTP cookies is the B<cookie()> method:
+
+    $cookie = cookie(-name=>'sessionID',
+			     -value=>'xyzzy',
+			     -expires=>'+1h',
+			     -path=>'/cgi-bin/database',
+			     -domain=>'.capricorn.org',
+			     -secure=>1);
+    print header(-cookie=>$cookie);
+
+B<cookie()> creates a new cookie.  Its parameters include:
+
+=over 4
+
+=item B<-name>
+
+The name of the cookie (required).  This can be any string at all.
+Although browsers limit their cookie names to non-whitespace
+alphanumeric characters, CGI.pm removes this restriction by escaping
+and unescaping cookies behind the scenes.
+
+=item B<-value>
+
+The value of the cookie.  This can be any scalar value,
+array reference, or even associative array reference.  For example,
+you can store an entire associative array into a cookie this way:
+
+	$cookie=cookie(-name=>'family information',
+			       -value=>\%childrens_ages);
+
+=item B<-path>
+
+The optional partial path for which this cookie will be valid, as described
+above.
+
+=item B<-domain>
+
+The optional partial domain for which this cookie will be valid, as described
+above.
+
+=item B<-expires>
+
+The optional expiration date for this cookie.  The format is as described 
+in the section on the B<header()> method:
+
+	"+1h"  one hour from now
+
+=item B<-secure>
+
+If set to true, this cookie will only be used within a secure
+SSL session.
+
+=back
+
+The cookie created by cookie() must be incorporated into the HTTP
+header within the string returned by the header() method:
+
+	print header(-cookie=>$my_cookie);
+
+To create multiple cookies, give header() an array reference:
+
+	$cookie1 = cookie(-name=>'riddle_name',
+				  -value=>"The Sphynx's Question");
+	$cookie2 = cookie(-name=>'answers',
+				  -value=>\%answers);
+	print header(-cookie=>[$cookie1,$cookie2]);
+
+To retrieve a cookie, request it by name by calling cookie() method
+without the B<-value> parameter:
+
+	use CGI;
+	$query = new CGI;
+	$riddle = cookie('riddle_name');
+        %answers = cookie('answers');
+
+Cookies created with a single scalar value, such as the "riddle_name"
+cookie, will be returned in that form.  Cookies with array and hash
+values can also be retrieved.
+
+The cookie and CGI namespaces are separate.  If you have a parameter
+named 'answers' and a cookie named 'answers', the values retrieved by
+param() and cookie() are independent of each other.  However, it's
+simple to turn a CGI parameter into a cookie, and vice-versa:
+
+   # turn a CGI parameter into a cookie
+   $c=cookie(-name=>'answers',-value=>[param('answers')]);
+   # vice-versa
+   param(-name=>'answers',-value=>[cookie('answers')]);
+
+See the B<cookie.cgi> example script for some ideas on how to use
+cookies effectively.
+
+=head1 WORKING WITH FRAMES
+
+It's possible for CGI.pm scripts to write into several browser panels
+and windows using the HTML 4 frame mechanism.  There are three
+techniques for defining new frames programmatically:
+
+=over 4
+
+=item 1. Create a <Frameset> document
+
+After writing out the HTTP header, instead of creating a standard
+HTML document using the start_html() call, create a <frameset> 
+document that defines the frames on the page.  Specify your script(s)
+(with appropriate parameters) as the SRC for each of the frames.
+
+There is no specific support for creating <frameset> sections 
+in CGI.pm, but the HTML is very simple to write.  See the frame
+documentation in Netscape's home pages for details 
+
+  http://home.netscape.com/assist/net_sites/frames.html
+
+=item 2. Specify the destination for the document in the HTTP header
+
+You may provide a B<-target> parameter to the header() method:
+
+    print header(-target=>'ResultsWindow');
+
+This will tell the browser to load the output of your script into the
+frame named "ResultsWindow".  If a frame of that name doesn't already
+exist, the browser will pop up a new window and load your script's
+document into that.  There are a number of magic names that you can
+use for targets.  See the frame documents on Netscape's home pages for
+details.
+
+=item 3. Specify the destination for the document in the <form> tag
+
+You can specify the frame to load in the FORM tag itself.  With
+CGI.pm it looks like this:
+
+    print start_form(-target=>'ResultsWindow');
+
+When your script is reinvoked by the form, its output will be loaded
+into the frame named "ResultsWindow".  If one doesn't already exist
+a new window will be created.
+
+=back
+
+The script "frameset.cgi" in the examples directory shows one way to
+create pages in which the fill-out form and the response live in
+side-by-side frames.
+
+=head1 SUPPORT FOR JAVASCRIPT
+
+Netscape versions 2.0 and higher incorporate an interpreted language
+called JavaScript. Internet Explorer, 3.0 and higher, supports a
+closely-related dialect called JScript. JavaScript isn't the same as
+Java, and certainly isn't at all the same as Perl, which is a great
+pity. JavaScript allows you to programatically change the contents of
+fill-out forms, create new windows, and pop up dialog box from within
+Netscape itself. From the point of view of CGI scripting, JavaScript
+is quite useful for validating fill-out forms prior to submitting
+them.
+
+You'll need to know JavaScript in order to use it. There are many good
+sources in bookstores and on the web.
+
+The usual way to use JavaScript is to define a set of functions in a
+<SCRIPT> block inside the HTML header and then to register event
+handlers in the various elements of the page. Events include such
+things as the mouse passing over a form element, a button being
+clicked, the contents of a text field changing, or a form being
+submitted. When an event occurs that involves an element that has
+registered an event handler, its associated JavaScript code gets
+called.
+
+The elements that can register event handlers include the <BODY> of an
+HTML document, hypertext links, all the various elements of a fill-out
+form, and the form itself. There are a large number of events, and
+each applies only to the elements for which it is relevant. Here is a
+partial list:
+
+=over 4
+
+=item B<onLoad>
+
+The browser is loading the current document. Valid in:
+
+     + The HTML <BODY> section only.
+
+=item B<onUnload>
+
+The browser is closing the current page or frame. Valid for:
+
+     + The HTML <BODY> section only.
+
+=item B<onSubmit>
+
+The user has pressed the submit button of a form. This event happens
+just before the form is submitted, and your function can return a
+value of false in order to abort the submission.  Valid for:
+
+     + Forms only.
+
+=item B<onClick>
+
+The mouse has clicked on an item in a fill-out form. Valid for:
+
+     + Buttons (including submit, reset, and image buttons)
+     + Checkboxes
+     + Radio buttons
+
+=item B<onChange>
+
+The user has changed the contents of a field. Valid for:
+
+     + Text fields
+     + Text areas
+     + Password fields
+     + File fields
+     + Popup Menus
+     + Scrolling lists
+
+=item B<onFocus>
+
+The user has selected a field to work with. Valid for:
+
+     + Text fields
+     + Text areas
+     + Password fields
+     + File fields
+     + Popup Menus
+     + Scrolling lists
+
+=item B<onBlur>
+
+The user has deselected a field (gone to work somewhere else).  Valid
+for:
+
+     + Text fields
+     + Text areas
+     + Password fields
+     + File fields
+     + Popup Menus
+     + Scrolling lists
+
+=item B<onSelect>
+
+The user has changed the part of a text field that is selected.  Valid
+for:
+
+     + Text fields
+     + Text areas
+     + Password fields
+     + File fields
+
+=item B<onMouseOver>
+
+The mouse has moved over an element.
+
+     + Text fields
+     + Text areas
+     + Password fields
+     + File fields
+     + Popup Menus
+     + Scrolling lists
+
+=item B<onMouseOut>
+
+The mouse has moved off an element.
+
+     + Text fields
+     + Text areas
+     + Password fields
+     + File fields
+     + Popup Menus
+     + Scrolling lists
+
+=back
+
+In order to register a JavaScript event handler with an HTML element,
+just use the event name as a parameter when you call the corresponding
+CGI method. For example, to have your validateAge() JavaScript code
+executed every time the textfield named "age" changes, generate the
+field like this: 
+
+ print textfield(-name=>'age',-onChange=>"validateAge(this)");
+
+This example assumes that you've already declared the validateAge()
+function by incorporating it into a <SCRIPT> block. The CGI.pm
+start_html() method provides a convenient way to create this section.
+
+Similarly, you can create a form that checks itself over for
+consistency and alerts the user if some essential value is missing by
+creating it this way: 
+  print startform(-onSubmit=>"validateMe(this)");
+
+See the javascript.cgi script for a demonstration of how this all
+works.
+
+
+=head1 LIMITED SUPPORT FOR CASCADING STYLE SHEETS
+
+CGI.pm has limited support for HTML3's cascading style sheets (css).
+To incorporate a stylesheet into your document, pass the
+start_html() method a B<-style> parameter.  The value of this
+parameter may be a scalar, in which case it is treated as the source
+URL for the stylesheet, or it may be a hash reference.  In the latter
+case you should provide the hash with one or more of B<-src> or
+B<-code>.  B<-src> points to a URL where an externally-defined
+stylesheet can be found.  B<-code> points to a scalar value to be
+incorporated into a <style> section.  Style definitions in B<-code>
+override similarly-named ones in B<-src>, hence the name "cascading."
+
+You may also specify the type of the stylesheet by adding the optional
+B<-type> parameter to the hash pointed to by B<-style>.  If not
+specified, the style defaults to 'text/css'.
+
+To refer to a style within the body of your document, add the
+B<-class> parameter to any HTML element:
+
+    print h1({-class=>'Fancy'},'Welcome to the Party');
+
+Or define styles on the fly with the B<-style> parameter:
+
+    print h1({-style=>'Color: red;'},'Welcome to Hell');
+
+You may also use the new B<span()> element to apply a style to a
+section of text:
+
+    print span({-style=>'Color: red;'},
+	       h1('Welcome to Hell'),
+	       "Where did that handbasket get to?"
+	       );
+
+Note that you must import the ":html3" definitions to have the
+B<span()> method available.  Here's a quick and dirty example of using
+CSS's.  See the CSS specification at
+http://www.w3.org/pub/WWW/TR/Wd-css-1.html for more information.
+
+    use CGI qw/:standard :html3/;
+
+    #here's a stylesheet incorporated directly into the page
+    $newStyle=<<END;
+    <!-- 
+    P.Tip {
+	margin-right: 50pt;
+	margin-left: 50pt;
+        color: red;
+    }
+    P.Alert {
+	font-size: 30pt;
+        font-family: sans-serif;
+      color: red;
+    }
+    -->
+    END
+    print header();
+    print start_html( -title=>'CGI with Style',
+		      -style=>{-src=>'http://www.capricorn.com/style/st1.css',
+		               -code=>$newStyle}
+	             );
+    print h1('CGI with Style'),
+          p({-class=>'Tip'},
+	    "Better read the cascading style sheet spec before playing with this!"),
+          span({-style=>'color: magenta'},
+	       "Look Mom, no hands!",
+	       p(),
+	       "Whooo wee!"
+	       );
+    print end_html;
+
+Pass an array reference to B<-code> or B<-src> in order to incorporate
+multiple stylesheets into your document.
+
+Should you wish to incorporate a verbatim stylesheet that includes
+arbitrary formatting in the header, you may pass a -verbatim tag to
+the -style hash, as follows:
+
+print start_html (-STYLE  =>  {-verbatim => '@import
+url("/server-common/css/'.$cssFile.'");',
+                      -src      =>  '/server-common/css/core.css'});
+</blockquote></pre>
+
+
+This will generate an HTML header that contains this:
+
+ <link rel="stylesheet" type="text/css"  href="/server-common/css/core.css">
+   <style type="text/css">
+   @import url("/server-common/css/main.css");
+   </style>
+
+Any additional arguments passed in the -style value will be
+incorporated into the <link> tag.  For example:
+
+ start_html(-style=>{-src=>['/styles/print.css','/styles/layout.css'],
+			  -media => 'all'});
+
+This will give:
+
+ <link rel="stylesheet" type="text/css" href="/styles/print.css" media="all"/>
+ <link rel="stylesheet" type="text/css" href="/styles/layout.css" media="all"/>
+
+<p>
+
+To make more complicated <link> tags, use the Link() function
+and pass it to start_html() in the -head argument, as in:
+
+  @h = (Link({-rel=>'stylesheet',-type=>'text/css',-src=>'/ss/ss.css',-media=>'all'}),
+        Link({-rel=>'stylesheet',-type=>'text/css',-src=>'/ss/fred.css',-media=>'paper'}));
+  print start_html({-head=>\@h})
+
+=head1 DEBUGGING
+
+If you are running the script from the command line or in the perl
+debugger, you can pass the script a list of keywords or
+parameter=value pairs on the command line or from standard input (you
+don't have to worry about tricking your script into reading from
+environment variables).  You can pass keywords like this:
+
+    your_script.pl keyword1 keyword2 keyword3
+
+or this:
+
+   your_script.pl keyword1+keyword2+keyword3
+
+or this:
+
+    your_script.pl name1=value1 name2=value2
+
+or this:
+
+    your_script.pl name1=value1&name2=value2
+
+To turn off this feature, use the -no_debug pragma.
+
+To test the POST method, you may enable full debugging with the -debug
+pragma.  This will allow you to feed newline-delimited name=value
+pairs to the script on standard input.
+
+When debugging, you can use quotes and backslashes to escape 
+characters in the familiar shell manner, letting you place
+spaces and other funny characters in your parameter=value
+pairs:
+
+   your_script.pl "name1='I am a long value'" "name2=two\ words"
+
+Finally, you can set the path info for the script by prefixing the first
+name/value parameter with the path followed by a question mark (?):
+
+    your_script.pl /your/path/here?name1=value1&name2=value2
+
+=head2 DUMPING OUT ALL THE NAME/VALUE PAIRS
+
+The Dump() method produces a string consisting of all the query's
+name/value pairs formatted nicely as a nested list.  This is useful
+for debugging purposes:
+
+    print Dump
+
+
+Produces something that looks like:
+
+    <ul>
+    <li>name1
+	<ul>
+	<li>value1
+	<li>value2
+	</ul>
+    <li>name2
+	<ul>
+	<li>value1
+	</ul>
+    </ul>
+
+As a shortcut, you can interpolate the entire CGI object into a string
+and it will be replaced with the a nice HTML dump shown above:
+
+    $query=new CGI;
+    print "<h2>Current Values</h2> $query\n";
+
+=head1 FETCHING ENVIRONMENT VARIABLES
+
+Some of the more useful environment variables can be fetched
+through this interface.  The methods are as follows:
+
+=over 4
+
+=item B<Accept()>
+
+Return a list of MIME types that the remote browser accepts. If you
+give this method a single argument corresponding to a MIME type, as in
+Accept('text/html'), it will return a floating point value
+corresponding to the browser's preference for this type from 0.0
+(don't want) to 1.0.  Glob types (e.g. text/*) in the browser's accept
+list are handled correctly.
+
+Note that the capitalization changed between version 2.43 and 2.44 in
+order to avoid conflict with Perl's accept() function.
+
+=item B<raw_cookie()>
+
+Returns the HTTP_COOKIE variable, an HTTP extension implemented by
+Netscape browsers version 1.1 and higher, and all versions of Internet
+Explorer.  Cookies have a special format, and this method call just
+returns the raw form (?cookie dough).  See cookie() for ways of
+setting and retrieving cooked cookies.
+
+Called with no parameters, raw_cookie() returns the packed cookie
+structure.  You can separate it into individual cookies by splitting
+on the character sequence "; ".  Called with the name of a cookie,
+retrieves the B<unescaped> form of the cookie.  You can use the
+regular cookie() method to get the names, or use the raw_fetch()
+method from the CGI::Cookie module.
+
+=item B<user_agent()>
+
+Returns the HTTP_USER_AGENT variable.  If you give
+this method a single argument, it will attempt to
+pattern match on it, allowing you to do something
+like user_agent(netscape);
+
+=item B<path_info()>
+
+Returns additional path information from the script URL.
+E.G. fetching /cgi-bin/your_script/additional/stuff will result in
+path_info() returning "/additional/stuff".
+
+NOTE: The Microsoft Internet Information Server
+is broken with respect to additional path information.  If
+you use the Perl DLL library, the IIS server will attempt to
+execute the additional path information as a Perl script.
+If you use the ordinary file associations mapping, the
+path information will be present in the environment, 
+but incorrect.  The best thing to do is to avoid using additional
+path information in CGI scripts destined for use with IIS.
+
+=item B<path_translated()>
+
+As per path_info() but returns the additional
+path information translated into a physical path, e.g.
+"/usr/local/etc/httpd/htdocs/additional/stuff".
+
+The Microsoft IIS is broken with respect to the translated
+path as well.
+
+=item B<remote_host()>
+
+Returns either the remote host name or IP address.
+if the former is unavailable.
+
+=item B<script_name()>
+Return the script name as a partial URL, for self-refering
+scripts.
+
+=item B<referer()>
+
+Return the URL of the page the browser was viewing
+prior to fetching your script.  Not available for all
+browsers.
+
+=item B<auth_type ()>
+
+Return the authorization/verification method in use for this
+script, if any.
+
+=item B<server_name ()>
+
+Returns the name of the server, usually the machine's host
+name.
+
+=item B<virtual_host ()>
+
+When using virtual hosts, returns the name of the host that
+the browser attempted to contact
+
+=item B<server_port ()>
+
+Return the port that the server is listening on.
+
+=item B<virtual_port ()>
+
+Like server_port() except that it takes virtual hosts into account.
+Use this when running with virtual hosts.
+
+=item B<server_software ()>
+
+Returns the server software and version number.
+
+=item B<remote_user ()>
+
+Return the authorization/verification name used for user
+verification, if this script is protected.
+
+=item B<user_name ()>
+
+Attempt to obtain the remote user's name, using a variety of different
+techniques.  This only works with older browsers such as Mosaic.
+Newer browsers do not report the user name for privacy reasons!
+
+=item B<request_method()>
+
+Returns the method used to access your script, usually
+one of 'POST', 'GET' or 'HEAD'.
+
+=item B<content_type()>
+
+Returns the content_type of data submitted in a POST, generally 
+multipart/form-data or application/x-www-form-urlencoded
+
+=item B<http()>
+
+Called with no arguments returns the list of HTTP environment
+variables, including such things as HTTP_USER_AGENT,
+HTTP_ACCEPT_LANGUAGE, and HTTP_ACCEPT_CHARSET, corresponding to the
+like-named HTTP header fields in the request.  Called with the name of
+an HTTP header field, returns its value.  Capitalization and the use
+of hyphens versus underscores are not significant.
+
+For example, all three of these examples are equivalent:
+
+   $requested_language = http('Accept-language');
+   $requested_language = http('Accept_language');
+   $requested_language = http('HTTP_ACCEPT_LANGUAGE');
+
+=item B<https()>
+
+The same as I<http()>, but operates on the HTTPS environment variables
+present when the SSL protocol is in effect.  Can be used to determine
+whether SSL is turned on.
+
+=back
+
+=head1 USING NPH SCRIPTS
+
+NPH, or "no-parsed-header", scripts bypass the server completely by
+sending the complete HTTP header directly to the browser.  This has
+slight performance benefits, but is of most use for taking advantage
+of HTTP extensions that are not directly supported by your server,
+such as server push and PICS headers.
+
+Servers use a variety of conventions for designating CGI scripts as
+NPH.  Many Unix servers look at the beginning of the script's name for
+the prefix "nph-".  The Macintosh WebSTAR server and Microsoft's
+Internet Information Server, in contrast, try to decide whether a
+program is an NPH script by examining the first line of script output.
+
+
+CGI.pm supports NPH scripts with a special NPH mode.  When in this
+mode, CGI.pm will output the necessary extra header information when
+the header() and redirect() methods are
+called.
+
+The Microsoft Internet Information Server requires NPH mode.  As of
+version 2.30, CGI.pm will automatically detect when the script is
+running under IIS and put itself into this mode.  You do not need to
+do this manually, although it won't hurt anything if you do.  However,
+note that if you have applied Service Pack 6, much of the
+functionality of NPH scripts, including the ability to redirect while
+setting a cookie, b<do not work at all> on IIS without a special patch
+from Microsoft.  See
+http://support.microsoft.com/support/kb/articles/Q280/3/41.ASP:
+Non-Parsed Headers Stripped From CGI Applications That Have nph-
+Prefix in Name.
+
+=over 4
+
+=item In the B<use> statement 
+
+Simply add the "-nph" pragmato the list of symbols to be imported into
+your script:
+
+      use CGI qw(:standard -nph)
+
+=item By calling the B<nph()> method:
+
+Call B<nph()> with a non-zero parameter at any point after using CGI.pm in your program.
+
+      CGI->nph(1)
+
+=item By using B<-nph> parameters
+
+in the B<header()> and B<redirect()>  statements:
+
+      print header(-nph=>1);
+
+=back
+
+=head1 Server Push
+
+CGI.pm provides four simple functions for producing multipart
+documents of the type needed to implement server push.  These
+functions were graciously provided by Ed Jordan <ed@fidalgo.net>.  To
+import these into your namespace, you must import the ":push" set.
+You are also advised to put the script into NPH mode and to set $| to
+1 to avoid buffering problems.
+
+Here is a simple script that demonstrates server push:
+
+  #!/usr/local/bin/perl
+  use CGI qw/:push -nph/;
+  $| = 1;
+  print multipart_init(-boundary=>'----here we go!');
+  foreach (0 .. 4) {
+      print multipart_start(-type=>'text/plain'),
+            "The current time is ",scalar(localtime),"\n";
+      if ($_ < 4) {
+              print multipart_end;
+      } else {
+              print multipart_final;
+      }
+      sleep 1;
+  }
+
+This script initializes server push by calling B<multipart_init()>.
+It then enters a loop in which it begins a new multipart section by
+calling B<multipart_start()>, prints the current local time,
+and ends a multipart section with B<multipart_end()>.  It then sleeps
+a second, and begins again. On the final iteration, it ends the
+multipart section with B<multipart_final()> rather than with
+B<multipart_end()>.
+
+=over 4
+
+=item multipart_init()
+
+  multipart_init(-boundary=>$boundary);
+
+Initialize the multipart system.  The -boundary argument specifies
+what MIME boundary string to use to separate parts of the document.
+If not provided, CGI.pm chooses a reasonable boundary for you.
+
+=item multipart_start()
+
+  multipart_start(-type=>$type)
+
+Start a new part of the multipart document using the specified MIME
+type.  If not specified, text/html is assumed.
+
+=item multipart_end()
+
+  multipart_end()
+
+End a part.  You must remember to call multipart_end() once for each
+multipart_start(), except at the end of the last part of the multipart
+document when multipart_final() should be called instead of multipart_end().
+
+=item multipart_final()
+
+  multipart_final()
+
+End all parts.  You should call multipart_final() rather than
+multipart_end() at the end of the last part of the multipart document.
+
+=back
+
+Users interested in server push applications should also have a look
+at the CGI::Push module.
+
+Only Netscape Navigator supports server push.  Internet Explorer
+browsers do not.
+
+=head1 Avoiding Denial of Service Attacks
+
+A potential problem with CGI.pm is that, by default, it attempts to
+process form POSTings no matter how large they are.  A wily hacker
+could attack your site by sending a CGI script a huge POST of many
+megabytes.  CGI.pm will attempt to read the entire POST into a
+variable, growing hugely in size until it runs out of memory.  While
+the script attempts to allocate the memory the system may slow down
+dramatically.  This is a form of denial of service attack.
+
+Another possible attack is for the remote user to force CGI.pm to
+accept a huge file upload.  CGI.pm will accept the upload and store it
+in a temporary directory even if your script doesn't expect to receive
+an uploaded file.  CGI.pm will delete the file automatically when it
+terminates, but in the meantime the remote user may have filled up the
+server's disk space, causing problems for other programs.
+
+The best way to avoid denial of service attacks is to limit the amount
+of memory, CPU time and disk space that CGI scripts can use.  Some Web
+servers come with built-in facilities to accomplish this. In other
+cases, you can use the shell I<limit> or I<ulimit>
+commands to put ceilings on CGI resource usage.
+
+
+CGI.pm also has some simple built-in protections against denial of
+service attacks, but you must activate them before you can use them.
+These take the form of two global variables in the CGI name space:
+
+=over 4
+
+=item B<$CGI::POST_MAX>
+
+If set to a non-negative integer, this variable puts a ceiling
+on the size of POSTings, in bytes.  If CGI.pm detects a POST
+that is greater than the ceiling, it will immediately exit with an error
+message.  This value will affect both ordinary POSTs and
+multipart POSTs, meaning that it limits the maximum size of file
+uploads as well.  You should set this to a reasonably high
+value, such as 1 megabyte.
+
+=item B<$CGI::DISABLE_UPLOADS>
+
+If set to a non-zero value, this will disable file uploads
+completely.  Other fill-out form values will work as usual.
+
+=back
+
+You can use these variables in either of two ways.
+
+=over 4
+
+=item B<1. On a script-by-script basis>
+
+Set the variable at the top of the script, right after the "use" statement:
+
+    use CGI qw/:standard/;
+    use CGI::Carp 'fatalsToBrowser';
+    $CGI::POST_MAX=1024 * 100;  # max 100K posts
+    $CGI::DISABLE_UPLOADS = 1;  # no uploads
+
+=item B<2. Globally for all scripts>
+
+Open up CGI.pm, find the definitions for $POST_MAX and 
+$DISABLE_UPLOADS, and set them to the desired values.  You'll 
+find them towards the top of the file in a subroutine named 
+initialize_globals().
+
+=back
+
+An attempt to send a POST larger than $POST_MAX bytes will cause
+I<param()> to return an empty CGI parameter list.  You can test for
+this event by checking I<cgi_error()>, either after you create the CGI
+object or, if you are using the function-oriented interface, call
+<param()> for the first time.  If the POST was intercepted, then
+cgi_error() will return the message "413 POST too large".
+
+This error message is actually defined by the HTTP protocol, and is
+designed to be returned to the browser as the CGI script's status
+ code.  For example:
+
+   $uploaded_file = param('upload');
+   if (!$uploaded_file && cgi_error()) {
+      print header(-status=>cgi_error());
+      exit 0;
+   }
+
+However it isn't clear that any browser currently knows what to do
+with this status code.  It might be better just to create an
+HTML page that warns the user of the problem.
+
+=head1 COMPATIBILITY WITH CGI-LIB.PL
+
+To make it easier to port existing programs that use cgi-lib.pl the
+compatibility routine "ReadParse" is provided.  Porting is simple:
+
+OLD VERSION
+    require "cgi-lib.pl";
+    &ReadParse;
+    print "The value of the antique is $in{antique}.\n";
+
+NEW VERSION
+    use CGI;
+    CGI::ReadParse();
+    print "The value of the antique is $in{antique}.\n";
+
+CGI.pm's ReadParse() routine creates a tied variable named %in,
+which can be accessed to obtain the query variables.  Like
+ReadParse, you can also provide your own variable.  Infrequently
+used features of ReadParse, such as the creation of @in and $in 
+variables, are not supported.
+
+Once you use ReadParse, you can retrieve the query object itself
+this way:
+
+    $q = $in{CGI};
+    print textfield(-name=>'wow',
+			-value=>'does this really work?');
+
+This allows you to start using the more interesting features
+of CGI.pm without rewriting your old scripts from scratch.
+
+=head1 AUTHOR INFORMATION
+
+Copyright 1995-1998, Lincoln D. Stein.  All rights reserved.  
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Address bug reports and comments to: lstein@cshl.org.  When sending
+bug reports, please provide the version of CGI.pm, the version of
+Perl, the name and version of your Web server, and the name and
+version of the operating system you are using.  If the problem is even
+remotely browser dependent, please provide information about the
+affected browers as well.
+
+=head1 CREDITS
+
+Thanks very much to:
+
+=over 4
+
+=item Matt Heffron (heffron@falstaff.css.beckman.com)
+
+=item James Taylor (james.taylor@srs.gov)
+
+=item Scott Anguish <sanguish@digifix.com>
+
+=item Mike Jewell (mlj3u@virginia.edu)
+
+=item Timothy Shimmin (tes@kbs.citri.edu.au)
+
+=item Joergen Haegg (jh@axis.se)
+
+=item Laurent Delfosse (delfosse@delfosse.com)
+
+=item Richard Resnick (applepi1@aol.com)
+
+=item Craig Bishop (csb@barwonwater.vic.gov.au)
+
+=item Tony Curtis (tc@vcpc.univie.ac.at)
+
+=item Tim Bunce (Tim.Bunce@ig.co.uk)
+
+=item Tom Christiansen (tchrist@convex.com)
+
+=item Andreas Koenig (k@franz.ww.TU-Berlin.DE)
+
+=item Tim MacKenzie (Tim.MacKenzie@fulcrum.com.au)
+
+=item Kevin B. Hendricks (kbhend@dogwood.tyler.wm.edu)
+
+=item Stephen Dahmen (joyfire@inxpress.net)
+
+=item Ed Jordan (ed@fidalgo.net)
+
+=item David Alan Pisoni (david@cnation.com)
+
+=item Doug MacEachern (dougm@opengroup.org)
+
+=item Robin Houston (robin@oneworld.org)
+
+=item ...and many many more...
+
+for suggestions and bug fixes.
+
+=back
+
+=head1 A COMPLETE EXAMPLE OF A SIMPLE FORM-BASED SCRIPT
+
+
+	#!/usr/local/bin/perl
+
+	use CGI ':standard';
+
+	print header;
+	print start_html("Example CGI.pm Form");
+	print "<h1> Example CGI.pm Form</h1>\n";
+        print_prompt();
+	do_work();
+	print_tail();
+	print end_html;
+
+	sub print_prompt {
+	   print start_form;
+	   print "<em>What's your name?</em><br>";
+	   print textfield('name');
+	   print checkbox('Not my real name');
+
+	   print "<p><em>Where can you find English Sparrows?</em><br>";
+	   print checkbox_group(
+				 -name=>'Sparrow locations',
+				 -values=>[England,France,Spain,Asia,Hoboken],
+				 -linebreak=>'yes',
+				 -defaults=>[England,Asia]);
+
+	   print "<p><em>How far can they fly?</em><br>",
+		radio_group(
+			-name=>'how far',
+			-values=>['10 ft','1 mile','10 miles','real far'],
+			-default=>'1 mile');
+
+	   print "<p><em>What's your favorite color?</em>  ";
+	   print popup_menu(-name=>'Color',
+				    -values=>['black','brown','red','yellow'],
+				    -default=>'red');
+
+	   print hidden('Reference','Monty Python and the Holy Grail');
+
+	   print "<p><em>What have you got there?</em><br>";
+	   print scrolling_list(
+			 -name=>'possessions',
+			 -values=>['A Coconut','A Grail','An Icon',
+				   'A Sword','A Ticket'],
+			 -size=>5,
+			 -multiple=>'true');
+
+	   print "<p><em>Any parting comments?</em><br>";
+	   print textarea(-name=>'Comments',
+				  -rows=>10,
+				  -columns=>50);
+
+	   print "<p>",reset;
+	   print submit('Action','Shout');
+	   print submit('Action','Scream');
+	   print endform;
+	   print "<hr>\n";
+	}
+
+	sub do_work {
+	   my(@values,$key);
+
+	   print "<h2>Here are the current settings in this form</h2>";
+
+	   foreach $key (param) {
+	      print "<strong>$key</strong> -> ";
+	      @values = param($key);
+	      print join(", ",@values),"<br>\n";
+	  }
+	}
+
+	sub print_tail {
+	   print <<END;
+	<hr>
+	<address>Lincoln D. Stein</address><br>
+	<a href="/">Home Page</a>
+	END
+	}
+
+=head1 BUGS
+
+Please report them.
+
+=head1 SEE ALSO
+
+L<CGI::Carp>, L<CGI::Fast>, L<CGI::Pretty>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/Apache.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/Apache.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/Apache.pm	(revision 14489)
@@ -0,0 +1,26 @@
+use CGI;
+
+$VERSION = '1.00';
+
+1;
+__END__
+
+=head1 NAME
+
+CGI::Apache - Backward compatibility module for CGI.pm
+
+=head1 SYNOPSIS
+
+Do not use this module.  It is deprecated.
+
+=head1 ABSTRACT
+
+=head1 DESCRIPTION
+
+=head1 AUTHOR INFORMATION
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/Carp.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/Carp.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/Carp.pm	(revision 14489)
@@ -0,0 +1,527 @@
+package CGI::Carp;
+
+=head1 NAME
+
+B<CGI::Carp> - CGI routines for writing to the HTTPD (or other) error log
+
+=head1 SYNOPSIS
+
+    use CGI::Carp;
+
+    croak "We're outta here!";
+    confess "It was my fault: $!";
+    carp "It was your fault!";   
+    warn "I'm confused";
+    die  "I'm dying.\n";
+
+    use CGI::Carp qw(cluck);
+    cluck "I wouldn't do that if I were you";
+
+    use CGI::Carp qw(fatalsToBrowser);
+    die "Fatal error messages are now sent to browser";
+
+=head1 DESCRIPTION
+
+CGI scripts have a nasty habit of leaving warning messages in the error
+logs that are neither time stamped nor fully identified.  Tracking down
+the script that caused the error is a pain.  This fixes that.  Replace
+the usual
+
+    use Carp;
+
+with
+
+    use CGI::Carp
+
+And the standard warn(), die (), croak(), confess() and carp() calls
+will automagically be replaced with functions that write out nicely
+time-stamped messages to the HTTP server error log.
+
+For example:
+
+   [Fri Nov 17 21:40:43 1995] test.pl: I'm confused at test.pl line 3.
+   [Fri Nov 17 21:40:43 1995] test.pl: Got an error message: Permission denied.
+   [Fri Nov 17 21:40:43 1995] test.pl: I'm dying.
+
+=head1 REDIRECTING ERROR MESSAGES
+
+By default, error messages are sent to STDERR.  Most HTTPD servers
+direct STDERR to the server's error log.  Some applications may wish
+to keep private error logs, distinct from the server's error log, or
+they may wish to direct error messages to STDOUT so that the browser
+will receive them.
+
+The C<carpout()> function is provided for this purpose.  Since
+carpout() is not exported by default, you must import it explicitly by
+saying
+
+   use CGI::Carp qw(carpout);
+
+The carpout() function requires one argument, which should be a
+reference to an open filehandle for writing errors.  It should be
+called in a C<BEGIN> block at the top of the CGI application so that
+compiler errors will be caught.  Example:
+
+   BEGIN {
+     use CGI::Carp qw(carpout);
+     open(LOG, ">>/usr/local/cgi-logs/mycgi-log") or
+       die("Unable to open mycgi-log: $!\n");
+     carpout(LOG);
+   }
+
+carpout() does not handle file locking on the log for you at this point.
+
+The real STDERR is not closed -- it is moved to CGI::Carp::SAVEERR.  Some
+servers, when dealing with CGI scripts, close their connection to the
+browser when the script closes STDOUT and STDERR.  CGI::Carp::SAVEERR is there to
+prevent this from happening prematurely.
+
+You can pass filehandles to carpout() in a variety of ways.  The "correct"
+way according to Tom Christiansen is to pass a reference to a filehandle 
+GLOB:
+
+    carpout(\*LOG);
+
+This looks weird to mere mortals however, so the following syntaxes are
+accepted as well:
+
+    carpout(LOG);
+    carpout(main::LOG);
+    carpout(main'LOG);
+    carpout(\LOG);
+    carpout(\'main::LOG');
+
+    ... and so on
+
+FileHandle and other objects work as well.
+
+Use of carpout() is not great for performance, so it is recommended
+for debugging purposes or for moderate-use applications.  A future
+version of this module may delay redirecting STDERR until one of the
+CGI::Carp methods is called to prevent the performance hit.
+
+=head1 MAKING PERL ERRORS APPEAR IN THE BROWSER WINDOW
+
+If you want to send fatal (die, confess) errors to the browser, ask to 
+import the special "fatalsToBrowser" subroutine:
+
+    use CGI::Carp qw(fatalsToBrowser);
+    die "Bad error here";
+
+Fatal errors will now be echoed to the browser as well as to the log.  CGI::Carp
+arranges to send a minimal HTTP header to the browser so that even errors that
+occur in the early compile phase will be seen.
+Nonfatal errors will still be directed to the log file only (unless redirected
+with carpout).
+
+=head2 Changing the default message
+
+By default, the software error message is followed by a note to
+contact the Webmaster by e-mail with the time and date of the error.
+If this message is not to your liking, you can change it using the
+set_message() routine.  This is not imported by default; you should
+import it on the use() line:
+
+    use CGI::Carp qw(fatalsToBrowser set_message);
+    set_message("It's not a bug, it's a feature!");
+
+You may also pass in a code reference in order to create a custom
+error message.  At run time, your code will be called with the text
+of the error message that caused the script to die.  Example:
+
+    use CGI::Carp qw(fatalsToBrowser set_message);
+    BEGIN {
+       sub handle_errors {
+          my $msg = shift;
+          print "<h1>Oh gosh</h1>";
+          print "<p>Got an error: $msg</p>";
+      }
+      set_message(\&handle_errors);
+    }
+
+In order to correctly intercept compile-time errors, you should call
+set_message() from within a BEGIN{} block.
+
+=head1 MAKING WARNINGS APPEAR AS HTML COMMENTS
+
+It is now also possible to make non-fatal errors appear as HTML
+comments embedded in the output of your program.  To enable this
+feature, export the new "warningsToBrowser" subroutine.  Since sending
+warnings to the browser before the HTTP headers have been sent would
+cause an error, any warnings are stored in an internal buffer until
+you call the warningsToBrowser() subroutine with a true argument:
+
+    use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
+    use CGI qw(:standard);
+    print header();
+    warningsToBrowser(1);
+
+You may also give a false argument to warningsToBrowser() to prevent
+warnings from being sent to the browser while you are printing some
+content where HTML comments are not allowed:
+
+    warningsToBrowser(0);    # disable warnings
+    print "<script type=\"text/javascript\"><!--\n";
+    print_some_javascript_code();
+    print "//--></script>\n";
+    warningsToBrowser(1);    # re-enable warnings
+
+Note: In this respect warningsToBrowser() differs fundamentally from
+fatalsToBrowser(), which you should never call yourself!
+
+=head1 OVERRIDING THE NAME OF THE PROGRAM
+
+CGI::Carp includes the name of the program that generated the error or
+warning in the messages written to the log and the browser window.
+Sometimes, Perl can get confused about what the actual name of the
+executed program was.  In these cases, you can override the program
+name that CGI::Carp will use for all messages.
+
+The quick way to do that is to tell CGI::Carp the name of the program
+in its use statement.  You can do that by adding
+"name=cgi_carp_log_name" to your "use" statement.  For example:
+
+    use CGI::Carp qw(name=cgi_carp_log_name);
+
+.  If you want to change the program name partway through the program,
+you can use the C<set_progname()> function instead.  It is not
+exported by default, you must import it explicitly by saying
+
+    use CGI::Carp qw(set_progname);
+
+Once you've done that, you can change the logged name of the program
+at any time by calling
+
+    set_progname(new_program_name);
+
+You can set the program back to the default by calling
+
+    set_progname(undef);
+
+Note that this override doesn't happen until after the program has
+compiled, so any compile-time errors will still show up with the
+non-overridden program name
+  
+=head1 CHANGE LOG
+
+1.05 carpout() added and minor corrections by Marc Hedlund
+     <hedlund@best.com> on 11/26/95.
+
+1.06 fatalsToBrowser() no longer aborts for fatal errors within
+     eval() statements.
+
+1.08 set_message() added and carpout() expanded to allow for FileHandle
+     objects.
+
+1.09 set_message() now allows users to pass a code REFERENCE for 
+     really custom error messages.  croak and carp are now
+     exported by default.  Thanks to Gunther Birznieks for the
+     patches.
+
+1.10 Patch from Chris Dean (ctdean@cogit.com) to allow 
+     module to run correctly under mod_perl.
+
+1.11 Changed order of &gt; and &lt; escapes.
+
+1.12 Changed die() on line 217 to CORE::die to avoid B<-w> warning.
+
+1.13 Added cluck() to make the module orthogonal with Carp.
+     More mod_perl related fixes.
+
+1.20 Patch from Ilmari Karonen (perl@itz.pp.sci.fi):  Added
+     warningsToBrowser().  Replaced <CODE> tags with <PRE> in
+     fatalsToBrowser() output.
+
+1.23 ineval() now checks both $^S and inspects the message for the "eval" pattern
+     (hack alert!) in order to accomodate various combinations of Perl and
+     mod_perl.
+
+1.24 Patch from Scott Gifford (sgifford@suspectclass.com): Add support
+     for overriding program name.
+
+1.26 Replaced CORE::GLOBAL::die with the evil $SIG{__DIE__} because the
+     former isn't working in some people's hands.  There is no such thing
+     as reliable exception handling in Perl.
+
+1.27 Replaced tell STDOUT with bytes=tell STDOUT.
+
+=head1 AUTHORS
+
+Copyright 1995-2002, Lincoln D. Stein.  All rights reserved.  
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Address bug reports and comments to: lstein@cshl.org
+
+=head1 SEE ALSO
+
+Carp, CGI::Base, CGI::BasePlus, CGI::Request, CGI::MiniSvr, CGI::Form,
+CGI::Response
+    if (defined($CGI::Carp::PROGNAME)) 
+    {
+      $file = $CGI::Carp::PROGNAME;
+    }
+
+=cut
+
+require 5.000;
+use Exporter;
+#use Carp;
+BEGIN { 
+  require Carp; 
+  *CORE::GLOBAL::die = \&CGI::Carp::die;
+}
+
+use File::Spec;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(confess croak carp);
+@EXPORT_OK = qw(carpout fatalsToBrowser warningsToBrowser wrap set_message set_progname cluck ^name= die);
+
+$main::SIG{__WARN__}=\&CGI::Carp::warn;
+
+$CGI::Carp::VERSION    = '1.29';
+$CGI::Carp::CUSTOM_MSG = undef;
+
+
+# fancy import routine detects and handles 'errorWrap' specially.
+sub import {
+    my $pkg = shift;
+    my(%routines);
+    my(@name);
+  
+    if (@name=grep(/^name=/,@_))
+      {
+        my($n) = (split(/=/,$name[0]))[1];
+        set_progname($n);
+        @_=grep(!/^name=/,@_);
+      }
+
+    grep($routines{$_}++,@_,@EXPORT);
+    $WRAP++ if $routines{'fatalsToBrowser'} || $routines{'wrap'};
+    $WARN++ if $routines{'warningsToBrowser'};
+    my($oldlevel) = $Exporter::ExportLevel;
+    $Exporter::ExportLevel = 1;
+    Exporter::import($pkg,keys %routines);
+    $Exporter::ExportLevel = $oldlevel;
+    $main::SIG{__DIE__} =\&CGI::Carp::die if $routines{'fatalsToBrowser'};
+#    $pkg->export('CORE::GLOBAL','die');
+}
+
+# These are the originals
+sub realwarn { CORE::warn(@_); }
+sub realdie { CORE::die(@_); }
+
+sub id {
+    my $level = shift;
+    my($pack,$file,$line,$sub) = caller($level);
+    my($dev,$dirs,$id) = File::Spec->splitpath($file);
+    return ($file,$line,$id);
+}
+
+sub stamp {
+    my $time = scalar(localtime);
+    my $frame = 0;
+    my ($id,$pack,$file,$dev,$dirs);
+    if (defined($CGI::Carp::PROGNAME)) {
+        $id = $CGI::Carp::PROGNAME;
+    } else {
+        do {
+  	  $id = $file;
+	  ($pack,$file) = caller($frame++);
+        } until !$file;
+    }
+    ($dev,$dirs,$id) = File::Spec->splitpath($id);
+    return "[$time] $id: ";
+}
+
+sub set_progname {
+    $CGI::Carp::PROGNAME = shift;
+    return $CGI::Carp::PROGNAME;
+}
+
+
+sub warn {
+    my $message = shift;
+    my($file,$line,$id) = id(1);
+    $message .= " at $file line $line.\n" unless $message=~/\n$/;
+    _warn($message) if $WARN;
+    my $stamp = stamp;
+    $message=~s/^/$stamp/gm;
+    realwarn $message;
+}
+
+sub _warn {
+    my $msg = shift;
+    if ($EMIT_WARNINGS) {
+	# We need to mangle the message a bit to make it a valid HTML
+	# comment.  This is done by substituting similar-looking ISO
+	# 8859-1 characters for <, > and -.  This is a hack.
+	$msg =~ tr/<>-/\253\273\255/;
+	chomp $msg;
+	print STDOUT "<!-- warning: $msg -->\n";
+    } else {
+	push @WARNINGS, $msg;
+    }
+}
+
+
+# The mod_perl package Apache::Registry loads CGI programs by calling
+# eval.  These evals don't count when looking at the stack backtrace.
+sub _longmess {
+    my $message = Carp::longmess();
+    $message =~ s,eval[^\n]+(ModPerl|Apache)/(?:Registry|Dispatch)\w*\.pm.*,,s
+        if exists $ENV{MOD_PERL};
+    return $message;
+}
+
+sub ineval {
+  (exists $ENV{MOD_PERL} ? 0 : $^S) || _longmess() =~ /eval [\{\']/m
+}
+
+sub die {
+  my ($arg,@rest) = @_;
+  realdie ($arg,@rest) if ineval();
+
+  if (!ref($arg)) {
+    $arg = join("", ($arg,@rest));
+    my($file,$line,$id) = id(1);
+    $arg .= " at $file line $line." unless $arg=~/\n$/;
+    &fatalsToBrowser($arg) if $WRAP;
+    if (($arg =~ /\n$/) || !exists($ENV{MOD_PERL})) {
+      my $stamp = stamp;
+      $arg=~s/^/$stamp/gm;
+    }
+    if ($arg !~ /\n$/) {
+      $arg .= "\n";
+    }
+  }
+  realdie $arg;
+}
+
+sub set_message {
+    $CGI::Carp::CUSTOM_MSG = shift;
+    return $CGI::Carp::CUSTOM_MSG;
+}
+
+sub confess { CGI::Carp::die Carp::longmess @_; }
+sub croak   { CGI::Carp::die Carp::shortmess @_; }
+sub carp    { CGI::Carp::warn Carp::shortmess @_; }
+sub cluck   { CGI::Carp::warn Carp::longmess @_; }
+
+# We have to be ready to accept a filehandle as a reference
+# or a string.
+sub carpout {
+    my($in) = @_;
+    my($no) = fileno(to_filehandle($in));
+    realdie("Invalid filehandle $in\n") unless defined $no;
+    
+    open(SAVEERR, ">&STDERR");
+    open(STDERR, ">&$no") or 
+	( print SAVEERR "Unable to redirect STDERR: $!\n" and exit(1) );
+}
+
+sub warningsToBrowser {
+    $EMIT_WARNINGS = @_ ? shift : 1;
+    _warn(shift @WARNINGS) while $EMIT_WARNINGS and @WARNINGS;
+}
+
+# headers
+sub fatalsToBrowser {
+  my($msg) = @_;
+  $msg=~s/&/&amp;/g;
+  $msg=~s/>/&gt;/g;
+  $msg=~s/</&lt;/g;
+  $msg=~s/\"/&quot;/g;
+  my($wm) = $ENV{SERVER_ADMIN} ? 
+    qq[the webmaster (<a href="mailto:$ENV{SERVER_ADMIN}">$ENV{SERVER_ADMIN}</a>)] :
+      "this site's webmaster";
+  my ($outer_message) = <<END;
+For help, please send mail to $wm, giving this error message 
+and the time and date of the error.
+END
+  ;
+  my $mod_perl = exists $ENV{MOD_PERL};
+
+  if ($CUSTOM_MSG) {
+    if (ref($CUSTOM_MSG) eq 'CODE') {
+      print STDOUT "Content-type: text/html\n\n" 
+        unless $mod_perl;
+      &$CUSTOM_MSG($msg); # nicer to perl 5.003 users
+      return;
+    } else {
+      $outer_message = $CUSTOM_MSG;
+    }
+  }
+
+  my $mess = <<END;
+<h1>Software error:</h1>
+<pre>$msg</pre>
+<p>
+$outer_message
+</p>
+END
+  ;
+
+  if ($mod_perl) {
+    my $r;
+    if ($ENV{MOD_PERL_API_VERSION} && $ENV{MOD_PERL_API_VERSION} == 2) {
+      $mod_perl = 2;
+      require Apache2::RequestRec;
+      require Apache2::RequestIO;
+      require Apache2::RequestUtil;
+      require APR::Pool;
+      require ModPerl::Util;
+      require Apache2::Response;
+      $r = Apache2::RequestUtil->request;
+    }
+    else {
+      $r = Apache->request;
+    }
+    # If bytes have already been sent, then
+    # we print the message out directly.
+    # Otherwise we make a custom error
+    # handler to produce the doc for us.
+    if ($r->bytes_sent) {
+      $r->print($mess);
+      $mod_perl == 2 ? ModPerl::Util::exit(0) : $r->exit;
+    } else {
+      # MSIE won't display a custom 500 response unless it is >512 bytes!
+      if ($ENV{HTTP_USER_AGENT} =~ /MSIE/) {
+        $mess = "<!-- " . (' ' x 513) . " -->\n$mess";
+      }
+      $r->custom_response(500,$mess);
+    }
+  } else {
+    my $bytes_written = eval{tell STDOUT};
+    if (defined $bytes_written && $bytes_written > 0) {
+        print STDOUT $mess;
+    }
+    else {
+        print STDOUT "Content-type: text/html\n\n";
+        print STDOUT $mess;
+    }
+  }
+
+  warningsToBrowser(1);    # emit warnings before dying
+}
+
+# Cut and paste from CGI.pm so that we don't have the overhead of
+# always loading the entire CGI module.
+sub to_filehandle {
+    my $thingy = shift;
+    return undef unless $thingy;
+    return $thingy if UNIVERSAL::isa($thingy,'GLOB');
+    return $thingy if UNIVERSAL::isa($thingy,'FileHandle');
+    if (!ref($thingy)) {
+	my $caller = 1;
+	while (my $package = caller($caller++)) {
+	    my($tmp) = $thingy=~/[\':]/ ? $thingy : "$package\:\:$thingy"; 
+	    return $tmp if defined(fileno($tmp));
+	}
+    }
+    return undef;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/Cookie.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/Cookie.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/Cookie.pm	(revision 14489)
@@ -0,0 +1,478 @@
+package CGI::Cookie;
+
+# See the bottom of this file for the POD documentation.  Search for the
+# string '=head'.
+
+# You can run this file through either pod2man or pod2html to produce pretty
+# documentation in manual or html file format (these utilities are part of the
+# Perl 5 distribution).
+
+# Copyright 1995-1999, Lincoln D. Stein.  All rights reserved.
+# It may be used and modified freely, but I do request that this copyright
+# notice remain attached to the file.  You may modify this module as you 
+# wish, but if you redistribute a modified version, please attach a note
+# listing the modifications you have made.
+
+$CGI::Cookie::VERSION='1.26';
+
+use CGI::Util qw(rearrange unescape escape);
+use overload '""' => \&as_string,
+    'cmp' => \&compare,
+    'fallback'=>1;
+
+# Turn on special checking for Doug MacEachern's modperl
+my $MOD_PERL = 0;
+if (exists $ENV{MOD_PERL}) {
+  if (exists $ENV{MOD_PERL_API_VERSION} && $ENV{MOD_PERL_API_VERSION} == 2) {
+      $MOD_PERL = 2;
+      require Apache2::RequestUtil;
+      require APR::Table;
+  } else {
+    $MOD_PERL = 1;
+    require Apache;
+  }
+}
+
+# fetch a list of cookies from the environment and
+# return as a hash.  the cookies are parsed as normal
+# escaped URL data.
+sub fetch {
+    my $class = shift;
+    my $raw_cookie = get_raw_cookie(@_) or return;
+    return $class->parse($raw_cookie);
+}
+
+# Fetch a list of cookies from the environment or the incoming headers and
+# return as a hash. The cookie values are not unescaped or altered in any way.
+ sub raw_fetch {
+   my $class = shift;
+   my $raw_cookie = get_raw_cookie(@_) or return;
+   my %results;
+   my($key,$value);
+   
+   my(@pairs) = split("; ?",$raw_cookie);
+   foreach (@pairs) {
+     s/\s*(.*?)\s*/$1/;
+     if (/^([^=]+)=(.*)/) {
+       $key = $1;
+       $value = $2;
+     }
+     else {
+       $key = $_;
+       $value = '';
+     }
+     $results{$key} = $value;
+   }
+   return \%results unless wantarray;
+   return %results;
+}
+
+sub get_raw_cookie {
+  my $r = shift;
+  $r ||= eval { $MOD_PERL == 2                    ? 
+                  Apache2::RequestUtil->request() :
+                  Apache->request } if $MOD_PERL;
+  if ($r) {
+    $raw_cookie = $r->headers_in->{'Cookie'};
+  } else {
+    if ($MOD_PERL && !exists $ENV{REQUEST_METHOD}) {
+      die "Run $r->subprocess_env; before calling fetch()";
+    }
+    $raw_cookie = $ENV{HTTP_COOKIE} || $ENV{COOKIE};
+  }
+}
+
+
+sub parse {
+  my ($self,$raw_cookie) = @_;
+  my %results;
+
+  my(@pairs) = split("; ?",$raw_cookie);
+  foreach (@pairs) {
+    s/\s*(.*?)\s*/$1/;
+    my($key,$value) = split("=",$_,2);
+
+    # Some foreign cookies are not in name=value format, so ignore
+    # them.
+    next if !defined($value);
+    my @values = ();
+    if ($value ne '') {
+      @values = map unescape($_),split(/[&;]/,$value.'&dmy');
+      pop @values;
+    }
+    $key = unescape($key);
+    # A bug in Netscape can cause several cookies with same name to
+    # appear.  The FIRST one in HTTP_COOKIE is the most recent version.
+    $results{$key} ||= $self->new(-name=>$key,-value=>\@values);
+  }
+  return \%results unless wantarray;
+  return %results;
+}
+
+sub new {
+  my $class = shift;
+  $class = ref($class) if ref($class);
+  my($name,$value,$path,$domain,$secure,$expires) =
+    rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES],@_);
+  
+  # Pull out our parameters.
+  my @values;
+  if (ref($value)) {
+    if (ref($value) eq 'ARRAY') {
+      @values = @$value;
+    } elsif (ref($value) eq 'HASH') {
+      @values = %$value;
+    }
+  } else {
+    @values = ($value);
+  }
+  
+  bless my $self = {
+		    'name'=>$name,
+		    'value'=>[@values],
+		   },$class;
+
+  # IE requires the path and domain to be present for some reason.
+  $path   ||= "/";
+  # however, this breaks networks which use host tables without fully qualified
+  # names, so we comment it out.
+  #    $domain = CGI::virtual_host()    unless defined $domain;
+
+  $self->path($path)     if defined $path;
+  $self->domain($domain) if defined $domain;
+  $self->secure($secure) if defined $secure;
+  $self->expires($expires) if defined $expires;
+#  $self->max_age($expires) if defined $expires;
+  return $self;
+}
+
+sub as_string {
+    my $self = shift;
+    return "" unless $self->name;
+
+    my(@constant_values,$domain,$path,$expires,$max_age,$secure);
+
+    push(@constant_values,"domain=$domain")   if $domain = $self->domain;
+    push(@constant_values,"path=$path")       if $path = $self->path;
+    push(@constant_values,"expires=$expires") if $expires = $self->expires;
+    push(@constant_values,"max-age=$max_age") if $max_age = $self->max_age;
+    push(@constant_values,"secure") if $secure = $self->secure;
+
+    my($key) = escape($self->name);
+    my($cookie) = join("=",($key||''),join("&",map escape($_||''),$self->value));
+    return join("; ",$cookie,@constant_values);
+}
+
+sub compare {
+    my $self = shift;
+    my $value = shift;
+    return "$self" cmp $value;
+}
+
+# accessors
+sub name {
+    my $self = shift;
+    my $name = shift;
+    $self->{'name'} = $name if defined $name;
+    return $self->{'name'};
+}
+
+sub value {
+    my $self = shift;
+    my $value = shift;
+      if (defined $value) {
+              my @values;
+        if (ref($value)) {
+            if (ref($value) eq 'ARRAY') {
+                @values = @$value;
+            } elsif (ref($value) eq 'HASH') {
+                @values = %$value;
+            }
+        } else {
+            @values = ($value);
+        }
+      $self->{'value'} = [@values];
+      }
+    return wantarray ? @{$self->{'value'}} : $self->{'value'}->[0]
+}
+
+sub domain {
+    my $self = shift;
+    my $domain = shift;
+    $self->{'domain'} = lc $domain if defined $domain;
+    return $self->{'domain'};
+}
+
+sub secure {
+    my $self = shift;
+    my $secure = shift;
+    $self->{'secure'} = $secure if defined $secure;
+    return $self->{'secure'};
+}
+
+sub expires {
+    my $self = shift;
+    my $expires = shift;
+    $self->{'expires'} = CGI::Util::expires($expires,'cookie') if defined $expires;
+    return $self->{'expires'};
+}
+
+sub max_age {
+  my $self = shift;
+  my $expires = shift;
+  $self->{'max-age'} = CGI::Util::expire_calc($expires)-time() if defined $expires;
+  return $self->{'max-age'};
+}
+
+sub path {
+    my $self = shift;
+    my $path = shift;
+    $self->{'path'} = $path if defined $path;
+    return $self->{'path'};
+}
+
+1;
+
+=head1 NAME
+
+CGI::Cookie - Interface to Netscape Cookies
+
+=head1 SYNOPSIS
+
+    use CGI qw/:standard/;
+    use CGI::Cookie;
+
+    # Create new cookies and send them
+    $cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456);
+    $cookie2 = new CGI::Cookie(-name=>'preferences',
+                               -value=>{ font => Helvetica,
+                                         size => 12 } 
+                               );
+    print header(-cookie=>[$cookie1,$cookie2]);
+
+    # fetch existing cookies
+    %cookies = fetch CGI::Cookie;
+    $id = $cookies{'ID'}->value;
+
+    # create cookies returned from an external source
+    %cookies = parse CGI::Cookie($ENV{COOKIE});
+
+=head1 DESCRIPTION
+
+CGI::Cookie is an interface to Netscape (HTTP/1.1) cookies, an
+innovation that allows Web servers to store persistent information on
+the browser's side of the connection.  Although CGI::Cookie is
+intended to be used in conjunction with CGI.pm (and is in fact used by
+it internally), you can use this module independently.
+
+For full information on cookies see 
+
+	http://www.ics.uci.edu/pub/ietf/http/rfc2109.txt
+
+=head1 USING CGI::Cookie
+
+CGI::Cookie is object oriented.  Each cookie object has a name and a
+value.  The name is any scalar value.  The value is any scalar or
+array value (associative arrays are also allowed).  Cookies also have
+several optional attributes, including:
+
+=over 4
+
+=item B<1. expiration date>
+
+The expiration date tells the browser how long to hang on to the
+cookie.  If the cookie specifies an expiration date in the future, the
+browser will store the cookie information in a disk file and return it
+to the server every time the user reconnects (until the expiration
+date is reached).  If the cookie species an expiration date in the
+past, the browser will remove the cookie from the disk file.  If the
+expiration date is not specified, the cookie will persist only until
+the user quits the browser.
+
+=item B<2. domain>
+
+This is a partial or complete domain name for which the cookie is 
+valid.  The browser will return the cookie to any host that matches
+the partial domain name.  For example, if you specify a domain name
+of ".capricorn.com", then Netscape will return the cookie to
+Web servers running on any of the machines "www.capricorn.com", 
+"ftp.capricorn.com", "feckless.capricorn.com", etc.  Domain names
+must contain at least two periods to prevent attempts to match
+on top level domains like ".edu".  If no domain is specified, then
+the browser will only return the cookie to servers on the host the
+cookie originated from.
+
+=item B<3. path>
+
+If you provide a cookie path attribute, the browser will check it
+against your script's URL before returning the cookie.  For example,
+if you specify the path "/cgi-bin", then the cookie will be returned
+to each of the scripts "/cgi-bin/tally.pl", "/cgi-bin/order.pl", and
+"/cgi-bin/customer_service/complain.pl", but not to the script
+"/cgi-private/site_admin.pl".  By default, the path is set to "/", so
+that all scripts at your site will receive the cookie.
+
+=item B<4. secure flag>
+
+If the "secure" attribute is set, the cookie will only be sent to your
+script if the CGI request is occurring on a secure channel, such as SSL.
+
+=back
+
+=head2 Creating New Cookies
+
+	$c = new CGI::Cookie(-name    =>  'foo',
+                             -value   =>  'bar',
+                             -expires =>  '+3M',
+                             -domain  =>  '.capricorn.com',
+                             -path    =>  '/cgi-bin/database',
+                             -secure  =>  1
+	                    );
+
+Create cookies from scratch with the B<new> method.  The B<-name> and
+B<-value> parameters are required.  The name must be a scalar value.
+The value can be a scalar, an array reference, or a hash reference.
+(At some point in the future cookies will support one of the Perl
+object serialization protocols for full generality).
+
+B<-expires> accepts any of the relative or absolute date formats
+recognized by CGI.pm, for example "+3M" for three months in the
+future.  See CGI.pm's documentation for details.
+
+B<-domain> points to a domain name or to a fully qualified host name.
+If not specified, the cookie will be returned only to the Web server
+that created it.
+
+B<-path> points to a partial URL on the current server.  The cookie
+will be returned to all URLs beginning with the specified path.  If
+not specified, it defaults to '/', which returns the cookie to all
+pages at your site.
+
+B<-secure> if set to a true value instructs the browser to return the
+cookie only when a cryptographic protocol is in use.
+
+=head2 Sending the Cookie to the Browser
+
+Within a CGI script you can send a cookie to the browser by creating
+one or more Set-Cookie: fields in the HTTP header.  Here is a typical
+sequence:
+
+  my $c = new CGI::Cookie(-name    =>  'foo',
+                          -value   =>  ['bar','baz'],
+                          -expires =>  '+3M');
+
+  print "Set-Cookie: $c\n";
+  print "Content-Type: text/html\n\n";
+
+To send more than one cookie, create several Set-Cookie: fields.
+
+If you are using CGI.pm, you send cookies by providing a -cookie
+argument to the header() method:
+
+  print header(-cookie=>$c);
+
+Mod_perl users can set cookies using the request object's header_out()
+method:
+
+  $r->headers_out->set('Set-Cookie' => $c);
+
+Internally, Cookie overloads the "" operator to call its as_string()
+method when incorporated into the HTTP header.  as_string() turns the
+Cookie's internal representation into an RFC-compliant text
+representation.  You may call as_string() yourself if you prefer:
+
+  print "Set-Cookie: ",$c->as_string,"\n";
+
+=head2 Recovering Previous Cookies
+
+	%cookies = fetch CGI::Cookie;
+
+B<fetch> returns an associative array consisting of all cookies
+returned by the browser.  The keys of the array are the cookie names.  You
+can iterate through the cookies this way:
+
+	%cookies = fetch CGI::Cookie;
+	foreach (keys %cookies) {
+	   do_something($cookies{$_});
+        }
+
+In a scalar context, fetch() returns a hash reference, which may be more
+efficient if you are manipulating multiple cookies.
+
+CGI.pm uses the URL escaping methods to save and restore reserved characters
+in its cookies.  If you are trying to retrieve a cookie set by a foreign server,
+this escaping method may trip you up.  Use raw_fetch() instead, which has the
+same semantics as fetch(), but performs no unescaping.
+
+You may also retrieve cookies that were stored in some external
+form using the parse() class method:
+
+       $COOKIES = `cat /usr/tmp/Cookie_stash`;
+       %cookies = parse CGI::Cookie($COOKIES);
+
+If you are in a mod_perl environment, you can save some overhead by
+passing the request object to fetch() like this:
+
+   CGI::Cookie->fetch($r);
+
+=head2 Manipulating Cookies
+
+Cookie objects have a series of accessor methods to get and set cookie
+attributes.  Each accessor has a similar syntax.  Called without
+arguments, the accessor returns the current value of the attribute.
+Called with an argument, the accessor changes the attribute and
+returns its new value.
+
+=over 4
+
+=item B<name()>
+
+Get or set the cookie's name.  Example:
+
+	$name = $c->name;
+	$new_name = $c->name('fred');
+
+=item B<value()>
+
+Get or set the cookie's value.  Example:
+
+	$value = $c->value;
+	@new_value = $c->value(['a','b','c','d']);
+
+B<value()> is context sensitive.  In a list context it will return
+the current value of the cookie as an array.  In a scalar context it
+will return the B<first> value of a multivalued cookie.
+
+=item B<domain()>
+
+Get or set the cookie's domain.
+
+=item B<path()>
+
+Get or set the cookie's path.
+
+=item B<expires()>
+
+Get or set the cookie's expiration time.
+
+=back
+
+
+=head1 AUTHOR INFORMATION
+
+Copyright 1997-1998, Lincoln D. Stein.  All rights reserved.  
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Address bug reports and comments to: lstein@cshl.org
+
+=head1 BUGS
+
+This section intentionally left blank.
+
+=head1 SEE ALSO
+
+L<CGI::Carp>, L<CGI>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/Fast.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/Fast.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/Fast.pm	(revision 14489)
@@ -0,0 +1,230 @@
+package CGI::Fast;
+
+# See the bottom of this file for the POD documentation.  Search for the
+# string '=head'.
+
+# You can run this file through either pod2man or pod2html to produce pretty
+# documentation in manual or html file format (these utilities are part of the
+# Perl 5 distribution).
+
+# Copyright 1995,1996, Lincoln D. Stein.  All rights reserved.
+# It may be used and modified freely, but I do request that this copyright
+# notice remain attached to the file.  You may modify this module as you 
+# wish, but if you redistribute a modified version, please attach a note
+# listing the modifications you have made.
+
+# The most recent version and complete docs are available at:
+#   http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html
+#   ftp://ftp-genome.wi.mit.edu/pub/software/WWW/
+$CGI::Fast::VERSION='1.05';
+
+use CGI;
+use FCGI;
+@ISA = ('CGI');
+
+# workaround for known bug in libfcgi
+while (($ignore) = each %ENV) { }
+
+# override the initialization behavior so that
+# state is NOT maintained between invocations 
+sub save_request {
+    # no-op
+}
+
+# If ENV{FCGI_SOCKET_PATH} is specified, we maintain a FCGI Request handle
+# in this package variable.
+use vars qw($Ext_Request);
+BEGIN {
+   # If ENV{FCGI_SOCKET_PATH} is given, explicitly open the socket,
+   # and keep the request handle around from which to call Accept().
+   if ($ENV{FCGI_SOCKET_PATH}) {
+	my $path    = $ENV{FCGI_SOCKET_PATH};
+	my $backlog = $ENV{FCGI_LISTEN_QUEUE} || 100;
+	my $socket  = FCGI::OpenSocket( $path, $backlog );
+	$Ext_Request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, 
+					\%ENV, $socket, 1 );
+   }
+}
+
+# New is slightly different in that it calls FCGI's
+# accept() method.
+sub new {
+     my ($self, $initializer, @param) = @_;
+     unless (defined $initializer) {
+	if ($Ext_Request) {
+          return undef unless $Ext_Request->Accept() >= 0;
+	} else {
+         return undef unless FCGI::accept() >= 0;
+     }
+     }
+     return $CGI::Q = $self->SUPER::new($initializer, @param);
+}
+
+1;
+
+=head1 NAME
+
+CGI::Fast - CGI Interface for Fast CGI
+
+=head1 SYNOPSIS
+
+    use CGI::Fast qw(:standard);
+    $COUNTER = 0;
+    while (new CGI::Fast) {
+	print header;
+	print start_html("Fast CGI Rocks");
+	print
+	    h1("Fast CGI Rocks"),
+	    "Invocation number ",b($COUNTER++),
+            " PID ",b($$),".",
+	    hr;
+        print end_html;
+    }
+
+=head1 DESCRIPTION
+
+CGI::Fast is a subclass of the CGI object created by
+CGI.pm.  It is specialized to work well with the Open Market
+FastCGI standard, which greatly speeds up CGI scripts by
+turning them into persistently running server processes.  Scripts
+that perform time-consuming initialization processes, such as
+loading large modules or opening persistent database connections,
+will see large performance improvements.
+
+=head1 OTHER PIECES OF THE PUZZLE
+
+In order to use CGI::Fast you'll need a FastCGI-enabled Web
+server.  Open Market's server is FastCGI-savvy.  There are also
+freely redistributable FastCGI modules for NCSA httpd 1.5 and Apache.
+FastCGI-enabling modules for Microsoft Internet Information Server and
+Netscape Communications Server have been announced.
+
+In addition, you'll need a version of the Perl interpreter that has
+been linked with the FastCGI I/O library.  Precompiled binaries are
+available for several platforms, including DEC Alpha, HP-UX and 
+SPARC/Solaris, or you can rebuild Perl from source with patches
+provided in the FastCGI developer's kit.  The FastCGI Perl interpreter
+can be used in place of your normal Perl without ill consequences.
+
+You can find FastCGI modules for Apache and NCSA httpd, precompiled
+Perl interpreters, and the FastCGI developer's kit all at URL:
+
+  http://www.fastcgi.com/
+
+=head1 WRITING FASTCGI PERL SCRIPTS
+
+FastCGI scripts are persistent: one or more copies of the script 
+are started up when the server initializes, and stay around until
+the server exits or they die a natural death.  After performing
+whatever one-time initialization it needs, the script enters a 
+loop waiting for incoming connections, processing the request, and
+waiting some more.
+
+A typical FastCGI script will look like this:
+
+    #!/usr/local/bin/perl    # must be a FastCGI version of perl!
+    use CGI::Fast;
+    &do_some_initialization();
+    while ($q = new CGI::Fast) {
+	&process_request($q);
+    }
+
+Each time there's a new request, CGI::Fast returns a
+CGI object to your loop.  The rest of the time your script
+waits in the call to new().  When the server requests that
+your script be terminated, new() will return undef.  You can
+of course exit earlier if you choose.  A new version of the
+script will be respawned to take its place (this may be
+necessary in order to avoid Perl memory leaks in long-running
+scripts).
+
+CGI.pm's default CGI object mode also works.  Just modify the loop
+this way:
+
+    while (new CGI::Fast) {
+	&process_request;
+    }
+
+Calls to header(), start_form(), etc. will all operate on the
+current request.
+
+=head1 INSTALLING FASTCGI SCRIPTS
+
+See the FastCGI developer's kit documentation for full details.  On
+the Apache server, the following line must be added to srm.conf:
+
+    AddType application/x-httpd-fcgi .fcgi
+
+FastCGI scripts must end in the extension .fcgi.  For each script you
+install, you must add something like the following to srm.conf:
+
+    FastCgiServer /usr/etc/httpd/fcgi-bin/file_upload.fcgi -processes 2
+
+This instructs Apache to launch two copies of file_upload.fcgi at 
+startup time.
+
+=head1 USING FASTCGI SCRIPTS AS CGI SCRIPTS
+
+Any script that works correctly as a FastCGI script will also work
+correctly when installed as a vanilla CGI script.  However it will
+not see any performance benefit.
+
+=head1 EXTERNAL FASTCGI SERVER INVOCATION
+
+FastCGI supports a TCP/IP transport mechanism which allows FastCGI scripts to run
+external to the webserver, perhaps on a remote machine.  To configure the
+webserver to connect to an external FastCGI server, you would add the following
+to your srm.conf:
+
+    FastCgiExternalServer /usr/etc/httpd/fcgi-bin/file_upload.fcgi -host sputnik:8888
+
+Two environment variables affect how the C<CGI::Fast> object is created,
+allowing C<CGI::Fast> to be used as an external FastCGI server.  (See C<FCGI>
+documentation for C<FCGI::OpenSocket> for more information.)
+
+=over
+
+=item FCGI_SOCKET_PATH
+
+The address (TCP/IP) or path (UNIX Domain) of the socket the external FastCGI
+script to which bind an listen for incoming connections from the web server.
+
+=item FCGI_LISTEN_QUEUE
+
+Maximum length of the queue of pending connections.  
+
+=back
+
+For example:
+
+    #!/usr/local/bin/perl    # must be a FastCGI version of perl!
+    use CGI::Fast;
+    &do_some_initialization();
+    $ENV{FCGI_SOCKET_PATH} = "sputnik:8888";
+    $ENV{FCGI_LISTEN_QUEUE} = 100;
+    while ($q = new CGI::Fast) {
+	&process_request($q);
+    }
+
+=head1 CAVEATS
+
+I haven't tested this very much.
+
+=head1 AUTHOR INFORMATION
+
+Copyright 1996-1998, Lincoln D. Stein.  All rights reserved.  
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Address bug reports and comments to: lstein@cshl.org
+
+=head1 BUGS
+
+This section intentionally left blank.
+
+=head1 SEE ALSO
+
+L<CGI::Carp>, L<CGI>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/Pretty.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/Pretty.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/Pretty.pm	(revision 14489)
@@ -0,0 +1,276 @@
+package CGI::Pretty;
+
+# See the bottom of this file for the POD documentation.  Search for the
+# string '=head'.
+
+# You can run this file through either pod2man or pod2html to produce pretty
+# documentation in manual or html file format (these utilities are part of the
+# Perl 5 distribution).
+
+use strict;
+use CGI ();
+
+$CGI::Pretty::VERSION = '1.08';
+$CGI::DefaultClass = __PACKAGE__;
+$CGI::Pretty::AutoloadClass = 'CGI';
+@CGI::Pretty::ISA = qw( CGI );
+
+initialize_globals();
+
+sub _prettyPrint {
+    my $input = shift;
+    return if !$$input;
+    return if !$CGI::Pretty::LINEBREAK || !$CGI::Pretty::INDENT;
+
+#    print STDERR "'", $$input, "'\n";
+
+    foreach my $i ( @CGI::Pretty::AS_IS ) {
+	if ( $$input =~ m{</$i>}si ) {
+	    my ( $a, $b, $c ) = $$input =~ m{(.*)(<$i[\s/>].*?</$i>)(.*)}si;
+	    next if !$b;
+	    $a ||= "";
+	    $c ||= "";
+
+	    _prettyPrint( \$a ) if $a;
+	    _prettyPrint( \$c ) if $c;
+	    
+	    $b ||= "";
+	    $$input = "$a$b$c";
+	    return;
+	}
+    }
+    $$input =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g;
+}
+
+sub comment {
+    my($self,@p) = CGI::self_or_CGI(@_);
+
+    my $s = "@p";
+    $s =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g if $CGI::Pretty::LINEBREAK; 
+    
+    return $self->SUPER::comment( "$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT$s$CGI::Pretty::LINEBREAK" ) . $CGI::Pretty::LINEBREAK;
+}
+
+sub _make_tag_func {
+    my ($self,$tagname) = @_;
+
+    # As Lincoln as noted, the last else clause is VERY hairy, and it
+    # took me a while to figure out what I was trying to do.
+    # What it does is look for tags that shouldn't be indented (e.g. PRE)
+    # and makes sure that when we nest tags, those tags don't get
+    # indented.
+    # For an example, try print td( pre( "hello\nworld" ) );
+    # If we didn't care about stuff like that, the code would be
+    # MUCH simpler.  BTW: I won't claim to be a regular expression
+    # guru, so if anybody wants to contribute something that would
+    # be quicker, easier to read, etc, I would be more than
+    # willing to put it in - Brian
+
+    my $func = qq"
+	sub $tagname {";
+
+    $func .= q'
+            shift if $_[0] && 
+                    (ref($_[0]) &&
+                     (substr(ref($_[0]),0,3) eq "CGI" ||
+                    UNIVERSAL::isa($_[0],"CGI")));
+	    my($attr) = "";
+	    if (ref($_[0]) && ref($_[0]) eq "HASH") {
+		my(@attr) = make_attributes(shift()||undef,1);
+		$attr = " @attr" if @attr;
+	    }';
+
+    if ($tagname=~/start_(\w+)/i) {
+	$func .= qq! 
+            return "<\L$1\E\$attr>\$CGI::Pretty::LINEBREAK";} !;
+    } elsif ($tagname=~/end_(\w+)/i) {
+	$func .= qq! 
+            return "<\L/$1\E>\$CGI::Pretty::LINEBREAK"; } !;
+    } else {
+	$func .= qq#
+	    return ( \$CGI::XHTML ? "<\L$tagname\E\$attr />" : "<\L$tagname\E\$attr>" ) .
+                   \$CGI::Pretty::LINEBREAK unless \@_;
+	    my(\$tag,\$untag) = ("<\L$tagname\E\$attr>","</\L$tagname>\E");
+
+            my \%ASIS = map { lc("\$_") => 1 } \@CGI::Pretty::AS_IS;
+            my \@args;
+            if ( \$CGI::Pretty::LINEBREAK || \$CGI::Pretty::INDENT ) {
+   	      if(ref(\$_[0]) eq 'ARRAY') {
+                 \@args = \@{\$_[0]}
+              } else {
+                  foreach (\@_) {
+		      \$args[0] .= \$_;
+                      \$args[0] .= \$CGI::Pretty::LINEBREAK if \$args[0] !~ /\$CGI::Pretty::LINEBREAK\$/ && 0;
+                      chomp \$args[0] if exists \$ASIS{ "\L$tagname\E" };
+                      
+  	              \$args[0] .= \$" if \$args[0] !~ /\$CGI::Pretty::LINEBREAK\$/ && 1;
+		  }
+                  chop \$args[0];
+	      }
+            }
+            else {
+              \@args = ref(\$_[0]) eq 'ARRAY' ? \@{\$_[0]} : "\@_";
+            }
+
+            my \@result;
+            if ( exists \$ASIS{ "\L$tagname\E" } ) {
+		\@result = map { "\$tag\$_\$untag\$CGI::Pretty::LINEBREAK" } 
+		 \@args;
+	    }
+	    else {
+		\@result = map { 
+		    chomp; 
+		    my \$tmp = \$_;
+		    CGI::Pretty::_prettyPrint( \\\$tmp );
+                    \$tag . \$CGI::Pretty::LINEBREAK .
+                    \$CGI::Pretty::INDENT . \$tmp . \$CGI::Pretty::LINEBREAK . 
+                    \$untag . \$CGI::Pretty::LINEBREAK
+                } \@args;
+	    }
+	    local \$" = "" if \$CGI::Pretty::LINEBREAK || \$CGI::Pretty::INDENT;
+	    return "\@result";
+	}#;
+    }    
+
+    return $func;
+}
+
+sub start_html {
+    return CGI::start_html( @_ ) . $CGI::Pretty::LINEBREAK;
+}
+
+sub end_html {
+    return CGI::end_html( @_ ) . $CGI::Pretty::LINEBREAK;
+}
+
+sub new {
+    my $class = shift;
+    my $this = $class->SUPER::new( @_ );
+
+    if ($CGI::MOD_PERL) {
+        if ($CGI::MOD_PERL == 1) {
+            my $r = Apache->request;
+            $r->register_cleanup(\&CGI::Pretty::_reset_globals);
+        }
+        else {
+            my $r = Apache2::RequestUtil->request;
+            $r->pool->cleanup_register(\&CGI::Pretty::_reset_globals);
+        }
+    }
+    $class->_reset_globals if $CGI::PERLEX;
+
+    return bless $this, $class;
+}
+
+sub initialize_globals {
+    # This is the string used for indentation of tags
+    $CGI::Pretty::INDENT = "\t";
+    
+    # This is the string used for seperation between tags
+    $CGI::Pretty::LINEBREAK = $/;
+
+    # These tags are not prettify'd.
+    @CGI::Pretty::AS_IS = qw( a pre code script textarea td );
+
+    1;
+}
+sub _reset_globals { initialize_globals(); }
+
+1;
+
+=head1 NAME
+
+CGI::Pretty - module to produce nicely formatted HTML code
+
+=head1 SYNOPSIS
+
+    use CGI::Pretty qw( :html3 );
+
+    # Print a table with a single data element
+    print table( TR( td( "foo" ) ) );
+
+=head1 DESCRIPTION
+
+CGI::Pretty is a module that derives from CGI.  It's sole function is to
+allow users of CGI to output nicely formatted HTML code.
+
+When using the CGI module, the following code:
+    print table( TR( td( "foo" ) ) );
+
+produces the following output:
+    <TABLE><TR><TD>foo</TD></TR></TABLE>
+
+If a user were to create a table consisting of many rows and many columns,
+the resultant HTML code would be quite difficult to read since it has no
+carriage returns or indentation.
+
+CGI::Pretty fixes this problem.  What it does is add a carriage
+return and indentation to the HTML code so that one can easily read
+it.
+
+    print table( TR( td( "foo" ) ) );
+
+now produces the following output:
+    <TABLE>
+       <TR>
+          <TD>
+             foo
+          </TD>
+       </TR>
+    </TABLE>
+
+
+=head2 Tags that won't be formatted
+
+The <A> and <PRE> tags are not formatted.  If these tags were formatted, the
+user would see the extra indentation on the web browser causing the page to
+look different than what would be expected.  If you wish to add more tags to
+the list of tags that are not to be touched, push them onto the C<@AS_IS> array:
+
+    push @CGI::Pretty::AS_IS,qw(CODE XMP);
+
+=head2 Customizing the Indenting
+
+If you wish to have your own personal style of indenting, you can change the
+C<$INDENT> variable:
+
+    $CGI::Pretty::INDENT = "\t\t";
+
+would cause the indents to be two tabs.
+
+Similarly, if you wish to have more space between lines, you may change the
+C<$LINEBREAK> variable:
+
+    $CGI::Pretty::LINEBREAK = "\n\n";
+
+would create two carriage returns between lines.
+
+If you decide you want to use the regular CGI indenting, you can easily do 
+the following:
+
+    $CGI::Pretty::INDENT = $CGI::Pretty::LINEBREAK = "";
+
+=head1 BUGS
+
+This section intentionally left blank.
+
+=head1 AUTHOR
+
+Brian Paulsen <Brian@ThePaulsens.com>, with minor modifications by
+Lincoln Stein <lstein@cshl.org> for incorporation into the CGI.pm
+distribution.
+
+Copyright 1999, Brian Paulsen.  All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Bug reports and comments to Brian@ThePaulsens.com.  You can also write
+to lstein@cshl.org, but this code looks pretty hairy to me and I'm not
+sure I understand it!
+
+=head1 SEE ALSO
+
+L<CGI>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/Push.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/Push.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/Push.pm	(revision 14489)
@@ -0,0 +1,325 @@
+package CGI::Push;
+
+# See the bottom of this file for the POD documentation.  Search for the
+# string '=head'.
+
+# You can run this file through either pod2man or pod2html to produce pretty
+# documentation in manual or html file format (these utilities are part of the
+# Perl 5 distribution).
+
+# Copyright 1995-2000, Lincoln D. Stein.  All rights reserved.
+# It may be used and modified freely, but I do request that this copyright
+# notice remain attached to the file.  You may modify this module as you 
+# wish, but if you redistribute a modified version, please attach a note
+# listing the modifications you have made.
+
+# The most recent version and complete docs are available at:
+#   http://stein.cshl.org/WWW/software/CGI/
+
+$CGI::Push::VERSION='1.04';
+use CGI;
+use CGI::Util 'rearrange';
+@ISA = ('CGI');
+
+$CGI::DefaultClass = 'CGI::Push';
+$CGI::Push::AutoloadClass = 'CGI';
+
+# add do_push() and push_delay() to exported tags
+push(@{$CGI::EXPORT_TAGS{':standard'}},'do_push','push_delay');
+
+sub do_push {
+    my ($self,@p) = CGI::self_or_default(@_);
+
+    # unbuffer output
+    $| = 1;
+    srand;
+    my ($random) = sprintf("%08.0f",rand()*1E8);
+    my ($boundary) = "----=_NeXtPaRt$random";
+
+    my (@header);
+    my ($type,$callback,$delay,$last_page,$cookie,$target,$expires,$nph,@other) = rearrange([TYPE,NEXT_PAGE,DELAY,LAST_PAGE,[COOKIE,COOKIES],TARGET,EXPIRES,NPH],@p);
+    $type = 'text/html' unless $type;
+    $callback = \&simple_counter unless $callback && ref($callback) eq 'CODE';
+    $delay = 1 unless defined($delay);
+    $self->push_delay($delay);
+    $nph = 1 unless defined($nph);
+
+    my(@o);
+    foreach (@other) { push(@o,split("=")); }
+    push(@o,'-Target'=>$target) if defined($target);
+    push(@o,'-Cookie'=>$cookie) if defined($cookie);
+    push(@o,'-Type'=>"multipart/x-mixed-replace;boundary=\"$boundary\"");
+    push(@o,'-Server'=>"CGI.pm Push Module") if $nph;
+    push(@o,'-Status'=>'200 OK');
+    push(@o,'-nph'=>1) if $nph;
+    print $self->header(@o);
+
+    $boundary = "$CGI::CRLF--$boundary";
+
+    print "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY.${boundary}$CGI::CRLF";
+
+    my (@contents) = &$callback($self,++$COUNTER);
+
+    # now we enter a little loop
+    while (1) {
+        print "Content-type: ${type}$CGI::CRLF$CGI::CRLF" unless $type =~ /^dynamic|heterogeneous$/i;
+        print @contents;
+        @contents = &$callback($self,++$COUNTER);
+        if ((@contents) && defined($contents[0])) {
+            print "${boundary}$CGI::CRLF";
+            do_sleep($self->push_delay()) if $self->push_delay();
+        } else {
+            if ($last_page && ref($last_page) eq 'CODE') {
+                print "${boundary}$CGI::CRLF";
+                do_sleep($self->push_delay()) if $self->push_delay();
+                print "Content-type: ${type}$CGI::CRLF$CGI::CRLF" unless $type =~ /^dynamic|heterogeneous$/i;
+                print  &$last_page($self,$COUNTER);
+            }
+            print "${boundary}--$CGI::CRLF";
+            last;
+        }
+    }
+    print "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY.$CGI::CRLF";
+}
+
+sub simple_counter {
+    my ($self,$count) = @_;
+    return $self->start_html("CGI::Push Default Counter"),
+           $self->h1("CGI::Push Default Counter"),
+           "This page has been updated ",$self->strong($count)," times.",
+           $self->hr(),
+           $self->a({'-href'=>'http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html'},'CGI.pm home page'),
+           $self->end_html;
+}
+
+sub do_sleep {
+    my $delay = shift;
+    if ( ($delay >= 1) && ($delay!~/\./) ){
+        sleep($delay);
+    } else {
+        select(undef,undef,undef,$delay);
+    }
+}
+
+sub push_delay {
+    my ($self,$delay) = CGI::self_or_default(@_);
+    return defined($delay) ? $self->{'.delay'} = 
+        $delay : $self->{'.delay'};
+}
+
+1;
+
+=head1 NAME
+
+CGI::Push - Simple Interface to Server Push
+
+=head1 SYNOPSIS
+
+    use CGI::Push qw(:standard);
+
+    do_push(-next_page=>\&next_page,
+            -last_page=>\&last_page,
+            -delay=>0.5);
+
+    sub next_page {
+        my($q,$counter) = @_;
+        return undef if $counter >= 10;
+        return start_html('Test'),
+               h1('Visible'),"\n",
+               "This page has been called ", strong($counter)," times",
+               end_html();
+    }
+
+    sub last_page {
+        my($q,$counter) = @_;
+        return start_html('Done'),
+               h1('Finished'),
+               strong($counter - 1),' iterations.',
+               end_html;
+    }
+
+=head1 DESCRIPTION
+
+CGI::Push is a subclass of the CGI object created by CGI.pm.  It is
+specialized for server push operations, which allow you to create
+animated pages whose content changes at regular intervals.
+
+You provide CGI::Push with a pointer to a subroutine that will draw
+one page.  Every time your subroutine is called, it generates a new
+page.  The contents of the page will be transmitted to the browser
+in such a way that it will replace what was there beforehand.  The
+technique will work with HTML pages as well as with graphics files, 
+allowing you to create animated GIFs.
+
+Only Netscape Navigator supports server push.  Internet Explorer
+browsers do not.
+
+=head1 USING CGI::Push
+
+CGI::Push adds one new method to the standard CGI suite, do_push().
+When you call this method, you pass it a reference to a subroutine
+that is responsible for drawing each new page, an interval delay, and
+an optional subroutine for drawing the last page.  Other optional
+parameters include most of those recognized by the CGI header()
+method.
+
+You may call do_push() in the object oriented manner or not, as you
+prefer:
+
+    use CGI::Push;
+    $q = new CGI::Push;
+    $q->do_push(-next_page=>\&draw_a_page);
+
+        -or-
+
+    use CGI::Push qw(:standard);
+    do_push(-next_page=>\&draw_a_page);
+
+Parameters are as follows:
+
+=over 4
+
+=item -next_page
+
+    do_push(-next_page=>\&my_draw_routine);
+
+This required parameter points to a reference to a subroutine responsible for
+drawing each new page.  The subroutine should expect two parameters
+consisting of the CGI object and a counter indicating the number
+of times the subroutine has been called.  It should return the
+contents of the page as an B<array> of one or more items to print.  
+It can return a false value (or an empty array) in order to abort the
+redrawing loop and print out the final page (if any)
+
+    sub my_draw_routine {
+        my($q,$counter) = @_;
+        return undef if $counter > 100;
+        return start_html('testing'),
+               h1('testing'),
+               "This page called $counter times";
+    }
+
+You are of course free to refer to create and use global variables
+within your draw routine in order to achieve special effects.
+
+=item -last_page
+
+This optional parameter points to a reference to the subroutine
+responsible for drawing the last page of the series.  It is called
+after the -next_page routine returns a false value.  The subroutine
+itself should have exactly the same calling conventions as the
+-next_page routine.
+
+=item -type
+
+This optional parameter indicates the content type of each page.  It
+defaults to "text/html".  Normally the module assumes that each page
+is of a homogenous MIME type.  However if you provide either of the
+magic values "heterogeneous" or "dynamic" (the latter provided for the
+convenience of those who hate long parameter names), you can specify
+the MIME type -- and other header fields -- on a per-page basis.  See 
+"heterogeneous pages" for more details.
+
+=item -delay
+
+This indicates the delay, in seconds, between frames.  Smaller delays
+refresh the page faster.  Fractional values are allowed.
+
+B<If not specified, -delay will default to 1 second>
+
+=item -cookie, -target, -expires, -nph
+
+These have the same meaning as the like-named parameters in
+CGI::header().
+
+If not specified, -nph will default to 1 (as needed for many servers, see below).
+
+=back
+
+=head2 Heterogeneous Pages
+
+Ordinarily all pages displayed by CGI::Push share a common MIME type.
+However by providing a value of "heterogeneous" or "dynamic" in the
+do_push() -type parameter, you can specify the MIME type of each page
+on a case-by-case basis.  
+
+If you use this option, you will be responsible for producing the
+HTTP header for each page.  Simply modify your draw routine to
+look like this:
+
+    sub my_draw_routine {
+        my($q,$counter) = @_;
+        return header('text/html'),   # note we're producing the header here
+               start_html('testing'),
+               h1('testing'),
+               "This page called $counter times";
+    }
+
+You can add any header fields that you like, but some (cookies and
+status fields included) may not be interpreted by the browser.  One
+interesting effect is to display a series of pages, then, after the
+last page, to redirect the browser to a new URL.  Because redirect() 
+does b<not> work, the easiest way is with a -refresh header field,
+as shown below:
+
+    sub my_draw_routine {
+        my($q,$counter) = @_;
+        return undef if $counter > 10;
+        return header('text/html'),   # note we're producing the header here
+               start_html('testing'),
+               h1('testing'),
+               "This page called $counter times";
+    }
+
+    sub my_last_page {
+        return header(-refresh=>'5; URL=http://somewhere.else/finished.html',
+                      -type=>'text/html'),
+               start_html('Moved'),
+               h1('This is the last page'),
+               'Goodbye!'
+               hr,
+               end_html; 
+    }
+
+=head2 Changing the Page Delay on the Fly
+
+If you would like to control the delay between pages on a page-by-page
+basis, call push_delay() from within your draw routine.  push_delay()
+takes a single numeric argument representing the number of seconds you
+wish to delay after the current page is displayed and before
+displaying the next one.  The delay may be fractional.  Without
+parameters, push_delay() just returns the current delay.
+
+=head1 INSTALLING CGI::Push SCRIPTS
+
+Server push scripts must be installed as no-parsed-header (NPH)
+scripts in order to work correctly on many servers.  On Unix systems,
+this is most often accomplished by prefixing the script's name with "nph-".  
+Recognition of NPH scripts happens automatically with WebSTAR and 
+Microsoft IIS.  Users of other servers should see their documentation
+for help.
+
+Apache web server from version 1.3b2 on does not need server
+push scripts installed as NPH scripts: the -nph parameter to do_push()
+may be set to a false value to disable the extra headers needed by an
+NPH script.
+
+=head1 AUTHOR INFORMATION
+
+Copyright 1995-1998, Lincoln D. Stein.  All rights reserved.  
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Address bug reports and comments to: lstein@cshl.org
+
+=head1 BUGS
+
+This section intentionally left blank.
+
+=head1 SEE ALSO
+
+L<CGI::Carp>, L<CGI>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/Switch.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/Switch.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/Switch.pm	(revision 14489)
@@ -0,0 +1,27 @@
+use CGI;
+
+$VERSION = '1.00';
+
+1;
+
+__END__
+
+=head1 NAME
+
+CGI::Switch - Backward compatibility module for defunct CGI::Switch
+
+=head1 SYNOPSIS
+
+Do not use this module.  It is deprecated.
+
+=head1 ABSTRACT
+
+=head1 DESCRIPTION
+
+=head1 AUTHOR INFORMATION
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/Util.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/Util.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/Util.pm	(revision 14489)
@@ -0,0 +1,318 @@
+package CGI::Util;
+
+use strict;
+use vars qw($VERSION @EXPORT_OK @ISA $EBCDIC @A2E @E2A);
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(rearrange make_attributes unescape escape 
+		expires ebcdic2ascii ascii2ebcdic);
+
+$VERSION = '1.5';
+
+$EBCDIC = "\t" ne "\011";
+# (ord('^') == 95) for codepage 1047 as on os390, vmesa
+@A2E = (
+   0,  1,  2,  3, 55, 45, 46, 47, 22,  5, 21, 11, 12, 13, 14, 15,
+  16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31,
+  64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97,
+ 240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111,
+ 124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214,
+ 215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109,
+ 121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150,
+ 151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161,  7,
+  32, 33, 34, 35, 36, 37,  6, 23, 40, 41, 42, 43, 44,  9, 10, 27,
+  48, 49, 26, 51, 52, 53, 54,  8, 56, 57, 58, 59,  4, 20, 62,255,
+  65,170, 74,177,159,178,106,181,187,180,154,138,176,202,175,188,
+ 144,143,234,250,190,160,182,179,157,218,155,139,183,184,185,171,
+ 100,101, 98,102, 99,103,158,104,116,113,114,115,120,117,118,119,
+ 172,105,237,238,235,239,236,191,128,253,254,251,252,186,174, 89,
+  68, 69, 66, 70, 67, 71,156, 72, 84, 81, 82, 83, 88, 85, 86, 87,
+ 140, 73,205,206,203,207,204,225,112,221,222,219,220,141,142,223
+	 );
+@E2A = (
+   0,  1,  2,  3,156,  9,134,127,151,141,142, 11, 12, 13, 14, 15,
+  16, 17, 18, 19,157, 10,  8,135, 24, 25,146,143, 28, 29, 30, 31,
+ 128,129,130,131,132,133, 23, 27,136,137,138,139,140,  5,  6,  7,
+ 144,145, 22,147,148,149,150,  4,152,153,154,155, 20, 21,158, 26,
+  32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124,
+  38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94,
+  45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63,
+ 248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34,
+ 216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177,
+ 176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164,
+ 181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174,
+ 172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215,
+ 123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245,
+ 125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255,
+  92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213,
+  48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159
+	 );
+
+if ($EBCDIC && ord('^') == 106) { # as in the BS2000 posix-bc coded character set
+     $A2E[91] = 187;   $A2E[92] = 188;  $A2E[94] = 106;  $A2E[96] = 74;
+     $A2E[123] = 251;  $A2E[125] = 253; $A2E[126] = 255; $A2E[159] = 95;
+     $A2E[162] = 176;  $A2E[166] = 208; $A2E[168] = 121; $A2E[172] = 186;
+     $A2E[175] = 161;  $A2E[217] = 224; $A2E[219] = 221; $A2E[221] = 173;
+     $A2E[249] = 192;
+
+     $E2A[74] = 96;   $E2A[95] = 159;  $E2A[106] = 94;  $E2A[121] = 168;
+     $E2A[161] = 175; $E2A[173] = 221; $E2A[176] = 162; $E2A[186] = 172;
+     $E2A[187] = 91;  $E2A[188] = 92;  $E2A[192] = 249; $E2A[208] = 166;
+     $E2A[221] = 219; $E2A[224] = 217; $E2A[251] = 123; $E2A[253] = 125;
+     $E2A[255] = 126;
+   }
+elsif ($EBCDIC && ord('^') == 176) { # as in codepage 037 on os400
+  $A2E[10] = 37;  $A2E[91] = 186;  $A2E[93] = 187; $A2E[94] = 176;
+  $A2E[133] = 21; $A2E[168] = 189; $A2E[172] = 95; $A2E[221] = 173;
+
+  $E2A[21] = 133; $E2A[37] = 10;  $E2A[95] = 172; $E2A[173] = 221;
+  $E2A[176] = 94; $E2A[186] = 91; $E2A[187] = 93; $E2A[189] = 168;
+}
+
+# Smart rearrangement of parameters to allow named parameter
+# calling.  We do the rearangement if:
+# the first parameter begins with a -
+sub rearrange {
+    my($order,@param) = @_;
+    return () unless @param;
+
+    if (ref($param[0]) eq 'HASH') {
+	@param = %{$param[0]};
+    } else {
+	return @param 
+	    unless (defined($param[0]) && substr($param[0],0,1) eq '-');
+    }
+
+    # map parameters into positional indices
+    my ($i,%pos);
+    $i = 0;
+    foreach (@$order) {
+	foreach (ref($_) eq 'ARRAY' ? @$_ : $_) { $pos{lc($_)} = $i; }
+	$i++;
+    }
+
+    my (@result,%leftover);
+    $#result = $#$order;  # preextend
+    while (@param) {
+	my $key = lc(shift(@param));
+	$key =~ s/^\-//;
+	if (exists $pos{$key}) {
+	    $result[$pos{$key}] = shift(@param);
+	} else {
+	    $leftover{$key} = shift(@param);
+	}
+    }
+
+    push (@result,make_attributes(\%leftover,defined $CGI::Q ? $CGI::Q->{escape} : 1)) if %leftover;
+    @result;
+}
+
+sub make_attributes {
+    my $attr = shift;
+    return () unless $attr && ref($attr) && ref($attr) eq 'HASH';
+    my $escape =  shift || 0;
+    my(@att);
+    foreach (keys %{$attr}) {
+	my($key) = $_;
+	$key=~s/^\-//;     # get rid of initial - if present
+
+	# old way: breaks EBCDIC!
+	# $key=~tr/A-Z_/a-z-/; # parameters are lower case, use dashes
+
+	($key="\L$key") =~ tr/_/-/; # parameters are lower case, use dashes
+
+	my $value = $escape ? simple_escape($attr->{$_}) : $attr->{$_};
+	push(@att,defined($attr->{$_}) ? qq/$key="$value"/ : qq/$key/);
+    }
+    return @att;
+}
+
+sub simple_escape {
+  return unless defined(my $toencode = shift);
+  $toencode =~ s{&}{&amp;}gso;
+  $toencode =~ s{<}{&lt;}gso;
+  $toencode =~ s{>}{&gt;}gso;
+  $toencode =~ s{\"}{&quot;}gso;
+# Doesn't work.  Can't work.  forget it.
+#  $toencode =~ s{\x8b}{&#139;}gso;
+#  $toencode =~ s{\x9b}{&#155;}gso;
+  $toencode;
+}
+
+sub utf8_chr {
+        my $c = shift(@_);
+	return chr($c) if $] >= 5.006;
+
+        if ($c < 0x80) {
+                return sprintf("%c", $c);
+        } elsif ($c < 0x800) {
+                return sprintf("%c%c", 0xc0 | ($c >> 6), 0x80 | ($c & 0x3f));
+        } elsif ($c < 0x10000) {
+                return sprintf("%c%c%c",
+                                           0xe0 |  ($c >> 12),
+                                           0x80 | (($c >>  6) & 0x3f),
+                                           0x80 | ( $c          & 0x3f));
+        } elsif ($c < 0x200000) {
+                return sprintf("%c%c%c%c",
+                                           0xf0 |  ($c >> 18),
+                                           0x80 | (($c >> 12) & 0x3f),
+                                           0x80 | (($c >>  6) & 0x3f),
+                                           0x80 | ( $c          & 0x3f));
+        } elsif ($c < 0x4000000) {
+                return sprintf("%c%c%c%c%c",
+                                           0xf8 |  ($c >> 24),
+                                           0x80 | (($c >> 18) & 0x3f),
+                                           0x80 | (($c >> 12) & 0x3f),
+                                           0x80 | (($c >>  6) & 0x3f),
+                                           0x80 | ( $c          & 0x3f));
+
+        } elsif ($c < 0x80000000) {
+                return sprintf("%c%c%c%c%c%c",
+                                           0xfc |  ($c >> 30),
+                                           0x80 | (($c >> 24) & 0x3f),
+                                           0x80 | (($c >> 18) & 0x3f),
+                                           0x80 | (($c >> 12) & 0x3f),
+                                           0x80 | (($c >> 6)  & 0x3f),
+                                           0x80 | ( $c          & 0x3f));
+        } else {
+                return utf8_chr(0xfffd);
+        }
+}
+
+# unescape URL-encoded data
+sub unescape {
+  shift() if @_ > 0 and (ref($_[0]) || (defined $_[1] && $_[0] eq $CGI::DefaultClass));
+  my $todecode = shift;
+  return undef unless defined($todecode);
+  $todecode =~ tr/+/ /;       # pluses become spaces
+    $EBCDIC = "\t" ne "\011";
+    if ($EBCDIC) {
+      $todecode =~ s/%([0-9a-fA-F]{2})/chr $A2E[hex($1)]/ge;
+    } else {
+      $todecode =~ s/%(?:([0-9a-fA-F]{2})|u([0-9a-fA-F]{4}))/
+	defined($1)? chr hex($1) : utf8_chr(hex($2))/ge;
+    }
+  return $todecode;
+}
+
+# URL-encode data
+sub escape {
+  shift() if @_ > 1 and ( ref($_[0]) || (defined $_[1] && $_[0] eq $CGI::DefaultClass));
+  my $toencode = shift;
+  return undef unless defined($toencode);
+  # force bytes while preserving backward compatibility -- dankogai
+  $toencode = pack("C*", unpack("C*", $toencode));
+    if ($EBCDIC) {
+      $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",$E2A[ord($1)])/eg;
+    } else {
+      $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
+    }
+  return $toencode;
+}
+
+# This internal routine creates date strings suitable for use in
+# cookies and HTTP headers.  (They differ, unfortunately.)
+# Thanks to Mark Fisher for this.
+sub expires {
+    my($time,$format) = @_;
+    $format ||= 'http';
+
+    my(@MON)=qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/;
+    my(@WDAY) = qw/Sun Mon Tue Wed Thu Fri Sat/;
+
+    # pass through preformatted dates for the sake of expire_calc()
+    $time = expire_calc($time);
+    return $time unless $time =~ /^\d+$/;
+
+    # make HTTP/cookie date string from GMT'ed time
+    # (cookies use '-' as date separator, HTTP uses ' ')
+    my($sc) = ' ';
+    $sc = '-' if $format eq "cookie";
+    my($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime($time);
+    $year += 1900;
+    return sprintf("%s, %02d$sc%s$sc%04d %02d:%02d:%02d GMT",
+                   $WDAY[$wday],$mday,$MON[$mon],$year,$hour,$min,$sec);
+}
+
+# This internal routine creates an expires time exactly some number of
+# hours from the current time.  It incorporates modifications from 
+# Mark Fisher.
+sub expire_calc {
+    my($time) = @_;
+    my(%mult) = ('s'=>1,
+                 'm'=>60,
+                 'h'=>60*60,
+                 'd'=>60*60*24,
+                 'M'=>60*60*24*30,
+                 'y'=>60*60*24*365);
+    # format for time can be in any of the forms...
+    # "now" -- expire immediately
+    # "+180s" -- in 180 seconds
+    # "+2m" -- in 2 minutes
+    # "+12h" -- in 12 hours
+    # "+1d"  -- in 1 day
+    # "+3M"  -- in 3 months
+    # "+2y"  -- in 2 years
+    # "-3m"  -- 3 minutes ago(!)
+    # If you don't supply one of these forms, we assume you are
+    # specifying the date yourself
+    my($offset);
+    if (!$time || (lc($time) eq 'now')) {
+        $offset = 0;
+    } elsif ($time=~/^\d+/) {
+        return $time;
+    } elsif ($time=~/^([+-]?(?:\d+|\d*\.\d*))([mhdMy]?)/) {
+        $offset = ($mult{$2} || 1)*$1;
+    } else {
+        return $time;
+    }
+    return (time+$offset);
+}
+
+sub ebcdic2ascii {
+  my $data = shift;
+  $data =~ s/(.)/chr $E2A[ord($1)]/ge;
+  $data;
+}
+
+sub ascii2ebcdic {
+  my $data = shift;
+  $data =~ s/(.)/chr $A2E[ord($1)]/ge;
+  $data;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+CGI::Util - Internal utilities used by CGI module
+
+=head1 SYNOPSIS
+
+none
+
+=head1 DESCRIPTION
+
+no public subroutines
+
+=head1 AUTHOR INFORMATION
+
+Copyright 1995-1998, Lincoln D. Stein.  All rights reserved.  
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Address bug reports and comments to: lstein@cshl.org.  When sending
+bug reports, please provide the version of CGI.pm, the version of
+Perl, the name and version of your Web server, and the name and
+version of the operating system you are using.  If the problem is even
+remotely browser dependent, please provide information about the
+affected browers as well.
+
+=head1 SEE ALSO
+
+L<CGI>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/RunMeFirst
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/RunMeFirst	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/RunMeFirst	(revision 14489)
@@ -0,0 +1,36 @@
+#!/usr/local/bin/perl
+
+# Make a world-writeable directory for saving state.
+$ww = 'WORLD_WRITABLE';
+unless (-w $ww) {
+    $u = umask 0;
+    mkdir $ww, 0777;
+    umask $u;
+}
+
+# Decode the sample image.
+for $uu (<*.uu>) {
+    unless (open UU, "<$uu") { warn "Can't open $uu: $!\n"; next }
+    while (<UU>) {
+        chomp;
+	if (/^begin\s+\d+\s+(.+)$/) {
+	    $bin = $1;
+	    last;
+	}
+    }
+    unless (open BIN, "> $bin") { warn "Can't create $bin: $!\n"; next }
+    binmode BIN;
+    while (<UU>) {
+	chomp;
+	last if /^end/;
+	print BIN unpack "u", $_;
+    }
+    close BIN;
+    close UU;
+}
+
+# Create symlinks from *.txt to *.cgi for documentation purposes.
+foreach (<*.cgi>) {
+    ($target = $_) =~ s/cgi$/txt/i;
+    symlink $_, $target unless -e $target;
+}
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/caution.xbm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/caution.xbm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/caution.xbm	(revision 14489)
@@ -0,0 +1,12 @@
+#define caution_width 32
+#define caution_height 32
+static char caution_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x10,0x01,
+ 0x00,0x00,0x08,0x07,0x00,0x00,0x08,0x0e,0x00,0x00,0x04,0x0e,0x00,0x00,0x04,
+ 0x1c,0x00,0x00,0x02,0x1c,0x00,0x00,0xe2,0x38,0x00,0x00,0xf1,0x39,0x00,0x00,
+ 0xf1,0x71,0x00,0x80,0xf0,0x71,0x00,0x80,0xf0,0xe1,0x00,0x40,0xf0,0xe1,0x00,
+ 0x40,0xf0,0xc1,0x01,0x20,0xf0,0xc1,0x01,0x20,0xf0,0x81,0x03,0x10,0xe0,0x80,
+ 0x03,0x10,0xe0,0x00,0x07,0x08,0xe0,0x00,0x07,0x08,0xe0,0x00,0x0e,0x04,0x00,
+ 0x00,0x0e,0x04,0xe0,0x00,0x1c,0x02,0xf0,0x01,0x1c,0x02,0xf0,0x01,0x38,0x01,
+ 0xe0,0x00,0x38,0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x70,0xff,0xff,0xff,0x7f,
+ 0xf8,0xff,0xff,0x3f,0x00,0x00,0x00,0x00};
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/clickable_image.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/clickable_image.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/clickable_image.cgi	(revision 14489)
@@ -0,0 +1,26 @@
+#!/usr/local/bin/perl
+
+use CGI;
+$query = new CGI;
+print $query->header;
+print $query->start_html("A Clickable Image");
+print <<END;
+<H1>A Clickable Image</H1>
+</A>
+END
+print "Sorry, this isn't very exciting!\n";
+
+print $query->startform;
+print $query->image_button('picture',"./wilogo.gif");
+print "Give me a: ",$query->popup_menu('letter',['A','B','C','D','E','W']),"\n"; # 
+print "<P>Magnification: ",$query->radio_group('magnification',['1X','2X','4X','20X']),"\n";
+print "<HR>\n";
+
+if ($query->param) {
+    print "<P>Magnification, <EM>",$query->param('magnification'),"</EM>\n";
+    print "<P>Selected Letter, <EM>",$query->param('letter'),"</EM>\n";
+    ($x,$y) = ($query->param('picture.x'),$query->param('picture.y'));
+    print "<P>Selected Position <EM>($x,$y)</EM>\n";
+}
+
+print $query->end_html;
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/cookie.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/cookie.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/cookie.cgi	(revision 14489)
@@ -0,0 +1,88 @@
+#!/usr/local/bin/perl
+
+use CGI qw(:standard);
+
+@ANIMALS=sort qw/lion tiger bear pig porcupine ferret zebra gnu ostrich
+    emu moa goat weasel yak chicken sheep hyena dodo lounge-lizard
+    squirrel rat mouse hedgehog racoon baboon kangaroo hippopotamus
+    giraffe/;
+
+# Recover the previous animals from the magic cookie.
+# The cookie has been formatted as an associative array
+# mapping animal name to the number of animals.
+%zoo = cookie('animals');
+
+# Recover the new animal(s) from the parameter 'new_animal'
+@new = param('new_animals');
+
+# If the action is 'add', then add new animals to the zoo.  Otherwise
+# delete them.
+foreach (@new) {
+    if (param('action') eq 'Add') {
+	$zoo{$_}++;
+    } elsif (param('action') eq 'Delete') {
+	$zoo{$_}-- if $zoo{$_};
+	delete $zoo{$_} unless $zoo{$_};
+    }
+}
+
+# Add new animals to old, and put them in a cookie
+$the_cookie = cookie(-name=>'animals',
+		     -value=>\%zoo,
+		     -expires=>'+1h');
+
+# Print the header, incorporating the cookie and the expiration date...
+print header(-cookie=>$the_cookie);
+
+# Now we're ready to create our HTML page.
+print start_html('Animal crackers');
+
+print <<EOF;
+<h1>Animal Crackers</h1>
+Choose the animals you want to add to the zoo, and click "add".
+Come back to this page any time within the next hour and the list of 
+animals in the zoo will be resurrected.  You can even quit Netscape
+completely!
+<p>
+Try adding the same animal several times to the list.  Does this
+remind you vaguely of a shopping cart?
+<p>
+<em>This script only works with Netscape browsers</em>
+<p>
+<center>
+<table border>
+<tr><th>Add/Delete<th>Current Contents
+EOF
+    ;
+
+print "<tr><td>",start_form;
+print scrolling_list(-name=>'new_animals',
+		     -values=>[@ANIMALS],
+		     -multiple=>1,
+		     -override=>1,
+		     -size=>10),"<br>";
+print submit(-name=>'action',-value=>'Delete'),
+    submit(-name=>'action',-value=>'Add');
+print end_form;
+
+print "<td>";
+if (%zoo) {			# make a table
+    print "<ul>\n";
+    foreach (sort keys %zoo) {
+	print "<li>$zoo{$_} $_\n";
+    }
+    print "</ul>\n";
+} else {
+    print "<strong>The zoo is empty.</strong>\n";
+}
+print "</table></center>";
+
+print <<EOF;
+<hr>
+<ADDRESS>Lincoln D. Stein</ADDRESS><BR>
+<A HREF="./">More Examples</A>
+EOF
+    ;
+print end_html;
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/crash.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/crash.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/crash.cgi	(revision 14489)
@@ -0,0 +1,6 @@
+#!/usr/local/bin/perl
+
+use CGI::Carp qw(fatalsToBrowser);
+
+# This line invokes a fatal error message at compile time.
+foo bar baz;
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/customize.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/customize.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/customize.cgi	(revision 14489)
@@ -0,0 +1,92 @@
+#!/usr/local/bin/perl
+
+use CGI qw(:standard :html3);
+
+# Some constants to use in our form.
+@colors=qw/aqua black blue fuschia gray green lime maroon navy olive
+    purple red silver teal white yellow/;
+@sizes=("<default>",1..7);
+
+# recover the "preferences" cookie.
+%preferences = cookie('preferences');
+
+# If the user wants to change the background color or her
+# name, they will appear among our CGI parameters.
+foreach ('text','background','name','size') {
+    $preferences{$_} = param($_) || $preferences{$_};
+}
+
+# Set some defaults
+$preferences{'background'} = $preferences{'background'} || 'silver';
+$preferences{'text'} = $preferences{'text'} || 'black';
+
+# Refresh the cookie so that it doesn't expire.  This also
+# makes any changes the user made permanent.
+$the_cookie = cookie(-name=>'preferences',
+			 -value=>\%preferences,
+			 -expires=>'+30d');
+print header(-cookie=>$the_cookie);
+
+# Adjust the title to incorporate the user's name, if provided.
+$title = $preferences{'name'} ? 
+    "Welcome back, $preferences{name}!" : "Customizable Page";
+
+# Create the HTML page.  We use several of Netscape's
+# extended tags to control the background color and the
+# font size.  It's safe to use Netscape features here because
+# cookies don't work anywhere else anyway.
+print start_html(-title=>$title,
+		 -bgcolor=>$preferences{'background'},
+		 -text=>$preferences{'text'}
+		 );
+
+print basefont({SIZE=>$preferences{size}}) if $preferences{'size'} > 0;
+
+print h1($title),<<END;
+You can change the appearance of this page by submitting
+the fill-out form below.  If you return to this page any time
+within 30 days, your preferences will be restored.
+END
+    ;
+
+# Create the form
+print hr(),
+    start_form,
+    
+    "Your first name: ",
+    textfield(-name=>'name',
+	      -default=>$preferences{'name'},
+	      -size=>30),br,
+    
+    table(
+	  TR(
+	     td("Preferred"),
+	     td("Page color:"),
+	     td(popup_menu(-name=>'background',
+			   -values=>\@colors,
+			   -default=>$preferences{'background'})
+		),
+	     ),
+	  TR(
+	     td(''),
+	     td("Text color:"),
+	     td(popup_menu(-name=>'text',
+			   -values=>\@colors,
+			   -default=>$preferences{'text'})
+		)
+	     ),
+	  TR(
+	     td(''),
+	     td("Font size:"),
+	     td(popup_menu(-name=>'size',
+			   -values=>\@sizes,
+			   -default=>$preferences{'size'})
+		)
+	     )
+	  ),
+
+    submit(-label=>'Set preferences'),
+    hr;
+	   
+print a({HREF=>"/"},'Go to the home page');
+print end_html;
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/diff_upload.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/diff_upload.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/diff_upload.cgi	(revision 14489)
@@ -0,0 +1,68 @@
+#!/usr/local/bin/perl
+
+$DIFF = "/usr/bin/diff";
+$PERL = "/usr/bin/perl";
+
+use CGI qw(:standard);
+use CGI::Carp;
+
+print header;
+print start_html("File Diff Example");
+print "<strong>Version </strong>$CGI::VERSION<p>";
+
+print <<EOF;
+<H1>File Diff Example</H1>
+Enter two files.  When you press "submit" their diff will be
+produced.
+EOF
+    ;
+
+# Start a multipart form.
+print start_multipart_form;
+print "File #1:",filefield(-name=>'file1',-size=>45),"<BR>\n";
+print "File #2:",filefield(-name=>'file2',-size=>45),"<BR>\n";
+print "Diff type: ",radio_group(-name=>'type',
+					-value=>['context','normal']),"<br>\n";
+print reset,submit(-name=>'submit',-value=>'Do Diff');
+print endform;
+
+# Process the form if there is a file name entered
+$file1 = param('file1');
+$file2 = param('file2');
+
+$|=1;				# for buffering
+if ($file1 && $file2) {
+    $realfile1 = tmpFileName($file1);
+    $realfile2 = tmpFileName($file2);
+    print "<HR>\n";
+    print "<H2>$file1 vs $file2</H2>\n";
+
+    print "<PRE>\n";
+    $options = "-c" if param('type') eq 'context';
+    system "$DIFF $options $realfile1 $realfile2 | $PERL -pe 's/>/&gt;/g; s/</&lt;/g;'";
+    close $file1;
+    close $file2;
+    print "</PRE>\n";
+}
+
+print <<EOF;
+<HR>
+<A HREF="../cgi_docs.html">CGI documentation</A>
+<HR>
+<ADDRESS>
+<A HREF="/~lstein">Lincoln D. Stein</A>
+</ADDRESS><BR>
+Last modified 17 July 1996
+EOF
+    ;
+print end_html;
+
+sub sanitize {
+    my $name = shift;
+    my($safe) = $name=~/([a-zA-Z0-9._~#,]+)/;
+    unless ($safe) {
+	print "<strong>$name is not a valid Unix filename -- sorry</strong>";
+	exit 0;
+    }
+    return $safe;
+}
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/dna_small_gif.uu
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/dna_small_gif.uu	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/dna_small_gif.uu	(revision 14489)
@@ -0,0 +1,63 @@
+begin 444 dna_small.gif
+M1TE&.#=A)0`J`.<``+9%&Y<R0M<F'ID\,!<07%<G1:P<0Q`A2Q`P;"L9/L$:
+M,"480N5"&RL7:4LD0T,G144[7BHL2B4?3\0I+"</)BQ.9KD0/S878\96$Z\@
+M(:\1*RL:3L0W&QL?2#4?9>@_&A$_5<I"&C`A3*,3-A`//9X<)\@Q(L`@.#\E
+M7K,R*R\T6)H++1L72T8=4207:T`G=JX..MD^&!$_;^)2$#T=7S`79AL7.A$3
+M1-=%#^,Q&QT_:C8=1!L86]\R#4M":4H76R,515HZ4"477G@T,J\;(X(@/$\7
+M."4A2N9;$"DZ6RL34-8I$34A73P86I84/\87%1`0/V,B2"0<0N!(%QPH91<6
+M2=!5$3(=73(E23`/,!L4.=$Z'-MH%>`Y#3$=2"=#59M((H88,GP\/]X^&+$R
+M$"(79"DF33(93"$86=%;&"T4/=Y"&\\A$Q4Z4!`62*T4-Q4B9+X1*BH96SP?
+M1<0D/3(F<-TM$!`=5:H.(!<64C$W?#8J3*`S(S<@3=8V%K$](QT.6Q`43AL4
+M1:$D,;<0,\X9&,8])\@=$A(U244S5U,D6Q<V;]\I&&<K/8!*.R044>=/#YH>
+M08$I1B,09S$35R(:4C0?<19$7<D^#Q`>5!()-;4702M`=;56)A`25,0K%"X<
+M83`N>K`H'HDS*1`40,M&%!<@7M,_$A<N2L)%%18E4^<M$A@=5=0Q$Q`E311*
+M2L8E&2D<7Q\A7P\80B48,%E/8[1-'J4/-"H<3"PA1$,T?Q<15R44,R,A4AL/
+M,^M4%2,07!L+,[\[&!P4520I:C(9.=54$[,2/M-)&RP?7M=(%1$J8<-,%2H@
+M4B,=51436^]2"!X<1A<44RD</>E+#%0>0S0/:4PJ9I,F-6DG420Y<"@09R,0
+M-V$R/R4M<:\H0!(H410Z:AT27&4Q9"L@;=1%(MA-$M5+#RL4+M8Z&AT<7[<:
+M(-QA&2,36R$++B(84!0:5ALO:K$A.]X?&!$84V@;/SX<6Q`;2$(B2QD21W4J
+M1=TW&@```````````````"P`````)0`J```(_@!]:(N'18\W%15T$1N'C)V?
+M0_HH,<$G9YBX!C6<3;+T@AZ-)K@\O*"!KP^$>"KVA`L3*8P3)^5ZA)@B:AH+
+M9];F7.$Q+!`!0=*<E3'5K(:EHS2N%"AP*Y(\&##H6(!A:!XU99B*H?%4IDF?
+M!8'<"-F%9I*TH8A83:*TXYD!J83D$0ICI-NE(:O8I6&FJ$64$M5$M%!3PU,F
+M2UJD"9I41E824WT2G?BV-!$(!`=,+<IF!P>.%",&P7J"9XB82L5,48F5K,:"
+M'94FU='6;!*R3T->E"%&95DR"`/6P,I0PDF)0SG8($$RJN0R`FI(H7$A2]VD
+M*^^L_6(T3U*V%XH"_AB:HDS8H$AO5@R:P,8.I%^.:*AC(>Z!'":6RC`1L@W-
+M%1Q/,%(.'5+1`<D^74R@P2#?T*'/$"%@\(L5Y?RAB!SO3#*,-6CL44\4]C1#
+MR0Q3C&&"!AH08@(#:Y2C@`&1---,.#)\T84=R##`0",H++8#)34,@X80R:"`
+M0A<]?'#.!";`TDH.8QBB0354A!,*)WI0\<D\YJRQ3PE[V",(.D#48$T9GO22
+MA0.BC,)'*]3TP,`^\_#QA0P@>`/"*]=<HX\3"C!BAQV%5",$+Z0,0X,UL3SB
+M#B[NN$'/,A&,$L,Y[-BASR(@<**("E^,0(<&;[QA0@^,3%",#2S8H,01_LX0
+M`(0:W%`@13#TN+'#&LK@0$T0VER##50*Q/%-%%&H$`0#K7"`!B^X/`),()F0
+M0PNT[K#BRBS1-!("`^=,$8`D="B`QRW?1**+-I?(X$@(L(R2AQ8+Y,*#-*YX
+MH(00'1Q!CSI,U'!%)^_%4(X&FUB@01$.@*!#$I?4D48I&1BA!2*HD%))(.+T
+MYTEOT3B#PB/U4(,$%QD0(<\QX^CRBC=)@%`!&+:<<TH&M*C1"RJX'-'.'`YX
+M<H0@<)#"0CX+I%`*-%:4L@XFS`#[11M?U-))"&RP84LWZL!A1A^YH.*)!)3<
+MHXX6L]P3"!I`H/!`*>90`PD.F'3SR@-AG)`&_A=3'"**#[J(P<<I@YCA2@32
+M!,*+Q9H`(XT2'O2RS"CGS.U9!K>0^C0&S/#1""(ZI)'&*6,,$842N%Q!@3NK
+M"R'%%4KP0D(Q?"`S!3)<I#!!".68$T(IMHP#>BVE(/$+)#-80<PTLBRP^@$>
+M<+,`-[QH$LP+0_P!1C>=S("!,N>8XP<8H6131!B;3`#&#)"DTH(L5#P0S#W+
+MQ)*`$K1HHD4^;E!2QP%:B``&4H$,/Y2C$Y*(1%0(00A)@```77B"*$0@#3>P
+MP&PU4`,^H!","P!!$')0P^H6((I5L"$'.;``';[Q!@-\PP"<B$<]EG"(#*C"
+M%-(@0":\L0U?D&`#_L50@33.(`4M4``=&4@'+-9!!P9JP`#9T$4H=*$+!#1B
+M'3A(`SYH`81'B.,(XJ@"":0(CDRPH@/<"$88V+"%$N#A&)MPX0N2H`L]C&,<
+MEW"$%6:0BCV@XPIH>$0?)M$`<92!%OG8Q3#@(`U2C*)%9-!`&`K`!!EP0@80
+M2,0M;I$.:"C#"D.@P#UJ``]GT"*,K%B&*0+!@TFH8VV*0$(:_/`)?7@#'.'0
+M@R[H8``\:&`,=NC"*"B@!2TTHP5]N((TEH&`<)B"!PU`0RQ(P8MNS``9K6@%
+M'W31AG%$(BZ2&((PA-&#'I"A&`F8!DD\\`H6-,.,X'B'%,+R#FX4`PS&_L!$
+M.4R0#7W<0@%O2,07$($#9@C3"%C8P!5H88\]J$,"-E!;(.X@C5T<`!65V,40
+M,'&(0C!"`1JP@"3TH`T9=&,5JRC$-]+1`U%TP@@[^,$>Z$&*0%1A%XFK`BFD
+MX0L6Y"(#A_A$#[JPC@%\@1@02`(SJ#&&.`A@'\&$!AALX(4Y="`/TA"",UA!
+M@%W<8!*\$`$@C%""+G1A"9AP!"<>9@ME*)$0F\C!$I8`B3\TP@%'@$(QH$`"
+M)8@#'(B0ACB`P`,@%&,'9"##)S`1!&)\`0)^&,,^+$`("QC"#D\X!":HX0!<
+ML(`&-O!%,&H@BS#F0AI'`!LO^"`,/OS!%KJ0_H0HEA`E27Q#%T%X0"%"@`1E
+M2,`!:F!%+Q#A!G)40A!HP`4OFK`#-13#`?I(QCW38(Q/9&``%0#!);01BE>$
+M@!TZNL81$G`!-]2!&&5@A1N&T0Q<,$$$%*!``BR1A5$PPPH<74$%]*`#$.RA
+M`(VP@#`X$(`7``(%T=@`.5Q`C@:0`P[)D$4'$H`."MB#"908Q=X@,01B9$(7
+MG'A%`#8!"QSL@PUAL,0==M"")CQCP4)0QQUDP806H&,!T]A!`EH@AC2P`P,^
+MT`,*NN%-&&T!&L@X!!Y^<(4.D(,%E>A`,T20C#IXL`6-:,`5F+"#!W"@'%OH
+MA`IJ$5(#;`(;AV/'FA103(EV+(,>GHB&&ZJ`!D'<X0[-N$(N@)$+4$C@`<(`
+M$(&/<8Q;7$,1UT"``+>P!57`X1F9D`4<W$`"4MP@$ZYX\B-"004Y2$`.HT@%
+M)@IAB#><0!]FB(<I.(&`(7P"%GPPQ3)F`0YB0"$0@8"")L!Q!RH`8A&AL,8L
+BR!$$,@@#&5OX!1V.\85XA.,.,A##!T2!AP@LXP#;"`@`.P``
+end
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/file_upload.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/file_upload.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/file_upload.cgi	(revision 14489)
@@ -0,0 +1,71 @@
+#!/usr/local/bin/perl -w
+
+use strict 'refs';
+use lib '..';
+use CGI qw(:standard);
+use CGI::Carp qw/fatalsToBrowser/;
+
+print header();
+print start_html("File Upload Example");
+print strong("Version "),$CGI::VERSION,p;
+
+print h1("File Upload Example"),
+    'This example demonstrates how to prompt the remote user to
+    select a remote file for uploading. ',
+    strong("This feature only works with Netscape 2.0 or greater, or IE 4.0 or greater."),
+    p,
+    'Select the ',cite('browser'),' button to choose a text file
+    to upload.  When you press the submit button, this script
+    will count the number of lines, words, and characters in
+    the file.';
+
+my @types = ('count lines','count words','count characters');
+
+# Start a multipart form.
+print start_multipart_form(),
+    "Enter the file to process:",
+    filefield('filename','',45),
+    br,
+    checkbox_group('count',\@types,\@types),
+    p,
+    reset,submit('submit','Process File'),
+    endform;
+
+# Process the form if there is a file name entered
+if (my $file = param('filename')) {
+    my %stats;
+    my $tmpfile=tmpFileName($file);
+    my $mimetype = uploadInfo($file)->{'Content-Type'} || '';
+    print hr(),
+          h2($file),
+          h3($tmpfile),
+          h4("MIME Type:",em($mimetype));
+
+    my($lines,$words,$characters,@words) = (0,0,0,0);
+    while (<$file>) {
+	$lines++;
+	$words += @words=split(/\s+/);
+	$characters += length($_);
+    }
+    close $file;
+    grep($stats{$_}++,param('count'));
+    if (%stats) {
+	print strong("Lines: "),$lines,br if $stats{'count lines'};
+	print strong("Words: "),$words,br if $stats{'count words'};
+	print strong("Characters: "),$characters,br if $stats{'count characters'};
+    } else {
+	print strong("No statistics selected.");
+    }
+}
+
+# print cite("URL parameters: "),url_param();
+
+print hr(),
+    a({href=>"../cgi_docs.html"},"CGI documentation"),
+    hr,
+    address(
+	    a({href=>'/~lstein'},"Lincoln D. Stein")),
+    br,
+    'Last modified July 17, 1996',
+    end_html;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/frameset.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/frameset.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/frameset.cgi	(revision 14489)
@@ -0,0 +1,81 @@
+#!/usr/local/bin/perl
+
+use CGI;
+$query = new CGI;
+print $query->header;
+$TITLE="Frameset Example";
+
+# We use the path information to distinguish between calls
+# to the script to:
+# (1) create the frameset
+# (2) create the query form
+# (3) create the query response
+
+$path_info = $query->path_info;
+
+# If no path information is provided, then we create 
+# a side-by-side frame set
+if (!$path_info) {
+    &print_frameset;
+    exit 0;
+}
+
+# If we get here, then we either create the query form
+# or we create the response.
+&print_html_header;
+&print_query if $path_info=~/query/;
+&print_response if $path_info=~/response/;
+&print_end;
+
+
+# Create the frameset
+sub print_frameset {
+    $script_name = $query->script_name;
+    print <<EOF;
+<html><head><title>$TITLE</title></head>
+<frameset cols="50,50">
+<frame src="$script_name/query" name="query">
+<frame src="$script_name/response" name="response">
+</frameset>
+EOF
+    ;
+    exit 0;
+}
+
+sub print_html_header {
+    print $query->start_html($TITLE);
+}
+
+sub print_end {
+    print qq{<P><hr><A HREF="../index.html" TARGET="_top">More Examples</A>};
+    print $query->end_html;
+}
+
+sub print_query {
+    $script_name = $query->script_name;
+    print "<H1>Frameset Query</H1>\n";
+    print $query->startform(-action=>"$script_name/response",-TARGET=>"response");
+    print "What's your name? ",$query->textfield('name');
+    print "<P>What's the combination?<P>",
+    $query->checkbox_group(-name=>'words',
+			       -values=>['eenie','meenie','minie','moe']);
+
+    print "<P>What's your favorite color? ",
+    $query->popup_menu(-name=>'color',
+		       -values=>['red','green','blue','chartreuse']),
+    "<P>";
+    print $query->submit;
+    print $query->endform;
+}
+
+sub print_response {
+    print "<H1>Frameset Result</H1>\n";
+    unless ($query->param) {
+	print "<b>No query submitted yet.</b>";
+	return;
+    }
+    print "Your name is <EM>",$query->param(name),"</EM>\n";
+    print "<P>The keywords are: <EM>",join(", ",$query->param(words)),"</EM>\n";
+    print "<P>Your favorite color is <EM>",$query->param(color),"</EM>\n";
+}
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/index.html
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/index.html	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/index.html	(revision 14489)
@@ -0,0 +1,119 @@
+<HTML> <HEAD>
+<TITLE>More Examples of Scripts Created with CGI.pm</TITLE>
+</HEAD>
+
+<BODY>
+<H1>More Examples of Scripts Created with CGI.pm</H1>
+
+<H2> Basic Non Sequitur Questionnaire</H2>
+<UL>
+  <LI> <A HREF="tryit.cgi">Try the script</A>
+  <LI> <A HREF="tryit.txt">Look at its source code</A>
+</UL>
+
+<H2> Advanced Non Sequitur Questionnaire</H2>
+<UL>
+  <LI> <A HREF="monty.cgi">Try the script</A>
+  <LI> <A HREF="monty.txt">Look at its source code</A>
+</UL>
+
+<H2> Save and restore the state of a form to a file</H2>
+<UL>
+  <LI> <A HREF="save_state.cgi">Try the script</A>
+  <LI> <A HREF="save_state.txt">Look at its source code</A>
+</UL>
+
+<H2> Server Push</H2>
+<ul>
+  <li><a href="nph-multipart.cgi">Try the script</a>
+  <li><a href="nph-multipart.txt">Look at its source code</a>
+</ul>
+
+<H2> Read the coordinates from a clickable image map</H2>
+<UL>
+  <LI> <A HREF="clickable_image.cgi">Try the script</A>
+  <LI> <A HREF="clickable_image.txt">Look at its source code</A>
+</UL>
+
+<H2> Multiple independent forms on the same page</H2>
+<UL>
+  <LI> <A HREF="multiple_forms.cgi">Try the script</A>
+  <LI> <A HREF="multiple_forms.txt">Look at its source code</A>
+</UL>
+
+<H2> How to maintain state on a page with internal links</H2>
+<UL>
+  <LI> <A HREF="internal_links.cgi">Try the script</A>
+  <LI> <A HREF="internal_links.txt">Look at its source code</A>
+</UL>
+
+<h2>Echo fatal script errors to the browser</h2>
+<em>This script deliberately generates a compile-time error.</em>
+<ul>
+  <li><a href="crash.cgi">Try the script</a>
+  <li><a href="crash.txt">Look at its source code</a>
+</ul>
+
+<EM>The Following Scripts Work with Netscape Navigator 2.0 and higher,
+or Internet Explorer 3.0 and higher</EM>
+
+<H2> Prompt for a file to upload and process it</H2>
+<UL>
+  <LI> <A HREF="file_upload.cgi">Try the script</A>
+  <LI> <A HREF="file_upload.txt">Look at its source code</A>
+</UL>
+
+<h2> A Continuously-Updated Page using Server Push</h2>
+<ul>
+  <li><a href="nph-clock.cgi">Try the script</a>
+  <li><a href="nph-clock.txt">Look at its source code</a>
+</ul>
+
+<h2>Compute the "diff" between two uploaded files</h2>
+<ul>
+  <li><a href="diff_upload.cgi">Try the script</a>
+  <li><a href="diff_upload.txt">Look at its source code</a>
+</ul>
+
+<h2>Maintain state over a long period with a cookie</h2>
+<ul>
+  <li><a href="cookie.cgi">Try the script</a>
+  <li><a href="cookie.txt">Look at its source code</a>
+</ul>
+
+<h2>Permanently customize the appearance of a page with a cookie</h2>
+<ul>
+  <li><a href="customize.cgi">Try the script</a>
+  <li><a href="customize.txt">Look at its source code</a>
+</ul>
+
+<h2> Popup the response in a new window</h2>
+<ul>
+  <li><a href="popup.cgi">Try the script</a>
+  <li><a href="popup.txt">Look at its source code</a>
+</ul>
+
+<h2> Side-by-side form and response using frames</h2>
+<ul>
+  <li><a href="frameset.cgi">Try the script</a>
+  <li><a href="frameset.txt">Look at its source code</a>
+</ul>
+
+<h2>Verify the Contents of a fill-out form with JavaScript</h2>
+<ul>
+  <li><a href="javascript.cgi">Try the script</a>
+  <li><a href="javascript.txt">Look at its source code</a>
+</ul>
+
+<HR>
+<MENU>
+  <LI> <A HREF="../cgi_docs.html">CGI.pm documentation</A>
+  <LI> <A HREF="../CGI.pm.tar.gz">Download the CGI.pm distribution</A>
+</MENU>
+<HR>
+<ADDRESS>Lincoln D. Stein, lstein@genome.wi.mit.edu<br>
+<a href="/">Whitehead Institute/MIT Center for Genome Research</a></ADDRESS>
+<!-- hhmts start -->
+Last modified: Wed Jun 23 15:31:47 EDT 1999
+<!-- hhmts end -->
+</BODY> </HTML>
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/internal_links.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/internal_links.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/internal_links.cgi	(revision 14489)
@@ -0,0 +1,33 @@
+#!/usr/local/bin/perl
+
+use CGI;
+$query = new CGI;
+
+# We generate a regular HTML file containing a very long list
+# and a popup menu that does nothing except to show that we
+# don't lose the state information.
+print $query->header;
+print $query->start_html("Internal Links Example");
+print "<H1>Internal Links Example</H1>\n";
+print "Click <cite>Submit Query</cite> to create a state.  Then scroll down and",
+    " click on any of the <cite>Jump to top</cite> links.  This is not very exciting.";
+
+print "<A NAME=\"start\"></A>\n"; # an anchor point at the top
+
+# pick a default starting value;
+$query->param('amenu','FOO1') unless $query->param('amenu');
+
+print $query->startform;
+print $query->popup_menu('amenu',[('FOO1'..'FOO9')]);
+print $query->submit,$query->endform;
+
+# We create a long boring list for the purposes of illustration.
+$myself = $query->self_url;
+print "<OL>\n";
+for (1..100) {
+    print qq{<LI>List item #$_ <A HREF="$myself#start">Jump to top</A>\n};
+}
+print "</OL>\n";
+
+print $query->end_html;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/javascript.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/javascript.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/javascript.cgi	(revision 14489)
@@ -0,0 +1,105 @@
+#!/usr/local/bin/perl
+
+# This script illustrates how to use JavaScript to validate fill-out
+# forms.
+use CGI qw(:standard);
+
+# Here's the javascript code that we include in the document.
+$JSCRIPT=<<EOF;
+    // validate that the user is the right age.  Return
+    // false to prevent the form from being submitted.
+    function validateForm() {
+	var today = new Date();
+	var birthday = validateDate(document.form1.birthdate);
+	if (birthday == 0) {
+	    document.form1.birthdate.focus()
+	    document.form1.birthdate.select();
+	    return false;
+	}
+	var milliseconds = today.getTime()-birthday;
+	var years = milliseconds/(1000 * 60 * 60 * 24 * 365.25);
+	if ((years > 20) || (years < 5)) {
+	    alert("You must be between the ages of 5 and 20 to submit this form");
+	    document.form1.birthdate.focus();
+	    document.form1.birthdate.select();
+	    return false;
+	}
+	// Since we've calculated the age in years already,
+	// we might as well send it up to our CGI script.
+	document.form1.age.value=Math.floor(years);
+	return true;
+    }
+
+   // make sure that the contents of the supplied
+   // field contain a valid date.
+   function validateDate(element) {
+       var date = Date.parse(element.value);
+       if (0 == date) { 
+	   alert("Please enter date in format MMM DD, YY");
+	   element.focus();
+	   element.select();
+       }
+       return date;
+   }
+
+   // Compliments, compliments
+    function doPraise(element) {
+	if (element.checked) {
+	    self.status=element.value + " is an excellent choice!";
+	    return true;
+	} else {
+	    return false;
+	}
+    }
+
+    function checkColor(element) {
+	var color = element.options[element.selectedIndex].text;
+	if (color == "blonde") {
+	    if (confirm("Is it true that blondes have more fun?"))
+		alert("Darn.  That leaves me out.");
+	} else
+	    alert(color + " is a fine choice!");
+    }
+EOF
+    ;
+
+# here's where the execution begins
+print header;
+print start_html(-title=>'Personal Profile',-script=>$JSCRIPT);
+
+print h1("Big Brother Wants to Know All About You"),
+    strong("Note: "),"This page uses JavaScript and requires ",
+    "Netscape 2.0 or higher to do anything special.";
+
+&print_prompt();
+print hr;
+&print_response() if param;
+print end_html;
+
+sub print_prompt {
+    print start_form(-name=>'form1',
+		     -onSubmit=>"return validateForm()"),"\n";
+    print "Birthdate (e.g. Jan 3, 1972): ", 
+          textfield(-name=>'birthdate',
+			-onBlur=>"validateDate(this)"),"<p>\n";
+    print "Sex: ",radio_group(-name=>'gender',
+				  -value=>[qw/male female/],
+				  -onClick=>"doPraise(this)"),"<p>\n";
+    print "Hair color: ",popup_menu(-name=>'color',
+					-value=>[qw/brunette blonde red gray/],
+					-default=>'red',
+					-onChange=>"checkColor(this)"),"<p>\n";
+    print hidden(-name=>'age',-value=>0);
+    print submit();
+    print end_form;
+}
+
+sub print_response {
+    import_names('Q');
+    print h2("Your profile"),
+	"You claim to be a ",b($Q::age)," year old ",b($Q::color,$Q::gender),".",
+	"You should be ashamed of yourself for lying so ",
+	"blatantly to big brother!",
+	hr;
+}
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/make_links.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/make_links.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/make_links.pl	(revision 14489)
@@ -0,0 +1,8 @@
+#!/usr/local/bin/perl
+
+# this is just a utility for creating symlinks from *.txt to *.cgi
+# for documentation purposes.
+foreach (<*.cgi>) {
+    ($target=$_)=~s/cgi$/txt/;
+    symlink $_,$target
+}
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/monty.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/monty.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/monty.cgi	(revision 14489)
@@ -0,0 +1,84 @@
+#!/usr/local/bin/perl
+     
+use CGI;
+use CGI::Carp qw/fatalsToBrowser/;
+ 
+$query = new CGI;
+
+print $query->header;
+print $query->start_html("Example CGI.pm Form");
+print "<H1> Example CGI.pm Form</H1>\n";
+&print_prompt($query);
+&do_work($query);
+&print_tail;
+print $query->end_html;
+ 
+sub print_prompt {
+   my($query) = @_;
+ 
+   print $query->start_form;
+   print "<EM>What's your name?</EM><BR>";
+   print $query->textfield('name');
+   print $query->checkbox('Not my real name');
+ 
+   print "<P><EM>Where can you find English Sparrows?</EM><BR>";
+   print $query->checkbox_group(
+				-name=>'Sparrow locations',
+				-Values=>[England,France,Spain,Asia,Hoboken],
+				-linebreak=>'yes',
+				-defaults=>[England,Asia]);
+ 
+   print "<P><EM>How far can they fly?</EM><BR>",
+   $query->radio_group(
+		       -name=>'how far',
+		       -Values=>['10 ft','1 mile','10 miles','real far'],
+		       -default=>'1 mile');
+   
+   print "<P><EM>What's your favorite color?</EM>  ";
+   print $query->popup_menu(-name=>'Color',
+			    -Values=>['black','brown','red','yellow'],
+			    -default=>'red');
+ 
+   print $query->hidden('Reference','Monty Python and the Holy Grail');
+ 
+   print "<P><EM>What have you got there?</EM><BR>";
+   print $query->scrolling_list(
+				-name=>'possessions',
+				-Values=>['A Coconut','A Grail','An Icon',
+					  'A Sword','A Ticket'],
+				-size=>5,
+				-multiple=>'true');
+ 
+   print "<P><EM>Any parting comments?</EM><BR>";
+   print $query->textarea(-name=>'Comments',
+			  -rows=>10,
+			  -columns=>50);
+   
+   print "<P>",$query->reset;
+   print $query->submit('Action','Shout');
+   print $query->submit('Action','Scream');
+   print $query->endform;
+   print "<HR>\n";
+ 	}
+ 
+sub do_work {
+    my($query) = @_;
+    my(@values,$key);
+
+    print "<H2>Here are the current settings in this form</H2>";
+
+    foreach $key ($query->param) {
+	print "<STRONG>$key</STRONG> -> ";
+	@values = $query->param($key);
+	print join(", ",@values),"<BR>\n";
+    }
+}
+ 
+sub print_tail {
+    print <<END;
+<HR>
+<ADDRESS>Lincoln D. Stein</ADDRESS><BR>
+<A HREF="/">Home Page</A>
+END
+    ;
+}
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/multiple_forms.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/multiple_forms.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/multiple_forms.cgi	(revision 14489)
@@ -0,0 +1,54 @@
+#!/usr/local/bin/perl
+
+use CGI;
+
+$query = new CGI;
+print $query->header;
+print $query->start_html('Multiple Forms');
+print "<H1>Multiple Forms</H1>\n";
+
+# Print the first form
+print $query->startform;
+$name = $query->remote_user || 'anonymous@' . $query->remote_host;
+
+print "What's your name? ",$query->textfield('name',$name,50);
+print "<P>What's the combination?<P>",
+        $query->checkbox_group('words',['eenie','meenie','minie','moe']);
+print "<P>What's your favorite color? ",
+        $query->popup_menu('color',['red','green','blue','chartreuse']),
+	"<P>";
+print $query->submit('form_1','Send Form 1');
+print $query->endform;
+
+# Print the second form
+print "<HR>\n";
+print $query->startform;
+print "Some radio buttons: ",$query->radio_group('radio buttons',
+						 [qw{one two three four five}],'three'),"\n";
+print "<P>What's the password? ",$query->password_field('pass','secret');
+print $query->defaults,$query->submit('form_2','Send Form 2'),"\n";
+print $query->endform;
+
+print "<HR>\n";
+
+$query->import_names('Q');
+if ($Q::form_1) {
+    print "<H2>Form 1 Submitted</H2>\n";
+    print "Your name is <EM>$Q::name</EM>\n";
+    print "<P>The combination is: <EM>{",join(",",@Q::words),"}</EM>\n";
+    print "<P>Your favorite color is <EM>$Q::color</EM>\n";
+} elsif ($Q::form_2) {
+    print <<EOF;
+<H2>Form 2 Submitted</H2>
+<P>The value of the radio buttons is <EM>$Q::radio_buttons</EM>
+<P>The secret password is <EM>$Q::pass</EM>
+EOF
+    ;
+}
+print qq{<P><A HREF="./">Other examples</A>};
+print qq{<P><A HREF="../cgi_docs.html">Go to the documentation</A>};
+
+print $query->end_html;
+
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/nph-clock.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/nph-clock.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/nph-clock.cgi	(revision 14489)
@@ -0,0 +1,18 @@
+#!/usr/local/bin/perl -w
+
+use CGI::Push qw(:standard :html3);
+
+do_push(-next_page=>\&draw_time,-delay=>1);
+
+sub draw_time {
+    my $time = `/bin/date`;
+    return start_html('Tick Tock'),
+           div({-align=>CENTER},
+	       h1('Virtual Clock'),
+	       h2($time)
+	       ),
+	   hr,
+	   a({-href=>'index.html'},'More examples'),
+           end_html();
+}
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/nph-multipart.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/nph-multipart.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/nph-multipart.cgi	(revision 14489)
@@ -0,0 +1,10 @@
+#!/usr/local/bin/perl
+use CGI qw/:push -nph/;
+$| = 1;
+print multipart_init(-boundary=>'----------------here we go!');
+while (1) {
+    print multipart_start(-type=>'text/plain'),
+    "The current time is ",scalar(localtime),"\n",
+    multipart_end;
+    sleep 1;
+}
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/popup.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/popup.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/popup.cgi	(revision 14489)
@@ -0,0 +1,32 @@
+#!/usr/local/bin/perl
+
+use CGI;
+$query = new CGI;
+print $query->header;
+print $query->start_html('Popup Window');
+
+
+if (!$query->param) {
+    print "<H1>Ask your Question</H1>\n";
+    print $query->startform(-target=>'_new');
+    print "What's your name? ",$query->textfield('name');
+    print "<P>What's the combination?<P>",
+    $query->checkbox_group(-name=>'words',
+			   -values=>['eenie','meenie','minie','moe'],
+			   -defaults=>['eenie','moe']);
+
+    print "<P>What's your favorite color? ",
+    $query->popup_menu(-name=>'color',
+		       -values=>['red','green','blue','chartreuse']),
+    "<P>";
+    print $query->submit;
+    print $query->endform;
+
+} else {
+    print "<H1>And the Answer is...</H1>\n";
+    print "Your name is <EM>",$query->param(name),"</EM>\n";
+    print "<P>The keywords are: <EM>",join(", ",$query->param(words)),"</EM>\n";
+    print "<P>Your favorite color is <EM>",$query->param(color),"</EM>\n";
+}
+print qq{<P><A HREF="cgi_docs.html">Go to the documentation</A>};
+print $query->end_html;
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/save_state.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/save_state.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/save_state.cgi	(revision 14489)
@@ -0,0 +1,67 @@
+#!/usr/local/bin/perl
+
+use CGI;
+$query = new CGI;
+
+print $query->header;
+print $query->start_html("Save and Restore Example");
+print "<H1>Save and Restore Example</H1>\n";
+
+# Here's where we take action on the previous request
+&save_parameters($query)              if $query->param('action') eq 'SAVE';
+$query = &restore_parameters($query)  if $query->param('action') eq 'RESTORE';
+
+# Here's where we create the form
+print $query->start_multipart_form;
+print "Popup 1: ",$query->popup_menu('popup1',[qw{red green purple magenta orange chartreuse brown}]),"\n";
+print "Popup 2: ",$query->popup_menu('popup2',[qw{lion tiger bear zebra potto wildebeest frog emu gazelle}]),"\n";
+print "<P>";
+$default_name = $query->remote_addr . '.sav';
+print "Save/restore state from file: ",$query->textfield('savefile',$default_name),"\n";
+print "<P>";
+print $query->submit('action','SAVE'),$query->submit('action','RESTORE');
+print "<P>",$query->defaults;
+print $query->endform;
+
+# Here we print out a bit at the end
+print $query->end_html;
+
+sub save_parameters {
+    local($query) = @_;
+    local($filename) = &clean_name($query->param('savefile'));
+    if (open(FILE,">$filename")) {
+	$query->save(FILE);
+	close FILE;
+	print "<STRONG>State has been saved to file $filename</STRONG>\n";
+	print "<P>If you remember this name you can restore the state later.\n";
+    } else {
+	print "<STRONG>Error:</STRONG> couldn't write to file $filename: $!\n";
+    }
+}
+
+sub restore_parameters {
+    local($query) = @_;
+    local($filename) = &clean_name($query->param('savefile'));
+    if (open(FILE,$filename)) {
+	$query = new CGI(FILE);  # Throw out the old query, replace it with a new one
+	close FILE;
+	print "<STRONG>State has been restored from file $filename</STRONG>\n";
+    } else {
+	print "<STRONG>Error:</STRONG> couldn't restore file $filename: $!\n";
+    }
+    return $query;
+}
+
+
+# Very important subroutine -- get rid of all the naughty
+# metacharacters from the file name. If there are, we
+# complain bitterly and die.
+sub clean_name {
+   local($name) = @_;
+   unless ($name=~/^[\w\._\-]+$/) {
+      print "<STRONG>$name has naughty characters.  Only ";
+      print "alphanumerics are allowed.  You can't use absolute names.</STRONG>";
+      die "Attempt to use naughty characters";
+   }
+   return "WORLD_WRITABLE/$name";
+}
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/tryit.cgi
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/tryit.cgi	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/tryit.cgi	(revision 14489)
@@ -0,0 +1,37 @@
+#!/usr/local/bin/perl
+
+use CGI ':standard';
+
+print header;
+print start_html('A Simple Example'),
+    h1('A Simple Example'),
+    start_form,
+    "What's your name? ",textfield('name'),
+    p,
+    "What's the combination?",
+    p,
+    checkbox_group(-name=>'words',
+		   -values=>['eenie','meenie','minie','moe'],
+		   -defaults=>['eenie','minie']),
+    p,
+    "What's your favorite color? ",
+    popup_menu(-name=>'color',
+	       -values=>['red','green','blue','chartreuse']),
+    p,
+    submit,
+    end_form,
+    hr;
+
+if (param()) {
+    print 
+	"Your name is: ",em(param('name')),
+	p,
+	"The keywords are: ",em(join(", ",param('words'))),
+	p,
+	"Your favorite color is: ",em(param('color')),
+	hr;
+}
+print a({href=>'../cgi_docs.html'},'Go to the documentation');
+print end_html;
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/wilogo_gif.uu
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/wilogo_gif.uu	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CGI/eg/wilogo_gif.uu	(revision 14489)
@@ -0,0 +1,13 @@
+begin 444 wilogo.gif
+M1TE&.#=A7@!$`(```'X2F?___RP`````7@!$```"_D2.J<#MKF)ZU,A3,[OO
+M(IUY']A%9"6AW$F)+#2]Y:BNLF6_\;WMH<?#I72^VP+D"@*)F&"O25KRDM&B
+M[%C-7;4_J)*6'4ZE&O`W8"1OQ5UGPWRBIKDPM!MW9J]-[;LUKL;$5W.'YQ3(
+M(O<&-^>F*(A55\BX%UEI^;<VB0BH1RFX2=<IELE4^*0'N?-I>OJ8N%(*Z^4G
+M.OJJ>8HZ.(>;JRMD><E[!KQHB^3;:APL6Z8\RKPK/)O:*-WLW&7]*\UYR]J)
+M?<P=1MR-_6VN76,WGAV^32W^3CZ_SCY3;W__C-R^CU^\%M#T!9PVL(ZZ&>X"
+M%A1XSM]!A?T8/C0T$1XMJG\B&G+,"-&C/(VS0(842;`)M'S>_OE8F#"=2S#*
+M8LHLAS'D1Y,42UGY9O,F-T:X@@JEE@D1RW>/D@8R.DZ-+*E0CQ:9JJ5JU!SQ
+MR&BU2D.;E*4'ER0TNY%G2A/Y.G[=VG%81+5K_UG$21<A6;=YP9'5B++O7:@7
+M\]J5]]?DX7:)%<]5%=B/55>-GQW55;$8L\RW6J8-9>QM7<^A/SMZK!ESY$,+
+(KPA.EJ```#L`
+end
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/EXTERN.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/EXTERN.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/EXTERN.h	(revision 14489)
@@ -0,0 +1,61 @@
+/*    EXTERN.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * EXT  designates a global var which is defined in perl.h
+ * dEXT designates a global var which is defined in another
+ *      file, so we can't count on finding it in perl.h
+ *      (this practice should be avoided).
+ */
+#undef EXT
+#undef dEXT
+#undef EXTCONST
+#undef dEXTCONST
+#if defined(VMS) && !defined(__GNUC__)
+    /* Suppress portability warnings from DECC for VMS-specific extensions */
+#  ifdef __DECC
+#    pragma message disable (GLOBALEXT,NOSHAREEXT,READONLYEXT)
+#  endif
+#  define EXT globalref
+#  define dEXT globaldef {"$GLOBAL_RW_VARS"} noshare
+#  define EXTCONST globalref
+#  define dEXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
+#else
+#  if defined(WIN32) && !defined(PERL_STATIC_SYMS)
+#    ifdef PERLDLL
+#      define EXT extern __declspec(dllexport)
+#      define dEXT 
+#      define EXTCONST extern __declspec(dllexport) const
+#      define dEXTCONST const
+#    else
+#      define EXT extern __declspec(dllimport)
+#      define dEXT 
+#      define EXTCONST extern __declspec(dllimport) const
+#      define dEXTCONST const
+#    endif
+#  else
+#    if defined(__CYGWIN__) && defined(USEIMPORTLIB)
+#      define EXT extern __declspec(dllimport)
+#      define dEXT 
+#      define EXTCONST extern __declspec(dllimport) const
+#      define dEXTCONST const
+#    else
+#      define EXT extern
+#      define dEXT
+#      define EXTCONST extern const
+#      define dEXTCONST const
+#    endif
+#  endif
+#endif
+
+#undef INIT
+#define INIT(x)
+
+#undef DOINIT
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/INTERN.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/INTERN.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/INTERN.h	(revision 14489)
@@ -0,0 +1,54 @@
+/*    INTERN.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1995, 1996, 1998, 2000, 2001,
+ *    by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * EXT  designates a global var which is defined in perl.h
+ * dEXT designates a global var which is defined in another
+ *      file, so we can't count on finding it in perl.h
+ *      (this practice should be avoided).
+ */
+#undef EXT
+#undef dEXT
+#undef EXTCONST
+#undef dEXTCONST
+#if defined(VMS) && !defined(__GNUC__)
+    /* Suppress portability warnings from DECC for VMS-specific extensions */
+#  ifdef __DECC
+#    pragma message disable (GLOBALEXT,NOSHAREEXT,READONLYEXT)
+#  endif
+#  define EXT globaldef {"$GLOBAL_RW_VARS"} noshare
+#  define dEXT globaldef {"$GLOBAL_RW_VARS"} noshare
+#  define EXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
+#  define dEXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
+#else
+#if defined(WIN32) && defined(__MINGW32__)
+#  define EXT		__declspec(dllexport)
+#  define dEXT
+#  define EXTCONST	__declspec(dllexport) const
+#  define dEXTCONST	const
+#else
+#ifdef __cplusplus
+#  define EXT
+#  define dEXT
+#  define EXTCONST extern const
+#  define dEXTCONST const
+#else
+#  define EXT
+#  define dEXT
+#  define EXTCONST const
+#  define dEXTCONST const
+#endif
+#endif
+#endif
+
+#undef INIT
+#define INIT(x) = x
+
+#define DOINIT
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/XSUB.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/XSUB.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/XSUB.h	(revision 14489)
@@ -0,0 +1,581 @@
+/*    XSUB.h
+ *
+ *    Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifndef _INC_PERL_XSUB_H
+#define _INC_PERL_XSUB_H 1
+
+/* first, some documentation for xsubpp-generated items */
+
+/*
+=head1 Variables created by C<xsubpp> and C<xsubpp> internal functions
+
+=for apidoc Amn|char*|CLASS
+Variable which is setup by C<xsubpp> to indicate the 
+class name for a C++ XS constructor.  This is always a C<char*>.  See C<THIS>.
+
+=for apidoc Amn|(whatever)|RETVAL
+Variable which is setup by C<xsubpp> to hold the return value for an 
+XSUB. This is always the proper type for the XSUB. See 
+L<perlxs/"The RETVAL Variable">.
+
+=for apidoc Amn|(whatever)|THIS
+Variable which is setup by C<xsubpp> to designate the object in a C++ 
+XSUB.  This is always the proper type for the C++ object.  See C<CLASS> and 
+L<perlxs/"Using XS With C++">.
+
+=for apidoc Amn|I32|ax
+Variable which is setup by C<xsubpp> to indicate the stack base offset,
+used by the C<ST>, C<XSprePUSH> and C<XSRETURN> macros.  The C<dMARK> macro
+must be called prior to setup the C<MARK> variable.
+
+=for apidoc Amn|I32|items
+Variable which is setup by C<xsubpp> to indicate the number of 
+items on the stack.  See L<perlxs/"Variable-length Parameter Lists">.
+
+=for apidoc Amn|I32|ix
+Variable which is setup by C<xsubpp> to indicate which of an 
+XSUB's aliases was used to invoke it.  See L<perlxs/"The ALIAS: Keyword">.
+
+=for apidoc Am|SV*|ST|int ix
+Used to access elements on the XSUB's stack.
+
+=for apidoc AmU||XS
+Macro to declare an XSUB and its C parameter list.  This is handled by
+C<xsubpp>.
+
+=for apidoc Ams||dAX
+Sets up the C<ax> variable.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+=for apidoc Ams||dAXMARK
+Sets up the C<ax> variable and stack marker variable C<mark>.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+=for apidoc Ams||dITEMS
+Sets up the C<items> variable.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+=for apidoc Ams||dXSARGS
+Sets up stack and mark pointers for an XSUB, calling dSP and dMARK.
+Sets up the C<ax> and C<items> variables by calling C<dAX> and C<dITEMS>.
+This is usually handled automatically by C<xsubpp>.
+
+=for apidoc Ams||dXSI32
+Sets up the C<ix> variable for an XSUB which has aliases.  This is usually
+handled automatically by C<xsubpp>.
+
+=cut
+*/
+
+#ifndef PERL_UNUSED_ARG
+#  ifdef lint
+#    include <note.h>
+#    define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
+#  else
+#    define PERL_UNUSED_ARG(x) ((void)x)
+#  endif
+#endif
+#ifndef PERL_UNUSED_VAR
+#  define PERL_UNUSED_VAR(x) ((void)x)
+#endif
+
+#define ST(off) PL_stack_base[ax + (off)]
+
+#if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
+#  define XS(name) __declspec(dllexport) void name(pTHX_ CV* cv)
+#else
+#  ifdef HASATTRIBUTE_UNUSED
+#    define XS(name) void name(pTHX_ CV* cv __attribute__unused__)
+#  else
+#    define XS(name) void name(pTHX_ CV* cv)
+#  endif
+#endif
+
+#define dAX const I32 ax = MARK - PL_stack_base + 1
+
+#define dAXMARK				\
+	I32 ax = POPMARK;	\
+	register SV **mark = PL_stack_base + ax++
+
+#define dITEMS I32 items = SP - MARK
+
+#ifdef lint
+#  define dXSARGS \
+	NOTE(ARGUNUSED(cv)) \
+	dSP; dAXMARK; dITEMS
+#else
+#  define dXSARGS \
+	dSP; dAXMARK; dITEMS
+#endif
+
+#define dXSTARG SV * const targ = ((PL_op->op_private & OPpENTERSUB_HASTARG) \
+			     ? PAD_SV(PL_op->op_targ) : sv_newmortal())
+
+/* Should be used before final PUSHi etc. if not in PPCODE section. */
+#define XSprePUSH (sp = PL_stack_base + ax - 1)
+
+#define XSANY CvXSUBANY(cv)
+
+#define dXSI32 I32 ix = XSANY.any_i32
+
+#ifdef __cplusplus
+#  define XSINTERFACE_CVT(ret,name) ret (*name)(...)
+#else
+#  define XSINTERFACE_CVT(ret,name) ret (*name)()
+#endif
+#define dXSFUNCTION(ret)		XSINTERFACE_CVT(ret,XSFUNCTION)
+#define XSINTERFACE_FUNC(ret,cv,f)     ((XSINTERFACE_CVT(ret,))(f))
+#define XSINTERFACE_FUNC_SET(cv,f)	\
+		CvXSUBANY(cv).any_dxptr = (void (*) (pTHX_ void*))(f)
+
+/* Simple macros to put new mortal values onto the stack.   */
+/* Typically used to return values from XS functions.       */
+
+/*
+=head1 Stack Manipulation Macros
+
+=for apidoc Am|void|XST_mIV|int pos|IV iv
+Place an integer into the specified position C<pos> on the stack.  The
+value is stored in a new mortal SV.
+
+=for apidoc Am|void|XST_mNV|int pos|NV nv
+Place a double into the specified position C<pos> on the stack.  The value
+is stored in a new mortal SV.
+
+=for apidoc Am|void|XST_mPV|int pos|char* str
+Place a copy of a string into the specified position C<pos> on the stack. 
+The value is stored in a new mortal SV.
+
+=for apidoc Am|void|XST_mNO|int pos
+Place C<&PL_sv_no> into the specified position C<pos> on the
+stack.
+
+=for apidoc Am|void|XST_mYES|int pos
+Place C<&PL_sv_yes> into the specified position C<pos> on the
+stack.
+
+=for apidoc Am|void|XST_mUNDEF|int pos
+Place C<&PL_sv_undef> into the specified position C<pos> on the
+stack.
+
+=for apidoc Am|void|XSRETURN|int nitems
+Return from XSUB, indicating number of items on the stack.  This is usually
+handled by C<xsubpp>.
+
+=for apidoc Am|void|XSRETURN_IV|IV iv
+Return an integer from an XSUB immediately.  Uses C<XST_mIV>.
+
+=for apidoc Am|void|XSRETURN_UV|IV uv
+Return an integer from an XSUB immediately.  Uses C<XST_mUV>.
+
+=for apidoc Am|void|XSRETURN_NV|NV nv
+Return a double from an XSUB immediately.  Uses C<XST_mNV>.
+
+=for apidoc Am|void|XSRETURN_PV|char* str
+Return a copy of a string from an XSUB immediately.  Uses C<XST_mPV>.
+
+=for apidoc Ams||XSRETURN_NO
+Return C<&PL_sv_no> from an XSUB immediately.  Uses C<XST_mNO>.
+
+=for apidoc Ams||XSRETURN_YES
+Return C<&PL_sv_yes> from an XSUB immediately.  Uses C<XST_mYES>.
+
+=for apidoc Ams||XSRETURN_UNDEF
+Return C<&PL_sv_undef> from an XSUB immediately.  Uses C<XST_mUNDEF>.
+
+=for apidoc Ams||XSRETURN_EMPTY
+Return an empty list from an XSUB immediately.
+
+=head1 Variables created by C<xsubpp> and C<xsubpp> internal functions
+
+=for apidoc AmU||newXSproto|char* name|XSUBADDR_t f|char* filename|const char *proto
+Used by C<xsubpp> to hook up XSUBs as Perl subs.  Adds Perl prototypes to
+the subs.
+
+=for apidoc AmU||XS_VERSION
+The version identifier for an XS module.  This is usually
+handled automatically by C<ExtUtils::MakeMaker>.  See C<XS_VERSION_BOOTCHECK>.
+
+=for apidoc Ams||XS_VERSION_BOOTCHECK
+Macro to verify that a PM module's $VERSION variable matches the XS
+module's C<XS_VERSION> variable.  This is usually handled automatically by
+C<xsubpp>.  See L<perlxs/"The VERSIONCHECK: Keyword">.
+
+=cut
+*/
+
+#define XST_mIV(i,v)  (ST(i) = sv_2mortal(newSViv(v))  )
+#define XST_mUV(i,v)  (ST(i) = sv_2mortal(newSVuv(v))  )
+#define XST_mNV(i,v)  (ST(i) = sv_2mortal(newSVnv(v))  )
+#define XST_mPV(i,v)  (ST(i) = sv_2mortal(newSVpv(v,0)))
+#define XST_mPVN(i,v,n)  (ST(i) = sv_2mortal(newSVpvn(v,n)))
+#define XST_mNO(i)    (ST(i) = &PL_sv_no   )
+#define XST_mYES(i)   (ST(i) = &PL_sv_yes  )
+#define XST_mUNDEF(i) (ST(i) = &PL_sv_undef)
+
+#define XSRETURN(off)					\
+    STMT_START {					\
+	IV tmpXSoff = (off);				\
+	PL_stack_sp = PL_stack_base + ax + (tmpXSoff - 1);	\
+	return;						\
+    } STMT_END
+
+#define XSRETURN_IV(v) STMT_START { XST_mIV(0,v);  XSRETURN(1); } STMT_END
+#define XSRETURN_UV(v) STMT_START { XST_mUV(0,v);  XSRETURN(1); } STMT_END
+#define XSRETURN_NV(v) STMT_START { XST_mNV(0,v);  XSRETURN(1); } STMT_END
+#define XSRETURN_PV(v) STMT_START { XST_mPV(0,v);  XSRETURN(1); } STMT_END
+#define XSRETURN_PVN(v,n) STMT_START { XST_mPVN(0,v,n);  XSRETURN(1); } STMT_END
+#define XSRETURN_NO    STMT_START { XST_mNO(0);    XSRETURN(1); } STMT_END
+#define XSRETURN_YES   STMT_START { XST_mYES(0);   XSRETURN(1); } STMT_END
+#define XSRETURN_UNDEF STMT_START { XST_mUNDEF(0); XSRETURN(1); } STMT_END
+#define XSRETURN_EMPTY STMT_START {                XSRETURN(0); } STMT_END
+
+#define newXSproto(a,b,c,d)	sv_setpv((SV*)newXS(a,b,c), d)
+
+#ifdef XS_VERSION
+#  define XS_VERSION_BOOTCHECK \
+    STMT_START {							\
+	SV *_sv;							\
+	const char *vn = Nullch, *module = SvPV_nolen_const(ST(0));	\
+	if (items >= 2)	 /* version supplied as bootstrap arg */	\
+	    _sv = ST(1);						\
+	else {								\
+	    /* XXX GV_ADDWARN */					\
+	    _sv = get_sv(Perl_form(aTHX_ "%s::%s", module,		\
+				vn = "XS_VERSION"), FALSE);		\
+	    if (!_sv || !SvOK(_sv))					\
+		_sv = get_sv(Perl_form(aTHX_ "%s::%s", module,	\
+				    vn = "VERSION"), FALSE);		\
+	}								\
+	if (_sv && (!SvOK(_sv) || strNE(XS_VERSION, SvPV_nolen_const(_sv))))	\
+	    Perl_croak(aTHX_ "%s object version %s does not match %s%s%s%s %"SVf,\
+		  module, XS_VERSION,					\
+		  vn ? "$" : "", vn ? module : "", vn ? "::" : "",	\
+		  vn ? vn : "bootstrap parameter", _sv);		\
+    } STMT_END
+#else
+#  define XS_VERSION_BOOTCHECK
+#endif
+
+/* 
+   The DBM_setFilter & DBM_ckFilter macros are only used by 
+   the *DB*_File modules 
+*/
+
+#define DBM_setFilter(db_type,code)				\
+	{							\
+	    if (db_type)					\
+	        RETVAL = sv_mortalcopy(db_type) ;		\
+	    ST(0) = RETVAL ;					\
+	    if (db_type && (code == &PL_sv_undef)) {		\
+                SvREFCNT_dec(db_type) ;				\
+	        db_type = NULL ;				\
+	    }							\
+	    else if (code) {					\
+	        if (db_type)					\
+	            sv_setsv(db_type, code) ;			\
+	        else						\
+	            db_type = newSVsv(code) ;			\
+	    }	    						\
+	}
+
+#define DBM_ckFilter(arg,type,name)				\
+	if (db->type) {						\
+	    if (db->filtering) {				\
+	        croak("recursion detected in %s", name) ;	\
+	    }                     				\
+	    ENTER ;						\
+	    SAVETMPS ;						\
+	    SAVEINT(db->filtering) ;				\
+	    db->filtering = TRUE ;				\
+	    SAVESPTR(DEFSV) ;					\
+            if (name[7] == 's')                                 \
+                arg = newSVsv(arg);                             \
+	    DEFSV = arg ;					\
+	    SvTEMP_off(arg) ;					\
+	    PUSHMARK(SP) ;					\
+	    PUTBACK ;						\
+	    (void) perl_call_sv(db->type, G_DISCARD); 		\
+	    SPAGAIN ;						\
+	    PUTBACK ;						\
+	    FREETMPS ;						\
+	    LEAVE ;						\
+            if (name[7] == 's'){                                \
+                arg = sv_2mortal(arg);                          \
+            }                                                   \
+            SvOKp(arg);                                         \
+	}
+
+#if 1		/* for compatibility */
+#  define VTBL_sv		&PL_vtbl_sv
+#  define VTBL_env		&PL_vtbl_env
+#  define VTBL_envelem		&PL_vtbl_envelem
+#  define VTBL_sig		&PL_vtbl_sig
+#  define VTBL_sigelem		&PL_vtbl_sigelem
+#  define VTBL_pack		&PL_vtbl_pack
+#  define VTBL_packelem		&PL_vtbl_packelem
+#  define VTBL_dbline		&PL_vtbl_dbline
+#  define VTBL_isa		&PL_vtbl_isa
+#  define VTBL_isaelem		&PL_vtbl_isaelem
+#  define VTBL_arylen		&PL_vtbl_arylen
+#  define VTBL_glob		&PL_vtbl_glob
+#  define VTBL_mglob		&PL_vtbl_mglob
+#  define VTBL_nkeys		&PL_vtbl_nkeys
+#  define VTBL_taint		&PL_vtbl_taint
+#  define VTBL_substr		&PL_vtbl_substr
+#  define VTBL_vec		&PL_vtbl_vec
+#  define VTBL_pos		&PL_vtbl_pos
+#  define VTBL_bm		&PL_vtbl_bm
+#  define VTBL_fm		&PL_vtbl_fm
+#  define VTBL_uvar		&PL_vtbl_uvar
+#  define VTBL_defelem		&PL_vtbl_defelem
+#  define VTBL_regexp		&PL_vtbl_regexp
+#  define VTBL_regdata		&PL_vtbl_regdata
+#  define VTBL_regdatum		&PL_vtbl_regdatum
+#  ifdef USE_LOCALE_COLLATE
+#    define VTBL_collxfrm	&PL_vtbl_collxfrm
+#  endif
+#  define VTBL_amagic		&PL_vtbl_amagic
+#  define VTBL_amagicelem	&PL_vtbl_amagicelem
+#endif
+
+#include "perlapi.h"
+
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_GET_CONTEXT) && !defined(PERL_CORE)
+#  undef aTHX
+#  undef aTHX_
+#  define aTHX		PERL_GET_THX
+#  define aTHX_		aTHX,
+#endif
+
+#if defined(PERL_IMPLICIT_SYS) && !defined(PERL_CORE)
+#  ifndef NO_XSLOCKS
+# if defined (NETWARE) && defined (USE_STDIO)
+#    define times		PerlProc_times
+#    define setuid		PerlProc_setuid
+#    define setgid		PerlProc_setgid
+#    define getpid		PerlProc_getpid
+#    define pause		PerlProc_pause
+#    define exit		PerlProc_exit
+#    define _exit		PerlProc__exit
+# else
+#    undef closedir
+#    undef opendir
+#    undef stdin
+#    undef stdout
+#    undef stderr
+#    undef feof
+#    undef ferror
+#    undef fgetpos
+#    undef ioctl
+#    undef getlogin
+#    undef setjmp
+#    undef getc
+#    undef ungetc
+#    undef fileno
+
+/* Following symbols were giving redefinition errors while building extensions - sgp 17th Oct 2000 */
+#ifdef NETWARE
+#	undef readdir
+#	undef fstat
+#	undef stat
+#	undef longjmp
+#	undef endhostent
+#	undef endnetent
+#	undef endprotoent
+#	undef endservent
+#	undef gethostbyaddr
+#	undef gethostbyname
+#	undef gethostent
+#	undef getnetbyaddr
+#	undef getnetbyname
+#	undef getnetent
+#	undef getprotobyname
+#	undef getprotobynumber
+#	undef getprotoent
+#	undef getservbyname
+#	undef getservbyport
+#	undef getservent
+#	undef inet_ntoa
+#	undef sethostent
+#	undef setnetent
+#	undef setprotoent
+#	undef setservent
+#endif	/* NETWARE */
+
+#    undef  socketpair
+
+#    define mkdir		PerlDir_mkdir
+#    define chdir		PerlDir_chdir
+#    define rmdir		PerlDir_rmdir
+#    define closedir		PerlDir_close
+#    define opendir		PerlDir_open
+#    define readdir		PerlDir_read
+#    define rewinddir		PerlDir_rewind
+#    define seekdir		PerlDir_seek
+#    define telldir		PerlDir_tell
+#    define putenv		PerlEnv_putenv
+#    define getenv		PerlEnv_getenv
+#    define uname		PerlEnv_uname
+#    define stdin		PerlSIO_stdin
+#    define stdout		PerlSIO_stdout
+#    define stderr		PerlSIO_stderr
+#    define fopen		PerlSIO_fopen
+#    define fclose		PerlSIO_fclose
+#    define feof		PerlSIO_feof
+#    define ferror		PerlSIO_ferror
+#    define clearerr		PerlSIO_clearerr
+#    define getc		PerlSIO_getc
+#    define fputc		PerlSIO_fputc
+#    define fputs		PerlSIO_fputs
+#    define fflush		PerlSIO_fflush
+#    define ungetc		PerlSIO_ungetc
+#    define fileno		PerlSIO_fileno
+#    define fdopen		PerlSIO_fdopen
+#    define freopen		PerlSIO_freopen
+#    define fread		PerlSIO_fread
+#    define fwrite		PerlSIO_fwrite
+#    define setbuf		PerlSIO_setbuf
+#    define setvbuf		PerlSIO_setvbuf
+#    define setlinebuf		PerlSIO_setlinebuf
+#    define stdoutf		PerlSIO_stdoutf
+#    define vfprintf		PerlSIO_vprintf
+#    define ftell		PerlSIO_ftell
+#    define fseek		PerlSIO_fseek
+#    define fgetpos		PerlSIO_fgetpos
+#    define fsetpos		PerlSIO_fsetpos
+#    define frewind		PerlSIO_rewind
+#    define tmpfile		PerlSIO_tmpfile
+#    define access		PerlLIO_access
+#    define chmod		PerlLIO_chmod
+#    define chsize		PerlLIO_chsize
+#    define close		PerlLIO_close
+#    define dup			PerlLIO_dup
+#    define dup2		PerlLIO_dup2
+#    define flock		PerlLIO_flock
+#    define fstat		PerlLIO_fstat
+#    define ioctl		PerlLIO_ioctl
+#    define isatty		PerlLIO_isatty
+#    define link                PerlLIO_link
+#    define lseek		PerlLIO_lseek
+#    define lstat		PerlLIO_lstat
+#    define mktemp		PerlLIO_mktemp
+#    define open		PerlLIO_open
+#    define read		PerlLIO_read
+#    define rename		PerlLIO_rename
+#    define setmode		PerlLIO_setmode
+#    define stat(buf,sb)	PerlLIO_stat(buf,sb)
+#    define tmpnam		PerlLIO_tmpnam
+#    define umask		PerlLIO_umask
+#    define unlink		PerlLIO_unlink
+#    define utime		PerlLIO_utime
+#    define write		PerlLIO_write
+#    define malloc		PerlMem_malloc
+#    define realloc		PerlMem_realloc
+#    define free		PerlMem_free
+#    define abort		PerlProc_abort
+#    define exit		PerlProc_exit
+#    define _exit		PerlProc__exit
+#    define execl		PerlProc_execl
+#    define execv		PerlProc_execv
+#    define execvp		PerlProc_execvp
+#    define getuid		PerlProc_getuid
+#    define geteuid		PerlProc_geteuid
+#    define getgid		PerlProc_getgid
+#    define getegid		PerlProc_getegid
+#    define getlogin		PerlProc_getlogin
+#    define kill		PerlProc_kill
+#    define killpg		PerlProc_killpg
+#    define pause		PerlProc_pause
+#    define popen		PerlProc_popen
+#    define pclose		PerlProc_pclose
+#    define pipe		PerlProc_pipe
+#    define setuid		PerlProc_setuid
+#    define setgid		PerlProc_setgid
+#    define sleep		PerlProc_sleep
+#    define times		PerlProc_times
+#    define wait		PerlProc_wait
+#    define setjmp		PerlProc_setjmp
+#    define longjmp		PerlProc_longjmp
+#    define signal		PerlProc_signal
+#    define getpid		PerlProc_getpid
+#    define gettimeofday	PerlProc_gettimeofday
+#    define htonl		PerlSock_htonl
+#    define htons		PerlSock_htons
+#    define ntohl		PerlSock_ntohl
+#    define ntohs		PerlSock_ntohs
+#    define accept		PerlSock_accept
+#    define bind		PerlSock_bind
+#    define connect		PerlSock_connect
+#    define endhostent		PerlSock_endhostent
+#    define endnetent		PerlSock_endnetent
+#    define endprotoent		PerlSock_endprotoent
+#    define endservent		PerlSock_endservent
+#    define gethostbyaddr	PerlSock_gethostbyaddr
+#    define gethostbyname	PerlSock_gethostbyname
+#    define gethostent		PerlSock_gethostent
+#    define gethostname		PerlSock_gethostname
+#    define getnetbyaddr	PerlSock_getnetbyaddr
+#    define getnetbyname	PerlSock_getnetbyname
+#    define getnetent		PerlSock_getnetent
+#    define getpeername		PerlSock_getpeername
+#    define getprotobyname	PerlSock_getprotobyname
+#    define getprotobynumber	PerlSock_getprotobynumber
+#    define getprotoent		PerlSock_getprotoent
+#    define getservbyname	PerlSock_getservbyname
+#    define getservbyport	PerlSock_getservbyport
+#    define getservent		PerlSock_getservent
+#    define getsockname		PerlSock_getsockname
+#    define getsockopt		PerlSock_getsockopt
+#    define inet_addr		PerlSock_inet_addr
+#    define inet_ntoa		PerlSock_inet_ntoa
+#    define listen		PerlSock_listen
+#    define recv		PerlSock_recv
+#    define recvfrom		PerlSock_recvfrom
+#    define select		PerlSock_select
+#    define send		PerlSock_send
+#    define sendto		PerlSock_sendto
+#    define sethostent		PerlSock_sethostent
+#    define setnetent		PerlSock_setnetent
+#    define setprotoent		PerlSock_setprotoent
+#    define setservent		PerlSock_setservent
+#    define setsockopt		PerlSock_setsockopt
+#    define shutdown		PerlSock_shutdown
+#    define socket		PerlSock_socket
+#    define socketpair		PerlSock_socketpair
+#	endif	/* NETWARE && USE_STDIO */
+
+#    ifdef USE_SOCKETS_AS_HANDLES
+#      undef fd_set
+#      undef FD_SET
+#      undef FD_CLR
+#      undef FD_ISSET
+#      undef FD_ZERO
+#      define fd_set		Perl_fd_set
+#      define FD_SET(n,p)	PERL_FD_SET(n,p)
+#      define FD_CLR(n,p)	PERL_FD_CLR(n,p)
+#      define FD_ISSET(n,p)	PERL_FD_ISSET(n,p)
+#      define FD_ZERO(p)	PERL_FD_ZERO(p)
+#    endif	/* USE_SOCKETS_AS_HANDLES */
+
+#  endif  /* NO_XSLOCKS */
+#endif  /* PERL_IMPLICIT_SYS && !PERL_CORE */
+
+#endif /* _INC_PERL_XSUB_H */		/* include guard */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/arpa/inet.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/arpa/inet.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/arpa/inet.h	(revision 14489)
@@ -0,0 +1,4 @@
+/* 
+ * this is a dummy header file for Socket.xs 
+ */
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/av.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/av.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/av.h	(revision 14489)
@@ -0,0 +1,87 @@
+/*    av.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+struct xpvav {
+    char*	xav_array;      /* pointer to first array element */
+    SSize_t	xav_fill;       /* Index of last element present */
+    SSize_t	xav_max;        /* max index for which array has space */
+    IV		xof_off;	/* ptr is incremented by offset */
+    NV		xnv_nv;		/* numeric value, if any */
+    MAGIC*	xmg_magic;	/* magic for scalar array */
+    HV*		xmg_stash;	/* class package */
+
+    SV**	xav_alloc;	/* pointer to beginning of C array of SVs */
+    SV*		xav_arylen;
+    U8		xav_flags;
+};
+
+
+/* AVf_REAL is set for all AVs whose xav_array contents are refcounted.
+ * Some things like "@_" and the scratchpad list do not set this, to
+ * indicate that they are cheating (for efficiency) by not refcounting
+ * the AV's contents.
+ * 
+ * AVf_REIFY is only meaningful on such "fake" AVs (i.e. where AVf_REAL
+ * is not set).  It indicates that the fake AV is capable of becoming
+ * real if the array needs to be modified in some way.  Functions that
+ * modify fake AVs check both flags to call av_reify() as appropriate.
+ *
+ * Note that the Perl stack and @DB::args have neither flag set. (Thus,
+ * items that go on the stack are never refcounted.)
+ *
+ * These internal details are subject to change any time.  AV
+ * manipulations external to perl should not care about any of this.
+ * GSAR 1999-09-10
+ */
+#define AVf_REAL 1	/* free old entries */
+#define AVf_REIFY 2	/* can become real */
+
+/* XXX this is not used anywhere */
+#define AVf_REUSED 4	/* got undeffed--don't turn old memory into SVs now */
+
+/*
+=head1 Handy Values
+
+=for apidoc AmU||Nullav
+Null AV pointer.
+
+=head1 Array Manipulation Functions
+
+=for apidoc Am|int|AvFILL|AV* av
+Same as C<av_len()>.  Deprecated, use C<av_len()> instead.
+
+=cut
+*/
+
+#define Nullav Null(AV*)
+
+#define AvARRAY(av)	((SV**)((XPVAV*)  SvANY(av))->xav_array)
+#define AvALLOC(av)	((XPVAV*)  SvANY(av))->xav_alloc
+#define AvMAX(av)	((XPVAV*)  SvANY(av))->xav_max
+#define AvFILLp(av)	((XPVAV*)  SvANY(av))->xav_fill
+#define AvARYLEN(av)	((XPVAV*)  SvANY(av))->xav_arylen
+#define AvFLAGS(av)	((XPVAV*)  SvANY(av))->xav_flags
+
+#define AvREAL(av)	(AvFLAGS(av) & AVf_REAL)
+#define AvREAL_on(av)	(AvFLAGS(av) |= AVf_REAL)
+#define AvREAL_off(av)	(AvFLAGS(av) &= ~AVf_REAL)
+#define AvREIFY(av)	(AvFLAGS(av) & AVf_REIFY)
+#define AvREIFY_on(av)	(AvFLAGS(av) |= AVf_REIFY)
+#define AvREIFY_off(av)	(AvFLAGS(av) &= ~AVf_REIFY)
+#define AvREUSED(av)	(AvFLAGS(av) & AVf_REUSED)
+#define AvREUSED_on(av)	(AvFLAGS(av) |= AVf_REUSED)
+#define AvREUSED_off(av) (AvFLAGS(av) &= ~AVf_REUSED)
+
+#define AvREALISH(av)	(AvFLAGS(av) & (AVf_REAL|AVf_REIFY))
+                                          
+#define AvFILL(av)	((SvRMAGICAL((SV *) (av))) \
+			  ? mg_size((SV *) av) : AvFILLp(av))
+
+#define NEGATIVE_INDICES_VAR "NEGATIVE_INDICES"
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/cc_runtime.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/cc_runtime.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/cc_runtime.h	(revision 14489)
@@ -0,0 +1,84 @@
+/*    cc_runtime.h
+ *
+ *    Copyright (C) 1999, 2000, 2001, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#define DOOP(ppname) PUTBACK; PL_op = ppname(aTHX); SPAGAIN
+#define CCPP(s)   OP * s(pTHX)
+
+#define PP_LIST(g) do {			\
+	dMARK;				\
+	if (g != G_ARRAY) {		\
+	    if (++MARK <= SP)		\
+		*MARK = *SP;		\
+	    else			\
+		*MARK = &PL_sv_undef;	\
+	    SP = MARK;			\
+	}				\
+   } while (0)
+
+#define MAYBE_TAINT_SASSIGN_SRC(sv) \
+    if (PL_tainting && PL_tainted && (!SvGMAGICAL(left) || !SvSMAGICAL(left) || \
+        !((mg=mg_find(left, PERL_MAGIC_taint)) && mg->mg_len & 1)))\
+        TAINT_NOT
+
+#define PP_PREINC(sv) do {	\
+	if (SvIOK(sv)) {	\
+            ++SvIVX(sv);	\
+	    SvFLAGS(sv) &= ~(SVf_NOK|SVf_POK|SVp_NOK|SVp_POK); \
+	}			\
+	else			\
+	    sv_inc(sv);		\
+	SvSETMAGIC(sv);		\
+    } while (0)
+
+#define PP_UNSTACK do {		\
+	TAINT_NOT;		\
+	PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;	\
+	FREETMPS;		\
+	oldsave = PL_scopestack[PL_scopestack_ix - 1]; \
+	LEAVE_SCOPE(oldsave);	\
+	SPAGAIN;		\
+    } while(0)
+
+/* Anyone using eval "" deserves this mess */
+#define PP_EVAL(ppaddr, nxt) do {		\
+	dJMPENV;				\
+	int ret;				\
+	PUTBACK;				\
+	JMPENV_PUSH(ret);			\
+	switch (ret) {				\
+	case 0:					\
+	    PL_op = ppaddr(aTHX);		\
+	    PL_retstack[PL_retstack_ix - 1] = Nullop;	\
+	    if (PL_op != nxt) CALLRUNOPS();		\
+	    JMPENV_POP;				\
+	    break;				\
+	case 1: JMPENV_POP; JMPENV_JUMP(1);	\
+	case 2: JMPENV_POP; JMPENV_JUMP(2);	\
+	case 3:					\
+	    JMPENV_POP;				\
+	    if (PL_restartop && PL_restartop != nxt)		\
+		JMPENV_JUMP(3);			\
+	}					\
+	PL_op = nxt;				\
+	SPAGAIN;				\
+    } while (0)
+
+
+#define PP_ENTERTRY(jmpbuf,label)  \
+	STMT_START {                    \
+		int ret;		\
+		JMPENV_PUSH_ENV(jmpbuf,ret);			\
+		switch (ret) {				\
+			case 1: JMPENV_POP_ENV(jmpbuf); JMPENV_JUMP(1);\
+			case 2: JMPENV_POP_ENV(jmpbuf); JMPENV_JUMP(2);\
+			case 3: JMPENV_POP_ENV(jmpbuf); SPAGAIN; goto label;\
+		}                                       \
+	} STMT_END
+#define PP_LEAVETRY \
+	STMT_START{ PL_top_env=PL_top_env->je_prev; }STMT_END
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/config.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/config.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/config.h	(revision 14489)
@@ -0,0 +1,4371 @@
+/*
+ * This file was produced by running the config_h.SH script, which
+ * gets its values from undef, which is generally produced by
+ * running Configure.
+ *
+ * Feel free to modify any of this as the need arises.  Note, however,
+ * that running config_h.SH again will wipe out any changes you've made.
+ * For a more permanent change edit undef and rerun config_h.SH.
+ *
+ * $Id: Config_h.U,v 3.0.1.5 1997/02/28 14:57:43 ram Exp $
+ */
+
+/*
+ * Package name      : perl5
+ * Source directory  : 
+ * Configuration time: Wed Aug  2 11:33:07 2006
+ * Configured by     : shaoqun
+ * Target system     : 
+ */
+
+#ifndef _config_h_
+#define _config_h_
+
+/* LOC_SED:
+ *	This symbol holds the complete pathname to the sed program.
+ */
+#define LOC_SED 	""	/**/
+
+/* HAS_ALARM:
+ *	This symbol, if defined, indicates that the alarm routine is
+ *	available.
+ */
+#define HAS_ALARM		/**/
+
+/* HAS_BCMP:
+ *	This symbol is defined if the bcmp() routine is available to
+ *	compare blocks of memory.
+ */
+/*#define HAS_BCMP	/**/
+
+/* HAS_BCOPY:
+ *	This symbol is defined if the bcopy() routine is available to
+ *	copy blocks of memory.
+ */
+/*#define HAS_BCOPY	/**/
+
+/* HAS_BZERO:
+ *	This symbol is defined if the bzero() routine is available to
+ *	set a memory block to 0.
+ */
+/*#define HAS_BZERO	/**/
+
+/* HAS_CHOWN:
+ *	This symbol, if defined, indicates that the chown routine is
+ *	available.
+ */
+/*#define HAS_CHOWN		/**/
+
+/* HAS_CHROOT:
+ *	This symbol, if defined, indicates that the chroot routine is
+ *	available.
+ */
+/*#define HAS_CHROOT		/**/
+
+/* HAS_CHSIZE:
+ *	This symbol, if defined, indicates that the chsize routine is available
+ *	to truncate files.  You might need a -lx to get this routine.
+ */
+#define	HAS_CHSIZE		/**/
+
+/* HASCONST:
+ *	This symbol, if defined, indicates that this C compiler knows about
+ *	the const type. There is no need to actually test for that symbol
+ *	within your programs. The mere use of the "const" keyword will
+ *	trigger the necessary tests.
+ */
+#define HASCONST	/**/
+#ifndef HASCONST
+#define const
+#endif
+
+/* HAS_CUSERID:
+ *	This symbol, if defined, indicates that the cuserid routine is
+ *	available to get character login names.
+ */
+/*#define HAS_CUSERID		/**/
+
+/* HAS_DBL_DIG:
+ *	This symbol, if defined, indicates that this system's <float.h>
+ *	or <limits.h> defines the symbol DBL_DIG, which is the number
+ *	of significant digits in a double precision number.  If this
+ *	symbol is not defined, a guess of 15 is usually pretty good.
+ */
+#define HAS_DBL_DIG 	/**/
+
+/* HAS_DIFFTIME:
+ *	This symbol, if defined, indicates that the difftime routine is
+ *	available.
+ */
+#define HAS_DIFFTIME		/**/
+
+/* HAS_DLERROR:
+ *	This symbol, if defined, indicates that the dlerror routine is
+ *	available to return a string describing the last error that
+ *	occurred from a call to dlopen(), dlclose() or dlsym().
+ */
+#define HAS_DLERROR	/**/
+
+/* HAS_DUP2:
+ *	This symbol, if defined, indicates that the dup2 routine is
+ *	available to duplicate file descriptors.
+ */
+#define HAS_DUP2	/**/
+
+/* HAS_FCHMOD:
+ *	This symbol, if defined, indicates that the fchmod routine is available
+ *	to change mode of opened files.  If unavailable, use chmod().
+ */
+/*#define HAS_FCHMOD		/**/
+
+/* HAS_FCHOWN:
+ *	This symbol, if defined, indicates that the fchown routine is available
+ *	to change ownership of opened files.  If unavailable, use chown().
+ */
+/*#define HAS_FCHOWN		/**/
+
+/* HAS_FCNTL:
+ *	This symbol, if defined, indicates to the C program that
+ *	the fcntl() function exists.
+ */
+/*#define HAS_FCNTL		/**/
+
+/* HAS_FGETPOS:
+ *	This symbol, if defined, indicates that the fgetpos routine is
+ *	available to get the file position indicator, similar to ftell().
+ */
+#define HAS_FGETPOS	/**/
+
+/* HAS_FLOCK:
+ *	This symbol, if defined, indicates that the flock routine is
+ *	available to do file locking.
+ */
+#define HAS_FLOCK		/**/
+
+/* HAS_FORK:
+ *	This symbol, if defined, indicates that the fork routine is
+ *	available.
+ */
+/*#define HAS_FORK		/**/
+
+/* HAS_FSETPOS:
+ *	This symbol, if defined, indicates that the fsetpos routine is
+ *	available to set the file position indicator, similar to fseek().
+ */
+#define HAS_FSETPOS	/**/
+
+/* HAS_GETTIMEOFDAY:
+ *	This symbol, if defined, indicates that the gettimeofday() system
+ *	call is available for a sub-second accuracy clock. Usually, the file
+ *	<sys/resource.h> needs to be included (see I_SYS_RESOURCE).
+ *	The type "Timeval" should be used to refer to "struct timeval".
+ */
+#define HAS_GETTIMEOFDAY	/**/
+#ifdef HAS_GETTIMEOFDAY
+#define Timeval struct timeval	/* Structure used by gettimeofday() */
+#endif
+
+/* HAS_GETGROUPS:
+ *	This symbol, if defined, indicates that the getgroups() routine is
+ *	available to get the list of process groups.  If unavailable, multiple
+ *	groups are probably not supported.
+ */
+/*#define HAS_GETGROUPS		/**/
+
+/* HAS_GETLOGIN:
+ *	This symbol, if defined, indicates that the getlogin routine is
+ *	available to get the login name.
+ */
+#define HAS_GETLOGIN		/**/
+
+/* HAS_GETPGID:
+ *	This symbol, if defined, indicates to the C program that 
+ *	the getpgid(pid) function is available to get the
+ *	process group id.
+ */
+/*#define HAS_GETPGID		/**/
+
+/* HAS_GETPGRP2:
+ *	This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
+ *	routine is available to get the current process group.
+ */
+/*#define HAS_GETPGRP2		/**/
+
+/* HAS_GETPPID:
+ *	This symbol, if defined, indicates that the getppid routine is
+ *	available to get the parent process ID.
+ */
+/*#define HAS_GETPPID		/**/
+
+/* HAS_GETPRIORITY:
+ *	This symbol, if defined, indicates that the getpriority routine is
+ *	available to get a process's priority.
+ */
+/*#define HAS_GETPRIORITY		/**/
+
+/* HAS_INET_ATON:
+ *	This symbol, if defined, indicates to the C program that the
+ *	inet_aton() function is available to parse IP address "dotted-quad"
+ *	strings.
+ */
+/*#define HAS_INET_ATON		/**/
+
+/* HAS_KILLPG:
+ *	This symbol, if defined, indicates that the killpg routine is available
+ *	to kill process groups.  If unavailable, you probably should use kill
+ *	with a negative process number.
+ */
+/*#define HAS_KILLPG	/**/
+
+/* HAS_LINK:
+ *	This symbol, if defined, indicates that the link routine is
+ *	available to create hard links.
+ */
+#define HAS_LINK	/**/
+
+/* HAS_LOCALECONV:
+ *	This symbol, if defined, indicates that the localeconv routine is
+ *	available for numeric and monetary formatting conventions.
+ */
+#define HAS_LOCALECONV	/**/
+
+/* HAS_LOCKF:
+ *	This symbol, if defined, indicates that the lockf routine is
+ *	available to do file locking.
+ */
+/*#define HAS_LOCKF		/**/
+
+/* HAS_LSTAT:
+ *	This symbol, if defined, indicates that the lstat routine is
+ *	available to do file stats on symbolic links.
+ */
+/*#define HAS_LSTAT		/**/
+
+/* HAS_MBLEN:
+ *	This symbol, if defined, indicates that the mblen routine is available
+ *	to find the number of bytes in a multibye character.
+ */
+#define HAS_MBLEN		/**/
+
+/* HAS_MBSTOWCS:
+ *	This symbol, if defined, indicates that the mbstowcs routine is
+ *	available to covert a multibyte string into a wide character string.
+ */
+#define	HAS_MBSTOWCS		/**/
+
+/* HAS_MBTOWC:
+ *	This symbol, if defined, indicates that the mbtowc routine is available
+ *	to covert a multibyte to a wide character.
+ */
+#define HAS_MBTOWC		/**/
+
+/* HAS_MEMCMP:
+ *	This symbol, if defined, indicates that the memcmp routine is available
+ *	to compare blocks of memory.
+ */
+#define HAS_MEMCMP	/**/
+
+/* HAS_MEMCPY:
+ *	This symbol, if defined, indicates that the memcpy routine is available
+ *	to copy blocks of memory.
+ */
+#define HAS_MEMCPY	/**/
+
+/* HAS_MEMMOVE:
+ *	This symbol, if defined, indicates that the memmove routine is available
+ *	to copy potentially overlapping blocks of memory. This should be used
+ *	only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your
+ *	own version.
+ */
+#define HAS_MEMMOVE	/**/
+
+/* HAS_MEMSET:
+ *	This symbol, if defined, indicates that the memset routine is available
+ *	to set blocks of memory.
+ */
+#define HAS_MEMSET	/**/
+
+/* HAS_MKDIR:
+ *	This symbol, if defined, indicates that the mkdir routine is available
+ *	to create directories.  Otherwise you should fork off a new process to
+ *	exec /bin/mkdir.
+ */
+#define HAS_MKDIR		/**/
+
+/* HAS_MKFIFO:
+ *	This symbol, if defined, indicates that the mkfifo routine is
+ *	available to create FIFOs. Otherwise, mknod should be able to
+ *	do it for you. However, if mkfifo is there, mknod might require
+ *	super-user privileges which mkfifo will not.
+ */
+/*#define HAS_MKFIFO		/**/
+
+/* HAS_MKTIME:
+ *	This symbol, if defined, indicates that the mktime routine is
+ *	available.
+ */
+#define HAS_MKTIME		/**/
+
+/* HAS_MSYNC:
+ *	This symbol, if defined, indicates that the msync system call is
+ *	available to synchronize a mapped file.
+ */
+/*#define HAS_MSYNC		/**/
+
+/* HAS_MUNMAP:
+ *	This symbol, if defined, indicates that the munmap system call is
+ *	available to unmap a region, usually mapped by mmap().
+ */
+/*#define HAS_MUNMAP		/**/
+
+/* HAS_NICE:
+ *	This symbol, if defined, indicates that the nice routine is
+ *	available.
+ */
+/*#define HAS_NICE		/**/
+
+/* HAS_PATHCONF:
+ *	This symbol, if defined, indicates that pathconf() is available
+ *	to determine file-system related limits and options associated
+ *	with a given filename.
+ */
+/* HAS_FPATHCONF:
+ *	This symbol, if defined, indicates that pathconf() is available
+ *	to determine file-system related limits and options associated
+ *	with a given open file descriptor.
+ */
+/*#define HAS_PATHCONF		/**/
+/*#define HAS_FPATHCONF		/**/
+
+/* HAS_PAUSE:
+ *	This symbol, if defined, indicates that the pause routine is
+ *	available to suspend a process until a signal is received.
+ */
+#define HAS_PAUSE		/**/
+
+/* HAS_PIPE:
+ *	This symbol, if defined, indicates that the pipe routine is
+ *	available to create an inter-process channel.
+ */
+#define HAS_PIPE		/**/
+
+/* HAS_POLL:
+ *	This symbol, if defined, indicates that the poll routine is
+ *	available to poll active file descriptors. You may safely
+ *	include <poll.h> when this symbol is defined.
+ */
+/*#define HAS_POLL		/**/
+
+/* HAS_READDIR:
+ *	This symbol, if defined, indicates that the readdir routine is
+ *	available to read directory entries. You may have to include
+ *	<dirent.h>. See I_DIRENT.
+ */
+#define HAS_READDIR		/**/
+
+/* HAS_SEEKDIR:
+ *	This symbol, if defined, indicates that the seekdir routine is
+ *	available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#define HAS_SEEKDIR		/**/
+
+/* HAS_TELLDIR:
+ *	This symbol, if defined, indicates that the telldir routine is
+ *	available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#define HAS_TELLDIR		/**/
+
+/* HAS_REWINDDIR:
+ *	This symbol, if defined, indicates that the rewinddir routine is
+ *	available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#define HAS_REWINDDIR		/**/
+
+/* HAS_READLINK:
+ *	This symbol, if defined, indicates that the readlink routine is
+ *	available to read the value of a symbolic link.
+ */
+/*#define HAS_READLINK		/**/
+
+/* HAS_RENAME:
+ *	This symbol, if defined, indicates that the rename routine is available
+ *	to rename files.  Otherwise you should do the unlink(), link(), unlink()
+ *	trick.
+ */
+#define HAS_RENAME	/**/
+
+/* HAS_RMDIR:
+ *	This symbol, if defined, indicates that the rmdir routine is
+ *	available to remove directories. Otherwise you should fork off a
+ *	new process to exec /bin/rmdir.
+ */
+#define HAS_RMDIR		/**/
+
+/* HAS_SELECT:
+ *	This symbol, if defined, indicates that the select routine is
+ *	available to select active file descriptors. If the timeout field
+ *	is used, <sys/time.h> may need to be included.
+ */
+#define HAS_SELECT	/**/
+
+/* HAS_SETEGID:
+ *	This symbol, if defined, indicates that the setegid routine is available
+ *	to change the effective gid of the current program.
+ */
+/*#define HAS_SETEGID		/**/
+
+/* HAS_SETEUID:
+ *	This symbol, if defined, indicates that the seteuid routine is available
+ *	to change the effective uid of the current program.
+ */
+/*#define HAS_SETEUID		/**/
+
+/* HAS_SETLINEBUF:
+ *	This symbol, if defined, indicates that the setlinebuf routine is
+ *	available to change stderr or stdout from block-buffered or unbuffered
+ *	to a line-buffered mode.
+ */
+/*#define HAS_SETLINEBUF		/**/
+
+/* HAS_SETLOCALE:
+ *	This symbol, if defined, indicates that the setlocale routine is
+ *	available to handle locale-specific ctype implementations.
+ */
+#define HAS_SETLOCALE	/**/
+
+/* HAS_SETPGID:
+ *	This symbol, if defined, indicates that the setpgid(pid, gpid)
+ *	routine is available to set process group ID.
+ */
+/*#define HAS_SETPGID	/**/
+
+/* HAS_SETPGRP2:
+ *	This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
+ *	routine is available to set the current process group.
+ */
+/*#define HAS_SETPGRP2		/**/
+
+/* HAS_SETPRIORITY:
+ *	This symbol, if defined, indicates that the setpriority routine is
+ *	available to set a process's priority.
+ */
+/*#define HAS_SETPRIORITY		/**/
+
+/* HAS_SETREGID:
+ *	This symbol, if defined, indicates that the setregid routine is
+ *	available to change the real and effective gid of the current
+ *	process.
+ */
+/* HAS_SETRESGID:
+ *	This symbol, if defined, indicates that the setresgid routine is
+ *	available to change the real, effective and saved gid of the current
+ *	process.
+ */
+/*#define HAS_SETREGID		/**/
+/*#define HAS_SETRESGID		/**/
+
+/* HAS_SETREUID:
+ *	This symbol, if defined, indicates that the setreuid routine is
+ *	available to change the real and effective uid of the current
+ *	process.
+ */
+/* HAS_SETRESUID:
+ *	This symbol, if defined, indicates that the setresuid routine is
+ *	available to change the real, effective and saved uid of the current
+ *	process.
+ */
+/*#define HAS_SETREUID		/**/
+/*#define HAS_SETRESUID		/**/
+
+/* HAS_SETRGID:
+ *	This symbol, if defined, indicates that the setrgid routine is available
+ *	to change the real gid of the current program.
+ */
+/*#define HAS_SETRGID		/**/
+
+/* HAS_SETRUID:
+ *	This symbol, if defined, indicates that the setruid routine is available
+ *	to change the real uid of the current program.
+ */
+/*#define HAS_SETRUID		/**/
+
+/* HAS_SETSID:
+ *	This symbol, if defined, indicates that the setsid routine is
+ *	available to set the process group ID.
+ */
+/*#define HAS_SETSID	/**/
+
+/* HAS_STRCHR:
+ *	This symbol is defined to indicate that the strchr()/strrchr()
+ *	functions are available for string searching. If not, try the
+ *	index()/rindex() pair.
+ */
+/* HAS_INDEX:
+ *	This symbol is defined to indicate that the index()/rindex()
+ *	functions are available for string searching.
+ */
+#define HAS_STRCHR	/**/
+/*#define HAS_INDEX	/**/
+
+/* HAS_STRCOLL:
+ *	This symbol, if defined, indicates that the strcoll routine is
+ *	available to compare strings using collating information.
+ */
+#define HAS_STRCOLL	/**/
+
+/* USE_STRUCT_COPY:
+ *	This symbol, if defined, indicates that this C compiler knows how
+ *	to copy structures.  If undefined, you'll need to use a block copy
+ *	routine of some sort instead.
+ */
+#define	USE_STRUCT_COPY	/**/
+
+/* HAS_STRTOD:
+ *	This symbol, if defined, indicates that the strtod routine is
+ *	available to provide better numeric string conversion than atof().
+ */
+#define HAS_STRTOD	/**/
+
+/* HAS_STRTOL:
+ *	This symbol, if defined, indicates that the strtol routine is available
+ *	to provide better numeric string conversion than atoi() and friends.
+ */
+#define HAS_STRTOL	/**/
+
+/* HAS_STRXFRM:
+ *	This symbol, if defined, indicates that the strxfrm() routine is
+ *	available to transform strings.
+ */
+#define HAS_STRXFRM	/**/
+
+/* HAS_SYMLINK:
+ *	This symbol, if defined, indicates that the symlink routine is available
+ *	to create symbolic links.
+ */
+/*#define HAS_SYMLINK	/**/
+
+/* HAS_SYSCALL:
+ *	This symbol, if defined, indicates that the syscall routine is
+ *	available to call arbitrary system calls. If undefined, that's tough.
+ */
+/*#define HAS_SYSCALL	/**/
+
+/* HAS_SYSCONF:
+ *	This symbol, if defined, indicates that sysconf() is available
+ *	to determine system related limits and options.
+ */
+/*#define HAS_SYSCONF	/**/
+
+/* HAS_SYSTEM:
+ *	This symbol, if defined, indicates that the system routine is
+ *	available to issue a shell command.
+ */
+#define HAS_SYSTEM	/**/
+
+/* HAS_TCGETPGRP:
+ *	This symbol, if defined, indicates that the tcgetpgrp routine is
+ *	available to get foreground process group ID.
+ */
+/*#define HAS_TCGETPGRP		/**/
+
+/* HAS_TCSETPGRP:
+ *	This symbol, if defined, indicates that the tcsetpgrp routine is
+ *	available to set foreground process group ID.
+ */
+/*#define HAS_TCSETPGRP		/**/
+
+/* HAS_TRUNCATE:
+ *	This symbol, if defined, indicates that the truncate routine is
+ *	available to truncate files.
+ */
+/*#define HAS_TRUNCATE	/**/
+
+/* HAS_TZNAME:
+ *	This symbol, if defined, indicates that the tzname[] array is
+ *	available to access timezone names.
+ */
+#define HAS_TZNAME		/**/
+
+/* HAS_UMASK:
+ *	This symbol, if defined, indicates that the umask routine is
+ *	available to set and get the value of the file creation mask.
+ */
+#define HAS_UMASK		/**/
+
+/* HAS_USLEEP:
+ *	This symbol, if defined, indicates that the usleep routine is
+ *	available to let the process sleep on a sub-second accuracy.
+ */
+/*#define HAS_USLEEP		/**/
+
+/* HASVOLATILE:
+ *	This symbol, if defined, indicates that this C compiler knows about
+ *	the volatile declaration.
+ */
+#define	HASVOLATILE	/**/
+#ifndef HASVOLATILE
+#define volatile
+#endif
+
+/* HAS_WAIT4:
+ *	This symbol, if defined, indicates that wait4() exists.
+ */
+/*#define HAS_WAIT4	/**/
+
+/* HAS_WAITPID:
+ *	This symbol, if defined, indicates that the waitpid routine is
+ *	available to wait for child process.
+ */
+#define HAS_WAITPID	/**/
+
+/* HAS_WCSTOMBS:
+ *	This symbol, if defined, indicates that the wcstombs routine is
+ *	available to convert wide character strings to multibyte strings.
+ */
+#define HAS_WCSTOMBS	/**/
+
+/* HAS_WCTOMB:
+ *	This symbol, if defined, indicates that the wctomb routine is available
+ *	to covert a wide character to a multibyte.
+ */
+#define HAS_WCTOMB		/**/
+
+/* I_ARPA_INET:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <arpa/inet.h> to get inet_addr and friends declarations.
+ */
+#define	I_ARPA_INET		/**/
+
+/* I_DBM:
+ *	This symbol, if defined, indicates that <dbm.h> exists and should
+ *	be included.
+ */
+/* I_RPCSVC_DBM:
+ *	This symbol, if defined, indicates that <rpcsvc/dbm.h> exists and
+ *	should be included.
+ */
+/*#define I_DBM	/**/
+#define I_RPCSVC_DBM	/**/
+
+/* I_DIRENT:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <dirent.h>. Using this symbol also triggers the definition
+ *	of the Direntry_t define which ends up being 'struct dirent' or
+ *	'struct direct' depending on the availability of <dirent.h>.
+ */
+/* DIRNAMLEN:
+ *	This symbol, if defined, indicates to the C program that the length
+ *	of directory entry names is provided by a d_namlen field.  Otherwise
+ *	you need to do strlen() on the d_name field.
+ */
+/* Direntry_t:
+ *	This symbol is set to 'struct direct' or 'struct dirent' depending on
+ *	whether dirent is available or not. You should use this pseudo type to
+ *	portably declare your directory entries.
+ */
+#define I_DIRENT		/**/
+#define DIRNAMLEN	/**/
+#define Direntry_t struct direct
+
+/* I_DLFCN:
+ *	This symbol, if defined, indicates that <dlfcn.h> exists and should
+ *	be included.
+ */
+#define I_DLFCN		/**/
+
+/* I_FCNTL:
+ *	This manifest constant tells the C program to include <fcntl.h>.
+ */
+#define I_FCNTL	/**/
+
+/* I_FLOAT:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <float.h> to get definition of symbols like DBL_MAX or
+ *	DBL_MIN, i.e. machine dependent floating point values.
+ */
+#define I_FLOAT		/**/
+
+/* I_LIMITS:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <limits.h> to get definition of symbols like WORD_BIT or
+ *	LONG_MAX, i.e. machine dependant limitations.
+ */
+#define I_LIMITS		/**/
+
+/* I_LOCALE:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <locale.h>.
+ */
+#define	I_LOCALE		/**/
+
+/* I_MATH:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <math.h>.
+ */
+#define I_MATH		/**/
+
+/* I_MEMORY:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <memory.h>.
+ */
+/*#define I_MEMORY		/**/
+
+/* I_NET_ERRNO:
+ *	This symbol, if defined, indicates that <net/errno.h> exists and 
+ *	should be included.
+ */
+/*#define I_NET_ERRNO		/**/
+
+/* I_NETINET_IN:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <netinet/in.h>. Otherwise, you may try <sys/in.h>.
+ */
+/*#define I_NETINET_IN	/**/
+
+/* I_SFIO:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sfio.h>.
+ */
+/*#define	I_SFIO		/**/
+
+/* I_STDDEF:
+ *	This symbol, if defined, indicates that <stddef.h> exists and should
+ *	be included.
+ */
+#define I_STDDEF	/**/
+
+/* I_STDLIB:
+ *	This symbol, if defined, indicates that <stdlib.h> exists and should
+ *	be included.
+ */
+#define I_STDLIB		/**/
+
+/* I_STRING:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <string.h> (USG systems) instead of <strings.h> (BSD systems).
+ */
+#define I_STRING		/**/
+
+/* I_SYS_DIR:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/dir.h>.
+ */
+/*#define I_SYS_DIR		/**/
+
+/* I_SYS_FILE:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/file.h> to get definition of R_OK and friends.
+ */
+/*#define I_SYS_FILE		/**/
+
+/* I_SYS_IOCTL:
+ *	This symbol, if defined, indicates that <sys/ioctl.h> exists and should
+ *	be included. Otherwise, include <sgtty.h> or <termio.h>.
+ */
+/* I_SYS_SOCKIO:
+ *	This symbol, if defined, indicates the <sys/sockio.h> should be included
+ *	to get socket ioctl options, like SIOCATMARK.
+ */
+/*#define	I_SYS_IOCTL		/**/
+/*#define I_SYS_SOCKIO	/**/
+
+/* I_SYS_NDIR:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/ndir.h>.
+ */
+/*#define I_SYS_NDIR	/**/
+
+/* I_SYS_PARAM:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/param.h>.
+ */
+/*#define I_SYS_PARAM		/**/
+
+/* I_SYS_RESOURCE:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/resource.h>.
+ */
+/*#define I_SYS_RESOURCE		/**/
+
+/* I_SYS_SELECT:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/select.h> in order to get definition of struct timeval.
+ */
+/*#define I_SYS_SELECT	/**/
+
+/* I_SYS_STAT:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/stat.h>.
+ */
+#define	I_SYS_STAT		/**/
+
+/* I_SYS_TIMES:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/times.h>.
+ */
+/*#define	I_SYS_TIMES		/**/
+
+/* I_SYS_TYPES:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/types.h>.
+ */
+#define	I_SYS_TYPES		/**/
+
+/* I_SYS_UN:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/un.h> to get UNIX domain socket definitions.
+ */
+/*#define I_SYS_UN		/**/
+
+/* I_SYS_WAIT:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/wait.h>.
+ */
+/*#define I_SYS_WAIT	/**/
+
+/* I_TERMIO:
+ *	This symbol, if defined, indicates that the program should include
+ *	<termio.h> rather than <sgtty.h>.  There are also differences in
+ *	the ioctl() calls that depend on the value of this symbol.
+ */
+/* I_TERMIOS:
+ *	This symbol, if defined, indicates that the program should include
+ *	the POSIX termios.h rather than sgtty.h or termio.h.
+ *	There are also differences in the ioctl() calls that depend on the
+ *	value of this symbol.
+ */
+/* I_SGTTY:
+ *	This symbol, if defined, indicates that the program should include
+ *	<sgtty.h> rather than <termio.h>.  There are also differences in
+ *	the ioctl() calls that depend on the value of this symbol.
+ */
+/*#define I_TERMIO		/**/
+/*#define I_TERMIOS		/**/
+/*#define I_SGTTY		/**/
+
+/* I_UNISTD:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <unistd.h>.
+ */
+/*#define I_UNISTD		/**/
+
+/* I_UTIME:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <utime.h>.
+ */
+#define I_UTIME		/**/
+
+/* I_VALUES:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <values.h> to get definition of symbols like MINFLOAT or
+ *	MAXLONG, i.e. machine dependant limitations.  Probably, you
+ *	should use <limits.h> instead, if it is available.
+ */
+/*#define I_VALUES		/**/
+
+/* I_VFORK:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include vfork.h.
+ */
+/*#define I_VFORK	/**/
+
+/* HAS_ACCESSX:
+ *	This symbol, if defined, indicates that the accessx routine is
+ *	available to do extended access checks.
+ */
+/*#define HAS_ACCESSX		/**/
+
+/* HAS_EACCESS:
+ *	This symbol, if defined, indicates that the eaccess routine is
+ *	available to do extended access checks.
+ */
+/*#define HAS_EACCESS		/**/
+
+/* I_SYS_ACCESS:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/access.h>.
+ */
+/*#define   I_SYS_ACCESS                /**/
+
+/* I_SYS_SECURITY:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/security.h>.
+ */
+/*#define   I_SYS_SECURITY	/**/
+
+/* OSNAME:
+ *	This symbol contains the name of the operating system, as determined
+ *	by Configure.  You shouldn't rely on it too much; the specific
+ *	feature tests from Configure are generally more reliable.
+ */
+/* OSVERS:
+ *	This symbol contains the version of the operating system, as determined
+ *	by Configure.  You shouldn't rely on it too much; the specific
+ *	feature tests from Configure are generally more reliable.
+ */
+#define OSNAME "MSWin32"		/**/
+#define OSVERS "5.1"		/**/
+
+/* USE_CROSS_COMPILE:
+ *	This symbol, if defined, indicates that Perl is being cross-compiled.
+ */
+/* PERL_TARGETARCH:
+ *	This symbol, if defined, indicates the target architecture
+ *	Perl has been cross-compiled to.  Undefined if not a cross-compile.
+ */
+#ifndef USE_CROSS_COMPILE
+/*#define	USE_CROSS_COMPILE	/**/
+#define	PERL_TARGETARCH	""	/**/
+#endif
+
+/* MULTIARCH:
+ *	This symbol, if defined, signifies that the build
+ *	process will produce some binary files that are going to be
+ *	used in a cross-platform environment.  This is the case for
+ *	example with the NeXT "fat" binaries that contain executables
+ *	for several CPUs.
+ */
+/*#define MULTIARCH		/**/
+
+/* MEM_ALIGNBYTES:
+ *	This symbol contains the number of bytes required to align a
+ *	double, or a long double when applicable. Usual values are 2,
+ *	4 and 8. The default is eight, for safety.
+ */
+#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH)
+#  define MEM_ALIGNBYTES 8
+#else
+#define MEM_ALIGNBYTES 8
+#endif
+
+/* ARCHLIB:
+ *	This variable, if defined, holds the name of the directory in
+ *	which the user wants to put architecture-dependent public
+ *	library files for perl5.  It is most often a local directory
+ *	such as /usr/local/lib.  Programs using this variable must be
+ *	prepared to deal with filename expansion.  If ARCHLIB is the
+ *	same as PRIVLIB, it is not defined, since presumably the
+ *	program already searches PRIVLIB.
+ */
+/* ARCHLIB_EXP:
+ *	This symbol contains the ~name expanded version of ARCHLIB, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define ARCHLIB "c:\\shaoqunWu\\perl\\lib"		/**/
+/*#define ARCHLIB_EXP ""	/**/
+
+/* ARCHNAME:
+ *	This symbol holds a string representing the architecture name.
+ *	It may be used to construct an architecture-dependant pathname
+ *	where library files may be held under a private library, for
+ *	instance.
+ */
+#define ARCHNAME "MSWin32-x86-multi-thread"		/**/
+
+/* HAS_ATOLF:
+ *	This symbol, if defined, indicates that the atolf routine is
+ *	available to convert strings into long doubles.
+ */
+/*#define HAS_ATOLF		/**/
+
+/* HAS_ATOLL:
+ *	This symbol, if defined, indicates that the atoll routine is
+ *	available to convert strings into long longs.
+ */
+/*#define HAS_ATOLL		/**/
+
+/* BIN:
+ *	This symbol holds the path of the bin directory where the package will
+ *	be installed. Program must be prepared to deal with ~name substitution.
+ */
+/* BIN_EXP:
+ *	This symbol is the filename expanded version of the BIN symbol, for
+ *	programs that do not want to deal with that at run-time.
+ */
+#define BIN "c:\\shaoqunWu\\perl\\bin"	/**/
+#define BIN_EXP "c:\\shaoqunWu\\perl\\bin"	/**/
+
+/* INTSIZE:
+ *	This symbol contains the value of sizeof(int) so that the C
+ *	preprocessor can make decisions based on it.
+ */
+/* LONGSIZE:
+ *	This symbol contains the value of sizeof(long) so that the C
+ *	preprocessor can make decisions based on it.
+ */
+/* SHORTSIZE:
+ *	This symbol contains the value of sizeof(short) so that the C
+ *	preprocessor can make decisions based on it.
+ */
+#define INTSIZE 4		/**/
+#define LONGSIZE 4		/**/
+#define SHORTSIZE 2		/**/
+
+/* BYTEORDER:
+ *	This symbol holds the hexadecimal constant defined in byteorder,
+ *	in a UV, i.e. 0x1234 or 0x4321 or 0x12345678, etc...
+ *	If the compiler supports cross-compiling or multiple-architecture
+ *	binaries (eg. on NeXT systems), use compiler-defined macros to
+ *	determine the byte order.
+ *	On NeXT 3.2 (and greater), you can build "Fat" Multiple Architecture
+ *	Binaries (MAB) on either big endian or little endian machines.
+ *	The endian-ness is available at compile-time.  This only matters
+ *	for perl, where the config.h can be generated and installed on 
+ *	one system, and used by a different architecture to build an
+ *	extension.  Older versions of NeXT that might not have
+ *	defined either *_ENDIAN__ were all on Motorola 680x0 series,
+ *	so the default case (for NeXT) is big endian to catch them. 
+ *	This might matter for NeXT 3.0.
+ */
+#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH)
+#  ifdef __LITTLE_ENDIAN__
+#    if LONGSIZE == 4
+#      define BYTEORDER 0x1234
+#    else
+#      if LONGSIZE == 8
+#        define BYTEORDER 0x12345678
+#      endif
+#    endif
+#  else
+#    ifdef __BIG_ENDIAN__
+#      if LONGSIZE == 4
+#        define BYTEORDER 0x4321
+#      else
+#        if LONGSIZE == 8
+#          define BYTEORDER 0x87654321
+#        endif
+#      endif
+#    endif
+#  endif
+#  if !defined(BYTEORDER) && (defined(NeXT) || defined(__NeXT__))
+#    define BYTEORDER 0x4321
+#  endif
+#else
+#define BYTEORDER 0x1234	/* large digits for MSB */
+#endif /* NeXT */
+
+/* CAT2:
+ *	This macro concatenates 2 tokens together.
+ */
+/* STRINGIFY:
+ *	This macro surrounds its token with double quotes.
+ */
+#if 42 == 1
+#define CAT2(a,b)	a/**/b
+#define STRINGIFY(a)	"a"
+		/* If you can get stringification with catify, tell me how! */
+#endif
+#if 42 == 42
+#define PeRl_CaTiFy(a, b)	a ## b	
+#define PeRl_StGiFy(a)	#a
+/* the additional level of indirection enables these macros to be
+ * used as arguments to other macros.  See K&R 2nd ed., page 231. */
+#define CAT2(a,b)	PeRl_CaTiFy(a,b)
+#define StGiFy(a)	PeRl_StGiFy(a)
+#define STRINGIFY(a)	PeRl_StGiFy(a)
+#endif
+#if 42 != 1 && 42 != 42
+#   include "Bletch: How does this C preprocessor concatenate tokens?"
+#endif
+
+/* CPPSTDIN:
+ *	This symbol contains the first part of the string which will invoke
+ *	the C preprocessor on the standard input and produce to standard
+ *	output.	 Typical value of "cc -E" or "/lib/cpp", but it can also
+ *	call a wrapper. See CPPRUN.
+ */
+/* CPPMINUS:
+ *	This symbol contains the second part of the string which will invoke
+ *	the C preprocessor on the standard input and produce to standard
+ *	output.  This symbol will have the value "-" if CPPSTDIN needs a minus
+ *	to specify standard input, otherwise the value is "".
+ */
+/* CPPRUN:
+ *	This symbol contains the string which will invoke a C preprocessor on
+ *	the standard input and produce to standard output. It needs to end
+ *	with CPPLAST, after all other preprocessor flags have been specified.
+ *	The main difference with CPPSTDIN is that this program will never be a
+ *	pointer to a shell wrapper, i.e. it will be empty if no preprocessor is
+ *	available directly to the user. Note that it may well be different from
+ *	the preprocessor used to compile the C program.
+ */
+/* CPPLAST:
+ *	This symbol is intended to be used along with CPPRUN in the same manner
+ *	symbol CPPMINUS is used with CPPSTDIN. It contains either "-" or "".
+ */
+#define CPPSTDIN "cppstdin"
+#define CPPMINUS ""
+#define CPPRUN "cl -nologo -E"
+#define CPPLAST ""
+
+/* HAS__FWALK:
+ *	This symbol, if defined, indicates that the _fwalk system call is
+ *	available to apply a function to all the file handles.
+ */
+/*#define HAS__FWALK		/**/
+
+/* HAS_ACCESS:
+ *	This manifest constant lets the C program know that the access()
+ *	system call is available to check for accessibility using real UID/GID.
+ *	(always present on UNIX.)
+ */
+#define HAS_ACCESS		/**/
+
+/* HAS_ASCTIME_R:
+ *	This symbol, if defined, indicates that the asctime_r routine
+ *	is available to asctime re-entrantly.
+ */
+/* ASCTIME_R_PROTO:
+ *	This symbol encodes the prototype of asctime_r.
+ *	It is zero if d_asctime_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_asctime_r
+ *	is defined.
+ */
+/*#define HAS_ASCTIME_R	   /**/
+#define ASCTIME_R_PROTO 0	   /**/
+
+/* CASTI32:
+ *	This symbol is defined if the C compiler can cast negative
+ *	or large floating point numbers to 32-bit ints.
+ */
+/*#define	CASTI32		/**/
+
+/* CASTNEGFLOAT:
+ *	This symbol is defined if the C compiler can cast negative
+ *	numbers to unsigned longs, ints and shorts.
+ */
+/* CASTFLAGS:
+ *	This symbol contains flags that say what difficulties the compiler
+ *	has casting odd floating values to unsigned long:
+ *		0 = ok
+ *		1 = couldn't cast < 0
+ *		2 = couldn't cast >= 0x80000000
+ *		4 = couldn't cast in argument expression list
+ */
+#define	CASTNEGFLOAT		/**/
+#define CASTFLAGS 0		/**/
+
+/* HAS_CLASS:
+ *	This symbol, if defined, indicates that the class routine is
+ *	available to classify doubles.  Available for example in AIX.
+ *	The returned values are defined in <float.h> and are:
+ *
+ *	FP_PLUS_NORM	Positive normalized, nonzero
+ *	FP_MINUS_NORM	Negative normalized, nonzero
+ *	FP_PLUS_DENORM	Positive denormalized, nonzero
+ *	FP_MINUS_DENORM	Negative denormalized, nonzero
+ *	FP_PLUS_ZERO	+0.0
+ *	FP_MINUS_ZERO	-0.0
+ *	FP_PLUS_INF	+INF
+ *	FP_MINUS_INF	-INF
+ *	FP_NANS		Signaling Not a Number (NaNS)
+ *	FP_NANQ		Quiet Not a Number (NaNQ)
+ */
+/*#define HAS_CLASS		/**/
+
+/* VOID_CLOSEDIR:
+ *	This symbol, if defined, indicates that the closedir() routine
+ *	does not return a value.
+ */
+/*#define VOID_CLOSEDIR		/**/
+
+/* HAS_STRUCT_CMSGHDR:
+ *	This symbol, if defined, indicates that the struct cmsghdr
+ *	is supported.
+ */
+/*#define HAS_STRUCT_CMSGHDR	/**/
+
+/* HAS_CRYPT_R:
+ *	This symbol, if defined, indicates that the crypt_r routine
+ *	is available to crypt re-entrantly.
+ */
+/* CRYPT_R_PROTO:
+ *	This symbol encodes the prototype of crypt_r.
+ *	It is zero if d_crypt_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_crypt_r
+ *	is defined.
+ */
+/*#define HAS_CRYPT_R	   /**/
+#define CRYPT_R_PROTO 0	   /**/
+
+/* HAS_CSH:
+ *	This symbol, if defined, indicates that the C-shell exists.
+ */
+/* CSH:
+ *	This symbol, if defined, contains the full pathname of csh.
+ */
+/*#define HAS_CSH		/**/
+#ifdef HAS_CSH
+#define CSH ""	/**/
+#endif
+
+/* HAS_CTIME_R:
+ *	This symbol, if defined, indicates that the ctime_r routine
+ *	is available to ctime re-entrantly.
+ */
+/* CTIME_R_PROTO:
+ *	This symbol encodes the prototype of ctime_r.
+ *	It is zero if d_ctime_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctime_r
+ *	is defined.
+ */
+/*#define HAS_CTIME_R	   /**/
+#define CTIME_R_PROTO 0	   /**/
+
+/* DLSYM_NEEDS_UNDERSCORE:
+ *	This symbol, if defined, indicates that we need to prepend an
+ *	underscore to the symbol name before calling dlsym().  This only
+ *	makes sense if you *have* dlsym, which we will presume is the
+ *	case if you're using dl_dlopen.xs.
+ */
+/*#define 	DLSYM_NEEDS_UNDERSCORE 	/**/
+
+/* HAS_DRAND48_R:
+ *	This symbol, if defined, indicates that the drand48_r routine
+ *	is available to drand48 re-entrantly.
+ */
+/* DRAND48_R_PROTO:
+ *	This symbol encodes the prototype of drand48_r.
+ *	It is zero if d_drand48_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_drand48_r
+ *	is defined.
+ */
+/*#define HAS_DRAND48_R	   /**/
+#define DRAND48_R_PROTO 0	   /**/
+
+/* HAS_DRAND48_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the drand48() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern double drand48(void);
+ */
+/*#define	HAS_DRAND48_PROTO	/**/
+
+/* HAS_ENDGRENT:
+ *	This symbol, if defined, indicates that the getgrent routine is
+ *	available for finalizing sequential access of the group database.
+ */
+/*#define HAS_ENDGRENT		/**/
+
+/* HAS_ENDGRENT_R:
+ *	This symbol, if defined, indicates that the endgrent_r routine
+ *	is available to endgrent re-entrantly.
+ */
+/* ENDGRENT_R_PROTO:
+ *	This symbol encodes the prototype of endgrent_r.
+ *	It is zero if d_endgrent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endgrent_r
+ *	is defined.
+ */
+/*#define HAS_ENDGRENT_R	   /**/
+#define ENDGRENT_R_PROTO 0	   /**/
+
+/* HAS_ENDHOSTENT:
+ *	This symbol, if defined, indicates that the endhostent() routine is
+ *	available to close whatever was being used for host queries.
+ */
+/*#define HAS_ENDHOSTENT		/**/
+
+/* HAS_ENDNETENT:
+ *	This symbol, if defined, indicates that the endnetent() routine is
+ *	available to close whatever was being used for network queries.
+ */
+/*#define HAS_ENDNETENT		/**/
+
+/* HAS_ENDPROTOENT:
+ *	This symbol, if defined, indicates that the endprotoent() routine is
+ *	available to close whatever was being used for protocol queries.
+ */
+/*#define HAS_ENDPROTOENT		/**/
+
+/* HAS_ENDPWENT:
+ *	This symbol, if defined, indicates that the getgrent routine is
+ *	available for finalizing sequential access of the passwd database.
+ */
+/*#define HAS_ENDPWENT		/**/
+
+/* HAS_ENDPWENT_R:
+ *	This symbol, if defined, indicates that the endpwent_r routine
+ *	is available to endpwent re-entrantly.
+ */
+/* ENDPWENT_R_PROTO:
+ *	This symbol encodes the prototype of endpwent_r.
+ *	It is zero if d_endpwent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endpwent_r
+ *	is defined.
+ */
+/*#define HAS_ENDPWENT_R	   /**/
+#define ENDPWENT_R_PROTO 0	   /**/
+
+/* HAS_ENDSERVENT:
+ *	This symbol, if defined, indicates that the endservent() routine is
+ *	available to close whatever was being used for service queries.
+ */
+/*#define HAS_ENDSERVENT		/**/
+
+/* HAS_FCHDIR:
+ *	This symbol, if defined, indicates that the fchdir routine is
+ *	available to change directory using a file descriptor.
+ */
+/*#define HAS_FCHDIR		/**/
+
+/* FCNTL_CAN_LOCK:
+ *	This symbol, if defined, indicates that fcntl() can be used
+ *	for file locking.  Normally on Unix systems this is defined.
+ *	It may be undefined on VMS.
+ */
+/*#define FCNTL_CAN_LOCK		/**/
+
+/* HAS_FD_SET:
+ *	This symbol, when defined, indicates presence of the fd_set typedef
+ *	in <sys/types.h>
+ */
+#define HAS_FD_SET	/**/
+
+/* HAS_FINITE:
+ *	This symbol, if defined, indicates that the finite routine is
+ *	available to check whether a double is finite (non-infinity non-NaN).
+ */
+/*#define HAS_FINITE		/**/
+
+/* HAS_FINITEL:
+ *	This symbol, if defined, indicates that the finitel routine is
+ *	available to check whether a long double is finite
+ *	(non-infinity non-NaN).
+ */
+/*#define HAS_FINITEL		/**/
+
+/* FLEXFILENAMES:
+ *	This symbol, if defined, indicates that the system supports filenames
+ *	longer than 14 characters.
+ */
+#define	FLEXFILENAMES		/**/
+
+/* HAS_FP_CLASS:
+ *	This symbol, if defined, indicates that the fp_class routine is
+ *	available to classify doubles.  Available for example in Digital UNIX.
+ *	The returned values are defined in <math.h> and are:
+ *
+ *	FP_SNAN           Signaling NaN (Not-a-Number)
+ *	FP_QNAN           Quiet NaN (Not-a-Number)
+ *	FP_POS_INF        +infinity
+ *	FP_NEG_INF        -infinity
+ *	FP_POS_NORM       Positive normalized
+ *	FP_NEG_NORM       Negative normalized
+ *	FP_POS_DENORM     Positive denormalized
+ *	FP_NEG_DENORM     Negative denormalized
+ *	FP_POS_ZERO       +0.0 (positive zero)
+ *	FP_NEG_ZERO       -0.0 (negative zero)
+ */
+/*#define HAS_FP_CLASS		/**/
+
+/* HAS_FPCLASS:
+ *	This symbol, if defined, indicates that the fpclass routine is
+ *	available to classify doubles.  Available for example in Solaris/SVR4.
+ *	The returned values are defined in <ieeefp.h> and are:
+ *
+ *	FP_SNAN		signaling NaN
+ *	FP_QNAN		quiet NaN
+ *	FP_NINF		negative infinity
+ *	FP_PINF		positive infinity
+ *	FP_NDENORM	negative denormalized non-zero
+ *	FP_PDENORM	positive denormalized non-zero
+ *	FP_NZERO	negative zero
+ *	FP_PZERO	positive zero
+ *	FP_NNORM	negative normalized non-zero
+ *	FP_PNORM	positive normalized non-zero
+ */
+/*#define HAS_FPCLASS		/**/
+
+/* HAS_FPCLASSIFY:
+ *	This symbol, if defined, indicates that the fpclassify routine is
+ *	available to classify doubles.  Available for example in HP-UX.
+ *	The returned values are defined in <math.h> and are
+ *
+ *           FP_NORMAL     Normalized
+ *           FP_ZERO       Zero
+ *           FP_INFINITE   Infinity
+ *           FP_SUBNORMAL  Denormalized
+ *           FP_NAN        NaN
+ *
+ */
+/*#define HAS_FPCLASSIFY		/**/
+
+/* HAS_FPOS64_T:
+ *	This symbol will be defined if the C compiler supports fpos64_t.
+ */
+/*#define	HAS_FPOS64_T    	/**/
+
+/* HAS_FREXPL:
+ *	This symbol, if defined, indicates that the frexpl routine is
+ *	available to break a long double floating-point number into
+ *	a normalized fraction and an integral power of 2.
+ */
+/*#define HAS_FREXPL		/**/
+
+/* HAS_STRUCT_FS_DATA:
+ *	This symbol, if defined, indicates that the struct fs_data
+ *	to do statfs() is supported.
+ */
+/*#define HAS_STRUCT_FS_DATA	/**/
+
+/* HAS_FSEEKO:
+ *	This symbol, if defined, indicates that the fseeko routine is
+ *	available to fseek beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FSEEKO		/**/
+
+/* HAS_FSTATFS:
+ *	This symbol, if defined, indicates that the fstatfs routine is
+ *	available to stat filesystems by file descriptors.
+ */
+/*#define HAS_FSTATFS		/**/
+
+/* HAS_FSYNC:
+ *	This symbol, if defined, indicates that the fsync routine is
+ *	available to write a file's modified data and attributes to
+ *	permanent storage.
+ */
+/*#define HAS_FSYNC		/**/
+
+/* HAS_FTELLO:
+ *	This symbol, if defined, indicates that the ftello routine is
+ *	available to ftell beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FTELLO		/**/
+
+/* HAS_FUTIMES:
+ *	This symbol, if defined, indicates that the futimes routine is
+ *	available to change file descriptor time stamps with struct timevals.
+ */
+/*#define HAS_FUTIMES		/**/
+
+/* Gconvert:
+ *	This preprocessor macro is defined to convert a floating point
+ *	number to a string without a trailing decimal point.  This
+ *	emulates the behavior of sprintf("%g"), but is sometimes much more
+ *	efficient.  If gconvert() is not available, but gcvt() drops the
+ *	trailing decimal point, then gcvt() is used.  If all else fails,
+ *	a macro using sprintf("%g") is used. Arguments for the Gconvert
+ *	macro are: value, number of digits, whether trailing zeros should
+ *	be retained, and the output buffer.
+ *	The usual values are:
+ *		d_Gconvert='gconvert((x),(n),(t),(b))'
+ *		d_Gconvert='gcvt((x),(n),(b))'
+ *		d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+ *	The last two assume trailing zeros should not be kept.
+ */
+#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))
+
+/* HAS_GETCWD:
+ *	This symbol, if defined, indicates that the getcwd routine is
+ *	available to get the current working directory.
+ */
+#define HAS_GETCWD		/**/
+
+/* HAS_GETESPWNAM:
+ *	This symbol, if defined, indicates that the getespwnam system call is
+ *	available to retrieve enchanced (shadow) password entries by name.
+ */
+/*#define HAS_GETESPWNAM		/**/
+
+/* HAS_GETFSSTAT:
+ *	This symbol, if defined, indicates that the getfsstat routine is
+ *	available to stat filesystems in bulk.
+ */
+/*#define HAS_GETFSSTAT		/**/
+
+/* HAS_GETGRENT:
+ *	This symbol, if defined, indicates that the getgrent routine is
+ *	available for sequential access of the group database.
+ */
+/*#define HAS_GETGRENT		/**/
+
+/* HAS_GETGRENT_R:
+ *	This symbol, if defined, indicates that the getgrent_r routine
+ *	is available to getgrent re-entrantly.
+ */
+/* GETGRENT_R_PROTO:
+ *	This symbol encodes the prototype of getgrent_r.
+ *	It is zero if d_getgrent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrent_r
+ *	is defined.
+ */
+/*#define HAS_GETGRENT_R	   /**/
+#define GETGRENT_R_PROTO 0	   /**/
+
+/* HAS_GETGRGID_R:
+ *	This symbol, if defined, indicates that the getgrgid_r routine
+ *	is available to getgrgid re-entrantly.
+ */
+/* GETGRGID_R_PROTO:
+ *	This symbol encodes the prototype of getgrgid_r.
+ *	It is zero if d_getgrgid_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrgid_r
+ *	is defined.
+ */
+/*#define HAS_GETGRGID_R	   /**/
+#define GETGRGID_R_PROTO 0	   /**/
+
+/* HAS_GETGRNAM_R:
+ *	This symbol, if defined, indicates that the getgrnam_r routine
+ *	is available to getgrnam re-entrantly.
+ */
+/* GETGRNAM_R_PROTO:
+ *	This symbol encodes the prototype of getgrnam_r.
+ *	It is zero if d_getgrnam_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrnam_r
+ *	is defined.
+ */
+/*#define HAS_GETGRNAM_R	   /**/
+#define GETGRNAM_R_PROTO 0	   /**/
+
+/* HAS_GETHOSTBYADDR:
+ *	This symbol, if defined, indicates that the gethostbyaddr() routine is
+ *	available to look up hosts by their IP addresses.
+ */
+#define HAS_GETHOSTBYADDR		/**/
+
+/* HAS_GETHOSTBYNAME:
+ *	This symbol, if defined, indicates that the gethostbyname() routine is
+ *	available to look up host names in some data base or other.
+ */
+#define HAS_GETHOSTBYNAME		/**/
+
+/* HAS_GETHOSTENT:
+ *	This symbol, if defined, indicates that the gethostent() routine is
+ *	available to look up host names in some data base or another.
+ */
+/*#define HAS_GETHOSTENT		/**/
+
+/* HAS_GETHOSTNAME:
+ *	This symbol, if defined, indicates that the C program may use the
+ *	gethostname() routine to derive the host name.  See also HAS_UNAME
+ *	and PHOSTNAME.
+ */
+/* HAS_UNAME:
+ *	This symbol, if defined, indicates that the C program may use the
+ *	uname() routine to derive the host name.  See also HAS_GETHOSTNAME
+ *	and PHOSTNAME.
+ */
+/* PHOSTNAME:
+ *	This symbol, if defined, indicates the command to feed to the
+ *	popen() routine to derive the host name.  See also HAS_GETHOSTNAME
+ *	and HAS_UNAME.	Note that the command uses a fully qualified path,
+ *	so that it is safe even if used by a process with super-user
+ *	privileges.
+ */
+/* HAS_PHOSTNAME:
+ *	This symbol, if defined, indicates that the C program may use the
+ *	contents of PHOSTNAME as a command to feed to the popen() routine
+ *	to derive the host name.
+ */
+#define HAS_GETHOSTNAME	/**/
+#define HAS_UNAME		/**/
+/*#define HAS_PHOSTNAME	/**/
+#ifdef HAS_PHOSTNAME
+#define PHOSTNAME ""	/* How to get the host name */
+#endif
+
+/* HAS_GETHOST_PROTOS:
+ *	This symbol, if defined, indicates that <netdb.h> includes
+ *	prototypes for gethostent(), gethostbyname(), and
+ *	gethostbyaddr().  Otherwise, it is up to the program to guess
+ *	them.  See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#define	HAS_GETHOST_PROTOS	/**/
+
+/* HAS_GETITIMER:
+ *	This symbol, if defined, indicates that the getitimer routine is
+ *	available to return interval timers.
+ */
+/*#define HAS_GETITIMER		/**/
+
+/* HAS_GETLOGIN_R:
+ *	This symbol, if defined, indicates that the getlogin_r routine
+ *	is available to getlogin re-entrantly.
+ */
+/* GETLOGIN_R_PROTO:
+ *	This symbol encodes the prototype of getlogin_r.
+ *	It is zero if d_getlogin_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getlogin_r
+ *	is defined.
+ */
+/*#define HAS_GETLOGIN_R	   /**/
+#define GETLOGIN_R_PROTO 0	   /**/
+
+/* HAS_GETMNT:
+ *	This symbol, if defined, indicates that the getmnt routine is
+ *	available to get filesystem mount info by filename.
+ */
+/*#define HAS_GETMNT		/**/
+
+/* HAS_GETMNTENT:
+ *	This symbol, if defined, indicates that the getmntent routine is
+ *	available to iterate through mounted file systems to get their info.
+ */
+/*#define HAS_GETMNTENT		/**/
+
+/* HAS_GETNETBYADDR:
+ *	This symbol, if defined, indicates that the getnetbyaddr() routine is
+ *	available to look up networks by their IP addresses.
+ */
+/*#define HAS_GETNETBYADDR		/**/
+
+/* HAS_GETNETBYNAME:
+ *	This symbol, if defined, indicates that the getnetbyname() routine is
+ *	available to look up networks by their names.
+ */
+/*#define HAS_GETNETBYNAME		/**/
+
+/* HAS_GETNETENT:
+ *	This symbol, if defined, indicates that the getnetent() routine is
+ *	available to look up network names in some data base or another.
+ */
+/*#define HAS_GETNETENT		/**/
+
+/* HAS_GETNET_PROTOS:
+ *	This symbol, if defined, indicates that <netdb.h> includes
+ *	prototypes for getnetent(), getnetbyname(), and
+ *	getnetbyaddr().  Otherwise, it is up to the program to guess
+ *	them.  See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+/*#define	HAS_GETNET_PROTOS	/**/
+
+/* HAS_GETPAGESIZE:
+ *	This symbol, if defined, indicates that the getpagesize system call
+ *	is available to get system page size, which is the granularity of
+ *	many memory management calls.
+ */
+/*#define HAS_GETPAGESIZE		/**/
+
+/* HAS_GETPROTOENT:
+ *	This symbol, if defined, indicates that the getprotoent() routine is
+ *	available to look up protocols in some data base or another.
+ */
+/*#define HAS_GETPROTOENT		/**/
+
+/* HAS_GETPGRP:
+ *	This symbol, if defined, indicates that the getpgrp routine is
+ *	available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ *	This symbol, if defined, indicates that getpgrp needs one
+ *	arguments whereas USG one needs none.
+ */
+/*#define HAS_GETPGRP		/**/
+/*#define USE_BSD_GETPGRP	/**/
+
+/* HAS_GETPROTOBYNAME:
+ *	This symbol, if defined, indicates that the getprotobyname()
+ *	routine is available to look up protocols by their name.
+ */
+/* HAS_GETPROTOBYNUMBER:
+ *	This symbol, if defined, indicates that the getprotobynumber()
+ *	routine is available to look up protocols by their number.
+ */
+#define HAS_GETPROTOBYNAME		/**/
+#define HAS_GETPROTOBYNUMBER		/**/
+
+/* HAS_GETPROTO_PROTOS:
+ *	This symbol, if defined, indicates that <netdb.h> includes
+ *	prototypes for getprotoent(), getprotobyname(), and
+ *	getprotobyaddr().  Otherwise, it is up to the program to guess
+ *	them.  See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#define	HAS_GETPROTO_PROTOS	/**/
+
+/* HAS_GETPRPWNAM:
+ *	This symbol, if defined, indicates that the getprpwnam system call is
+ *	available to retrieve protected (shadow) password entries by name.
+ */
+/*#define HAS_GETPRPWNAM		/**/
+
+/* HAS_GETPWENT:
+ *	This symbol, if defined, indicates that the getpwent routine is
+ *	available for sequential access of the passwd database.
+ *	If this is not available, the older getpw() function may be available.
+ */
+/*#define HAS_GETPWENT		/**/
+
+/* HAS_GETPWENT_R:
+ *	This symbol, if defined, indicates that the getpwent_r routine
+ *	is available to getpwent re-entrantly.
+ */
+/* GETPWENT_R_PROTO:
+ *	This symbol encodes the prototype of getpwent_r.
+ *	It is zero if d_getpwent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwent_r
+ *	is defined.
+ */
+/*#define HAS_GETPWENT_R	   /**/
+#define GETPWENT_R_PROTO 0	   /**/
+
+/* HAS_GETPWNAM_R:
+ *	This symbol, if defined, indicates that the getpwnam_r routine
+ *	is available to getpwnam re-entrantly.
+ */
+/* GETPWNAM_R_PROTO:
+ *	This symbol encodes the prototype of getpwnam_r.
+ *	It is zero if d_getpwnam_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwnam_r
+ *	is defined.
+ */
+/*#define HAS_GETPWNAM_R	   /**/
+#define GETPWNAM_R_PROTO 0	   /**/
+
+/* HAS_GETPWUID_R:
+ *	This symbol, if defined, indicates that the getpwuid_r routine
+ *	is available to getpwuid re-entrantly.
+ */
+/* GETPWUID_R_PROTO:
+ *	This symbol encodes the prototype of getpwuid_r.
+ *	It is zero if d_getpwuid_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwuid_r
+ *	is defined.
+ */
+/*#define HAS_GETPWUID_R	   /**/
+#define GETPWUID_R_PROTO 0	   /**/
+
+/* HAS_GETSERVENT:
+ *	This symbol, if defined, indicates that the getservent() routine is
+ *	available to look up network services in some data base or another.
+ */
+/*#define HAS_GETSERVENT		/**/
+
+/* HAS_GETSERV_PROTOS:
+ *	This symbol, if defined, indicates that <netdb.h> includes
+ *	prototypes for getservent(), getservbyname(), and
+ *	getservbyaddr().  Otherwise, it is up to the program to guess
+ *	them.  See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#define	HAS_GETSERV_PROTOS	/**/
+
+/* HAS_GETSPNAM:
+ *	This symbol, if defined, indicates that the getspnam system call is
+ *	available to retrieve SysV shadow password entries by name.
+ */
+/*#define HAS_GETSPNAM		/**/
+
+/* HAS_GETSPNAM_R:
+ *	This symbol, if defined, indicates that the getspnam_r routine
+ *	is available to getspnam re-entrantly.
+ */
+/* GETSPNAM_R_PROTO:
+ *	This symbol encodes the prototype of getspnam_r.
+ *	It is zero if d_getspnam_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getspnam_r
+ *	is defined.
+ */
+/*#define HAS_GETSPNAM_R	   /**/
+#define GETSPNAM_R_PROTO 0	   /**/
+
+/* HAS_GETSERVBYNAME:
+ *	This symbol, if defined, indicates that the getservbyname()
+ *	routine is available to look up services by their name.
+ */
+/* HAS_GETSERVBYPORT:
+ *	This symbol, if defined, indicates that the getservbyport()
+ *	routine is available to look up services by their port.
+ */
+#define HAS_GETSERVBYNAME		/**/
+#define HAS_GETSERVBYPORT		/**/
+
+/* HAS_GMTIME_R:
+ *	This symbol, if defined, indicates that the gmtime_r routine
+ *	is available to gmtime re-entrantly.
+ */
+/* GMTIME_R_PROTO:
+ *	This symbol encodes the prototype of gmtime_r.
+ *	It is zero if d_gmtime_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_gmtime_r
+ *	is defined.
+ */
+/*#define HAS_GMTIME_R	   /**/
+#define GMTIME_R_PROTO 0	   /**/
+
+/* HAS_GNULIBC:
+ *	This symbol, if defined, indicates to the C program that 
+ *	the GNU C library is being used.  A better check is to use
+ *	the __GLIBC__ and __GLIBC_MINOR__ symbols supplied with glibc.
+ */
+/*#define HAS_GNULIBC  	/**/
+#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE)
+#   define _GNU_SOURCE
+#endif
+/* HAS_HASMNTOPT:
+ *	This symbol, if defined, indicates that the hasmntopt routine is
+ *	available to query the mount options of file systems.
+ */
+/*#define HAS_HASMNTOPT		/**/
+
+/* HAS_HTONL:
+ *	This symbol, if defined, indicates that the htonl() routine (and
+ *	friends htons() ntohl() ntohs()) are available to do network
+ *	order byte swapping.
+ */
+/* HAS_HTONS:
+ *	This symbol, if defined, indicates that the htons() routine (and
+ *	friends htonl() ntohl() ntohs()) are available to do network
+ *	order byte swapping.
+ */
+/* HAS_NTOHL:
+ *	This symbol, if defined, indicates that the ntohl() routine (and
+ *	friends htonl() htons() ntohs()) are available to do network
+ *	order byte swapping.
+ */
+/* HAS_NTOHS:
+ *	This symbol, if defined, indicates that the ntohs() routine (and
+ *	friends htonl() htons() ntohl()) are available to do network
+ *	order byte swapping.
+ */
+#define HAS_HTONL		/**/
+#define HAS_HTONS		/**/
+#define HAS_NTOHL		/**/
+#define HAS_NTOHS		/**/
+
+/* HAS_INT64_T:
+ *     This symbol will defined if the C compiler supports int64_t.
+ *     Usually the <inttypes.h> needs to be included, but sometimes
+ *	<sys/types.h> is enough.
+ */
+/*#define     HAS_INT64_T               /**/
+
+/* HAS_ISASCII:
+ *	This manifest constant lets the C program know that isascii 
+ *	is available.
+ */
+#define HAS_ISASCII		/**/
+
+/* HAS_ISFINITE:
+ *	This symbol, if defined, indicates that the isfinite routine is
+ *	available to check whether a double is finite (non-infinity non-NaN).
+ */
+/*#define HAS_ISFINITE		/**/
+
+/* HAS_ISINF:
+ *	This symbol, if defined, indicates that the isinf routine is
+ *	available to check whether a double is an infinity.
+ */
+/*#define HAS_ISINF		/**/
+
+/* HAS_ISNAN:
+ *	This symbol, if defined, indicates that the isnan routine is
+ *	available to check whether a double is a NaN.
+ */
+#define HAS_ISNAN		/**/
+
+/* HAS_ISNANL:
+ *	This symbol, if defined, indicates that the isnanl routine is
+ *	available to check whether a long double is a NaN.
+ */
+/*#define HAS_ISNANL		/**/
+
+/* HAS_LCHOWN:
+ *	This symbol, if defined, indicates that the lchown routine is
+ *	available to operate on a symbolic link (instead of following the
+ *	link).
+ */
+/*#define HAS_LCHOWN		/**/
+
+/* HAS_LDBL_DIG:
+ *	This symbol, if defined, indicates that this system's <float.h>
+ *	or <limits.h> defines the symbol LDBL_DIG, which is the number
+ *	of significant digits in a long double precision number. Unlike
+ *	for DBL_DIG, there's no good guess for LDBL_DIG if it is undefined.
+ */
+#define HAS_LDBL_DIG 	/**/
+
+/* HAS_LOCALTIME_R:
+ *	This symbol, if defined, indicates that the localtime_r routine
+ *	is available to localtime re-entrantly.
+ */
+/* LOCALTIME_R_PROTO:
+ *	This symbol encodes the prototype of localtime_r.
+ *	It is zero if d_localtime_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_localtime_r
+ *	is defined.
+ */
+/*#define HAS_LOCALTIME_R	   /**/
+#define LOCALTIME_R_PROTO 0	   /**/
+
+/* HAS_LONG_DOUBLE:
+ *	This symbol will be defined if the C compiler supports long
+ *	doubles.
+ */
+/* LONG_DOUBLESIZE:
+ *	This symbol contains the size of a long double, so that the 
+ *	C preprocessor can make decisions based on it.  It is only
+ *	defined if the system supports long doubles.
+ */
+#define HAS_LONG_DOUBLE		/**/
+#ifdef HAS_LONG_DOUBLE
+#define LONG_DOUBLESIZE 10		/**/
+#endif
+
+/* HAS_LONG_LONG:
+ *	This symbol will be defined if the C compiler supports long long.
+ */
+/* LONGLONGSIZE:
+ *	This symbol contains the size of a long long, so that the 
+ *	C preprocessor can make decisions based on it.  It is only
+ *	defined if the system supports long long.
+ */
+/*#define HAS_LONG_LONG		/**/
+#ifdef HAS_LONG_LONG
+#define LONGLONGSIZE 8		/**/
+#endif
+
+/* HAS_LSEEK_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the lseek() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern off_t lseek(int, off_t, int);
+ */
+#define	HAS_LSEEK_PROTO	/**/
+
+/* HAS_MADVISE:
+ *	This symbol, if defined, indicates that the madvise system call is
+ *	available to map a file into memory.
+ */
+/*#define HAS_MADVISE		/**/
+
+/* HAS_MALLOC_SIZE:
+ *	This symbol, if defined, indicates that the malloc_size
+ *	routine is available for use.
+ */
+/*#define HAS_MALLOC_SIZE		/**/
+
+/* HAS_MALLOC_GOOD_SIZE:
+ *	This symbol, if defined, indicates that the malloc_good_size
+ *	routine is available for use.
+ */
+/*#define HAS_MALLOC_GOOD_SIZE	/**/
+
+/* HAS_MEMCHR:
+ *	This symbol, if defined, indicates that the memchr routine is available
+ *	to locate characters within a C string.
+ */
+#define HAS_MEMCHR	/**/
+
+/* HAS_MKDTEMP:
+ *	This symbol, if defined, indicates that the mkdtemp routine is
+ *	available to exclusively create a uniquely named temporary directory.
+ */
+/*#define HAS_MKDTEMP		/**/
+
+/* HAS_MKSTEMP:
+ *	This symbol, if defined, indicates that the mkstemp routine is
+ *	available to exclusively create and open a uniquely named
+ *	temporary file.
+ */
+/*#define HAS_MKSTEMP		/**/
+
+/* HAS_MKSTEMPS:
+ *	This symbol, if defined, indicates that the mkstemps routine is
+ *	available to excluslvely create and open a uniquely named
+ *	(with a suffix) temporary file.
+ */
+/*#define HAS_MKSTEMPS		/**/
+
+/* HAS_MMAP:
+ *	This symbol, if defined, indicates that the mmap system call is
+ *	available to map a file into memory.
+ */
+/* Mmap_t:
+ *	This symbol holds the return type of the mmap() system call
+ *	(and simultaneously the type of the first argument).
+ *	Usually set to 'void *' or 'cadd_t'.
+ */
+/*#define HAS_MMAP		/**/
+#define Mmap_t void *	/**/
+
+/* HAS_MODFL:
+ *	This symbol, if defined, indicates that the modfl routine is
+ *	available to split a long double x into a fractional part f and
+ *	an integer part i such that |f| < 1.0 and (f + i) = x.
+ */
+/* HAS_MODFL_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the modfl() function.  Otherwise, it is up
+ *	to the program to supply one.
+ */
+/* HAS_MODFL_POW32_BUG:
+ *	This symbol, if defined, indicates that the modfl routine is
+ *	broken for long doubles >= pow(2, 32).
+ *	For example from 4294967303.150000 one would get 4294967302.000000
+ *	and 1.150000.  The bug has been seen in certain versions of glibc,
+ *	release 2.2.2 is known to be okay.
+ */
+/*#define HAS_MODFL		/**/
+/*#define HAS_MODFL_PROTO		/**/
+/*#define HAS_MODFL_POW32_BUG		/**/
+
+/* HAS_MPROTECT:
+ *	This symbol, if defined, indicates that the mprotect system call is
+ *	available to modify the access protection of a memory mapped file.
+ */
+/*#define HAS_MPROTECT		/**/
+
+/* HAS_MSG:
+ *	This symbol, if defined, indicates that the entire msg*(2) library is
+ *	supported (IPC mechanism based on message queues).
+ */
+/*#define HAS_MSG		/**/
+
+/* HAS_STRUCT_MSGHDR:
+ *	This symbol, if defined, indicates that the struct msghdr
+ *	is supported.
+ */
+/*#define HAS_STRUCT_MSGHDR	/**/
+
+/* HAS_OFF64_T:
+ *	This symbol will be defined if the C compiler supports off64_t.
+ */
+/*#define	HAS_OFF64_T    		/**/
+
+/* HAS_OPEN3:
+ *	This manifest constant lets the C program know that the three
+ *	argument form of open(2) is available.
+ */
+/*#define HAS_OPEN3		/**/
+
+/* OLD_PTHREAD_CREATE_JOINABLE:
+ *	This symbol, if defined, indicates how to create pthread
+ *	in joinable (aka undetached) state.  NOTE: not defined
+ *	if pthread.h already has defined PTHREAD_CREATE_JOINABLE
+ *	(the new version of the constant).
+ *	If defined, known values are PTHREAD_CREATE_UNDETACHED
+ *	and __UNDETACHED.
+ */
+/*#define OLD_PTHREAD_CREATE_JOINABLE  /**/
+
+/* HAS_PTHREAD_YIELD:
+ *	This symbol, if defined, indicates that the pthread_yield 
+ *	routine is available to yield the execution of the current
+ *	thread.	 sched_yield is preferable to pthread_yield.
+ */
+/* SCHED_YIELD:
+ *	This symbol defines the way to yield the execution of
+ *	the current thread.  Known ways are sched_yield,
+ *	pthread_yield, and pthread_yield with NULL.
+ */
+/* HAS_SCHED_YIELD:
+ *	This symbol, if defined, indicates that the sched_yield
+ *	routine is available to yield the execution of the current
+ *	thread.	 sched_yield is preferable to pthread_yield.
+ */
+/*#define HAS_PTHREAD_YIELD	/**/
+#define SCHED_YIELD		/**/
+/*#define HAS_SCHED_YIELD	/**/
+
+/* HAS_RANDOM_R:
+ *	This symbol, if defined, indicates that the random_r routine
+ *	is available to random re-entrantly.
+ */
+/* RANDOM_R_PROTO:
+ *	This symbol encodes the prototype of random_r.
+ *	It is zero if d_random_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_random_r
+ *	is defined.
+ */
+/*#define HAS_RANDOM_R	   /**/
+#define RANDOM_R_PROTO 0	   /**/
+
+/* HAS_READDIR_R:
+ *	This symbol, if defined, indicates that the readdir_r routine
+ *	is available to readdir re-entrantly.
+ */
+/* READDIR_R_PROTO:
+ *	This symbol encodes the prototype of readdir_r.
+ *	It is zero if d_readdir_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir_r
+ *	is defined.
+ */
+/*#define HAS_READDIR_R	   /**/
+#define READDIR_R_PROTO 0	   /**/
+
+/* HAS_READV:
+ *	This symbol, if defined, indicates that the readv routine is
+ *	available to do gather reads.  You will also need <sys/uio.h>
+ *	and there I_SYSUIO.
+ */
+/*#define HAS_READV		/**/
+
+/* HAS_RECVMSG:
+ *	This symbol, if defined, indicates that the recvmsg routine is
+ *	available to send structured socket messages.
+ */
+/*#define HAS_RECVMSG		/**/
+
+/* HAS_SAFE_BCOPY:
+ *	This symbol, if defined, indicates that the bcopy routine is available
+ *	to copy potentially overlapping memory blocks. Normally, you should
+ *	probably use memmove() or memcpy(). If neither is defined, roll your
+ *	own version.
+ */
+/*#define HAS_SAFE_BCOPY	/**/
+
+/* HAS_SAFE_MEMCPY:
+ *	This symbol, if defined, indicates that the memcpy routine is available
+ *	to copy potentially overlapping memory blocks.  If you need to
+ *	copy overlapping memory blocks, you should check HAS_MEMMOVE and
+ *	use memmove() instead, if available.
+ */
+/*#define HAS_SAFE_MEMCPY	/**/
+
+/* HAS_SANE_MEMCMP:
+ *	This symbol, if defined, indicates that the memcmp routine is available
+ *	and can be used to compare relative magnitudes of chars with their high
+ *	bits set.  If it is not defined, roll your own version.
+ */
+#define HAS_SANE_MEMCMP	/**/
+
+/* HAS_SBRK_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the sbrk() function.  Otherwise, it is up
+ *	to the program to supply one.  Good guesses are
+ *		extern void* sbrk(int);
+ *		extern void* sbrk(size_t);
+ */
+/*#define	HAS_SBRK_PROTO	/**/
+
+/* HAS_SEM:
+ *	This symbol, if defined, indicates that the entire sem*(2) library is
+ *	supported.
+ */
+/*#define HAS_SEM		/**/
+
+/* HAS_SENDMSG:
+ *	This symbol, if defined, indicates that the sendmsg routine is
+ *	available to send structured socket messages.
+ */
+/*#define HAS_SENDMSG		/**/
+
+/* HAS_SETGRENT:
+ *	This symbol, if defined, indicates that the setgrent routine is
+ *	available for initializing sequential access of the group database.
+ */
+/*#define HAS_SETGRENT		/**/
+
+/* HAS_SETGRENT_R:
+ *	This symbol, if defined, indicates that the setgrent_r routine
+ *	is available to setgrent re-entrantly.
+ */
+/* SETGRENT_R_PROTO:
+ *	This symbol encodes the prototype of setgrent_r.
+ *	It is zero if d_setgrent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setgrent_r
+ *	is defined.
+ */
+/*#define HAS_SETGRENT_R	   /**/
+#define SETGRENT_R_PROTO 0	   /**/
+
+/* HAS_SETGROUPS:
+ *	This symbol, if defined, indicates that the setgroups() routine is
+ *	available to set the list of process groups.  If unavailable, multiple
+ *	groups are probably not supported.
+ */
+/*#define HAS_SETGROUPS		/**/
+
+/* HAS_SETHOSTENT:
+ *	This symbol, if defined, indicates that the sethostent() routine is
+ *	available.
+ */
+/*#define HAS_SETHOSTENT		/**/
+
+/* HAS_SETITIMER:
+ *	This symbol, if defined, indicates that the setitimer routine is
+ *	available to set interval timers.
+ */
+/*#define HAS_SETITIMER		/**/
+
+/* HAS_SETNETENT:
+ *	This symbol, if defined, indicates that the setnetent() routine is
+ *	available.
+ */
+/*#define HAS_SETNETENT		/**/
+
+/* HAS_SETPROTOENT:
+ *	This symbol, if defined, indicates that the setprotoent() routine is
+ *	available.
+ */
+/*#define HAS_SETPROTOENT		/**/
+
+/* HAS_SETPGRP:
+ *	This symbol, if defined, indicates that the setpgrp routine is
+ *	available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ *	This symbol, if defined, indicates that setpgrp needs two
+ *	arguments whereas USG one needs none.  See also HAS_SETPGID
+ *	for a POSIX interface.
+ */
+/*#define HAS_SETPGRP		/**/
+/*#define USE_BSD_SETPGRP	/**/
+
+/* HAS_SETPROCTITLE:
+ *	This symbol, if defined, indicates that the setproctitle routine is
+ *	available to set process title.
+ */
+/*#define HAS_SETPROCTITLE		/**/
+
+/* HAS_SETPWENT:
+ *	This symbol, if defined, indicates that the setpwent routine is
+ *	available for initializing sequential access of the passwd database.
+ */
+/*#define HAS_SETPWENT		/**/
+
+/* HAS_SETPWENT_R:
+ *	This symbol, if defined, indicates that the setpwent_r routine
+ *	is available to setpwent re-entrantly.
+ */
+/* SETPWENT_R_PROTO:
+ *	This symbol encodes the prototype of setpwent_r.
+ *	It is zero if d_setpwent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setpwent_r
+ *	is defined.
+ */
+/*#define HAS_SETPWENT_R	   /**/
+#define SETPWENT_R_PROTO 0	   /**/
+
+/* HAS_SETSERVENT:
+ *	This symbol, if defined, indicates that the setservent() routine is
+ *	available.
+ */
+/*#define HAS_SETSERVENT		/**/
+
+/* HAS_SETVBUF:
+ *	This symbol, if defined, indicates that the setvbuf routine is
+ *	available to change buffering on an open stdio stream.
+ *	to a line-buffered mode.
+ */
+#define HAS_SETVBUF		/**/
+
+/* USE_SFIO:
+ *	This symbol, if defined, indicates that sfio should
+ *	be used.
+ */
+/*#define	USE_SFIO		/**/
+
+/* HAS_SHM:
+ *	This symbol, if defined, indicates that the entire shm*(2) library is
+ *	supported.
+ */
+/*#define HAS_SHM		/**/
+
+/* HAS_SIGACTION:
+ *	This symbol, if defined, indicates that Vr4's sigaction() routine
+ *	is available.
+ */
+/*#define HAS_SIGACTION	/**/
+
+/* HAS_SIGSETJMP:
+ *	This variable indicates to the C program that the sigsetjmp()
+ *	routine is available to save the calling process's registers
+ *	and stack environment for later use by siglongjmp(), and
+ *	to optionally save the process's signal mask.  See
+ *	Sigjmp_buf, Sigsetjmp, and Siglongjmp.
+ */
+/* Sigjmp_buf:
+ *	This is the buffer type to be used with Sigsetjmp and Siglongjmp.
+ */
+/* Sigsetjmp:
+ *	This macro is used in the same way as sigsetjmp(), but will invoke
+ *	traditional setjmp() if sigsetjmp isn't available.
+ *	See HAS_SIGSETJMP.
+ */
+/* Siglongjmp:
+ *	This macro is used in the same way as siglongjmp(), but will invoke
+ *	traditional longjmp() if siglongjmp isn't available.
+ *	See HAS_SIGSETJMP.
+ */
+/*#define HAS_SIGSETJMP	/**/
+#ifdef HAS_SIGSETJMP
+#define Sigjmp_buf sigjmp_buf
+#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask))
+#define Siglongjmp(buf,retval) siglongjmp((buf),(retval))
+#else
+#define Sigjmp_buf jmp_buf
+#define Sigsetjmp(buf,save_mask) setjmp((buf))
+#define Siglongjmp(buf,retval) longjmp((buf),(retval))
+#endif
+
+/* USE_SITECUSTOMIZE:
+ *	This symbol, if defined, indicates that sitecustomize should
+ *	be used.
+ */
+#define	USE_SITECUSTOMIZE		/**/
+
+/* HAS_SOCKET:
+ *	This symbol, if defined, indicates that the BSD socket interface is
+ *	supported.
+ */
+/* HAS_SOCKETPAIR:
+ *	This symbol, if defined, indicates that the BSD socketpair() call is
+ *	supported.
+ */
+/* HAS_MSG_CTRUNC:
+ *	This symbol, if defined, indicates that the MSG_CTRUNC is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/* HAS_MSG_DONTROUTE:
+ *	This symbol, if defined, indicates that the MSG_DONTROUTE is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/* HAS_MSG_OOB:
+ *	This symbol, if defined, indicates that the MSG_OOB is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/* HAS_MSG_PEEK:
+ *	This symbol, if defined, indicates that the MSG_PEEK is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/* HAS_MSG_PROXY:
+ *	This symbol, if defined, indicates that the MSG_PROXY is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/* HAS_SCM_RIGHTS:
+ *	This symbol, if defined, indicates that the SCM_RIGHTS is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+#define	HAS_SOCKET		/**/
+/*#define	HAS_SOCKETPAIR	/**/
+/*#define	HAS_MSG_CTRUNC	/**/
+/*#define	HAS_MSG_DONTROUTE	/**/
+/*#define	HAS_MSG_OOB	/**/
+/*#define	HAS_MSG_PEEK	/**/
+/*#define	HAS_MSG_PROXY	/**/
+/*#define	HAS_SCM_RIGHTS	/**/
+
+/* HAS_SOCKS5_INIT:
+ *	This symbol, if defined, indicates that the socks5_init routine is
+ *	available to initialize SOCKS 5.
+ */
+/*#define HAS_SOCKS5_INIT		/**/
+
+/* HAS_SQRTL:
+ *	This symbol, if defined, indicates that the sqrtl routine is
+ *	available to do long double square roots.
+ */
+/*#define HAS_SQRTL		/**/
+
+/* HAS_SRAND48_R:
+ *	This symbol, if defined, indicates that the srand48_r routine
+ *	is available to srand48 re-entrantly.
+ */
+/* SRAND48_R_PROTO:
+ *	This symbol encodes the prototype of srand48_r.
+ *	It is zero if d_srand48_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_srand48_r
+ *	is defined.
+ */
+/*#define HAS_SRAND48_R	   /**/
+#define SRAND48_R_PROTO 0	   /**/
+
+/* HAS_SRANDOM_R:
+ *	This symbol, if defined, indicates that the srandom_r routine
+ *	is available to srandom re-entrantly.
+ */
+/* SRANDOM_R_PROTO:
+ *	This symbol encodes the prototype of srandom_r.
+ *	It is zero if d_srandom_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_srandom_r
+ *	is defined.
+ */
+/*#define HAS_SRANDOM_R	   /**/
+#define SRANDOM_R_PROTO 0	   /**/
+
+/* USE_STAT_BLOCKS:
+ *	This symbol is defined if this system has a stat structure declaring
+ *	st_blksize and st_blocks.
+ */
+#ifndef USE_STAT_BLOCKS
+/*#define USE_STAT_BLOCKS 	/**/
+#endif
+
+/* HAS_STRUCT_STATFS_F_FLAGS:
+ *	This symbol, if defined, indicates that the struct statfs
+ *	does have the f_flags member containing the mount flags of
+ *	the filesystem containing the file.
+ *	This kind of struct statfs is coming from <sys/mount.h> (BSD 4.3),
+ *	not from <sys/statfs.h> (SYSV).  Older BSDs (like Ultrix) do not
+ *	have statfs() and struct statfs, they have ustat() and getmnt()
+ *	with struct ustat and struct fs_data.
+ */
+/*#define HAS_STRUCT_STATFS_F_FLAGS		/**/
+
+/* HAS_STRUCT_STATFS:
+ *	This symbol, if defined, indicates that the struct statfs
+ *	to do statfs() is supported.
+ */
+/*#define HAS_STRUCT_STATFS	/**/
+
+/* HAS_FSTATVFS:
+ *	This symbol, if defined, indicates that the fstatvfs routine is
+ *	available to stat filesystems by file descriptors.
+ */
+/*#define HAS_FSTATVFS		/**/
+
+/* USE_STDIO_PTR:
+ *	This symbol is defined if the _ptr and _cnt fields (or similar)
+ *	of the stdio FILE structure can be used to access the stdio buffer
+ *	for a file handle.  If this is defined, then the FILE_ptr(fp)
+ *	and FILE_cnt(fp) macros will also be defined and should be used
+ *	to access these fields.
+ */
+/* FILE_ptr:
+ *	This macro is used to access the _ptr field (or equivalent) of the
+ *	FILE structure pointed to by its argument. This macro will always be
+ *	defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_PTR_LVALUE:
+ *	This symbol is defined if the FILE_ptr macro can be used as an
+ *	lvalue.
+ */
+/* FILE_cnt:
+ *	This macro is used to access the _cnt field (or equivalent) of the
+ *	FILE structure pointed to by its argument. This macro will always be
+ *	defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_CNT_LVALUE:
+ *	This symbol is defined if the FILE_cnt macro can be used as an
+ *	lvalue.
+ */
+/* STDIO_PTR_LVAL_SETS_CNT:
+ *	This symbol is defined if using the FILE_ptr macro as an lvalue
+ *	to increase the pointer by n has the side effect of decreasing the
+ *	value of File_cnt(fp) by n.
+ */
+/* STDIO_PTR_LVAL_NOCHANGE_CNT:
+ *	This symbol is defined if using the FILE_ptr macro as an lvalue
+ *	to increase the pointer by n leaves File_cnt(fp) unchanged.
+ */
+#define USE_STDIO_PTR 	/**/
+#ifdef USE_STDIO_PTR
+#define FILE_ptr(fp)	((fp)->_ptr)
+#define STDIO_PTR_LVALUE 		/**/
+#define FILE_cnt(fp)	((fp)->_cnt)
+#define STDIO_CNT_LVALUE 		/**/
+/*#define STDIO_PTR_LVAL_SETS_CNT	/**/
+#define STDIO_PTR_LVAL_NOCHANGE_CNT	/**/
+#endif
+
+/* USE_STDIO_BASE:
+ *	This symbol is defined if the _base field (or similar) of the
+ *	stdio FILE structure can be used to access the stdio buffer for
+ *	a file handle.  If this is defined, then the FILE_base(fp) macro
+ *	will also be defined and should be used to access this field.
+ *	Also, the FILE_bufsiz(fp) macro will be defined and should be used
+ *	to determine the number of bytes in the buffer.  USE_STDIO_BASE
+ *	will never be defined unless USE_STDIO_PTR is.
+ */
+/* FILE_base:
+ *	This macro is used to access the _base field (or equivalent) of the
+ *	FILE structure pointed to by its argument. This macro will always be
+ *	defined if USE_STDIO_BASE is defined.
+ */
+/* FILE_bufsiz:
+ *	This macro is used to determine the number of bytes in the I/O
+ *	buffer pointed to by _base field (or equivalent) of the FILE
+ *	structure pointed to its argument. This macro will always be defined
+ *	if USE_STDIO_BASE is defined.
+ */
+#define USE_STDIO_BASE 	/**/
+#ifdef USE_STDIO_BASE
+#define FILE_base(fp)	((fp)->_base)
+#define FILE_bufsiz(fp)	((fp)->_cnt + (fp)->_ptr - (fp)->_base)
+#endif
+
+/* HAS_STRERROR:
+ *	This symbol, if defined, indicates that the strerror routine is
+ *	available to translate error numbers to strings. See the writeup
+ *	of Strerror() in this file before you try to define your own.
+ */
+/* HAS_SYS_ERRLIST:
+ *	This symbol, if defined, indicates that the sys_errlist array is
+ *	available to translate error numbers to strings. The extern int
+ *	sys_nerr gives the size of that table.
+ */
+/* Strerror:
+ *	This preprocessor symbol is defined as a macro if strerror() is
+ *	not available to translate error numbers to strings but sys_errlist[]
+ *	array is there.
+ */
+#define HAS_STRERROR		/**/
+#define HAS_SYS_ERRLIST	/**/
+#define Strerror(e) strerror(e)
+
+/* HAS_STRERROR_R:
+ *	This symbol, if defined, indicates that the strerror_r routine
+ *	is available to strerror re-entrantly.
+ */
+/* STRERROR_R_PROTO:
+ *	This symbol encodes the prototype of strerror_r.
+ *	It is zero if d_strerror_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_strerror_r
+ *	is defined.
+ */
+/*#define HAS_STRERROR_R	   /**/
+#define STRERROR_R_PROTO 0	   /**/
+
+/* HAS_STRTOLD:
+ *	This symbol, if defined, indicates that the strtold routine is
+ *	available to convert strings to long doubles.
+ */
+/*#define HAS_STRTOLD		/**/
+
+/* HAS_STRTOLL:
+ *	This symbol, if defined, indicates that the strtoll routine is
+ *	available to convert strings to long longs.
+ */
+/*#define HAS_STRTOLL		/**/
+
+/* HAS_STRTOQ:
+ *	This symbol, if defined, indicates that the strtoq routine is
+ *	available to convert strings to long longs (quads).
+ */
+/*#define HAS_STRTOQ		/**/
+
+/* HAS_STRTOUL:
+ *	This symbol, if defined, indicates that the strtoul routine is
+ *	available to provide conversion of strings to unsigned long.
+ */
+#define HAS_STRTOUL	/**/
+
+/* HAS_STRTOULL:
+ *	This symbol, if defined, indicates that the strtoull routine is
+ *	available to convert strings to unsigned long longs.
+ */
+/*#define HAS_STRTOULL		/**/
+
+/* HAS_STRTOUQ:
+ *	This symbol, if defined, indicates that the strtouq routine is
+ *	available to convert strings to unsigned long longs (quads).
+ */
+/*#define HAS_STRTOUQ		/**/
+
+/* HAS_TELLDIR_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the telldir() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern long telldir(DIR*);
+ */
+#define	HAS_TELLDIR_PROTO	/**/
+
+/* HAS_TIME:
+ *	This symbol, if defined, indicates that the time() routine exists.
+ */
+/* Time_t:
+ *	This symbol holds the type returned by time(). It can be long,
+ *	or time_t on BSD sites (in which case <sys/types.h> should be
+ *	included).
+ */
+#define HAS_TIME		/**/
+#define Time_t time_t		/* Time type */
+
+/* HAS_TIMES:
+ *	This symbol, if defined, indicates that the times() routine exists.
+ *	Note that this became obsolete on some systems (SUNOS), which now
+ * use getrusage(). It may be necessary to include <sys/times.h>.
+ */
+#define HAS_TIMES		/**/
+
+/* HAS_TMPNAM_R:
+ *	This symbol, if defined, indicates that the tmpnam_r routine
+ *	is available to tmpnam re-entrantly.
+ */
+/* TMPNAM_R_PROTO:
+ *	This symbol encodes the prototype of tmpnam_r.
+ *	It is zero if d_tmpnam_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_tmpnam_r
+ *	is defined.
+ */
+/*#define HAS_TMPNAM_R	   /**/
+#define TMPNAM_R_PROTO 0	   /**/
+
+/* HAS_UALARM:
+ *	This symbol, if defined, indicates that the ualarm routine is
+ *	available to do alarms with microsecond granularity.
+ */
+/*#define HAS_UALARM		/**/
+
+/* HAS_UNION_SEMUN:
+ *	This symbol, if defined, indicates that the union semun is
+ *	defined by including <sys/sem.h>.  If not, the user code
+ *	probably needs to define it as:
+ *	union semun {
+ *	    int val;
+ *	    struct semid_ds *buf;
+ *	    unsigned short *array;
+ *	}
+ */
+/* USE_SEMCTL_SEMUN:
+ *	This symbol, if defined, indicates that union semun is
+ *	used for semctl IPC_STAT.
+ */
+/* USE_SEMCTL_SEMID_DS:
+ *	This symbol, if defined, indicates that struct semid_ds * is
+ *	used for semctl IPC_STAT.
+ */
+#define HAS_UNION_SEMUN	/**/
+/*#define USE_SEMCTL_SEMUN	/**/
+/*#define USE_SEMCTL_SEMID_DS	/**/
+
+/* HAS_UNORDERED:
+ *	This symbol, if defined, indicates that the unordered routine is
+ *	available to check whether two doubles are unordered
+ *	(effectively: whether either of them is NaN)
+ */
+/*#define HAS_UNORDERED		/**/
+
+/* HAS_UNSETENV:
+ *	This symbol, if defined, indicates that the unsetenv () routine is
+ *	available for use.
+ */
+/*#define HAS_UNSETENV		/**/
+
+/* HAS_USTAT:
+ *	This symbol, if defined, indicates that the ustat system call is
+ *	available to query file system statistics by dev_t.
+ */
+/*#define HAS_USTAT		/**/
+
+/* HAS_VFORK:
+ *	This symbol, if defined, indicates that vfork() exists.
+ */
+/*#define HAS_VFORK	/**/
+
+/* Signal_t:
+ *	This symbol's value is either "void" or "int", corresponding to the
+ *	appropriate return type of a signal handler.  Thus, you can declare
+ *	a signal handler using "Signal_t (*handler)()", and define the
+ *	handler using "Signal_t handler(sig)".
+ */
+#define Signal_t void	/* Signal handler's return type */
+
+/* HAS_VPRINTF:
+ *	This symbol, if defined, indicates that the vprintf routine is available
+ *	to printf with a pointer to an argument list.  If unavailable, you
+ *	may need to write your own, probably in terms of _doprnt().
+ */
+/* USE_CHAR_VSPRINTF:
+ *	This symbol is defined if this system has vsprintf() returning type
+ *	(char*).  The trend seems to be to declare it as "int vsprintf()".  It
+ *	is up to the package author to declare vsprintf correctly based on the
+ *	symbol.
+ */
+#define HAS_VPRINTF	/**/
+/*#define USE_CHAR_VSPRINTF 	/**/
+
+/* HAS_WRITEV:
+ *	This symbol, if defined, indicates that the writev routine is
+ *	available to do scatter writes.
+ */
+/*#define HAS_WRITEV		/**/
+
+/* USE_DYNAMIC_LOADING:
+ *	This symbol, if defined, indicates that dynamic loading of
+ *	some sort is available.
+ */
+#define USE_DYNAMIC_LOADING		/**/
+
+/* DOUBLESIZE:
+ *	This symbol contains the size of a double, so that the C preprocessor
+ *	can make decisions based on it.
+ */
+#define DOUBLESIZE 8		/**/
+
+/* EBCDIC:
+ *     This symbol, if defined, indicates that this system uses
+ *	EBCDIC encoding.
+ */
+/*#define	EBCDIC 		/**/
+
+/* FFLUSH_NULL:
+ *	This symbol, if defined, tells that fflush(NULL) does flush
+ *	all pending stdio output.
+ */
+/* FFLUSH_ALL:
+ *	This symbol, if defined, tells that to flush
+ *	all pending stdio output one must loop through all
+ *	the stdio file handles stored in an array and fflush them.
+ *	Note that if fflushNULL is defined, fflushall will not
+ *	even be probed for and will be left undefined.
+ */
+#define	FFLUSH_NULL 		/**/
+/*#define	FFLUSH_ALL 		/**/
+
+/* Fpos_t:
+ *	This symbol holds the type used to declare file positions in libc.
+ *	It can be fpos_t, long, uint, etc... It may be necessary to include
+ *	<sys/types.h> to get any typedef'ed information.
+ */
+#define Fpos_t fpos_t		/* File position type */
+
+/* Gid_t_f:
+ *	This symbol defines the format string used for printing a Gid_t.
+ */
+#define	Gid_t_f		"ld"		/**/
+
+/* Gid_t_sign:
+ *	This symbol holds the signedess of a Gid_t.
+ *	1 for unsigned, -1 for signed.
+ */
+#define Gid_t_sign	-1		/* GID sign */
+
+/* Gid_t_size:
+ *	This symbol holds the size of a Gid_t in bytes.
+ */
+#define Gid_t_size 4		/* GID size */
+
+/* Gid_t:
+ *	This symbol holds the return type of getgid() and the type of
+ *	argument to setrgid() and related functions.  Typically,
+ *	it is the type of group ids in the kernel. It can be int, ushort,
+ *	gid_t, etc... It may be necessary to include <sys/types.h> to get
+ *	any typedef'ed information.
+ */
+#define Gid_t gid_t		/* Type for getgid(), etc... */
+
+/* Groups_t:
+ *	This symbol holds the type used for the second argument to
+ *	getgroups() and setgroups().  Usually, this is the same as
+ *	gidtype (gid_t) , but sometimes it isn't.
+ *	It can be int, ushort, gid_t, etc... 
+ *	It may be necessary to include <sys/types.h> to get any 
+ *	typedef'ed information.  This is only required if you have
+ *	getgroups() or setgroups()..
+ */
+#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
+#define Groups_t gid_t	/* Type for 2nd arg to [sg]etgroups() */
+#endif
+
+/* DB_Prefix_t:
+ *	This symbol contains the type of the prefix structure element
+ *	in the <db.h> header file.  In older versions of DB, it was
+ *	int, while in newer ones it is u_int32_t.
+ */
+/* DB_Hash_t:
+ *	This symbol contains the type of the prefix structure element
+ *	in the <db.h> header file.  In older versions of DB, it was
+ *	int, while in newer ones it is size_t.
+ */
+/* DB_VERSION_MAJOR_CFG:
+ *	This symbol, if defined, defines the major version number of
+ *	Berkeley DB found in the <db.h> header when Perl was configured.
+ */
+/* DB_VERSION_MINOR_CFG:
+ *	This symbol, if defined, defines the minor version number of
+ *	Berkeley DB found in the <db.h> header when Perl was configured.
+ *	For DB version 1 this is always 0.
+ */
+/* DB_VERSION_PATCH_CFG:
+ *	This symbol, if defined, defines the patch version number of
+ *	Berkeley DB found in the <db.h> header when Perl was configured.
+ *	For DB version 1 this is always 0.
+ */
+#define DB_Hash_t	int		/**/
+#define DB_Prefix_t	int  	/**/
+#define DB_VERSION_MAJOR_CFG	0  	/**/
+#define DB_VERSION_MINOR_CFG	0  	/**/
+#define DB_VERSION_PATCH_CFG	0  	/**/
+
+/* I_FP_CLASS:
+ *	This symbol, if defined, indicates that <fp_class.h> exists and
+ *	should be included.
+ */
+/*#define	I_FP_CLASS		/**/
+
+/* I_GRP:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <grp.h>.
+ */
+/* GRPASSWD:
+ *	This symbol, if defined, indicates to the C program that struct group
+ *	in <grp.h> contains gr_passwd.
+ */
+/*#define I_GRP		/**/
+/*#define GRPASSWD	/**/
+
+/* I_IEEEFP:
+ *	This symbol, if defined, indicates that <ieeefp.h> exists and
+ *	should be included.
+ */
+/*#define	I_IEEEFP		/**/
+
+/* I_INTTYPES:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <inttypes.h>.
+ */
+/*#define   I_INTTYPES                /**/
+
+/* I_LIBUTIL:
+ *	This symbol, if defined, indicates that <libutil.h> exists and
+ *	should be included.
+ */
+/*#define	I_LIBUTIL		/**/
+
+/* I_MACH_CTHREADS:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <mach/cthreads.h>.
+ */
+/*#define   I_MACH_CTHREADS	/**/
+
+/* I_MNTENT:
+ *	This symbol, if defined, indicates that <mntent.h> exists and
+ *	should be included.
+ */
+/*#define	I_MNTENT		/**/
+
+/* I_NETDB:
+ *	This symbol, if defined, indicates that <netdb.h> exists and
+ *	should be included.
+ */
+/*#define I_NETDB		/**/
+
+/* I_NETINET_TCP:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <netinet/tcp.h>.
+ */
+/*#define   I_NETINET_TCP                /**/
+
+/* I_POLL:
+ *	This symbol, if defined, indicates that <poll.h> exists and
+ *	should be included.
+ */
+/*#define	I_POLL		/**/
+
+/* I_PROT:
+ *	This symbol, if defined, indicates that <prot.h> exists and
+ *	should be included.
+ */
+/*#define	I_PROT		/**/
+
+/* I_PTHREAD:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <pthread.h>.
+ */
+/*#define   I_PTHREAD	/**/
+
+/* I_PWD:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <pwd.h>.
+ */
+/* PWQUOTA:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_quota.
+ */
+/* PWAGE:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_age.
+ */
+/* PWCHANGE:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_change.
+ */
+/* PWCLASS:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_class.
+ */
+/* PWEXPIRE:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_expire.
+ */
+/* PWCOMMENT:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_comment.
+ */
+/* PWGECOS:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_gecos.
+ */
+/* PWPASSWD:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_passwd.
+ */
+/*#define I_PWD		/**/
+/*#define PWQUOTA	/**/
+/*#define PWAGE	/**/
+/*#define PWCHANGE	/**/
+/*#define PWCLASS	/**/
+/*#define PWEXPIRE	/**/
+/*#define PWCOMMENT	/**/
+/*#define PWGECOS	/**/
+/*#define PWPASSWD	/**/
+
+/* I_SHADOW:
+ *	This symbol, if defined, indicates that <shadow.h> exists and
+ *	should be included.
+ */
+/*#define	I_SHADOW		/**/
+
+/* I_SOCKS:
+ *	This symbol, if defined, indicates that <socks.h> exists and
+ *	should be included.
+ */
+/*#define	I_SOCKS		/**/
+
+/* I_SUNMATH:
+ *	This symbol, if defined, indicates that <sunmath.h> exists and
+ *	should be included.
+ */
+/*#define	I_SUNMATH		/**/
+
+/* I_SYSLOG:
+ *	This symbol, if defined, indicates that <syslog.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYSLOG		/**/
+
+/* I_SYSMODE:
+ *	This symbol, if defined, indicates that <sys/mode.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYSMODE		/**/
+
+/* I_SYS_MOUNT:
+ *	This symbol, if defined, indicates that <sys/mount.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYS_MOUNT		/**/
+
+/* I_SYS_STATFS:
+ *	This symbol, if defined, indicates that <sys/statfs.h> exists.
+ */
+/*#define	I_SYS_STATFS		/**/
+
+/* I_SYS_STATVFS:
+ *	This symbol, if defined, indicates that <sys/statvfs.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYS_STATVFS		/**/
+
+/* I_SYSUIO:
+ *	This symbol, if defined, indicates that <sys/uio.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYSUIO		/**/
+
+/* I_SYSUTSNAME:
+ *	This symbol, if defined, indicates that <sys/utsname.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYSUTSNAME		/**/
+
+/* I_SYS_VFS:
+ *	This symbol, if defined, indicates that <sys/vfs.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYS_VFS		/**/
+
+/* I_TIME:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <time.h>.
+ */
+/* I_SYS_TIME:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/time.h>.
+ */
+/* I_SYS_TIME_KERNEL:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/time.h> with KERNEL defined.
+ */
+/* HAS_TM_TM_ZONE:
+ *	This symbol, if defined, indicates to the C program that
+ *	the struct tm has a tm_zone field.
+ */
+/* HAS_TM_TM_GMTOFF:
+ *	This symbol, if defined, indicates to the C program that
+ *	the struct tm has a tm_gmtoff field.
+ */
+#define I_TIME		/**/
+/*#define I_SYS_TIME		/**/
+/*#define I_SYS_TIME_KERNEL		/**/
+/*#define HAS_TM_TM_ZONE		/**/
+/*#define HAS_TM_TM_GMTOFF		/**/
+
+/* I_USTAT:
+ *	This symbol, if defined, indicates that <ustat.h> exists and
+ *	should be included.
+ */
+/*#define	I_USTAT		/**/
+
+/* PERL_INC_VERSION_LIST:
+ *	This variable specifies the list of subdirectories in over
+ *	which perl.c:incpush() and lib/lib.pm will automatically
+ *	search when adding directories to @INC, in a format suitable
+ *	for a C initialization string.  See the inc_version_list entry
+ *	in Porting/Glossary for more details.
+ */
+#define PERL_INC_VERSION_LIST 0		/**/
+
+/* INSTALL_USR_BIN_PERL:
+ *	This symbol, if defined, indicates that Perl is to be installed
+ * 	also as /usr/bin/perl.
+ */
+/*#define INSTALL_USR_BIN_PERL	/**/
+
+/* PERL_PRIfldbl:
+ *	This symbol, if defined, contains the string used by stdio to
+ *	format long doubles (format 'f') for output.
+ */
+/* PERL_PRIgldbl:
+ *	This symbol, if defined, contains the string used by stdio to
+ *	format long doubles (format 'g') for output.
+ */
+/* PERL_PRIeldbl:
+ *	This symbol, if defined, contains the string used by stdio to
+ *	format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ *	This symbol, if defined, contains the string used by stdio to
+ *	format long doubles (format 'f') for input.
+ */
+/*#define PERL_PRIfldbl	"f"	/**/
+/*#define PERL_PRIgldbl	"g"	/**/
+/*#define PERL_PRIeldbl	"e"	/**/
+/*#define PERL_SCNfldbl	"f"	/**/
+
+/* Off_t:
+ *	This symbol holds the type used to declare offsets in the kernel.
+ *	It can be int, long, off_t, etc... It may be necessary to include
+ *	<sys/types.h> to get any typedef'ed information.
+ */
+/* LSEEKSIZE:
+ *	This symbol holds the number of bytes used by the Off_t.
+ */
+/* Off_t_size:
+ *	This symbol holds the number of bytes used by the Off_t.
+ */
+#define Off_t __int64		/* <offset> type */
+#define LSEEKSIZE 8		/* <offset> size */
+#define Off_t_size 8	/* <offset> size */
+
+/* Free_t:
+ *	This variable contains the return type of free().  It is usually
+ * void, but occasionally int.
+ */
+/* Malloc_t:
+ *	This symbol is the type of pointer returned by malloc and realloc.
+ */
+#define Malloc_t void *			/**/
+#define Free_t void			/**/
+
+/* PERL_MALLOC_WRAP:
+ *	This symbol, if defined, indicates that we'd like malloc wrap checks.
+ */
+#define PERL_MALLOC_WRAP		/**/
+
+/* MYMALLOC:
+ *	This symbol, if defined, indicates that we're using our own malloc.
+ */
+/*#define MYMALLOC			/**/
+
+/* Mode_t:
+ *	This symbol holds the type used to declare file modes 
+ *	for systems calls.  It is usually mode_t, but may be
+ *	int or unsigned short.  It may be necessary to include <sys/types.h>
+ *	to get any typedef'ed information.
+ */
+#define Mode_t mode_t	 /* file mode parameter for system calls */
+
+/* VAL_O_NONBLOCK:
+ *	This symbol is to be used during open() or fcntl(F_SETFL) to turn on
+ *	non-blocking I/O for the file descriptor. Note that there is no way
+ *	back, i.e. you cannot turn it blocking again this way. If you wish to
+ *	alternatively switch between blocking and non-blocking, use the
+ *	ioctl(FIOSNBIO) call instead, but that is not supported by all devices.
+ */
+/* VAL_EAGAIN:
+ *	This symbol holds the errno error code set by read() when no data was
+ *	present on the non-blocking file descriptor.
+ */
+/* RD_NODATA:
+ *	This symbol holds the return code from read() when no data is present
+ *	on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is
+ *	not defined, then you can't distinguish between no data and EOF by
+ *	issuing a read(). You'll have to find another way to tell for sure!
+ */
+/* EOF_NONBLOCK:
+ *	This symbol, if defined, indicates to the C program that a read() on
+ *	a non-blocking file descriptor will return 0 on EOF, and not the value
+ *	held in RD_NODATA (-1 usually, in that case!).
+ */
+#define VAL_O_NONBLOCK O_NONBLOCK
+#define VAL_EAGAIN EAGAIN
+#define RD_NODATA -1
+#define EOF_NONBLOCK
+
+/* NEED_VA_COPY:
+ *	This symbol, if defined, indicates that the system stores
+ *	the variable argument list datatype, va_list, in a format
+ *	that cannot be copied by simple assignment, so that some
+ *	other means must be used when copying is required.
+ *	As such systems vary in their provision (or non-provision)
+ *	of copying mechanisms, handy.h defines a platform-
+ *	independent macro, Perl_va_copy(src, dst), to do the job.
+ */
+/*#define	NEED_VA_COPY		/**/
+
+/* Netdb_host_t:
+ *	This symbol holds the type used for the 1st argument
+ *	to gethostbyaddr().
+ */
+/* Netdb_hlen_t:
+ *	This symbol holds the type used for the 2nd argument
+ *	to gethostbyaddr().
+ */
+/* Netdb_name_t:
+ *	This symbol holds the type used for the argument to
+ *	gethostbyname().
+ */
+/* Netdb_net_t:
+ *	This symbol holds the type used for the 1st argument to
+ *	getnetbyaddr().
+ */
+#define Netdb_host_t		char * /**/
+#define Netdb_hlen_t		int /**/
+#define Netdb_name_t		char * /**/
+#define Netdb_net_t		long /**/
+
+/* PERL_OTHERLIBDIRS:
+ *	This variable contains a colon-separated set of paths for the perl
+ *	binary to search for additional library files or modules.
+ *	These directories will be tacked to the end of @INC.
+ *	Perl will automatically search below each path for version-
+ *	and architecture-specific directories.  See PERL_INC_VERSION_LIST
+ *	for more details.
+ */
+/*#define PERL_OTHERLIBDIRS ""		/**/
+
+/* HAS_QUAD:
+ *	This symbol, if defined, tells that there's a 64-bit integer type,
+ *	Quad_t, and its unsigned counterpar, Uquad_t. QUADKIND will be one
+ *	of QUAD_IS_INT, QUAD_IS_LONG, QUAD_IS_LONG_LONG, or QUAD_IS_INT64_T.
+ */
+/*#define HAS_QUAD	/**/
+#ifdef HAS_QUAD
+#   define Quad_t __int64	/**/
+#   define Uquad_t unsigned __int64	/**/
+#   define QUADKIND 5	/**/
+#   define QUAD_IS_INT	1
+#   define QUAD_IS_LONG	2
+#   define QUAD_IS_LONG_LONG	3
+#   define QUAD_IS_INT64_T	4
+#endif
+
+/* IVTYPE:
+ *	This symbol defines the C type used for Perl's IV.
+ */
+/* UVTYPE:
+ *	This symbol defines the C type used for Perl's UV.
+ */
+/* I8TYPE:
+ *	This symbol defines the C type used for Perl's I8.
+ */
+/* U8TYPE:
+ *	This symbol defines the C type used for Perl's U8.
+ */
+/* I16TYPE:
+ *	This symbol defines the C type used for Perl's I16.
+ */
+/* U16TYPE:
+ *	This symbol defines the C type used for Perl's U16.
+ */
+/* I32TYPE:
+ *	This symbol defines the C type used for Perl's I32.
+ */
+/* U32TYPE:
+ *	This symbol defines the C type used for Perl's U32.
+ */
+/* I64TYPE:
+ *	This symbol defines the C type used for Perl's I64.
+ */
+/* U64TYPE:
+ *	This symbol defines the C type used for Perl's U64.
+ */
+/* NVTYPE:
+ *	This symbol defines the C type used for Perl's NV.
+ */
+/* IVSIZE:
+ *	This symbol contains the sizeof(IV).
+ */
+/* UVSIZE:
+ *	This symbol contains the sizeof(UV).
+ */
+/* I8SIZE:
+ *	This symbol contains the sizeof(I8).
+ */
+/* U8SIZE:
+ *	This symbol contains the sizeof(U8).
+ */
+/* I16SIZE:
+ *	This symbol contains the sizeof(I16).
+ */
+/* U16SIZE:
+ *	This symbol contains the sizeof(U16).
+ */
+/* I32SIZE:
+ *	This symbol contains the sizeof(I32).
+ */
+/* U32SIZE:
+ *	This symbol contains the sizeof(U32).
+ */
+/* I64SIZE:
+ *	This symbol contains the sizeof(I64).
+ */
+/* U64SIZE:
+ *	This symbol contains the sizeof(U64).
+ */
+/* NVSIZE:
+ *	This symbol contains the sizeof(NV).
+ */
+/* NV_PRESERVES_UV:
+ *	This symbol, if defined, indicates that a variable of type NVTYPE
+ *	can preserve all the bits of a variable of type UVTYPE.
+ */
+/* NV_PRESERVES_UV_BITS:
+ *	This symbol contains the number of bits a variable of type NVTYPE
+ *	can preserve of a variable of type UVTYPE.
+ */
+/* NV_ZERO_IS_ALLBITS_ZERO:
+ *	This symbol, if defined, indicates that a variable of type NVTYPE
+ *	stores 0.0 in memory as all bits zero.
+ */
+#define	IVTYPE		long		/**/
+#define	UVTYPE		unsigned long		/**/
+#define	I8TYPE		char		/**/
+#define	U8TYPE		unsigned char		/**/
+#define	I16TYPE		short	/**/
+#define	U16TYPE		unsigned short	/**/
+#define	I32TYPE		long	/**/
+#define	U32TYPE		unsigned long	/**/
+#ifdef HAS_QUAD
+#define	I64TYPE		__int64	/**/
+#define	U64TYPE		unsigned __int64	/**/
+#endif
+#define	NVTYPE		double		/**/
+#define	IVSIZE		4		/**/
+#define	UVSIZE		4		/**/
+#define	I8SIZE		1		/**/
+#define	U8SIZE		1		/**/
+#define	I16SIZE		2	/**/
+#define	U16SIZE		2	/**/
+#define	I32SIZE		4	/**/
+#define	U32SIZE		4	/**/
+#ifdef HAS_QUAD
+#define	I64SIZE		8	/**/
+#define	U64SIZE		8	/**/
+#endif
+#define	NVSIZE		8		/**/
+#define	NV_PRESERVES_UV
+#define	NV_PRESERVES_UV_BITS	32
+#define	NV_ZERO_IS_ALLBITS_ZERO
+#if UVSIZE == 8
+#   ifdef BYTEORDER
+#       if BYTEORDER == 0x1234
+#           undef BYTEORDER
+#           define BYTEORDER 0x12345678
+#       else
+#           if BYTEORDER == 0x4321
+#               undef BYTEORDER
+#               define BYTEORDER 0x87654321
+#           endif
+#       endif
+#   endif
+#endif
+
+/* IVdf:
+ *	This symbol defines the format string used for printing a Perl IV
+ *	as a signed decimal integer.
+ */
+/* UVuf:
+ *	This symbol defines the format string used for printing a Perl UV
+ *	as an unsigned decimal integer.
+ */
+/* UVof:
+ *	This symbol defines the format string used for printing a Perl UV
+ *	as an unsigned octal integer.
+ */
+/* UVxf:
+ *	This symbol defines the format string used for printing a Perl UV
+ *	as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* UVXf:
+ *	This symbol defines the format string used for printing a Perl UV
+ *	as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+/* NVef:
+ *	This symbol defines the format string used for printing a Perl NV
+ *	using %e-ish floating point format.
+ */
+/* NVff:
+ *	This symbol defines the format string used for printing a Perl NV
+ *	using %f-ish floating point format.
+ */
+/* NVgf:
+ *	This symbol defines the format string used for printing a Perl NV
+ *	using %g-ish floating point format.
+ */
+#define	IVdf		"ld"		/**/
+#define	UVuf		"lu"		/**/
+#define	UVof		"lo"		/**/
+#define	UVxf		"lx"		/**/
+#define	UVXf		"lX"		/**/
+#define	NVef		"e"		/**/
+#define	NVff		"f"		/**/
+#define	NVgf		"g"		/**/
+
+/* Pid_t:
+ *	This symbol holds the type used to declare process ids in the kernel.
+ *	It can be int, uint, pid_t, etc... It may be necessary to include
+ *	<sys/types.h> to get any typedef'ed information.
+ */
+#define Pid_t int		/* PID type */
+
+/* PRIVLIB:
+ *	This symbol contains the name of the private library for this package.
+ *	The library is private in the sense that it needn't be in anyone's
+ *	execution path, but it should be accessible by the world.  The program
+ *	should be prepared to do ~ expansion.
+ */
+/* PRIVLIB_EXP:
+ *	This symbol contains the ~name expanded version of PRIVLIB, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define PRIVLIB "c:\\shaoqunWu\\perl\\lib"		/**/
+#define PRIVLIB_EXP (win32_get_privlib("5.8.8"))	/**/
+
+/* PTRSIZE:
+ *	This symbol contains the size of a pointer, so that the C preprocessor
+ *	can make decisions based on it.  It will be sizeof(void *) if
+ *	the compiler supports (void *); otherwise it will be
+ *	sizeof(char *).
+ */
+#define PTRSIZE 4		/**/
+
+/* Drand01:
+ *	This macro is to be used to generate uniformly distributed
+ *	random numbers over the range [0., 1.[.  You may have to supply
+ *	an 'extern double drand48();' in your program since SunOS 4.1.3
+ *	doesn't provide you with anything relevant in its headers.
+ *	See HAS_DRAND48_PROTO.
+ */
+/* Rand_seed_t:
+ *	This symbol defines the type of the argument of the
+ *	random seed function.
+ */
+/* seedDrand01:
+ *	This symbol defines the macro to be used in seeding the
+ *	random number generator (see Drand01).
+ */
+/* RANDBITS:
+ *	This symbol indicates how many bits are produced by the
+ *	function used to generate normalized random numbers.
+ *	Values include 15, 16, 31, and 48.
+ */
+#define Drand01()		(rand()/(double)((unsigned)1<<RANDBITS))		/**/
+#define Rand_seed_t		unsigned		/**/
+#define seedDrand01(x)	srand((Rand_seed_t)x)	/**/
+#define RANDBITS		15		/**/
+
+/* SELECT_MIN_BITS:
+ *	This symbol holds the minimum number of bits operated by select.
+ *	That is, if you do select(n, ...), how many bits at least will be
+ *	cleared in the masks if some activity is detected.  Usually this
+ *	is either n or 32*ceil(n/32), especially many little-endians do
+ *	the latter.  This is only useful if you have select(), naturally.
+ */
+#define SELECT_MIN_BITS 	32	/**/
+
+/* Select_fd_set_t:
+ *	This symbol holds the type used for the 2nd, 3rd, and 4th
+ *	arguments to select.  Usually, this is 'fd_set *', if HAS_FD_SET
+ *	is defined, and 'int *' otherwise.  This is only useful if you 
+ *	have select(), of course.
+ */
+#define Select_fd_set_t 	Perl_fd_set *	/**/
+
+/* SIG_NAME:
+ *	This symbol contains a list of signal names in order of
+ *	signal number. This is intended
+ *	to be used as a static array initialization, like this:
+ *		char *sig_name[] = { SIG_NAME };
+ *	The signals in the list are separated with commas, and each signal
+ *	is surrounded by double quotes. There is no leading SIG in the signal
+ *	name, i.e. SIGQUIT is known as "QUIT".
+ *	Gaps in the signal numbers (up to NSIG) are filled in with NUMnn,
+ *	etc., where nn is the actual signal number (e.g. NUM37).
+ *	The signal number for sig_name[i] is stored in sig_num[i].
+ *	The last element is 0 to terminate the list with a NULL.  This
+ *	corresponds to the 0 at the end of the sig_name_init list.
+ *	Note that this variable is initialized from the sig_name_init,
+ *	not from sig_name (which is unused).
+ */
+/* SIG_NUM:
+ *	This symbol contains a list of signal numbers, in the same order as the
+ *	SIG_NAME list. It is suitable for static array initialization, as in:
+ *		int sig_num[] = { SIG_NUM };
+ *	The signals in the list are separated with commas, and the indices
+ *	within that list and the SIG_NAME list match, so it's easy to compute
+ *	the signal name from a number or vice versa at the price of a small
+ *	dynamic linear lookup. 
+ *	Duplicates are allowed, but are moved to the end of the list.
+ *	The signal number corresponding to sig_name[i] is sig_number[i].
+ *	if (i < NSIG) then sig_number[i] == i.  
+ *	The last element is 0, corresponding to the 0 at the end of
+ *	the sig_name_init list.
+ *	Note that this variable is initialized from the sig_num_init,
+ *	not from sig_num (which is unused).
+ */
+/* SIG_SIZE:
+ *	This variable contains the number of elements of the SIG_NAME
+ *	and SIG_NUM arrays, excluding the final NULL entry.
+ */
+#define SIG_NAME "ZERO", "HUP", "INT", "QUIT", "ILL", "NUM05", "NUM06", "NUM07", "FPE", "KILL", "NUM10", "SEGV", "NUM12", "PIPE", "ALRM", "TERM", "NUM16", "NUM17", "NUM18", "NUM19", "CHLD", "BREAK", "ABRT", "STOP", "NUM24", "CONT", "CLD", 0		/**/
+#define SIG_NUM  0, 1, 2, 21, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 20, 0		/**/
+#define SIG_SIZE 27			/**/
+
+/* SITEARCH:
+ *	This symbol contains the name of the private library for this package.
+ *	The library is private in the sense that it needn't be in anyone's
+ *	execution path, but it should be accessible by the world.  The program
+ *	should be prepared to do ~ expansion.
+ *	The standard distribution will put nothing in this directory.
+ *	After perl has been installed, users may install their own local
+ *	architecture-dependent modules in this directory with
+ *		MakeMaker Makefile.PL
+ *	or equivalent.  See INSTALL for details.
+ */
+/* SITEARCH_EXP:
+ *	This symbol contains the ~name expanded version of SITEARCH, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define SITEARCH "c:\\shaoqunWu\\perl\\site\\lib"		/**/
+/*#define SITEARCH_EXP ""	/**/
+
+/* SITELIB:
+ *	This symbol contains the name of the private library for this package.
+ *	The library is private in the sense that it needn't be in anyone's
+ *	execution path, but it should be accessible by the world.  The program
+ *	should be prepared to do ~ expansion.
+ *	The standard distribution will put nothing in this directory.
+ *	After perl has been installed, users may install their own local
+ *	architecture-independent modules in this directory with
+ *		MakeMaker Makefile.PL
+ *	or equivalent.  See INSTALL for details.
+ */
+/* SITELIB_EXP:
+ *	This symbol contains the ~name expanded version of SITELIB, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/* SITELIB_STEM:
+ *	This define is SITELIB_EXP with any trailing version-specific component
+ *	removed.  The elements in inc_version_list (inc_version_list.U) can
+ *	be tacked onto this variable to generate a list of directories to search.
+ */
+#define SITELIB "c:\\shaoqunWu\\perl\\site\\lib"		/**/
+#define SITELIB_EXP (win32_get_sitelib("5.8.8"))	/**/
+#define SITELIB_STEM ""		/**/
+
+/* Size_t_size:
+ *	This symbol holds the size of a Size_t in bytes.
+ */
+#define Size_t_size 4		/**/
+
+/* Size_t:
+ *	This symbol holds the type used to declare length parameters
+ *	for string functions.  It is usually size_t, but may be
+ *	unsigned long, int, etc.  It may be necessary to include
+ *	<sys/types.h> to get any typedef'ed information.
+ */
+#define Size_t size_t	 /* length paramater for string functions */
+
+/* Sock_size_t:
+ *	This symbol holds the type used for the size argument of
+ *	various socket calls (just the base type, not the pointer-to).
+ */
+#define Sock_size_t		int /**/
+
+/* SSize_t:
+ *	This symbol holds the type used by functions that return
+ *	a count of bytes or an error condition.  It must be a signed type.
+ *	It is usually ssize_t, but may be long or int, etc.
+ *	It may be necessary to include <sys/types.h> or <unistd.h>
+ *	to get any typedef'ed information.
+ *	We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+ */
+#define SSize_t int	 /* signed count of bytes */
+
+/* STARTPERL:
+ *	This variable contains the string to put in front of a perl
+ *	script to make sure (one hopes) that it runs with perl and not
+ *	some shell.
+ */
+#define STARTPERL "#!perl"		/**/
+
+/* STDCHAR:
+ *	This symbol is defined to be the type of char used in stdio.h.
+ *	It has the values "unsigned char" or "char".
+ */
+#define STDCHAR char	/**/
+
+/* HAS_STDIO_STREAM_ARRAY:
+ *	This symbol, if defined, tells that there is an array
+ *	holding the stdio streams.
+ */
+/* STDIO_STREAM_ARRAY:
+ *	This symbol tells the name of the array holding the stdio streams.
+ *	Usual values include _iob, __iob, and __sF.
+ */
+/*#define	HAS_STDIO_STREAM_ARRAY	/**/
+#define STDIO_STREAM_ARRAY	
+
+/* Uid_t_f:
+ *	This symbol defines the format string used for printing a Uid_t.
+ */
+#define	Uid_t_f		"ld"		/**/
+
+/* Uid_t_sign:
+ *	This symbol holds the signedess of a Uid_t.
+ *	1 for unsigned, -1 for signed.
+ */
+#define Uid_t_sign	-1		/* UID sign */
+
+/* Uid_t_size:
+ *	This symbol holds the size of a Uid_t in bytes.
+ */
+#define Uid_t_size 4		/* UID size */
+
+/* Uid_t:
+ *	This symbol holds the type used to declare user ids in the kernel.
+ *	It can be int, ushort, uid_t, etc... It may be necessary to include
+ *	<sys/types.h> to get any typedef'ed information.
+ */
+#define Uid_t uid_t		/* UID type */
+
+/* USE_64_BIT_INT:
+ *	This symbol, if defined, indicates that 64-bit integers should
+ *	be used when available.  If not defined, the native integers
+ *	will be employed (be they 32 or 64 bits).  The minimal possible
+ *	64-bitness is used, just enough to get 64-bit integers into Perl.
+ *	This may mean using for example "long longs", while your memory
+ *	may still be limited to 2 gigabytes.
+ */
+/* USE_64_BIT_ALL:
+ *	This symbol, if defined, indicates that 64-bit integers should
+ *	be used when available.  If not defined, the native integers
+ *	will be used (be they 32 or 64 bits).  The maximal possible
+ *	64-bitness is employed: LP64 or ILP64, meaning that you will
+ *	be able to use more than 2 gigabytes of memory.  This mode is
+ *	even more binary incompatible than USE_64_BIT_INT. You may not
+ *	be able to run the resulting executable in a 32-bit CPU at all or
+ *	you may need at least to reboot your OS to 64-bit mode.
+ */
+#ifndef USE_64_BIT_INT
+/*#define	USE_64_BIT_INT		/**/
+#endif
+
+#ifndef USE_64_BIT_ALL
+/*#define	USE_64_BIT_ALL		/**/
+#endif
+
+/* USE_LARGE_FILES:
+ *	This symbol, if defined, indicates that large file support
+ *	should be used when available.
+ */
+#ifndef USE_LARGE_FILES
+#define	USE_LARGE_FILES		/**/
+#endif
+
+/* USE_LONG_DOUBLE:
+ *	This symbol, if defined, indicates that long doubles should
+ *	be used when available.
+ */
+#ifndef USE_LONG_DOUBLE
+/*#define	USE_LONG_DOUBLE		/**/
+#endif
+
+/* USE_MORE_BITS:
+ *	This symbol, if defined, indicates that 64-bit interfaces and
+ *	long doubles should be used when available.
+ */
+#ifndef USE_MORE_BITS
+/*#define	USE_MORE_BITS		/**/
+#endif
+
+/* MULTIPLICITY:
+ *	This symbol, if defined, indicates that Perl should
+ *	be built to use multiplicity.
+ */
+#ifndef MULTIPLICITY
+#define	MULTIPLICITY		/**/
+#endif
+
+/* USE_PERLIO:
+ *	This symbol, if defined, indicates that the PerlIO abstraction should
+ *	be used throughout.  If not defined, stdio should be
+ *	used in a fully backward compatible manner.
+ */
+#ifndef USE_PERLIO
+#define	USE_PERLIO		/**/
+#endif
+
+/* USE_SOCKS:
+ *	This symbol, if defined, indicates that Perl should
+ *	be built to use socks.
+ */
+#ifndef USE_SOCKS
+/*#define	USE_SOCKS		/**/
+#endif
+
+/* USE_ITHREADS:
+ *	This symbol, if defined, indicates that Perl should be built to
+ *	use the interpreter-based threading implementation.
+ */
+/* USE_5005THREADS:
+ *	This symbol, if defined, indicates that Perl should be built to
+ *	use the 5.005-based threading implementation.
+ */
+/* OLD_PTHREADS_API:
+ *	This symbol, if defined, indicates that Perl should
+ *	be built to use the old draft POSIX threads API.
+ */
+/* USE_REENTRANT_API:
+ *	This symbol, if defined, indicates that Perl should
+ *	try to use the various _r versions of library functions.
+ *	This is extremely experimental.
+ */
+/*#define	USE_5005THREADS		/**/
+#define	USE_ITHREADS		/**/
+#if defined(USE_5005THREADS) && !defined(USE_ITHREADS)
+#define		USE_THREADS		/* until src is revised*/
+#endif
+/*#define	OLD_PTHREADS_API		/**/
+/*#define	USE_REENTRANT_API	/**/
+
+/* PERL_VENDORARCH:
+ *	If defined, this symbol contains the name of a private library.
+ *	The library is private in the sense that it needn't be in anyone's
+ *	execution path, but it should be accessible by the world.
+ *	It may have a ~ on the front. 
+ *	The standard distribution will put nothing in this directory.
+ *	Vendors who distribute perl may wish to place their own
+ *	architecture-dependent modules and extensions in this directory with
+ *		MakeMaker Makefile.PL INSTALLDIRS=vendor 
+ *	or equivalent.  See INSTALL for details.
+ */
+/* PERL_VENDORARCH_EXP:
+ *	This symbol contains the ~name expanded version of PERL_VENDORARCH, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/*#define PERL_VENDORARCH ""		/**/
+/*#define PERL_VENDORARCH_EXP ""		/**/
+
+/* PERL_VENDORLIB_EXP:
+ *	This symbol contains the ~name expanded version of VENDORLIB, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/* PERL_VENDORLIB_STEM:
+ *	This define is PERL_VENDORLIB_EXP with any trailing version-specific component
+ *	removed.  The elements in inc_version_list (inc_version_list.U) can
+ *	be tacked onto this variable to generate a list of directories to search.
+ */
+/*#define PERL_VENDORLIB_EXP ""		/**/
+/*#define PERL_VENDORLIB_STEM ""		/**/
+
+/* VOIDFLAGS:
+ *	This symbol indicates how much support of the void type is given by this
+ *	compiler.  What various bits mean:
+ *
+ *	    1 = supports declaration of void
+ *	    2 = supports arrays of pointers to functions returning void
+ *	    4 = supports comparisons between pointers to void functions and
+ *		    addresses of void functions
+ *	    8 = suports declaration of generic void pointers
+ *
+ *	The package designer should define VOIDUSED to indicate the requirements
+ *	of the package.  This can be done either by #defining VOIDUSED before
+ *	including config.h, or by defining defvoidused in Myinit.U.  If the
+ *	latter approach is taken, only those flags will be tested.  If the
+ *	level of void support necessary is not present, defines void to int.
+ */
+#ifndef VOIDUSED
+#define VOIDUSED 15
+#endif
+#define VOIDFLAGS 15
+#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#define void int		/* is void to be avoided? */
+#define M_VOID			/* Xenix strikes again */
+#endif
+
+/* HASATTRIBUTE_FORMAT:
+ *	Can we handle GCC attribute for checking printf-style formats
+ */
+/* HASATTRIBUTE_MALLOC:
+ *	Can we handle GCC attribute for malloc-style functions.
+ */
+/* HASATTRIBUTE_NONNULL:
+ *	Can we handle GCC attribute for nonnull function parms.
+ */
+/* HASATTRIBUTE_NORETURN:
+ *	Can we handle GCC attribute for functions that do not return
+ */
+/* HASATTRIBUTE_PURE:
+ *	Can we handle GCC attribute for pure functions
+ */
+/* HASATTRIBUTE_UNUSED:
+ *	Can we handle GCC attribute for unused variables and arguments
+ */
+/* HASATTRIBUTE_WARN_UNUSED_RESULT:
+ *	Can we handle GCC attribute for warning on unused results
+ */
+/*#define HASATTRIBUTE_FORMAT	/**/
+/*#define HASATTRIBUTE_NORETURN	/**/
+/*#define HASATTRIBUTE_MALLOC	/**/
+/*#define HASATTRIBUTE_NONNULL	/**/
+/*#define HASATTRIBUTE_PURE	/**/
+/*#define HASATTRIBUTE_UNUSED	/**/
+/*#define HASATTRIBUTE_WARN_UNUSED_RESULT	/**/
+
+/* HAS_CRYPT:
+ *	This symbol, if defined, indicates that the crypt routine is available
+ *	to encrypt passwords and the like.
+ */
+#define HAS_CRYPT		/**/
+
+/* SETUID_SCRIPTS_ARE_SECURE_NOW:
+ *	This symbol, if defined, indicates that the bug that prevents
+ *	setuid scripts from being secure is not present in this kernel.
+ */
+/* DOSUID:
+ *	This symbol, if defined, indicates that the C program should
+ *	check the script that it is executing for setuid/setgid bits, and
+ *	attempt to emulate setuid/setgid on systems that have disabled
+ *	setuid #! scripts because the kernel can't do it securely.
+ *	It is up to the package designer to make sure that this emulation
+ *	is done securely.  Among other things, it should do an fstat on
+ *	the script it just opened to make sure it really is a setuid/setgid
+ *	script, it should make sure the arguments passed correspond exactly
+ *	to the argument on the #! line, and it should not trust any
+ *	subprocesses to which it must pass the filename rather than the
+ *	file descriptor of the script to be executed.
+ */
+/*#define SETUID_SCRIPTS_ARE_SECURE_NOW	/**/
+/*#define DOSUID		/**/
+
+/* Shmat_t:
+ *	This symbol holds the return type of the shmat() system call.
+ *	Usually set to 'void *' or 'char *'.
+ */
+/* HAS_SHMAT_PROTOTYPE:
+ *	This symbol, if defined, indicates that the sys/shm.h includes
+ *	a prototype for shmat().  Otherwise, it is up to the program to
+ *	guess one.  Shmat_t shmat(int, Shmat_t, int) is a good guess,
+ *	but not always right so it should be emitted by the program only
+ *	when HAS_SHMAT_PROTOTYPE is not defined to avoid conflicting defs.
+ */
+#define Shmat_t void *	/**/
+/*#define HAS_SHMAT_PROTOTYPE	/**/
+
+/* I_NDBM:
+ *	This symbol, if defined, indicates that <ndbm.h> exists and should
+ *	be included.
+ */
+/*#define I_NDBM	/**/
+
+/* I_STDARG:
+ *	This symbol, if defined, indicates that <stdarg.h> exists and should
+ *	be included.
+ */
+/* I_VARARGS:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <varargs.h>.
+ */
+#define I_STDARG		/**/
+/*#define I_VARARGS	/**/
+
+/* CAN_PROTOTYPE:
+ *	If defined, this macro indicates that the C compiler can handle
+ *	function prototypes.
+ */
+/* _:
+ *	This macro is used to declare function parameters for folks who want
+ *	to make declarations with prototypes using a different style than
+ *	the above macros.  Use double parentheses.  For example:
+ *
+ *		int main _((int argc, char *argv[]));
+ */
+#define	CAN_PROTOTYPE	/**/
+#ifdef CAN_PROTOTYPE
+#define	_(args) args
+#else
+#define	_(args) ()
+#endif
+
+/* SH_PATH:
+ *	This symbol contains the full pathname to the shell used on this
+ *	on this system to execute Bourne shell scripts.  Usually, this will be
+ *	/bin/sh, though it's possible that some systems will have /bin/ksh,
+ *	/bin/pdksh, /bin/ash, /bin/bash, or even something such as
+ *	D:/bin/sh.exe.
+ */
+#define SH_PATH "cmd /x /c"  /**/
+
+/* HAS_AINTL:
+ *	This symbol, if defined, indicates that the aintl routine is
+ *	available.  If copysignl is also present we can emulate modfl.
+ */
+/*#define HAS_AINTL		/**/
+
+/* HAS_CLEARENV:
+ *	This symbol, if defined, indicates that the clearenv () routine is
+ *	available for use.
+ */
+/*#define HAS_CLEARENV		/**/
+
+/* HAS_COPYSIGNL:
+ *	This symbol, if defined, indicates that the copysignl routine is
+ *	available.  If aintl is also present we can emulate modfl.
+ */
+/*#define HAS_COPYSIGNL		/**/
+
+/* HAS_DBMINIT_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the dbminit() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern int dbminit(char *);
+ */
+/*#define	HAS_DBMINIT_PROTO	/**/
+
+/* HAS_DIRFD:
+ *	This manifest constant lets the C program know that dirfd
+ *	is available.
+ */
+/*#define HAS_DIRFD		/**/
+
+/* HAS_FAST_STDIO:
+ *	This symbol, if defined, indicates that the "fast stdio"
+ *	is available to manipulate the stdio buffers directly.
+ */
+#define HAS_FAST_STDIO		/**/
+
+/* HAS_FLOCK_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the flock() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern int flock(int, int);
+ */
+#define	HAS_FLOCK_PROTO	/**/
+
+/* HAS_FPCLASSL:
+ *	This symbol, if defined, indicates that the fpclassl routine is
+ *	available to classify long doubles.  Available for example in IRIX.
+ *	The returned values are defined in <ieeefp.h> and are:
+ *
+ *	FP_SNAN		signaling NaN
+ *	FP_QNAN		quiet NaN
+ *	FP_NINF		negative infinity
+ *	FP_PINF		positive infinity
+ *	FP_NDENORM	negative denormalized non-zero
+ *	FP_PDENORM	positive denormalized non-zero
+ *	FP_NZERO	negative zero
+ *	FP_PZERO	positive zero
+ *	FP_NNORM	negative normalized non-zero
+ *	FP_PNORM	positive normalized non-zero
+ */
+/*#define HAS_FPCLASSL		/**/
+
+/* HAS_ILOGBL:
+ *	This symbol, if defined, indicates that the ilogbl routine is
+ *	available.  If scalbnl is also present we can emulate frexpl.
+ */
+/*#define HAS_ILOGBL		/**/
+
+/* LIBM_LIB_VERSION:
+ *	This symbol, if defined, indicates that libm exports _LIB_VERSION
+ *	and that math.h defines the enum to manipulate it.
+ */
+/*#define LIBM_LIB_VERSION		/**/
+
+/* HAS_NL_LANGINFO:
+ *	This symbol, if defined, indicates that the nl_langinfo routine is
+ *	available to return local data.  You will also need <langinfo.h>
+ *	and therefore I_LANGINFO.
+ */
+/*#define HAS_NL_LANGINFO		/**/
+
+/* HAS_PROCSELFEXE:
+ *	This symbol is defined if PROCSELFEXE_PATH is a symlink
+ *	to the absolute pathname of the executing program.
+ */
+/* PROCSELFEXE_PATH:
+ *	If HAS_PROCSELFEXE is defined this symbol is the filename
+ *	of the symbolic link pointing to the absolute pathname of
+ *	the executing program.
+ */
+/*#define HAS_PROCSELFEXE	/**/
+#if defined(HAS_PROCSELFEXE) && !defined(PROCSELFEXE_PATH)
+#define PROCSELFEXE_PATH		/**/
+#endif
+
+/* HAS_PTHREAD_ATTR_SETSCOPE:
+ *	This symbol, if defined, indicates that the pthread_attr_setscope
+ *	system call is available to set the contention scope attribute of
+ *	a thread attribute object.
+ */
+/*#define HAS_PTHREAD_ATTR_SETSCOPE		/**/
+
+/* HAS_SCALBNL:
+ *	This symbol, if defined, indicates that the scalbnl routine is
+ *	available.  If ilogbl is also present we can emulate frexpl.
+ */
+/*#define HAS_SCALBNL		/**/
+
+/* HAS_SIGPROCMASK:
+ *	This symbol, if defined, indicates that the sigprocmask
+ *	system call is available to examine or change the signal mask
+ *	of the calling process.
+ */
+/*#define HAS_SIGPROCMASK		/**/
+
+/* HAS_SOCKATMARK:
+ *	This symbol, if defined, indicates that the sockatmark routine is
+ *	available to test whether a socket is at the out-of-band mark.
+ */
+/*#define HAS_SOCKATMARK		/**/
+
+/* HAS_SOCKATMARK_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the sockatmark() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern int sockatmark(int);
+ */
+/*#define	HAS_SOCKATMARK_PROTO	/**/
+
+/* SPRINTF_RETURNS_STRLEN:
+ *	This variable defines whether sprintf returns the length of the string
+ *	(as per the ANSI spec). Some C libraries retain compatibility with
+ *	pre-ANSI C and return a pointer to the passed in buffer; for these
+ *	this variable will be undef.
+ */
+#define SPRINTF_RETURNS_STRLEN	/**/
+
+/* HAS_SETRESGID_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the setresgid() function.  Otherwise, it is up
+ *	to the program to supply one.  Good guesses are
+ *		extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
+ */
+/*#define	HAS_SETRESGID_PROTO	/**/
+
+/* HAS_SETRESUID_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the setresuid() function.  Otherwise, it is up
+ *	to the program to supply one.  Good guesses are
+ *		extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
+ */
+/*#define	HAS_SETRESUID_PROTO	/**/
+
+/* HAS_STRFTIME:
+ *	This symbol, if defined, indicates that the strftime routine is
+ *	available to do time formatting.
+ */
+#define HAS_STRFTIME		/**/
+
+/* HAS_STRLCAT:
+ *	This symbol, if defined, indicates that the strlcat () routine is
+ *	available to do string concatenation.
+ */
+/*#define HAS_STRLCAT		/**/
+
+/* HAS_STRLCPY:
+ *	This symbol, if defined, indicates that the strlcpy () routine is
+ *	available to do string copying.
+ */
+/*#define HAS_STRLCPY		/**/
+
+/* HAS_SYSCALL_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the syscall() function.  Otherwise, it is up
+ *	to the program to supply one.  Good guesses are
+ *		extern int syscall(int,  ...);
+ *		extern int syscall(long, ...);
+ */
+/*#define	HAS_SYSCALL_PROTO	/**/
+
+/* U32_ALIGNMENT_REQUIRED:
+ *	This symbol, if defined, indicates that you must access
+ *	character data through U32-aligned pointers.
+ */
+#ifndef U32_ALIGNMENT_REQUIRED
+#define U32_ALIGNMENT_REQUIRED	/**/
+#endif
+
+/* HAS_USLEEP_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the usleep() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern int usleep(useconds_t);
+ */
+/*#define	HAS_USLEEP_PROTO	/**/
+
+/* I_CRYPT:
+ *	This symbol, if defined, indicates that <crypt.h> exists and
+ *	should be included.
+ */
+/*#define	I_CRYPT		/**/
+
+/* I_FP:
+ *	This symbol, if defined, indicates that <fp.h> exists and
+ *	should be included.
+ */
+/*#define	I_FP		/**/
+
+/* I_LANGINFO:
+ *	This symbol, if defined, indicates that <langinfo.h> exists and
+ *	should be included.
+ */
+/*#define	I_LANGINFO		/**/
+
+/* USE_FAST_STDIO:
+ *	This symbol, if defined, indicates that Perl should
+ *	be built to use 'fast stdio'.
+ *	Defaults to define in Perls 5.8 and earlier, to undef later.
+ */
+#ifndef USE_FAST_STDIO
+#define	USE_FAST_STDIO		/**/
+#endif
+
+/* PERL_RELOCATABLE_INC:
+ *	This symbol, if defined, indicates that we'd like to relocate entries
+ *	in @INC at run time based on the location of the perl binary.
+ */
+#define PERL_RELOCATABLE_INC "undef" 		/**/
+
+/* HAS_CTERMID_R:
+ *	This symbol, if defined, indicates that the ctermid_r routine
+ *	is available to ctermid re-entrantly.
+ */
+/* CTERMID_R_PROTO:
+ *	This symbol encodes the prototype of ctermid_r.
+ *	It is zero if d_ctermid_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctermid_r
+ *	is defined.
+ */
+/*#define HAS_CTERMID_R	   /**/
+#define CTERMID_R_PROTO 0	   /**/
+
+/* HAS_ENDHOSTENT_R:
+ *	This symbol, if defined, indicates that the endhostent_r routine
+ *	is available to endhostent re-entrantly.
+ */
+/* ENDHOSTENT_R_PROTO:
+ *	This symbol encodes the prototype of endhostent_r.
+ *	It is zero if d_endhostent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endhostent_r
+ *	is defined.
+ */
+/*#define HAS_ENDHOSTENT_R	   /**/
+#define ENDHOSTENT_R_PROTO 0	   /**/
+
+/* HAS_ENDNETENT_R:
+ *	This symbol, if defined, indicates that the endnetent_r routine
+ *	is available to endnetent re-entrantly.
+ */
+/* ENDNETENT_R_PROTO:
+ *	This symbol encodes the prototype of endnetent_r.
+ *	It is zero if d_endnetent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endnetent_r
+ *	is defined.
+ */
+/*#define HAS_ENDNETENT_R	   /**/
+#define ENDNETENT_R_PROTO 0	   /**/
+
+/* HAS_ENDPROTOENT_R:
+ *	This symbol, if defined, indicates that the endprotoent_r routine
+ *	is available to endprotoent re-entrantly.
+ */
+/* ENDPROTOENT_R_PROTO:
+ *	This symbol encodes the prototype of endprotoent_r.
+ *	It is zero if d_endprotoent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endprotoent_r
+ *	is defined.
+ */
+/*#define HAS_ENDPROTOENT_R	   /**/
+#define ENDPROTOENT_R_PROTO 0	   /**/
+
+/* HAS_ENDSERVENT_R:
+ *	This symbol, if defined, indicates that the endservent_r routine
+ *	is available to endservent re-entrantly.
+ */
+/* ENDSERVENT_R_PROTO:
+ *	This symbol encodes the prototype of endservent_r.
+ *	It is zero if d_endservent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endservent_r
+ *	is defined.
+ */
+/*#define HAS_ENDSERVENT_R	   /**/
+#define ENDSERVENT_R_PROTO 0	   /**/
+
+/* HAS_GETHOSTBYADDR_R:
+ *	This symbol, if defined, indicates that the gethostbyaddr_r routine
+ *	is available to gethostbyaddr re-entrantly.
+ */
+/* GETHOSTBYADDR_R_PROTO:
+ *	This symbol encodes the prototype of gethostbyaddr_r.
+ *	It is zero if d_gethostbyaddr_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyaddr_r
+ *	is defined.
+ */
+/*#define HAS_GETHOSTBYADDR_R	   /**/
+#define GETHOSTBYADDR_R_PROTO 0	   /**/
+
+/* HAS_GETHOSTBYNAME_R:
+ *	This symbol, if defined, indicates that the gethostbyname_r routine
+ *	is available to gethostbyname re-entrantly.
+ */
+/* GETHOSTBYNAME_R_PROTO:
+ *	This symbol encodes the prototype of gethostbyname_r.
+ *	It is zero if d_gethostbyname_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyname_r
+ *	is defined.
+ */
+/*#define HAS_GETHOSTBYNAME_R	   /**/
+#define GETHOSTBYNAME_R_PROTO 0	   /**/
+
+/* HAS_GETHOSTENT_R:
+ *	This symbol, if defined, indicates that the gethostent_r routine
+ *	is available to gethostent re-entrantly.
+ */
+/* GETHOSTENT_R_PROTO:
+ *	This symbol encodes the prototype of gethostent_r.
+ *	It is zero if d_gethostent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostent_r
+ *	is defined.
+ */
+/*#define HAS_GETHOSTENT_R	   /**/
+#define GETHOSTENT_R_PROTO 0	   /**/
+
+/* HAS_GETNETBYADDR_R:
+ *	This symbol, if defined, indicates that the getnetbyaddr_r routine
+ *	is available to getnetbyaddr re-entrantly.
+ */
+/* GETNETBYADDR_R_PROTO:
+ *	This symbol encodes the prototype of getnetbyaddr_r.
+ *	It is zero if d_getnetbyaddr_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyaddr_r
+ *	is defined.
+ */
+/*#define HAS_GETNETBYADDR_R	   /**/
+#define GETNETBYADDR_R_PROTO 0	   /**/
+
+/* HAS_GETNETBYNAME_R:
+ *	This symbol, if defined, indicates that the getnetbyname_r routine
+ *	is available to getnetbyname re-entrantly.
+ */
+/* GETNETBYNAME_R_PROTO:
+ *	This symbol encodes the prototype of getnetbyname_r.
+ *	It is zero if d_getnetbyname_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyname_r
+ *	is defined.
+ */
+/*#define HAS_GETNETBYNAME_R	   /**/
+#define GETNETBYNAME_R_PROTO 0	   /**/
+
+/* HAS_GETNETENT_R:
+ *	This symbol, if defined, indicates that the getnetent_r routine
+ *	is available to getnetent re-entrantly.
+ */
+/* GETNETENT_R_PROTO:
+ *	This symbol encodes the prototype of getnetent_r.
+ *	It is zero if d_getnetent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetent_r
+ *	is defined.
+ */
+/*#define HAS_GETNETENT_R	   /**/
+#define GETNETENT_R_PROTO 0	   /**/
+
+/* HAS_GETPROTOBYNAME_R:
+ *	This symbol, if defined, indicates that the getprotobyname_r routine
+ *	is available to getprotobyname re-entrantly.
+ */
+/* GETPROTOBYNAME_R_PROTO:
+ *	This symbol encodes the prototype of getprotobyname_r.
+ *	It is zero if d_getprotobyname_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobyname_r
+ *	is defined.
+ */
+/*#define HAS_GETPROTOBYNAME_R	   /**/
+#define GETPROTOBYNAME_R_PROTO 0	   /**/
+
+/* HAS_GETPROTOBYNUMBER_R:
+ *	This symbol, if defined, indicates that the getprotobynumber_r routine
+ *	is available to getprotobynumber re-entrantly.
+ */
+/* GETPROTOBYNUMBER_R_PROTO:
+ *	This symbol encodes the prototype of getprotobynumber_r.
+ *	It is zero if d_getprotobynumber_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobynumber_r
+ *	is defined.
+ */
+/*#define HAS_GETPROTOBYNUMBER_R	   /**/
+#define GETPROTOBYNUMBER_R_PROTO 0	   /**/
+
+/* HAS_GETPROTOENT_R:
+ *	This symbol, if defined, indicates that the getprotoent_r routine
+ *	is available to getprotoent re-entrantly.
+ */
+/* GETPROTOENT_R_PROTO:
+ *	This symbol encodes the prototype of getprotoent_r.
+ *	It is zero if d_getprotoent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotoent_r
+ *	is defined.
+ */
+/*#define HAS_GETPROTOENT_R	   /**/
+#define GETPROTOENT_R_PROTO 0	   /**/
+
+/* HAS_GETSERVBYNAME_R:
+ *	This symbol, if defined, indicates that the getservbyname_r routine
+ *	is available to getservbyname re-entrantly.
+ */
+/* GETSERVBYNAME_R_PROTO:
+ *	This symbol encodes the prototype of getservbyname_r.
+ *	It is zero if d_getservbyname_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyname_r
+ *	is defined.
+ */
+/*#define HAS_GETSERVBYNAME_R	   /**/
+#define GETSERVBYNAME_R_PROTO 0	   /**/
+
+/* HAS_GETSERVBYPORT_R:
+ *	This symbol, if defined, indicates that the getservbyport_r routine
+ *	is available to getservbyport re-entrantly.
+ */
+/* GETSERVBYPORT_R_PROTO:
+ *	This symbol encodes the prototype of getservbyport_r.
+ *	It is zero if d_getservbyport_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyport_r
+ *	is defined.
+ */
+/*#define HAS_GETSERVBYPORT_R	   /**/
+#define GETSERVBYPORT_R_PROTO 0	   /**/
+
+/* HAS_GETSERVENT_R:
+ *	This symbol, if defined, indicates that the getservent_r routine
+ *	is available to getservent re-entrantly.
+ */
+/* GETSERVENT_R_PROTO:
+ *	This symbol encodes the prototype of getservent_r.
+ *	It is zero if d_getservent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservent_r
+ *	is defined.
+ */
+/*#define HAS_GETSERVENT_R	   /**/
+#define GETSERVENT_R_PROTO 0	   /**/
+
+/* HAS_PTHREAD_ATFORK:
+ *	This symbol, if defined, indicates that the pthread_atfork routine
+ *	is available to setup fork handlers.
+ */
+/*#define HAS_PTHREAD_ATFORK		/**/
+
+/* HAS_READDIR64_R:
+ *	This symbol, if defined, indicates that the readdir64_r routine
+ *	is available to readdir64 re-entrantly.
+ */
+/* READDIR64_R_PROTO:
+ *	This symbol encodes the prototype of readdir64_r.
+ *	It is zero if d_readdir64_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir64_r
+ *	is defined.
+ */
+/*#define HAS_READDIR64_R	   /**/
+#define READDIR64_R_PROTO 0	   /**/
+
+/* HAS_SETHOSTENT_R:
+ *	This symbol, if defined, indicates that the sethostent_r routine
+ *	is available to sethostent re-entrantly.
+ */
+/* SETHOSTENT_R_PROTO:
+ *	This symbol encodes the prototype of sethostent_r.
+ *	It is zero if d_sethostent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_sethostent_r
+ *	is defined.
+ */
+/*#define HAS_SETHOSTENT_R	   /**/
+#define SETHOSTENT_R_PROTO 0	   /**/
+
+/* HAS_SETLOCALE_R:
+ *	This symbol, if defined, indicates that the setlocale_r routine
+ *	is available to setlocale re-entrantly.
+ */
+/* SETLOCALE_R_PROTO:
+ *	This symbol encodes the prototype of setlocale_r.
+ *	It is zero if d_setlocale_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setlocale_r
+ *	is defined.
+ */
+/*#define HAS_SETLOCALE_R	   /**/
+#define SETLOCALE_R_PROTO 0	   /**/
+
+/* HAS_SETNETENT_R:
+ *	This symbol, if defined, indicates that the setnetent_r routine
+ *	is available to setnetent re-entrantly.
+ */
+/* SETNETENT_R_PROTO:
+ *	This symbol encodes the prototype of setnetent_r.
+ *	It is zero if d_setnetent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setnetent_r
+ *	is defined.
+ */
+/*#define HAS_SETNETENT_R	   /**/
+#define SETNETENT_R_PROTO 0	   /**/
+
+/* HAS_SETPROTOENT_R:
+ *	This symbol, if defined, indicates that the setprotoent_r routine
+ *	is available to setprotoent re-entrantly.
+ */
+/* SETPROTOENT_R_PROTO:
+ *	This symbol encodes the prototype of setprotoent_r.
+ *	It is zero if d_setprotoent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setprotoent_r
+ *	is defined.
+ */
+/*#define HAS_SETPROTOENT_R	   /**/
+#define SETPROTOENT_R_PROTO 0	   /**/
+
+/* HAS_SETSERVENT_R:
+ *	This symbol, if defined, indicates that the setservent_r routine
+ *	is available to setservent re-entrantly.
+ */
+/* SETSERVENT_R_PROTO:
+ *	This symbol encodes the prototype of setservent_r.
+ *	It is zero if d_setservent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setservent_r
+ *	is defined.
+ */
+/*#define HAS_SETSERVENT_R	   /**/
+#define SETSERVENT_R_PROTO 0	   /**/
+
+/* HAS_TTYNAME_R:
+ *	This symbol, if defined, indicates that the ttyname_r routine
+ *	is available to ttyname re-entrantly.
+ */
+/* TTYNAME_R_PROTO:
+ *	This symbol encodes the prototype of ttyname_r.
+ *	It is zero if d_ttyname_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_ttyname_r
+ *	is defined.
+ */
+/*#define HAS_TTYNAME_R	   /**/
+#define TTYNAME_R_PROTO 0	   /**/
+
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/cop.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/cop.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/cop.h	(revision 14489)
@@ -0,0 +1,586 @@
+/*    cop.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * Control ops (cops) are one of the three ops OP_NEXTSTATE, OP_DBSTATE,
+ * and OP_SETSTATE that (loosely speaking) are separate statements.
+ * They hold information important for lexical state and error reporting.
+ * At run time, PL_curcop is set to point to the most recently executed cop,
+ * and thus can be used to determine our current state.
+ */
+
+struct cop {
+    BASEOP
+    char *	cop_label;	/* label for this construct */
+#ifdef USE_ITHREADS
+    char *	cop_stashpv;	/* package line was compiled in */
+    char *	cop_file;	/* file name the following line # is from */
+#else
+    HV *	cop_stash;	/* package line was compiled in */
+    GV *	cop_filegv;	/* file the following line # is from */
+#endif
+    U32		cop_seq;	/* parse sequence number */
+    I32		cop_arybase;	/* array base this line was compiled with */
+    line_t      cop_line;       /* line # of this command */
+    SV *	cop_warnings;	/* lexical warnings bitmask */
+    SV *	cop_io;		/* lexical IO defaults */
+};
+
+#define Nullcop Null(COP*)
+
+#ifdef USE_ITHREADS
+#  define CopFILE(c)		((c)->cop_file)
+#  define CopFILEGV(c)		(CopFILE(c) \
+				 ? gv_fetchfile(CopFILE(c)) : Nullgv)
+				 
+#  ifdef NETWARE
+#    define CopFILE_set(c,pv)	((c)->cop_file = savepv(pv))
+#  else
+#    define CopFILE_set(c,pv)	((c)->cop_file = savesharedpv(pv))
+#  endif
+
+#  define CopFILESV(c)		(CopFILE(c) \
+				 ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
+#  define CopFILEAV(c)		(CopFILE(c) \
+				 ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
+#  define CopSTASHPV(c)		((c)->cop_stashpv)
+
+#  ifdef NETWARE
+#    define CopSTASHPV_set(c,pv)	((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
+#  else
+#    define CopSTASHPV_set(c,pv)	((c)->cop_stashpv = savesharedpv(pv))
+#  endif
+
+#  define CopSTASH(c)		(CopSTASHPV(c) \
+				 ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
+#  define CopSTASH_set(c,hv)	CopSTASHPV_set(c, (hv) ? HvNAME_get(hv) : Nullch)
+#  define CopSTASH_eq(c,hv)	((hv) && stashpv_hvname_match(c,hv))
+#  ifdef NETWARE
+#    define CopSTASH_free(c) SAVECOPSTASH_FREE(c)
+#    define CopFILE_free(c) SAVECOPFILE_FREE(c)
+#  else
+#    define CopSTASH_free(c)	PerlMemShared_free(CopSTASHPV(c))
+#    define CopFILE_free(c)	(PerlMemShared_free(CopFILE(c)),(CopFILE(c) = Nullch))
+#  endif
+#else
+#  define CopFILEGV(c)		((c)->cop_filegv)
+#  define CopFILEGV_set(c,gv)	((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
+#  define CopFILE_set(c,pv)	CopFILEGV_set((c), gv_fetchfile(pv))
+#  define CopFILESV(c)		(CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
+#  define CopFILEAV(c)		(CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
+#  define CopFILE(c)		(CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
+#  define CopSTASH(c)		((c)->cop_stash)
+#  define CopSTASH_set(c,hv)	((c)->cop_stash = (hv))
+#  define CopSTASHPV(c)		(CopSTASH(c) ? HvNAME_get(CopSTASH(c)) : Nullch)
+   /* cop_stash is not refcounted */
+#  define CopSTASHPV_set(c,pv)	CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
+#  define CopSTASH_eq(c,hv)	(CopSTASH(c) == (hv))
+#  define CopSTASH_free(c)	
+#  define CopFILE_free(c)	(SvREFCNT_dec(CopFILEGV(c)),(CopFILEGV(c) = Nullgv))
+
+#endif /* USE_ITHREADS */
+
+#define CopSTASH_ne(c,hv)	(!CopSTASH_eq(c,hv))
+#define CopLINE(c)		((c)->cop_line)
+#define CopLINE_inc(c)		(++CopLINE(c))
+#define CopLINE_dec(c)		(--CopLINE(c))
+#define CopLINE_set(c,l)	(CopLINE(c) = (l))
+
+/* OutCopFILE() is CopFILE for output (caller, die, warn, etc.) */
+#ifdef MACOS_TRADITIONAL
+#  define OutCopFILE(c) MacPerl_MPWFileName(CopFILE(c))
+#else
+#  define OutCopFILE(c) CopFILE(c)
+#endif
+
+/*
+ * Here we have some enormously heavy (or at least ponderous) wizardry.
+ */
+
+/* subroutine context */
+struct block_sub {
+    CV *	cv;
+    GV *	gv;
+    GV *	dfoutgv;
+#ifndef USE_5005THREADS
+    AV *	savearray;
+#endif /* USE_5005THREADS */
+    AV *	argarray;
+    long	olddepth;
+    U8		hasargs;
+    U8		lval;		/* XXX merge lval and hasargs? */
+    PAD		*oldcomppad;
+};
+
+/* base for the next two macros. Don't use directly.
+ * Note that the refcnt of the cv is incremented twice;  The CX one is
+ * decremented by LEAVESUB, the other by LEAVE. */
+
+#define PUSHSUB_BASE(cx)						\
+	cx->blk_sub.cv = cv;						\
+	cx->blk_sub.olddepth = CvDEPTH(cv);				\
+	cx->blk_sub.hasargs = hasargs;					\
+	if (!CvDEPTH(cv)) {						\
+	    (void)SvREFCNT_inc(cv);					\
+	    (void)SvREFCNT_inc(cv);					\
+	    SAVEFREESV(cv);						\
+	}
+
+
+#define PUSHSUB(cx)							\
+	PUSHSUB_BASE(cx)						\
+	cx->blk_sub.lval = PL_op->op_private &                          \
+	                      (OPpLVAL_INTRO|OPpENTERSUB_INARGS);
+
+/* variant for use by OP_DBSTATE, where op_private holds hint bits */
+#define PUSHSUB_DB(cx)							\
+	PUSHSUB_BASE(cx)						\
+	cx->blk_sub.lval = 0;
+
+
+#define PUSHFORMAT(cx)							\
+	cx->blk_sub.cv = cv;						\
+	cx->blk_sub.gv = gv;						\
+	cx->blk_sub.hasargs = 0;					\
+	cx->blk_sub.dfoutgv = PL_defoutgv;				\
+	(void)SvREFCNT_inc(cx->blk_sub.dfoutgv)
+
+#ifdef USE_5005THREADS
+#  define POP_SAVEARRAY() NOOP
+#else
+#  define POP_SAVEARRAY()						\
+    STMT_START {							\
+	SvREFCNT_dec(GvAV(PL_defgv));					\
+	GvAV(PL_defgv) = cx->blk_sub.savearray;				\
+    } STMT_END
+#endif /* USE_5005THREADS */
+
+/* junk in @_ spells trouble when cloning CVs and in pp_caller(), so don't
+ * leave any (a fast av_clear(ary), basically) */
+#define CLEAR_ARGARRAY(ary) \
+    STMT_START {							\
+	AvMAX(ary) += AvARRAY(ary) - AvALLOC(ary);			\
+	SvPV_set(ary, (char*)AvALLOC(ary));				\
+	AvFILLp(ary) = -1;						\
+    } STMT_END
+
+#define POPSUB(cx,sv)							\
+    STMT_START {							\
+	if (cx->blk_sub.hasargs) {					\
+	    POP_SAVEARRAY();						\
+	    /* abandon @_ if it got reified */				\
+	    if (AvREAL(cx->blk_sub.argarray)) {				\
+		SSize_t fill = AvFILLp(cx->blk_sub.argarray);		\
+		SvREFCNT_dec(cx->blk_sub.argarray);			\
+		cx->blk_sub.argarray = newAV();				\
+		av_extend(cx->blk_sub.argarray, fill);			\
+		AvFLAGS(cx->blk_sub.argarray) = AVf_REIFY;		\
+		CX_CURPAD_SV(cx->blk_sub, 0) = (SV*)cx->blk_sub.argarray;	\
+	    }								\
+	    else {							\
+		CLEAR_ARGARRAY(cx->blk_sub.argarray);			\
+	    }								\
+	}								\
+	sv = (SV*)cx->blk_sub.cv;					\
+	if (sv && (CvDEPTH((CV*)sv) = cx->blk_sub.olddepth))		\
+	    sv = Nullsv;						\
+    } STMT_END
+
+#define LEAVESUB(sv)							\
+    STMT_START {							\
+	if (sv)								\
+	    SvREFCNT_dec(sv);						\
+    } STMT_END
+
+#define POPFORMAT(cx)							\
+	setdefout(cx->blk_sub.dfoutgv);					\
+	SvREFCNT_dec(cx->blk_sub.dfoutgv);
+
+/* eval context */
+struct block_eval {
+    I32		old_in_eval;
+    I32		old_op_type;
+    SV *	old_namesv;
+    OP *	old_eval_root;
+    SV *	cur_text;
+    CV *	cv;
+};
+
+#define PUSHEVAL(cx,n,fgv)						\
+    STMT_START {							\
+	cx->blk_eval.old_in_eval = PL_in_eval;				\
+	cx->blk_eval.old_op_type = PL_op->op_type;			\
+	cx->blk_eval.old_namesv = (n ? newSVpv(n,0) : Nullsv);		\
+	cx->blk_eval.old_eval_root = PL_eval_root;			\
+	cx->blk_eval.cur_text = PL_linestr;				\
+	cx->blk_eval.cv = Nullcv; /* set by doeval(), as applicable */	\
+    } STMT_END
+
+#define POPEVAL(cx)							\
+    STMT_START {							\
+	PL_in_eval = cx->blk_eval.old_in_eval;				\
+	optype = cx->blk_eval.old_op_type;				\
+	PL_eval_root = cx->blk_eval.old_eval_root;			\
+	if (cx->blk_eval.old_namesv)					\
+	    sv_2mortal(cx->blk_eval.old_namesv);			\
+    } STMT_END
+
+/* loop context */
+struct block_loop {
+    char *	label;
+    I32		resetsp;
+    OP *	redo_op;
+    OP *	next_op;
+    OP *	last_op;
+#ifdef USE_ITHREADS
+    void *	iterdata;
+    PAD		*oldcomppad;
+#else
+    SV **	itervar;
+#endif
+    SV *	itersave;
+    SV *	iterlval;
+    AV *	iterary;
+    IV		iterix;
+    IV		itermax;
+};
+
+#ifdef USE_ITHREADS
+#  define CxITERVAR(c)							\
+	((c)->blk_loop.iterdata						\
+	 ? (CxPADLOOP(cx) 						\
+	    ? &CX_CURPAD_SV( (c)->blk_loop, 				\
+		    INT2PTR(PADOFFSET, (c)->blk_loop.iterdata))		\
+	    : &GvSV((GV*)(c)->blk_loop.iterdata))			\
+	 : (SV**)NULL)
+#  define CX_ITERDATA_SET(cx,idata)					\
+	CX_CURPAD_SAVE(cx->blk_loop);					\
+	if ((cx->blk_loop.iterdata = (idata)))				\
+	    cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));	\
+	else								\
+	    cx->blk_loop.itersave = Nullsv;
+#else
+#  define CxITERVAR(c)		((c)->blk_loop.itervar)
+#  define CX_ITERDATA_SET(cx,ivar)					\
+	if ((cx->blk_loop.itervar = (SV**)(ivar)))			\
+	    cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));	\
+	else								\
+	    cx->blk_loop.itersave = Nullsv;
+#endif
+
+#define PUSHLOOP(cx, dat, s)						\
+	cx->blk_loop.label = PL_curcop->cop_label;			\
+	cx->blk_loop.resetsp = s - PL_stack_base;			\
+	cx->blk_loop.redo_op = cLOOP->op_redoop;			\
+	cx->blk_loop.next_op = cLOOP->op_nextop;			\
+	cx->blk_loop.last_op = cLOOP->op_lastop;			\
+	cx->blk_loop.iterlval = Nullsv;					\
+	cx->blk_loop.iterary = Nullav;					\
+	cx->blk_loop.iterix = -1;					\
+	CX_ITERDATA_SET(cx,dat);
+
+#define POPLOOP(cx)							\
+	SvREFCNT_dec(cx->blk_loop.iterlval);				\
+	if (CxITERVAR(cx)) {						\
+	    SV **s_v_p = CxITERVAR(cx);					\
+	    sv_2mortal(*s_v_p);						\
+	    *s_v_p = cx->blk_loop.itersave;				\
+	}								\
+	if (cx->blk_loop.iterary && cx->blk_loop.iterary != PL_curstack)\
+	    SvREFCNT_dec(cx->blk_loop.iterary);
+
+/* context common to subroutines, evals and loops */
+struct block {
+    I32		blku_oldsp;	/* stack pointer to copy stuff down to */
+    COP *	blku_oldcop;	/* old curcop pointer */
+    I32		blku_oldretsp;	/* return stack index */
+    I32		blku_oldmarksp;	/* mark stack index */
+    I32		blku_oldscopesp;	/* scope stack index */
+    PMOP *	blku_oldpm;	/* values of pattern match vars */
+    U8		blku_gimme;	/* is this block running in list context? */
+
+    union {
+	struct block_sub	blku_sub;
+	struct block_eval	blku_eval;
+	struct block_loop	blku_loop;
+    } blk_u;
+};
+#define blk_oldsp	cx_u.cx_blk.blku_oldsp
+#define blk_oldcop	cx_u.cx_blk.blku_oldcop
+#define blk_oldretsp	cx_u.cx_blk.blku_oldretsp
+#define blk_oldmarksp	cx_u.cx_blk.blku_oldmarksp
+#define blk_oldscopesp	cx_u.cx_blk.blku_oldscopesp
+#define blk_oldpm	cx_u.cx_blk.blku_oldpm
+#define blk_gimme	cx_u.cx_blk.blku_gimme
+#define blk_sub		cx_u.cx_blk.blk_u.blku_sub
+#define blk_eval	cx_u.cx_blk.blk_u.blku_eval
+#define blk_loop	cx_u.cx_blk.blk_u.blku_loop
+
+/* Enter a block. */
+#define PUSHBLOCK(cx,t,sp) CXINC, cx = &cxstack[cxstack_ix],		\
+	cx->cx_type		= t,					\
+	cx->blk_oldsp		= sp - PL_stack_base,			\
+	cx->blk_oldcop		= PL_curcop,				\
+	cx->blk_oldmarksp	= PL_markstack_ptr - PL_markstack,	\
+	cx->blk_oldscopesp	= PL_scopestack_ix,			\
+	cx->blk_oldretsp	= PL_retstack_ix,			\
+	cx->blk_oldpm		= PL_curpm,				\
+	cx->blk_gimme		= (U8)gimme;				\
+	DEBUG_l( PerlIO_printf(Perl_debug_log, "Entering block %ld, type %s\n",	\
+		    (long)cxstack_ix, PL_block_type[CxTYPE(cx)]); )
+
+/* Exit a block (RETURN and LAST). */
+#define POPBLOCK(cx,pm) cx = &cxstack[cxstack_ix--],			\
+	newsp		 = PL_stack_base + cx->blk_oldsp,		\
+	PL_curcop	 = cx->blk_oldcop,				\
+	PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp,		\
+	PL_scopestack_ix = cx->blk_oldscopesp,				\
+	PL_retstack_ix	 = cx->blk_oldretsp,				\
+	pm		 = cx->blk_oldpm,				\
+	gimme		 = cx->blk_gimme;				\
+	DEBUG_SCOPE("POPBLOCK");					\
+	DEBUG_l( PerlIO_printf(Perl_debug_log, "Leaving block %ld, type %s\n",		\
+		    (long)cxstack_ix+1,PL_block_type[CxTYPE(cx)]); )
+
+/* Continue a block elsewhere (NEXT and REDO). */
+#define TOPBLOCK(cx) cx  = &cxstack[cxstack_ix],			\
+	PL_stack_sp	 = PL_stack_base + cx->blk_oldsp,		\
+	PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp,		\
+	PL_scopestack_ix = cx->blk_oldscopesp,				\
+	PL_retstack_ix	 = cx->blk_oldretsp,				\
+	PL_curpm         = cx->blk_oldpm;				\
+	DEBUG_SCOPE("TOPBLOCK");
+
+/* substitution context */
+struct subst {
+    I32		sbu_iters;
+    I32		sbu_maxiters;
+    I32		sbu_rflags;
+    I32		sbu_oldsave;
+    bool	sbu_once;
+    bool	sbu_rxtainted;
+    char *	sbu_orig;
+    SV *	sbu_dstr;
+    SV *	sbu_targ;
+    char *	sbu_s;
+    char *	sbu_m;
+    char *	sbu_strend;
+    void *	sbu_rxres;
+    REGEXP *	sbu_rx;
+};
+#define sb_iters	cx_u.cx_subst.sbu_iters
+#define sb_maxiters	cx_u.cx_subst.sbu_maxiters
+#define sb_rflags	cx_u.cx_subst.sbu_rflags
+#define sb_oldsave	cx_u.cx_subst.sbu_oldsave
+#define sb_once		cx_u.cx_subst.sbu_once
+#define sb_rxtainted	cx_u.cx_subst.sbu_rxtainted
+#define sb_orig		cx_u.cx_subst.sbu_orig
+#define sb_dstr		cx_u.cx_subst.sbu_dstr
+#define sb_targ		cx_u.cx_subst.sbu_targ
+#define sb_s		cx_u.cx_subst.sbu_s
+#define sb_m		cx_u.cx_subst.sbu_m
+#define sb_strend	cx_u.cx_subst.sbu_strend
+#define sb_rxres	cx_u.cx_subst.sbu_rxres
+#define sb_rx		cx_u.cx_subst.sbu_rx
+
+#define PUSHSUBST(cx) CXINC, cx = &cxstack[cxstack_ix],			\
+	cx->sb_iters		= iters,				\
+	cx->sb_maxiters		= maxiters,				\
+	cx->sb_rflags		= r_flags,				\
+	cx->sb_oldsave		= oldsave,				\
+	cx->sb_once		= once,					\
+	cx->sb_rxtainted	= rxtainted,				\
+	cx->sb_orig		= orig,					\
+	cx->sb_dstr		= dstr,					\
+	cx->sb_targ		= targ,					\
+	cx->sb_s		= s,					\
+	cx->sb_m		= m,					\
+	cx->sb_strend		= strend,				\
+	cx->sb_rxres		= Null(void*),				\
+	cx->sb_rx		= rx,					\
+	cx->cx_type		= CXt_SUBST;				\
+	rxres_save(&cx->sb_rxres, rx)
+
+#define POPSUBST(cx) cx = &cxstack[cxstack_ix--];			\
+	rxres_free(&cx->sb_rxres)
+
+struct context {
+    U32		cx_type;	/* what kind of context this is */
+    union {
+	struct block	cx_blk;
+	struct subst	cx_subst;
+    } cx_u;
+};
+
+#define CXTYPEMASK	0xff
+#define CXt_NULL	0
+#define CXt_SUB		1
+#define CXt_EVAL	2
+#define CXt_LOOP	3
+#define CXt_SUBST	4
+#define CXt_BLOCK	5
+#define CXt_FORMAT	6
+
+/* private flags for CXt_EVAL */
+#define CXp_REAL	0x00000100	/* truly eval'', not a lookalike */
+#define CXp_TRYBLOCK	0x00000200	/* eval{}, not eval'' or similar */
+
+#ifdef USE_ITHREADS
+/* private flags for CXt_LOOP */
+#  define CXp_PADVAR	0x00000100	/* itervar lives on pad, iterdata
+					   has pad offset; if not set,
+					   iterdata holds GV* */
+#  define CxPADLOOP(c)	(((c)->cx_type & (CXt_LOOP|CXp_PADVAR))		\
+			 == (CXt_LOOP|CXp_PADVAR))
+#endif
+
+#define CxTYPE(c)	((c)->cx_type & CXTYPEMASK)
+#define CxREALEVAL(c)	(((c)->cx_type & (CXt_EVAL|CXp_REAL))		\
+			 == (CXt_EVAL|CXp_REAL))
+#define CxTRYBLOCK(c)	(((c)->cx_type & (CXt_EVAL|CXp_TRYBLOCK))	\
+			 == (CXt_EVAL|CXp_TRYBLOCK))
+
+#define CXINC (cxstack_ix < cxstack_max ? ++cxstack_ix : (cxstack_ix = cxinc()))
+
+/* 
+=head1 "Gimme" Values
+*/
+
+/*
+=for apidoc AmU||G_SCALAR
+Used to indicate scalar context.  See C<GIMME_V>, C<GIMME>, and
+L<perlcall>.
+
+=for apidoc AmU||G_ARRAY
+Used to indicate list context.  See C<GIMME_V>, C<GIMME> and
+L<perlcall>.
+
+=for apidoc AmU||G_VOID
+Used to indicate void context.  See C<GIMME_V> and L<perlcall>.
+
+=for apidoc AmU||G_DISCARD
+Indicates that arguments returned from a callback should be discarded.  See
+L<perlcall>.
+
+=for apidoc AmU||G_EVAL
+
+Used to force a Perl C<eval> wrapper around a callback.  See
+L<perlcall>.
+
+=for apidoc AmU||G_NOARGS
+
+Indicates that no arguments are being sent to a callback.  See
+L<perlcall>.
+
+=cut
+*/
+
+#define G_SCALAR	0
+#define G_ARRAY		1
+#define G_VOID		128	/* skip this bit when adding flags below */
+
+/* extra flags for Perl_call_* routines */
+#define G_DISCARD	2	/* Call FREETMPS. */
+#define G_EVAL		4	/* Assume eval {} around subroutine call. */
+#define G_NOARGS	8	/* Don't construct a @_ array. */
+#define G_KEEPERR      16	/* Append errors to $@, don't overwrite it */
+#define G_NODEBUG      32	/* Disable debugging at toplevel.  */
+#define G_METHOD       64       /* Calling method. */
+
+/* flag bits for PL_in_eval */
+#define EVAL_NULL	0	/* not in an eval */
+#define EVAL_INEVAL	1	/* some enclosing scope is an eval */
+#define EVAL_WARNONLY	2	/* used by yywarn() when calling yyerror() */
+#define EVAL_KEEPERR	4	/* set by Perl_call_sv if G_KEEPERR */
+#define EVAL_INREQUIRE	8	/* The code is being required. */
+
+/* Support for switching (stack and block) contexts.
+ * This ensures magic doesn't invalidate local stack and cx pointers.
+ */
+
+#define PERLSI_UNKNOWN		-1
+#define PERLSI_UNDEF		0
+#define PERLSI_MAIN		1
+#define PERLSI_MAGIC		2
+#define PERLSI_SORT		3
+#define PERLSI_SIGNAL		4
+#define PERLSI_OVERLOAD		5
+#define PERLSI_DESTROY		6
+#define PERLSI_WARNHOOK		7
+#define PERLSI_DIEHOOK		8
+#define PERLSI_REQUIRE		9
+
+struct stackinfo {
+    AV *		si_stack;	/* stack for current runlevel */
+    PERL_CONTEXT *	si_cxstack;	/* context stack for runlevel */
+    I32			si_cxix;	/* current context index */
+    I32			si_cxmax;	/* maximum allocated index */
+    I32			si_type;	/* type of runlevel */
+    struct stackinfo *	si_prev;
+    struct stackinfo *	si_next;
+    I32			si_markoff;	/* offset where markstack begins for us.
+					 * currently used only with DEBUGGING,
+					 * but not #ifdef-ed for bincompat */
+};
+
+typedef struct stackinfo PERL_SI;
+
+#define cxstack		(PL_curstackinfo->si_cxstack)
+#define cxstack_ix	(PL_curstackinfo->si_cxix)
+#define cxstack_max	(PL_curstackinfo->si_cxmax)
+
+#ifdef DEBUGGING
+#  define	SET_MARK_OFFSET \
+    PL_curstackinfo->si_markoff = PL_markstack_ptr - PL_markstack
+#else
+#  define	SET_MARK_OFFSET NOOP
+#endif
+
+#define PUSHSTACKi(type) \
+    STMT_START {							\
+	PERL_SI *next = PL_curstackinfo->si_next;			\
+	if (!next) {							\
+	    next = new_stackinfo(32, 2048/sizeof(PERL_CONTEXT) - 1);	\
+	    next->si_prev = PL_curstackinfo;				\
+	    PL_curstackinfo->si_next = next;				\
+	}								\
+	next->si_type = type;						\
+	next->si_cxix = -1;						\
+	AvFILLp(next->si_stack) = 0;					\
+	SWITCHSTACK(PL_curstack,next->si_stack);			\
+	PL_curstackinfo = next;						\
+	SET_MARK_OFFSET;						\
+    } STMT_END
+
+#define PUSHSTACK PUSHSTACKi(PERLSI_UNKNOWN)
+
+/* POPSTACK works with PL_stack_sp, so it may need to be bracketed by
+ * PUTBACK/SPAGAIN to flush/refresh any local SP that may be active */
+#define POPSTACK \
+    STMT_START {							\
+	dSP;								\
+	PERL_SI *prev = PL_curstackinfo->si_prev;			\
+	if (!prev) {							\
+	    PerlIO_printf(Perl_error_log, "panic: POPSTACK\n");		\
+	    my_exit(1);							\
+	}								\
+	SWITCHSTACK(PL_curstack,prev->si_stack);			\
+	/* don't free prev here, free them all at the END{} */		\
+	PL_curstackinfo = prev;						\
+    } STMT_END
+
+#define POPSTACK_TO(s) \
+    STMT_START {							\
+	while (PL_curstack != s) {					\
+	    dounwind(-1);						\
+	    POPSTACK;							\
+	}								\
+    } STMT_END
+
+#define IN_PERL_COMPILETIME	(PL_curcop == &PL_compiling)
+#define IN_PERL_RUNTIME		(PL_curcop != &PL_compiling)
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/cv.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/cv.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/cv.h	(revision 14489)
@@ -0,0 +1,210 @@
+/*    cv.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999,
+ *    2000, 2001, 2002, 2003, 2004, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/* This structure must match XPVCV in B/C.pm and the beginning of XPVFM
+ * in sv.h  */
+
+struct xpvcv {
+    char *	xpv_pv;		/* pointer to malloced string (for prototype) */
+    STRLEN	xpv_cur;	/* length of xp_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    IV		xof_off;	/* integer value */
+    NV		xnv_nv;		/* numeric value, if any */
+    MAGIC*	xmg_magic;	/* magic for scalar array */
+    HV*		xmg_stash;	/* class package */
+
+    HV *	xcv_stash;
+    OP *	xcv_start;
+    OP *	xcv_root;
+    void	(*xcv_xsub) (pTHX_ CV*);
+    ANY		xcv_xsubany;
+    GV *	xcv_gv;
+    char *	xcv_file;
+    long	xcv_depth;	/* >= 2 indicates recursive call */
+    PADLIST *	xcv_padlist;
+    CV *	xcv_outside;
+#ifdef USE_5005THREADS
+    perl_mutex *xcv_mutexp;
+    struct perl_thread *xcv_owner;	/* current owner thread */
+#endif /* USE_5005THREADS */
+    cv_flags_t	xcv_flags;
+    U32		xcv_outside_seq; /* the COP sequence (at the point of our
+				  * compilation) in the lexically enclosing
+				  * sub */
+};
+
+/*
+=head1 Handy Values
+
+=for apidoc AmU||Nullcv
+Null CV pointer.
+
+=head1 CV Manipulation Functions
+
+=for apidoc Am|HV*|CvSTASH|CV* cv
+Returns the stash of the CV.
+
+=cut
+*/
+
+#define Nullcv Null(CV*)
+
+#define CvSTASH(sv)	((XPVCV*)SvANY(sv))->xcv_stash
+#define CvSTART(sv)	((XPVCV*)SvANY(sv))->xcv_start
+#define CvROOT(sv)	((XPVCV*)SvANY(sv))->xcv_root
+#define CvXSUB(sv)	((XPVCV*)SvANY(sv))->xcv_xsub
+#define CvXSUBANY(sv)	((XPVCV*)SvANY(sv))->xcv_xsubany
+#define CvGV(sv)	((XPVCV*)SvANY(sv))->xcv_gv
+#define CvFILE(sv)	((XPVCV*)SvANY(sv))->xcv_file
+#ifdef USE_ITHREADS
+#  define CvFILE_set_from_cop(sv, cop)	(CvFILE(sv) = savepv(CopFILE(cop)))
+#else
+#  define CvFILE_set_from_cop(sv, cop)	(CvFILE(sv) = CopFILE(cop))
+#endif
+#define CvFILEGV(sv)	(gv_fetchfile(CvFILE(sv)))
+#define CvDEPTH(sv)	((XPVCV*)SvANY(sv))->xcv_depth
+#define CvPADLIST(sv)	((XPVCV*)SvANY(sv))->xcv_padlist
+#define CvOUTSIDE(sv)	((XPVCV*)SvANY(sv))->xcv_outside
+#ifdef USE_5005THREADS
+#define CvMUTEXP(sv)	((XPVCV*)SvANY(sv))->xcv_mutexp
+#define CvOWNER(sv)	((XPVCV*)SvANY(sv))->xcv_owner
+#endif /* USE_5005THREADS */
+#define CvFLAGS(sv)	((XPVCV*)SvANY(sv))->xcv_flags
+#define CvOUTSIDE_SEQ(sv) ((XPVCV*)SvANY(sv))->xcv_outside_seq
+
+#define CVf_CLONE	0x0001	/* anon CV uses external lexicals */
+#define CVf_CLONED	0x0002	/* a clone of one of those */
+#define CVf_ANON	0x0004	/* CvGV() can't be trusted */
+#define CVf_OLDSTYLE	0x0008
+#define CVf_UNIQUE	0x0010	/* sub is only called once (eg PL_main_cv,
+				 * require, eval). Not to be confused
+				 * with the GVf_UNIQUE flag associated
+				 * with the :unique attribute */
+#define CVf_NODEBUG	0x0020	/* no DB::sub indirection for this CV
+				   (esp. useful for special XSUBs) */
+#define CVf_METHOD	0x0040	/* CV is explicitly marked as a method */
+#define CVf_LOCKED	0x0080	/* CV locks itself or first arg on entry */
+#define CVf_LVALUE	0x0100  /* CV return value can be used as lvalue */
+#define CVf_CONST	0x0200  /* inlinable sub */
+#define CVf_WEAKOUTSIDE	0x0400  /* CvOUTSIDE isn't ref counted */
+
+/* This symbol for optimised communication between toke.c and op.c: */
+#define CVf_BUILTIN_ATTRS	(CVf_METHOD|CVf_LOCKED|CVf_LVALUE)
+
+#define CvCLONE(cv)		(CvFLAGS(cv) & CVf_CLONE)
+#define CvCLONE_on(cv)		(CvFLAGS(cv) |= CVf_CLONE)
+#define CvCLONE_off(cv)		(CvFLAGS(cv) &= ~CVf_CLONE)
+
+#define CvCLONED(cv)		(CvFLAGS(cv) & CVf_CLONED)
+#define CvCLONED_on(cv)		(CvFLAGS(cv) |= CVf_CLONED)
+#define CvCLONED_off(cv)	(CvFLAGS(cv) &= ~CVf_CLONED)
+
+#define CvANON(cv)		(CvFLAGS(cv) & CVf_ANON)
+#define CvANON_on(cv)		(CvFLAGS(cv) |= CVf_ANON)
+#define CvANON_off(cv)		(CvFLAGS(cv) &= ~CVf_ANON)
+
+#ifdef PERL_XSUB_OLDSTYLE
+#define CvOLDSTYLE(cv)		(CvFLAGS(cv) & CVf_OLDSTYLE)
+#define CvOLDSTYLE_on(cv)	(CvFLAGS(cv) |= CVf_OLDSTYLE)
+#define CvOLDSTYLE_off(cv)	(CvFLAGS(cv) &= ~CVf_OLDSTYLE)
+#endif
+
+#define CvUNIQUE(cv)		(CvFLAGS(cv) & CVf_UNIQUE)
+#define CvUNIQUE_on(cv)		(CvFLAGS(cv) |= CVf_UNIQUE)
+#define CvUNIQUE_off(cv)	(CvFLAGS(cv) &= ~CVf_UNIQUE)
+
+#define CvNODEBUG(cv)		(CvFLAGS(cv) & CVf_NODEBUG)
+#define CvNODEBUG_on(cv)	(CvFLAGS(cv) |= CVf_NODEBUG)
+#define CvNODEBUG_off(cv)	(CvFLAGS(cv) &= ~CVf_NODEBUG)
+
+#define CvMETHOD(cv)		(CvFLAGS(cv) & CVf_METHOD)
+#define CvMETHOD_on(cv)		(CvFLAGS(cv) |= CVf_METHOD)
+#define CvMETHOD_off(cv)	(CvFLAGS(cv) &= ~CVf_METHOD)
+
+#define CvLOCKED(cv)		(CvFLAGS(cv) & CVf_LOCKED)
+#define CvLOCKED_on(cv)		(CvFLAGS(cv) |= CVf_LOCKED)
+#define CvLOCKED_off(cv)	(CvFLAGS(cv) &= ~CVf_LOCKED)
+
+#define CvLVALUE(cv)		(CvFLAGS(cv) & CVf_LVALUE)
+#define CvLVALUE_on(cv)		(CvFLAGS(cv) |= CVf_LVALUE)
+#define CvLVALUE_off(cv)	(CvFLAGS(cv) &= ~CVf_LVALUE)
+
+#define CvEVAL(cv)		(CvUNIQUE(cv) && !SvFAKE(cv))
+#define CvEVAL_on(cv)		(CvUNIQUE_on(cv),SvFAKE_off(cv))
+#define CvEVAL_off(cv)		CvUNIQUE_off(cv)
+
+/* BEGIN|CHECK|INIT|END */
+#define CvSPECIAL(cv)		(CvUNIQUE(cv) && SvFAKE(cv))
+#define CvSPECIAL_on(cv)	(CvUNIQUE_on(cv),SvFAKE_on(cv))
+#define CvSPECIAL_off(cv)	(CvUNIQUE_off(cv),SvFAKE_off(cv))
+
+#define CvCONST(cv)		(CvFLAGS(cv) & CVf_CONST)
+#define CvCONST_on(cv)		(CvFLAGS(cv) |= CVf_CONST)
+#define CvCONST_off(cv)		(CvFLAGS(cv) &= ~CVf_CONST)
+
+#define CvWEAKOUTSIDE(cv)	(CvFLAGS(cv) & CVf_WEAKOUTSIDE)
+#define CvWEAKOUTSIDE_on(cv)	(CvFLAGS(cv) |= CVf_WEAKOUTSIDE)
+#define CvWEAKOUTSIDE_off(cv)	(CvFLAGS(cv) &= ~CVf_WEAKOUTSIDE)
+
+
+/*
+=head1 CV reference counts and CvOUTSIDE
+
+=for apidoc m|bool|CvWEAKOUTSIDE|CV *cv
+
+Each CV has a pointer, C<CvOUTSIDE()>, to its lexically enclosing
+CV (if any). Because pointers to anonymous sub prototypes are
+stored in C<&> pad slots, it is a possible to get a circular reference,
+with the parent pointing to the child and vice-versa. To avoid the
+ensuing memory leak, we do not increment the reference count of the CV
+pointed to by C<CvOUTSIDE> in the I<one specific instance> that the parent
+has a C<&> pad slot pointing back to us. In this case, we set the
+C<CvWEAKOUTSIDE> flag in the child. This allows us to determine under what
+circumstances we should decrement the refcount of the parent when freeing
+the child.
+
+There is a further complication with non-closure anonymous subs (i.e. those
+that do not refer to any lexicals outside that sub). In this case, the
+anonymous prototype is shared rather than being cloned. This has the
+consequence that the parent may be freed while there are still active
+children, eg
+
+    BEGIN { $a = sub { eval '$x' } }
+
+In this case, the BEGIN is freed immediately after execution since there
+are no active references to it: the anon sub prototype has
+C<CvWEAKOUTSIDE> set since it's not a closure, and $a points to the same
+CV, so it doesn't contribute to BEGIN's refcount either.  When $a is
+executed, the C<eval '$x'> causes the chain of C<CvOUTSIDE>s to be followed,
+and the freed BEGIN is accessed.
+
+To avoid this, whenever a CV and its associated pad is freed, any
+C<&> entries in the pad are explicitly removed from the pad, and if the
+refcount of the pointed-to anon sub is still positive, then that
+child's C<CvOUTSIDE> is set to point to its grandparent. This will only
+occur in the single specific case of a non-closure anon prototype
+having one or more active references (such as C<$a> above).
+
+One other thing to consider is that a CV may be merely undefined
+rather than freed, eg C<undef &foo>. In this case, its refcount may
+not have reached zero, but we still delete its pad and its C<CvROOT> etc.
+Since various children may still have their C<CvOUTSIDE> pointing at this
+undefined CV, we keep its own C<CvOUTSIDE> for the time being, so that
+the chain of lexical scopes is unbroken. For example, the following
+should print 123:
+
+    my $x = 123;
+    sub tmp { sub { eval '$x' } }
+    my $a = tmp();
+    undef &tmp;
+    print  $a->();
+
+=cut
+*/
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/dirent.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/dirent.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/dirent.h	(revision 14489)
@@ -0,0 +1,53 @@
+/* dirent.h */
+
+/* djl
+ * Provide UNIX compatibility
+ */
+
+#ifndef  _INC_DIRENT
+#define  _INC_DIRENT
+
+/*
+ * NT versions of readdir(), etc
+ * From the MSDOS implementation
+ */
+
+/* Directory entry size */
+#ifdef DIRSIZ
+#undef DIRSIZ
+#endif
+#define DIRSIZ(rp)  (sizeof(struct direct))
+
+/* needed to compile directory stuff */
+#define DIRENT direct
+
+/* structure of a directory entry */
+typedef struct direct 
+{
+	long	d_ino;			/* inode number (not used by MS-DOS)  */
+	long	d_namlen;		/* name length  */
+	char	d_name[257];		/* file name  */
+} _DIRECT;
+
+/* structure for dir operations */
+typedef struct _dir_struc
+{
+	char	*start;			/* starting position */
+	char	*curr;			/* current position */
+	long	size;			/* allocated size of string table */
+	long	nfiles;			/* number of filenames in table */
+	struct direct dirstr;		/* directory structure to return */
+	void*	handle;			/* system handle */
+	char	*end;			/* position after last filename */
+} DIR;
+
+#if 0		/* these have moved to win32iop.h */
+DIR *		win32_opendir(char *filename);
+struct direct *	win32_readdir(DIR *dirp);
+long		win32_telldir(DIR *dirp);
+void		win32_seekdir(DIR *dirp,long loc);
+void		win32_rewinddir(DIR *dirp);
+int		win32_closedir(DIR *dirp);
+#endif
+
+#endif /* _INC_DIRENT */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/dosish.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/dosish.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/dosish.h	(revision 14489)
@@ -0,0 +1,194 @@
+/*    dosish.h
+ *
+ *    Copyright (C) 1993, 1994, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+#define ABORT() abort();
+
+#ifndef SH_PATH
+#define SH_PATH "/bin/sh"
+#endif
+
+#ifdef DJGPP
+#  define BIT_BUCKET "nul"
+#  define OP_BINARY O_BINARY
+#  define PERL_SYS_INIT(c,v) MALLOC_CHECK_TAINT2(*c,*v) Perl_DJGPP_init(c,v)
+#  define init_os_extras Perl_init_os_extras
+#  include <signal.h>
+#  define HAS_UTIME
+#  define HAS_KILL
+   char *djgpp_pathexp (const char*);
+   void Perl_DJGPP_init (int *argcp,char ***argvp);
+#  if (DJGPP==2 && DJGPP_MINOR < 2)
+#    define NO_LOCALECONV_MON_THOUSANDS_SEP
+#  endif
+#  ifdef USE_5005THREADS
+#    define OLD_PTHREADS_API
+#  endif
+#  define PERL_FS_VER_FMT	"%d_%d_%d"
+#else	/* DJGPP */
+#  ifdef WIN32
+#    define PERL_SYS_INIT(c,v)	MALLOC_CHECK_TAINT2(*c,*v) Perl_win32_init(c,v)
+#    define PERL_SYS_TERM()	Perl_win32_term()
+#    define BIT_BUCKET "nul"
+#  else
+#	 ifdef NETWARE
+#      define PERL_SYS_INIT(c,v)	MALLOC_CHECK_TAINT2(*c,*v) Perl_nw5_init(c,v)
+#      define BIT_BUCKET "nwnul"
+#    else
+#      define PERL_SYS_INIT(c,v)	MALLOC_CHECK_TAINT2(*c,*v)
+#      define BIT_BUCKET "\\dev\\nul" /* "wanna be like, umm, Newlined, or somethin?" */
+#    endif /* NETWARE */
+#  endif
+#endif	/* DJGPP */
+
+#ifndef PERL_SYS_TERM
+#  define PERL_SYS_TERM() OP_REFCNT_TERM; MALLOC_TERM
+#endif
+#define dXSUB_SYS
+
+/*
+ * 5.003_07 and earlier keyed on #ifdef MSDOS for determining if we were 
+ * running on DOS, *and* if we had to cope with 16 bit memory addressing 
+ * constraints, *and* we need to have memory allocated as unsigned long.
+ *
+ * with the advent of *real* compilers for DOS, they are not locked together.
+ * MSDOS means "I am running on MSDOS". HAS_64K_LIMIT means "I have 
+ * 16 bit memory addressing constraints".
+ *
+ * if you need the last, try #DEFINE MEM_SIZE unsigned long.
+ */
+#ifdef MSDOS
+#  ifndef DJGPP
+#    define HAS_64K_LIMIT
+#  endif
+#endif
+
+/* USEMYBINMODE
+ *	This symbol, if defined, indicates that the program should
+ *	use the routine my_binmode(FILE *fp, char iotype, int mode) to insure
+ *	that a file is in "binary" mode -- that is, that no translation
+ *	of bytes occurs on read or write operations.
+ */
+#undef USEMYBINMODE
+
+/* Stat_t:
+ *	This symbol holds the type used to declare buffers for information
+ *	returned by stat().  It's usually just struct stat.  It may be necessary
+ *	to include <sys/stat.h> and <sys/types.h> to get any typedef'ed
+ *	information.
+ */
+#if defined(WIN64) || defined(USE_LARGE_FILES)
+# if defined(__BORLANDC__) /* buk */
+#  include <sys\stat.h>
+#  define Stat_t struct stati64
+# else
+#define Stat_t struct _stati64
+# endif
+#else
+#if defined(UNDER_CE)
+#define Stat_t struct xcestat
+#else
+#define Stat_t struct stat
+#endif
+#endif
+
+/* USE_STAT_RDEV:
+ *	This symbol is defined if this system has a stat structure declaring
+ *	st_rdev
+ */
+#define USE_STAT_RDEV 	/**/
+
+/* ACME_MESS:
+ *	This symbol, if defined, indicates that error messages should be 
+ *	should be generated in a format that allows the use of the Acme
+ *	GUI/editor's autofind feature.
+ */
+#undef ACME_MESS	/**/
+
+/* ALTERNATE_SHEBANG:
+ *	This symbol, if defined, contains a "magic" string which may be used
+ *	as the first line of a Perl program designed to be executed directly
+ *	by name, instead of the standard Unix #!.  If ALTERNATE_SHEBANG
+ *	begins with a character other then #, then Perl will only treat
+ *	it as a command line if it finds the string "perl" in the first
+ *	word; otherwise it's treated as the first line of code in the script.
+ *	(IOW, Perl won't hand off to another interpreter via an alternate
+ *	shebang sequence that might be legal Perl code.)
+ */
+/* #define ALTERNATE_SHEBANG "#!" / **/
+
+/*
+ * fwrite1() should be a routine with the same calling sequence as fwrite(),
+ * but which outputs all of the bytes requested as a single stream (unlike
+ * fwrite() itself, which on some systems outputs several distinct records
+ * if the number_of_items parameter is >1).
+ */
+#define fwrite1 fwrite
+
+#define Fstat(fd,bufptr)   fstat((fd),(bufptr))
+#ifdef DJGPP
+#   define Fflush(fp)      djgpp_fflush(fp)
+#else
+#   define Fflush(fp)      fflush(fp)
+#endif
+#define Mkdir(path,mode)   mkdir((path),(mode))
+
+#ifndef WIN32
+#  define Stat(fname,bufptr) stat((fname),(bufptr))
+#else
+#  define HAS_IOCTL
+#  define HAS_UTIME
+#  define HAS_KILL
+#  define HAS_WAIT
+#  define HAS_CHOWN
+#endif	/* WIN32 */
+
+/*
+ * <rich@phekda.freeserve.co.uk>: The DJGPP port has code that converts
+ * the return code of system() into the form that Unixy wait usually
+ * returns:
+ *
+ * - signal number in bits 0-6;
+ * - core dump flag in bit 7;
+ * - exit code in bits 8-15.
+ *
+ * Bits 0-7 are always zero for DJGPP, because it uses system().
+ * See djgpp.c.
+ *
+ * POSIX::W* use the W* macros from <sys/wait.h> to decode
+ * the return code. Unfortunately the W* macros for DJGPP use
+ * a different format than Unixy wait does. So there's a mismatch
+ * and, say, WEXITSTATUS($?) will return bogus values.
+ *
+ * So here we add hack to redefine the W* macros from DJGPP's <sys/wait.h>
+ * to work with our return-code conversion.
+ */
+
+#ifdef DJGPP
+
+#include <sys/wait.h>
+
+#undef WEXITSTATUS
+#undef WIFEXITED
+#undef WIFSIGNALED
+#undef WIFSTOPPED
+#undef WNOHANG
+#undef WSTOPSIG
+#undef WTERMSIG
+#undef WUNTRACED
+
+#define WEXITSTATUS(stat_val) ((stat_val) >> 8)
+#define WIFEXITED(stat_val)   0
+#define WIFSIGNALED(stat_val) 0
+#define WIFSTOPPED(stat_val)  0
+#define WNOHANG               0
+#define WSTOPSIG(stat_val)    0
+#define WTERMSIG(stat_val)    0
+#define WUNTRACED             0
+
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/embed.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/embed.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/embed.h	(revision 14489)
@@ -0,0 +1,4225 @@
+/*  -*- buffer-read-only: t -*-
+ *
+ *    embed.h
+ *
+ *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ * This file is built by embed.pl from data in embed.fnc, embed.pl,
+ * pp.sym, intrpvar.h, perlvars.h and thrdvar.h.
+ * Any changes made here will be lost!
+ *
+ * Edit those files and run 'make regen_headers' to effect changes.
+ */
+
+/* (Doing namespace management portably in C is really gross.) */
+
+/* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
+ * (like warn instead of Perl_warn) for the API are not defined.
+ * Not defining the short forms is a good thing for cleaner embedding. */
+
+#ifndef PERL_NO_SHORT_NAMES
+
+/* Hide global symbols */
+
+#if !defined(PERL_IMPLICIT_CONTEXT)
+
+#if defined(PERL_IMPLICIT_SYS)
+#endif
+#define doing_taint		Perl_doing_taint
+#if defined(USE_ITHREADS)
+#  if defined(PERL_IMPLICIT_SYS)
+#  endif
+#endif
+#if defined(MYMALLOC)
+#ifdef PERL_CORE
+#define malloced_size		Perl_malloced_size
+#endif
+#endif
+#define get_context		Perl_get_context
+#define set_context		Perl_set_context
+#define amagic_call		Perl_amagic_call
+#define Gv_AMupdate		Perl_Gv_AMupdate
+#define gv_handler		Perl_gv_handler
+#ifdef PERL_CORE
+#define append_elem		Perl_append_elem
+#define append_list		Perl_append_list
+#define apply			Perl_apply
+#endif
+#define apply_attrs_string	Perl_apply_attrs_string
+#define avhv_delete_ent		Perl_avhv_delete_ent
+#define avhv_exists_ent		Perl_avhv_exists_ent
+#define avhv_fetch_ent		Perl_avhv_fetch_ent
+#define avhv_store_ent		Perl_avhv_store_ent
+#define avhv_iternext		Perl_avhv_iternext
+#define avhv_iterval		Perl_avhv_iterval
+#define avhv_keys		Perl_avhv_keys
+#define av_clear		Perl_av_clear
+#define av_delete		Perl_av_delete
+#define av_exists		Perl_av_exists
+#define av_extend		Perl_av_extend
+#ifdef PERL_CORE
+#define av_fake			Perl_av_fake
+#endif
+#define av_fetch		Perl_av_fetch
+#define av_fill			Perl_av_fill
+#define av_len			Perl_av_len
+#define av_make			Perl_av_make
+#define av_pop			Perl_av_pop
+#define av_push			Perl_av_push
+#ifdef PERL_CORE
+#define av_reify		Perl_av_reify
+#endif
+#define av_shift		Perl_av_shift
+#define av_store		Perl_av_store
+#define av_undef		Perl_av_undef
+#define av_unshift		Perl_av_unshift
+#ifdef PERL_CORE
+#define bind_match		Perl_bind_match
+#define block_end		Perl_block_end
+#endif
+#define block_gimme		Perl_block_gimme
+#ifdef PERL_CORE
+#define block_start		Perl_block_start
+#define boot_core_UNIVERSAL	Perl_boot_core_UNIVERSAL
+#define boot_core_PerlIO	Perl_boot_core_PerlIO
+#endif
+#define call_list		Perl_call_list
+#ifdef PERL_CORE
+#define cando			Perl_cando
+#endif
+#define cast_ulong		Perl_cast_ulong
+#define cast_i32		Perl_cast_i32
+#define cast_iv			Perl_cast_iv
+#define cast_uv			Perl_cast_uv
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+#define my_chsize		Perl_my_chsize
+#endif
+#if defined(USE_5005THREADS)
+#define condpair_magic		Perl_condpair_magic
+#endif
+#ifdef PERL_CORE
+#define convert			Perl_convert
+#endif
+#define croak			Perl_croak
+#define vcroak			Perl_vcroak
+#if defined(PERL_IMPLICIT_CONTEXT)
+#define croak_nocontext		Perl_croak_nocontext
+#define die_nocontext		Perl_die_nocontext
+#define deb_nocontext		Perl_deb_nocontext
+#define form_nocontext		Perl_form_nocontext
+#define load_module_nocontext	Perl_load_module_nocontext
+#define mess_nocontext		Perl_mess_nocontext
+#define warn_nocontext		Perl_warn_nocontext
+#define warner_nocontext	Perl_warner_nocontext
+#define newSVpvf_nocontext	Perl_newSVpvf_nocontext
+#define sv_catpvf_nocontext	Perl_sv_catpvf_nocontext
+#define sv_setpvf_nocontext	Perl_sv_setpvf_nocontext
+#define sv_catpvf_mg_nocontext	Perl_sv_catpvf_mg_nocontext
+#define sv_setpvf_mg_nocontext	Perl_sv_setpvf_mg_nocontext
+#define fprintf_nocontext	Perl_fprintf_nocontext
+#define printf_nocontext	Perl_printf_nocontext
+#endif
+#ifdef PERL_CORE
+#define cv_ckproto		Perl_cv_ckproto
+#define cv_clone		Perl_cv_clone
+#endif
+#define cv_const_sv		Perl_cv_const_sv
+#ifdef PERL_CORE
+#define op_const_sv		Perl_op_const_sv
+#endif
+#define cv_undef		Perl_cv_undef
+#define cx_dump			Perl_cx_dump
+#define filter_add		Perl_filter_add
+#define filter_del		Perl_filter_del
+#define filter_read		Perl_filter_read
+#define get_op_descs		Perl_get_op_descs
+#define get_op_names		Perl_get_op_names
+#ifdef PERL_CORE
+#define get_no_modify		Perl_get_no_modify
+#define get_opargs		Perl_get_opargs
+#endif
+#define get_ppaddr		Perl_get_ppaddr
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define cxinc			Perl_cxinc
+#endif
+#define deb			Perl_deb
+#define vdeb			Perl_vdeb
+#define debprofdump		Perl_debprofdump
+#define debop			Perl_debop
+#define debstack		Perl_debstack
+#define debstackptrs		Perl_debstackptrs
+#define delimcpy		Perl_delimcpy
+#ifdef PERL_CORE
+#define deprecate		Perl_deprecate
+#define deprecate_old		Perl_deprecate_old
+#endif
+#define die			Perl_die
+#ifdef PERL_CORE
+#define vdie			Perl_vdie
+#define die_where		Perl_die_where
+#endif
+#define dounwind		Perl_dounwind
+#ifdef PERL_CORE
+#define do_aexec		Perl_do_aexec
+#define do_aexec5		Perl_do_aexec5
+#endif
+#define do_binmode		Perl_do_binmode
+#ifdef PERL_CORE
+#define do_chop			Perl_do_chop
+#endif
+#define do_close		Perl_do_close
+#ifdef PERL_CORE
+#define do_eof			Perl_do_eof
+#define do_exec			Perl_do_exec
+#endif
+#if defined(WIN32)
+#define do_aspawn		Perl_do_aspawn
+#define do_spawn		Perl_do_spawn
+#define do_spawn_nowait		Perl_do_spawn_nowait
+#endif
+#if !defined(WIN32)
+#ifdef PERL_CORE
+#define do_exec3		Perl_do_exec3
+#endif
+#endif
+#ifdef PERL_CORE
+#define do_execfree		Perl_do_execfree
+#endif
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+#ifdef PERL_CORE
+#define do_ipcctl		Perl_do_ipcctl
+#define do_ipcget		Perl_do_ipcget
+#define do_msgrcv		Perl_do_msgrcv
+#define do_msgsnd		Perl_do_msgsnd
+#define do_semop		Perl_do_semop
+#define do_shmio		Perl_do_shmio
+#endif
+#endif
+#define do_join			Perl_do_join
+#ifdef PERL_CORE
+#define do_kv			Perl_do_kv
+#endif
+#define do_open			Perl_do_open
+#define do_open9		Perl_do_open9
+#define do_openn		Perl_do_openn
+#ifdef PERL_CORE
+#define do_pipe			Perl_do_pipe
+#define do_print		Perl_do_print
+#define do_readline		Perl_do_readline
+#define do_chomp		Perl_do_chomp
+#define do_seek			Perl_do_seek
+#endif
+#define do_sprintf		Perl_do_sprintf
+#ifdef PERL_CORE
+#define do_sysseek		Perl_do_sysseek
+#define do_tell			Perl_do_tell
+#define do_trans		Perl_do_trans
+#define do_vecget		Perl_do_vecget
+#define do_vecset		Perl_do_vecset
+#define do_vop			Perl_do_vop
+#define dofile			Perl_dofile
+#endif
+#define dowantarray		Perl_dowantarray
+#define dump_all		Perl_dump_all
+#define dump_eval		Perl_dump_eval
+#if defined(DUMP_FDS)
+#define dump_fds		Perl_dump_fds
+#endif
+#define dump_form		Perl_dump_form
+#define gv_dump			Perl_gv_dump
+#define op_dump			Perl_op_dump
+#define pmop_dump		Perl_pmop_dump
+#define dump_packsubs		Perl_dump_packsubs
+#define dump_sub		Perl_dump_sub
+#define fbm_compile		Perl_fbm_compile
+#define fbm_instr		Perl_fbm_instr
+#ifdef PERL_CORE
+#define find_script		Perl_find_script
+#endif
+#if defined(USE_5005THREADS)
+#ifdef PERL_CORE
+#define find_threadsv		Perl_find_threadsv
+#endif
+#endif
+#ifdef PERL_CORE
+#define force_list		Perl_force_list
+#define fold_constants		Perl_fold_constants
+#endif
+#define form			Perl_form
+#define vform			Perl_vform
+#define free_tmps		Perl_free_tmps
+#ifdef PERL_CORE
+#define gen_constant_list	Perl_gen_constant_list
+#endif
+#if !defined(HAS_GETENV_LEN)
+#ifdef PERL_CORE
+#define getenv_len		Perl_getenv_len
+#endif
+#endif
+#define gp_free			Perl_gp_free
+#define gp_ref			Perl_gp_ref
+#define gv_AVadd		Perl_gv_AVadd
+#define gv_HVadd		Perl_gv_HVadd
+#define gv_IOadd		Perl_gv_IOadd
+#define gv_autoload4		Perl_gv_autoload4
+#define gv_check		Perl_gv_check
+#define gv_efullname		Perl_gv_efullname
+#define gv_efullname4		Perl_gv_efullname4
+#define gv_fetchfile		Perl_gv_fetchfile
+#define gv_fetchmeth		Perl_gv_fetchmeth
+#define gv_fetchmeth_autoload	Perl_gv_fetchmeth_autoload
+#define gv_fetchmethod		Perl_gv_fetchmethod
+#define gv_fetchmethod_autoload	Perl_gv_fetchmethod_autoload
+#define gv_fetchpv		Perl_gv_fetchpv
+#define gv_fullname		Perl_gv_fullname
+#define gv_fullname4		Perl_gv_fullname4
+#define gv_init			Perl_gv_init
+#define gv_stashpv		Perl_gv_stashpv
+#define gv_stashpvn		Perl_gv_stashpvn
+#define gv_stashsv		Perl_gv_stashsv
+#define hv_clear		Perl_hv_clear
+#define hv_delayfree_ent	Perl_hv_delayfree_ent
+#define hv_delete		Perl_hv_delete
+#define hv_delete_ent		Perl_hv_delete_ent
+#define hv_exists		Perl_hv_exists
+#define hv_exists_ent		Perl_hv_exists_ent
+#define hv_fetch		Perl_hv_fetch
+#define hv_fetch_ent		Perl_hv_fetch_ent
+#define hv_free_ent		Perl_hv_free_ent
+#define hv_iterinit		Perl_hv_iterinit
+#define hv_iterkey		Perl_hv_iterkey
+#define hv_iterkeysv		Perl_hv_iterkeysv
+#define hv_iternext		Perl_hv_iternext
+#define hv_iternextsv		Perl_hv_iternextsv
+#define hv_iternext_flags	Perl_hv_iternext_flags
+#define hv_iterval		Perl_hv_iterval
+#define hv_ksplit		Perl_hv_ksplit
+#define hv_magic		Perl_hv_magic
+#define hv_store		Perl_hv_store
+#define hv_store_ent		Perl_hv_store_ent
+#define hv_store_flags		Perl_hv_store_flags
+#define hv_undef		Perl_hv_undef
+#define ibcmp			Perl_ibcmp
+#define ibcmp_locale		Perl_ibcmp_locale
+#define ibcmp_utf8		Perl_ibcmp_utf8
+#ifdef PERL_CORE
+#define ingroup			Perl_ingroup
+#define init_argv_symbols	Perl_init_argv_symbols
+#define init_debugger		Perl_init_debugger
+#endif
+#define init_stacks		Perl_init_stacks
+#define init_tm			Perl_init_tm
+#ifdef PERL_CORE
+#define intro_my		Perl_intro_my
+#endif
+#define instr			Perl_instr
+#ifdef PERL_CORE
+#define io_close		Perl_io_close
+#define invert			Perl_invert
+#define is_gv_magical		Perl_is_gv_magical
+#endif
+#define is_lvalue_sub		Perl_is_lvalue_sub
+#define to_uni_upper_lc		Perl_to_uni_upper_lc
+#define to_uni_title_lc		Perl_to_uni_title_lc
+#define to_uni_lower_lc		Perl_to_uni_lower_lc
+#define is_uni_alnum		Perl_is_uni_alnum
+#define is_uni_alnumc		Perl_is_uni_alnumc
+#define is_uni_idfirst		Perl_is_uni_idfirst
+#define is_uni_alpha		Perl_is_uni_alpha
+#define is_uni_ascii		Perl_is_uni_ascii
+#define is_uni_space		Perl_is_uni_space
+#define is_uni_cntrl		Perl_is_uni_cntrl
+#define is_uni_graph		Perl_is_uni_graph
+#define is_uni_digit		Perl_is_uni_digit
+#define is_uni_upper		Perl_is_uni_upper
+#define is_uni_lower		Perl_is_uni_lower
+#define is_uni_print		Perl_is_uni_print
+#define is_uni_punct		Perl_is_uni_punct
+#define is_uni_xdigit		Perl_is_uni_xdigit
+#define to_uni_upper		Perl_to_uni_upper
+#define to_uni_title		Perl_to_uni_title
+#define to_uni_lower		Perl_to_uni_lower
+#define to_uni_fold		Perl_to_uni_fold
+#define is_uni_alnum_lc		Perl_is_uni_alnum_lc
+#define is_uni_alnumc_lc	Perl_is_uni_alnumc_lc
+#define is_uni_idfirst_lc	Perl_is_uni_idfirst_lc
+#define is_uni_alpha_lc		Perl_is_uni_alpha_lc
+#define is_uni_ascii_lc		Perl_is_uni_ascii_lc
+#define is_uni_space_lc		Perl_is_uni_space_lc
+#define is_uni_cntrl_lc		Perl_is_uni_cntrl_lc
+#define is_uni_graph_lc		Perl_is_uni_graph_lc
+#define is_uni_digit_lc		Perl_is_uni_digit_lc
+#define is_uni_upper_lc		Perl_is_uni_upper_lc
+#define is_uni_lower_lc		Perl_is_uni_lower_lc
+#define is_uni_print_lc		Perl_is_uni_print_lc
+#define is_uni_punct_lc		Perl_is_uni_punct_lc
+#define is_uni_xdigit_lc	Perl_is_uni_xdigit_lc
+#define is_utf8_char		Perl_is_utf8_char
+#define is_utf8_string_loc	Perl_is_utf8_string_loc
+#define is_utf8_string		Perl_is_utf8_string
+#define is_utf8_alnum		Perl_is_utf8_alnum
+#define is_utf8_alnumc		Perl_is_utf8_alnumc
+#define is_utf8_idfirst		Perl_is_utf8_idfirst
+#define is_utf8_idcont		Perl_is_utf8_idcont
+#define is_utf8_alpha		Perl_is_utf8_alpha
+#define is_utf8_ascii		Perl_is_utf8_ascii
+#define is_utf8_space		Perl_is_utf8_space
+#define is_utf8_cntrl		Perl_is_utf8_cntrl
+#define is_utf8_digit		Perl_is_utf8_digit
+#define is_utf8_graph		Perl_is_utf8_graph
+#define is_utf8_upper		Perl_is_utf8_upper
+#define is_utf8_lower		Perl_is_utf8_lower
+#define is_utf8_print		Perl_is_utf8_print
+#define is_utf8_punct		Perl_is_utf8_punct
+#define is_utf8_xdigit		Perl_is_utf8_xdigit
+#define is_utf8_mark		Perl_is_utf8_mark
+#ifdef PERL_CORE
+#define jmaybe			Perl_jmaybe
+#define keyword			Perl_keyword
+#endif
+#define leave_scope		Perl_leave_scope
+#ifdef PERL_CORE
+#define lex_end			Perl_lex_end
+#define lex_start		Perl_lex_start
+#endif
+#define op_null			Perl_op_null
+#ifdef PERL_CORE
+#define op_clear		Perl_op_clear
+#define linklist		Perl_linklist
+#define list			Perl_list
+#define listkids		Perl_listkids
+#endif
+#define load_module		Perl_load_module
+#define vload_module		Perl_vload_module
+#ifdef PERL_CORE
+#define localize		Perl_localize
+#endif
+#define looks_like_number	Perl_looks_like_number
+#define grok_bin		Perl_grok_bin
+#define grok_hex		Perl_grok_hex
+#define grok_number		Perl_grok_number
+#define grok_numeric_radix	Perl_grok_numeric_radix
+#define grok_oct		Perl_grok_oct
+#ifdef PERL_CORE
+#define magic_clearenv		Perl_magic_clearenv
+#define magic_clear_all_env	Perl_magic_clear_all_env
+#define magic_clearpack		Perl_magic_clearpack
+#define magic_clearsig		Perl_magic_clearsig
+#define magic_existspack	Perl_magic_existspack
+#define magic_freeregexp	Perl_magic_freeregexp
+#define magic_freeovrld		Perl_magic_freeovrld
+#define magic_get		Perl_magic_get
+#define magic_getarylen		Perl_magic_getarylen
+#define magic_getdefelem	Perl_magic_getdefelem
+#define magic_getglob		Perl_magic_getglob
+#define magic_getnkeys		Perl_magic_getnkeys
+#define magic_getpack		Perl_magic_getpack
+#define magic_getpos		Perl_magic_getpos
+#define magic_getsig		Perl_magic_getsig
+#define magic_getsubstr		Perl_magic_getsubstr
+#define magic_gettaint		Perl_magic_gettaint
+#define magic_getuvar		Perl_magic_getuvar
+#define magic_getvec		Perl_magic_getvec
+#define magic_len		Perl_magic_len
+#endif
+#if defined(USE_5005THREADS)
+#ifdef PERL_CORE
+#define magic_mutexfree		Perl_magic_mutexfree
+#endif
+#endif
+#ifdef PERL_CORE
+#define magic_nextpack		Perl_magic_nextpack
+#define magic_regdata_cnt	Perl_magic_regdata_cnt
+#define magic_regdatum_get	Perl_magic_regdatum_get
+#define magic_regdatum_set	Perl_magic_regdatum_set
+#define magic_set		Perl_magic_set
+#define magic_setamagic		Perl_magic_setamagic
+#define magic_setarylen		Perl_magic_setarylen
+#define magic_setbm		Perl_magic_setbm
+#define magic_setdbline		Perl_magic_setdbline
+#endif
+#if defined(USE_LOCALE_COLLATE)
+#ifdef PERL_CORE
+#define magic_setcollxfrm	Perl_magic_setcollxfrm
+#endif
+#endif
+#ifdef PERL_CORE
+#define magic_setdefelem	Perl_magic_setdefelem
+#define magic_setenv		Perl_magic_setenv
+#define magic_setfm		Perl_magic_setfm
+#define magic_setisa		Perl_magic_setisa
+#define magic_setglob		Perl_magic_setglob
+#define magic_setmglob		Perl_magic_setmglob
+#define magic_setnkeys		Perl_magic_setnkeys
+#define magic_setpack		Perl_magic_setpack
+#define magic_setpos		Perl_magic_setpos
+#define magic_setregexp		Perl_magic_setregexp
+#define magic_setsig		Perl_magic_setsig
+#define magic_setsubstr		Perl_magic_setsubstr
+#define magic_settaint		Perl_magic_settaint
+#define magic_setuvar		Perl_magic_setuvar
+#define magic_setvec		Perl_magic_setvec
+#define magic_setutf8		Perl_magic_setutf8
+#define magic_set_all_env	Perl_magic_set_all_env
+#define magic_sizepack		Perl_magic_sizepack
+#define magic_wipepack		Perl_magic_wipepack
+#define magicname		Perl_magicname
+#endif
+#define markstack_grow		Perl_markstack_grow
+#if defined(USE_LOCALE_COLLATE)
+#ifdef PERL_CORE
+#define mem_collxfrm		Perl_mem_collxfrm
+#endif
+#endif
+#define mess			Perl_mess
+#define vmess			Perl_vmess
+#ifdef PERL_CORE
+#define qerror			Perl_qerror
+#endif
+#define sortsv			Perl_sortsv
+#define mg_clear		Perl_mg_clear
+#define mg_copy			Perl_mg_copy
+#define mg_find			Perl_mg_find
+#define mg_free			Perl_mg_free
+#define mg_get			Perl_mg_get
+#define mg_length		Perl_mg_length
+#define mg_magical		Perl_mg_magical
+#define mg_set			Perl_mg_set
+#define mg_size			Perl_mg_size
+#define mini_mktime		Perl_mini_mktime
+#ifdef PERL_CORE
+#define mod			Perl_mod
+#define mode_from_discipline	Perl_mode_from_discipline
+#endif
+#define moreswitches		Perl_moreswitches
+#ifdef PERL_CORE
+#define my			Perl_my
+#endif
+#define my_atof			Perl_my_atof
+#if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
+#define my_bcopy		Perl_my_bcopy
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+#define my_bzero		Perl_my_bzero
+#endif
+#define my_exit			Perl_my_exit
+#define my_failure_exit		Perl_my_failure_exit
+#define my_fflush_all		Perl_my_fflush_all
+#define my_fork			Perl_my_fork
+#define atfork_lock		Perl_atfork_lock
+#define atfork_unlock		Perl_atfork_unlock
+#define my_lstat		Perl_my_lstat
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+#define my_memcmp		Perl_my_memcmp
+#endif
+#if !defined(HAS_MEMSET)
+#define my_memset		Perl_my_memset
+#endif
+#define my_pclose		Perl_my_pclose
+#define my_popen		Perl_my_popen
+#define my_popen_list		Perl_my_popen_list
+#define my_setenv		Perl_my_setenv
+#define my_stat			Perl_my_stat
+#define my_strftime		Perl_my_strftime
+#if defined(MYSWAP)
+#define my_swap			Perl_my_swap
+#define my_htonl		Perl_my_htonl
+#define my_ntohl		Perl_my_ntohl
+#endif
+#ifdef PERL_CORE
+#define my_unexec		Perl_my_unexec
+#endif
+#define newANONLIST		Perl_newANONLIST
+#define newANONHASH		Perl_newANONHASH
+#define newANONSUB		Perl_newANONSUB
+#define newASSIGNOP		Perl_newASSIGNOP
+#define newCONDOP		Perl_newCONDOP
+#define newCONSTSUB		Perl_newCONSTSUB
+#define newFORM			Perl_newFORM
+#define newFOROP		Perl_newFOROP
+#define newLOGOP		Perl_newLOGOP
+#define newLOOPEX		Perl_newLOOPEX
+#define newLOOPOP		Perl_newLOOPOP
+#define newNULLLIST		Perl_newNULLLIST
+#define newOP			Perl_newOP
+#define newPROG			Perl_newPROG
+#define newRANGE		Perl_newRANGE
+#define newSLICEOP		Perl_newSLICEOP
+#define newSTATEOP		Perl_newSTATEOP
+#define newSUB			Perl_newSUB
+#define newXS			Perl_newXS
+#define newAV			Perl_newAV
+#define newAVREF		Perl_newAVREF
+#define newBINOP		Perl_newBINOP
+#define newCVREF		Perl_newCVREF
+#define newGVOP			Perl_newGVOP
+#define newGVgen		Perl_newGVgen
+#define newGVREF		Perl_newGVREF
+#define newHVREF		Perl_newHVREF
+#define newHV			Perl_newHV
+#define newHVhv			Perl_newHVhv
+#define newIO			Perl_newIO
+#define newLISTOP		Perl_newLISTOP
+#define newPADOP		Perl_newPADOP
+#define newPMOP			Perl_newPMOP
+#define newPVOP			Perl_newPVOP
+#define newRV			Perl_newRV
+#define newRV_noinc		Perl_newRV_noinc
+#define newSV			Perl_newSV
+#define newSVREF		Perl_newSVREF
+#define newSVOP			Perl_newSVOP
+#define newSViv			Perl_newSViv
+#define newSVuv			Perl_newSVuv
+#define newSVnv			Perl_newSVnv
+#define newSVpv			Perl_newSVpv
+#define newSVpvn		Perl_newSVpvn
+#define newSVpvn_share		Perl_newSVpvn_share
+#define newSVpvf		Perl_newSVpvf
+#define vnewSVpvf		Perl_vnewSVpvf
+#define newSVrv			Perl_newSVrv
+#define newSVsv			Perl_newSVsv
+#define newUNOP			Perl_newUNOP
+#define newWHILEOP		Perl_newWHILEOP
+#define new_stackinfo		Perl_new_stackinfo
+#define scan_vstring		Perl_scan_vstring
+#ifdef PERL_CORE
+#define nextargv		Perl_nextargv
+#endif
+#define ninstr			Perl_ninstr
+#ifdef PERL_CORE
+#define oopsCV			Perl_oopsCV
+#endif
+#define op_free			Perl_op_free
+#ifdef PERL_CORE
+#define package			Perl_package
+#define pad_alloc		Perl_pad_alloc
+#define allocmy			Perl_allocmy
+#define pad_findmy		Perl_pad_findmy
+#define oopsAV			Perl_oopsAV
+#define oopsHV			Perl_oopsHV
+#define pad_leavemy		Perl_pad_leavemy
+#endif
+#define pad_sv			Perl_pad_sv
+#ifdef PERL_CORE
+#define pad_free		Perl_pad_free
+#define pad_reset		Perl_pad_reset
+#define pad_swipe		Perl_pad_swipe
+#define peep			Perl_peep
+#endif
+#if defined(USE_5005THREADS)
+#define new_struct_thread	Perl_new_struct_thread
+#endif
+#if defined(USE_REENTRANT_API)
+#define reentrant_size		Perl_reentrant_size
+#define reentrant_init		Perl_reentrant_init
+#define reentrant_free		Perl_reentrant_free
+#define reentrant_retry		Perl_reentrant_retry
+#endif
+#define call_atexit		Perl_call_atexit
+#define call_argv		Perl_call_argv
+#define call_method		Perl_call_method
+#define call_pv			Perl_call_pv
+#define call_sv			Perl_call_sv
+#define despatch_signals	Perl_despatch_signals
+#define eval_pv			Perl_eval_pv
+#define eval_sv			Perl_eval_sv
+#define get_sv			Perl_get_sv
+#define get_av			Perl_get_av
+#define get_hv			Perl_get_hv
+#define get_cv			Perl_get_cv
+#define init_i18nl10n		Perl_init_i18nl10n
+#define init_i18nl14n		Perl_init_i18nl14n
+#define new_collate		Perl_new_collate
+#define new_ctype		Perl_new_ctype
+#define new_numeric		Perl_new_numeric
+#define set_numeric_local	Perl_set_numeric_local
+#define set_numeric_radix	Perl_set_numeric_radix
+#define set_numeric_standard	Perl_set_numeric_standard
+#define require_pv		Perl_require_pv
+#define pack_cat		Perl_pack_cat
+#define packlist		Perl_packlist
+#ifdef PERL_CORE
+#define pidgone			Perl_pidgone
+#endif
+#define pmflag			Perl_pmflag
+#ifdef PERL_CORE
+#define pmruntime		Perl_pmruntime
+#define pmtrans			Perl_pmtrans
+#define pop_return		Perl_pop_return
+#endif
+#define pop_scope		Perl_pop_scope
+#ifdef PERL_CORE
+#define prepend_elem		Perl_prepend_elem
+#define push_return		Perl_push_return
+#endif
+#define push_scope		Perl_push_scope
+#ifdef PERL_CORE
+#define ref			Perl_ref
+#define refkids			Perl_refkids
+#endif
+#define regdump			Perl_regdump
+#define regclass_swash		Perl_regclass_swash
+#define pregexec		Perl_pregexec
+#define pregfree		Perl_pregfree
+#define pregcomp		Perl_pregcomp
+#define re_intuit_start		Perl_re_intuit_start
+#define re_intuit_string	Perl_re_intuit_string
+#define regexec_flags		Perl_regexec_flags
+#define regnext			Perl_regnext
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regprop			Perl_regprop
+#endif
+#define repeatcpy		Perl_repeatcpy
+#define rninstr			Perl_rninstr
+#define rsignal			Perl_rsignal
+#ifdef PERL_CORE
+#define rsignal_restore		Perl_rsignal_restore
+#define rsignal_save		Perl_rsignal_save
+#endif
+#define rsignal_state		Perl_rsignal_state
+#ifdef PERL_CORE
+#define rxres_free		Perl_rxres_free
+#define rxres_restore		Perl_rxres_restore
+#define rxres_save		Perl_rxres_save
+#endif
+#if !defined(HAS_RENAME)
+#ifdef PERL_CORE
+#define same_dirent		Perl_same_dirent
+#endif
+#endif
+#define savepv			Perl_savepv
+#define savepvn			Perl_savepvn
+#define savesharedpv		Perl_savesharedpv
+#define savestack_grow		Perl_savestack_grow
+#define savestack_grow_cnt	Perl_savestack_grow_cnt
+#define save_aelem		Perl_save_aelem
+#define save_alloc		Perl_save_alloc
+#define save_aptr		Perl_save_aptr
+#define save_ary		Perl_save_ary
+#define save_bool		Perl_save_bool
+#define save_clearsv		Perl_save_clearsv
+#define save_delete		Perl_save_delete
+#define save_destructor		Perl_save_destructor
+#define save_destructor_x	Perl_save_destructor_x
+#define save_freesv		Perl_save_freesv
+#ifdef PERL_CORE
+#define save_freeop		Perl_save_freeop
+#endif
+#define save_freepv		Perl_save_freepv
+#define save_generic_svref	Perl_save_generic_svref
+#define save_generic_pvref	Perl_save_generic_pvref
+#define save_shared_pvref	Perl_save_shared_pvref
+#define save_gp			Perl_save_gp
+#define save_hash		Perl_save_hash
+#define save_helem		Perl_save_helem
+#define save_hints		Perl_save_hints
+#define save_hptr		Perl_save_hptr
+#define save_I16		Perl_save_I16
+#define save_I32		Perl_save_I32
+#define save_I8			Perl_save_I8
+#define save_int		Perl_save_int
+#define save_item		Perl_save_item
+#define save_iv			Perl_save_iv
+#define save_list		Perl_save_list
+#define save_long		Perl_save_long
+#define save_mortalizesv	Perl_save_mortalizesv
+#define save_nogv		Perl_save_nogv
+#ifdef PERL_CORE
+#define save_op			Perl_save_op
+#endif
+#define save_scalar		Perl_save_scalar
+#define save_pptr		Perl_save_pptr
+#define save_vptr		Perl_save_vptr
+#define save_re_context		Perl_save_re_context
+#define save_padsv		Perl_save_padsv
+#define save_sptr		Perl_save_sptr
+#define save_svref		Perl_save_svref
+#ifdef USE_5005THREADS
+#define save_threadsv		Perl_save_threadsv
+#else
+#define save_threadsv		Perl_save_threadsv
+#endif
+#ifdef PERL_CORE
+#define sawparens		Perl_sawparens
+#define scalar			Perl_scalar
+#define scalarkids		Perl_scalarkids
+#define scalarseq		Perl_scalarseq
+#define scalarvoid		Perl_scalarvoid
+#endif
+#define scan_bin		Perl_scan_bin
+#define scan_hex		Perl_scan_hex
+#define scan_num		Perl_scan_num
+#define scan_oct		Perl_scan_oct
+#ifdef PERL_CORE
+#define scope			Perl_scope
+#endif
+#define screaminstr		Perl_screaminstr
+#if !defined(VMS)
+#ifdef PERL_CORE
+#define setenv_getix		Perl_setenv_getix
+#endif
+#endif
+#ifdef PERL_CORE
+#define setdefout		Perl_setdefout
+#endif
+#define share_hek		Perl_share_hek
+#ifdef PERL_CORE
+#define sighandler		Perl_sighandler
+#endif
+#define csighandler		Perl_csighandler
+#define stack_grow		Perl_stack_grow
+#define start_subparse		Perl_start_subparse
+#ifdef PERL_CORE
+#define sub_crush_depth		Perl_sub_crush_depth
+#endif
+#define sv_2bool		Perl_sv_2bool
+#define sv_2cv			Perl_sv_2cv
+#define sv_2io			Perl_sv_2io
+#define sv_2iv			Perl_sv_2iv
+#define sv_2mortal		Perl_sv_2mortal
+#define sv_2nv			Perl_sv_2nv
+#define sv_2pvutf8		Perl_sv_2pvutf8
+#define sv_2pvbyte		Perl_sv_2pvbyte
+#define sv_pvn_nomg		Perl_sv_pvn_nomg
+#define sv_2uv			Perl_sv_2uv
+#define sv_iv			Perl_sv_iv
+#define sv_uv			Perl_sv_uv
+#define sv_nv			Perl_sv_nv
+#define sv_pvn			Perl_sv_pvn
+#define sv_pvutf8n		Perl_sv_pvutf8n
+#define sv_pvbyten		Perl_sv_pvbyten
+#define sv_true			Perl_sv_true
+#ifdef PERL_CORE
+#define sv_add_arena		Perl_sv_add_arena
+#endif
+#define sv_backoff		Perl_sv_backoff
+#define sv_bless		Perl_sv_bless
+#define sv_catpvf		Perl_sv_catpvf
+#define sv_vcatpvf		Perl_sv_vcatpvf
+#define sv_catpv		Perl_sv_catpv
+#define sv_chop			Perl_sv_chop
+#ifdef PERL_CORE
+#define sv_clean_all		Perl_sv_clean_all
+#define sv_clean_objs		Perl_sv_clean_objs
+#endif
+#define sv_clear		Perl_sv_clear
+#define sv_cmp			Perl_sv_cmp
+#define sv_cmp_locale		Perl_sv_cmp_locale
+#if defined(USE_LOCALE_COLLATE)
+#define sv_collxfrm		Perl_sv_collxfrm
+#endif
+#define sv_compile_2op		Perl_sv_compile_2op
+#define getcwd_sv		Perl_getcwd_sv
+#define sv_dec			Perl_sv_dec
+#define sv_dump			Perl_sv_dump
+#define sv_derived_from		Perl_sv_derived_from
+#define sv_eq			Perl_sv_eq
+#define sv_free			Perl_sv_free
+#ifdef PERL_CORE
+#define sv_free_arenas		Perl_sv_free_arenas
+#endif
+#define sv_gets			Perl_sv_gets
+#define sv_grow			Perl_sv_grow
+#define sv_inc			Perl_sv_inc
+#define sv_insert		Perl_sv_insert
+#define sv_isa			Perl_sv_isa
+#define sv_isobject		Perl_sv_isobject
+#define sv_len			Perl_sv_len
+#define sv_len_utf8		Perl_sv_len_utf8
+#define sv_magic		Perl_sv_magic
+#define sv_magicext		Perl_sv_magicext
+#define sv_mortalcopy		Perl_sv_mortalcopy
+#define sv_newmortal		Perl_sv_newmortal
+#define sv_newref		Perl_sv_newref
+#define sv_peek			Perl_sv_peek
+#define sv_pos_u2b		Perl_sv_pos_u2b
+#define sv_pos_b2u		Perl_sv_pos_b2u
+#define sv_pvutf8n_force	Perl_sv_pvutf8n_force
+#define sv_pvbyten_force	Perl_sv_pvbyten_force
+#define sv_recode_to_utf8	Perl_sv_recode_to_utf8
+#define sv_cat_decode		Perl_sv_cat_decode
+#define sv_reftype		Perl_sv_reftype
+#define sv_replace		Perl_sv_replace
+#define sv_report_used		Perl_sv_report_used
+#define sv_reset		Perl_sv_reset
+#define sv_setpvf		Perl_sv_setpvf
+#define sv_vsetpvf		Perl_sv_vsetpvf
+#define sv_setiv		Perl_sv_setiv
+#define sv_setpviv		Perl_sv_setpviv
+#define sv_setuv		Perl_sv_setuv
+#define sv_setnv		Perl_sv_setnv
+#define sv_setref_iv		Perl_sv_setref_iv
+#define sv_setref_uv		Perl_sv_setref_uv
+#define sv_setref_nv		Perl_sv_setref_nv
+#define sv_setref_pv		Perl_sv_setref_pv
+#define sv_setref_pvn		Perl_sv_setref_pvn
+#define sv_setpv		Perl_sv_setpv
+#define sv_setpvn		Perl_sv_setpvn
+#define sv_taint		Perl_sv_taint
+#define sv_tainted		Perl_sv_tainted
+#define sv_unmagic		Perl_sv_unmagic
+#define sv_unref		Perl_sv_unref
+#define sv_unref_flags		Perl_sv_unref_flags
+#define sv_untaint		Perl_sv_untaint
+#define sv_upgrade		Perl_sv_upgrade
+#define sv_usepvn		Perl_sv_usepvn
+#define sv_vcatpvfn		Perl_sv_vcatpvfn
+#define sv_vsetpvfn		Perl_sv_vsetpvfn
+#define str_to_version		Perl_str_to_version
+#define swash_init		Perl_swash_init
+#define swash_fetch		Perl_swash_fetch
+#define taint_env		Perl_taint_env
+#define taint_proper		Perl_taint_proper
+#define to_utf8_case		Perl_to_utf8_case
+#define to_utf8_lower		Perl_to_utf8_lower
+#define to_utf8_upper		Perl_to_utf8_upper
+#define to_utf8_title		Perl_to_utf8_title
+#define to_utf8_fold		Perl_to_utf8_fold
+#if defined(UNLINK_ALL_VERSIONS)
+#define unlnk			Perl_unlnk
+#endif
+#if defined(USE_5005THREADS)
+#define unlock_condpair		Perl_unlock_condpair
+#endif
+#define unpack_str		Perl_unpack_str
+#define unpackstring		Perl_unpackstring
+#define unsharepvn		Perl_unsharepvn
+#ifdef PERL_CORE
+#define unshare_hek		Perl_unshare_hek
+#define utilize			Perl_utilize
+#endif
+#define utf16_to_utf8		Perl_utf16_to_utf8
+#define utf16_to_utf8_reversed	Perl_utf16_to_utf8_reversed
+#define utf8_length		Perl_utf8_length
+#define utf8_distance		Perl_utf8_distance
+#define utf8_hop		Perl_utf8_hop
+#define utf8_to_bytes		Perl_utf8_to_bytes
+#define bytes_from_utf8		Perl_bytes_from_utf8
+#define bytes_to_utf8		Perl_bytes_to_utf8
+#define utf8_to_uvchr		Perl_utf8_to_uvchr
+#define utf8_to_uvuni		Perl_utf8_to_uvuni
+#define utf8n_to_uvchr		Perl_utf8n_to_uvchr
+#define utf8n_to_uvuni		Perl_utf8n_to_uvuni
+#define uvchr_to_utf8		Perl_uvchr_to_utf8
+#define uvuni_to_utf8		Perl_uvuni_to_utf8
+#define uvchr_to_utf8_flags	Perl_uvchr_to_utf8_flags
+#define uvuni_to_utf8_flags	Perl_uvuni_to_utf8_flags
+#define pv_uni_display		Perl_pv_uni_display
+#define sv_uni_display		Perl_sv_uni_display
+#ifdef PERL_CORE
+#define vivify_defelem		Perl_vivify_defelem
+#define vivify_ref		Perl_vivify_ref
+#define wait4pid		Perl_wait4pid
+#define parse_unicode_opts	Perl_parse_unicode_opts
+#endif
+#define seed			Perl_seed
+#ifdef PERL_CORE
+#define get_hash_seed		Perl_get_hash_seed
+#define report_evil_fh		Perl_report_evil_fh
+#define report_uninit		Perl_report_uninit
+#endif
+#define warn			Perl_warn
+#define vwarn			Perl_vwarn
+#define warner			Perl_warner
+#define vwarner			Perl_vwarner
+#ifdef PERL_CORE
+#define watch			Perl_watch
+#endif
+#define whichsig		Perl_whichsig
+#ifdef PERL_CORE
+#define write_to_stderr		Perl_write_to_stderr
+#define yyerror			Perl_yyerror
+#endif
+#ifdef USE_PURE_BISON
+#ifdef PERL_CORE
+#define yylex_r			Perl_yylex_r
+#endif
+#endif
+#ifdef PERL_CORE
+#define yylex			Perl_yylex
+#define yyparse			Perl_yyparse
+#define yywarn			Perl_yywarn
+#endif
+#if defined(MYMALLOC)
+#define dump_mstats		Perl_dump_mstats
+#define get_mstats		Perl_get_mstats
+#endif
+#define safesysmalloc		Perl_safesysmalloc
+#define safesyscalloc		Perl_safesyscalloc
+#define safesysrealloc		Perl_safesysrealloc
+#define safesysfree		Perl_safesysfree
+#if defined(PERL_GLOBAL_STRUCT)
+#define GetVars			Perl_GetVars
+#endif
+#define runops_standard		Perl_runops_standard
+#define runops_debug		Perl_runops_debug
+#if defined(USE_5005THREADS)
+#define sv_lock			Perl_sv_lock
+#endif
+#define sv_catpvf_mg		Perl_sv_catpvf_mg
+#define sv_vcatpvf_mg		Perl_sv_vcatpvf_mg
+#define sv_catpv_mg		Perl_sv_catpv_mg
+#define sv_catpvn_mg		Perl_sv_catpvn_mg
+#define sv_catsv_mg		Perl_sv_catsv_mg
+#define sv_setpvf_mg		Perl_sv_setpvf_mg
+#define sv_vsetpvf_mg		Perl_sv_vsetpvf_mg
+#define sv_setiv_mg		Perl_sv_setiv_mg
+#define sv_setpviv_mg		Perl_sv_setpviv_mg
+#define sv_setuv_mg		Perl_sv_setuv_mg
+#define sv_setnv_mg		Perl_sv_setnv_mg
+#define sv_setpv_mg		Perl_sv_setpv_mg
+#define sv_setpvn_mg		Perl_sv_setpvn_mg
+#define sv_setsv_mg		Perl_sv_setsv_mg
+#define sv_usepvn_mg		Perl_sv_usepvn_mg
+#define get_vtbl		Perl_get_vtbl
+#define pv_display		Perl_pv_display
+#define dump_indent		Perl_dump_indent
+#define dump_vindent		Perl_dump_vindent
+#define do_gv_dump		Perl_do_gv_dump
+#define do_gvgv_dump		Perl_do_gvgv_dump
+#define do_hv_dump		Perl_do_hv_dump
+#define do_magic_dump		Perl_do_magic_dump
+#define do_op_dump		Perl_do_op_dump
+#define do_pmop_dump		Perl_do_pmop_dump
+#define do_sv_dump		Perl_do_sv_dump
+#define magic_dump		Perl_magic_dump
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define default_protect		Perl_default_protect
+#define vdefault_protect	Perl_vdefault_protect
+#endif
+#define reginitcolors		Perl_reginitcolors
+#define sv_2pv_nolen		Perl_sv_2pv_nolen
+#define sv_2pvutf8_nolen	Perl_sv_2pvutf8_nolen
+#define sv_2pvbyte_nolen	Perl_sv_2pvbyte_nolen
+#define sv_utf8_downgrade	Perl_sv_utf8_downgrade
+#define sv_utf8_encode		Perl_sv_utf8_encode
+#define sv_utf8_decode		Perl_sv_utf8_decode
+#define sv_force_normal		Perl_sv_force_normal
+#define sv_force_normal_flags	Perl_sv_force_normal_flags
+#define tmps_grow		Perl_tmps_grow
+#define sv_rvweaken		Perl_sv_rvweaken
+#ifdef PERL_CORE
+#define magic_killbackrefs	Perl_magic_killbackrefs
+#endif
+#define newANONATTRSUB		Perl_newANONATTRSUB
+#define newATTRSUB		Perl_newATTRSUB
+#define newMYSUB		Perl_newMYSUB
+#ifdef PERL_CORE
+#define my_attrs		Perl_my_attrs
+#define boot_core_xsutils	Perl_boot_core_xsutils
+#endif
+#if defined(USE_ITHREADS)
+#define cx_dup			Perl_cx_dup
+#define si_dup			Perl_si_dup
+#define ss_dup			Perl_ss_dup
+#define any_dup			Perl_any_dup
+#define he_dup			Perl_he_dup
+#define re_dup			Perl_re_dup
+#define fp_dup			Perl_fp_dup
+#define dirp_dup		Perl_dirp_dup
+#define gp_dup			Perl_gp_dup
+#define mg_dup			Perl_mg_dup
+#define sv_dup			Perl_sv_dup
+#define rvpv_dup		Perl_rvpv_dup
+#if defined(HAVE_INTERP_INTERN)
+#define sys_intern_dup		Perl_sys_intern_dup
+#endif
+#define ptr_table_new		Perl_ptr_table_new
+#define ptr_table_fetch		Perl_ptr_table_fetch
+#define ptr_table_store		Perl_ptr_table_store
+#define ptr_table_split		Perl_ptr_table_split
+#define ptr_table_clear		Perl_ptr_table_clear
+#define ptr_table_free		Perl_ptr_table_free
+#endif
+#if defined(HAVE_INTERP_INTERN)
+#define sys_intern_clear	Perl_sys_intern_clear
+#define sys_intern_init		Perl_sys_intern_init
+#endif
+#define custom_op_name		Perl_custom_op_name
+#define custom_op_desc		Perl_custom_op_desc
+#define sv_nosharing		Perl_sv_nosharing
+#define sv_nolocking		Perl_sv_nolocking
+#define sv_nounlocking		Perl_sv_nounlocking
+#define nothreadhook		Perl_nothreadhook
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define avhv_index_sv		S_avhv_index_sv
+#define avhv_index		S_avhv_index
+#endif
+#endif
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define do_trans_simple		S_do_trans_simple
+#define do_trans_count		S_do_trans_count
+#define do_trans_complex	S_do_trans_complex
+#define do_trans_simple_utf8	S_do_trans_simple_utf8
+#define do_trans_count_utf8	S_do_trans_count_utf8
+#define do_trans_complex_utf8	S_do_trans_complex_utf8
+#endif
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define gv_init_sv		S_gv_init_sv
+#define require_errno		S_require_errno
+#endif
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define hsplit			S_hsplit
+#define hfreeentries		S_hfreeentries
+#define new_he			S_new_he
+#define del_he			S_del_he
+#define save_hek_flags		S_save_hek_flags
+#define hv_magic_check		S_hv_magic_check
+#define unshare_hek_or_pvn	S_unshare_hek_or_pvn
+#define share_hek_flags		S_share_hek_flags
+#define hv_notallowed		S_hv_notallowed
+#endif
+#endif
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_magic		S_save_magic
+#define magic_methpack		S_magic_methpack
+#define magic_methcall		S_magic_methcall
+#define restore_magic		S_restore_magic
+#define unwind_handler_stack	S_unwind_handler_stack
+#endif
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define is_handle_constructor	S_is_handle_constructor
+#define is_list_assignment	S_is_list_assignment
+#define cop_free		S_cop_free
+#define modkids			S_modkids
+#define scalarboolean		S_scalarboolean
+#define newDEFSVOP		S_newDEFSVOP
+#define new_logop		S_new_logop
+#define simplify_sort		S_simplify_sort
+#define gv_ename		S_gv_ename
+#define scalar_mod_type		S_scalar_mod_type
+#define my_kid			S_my_kid
+#define dup_attrlist		S_dup_attrlist
+#define apply_attrs		S_apply_attrs
+#define apply_attrs_my		S_apply_attrs_my
+#define bad_type		S_bad_type
+#define no_bareword_allowed	S_no_bareword_allowed
+#define no_fh_allowed		S_no_fh_allowed
+#define too_few_arguments	S_too_few_arguments
+#define too_many_arguments	S_too_many_arguments
+#endif
+#endif
+#if defined(PL_OP_SLAB_ALLOC)
+#define Slab_Alloc		Perl_Slab_Alloc
+#define Slab_Free		Perl_Slab_Free
+#endif
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define find_beginning		S_find_beginning
+#define forbid_setid		S_forbid_setid
+#define incpush			S_incpush
+#define init_interp		S_init_interp
+#define init_ids		S_init_ids
+#define init_lexer		S_init_lexer
+#define init_main_stash		S_init_main_stash
+#define init_perllib		S_init_perllib
+#define init_postdump_symbols	S_init_postdump_symbols
+#define init_predump_symbols	S_init_predump_symbols
+#define my_exit_jump		S_my_exit_jump
+#define nuke_stacks		S_nuke_stacks
+#define open_script		S_open_script
+#define usage			S_usage
+#define validate_suid		S_validate_suid
+#endif
+#  if defined(IAMSUID)
+#ifdef PERL_CORE
+#define fd_on_nosuid_fs		S_fd_on_nosuid_fs
+#endif
+#  endif
+#ifdef PERL_CORE
+#define parse_body		S_parse_body
+#define run_body		S_run_body
+#define call_body		S_call_body
+#define call_list_body		S_call_list_body
+#endif
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#ifdef PERL_CORE
+#define vparse_body		S_vparse_body
+#define vrun_body		S_vrun_body
+#define vcall_body		S_vcall_body
+#define vcall_list_body		S_vcall_list_body
+#endif
+#endif
+#  if defined(USE_5005THREADS)
+#ifdef PERL_CORE
+#define init_main_thread	S_init_main_thread
+#endif
+#  endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define refto			S_refto
+#endif
+#endif
+#if defined(PERL_IN_PP_PACK_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define unpack_rec		S_unpack_rec
+#define pack_rec		S_pack_rec
+#define mul128			S_mul128
+#define measure_struct		S_measure_struct
+#define group_end		S_group_end
+#define get_num			S_get_num
+#define next_symbol		S_next_symbol
+#define doencodes		S_doencodes
+#define is_an_int		S_is_an_int
+#define div128			S_div128
+#endif
+#endif
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define docatch			S_docatch
+#define docatch_body		S_docatch_body
+#endif
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#ifdef PERL_CORE
+#define vdocatch_body		S_vdocatch_body
+#endif
+#endif
+#ifdef PERL_CORE
+#define dofindlabel		S_dofindlabel
+#define doparseform		S_doparseform
+#define num_overflow		S_num_overflow
+#define dopoptoeval		S_dopoptoeval
+#define dopoptolabel		S_dopoptolabel
+#define dopoptoloop		S_dopoptoloop
+#define dopoptosub		S_dopoptosub
+#define dopoptosub_at		S_dopoptosub_at
+#define save_lines		S_save_lines
+#define doeval			S_doeval
+#define check_type_and_open	S_check_type_and_open
+#define doopen_pm		S_doopen_pm
+#define path_is_absolute	S_path_is_absolute
+#endif
+#endif
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define do_maybe_phash		S_do_maybe_phash
+#define do_oddball		S_do_oddball
+#define get_db_sub		S_get_db_sub
+#define method_common		S_method_common
+#endif
+#endif
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define doform			S_doform
+#define emulate_eaccess		S_emulate_eaccess
+#endif
+#  if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+#ifdef PERL_CORE
+#define dooneliner		S_dooneliner
+#endif
+#  endif
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg			S_reg
+#define reganode		S_reganode
+#define regatom			S_regatom
+#define regbranch		S_regbranch
+#define reguni			S_reguni
+#define regclass		S_regclass
+#define regcurly		S_regcurly
+#define reg_node		S_reg_node
+#define regpiece		S_regpiece
+#define reginsert		S_reginsert
+#define regoptail		S_regoptail
+#define regtail			S_regtail
+#define regwhite		S_regwhite
+#define nextchar		S_nextchar
+#endif
+#  ifdef DEBUGGING
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define dumpuntil		S_dumpuntil
+#define put_byte		S_put_byte
+#endif
+#  endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define scan_commit		S_scan_commit
+#define cl_anything		S_cl_anything
+#define cl_is_anything		S_cl_is_anything
+#define cl_init			S_cl_init
+#define cl_init_zero		S_cl_init_zero
+#define cl_and			S_cl_and
+#define cl_or			S_cl_or
+#define study_chunk		S_study_chunk
+#define add_data		S_add_data
+#endif
+#ifdef PERL_CORE
+#define re_croak2		S_re_croak2
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regpposixcc		S_regpposixcc
+#define checkposixcc		S_checkposixcc
+#endif
+#endif
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regmatch		S_regmatch
+#define regrepeat		S_regrepeat
+#define regrepeat_hard		S_regrepeat_hard
+#define regtry			S_regtry
+#define reginclass		S_reginclass
+#define regcppush		S_regcppush
+#define regcppop		S_regcppop
+#define regcp_set_to		S_regcp_set_to
+#define cache_re		S_cache_re
+#define reghop			S_reghop
+#define reghop3			S_reghop3
+#define reghopmaybe		S_reghopmaybe
+#define reghopmaybe3		S_reghopmaybe3
+#define find_byclass		S_find_byclass
+#define to_utf8_substr		S_to_utf8_substr
+#define to_byte_substr		S_to_byte_substr
+#endif
+#endif
+#if defined(PERL_IN_DUMP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define deb_curcv		S_deb_curcv
+#define debprof			S_debprof
+#endif
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_scalar_at		S_save_scalar_at
+#endif
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define uiv_2buf		S_uiv_2buf
+#define asIV			S_asIV
+#define asUV			S_asUV
+#define new_xiv			S_new_xiv
+#define new_xnv			S_new_xnv
+#define new_xpv			S_new_xpv
+#define new_xpviv		S_new_xpviv
+#define new_xpvnv		S_new_xpvnv
+#define new_xpvcv		S_new_xpvcv
+#define new_xpvav		S_new_xpvav
+#define new_xpvhv		S_new_xpvhv
+#define new_xpvmg		S_new_xpvmg
+#define new_xpvlv		S_new_xpvlv
+#define new_xpvbm		S_new_xpvbm
+#define new_xrv			S_new_xrv
+#define del_xiv			S_del_xiv
+#define del_xnv			S_del_xnv
+#define del_xpv			S_del_xpv
+#define del_xpviv		S_del_xpviv
+#define del_xpvnv		S_del_xpvnv
+#define del_xpvcv		S_del_xpvcv
+#define del_xpvav		S_del_xpvav
+#define del_xpvhv		S_del_xpvhv
+#define del_xpvmg		S_del_xpvmg
+#define del_xpvlv		S_del_xpvlv
+#define del_xpvbm		S_del_xpvbm
+#define del_xrv			S_del_xrv
+#define sv_unglob		S_sv_unglob
+#define not_a_number		S_not_a_number
+#define visit			S_visit
+#define sv_add_backref		S_sv_add_backref
+#define sv_del_backref		S_sv_del_backref
+#endif
+#  ifdef DEBUGGING
+#ifdef PERL_CORE
+#define del_sv			S_del_sv
+#endif
+#  endif
+#  if !defined(NV_PRESERVES_UV)
+#ifdef PERL_CORE
+#define sv_2iuv_non_preserve	S_sv_2iuv_non_preserve
+#endif
+#  endif
+#ifdef PERL_CORE
+#define expect_number		S_expect_number
+#endif
+#ifdef PERL_CORE
+#define utf8_mg_pos		S_utf8_mg_pos
+#define utf8_mg_pos_init	S_utf8_mg_pos_init
+#endif
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define check_uni		S_check_uni
+#define force_next		S_force_next
+#define force_version		S_force_version
+#define force_word		S_force_word
+#define tokeq			S_tokeq
+#define pending_ident		S_pending_ident
+#define scan_const		S_scan_const
+#define scan_formline		S_scan_formline
+#define scan_heredoc		S_scan_heredoc
+#define scan_ident		S_scan_ident
+#define scan_inputsymbol	S_scan_inputsymbol
+#define scan_pat		S_scan_pat
+#define scan_str		S_scan_str
+#define scan_subst		S_scan_subst
+#define scan_trans		S_scan_trans
+#define scan_word		S_scan_word
+#define skipspace		S_skipspace
+#define swallow_bom		S_swallow_bom
+#define checkcomma		S_checkcomma
+#define force_ident		S_force_ident
+#define incline			S_incline
+#define intuit_method		S_intuit_method
+#define intuit_more		S_intuit_more
+#define lop			S_lop
+#define missingterm		S_missingterm
+#define no_op			S_no_op
+#define set_csh			S_set_csh
+#define sublex_done		S_sublex_done
+#define sublex_push		S_sublex_push
+#define sublex_start		S_sublex_start
+#define filter_gets		S_filter_gets
+#define find_in_my_stash	S_find_in_my_stash
+#define new_constant		S_new_constant
+#endif
+#  if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define tokereport		S_tokereport
+#endif
+#  endif
+#ifdef PERL_CORE
+#define ao			S_ao
+#define depcom			S_depcom
+#define incl_perldb		S_incl_perldb
+#endif
+#  if defined(PERL_CR_FILTER)
+#ifdef PERL_CORE
+#define cr_textfilter		S_cr_textfilter
+#endif
+#  endif
+#endif
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define isa_lookup		S_isa_lookup
+#endif
+#endif
+#if defined(PERL_IN_LOCALE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define stdize_locale		S_stdize_locale
+#endif
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define closest_cop		S_closest_cop
+#define mess_alloc		S_mess_alloc
+#endif
+#endif
+#if defined(PERL_IN_NUMERIC_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define mulexp10		S_mulexp10
+#endif
+#endif
+#if defined(PERL_IN_UTF8_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define is_utf8_char_slow	S_is_utf8_char_slow
+#endif
+#endif
+#define sv_setsv_flags		Perl_sv_setsv_flags
+#define sv_catpvn_flags		Perl_sv_catpvn_flags
+#define sv_catsv_flags		Perl_sv_catsv_flags
+#define sv_utf8_upgrade_flags	Perl_sv_utf8_upgrade_flags
+#define sv_pvn_force_flags	Perl_sv_pvn_force_flags
+#define sv_2pv_flags		Perl_sv_2pv_flags
+#define sv_copypv		Perl_sv_copypv
+#define my_atof2		Perl_my_atof2
+#define my_socketpair		Perl_my_socketpair
+#if defined(USE_PERLIO) && !defined(USE_SFIO)
+#define PerlIO_close		Perl_PerlIO_close
+#define PerlIO_fill		Perl_PerlIO_fill
+#define PerlIO_fileno		Perl_PerlIO_fileno
+#define PerlIO_eof		Perl_PerlIO_eof
+#define PerlIO_error		Perl_PerlIO_error
+#define PerlIO_flush		Perl_PerlIO_flush
+#define PerlIO_clearerr		Perl_PerlIO_clearerr
+#define PerlIO_set_cnt		Perl_PerlIO_set_cnt
+#define PerlIO_set_ptrcnt	Perl_PerlIO_set_ptrcnt
+#define PerlIO_setlinebuf	Perl_PerlIO_setlinebuf
+#define PerlIO_read		Perl_PerlIO_read
+#define PerlIO_write		Perl_PerlIO_write
+#define PerlIO_unread		Perl_PerlIO_unread
+#define PerlIO_tell		Perl_PerlIO_tell
+#define PerlIO_seek		Perl_PerlIO_seek
+#define PerlIO_get_base		Perl_PerlIO_get_base
+#define PerlIO_get_ptr		Perl_PerlIO_get_ptr
+#define PerlIO_get_bufsiz	Perl_PerlIO_get_bufsiz
+#define PerlIO_get_cnt		Perl_PerlIO_get_cnt
+#define PerlIO_stdin		Perl_PerlIO_stdin
+#define PerlIO_stdout		Perl_PerlIO_stdout
+#define PerlIO_stderr		Perl_PerlIO_stderr
+#endif /* PERLIO_LAYERS */
+#ifdef PERL_CORE
+#define deb_stack_all		Perl_deb_stack_all
+#endif
+#ifdef PERL_IN_DEB_C
+#ifdef PERL_CORE
+#define deb_stack_n		S_deb_stack_n
+#endif
+#endif
+#ifdef PERL_CORE
+#define pad_new			Perl_pad_new
+#define pad_undef		Perl_pad_undef
+#define pad_add_name		Perl_pad_add_name
+#define pad_add_anon		Perl_pad_add_anon
+#define pad_check_dup		Perl_pad_check_dup
+#endif
+#ifdef DEBUGGING
+#ifdef PERL_CORE
+#define pad_setsv		Perl_pad_setsv
+#endif
+#endif
+#ifdef PERL_CORE
+#define pad_block_start		Perl_pad_block_start
+#define pad_tidy		Perl_pad_tidy
+#define do_dump_pad		Perl_do_dump_pad
+#define pad_fixup_inner_anons	Perl_pad_fixup_inner_anons
+#endif
+#ifdef PERL_CORE
+#define pad_push		Perl_pad_push
+#define pad_compname_type	Perl_pad_compname_type
+#endif
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define pad_findlex		S_pad_findlex
+#endif
+#  if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define cv_dump			S_cv_dump
+#endif
+#  endif
+#ifdef PERL_CORE
+#define cv_clone2		S_cv_clone2
+#endif
+#endif
+#ifdef PERL_CORE
+#define find_runcv		Perl_find_runcv
+#define free_tied_hv_pool	Perl_free_tied_hv_pool
+#endif
+#if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define get_debug_opts		Perl_get_debug_opts
+#endif
+#endif
+#define hv_clear_placeholders	Perl_hv_clear_placeholders
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define hv_delete_common	S_hv_delete_common
+#define hv_fetch_common		S_hv_fetch_common
+#endif
+#endif
+#define hv_scalar		Perl_hv_scalar
+#ifdef PERL_CORE
+#define magic_scalarpack	Perl_magic_scalarpack
+#endif
+#if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define get_debug_opts_flags	Perl_get_debug_opts_flags
+#endif
+#endif
+#define op_refcnt_lock		Perl_op_refcnt_lock
+#define op_refcnt_unlock	Perl_op_refcnt_unlock
+#define savesvpv		Perl_savesvpv
+#ifdef PERL_NEED_MY_HTOLE16
+#ifdef PERL_CORE
+#define my_htole16		Perl_my_htole16
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH16
+#ifdef PERL_CORE
+#define my_letoh16		Perl_my_letoh16
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE16
+#ifdef PERL_CORE
+#define my_htobe16		Perl_my_htobe16
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH16
+#ifdef PERL_CORE
+#define my_betoh16		Perl_my_betoh16
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLE32
+#ifdef PERL_CORE
+#define my_htole32		Perl_my_htole32
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH32
+#ifdef PERL_CORE
+#define my_letoh32		Perl_my_letoh32
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE32
+#ifdef PERL_CORE
+#define my_htobe32		Perl_my_htobe32
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH32
+#ifdef PERL_CORE
+#define my_betoh32		Perl_my_betoh32
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLE64
+#ifdef PERL_CORE
+#define my_htole64		Perl_my_htole64
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH64
+#ifdef PERL_CORE
+#define my_letoh64		Perl_my_letoh64
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE64
+#ifdef PERL_CORE
+#define my_htobe64		Perl_my_htobe64
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH64
+#ifdef PERL_CORE
+#define my_betoh64		Perl_my_betoh64
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLES
+#ifdef PERL_CORE
+#define my_htoles		Perl_my_htoles
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHS
+#ifdef PERL_CORE
+#define my_letohs		Perl_my_letohs
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBES
+#ifdef PERL_CORE
+#define my_htobes		Perl_my_htobes
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHS
+#ifdef PERL_CORE
+#define my_betohs		Perl_my_betohs
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLEI
+#ifdef PERL_CORE
+#define my_htolei		Perl_my_htolei
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHI
+#ifdef PERL_CORE
+#define my_letohi		Perl_my_letohi
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBEI
+#ifdef PERL_CORE
+#define my_htobei		Perl_my_htobei
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHI
+#ifdef PERL_CORE
+#define my_betohi		Perl_my_betohi
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLEL
+#ifdef PERL_CORE
+#define my_htolel		Perl_my_htolel
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHL
+#ifdef PERL_CORE
+#define my_letohl		Perl_my_letohl
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBEL
+#ifdef PERL_CORE
+#define my_htobel		Perl_my_htobel
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHL
+#ifdef PERL_CORE
+#define my_betohl		Perl_my_betohl
+#endif
+#endif
+#ifdef PERL_CORE
+#define my_swabn		Perl_my_swabn
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#define ck_anoncode		Perl_ck_anoncode
+#define ck_bitop		Perl_ck_bitop
+#define ck_concat		Perl_ck_concat
+#define ck_defined		Perl_ck_defined
+#define ck_delete		Perl_ck_delete
+#define ck_die			Perl_ck_die
+#define ck_eof			Perl_ck_eof
+#define ck_eval			Perl_ck_eval
+#define ck_exec			Perl_ck_exec
+#define ck_exists		Perl_ck_exists
+#define ck_exit			Perl_ck_exit
+#define ck_ftst			Perl_ck_ftst
+#define ck_fun			Perl_ck_fun
+#define ck_glob			Perl_ck_glob
+#define ck_grep			Perl_ck_grep
+#define ck_index		Perl_ck_index
+#define ck_join			Perl_ck_join
+#define ck_lengthconst		Perl_ck_lengthconst
+#define ck_lfun			Perl_ck_lfun
+#define ck_listiob		Perl_ck_listiob
+#define ck_match		Perl_ck_match
+#define ck_method		Perl_ck_method
+#define ck_null			Perl_ck_null
+#define ck_open			Perl_ck_open
+#define ck_repeat		Perl_ck_repeat
+#define ck_require		Perl_ck_require
+#define ck_return		Perl_ck_return
+#define ck_rfun			Perl_ck_rfun
+#define ck_rvconst		Perl_ck_rvconst
+#define ck_sassign		Perl_ck_sassign
+#define ck_select		Perl_ck_select
+#define ck_shift		Perl_ck_shift
+#define ck_sort			Perl_ck_sort
+#define ck_spair		Perl_ck_spair
+#define ck_split		Perl_ck_split
+#define ck_subr			Perl_ck_subr
+#define ck_substr		Perl_ck_substr
+#define ck_svconst		Perl_ck_svconst
+#define ck_trunc		Perl_ck_trunc
+#endif
+#define is_utf8_string_loclen	Perl_is_utf8_string_loclen
+#define newSVhek		Perl_newSVhek
+#define stashpv_hvname_match	Perl_stashpv_hvname_match
+#ifdef PERL_CORE
+#define offer_nice_chunk	Perl_offer_nice_chunk
+#endif
+#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+#ifdef PERL_CORE
+#define dump_sv_child		Perl_dump_sv_child
+#endif
+#endif
+#ifdef PERL_DONT_CREATE_GVSV
+#define gv_SVadd		Perl_gv_SVadd
+#endif
+#ifdef PERL_CORE
+#define my_clearenv		Perl_my_clearenv
+#endif
+#define ck_anoncode		Perl_ck_anoncode
+#define ck_bitop		Perl_ck_bitop
+#define ck_concat		Perl_ck_concat
+#define ck_defined		Perl_ck_defined
+#define ck_delete		Perl_ck_delete
+#define ck_die			Perl_ck_die
+#define ck_eof			Perl_ck_eof
+#define ck_eval			Perl_ck_eval
+#define ck_exec			Perl_ck_exec
+#define ck_exists		Perl_ck_exists
+#define ck_exit			Perl_ck_exit
+#define ck_ftst			Perl_ck_ftst
+#define ck_fun			Perl_ck_fun
+#define ck_glob			Perl_ck_glob
+#define ck_grep			Perl_ck_grep
+#define ck_index		Perl_ck_index
+#define ck_join			Perl_ck_join
+#define ck_lengthconst		Perl_ck_lengthconst
+#define ck_lfun			Perl_ck_lfun
+#define ck_listiob		Perl_ck_listiob
+#define ck_match		Perl_ck_match
+#define ck_method		Perl_ck_method
+#define ck_null			Perl_ck_null
+#define ck_open			Perl_ck_open
+#define ck_repeat		Perl_ck_repeat
+#define ck_require		Perl_ck_require
+#define ck_return		Perl_ck_return
+#define ck_rfun			Perl_ck_rfun
+#define ck_rvconst		Perl_ck_rvconst
+#define ck_sassign		Perl_ck_sassign
+#define ck_select		Perl_ck_select
+#define ck_shift		Perl_ck_shift
+#define ck_sort			Perl_ck_sort
+#define ck_spair		Perl_ck_spair
+#define ck_split		Perl_ck_split
+#define ck_subr			Perl_ck_subr
+#define ck_substr		Perl_ck_substr
+#define ck_svconst		Perl_ck_svconst
+#define ck_trunc		Perl_ck_trunc
+#define pp_aassign		Perl_pp_aassign
+#define pp_abs			Perl_pp_abs
+#define pp_accept		Perl_pp_accept
+#define pp_add			Perl_pp_add
+#define pp_aelem		Perl_pp_aelem
+#define pp_aelemfast		Perl_pp_aelemfast
+#define pp_alarm		Perl_pp_alarm
+#define pp_and			Perl_pp_and
+#define pp_andassign		Perl_pp_andassign
+#define pp_anoncode		Perl_pp_anoncode
+#define pp_anonhash		Perl_pp_anonhash
+#define pp_anonlist		Perl_pp_anonlist
+#define pp_aslice		Perl_pp_aslice
+#define pp_atan2		Perl_pp_atan2
+#define pp_av2arylen		Perl_pp_av2arylen
+#define pp_backtick		Perl_pp_backtick
+#define pp_bind			Perl_pp_bind
+#define pp_binmode		Perl_pp_binmode
+#define pp_bit_and		Perl_pp_bit_and
+#define pp_bit_or		Perl_pp_bit_or
+#define pp_bit_xor		Perl_pp_bit_xor
+#define pp_bless		Perl_pp_bless
+#define pp_caller		Perl_pp_caller
+#define pp_chdir		Perl_pp_chdir
+#define pp_chmod		Perl_pp_chmod
+#define pp_chomp		Perl_pp_chomp
+#define pp_chop			Perl_pp_chop
+#define pp_chown		Perl_pp_chown
+#define pp_chr			Perl_pp_chr
+#define pp_chroot		Perl_pp_chroot
+#define pp_close		Perl_pp_close
+#define pp_closedir		Perl_pp_closedir
+#define pp_complement		Perl_pp_complement
+#define pp_concat		Perl_pp_concat
+#define pp_cond_expr		Perl_pp_cond_expr
+#define pp_connect		Perl_pp_connect
+#define pp_const		Perl_pp_const
+#define pp_cos			Perl_pp_cos
+#define pp_crypt		Perl_pp_crypt
+#define pp_dbmclose		Perl_pp_dbmclose
+#define pp_dbmopen		Perl_pp_dbmopen
+#define pp_dbstate		Perl_pp_dbstate
+#define pp_defined		Perl_pp_defined
+#define pp_delete		Perl_pp_delete
+#define pp_die			Perl_pp_die
+#define pp_divide		Perl_pp_divide
+#define pp_dofile		Perl_pp_dofile
+#define pp_dump			Perl_pp_dump
+#define pp_each			Perl_pp_each
+#define pp_egrent		Perl_pp_egrent
+#define pp_ehostent		Perl_pp_ehostent
+#define pp_enetent		Perl_pp_enetent
+#define pp_enter		Perl_pp_enter
+#define pp_entereval		Perl_pp_entereval
+#define pp_enteriter		Perl_pp_enteriter
+#define pp_enterloop		Perl_pp_enterloop
+#define pp_entersub		Perl_pp_entersub
+#define pp_entertry		Perl_pp_entertry
+#define pp_enterwrite		Perl_pp_enterwrite
+#define pp_eof			Perl_pp_eof
+#define pp_eprotoent		Perl_pp_eprotoent
+#define pp_epwent		Perl_pp_epwent
+#define pp_eq			Perl_pp_eq
+#define pp_eservent		Perl_pp_eservent
+#define pp_exec			Perl_pp_exec
+#define pp_exists		Perl_pp_exists
+#define pp_exit			Perl_pp_exit
+#define pp_exp			Perl_pp_exp
+#define pp_fcntl		Perl_pp_fcntl
+#define pp_fileno		Perl_pp_fileno
+#define pp_flip			Perl_pp_flip
+#define pp_flock		Perl_pp_flock
+#define pp_flop			Perl_pp_flop
+#define pp_fork			Perl_pp_fork
+#define pp_formline		Perl_pp_formline
+#define pp_ftatime		Perl_pp_ftatime
+#define pp_ftbinary		Perl_pp_ftbinary
+#define pp_ftblk		Perl_pp_ftblk
+#define pp_ftchr		Perl_pp_ftchr
+#define pp_ftctime		Perl_pp_ftctime
+#define pp_ftdir		Perl_pp_ftdir
+#define pp_fteexec		Perl_pp_fteexec
+#define pp_fteowned		Perl_pp_fteowned
+#define pp_fteread		Perl_pp_fteread
+#define pp_ftewrite		Perl_pp_ftewrite
+#define pp_ftfile		Perl_pp_ftfile
+#define pp_ftis			Perl_pp_ftis
+#define pp_ftlink		Perl_pp_ftlink
+#define pp_ftmtime		Perl_pp_ftmtime
+#define pp_ftpipe		Perl_pp_ftpipe
+#define pp_ftrexec		Perl_pp_ftrexec
+#define pp_ftrowned		Perl_pp_ftrowned
+#define pp_ftrread		Perl_pp_ftrread
+#define pp_ftrwrite		Perl_pp_ftrwrite
+#define pp_ftsgid		Perl_pp_ftsgid
+#define pp_ftsize		Perl_pp_ftsize
+#define pp_ftsock		Perl_pp_ftsock
+#define pp_ftsuid		Perl_pp_ftsuid
+#define pp_ftsvtx		Perl_pp_ftsvtx
+#define pp_fttext		Perl_pp_fttext
+#define pp_fttty		Perl_pp_fttty
+#define pp_ftzero		Perl_pp_ftzero
+#define pp_ge			Perl_pp_ge
+#define pp_gelem		Perl_pp_gelem
+#define pp_getc			Perl_pp_getc
+#define pp_getlogin		Perl_pp_getlogin
+#define pp_getpeername		Perl_pp_getpeername
+#define pp_getpgrp		Perl_pp_getpgrp
+#define pp_getppid		Perl_pp_getppid
+#define pp_getpriority		Perl_pp_getpriority
+#define pp_getsockname		Perl_pp_getsockname
+#define pp_ggrent		Perl_pp_ggrent
+#define pp_ggrgid		Perl_pp_ggrgid
+#define pp_ggrnam		Perl_pp_ggrnam
+#define pp_ghbyaddr		Perl_pp_ghbyaddr
+#define pp_ghbyname		Perl_pp_ghbyname
+#define pp_ghostent		Perl_pp_ghostent
+#define pp_glob			Perl_pp_glob
+#define pp_gmtime		Perl_pp_gmtime
+#define pp_gnbyaddr		Perl_pp_gnbyaddr
+#define pp_gnbyname		Perl_pp_gnbyname
+#define pp_gnetent		Perl_pp_gnetent
+#define pp_goto			Perl_pp_goto
+#define pp_gpbyname		Perl_pp_gpbyname
+#define pp_gpbynumber		Perl_pp_gpbynumber
+#define pp_gprotoent		Perl_pp_gprotoent
+#define pp_gpwent		Perl_pp_gpwent
+#define pp_gpwnam		Perl_pp_gpwnam
+#define pp_gpwuid		Perl_pp_gpwuid
+#define pp_grepstart		Perl_pp_grepstart
+#define pp_grepwhile		Perl_pp_grepwhile
+#define pp_gsbyname		Perl_pp_gsbyname
+#define pp_gsbyport		Perl_pp_gsbyport
+#define pp_gservent		Perl_pp_gservent
+#define pp_gsockopt		Perl_pp_gsockopt
+#define pp_gt			Perl_pp_gt
+#define pp_gv			Perl_pp_gv
+#define pp_gvsv			Perl_pp_gvsv
+#define pp_helem		Perl_pp_helem
+#define pp_hex			Perl_pp_hex
+#define pp_hslice		Perl_pp_hslice
+#define pp_i_add		Perl_pp_i_add
+#define pp_i_divide		Perl_pp_i_divide
+#define pp_i_eq			Perl_pp_i_eq
+#define pp_i_ge			Perl_pp_i_ge
+#define pp_i_gt			Perl_pp_i_gt
+#define pp_i_le			Perl_pp_i_le
+#define pp_i_lt			Perl_pp_i_lt
+#define pp_i_modulo		Perl_pp_i_modulo
+#define pp_i_multiply		Perl_pp_i_multiply
+#define pp_i_ncmp		Perl_pp_i_ncmp
+#define pp_i_ne			Perl_pp_i_ne
+#define pp_i_negate		Perl_pp_i_negate
+#define pp_i_subtract		Perl_pp_i_subtract
+#define pp_index		Perl_pp_index
+#define pp_int			Perl_pp_int
+#define pp_ioctl		Perl_pp_ioctl
+#define pp_iter			Perl_pp_iter
+#define pp_join			Perl_pp_join
+#define pp_keys			Perl_pp_keys
+#define pp_kill			Perl_pp_kill
+#define pp_last			Perl_pp_last
+#define pp_lc			Perl_pp_lc
+#define pp_lcfirst		Perl_pp_lcfirst
+#define pp_le			Perl_pp_le
+#define pp_leave		Perl_pp_leave
+#define pp_leaveeval		Perl_pp_leaveeval
+#define pp_leaveloop		Perl_pp_leaveloop
+#define pp_leavesub		Perl_pp_leavesub
+#define pp_leavesublv		Perl_pp_leavesublv
+#define pp_leavetry		Perl_pp_leavetry
+#define pp_leavewrite		Perl_pp_leavewrite
+#define pp_left_shift		Perl_pp_left_shift
+#define pp_length		Perl_pp_length
+#define pp_lineseq		Perl_pp_lineseq
+#define pp_link			Perl_pp_link
+#define pp_list			Perl_pp_list
+#define pp_listen		Perl_pp_listen
+#define pp_localtime		Perl_pp_localtime
+#define pp_lock			Perl_pp_lock
+#define pp_log			Perl_pp_log
+#define pp_lslice		Perl_pp_lslice
+#define pp_lstat		Perl_pp_lstat
+#define pp_lt			Perl_pp_lt
+#define pp_mapstart		Perl_pp_mapstart
+#define pp_mapwhile		Perl_pp_mapwhile
+#define pp_match		Perl_pp_match
+#define pp_method		Perl_pp_method
+#define pp_method_named		Perl_pp_method_named
+#define pp_mkdir		Perl_pp_mkdir
+#define pp_modulo		Perl_pp_modulo
+#define pp_msgctl		Perl_pp_msgctl
+#define pp_msgget		Perl_pp_msgget
+#define pp_msgrcv		Perl_pp_msgrcv
+#define pp_msgsnd		Perl_pp_msgsnd
+#define pp_multiply		Perl_pp_multiply
+#define pp_ncmp			Perl_pp_ncmp
+#define pp_ne			Perl_pp_ne
+#define pp_negate		Perl_pp_negate
+#define pp_next			Perl_pp_next
+#define pp_nextstate		Perl_pp_nextstate
+#define pp_not			Perl_pp_not
+#define pp_null			Perl_pp_null
+#define pp_oct			Perl_pp_oct
+#define pp_open			Perl_pp_open
+#define pp_open_dir		Perl_pp_open_dir
+#define pp_or			Perl_pp_or
+#define pp_orassign		Perl_pp_orassign
+#define pp_ord			Perl_pp_ord
+#define pp_pack			Perl_pp_pack
+#define pp_padany		Perl_pp_padany
+#define pp_padav		Perl_pp_padav
+#define pp_padhv		Perl_pp_padhv
+#define pp_padsv		Perl_pp_padsv
+#define pp_pipe_op		Perl_pp_pipe_op
+#define pp_pop			Perl_pp_pop
+#define pp_pos			Perl_pp_pos
+#define pp_postdec		Perl_pp_postdec
+#define pp_postinc		Perl_pp_postinc
+#define pp_pow			Perl_pp_pow
+#define pp_predec		Perl_pp_predec
+#define pp_preinc		Perl_pp_preinc
+#define pp_print		Perl_pp_print
+#define pp_prototype		Perl_pp_prototype
+#define pp_prtf			Perl_pp_prtf
+#define pp_push			Perl_pp_push
+#define pp_pushmark		Perl_pp_pushmark
+#define pp_pushre		Perl_pp_pushre
+#define pp_qr			Perl_pp_qr
+#define pp_quotemeta		Perl_pp_quotemeta
+#define pp_rand			Perl_pp_rand
+#define pp_range		Perl_pp_range
+#define pp_rcatline		Perl_pp_rcatline
+#define pp_read			Perl_pp_read
+#define pp_readdir		Perl_pp_readdir
+#define pp_readline		Perl_pp_readline
+#define pp_readlink		Perl_pp_readlink
+#define pp_recv			Perl_pp_recv
+#define pp_redo			Perl_pp_redo
+#define pp_ref			Perl_pp_ref
+#define pp_refgen		Perl_pp_refgen
+#define pp_regcmaybe		Perl_pp_regcmaybe
+#define pp_regcomp		Perl_pp_regcomp
+#define pp_regcreset		Perl_pp_regcreset
+#define pp_rename		Perl_pp_rename
+#define pp_repeat		Perl_pp_repeat
+#define pp_require		Perl_pp_require
+#define pp_reset		Perl_pp_reset
+#define pp_return		Perl_pp_return
+#define pp_reverse		Perl_pp_reverse
+#define pp_rewinddir		Perl_pp_rewinddir
+#define pp_right_shift		Perl_pp_right_shift
+#define pp_rindex		Perl_pp_rindex
+#define pp_rmdir		Perl_pp_rmdir
+#define pp_rv2av		Perl_pp_rv2av
+#define pp_rv2cv		Perl_pp_rv2cv
+#define pp_rv2gv		Perl_pp_rv2gv
+#define pp_rv2hv		Perl_pp_rv2hv
+#define pp_rv2sv		Perl_pp_rv2sv
+#define pp_sassign		Perl_pp_sassign
+#define pp_scalar		Perl_pp_scalar
+#define pp_schomp		Perl_pp_schomp
+#define pp_schop		Perl_pp_schop
+#define pp_scmp			Perl_pp_scmp
+#define pp_scope		Perl_pp_scope
+#define pp_seek			Perl_pp_seek
+#define pp_seekdir		Perl_pp_seekdir
+#define pp_select		Perl_pp_select
+#define pp_semctl		Perl_pp_semctl
+#define pp_semget		Perl_pp_semget
+#define pp_semop		Perl_pp_semop
+#define pp_send			Perl_pp_send
+#define pp_seq			Perl_pp_seq
+#define pp_setpgrp		Perl_pp_setpgrp
+#define pp_setpriority		Perl_pp_setpriority
+#define pp_setstate		Perl_pp_setstate
+#define pp_sge			Perl_pp_sge
+#define pp_sgrent		Perl_pp_sgrent
+#define pp_sgt			Perl_pp_sgt
+#define pp_shift		Perl_pp_shift
+#define pp_shmctl		Perl_pp_shmctl
+#define pp_shmget		Perl_pp_shmget
+#define pp_shmread		Perl_pp_shmread
+#define pp_shmwrite		Perl_pp_shmwrite
+#define pp_shostent		Perl_pp_shostent
+#define pp_shutdown		Perl_pp_shutdown
+#define pp_sin			Perl_pp_sin
+#define pp_sle			Perl_pp_sle
+#define pp_sleep		Perl_pp_sleep
+#define pp_slt			Perl_pp_slt
+#define pp_sne			Perl_pp_sne
+#define pp_snetent		Perl_pp_snetent
+#define pp_socket		Perl_pp_socket
+#define pp_sockpair		Perl_pp_sockpair
+#define pp_sort			Perl_pp_sort
+#define pp_splice		Perl_pp_splice
+#define pp_split		Perl_pp_split
+#define pp_sprintf		Perl_pp_sprintf
+#define pp_sprotoent		Perl_pp_sprotoent
+#define pp_spwent		Perl_pp_spwent
+#define pp_sqrt			Perl_pp_sqrt
+#define pp_srand		Perl_pp_srand
+#define pp_srefgen		Perl_pp_srefgen
+#define pp_sselect		Perl_pp_sselect
+#define pp_sservent		Perl_pp_sservent
+#define pp_ssockopt		Perl_pp_ssockopt
+#define pp_stat			Perl_pp_stat
+#define pp_stringify		Perl_pp_stringify
+#define pp_stub			Perl_pp_stub
+#define pp_study		Perl_pp_study
+#define pp_subst		Perl_pp_subst
+#define pp_substcont		Perl_pp_substcont
+#define pp_substr		Perl_pp_substr
+#define pp_subtract		Perl_pp_subtract
+#define pp_symlink		Perl_pp_symlink
+#define pp_syscall		Perl_pp_syscall
+#define pp_sysopen		Perl_pp_sysopen
+#define pp_sysread		Perl_pp_sysread
+#define pp_sysseek		Perl_pp_sysseek
+#define pp_system		Perl_pp_system
+#define pp_syswrite		Perl_pp_syswrite
+#define pp_tell			Perl_pp_tell
+#define pp_telldir		Perl_pp_telldir
+#define pp_threadsv		Perl_pp_threadsv
+#define pp_tie			Perl_pp_tie
+#define pp_tied			Perl_pp_tied
+#define pp_time			Perl_pp_time
+#define pp_tms			Perl_pp_tms
+#define pp_trans		Perl_pp_trans
+#define pp_truncate		Perl_pp_truncate
+#define pp_uc			Perl_pp_uc
+#define pp_ucfirst		Perl_pp_ucfirst
+#define pp_umask		Perl_pp_umask
+#define pp_undef		Perl_pp_undef
+#define pp_unlink		Perl_pp_unlink
+#define pp_unpack		Perl_pp_unpack
+#define pp_unshift		Perl_pp_unshift
+#define pp_unstack		Perl_pp_unstack
+#define pp_untie		Perl_pp_untie
+#define pp_utime		Perl_pp_utime
+#define pp_values		Perl_pp_values
+#define pp_vec			Perl_pp_vec
+#define pp_wait			Perl_pp_wait
+#define pp_waitpid		Perl_pp_waitpid
+#define pp_wantarray		Perl_pp_wantarray
+#define pp_warn			Perl_pp_warn
+#define pp_xor			Perl_pp_xor
+
+#else	/* PERL_IMPLICIT_CONTEXT */
+
+#if defined(PERL_IMPLICIT_SYS)
+#endif
+#define doing_taint		Perl_doing_taint
+#if defined(USE_ITHREADS)
+#  if defined(PERL_IMPLICIT_SYS)
+#  endif
+#endif
+#if defined(MYMALLOC)
+#ifdef PERL_CORE
+#define malloced_size		Perl_malloced_size
+#endif
+#endif
+#define get_context		Perl_get_context
+#define set_context		Perl_set_context
+#define amagic_call(a,b,c,d)	Perl_amagic_call(aTHX_ a,b,c,d)
+#define Gv_AMupdate(a)		Perl_Gv_AMupdate(aTHX_ a)
+#define gv_handler(a,b)		Perl_gv_handler(aTHX_ a,b)
+#ifdef PERL_CORE
+#define append_elem(a,b,c)	Perl_append_elem(aTHX_ a,b,c)
+#define append_list(a,b,c)	Perl_append_list(aTHX_ a,b,c)
+#define apply(a,b,c)		Perl_apply(aTHX_ a,b,c)
+#endif
+#define apply_attrs_string(a,b,c,d)	Perl_apply_attrs_string(aTHX_ a,b,c,d)
+#define avhv_delete_ent(a,b,c,d)	Perl_avhv_delete_ent(aTHX_ a,b,c,d)
+#define avhv_exists_ent(a,b,c)	Perl_avhv_exists_ent(aTHX_ a,b,c)
+#define avhv_fetch_ent(a,b,c,d)	Perl_avhv_fetch_ent(aTHX_ a,b,c,d)
+#define avhv_store_ent(a,b,c,d)	Perl_avhv_store_ent(aTHX_ a,b,c,d)
+#define avhv_iternext(a)	Perl_avhv_iternext(aTHX_ a)
+#define avhv_iterval(a,b)	Perl_avhv_iterval(aTHX_ a,b)
+#define avhv_keys(a)		Perl_avhv_keys(aTHX_ a)
+#define av_clear(a)		Perl_av_clear(aTHX_ a)
+#define av_delete(a,b,c)	Perl_av_delete(aTHX_ a,b,c)
+#define av_exists(a,b)		Perl_av_exists(aTHX_ a,b)
+#define av_extend(a,b)		Perl_av_extend(aTHX_ a,b)
+#ifdef PERL_CORE
+#define av_fake(a,b)		Perl_av_fake(aTHX_ a,b)
+#endif
+#define av_fetch(a,b,c)		Perl_av_fetch(aTHX_ a,b,c)
+#define av_fill(a,b)		Perl_av_fill(aTHX_ a,b)
+#define av_len(a)		Perl_av_len(aTHX_ a)
+#define av_make(a,b)		Perl_av_make(aTHX_ a,b)
+#define av_pop(a)		Perl_av_pop(aTHX_ a)
+#define av_push(a,b)		Perl_av_push(aTHX_ a,b)
+#ifdef PERL_CORE
+#define av_reify(a)		Perl_av_reify(aTHX_ a)
+#endif
+#define av_shift(a)		Perl_av_shift(aTHX_ a)
+#define av_store(a,b,c)		Perl_av_store(aTHX_ a,b,c)
+#define av_undef(a)		Perl_av_undef(aTHX_ a)
+#define av_unshift(a,b)		Perl_av_unshift(aTHX_ a,b)
+#ifdef PERL_CORE
+#define bind_match(a,b,c)	Perl_bind_match(aTHX_ a,b,c)
+#define block_end(a,b)		Perl_block_end(aTHX_ a,b)
+#endif
+#define block_gimme()		Perl_block_gimme(aTHX)
+#ifdef PERL_CORE
+#define block_start(a)		Perl_block_start(aTHX_ a)
+#define boot_core_UNIVERSAL()	Perl_boot_core_UNIVERSAL(aTHX)
+#define boot_core_PerlIO()	Perl_boot_core_PerlIO(aTHX)
+#endif
+#define call_list(a,b)		Perl_call_list(aTHX_ a,b)
+#ifdef PERL_CORE
+#define cando(a,b,c)		Perl_cando(aTHX_ a,b,c)
+#endif
+#define cast_ulong(a)		Perl_cast_ulong(aTHX_ a)
+#define cast_i32(a)		Perl_cast_i32(aTHX_ a)
+#define cast_iv(a)		Perl_cast_iv(aTHX_ a)
+#define cast_uv(a)		Perl_cast_uv(aTHX_ a)
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+#define my_chsize(a,b)		Perl_my_chsize(aTHX_ a,b)
+#endif
+#if defined(USE_5005THREADS)
+#define condpair_magic(a)	Perl_condpair_magic(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define convert(a,b,c)		Perl_convert(aTHX_ a,b,c)
+#endif
+#define vcroak(a,b)		Perl_vcroak(aTHX_ a,b)
+#if defined(PERL_IMPLICIT_CONTEXT)
+#endif
+#ifdef PERL_CORE
+#define cv_ckproto(a,b,c)	Perl_cv_ckproto(aTHX_ a,b,c)
+#define cv_clone(a)		Perl_cv_clone(aTHX_ a)
+#endif
+#define cv_const_sv(a)		Perl_cv_const_sv(aTHX_ a)
+#ifdef PERL_CORE
+#define op_const_sv(a,b)	Perl_op_const_sv(aTHX_ a,b)
+#endif
+#define cv_undef(a)		Perl_cv_undef(aTHX_ a)
+#define cx_dump(a)		Perl_cx_dump(aTHX_ a)
+#define filter_add(a,b)		Perl_filter_add(aTHX_ a,b)
+#define filter_del(a)		Perl_filter_del(aTHX_ a)
+#define filter_read(a,b,c)	Perl_filter_read(aTHX_ a,b,c)
+#define get_op_descs()		Perl_get_op_descs(aTHX)
+#define get_op_names()		Perl_get_op_names(aTHX)
+#ifdef PERL_CORE
+#define get_no_modify()		Perl_get_no_modify(aTHX)
+#define get_opargs()		Perl_get_opargs(aTHX)
+#endif
+#define get_ppaddr()		Perl_get_ppaddr(aTHX)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define cxinc()			Perl_cxinc(aTHX)
+#endif
+#define vdeb(a,b)		Perl_vdeb(aTHX_ a,b)
+#define debprofdump()		Perl_debprofdump(aTHX)
+#define debop(a)		Perl_debop(aTHX_ a)
+#define debstack()		Perl_debstack(aTHX)
+#define debstackptrs()		Perl_debstackptrs(aTHX)
+#define delimcpy(a,b,c,d,e,f)	Perl_delimcpy(aTHX_ a,b,c,d,e,f)
+#ifdef PERL_CORE
+#define deprecate(a)		Perl_deprecate(aTHX_ a)
+#define deprecate_old(a)	Perl_deprecate_old(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define vdie(a,b)		Perl_vdie(aTHX_ a,b)
+#define die_where(a,b)		Perl_die_where(aTHX_ a,b)
+#endif
+#define dounwind(a)		Perl_dounwind(aTHX_ a)
+#ifdef PERL_CORE
+#define do_aexec(a,b,c)		Perl_do_aexec(aTHX_ a,b,c)
+#define do_aexec5(a,b,c,d,e)	Perl_do_aexec5(aTHX_ a,b,c,d,e)
+#endif
+#define do_binmode(a,b,c)	Perl_do_binmode(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define do_chop(a,b)		Perl_do_chop(aTHX_ a,b)
+#endif
+#define do_close(a,b)		Perl_do_close(aTHX_ a,b)
+#ifdef PERL_CORE
+#define do_eof(a)		Perl_do_eof(aTHX_ a)
+#define do_exec(a)		Perl_do_exec(aTHX_ a)
+#endif
+#if defined(WIN32)
+#define do_aspawn(a,b,c)	Perl_do_aspawn(aTHX_ a,b,c)
+#define do_spawn(a)		Perl_do_spawn(aTHX_ a)
+#define do_spawn_nowait(a)	Perl_do_spawn_nowait(aTHX_ a)
+#endif
+#if !defined(WIN32)
+#ifdef PERL_CORE
+#define do_exec3(a,b,c)		Perl_do_exec3(aTHX_ a,b,c)
+#endif
+#endif
+#ifdef PERL_CORE
+#define do_execfree()		Perl_do_execfree(aTHX)
+#endif
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+#ifdef PERL_CORE
+#define do_ipcctl(a,b,c)	Perl_do_ipcctl(aTHX_ a,b,c)
+#define do_ipcget(a,b,c)	Perl_do_ipcget(aTHX_ a,b,c)
+#define do_msgrcv(a,b)		Perl_do_msgrcv(aTHX_ a,b)
+#define do_msgsnd(a,b)		Perl_do_msgsnd(aTHX_ a,b)
+#define do_semop(a,b)		Perl_do_semop(aTHX_ a,b)
+#define do_shmio(a,b,c)		Perl_do_shmio(aTHX_ a,b,c)
+#endif
+#endif
+#define do_join(a,b,c,d)	Perl_do_join(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define do_kv()			Perl_do_kv(aTHX)
+#endif
+#define do_open(a,b,c,d,e,f,g)	Perl_do_open(aTHX_ a,b,c,d,e,f,g)
+#define do_open9(a,b,c,d,e,f,g,h,i)	Perl_do_open9(aTHX_ a,b,c,d,e,f,g,h,i)
+#define do_openn(a,b,c,d,e,f,g,h,i)	Perl_do_openn(aTHX_ a,b,c,d,e,f,g,h,i)
+#ifdef PERL_CORE
+#define do_pipe(a,b,c)		Perl_do_pipe(aTHX_ a,b,c)
+#define do_print(a,b)		Perl_do_print(aTHX_ a,b)
+#define do_readline()		Perl_do_readline(aTHX)
+#define do_chomp(a)		Perl_do_chomp(aTHX_ a)
+#define do_seek(a,b,c)		Perl_do_seek(aTHX_ a,b,c)
+#endif
+#define do_sprintf(a,b,c)	Perl_do_sprintf(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define do_sysseek(a,b,c)	Perl_do_sysseek(aTHX_ a,b,c)
+#define do_tell(a)		Perl_do_tell(aTHX_ a)
+#define do_trans(a)		Perl_do_trans(aTHX_ a)
+#define do_vecget(a,b,c)	Perl_do_vecget(aTHX_ a,b,c)
+#define do_vecset(a)		Perl_do_vecset(aTHX_ a)
+#define do_vop(a,b,c,d)		Perl_do_vop(aTHX_ a,b,c,d)
+#define dofile(a)		Perl_dofile(aTHX_ a)
+#endif
+#define dowantarray()		Perl_dowantarray(aTHX)
+#define dump_all()		Perl_dump_all(aTHX)
+#define dump_eval()		Perl_dump_eval(aTHX)
+#if defined(DUMP_FDS)
+#define dump_fds(a)		Perl_dump_fds(aTHX_ a)
+#endif
+#define dump_form(a)		Perl_dump_form(aTHX_ a)
+#define gv_dump(a)		Perl_gv_dump(aTHX_ a)
+#define op_dump(a)		Perl_op_dump(aTHX_ a)
+#define pmop_dump(a)		Perl_pmop_dump(aTHX_ a)
+#define dump_packsubs(a)	Perl_dump_packsubs(aTHX_ a)
+#define dump_sub(a)		Perl_dump_sub(aTHX_ a)
+#define fbm_compile(a,b)	Perl_fbm_compile(aTHX_ a,b)
+#define fbm_instr(a,b,c,d)	Perl_fbm_instr(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define find_script(a,b,c,d)	Perl_find_script(aTHX_ a,b,c,d)
+#endif
+#if defined(USE_5005THREADS)
+#ifdef PERL_CORE
+#define find_threadsv(a)	Perl_find_threadsv(aTHX_ a)
+#endif
+#endif
+#ifdef PERL_CORE
+#define force_list(a)		Perl_force_list(aTHX_ a)
+#define fold_constants(a)	Perl_fold_constants(aTHX_ a)
+#endif
+#define vform(a,b)		Perl_vform(aTHX_ a,b)
+#define free_tmps()		Perl_free_tmps(aTHX)
+#ifdef PERL_CORE
+#define gen_constant_list(a)	Perl_gen_constant_list(aTHX_ a)
+#endif
+#if !defined(HAS_GETENV_LEN)
+#ifdef PERL_CORE
+#define getenv_len(a,b)		Perl_getenv_len(aTHX_ a,b)
+#endif
+#endif
+#define gp_free(a)		Perl_gp_free(aTHX_ a)
+#define gp_ref(a)		Perl_gp_ref(aTHX_ a)
+#define gv_AVadd(a)		Perl_gv_AVadd(aTHX_ a)
+#define gv_HVadd(a)		Perl_gv_HVadd(aTHX_ a)
+#define gv_IOadd(a)		Perl_gv_IOadd(aTHX_ a)
+#define gv_autoload4(a,b,c,d)	Perl_gv_autoload4(aTHX_ a,b,c,d)
+#define gv_check(a)		Perl_gv_check(aTHX_ a)
+#define gv_efullname(a,b)	Perl_gv_efullname(aTHX_ a,b)
+#define gv_efullname4(a,b,c,d)	Perl_gv_efullname4(aTHX_ a,b,c,d)
+#define gv_fetchfile(a)		Perl_gv_fetchfile(aTHX_ a)
+#define gv_fetchmeth(a,b,c,d)	Perl_gv_fetchmeth(aTHX_ a,b,c,d)
+#define gv_fetchmeth_autoload(a,b,c,d)	Perl_gv_fetchmeth_autoload(aTHX_ a,b,c,d)
+#define gv_fetchmethod(a,b)	Perl_gv_fetchmethod(aTHX_ a,b)
+#define gv_fetchmethod_autoload(a,b,c)	Perl_gv_fetchmethod_autoload(aTHX_ a,b,c)
+#define gv_fetchpv(a,b,c)	Perl_gv_fetchpv(aTHX_ a,b,c)
+#define gv_fullname(a,b)	Perl_gv_fullname(aTHX_ a,b)
+#define gv_fullname4(a,b,c,d)	Perl_gv_fullname4(aTHX_ a,b,c,d)
+#define gv_init(a,b,c,d,e)	Perl_gv_init(aTHX_ a,b,c,d,e)
+#define gv_stashpv(a,b)		Perl_gv_stashpv(aTHX_ a,b)
+#define gv_stashpvn(a,b,c)	Perl_gv_stashpvn(aTHX_ a,b,c)
+#define gv_stashsv(a,b)		Perl_gv_stashsv(aTHX_ a,b)
+#define hv_clear(a)		Perl_hv_clear(aTHX_ a)
+#define hv_delayfree_ent(a,b)	Perl_hv_delayfree_ent(aTHX_ a,b)
+#define hv_delete(a,b,c,d)	Perl_hv_delete(aTHX_ a,b,c,d)
+#define hv_delete_ent(a,b,c,d)	Perl_hv_delete_ent(aTHX_ a,b,c,d)
+#define hv_exists(a,b,c)	Perl_hv_exists(aTHX_ a,b,c)
+#define hv_exists_ent(a,b,c)	Perl_hv_exists_ent(aTHX_ a,b,c)
+#define hv_fetch(a,b,c,d)	Perl_hv_fetch(aTHX_ a,b,c,d)
+#define hv_fetch_ent(a,b,c,d)	Perl_hv_fetch_ent(aTHX_ a,b,c,d)
+#define hv_free_ent(a,b)	Perl_hv_free_ent(aTHX_ a,b)
+#define hv_iterinit(a)		Perl_hv_iterinit(aTHX_ a)
+#define hv_iterkey(a,b)		Perl_hv_iterkey(aTHX_ a,b)
+#define hv_iterkeysv(a)		Perl_hv_iterkeysv(aTHX_ a)
+#define hv_iternext(a)		Perl_hv_iternext(aTHX_ a)
+#define hv_iternextsv(a,b,c)	Perl_hv_iternextsv(aTHX_ a,b,c)
+#define hv_iternext_flags(a,b)	Perl_hv_iternext_flags(aTHX_ a,b)
+#define hv_iterval(a,b)		Perl_hv_iterval(aTHX_ a,b)
+#define hv_ksplit(a,b)		Perl_hv_ksplit(aTHX_ a,b)
+#define hv_magic(a,b,c)		Perl_hv_magic(aTHX_ a,b,c)
+#define hv_store(a,b,c,d,e)	Perl_hv_store(aTHX_ a,b,c,d,e)
+#define hv_store_ent(a,b,c,d)	Perl_hv_store_ent(aTHX_ a,b,c,d)
+#define hv_store_flags(a,b,c,d,e,f)	Perl_hv_store_flags(aTHX_ a,b,c,d,e,f)
+#define hv_undef(a)		Perl_hv_undef(aTHX_ a)
+#define ibcmp(a,b,c)		Perl_ibcmp(aTHX_ a,b,c)
+#define ibcmp_locale(a,b,c)	Perl_ibcmp_locale(aTHX_ a,b,c)
+#define ibcmp_utf8(a,b,c,d,e,f,g,h)	Perl_ibcmp_utf8(aTHX_ a,b,c,d,e,f,g,h)
+#ifdef PERL_CORE
+#define ingroup(a,b)		Perl_ingroup(aTHX_ a,b)
+#define init_argv_symbols(a,b)	Perl_init_argv_symbols(aTHX_ a,b)
+#define init_debugger()		Perl_init_debugger(aTHX)
+#endif
+#define init_stacks()		Perl_init_stacks(aTHX)
+#define init_tm(a)		Perl_init_tm(aTHX_ a)
+#ifdef PERL_CORE
+#define intro_my()		Perl_intro_my(aTHX)
+#endif
+#define instr(a,b)		Perl_instr(aTHX_ a,b)
+#ifdef PERL_CORE
+#define io_close(a,b)		Perl_io_close(aTHX_ a,b)
+#define invert(a)		Perl_invert(aTHX_ a)
+#define is_gv_magical(a,b,c)	Perl_is_gv_magical(aTHX_ a,b,c)
+#endif
+#define is_lvalue_sub()		Perl_is_lvalue_sub(aTHX)
+#define to_uni_upper_lc(a)	Perl_to_uni_upper_lc(aTHX_ a)
+#define to_uni_title_lc(a)	Perl_to_uni_title_lc(aTHX_ a)
+#define to_uni_lower_lc(a)	Perl_to_uni_lower_lc(aTHX_ a)
+#define is_uni_alnum(a)		Perl_is_uni_alnum(aTHX_ a)
+#define is_uni_alnumc(a)	Perl_is_uni_alnumc(aTHX_ a)
+#define is_uni_idfirst(a)	Perl_is_uni_idfirst(aTHX_ a)
+#define is_uni_alpha(a)		Perl_is_uni_alpha(aTHX_ a)
+#define is_uni_ascii(a)		Perl_is_uni_ascii(aTHX_ a)
+#define is_uni_space(a)		Perl_is_uni_space(aTHX_ a)
+#define is_uni_cntrl(a)		Perl_is_uni_cntrl(aTHX_ a)
+#define is_uni_graph(a)		Perl_is_uni_graph(aTHX_ a)
+#define is_uni_digit(a)		Perl_is_uni_digit(aTHX_ a)
+#define is_uni_upper(a)		Perl_is_uni_upper(aTHX_ a)
+#define is_uni_lower(a)		Perl_is_uni_lower(aTHX_ a)
+#define is_uni_print(a)		Perl_is_uni_print(aTHX_ a)
+#define is_uni_punct(a)		Perl_is_uni_punct(aTHX_ a)
+#define is_uni_xdigit(a)	Perl_is_uni_xdigit(aTHX_ a)
+#define to_uni_upper(a,b,c)	Perl_to_uni_upper(aTHX_ a,b,c)
+#define to_uni_title(a,b,c)	Perl_to_uni_title(aTHX_ a,b,c)
+#define to_uni_lower(a,b,c)	Perl_to_uni_lower(aTHX_ a,b,c)
+#define to_uni_fold(a,b,c)	Perl_to_uni_fold(aTHX_ a,b,c)
+#define is_uni_alnum_lc(a)	Perl_is_uni_alnum_lc(aTHX_ a)
+#define is_uni_alnumc_lc(a)	Perl_is_uni_alnumc_lc(aTHX_ a)
+#define is_uni_idfirst_lc(a)	Perl_is_uni_idfirst_lc(aTHX_ a)
+#define is_uni_alpha_lc(a)	Perl_is_uni_alpha_lc(aTHX_ a)
+#define is_uni_ascii_lc(a)	Perl_is_uni_ascii_lc(aTHX_ a)
+#define is_uni_space_lc(a)	Perl_is_uni_space_lc(aTHX_ a)
+#define is_uni_cntrl_lc(a)	Perl_is_uni_cntrl_lc(aTHX_ a)
+#define is_uni_graph_lc(a)	Perl_is_uni_graph_lc(aTHX_ a)
+#define is_uni_digit_lc(a)	Perl_is_uni_digit_lc(aTHX_ a)
+#define is_uni_upper_lc(a)	Perl_is_uni_upper_lc(aTHX_ a)
+#define is_uni_lower_lc(a)	Perl_is_uni_lower_lc(aTHX_ a)
+#define is_uni_print_lc(a)	Perl_is_uni_print_lc(aTHX_ a)
+#define is_uni_punct_lc(a)	Perl_is_uni_punct_lc(aTHX_ a)
+#define is_uni_xdigit_lc(a)	Perl_is_uni_xdigit_lc(aTHX_ a)
+#define is_utf8_char(a)		Perl_is_utf8_char(aTHX_ a)
+#define is_utf8_string_loc(a,b,c)	Perl_is_utf8_string_loc(aTHX_ a,b,c)
+#define is_utf8_string(a,b)	Perl_is_utf8_string(aTHX_ a,b)
+#define is_utf8_alnum(a)	Perl_is_utf8_alnum(aTHX_ a)
+#define is_utf8_alnumc(a)	Perl_is_utf8_alnumc(aTHX_ a)
+#define is_utf8_idfirst(a)	Perl_is_utf8_idfirst(aTHX_ a)
+#define is_utf8_idcont(a)	Perl_is_utf8_idcont(aTHX_ a)
+#define is_utf8_alpha(a)	Perl_is_utf8_alpha(aTHX_ a)
+#define is_utf8_ascii(a)	Perl_is_utf8_ascii(aTHX_ a)
+#define is_utf8_space(a)	Perl_is_utf8_space(aTHX_ a)
+#define is_utf8_cntrl(a)	Perl_is_utf8_cntrl(aTHX_ a)
+#define is_utf8_digit(a)	Perl_is_utf8_digit(aTHX_ a)
+#define is_utf8_graph(a)	Perl_is_utf8_graph(aTHX_ a)
+#define is_utf8_upper(a)	Perl_is_utf8_upper(aTHX_ a)
+#define is_utf8_lower(a)	Perl_is_utf8_lower(aTHX_ a)
+#define is_utf8_print(a)	Perl_is_utf8_print(aTHX_ a)
+#define is_utf8_punct(a)	Perl_is_utf8_punct(aTHX_ a)
+#define is_utf8_xdigit(a)	Perl_is_utf8_xdigit(aTHX_ a)
+#define is_utf8_mark(a)		Perl_is_utf8_mark(aTHX_ a)
+#ifdef PERL_CORE
+#define jmaybe(a)		Perl_jmaybe(aTHX_ a)
+#define keyword(a,b)		Perl_keyword(aTHX_ a,b)
+#endif
+#define leave_scope(a)		Perl_leave_scope(aTHX_ a)
+#ifdef PERL_CORE
+#define lex_end()		Perl_lex_end(aTHX)
+#define lex_start(a)		Perl_lex_start(aTHX_ a)
+#endif
+#define op_null(a)		Perl_op_null(aTHX_ a)
+#ifdef PERL_CORE
+#define op_clear(a)		Perl_op_clear(aTHX_ a)
+#define linklist(a)		Perl_linklist(aTHX_ a)
+#define list(a)			Perl_list(aTHX_ a)
+#define listkids(a)		Perl_listkids(aTHX_ a)
+#endif
+#define vload_module(a,b,c,d)	Perl_vload_module(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define localize(a,b)		Perl_localize(aTHX_ a,b)
+#endif
+#define looks_like_number(a)	Perl_looks_like_number(aTHX_ a)
+#define grok_bin(a,b,c,d)	Perl_grok_bin(aTHX_ a,b,c,d)
+#define grok_hex(a,b,c,d)	Perl_grok_hex(aTHX_ a,b,c,d)
+#define grok_number(a,b,c)	Perl_grok_number(aTHX_ a,b,c)
+#define grok_numeric_radix(a,b)	Perl_grok_numeric_radix(aTHX_ a,b)
+#define grok_oct(a,b,c,d)	Perl_grok_oct(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define magic_clearenv(a,b)	Perl_magic_clearenv(aTHX_ a,b)
+#define magic_clear_all_env(a,b)	Perl_magic_clear_all_env(aTHX_ a,b)
+#define magic_clearpack(a,b)	Perl_magic_clearpack(aTHX_ a,b)
+#define magic_clearsig(a,b)	Perl_magic_clearsig(aTHX_ a,b)
+#define magic_existspack(a,b)	Perl_magic_existspack(aTHX_ a,b)
+#define magic_freeregexp(a,b)	Perl_magic_freeregexp(aTHX_ a,b)
+#define magic_freeovrld(a,b)	Perl_magic_freeovrld(aTHX_ a,b)
+#define magic_get(a,b)		Perl_magic_get(aTHX_ a,b)
+#define magic_getarylen(a,b)	Perl_magic_getarylen(aTHX_ a,b)
+#define magic_getdefelem(a,b)	Perl_magic_getdefelem(aTHX_ a,b)
+#define magic_getglob(a,b)	Perl_magic_getglob(aTHX_ a,b)
+#define magic_getnkeys(a,b)	Perl_magic_getnkeys(aTHX_ a,b)
+#define magic_getpack(a,b)	Perl_magic_getpack(aTHX_ a,b)
+#define magic_getpos(a,b)	Perl_magic_getpos(aTHX_ a,b)
+#define magic_getsig(a,b)	Perl_magic_getsig(aTHX_ a,b)
+#define magic_getsubstr(a,b)	Perl_magic_getsubstr(aTHX_ a,b)
+#define magic_gettaint(a,b)	Perl_magic_gettaint(aTHX_ a,b)
+#define magic_getuvar(a,b)	Perl_magic_getuvar(aTHX_ a,b)
+#define magic_getvec(a,b)	Perl_magic_getvec(aTHX_ a,b)
+#define magic_len(a,b)		Perl_magic_len(aTHX_ a,b)
+#endif
+#if defined(USE_5005THREADS)
+#ifdef PERL_CORE
+#define magic_mutexfree(a,b)	Perl_magic_mutexfree(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define magic_nextpack(a,b,c)	Perl_magic_nextpack(aTHX_ a,b,c)
+#define magic_regdata_cnt(a,b)	Perl_magic_regdata_cnt(aTHX_ a,b)
+#define magic_regdatum_get(a,b)	Perl_magic_regdatum_get(aTHX_ a,b)
+#define magic_regdatum_set(a,b)	Perl_magic_regdatum_set(aTHX_ a,b)
+#define magic_set(a,b)		Perl_magic_set(aTHX_ a,b)
+#define magic_setamagic(a,b)	Perl_magic_setamagic(aTHX_ a,b)
+#define magic_setarylen(a,b)	Perl_magic_setarylen(aTHX_ a,b)
+#define magic_setbm(a,b)	Perl_magic_setbm(aTHX_ a,b)
+#define magic_setdbline(a,b)	Perl_magic_setdbline(aTHX_ a,b)
+#endif
+#if defined(USE_LOCALE_COLLATE)
+#ifdef PERL_CORE
+#define magic_setcollxfrm(a,b)	Perl_magic_setcollxfrm(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define magic_setdefelem(a,b)	Perl_magic_setdefelem(aTHX_ a,b)
+#define magic_setenv(a,b)	Perl_magic_setenv(aTHX_ a,b)
+#define magic_setfm(a,b)	Perl_magic_setfm(aTHX_ a,b)
+#define magic_setisa(a,b)	Perl_magic_setisa(aTHX_ a,b)
+#define magic_setglob(a,b)	Perl_magic_setglob(aTHX_ a,b)
+#define magic_setmglob(a,b)	Perl_magic_setmglob(aTHX_ a,b)
+#define magic_setnkeys(a,b)	Perl_magic_setnkeys(aTHX_ a,b)
+#define magic_setpack(a,b)	Perl_magic_setpack(aTHX_ a,b)
+#define magic_setpos(a,b)	Perl_magic_setpos(aTHX_ a,b)
+#define magic_setregexp(a,b)	Perl_magic_setregexp(aTHX_ a,b)
+#define magic_setsig(a,b)	Perl_magic_setsig(aTHX_ a,b)
+#define magic_setsubstr(a,b)	Perl_magic_setsubstr(aTHX_ a,b)
+#define magic_settaint(a,b)	Perl_magic_settaint(aTHX_ a,b)
+#define magic_setuvar(a,b)	Perl_magic_setuvar(aTHX_ a,b)
+#define magic_setvec(a,b)	Perl_magic_setvec(aTHX_ a,b)
+#define magic_setutf8(a,b)	Perl_magic_setutf8(aTHX_ a,b)
+#define magic_set_all_env(a,b)	Perl_magic_set_all_env(aTHX_ a,b)
+#define magic_sizepack(a,b)	Perl_magic_sizepack(aTHX_ a,b)
+#define magic_wipepack(a,b)	Perl_magic_wipepack(aTHX_ a,b)
+#define magicname(a,b,c)	Perl_magicname(aTHX_ a,b,c)
+#endif
+#define markstack_grow()	Perl_markstack_grow(aTHX)
+#if defined(USE_LOCALE_COLLATE)
+#ifdef PERL_CORE
+#define mem_collxfrm(a,b,c)	Perl_mem_collxfrm(aTHX_ a,b,c)
+#endif
+#endif
+#define vmess(a,b)		Perl_vmess(aTHX_ a,b)
+#ifdef PERL_CORE
+#define qerror(a)		Perl_qerror(aTHX_ a)
+#endif
+#define sortsv(a,b,c)		Perl_sortsv(aTHX_ a,b,c)
+#define mg_clear(a)		Perl_mg_clear(aTHX_ a)
+#define mg_copy(a,b,c,d)	Perl_mg_copy(aTHX_ a,b,c,d)
+#define mg_find(a,b)		Perl_mg_find(aTHX_ a,b)
+#define mg_free(a)		Perl_mg_free(aTHX_ a)
+#define mg_get(a)		Perl_mg_get(aTHX_ a)
+#define mg_length(a)		Perl_mg_length(aTHX_ a)
+#define mg_magical(a)		Perl_mg_magical(aTHX_ a)
+#define mg_set(a)		Perl_mg_set(aTHX_ a)
+#define mg_size(a)		Perl_mg_size(aTHX_ a)
+#define mini_mktime(a)		Perl_mini_mktime(aTHX_ a)
+#ifdef PERL_CORE
+#define mod(a,b)		Perl_mod(aTHX_ a,b)
+#define mode_from_discipline(a)	Perl_mode_from_discipline(aTHX_ a)
+#endif
+#define moreswitches(a)		Perl_moreswitches(aTHX_ a)
+#ifdef PERL_CORE
+#define my(a)			Perl_my(aTHX_ a)
+#endif
+#define my_atof(a)		Perl_my_atof(aTHX_ a)
+#if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
+#define my_bcopy		Perl_my_bcopy
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+#define my_bzero		Perl_my_bzero
+#endif
+#define my_exit(a)		Perl_my_exit(aTHX_ a)
+#define my_failure_exit()	Perl_my_failure_exit(aTHX)
+#define my_fflush_all()		Perl_my_fflush_all(aTHX)
+#define my_fork			Perl_my_fork
+#define atfork_lock		Perl_atfork_lock
+#define atfork_unlock		Perl_atfork_unlock
+#define my_lstat()		Perl_my_lstat(aTHX)
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+#define my_memcmp		Perl_my_memcmp
+#endif
+#if !defined(HAS_MEMSET)
+#define my_memset		Perl_my_memset
+#endif
+#define my_pclose(a)		Perl_my_pclose(aTHX_ a)
+#define my_popen(a,b)		Perl_my_popen(aTHX_ a,b)
+#define my_popen_list(a,b,c)	Perl_my_popen_list(aTHX_ a,b,c)
+#define my_setenv(a,b)		Perl_my_setenv(aTHX_ a,b)
+#define my_stat()		Perl_my_stat(aTHX)
+#define my_strftime(a,b,c,d,e,f,g,h,i,j)	Perl_my_strftime(aTHX_ a,b,c,d,e,f,g,h,i,j)
+#if defined(MYSWAP)
+#define my_swap(a)		Perl_my_swap(aTHX_ a)
+#define my_htonl(a)		Perl_my_htonl(aTHX_ a)
+#define my_ntohl(a)		Perl_my_ntohl(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define my_unexec()		Perl_my_unexec(aTHX)
+#endif
+#define newANONLIST(a)		Perl_newANONLIST(aTHX_ a)
+#define newANONHASH(a)		Perl_newANONHASH(aTHX_ a)
+#define newANONSUB(a,b,c)	Perl_newANONSUB(aTHX_ a,b,c)
+#define newASSIGNOP(a,b,c,d)	Perl_newASSIGNOP(aTHX_ a,b,c,d)
+#define newCONDOP(a,b,c,d)	Perl_newCONDOP(aTHX_ a,b,c,d)
+#define newCONSTSUB(a,b,c)	Perl_newCONSTSUB(aTHX_ a,b,c)
+#define newFORM(a,b,c)		Perl_newFORM(aTHX_ a,b,c)
+#define newFOROP(a,b,c,d,e,f,g)	Perl_newFOROP(aTHX_ a,b,c,d,e,f,g)
+#define newLOGOP(a,b,c,d)	Perl_newLOGOP(aTHX_ a,b,c,d)
+#define newLOOPEX(a,b)		Perl_newLOOPEX(aTHX_ a,b)
+#define newLOOPOP(a,b,c,d)	Perl_newLOOPOP(aTHX_ a,b,c,d)
+#define newNULLLIST()		Perl_newNULLLIST(aTHX)
+#define newOP(a,b)		Perl_newOP(aTHX_ a,b)
+#define newPROG(a)		Perl_newPROG(aTHX_ a)
+#define newRANGE(a,b,c)		Perl_newRANGE(aTHX_ a,b,c)
+#define newSLICEOP(a,b,c)	Perl_newSLICEOP(aTHX_ a,b,c)
+#define newSTATEOP(a,b,c)	Perl_newSTATEOP(aTHX_ a,b,c)
+#define newSUB(a,b,c,d)		Perl_newSUB(aTHX_ a,b,c,d)
+#define newXS(a,b,c)		Perl_newXS(aTHX_ a,b,c)
+#define newAV()			Perl_newAV(aTHX)
+#define newAVREF(a)		Perl_newAVREF(aTHX_ a)
+#define newBINOP(a,b,c,d)	Perl_newBINOP(aTHX_ a,b,c,d)
+#define newCVREF(a,b)		Perl_newCVREF(aTHX_ a,b)
+#define newGVOP(a,b,c)		Perl_newGVOP(aTHX_ a,b,c)
+#define newGVgen(a)		Perl_newGVgen(aTHX_ a)
+#define newGVREF(a,b)		Perl_newGVREF(aTHX_ a,b)
+#define newHVREF(a)		Perl_newHVREF(aTHX_ a)
+#define newHV()			Perl_newHV(aTHX)
+#define newHVhv(a)		Perl_newHVhv(aTHX_ a)
+#define newIO()			Perl_newIO(aTHX)
+#define newLISTOP(a,b,c,d)	Perl_newLISTOP(aTHX_ a,b,c,d)
+#define newPADOP(a,b,c)		Perl_newPADOP(aTHX_ a,b,c)
+#define newPMOP(a,b)		Perl_newPMOP(aTHX_ a,b)
+#define newPVOP(a,b,c)		Perl_newPVOP(aTHX_ a,b,c)
+#define newRV(a)		Perl_newRV(aTHX_ a)
+#define newRV_noinc(a)		Perl_newRV_noinc(aTHX_ a)
+#define newSV(a)		Perl_newSV(aTHX_ a)
+#define newSVREF(a)		Perl_newSVREF(aTHX_ a)
+#define newSVOP(a,b,c)		Perl_newSVOP(aTHX_ a,b,c)
+#define newSViv(a)		Perl_newSViv(aTHX_ a)
+#define newSVuv(a)		Perl_newSVuv(aTHX_ a)
+#define newSVnv(a)		Perl_newSVnv(aTHX_ a)
+#define newSVpv(a,b)		Perl_newSVpv(aTHX_ a,b)
+#define newSVpvn(a,b)		Perl_newSVpvn(aTHX_ a,b)
+#define newSVpvn_share(a,b,c)	Perl_newSVpvn_share(aTHX_ a,b,c)
+#define vnewSVpvf(a,b)		Perl_vnewSVpvf(aTHX_ a,b)
+#define newSVrv(a,b)		Perl_newSVrv(aTHX_ a,b)
+#define newSVsv(a)		Perl_newSVsv(aTHX_ a)
+#define newUNOP(a,b,c)		Perl_newUNOP(aTHX_ a,b,c)
+#define newWHILEOP(a,b,c,d,e,f,g)	Perl_newWHILEOP(aTHX_ a,b,c,d,e,f,g)
+#define new_stackinfo(a,b)	Perl_new_stackinfo(aTHX_ a,b)
+#define scan_vstring(a,b)	Perl_scan_vstring(aTHX_ a,b)
+#ifdef PERL_CORE
+#define nextargv(a)		Perl_nextargv(aTHX_ a)
+#endif
+#define ninstr(a,b,c,d)		Perl_ninstr(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define oopsCV(a)		Perl_oopsCV(aTHX_ a)
+#endif
+#define op_free(a)		Perl_op_free(aTHX_ a)
+#ifdef PERL_CORE
+#define package(a)		Perl_package(aTHX_ a)
+#define pad_alloc(a,b)		Perl_pad_alloc(aTHX_ a,b)
+#define allocmy(a)		Perl_allocmy(aTHX_ a)
+#define pad_findmy(a)		Perl_pad_findmy(aTHX_ a)
+#define oopsAV(a)		Perl_oopsAV(aTHX_ a)
+#define oopsHV(a)		Perl_oopsHV(aTHX_ a)
+#define pad_leavemy()		Perl_pad_leavemy(aTHX)
+#endif
+#define pad_sv(a)		Perl_pad_sv(aTHX_ a)
+#ifdef PERL_CORE
+#define pad_free(a)		Perl_pad_free(aTHX_ a)
+#define pad_reset()		Perl_pad_reset(aTHX)
+#define pad_swipe(a,b)		Perl_pad_swipe(aTHX_ a,b)
+#define peep(a)			Perl_peep(aTHX_ a)
+#endif
+#if defined(USE_5005THREADS)
+#define new_struct_thread(a)	Perl_new_struct_thread(aTHX_ a)
+#endif
+#if defined(USE_REENTRANT_API)
+#define reentrant_size()	Perl_reentrant_size(aTHX)
+#define reentrant_init()	Perl_reentrant_init(aTHX)
+#define reentrant_free()	Perl_reentrant_free(aTHX)
+#endif
+#define call_atexit(a,b)	Perl_call_atexit(aTHX_ a,b)
+#define call_argv(a,b,c)	Perl_call_argv(aTHX_ a,b,c)
+#define call_method(a,b)	Perl_call_method(aTHX_ a,b)
+#define call_pv(a,b)		Perl_call_pv(aTHX_ a,b)
+#define call_sv(a,b)		Perl_call_sv(aTHX_ a,b)
+#define despatch_signals()	Perl_despatch_signals(aTHX)
+#define eval_pv(a,b)		Perl_eval_pv(aTHX_ a,b)
+#define eval_sv(a,b)		Perl_eval_sv(aTHX_ a,b)
+#define get_sv(a,b)		Perl_get_sv(aTHX_ a,b)
+#define get_av(a,b)		Perl_get_av(aTHX_ a,b)
+#define get_hv(a,b)		Perl_get_hv(aTHX_ a,b)
+#define get_cv(a,b)		Perl_get_cv(aTHX_ a,b)
+#define init_i18nl10n(a)	Perl_init_i18nl10n(aTHX_ a)
+#define init_i18nl14n(a)	Perl_init_i18nl14n(aTHX_ a)
+#define new_collate(a)		Perl_new_collate(aTHX_ a)
+#define new_ctype(a)		Perl_new_ctype(aTHX_ a)
+#define new_numeric(a)		Perl_new_numeric(aTHX_ a)
+#define set_numeric_local()	Perl_set_numeric_local(aTHX)
+#define set_numeric_radix()	Perl_set_numeric_radix(aTHX)
+#define set_numeric_standard()	Perl_set_numeric_standard(aTHX)
+#define require_pv(a)		Perl_require_pv(aTHX_ a)
+#define pack_cat(a,b,c,d,e,f,g)	Perl_pack_cat(aTHX_ a,b,c,d,e,f,g)
+#define packlist(a,b,c,d,e)	Perl_packlist(aTHX_ a,b,c,d,e)
+#ifdef PERL_CORE
+#define pidgone(a,b)		Perl_pidgone(aTHX_ a,b)
+#endif
+#define pmflag(a,b)		Perl_pmflag(aTHX_ a,b)
+#ifdef PERL_CORE
+#define pmruntime(a,b,c)	Perl_pmruntime(aTHX_ a,b,c)
+#define pmtrans(a,b,c)		Perl_pmtrans(aTHX_ a,b,c)
+#define pop_return()		Perl_pop_return(aTHX)
+#endif
+#define pop_scope()		Perl_pop_scope(aTHX)
+#ifdef PERL_CORE
+#define prepend_elem(a,b,c)	Perl_prepend_elem(aTHX_ a,b,c)
+#define push_return(a)		Perl_push_return(aTHX_ a)
+#endif
+#define push_scope()		Perl_push_scope(aTHX)
+#ifdef PERL_CORE
+#define ref(a,b)		Perl_ref(aTHX_ a,b)
+#define refkids(a,b)		Perl_refkids(aTHX_ a,b)
+#endif
+#define regdump(a)		Perl_regdump(aTHX_ a)
+#define regclass_swash(a,b,c,d)	Perl_regclass_swash(aTHX_ a,b,c,d)
+#define pregexec(a,b,c,d,e,f,g)	Perl_pregexec(aTHX_ a,b,c,d,e,f,g)
+#define pregfree(a)		Perl_pregfree(aTHX_ a)
+#define pregcomp(a,b,c)		Perl_pregcomp(aTHX_ a,b,c)
+#define re_intuit_start(a,b,c,d,e,f)	Perl_re_intuit_start(aTHX_ a,b,c,d,e,f)
+#define re_intuit_string(a)	Perl_re_intuit_string(aTHX_ a)
+#define regexec_flags(a,b,c,d,e,f,g,h)	Perl_regexec_flags(aTHX_ a,b,c,d,e,f,g,h)
+#define regnext(a)		Perl_regnext(aTHX_ a)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regprop(a,b)		Perl_regprop(aTHX_ a,b)
+#endif
+#define repeatcpy(a,b,c,d)	Perl_repeatcpy(aTHX_ a,b,c,d)
+#define rninstr(a,b,c,d)	Perl_rninstr(aTHX_ a,b,c,d)
+#define rsignal(a,b)		Perl_rsignal(aTHX_ a,b)
+#ifdef PERL_CORE
+#define rsignal_restore(a,b)	Perl_rsignal_restore(aTHX_ a,b)
+#define rsignal_save(a,b,c)	Perl_rsignal_save(aTHX_ a,b,c)
+#endif
+#define rsignal_state(a)	Perl_rsignal_state(aTHX_ a)
+#ifdef PERL_CORE
+#define rxres_free(a)		Perl_rxres_free(aTHX_ a)
+#define rxres_restore(a,b)	Perl_rxres_restore(aTHX_ a,b)
+#define rxres_save(a,b)		Perl_rxres_save(aTHX_ a,b)
+#endif
+#if !defined(HAS_RENAME)
+#ifdef PERL_CORE
+#define same_dirent(a,b)	Perl_same_dirent(aTHX_ a,b)
+#endif
+#endif
+#define savepv(a)		Perl_savepv(aTHX_ a)
+#define savepvn(a,b)		Perl_savepvn(aTHX_ a,b)
+#define savesharedpv(a)		Perl_savesharedpv(aTHX_ a)
+#define savestack_grow()	Perl_savestack_grow(aTHX)
+#define savestack_grow_cnt(a)	Perl_savestack_grow_cnt(aTHX_ a)
+#define save_aelem(a,b,c)	Perl_save_aelem(aTHX_ a,b,c)
+#define save_alloc(a,b)		Perl_save_alloc(aTHX_ a,b)
+#define save_aptr(a)		Perl_save_aptr(aTHX_ a)
+#define save_ary(a)		Perl_save_ary(aTHX_ a)
+#define save_bool(a)		Perl_save_bool(aTHX_ a)
+#define save_clearsv(a)		Perl_save_clearsv(aTHX_ a)
+#define save_delete(a,b,c)	Perl_save_delete(aTHX_ a,b,c)
+#define save_destructor(a,b)	Perl_save_destructor(aTHX_ a,b)
+#define save_destructor_x(a,b)	Perl_save_destructor_x(aTHX_ a,b)
+#define save_freesv(a)		Perl_save_freesv(aTHX_ a)
+#ifdef PERL_CORE
+#define save_freeop(a)		Perl_save_freeop(aTHX_ a)
+#endif
+#define save_freepv(a)		Perl_save_freepv(aTHX_ a)
+#define save_generic_svref(a)	Perl_save_generic_svref(aTHX_ a)
+#define save_generic_pvref(a)	Perl_save_generic_pvref(aTHX_ a)
+#define save_shared_pvref(a)	Perl_save_shared_pvref(aTHX_ a)
+#define save_gp(a,b)		Perl_save_gp(aTHX_ a,b)
+#define save_hash(a)		Perl_save_hash(aTHX_ a)
+#define save_helem(a,b,c)	Perl_save_helem(aTHX_ a,b,c)
+#define save_hints()		Perl_save_hints(aTHX)
+#define save_hptr(a)		Perl_save_hptr(aTHX_ a)
+#define save_I16(a)		Perl_save_I16(aTHX_ a)
+#define save_I32(a)		Perl_save_I32(aTHX_ a)
+#define save_I8(a)		Perl_save_I8(aTHX_ a)
+#define save_int(a)		Perl_save_int(aTHX_ a)
+#define save_item(a)		Perl_save_item(aTHX_ a)
+#define save_iv(a)		Perl_save_iv(aTHX_ a)
+#define save_list(a,b)		Perl_save_list(aTHX_ a,b)
+#define save_long(a)		Perl_save_long(aTHX_ a)
+#define save_mortalizesv(a)	Perl_save_mortalizesv(aTHX_ a)
+#define save_nogv(a)		Perl_save_nogv(aTHX_ a)
+#ifdef PERL_CORE
+#define save_op()		Perl_save_op(aTHX)
+#endif
+#define save_scalar(a)		Perl_save_scalar(aTHX_ a)
+#define save_pptr(a)		Perl_save_pptr(aTHX_ a)
+#define save_vptr(a)		Perl_save_vptr(aTHX_ a)
+#define save_re_context()	Perl_save_re_context(aTHX)
+#define save_padsv(a)		Perl_save_padsv(aTHX_ a)
+#define save_sptr(a)		Perl_save_sptr(aTHX_ a)
+#define save_svref(a)		Perl_save_svref(aTHX_ a)
+#ifdef USE_5005THREADS
+#define save_threadsv(a)	Perl_save_threadsv(aTHX_ a)
+#else
+#define save_threadsv(a)	Perl_save_threadsv(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define sawparens(a)		Perl_sawparens(aTHX_ a)
+#define scalar(a)		Perl_scalar(aTHX_ a)
+#define scalarkids(a)		Perl_scalarkids(aTHX_ a)
+#define scalarseq(a)		Perl_scalarseq(aTHX_ a)
+#define scalarvoid(a)		Perl_scalarvoid(aTHX_ a)
+#endif
+#define scan_bin(a,b,c)		Perl_scan_bin(aTHX_ a,b,c)
+#define scan_hex(a,b,c)		Perl_scan_hex(aTHX_ a,b,c)
+#define scan_num(a,b)		Perl_scan_num(aTHX_ a,b)
+#define scan_oct(a,b,c)		Perl_scan_oct(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define scope(a)		Perl_scope(aTHX_ a)
+#endif
+#define screaminstr(a,b,c,d,e,f)	Perl_screaminstr(aTHX_ a,b,c,d,e,f)
+#if !defined(VMS)
+#ifdef PERL_CORE
+#define setenv_getix(a)		Perl_setenv_getix(aTHX_ a)
+#endif
+#endif
+#ifdef PERL_CORE
+#define setdefout(a)		Perl_setdefout(aTHX_ a)
+#endif
+#define share_hek(a,b,c)	Perl_share_hek(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define sighandler		Perl_sighandler
+#endif
+#define csighandler		Perl_csighandler
+#define stack_grow(a,b,c)	Perl_stack_grow(aTHX_ a,b,c)
+#define start_subparse(a,b)	Perl_start_subparse(aTHX_ a,b)
+#ifdef PERL_CORE
+#define sub_crush_depth(a)	Perl_sub_crush_depth(aTHX_ a)
+#endif
+#define sv_2bool(a)		Perl_sv_2bool(aTHX_ a)
+#define sv_2cv(a,b,c,d)		Perl_sv_2cv(aTHX_ a,b,c,d)
+#define sv_2io(a)		Perl_sv_2io(aTHX_ a)
+#define sv_2iv(a)		Perl_sv_2iv(aTHX_ a)
+#define sv_2mortal(a)		Perl_sv_2mortal(aTHX_ a)
+#define sv_2nv(a)		Perl_sv_2nv(aTHX_ a)
+#define sv_2pvutf8(a,b)		Perl_sv_2pvutf8(aTHX_ a,b)
+#define sv_2pvbyte(a,b)		Perl_sv_2pvbyte(aTHX_ a,b)
+#define sv_pvn_nomg(a,b)	Perl_sv_pvn_nomg(aTHX_ a,b)
+#define sv_2uv(a)		Perl_sv_2uv(aTHX_ a)
+#define sv_iv(a)		Perl_sv_iv(aTHX_ a)
+#define sv_uv(a)		Perl_sv_uv(aTHX_ a)
+#define sv_nv(a)		Perl_sv_nv(aTHX_ a)
+#define sv_pvn(a,b)		Perl_sv_pvn(aTHX_ a,b)
+#define sv_pvutf8n(a,b)		Perl_sv_pvutf8n(aTHX_ a,b)
+#define sv_pvbyten(a,b)		Perl_sv_pvbyten(aTHX_ a,b)
+#define sv_true(a)		Perl_sv_true(aTHX_ a)
+#ifdef PERL_CORE
+#define sv_add_arena(a,b,c)	Perl_sv_add_arena(aTHX_ a,b,c)
+#endif
+#define sv_backoff(a)		Perl_sv_backoff(aTHX_ a)
+#define sv_bless(a,b)		Perl_sv_bless(aTHX_ a,b)
+#define sv_vcatpvf(a,b,c)	Perl_sv_vcatpvf(aTHX_ a,b,c)
+#define sv_catpv(a,b)		Perl_sv_catpv(aTHX_ a,b)
+#define sv_chop(a,b)		Perl_sv_chop(aTHX_ a,b)
+#ifdef PERL_CORE
+#define sv_clean_all()		Perl_sv_clean_all(aTHX)
+#define sv_clean_objs()		Perl_sv_clean_objs(aTHX)
+#endif
+#define sv_clear(a)		Perl_sv_clear(aTHX_ a)
+#define sv_cmp(a,b)		Perl_sv_cmp(aTHX_ a,b)
+#define sv_cmp_locale(a,b)	Perl_sv_cmp_locale(aTHX_ a,b)
+#if defined(USE_LOCALE_COLLATE)
+#define sv_collxfrm(a,b)	Perl_sv_collxfrm(aTHX_ a,b)
+#endif
+#define sv_compile_2op(a,b,c,d)	Perl_sv_compile_2op(aTHX_ a,b,c,d)
+#define getcwd_sv(a)		Perl_getcwd_sv(aTHX_ a)
+#define sv_dec(a)		Perl_sv_dec(aTHX_ a)
+#define sv_dump(a)		Perl_sv_dump(aTHX_ a)
+#define sv_derived_from(a,b)	Perl_sv_derived_from(aTHX_ a,b)
+#define sv_eq(a,b)		Perl_sv_eq(aTHX_ a,b)
+#define sv_free(a)		Perl_sv_free(aTHX_ a)
+#ifdef PERL_CORE
+#define sv_free_arenas()	Perl_sv_free_arenas(aTHX)
+#endif
+#define sv_gets(a,b,c)		Perl_sv_gets(aTHX_ a,b,c)
+#define sv_grow(a,b)		Perl_sv_grow(aTHX_ a,b)
+#define sv_inc(a)		Perl_sv_inc(aTHX_ a)
+#define sv_insert(a,b,c,d,e)	Perl_sv_insert(aTHX_ a,b,c,d,e)
+#define sv_isa(a,b)		Perl_sv_isa(aTHX_ a,b)
+#define sv_isobject(a)		Perl_sv_isobject(aTHX_ a)
+#define sv_len(a)		Perl_sv_len(aTHX_ a)
+#define sv_len_utf8(a)		Perl_sv_len_utf8(aTHX_ a)
+#define sv_magic(a,b,c,d,e)	Perl_sv_magic(aTHX_ a,b,c,d,e)
+#define sv_magicext(a,b,c,d,e,f)	Perl_sv_magicext(aTHX_ a,b,c,d,e,f)
+#define sv_mortalcopy(a)	Perl_sv_mortalcopy(aTHX_ a)
+#define sv_newmortal()		Perl_sv_newmortal(aTHX)
+#define sv_newref(a)		Perl_sv_newref(aTHX_ a)
+#define sv_peek(a)		Perl_sv_peek(aTHX_ a)
+#define sv_pos_u2b(a,b,c)	Perl_sv_pos_u2b(aTHX_ a,b,c)
+#define sv_pos_b2u(a,b)		Perl_sv_pos_b2u(aTHX_ a,b)
+#define sv_pvutf8n_force(a,b)	Perl_sv_pvutf8n_force(aTHX_ a,b)
+#define sv_pvbyten_force(a,b)	Perl_sv_pvbyten_force(aTHX_ a,b)
+#define sv_recode_to_utf8(a,b)	Perl_sv_recode_to_utf8(aTHX_ a,b)
+#define sv_cat_decode(a,b,c,d,e,f)	Perl_sv_cat_decode(aTHX_ a,b,c,d,e,f)
+#define sv_reftype(a,b)		Perl_sv_reftype(aTHX_ a,b)
+#define sv_replace(a,b)		Perl_sv_replace(aTHX_ a,b)
+#define sv_report_used()	Perl_sv_report_used(aTHX)
+#define sv_reset(a,b)		Perl_sv_reset(aTHX_ a,b)
+#define sv_vsetpvf(a,b,c)	Perl_sv_vsetpvf(aTHX_ a,b,c)
+#define sv_setiv(a,b)		Perl_sv_setiv(aTHX_ a,b)
+#define sv_setpviv(a,b)		Perl_sv_setpviv(aTHX_ a,b)
+#define sv_setuv(a,b)		Perl_sv_setuv(aTHX_ a,b)
+#define sv_setnv(a,b)		Perl_sv_setnv(aTHX_ a,b)
+#define sv_setref_iv(a,b,c)	Perl_sv_setref_iv(aTHX_ a,b,c)
+#define sv_setref_uv(a,b,c)	Perl_sv_setref_uv(aTHX_ a,b,c)
+#define sv_setref_nv(a,b,c)	Perl_sv_setref_nv(aTHX_ a,b,c)
+#define sv_setref_pv(a,b,c)	Perl_sv_setref_pv(aTHX_ a,b,c)
+#define sv_setref_pvn(a,b,c,d)	Perl_sv_setref_pvn(aTHX_ a,b,c,d)
+#define sv_setpv(a,b)		Perl_sv_setpv(aTHX_ a,b)
+#define sv_setpvn(a,b,c)	Perl_sv_setpvn(aTHX_ a,b,c)
+#define sv_taint(a)		Perl_sv_taint(aTHX_ a)
+#define sv_tainted(a)		Perl_sv_tainted(aTHX_ a)
+#define sv_unmagic(a,b)		Perl_sv_unmagic(aTHX_ a,b)
+#define sv_unref(a)		Perl_sv_unref(aTHX_ a)
+#define sv_unref_flags(a,b)	Perl_sv_unref_flags(aTHX_ a,b)
+#define sv_untaint(a)		Perl_sv_untaint(aTHX_ a)
+#define sv_upgrade(a,b)		Perl_sv_upgrade(aTHX_ a,b)
+#define sv_usepvn(a,b,c)	Perl_sv_usepvn(aTHX_ a,b,c)
+#define sv_vcatpvfn(a,b,c,d,e,f,g)	Perl_sv_vcatpvfn(aTHX_ a,b,c,d,e,f,g)
+#define sv_vsetpvfn(a,b,c,d,e,f,g)	Perl_sv_vsetpvfn(aTHX_ a,b,c,d,e,f,g)
+#define str_to_version(a)	Perl_str_to_version(aTHX_ a)
+#define swash_init(a,b,c,d,e)	Perl_swash_init(aTHX_ a,b,c,d,e)
+#define swash_fetch(a,b,c)	Perl_swash_fetch(aTHX_ a,b,c)
+#define taint_env()		Perl_taint_env(aTHX)
+#define taint_proper(a,b)	Perl_taint_proper(aTHX_ a,b)
+#define to_utf8_case(a,b,c,d,e,f)	Perl_to_utf8_case(aTHX_ a,b,c,d,e,f)
+#define to_utf8_lower(a,b,c)	Perl_to_utf8_lower(aTHX_ a,b,c)
+#define to_utf8_upper(a,b,c)	Perl_to_utf8_upper(aTHX_ a,b,c)
+#define to_utf8_title(a,b,c)	Perl_to_utf8_title(aTHX_ a,b,c)
+#define to_utf8_fold(a,b,c)	Perl_to_utf8_fold(aTHX_ a,b,c)
+#if defined(UNLINK_ALL_VERSIONS)
+#define unlnk(a)		Perl_unlnk(aTHX_ a)
+#endif
+#if defined(USE_5005THREADS)
+#define unlock_condpair(a)	Perl_unlock_condpair(aTHX_ a)
+#endif
+#define unpack_str(a,b,c,d,e,f,g,h)	Perl_unpack_str(aTHX_ a,b,c,d,e,f,g,h)
+#define unpackstring(a,b,c,d,e)	Perl_unpackstring(aTHX_ a,b,c,d,e)
+#define unsharepvn(a,b,c)	Perl_unsharepvn(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define unshare_hek(a)		Perl_unshare_hek(aTHX_ a)
+#define utilize(a,b,c,d,e)	Perl_utilize(aTHX_ a,b,c,d,e)
+#endif
+#define utf16_to_utf8(a,b,c,d)	Perl_utf16_to_utf8(aTHX_ a,b,c,d)
+#define utf16_to_utf8_reversed(a,b,c,d)	Perl_utf16_to_utf8_reversed(aTHX_ a,b,c,d)
+#define utf8_length(a,b)	Perl_utf8_length(aTHX_ a,b)
+#define utf8_distance(a,b)	Perl_utf8_distance(aTHX_ a,b)
+#define utf8_hop(a,b)		Perl_utf8_hop(aTHX_ a,b)
+#define utf8_to_bytes(a,b)	Perl_utf8_to_bytes(aTHX_ a,b)
+#define bytes_from_utf8(a,b,c)	Perl_bytes_from_utf8(aTHX_ a,b,c)
+#define bytes_to_utf8(a,b)	Perl_bytes_to_utf8(aTHX_ a,b)
+#define utf8_to_uvchr(a,b)	Perl_utf8_to_uvchr(aTHX_ a,b)
+#define utf8_to_uvuni(a,b)	Perl_utf8_to_uvuni(aTHX_ a,b)
+#define utf8n_to_uvchr(a,b,c,d)	Perl_utf8n_to_uvchr(aTHX_ a,b,c,d)
+#define utf8n_to_uvuni(a,b,c,d)	Perl_utf8n_to_uvuni(aTHX_ a,b,c,d)
+#define uvchr_to_utf8(a,b)	Perl_uvchr_to_utf8(aTHX_ a,b)
+#define uvuni_to_utf8(a,b)	Perl_uvuni_to_utf8(aTHX_ a,b)
+#define uvchr_to_utf8_flags(a,b,c)	Perl_uvchr_to_utf8_flags(aTHX_ a,b,c)
+#define uvuni_to_utf8_flags(a,b,c)	Perl_uvuni_to_utf8_flags(aTHX_ a,b,c)
+#define pv_uni_display(a,b,c,d,e)	Perl_pv_uni_display(aTHX_ a,b,c,d,e)
+#define sv_uni_display(a,b,c,d)	Perl_sv_uni_display(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define vivify_defelem(a)	Perl_vivify_defelem(aTHX_ a)
+#define vivify_ref(a,b)		Perl_vivify_ref(aTHX_ a,b)
+#define wait4pid(a,b,c)		Perl_wait4pid(aTHX_ a,b,c)
+#define parse_unicode_opts(a)	Perl_parse_unicode_opts(aTHX_ a)
+#endif
+#define seed()			Perl_seed(aTHX)
+#ifdef PERL_CORE
+#define get_hash_seed()		Perl_get_hash_seed(aTHX)
+#define report_evil_fh(a,b,c)	Perl_report_evil_fh(aTHX_ a,b,c)
+#define report_uninit()		Perl_report_uninit(aTHX)
+#endif
+#define vwarn(a,b)		Perl_vwarn(aTHX_ a,b)
+#define vwarner(a,b,c)		Perl_vwarner(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define watch(a)		Perl_watch(aTHX_ a)
+#endif
+#define whichsig(a)		Perl_whichsig(aTHX_ a)
+#ifdef PERL_CORE
+#define write_to_stderr(a,b)	Perl_write_to_stderr(aTHX_ a,b)
+#define yyerror(a)		Perl_yyerror(aTHX_ a)
+#endif
+#ifdef USE_PURE_BISON
+#ifdef PERL_CORE
+#define yylex_r(a,b)		Perl_yylex_r(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define yylex()			Perl_yylex(aTHX)
+#define yyparse()		Perl_yyparse(aTHX)
+#define yywarn(a)		Perl_yywarn(aTHX_ a)
+#endif
+#if defined(MYMALLOC)
+#define dump_mstats(a)		Perl_dump_mstats(aTHX_ a)
+#define get_mstats(a,b,c)	Perl_get_mstats(aTHX_ a,b,c)
+#endif
+#define safesysmalloc		Perl_safesysmalloc
+#define safesyscalloc		Perl_safesyscalloc
+#define safesysrealloc		Perl_safesysrealloc
+#define safesysfree		Perl_safesysfree
+#if defined(PERL_GLOBAL_STRUCT)
+#define GetVars()		Perl_GetVars(aTHX)
+#endif
+#define runops_standard()	Perl_runops_standard(aTHX)
+#define runops_debug()		Perl_runops_debug(aTHX)
+#if defined(USE_5005THREADS)
+#define sv_lock(a)		Perl_sv_lock(aTHX_ a)
+#endif
+#define sv_vcatpvf_mg(a,b,c)	Perl_sv_vcatpvf_mg(aTHX_ a,b,c)
+#define sv_catpv_mg(a,b)	Perl_sv_catpv_mg(aTHX_ a,b)
+#define sv_catpvn_mg(a,b,c)	Perl_sv_catpvn_mg(aTHX_ a,b,c)
+#define sv_catsv_mg(a,b)	Perl_sv_catsv_mg(aTHX_ a,b)
+#define sv_vsetpvf_mg(a,b,c)	Perl_sv_vsetpvf_mg(aTHX_ a,b,c)
+#define sv_setiv_mg(a,b)	Perl_sv_setiv_mg(aTHX_ a,b)
+#define sv_setpviv_mg(a,b)	Perl_sv_setpviv_mg(aTHX_ a,b)
+#define sv_setuv_mg(a,b)	Perl_sv_setuv_mg(aTHX_ a,b)
+#define sv_setnv_mg(a,b)	Perl_sv_setnv_mg(aTHX_ a,b)
+#define sv_setpv_mg(a,b)	Perl_sv_setpv_mg(aTHX_ a,b)
+#define sv_setpvn_mg(a,b,c)	Perl_sv_setpvn_mg(aTHX_ a,b,c)
+#define sv_setsv_mg(a,b)	Perl_sv_setsv_mg(aTHX_ a,b)
+#define sv_usepvn_mg(a,b,c)	Perl_sv_usepvn_mg(aTHX_ a,b,c)
+#define get_vtbl(a)		Perl_get_vtbl(aTHX_ a)
+#define pv_display(a,b,c,d,e)	Perl_pv_display(aTHX_ a,b,c,d,e)
+#define dump_vindent(a,b,c,d)	Perl_dump_vindent(aTHX_ a,b,c,d)
+#define do_gv_dump(a,b,c,d)	Perl_do_gv_dump(aTHX_ a,b,c,d)
+#define do_gvgv_dump(a,b,c,d)	Perl_do_gvgv_dump(aTHX_ a,b,c,d)
+#define do_hv_dump(a,b,c,d)	Perl_do_hv_dump(aTHX_ a,b,c,d)
+#define do_magic_dump(a,b,c,d,e,f,g)	Perl_do_magic_dump(aTHX_ a,b,c,d,e,f,g)
+#define do_op_dump(a,b,c)	Perl_do_op_dump(aTHX_ a,b,c)
+#define do_pmop_dump(a,b,c)	Perl_do_pmop_dump(aTHX_ a,b,c)
+#define do_sv_dump(a,b,c,d,e,f,g)	Perl_do_sv_dump(aTHX_ a,b,c,d,e,f,g)
+#define magic_dump(a)		Perl_magic_dump(aTHX_ a)
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define vdefault_protect(a,b,c,d)	Perl_vdefault_protect(aTHX_ a,b,c,d)
+#endif
+#define reginitcolors()		Perl_reginitcolors(aTHX)
+#define sv_2pv_nolen(a)		Perl_sv_2pv_nolen(aTHX_ a)
+#define sv_2pvutf8_nolen(a)	Perl_sv_2pvutf8_nolen(aTHX_ a)
+#define sv_2pvbyte_nolen(a)	Perl_sv_2pvbyte_nolen(aTHX_ a)
+#define sv_utf8_downgrade(a,b)	Perl_sv_utf8_downgrade(aTHX_ a,b)
+#define sv_utf8_encode(a)	Perl_sv_utf8_encode(aTHX_ a)
+#define sv_utf8_decode(a)	Perl_sv_utf8_decode(aTHX_ a)
+#define sv_force_normal(a)	Perl_sv_force_normal(aTHX_ a)
+#define sv_force_normal_flags(a,b)	Perl_sv_force_normal_flags(aTHX_ a,b)
+#define tmps_grow(a)		Perl_tmps_grow(aTHX_ a)
+#define sv_rvweaken(a)		Perl_sv_rvweaken(aTHX_ a)
+#ifdef PERL_CORE
+#define magic_killbackrefs(a,b)	Perl_magic_killbackrefs(aTHX_ a,b)
+#endif
+#define newANONATTRSUB(a,b,c,d)	Perl_newANONATTRSUB(aTHX_ a,b,c,d)
+#define newATTRSUB(a,b,c,d,e)	Perl_newATTRSUB(aTHX_ a,b,c,d,e)
+#define newMYSUB(a,b,c,d,e)	Perl_newMYSUB(aTHX_ a,b,c,d,e)
+#ifdef PERL_CORE
+#define my_attrs(a,b)		Perl_my_attrs(aTHX_ a,b)
+#define boot_core_xsutils()	Perl_boot_core_xsutils(aTHX)
+#endif
+#if defined(USE_ITHREADS)
+#define cx_dup(a,b,c,d)		Perl_cx_dup(aTHX_ a,b,c,d)
+#define si_dup(a,b)		Perl_si_dup(aTHX_ a,b)
+#define ss_dup(a,b)		Perl_ss_dup(aTHX_ a,b)
+#define any_dup(a,b)		Perl_any_dup(aTHX_ a,b)
+#define he_dup(a,b,c)		Perl_he_dup(aTHX_ a,b,c)
+#define re_dup(a,b)		Perl_re_dup(aTHX_ a,b)
+#define fp_dup(a,b,c)		Perl_fp_dup(aTHX_ a,b,c)
+#define dirp_dup(a)		Perl_dirp_dup(aTHX_ a)
+#define gp_dup(a,b)		Perl_gp_dup(aTHX_ a,b)
+#define mg_dup(a,b)		Perl_mg_dup(aTHX_ a,b)
+#define sv_dup(a,b)		Perl_sv_dup(aTHX_ a,b)
+#define rvpv_dup(a,b,c)		Perl_rvpv_dup(aTHX_ a,b,c)
+#if defined(HAVE_INTERP_INTERN)
+#define sys_intern_dup(a,b)	Perl_sys_intern_dup(aTHX_ a,b)
+#endif
+#define ptr_table_new()		Perl_ptr_table_new(aTHX)
+#define ptr_table_fetch(a,b)	Perl_ptr_table_fetch(aTHX_ a,b)
+#define ptr_table_store(a,b,c)	Perl_ptr_table_store(aTHX_ a,b,c)
+#define ptr_table_split(a)	Perl_ptr_table_split(aTHX_ a)
+#define ptr_table_clear(a)	Perl_ptr_table_clear(aTHX_ a)
+#define ptr_table_free(a)	Perl_ptr_table_free(aTHX_ a)
+#endif
+#if defined(HAVE_INTERP_INTERN)
+#define sys_intern_clear()	Perl_sys_intern_clear(aTHX)
+#define sys_intern_init()	Perl_sys_intern_init(aTHX)
+#endif
+#define custom_op_name(a)	Perl_custom_op_name(aTHX_ a)
+#define custom_op_desc(a)	Perl_custom_op_desc(aTHX_ a)
+#define sv_nosharing(a)		Perl_sv_nosharing(aTHX_ a)
+#define sv_nolocking(a)		Perl_sv_nolocking(aTHX_ a)
+#define sv_nounlocking(a)	Perl_sv_nounlocking(aTHX_ a)
+#define nothreadhook()		Perl_nothreadhook(aTHX)
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define avhv_index_sv(a)	S_avhv_index_sv(aTHX_ a)
+#define avhv_index(a,b,c)	S_avhv_index(aTHX_ a,b,c)
+#endif
+#endif
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define do_trans_simple(a)	S_do_trans_simple(aTHX_ a)
+#define do_trans_count(a)	S_do_trans_count(aTHX_ a)
+#define do_trans_complex(a)	S_do_trans_complex(aTHX_ a)
+#define do_trans_simple_utf8(a)	S_do_trans_simple_utf8(aTHX_ a)
+#define do_trans_count_utf8(a)	S_do_trans_count_utf8(aTHX_ a)
+#define do_trans_complex_utf8(a)	S_do_trans_complex_utf8(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define gv_init_sv(a,b)		S_gv_init_sv(aTHX_ a,b)
+#define require_errno(a)	S_require_errno(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define hsplit(a)		S_hsplit(aTHX_ a)
+#define hfreeentries(a)		S_hfreeentries(aTHX_ a)
+#define new_he()		S_new_he(aTHX)
+#define del_he(a)		S_del_he(aTHX_ a)
+#define save_hek_flags(a,b,c,d)	S_save_hek_flags(aTHX_ a,b,c,d)
+#define hv_magic_check(a,b,c)	S_hv_magic_check(aTHX_ a,b,c)
+#define unshare_hek_or_pvn(a,b,c,d)	S_unshare_hek_or_pvn(aTHX_ a,b,c,d)
+#define share_hek_flags(a,b,c,d)	S_share_hek_flags(aTHX_ a,b,c,d)
+#define hv_notallowed(a,b,c,d)	S_hv_notallowed(aTHX_ a,b,c,d)
+#endif
+#endif
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_magic(a,b)		S_save_magic(aTHX_ a,b)
+#define magic_methpack(a,b,c)	S_magic_methpack(aTHX_ a,b,c)
+#define magic_methcall(a,b,c,d,e,f)	S_magic_methcall(aTHX_ a,b,c,d,e,f)
+#define restore_magic(a)	S_restore_magic(aTHX_ a)
+#define unwind_handler_stack(a)	S_unwind_handler_stack(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define is_handle_constructor(a,b)	S_is_handle_constructor(aTHX_ a,b)
+#define is_list_assignment(a)	S_is_list_assignment(aTHX_ a)
+#define cop_free(a)		S_cop_free(aTHX_ a)
+#define modkids(a,b)		S_modkids(aTHX_ a,b)
+#define scalarboolean(a)	S_scalarboolean(aTHX_ a)
+#define newDEFSVOP()		S_newDEFSVOP(aTHX)
+#define new_logop(a,b,c,d)	S_new_logop(aTHX_ a,b,c,d)
+#define simplify_sort(a)	S_simplify_sort(aTHX_ a)
+#define gv_ename(a)		S_gv_ename(aTHX_ a)
+#define scalar_mod_type(a,b)	S_scalar_mod_type(aTHX_ a,b)
+#define my_kid(a,b,c)		S_my_kid(aTHX_ a,b,c)
+#define dup_attrlist(a)		S_dup_attrlist(aTHX_ a)
+#define apply_attrs(a,b,c,d)	S_apply_attrs(aTHX_ a,b,c,d)
+#define apply_attrs_my(a,b,c,d)	S_apply_attrs_my(aTHX_ a,b,c,d)
+#define bad_type(a,b,c,d)	S_bad_type(aTHX_ a,b,c,d)
+#define no_bareword_allowed(a)	S_no_bareword_allowed(aTHX_ a)
+#define no_fh_allowed(a)	S_no_fh_allowed(aTHX_ a)
+#define too_few_arguments(a,b)	S_too_few_arguments(aTHX_ a,b)
+#define too_many_arguments(a,b)	S_too_many_arguments(aTHX_ a,b)
+#endif
+#endif
+#if defined(PL_OP_SLAB_ALLOC)
+#define Slab_Alloc(a,b)		Perl_Slab_Alloc(aTHX_ a,b)
+#define Slab_Free(a)		Perl_Slab_Free(aTHX_ a)
+#endif
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define find_beginning()	S_find_beginning(aTHX)
+#define forbid_setid(a)		S_forbid_setid(aTHX_ a)
+#define incpush(a,b,c,d)	S_incpush(aTHX_ a,b,c,d)
+#define init_interp()		S_init_interp(aTHX)
+#define init_ids()		S_init_ids(aTHX)
+#define init_lexer()		S_init_lexer(aTHX)
+#define init_main_stash()	S_init_main_stash(aTHX)
+#define init_perllib()		S_init_perllib(aTHX)
+#define init_postdump_symbols(a,b,c)	S_init_postdump_symbols(aTHX_ a,b,c)
+#define init_predump_symbols()	S_init_predump_symbols(aTHX)
+#define my_exit_jump()		S_my_exit_jump(aTHX)
+#define nuke_stacks()		S_nuke_stacks(aTHX)
+#define open_script(a,b,c)	S_open_script(aTHX_ a,b,c)
+#define usage(a)		S_usage(aTHX_ a)
+#define validate_suid(a,b)	S_validate_suid(aTHX_ a,b)
+#endif
+#  if defined(IAMSUID)
+#ifdef PERL_CORE
+#define fd_on_nosuid_fs(a)	S_fd_on_nosuid_fs(aTHX_ a)
+#endif
+#  endif
+#ifdef PERL_CORE
+#define parse_body(a,b)		S_parse_body(aTHX_ a,b)
+#define run_body(a)		S_run_body(aTHX_ a)
+#define call_body(a,b)		S_call_body(aTHX_ a,b)
+#define call_list_body(a)	S_call_list_body(aTHX_ a)
+#endif
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#ifdef PERL_CORE
+#define vparse_body(a)		S_vparse_body(aTHX_ a)
+#define vrun_body(a)		S_vrun_body(aTHX_ a)
+#define vcall_body(a)		S_vcall_body(aTHX_ a)
+#define vcall_list_body(a)	S_vcall_list_body(aTHX_ a)
+#endif
+#endif
+#  if defined(USE_5005THREADS)
+#ifdef PERL_CORE
+#define init_main_thread()	S_init_main_thread(aTHX)
+#endif
+#  endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define refto(a)		S_refto(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_PP_PACK_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define unpack_rec(a,b,c,d,e)	S_unpack_rec(aTHX_ a,b,c,d,e)
+#define pack_rec(a,b,c,d)	S_pack_rec(aTHX_ a,b,c,d)
+#define mul128(a,b)		S_mul128(aTHX_ a,b)
+#define measure_struct(a)	S_measure_struct(aTHX_ a)
+#define group_end(a,b,c)	S_group_end(aTHX_ a,b,c)
+#define get_num(a,b)		S_get_num(aTHX_ a,b)
+#define next_symbol(a)		S_next_symbol(aTHX_ a)
+#define doencodes(a,b,c)	S_doencodes(aTHX_ a,b,c)
+#define is_an_int(a,b)		S_is_an_int(aTHX_ a,b)
+#define div128(a,b)		S_div128(aTHX_ a,b)
+#endif
+#endif
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define docatch(a)		S_docatch(aTHX_ a)
+#define docatch_body()		S_docatch_body(aTHX)
+#endif
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#ifdef PERL_CORE
+#define vdocatch_body(a)	S_vdocatch_body(aTHX_ a)
+#endif
+#endif
+#ifdef PERL_CORE
+#define dofindlabel(a,b,c,d)	S_dofindlabel(aTHX_ a,b,c,d)
+#define doparseform(a)		S_doparseform(aTHX_ a)
+#define num_overflow		S_num_overflow
+#define dopoptoeval(a)		S_dopoptoeval(aTHX_ a)
+#define dopoptolabel(a)		S_dopoptolabel(aTHX_ a)
+#define dopoptoloop(a)		S_dopoptoloop(aTHX_ a)
+#define dopoptosub(a)		S_dopoptosub(aTHX_ a)
+#define dopoptosub_at(a,b)	S_dopoptosub_at(aTHX_ a,b)
+#define save_lines(a,b)		S_save_lines(aTHX_ a,b)
+#define doeval(a,b,c,d)		S_doeval(aTHX_ a,b,c,d)
+#define check_type_and_open(a,b)	S_check_type_and_open(aTHX_ a,b)
+#define doopen_pm(a,b)		S_doopen_pm(aTHX_ a,b)
+#define path_is_absolute(a)	S_path_is_absolute(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define do_maybe_phash(a,b,c,d,e)	S_do_maybe_phash(aTHX_ a,b,c,d,e)
+#define do_oddball(a,b,c)	S_do_oddball(aTHX_ a,b,c)
+#define get_db_sub(a,b)		S_get_db_sub(aTHX_ a,b)
+#define method_common(a,b)	S_method_common(aTHX_ a,b)
+#endif
+#endif
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define doform(a,b,c)		S_doform(aTHX_ a,b,c)
+#define emulate_eaccess(a,b)	S_emulate_eaccess(aTHX_ a,b)
+#endif
+#  if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+#ifdef PERL_CORE
+#define dooneliner(a,b)		S_dooneliner(aTHX_ a,b)
+#endif
+#  endif
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg(a,b,c)		S_reg(aTHX_ a,b,c)
+#define reganode(a,b,c)		S_reganode(aTHX_ a,b,c)
+#define regatom(a,b)		S_regatom(aTHX_ a,b)
+#define regbranch(a,b,c)	S_regbranch(aTHX_ a,b,c)
+#define reguni(a,b,c,d)		S_reguni(aTHX_ a,b,c,d)
+#define regclass(a)		S_regclass(aTHX_ a)
+#define regcurly(a)		S_regcurly(aTHX_ a)
+#define reg_node(a,b)		S_reg_node(aTHX_ a,b)
+#define regpiece(a,b)		S_regpiece(aTHX_ a,b)
+#define reginsert(a,b,c)	S_reginsert(aTHX_ a,b,c)
+#define regoptail(a,b,c)	S_regoptail(aTHX_ a,b,c)
+#define regtail(a,b,c)		S_regtail(aTHX_ a,b,c)
+#define regwhite(a,b)		S_regwhite(aTHX_ a,b)
+#define nextchar(a)		S_nextchar(aTHX_ a)
+#endif
+#  ifdef DEBUGGING
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define dumpuntil(a,b,c,d,e)	S_dumpuntil(aTHX_ a,b,c,d,e)
+#define put_byte(a,b)		S_put_byte(aTHX_ a,b)
+#endif
+#  endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define scan_commit(a,b)	S_scan_commit(aTHX_ a,b)
+#define cl_anything(a,b)	S_cl_anything(aTHX_ a,b)
+#define cl_is_anything(a)	S_cl_is_anything(aTHX_ a)
+#define cl_init(a,b)		S_cl_init(aTHX_ a,b)
+#define cl_init_zero(a,b)	S_cl_init_zero(aTHX_ a,b)
+#define cl_and(a,b)		S_cl_and(aTHX_ a,b)
+#define cl_or(a,b,c)		S_cl_or(aTHX_ a,b,c)
+#define study_chunk(a,b,c,d,e,f)	S_study_chunk(aTHX_ a,b,c,d,e,f)
+#define add_data(a,b,c)		S_add_data(aTHX_ a,b,c)
+#endif
+#ifdef PERL_CORE
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regpposixcc(a,b)	S_regpposixcc(aTHX_ a,b)
+#define checkposixcc(a)		S_checkposixcc(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regmatch(a)		S_regmatch(aTHX_ a)
+#define regrepeat(a,b)		S_regrepeat(aTHX_ a,b)
+#define regrepeat_hard(a,b,c)	S_regrepeat_hard(aTHX_ a,b,c)
+#define regtry(a,b)		S_regtry(aTHX_ a,b)
+#define reginclass(a,b,c,d)	S_reginclass(aTHX_ a,b,c,d)
+#define regcppush(a)		S_regcppush(aTHX_ a)
+#define regcppop()		S_regcppop(aTHX)
+#define regcp_set_to(a)		S_regcp_set_to(aTHX_ a)
+#define cache_re(a)		S_cache_re(aTHX_ a)
+#define reghop(a,b)		S_reghop(aTHX_ a,b)
+#define reghop3(a,b,c)		S_reghop3(aTHX_ a,b,c)
+#define reghopmaybe(a,b)	S_reghopmaybe(aTHX_ a,b)
+#define reghopmaybe3(a,b,c)	S_reghopmaybe3(aTHX_ a,b,c)
+#define find_byclass(a,b,c,d,e)	S_find_byclass(aTHX_ a,b,c,d,e)
+#define to_utf8_substr(a)	S_to_utf8_substr(aTHX_ a)
+#define to_byte_substr(a)	S_to_byte_substr(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_DUMP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define deb_curcv(a)		S_deb_curcv(aTHX_ a)
+#define debprof(a)		S_debprof(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_scalar_at(a)	S_save_scalar_at(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define uiv_2buf		S_uiv_2buf
+#define asIV(a)			S_asIV(aTHX_ a)
+#define asUV(a)			S_asUV(aTHX_ a)
+#define new_xiv()		S_new_xiv(aTHX)
+#define new_xnv()		S_new_xnv(aTHX)
+#define new_xpv()		S_new_xpv(aTHX)
+#define new_xpviv()		S_new_xpviv(aTHX)
+#define new_xpvnv()		S_new_xpvnv(aTHX)
+#define new_xpvcv()		S_new_xpvcv(aTHX)
+#define new_xpvav()		S_new_xpvav(aTHX)
+#define new_xpvhv()		S_new_xpvhv(aTHX)
+#define new_xpvmg()		S_new_xpvmg(aTHX)
+#define new_xpvlv()		S_new_xpvlv(aTHX)
+#define new_xpvbm()		S_new_xpvbm(aTHX)
+#define new_xrv()		S_new_xrv(aTHX)
+#define del_xiv(a)		S_del_xiv(aTHX_ a)
+#define del_xnv(a)		S_del_xnv(aTHX_ a)
+#define del_xpv(a)		S_del_xpv(aTHX_ a)
+#define del_xpviv(a)		S_del_xpviv(aTHX_ a)
+#define del_xpvnv(a)		S_del_xpvnv(aTHX_ a)
+#define del_xpvcv(a)		S_del_xpvcv(aTHX_ a)
+#define del_xpvav(a)		S_del_xpvav(aTHX_ a)
+#define del_xpvhv(a)		S_del_xpvhv(aTHX_ a)
+#define del_xpvmg(a)		S_del_xpvmg(aTHX_ a)
+#define del_xpvlv(a)		S_del_xpvlv(aTHX_ a)
+#define del_xpvbm(a)		S_del_xpvbm(aTHX_ a)
+#define del_xrv(a)		S_del_xrv(aTHX_ a)
+#define sv_unglob(a)		S_sv_unglob(aTHX_ a)
+#define not_a_number(a)		S_not_a_number(aTHX_ a)
+#define visit(a,b,c)		S_visit(aTHX_ a,b,c)
+#define sv_add_backref(a,b)	S_sv_add_backref(aTHX_ a,b)
+#define sv_del_backref(a)	S_sv_del_backref(aTHX_ a)
+#endif
+#  ifdef DEBUGGING
+#ifdef PERL_CORE
+#define del_sv(a)		S_del_sv(aTHX_ a)
+#endif
+#  endif
+#  if !defined(NV_PRESERVES_UV)
+#ifdef PERL_CORE
+#define sv_2iuv_non_preserve(a,b)	S_sv_2iuv_non_preserve(aTHX_ a,b)
+#endif
+#  endif
+#ifdef PERL_CORE
+#define expect_number(a)	S_expect_number(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define utf8_mg_pos(a,b,c,d,e,f,g,h,i)	S_utf8_mg_pos(aTHX_ a,b,c,d,e,f,g,h,i)
+#define utf8_mg_pos_init(a,b,c,d,e,f,g)	S_utf8_mg_pos_init(aTHX_ a,b,c,d,e,f,g)
+#endif
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define check_uni()		S_check_uni(aTHX)
+#define force_next(a)		S_force_next(aTHX_ a)
+#define force_version(a,b)	S_force_version(aTHX_ a,b)
+#define force_word(a,b,c,d,e)	S_force_word(aTHX_ a,b,c,d,e)
+#define tokeq(a)		S_tokeq(aTHX_ a)
+#define pending_ident()		S_pending_ident(aTHX)
+#define scan_const(a)		S_scan_const(aTHX_ a)
+#define scan_formline(a)	S_scan_formline(aTHX_ a)
+#define scan_heredoc(a)		S_scan_heredoc(aTHX_ a)
+#define scan_ident(a,b,c,d,e)	S_scan_ident(aTHX_ a,b,c,d,e)
+#define scan_inputsymbol(a)	S_scan_inputsymbol(aTHX_ a)
+#define scan_pat(a,b)		S_scan_pat(aTHX_ a,b)
+#define scan_str(a,b,c)		S_scan_str(aTHX_ a,b,c)
+#define scan_subst(a)		S_scan_subst(aTHX_ a)
+#define scan_trans(a)		S_scan_trans(aTHX_ a)
+#define scan_word(a,b,c,d,e)	S_scan_word(aTHX_ a,b,c,d,e)
+#define skipspace(a)		S_skipspace(aTHX_ a)
+#define swallow_bom(a)		S_swallow_bom(aTHX_ a)
+#define checkcomma(a,b,c)	S_checkcomma(aTHX_ a,b,c)
+#define force_ident(a,b)	S_force_ident(aTHX_ a,b)
+#define incline(a)		S_incline(aTHX_ a)
+#define intuit_method(a,b)	S_intuit_method(aTHX_ a,b)
+#define intuit_more(a)		S_intuit_more(aTHX_ a)
+#define lop(a,b,c)		S_lop(aTHX_ a,b,c)
+#define missingterm(a)		S_missingterm(aTHX_ a)
+#define no_op(a,b)		S_no_op(aTHX_ a,b)
+#define set_csh()		S_set_csh(aTHX)
+#define sublex_done()		S_sublex_done(aTHX)
+#define sublex_push()		S_sublex_push(aTHX)
+#define sublex_start()		S_sublex_start(aTHX)
+#define filter_gets(a,b,c)	S_filter_gets(aTHX_ a,b,c)
+#define find_in_my_stash(a,b)	S_find_in_my_stash(aTHX_ a,b)
+#define new_constant(a,b,c,d,e,f)	S_new_constant(aTHX_ a,b,c,d,e,f)
+#endif
+#  if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define tokereport(a,b)		S_tokereport(aTHX_ a,b)
+#endif
+#  endif
+#ifdef PERL_CORE
+#define ao(a)			S_ao(aTHX_ a)
+#define depcom()		S_depcom(aTHX)
+#define incl_perldb()		S_incl_perldb(aTHX)
+#endif
+#  if defined(PERL_CR_FILTER)
+#ifdef PERL_CORE
+#define cr_textfilter(a,b,c)	S_cr_textfilter(aTHX_ a,b,c)
+#endif
+#  endif
+#endif
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define isa_lookup(a,b,c,d,e)	S_isa_lookup(aTHX_ a,b,c,d,e)
+#endif
+#endif
+#if defined(PERL_IN_LOCALE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define stdize_locale(a)	S_stdize_locale(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define closest_cop(a,b)	S_closest_cop(aTHX_ a,b)
+#define mess_alloc()		S_mess_alloc(aTHX)
+#endif
+#endif
+#if defined(PERL_IN_NUMERIC_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define mulexp10		S_mulexp10
+#endif
+#endif
+#if defined(PERL_IN_UTF8_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define is_utf8_char_slow(a,b)	S_is_utf8_char_slow(aTHX_ a,b)
+#endif
+#endif
+#define sv_setsv_flags(a,b,c)	Perl_sv_setsv_flags(aTHX_ a,b,c)
+#define sv_catpvn_flags(a,b,c,d)	Perl_sv_catpvn_flags(aTHX_ a,b,c,d)
+#define sv_catsv_flags(a,b,c)	Perl_sv_catsv_flags(aTHX_ a,b,c)
+#define sv_utf8_upgrade_flags(a,b)	Perl_sv_utf8_upgrade_flags(aTHX_ a,b)
+#define sv_pvn_force_flags(a,b,c)	Perl_sv_pvn_force_flags(aTHX_ a,b,c)
+#define sv_2pv_flags(a,b,c)	Perl_sv_2pv_flags(aTHX_ a,b,c)
+#define sv_copypv(a,b)		Perl_sv_copypv(aTHX_ a,b)
+#define my_atof2(a,b)		Perl_my_atof2(aTHX_ a,b)
+#define my_socketpair		Perl_my_socketpair
+#if defined(USE_PERLIO) && !defined(USE_SFIO)
+#define PerlIO_close(a)		Perl_PerlIO_close(aTHX_ a)
+#define PerlIO_fill(a)		Perl_PerlIO_fill(aTHX_ a)
+#define PerlIO_fileno(a)	Perl_PerlIO_fileno(aTHX_ a)
+#define PerlIO_eof(a)		Perl_PerlIO_eof(aTHX_ a)
+#define PerlIO_error(a)		Perl_PerlIO_error(aTHX_ a)
+#define PerlIO_flush(a)		Perl_PerlIO_flush(aTHX_ a)
+#define PerlIO_clearerr(a)	Perl_PerlIO_clearerr(aTHX_ a)
+#define PerlIO_set_cnt(a,b)	Perl_PerlIO_set_cnt(aTHX_ a,b)
+#define PerlIO_set_ptrcnt(a,b,c)	Perl_PerlIO_set_ptrcnt(aTHX_ a,b,c)
+#define PerlIO_setlinebuf(a)	Perl_PerlIO_setlinebuf(aTHX_ a)
+#define PerlIO_read(a,b,c)	Perl_PerlIO_read(aTHX_ a,b,c)
+#define PerlIO_write(a,b,c)	Perl_PerlIO_write(aTHX_ a,b,c)
+#define PerlIO_unread(a,b,c)	Perl_PerlIO_unread(aTHX_ a,b,c)
+#define PerlIO_tell(a)		Perl_PerlIO_tell(aTHX_ a)
+#define PerlIO_seek(a,b,c)	Perl_PerlIO_seek(aTHX_ a,b,c)
+#define PerlIO_get_base(a)	Perl_PerlIO_get_base(aTHX_ a)
+#define PerlIO_get_ptr(a)	Perl_PerlIO_get_ptr(aTHX_ a)
+#define PerlIO_get_bufsiz(a)	Perl_PerlIO_get_bufsiz(aTHX_ a)
+#define PerlIO_get_cnt(a)	Perl_PerlIO_get_cnt(aTHX_ a)
+#define PerlIO_stdin()		Perl_PerlIO_stdin(aTHX)
+#define PerlIO_stdout()		Perl_PerlIO_stdout(aTHX)
+#define PerlIO_stderr()		Perl_PerlIO_stderr(aTHX)
+#endif /* PERLIO_LAYERS */
+#ifdef PERL_CORE
+#define deb_stack_all()		Perl_deb_stack_all(aTHX)
+#endif
+#ifdef PERL_IN_DEB_C
+#ifdef PERL_CORE
+#define deb_stack_n(a,b,c,d,e)	S_deb_stack_n(aTHX_ a,b,c,d,e)
+#endif
+#endif
+#ifdef PERL_CORE
+#define pad_new(a)		Perl_pad_new(aTHX_ a)
+#define pad_undef(a)		Perl_pad_undef(aTHX_ a)
+#define pad_add_name(a,b,c,d)	Perl_pad_add_name(aTHX_ a,b,c,d)
+#define pad_add_anon(a,b)	Perl_pad_add_anon(aTHX_ a,b)
+#define pad_check_dup(a,b,c)	Perl_pad_check_dup(aTHX_ a,b,c)
+#endif
+#ifdef DEBUGGING
+#ifdef PERL_CORE
+#define pad_setsv(a,b)		Perl_pad_setsv(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define pad_block_start(a)	Perl_pad_block_start(aTHX_ a)
+#define pad_tidy(a)		Perl_pad_tidy(aTHX_ a)
+#define do_dump_pad(a,b,c,d)	Perl_do_dump_pad(aTHX_ a,b,c,d)
+#define pad_fixup_inner_anons(a,b,c)	Perl_pad_fixup_inner_anons(aTHX_ a,b,c)
+#endif
+#ifdef PERL_CORE
+#define pad_push(a,b,c)		Perl_pad_push(aTHX_ a,b,c)
+#define pad_compname_type(a)	Perl_pad_compname_type(aTHX_ a)
+#endif
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define pad_findlex(a,b,c)	S_pad_findlex(aTHX_ a,b,c)
+#endif
+#  if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define cv_dump(a,b)		S_cv_dump(aTHX_ a,b)
+#endif
+#  endif
+#ifdef PERL_CORE
+#define cv_clone2(a,b)		S_cv_clone2(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define find_runcv(a)		Perl_find_runcv(aTHX_ a)
+#define free_tied_hv_pool()	Perl_free_tied_hv_pool(aTHX)
+#endif
+#if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define get_debug_opts(a)	Perl_get_debug_opts(aTHX_ a)
+#endif
+#endif
+#define hv_clear_placeholders(a)	Perl_hv_clear_placeholders(aTHX_ a)
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define hv_delete_common(a,b,c,d,e,f,g)	S_hv_delete_common(aTHX_ a,b,c,d,e,f,g)
+#define hv_fetch_common(a,b,c,d,e,f,g,h)	S_hv_fetch_common(aTHX_ a,b,c,d,e,f,g,h)
+#endif
+#endif
+#define hv_scalar(a)		Perl_hv_scalar(aTHX_ a)
+#ifdef PERL_CORE
+#define magic_scalarpack(a,b)	Perl_magic_scalarpack(aTHX_ a,b)
+#endif
+#if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define get_debug_opts_flags(a,b)	Perl_get_debug_opts_flags(aTHX_ a,b)
+#endif
+#endif
+#define op_refcnt_lock()	Perl_op_refcnt_lock(aTHX)
+#define op_refcnt_unlock()	Perl_op_refcnt_unlock(aTHX)
+#define savesvpv(a)		Perl_savesvpv(aTHX_ a)
+#ifdef PERL_NEED_MY_HTOLE16
+#ifdef PERL_CORE
+#define my_htole16		Perl_my_htole16
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH16
+#ifdef PERL_CORE
+#define my_letoh16		Perl_my_letoh16
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE16
+#ifdef PERL_CORE
+#define my_htobe16		Perl_my_htobe16
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH16
+#ifdef PERL_CORE
+#define my_betoh16		Perl_my_betoh16
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLE32
+#ifdef PERL_CORE
+#define my_htole32		Perl_my_htole32
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH32
+#ifdef PERL_CORE
+#define my_letoh32		Perl_my_letoh32
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE32
+#ifdef PERL_CORE
+#define my_htobe32		Perl_my_htobe32
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH32
+#ifdef PERL_CORE
+#define my_betoh32		Perl_my_betoh32
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLE64
+#ifdef PERL_CORE
+#define my_htole64		Perl_my_htole64
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH64
+#ifdef PERL_CORE
+#define my_letoh64		Perl_my_letoh64
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE64
+#ifdef PERL_CORE
+#define my_htobe64		Perl_my_htobe64
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH64
+#ifdef PERL_CORE
+#define my_betoh64		Perl_my_betoh64
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLES
+#ifdef PERL_CORE
+#define my_htoles		Perl_my_htoles
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHS
+#ifdef PERL_CORE
+#define my_letohs		Perl_my_letohs
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBES
+#ifdef PERL_CORE
+#define my_htobes		Perl_my_htobes
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHS
+#ifdef PERL_CORE
+#define my_betohs		Perl_my_betohs
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLEI
+#ifdef PERL_CORE
+#define my_htolei		Perl_my_htolei
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHI
+#ifdef PERL_CORE
+#define my_letohi		Perl_my_letohi
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBEI
+#ifdef PERL_CORE
+#define my_htobei		Perl_my_htobei
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHI
+#ifdef PERL_CORE
+#define my_betohi		Perl_my_betohi
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLEL
+#ifdef PERL_CORE
+#define my_htolel		Perl_my_htolel
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHL
+#ifdef PERL_CORE
+#define my_letohl		Perl_my_letohl
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBEL
+#ifdef PERL_CORE
+#define my_htobel		Perl_my_htobel
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHL
+#ifdef PERL_CORE
+#define my_betohl		Perl_my_betohl
+#endif
+#endif
+#ifdef PERL_CORE
+#define my_swabn		Perl_my_swabn
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#define ck_anoncode(a)		Perl_ck_anoncode(aTHX_ a)
+#define ck_bitop(a)		Perl_ck_bitop(aTHX_ a)
+#define ck_concat(a)		Perl_ck_concat(aTHX_ a)
+#define ck_defined(a)		Perl_ck_defined(aTHX_ a)
+#define ck_delete(a)		Perl_ck_delete(aTHX_ a)
+#define ck_die(a)		Perl_ck_die(aTHX_ a)
+#define ck_eof(a)		Perl_ck_eof(aTHX_ a)
+#define ck_eval(a)		Perl_ck_eval(aTHX_ a)
+#define ck_exec(a)		Perl_ck_exec(aTHX_ a)
+#define ck_exists(a)		Perl_ck_exists(aTHX_ a)
+#define ck_exit(a)		Perl_ck_exit(aTHX_ a)
+#define ck_ftst(a)		Perl_ck_ftst(aTHX_ a)
+#define ck_fun(a)		Perl_ck_fun(aTHX_ a)
+#define ck_glob(a)		Perl_ck_glob(aTHX_ a)
+#define ck_grep(a)		Perl_ck_grep(aTHX_ a)
+#define ck_index(a)		Perl_ck_index(aTHX_ a)
+#define ck_join(a)		Perl_ck_join(aTHX_ a)
+#define ck_lengthconst(a)	Perl_ck_lengthconst(aTHX_ a)
+#define ck_lfun(a)		Perl_ck_lfun(aTHX_ a)
+#define ck_listiob(a)		Perl_ck_listiob(aTHX_ a)
+#define ck_match(a)		Perl_ck_match(aTHX_ a)
+#define ck_method(a)		Perl_ck_method(aTHX_ a)
+#define ck_null(a)		Perl_ck_null(aTHX_ a)
+#define ck_open(a)		Perl_ck_open(aTHX_ a)
+#define ck_repeat(a)		Perl_ck_repeat(aTHX_ a)
+#define ck_require(a)		Perl_ck_require(aTHX_ a)
+#define ck_return(a)		Perl_ck_return(aTHX_ a)
+#define ck_rfun(a)		Perl_ck_rfun(aTHX_ a)
+#define ck_rvconst(a)		Perl_ck_rvconst(aTHX_ a)
+#define ck_sassign(a)		Perl_ck_sassign(aTHX_ a)
+#define ck_select(a)		Perl_ck_select(aTHX_ a)
+#define ck_shift(a)		Perl_ck_shift(aTHX_ a)
+#define ck_sort(a)		Perl_ck_sort(aTHX_ a)
+#define ck_spair(a)		Perl_ck_spair(aTHX_ a)
+#define ck_split(a)		Perl_ck_split(aTHX_ a)
+#define ck_subr(a)		Perl_ck_subr(aTHX_ a)
+#define ck_substr(a)		Perl_ck_substr(aTHX_ a)
+#define ck_svconst(a)		Perl_ck_svconst(aTHX_ a)
+#define ck_trunc(a)		Perl_ck_trunc(aTHX_ a)
+#endif
+#define is_utf8_string_loclen(a,b,c,d)	Perl_is_utf8_string_loclen(aTHX_ a,b,c,d)
+#define newSVhek(a)		Perl_newSVhek(aTHX_ a)
+#define stashpv_hvname_match(a,b)	Perl_stashpv_hvname_match(aTHX_ a,b)
+#ifdef PERL_CORE
+#define offer_nice_chunk(a,b)	Perl_offer_nice_chunk(aTHX_ a,b)
+#endif
+#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+#ifdef PERL_CORE
+#define dump_sv_child(a)	Perl_dump_sv_child(aTHX_ a)
+#endif
+#endif
+#ifdef PERL_DONT_CREATE_GVSV
+#define gv_SVadd(a)		Perl_gv_SVadd(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define my_clearenv()		Perl_my_clearenv(aTHX)
+#endif
+#define ck_anoncode(a)		Perl_ck_anoncode(aTHX_ a)
+#define ck_bitop(a)		Perl_ck_bitop(aTHX_ a)
+#define ck_concat(a)		Perl_ck_concat(aTHX_ a)
+#define ck_defined(a)		Perl_ck_defined(aTHX_ a)
+#define ck_delete(a)		Perl_ck_delete(aTHX_ a)
+#define ck_die(a)		Perl_ck_die(aTHX_ a)
+#define ck_eof(a)		Perl_ck_eof(aTHX_ a)
+#define ck_eval(a)		Perl_ck_eval(aTHX_ a)
+#define ck_exec(a)		Perl_ck_exec(aTHX_ a)
+#define ck_exists(a)		Perl_ck_exists(aTHX_ a)
+#define ck_exit(a)		Perl_ck_exit(aTHX_ a)
+#define ck_ftst(a)		Perl_ck_ftst(aTHX_ a)
+#define ck_fun(a)		Perl_ck_fun(aTHX_ a)
+#define ck_glob(a)		Perl_ck_glob(aTHX_ a)
+#define ck_grep(a)		Perl_ck_grep(aTHX_ a)
+#define ck_index(a)		Perl_ck_index(aTHX_ a)
+#define ck_join(a)		Perl_ck_join(aTHX_ a)
+#define ck_lengthconst(a)	Perl_ck_lengthconst(aTHX_ a)
+#define ck_lfun(a)		Perl_ck_lfun(aTHX_ a)
+#define ck_listiob(a)		Perl_ck_listiob(aTHX_ a)
+#define ck_match(a)		Perl_ck_match(aTHX_ a)
+#define ck_method(a)		Perl_ck_method(aTHX_ a)
+#define ck_null(a)		Perl_ck_null(aTHX_ a)
+#define ck_open(a)		Perl_ck_open(aTHX_ a)
+#define ck_repeat(a)		Perl_ck_repeat(aTHX_ a)
+#define ck_require(a)		Perl_ck_require(aTHX_ a)
+#define ck_return(a)		Perl_ck_return(aTHX_ a)
+#define ck_rfun(a)		Perl_ck_rfun(aTHX_ a)
+#define ck_rvconst(a)		Perl_ck_rvconst(aTHX_ a)
+#define ck_sassign(a)		Perl_ck_sassign(aTHX_ a)
+#define ck_select(a)		Perl_ck_select(aTHX_ a)
+#define ck_shift(a)		Perl_ck_shift(aTHX_ a)
+#define ck_sort(a)		Perl_ck_sort(aTHX_ a)
+#define ck_spair(a)		Perl_ck_spair(aTHX_ a)
+#define ck_split(a)		Perl_ck_split(aTHX_ a)
+#define ck_subr(a)		Perl_ck_subr(aTHX_ a)
+#define ck_substr(a)		Perl_ck_substr(aTHX_ a)
+#define ck_svconst(a)		Perl_ck_svconst(aTHX_ a)
+#define ck_trunc(a)		Perl_ck_trunc(aTHX_ a)
+#define pp_aassign()		Perl_pp_aassign(aTHX)
+#define pp_abs()		Perl_pp_abs(aTHX)
+#define pp_accept()		Perl_pp_accept(aTHX)
+#define pp_add()		Perl_pp_add(aTHX)
+#define pp_aelem()		Perl_pp_aelem(aTHX)
+#define pp_aelemfast()		Perl_pp_aelemfast(aTHX)
+#define pp_alarm()		Perl_pp_alarm(aTHX)
+#define pp_and()		Perl_pp_and(aTHX)
+#define pp_andassign()		Perl_pp_andassign(aTHX)
+#define pp_anoncode()		Perl_pp_anoncode(aTHX)
+#define pp_anonhash()		Perl_pp_anonhash(aTHX)
+#define pp_anonlist()		Perl_pp_anonlist(aTHX)
+#define pp_aslice()		Perl_pp_aslice(aTHX)
+#define pp_atan2()		Perl_pp_atan2(aTHX)
+#define pp_av2arylen()		Perl_pp_av2arylen(aTHX)
+#define pp_backtick()		Perl_pp_backtick(aTHX)
+#define pp_bind()		Perl_pp_bind(aTHX)
+#define pp_binmode()		Perl_pp_binmode(aTHX)
+#define pp_bit_and()		Perl_pp_bit_and(aTHX)
+#define pp_bit_or()		Perl_pp_bit_or(aTHX)
+#define pp_bit_xor()		Perl_pp_bit_xor(aTHX)
+#define pp_bless()		Perl_pp_bless(aTHX)
+#define pp_caller()		Perl_pp_caller(aTHX)
+#define pp_chdir()		Perl_pp_chdir(aTHX)
+#define pp_chmod()		Perl_pp_chmod(aTHX)
+#define pp_chomp()		Perl_pp_chomp(aTHX)
+#define pp_chop()		Perl_pp_chop(aTHX)
+#define pp_chown()		Perl_pp_chown(aTHX)
+#define pp_chr()		Perl_pp_chr(aTHX)
+#define pp_chroot()		Perl_pp_chroot(aTHX)
+#define pp_close()		Perl_pp_close(aTHX)
+#define pp_closedir()		Perl_pp_closedir(aTHX)
+#define pp_complement()		Perl_pp_complement(aTHX)
+#define pp_concat()		Perl_pp_concat(aTHX)
+#define pp_cond_expr()		Perl_pp_cond_expr(aTHX)
+#define pp_connect()		Perl_pp_connect(aTHX)
+#define pp_const()		Perl_pp_const(aTHX)
+#define pp_cos()		Perl_pp_cos(aTHX)
+#define pp_crypt()		Perl_pp_crypt(aTHX)
+#define pp_dbmclose()		Perl_pp_dbmclose(aTHX)
+#define pp_dbmopen()		Perl_pp_dbmopen(aTHX)
+#define pp_dbstate()		Perl_pp_dbstate(aTHX)
+#define pp_defined()		Perl_pp_defined(aTHX)
+#define pp_delete()		Perl_pp_delete(aTHX)
+#define pp_die()		Perl_pp_die(aTHX)
+#define pp_divide()		Perl_pp_divide(aTHX)
+#define pp_dofile()		Perl_pp_dofile(aTHX)
+#define pp_dump()		Perl_pp_dump(aTHX)
+#define pp_each()		Perl_pp_each(aTHX)
+#define pp_egrent()		Perl_pp_egrent(aTHX)
+#define pp_ehostent()		Perl_pp_ehostent(aTHX)
+#define pp_enetent()		Perl_pp_enetent(aTHX)
+#define pp_enter()		Perl_pp_enter(aTHX)
+#define pp_entereval()		Perl_pp_entereval(aTHX)
+#define pp_enteriter()		Perl_pp_enteriter(aTHX)
+#define pp_enterloop()		Perl_pp_enterloop(aTHX)
+#define pp_entersub()		Perl_pp_entersub(aTHX)
+#define pp_entertry()		Perl_pp_entertry(aTHX)
+#define pp_enterwrite()		Perl_pp_enterwrite(aTHX)
+#define pp_eof()		Perl_pp_eof(aTHX)
+#define pp_eprotoent()		Perl_pp_eprotoent(aTHX)
+#define pp_epwent()		Perl_pp_epwent(aTHX)
+#define pp_eq()			Perl_pp_eq(aTHX)
+#define pp_eservent()		Perl_pp_eservent(aTHX)
+#define pp_exec()		Perl_pp_exec(aTHX)
+#define pp_exists()		Perl_pp_exists(aTHX)
+#define pp_exit()		Perl_pp_exit(aTHX)
+#define pp_exp()		Perl_pp_exp(aTHX)
+#define pp_fcntl()		Perl_pp_fcntl(aTHX)
+#define pp_fileno()		Perl_pp_fileno(aTHX)
+#define pp_flip()		Perl_pp_flip(aTHX)
+#define pp_flock()		Perl_pp_flock(aTHX)
+#define pp_flop()		Perl_pp_flop(aTHX)
+#define pp_fork()		Perl_pp_fork(aTHX)
+#define pp_formline()		Perl_pp_formline(aTHX)
+#define pp_ftatime()		Perl_pp_ftatime(aTHX)
+#define pp_ftbinary()		Perl_pp_ftbinary(aTHX)
+#define pp_ftblk()		Perl_pp_ftblk(aTHX)
+#define pp_ftchr()		Perl_pp_ftchr(aTHX)
+#define pp_ftctime()		Perl_pp_ftctime(aTHX)
+#define pp_ftdir()		Perl_pp_ftdir(aTHX)
+#define pp_fteexec()		Perl_pp_fteexec(aTHX)
+#define pp_fteowned()		Perl_pp_fteowned(aTHX)
+#define pp_fteread()		Perl_pp_fteread(aTHX)
+#define pp_ftewrite()		Perl_pp_ftewrite(aTHX)
+#define pp_ftfile()		Perl_pp_ftfile(aTHX)
+#define pp_ftis()		Perl_pp_ftis(aTHX)
+#define pp_ftlink()		Perl_pp_ftlink(aTHX)
+#define pp_ftmtime()		Perl_pp_ftmtime(aTHX)
+#define pp_ftpipe()		Perl_pp_ftpipe(aTHX)
+#define pp_ftrexec()		Perl_pp_ftrexec(aTHX)
+#define pp_ftrowned()		Perl_pp_ftrowned(aTHX)
+#define pp_ftrread()		Perl_pp_ftrread(aTHX)
+#define pp_ftrwrite()		Perl_pp_ftrwrite(aTHX)
+#define pp_ftsgid()		Perl_pp_ftsgid(aTHX)
+#define pp_ftsize()		Perl_pp_ftsize(aTHX)
+#define pp_ftsock()		Perl_pp_ftsock(aTHX)
+#define pp_ftsuid()		Perl_pp_ftsuid(aTHX)
+#define pp_ftsvtx()		Perl_pp_ftsvtx(aTHX)
+#define pp_fttext()		Perl_pp_fttext(aTHX)
+#define pp_fttty()		Perl_pp_fttty(aTHX)
+#define pp_ftzero()		Perl_pp_ftzero(aTHX)
+#define pp_ge()			Perl_pp_ge(aTHX)
+#define pp_gelem()		Perl_pp_gelem(aTHX)
+#define pp_getc()		Perl_pp_getc(aTHX)
+#define pp_getlogin()		Perl_pp_getlogin(aTHX)
+#define pp_getpeername()	Perl_pp_getpeername(aTHX)
+#define pp_getpgrp()		Perl_pp_getpgrp(aTHX)
+#define pp_getppid()		Perl_pp_getppid(aTHX)
+#define pp_getpriority()	Perl_pp_getpriority(aTHX)
+#define pp_getsockname()	Perl_pp_getsockname(aTHX)
+#define pp_ggrent()		Perl_pp_ggrent(aTHX)
+#define pp_ggrgid()		Perl_pp_ggrgid(aTHX)
+#define pp_ggrnam()		Perl_pp_ggrnam(aTHX)
+#define pp_ghbyaddr()		Perl_pp_ghbyaddr(aTHX)
+#define pp_ghbyname()		Perl_pp_ghbyname(aTHX)
+#define pp_ghostent()		Perl_pp_ghostent(aTHX)
+#define pp_glob()		Perl_pp_glob(aTHX)
+#define pp_gmtime()		Perl_pp_gmtime(aTHX)
+#define pp_gnbyaddr()		Perl_pp_gnbyaddr(aTHX)
+#define pp_gnbyname()		Perl_pp_gnbyname(aTHX)
+#define pp_gnetent()		Perl_pp_gnetent(aTHX)
+#define pp_goto()		Perl_pp_goto(aTHX)
+#define pp_gpbyname()		Perl_pp_gpbyname(aTHX)
+#define pp_gpbynumber()		Perl_pp_gpbynumber(aTHX)
+#define pp_gprotoent()		Perl_pp_gprotoent(aTHX)
+#define pp_gpwent()		Perl_pp_gpwent(aTHX)
+#define pp_gpwnam()		Perl_pp_gpwnam(aTHX)
+#define pp_gpwuid()		Perl_pp_gpwuid(aTHX)
+#define pp_grepstart()		Perl_pp_grepstart(aTHX)
+#define pp_grepwhile()		Perl_pp_grepwhile(aTHX)
+#define pp_gsbyname()		Perl_pp_gsbyname(aTHX)
+#define pp_gsbyport()		Perl_pp_gsbyport(aTHX)
+#define pp_gservent()		Perl_pp_gservent(aTHX)
+#define pp_gsockopt()		Perl_pp_gsockopt(aTHX)
+#define pp_gt()			Perl_pp_gt(aTHX)
+#define pp_gv()			Perl_pp_gv(aTHX)
+#define pp_gvsv()		Perl_pp_gvsv(aTHX)
+#define pp_helem()		Perl_pp_helem(aTHX)
+#define pp_hex()		Perl_pp_hex(aTHX)
+#define pp_hslice()		Perl_pp_hslice(aTHX)
+#define pp_i_add()		Perl_pp_i_add(aTHX)
+#define pp_i_divide()		Perl_pp_i_divide(aTHX)
+#define pp_i_eq()		Perl_pp_i_eq(aTHX)
+#define pp_i_ge()		Perl_pp_i_ge(aTHX)
+#define pp_i_gt()		Perl_pp_i_gt(aTHX)
+#define pp_i_le()		Perl_pp_i_le(aTHX)
+#define pp_i_lt()		Perl_pp_i_lt(aTHX)
+#define pp_i_modulo()		Perl_pp_i_modulo(aTHX)
+#define pp_i_multiply()		Perl_pp_i_multiply(aTHX)
+#define pp_i_ncmp()		Perl_pp_i_ncmp(aTHX)
+#define pp_i_ne()		Perl_pp_i_ne(aTHX)
+#define pp_i_negate()		Perl_pp_i_negate(aTHX)
+#define pp_i_subtract()		Perl_pp_i_subtract(aTHX)
+#define pp_index()		Perl_pp_index(aTHX)
+#define pp_int()		Perl_pp_int(aTHX)
+#define pp_ioctl()		Perl_pp_ioctl(aTHX)
+#define pp_iter()		Perl_pp_iter(aTHX)
+#define pp_join()		Perl_pp_join(aTHX)
+#define pp_keys()		Perl_pp_keys(aTHX)
+#define pp_kill()		Perl_pp_kill(aTHX)
+#define pp_last()		Perl_pp_last(aTHX)
+#define pp_lc()			Perl_pp_lc(aTHX)
+#define pp_lcfirst()		Perl_pp_lcfirst(aTHX)
+#define pp_le()			Perl_pp_le(aTHX)
+#define pp_leave()		Perl_pp_leave(aTHX)
+#define pp_leaveeval()		Perl_pp_leaveeval(aTHX)
+#define pp_leaveloop()		Perl_pp_leaveloop(aTHX)
+#define pp_leavesub()		Perl_pp_leavesub(aTHX)
+#define pp_leavesublv()		Perl_pp_leavesublv(aTHX)
+#define pp_leavetry()		Perl_pp_leavetry(aTHX)
+#define pp_leavewrite()		Perl_pp_leavewrite(aTHX)
+#define pp_left_shift()		Perl_pp_left_shift(aTHX)
+#define pp_length()		Perl_pp_length(aTHX)
+#define pp_lineseq()		Perl_pp_lineseq(aTHX)
+#define pp_link()		Perl_pp_link(aTHX)
+#define pp_list()		Perl_pp_list(aTHX)
+#define pp_listen()		Perl_pp_listen(aTHX)
+#define pp_localtime()		Perl_pp_localtime(aTHX)
+#define pp_lock()		Perl_pp_lock(aTHX)
+#define pp_log()		Perl_pp_log(aTHX)
+#define pp_lslice()		Perl_pp_lslice(aTHX)
+#define pp_lstat()		Perl_pp_lstat(aTHX)
+#define pp_lt()			Perl_pp_lt(aTHX)
+#define pp_mapstart()		Perl_pp_mapstart(aTHX)
+#define pp_mapwhile()		Perl_pp_mapwhile(aTHX)
+#define pp_match()		Perl_pp_match(aTHX)
+#define pp_method()		Perl_pp_method(aTHX)
+#define pp_method_named()	Perl_pp_method_named(aTHX)
+#define pp_mkdir()		Perl_pp_mkdir(aTHX)
+#define pp_modulo()		Perl_pp_modulo(aTHX)
+#define pp_msgctl()		Perl_pp_msgctl(aTHX)
+#define pp_msgget()		Perl_pp_msgget(aTHX)
+#define pp_msgrcv()		Perl_pp_msgrcv(aTHX)
+#define pp_msgsnd()		Perl_pp_msgsnd(aTHX)
+#define pp_multiply()		Perl_pp_multiply(aTHX)
+#define pp_ncmp()		Perl_pp_ncmp(aTHX)
+#define pp_ne()			Perl_pp_ne(aTHX)
+#define pp_negate()		Perl_pp_negate(aTHX)
+#define pp_next()		Perl_pp_next(aTHX)
+#define pp_nextstate()		Perl_pp_nextstate(aTHX)
+#define pp_not()		Perl_pp_not(aTHX)
+#define pp_null()		Perl_pp_null(aTHX)
+#define pp_oct()		Perl_pp_oct(aTHX)
+#define pp_open()		Perl_pp_open(aTHX)
+#define pp_open_dir()		Perl_pp_open_dir(aTHX)
+#define pp_or()			Perl_pp_or(aTHX)
+#define pp_orassign()		Perl_pp_orassign(aTHX)
+#define pp_ord()		Perl_pp_ord(aTHX)
+#define pp_pack()		Perl_pp_pack(aTHX)
+#define pp_padany()		Perl_pp_padany(aTHX)
+#define pp_padav()		Perl_pp_padav(aTHX)
+#define pp_padhv()		Perl_pp_padhv(aTHX)
+#define pp_padsv()		Perl_pp_padsv(aTHX)
+#define pp_pipe_op()		Perl_pp_pipe_op(aTHX)
+#define pp_pop()		Perl_pp_pop(aTHX)
+#define pp_pos()		Perl_pp_pos(aTHX)
+#define pp_postdec()		Perl_pp_postdec(aTHX)
+#define pp_postinc()		Perl_pp_postinc(aTHX)
+#define pp_pow()		Perl_pp_pow(aTHX)
+#define pp_predec()		Perl_pp_predec(aTHX)
+#define pp_preinc()		Perl_pp_preinc(aTHX)
+#define pp_print()		Perl_pp_print(aTHX)
+#define pp_prototype()		Perl_pp_prototype(aTHX)
+#define pp_prtf()		Perl_pp_prtf(aTHX)
+#define pp_push()		Perl_pp_push(aTHX)
+#define pp_pushmark()		Perl_pp_pushmark(aTHX)
+#define pp_pushre()		Perl_pp_pushre(aTHX)
+#define pp_qr()			Perl_pp_qr(aTHX)
+#define pp_quotemeta()		Perl_pp_quotemeta(aTHX)
+#define pp_rand()		Perl_pp_rand(aTHX)
+#define pp_range()		Perl_pp_range(aTHX)
+#define pp_rcatline()		Perl_pp_rcatline(aTHX)
+#define pp_read()		Perl_pp_read(aTHX)
+#define pp_readdir()		Perl_pp_readdir(aTHX)
+#define pp_readline()		Perl_pp_readline(aTHX)
+#define pp_readlink()		Perl_pp_readlink(aTHX)
+#define pp_recv()		Perl_pp_recv(aTHX)
+#define pp_redo()		Perl_pp_redo(aTHX)
+#define pp_ref()		Perl_pp_ref(aTHX)
+#define pp_refgen()		Perl_pp_refgen(aTHX)
+#define pp_regcmaybe()		Perl_pp_regcmaybe(aTHX)
+#define pp_regcomp()		Perl_pp_regcomp(aTHX)
+#define pp_regcreset()		Perl_pp_regcreset(aTHX)
+#define pp_rename()		Perl_pp_rename(aTHX)
+#define pp_repeat()		Perl_pp_repeat(aTHX)
+#define pp_require()		Perl_pp_require(aTHX)
+#define pp_reset()		Perl_pp_reset(aTHX)
+#define pp_return()		Perl_pp_return(aTHX)
+#define pp_reverse()		Perl_pp_reverse(aTHX)
+#define pp_rewinddir()		Perl_pp_rewinddir(aTHX)
+#define pp_right_shift()	Perl_pp_right_shift(aTHX)
+#define pp_rindex()		Perl_pp_rindex(aTHX)
+#define pp_rmdir()		Perl_pp_rmdir(aTHX)
+#define pp_rv2av()		Perl_pp_rv2av(aTHX)
+#define pp_rv2cv()		Perl_pp_rv2cv(aTHX)
+#define pp_rv2gv()		Perl_pp_rv2gv(aTHX)
+#define pp_rv2hv()		Perl_pp_rv2hv(aTHX)
+#define pp_rv2sv()		Perl_pp_rv2sv(aTHX)
+#define pp_sassign()		Perl_pp_sassign(aTHX)
+#define pp_scalar()		Perl_pp_scalar(aTHX)
+#define pp_schomp()		Perl_pp_schomp(aTHX)
+#define pp_schop()		Perl_pp_schop(aTHX)
+#define pp_scmp()		Perl_pp_scmp(aTHX)
+#define pp_scope()		Perl_pp_scope(aTHX)
+#define pp_seek()		Perl_pp_seek(aTHX)
+#define pp_seekdir()		Perl_pp_seekdir(aTHX)
+#define pp_select()		Perl_pp_select(aTHX)
+#define pp_semctl()		Perl_pp_semctl(aTHX)
+#define pp_semget()		Perl_pp_semget(aTHX)
+#define pp_semop()		Perl_pp_semop(aTHX)
+#define pp_send()		Perl_pp_send(aTHX)
+#define pp_seq()		Perl_pp_seq(aTHX)
+#define pp_setpgrp()		Perl_pp_setpgrp(aTHX)
+#define pp_setpriority()	Perl_pp_setpriority(aTHX)
+#define pp_setstate()		Perl_pp_setstate(aTHX)
+#define pp_sge()		Perl_pp_sge(aTHX)
+#define pp_sgrent()		Perl_pp_sgrent(aTHX)
+#define pp_sgt()		Perl_pp_sgt(aTHX)
+#define pp_shift()		Perl_pp_shift(aTHX)
+#define pp_shmctl()		Perl_pp_shmctl(aTHX)
+#define pp_shmget()		Perl_pp_shmget(aTHX)
+#define pp_shmread()		Perl_pp_shmread(aTHX)
+#define pp_shmwrite()		Perl_pp_shmwrite(aTHX)
+#define pp_shostent()		Perl_pp_shostent(aTHX)
+#define pp_shutdown()		Perl_pp_shutdown(aTHX)
+#define pp_sin()		Perl_pp_sin(aTHX)
+#define pp_sle()		Perl_pp_sle(aTHX)
+#define pp_sleep()		Perl_pp_sleep(aTHX)
+#define pp_slt()		Perl_pp_slt(aTHX)
+#define pp_sne()		Perl_pp_sne(aTHX)
+#define pp_snetent()		Perl_pp_snetent(aTHX)
+#define pp_socket()		Perl_pp_socket(aTHX)
+#define pp_sockpair()		Perl_pp_sockpair(aTHX)
+#define pp_sort()		Perl_pp_sort(aTHX)
+#define pp_splice()		Perl_pp_splice(aTHX)
+#define pp_split()		Perl_pp_split(aTHX)
+#define pp_sprintf()		Perl_pp_sprintf(aTHX)
+#define pp_sprotoent()		Perl_pp_sprotoent(aTHX)
+#define pp_spwent()		Perl_pp_spwent(aTHX)
+#define pp_sqrt()		Perl_pp_sqrt(aTHX)
+#define pp_srand()		Perl_pp_srand(aTHX)
+#define pp_srefgen()		Perl_pp_srefgen(aTHX)
+#define pp_sselect()		Perl_pp_sselect(aTHX)
+#define pp_sservent()		Perl_pp_sservent(aTHX)
+#define pp_ssockopt()		Perl_pp_ssockopt(aTHX)
+#define pp_stat()		Perl_pp_stat(aTHX)
+#define pp_stringify()		Perl_pp_stringify(aTHX)
+#define pp_stub()		Perl_pp_stub(aTHX)
+#define pp_study()		Perl_pp_study(aTHX)
+#define pp_subst()		Perl_pp_subst(aTHX)
+#define pp_substcont()		Perl_pp_substcont(aTHX)
+#define pp_substr()		Perl_pp_substr(aTHX)
+#define pp_subtract()		Perl_pp_subtract(aTHX)
+#define pp_symlink()		Perl_pp_symlink(aTHX)
+#define pp_syscall()		Perl_pp_syscall(aTHX)
+#define pp_sysopen()		Perl_pp_sysopen(aTHX)
+#define pp_sysread()		Perl_pp_sysread(aTHX)
+#define pp_sysseek()		Perl_pp_sysseek(aTHX)
+#define pp_system()		Perl_pp_system(aTHX)
+#define pp_syswrite()		Perl_pp_syswrite(aTHX)
+#define pp_tell()		Perl_pp_tell(aTHX)
+#define pp_telldir()		Perl_pp_telldir(aTHX)
+#define pp_threadsv()		Perl_pp_threadsv(aTHX)
+#define pp_tie()		Perl_pp_tie(aTHX)
+#define pp_tied()		Perl_pp_tied(aTHX)
+#define pp_time()		Perl_pp_time(aTHX)
+#define pp_tms()		Perl_pp_tms(aTHX)
+#define pp_trans()		Perl_pp_trans(aTHX)
+#define pp_truncate()		Perl_pp_truncate(aTHX)
+#define pp_uc()			Perl_pp_uc(aTHX)
+#define pp_ucfirst()		Perl_pp_ucfirst(aTHX)
+#define pp_umask()		Perl_pp_umask(aTHX)
+#define pp_undef()		Perl_pp_undef(aTHX)
+#define pp_unlink()		Perl_pp_unlink(aTHX)
+#define pp_unpack()		Perl_pp_unpack(aTHX)
+#define pp_unshift()		Perl_pp_unshift(aTHX)
+#define pp_unstack()		Perl_pp_unstack(aTHX)
+#define pp_untie()		Perl_pp_untie(aTHX)
+#define pp_utime()		Perl_pp_utime(aTHX)
+#define pp_values()		Perl_pp_values(aTHX)
+#define pp_vec()		Perl_pp_vec(aTHX)
+#define pp_wait()		Perl_pp_wait(aTHX)
+#define pp_waitpid()		Perl_pp_waitpid(aTHX)
+#define pp_wantarray()		Perl_pp_wantarray(aTHX)
+#define pp_warn()		Perl_pp_warn(aTHX)
+#define pp_xor()		Perl_pp_xor(aTHX)
+
+#endif	/* PERL_IMPLICIT_CONTEXT */
+
+#endif	/* #ifndef PERL_NO_SHORT_NAMES */
+
+
+/* Compatibility stubs.  Compile extensions with -DPERL_NOCOMPAT to
+   disable them.
+ */
+
+#if !defined(PERL_CORE)
+#  define sv_setptrobj(rv,ptr,name)	sv_setref_iv(rv,name,PTR2IV(ptr))
+#  define sv_setptrref(rv,ptr)		sv_setref_iv(rv,Nullch,PTR2IV(ptr))
+#endif
+
+#if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
+
+/* Compatibility for various misnamed functions.  All functions
+   in the API that begin with "perl_" (not "Perl_") take an explicit
+   interpreter context pointer.
+   The following are not like that, but since they had a "perl_"
+   prefix in previous versions, we provide compatibility macros.
+ */
+#  define perl_atexit(a,b)		call_atexit(a,b)
+#  define perl_call_argv(a,b,c)		call_argv(a,b,c)
+#  define perl_call_pv(a,b)		call_pv(a,b)
+#  define perl_call_method(a,b)		call_method(a,b)
+#  define perl_call_sv(a,b)		call_sv(a,b)
+#  define perl_eval_sv(a,b)		eval_sv(a,b)
+#  define perl_eval_pv(a,b)		eval_pv(a,b)
+#  define perl_require_pv(a)		require_pv(a)
+#  define perl_get_sv(a,b)		get_sv(a,b)
+#  define perl_get_av(a,b)		get_av(a,b)
+#  define perl_get_hv(a,b)		get_hv(a,b)
+#  define perl_get_cv(a,b)		get_cv(a,b)
+#  define perl_init_i18nl10n(a)		init_i18nl10n(a)
+#  define perl_init_i18nl14n(a)		init_i18nl14n(a)
+#  define perl_new_ctype(a)		new_ctype(a)
+#  define perl_new_collate(a)		new_collate(a)
+#  define perl_new_numeric(a)		new_numeric(a)
+
+/* varargs functions can't be handled with CPP macros. :-(
+   This provides a set of compatibility functions that don't take
+   an extra argument but grab the context pointer using the macro
+   dTHX.
+ */
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_SHORT_NAMES)
+#  define croak				Perl_croak_nocontext
+#  define deb				Perl_deb_nocontext
+#  define die				Perl_die_nocontext
+#  define form				Perl_form_nocontext
+#  define load_module			Perl_load_module_nocontext
+#  define mess				Perl_mess_nocontext
+#  define newSVpvf			Perl_newSVpvf_nocontext
+#  define sv_catpvf			Perl_sv_catpvf_nocontext
+#  define sv_setpvf			Perl_sv_setpvf_nocontext
+#  define warn				Perl_warn_nocontext
+#  define warner			Perl_warner_nocontext
+#  define sv_catpvf_mg			Perl_sv_catpvf_mg_nocontext
+#  define sv_setpvf_mg			Perl_sv_setpvf_mg_nocontext
+#endif
+
+#endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
+
+#if !defined(PERL_IMPLICIT_CONTEXT)
+/* undefined symbols, point them back at the usual ones */
+#  define Perl_croak_nocontext		Perl_croak
+#  define Perl_die_nocontext		Perl_die
+#  define Perl_deb_nocontext		Perl_deb
+#  define Perl_form_nocontext		Perl_form
+#  define Perl_load_module_nocontext	Perl_load_module
+#  define Perl_mess_nocontext		Perl_mess
+#  define Perl_newSVpvf_nocontext	Perl_newSVpvf
+#  define Perl_sv_catpvf_nocontext	Perl_sv_catpvf
+#  define Perl_sv_setpvf_nocontext	Perl_sv_setpvf
+#  define Perl_warn_nocontext		Perl_warn
+#  define Perl_warner_nocontext		Perl_warner
+#  define Perl_sv_catpvf_mg_nocontext	Perl_sv_catpvf_mg
+#  define Perl_sv_setpvf_mg_nocontext	Perl_sv_setpvf_mg
+#endif
+
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/embedvar.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/embedvar.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/embedvar.h	(revision 14489)
@@ -0,0 +1,1513 @@
+/*  -*- buffer-read-only: t -*-
+ *
+ *    embedvar.h
+ *
+ *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ * This file is built by embed.pl from data in embed.fnc, embed.pl,
+ * pp.sym, intrpvar.h, perlvars.h and thrdvar.h.
+ * Any changes made here will be lost!
+ *
+ * Edit those files and run 'make regen_headers' to effect changes.
+ */
+
+/* (Doing namespace management portably in C is really gross.) */
+
+/*
+   The following combinations of MULTIPLICITY, USE_5005THREADS
+   and PERL_IMPLICIT_CONTEXT are supported:
+     1) none
+     2) MULTIPLICITY	# supported for compatibility
+     3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT
+     4) USE_5005THREADS && PERL_IMPLICIT_CONTEXT
+     5) MULTIPLICITY && USE_5005THREADS && PERL_IMPLICIT_CONTEXT
+
+   All other combinations of these flags are errors.
+
+   #3, #4, #5, and #6 are supported directly, while #2 is a special
+   case of #3 (supported by redefining vTHX appropriately).
+*/
+
+#if defined(MULTIPLICITY)
+/* cases 2, 3 and 5 above */
+
+#  if defined(PERL_IMPLICIT_CONTEXT)
+#    define vTHX	aTHX
+#  else
+#    define vTHX	PERL_GET_INTERP
+#  endif
+
+#define PL_Sv			(vTHX->TSv)
+#define PL_Xpv			(vTHX->TXpv)
+#define PL_av_fetch_sv		(vTHX->Tav_fetch_sv)
+#define PL_bodytarget		(vTHX->Tbodytarget)
+#define PL_bostr		(vTHX->Tbostr)
+#define PL_chopset		(vTHX->Tchopset)
+#define PL_colors		(vTHX->Tcolors)
+#define PL_colorset		(vTHX->Tcolorset)
+#define PL_comppad		(vTHX->Tcomppad)
+#define PL_curcop		(vTHX->Tcurcop)
+#define PL_curpad		(vTHX->Tcurpad)
+#define PL_curpm		(vTHX->Tcurpm)
+#define PL_curstack		(vTHX->Tcurstack)
+#define PL_curstackinfo		(vTHX->Tcurstackinfo)
+#define PL_curstash		(vTHX->Tcurstash)
+#define PL_defoutgv		(vTHX->Tdefoutgv)
+#define PL_defstash		(vTHX->Tdefstash)
+#define PL_delaymagic		(vTHX->Tdelaymagic)
+#define PL_dirty		(vTHX->Tdirty)
+#define PL_dumpindent		(vTHX->Tdumpindent)
+#define PL_efloatbuf		(vTHX->Tefloatbuf)
+#define PL_efloatsize		(vTHX->Tefloatsize)
+#define PL_errors		(vTHX->Terrors)
+#define PL_extralen		(vTHX->Textralen)
+#define PL_firstgv		(vTHX->Tfirstgv)
+#define PL_formtarget		(vTHX->Tformtarget)
+#define PL_hv_fetch_ent_mh	(vTHX->Thv_fetch_ent_mh)
+#define PL_hv_fetch_sv		(vTHX->Thv_fetch_sv)
+#define PL_in_eval		(vTHX->Tin_eval)
+#define PL_last_in_gv		(vTHX->Tlast_in_gv)
+#define PL_lastgotoprobe	(vTHX->Tlastgotoprobe)
+#define PL_lastscream		(vTHX->Tlastscream)
+#define PL_localizing		(vTHX->Tlocalizing)
+#define PL_mainstack		(vTHX->Tmainstack)
+#define PL_markstack		(vTHX->Tmarkstack)
+#define PL_markstack_max	(vTHX->Tmarkstack_max)
+#define PL_markstack_ptr	(vTHX->Tmarkstack_ptr)
+#define PL_maxscream		(vTHX->Tmaxscream)
+#define PL_modcount		(vTHX->Tmodcount)
+#define PL_na			(vTHX->Tna)
+#define PL_nrs			(vTHX->Tnrs)
+#define PL_ofs_sv		(vTHX->Tofs_sv)
+#define PL_op			(vTHX->Top)
+#define PL_opsave		(vTHX->Topsave)
+#define PL_peepp		(vTHX->Tpeepp)
+#define PL_protect		(vTHX->Tprotect)
+#define PL_reg_call_cc		(vTHX->Treg_call_cc)
+#define PL_reg_curpm		(vTHX->Treg_curpm)
+#define PL_reg_eval_set		(vTHX->Treg_eval_set)
+#define PL_reg_flags		(vTHX->Treg_flags)
+#define PL_reg_ganch		(vTHX->Treg_ganch)
+#define PL_reg_leftiter		(vTHX->Treg_leftiter)
+#define PL_reg_magic		(vTHX->Treg_magic)
+#define PL_reg_match_utf8	(vTHX->Treg_match_utf8)
+#define PL_reg_maxiter		(vTHX->Treg_maxiter)
+#define PL_reg_oldcurpm		(vTHX->Treg_oldcurpm)
+#define PL_reg_oldpos		(vTHX->Treg_oldpos)
+#define PL_reg_oldsaved		(vTHX->Treg_oldsaved)
+#define PL_reg_oldsavedlen	(vTHX->Treg_oldsavedlen)
+#define PL_reg_poscache		(vTHX->Treg_poscache)
+#define PL_reg_poscache_size	(vTHX->Treg_poscache_size)
+#define PL_reg_re		(vTHX->Treg_re)
+#define PL_reg_start_tmp	(vTHX->Treg_start_tmp)
+#define PL_reg_start_tmpl	(vTHX->Treg_start_tmpl)
+#define PL_reg_starttry		(vTHX->Treg_starttry)
+#define PL_reg_sv		(vTHX->Treg_sv)
+#define PL_reg_whilem_seen	(vTHX->Treg_whilem_seen)
+#define PL_regbol		(vTHX->Tregbol)
+#define PL_regcc		(vTHX->Tregcc)
+#define PL_regcode		(vTHX->Tregcode)
+#define PL_regcomp_parse	(vTHX->Tregcomp_parse)
+#define PL_regcomp_rx		(vTHX->Tregcomp_rx)
+#define PL_regcompat1		(vTHX->Tregcompat1)
+#define PL_regcompp		(vTHX->Tregcompp)
+#define PL_regdata		(vTHX->Tregdata)
+#define PL_regdummy		(vTHX->Tregdummy)
+#define PL_regendp		(vTHX->Tregendp)
+#define PL_regeol		(vTHX->Tregeol)
+#define PL_regexecp		(vTHX->Tregexecp)
+#define PL_regflags		(vTHX->Tregflags)
+#define PL_regfree		(vTHX->Tregfree)
+#define PL_regindent		(vTHX->Tregindent)
+#define PL_reginput		(vTHX->Treginput)
+#define PL_regint_start		(vTHX->Tregint_start)
+#define PL_regint_string	(vTHX->Tregint_string)
+#define PL_reginterp_cnt	(vTHX->Treginterp_cnt)
+#define PL_reglastcloseparen	(vTHX->Treglastcloseparen)
+#define PL_reglastparen		(vTHX->Treglastparen)
+#define PL_regnarrate		(vTHX->Tregnarrate)
+#define PL_regnaughty		(vTHX->Tregnaughty)
+#define PL_regnpar		(vTHX->Tregnpar)
+#define PL_regprecomp		(vTHX->Tregprecomp)
+#define PL_regprogram		(vTHX->Tregprogram)
+#define PL_regsawback		(vTHX->Tregsawback)
+#define PL_regseen		(vTHX->Tregseen)
+#define PL_regsize		(vTHX->Tregsize)
+#define PL_regstartp		(vTHX->Tregstartp)
+#define PL_regtill		(vTHX->Tregtill)
+#define PL_regxend		(vTHX->Tregxend)
+#define PL_restartop		(vTHX->Trestartop)
+#define PL_retstack		(vTHX->Tretstack)
+#define PL_retstack_ix		(vTHX->Tretstack_ix)
+#define PL_retstack_max		(vTHX->Tretstack_max)
+#define PL_rs			(vTHX->Trs)
+#define PL_savestack		(vTHX->Tsavestack)
+#define PL_savestack_ix		(vTHX->Tsavestack_ix)
+#define PL_savestack_max	(vTHX->Tsavestack_max)
+#define PL_scopestack		(vTHX->Tscopestack)
+#define PL_scopestack_ix	(vTHX->Tscopestack_ix)
+#define PL_scopestack_max	(vTHX->Tscopestack_max)
+#define PL_screamfirst		(vTHX->Tscreamfirst)
+#define PL_screamnext		(vTHX->Tscreamnext)
+#define PL_secondgv		(vTHX->Tsecondgv)
+#define PL_seen_evals		(vTHX->Tseen_evals)
+#define PL_seen_zerolen		(vTHX->Tseen_zerolen)
+#define PL_sortcop		(vTHX->Tsortcop)
+#define PL_sortcxix		(vTHX->Tsortcxix)
+#define PL_sortstash		(vTHX->Tsortstash)
+#define PL_stack_base		(vTHX->Tstack_base)
+#define PL_stack_max		(vTHX->Tstack_max)
+#define PL_stack_sp		(vTHX->Tstack_sp)
+#define PL_start_env		(vTHX->Tstart_env)
+#define PL_statbuf		(vTHX->Tstatbuf)
+#define PL_statcache		(vTHX->Tstatcache)
+#define PL_statgv		(vTHX->Tstatgv)
+#define PL_statname		(vTHX->Tstatname)
+#define PL_tainted		(vTHX->Ttainted)
+#define PL_timesbuf		(vTHX->Ttimesbuf)
+#define PL_tmps_floor		(vTHX->Ttmps_floor)
+#define PL_tmps_ix		(vTHX->Ttmps_ix)
+#define PL_tmps_max		(vTHX->Ttmps_max)
+#define PL_tmps_stack		(vTHX->Ttmps_stack)
+#define PL_top_env		(vTHX->Ttop_env)
+#define PL_toptarget		(vTHX->Ttoptarget)
+#define PL_watchaddr		(vTHX->Twatchaddr)
+#define PL_watchok		(vTHX->Twatchok)
+
+#  if defined(USE_5005THREADS)
+/* case 5 above */
+
+#define PL_Argv			(PERL_GET_INTERP->IArgv)
+#define PL_BINCOMPAT0		(PERL_GET_INTERP->IBINCOMPAT0)
+#define PL_Cmd			(PERL_GET_INTERP->ICmd)
+#define PL_DBcv			(PERL_GET_INTERP->IDBcv)
+#define PL_DBgv			(PERL_GET_INTERP->IDBgv)
+#define PL_DBline		(PERL_GET_INTERP->IDBline)
+#define PL_DBsignal		(PERL_GET_INTERP->IDBsignal)
+#define PL_DBsingle		(PERL_GET_INTERP->IDBsingle)
+#define PL_DBsub		(PERL_GET_INTERP->IDBsub)
+#define PL_DBtrace		(PERL_GET_INTERP->IDBtrace)
+#define PL_Dir			(PERL_GET_INTERP->IDir)
+#define PL_Env			(PERL_GET_INTERP->IEnv)
+#define PL_LIO			(PERL_GET_INTERP->ILIO)
+#define PL_Mem			(PERL_GET_INTERP->IMem)
+#define PL_MemParse		(PERL_GET_INTERP->IMemParse)
+#define PL_MemShared		(PERL_GET_INTERP->IMemShared)
+#define PL_OpPtr		(PERL_GET_INTERP->IOpPtr)
+#define PL_OpSlab		(PERL_GET_INTERP->IOpSlab)
+#define PL_OpSpace		(PERL_GET_INTERP->IOpSpace)
+#define PL_Proc			(PERL_GET_INTERP->IProc)
+#define PL_Sock			(PERL_GET_INTERP->ISock)
+#define PL_StdIO		(PERL_GET_INTERP->IStdIO)
+#define PL_amagic_generation	(PERL_GET_INTERP->Iamagic_generation)
+#define PL_an			(PERL_GET_INTERP->Ian)
+#define PL_argvgv		(PERL_GET_INTERP->Iargvgv)
+#define PL_argvout_stack	(PERL_GET_INTERP->Iargvout_stack)
+#define PL_argvoutgv		(PERL_GET_INTERP->Iargvoutgv)
+#define PL_basetime		(PERL_GET_INTERP->Ibasetime)
+#define PL_beginav		(PERL_GET_INTERP->Ibeginav)
+#define PL_beginav_save		(PERL_GET_INTERP->Ibeginav_save)
+#define PL_bitcount		(PERL_GET_INTERP->Ibitcount)
+#define PL_bufend		(PERL_GET_INTERP->Ibufend)
+#define PL_bufptr		(PERL_GET_INTERP->Ibufptr)
+#define PL_checkav		(PERL_GET_INTERP->Icheckav)
+#define PL_checkav_save		(PERL_GET_INTERP->Icheckav_save)
+#define PL_clocktick		(PERL_GET_INTERP->Iclocktick)
+#define PL_collation_ix		(PERL_GET_INTERP->Icollation_ix)
+#define PL_collation_name	(PERL_GET_INTERP->Icollation_name)
+#define PL_collation_standard	(PERL_GET_INTERP->Icollation_standard)
+#define PL_collxfrm_base	(PERL_GET_INTERP->Icollxfrm_base)
+#define PL_collxfrm_mult	(PERL_GET_INTERP->Icollxfrm_mult)
+#define PL_compcv		(PERL_GET_INTERP->Icompcv)
+#define PL_compiling		(PERL_GET_INTERP->Icompiling)
+#define PL_comppad_name		(PERL_GET_INTERP->Icomppad_name)
+#define PL_comppad_name_fill	(PERL_GET_INTERP->Icomppad_name_fill)
+#define PL_comppad_name_floor	(PERL_GET_INTERP->Icomppad_name_floor)
+#define PL_cop_seqmax		(PERL_GET_INTERP->Icop_seqmax)
+#define PL_copline		(PERL_GET_INTERP->Icopline)
+#define PL_cred_mutex		(PERL_GET_INTERP->Icred_mutex)
+#define PL_cryptseen		(PERL_GET_INTERP->Icryptseen)
+#define PL_cshlen		(PERL_GET_INTERP->Icshlen)
+#define PL_cshname		(PERL_GET_INTERP->Icshname)
+#define PL_curcopdb		(PERL_GET_INTERP->Icurcopdb)
+#define PL_curstname		(PERL_GET_INTERP->Icurstname)
+#define PL_curthr		(PERL_GET_INTERP->Icurthr)
+#define PL_custom_op_descs	(PERL_GET_INTERP->Icustom_op_descs)
+#define PL_custom_op_names	(PERL_GET_INTERP->Icustom_op_names)
+#define PL_dbargs		(PERL_GET_INTERP->Idbargs)
+#define PL_debstash		(PERL_GET_INTERP->Idebstash)
+#define PL_debug		(PERL_GET_INTERP->Idebug)
+#define PL_debug_pad		(PERL_GET_INTERP->Idebug_pad)
+#define PL_def_layerlist	(PERL_GET_INTERP->Idef_layerlist)
+#define PL_defgv		(PERL_GET_INTERP->Idefgv)
+#define PL_diehook		(PERL_GET_INTERP->Idiehook)
+#define PL_doextract		(PERL_GET_INTERP->Idoextract)
+#define PL_doswitches		(PERL_GET_INTERP->Idoswitches)
+#define PL_dowarn		(PERL_GET_INTERP->Idowarn)
+#define PL_dumper_fd		(PERL_GET_INTERP->Idumper_fd)
+#define PL_e_script		(PERL_GET_INTERP->Ie_script)
+#define PL_egid			(PERL_GET_INTERP->Iegid)
+#define PL_encoding		(PERL_GET_INTERP->Iencoding)
+#define PL_endav		(PERL_GET_INTERP->Iendav)
+#define PL_envgv		(PERL_GET_INTERP->Ienvgv)
+#define PL_errgv		(PERL_GET_INTERP->Ierrgv)
+#define PL_error_count		(PERL_GET_INTERP->Ierror_count)
+#define PL_euid			(PERL_GET_INTERP->Ieuid)
+#define PL_eval_cond		(PERL_GET_INTERP->Ieval_cond)
+#define PL_eval_mutex		(PERL_GET_INTERP->Ieval_mutex)
+#define PL_eval_owner		(PERL_GET_INTERP->Ieval_owner)
+#define PL_eval_root		(PERL_GET_INTERP->Ieval_root)
+#define PL_eval_start		(PERL_GET_INTERP->Ieval_start)
+#define PL_evalseq		(PERL_GET_INTERP->Ievalseq)
+#define PL_exit_flags		(PERL_GET_INTERP->Iexit_flags)
+#define PL_exitlist		(PERL_GET_INTERP->Iexitlist)
+#define PL_exitlistlen		(PERL_GET_INTERP->Iexitlistlen)
+#define PL_expect		(PERL_GET_INTERP->Iexpect)
+#define PL_fdpid		(PERL_GET_INTERP->Ifdpid)
+#define PL_fdpid_mutex		(PERL_GET_INTERP->Ifdpid_mutex)
+#define PL_fdscript		(PERL_GET_INTERP->Ifdscript)
+#define PL_filemode		(PERL_GET_INTERP->Ifilemode)
+#define PL_forkprocess		(PERL_GET_INTERP->Iforkprocess)
+#define PL_formfeed		(PERL_GET_INTERP->Iformfeed)
+#define PL_generation		(PERL_GET_INTERP->Igeneration)
+#define PL_gensym		(PERL_GET_INTERP->Igensym)
+#define PL_gid			(PERL_GET_INTERP->Igid)
+#define PL_glob_index		(PERL_GET_INTERP->Iglob_index)
+#define PL_globalstash		(PERL_GET_INTERP->Iglobalstash)
+#define PL_hash_seed		(PERL_GET_INTERP->Ihash_seed)
+#define PL_hash_seed_set	(PERL_GET_INTERP->Ihash_seed_set)
+#define PL_he_arenaroot		(PERL_GET_INTERP->Ihe_arenaroot)
+#define PL_he_root		(PERL_GET_INTERP->Ihe_root)
+#define PL_hintgv		(PERL_GET_INTERP->Ihintgv)
+#define PL_hints		(PERL_GET_INTERP->Ihints)
+#define PL_in_clean_all		(PERL_GET_INTERP->Iin_clean_all)
+#define PL_in_clean_objs	(PERL_GET_INTERP->Iin_clean_objs)
+#define PL_in_load_module	(PERL_GET_INTERP->Iin_load_module)
+#define PL_in_my		(PERL_GET_INTERP->Iin_my)
+#define PL_in_my_stash		(PERL_GET_INTERP->Iin_my_stash)
+#define PL_incgv		(PERL_GET_INTERP->Iincgv)
+#define PL_initav		(PERL_GET_INTERP->Iinitav)
+#define PL_inplace		(PERL_GET_INTERP->Iinplace)
+#define PL_known_layers		(PERL_GET_INTERP->Iknown_layers)
+#define PL_last_lop		(PERL_GET_INTERP->Ilast_lop)
+#define PL_last_lop_op		(PERL_GET_INTERP->Ilast_lop_op)
+#define PL_last_swash_hv	(PERL_GET_INTERP->Ilast_swash_hv)
+#define PL_last_swash_key	(PERL_GET_INTERP->Ilast_swash_key)
+#define PL_last_swash_klen	(PERL_GET_INTERP->Ilast_swash_klen)
+#define PL_last_swash_slen	(PERL_GET_INTERP->Ilast_swash_slen)
+#define PL_last_swash_tmps	(PERL_GET_INTERP->Ilast_swash_tmps)
+#define PL_last_uni		(PERL_GET_INTERP->Ilast_uni)
+#define PL_lastfd		(PERL_GET_INTERP->Ilastfd)
+#define PL_laststatval		(PERL_GET_INTERP->Ilaststatval)
+#define PL_laststype		(PERL_GET_INTERP->Ilaststype)
+#define PL_lex_brackets		(PERL_GET_INTERP->Ilex_brackets)
+#define PL_lex_brackstack	(PERL_GET_INTERP->Ilex_brackstack)
+#define PL_lex_casemods		(PERL_GET_INTERP->Ilex_casemods)
+#define PL_lex_casestack	(PERL_GET_INTERP->Ilex_casestack)
+#define PL_lex_defer		(PERL_GET_INTERP->Ilex_defer)
+#define PL_lex_dojoin		(PERL_GET_INTERP->Ilex_dojoin)
+#define PL_lex_expect		(PERL_GET_INTERP->Ilex_expect)
+#define PL_lex_formbrack	(PERL_GET_INTERP->Ilex_formbrack)
+#define PL_lex_inpat		(PERL_GET_INTERP->Ilex_inpat)
+#define PL_lex_inwhat		(PERL_GET_INTERP->Ilex_inwhat)
+#define PL_lex_op		(PERL_GET_INTERP->Ilex_op)
+#define PL_lex_repl		(PERL_GET_INTERP->Ilex_repl)
+#define PL_lex_starts		(PERL_GET_INTERP->Ilex_starts)
+#define PL_lex_state		(PERL_GET_INTERP->Ilex_state)
+#define PL_lex_stuff		(PERL_GET_INTERP->Ilex_stuff)
+#define PL_lineary		(PERL_GET_INTERP->Ilineary)
+#define PL_linestart		(PERL_GET_INTERP->Ilinestart)
+#define PL_linestr		(PERL_GET_INTERP->Ilinestr)
+#define PL_localpatches		(PERL_GET_INTERP->Ilocalpatches)
+#define PL_lockhook		(PERL_GET_INTERP->Ilockhook)
+#define PL_main_cv		(PERL_GET_INTERP->Imain_cv)
+#define PL_main_root		(PERL_GET_INTERP->Imain_root)
+#define PL_main_start		(PERL_GET_INTERP->Imain_start)
+#define PL_max_intro_pending	(PERL_GET_INTERP->Imax_intro_pending)
+#define PL_maxo			(PERL_GET_INTERP->Imaxo)
+#define PL_maxsysfd		(PERL_GET_INTERP->Imaxsysfd)
+#define PL_mess_sv		(PERL_GET_INTERP->Imess_sv)
+#define PL_min_intro_pending	(PERL_GET_INTERP->Imin_intro_pending)
+#define PL_minus_F		(PERL_GET_INTERP->Iminus_F)
+#define PL_minus_a		(PERL_GET_INTERP->Iminus_a)
+#define PL_minus_c		(PERL_GET_INTERP->Iminus_c)
+#define PL_minus_l		(PERL_GET_INTERP->Iminus_l)
+#define PL_minus_n		(PERL_GET_INTERP->Iminus_n)
+#define PL_minus_p		(PERL_GET_INTERP->Iminus_p)
+#define PL_modglobal		(PERL_GET_INTERP->Imodglobal)
+#define PL_multi_close		(PERL_GET_INTERP->Imulti_close)
+#define PL_multi_end		(PERL_GET_INTERP->Imulti_end)
+#define PL_multi_open		(PERL_GET_INTERP->Imulti_open)
+#define PL_multi_start		(PERL_GET_INTERP->Imulti_start)
+#define PL_multiline		(PERL_GET_INTERP->Imultiline)
+#define PL_nexttoke		(PERL_GET_INTERP->Inexttoke)
+#define PL_nexttype		(PERL_GET_INTERP->Inexttype)
+#define PL_nextval		(PERL_GET_INTERP->Inextval)
+#define PL_nice_chunk		(PERL_GET_INTERP->Inice_chunk)
+#define PL_nice_chunk_size	(PERL_GET_INTERP->Inice_chunk_size)
+#define PL_nomemok		(PERL_GET_INTERP->Inomemok)
+#define PL_nthreads		(PERL_GET_INTERP->Inthreads)
+#define PL_nthreads_cond	(PERL_GET_INTERP->Inthreads_cond)
+#define PL_nullstash		(PERL_GET_INTERP->Inullstash)
+#define PL_numeric_compat1	(PERL_GET_INTERP->Inumeric_compat1)
+#define PL_numeric_local	(PERL_GET_INTERP->Inumeric_local)
+#define PL_numeric_name		(PERL_GET_INTERP->Inumeric_name)
+#define PL_numeric_radix_sv	(PERL_GET_INTERP->Inumeric_radix_sv)
+#define PL_numeric_standard	(PERL_GET_INTERP->Inumeric_standard)
+#define PL_ofmt			(PERL_GET_INTERP->Iofmt)
+#define PL_oldbufptr		(PERL_GET_INTERP->Ioldbufptr)
+#define PL_oldname		(PERL_GET_INTERP->Ioldname)
+#define PL_oldoldbufptr		(PERL_GET_INTERP->Ioldoldbufptr)
+#define PL_op_mask		(PERL_GET_INTERP->Iop_mask)
+#define PL_op_seqmax		(PERL_GET_INTERP->Iop_seqmax)
+#define PL_origalen		(PERL_GET_INTERP->Iorigalen)
+#define PL_origargc		(PERL_GET_INTERP->Iorigargc)
+#define PL_origargv		(PERL_GET_INTERP->Iorigargv)
+#define PL_origenviron		(PERL_GET_INTERP->Iorigenviron)
+#define PL_origfilename		(PERL_GET_INTERP->Iorigfilename)
+#define PL_ors_sv		(PERL_GET_INTERP->Iors_sv)
+#define PL_osname		(PERL_GET_INTERP->Iosname)
+#define PL_pad_reset_pending	(PERL_GET_INTERP->Ipad_reset_pending)
+#define PL_padix		(PERL_GET_INTERP->Ipadix)
+#define PL_padix_floor		(PERL_GET_INTERP->Ipadix_floor)
+#define PL_patchlevel		(PERL_GET_INTERP->Ipatchlevel)
+#define PL_pending_ident	(PERL_GET_INTERP->Ipending_ident)
+#define PL_perl_destruct_level	(PERL_GET_INTERP->Iperl_destruct_level)
+#define PL_perldb		(PERL_GET_INTERP->Iperldb)
+#define PL_perlio		(PERL_GET_INTERP->Iperlio)
+#define PL_pidstatus		(PERL_GET_INTERP->Ipidstatus)
+#define PL_ppid			(PERL_GET_INTERP->Ippid)
+#define PL_preambleav		(PERL_GET_INTERP->Ipreambleav)
+#define PL_preambled		(PERL_GET_INTERP->Ipreambled)
+#define PL_preprocess		(PERL_GET_INTERP->Ipreprocess)
+#define PL_profiledata		(PERL_GET_INTERP->Iprofiledata)
+#define PL_psig_name		(PERL_GET_INTERP->Ipsig_name)
+#define PL_psig_pend		(PERL_GET_INTERP->Ipsig_pend)
+#define PL_psig_ptr		(PERL_GET_INTERP->Ipsig_ptr)
+#define PL_pte_arenaroot	(PERL_GET_INTERP->Ipte_arenaroot)
+#define PL_pte_root		(PERL_GET_INTERP->Ipte_root)
+#define PL_ptr_table		(PERL_GET_INTERP->Iptr_table)
+#define PL_reentrant_buffer	(PERL_GET_INTERP->Ireentrant_buffer)
+#define PL_reentrant_retint	(PERL_GET_INTERP->Ireentrant_retint)
+#define PL_regex_pad		(PERL_GET_INTERP->Iregex_pad)
+#define PL_regex_padav		(PERL_GET_INTERP->Iregex_padav)
+#define PL_rehash_seed		(PERL_GET_INTERP->Irehash_seed)
+#define PL_rehash_seed_set	(PERL_GET_INTERP->Irehash_seed_set)
+#define PL_replgv		(PERL_GET_INTERP->Ireplgv)
+#define PL_rsfp			(PERL_GET_INTERP->Irsfp)
+#define PL_rsfp_filters		(PERL_GET_INTERP->Irsfp_filters)
+#define PL_runops		(PERL_GET_INTERP->Irunops)
+#define PL_runops_dbg		(PERL_GET_INTERP->Irunops_dbg)
+#define PL_runops_std		(PERL_GET_INTERP->Irunops_std)
+#define PL_savebegin		(PERL_GET_INTERP->Isavebegin)
+#define PL_sawampersand		(PERL_GET_INTERP->Isawampersand)
+#define PL_sh_path_compat	(PERL_GET_INTERP->Ish_path_compat)
+#define PL_sharehook		(PERL_GET_INTERP->Isharehook)
+#define PL_sig_pending		(PERL_GET_INTERP->Isig_pending)
+#define PL_sighandlerp		(PERL_GET_INTERP->Isighandlerp)
+#define PL_signals		(PERL_GET_INTERP->Isignals)
+#define PL_sort_RealCmp		(PERL_GET_INTERP->Isort_RealCmp)
+#define PL_splitstr		(PERL_GET_INTERP->Isplitstr)
+#define PL_srand_called		(PERL_GET_INTERP->Isrand_called)
+#define PL_stashcache		(PERL_GET_INTERP->Istashcache)
+#define PL_statusvalue		(PERL_GET_INTERP->Istatusvalue)
+#define PL_statusvalue_vms	(PERL_GET_INTERP->Istatusvalue_vms)
+#define PL_stderrgv		(PERL_GET_INTERP->Istderrgv)
+#define PL_stdingv		(PERL_GET_INTERP->Istdingv)
+#define PL_strtab		(PERL_GET_INTERP->Istrtab)
+#define PL_strtab_mutex		(PERL_GET_INTERP->Istrtab_mutex)
+#define PL_sub_generation	(PERL_GET_INTERP->Isub_generation)
+#define PL_sublex_info		(PERL_GET_INTERP->Isublex_info)
+#define PL_subline		(PERL_GET_INTERP->Isubline)
+#define PL_subname		(PERL_GET_INTERP->Isubname)
+#define PL_suidscript		(PERL_GET_INTERP->Isuidscript)
+#define PL_sv_arenaroot		(PERL_GET_INTERP->Isv_arenaroot)
+#define PL_sv_count		(PERL_GET_INTERP->Isv_count)
+#define PL_sv_lock_mutex	(PERL_GET_INTERP->Isv_lock_mutex)
+#define PL_sv_mutex		(PERL_GET_INTERP->Isv_mutex)
+#define PL_sv_no		(PERL_GET_INTERP->Isv_no)
+#define PL_sv_objcount		(PERL_GET_INTERP->Isv_objcount)
+#define PL_sv_root		(PERL_GET_INTERP->Isv_root)
+#define PL_sv_undef		(PERL_GET_INTERP->Isv_undef)
+#define PL_sv_yes		(PERL_GET_INTERP->Isv_yes)
+#define PL_svref_mutex		(PERL_GET_INTERP->Isvref_mutex)
+#define PL_sys_intern		(PERL_GET_INTERP->Isys_intern)
+#define PL_taint_warn		(PERL_GET_INTERP->Itaint_warn)
+#define PL_tainting		(PERL_GET_INTERP->Itainting)
+#define PL_threadhook		(PERL_GET_INTERP->Ithreadhook)
+#define PL_threadnum		(PERL_GET_INTERP->Ithreadnum)
+#define PL_threads_mutex	(PERL_GET_INTERP->Ithreads_mutex)
+#define PL_threadsv_names	(PERL_GET_INTERP->Ithreadsv_names)
+#define PL_thrsv		(PERL_GET_INTERP->Ithrsv)
+#define PL_tokenbuf		(PERL_GET_INTERP->Itokenbuf)
+#define PL_uid			(PERL_GET_INTERP->Iuid)
+#define PL_unicode		(PERL_GET_INTERP->Iunicode)
+#define PL_unlockhook		(PERL_GET_INTERP->Iunlockhook)
+#define PL_unsafe		(PERL_GET_INTERP->Iunsafe)
+#define PL_utf8_alnum		(PERL_GET_INTERP->Iutf8_alnum)
+#define PL_utf8_alnumc		(PERL_GET_INTERP->Iutf8_alnumc)
+#define PL_utf8_alpha		(PERL_GET_INTERP->Iutf8_alpha)
+#define PL_utf8_ascii		(PERL_GET_INTERP->Iutf8_ascii)
+#define PL_utf8_cntrl		(PERL_GET_INTERP->Iutf8_cntrl)
+#define PL_utf8_digit		(PERL_GET_INTERP->Iutf8_digit)
+#define PL_utf8_graph		(PERL_GET_INTERP->Iutf8_graph)
+#define PL_utf8_idcont		(PERL_GET_INTERP->Iutf8_idcont)
+#define PL_utf8_idstart		(PERL_GET_INTERP->Iutf8_idstart)
+#define PL_utf8_lower		(PERL_GET_INTERP->Iutf8_lower)
+#define PL_utf8_mark		(PERL_GET_INTERP->Iutf8_mark)
+#define PL_utf8_print		(PERL_GET_INTERP->Iutf8_print)
+#define PL_utf8_punct		(PERL_GET_INTERP->Iutf8_punct)
+#define PL_utf8_space		(PERL_GET_INTERP->Iutf8_space)
+#define PL_utf8_tofold		(PERL_GET_INTERP->Iutf8_tofold)
+#define PL_utf8_tolower		(PERL_GET_INTERP->Iutf8_tolower)
+#define PL_utf8_totitle		(PERL_GET_INTERP->Iutf8_totitle)
+#define PL_utf8_toupper		(PERL_GET_INTERP->Iutf8_toupper)
+#define PL_utf8_upper		(PERL_GET_INTERP->Iutf8_upper)
+#define PL_utf8_xdigit		(PERL_GET_INTERP->Iutf8_xdigit)
+#define PL_utf8locale		(PERL_GET_INTERP->Iutf8locale)
+#define PL_uudmap		(PERL_GET_INTERP->Iuudmap)
+#define PL_warnhook		(PERL_GET_INTERP->Iwarnhook)
+#define PL_widesyscalls		(PERL_GET_INTERP->Iwidesyscalls)
+#define PL_xiv_arenaroot	(PERL_GET_INTERP->Ixiv_arenaroot)
+#define PL_xiv_root		(PERL_GET_INTERP->Ixiv_root)
+#define PL_xnv_arenaroot	(PERL_GET_INTERP->Ixnv_arenaroot)
+#define PL_xnv_root		(PERL_GET_INTERP->Ixnv_root)
+#define PL_xpv_arenaroot	(PERL_GET_INTERP->Ixpv_arenaroot)
+#define PL_xpv_root		(PERL_GET_INTERP->Ixpv_root)
+#define PL_xpvav_arenaroot	(PERL_GET_INTERP->Ixpvav_arenaroot)
+#define PL_xpvav_root		(PERL_GET_INTERP->Ixpvav_root)
+#define PL_xpvbm_arenaroot	(PERL_GET_INTERP->Ixpvbm_arenaroot)
+#define PL_xpvbm_root		(PERL_GET_INTERP->Ixpvbm_root)
+#define PL_xpvcv_arenaroot	(PERL_GET_INTERP->Ixpvcv_arenaroot)
+#define PL_xpvcv_root		(PERL_GET_INTERP->Ixpvcv_root)
+#define PL_xpvhv_arenaroot	(PERL_GET_INTERP->Ixpvhv_arenaroot)
+#define PL_xpvhv_root		(PERL_GET_INTERP->Ixpvhv_root)
+#define PL_xpviv_arenaroot	(PERL_GET_INTERP->Ixpviv_arenaroot)
+#define PL_xpviv_root		(PERL_GET_INTERP->Ixpviv_root)
+#define PL_xpvlv_arenaroot	(PERL_GET_INTERP->Ixpvlv_arenaroot)
+#define PL_xpvlv_root		(PERL_GET_INTERP->Ixpvlv_root)
+#define PL_xpvmg_arenaroot	(PERL_GET_INTERP->Ixpvmg_arenaroot)
+#define PL_xpvmg_root		(PERL_GET_INTERP->Ixpvmg_root)
+#define PL_xpvnv_arenaroot	(PERL_GET_INTERP->Ixpvnv_arenaroot)
+#define PL_xpvnv_root		(PERL_GET_INTERP->Ixpvnv_root)
+#define PL_xrv_arenaroot	(PERL_GET_INTERP->Ixrv_arenaroot)
+#define PL_xrv_root		(PERL_GET_INTERP->Ixrv_root)
+#define PL_yychar		(PERL_GET_INTERP->Iyychar)
+#define PL_yydebug		(PERL_GET_INTERP->Iyydebug)
+#define PL_yyerrflag		(PERL_GET_INTERP->Iyyerrflag)
+#define PL_yylval		(PERL_GET_INTERP->Iyylval)
+#define PL_yynerrs		(PERL_GET_INTERP->Iyynerrs)
+#define PL_yyval		(PERL_GET_INTERP->Iyyval)
+
+#  else		/* !USE_5005THREADS */
+/* cases 2 and 3 above */
+
+#define PL_Argv			(vTHX->IArgv)
+#define PL_BINCOMPAT0		(vTHX->IBINCOMPAT0)
+#define PL_Cmd			(vTHX->ICmd)
+#define PL_DBcv			(vTHX->IDBcv)
+#define PL_DBgv			(vTHX->IDBgv)
+#define PL_DBline		(vTHX->IDBline)
+#define PL_DBsignal		(vTHX->IDBsignal)
+#define PL_DBsingle		(vTHX->IDBsingle)
+#define PL_DBsub		(vTHX->IDBsub)
+#define PL_DBtrace		(vTHX->IDBtrace)
+#define PL_Dir			(vTHX->IDir)
+#define PL_Env			(vTHX->IEnv)
+#define PL_LIO			(vTHX->ILIO)
+#define PL_Mem			(vTHX->IMem)
+#define PL_MemParse		(vTHX->IMemParse)
+#define PL_MemShared		(vTHX->IMemShared)
+#define PL_OpPtr		(vTHX->IOpPtr)
+#define PL_OpSlab		(vTHX->IOpSlab)
+#define PL_OpSpace		(vTHX->IOpSpace)
+#define PL_Proc			(vTHX->IProc)
+#define PL_Sock			(vTHX->ISock)
+#define PL_StdIO		(vTHX->IStdIO)
+#define PL_amagic_generation	(vTHX->Iamagic_generation)
+#define PL_an			(vTHX->Ian)
+#define PL_argvgv		(vTHX->Iargvgv)
+#define PL_argvout_stack	(vTHX->Iargvout_stack)
+#define PL_argvoutgv		(vTHX->Iargvoutgv)
+#define PL_basetime		(vTHX->Ibasetime)
+#define PL_beginav		(vTHX->Ibeginav)
+#define PL_beginav_save		(vTHX->Ibeginav_save)
+#define PL_bitcount		(vTHX->Ibitcount)
+#define PL_bufend		(vTHX->Ibufend)
+#define PL_bufptr		(vTHX->Ibufptr)
+#define PL_checkav		(vTHX->Icheckav)
+#define PL_checkav_save		(vTHX->Icheckav_save)
+#define PL_clocktick		(vTHX->Iclocktick)
+#define PL_collation_ix		(vTHX->Icollation_ix)
+#define PL_collation_name	(vTHX->Icollation_name)
+#define PL_collation_standard	(vTHX->Icollation_standard)
+#define PL_collxfrm_base	(vTHX->Icollxfrm_base)
+#define PL_collxfrm_mult	(vTHX->Icollxfrm_mult)
+#define PL_compcv		(vTHX->Icompcv)
+#define PL_compiling		(vTHX->Icompiling)
+#define PL_comppad_name		(vTHX->Icomppad_name)
+#define PL_comppad_name_fill	(vTHX->Icomppad_name_fill)
+#define PL_comppad_name_floor	(vTHX->Icomppad_name_floor)
+#define PL_cop_seqmax		(vTHX->Icop_seqmax)
+#define PL_copline		(vTHX->Icopline)
+#define PL_cred_mutex		(vTHX->Icred_mutex)
+#define PL_cryptseen		(vTHX->Icryptseen)
+#define PL_cshlen		(vTHX->Icshlen)
+#define PL_cshname		(vTHX->Icshname)
+#define PL_curcopdb		(vTHX->Icurcopdb)
+#define PL_curstname		(vTHX->Icurstname)
+#define PL_curthr		(vTHX->Icurthr)
+#define PL_custom_op_descs	(vTHX->Icustom_op_descs)
+#define PL_custom_op_names	(vTHX->Icustom_op_names)
+#define PL_dbargs		(vTHX->Idbargs)
+#define PL_debstash		(vTHX->Idebstash)
+#define PL_debug		(vTHX->Idebug)
+#define PL_debug_pad		(vTHX->Idebug_pad)
+#define PL_def_layerlist	(vTHX->Idef_layerlist)
+#define PL_defgv		(vTHX->Idefgv)
+#define PL_diehook		(vTHX->Idiehook)
+#define PL_doextract		(vTHX->Idoextract)
+#define PL_doswitches		(vTHX->Idoswitches)
+#define PL_dowarn		(vTHX->Idowarn)
+#define PL_dumper_fd		(vTHX->Idumper_fd)
+#define PL_e_script		(vTHX->Ie_script)
+#define PL_egid			(vTHX->Iegid)
+#define PL_encoding		(vTHX->Iencoding)
+#define PL_endav		(vTHX->Iendav)
+#define PL_envgv		(vTHX->Ienvgv)
+#define PL_errgv		(vTHX->Ierrgv)
+#define PL_error_count		(vTHX->Ierror_count)
+#define PL_euid			(vTHX->Ieuid)
+#define PL_eval_cond		(vTHX->Ieval_cond)
+#define PL_eval_mutex		(vTHX->Ieval_mutex)
+#define PL_eval_owner		(vTHX->Ieval_owner)
+#define PL_eval_root		(vTHX->Ieval_root)
+#define PL_eval_start		(vTHX->Ieval_start)
+#define PL_evalseq		(vTHX->Ievalseq)
+#define PL_exit_flags		(vTHX->Iexit_flags)
+#define PL_exitlist		(vTHX->Iexitlist)
+#define PL_exitlistlen		(vTHX->Iexitlistlen)
+#define PL_expect		(vTHX->Iexpect)
+#define PL_fdpid		(vTHX->Ifdpid)
+#define PL_fdpid_mutex		(vTHX->Ifdpid_mutex)
+#define PL_fdscript		(vTHX->Ifdscript)
+#define PL_filemode		(vTHX->Ifilemode)
+#define PL_forkprocess		(vTHX->Iforkprocess)
+#define PL_formfeed		(vTHX->Iformfeed)
+#define PL_generation		(vTHX->Igeneration)
+#define PL_gensym		(vTHX->Igensym)
+#define PL_gid			(vTHX->Igid)
+#define PL_glob_index		(vTHX->Iglob_index)
+#define PL_globalstash		(vTHX->Iglobalstash)
+#define PL_hash_seed		(vTHX->Ihash_seed)
+#define PL_hash_seed_set	(vTHX->Ihash_seed_set)
+#define PL_he_arenaroot		(vTHX->Ihe_arenaroot)
+#define PL_he_root		(vTHX->Ihe_root)
+#define PL_hintgv		(vTHX->Ihintgv)
+#define PL_hints		(vTHX->Ihints)
+#define PL_in_clean_all		(vTHX->Iin_clean_all)
+#define PL_in_clean_objs	(vTHX->Iin_clean_objs)
+#define PL_in_load_module	(vTHX->Iin_load_module)
+#define PL_in_my		(vTHX->Iin_my)
+#define PL_in_my_stash		(vTHX->Iin_my_stash)
+#define PL_incgv		(vTHX->Iincgv)
+#define PL_initav		(vTHX->Iinitav)
+#define PL_inplace		(vTHX->Iinplace)
+#define PL_known_layers		(vTHX->Iknown_layers)
+#define PL_last_lop		(vTHX->Ilast_lop)
+#define PL_last_lop_op		(vTHX->Ilast_lop_op)
+#define PL_last_swash_hv	(vTHX->Ilast_swash_hv)
+#define PL_last_swash_key	(vTHX->Ilast_swash_key)
+#define PL_last_swash_klen	(vTHX->Ilast_swash_klen)
+#define PL_last_swash_slen	(vTHX->Ilast_swash_slen)
+#define PL_last_swash_tmps	(vTHX->Ilast_swash_tmps)
+#define PL_last_uni		(vTHX->Ilast_uni)
+#define PL_lastfd		(vTHX->Ilastfd)
+#define PL_laststatval		(vTHX->Ilaststatval)
+#define PL_laststype		(vTHX->Ilaststype)
+#define PL_lex_brackets		(vTHX->Ilex_brackets)
+#define PL_lex_brackstack	(vTHX->Ilex_brackstack)
+#define PL_lex_casemods		(vTHX->Ilex_casemods)
+#define PL_lex_casestack	(vTHX->Ilex_casestack)
+#define PL_lex_defer		(vTHX->Ilex_defer)
+#define PL_lex_dojoin		(vTHX->Ilex_dojoin)
+#define PL_lex_expect		(vTHX->Ilex_expect)
+#define PL_lex_formbrack	(vTHX->Ilex_formbrack)
+#define PL_lex_inpat		(vTHX->Ilex_inpat)
+#define PL_lex_inwhat		(vTHX->Ilex_inwhat)
+#define PL_lex_op		(vTHX->Ilex_op)
+#define PL_lex_repl		(vTHX->Ilex_repl)
+#define PL_lex_starts		(vTHX->Ilex_starts)
+#define PL_lex_state		(vTHX->Ilex_state)
+#define PL_lex_stuff		(vTHX->Ilex_stuff)
+#define PL_lineary		(vTHX->Ilineary)
+#define PL_linestart		(vTHX->Ilinestart)
+#define PL_linestr		(vTHX->Ilinestr)
+#define PL_localpatches		(vTHX->Ilocalpatches)
+#define PL_lockhook		(vTHX->Ilockhook)
+#define PL_main_cv		(vTHX->Imain_cv)
+#define PL_main_root		(vTHX->Imain_root)
+#define PL_main_start		(vTHX->Imain_start)
+#define PL_max_intro_pending	(vTHX->Imax_intro_pending)
+#define PL_maxo			(vTHX->Imaxo)
+#define PL_maxsysfd		(vTHX->Imaxsysfd)
+#define PL_mess_sv		(vTHX->Imess_sv)
+#define PL_min_intro_pending	(vTHX->Imin_intro_pending)
+#define PL_minus_F		(vTHX->Iminus_F)
+#define PL_minus_a		(vTHX->Iminus_a)
+#define PL_minus_c		(vTHX->Iminus_c)
+#define PL_minus_l		(vTHX->Iminus_l)
+#define PL_minus_n		(vTHX->Iminus_n)
+#define PL_minus_p		(vTHX->Iminus_p)
+#define PL_modglobal		(vTHX->Imodglobal)
+#define PL_multi_close		(vTHX->Imulti_close)
+#define PL_multi_end		(vTHX->Imulti_end)
+#define PL_multi_open		(vTHX->Imulti_open)
+#define PL_multi_start		(vTHX->Imulti_start)
+#define PL_multiline		(vTHX->Imultiline)
+#define PL_nexttoke		(vTHX->Inexttoke)
+#define PL_nexttype		(vTHX->Inexttype)
+#define PL_nextval		(vTHX->Inextval)
+#define PL_nice_chunk		(vTHX->Inice_chunk)
+#define PL_nice_chunk_size	(vTHX->Inice_chunk_size)
+#define PL_nomemok		(vTHX->Inomemok)
+#define PL_nthreads		(vTHX->Inthreads)
+#define PL_nthreads_cond	(vTHX->Inthreads_cond)
+#define PL_nullstash		(vTHX->Inullstash)
+#define PL_numeric_compat1	(vTHX->Inumeric_compat1)
+#define PL_numeric_local	(vTHX->Inumeric_local)
+#define PL_numeric_name		(vTHX->Inumeric_name)
+#define PL_numeric_radix_sv	(vTHX->Inumeric_radix_sv)
+#define PL_numeric_standard	(vTHX->Inumeric_standard)
+#define PL_ofmt			(vTHX->Iofmt)
+#define PL_oldbufptr		(vTHX->Ioldbufptr)
+#define PL_oldname		(vTHX->Ioldname)
+#define PL_oldoldbufptr		(vTHX->Ioldoldbufptr)
+#define PL_op_mask		(vTHX->Iop_mask)
+#define PL_op_seqmax		(vTHX->Iop_seqmax)
+#define PL_origalen		(vTHX->Iorigalen)
+#define PL_origargc		(vTHX->Iorigargc)
+#define PL_origargv		(vTHX->Iorigargv)
+#define PL_origenviron		(vTHX->Iorigenviron)
+#define PL_origfilename		(vTHX->Iorigfilename)
+#define PL_ors_sv		(vTHX->Iors_sv)
+#define PL_osname		(vTHX->Iosname)
+#define PL_pad_reset_pending	(vTHX->Ipad_reset_pending)
+#define PL_padix		(vTHX->Ipadix)
+#define PL_padix_floor		(vTHX->Ipadix_floor)
+#define PL_patchlevel		(vTHX->Ipatchlevel)
+#define PL_pending_ident	(vTHX->Ipending_ident)
+#define PL_perl_destruct_level	(vTHX->Iperl_destruct_level)
+#define PL_perldb		(vTHX->Iperldb)
+#define PL_perlio		(vTHX->Iperlio)
+#define PL_pidstatus		(vTHX->Ipidstatus)
+#define PL_ppid			(vTHX->Ippid)
+#define PL_preambleav		(vTHX->Ipreambleav)
+#define PL_preambled		(vTHX->Ipreambled)
+#define PL_preprocess		(vTHX->Ipreprocess)
+#define PL_profiledata		(vTHX->Iprofiledata)
+#define PL_psig_name		(vTHX->Ipsig_name)
+#define PL_psig_pend		(vTHX->Ipsig_pend)
+#define PL_psig_ptr		(vTHX->Ipsig_ptr)
+#define PL_pte_arenaroot	(vTHX->Ipte_arenaroot)
+#define PL_pte_root		(vTHX->Ipte_root)
+#define PL_ptr_table		(vTHX->Iptr_table)
+#define PL_reentrant_buffer	(vTHX->Ireentrant_buffer)
+#define PL_reentrant_retint	(vTHX->Ireentrant_retint)
+#define PL_regex_pad		(vTHX->Iregex_pad)
+#define PL_regex_padav		(vTHX->Iregex_padav)
+#define PL_rehash_seed		(vTHX->Irehash_seed)
+#define PL_rehash_seed_set	(vTHX->Irehash_seed_set)
+#define PL_replgv		(vTHX->Ireplgv)
+#define PL_rsfp			(vTHX->Irsfp)
+#define PL_rsfp_filters		(vTHX->Irsfp_filters)
+#define PL_runops		(vTHX->Irunops)
+#define PL_runops_dbg		(vTHX->Irunops_dbg)
+#define PL_runops_std		(vTHX->Irunops_std)
+#define PL_savebegin		(vTHX->Isavebegin)
+#define PL_sawampersand		(vTHX->Isawampersand)
+#define PL_sh_path_compat	(vTHX->Ish_path_compat)
+#define PL_sharehook		(vTHX->Isharehook)
+#define PL_sig_pending		(vTHX->Isig_pending)
+#define PL_sighandlerp		(vTHX->Isighandlerp)
+#define PL_signals		(vTHX->Isignals)
+#define PL_sort_RealCmp		(vTHX->Isort_RealCmp)
+#define PL_splitstr		(vTHX->Isplitstr)
+#define PL_srand_called		(vTHX->Isrand_called)
+#define PL_stashcache		(vTHX->Istashcache)
+#define PL_statusvalue		(vTHX->Istatusvalue)
+#define PL_statusvalue_vms	(vTHX->Istatusvalue_vms)
+#define PL_stderrgv		(vTHX->Istderrgv)
+#define PL_stdingv		(vTHX->Istdingv)
+#define PL_strtab		(vTHX->Istrtab)
+#define PL_strtab_mutex		(vTHX->Istrtab_mutex)
+#define PL_sub_generation	(vTHX->Isub_generation)
+#define PL_sublex_info		(vTHX->Isublex_info)
+#define PL_subline		(vTHX->Isubline)
+#define PL_subname		(vTHX->Isubname)
+#define PL_suidscript		(vTHX->Isuidscript)
+#define PL_sv_arenaroot		(vTHX->Isv_arenaroot)
+#define PL_sv_count		(vTHX->Isv_count)
+#define PL_sv_lock_mutex	(vTHX->Isv_lock_mutex)
+#define PL_sv_mutex		(vTHX->Isv_mutex)
+#define PL_sv_no		(vTHX->Isv_no)
+#define PL_sv_objcount		(vTHX->Isv_objcount)
+#define PL_sv_root		(vTHX->Isv_root)
+#define PL_sv_undef		(vTHX->Isv_undef)
+#define PL_sv_yes		(vTHX->Isv_yes)
+#define PL_svref_mutex		(vTHX->Isvref_mutex)
+#define PL_sys_intern		(vTHX->Isys_intern)
+#define PL_taint_warn		(vTHX->Itaint_warn)
+#define PL_tainting		(vTHX->Itainting)
+#define PL_threadhook		(vTHX->Ithreadhook)
+#define PL_threadnum		(vTHX->Ithreadnum)
+#define PL_threads_mutex	(vTHX->Ithreads_mutex)
+#define PL_threadsv_names	(vTHX->Ithreadsv_names)
+#define PL_thrsv		(vTHX->Ithrsv)
+#define PL_tokenbuf		(vTHX->Itokenbuf)
+#define PL_uid			(vTHX->Iuid)
+#define PL_unicode		(vTHX->Iunicode)
+#define PL_unlockhook		(vTHX->Iunlockhook)
+#define PL_unsafe		(vTHX->Iunsafe)
+#define PL_utf8_alnum		(vTHX->Iutf8_alnum)
+#define PL_utf8_alnumc		(vTHX->Iutf8_alnumc)
+#define PL_utf8_alpha		(vTHX->Iutf8_alpha)
+#define PL_utf8_ascii		(vTHX->Iutf8_ascii)
+#define PL_utf8_cntrl		(vTHX->Iutf8_cntrl)
+#define PL_utf8_digit		(vTHX->Iutf8_digit)
+#define PL_utf8_graph		(vTHX->Iutf8_graph)
+#define PL_utf8_idcont		(vTHX->Iutf8_idcont)
+#define PL_utf8_idstart		(vTHX->Iutf8_idstart)
+#define PL_utf8_lower		(vTHX->Iutf8_lower)
+#define PL_utf8_mark		(vTHX->Iutf8_mark)
+#define PL_utf8_print		(vTHX->Iutf8_print)
+#define PL_utf8_punct		(vTHX->Iutf8_punct)
+#define PL_utf8_space		(vTHX->Iutf8_space)
+#define PL_utf8_tofold		(vTHX->Iutf8_tofold)
+#define PL_utf8_tolower		(vTHX->Iutf8_tolower)
+#define PL_utf8_totitle		(vTHX->Iutf8_totitle)
+#define PL_utf8_toupper		(vTHX->Iutf8_toupper)
+#define PL_utf8_upper		(vTHX->Iutf8_upper)
+#define PL_utf8_xdigit		(vTHX->Iutf8_xdigit)
+#define PL_utf8locale		(vTHX->Iutf8locale)
+#define PL_uudmap		(vTHX->Iuudmap)
+#define PL_warnhook		(vTHX->Iwarnhook)
+#define PL_widesyscalls		(vTHX->Iwidesyscalls)
+#define PL_xiv_arenaroot	(vTHX->Ixiv_arenaroot)
+#define PL_xiv_root		(vTHX->Ixiv_root)
+#define PL_xnv_arenaroot	(vTHX->Ixnv_arenaroot)
+#define PL_xnv_root		(vTHX->Ixnv_root)
+#define PL_xpv_arenaroot	(vTHX->Ixpv_arenaroot)
+#define PL_xpv_root		(vTHX->Ixpv_root)
+#define PL_xpvav_arenaroot	(vTHX->Ixpvav_arenaroot)
+#define PL_xpvav_root		(vTHX->Ixpvav_root)
+#define PL_xpvbm_arenaroot	(vTHX->Ixpvbm_arenaroot)
+#define PL_xpvbm_root		(vTHX->Ixpvbm_root)
+#define PL_xpvcv_arenaroot	(vTHX->Ixpvcv_arenaroot)
+#define PL_xpvcv_root		(vTHX->Ixpvcv_root)
+#define PL_xpvhv_arenaroot	(vTHX->Ixpvhv_arenaroot)
+#define PL_xpvhv_root		(vTHX->Ixpvhv_root)
+#define PL_xpviv_arenaroot	(vTHX->Ixpviv_arenaroot)
+#define PL_xpviv_root		(vTHX->Ixpviv_root)
+#define PL_xpvlv_arenaroot	(vTHX->Ixpvlv_arenaroot)
+#define PL_xpvlv_root		(vTHX->Ixpvlv_root)
+#define PL_xpvmg_arenaroot	(vTHX->Ixpvmg_arenaroot)
+#define PL_xpvmg_root		(vTHX->Ixpvmg_root)
+#define PL_xpvnv_arenaroot	(vTHX->Ixpvnv_arenaroot)
+#define PL_xpvnv_root		(vTHX->Ixpvnv_root)
+#define PL_xrv_arenaroot	(vTHX->Ixrv_arenaroot)
+#define PL_xrv_root		(vTHX->Ixrv_root)
+#define PL_yychar		(vTHX->Iyychar)
+#define PL_yydebug		(vTHX->Iyydebug)
+#define PL_yyerrflag		(vTHX->Iyyerrflag)
+#define PL_yylval		(vTHX->Iyylval)
+#define PL_yynerrs		(vTHX->Iyynerrs)
+#define PL_yyval		(vTHX->Iyyval)
+
+#  endif	/* USE_5005THREADS */
+
+#else	/* !MULTIPLICITY */
+
+/* cases 1 and 4 above */
+
+#define PL_IArgv		PL_Argv
+#define PL_IBINCOMPAT0		PL_BINCOMPAT0
+#define PL_ICmd			PL_Cmd
+#define PL_IDBcv		PL_DBcv
+#define PL_IDBgv		PL_DBgv
+#define PL_IDBline		PL_DBline
+#define PL_IDBsignal		PL_DBsignal
+#define PL_IDBsingle		PL_DBsingle
+#define PL_IDBsub		PL_DBsub
+#define PL_IDBtrace		PL_DBtrace
+#define PL_IDir			PL_Dir
+#define PL_IEnv			PL_Env
+#define PL_ILIO			PL_LIO
+#define PL_IMem			PL_Mem
+#define PL_IMemParse		PL_MemParse
+#define PL_IMemShared		PL_MemShared
+#define PL_IOpPtr		PL_OpPtr
+#define PL_IOpSlab		PL_OpSlab
+#define PL_IOpSpace		PL_OpSpace
+#define PL_IProc		PL_Proc
+#define PL_ISock		PL_Sock
+#define PL_IStdIO		PL_StdIO
+#define PL_Iamagic_generation	PL_amagic_generation
+#define PL_Ian			PL_an
+#define PL_Iargvgv		PL_argvgv
+#define PL_Iargvout_stack	PL_argvout_stack
+#define PL_Iargvoutgv		PL_argvoutgv
+#define PL_Ibasetime		PL_basetime
+#define PL_Ibeginav		PL_beginav
+#define PL_Ibeginav_save	PL_beginav_save
+#define PL_Ibitcount		PL_bitcount
+#define PL_Ibufend		PL_bufend
+#define PL_Ibufptr		PL_bufptr
+#define PL_Icheckav		PL_checkav
+#define PL_Icheckav_save	PL_checkav_save
+#define PL_Iclocktick		PL_clocktick
+#define PL_Icollation_ix	PL_collation_ix
+#define PL_Icollation_name	PL_collation_name
+#define PL_Icollation_standard	PL_collation_standard
+#define PL_Icollxfrm_base	PL_collxfrm_base
+#define PL_Icollxfrm_mult	PL_collxfrm_mult
+#define PL_Icompcv		PL_compcv
+#define PL_Icompiling		PL_compiling
+#define PL_Icomppad_name	PL_comppad_name
+#define PL_Icomppad_name_fill	PL_comppad_name_fill
+#define PL_Icomppad_name_floor	PL_comppad_name_floor
+#define PL_Icop_seqmax		PL_cop_seqmax
+#define PL_Icopline		PL_copline
+#define PL_Icred_mutex		PL_cred_mutex
+#define PL_Icryptseen		PL_cryptseen
+#define PL_Icshlen		PL_cshlen
+#define PL_Icshname		PL_cshname
+#define PL_Icurcopdb		PL_curcopdb
+#define PL_Icurstname		PL_curstname
+#define PL_Icurthr		PL_curthr
+#define PL_Icustom_op_descs	PL_custom_op_descs
+#define PL_Icustom_op_names	PL_custom_op_names
+#define PL_Idbargs		PL_dbargs
+#define PL_Idebstash		PL_debstash
+#define PL_Idebug		PL_debug
+#define PL_Idebug_pad		PL_debug_pad
+#define PL_Idef_layerlist	PL_def_layerlist
+#define PL_Idefgv		PL_defgv
+#define PL_Idiehook		PL_diehook
+#define PL_Idoextract		PL_doextract
+#define PL_Idoswitches		PL_doswitches
+#define PL_Idowarn		PL_dowarn
+#define PL_Idumper_fd		PL_dumper_fd
+#define PL_Ie_script		PL_e_script
+#define PL_Iegid		PL_egid
+#define PL_Iencoding		PL_encoding
+#define PL_Iendav		PL_endav
+#define PL_Ienvgv		PL_envgv
+#define PL_Ierrgv		PL_errgv
+#define PL_Ierror_count		PL_error_count
+#define PL_Ieuid		PL_euid
+#define PL_Ieval_cond		PL_eval_cond
+#define PL_Ieval_mutex		PL_eval_mutex
+#define PL_Ieval_owner		PL_eval_owner
+#define PL_Ieval_root		PL_eval_root
+#define PL_Ieval_start		PL_eval_start
+#define PL_Ievalseq		PL_evalseq
+#define PL_Iexit_flags		PL_exit_flags
+#define PL_Iexitlist		PL_exitlist
+#define PL_Iexitlistlen		PL_exitlistlen
+#define PL_Iexpect		PL_expect
+#define PL_Ifdpid		PL_fdpid
+#define PL_Ifdpid_mutex		PL_fdpid_mutex
+#define PL_Ifdscript		PL_fdscript
+#define PL_Ifilemode		PL_filemode
+#define PL_Iforkprocess		PL_forkprocess
+#define PL_Iformfeed		PL_formfeed
+#define PL_Igeneration		PL_generation
+#define PL_Igensym		PL_gensym
+#define PL_Igid			PL_gid
+#define PL_Iglob_index		PL_glob_index
+#define PL_Iglobalstash		PL_globalstash
+#define PL_Ihash_seed		PL_hash_seed
+#define PL_Ihash_seed_set	PL_hash_seed_set
+#define PL_Ihe_arenaroot	PL_he_arenaroot
+#define PL_Ihe_root		PL_he_root
+#define PL_Ihintgv		PL_hintgv
+#define PL_Ihints		PL_hints
+#define PL_Iin_clean_all	PL_in_clean_all
+#define PL_Iin_clean_objs	PL_in_clean_objs
+#define PL_Iin_load_module	PL_in_load_module
+#define PL_Iin_my		PL_in_my
+#define PL_Iin_my_stash		PL_in_my_stash
+#define PL_Iincgv		PL_incgv
+#define PL_Iinitav		PL_initav
+#define PL_Iinplace		PL_inplace
+#define PL_Iknown_layers	PL_known_layers
+#define PL_Ilast_lop		PL_last_lop
+#define PL_Ilast_lop_op		PL_last_lop_op
+#define PL_Ilast_swash_hv	PL_last_swash_hv
+#define PL_Ilast_swash_key	PL_last_swash_key
+#define PL_Ilast_swash_klen	PL_last_swash_klen
+#define PL_Ilast_swash_slen	PL_last_swash_slen
+#define PL_Ilast_swash_tmps	PL_last_swash_tmps
+#define PL_Ilast_uni		PL_last_uni
+#define PL_Ilastfd		PL_lastfd
+#define PL_Ilaststatval		PL_laststatval
+#define PL_Ilaststype		PL_laststype
+#define PL_Ilex_brackets	PL_lex_brackets
+#define PL_Ilex_brackstack	PL_lex_brackstack
+#define PL_Ilex_casemods	PL_lex_casemods
+#define PL_Ilex_casestack	PL_lex_casestack
+#define PL_Ilex_defer		PL_lex_defer
+#define PL_Ilex_dojoin		PL_lex_dojoin
+#define PL_Ilex_expect		PL_lex_expect
+#define PL_Ilex_formbrack	PL_lex_formbrack
+#define PL_Ilex_inpat		PL_lex_inpat
+#define PL_Ilex_inwhat		PL_lex_inwhat
+#define PL_Ilex_op		PL_lex_op
+#define PL_Ilex_repl		PL_lex_repl
+#define PL_Ilex_starts		PL_lex_starts
+#define PL_Ilex_state		PL_lex_state
+#define PL_Ilex_stuff		PL_lex_stuff
+#define PL_Ilineary		PL_lineary
+#define PL_Ilinestart		PL_linestart
+#define PL_Ilinestr		PL_linestr
+#define PL_Ilocalpatches	PL_localpatches
+#define PL_Ilockhook		PL_lockhook
+#define PL_Imain_cv		PL_main_cv
+#define PL_Imain_root		PL_main_root
+#define PL_Imain_start		PL_main_start
+#define PL_Imax_intro_pending	PL_max_intro_pending
+#define PL_Imaxo		PL_maxo
+#define PL_Imaxsysfd		PL_maxsysfd
+#define PL_Imess_sv		PL_mess_sv
+#define PL_Imin_intro_pending	PL_min_intro_pending
+#define PL_Iminus_F		PL_minus_F
+#define PL_Iminus_a		PL_minus_a
+#define PL_Iminus_c		PL_minus_c
+#define PL_Iminus_l		PL_minus_l
+#define PL_Iminus_n		PL_minus_n
+#define PL_Iminus_p		PL_minus_p
+#define PL_Imodglobal		PL_modglobal
+#define PL_Imulti_close		PL_multi_close
+#define PL_Imulti_end		PL_multi_end
+#define PL_Imulti_open		PL_multi_open
+#define PL_Imulti_start		PL_multi_start
+#define PL_Imultiline		PL_multiline
+#define PL_Inexttoke		PL_nexttoke
+#define PL_Inexttype		PL_nexttype
+#define PL_Inextval		PL_nextval
+#define PL_Inice_chunk		PL_nice_chunk
+#define PL_Inice_chunk_size	PL_nice_chunk_size
+#define PL_Inomemok		PL_nomemok
+#define PL_Inthreads		PL_nthreads
+#define PL_Inthreads_cond	PL_nthreads_cond
+#define PL_Inullstash		PL_nullstash
+#define PL_Inumeric_compat1	PL_numeric_compat1
+#define PL_Inumeric_local	PL_numeric_local
+#define PL_Inumeric_name	PL_numeric_name
+#define PL_Inumeric_radix_sv	PL_numeric_radix_sv
+#define PL_Inumeric_standard	PL_numeric_standard
+#define PL_Iofmt		PL_ofmt
+#define PL_Ioldbufptr		PL_oldbufptr
+#define PL_Ioldname		PL_oldname
+#define PL_Ioldoldbufptr	PL_oldoldbufptr
+#define PL_Iop_mask		PL_op_mask
+#define PL_Iop_seqmax		PL_op_seqmax
+#define PL_Iorigalen		PL_origalen
+#define PL_Iorigargc		PL_origargc
+#define PL_Iorigargv		PL_origargv
+#define PL_Iorigenviron		PL_origenviron
+#define PL_Iorigfilename	PL_origfilename
+#define PL_Iors_sv		PL_ors_sv
+#define PL_Iosname		PL_osname
+#define PL_Ipad_reset_pending	PL_pad_reset_pending
+#define PL_Ipadix		PL_padix
+#define PL_Ipadix_floor		PL_padix_floor
+#define PL_Ipatchlevel		PL_patchlevel
+#define PL_Ipending_ident	PL_pending_ident
+#define PL_Iperl_destruct_level	PL_perl_destruct_level
+#define PL_Iperldb		PL_perldb
+#define PL_Iperlio		PL_perlio
+#define PL_Ipidstatus		PL_pidstatus
+#define PL_Ippid		PL_ppid
+#define PL_Ipreambleav		PL_preambleav
+#define PL_Ipreambled		PL_preambled
+#define PL_Ipreprocess		PL_preprocess
+#define PL_Iprofiledata		PL_profiledata
+#define PL_Ipsig_name		PL_psig_name
+#define PL_Ipsig_pend		PL_psig_pend
+#define PL_Ipsig_ptr		PL_psig_ptr
+#define PL_Ipte_arenaroot	PL_pte_arenaroot
+#define PL_Ipte_root		PL_pte_root
+#define PL_Iptr_table		PL_ptr_table
+#define PL_Ireentrant_buffer	PL_reentrant_buffer
+#define PL_Ireentrant_retint	PL_reentrant_retint
+#define PL_Iregex_pad		PL_regex_pad
+#define PL_Iregex_padav		PL_regex_padav
+#define PL_Irehash_seed		PL_rehash_seed
+#define PL_Irehash_seed_set	PL_rehash_seed_set
+#define PL_Ireplgv		PL_replgv
+#define PL_Irsfp		PL_rsfp
+#define PL_Irsfp_filters	PL_rsfp_filters
+#define PL_Irunops		PL_runops
+#define PL_Irunops_dbg		PL_runops_dbg
+#define PL_Irunops_std		PL_runops_std
+#define PL_Isavebegin		PL_savebegin
+#define PL_Isawampersand	PL_sawampersand
+#define PL_Ish_path_compat	PL_sh_path_compat
+#define PL_Isharehook		PL_sharehook
+#define PL_Isig_pending		PL_sig_pending
+#define PL_Isighandlerp		PL_sighandlerp
+#define PL_Isignals		PL_signals
+#define PL_Isort_RealCmp	PL_sort_RealCmp
+#define PL_Isplitstr		PL_splitstr
+#define PL_Isrand_called	PL_srand_called
+#define PL_Istashcache		PL_stashcache
+#define PL_Istatusvalue		PL_statusvalue
+#define PL_Istatusvalue_vms	PL_statusvalue_vms
+#define PL_Istderrgv		PL_stderrgv
+#define PL_Istdingv		PL_stdingv
+#define PL_Istrtab		PL_strtab
+#define PL_Istrtab_mutex	PL_strtab_mutex
+#define PL_Isub_generation	PL_sub_generation
+#define PL_Isublex_info		PL_sublex_info
+#define PL_Isubline		PL_subline
+#define PL_Isubname		PL_subname
+#define PL_Isuidscript		PL_suidscript
+#define PL_Isv_arenaroot	PL_sv_arenaroot
+#define PL_Isv_count		PL_sv_count
+#define PL_Isv_lock_mutex	PL_sv_lock_mutex
+#define PL_Isv_mutex		PL_sv_mutex
+#define PL_Isv_no		PL_sv_no
+#define PL_Isv_objcount		PL_sv_objcount
+#define PL_Isv_root		PL_sv_root
+#define PL_Isv_undef		PL_sv_undef
+#define PL_Isv_yes		PL_sv_yes
+#define PL_Isvref_mutex		PL_svref_mutex
+#define PL_Isys_intern		PL_sys_intern
+#define PL_Itaint_warn		PL_taint_warn
+#define PL_Itainting		PL_tainting
+#define PL_Ithreadhook		PL_threadhook
+#define PL_Ithreadnum		PL_threadnum
+#define PL_Ithreads_mutex	PL_threads_mutex
+#define PL_Ithreadsv_names	PL_threadsv_names
+#define PL_Ithrsv		PL_thrsv
+#define PL_Itokenbuf		PL_tokenbuf
+#define PL_Iuid			PL_uid
+#define PL_Iunicode		PL_unicode
+#define PL_Iunlockhook		PL_unlockhook
+#define PL_Iunsafe		PL_unsafe
+#define PL_Iutf8_alnum		PL_utf8_alnum
+#define PL_Iutf8_alnumc		PL_utf8_alnumc
+#define PL_Iutf8_alpha		PL_utf8_alpha
+#define PL_Iutf8_ascii		PL_utf8_ascii
+#define PL_Iutf8_cntrl		PL_utf8_cntrl
+#define PL_Iutf8_digit		PL_utf8_digit
+#define PL_Iutf8_graph		PL_utf8_graph
+#define PL_Iutf8_idcont		PL_utf8_idcont
+#define PL_Iutf8_idstart	PL_utf8_idstart
+#define PL_Iutf8_lower		PL_utf8_lower
+#define PL_Iutf8_mark		PL_utf8_mark
+#define PL_Iutf8_print		PL_utf8_print
+#define PL_Iutf8_punct		PL_utf8_punct
+#define PL_Iutf8_space		PL_utf8_space
+#define PL_Iutf8_tofold		PL_utf8_tofold
+#define PL_Iutf8_tolower	PL_utf8_tolower
+#define PL_Iutf8_totitle	PL_utf8_totitle
+#define PL_Iutf8_toupper	PL_utf8_toupper
+#define PL_Iutf8_upper		PL_utf8_upper
+#define PL_Iutf8_xdigit		PL_utf8_xdigit
+#define PL_Iutf8locale		PL_utf8locale
+#define PL_Iuudmap		PL_uudmap
+#define PL_Iwarnhook		PL_warnhook
+#define PL_Iwidesyscalls	PL_widesyscalls
+#define PL_Ixiv_arenaroot	PL_xiv_arenaroot
+#define PL_Ixiv_root		PL_xiv_root
+#define PL_Ixnv_arenaroot	PL_xnv_arenaroot
+#define PL_Ixnv_root		PL_xnv_root
+#define PL_Ixpv_arenaroot	PL_xpv_arenaroot
+#define PL_Ixpv_root		PL_xpv_root
+#define PL_Ixpvav_arenaroot	PL_xpvav_arenaroot
+#define PL_Ixpvav_root		PL_xpvav_root
+#define PL_Ixpvbm_arenaroot	PL_xpvbm_arenaroot
+#define PL_Ixpvbm_root		PL_xpvbm_root
+#define PL_Ixpvcv_arenaroot	PL_xpvcv_arenaroot
+#define PL_Ixpvcv_root		PL_xpvcv_root
+#define PL_Ixpvhv_arenaroot	PL_xpvhv_arenaroot
+#define PL_Ixpvhv_root		PL_xpvhv_root
+#define PL_Ixpviv_arenaroot	PL_xpviv_arenaroot
+#define PL_Ixpviv_root		PL_xpviv_root
+#define PL_Ixpvlv_arenaroot	PL_xpvlv_arenaroot
+#define PL_Ixpvlv_root		PL_xpvlv_root
+#define PL_Ixpvmg_arenaroot	PL_xpvmg_arenaroot
+#define PL_Ixpvmg_root		PL_xpvmg_root
+#define PL_Ixpvnv_arenaroot	PL_xpvnv_arenaroot
+#define PL_Ixpvnv_root		PL_xpvnv_root
+#define PL_Ixrv_arenaroot	PL_xrv_arenaroot
+#define PL_Ixrv_root		PL_xrv_root
+#define PL_Iyychar		PL_yychar
+#define PL_Iyydebug		PL_yydebug
+#define PL_Iyyerrflag		PL_yyerrflag
+#define PL_Iyylval		PL_yylval
+#define PL_Iyynerrs		PL_yynerrs
+#define PL_Iyyval		PL_yyval
+
+#  if defined(USE_5005THREADS)
+/* case 4 above */
+
+#define PL_Sv			(aTHX->TSv)
+#define PL_Xpv			(aTHX->TXpv)
+#define PL_av_fetch_sv		(aTHX->Tav_fetch_sv)
+#define PL_bodytarget		(aTHX->Tbodytarget)
+#define PL_bostr		(aTHX->Tbostr)
+#define PL_chopset		(aTHX->Tchopset)
+#define PL_colors		(aTHX->Tcolors)
+#define PL_colorset		(aTHX->Tcolorset)
+#define PL_comppad		(aTHX->Tcomppad)
+#define PL_curcop		(aTHX->Tcurcop)
+#define PL_curpad		(aTHX->Tcurpad)
+#define PL_curpm		(aTHX->Tcurpm)
+#define PL_curstack		(aTHX->Tcurstack)
+#define PL_curstackinfo		(aTHX->Tcurstackinfo)
+#define PL_curstash		(aTHX->Tcurstash)
+#define PL_defoutgv		(aTHX->Tdefoutgv)
+#define PL_defstash		(aTHX->Tdefstash)
+#define PL_delaymagic		(aTHX->Tdelaymagic)
+#define PL_dirty		(aTHX->Tdirty)
+#define PL_dumpindent		(aTHX->Tdumpindent)
+#define PL_efloatbuf		(aTHX->Tefloatbuf)
+#define PL_efloatsize		(aTHX->Tefloatsize)
+#define PL_errors		(aTHX->Terrors)
+#define PL_extralen		(aTHX->Textralen)
+#define PL_firstgv		(aTHX->Tfirstgv)
+#define PL_formtarget		(aTHX->Tformtarget)
+#define PL_hv_fetch_ent_mh	(aTHX->Thv_fetch_ent_mh)
+#define PL_hv_fetch_sv		(aTHX->Thv_fetch_sv)
+#define PL_in_eval		(aTHX->Tin_eval)
+#define PL_last_in_gv		(aTHX->Tlast_in_gv)
+#define PL_lastgotoprobe	(aTHX->Tlastgotoprobe)
+#define PL_lastscream		(aTHX->Tlastscream)
+#define PL_localizing		(aTHX->Tlocalizing)
+#define PL_mainstack		(aTHX->Tmainstack)
+#define PL_markstack		(aTHX->Tmarkstack)
+#define PL_markstack_max	(aTHX->Tmarkstack_max)
+#define PL_markstack_ptr	(aTHX->Tmarkstack_ptr)
+#define PL_maxscream		(aTHX->Tmaxscream)
+#define PL_modcount		(aTHX->Tmodcount)
+#define PL_na			(aTHX->Tna)
+#define PL_nrs			(aTHX->Tnrs)
+#define PL_ofs_sv		(aTHX->Tofs_sv)
+#define PL_op			(aTHX->Top)
+#define PL_opsave		(aTHX->Topsave)
+#define PL_peepp		(aTHX->Tpeepp)
+#define PL_protect		(aTHX->Tprotect)
+#define PL_reg_call_cc		(aTHX->Treg_call_cc)
+#define PL_reg_curpm		(aTHX->Treg_curpm)
+#define PL_reg_eval_set		(aTHX->Treg_eval_set)
+#define PL_reg_flags		(aTHX->Treg_flags)
+#define PL_reg_ganch		(aTHX->Treg_ganch)
+#define PL_reg_leftiter		(aTHX->Treg_leftiter)
+#define PL_reg_magic		(aTHX->Treg_magic)
+#define PL_reg_match_utf8	(aTHX->Treg_match_utf8)
+#define PL_reg_maxiter		(aTHX->Treg_maxiter)
+#define PL_reg_oldcurpm		(aTHX->Treg_oldcurpm)
+#define PL_reg_oldpos		(aTHX->Treg_oldpos)
+#define PL_reg_oldsaved		(aTHX->Treg_oldsaved)
+#define PL_reg_oldsavedlen	(aTHX->Treg_oldsavedlen)
+#define PL_reg_poscache		(aTHX->Treg_poscache)
+#define PL_reg_poscache_size	(aTHX->Treg_poscache_size)
+#define PL_reg_re		(aTHX->Treg_re)
+#define PL_reg_start_tmp	(aTHX->Treg_start_tmp)
+#define PL_reg_start_tmpl	(aTHX->Treg_start_tmpl)
+#define PL_reg_starttry		(aTHX->Treg_starttry)
+#define PL_reg_sv		(aTHX->Treg_sv)
+#define PL_reg_whilem_seen	(aTHX->Treg_whilem_seen)
+#define PL_regbol		(aTHX->Tregbol)
+#define PL_regcc		(aTHX->Tregcc)
+#define PL_regcode		(aTHX->Tregcode)
+#define PL_regcomp_parse	(aTHX->Tregcomp_parse)
+#define PL_regcomp_rx		(aTHX->Tregcomp_rx)
+#define PL_regcompat1		(aTHX->Tregcompat1)
+#define PL_regcompp		(aTHX->Tregcompp)
+#define PL_regdata		(aTHX->Tregdata)
+#define PL_regdummy		(aTHX->Tregdummy)
+#define PL_regendp		(aTHX->Tregendp)
+#define PL_regeol		(aTHX->Tregeol)
+#define PL_regexecp		(aTHX->Tregexecp)
+#define PL_regflags		(aTHX->Tregflags)
+#define PL_regfree		(aTHX->Tregfree)
+#define PL_regindent		(aTHX->Tregindent)
+#define PL_reginput		(aTHX->Treginput)
+#define PL_regint_start		(aTHX->Tregint_start)
+#define PL_regint_string	(aTHX->Tregint_string)
+#define PL_reginterp_cnt	(aTHX->Treginterp_cnt)
+#define PL_reglastcloseparen	(aTHX->Treglastcloseparen)
+#define PL_reglastparen		(aTHX->Treglastparen)
+#define PL_regnarrate		(aTHX->Tregnarrate)
+#define PL_regnaughty		(aTHX->Tregnaughty)
+#define PL_regnpar		(aTHX->Tregnpar)
+#define PL_regprecomp		(aTHX->Tregprecomp)
+#define PL_regprogram		(aTHX->Tregprogram)
+#define PL_regsawback		(aTHX->Tregsawback)
+#define PL_regseen		(aTHX->Tregseen)
+#define PL_regsize		(aTHX->Tregsize)
+#define PL_regstartp		(aTHX->Tregstartp)
+#define PL_regtill		(aTHX->Tregtill)
+#define PL_regxend		(aTHX->Tregxend)
+#define PL_restartop		(aTHX->Trestartop)
+#define PL_retstack		(aTHX->Tretstack)
+#define PL_retstack_ix		(aTHX->Tretstack_ix)
+#define PL_retstack_max		(aTHX->Tretstack_max)
+#define PL_rs			(aTHX->Trs)
+#define PL_savestack		(aTHX->Tsavestack)
+#define PL_savestack_ix		(aTHX->Tsavestack_ix)
+#define PL_savestack_max	(aTHX->Tsavestack_max)
+#define PL_scopestack		(aTHX->Tscopestack)
+#define PL_scopestack_ix	(aTHX->Tscopestack_ix)
+#define PL_scopestack_max	(aTHX->Tscopestack_max)
+#define PL_screamfirst		(aTHX->Tscreamfirst)
+#define PL_screamnext		(aTHX->Tscreamnext)
+#define PL_secondgv		(aTHX->Tsecondgv)
+#define PL_seen_evals		(aTHX->Tseen_evals)
+#define PL_seen_zerolen		(aTHX->Tseen_zerolen)
+#define PL_sortcop		(aTHX->Tsortcop)
+#define PL_sortcxix		(aTHX->Tsortcxix)
+#define PL_sortstash		(aTHX->Tsortstash)
+#define PL_stack_base		(aTHX->Tstack_base)
+#define PL_stack_max		(aTHX->Tstack_max)
+#define PL_stack_sp		(aTHX->Tstack_sp)
+#define PL_start_env		(aTHX->Tstart_env)
+#define PL_statbuf		(aTHX->Tstatbuf)
+#define PL_statcache		(aTHX->Tstatcache)
+#define PL_statgv		(aTHX->Tstatgv)
+#define PL_statname		(aTHX->Tstatname)
+#define PL_tainted		(aTHX->Ttainted)
+#define PL_timesbuf		(aTHX->Ttimesbuf)
+#define PL_tmps_floor		(aTHX->Ttmps_floor)
+#define PL_tmps_ix		(aTHX->Ttmps_ix)
+#define PL_tmps_max		(aTHX->Ttmps_max)
+#define PL_tmps_stack		(aTHX->Ttmps_stack)
+#define PL_top_env		(aTHX->Ttop_env)
+#define PL_toptarget		(aTHX->Ttoptarget)
+#define PL_watchaddr		(aTHX->Twatchaddr)
+#define PL_watchok		(aTHX->Twatchok)
+
+#  else	/* !USE_5005THREADS */
+/* case 1 above */
+
+#define PL_TSv			PL_Sv
+#define PL_TXpv			PL_Xpv
+#define PL_Tav_fetch_sv		PL_av_fetch_sv
+#define PL_Tbodytarget		PL_bodytarget
+#define PL_Tbostr		PL_bostr
+#define PL_Tchopset		PL_chopset
+#define PL_Tcolors		PL_colors
+#define PL_Tcolorset		PL_colorset
+#define PL_Tcomppad		PL_comppad
+#define PL_Tcurcop		PL_curcop
+#define PL_Tcurpad		PL_curpad
+#define PL_Tcurpm		PL_curpm
+#define PL_Tcurstack		PL_curstack
+#define PL_Tcurstackinfo	PL_curstackinfo
+#define PL_Tcurstash		PL_curstash
+#define PL_Tdefoutgv		PL_defoutgv
+#define PL_Tdefstash		PL_defstash
+#define PL_Tdelaymagic		PL_delaymagic
+#define PL_Tdirty		PL_dirty
+#define PL_Tdumpindent		PL_dumpindent
+#define PL_Tefloatbuf		PL_efloatbuf
+#define PL_Tefloatsize		PL_efloatsize
+#define PL_Terrors		PL_errors
+#define PL_Textralen		PL_extralen
+#define PL_Tfirstgv		PL_firstgv
+#define PL_Tformtarget		PL_formtarget
+#define PL_Thv_fetch_ent_mh	PL_hv_fetch_ent_mh
+#define PL_Thv_fetch_sv		PL_hv_fetch_sv
+#define PL_Tin_eval		PL_in_eval
+#define PL_Tlast_in_gv		PL_last_in_gv
+#define PL_Tlastgotoprobe	PL_lastgotoprobe
+#define PL_Tlastscream		PL_lastscream
+#define PL_Tlocalizing		PL_localizing
+#define PL_Tmainstack		PL_mainstack
+#define PL_Tmarkstack		PL_markstack
+#define PL_Tmarkstack_max	PL_markstack_max
+#define PL_Tmarkstack_ptr	PL_markstack_ptr
+#define PL_Tmaxscream		PL_maxscream
+#define PL_Tmodcount		PL_modcount
+#define PL_Tna			PL_na
+#define PL_Tnrs			PL_nrs
+#define PL_Tofs_sv		PL_ofs_sv
+#define PL_Top			PL_op
+#define PL_Topsave		PL_opsave
+#define PL_Tpeepp		PL_peepp
+#define PL_Tprotect		PL_protect
+#define PL_Treg_call_cc		PL_reg_call_cc
+#define PL_Treg_curpm		PL_reg_curpm
+#define PL_Treg_eval_set	PL_reg_eval_set
+#define PL_Treg_flags		PL_reg_flags
+#define PL_Treg_ganch		PL_reg_ganch
+#define PL_Treg_leftiter	PL_reg_leftiter
+#define PL_Treg_magic		PL_reg_magic
+#define PL_Treg_match_utf8	PL_reg_match_utf8
+#define PL_Treg_maxiter		PL_reg_maxiter
+#define PL_Treg_oldcurpm	PL_reg_oldcurpm
+#define PL_Treg_oldpos		PL_reg_oldpos
+#define PL_Treg_oldsaved	PL_reg_oldsaved
+#define PL_Treg_oldsavedlen	PL_reg_oldsavedlen
+#define PL_Treg_poscache	PL_reg_poscache
+#define PL_Treg_poscache_size	PL_reg_poscache_size
+#define PL_Treg_re		PL_reg_re
+#define PL_Treg_start_tmp	PL_reg_start_tmp
+#define PL_Treg_start_tmpl	PL_reg_start_tmpl
+#define PL_Treg_starttry	PL_reg_starttry
+#define PL_Treg_sv		PL_reg_sv
+#define PL_Treg_whilem_seen	PL_reg_whilem_seen
+#define PL_Tregbol		PL_regbol
+#define PL_Tregcc		PL_regcc
+#define PL_Tregcode		PL_regcode
+#define PL_Tregcomp_parse	PL_regcomp_parse
+#define PL_Tregcomp_rx		PL_regcomp_rx
+#define PL_Tregcompat1		PL_regcompat1
+#define PL_Tregcompp		PL_regcompp
+#define PL_Tregdata		PL_regdata
+#define PL_Tregdummy		PL_regdummy
+#define PL_Tregendp		PL_regendp
+#define PL_Tregeol		PL_regeol
+#define PL_Tregexecp		PL_regexecp
+#define PL_Tregflags		PL_regflags
+#define PL_Tregfree		PL_regfree
+#define PL_Tregindent		PL_regindent
+#define PL_Treginput		PL_reginput
+#define PL_Tregint_start	PL_regint_start
+#define PL_Tregint_string	PL_regint_string
+#define PL_Treginterp_cnt	PL_reginterp_cnt
+#define PL_Treglastcloseparen	PL_reglastcloseparen
+#define PL_Treglastparen	PL_reglastparen
+#define PL_Tregnarrate		PL_regnarrate
+#define PL_Tregnaughty		PL_regnaughty
+#define PL_Tregnpar		PL_regnpar
+#define PL_Tregprecomp		PL_regprecomp
+#define PL_Tregprogram		PL_regprogram
+#define PL_Tregsawback		PL_regsawback
+#define PL_Tregseen		PL_regseen
+#define PL_Tregsize		PL_regsize
+#define PL_Tregstartp		PL_regstartp
+#define PL_Tregtill		PL_regtill
+#define PL_Tregxend		PL_regxend
+#define PL_Trestartop		PL_restartop
+#define PL_Tretstack		PL_retstack
+#define PL_Tretstack_ix		PL_retstack_ix
+#define PL_Tretstack_max	PL_retstack_max
+#define PL_Trs			PL_rs
+#define PL_Tsavestack		PL_savestack
+#define PL_Tsavestack_ix	PL_savestack_ix
+#define PL_Tsavestack_max	PL_savestack_max
+#define PL_Tscopestack		PL_scopestack
+#define PL_Tscopestack_ix	PL_scopestack_ix
+#define PL_Tscopestack_max	PL_scopestack_max
+#define PL_Tscreamfirst		PL_screamfirst
+#define PL_Tscreamnext		PL_screamnext
+#define PL_Tsecondgv		PL_secondgv
+#define PL_Tseen_evals		PL_seen_evals
+#define PL_Tseen_zerolen	PL_seen_zerolen
+#define PL_Tsortcop		PL_sortcop
+#define PL_Tsortcxix		PL_sortcxix
+#define PL_Tsortstash		PL_sortstash
+#define PL_Tstack_base		PL_stack_base
+#define PL_Tstack_max		PL_stack_max
+#define PL_Tstack_sp		PL_stack_sp
+#define PL_Tstart_env		PL_start_env
+#define PL_Tstatbuf		PL_statbuf
+#define PL_Tstatcache		PL_statcache
+#define PL_Tstatgv		PL_statgv
+#define PL_Tstatname		PL_statname
+#define PL_Ttainted		PL_tainted
+#define PL_Ttimesbuf		PL_timesbuf
+#define PL_Ttmps_floor		PL_tmps_floor
+#define PL_Ttmps_ix		PL_tmps_ix
+#define PL_Ttmps_max		PL_tmps_max
+#define PL_Ttmps_stack		PL_tmps_stack
+#define PL_Ttop_env		PL_top_env
+#define PL_Ttoptarget		PL_toptarget
+#define PL_Twatchaddr		PL_watchaddr
+#define PL_Twatchok		PL_watchok
+
+#  endif	/* USE_5005THREADS */
+#endif	/* MULTIPLICITY */
+
+#if defined(PERL_GLOBAL_STRUCT)
+
+#define PL_No			(PL_Vars.GNo)
+#define PL_Yes			(PL_Vars.GYes)
+#define PL_csighandlerp		(PL_Vars.Gcsighandlerp)
+#define PL_curinterp		(PL_Vars.Gcurinterp)
+#define PL_do_undump		(PL_Vars.Gdo_undump)
+#define PL_dollarzero_mutex	(PL_Vars.Gdollarzero_mutex)
+#define PL_hexdigit		(PL_Vars.Ghexdigit)
+#define PL_malloc_mutex		(PL_Vars.Gmalloc_mutex)
+#define PL_op_mutex		(PL_Vars.Gop_mutex)
+#define PL_patleave		(PL_Vars.Gpatleave)
+#define PL_sh_path		(PL_Vars.Gsh_path)
+#define PL_sigfpe_saved		(PL_Vars.Gsigfpe_saved)
+#define PL_sv_placeholder	(PL_Vars.Gsv_placeholder)
+#define PL_thr_key		(PL_Vars.Gthr_key)
+#define PL_use_safe_putenv	(PL_Vars.Guse_safe_putenv)
+
+#else /* !PERL_GLOBAL_STRUCT */
+
+#define PL_GNo			PL_No
+#define PL_GYes			PL_Yes
+#define PL_Gcsighandlerp	PL_csighandlerp
+#define PL_Gcurinterp		PL_curinterp
+#define PL_Gdo_undump		PL_do_undump
+#define PL_Gdollarzero_mutex	PL_dollarzero_mutex
+#define PL_Ghexdigit		PL_hexdigit
+#define PL_Gmalloc_mutex	PL_malloc_mutex
+#define PL_Gop_mutex		PL_op_mutex
+#define PL_Gpatleave		PL_patleave
+#define PL_Gsh_path		PL_sh_path
+#define PL_Gsigfpe_saved	PL_sigfpe_saved
+#define PL_Gsv_placeholder	PL_sv_placeholder
+#define PL_Gthr_key		PL_thr_key
+#define PL_Guse_safe_putenv	PL_use_safe_putenv
+
+#endif /* PERL_GLOBAL_STRUCT */
+
+#ifdef PERL_POLLUTE		/* disabled by default in 5.6.0 */
+
+#define DBsingle		PL_DBsingle
+#define DBsub			PL_DBsub
+#define compiling		PL_compiling
+#define curcop			PL_curcop
+#define curstash		PL_curstash
+#define debstash		PL_debstash
+#define defgv			PL_defgv
+#define diehook			PL_diehook
+#define dirty			PL_dirty
+#define dowarn			PL_dowarn
+#define errgv			PL_errgv
+#define na			PL_na
+#define no_modify		PL_no_modify
+#define perl_destruct_level	PL_perl_destruct_level
+#define perldb			PL_perldb
+#define ppaddr			PL_ppaddr
+#define rsfp			PL_rsfp
+#define rsfp_filters		PL_rsfp_filters
+#define stack_base		PL_stack_base
+#define stack_sp		PL_stack_sp
+#define stdingv			PL_stdingv
+#define sv_arenaroot		PL_sv_arenaroot
+#define sv_no			PL_sv_no
+#define sv_undef		PL_sv_undef
+#define sv_yes			PL_sv_yes
+#define tainted			PL_tainted
+#define tainting		PL_tainting
+
+#endif /* PERL_POLLUTE */
+
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/fakesdio.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/fakesdio.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/fakesdio.h	(revision 14489)
@@ -0,0 +1,125 @@
+/*    fakestdio.h
+ *
+ *    Copyright (C) 2000, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * This is "source level" stdio compatibility mode.
+ * We try and #define stdio functions in terms of PerlIO.
+ */
+#define _CANNOT "CANNOT"
+#undef FILE
+#define FILE			PerlIO
+#undef clearerr
+#undef fclose
+#undef fdopen
+#undef feof
+#undef ferror
+#undef fflush
+#undef fgetc
+#undef fgetpos
+#undef fgets
+#undef fileno
+#undef flockfile
+#undef fopen
+#undef fprintf
+#undef fputc
+#undef fputs
+#undef fread
+#undef freopen
+#undef fscanf
+#undef fseek
+#undef fsetpos
+#undef ftell
+#undef ftrylockfile
+#undef funlockfile
+#undef fwrite
+#undef getc
+#undef getc_unlocked
+#undef getw
+#undef pclose
+#undef popen
+#undef putc
+#undef putc_unlocked
+#undef putw
+#undef rewind
+#undef setbuf
+#undef setvbuf
+#undef stderr
+#undef stdin
+#undef stdout
+#undef tmpfile
+#undef ungetc
+#undef vfprintf
+#undef printf
+
+/* printf used to live in perl.h like this - more sophisticated 
+   than the rest 
+ */
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#define printf(fmt,args...) PerlIO_stdoutf(fmt,##args)
+#else
+#define printf PerlIO_stdoutf
+#endif
+#endif
+
+#define fprintf			PerlIO_printf
+#define stdin			PerlIO_stdin()
+#define stdout			PerlIO_stdout()
+#define stderr			PerlIO_stderr()
+#define tmpfile()		PerlIO_tmpfile()
+#define fclose(f)		PerlIO_close(f)
+#define fflush(f)		PerlIO_flush(f)
+#define fopen(p,m)		PerlIO_open(p,m)
+#define vfprintf(f,fmt,a)	PerlIO_vprintf(f,fmt,a)
+#define fgetc(f)		PerlIO_getc(f)
+#define fputc(c,f)		PerlIO_putc(f,c)
+#define fputs(s,f)		PerlIO_puts(f,s)
+#define getc(f)			PerlIO_getc(f)
+#define getc_unlocked(f)	PerlIO_getc(f)
+#define putc(c,f)		PerlIO_putc(f,c)
+#define putc_unlocked(c,f)	PerlIO_putc(c,f)
+#define ungetc(c,f)		PerlIO_ungetc(f,c)
+#if 0
+/* return values of read/write need work */
+#define fread(b,s,c,f)		PerlIO_read(f,b,(s*c))
+#define fwrite(b,s,c,f)		PerlIO_write(f,b,(s*c))
+#else
+#define fread(b,s,c,f)		_CANNOT fread
+#define fwrite(b,s,c,f)		_CANNOT fwrite
+#endif
+#define fseek(f,o,w)		PerlIO_seek(f,o,w)
+#define ftell(f)		PerlIO_tell(f)
+#define rewind(f)		PerlIO_rewind(f)
+#define clearerr(f)		PerlIO_clearerr(f)
+#define feof(f)			PerlIO_eof(f)
+#define ferror(f)		PerlIO_error(f)
+#define fdopen(fd,p)		PerlIO_fdopen(fd,p)
+#define fileno(f)		PerlIO_fileno(f)
+#define popen(c,m)		my_popen(c,m)
+#define pclose(f)		my_pclose(f)
+
+#define fsetpos(f,p)		_CANNOT _fsetpos_
+#define fgetpos(f,p)		_CANNOT _fgetpos_
+
+#define __filbuf(f)		_CANNOT __filbuf_
+#define _filbuf(f)		_CANNOT _filbuf_
+#define __flsbuf(c,f)		_CANNOT __flsbuf_
+#define _flsbuf(c,f)		_CANNOT _flsbuf_
+#define getw(f)			_CANNOT _getw_
+#define putw(v,f)		_CANNOT _putw_
+#if SFIO_VERSION < 20000101L
+#define flockfile(f)		_CANNOT _flockfile_
+#define ftrylockfile(f)		_CANNOT _ftrylockfile_
+#define funlockfile(f)		_CANNOT _funlockfile_
+#endif
+#define freopen(p,m,f)		_CANNOT _freopen_
+#define setbuf(f,b)		_CANNOT _setbuf_
+#define setvbuf(f,b,x,s)	_CANNOT _setvbuf_
+#define fscanf			_CANNOT _fscanf_
+#define fgets(s,n,f)		_CANNOT _fgets_
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/fakethr.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/fakethr.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/fakethr.h	(revision 14489)
@@ -0,0 +1,65 @@
+/*    fakethr.h
+ *
+ *    Copyright (C) 1999, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+typedef int perl_mutex;
+typedef int perl_key;
+
+typedef struct perl_thread *perl_os_thread;
+/* With fake threads, thr is global(ish) so we don't need dTHR */
+#define dTHR extern int errno
+
+struct perl_wait_queue {
+    struct perl_thread *	thread;
+    struct perl_wait_queue *	next;
+};
+typedef struct perl_wait_queue *perl_cond;
+
+/* Ask thread.h to include our per-thread extras */
+#define HAVE_THREAD_INTERN
+struct thread_intern {
+    perl_os_thread next_run, prev_run;  /* Linked list of runnable threads */
+    perl_cond   wait_queue;             /* Wait queue that we are waiting on */
+    IV          private;                /* Holds data across time slices */
+    I32         savemark;               /* Holds MARK for thread join values */
+};
+
+#define init_thread_intern(t) 				\
+    STMT_START {					\
+	t->self = (t);					\
+	(t)->i.next_run = (t)->i.prev_run = (t);	\
+	(t)->i.wait_queue = 0;				\
+	(t)->i.private = 0;				\
+    } STMT_END
+
+/*
+ * Note that SCHEDULE() is only callable from pp code (which
+ * must be expecting to be restarted). We'll have to do
+ * something a bit different for XS code.
+ */
+
+#define SCHEDULE() return schedule(), PL_op
+
+#define MUTEX_LOCK(m)
+#define MUTEX_UNLOCK(m)
+#define MUTEX_INIT(m)
+#define MUTEX_DESTROY(m)
+#define COND_INIT(c) perl_cond_init(c)
+#define COND_SIGNAL(c) perl_cond_signal(c)
+#define COND_BROADCAST(c) perl_cond_broadcast(c)
+#define COND_WAIT(c, m)		\
+    STMT_START {		\
+	perl_cond_wait(c);	\
+	SCHEDULE();		\
+    } STMT_END
+#define COND_DESTROY(c)
+
+#define THREAD_CREATE(t, f)	f((t))
+#define THREAD_POST_CREATE(t)	NOOP
+
+#define YIELD	NOOP
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/form.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/form.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/form.h	(revision 14489)
@@ -0,0 +1,27 @@
+/*    form.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 2000, 2004 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#define FF_END          0
+#define FF_LINEMARK     1
+#define FF_LITERAL      2
+#define FF_SKIP         3
+#define FF_FETCH        4
+#define FF_CHECKNL      5
+#define FF_CHECKCHOP    6
+#define FF_SPACE        7
+#define FF_HALFSPACE    8
+#define FF_ITEM         9
+#define FF_CHOP         10
+#define FF_LINEGLOB     11
+#define FF_DECIMAL      12
+#define FF_NEWLINE      13
+#define FF_BLANK        14
+#define FF_MORE         15
+#define FF_0DECIMAL     16
+#define FF_LINESNGL     17
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/gv.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/gv.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/gv.h	(revision 14489)
@@ -0,0 +1,166 @@
+/*    gv.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+struct gp {
+    SV *	gp_sv;		/* scalar value */
+    U32		gp_refcnt;	/* how many globs point to this? */
+    struct io *	gp_io;		/* filehandle value */
+    CV *	gp_form;	/* format value */
+    AV *	gp_av;		/* array value */
+    HV *	gp_hv;		/* hash value */
+    GV *	gp_egv;		/* effective gv, if *glob */
+    CV *	gp_cv;		/* subroutine value */
+    U32		gp_cvgen;	/* generational validity of cached gv_cv */
+    U32		gp_flags;	/* XXX unused */
+    line_t	gp_line;	/* line first declared at (for -w) */
+    char *	gp_file;	/* file first declared in (for -w) */
+};
+
+#define GvXPVGV(gv)	((XPVGV*)SvANY(gv))
+
+#define GvGP(gv)	(GvXPVGV(gv)->xgv_gp)
+#define GvNAME(gv)	(GvXPVGV(gv)->xgv_name)
+#define GvNAMELEN(gv)	(GvXPVGV(gv)->xgv_namelen)
+#define GvSTASH(gv)	(GvXPVGV(gv)->xgv_stash)
+#define GvFLAGS(gv)	(GvXPVGV(gv)->xgv_flags)
+
+/*
+=head1 GV Functions
+
+=for apidoc Am|SV*|GvSV|GV* gv
+
+Return the SV from the GV.
+
+=cut
+*/
+
+#define GvSV(gv)	(GvGP(gv)->gp_sv)
+#ifdef PERL_DONT_CREATE_GVSV
+#define GvSVn(gv)	(*(GvGP(gv)->gp_sv ? \
+			 &(GvGP(gv)->gp_sv) : \
+			 &(GvGP(gv_SVadd(gv))->gp_sv)))
+#else
+#define GvSVn(gv)	GvSV(gv)
+#endif
+
+#define GvREFCNT(gv)	(GvGP(gv)->gp_refcnt)
+#define GvIO(gv)	((gv) && SvTYPE((SV*)gv) == SVt_PVGV && GvGP(gv) ? GvIOp(gv) : 0)
+#define GvIOp(gv)	(GvGP(gv)->gp_io)
+#define GvIOn(gv)	(GvIO(gv) ? GvIOp(gv) : GvIOp(gv_IOadd(gv)))
+
+#define GvFORM(gv)	(GvGP(gv)->gp_form)
+#define GvAV(gv)	(GvGP(gv)->gp_av)
+
+/* This macro is deprecated.  Do not use! */
+#define GvREFCNT_inc(gv) ((GV*)SvREFCNT_inc(gv))	/* DO NOT USE */
+
+#define GvAVn(gv)	(GvGP(gv)->gp_av ? \
+			 GvGP(gv)->gp_av : \
+			 GvGP(gv_AVadd(gv))->gp_av)
+#define GvHV(gv)	((GvGP(gv))->gp_hv)
+
+#define GvHVn(gv)	(GvGP(gv)->gp_hv ? \
+			 GvGP(gv)->gp_hv : \
+			 GvGP(gv_HVadd(gv))->gp_hv)
+
+#define GvCV(gv)	(GvGP(gv)->gp_cv)
+#define GvCVGEN(gv)	(GvGP(gv)->gp_cvgen)
+#define GvCVu(gv)	(GvGP(gv)->gp_cvgen ? Nullcv : GvGP(gv)->gp_cv)
+
+#define GvGPFLAGS(gv)	(GvGP(gv)->gp_flags)
+
+#define GvLINE(gv)	(GvGP(gv)->gp_line)
+#define GvFILE(gv)	(GvGP(gv)->gp_file)
+#define GvFILEGV(gv)	(gv_fetchfile(GvFILE(gv)))
+
+#define GvEGV(gv)	(GvGP(gv)->gp_egv)
+#define GvENAME(gv)	GvNAME(GvEGV(gv) ? GvEGV(gv) : gv)
+#define GvESTASH(gv)	GvSTASH(GvEGV(gv) ? GvEGV(gv) : gv)
+
+#define GVf_INTRO	0x01
+#define GVf_MULTI	0x02
+#define GVf_ASSUMECV	0x04
+#define GVf_IN_PAD	0x08
+#define GVf_IMPORTED	0xF0
+#define GVf_IMPORTED_SV	  0x10
+#define GVf_IMPORTED_AV	  0x20
+#define GVf_IMPORTED_HV	  0x40
+#define GVf_IMPORTED_CV	  0x80
+
+#define GvINTRO(gv)		(GvFLAGS(gv) & GVf_INTRO)
+#define GvINTRO_on(gv)		(GvFLAGS(gv) |= GVf_INTRO)
+#define GvINTRO_off(gv)		(GvFLAGS(gv) &= ~GVf_INTRO)
+
+#define GvMULTI(gv)		(GvFLAGS(gv) & GVf_MULTI)
+#define GvMULTI_on(gv)		(GvFLAGS(gv) |= GVf_MULTI)
+#define GvMULTI_off(gv)		(GvFLAGS(gv) &= ~GVf_MULTI)
+
+#define GvASSUMECV(gv)		(GvFLAGS(gv) & GVf_ASSUMECV)
+#define GvASSUMECV_on(gv)	(GvFLAGS(gv) |= GVf_ASSUMECV)
+#define GvASSUMECV_off(gv)	(GvFLAGS(gv) &= ~GVf_ASSUMECV)
+
+#define GvIMPORTED(gv)		(GvFLAGS(gv) & GVf_IMPORTED)
+#define GvIMPORTED_on(gv)	(GvFLAGS(gv) |= GVf_IMPORTED)
+#define GvIMPORTED_off(gv)	(GvFLAGS(gv) &= ~GVf_IMPORTED)
+
+#define GvIMPORTED_SV(gv)	(GvFLAGS(gv) & GVf_IMPORTED_SV)
+#define GvIMPORTED_SV_on(gv)	(GvFLAGS(gv) |= GVf_IMPORTED_SV)
+#define GvIMPORTED_SV_off(gv)	(GvFLAGS(gv) &= ~GVf_IMPORTED_SV)
+
+#define GvIMPORTED_AV(gv)	(GvFLAGS(gv) & GVf_IMPORTED_AV)
+#define GvIMPORTED_AV_on(gv)	(GvFLAGS(gv) |= GVf_IMPORTED_AV)
+#define GvIMPORTED_AV_off(gv)	(GvFLAGS(gv) &= ~GVf_IMPORTED_AV)
+
+#define GvIMPORTED_HV(gv)	(GvFLAGS(gv) & GVf_IMPORTED_HV)
+#define GvIMPORTED_HV_on(gv)	(GvFLAGS(gv) |= GVf_IMPORTED_HV)
+#define GvIMPORTED_HV_off(gv)	(GvFLAGS(gv) &= ~GVf_IMPORTED_HV)
+
+#define GvIMPORTED_CV(gv)	(GvFLAGS(gv) & GVf_IMPORTED_CV)
+#define GvIMPORTED_CV_on(gv)	(GvFLAGS(gv) |= GVf_IMPORTED_CV)
+#define GvIMPORTED_CV_off(gv)	(GvFLAGS(gv) &= ~GVf_IMPORTED_CV)
+
+#define GvIN_PAD(gv)		(GvFLAGS(gv) & GVf_IN_PAD)
+#define GvIN_PAD_on(gv)		(GvFLAGS(gv) |= GVf_IN_PAD)
+#define GvIN_PAD_off(gv)	(GvFLAGS(gv) &= ~GVf_IN_PAD)
+
+/* XXX: all GvFLAGS options are used, borrowing GvGPFLAGS for the moment */
+
+#define GVf_UNIQUE           0x0001
+#define GvUNIQUE(gv)         (GvGP(gv) && (GvGPFLAGS(gv) & GVf_UNIQUE))
+#define GvUNIQUE_on(gv)      (GvGPFLAGS(gv) |= GVf_UNIQUE)
+#define GvUNIQUE_off(gv)     (GvGPFLAGS(gv) &= ~GVf_UNIQUE)
+
+#ifdef USE_ITHREADS
+#define GV_UNIQUE_CHECK
+#else
+#undef  GV_UNIQUE_CHECK
+#endif
+
+#define Nullgv Null(GV*)
+
+#define DM_UID   0x003
+#define DM_RUID   0x001
+#define DM_EUID   0x002
+#define DM_GID   0x030
+#define DM_RGID   0x010
+#define DM_EGID   0x020
+#define DM_DELAY 0x100
+
+/*
+ * symbol creation flags, for use in gv_fetchpv() and get_*v()
+ */
+#define GV_ADD		0x01	/* add, if symbol not already there */
+#define GV_ADDMULTI	0x02	/* add, pretending it has been added already */
+#define GV_ADDWARN	0x04	/* add, but warn if symbol wasn't already there */
+#define GV_ADDINEVAL	0x08	/* add, as though we're doing so within an eval */
+#define GV_NOINIT	0x10	/* add, but don't init symbol, if type != PVGV */
+
+#define gv_fullname3(sv,gv,prefix) gv_fullname4(sv,gv,prefix,TRUE)
+#define gv_efullname3(sv,gv,prefix) gv_efullname4(sv,gv,prefix,TRUE)
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/handy.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/handy.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/handy.h	(revision 14489)
@@ -0,0 +1,709 @@
+/*    handy.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999,
+ *    2000, 2001, 2002, 2004, 2005, 2006, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#if !defined(__STDC__)
+#ifdef NULL
+#undef NULL
+#endif
+#ifndef I286
+#  define NULL 0
+#else
+#  define NULL 0L
+#endif
+#endif
+
+#define Null(type) ((type)NULL)
+
+/*
+=head1 Handy Values
+
+=for apidoc AmU||Nullch 
+Null character pointer.
+
+=for apidoc AmU||Nullsv
+Null SV pointer.
+
+=cut
+*/
+
+#define Nullch Null(char*)
+#define Nullfp Null(PerlIO*)
+#define Nullsv Null(SV*)
+
+#ifdef TRUE
+#undef TRUE
+#endif
+#ifdef FALSE
+#undef FALSE
+#endif
+#define TRUE (1)
+#define FALSE (0)
+
+
+/* XXX Configure ought to have a test for a boolean type, if I can
+   just figure out all the headers such a test needs.
+   Andy Dougherty	August 1996
+*/
+/* bool is built-in for g++-2.6.3 and later, which might be used
+   for extensions.  <_G_config.h> defines _G_HAVE_BOOL, but we can't
+   be sure _G_config.h will be included before this file.  _G_config.h
+   also defines _G_HAVE_BOOL for both gcc and g++, but only g++
+   actually has bool.  Hence, _G_HAVE_BOOL is pretty useless for us.
+   g++ can be identified by __GNUG__.
+   Andy Dougherty	February 2000
+*/
+#ifdef __GNUG__ 	/* GNU g++ has bool built-in */
+#  ifndef HAS_BOOL
+#    define HAS_BOOL 1
+#  endif
+#endif
+
+/* The NeXT dynamic loader headers will not build with the bool macro
+   So declare them now to clear confusion.
+*/
+#if defined(NeXT) || defined(__NeXT__)
+# undef FALSE
+# undef TRUE
+  typedef enum bool { FALSE = 0, TRUE = 1 } bool;
+# define ENUM_BOOL 1
+# ifndef HAS_BOOL
+#  define HAS_BOOL 1
+# endif /* !HAS_BOOL */
+#endif /* NeXT || __NeXT__ */
+
+#ifndef HAS_BOOL
+# if defined(UTS) || defined(VMS)
+#  define bool int
+# else
+#  define bool char
+# endif
+# define HAS_BOOL 1
+#endif
+
+/* Try to figure out __func__ or __FUNCTION__ equivalent, if any.
+ * XXX Should really be a Configure probe, with HAS__FUNCTION__
+ *     and FUNCTION__ as results.
+ * XXX Similarly, a Configure probe for __FILE__ and __LINE__ is needed. */
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__SUNPRO_C)) /* C99 or close enough. */
+#  define FUNCTION__ __func__
+#else
+#  if (defined(_MSC_VER) && _MSC_VER < 1300) || /* Pre-MSVC 7.0 has neither __func__ nor __FUNCTION and no good workarounds, either. */ \
+      (defined(__DECC_VER)) /* Tru64 or VMS, and strict C89 being used, but not modern enough cc (in Tur64, -c99 not known, only -std1). */
+#    define FUNCTION__ ""
+#  else
+#    define FUNCTION__ __FUNCTION__ /* Common extension. */
+#  endif
+#endif
+
+/* XXX A note on the perl source internal type system.  The
+   original intent was that I32 be *exactly* 32 bits.
+
+   Currently, we only guarantee that I32 is *at least* 32 bits.
+   Specifically, if int is 64 bits, then so is I32.  (This is the case
+   for the Cray.)  This has the advantage of meshing nicely with
+   standard library calls (where we pass an I32 and the library is
+   expecting an int), but the disadvantage that an I32 is not 32 bits.
+   Andy Dougherty	August 1996
+
+   There is no guarantee that there is *any* integral type with
+   exactly 32 bits.  It is perfectly legal for a system to have
+   sizeof(short) == sizeof(int) == sizeof(long) == 8.
+
+   Similarly, there is no guarantee that I16 and U16 have exactly 16
+   bits.
+
+   For dealing with issues that may arise from various 32/64-bit
+   systems, we will ask Configure to check out
+
+   	SHORTSIZE == sizeof(short)
+   	INTSIZE == sizeof(int)
+   	LONGSIZE == sizeof(long)
+	LONGLONGSIZE == sizeof(long long) (if HAS_LONG_LONG)
+   	PTRSIZE == sizeof(void *)
+	DOUBLESIZE == sizeof(double)
+	LONG_DOUBLESIZE == sizeof(long double) (if HAS_LONG_DOUBLE).
+
+*/
+
+#ifdef I_INTTYPES /* e.g. Linux has int64_t without <inttypes.h> */
+#   include <inttypes.h>
+#   ifdef INT32_MIN_BROKEN
+#       undef  INT32_MIN
+#       define INT32_MIN (-2147483647-1)
+#   endif
+#   ifdef INT64_MIN_BROKEN
+#       undef  INT64_MIN
+#       define INT64_MIN (-9223372036854775807LL-1)
+#   endif
+#endif
+
+typedef I8TYPE I8;
+typedef U8TYPE U8;
+typedef I16TYPE I16;
+typedef U16TYPE U16;
+typedef I32TYPE I32;
+typedef U32TYPE U32;
+#ifdef PERL_CORE
+#   ifdef HAS_QUAD
+typedef I64TYPE I64;
+typedef U64TYPE U64;
+#   endif
+#endif /* PERL_CORE */
+
+#if defined(HAS_QUAD) && defined(USE_64_BIT_INT)
+#   ifndef UINT64_C /* usually from <inttypes.h> */
+#       if defined(HAS_LONG_LONG) && QUADKIND == QUAD_IS_LONG_LONG
+#           define INT64_C(c)	CAT2(c,LL)
+#           define UINT64_C(c)	CAT2(c,ULL)
+#       else
+#           if LONGSIZE == 8 && QUADKIND == QUAD_IS_LONG
+#               define INT64_C(c)	CAT2(c,L)
+#               define UINT64_C(c)	CAT2(c,UL)
+#           else
+#               define INT64_C(c)	((I64TYPE)(c))
+#               define UINT64_C(c)	((U64TYPE)(c))
+#           endif
+#       endif
+#   endif
+#endif
+
+/* HMB H.Merijn Brand - a placeholder for preparing Configure patches */
+#if defined(HAS_MALLOC_SIZE) && defined(HAS_MALLOC_GOOD_SIZE)
+/* Not (yet) used at top level, but mention them for metaconfig */
+#endif
+
+/* Mention I8SIZE, U8SIZE, I16SIZE, U16SIZE, I32SIZE, U32SIZE,
+   I64SIZE, and U64SIZE here so that metaconfig pulls them in. */
+
+#if defined(UINT8_MAX) && defined(INT16_MAX) && defined(INT32_MAX)
+
+/* I8_MAX and I8_MIN constants are not defined, as I8 is an ambiguous type.
+   Please search CHAR_MAX in perl.h for further details. */
+#define U8_MAX UINT8_MAX
+#define U8_MIN UINT8_MIN
+
+#define I16_MAX INT16_MAX
+#define I16_MIN INT16_MIN
+#define U16_MAX UINT16_MAX
+#define U16_MIN UINT16_MIN
+
+#define I32_MAX INT32_MAX
+#define I32_MIN INT32_MIN
+#ifndef UINT32_MAX_BROKEN /* e.g. HP-UX with gcc messes this up */
+#  define U32_MAX UINT32_MAX
+#else
+#  define U32_MAX 4294967295U
+#endif
+#define U32_MIN UINT32_MIN
+
+#else
+
+/* I8_MAX and I8_MIN constants are not defined, as I8 is an ambiguous type.
+   Please search CHAR_MAX in perl.h for further details. */
+#define U8_MAX PERL_UCHAR_MAX
+#define U8_MIN PERL_UCHAR_MIN
+
+#define I16_MAX PERL_SHORT_MAX
+#define I16_MIN PERL_SHORT_MIN
+#define U16_MAX PERL_USHORT_MAX
+#define U16_MIN PERL_USHORT_MIN
+
+#if LONGSIZE > 4
+# define I32_MAX PERL_INT_MAX
+# define I32_MIN PERL_INT_MIN
+# define U32_MAX PERL_UINT_MAX
+# define U32_MIN PERL_UINT_MIN
+#else
+# define I32_MAX PERL_LONG_MAX
+# define I32_MIN PERL_LONG_MIN
+# define U32_MAX PERL_ULONG_MAX
+# define U32_MIN PERL_ULONG_MIN
+#endif
+
+#endif
+
+/* log(2) is pretty close to  0.30103, just in case anyone is grepping for it */
+#define BIT_DIGITS(N)   (((N)*146)/485 + 1)  /* log2(10) =~ 146/485 */
+#define TYPE_DIGITS(T)  BIT_DIGITS(sizeof(T) * 8)
+#define TYPE_CHARS(T)   (TYPE_DIGITS(T) + 2) /* sign, NUL */
+
+#define Ctl(ch) ((ch) & 037)
+
+/*
+=head1 Miscellaneous Functions
+
+=for apidoc Am|bool|strNE|char* s1|char* s2
+Test two strings to see if they are different.  Returns true or
+false.
+
+=for apidoc Am|bool|strEQ|char* s1|char* s2
+Test two strings to see if they are equal.  Returns true or false.
+
+=for apidoc Am|bool|strLT|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is less than the second,
+C<s2>.  Returns true or false.
+
+=for apidoc Am|bool|strLE|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is less than or equal to the
+second, C<s2>.  Returns true or false.
+
+=for apidoc Am|bool|strGT|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is greater than the second,
+C<s2>.  Returns true or false.
+
+=for apidoc Am|bool|strGE|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is greater than or equal to
+the second, C<s2>.  Returns true or false.
+
+=for apidoc Am|bool|strnNE|char* s1|char* s2|STRLEN len
+Test two strings to see if they are different.  The C<len> parameter
+indicates the number of bytes to compare.  Returns true or false. (A
+wrapper for C<strncmp>).
+
+=for apidoc Am|bool|strnEQ|char* s1|char* s2|STRLEN len
+Test two strings to see if they are equal.  The C<len> parameter indicates
+the number of bytes to compare.  Returns true or false. (A wrapper for
+C<strncmp>).
+
+=cut
+*/
+
+#define strNE(s1,s2) (strcmp(s1,s2))
+#define strEQ(s1,s2) (!strcmp(s1,s2))
+#define strLT(s1,s2) (strcmp(s1,s2) < 0)
+#define strLE(s1,s2) (strcmp(s1,s2) <= 0)
+#define strGT(s1,s2) (strcmp(s1,s2) > 0)
+#define strGE(s1,s2) (strcmp(s1,s2) >= 0)
+#define strnNE(s1,s2,l) (strncmp(s1,s2,l))
+#define strnEQ(s1,s2,l) (!strncmp(s1,s2,l))
+
+#ifdef HAS_MEMCMP
+#  define memNE(s1,s2,l) (memcmp(s1,s2,l))
+#  define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
+#else
+#  define memNE(s1,s2,l) (bcmp(s1,s2,l))
+#  define memEQ(s1,s2,l) (!bcmp(s1,s2,l))
+#endif
+
+/*
+ * Character classes.
+ *
+ * Unfortunately, the introduction of locales means that we
+ * can't trust isupper(), etc. to tell the truth.  And when
+ * it comes to /\w+/ with tainting enabled, we *must* be able
+ * to trust our character classes.
+ *
+ * Therefore, the default tests in the text of Perl will be
+ * independent of locale.  Any code that wants to depend on
+ * the current locale will use the tests that begin with "lc".
+ */
+
+#ifdef HAS_SETLOCALE  /* XXX Is there a better test for this? */
+#  ifndef CTYPE256
+#    define CTYPE256
+#  endif
+#endif
+
+/*
+
+=head1 Character classes
+
+=for apidoc Am|bool|isALNUM|char ch
+Returns a boolean indicating whether the C C<char> is an ASCII alphanumeric
+character (including underscore) or digit.
+
+=for apidoc Am|bool|isALPHA|char ch
+Returns a boolean indicating whether the C C<char> is an ASCII alphabetic
+character.
+
+=for apidoc Am|bool|isSPACE|char ch
+Returns a boolean indicating whether the C C<char> is whitespace.
+
+=for apidoc Am|bool|isDIGIT|char ch
+Returns a boolean indicating whether the C C<char> is an ASCII
+digit.
+
+=for apidoc Am|bool|isUPPER|char ch
+Returns a boolean indicating whether the C C<char> is an uppercase
+character.
+
+=for apidoc Am|bool|isLOWER|char ch
+Returns a boolean indicating whether the C C<char> is a lowercase
+character.
+
+=for apidoc Am|char|toUPPER|char ch
+Converts the specified character to uppercase.
+
+=for apidoc Am|char|toLOWER|char ch
+Converts the specified character to lowercase.
+
+=cut
+*/
+
+#define isALNUM(c)	(isALPHA(c) || isDIGIT(c) || (c) == '_')
+#define isIDFIRST(c)	(isALPHA(c) || (c) == '_')
+#define isALPHA(c)	(isUPPER(c) || isLOWER(c))
+#define isSPACE(c) \
+	((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) =='\r' || (c) == '\f')
+#define isPSXSPC(c)	(isSPACE(c) || (c) == '\v')
+#define isBLANK(c)	((c) == ' ' || (c) == '\t')
+#define isDIGIT(c)	((c) >= '0' && (c) <= '9')
+#ifdef EBCDIC
+    /* In EBCDIC we do not do locales: therefore() isupper() is fine. */
+#   define isUPPER(c)	isupper(c)
+#   define isLOWER(c)	islower(c)
+#   define isALNUMC(c)	isalnum(c)
+#   define isASCII(c)	isascii(c)
+#   define isCNTRL(c)	iscntrl(c)
+#   define isGRAPH(c)	isgraph(c)
+#   define isPRINT(c)	isprint(c)
+#   define isPUNCT(c)	ispunct(c)
+#   define isXDIGIT(c)	isxdigit(c)
+#   define toUPPER(c)	toupper(c)
+#   define toLOWER(c)	tolower(c)
+#else
+#   define isUPPER(c)	((c) >= 'A' && (c) <= 'Z')
+#   define isLOWER(c)	((c) >= 'a' && (c) <= 'z')
+#   define isALNUMC(c)	(isALPHA(c) || isDIGIT(c))
+#   define isASCII(c)	((c) <= 127)
+#   define isCNTRL(c)	((c) < ' ' || (c) == 127)
+#   define isGRAPH(c)	(isALNUM(c) || isPUNCT(c))
+#   define isPRINT(c)	(((c) > 32 && (c) < 127) || (c) == ' ')
+#   define isPUNCT(c)	(((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64)  || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
+#   define isXDIGIT(c)  (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+#   define toUPPER(c)	(isLOWER(c) ? (c) - ('a' - 'A') : (c))
+#   define toLOWER(c)	(isUPPER(c) ? (c) + ('a' - 'A') : (c))
+#endif
+
+#ifdef USE_NEXT_CTYPE
+
+#  define isALNUM_LC(c) \
+	(NXIsAlNum((unsigned int)(c)) || (char)(c) == '_')
+#  define isIDFIRST_LC(c) \
+	(NXIsAlpha((unsigned int)(c)) || (char)(c) == '_')
+#  define isALPHA_LC(c)		NXIsAlpha((unsigned int)(c))
+#  define isSPACE_LC(c)		NXIsSpace((unsigned int)(c))
+#  define isDIGIT_LC(c)		NXIsDigit((unsigned int)(c))
+#  define isUPPER_LC(c)		NXIsUpper((unsigned int)(c))
+#  define isLOWER_LC(c)		NXIsLower((unsigned int)(c))
+#  define isALNUMC_LC(c)	NXIsAlNum((unsigned int)(c))
+#  define isCNTRL_LC(c)		NXIsCntrl((unsigned int)(c))
+#  define isGRAPH_LC(c)		NXIsGraph((unsigned int)(c))
+#  define isPRINT_LC(c)		NXIsPrint((unsigned int)(c))
+#  define isPUNCT_LC(c)		NXIsPunct((unsigned int)(c))
+#  define toUPPER_LC(c)		NXToUpper((unsigned int)(c))
+#  define toLOWER_LC(c)		NXToLower((unsigned int)(c))
+
+#else /* !USE_NEXT_CTYPE */
+
+#  if defined(CTYPE256) || (!defined(isascii) && !defined(HAS_ISASCII))
+
+#    define isALNUM_LC(c)   (isalnum((unsigned char)(c)) || (char)(c) == '_')
+#    define isIDFIRST_LC(c) (isalpha((unsigned char)(c)) || (char)(c) == '_')
+#    define isALPHA_LC(c)	isalpha((unsigned char)(c))
+#    define isSPACE_LC(c)	isspace((unsigned char)(c))
+#    define isDIGIT_LC(c)	isdigit((unsigned char)(c))
+#    define isUPPER_LC(c)	isupper((unsigned char)(c))
+#    define isLOWER_LC(c)	islower((unsigned char)(c))
+#    define isALNUMC_LC(c)	isalnum((unsigned char)(c))
+#    define isCNTRL_LC(c)	iscntrl((unsigned char)(c))
+#    define isGRAPH_LC(c)	isgraph((unsigned char)(c))
+#    define isPRINT_LC(c)	isprint((unsigned char)(c))
+#    define isPUNCT_LC(c)	ispunct((unsigned char)(c))
+#    define toUPPER_LC(c)	toupper((unsigned char)(c))
+#    define toLOWER_LC(c)	tolower((unsigned char)(c))
+
+#  else
+
+#    define isALNUM_LC(c) 	(isascii(c) && (isalnum(c) || (c) == '_'))
+#    define isIDFIRST_LC(c)	(isascii(c) && (isalpha(c) || (c) == '_'))
+#    define isALPHA_LC(c)	(isascii(c) && isalpha(c))
+#    define isSPACE_LC(c)	(isascii(c) && isspace(c))
+#    define isDIGIT_LC(c)	(isascii(c) && isdigit(c))
+#    define isUPPER_LC(c)	(isascii(c) && isupper(c))
+#    define isLOWER_LC(c)	(isascii(c) && islower(c))
+#    define isALNUMC_LC(c)	(isascii(c) && isalnum(c))
+#    define isCNTRL_LC(c)	(isascii(c) && iscntrl(c))
+#    define isGRAPH_LC(c)	(isascii(c) && isgraph(c))
+#    define isPRINT_LC(c)	(isascii(c) && isprint(c))
+#    define isPUNCT_LC(c)	(isascii(c) && ispunct(c))
+#    define toUPPER_LC(c)	toupper(c)
+#    define toLOWER_LC(c)	tolower(c)
+
+#  endif
+#endif /* USE_NEXT_CTYPE */
+
+#define isPSXSPC_LC(c)		(isSPACE_LC(c) || (c) == '\v')
+#define isBLANK_LC(c)		isBLANK(c) /* could be wrong */
+
+#define isALNUM_uni(c)		is_uni_alnum(c)
+#define isIDFIRST_uni(c)	is_uni_idfirst(c)
+#define isALPHA_uni(c)		is_uni_alpha(c)
+#define isSPACE_uni(c)		is_uni_space(c)
+#define isDIGIT_uni(c)		is_uni_digit(c)
+#define isUPPER_uni(c)		is_uni_upper(c)
+#define isLOWER_uni(c)		is_uni_lower(c)
+#define isALNUMC_uni(c)		is_uni_alnumc(c)
+#define isASCII_uni(c)		is_uni_ascii(c)
+#define isCNTRL_uni(c)		is_uni_cntrl(c)
+#define isGRAPH_uni(c)		is_uni_graph(c)
+#define isPRINT_uni(c)		is_uni_print(c)
+#define isPUNCT_uni(c)		is_uni_punct(c)
+#define isXDIGIT_uni(c)		is_uni_xdigit(c)
+#define toUPPER_uni(c,s,l)	to_uni_upper(c,s,l)
+#define toTITLE_uni(c,s,l)	to_uni_title(c,s,l)
+#define toLOWER_uni(c,s,l)	to_uni_lower(c,s,l)
+#define toFOLD_uni(c,s,l)	to_uni_fold(c,s,l)
+
+#define isPSXSPC_uni(c)		(isSPACE_uni(c) ||(c) == '\f')
+#define isBLANK_uni(c)		isBLANK(c) /* could be wrong */
+
+#define isALNUM_LC_uvchr(c)	(c < 256 ? isALNUM_LC(c) : is_uni_alnum_lc(c))
+#define isIDFIRST_LC_uvchr(c)	(c < 256 ? isIDFIRST_LC(c) : is_uni_idfirst_lc(c))
+#define isALPHA_LC_uvchr(c)	(c < 256 ? isALPHA_LC(c) : is_uni_alpha_lc(c))
+#define isSPACE_LC_uvchr(c)	(c < 256 ? isSPACE_LC(c) : is_uni_space_lc(c))
+#define isDIGIT_LC_uvchr(c)	(c < 256 ? isDIGIT_LC(c) : is_uni_digit_lc(c))
+#define isUPPER_LC_uvchr(c)	(c < 256 ? isUPPER_LC(c) : is_uni_upper_lc(c))
+#define isLOWER_LC_uvchr(c)	(c < 256 ? isLOWER_LC(c) : is_uni_lower_lc(c))
+#define isALNUMC_LC_uvchr(c)	(c < 256 ? isALNUMC_LC(c) : is_uni_alnumc_lc(c))
+#define isCNTRL_LC_uvchr(c)	(c < 256 ? isCNTRL_LC(c) : is_uni_cntrl_lc(c))
+#define isGRAPH_LC_uvchr(c)	(c < 256 ? isGRAPH_LC(c) : is_uni_graph_lc(c))
+#define isPRINT_LC_uvchr(c)	(c < 256 ? isPRINT_LC(c) : is_uni_print_lc(c))
+#define isPUNCT_LC_uvchr(c)	(c < 256 ? isPUNCT_LC(c) : is_uni_punct_lc(c))
+
+#define isPSXSPC_LC_uni(c)	(isSPACE_LC_uni(c) ||(c) == '\f')
+#define isBLANK_LC_uni(c)	isBLANK(c) /* could be wrong */
+
+#define isALNUM_utf8(p)		is_utf8_alnum(p)
+/* The ID_Start of Unicode is quite limiting: it assumes a L-class
+ * character (meaning that you cannot have, say, a CJK character).
+ * Instead, let's allow ID_Continue but not digits. */
+#define isIDFIRST_utf8(p)	(is_utf8_idcont(p) && !is_utf8_digit(p))
+#define isALPHA_utf8(p)		is_utf8_alpha(p)
+#define isSPACE_utf8(p)		is_utf8_space(p)
+#define isDIGIT_utf8(p)		is_utf8_digit(p)
+#define isUPPER_utf8(p)		is_utf8_upper(p)
+#define isLOWER_utf8(p)		is_utf8_lower(p)
+#define isALNUMC_utf8(p)	is_utf8_alnumc(p)
+#define isASCII_utf8(p)		is_utf8_ascii(p)
+#define isCNTRL_utf8(p)		is_utf8_cntrl(p)
+#define isGRAPH_utf8(p)		is_utf8_graph(p)
+#define isPRINT_utf8(p)		is_utf8_print(p)
+#define isPUNCT_utf8(p)		is_utf8_punct(p)
+#define isXDIGIT_utf8(p)	is_utf8_xdigit(p)
+#define toUPPER_utf8(p,s,l)	to_utf8_upper(p,s,l)
+#define toTITLE_utf8(p,s,l)	to_utf8_title(p,s,l)
+#define toLOWER_utf8(p,s,l)	to_utf8_lower(p,s,l)
+
+#define isPSXSPC_utf8(c)	(isSPACE_utf8(c) ||(c) == '\f')
+#define isBLANK_utf8(c)		isBLANK(c) /* could be wrong */
+
+#define isALNUM_LC_utf8(p)	isALNUM_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isIDFIRST_LC_utf8(p)	isIDFIRST_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isALPHA_LC_utf8(p)	isALPHA_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isSPACE_LC_utf8(p)	isSPACE_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isDIGIT_LC_utf8(p)	isDIGIT_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isUPPER_LC_utf8(p)	isUPPER_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isLOWER_LC_utf8(p)	isLOWER_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isALNUMC_LC_utf8(p)	isALNUMC_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isCNTRL_LC_utf8(p)	isCNTRL_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isGRAPH_LC_utf8(p)	isGRAPH_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isPRINT_LC_utf8(p)	isPRINT_LC_uvchr(utf8_to_uvchr(p,  0))
+#define isPUNCT_LC_utf8(p)	isPUNCT_LC_uvchr(utf8_to_uvchr(p,  0))
+
+#define isPSXSPC_LC_utf8(c)	(isSPACE_LC_utf8(c) ||(c) == '\f')
+#define isBLANK_LC_utf8(c)	isBLANK(c) /* could be wrong */
+
+#ifdef EBCDIC
+#  ifdef PERL_IMPLICIT_CONTEXT
+#    define toCTRL(c)     Perl_ebcdic_control(aTHX_ c)
+#  else
+#    define toCTRL        Perl_ebcdic_control
+#  endif
+#else
+  /* This conversion works both ways, strangely enough. */
+#  define toCTRL(c)    (toUPPER(c) ^ 64)
+#endif
+
+/* Line numbers are unsigned, 32 bits. */
+typedef U32 line_t;
+#define NOLINE ((line_t) 4294967295UL)
+
+
+/*
+=head1 SV Manipulation Functions
+
+=for apidoc Am|SV*|NEWSV|int id|STRLEN len
+Creates a new SV.  A non-zero C<len> parameter indicates the number of
+bytes of preallocated string space the SV should have.  An extra byte for a
+tailing NUL is also reserved.  (SvPOK is not set for the SV even if string
+space is allocated.)  The reference count for the new SV is set to 1.
+C<id> is an integer id between 0 and 1299 (used to identify leaks).
+
+=head1 Memory Management
+
+=for apidoc Am|void|Newx|void* ptr|int nitems|type
+The XSUB-writer's interface to the C C<malloc> function.
+
+=for apidoc Am|void|Newxc|void* ptr|int nitems|type|cast
+The XSUB-writer's interface to the C C<malloc> function, with
+cast.
+
+=for apidoc Am|void|Newxz|void* ptr|int nitems|type
+The XSUB-writer's interface to the C C<malloc> function.  The allocated
+memory is zeroed with C<memzero>.
+
+In 5.9.3, we removed the 1st parameter, a debug aid, from the api.  It
+was used to uniquely identify each usage of these allocation
+functions, but was deemed unnecessary with the availability of better
+memory tracking tools, valgrind for example.
+
+=for apidoc Am|void|Renew|void* ptr|int nitems|type
+The XSUB-writer's interface to the C C<realloc> function.
+
+=for apidoc Am|void|Renewc|void* ptr|int nitems|type|cast
+The XSUB-writer's interface to the C C<realloc> function, with
+cast.
+
+=for apidoc Am|void|Safefree|void* ptr
+The XSUB-writer's interface to the C C<free> function.
+
+=for apidoc Am|void|Move|void* src|void* dest|int nitems|type
+The XSUB-writer's interface to the C C<memmove> function.  The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type.  Can do overlapping moves.  See also C<Copy>.
+
+=for apidoc Am|void *|MoveD|void* src|void* dest|int nitems|type
+Like C<Move> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+=for apidoc Am|void|Copy|void* src|void* dest|int nitems|type
+The XSUB-writer's interface to the C C<memcpy> function.  The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type.  May fail on overlapping copies.  See also C<Move>.
+
+=for apidoc Am|void *|CopyD|void* src|void* dest|int nitems|type
+
+Like C<Copy> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+=for apidoc Am|void|Zero|void* dest|int nitems|type
+
+The XSUB-writer's interface to the C C<memzero> function.  The C<dest> is the
+destination, C<nitems> is the number of items, and C<type> is the type.
+
+=for apidoc Am|void *|ZeroD|void* dest|int nitems|type
+
+Like C<Zero> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+=for apidoc Am|void|StructCopy|type src|type dest|type
+This is an architecture-independent macro to copy one structure to another.
+
+=for apidoc Am|void|Poison|void* dest|int nitems|type
+
+Fill up memory with a pattern (byte 0xAB over and over again) that
+hopefully catches attempts to access uninitialized memory.
+
+=cut */
+
+#define NEWSV(x,len)	newSV(len)
+
+#ifdef PERL_MALLOC_WRAP
+#define MEM_WRAP_CHECK(n,t) MEM_WRAP_CHECK_1(n,t,PL_memory_wrap)
+#define MEM_WRAP_CHECK_1(n,t,a) \
+	(void)(sizeof(t) > 1 && (n) > ((MEM_SIZE)~0)/sizeof(t) && (Perl_croak_nocontext(a),0))
+#define MEM_WRAP_CHECK_(n,t) MEM_WRAP_CHECK(n,t),
+
+#define PERL_STRLEN_ROUNDUP(n) ((void)(((n) > (MEM_SIZE)~0 - 2 * PERL_STRLEN_ROUNDUP_QUANTUM) ? (Perl_croak_nocontext(PL_memory_wrap),0):0),((n-1+PERL_STRLEN_ROUNDUP_QUANTUM)&~((MEM_SIZE)PERL_STRLEN_ROUNDUP_QUANTUM-1)))
+
+#else
+
+#define MEM_WRAP_CHECK(n,t)
+#define MEM_WRAP_CHECK_1(n,t,a)
+#define MEM_WRAP_CHECK_2(n,t,a,b)
+#define MEM_WRAP_CHECK_(n,t)
+
+#define PERL_STRLEN_ROUNDUP(n) (((n-1+PERL_STRLEN_ROUNDUP_QUANTUM)&~((MEM_SIZE)PERL_STRLEN_ROUNDUP_QUANTUM-1)))
+
+#endif
+
+#define Newx(v,n,t)	(v = (MEM_WRAP_CHECK_(n,t) (t*)safemalloc((MEM_SIZE)((n)*sizeof(t)))))
+#define Newxc(v,n,t,c)	(v = (MEM_WRAP_CHECK_(n,t) (c*)safemalloc((MEM_SIZE)((n)*sizeof(t)))))
+#define Newxz(v,n,t)	(v = (MEM_WRAP_CHECK_(n,t) (t*)safemalloc((MEM_SIZE)((n)*sizeof(t))))), \
+			memzero((char*)(v), (n)*sizeof(t))
+/* pre 5.9.x compatibility */
+#define New(x,v,n,t)	Newx(v,n,t)
+#define Newc(x,v,n,t,c)	Newxc(v,n,t,c)
+#define Newz(x,v,n,t)	Newxz(v,n,t)
+
+#define Renew(v,n,t) \
+	  (v = (MEM_WRAP_CHECK_(n,t) (t*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t)))))
+#define Renewc(v,n,t,c) \
+	  (v = (MEM_WRAP_CHECK_(n,t) (c*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t)))))
+
+#ifdef PERL_POISON
+#define Safefree(d) \
+  (d ? (void)(safefree((Malloc_t)(d)), Poison(&(d), 1, Malloc_t)) : (void) 0)
+#else
+#define Safefree(d)	safefree((Malloc_t)(d))
+#endif
+
+#define Move(s,d,n,t)	(MEM_WRAP_CHECK_(n,t) (void)memmove((char*)(d),(const char*)(s), (n) * sizeof(t)))
+#define Copy(s,d,n,t)	(MEM_WRAP_CHECK_(n,t) (void)memcpy((char*)(d),(const char*)(s), (n) * sizeof(t)))
+#define Zero(d,n,t)	(MEM_WRAP_CHECK_(n,t) (void)memzero((char*)(d), (n) * sizeof(t)))
+
+#define MoveD(s,d,n,t)	(MEM_WRAP_CHECK_(n,t) memmove((char*)(d),(const char*)(s), (n) * sizeof(t)))
+#define CopyD(s,d,n,t)	(MEM_WRAP_CHECK_(n,t) memcpy((char*)(d),(const char*)(s), (n) * sizeof(t)))
+#ifdef HAS_MEMSET
+#define ZeroD(d,n,t)	(MEM_WRAP_CHECK_(n,t) memzero((char*)(d), (n) * sizeof(t)))
+#else
+/* Using bzero(), which returns void.  */
+#define ZeroD(d,n,t)	(MEM_WRAP_CHECK_(n,t) memzero((char*)(d), (n) * sizeof(t)),d)
+#endif
+
+#define Poison(d,n,t)	(MEM_WRAP_CHECK_(n,t) (void)memset((char*)(d), 0xAB, (n) * sizeof(t)))
+
+#ifdef USE_STRUCT_COPY
+#define StructCopy(s,d,t) (*((t*)(d)) = *((t*)(s)))
+#else
+#define StructCopy(s,d,t) Copy(s,d,1,t)
+#endif
+
+#define C_ARRAY_LENGTH(a)	(sizeof(a)/sizeof((a)[0]))
+
+#ifdef NEED_VA_COPY
+# ifdef va_copy
+#  define Perl_va_copy(s, d) va_copy(d, s)
+# else
+#  if defined(__va_copy)
+#   define Perl_va_copy(s, d) __va_copy(d, s)
+#  else
+#   define Perl_va_copy(s, d) Copy(s, d, 1, va_list)
+#  endif
+# endif
+#endif
+
+/* convenience debug macros */
+#ifdef USE_ITHREADS
+#define pTHX_FORMAT  "Perl interpreter: 0x%p"
+#define pTHX__FORMAT ", Perl interpreter: 0x%p"
+#define pTHX_VALUE_   (void *)my_perl,
+#define pTHX_VALUE    (void *)my_perl
+#define pTHX__VALUE_ ,(void *)my_perl,
+#define pTHX__VALUE  ,(void *)my_perl
+#else
+#define pTHX_FORMAT 
+#define pTHX__FORMAT
+#define pTHX_VALUE_ 
+#define pTHX_VALUE
+#define pTHX__VALUE_ 
+#define pTHX__VALUE
+#endif /* USE_ITHREADS */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/hv.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/hv.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/hv.h	(revision 14489)
@@ -0,0 +1,349 @@
+/*    hv.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2005, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/* typedefs to eliminate some typing */
+typedef struct he HE;
+typedef struct hek HEK;
+
+/* entry in hash value chain */
+struct he {
+    HE		*hent_next;	/* next entry in chain */
+    HEK		*hent_hek;	/* hash key */
+    SV		*hent_val;	/* scalar value that was hashed */
+};
+
+/* hash key -- defined separately for use as shared pointer */
+struct hek {
+    U32		hek_hash;	/* hash of key */
+    I32		hek_len;	/* length of hash key */
+    char	hek_key[1];	/* variable-length hash key */
+    /* the hash-key is \0-terminated */
+    /* after the \0 there is a byte for flags, such as whether the key
+       is UTF-8 */
+};
+
+/* hash structure: */
+/* This structure must match the beginning of struct xpvmg in sv.h. */
+struct xpvhv {
+    char *	xhv_array;	/* pointer to malloced string */
+    STRLEN	xhv_fill;	/* how full xhv_array currently is */
+    STRLEN	xhv_max;	/* subscript of last element of xhv_array */
+    IV		xhv_keys;	/* how many elements in the array */
+    NV		xnv_nv;		/* numeric value, if any */
+#define xhv_placeholders xnv_nv
+    MAGIC*	xmg_magic;	/* magic for scalar array */
+    HV*		xmg_stash;	/* class package */
+
+    I32		xhv_riter;	/* current root of iterator */
+    HE		*xhv_eiter;	/* current entry of iterator */
+    PMOP	*xhv_pmroot;	/* list of pm's for this package */
+    char	*xhv_name;	/* name, if a symbol table */
+};
+
+/* hash a key */
+/* FYI: This is the "One-at-a-Time" algorithm by Bob Jenkins
+ * from requirements by Colin Plumb.
+ * (http://burtleburtle.net/bob/hash/doobs.html) */
+/* The use of a temporary pointer and the casting games
+ * is needed to serve the dual purposes of
+ * (a) the hashed data being interpreted as "unsigned char" (new since 5.8,
+ *     a "char" can be either signed or unsigned, depending on the compiler)
+ * (b) catering for old code that uses a "char"
+ *
+ * The "hash seed" feature was added in Perl 5.8.1 to perturb the results
+ * to avoid "algorithmic complexity attacks".
+ *
+ * If USE_HASH_SEED is defined, hash randomisation is done by default
+ * If USE_HASH_SEED_EXPLICIT is defined, hash randomisation is done
+ * only if the environment variable PERL_HASH_SEED is set.
+ * For maximal control, one can define PERL_HASH_SEED.
+ * (see also perl.c:perl_parse()).
+ */
+#ifndef PERL_HASH_SEED
+#   if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT)
+#       define PERL_HASH_SEED	PL_hash_seed
+#   else
+#       define PERL_HASH_SEED	0
+#   endif
+#endif
+#define PERL_HASH(hash,str,len) \
+     STMT_START	{ \
+	register const char *s_PeRlHaSh_tmp = str; \
+	register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
+	register I32 i_PeRlHaSh = len; \
+	register U32 hash_PeRlHaSh = PERL_HASH_SEED; \
+	while (i_PeRlHaSh--) { \
+	    hash_PeRlHaSh += *s_PeRlHaSh++; \
+	    hash_PeRlHaSh += (hash_PeRlHaSh << 10); \
+	    hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6); \
+	} \
+	hash_PeRlHaSh += (hash_PeRlHaSh << 3); \
+	hash_PeRlHaSh ^= (hash_PeRlHaSh >> 11); \
+	(hash) = (hash_PeRlHaSh + (hash_PeRlHaSh << 15)); \
+    } STMT_END
+
+/* Only hv.c and mod_perl should be doing this.  */
+#ifdef PERL_HASH_INTERNAL_ACCESS
+#define PERL_HASH_INTERNAL(hash,str,len) \
+     STMT_START	{ \
+	register const char *s_PeRlHaSh_tmp = str; \
+	register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
+	register I32 i_PeRlHaSh = len; \
+	register U32 hash_PeRlHaSh = PL_rehash_seed; \
+	while (i_PeRlHaSh--) { \
+	    hash_PeRlHaSh += *s_PeRlHaSh++; \
+	    hash_PeRlHaSh += (hash_PeRlHaSh << 10); \
+	    hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6); \
+	} \
+	hash_PeRlHaSh += (hash_PeRlHaSh << 3); \
+	hash_PeRlHaSh ^= (hash_PeRlHaSh >> 11); \
+	(hash) = (hash_PeRlHaSh + (hash_PeRlHaSh << 15)); \
+    } STMT_END
+#endif
+
+/*
+=head1 Hash Manipulation Functions
+
+=for apidoc AmU||HEf_SVKEY
+This flag, used in the length slot of hash entries and magic structures,
+specifies the structure contains an C<SV*> pointer where a C<char*> pointer
+is to be expected. (For information only--not to be used).
+
+=head1 Handy Values
+
+=for apidoc AmU||Nullhv
+Null HV pointer.
+
+=head1 Hash Manipulation Functions
+
+=for apidoc Am|char*|HvNAME|HV* stash
+Returns the package name of a stash, or NULL if C<stash> isn't a stash.
+See C<SvSTASH>, C<CvSTASH>.
+
+=for apidoc Am|void*|HeKEY|HE* he
+Returns the actual pointer stored in the key slot of the hash entry. The
+pointer may be either C<char*> or C<SV*>, depending on the value of
+C<HeKLEN()>.  Can be assigned to.  The C<HePV()> or C<HeSVKEY()> macros are
+usually preferable for finding the value of a key.
+
+=for apidoc Am|STRLEN|HeKLEN|HE* he
+If this is negative, and amounts to C<HEf_SVKEY>, it indicates the entry
+holds an C<SV*> key.  Otherwise, holds the actual length of the key.  Can
+be assigned to. The C<HePV()> macro is usually preferable for finding key
+lengths.
+
+=for apidoc Am|SV*|HeVAL|HE* he
+Returns the value slot (type C<SV*>) stored in the hash entry.
+
+=for apidoc Am|U32|HeHASH|HE* he
+Returns the computed hash stored in the hash entry.
+
+=for apidoc Am|char*|HePV|HE* he|STRLEN len
+Returns the key slot of the hash entry as a C<char*> value, doing any
+necessary dereferencing of possibly C<SV*> keys.  The length of the string
+is placed in C<len> (this is a macro, so do I<not> use C<&len>).  If you do
+not care about what the length of the key is, you may use the global
+variable C<PL_na>, though this is rather less efficient than using a local
+variable.  Remember though, that hash keys in perl are free to contain
+embedded nulls, so using C<strlen()> or similar is not a good way to find
+the length of hash keys. This is very similar to the C<SvPV()> macro
+described elsewhere in this document.
+
+=for apidoc Am|SV*|HeSVKEY|HE* he
+Returns the key as an C<SV*>, or C<Nullsv> if the hash entry does not
+contain an C<SV*> key.
+
+=for apidoc Am|SV*|HeSVKEY_force|HE* he
+Returns the key as an C<SV*>.  Will create and return a temporary mortal
+C<SV*> if the hash entry contains only a C<char*> key.
+
+=for apidoc Am|SV*|HeSVKEY_set|HE* he|SV* sv
+Sets the key to a given C<SV*>, taking care to set the appropriate flags to
+indicate the presence of an C<SV*> key, and returns the same
+C<SV*>.
+
+=cut
+*/
+
+/* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */
+#define HEf_SVKEY	-2	/* hent_key is an SV* */
+
+
+#define Nullhv Null(HV*)
+#define HvARRAY(hv)	(*(HE***)&((XPVHV*)  SvANY(hv))->xhv_array)
+#define HvFILL(hv)	((XPVHV*)  SvANY(hv))->xhv_fill
+#define HvMAX(hv)	((XPVHV*)  SvANY(hv))->xhv_max
+#define HvRITER(hv)	((XPVHV*)  SvANY(hv))->xhv_riter
+#define HvRITER_get(hv)	(0 + ((XPVHV*)  SvANY(hv))->xhv_riter)
+#define HvRITER_set(hv,r)	(HvRITER(hv) = (r))
+#define HvEITER(hv)	((XPVHV*)  SvANY(hv))->xhv_eiter
+#define HvEITER_get(hv)	(0 + ((XPVHV*)  SvANY(hv))->xhv_eiter)
+#define HvEITER_set(hv,e)	(HvEITER(hv) = (e))
+#define HvPMROOT(hv)	((XPVHV*)  SvANY(hv))->xhv_pmroot
+#define HvNAME(hv)	((XPVHV*)  SvANY(hv))->xhv_name
+/* FIXME - all of these should use a UTF8 aware API, which should also involve
+   getting the length. */
+#define HvNAME_get(hv)	(0 + ((XPVHV*)  SvANY(hv))->xhv_name)
+#define hv_name_set(hv,name,length,flags) \
+    (HvNAME((hv)) = (name) ? savepvn(name, length) : 0)
+
+/* the number of keys (including any placeholers) */
+#define XHvTOTALKEYS(xhv)	((xhv)->xhv_keys)
+
+/* The number of placeholders in the enumerated-keys hash */
+#define XHvPLACEHOLDERS(xhv)	((xhv)->xhv_placeholders)
+
+/* the number of keys that exist() (i.e. excluding placeholders) */
+#define XHvUSEDKEYS(xhv)      (XHvTOTALKEYS(xhv) - (IV)XHvPLACEHOLDERS(xhv))
+
+/*
+ * HvKEYS gets the number of keys that actually exist(), and is provided
+ * for backwards compatibility with old XS code. The core uses HvUSEDKEYS
+ * (keys, excluding placeholdes) and HvTOTALKEYS (including placeholders)
+ */
+#define HvKEYS(hv)		XHvUSEDKEYS((XPVHV*)  SvANY(hv))
+#define HvUSEDKEYS(hv)		XHvUSEDKEYS((XPVHV*)  SvANY(hv))
+#define HvTOTALKEYS(hv)		XHvTOTALKEYS((XPVHV*)  SvANY(hv))
+#define HvPLACEHOLDERS(hv)	(XHvPLACEHOLDERS((XPVHV*)  SvANY(hv)))
+#define HvPLACEHOLDERS_get(hv)	(0 + XHvPLACEHOLDERS((XPVHV*)  SvANY(hv)))
+#define HvPLACEHOLDERS_set(hv, p)	\
+	(XHvPLACEHOLDERS((XPVHV*)  SvANY(hv)) = (p))
+
+#define HvSHAREKEYS(hv)		(SvFLAGS(hv) & SVphv_SHAREKEYS)
+#define HvSHAREKEYS_on(hv)	(SvFLAGS(hv) |= SVphv_SHAREKEYS)
+#define HvSHAREKEYS_off(hv)	(SvFLAGS(hv) &= ~SVphv_SHAREKEYS)
+
+/* This is an optimisation flag. It won't be set if all hash keys have a 0
+ * flag. Currently the only flags relate to utf8.
+ * Hence it won't be set if all keys are 8 bit only. It will be set if any key
+ * is utf8 (including 8 bit keys that were entered as utf8, and need upgrading
+ * when retrieved during iteration. It may still be set when there are no longer
+ * any utf8 keys.
+ * See HVhek_ENABLEHVKFLAGS for the trigger.
+ */
+#define HvHASKFLAGS(hv)		(SvFLAGS(hv) & SVphv_HASKFLAGS)
+#define HvHASKFLAGS_on(hv)	(SvFLAGS(hv) |= SVphv_HASKFLAGS)
+#define HvHASKFLAGS_off(hv)	(SvFLAGS(hv) &= ~SVphv_HASKFLAGS)
+
+#define HvLAZYDEL(hv)		(SvFLAGS(hv) & SVphv_LAZYDEL)
+#define HvLAZYDEL_on(hv)	(SvFLAGS(hv) |= SVphv_LAZYDEL)
+#define HvLAZYDEL_off(hv)	(SvFLAGS(hv) &= ~SVphv_LAZYDEL)
+
+#define HvREHASH(hv)		(SvFLAGS(hv) & SVphv_REHASH)
+#define HvREHASH_on(hv)		(SvFLAGS(hv) |= SVphv_REHASH)
+#define HvREHASH_off(hv)	(SvFLAGS(hv) &= ~SVphv_REHASH)
+
+/* Maybe amagical: */
+/* #define HV_AMAGICmb(hv)      (SvFLAGS(hv) & (SVpgv_badAM | SVpgv_AM)) */
+
+#define HV_AMAGIC(hv)        (SvFLAGS(hv) &   SVpgv_AM)
+#define HV_AMAGIC_on(hv)     (SvFLAGS(hv) |=  SVpgv_AM)
+#define HV_AMAGIC_off(hv)    (SvFLAGS(hv) &= ~SVpgv_AM)
+
+/*
+#define HV_AMAGICbad(hv)     (SvFLAGS(hv) & SVpgv_badAM)
+#define HV_badAMAGIC_on(hv)  (SvFLAGS(hv) |= SVpgv_badAM)
+#define HV_badAMAGIC_off(hv) (SvFLAGS(hv) &= ~SVpgv_badAM)
+*/
+
+#define Nullhe Null(HE*)
+#define HeNEXT(he)		(he)->hent_next
+#define HeKEY_hek(he)		(he)->hent_hek
+#define HeKEY(he)		HEK_KEY(HeKEY_hek(he))
+#define HeKEY_sv(he)		(*(SV**)HeKEY(he))
+#define HeKLEN(he)		HEK_LEN(HeKEY_hek(he))
+#define HeKUTF8(he)  HEK_UTF8(HeKEY_hek(he))
+#define HeKWASUTF8(he)  HEK_WASUTF8(HeKEY_hek(he))
+#define HeKREHASH(he)  HEK_REHASH(HeKEY_hek(he))
+#define HeKLEN_UTF8(he)  (HeKUTF8(he) ? -HeKLEN(he) : HeKLEN(he))
+#define HeKFLAGS(he)  HEK_FLAGS(HeKEY_hek(he))
+#define HeVAL(he)		(he)->hent_val
+#define HeHASH(he)		HEK_HASH(HeKEY_hek(he))
+#define HePV(he,lp)		((HeKLEN(he) == HEf_SVKEY) ?		\
+				 SvPV(HeKEY_sv(he),lp) :		\
+				 (((lp = HeKLEN(he)) >= 0) ?		\
+				  HeKEY(he) : Nullch))
+
+#define HeSVKEY(he)		((HeKEY(he) && 				\
+				  HeKLEN(he) == HEf_SVKEY) ?		\
+				 HeKEY_sv(he) : Nullsv)
+
+#define HeSVKEY_force(he)	(HeKEY(he) ?				\
+				 ((HeKLEN(he) == HEf_SVKEY) ?		\
+				  HeKEY_sv(he) :			\
+				  sv_2mortal(newSVpvn(HeKEY(he),	\
+						     HeKLEN(he)))) :	\
+				 &PL_sv_undef)
+#define HeSVKEY_set(he,sv)	((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
+
+#define Nullhek Null(HEK*)
+#define HEK_BASESIZE		STRUCT_OFFSET(HEK, hek_key[0])
+#define HEK_HASH(hek)		(hek)->hek_hash
+#define HEK_LEN(hek)		(hek)->hek_len
+#define HEK_KEY(hek)		(hek)->hek_key
+#define HEK_FLAGS(hek)	(*((unsigned char *)(HEK_KEY(hek))+HEK_LEN(hek)+1))
+
+#define HVhek_UTF8	0x01 /* Key is utf8 encoded. */
+#define HVhek_WASUTF8	0x02 /* Key is bytes here, but was supplied as utf8. */
+#define HVhek_REHASH	0x04 /* This key is in an hv using a custom HASH . */
+#define HVhek_FREEKEY	0x100 /* Internal flag to say key is malloc()ed.  */
+#define HVhek_PLACEHOLD	0x200 /* Internal flag to create placeholder.
+                               * (may change, but Storable is a core module) */
+#define HVhek_MASK	0xFF
+
+/* Which flags enable HvHASKFLAGS? Somewhat a hack on a hack, as
+   HVhek_REHASH is only needed because the rehash flag has to be duplicated
+   into all keys as hv_iternext has no access to the hash flags. At this
+   point Storable's tests get upset, because sometimes hashes are "keyed"
+   and sometimes not, depending on the order of data insertion, and whether
+   it triggered rehashing. So currently HVhek_REHAS is exempt.
+*/
+   
+#define HVhek_ENABLEHVKFLAGS	(HVhek_MASK - HVhek_REHASH)
+
+#define HEK_UTF8(hek)		(HEK_FLAGS(hek) & HVhek_UTF8)
+#define HEK_UTF8_on(hek)	(HEK_FLAGS(hek) |= HVhek_UTF8)
+#define HEK_UTF8_off(hek)	(HEK_FLAGS(hek) &= ~HVhek_UTF8)
+#define HEK_WASUTF8(hek)	(HEK_FLAGS(hek) & HVhek_WASUTF8)
+#define HEK_WASUTF8_on(hek)	(HEK_FLAGS(hek) |= HVhek_WASUTF8)
+#define HEK_WASUTF8_off(hek)	(HEK_FLAGS(hek) &= ~HVhek_WASUTF8)
+#define HEK_REHASH(hek)		(HEK_FLAGS(hek) & HVhek_REHASH)
+#define HEK_REHASH_on(hek)	(HEK_FLAGS(hek) |= HVhek_REHASH)
+
+/* calculate HV array allocation */
+#ifndef PERL_USE_LARGE_HV_ALLOC
+/* Default to allocating the correct size - default to assuming that malloc()
+   is not broken and is efficient at allocating blocks sized at powers-of-two.
+*/   
+#  define PERL_HV_ARRAY_ALLOC_BYTES(size) ((size) * sizeof(HE*))
+#else
+#  define MALLOC_OVERHEAD 16
+#  define PERL_HV_ARRAY_ALLOC_BYTES(size) \
+			(((size) < 64)					\
+			 ? (size) * sizeof(HE*)				\
+			 : (size) * sizeof(HE*) * 2 - MALLOC_OVERHEAD)
+#endif
+
+/* Flags for hv_iternext_flags.  */
+#define HV_ITERNEXT_WANTPLACEHOLDERS	0x01	/* Don't skip placeholders.  */
+
+/* available as a function in hv.c */
+#define Perl_sharepvn(sv, len, hash) HEK_KEY(share_hek(sv, len, hash))
+#define sharepvn(sv, len, hash)	     Perl_sharepvn(sv, len, hash)
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/intrpvar.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/intrpvar.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/intrpvar.h	(revision 14489)
@@ -0,0 +1,588 @@
+/***********************************************/
+/* Global only to current interpreter instance */
+/***********************************************/
+
+/* Don't forget to re-run embed.pl to propagate changes! */
+
+/* New variables must be added to the very end for binary compatibility.
+ * XSUB.h provides wrapper functions via perlapi.h that make this
+ * irrelevant, but not all code may be expected to #include XSUB.h. */
+
+/* Don't forget to add your variable also to perl_clone()! */
+
+/* The 'I' prefix is only needed for vars that need appropriate #defines
+ * generated when built with or without MULTIPLICITY.  It is also used
+ * to generate the appropriate export list for win32.
+ *
+ * When building without MULTIPLICITY, these variables will be truly global. */
+
+/* pseudo environmental stuff */
+PERLVAR(Iorigargc,	int)
+PERLVAR(Iorigargv,	char **)
+PERLVAR(Ienvgv,		GV *)
+PERLVAR(Iincgv,		GV *)
+PERLVAR(Ihintgv,	GV *)
+PERLVAR(Iorigfilename,	char *)
+PERLVAR(Idiehook,	SV *)
+PERLVAR(Iwarnhook,	SV *)
+
+/* switches */
+PERLVAR(Iminus_c,	bool)
+PERLVAR(Ipatchlevel,	SV *)
+PERLVAR(Ilocalpatches,	char **)
+PERLVARI(Isplitstr,	const char *, " ")
+PERLVAR(Ipreprocess,	bool)
+PERLVAR(Iminus_n,	bool)
+PERLVAR(Iminus_p,	bool)
+PERLVAR(Iminus_l,	bool)
+PERLVAR(Iminus_a,	bool)
+PERLVAR(Iminus_F,	bool)
+PERLVAR(Idoswitches,	bool)
+
+/*
+=head1 Global Variables
+
+=for apidoc mn|bool|PL_dowarn
+
+The C variable which corresponds to Perl's $^W warning variable.
+
+=cut
+*/
+
+PERLVAR(Idowarn,	U8)
+PERLVAR(Iwidesyscalls,	bool)		/* unused since 5.8.1 */
+PERLVAR(Idoextract,	bool)
+PERLVAR(Isawampersand,	bool)		/* must save all match strings */
+PERLVAR(Iunsafe,	bool)
+PERLVAR(Iinplace,	char *)
+PERLVAR(Ie_script,	SV *)
+PERLVAR(Iperldb,	U32)
+
+/* This value may be set when embedding for full cleanup  */
+/* 0=none, 1=full, 2=full with checks */
+PERLVARI(Iperl_destruct_level,	int,	0)
+
+/* magical thingies */
+PERLVAR(Ibasetime,	Time_t)		/* $^T */
+PERLVAR(Iformfeed,	SV *)		/* $^L */
+
+
+PERLVARI(Imaxsysfd,	I32,	MAXSYSFD)
+					/* top fd to pass to subprocesses */
+PERLVAR(Imultiline,	int)		/* $*--do strings hold >1 line? */
+PERLVAR(Istatusvalue,	I32)		/* $? */
+PERLVAR(Iexit_flags,	U8)		/* was exit() unexpected, etc. */
+#ifdef VMS
+PERLVAR(Istatusvalue_vms,U32)
+#endif
+
+/* shortcuts to various I/O objects */
+PERLVAR(Istdingv,	GV *)
+PERLVAR(Istderrgv,	GV *)
+PERLVAR(Idefgv,		GV *)
+PERLVAR(Iargvgv,	GV *)
+PERLVAR(Iargvoutgv,	GV *)
+PERLVAR(Iargvout_stack,	AV *)
+
+/* shortcuts to regexp stuff */
+/* this one needs to be moved to thrdvar.h and accessed via
+ * find_threadsv() when USE_5005THREADS */
+PERLVAR(Ireplgv,	GV *)
+
+/* shortcuts to misc objects */
+PERLVAR(Ierrgv,		GV *)
+
+/* shortcuts to debugging objects */
+PERLVAR(IDBgv,		GV *)
+PERLVAR(IDBline,	GV *)
+
+/*
+=for apidoc mn|GV *|PL_DBsub
+When Perl is run in debugging mode, with the B<-d> switch, this GV contains
+the SV which holds the name of the sub being debugged.  This is the C
+variable which corresponds to Perl's $DB::sub variable.  See
+C<PL_DBsingle>.
+
+=for apidoc mn|SV *|PL_DBsingle
+When Perl is run in debugging mode, with the B<-d> switch, this SV is a
+boolean which indicates whether subs are being single-stepped.
+Single-stepping is automatically turned on after every step.  This is the C
+variable which corresponds to Perl's $DB::single variable.  See
+C<PL_DBsub>.
+
+=for apidoc mn|SV *|PL_DBtrace
+Trace variable used when Perl is run in debugging mode, with the B<-d>
+switch.  This is the C variable which corresponds to Perl's $DB::trace
+variable.  See C<PL_DBsingle>.
+
+=cut
+*/
+
+PERLVAR(IDBsub,		GV *)
+PERLVAR(IDBsingle,	SV *)
+PERLVAR(IDBtrace,	SV *)
+PERLVAR(IDBsignal,	SV *)
+PERLVAR(Ilineary,	AV *)		/* lines of script for debugger */
+PERLVAR(Idbargs,	AV *)		/* args to call listed by caller function */
+
+/* symbol tables */
+PERLVAR(Idebstash,	HV *)		/* symbol table for perldb package */
+PERLVAR(Iglobalstash,	HV *)		/* global keyword overrides imported here */
+PERLVAR(Icurstname,	SV *)		/* name of current package */
+PERLVAR(Ibeginav,	AV *)		/* names of BEGIN subroutines */
+PERLVAR(Iendav,		AV *)		/* names of END subroutines */
+PERLVAR(Icheckav,	AV *)		/* names of CHECK subroutines */
+PERLVAR(Iinitav,	AV *)		/* names of INIT subroutines */
+PERLVAR(Istrtab,	HV *)		/* shared string table */
+PERLVARI(Isub_generation,U32,1)		/* incr to invalidate method cache */
+
+/* memory management */
+PERLVAR(Isv_count,	I32)		/* how many SV* are currently allocated */
+PERLVAR(Isv_objcount,	I32)		/* how many objects are currently allocated */
+PERLVAR(Isv_root,	SV*)		/* storage for SVs belonging to interp */
+PERLVAR(Isv_arenaroot,	SV*)		/* list of areas for garbage collection */
+
+/* funky return mechanisms */
+PERLVAR(Iforkprocess,	int)		/* so do_open |- can return proc# */
+
+/* subprocess state */
+PERLVAR(Ifdpid,		AV *)		/* keep fd-to-pid mappings for my_popen */
+
+/* internal state */
+PERLVAR(Itainting,	bool)		/* doing taint checks */
+PERLVARI(Iop_mask,	char *,	NULL)	/* masked operations for safe evals */
+
+/* current interpreter roots */
+PERLVAR(Imain_cv,	CV *)
+PERLVAR(Imain_root,	OP *)
+PERLVAR(Imain_start,	OP *)
+PERLVAR(Ieval_root,	OP *)
+PERLVAR(Ieval_start,	OP *)
+
+/* runtime control stuff */
+PERLVARI(Icurcopdb,	COP *,	NULL)
+PERLVARI(Icopline,	line_t,	NOLINE)
+
+/* statics moved here for shared library purposes */
+PERLVAR(Ifilemode,	int)		/* so nextargv() can preserve mode */
+PERLVAR(Ilastfd,	int)		/* what to preserve mode on */
+PERLVAR(Ioldname,	char *)		/* what to preserve mode on */
+PERLVAR(IArgv,		char **)	/* stuff to free from do_aexec, vfork safe */
+PERLVAR(ICmd,		char *)		/* stuff to free from do_aexec, vfork safe */
+PERLVARI(Igensym,	I32,	0)	/* next symbol for getsym() to define */
+PERLVAR(Ipreambled,	bool)
+PERLVAR(Ipreambleav,	AV *)
+PERLVARI(Ilaststatval,	int,	-1)
+PERLVARI(Ilaststype,	I32,	OP_STAT)
+PERLVAR(Imess_sv,	SV *)
+
+/* XXX shouldn't these be per-thread? --GSAR */
+PERLVAR(Iors_sv,	SV *)		/* output record separator $\ */
+PERLVAR(Iofmt,		char *)		/* output format for numbers $# */
+
+/* interpreter atexit processing */
+PERLVARI(Iexitlist,	PerlExitListEntry *, NULL)
+					/* list of exit functions */
+PERLVARI(Iexitlistlen,	I32, 0)		/* length of same */
+
+/*
+=for apidoc Amn|HV*|PL_modglobal
+
+C<PL_modglobal> is a general purpose, interpreter global HV for use by
+extensions that need to keep information on a per-interpreter basis.
+In a pinch, it can also be used as a symbol table for extensions
+to share data among each other.  It is a good idea to use keys
+prefixed by the package name of the extension that owns the data.
+
+=cut
+*/
+
+PERLVAR(Imodglobal,	HV *)		/* per-interp module data */
+
+/* these used to be in global before 5.004_68 */
+PERLVARI(Iprofiledata,	U32 *,	NULL)	/* table of ops, counts */
+PERLVARI(Irsfp,	PerlIO * VOL,	Nullfp) /* current source file pointer */
+PERLVARI(Irsfp_filters,	AV *,	Nullav)	/* keeps active source filters */
+
+PERLVAR(Icompiling,	COP)		/* compiling/done executing marker */
+
+PERLVAR(Icompcv,	CV *)		/* currently compiling subroutine */
+PERLVAR(IBINCOMPAT0,	AV *)		/* filler for binary compatibility */
+PERLVAR(Icomppad_name,	AV *)		/* variable names for "my" variables */
+PERLVAR(Icomppad_name_fill,	I32)	/* last "introduced" variable offset */
+PERLVAR(Icomppad_name_floor,	I32)	/* start of vars in innermost block */
+
+#ifdef HAVE_INTERP_INTERN
+PERLVAR(Isys_intern,	struct interp_intern)
+					/* platform internals */
+#endif
+
+/* more statics moved here */
+PERLVARI(Igeneration,	int,	100)	/* from op.c */
+PERLVAR(IDBcv,		CV *)		/* from perl.c */
+
+PERLVARI(Iin_clean_objs,bool,    FALSE)	/* from sv.c */
+PERLVARI(Iin_clean_all,	bool,    FALSE)	/* from sv.c */
+
+PERLVAR(Ilinestart,	char *)		/* beg. of most recently read line */
+PERLVAR(Ipending_ident,	char)		/* pending identifier lookup */
+PERLVAR(Isublex_info,	SUBLEXINFO)	/* from toke.c */
+
+#ifdef USE_5005THREADS
+PERLVAR(Ithrsv,		SV *)		/* struct perl_thread for main thread */
+PERLVARI(Ithreadnum,	U32,	0)	/* incremented each thread creation */
+PERLVAR(Istrtab_mutex,	perl_mutex)	/* Mutex for string table access */
+#endif /* USE_5005THREADS */
+
+PERLVAR(Iuid,		Uid_t)		/* current real user id */
+PERLVAR(Ieuid,		Uid_t)		/* current effective user id */
+PERLVAR(Igid,		Gid_t)		/* current real group id */
+PERLVAR(Iegid,		Gid_t)		/* current effective group id */
+PERLVAR(Inomemok,	bool)		/* let malloc context handle nomem */
+PERLVARI(Ian,		U32,	0)	/* malloc sequence number */
+PERLVARI(Icop_seqmax,	U32,	0)	/* statement sequence number */
+PERLVARI(Iop_seqmax,	U16,	0)	/* op sequence number */
+PERLVARI(Ievalseq,	U32,	0)	/* eval sequence number */
+PERLVAR(Iorigenviron,	char **)
+PERLVAR(Iorigalen,	U32)
+PERLVAR(Ipidstatus,	HV *)		/* pid-to-status mappings for waitpid */
+PERLVARI(Imaxo,	int,	MAXO)		/* maximum number of ops */
+PERLVAR(Iosname,	char *)		/* operating system */
+
+/* For binary compatibility with older versions only */
+PERLVARI(Ish_path_compat,	const char *,	SH_PATH)/* full path of shell */
+
+PERLVAR(Isighandlerp,	Sighandler_t)
+
+PERLVAR(Ixiv_arenaroot,	XPV*)		/* list of allocated xiv areas */
+PERLVAR(Ixiv_root,	IV *)		/* free xiv list */
+PERLVAR(Ixnv_root,	NV *)		/* free xnv list */
+PERLVAR(Ixrv_root,	XRV *)		/* free xrv list */
+PERLVAR(Ixpv_root,	XPV *)		/* free xpv list */
+PERLVAR(Ixpviv_root,	XPVIV *)	/* free xpviv list */
+PERLVAR(Ixpvnv_root,	XPVNV *)	/* free xpvnv list */
+PERLVAR(Ixpvcv_root,	XPVCV *)	/* free xpvcv list */
+PERLVAR(Ixpvav_root,	XPVAV *)	/* free xpvav list */
+PERLVAR(Ixpvhv_root,	XPVHV *)	/* free xpvhv list */
+PERLVAR(Ixpvmg_root,	XPVMG *)	/* free xpvmg list */
+PERLVAR(Ixpvlv_root,	XPVLV *)	/* free xpvlv list */
+PERLVAR(Ixpvbm_root,	XPVBM *)	/* free xpvbm list */
+PERLVAR(Ihe_root,	HE *)		/* free he list */
+PERLVAR(Inice_chunk,	char *)		/* a nice chunk of memory to reuse */
+PERLVAR(Inice_chunk_size,	U32)	/* how nice the chunk of memory is */
+
+PERLVARI(Irunops,	runops_proc_t,	MEMBER_TO_FPTR(RUNOPS_DEFAULT))
+
+PERLVARA(Itokenbuf,256,	char)
+
+/*
+=for apidoc Amn|SV|PL_sv_undef
+This is the C<undef> SV.  Always refer to this as C<&PL_sv_undef>.
+
+=for apidoc Amn|SV|PL_sv_no
+This is the C<false> SV.  See C<PL_sv_yes>.  Always refer to this as
+C<&PL_sv_no>.
+
+=for apidoc Amn|SV|PL_sv_yes
+This is the C<true> SV.  See C<PL_sv_no>.  Always refer to this as
+C<&PL_sv_yes>.
+
+=cut
+*/
+
+PERLVAR(Isv_undef,	SV)
+PERLVAR(Isv_no,		SV)
+PERLVAR(Isv_yes,	SV)
+
+#ifdef CSH
+PERLVARI(Icshname,	const char *,	CSH)
+PERLVARI(Icshlen,	I32,	0)
+#endif
+
+PERLVAR(Ilex_state,	U32)		/* next token is determined */
+PERLVAR(Ilex_defer,	U32)		/* state after determined token */
+PERLVAR(Ilex_expect,	int)		/* expect after determined token */
+PERLVAR(Ilex_brackets,	I32)		/* bracket count */
+PERLVAR(Ilex_formbrack,	I32)		/* bracket count at outer format level */
+PERLVAR(Ilex_casemods,	I32)		/* casemod count */
+PERLVAR(Ilex_dojoin,	I32)		/* doing an array interpolation */
+PERLVAR(Ilex_starts,	I32)		/* how many interps done on level */
+PERLVAR(Ilex_stuff,	SV *)		/* runtime pattern from m// or s/// */
+PERLVAR(Ilex_repl,	SV *)		/* runtime replacement from s/// */
+PERLVAR(Ilex_op,	OP *)		/* extra info to pass back on op */
+PERLVAR(Ilex_inpat,	OP *)		/* in pattern $) and $| are special */
+PERLVAR(Ilex_inwhat,	I32)		/* what kind of quoting are we in */
+PERLVAR(Ilex_brackstack,char *)		/* what kind of brackets to pop */
+PERLVAR(Ilex_casestack,	char *)		/* what kind of case mods in effect */
+
+/* What we know when we're in LEX_KNOWNEXT state. */
+PERLVARA(Inextval,5,	YYSTYPE)	/* value of next token, if any */
+PERLVARA(Inexttype,5,	I32)		/* type of next token */
+PERLVAR(Inexttoke,	I32)
+
+PERLVAR(Ilinestr,	SV *)
+PERLVAR(Ibufptr,	char *)
+PERLVAR(Ioldbufptr,	char *)
+PERLVAR(Ioldoldbufptr,	char *)
+PERLVAR(Ibufend,	char *)
+PERLVARI(Iexpect,int,	XSTATE)		/* how to interpret ambiguous tokens */
+
+PERLVAR(Imulti_start,	I32)		/* 1st line of multi-line string */
+PERLVAR(Imulti_end,	I32)		/* last line of multi-line string */
+PERLVAR(Imulti_open,	I32)		/* delimiter of said string */
+PERLVAR(Imulti_close,	I32)		/* delimiter of said string */
+
+PERLVAR(Ierror_count,	I32)		/* how many errors so far, max 10 */
+PERLVAR(Isubline,	I32)		/* line this subroutine began on */
+PERLVAR(Isubname,	SV *)		/* name of current subroutine */
+
+PERLVAR(Imin_intro_pending,	I32)	/* start of vars to introduce */
+PERLVAR(Imax_intro_pending,	I32)	/* end of vars to introduce */
+PERLVAR(Ipadix,		I32)		/* max used index in current "register" pad */
+PERLVAR(Ipadix_floor,	I32)		/* how low may inner block reset padix */
+PERLVAR(Ipad_reset_pending,	I32)	/* reset pad on next attempted alloc */
+
+PERLVAR(Ilast_uni,	char *)		/* position of last named-unary op */
+PERLVAR(Ilast_lop,	char *)		/* position of last list operator */
+PERLVAR(Ilast_lop_op,	OPCODE)		/* last list operator */
+PERLVAR(Iin_my,		I32)		/* we're compiling a "my" (or "our") declaration */
+PERLVAR(Iin_my_stash,	HV *)		/* declared class of this "my" declaration */
+#ifdef FCRYPT
+PERLVARI(Icryptseen,	bool,	FALSE)	/* has fast crypt() been initialized? */
+#endif
+
+PERLVAR(Ihints,		U32)		/* pragma-tic compile-time flags */
+
+PERLVAR(Idebug,		VOL U32)	/* flags given to -D switch */
+
+PERLVARI(Iamagic_generation,	long,	0)
+
+#ifdef USE_LOCALE_COLLATE
+PERLVARI(Icollation_ix,	U32,	0)	/* Collation generation index */
+PERLVAR(Icollation_name,char *)		/* Name of current collation */
+PERLVARI(Icollation_standard, bool,	TRUE)
+					/* Assume simple collation */
+PERLVAR(Icollxfrm_base,	Size_t)		/* Basic overhead in *xfrm() */
+PERLVARI(Icollxfrm_mult,Size_t,	2)	/* Expansion factor in *xfrm() */
+#endif /* USE_LOCALE_COLLATE */
+
+#ifdef USE_LOCALE_NUMERIC
+
+PERLVAR(Inumeric_name,	char *)		/* Name of current numeric locale */
+PERLVARI(Inumeric_standard,	bool,	TRUE)
+					/* Assume simple numerics */
+PERLVARI(Inumeric_local,	bool,	TRUE)
+					/* Assume local numerics */
+
+PERLVAR(Inumeric_compat1,		char)
+					/* Used to be numeric_radix */
+#endif /* !USE_LOCALE_NUMERIC */
+
+/* utf8 character classes */
+PERLVAR(Iutf8_alnum,	SV *)
+PERLVAR(Iutf8_alnumc,	SV *)
+PERLVAR(Iutf8_ascii,	SV *)
+PERLVAR(Iutf8_alpha,	SV *)
+PERLVAR(Iutf8_space,	SV *)
+PERLVAR(Iutf8_cntrl,	SV *)
+PERLVAR(Iutf8_graph,	SV *)
+PERLVAR(Iutf8_digit,	SV *)
+PERLVAR(Iutf8_upper,	SV *)
+PERLVAR(Iutf8_lower,	SV *)
+PERLVAR(Iutf8_print,	SV *)
+PERLVAR(Iutf8_punct,	SV *)
+PERLVAR(Iutf8_xdigit,	SV *)
+PERLVAR(Iutf8_mark,	SV *)
+PERLVAR(Iutf8_toupper,	SV *)
+PERLVAR(Iutf8_totitle,	SV *)
+PERLVAR(Iutf8_tolower,	SV *)
+PERLVAR(Iutf8_tofold,	SV *)
+PERLVAR(Ilast_swash_hv,	HV *)
+PERLVAR(Ilast_swash_klen,	U32)
+PERLVARA(Ilast_swash_key,10,	U8)
+PERLVAR(Ilast_swash_tmps,	U8 *)
+PERLVAR(Ilast_swash_slen,	STRLEN)
+
+/* perly.c globals */
+PERLVAR(Iyydebug,	int)
+PERLVAR(Iyynerrs,	int)
+PERLVAR(Iyyerrflag,	int)
+PERLVAR(Iyychar,	int)
+PERLVAR(Iyyval,		YYSTYPE)
+PERLVAR(Iyylval,	YYSTYPE)
+
+PERLVARI(Iglob_index,	int,	0)
+PERLVAR(Isrand_called,	bool)
+PERLVARA(Iuudmap,256,	char)
+PERLVAR(Ibitcount,	char *)
+
+#ifdef USE_5005THREADS
+PERLVAR(Isv_mutex,	perl_mutex)	/* Mutex for allocating SVs in sv.c */
+PERLVAR(Ieval_mutex,	perl_mutex)	/* Mutex for doeval */
+PERLVAR(Ieval_cond,	perl_cond)	/* Condition variable for doeval */
+PERLVAR(Ieval_owner,	struct perl_thread *)
+					/* Owner thread for doeval */
+PERLVAR(Inthreads,	int)		/* Number of threads currently */
+PERLVAR(Ithreads_mutex,	perl_mutex)	/* Mutex for nthreads and thread list */
+PERLVAR(Inthreads_cond,	perl_cond)	/* Condition variable for nthreads */
+PERLVAR(Isvref_mutex,	perl_mutex)	/* Mutex for SvREFCNT_{inc,dec} */
+PERLVARI(Ithreadsv_names,char *,	THREADSV_NAMES)
+#ifdef FAKE_THREADS
+PERLVAR(Icurthr,	struct perl_thread *)
+					/* Currently executing (fake) thread */
+#endif
+
+PERLVAR(Icred_mutex,	perl_mutex)	/* altered credentials in effect */
+
+#endif /* USE_5005THREADS */
+
+PERLVAR(Ipsig_ptr, SV**)
+PERLVAR(Ipsig_name, SV**)
+
+#if defined(PERL_IMPLICIT_SYS)
+PERLVAR(IMem,		struct IPerlMem*)
+PERLVAR(IMemShared,	struct IPerlMem*)
+PERLVAR(IMemParse,	struct IPerlMem*)
+PERLVAR(IEnv,		struct IPerlEnv*)
+PERLVAR(IStdIO,		struct IPerlStdIO*)
+PERLVAR(ILIO,		struct IPerlLIO*)
+PERLVAR(IDir,		struct IPerlDir*)
+PERLVAR(ISock,		struct IPerlSock*)
+PERLVAR(IProc,		struct IPerlProc*)
+#endif
+
+#if defined(USE_ITHREADS)
+PERLVAR(Iptr_table,	PTR_TBL_t*)
+#endif
+PERLVARI(Ibeginav_save, AV*, Nullav)	/* save BEGIN{}s when compiling */
+
+#ifdef USE_5005THREADS
+PERLVAR(Ifdpid_mutex,	perl_mutex)	/* mutex for fdpid array */
+PERLVAR(Isv_lock_mutex,	perl_mutex)	/* mutex for SvLOCK macro */
+#endif
+
+PERLVAR(Inullstash,	HV *)		/* illegal symbols end up here */
+
+PERLVAR(Ixnv_arenaroot,	XPV*)		/* list of allocated xnv areas */
+PERLVAR(Ixrv_arenaroot,	XPV*)		/* list of allocated xrv areas */
+PERLVAR(Ixpv_arenaroot,	XPV*)		/* list of allocated xpv areas */
+PERLVAR(Ixpviv_arenaroot,XPVIV*)	/* list of allocated xpviv areas */
+PERLVAR(Ixpvnv_arenaroot,XPVNV*)	/* list of allocated xpvnv areas */
+PERLVAR(Ixpvcv_arenaroot,XPVCV*)	/* list of allocated xpvcv areas */
+PERLVAR(Ixpvav_arenaroot,XPVAV*)	/* list of allocated xpvav areas */
+PERLVAR(Ixpvhv_arenaroot,XPVHV*)	/* list of allocated xpvhv areas */
+PERLVAR(Ixpvmg_arenaroot,XPVMG*)	/* list of allocated xpvmg areas */
+PERLVAR(Ixpvlv_arenaroot,XPVLV*)	/* list of allocated xpvlv areas */
+PERLVAR(Ixpvbm_arenaroot,XPVBM*)	/* list of allocated xpvbm areas */
+PERLVAR(Ihe_arenaroot,	XPV*)		/* list of allocated he areas */
+
+     /* 5.6.0 stopped here */
+
+PERLVAR(Ipsig_pend, int *)		/* per-signal "count" of pending */
+PERLVARI(Isig_pending, int,0)           /* Number if highest signal pending */
+
+#ifdef USE_LOCALE_NUMERIC
+
+PERLVAR(Inumeric_radix_sv,	SV *)	/* The radix separator if not '.' */
+
+#endif
+
+#if defined(USE_ITHREADS)
+PERLVAR(Iregex_pad,     SV**)		/* All regex objects */
+PERLVAR(Iregex_padav,   AV*)		/* All regex objects */
+
+#endif
+
+#ifdef USE_REENTRANT_API
+PERLVAR(Ireentrant_buffer, REENTR*)	/* here we store the _r buffers */
+#endif
+
+PERLVARI(Isavebegin,     bool,	FALSE)	/* save BEGINs for compiler	*/
+
+PERLVAR(Icustom_op_names, HV*)  /* Names of user defined ops */
+PERLVAR(Icustom_op_descs, HV*)  /* Descriptions of user defined ops */
+
+#ifdef PERLIO_LAYERS
+PERLVARI(Iperlio, PerlIO *,NULL)
+PERLVARI(Iknown_layers, PerlIO_list_t *,NULL)
+PERLVARI(Idef_layerlist, PerlIO_list_t *,NULL)
+#endif
+
+PERLVARI(Iencoding,	SV*, Nullsv)		/* character encoding */
+
+PERLVAR(Idebug_pad,	struct perl_debug_pad)	/* always needed because of the re extension */
+
+PERLVAR(Itaint_warn, bool)      /* taint warns instead of dying */
+
+#ifdef PL_OP_SLAB_ALLOC
+PERLVAR(IOpPtr,I32 **)
+PERLVARI(IOpSpace,I32,0)
+PERLVAR(IOpSlab,I32 *)
+#endif
+
+PERLVAR(Iutf8locale,	bool)		/* utf8 locale detected */
+
+PERLVAR(Iutf8_idstart,	SV *)
+PERLVAR(Iutf8_idcont,	SV *)
+
+PERLVAR(Isort_RealCmp,  SVCOMPARE_t)
+
+PERLVARI(Icheckav_save, AV*, Nullav)	/* save CHECK{}s when compiling */
+
+PERLVARI(Iclocktick, long, 0)	/* this many times() ticks in a second */
+
+PERLVARI(Iin_load_module, int, 0)	/* to prevent recursions in PerlIO_find_layer */
+
+PERLVAR(Iunicode, U32)	/* Unicode features: $ENV{PERL_UNICODE} or -C */
+
+PERLVAR(Isignals, U32)	/* Using which pre-5.8 signals */
+
+PERLVAR(Istashcache,	HV *)		/* Cache to speed up S_method_common */
+
+PERLVAR(Ireentrant_retint, int)	/* Integer return value from reentrant functions */
+
+/* Hooks to shared SVs and locks. */
+PERLVARI(Isharehook,	share_proc_t,	MEMBER_TO_FPTR(Perl_sv_nosharing))
+PERLVARI(Ilockhook,	share_proc_t,	MEMBER_TO_FPTR(Perl_sv_nolocking))
+PERLVARI(Iunlockhook,	share_proc_t,	MEMBER_TO_FPTR(Perl_sv_nounlocking))
+PERLVARI(Ithreadhook,	thrhook_proc_t,	MEMBER_TO_FPTR(Perl_nothreadhook))
+
+/* Force inclusion of both runops options */
+PERLVARI(Irunops_std,	runops_proc_t,	MEMBER_TO_FPTR(Perl_runops_standard))
+PERLVARI(Irunops_dbg,	runops_proc_t,	MEMBER_TO_FPTR(Perl_runops_debug))
+
+/* Stores the PPID */
+#ifdef THREADS_HAVE_PIDS
+PERLVARI(Ippid,		IV,		0)
+#endif
+
+PERLVARI(Ihash_seed, UV, 0)		/* Hash initializer */
+
+PERLVARI(Ihash_seed_set, bool, FALSE)		/* Hash initialized? */
+
+PERLVARI(Irehash_seed, UV, 0)		/* 582 hash initializer */
+
+PERLVARI(Irehash_seed_set, bool, FALSE)	/* 582 hash initialized? */
+
+/* These two variables are needed to preserve 5.8.x bincompat because we can't
+   change function prototypes of two exported functions.  Probably should be
+   taken out of blead soon, and relevant prototypes changed.  */
+PERLVARI(Ifdscript, int, -1)	/* fd for script */
+PERLVARI(Isuidscript, int, -1)	/* fd for suid script */
+
+#if defined(USE_ITHREADS)
+PERLVAR(Ipte_root,	struct ptr_tbl_ent *)	/* free ptr_tbl_ent list */
+PERLVAR(Ipte_arenaroot,	XPV*)		/* list of allocated pte areas */
+#endif
+
+/* New variables must be added to the very end, before this comment,
+ * for binary compatibility (the offsets of the old members must not change).
+ * (Don't forget to add your variable also to perl_clone()!)
+ * XSUB.h provides wrapper functions via perlapi.h that make this
+ * irrelevant, but not all code may be expected to #include XSUB.h.
+ */
+
+#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+/* File descriptor to talk to the child which dumps scalars.  */
+PERLVARI(Idumper_fd, int, -1)
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/iperlsys.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/iperlsys.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/iperlsys.h	(revision 14489)
@@ -0,0 +1,1407 @@
+/*
+ * iperlsys.h - Perl's interface to the system
+ *
+ * This file defines the system level functionality that perl needs.
+ *
+ * When using C, this definition is in the form of a set of macros
+ * that can be #defined to the system-level function (or a wrapper
+ * provided elsewhere).
+ *
+ * GSAR 21-JUN-98
+ */
+
+#ifndef __Inc__IPerl___
+#define __Inc__IPerl___
+
+/*
+ *	PerlXXX_YYY explained - DickH and DougL @ ActiveState.com
+ *
+ * XXX := functional group
+ * YYY := stdlib/OS function name
+ *
+ * Continuing with the theme of PerlIO, all OS functionality was
+ * encapsulated into one of several interfaces.
+ *
+ * PerlIO - stdio
+ * PerlLIO - low level I/O
+ * PerlMem - malloc, realloc, free
+ * PerlDir - directory related
+ * PerlEnv - process environment handling
+ * PerlProc - process control
+ * PerlSock - socket functions
+ *
+ *
+ * The features of this are:
+ * 1. All OS dependant code is in the Perl Host and not the Perl Core.
+ *    (At least this is the holy grail goal of this work)
+ * 2. The Perl Host (see perl.h for description) can provide a new and
+ *    improved interface to OS functionality if required.
+ * 3. Developers can easily hook into the OS calls for instrumentation
+ *    or diagnostic purposes.
+ *
+ * What was changed to do this:
+ * 1. All calls to OS functions were replaced with PerlXXX_YYY
+ *
+ */
+
+/*
+    Interface for perl stdio functions, or whatever we are Configure-d
+    to use.
+*/
+#include "perlio.h"
+
+#ifndef Sighandler_t
+typedef Signal_t (*Sighandler_t) (int);
+#endif
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlStdIO		*/
+struct IPerlStdIO;
+struct IPerlStdIOInfo;
+typedef FILE*		(*LPStdin)(struct IPerlStdIO*);
+typedef FILE*		(*LPStdout)(struct IPerlStdIO*);
+typedef FILE*		(*LPStderr)(struct IPerlStdIO*);
+typedef FILE*		(*LPOpen)(struct IPerlStdIO*, const char*,
+			    const char*);
+typedef int		(*LPClose)(struct IPerlStdIO*, FILE*);
+typedef int		(*LPEof)(struct IPerlStdIO*, FILE*);
+typedef int		(*LPError)(struct IPerlStdIO*, FILE*);
+typedef void		(*LPClearerr)(struct IPerlStdIO*, FILE*);
+typedef int		(*LPGetc)(struct IPerlStdIO*, FILE*);
+typedef char*		(*LPGetBase)(struct IPerlStdIO*, FILE*);
+typedef int		(*LPGetBufsiz)(struct IPerlStdIO*, FILE*);
+typedef int		(*LPGetCnt)(struct IPerlStdIO*, FILE*);
+typedef char*		(*LPGetPtr)(struct IPerlStdIO*, FILE*);
+typedef char*		(*LPGets)(struct IPerlStdIO*, FILE*, char*, int);
+typedef int		(*LPPutc)(struct IPerlStdIO*, FILE*, int);
+typedef int		(*LPPuts)(struct IPerlStdIO*, FILE*, const char*);
+typedef int		(*LPFlush)(struct IPerlStdIO*, FILE*);
+typedef int		(*LPUngetc)(struct IPerlStdIO*, int,FILE*);
+typedef int		(*LPFileno)(struct IPerlStdIO*, FILE*);
+typedef FILE*		(*LPFdopen)(struct IPerlStdIO*, int, const char*);
+typedef FILE*		(*LPReopen)(struct IPerlStdIO*, const char*,
+			    const char*, FILE*);
+typedef SSize_t		(*LPRead)(struct IPerlStdIO*, void*, Size_t, Size_t, FILE *);
+typedef SSize_t		(*LPWrite)(struct IPerlStdIO*, const void*, Size_t, Size_t, FILE *);
+typedef void		(*LPSetBuf)(struct IPerlStdIO*, FILE*, char*);
+typedef int		(*LPSetVBuf)(struct IPerlStdIO*, FILE*, char*, int,
+			    Size_t);
+typedef void		(*LPSetCnt)(struct IPerlStdIO*, FILE*, int);
+
+#ifndef NETWARE
+typedef void		(*LPSetPtr)(struct IPerlStdIO*, FILE*, char*);
+#elif defined(NETWARE)
+typedef void		(*LPSetPtr)(struct IPerlStdIO*, FILE*, char*, int);
+#endif
+
+typedef void		(*LPSetlinebuf)(struct IPerlStdIO*, FILE*);
+typedef int		(*LPPrintf)(struct IPerlStdIO*, FILE*, const char*,
+			    ...);
+typedef int		(*LPVprintf)(struct IPerlStdIO*, FILE*, const char*,
+			    va_list);
+typedef Off_t		(*LPTell)(struct IPerlStdIO*, FILE*);
+typedef int		(*LPSeek)(struct IPerlStdIO*, FILE*, Off_t, int);
+typedef void		(*LPRewind)(struct IPerlStdIO*, FILE*);
+typedef FILE*		(*LPTmpfile)(struct IPerlStdIO*);
+typedef int		(*LPGetpos)(struct IPerlStdIO*, FILE*, Fpos_t*);
+typedef int		(*LPSetpos)(struct IPerlStdIO*, FILE*,
+			    const Fpos_t*);
+typedef void		(*LPInit)(struct IPerlStdIO*);
+typedef void		(*LPInitOSExtras)(struct IPerlStdIO*);
+typedef FILE*		(*LPFdupopen)(struct IPerlStdIO*, FILE*);
+
+struct IPerlStdIO
+{
+    LPStdin		pStdin;
+    LPStdout		pStdout;
+    LPStderr		pStderr;
+    LPOpen		pOpen;
+    LPClose		pClose;
+    LPEof		pEof;
+    LPError		pError;
+    LPClearerr		pClearerr;
+    LPGetc		pGetc;
+    LPGetBase		pGetBase;
+    LPGetBufsiz		pGetBufsiz;
+    LPGetCnt		pGetCnt;
+    LPGetPtr		pGetPtr;
+    LPGets		pGets;
+    LPPutc		pPutc;
+    LPPuts		pPuts;
+    LPFlush		pFlush;
+    LPUngetc		pUngetc;
+    LPFileno		pFileno;
+    LPFdopen		pFdopen;
+    LPReopen		pReopen;
+    LPRead		pRead;
+    LPWrite		pWrite;
+    LPSetBuf		pSetBuf;
+    LPSetVBuf		pSetVBuf;
+    LPSetCnt		pSetCnt;
+    LPSetPtr		pSetPtr;
+    LPSetlinebuf	pSetlinebuf;
+    LPPrintf		pPrintf;
+    LPVprintf		pVprintf;
+    LPTell		pTell;
+    LPSeek		pSeek;
+    LPRewind		pRewind;
+    LPTmpfile		pTmpfile;
+    LPGetpos		pGetpos;
+    LPSetpos		pSetpos;
+    LPInit		pInit;
+    LPInitOSExtras	pInitOSExtras;
+    LPFdupopen		pFdupopen;
+};
+
+struct IPerlStdIOInfo
+{
+    unsigned long	nCount;	    /* number of entries expected */
+    struct IPerlStdIO	perlStdIOList;
+};
+
+/* These do not belong here ... NI-S, 14 Nov 2000 */
+
+#ifdef USE_STDIO_PTR
+#  define PerlSIO_has_cntptr(f)		1
+#  ifdef STDIO_PTR_LVALUE
+#    ifdef  STDIO_CNT_LVALUE
+#      define PerlSIO_canset_cnt(f)	1
+#      ifdef STDIO_PTR_LVAL_NOCHANGE_CNT
+#        define PerlSIO_fast_gets(f)	1
+#      endif
+#    else /* STDIO_CNT_LVALUE */
+#      define PerlSIO_canset_cnt(f)	0
+#    endif
+#  else /* STDIO_PTR_LVALUE */
+#    ifdef STDIO_PTR_LVAL_SETS_CNT
+#      define PerlSIO_fast_gets(f)	1
+#    endif
+#  endif
+#else  /* USE_STDIO_PTR */
+#  define PerlSIO_has_cntptr(f)		0
+#  define PerlSIO_canset_cnt(f)		0
+#endif /* USE_STDIO_PTR */
+
+#ifndef PerlSIO_fast_gets
+#define PerlSIO_fast_gets(f)		0
+#endif
+
+#ifdef FILE_base
+#define PerlSIO_has_base(f)		1
+#else
+#define PerlSIO_has_base(f)		0
+#endif
+
+/* Now take FILE * via function table */
+
+#define PerlSIO_stdin							\
+	(*PL_StdIO->pStdin)(PL_StdIO)
+#define PerlSIO_stdout							\
+	(*PL_StdIO->pStdout)(PL_StdIO)
+#define PerlSIO_stderr							\
+	(*PL_StdIO->pStderr)(PL_StdIO)
+#define PerlSIO_fopen(x,y)						\
+	(*PL_StdIO->pOpen)(PL_StdIO, (x),(y))
+#define PerlSIO_fclose(f)						\
+	(*PL_StdIO->pClose)(PL_StdIO, (f))
+#define PerlSIO_feof(f)							\
+	(*PL_StdIO->pEof)(PL_StdIO, (f))
+#define PerlSIO_ferror(f)						\
+	(*PL_StdIO->pError)(PL_StdIO, (f))
+#define PerlSIO_clearerr(f)						\
+	(*PL_StdIO->pClearerr)(PL_StdIO, (f))
+#define PerlSIO_fgetc(f)						\
+	(*PL_StdIO->pGetc)(PL_StdIO, (f))
+#define PerlSIO_get_base(f)						\
+	(*PL_StdIO->pGetBase)(PL_StdIO, (f))
+#define PerlSIO_get_bufsiz(f)						\
+	(*PL_StdIO->pGetBufsiz)(PL_StdIO, (f))
+#define PerlSIO_get_cnt(f)						\
+	(*PL_StdIO->pGetCnt)(PL_StdIO, (f))
+#define PerlSIO_get_ptr(f)						\
+	(*PL_StdIO->pGetPtr)(PL_StdIO, (f))
+#define PerlSIO_fputc(f,c)						\
+	(*PL_StdIO->pPutc)(PL_StdIO, (f),(c))
+#define PerlSIO_fputs(f,s)						\
+	(*PL_StdIO->pPuts)(PL_StdIO, (f),(s))
+#define PerlSIO_fflush(f)						\
+	(*PL_StdIO->pFlush)(PL_StdIO, (f))
+#define PerlSIO_fgets(s, n, fp)						\
+	(*PL_StdIO->pGets)(PL_StdIO, (fp), s, n)
+#define PerlSIO_ungetc(c,f)						\
+	(*PL_StdIO->pUngetc)(PL_StdIO, (c),(f))
+#define PerlSIO_fileno(f)						\
+	(*PL_StdIO->pFileno)(PL_StdIO, (f))
+#define PerlSIO_fdopen(f, s)						\
+	(*PL_StdIO->pFdopen)(PL_StdIO, (f),(s))
+#define PerlSIO_freopen(p, m, f)					\
+	(*PL_StdIO->pReopen)(PL_StdIO, (p), (m), (f))
+#define PerlSIO_fread(buf,sz,count,f)					\
+	(*PL_StdIO->pRead)(PL_StdIO, (buf), (sz), (count), (f))
+#define PerlSIO_fwrite(buf,sz,count,f)					\
+	(*PL_StdIO->pWrite)(PL_StdIO, (buf), (sz), (count), (f))
+#define PerlSIO_setbuf(f,b)						\
+	(*PL_StdIO->pSetBuf)(PL_StdIO, (f), (b))
+#define PerlSIO_setvbuf(f,b,t,s)					\
+	(*PL_StdIO->pSetVBuf)(PL_StdIO, (f),(b),(t),(s))
+#define PerlSIO_set_cnt(f,c)						\
+	(*PL_StdIO->pSetCnt)(PL_StdIO, (f), (c))
+#define PerlSIO_set_ptr(f,p)						\
+	(*PL_StdIO->pSetPtr)(PL_StdIO, (f), (p))
+#define PerlSIO_setlinebuf(f)						\
+	(*PL_StdIO->pSetlinebuf)(PL_StdIO, (f))
+#define PerlSIO_printf		Perl_fprintf_nocontext
+#define PerlSIO_stdoutf		Perl_printf_nocontext
+#define PerlSIO_vprintf(f,fmt,a)						\
+	(*PL_StdIO->pVprintf)(PL_StdIO, (f),(fmt),a)
+#define PerlSIO_ftell(f)							\
+	(*PL_StdIO->pTell)(PL_StdIO, (f))
+#define PerlSIO_fseek(f,o,w)						\
+	(*PL_StdIO->pSeek)(PL_StdIO, (f),(o),(w))
+#define PerlSIO_fgetpos(f,p)						\
+	(*PL_StdIO->pGetpos)(PL_StdIO, (f),(p))
+#define PerlSIO_fsetpos(f,p)						\
+	(*PL_StdIO->pSetpos)(PL_StdIO, (f),(p))
+#define PerlSIO_rewind(f)						\
+	(*PL_StdIO->pRewind)(PL_StdIO, (f))
+#define PerlSIO_tmpfile()						\
+	(*PL_StdIO->pTmpfile)(PL_StdIO)
+#define PerlSIO_init()							\
+	(*PL_StdIO->pInit)(PL_StdIO)
+#undef 	init_os_extras
+#define init_os_extras()						\
+	(*PL_StdIO->pInitOSExtras)(PL_StdIO)
+#define PerlSIO_fdupopen(f)						\
+	(*PL_StdIO->pFdupopen)(PL_StdIO, (f))
+
+#else	/* PERL_IMPLICIT_SYS */
+
+#define PerlSIO_stdin			stdin
+#define PerlSIO_stdout			stdout
+#define PerlSIO_stderr			stderr
+#define PerlSIO_fopen(x,y)		fopen(x,y)
+#ifdef __VOS__
+/* Work around VOS bug posix-979, wrongly setting errno when at end of file. */
+#define PerlSIO_fclose(f)		(((errno==1025)?errno=0:0),fclose(f))
+#define PerlSIO_feof(f)			(((errno==1025)?errno=0:0),feof(f))
+#define PerlSIO_ferror(f)		(((errno==1025)?errno=0:0),ferror(f))
+#else
+#define PerlSIO_fclose(f)		fclose(f)
+#define PerlSIO_feof(f)			feof(f)
+#define PerlSIO_ferror(f)		ferror(f)
+#endif
+#define PerlSIO_clearerr(f)		clearerr(f)
+#define PerlSIO_fgetc(f)			fgetc(f)
+#ifdef FILE_base
+#define PerlSIO_get_base(f)		FILE_base(f)
+#define PerlSIO_get_bufsiz(f)		FILE_bufsiz(f)
+#else
+#define PerlSIO_get_base(f)		NULL
+#define PerlSIO_get_bufsiz(f)		0
+#endif
+#ifdef USE_STDIO_PTR
+#define PerlSIO_get_cnt(f)		FILE_cnt(f)
+#define PerlSIO_get_ptr(f)		FILE_ptr(f)
+#else
+#define PerlSIO_get_cnt(f)		0
+#define PerlSIO_get_ptr(f)		NULL
+#endif
+#define PerlSIO_fputc(f,c)		fputc(c,f)
+#define PerlSIO_fputs(f,s)		fputs(s,f)
+#define PerlSIO_fflush(f)		Fflush(f)
+#define PerlSIO_fgets(s, n, fp)		fgets(s,n,fp)
+#if defined(VMS) && defined(__DECC)
+     /* Unusual definition of ungetc() here to accomodate fast_sv_gets()'
+      * belief that it can mix getc/ungetc with reads from stdio buffer */
+     int decc$ungetc(int __c, FILE *__stream);
+#    define PerlSIO_ungetc(c,f) ((c) == EOF ? EOF : \
+            ((*(f) && !((*(f))->_flag & _IONBF) && \
+            ((*(f))->_ptr > (*(f))->_base)) ? \
+            ((*(f))->_cnt++, *(--(*(f))->_ptr) = (c)) : decc$ungetc(c,f)))
+#else
+#  define PerlSIO_ungetc(c,f)          ungetc(c,f)
+#endif
+#define PerlSIO_fileno(f)		fileno(f)
+#define PerlSIO_fdopen(f, s)		fdopen(f,s)
+#define PerlSIO_freopen(p, m, f)	freopen(p,m,f)
+#define PerlSIO_fread(buf,sz,count,f)	fread(buf,sz,count,f)
+#define PerlSIO_fwrite(buf,sz,count,f)	fwrite(buf,sz,count,f)
+#define PerlSIO_setbuf(f,b)		setbuf(f,b)
+#define PerlSIO_setvbuf(f,b,t,s)	setvbuf(f,b,t,s)
+#if defined(USE_STDIO_PTR) && defined(STDIO_CNT_LVALUE)
+#define PerlSIO_set_cnt(f,c)		FILE_cnt(f) = (c)
+#else
+#define PerlSIO_set_cnt(f,c)		PerlIOProc_abort()
+#endif
+#if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE)
+#define PerlSIO_set_ptr(f,p)		FILE_ptr(f) = (p)
+#else
+#define PerlSIO_set_ptr(f,p)		PerlIOProc_abort()
+#endif
+#define PerlSIO_setlinebuf(f)		setlinebuf(f)
+#define PerlSIO_printf			fprintf
+#define PerlSIO_stdoutf			printf
+#define PerlSIO_vprintf(f,fmt,a)	vfprintf(f,fmt,a)
+#define PerlSIO_ftell(f)		ftell(f)
+#define PerlSIO_fseek(f,o,w)		fseek(f,o,w)
+#define PerlSIO_fgetpos(f,p)		fgetpos(f,p)
+#define PerlSIO_fsetpos(f,p)		fsetpos(f,p)
+#define PerlSIO_rewind(f)		rewind(f)
+#define PerlSIO_tmpfile()		tmpfile()
+#define PerlSIO_fdupopen(f)		(f)
+
+#endif	/* PERL_IMPLICIT_SYS */
+
+/*
+ *   Interface for directory functions
+ */
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlDir		*/
+struct IPerlDir;
+struct IPerlDirInfo;
+typedef int		(*LPMakedir)(struct IPerlDir*, const char*, int);
+typedef int		(*LPChdir)(struct IPerlDir*, const char*);
+typedef int		(*LPRmdir)(struct IPerlDir*, const char*);
+typedef int		(*LPDirClose)(struct IPerlDir*, DIR*);
+typedef DIR*		(*LPDirOpen)(struct IPerlDir*, char*);
+typedef struct direct*	(*LPDirRead)(struct IPerlDir*, DIR*);
+typedef void		(*LPDirRewind)(struct IPerlDir*, DIR*);
+typedef void		(*LPDirSeek)(struct IPerlDir*, DIR*, long);
+typedef long		(*LPDirTell)(struct IPerlDir*, DIR*);
+#ifdef WIN32
+typedef char*		(*LPDirMapPathA)(struct IPerlDir*, const char*);
+typedef WCHAR*		(*LPDirMapPathW)(struct IPerlDir*, const WCHAR*);
+#endif
+
+struct IPerlDir
+{
+    LPMakedir		pMakedir;
+    LPChdir		pChdir;
+    LPRmdir		pRmdir;
+    LPDirClose		pClose;
+    LPDirOpen		pOpen;
+    LPDirRead		pRead;
+    LPDirRewind		pRewind;
+    LPDirSeek		pSeek;
+    LPDirTell		pTell;
+#ifdef WIN32
+    LPDirMapPathA	pMapPathA;
+    LPDirMapPathW	pMapPathW;
+#endif
+};
+
+struct IPerlDirInfo
+{
+    unsigned long	nCount;	    /* number of entries expected */
+    struct IPerlDir	perlDirList;
+};
+
+#define PerlDir_mkdir(name, mode)				\
+	(*PL_Dir->pMakedir)(PL_Dir, (name), (mode))
+#define PerlDir_chdir(name)					\
+	(*PL_Dir->pChdir)(PL_Dir, (name))
+#define PerlDir_rmdir(name)					\
+	(*PL_Dir->pRmdir)(PL_Dir, (name))
+#define PerlDir_close(dir)					\
+	(*PL_Dir->pClose)(PL_Dir, (dir))
+#define PerlDir_open(name)					\
+	(*PL_Dir->pOpen)(PL_Dir, (name))
+#define PerlDir_read(dir)					\
+	(*PL_Dir->pRead)(PL_Dir, (dir))
+#define PerlDir_rewind(dir)					\
+	(*PL_Dir->pRewind)(PL_Dir, (dir))
+#define PerlDir_seek(dir, loc)					\
+	(*PL_Dir->pSeek)(PL_Dir, (dir), (loc))
+#define PerlDir_tell(dir)					\
+	(*PL_Dir->pTell)(PL_Dir, (dir))
+#ifdef WIN32
+#define PerlDir_mapA(dir)					\
+	(*PL_Dir->pMapPathA)(PL_Dir, (dir))
+#define PerlDir_mapW(dir)					\
+	(*PL_Dir->pMapPathW)(PL_Dir, (dir))
+#endif
+
+#else	/* PERL_IMPLICIT_SYS */
+
+#define PerlDir_mkdir(name, mode)	Mkdir((name), (mode))
+#ifdef VMS
+#  define PerlDir_chdir(n)		Chdir((n))
+#else
+#  define PerlDir_chdir(name)		chdir((name))
+#endif
+#define PerlDir_rmdir(name)		rmdir((name))
+#define PerlDir_close(dir)		closedir((dir))
+#define PerlDir_open(name)		opendir((name))
+#define PerlDir_read(dir)		readdir((dir))
+#define PerlDir_rewind(dir)		rewinddir((dir))
+#define PerlDir_seek(dir, loc)		seekdir((dir), (loc))
+#define PerlDir_tell(dir)		telldir((dir))
+#ifdef WIN32
+#define PerlDir_mapA(dir)		dir
+#define PerlDir_mapW(dir)		dir
+#endif
+
+#endif	/* PERL_IMPLICIT_SYS */
+
+/*
+    Interface for perl environment functions
+*/
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlEnv		*/
+struct IPerlEnv;
+struct IPerlEnvInfo;
+typedef char*		(*LPEnvGetenv)(struct IPerlEnv*, const char*);
+typedef int		(*LPEnvPutenv)(struct IPerlEnv*, const char*);
+typedef char*		(*LPEnvGetenv_len)(struct IPerlEnv*,
+				    const char *varname, unsigned long *len);
+typedef int		(*LPEnvUname)(struct IPerlEnv*, struct utsname *name);
+typedef void		(*LPEnvClearenv)(struct IPerlEnv*);
+typedef void*		(*LPEnvGetChildenv)(struct IPerlEnv*);
+typedef void		(*LPEnvFreeChildenv)(struct IPerlEnv*, void* env);
+typedef char*		(*LPEnvGetChilddir)(struct IPerlEnv*);
+typedef void		(*LPEnvFreeChilddir)(struct IPerlEnv*, char* dir);
+#ifdef HAS_ENVGETENV
+typedef char*		(*LPENVGetenv)(struct IPerlEnv*, const char *varname);
+typedef char*		(*LPENVGetenv_len)(struct IPerlEnv*,
+				    const char *varname, unsigned long *len);
+#endif
+#ifdef WIN32
+typedef unsigned long	(*LPEnvOsID)(struct IPerlEnv*);
+typedef char*		(*LPEnvLibPath)(struct IPerlEnv*, const char*);
+typedef char*		(*LPEnvSiteLibPath)(struct IPerlEnv*, const char*);
+typedef char*		(*LPEnvVendorLibPath)(struct IPerlEnv*, const char*);
+typedef void		(*LPEnvGetChildIO)(struct IPerlEnv*, child_IO_table*);
+#endif
+
+struct IPerlEnv
+{
+    LPEnvGetenv		pGetenv;
+    LPEnvPutenv		pPutenv;
+    LPEnvGetenv_len	pGetenv_len;
+    LPEnvUname		pEnvUname;
+    LPEnvClearenv	pClearenv;
+    LPEnvGetChildenv	pGetChildenv;
+    LPEnvFreeChildenv	pFreeChildenv;
+    LPEnvGetChilddir	pGetChilddir;
+    LPEnvFreeChilddir	pFreeChilddir;
+#ifdef HAS_ENVGETENV
+    LPENVGetenv		pENVGetenv;
+    LPENVGetenv_len	pENVGetenv_len;
+#endif
+#ifdef WIN32
+    LPEnvOsID		pEnvOsID;
+    LPEnvLibPath	pLibPath;
+    LPEnvSiteLibPath	pSiteLibPath;
+    LPEnvVendorLibPath	pVendorLibPath;
+    LPEnvGetChildIO	pGetChildIO;
+#endif
+};
+
+struct IPerlEnvInfo
+{
+    unsigned long	nCount;	    /* number of entries expected */
+    struct IPerlEnv	perlEnvList;
+};
+
+#define PerlEnv_putenv(str)					\
+	(*PL_Env->pPutenv)(PL_Env,(str))
+#define PerlEnv_getenv(str)					\
+	(*PL_Env->pGetenv)(PL_Env,(str))
+#define PerlEnv_getenv_len(str,l)				\
+	(*PL_Env->pGetenv_len)(PL_Env,(str), (l))
+#define PerlEnv_clearenv()					\
+	(*PL_Env->pClearenv)(PL_Env)
+#define PerlEnv_get_childenv()					\
+	(*PL_Env->pGetChildenv)(PL_Env)
+#define PerlEnv_free_childenv(e)				\
+	(*PL_Env->pFreeChildenv)(PL_Env, (e))
+#define PerlEnv_get_childdir()					\
+	(*PL_Env->pGetChilddir)(PL_Env)
+#define PerlEnv_free_childdir(d)				\
+	(*PL_Env->pFreeChilddir)(PL_Env, (d))
+#ifdef HAS_ENVGETENV
+#  define PerlEnv_ENVgetenv(str)				\
+	(*PL_Env->pENVGetenv)(PL_Env,(str))
+#  define PerlEnv_ENVgetenv_len(str,l)				\
+	(*PL_Env->pENVGetenv_len)(PL_Env,(str), (l))
+#else
+#  define PerlEnv_ENVgetenv(str)				\
+	PerlEnv_getenv((str))
+#  define PerlEnv_ENVgetenv_len(str,l)				\
+	PerlEnv_getenv_len((str),(l))
+#endif
+#define PerlEnv_uname(name)					\
+	(*PL_Env->pEnvUname)(PL_Env,(name))
+#ifdef WIN32
+#define PerlEnv_os_id()						\
+	(*PL_Env->pEnvOsID)(PL_Env)
+#define PerlEnv_lib_path(str)					\
+	(*PL_Env->pLibPath)(PL_Env,(str))
+#define PerlEnv_sitelib_path(str)				\
+	(*PL_Env->pSiteLibPath)(PL_Env,(str))
+#define PerlEnv_vendorlib_path(str)				\
+	(*PL_Env->pVendorLibPath)(PL_Env,(str))
+#define PerlEnv_get_child_IO(ptr)				\
+	(*PL_Env->pGetChildIO)(PL_Env, ptr)
+#endif
+
+#else	/* PERL_IMPLICIT_SYS */
+
+#define PerlEnv_putenv(str)		putenv((str))
+#define PerlEnv_getenv(str)		getenv((str))
+#define PerlEnv_getenv_len(str,l)	getenv_len((str), (l))
+#ifdef HAS_ENVGETENV
+#  define PerlEnv_ENVgetenv(str)	ENVgetenv((str))
+#  define PerlEnv_ENVgetenv_len(str,l)	ENVgetenv_len((str), (l))
+#else
+#  define PerlEnv_ENVgetenv(str)	PerlEnv_getenv((str))
+#  define PerlEnv_ENVgetenv_len(str,l)	PerlEnv_getenv_len((str), (l))
+#endif
+#define PerlEnv_uname(name)		uname((name))
+
+#ifdef WIN32
+#define PerlEnv_os_id()			win32_os_id()
+#define PerlEnv_lib_path(str)		win32_get_privlib(str)
+#define PerlEnv_sitelib_path(str)	win32_get_sitelib(str)
+#define PerlEnv_vendorlib_path(str)	win32_get_vendorlib(str)
+#define PerlEnv_get_child_IO(ptr)	win32_get_child_IO(ptr)
+#define PerlEnv_clearenv()		win32_clearenv()
+#define PerlEnv_get_childenv()		win32_get_childenv()
+#define PerlEnv_free_childenv(e)	win32_free_childenv((e))
+#define PerlEnv_get_childdir()		win32_get_childdir()
+#define PerlEnv_free_childdir(d)	win32_free_childdir((d))
+#else
+#define PerlEnv_clearenv()		clearenv()
+#define PerlEnv_get_childenv()		get_childenv()
+#define PerlEnv_free_childenv(e)	free_childenv((e))
+#define PerlEnv_get_childdir()		get_childdir()
+#define PerlEnv_free_childdir(d)	free_childdir((d))
+#endif
+
+#endif	/* PERL_IMPLICIT_SYS */
+
+/*
+    Interface for perl low-level IO functions
+*/
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlLIO		*/
+struct IPerlLIO;
+struct IPerlLIOInfo;
+typedef int		(*LPLIOAccess)(struct IPerlLIO*, const char*, int);
+typedef int		(*LPLIOChmod)(struct IPerlLIO*, const char*, int);
+typedef int		(*LPLIOChown)(struct IPerlLIO*, const char*, uid_t,
+			    gid_t);
+typedef int		(*LPLIOChsize)(struct IPerlLIO*, int, Off_t);
+typedef int		(*LPLIOClose)(struct IPerlLIO*, int);
+typedef int		(*LPLIODup)(struct IPerlLIO*, int);
+typedef int		(*LPLIODup2)(struct IPerlLIO*, int, int);
+typedef int		(*LPLIOFlock)(struct IPerlLIO*, int, int);
+typedef int		(*LPLIOFileStat)(struct IPerlLIO*, int, Stat_t*);
+typedef int		(*LPLIOIOCtl)(struct IPerlLIO*, int, unsigned int,
+			    char*);
+typedef int		(*LPLIOIsatty)(struct IPerlLIO*, int);
+typedef int		(*LPLIOLink)(struct IPerlLIO*, const char*,
+				     const char *);
+typedef Off_t		(*LPLIOLseek)(struct IPerlLIO*, int, Off_t, int);
+typedef int		(*LPLIOLstat)(struct IPerlLIO*, const char*,
+			    Stat_t*);
+typedef char*		(*LPLIOMktemp)(struct IPerlLIO*, char*);
+typedef int		(*LPLIOOpen)(struct IPerlLIO*, const char*, int);	
+typedef int		(*LPLIOOpen3)(struct IPerlLIO*, const char*, int, int);	
+typedef int		(*LPLIORead)(struct IPerlLIO*, int, void*, unsigned int);
+typedef int		(*LPLIORename)(struct IPerlLIO*, const char*,
+			    const char*);
+#ifdef NETWARE
+typedef int		(*LPLIOSetmode)(struct IPerlLIO*, FILE*, int);
+#else
+typedef int		(*LPLIOSetmode)(struct IPerlLIO*, int, int);
+#endif	/* NETWARE */
+typedef int		(*LPLIONameStat)(struct IPerlLIO*, const char*,
+			    Stat_t*);
+typedef char*		(*LPLIOTmpnam)(struct IPerlLIO*, char*);
+typedef int		(*LPLIOUmask)(struct IPerlLIO*, int);
+typedef int		(*LPLIOUnlink)(struct IPerlLIO*, const char*);
+typedef int		(*LPLIOUtime)(struct IPerlLIO*, char*, struct utimbuf*);
+typedef int		(*LPLIOWrite)(struct IPerlLIO*, int, const void*,
+			    unsigned int);
+
+struct IPerlLIO
+{
+    LPLIOAccess		pAccess;
+    LPLIOChmod		pChmod;
+    LPLIOChown		pChown;
+    LPLIOChsize		pChsize;
+    LPLIOClose		pClose;
+    LPLIODup		pDup;
+    LPLIODup2		pDup2;
+    LPLIOFlock		pFlock;
+    LPLIOFileStat	pFileStat;
+    LPLIOIOCtl		pIOCtl;
+    LPLIOIsatty		pIsatty;
+    LPLIOLink		pLink;
+    LPLIOLseek		pLseek;
+    LPLIOLstat		pLstat;
+    LPLIOMktemp		pMktemp;
+    LPLIOOpen		pOpen;
+    LPLIOOpen3		pOpen3;
+    LPLIORead		pRead;
+    LPLIORename		pRename;
+    LPLIOSetmode	pSetmode;
+    LPLIONameStat	pNameStat;
+    LPLIOTmpnam		pTmpnam;
+    LPLIOUmask		pUmask;
+    LPLIOUnlink		pUnlink;
+    LPLIOUtime		pUtime;
+    LPLIOWrite		pWrite;
+};
+
+struct IPerlLIOInfo
+{
+    unsigned long	nCount;	    /* number of entries expected */
+    struct IPerlLIO	perlLIOList;
+};
+
+#define PerlLIO_access(file, mode)					\
+	(*PL_LIO->pAccess)(PL_LIO, (file), (mode))
+#define PerlLIO_chmod(file, mode)					\
+	(*PL_LIO->pChmod)(PL_LIO, (file), (mode))
+#define PerlLIO_chown(file, owner, group)				\
+	(*PL_LIO->pChown)(PL_LIO, (file), (owner), (group))
+#define PerlLIO_chsize(fd, size)					\
+	(*PL_LIO->pChsize)(PL_LIO, (fd), (size))
+#define PerlLIO_close(fd)						\
+	(*PL_LIO->pClose)(PL_LIO, (fd))
+#define PerlLIO_dup(fd)							\
+	(*PL_LIO->pDup)(PL_LIO, (fd))
+#define PerlLIO_dup2(fd1, fd2)						\
+	(*PL_LIO->pDup2)(PL_LIO, (fd1), (fd2))
+#define PerlLIO_flock(fd, op)						\
+	(*PL_LIO->pFlock)(PL_LIO, (fd), (op))
+#define PerlLIO_fstat(fd, buf)						\
+	(*PL_LIO->pFileStat)(PL_LIO, (fd), (buf))
+#define PerlLIO_ioctl(fd, u, buf)					\
+	(*PL_LIO->pIOCtl)(PL_LIO, (fd), (u), (buf))
+#define PerlLIO_isatty(fd)						\
+	(*PL_LIO->pIsatty)(PL_LIO, (fd))
+#define PerlLIO_link(oldname, newname)					\
+	(*PL_LIO->pLink)(PL_LIO, (oldname), (newname))
+#define PerlLIO_lseek(fd, offset, mode)					\
+	(*PL_LIO->pLseek)(PL_LIO, (fd), (offset), (mode))
+#define PerlLIO_lstat(name, buf)					\
+	(*PL_LIO->pLstat)(PL_LIO, (name), (buf))
+#define PerlLIO_mktemp(file)						\
+	(*PL_LIO->pMktemp)(PL_LIO, (file))
+#define PerlLIO_open(file, flag)					\
+	(*PL_LIO->pOpen)(PL_LIO, (file), (flag))
+#define PerlLIO_open3(file, flag, perm)					\
+	(*PL_LIO->pOpen3)(PL_LIO, (file), (flag), (perm))
+#define PerlLIO_read(fd, buf, count)					\
+	(*PL_LIO->pRead)(PL_LIO, (fd), (buf), (count))
+#define PerlLIO_rename(oname, newname)					\
+	(*PL_LIO->pRename)(PL_LIO, (oname), (newname))
+#define PerlLIO_setmode(fd, mode)					\
+	(*PL_LIO->pSetmode)(PL_LIO, (fd), (mode))
+#define PerlLIO_stat(name, buf)						\
+	(*PL_LIO->pNameStat)(PL_LIO, (name), (buf))
+#define PerlLIO_tmpnam(str)						\
+	(*PL_LIO->pTmpnam)(PL_LIO, (str))
+#define PerlLIO_umask(mode)						\
+	(*PL_LIO->pUmask)(PL_LIO, (mode))
+#define PerlLIO_unlink(file)						\
+	(*PL_LIO->pUnlink)(PL_LIO, (file))
+#define PerlLIO_utime(file, time)					\
+	(*PL_LIO->pUtime)(PL_LIO, (file), (time))
+#define PerlLIO_write(fd, buf, count)					\
+	(*PL_LIO->pWrite)(PL_LIO, (fd), (buf), (count))
+
+#else	/* PERL_IMPLICIT_SYS */
+
+#define PerlLIO_access(file, mode)	access((file), (mode))
+#define PerlLIO_chmod(file, mode)	chmod((file), (mode))
+#define PerlLIO_chown(file, owner, grp)	chown((file), (owner), (grp))
+#if defined(HAS_TRUNCATE)
+#  define PerlLIO_chsize(fd, size)	ftruncate((fd), (size))
+#elif defined(HAS_CHSIZE)
+#  define PerlLIO_chsize(fd, size)	chsize((fd), (size))
+#else
+#  define PerlLIO_chsize(fd, size)	my_chsize((fd), (size))
+#endif
+#define PerlLIO_close(fd)		close((fd))
+#define PerlLIO_dup(fd)			dup((fd))
+#define PerlLIO_dup2(fd1, fd2)		dup2((fd1), (fd2))
+#define PerlLIO_flock(fd, op)		FLOCK((fd), (op))
+#define PerlLIO_fstat(fd, buf)		Fstat((fd), (buf))
+#define PerlLIO_ioctl(fd, u, buf)	ioctl((fd), (u), (buf))
+#define PerlLIO_isatty(fd)		isatty((fd))
+#define PerlLIO_link(oldname, newname)	link((oldname), (newname))
+#define PerlLIO_lseek(fd, offset, mode)	lseek((fd), (offset), (mode))
+#define PerlLIO_stat(name, buf)		Stat((name), (buf))
+#ifdef HAS_LSTAT
+#  define PerlLIO_lstat(name, buf)	lstat((name), (buf))
+#else
+#  define PerlLIO_lstat(name, buf)	PerlLIO_stat((name), (buf))
+#endif
+#define PerlLIO_mktemp(file)		mktemp((file))
+#define PerlLIO_mkstemp(file)		mkstemp((file))
+#define PerlLIO_open(file, flag)	open((file), (flag))
+#define PerlLIO_open3(file, flag, perm)	open((file), (flag), (perm))
+#define PerlLIO_read(fd, buf, count)	read((fd), (buf), (count))
+#define PerlLIO_rename(old, new)	rename((old), (new))
+#define PerlLIO_setmode(fd, mode)	setmode((fd), (mode))
+#define PerlLIO_tmpnam(str)		tmpnam((str))
+#define PerlLIO_umask(mode)		umask((mode))
+#define PerlLIO_unlink(file)		unlink((file))
+#define PerlLIO_utime(file, time)	utime((file), (time))
+#define PerlLIO_write(fd, buf, count)	write((fd), (buf), (count))
+
+#endif	/* PERL_IMPLICIT_SYS */
+
+/*
+    Interface for perl memory allocation
+*/
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlMem		*/
+struct IPerlMem;
+struct IPerlMemInfo;
+typedef void*		(*LPMemMalloc)(struct IPerlMem*, size_t);
+typedef void*		(*LPMemRealloc)(struct IPerlMem*, void*, size_t);
+typedef void		(*LPMemFree)(struct IPerlMem*, void*);
+typedef void*		(*LPMemCalloc)(struct IPerlMem*, size_t, size_t);
+typedef void		(*LPMemGetLock)(struct IPerlMem*);
+typedef void		(*LPMemFreeLock)(struct IPerlMem*);
+typedef int		(*LPMemIsLocked)(struct IPerlMem*);
+
+struct IPerlMem
+{
+    LPMemMalloc		pMalloc;
+    LPMemRealloc	pRealloc;
+    LPMemFree		pFree;
+    LPMemCalloc		pCalloc;
+    LPMemGetLock	pGetLock;
+    LPMemFreeLock	pFreeLock;
+    LPMemIsLocked	pIsLocked;
+};
+
+struct IPerlMemInfo
+{
+    unsigned long	nCount;	    /* number of entries expected */
+    struct IPerlMem	perlMemList;
+};
+
+/* Interpreter specific memory macros */
+#define PerlMem_malloc(size)				    \
+	(*PL_Mem->pMalloc)(PL_Mem, (size))
+#define PerlMem_realloc(buf, size)			    \
+	(*PL_Mem->pRealloc)(PL_Mem, (buf), (size))
+#define PerlMem_free(buf)				    \
+	(*PL_Mem->pFree)(PL_Mem, (buf))
+#define PerlMem_calloc(num, size)			    \
+	(*PL_Mem->pCalloc)(PL_Mem, (num), (size))
+#define PerlMem_get_lock()				    \
+	(*PL_Mem->pGetLock)(PL_Mem)
+#define PerlMem_free_lock()				    \
+	(*PL_Mem->pFreeLock)(PL_Mem)
+#define PerlMem_is_locked()				    \
+	(*PL_Mem->pIsLocked)(PL_Mem)
+
+/* Shared memory macros */
+#ifdef NETWARE
+
+#define PerlMemShared_malloc(size)			    \
+	(*PL_Mem->pMalloc)(PL_Mem, (size))
+#define PerlMemShared_realloc(buf, size)		    \
+	(*PL_Mem->pRealloc)(PL_Mem, (buf), (size))
+#define PerlMemShared_free(buf)				    \
+	(*PL_Mem->pFree)(PL_Mem, (buf))
+#define PerlMemShared_calloc(num, size)			    \
+	(*PL_Mem->pCalloc)(PL_Mem, (num), (size))
+#define PerlMemShared_get_lock()			    \
+	(*PL_Mem->pGetLock)(PL_Mem)
+#define PerlMemShared_free_lock()			    \
+	(*PL_Mem->pFreeLock)(PL_Mem)
+#define PerlMemShared_is_locked()			    \
+	(*PL_Mem->pIsLocked)(PL_Mem)
+
+#else
+
+#define PerlMemShared_malloc(size)			    \
+	(*PL_MemShared->pMalloc)(PL_MemShared, (size))
+#define PerlMemShared_realloc(buf, size)		    \
+	(*PL_MemShared->pRealloc)(PL_MemShared, (buf), (size))
+#define PerlMemShared_free(buf)				    \
+	(*PL_MemShared->pFree)(PL_MemShared, (buf))
+#define PerlMemShared_calloc(num, size)			    \
+	(*PL_MemShared->pCalloc)(PL_MemShared, (num), (size))
+#define PerlMemShared_get_lock()			    \
+	(*PL_MemShared->pGetLock)(PL_MemShared)
+#define PerlMemShared_free_lock()			    \
+	(*PL_MemShared->pFreeLock)(PL_MemShared)
+#define PerlMemShared_is_locked()			    \
+	(*PL_MemShared->pIsLocked)(PL_MemShared)
+
+#endif
+
+/* Parse tree memory macros */
+#define PerlMemParse_malloc(size)			    \
+	(*PL_MemParse->pMalloc)(PL_MemParse, (size))
+#define PerlMemParse_realloc(buf, size)			    \
+	(*PL_MemParse->pRealloc)(PL_MemParse, (buf), (size))
+#define PerlMemParse_free(buf)				    \
+	(*PL_MemParse->pFree)(PL_MemParse, (buf))
+#define PerlMemParse_calloc(num, size)			    \
+	(*PL_MemParse->pCalloc)(PL_MemParse, (num), (size))
+#define PerlMemParse_get_lock()				    \
+	(*PL_MemParse->pGetLock)(PL_MemParse)
+#define PerlMemParse_free_lock()			    \
+	(*PL_MemParse->pFreeLock)(PL_MemParse)
+#define PerlMemParse_is_locked()			    \
+	(*PL_MemParse->pIsLocked)(PL_MemParse)
+
+
+#else	/* PERL_IMPLICIT_SYS */
+
+/* Interpreter specific memory macros */
+#define PerlMem_malloc(size)		malloc((size))
+#define PerlMem_realloc(buf, size)	realloc((buf), (size))
+#define PerlMem_free(buf)		free((buf))
+#define PerlMem_calloc(num, size)	calloc((num), (size))
+#define PerlMem_get_lock()		
+#define PerlMem_free_lock()
+#define PerlMem_is_locked()		0
+
+/* Shared memory macros */
+#define PerlMemShared_malloc(size)		malloc((size))
+#define PerlMemShared_realloc(buf, size)	realloc((buf), (size))
+#define PerlMemShared_free(buf)			free((buf))
+#define PerlMemShared_calloc(num, size)		calloc((num), (size))
+#define PerlMemShared_get_lock()		
+#define PerlMemShared_free_lock()
+#define PerlMemShared_is_locked()		0
+
+/* Parse tree memory macros */
+#define PerlMemParse_malloc(size)	malloc((size))
+#define PerlMemParse_realloc(buf, size)	realloc((buf), (size))
+#define PerlMemParse_free(buf)		free((buf))
+#define PerlMemParse_calloc(num, size)	calloc((num), (size))
+#define PerlMemParse_get_lock()		
+#define PerlMemParse_free_lock()
+#define PerlMemParse_is_locked()	0
+
+#endif	/* PERL_IMPLICIT_SYS */
+
+/*
+    Interface for perl process functions
+*/
+
+
+#if defined(PERL_IMPLICIT_SYS)
+
+#ifndef jmp_buf
+#include <setjmp.h>
+#endif
+
+/* IPerlProc		*/
+struct IPerlProc;
+struct IPerlProcInfo;
+typedef void		(*LPProcAbort)(struct IPerlProc*);
+typedef char*		(*LPProcCrypt)(struct IPerlProc*, const char*,
+			    const char*);
+typedef void		(*LPProcExit)(struct IPerlProc*, int)
+			    __attribute__noreturn__;
+typedef void		(*LPProc_Exit)(struct IPerlProc*, int)
+			    __attribute__noreturn__;
+typedef int		(*LPProcExecl)(struct IPerlProc*, const char*,
+			    const char*, const char*, const char*,
+			    const char*);
+typedef int		(*LPProcExecv)(struct IPerlProc*, const char*,
+			    const char*const*);
+typedef int		(*LPProcExecvp)(struct IPerlProc*, const char*,
+			    const char*const*);
+typedef uid_t		(*LPProcGetuid)(struct IPerlProc*);
+typedef uid_t		(*LPProcGeteuid)(struct IPerlProc*);
+typedef gid_t		(*LPProcGetgid)(struct IPerlProc*);
+typedef gid_t		(*LPProcGetegid)(struct IPerlProc*);
+typedef char*		(*LPProcGetlogin)(struct IPerlProc*);
+typedef int		(*LPProcKill)(struct IPerlProc*, int, int);
+typedef int		(*LPProcKillpg)(struct IPerlProc*, int, int);
+typedef int		(*LPProcPauseProc)(struct IPerlProc*);
+typedef PerlIO*		(*LPProcPopen)(struct IPerlProc*, const char*,
+			    const char*);
+typedef PerlIO*		(*LPProcPopenList)(struct IPerlProc*, const char*,
+			    IV narg, SV **args);
+typedef int		(*LPProcPclose)(struct IPerlProc*, PerlIO*);
+typedef int		(*LPProcPipe)(struct IPerlProc*, int*);
+typedef int		(*LPProcSetuid)(struct IPerlProc*, uid_t);
+typedef int		(*LPProcSetgid)(struct IPerlProc*, gid_t);
+typedef int		(*LPProcSleep)(struct IPerlProc*, unsigned int);
+typedef int		(*LPProcTimes)(struct IPerlProc*, struct tms*);
+typedef int		(*LPProcWait)(struct IPerlProc*, int*);
+typedef int		(*LPProcWaitpid)(struct IPerlProc*, int, int*, int);
+typedef Sighandler_t	(*LPProcSignal)(struct IPerlProc*, int, Sighandler_t);
+typedef int		(*LPProcFork)(struct IPerlProc*);
+typedef int		(*LPProcGetpid)(struct IPerlProc*);
+#ifdef WIN32
+typedef void*		(*LPProcDynaLoader)(struct IPerlProc*, const char*);
+typedef void		(*LPProcGetOSError)(struct IPerlProc*,
+			    SV* sv, DWORD dwErr);
+typedef int		(*LPProcSpawnvp)(struct IPerlProc*, int, const char*,
+			    const char*const*);
+#endif
+typedef int		(*LPProcLastHost)(struct IPerlProc*);
+typedef int		(*LPProcGetTimeOfDay)(struct IPerlProc*,
+					      struct timeval*, void*);
+
+struct IPerlProc
+{
+    LPProcAbort		pAbort;
+    LPProcCrypt		pCrypt;
+    LPProcExit		pExit;
+    LPProc_Exit		p_Exit;
+    LPProcExecl		pExecl;
+    LPProcExecv		pExecv;
+    LPProcExecvp	pExecvp;
+    LPProcGetuid	pGetuid;
+    LPProcGeteuid	pGeteuid;
+    LPProcGetgid	pGetgid;
+    LPProcGetegid	pGetegid;
+    LPProcGetlogin	pGetlogin;
+    LPProcKill		pKill;
+    LPProcKillpg	pKillpg;
+    LPProcPauseProc	pPauseProc;
+    LPProcPopen		pPopen;
+    LPProcPclose	pPclose;
+    LPProcPipe		pPipe;
+    LPProcSetuid	pSetuid;
+    LPProcSetgid	pSetgid;
+    LPProcSleep		pSleep;
+    LPProcTimes		pTimes;
+    LPProcWait		pWait;
+    LPProcWaitpid	pWaitpid;
+    LPProcSignal	pSignal;
+    LPProcFork		pFork;
+    LPProcGetpid	pGetpid;
+#ifdef WIN32
+    LPProcDynaLoader	pDynaLoader;
+    LPProcGetOSError	pGetOSError;
+    LPProcSpawnvp	pSpawnvp;
+#endif
+    LPProcLastHost      pLastHost;
+    LPProcPopenList	pPopenList;
+    LPProcGetTimeOfDay	pGetTimeOfDay;
+};
+
+struct IPerlProcInfo
+{
+    unsigned long	nCount;	    /* number of entries expected */
+    struct IPerlProc	perlProcList;
+};
+
+#define PerlProc_abort()						\
+	(*PL_Proc->pAbort)(PL_Proc)
+#define PerlProc_crypt(c,s)						\
+	(*PL_Proc->pCrypt)(PL_Proc, (c), (s))
+#define PerlProc_exit(s)						\
+	(*PL_Proc->pExit)(PL_Proc, (s))
+#define PerlProc__exit(s)						\
+	(*PL_Proc->p_Exit)(PL_Proc, (s))
+#define PerlProc_execl(c, w, x, y, z)					\
+	(*PL_Proc->pExecl)(PL_Proc, (c), (w), (x), (y), (z))
+#define PerlProc_execv(c, a)						\
+	(*PL_Proc->pExecv)(PL_Proc, (c), (a))
+#define PerlProc_execvp(c, a)						\
+	(*PL_Proc->pExecvp)(PL_Proc, (c), (a))
+#define PerlProc_getuid()						\
+	(*PL_Proc->pGetuid)(PL_Proc)
+#define PerlProc_geteuid()						\
+	(*PL_Proc->pGeteuid)(PL_Proc)
+#define PerlProc_getgid()						\
+	(*PL_Proc->pGetgid)(PL_Proc)
+#define PerlProc_getegid()						\
+	(*PL_Proc->pGetegid)(PL_Proc)
+#define PerlProc_getlogin()						\
+	(*PL_Proc->pGetlogin)(PL_Proc)
+#define PerlProc_kill(i, a)						\
+	(*PL_Proc->pKill)(PL_Proc, (i), (a))
+#define PerlProc_killpg(i, a)						\
+	(*PL_Proc->pKillpg)(PL_Proc, (i), (a))
+#define PerlProc_pause()						\
+	(*PL_Proc->pPauseProc)(PL_Proc)
+#define PerlProc_popen(c, m)						\
+	(*PL_Proc->pPopen)(PL_Proc, (c), (m))
+#define PerlProc_popen_list(m, n, a)					\
+	(*PL_Proc->pPopenList)(PL_Proc, (m), (n), (a))
+#define PerlProc_pclose(f)						\
+	(*PL_Proc->pPclose)(PL_Proc, (f))
+#define PerlProc_pipe(fd)						\
+	(*PL_Proc->pPipe)(PL_Proc, (fd))
+#define PerlProc_setuid(u)						\
+	(*PL_Proc->pSetuid)(PL_Proc, (u))
+#define PerlProc_setgid(g)						\
+	(*PL_Proc->pSetgid)(PL_Proc, (g))
+#define PerlProc_sleep(t)						\
+	(*PL_Proc->pSleep)(PL_Proc, (t))
+#define PerlProc_times(t)						\
+	(*PL_Proc->pTimes)(PL_Proc, (t))
+#define PerlProc_wait(t)						\
+	(*PL_Proc->pWait)(PL_Proc, (t))
+#define PerlProc_waitpid(p,s,f)						\
+	(*PL_Proc->pWaitpid)(PL_Proc, (p), (s), (f))
+#define PerlProc_signal(n, h)						\
+	(*PL_Proc->pSignal)(PL_Proc, (n), (h))
+#define PerlProc_fork()							\
+	(*PL_Proc->pFork)(PL_Proc)
+#define PerlProc_getpid()						\
+	(*PL_Proc->pGetpid)(PL_Proc)
+#define PerlProc_setjmp(b, n) Sigsetjmp((b), (n))
+#define PerlProc_longjmp(b, n) Siglongjmp((b), (n))
+
+#ifdef WIN32
+#define PerlProc_DynaLoad(f)						\
+	(*PL_Proc->pDynaLoader)(PL_Proc, (f))
+#define PerlProc_GetOSError(s,e)					\
+	(*PL_Proc->pGetOSError)(PL_Proc, (s), (e))
+#define PerlProc_spawnvp(m, c, a)					\
+	(*PL_Proc->pSpawnvp)(PL_Proc, (m), (c), (a))
+#endif
+#define PerlProc_lasthost()						\
+	(*PL_Proc->pLastHost)(PL_Proc)
+#define PerlProc_gettimeofday(t,z)					\
+	(*PL_Proc->pGetTimeOfDay)(PL_Proc,(t),(z))
+
+#else	/* PERL_IMPLICIT_SYS */
+
+#define PerlProc_abort()	abort()
+#define PerlProc_crypt(c,s)	crypt((c), (s))
+#define PerlProc_exit(s)	exit((s))
+#define PerlProc__exit(s)	_exit((s))
+#define PerlProc_execl(c,w,x,y,z)					\
+	execl((c), (w), (x), (y), (z))
+#define PerlProc_execv(c, a)	execv((c), (a))
+#define PerlProc_execvp(c, a)	execvp((c), (a))
+#define PerlProc_getuid()	getuid()
+#define PerlProc_geteuid()	geteuid()
+#define PerlProc_getgid()	getgid()
+#define PerlProc_getegid()	getegid()
+#define PerlProc_getlogin()	getlogin()
+#define PerlProc_kill(i, a)	kill((i), (a))
+#define PerlProc_killpg(i, a)	killpg((i), (a))
+#define PerlProc_pause()	Pause()
+#define PerlProc_popen(c, m)	my_popen((c), (m))
+#define PerlProc_popen_list(m,n,a)	my_popen_list((m),(n),(a))
+#define PerlProc_pclose(f)	my_pclose((f))
+#define PerlProc_pipe(fd)	pipe((fd))
+#define PerlProc_setuid(u)	setuid((u))
+#define PerlProc_setgid(g)	setgid((g))
+#define PerlProc_sleep(t)	sleep((t))
+#define PerlProc_times(t)	times((t))
+#define PerlProc_wait(t)	wait((t))
+#define PerlProc_waitpid(p,s,f)	waitpid((p), (s), (f))
+#define PerlProc_setjmp(b, n)	Sigsetjmp((b), (n))
+#define PerlProc_longjmp(b, n)	Siglongjmp((b), (n))
+#define PerlProc_signal(n, h)	signal((n), (h))
+#define PerlProc_fork()		my_fork()
+#define PerlProc_getpid()	getpid()
+#define PerlProc_gettimeofday(t,z)	gettimeofday((t),(z))
+
+#ifdef WIN32
+#define PerlProc_DynaLoad(f)						\
+	win32_dynaload((f))
+#define PerlProc_GetOSError(s,e)					\
+	win32_str_os_error((s), (e))
+#define PerlProc_spawnvp(m, c, a)					\
+	win32_spawnvp((m), (c), (a))
+#undef PerlProc_signal
+#define PerlProc_signal(n, h) win32_signal((n), (h))
+#endif
+#endif	/* PERL_IMPLICIT_SYS */
+
+/*
+    Interface for perl socket functions
+*/
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* PerlSock		*/
+struct IPerlSock;
+struct IPerlSockInfo;
+typedef u_long		(*LPHtonl)(struct IPerlSock*, u_long);
+typedef u_short		(*LPHtons)(struct IPerlSock*, u_short);
+typedef u_long		(*LPNtohl)(struct IPerlSock*, u_long);
+typedef u_short		(*LPNtohs)(struct IPerlSock*, u_short);
+typedef SOCKET		(*LPAccept)(struct IPerlSock*, SOCKET,
+			    struct sockaddr*, int*);
+typedef int		(*LPBind)(struct IPerlSock*, SOCKET,
+			    const struct sockaddr*, int);
+typedef int		(*LPConnect)(struct IPerlSock*, SOCKET,
+			    const struct sockaddr*, int);
+typedef void		(*LPEndhostent)(struct IPerlSock*);
+typedef void		(*LPEndnetent)(struct IPerlSock*);
+typedef void		(*LPEndprotoent)(struct IPerlSock*);
+typedef void		(*LPEndservent)(struct IPerlSock*);
+typedef int		(*LPGethostname)(struct IPerlSock*, char*, int);
+typedef int		(*LPGetpeername)(struct IPerlSock*, SOCKET,
+			    struct sockaddr*, int*);
+typedef struct hostent*	(*LPGethostbyaddr)(struct IPerlSock*, const char*,
+			    int, int);
+typedef struct hostent*	(*LPGethostbyname)(struct IPerlSock*, const char*);
+typedef struct hostent*	(*LPGethostent)(struct IPerlSock*);
+typedef struct netent*	(*LPGetnetbyaddr)(struct IPerlSock*, long, int);
+typedef struct netent*	(*LPGetnetbyname)(struct IPerlSock*, const char*);
+typedef struct netent*	(*LPGetnetent)(struct IPerlSock*);
+typedef struct protoent*(*LPGetprotobyname)(struct IPerlSock*, const char*);
+typedef struct protoent*(*LPGetprotobynumber)(struct IPerlSock*, int);
+typedef struct protoent*(*LPGetprotoent)(struct IPerlSock*);
+typedef struct servent*	(*LPGetservbyname)(struct IPerlSock*, const char*,
+			    const char*);
+typedef struct servent*	(*LPGetservbyport)(struct IPerlSock*, int,
+			    const char*);
+typedef struct servent*	(*LPGetservent)(struct IPerlSock*);
+typedef int		(*LPGetsockname)(struct IPerlSock*, SOCKET,
+			    struct sockaddr*, int*);
+typedef int		(*LPGetsockopt)(struct IPerlSock*, SOCKET, int, int,
+			    char*, int*);
+typedef unsigned long	(*LPInetAddr)(struct IPerlSock*, const char*);
+typedef char*		(*LPInetNtoa)(struct IPerlSock*, struct in_addr);
+typedef int		(*LPListen)(struct IPerlSock*, SOCKET, int);
+typedef int		(*LPRecv)(struct IPerlSock*, SOCKET, char*, int, int);
+typedef int		(*LPRecvfrom)(struct IPerlSock*, SOCKET, char*, int,
+			    int, struct sockaddr*, int*);
+typedef int		(*LPSelect)(struct IPerlSock*, int, char*, char*,
+			    char*, const struct timeval*);
+typedef int		(*LPSend)(struct IPerlSock*, SOCKET, const char*, int,
+			    int);
+typedef int		(*LPSendto)(struct IPerlSock*, SOCKET, const char*,
+			    int, int, const struct sockaddr*, int);
+typedef void		(*LPSethostent)(struct IPerlSock*, int);
+typedef void		(*LPSetnetent)(struct IPerlSock*, int);
+typedef void		(*LPSetprotoent)(struct IPerlSock*, int);
+typedef void		(*LPSetservent)(struct IPerlSock*, int);
+typedef int		(*LPSetsockopt)(struct IPerlSock*, SOCKET, int, int,
+			    const char*, int);
+typedef int		(*LPShutdown)(struct IPerlSock*, SOCKET, int);
+typedef SOCKET		(*LPSocket)(struct IPerlSock*, int, int, int);
+typedef int		(*LPSocketpair)(struct IPerlSock*, int, int, int,
+			    int*);
+#ifdef WIN32
+typedef int		(*LPClosesocket)(struct IPerlSock*, SOCKET s);
+#endif
+
+struct IPerlSock
+{
+    LPHtonl		pHtonl;
+    LPHtons		pHtons;
+    LPNtohl		pNtohl;
+    LPNtohs		pNtohs;
+    LPAccept		pAccept;
+    LPBind		pBind;
+    LPConnect		pConnect;
+    LPEndhostent	pEndhostent;
+    LPEndnetent		pEndnetent;
+    LPEndprotoent	pEndprotoent;
+    LPEndservent	pEndservent;
+    LPGethostname	pGethostname;
+    LPGetpeername	pGetpeername;
+    LPGethostbyaddr	pGethostbyaddr;
+    LPGethostbyname	pGethostbyname;
+    LPGethostent	pGethostent;
+    LPGetnetbyaddr	pGetnetbyaddr;
+    LPGetnetbyname	pGetnetbyname;
+    LPGetnetent		pGetnetent;
+    LPGetprotobyname	pGetprotobyname;
+    LPGetprotobynumber	pGetprotobynumber;
+    LPGetprotoent	pGetprotoent;
+    LPGetservbyname	pGetservbyname;
+    LPGetservbyport	pGetservbyport;
+    LPGetservent	pGetservent;
+    LPGetsockname	pGetsockname;
+    LPGetsockopt	pGetsockopt;
+    LPInetAddr		pInetAddr;
+    LPInetNtoa		pInetNtoa;
+    LPListen		pListen;
+    LPRecv		pRecv;
+    LPRecvfrom		pRecvfrom;
+    LPSelect		pSelect;
+    LPSend		pSend;
+    LPSendto		pSendto;
+    LPSethostent	pSethostent;
+    LPSetnetent		pSetnetent;
+    LPSetprotoent	pSetprotoent;
+    LPSetservent	pSetservent;
+    LPSetsockopt	pSetsockopt;
+    LPShutdown		pShutdown;
+    LPSocket		pSocket;
+    LPSocketpair	pSocketpair;
+#ifdef WIN32
+    LPClosesocket	pClosesocket;
+#endif
+};
+
+struct IPerlSockInfo
+{
+    unsigned long	nCount;	    /* number of entries expected */
+    struct IPerlSock	perlSockList;
+};
+
+#define PerlSock_htonl(x)						\
+	(*PL_Sock->pHtonl)(PL_Sock, x)
+#define PerlSock_htons(x)						\
+	(*PL_Sock->pHtons)(PL_Sock, x)
+#define PerlSock_ntohl(x)						\
+	(*PL_Sock->pNtohl)(PL_Sock, x)
+#define PerlSock_ntohs(x)						\
+	(*PL_Sock->pNtohs)(PL_Sock, x)
+#define PerlSock_accept(s, a, l)					\
+	(*PL_Sock->pAccept)(PL_Sock, s, a, l)
+#define PerlSock_bind(s, n, l)						\
+	(*PL_Sock->pBind)(PL_Sock, s, n, l)
+#define PerlSock_connect(s, n, l)					\
+	(*PL_Sock->pConnect)(PL_Sock, s, n, l)
+#define PerlSock_endhostent()						\
+	(*PL_Sock->pEndhostent)(PL_Sock)
+#define PerlSock_endnetent()						\
+	(*PL_Sock->pEndnetent)(PL_Sock)
+#define PerlSock_endprotoent()						\
+	(*PL_Sock->pEndprotoent)(PL_Sock)
+#define PerlSock_endservent()						\
+	(*PL_Sock->pEndservent)(PL_Sock)
+#define PerlSock_gethostbyaddr(a, l, t)					\
+	(*PL_Sock->pGethostbyaddr)(PL_Sock, a, l, t)
+#define PerlSock_gethostbyname(n)					\
+	(*PL_Sock->pGethostbyname)(PL_Sock, n)
+#define PerlSock_gethostent()						\
+	(*PL_Sock->pGethostent)(PL_Sock)
+#define PerlSock_gethostname(n, l)					\
+	(*PL_Sock->pGethostname)(PL_Sock, n, l)
+#define PerlSock_getnetbyaddr(n, t)					\
+	(*PL_Sock->pGetnetbyaddr)(PL_Sock, n, t)
+#define PerlSock_getnetbyname(c)					\
+	(*PL_Sock->pGetnetbyname)(PL_Sock, c)
+#define PerlSock_getnetent()						\
+	(*PL_Sock->pGetnetent)(PL_Sock)
+#define PerlSock_getpeername(s, n, l)					\
+	(*PL_Sock->pGetpeername)(PL_Sock, s, n, l)
+#define PerlSock_getprotobyname(n)					\
+	(*PL_Sock->pGetprotobyname)(PL_Sock, n)
+#define PerlSock_getprotobynumber(n)					\
+	(*PL_Sock->pGetprotobynumber)(PL_Sock, n)
+#define PerlSock_getprotoent()						\
+	(*PL_Sock->pGetprotoent)(PL_Sock)
+#define PerlSock_getservbyname(n, p)					\
+	(*PL_Sock->pGetservbyname)(PL_Sock, n, p)
+#define PerlSock_getservbyport(port, p)					\
+	(*PL_Sock->pGetservbyport)(PL_Sock, port, p)
+#define PerlSock_getservent()						\
+	(*PL_Sock->pGetservent)(PL_Sock)
+#define PerlSock_getsockname(s, n, l)					\
+	(*PL_Sock->pGetsockname)(PL_Sock, s, n, l)
+#define PerlSock_getsockopt(s,l,n,v,i)					\
+	(*PL_Sock->pGetsockopt)(PL_Sock, s, l, n, v, i)
+#define PerlSock_inet_addr(c)						\
+	(*PL_Sock->pInetAddr)(PL_Sock, c)
+#define PerlSock_inet_ntoa(i)						\
+	(*PL_Sock->pInetNtoa)(PL_Sock, i)
+#define PerlSock_listen(s, b)						\
+	(*PL_Sock->pListen)(PL_Sock, s, b)
+#define PerlSock_recv(s, b, l, f)					\
+	(*PL_Sock->pRecv)(PL_Sock, s, b, l, f)
+#define PerlSock_recvfrom(s,b,l,f,from,fromlen)				\
+	(*PL_Sock->pRecvfrom)(PL_Sock, s, b, l, f, from, fromlen)
+#define PerlSock_select(n, r, w, e, t)					\
+	(*PL_Sock->pSelect)(PL_Sock, n, (char*)r, (char*)w, (char*)e, t)
+#define PerlSock_send(s, b, l, f)					\
+	(*PL_Sock->pSend)(PL_Sock, s, b, l, f)
+#define PerlSock_sendto(s, b, l, f, t, tlen)				\
+	(*PL_Sock->pSendto)(PL_Sock, s, b, l, f, t, tlen)
+#define PerlSock_sethostent(f)						\
+	(*PL_Sock->pSethostent)(PL_Sock, f)
+#define PerlSock_setnetent(f)						\
+	(*PL_Sock->pSetnetent)(PL_Sock, f)
+#define PerlSock_setprotoent(f)						\
+	(*PL_Sock->pSetprotoent)(PL_Sock, f)
+#define PerlSock_setservent(f)						\
+	(*PL_Sock->pSetservent)(PL_Sock, f)
+#define PerlSock_setsockopt(s, l, n, v, len)				\
+	(*PL_Sock->pSetsockopt)(PL_Sock, s, l, n, v, len)
+#define PerlSock_shutdown(s, h)						\
+	(*PL_Sock->pShutdown)(PL_Sock, s, h)
+#define PerlSock_socket(a, t, p)					\
+	(*PL_Sock->pSocket)(PL_Sock, a, t, p)
+#define PerlSock_socketpair(a, t, p, f)					\
+	(*PL_Sock->pSocketpair)(PL_Sock, a, t, p, f)
+
+#ifdef WIN32
+#define	PerlSock_closesocket(s)						\
+	(*PL_Sock->pClosesocket)(PL_Sock, s)
+#endif
+
+#else	/* PERL_IMPLICIT_SYS */
+
+#define PerlSock_htonl(x)		htonl(x)
+#define PerlSock_htons(x)		htons(x)
+#define PerlSock_ntohl(x)		ntohl(x)
+#define PerlSock_ntohs(x)		ntohs(x)
+#define PerlSock_accept(s, a, l)	accept(s, a, l)
+#define PerlSock_bind(s, n, l)		bind(s, n, l)
+#define PerlSock_connect(s, n, l)	connect(s, n, l)
+
+#define PerlSock_gethostbyaddr(a, l, t)	gethostbyaddr(a, l, t)
+#define PerlSock_gethostbyname(n)	gethostbyname(n)
+#define PerlSock_gethostent		gethostent
+#define PerlSock_endhostent		endhostent
+#define PerlSock_gethostname(n, l)	gethostname(n, l)
+
+#define PerlSock_getnetbyaddr(n, t)	getnetbyaddr(n, t)
+#define PerlSock_getnetbyname(n)	getnetbyname(n)
+#define PerlSock_getnetent		getnetent
+#define PerlSock_endnetent		endnetent
+#define PerlSock_getpeername(s, n, l)	getpeername(s, n, l)
+
+#define PerlSock_getprotobyname(n)	getprotobyname(n)
+#define PerlSock_getprotobynumber(n)	getprotobynumber(n)
+#define PerlSock_getprotoent		getprotoent
+#define PerlSock_endprotoent		endprotoent
+
+#define PerlSock_getservbyname(n, p)	getservbyname(n, p)
+#define PerlSock_getservbyport(port, p)	getservbyport(port, p)
+#define PerlSock_getservent		getservent
+#define PerlSock_endservent		endservent
+
+#define PerlSock_getsockname(s, n, l)	getsockname(s, n, l)
+#define PerlSock_getsockopt(s,l,n,v,i)	getsockopt(s, l, n, v, i)
+#define PerlSock_inet_addr(c)		inet_addr(c)
+#define PerlSock_inet_ntoa(i)		inet_ntoa(i)
+#define PerlSock_listen(s, b)		listen(s, b)
+#define PerlSock_recv(s, b, l, f)	recv(s, b, l, f)
+#define PerlSock_recvfrom(s, b, l, f, from, fromlen)			\
+	recvfrom(s, b, l, f, from, fromlen)
+#define PerlSock_select(n, r, w, e, t)	select(n, r, w, e, t)
+#define PerlSock_send(s, b, l, f)	send(s, b, l, f)
+#define PerlSock_sendto(s, b, l, f, t, tlen)				\
+	sendto(s, b, l, f, t, tlen)
+#define PerlSock_sethostent(f)		sethostent(f)
+#define PerlSock_setnetent(f)		setnetent(f)
+#define PerlSock_setprotoent(f)		setprotoent(f)
+#define PerlSock_setservent(f)		setservent(f)
+#define PerlSock_setsockopt(s, l, n, v, len)				\
+	setsockopt(s, l, n, v, len)
+#define PerlSock_shutdown(s, h)		shutdown(s, h)
+#define PerlSock_socket(a, t, p)	socket(a, t, p)
+#define PerlSock_socketpair(a, t, p, f)	socketpair(a, t, p, f)
+
+#ifdef WIN32
+#define PerlSock_closesocket(s)		closesocket(s)
+#endif
+
+#endif	/* PERL_IMPLICIT_SYS */
+
+#endif	/* __Inc__IPerl___ */
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/keywords.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/keywords.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/keywords.h	(revision 14489)
@@ -0,0 +1,262 @@
+/* -*- buffer-read-only: t -*-
+ *
+ *    keywords.h
+ *
+ *    Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2005,
+ *    2006, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ *  This file is built by keywords.pl from its data.  Any changes made here
+ *  will be lost!
+ */
+#define KEY_NULL		0
+#define KEY___FILE__		1
+#define KEY___LINE__		2
+#define KEY___PACKAGE__		3
+#define KEY___DATA__		4
+#define KEY___END__		5
+#define KEY_AUTOLOAD		6
+#define KEY_BEGIN		7
+#define KEY_CORE		8
+#define KEY_DESTROY		9
+#define KEY_END			10
+#define KEY_INIT		11
+#define KEY_CHECK		12
+#define KEY_abs			13
+#define KEY_accept		14
+#define KEY_alarm		15
+#define KEY_and			16
+#define KEY_atan2		17
+#define KEY_bind		18
+#define KEY_binmode		19
+#define KEY_bless		20
+#define KEY_caller		21
+#define KEY_chdir		22
+#define KEY_chmod		23
+#define KEY_chomp		24
+#define KEY_chop		25
+#define KEY_chown		26
+#define KEY_chr			27
+#define KEY_chroot		28
+#define KEY_close		29
+#define KEY_closedir		30
+#define KEY_cmp			31
+#define KEY_connect		32
+#define KEY_continue		33
+#define KEY_cos			34
+#define KEY_crypt		35
+#define KEY_dbmclose		36
+#define KEY_dbmopen		37
+#define KEY_defined		38
+#define KEY_delete		39
+#define KEY_die			40
+#define KEY_do			41
+#define KEY_dump		42
+#define KEY_each		43
+#define KEY_else		44
+#define KEY_elsif		45
+#define KEY_endgrent		46
+#define KEY_endhostent		47
+#define KEY_endnetent		48
+#define KEY_endprotoent		49
+#define KEY_endpwent		50
+#define KEY_endservent		51
+#define KEY_eof			52
+#define KEY_eq			53
+#define KEY_eval		54
+#define KEY_exec		55
+#define KEY_exists		56
+#define KEY_exit		57
+#define KEY_exp			58
+#define KEY_fcntl		59
+#define KEY_fileno		60
+#define KEY_flock		61
+#define KEY_for			62
+#define KEY_foreach		63
+#define KEY_fork		64
+#define KEY_format		65
+#define KEY_formline		66
+#define KEY_ge			67
+#define KEY_getc		68
+#define KEY_getgrent		69
+#define KEY_getgrgid		70
+#define KEY_getgrnam		71
+#define KEY_gethostbyaddr	72
+#define KEY_gethostbyname	73
+#define KEY_gethostent		74
+#define KEY_getlogin		75
+#define KEY_getnetbyaddr	76
+#define KEY_getnetbyname	77
+#define KEY_getnetent		78
+#define KEY_getpeername		79
+#define KEY_getpgrp		80
+#define KEY_getppid		81
+#define KEY_getpriority		82
+#define KEY_getprotobyname	83
+#define KEY_getprotobynumber	84
+#define KEY_getprotoent		85
+#define KEY_getpwent		86
+#define KEY_getpwnam		87
+#define KEY_getpwuid		88
+#define KEY_getservbyname	89
+#define KEY_getservbyport	90
+#define KEY_getservent		91
+#define KEY_getsockname		92
+#define KEY_getsockopt		93
+#define KEY_glob		94
+#define KEY_gmtime		95
+#define KEY_goto		96
+#define KEY_grep		97
+#define KEY_gt			98
+#define KEY_hex			99
+#define KEY_if			100
+#define KEY_index		101
+#define KEY_int			102
+#define KEY_ioctl		103
+#define KEY_join		104
+#define KEY_keys		105
+#define KEY_kill		106
+#define KEY_last		107
+#define KEY_lc			108
+#define KEY_lcfirst		109
+#define KEY_le			110
+#define KEY_length		111
+#define KEY_link		112
+#define KEY_listen		113
+#define KEY_local		114
+#define KEY_localtime		115
+#define KEY_lock		116
+#define KEY_log			117
+#define KEY_lstat		118
+#define KEY_lt			119
+#define KEY_m			120
+#define KEY_map			121
+#define KEY_mkdir		122
+#define KEY_msgctl		123
+#define KEY_msgget		124
+#define KEY_msgrcv		125
+#define KEY_msgsnd		126
+#define KEY_my			127
+#define KEY_ne			128
+#define KEY_next		129
+#define KEY_no			130
+#define KEY_not			131
+#define KEY_oct			132
+#define KEY_open		133
+#define KEY_opendir		134
+#define KEY_or			135
+#define KEY_ord			136
+#define KEY_our			137
+#define KEY_pack		138
+#define KEY_package		139
+#define KEY_pipe		140
+#define KEY_pop			141
+#define KEY_pos			142
+#define KEY_print		143
+#define KEY_printf		144
+#define KEY_prototype		145
+#define KEY_push		146
+#define KEY_q			147
+#define KEY_qq			148
+#define KEY_qr			149
+#define KEY_quotemeta		150
+#define KEY_qw			151
+#define KEY_qx			152
+#define KEY_rand		153
+#define KEY_read		154
+#define KEY_readdir		155
+#define KEY_readline		156
+#define KEY_readlink		157
+#define KEY_readpipe		158
+#define KEY_recv		159
+#define KEY_redo		160
+#define KEY_ref			161
+#define KEY_rename		162
+#define KEY_require		163
+#define KEY_reset		164
+#define KEY_return		165
+#define KEY_reverse		166
+#define KEY_rewinddir		167
+#define KEY_rindex		168
+#define KEY_rmdir		169
+#define KEY_s			170
+#define KEY_scalar		171
+#define KEY_seek		172
+#define KEY_seekdir		173
+#define KEY_select		174
+#define KEY_semctl		175
+#define KEY_semget		176
+#define KEY_semop		177
+#define KEY_send		178
+#define KEY_setgrent		179
+#define KEY_sethostent		180
+#define KEY_setnetent		181
+#define KEY_setpgrp		182
+#define KEY_setpriority		183
+#define KEY_setprotoent		184
+#define KEY_setpwent		185
+#define KEY_setservent		186
+#define KEY_setsockopt		187
+#define KEY_shift		188
+#define KEY_shmctl		189
+#define KEY_shmget		190
+#define KEY_shmread		191
+#define KEY_shmwrite		192
+#define KEY_shutdown		193
+#define KEY_sin			194
+#define KEY_sleep		195
+#define KEY_socket		196
+#define KEY_socketpair		197
+#define KEY_sort		198
+#define KEY_splice		199
+#define KEY_split		200
+#define KEY_sprintf		201
+#define KEY_sqrt		202
+#define KEY_srand		203
+#define KEY_stat		204
+#define KEY_study		205
+#define KEY_sub			206
+#define KEY_substr		207
+#define KEY_symlink		208
+#define KEY_syscall		209
+#define KEY_sysopen		210
+#define KEY_sysread		211
+#define KEY_sysseek		212
+#define KEY_system		213
+#define KEY_syswrite		214
+#define KEY_tell		215
+#define KEY_telldir		216
+#define KEY_tie			217
+#define KEY_tied		218
+#define KEY_time		219
+#define KEY_times		220
+#define KEY_tr			221
+#define KEY_truncate		222
+#define KEY_uc			223
+#define KEY_ucfirst		224
+#define KEY_umask		225
+#define KEY_undef		226
+#define KEY_unless		227
+#define KEY_unlink		228
+#define KEY_unpack		229
+#define KEY_unshift		230
+#define KEY_untie		231
+#define KEY_until		232
+#define KEY_use			233
+#define KEY_utime		234
+#define KEY_values		235
+#define KEY_vec			236
+#define KEY_wait		237
+#define KEY_waitpid		238
+#define KEY_wantarray		239
+#define KEY_warn		240
+#define KEY_while		241
+#define KEY_write		242
+#define KEY_x			243
+#define KEY_xor			244
+#define KEY_y			245
+
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/malloc_ctl.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/malloc_ctl.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/malloc_ctl.h	(revision 14489)
@@ -0,0 +1,64 @@
+#ifndef MALLOC_CTL_H
+#  define MALLOC_CTL_H
+
+struct perl_mstats {
+    UV *nfree;
+    UV *ntotal;
+    IV topbucket, topbucket_ev, topbucket_odd, totfree, total, total_chain;
+    IV total_sbrk, sbrks, sbrk_good, sbrk_slack, start_slack, sbrked_remains;
+    IV minbucket;
+    /* Level 1 info */
+    UV *bucket_mem_size;
+    UV *bucket_available_size;
+    UV nbuckets;
+};
+typedef struct perl_mstats perl_mstats_t;
+
+START_EXTERN_C
+Malloc_t Perl_malloc (MEM_SIZE nbytes);
+Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size);
+Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes);
+/* 'mfree' rather than 'free', since there is already a 'perl_free'
+ * that causes clashes with case-insensitive linkers */
+Free_t   Perl_mfree (Malloc_t where);
+END_EXTERN_C
+
+#ifndef NO_MALLOC_DYNAMIC_CFG
+
+/* IV configuration data */
+enum {
+  MallocCfg_FIRST_SBRK,
+  MallocCfg_MIN_SBRK,
+  MallocCfg_MIN_SBRK_FRAC1000,
+  MallocCfg_SBRK_ALLOW_FAILURES,
+  MallocCfg_SBRK_FAILURE_PRICE,
+  MallocCfg_sbrk_goodness,
+
+  MallocCfg_filldead,
+  MallocCfg_fillalive,
+  MallocCfg_fillcheck,
+
+  MallocCfg_skip_cfg_env,
+  MallocCfg_cfg_env_read,
+
+  MallocCfg_emergency_buffer_size,
+  MallocCfg_emergency_buffer_last_req,
+
+  MallocCfg_emergency_buffer_prepared_size,
+
+  MallocCfg_last
+};
+/* char* configuration data */
+enum {
+  MallocCfgP_emergency_buffer,
+  MallocCfgP_emergency_buffer_prepared,
+  MallocCfgP_last
+};
+START_EXTERN_C
+extern IV *MallocCfg_ptr;
+extern char **MallocCfgP_ptr;
+END_EXTERN_C
+
+#endif
+
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/mg.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/mg.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/mg.h	(revision 14489)
@@ -0,0 +1,61 @@
+/*    mg.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999,
+ *    2000, 2002, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifdef STRUCT_MGVTBL_DEFINITION
+STRUCT_MGVTBL_DEFINITION;
+#else
+struct mgvtbl {
+    int		(CPERLscope(*svt_get))	(pTHX_ SV *sv, MAGIC* mg);
+    int		(CPERLscope(*svt_set))	(pTHX_ SV *sv, MAGIC* mg);
+    U32		(CPERLscope(*svt_len))	(pTHX_ SV *sv, MAGIC* mg);
+    int		(CPERLscope(*svt_clear))(pTHX_ SV *sv, MAGIC* mg);
+    int		(CPERLscope(*svt_free))	(pTHX_ SV *sv, MAGIC* mg);
+    int		(CPERLscope(*svt_copy))	(pTHX_ SV *sv, MAGIC* mg,
+    					SV *nsv, const char *name, int namlen);
+    int		(CPERLscope(*svt_dup))	(pTHX_ MAGIC *mg, CLONE_PARAMS *param);
+};
+#endif
+
+struct magic {
+    MAGIC*	mg_moremagic;
+    MGVTBL* mg_virtual;	/* pointer to magic functions */
+    U16		mg_private;
+    char	mg_type;
+    U8		mg_flags;
+    SV*		mg_obj;
+    char*	mg_ptr;
+    I32		mg_len;
+};
+
+#define MGf_TAINTEDDIR 1        /* PERL_MAGIC_envelem only */
+#define MGf_MINMATCH   1        /* PERL_MAGIC_regex_global only */
+#define MGf_REFCOUNTED 2
+#define MGf_GSKIP      4
+#define MGf_COPY       8
+#define MGf_DUP        16
+
+#define MgTAINTEDDIR(mg)	(mg->mg_flags & MGf_TAINTEDDIR)
+#define MgTAINTEDDIR_on(mg)	(mg->mg_flags |= MGf_TAINTEDDIR)
+#define MgTAINTEDDIR_off(mg)	(mg->mg_flags &= ~MGf_TAINTEDDIR)
+
+#define MgPV(mg,lp)		((((int)(lp = (mg)->mg_len)) == HEf_SVKEY) ?   \
+				 SvPV((SV*)((mg)->mg_ptr),lp) :		\
+				 (mg)->mg_ptr)
+#define MgPV_const(mg,lp)	((((int)(lp = (mg)->mg_len)) == HEf_SVKEY) ? \
+				 SvPV_const((SV*)((mg)->mg_ptr),lp) :        \
+				 (const char*)(mg)->mg_ptr)
+#define MgPV_nolen_const(mg)	(((((int)(mg)->mg_len)) == HEf_SVKEY) ?   \
+				 SvPV_nolen_const((SV*)((mg)->mg_ptr)) :  \
+				 (const char*)(mg)->mg_ptr)
+
+#define SvTIED_mg(sv,how) \
+    (SvRMAGICAL(sv) ? mg_find((sv),(how)) : Null(MAGIC*))
+#define SvTIED_obj(sv,mg) \
+    ((mg)->mg_obj ? (mg)->mg_obj : sv_2mortal(newRV(sv)))
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/netdb.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/netdb.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/netdb.h	(revision 14489)
@@ -0,0 +1,12 @@
+/* netdb.h */
+
+/* djl */
+/* Provide UNIX compatibility */
+
+
+#ifndef  _INC_NETDB
+#define  _INC_NETDB
+
+#include <sys/socket.h>
+
+#endif /* _INC_NETDB */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/nostdio.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/nostdio.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/nostdio.h	(revision 14489)
@@ -0,0 +1,126 @@
+/*    nostdio.h
+ *
+ *    Copyright (C) 1996, 2000, 2001, 2005, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * Strong denial of stdio - make all stdio calls (we can think of) errors
+ */
+/* This is a 1st attempt to stop other include files pulling
+   in real <stdio.h>.
+   A more ambitious set of possible symbols can be found in
+   sfio.h (inside an _cplusplus gard).
+   It is completely pointless as we have already included it ourselves.
+*/
+
+#if !defined(_STDIO_H) && !defined(FILE) && !defined(_STDIO_INCLUDED) && !defined(__STDIO_LOADED)
+#define _STDIO_H
+#define _STDIO_INCLUDED
+#define __STDIO_LOADED
+struct _FILE;
+#define FILE struct _FILE
+#endif
+
+#define _CANNOT "CANNOT"
+
+#undef clearerr
+#undef fclose
+#undef fdopen
+#undef feof
+#undef ferror
+#undef fflush
+#undef fgetc
+#undef fgetpos
+#undef fgets
+#undef fileno
+#undef flockfile
+#undef fopen
+#undef fprintf
+#undef fputc
+#undef fputs
+#undef fread
+#undef freopen
+#undef fscanf
+#undef fseek
+#undef fsetpos
+#undef ftell
+#undef ftrylockfile
+#undef funlockfile
+#undef fwrite
+#undef getc
+#undef getc_unlocked
+#undef getw
+#undef pclose
+#undef popen
+#undef putc
+#undef putc_unlocked
+#undef putw
+#undef rewind
+#undef setbuf
+#undef setvbuf
+#undef stderr
+#undef stdin
+#undef stdout
+#undef tmpfile
+#undef ungetc
+#undef vfprintf
+#undef printf
+
+#define fprintf    _CANNOT _fprintf_
+#define printf     _CANNOT _printf_
+#define stdin      _CANNOT _stdin_
+#define stdout     _CANNOT _stdout_
+#define stderr     _CANNOT _stderr_
+#ifndef OS2
+#define tmpfile()  _CANNOT _tmpfile_
+#endif
+#define fclose(f)  _CANNOT _fclose_
+#define fflush(f)  _CANNOT _fflush_
+#define fopen(p,m)  _CANNOT _fopen_
+#define freopen(p,m,f)  _CANNOT _freopen_
+#define setbuf(f,b)  _CANNOT _setbuf_
+#define setvbuf(f,b,x,s)  _CANNOT _setvbuf_
+#define fscanf  _CANNOT _fscanf_
+#define vfprintf(f,fmt,a)  _CANNOT _vfprintf_
+#define fgetc(f)  _CANNOT _fgetc_
+#define fgets(s,n,f)  _CANNOT _fgets_
+#define fputc(c,f)  _CANNOT _fputc_
+#define fputs(s,f)  _CANNOT _fputs_
+#define getc(f)  _CANNOT _getc_
+#define putc(c,f)  _CANNOT _putc_
+#ifndef OS2
+#define ungetc(c,f)  _CANNOT _ungetc_
+#endif
+#define fread(b,s,c,f)  _CANNOT _fread_
+#define fwrite(b,s,c,f)  _CANNOT _fwrite_
+#define fgetpos(f,p)  _CANNOT _fgetpos_
+#define fseek(f,o,w)  _CANNOT _fseek_
+#define fsetpos(f,p)  _CANNOT _fsetpos_
+#define ftell(f)  _CANNOT _ftell_
+#define rewind(f)  _CANNOT _rewind_
+#define clearerr(f)  _CANNOT _clearerr_
+#define feof(f)  _CANNOT _feof_
+#define ferror(f)  _CANNOT _ferror_
+#define __filbuf(f)  _CANNOT __filbuf_
+#define __flsbuf(c,f)  _CANNOT __flsbuf_
+#define _filbuf(f)  _CANNOT _filbuf_
+#define _flsbuf(c,f)  _CANNOT _flsbuf_
+#define fdopen(fd,p)  _CANNOT _fdopen_
+#define fileno(f)  _CANNOT _fileno_
+#if defined(SFIO_VERSION) && SFIO_VERSION < 20000101L
+#define flockfile(f)  _CANNOT _flockfile_
+#define ftrylockfile(f)  _CANNOT _ftrylockfile_
+#define funlockfile(f)  _CANNOT _funlockfile_
+#endif
+#define getc_unlocked(f)  _CANNOT _getc_unlocked_
+#define putc_unlocked(c,f)  _CANNOT _putc_unlocked_
+#define popen(c,m)  _CANNOT _popen_
+#define getw(f)  _CANNOT _getw_
+#define putw(v,f)  _CANNOT _putw_
+#ifndef OS2
+#define pclose(f)  _CANNOT _pclose_
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/op.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/op.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/op.h	(revision 14489)
@@ -0,0 +1,511 @@
+/*    op.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * The fields of BASEOP are:
+ *	op_next		Pointer to next ppcode to execute after this one.
+ *			(Top level pre-grafted op points to first op,
+ *			but this is replaced when op is grafted in, when
+ *			this op will point to the real next op, and the new
+ *			parent takes over role of remembering starting op.)
+ *	op_ppaddr	Pointer to current ppcode's function.
+ *	op_type		The type of the operation.
+ *	op_flags	Flags common to all operations.  See OPf_* below.
+ *	op_private	Flags peculiar to a particular operation (BUT,
+ *			by default, set to the number of children until
+ *			the operation is privatized by a check routine,
+ *			which may or may not check number of children).
+ */
+
+#ifdef DEBUGGING_OPS
+#define OPCODE opcode
+#else
+#define OPCODE U16
+#endif
+
+#ifdef BASEOP_DEFINITION
+#define BASEOP BASEOP_DEFINITION
+#else
+#define BASEOP				\
+    OP*		op_next;		\
+    OP*		op_sibling;		\
+    OP*		(CPERLscope(*op_ppaddr))(pTHX);		\
+    PADOFFSET	op_targ;		\
+    OPCODE	op_type;		\
+    U16		op_seq;			\
+    U8		op_flags;		\
+    U8		op_private;
+#endif
+
+#define OP_GIMME(op,dfl) \
+	(((op)->op_flags & OPf_WANT) == OPf_WANT_VOID   ? G_VOID   : \
+	 ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \
+	 ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST   ? G_ARRAY   : \
+	 dfl)
+
+/*
+=head1 "Gimme" Values
+
+=for apidoc Amn|U32|GIMME_V
+The XSUB-writer's equivalent to Perl's C<wantarray>.  Returns C<G_VOID>,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
+respectively.
+
+=for apidoc Amn|U32|GIMME
+A backward-compatible version of C<GIMME_V> which can only return
+C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
+Deprecated.  Use C<GIMME_V> instead.
+
+=cut
+*/
+
+#define GIMME_V		OP_GIMME(PL_op, block_gimme())
+
+/* Public flags */
+
+#define OPf_WANT	3	/* Mask for "want" bits: */
+#define  OPf_WANT_VOID	 1	/*   Want nothing */
+#define  OPf_WANT_SCALAR 2	/*   Want single value */
+#define  OPf_WANT_LIST	 3	/*   Want list of any length */
+#define OPf_KIDS	4	/* There is a firstborn child. */
+#define OPf_PARENS	8	/* This operator was parenthesized. */
+				/*  (Or block needs explicit scope entry.) */
+#define OPf_REF		16	/* Certified reference. */
+				/*  (Return container, not containee). */
+#define OPf_MOD		32	/* Will modify (lvalue). */
+#define OPf_STACKED	64	/* Some arg is arriving on the stack. */
+#define OPf_SPECIAL	128	/* Do something weird for this op: */
+				/*  On local LVAL, don't init local value. */
+				/*  On OP_SORT, subroutine is inlined. */
+				/*  On OP_NOT, inversion was implicit. */
+				/*  On OP_LEAVE, don't restore curpm. */
+				/*  On truncate, we truncate filehandle */
+				/*  On control verbs, we saw no label */
+				/*  On flipflop, we saw ... instead of .. */
+				/*  On UNOPs, saw bare parens, e.g. eof(). */
+				/*  On OP_ENTERSUB || OP_NULL, saw a "do". */
+				/*  On OP_EXISTS, treat av as av, not avhv.  */
+				/*  On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
+				/*  On OP_ENTERITER, loop var is per-thread */
+				/*  On pushre, re is /\s+/ imp. by split " " */
+				/*  On regcomp, "use re 'eval'" was in scope */
+				/*  On OP_READLINE, was <$filehandle> */
+				/*  On RV2[ACGHS]V, don't create GV--in
+				    defined()*/
+				/*  On OP_DBSTATE, indicates breakpoint
+				 *    (runtime property) */
+				/*  On OP_AELEMFAST, indiciates pad var */
+
+/* old names; don't use in new code, but don't break them, either */
+#define OPf_LIST	OPf_WANT_LIST
+#define OPf_KNOW	OPf_WANT
+
+#define GIMME \
+	  (PL_op->op_flags & OPf_WANT					\
+	   ? ((PL_op->op_flags & OPf_WANT) == OPf_WANT_LIST		\
+	      ? G_ARRAY							\
+	      : G_SCALAR)						\
+	   : dowantarray())
+
+/* NOTE: OP_NEXTSTATE, OP_DBSTATE, and OP_SETSTATE (i.e. COPs) carry lower
+ * bits of PL_hints in op_private */
+
+/* Private for lvalues */
+#define OPpLVAL_INTRO	128	/* Lvalue must be localized or lvalue sub */
+
+/* Private for OP_LEAVE, OP_LEAVESUB, OP_LEAVESUBLV and OP_LEAVEWRITE */
+#define OPpREFCOUNTED		64	/* op_targ carries a refcount */
+
+/* Private for OP_AASSIGN */
+#define OPpASSIGN_COMMON	64	/* Left & right have syms in common. */
+#define OPpASSIGN_HASH		32	/* Assigning to possible pseudohash. */
+
+/* Private for OP_SASSIGN */
+#define OPpASSIGN_BACKWARDS	64	/* Left & right switched. */
+
+/* Private for OP_MATCH and OP_SUBST{,CONST} */
+#define OPpRUNTIME		64	/* Pattern coming in on the stack */
+
+/* Private for OP_TRANS */
+#define OPpTRANS_FROM_UTF	1
+#define OPpTRANS_TO_UTF		2
+#define OPpTRANS_IDENTICAL	4	/* right side is same as left */
+#define OPpTRANS_SQUASH		8
+#define OPpTRANS_DELETE		16
+#define OPpTRANS_COMPLEMENT	32
+#define OPpTRANS_GROWS		64
+
+/* Private for OP_REPEAT */
+#define OPpREPEAT_DOLIST	64	/* List replication. */
+
+/* Private for OP_RV2GV, OP_RV2SV, OP_AELEM, OP_HELEM, OP_PADSV */
+#define OPpDEREF		(32|64)	/* autovivify: Want ref to something: */
+#define OPpDEREF_AV		32	/*   Want ref to AV. */
+#define OPpDEREF_HV		64	/*   Want ref to HV. */
+#define OPpDEREF_SV		(32|64)	/*   Want ref to SV. */
+  /* OP_ENTERSUB only */
+#define OPpENTERSUB_DB		16	/* Debug subroutine. */
+#define OPpENTERSUB_HASTARG	32	/* Called from OP tree. */
+#define OPpENTERSUB_NOMOD	64	/* Immune to mod() for :attrlist. */
+  /* OP_RV2CV only */
+#define OPpENTERSUB_AMPER	8	/* Used & form to call. */
+#define OPpENTERSUB_NOPAREN	128	/* bare sub call (without parens) */
+#define OPpENTERSUB_INARGS	4	/* Lval used as arg to a sub. */
+  /* OP_GV only */
+#define OPpEARLY_CV		32	/* foo() called before sub foo was parsed */
+  /* OP_?ELEM only */
+#define OPpLVAL_DEFER		16	/* Defer creation of array/hash elem */
+  /* OP_RV2?V, OP_GVSV, OP_ENTERITER only */
+#define OPpOUR_INTRO		16	/* Variable was in an our() */
+  /* OP_RV2[AH]V, OP_PAD[AH]V, OP_[AH]ELEM */
+#define OPpMAYBE_LVSUB		8	/* We might be an lvalue to return */
+  /* for OP_RV2?V, lower bits carry hints (currently only HINT_STRICT_REFS) */
+
+/* Private for OPs with TARGLEX */
+  /* (lower bits may carry MAXARG) */
+#define OPpTARGET_MY		16	/* Target is PADMY. */
+
+/* Private for OP_ENTERITER and OP_ITER */
+#define OPpITER_REVERSED	4	/* for (reverse ...) */
+
+/* Private for OP_CONST */
+#define	OPpCONST_SHORTCIRCUIT	4	/* eg the constant 5 in (5 || foo) */
+#define	OPpCONST_STRICT		8	/* bearword subject to strict 'subs' */
+#define OPpCONST_ENTERED	16	/* Has been entered as symbol. */
+#define OPpCONST_ARYBASE	32	/* Was a $[ translated to constant. */
+#define OPpCONST_BARE		64	/* Was a bare word (filehandle?). */
+#define OPpCONST_WARNING	128	/* Was a $^W translated to constant. */
+
+/* Private for OP_FLIP/FLOP */
+#define OPpFLIP_LINENUM		64	/* Range arg potentially a line num. */
+
+/* Private for OP_LIST */
+#define OPpLIST_GUESSED		64	/* Guessed that pushmark was needed. */
+
+/* Private for OP_DELETE */
+#define OPpSLICE		64	/* Operating on a list of keys */
+
+/* Private for OP_EXISTS */
+#define OPpEXISTS_SUB		64	/* Checking for &sub, not {} or [].  */
+
+/* Private for OP_SORT */
+#define OPpSORT_NUMERIC		1	/* Optimized away { $a <=> $b } */
+#define OPpSORT_INTEGER		2	/* Ditto while under "use integer" */
+#define OPpSORT_REVERSE		4	/* Reversed sort */
+#define OPpSORT_INPLACE		8	/* sort in-place; eg @a = sort @a */
+#define OPpSORT_DESCEND		16	/* Descending sort */
+/* Private for OP_THREADSV */
+#define OPpDONE_SVREF		64	/* Been through newSVREF once */
+
+/* Private for OP_OPEN and OP_BACKTICK */
+#define OPpOPEN_IN_RAW		16	/* binmode(F,":raw") on input fh */
+#define OPpOPEN_IN_CRLF		32	/* binmode(F,":crlf") on input fh */
+#define OPpOPEN_OUT_RAW		64	/* binmode(F,":raw") on output fh */
+#define OPpOPEN_OUT_CRLF	128	/* binmode(F,":crlf") on output fh */
+
+/* Private for OP_EXIT, HUSH also for OP_DIE */
+#define OPpHUSH_VMSISH		64	/* hush DCL exit msg vmsish mode*/
+#define OPpEXIT_VMSISH		128	/* exit(0) vs. exit(1) vmsish mode*/
+
+/* Private of OP_FTXXX */
+#define OPpFT_ACCESS		2	/* use filetest 'access' */
+#define OP_IS_FILETEST_ACCESS(op) 		\
+	(((op)->op_type) == OP_FTRREAD  ||	\
+	 ((op)->op_type) == OP_FTRWRITE ||	\
+	 ((op)->op_type) == OP_FTREXEC  ||	\
+	 ((op)->op_type) == OP_FTEREAD  ||	\
+	 ((op)->op_type) == OP_FTEWRITE ||	\
+	 ((op)->op_type) == OP_FTEEXEC)
+
+struct op {
+    BASEOP
+};
+
+struct unop {
+    BASEOP
+    OP *	op_first;
+};
+
+struct binop {
+    BASEOP
+    OP *	op_first;
+    OP *	op_last;
+};
+
+struct logop {
+    BASEOP
+    OP *	op_first;
+    OP *	op_other;
+};
+
+struct listop {
+    BASEOP
+    OP *	op_first;
+    OP *	op_last;
+};
+
+struct pmop {
+    BASEOP
+    OP *	op_first;
+    OP *	op_last;
+    OP *	op_pmreplroot; /* (type is really union {OP*,GV*,PADOFFSET}) */
+    OP *	op_pmreplstart;
+    PMOP *	op_pmnext;		/* list of all scanpats */
+#ifdef USE_ITHREADS
+    IV          op_pmoffset;
+#else
+    REGEXP *    op_pmregexp;            /* compiled expression */
+#endif
+    U32		op_pmflags;
+    U32		op_pmpermflags;
+    U8		op_pmdynflags;
+#ifdef USE_ITHREADS
+    char *	op_pmstashpv;
+#else
+    HV *	op_pmstash;
+#endif
+};
+
+#ifdef USE_ITHREADS
+#define PM_GETRE(o)     (INT2PTR(REGEXP*,SvIVX(PL_regex_pad[(o)->op_pmoffset])))
+#define PM_SETRE(o,r)   STMT_START { SV* sv = PL_regex_pad[(o)->op_pmoffset]; sv_setiv(sv, PTR2IV(r)); } STMT_END
+#define PM_GETRE_SAFE(o) (PL_regex_pad ? PM_GETRE(o) : (REGEXP*)0)
+#define PM_SETRE_SAFE(o,r) if (PL_regex_pad) PM_SETRE(o,r)
+#else
+#define PM_GETRE(o)     ((o)->op_pmregexp)
+#define PM_SETRE(o,r)   ((o)->op_pmregexp = (r))
+#define PM_GETRE_SAFE PM_GETRE
+#define PM_SETRE_SAFE PM_SETRE
+#endif
+
+#define PMdf_USED	0x01		/* pm has been used once already */
+#define PMdf_TAINTED	0x02		/* pm compiled from tainted pattern */
+#define PMdf_UTF8	0x04		/* pm compiled from utf8 data */
+#define PMdf_DYN_UTF8	0x08
+
+#define PMdf_CMP_UTF8	(PMdf_UTF8|PMdf_DYN_UTF8)
+
+#define PMf_RETAINT	0x0001		/* taint $1 etc. if target tainted */
+#define PMf_ONCE	0x0002		/* use pattern only once per reset */
+#define PMf_UNUSED	0x0004		/* free for use */
+#define PMf_MAYBE_CONST	0x0008		/* replacement contains variables */
+#define PMf_SKIPWHITE	0x0010		/* skip leading whitespace for split */
+#define PMf_WHITE	0x0020		/* pattern is \s+ */
+#define PMf_CONST	0x0040		/* subst replacement is constant */
+#define PMf_KEEP	0x0080		/* keep 1st runtime pattern forever */
+#define PMf_GLOBAL	0x0100		/* pattern had a g modifier */
+#define PMf_CONTINUE	0x0200		/* don't reset pos() if //g fails */
+#define PMf_EVAL	0x0400		/* evaluating replacement as expr */
+#define PMf_LOCALE	0x0800		/* use locale for character types */
+#define PMf_MULTILINE	0x1000		/* assume multiple lines */
+#define PMf_SINGLELINE	0x2000		/* assume single line */
+#define PMf_FOLD	0x4000		/* case insensitivity */
+#define PMf_EXTENDED	0x8000		/* chuck embedded whitespace */
+
+/* mask of bits stored in regexp->reganch */
+#define PMf_COMPILETIME	(PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED)
+
+#ifdef USE_ITHREADS
+
+#  define PmopSTASHPV(o)	((o)->op_pmstashpv)
+#  define PmopSTASHPV_set(o,pv)	(PmopSTASHPV(o) = savesharedpv(pv))
+#  define PmopSTASH(o)		(PmopSTASHPV(o) \
+				 ? gv_stashpv(PmopSTASHPV(o),GV_ADD) : Nullhv)
+#  define PmopSTASH_set(o,hv)	PmopSTASHPV_set(o, ((hv) ? HvNAME_get(hv) : Nullch))
+#  define PmopSTASH_free(o)	PerlMemShared_free(PmopSTASHPV(o))
+
+#else
+#  define PmopSTASH(o)		((o)->op_pmstash)
+#  define PmopSTASH_set(o,hv)	((o)->op_pmstash = (hv))
+#  define PmopSTASHPV(o)	(PmopSTASH(o) ? HvNAME_get(PmopSTASH(o)) : Nullch)
+   /* op_pmstash is not refcounted */
+#  define PmopSTASHPV_set(o,pv)	PmopSTASH_set((o), gv_stashpv(pv,GV_ADD))
+#  define PmopSTASH_free(o)    
+#endif
+
+struct svop {
+    BASEOP
+    SV *	op_sv;
+};
+
+struct padop {
+    BASEOP
+    PADOFFSET	op_padix;
+};
+
+struct pvop {
+    BASEOP
+    char *	op_pv;
+};
+
+struct loop {
+    BASEOP
+    OP *	op_first;
+    OP *	op_last;
+    OP *	op_redoop;
+    OP *	op_nextop;
+    OP *	op_lastop;
+};
+
+#define cUNOPx(o)	((UNOP*)o)
+#define cBINOPx(o)	((BINOP*)o)
+#define cLISTOPx(o)	((LISTOP*)o)
+#define cLOGOPx(o)	((LOGOP*)o)
+#define cPMOPx(o)	((PMOP*)o)
+#define cSVOPx(o)	((SVOP*)o)
+#define cPADOPx(o)	((PADOP*)o)
+#define cPVOPx(o)	((PVOP*)o)
+#define cCOPx(o)	((COP*)o)
+#define cLOOPx(o)	((LOOP*)o)
+
+#define cUNOP		cUNOPx(PL_op)
+#define cBINOP		cBINOPx(PL_op)
+#define cLISTOP		cLISTOPx(PL_op)
+#define cLOGOP		cLOGOPx(PL_op)
+#define cPMOP		cPMOPx(PL_op)
+#define cSVOP		cSVOPx(PL_op)
+#define cPADOP		cPADOPx(PL_op)
+#define cPVOP		cPVOPx(PL_op)
+#define cCOP		cCOPx(PL_op)
+#define cLOOP		cLOOPx(PL_op)
+
+#define cUNOPo		cUNOPx(o)
+#define cBINOPo		cBINOPx(o)
+#define cLISTOPo	cLISTOPx(o)
+#define cLOGOPo		cLOGOPx(o)
+#define cPMOPo		cPMOPx(o)
+#define cSVOPo		cSVOPx(o)
+#define cPADOPo		cPADOPx(o)
+#define cPVOPo		cPVOPx(o)
+#define cCOPo		cCOPx(o)
+#define cLOOPo		cLOOPx(o)
+
+#define kUNOP		cUNOPx(kid)
+#define kBINOP		cBINOPx(kid)
+#define kLISTOP		cLISTOPx(kid)
+#define kLOGOP		cLOGOPx(kid)
+#define kPMOP		cPMOPx(kid)
+#define kSVOP		cSVOPx(kid)
+#define kPADOP		cPADOPx(kid)
+#define kPVOP		cPVOPx(kid)
+#define kCOP		cCOPx(kid)
+#define kLOOP		cLOOPx(kid)
+
+
+#ifdef USE_ITHREADS
+#  define	cGVOPx_gv(o)	((GV*)PAD_SVl(cPADOPx(o)->op_padix))
+#  define	IS_PADGV(v)	(v && SvTYPE(v) == SVt_PVGV && GvIN_PAD(v))
+#  define	IS_PADCONST(v)	(v && SvREADONLY(v))
+#  define	cSVOPx_sv(v)	(cSVOPx(v)->op_sv \
+				 ? cSVOPx(v)->op_sv : PAD_SVl((v)->op_targ))
+#  define	cSVOPx_svp(v)	(cSVOPx(v)->op_sv \
+				 ? &cSVOPx(v)->op_sv : &PAD_SVl((v)->op_targ))
+#else
+#  define	cGVOPx_gv(o)	((GV*)cSVOPx(o)->op_sv)
+#  define	IS_PADGV(v)	FALSE
+#  define	IS_PADCONST(v)	FALSE
+#  define	cSVOPx_sv(v)	(cSVOPx(v)->op_sv)
+#  define	cSVOPx_svp(v)	(&cSVOPx(v)->op_sv)
+#endif
+
+#define	cGVOP_gv		cGVOPx_gv(PL_op)
+#define	cGVOPo_gv		cGVOPx_gv(o)
+#define	kGVOP_gv		cGVOPx_gv(kid)
+#define cSVOP_sv		cSVOPx_sv(PL_op)
+#define cSVOPo_sv		cSVOPx_sv(o)
+#define kSVOP_sv		cSVOPx_sv(kid)
+
+#define Nullop Null(OP*)
+
+/* Lowest byte-and-a-bit of PL_opargs */
+#define OA_MARK 1
+#define OA_FOLDCONST 2
+#define OA_RETSCALAR 4
+#define OA_TARGET 8
+#define OA_RETINTEGER 16
+#define OA_OTHERINT 32
+#define OA_DANGEROUS 64
+#define OA_DEFGV 128
+#define OA_TARGLEX 256
+
+/* The next 4 bits encode op class information */
+#define OCSHIFT 9
+
+#define OA_CLASS_MASK (15 << OCSHIFT)
+
+#define OA_BASEOP (0 << OCSHIFT)
+#define OA_UNOP (1 << OCSHIFT)
+#define OA_BINOP (2 << OCSHIFT)
+#define OA_LOGOP (3 << OCSHIFT)
+#define OA_LISTOP (4 << OCSHIFT)
+#define OA_PMOP (5 << OCSHIFT)
+#define OA_SVOP (6 << OCSHIFT)
+#define OA_PADOP (7 << OCSHIFT)
+#define OA_PVOP_OR_SVOP (8 << OCSHIFT)
+#define OA_LOOP (9 << OCSHIFT)
+#define OA_COP (10 << OCSHIFT)
+#define OA_BASEOP_OR_UNOP (11 << OCSHIFT)
+#define OA_FILESTATOP (12 << OCSHIFT)
+#define OA_LOOPEXOP (13 << OCSHIFT)
+
+#define OASHIFT 13
+
+/* Remaining nybbles of PL_opargs */
+#define OA_SCALAR 1
+#define OA_LIST 2
+#define OA_AVREF 3
+#define OA_HVREF 4
+#define OA_CVREF 5
+#define OA_FILEREF 6
+#define OA_SCALARREF 7
+#define OA_OPTIONAL 8
+
+#ifdef USE_ITHREADS
+#  define OP_REFCNT_INIT		MUTEX_INIT(&PL_op_mutex)
+#  ifdef PERL_CORE
+#    define OP_REFCNT_LOCK		MUTEX_LOCK(&PL_op_mutex)
+#    define OP_REFCNT_UNLOCK		MUTEX_UNLOCK(&PL_op_mutex)
+#  else
+#    define OP_REFCNT_LOCK		op_refcnt_lock()
+#    define OP_REFCNT_UNLOCK		op_refcnt_unlock()
+#  endif
+#  define OP_REFCNT_TERM		MUTEX_DESTROY(&PL_op_mutex)
+#else
+#  define OP_REFCNT_INIT		NOOP
+#  define OP_REFCNT_LOCK		NOOP
+#  define OP_REFCNT_UNLOCK		NOOP
+#  define OP_REFCNT_TERM		NOOP
+#endif
+
+#define OpREFCNT_set(o,n)		((o)->op_targ = (n))
+#define OpREFCNT_inc(o)			((o) ? (++(o)->op_targ, (o)) : Nullop)
+#define OpREFCNT_dec(o)			(--(o)->op_targ)
+
+/* flags used by Perl_load_module() */
+#define PERL_LOADMOD_DENY		0x1
+#define PERL_LOADMOD_NOIMPORT		0x2
+#define PERL_LOADMOD_IMPORT_OPS		0x4
+
+#ifdef USE_REENTRANT_API
+#include "reentr.h"
+#endif
+
+#if defined(PL_OP_SLAB_ALLOC)
+#define NewOp(m,var,c,type)	\
+	(var = (type *) Perl_Slab_Alloc(aTHX_ m,c*sizeof(type)))
+#define NewOpSz(m,var,size)	\
+	(var = (OP *) Perl_Slab_Alloc(aTHX_ m,size))
+#define FreeOp(p) Perl_Slab_Free(aTHX_ p)
+#else
+#define NewOp(m, var, c, type) Newxz(var, c, type)
+#define NewOpSz(m, var, size)	\
+	(var = (OP*)safemalloc(size), memzero(var, size))
+#define FreeOp(p) Safefree(p)
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/opcode.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/opcode.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/opcode.h	(revision 14489)
@@ -0,0 +1,1830 @@
+/* -*- buffer-read-only: t -*-
+ *
+ *    opcode.h
+ *
+ *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ *  This file is built by opcode.pl from its data.  Any changes made here
+ *  will be lost!
+ */
+
+#define Perl_pp_i_preinc Perl_pp_preinc
+#define Perl_pp_i_predec Perl_pp_predec
+#define Perl_pp_i_postinc Perl_pp_postinc
+#define Perl_pp_i_postdec Perl_pp_postdec
+
+
+START_EXTERN_C
+
+
+#define OP_NAME(o) ((o)->op_type == OP_CUSTOM ? custom_op_name(o) : \
+                    PL_op_name[(o)->op_type])
+#define OP_DESC(o) ((o)->op_type == OP_CUSTOM ? custom_op_desc(o) : \
+                    PL_op_desc[(o)->op_type])
+
+#ifndef DOINIT
+EXT char *PL_op_name[];
+#else
+EXT char *PL_op_name[] = {
+	"null",
+	"stub",
+	"scalar",
+	"pushmark",
+	"wantarray",
+	"const",
+	"gvsv",
+	"gv",
+	"gelem",
+	"padsv",
+	"padav",
+	"padhv",
+	"padany",
+	"pushre",
+	"rv2gv",
+	"rv2sv",
+	"av2arylen",
+	"rv2cv",
+	"anoncode",
+	"prototype",
+	"refgen",
+	"srefgen",
+	"ref",
+	"bless",
+	"backtick",
+	"glob",
+	"readline",
+	"rcatline",
+	"regcmaybe",
+	"regcreset",
+	"regcomp",
+	"match",
+	"qr",
+	"subst",
+	"substcont",
+	"trans",
+	"sassign",
+	"aassign",
+	"chop",
+	"schop",
+	"chomp",
+	"schomp",
+	"defined",
+	"undef",
+	"study",
+	"pos",
+	"preinc",
+	"i_preinc",
+	"predec",
+	"i_predec",
+	"postinc",
+	"i_postinc",
+	"postdec",
+	"i_postdec",
+	"pow",
+	"multiply",
+	"i_multiply",
+	"divide",
+	"i_divide",
+	"modulo",
+	"i_modulo",
+	"repeat",
+	"add",
+	"i_add",
+	"subtract",
+	"i_subtract",
+	"concat",
+	"stringify",
+	"left_shift",
+	"right_shift",
+	"lt",
+	"i_lt",
+	"gt",
+	"i_gt",
+	"le",
+	"i_le",
+	"ge",
+	"i_ge",
+	"eq",
+	"i_eq",
+	"ne",
+	"i_ne",
+	"ncmp",
+	"i_ncmp",
+	"slt",
+	"sgt",
+	"sle",
+	"sge",
+	"seq",
+	"sne",
+	"scmp",
+	"bit_and",
+	"bit_xor",
+	"bit_or",
+	"negate",
+	"i_negate",
+	"not",
+	"complement",
+	"atan2",
+	"sin",
+	"cos",
+	"rand",
+	"srand",
+	"exp",
+	"log",
+	"sqrt",
+	"int",
+	"hex",
+	"oct",
+	"abs",
+	"length",
+	"substr",
+	"vec",
+	"index",
+	"rindex",
+	"sprintf",
+	"formline",
+	"ord",
+	"chr",
+	"crypt",
+	"ucfirst",
+	"lcfirst",
+	"uc",
+	"lc",
+	"quotemeta",
+	"rv2av",
+	"aelemfast",
+	"aelem",
+	"aslice",
+	"each",
+	"values",
+	"keys",
+	"delete",
+	"exists",
+	"rv2hv",
+	"helem",
+	"hslice",
+	"unpack",
+	"pack",
+	"split",
+	"join",
+	"list",
+	"lslice",
+	"anonlist",
+	"anonhash",
+	"splice",
+	"push",
+	"pop",
+	"shift",
+	"unshift",
+	"sort",
+	"reverse",
+	"grepstart",
+	"grepwhile",
+	"mapstart",
+	"mapwhile",
+	"range",
+	"flip",
+	"flop",
+	"and",
+	"or",
+	"xor",
+	"cond_expr",
+	"andassign",
+	"orassign",
+	"method",
+	"entersub",
+	"leavesub",
+	"leavesublv",
+	"caller",
+	"warn",
+	"die",
+	"reset",
+	"lineseq",
+	"nextstate",
+	"dbstate",
+	"unstack",
+	"enter",
+	"leave",
+	"scope",
+	"enteriter",
+	"iter",
+	"enterloop",
+	"leaveloop",
+	"return",
+	"last",
+	"next",
+	"redo",
+	"dump",
+	"goto",
+	"exit",
+	"open",
+	"close",
+	"pipe_op",
+	"fileno",
+	"umask",
+	"binmode",
+	"tie",
+	"untie",
+	"tied",
+	"dbmopen",
+	"dbmclose",
+	"sselect",
+	"select",
+	"getc",
+	"read",
+	"enterwrite",
+	"leavewrite",
+	"prtf",
+	"print",
+	"sysopen",
+	"sysseek",
+	"sysread",
+	"syswrite",
+	"send",
+	"recv",
+	"eof",
+	"tell",
+	"seek",
+	"truncate",
+	"fcntl",
+	"ioctl",
+	"flock",
+	"socket",
+	"sockpair",
+	"bind",
+	"connect",
+	"listen",
+	"accept",
+	"shutdown",
+	"gsockopt",
+	"ssockopt",
+	"getsockname",
+	"getpeername",
+	"lstat",
+	"stat",
+	"ftrread",
+	"ftrwrite",
+	"ftrexec",
+	"fteread",
+	"ftewrite",
+	"fteexec",
+	"ftis",
+	"fteowned",
+	"ftrowned",
+	"ftzero",
+	"ftsize",
+	"ftmtime",
+	"ftatime",
+	"ftctime",
+	"ftsock",
+	"ftchr",
+	"ftblk",
+	"ftfile",
+	"ftdir",
+	"ftpipe",
+	"ftlink",
+	"ftsuid",
+	"ftsgid",
+	"ftsvtx",
+	"fttty",
+	"fttext",
+	"ftbinary",
+	"chdir",
+	"chown",
+	"chroot",
+	"unlink",
+	"chmod",
+	"utime",
+	"rename",
+	"link",
+	"symlink",
+	"readlink",
+	"mkdir",
+	"rmdir",
+	"open_dir",
+	"readdir",
+	"telldir",
+	"seekdir",
+	"rewinddir",
+	"closedir",
+	"fork",
+	"wait",
+	"waitpid",
+	"system",
+	"exec",
+	"kill",
+	"getppid",
+	"getpgrp",
+	"setpgrp",
+	"getpriority",
+	"setpriority",
+	"time",
+	"tms",
+	"localtime",
+	"gmtime",
+	"alarm",
+	"sleep",
+	"shmget",
+	"shmctl",
+	"shmread",
+	"shmwrite",
+	"msgget",
+	"msgctl",
+	"msgsnd",
+	"msgrcv",
+	"semget",
+	"semctl",
+	"semop",
+	"require",
+	"dofile",
+	"entereval",
+	"leaveeval",
+	"entertry",
+	"leavetry",
+	"ghbyname",
+	"ghbyaddr",
+	"ghostent",
+	"gnbyname",
+	"gnbyaddr",
+	"gnetent",
+	"gpbyname",
+	"gpbynumber",
+	"gprotoent",
+	"gsbyname",
+	"gsbyport",
+	"gservent",
+	"shostent",
+	"snetent",
+	"sprotoent",
+	"sservent",
+	"ehostent",
+	"enetent",
+	"eprotoent",
+	"eservent",
+	"gpwnam",
+	"gpwuid",
+	"gpwent",
+	"spwent",
+	"epwent",
+	"ggrnam",
+	"ggrgid",
+	"ggrent",
+	"sgrent",
+	"egrent",
+	"getlogin",
+	"syscall",
+	"lock",
+	"threadsv",
+	"setstate",
+	"method_named",
+	"custom",
+};
+#endif
+
+#ifndef DOINIT
+EXT char *PL_op_desc[];
+#else
+EXT char *PL_op_desc[] = {
+	"null operation",
+	"stub",
+	"scalar",
+	"pushmark",
+	"wantarray",
+	"constant item",
+	"scalar variable",
+	"glob value",
+	"glob elem",
+	"private variable",
+	"private array",
+	"private hash",
+	"private value",
+	"push regexp",
+	"ref-to-glob cast",
+	"scalar dereference",
+	"array length",
+	"subroutine dereference",
+	"anonymous subroutine",
+	"subroutine prototype",
+	"reference constructor",
+	"single ref constructor",
+	"reference-type operator",
+	"bless",
+	"quoted execution (``, qx)",
+	"glob",
+	"<HANDLE>",
+	"append I/O operator",
+	"regexp internal guard",
+	"regexp internal reset",
+	"regexp compilation",
+	"pattern match (m//)",
+	"pattern quote (qr//)",
+	"substitution (s///)",
+	"substitution iterator",
+	"transliteration (tr///)",
+	"scalar assignment",
+	"list assignment",
+	"chop",
+	"scalar chop",
+	"chomp",
+	"scalar chomp",
+	"defined operator",
+	"undef operator",
+	"study",
+	"match position",
+	"preincrement (++)",
+	"integer preincrement (++)",
+	"predecrement (--)",
+	"integer predecrement (--)",
+	"postincrement (++)",
+	"integer postincrement (++)",
+	"postdecrement (--)",
+	"integer postdecrement (--)",
+	"exponentiation (**)",
+	"multiplication (*)",
+	"integer multiplication (*)",
+	"division (/)",
+	"integer division (/)",
+	"modulus (%)",
+	"integer modulus (%)",
+	"repeat (x)",
+	"addition (+)",
+	"integer addition (+)",
+	"subtraction (-)",
+	"integer subtraction (-)",
+	"concatenation (.) or string",
+	"string",
+	"left bitshift (<<)",
+	"right bitshift (>>)",
+	"numeric lt (<)",
+	"integer lt (<)",
+	"numeric gt (>)",
+	"integer gt (>)",
+	"numeric le (<=)",
+	"integer le (<=)",
+	"numeric ge (>=)",
+	"integer ge (>=)",
+	"numeric eq (==)",
+	"integer eq (==)",
+	"numeric ne (!=)",
+	"integer ne (!=)",
+	"numeric comparison (<=>)",
+	"integer comparison (<=>)",
+	"string lt",
+	"string gt",
+	"string le",
+	"string ge",
+	"string eq",
+	"string ne",
+	"string comparison (cmp)",
+	"bitwise and (&)",
+	"bitwise xor (^)",
+	"bitwise or (|)",
+	"negation (-)",
+	"integer negation (-)",
+	"not",
+	"1's complement (~)",
+	"atan2",
+	"sin",
+	"cos",
+	"rand",
+	"srand",
+	"exp",
+	"log",
+	"sqrt",
+	"int",
+	"hex",
+	"oct",
+	"abs",
+	"length",
+	"substr",
+	"vec",
+	"index",
+	"rindex",
+	"sprintf",
+	"formline",
+	"ord",
+	"chr",
+	"crypt",
+	"ucfirst",
+	"lcfirst",
+	"uc",
+	"lc",
+	"quotemeta",
+	"array dereference",
+	"constant array element",
+	"array element",
+	"array slice",
+	"each",
+	"values",
+	"keys",
+	"delete",
+	"exists",
+	"hash dereference",
+	"hash element",
+	"hash slice",
+	"unpack",
+	"pack",
+	"split",
+	"join or string",
+	"list",
+	"list slice",
+	"anonymous list ([])",
+	"anonymous hash ({})",
+	"splice",
+	"push",
+	"pop",
+	"shift",
+	"unshift",
+	"sort",
+	"reverse",
+	"grep",
+	"grep iterator",
+	"map",
+	"map iterator",
+	"flipflop",
+	"range (or flip)",
+	"range (or flop)",
+	"logical and (&&)",
+	"logical or (||)",
+	"logical xor",
+	"conditional expression",
+	"logical and assignment (&&=)",
+	"logical or assignment (||=)",
+	"method lookup",
+	"subroutine entry",
+	"subroutine exit",
+	"lvalue subroutine return",
+	"caller",
+	"warn",
+	"die",
+	"symbol reset",
+	"line sequence",
+	"next statement",
+	"debug next statement",
+	"iteration finalizer",
+	"block entry",
+	"block exit",
+	"block",
+	"foreach loop entry",
+	"foreach loop iterator",
+	"loop entry",
+	"loop exit",
+	"return",
+	"last",
+	"next",
+	"redo",
+	"dump",
+	"goto",
+	"exit",
+	"open",
+	"close",
+	"pipe",
+	"fileno",
+	"umask",
+	"binmode",
+	"tie",
+	"untie",
+	"tied",
+	"dbmopen",
+	"dbmclose",
+	"select system call",
+	"select",
+	"getc",
+	"read",
+	"write",
+	"write exit",
+	"printf",
+	"print",
+	"sysopen",
+	"sysseek",
+	"sysread",
+	"syswrite",
+	"send",
+	"recv",
+	"eof",
+	"tell",
+	"seek",
+	"truncate",
+	"fcntl",
+	"ioctl",
+	"flock",
+	"socket",
+	"socketpair",
+	"bind",
+	"connect",
+	"listen",
+	"accept",
+	"shutdown",
+	"getsockopt",
+	"setsockopt",
+	"getsockname",
+	"getpeername",
+	"lstat",
+	"stat",
+	"-R",
+	"-W",
+	"-X",
+	"-r",
+	"-w",
+	"-x",
+	"-e",
+	"-o",
+	"-O",
+	"-z",
+	"-s",
+	"-M",
+	"-A",
+	"-C",
+	"-S",
+	"-c",
+	"-b",
+	"-f",
+	"-d",
+	"-p",
+	"-l",
+	"-u",
+	"-g",
+	"-k",
+	"-t",
+	"-T",
+	"-B",
+	"chdir",
+	"chown",
+	"chroot",
+	"unlink",
+	"chmod",
+	"utime",
+	"rename",
+	"link",
+	"symlink",
+	"readlink",
+	"mkdir",
+	"rmdir",
+	"opendir",
+	"readdir",
+	"telldir",
+	"seekdir",
+	"rewinddir",
+	"closedir",
+	"fork",
+	"wait",
+	"waitpid",
+	"system",
+	"exec",
+	"kill",
+	"getppid",
+	"getpgrp",
+	"setpgrp",
+	"getpriority",
+	"setpriority",
+	"time",
+	"times",
+	"localtime",
+	"gmtime",
+	"alarm",
+	"sleep",
+	"shmget",
+	"shmctl",
+	"shmread",
+	"shmwrite",
+	"msgget",
+	"msgctl",
+	"msgsnd",
+	"msgrcv",
+	"semget",
+	"semctl",
+	"semop",
+	"require",
+	"do \"file\"",
+	"eval \"string\"",
+	"eval \"string\" exit",
+	"eval {block}",
+	"eval {block} exit",
+	"gethostbyname",
+	"gethostbyaddr",
+	"gethostent",
+	"getnetbyname",
+	"getnetbyaddr",
+	"getnetent",
+	"getprotobyname",
+	"getprotobynumber",
+	"getprotoent",
+	"getservbyname",
+	"getservbyport",
+	"getservent",
+	"sethostent",
+	"setnetent",
+	"setprotoent",
+	"setservent",
+	"endhostent",
+	"endnetent",
+	"endprotoent",
+	"endservent",
+	"getpwnam",
+	"getpwuid",
+	"getpwent",
+	"setpwent",
+	"endpwent",
+	"getgrnam",
+	"getgrgid",
+	"getgrent",
+	"setgrent",
+	"endgrent",
+	"getlogin",
+	"syscall",
+	"lock",
+	"per-thread value",
+	"set statement info",
+	"method with known name",
+	"unknown custom operator",
+};
+#endif
+
+END_EXTERN_C
+
+
+START_EXTERN_C
+
+#ifndef DOINIT
+EXT OP * (CPERLscope(*PL_ppaddr)[])(pTHX);
+#else
+EXT OP * (CPERLscope(*PL_ppaddr)[])(pTHX) = {
+	MEMBER_TO_FPTR(Perl_pp_null),
+	MEMBER_TO_FPTR(Perl_pp_stub),
+	MEMBER_TO_FPTR(Perl_pp_scalar),
+	MEMBER_TO_FPTR(Perl_pp_pushmark),
+	MEMBER_TO_FPTR(Perl_pp_wantarray),
+	MEMBER_TO_FPTR(Perl_pp_const),
+	MEMBER_TO_FPTR(Perl_pp_gvsv),
+	MEMBER_TO_FPTR(Perl_pp_gv),
+	MEMBER_TO_FPTR(Perl_pp_gelem),
+	MEMBER_TO_FPTR(Perl_pp_padsv),
+	MEMBER_TO_FPTR(Perl_pp_padav),
+	MEMBER_TO_FPTR(Perl_pp_padhv),
+	MEMBER_TO_FPTR(Perl_pp_padany),
+	MEMBER_TO_FPTR(Perl_pp_pushre),
+	MEMBER_TO_FPTR(Perl_pp_rv2gv),
+	MEMBER_TO_FPTR(Perl_pp_rv2sv),
+	MEMBER_TO_FPTR(Perl_pp_av2arylen),
+	MEMBER_TO_FPTR(Perl_pp_rv2cv),
+	MEMBER_TO_FPTR(Perl_pp_anoncode),
+	MEMBER_TO_FPTR(Perl_pp_prototype),
+	MEMBER_TO_FPTR(Perl_pp_refgen),
+	MEMBER_TO_FPTR(Perl_pp_srefgen),
+	MEMBER_TO_FPTR(Perl_pp_ref),
+	MEMBER_TO_FPTR(Perl_pp_bless),
+	MEMBER_TO_FPTR(Perl_pp_backtick),
+	MEMBER_TO_FPTR(Perl_pp_glob),
+	MEMBER_TO_FPTR(Perl_pp_readline),
+	MEMBER_TO_FPTR(Perl_pp_rcatline),
+	MEMBER_TO_FPTR(Perl_pp_regcmaybe),
+	MEMBER_TO_FPTR(Perl_pp_regcreset),
+	MEMBER_TO_FPTR(Perl_pp_regcomp),
+	MEMBER_TO_FPTR(Perl_pp_match),
+	MEMBER_TO_FPTR(Perl_pp_qr),
+	MEMBER_TO_FPTR(Perl_pp_subst),
+	MEMBER_TO_FPTR(Perl_pp_substcont),
+	MEMBER_TO_FPTR(Perl_pp_trans),
+	MEMBER_TO_FPTR(Perl_pp_sassign),
+	MEMBER_TO_FPTR(Perl_pp_aassign),
+	MEMBER_TO_FPTR(Perl_pp_chop),
+	MEMBER_TO_FPTR(Perl_pp_schop),
+	MEMBER_TO_FPTR(Perl_pp_chomp),
+	MEMBER_TO_FPTR(Perl_pp_schomp),
+	MEMBER_TO_FPTR(Perl_pp_defined),
+	MEMBER_TO_FPTR(Perl_pp_undef),
+	MEMBER_TO_FPTR(Perl_pp_study),
+	MEMBER_TO_FPTR(Perl_pp_pos),
+	MEMBER_TO_FPTR(Perl_pp_preinc),
+	MEMBER_TO_FPTR(Perl_pp_i_preinc),
+	MEMBER_TO_FPTR(Perl_pp_predec),
+	MEMBER_TO_FPTR(Perl_pp_i_predec),
+	MEMBER_TO_FPTR(Perl_pp_postinc),
+	MEMBER_TO_FPTR(Perl_pp_i_postinc),
+	MEMBER_TO_FPTR(Perl_pp_postdec),
+	MEMBER_TO_FPTR(Perl_pp_i_postdec),
+	MEMBER_TO_FPTR(Perl_pp_pow),
+	MEMBER_TO_FPTR(Perl_pp_multiply),
+	MEMBER_TO_FPTR(Perl_pp_i_multiply),
+	MEMBER_TO_FPTR(Perl_pp_divide),
+	MEMBER_TO_FPTR(Perl_pp_i_divide),
+	MEMBER_TO_FPTR(Perl_pp_modulo),
+	MEMBER_TO_FPTR(Perl_pp_i_modulo),
+	MEMBER_TO_FPTR(Perl_pp_repeat),
+	MEMBER_TO_FPTR(Perl_pp_add),
+	MEMBER_TO_FPTR(Perl_pp_i_add),
+	MEMBER_TO_FPTR(Perl_pp_subtract),
+	MEMBER_TO_FPTR(Perl_pp_i_subtract),
+	MEMBER_TO_FPTR(Perl_pp_concat),
+	MEMBER_TO_FPTR(Perl_pp_stringify),
+	MEMBER_TO_FPTR(Perl_pp_left_shift),
+	MEMBER_TO_FPTR(Perl_pp_right_shift),
+	MEMBER_TO_FPTR(Perl_pp_lt),
+	MEMBER_TO_FPTR(Perl_pp_i_lt),
+	MEMBER_TO_FPTR(Perl_pp_gt),
+	MEMBER_TO_FPTR(Perl_pp_i_gt),
+	MEMBER_TO_FPTR(Perl_pp_le),
+	MEMBER_TO_FPTR(Perl_pp_i_le),
+	MEMBER_TO_FPTR(Perl_pp_ge),
+	MEMBER_TO_FPTR(Perl_pp_i_ge),
+	MEMBER_TO_FPTR(Perl_pp_eq),
+	MEMBER_TO_FPTR(Perl_pp_i_eq),
+	MEMBER_TO_FPTR(Perl_pp_ne),
+	MEMBER_TO_FPTR(Perl_pp_i_ne),
+	MEMBER_TO_FPTR(Perl_pp_ncmp),
+	MEMBER_TO_FPTR(Perl_pp_i_ncmp),
+	MEMBER_TO_FPTR(Perl_pp_slt),
+	MEMBER_TO_FPTR(Perl_pp_sgt),
+	MEMBER_TO_FPTR(Perl_pp_sle),
+	MEMBER_TO_FPTR(Perl_pp_sge),
+	MEMBER_TO_FPTR(Perl_pp_seq),
+	MEMBER_TO_FPTR(Perl_pp_sne),
+	MEMBER_TO_FPTR(Perl_pp_scmp),
+	MEMBER_TO_FPTR(Perl_pp_bit_and),
+	MEMBER_TO_FPTR(Perl_pp_bit_xor),
+	MEMBER_TO_FPTR(Perl_pp_bit_or),
+	MEMBER_TO_FPTR(Perl_pp_negate),
+	MEMBER_TO_FPTR(Perl_pp_i_negate),
+	MEMBER_TO_FPTR(Perl_pp_not),
+	MEMBER_TO_FPTR(Perl_pp_complement),
+	MEMBER_TO_FPTR(Perl_pp_atan2),
+	MEMBER_TO_FPTR(Perl_pp_sin),
+	MEMBER_TO_FPTR(Perl_pp_cos),
+	MEMBER_TO_FPTR(Perl_pp_rand),
+	MEMBER_TO_FPTR(Perl_pp_srand),
+	MEMBER_TO_FPTR(Perl_pp_exp),
+	MEMBER_TO_FPTR(Perl_pp_log),
+	MEMBER_TO_FPTR(Perl_pp_sqrt),
+	MEMBER_TO_FPTR(Perl_pp_int),
+	MEMBER_TO_FPTR(Perl_pp_hex),
+	MEMBER_TO_FPTR(Perl_pp_oct),
+	MEMBER_TO_FPTR(Perl_pp_abs),
+	MEMBER_TO_FPTR(Perl_pp_length),
+	MEMBER_TO_FPTR(Perl_pp_substr),
+	MEMBER_TO_FPTR(Perl_pp_vec),
+	MEMBER_TO_FPTR(Perl_pp_index),
+	MEMBER_TO_FPTR(Perl_pp_rindex),
+	MEMBER_TO_FPTR(Perl_pp_sprintf),
+	MEMBER_TO_FPTR(Perl_pp_formline),
+	MEMBER_TO_FPTR(Perl_pp_ord),
+	MEMBER_TO_FPTR(Perl_pp_chr),
+	MEMBER_TO_FPTR(Perl_pp_crypt),
+	MEMBER_TO_FPTR(Perl_pp_ucfirst),
+	MEMBER_TO_FPTR(Perl_pp_lcfirst),
+	MEMBER_TO_FPTR(Perl_pp_uc),
+	MEMBER_TO_FPTR(Perl_pp_lc),
+	MEMBER_TO_FPTR(Perl_pp_quotemeta),
+	MEMBER_TO_FPTR(Perl_pp_rv2av),
+	MEMBER_TO_FPTR(Perl_pp_aelemfast),
+	MEMBER_TO_FPTR(Perl_pp_aelem),
+	MEMBER_TO_FPTR(Perl_pp_aslice),
+	MEMBER_TO_FPTR(Perl_pp_each),
+	MEMBER_TO_FPTR(Perl_pp_values),
+	MEMBER_TO_FPTR(Perl_pp_keys),
+	MEMBER_TO_FPTR(Perl_pp_delete),
+	MEMBER_TO_FPTR(Perl_pp_exists),
+	MEMBER_TO_FPTR(Perl_pp_rv2hv),
+	MEMBER_TO_FPTR(Perl_pp_helem),
+	MEMBER_TO_FPTR(Perl_pp_hslice),
+	MEMBER_TO_FPTR(Perl_pp_unpack),
+	MEMBER_TO_FPTR(Perl_pp_pack),
+	MEMBER_TO_FPTR(Perl_pp_split),
+	MEMBER_TO_FPTR(Perl_pp_join),
+	MEMBER_TO_FPTR(Perl_pp_list),
+	MEMBER_TO_FPTR(Perl_pp_lslice),
+	MEMBER_TO_FPTR(Perl_pp_anonlist),
+	MEMBER_TO_FPTR(Perl_pp_anonhash),
+	MEMBER_TO_FPTR(Perl_pp_splice),
+	MEMBER_TO_FPTR(Perl_pp_push),
+	MEMBER_TO_FPTR(Perl_pp_pop),
+	MEMBER_TO_FPTR(Perl_pp_shift),
+	MEMBER_TO_FPTR(Perl_pp_unshift),
+	MEMBER_TO_FPTR(Perl_pp_sort),
+	MEMBER_TO_FPTR(Perl_pp_reverse),
+	MEMBER_TO_FPTR(Perl_pp_grepstart),
+	MEMBER_TO_FPTR(Perl_pp_grepwhile),
+	MEMBER_TO_FPTR(Perl_pp_mapstart),
+	MEMBER_TO_FPTR(Perl_pp_mapwhile),
+	MEMBER_TO_FPTR(Perl_pp_range),
+	MEMBER_TO_FPTR(Perl_pp_flip),
+	MEMBER_TO_FPTR(Perl_pp_flop),
+	MEMBER_TO_FPTR(Perl_pp_and),
+	MEMBER_TO_FPTR(Perl_pp_or),
+	MEMBER_TO_FPTR(Perl_pp_xor),
+	MEMBER_TO_FPTR(Perl_pp_cond_expr),
+	MEMBER_TO_FPTR(Perl_pp_andassign),
+	MEMBER_TO_FPTR(Perl_pp_orassign),
+	MEMBER_TO_FPTR(Perl_pp_method),
+	MEMBER_TO_FPTR(Perl_pp_entersub),
+	MEMBER_TO_FPTR(Perl_pp_leavesub),
+	MEMBER_TO_FPTR(Perl_pp_leavesublv),
+	MEMBER_TO_FPTR(Perl_pp_caller),
+	MEMBER_TO_FPTR(Perl_pp_warn),
+	MEMBER_TO_FPTR(Perl_pp_die),
+	MEMBER_TO_FPTR(Perl_pp_reset),
+	MEMBER_TO_FPTR(Perl_pp_lineseq),
+	MEMBER_TO_FPTR(Perl_pp_nextstate),
+	MEMBER_TO_FPTR(Perl_pp_dbstate),
+	MEMBER_TO_FPTR(Perl_pp_unstack),
+	MEMBER_TO_FPTR(Perl_pp_enter),
+	MEMBER_TO_FPTR(Perl_pp_leave),
+	MEMBER_TO_FPTR(Perl_pp_scope),
+	MEMBER_TO_FPTR(Perl_pp_enteriter),
+	MEMBER_TO_FPTR(Perl_pp_iter),
+	MEMBER_TO_FPTR(Perl_pp_enterloop),
+	MEMBER_TO_FPTR(Perl_pp_leaveloop),
+	MEMBER_TO_FPTR(Perl_pp_return),
+	MEMBER_TO_FPTR(Perl_pp_last),
+	MEMBER_TO_FPTR(Perl_pp_next),
+	MEMBER_TO_FPTR(Perl_pp_redo),
+	MEMBER_TO_FPTR(Perl_pp_dump),
+	MEMBER_TO_FPTR(Perl_pp_goto),
+	MEMBER_TO_FPTR(Perl_pp_exit),
+	MEMBER_TO_FPTR(Perl_pp_open),
+	MEMBER_TO_FPTR(Perl_pp_close),
+	MEMBER_TO_FPTR(Perl_pp_pipe_op),
+	MEMBER_TO_FPTR(Perl_pp_fileno),
+	MEMBER_TO_FPTR(Perl_pp_umask),
+	MEMBER_TO_FPTR(Perl_pp_binmode),
+	MEMBER_TO_FPTR(Perl_pp_tie),
+	MEMBER_TO_FPTR(Perl_pp_untie),
+	MEMBER_TO_FPTR(Perl_pp_tied),
+	MEMBER_TO_FPTR(Perl_pp_dbmopen),
+	MEMBER_TO_FPTR(Perl_pp_dbmclose),
+	MEMBER_TO_FPTR(Perl_pp_sselect),
+	MEMBER_TO_FPTR(Perl_pp_select),
+	MEMBER_TO_FPTR(Perl_pp_getc),
+	MEMBER_TO_FPTR(Perl_pp_read),
+	MEMBER_TO_FPTR(Perl_pp_enterwrite),
+	MEMBER_TO_FPTR(Perl_pp_leavewrite),
+	MEMBER_TO_FPTR(Perl_pp_prtf),
+	MEMBER_TO_FPTR(Perl_pp_print),
+	MEMBER_TO_FPTR(Perl_pp_sysopen),
+	MEMBER_TO_FPTR(Perl_pp_sysseek),
+	MEMBER_TO_FPTR(Perl_pp_sysread),
+	MEMBER_TO_FPTR(Perl_pp_syswrite),
+	MEMBER_TO_FPTR(Perl_pp_send),
+	MEMBER_TO_FPTR(Perl_pp_recv),
+	MEMBER_TO_FPTR(Perl_pp_eof),
+	MEMBER_TO_FPTR(Perl_pp_tell),
+	MEMBER_TO_FPTR(Perl_pp_seek),
+	MEMBER_TO_FPTR(Perl_pp_truncate),
+	MEMBER_TO_FPTR(Perl_pp_fcntl),
+	MEMBER_TO_FPTR(Perl_pp_ioctl),
+	MEMBER_TO_FPTR(Perl_pp_flock),
+	MEMBER_TO_FPTR(Perl_pp_socket),
+	MEMBER_TO_FPTR(Perl_pp_sockpair),
+	MEMBER_TO_FPTR(Perl_pp_bind),
+	MEMBER_TO_FPTR(Perl_pp_connect),
+	MEMBER_TO_FPTR(Perl_pp_listen),
+	MEMBER_TO_FPTR(Perl_pp_accept),
+	MEMBER_TO_FPTR(Perl_pp_shutdown),
+	MEMBER_TO_FPTR(Perl_pp_gsockopt),
+	MEMBER_TO_FPTR(Perl_pp_ssockopt),
+	MEMBER_TO_FPTR(Perl_pp_getsockname),
+	MEMBER_TO_FPTR(Perl_pp_getpeername),
+	MEMBER_TO_FPTR(Perl_pp_lstat),
+	MEMBER_TO_FPTR(Perl_pp_stat),
+	MEMBER_TO_FPTR(Perl_pp_ftrread),
+	MEMBER_TO_FPTR(Perl_pp_ftrwrite),
+	MEMBER_TO_FPTR(Perl_pp_ftrexec),
+	MEMBER_TO_FPTR(Perl_pp_fteread),
+	MEMBER_TO_FPTR(Perl_pp_ftewrite),
+	MEMBER_TO_FPTR(Perl_pp_fteexec),
+	MEMBER_TO_FPTR(Perl_pp_ftis),
+	MEMBER_TO_FPTR(Perl_pp_fteowned),
+	MEMBER_TO_FPTR(Perl_pp_ftrowned),
+	MEMBER_TO_FPTR(Perl_pp_ftzero),
+	MEMBER_TO_FPTR(Perl_pp_ftsize),
+	MEMBER_TO_FPTR(Perl_pp_ftmtime),
+	MEMBER_TO_FPTR(Perl_pp_ftatime),
+	MEMBER_TO_FPTR(Perl_pp_ftctime),
+	MEMBER_TO_FPTR(Perl_pp_ftsock),
+	MEMBER_TO_FPTR(Perl_pp_ftchr),
+	MEMBER_TO_FPTR(Perl_pp_ftblk),
+	MEMBER_TO_FPTR(Perl_pp_ftfile),
+	MEMBER_TO_FPTR(Perl_pp_ftdir),
+	MEMBER_TO_FPTR(Perl_pp_ftpipe),
+	MEMBER_TO_FPTR(Perl_pp_ftlink),
+	MEMBER_TO_FPTR(Perl_pp_ftsuid),
+	MEMBER_TO_FPTR(Perl_pp_ftsgid),
+	MEMBER_TO_FPTR(Perl_pp_ftsvtx),
+	MEMBER_TO_FPTR(Perl_pp_fttty),
+	MEMBER_TO_FPTR(Perl_pp_fttext),
+	MEMBER_TO_FPTR(Perl_pp_ftbinary),
+	MEMBER_TO_FPTR(Perl_pp_chdir),
+	MEMBER_TO_FPTR(Perl_pp_chown),
+	MEMBER_TO_FPTR(Perl_pp_chroot),
+	MEMBER_TO_FPTR(Perl_pp_unlink),
+	MEMBER_TO_FPTR(Perl_pp_chmod),
+	MEMBER_TO_FPTR(Perl_pp_utime),
+	MEMBER_TO_FPTR(Perl_pp_rename),
+	MEMBER_TO_FPTR(Perl_pp_link),
+	MEMBER_TO_FPTR(Perl_pp_symlink),
+	MEMBER_TO_FPTR(Perl_pp_readlink),
+	MEMBER_TO_FPTR(Perl_pp_mkdir),
+	MEMBER_TO_FPTR(Perl_pp_rmdir),
+	MEMBER_TO_FPTR(Perl_pp_open_dir),
+	MEMBER_TO_FPTR(Perl_pp_readdir),
+	MEMBER_TO_FPTR(Perl_pp_telldir),
+	MEMBER_TO_FPTR(Perl_pp_seekdir),
+	MEMBER_TO_FPTR(Perl_pp_rewinddir),
+	MEMBER_TO_FPTR(Perl_pp_closedir),
+	MEMBER_TO_FPTR(Perl_pp_fork),
+	MEMBER_TO_FPTR(Perl_pp_wait),
+	MEMBER_TO_FPTR(Perl_pp_waitpid),
+	MEMBER_TO_FPTR(Perl_pp_system),
+	MEMBER_TO_FPTR(Perl_pp_exec),
+	MEMBER_TO_FPTR(Perl_pp_kill),
+	MEMBER_TO_FPTR(Perl_pp_getppid),
+	MEMBER_TO_FPTR(Perl_pp_getpgrp),
+	MEMBER_TO_FPTR(Perl_pp_setpgrp),
+	MEMBER_TO_FPTR(Perl_pp_getpriority),
+	MEMBER_TO_FPTR(Perl_pp_setpriority),
+	MEMBER_TO_FPTR(Perl_pp_time),
+	MEMBER_TO_FPTR(Perl_pp_tms),
+	MEMBER_TO_FPTR(Perl_pp_localtime),
+	MEMBER_TO_FPTR(Perl_pp_gmtime),
+	MEMBER_TO_FPTR(Perl_pp_alarm),
+	MEMBER_TO_FPTR(Perl_pp_sleep),
+	MEMBER_TO_FPTR(Perl_pp_shmget),
+	MEMBER_TO_FPTR(Perl_pp_shmctl),
+	MEMBER_TO_FPTR(Perl_pp_shmread),
+	MEMBER_TO_FPTR(Perl_pp_shmwrite),
+	MEMBER_TO_FPTR(Perl_pp_msgget),
+	MEMBER_TO_FPTR(Perl_pp_msgctl),
+	MEMBER_TO_FPTR(Perl_pp_msgsnd),
+	MEMBER_TO_FPTR(Perl_pp_msgrcv),
+	MEMBER_TO_FPTR(Perl_pp_semget),
+	MEMBER_TO_FPTR(Perl_pp_semctl),
+	MEMBER_TO_FPTR(Perl_pp_semop),
+	MEMBER_TO_FPTR(Perl_pp_require),
+	MEMBER_TO_FPTR(Perl_pp_dofile),
+	MEMBER_TO_FPTR(Perl_pp_entereval),
+	MEMBER_TO_FPTR(Perl_pp_leaveeval),
+	MEMBER_TO_FPTR(Perl_pp_entertry),
+	MEMBER_TO_FPTR(Perl_pp_leavetry),
+	MEMBER_TO_FPTR(Perl_pp_ghbyname),
+	MEMBER_TO_FPTR(Perl_pp_ghbyaddr),
+	MEMBER_TO_FPTR(Perl_pp_ghostent),
+	MEMBER_TO_FPTR(Perl_pp_gnbyname),
+	MEMBER_TO_FPTR(Perl_pp_gnbyaddr),
+	MEMBER_TO_FPTR(Perl_pp_gnetent),
+	MEMBER_TO_FPTR(Perl_pp_gpbyname),
+	MEMBER_TO_FPTR(Perl_pp_gpbynumber),
+	MEMBER_TO_FPTR(Perl_pp_gprotoent),
+	MEMBER_TO_FPTR(Perl_pp_gsbyname),
+	MEMBER_TO_FPTR(Perl_pp_gsbyport),
+	MEMBER_TO_FPTR(Perl_pp_gservent),
+	MEMBER_TO_FPTR(Perl_pp_shostent),
+	MEMBER_TO_FPTR(Perl_pp_snetent),
+	MEMBER_TO_FPTR(Perl_pp_sprotoent),
+	MEMBER_TO_FPTR(Perl_pp_sservent),
+	MEMBER_TO_FPTR(Perl_pp_ehostent),
+	MEMBER_TO_FPTR(Perl_pp_enetent),
+	MEMBER_TO_FPTR(Perl_pp_eprotoent),
+	MEMBER_TO_FPTR(Perl_pp_eservent),
+	MEMBER_TO_FPTR(Perl_pp_gpwnam),
+	MEMBER_TO_FPTR(Perl_pp_gpwuid),
+	MEMBER_TO_FPTR(Perl_pp_gpwent),
+	MEMBER_TO_FPTR(Perl_pp_spwent),
+	MEMBER_TO_FPTR(Perl_pp_epwent),
+	MEMBER_TO_FPTR(Perl_pp_ggrnam),
+	MEMBER_TO_FPTR(Perl_pp_ggrgid),
+	MEMBER_TO_FPTR(Perl_pp_ggrent),
+	MEMBER_TO_FPTR(Perl_pp_sgrent),
+	MEMBER_TO_FPTR(Perl_pp_egrent),
+	MEMBER_TO_FPTR(Perl_pp_getlogin),
+	MEMBER_TO_FPTR(Perl_pp_syscall),
+	MEMBER_TO_FPTR(Perl_pp_lock),
+	MEMBER_TO_FPTR(Perl_pp_threadsv),
+	MEMBER_TO_FPTR(Perl_pp_setstate),
+	MEMBER_TO_FPTR(Perl_pp_method_named),
+};
+#endif
+
+#ifndef DOINIT
+EXT OP * (CPERLscope(*PL_check)[]) (pTHX_ OP *op);
+#else
+EXT OP * (CPERLscope(*PL_check)[]) (pTHX_ OP *op) = {
+	MEMBER_TO_FPTR(Perl_ck_null),	/* null */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* stub */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* scalar */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* pushmark */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* wantarray */
+	MEMBER_TO_FPTR(Perl_ck_svconst),	/* const */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* gvsv */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* gv */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* gelem */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* padsv */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* padav */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* padhv */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* padany */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* pushre */
+	MEMBER_TO_FPTR(Perl_ck_rvconst),	/* rv2gv */
+	MEMBER_TO_FPTR(Perl_ck_rvconst),	/* rv2sv */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* av2arylen */
+	MEMBER_TO_FPTR(Perl_ck_rvconst),	/* rv2cv */
+	MEMBER_TO_FPTR(Perl_ck_anoncode),	/* anoncode */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* prototype */
+	MEMBER_TO_FPTR(Perl_ck_spair),	/* refgen */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* srefgen */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* ref */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* bless */
+	MEMBER_TO_FPTR(Perl_ck_open),	/* backtick */
+	MEMBER_TO_FPTR(Perl_ck_glob),	/* glob */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* readline */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* rcatline */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* regcmaybe */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* regcreset */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* regcomp */
+	MEMBER_TO_FPTR(Perl_ck_match),	/* match */
+	MEMBER_TO_FPTR(Perl_ck_match),	/* qr */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* subst */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* substcont */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* trans */
+	MEMBER_TO_FPTR(Perl_ck_sassign),	/* sassign */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* aassign */
+	MEMBER_TO_FPTR(Perl_ck_spair),	/* chop */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* schop */
+	MEMBER_TO_FPTR(Perl_ck_spair),	/* chomp */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* schomp */
+	MEMBER_TO_FPTR(Perl_ck_defined),	/* defined */
+	MEMBER_TO_FPTR(Perl_ck_lfun),	/* undef */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* study */
+	MEMBER_TO_FPTR(Perl_ck_lfun),	/* pos */
+	MEMBER_TO_FPTR(Perl_ck_lfun),	/* preinc */
+	MEMBER_TO_FPTR(Perl_ck_lfun),	/* i_preinc */
+	MEMBER_TO_FPTR(Perl_ck_lfun),	/* predec */
+	MEMBER_TO_FPTR(Perl_ck_lfun),	/* i_predec */
+	MEMBER_TO_FPTR(Perl_ck_lfun),	/* postinc */
+	MEMBER_TO_FPTR(Perl_ck_lfun),	/* i_postinc */
+	MEMBER_TO_FPTR(Perl_ck_lfun),	/* postdec */
+	MEMBER_TO_FPTR(Perl_ck_lfun),	/* i_postdec */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* pow */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* multiply */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_multiply */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* divide */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_divide */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* modulo */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_modulo */
+	MEMBER_TO_FPTR(Perl_ck_repeat),	/* repeat */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* add */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_add */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* subtract */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_subtract */
+	MEMBER_TO_FPTR(Perl_ck_concat),	/* concat */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* stringify */
+	MEMBER_TO_FPTR(Perl_ck_bitop),	/* left_shift */
+	MEMBER_TO_FPTR(Perl_ck_bitop),	/* right_shift */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* lt */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_lt */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* gt */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_gt */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* le */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_le */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* ge */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_ge */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* eq */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_eq */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* ne */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_ne */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* ncmp */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_ncmp */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* slt */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* sgt */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* sle */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* sge */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* seq */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* sne */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* scmp */
+	MEMBER_TO_FPTR(Perl_ck_bitop),	/* bit_and */
+	MEMBER_TO_FPTR(Perl_ck_bitop),	/* bit_xor */
+	MEMBER_TO_FPTR(Perl_ck_bitop),	/* bit_or */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* negate */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* i_negate */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* not */
+	MEMBER_TO_FPTR(Perl_ck_bitop),	/* complement */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* atan2 */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* sin */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* cos */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* rand */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* srand */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* exp */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* log */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* sqrt */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* int */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* hex */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* oct */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* abs */
+	MEMBER_TO_FPTR(Perl_ck_lengthconst),	/* length */
+	MEMBER_TO_FPTR(Perl_ck_substr),	/* substr */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* vec */
+	MEMBER_TO_FPTR(Perl_ck_index),	/* index */
+	MEMBER_TO_FPTR(Perl_ck_index),	/* rindex */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* sprintf */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* formline */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* ord */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* chr */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* crypt */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* ucfirst */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* lcfirst */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* uc */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* lc */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* quotemeta */
+	MEMBER_TO_FPTR(Perl_ck_rvconst),	/* rv2av */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* aelemfast */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* aelem */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* aslice */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* each */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* values */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* keys */
+	MEMBER_TO_FPTR(Perl_ck_delete),	/* delete */
+	MEMBER_TO_FPTR(Perl_ck_exists),	/* exists */
+	MEMBER_TO_FPTR(Perl_ck_rvconst),	/* rv2hv */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* helem */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* hslice */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* unpack */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* pack */
+	MEMBER_TO_FPTR(Perl_ck_split),	/* split */
+	MEMBER_TO_FPTR(Perl_ck_join),	/* join */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* list */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* lslice */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* anonlist */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* anonhash */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* splice */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* push */
+	MEMBER_TO_FPTR(Perl_ck_shift),	/* pop */
+	MEMBER_TO_FPTR(Perl_ck_shift),	/* shift */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* unshift */
+	MEMBER_TO_FPTR(Perl_ck_sort),	/* sort */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* reverse */
+	MEMBER_TO_FPTR(Perl_ck_grep),	/* grepstart */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* grepwhile */
+	MEMBER_TO_FPTR(Perl_ck_grep),	/* mapstart */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* mapwhile */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* range */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* flip */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* flop */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* and */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* or */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* xor */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* cond_expr */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* andassign */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* orassign */
+	MEMBER_TO_FPTR(Perl_ck_method),	/* method */
+	MEMBER_TO_FPTR(Perl_ck_subr),	/* entersub */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* leavesub */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* leavesublv */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* caller */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* warn */
+	MEMBER_TO_FPTR(Perl_ck_die),	/* die */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* reset */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* lineseq */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* nextstate */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* dbstate */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* unstack */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* enter */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* leave */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* scope */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* enteriter */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* iter */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* enterloop */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* leaveloop */
+	MEMBER_TO_FPTR(Perl_ck_return),	/* return */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* last */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* next */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* redo */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* dump */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* goto */
+	MEMBER_TO_FPTR(Perl_ck_exit),	/* exit */
+	MEMBER_TO_FPTR(Perl_ck_open),	/* open */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* close */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* pipe_op */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* fileno */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* umask */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* binmode */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* tie */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* untie */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* tied */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* dbmopen */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* dbmclose */
+	MEMBER_TO_FPTR(Perl_ck_select),	/* sselect */
+	MEMBER_TO_FPTR(Perl_ck_select),	/* select */
+	MEMBER_TO_FPTR(Perl_ck_eof),	/* getc */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* read */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* enterwrite */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* leavewrite */
+	MEMBER_TO_FPTR(Perl_ck_listiob),	/* prtf */
+	MEMBER_TO_FPTR(Perl_ck_listiob),	/* print */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* sysopen */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* sysseek */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* sysread */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* syswrite */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* send */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* recv */
+	MEMBER_TO_FPTR(Perl_ck_eof),	/* eof */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* tell */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* seek */
+	MEMBER_TO_FPTR(Perl_ck_trunc),	/* truncate */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* fcntl */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* ioctl */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* flock */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* socket */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* sockpair */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* bind */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* connect */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* listen */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* accept */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* shutdown */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* gsockopt */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* ssockopt */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* getsockname */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* getpeername */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* lstat */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* stat */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftrread */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftrwrite */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftrexec */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* fteread */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftewrite */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* fteexec */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftis */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* fteowned */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftrowned */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftzero */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftsize */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftmtime */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftatime */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftctime */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftsock */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftchr */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftblk */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftfile */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftdir */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftpipe */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftlink */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftsuid */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftsgid */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftsvtx */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* fttty */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* fttext */
+	MEMBER_TO_FPTR(Perl_ck_ftst),	/* ftbinary */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* chdir */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* chown */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* chroot */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* unlink */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* chmod */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* utime */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* rename */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* link */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* symlink */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* readlink */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* mkdir */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* rmdir */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* open_dir */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* readdir */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* telldir */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* seekdir */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* rewinddir */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* closedir */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* fork */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* wait */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* waitpid */
+	MEMBER_TO_FPTR(Perl_ck_exec),	/* system */
+	MEMBER_TO_FPTR(Perl_ck_exec),	/* exec */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* kill */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* getppid */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* getpgrp */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* setpgrp */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* getpriority */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* setpriority */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* time */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* tms */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* localtime */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* gmtime */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* alarm */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* sleep */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* shmget */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* shmctl */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* shmread */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* shmwrite */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* msgget */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* msgctl */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* msgsnd */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* msgrcv */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* semget */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* semctl */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* semop */
+	MEMBER_TO_FPTR(Perl_ck_require),	/* require */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* dofile */
+	MEMBER_TO_FPTR(Perl_ck_eval),	/* entereval */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* leaveeval */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* entertry */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* leavetry */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* ghbyname */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* ghbyaddr */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* ghostent */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* gnbyname */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* gnbyaddr */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* gnetent */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* gpbyname */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* gpbynumber */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* gprotoent */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* gsbyname */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* gsbyport */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* gservent */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* shostent */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* snetent */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* sprotoent */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* sservent */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* ehostent */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* enetent */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* eprotoent */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* eservent */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* gpwnam */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* gpwuid */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* gpwent */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* spwent */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* epwent */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* ggrnam */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* ggrgid */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* ggrent */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* sgrent */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* egrent */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* getlogin */
+	MEMBER_TO_FPTR(Perl_ck_fun),	/* syscall */
+	MEMBER_TO_FPTR(Perl_ck_rfun),	/* lock */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* threadsv */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* setstate */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* method_named */
+	MEMBER_TO_FPTR(Perl_ck_null),	/* custom */
+};
+#endif
+
+#ifndef DOINIT
+EXT U32 PL_opargs[];
+#else
+EXT U32 PL_opargs[] = {
+	0x00000000,	/* null */
+	0x00000000,	/* stub */
+	0x00003604,	/* scalar */
+	0x00000004,	/* pushmark */
+	0x00000014,	/* wantarray */
+	0x00000c04,	/* const */
+	0x00000c44,	/* gvsv */
+	0x00000c44,	/* gv */
+	0x00022440,	/* gelem */
+	0x00000044,	/* padsv */
+	0x00000040,	/* padav */
+	0x00000040,	/* padhv */
+	0x00000040,	/* padany */
+	0x00000a40,	/* pushre */
+	0x00000244,	/* rv2gv */
+	0x00000244,	/* rv2sv */
+	0x00000214,	/* av2arylen */
+	0x00000240,	/* rv2cv */
+	0x00000c00,	/* anoncode */
+	0x00003604,	/* prototype */
+	0x00004201,	/* refgen */
+	0x00002206,	/* srefgen */
+	0x0001368c,	/* ref */
+	0x00122804,	/* bless */
+	0x00001608,	/* backtick */
+	0x00012808,	/* glob */
+	0x0001d608,	/* readline */
+	0x00000c08,	/* rcatline */
+	0x00002204,	/* regcmaybe */
+	0x00002204,	/* regcreset */
+	0x00002604,	/* regcomp */
+	0x00000a40,	/* match */
+	0x00000a04,	/* qr */
+	0x00002a54,	/* subst */
+	0x00000654,	/* substcont */
+	0x00003014,	/* trans */
+	0x00000004,	/* sassign */
+	0x00044408,	/* aassign */
+	0x0000560d,	/* chop */
+	0x0001368c,	/* schop */
+	0x0000570d,	/* chomp */
+	0x0001378c,	/* schomp */
+	0x00013694,	/* defined */
+	0x00013604,	/* undef */
+	0x00013684,	/* study */
+	0x0001368c,	/* pos */
+	0x00002264,	/* preinc */
+	0x00002254,	/* i_preinc */
+	0x00002264,	/* predec */
+	0x00002254,	/* i_predec */
+	0x0000226c,	/* postinc */
+	0x0000235c,	/* i_postinc */
+	0x0000226c,	/* postdec */
+	0x0000235c,	/* i_postdec */
+	0x0002250e,	/* pow */
+	0x0002252e,	/* multiply */
+	0x0002251e,	/* i_multiply */
+	0x0002252e,	/* divide */
+	0x0002251e,	/* i_divide */
+	0x0002253e,	/* modulo */
+	0x0002251e,	/* i_modulo */
+	0x00024409,	/* repeat */
+	0x0002252e,	/* add */
+	0x0002251e,	/* i_add */
+	0x0002252e,	/* subtract */
+	0x0002251e,	/* i_subtract */
+	0x0002250e,	/* concat */
+	0x0000290e,	/* stringify */
+	0x0002250e,	/* left_shift */
+	0x0002250e,	/* right_shift */
+	0x00022436,	/* lt */
+	0x00022416,	/* i_lt */
+	0x00022436,	/* gt */
+	0x00022416,	/* i_gt */
+	0x00022436,	/* le */
+	0x00022416,	/* i_le */
+	0x00022436,	/* ge */
+	0x00022416,	/* i_ge */
+	0x00022436,	/* eq */
+	0x00022416,	/* i_eq */
+	0x00022436,	/* ne */
+	0x00022416,	/* i_ne */
+	0x0002243e,	/* ncmp */
+	0x0002241e,	/* i_ncmp */
+	0x00022416,	/* slt */
+	0x00022416,	/* sgt */
+	0x00022416,	/* sle */
+	0x00022416,	/* sge */
+	0x00022416,	/* seq */
+	0x00022416,	/* sne */
+	0x0002241e,	/* scmp */
+	0x0002240e,	/* bit_and */
+	0x0002240e,	/* bit_xor */
+	0x0002240e,	/* bit_or */
+	0x0000222e,	/* negate */
+	0x0000231e,	/* i_negate */
+	0x00002216,	/* not */
+	0x0000220e,	/* complement */
+	0x0002290e,	/* atan2 */
+	0x0001378e,	/* sin */
+	0x0001378e,	/* cos */
+	0x0001370c,	/* rand */
+	0x00013604,	/* srand */
+	0x0001378e,	/* exp */
+	0x0001378e,	/* log */
+	0x0001378e,	/* sqrt */
+	0x0001378e,	/* int */
+	0x0001378e,	/* hex */
+	0x0001378e,	/* oct */
+	0x0001378e,	/* abs */
+	0x0001379c,	/* length */
+	0x1322280c,	/* substr */
+	0x0022281c,	/* vec */
+	0x0122291c,	/* index */
+	0x0122291c,	/* rindex */
+	0x0004280d,	/* sprintf */
+	0x00042805,	/* formline */
+	0x0001379e,	/* ord */
+	0x0001378e,	/* chr */
+	0x0002290e,	/* crypt */
+	0x0001368e,	/* ucfirst */
+	0x0001368e,	/* lcfirst */
+	0x0001368e,	/* uc */
+	0x0001368e,	/* lc */
+	0x0001368e,	/* quotemeta */
+	0x00000248,	/* rv2av */
+	0x00026c04,	/* aelemfast */
+	0x00026404,	/* aelem */
+	0x00046801,	/* aslice */
+	0x00009600,	/* each */
+	0x00009608,	/* values */
+	0x00009608,	/* keys */
+	0x00003600,	/* delete */
+	0x00003614,	/* exists */
+	0x00000248,	/* rv2hv */
+	0x00028404,	/* helem */
+	0x00048801,	/* hslice */
+	0x00022800,	/* unpack */
+	0x0004280d,	/* pack */
+	0x00222808,	/* split */
+	0x0004280d,	/* join */
+	0x00004801,	/* list */
+	0x00448400,	/* lslice */
+	0x00004805,	/* anonlist */
+	0x00004805,	/* anonhash */
+	0x05326801,	/* splice */
+	0x0004691d,	/* push */
+	0x00017604,	/* pop */
+	0x00017604,	/* shift */
+	0x0004691d,	/* unshift */
+	0x0005a801,	/* sort */
+	0x00004809,	/* reverse */
+	0x0004a841,	/* grepstart */
+	0x00000648,	/* grepwhile */
+	0x0004a841,	/* mapstart */
+	0x00000648,	/* mapwhile */
+	0x00022600,	/* range */
+	0x00022200,	/* flip */
+	0x00000200,	/* flop */
+	0x00000600,	/* and */
+	0x00000600,	/* or */
+	0x00022406,	/* xor */
+	0x00000640,	/* cond_expr */
+	0x00000604,	/* andassign */
+	0x00000604,	/* orassign */
+	0x00000240,	/* method */
+	0x00004249,	/* entersub */
+	0x00000200,	/* leavesub */
+	0x00000200,	/* leavesublv */
+	0x00013608,	/* caller */
+	0x0000481d,	/* warn */
+	0x0000485d,	/* die */
+	0x00013614,	/* reset */
+	0x00000800,	/* lineseq */
+	0x00001404,	/* nextstate */
+	0x00001404,	/* dbstate */
+	0x00000004,	/* unstack */
+	0x00000000,	/* enter */
+	0x00000800,	/* leave */
+	0x00000800,	/* scope */
+	0x00001240,	/* enteriter */
+	0x00000000,	/* iter */
+	0x00001240,	/* enterloop */
+	0x00000400,	/* leaveloop */
+	0x00004841,	/* return */
+	0x00001a44,	/* last */
+	0x00001a44,	/* next */
+	0x00001a44,	/* redo */
+	0x00001a44,	/* dump */
+	0x00001a44,	/* goto */
+	0x00013644,	/* exit */
+	0x0052c81d,	/* open */
+	0x0001d614,	/* close */
+	0x000cc814,	/* pipe_op */
+	0x0000d61c,	/* fileno */
+	0x0001361c,	/* umask */
+	0x0012c804,	/* binmode */
+	0x0042e855,	/* tie */
+	0x0000f614,	/* untie */
+	0x0000f604,	/* tied */
+	0x00228814,	/* dbmopen */
+	0x00009614,	/* dbmclose */
+	0x02222808,	/* sselect */
+	0x0001c80c,	/* select */
+	0x0001d60c,	/* getc */
+	0x122ec81d,	/* read */
+	0x0001d654,	/* enterwrite */
+	0x00000200,	/* leavewrite */
+	0x0005c815,	/* prtf */
+	0x0005c815,	/* print */
+	0x1222c804,	/* sysopen */
+	0x0022c804,	/* sysseek */
+	0x122ec81d,	/* sysread */
+	0x1322c81d,	/* syswrite */
+	0x1222c81d,	/* send */
+	0x022ec81d,	/* recv */
+	0x0001d614,	/* eof */
+	0x0001d60c,	/* tell */
+	0x0022c804,	/* seek */
+	0x00022814,	/* truncate */
+	0x0022c80c,	/* fcntl */
+	0x0022c80c,	/* ioctl */
+	0x0002c91c,	/* flock */
+	0x0222c814,	/* socket */
+	0x222cc814,	/* sockpair */
+	0x0002c814,	/* bind */
+	0x0002c814,	/* connect */
+	0x0002c814,	/* listen */
+	0x000cc81c,	/* accept */
+	0x0002c81c,	/* shutdown */
+	0x0022c814,	/* gsockopt */
+	0x0222c814,	/* ssockopt */
+	0x0000d614,	/* getsockname */
+	0x0000d614,	/* getpeername */
+	0x0000d880,	/* lstat */
+	0x0000d880,	/* stat */
+	0x0000d894,	/* ftrread */
+	0x0000d894,	/* ftrwrite */
+	0x0000d894,	/* ftrexec */
+	0x0000d894,	/* fteread */
+	0x0000d894,	/* ftewrite */
+	0x0000d894,	/* fteexec */
+	0x0000d894,	/* ftis */
+	0x0000d894,	/* fteowned */
+	0x0000d894,	/* ftrowned */
+	0x0000d894,	/* ftzero */
+	0x0000d89c,	/* ftsize */
+	0x0000d88c,	/* ftmtime */
+	0x0000d88c,	/* ftatime */
+	0x0000d88c,	/* ftctime */
+	0x0000d894,	/* ftsock */
+	0x0000d894,	/* ftchr */
+	0x0000d894,	/* ftblk */
+	0x0000d894,	/* ftfile */
+	0x0000d894,	/* ftdir */
+	0x0000d894,	/* ftpipe */
+	0x0000d894,	/* ftlink */
+	0x0000d894,	/* ftsuid */
+	0x0000d894,	/* ftsgid */
+	0x0000d894,	/* ftsvtx */
+	0x0000d814,	/* fttty */
+	0x0000d894,	/* fttext */
+	0x0000d894,	/* ftbinary */
+	0x0001371c,	/* chdir */
+	0x0000491d,	/* chown */
+	0x0001379c,	/* chroot */
+	0x0000499d,	/* unlink */
+	0x0000491d,	/* chmod */
+	0x0000491d,	/* utime */
+	0x0002291c,	/* rename */
+	0x0002291c,	/* link */
+	0x0002291c,	/* symlink */
+	0x0001368c,	/* readlink */
+	0x0012291c,	/* mkdir */
+	0x0001379c,	/* rmdir */
+	0x0002c814,	/* open_dir */
+	0x0000d600,	/* readdir */
+	0x0000d60c,	/* telldir */
+	0x0002c804,	/* seekdir */
+	0x0000d604,	/* rewinddir */
+	0x0000d614,	/* closedir */
+	0x0000001c,	/* fork */
+	0x0000011c,	/* wait */
+	0x0002291c,	/* waitpid */
+	0x0005291d,	/* system */
+	0x0005295d,	/* exec */
+	0x0000495d,	/* kill */
+	0x0000011c,	/* getppid */
+	0x0001371c,	/* getpgrp */
+	0x0013291c,	/* setpgrp */
+	0x0002291c,	/* getpriority */
+	0x0022291c,	/* setpriority */
+	0x0000011c,	/* time */
+	0x00000000,	/* tms */
+	0x00013608,	/* localtime */
+	0x00013608,	/* gmtime */
+	0x0001369c,	/* alarm */
+	0x0001371c,	/* sleep */
+	0x0022281d,	/* shmget */
+	0x0022281d,	/* shmctl */
+	0x0222281d,	/* shmread */
+	0x0222281d,	/* shmwrite */
+	0x0002281d,	/* msgget */
+	0x0022281d,	/* msgctl */
+	0x0022281d,	/* msgsnd */
+	0x2222281d,	/* msgrcv */
+	0x0022281d,	/* semget */
+	0x0222281d,	/* semctl */
+	0x0002281d,	/* semop */
+	0x000136c0,	/* require */
+	0x00002240,	/* dofile */
+	0x00003640,	/* entereval */
+	0x00002200,	/* leaveeval */
+	0x00000600,	/* entertry */
+	0x00000800,	/* leavetry */
+	0x00003600,	/* ghbyname */
+	0x00022800,	/* ghbyaddr */
+	0x00000000,	/* ghostent */
+	0x00003600,	/* gnbyname */
+	0x00022800,	/* gnbyaddr */
+	0x00000000,	/* gnetent */
+	0x00003600,	/* gpbyname */
+	0x00002800,	/* gpbynumber */
+	0x00000000,	/* gprotoent */
+	0x00022800,	/* gsbyname */
+	0x00022800,	/* gsbyport */
+	0x00000000,	/* gservent */
+	0x00003614,	/* shostent */
+	0x00003614,	/* snetent */
+	0x00003614,	/* sprotoent */
+	0x00003614,	/* sservent */
+	0x00000014,	/* ehostent */
+	0x00000014,	/* enetent */
+	0x00000014,	/* eprotoent */
+	0x00000014,	/* eservent */
+	0x00003600,	/* gpwnam */
+	0x00003600,	/* gpwuid */
+	0x00000000,	/* gpwent */
+	0x00000014,	/* spwent */
+	0x00000014,	/* epwent */
+	0x00003600,	/* ggrnam */
+	0x00003600,	/* ggrgid */
+	0x00000000,	/* ggrent */
+	0x00000014,	/* sgrent */
+	0x00000014,	/* egrent */
+	0x0000000c,	/* getlogin */
+	0x0004281d,	/* syscall */
+	0x0000f604,	/* lock */
+	0x00000044,	/* threadsv */
+	0x00001404,	/* setstate */
+	0x00000c40,	/* method_named */
+	0x00000000,	/* custom */
+};
+#endif
+
+END_EXTERN_C
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/opnames.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/opnames.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/opnames.h	(revision 14489)
@@ -0,0 +1,423 @@
+/* -*- buffer-read-only: t -*-
+ *
+ *    opnames.h
+ *
+ *    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ *    by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ *
+ * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ *  This file is built by opcode.pl from its data.  Any changes made here
+ *  will be lost!
+ */
+
+typedef enum opcode {
+	OP_NULL,	/* 0 */
+	OP_STUB,	/* 1 */
+	OP_SCALAR,	/* 2 */
+	OP_PUSHMARK,	/* 3 */
+	OP_WANTARRAY,	/* 4 */
+	OP_CONST,	/* 5 */
+	OP_GVSV,	/* 6 */
+	OP_GV,		/* 7 */
+	OP_GELEM,	/* 8 */
+	OP_PADSV,	/* 9 */
+	OP_PADAV,	/* 10 */
+	OP_PADHV,	/* 11 */
+	OP_PADANY,	/* 12 */
+	OP_PUSHRE,	/* 13 */
+	OP_RV2GV,	/* 14 */
+	OP_RV2SV,	/* 15 */
+	OP_AV2ARYLEN,	/* 16 */
+	OP_RV2CV,	/* 17 */
+	OP_ANONCODE,	/* 18 */
+	OP_PROTOTYPE,	/* 19 */
+	OP_REFGEN,	/* 20 */
+	OP_SREFGEN,	/* 21 */
+	OP_REF,		/* 22 */
+	OP_BLESS,	/* 23 */
+	OP_BACKTICK,	/* 24 */
+	OP_GLOB,	/* 25 */
+	OP_READLINE,	/* 26 */
+	OP_RCATLINE,	/* 27 */
+	OP_REGCMAYBE,	/* 28 */
+	OP_REGCRESET,	/* 29 */
+	OP_REGCOMP,	/* 30 */
+	OP_MATCH,	/* 31 */
+	OP_QR,		/* 32 */
+	OP_SUBST,	/* 33 */
+	OP_SUBSTCONT,	/* 34 */
+	OP_TRANS,	/* 35 */
+	OP_SASSIGN,	/* 36 */
+	OP_AASSIGN,	/* 37 */
+	OP_CHOP,	/* 38 */
+	OP_SCHOP,	/* 39 */
+	OP_CHOMP,	/* 40 */
+	OP_SCHOMP,	/* 41 */
+	OP_DEFINED,	/* 42 */
+	OP_UNDEF,	/* 43 */
+	OP_STUDY,	/* 44 */
+	OP_POS,		/* 45 */
+	OP_PREINC,	/* 46 */
+	OP_I_PREINC,	/* 47 */
+	OP_PREDEC,	/* 48 */
+	OP_I_PREDEC,	/* 49 */
+	OP_POSTINC,	/* 50 */
+	OP_I_POSTINC,	/* 51 */
+	OP_POSTDEC,	/* 52 */
+	OP_I_POSTDEC,	/* 53 */
+	OP_POW,		/* 54 */
+	OP_MULTIPLY,	/* 55 */
+	OP_I_MULTIPLY,	/* 56 */
+	OP_DIVIDE,	/* 57 */
+	OP_I_DIVIDE,	/* 58 */
+	OP_MODULO,	/* 59 */
+	OP_I_MODULO,	/* 60 */
+	OP_REPEAT,	/* 61 */
+	OP_ADD,		/* 62 */
+	OP_I_ADD,	/* 63 */
+	OP_SUBTRACT,	/* 64 */
+	OP_I_SUBTRACT,	/* 65 */
+	OP_CONCAT,	/* 66 */
+	OP_STRINGIFY,	/* 67 */
+	OP_LEFT_SHIFT,	/* 68 */
+	OP_RIGHT_SHIFT,	/* 69 */
+	OP_LT,		/* 70 */
+	OP_I_LT,	/* 71 */
+	OP_GT,		/* 72 */
+	OP_I_GT,	/* 73 */
+	OP_LE,		/* 74 */
+	OP_I_LE,	/* 75 */
+	OP_GE,		/* 76 */
+	OP_I_GE,	/* 77 */
+	OP_EQ,		/* 78 */
+	OP_I_EQ,	/* 79 */
+	OP_NE,		/* 80 */
+	OP_I_NE,	/* 81 */
+	OP_NCMP,	/* 82 */
+	OP_I_NCMP,	/* 83 */
+	OP_SLT,		/* 84 */
+	OP_SGT,		/* 85 */
+	OP_SLE,		/* 86 */
+	OP_SGE,		/* 87 */
+	OP_SEQ,		/* 88 */
+	OP_SNE,		/* 89 */
+	OP_SCMP,	/* 90 */
+	OP_BIT_AND,	/* 91 */
+	OP_BIT_XOR,	/* 92 */
+	OP_BIT_OR,	/* 93 */
+	OP_NEGATE,	/* 94 */
+	OP_I_NEGATE,	/* 95 */
+	OP_NOT,		/* 96 */
+	OP_COMPLEMENT,	/* 97 */
+	OP_ATAN2,	/* 98 */
+	OP_SIN,		/* 99 */
+	OP_COS,		/* 100 */
+	OP_RAND,	/* 101 */
+	OP_SRAND,	/* 102 */
+	OP_EXP,		/* 103 */
+	OP_LOG,		/* 104 */
+	OP_SQRT,	/* 105 */
+	OP_INT,		/* 106 */
+	OP_HEX,		/* 107 */
+	OP_OCT,		/* 108 */
+	OP_ABS,		/* 109 */
+	OP_LENGTH,	/* 110 */
+	OP_SUBSTR,	/* 111 */
+	OP_VEC,		/* 112 */
+	OP_INDEX,	/* 113 */
+	OP_RINDEX,	/* 114 */
+	OP_SPRINTF,	/* 115 */
+	OP_FORMLINE,	/* 116 */
+	OP_ORD,		/* 117 */
+	OP_CHR,		/* 118 */
+	OP_CRYPT,	/* 119 */
+	OP_UCFIRST,	/* 120 */
+	OP_LCFIRST,	/* 121 */
+	OP_UC,		/* 122 */
+	OP_LC,		/* 123 */
+	OP_QUOTEMETA,	/* 124 */
+	OP_RV2AV,	/* 125 */
+	OP_AELEMFAST,	/* 126 */
+	OP_AELEM,	/* 127 */
+	OP_ASLICE,	/* 128 */
+	OP_EACH,	/* 129 */
+	OP_VALUES,	/* 130 */
+	OP_KEYS,	/* 131 */
+	OP_DELETE,	/* 132 */
+	OP_EXISTS,	/* 133 */
+	OP_RV2HV,	/* 134 */
+	OP_HELEM,	/* 135 */
+	OP_HSLICE,	/* 136 */
+	OP_UNPACK,	/* 137 */
+	OP_PACK,	/* 138 */
+	OP_SPLIT,	/* 139 */
+	OP_JOIN,	/* 140 */
+	OP_LIST,	/* 141 */
+	OP_LSLICE,	/* 142 */
+	OP_ANONLIST,	/* 143 */
+	OP_ANONHASH,	/* 144 */
+	OP_SPLICE,	/* 145 */
+	OP_PUSH,	/* 146 */
+	OP_POP,		/* 147 */
+	OP_SHIFT,	/* 148 */
+	OP_UNSHIFT,	/* 149 */
+	OP_SORT,	/* 150 */
+	OP_REVERSE,	/* 151 */
+	OP_GREPSTART,	/* 152 */
+	OP_GREPWHILE,	/* 153 */
+	OP_MAPSTART,	/* 154 */
+	OP_MAPWHILE,	/* 155 */
+	OP_RANGE,	/* 156 */
+	OP_FLIP,	/* 157 */
+	OP_FLOP,	/* 158 */
+	OP_AND,		/* 159 */
+	OP_OR,		/* 160 */
+	OP_XOR,		/* 161 */
+	OP_COND_EXPR,	/* 162 */
+	OP_ANDASSIGN,	/* 163 */
+	OP_ORASSIGN,	/* 164 */
+	OP_METHOD,	/* 165 */
+	OP_ENTERSUB,	/* 166 */
+	OP_LEAVESUB,	/* 167 */
+	OP_LEAVESUBLV,	/* 168 */
+	OP_CALLER,	/* 169 */
+	OP_WARN,	/* 170 */
+	OP_DIE,		/* 171 */
+	OP_RESET,	/* 172 */
+	OP_LINESEQ,	/* 173 */
+	OP_NEXTSTATE,	/* 174 */
+	OP_DBSTATE,	/* 175 */
+	OP_UNSTACK,	/* 176 */
+	OP_ENTER,	/* 177 */
+	OP_LEAVE,	/* 178 */
+	OP_SCOPE,	/* 179 */
+	OP_ENTERITER,	/* 180 */
+	OP_ITER,	/* 181 */
+	OP_ENTERLOOP,	/* 182 */
+	OP_LEAVELOOP,	/* 183 */
+	OP_RETURN,	/* 184 */
+	OP_LAST,	/* 185 */
+	OP_NEXT,	/* 186 */
+	OP_REDO,	/* 187 */
+	OP_DUMP,	/* 188 */
+	OP_GOTO,	/* 189 */
+	OP_EXIT,	/* 190 */
+	OP_OPEN,	/* 191 */
+	OP_CLOSE,	/* 192 */
+	OP_PIPE_OP,	/* 193 */
+	OP_FILENO,	/* 194 */
+	OP_UMASK,	/* 195 */
+	OP_BINMODE,	/* 196 */
+	OP_TIE,		/* 197 */
+	OP_UNTIE,	/* 198 */
+	OP_TIED,	/* 199 */
+	OP_DBMOPEN,	/* 200 */
+	OP_DBMCLOSE,	/* 201 */
+	OP_SSELECT,	/* 202 */
+	OP_SELECT,	/* 203 */
+	OP_GETC,	/* 204 */
+	OP_READ,	/* 205 */
+	OP_ENTERWRITE,	/* 206 */
+	OP_LEAVEWRITE,	/* 207 */
+	OP_PRTF,	/* 208 */
+	OP_PRINT,	/* 209 */
+	OP_SYSOPEN,	/* 210 */
+	OP_SYSSEEK,	/* 211 */
+	OP_SYSREAD,	/* 212 */
+	OP_SYSWRITE,	/* 213 */
+	OP_SEND,	/* 214 */
+	OP_RECV,	/* 215 */
+	OP_EOF,		/* 216 */
+	OP_TELL,	/* 217 */
+	OP_SEEK,	/* 218 */
+	OP_TRUNCATE,	/* 219 */
+	OP_FCNTL,	/* 220 */
+	OP_IOCTL,	/* 221 */
+	OP_FLOCK,	/* 222 */
+	OP_SOCKET,	/* 223 */
+	OP_SOCKPAIR,	/* 224 */
+	OP_BIND,	/* 225 */
+	OP_CONNECT,	/* 226 */
+	OP_LISTEN,	/* 227 */
+	OP_ACCEPT,	/* 228 */
+	OP_SHUTDOWN,	/* 229 */
+	OP_GSOCKOPT,	/* 230 */
+	OP_SSOCKOPT,	/* 231 */
+	OP_GETSOCKNAME,	/* 232 */
+	OP_GETPEERNAME,	/* 233 */
+	OP_LSTAT,	/* 234 */
+	OP_STAT,	/* 235 */
+	OP_FTRREAD,	/* 236 */
+	OP_FTRWRITE,	/* 237 */
+	OP_FTREXEC,	/* 238 */
+	OP_FTEREAD,	/* 239 */
+	OP_FTEWRITE,	/* 240 */
+	OP_FTEEXEC,	/* 241 */
+	OP_FTIS,	/* 242 */
+	OP_FTEOWNED,	/* 243 */
+	OP_FTROWNED,	/* 244 */
+	OP_FTZERO,	/* 245 */
+	OP_FTSIZE,	/* 246 */
+	OP_FTMTIME,	/* 247 */
+	OP_FTATIME,	/* 248 */
+	OP_FTCTIME,	/* 249 */
+	OP_FTSOCK,	/* 250 */
+	OP_FTCHR,	/* 251 */
+	OP_FTBLK,	/* 252 */
+	OP_FTFILE,	/* 253 */
+	OP_FTDIR,	/* 254 */
+	OP_FTPIPE,	/* 255 */
+	OP_FTLINK,	/* 256 */
+	OP_FTSUID,	/* 257 */
+	OP_FTSGID,	/* 258 */
+	OP_FTSVTX,	/* 259 */
+	OP_FTTTY,	/* 260 */
+	OP_FTTEXT,	/* 261 */
+	OP_FTBINARY,	/* 262 */
+	OP_CHDIR,	/* 263 */
+	OP_CHOWN,	/* 264 */
+	OP_CHROOT,	/* 265 */
+	OP_UNLINK,	/* 266 */
+	OP_CHMOD,	/* 267 */
+	OP_UTIME,	/* 268 */
+	OP_RENAME,	/* 269 */
+	OP_LINK,	/* 270 */
+	OP_SYMLINK,	/* 271 */
+	OP_READLINK,	/* 272 */
+	OP_MKDIR,	/* 273 */
+	OP_RMDIR,	/* 274 */
+	OP_OPEN_DIR,	/* 275 */
+	OP_READDIR,	/* 276 */
+	OP_TELLDIR,	/* 277 */
+	OP_SEEKDIR,	/* 278 */
+	OP_REWINDDIR,	/* 279 */
+	OP_CLOSEDIR,	/* 280 */
+	OP_FORK,	/* 281 */
+	OP_WAIT,	/* 282 */
+	OP_WAITPID,	/* 283 */
+	OP_SYSTEM,	/* 284 */
+	OP_EXEC,	/* 285 */
+	OP_KILL,	/* 286 */
+	OP_GETPPID,	/* 287 */
+	OP_GETPGRP,	/* 288 */
+	OP_SETPGRP,	/* 289 */
+	OP_GETPRIORITY,	/* 290 */
+	OP_SETPRIORITY,	/* 291 */
+	OP_TIME,	/* 292 */
+	OP_TMS,		/* 293 */
+	OP_LOCALTIME,	/* 294 */
+	OP_GMTIME,	/* 295 */
+	OP_ALARM,	/* 296 */
+	OP_SLEEP,	/* 297 */
+	OP_SHMGET,	/* 298 */
+	OP_SHMCTL,	/* 299 */
+	OP_SHMREAD,	/* 300 */
+	OP_SHMWRITE,	/* 301 */
+	OP_MSGGET,	/* 302 */
+	OP_MSGCTL,	/* 303 */
+	OP_MSGSND,	/* 304 */
+	OP_MSGRCV,	/* 305 */
+	OP_SEMGET,	/* 306 */
+	OP_SEMCTL,	/* 307 */
+	OP_SEMOP,	/* 308 */
+	OP_REQUIRE,	/* 309 */
+	OP_DOFILE,	/* 310 */
+	OP_ENTEREVAL,	/* 311 */
+	OP_LEAVEEVAL,	/* 312 */
+	OP_ENTERTRY,	/* 313 */
+	OP_LEAVETRY,	/* 314 */
+	OP_GHBYNAME,	/* 315 */
+	OP_GHBYADDR,	/* 316 */
+	OP_GHOSTENT,	/* 317 */
+	OP_GNBYNAME,	/* 318 */
+	OP_GNBYADDR,	/* 319 */
+	OP_GNETENT,	/* 320 */
+	OP_GPBYNAME,	/* 321 */
+	OP_GPBYNUMBER,	/* 322 */
+	OP_GPROTOENT,	/* 323 */
+	OP_GSBYNAME,	/* 324 */
+	OP_GSBYPORT,	/* 325 */
+	OP_GSERVENT,	/* 326 */
+	OP_SHOSTENT,	/* 327 */
+	OP_SNETENT,	/* 328 */
+	OP_SPROTOENT,	/* 329 */
+	OP_SSERVENT,	/* 330 */
+	OP_EHOSTENT,	/* 331 */
+	OP_ENETENT,	/* 332 */
+	OP_EPROTOENT,	/* 333 */
+	OP_ESERVENT,	/* 334 */
+	OP_GPWNAM,	/* 335 */
+	OP_GPWUID,	/* 336 */
+	OP_GPWENT,	/* 337 */
+	OP_SPWENT,	/* 338 */
+	OP_EPWENT,	/* 339 */
+	OP_GGRNAM,	/* 340 */
+	OP_GGRGID,	/* 341 */
+	OP_GGRENT,	/* 342 */
+	OP_SGRENT,	/* 343 */
+	OP_EGRENT,	/* 344 */
+	OP_GETLOGIN,	/* 345 */
+	OP_SYSCALL,	/* 346 */
+	OP_LOCK,	/* 347 */
+	OP_THREADSV,	/* 348 */
+	OP_SETSTATE,	/* 349 */
+	OP_METHOD_NAMED,/* 350 */
+	OP_CUSTOM,	/* 351 */
+	OP_max		
+} opcode;
+
+#define MAXO 352
+#define OP_phoney_INPUT_ONLY -1
+#define OP_phoney_OUTPUT_ONLY -2
+
+
+#define OP_IS_SOCKET(op)	\
+	((op) == OP_ACCEPT || \
+	 (op) == OP_BIND || \
+	 (op) == OP_CONNECT || \
+	 (op) == OP_GETPEERNAME || \
+	 (op) == OP_GETSOCKNAME || \
+	 (op) == OP_GSOCKOPT || \
+	 (op) == OP_LISTEN || \
+	 (op) == OP_RECV || \
+	 (op) == OP_SEND || \
+	 (op) == OP_SHUTDOWN || \
+	 (op) == OP_SOCKET || \
+	 (op) == OP_SOCKPAIR || \
+	 (op) == OP_SSOCKOPT)
+
+
+#define OP_IS_FILETEST(op)	\
+	((op) == OP_FTATIME || \
+	 (op) == OP_FTBINARY || \
+	 (op) == OP_FTBLK || \
+	 (op) == OP_FTCHR || \
+	 (op) == OP_FTCTIME || \
+	 (op) == OP_FTDIR || \
+	 (op) == OP_FTEEXEC || \
+	 (op) == OP_FTEOWNED || \
+	 (op) == OP_FTEREAD || \
+	 (op) == OP_FTEWRITE || \
+	 (op) == OP_FTFILE || \
+	 (op) == OP_FTIS || \
+	 (op) == OP_FTLINK || \
+	 (op) == OP_FTMTIME || \
+	 (op) == OP_FTPIPE || \
+	 (op) == OP_FTREXEC || \
+	 (op) == OP_FTROWNED || \
+	 (op) == OP_FTRREAD || \
+	 (op) == OP_FTRWRITE || \
+	 (op) == OP_FTSGID || \
+	 (op) == OP_FTSIZE || \
+	 (op) == OP_FTSOCK || \
+	 (op) == OP_FTSUID || \
+	 (op) == OP_FTSVTX || \
+	 (op) == OP_FTTEXT || \
+	 (op) == OP_FTTTY || \
+	 (op) == OP_FTZERO)
+
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/pad.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/pad.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/pad.h	(revision 14489)
@@ -0,0 +1,276 @@
+/*    pad.h
+ *
+ *    Copyright (C) 2002, 2003, 2005, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * This file defines the types and macros associated with the API for
+ * manipulating scratchpads, which are used by perl to store lexical
+ * variables, op targets and constants.
+ */
+
+
+
+
+/* a padlist is currently just an AV; but that might change,
+ * so hide the type. Ditto a pad.  */
+
+typedef AV PADLIST;
+typedef AV PAD;
+
+
+/* offsets within a pad */
+
+#if PTRSIZE == 4
+typedef U32TYPE PADOFFSET;
+#else
+#   if PTRSIZE == 8
+typedef U64TYPE PADOFFSET;
+#   endif
+#endif
+#define NOT_IN_PAD ((PADOFFSET) -1)
+ 
+
+/* flags for the pad_new() function */
+
+#define padnew_CLONE	1	/* this pad is for a cloned CV */
+#define padnew_SAVE	2	/* save old globals */
+#define padnew_SAVESUB	4	/* also save extra stuff for start of sub */
+
+/* values for the pad_tidy() function */
+
+typedef enum {
+	padtidy_SUB,		/* tidy up a pad for a sub, */
+	padtidy_SUBCLONE,	/* a cloned sub, */
+	padtidy_FORMAT		/* or a format */
+} padtidy_type;
+
+/* ASSERT_CURPAD_LEGAL and ASSERT_CURPAD_ACTIVE respectively determine
+ * whether PL_comppad and PL_curpad are consistent and whether they have
+ * active values */
+
+#ifdef DEBUGGING
+#  define ASSERT_CURPAD_LEGAL(label) \
+    if (PL_comppad ? (AvARRAY(PL_comppad) != PL_curpad) : (PL_curpad != 0))  \
+	Perl_croak(aTHX_ "panic: illegal pad in %s: 0x%"UVxf"[0x%"UVxf"]",\
+	    label, PTR2UV(PL_comppad), PTR2UV(PL_curpad));
+
+
+#  define ASSERT_CURPAD_ACTIVE(label) \
+    if (!PL_comppad || (AvARRAY(PL_comppad) != PL_curpad))		  \
+	Perl_croak(aTHX_ "panic: invalid pad in %s: 0x%"UVxf"[0x%"UVxf"]",\
+	    label, PTR2UV(PL_comppad), PTR2UV(PL_curpad));
+#else
+#  define ASSERT_CURPAD_LEGAL(label)
+#  define ASSERT_CURPAD_ACTIVE(label)
+#endif
+
+
+
+/* Note: the following three macros are actually defined in scope.h, but
+ * they are documented here for completeness, since they directly or
+ * indirectly affect pads.
+
+=for apidoc m|void|SAVEPADSV	|PADOFFSET po
+Save a pad slot (used to restore after an iteration)
+
+XXX DAPM it would make more sense to make the arg a PADOFFSET
+=for apidoc m|void|SAVECLEARSV	|SV **svp
+Clear the pointed to pad value on scope exit. (i.e. the runtime action of 'my')
+
+=for apidoc m|void|SAVECOMPPAD
+save PL_comppad and PL_curpad
+
+
+
+
+
+=for apidoc m|SV *|PAD_SETSV	|PADOFFSET po|SV* sv
+Set the slot at offset C<po> in the current pad to C<sv>
+
+=for apidoc m|void|PAD_SV	|PADOFFSET po
+Get the value at offset C<po> in the current pad
+
+=for apidoc m|SV *|PAD_SVl	|PADOFFSET po
+Lightweight and lvalue version of C<PAD_SV>.
+Get or set the value at offset C<po> in the current pad.
+Unlike C<PAD_SV>, does not print diagnostics with -DX.
+For internal use only.
+
+=for apidoc m|SV *|PAD_BASE_SV	|PADLIST padlist|PADOFFSET po
+Get the value from slot C<po> in the base (DEPTH=1) pad of a padlist
+
+=for apidoc m|void|PAD_SET_CUR	|PADLIST padlist|I32 n
+Set the current pad to be pad C<n> in the padlist, saving
+the previous current pad. NB currently this macro expands to a string too
+long for some compilers, so it's best to replace it with
+
+    SAVECOMPPAD();
+    PAD_SET_CUR_NOSAVE(padlist,n);
+
+
+=for apidoc m|void|PAD_SET_CUR_NOSAVE	|PADLIST padlist|I32 n
+like PAD_SET_CUR, but without the save
+
+=for apidoc m|void|PAD_SAVE_SETNULLPAD
+Save the current pad then set it to null.
+
+=for apidoc m|void|PAD_SAVE_LOCAL|PAD *opad|PAD *npad
+Save the current pad to the local variable opad, then make the
+current pad equal to npad
+
+=for apidoc m|void|PAD_RESTORE_LOCAL|PAD *opad
+Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL()
+
+=cut
+*/
+
+#ifdef DEBUGGING
+#  define PAD_SV(po)	   pad_sv(po)
+#  define PAD_SETSV(po,sv) pad_setsv(po,sv)
+#else
+#  define PAD_SV(po)       (PL_curpad[po])
+#  define PAD_SETSV(po,sv) PL_curpad[po] = (sv)
+#endif
+
+#define PAD_SVl(po)       (PL_curpad[po])
+
+#define PAD_BASE_SV(padlist, po) \
+	(AvARRAY(padlist)[1]) 	\
+	    ? AvARRAY((AV*)(AvARRAY(padlist)[1]))[po] : Nullsv;
+    
+
+#define PAD_SET_CUR_NOSAVE(padlist,n) \
+	PL_comppad = (PAD*) (AvARRAY(padlist)[n]);		\
+	PL_curpad = AvARRAY(PL_comppad);			\
+	DEBUG_Xv(PerlIO_printf(Perl_debug_log,			\
+	      "Pad 0x%"UVxf"[0x%"UVxf"] set_cur    depth=%d\n",	\
+	      PTR2UV(PL_comppad), PTR2UV(PL_curpad), (int)(n)));
+
+
+#define PAD_SET_CUR(padlist,n) \
+	SAVECOMPPAD();						\
+	PAD_SET_CUR_NOSAVE(padlist,n);
+
+
+#define PAD_SAVE_SETNULLPAD()	SAVECOMPPAD(); \
+	PL_comppad = Null(PAD*); PL_curpad = Null(SV**);	\
+	DEBUG_Xv(PerlIO_printf(Perl_debug_log, "Pad set_null\n"));
+
+#define PAD_SAVE_LOCAL(opad,npad) \
+	opad = PL_comppad;					\
+	PL_comppad = (npad);					\
+	PL_curpad =  PL_comppad ? AvARRAY(PL_comppad) : Null(SV**); \
+	DEBUG_Xv(PerlIO_printf(Perl_debug_log,			\
+	      "Pad 0x%"UVxf"[0x%"UVxf"] save_local\n",		\
+	      PTR2UV(PL_comppad), PTR2UV(PL_curpad)));
+
+#define PAD_RESTORE_LOCAL(opad) \
+	PL_comppad = opad;					\
+	PL_curpad =  PL_comppad ? AvARRAY(PL_comppad) : Null(SV**); \
+	DEBUG_Xv(PerlIO_printf(Perl_debug_log,			\
+	      "Pad 0x%"UVxf"[0x%"UVxf"] restore_local\n",	\
+	      PTR2UV(PL_comppad), PTR2UV(PL_curpad)));
+
+
+/*
+=for apidoc m|void|CX_CURPAD_SAVE|struct context
+Save the current pad in the given context block structure.
+
+=for apidoc m|SV *|CX_CURPAD_SV|struct context|PADOFFSET po
+Access the SV at offset po in the saved current pad in the given
+context block structure (can be used as an lvalue).
+
+=cut
+*/
+
+#define CX_CURPAD_SAVE(block)  (block).oldcomppad = PL_comppad
+#define CX_CURPAD_SV(block,po) (AvARRAY((AV*)((block).oldcomppad))[po])
+
+
+/*
+=for apidoc m|U32|PAD_COMPNAME_FLAGS|PADOFFSET po
+Return the flags for the current compiling pad name
+at offset C<po>. Assumes a valid slot entry.
+
+=for apidoc m|char *|PAD_COMPNAME_PV|PADOFFSET po
+Return the name of the current compiling pad name
+at offset C<po>. Assumes a valid slot entry.
+
+=for apidoc m|HV *|PAD_COMPNAME_TYPE|PADOFFSET po
+Return the type (stash) of the current compiling pad name at offset
+C<po>. Must be a valid name. Returns null if not typed.
+
+=for apidoc m|HV *|PAD_COMPNAME_OURSTASH|PADOFFSET po
+Return the stash associated with an C<our> variable.
+Assumes the slot entry is a valid C<our> lexical.
+
+=for apidoc m|STRLEN|PAD_COMPNAME_GEN|PADOFFSET po
+The generation number of the name at offset C<po> in the current
+compiling pad (lvalue). Note that C<SvCUR> is hijacked for this purpose.
+
+=for apidoc m|STRLEN|PAD_COMPNAME_GEN_set|PADOFFSET po|int gen
+Sets the generation number of the name at offset C<po> in the current
+ling pad (lvalue) to C<gen>.  Note that C<SvCUR_set> is hijacked for this purpose.
+
+=cut
+
+*/
+
+#define PAD_COMPNAME_FLAGS(po) SvFLAGS(*av_fetch(PL_comppad_name, (po), FALSE))
+#define PAD_COMPNAME_PV(po) SvPV_nolen(*av_fetch(PL_comppad_name, (po), FALSE))
+
+#define PAD_COMPNAME_TYPE(po) pad_compname_type(po)
+
+#define PAD_COMPNAME_OURSTASH(po) \
+    (GvSTASH(*av_fetch(PL_comppad_name, (po), FALSE)))
+
+#define PAD_COMPNAME_GEN(po) SvCUR(AvARRAY(PL_comppad_name)[po])
+
+#define PAD_COMPNAME_GEN_set(po, gen) SvCUR_set(AvARRAY(PL_comppad_name)[po], gen)
+
+
+/*
+=for apidoc m|void|PAD_DUP|PADLIST dstpad|PADLIST srcpad|CLONE_PARAMS* param
+Clone a padlist.
+
+=for apidoc m|void|PAD_CLONE_VARS|PerlInterpreter *proto_perl \
+|CLONE_PARAMS* param
+Clone the state variables associated with running and compiling pads.
+
+=cut
+*/
+
+
+#define PAD_DUP(dstpad, srcpad, param)				\
+    if ((srcpad) && !AvREAL(srcpad)) {				\
+	/* XXX padlists are real, but pretend to be not */ 	\
+	AvREAL_on(srcpad);					\
+	(dstpad) = av_dup_inc((srcpad), param);			\
+	AvREAL_off(srcpad);					\
+	AvREAL_off(dstpad);					\
+    }								\
+    else							\
+	(dstpad) = av_dup_inc((srcpad), param);			
+
+/* NB - we set PL_comppad to null unless it points at a value that
+ * has already been dup'ed, ie it points to part of an active padlist.
+ * Otherwise PL_comppad ends up being a leaked scalar in code like
+ * the following:
+ *     threads->create(sub { threads->create(sub {...} ) } );
+ * where the second thread dups the outer sub's comppad but not the
+ * sub's CV or padlist. */
+
+#define PAD_CLONE_VARS(proto_perl, param)				\
+    PL_comppad = ptr_table_fetch(PL_ptr_table, proto_perl->Tcomppad);	\
+    PL_curpad = PL_comppad ?  AvARRAY(PL_comppad) : Null(SV**);		\
+    PL_comppad_name		= av_dup(proto_perl->Icomppad_name, param); \
+    PL_comppad_name_fill	= proto_perl->Icomppad_name_fill;	\
+    PL_comppad_name_floor	= proto_perl->Icomppad_name_floor;	\
+    PL_min_intro_pending	= proto_perl->Imin_intro_pending;	\
+    PL_max_intro_pending	= proto_perl->Imax_intro_pending;	\
+    PL_padix			= proto_perl->Ipadix;			\
+    PL_padix_floor		= proto_perl->Ipadix_floor;		\
+    PL_pad_reset_pending	= proto_perl->Ipad_reset_pending;	\
+    PL_cop_seqmax		= proto_perl->Icop_seqmax;
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/patchlevel.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/patchlevel.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/patchlevel.h	(revision 14489)
@@ -0,0 +1,137 @@
+/*    patchlevel.h
+ *
+ *    Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifndef __PATCHLEVEL_H_INCLUDED__
+
+/* do not adjust the whitespace! Configure expects the numbers to be
+ * exactly on the third column */
+
+#define PERL_REVISION	5		/* age */
+#define PERL_VERSION	8		/* epoch */
+#define PERL_SUBVERSION	8		/* generation */
+
+/* The following numbers describe the earliest compatible version of
+   Perl ("compatibility" here being defined as sufficient binary/API
+   compatibility to run XS code built with the older version).
+   Normally this should not change across maintenance releases.
+
+   Note that this only refers to an out-of-the-box build.  Many non-default
+   options such as usemultiplicity tend to break binary compatibility
+   more often.
+
+   This is used by Configure et al to figure out 
+   PERL_INC_VERSION_LIST, which lists version libraries
+   to include in @INC.  See INSTALL for how this works.
+*/
+#define PERL_API_REVISION	5	/* Adjust manually as needed.  */
+#define PERL_API_VERSION	8	/* Adjust manually as needed.  */
+#define PERL_API_SUBVERSION	0	/* Adjust manually as needed.  */
+/*
+   XXX Note:  The selection of non-default Configure options, such
+   as -Duselonglong may invalidate these settings.  Currently, Configure
+   does not adequately test for this.   A.D.  Jan 13, 2000
+*/
+
+#define __PATCHLEVEL_H_INCLUDED__
+#endif
+
+/*
+	local_patches -- list of locally applied less-than-subversion patches.
+	If you're distributing such a patch, please give it a name and a
+	one-line description, placed just before the last NULL in the array
+	below.  If your patch fixes a bug in the perlbug database, please
+	mention the bugid.  If your patch *IS* dependent on a prior patch,
+	please place your applied patch line after its dependencies. This
+	will help tracking of patch dependencies.
+
+	Please either use 'diff --unified=0' if your diff supports
+	that or edit the hunk of the diff output which adds your patch
+	to this list, to remove context lines which would give patch
+	problems. For instance, if the original context diff is
+
+	   *** patchlevel.h.orig	<date here>
+	   --- patchlevel.h	<date here>
+	   *** 38,43 ***
+	   --- 38,44 ---
+	     	,"FOO1235 - some patch"
+	     	,"BAR3141 - another patch"
+	     	,"BAZ2718 - and another patch"
+	   + 	,"MINE001 - my new patch"
+	     	,NULL
+	     };
+	
+	please change it to 
+	   *** patchlevel.h.orig	<date here>
+	   --- patchlevel.h	<date here>
+	   *** 41,43 ***
+	   --- 41,44 ---
+	   + 	,"MINE001 - my new patch"
+	     	,NULL
+	     };
+	
+	(Note changes to line numbers as well as removal of context lines.)
+	This will prevent patch from choking if someone has previously
+	applied different patches than you.
+
+        History has shown that nobody distributes patches that also
+        modify patchlevel.h. Do it yourself. The following perl
+        program can be used to add a comment to patchlevel.h:
+
+#!perl
+die "Usage: perl -x patchlevel.h comment ..." unless @ARGV;
+open PLIN, "patchlevel.h" or die "Couldn't open patchlevel.h : $!";
+open PLOUT, ">patchlevel.new" or die "Couldn't write on patchlevel.new : $!";
+my $seen=0;
+while (<PLIN>) {
+    if (/\t,NULL/ and $seen) {
+       while (my $c = shift @ARGV){
+            print PLOUT qq{\t,"$c"\n};
+       }
+    }
+    $seen++ if /local_patches\[\]/;
+    print PLOUT;
+}
+close PLOUT or die "Couldn't close filehandle writing to patchlevel.new : $!";
+close PLIN or die "Couldn't close filehandle reading from patchlevel.h : $!";
+close DATA; # needed to allow unlink to work win32.
+unlink "patchlevel.bak" or warn "Couldn't unlink patchlevel.bak : $!"
+  if -e "patchlevel.bak";
+rename "patchlevel.h", "patchlevel.bak" or
+  die "Couldn't rename patchlevel.h to patchlevel.bak : $!";
+rename "patchlevel.new", "patchlevel.h" or
+  die "Couldn't rename patchlevel.new to patchlevel.h : $!";
+__END__
+
+Please keep empty lines below so that context diffs of this file do
+not ever collect the lines belonging to local_patches() into the same
+hunk.
+
+ */
+
+
+
+
+#if !defined(PERL_PATCHLEVEL_H_IMPLICIT) && !defined(LOCAL_PATCH_COUNT)
+static const char *local_patches[] = {
+	NULL
+	,NULL
+};
+
+
+
+/* Initial space prevents this variable from being inserted in config.sh  */
+#  define	LOCAL_PATCH_COUNT	\
+	(sizeof(local_patches)/sizeof(local_patches[0])-2)
+
+/* the old terms of reference, add them only when explicitly included */
+#define PATCHLEVEL		PERL_VERSION
+#undef  SUBVERSION		/* OS/390 has a SUBVERSION in a system header */
+#define SUBVERSION		PERL_SUBVERSION
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/perl.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/perl.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/perl.h	(revision 14489)
@@ -0,0 +1,4914 @@
+/*    perl.h
+ *
+ *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifndef H_PERL
+#define H_PERL 1
+
+#ifdef PERL_FOR_X2P
+/*
+ * This file is being used for x2p stuff.
+ * Above symbol is defined via -D in 'x2p/Makefile.SH'
+ * Decouple x2p stuff from some of perls more extreme eccentricities.
+ */
+#undef MULTIPLICITY
+#undef USE_STDIO
+#define USE_STDIO
+#endif /* PERL_FOR_X2P */
+
+#if defined(DGUX)
+#include <sys/fcntl.h>
+#endif
+
+#ifdef VOIDUSED
+#   undef VOIDUSED
+#endif 
+#define VOIDUSED 1
+
+#ifdef PERL_MICRO
+#   include "uconfig.h"
+#else
+#   include "config.h"
+#endif
+
+#if defined(USE_ITHREADS) && defined(USE_5005THREADS)
+#  include "error: USE_ITHREADS and USE_5005THREADS are incompatible"
+#endif
+
+/* See L<perlguts/"The Perl API"> for detailed notes on
+ * PERL_IMPLICIT_CONTEXT and PERL_IMPLICIT_SYS */
+
+/* Note that from here --> to <-- the same logic is
+ * repeated in makedef.pl, so be certain to update
+ * both places when editing. */
+
+#ifdef PERL_IMPLICIT_SYS
+/* PERL_IMPLICIT_SYS implies PerlMemShared != PerlMem
+   so use slab allocator to avoid lots of MUTEX overhead
+ */
+#  ifndef PL_OP_SLAB_ALLOC
+#    define PL_OP_SLAB_ALLOC
+#  endif
+#endif
+
+#ifdef USE_ITHREADS
+#  if !defined(MULTIPLICITY)
+#    define MULTIPLICITY
+#  endif
+#endif
+
+#ifdef USE_5005THREADS
+#  ifndef PERL_IMPLICIT_CONTEXT
+#    define PERL_IMPLICIT_CONTEXT
+#  endif
+#endif
+
+#if defined(MULTIPLICITY)
+#  ifndef PERL_IMPLICIT_CONTEXT
+#    define PERL_IMPLICIT_CONTEXT
+#  endif
+#endif
+
+/* undef WIN32 when building on Cygwin (for libwin32) - gph */
+#ifdef __CYGWIN__
+#   undef WIN32
+#   undef _WIN32
+#endif
+
+/* Use the reentrant APIs like localtime_r and getpwent_r */
+/* Win32 has naturally threadsafe libraries, no need to use any _r variants. */
+#if defined(USE_ITHREADS) && !defined(USE_REENTRANT_API) && !defined(NETWARE) && !defined(WIN32) && !defined(PERL_DARWIN)
+#   define USE_REENTRANT_API
+#endif
+
+/* <--- here ends the logic shared by perl.h and makedef.pl */
+
+/*
+ * PERL_DARWIN for MacOSX (__APPLE__ exists but is not officially sanctioned)
+ * (The -DPERL_DARWIN comes from the hints/darwin.sh.)
+ * __bsdi__ for BSD/OS
+ */
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(PERL_DARWIN) || defined(__bsdi__) || defined(BSD41) || defined(BSD42) || defined(BSD43) || defined(BSD44)
+#   ifndef BSDish
+#       define BSDish
+#   endif
+#endif
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#  ifdef USE_5005THREADS
+struct perl_thread;
+#    define pTHX	register struct perl_thread *thr PERL_UNUSED_DECL
+#    define aTHX	thr
+#    define dTHR	dNOOP /* only backward compatibility */
+#    define dTHXa(a)	pTHX = (struct perl_thread*)a
+#  else
+#    ifndef MULTIPLICITY
+#      define MULTIPLICITY
+#    endif
+#    define pTHX	register PerlInterpreter *my_perl PERL_UNUSED_DECL
+#    define aTHX	my_perl
+#    define dTHXa(a)	pTHX = (PerlInterpreter*)a
+#  endif
+#  define dTHX		pTHX = PERL_GET_THX
+#  define pTHX_		pTHX,
+#  define aTHX_		aTHX,
+#  define pTHX_1	2
+#  define pTHX_2	3
+#  define pTHX_3	4
+#  define pTHX_4	5
+#  define pTHX_5	6
+#  define pTHX_6	7
+#  define pTHX_7	8
+#  define pTHX_8	9
+#  define pTHX_9	10
+#endif
+
+#define STATIC static
+#define CPERLscope(x) x
+#define CPERLarg void
+#define CPERLarg_
+#define _CPERLarg
+#define PERL_OBJECT_THIS
+#define _PERL_OBJECT_THIS
+#define PERL_OBJECT_THIS_
+#define CALL_FPTR(fptr) (*fptr)
+
+#define CALLRUNOPS  CALL_FPTR(PL_runops)
+#define CALLREGCOMP CALL_FPTR(PL_regcompp)
+#define CALLREGEXEC CALL_FPTR(PL_regexecp)
+#define CALLREG_INTUIT_START CALL_FPTR(PL_regint_start)
+#define CALLREG_INTUIT_STRING CALL_FPTR(PL_regint_string)
+#define CALLREGFREE CALL_FPTR(PL_regfree)
+
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+#  define CALLPROTECT CALL_FPTR(PL_protect)
+#endif
+
+#if defined(SYMBIAN) && defined(__GNUC__)
+#  ifdef __cplusplus
+#    define PERL_UNUSED_DECL
+#  else
+#    define PERL_UNUSED_DECL __attribute__((unused))
+#  endif
+#endif
+
+#ifndef PERL_UNUSED_DECL
+#  ifdef HASATTRIBUTE_UNUSED
+#    define PERL_UNUSED_DECL __attribute__unused__
+#  else
+#    define PERL_UNUSED_DECL
+#  endif
+#endif
+
+/* gcc -Wall:
+ * for silencing unused variables that are actually used most of the time,
+ * but we cannot quite get rid of, such as "ax" in PPCODE+noargs xsubs
+ */
+#ifndef PERL_UNUSED_ARG
+#  ifdef lint
+#    include <note.h>
+#    define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
+#  else
+#    define PERL_UNUSED_ARG(x) ((void)x)
+#  endif
+#endif
+#ifndef PERL_UNUSED_VAR
+#  define PERL_UNUSED_VAR(x) ((void)x)
+#endif
+
+#define NOOP (void)0
+#define dNOOP extern int Perl___notused PERL_UNUSED_DECL
+
+#ifndef pTHX
+#  define pTHX		void
+#  define pTHX_
+#  define aTHX
+#  define aTHX_
+#  define dTHXa(a)	dNOOP
+#  define dTHX		dNOOP
+#  define pTHX_1	1	
+#  define pTHX_2	2
+#  define pTHX_3	3
+#  define pTHX_4	4
+#  define pTHX_5	5
+#  define pTHX_6	6
+#  define pTHX_7	7
+#  define pTHX_8	8
+#  define pTHX_9	9
+#endif
+
+/* these are only defined for compatibility; should not be used internally */
+#if !defined(pTHXo) && !defined(PERL_CORE)
+#  define pTHXo		pTHX
+#  define pTHXo_	pTHX_
+#  define aTHXo		aTHX
+#  define aTHXo_	aTHX_
+#  define dTHXo		dTHX
+#  define dTHXoa(x)	dTHXa(x)
+#endif
+
+#ifndef pTHXx
+#  define pTHXx		register PerlInterpreter *my_perl
+#  define pTHXx_	pTHXx,
+#  define aTHXx		my_perl
+#  define aTHXx_	aTHXx,
+#  define dTHXx		dTHX
+#endif
+
+/* Under PERL_IMPLICIT_SYS (used in Windows for fork emulation)
+ * PerlIO_foo() expands to PL_StdIO->pFOO(PL_StdIO, ...).
+ * dTHXs is therefore needed for all functions using PerlIO_foo(). */
+#ifdef PERL_IMPLICIT_SYS
+#  define dTHXs		dTHX
+#else
+#  define dTHXs		dNOOP
+#endif
+
+#undef START_EXTERN_C
+#undef END_EXTERN_C
+#undef EXTERN_C
+#ifdef __cplusplus
+#  define START_EXTERN_C extern "C" {
+#  define END_EXTERN_C }
+#  define EXTERN_C extern "C"
+#else
+#  define START_EXTERN_C
+#  define END_EXTERN_C
+#  define EXTERN_C extern
+#endif
+
+/* Some platforms require marking function declarations
+ * for them to be exportable.  Used in perlio.h, proto.h
+ * is handled either by the makedef.pl or by defining the
+ * PERL_CALLCONV to be something special.  See also the
+ * definition of XS() in XSUB.h. */
+#ifndef PERL_EXPORT_C
+#  define PERL_EXPORT_C extern
+#endif
+#ifndef PERL_XS_EXPORT_C
+#  define PERL_XS_EXPORT_C
+#endif
+
+#ifdef OP_IN_REGISTER
+#  ifdef __GNUC__
+#    define stringify_immed(s) #s
+#    define stringify(s) stringify_immed(s)
+register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
+#  endif
+#endif
+
+#if defined(__STRICT_ANSI__) && defined(PERL_GCC_PEDANTIC)
+#  if !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#    define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#  endif
+#endif
+
+/*
+ * STMT_START { statements; } STMT_END;
+ * can be used as a single statement, as in
+ * if (x) STMT_START { ... } STMT_END; else ...
+ *
+ * Trying to select a version that gives no warnings...
+ */
+#if !(defined(STMT_START) && defined(STMT_END))
+# if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+#   define STMT_START	(void)(	/* gcc supports "({ STATEMENTS; })" */
+#   define STMT_END	)
+# else
+   /* Now which other defined()s do we need here ??? */
+#  if (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
+#   define STMT_START	if (1)
+#   define STMT_END	else (void)0
+#  else
+#   define STMT_START	do
+#   define STMT_END	while (0)
+#  endif
+# endif
+#endif
+
+#define WITH_THX(s) STMT_START { dTHX; s; } STMT_END
+#define WITH_THR(s) WITH_THX(s)
+
+/*
+ * SOFT_CAST can be used for args to prototyped functions to retain some
+ * type checking; it only casts if the compiler does not know prototypes.
+ */
+#if defined(CAN_PROTOTYPE) && defined(DEBUGGING_COMPILE)
+#define SOFT_CAST(type)	
+#else
+#define SOFT_CAST(type)	(type)
+#endif
+
+#ifndef BYTEORDER  /* Should never happen -- byteorder is in config.h */
+#   define BYTEORDER 0x1234
+#endif
+
+/* Overall memory policy? */
+#ifndef CONSERVATIVE
+#   define LIBERAL 1
+#endif
+
+#if 'A' == 65 && 'I' == 73 && 'J' == 74 && 'Z' == 90
+#define ASCIIish
+#else
+#undef  ASCIIish
+#endif
+
+/*
+ * The following contortions are brought to you on behalf of all the
+ * standards, semi-standards, de facto standards, not-so-de-facto standards
+ * of the world, as well as all the other botches anyone ever thought of.
+ * The basic theory is that if we work hard enough here, the rest of the
+ * code can be a lot prettier.  Well, so much for theory.  Sorry, Henry...
+ */
+
+/* define this once if either system, instead of cluttering up the src */
+#if defined(MSDOS) || defined(atarist) || defined(WIN32) || defined(NETWARE)
+#define DOSISH 1
+#endif
+
+#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus) || defined( EPOC) || defined(NETWARE)
+# define STANDARD_C 1
+#endif
+
+#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(__EMX__) || defined(__DGUX) || defined( EPOC) || defined(__QNX__) || defined(NETWARE) || defined(PERL_MICRO)
+# define DONT_DECLARE_STD 1
+#endif
+
+#if defined(HASVOLATILE) || defined(STANDARD_C)
+#   ifdef __cplusplus
+#	define VOL		/* to temporarily suppress warnings */
+#   else
+#	define VOL volatile
+#   endif
+#else
+#   define VOL
+#endif
+
+#define TAINT		(PL_tainted = TRUE)
+#define TAINT_NOT	(PL_tainted = FALSE)
+#define TAINT_IF(c)	if (c) { PL_tainted = TRUE; }
+#define TAINT_ENV()	if (PL_tainting) { taint_env(); }
+#define TAINT_PROPER(s)	if (PL_tainting) { taint_proper(Nullch, s); }
+
+/* XXX All process group stuff is handled in pp_sys.c.  Should these
+   defines move there?  If so, I could simplify this a lot. --AD  9/96.
+*/
+/* Process group stuff changed from traditional BSD to POSIX.
+   perlfunc.pod documents the traditional BSD-style syntax, so we'll
+   try to preserve that, if possible.
+*/
+#ifdef HAS_SETPGID
+#  define BSD_SETPGRP(pid, pgrp)	setpgid((pid), (pgrp))
+#else
+#  if defined(HAS_SETPGRP) && defined(USE_BSD_SETPGRP)
+#    define BSD_SETPGRP(pid, pgrp)	setpgrp((pid), (pgrp))
+#  else
+#    ifdef HAS_SETPGRP2  /* DG/UX */
+#      define BSD_SETPGRP(pid, pgrp)	setpgrp2((pid), (pgrp))
+#    endif
+#  endif
+#endif
+#if defined(BSD_SETPGRP) && !defined(HAS_SETPGRP)
+#  define HAS_SETPGRP  /* Well, effectively it does . . . */
+#endif
+
+/* getpgid isn't POSIX, but at least Solaris and Linux have it, and it makes
+    our life easier :-) so we'll try it.
+*/
+#ifdef HAS_GETPGID
+#  define BSD_GETPGRP(pid)		getpgid((pid))
+#else
+#  if defined(HAS_GETPGRP) && defined(USE_BSD_GETPGRP)
+#    define BSD_GETPGRP(pid)		getpgrp((pid))
+#  else
+#    ifdef HAS_GETPGRP2  /* DG/UX */
+#      define BSD_GETPGRP(pid)		getpgrp2((pid))
+#    endif
+#  endif
+#endif
+#if defined(BSD_GETPGRP) && !defined(HAS_GETPGRP)
+#  define HAS_GETPGRP  /* Well, effectively it does . . . */
+#endif
+
+/* These are not exact synonyms, since setpgrp() and getpgrp() may
+   have different behaviors, but perl.h used to define USE_BSDPGRP
+   (prior to 5.003_05) so some extension might depend on it.
+*/
+#if defined(USE_BSD_SETPGRP) || defined(USE_BSD_GETPGRP)
+#  ifndef USE_BSDPGRP
+#    define USE_BSDPGRP
+#  endif
+#endif
+
+/* HP-UX 10.X CMA (Common Multithreaded Architecure) insists that
+   pthread.h must be included before all other header files.
+*/
+#if (defined(USE_5005THREADS) || defined(USE_ITHREADS)) \
+    && defined(PTHREAD_H_FIRST) && defined(I_PTHREAD)
+#  include <pthread.h>
+#endif
+
+#ifndef _TYPES_		/* If types.h defines this it's easy. */
+#   ifndef major		/* Does everyone's types.h define this? */
+#	include <sys/types.h>
+#   endif
+#endif
+
+#ifdef __cplusplus
+#  ifndef I_STDARG
+#    define I_STDARG 1
+#  endif
+#endif
+
+#ifdef I_STDARG
+#  include <stdarg.h>
+#else
+#  ifdef I_VARARGS
+#    include <varargs.h>
+#  endif
+#endif
+
+#ifdef USE_NEXT_CTYPE
+
+#if NX_CURRENT_COMPILER_RELEASE >= 500
+#  include <bsd/ctypes.h>
+#else
+#  if NX_CURRENT_COMPILER_RELEASE >= 400
+#    include <objc/NXCType.h>
+#  else /*  NX_CURRENT_COMPILER_RELEASE < 400 */
+#    include <appkit/NXCType.h>
+#  endif /*  NX_CURRENT_COMPILER_RELEASE >= 400 */
+#endif /*  NX_CURRENT_COMPILER_RELEASE >= 500 */
+
+#else /* !USE_NEXT_CTYPE */
+#include <ctype.h>
+#endif /* USE_NEXT_CTYPE */
+
+#ifdef METHOD 	/* Defined by OSF/1 v3.0 by ctype.h */
+#undef METHOD
+#endif
+
+#ifdef PERL_MICRO
+#   define NO_LOCALE
+#endif
+
+#ifdef I_LOCALE
+#   include <locale.h>
+#endif
+
+#if !defined(NO_LOCALE) && defined(HAS_SETLOCALE)
+#   define USE_LOCALE
+#   if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \
+       && defined(HAS_STRXFRM)
+#	define USE_LOCALE_COLLATE
+#   endif
+#   if !defined(NO_LOCALE_CTYPE) && defined(LC_CTYPE)
+#	define USE_LOCALE_CTYPE
+#   endif
+#   if !defined(NO_LOCALE_NUMERIC) && defined(LC_NUMERIC)
+#	define USE_LOCALE_NUMERIC
+#   endif
+#endif /* !NO_LOCALE && HAS_SETLOCALE */
+
+#include <setjmp.h>
+
+#ifdef I_SYS_PARAM
+#   ifdef PARAM_NEEDS_TYPES
+#	include <sys/types.h>
+#   endif
+#   include <sys/param.h>
+#endif
+
+/* Use all the "standard" definitions? */
+#if defined(STANDARD_C) && defined(I_STDLIB)
+#   include <stdlib.h>
+#endif
+
+/* If this causes problems, set i_unistd=undef in the hint file.  */
+#ifdef I_UNISTD
+#   include <unistd.h>
+#endif
+
+#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) && !defined(PERL_MICRO)
+int syscall(int, ...);
+#endif
+
+#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) && !defined(PERL_MICRO)
+int usleep(unsigned int);
+#endif
+
+#ifdef PERL_MICRO /* Last chance to export Perl_my_swap */
+#  define MYSWAP
+#endif
+
+#ifdef PERL_CORE
+
+/* macros for correct constant construction */
+# if INTSIZE >= 2
+#  define U16_CONST(x) ((U16)x##U)
+# else
+#  define U16_CONST(x) ((U16)x##UL)
+# endif
+
+# if INTSIZE >= 4
+#  define U32_CONST(x) ((U32)x##U)
+# else
+#  define U32_CONST(x) ((U32)x##UL)
+# endif
+
+# ifdef HAS_QUAD
+#  if INTSIZE >= 8
+#   define U64_CONST(x) ((U64)x##U)
+#  elif LONGSIZE >= 8
+#   define U64_CONST(x) ((U64)x##UL)
+#  elif QUADKIND == QUAD_IS_LONG_LONG
+#   define U64_CONST(x) ((U64)x##ULL)
+#  else /* best guess we can make */
+#   define U64_CONST(x) ((U64)x##UL)
+#  endif
+# endif
+
+/* byte-swapping functions for big-/little-endian conversion */
+# define _swab_16_(x) ((U16)( \
+         (((U16)(x) & U16_CONST(0x00ff)) << 8) | \
+         (((U16)(x) & U16_CONST(0xff00)) >> 8) ))
+
+# define _swab_32_(x) ((U32)( \
+         (((U32)(x) & U32_CONST(0x000000ff)) << 24) | \
+         (((U32)(x) & U32_CONST(0x0000ff00)) <<  8) | \
+         (((U32)(x) & U32_CONST(0x00ff0000)) >>  8) | \
+         (((U32)(x) & U32_CONST(0xff000000)) >> 24) ))
+
+# ifdef HAS_QUAD
+#  define _swab_64_(x) ((U64)( \
+          (((U64)(x) & U64_CONST(0x00000000000000ff)) << 56) | \
+          (((U64)(x) & U64_CONST(0x000000000000ff00)) << 40) | \
+          (((U64)(x) & U64_CONST(0x0000000000ff0000)) << 24) | \
+          (((U64)(x) & U64_CONST(0x00000000ff000000)) <<  8) | \
+          (((U64)(x) & U64_CONST(0x000000ff00000000)) >>  8) | \
+          (((U64)(x) & U64_CONST(0x0000ff0000000000)) >> 24) | \
+          (((U64)(x) & U64_CONST(0x00ff000000000000)) >> 40) | \
+          (((U64)(x) & U64_CONST(0xff00000000000000)) >> 56) ))
+# endif
+
+/*----------------------------------------------------------------------------*/
+# if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678  /*     little-endian     */
+/*----------------------------------------------------------------------------*/
+#  define my_htole16(x)		(x)
+#  define my_letoh16(x)		(x)
+#  define my_htole32(x)		(x)
+#  define my_letoh32(x)		(x)
+#  define my_htobe16(x)		_swab_16_(x)
+#  define my_betoh16(x)		_swab_16_(x)
+#  define my_htobe32(x)		_swab_32_(x)
+#  define my_betoh32(x)		_swab_32_(x)
+#  ifdef HAS_QUAD
+#   define my_htole64(x)	(x)
+#   define my_letoh64(x)	(x)
+#   define my_htobe64(x)	_swab_64_(x)
+#   define my_betoh64(x)	_swab_64_(x)
+#  endif
+#  define my_htoles(x)		(x)
+#  define my_letohs(x)		(x)
+#  define my_htolei(x)		(x)
+#  define my_letohi(x)		(x)
+#  define my_htolel(x)		(x)
+#  define my_letohl(x)		(x)
+#  if SHORTSIZE == 1
+#   define my_htobes(x)		(x)
+#   define my_betohs(x)		(x)
+#  elif SHORTSIZE == 2
+#   define my_htobes(x)		_swab_16_(x)
+#   define my_betohs(x)		_swab_16_(x)
+#  elif SHORTSIZE == 4
+#   define my_htobes(x)		_swab_32_(x)
+#   define my_betohs(x)		_swab_32_(x)
+#  elif SHORTSIZE == 8
+#   define my_htobes(x)		_swab_64_(x)
+#   define my_betohs(x)		_swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOBES
+#   define PERL_NEED_MY_BETOHS
+#  endif
+#  if INTSIZE == 1
+#   define my_htobei(x)		(x)
+#   define my_betohi(x)		(x)
+#  elif INTSIZE == 2
+#   define my_htobei(x)		_swab_16_(x)
+#   define my_betohi(x)		_swab_16_(x)
+#  elif INTSIZE == 4
+#   define my_htobei(x)		_swab_32_(x)
+#   define my_betohi(x)		_swab_32_(x)
+#  elif INTSIZE == 8
+#   define my_htobei(x)		_swab_64_(x)
+#   define my_betohi(x)		_swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOBEI
+#   define PERL_NEED_MY_BETOHI
+#  endif
+#  if LONGSIZE == 1
+#   define my_htobel(x)		(x)
+#   define my_betohl(x)		(x)
+#  elif LONGSIZE == 2
+#   define my_htobel(x)		_swab_16_(x)
+#   define my_betohl(x)		_swab_16_(x)
+#  elif LONGSIZE == 4
+#   define my_htobel(x)		_swab_32_(x)
+#   define my_betohl(x)		_swab_32_(x)
+#  elif LONGSIZE == 8
+#   define my_htobel(x)		_swab_64_(x)
+#   define my_betohl(x)		_swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOBEL
+#   define PERL_NEED_MY_BETOHL
+#  endif
+#  define my_htolen(p,n)	NOOP
+#  define my_letohn(p,n)	NOOP
+#  define my_htoben(p,n)	my_swabn(p,n)
+#  define my_betohn(p,n)	my_swabn(p,n)
+/*----------------------------------------------------------------------------*/
+# elif BYTEORDER == 0x4321 || BYTEORDER == 0x87654321  /*     big-endian      */
+/*----------------------------------------------------------------------------*/
+#  define my_htobe16(x)		(x)
+#  define my_betoh16(x)		(x)
+#  define my_htobe32(x)		(x)
+#  define my_betoh32(x)		(x)
+#  define my_htole16(x)		_swab_16_(x)
+#  define my_letoh16(x)		_swab_16_(x)
+#  define my_htole32(x)		_swab_32_(x)
+#  define my_letoh32(x)		_swab_32_(x)
+#  ifdef HAS_QUAD
+#   define my_htobe64(x)	(x)
+#   define my_betoh64(x)	(x)
+#   define my_htole64(x)	_swab_64_(x)
+#   define my_letoh64(x)	_swab_64_(x)
+#  endif
+#  define my_htobes(x)		(x)
+#  define my_betohs(x)		(x)
+#  define my_htobei(x)		(x)
+#  define my_betohi(x)		(x)
+#  define my_htobel(x)		(x)
+#  define my_betohl(x)		(x)
+#  if SHORTSIZE == 1
+#   define my_htoles(x)		(x)
+#   define my_letohs(x)		(x)
+#  elif SHORTSIZE == 2
+#   define my_htoles(x)		_swab_16_(x)
+#   define my_letohs(x)		_swab_16_(x)
+#  elif SHORTSIZE == 4
+#   define my_htoles(x)		_swab_32_(x)
+#   define my_letohs(x)		_swab_32_(x)
+#  elif SHORTSIZE == 8
+#   define my_htoles(x)		_swab_64_(x)
+#   define my_letohs(x)		_swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOLES
+#   define PERL_NEED_MY_LETOHS
+#  endif
+#  if INTSIZE == 1
+#   define my_htolei(x)		(x)
+#   define my_letohi(x)		(x)
+#  elif INTSIZE == 2
+#   define my_htolei(x)		_swab_16_(x)
+#   define my_letohi(x)		_swab_16_(x)
+#  elif INTSIZE == 4
+#   define my_htolei(x)		_swab_32_(x)
+#   define my_letohi(x)		_swab_32_(x)
+#  elif INTSIZE == 8
+#   define my_htolei(x)		_swab_64_(x)
+#   define my_letohi(x)		_swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOLEI
+#   define PERL_NEED_MY_LETOHI
+#  endif
+#  if LONGSIZE == 1
+#   define my_htolel(x)		(x)
+#   define my_letohl(x)		(x)
+#  elif LONGSIZE == 2
+#   define my_htolel(x)		_swab_16_(x)
+#   define my_letohl(x)		_swab_16_(x)
+#  elif LONGSIZE == 4
+#   define my_htolel(x)		_swab_32_(x)
+#   define my_letohl(x)		_swab_32_(x)
+#  elif LONGSIZE == 8
+#   define my_htolel(x)		_swab_64_(x)
+#   define my_letohl(x)		_swab_64_(x)
+#  else
+#   define PERL_NEED_MY_HTOLEL
+#   define PERL_NEED_MY_LETOHL
+#  endif
+#  define my_htolen(p,n)	my_swabn(p,n)
+#  define my_letohn(p,n)	my_swabn(p,n)
+#  define my_htoben(p,n)	NOOP
+#  define my_betohn(p,n)	NOOP
+/*----------------------------------------------------------------------------*/
+# else /*                       all other byte-orders                         */
+/*----------------------------------------------------------------------------*/
+#  define PERL_NEED_MY_HTOLE16
+#  define PERL_NEED_MY_LETOH16
+#  define PERL_NEED_MY_HTOBE16
+#  define PERL_NEED_MY_BETOH16
+#  define PERL_NEED_MY_HTOLE32
+#  define PERL_NEED_MY_LETOH32
+#  define PERL_NEED_MY_HTOBE32
+#  define PERL_NEED_MY_BETOH32
+#  ifdef HAS_QUAD
+#   define PERL_NEED_MY_HTOLE64
+#   define PERL_NEED_MY_LETOH64
+#   define PERL_NEED_MY_HTOBE64
+#   define PERL_NEED_MY_BETOH64
+#  endif
+#  define PERL_NEED_MY_HTOLES
+#  define PERL_NEED_MY_LETOHS
+#  define PERL_NEED_MY_HTOBES
+#  define PERL_NEED_MY_BETOHS
+#  define PERL_NEED_MY_HTOLEI
+#  define PERL_NEED_MY_LETOHI
+#  define PERL_NEED_MY_HTOBEI
+#  define PERL_NEED_MY_BETOHI
+#  define PERL_NEED_MY_HTOLEL
+#  define PERL_NEED_MY_LETOHL
+#  define PERL_NEED_MY_HTOBEL
+#  define PERL_NEED_MY_BETOHL
+/*----------------------------------------------------------------------------*/
+# endif /*                     end of byte-order macros                       */
+/*----------------------------------------------------------------------------*/
+
+/* The old value was hard coded at 1008. (4096-16) seems to be a bit faster,
+   at least on FreeBSD.  YMMV, so experiment.  */
+#ifndef PERL_ARENA_SIZE
+#define PERL_ARENA_SIZE 4080
+#endif
+
+#endif /* PERL_CORE */
+
+/* Cannot include embed.h here on Win32 as win32.h has not 
+   yet been included and defines some config variables e.g. HAVE_INTERP_INTERN
+ */
+#if !defined(PERL_FOR_X2P) && !(defined(WIN32)||defined(VMS))
+#  include "embed.h"
+#endif
+
+#define MEM_SIZE Size_t
+
+/* Round all values passed to malloc up, by default to a multiple of
+   sizeof(size_t)
+*/
+#ifndef PERL_STRLEN_ROUNDUP_QUANTUM
+#define PERL_STRLEN_ROUNDUP_QUANTUM Size_t_size
+#endif
+
+#if defined(STANDARD_C) && defined(I_STDDEF)
+#   include <stddef.h>
+#   define STRUCT_OFFSET(s,m)  offsetof(s,m)
+#else
+#   define STRUCT_OFFSET(s,m)  (Size_t)(&(((s *)0)->m))
+#endif
+
+#if defined(I_STRING) || defined(__cplusplus)
+#   include <string.h>
+#else
+#   include <strings.h>
+#endif
+
+/* This comes after <stdlib.h> so we don't try to change the standard
+ * library prototypes; we'll use our own in proto.h instead. */
+
+#ifdef MYMALLOC
+#  ifdef PERL_POLLUTE_MALLOC
+#   ifndef PERL_EXTMALLOC_DEF
+#    define Perl_malloc		malloc
+#    define Perl_calloc		calloc
+#    define Perl_realloc	realloc
+#    define Perl_mfree		free
+#   endif
+#  else
+#    define EMBEDMYMALLOC	/* for compatibility */
+#  endif
+
+#  define safemalloc  Perl_malloc
+#  define safecalloc  Perl_calloc
+#  define saferealloc Perl_realloc
+#  define safefree    Perl_mfree
+#  define CHECK_MALLOC_TOO_LATE_FOR_(code)	STMT_START {		\
+	if (!PL_tainting && MallocCfg_ptr[MallocCfg_cfg_env_read])	\
+		code;							\
+    } STMT_END
+#  define CHECK_MALLOC_TOO_LATE_FOR(ch)				\
+	CHECK_MALLOC_TOO_LATE_FOR_(MALLOC_TOO_LATE_FOR(ch))
+#  define panic_write2(s)		write(2, s, strlen(s))
+#  define CHECK_MALLOC_TAINT(newval)				\
+	CHECK_MALLOC_TOO_LATE_FOR_(				\
+		if (newval) {					\
+		  panic_write2("panic: tainting with $ENV{PERL_MALLOC_OPT}\n");\
+		  exit(1); })
+#  define MALLOC_CHECK_TAINT(argc,argv,env)	STMT_START {	\
+	if (doing_taint(argc,argv,env)) {			\
+		MallocCfg_ptr[MallocCfg_skip_cfg_env] = 1;	\
+    }} STMT_END;
+#else  /* MYMALLOC */
+#  define safemalloc  safesysmalloc
+#  define safecalloc  safesyscalloc
+#  define saferealloc safesysrealloc
+#  define safefree    safesysfree
+#  define CHECK_MALLOC_TOO_LATE_FOR(ch)		((void)0)
+#  define CHECK_MALLOC_TAINT(newval)		((void)0)
+#  define MALLOC_CHECK_TAINT(argc,argv,env)
+#endif /* MYMALLOC */
+
+#define TOO_LATE_FOR_(ch,what)	Perl_croak(aTHX_ "\"-%c\" is on the #! line, it must also be used on the command line%s", (char)(ch), what)
+#define TOO_LATE_FOR(ch)	TOO_LATE_FOR_(ch, "")
+#define MALLOC_TOO_LATE_FOR(ch)	TOO_LATE_FOR_(ch, " with $ENV{PERL_MALLOC_OPT}")
+#define MALLOC_CHECK_TAINT2(argc,argv)	MALLOC_CHECK_TAINT(argc,argv,NULL)
+
+#if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
+#define strchr index
+#define strrchr rindex
+#endif
+
+#ifdef I_MEMORY
+#  include <memory.h>
+#endif
+
+#ifdef HAS_MEMCPY
+#  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
+#    ifndef memcpy
+        extern char * memcpy (char*, char*, int);
+#    endif
+#  endif
+#else
+#   ifndef memcpy
+#	ifdef HAS_BCOPY
+#	    define memcpy(d,s,l) bcopy(s,d,l)
+#	else
+#	    define memcpy(d,s,l) my_bcopy(s,d,l)
+#	endif
+#   endif
+#endif /* HAS_MEMCPY */
+
+#ifdef HAS_MEMSET
+#  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
+#    ifndef memset
+	extern char *memset (char*, int, int);
+#    endif
+#  endif
+#else
+#  undef  memset
+#  define memset(d,c,l) my_memset(d,c,l)
+#endif /* HAS_MEMSET */
+
+#if !defined(HAS_MEMMOVE) && !defined(memmove)
+#   if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
+#	define memmove(d,s,l) bcopy(s,d,l)
+#   else
+#	if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
+#	    define memmove(d,s,l) memcpy(d,s,l)
+#	else
+#	    define memmove(d,s,l) my_bcopy(s,d,l)
+#	endif
+#   endif
+#endif
+
+#if defined(mips) && defined(ultrix) && !defined(__STDC__)
+#   undef HAS_MEMCMP
+#endif
+
+#if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
+#  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
+#    ifndef memcmp
+	extern int memcmp (char*, char*, int);
+#    endif
+#  endif
+#  ifdef BUGGY_MSC
+#    pragma function(memcmp)
+#  endif
+#else
+#   ifndef memcmp
+#	define memcmp 	my_memcmp
+#   endif
+#endif /* HAS_MEMCMP && HAS_SANE_MEMCMP */
+
+#ifndef memzero
+#   ifdef HAS_MEMSET
+#	define memzero(d,l) memset(d,0,l)
+#   else
+#	ifdef HAS_BZERO
+#	    define memzero(d,l) bzero(d,l)
+#	else
+#	    define memzero(d,l) my_bzero(d,l)
+#	endif
+#   endif
+#endif
+
+#ifndef PERL_MICRO
+#ifndef memchr
+#   ifndef HAS_MEMCHR
+#       define memchr(s,c,n) ninstr((char*)(s), ((char*)(s)) + n, &(c), &(c) + 1)
+#   endif
+#endif
+#endif
+
+#ifndef HAS_BCMP
+#   ifndef bcmp
+#	define bcmp(s1,s2,l) memcmp(s1,s2,l)
+#   endif
+#endif /* !HAS_BCMP */
+
+#ifdef I_NETINET_IN
+#   include <netinet/in.h>
+#endif
+
+#ifdef I_ARPA_INET
+#   include <arpa/inet.h>
+#endif
+
+#if defined(SF_APPEND) && defined(USE_SFIO) && defined(I_SFIO)
+/* <sfio.h> defines SF_APPEND and <sys/stat.h> might define SF_APPEND
+ * (the neo-BSD seem to do this).  */
+#   undef SF_APPEND
+#endif
+
+#ifdef I_SYS_STAT
+#   include <sys/stat.h>
+#endif
+
+/* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
+   like UTekV) are broken, sometimes giving false positives.  Undefine
+   them here and let the code below set them to proper values.
+
+   The ghs macro stands for GreenHills Software C-1.8.5 which
+   is the C compiler for sysV88 and the various derivatives.
+   This header file bug is corrected in gcc-2.5.8 and later versions.
+   --Kaveh Ghazi (ghazi@noc.rutgers.edu) 10/3/94.  */
+
+#if defined(uts) || (defined(m88k) && defined(ghs))
+#   undef S_ISDIR
+#   undef S_ISCHR
+#   undef S_ISBLK
+#   undef S_ISREG
+#   undef S_ISFIFO
+#   undef S_ISLNK
+#endif
+
+#ifdef I_TIME
+#   include <time.h>
+#endif
+
+#ifdef I_SYS_TIME
+#   ifdef I_SYS_TIME_KERNEL
+#	define KERNEL
+#   endif
+#   include <sys/time.h>
+#   ifdef I_SYS_TIME_KERNEL
+#	undef KERNEL
+#   endif
+#endif
+
+#if defined(HAS_TIMES) && defined(I_SYS_TIMES)
+#    include <sys/times.h>
+#endif
+
+#if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR))
+#   undef HAS_STRERROR
+#endif
+
+#include <errno.h>
+
+#if defined(WIN32) && defined(PERL_IMPLICIT_SYS)
+#  define WIN32SCK_IS_STDSCK		/* don't pull in custom wsock layer */
+#endif
+
+/* In Tru64 use the 4.4BSD struct msghdr, not the 4.3 one.
+ * This is important for using IPv6. 
+ * For OSF/1 3.2, however, defining _SOCKADDR_LEN would be
+ * a bad idea since it breaks send() and recv(). */
+#if defined(__osf__) && defined(__alpha) && !defined(_SOCKADDR_LEN) && !defined(DEC_OSF1_3_X)
+#   define _SOCKADDR_LEN
+#endif
+
+#if defined(HAS_SOCKET) && !defined(VMS) && !defined(WIN32) /* VMS/WIN32 handle sockets via vmsish.h/win32.h */
+# include <sys/socket.h>
+# if defined(USE_SOCKS) && defined(I_SOCKS)
+#   if !defined(INCLUDE_PROTOTYPES)
+#       define INCLUDE_PROTOTYPES /* for <socks.h> */
+#       define PERL_SOCKS_NEED_PROTOTYPES
+#   endif
+#   ifdef USE_5005THREADS
+#       define PERL_USE_THREADS /* store our value */
+#       undef USE_5005THREADS
+#   endif
+#   include <socks.h>
+#   ifdef USE_5005THREADS
+#       undef USE_5005THREADS /* socks.h does this on its own */
+#   endif
+#   ifdef PERL_USE_THREADS
+#       define USE_5005THREADS /* restore our value */
+#       undef PERL_USE_THREADS
+#   endif
+#   ifdef PERL_SOCKS_NEED_PROTOTYPES /* keep cpp space clean */
+#       undef INCLUDE_PROTOTYPES
+#       undef PERL_SOCKS_NEED_PROTOTYPES
+#   endif
+# endif
+# ifdef I_NETDB
+#  ifdef NETWARE
+#   include<stdio.h>
+#  endif
+#  include <netdb.h>
+# endif
+# ifndef ENOTSOCK
+#  ifdef I_NET_ERRNO
+#   include <net/errno.h>
+#  endif
+# endif
+#endif
+
+/* sockatmark() is so new (2001) that many places might have it hidden
+ * behind some -D_BLAH_BLAH_SOURCE guard.  The __THROW magic is required
+ * e.g. in Gentoo, see http://bugs.gentoo.org/show_bug.cgi?id=12605 */
+#if defined(HAS_SOCKATMARK) && !defined(HAS_SOCKATMARK_PROTO)
+# if defined(__THROW) && defined(__GLIBC__)
+int sockatmark(int) __THROW;
+# else
+int sockatmark(int);
+# endif
+#endif
+
+#ifdef SETERRNO
+# undef SETERRNO  /* SOCKS might have defined this */
+#endif
+
+#ifdef VMS
+#   define SETERRNO(errcode,vmserrcode) \
+	STMT_START {			\
+	    set_errno(errcode);		\
+	    set_vaxc_errno(vmserrcode);	\
+	} STMT_END
+#   define LIB_INVARG 		LIB$_INVARG
+#   define RMS_DIR    		RMS$_DIR
+#   define RMS_FAC    		RMS$_FAC
+#   define RMS_FEX    		RMS$_FEX
+#   define RMS_FNF    		RMS$_FNF
+#   define RMS_IFI    		RMS$_IFI
+#   define RMS_ISI    		RMS$_ISI
+#   define RMS_PRV    		RMS$_PRV
+#   define SS_ACCVIO      	SS$_ACCVIO
+#   define SS_DEVOFFLINE	SS$_DEVOFFLINE
+#   define SS_IVCHAN  		SS$_IVCHAN
+#   define SS_NORMAL  		SS$_NORMAL
+#else
+#   define SETERRNO(errcode,vmserrcode) (errno = (errcode))
+#   define LIB_INVARG 		0
+#   define RMS_DIR    		0
+#   define RMS_FAC    		0
+#   define RMS_FEX    		0
+#   define RMS_FNF    		0
+#   define RMS_IFI    		0
+#   define RMS_ISI    		0
+#   define RMS_PRV    		0
+#   define SS_ACCVIO      	0
+#   define SS_DEVOFFLINE	0
+#   define SS_IVCHAN  		0
+#   define SS_NORMAL  		0
+#endif
+
+#ifdef USE_5005THREADS
+#  define ERRSV (thr->errsv)
+#  define DEFSV THREADSV(0)
+#  define SAVE_DEFSV save_threadsv(0)
+#else
+/* FIXME? Change the assignments to PL_defgv to instantiate GvSV?  */
+#  define ERRSV GvSV(PL_errgv)
+#  define DEFSV GvSVn(PL_defgv)
+#  define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
+#endif /* USE_5005THREADS */
+
+#define ERRHV GvHV(PL_errgv)	/* XXX unused, here for compatibility */
+
+#ifndef errno
+	extern int errno;     /* ANSI allows errno to be an lvalue expr.
+			       * For example in multithreaded environments
+			       * something like this might happen:
+			       * extern int *_errno(void);
+			       * #define errno (*_errno()) */
+#endif
+
+#ifdef HAS_STRERROR
+#       ifdef VMS
+	char *strerror (int,...);
+#       else
+#ifndef DONT_DECLARE_STD
+	char *strerror (int);
+#endif
+#       endif
+#       ifndef Strerror
+#           define Strerror strerror
+#       endif
+#else
+#    ifdef HAS_SYS_ERRLIST
+	extern int sys_nerr;
+	extern char *sys_errlist[];
+#       ifndef Strerror
+#           define Strerror(e) \
+		((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
+#       endif
+#   endif
+#endif
+
+#ifdef I_SYS_IOCTL
+#   ifndef _IOCTL_
+#	include <sys/ioctl.h>
+#   endif
+#endif
+
+#if defined(mc300) || defined(mc500) || defined(mc700) || defined(mc6000)
+#   ifdef HAS_SOCKETPAIR
+#	undef HAS_SOCKETPAIR
+#   endif
+#   ifdef I_NDBM
+#	undef I_NDBM
+#   endif
+#endif
+
+#ifndef HAS_SOCKETPAIR
+#   ifdef HAS_SOCKET
+#	define socketpair Perl_my_socketpair
+#   endif
+#endif
+
+#if INTSIZE == 2
+#   define htoni htons
+#   define ntohi ntohs
+#else
+#   define htoni htonl
+#   define ntohi ntohl
+#endif
+
+/* Configure already sets Direntry_t */
+#if defined(I_DIRENT)
+#   include <dirent.h>
+    /* NeXT needs dirent + sys/dir.h */
+#   if  defined(I_SYS_DIR) && (defined(NeXT) || defined(__NeXT__))
+#	include <sys/dir.h>
+#   endif
+#else
+#   ifdef I_SYS_NDIR
+#	include <sys/ndir.h>
+#   else
+#	ifdef I_SYS_DIR
+#	    ifdef hp9000s500
+#		include <ndir.h>	/* may be wrong in the future */
+#	    else
+#		include <sys/dir.h>
+#	    endif
+#	endif
+#   endif
+#endif
+
+#ifdef PERL_MICRO
+#   ifndef DIR
+#      define DIR void
+#   endif
+#endif
+
+#ifdef FPUTS_BOTCH
+/* work around botch in SunOS 4.0.1 and 4.0.2 */
+#   ifndef fputs
+#	define fputs(sv,fp) fprintf(fp,"%s",sv)
+#   endif
+#endif
+
+/*
+ * The following gobbledygook brought to you on behalf of __STDC__.
+ * (I could just use #ifndef __STDC__, but this is more bulletproof
+ * in the face of half-implementations.)
+ */
+
+#if defined(I_SYSMODE) && !defined(PERL_MICRO)
+#include <sys/mode.h>
+#endif
+
+#ifndef S_IFMT
+#   ifdef _S_IFMT
+#	define S_IFMT _S_IFMT
+#   else
+#	define S_IFMT 0170000
+#   endif
+#endif
+
+#ifndef S_ISDIR
+#   define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
+#endif
+
+#ifndef S_ISCHR
+#   define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR)
+#endif
+
+#ifndef S_ISBLK
+#   ifdef S_IFBLK
+#	define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK)
+#   else
+#	define S_ISBLK(m) (0)
+#   endif
+#endif
+
+#ifndef S_ISREG
+#   define S_ISREG(m) ((m & S_IFMT) == S_IFREG)
+#endif
+
+#ifndef S_ISFIFO
+#   ifdef S_IFIFO
+#	define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO)
+#   else
+#	define S_ISFIFO(m) (0)
+#   endif
+#endif
+
+#ifndef S_ISLNK
+#   ifdef _S_ISLNK
+#	define S_ISLNK(m) _S_ISLNK(m)
+#   else
+#	ifdef _S_IFLNK
+#	    define S_ISLNK(m) ((m & S_IFMT) == _S_IFLNK)
+#	else
+#	    ifdef S_IFLNK
+#		define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK)
+#	    else
+#		define S_ISLNK(m) (0)
+#	    endif
+#	endif
+#   endif
+#endif
+
+#ifndef S_ISSOCK
+#   ifdef _S_ISSOCK
+#	define S_ISSOCK(m) _S_ISSOCK(m)
+#   else
+#	ifdef _S_IFSOCK
+#	    define S_ISSOCK(m) ((m & S_IFMT) == _S_IFSOCK)
+#	else
+#	    ifdef S_IFSOCK
+#		define S_ISSOCK(m) ((m & S_IFMT) == S_IFSOCK)
+#	    else
+#		define S_ISSOCK(m) (0)
+#	    endif
+#	endif
+#   endif
+#endif
+
+#ifndef S_IRUSR
+#   ifdef S_IREAD
+#	define S_IRUSR S_IREAD
+#	define S_IWUSR S_IWRITE
+#	define S_IXUSR S_IEXEC
+#   else
+#	define S_IRUSR 0400
+#	define S_IWUSR 0200
+#	define S_IXUSR 0100
+#   endif
+#endif
+
+#ifndef S_IRGRP
+#   ifdef S_IRUSR
+#       define S_IRGRP (S_IRUSR>>3)
+#       define S_IWGRP (S_IWUSR>>3)
+#       define S_IXGRP (S_IXUSR>>3)
+#   else
+#       define S_IRGRP 0040
+#       define S_IWGRP 0020
+#       define S_IXGRP 0010
+#   endif
+#endif
+
+#ifndef S_IROTH
+#   ifdef S_IRUSR
+#       define S_IROTH (S_IRUSR>>6)
+#       define S_IWOTH (S_IWUSR>>6)
+#       define S_IXOTH (S_IXUSR>>6)
+#   else
+#       define S_IROTH 0040
+#       define S_IWOTH 0020
+#       define S_IXOTH 0010
+#   endif
+#endif
+
+#ifndef S_ISUID
+#   define S_ISUID 04000
+#endif
+
+#ifndef S_ISGID
+#   define S_ISGID 02000
+#endif
+
+#ifndef S_IRWXU
+#   define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)
+#endif
+
+#ifndef S_IRWXG
+#   define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP)
+#endif
+
+#ifndef S_IRWXO
+#   define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH)
+#endif
+
+/* BeOS 5.0 seems to define S_IREAD and S_IWRITE in <posix/fcntl.h>
+ * which would get included through <sys/file.h >, but that is 3000
+ * lines in the future.  --jhi */
+
+#if !defined(S_IREAD) && !defined(__BEOS__)
+#   define S_IREAD S_IRUSR
+#endif
+
+#if !defined(S_IWRITE) && !defined(__BEOS__)
+#   define S_IWRITE S_IWUSR
+#endif
+
+#ifndef S_IEXEC
+#   define S_IEXEC S_IXUSR
+#endif
+
+#ifdef ff_next
+#   undef ff_next
+#endif
+
+#if defined(cray) || defined(gould) || defined(i860) || defined(pyr)
+#   define SLOPPYDIVIDE
+#endif
+
+#ifdef UV
+#undef UV
+#endif
+
+#ifdef	SPRINTF_E_BUG
+#  define sprintf UTS_sprintf_wrap
+#endif
+
+/* Configure gets this right but the UTS compiler gets it wrong.
+   -- Hal Morris <hom00@utsglobal.com> */
+#ifdef UTS
+#  undef  UVTYPE
+#  define UVTYPE unsigned
+#endif
+
+/*
+    The IV type is supposed to be long enough to hold any integral
+    value or a pointer.
+    --Andy Dougherty	August 1996
+*/
+
+typedef IVTYPE IV;
+typedef UVTYPE UV;
+
+#if defined(USE_64_BIT_INT) && defined(HAS_QUAD)
+#  if QUADKIND == QUAD_IS_INT64_T && defined(INT64_MAX)
+#    define IV_MAX INT64_MAX
+#    define IV_MIN INT64_MIN
+#    define UV_MAX UINT64_MAX
+#    ifndef UINT64_MIN
+#      define UINT64_MIN 0
+#    endif
+#    define UV_MIN UINT64_MIN
+#  else
+#    define IV_MAX PERL_QUAD_MAX
+#    define IV_MIN PERL_QUAD_MIN
+#    define UV_MAX PERL_UQUAD_MAX
+#    define UV_MIN PERL_UQUAD_MIN
+#  endif
+#  define IV_IS_QUAD
+#  define UV_IS_QUAD
+#else
+#  if defined(INT32_MAX) && IVSIZE == 4
+#    define IV_MAX INT32_MAX
+#    define IV_MIN INT32_MIN
+#    ifndef UINT32_MAX_BROKEN /* e.g. HP-UX with gcc messes this up */
+#        define UV_MAX UINT32_MAX
+#    else
+#        define UV_MAX 4294967295U
+#    endif
+#    ifndef UINT32_MIN
+#      define UINT32_MIN 0
+#    endif
+#    define UV_MIN UINT32_MIN
+#  else
+#    define IV_MAX PERL_LONG_MAX
+#    define IV_MIN PERL_LONG_MIN
+#    define UV_MAX PERL_ULONG_MAX
+#    define UV_MIN PERL_ULONG_MIN
+#  endif
+#  if IVSIZE == 8
+#    define IV_IS_QUAD
+#    define UV_IS_QUAD
+#    ifndef HAS_QUAD
+#      define HAS_QUAD
+#    endif
+#  else
+#    undef IV_IS_QUAD
+#    undef UV_IS_QUAD
+#    undef HAS_QUAD
+#  endif
+#endif
+
+#ifndef HAS_QUAD
+# undef PERL_NEED_MY_HTOLE64
+# undef PERL_NEED_MY_LETOH64
+# undef PERL_NEED_MY_HTOBE64
+# undef PERL_NEED_MY_BETOH64
+#endif
+
+#if defined(uts) || defined(UTS)
+#	undef UV_MAX
+#	define UV_MAX (4294967295u)
+#endif
+
+#define IV_DIG (BIT_DIGITS(IVSIZE * 8))
+#define UV_DIG (BIT_DIGITS(UVSIZE * 8))
+
+#ifndef NO_PERL_PRESERVE_IVUV
+#define PERL_PRESERVE_IVUV	/* We like our integers to stay integers. */
+#endif
+
+/*
+ *  The macros INT2PTR and NUM2PTR are (despite their names)
+ *  bi-directional: they will convert int/float to or from pointers.
+ *  However the conversion to int/float are named explicitly:
+ *  PTR2IV, PTR2UV, PTR2NV.
+ *
+ *  For int conversions we do not need two casts if pointers are
+ *  the same size as IV and UV.   Otherwise we need an explicit
+ *  cast (PTRV) to avoid compiler warnings.
+ */
+#if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+#  define PTRV			UV
+#  define INT2PTR(any,d)	(any)(d)
+#else
+#  if PTRSIZE == LONGSIZE
+#    define PTRV		unsigned long
+#    define PTR2ul(p)		(unsigned long)(p)
+#  else
+#    define PTRV		unsigned
+#  endif
+#endif
+
+#ifndef INT2PTR
+#  define INT2PTR(any,d)	(any)(PTRV)(d)
+#endif
+
+#ifndef PTR2ul
+#  define PTR2ul(p)	INT2PTR(unsigned long,p)	
+#endif
+
+#define NUM2PTR(any,d)	(any)(PTRV)(d)
+#define PTR2IV(p)	INT2PTR(IV,p)
+#define PTR2UV(p)	INT2PTR(UV,p)
+#define PTR2NV(p)	NUM2PTR(NV,p)
+#define PTR2nat(p)	(PTRV)(p)	/* pointer to integer of PTRSIZE */
+
+/* According to strict ANSI C89 one cannot freely cast between
+ * data pointers and function (code) pointers.  There are at least
+ * two ways around this.  One (used below) is to do two casts,
+ * first the other pointer to an (unsigned) integer, and then
+ * the integer to the other pointer.  The other way would be
+ * to use unions to "overlay" the pointers.  For an example of
+ * the latter technique, see union dirpu in struct xpvio in sv.h.
+ * The only feasible use is probably temporarily storing
+ * function pointers in a data pointer (such as a void pointer). */
+
+#define DPTR2FPTR(t,p) ((t)PTR2nat(p))	/* data pointer to function pointer */
+#define FPTR2DPTR(t,p) ((t)PTR2nat(p))	/* function pointer to data pointer */
+
+#ifdef USE_LONG_DOUBLE
+#  if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE == DOUBLESIZE
+#      define LONG_DOUBLE_EQUALS_DOUBLE
+#  endif
+#  if !(defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE))
+#     undef USE_LONG_DOUBLE /* Ouch! */
+#  endif
+#endif
+
+#ifdef OVR_DBL_DIG
+/* Use an overridden DBL_DIG */
+# ifdef DBL_DIG
+#  undef DBL_DIG
+# endif
+# define DBL_DIG OVR_DBL_DIG
+#else
+/* The following is all to get DBL_DIG, in order to pick a nice
+   default value for printing floating point numbers in Gconvert
+   (see config.h). (It also has other uses, such as figuring out if
+   a given precision of printing can be done with a double instead of
+   a long double - Allen).
+*/
+#ifdef I_LIMITS
+#include <limits.h>
+#endif
+#ifdef I_FLOAT
+#include <float.h>
+#endif
+#ifndef HAS_DBL_DIG
+#define DBL_DIG	15   /* A guess that works lots of places */
+#endif
+#endif
+#ifdef I_FLOAT
+#include <float.h>
+#endif
+#ifndef HAS_DBL_DIG
+#define DBL_DIG	15   /* A guess that works lots of places */
+#endif
+
+#ifdef OVR_LDBL_DIG
+/* Use an overridden LDBL_DIG */
+# ifdef LDBL_DIG
+#  undef LDBL_DIG
+# endif
+# define LDBL_DIG OVR_LDBL_DIG
+#else
+/* The following is all to get LDBL_DIG, in order to pick a nice
+   default value for printing floating point numbers in Gconvert.
+   (see config.h)
+*/
+# ifdef I_LIMITS
+#   include <limits.h>
+# endif
+# ifdef I_FLOAT
+#  include <float.h>
+# endif
+# ifndef HAS_LDBL_DIG
+#  if LONG_DOUBLESIZE == 10
+#   define LDBL_DIG 18 /* assume IEEE */
+#  else
+#   if LONG_DOUBLESIZE == 12
+#    define LDBL_DIG 18 /* gcc? */
+#   else
+#    if LONG_DOUBLESIZE == 16
+#     define LDBL_DIG 33 /* assume IEEE */
+#    else
+#     if LONG_DOUBLESIZE == DOUBLESIZE
+#      define LDBL_DIG DBL_DIG /* bummer */
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+/*
+ * This is for making sure we have a good DBL_MAX value, if possible,
+ * either for usage as NV_MAX or for usage in figuring out if we can
+ * fit a given long double into a double, if bug-fixing makes it
+ * necessary to do so. - Allen <allens@cpan.org>
+ */
+
+#ifdef I_LIMITS
+#  include <limits.h>
+#endif
+
+#ifdef I_VALUES
+#  if !(defined(DBL_MIN) && defined(DBL_MAX) && defined(I_LIMITS))
+#    include <values.h>
+#    if defined(MAXDOUBLE) && !defined(DBL_MAX)
+#      define DBL_MAX MAXDOUBLE
+#    endif
+#    if defined(MINDOUBLE) && !defined(DBL_MIN)
+#      define DBL_MIN MINDOUBLE
+#    endif
+#  endif
+#endif /* defined(I_VALUES) */
+
+typedef NVTYPE NV;
+
+#ifdef I_IEEEFP
+#   include <ieeefp.h>
+#endif
+
+#ifdef USE_LONG_DOUBLE
+#   ifdef I_SUNMATH
+#       include <sunmath.h>
+#   endif
+#   define NV_DIG LDBL_DIG
+#   ifdef LDBL_MANT_DIG
+#       define NV_MANT_DIG LDBL_MANT_DIG
+#   endif
+#   ifdef LDBL_MIN
+#       define NV_MIN LDBL_MIN
+#   endif
+#   ifdef LDBL_MAX
+#       define NV_MAX LDBL_MAX
+#   endif
+#   ifdef LDBL_MIN_10_EXP
+#       define NV_MIN_10_EXP LDBL_MIN_10_EXP
+#   endif
+#   ifdef LDBL_MAX_10_EXP
+#       define NV_MAX_10_EXP LDBL_MAX_10_EXP
+#   endif
+#   ifdef LDBL_EPSILON
+#       define NV_EPSILON LDBL_EPSILON
+#   endif
+#   ifdef LDBL_MAX
+#       define NV_MAX LDBL_MAX
+/* Having LDBL_MAX doesn't necessarily mean that we have LDBL_MIN... -Allen */
+#   else
+#       ifdef HUGE_VALL
+#           define NV_MAX HUGE_VALL
+#       else
+#           ifdef HUGE_VAL
+#               define NV_MAX ((NV)HUGE_VAL)
+#           endif
+#       endif
+#   endif
+#   ifdef HAS_SQRTL
+#       define Perl_cos cosl
+#       define Perl_sin sinl
+#       define Perl_sqrt sqrtl
+#       define Perl_exp expl
+#       define Perl_log logl
+#       define Perl_atan2 atan2l
+#       define Perl_pow powl
+#       define Perl_floor floorl
+#       define Perl_ceil ceill
+#       define Perl_fmod fmodl
+#   endif
+/* e.g. libsunmath doesn't have modfl and frexpl as of mid-March 2000 */
+#   ifdef HAS_MODFL
+#       define Perl_modf(x,y) modfl(x,y)
+/* eg glibc 2.2 series seems to provide modfl on ppc and arm, but has no
+   prototype in <math.h> */
+#       ifndef HAS_MODFL_PROTO
+EXTERN_C long double modfl(long double, long double *);
+#	endif
+#   else
+#       if defined(HAS_AINTL) && defined(HAS_COPYSIGNL)
+        extern long double Perl_my_modfl(long double x, long double *ip);
+#           define Perl_modf(x,y) Perl_my_modfl(x,y)
+#       endif
+#   endif
+#   ifdef HAS_FREXPL
+#       define Perl_frexp(x,y) frexpl(x,y)
+#   else
+#       if defined(HAS_ILOGBL) && defined(HAS_SCALBNL)
+        extern long double Perl_my_frexpl(long double x, int *e);
+#           define Perl_frexp(x,y) Perl_my_frexpl(x,y)
+#       endif
+#   endif
+#   ifndef Perl_isnan
+#       ifdef HAS_ISNANL
+#           define Perl_isnan(x) isnanl(x)
+#       endif
+#   endif
+#   ifndef Perl_isinf
+#       ifdef HAS_FINITEL
+#           define Perl_isinf(x) !(finitel(x)||Perl_isnan(x))
+#       endif
+#   endif
+#else
+#   define NV_DIG DBL_DIG
+#   ifdef DBL_MANT_DIG
+#       define NV_MANT_DIG DBL_MANT_DIG
+#   endif
+#   ifdef DBL_MIN
+#       define NV_MIN DBL_MIN
+#   endif
+#   ifdef DBL_MAX
+#       define NV_MAX DBL_MAX
+#   endif
+#   ifdef DBL_MIN_10_EXP
+#       define NV_MIN_10_EXP DBL_MIN_10_EXP
+#   endif
+#   ifdef DBL_MAX_10_EXP
+#       define NV_MAX_10_EXP DBL_MAX_10_EXP
+#   endif
+#   ifdef DBL_EPSILON
+#       define NV_EPSILON DBL_EPSILON
+#   endif
+#   ifdef DBL_MAX               /* XXX Does DBL_MAX imply having DBL_MIN? */
+#       define NV_MAX DBL_MAX
+#       define NV_MIN DBL_MIN
+#   else
+#       ifdef HUGE_VAL
+#           define NV_MAX HUGE_VAL
+#       endif
+#   endif
+#   define Perl_cos cos
+#   define Perl_sin sin
+#   define Perl_sqrt sqrt
+#   define Perl_exp exp
+#   define Perl_log log
+#   define Perl_atan2 atan2
+#   define Perl_pow pow
+#   define Perl_floor floor
+#   define Perl_ceil ceil
+#   define Perl_fmod fmod
+#   define Perl_modf(x,y) modf(x,y)
+#   define Perl_frexp(x,y) frexp(x,y)
+#endif
+
+/* rumor has it that Win32 has _fpclass() */
+
+/* SGI has fpclassl... but not with the same result values,
+ * and it's via a typedef (not via #define), so will need to redo Configure
+ * to use. Not worth the trouble, IMO, at least until the below is used
+ * more places. Also has fp_class_l, BTW, via fp_class.h. Feel free to check
+ * with me for the SGI manpages, SGI testing, etcetera, if you want to
+ * try getting this to work with IRIX. - Allen <allens@cpan.org> */
+
+#if !defined(Perl_fp_class) && (defined(HAS_FPCLASS)||defined(HAS_FPCLASSL))
+#    ifdef I_IEEFP
+#        include <ieeefp.h>
+#    endif
+#    ifdef I_FP
+#        include <fp.h>
+#    endif
+#    if defined(USE_LONG_DOUBLE) && defined(HAS_FPCLASSL)
+#        define Perl_fp_class()		fpclassl(x)
+#    else
+#        define Perl_fp_class()		fpclass(x)
+#    endif
+#    define Perl_fp_class_snan(x)	(Perl_fp_class(x)==FP_CLASS_SNAN)
+#    define Perl_fp_class_qnan(x)	(Perl_fp_class(x)==FP_CLASS_QNAN)
+#    define Perl_fp_class_nan(x)	(Perl_fp_class(x)==FP_CLASS_SNAN||Perl_fp_class(x)==FP_CLASS_QNAN)
+#    define Perl_fp_class_ninf(x)	(Perl_fp_class(x)==FP_CLASS_NINF)
+#    define Perl_fp_class_pinf(x)	(Perl_fp_class(x)==FP_CLASS_PINF)
+#    define Perl_fp_class_inf(x)	(Perl_fp_class(x)==FP_CLASS_NINF||Perl_fp_class(x)==FP_CLASS_PINF)
+#    define Perl_fp_class_nnorm(x)	(Perl_fp_class(x)==FP_CLASS_NNORM)
+#    define Perl_fp_class_pnorm(x)	(Perl_fp_class(x)==FP_CLASS_PNORM)
+#    define Perl_fp_class_norm(x)	(Perl_fp_class(x)==FP_CLASS_NNORM||Perl_fp_class(x)==FP_CLASS_PNORM)
+#    define Perl_fp_class_ndenorm(x)	(Perl_fp_class(x)==FP_CLASS_NDENORM)
+#    define Perl_fp_class_pdenorm(x)	(Perl_fp_class(x)==FP_CLASS_PDENORM)
+#    define Perl_fp_class_denorm(x)	(Perl_fp_class(x)==FP_CLASS_NDENORM||Perl_fp_class(x)==FP_CLASS_PDENORM)
+#    define Perl_fp_class_nzero(x)	(Perl_fp_class(x)==FP_CLASS_NZERO)
+#    define Perl_fp_class_pzero(x)	(Perl_fp_class(x)==FP_CLASS_PZERO)
+#    define Perl_fp_class_zero(x)	(Perl_fp_class(x)==FP_CLASS_NZERO||Perl_fp_class(x)==FP_CLASS_PZERO)
+#endif
+
+#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS) && !defined(PERL_MICRO)
+#    include <math.h>
+#    if !defined(FP_SNAN) && defined(I_FP_CLASS)
+#        include <fp_class.h>
+#    endif
+#    define Perl_fp_class(x)		fp_class(x)
+#    define Perl_fp_class_snan(x)	(fp_class(x)==FP_SNAN)
+#    define Perl_fp_class_qnan(x)	(fp_class(x)==FP_QNAN)
+#    define Perl_fp_class_nan(x)	(fp_class(x)==FP_SNAN||fp_class(x)==FP_QNAN)
+#    define Perl_fp_class_ninf(x)	(fp_class(x)==FP_NEG_INF)
+#    define Perl_fp_class_pinf(x)	(fp_class(x)==FP_POS_INF)
+#    define Perl_fp_class_inf(x)	(fp_class(x)==FP_NEG_INF||fp_class(x)==FP_POS_INF)
+#    define Perl_fp_class_nnorm(x)	(fp_class(x)==FP_NEG_NORM)
+#    define Perl_fp_class_pnorm(x)	(fp_class(x)==FP_POS_NORM)
+#    define Perl_fp_class_norm(x)	(fp_class(x)==FP_NEG_NORM||fp_class(x)==FP_POS_NORM)
+#    define Perl_fp_class_ndenorm(x)	(fp_class(x)==FP_NEG_DENORM)
+#    define Perl_fp_class_pdenorm(x)	(fp_class(x)==FP_POS_DENORM)
+#    define Perl_fp_class_denorm(x)	(fp_class(x)==FP_NEG_DENORM||fp_class(x)==FP_POS_DENORM)
+#    define Perl_fp_class_nzero(x)	(fp_class(x)==FP_NEG_ZERO)
+#    define Perl_fp_class_pzero(x)	(fp_class(x)==FP_POS_ZERO)
+#    define Perl_fp_class_zero(x)	(fp_class(x)==FP_NEG_ZERO||fp_class(x)==FP_POS_ZERO)
+#endif
+
+#if !defined(Perl_fp_class) && defined(HAS_FPCLASSIFY)
+#    include <math.h>
+#    define Perl_fp_class(x)		fpclassify(x)
+#    define Perl_fp_class_nan(x)	(fp_classify(x)==FP_SNAN||fp_classify(x)==FP_QNAN)
+#    define Perl_fp_class_inf(x)	(fp_classify(x)==FP_INFINITE)
+#    define Perl_fp_class_norm(x)	(fp_classify(x)==FP_NORMAL)
+#    define Perl_fp_class_denorm(x)	(fp_classify(x)==FP_SUBNORMAL)
+#    define Perl_fp_class_zero(x)	(fp_classify(x)==FP_ZERO)
+#endif
+
+#if !defined(Perl_fp_class) && defined(HAS_CLASS)
+#    include <math.h>
+#    ifndef _cplusplus
+#        define Perl_fp_class(x)	class(x)
+#    else
+#        define Perl_fp_class(x)	_class(x)
+#    endif
+#    define Perl_fp_class_snan(x)	(Perl_fp_class(x)==FP_NANS)
+#    define Perl_fp_class_qnan(x)	(Perl_fp_class(x)==FP_NANQ)
+#    define Perl_fp_class_nan(x)	(Perl_fp_class(x)==FP_SNAN||Perl_fp_class(x)==FP_QNAN)
+#    define Perl_fp_class_ninf(x)	(Perl_fp_class(x)==FP_MINUS_INF)
+#    define Perl_fp_class_pinf(x)	(Perl_fp_class(x)==FP_PLUS_INF)
+#    define Perl_fp_class_inf(x)	(Perl_fp_class(x)==FP_MINUS_INF||Perl_fp_class(x)==FP_PLUS_INF)
+#    define Perl_fp_class_nnorm(x)	(Perl_fp_class(x)==FP_MINUS_NORM)
+#    define Perl_fp_class_pnorm(x)	(Perl_fp_class(x)==FP_PLUS_NORM)
+#    define Perl_fp_class_norm(x)	(Perl_fp_class(x)==FP_MINUS_NORM||Perl_fp_class(x)==FP_PLUS_NORM)
+#    define Perl_fp_class_ndenorm(x)	(Perl_fp_class(x)==FP_MINUS_DENORM)
+#    define Perl_fp_class_pdenorm(x)	(Perl_fp_class(x)==FP_PLUS_DENORM)
+#    define Perl_fp_class_denorm(x)	(Perl_fp_class(x)==FP_MINUS_DENORM||Perl_fp_class(x)==FP_PLUS_DENORM)
+#    define Perl_fp_class_nzero(x)	(Perl_fp_class(x)==FP_MINUS_ZERO)
+#    define Perl_fp_class_pzero(x)	(Perl_fp_class(x)==FP_PLUS_ZERO)
+#    define Perl_fp_class_zero(x)	(Perl_fp_class(x)==FP_MINUS_ZERO||Perl_fp_class(x)==FP_PLUS_ZERO)
+#endif
+
+/* rumor has it that Win32 has _isnan() */
+
+#ifndef Perl_isnan
+#   ifdef HAS_ISNAN
+#       define Perl_isnan(x) isnan((NV)x)
+#   else
+#       ifdef Perl_fp_class_nan
+#           define Perl_isnan(x) Perl_fp_class_nan(x)
+#       else
+#           ifdef HAS_UNORDERED
+#               define Perl_isnan(x) unordered((x), 0.0)
+#           else
+#               define Perl_isnan(x) ((x)!=(x))
+#           endif
+#       endif
+#   endif
+#endif
+
+#ifdef UNDER_CE
+int isnan(double d);
+#endif
+
+#ifndef Perl_isinf
+#   ifdef HAS_ISINF
+#       define Perl_isinf(x) isinf((NV)x)
+#   else
+#       ifdef Perl_fp_class_inf
+#           define Perl_isinf(x) Perl_fp_class_inf(x)
+#       else
+#           define Perl_isinf(x) ((x)==NV_INF)
+#       endif
+#   endif
+#endif
+
+#ifndef Perl_isfinite
+#   ifdef HAS_FINITE
+#       define Perl_isfinite(x) finite((NV)x)
+#   else
+#       ifdef HAS_ISFINITE
+#           define Perl_isfinite(x) isfinite(x)
+#       else
+#           ifdef Perl_fp_class_finite
+#               define Perl_isfinite(x) Perl_fp_class_finite(x)
+#           else
+#               define Perl_isfinite(x) !(Perl_is_inf(x)||Perl_is_nan(x))
+#           endif
+#       endif
+#   endif
+#endif
+
+/* The default is to use Perl's own atof() implementation (in numeric.c).
+ * Usually that is the one to use but for some platforms (e.g. UNICOS)
+ * it is however best to use the native implementation of atof.
+ * You can experiment with using your native one by -DUSE_PERL_ATOF=0.
+ * Some good tests to try out with either setting are t/base/num.t,
+ * t/op/numconvert.t, and t/op/pack.t. Note that if using long doubles
+ * you may need to be using a different function than atof! */
+
+#ifndef USE_PERL_ATOF
+#   ifndef _UNICOS
+#       define USE_PERL_ATOF
+#   endif
+#else
+#   if USE_PERL_ATOF == 0
+#       undef USE_PERL_ATOF
+#   endif
+#endif
+
+#ifdef USE_PERL_ATOF
+#   define Perl_atof(s) Perl_my_atof(s)
+#   define Perl_atof2(s, n) Perl_my_atof2(aTHX_ (s), &(n))
+#else
+#   define Perl_atof(s) (NV)atof(s)
+#   define Perl_atof2(s, n) ((n) = atof(s))
+#endif
+
+/* Previously these definitions used hardcoded figures.
+ * It is hoped these formula are more portable, although
+ * no data one way or another is presently known to me.
+ * The "PERL_" names are used because these calculated constants
+ * do not meet the ANSI requirements for LONG_MAX, etc., which
+ * need to be constants acceptable to #if - kja
+ *    define PERL_LONG_MAX        2147483647L
+ *    define PERL_LONG_MIN        (-LONG_MAX - 1)
+ *    define PERL ULONG_MAX       4294967295L
+ */
+
+#ifdef I_LIMITS  /* Needed for cast_xxx() functions below. */
+#  include <limits.h>
+#endif
+/* Included values.h above if necessary; still including limits.h down here,
+ * despite doing above, because math.h might have overriden... XXX - Allen */
+
+/*
+ * Try to figure out max and min values for the integral types.  THE CORRECT
+ * SOLUTION TO THIS MESS: ADAPT enquire.c FROM GCC INTO CONFIGURE.  The
+ * following hacks are used if neither limits.h or values.h provide them:
+ * U<TYPE>_MAX: for types >= int: ~(unsigned TYPE)0
+ *              for types <  int:  (unsigned TYPE)~(unsigned)0
+ *	The argument to ~ must be unsigned so that later signed->unsigned
+ *	conversion can't modify the value's bit pattern (e.g. -0 -> +0),
+ *	and it must not be smaller than int because ~ does integral promotion.
+ * <type>_MAX: (<type>) (U<type>_MAX >> 1)
+ * <type>_MIN: -<type>_MAX - <is_twos_complement_architecture: (3 & -1) == 3>.
+ *	The latter is a hack which happens to work on some machines but
+ *	does *not* catch any random system, or things like integer types
+ *	with NaN if that is possible.
+ *
+ * All of the types are explicitly cast to prevent accidental loss of
+ * numeric range, and in the hope that they will be less likely to confuse
+ * over-eager optimizers.
+ *
+ */
+
+#define PERL_UCHAR_MIN ((unsigned char)0)
+
+#ifdef UCHAR_MAX
+#  define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
+#else
+#  ifdef MAXUCHAR
+#    define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
+#  else
+#    define PERL_UCHAR_MAX       ((unsigned char)~(unsigned)0)
+#  endif
+#endif
+
+/*
+ * CHAR_MIN and CHAR_MAX are not included here, as the (char) type may be
+ * ambiguous. It may be equivalent to (signed char) or (unsigned char)
+ * depending on local options. Until Configure detects this (or at least
+ * detects whether the "signed" keyword is available) the CHAR ranges
+ * will not be included. UCHAR functions normally.
+ *                                                           - kja
+ */
+
+#define PERL_USHORT_MIN ((unsigned short)0)
+
+#ifdef USHORT_MAX
+#  define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
+#else
+#  ifdef MAXUSHORT
+#    define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
+#  else
+#    ifdef USHRT_MAX
+#      define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
+#    else
+#      define PERL_USHORT_MAX       ((unsigned short)~(unsigned)0)
+#    endif
+#  endif
+#endif
+
+#ifdef SHORT_MAX
+#  define PERL_SHORT_MAX ((short)SHORT_MAX)
+#else
+#  ifdef MAXSHORT    /* Often used in <values.h> */
+#    define PERL_SHORT_MAX ((short)MAXSHORT)
+#  else
+#    ifdef SHRT_MAX
+#      define PERL_SHORT_MAX ((short)SHRT_MAX)
+#    else
+#      define PERL_SHORT_MAX      ((short) (PERL_USHORT_MAX >> 1))
+#    endif
+#  endif
+#endif
+
+#ifdef SHORT_MIN
+#  define PERL_SHORT_MIN ((short)SHORT_MIN)
+#else
+#  ifdef MINSHORT
+#    define PERL_SHORT_MIN ((short)MINSHORT)
+#  else
+#    ifdef SHRT_MIN
+#      define PERL_SHORT_MIN ((short)SHRT_MIN)
+#    else
+#      define PERL_SHORT_MIN        (-PERL_SHORT_MAX - ((3 & -1) == 3))
+#    endif
+#  endif
+#endif
+
+#ifdef UINT_MAX
+#  define PERL_UINT_MAX ((unsigned int)UINT_MAX)
+#else
+#  ifdef MAXUINT
+#    define PERL_UINT_MAX ((unsigned int)MAXUINT)
+#  else
+#    define PERL_UINT_MAX       (~(unsigned int)0)
+#  endif
+#endif
+
+#define PERL_UINT_MIN ((unsigned int)0)
+
+#ifdef INT_MAX
+#  define PERL_INT_MAX ((int)INT_MAX)
+#else
+#  ifdef MAXINT    /* Often used in <values.h> */
+#    define PERL_INT_MAX ((int)MAXINT)
+#  else
+#    define PERL_INT_MAX        ((int)(PERL_UINT_MAX >> 1))
+#  endif
+#endif
+
+#ifdef INT_MIN
+#  define PERL_INT_MIN ((int)INT_MIN)
+#else
+#  ifdef MININT
+#    define PERL_INT_MIN ((int)MININT)
+#  else
+#    define PERL_INT_MIN        (-PERL_INT_MAX - ((3 & -1) == 3))
+#  endif
+#endif
+
+#ifdef ULONG_MAX
+#  define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
+#else
+#  ifdef MAXULONG
+#    define PERL_ULONG_MAX ((unsigned long)MAXULONG)
+#  else
+#    define PERL_ULONG_MAX       (~(unsigned long)0)
+#  endif
+#endif
+
+#define PERL_ULONG_MIN ((unsigned long)0L)
+
+#ifdef LONG_MAX
+#  define PERL_LONG_MAX ((long)LONG_MAX)
+#else
+#  ifdef MAXLONG    /* Often used in <values.h> */
+#    define PERL_LONG_MAX ((long)MAXLONG)
+#  else
+#    define PERL_LONG_MAX        ((long) (PERL_ULONG_MAX >> 1))
+#  endif
+#endif
+
+#ifdef LONG_MIN
+#  define PERL_LONG_MIN ((long)LONG_MIN)
+#else
+#  ifdef MINLONG
+#    define PERL_LONG_MIN ((long)MINLONG)
+#  else
+#    define PERL_LONG_MIN        (-PERL_LONG_MAX - ((3 & -1) == 3))
+#  endif
+#endif
+
+#ifdef UV_IS_QUAD
+
+#    define PERL_UQUAD_MAX	(~(UV)0)
+#    define PERL_UQUAD_MIN	((UV)0)
+#    define PERL_QUAD_MAX 	((IV) (PERL_UQUAD_MAX >> 1))
+#    define PERL_QUAD_MIN 	(-PERL_QUAD_MAX - ((3 & -1) == 3))
+
+#endif
+
+#ifdef MYMALLOC
+#  include "malloc_ctl.h"
+#endif
+
+struct RExC_state_t;
+
+typedef MEM_SIZE STRLEN;
+
+typedef struct op OP;
+typedef struct cop COP;
+typedef struct unop UNOP;
+typedef struct binop BINOP;
+typedef struct listop LISTOP;
+typedef struct logop LOGOP;
+typedef struct pmop PMOP;
+typedef struct svop SVOP;
+typedef struct padop PADOP;
+typedef struct pvop PVOP;
+typedef struct loop LOOP;
+
+typedef struct interpreter PerlInterpreter;
+
+/* Amdahl's <ksync.h> has struct sv */
+/* SGI's <sys/sema.h> has struct sv */
+#if defined(UTS) || defined(__sgi)
+#   define STRUCT_SV perl_sv
+#else
+#   define STRUCT_SV sv
+#endif
+typedef struct STRUCT_SV SV;
+typedef struct av AV;
+typedef struct hv HV;
+typedef struct cv CV;
+typedef struct regexp REGEXP;
+typedef struct gp GP;
+typedef struct gv GV;
+typedef struct io IO;
+typedef struct context PERL_CONTEXT;
+typedef struct block BLOCK;
+
+typedef struct magic MAGIC;
+typedef struct xrv XRV;
+typedef struct xpv XPV;
+typedef struct xpviv XPVIV;
+typedef struct xpvuv XPVUV;
+typedef struct xpvnv XPVNV;
+typedef struct xpvmg XPVMG;
+typedef struct xpvlv XPVLV;
+typedef struct xpvav XPVAV;
+typedef struct xpvhv XPVHV;
+typedef struct xpvgv XPVGV;
+typedef struct xpvcv XPVCV;
+typedef struct xpvbm XPVBM;
+typedef struct xpvfm XPVFM;
+typedef struct xpvio XPVIO;
+typedef struct mgvtbl MGVTBL;
+typedef union any ANY;
+typedef struct ptr_tbl_ent PTR_TBL_ENT_t;
+typedef struct ptr_tbl PTR_TBL_t;
+typedef struct clone_params CLONE_PARAMS;
+
+#include "handy.h"
+
+#if defined(USE_LARGE_FILES) && !defined(NO_64_BIT_RAWIO)
+#   if LSEEKSIZE == 8 && !defined(USE_64_BIT_RAWIO)
+#       define USE_64_BIT_RAWIO	/* implicit */
+#   endif
+#endif
+
+/* Notice the use of HAS_FSEEKO: now we are obligated to always use
+ * fseeko/ftello if possible.  Don't go #defining ftell to ftello yourself,
+ * however, because operating systems like to do that themself. */
+#ifndef FSEEKSIZE
+#   ifdef HAS_FSEEKO
+#       define FSEEKSIZE LSEEKSIZE
+#   else
+#       define FSEEKSIZE LONGSIZE
+#   endif
+#endif
+
+#if defined(USE_LARGE_FILES) && !defined(NO_64_BIT_STDIO)
+#   if FSEEKSIZE == 8 && !defined(USE_64_BIT_STDIO)
+#       define USE_64_BIT_STDIO /* implicit */
+#   endif
+#endif
+
+#ifdef USE_64_BIT_RAWIO
+#   ifdef HAS_OFF64_T
+#       undef Off_t
+#       define Off_t off64_t
+#       undef LSEEKSIZE
+#       define LSEEKSIZE 8
+#   endif
+/* Most 64-bit environments have defines like _LARGEFILE_SOURCE that
+ * will trigger defines like the ones below.  Some 64-bit environments,
+ * however, do not.  Therefore we have to explicitly mix and match. */
+#   if defined(USE_OPEN64)
+#       define open open64
+#   endif
+#   if defined(USE_LSEEK64)
+#       define lseek lseek64
+#   else
+#       if defined(USE_LLSEEK)
+#           define lseek llseek
+#       endif
+#   endif
+#   if defined(USE_STAT64)
+#       define stat stat64
+#   endif
+#   if defined(USE_FSTAT64)
+#       define fstat fstat64
+#   endif
+#   if defined(USE_LSTAT64)
+#       define lstat lstat64
+#   endif
+#   if defined(USE_FLOCK64)
+#       define flock flock64
+#   endif
+#   if defined(USE_LOCKF64)
+#       define lockf lockf64
+#   endif
+#   if defined(USE_FCNTL64)
+#       define fcntl fcntl64
+#   endif
+#   if defined(USE_TRUNCATE64)
+#       define truncate truncate64
+#   endif
+#   if defined(USE_FTRUNCATE64)
+#       define ftruncate ftruncate64
+#   endif
+#endif
+
+#ifdef USE_64_BIT_STDIO
+#   ifdef HAS_FPOS64_T
+#       undef Fpos_t
+#       define Fpos_t fpos64_t
+#   endif
+/* Most 64-bit environments have defines like _LARGEFILE_SOURCE that
+ * will trigger defines like the ones below.  Some 64-bit environments,
+ * however, do not. */
+#   if defined(USE_FOPEN64)
+#       define fopen fopen64
+#   endif
+#   if defined(USE_FSEEK64)
+#       define fseek fseek64 /* don't do fseeko here, see perlio.c */
+#   endif
+#   if defined(USE_FTELL64)
+#       define ftell ftell64 /* don't do ftello here, see perlio.c */
+#   endif
+#   if defined(USE_FSETPOS64)
+#       define fsetpos fsetpos64
+#   endif
+#   if defined(USE_FGETPOS64)
+#       define fgetpos fgetpos64
+#   endif
+#   if defined(USE_TMPFILE64)
+#       define tmpfile tmpfile64
+#   endif
+#   if defined(USE_FREOPEN64)
+#       define freopen freopen64
+#   endif
+#endif
+
+#if defined(OS2) || defined(MACOS_TRADITIONAL)
+#  include "iperlsys.h"
+#endif
+
+#if defined(__OPEN_VM)
+#   include "vmesa/vmesaish.h"
+#   define ISHISH "vmesa"
+#endif
+
+#ifdef DOSISH
+#   if defined(OS2)
+#       include "os2ish.h"
+#   else
+#       include "dosish.h"
+#   endif
+#   define ISHISH "dos"
+#endif
+
+#if defined(VMS)
+#   include "vmsish.h"
+#   include "embed.h"
+#   define ISHISH "vms"
+#endif
+
+#if defined(PLAN9)
+#   include "./plan9/plan9ish.h"
+#   define ISHISH "plan9"
+#endif
+
+#if defined(MPE)
+#  include "mpeix/mpeixish.h"
+#  define ISHISH "mpeix"
+#endif
+
+#if defined(__VOS__)
+#   ifdef __GNUC__
+#     include "./vos/vosish.h"
+#   else
+#     include "vos/vosish.h"
+#   endif
+#   define ISHISH "vos"
+#endif
+
+#if defined(EPOC)
+#   include "epocish.h"
+#   define ISHISH "epoc"
+#endif
+
+#if defined(MACOS_TRADITIONAL)
+#   include "macos/macish.h"
+#   ifndef NO_ENVIRON_ARRAY
+#       define NO_ENVIRON_ARRAY
+#   endif
+#   define ISHISH "macos classic"
+#endif
+
+#if defined(__BEOS__)
+#   include "beos/beosish.h"
+#   define ISHISH "beos"
+#endif
+
+#ifndef ISHISH
+#   include "unixish.h"
+#   define ISHISH "unix"
+#endif
+
+#ifndef NO_ENVIRON_ARRAY
+#  define USE_ENVIRON_ARRAY
+#endif
+
+/*
+ * initialise to avoid floating-point exceptions from overflow, etc
+ */
+#ifndef PERL_FPU_INIT
+#  ifdef HAS_FPSETMASK
+#    if HAS_FLOATINGPOINT_H
+#      include <floatingpoint.h>
+#    endif
+#    define PERL_FPU_INIT fpsetmask(0);
+#  else
+#    if defined(SIGFPE) && defined(SIG_IGN) && !defined(PERL_MICRO)
+#      define PERL_FPU_INIT       PL_sigfpe_saved = signal(SIGFPE, SIG_IGN);
+#      define PERL_FPU_PRE_EXEC   { Sigsave_t xfpe; rsignal_save(SIGFPE, PL_sigfpe_saved, &xfpe);
+#      define PERL_FPU_POST_EXEC    rsignal_restore(SIGFPE, &xfpe); }
+#    else
+#      define PERL_FPU_INIT
+
+#    endif
+#  endif
+#endif
+#ifndef PERL_FPU_PRE_EXEC
+#  define PERL_FPU_PRE_EXEC   {
+#  define PERL_FPU_POST_EXEC  }
+#endif
+
+#ifndef PERL_SYS_INIT3
+#  define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp)
+#endif
+
+#ifndef PERL_WRITE_MSG_TO_CONSOLE
+#  define PERL_WRITE_MSG_TO_CONSOLE(io, msg, len) PerlIO_write(io, msg, len)
+#endif
+
+#ifndef MAXPATHLEN
+#  ifdef PATH_MAX
+#    ifdef _POSIX_PATH_MAX
+#       if PATH_MAX > _POSIX_PATH_MAX
+/* POSIX 1990 (and pre) was ambiguous about whether PATH_MAX
+ * included the null byte or not.  Later amendments of POSIX,
+ * XPG4, the Austin Group, and the Single UNIX Specification
+ * all explicitly include the null byte in the PATH_MAX.
+ * Ditto for _POSIX_PATH_MAX. */
+#         define MAXPATHLEN PATH_MAX
+#       else
+#         define MAXPATHLEN _POSIX_PATH_MAX
+#       endif
+#    else
+#      define MAXPATHLEN (PATH_MAX+1)
+#    endif
+#  else
+#    ifdef _POSIX_PATH_MAX
+#       define MAXPATHLEN _POSIX_PATH_MAX
+#    else
+#       define MAXPATHLEN 1024	/* Err on the large side. */
+#    endif
+#  endif
+#endif
+
+/* In case Configure was not used (we are using a "canned config"
+ * such as Win32, or a cross-compilation setup, for example) try going
+ * by the gcc major and minor versions.  One useful URL is
+ * http://www.ohse.de/uwe/articles/gcc-attributes.html,
+ * but contrary to this information warn_unused_result seems
+ * not to be in gcc 3.3.5, at least. --jhi
+ * Set these up now otherwise we get confused when some of the <*thread.h>
+ * includes below indirectly pull in <perlio.h> (which needs to know if we
+ * have HASATTRIBUTE_FORMAT).
+ */
+
+#if defined __GNUC__
+#  if __GNUC__ >= 3 /* 3.0 -> */ /* XXX Verify this version */
+#    define HASATTRIBUTE_FORMAT
+#  endif
+#  if __GNUC__ >= 3 /* 3.0 -> */
+#    define HASATTRIBUTE_MALLOC
+#  endif
+#  if __GNUC__ == 3 && __GNUC_MINOR__ >= 3 || __GNUC__ > 3 /* 3.3 -> */
+#    define HASATTRIBUTE_NONNULL
+#  endif
+#  if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 || __GNUC__ > 2 /* 2.5 -> */
+#    define HASATTRIBUTE_NORETURN
+#  endif
+#  if __GNUC__ >= 3 /* gcc 3.0 -> */
+#    define HASATTRIBUTE_PURE
+#  endif
+#  if __GNUC__ >= 3 /* gcc 3.0 -> */ /* XXX Verify this version */
+#    define HASATTRIBUTE_UNUSED
+#  endif
+#  if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 /* 3.4 -> */
+#    define HASATTRIBUTE_WARN_UNUSED_RESULT
+#  endif
+#endif
+
+/*
+ * USE_5005THREADS needs to be after unixish.h as <pthread.h> includes
+ * <sys/signal.h> which defines NSIG - which will stop inclusion of <signal.h>
+ * this results in many functions being undeclared which bothers C++
+ * May make sense to have threads after "*ish.h" anyway
+ */
+
+#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
+#  if defined(USE_5005THREADS)
+   /* pending resolution of licensing issues, we avoid the erstwhile
+    * atomic.h everywhere */
+#  define EMULATE_ATOMIC_REFCOUNTS
+#  endif
+#  ifdef NETWARE
+#   include <nw5thread.h>
+#  else
+#  ifdef FAKE_THREADS
+#    include "fakethr.h"
+#  else
+#    ifdef WIN32
+#      include <win32thread.h>
+#    else
+#      ifdef OS2
+#        include "os2thread.h"
+#      else
+#        ifdef I_MACH_CTHREADS
+#          include <mach/cthreads.h>
+#          if (defined(NeXT) || defined(__NeXT__)) && defined(PERL_POLLUTE_MALLOC)
+#            define MUTEX_INIT_CALLS_MALLOC
+#          endif
+typedef cthread_t	perl_os_thread;
+typedef mutex_t		perl_mutex;
+typedef condition_t	perl_cond;
+typedef void *		perl_key;
+#        else /* Posix threads */
+#          ifdef I_PTHREAD
+#            include <pthread.h>
+#          endif
+typedef pthread_t	perl_os_thread;
+typedef pthread_mutex_t	perl_mutex;
+typedef pthread_cond_t	perl_cond;
+typedef pthread_key_t	perl_key;
+#        endif /* I_MACH_CTHREADS */
+#      endif /* OS2 */
+#    endif /* WIN32 */
+#  endif /* FAKE_THREADS */
+#endif	/* NETWARE */
+#endif /* USE_5005THREADS || USE_ITHREADS */
+
+#if defined(WIN32)
+#  include "win32.h"
+#endif
+
+#ifdef NETWARE
+#  include "netware.h"
+#endif
+
+#ifdef VMS
+#   define STATUS_NATIVE	PL_statusvalue_vms
+#   define STATUS_NATIVE_EXPORT \
+	(((I32)PL_statusvalue_vms == -1 ? 44 : PL_statusvalue_vms) | (VMSISH_HUSHED ? 0x10000000 : 0))
+#   define STATUS_NATIVE_SET(n)						\
+	STMT_START {							\
+	    PL_statusvalue_vms = (n);					\
+	    if ((I32)PL_statusvalue_vms == -1)				\
+		PL_statusvalue = -1;					\
+	    else if (PL_statusvalue_vms & STS$M_SUCCESS)		\
+		PL_statusvalue = 0;					\
+	    else if ((PL_statusvalue_vms & STS$M_SEVERITY) == 0)	\
+		PL_statusvalue = 1 << 8;				\
+	    else							\
+		PL_statusvalue = (PL_statusvalue_vms & STS$M_SEVERITY) << 8;	\
+	} STMT_END
+#   define STATUS_POSIX	PL_statusvalue
+#   ifdef VMSISH_STATUS
+#	define STATUS_CURRENT	(VMSISH_STATUS ? STATUS_NATIVE : STATUS_POSIX)
+#   else
+#	define STATUS_CURRENT	STATUS_POSIX
+#   endif
+#   define STATUS_POSIX_SET(n)				\
+	STMT_START {					\
+	    PL_statusvalue = (n);				\
+	    if (PL_statusvalue != -1) {			\
+		PL_statusvalue &= 0xFFFF;			\
+		PL_statusvalue_vms = PL_statusvalue ? 44 : 1;	\
+	    }						\
+	    else PL_statusvalue_vms = -1;			\
+	} STMT_END
+#   define STATUS_ALL_SUCCESS	(PL_statusvalue = 0, PL_statusvalue_vms = 1)
+#   define STATUS_ALL_FAILURE	(PL_statusvalue = 1, PL_statusvalue_vms = 44)
+#else
+#   define STATUS_NATIVE	STATUS_POSIX
+#   define STATUS_NATIVE_EXPORT	STATUS_POSIX
+#   define STATUS_NATIVE_SET	STATUS_POSIX_SET
+#   define STATUS_POSIX		PL_statusvalue
+#   define STATUS_POSIX_SET(n)		\
+	STMT_START {			\
+	    PL_statusvalue = (n);		\
+	    if (PL_statusvalue != -1)	\
+		PL_statusvalue &= 0xFFFF;	\
+	} STMT_END
+#   define STATUS_CURRENT STATUS_POSIX
+#   define STATUS_ALL_SUCCESS	(PL_statusvalue = 0)
+#   define STATUS_ALL_FAILURE	(PL_statusvalue = 1)
+#endif
+
+/* flags in PL_exit_flags for nature of exit() */
+#define PERL_EXIT_EXPECTED	0x01
+#define PERL_EXIT_DESTRUCT_END  0x02  /* Run END in perl_destruct */
+
+#ifndef MEMBER_TO_FPTR
+#  define MEMBER_TO_FPTR(name)		name
+#endif
+
+/* format to use for version numbers in file/directory names */
+/* XXX move to Configure? */
+#ifndef PERL_FS_VER_FMT
+#  define PERL_FS_VER_FMT	"%d.%d.%d"
+#endif
+
+/* This defines a way to flush all output buffers.  This may be a
+ * performance issue, so we allow people to disable it.  Also, if
+ * we are using stdio, there are broken implementations of fflush(NULL)
+ * out there, Solaris being the most prominent.
+ */
+#ifndef PERL_FLUSHALL_FOR_CHILD
+# if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO)
+#  define PERL_FLUSHALL_FOR_CHILD	PerlIO_flush((PerlIO*)NULL)
+# else
+#  ifdef FFLUSH_ALL
+#   define PERL_FLUSHALL_FOR_CHILD	my_fflush_all()
+#  else
+#   define PERL_FLUSHALL_FOR_CHILD	NOOP
+#  endif
+# endif
+#endif
+
+#ifndef PERL_WAIT_FOR_CHILDREN
+#  define PERL_WAIT_FOR_CHILDREN	NOOP
+#endif
+
+/* the traditional thread-unsafe notion of "current interpreter". */
+#ifndef PERL_SET_INTERP
+#  define PERL_SET_INTERP(i)		(PL_curinterp = (PerlInterpreter*)(i))
+#endif
+
+#ifndef PERL_GET_INTERP
+#  define PERL_GET_INTERP		(PL_curinterp)
+#endif
+
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_GET_THX)
+#  ifdef USE_5005THREADS
+#    define PERL_GET_THX		((struct perl_thread *)PERL_GET_CONTEXT)
+#  else
+#  ifdef MULTIPLICITY
+#    define PERL_GET_THX		((PerlInterpreter *)PERL_GET_CONTEXT)
+#  endif
+#  endif
+#  define PERL_SET_THX(t)		PERL_SET_CONTEXT(t)
+#endif
+
+#ifndef SVf
+#  ifdef CHECK_FORMAT
+#    define SVf "-p"
+#  else
+#    define SVf "_"
+#  endif
+#endif
+
+#ifndef SVf_precision
+#  ifdef CHECK_FORMAT
+#    define SVf_precision(n) "-" n "p"
+#  else
+#    define SVf_precision(n) "." n "_"
+#  endif
+#endif
+
+#ifndef VDf
+#  ifdef CHECK_FORMAT
+#    define VDf "-1p"
+#  else
+#    define VDf "vd"
+#  endif
+#endif
+
+#ifndef SVf32
+#  define SVf32 SVf_precision("32")
+#endif
+
+#ifndef SVf256
+#  define SVf256 SVf_precision("256")
+#endif
+ 
+#ifndef UVf
+#  define UVf UVuf
+#endif
+
+#ifndef PERL_CORE
+#  ifndef DieNull
+#    define DieNull Perl_vdie(aTHX_ Nullch, Null(va_list *))
+#  endif
+#endif
+
+/* Because 5.8.x has to keep using %_ for SVf, which will make the format
+ * checking code (quite correctly) bleat a lot.  */
+#ifndef CHECK_FORMAT
+#  undef HASATTRIBUTE_FORMAT
+#endif
+
+#ifdef HASATTRIBUTE_FORMAT
+#  define __attribute__format__(x,y,z)      __attribute__((format(x,y,z)))
+#endif
+#ifdef HASATTRIBUTE_MALLOC
+#  define __attribute__malloc__             __attribute__((__malloc__))
+#endif
+#ifdef HASATTRIBUTE_NONNULL
+#  define __attribute__nonnull__(a)         __attribute__((nonnull(a)))
+#endif
+#ifdef HASATTRIBUTE_NORETURN
+#  define __attribute__noreturn__           __attribute__((noreturn))
+#endif
+#ifdef HASATTRIBUTE_PURE
+#  define __attribute__pure__               __attribute__((pure))
+#endif
+#ifdef HASATTRIBUTE_UNUSED
+#  define __attribute__unused__             __attribute__((unused))
+#endif
+#ifdef HASATTRIBUTE_WARN_UNUSED_RESULT
+#  define __attribute__warn_unused_result__ __attribute__((warn_unused_result))
+#endif
+
+/* If we haven't defined the attributes yet, define them to blank. */
+#ifndef __attribute__format__
+#  define __attribute__format__(x,y,z)
+#endif
+#ifndef __attribute__malloc__
+#  define __attribute__malloc__
+#endif
+#ifndef __attribute__nonnull__
+#  define __attribute__nonnull__(a)
+#endif
+#ifndef __attribute__noreturn__
+#  define __attribute__noreturn__
+#endif
+#ifndef __attribute__pure__
+#  define __attribute__pure__
+#endif
+#ifndef __attribute__unused__
+#  define __attribute__unused__
+#endif
+#ifndef __attribute__warn_unused_result__
+#  define __attribute__warn_unused_result__
+#endif
+
+/* For functions that are marked as __attribute__noreturn__, it's not
+   appropriate to call return.  In either case, include the lint directive.
+ */
+#ifdef HASATTRIBUTE_NORETURN
+#  define NORETURN_FUNCTION_END /* NOT REACHED */
+#else
+#  define NORETURN_FUNCTION_END /* NOT REACHED */ return 0
+#endif
+
+/* Some unistd.h's give a prototype for pause() even though
+   HAS_PAUSE ends up undefined.  This causes the #define
+   below to be rejected by the compiler.  Sigh.
+*/
+#ifdef HAS_PAUSE
+#define Pause	pause
+#else
+#define Pause() sleep((32767<<16)+32767)
+#endif
+
+#ifndef IOCPARM_LEN
+#   ifdef IOCPARM_MASK
+	/* on BSDish systems we're safe */
+#	define IOCPARM_LEN(x)  (((x) >> 16) & IOCPARM_MASK)
+#   else
+#	if defined(_IOC_SIZE) && defined(__GLIBC__)
+	/* on Linux systems we're safe; except when we're not [perl #38223] */
+#	    define IOCPARM_LEN(x) (_IOC_SIZE(x) < 256 ? 256 : _IOC_SIZE(x))
+#	else
+	/* otherwise guess at what's safe */
+#	    define IOCPARM_LEN(x)	256
+#	endif
+#   endif
+#endif
+
+#if defined(__CYGWIN__)
+/* USEMYBINMODE
+ *   This symbol, if defined, indicates that the program should
+ *   use the routine my_binmode(FILE *fp, char iotype, int mode) to insure
+ *   that a file is in "binary" mode -- that is, that no translation
+ *   of bytes occurs on read or write operations.
+ */
+#  define USEMYBINMODE /**/
+#  include <io.h> /* for setmode() prototype */
+#  define my_binmode(fp, iotype, mode) \
+            (PerlLIO_setmode(fileno(fp), mode) != -1 ? TRUE : FALSE)
+#endif
+
+#ifdef __CYGWIN__
+void init_os_extras(void);
+#endif
+
+#ifdef UNION_ANY_DEFINITION
+UNION_ANY_DEFINITION;
+#else
+union any {
+    void*	any_ptr;
+    I32		any_i32;
+    IV		any_iv;
+    long	any_long;
+    bool	any_bool;
+    void	(*any_dptr) (void*);
+    void	(*any_dxptr) (pTHX_ void*);
+};
+#endif
+
+#ifdef USE_5005THREADS
+#define ARGSproto struct perl_thread *thr
+#else
+#define ARGSproto
+#endif /* USE_5005THREADS */
+
+typedef I32 (*filter_t) (pTHX_ int, SV *, int);
+
+#define FILTER_READ(idx, sv, len)  filter_read(idx, sv, len)
+#define FILTER_DATA(idx)	   (AvARRAY(PL_rsfp_filters)[idx])
+#define FILTER_ISREADER(idx)	   (idx >= AvFILLp(PL_rsfp_filters))
+
+#if defined(_AIX) && !defined(_AIX43)
+#if defined(USE_REENTRANT) || defined(_REENTRANT) || defined(_THREAD_SAFE)
+/* We cannot include <crypt.h> to get the struct crypt_data
+ * because of setkey prototype problems when threading */
+typedef        struct crypt_data {     /* straight from /usr/include/crypt.h */
+    /* From OSF, Not needed in AIX
+       char C[28], D[28];
+    */
+    char E[48];
+    char KS[16][48];
+    char block[66];
+    char iobuf[16];
+} CRYPTD;
+#endif /* threading */
+#endif /* AIX */
+
+#if !defined(OS2) && !defined(MACOS_TRADITIONAL)
+#  include "iperlsys.h"
+#endif
+
+/* [perl #22371] Algorimic Complexity Attack on Perl 5.6.1, 5.8.0.
+ * Note that the USE_HASH_SEED and USE_HASH_SEED_EXPLICIT are *NOT*
+ * defined by Configure, despite their names being similar to the
+ * other defines like USE_ITHREADS.  Configure in fact knows nothing
+ * about the randomised hashes.  Therefore to enable/disable the hash
+ * randomisation defines use the Configure -Accflags=... instead. */
+#if !defined(NO_HASH_SEED) && !defined(USE_HASH_SEED) && !defined(USE_HASH_SEED_EXPLICIT)
+#  define USE_HASH_SEED
+#endif
+
+#include "regexp.h"
+#include "sv.h"
+#include "util.h"
+#include "form.h"
+#include "gv.h"
+#include "pad.h"
+#include "cv.h"
+#include "opnames.h"
+#include "op.h"
+#include "cop.h"
+#include "av.h"
+#include "hv.h"
+#include "mg.h"
+#include "scope.h"
+#include "warnings.h"
+#include "utf8.h"
+
+/* Current curly descriptor */
+typedef struct curcur CURCUR;
+struct curcur {
+    int		parenfloor;	/* how far back to strip paren data */
+    int		cur;		/* how many instances of scan we've matched */
+    int		min;		/* the minimal number of scans to match */
+    int		max;		/* the maximal number of scans to match */
+    int		minmod;		/* whether to work our way up or down */
+    regnode *	scan;		/* the thing to match */
+    regnode *	next;		/* what has to match after it */
+    char *	lastloc;	/* where we started matching this scan */
+    CURCUR *	oldcc;		/* current curly before we started this one */
+};
+
+typedef struct _sublex_info SUBLEXINFO;
+struct _sublex_info {
+    I32 super_state;	/* lexer state to save */
+    I32 sub_inwhat;	/* "lex_inwhat" to use */
+    OP *sub_op;		/* "lex_op" to use */
+    char *super_bufptr;	/* PL_bufptr that was */
+    char *super_bufend;	/* PL_bufend that was */
+};
+
+typedef struct magic_state MGS;	/* struct magic_state defined in mg.c */
+
+struct scan_data_t;		/* Used in S_* functions in regcomp.c */
+struct regnode_charclass_class;	/* Used in S_* functions in regcomp.c */
+
+typedef I32 CHECKPOINT;
+
+struct ptr_tbl_ent {
+    struct ptr_tbl_ent*		next;
+    const void*			oldval;
+    void*			newval;
+};
+
+struct ptr_tbl {
+    struct ptr_tbl_ent**	tbl_ary;
+    UV				tbl_max;
+    UV				tbl_items;
+};
+
+#if defined(iAPX286) || defined(M_I286) || defined(I80286)
+#   define I286
+#endif
+
+#if defined(htonl) && !defined(HAS_HTONL)
+#define HAS_HTONL
+#endif
+#if defined(htons) && !defined(HAS_HTONS)
+#define HAS_HTONS
+#endif
+#if defined(ntohl) && !defined(HAS_NTOHL)
+#define HAS_NTOHL
+#endif
+#if defined(ntohs) && !defined(HAS_NTOHS)
+#define HAS_NTOHS
+#endif
+#ifndef HAS_HTONL
+#if (BYTEORDER & 0xffff) != 0x4321
+#define HAS_HTONS
+#define HAS_HTONL
+#define HAS_NTOHS
+#define HAS_NTOHL
+#define MYSWAP
+#define htons my_swap
+#define htonl my_htonl
+#define ntohs my_swap
+#define ntohl my_ntohl
+#endif
+#else
+#if (BYTEORDER & 0xffff) == 0x4321
+#undef HAS_HTONS
+#undef HAS_HTONL
+#undef HAS_NTOHS
+#undef HAS_NTOHL
+#endif
+#endif
+
+/*
+ * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
+ * -DWS
+ */
+#if BYTEORDER != 0x1234
+# define HAS_VTOHL
+# define HAS_VTOHS
+# define HAS_HTOVL
+# define HAS_HTOVS
+# if BYTEORDER == 0x4321 || BYTEORDER == 0x87654321
+#  define vtohl(x)	((((x)&0xFF)<<24)	\
+			+(((x)>>24)&0xFF)	\
+			+(((x)&0x0000FF00)<<8)	\
+			+(((x)&0x00FF0000)>>8)	)
+#  define vtohs(x)	((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
+#  define htovl(x)	vtohl(x)
+#  define htovs(x)	vtohs(x)
+# endif
+	/* otherwise default to functions in util.c */
+#ifndef htovs
+short htovs(short n);
+short vtohs(short n);
+long htovl(long n);
+long vtohl(long n);
+#endif
+#endif
+
+/* *MAX Plus 1. A floating point value.
+   Hopefully expressed in a way that dodgy floating point can't mess up.
+   >> 2 rather than 1, so that value is safely less than I32_MAX after 1
+   is added to it
+   May find that some broken compiler will want the value cast to I32.
+   [after the shift, as signed >> may not be as secure as unsigned >>]
+*/
+#define I32_MAX_P1 (2.0 * (1 + (((U32)I32_MAX) >> 1)))
+#define U32_MAX_P1 (4.0 * (1 + ((U32_MAX) >> 2)))
+/* For compilers that can't correctly cast NVs over 0x7FFFFFFF (or
+   0x7FFFFFFFFFFFFFFF) to an unsigned integer. In the future, sizeof(UV)
+   may be greater than sizeof(IV), so don't assume that half max UV is max IV.
+*/
+#define U32_MAX_P1_HALF (2.0 * (1 + ((U32_MAX) >> 2)))
+
+#define UV_MAX_P1 (4.0 * (1 + ((UV_MAX) >> 2)))
+#define IV_MAX_P1 (2.0 * (1 + (((UV)IV_MAX) >> 1)))
+#define UV_MAX_P1_HALF (2.0 * (1 + ((UV_MAX) >> 2)))
+
+/* This may look like unnecessary jumping through hoops, but converting
+   out of range floating point values to integers *is* undefined behaviour,
+   and it is starting to bite.
+*/
+#ifndef CAST_INLINE
+#define I_32(what) (cast_i32((NV)(what)))
+#define U_32(what) (cast_ulong((NV)(what)))
+#define I_V(what) (cast_iv((NV)(what)))
+#define U_V(what) (cast_uv((NV)(what)))
+#else
+#define I_32(n) ((n) < I32_MAX_P1 ? ((n) < I32_MIN ? I32_MIN : (I32) (n)) \
+                  : ((n) < U32_MAX_P1 ? (I32)(U32) (n) \
+                     : ((n) > 0 ? (I32) U32_MAX : 0 /* NaN */)))
+#define U_32(n) ((n) < 0.0 ? ((n) < I32_MIN ? (UV) I32_MIN : (U32)(I32) (n)) \
+                  : ((n) < U32_MAX_P1 ? (U32) (n) \
+                     : ((n) > 0 ? U32_MAX : 0 /* NaN */)))
+#define I_V(n) ((n) < IV_MAX_P1 ? ((n) < IV_MIN ? IV_MIN : (IV) (n)) \
+                  : ((n) < UV_MAX_P1 ? (IV)(UV) (n) \
+                     : ((n) > 0 ? (IV)UV_MAX : 0 /* NaN */)))
+#define U_V(n) ((n) < 0.0 ? ((n) < IV_MIN ? (UV) IV_MIN : (UV)(IV) (n)) \
+                  : ((n) < UV_MAX_P1 ? (UV) (n) \
+                     : ((n) > 0 ? UV_MAX : 0 /* NaN */)))
+#endif
+
+#define U_S(what) ((U16)U_32(what))
+#define U_I(what) ((unsigned int)U_32(what))
+#define U_L(what) U_32(what)
+
+/* These do not care about the fractional part, only about the range. */
+#define NV_WITHIN_IV(nv) (I_V(nv) >= IV_MIN && I_V(nv) <= IV_MAX)
+#define NV_WITHIN_UV(nv) ((nv)>=0.0 && U_V(nv) >= UV_MIN && U_V(nv) <= UV_MAX)
+
+/* Used with UV/IV arguments: */
+					/* XXXX: need to speed it up */
+#define CLUMP_2UV(iv)	((iv) < 0 ? 0 : (UV)(iv))
+#define CLUMP_2IV(uv)	((uv) > (UV)IV_MAX ? IV_MAX : (IV)(uv))
+
+#ifndef MAXSYSFD
+#   define MAXSYSFD 2
+#endif
+
+#ifndef __cplusplus
+#ifndef UNDER_CE
+Uid_t getuid (void);
+Uid_t geteuid (void);
+Gid_t getgid (void);
+Gid_t getegid (void);
+#endif
+#endif
+
+#ifndef Perl_debug_log
+#  define Perl_debug_log	PerlIO_stderr()
+#endif
+
+#ifndef Perl_error_log
+#  define Perl_error_log	(PL_stderrgv			\
+				 && isGV(PL_stderrgv)		\
+				 && GvIOp(PL_stderrgv)          \
+				 && IoOFP(GvIOp(PL_stderrgv))	\
+				 ? IoOFP(GvIOp(PL_stderrgv))	\
+				 : PerlIO_stderr())
+#endif
+
+
+#define DEBUG_p_FLAG		0x00000001 /*      1 */
+#define DEBUG_s_FLAG		0x00000002 /*      2 */
+#define DEBUG_l_FLAG		0x00000004 /*      4 */
+#define DEBUG_t_FLAG		0x00000008 /*      8 */
+#define DEBUG_o_FLAG		0x00000010 /*     16 */
+#define DEBUG_c_FLAG		0x00000020 /*     32 */
+#define DEBUG_P_FLAG		0x00000040 /*     64 */
+#define DEBUG_m_FLAG		0x00000080 /*    128 */
+#define DEBUG_f_FLAG		0x00000100 /*    256 */
+#define DEBUG_r_FLAG		0x00000200 /*    512 */
+#define DEBUG_x_FLAG		0x00000400 /*   1024 */
+#define DEBUG_u_FLAG		0x00000800 /*   2048 */
+#define DEBUG_H_FLAG		0x00002000 /*   8192 */
+#define DEBUG_X_FLAG		0x00004000 /*  16384 */
+#define DEBUG_D_FLAG		0x00008000 /*  32768 */
+#define DEBUG_S_FLAG		0x00010000 /*  65536 */
+#define DEBUG_T_FLAG		0x00020000 /* 131072 */
+#define DEBUG_R_FLAG		0x00040000 /* 262144 */
+#define DEBUG_J_FLAG		0x00080000 /* 524288 */
+#define DEBUG_v_FLAG		0x00100000 /*1048576 */
+#define DEBUG_MASK		0x001FEFFF /* mask of all the standard flags */
+
+#define DEBUG_DB_RECURSE_FLAG	0x40000000
+#define DEBUG_TOP_FLAG		0x80000000 /* XXX what's this for ??? Signal
+					      that something was done? */
+
+#  define DEBUG_p_TEST_ (PL_debug & DEBUG_p_FLAG)
+#  define DEBUG_s_TEST_ (PL_debug & DEBUG_s_FLAG)
+#  define DEBUG_l_TEST_ (PL_debug & DEBUG_l_FLAG)
+#  define DEBUG_t_TEST_ (PL_debug & DEBUG_t_FLAG)
+#  define DEBUG_o_TEST_ (PL_debug & DEBUG_o_FLAG)
+#  define DEBUG_c_TEST_ (PL_debug & DEBUG_c_FLAG)
+#  define DEBUG_P_TEST_ (PL_debug & DEBUG_P_FLAG)
+#  define DEBUG_m_TEST_ (PL_debug & DEBUG_m_FLAG)
+#  define DEBUG_f_TEST_ (PL_debug & DEBUG_f_FLAG)
+#  define DEBUG_r_TEST_ (PL_debug & DEBUG_r_FLAG)
+#  define DEBUG_x_TEST_ (PL_debug & DEBUG_x_FLAG)
+#  define DEBUG_u_TEST_ (PL_debug & DEBUG_u_FLAG)
+#  define DEBUG_H_TEST_ (PL_debug & DEBUG_H_FLAG)
+#  define DEBUG_X_TEST_ (PL_debug & DEBUG_X_FLAG)
+#  define DEBUG_D_TEST_ (PL_debug & DEBUG_D_FLAG)
+#  define DEBUG_S_TEST_ (PL_debug & DEBUG_S_FLAG)
+#  define DEBUG_T_TEST_ (PL_debug & DEBUG_T_FLAG)
+#  define DEBUG_R_TEST_ (PL_debug & DEBUG_R_FLAG)
+#  define DEBUG_J_TEST_ (PL_debug & DEBUG_J_FLAG)
+#  define DEBUG_v_TEST_ (PL_debug & DEBUG_v_FLAG)
+#  define DEBUG_Xv_TEST_ (DEBUG_X_TEST_ && DEBUG_v_TEST_)
+
+
+#ifdef DEBUGGING
+
+#  undef  YYDEBUG
+#  define YYDEBUG 1
+
+#  define DEBUG_p_TEST DEBUG_p_TEST_
+#  define DEBUG_s_TEST DEBUG_s_TEST_
+#  define DEBUG_l_TEST DEBUG_l_TEST_
+#  define DEBUG_t_TEST DEBUG_t_TEST_
+#  define DEBUG_o_TEST DEBUG_o_TEST_
+#  define DEBUG_c_TEST DEBUG_c_TEST_
+#  define DEBUG_P_TEST DEBUG_P_TEST_
+#  define DEBUG_m_TEST DEBUG_m_TEST_
+#  define DEBUG_f_TEST DEBUG_f_TEST_
+#  define DEBUG_r_TEST DEBUG_r_TEST_
+#  define DEBUG_x_TEST DEBUG_x_TEST_
+#  define DEBUG_u_TEST DEBUG_u_TEST_
+#  define DEBUG_H_TEST DEBUG_H_TEST_
+#  define DEBUG_X_TEST DEBUG_X_TEST_
+#  define DEBUG_Xv_TEST DEBUG_Xv_TEST_
+#  define DEBUG_D_TEST DEBUG_D_TEST_
+#  define DEBUG_S_TEST DEBUG_S_TEST_
+#  define DEBUG_T_TEST DEBUG_T_TEST_
+#  define DEBUG_R_TEST DEBUG_R_TEST_
+#  define DEBUG_J_TEST DEBUG_J_TEST_
+#  define DEBUG_v_TEST DEBUG_v_TEST_
+
+#  define PERL_DEB(a)                  a
+#  define PERL_DEBUG(a) if (PL_debug)  a
+#  define DEBUG_p(a) if (DEBUG_p_TEST) a
+#  define DEBUG_s(a) if (DEBUG_s_TEST) a
+#  define DEBUG_l(a) if (DEBUG_l_TEST) a
+#  define DEBUG_t(a) if (DEBUG_t_TEST) a
+#  define DEBUG_o(a) if (DEBUG_o_TEST) a
+#  define DEBUG_c(a) if (DEBUG_c_TEST) a
+#  define DEBUG_P(a) if (DEBUG_P_TEST) a
+
+     /* Temporarily turn off memory debugging in case the a
+      * does memory allocation, either directly or indirectly. */
+#  define DEBUG_m(a)  \
+    STMT_START {							\
+        if (PERL_GET_INTERP) { dTHX; if (DEBUG_m_TEST) {PL_debug&=~DEBUG_m_FLAG; a; PL_debug|=DEBUG_m_FLAG;} } \
+    } STMT_END
+
+#  define DEBUG__(t, a) \
+	STMT_START { \
+		if (t) STMT_START {a;} STMT_END; \
+	} STMT_END
+
+#  define DEBUG_f(a) DEBUG__(DEBUG_f_TEST, a)
+#  define DEBUG_r(a) DEBUG__(DEBUG_r_TEST, a)
+#  define DEBUG_x(a) DEBUG__(DEBUG_x_TEST, a)
+#  define DEBUG_u(a) DEBUG__(DEBUG_u_TEST, a)
+#  define DEBUG_H(a) DEBUG__(DEBUG_H_TEST, a)
+#  define DEBUG_X(a) DEBUG__(DEBUG_X_TEST, a)
+#  define DEBUG_Xv(a) DEBUG__(DEBUG_Xv_TEST, a)
+#  define DEBUG_D(a) DEBUG__(DEBUG_D_TEST, a)
+
+#  ifdef USE_5005THREADS
+#    define DEBUG_S(a) DEBUG__(DEBUG_S_TEST, a)
+#  else
+#    define DEBUG_S(a)
+#  endif
+
+#  define DEBUG_T(a) DEBUG__(DEBUG_T_TEST, a)
+#  define DEBUG_R(a) DEBUG__(DEBUG_R_TEST, a)
+#  define DEBUG_v(a) DEBUG__(DEBUG_v_TEST, a)
+
+#else /* DEBUGGING */
+
+#  define DEBUG_p_TEST (0)
+#  define DEBUG_s_TEST (0)
+#  define DEBUG_l_TEST (0)
+#  define DEBUG_t_TEST (0)
+#  define DEBUG_o_TEST (0)
+#  define DEBUG_c_TEST (0)
+#  define DEBUG_P_TEST (0)
+#  define DEBUG_m_TEST (0)
+#  define DEBUG_f_TEST (0)
+#  define DEBUG_r_TEST (0)
+#  define DEBUG_x_TEST (0)
+#  define DEBUG_u_TEST (0)
+#  define DEBUG_H_TEST (0)
+#  define DEBUG_X_TEST (0)
+#  define DEBUG_Xv_TEST (0)
+#  define DEBUG_D_TEST (0)
+#  define DEBUG_S_TEST (0)
+#  define DEBUG_T_TEST (0)
+#  define DEBUG_R_TEST (0)
+#  define DEBUG_J_TEST (0)
+#  define DEBUG_v_TEST (0)
+
+#  define PERL_DEB(a)
+#  define PERL_DEBUG(a)
+#  define DEBUG_p(a)
+#  define DEBUG_s(a)
+#  define DEBUG_l(a)
+#  define DEBUG_t(a)
+#  define DEBUG_o(a)
+#  define DEBUG_c(a)
+#  define DEBUG_P(a)
+#  define DEBUG_m(a)
+#  define DEBUG_f(a)
+#  define DEBUG_r(a)
+#  define DEBUG_x(a)
+#  define DEBUG_u(a)
+#  define DEBUG_H(a)
+#  define DEBUG_X(a)
+#  define DEBUG_Xv(a)
+#  define DEBUG_D(a)
+#  define DEBUG_S(a)
+#  define DEBUG_T(a)
+#  define DEBUG_R(a)
+#  define DEBUG_v(a)
+#endif /* DEBUGGING */
+
+
+#define DEBUG_SCOPE(where) \
+    DEBUG_l(WITH_THR(Perl_deb(aTHX_ "%s scope %ld at %s:%d\n",	\
+		    where, (long)PL_scopestack_ix, __FILE__, __LINE__)));
+
+
+
+
+/* These constants should be used in preference to raw characters
+ * when using magic. Note that some perl guts still assume
+ * certain character properties of these constants, namely that
+ * isUPPER() and toLOWER() may do useful mappings.
+ *
+ * Update the magic_names table in dump.c when adding/amending these
+ */
+
+#define PERL_MAGIC_sv		  '\0' /* Special scalar variable */
+#define PERL_MAGIC_overload	  'A' /* %OVERLOAD hash */
+#define PERL_MAGIC_overload_elem  'a' /* %OVERLOAD hash element */
+#define PERL_MAGIC_overload_table 'c' /* Holds overload table (AMT) on stash */
+#define PERL_MAGIC_bm		  'B' /* Boyer-Moore (fast string search) */
+#define PERL_MAGIC_regdata	  'D' /* Regex match position data
+					(@+ and @- vars) */
+#define PERL_MAGIC_regdatum	  'd' /* Regex match position data element */
+#define PERL_MAGIC_env		  'E' /* %ENV hash */
+#define PERL_MAGIC_envelem	  'e' /* %ENV hash element */
+#define PERL_MAGIC_fm		  'f' /* Formline ('compiled' format) */
+#define PERL_MAGIC_regex_global	  'g' /* m//g target / study()ed string */
+#define PERL_MAGIC_isa		  'I' /* @ISA array */
+#define PERL_MAGIC_isaelem	  'i' /* @ISA array element */
+#define PERL_MAGIC_nkeys	  'k' /* scalar(keys()) lvalue */
+#define PERL_MAGIC_dbfile	  'L' /* Debugger %_<filename */
+#define PERL_MAGIC_dbline	  'l' /* Debugger %_<filename element */
+#define PERL_MAGIC_mutex	  'm' /* for lock op */
+#define PERL_MAGIC_shared	  'N' /* Shared between threads */
+#define PERL_MAGIC_shared_scalar  'n' /* Shared between threads */
+#define PERL_MAGIC_collxfrm	  'o' /* Locale transformation */
+#define PERL_MAGIC_tied		  'P' /* Tied array or hash */
+#define PERL_MAGIC_tiedelem	  'p' /* Tied array or hash element */
+#define PERL_MAGIC_tiedscalar	  'q' /* Tied scalar or handle */
+#define PERL_MAGIC_qr		  'r' /* precompiled qr// regex */
+#define PERL_MAGIC_sig		  'S' /* %SIG hash */
+#define PERL_MAGIC_sigelem	  's' /* %SIG hash element */
+#define PERL_MAGIC_taint	  't' /* Taintedness */
+#define PERL_MAGIC_uvar		  'U' /* Available for use by extensions */
+#define PERL_MAGIC_uvar_elem	  'u' /* Reserved for use by extensions */
+#define PERL_MAGIC_vstring	  'V' /* SV was vstring literal */
+#define PERL_MAGIC_vec		  'v' /* vec() lvalue */
+#define PERL_MAGIC_utf8		  'w' /* Cached UTF-8 information */
+#define PERL_MAGIC_substr	  'x' /* substr() lvalue */
+#define PERL_MAGIC_defelem	  'y' /* Shadow "foreach" iterator variable /
+					smart parameter vivification */
+#define PERL_MAGIC_glob		  '*' /* GV (typeglob) */
+#define PERL_MAGIC_arylen	  '#' /* Array length ($#ary) */
+#define PERL_MAGIC_pos		  '.' /* pos() lvalue */
+#define PERL_MAGIC_backref	  '<' /* for weak ref data */
+#define PERL_MAGIC_ext		  '~' /* Available for use by extensions */
+
+
+#define YYMAXDEPTH 300
+
+#ifndef assert  /* <assert.h> might have been included somehow */
+#define assert(what)	PERL_DEB( 					\
+	((what) ? ((void) 0) :						\
+	    (Perl_croak(aTHX_ "Assertion %s failed: file \"" __FILE__ 	\
+			"\", line %d", STRINGIFY(what), __LINE__),	\
+	    PerlProc_exit(1),						\
+	    (void) 0)))
+#endif
+
+struct ufuncs {
+    I32 (*uf_val)(pTHX_ IV, SV*);
+    I32 (*uf_set)(pTHX_ IV, SV*);
+    IV uf_index;
+};
+
+/* In pre-5.7-Perls the PERL_MAGIC_uvar magic didn't get the thread context.
+ * XS code wanting to be backward compatible can do something
+ * like the following:
+
+#ifndef PERL_MG_UFUNC
+#define PERL_MG_UFUNC(name,ix,sv) I32 name(IV ix, SV *sv)
+#endif
+
+static PERL_MG_UFUNC(foo_get, index, val)
+{
+    sv_setsv(val, ...);
+    return TRUE;
+}
+
+-- Doug MacEachern
+
+*/
+
+#ifndef PERL_MG_UFUNC
+#define PERL_MG_UFUNC(name,ix,sv) I32 name(pTHX_ IV ix, SV *sv)
+#endif
+
+/* Fix these up for __STDC__ */
+#ifndef DONT_DECLARE_STD
+char *mktemp (char*);
+#ifndef atof
+double atof (const char*);
+#endif
+#endif
+
+#ifndef STANDARD_C
+/* All of these are in stdlib.h or time.h for ANSI C */
+Time_t time();
+struct tm *gmtime(), *localtime();
+#if defined(OEMVS) || defined(__OPEN_VM)
+char *(strchr)(), *(strrchr)();
+char *(strcpy)(), *(strcat)();
+#else
+char *strchr(), *strrchr();
+char *strcpy(), *strcat();
+#endif
+#endif /* ! STANDARD_C */
+
+
+#ifdef I_MATH
+#    include <math.h>
+#else
+START_EXTERN_C
+	    double exp (double);
+	    double log (double);
+	    double log10 (double);
+	    double sqrt (double);
+	    double frexp (double,int*);
+	    double ldexp (double,int);
+	    double modf (double,double*);
+	    double sin (double);
+	    double cos (double);
+	    double atan2 (double,double);
+	    double pow (double,double);
+END_EXTERN_C
+#endif
+
+#if !defined(NV_INF) && defined(USE_LONG_DOUBLE) && defined(LDBL_INFINITY)
+#  define NV_INF LDBL_INFINITY
+#endif
+#if !defined(NV_INF) && defined(DBL_INFINITY)
+#  define NV_INF (NV)DBL_INFINITY
+#endif
+#if !defined(NV_INF) && defined(INFINITY)
+#  define NV_INF (NV)INFINITY
+#endif
+#if !defined(NV_INF) && defined(INF)
+#  define NV_INF (NV)INF
+#endif
+#if !defined(NV_INF) && defined(USE_LONG_DOUBLE) && defined(HUGE_VALL)
+#  define NV_INF (NV)HUGE_VALL
+#endif
+#if !defined(NV_INF) && defined(HUGE_VAL)
+#  define NV_INF (NV)HUGE_VAL
+#endif
+
+#if !defined(NV_NAN) && defined(USE_LONG_DOUBLE)
+#   if !defined(NV_NAN) && defined(LDBL_NAN)
+#       define NV_NAN LDBL_NAN
+#   endif
+#   if !defined(NV_NAN) && defined(LDBL_QNAN)
+#       define NV_NAN LDBL_QNAN
+#   endif
+#   if !defined(NV_NAN) && defined(LDBL_SNAN)
+#       define NV_NAN LDBL_SNAN
+#   endif
+#endif
+#if !defined(NV_NAN) && defined(DBL_NAN)
+#  define NV_NAN (NV)DBL_NAN
+#endif
+#if !defined(NV_NAN) && defined(DBL_QNAN)
+#  define NV_NAN (NV)DBL_QNAN
+#endif
+#if !defined(NV_NAN) && defined(DBL_SNAN)
+#  define NV_NAN (NV)DBL_SNAN
+#endif
+#if !defined(NV_NAN) && defined(QNAN)
+#  define NV_NAN (NV)QNAN
+#endif
+#if !defined(NV_NAN) && defined(SNAN)
+#  define NV_NAN (NV)SNAN
+#endif
+#if !defined(NV_NAN) && defined(NAN)
+#  define NV_NAN (NV)NAN
+#endif
+
+#ifndef __cplusplus
+#  if defined(NeXT) || defined(__NeXT__) /* or whatever catches all NeXTs */
+char *crypt ();       /* Maybe more hosts will need the unprototyped version */
+#  else
+#    if !defined(WIN32) && !defined(VMS)
+#ifndef crypt
+char *crypt (const char*, const char*);
+#endif
+#    endif /* !WIN32 */
+#  endif /* !NeXT && !__NeXT__ */
+#  ifndef DONT_DECLARE_STD
+#    ifndef getenv
+char *getenv (const char*);
+#    endif /* !getenv */
+#    if !defined(HAS_LSEEK_PROTO) && !defined(EPOC) && !defined(__hpux)
+#      ifdef _FILE_OFFSET_BITS
+#        if _FILE_OFFSET_BITS == 64
+Off_t lseek (int,Off_t,int);
+#        endif
+#      endif
+#    endif
+#  endif /* !DONT_DECLARE_STD */
+#ifndef getlogin
+char *getlogin (void);
+#endif
+#endif /* !__cplusplus */
+
+#ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
+#define UNLINK unlnk
+I32 unlnk (char*);
+#else
+#define UNLINK PerlLIO_unlink
+#endif
+
+/* some versions of glibc are missing the setresuid() proto */
+#if defined(HAS_SETRESUID) && !defined(HAS_SETRESUID_PROTO)
+int setresuid(uid_t ruid, uid_t euid, uid_t suid);
+#endif
+/* some versions of glibc are missing the setresgid() proto */
+#if defined(HAS_SETRESGID) && !defined(HAS_SETRESGID_PROTO)
+int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
+#endif
+
+#ifndef HAS_SETREUID
+#  ifdef HAS_SETRESUID
+#    define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
+#    define HAS_SETREUID
+#  endif
+#endif
+#ifndef HAS_SETREGID
+#  ifdef HAS_SETRESGID
+#    define setregid(r,e) setresgid(r,e,(Gid_t)-1)
+#    define HAS_SETREGID
+#  endif
+#endif
+
+/* Sighandler_t defined in iperlsys.h */
+
+#ifdef HAS_SIGACTION
+typedef struct sigaction Sigsave_t;
+#else
+typedef Sighandler_t Sigsave_t;
+#endif
+
+#define SCAN_DEF 0
+#define SCAN_TR 1
+#define SCAN_REPL 2
+
+#ifdef DEBUGGING
+# ifndef register
+#  define register
+# endif
+# define RUNOPS_DEFAULT Perl_runops_debug
+#else
+# define RUNOPS_DEFAULT Perl_runops_standard
+#endif
+
+#ifdef MYMALLOC
+#  ifdef MUTEX_INIT_CALLS_MALLOC
+#    define MALLOC_INIT					\
+	STMT_START {					\
+		PL_malloc_mutex = NULL;			\
+		MUTEX_INIT(&PL_malloc_mutex);		\
+	} STMT_END
+#    define MALLOC_TERM					\
+	STMT_START {					\
+		perl_mutex tmp = PL_malloc_mutex;	\
+		PL_malloc_mutex = NULL;			\
+		MUTEX_DESTROY(&tmp);			\
+	} STMT_END
+#  else
+#    define MALLOC_INIT MUTEX_INIT(&PL_malloc_mutex)
+#    define MALLOC_TERM MUTEX_DESTROY(&PL_malloc_mutex)
+#  endif
+#else
+#  define MALLOC_INIT
+#  define MALLOC_TERM
+#endif
+
+
+typedef int (CPERLscope(*runops_proc_t)) (pTHX);
+typedef void (CPERLscope(*share_proc_t)) (pTHX_ SV *sv);
+typedef int  (CPERLscope(*thrhook_proc_t)) (pTHX);
+typedef OP* (CPERLscope(*PPADDR_t)[]) (pTHX);
+
+/* _ (for $_) must be first in the following list (DEFSV requires it) */
+#define THREADSV_NAMES "_123456789&`'+/.,\\\";^-%=|~:\001\005!@"
+
+/* NeXT has problems with crt0.o globals */
+#if defined(__DYNAMIC__) && \
+    (defined(NeXT) || defined(__NeXT__) || defined(PERL_DARWIN))
+#  if defined(NeXT) || defined(__NeXT)
+#    include <mach-o/dyld.h>
+#    define environ (*environ_pointer)
+EXT char *** environ_pointer;
+#  else
+#    if defined(PERL_DARWIN) && defined(PERL_CORE)
+#      include <crt_externs.h>	/* for the env array */
+#      define environ (*_NSGetEnviron())
+#    endif
+#  endif
+#else
+   /* VMS and some other platforms don't use the environ array */
+#  ifdef USE_ENVIRON_ARRAY
+#    if !defined(DONT_DECLARE_STD) || \
+        (defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \
+        defined(__sgi) || \
+        defined(__DGUX)
+extern char **	environ;	/* environment variables supplied via exec */
+#    endif
+#  endif
+#endif
+
+START_EXTERN_C
+
+/* handy constants */
+EXTCONST char PL_warn_uninit[]
+  INIT("Use of uninitialized value%s%s");
+EXTCONST char PL_warn_nosemi[]
+  INIT("Semicolon seems to be missing");
+EXTCONST char PL_warn_reserved[]
+  INIT("Unquoted string \"%s\" may clash with future reserved word");
+EXTCONST char PL_warn_nl[]
+  INIT("Unsuccessful %s on filename containing newline");
+EXTCONST char PL_no_wrongref[]
+  INIT("Can't use %s ref as %s ref");
+EXTCONST char PL_no_symref[]
+  INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
+EXTCONST char PL_no_usym[]
+  INIT("Can't use an undefined value as %s reference");
+EXTCONST char PL_no_aelem[]
+  INIT("Modification of non-creatable array value attempted, subscript %d");
+EXTCONST char PL_no_helem[]
+  INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
+EXTCONST char PL_no_helem_sv[]
+  INIT("Modification of non-creatable hash value attempted, subscript \""SVf"\"");
+EXTCONST char PL_no_modify[]
+  INIT("Modification of a read-only value attempted");
+EXTCONST char PL_no_mem[]
+  INIT("Out of memory!\n");
+EXTCONST char PL_no_security[]
+  INIT("Insecure dependency in %s%s");
+EXTCONST char PL_no_sock_func[]
+  INIT("Unsupported socket function \"%s\" called");
+EXTCONST char PL_no_dir_func[]
+  INIT("Unsupported directory function \"%s\" called");
+EXTCONST char PL_no_func[]
+  INIT("The %s function is unimplemented");
+EXTCONST char PL_no_myglob[]
+  INIT("\"my\" variable %s can't be in a package");
+EXTCONST char PL_no_localize_ref[]
+  INIT("Can't localize through a reference");
+EXTCONST char PL_memory_wrap[]
+  INIT("panic: memory wrap");
+
+EXTCONST char PL_uuemap[65]
+  INIT("`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_");
+
+
+#ifdef DOINIT
+EXT const char *PL_sig_name[] = { SIG_NAME };
+EXT int   PL_sig_num[]  = { SIG_NUM };
+#else
+EXT const char *PL_sig_name[];
+EXT int   PL_sig_num[];
+#endif
+
+/* fast conversion and case folding tables */
+
+#ifdef DOINIT
+#ifdef EBCDIC
+EXT unsigned char PL_fold[] = { /* fast EBCDIC case folding table */
+    0,      1,      2,      3,      4,      5,      6,      7,
+    8,      9,      10,     11,     12,     13,     14,     15,
+    16,     17,     18,     19,     20,     21,     22,     23,
+    24,     25,     26,     27,     28,     29,     30,     31,
+    32,     33,     34,     35,     36,     37,     38,     39,
+    40,     41,     42,     43,     44,     45,     46,     47,
+    48,     49,     50,     51,     52,     53,     54,     55,
+    56,     57,     58,     59,     60,     61,     62,     63,
+    64,     65,     66,     67,     68,     69,     70,     71,
+    72,     73,     74,     75,     76,     77,     78,     79,
+    80,     81,     82,     83,     84,     85,     86,     87,
+    88,     89,     90,     91,     92,     93,     94,     95,
+    96,     97,     98,     99,     100,    101,    102,    103,
+    104,    105,    106,    107,    108,    109,    110,    111,
+    112,    113,    114,    115,    116,    117,    118,    119,
+    120,    121,    122,    123,    124,    125,    126,    127,
+    128,    'A',    'B',    'C',    'D',    'E',    'F',    'G',
+    'H',    'I',    138,    139,    140,    141,    142,    143,
+    144,    'J',    'K',    'L',    'M',    'N',    'O',    'P',
+    'Q',    'R',    154,    155,    156,    157,    158,    159,
+    160,    161,    'S',    'T',    'U',    'V',    'W',    'X',
+    'Y',    'Z',    170,    171,    172,    173,    174,    175,
+    176,    177,    178,    179,    180,    181,    182,    183,
+    184,    185,    186,    187,    188,    189,    190,    191,
+    192,    'a',    'b',    'c',    'd',    'e',    'f',    'g',
+    'h',    'i',    202,    203,    204,    205,    206,    207,
+    208,    'j',    'k',    'l',    'm',    'n',    'o',    'p',
+    'q',    'r',    218,    219,    220,    221,    222,    223,
+    224,    225,    's',    't',    'u',    'v',    'w',    'x',
+    'y',    'z',    234,    235,    236,    237,    238,    239,
+    240,    241,    242,    243,    244,    245,    246,    247,
+    248,    249,    250,    251,    252,    253,    254,    255
+};
+#else   /* ascii rather than ebcdic */
+EXTCONST  unsigned char PL_fold[] = {
+	0,	1,	2,	3,	4,	5,	6,	7,
+	8,	9,	10,	11,	12,	13,	14,	15,
+	16,	17,	18,	19,	20,	21,	22,	23,
+	24,	25,	26,	27,	28,	29,	30,	31,
+	32,	33,	34,	35,	36,	37,	38,	39,
+	40,	41,	42,	43,	44,	45,	46,	47,
+	48,	49,	50,	51,	52,	53,	54,	55,
+	56,	57,	58,	59,	60,	61,	62,	63,
+	64,	'a',	'b',	'c',	'd',	'e',	'f',	'g',
+	'h',	'i',	'j',	'k',	'l',	'm',	'n',	'o',
+	'p',	'q',	'r',	's',	't',	'u',	'v',	'w',
+	'x',	'y',	'z',	91,	92,	93,	94,	95,
+	96,	'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',	123,	124,	125,	126,	127,
+	128,	129,	130,	131,	132,	133,	134,	135,
+	136,	137,	138,	139,	140,	141,	142,	143,
+	144,	145,	146,	147,	148,	149,	150,	151,
+	152,	153,	154,	155,	156,	157,	158,	159,
+	160,	161,	162,	163,	164,	165,	166,	167,
+	168,	169,	170,	171,	172,	173,	174,	175,
+	176,	177,	178,	179,	180,	181,	182,	183,
+	184,	185,	186,	187,	188,	189,	190,	191,
+	192,	193,	194,	195,	196,	197,	198,	199,
+	200,	201,	202,	203,	204,	205,	206,	207,
+	208,	209,	210,	211,	212,	213,	214,	215,
+	216,	217,	218,	219,	220,	221,	222,	223,	
+	224,	225,	226,	227,	228,	229,	230,	231,
+	232,	233,	234,	235,	236,	237,	238,	239,
+	240,	241,	242,	243,	244,	245,	246,	247,
+	248,	249,	250,	251,	252,	253,	254,	255
+};
+#endif  /* !EBCDIC */
+#else
+EXTCONST unsigned char PL_fold[];
+#endif
+
+#ifdef DOINIT
+EXT unsigned char PL_fold_locale[] = {
+	0,	1,	2,	3,	4,	5,	6,	7,
+	8,	9,	10,	11,	12,	13,	14,	15,
+	16,	17,	18,	19,	20,	21,	22,	23,
+	24,	25,	26,	27,	28,	29,	30,	31,
+	32,	33,	34,	35,	36,	37,	38,	39,
+	40,	41,	42,	43,	44,	45,	46,	47,
+	48,	49,	50,	51,	52,	53,	54,	55,
+	56,	57,	58,	59,	60,	61,	62,	63,
+	64,	'a',	'b',	'c',	'd',	'e',	'f',	'g',
+	'h',	'i',	'j',	'k',	'l',	'm',	'n',	'o',
+	'p',	'q',	'r',	's',	't',	'u',	'v',	'w',
+	'x',	'y',	'z',	91,	92,	93,	94,	95,
+	96,	'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',	123,	124,	125,	126,	127,
+	128,	129,	130,	131,	132,	133,	134,	135,
+	136,	137,	138,	139,	140,	141,	142,	143,
+	144,	145,	146,	147,	148,	149,	150,	151,
+	152,	153,	154,	155,	156,	157,	158,	159,
+	160,	161,	162,	163,	164,	165,	166,	167,
+	168,	169,	170,	171,	172,	173,	174,	175,
+	176,	177,	178,	179,	180,	181,	182,	183,
+	184,	185,	186,	187,	188,	189,	190,	191,
+	192,	193,	194,	195,	196,	197,	198,	199,
+	200,	201,	202,	203,	204,	205,	206,	207,
+	208,	209,	210,	211,	212,	213,	214,	215,
+	216,	217,	218,	219,	220,	221,	222,	223,	
+	224,	225,	226,	227,	228,	229,	230,	231,
+	232,	233,	234,	235,	236,	237,	238,	239,
+	240,	241,	242,	243,	244,	245,	246,	247,
+	248,	249,	250,	251,	252,	253,	254,	255
+};
+#else
+EXT unsigned char PL_fold_locale[];
+#endif
+
+#ifdef DOINIT
+#ifdef EBCDIC
+EXT unsigned char PL_freq[] = {/* EBCDIC frequencies for mixed English/C */
+    1,      2,      84,     151,    154,    155,    156,    157,
+    165,    246,    250,    3,      158,    7,      18,     29,
+    40,     51,     62,     73,     85,     96,     107,    118,
+    129,    140,    147,    148,    149,    150,    152,    153,
+    255,      6,      8,      9,     10,     11,     12,     13,
+     14,     15,     24,     25,     26,     27,     28,    226,
+     29,     30,     31,     32,     33,     43,     44,     45,
+     46,     47,     48,     49,     50,     76,     77,     78,
+     79,     80,     81,     82,     83,     84,     85,     86,
+     87,     94,     95,    234,    181,    233,    187,    190,
+    180,     96,     97,     98,     99,    100,    101,    102,
+    104,    112,    182,    174,    236,    232,    229,    103,
+    228,    226,    114,    115,    116,    117,    118,    119,
+    120,    121,    122,    235,    176,    230,    194,    162,
+    130,    131,    132,    133,    134,    135,    136,    137,
+    138,    139,    201,    205,    163,    217,    220,    224,
+    5,      248,    227,    244,    242,    255,    241,    231,
+    240,    253,    16,     197,    19,     20,     21,     187,
+    23,     169,    210,    245,    237,    249,    247,    239,
+    168,    252,    34,     196,    36,     37,     38,     39,
+    41,     42,     251,    254,    238,    223,    221,    213,
+    225,    177,    52,     53,     54,     55,     56,     57,
+    58,     59,     60,     61,     63,     64,     65,     66,
+    67,     68,     69,     70,     71,     72,     74,     75,
+    205,    208,    186,    202,    200,    218,    198,    179,
+    178,    214,    88,     89,     90,     91,     92,     93,
+    217,    166,    170,    207,    199,    209,    206,    204,
+    160,    212,    105,    106,    108,    109,    110,    111,
+    203,    113,    216,    215,    192,    175,    193,    243,
+    172,    161,    123,    124,    125,    126,    127,    128,
+    222,    219,    211,    195,    188,    193,    185,    184,
+    191,    183,    141,    142,    143,    144,    145,    146
+};
+#else  /* ascii rather than ebcdic */
+EXTCONST unsigned char PL_freq[] = {	/* letter frequencies for mixed English/C */
+	1,	2,	84,	151,	154,	155,	156,	157,
+	165,	246,	250,	3,	158,	7,	18,	29,
+	40,	51,	62,	73,	85,	96,	107,	118,
+	129,	140,	147,	148,	149,	150,	152,	153,
+	255,	182,	224,	205,	174,	176,	180,	217,
+	233,	232,	236,	187,	235,	228,	234,	226,
+	222,	219,	211,	195,	188,	193,	185,	184,
+	191,	183,	201,	229,	181,	220,	194,	162,
+	163,	208,	186,	202,	200,	218,	198,	179,
+	178,	214,	166,	170,	207,	199,	209,	206,
+	204,	160,	212,	216,	215,	192,	175,	173,
+	243,	172,	161,	190,	203,	189,	164,	230,
+	167,	248,	227,	244,	242,	255,	241,	231,
+	240,	253,	169,	210,	245,	237,	249,	247,
+	239,	168,	252,	251,	254,	238,	223,	221,
+	213,	225,	177,	197,	171,	196,	159,	4,
+	5,	6,	8,	9,	10,	11,	12,	13,
+	14,	15,	16,	17,	19,	20,	21,	22,
+	23,	24,	25,	26,	27,	28,	30,	31,
+	32,	33,	34,	35,	36,	37,	38,	39,
+	41,	42,	43,	44,	45,	46,	47,	48,
+	49,	50,	52,	53,	54,	55,	56,	57,
+	58,	59,	60,	61,	63,	64,	65,	66,
+	67,	68,	69,	70,	71,	72,	74,	75,
+	76,	77,	78,	79,	80,	81,	82,	83,
+	86,	87,	88,	89,	90,	91,	92,	93,
+	94,	95,	97,	98,	99,	100,	101,	102,
+	103,	104,	105,	106,	108,	109,	110,	111,
+	112,	113,	114,	115,	116,	117,	119,	120,
+	121,	122,	123,	124,	125,	126,	127,	128,
+	130,	131,	132,	133,	134,	135,	136,	137,
+	138,	139,	141,	142,	143,	144,	145,	146
+};
+#endif
+#else
+EXTCONST unsigned char PL_freq[];
+#endif
+
+#ifdef DEBUGGING
+#ifdef DOINIT
+EXTCONST char* PL_block_type[] = {
+	"NULL",
+	"SUB",
+	"EVAL",
+	"LOOP",
+	"SUBST",
+	"BLOCK",
+};
+#else
+EXTCONST char* PL_block_type[];
+#endif
+#endif
+
+END_EXTERN_C
+
+/*****************************************************************************/
+/* This lexer/parser stuff is currently global since yacc is hard to reenter */
+/*****************************************************************************/
+/* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
+
+#ifdef __Lynx__
+/* LynxOS defines these in scsi.h which is included via ioctl.h */
+#ifdef FORMAT
+#undef FORMAT
+#endif
+#ifdef SPACE
+#undef SPACE
+#endif
+#endif
+
+#include "perly.h"
+
+#define LEX_NOTPARSING		11	/* borrowed from toke.c */
+
+typedef enum {
+    XOPERATOR,
+    XTERM,
+    XREF,
+    XSTATE,
+    XBLOCK,
+    XATTRBLOCK,
+    XATTRTERM,
+    XTERMBLOCK
+} expectation;
+
+enum {		/* pass one of these to get_vtbl */
+    want_vtbl_sv,
+    want_vtbl_env,
+    want_vtbl_envelem,
+    want_vtbl_sig,
+    want_vtbl_sigelem,
+    want_vtbl_pack,
+    want_vtbl_packelem,
+    want_vtbl_dbline,
+    want_vtbl_isa,
+    want_vtbl_isaelem,
+    want_vtbl_arylen,
+    want_vtbl_glob,
+    want_vtbl_mglob,
+    want_vtbl_nkeys,
+    want_vtbl_taint,
+    want_vtbl_substr,
+    want_vtbl_vec,
+    want_vtbl_pos,
+    want_vtbl_bm,
+    want_vtbl_fm,
+    want_vtbl_uvar,
+    want_vtbl_defelem,
+    want_vtbl_regexp,
+    want_vtbl_collxfrm,
+    want_vtbl_amagic,
+    want_vtbl_amagicelem,
+#ifdef USE_5005THREADS
+    want_vtbl_mutex,
+#endif
+    want_vtbl_regdata,
+    want_vtbl_regdatum,
+    want_vtbl_backref,
+    want_vtbl_utf8
+};
+
+				/* Note: the lowest 8 bits are reserved for
+				   stuffing into op->op_private */
+#define HINT_PRIVATE_MASK	0x000000ff
+#define HINT_INTEGER		0x00000001 /* integer pragma */
+#define HINT_STRICT_REFS	0x00000002 /* strict pragma */
+#define HINT_LOCALE		0x00000004 /* locale pragma */
+#define HINT_BYTES		0x00000008 /* bytes pragma */
+/* #define HINT_notused10	0x00000010 */
+				/* Note: 20,40,80 used for NATIVE_HINTS */
+				/* currently defined by vms/vmsish.h */
+
+#define HINT_BLOCK_SCOPE	0x00000100
+#define HINT_STRICT_SUBS	0x00000200 /* strict pragma */
+#define HINT_STRICT_VARS	0x00000400 /* strict pragma */
+
+/* The HINT_NEW_* constants are used by the overload pragma */
+#define HINT_NEW_INTEGER	0x00001000
+#define HINT_NEW_FLOAT		0x00002000
+#define HINT_NEW_BINARY		0x00004000
+#define HINT_NEW_STRING		0x00008000
+#define HINT_NEW_RE		0x00010000
+#define HINT_LOCALIZE_HH	0x00020000 /* %^H needs to be copied */
+
+#define HINT_RE_TAINT		0x00100000 /* re pragma */
+#define HINT_RE_EVAL		0x00200000 /* re pragma */
+
+#define HINT_FILETEST_ACCESS	0x00400000 /* filetest pragma */
+#define HINT_UTF8		0x00800000 /* utf8 pragma */
+
+/* The following are stored in $sort::hints, not in PL_hints */
+#define HINT_SORT_SORT_BITS	0x000000FF /* allow 256 different ones */
+#define HINT_SORT_QUICKSORT	0x00000001
+#define HINT_SORT_MERGESORT	0x00000002
+#define HINT_SORT_STABLE	0x00000100 /* sort styles (currently one) */
+
+/* Various states of the input record separator SV (rs) */
+#define RsSNARF(sv)   (! SvOK(sv))
+#define RsSIMPLE(sv)  (SvOK(sv) && (! SvPOK(sv) || SvCUR(sv)))
+#define RsPARA(sv)    (SvPOK(sv) && ! SvCUR(sv))
+#define RsRECORD(sv)  (SvROK(sv) && (SvIV(SvRV(sv)) > 0))
+
+/* A struct for keeping various DEBUGGING related stuff,
+ * neatly packed.  Currently only scratch variables for
+ * constructing debug output are included.  Needed always,
+ * not just when DEBUGGING, though, because of the re extension. c*/
+struct perl_debug_pad {
+  SV pad[3];
+};
+
+#define PERL_DEBUG_PAD(i)	&(PL_debug_pad.pad[i])
+#define PERL_DEBUG_PAD_ZERO(i)	(SvPVX(PERL_DEBUG_PAD(i))[0] = 0, \
+	(((XPV*) SvANY(PERL_DEBUG_PAD(i)))->xpv_cur = 0), \
+	PERL_DEBUG_PAD(i))
+
+/* Enable variables which are pointers to functions */
+typedef void (CPERLscope(*peep_t))(pTHX_ OP* o);
+typedef regexp*(CPERLscope(*regcomp_t)) (pTHX_ char* exp, char* xend, PMOP* pm);
+typedef I32 (CPERLscope(*regexec_t)) (pTHX_ regexp* prog, char* stringarg,
+				      char* strend, char* strbeg, I32 minend,
+				      SV* screamer, void* data, U32 flags);
+typedef char* (CPERLscope(*re_intuit_start_t)) (pTHX_ regexp *prog, SV *sv,
+						char *strpos, char *strend,
+						U32 flags,
+						struct re_scream_pos_data_s *d);
+typedef SV*	(CPERLscope(*re_intuit_string_t)) (pTHX_ regexp *prog);
+typedef void	(CPERLscope(*regfree_t)) (pTHX_ struct regexp* r);
+
+typedef void (*DESTRUCTORFUNC_NOCONTEXT_t) (void*);
+typedef void (*DESTRUCTORFUNC_t) (pTHX_ void*);
+typedef void (*SVFUNC_t) (pTHX_ SV*);
+typedef I32  (*SVCOMPARE_t) (pTHX_ SV*, SV*);
+typedef void (*XSINIT_t) (pTHX);
+typedef void (*ATEXIT_t) (pTHX_ void*);
+typedef void (*XSUBADDR_t) (pTHX_ CV *);
+
+/* Set up PERLVAR macros for populating structs */
+#define PERLVAR(var,type) type var;
+#define PERLVARA(var,n,type) type var[n];
+#define PERLVARI(var,type,init) type var;
+#define PERLVARIC(var,type,init) type var;
+
+/* Interpreter exitlist entry */
+typedef struct exitlistentry {
+    void (*fn) (pTHX_ void*);
+    void *ptr;
+} PerlExitListEntry;
+
+#ifdef PERL_GLOBAL_STRUCT
+struct perl_vars {
+#  include "perlvars.h"
+};
+
+#  ifdef PERL_CORE
+EXT struct perl_vars PL_Vars;
+EXT struct perl_vars *PL_VarsPtr INIT(&PL_Vars);
+#  else /* PERL_CORE */
+#    if !defined(__GNUC__) || !defined(WIN32)
+EXT
+#    endif /* WIN32 */
+struct perl_vars *PL_VarsPtr;
+#    define PL_Vars (*((PL_VarsPtr) \
+		       ? PL_VarsPtr : (PL_VarsPtr = Perl_GetVars(aTHX))))
+#  endif /* PERL_CORE */
+#endif /* PERL_GLOBAL_STRUCT */
+
+#if defined(MULTIPLICITY)
+/* If we have multiple interpreters define a struct
+   holding variables which must be per-interpreter
+   If we don't have threads anything that would have
+   be per-thread is per-interpreter.
+*/
+
+struct interpreter {
+#  ifndef USE_5005THREADS
+#    include "thrdvar.h"
+#  endif
+#  include "intrpvar.h"
+/*
+ * The following is a buffer where new variables must
+ * be defined to maintain binary compatibility with previous versions
+ */
+PERLVARA(object_compatibility,30,	char)
+};
+
+#else
+struct interpreter {
+    char broiled;
+};
+#endif /* MULTIPLICITY */
+
+#ifdef USE_5005THREADS
+/* If we have threads define a struct with all the variables
+ * that have to be per-thread
+ */
+
+
+struct perl_thread {
+#include "thrdvar.h"
+};
+
+typedef struct perl_thread *Thread;
+
+#else
+typedef void *Thread;
+#endif
+
+/* Done with PERLVAR macros for now ... */
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+/* Types used by pack/unpack */ 
+typedef enum {
+  e_no_len,     /* no length  */
+  e_number,     /* number, [] */
+  e_star        /* asterisk   */
+} howlen_t;
+
+typedef struct {
+  char*    patptr;   /* current template char */
+  char*    patend;   /* one after last char   */
+  char*    grpbeg;   /* 1st char of ()-group  */
+  char*    grpend;   /* end of ()-group       */
+  I32      code;     /* template code (!<>)   */
+  I32      length;   /* length/repeat count   */
+  howlen_t howlen;   /* how length is given   */ 
+  int      level;    /* () nesting level      */
+  U32      flags;    /* /=4, comma=2, pack=1  */
+                     /*   and group modifiers */
+} tempsym_t;
+
+#include "thread.h"
+#include "pp.h"
+
+#ifndef PERL_CALLCONV
+#  define PERL_CALLCONV
+#endif
+#undef PERL_CKDEF
+#undef PERL_PPDEF
+#define PERL_CKDEF(s)	PERL_CALLCONV OP *s (pTHX_ OP *o);
+#define PERL_PPDEF(s)	PERL_CALLCONV OP *s (pTHX);
+
+#include "proto.h"
+
+/* this has structure inits, so it cannot be included before here */
+#include "opcode.h"
+
+/* The following must follow proto.h as #defines mess up syntax */
+
+#if !defined(PERL_FOR_X2P)
+#  include "embedvar.h"
+#endif
+
+/* Now include all the 'global' variables
+ * If we don't have threads or multiple interpreters
+ * these include variables that would have been their struct-s
+ */
+
+#define PERLVAR(var,type) EXT type PL_##var;
+#define PERLVARA(var,n,type) EXT type PL_##var[n];
+#define PERLVARI(var,type,init) EXT type  PL_##var INIT(init);
+#define PERLVARIC(var,type,init) EXTCONST type PL_##var INIT(init);
+
+#if !defined(MULTIPLICITY)
+START_EXTERN_C
+#  include "intrpvar.h"
+#  ifndef USE_5005THREADS
+#    include "thrdvar.h"
+#  endif
+END_EXTERN_C
+#endif
+
+#if defined(WIN32)
+/* Now all the config stuff is setup we can include embed.h */
+#  include "embed.h"
+#endif
+
+#ifndef PERL_GLOBAL_STRUCT
+START_EXTERN_C
+
+#  include "perlvars.h"
+
+END_EXTERN_C
+#endif
+
+#include "reentr.inc"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+START_EXTERN_C
+
+#ifdef DOINIT
+
+EXT MGVTBL PL_vtbl_sv =		{MEMBER_TO_FPTR(Perl_magic_get),
+				MEMBER_TO_FPTR(Perl_magic_set),
+					MEMBER_TO_FPTR(Perl_magic_len),
+						0,	0};
+EXT MGVTBL PL_vtbl_env =	{0,	MEMBER_TO_FPTR(Perl_magic_set_all_env),
+				0,	MEMBER_TO_FPTR(Perl_magic_clear_all_env),
+							0};
+EXT MGVTBL PL_vtbl_envelem =	{0,	MEMBER_TO_FPTR(Perl_magic_setenv),
+					0,	MEMBER_TO_FPTR(Perl_magic_clearenv),
+							0};
+EXT MGVTBL PL_vtbl_sig =	{0,	0,		 0, 0, 0};
+#ifdef PERL_MICRO
+EXT MGVTBL PL_vtbl_sigelem =	{0,	0,		 0, 0, 0};
+#else
+EXT MGVTBL PL_vtbl_sigelem =	{MEMBER_TO_FPTR(Perl_magic_getsig),
+					MEMBER_TO_FPTR(Perl_magic_setsig),
+					0,	MEMBER_TO_FPTR(Perl_magic_clearsig),
+							0};
+#endif
+EXT MGVTBL PL_vtbl_pack =	{0,	0,	
+    				MEMBER_TO_FPTR(Perl_magic_sizepack),	
+				MEMBER_TO_FPTR(Perl_magic_wipepack),
+							0};
+EXT MGVTBL PL_vtbl_packelem =	{MEMBER_TO_FPTR(Perl_magic_getpack),
+					MEMBER_TO_FPTR(Perl_magic_setpack),
+					0,	MEMBER_TO_FPTR(Perl_magic_clearpack),
+							0};
+EXT MGVTBL PL_vtbl_dbline =	{0,	MEMBER_TO_FPTR(Perl_magic_setdbline),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_isa =	{0,	MEMBER_TO_FPTR(Perl_magic_setisa),
+					0,	MEMBER_TO_FPTR(Perl_magic_setisa),
+							0};
+EXT MGVTBL PL_vtbl_isaelem =	{0,	MEMBER_TO_FPTR(Perl_magic_setisa),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_arylen =	{MEMBER_TO_FPTR(Perl_magic_getarylen),
+				MEMBER_TO_FPTR(Perl_magic_setarylen),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_glob =	{MEMBER_TO_FPTR(Perl_magic_getglob),
+				MEMBER_TO_FPTR(Perl_magic_setglob),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_mglob =	{0,	MEMBER_TO_FPTR(Perl_magic_setmglob),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_nkeys =	{MEMBER_TO_FPTR(Perl_magic_getnkeys),
+				MEMBER_TO_FPTR(Perl_magic_setnkeys),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_taint =	{MEMBER_TO_FPTR(Perl_magic_gettaint),
+    					MEMBER_TO_FPTR(Perl_magic_settaint),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_substr =	{MEMBER_TO_FPTR(Perl_magic_getsubstr),
+    					MEMBER_TO_FPTR(Perl_magic_setsubstr),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_vec =	{MEMBER_TO_FPTR(Perl_magic_getvec),
+					MEMBER_TO_FPTR(Perl_magic_setvec),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_pos =	{MEMBER_TO_FPTR(Perl_magic_getpos),
+				MEMBER_TO_FPTR(Perl_magic_setpos),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_bm =	{0,	MEMBER_TO_FPTR(Perl_magic_setbm),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_fm =	{0,	MEMBER_TO_FPTR(Perl_magic_setfm),
+					0,	0,	0};
+EXT MGVTBL PL_vtbl_uvar =	{MEMBER_TO_FPTR(Perl_magic_getuvar),
+				MEMBER_TO_FPTR(Perl_magic_setuvar),
+					0,	0,	0};
+#ifdef USE_5005THREADS
+EXT MGVTBL PL_vtbl_mutex =	{0,	0,	0,	0,	
+					MEMBER_TO_FPTR(Perl_magic_mutexfree)};
+#endif /* USE_5005THREADS */
+EXT MGVTBL PL_vtbl_defelem = {MEMBER_TO_FPTR(Perl_magic_getdefelem),
+    					MEMBER_TO_FPTR(Perl_magic_setdefelem),
+					0,	0,	0};
+
+EXT MGVTBL PL_vtbl_regexp = {0, MEMBER_TO_FPTR(Perl_magic_setregexp),0,0, MEMBER_TO_FPTR(Perl_magic_freeregexp)};
+EXT MGVTBL PL_vtbl_regdata = {0, 0, MEMBER_TO_FPTR(Perl_magic_regdata_cnt), 0, 0};
+EXT MGVTBL PL_vtbl_regdatum = {MEMBER_TO_FPTR(Perl_magic_regdatum_get),
+			       MEMBER_TO_FPTR(Perl_magic_regdatum_set), 0, 0, 0};
+
+#ifdef USE_LOCALE_COLLATE
+EXT MGVTBL PL_vtbl_collxfrm = {0,
+				MEMBER_TO_FPTR(Perl_magic_setcollxfrm),
+					0,	0,	0};
+#endif
+
+EXT MGVTBL PL_vtbl_amagic =       {0,     MEMBER_TO_FPTR(Perl_magic_setamagic),
+                                        0,      0,      MEMBER_TO_FPTR(Perl_magic_setamagic)};
+EXT MGVTBL PL_vtbl_amagicelem =   {0,     MEMBER_TO_FPTR(Perl_magic_setamagic),
+                                        0,      0,      MEMBER_TO_FPTR(Perl_magic_setamagic)};
+
+EXT MGVTBL PL_vtbl_backref = 	  {0,	0,
+					0,	0,	MEMBER_TO_FPTR(Perl_magic_killbackrefs)};
+
+EXT MGVTBL PL_vtbl_ovrld   = 	  {0,	0,
+					0,	0,	MEMBER_TO_FPTR(Perl_magic_freeovrld)};
+
+EXT MGVTBL PL_vtbl_utf8 = {0,
+				MEMBER_TO_FPTR(Perl_magic_setutf8),
+					0,	0,	0};
+
+#else /* !DOINIT */
+
+EXT MGVTBL PL_vtbl_sv;
+EXT MGVTBL PL_vtbl_env;
+EXT MGVTBL PL_vtbl_envelem;
+EXT MGVTBL PL_vtbl_sig;
+EXT MGVTBL PL_vtbl_sigelem;
+EXT MGVTBL PL_vtbl_pack;
+EXT MGVTBL PL_vtbl_packelem;
+EXT MGVTBL PL_vtbl_dbline;
+EXT MGVTBL PL_vtbl_isa;
+EXT MGVTBL PL_vtbl_isaelem;
+EXT MGVTBL PL_vtbl_arylen;
+EXT MGVTBL PL_vtbl_glob;
+EXT MGVTBL PL_vtbl_mglob;
+EXT MGVTBL PL_vtbl_nkeys;
+EXT MGVTBL PL_vtbl_taint;
+EXT MGVTBL PL_vtbl_substr;
+EXT MGVTBL PL_vtbl_vec;
+EXT MGVTBL PL_vtbl_pos;
+EXT MGVTBL PL_vtbl_bm;
+EXT MGVTBL PL_vtbl_fm;
+EXT MGVTBL PL_vtbl_uvar;
+EXT MGVTBL PL_vtbl_ovrld;
+
+#ifdef USE_5005THREADS
+EXT MGVTBL PL_vtbl_mutex;
+#endif /* USE_5005THREADS */
+
+EXT MGVTBL PL_vtbl_defelem;
+EXT MGVTBL PL_vtbl_regexp;
+EXT MGVTBL PL_vtbl_regdata;
+EXT MGVTBL PL_vtbl_regdatum;
+
+#ifdef USE_LOCALE_COLLATE
+EXT MGVTBL PL_vtbl_collxfrm;
+#endif
+
+EXT MGVTBL PL_vtbl_amagic;
+EXT MGVTBL PL_vtbl_amagicelem;
+
+EXT MGVTBL PL_vtbl_backref;
+EXT MGVTBL PL_vtbl_utf8;
+
+#endif /* !DOINIT */
+
+enum {
+  fallback_amg,        abs_amg,
+  bool__amg,   nomethod_amg,
+  string_amg,  numer_amg,
+  add_amg,     add_ass_amg,
+  subtr_amg,   subtr_ass_amg,
+  mult_amg,    mult_ass_amg,
+  div_amg,     div_ass_amg,
+  modulo_amg,  modulo_ass_amg,
+  pow_amg,     pow_ass_amg,
+  lshift_amg,  lshift_ass_amg,
+  rshift_amg,  rshift_ass_amg,
+  band_amg,    band_ass_amg,
+  bor_amg,     bor_ass_amg,
+  bxor_amg,    bxor_ass_amg,
+  lt_amg,      le_amg,
+  gt_amg,      ge_amg,
+  eq_amg,      ne_amg,
+  ncmp_amg,    scmp_amg,
+  slt_amg,     sle_amg,
+  sgt_amg,     sge_amg,
+  seq_amg,     sne_amg,
+  not_amg,     compl_amg,
+  inc_amg,     dec_amg,
+  atan2_amg,   cos_amg,
+  sin_amg,     exp_amg,
+  log_amg,     sqrt_amg,
+  repeat_amg,   repeat_ass_amg,
+  concat_amg,  concat_ass_amg,
+  copy_amg,    neg_amg,
+  to_sv_amg,   to_av_amg,
+  to_hv_amg,   to_gv_amg,
+  to_cv_amg,   iter_amg,
+  int_amg,	DESTROY_amg,
+  max_amg_code
+  /* Do not leave a trailing comma here.  C9X allows it, C89 doesn't. */
+};
+
+#define NofAMmeth max_amg_code
+#define AMG_id2name(id) (PL_AMG_names[id]+1)
+
+#ifdef DOINIT
+EXTCONST char * PL_AMG_names[NofAMmeth] = {
+  /* Names kept in the symbol table.  fallback => "()", the rest has
+     "(" prepended.  The only other place in perl which knows about
+     this convention is AMG_id2name (used for debugging output and
+     'nomethod' only), the only other place which has it hardwired is
+     overload.pm.  */
+  "()",		"(abs",			/* "fallback" should be the first. */
+  "(bool",	"(nomethod",
+  "(\"\"",	"(0+",
+  "(+",		"(+=",
+  "(-",		"(-=",
+  "(*",		"(*=",
+  "(/",		"(/=",
+  "(%",		"(%=",
+  "(**",	"(**=",
+  "(<<",	"(<<=",
+  "(>>",	"(>>=",
+  "(&",		"(&=",
+  "(|",		"(|=",
+  "(^",		"(^=",
+  "(<",		"(<=",
+  "(>",		"(>=",
+  "(==",	"(!=",
+  "(<=>",	"(cmp",
+  "(lt",	"(le",
+  "(gt",	"(ge",
+  "(eq",	"(ne",
+  "(!",		"(~",
+  "(++",	"(--",
+  "(atan2",	"(cos",
+  "(sin",	"(exp",
+  "(log",	"(sqrt",
+  "(x",		"(x=",
+  "(.",		"(.=",
+  "(=",		"(neg",
+  "(${}",	"(@{}",
+  "(%{}",	"(*{}",
+  "(&{}",	"(<>",
+  "(int",	"DESTROY",
+};
+#else
+EXTCONST char * PL_AMG_names[NofAMmeth];
+#endif /* def INITAMAGIC */
+
+END_EXTERN_C
+
+struct am_table {
+  U32 was_ok_sub;
+  long was_ok_am;
+  U32 flags;
+  CV* table[NofAMmeth];
+  long fallback;
+};
+struct am_table_short {
+  U32 was_ok_sub;
+  long was_ok_am;
+  U32 flags;
+};
+typedef struct am_table AMT;
+typedef struct am_table_short AMTS;
+
+#define AMGfallNEVER	1
+#define AMGfallNO	2
+#define AMGfallYES	3
+
+#define AMTf_AMAGIC		1
+#define AMTf_OVERLOADED		2
+#define AMT_AMAGIC(amt)		((amt)->flags & AMTf_AMAGIC)
+#define AMT_AMAGIC_on(amt)	((amt)->flags |= AMTf_AMAGIC)
+#define AMT_AMAGIC_off(amt)	((amt)->flags &= ~AMTf_AMAGIC)
+#define AMT_OVERLOADED(amt)	((amt)->flags & AMTf_OVERLOADED)
+#define AMT_OVERLOADED_on(amt)	((amt)->flags |= AMTf_OVERLOADED)
+#define AMT_OVERLOADED_off(amt)	((amt)->flags &= ~AMTf_OVERLOADED)
+
+#define StashHANDLER(stash,meth)	gv_handler((stash),CAT2(meth,_amg))
+
+/*
+ * some compilers like to redefine cos et alia as faster
+ * (and less accurate?) versions called F_cos et cetera (Quidquid
+ * latine dictum sit, altum viditur.)  This trick collides with
+ * the Perl overloading (amg).  The following #defines fool both.
+ */
+
+#ifdef _FASTMATH
+#   ifdef atan2
+#       define F_atan2_amg  atan2_amg
+#   endif
+#   ifdef cos
+#       define F_cos_amg    cos_amg
+#   endif
+#   ifdef exp
+#       define F_exp_amg    exp_amg
+#   endif
+#   ifdef log
+#       define F_log_amg    log_amg
+#   endif
+#   ifdef pow
+#       define F_pow_amg    pow_amg
+#   endif
+#   ifdef sin
+#       define F_sin_amg    sin_amg
+#   endif
+#   ifdef sqrt
+#       define F_sqrt_amg   sqrt_amg
+#   endif
+#endif /* _FASTMATH */
+
+#define PERLDB_ALL		(PERLDBf_SUB	| PERLDBf_LINE	|	\
+				 PERLDBf_NOOPT	| PERLDBf_INTER	|	\
+				 PERLDBf_SUBLINE| PERLDBf_SINGLE|	\
+				 PERLDBf_NAMEEVAL| PERLDBf_NAMEANON)
+					/* No _NONAME, _GOTO */
+#define PERLDBf_SUB		0x01	/* Debug sub enter/exit */
+#define PERLDBf_LINE		0x02	/* Keep line # */
+#define PERLDBf_NOOPT		0x04	/* Switch off optimizations */
+#define PERLDBf_INTER		0x08	/* Preserve more data for
+					   later inspections  */
+#define PERLDBf_SUBLINE		0x10	/* Keep subr source lines */
+#define PERLDBf_SINGLE		0x20	/* Start with single-step on */
+#define PERLDBf_NONAME		0x40	/* For _SUB: no name of the subr */
+#define PERLDBf_GOTO		0x80	/* Report goto: call DB::goto */
+#define PERLDBf_NAMEEVAL	0x100	/* Informative names for evals */
+#define PERLDBf_NAMEANON	0x200	/* Informative names for anon subs */
+
+#define PERLDB_SUB	(PL_perldb && (PL_perldb & PERLDBf_SUB))
+#define PERLDB_LINE	(PL_perldb && (PL_perldb & PERLDBf_LINE))
+#define PERLDB_NOOPT	(PL_perldb && (PL_perldb & PERLDBf_NOOPT))
+#define PERLDB_INTER	(PL_perldb && (PL_perldb & PERLDBf_INTER))
+#define PERLDB_SUBLINE	(PL_perldb && (PL_perldb & PERLDBf_SUBLINE))
+#define PERLDB_SINGLE	(PL_perldb && (PL_perldb & PERLDBf_SINGLE))
+#define PERLDB_SUB_NN	(PL_perldb && (PL_perldb & (PERLDBf_NONAME)))
+#define PERLDB_GOTO	(PL_perldb && (PL_perldb & PERLDBf_GOTO))
+#define PERLDB_NAMEEVAL	(PL_perldb && (PL_perldb & PERLDBf_NAMEEVAL))
+#define PERLDB_NAMEANON	(PL_perldb && (PL_perldb & PERLDBf_NAMEANON))
+
+
+#ifdef USE_LOCALE_NUMERIC
+
+#define SET_NUMERIC_STANDARD() \
+	set_numeric_standard();
+
+#define SET_NUMERIC_LOCAL() \
+	set_numeric_local();
+
+#define IN_LOCALE_RUNTIME	(PL_curcop->op_private & HINT_LOCALE)
+#define IN_LOCALE_COMPILETIME	(PL_hints & HINT_LOCALE)
+
+#define IN_LOCALE \
+	(IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
+
+#define STORE_NUMERIC_LOCAL_SET_STANDARD() \
+	bool was_local = PL_numeric_local && IN_LOCALE; \
+	if (was_local) SET_NUMERIC_STANDARD();
+
+#define STORE_NUMERIC_STANDARD_SET_LOCAL() \
+	bool was_standard = PL_numeric_standard && IN_LOCALE; \
+	if (was_standard) SET_NUMERIC_LOCAL();
+
+#define RESTORE_NUMERIC_LOCAL() \
+	if (was_local) SET_NUMERIC_LOCAL();
+
+#define RESTORE_NUMERIC_STANDARD() \
+	if (was_standard) SET_NUMERIC_STANDARD();
+
+#define Atof				my_atof
+
+#else /* !USE_LOCALE_NUMERIC */
+
+#define SET_NUMERIC_STANDARD()  	/**/
+#define SET_NUMERIC_LOCAL()     	/**/
+#define IS_NUMERIC_RADIX(a, b)		(0)
+#define STORE_NUMERIC_LOCAL_SET_STANDARD()	/**/
+#define STORE_NUMERIC_STANDARD_SET_LOCAL()	/**/
+#define RESTORE_NUMERIC_LOCAL()		/**/
+#define RESTORE_NUMERIC_STANDARD()	/**/
+#define Atof				my_atof
+#define IN_LOCALE_RUNTIME		0
+
+#endif /* !USE_LOCALE_NUMERIC */
+
+#if !defined(Strtol) && defined(USE_64_BIT_INT) && defined(IV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG
+#    ifdef __hpux
+#        define strtoll __strtoll	/* secret handshake */
+#    endif
+#    ifdef WIN64
+#        define strtoll _strtoi64	/* secret handshake */
+#    endif
+#   if !defined(Strtol) && defined(HAS_STRTOLL)
+#       define Strtol	strtoll
+#   endif
+#    if !defined(Strtol) && defined(HAS_STRTOQ)
+#       define Strtol	strtoq
+#    endif
+/* is there atoq() anywhere? */
+#endif
+#if !defined(Strtol) && defined(HAS_STRTOL)
+#   define Strtol	strtol
+#endif
+#ifndef Atol
+/* It would be more fashionable to use Strtol() to define atol()
+ * (as is done for Atoul(), see below) but for backward compatibility
+ * we just assume atol(). */
+#   if defined(USE_64_BIT_INT) && defined(IV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG && defined(HAS_ATOLL)
+#    ifdef WIN64
+#       define atoll    _atoi64		/* secret handshake */
+#    endif
+#       define Atol	atoll
+#   else
+#       define Atol	atol
+#   endif
+#endif
+
+#if !defined(Strtoul) && defined(USE_64_BIT_INT) && defined(UV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG
+#    ifdef __hpux
+#        define strtoull __strtoull	/* secret handshake */
+#    endif
+#    ifdef WIN64
+#        define strtoull _strtoui64	/* secret handshake */
+#    endif
+#    if !defined(Strtoul) && defined(HAS_STRTOULL)
+#       define Strtoul	strtoull
+#    endif
+#    if !defined(Strtoul) && defined(HAS_STRTOUQ)
+#       define Strtoul	strtouq
+#    endif
+/* is there atouq() anywhere? */
+#endif
+#if !defined(Strtoul) && defined(HAS_STRTOUL)
+#   define Strtoul	strtoul
+#endif
+#if !defined(Strtoul) && defined(HAS_STRTOL) /* Last resort. */
+#   define Strtoul(s, e, b)	strchr((s), '-') ? ULONG_MAX : (unsigned long)strtol((s), (e), (b))
+#endif
+#ifndef Atoul
+#   define Atoul(s)	Strtoul(s, (char **)NULL, 10)
+#endif
+
+
+/* if these never got defined, they need defaults */
+#ifndef PERL_SET_CONTEXT
+#  define PERL_SET_CONTEXT(i)		PERL_SET_INTERP(i)
+#endif
+
+#ifndef PERL_GET_CONTEXT
+#  define PERL_GET_CONTEXT		PERL_GET_INTERP
+#endif
+
+#ifndef PERL_GET_THX
+#  define PERL_GET_THX			((void*)NULL)
+#endif
+
+#ifndef PERL_SET_THX
+#  define PERL_SET_THX(t)		NOOP
+#endif
+
+#ifndef PERL_SCRIPT_MODE
+#define PERL_SCRIPT_MODE "r"
+#endif
+
+/*
+ * Some operating systems are stingy with stack allocation,
+ * so perl may have to guard against stack overflow.
+ */
+#ifndef PERL_STACK_OVERFLOW_CHECK
+#define PERL_STACK_OVERFLOW_CHECK()  NOOP
+#endif
+
+/*
+ * Some nonpreemptive operating systems find it convenient to
+ * check for asynchronous conditions after each op execution.
+ * Keep this check simple, or it may slow down execution
+ * massively.
+ */
+
+#ifndef PERL_MICRO
+#	ifndef PERL_ASYNC_CHECK
+#		define PERL_ASYNC_CHECK() if (PL_sig_pending) despatch_signals()
+#	endif
+#endif
+
+#ifndef PERL_ASYNC_CHECK
+#   define PERL_ASYNC_CHECK()  NOOP
+#endif
+
+/*
+ * On some operating systems, a memory allocation may succeed,
+ * but put the process too close to the system's comfort limit.
+ * In this case, PERL_ALLOC_CHECK frees the pointer and sets
+ * it to NULL.
+ */
+#ifndef PERL_ALLOC_CHECK
+#define PERL_ALLOC_CHECK(p)  NOOP
+#endif
+
+#ifdef HAS_SEM
+#   include <sys/ipc.h>
+#   include <sys/sem.h>
+#   ifndef HAS_UNION_SEMUN	/* Provide the union semun. */
+    union semun {
+	int		val;
+	struct semid_ds	*buf;
+	unsigned short	*array;
+    };
+#   endif
+#   ifdef USE_SEMCTL_SEMUN
+#	ifdef IRIX32_SEMUN_BROKEN_BY_GCC
+            union gccbug_semun {
+		int             val;
+		struct semid_ds *buf;
+		unsigned short  *array;
+		char            __dummy[5];
+	    };
+#           define semun gccbug_semun
+#	endif
+#       define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun)
+#   else
+#       ifdef USE_SEMCTL_SEMID_DS
+#           ifdef EXTRA_F_IN_SEMUN_BUF
+#               define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buff)
+#           else
+#               define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buf)
+#           endif
+#       endif
+#   endif
+#endif
+
+/*
+ * Boilerplate macros for initializing and accessing interpreter-local
+ * data from C.  All statics in extensions should be reworked to use
+ * this, if you want to make the extension thread-safe.  See ext/re/re.xs
+ * for an example of the use of these macros, and perlxs.pod for more.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g.
+ *    "DynaLoader::_guts" XS_VERSION
+ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+ *    all the data that needs to be interpreter-local.
+ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+ *    (typically put in the BOOT: section).
+ * 5. Use the members of the my_cxt_t structure everywhere as
+ *    MY_CXT.member.
+ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+ *    access MY_CXT.
+ */
+
+#if defined(PERL_IMPLICIT_CONTEXT)
+
+/* This must appear in all extensions that define a my_cxt_t structure,
+ * right after the definition (i.e. at file scope).  The non-threads
+ * case below uses it to declare the data as static. */
+#define START_MY_CXT
+
+/* Fetches the SV that keeps the per-interpreter data. */
+#define dMY_CXT_SV \
+	SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,		\
+				  sizeof(MY_CXT_KEY)-1, TRUE)
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT	\
+	dMY_CXT_SV;							\
+	my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*, SvUV(my_cxt_sv))
+
+/* Creates and zeroes the per-interpreter data.
+ * (We allocate my_cxtp in a Perl SV so that it will be released when
+ * the interpreter goes away.) */
+#define MY_CXT_INIT \
+	dMY_CXT_SV;							\
+	/* newSV() allocates one more than needed */			\
+	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+	Zero(my_cxtp, 1, my_cxt_t);					\
+	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+	dMY_CXT_SV;							\
+	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+	Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
+	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+
+/* This macro must be used to access members of the my_cxt_t structure.
+ * e.g. MYCXT.some_data */
+#define MY_CXT		(*my_cxtp)
+
+/* Judicious use of these macros can reduce the number of times dMY_CXT
+ * is used.  Use is similar to pTHX, aTHX etc. */
+#define pMY_CXT		my_cxt_t *my_cxtp
+#define pMY_CXT_	pMY_CXT,
+#define _pMY_CXT	,pMY_CXT
+#define aMY_CXT		my_cxtp
+#define aMY_CXT_	aMY_CXT,
+#define _aMY_CXT	,aMY_CXT
+
+#else /* USE_ITHREADS */
+
+#define START_MY_CXT	static my_cxt_t my_cxt;
+#define dMY_CXT_SV	dNOOP
+#define dMY_CXT		dNOOP
+#define MY_CXT_INIT	NOOP
+#define MY_CXT_CLONE	NOOP
+#define MY_CXT		my_cxt
+
+#define pMY_CXT		void
+#define pMY_CXT_
+#define _pMY_CXT
+#define aMY_CXT
+#define aMY_CXT_
+#define _aMY_CXT
+
+#endif /* !defined(USE_ITHREADS) */
+
+#ifdef I_FCNTL
+#  include <fcntl.h>
+#endif
+
+#ifdef __Lynx__
+#  include <fcntl.h>
+#endif
+
+#ifdef I_SYS_FILE
+#  include <sys/file.h>
+#endif
+
+#if defined(HAS_FLOCK) && !defined(HAS_FLOCK_PROTO)
+int flock(int fd, int op);
+#endif
+
+#ifndef O_RDONLY
+/* Assume UNIX defaults */
+#    define O_RDONLY	0000
+#    define O_WRONLY	0001
+#    define O_RDWR	0002
+#    define O_CREAT	0100
+#endif
+
+#ifndef O_BINARY
+#  define O_BINARY 0
+#endif
+
+#ifndef O_TEXT
+#  define O_TEXT 0
+#endif
+
+#if O_TEXT != O_BINARY
+    /* If you have different O_TEXT and O_BINARY and you are a CLRF shop,
+     * that is, you are somehow DOSish. */
+#   if defined(__BEOS__) || defined(__VOS__) || defined(__CYGWIN__)
+    /* BeOS has O_TEXT != O_BINARY but O_TEXT and O_BINARY have no effect;
+     * BeOS is always UNIXoid (LF), not DOSish (CRLF). */
+    /* VOS has O_TEXT != O_BINARY, and they have effect,
+     * but VOS always uses LF, never CRLF. */
+    /* If you have O_TEXT different from your O_BINARY but you still are
+     * not a CRLF shop. */
+#       undef PERLIO_USING_CRLF
+#   else
+    /* If you really are DOSish. */
+#      define PERLIO_USING_CRLF 1
+#   endif
+#endif
+
+#ifdef IAMSUID
+
+#ifdef I_SYS_STATVFS
+#   if defined(PERL_SCO) && !defined(_SVID3)
+#       define _SVID3
+#   endif
+#   include <sys/statvfs.h>     /* for f?statvfs() */
+#endif
+#ifdef I_SYS_MOUNT
+#   include <sys/mount.h>       /* for *BSD f?statfs() */
+#endif
+#ifdef I_MNTENT
+#   include <mntent.h>          /* for getmntent() */
+#endif
+#ifdef I_SYS_STATFS
+#   include <sys/statfs.h>      /* for some statfs() */
+#endif
+#ifdef I_SYS_VFS
+#  ifdef __sgi
+#    define sv IRIX_sv		/* kludge: IRIX has an sv of its own */
+#  endif
+#    include <sys/vfs.h>	/* for some statfs() */
+#  ifdef __sgi
+#    undef IRIX_sv
+#  endif
+#endif
+#ifdef I_USTAT
+#   include <ustat.h>           /* for ustat() */
+#endif
+
+#if !defined(PERL_MOUNT_NOSUID) && defined(MOUNT_NOSUID)
+#    define PERL_MOUNT_NOSUID MOUNT_NOSUID
+#endif
+#if !defined(PERL_MOUNT_NOSUID) && defined(MNT_NOSUID)
+#    define PERL_MOUNT_NOSUID MNT_NOSUID
+#endif
+#if !defined(PERL_MOUNT_NOSUID) && defined(MS_NOSUID)
+#   define PERL_MOUNT_NOSUID MS_NOSUID
+#endif
+#if !defined(PERL_MOUNT_NOSUID) && defined(M_NOSUID)
+#   define PERL_MOUNT_NOSUID M_NOSUID
+#endif
+
+#if !defined(PERL_MOUNT_NOEXEC) && defined(MOUNT_NOEXEC)
+#    define PERL_MOUNT_NOEXEC MOUNT_NOEXEC
+#endif
+#if !defined(PERL_MOUNT_NOEXEC) && defined(MNT_NOEXEC)
+#    define PERL_MOUNT_NOEXEC MNT_NOEXEC
+#endif
+#if !defined(PERL_MOUNT_NOEXEC) && defined(MS_NOEXEC)
+#   define PERL_MOUNT_NOEXEC MS_NOEXEC
+#endif
+#if !defined(PERL_MOUNT_NOEXEC) && defined(M_NOEXEC)
+#   define PERL_MOUNT_NOEXEC M_NOEXEC
+#endif
+
+#endif /* IAMSUID */
+
+#ifdef I_LIBUTIL
+#   include <libutil.h>		/* setproctitle() in some FreeBSDs */
+#endif
+
+#ifndef EXEC_ARGV_CAST
+#define EXEC_ARGV_CAST(x) x
+#endif
+
+#define IS_NUMBER_IN_UV		      0x01 /* number within UV range (maybe not
+					      int).  value returned in pointed-
+					      to UV */
+#define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 /* pointed to UV undefined */
+#define IS_NUMBER_NOT_INT	      0x04 /* saw . or E notation */
+#define IS_NUMBER_NEG		      0x08 /* leading minus sign */
+#define IS_NUMBER_INFINITY	      0x10 /* this is big */
+#define IS_NUMBER_NAN                 0x20 /* this is not */
+
+#define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send)
+
+/* Input flags: */
+#define PERL_SCAN_ALLOW_UNDERSCORES   0x01 /* grok_??? accept _ in numbers */
+#define PERL_SCAN_DISALLOW_PREFIX     0x02 /* grok_??? reject 0x in hex etc */
+#define PERL_SCAN_SILENT_ILLDIGIT     0x04 /* grok_??? not warn about illegal digits */
+/* Output flags: */
+#define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 /* should this merge with above? */
+
+/* to let user control profiling */
+#ifdef PERL_GPROF_CONTROL
+extern void moncontrol(int);
+#define PERL_GPROF_MONCONTROL(x) moncontrol(x)
+#else
+#define PERL_GPROF_MONCONTROL(x)
+#endif
+
+#ifdef UNDER_CE
+#include "wince.h"
+#endif
+
+/* ISO 6429 NEL - C1 control NExt Line */
+/* See http://www.unicode.org/unicode/reports/tr13/ */
+#ifdef EBCDIC	/* In EBCDIC NEL is just an alias for LF */
+#   if '^' == 95	/* CP 1047: MVS OpenEdition - OS/390 - z/OS */
+#       define NEXT_LINE_CHAR	0x15
+#   else		/* CDRA */
+#       define NEXT_LINE_CHAR	0x25
+#   endif
+#else
+#   define NEXT_LINE_CHAR	0x85
+#endif
+
+/* The UTF-8 bytes of the Unicode LS and PS, U+2028 and U+2029 */
+#define UNICODE_LINE_SEPA_0	0xE2
+#define UNICODE_LINE_SEPA_1	0x80
+#define UNICODE_LINE_SEPA_2	0xA8
+#define UNICODE_PARA_SEPA_0	0xE2
+#define UNICODE_PARA_SEPA_1	0x80
+#define UNICODE_PARA_SEPA_2	0xA9
+
+#ifndef PIPESOCK_MODE
+#  define PIPESOCK_MODE
+#endif
+
+#ifndef SOCKET_OPEN_MODE
+#  define SOCKET_OPEN_MODE	PIPESOCK_MODE
+#endif
+
+#ifndef PIPE_OPEN_MODE
+#  define PIPE_OPEN_MODE	PIPESOCK_MODE
+#endif
+
+#define PERL_MAGIC_UTF8_CACHESIZE	2
+
+#define PERL_UNICODE_STDIN_FLAG			0x0001
+#define PERL_UNICODE_STDOUT_FLAG		0x0002
+#define PERL_UNICODE_STDERR_FLAG		0x0004
+#define PERL_UNICODE_IN_FLAG			0x0008
+#define PERL_UNICODE_OUT_FLAG			0x0010
+#define PERL_UNICODE_ARGV_FLAG			0x0020
+#define PERL_UNICODE_LOCALE_FLAG		0x0040
+#define PERL_UNICODE_WIDESYSCALLS_FLAG		0x0080 /* for Sarathy */
+
+#define PERL_UNICODE_STD_FLAG		\
+	(PERL_UNICODE_STDIN_FLAG	| \
+	 PERL_UNICODE_STDOUT_FLAG	| \
+	 PERL_UNICODE_STDERR_FLAG)
+
+#define PERL_UNICODE_INOUT_FLAG		\
+	(PERL_UNICODE_IN_FLAG	| \
+	 PERL_UNICODE_OUT_FLAG)
+
+#define PERL_UNICODE_DEFAULT_FLAGS	\
+	(PERL_UNICODE_STD_FLAG		| \
+	 PERL_UNICODE_INOUT_FLAG	| \
+	 PERL_UNICODE_LOCALE_FLAG)
+
+#define PERL_UNICODE_ALL_FLAGS			0x00ff
+
+#define PERL_UNICODE_STDIN			'I'
+#define PERL_UNICODE_STDOUT			'O'
+#define PERL_UNICODE_STDERR			'E'
+#define PERL_UNICODE_STD			'S'
+#define PERL_UNICODE_IN				'i'
+#define PERL_UNICODE_OUT			'o'
+#define PERL_UNICODE_INOUT			'D'
+#define PERL_UNICODE_ARGV			'A'
+#define PERL_UNICODE_LOCALE			'L'
+#define PERL_UNICODE_WIDESYSCALLS		'W'
+
+#define PERL_SIGNALS_UNSAFE_FLAG	0x0001
+
+/* From sigaction(2) (FreeBSD man page):
+ * | Signal routines normally execute with the signal that
+ * | caused their invocation blocked, but other signals may
+ * | yet occur.
+ * Emulation of this behavior (from within Perl) is enabled
+ * by defining PERL_BLOCK_SIGNALS.
+ */
+#define PERL_BLOCK_SIGNALS
+
+#if defined(HAS_SIGPROCMASK) && defined(PERL_BLOCK_SIGNALS)
+#   define PERL_BLOCKSIG_ADD(set,sig) \
+	sigset_t set; sigemptyset(&(set)); sigaddset(&(set), sig)
+#   define PERL_BLOCKSIG_BLOCK(set) \
+	sigprocmask(SIG_BLOCK, &(set), NULL)
+#   define PERL_BLOCKSIG_UNBLOCK(set) \
+	sigprocmask(SIG_UNBLOCK, &(set), NULL)
+#endif /* HAS_SIGPROCMASK && PERL_BLOCK_SIGNALS */
+
+/* How about the old style of sigblock()? */
+
+#ifndef PERL_BLOCKSIG_ADD
+#   define PERL_BLOCKSIG_ADD(set, sig)	NOOP
+#endif
+#ifndef PERL_BLOCKSIG_BLOCK
+#   define PERL_BLOCKSIG_BLOCK(set)	NOOP
+#endif
+#ifndef PERL_BLOCKSIG_UNBLOCK
+#   define PERL_BLOCKSIG_UNBLOCK(set)	NOOP
+#endif
+
+/* Use instead of abs() since abs() forces its argument to be an int,
+ * but also beware since this evaluates its argument twice, so no x++. */
+#define PERL_ABS(x) ((x) < 0 ? -(x) : (x))
+
+#if defined(__DECC) && defined(__osf__)
+#pragma message disable (mainparm) /* Perl uses the envp in main(). */
+#endif
+
+/* and finally... */
+#define PERL_PATCHLEVEL_H_IMPLICIT
+#include "patchlevel.h"
+#undef PERL_PATCHLEVEL_H_IMPLICIT
+
+/* Mention
+
+   NV_PRESERVES_UV
+
+   HAS_MKSTEMP
+   HAS_MKSTEMPS
+   HAS_MKDTEMP
+
+   HAS_GETCWD
+
+   HAS_MMAP
+   HAS_MPROTECT
+   HAS_MSYNC
+   HAS_MADVISE
+   HAS_MUNMAP
+   I_SYSMMAN
+   Mmap_t
+
+   NVef
+   NVff
+   NVgf
+
+   HAS_UALARM
+   HAS_USLEEP
+
+   HAS_SETITIMER
+   HAS_GETITIMER
+
+   HAS_SENDMSG
+   HAS_RECVMSG
+   HAS_READV
+   HAS_WRITEV
+   I_SYSUIO
+   HAS_STRUCT_MSGHDR
+   HAS_STRUCT_CMSGHDR
+
+   HAS_NL_LANGINFO
+
+   HAS_DIRFD
+
+   so that Configure picks them up. */
+
+/* Source code compatibility cruft:
+   PERL_XS_APIVERSION is not used, and has been superseded by inc_version_list
+   It and PERL_PM_APIVERSION are retained for source compatibility in the
+   5.8.x maintenance branch.
+ */
+
+#define PERL_XS_APIVERSION "5.8.3"
+#define PERL_PM_APIVERSION "5.005"
+
+#endif /* Include guard */
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/perlapi.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/perlapi.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/perlapi.h	(revision 14489)
@@ -0,0 +1,1056 @@
+/*  -*- buffer-read-only: t -*-
+ *
+ *    perlapi.h
+ *
+ *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ * This file is built by embed.pl from data in embed.fnc, embed.pl,
+ * pp.sym, intrpvar.h, perlvars.h and thrdvar.h.
+ * Any changes made here will be lost!
+ *
+ * Edit those files and run 'make regen_headers' to effect changes.
+ */
+
+/* declare accessor functions for Perl variables */
+#ifndef __perlapi_h__
+#define __perlapi_h__
+
+#if defined (MULTIPLICITY)
+
+START_EXTERN_C
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#define PERLVAR(v,t)	EXTERN_C t* Perl_##v##_ptr(pTHX);
+#define PERLVARA(v,n,t)	typedef t PL_##v##_t[n];			\
+			EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
+#define PERLVARI(v,t,i)	PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v, const t)
+
+#include "thrdvar.h"
+#include "intrpvar.h"
+#include "perlvars.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+END_EXTERN_C
+
+#if defined(PERL_CORE)
+
+/* accessor functions for Perl variables (provide binary compatibility) */
+
+/* these need to be mentioned here, or most linkers won't put them in
+   the perl executable */
+
+#ifndef PERL_NO_FORCE_LINK
+
+START_EXTERN_C
+
+#ifndef DOINIT
+EXT void *PL_force_link_funcs[];
+#else
+EXT void *PL_force_link_funcs[] = {
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#define PERLVAR(v,t)	(void*)Perl_##v##_ptr,
+#define PERLVARA(v,n,t)	PERLVAR(v,t)
+#define PERLVARI(v,t,i)	PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v,t)
+
+/* In Tru64 (__DEC && __osf__) the cc option -std1 causes that one
+ * cannot cast between void pointers and function pointers without
+ * info level warnings.  The PL_force_link_funcs[] would cause a few
+ * hundred of those warnings.  In code one can circumnavigate this by using
+ * unions that overlay the different pointers, but in declarations one
+ * cannot use this trick.  Therefore we just disable the warning here
+ * for the duration of the PL_force_link_funcs[] declaration. */
+
+#if defined(__DECC) && defined(__osf__)
+#pragma message save
+#pragma message disable (nonstandcast)
+#endif
+
+#include "thrdvar.h"
+#include "intrpvar.h"
+#include "perlvars.h"
+
+#if defined(__DECC) && defined(__osf__)
+#pragma message restore
+#endif
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+};
+#endif	/* DOINIT */
+
+END_EXTERN_C
+
+#endif	/* PERL_NO_FORCE_LINK */
+
+#else	/* !PERL_CORE */
+
+#undef  PL_Argv
+#define PL_Argv			(*Perl_IArgv_ptr(aTHX))
+#undef  PL_BINCOMPAT0
+#define PL_BINCOMPAT0		(*Perl_IBINCOMPAT0_ptr(aTHX))
+#undef  PL_Cmd
+#define PL_Cmd			(*Perl_ICmd_ptr(aTHX))
+#undef  PL_DBcv
+#define PL_DBcv			(*Perl_IDBcv_ptr(aTHX))
+#undef  PL_DBgv
+#define PL_DBgv			(*Perl_IDBgv_ptr(aTHX))
+#undef  PL_DBline
+#define PL_DBline		(*Perl_IDBline_ptr(aTHX))
+#undef  PL_DBsignal
+#define PL_DBsignal		(*Perl_IDBsignal_ptr(aTHX))
+#undef  PL_DBsingle
+#define PL_DBsingle		(*Perl_IDBsingle_ptr(aTHX))
+#undef  PL_DBsub
+#define PL_DBsub		(*Perl_IDBsub_ptr(aTHX))
+#undef  PL_DBtrace
+#define PL_DBtrace		(*Perl_IDBtrace_ptr(aTHX))
+#undef  PL_Dir
+#define PL_Dir			(*Perl_IDir_ptr(aTHX))
+#undef  PL_Env
+#define PL_Env			(*Perl_IEnv_ptr(aTHX))
+#undef  PL_LIO
+#define PL_LIO			(*Perl_ILIO_ptr(aTHX))
+#undef  PL_Mem
+#define PL_Mem			(*Perl_IMem_ptr(aTHX))
+#undef  PL_MemParse
+#define PL_MemParse		(*Perl_IMemParse_ptr(aTHX))
+#undef  PL_MemShared
+#define PL_MemShared		(*Perl_IMemShared_ptr(aTHX))
+#undef  PL_OpPtr
+#define PL_OpPtr		(*Perl_IOpPtr_ptr(aTHX))
+#undef  PL_OpSlab
+#define PL_OpSlab		(*Perl_IOpSlab_ptr(aTHX))
+#undef  PL_OpSpace
+#define PL_OpSpace		(*Perl_IOpSpace_ptr(aTHX))
+#undef  PL_Proc
+#define PL_Proc			(*Perl_IProc_ptr(aTHX))
+#undef  PL_Sock
+#define PL_Sock			(*Perl_ISock_ptr(aTHX))
+#undef  PL_StdIO
+#define PL_StdIO		(*Perl_IStdIO_ptr(aTHX))
+#undef  PL_amagic_generation
+#define PL_amagic_generation	(*Perl_Iamagic_generation_ptr(aTHX))
+#undef  PL_an
+#define PL_an			(*Perl_Ian_ptr(aTHX))
+#undef  PL_argvgv
+#define PL_argvgv		(*Perl_Iargvgv_ptr(aTHX))
+#undef  PL_argvout_stack
+#define PL_argvout_stack	(*Perl_Iargvout_stack_ptr(aTHX))
+#undef  PL_argvoutgv
+#define PL_argvoutgv		(*Perl_Iargvoutgv_ptr(aTHX))
+#undef  PL_basetime
+#define PL_basetime		(*Perl_Ibasetime_ptr(aTHX))
+#undef  PL_beginav
+#define PL_beginav		(*Perl_Ibeginav_ptr(aTHX))
+#undef  PL_beginav_save
+#define PL_beginav_save		(*Perl_Ibeginav_save_ptr(aTHX))
+#undef  PL_bitcount
+#define PL_bitcount		(*Perl_Ibitcount_ptr(aTHX))
+#undef  PL_bufend
+#define PL_bufend		(*Perl_Ibufend_ptr(aTHX))
+#undef  PL_bufptr
+#define PL_bufptr		(*Perl_Ibufptr_ptr(aTHX))
+#undef  PL_checkav
+#define PL_checkav		(*Perl_Icheckav_ptr(aTHX))
+#undef  PL_checkav_save
+#define PL_checkav_save		(*Perl_Icheckav_save_ptr(aTHX))
+#undef  PL_clocktick
+#define PL_clocktick		(*Perl_Iclocktick_ptr(aTHX))
+#undef  PL_collation_ix
+#define PL_collation_ix		(*Perl_Icollation_ix_ptr(aTHX))
+#undef  PL_collation_name
+#define PL_collation_name	(*Perl_Icollation_name_ptr(aTHX))
+#undef  PL_collation_standard
+#define PL_collation_standard	(*Perl_Icollation_standard_ptr(aTHX))
+#undef  PL_collxfrm_base
+#define PL_collxfrm_base	(*Perl_Icollxfrm_base_ptr(aTHX))
+#undef  PL_collxfrm_mult
+#define PL_collxfrm_mult	(*Perl_Icollxfrm_mult_ptr(aTHX))
+#undef  PL_compcv
+#define PL_compcv		(*Perl_Icompcv_ptr(aTHX))
+#undef  PL_compiling
+#define PL_compiling		(*Perl_Icompiling_ptr(aTHX))
+#undef  PL_comppad_name
+#define PL_comppad_name		(*Perl_Icomppad_name_ptr(aTHX))
+#undef  PL_comppad_name_fill
+#define PL_comppad_name_fill	(*Perl_Icomppad_name_fill_ptr(aTHX))
+#undef  PL_comppad_name_floor
+#define PL_comppad_name_floor	(*Perl_Icomppad_name_floor_ptr(aTHX))
+#undef  PL_cop_seqmax
+#define PL_cop_seqmax		(*Perl_Icop_seqmax_ptr(aTHX))
+#undef  PL_copline
+#define PL_copline		(*Perl_Icopline_ptr(aTHX))
+#undef  PL_cred_mutex
+#define PL_cred_mutex		(*Perl_Icred_mutex_ptr(aTHX))
+#undef  PL_cryptseen
+#define PL_cryptseen		(*Perl_Icryptseen_ptr(aTHX))
+#undef  PL_cshlen
+#define PL_cshlen		(*Perl_Icshlen_ptr(aTHX))
+#undef  PL_cshname
+#define PL_cshname		(*Perl_Icshname_ptr(aTHX))
+#undef  PL_curcopdb
+#define PL_curcopdb		(*Perl_Icurcopdb_ptr(aTHX))
+#undef  PL_curstname
+#define PL_curstname		(*Perl_Icurstname_ptr(aTHX))
+#undef  PL_curthr
+#define PL_curthr		(*Perl_Icurthr_ptr(aTHX))
+#undef  PL_custom_op_descs
+#define PL_custom_op_descs	(*Perl_Icustom_op_descs_ptr(aTHX))
+#undef  PL_custom_op_names
+#define PL_custom_op_names	(*Perl_Icustom_op_names_ptr(aTHX))
+#undef  PL_dbargs
+#define PL_dbargs		(*Perl_Idbargs_ptr(aTHX))
+#undef  PL_debstash
+#define PL_debstash		(*Perl_Idebstash_ptr(aTHX))
+#undef  PL_debug
+#define PL_debug		(*Perl_Idebug_ptr(aTHX))
+#undef  PL_debug_pad
+#define PL_debug_pad		(*Perl_Idebug_pad_ptr(aTHX))
+#undef  PL_def_layerlist
+#define PL_def_layerlist	(*Perl_Idef_layerlist_ptr(aTHX))
+#undef  PL_defgv
+#define PL_defgv		(*Perl_Idefgv_ptr(aTHX))
+#undef  PL_diehook
+#define PL_diehook		(*Perl_Idiehook_ptr(aTHX))
+#undef  PL_doextract
+#define PL_doextract		(*Perl_Idoextract_ptr(aTHX))
+#undef  PL_doswitches
+#define PL_doswitches		(*Perl_Idoswitches_ptr(aTHX))
+#undef  PL_dowarn
+#define PL_dowarn		(*Perl_Idowarn_ptr(aTHX))
+#undef  PL_dumper_fd
+#define PL_dumper_fd		(*Perl_Idumper_fd_ptr(aTHX))
+#undef  PL_e_script
+#define PL_e_script		(*Perl_Ie_script_ptr(aTHX))
+#undef  PL_egid
+#define PL_egid			(*Perl_Iegid_ptr(aTHX))
+#undef  PL_encoding
+#define PL_encoding		(*Perl_Iencoding_ptr(aTHX))
+#undef  PL_endav
+#define PL_endav		(*Perl_Iendav_ptr(aTHX))
+#undef  PL_envgv
+#define PL_envgv		(*Perl_Ienvgv_ptr(aTHX))
+#undef  PL_errgv
+#define PL_errgv		(*Perl_Ierrgv_ptr(aTHX))
+#undef  PL_error_count
+#define PL_error_count		(*Perl_Ierror_count_ptr(aTHX))
+#undef  PL_euid
+#define PL_euid			(*Perl_Ieuid_ptr(aTHX))
+#undef  PL_eval_cond
+#define PL_eval_cond		(*Perl_Ieval_cond_ptr(aTHX))
+#undef  PL_eval_mutex
+#define PL_eval_mutex		(*Perl_Ieval_mutex_ptr(aTHX))
+#undef  PL_eval_owner
+#define PL_eval_owner		(*Perl_Ieval_owner_ptr(aTHX))
+#undef  PL_eval_root
+#define PL_eval_root		(*Perl_Ieval_root_ptr(aTHX))
+#undef  PL_eval_start
+#define PL_eval_start		(*Perl_Ieval_start_ptr(aTHX))
+#undef  PL_evalseq
+#define PL_evalseq		(*Perl_Ievalseq_ptr(aTHX))
+#undef  PL_exit_flags
+#define PL_exit_flags		(*Perl_Iexit_flags_ptr(aTHX))
+#undef  PL_exitlist
+#define PL_exitlist		(*Perl_Iexitlist_ptr(aTHX))
+#undef  PL_exitlistlen
+#define PL_exitlistlen		(*Perl_Iexitlistlen_ptr(aTHX))
+#undef  PL_expect
+#define PL_expect		(*Perl_Iexpect_ptr(aTHX))
+#undef  PL_fdpid
+#define PL_fdpid		(*Perl_Ifdpid_ptr(aTHX))
+#undef  PL_fdpid_mutex
+#define PL_fdpid_mutex		(*Perl_Ifdpid_mutex_ptr(aTHX))
+#undef  PL_fdscript
+#define PL_fdscript		(*Perl_Ifdscript_ptr(aTHX))
+#undef  PL_filemode
+#define PL_filemode		(*Perl_Ifilemode_ptr(aTHX))
+#undef  PL_forkprocess
+#define PL_forkprocess		(*Perl_Iforkprocess_ptr(aTHX))
+#undef  PL_formfeed
+#define PL_formfeed		(*Perl_Iformfeed_ptr(aTHX))
+#undef  PL_generation
+#define PL_generation		(*Perl_Igeneration_ptr(aTHX))
+#undef  PL_gensym
+#define PL_gensym		(*Perl_Igensym_ptr(aTHX))
+#undef  PL_gid
+#define PL_gid			(*Perl_Igid_ptr(aTHX))
+#undef  PL_glob_index
+#define PL_glob_index		(*Perl_Iglob_index_ptr(aTHX))
+#undef  PL_globalstash
+#define PL_globalstash		(*Perl_Iglobalstash_ptr(aTHX))
+#undef  PL_hash_seed
+#define PL_hash_seed		(*Perl_Ihash_seed_ptr(aTHX))
+#undef  PL_hash_seed_set
+#define PL_hash_seed_set	(*Perl_Ihash_seed_set_ptr(aTHX))
+#undef  PL_he_arenaroot
+#define PL_he_arenaroot		(*Perl_Ihe_arenaroot_ptr(aTHX))
+#undef  PL_he_root
+#define PL_he_root		(*Perl_Ihe_root_ptr(aTHX))
+#undef  PL_hintgv
+#define PL_hintgv		(*Perl_Ihintgv_ptr(aTHX))
+#undef  PL_hints
+#define PL_hints		(*Perl_Ihints_ptr(aTHX))
+#undef  PL_in_clean_all
+#define PL_in_clean_all		(*Perl_Iin_clean_all_ptr(aTHX))
+#undef  PL_in_clean_objs
+#define PL_in_clean_objs	(*Perl_Iin_clean_objs_ptr(aTHX))
+#undef  PL_in_load_module
+#define PL_in_load_module	(*Perl_Iin_load_module_ptr(aTHX))
+#undef  PL_in_my
+#define PL_in_my		(*Perl_Iin_my_ptr(aTHX))
+#undef  PL_in_my_stash
+#define PL_in_my_stash		(*Perl_Iin_my_stash_ptr(aTHX))
+#undef  PL_incgv
+#define PL_incgv		(*Perl_Iincgv_ptr(aTHX))
+#undef  PL_initav
+#define PL_initav		(*Perl_Iinitav_ptr(aTHX))
+#undef  PL_inplace
+#define PL_inplace		(*Perl_Iinplace_ptr(aTHX))
+#undef  PL_known_layers
+#define PL_known_layers		(*Perl_Iknown_layers_ptr(aTHX))
+#undef  PL_last_lop
+#define PL_last_lop		(*Perl_Ilast_lop_ptr(aTHX))
+#undef  PL_last_lop_op
+#define PL_last_lop_op		(*Perl_Ilast_lop_op_ptr(aTHX))
+#undef  PL_last_swash_hv
+#define PL_last_swash_hv	(*Perl_Ilast_swash_hv_ptr(aTHX))
+#undef  PL_last_swash_key
+#define PL_last_swash_key	(*Perl_Ilast_swash_key_ptr(aTHX))
+#undef  PL_last_swash_klen
+#define PL_last_swash_klen	(*Perl_Ilast_swash_klen_ptr(aTHX))
+#undef  PL_last_swash_slen
+#define PL_last_swash_slen	(*Perl_Ilast_swash_slen_ptr(aTHX))
+#undef  PL_last_swash_tmps
+#define PL_last_swash_tmps	(*Perl_Ilast_swash_tmps_ptr(aTHX))
+#undef  PL_last_uni
+#define PL_last_uni		(*Perl_Ilast_uni_ptr(aTHX))
+#undef  PL_lastfd
+#define PL_lastfd		(*Perl_Ilastfd_ptr(aTHX))
+#undef  PL_laststatval
+#define PL_laststatval		(*Perl_Ilaststatval_ptr(aTHX))
+#undef  PL_laststype
+#define PL_laststype		(*Perl_Ilaststype_ptr(aTHX))
+#undef  PL_lex_brackets
+#define PL_lex_brackets		(*Perl_Ilex_brackets_ptr(aTHX))
+#undef  PL_lex_brackstack
+#define PL_lex_brackstack	(*Perl_Ilex_brackstack_ptr(aTHX))
+#undef  PL_lex_casemods
+#define PL_lex_casemods		(*Perl_Ilex_casemods_ptr(aTHX))
+#undef  PL_lex_casestack
+#define PL_lex_casestack	(*Perl_Ilex_casestack_ptr(aTHX))
+#undef  PL_lex_defer
+#define PL_lex_defer		(*Perl_Ilex_defer_ptr(aTHX))
+#undef  PL_lex_dojoin
+#define PL_lex_dojoin		(*Perl_Ilex_dojoin_ptr(aTHX))
+#undef  PL_lex_expect
+#define PL_lex_expect		(*Perl_Ilex_expect_ptr(aTHX))
+#undef  PL_lex_formbrack
+#define PL_lex_formbrack	(*Perl_Ilex_formbrack_ptr(aTHX))
+#undef  PL_lex_inpat
+#define PL_lex_inpat		(*Perl_Ilex_inpat_ptr(aTHX))
+#undef  PL_lex_inwhat
+#define PL_lex_inwhat		(*Perl_Ilex_inwhat_ptr(aTHX))
+#undef  PL_lex_op
+#define PL_lex_op		(*Perl_Ilex_op_ptr(aTHX))
+#undef  PL_lex_repl
+#define PL_lex_repl		(*Perl_Ilex_repl_ptr(aTHX))
+#undef  PL_lex_starts
+#define PL_lex_starts		(*Perl_Ilex_starts_ptr(aTHX))
+#undef  PL_lex_state
+#define PL_lex_state		(*Perl_Ilex_state_ptr(aTHX))
+#undef  PL_lex_stuff
+#define PL_lex_stuff		(*Perl_Ilex_stuff_ptr(aTHX))
+#undef  PL_lineary
+#define PL_lineary		(*Perl_Ilineary_ptr(aTHX))
+#undef  PL_linestart
+#define PL_linestart		(*Perl_Ilinestart_ptr(aTHX))
+#undef  PL_linestr
+#define PL_linestr		(*Perl_Ilinestr_ptr(aTHX))
+#undef  PL_localpatches
+#define PL_localpatches		(*Perl_Ilocalpatches_ptr(aTHX))
+#undef  PL_lockhook
+#define PL_lockhook		(*Perl_Ilockhook_ptr(aTHX))
+#undef  PL_main_cv
+#define PL_main_cv		(*Perl_Imain_cv_ptr(aTHX))
+#undef  PL_main_root
+#define PL_main_root		(*Perl_Imain_root_ptr(aTHX))
+#undef  PL_main_start
+#define PL_main_start		(*Perl_Imain_start_ptr(aTHX))
+#undef  PL_max_intro_pending
+#define PL_max_intro_pending	(*Perl_Imax_intro_pending_ptr(aTHX))
+#undef  PL_maxo
+#define PL_maxo			(*Perl_Imaxo_ptr(aTHX))
+#undef  PL_maxsysfd
+#define PL_maxsysfd		(*Perl_Imaxsysfd_ptr(aTHX))
+#undef  PL_mess_sv
+#define PL_mess_sv		(*Perl_Imess_sv_ptr(aTHX))
+#undef  PL_min_intro_pending
+#define PL_min_intro_pending	(*Perl_Imin_intro_pending_ptr(aTHX))
+#undef  PL_minus_F
+#define PL_minus_F		(*Perl_Iminus_F_ptr(aTHX))
+#undef  PL_minus_a
+#define PL_minus_a		(*Perl_Iminus_a_ptr(aTHX))
+#undef  PL_minus_c
+#define PL_minus_c		(*Perl_Iminus_c_ptr(aTHX))
+#undef  PL_minus_l
+#define PL_minus_l		(*Perl_Iminus_l_ptr(aTHX))
+#undef  PL_minus_n
+#define PL_minus_n		(*Perl_Iminus_n_ptr(aTHX))
+#undef  PL_minus_p
+#define PL_minus_p		(*Perl_Iminus_p_ptr(aTHX))
+#undef  PL_modglobal
+#define PL_modglobal		(*Perl_Imodglobal_ptr(aTHX))
+#undef  PL_multi_close
+#define PL_multi_close		(*Perl_Imulti_close_ptr(aTHX))
+#undef  PL_multi_end
+#define PL_multi_end		(*Perl_Imulti_end_ptr(aTHX))
+#undef  PL_multi_open
+#define PL_multi_open		(*Perl_Imulti_open_ptr(aTHX))
+#undef  PL_multi_start
+#define PL_multi_start		(*Perl_Imulti_start_ptr(aTHX))
+#undef  PL_multiline
+#define PL_multiline		(*Perl_Imultiline_ptr(aTHX))
+#undef  PL_nexttoke
+#define PL_nexttoke		(*Perl_Inexttoke_ptr(aTHX))
+#undef  PL_nexttype
+#define PL_nexttype		(*Perl_Inexttype_ptr(aTHX))
+#undef  PL_nextval
+#define PL_nextval		(*Perl_Inextval_ptr(aTHX))
+#undef  PL_nice_chunk
+#define PL_nice_chunk		(*Perl_Inice_chunk_ptr(aTHX))
+#undef  PL_nice_chunk_size
+#define PL_nice_chunk_size	(*Perl_Inice_chunk_size_ptr(aTHX))
+#undef  PL_nomemok
+#define PL_nomemok		(*Perl_Inomemok_ptr(aTHX))
+#undef  PL_nthreads
+#define PL_nthreads		(*Perl_Inthreads_ptr(aTHX))
+#undef  PL_nthreads_cond
+#define PL_nthreads_cond	(*Perl_Inthreads_cond_ptr(aTHX))
+#undef  PL_nullstash
+#define PL_nullstash		(*Perl_Inullstash_ptr(aTHX))
+#undef  PL_numeric_compat1
+#define PL_numeric_compat1	(*Perl_Inumeric_compat1_ptr(aTHX))
+#undef  PL_numeric_local
+#define PL_numeric_local	(*Perl_Inumeric_local_ptr(aTHX))
+#undef  PL_numeric_name
+#define PL_numeric_name		(*Perl_Inumeric_name_ptr(aTHX))
+#undef  PL_numeric_radix_sv
+#define PL_numeric_radix_sv	(*Perl_Inumeric_radix_sv_ptr(aTHX))
+#undef  PL_numeric_standard
+#define PL_numeric_standard	(*Perl_Inumeric_standard_ptr(aTHX))
+#undef  PL_ofmt
+#define PL_ofmt			(*Perl_Iofmt_ptr(aTHX))
+#undef  PL_oldbufptr
+#define PL_oldbufptr		(*Perl_Ioldbufptr_ptr(aTHX))
+#undef  PL_oldname
+#define PL_oldname		(*Perl_Ioldname_ptr(aTHX))
+#undef  PL_oldoldbufptr
+#define PL_oldoldbufptr		(*Perl_Ioldoldbufptr_ptr(aTHX))
+#undef  PL_op_mask
+#define PL_op_mask		(*Perl_Iop_mask_ptr(aTHX))
+#undef  PL_op_seqmax
+#define PL_op_seqmax		(*Perl_Iop_seqmax_ptr(aTHX))
+#undef  PL_origalen
+#define PL_origalen		(*Perl_Iorigalen_ptr(aTHX))
+#undef  PL_origargc
+#define PL_origargc		(*Perl_Iorigargc_ptr(aTHX))
+#undef  PL_origargv
+#define PL_origargv		(*Perl_Iorigargv_ptr(aTHX))
+#undef  PL_origenviron
+#define PL_origenviron		(*Perl_Iorigenviron_ptr(aTHX))
+#undef  PL_origfilename
+#define PL_origfilename		(*Perl_Iorigfilename_ptr(aTHX))
+#undef  PL_ors_sv
+#define PL_ors_sv		(*Perl_Iors_sv_ptr(aTHX))
+#undef  PL_osname
+#define PL_osname		(*Perl_Iosname_ptr(aTHX))
+#undef  PL_pad_reset_pending
+#define PL_pad_reset_pending	(*Perl_Ipad_reset_pending_ptr(aTHX))
+#undef  PL_padix
+#define PL_padix		(*Perl_Ipadix_ptr(aTHX))
+#undef  PL_padix_floor
+#define PL_padix_floor		(*Perl_Ipadix_floor_ptr(aTHX))
+#undef  PL_patchlevel
+#define PL_patchlevel		(*Perl_Ipatchlevel_ptr(aTHX))
+#undef  PL_pending_ident
+#define PL_pending_ident	(*Perl_Ipending_ident_ptr(aTHX))
+#undef  PL_perl_destruct_level
+#define PL_perl_destruct_level	(*Perl_Iperl_destruct_level_ptr(aTHX))
+#undef  PL_perldb
+#define PL_perldb		(*Perl_Iperldb_ptr(aTHX))
+#undef  PL_perlio
+#define PL_perlio		(*Perl_Iperlio_ptr(aTHX))
+#undef  PL_pidstatus
+#define PL_pidstatus		(*Perl_Ipidstatus_ptr(aTHX))
+#undef  PL_ppid
+#define PL_ppid			(*Perl_Ippid_ptr(aTHX))
+#undef  PL_preambleav
+#define PL_preambleav		(*Perl_Ipreambleav_ptr(aTHX))
+#undef  PL_preambled
+#define PL_preambled		(*Perl_Ipreambled_ptr(aTHX))
+#undef  PL_preprocess
+#define PL_preprocess		(*Perl_Ipreprocess_ptr(aTHX))
+#undef  PL_profiledata
+#define PL_profiledata		(*Perl_Iprofiledata_ptr(aTHX))
+#undef  PL_psig_name
+#define PL_psig_name		(*Perl_Ipsig_name_ptr(aTHX))
+#undef  PL_psig_pend
+#define PL_psig_pend		(*Perl_Ipsig_pend_ptr(aTHX))
+#undef  PL_psig_ptr
+#define PL_psig_ptr		(*Perl_Ipsig_ptr_ptr(aTHX))
+#undef  PL_pte_arenaroot
+#define PL_pte_arenaroot	(*Perl_Ipte_arenaroot_ptr(aTHX))
+#undef  PL_pte_root
+#define PL_pte_root		(*Perl_Ipte_root_ptr(aTHX))
+#undef  PL_ptr_table
+#define PL_ptr_table		(*Perl_Iptr_table_ptr(aTHX))
+#undef  PL_reentrant_buffer
+#define PL_reentrant_buffer	(*Perl_Ireentrant_buffer_ptr(aTHX))
+#undef  PL_reentrant_retint
+#define PL_reentrant_retint	(*Perl_Ireentrant_retint_ptr(aTHX))
+#undef  PL_regex_pad
+#define PL_regex_pad		(*Perl_Iregex_pad_ptr(aTHX))
+#undef  PL_regex_padav
+#define PL_regex_padav		(*Perl_Iregex_padav_ptr(aTHX))
+#undef  PL_rehash_seed
+#define PL_rehash_seed		(*Perl_Irehash_seed_ptr(aTHX))
+#undef  PL_rehash_seed_set
+#define PL_rehash_seed_set	(*Perl_Irehash_seed_set_ptr(aTHX))
+#undef  PL_replgv
+#define PL_replgv		(*Perl_Ireplgv_ptr(aTHX))
+#undef  PL_rsfp
+#define PL_rsfp			(*Perl_Irsfp_ptr(aTHX))
+#undef  PL_rsfp_filters
+#define PL_rsfp_filters		(*Perl_Irsfp_filters_ptr(aTHX))
+#undef  PL_runops
+#define PL_runops		(*Perl_Irunops_ptr(aTHX))
+#undef  PL_runops_dbg
+#define PL_runops_dbg		(*Perl_Irunops_dbg_ptr(aTHX))
+#undef  PL_runops_std
+#define PL_runops_std		(*Perl_Irunops_std_ptr(aTHX))
+#undef  PL_savebegin
+#define PL_savebegin		(*Perl_Isavebegin_ptr(aTHX))
+#undef  PL_sawampersand
+#define PL_sawampersand		(*Perl_Isawampersand_ptr(aTHX))
+#undef  PL_sh_path_compat
+#define PL_sh_path_compat	(*Perl_Ish_path_compat_ptr(aTHX))
+#undef  PL_sharehook
+#define PL_sharehook		(*Perl_Isharehook_ptr(aTHX))
+#undef  PL_sig_pending
+#define PL_sig_pending		(*Perl_Isig_pending_ptr(aTHX))
+#undef  PL_sighandlerp
+#define PL_sighandlerp		(*Perl_Isighandlerp_ptr(aTHX))
+#undef  PL_signals
+#define PL_signals		(*Perl_Isignals_ptr(aTHX))
+#undef  PL_sort_RealCmp
+#define PL_sort_RealCmp		(*Perl_Isort_RealCmp_ptr(aTHX))
+#undef  PL_splitstr
+#define PL_splitstr		(*Perl_Isplitstr_ptr(aTHX))
+#undef  PL_srand_called
+#define PL_srand_called		(*Perl_Isrand_called_ptr(aTHX))
+#undef  PL_stashcache
+#define PL_stashcache		(*Perl_Istashcache_ptr(aTHX))
+#undef  PL_statusvalue
+#define PL_statusvalue		(*Perl_Istatusvalue_ptr(aTHX))
+#undef  PL_statusvalue_vms
+#define PL_statusvalue_vms	(*Perl_Istatusvalue_vms_ptr(aTHX))
+#undef  PL_stderrgv
+#define PL_stderrgv		(*Perl_Istderrgv_ptr(aTHX))
+#undef  PL_stdingv
+#define PL_stdingv		(*Perl_Istdingv_ptr(aTHX))
+#undef  PL_strtab
+#define PL_strtab		(*Perl_Istrtab_ptr(aTHX))
+#undef  PL_strtab_mutex
+#define PL_strtab_mutex		(*Perl_Istrtab_mutex_ptr(aTHX))
+#undef  PL_sub_generation
+#define PL_sub_generation	(*Perl_Isub_generation_ptr(aTHX))
+#undef  PL_sublex_info
+#define PL_sublex_info		(*Perl_Isublex_info_ptr(aTHX))
+#undef  PL_subline
+#define PL_subline		(*Perl_Isubline_ptr(aTHX))
+#undef  PL_subname
+#define PL_subname		(*Perl_Isubname_ptr(aTHX))
+#undef  PL_suidscript
+#define PL_suidscript		(*Perl_Isuidscript_ptr(aTHX))
+#undef  PL_sv_arenaroot
+#define PL_sv_arenaroot		(*Perl_Isv_arenaroot_ptr(aTHX))
+#undef  PL_sv_count
+#define PL_sv_count		(*Perl_Isv_count_ptr(aTHX))
+#undef  PL_sv_lock_mutex
+#define PL_sv_lock_mutex	(*Perl_Isv_lock_mutex_ptr(aTHX))
+#undef  PL_sv_mutex
+#define PL_sv_mutex		(*Perl_Isv_mutex_ptr(aTHX))
+#undef  PL_sv_no
+#define PL_sv_no		(*Perl_Isv_no_ptr(aTHX))
+#undef  PL_sv_objcount
+#define PL_sv_objcount		(*Perl_Isv_objcount_ptr(aTHX))
+#undef  PL_sv_root
+#define PL_sv_root		(*Perl_Isv_root_ptr(aTHX))
+#undef  PL_sv_undef
+#define PL_sv_undef		(*Perl_Isv_undef_ptr(aTHX))
+#undef  PL_sv_yes
+#define PL_sv_yes		(*Perl_Isv_yes_ptr(aTHX))
+#undef  PL_svref_mutex
+#define PL_svref_mutex		(*Perl_Isvref_mutex_ptr(aTHX))
+#undef  PL_sys_intern
+#define PL_sys_intern		(*Perl_Isys_intern_ptr(aTHX))
+#undef  PL_taint_warn
+#define PL_taint_warn		(*Perl_Itaint_warn_ptr(aTHX))
+#undef  PL_tainting
+#define PL_tainting		(*Perl_Itainting_ptr(aTHX))
+#undef  PL_threadhook
+#define PL_threadhook		(*Perl_Ithreadhook_ptr(aTHX))
+#undef  PL_threadnum
+#define PL_threadnum		(*Perl_Ithreadnum_ptr(aTHX))
+#undef  PL_threads_mutex
+#define PL_threads_mutex	(*Perl_Ithreads_mutex_ptr(aTHX))
+#undef  PL_threadsv_names
+#define PL_threadsv_names	(*Perl_Ithreadsv_names_ptr(aTHX))
+#undef  PL_thrsv
+#define PL_thrsv		(*Perl_Ithrsv_ptr(aTHX))
+#undef  PL_tokenbuf
+#define PL_tokenbuf		(*Perl_Itokenbuf_ptr(aTHX))
+#undef  PL_uid
+#define PL_uid			(*Perl_Iuid_ptr(aTHX))
+#undef  PL_unicode
+#define PL_unicode		(*Perl_Iunicode_ptr(aTHX))
+#undef  PL_unlockhook
+#define PL_unlockhook		(*Perl_Iunlockhook_ptr(aTHX))
+#undef  PL_unsafe
+#define PL_unsafe		(*Perl_Iunsafe_ptr(aTHX))
+#undef  PL_utf8_alnum
+#define PL_utf8_alnum		(*Perl_Iutf8_alnum_ptr(aTHX))
+#undef  PL_utf8_alnumc
+#define PL_utf8_alnumc		(*Perl_Iutf8_alnumc_ptr(aTHX))
+#undef  PL_utf8_alpha
+#define PL_utf8_alpha		(*Perl_Iutf8_alpha_ptr(aTHX))
+#undef  PL_utf8_ascii
+#define PL_utf8_ascii		(*Perl_Iutf8_ascii_ptr(aTHX))
+#undef  PL_utf8_cntrl
+#define PL_utf8_cntrl		(*Perl_Iutf8_cntrl_ptr(aTHX))
+#undef  PL_utf8_digit
+#define PL_utf8_digit		(*Perl_Iutf8_digit_ptr(aTHX))
+#undef  PL_utf8_graph
+#define PL_utf8_graph		(*Perl_Iutf8_graph_ptr(aTHX))
+#undef  PL_utf8_idcont
+#define PL_utf8_idcont		(*Perl_Iutf8_idcont_ptr(aTHX))
+#undef  PL_utf8_idstart
+#define PL_utf8_idstart		(*Perl_Iutf8_idstart_ptr(aTHX))
+#undef  PL_utf8_lower
+#define PL_utf8_lower		(*Perl_Iutf8_lower_ptr(aTHX))
+#undef  PL_utf8_mark
+#define PL_utf8_mark		(*Perl_Iutf8_mark_ptr(aTHX))
+#undef  PL_utf8_print
+#define PL_utf8_print		(*Perl_Iutf8_print_ptr(aTHX))
+#undef  PL_utf8_punct
+#define PL_utf8_punct		(*Perl_Iutf8_punct_ptr(aTHX))
+#undef  PL_utf8_space
+#define PL_utf8_space		(*Perl_Iutf8_space_ptr(aTHX))
+#undef  PL_utf8_tofold
+#define PL_utf8_tofold		(*Perl_Iutf8_tofold_ptr(aTHX))
+#undef  PL_utf8_tolower
+#define PL_utf8_tolower		(*Perl_Iutf8_tolower_ptr(aTHX))
+#undef  PL_utf8_totitle
+#define PL_utf8_totitle		(*Perl_Iutf8_totitle_ptr(aTHX))
+#undef  PL_utf8_toupper
+#define PL_utf8_toupper		(*Perl_Iutf8_toupper_ptr(aTHX))
+#undef  PL_utf8_upper
+#define PL_utf8_upper		(*Perl_Iutf8_upper_ptr(aTHX))
+#undef  PL_utf8_xdigit
+#define PL_utf8_xdigit		(*Perl_Iutf8_xdigit_ptr(aTHX))
+#undef  PL_utf8locale
+#define PL_utf8locale		(*Perl_Iutf8locale_ptr(aTHX))
+#undef  PL_uudmap
+#define PL_uudmap		(*Perl_Iuudmap_ptr(aTHX))
+#undef  PL_warnhook
+#define PL_warnhook		(*Perl_Iwarnhook_ptr(aTHX))
+#undef  PL_widesyscalls
+#define PL_widesyscalls		(*Perl_Iwidesyscalls_ptr(aTHX))
+#undef  PL_xiv_arenaroot
+#define PL_xiv_arenaroot	(*Perl_Ixiv_arenaroot_ptr(aTHX))
+#undef  PL_xiv_root
+#define PL_xiv_root		(*Perl_Ixiv_root_ptr(aTHX))
+#undef  PL_xnv_arenaroot
+#define PL_xnv_arenaroot	(*Perl_Ixnv_arenaroot_ptr(aTHX))
+#undef  PL_xnv_root
+#define PL_xnv_root		(*Perl_Ixnv_root_ptr(aTHX))
+#undef  PL_xpv_arenaroot
+#define PL_xpv_arenaroot	(*Perl_Ixpv_arenaroot_ptr(aTHX))
+#undef  PL_xpv_root
+#define PL_xpv_root		(*Perl_Ixpv_root_ptr(aTHX))
+#undef  PL_xpvav_arenaroot
+#define PL_xpvav_arenaroot	(*Perl_Ixpvav_arenaroot_ptr(aTHX))
+#undef  PL_xpvav_root
+#define PL_xpvav_root		(*Perl_Ixpvav_root_ptr(aTHX))
+#undef  PL_xpvbm_arenaroot
+#define PL_xpvbm_arenaroot	(*Perl_Ixpvbm_arenaroot_ptr(aTHX))
+#undef  PL_xpvbm_root
+#define PL_xpvbm_root		(*Perl_Ixpvbm_root_ptr(aTHX))
+#undef  PL_xpvcv_arenaroot
+#define PL_xpvcv_arenaroot	(*Perl_Ixpvcv_arenaroot_ptr(aTHX))
+#undef  PL_xpvcv_root
+#define PL_xpvcv_root		(*Perl_Ixpvcv_root_ptr(aTHX))
+#undef  PL_xpvhv_arenaroot
+#define PL_xpvhv_arenaroot	(*Perl_Ixpvhv_arenaroot_ptr(aTHX))
+#undef  PL_xpvhv_root
+#define PL_xpvhv_root		(*Perl_Ixpvhv_root_ptr(aTHX))
+#undef  PL_xpviv_arenaroot
+#define PL_xpviv_arenaroot	(*Perl_Ixpviv_arenaroot_ptr(aTHX))
+#undef  PL_xpviv_root
+#define PL_xpviv_root		(*Perl_Ixpviv_root_ptr(aTHX))
+#undef  PL_xpvlv_arenaroot
+#define PL_xpvlv_arenaroot	(*Perl_Ixpvlv_arenaroot_ptr(aTHX))
+#undef  PL_xpvlv_root
+#define PL_xpvlv_root		(*Perl_Ixpvlv_root_ptr(aTHX))
+#undef  PL_xpvmg_arenaroot
+#define PL_xpvmg_arenaroot	(*Perl_Ixpvmg_arenaroot_ptr(aTHX))
+#undef  PL_xpvmg_root
+#define PL_xpvmg_root		(*Perl_Ixpvmg_root_ptr(aTHX))
+#undef  PL_xpvnv_arenaroot
+#define PL_xpvnv_arenaroot	(*Perl_Ixpvnv_arenaroot_ptr(aTHX))
+#undef  PL_xpvnv_root
+#define PL_xpvnv_root		(*Perl_Ixpvnv_root_ptr(aTHX))
+#undef  PL_xrv_arenaroot
+#define PL_xrv_arenaroot	(*Perl_Ixrv_arenaroot_ptr(aTHX))
+#undef  PL_xrv_root
+#define PL_xrv_root		(*Perl_Ixrv_root_ptr(aTHX))
+#undef  PL_yychar
+#define PL_yychar		(*Perl_Iyychar_ptr(aTHX))
+#undef  PL_yydebug
+#define PL_yydebug		(*Perl_Iyydebug_ptr(aTHX))
+#undef  PL_yyerrflag
+#define PL_yyerrflag		(*Perl_Iyyerrflag_ptr(aTHX))
+#undef  PL_yylval
+#define PL_yylval		(*Perl_Iyylval_ptr(aTHX))
+#undef  PL_yynerrs
+#define PL_yynerrs		(*Perl_Iyynerrs_ptr(aTHX))
+#undef  PL_yyval
+#define PL_yyval		(*Perl_Iyyval_ptr(aTHX))
+#undef  PL_Sv
+#define PL_Sv			(*Perl_TSv_ptr(aTHX))
+#undef  PL_Xpv
+#define PL_Xpv			(*Perl_TXpv_ptr(aTHX))
+#undef  PL_av_fetch_sv
+#define PL_av_fetch_sv		(*Perl_Tav_fetch_sv_ptr(aTHX))
+#undef  PL_bodytarget
+#define PL_bodytarget		(*Perl_Tbodytarget_ptr(aTHX))
+#undef  PL_bostr
+#define PL_bostr		(*Perl_Tbostr_ptr(aTHX))
+#undef  PL_chopset
+#define PL_chopset		(*Perl_Tchopset_ptr(aTHX))
+#undef  PL_colors
+#define PL_colors		(*Perl_Tcolors_ptr(aTHX))
+#undef  PL_colorset
+#define PL_colorset		(*Perl_Tcolorset_ptr(aTHX))
+#undef  PL_comppad
+#define PL_comppad		(*Perl_Tcomppad_ptr(aTHX))
+#undef  PL_curcop
+#define PL_curcop		(*Perl_Tcurcop_ptr(aTHX))
+#undef  PL_curpad
+#define PL_curpad		(*Perl_Tcurpad_ptr(aTHX))
+#undef  PL_curpm
+#define PL_curpm		(*Perl_Tcurpm_ptr(aTHX))
+#undef  PL_curstack
+#define PL_curstack		(*Perl_Tcurstack_ptr(aTHX))
+#undef  PL_curstackinfo
+#define PL_curstackinfo		(*Perl_Tcurstackinfo_ptr(aTHX))
+#undef  PL_curstash
+#define PL_curstash		(*Perl_Tcurstash_ptr(aTHX))
+#undef  PL_defoutgv
+#define PL_defoutgv		(*Perl_Tdefoutgv_ptr(aTHX))
+#undef  PL_defstash
+#define PL_defstash		(*Perl_Tdefstash_ptr(aTHX))
+#undef  PL_delaymagic
+#define PL_delaymagic		(*Perl_Tdelaymagic_ptr(aTHX))
+#undef  PL_dirty
+#define PL_dirty		(*Perl_Tdirty_ptr(aTHX))
+#undef  PL_dumpindent
+#define PL_dumpindent		(*Perl_Tdumpindent_ptr(aTHX))
+#undef  PL_efloatbuf
+#define PL_efloatbuf		(*Perl_Tefloatbuf_ptr(aTHX))
+#undef  PL_efloatsize
+#define PL_efloatsize		(*Perl_Tefloatsize_ptr(aTHX))
+#undef  PL_errors
+#define PL_errors		(*Perl_Terrors_ptr(aTHX))
+#undef  PL_extralen
+#define PL_extralen		(*Perl_Textralen_ptr(aTHX))
+#undef  PL_firstgv
+#define PL_firstgv		(*Perl_Tfirstgv_ptr(aTHX))
+#undef  PL_formtarget
+#define PL_formtarget		(*Perl_Tformtarget_ptr(aTHX))
+#undef  PL_hv_fetch_ent_mh
+#define PL_hv_fetch_ent_mh	(*Perl_Thv_fetch_ent_mh_ptr(aTHX))
+#undef  PL_hv_fetch_sv
+#define PL_hv_fetch_sv		(*Perl_Thv_fetch_sv_ptr(aTHX))
+#undef  PL_in_eval
+#define PL_in_eval		(*Perl_Tin_eval_ptr(aTHX))
+#undef  PL_last_in_gv
+#define PL_last_in_gv		(*Perl_Tlast_in_gv_ptr(aTHX))
+#undef  PL_lastgotoprobe
+#define PL_lastgotoprobe	(*Perl_Tlastgotoprobe_ptr(aTHX))
+#undef  PL_lastscream
+#define PL_lastscream		(*Perl_Tlastscream_ptr(aTHX))
+#undef  PL_localizing
+#define PL_localizing		(*Perl_Tlocalizing_ptr(aTHX))
+#undef  PL_mainstack
+#define PL_mainstack		(*Perl_Tmainstack_ptr(aTHX))
+#undef  PL_markstack
+#define PL_markstack		(*Perl_Tmarkstack_ptr(aTHX))
+#undef  PL_markstack_max
+#define PL_markstack_max	(*Perl_Tmarkstack_max_ptr(aTHX))
+#undef  PL_markstack_ptr
+#define PL_markstack_ptr	(*Perl_Tmarkstack_ptr_ptr(aTHX))
+#undef  PL_maxscream
+#define PL_maxscream		(*Perl_Tmaxscream_ptr(aTHX))
+#undef  PL_modcount
+#define PL_modcount		(*Perl_Tmodcount_ptr(aTHX))
+#undef  PL_na
+#define PL_na			(*Perl_Tna_ptr(aTHX))
+#undef  PL_nrs
+#define PL_nrs			(*Perl_Tnrs_ptr(aTHX))
+#undef  PL_ofs_sv
+#define PL_ofs_sv		(*Perl_Tofs_sv_ptr(aTHX))
+#undef  PL_op
+#define PL_op			(*Perl_Top_ptr(aTHX))
+#undef  PL_opsave
+#define PL_opsave		(*Perl_Topsave_ptr(aTHX))
+#undef  PL_peepp
+#define PL_peepp		(*Perl_Tpeepp_ptr(aTHX))
+#undef  PL_protect
+#define PL_protect		(*Perl_Tprotect_ptr(aTHX))
+#undef  PL_reg_call_cc
+#define PL_reg_call_cc		(*Perl_Treg_call_cc_ptr(aTHX))
+#undef  PL_reg_curpm
+#define PL_reg_curpm		(*Perl_Treg_curpm_ptr(aTHX))
+#undef  PL_reg_eval_set
+#define PL_reg_eval_set		(*Perl_Treg_eval_set_ptr(aTHX))
+#undef  PL_reg_flags
+#define PL_reg_flags		(*Perl_Treg_flags_ptr(aTHX))
+#undef  PL_reg_ganch
+#define PL_reg_ganch		(*Perl_Treg_ganch_ptr(aTHX))
+#undef  PL_reg_leftiter
+#define PL_reg_leftiter		(*Perl_Treg_leftiter_ptr(aTHX))
+#undef  PL_reg_magic
+#define PL_reg_magic		(*Perl_Treg_magic_ptr(aTHX))
+#undef  PL_reg_match_utf8
+#define PL_reg_match_utf8	(*Perl_Treg_match_utf8_ptr(aTHX))
+#undef  PL_reg_maxiter
+#define PL_reg_maxiter		(*Perl_Treg_maxiter_ptr(aTHX))
+#undef  PL_reg_oldcurpm
+#define PL_reg_oldcurpm		(*Perl_Treg_oldcurpm_ptr(aTHX))
+#undef  PL_reg_oldpos
+#define PL_reg_oldpos		(*Perl_Treg_oldpos_ptr(aTHX))
+#undef  PL_reg_oldsaved
+#define PL_reg_oldsaved		(*Perl_Treg_oldsaved_ptr(aTHX))
+#undef  PL_reg_oldsavedlen
+#define PL_reg_oldsavedlen	(*Perl_Treg_oldsavedlen_ptr(aTHX))
+#undef  PL_reg_poscache
+#define PL_reg_poscache		(*Perl_Treg_poscache_ptr(aTHX))
+#undef  PL_reg_poscache_size
+#define PL_reg_poscache_size	(*Perl_Treg_poscache_size_ptr(aTHX))
+#undef  PL_reg_re
+#define PL_reg_re		(*Perl_Treg_re_ptr(aTHX))
+#undef  PL_reg_start_tmp
+#define PL_reg_start_tmp	(*Perl_Treg_start_tmp_ptr(aTHX))
+#undef  PL_reg_start_tmpl
+#define PL_reg_start_tmpl	(*Perl_Treg_start_tmpl_ptr(aTHX))
+#undef  PL_reg_starttry
+#define PL_reg_starttry		(*Perl_Treg_starttry_ptr(aTHX))
+#undef  PL_reg_sv
+#define PL_reg_sv		(*Perl_Treg_sv_ptr(aTHX))
+#undef  PL_reg_whilem_seen
+#define PL_reg_whilem_seen	(*Perl_Treg_whilem_seen_ptr(aTHX))
+#undef  PL_regbol
+#define PL_regbol		(*Perl_Tregbol_ptr(aTHX))
+#undef  PL_regcc
+#define PL_regcc		(*Perl_Tregcc_ptr(aTHX))
+#undef  PL_regcode
+#define PL_regcode		(*Perl_Tregcode_ptr(aTHX))
+#undef  PL_regcomp_parse
+#define PL_regcomp_parse	(*Perl_Tregcomp_parse_ptr(aTHX))
+#undef  PL_regcomp_rx
+#define PL_regcomp_rx		(*Perl_Tregcomp_rx_ptr(aTHX))
+#undef  PL_regcompat1
+#define PL_regcompat1		(*Perl_Tregcompat1_ptr(aTHX))
+#undef  PL_regcompp
+#define PL_regcompp		(*Perl_Tregcompp_ptr(aTHX))
+#undef  PL_regdata
+#define PL_regdata		(*Perl_Tregdata_ptr(aTHX))
+#undef  PL_regdummy
+#define PL_regdummy		(*Perl_Tregdummy_ptr(aTHX))
+#undef  PL_regendp
+#define PL_regendp		(*Perl_Tregendp_ptr(aTHX))
+#undef  PL_regeol
+#define PL_regeol		(*Perl_Tregeol_ptr(aTHX))
+#undef  PL_regexecp
+#define PL_regexecp		(*Perl_Tregexecp_ptr(aTHX))
+#undef  PL_regflags
+#define PL_regflags		(*Perl_Tregflags_ptr(aTHX))
+#undef  PL_regfree
+#define PL_regfree		(*Perl_Tregfree_ptr(aTHX))
+#undef  PL_regindent
+#define PL_regindent		(*Perl_Tregindent_ptr(aTHX))
+#undef  PL_reginput
+#define PL_reginput		(*Perl_Treginput_ptr(aTHX))
+#undef  PL_regint_start
+#define PL_regint_start		(*Perl_Tregint_start_ptr(aTHX))
+#undef  PL_regint_string
+#define PL_regint_string	(*Perl_Tregint_string_ptr(aTHX))
+#undef  PL_reginterp_cnt
+#define PL_reginterp_cnt	(*Perl_Treginterp_cnt_ptr(aTHX))
+#undef  PL_reglastcloseparen
+#define PL_reglastcloseparen	(*Perl_Treglastcloseparen_ptr(aTHX))
+#undef  PL_reglastparen
+#define PL_reglastparen		(*Perl_Treglastparen_ptr(aTHX))
+#undef  PL_regnarrate
+#define PL_regnarrate		(*Perl_Tregnarrate_ptr(aTHX))
+#undef  PL_regnaughty
+#define PL_regnaughty		(*Perl_Tregnaughty_ptr(aTHX))
+#undef  PL_regnpar
+#define PL_regnpar		(*Perl_Tregnpar_ptr(aTHX))
+#undef  PL_regprecomp
+#define PL_regprecomp		(*Perl_Tregprecomp_ptr(aTHX))
+#undef  PL_regprogram
+#define PL_regprogram		(*Perl_Tregprogram_ptr(aTHX))
+#undef  PL_regsawback
+#define PL_regsawback		(*Perl_Tregsawback_ptr(aTHX))
+#undef  PL_regseen
+#define PL_regseen		(*Perl_Tregseen_ptr(aTHX))
+#undef  PL_regsize
+#define PL_regsize		(*Perl_Tregsize_ptr(aTHX))
+#undef  PL_regstartp
+#define PL_regstartp		(*Perl_Tregstartp_ptr(aTHX))
+#undef  PL_regtill
+#define PL_regtill		(*Perl_Tregtill_ptr(aTHX))
+#undef  PL_regxend
+#define PL_regxend		(*Perl_Tregxend_ptr(aTHX))
+#undef  PL_restartop
+#define PL_restartop		(*Perl_Trestartop_ptr(aTHX))
+#undef  PL_retstack
+#define PL_retstack		(*Perl_Tretstack_ptr(aTHX))
+#undef  PL_retstack_ix
+#define PL_retstack_ix		(*Perl_Tretstack_ix_ptr(aTHX))
+#undef  PL_retstack_max
+#define PL_retstack_max		(*Perl_Tretstack_max_ptr(aTHX))
+#undef  PL_rs
+#define PL_rs			(*Perl_Trs_ptr(aTHX))
+#undef  PL_savestack
+#define PL_savestack		(*Perl_Tsavestack_ptr(aTHX))
+#undef  PL_savestack_ix
+#define PL_savestack_ix		(*Perl_Tsavestack_ix_ptr(aTHX))
+#undef  PL_savestack_max
+#define PL_savestack_max	(*Perl_Tsavestack_max_ptr(aTHX))
+#undef  PL_scopestack
+#define PL_scopestack		(*Perl_Tscopestack_ptr(aTHX))
+#undef  PL_scopestack_ix
+#define PL_scopestack_ix	(*Perl_Tscopestack_ix_ptr(aTHX))
+#undef  PL_scopestack_max
+#define PL_scopestack_max	(*Perl_Tscopestack_max_ptr(aTHX))
+#undef  PL_screamfirst
+#define PL_screamfirst		(*Perl_Tscreamfirst_ptr(aTHX))
+#undef  PL_screamnext
+#define PL_screamnext		(*Perl_Tscreamnext_ptr(aTHX))
+#undef  PL_secondgv
+#define PL_secondgv		(*Perl_Tsecondgv_ptr(aTHX))
+#undef  PL_seen_evals
+#define PL_seen_evals		(*Perl_Tseen_evals_ptr(aTHX))
+#undef  PL_seen_zerolen
+#define PL_seen_zerolen		(*Perl_Tseen_zerolen_ptr(aTHX))
+#undef  PL_sortcop
+#define PL_sortcop		(*Perl_Tsortcop_ptr(aTHX))
+#undef  PL_sortcxix
+#define PL_sortcxix		(*Perl_Tsortcxix_ptr(aTHX))
+#undef  PL_sortstash
+#define PL_sortstash		(*Perl_Tsortstash_ptr(aTHX))
+#undef  PL_stack_base
+#define PL_stack_base		(*Perl_Tstack_base_ptr(aTHX))
+#undef  PL_stack_max
+#define PL_stack_max		(*Perl_Tstack_max_ptr(aTHX))
+#undef  PL_stack_sp
+#define PL_stack_sp		(*Perl_Tstack_sp_ptr(aTHX))
+#undef  PL_start_env
+#define PL_start_env		(*Perl_Tstart_env_ptr(aTHX))
+#undef  PL_statbuf
+#define PL_statbuf		(*Perl_Tstatbuf_ptr(aTHX))
+#undef  PL_statcache
+#define PL_statcache		(*Perl_Tstatcache_ptr(aTHX))
+#undef  PL_statgv
+#define PL_statgv		(*Perl_Tstatgv_ptr(aTHX))
+#undef  PL_statname
+#define PL_statname		(*Perl_Tstatname_ptr(aTHX))
+#undef  PL_tainted
+#define PL_tainted		(*Perl_Ttainted_ptr(aTHX))
+#undef  PL_timesbuf
+#define PL_timesbuf		(*Perl_Ttimesbuf_ptr(aTHX))
+#undef  PL_tmps_floor
+#define PL_tmps_floor		(*Perl_Ttmps_floor_ptr(aTHX))
+#undef  PL_tmps_ix
+#define PL_tmps_ix		(*Perl_Ttmps_ix_ptr(aTHX))
+#undef  PL_tmps_max
+#define PL_tmps_max		(*Perl_Ttmps_max_ptr(aTHX))
+#undef  PL_tmps_stack
+#define PL_tmps_stack		(*Perl_Ttmps_stack_ptr(aTHX))
+#undef  PL_top_env
+#define PL_top_env		(*Perl_Ttop_env_ptr(aTHX))
+#undef  PL_toptarget
+#define PL_toptarget		(*Perl_Ttoptarget_ptr(aTHX))
+#undef  PL_watchaddr
+#define PL_watchaddr		(*Perl_Twatchaddr_ptr(aTHX))
+#undef  PL_watchok
+#define PL_watchok		(*Perl_Twatchok_ptr(aTHX))
+#undef  PL_No
+#define PL_No			(*Perl_GNo_ptr(NULL))
+#undef  PL_Yes
+#define PL_Yes			(*Perl_GYes_ptr(NULL))
+#undef  PL_csighandlerp
+#define PL_csighandlerp		(*Perl_Gcsighandlerp_ptr(NULL))
+#undef  PL_curinterp
+#define PL_curinterp		(*Perl_Gcurinterp_ptr(NULL))
+#undef  PL_do_undump
+#define PL_do_undump		(*Perl_Gdo_undump_ptr(NULL))
+#undef  PL_dollarzero_mutex
+#define PL_dollarzero_mutex	(*Perl_Gdollarzero_mutex_ptr(NULL))
+#undef  PL_hexdigit
+#define PL_hexdigit		(*Perl_Ghexdigit_ptr(NULL))
+#undef  PL_malloc_mutex
+#define PL_malloc_mutex		(*Perl_Gmalloc_mutex_ptr(NULL))
+#undef  PL_op_mutex
+#define PL_op_mutex		(*Perl_Gop_mutex_ptr(NULL))
+#undef  PL_patleave
+#define PL_patleave		(*Perl_Gpatleave_ptr(NULL))
+#undef  PL_sh_path
+#define PL_sh_path		(*Perl_Gsh_path_ptr(NULL))
+#undef  PL_sigfpe_saved
+#define PL_sigfpe_saved		(*Perl_Gsigfpe_saved_ptr(NULL))
+#undef  PL_sv_placeholder
+#define PL_sv_placeholder	(*Perl_Gsv_placeholder_ptr(NULL))
+#undef  PL_thr_key
+#define PL_thr_key		(*Perl_Gthr_key_ptr(NULL))
+#undef  PL_use_safe_putenv
+#define PL_use_safe_putenv	(*Perl_Guse_safe_putenv_ptr(NULL))
+
+#endif /* !PERL_CORE */
+#endif /* MULTIPLICITY */
+
+#endif /* __perlapi_h__ */
+
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/perlhost.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/perlhost.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/perlhost.h	(revision 14489)
@@ -0,0 +1,2428 @@
+/* perlhost.h
+ *
+ * (c) 1999 Microsoft Corporation. All rights reserved.
+ * Portions (c) 1999 ActiveState Tool Corp, http://www.ActiveState.com/
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ */
+
+#define CHECK_HOST_INTERP
+
+#ifndef ___PerlHost_H___
+#define ___PerlHost_H___
+
+#include <signal.h>
+#include "iperlsys.h"
+#include "vmem.h"
+#include "vdir.h"
+
+START_EXTERN_C
+extern char *		g_win32_get_privlib(const char *pl);
+extern char *		g_win32_get_sitelib(const char *pl);
+extern char *		g_win32_get_vendorlib(const char *pl);
+extern char *		g_getlogin(void);
+END_EXTERN_C
+
+class CPerlHost
+{
+public:
+    /* Constructors */
+    CPerlHost(void);
+    CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
+		 struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
+		 struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
+		 struct IPerlDir** ppDir, struct IPerlSock** ppSock,
+		 struct IPerlProc** ppProc);
+    CPerlHost(CPerlHost& host);
+    ~CPerlHost(void);
+
+    static CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl);
+    static CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl);
+    static CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl);
+    static CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl);
+    static CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl);
+    static CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl);
+    static CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl);
+    static CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl);
+    static CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl);
+
+    BOOL PerlCreate(void);
+    int PerlParse(int argc, char** argv, char** env);
+    int PerlRun(void);
+    void PerlDestroy(void);
+
+/* IPerlMem */
+    /* Locks provided but should be unnecessary as this is private pool */
+    inline void* Malloc(size_t size) { return m_pVMem->Malloc(size); };
+    inline void* Realloc(void* ptr, size_t size) { return m_pVMem->Realloc(ptr, size); };
+    inline void Free(void* ptr) { m_pVMem->Free(ptr); };
+    inline void* Calloc(size_t num, size_t size)
+    {
+	size_t count = num*size;
+	void* lpVoid = Malloc(count);
+	if (lpVoid)
+	    ZeroMemory(lpVoid, count);
+	return lpVoid;
+    };
+    inline void GetLock(void) { m_pVMem->GetLock(); };
+    inline void FreeLock(void) { m_pVMem->FreeLock(); };
+    inline int IsLocked(void) { return m_pVMem->IsLocked(); };
+
+/* IPerlMemShared */
+    /* Locks used to serialize access to the pool */
+    inline void GetLockShared(void) { m_pVMemShared->GetLock(); };
+    inline void FreeLockShared(void) { m_pVMemShared->FreeLock(); };
+    inline int IsLockedShared(void) { return m_pVMemShared->IsLocked(); };
+    inline void* MallocShared(size_t size)
+    {
+	void *result;
+	GetLockShared();
+	result = m_pVMemShared->Malloc(size);
+	FreeLockShared();
+	return result;
+    };
+    inline void* ReallocShared(void* ptr, size_t size)
+    {
+	void *result;
+	GetLockShared();
+	result = m_pVMemShared->Realloc(ptr, size);
+	FreeLockShared();
+	return result;
+    };
+    inline void FreeShared(void* ptr)
+    {
+	GetLockShared();
+	m_pVMemShared->Free(ptr);
+	FreeLockShared();
+    };
+    inline void* CallocShared(size_t num, size_t size)
+    {
+	size_t count = num*size;
+	void* lpVoid = MallocShared(count);
+	if (lpVoid)
+	    ZeroMemory(lpVoid, count);
+	return lpVoid;
+    };
+
+/* IPerlMemParse */
+    /* Assume something else is using locks to mangaging serialize
+       on a batch basis
+     */
+    inline void GetLockParse(void) { m_pVMemParse->GetLock(); };
+    inline void FreeLockParse(void) { m_pVMemParse->FreeLock(); };
+    inline int IsLockedParse(void) { return m_pVMemParse->IsLocked(); };
+    inline void* MallocParse(size_t size) { return m_pVMemParse->Malloc(size); };
+    inline void* ReallocParse(void* ptr, size_t size) { return m_pVMemParse->Realloc(ptr, size); };
+    inline void FreeParse(void* ptr) { m_pVMemParse->Free(ptr); };
+    inline void* CallocParse(size_t num, size_t size)
+    {
+	size_t count = num*size;
+	void* lpVoid = MallocParse(count);
+	if (lpVoid)
+	    ZeroMemory(lpVoid, count);
+	return lpVoid;
+    };
+
+/* IPerlEnv */
+    char *Getenv(const char *varname);
+    int Putenv(const char *envstring);
+    inline char *Getenv(const char *varname, unsigned long *len)
+    {
+	*len = 0;
+	char *e = Getenv(varname);
+	if (e)
+	    *len = strlen(e);
+	return e;
+    }
+    void* CreateChildEnv(void) { return CreateLocalEnvironmentStrings(*m_pvDir); };
+    void FreeChildEnv(void* pStr) { FreeLocalEnvironmentStrings((char*)pStr); };
+    char* GetChildDir(void);
+    void FreeChildDir(char* pStr);
+    void Reset(void);
+    void Clearenv(void);
+
+    inline LPSTR GetIndex(DWORD &dwIndex)
+    {
+	if(dwIndex < m_dwEnvCount)
+	{
+	    ++dwIndex;
+	    return m_lppEnvList[dwIndex-1];
+	}
+	return NULL;
+    };
+
+protected:
+    LPSTR Find(LPCSTR lpStr);
+    void Add(LPCSTR lpStr);
+
+    LPSTR CreateLocalEnvironmentStrings(VDir &vDir);
+    void FreeLocalEnvironmentStrings(LPSTR lpStr);
+    LPSTR* Lookup(LPCSTR lpStr);
+    DWORD CalculateEnvironmentSpace(void);
+
+public:
+
+/* IPerlDIR */
+    virtual int Chdir(const char *dirname);
+
+/* IPerllProc */
+    void Abort(void);
+    void Exit(int status);
+    void _Exit(int status);
+    int Execl(const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3);
+    int Execv(const char *cmdname, const char *const *argv);
+    int Execvp(const char *cmdname, const char *const *argv);
+
+    inline VMem* GetMemShared(void) { m_pVMemShared->AddRef(); return m_pVMemShared; };
+    inline VMem* GetMemParse(void) { m_pVMemParse->AddRef(); return m_pVMemParse; };
+    inline VDir* GetDir(void) { return m_pvDir; };
+
+public:
+
+    struct IPerlMem	    m_hostperlMem;
+    struct IPerlMem	    m_hostperlMemShared;
+    struct IPerlMem	    m_hostperlMemParse;
+    struct IPerlEnv	    m_hostperlEnv;
+    struct IPerlStdIO	    m_hostperlStdIO;
+    struct IPerlLIO	    m_hostperlLIO;
+    struct IPerlDir	    m_hostperlDir;
+    struct IPerlSock	    m_hostperlSock;
+    struct IPerlProc	    m_hostperlProc;
+
+    struct IPerlMem*	    m_pHostperlMem;
+    struct IPerlMem*	    m_pHostperlMemShared;
+    struct IPerlMem*	    m_pHostperlMemParse;
+    struct IPerlEnv*	    m_pHostperlEnv;
+    struct IPerlStdIO*	    m_pHostperlStdIO;
+    struct IPerlLIO*	    m_pHostperlLIO;
+    struct IPerlDir*	    m_pHostperlDir;
+    struct IPerlSock*	    m_pHostperlSock;
+    struct IPerlProc*	    m_pHostperlProc;
+
+    inline char* MapPathA(const char *pInName) { return m_pvDir->MapPathA(pInName); };
+    inline WCHAR* MapPathW(const WCHAR *pInName) { return m_pvDir->MapPathW(pInName); };
+protected:
+
+    VDir*   m_pvDir;
+    VMem*   m_pVMem;
+    VMem*   m_pVMemShared;
+    VMem*   m_pVMemParse;
+
+    DWORD   m_dwEnvCount;
+    LPSTR*  m_lppEnvList;
+    BOOL    m_bTopLevel;	// is this a toplevel host?
+    static long num_hosts;
+public:
+    inline  int LastHost(void) { return num_hosts == 1L; };
+    struct interpreter *host_perl;
+};
+
+long CPerlHost::num_hosts = 0L;
+
+extern "C" void win32_checkTLS(struct interpreter *host_perl);
+
+#define STRUCT2RAWPTR(x, y) (CPerlHost*)(((LPBYTE)x)-offsetof(CPerlHost, y))
+#ifdef CHECK_HOST_INTERP
+inline CPerlHost* CheckInterp(CPerlHost *host)
+{
+ win32_checkTLS(host->host_perl);
+ return host;
+}
+#define STRUCT2PTR(x, y) CheckInterp(STRUCT2RAWPTR(x, y))
+#else
+#define STRUCT2PTR(x, y) STRUCT2RAWPTR(x, y)
+#endif
+
+inline CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl)
+{
+    return STRUCT2RAWPTR(piPerl, m_hostperlMem);
+}
+
+inline CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl)
+{
+    return STRUCT2RAWPTR(piPerl, m_hostperlMemShared);
+}
+
+inline CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl)
+{
+    return STRUCT2RAWPTR(piPerl, m_hostperlMemParse);
+}
+
+inline CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl)
+{
+    return STRUCT2PTR(piPerl, m_hostperlEnv);
+}
+
+inline CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl)
+{
+    return STRUCT2PTR(piPerl, m_hostperlStdIO);
+}
+
+inline CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl)
+{
+    return STRUCT2PTR(piPerl, m_hostperlLIO);
+}
+
+inline CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl)
+{
+    return STRUCT2PTR(piPerl, m_hostperlDir);
+}
+
+inline CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl)
+{
+    return STRUCT2PTR(piPerl, m_hostperlSock);
+}
+
+inline CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl)
+{
+    return STRUCT2PTR(piPerl, m_hostperlProc);
+}
+
+
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlMem2Host(x)
+
+/* IPerlMem */
+void*
+PerlMemMalloc(struct IPerlMem* piPerl, size_t size)
+{
+    return IPERL2HOST(piPerl)->Malloc(size);
+}
+void*
+PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
+{
+    return IPERL2HOST(piPerl)->Realloc(ptr, size);
+}
+void
+PerlMemFree(struct IPerlMem* piPerl, void* ptr)
+{
+    IPERL2HOST(piPerl)->Free(ptr);
+}
+void*
+PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
+{
+    return IPERL2HOST(piPerl)->Calloc(num, size);
+}
+
+void
+PerlMemGetLock(struct IPerlMem* piPerl)
+{
+    IPERL2HOST(piPerl)->GetLock();
+}
+
+void
+PerlMemFreeLock(struct IPerlMem* piPerl)
+{
+    IPERL2HOST(piPerl)->FreeLock();
+}
+
+int
+PerlMemIsLocked(struct IPerlMem* piPerl)
+{
+    return IPERL2HOST(piPerl)->IsLocked();
+}
+
+struct IPerlMem perlMem =
+{
+    PerlMemMalloc,
+    PerlMemRealloc,
+    PerlMemFree,
+    PerlMemCalloc,
+    PerlMemGetLock,
+    PerlMemFreeLock,
+    PerlMemIsLocked,
+};
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlMemShared2Host(x)
+
+/* IPerlMemShared */
+void*
+PerlMemSharedMalloc(struct IPerlMem* piPerl, size_t size)
+{
+    return IPERL2HOST(piPerl)->MallocShared(size);
+}
+void*
+PerlMemSharedRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
+{
+    return IPERL2HOST(piPerl)->ReallocShared(ptr, size);
+}
+void
+PerlMemSharedFree(struct IPerlMem* piPerl, void* ptr)
+{
+    IPERL2HOST(piPerl)->FreeShared(ptr);
+}
+void*
+PerlMemSharedCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
+{
+    return IPERL2HOST(piPerl)->CallocShared(num, size);
+}
+
+void
+PerlMemSharedGetLock(struct IPerlMem* piPerl)
+{
+    IPERL2HOST(piPerl)->GetLockShared();
+}
+
+void
+PerlMemSharedFreeLock(struct IPerlMem* piPerl)
+{
+    IPERL2HOST(piPerl)->FreeLockShared();
+}
+
+int
+PerlMemSharedIsLocked(struct IPerlMem* piPerl)
+{
+    return IPERL2HOST(piPerl)->IsLockedShared();
+}
+
+struct IPerlMem perlMemShared =
+{
+    PerlMemSharedMalloc,
+    PerlMemSharedRealloc,
+    PerlMemSharedFree,
+    PerlMemSharedCalloc,
+    PerlMemSharedGetLock,
+    PerlMemSharedFreeLock,
+    PerlMemSharedIsLocked,
+};
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlMemParse2Host(x)
+
+/* IPerlMemParse */
+void*
+PerlMemParseMalloc(struct IPerlMem* piPerl, size_t size)
+{
+    return IPERL2HOST(piPerl)->MallocParse(size);
+}
+void*
+PerlMemParseRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
+{
+    return IPERL2HOST(piPerl)->ReallocParse(ptr, size);
+}
+void
+PerlMemParseFree(struct IPerlMem* piPerl, void* ptr)
+{
+    IPERL2HOST(piPerl)->FreeParse(ptr);
+}
+void*
+PerlMemParseCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
+{
+    return IPERL2HOST(piPerl)->CallocParse(num, size);
+}
+
+void
+PerlMemParseGetLock(struct IPerlMem* piPerl)
+{
+    IPERL2HOST(piPerl)->GetLockParse();
+}
+
+void
+PerlMemParseFreeLock(struct IPerlMem* piPerl)
+{
+    IPERL2HOST(piPerl)->FreeLockParse();
+}
+
+int
+PerlMemParseIsLocked(struct IPerlMem* piPerl)
+{
+    return IPERL2HOST(piPerl)->IsLockedParse();
+}
+
+struct IPerlMem perlMemParse =
+{
+    PerlMemParseMalloc,
+    PerlMemParseRealloc,
+    PerlMemParseFree,
+    PerlMemParseCalloc,
+    PerlMemParseGetLock,
+    PerlMemParseFreeLock,
+    PerlMemParseIsLocked,
+};
+
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlEnv2Host(x)
+
+/* IPerlEnv */
+char*
+PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname)
+{
+    return IPERL2HOST(piPerl)->Getenv(varname);
+};
+
+int
+PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring)
+{
+    return IPERL2HOST(piPerl)->Putenv(envstring);
+};
+
+char*
+PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len)
+{
+    return IPERL2HOST(piPerl)->Getenv(varname, len);
+}
+
+int
+PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name)
+{
+    return win32_uname(name);
+}
+
+void
+PerlEnvClearenv(struct IPerlEnv* piPerl)
+{
+    IPERL2HOST(piPerl)->Clearenv();
+}
+
+void*
+PerlEnvGetChildenv(struct IPerlEnv* piPerl)
+{
+    return IPERL2HOST(piPerl)->CreateChildEnv();
+}
+
+void
+PerlEnvFreeChildenv(struct IPerlEnv* piPerl, void* childEnv)
+{
+    IPERL2HOST(piPerl)->FreeChildEnv(childEnv);
+}
+
+char*
+PerlEnvGetChilddir(struct IPerlEnv* piPerl)
+{
+    return IPERL2HOST(piPerl)->GetChildDir();
+}
+
+void
+PerlEnvFreeChilddir(struct IPerlEnv* piPerl, char* childDir)
+{
+    IPERL2HOST(piPerl)->FreeChildDir(childDir);
+}
+
+unsigned long
+PerlEnvOsId(struct IPerlEnv* piPerl)
+{
+    return win32_os_id();
+}
+
+char*
+PerlEnvLibPath(struct IPerlEnv* piPerl, const char *pl)
+{
+    return g_win32_get_privlib(pl);
+}
+
+char*
+PerlEnvSiteLibPath(struct IPerlEnv* piPerl, const char *pl)
+{
+    return g_win32_get_sitelib(pl);
+}
+
+char*
+PerlEnvVendorLibPath(struct IPerlEnv* piPerl, const char *pl)
+{
+    return g_win32_get_vendorlib(pl);
+}
+
+void
+PerlEnvGetChildIO(struct IPerlEnv* piPerl, child_IO_table* ptr)
+{
+    win32_get_child_IO(ptr);
+}
+
+struct IPerlEnv perlEnv =
+{
+    PerlEnvGetenv,
+    PerlEnvPutenv,
+    PerlEnvGetenv_len,
+    PerlEnvUname,
+    PerlEnvClearenv,
+    PerlEnvGetChildenv,
+    PerlEnvFreeChildenv,
+    PerlEnvGetChilddir,
+    PerlEnvFreeChilddir,
+    PerlEnvOsId,
+    PerlEnvLibPath,
+    PerlEnvSiteLibPath,
+    PerlEnvVendorLibPath,
+    PerlEnvGetChildIO,
+};
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlStdIO2Host(x)
+
+/* PerlStdIO */
+FILE*
+PerlStdIOStdin(struct IPerlStdIO* piPerl)
+{
+    return win32_stdin();
+}
+
+FILE*
+PerlStdIOStdout(struct IPerlStdIO* piPerl)
+{
+    return win32_stdout();
+}
+
+FILE*
+PerlStdIOStderr(struct IPerlStdIO* piPerl)
+{
+    return win32_stderr();
+}
+
+FILE*
+PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode)
+{
+    return win32_fopen(path, mode);
+}
+
+int
+PerlStdIOClose(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return win32_fclose((pf));
+}
+
+int
+PerlStdIOEof(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return win32_feof(pf);
+}
+
+int
+PerlStdIOError(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return win32_ferror(pf);
+}
+
+void
+PerlStdIOClearerr(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    win32_clearerr(pf);
+}
+
+int
+PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return win32_getc(pf);
+}
+
+char*
+PerlStdIOGetBase(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef FILE_base
+    FILE *f = pf;
+    return FILE_base(f);
+#else
+    return Nullch;
+#endif
+}
+
+int
+PerlStdIOGetBufsiz(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef FILE_bufsiz
+    FILE *f = pf;
+    return FILE_bufsiz(f);
+#else
+    return (-1);
+#endif
+}
+
+int
+PerlStdIOGetCnt(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef USE_STDIO_PTR
+    FILE *f = pf;
+    return FILE_cnt(f);
+#else
+    return (-1);
+#endif
+}
+
+char*
+PerlStdIOGetPtr(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef USE_STDIO_PTR
+    FILE *f = pf;
+    return FILE_ptr(f);
+#else
+    return Nullch;
+#endif
+}
+
+char*
+PerlStdIOGets(struct IPerlStdIO* piPerl, FILE* pf, char* s, int n)
+{
+    return win32_fgets(s, n, pf);
+}
+
+int
+PerlStdIOPutc(struct IPerlStdIO* piPerl, FILE* pf, int c)
+{
+    return win32_fputc(c, pf);
+}
+
+int
+PerlStdIOPuts(struct IPerlStdIO* piPerl, FILE* pf, const char *s)
+{
+    return win32_fputs(s, pf);
+}
+
+int
+PerlStdIOFlush(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return win32_fflush(pf);
+}
+
+int
+PerlStdIOUngetc(struct IPerlStdIO* piPerl,int c, FILE* pf)
+{
+    return win32_ungetc(c, pf);
+}
+
+int
+PerlStdIOFileno(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return win32_fileno(pf);
+}
+
+FILE*
+PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode)
+{
+    return win32_fdopen(fd, mode);
+}
+
+FILE*
+PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, FILE* pf)
+{
+    return win32_freopen(path, mode, (FILE*)pf);
+}
+
+SSize_t
+PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t count, FILE* pf)
+{
+    return win32_fread(buffer, size, count, pf);
+}
+
+SSize_t
+PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t count, FILE* pf)
+{
+    return win32_fwrite(buffer, size, count, pf);
+}
+
+void
+PerlStdIOSetBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer)
+{
+    win32_setbuf(pf, buffer);
+}
+
+int
+PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer, int type, Size_t size)
+{
+    return win32_setvbuf(pf, buffer, type, size);
+}
+
+void
+PerlStdIOSetCnt(struct IPerlStdIO* piPerl, FILE* pf, int n)
+{
+#ifdef STDIO_CNT_LVALUE
+    FILE *f = pf;
+    FILE_cnt(f) = n;
+#endif
+}
+
+void
+PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, char * ptr)
+{
+#ifdef STDIO_PTR_LVALUE
+    FILE *f = pf;
+    FILE_ptr(f) = ptr;
+#endif
+}
+
+void
+PerlStdIOSetlinebuf(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    win32_setvbuf(pf, NULL, _IOLBF, 0);
+}
+
+int
+PerlStdIOPrintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format,...)
+{
+    va_list(arglist);
+    va_start(arglist, format);
+    return win32_vfprintf(pf, format, arglist);
+}
+
+int
+PerlStdIOVprintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format, va_list arglist)
+{
+    return win32_vfprintf(pf, format, arglist);
+}
+
+Off_t
+PerlStdIOTell(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return win32_ftell(pf);
+}
+
+int
+PerlStdIOSeek(struct IPerlStdIO* piPerl, FILE* pf, Off_t offset, int origin)
+{
+    return win32_fseek(pf, offset, origin);
+}
+
+void
+PerlStdIORewind(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    win32_rewind(pf);
+}
+
+FILE*
+PerlStdIOTmpfile(struct IPerlStdIO* piPerl)
+{
+    return win32_tmpfile();
+}
+
+int
+PerlStdIOGetpos(struct IPerlStdIO* piPerl, FILE* pf, Fpos_t *p)
+{
+    return win32_fgetpos(pf, p);
+}
+
+int
+PerlStdIOSetpos(struct IPerlStdIO* piPerl, FILE* pf, const Fpos_t *p)
+{
+    return win32_fsetpos(pf, p);
+}
+void
+PerlStdIOInit(struct IPerlStdIO* piPerl)
+{
+}
+
+void
+PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl)
+{
+    Perl_init_os_extras();
+}
+
+int
+PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, intptr_t osfhandle, int flags)
+{
+    return win32_open_osfhandle(osfhandle, flags);
+}
+
+intptr_t
+PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum)
+{
+    return win32_get_osfhandle(filenum);
+}
+
+FILE*
+PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    FILE* pfdup;
+    fpos_t pos;
+    char mode[3];
+    int fileno = win32_dup(win32_fileno(pf));
+
+    /* open the file in the same mode */
+#ifdef __BORLANDC__
+    if((pf)->flags & _F_READ) {
+	mode[0] = 'r';
+	mode[1] = 0;
+    }
+    else if((pf)->flags & _F_WRIT) {
+	mode[0] = 'a';
+	mode[1] = 0;
+    }
+    else if((pf)->flags & _F_RDWR) {
+	mode[0] = 'r';
+	mode[1] = '+';
+	mode[2] = 0;
+    }
+#else
+    if((pf)->_flag & _IOREAD) {
+	mode[0] = 'r';
+	mode[1] = 0;
+    }
+    else if((pf)->_flag & _IOWRT) {
+	mode[0] = 'a';
+	mode[1] = 0;
+    }
+    else if((pf)->_flag & _IORW) {
+	mode[0] = 'r';
+	mode[1] = '+';
+	mode[2] = 0;
+    }
+#endif
+
+    /* it appears that the binmode is attached to the
+     * file descriptor so binmode files will be handled
+     * correctly
+     */
+    pfdup = win32_fdopen(fileno, mode);
+
+    /* move the file pointer to the same position */
+    if (!fgetpos(pf, &pos)) {
+	fsetpos(pfdup, &pos);
+    }
+    return pfdup;
+}
+
+struct IPerlStdIO perlStdIO =
+{
+    PerlStdIOStdin,
+    PerlStdIOStdout,
+    PerlStdIOStderr,
+    PerlStdIOOpen,
+    PerlStdIOClose,
+    PerlStdIOEof,
+    PerlStdIOError,
+    PerlStdIOClearerr,
+    PerlStdIOGetc,
+    PerlStdIOGetBase,
+    PerlStdIOGetBufsiz,
+    PerlStdIOGetCnt,
+    PerlStdIOGetPtr,
+    PerlStdIOGets,
+    PerlStdIOPutc,
+    PerlStdIOPuts,
+    PerlStdIOFlush,
+    PerlStdIOUngetc,
+    PerlStdIOFileno,
+    PerlStdIOFdopen,
+    PerlStdIOReopen,
+    PerlStdIORead,
+    PerlStdIOWrite,
+    PerlStdIOSetBuf,
+    PerlStdIOSetVBuf,
+    PerlStdIOSetCnt,
+    PerlStdIOSetPtr,
+    PerlStdIOSetlinebuf,
+    PerlStdIOPrintf,
+    PerlStdIOVprintf,
+    PerlStdIOTell,
+    PerlStdIOSeek,
+    PerlStdIORewind,
+    PerlStdIOTmpfile,
+    PerlStdIOGetpos,
+    PerlStdIOSetpos,
+    PerlStdIOInit,
+    PerlStdIOInitOSExtras,
+    PerlStdIOFdupopen,
+};
+
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlLIO2Host(x)
+
+/* IPerlLIO */
+int
+PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode)
+{
+    return win32_access(path, mode);
+}
+
+int
+PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode)
+{
+    return win32_chmod(filename, pmode);
+}
+
+int
+PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group)
+{
+    return chown(filename, owner, group);
+}
+
+int
+PerlLIOChsize(struct IPerlLIO* piPerl, int handle, Off_t size)
+{
+    return win32_chsize(handle, size);
+}
+
+int
+PerlLIOClose(struct IPerlLIO* piPerl, int handle)
+{
+    return win32_close(handle);
+}
+
+int
+PerlLIODup(struct IPerlLIO* piPerl, int handle)
+{
+    return win32_dup(handle);
+}
+
+int
+PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2)
+{
+    return win32_dup2(handle1, handle2);
+}
+
+int
+PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
+{
+    return win32_flock(fd, oper);
+}
+
+int
+PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, Stat_t *buffer)
+{
+    return win32_fstat(handle, buffer);
+}
+
+int
+PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
+{
+    return win32_ioctlsocket((SOCKET)i, (long)u, (u_long*)data);
+}
+
+int
+PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
+{
+    return isatty(fd);
+}
+
+int
+PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname)
+{
+    return win32_link(oldname, newname);
+}
+
+Off_t
+PerlLIOLseek(struct IPerlLIO* piPerl, int handle, Off_t offset, int origin)
+{
+    return win32_lseek(handle, offset, origin);
+}
+
+int
+PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
+{
+    return win32_stat(path, buffer);
+}
+
+char*
+PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template)
+{
+    return mktemp(Template);
+}
+
+int
+PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag)
+{
+    return win32_open(filename, oflag);
+}
+
+int
+PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode)
+{
+    return win32_open(filename, oflag, pmode);
+}
+
+int
+PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count)
+{
+    return win32_read(handle, buffer, count);
+}
+
+int
+PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname)
+{
+    return win32_rename(OldFileName, newname);
+}
+
+int
+PerlLIOSetmode(struct IPerlLIO* piPerl, int handle, int mode)
+{
+    return win32_setmode(handle, mode);
+}
+
+int
+PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
+{
+    return win32_stat(path, buffer);
+}
+
+char*
+PerlLIOTmpnam(struct IPerlLIO* piPerl, char *string)
+{
+    return tmpnam(string);
+}
+
+int
+PerlLIOUmask(struct IPerlLIO* piPerl, int pmode)
+{
+    return umask(pmode);
+}
+
+int
+PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename)
+{
+    return win32_unlink(filename);
+}
+
+int
+PerlLIOUtime(struct IPerlLIO* piPerl, char *filename, struct utimbuf *times)
+{
+    return win32_utime(filename, times);
+}
+
+int
+PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count)
+{
+    return win32_write(handle, buffer, count);
+}
+
+struct IPerlLIO perlLIO =
+{
+    PerlLIOAccess,
+    PerlLIOChmod,
+    PerlLIOChown,
+    PerlLIOChsize,
+    PerlLIOClose,
+    PerlLIODup,
+    PerlLIODup2,
+    PerlLIOFlock,
+    PerlLIOFileStat,
+    PerlLIOIOCtl,
+    PerlLIOIsatty,
+    PerlLIOLink,
+    PerlLIOLseek,
+    PerlLIOLstat,
+    PerlLIOMktemp,
+    PerlLIOOpen,
+    PerlLIOOpen3,
+    PerlLIORead,
+    PerlLIORename,
+    PerlLIOSetmode,
+    PerlLIONameStat,
+    PerlLIOTmpnam,
+    PerlLIOUmask,
+    PerlLIOUnlink,
+    PerlLIOUtime,
+    PerlLIOWrite,
+};
+
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlDir2Host(x)
+
+/* IPerlDIR */
+int
+PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode)
+{
+    return win32_mkdir(dirname, mode);
+}
+
+int
+PerlDirChdir(struct IPerlDir* piPerl, const char *dirname)
+{
+    return IPERL2HOST(piPerl)->Chdir(dirname);
+}
+
+int
+PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname)
+{
+    return win32_rmdir(dirname);
+}
+
+int
+PerlDirClose(struct IPerlDir* piPerl, DIR *dirp)
+{
+    return win32_closedir(dirp);
+}
+
+DIR*
+PerlDirOpen(struct IPerlDir* piPerl, char *filename)
+{
+    return win32_opendir(filename);
+}
+
+struct direct *
+PerlDirRead(struct IPerlDir* piPerl, DIR *dirp)
+{
+    return win32_readdir(dirp);
+}
+
+void
+PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp)
+{
+    win32_rewinddir(dirp);
+}
+
+void
+PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc)
+{
+    win32_seekdir(dirp, loc);
+}
+
+long
+PerlDirTell(struct IPerlDir* piPerl, DIR *dirp)
+{
+    return win32_telldir(dirp);
+}
+
+char*
+PerlDirMapPathA(struct IPerlDir* piPerl, const char* path)
+{
+    return IPERL2HOST(piPerl)->MapPathA(path);
+}
+
+WCHAR*
+PerlDirMapPathW(struct IPerlDir* piPerl, const WCHAR* path)
+{
+    return IPERL2HOST(piPerl)->MapPathW(path);
+}
+
+struct IPerlDir perlDir =
+{
+    PerlDirMakedir,
+    PerlDirChdir,
+    PerlDirRmdir,
+    PerlDirClose,
+    PerlDirOpen,
+    PerlDirRead,
+    PerlDirRewind,
+    PerlDirSeek,
+    PerlDirTell,
+    PerlDirMapPathA,
+    PerlDirMapPathW,
+};
+
+
+/* IPerlSock */
+u_long
+PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong)
+{
+    return win32_htonl(hostlong);
+}
+
+u_short
+PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort)
+{
+    return win32_htons(hostshort);
+}
+
+u_long
+PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong)
+{
+    return win32_ntohl(netlong);
+}
+
+u_short
+PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort)
+{
+    return win32_ntohs(netshort);
+}
+
+SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen)
+{
+    return win32_accept(s, addr, addrlen);
+}
+
+int
+PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
+{
+    return win32_bind(s, name, namelen);
+}
+
+int
+PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
+{
+    return win32_connect(s, name, namelen);
+}
+
+void
+PerlSockEndhostent(struct IPerlSock* piPerl)
+{
+    win32_endhostent();
+}
+
+void
+PerlSockEndnetent(struct IPerlSock* piPerl)
+{
+    win32_endnetent();
+}
+
+void
+PerlSockEndprotoent(struct IPerlSock* piPerl)
+{
+    win32_endprotoent();
+}
+
+void
+PerlSockEndservent(struct IPerlSock* piPerl)
+{
+    win32_endservent();
+}
+
+struct hostent*
+PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type)
+{
+    return win32_gethostbyaddr(addr, len, type);
+}
+
+struct hostent*
+PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name)
+{
+    return win32_gethostbyname(name);
+}
+
+struct hostent*
+PerlSockGethostent(struct IPerlSock* piPerl)
+{
+    dTHX;
+    Perl_croak(aTHX_ "gethostent not implemented!\n");
+    return NULL;
+}
+
+int
+PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen)
+{
+    return win32_gethostname(name, namelen);
+}
+
+struct netent *
+PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type)
+{
+    return win32_getnetbyaddr(net, type);
+}
+
+struct netent *
+PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name)
+{
+    return win32_getnetbyname((char*)name);
+}
+
+struct netent *
+PerlSockGetnetent(struct IPerlSock* piPerl)
+{
+    return win32_getnetent();
+}
+
+int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
+{
+    return win32_getpeername(s, name, namelen);
+}
+
+struct protoent*
+PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name)
+{
+    return win32_getprotobyname(name);
+}
+
+struct protoent*
+PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number)
+{
+    return win32_getprotobynumber(number);
+}
+
+struct protoent*
+PerlSockGetprotoent(struct IPerlSock* piPerl)
+{
+    return win32_getprotoent();
+}
+
+struct servent*
+PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto)
+{
+    return win32_getservbyname(name, proto);
+}
+
+struct servent*
+PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto)
+{
+    return win32_getservbyport(port, proto);
+}
+
+struct servent*
+PerlSockGetservent(struct IPerlSock* piPerl)
+{
+    return win32_getservent();
+}
+
+int
+PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
+{
+    return win32_getsockname(s, name, namelen);
+}
+
+int
+PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen)
+{
+    return win32_getsockopt(s, level, optname, optval, optlen);
+}
+
+unsigned long
+PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp)
+{
+    return win32_inet_addr(cp);
+}
+
+char*
+PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in)
+{
+    return win32_inet_ntoa(in);
+}
+
+int
+PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog)
+{
+    return win32_listen(s, backlog);
+}
+
+int
+PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags)
+{
+    return win32_recv(s, buffer, len, flags);
+}
+
+int
+PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
+{
+    return win32_recvfrom(s, buffer, len, flags, from, fromlen);
+}
+
+int
+PerlSockSelect(struct IPerlSock* piPerl, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout)
+{
+    return win32_select(nfds, (Perl_fd_set*)readfds, (Perl_fd_set*)writefds, (Perl_fd_set*)exceptfds, timeout);
+}
+
+int
+PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags)
+{
+    return win32_send(s, buffer, len, flags);
+}
+
+int
+PerlSockSendto(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen)
+{
+    return win32_sendto(s, buffer, len, flags, to, tolen);
+}
+
+void
+PerlSockSethostent(struct IPerlSock* piPerl, int stayopen)
+{
+    win32_sethostent(stayopen);
+}
+
+void
+PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen)
+{
+    win32_setnetent(stayopen);
+}
+
+void
+PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen)
+{
+    win32_setprotoent(stayopen);
+}
+
+void
+PerlSockSetservent(struct IPerlSock* piPerl, int stayopen)
+{
+    win32_setservent(stayopen);
+}
+
+int
+PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen)
+{
+    return win32_setsockopt(s, level, optname, optval, optlen);
+}
+
+int
+PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how)
+{
+    return win32_shutdown(s, how);
+}
+
+SOCKET
+PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol)
+{
+    return win32_socket(af, type, protocol);
+}
+
+int
+PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds)
+{
+    return Perl_my_socketpair(domain, type, protocol, fds);
+}
+
+int
+PerlSockClosesocket(struct IPerlSock* piPerl, SOCKET s)
+{
+    return win32_closesocket(s);
+}
+
+int
+PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp)
+{
+    return win32_ioctlsocket(s, cmd, argp);
+}
+
+struct IPerlSock perlSock =
+{
+    PerlSockHtonl,
+    PerlSockHtons,
+    PerlSockNtohl,
+    PerlSockNtohs,
+    PerlSockAccept,
+    PerlSockBind,
+    PerlSockConnect,
+    PerlSockEndhostent,
+    PerlSockEndnetent,
+    PerlSockEndprotoent,
+    PerlSockEndservent,
+    PerlSockGethostname,
+    PerlSockGetpeername,
+    PerlSockGethostbyaddr,
+    PerlSockGethostbyname,
+    PerlSockGethostent,
+    PerlSockGetnetbyaddr,
+    PerlSockGetnetbyname,
+    PerlSockGetnetent,
+    PerlSockGetprotobyname,
+    PerlSockGetprotobynumber,
+    PerlSockGetprotoent,
+    PerlSockGetservbyname,
+    PerlSockGetservbyport,
+    PerlSockGetservent,
+    PerlSockGetsockname,
+    PerlSockGetsockopt,
+    PerlSockInetAddr,
+    PerlSockInetNtoa,
+    PerlSockListen,
+    PerlSockRecv,
+    PerlSockRecvfrom,
+    PerlSockSelect,
+    PerlSockSend,
+    PerlSockSendto,
+    PerlSockSethostent,
+    PerlSockSetnetent,
+    PerlSockSetprotoent,
+    PerlSockSetservent,
+    PerlSockSetsockopt,
+    PerlSockShutdown,
+    PerlSockSocket,
+    PerlSockSocketpair,
+    PerlSockClosesocket,
+};
+
+
+/* IPerlProc */
+
+#define EXECF_EXEC 1
+#define EXECF_SPAWN 2
+
+void
+PerlProcAbort(struct IPerlProc* piPerl)
+{
+    win32_abort();
+}
+
+char *
+PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt)
+{
+    return win32_crypt(clear, salt);
+}
+
+void
+PerlProcExit(struct IPerlProc* piPerl, int status)
+{
+    exit(status);
+}
+
+void
+PerlProc_Exit(struct IPerlProc* piPerl, int status)
+{
+    _exit(status);
+}
+
+int
+PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
+{
+    return execl(cmdname, arg0, arg1, arg2, arg3);
+}
+
+int
+PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
+{
+    return win32_execvp(cmdname, argv);
+}
+
+int
+PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
+{
+    return win32_execvp(cmdname, argv);
+}
+
+uid_t
+PerlProcGetuid(struct IPerlProc* piPerl)
+{
+    return getuid();
+}
+
+uid_t
+PerlProcGeteuid(struct IPerlProc* piPerl)
+{
+    return geteuid();
+}
+
+gid_t
+PerlProcGetgid(struct IPerlProc* piPerl)
+{
+    return getgid();
+}
+
+gid_t
+PerlProcGetegid(struct IPerlProc* piPerl)
+{
+    return getegid();
+}
+
+char *
+PerlProcGetlogin(struct IPerlProc* piPerl)
+{
+    return g_getlogin();
+}
+
+int
+PerlProcKill(struct IPerlProc* piPerl, int pid, int sig)
+{
+    return win32_kill(pid, sig);
+}
+
+int
+PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
+{
+    dTHX;
+    Perl_croak(aTHX_ "killpg not implemented!\n");
+    return 0;
+}
+
+int
+PerlProcPauseProc(struct IPerlProc* piPerl)
+{
+    return win32_sleep((32767L << 16) + 32767);
+}
+
+PerlIO*
+PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode)
+{
+    dTHX;
+    PERL_FLUSHALL_FOR_CHILD;
+    return win32_popen(command, mode);
+}
+
+PerlIO*
+PerlProcPopenList(struct IPerlProc* piPerl, const char *mode, IV narg, SV **args)
+{
+    dTHX;
+    PERL_FLUSHALL_FOR_CHILD;
+    return win32_popenlist(mode, narg, args);
+}
+
+int
+PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream)
+{
+    return win32_pclose(stream);
+}
+
+int
+PerlProcPipe(struct IPerlProc* piPerl, int *phandles)
+{
+    return win32_pipe(phandles, 512, O_BINARY);
+}
+
+int
+PerlProcSetuid(struct IPerlProc* piPerl, uid_t u)
+{
+    return setuid(u);
+}
+
+int
+PerlProcSetgid(struct IPerlProc* piPerl, gid_t g)
+{
+    return setgid(g);
+}
+
+int
+PerlProcSleep(struct IPerlProc* piPerl, unsigned int s)
+{
+    return win32_sleep(s);
+}
+
+int
+PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf)
+{
+    return win32_times(timebuf);
+}
+
+int
+PerlProcWait(struct IPerlProc* piPerl, int *status)
+{
+    return win32_wait(status);
+}
+
+int
+PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
+{
+    return win32_waitpid(pid, status, flags);
+}
+
+Sighandler_t
+PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
+{
+    return win32_signal(sig, subcode);
+}
+
+int
+PerlProcGetTimeOfDay(struct IPerlProc* piPerl, struct timeval *t, void *z)
+{
+    return win32_gettimeofday(t, z);
+}
+
+#ifdef USE_ITHREADS
+static THREAD_RET_TYPE
+win32_start_child(LPVOID arg)
+{
+    PerlInterpreter *my_perl = (PerlInterpreter*)arg;
+    GV *tmpgv;
+    int status;
+#ifdef PERL_SYNC_FORK
+    static long sync_fork_id = 0;
+    long id = ++sync_fork_id;
+#endif
+
+
+    PERL_SET_THX(my_perl);
+    win32_checkTLS(my_perl);
+
+    /* set $$ to pseudo id */
+#ifdef PERL_SYNC_FORK
+    w32_pseudo_id = id;
+#else
+    w32_pseudo_id = GetCurrentThreadId();
+    if (IsWin95()) {
+	int pid = (int)w32_pseudo_id;
+	if (pid < 0)
+	    w32_pseudo_id = -pid;
+    }
+#endif
+    if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV)) {
+	SV *sv = GvSV(tmpgv);
+	SvREADONLY_off(sv);
+	sv_setiv(sv, -(IV)w32_pseudo_id);
+	SvREADONLY_on(sv);
+    }
+    hv_clear(PL_pidstatus);
+
+    /* push a zero on the stack (we are the child) */
+    {
+	dSP;
+	dTARGET;
+	PUSHi(0);
+	PUTBACK;
+    }
+
+    /* continue from next op */
+    PL_op = PL_op->op_next;
+
+    {
+	dJMPENV;
+	volatile int oldscope = PL_scopestack_ix;
+
+restart:
+	JMPENV_PUSH(status);
+	switch (status) {
+	case 0:
+	    CALLRUNOPS(aTHX);
+	    status = 0;
+	    break;
+	case 2:
+	    while (PL_scopestack_ix > oldscope)
+		LEAVE;
+	    FREETMPS;
+	    PL_curstash = PL_defstash;
+	    if (PL_endav && !PL_minus_c)
+		call_list(oldscope, PL_endav);
+	    status = STATUS_NATIVE_EXPORT;
+	    break;
+	case 3:
+	    if (PL_restartop) {
+		POPSTACK_TO(PL_mainstack);
+		PL_op = PL_restartop;
+		PL_restartop = Nullop;
+		goto restart;
+	    }
+	    PerlIO_printf(Perl_error_log, "panic: restartop\n");
+	    FREETMPS;
+	    status = 1;
+	    break;
+	}
+	JMPENV_POP;
+
+	/* XXX hack to avoid perl_destruct() freeing optree */
+        win32_checkTLS(my_perl);
+	PL_main_root = Nullop;
+    }
+
+    win32_checkTLS(my_perl);
+    /* close the std handles to avoid fd leaks */
+    {
+	do_close(PL_stdingv, FALSE);
+	do_close(gv_fetchpv("STDOUT", TRUE, SVt_PVIO), FALSE); /* PL_stdoutgv - ISAGN */
+	do_close(PL_stderrgv, FALSE);
+    }
+
+    /* destroy everything (waits for any pseudo-forked children) */
+    win32_checkTLS(my_perl);
+    perl_destruct(my_perl);
+    win32_checkTLS(my_perl);
+    perl_free(my_perl);
+
+#ifdef PERL_SYNC_FORK
+    return id;
+#else
+    return (DWORD)status;
+#endif
+}
+#endif /* USE_ITHREADS */
+
+int
+PerlProcFork(struct IPerlProc* piPerl)
+{
+    dTHX;
+#ifdef USE_ITHREADS
+    DWORD id;
+    HANDLE handle;
+    CPerlHost *h;
+
+    if (w32_num_pseudo_children >= MAXIMUM_WAIT_OBJECTS) {
+	errno = EAGAIN;
+	return -1;
+    }
+    h = new CPerlHost(*(CPerlHost*)w32_internal_host);
+    PerlInterpreter *new_perl = perl_clone_using((PerlInterpreter*)aTHX, 1,
+						 h->m_pHostperlMem,
+						 h->m_pHostperlMemShared,
+						 h->m_pHostperlMemParse,
+						 h->m_pHostperlEnv,
+						 h->m_pHostperlStdIO,
+						 h->m_pHostperlLIO,
+						 h->m_pHostperlDir,
+						 h->m_pHostperlSock,
+						 h->m_pHostperlProc
+						 );
+    new_perl->Isys_intern.internal_host = h;
+    h->host_perl = new_perl;
+#  ifdef PERL_SYNC_FORK
+    id = win32_start_child((LPVOID)new_perl);
+    PERL_SET_THX(aTHX);
+#  else
+#    ifdef USE_RTL_THREAD_API
+    handle = (HANDLE)_beginthreadex((void*)NULL, 0, win32_start_child,
+				    (void*)new_perl, 0, (unsigned*)&id);
+#    else
+    handle = CreateThread(NULL, 0, win32_start_child,
+			  (LPVOID)new_perl, 0, &id);
+#    endif
+    PERL_SET_THX(aTHX);	/* XXX perl_clone*() set TLS */
+    if (!handle) {
+	errno = EAGAIN;
+	return -1;
+    }
+    if (IsWin95()) {
+	int pid = (int)id;
+	if (pid < 0)
+	    id = -pid;
+    }
+    w32_pseudo_child_handles[w32_num_pseudo_children] = handle;
+    w32_pseudo_child_pids[w32_num_pseudo_children] = id;
+    ++w32_num_pseudo_children;
+#  endif
+    return -(int)id;
+#else
+    Perl_croak(aTHX_ "fork() not implemented!\n");
+    return -1;
+#endif /* USE_ITHREADS */
+}
+
+int
+PerlProcGetpid(struct IPerlProc* piPerl)
+{
+    return win32_getpid();
+}
+
+void*
+PerlProcDynaLoader(struct IPerlProc* piPerl, const char* filename)
+{
+    return win32_dynaload(filename);
+}
+
+void
+PerlProcGetOSError(struct IPerlProc* piPerl, SV* sv, DWORD dwErr)
+{
+    win32_str_os_error(sv, dwErr);
+}
+
+int
+PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv)
+{
+    return win32_spawnvp(mode, cmdname, argv);
+}
+
+int
+PerlProcLastHost(struct IPerlProc* piPerl)
+{
+ dTHX;
+ CPerlHost *h = (CPerlHost*)w32_internal_host;
+ return h->LastHost();
+}
+
+struct IPerlProc perlProc =
+{
+    PerlProcAbort,
+    PerlProcCrypt,
+    PerlProcExit,
+    PerlProc_Exit,
+    PerlProcExecl,
+    PerlProcExecv,
+    PerlProcExecvp,
+    PerlProcGetuid,
+    PerlProcGeteuid,
+    PerlProcGetgid,
+    PerlProcGetegid,
+    PerlProcGetlogin,
+    PerlProcKill,
+    PerlProcKillpg,
+    PerlProcPauseProc,
+    PerlProcPopen,
+    PerlProcPclose,
+    PerlProcPipe,
+    PerlProcSetuid,
+    PerlProcSetgid,
+    PerlProcSleep,
+    PerlProcTimes,
+    PerlProcWait,
+    PerlProcWaitpid,
+    PerlProcSignal,
+    PerlProcFork,
+    PerlProcGetpid,
+    PerlProcDynaLoader,
+    PerlProcGetOSError,
+    PerlProcSpawnvp,
+    PerlProcLastHost,
+    PerlProcPopenList,
+    PerlProcGetTimeOfDay
+};
+
+
+/*
+ * CPerlHost
+ */
+
+CPerlHost::CPerlHost(void)
+{
+    /* Construct a host from scratch */
+    InterlockedIncrement(&num_hosts);
+    m_pvDir = new VDir();
+    m_pVMem = new VMem();
+    m_pVMemShared = new VMem();
+    m_pVMemParse =  new VMem();
+
+    m_pvDir->Init(NULL, m_pVMem);
+
+    m_dwEnvCount = 0;
+    m_lppEnvList = NULL;
+    m_bTopLevel = TRUE;
+
+    CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
+    CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
+    CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
+    CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
+    CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
+    CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
+    CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
+    CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
+    CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
+
+    m_pHostperlMem	    = &m_hostperlMem;
+    m_pHostperlMemShared    = &m_hostperlMemShared;
+    m_pHostperlMemParse	    = &m_hostperlMemParse;
+    m_pHostperlEnv	    = &m_hostperlEnv;
+    m_pHostperlStdIO	    = &m_hostperlStdIO;
+    m_pHostperlLIO	    = &m_hostperlLIO;
+    m_pHostperlDir	    = &m_hostperlDir;
+    m_pHostperlSock	    = &m_hostperlSock;
+    m_pHostperlProc	    = &m_hostperlProc;
+}
+
+#define SETUPEXCHANGE(xptr, iptr, table) \
+    STMT_START {				\
+	if (xptr) {				\
+	    iptr = *xptr;			\
+	    *xptr = &table;			\
+	}					\
+	else {					\
+	    iptr = &table;			\
+	}					\
+    } STMT_END
+
+CPerlHost::CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
+		 struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
+		 struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
+		 struct IPerlDir** ppDir, struct IPerlSock** ppSock,
+		 struct IPerlProc** ppProc)
+{
+    InterlockedIncrement(&num_hosts);
+    m_pvDir = new VDir(0);
+    m_pVMem = new VMem();
+    m_pVMemShared = new VMem();
+    m_pVMemParse =  new VMem();
+
+    m_pvDir->Init(NULL, m_pVMem);
+
+    m_dwEnvCount = 0;
+    m_lppEnvList = NULL;
+    m_bTopLevel = FALSE;
+
+    CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
+    CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
+    CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
+    CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
+    CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
+    CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
+    CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
+    CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
+    CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
+
+    SETUPEXCHANGE(ppMem,	m_pHostperlMem,		m_hostperlMem);
+    SETUPEXCHANGE(ppMemShared,	m_pHostperlMemShared,	m_hostperlMemShared);
+    SETUPEXCHANGE(ppMemParse,	m_pHostperlMemParse,	m_hostperlMemParse);
+    SETUPEXCHANGE(ppEnv,	m_pHostperlEnv,		m_hostperlEnv);
+    SETUPEXCHANGE(ppStdIO,	m_pHostperlStdIO,	m_hostperlStdIO);
+    SETUPEXCHANGE(ppLIO,	m_pHostperlLIO,		m_hostperlLIO);
+    SETUPEXCHANGE(ppDir,	m_pHostperlDir,		m_hostperlDir);
+    SETUPEXCHANGE(ppSock,	m_pHostperlSock,	m_hostperlSock);
+    SETUPEXCHANGE(ppProc,	m_pHostperlProc,	m_hostperlProc);
+}
+#undef SETUPEXCHANGE
+
+CPerlHost::CPerlHost(CPerlHost& host)
+{
+    /* Construct a host from another host */
+    InterlockedIncrement(&num_hosts);
+    m_pVMem = new VMem();
+    m_pVMemShared = host.GetMemShared();
+    m_pVMemParse =  host.GetMemParse();
+
+    /* duplicate directory info */
+    m_pvDir = new VDir(0);
+    m_pvDir->Init(host.GetDir(), m_pVMem);
+
+    CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
+    CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
+    CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
+    CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
+    CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
+    CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
+    CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
+    CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
+    CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
+    m_pHostperlMem	    = &m_hostperlMem;
+    m_pHostperlMemShared    = &m_hostperlMemShared;
+    m_pHostperlMemParse	    = &m_hostperlMemParse;
+    m_pHostperlEnv	    = &m_hostperlEnv;
+    m_pHostperlStdIO	    = &m_hostperlStdIO;
+    m_pHostperlLIO	    = &m_hostperlLIO;
+    m_pHostperlDir	    = &m_hostperlDir;
+    m_pHostperlSock	    = &m_hostperlSock;
+    m_pHostperlProc	    = &m_hostperlProc;
+
+    m_dwEnvCount = 0;
+    m_lppEnvList = NULL;
+    m_bTopLevel = FALSE;
+
+    /* duplicate environment info */
+    LPSTR lpPtr;
+    DWORD dwIndex = 0;
+    while(lpPtr = host.GetIndex(dwIndex))
+	Add(lpPtr);
+}
+
+CPerlHost::~CPerlHost(void)
+{
+    Reset();
+    InterlockedDecrement(&num_hosts);
+    delete m_pvDir;
+    m_pVMemParse->Release();
+    m_pVMemShared->Release();
+    m_pVMem->Release();
+}
+
+LPSTR
+CPerlHost::Find(LPCSTR lpStr)
+{
+    LPSTR lpPtr;
+    LPSTR* lppPtr = Lookup(lpStr);
+    if(lppPtr != NULL) {
+	for(lpPtr = *lppPtr; *lpPtr != '\0' && *lpPtr != '='; ++lpPtr)
+	    ;
+
+	if(*lpPtr == '=')
+	    ++lpPtr;
+
+	return lpPtr;
+    }
+    return NULL;
+}
+
+int
+lookup(const void *arg1, const void *arg2)
+{   // Compare strings
+    char*ptr1, *ptr2;
+    char c1,c2;
+
+    ptr1 = *(char**)arg1;
+    ptr2 = *(char**)arg2;
+    for(;;) {
+	c1 = *ptr1++;
+	c2 = *ptr2++;
+	if(c1 == '\0' || c1 == '=') {
+	    if(c2 == '\0' || c2 == '=')
+		break;
+
+	    return -1; // string 1 < string 2
+	}
+	else if(c2 == '\0' || c2 == '=')
+	    return 1; // string 1 > string 2
+	else if(c1 != c2) {
+	    c1 = toupper(c1);
+	    c2 = toupper(c2);
+	    if(c1 != c2) {
+		if(c1 < c2)
+		    return -1; // string 1 < string 2
+
+		return 1; // string 1 > string 2
+	    }
+	}
+    }
+    return 0;
+}
+
+LPSTR*
+CPerlHost::Lookup(LPCSTR lpStr)
+{
+    if (!lpStr)
+	return NULL;
+    return (LPSTR*)bsearch(&lpStr, m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), lookup);
+}
+
+int
+compare(const void *arg1, const void *arg2)
+{   // Compare strings
+    char*ptr1, *ptr2;
+    char c1,c2;
+
+    ptr1 = *(char**)arg1;
+    ptr2 = *(char**)arg2;
+    for(;;) {
+	c1 = *ptr1++;
+	c2 = *ptr2++;
+	if(c1 == '\0' || c1 == '=') {
+	    if(c1 == c2)
+		break;
+
+	    return -1; // string 1 < string 2
+	}
+	else if(c2 == '\0' || c2 == '=')
+	    return 1; // string 1 > string 2
+	else if(c1 != c2) {
+	    c1 = toupper(c1);
+	    c2 = toupper(c2);
+	    if(c1 != c2) {
+		if(c1 < c2)
+		    return -1; // string 1 < string 2
+
+		return 1; // string 1 > string 2
+	    }
+	}
+    }
+    return 0;
+}
+
+void
+CPerlHost::Add(LPCSTR lpStr)
+{
+    dTHX;
+    char szBuffer[1024];
+    LPSTR *lpPtr;
+    int index, length = strlen(lpStr)+1;
+
+    for(index = 0; lpStr[index] != '\0' && lpStr[index] != '='; ++index)
+	szBuffer[index] = lpStr[index];
+
+    szBuffer[index] = '\0';
+
+    // replacing ?
+    lpPtr = Lookup(szBuffer);
+    if (lpPtr != NULL) {
+	// must allocate things via host memory allocation functions 
+	// rather than perl's Renew() et al, as the perl interpreter
+	// may either not be initialized enough when we allocate these,
+	// or may already be dead when we go to free these
+	*lpPtr = (char*)Realloc(*lpPtr, length * sizeof(char));
+	strcpy(*lpPtr, lpStr);
+    }
+    else {
+	m_lppEnvList = (LPSTR*)Realloc(m_lppEnvList, (m_dwEnvCount+1) * sizeof(LPSTR));
+	if (m_lppEnvList) {
+	    m_lppEnvList[m_dwEnvCount] = (char*)Malloc(length * sizeof(char));
+	    if (m_lppEnvList[m_dwEnvCount] != NULL) {
+		strcpy(m_lppEnvList[m_dwEnvCount], lpStr);
+		++m_dwEnvCount;
+		qsort(m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), compare);
+	    }
+	}
+    }
+}
+
+DWORD
+CPerlHost::CalculateEnvironmentSpace(void)
+{
+    DWORD index;
+    DWORD dwSize = 0;
+    for(index = 0; index < m_dwEnvCount; ++index)
+	dwSize += strlen(m_lppEnvList[index]) + 1;
+
+    return dwSize;
+}
+
+void
+CPerlHost::FreeLocalEnvironmentStrings(LPSTR lpStr)
+{
+    dTHX;
+    Safefree(lpStr);
+}
+
+char*
+CPerlHost::GetChildDir(void)
+{
+    dTHX;
+    int length;
+    char* ptr;
+    Newx(ptr, MAX_PATH+1, char);
+    if(ptr) {
+	m_pvDir->GetCurrentDirectoryA(MAX_PATH+1, ptr);
+	length = strlen(ptr);
+	if (length > 3) {
+	    if ((ptr[length-1] == '\\') || (ptr[length-1] == '/'))
+		ptr[length-1] = 0;
+	}
+    }
+    return ptr;
+}
+
+void
+CPerlHost::FreeChildDir(char* pStr)
+{
+    dTHX;
+    Safefree(pStr);
+}
+
+LPSTR
+CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir)
+{
+    dTHX;
+    LPSTR lpStr, lpPtr, lpEnvPtr, lpTmp, lpLocalEnv, lpAllocPtr;
+    DWORD dwSize, dwEnvIndex;
+    int nLength, compVal;
+
+    // get the process environment strings
+    lpAllocPtr = lpTmp = (LPSTR)GetEnvironmentStrings();
+
+    // step over current directory stuff
+    while(*lpTmp == '=')
+	lpTmp += strlen(lpTmp) + 1;
+
+    // save the start of the environment strings
+    lpEnvPtr = lpTmp;
+    for(dwSize = 1; *lpTmp != '\0'; lpTmp += strlen(lpTmp) + 1) {
+	// calculate the size of the environment strings
+	dwSize += strlen(lpTmp) + 1;
+    }
+
+    // add the size of current directories
+    dwSize += vDir.CalculateEnvironmentSpace();
+
+    // add the additional space used by changes made to the environment
+    dwSize += CalculateEnvironmentSpace();
+
+    Newx(lpStr, dwSize, char);
+    lpPtr = lpStr;
+    if(lpStr != NULL) {
+	// build the local environment
+	lpStr = vDir.BuildEnvironmentSpace(lpStr);
+
+	dwEnvIndex = 0;
+	lpLocalEnv = GetIndex(dwEnvIndex);
+	while(*lpEnvPtr != '\0') {
+	    if(!lpLocalEnv) {
+		// all environment overrides have been added
+		// so copy string into place
+		strcpy(lpStr, lpEnvPtr);
+		nLength = strlen(lpEnvPtr) + 1;
+		lpStr += nLength;
+		lpEnvPtr += nLength;
+	    }
+	    else {
+		// determine which string to copy next
+		compVal = compare(&lpEnvPtr, &lpLocalEnv);
+		if(compVal < 0) {
+		    strcpy(lpStr, lpEnvPtr);
+		    nLength = strlen(lpEnvPtr) + 1;
+		    lpStr += nLength;
+		    lpEnvPtr += nLength;
+		}
+		else {
+		    char *ptr = strchr(lpLocalEnv, '=');
+		    if(ptr && ptr[1]) {
+			strcpy(lpStr, lpLocalEnv);
+			lpStr += strlen(lpLocalEnv) + 1;
+		    }
+		    lpLocalEnv = GetIndex(dwEnvIndex);
+		    if(compVal == 0) {
+			// this string was replaced
+			lpEnvPtr += strlen(lpEnvPtr) + 1;
+		    }
+		}
+	    }
+	}
+
+	while(lpLocalEnv) {
+	    // still have environment overrides to add
+	    // so copy the strings into place if not an override
+	    char *ptr = strchr(lpLocalEnv, '=');
+	    if(ptr && ptr[1]) {
+		strcpy(lpStr, lpLocalEnv);
+		lpStr += strlen(lpLocalEnv) + 1;
+	    }
+	    lpLocalEnv = GetIndex(dwEnvIndex);
+	}
+
+	// add final NULL
+	*lpStr = '\0';
+    }
+
+    // release the process environment strings
+    FreeEnvironmentStrings(lpAllocPtr);
+
+    return lpPtr;
+}
+
+void
+CPerlHost::Reset(void)
+{
+    dTHX;
+    if(m_lppEnvList != NULL) {
+	for(DWORD index = 0; index < m_dwEnvCount; ++index) {
+	    Free(m_lppEnvList[index]);
+	    m_lppEnvList[index] = NULL;
+	}
+    }
+    m_dwEnvCount = 0;
+    Free(m_lppEnvList);
+    m_lppEnvList = NULL;
+}
+
+void
+CPerlHost::Clearenv(void)
+{
+    dTHX;
+    char ch;
+    LPSTR lpPtr, lpStr, lpEnvPtr;
+    if (m_lppEnvList != NULL) {
+	/* set every entry to an empty string */
+	for(DWORD index = 0; index < m_dwEnvCount; ++index) {
+	    char* ptr = strchr(m_lppEnvList[index], '=');
+	    if(ptr) {
+		*++ptr = 0;
+	    }
+	}
+    }
+
+    /* get the process environment strings */
+    lpStr = lpEnvPtr = (LPSTR)GetEnvironmentStrings();
+
+    /* step over current directory stuff */
+    while(*lpStr == '=')
+	lpStr += strlen(lpStr) + 1;
+
+    while(*lpStr) {
+	lpPtr = strchr(lpStr, '=');
+	if(lpPtr) {
+	    ch = *++lpPtr;
+	    *lpPtr = 0;
+	    Add(lpStr);
+	    if (m_bTopLevel)
+		(void)win32_putenv(lpStr);
+	    *lpPtr = ch;
+	}
+	lpStr += strlen(lpStr) + 1;
+    }
+
+    FreeEnvironmentStrings(lpEnvPtr);
+}
+
+
+char*
+CPerlHost::Getenv(const char *varname)
+{
+    dTHX;
+    if (!m_bTopLevel) {
+	char *pEnv = Find(varname);
+	if (pEnv && *pEnv)
+	    return pEnv;
+    }
+    return win32_getenv(varname);
+}
+
+int
+CPerlHost::Putenv(const char *envstring)
+{
+    dTHX;
+    Add(envstring);
+    if (m_bTopLevel)
+	return win32_putenv(envstring);
+
+    return 0;
+}
+
+int
+CPerlHost::Chdir(const char *dirname)
+{
+    dTHX;
+    int ret;
+    if (!dirname) {
+	errno = ENOENT;
+	return -1;
+    }
+    if (USING_WIDE()) {
+	WCHAR wBuffer[MAX_PATH];
+	A2WHELPER(dirname, wBuffer, sizeof(wBuffer));
+	ret = m_pvDir->SetCurrentDirectoryW(wBuffer);
+    }
+    else
+	ret = m_pvDir->SetCurrentDirectoryA((char*)dirname);
+    if(ret < 0) {
+	errno = ENOENT;
+    }
+    return ret;
+}
+
+#endif /* ___PerlHost_H___ */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/perlio.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/perlio.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/perlio.h	(revision 14489)
@@ -0,0 +1,386 @@
+/*    perlio.h
+ *
+ *    Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003,
+ *    by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifndef _PERLIO_H
+#define _PERLIO_H
+/*
+  Interface for perl to IO functions.
+  There is a hierarchy of Configure determined #define controls:
+   USE_STDIO   - forces PerlIO_xxx() to be #define-d onto stdio functions.
+                 This is used for x2p subdirectory and for conservative
+                 builds - "just like perl5.00X used to be".
+                 This dominates over the others.
+
+   USE_PERLIO  - The primary Configure variable that enables PerlIO.
+                 If USE_PERLIO is _NOT_ set
+                   then USE_STDIO above will be set to be conservative.
+                 If USE_PERLIO is set
+                   then there are two modes determined by USE_SFIO:
+
+   USE_SFIO    - If set causes PerlIO_xxx() to be #define-d onto sfio functions.
+                 A backward compatability mode for some specialist applications.
+
+                 If USE_SFIO is not set then PerlIO_xxx() are real functions
+                 defined in perlio.c which implement extra functionality
+                 required for utf8 support.
+
+   One further note - the table-of-functions scheme controlled
+   by PERL_IMPLICIT_SYS turns on USE_PERLIO so that iperlsys.h can
+   #define PerlIO_xxx() to go via the function table, without having
+   to #undef them from (say) stdio forms.
+
+*/
+
+#if defined(PERL_IMPLICIT_SYS)
+#ifndef USE_PERLIO
+#ifndef NETWARE
+/* # define USE_PERLIO */
+#endif
+#endif
+#endif
+
+#ifndef USE_PERLIO
+# define USE_STDIO
+#endif
+
+#ifdef USE_STDIO
+#  ifndef PERLIO_IS_STDIO
+#      define PERLIO_IS_STDIO
+#  endif
+#endif
+
+/* --------------------  End of Configure controls ---------------------------- */
+
+/*
+ * Although we may not want stdio to be used including <stdio.h> here
+ * avoids issues where stdio.h has strange side effects
+ */
+#include <stdio.h>
+
+#ifdef __BEOS__
+int fseeko(FILE *stream, off_t offset, int whence);
+off_t ftello(FILE *stream);
+#endif
+
+#if defined(USE_64_BIT_STDIO) && defined(HAS_FTELLO) && !defined(USE_FTELL64)
+#define ftell ftello
+#endif
+
+#if defined(USE_64_BIT_STDIO) && defined(HAS_FSEEKO) && !defined(USE_FSEEK64)
+#define fseek fseeko
+#endif
+
+/* BS2000 includes are sometimes a bit non standard :-( */
+#if defined(POSIX_BC) && defined(O_BINARY) && !defined(O_TEXT)
+#undef O_BINARY
+#endif
+
+#ifdef PERLIO_IS_STDIO
+/* #define PerlIO_xxxx() as equivalent stdio function */
+#include "perlsdio.h"
+#else				/* PERLIO_IS_STDIO */
+#ifdef USE_SFIO
+/* #define PerlIO_xxxx() as equivalent sfio function */
+#include "perlsfio.h"
+#endif				/* USE_SFIO */
+#endif				/* PERLIO_IS_STDIO */
+
+#ifndef PerlIO
+/* ----------- PerlIO implementation ---------- */
+/* PerlIO not #define-d to something else - define the implementation */
+
+typedef struct _PerlIO PerlIOl;
+typedef struct _PerlIO_funcs PerlIO_funcs;
+typedef PerlIOl *PerlIO;
+#define PerlIO PerlIO
+#define PERLIO_LAYERS 1
+
+/* Making the big PerlIO_funcs vtables const is good (enables placing
+ * them in the const section which is good for speed, security, and
+ * embeddability) but this cannot be done by default because of
+ * backward compatibility. */
+#ifdef PERLIO_FUNCS_CONST
+#define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
+#define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
+#else
+#define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
+#define PERLIO_FUNCS_CAST(funcs) (funcs)
+#endif
+
+PERL_EXPORT_C void PerlIO_define_layer(pTHX_ PerlIO_funcs *tab);
+PERL_EXPORT_C PerlIO_funcs *PerlIO_find_layer(pTHX_ const char *name,
+                                              STRLEN len,
+				              int load);
+PERL_EXPORT_C PerlIO *PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab),
+			          const char *mode, SV *arg);
+PERL_EXPORT_C void PerlIO_pop(pTHX_ PerlIO *f);
+PERL_EXPORT_C AV* PerlIO_get_layers(pTHX_ PerlIO *f);
+PERL_EXPORT_C void PerlIO_clone(pTHX_ PerlInterpreter *proto,
+                                CLONE_PARAMS *param);
+
+#endif				/* PerlIO */
+
+/* ----------- End of implementation choices  ---------- */
+
+#ifndef PERLIO_IS_STDIO
+/* Not using stdio _directly_ as PerlIO */
+
+/* We now need to determine  what happens if source trys to use stdio.
+ * There are three cases based on PERLIO_NOT_STDIO which XS code
+ * can set how it wants.
+ */
+
+#ifdef PERL_CORE
+/* Make a choice for perl core code
+   - currently this is set to try and catch lingering raw stdio calls.
+     This is a known issue with some non UNIX ports which still use
+     "native" stdio features.
+*/
+#ifndef PERLIO_NOT_STDIO
+#define PERLIO_NOT_STDIO 1
+#endif
+#else
+#ifndef PERLIO_NOT_STDIO
+#define PERLIO_NOT_STDIO 0
+#endif
+#endif
+
+#ifdef PERLIO_NOT_STDIO
+#if PERLIO_NOT_STDIO
+/*
+ * PERLIO_NOT_STDIO #define'd as 1
+ * Case 1: Strong denial of stdio - make all stdio calls (we can think of) errors
+ */
+#include "nostdio.h"
+#else				/* if PERLIO_NOT_STDIO */
+/*
+ * PERLIO_NOT_STDIO #define'd as 0
+ * Case 2: Declares that both PerlIO and stdio can be used
+ */
+#endif				/* if PERLIO_NOT_STDIO */
+#else				/* ifdef PERLIO_NOT_STDIO */
+/*
+ * PERLIO_NOT_STDIO not defined
+ * Case 3: Try and fake stdio calls as PerlIO calls
+ */
+#include "fakesdio.h"
+#endif				/* ifndef PERLIO_NOT_STDIO */
+#endif				/* PERLIO_IS_STDIO */
+
+#define specialCopIO(sv) ((sv) == Nullsv)
+
+/* ----------- fill in things that have not got #define'd  ---------- */
+
+#ifndef Fpos_t
+#define Fpos_t Off_t
+#endif
+
+#ifndef EOF
+#define EOF (-1)
+#endif
+
+/* This is to catch case with no stdio */
+#ifndef BUFSIZ
+#define BUFSIZ 1024
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+#define PERLIO_DUP_CLONE	1
+#define PERLIO_DUP_FD		2
+
+/* --------------------- Now prototypes for functions --------------- */
+
+START_EXTERN_C
+#ifndef __attribute__format__
+#  ifdef HASATTRIBUTE_FORMAT
+#    define __attribute__format__(x,y,z) __attribute__((format(x,y,z)))
+#  else
+#    define __attribute__format__(x,y,z)
+#  endif
+#endif
+#ifndef PerlIO_init
+PERL_EXPORT_C void PerlIO_init(pTHX);
+#endif
+#ifndef PerlIO_stdoutf
+PERL_EXPORT_C int PerlIO_stdoutf(const char *, ...)
+    __attribute__format__(__printf__, 1, 2);
+#endif
+#ifndef PerlIO_puts
+PERL_EXPORT_C int PerlIO_puts(PerlIO *, const char *);
+#endif
+#ifndef PerlIO_open
+PERL_EXPORT_C PerlIO *PerlIO_open(const char *, const char *);
+#endif
+#ifndef PerlIO_openn
+PERL_EXPORT_C PerlIO *PerlIO_openn(pTHX_ const char *layers, const char *mode,
+				   int fd, int imode, int perm, PerlIO *old,
+				   int narg, SV **arg);
+#endif
+#ifndef PerlIO_eof
+PERL_EXPORT_C int PerlIO_eof(PerlIO *);
+#endif
+#ifndef PerlIO_error
+PERL_EXPORT_C int PerlIO_error(PerlIO *);
+#endif
+#ifndef PerlIO_clearerr
+PERL_EXPORT_C void PerlIO_clearerr(PerlIO *);
+#endif
+#ifndef PerlIO_getc
+PERL_EXPORT_C int PerlIO_getc(PerlIO *);
+#endif
+#ifndef PerlIO_putc
+PERL_EXPORT_C int PerlIO_putc(PerlIO *, int);
+#endif
+#ifndef PerlIO_ungetc
+PERL_EXPORT_C int PerlIO_ungetc(PerlIO *, int);
+#endif
+#ifndef PerlIO_fdopen
+PERL_EXPORT_C PerlIO *PerlIO_fdopen(int, const char *);
+#endif
+#ifndef PerlIO_importFILE
+PERL_EXPORT_C PerlIO *PerlIO_importFILE(FILE *, const char *);
+#endif
+#ifndef PerlIO_exportFILE
+PERL_EXPORT_C FILE *PerlIO_exportFILE(PerlIO *, const char *);
+#endif
+#ifndef PerlIO_findFILE
+PERL_EXPORT_C FILE *PerlIO_findFILE(PerlIO *);
+#endif
+#ifndef PerlIO_releaseFILE
+PERL_EXPORT_C void PerlIO_releaseFILE(PerlIO *, FILE *);
+#endif
+#ifndef PerlIO_read
+PERL_EXPORT_C SSize_t PerlIO_read(PerlIO *, void *, Size_t);
+#endif
+#ifndef PerlIO_unread
+PERL_EXPORT_C SSize_t PerlIO_unread(PerlIO *, const void *, Size_t);
+#endif
+#ifndef PerlIO_write
+PERL_EXPORT_C SSize_t PerlIO_write(PerlIO *, const void *, Size_t);
+#endif
+#ifndef PerlIO_setlinebuf
+PERL_EXPORT_C void PerlIO_setlinebuf(PerlIO *);
+#endif
+#ifndef PerlIO_printf
+PERL_EXPORT_C int PerlIO_printf(PerlIO *, const char *, ...)
+    __attribute__format__(__printf__, 2, 3);
+#endif
+#ifndef PerlIO_sprintf
+PERL_EXPORT_C int PerlIO_sprintf(char *, int, const char *, ...)
+    __attribute__format__(__printf__, 3, 4);
+#endif
+#ifndef PerlIO_vprintf
+PERL_EXPORT_C int PerlIO_vprintf(PerlIO *, const char *, va_list);
+#endif
+#ifndef PerlIO_tell
+PERL_EXPORT_C Off_t PerlIO_tell(PerlIO *);
+#endif
+#ifndef PerlIO_seek
+PERL_EXPORT_C int PerlIO_seek(PerlIO *, Off_t, int);
+#endif
+#ifndef PerlIO_rewind
+PERL_EXPORT_C void PerlIO_rewind(PerlIO *);
+#endif
+#ifndef PerlIO_has_base
+PERL_EXPORT_C int PerlIO_has_base(PerlIO *);
+#endif
+#ifndef PerlIO_has_cntptr
+PERL_EXPORT_C int PerlIO_has_cntptr(PerlIO *);
+#endif
+#ifndef PerlIO_fast_gets
+PERL_EXPORT_C int PerlIO_fast_gets(PerlIO *);
+#endif
+#ifndef PerlIO_canset_cnt
+PERL_EXPORT_C int PerlIO_canset_cnt(PerlIO *);
+#endif
+#ifndef PerlIO_get_ptr
+PERL_EXPORT_C STDCHAR *PerlIO_get_ptr(PerlIO *);
+#endif
+#ifndef PerlIO_get_cnt
+PERL_EXPORT_C int PerlIO_get_cnt(PerlIO *);
+#endif
+#ifndef PerlIO_set_cnt
+PERL_EXPORT_C void PerlIO_set_cnt(PerlIO *, int);
+#endif
+#ifndef PerlIO_set_ptrcnt
+PERL_EXPORT_C void PerlIO_set_ptrcnt(PerlIO *, STDCHAR *, int);
+#endif
+#ifndef PerlIO_get_base
+PERL_EXPORT_C STDCHAR *PerlIO_get_base(PerlIO *);
+#endif
+#ifndef PerlIO_get_bufsiz
+PERL_EXPORT_C int PerlIO_get_bufsiz(PerlIO *);
+#endif
+#ifndef PerlIO_tmpfile
+PERL_EXPORT_C PerlIO *PerlIO_tmpfile(void);
+#endif
+#ifndef PerlIO_stdin
+PERL_EXPORT_C PerlIO *PerlIO_stdin(void);
+#endif
+#ifndef PerlIO_stdout
+PERL_EXPORT_C PerlIO *PerlIO_stdout(void);
+#endif
+#ifndef PerlIO_stderr
+PERL_EXPORT_C PerlIO *PerlIO_stderr(void);
+#endif
+#ifndef PerlIO_getpos
+PERL_EXPORT_C int PerlIO_getpos(PerlIO *, SV *);
+#endif
+#ifndef PerlIO_setpos
+PERL_EXPORT_C int PerlIO_setpos(PerlIO *, SV *);
+#endif
+#ifndef PerlIO_fdupopen
+PERL_EXPORT_C PerlIO *PerlIO_fdupopen(pTHX_ PerlIO *, CLONE_PARAMS *, int);
+#endif
+#if !defined(PerlIO_modestr) && !defined(PERLIO_IS_STDIO)
+PERL_EXPORT_C char *PerlIO_modestr(PerlIO *, char *buf);
+#endif
+#ifndef PerlIO_isutf8
+PERL_EXPORT_C int PerlIO_isutf8(PerlIO *);
+#endif
+#ifndef PerlIO_apply_layers
+PERL_EXPORT_C int PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode,
+				      const char *names);
+#endif
+#ifndef PerlIO_binmode
+PERL_EXPORT_C int PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int omode,
+			  	 const char *names);
+#endif
+#ifndef PerlIO_getname
+PERL_EXPORT_C char *PerlIO_getname(PerlIO *, char *);
+#endif
+
+PERL_EXPORT_C void PerlIO_destruct(pTHX);
+
+PERL_EXPORT_C int PerlIO_intmode2str(int rawmode, char *mode, int *writing);
+
+#ifdef PERLIO_LAYERS
+PERL_EXPORT_C void PerlIO_cleanup(pTHX);
+
+PERL_EXPORT_C void PerlIO_debug(const char *fmt, ...)
+    __attribute__format__(__printf__, 1, 2);
+typedef struct PerlIO_list_s PerlIO_list_t;
+
+
+#endif
+
+END_EXTERN_C
+#endif				/* _PERLIO_H */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/perliol.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/perliol.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/perliol.h	(revision 14489)
@@ -0,0 +1,283 @@
+#ifndef _PERLIOL_H
+#define _PERLIOL_H
+
+typedef struct {
+    PerlIO_funcs *funcs;
+    SV *arg;
+} PerlIO_pair_t;
+
+struct PerlIO_list_s {
+    IV refcnt;
+    IV cur;
+    IV len;
+    PerlIO_pair_t *array;
+};
+
+struct _PerlIO_funcs {
+    Size_t fsize;
+    const char *name;
+    Size_t size;
+    U32 kind;
+    IV (*Pushed) (pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+    IV (*Popped) (pTHX_ PerlIO *f);
+    PerlIO *(*Open) (pTHX_ PerlIO_funcs *tab,
+		     PerlIO_list_t *layers, IV n,
+		     const char *mode,
+		     int fd, int imode, int perm,
+		     PerlIO *old, int narg, SV **args);
+    IV (*Binmode)(pTHX_ PerlIO *f);
+    SV *(*Getarg) (pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags);
+    IV (*Fileno) (pTHX_ PerlIO *f);
+    PerlIO *(*Dup) (pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+    /* Unix-like functions - cf sfio line disciplines */
+     SSize_t(*Read) (pTHX_ PerlIO *f, void *vbuf, Size_t count);
+     SSize_t(*Unread) (pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+     SSize_t(*Write) (pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+    IV (*Seek) (pTHX_ PerlIO *f, Off_t offset, int whence);
+     Off_t(*Tell) (pTHX_ PerlIO *f);
+    IV (*Close) (pTHX_ PerlIO *f);
+    /* Stdio-like buffered IO functions */
+    IV (*Flush) (pTHX_ PerlIO *f);
+    IV (*Fill) (pTHX_ PerlIO *f);
+    IV (*Eof) (pTHX_ PerlIO *f);
+    IV (*Error) (pTHX_ PerlIO *f);
+    void (*Clearerr) (pTHX_ PerlIO *f);
+    void (*Setlinebuf) (pTHX_ PerlIO *f);
+    /* Perl's snooping functions */
+    STDCHAR *(*Get_base) (pTHX_ PerlIO *f);
+     Size_t(*Get_bufsiz) (pTHX_ PerlIO *f);
+    STDCHAR *(*Get_ptr) (pTHX_ PerlIO *f);
+     SSize_t(*Get_cnt) (pTHX_ PerlIO *f);
+    void (*Set_ptrcnt) (pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt);
+};
+
+/*--------------------------------------------------------------------------------------*/
+/* Kind values */
+#define PERLIO_K_RAW		0x00000001
+#define PERLIO_K_BUFFERED	0x00000002
+#define PERLIO_K_CANCRLF	0x00000004
+#define PERLIO_K_FASTGETS	0x00000008
+#define PERLIO_K_DUMMY		0x00000010
+#define PERLIO_K_UTF8		0x00008000
+#define PERLIO_K_DESTRUCT	0x00010000
+#define PERLIO_K_MULTIARG	0x00020000
+
+/*--------------------------------------------------------------------------------------*/
+struct _PerlIO {
+    PerlIOl *next;		/* Lower layer */
+    PerlIO_funcs *tab;		/* Functions for this layer */
+    U32 flags;			/* Various flags for state */
+};
+
+/*--------------------------------------------------------------------------------------*/
+
+/* Flag values */
+#define PERLIO_F_EOF		0x00000100
+#define PERLIO_F_CANWRITE	0x00000200
+#define PERLIO_F_CANREAD	0x00000400
+#define PERLIO_F_ERROR		0x00000800
+#define PERLIO_F_TRUNCATE	0x00001000
+#define PERLIO_F_APPEND		0x00002000
+#define PERLIO_F_CRLF		0x00004000
+#define PERLIO_F_UTF8		0x00008000
+#define PERLIO_F_UNBUF		0x00010000
+#define PERLIO_F_WRBUF		0x00020000
+#define PERLIO_F_RDBUF		0x00040000
+#define PERLIO_F_LINEBUF	0x00080000
+#define PERLIO_F_TEMP		0x00100000
+#define PERLIO_F_OPEN		0x00200000
+#define PERLIO_F_FASTGETS	0x00400000
+#define PERLIO_F_TTY		0x00800000
+#define PERLIO_F_NOTREG         0x01000000   
+
+#define PerlIOBase(f)      (*(f))
+#define PerlIOSelf(f,type) ((type *)PerlIOBase(f))
+#define PerlIONext(f)      (&(PerlIOBase(f)->next))
+#define PerlIOValid(f)     ((f) && *(f))
+
+/*--------------------------------------------------------------------------------------*/
+/* Data exports - EXTCONST rather than extern is needed for Cygwin */
+#undef EXTPERLIO 
+#ifdef PERLIO_FUNCS_CONST
+#define EXTPERLIO EXTCONST
+#else
+#define EXTPERLIO EXT
+#endif
+EXTPERLIO PerlIO_funcs PerlIO_unix;
+EXTPERLIO PerlIO_funcs PerlIO_perlio;
+EXTPERLIO PerlIO_funcs PerlIO_stdio;
+EXTPERLIO PerlIO_funcs PerlIO_crlf;
+EXTPERLIO PerlIO_funcs PerlIO_utf8;
+EXTPERLIO PerlIO_funcs PerlIO_byte;
+EXTPERLIO PerlIO_funcs PerlIO_raw;
+EXTPERLIO PerlIO_funcs PerlIO_pending;
+#ifdef HAS_MMAP
+EXTPERLIO PerlIO_funcs PerlIO_mmap;
+#endif
+#ifdef WIN32
+EXTPERLIO PerlIO_funcs PerlIO_win32;
+#endif
+PERL_EXPORT_C PerlIO *PerlIO_allocate(pTHX);
+PERL_EXPORT_C SV *PerlIO_arg_fetch(PerlIO_list_t *av, IV n);
+#define PerlIOArg PerlIO_arg_fetch(layers,n)
+
+#ifdef PERLIO_USING_CRLF
+#define PERLIO_STDTEXT "t"
+#else
+#define PERLIO_STDTEXT ""
+#endif
+
+/*--------------------------------------------------------------------------------------*/
+/* perlio buffer layer
+   As this is reasonably generic its struct and "methods" are declared here
+   so they can be used to "inherit" from it.
+*/
+
+typedef struct {
+    struct _PerlIO base;	/* Base "class" info */
+    STDCHAR *buf;		/* Start of buffer */
+    STDCHAR *end;		/* End of valid part of buffer */
+    STDCHAR *ptr;		/* Current position in buffer */
+    Off_t posn;			/* Offset of buf into the file */
+    Size_t bufsiz;		/* Real size of buffer */
+    IV oneword;			/* Emergency buffer */
+} PerlIOBuf;
+
+PERL_EXPORT_C int PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
+		    PerlIO_list_t *layers, IV n, IV max);
+PERL_EXPORT_C int PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names);
+PERL_EXPORT_C PerlIO_funcs *PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def);
+
+
+PERL_EXPORT_C SV *PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param);
+PERL_EXPORT_C void PerlIO_cleantable(pTHX_ PerlIO **tablep);
+PERL_EXPORT_C SV * PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab);
+PERL_EXPORT_C void PerlIO_default_buffer(pTHX_ PerlIO_list_t *av);
+PERL_EXPORT_C void PerlIO_stdstreams(pTHX);
+PERL_EXPORT_C int PerlIO__close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO_list_t * PerlIO_resolve_layers(pTHX_ const char *layers, const char *mode, int narg, SV **args);
+PERL_EXPORT_C PerlIO_funcs * PerlIO_default_layer(pTHX_ I32 n);
+PERL_EXPORT_C PerlIO_list_t * PerlIO_default_layers(pTHX);
+PERL_EXPORT_C PerlIO * PerlIO_reopen(const char *path, const char *mode, PerlIO *f);
+PERL_EXPORT_C int PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
+                __attribute__format__(__printf__,3,0);
+
+PERL_EXPORT_C PerlIO_list_t *PerlIO_list_alloc(pTHX);
+PERL_EXPORT_C PerlIO_list_t *PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param);
+PERL_EXPORT_C void PerlIO_list_free(pTHX_ PerlIO_list_t *list);
+PERL_EXPORT_C void PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg);
+PERL_EXPORT_C void PerlIO_list_free(pTHX_ PerlIO_list_t *list);
+
+/*--------------------------------------------------------------------------------------*/
+/* Generic, or stub layer functions */
+
+PERL_EXPORT_C IV        PerlIOBase_binmode(pTHX_ PerlIO *f);
+PERL_EXPORT_C void      PerlIOBase_clearerr(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOBase_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO *  PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+PERL_EXPORT_C IV        PerlIOBase_eof(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOBase_error(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOBase_fileno(pTHX_ PerlIO *f);
+PERL_EXPORT_C void      PerlIOBase_flush_linebuf(pTHX);
+PERL_EXPORT_C IV        PerlIOBase_noop_fail(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOBase_noop_ok(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOBase_popped(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C SSize_t   PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+PERL_EXPORT_C void      PerlIOBase_setlinebuf(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t   PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Buf */
+PERL_EXPORT_C Size_t    PerlIOBuf_bufsiz(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOBuf_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO *  PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+PERL_EXPORT_C IV        PerlIOBuf_fill(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOBuf_flush(pTHX_ PerlIO *f);
+PERL_EXPORT_C STDCHAR * PerlIOBuf_get_base(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t   PerlIOBuf_get_cnt(pTHX_ PerlIO *f);
+PERL_EXPORT_C STDCHAR * PerlIOBuf_get_ptr(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO *  PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args);
+PERL_EXPORT_C IV        PerlIOBuf_popped(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C SSize_t   PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+PERL_EXPORT_C IV        PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+PERL_EXPORT_C void      PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt);
+PERL_EXPORT_C Off_t     PerlIOBuf_tell(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t   PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+PERL_EXPORT_C SSize_t   PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Crlf */
+PERL_EXPORT_C IV        PerlIOCrlf_binmode(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOCrlf_flush(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t   PerlIOCrlf_get_cnt(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C void      PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt);
+PERL_EXPORT_C SSize_t   PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+PERL_EXPORT_C SSize_t   PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+PERL_EXPORT_C SSize_t   PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Mmap */
+PERL_EXPORT_C IV        PerlIOMmap_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO *  PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+PERL_EXPORT_C IV        PerlIOMmap_fill(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOMmap_flush(pTHX_ PerlIO *f);
+PERL_EXPORT_C STDCHAR * PerlIOMmap_get_base(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOMmap_map(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOMmap_unmap(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t   PerlIOMmap_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+PERL_EXPORT_C SSize_t   PerlIOMmap_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Pending */
+PERL_EXPORT_C IV        PerlIOPending_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOPending_fill(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOPending_flush(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C SSize_t   PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+PERL_EXPORT_C IV        PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+PERL_EXPORT_C void      PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt);
+
+/* Pop */
+PERL_EXPORT_C IV        PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+
+/* Raw */
+PERL_EXPORT_C PerlIO *  PerlIORaw_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args);
+PERL_EXPORT_C IV        PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+
+/* Stdio */
+PERL_EXPORT_C void      PerlIOStdio_clearerr(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOStdio_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO *  PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+PERL_EXPORT_C IV        PerlIOStdio_eof(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOStdio_error(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOStdio_fileno(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOStdio_fill(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV        PerlIOStdio_flush(pTHX_ PerlIO *f);
+PERL_EXPORT_C STDCHAR * PerlIOStdio_get_base(pTHX_ PerlIO *f);
+PERL_EXPORT_C char *    PerlIOStdio_mode(const char *mode, char *tmode);
+PERL_EXPORT_C PerlIO *  PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args);
+PERL_EXPORT_C IV        PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C SSize_t   PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+PERL_EXPORT_C IV        PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+PERL_EXPORT_C void      PerlIOStdio_setlinebuf(pTHX_ PerlIO *f);
+PERL_EXPORT_C Off_t     PerlIOStdio_tell(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t   PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+PERL_EXPORT_C SSize_t   PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Unix */
+PERL_EXPORT_C IV        PerlIOUnix_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO *  PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+PERL_EXPORT_C IV        PerlIOUnix_fileno(pTHX_ PerlIO *f);
+PERL_EXPORT_C int       PerlIOUnix_oflags(const char *mode);
+PERL_EXPORT_C PerlIO *  PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args);
+PERL_EXPORT_C IV        PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C SSize_t   PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+PERL_EXPORT_C int       PerlIOUnix_refcnt_dec(int fd);
+PERL_EXPORT_C void      PerlIOUnix_refcnt_inc(int fd);
+PERL_EXPORT_C IV        PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+PERL_EXPORT_C Off_t     PerlIOUnix_tell(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t   PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Utf8 */
+PERL_EXPORT_C IV        PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+
+#endif				/* _PERLIOL_H */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/perlsdio.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/perlsdio.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/perlsdio.h	(revision 14489)
@@ -0,0 +1,154 @@
+/*    perlsdio.h
+ *
+ *    Copyright (C) 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifdef PERLIO_IS_STDIO
+
+#ifdef NETWARE
+	#include "nwstdio.h"
+#else
+
+/*
+ * This file #define-s the PerlIO_xxx abstraction onto stdio functions.
+ * Make this as close to original stdio as possible.
+ */
+#define PerlIO				FILE
+#define PerlIO_stderr()			PerlSIO_stderr
+#define PerlIO_stdout()			PerlSIO_stdout
+#define PerlIO_stdin()			PerlSIO_stdin
+
+#define PerlIO_isutf8(f)		0
+
+#define PerlIO_printf			PerlSIO_printf
+#define PerlIO_stdoutf			PerlSIO_stdoutf
+#define PerlIO_vprintf(f,fmt,a)		PerlSIO_vprintf(f,fmt,a)
+#define PerlIO_write(f,buf,count)	PerlSIO_fwrite(buf,1,count,f)
+#define PerlIO_unread(f,buf,count)	(-1)
+#define PerlIO_open			PerlSIO_fopen
+#define PerlIO_fdopen			PerlSIO_fdopen
+#define PerlIO_reopen			PerlSIO_freopen
+#define PerlIO_close(f)			PerlSIO_fclose(f)
+#define PerlIO_puts(f,s)		PerlSIO_fputs(f,s)
+#define PerlIO_putc(f,c)		PerlSIO_fputc(f,c)
+#if defined(VMS)
+#  if defined(__DECC)
+     /* Unusual definition of ungetc() here to accomodate fast_sv_gets()'
+      * belief that it can mix getc/ungetc with reads from stdio buffer */
+     int decc$ungetc(int __c, FILE *__stream);
+#    define PerlIO_ungetc(f,c) ((c) == EOF ? EOF : \
+            ((*(f) && !((*(f))->_flag & _IONBF) && \
+            ((*(f))->_ptr > (*(f))->_base)) ? \
+            ((*(f))->_cnt++, *(--(*(f))->_ptr) = (c)) : decc$ungetc(c,f)))
+#  else
+#    define PerlIO_ungetc(f,c)		ungetc(c,f)
+#  endif
+   /* Work around bug in DECCRTL/AXP (DECC v5.x) and some versions of old
+    * VAXCRTL which causes read from a pipe after EOF has been returned
+    * once to hang.
+    */
+#  define PerlIO_getc(f) \
+		(feof(f) ? EOF : getc(f))
+#  define PerlIO_read(f,buf,count) \
+		(feof(f) ? 0 : (SSize_t)fread(buf,1,count,f))
+#  define PerlIO_tell(f)		ftell(f)
+#else
+#  define PerlIO_getc(f)		PerlSIO_fgetc(f)
+#  define PerlIO_ungetc(f,c)		PerlSIO_ungetc(c,f)
+#  define PerlIO_read(f,buf,count)	(SSize_t)PerlSIO_fread(buf,1,count,f)
+#  define PerlIO_tell(f)		PerlSIO_ftell(f)
+#endif
+#define PerlIO_eof(f)			PerlSIO_feof(f)
+#define PerlIO_getname(f,b)		fgetname(f,b)
+#define PerlIO_error(f)			PerlSIO_ferror(f)
+#define PerlIO_fileno(f)		PerlSIO_fileno(f)
+#define PerlIO_clearerr(f)		PerlSIO_clearerr(f)
+#define PerlIO_flush(f)			PerlSIO_fflush(f)
+#if defined(VMS) && !defined(__DECC)
+/* Old VAXC RTL doesn't reset EOF on seek; Perl folk seem to expect this */
+#define PerlIO_seek(f,o,w)	(((f) && (*f) && ((*f)->_flag &= ~_IOEOF)),fseek(f,o,w))
+#else
+#  define PerlIO_seek(f,o,w)		PerlSIO_fseek(f,o,w)
+#endif
+
+#define PerlIO_rewind(f)		PerlSIO_rewind(f)
+#define PerlIO_tmpfile()		PerlSIO_tmpfile()
+
+#define PerlIO_importFILE(f,fl)		(f)
+#define PerlIO_exportFILE(f,fl)		(f)
+#define PerlIO_findFILE(f)		(f)
+#define PerlIO_releaseFILE(p,f)		((void) 0)
+
+#ifdef HAS_SETLINEBUF
+#define PerlIO_setlinebuf(f)		PerlSIO_setlinebuf(f);
+#else
+#define PerlIO_setlinebuf(f)		PerlSIO_setvbuf(f, Nullch, _IOLBF, 0);
+#endif
+
+/* Now our interface to Configure's FILE_xxx macros */
+
+#ifdef USE_STDIO_PTR
+#define PerlIO_has_cntptr(f)		1
+#define PerlIO_get_ptr(f)		PerlSIO_get_ptr(f)
+#define PerlIO_get_cnt(f)		PerlSIO_get_cnt(f)
+
+#ifdef STDIO_CNT_LVALUE
+#define PerlIO_canset_cnt(f)		1
+#define PerlIO_set_cnt(f,c)		PerlSIO_set_cnt(f,c)
+#ifdef STDIO_PTR_LVALUE
+#ifdef STDIO_PTR_LVAL_NOCHANGE_CNT
+#define PerlIO_fast_gets(f)		1
+#endif
+#endif /* STDIO_PTR_LVALUE */
+#else /* STDIO_CNT_LVALUE */
+#define PerlIO_canset_cnt(f)		0
+#define PerlIO_set_cnt(f,c)		abort()
+#endif
+
+#ifdef STDIO_PTR_LVALUE
+#ifdef STDIO_PTR_LVAL_NOCHANGE_CNT
+#define PerlIO_set_ptrcnt(f,p,c)      STMT_START {PerlSIO_set_ptr(f,p), PerlIO_set_cnt(f,c);} STMT_END
+#else
+#ifdef STDIO_PTR_LVAL_SETS_CNT
+/* assert() may pre-process to ""; potential syntax error (FILE_ptr(), ) */
+#define PerlIO_set_ptrcnt(f,p,c)      STMT_START {PerlSIO_set_ptr(f,p); assert(PerlSIO_get_cnt(f) == (c));} STMT_END
+#define PerlIO_fast_gets(f)		1
+#else
+#define PerlIO_set_ptrcnt(f,p,c)	abort()
+#endif
+#endif
+#endif
+
+#else  /* USE_STDIO_PTR */
+
+#define PerlIO_has_cntptr(f)		0
+#define PerlIO_canset_cnt(f)		0
+#define PerlIO_get_cnt(f)		(abort(),0)
+#define PerlIO_get_ptr(f)		(abort(),(void *)0)
+#define PerlIO_set_cnt(f,c)		abort()
+#define PerlIO_set_ptrcnt(f,p,c)	abort()
+
+#endif /* USE_STDIO_PTR */
+
+#ifndef PerlIO_fast_gets
+#define PerlIO_fast_gets(f)		0
+#endif
+
+
+#ifdef FILE_base
+#define PerlIO_has_base(f)		1
+#define PerlIO_get_base(f)		PerlSIO_get_base(f)
+#define PerlIO_get_bufsiz(f)		PerlSIO_get_bufsiz(f)
+#else
+#define PerlIO_has_base(f)		0
+#define PerlIO_get_base(f)		(abort(),(void *)0)
+#define PerlIO_get_bufsiz(f)		(abort(),0)
+#endif
+
+#endif	/* NETWARE */
+#endif /* PERLIO_IS_STDIO */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/perlsfio.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/perlsfio.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/perlsfio.h	(revision 14489)
@@ -0,0 +1,75 @@
+/*    perlsfio.h
+ *
+ *    Copyright (C) 1996, 1999, 2000, 2001, 2002, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/* The next #ifdef should be redundant if Configure behaves ... */
+#ifndef FILE
+#define FILE FILE
+#endif
+#ifdef I_SFIO
+#include <sfio.h>
+#endif
+
+/* sfio 2000 changed _stdopen to _stdfdopen */
+#if SFIO_VERSION >= 20000101L
+#define _stdopen _stdfdopen
+#endif
+
+extern Sfio_t*	_stdopen _ARG_((int, const char*));
+extern int	_stdprintf _ARG_((const char*, ...));
+
+#define PerlIO				Sfio_t
+#define PerlIO_stderr()			sfstderr
+#define PerlIO_stdout()			sfstdout
+#define PerlIO_stdin()			sfstdin
+
+#define PerlIO_isutf8(f)		0
+
+#define PerlIO_printf			sfprintf
+#define PerlIO_stdoutf			_stdprintf
+#define PerlIO_vprintf(f,fmt,a)		sfvprintf(f,fmt,a)
+#define PerlIO_read(f,buf,count)	sfread(f,buf,count)
+#define PerlIO_write(f,buf,count)	sfwrite(f,buf,count)
+#define PerlIO_open(path,mode)		sfopen(NULL,path,mode)
+#define PerlIO_fdopen(fd,mode)		_stdopen(fd,mode)
+#define PerlIO_reopen(path,mode,f)	sfopen(f,path,mode)
+#define PerlIO_close(f)			sfclose(f)
+#define PerlIO_puts(f,s)		sfputr(f,s,-1)
+#define PerlIO_putc(f,c)		sfputc(f,c)
+#define PerlIO_ungetc(f,c)		sfungetc(f,c)
+#define PerlIO_sprintf			sfsprintf
+#define PerlIO_getc(f)			sfgetc(f)
+#define PerlIO_eof(f)			sfeof(f)
+#define PerlIO_error(f)			sferror(f)
+#define PerlIO_fileno(f)		sffileno(f)
+#define PerlIO_clearerr(f)		sfclrerr(f)
+#define PerlIO_flush(f)			sfsync(f)
+#define PerlIO_tell(f)			sftell(f)
+#define PerlIO_seek(f,o,w)		sfseek(f,o,w)
+#define PerlIO_rewind(f)		(void) sfseek((f),0L,0)
+#define PerlIO_tmpfile()		sftmp(0)
+#define PerlIO_exportFILE(f,fl)		Perl_croak(aTHX_ "Export to FILE * unimplemented")
+#define PerlIO_releaseFILE(p,f)		Perl_croak(aTHX_ "Release of FILE * unimplemented")
+
+#define PerlIO_setlinebuf(f)		sfset(f,SF_LINE,1)
+
+/* Now our interface to equivalent of Configure's FILE_xxx macros */
+
+#define PerlIO_has_cntptr(f)		1
+#define PerlIO_get_ptr(f)		((f)->next)
+#define PerlIO_get_cnt(f)		((f)->endr - (f)->next)
+#define PerlIO_canset_cnt(f)		1
+#define PerlIO_fast_gets(f)		1
+#define PerlIO_set_ptrcnt(f,p,c)	STMT_START {(f)->next = (unsigned char *)(p); assert(PerlIO_get_cnt(f) == (c));} STMT_END
+#define PerlIO_set_cnt(f,c)		STMT_START {(f)->next = (f)->endr - (c);} STMT_END
+
+#define PerlIO_has_base(f)		1
+#define PerlIO_get_base(f)		((f)->data)
+#define PerlIO_get_bufsiz(f)		((f)->endr - (f)->data)
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/perlvars.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/perlvars.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/perlvars.h	(revision 14489)
@@ -0,0 +1,74 @@
+/*    perlvars.h
+ *
+ *    Copyright (C) 1999, 2000, 2001, 2002, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/****************/
+/* Truly global */
+/****************/
+
+/* Don't forget to re-run embed.pl to propagate changes! */
+
+/* This file describes the "global" variables used by perl
+ * This used to be in perl.h directly but we want to abstract out into
+ * distinct files which are per-thread, per-interpreter or really global,
+ * and how they're initialized.
+ *
+ * The 'G' prefix is only needed for vars that need appropriate #defines
+ * generated in embed*.h.  Such symbols are also used to generate
+ * the appropriate export list for win32. */
+
+/* global state */
+PERLVAR(Gcurinterp,	PerlInterpreter *)
+					/* currently running interpreter
+					 * (initial parent interpreter under
+					 * useithreads) */
+#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
+PERLVAR(Gthr_key,	perl_key)	/* key to retrieve per-thread struct */
+#endif
+
+/* constants (these are not literals to facilitate pointer comparisons) */
+PERLVARIC(GYes,		char *, "1")
+PERLVARIC(GNo,		char *, "")
+PERLVARIC(Ghexdigit,	char *, "0123456789abcdef0123456789ABCDEF")
+PERLVARIC(Gpatleave,	char *, "\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}")
+
+/* XXX does anyone even use this? */
+PERLVARI(Gdo_undump,	bool,	FALSE)	/* -u or dump seen? */
+
+#if defined(MYMALLOC) && (defined(USE_5005THREADS) || defined(USE_ITHREADS))
+PERLVAR(Gmalloc_mutex,	perl_mutex)	/* Mutex for malloc */
+#endif
+
+#if defined(USE_ITHREADS)
+PERLVAR(Gop_mutex,	perl_mutex)	/* Mutex for op refcounting */
+#endif
+
+#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
+PERLVAR(Gdollarzero_mutex, perl_mutex)	/* Modifying $0 */
+#endif
+
+/* This is constant on most architectures, a global on OS/2 */
+PERLVARI(Gsh_path,	const char *,	SH_PATH)/* full path of shell */
+
+#ifndef PERL_MICRO
+/* If Perl has to ignore SIGPFE, this is its saved state.
+ * See perl.h macros PERL_FPU_INIT and PERL_FPU_{PRE,POST}_EXEC. */
+PERLVAR(Gsigfpe_saved,	Sighandler_t)
+#endif
+
+/* Restricted hashes placeholder value.
+ * The contents are never used, only the address. */
+PERLVAR(Gsv_placeholder, SV)
+
+#ifndef PERL_MICRO
+PERLVARI(Gcsighandlerp,	Sighandler_t, Perl_csighandler)	/* Pointer to C-level sighandler */
+#endif
+
+#ifndef PERL_USE_SAFE_PUTENV
+PERLVARI(Guse_safe_putenv, int, 1)
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/perly.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/perly.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/perly.h	(revision 14489)
@@ -0,0 +1,70 @@
+#ifdef PERL_CORE
+#define WORD 257
+#define METHOD 258
+#define FUNCMETH 259
+#define THING 260
+#define PMFUNC 261
+#define PRIVATEREF 262
+#define FUNC0SUB 263
+#define UNIOPSUB 264
+#define LSTOPSUB 265
+#define LABEL 266
+#define FORMAT 267
+#define SUB 268
+#define ANONSUB 269
+#define PACKAGE 270
+#define USE 271
+#define WHILE 272
+#define UNTIL 273
+#define IF 274
+#define UNLESS 275
+#define ELSE 276
+#define ELSIF 277
+#define CONTINUE 278
+#define FOR 279
+#define LOOPEX 280
+#define DOTDOT 281
+#define FUNC0 282
+#define FUNC1 283
+#define FUNC 284
+#define UNIOP 285
+#define LSTOP 286
+#define RELOP 287
+#define EQOP 288
+#define MULOP 289
+#define ADDOP 290
+#define DOLSHARP 291
+#define DO 292
+#define HASHBRACK 293
+#define NOAMP 294
+#define LOCAL 295
+#define MY 296
+#define MYSUB 297
+#define COLONATTR 298
+#define PREC_LOW 299
+#define OROP 300
+#define ANDOP 301
+#define NOTOP 302
+#define ASSIGNOP 303
+#define OROR 304
+#define ANDAND 305
+#define BITOROP 306
+#define BITANDOP 307
+#define SHIFTOP 308
+#define MATCHOP 309
+#define UMINUS 310
+#define REFGEN 311
+#define POWOP 312
+#define PREINC 313
+#define PREDEC 314
+#define POSTINC 315
+#define POSTDEC 316
+#define ARROW 317
+#endif /* PERL_CORE */
+
+typedef union {
+    I32	ival;
+    char *pval;
+    OP *opval;
+    GV *gvval;
+} YYSTYPE;
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/pp.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/pp.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/pp.h	(revision 14489)
@@ -0,0 +1,505 @@
+/*    pp.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifdef USE_5005THREADS
+#define ARGS thr
+#define dARGS struct perl_thread *thr;
+#else
+#define ARGS
+#define dARGS
+#endif /* USE_5005THREADS */
+
+#define PP(s) OP * Perl_##s(pTHX)
+
+/*
+=head1 Stack Manipulation Macros
+
+=for apidoc AmU||SP
+Stack pointer.  This is usually handled by C<xsubpp>.  See C<dSP> and
+C<SPAGAIN>.
+
+=for apidoc AmU||MARK
+Stack marker variable for the XSUB.  See C<dMARK>.
+
+=for apidoc Am|void|PUSHMARK|SP
+Opening bracket for arguments on a callback.  See C<PUTBACK> and
+L<perlcall>.
+
+=for apidoc Ams||dSP
+Declares a local copy of perl's stack pointer for the XSUB, available via
+the C<SP> macro.  See C<SP>.
+
+=for apidoc ms||djSP
+
+Declare Just C<SP>. This is actually identical to C<dSP>, and declares
+a local copy of perl's stack pointer, available via the C<SP> macro.
+See C<SP>.  (Available for backward source code compatibility with the
+old (Perl 5.005) thread model.)
+
+=for apidoc Ams||dMARK
+Declare a stack marker variable, C<mark>, for the XSUB.  See C<MARK> and
+C<dORIGMARK>.
+
+=for apidoc Ams||dORIGMARK
+Saves the original stack mark for the XSUB.  See C<ORIGMARK>.
+
+=for apidoc AmU||ORIGMARK
+The original stack mark for the XSUB.  See C<dORIGMARK>.
+
+=for apidoc Ams||SPAGAIN
+Refetch the stack pointer.  Used after a callback.  See L<perlcall>.
+
+=cut */
+
+#undef SP /* Solaris 2.7 i386 has this in /usr/include/sys/reg.h */
+#define SP sp
+#define MARK mark
+#define TARG targ
+
+#define PUSHMARK(p)	\
+	STMT_START {					\
+	    if (++PL_markstack_ptr == PL_markstack_max)	\
+	    markstack_grow();				\
+	    *PL_markstack_ptr = (p) - PL_stack_base;	\
+	} STMT_END
+
+#define TOPMARK		(*PL_markstack_ptr)
+#define POPMARK		(*PL_markstack_ptr--)
+
+#define dSP		register SV **sp = PL_stack_sp
+#define djSP		dSP
+#define dMARK		register SV **mark = PL_stack_base + POPMARK
+#define dORIGMARK	const I32 origmark = mark - PL_stack_base
+#define ORIGMARK	(PL_stack_base + origmark)
+
+#define SPAGAIN		sp = PL_stack_sp
+#define MSPAGAIN	STMT_START { sp = PL_stack_sp; mark = ORIGMARK; } STMT_END
+
+#define GETTARGETSTACKED targ = (PL_op->op_flags & OPf_STACKED ? POPs : PAD_SV(PL_op->op_targ))
+#define dTARGETSTACKED SV * GETTARGETSTACKED
+
+#define GETTARGET targ = PAD_SV(PL_op->op_targ)
+#define dTARGET SV * GETTARGET
+
+#define GETATARGET targ = (PL_op->op_flags & OPf_STACKED ? sp[-1] : PAD_SV(PL_op->op_targ))
+#define dATARGET SV * GETATARGET
+
+#define dTARG SV *targ
+
+#define NORMAL PL_op->op_next
+#define DIE return Perl_die
+#ifndef PERL_CORE
+#  define DIE_NULL return DieNull
+#endif
+
+/*
+=for apidoc Ams||PUTBACK
+Closing bracket for XSUB arguments.  This is usually handled by C<xsubpp>.
+See C<PUSHMARK> and L<perlcall> for other uses.
+
+=for apidoc Amn|SV*|POPs
+Pops an SV off the stack.
+
+=for apidoc Amn|char*|POPp
+Pops a string off the stack. Deprecated. New code should use POPpx.
+
+=for apidoc Amn|char*|POPpx
+Pops a string off the stack.
+
+=for apidoc Amn|char*|POPpbytex
+Pops a string off the stack which must consist of bytes i.e. characters < 256.
+
+=for apidoc Amn|NV|POPn
+Pops a double off the stack.
+
+=for apidoc Amn|IV|POPi
+Pops an integer off the stack.
+
+=for apidoc Amn|long|POPl
+Pops a long off the stack.
+
+=cut
+*/
+
+#define PUTBACK		PL_stack_sp = sp
+#define RETURN		return PUTBACK, NORMAL
+#define RETURNOP(o)	return PUTBACK, o
+#define RETURNX(x)	return x, PUTBACK, NORMAL
+
+#define POPs		(*sp--)
+#define POPp		(SvPVx(POPs, PL_na))		/* deprecated */
+#define POPpx		(SvPVx_nolen(POPs))
+#define POPpconstx	(SvPVx_nolen_const(POPs))
+#define POPpbytex	(SvPVbytex_nolen(POPs))
+#define POPn		(SvNVx(POPs))
+#define POPi		((IV)SvIVx(POPs))
+#define POPu		((UV)SvUVx(POPs))
+#define POPl		((long)SvIVx(POPs))
+#define POPul		((unsigned long)SvIVx(POPs))
+#ifdef HAS_QUAD
+#define POPq		((Quad_t)SvIVx(POPs))
+#define POPuq		((Uquad_t)SvUVx(POPs))
+#endif
+
+#define TOPs		(*sp)
+#define TOPm1s		(*(sp-1))
+#define TOPp1s		(*(sp+1))
+#define TOPp		(SvPV(TOPs, PL_na))		/* deprecated */
+#define TOPpx		(SvPV_nolen(TOPs))
+#define TOPn		(SvNV(TOPs))
+#define TOPi		((IV)SvIV(TOPs))
+#define TOPu		((UV)SvUV(TOPs))
+#define TOPl		((long)SvIV(TOPs))
+#define TOPul		((unsigned long)SvUV(TOPs))
+#ifdef HAS_QUAD
+#define TOPq		((Quad_t)SvIV(TOPs))
+#define TOPuq		((Uquad_t)SvUV(TOPs))
+#endif
+
+/* Go to some pains in the rare event that we must extend the stack. */
+
+/*
+=for apidoc Am|void|EXTEND|SP|int nitems
+Used to extend the argument stack for an XSUB's return values. Once
+used, guarantees that there is room for at least C<nitems> to be pushed
+onto the stack.
+
+=for apidoc Am|void|PUSHs|SV* sv
+Push an SV onto the stack.  The stack must have room for this element.
+Does not handle 'set' magic.  Does not use C<TARG>.  See also C<PUSHmortal>,
+C<XPUSHs> and C<XPUSHmortal>.
+
+=for apidoc Am|void|PUSHp|char* str|STRLEN len
+Push a string onto the stack.  The stack must have room for this element.
+The C<len> indicates the length of the string.  Handles 'set' magic.  Uses
+C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to declare it.  Do not
+call multiple C<TARG>-oriented macros to return lists from XSUB's - see
+C<mPUSHp> instead.  See also C<XPUSHp> and C<mXPUSHp>.
+
+=for apidoc Am|void|PUSHn|NV nv
+Push a double onto the stack.  The stack must have room for this element.
+Handles 'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it.  Do not call multiple C<TARG>-oriented macros to
+return lists from XSUB's - see C<mPUSHn> instead.  See also C<XPUSHn> and
+C<mXPUSHn>.
+
+=for apidoc Am|void|PUSHi|IV iv
+Push an integer onto the stack.  The stack must have room for this element.
+Handles 'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it.  Do not call multiple C<TARG>-oriented macros to 
+return lists from XSUB's - see C<mPUSHi> instead.  See also C<XPUSHi> and
+C<mXPUSHi>.
+
+=for apidoc Am|void|PUSHu|UV uv
+Push an unsigned integer onto the stack.  The stack must have room for this
+element.  Handles 'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG>
+should be called to declare it.  Do not call multiple C<TARG>-oriented
+macros to return lists from XSUB's - see C<mPUSHu> instead.  See also
+C<XPUSHu> and C<mXPUSHu>.
+
+=for apidoc Am|void|XPUSHs|SV* sv
+Push an SV onto the stack, extending the stack if necessary.  Does not
+handle 'set' magic.  Does not use C<TARG>.  See also C<XPUSHmortal>,
+C<PUSHs> and C<PUSHmortal>.
+
+=for apidoc Am|void|XPUSHp|char* str|STRLEN len
+Push a string onto the stack, extending the stack if necessary.  The C<len>
+indicates the length of the string.  Handles 'set' magic.  Uses C<TARG>, so
+C<dTARGET> or C<dXSTARG> should be called to declare it.  Do not call
+multiple C<TARG>-oriented macros to return lists from XSUB's - see
+C<mXPUSHp> instead.  See also C<PUSHp> and C<mPUSHp>.
+
+=for apidoc Am|void|XPUSHn|NV nv
+Push a double onto the stack, extending the stack if necessary.  Handles
+'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
+declare it.  Do not call multiple C<TARG>-oriented macros to return lists
+from XSUB's - see C<mXPUSHn> instead.  See also C<PUSHn> and C<mPUSHn>.
+
+=for apidoc Am|void|XPUSHi|IV iv
+Push an integer onto the stack, extending the stack if necessary.  Handles
+'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
+declare it.  Do not call multiple C<TARG>-oriented macros to return lists
+from XSUB's - see C<mXPUSHi> instead.  See also C<PUSHi> and C<mPUSHi>.
+
+=for apidoc Am|void|XPUSHu|UV uv
+Push an unsigned integer onto the stack, extending the stack if necessary.
+Handles 'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it.  Do not call multiple C<TARG>-oriented macros to
+return lists from XSUB's - see C<mXPUSHu> instead.  See also C<PUSHu> and
+C<mPUSHu>.
+
+=for apidoc Am|void|PUSHmortal
+Push a new mortal SV onto the stack.  The stack must have room for this
+element.  Does not handle 'set' magic.  Does not use C<TARG>.  See also
+C<PUSHs>, C<XPUSHmortal> and C<XPUSHs>.
+
+=for apidoc Am|void|mPUSHp|char* str|STRLEN len
+Push a string onto the stack.  The stack must have room for this element.
+The C<len> indicates the length of the string.  Handles 'set' magic.  Does
+not use C<TARG>.  See also C<PUSHp>, C<mXPUSHp> and C<XPUSHp>.
+
+=for apidoc Am|void|mPUSHn|NV nv
+Push a double onto the stack.  The stack must have room for this element.
+Handles 'set' magic.  Does not use C<TARG>.  See also C<PUSHn>, C<mXPUSHn>
+and C<XPUSHn>.
+
+=for apidoc Am|void|mPUSHi|IV iv
+Push an integer onto the stack.  The stack must have room for this element.
+Handles 'set' magic.  Does not use C<TARG>.  See also C<PUSHi>, C<mXPUSHi>
+and C<XPUSHi>.
+
+=for apidoc Am|void|mPUSHu|UV uv
+Push an unsigned integer onto the stack.  The stack must have room for this
+element.  Handles 'set' magic.  Does not use C<TARG>.  See also C<PUSHu>,
+C<mXPUSHu> and C<XPUSHu>.
+
+=for apidoc Am|void|XPUSHmortal
+Push a new mortal SV onto the stack, extending the stack if necessary.  Does
+not handle 'set' magic.  Does not use C<TARG>.  See also C<XPUSHs>,
+C<PUSHmortal> and C<PUSHs>.
+
+=for apidoc Am|void|mXPUSHp|char* str|STRLEN len
+Push a string onto the stack, extending the stack if necessary.  The C<len>
+indicates the length of the string.  Handles 'set' magic.  Does not use
+C<TARG>.  See also C<XPUSHp>, C<mPUSHp> and C<PUSHp>.
+
+=for apidoc Am|void|mXPUSHn|NV nv
+Push a double onto the stack, extending the stack if necessary.  Handles
+'set' magic.  Does not use C<TARG>.  See also C<XPUSHn>, C<mPUSHn> and
+C<PUSHn>.
+
+=for apidoc Am|void|mXPUSHi|IV iv
+Push an integer onto the stack, extending the stack if necessary.  Handles
+'set' magic.  Does not use C<TARG>.  See also C<XPUSHi>, C<mPUSHi> and
+C<PUSHi>.
+
+=for apidoc Am|void|mXPUSHu|UV uv
+Push an unsigned integer onto the stack, extending the stack if necessary.
+Handles 'set' magic.  Does not use C<TARG>.  See also C<XPUSHu>, C<mPUSHu>
+and C<PUSHu>.
+
+=cut
+*/
+
+#define EXTEND(p,n)	STMT_START { if (PL_stack_max - p < (int)(n)) {		\
+			    sp = stack_grow(sp,p, (int) (n));		\
+			} } STMT_END
+
+/* Same thing, but update mark register too. */
+#define MEXTEND(p,n)	STMT_START {if (PL_stack_max - p < (int)(n)) {	\
+			    const int markoff = mark - PL_stack_base;	\
+			    sp = stack_grow(sp,p,(int) (n));		\
+			    mark = PL_stack_base + markoff;		\
+			} } STMT_END
+
+#define PUSHs(s)	(*++sp = (s))
+#define PUSHTARG	STMT_START { SvSETMAGIC(TARG); PUSHs(TARG); } STMT_END
+#define PUSHp(p,l)	STMT_START { sv_setpvn(TARG, (p), (l)); PUSHTARG; } STMT_END
+#define PUSHn(n)	STMT_START { sv_setnv(TARG, (NV)(n)); PUSHTARG; } STMT_END
+#define PUSHi(i)	STMT_START { sv_setiv(TARG, (IV)(i)); PUSHTARG; } STMT_END
+#define PUSHu(u)	STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
+
+#define XPUSHs(s)	STMT_START { EXTEND(sp,1); (*++sp = (s)); } STMT_END
+#define XPUSHTARG	STMT_START { SvSETMAGIC(TARG); XPUSHs(TARG); } STMT_END
+#define XPUSHp(p,l)	STMT_START { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } STMT_END
+#define XPUSHn(n)	STMT_START { sv_setnv(TARG, (NV)(n)); XPUSHTARG; } STMT_END
+#define XPUSHi(i)	STMT_START { sv_setiv(TARG, (IV)(i)); XPUSHTARG; } STMT_END
+#define XPUSHu(u)	STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+#define XPUSHundef	STMT_START { SvOK_off(TARG); XPUSHs(TARG); } STMT_END
+
+#define PUSHmortal	PUSHs(sv_newmortal())
+#define mPUSHp(p,l)	sv_setpvn_mg(PUSHmortal, (p), (l))
+#define mPUSHn(n)	sv_setnv_mg(PUSHmortal, (NV)(n))
+#define mPUSHi(i)	sv_setiv_mg(PUSHmortal, (IV)(i))
+#define mPUSHu(u)	sv_setuv_mg(PUSHmortal, (UV)(u))
+
+#define XPUSHmortal	XPUSHs(sv_newmortal())
+#define mXPUSHp(p,l)	STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END
+#define mXPUSHn(n)	STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END
+#define mXPUSHi(i)	STMT_START { EXTEND(sp,1); sv_setiv_mg(PUSHmortal, (IV)(i)); } STMT_END
+#define mXPUSHu(u)	STMT_START { EXTEND(sp,1); sv_setuv_mg(PUSHmortal, (UV)(u)); } STMT_END
+
+#define SETs(s)		(*sp = s)
+#define SETTARG		STMT_START { SvSETMAGIC(TARG); SETs(TARG); } STMT_END
+#define SETp(p,l)	STMT_START { sv_setpvn(TARG, (p), (l)); SETTARG; } STMT_END
+#define SETn(n)		STMT_START { sv_setnv(TARG, (NV)(n)); SETTARG; } STMT_END
+#define SETi(i)		STMT_START { sv_setiv(TARG, (IV)(i)); SETTARG; } STMT_END
+#define SETu(u)		STMT_START { sv_setuv(TARG, (UV)(u)); SETTARG; } STMT_END
+
+#define dTOPss		SV *sv = TOPs
+#define dPOPss		SV *sv = POPs
+#define dTOPnv		NV value = TOPn
+#define dPOPnv		NV value = POPn
+#define dTOPiv		IV value = TOPi
+#define dPOPiv		IV value = POPi
+#define dTOPuv		UV value = TOPu
+#define dPOPuv		UV value = POPu
+#ifdef HAS_QUAD
+#define dTOPqv		Quad_t value = TOPu
+#define dPOPqv		Quad_t value = POPu
+#define dTOPuqv		Uquad_t value = TOPuq
+#define dPOPuqv		Uquad_t value = POPuq
+#endif
+
+#define dPOPXssrl(X)	SV *right = POPs; SV *left = CAT2(X,s)
+#define dPOPXnnrl(X)	NV right = POPn; NV left = CAT2(X,n)
+#define dPOPXiirl(X)	IV right = POPi; IV left = CAT2(X,i)
+
+#define USE_LEFT(sv) \
+	(SvOK(sv) || SvGMAGICAL(sv) || !(PL_op->op_flags & OPf_STACKED))
+#define dPOPXnnrl_ul(X)	\
+    NV right = POPn;				\
+    SV *leftsv = CAT2(X,s);				\
+    NV left = USE_LEFT(leftsv) ? SvNV(leftsv) : 0.0
+#define dPOPXiirl_ul(X) \
+    IV right = POPi;					\
+    SV *leftsv = CAT2(X,s);				\
+    IV left = USE_LEFT(leftsv) ? SvIV(leftsv) : 0
+
+#define dPOPPOPssrl	dPOPXssrl(POP)
+#define dPOPPOPnnrl	dPOPXnnrl(POP)
+#define dPOPPOPnnrl_ul	dPOPXnnrl_ul(POP)
+#define dPOPPOPiirl	dPOPXiirl(POP)
+#define dPOPPOPiirl_ul	dPOPXiirl_ul(POP)
+
+#define dPOPTOPssrl	dPOPXssrl(TOP)
+#define dPOPTOPnnrl	dPOPXnnrl(TOP)
+#define dPOPTOPnnrl_ul	dPOPXnnrl_ul(TOP)
+#define dPOPTOPiirl	dPOPXiirl(TOP)
+#define dPOPTOPiirl_ul	dPOPXiirl_ul(TOP)
+
+#define RETPUSHYES	RETURNX(PUSHs(&PL_sv_yes))
+#define RETPUSHNO	RETURNX(PUSHs(&PL_sv_no))
+#define RETPUSHUNDEF	RETURNX(PUSHs(&PL_sv_undef))
+
+#define RETSETYES	RETURNX(SETs(&PL_sv_yes))
+#define RETSETNO	RETURNX(SETs(&PL_sv_no))
+#define RETSETUNDEF	RETURNX(SETs(&PL_sv_undef))
+
+#define ARGTARG		PL_op->op_targ
+
+    /* See OPpTARGET_MY: */
+#define MAXARG		(PL_op->op_private & 15)
+
+#define SWITCHSTACK(f,t) \
+    STMT_START {							\
+	AvFILLp(f) = sp - PL_stack_base;				\
+	PL_stack_base = AvARRAY(t);					\
+	PL_stack_max = PL_stack_base + AvMAX(t);			\
+	sp = PL_stack_sp = PL_stack_base + AvFILLp(t);			\
+	PL_curstack = t;						\
+    } STMT_END
+
+#define EXTEND_MORTAL(n) \
+    STMT_START {							\
+	if (PL_tmps_ix + (n) >= PL_tmps_max)				\
+	    tmps_grow(n);						\
+    } STMT_END
+
+#define AMGf_noright	1
+#define AMGf_noleft	2
+#define AMGf_assign	4
+#define AMGf_unary	8
+
+#define tryAMAGICbinW(meth,assign,set) STMT_START { \
+          if (PL_amagic_generation) { \
+	    SV* tmpsv; \
+	    SV* const right= *(sp); SV* const left= *(sp-1);\
+	    if ((SvAMAGIC(left)||SvAMAGIC(right))&&\
+		(tmpsv=amagic_call(left, \
+				   right, \
+				   CAT2(meth,_amg), \
+				   (assign)? AMGf_assign: 0))) {\
+	       SPAGAIN;	\
+	       (void)POPs; set(tmpsv); RETURN; } \
+	  } \
+	} STMT_END
+
+#define tryAMAGICbin(meth,assign) tryAMAGICbinW(meth,assign,SETsv)
+#define tryAMAGICbinSET(meth,assign) tryAMAGICbinW(meth,assign,SETs)
+
+#define AMG_CALLun(sv,meth) amagic_call(sv,&PL_sv_undef,  \
+					CAT2(meth,_amg),AMGf_noright | AMGf_unary)
+#define AMG_CALLbinL(left,right,meth) \
+            amagic_call(left,right,CAT2(meth,_amg),AMGf_noright)
+
+#define tryAMAGICunW(meth,set,shift,ret) STMT_START { \
+          if (PL_amagic_generation) { \
+	    SV* tmpsv; \
+	    SV* arg= sp[shift]; \
+          if(0) goto am_again;  /* shut up unused warning */ \
+	  am_again: \
+	    if ((SvAMAGIC(arg))&&\
+		(tmpsv=AMG_CALLun(arg,meth))) {\
+	       SPAGAIN; if (shift) sp += shift; \
+	       set(tmpsv); ret; } \
+	  } \
+	} STMT_END
+
+#define FORCE_SETs(sv) STMT_START { sv_setsv(TARG, (sv)); SETTARG; } STMT_END
+
+#define tryAMAGICun(meth)	tryAMAGICunW(meth,SETsvUN,0,RETURN)
+#define tryAMAGICunSET(meth)	tryAMAGICunW(meth,SETs,0,RETURN)
+#define tryAMAGICunTARGET(meth, shift)					\
+	STMT_START { dSP; sp--; 	/* get TARGET from below PL_stack_sp */		\
+	    { dTARGETSTACKED; 						\
+		{ dSP; tryAMAGICunW(meth,FORCE_SETs,shift,RETURN);}}} STMT_END
+
+#define setAGAIN(ref)	\
+    STMT_START {					\
+	sv = ref;					\
+	if (!SvROK(ref))				\
+	    Perl_croak(aTHX_ "Overloaded dereference did not return a reference");	\
+	if (ref != arg && SvRV(ref) != SvRV(arg)) {	\
+	    arg = ref;					\
+	    goto am_again;				\
+	}						\
+    } STMT_END
+
+#define tryAMAGICunDEREF(meth) tryAMAGICunW(meth,setAGAIN,0,(void)0)
+
+#define opASSIGN (PL_op->op_flags & OPf_STACKED)
+#define SETsv(sv)	STMT_START {					\
+		if (opASSIGN || (SvFLAGS(TARG) & SVs_PADMY))		\
+		   { sv_setsv(TARG, (sv)); SETTARG; }			\
+		else SETs(sv); } STMT_END
+
+#define SETsvUN(sv)	STMT_START {					\
+		if (SvFLAGS(TARG) & SVs_PADMY)		\
+		   { sv_setsv(TARG, (sv)); SETTARG; }			\
+		else SETs(sv); } STMT_END
+
+/* newSVsv does not behave as advertised, so we copy missing
+ * information by hand */
+
+/* SV* ref causes confusion with the member variable
+   changed SV* ref to SV* tmpRef */
+#define RvDEEPCP(rv) STMT_START { SV* tmpRef=SvRV(rv);      \
+  if (SvREFCNT(tmpRef)>1) {                 \
+    SvRV_set(rv, AMG_CALLun(rv,copy));	\
+    SvREFCNT_dec(tmpRef);                   \
+  } } STMT_END
+
+/*
+=for apidoc mU||LVRET
+True if this op will be the return value of an lvalue subroutine
+
+=cut */
+#define LVRET ((PL_op->op_private & OPpMAYBE_LVSUB) && is_lvalue_sub())
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/pp_proto.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/pp_proto.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/pp_proto.h	(revision 14489)
@@ -0,0 +1,396 @@
+/* -*- buffer-read-only: t -*-
+   !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+   This file is built by opcode.pl from its data.  Any changes made here
+   will be lost!
+*/
+
+PERL_CKDEF(Perl_ck_anoncode)
+PERL_CKDEF(Perl_ck_bitop)
+PERL_CKDEF(Perl_ck_concat)
+PERL_CKDEF(Perl_ck_defined)
+PERL_CKDEF(Perl_ck_delete)
+PERL_CKDEF(Perl_ck_die)
+PERL_CKDEF(Perl_ck_eof)
+PERL_CKDEF(Perl_ck_eval)
+PERL_CKDEF(Perl_ck_exec)
+PERL_CKDEF(Perl_ck_exists)
+PERL_CKDEF(Perl_ck_exit)
+PERL_CKDEF(Perl_ck_ftst)
+PERL_CKDEF(Perl_ck_fun)
+PERL_CKDEF(Perl_ck_glob)
+PERL_CKDEF(Perl_ck_grep)
+PERL_CKDEF(Perl_ck_index)
+PERL_CKDEF(Perl_ck_join)
+PERL_CKDEF(Perl_ck_lengthconst)
+PERL_CKDEF(Perl_ck_lfun)
+PERL_CKDEF(Perl_ck_listiob)
+PERL_CKDEF(Perl_ck_match)
+PERL_CKDEF(Perl_ck_method)
+PERL_CKDEF(Perl_ck_null)
+PERL_CKDEF(Perl_ck_open)
+PERL_CKDEF(Perl_ck_repeat)
+PERL_CKDEF(Perl_ck_require)
+PERL_CKDEF(Perl_ck_return)
+PERL_CKDEF(Perl_ck_rfun)
+PERL_CKDEF(Perl_ck_rvconst)
+PERL_CKDEF(Perl_ck_sassign)
+PERL_CKDEF(Perl_ck_select)
+PERL_CKDEF(Perl_ck_shift)
+PERL_CKDEF(Perl_ck_sort)
+PERL_CKDEF(Perl_ck_spair)
+PERL_CKDEF(Perl_ck_split)
+PERL_CKDEF(Perl_ck_subr)
+PERL_CKDEF(Perl_ck_substr)
+PERL_CKDEF(Perl_ck_svconst)
+PERL_CKDEF(Perl_ck_trunc)
+
+
+PERL_PPDEF(Perl_pp_null)
+PERL_PPDEF(Perl_pp_stub)
+PERL_PPDEF(Perl_pp_scalar)
+PERL_PPDEF(Perl_pp_pushmark)
+PERL_PPDEF(Perl_pp_wantarray)
+PERL_PPDEF(Perl_pp_const)
+PERL_PPDEF(Perl_pp_gvsv)
+PERL_PPDEF(Perl_pp_gv)
+PERL_PPDEF(Perl_pp_gelem)
+PERL_PPDEF(Perl_pp_padsv)
+PERL_PPDEF(Perl_pp_padav)
+PERL_PPDEF(Perl_pp_padhv)
+PERL_PPDEF(Perl_pp_padany)
+PERL_PPDEF(Perl_pp_pushre)
+PERL_PPDEF(Perl_pp_rv2gv)
+PERL_PPDEF(Perl_pp_rv2sv)
+PERL_PPDEF(Perl_pp_av2arylen)
+PERL_PPDEF(Perl_pp_rv2cv)
+PERL_PPDEF(Perl_pp_anoncode)
+PERL_PPDEF(Perl_pp_prototype)
+PERL_PPDEF(Perl_pp_refgen)
+PERL_PPDEF(Perl_pp_srefgen)
+PERL_PPDEF(Perl_pp_ref)
+PERL_PPDEF(Perl_pp_bless)
+PERL_PPDEF(Perl_pp_backtick)
+PERL_PPDEF(Perl_pp_glob)
+PERL_PPDEF(Perl_pp_readline)
+PERL_PPDEF(Perl_pp_rcatline)
+PERL_PPDEF(Perl_pp_regcmaybe)
+PERL_PPDEF(Perl_pp_regcreset)
+PERL_PPDEF(Perl_pp_regcomp)
+PERL_PPDEF(Perl_pp_match)
+PERL_PPDEF(Perl_pp_qr)
+PERL_PPDEF(Perl_pp_subst)
+PERL_PPDEF(Perl_pp_substcont)
+PERL_PPDEF(Perl_pp_trans)
+PERL_PPDEF(Perl_pp_sassign)
+PERL_PPDEF(Perl_pp_aassign)
+PERL_PPDEF(Perl_pp_chop)
+PERL_PPDEF(Perl_pp_schop)
+PERL_PPDEF(Perl_pp_chomp)
+PERL_PPDEF(Perl_pp_schomp)
+PERL_PPDEF(Perl_pp_defined)
+PERL_PPDEF(Perl_pp_undef)
+PERL_PPDEF(Perl_pp_study)
+PERL_PPDEF(Perl_pp_pos)
+PERL_PPDEF(Perl_pp_preinc)
+PERL_PPDEF(Perl_pp_predec)
+PERL_PPDEF(Perl_pp_postinc)
+PERL_PPDEF(Perl_pp_postdec)
+PERL_PPDEF(Perl_pp_pow)
+PERL_PPDEF(Perl_pp_multiply)
+PERL_PPDEF(Perl_pp_i_multiply)
+PERL_PPDEF(Perl_pp_divide)
+PERL_PPDEF(Perl_pp_i_divide)
+PERL_PPDEF(Perl_pp_modulo)
+PERL_PPDEF(Perl_pp_i_modulo)
+PERL_PPDEF(Perl_pp_repeat)
+PERL_PPDEF(Perl_pp_add)
+PERL_PPDEF(Perl_pp_i_add)
+PERL_PPDEF(Perl_pp_subtract)
+PERL_PPDEF(Perl_pp_i_subtract)
+PERL_PPDEF(Perl_pp_concat)
+PERL_PPDEF(Perl_pp_stringify)
+PERL_PPDEF(Perl_pp_left_shift)
+PERL_PPDEF(Perl_pp_right_shift)
+PERL_PPDEF(Perl_pp_lt)
+PERL_PPDEF(Perl_pp_i_lt)
+PERL_PPDEF(Perl_pp_gt)
+PERL_PPDEF(Perl_pp_i_gt)
+PERL_PPDEF(Perl_pp_le)
+PERL_PPDEF(Perl_pp_i_le)
+PERL_PPDEF(Perl_pp_ge)
+PERL_PPDEF(Perl_pp_i_ge)
+PERL_PPDEF(Perl_pp_eq)
+PERL_PPDEF(Perl_pp_i_eq)
+PERL_PPDEF(Perl_pp_ne)
+PERL_PPDEF(Perl_pp_i_ne)
+PERL_PPDEF(Perl_pp_ncmp)
+PERL_PPDEF(Perl_pp_i_ncmp)
+PERL_PPDEF(Perl_pp_slt)
+PERL_PPDEF(Perl_pp_sgt)
+PERL_PPDEF(Perl_pp_sle)
+PERL_PPDEF(Perl_pp_sge)
+PERL_PPDEF(Perl_pp_seq)
+PERL_PPDEF(Perl_pp_sne)
+PERL_PPDEF(Perl_pp_scmp)
+PERL_PPDEF(Perl_pp_bit_and)
+PERL_PPDEF(Perl_pp_bit_xor)
+PERL_PPDEF(Perl_pp_bit_or)
+PERL_PPDEF(Perl_pp_negate)
+PERL_PPDEF(Perl_pp_i_negate)
+PERL_PPDEF(Perl_pp_not)
+PERL_PPDEF(Perl_pp_complement)
+PERL_PPDEF(Perl_pp_atan2)
+PERL_PPDEF(Perl_pp_sin)
+PERL_PPDEF(Perl_pp_cos)
+PERL_PPDEF(Perl_pp_rand)
+PERL_PPDEF(Perl_pp_srand)
+PERL_PPDEF(Perl_pp_exp)
+PERL_PPDEF(Perl_pp_log)
+PERL_PPDEF(Perl_pp_sqrt)
+PERL_PPDEF(Perl_pp_int)
+PERL_PPDEF(Perl_pp_hex)
+PERL_PPDEF(Perl_pp_oct)
+PERL_PPDEF(Perl_pp_abs)
+PERL_PPDEF(Perl_pp_length)
+PERL_PPDEF(Perl_pp_substr)
+PERL_PPDEF(Perl_pp_vec)
+PERL_PPDEF(Perl_pp_index)
+PERL_PPDEF(Perl_pp_rindex)
+PERL_PPDEF(Perl_pp_sprintf)
+PERL_PPDEF(Perl_pp_formline)
+PERL_PPDEF(Perl_pp_ord)
+PERL_PPDEF(Perl_pp_chr)
+PERL_PPDEF(Perl_pp_crypt)
+PERL_PPDEF(Perl_pp_ucfirst)
+PERL_PPDEF(Perl_pp_lcfirst)
+PERL_PPDEF(Perl_pp_uc)
+PERL_PPDEF(Perl_pp_lc)
+PERL_PPDEF(Perl_pp_quotemeta)
+PERL_PPDEF(Perl_pp_rv2av)
+PERL_PPDEF(Perl_pp_aelemfast)
+PERL_PPDEF(Perl_pp_aelem)
+PERL_PPDEF(Perl_pp_aslice)
+PERL_PPDEF(Perl_pp_each)
+PERL_PPDEF(Perl_pp_values)
+PERL_PPDEF(Perl_pp_keys)
+PERL_PPDEF(Perl_pp_delete)
+PERL_PPDEF(Perl_pp_exists)
+PERL_PPDEF(Perl_pp_rv2hv)
+PERL_PPDEF(Perl_pp_helem)
+PERL_PPDEF(Perl_pp_hslice)
+PERL_PPDEF(Perl_pp_unpack)
+PERL_PPDEF(Perl_pp_pack)
+PERL_PPDEF(Perl_pp_split)
+PERL_PPDEF(Perl_pp_join)
+PERL_PPDEF(Perl_pp_list)
+PERL_PPDEF(Perl_pp_lslice)
+PERL_PPDEF(Perl_pp_anonlist)
+PERL_PPDEF(Perl_pp_anonhash)
+PERL_PPDEF(Perl_pp_splice)
+PERL_PPDEF(Perl_pp_push)
+PERL_PPDEF(Perl_pp_pop)
+PERL_PPDEF(Perl_pp_shift)
+PERL_PPDEF(Perl_pp_unshift)
+PERL_PPDEF(Perl_pp_sort)
+PERL_PPDEF(Perl_pp_reverse)
+PERL_PPDEF(Perl_pp_grepstart)
+PERL_PPDEF(Perl_pp_grepwhile)
+PERL_PPDEF(Perl_pp_mapstart)
+PERL_PPDEF(Perl_pp_mapwhile)
+PERL_PPDEF(Perl_pp_range)
+PERL_PPDEF(Perl_pp_flip)
+PERL_PPDEF(Perl_pp_flop)
+PERL_PPDEF(Perl_pp_and)
+PERL_PPDEF(Perl_pp_or)
+PERL_PPDEF(Perl_pp_xor)
+PERL_PPDEF(Perl_pp_cond_expr)
+PERL_PPDEF(Perl_pp_andassign)
+PERL_PPDEF(Perl_pp_orassign)
+PERL_PPDEF(Perl_pp_method)
+PERL_PPDEF(Perl_pp_entersub)
+PERL_PPDEF(Perl_pp_leavesub)
+PERL_PPDEF(Perl_pp_leavesublv)
+PERL_PPDEF(Perl_pp_caller)
+PERL_PPDEF(Perl_pp_warn)
+PERL_PPDEF(Perl_pp_die)
+PERL_PPDEF(Perl_pp_reset)
+PERL_PPDEF(Perl_pp_lineseq)
+PERL_PPDEF(Perl_pp_nextstate)
+PERL_PPDEF(Perl_pp_dbstate)
+PERL_PPDEF(Perl_pp_unstack)
+PERL_PPDEF(Perl_pp_enter)
+PERL_PPDEF(Perl_pp_leave)
+PERL_PPDEF(Perl_pp_scope)
+PERL_PPDEF(Perl_pp_enteriter)
+PERL_PPDEF(Perl_pp_iter)
+PERL_PPDEF(Perl_pp_enterloop)
+PERL_PPDEF(Perl_pp_leaveloop)
+PERL_PPDEF(Perl_pp_return)
+PERL_PPDEF(Perl_pp_last)
+PERL_PPDEF(Perl_pp_next)
+PERL_PPDEF(Perl_pp_redo)
+PERL_PPDEF(Perl_pp_dump)
+PERL_PPDEF(Perl_pp_goto)
+PERL_PPDEF(Perl_pp_exit)
+PERL_PPDEF(Perl_pp_open)
+PERL_PPDEF(Perl_pp_close)
+PERL_PPDEF(Perl_pp_pipe_op)
+PERL_PPDEF(Perl_pp_fileno)
+PERL_PPDEF(Perl_pp_umask)
+PERL_PPDEF(Perl_pp_binmode)
+PERL_PPDEF(Perl_pp_tie)
+PERL_PPDEF(Perl_pp_untie)
+PERL_PPDEF(Perl_pp_tied)
+PERL_PPDEF(Perl_pp_dbmopen)
+PERL_PPDEF(Perl_pp_dbmclose)
+PERL_PPDEF(Perl_pp_sselect)
+PERL_PPDEF(Perl_pp_select)
+PERL_PPDEF(Perl_pp_getc)
+PERL_PPDEF(Perl_pp_read)
+PERL_PPDEF(Perl_pp_enterwrite)
+PERL_PPDEF(Perl_pp_leavewrite)
+PERL_PPDEF(Perl_pp_prtf)
+PERL_PPDEF(Perl_pp_print)
+PERL_PPDEF(Perl_pp_sysopen)
+PERL_PPDEF(Perl_pp_sysseek)
+PERL_PPDEF(Perl_pp_sysread)
+PERL_PPDEF(Perl_pp_syswrite)
+PERL_PPDEF(Perl_pp_send)
+PERL_PPDEF(Perl_pp_recv)
+PERL_PPDEF(Perl_pp_eof)
+PERL_PPDEF(Perl_pp_tell)
+PERL_PPDEF(Perl_pp_seek)
+PERL_PPDEF(Perl_pp_truncate)
+PERL_PPDEF(Perl_pp_fcntl)
+PERL_PPDEF(Perl_pp_ioctl)
+PERL_PPDEF(Perl_pp_flock)
+PERL_PPDEF(Perl_pp_socket)
+PERL_PPDEF(Perl_pp_sockpair)
+PERL_PPDEF(Perl_pp_bind)
+PERL_PPDEF(Perl_pp_connect)
+PERL_PPDEF(Perl_pp_listen)
+PERL_PPDEF(Perl_pp_accept)
+PERL_PPDEF(Perl_pp_shutdown)
+PERL_PPDEF(Perl_pp_gsockopt)
+PERL_PPDEF(Perl_pp_ssockopt)
+PERL_PPDEF(Perl_pp_getsockname)
+PERL_PPDEF(Perl_pp_getpeername)
+PERL_PPDEF(Perl_pp_lstat)
+PERL_PPDEF(Perl_pp_stat)
+PERL_PPDEF(Perl_pp_ftrread)
+PERL_PPDEF(Perl_pp_ftrwrite)
+PERL_PPDEF(Perl_pp_ftrexec)
+PERL_PPDEF(Perl_pp_fteread)
+PERL_PPDEF(Perl_pp_ftewrite)
+PERL_PPDEF(Perl_pp_fteexec)
+PERL_PPDEF(Perl_pp_ftis)
+PERL_PPDEF(Perl_pp_fteowned)
+PERL_PPDEF(Perl_pp_ftrowned)
+PERL_PPDEF(Perl_pp_ftzero)
+PERL_PPDEF(Perl_pp_ftsize)
+PERL_PPDEF(Perl_pp_ftmtime)
+PERL_PPDEF(Perl_pp_ftatime)
+PERL_PPDEF(Perl_pp_ftctime)
+PERL_PPDEF(Perl_pp_ftsock)
+PERL_PPDEF(Perl_pp_ftchr)
+PERL_PPDEF(Perl_pp_ftblk)
+PERL_PPDEF(Perl_pp_ftfile)
+PERL_PPDEF(Perl_pp_ftdir)
+PERL_PPDEF(Perl_pp_ftpipe)
+PERL_PPDEF(Perl_pp_ftlink)
+PERL_PPDEF(Perl_pp_ftsuid)
+PERL_PPDEF(Perl_pp_ftsgid)
+PERL_PPDEF(Perl_pp_ftsvtx)
+PERL_PPDEF(Perl_pp_fttty)
+PERL_PPDEF(Perl_pp_fttext)
+PERL_PPDEF(Perl_pp_ftbinary)
+PERL_PPDEF(Perl_pp_chdir)
+PERL_PPDEF(Perl_pp_chown)
+PERL_PPDEF(Perl_pp_chroot)
+PERL_PPDEF(Perl_pp_unlink)
+PERL_PPDEF(Perl_pp_chmod)
+PERL_PPDEF(Perl_pp_utime)
+PERL_PPDEF(Perl_pp_rename)
+PERL_PPDEF(Perl_pp_link)
+PERL_PPDEF(Perl_pp_symlink)
+PERL_PPDEF(Perl_pp_readlink)
+PERL_PPDEF(Perl_pp_mkdir)
+PERL_PPDEF(Perl_pp_rmdir)
+PERL_PPDEF(Perl_pp_open_dir)
+PERL_PPDEF(Perl_pp_readdir)
+PERL_PPDEF(Perl_pp_telldir)
+PERL_PPDEF(Perl_pp_seekdir)
+PERL_PPDEF(Perl_pp_rewinddir)
+PERL_PPDEF(Perl_pp_closedir)
+PERL_PPDEF(Perl_pp_fork)
+PERL_PPDEF(Perl_pp_wait)
+PERL_PPDEF(Perl_pp_waitpid)
+PERL_PPDEF(Perl_pp_system)
+PERL_PPDEF(Perl_pp_exec)
+PERL_PPDEF(Perl_pp_kill)
+PERL_PPDEF(Perl_pp_getppid)
+PERL_PPDEF(Perl_pp_getpgrp)
+PERL_PPDEF(Perl_pp_setpgrp)
+PERL_PPDEF(Perl_pp_getpriority)
+PERL_PPDEF(Perl_pp_setpriority)
+PERL_PPDEF(Perl_pp_time)
+PERL_PPDEF(Perl_pp_tms)
+PERL_PPDEF(Perl_pp_localtime)
+PERL_PPDEF(Perl_pp_gmtime)
+PERL_PPDEF(Perl_pp_alarm)
+PERL_PPDEF(Perl_pp_sleep)
+PERL_PPDEF(Perl_pp_shmget)
+PERL_PPDEF(Perl_pp_shmctl)
+PERL_PPDEF(Perl_pp_shmread)
+PERL_PPDEF(Perl_pp_shmwrite)
+PERL_PPDEF(Perl_pp_msgget)
+PERL_PPDEF(Perl_pp_msgctl)
+PERL_PPDEF(Perl_pp_msgsnd)
+PERL_PPDEF(Perl_pp_msgrcv)
+PERL_PPDEF(Perl_pp_semget)
+PERL_PPDEF(Perl_pp_semctl)
+PERL_PPDEF(Perl_pp_semop)
+PERL_PPDEF(Perl_pp_require)
+PERL_PPDEF(Perl_pp_dofile)
+PERL_PPDEF(Perl_pp_entereval)
+PERL_PPDEF(Perl_pp_leaveeval)
+PERL_PPDEF(Perl_pp_entertry)
+PERL_PPDEF(Perl_pp_leavetry)
+PERL_PPDEF(Perl_pp_ghbyname)
+PERL_PPDEF(Perl_pp_ghbyaddr)
+PERL_PPDEF(Perl_pp_ghostent)
+PERL_PPDEF(Perl_pp_gnbyname)
+PERL_PPDEF(Perl_pp_gnbyaddr)
+PERL_PPDEF(Perl_pp_gnetent)
+PERL_PPDEF(Perl_pp_gpbyname)
+PERL_PPDEF(Perl_pp_gpbynumber)
+PERL_PPDEF(Perl_pp_gprotoent)
+PERL_PPDEF(Perl_pp_gsbyname)
+PERL_PPDEF(Perl_pp_gsbyport)
+PERL_PPDEF(Perl_pp_gservent)
+PERL_PPDEF(Perl_pp_shostent)
+PERL_PPDEF(Perl_pp_snetent)
+PERL_PPDEF(Perl_pp_sprotoent)
+PERL_PPDEF(Perl_pp_sservent)
+PERL_PPDEF(Perl_pp_ehostent)
+PERL_PPDEF(Perl_pp_enetent)
+PERL_PPDEF(Perl_pp_eprotoent)
+PERL_PPDEF(Perl_pp_eservent)
+PERL_PPDEF(Perl_pp_gpwnam)
+PERL_PPDEF(Perl_pp_gpwuid)
+PERL_PPDEF(Perl_pp_gpwent)
+PERL_PPDEF(Perl_pp_spwent)
+PERL_PPDEF(Perl_pp_epwent)
+PERL_PPDEF(Perl_pp_ggrnam)
+PERL_PPDEF(Perl_pp_ggrgid)
+PERL_PPDEF(Perl_pp_ggrent)
+PERL_PPDEF(Perl_pp_sgrent)
+PERL_PPDEF(Perl_pp_egrent)
+PERL_PPDEF(Perl_pp_getlogin)
+PERL_PPDEF(Perl_pp_syscall)
+PERL_PPDEF(Perl_pp_lock)
+PERL_PPDEF(Perl_pp_threadsv)
+PERL_PPDEF(Perl_pp_setstate)
+PERL_PPDEF(Perl_pp_method_named)
+
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/proto.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/proto.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/proto.h	(revision 14489)
@@ -0,0 +1,2316 @@
+/*  -*- buffer-read-only: t -*-
+ *
+ *    proto.h
+ *
+ *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ * This file is built by embed.pl from data in embed.fnc, embed.pl,
+ * pp.sym, intrpvar.h, perlvars.h and thrdvar.h.
+ * Any changes made here will be lost!
+ *
+ * Edit those files and run 'make regen_headers' to effect changes.
+ */
+
+START_EXTERN_C
+
+#if defined(PERL_IMPLICIT_SYS)
+PERL_CALLCONV PerlInterpreter*	perl_alloc_using(struct IPerlMem* m, struct IPerlMem* ms, struct IPerlMem* mp, struct IPerlEnv* e, struct IPerlStdIO* io, struct IPerlLIO* lio, struct IPerlDir* d, struct IPerlSock* s, struct IPerlProc* p);
+#endif
+PERL_CALLCONV PerlInterpreter*	perl_alloc(void);
+PERL_CALLCONV void	perl_construct(PerlInterpreter* interp);
+PERL_CALLCONV int	perl_destruct(PerlInterpreter* interp);
+PERL_CALLCONV void	perl_free(PerlInterpreter* interp);
+PERL_CALLCONV int	perl_run(PerlInterpreter* interp);
+PERL_CALLCONV int	perl_parse(PerlInterpreter* interp, XSINIT_t xsinit, int argc, char** argv, char** env);
+PERL_CALLCONV bool	Perl_doing_taint(int argc, char** argv, char** env)
+			__attribute__warn_unused_result__;
+
+#if defined(USE_ITHREADS)
+PERL_CALLCONV PerlInterpreter*	perl_clone(PerlInterpreter* interp, UV flags);
+#  if defined(PERL_IMPLICIT_SYS)
+PERL_CALLCONV PerlInterpreter*	perl_clone_using(PerlInterpreter *interp, UV flags, struct IPerlMem* m, struct IPerlMem* ms, struct IPerlMem* mp, struct IPerlEnv* e, struct IPerlStdIO* io, struct IPerlLIO* lio, struct IPerlDir* d, struct IPerlSock* s, struct IPerlProc* p);
+#  endif
+#endif
+
+PERL_CALLCONV Malloc_t	Perl_malloc(MEM_SIZE nbytes)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV Malloc_t	Perl_calloc(MEM_SIZE elements, MEM_SIZE size)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV Malloc_t	Perl_realloc(Malloc_t where, MEM_SIZE nbytes)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV Free_t	Perl_mfree(Malloc_t where);
+#if defined(MYMALLOC)
+PERL_CALLCONV MEM_SIZE	Perl_malloced_size(void *p)
+			__attribute__warn_unused_result__;
+
+#endif
+
+PERL_CALLCONV void*	Perl_get_context(void)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_set_context(void *thx);
+
+END_EXTERN_C
+
+/* functions with flag 'n' should come before here */
+START_EXTERN_C
+#  include "pp_proto.h"
+PERL_CALLCONV SV*	Perl_amagic_call(pTHX_ SV* left, SV* right, int method, int dir);
+PERL_CALLCONV bool	Perl_Gv_AMupdate(pTHX_ HV* stash);
+PERL_CALLCONV CV*	Perl_gv_handler(pTHX_ HV* stash, I32 id)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_append_elem(pTHX_ I32 optype, OP* first, OP* last);
+PERL_CALLCONV OP*	Perl_append_list(pTHX_ I32 optype, LISTOP* first, LISTOP* last);
+PERL_CALLCONV I32	Perl_apply(pTHX_ I32 type, SV** mark, SV** sp);
+PERL_CALLCONV void	Perl_apply_attrs_string(pTHX_ char *stashpv, CV *cv, char *attrstr, STRLEN len);
+PERL_CALLCONV SV*	Perl_avhv_delete_ent(pTHX_ AV *ar, SV* keysv, I32 flags, U32 hash);
+PERL_CALLCONV bool	Perl_avhv_exists_ent(pTHX_ AV *ar, SV* keysv, U32 hash);
+PERL_CALLCONV SV**	Perl_avhv_fetch_ent(pTHX_ AV *ar, SV* keysv, I32 lval, U32 hash);
+PERL_CALLCONV SV**	Perl_avhv_store_ent(pTHX_ AV *ar, SV* keysv, SV* val, U32 hash);
+PERL_CALLCONV HE*	Perl_avhv_iternext(pTHX_ AV *ar);
+PERL_CALLCONV SV*	Perl_avhv_iterval(pTHX_ AV *ar, HE* entry);
+PERL_CALLCONV HV*	Perl_avhv_keys(pTHX_ AV *ar);
+PERL_CALLCONV void	Perl_av_clear(pTHX_ AV* ar);
+PERL_CALLCONV SV*	Perl_av_delete(pTHX_ AV* ar, I32 key, I32 flags);
+PERL_CALLCONV bool	Perl_av_exists(pTHX_ AV* ar, I32 key)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_av_extend(pTHX_ AV* ar, I32 key);
+PERL_CALLCONV AV*	Perl_av_fake(pTHX_ I32 size, SV** svp)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV**	Perl_av_fetch(pTHX_ AV* ar, I32 key, I32 lval)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_av_fill(pTHX_ AV* ar, I32 fill);
+PERL_CALLCONV I32	Perl_av_len(pTHX_ AV* ar)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV AV*	Perl_av_make(pTHX_ I32 size, SV** svp)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_av_pop(pTHX_ AV* ar);
+PERL_CALLCONV void	Perl_av_push(pTHX_ AV* ar, SV* val);
+PERL_CALLCONV void	Perl_av_reify(pTHX_ AV* ar);
+PERL_CALLCONV SV*	Perl_av_shift(pTHX_ AV* ar)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV**	Perl_av_store(pTHX_ AV* ar, I32 key, SV* val);
+PERL_CALLCONV void	Perl_av_undef(pTHX_ AV* ar);
+PERL_CALLCONV void	Perl_av_unshift(pTHX_ AV* ar, I32 num);
+PERL_CALLCONV OP*	Perl_bind_match(pTHX_ I32 type, OP* left, OP* pat)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_block_end(pTHX_ I32 floor, OP* seq)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV I32	Perl_block_gimme(pTHX)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV int	Perl_block_start(pTHX_ int full)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_boot_core_UNIVERSAL(pTHX);
+PERL_CALLCONV void	Perl_boot_core_PerlIO(pTHX);
+PERL_CALLCONV void	Perl_call_list(pTHX_ I32 oldscope, AV* av_list);
+PERL_CALLCONV bool	Perl_cando(pTHX_ Mode_t mode, Uid_t effective, Stat_t* statbufp)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV U32	Perl_cast_ulong(pTHX_ NV f)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV I32	Perl_cast_i32(pTHX_ NV f)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV IV	Perl_cast_iv(pTHX_ NV f)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV UV	Perl_cast_uv(pTHX_ NV f)
+			__attribute__warn_unused_result__;
+
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+PERL_CALLCONV I32	Perl_my_chsize(pTHX_ int fd, Off_t length)
+			__attribute__warn_unused_result__;
+
+#endif
+#if defined(USE_5005THREADS)
+PERL_CALLCONV MAGIC*	Perl_condpair_magic(pTHX_ SV *sv);
+#endif
+PERL_CALLCONV OP*	Perl_convert(pTHX_ I32 optype, I32 flags, OP* o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_croak(pTHX_ const char* pat, ...)
+			__attribute__noreturn__
+			__attribute__format__(__printf__,pTHX_1,pTHX_2);
+
+PERL_CALLCONV void	Perl_vcroak(pTHX_ const char* pat, va_list* args)
+			__attribute__noreturn__;
+
+#if defined(PERL_IMPLICIT_CONTEXT)
+PERL_CALLCONV void	Perl_croak_nocontext(const char* pat, ...)
+			__attribute__noreturn__
+			__attribute__format__(__printf__,1,2);
+
+PERL_CALLCONV OP*	Perl_die_nocontext(const char* pat, ...)
+			__attribute__format__(__printf__,1,2);
+
+PERL_CALLCONV void	Perl_deb_nocontext(const char* pat, ...)
+			__attribute__format__(__printf__,1,2);
+
+PERL_CALLCONV char*	Perl_form_nocontext(const char* pat, ...)
+			__attribute__format__(__printf__,1,2);
+
+PERL_CALLCONV void	Perl_load_module_nocontext(U32 flags, SV* name, SV* ver, ...);
+PERL_CALLCONV SV*	Perl_mess_nocontext(const char* pat, ...)
+			__attribute__format__(__printf__,1,2);
+
+PERL_CALLCONV void	Perl_warn_nocontext(const char* pat, ...)
+			__attribute__format__(__printf__,1,2);
+
+PERL_CALLCONV void	Perl_warner_nocontext(U32 err, const char* pat, ...)
+			__attribute__format__(__printf__,2,3);
+
+PERL_CALLCONV SV*	Perl_newSVpvf_nocontext(const char* pat, ...)
+			__attribute__format__(__printf__,1,2);
+
+PERL_CALLCONV void	Perl_sv_catpvf_nocontext(SV* sv, const char* pat, ...)
+			__attribute__format__(__printf__,2,3);
+
+PERL_CALLCONV void	Perl_sv_setpvf_nocontext(SV* sv, const char* pat, ...)
+			__attribute__format__(__printf__,2,3);
+
+PERL_CALLCONV void	Perl_sv_catpvf_mg_nocontext(SV* sv, const char* pat, ...)
+			__attribute__format__(__printf__,2,3);
+
+PERL_CALLCONV void	Perl_sv_setpvf_mg_nocontext(SV* sv, const char* pat, ...)
+			__attribute__format__(__printf__,2,3);
+
+PERL_CALLCONV int	Perl_fprintf_nocontext(PerlIO* stream, const char* fmt, ...)
+			__attribute__format__(__printf__,2,3);
+
+PERL_CALLCONV int	Perl_printf_nocontext(const char* fmt, ...)
+			__attribute__format__(__printf__,1,2);
+
+#endif
+PERL_CALLCONV void	Perl_cv_ckproto(pTHX_ CV* cv, GV* gv, char* p);
+PERL_CALLCONV CV*	Perl_cv_clone(pTHX_ CV* proto);
+PERL_CALLCONV SV*	Perl_cv_const_sv(pTHX_ CV* cv)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_op_const_sv(pTHX_ OP* o, CV* cv)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_cv_undef(pTHX_ CV* cv);
+PERL_CALLCONV void	Perl_cx_dump(pTHX_ PERL_CONTEXT* cx);
+PERL_CALLCONV SV*	Perl_filter_add(pTHX_ filter_t funcp, SV* datasv);
+PERL_CALLCONV void	Perl_filter_del(pTHX_ filter_t funcp);
+PERL_CALLCONV I32	Perl_filter_read(pTHX_ int idx, SV* buffer, int maxlen)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV char**	Perl_get_op_descs(pTHX)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV char**	Perl_get_op_names(pTHX)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV char*	Perl_get_no_modify(pTHX)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV U32*	Perl_get_opargs(pTHX)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV PPADDR_t*	Perl_get_ppaddr(pTHX)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV I32	Perl_cxinc(pTHX)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_deb(pTHX_ const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_1,pTHX_2);
+
+PERL_CALLCONV void	Perl_vdeb(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV void	Perl_debprofdump(pTHX);
+PERL_CALLCONV I32	Perl_debop(pTHX_ OP* o);
+PERL_CALLCONV I32	Perl_debstack(pTHX);
+PERL_CALLCONV I32	Perl_debstackptrs(pTHX);
+PERL_CALLCONV char*	Perl_delimcpy(pTHX_ char* to, char* toend, char* from, char* fromend, int delim, I32* retlen);
+PERL_CALLCONV void	Perl_deprecate(pTHX_ char* s);
+PERL_CALLCONV void	Perl_deprecate_old(pTHX_ char* s);
+PERL_CALLCONV OP*	Perl_die(pTHX_ const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_1,pTHX_2);
+
+PERL_CALLCONV OP*	Perl_vdie(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV OP*	Perl_die_where(pTHX_ char* message, STRLEN msglen);
+PERL_CALLCONV void	Perl_dounwind(pTHX_ I32 cxix);
+PERL_CALLCONV bool	Perl_do_aexec(pTHX_ SV* really, SV** mark, SV** sp);
+PERL_CALLCONV bool	Perl_do_aexec5(pTHX_ SV* really, SV** mark, SV** sp, int fd, int flag);
+PERL_CALLCONV int	Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode);
+PERL_CALLCONV void	Perl_do_chop(pTHX_ SV* asv, SV* sv);
+PERL_CALLCONV bool	Perl_do_close(pTHX_ GV* gv, bool not_implicit);
+PERL_CALLCONV bool	Perl_do_eof(pTHX_ GV* gv);
+PERL_CALLCONV bool	Perl_do_exec(pTHX_ char* cmd);
+#if defined(WIN32)
+PERL_CALLCONV int	Perl_do_aspawn(pTHX_ SV* really, SV** mark, SV** sp);
+PERL_CALLCONV int	Perl_do_spawn(pTHX_ char* cmd);
+PERL_CALLCONV int	Perl_do_spawn_nowait(pTHX_ char* cmd);
+#endif
+#if !defined(WIN32)
+PERL_CALLCONV bool	Perl_do_exec3(pTHX_ char* cmd, int fd, int flag);
+#endif
+PERL_CALLCONV void	Perl_do_execfree(pTHX);
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+PERL_CALLCONV I32	Perl_do_ipcctl(pTHX_ I32 optype, SV** mark, SV** sp);
+PERL_CALLCONV I32	Perl_do_ipcget(pTHX_ I32 optype, SV** mark, SV** sp);
+PERL_CALLCONV I32	Perl_do_msgrcv(pTHX_ SV** mark, SV** sp);
+PERL_CALLCONV I32	Perl_do_msgsnd(pTHX_ SV** mark, SV** sp);
+PERL_CALLCONV I32	Perl_do_semop(pTHX_ SV** mark, SV** sp);
+PERL_CALLCONV I32	Perl_do_shmio(pTHX_ I32 optype, SV** mark, SV** sp);
+#endif
+PERL_CALLCONV void	Perl_do_join(pTHX_ SV* sv, SV* del, SV** mark, SV** sp);
+PERL_CALLCONV OP*	Perl_do_kv(pTHX);
+PERL_CALLCONV bool	Perl_do_open(pTHX_ GV* gv, char* name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO* supplied_fp);
+PERL_CALLCONV bool	Perl_do_open9(pTHX_ GV *gv, char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs, I32 num);
+PERL_CALLCONV bool	Perl_do_openn(pTHX_ GV *gv, char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV **svp, I32 num);
+PERL_CALLCONV void	Perl_do_pipe(pTHX_ SV* sv, GV* rgv, GV* wgv);
+PERL_CALLCONV bool	Perl_do_print(pTHX_ SV* sv, PerlIO* fp);
+PERL_CALLCONV OP*	Perl_do_readline(pTHX)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV I32	Perl_do_chomp(pTHX_ SV* sv);
+PERL_CALLCONV bool	Perl_do_seek(pTHX_ GV* gv, Off_t pos, int whence);
+PERL_CALLCONV void	Perl_do_sprintf(pTHX_ SV* sv, I32 len, SV** sarg);
+PERL_CALLCONV Off_t	Perl_do_sysseek(pTHX_ GV* gv, Off_t pos, int whence);
+PERL_CALLCONV Off_t	Perl_do_tell(pTHX_ GV* gv)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV I32	Perl_do_trans(pTHX_ SV* sv);
+PERL_CALLCONV UV	Perl_do_vecget(pTHX_ SV* sv, I32 offset, I32 size);
+PERL_CALLCONV void	Perl_do_vecset(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_do_vop(pTHX_ I32 optype, SV* sv, SV* left, SV* right);
+PERL_CALLCONV OP*	Perl_dofile(pTHX_ OP* term);
+PERL_CALLCONV I32	Perl_dowantarray(pTHX)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_dump_all(pTHX);
+PERL_CALLCONV void	Perl_dump_eval(pTHX);
+#if defined(DUMP_FDS)
+PERL_CALLCONV void	Perl_dump_fds(pTHX_ char* s);
+#endif
+PERL_CALLCONV void	Perl_dump_form(pTHX_ GV* gv);
+PERL_CALLCONV void	Perl_gv_dump(pTHX_ GV* gv);
+PERL_CALLCONV void	Perl_op_dump(pTHX_ OP* arg);
+PERL_CALLCONV void	Perl_pmop_dump(pTHX_ PMOP* pm);
+PERL_CALLCONV void	Perl_dump_packsubs(pTHX_ HV* stash);
+PERL_CALLCONV void	Perl_dump_sub(pTHX_ GV* gv);
+PERL_CALLCONV void	Perl_fbm_compile(pTHX_ SV* sv, U32 flags);
+PERL_CALLCONV char*	Perl_fbm_instr(pTHX_ unsigned char* big, unsigned char* bigend, SV* littlesv, U32 flags)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV char*	Perl_find_script(pTHX_ char *scriptname, bool dosearch, char **search_ext, I32 flags);
+#if defined(USE_5005THREADS)
+PERL_CALLCONV PADOFFSET	Perl_find_threadsv(pTHX_ const char *name);
+#endif
+PERL_CALLCONV OP*	Perl_force_list(pTHX_ OP* arg);
+PERL_CALLCONV OP*	Perl_fold_constants(pTHX_ OP* arg);
+PERL_CALLCONV char*	Perl_form(pTHX_ const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_1,pTHX_2);
+
+PERL_CALLCONV char*	Perl_vform(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV void	Perl_free_tmps(pTHX);
+PERL_CALLCONV OP*	Perl_gen_constant_list(pTHX_ OP* o);
+#if !defined(HAS_GETENV_LEN)
+PERL_CALLCONV char*	Perl_getenv_len(pTHX_ const char* key, unsigned long *len);
+#endif
+PERL_CALLCONV void	Perl_gp_free(pTHX_ GV* gv);
+PERL_CALLCONV GP*	Perl_gp_ref(pTHX_ GP* gp);
+PERL_CALLCONV GV*	Perl_gv_AVadd(pTHX_ GV* gv);
+PERL_CALLCONV GV*	Perl_gv_HVadd(pTHX_ GV* gv);
+PERL_CALLCONV GV*	Perl_gv_IOadd(pTHX_ GV* gv);
+PERL_CALLCONV GV*	Perl_gv_autoload4(pTHX_ HV* stash, const char* name, STRLEN len, I32 method)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_gv_check(pTHX_ HV* stash);
+PERL_CALLCONV void	Perl_gv_efullname(pTHX_ SV* sv, GV* gv);
+/* PERL_CALLCONV void	Perl_gv_efullname3(pTHX_ SV* sv, GV* gv, const char* prefix); */
+PERL_CALLCONV void	Perl_gv_efullname4(pTHX_ SV* sv, GV* gv, const char* prefix, bool keepmain);
+PERL_CALLCONV GV*	Perl_gv_fetchfile(pTHX_ const char* name);
+PERL_CALLCONV GV*	Perl_gv_fetchmeth(pTHX_ HV* stash, const char* name, STRLEN len, I32 level);
+PERL_CALLCONV GV*	Perl_gv_fetchmeth_autoload(pTHX_ HV* stash, const char* name, STRLEN len, I32 level);
+PERL_CALLCONV GV*	Perl_gv_fetchmethod(pTHX_ HV* stash, const char* name);
+PERL_CALLCONV GV*	Perl_gv_fetchmethod_autoload(pTHX_ HV* stash, const char* name, I32 autoload);
+PERL_CALLCONV GV*	Perl_gv_fetchpv(pTHX_ const char* name, I32 add, I32 sv_type);
+PERL_CALLCONV void	Perl_gv_fullname(pTHX_ SV* sv, GV* gv);
+/* PERL_CALLCONV void	Perl_gv_fullname3(pTHX_ SV* sv, GV* gv, const char* prefix); */
+PERL_CALLCONV void	Perl_gv_fullname4(pTHX_ SV* sv, GV* gv, const char* prefix, bool keepmain);
+PERL_CALLCONV void	Perl_gv_init(pTHX_ GV* gv, HV* stash, const char* name, STRLEN len, int multi);
+PERL_CALLCONV HV*	Perl_gv_stashpv(pTHX_ const char* name, I32 create);
+PERL_CALLCONV HV*	Perl_gv_stashpvn(pTHX_ const char* name, U32 namelen, I32 create);
+PERL_CALLCONV HV*	Perl_gv_stashsv(pTHX_ SV* sv, I32 create);
+PERL_CALLCONV void	Perl_hv_clear(pTHX_ HV* tb);
+PERL_CALLCONV void	Perl_hv_delayfree_ent(pTHX_ HV* hv, HE* entry);
+PERL_CALLCONV SV*	Perl_hv_delete(pTHX_ HV* tb, const char* key, I32 klen, I32 flags);
+PERL_CALLCONV SV*	Perl_hv_delete_ent(pTHX_ HV* tb, SV* key, I32 flags, U32 hash);
+PERL_CALLCONV bool	Perl_hv_exists(pTHX_ HV* tb, const char* key, I32 klen)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_hv_exists_ent(pTHX_ HV* tb, SV* key, U32 hash)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV**	Perl_hv_fetch(pTHX_ HV* tb, const char* key, I32 klen, I32 lval);
+PERL_CALLCONV HE*	Perl_hv_fetch_ent(pTHX_ HV* tb, SV* key, I32 lval, U32 hash);
+PERL_CALLCONV void	Perl_hv_free_ent(pTHX_ HV* hv, HE* entryK);
+PERL_CALLCONV I32	Perl_hv_iterinit(pTHX_ HV* tb);
+PERL_CALLCONV char*	Perl_hv_iterkey(pTHX_ HE* entry, I32* retlen)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_hv_iterkeysv(pTHX_ HE* entry)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV HE*	Perl_hv_iternext(pTHX_ HV* tb)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_hv_iternextsv(pTHX_ HV* hv, char** key, I32* retlen)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV HE*	Perl_hv_iternext_flags(pTHX_ HV* tb, I32 flags)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_hv_iterval(pTHX_ HV* tb, HE* entry)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_hv_ksplit(pTHX_ HV* hv, IV newmax);
+PERL_CALLCONV void	Perl_hv_magic(pTHX_ HV* hv, GV* gv, int how);
+PERL_CALLCONV SV**	Perl_hv_store(pTHX_ HV* tb, const char* key, I32 klen, SV* val, U32 hash);
+PERL_CALLCONV HE*	Perl_hv_store_ent(pTHX_ HV* tb, SV* key, SV* val, U32 hash);
+PERL_CALLCONV SV**	Perl_hv_store_flags(pTHX_ HV* tb, const char* key, I32 klen, SV* val, U32 hash, int flags);
+PERL_CALLCONV void	Perl_hv_undef(pTHX_ HV* tb);
+PERL_CALLCONV I32	Perl_ibcmp(pTHX_ const char* a, const char* b, I32 len)
+			__attribute__pure__;
+
+PERL_CALLCONV I32	Perl_ibcmp_locale(pTHX_ const char* a, const char* b, I32 len)
+			__attribute__pure__;
+
+PERL_CALLCONV I32	Perl_ibcmp_utf8(pTHX_ const char* a, char **pe1, UV l1, bool u1, const char* b, char **pe2, UV l2, bool u2);
+PERL_CALLCONV bool	Perl_ingroup(pTHX_ Gid_t testgid, Uid_t effective)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_init_argv_symbols(pTHX_ int argc, char **argv);
+PERL_CALLCONV void	Perl_init_debugger(pTHX);
+PERL_CALLCONV void	Perl_init_stacks(pTHX);
+PERL_CALLCONV void	Perl_init_tm(pTHX_ struct tm *ptm);
+PERL_CALLCONV U32	Perl_intro_my(pTHX);
+PERL_CALLCONV char*	Perl_instr(pTHX_ const char* big, const char* little)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_io_close(pTHX_ IO* io, bool not_implicit)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_invert(pTHX_ OP* cmd)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_gv_magical(pTHX_ char *name, STRLEN len, U32 flags)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV I32	Perl_is_lvalue_sub(pTHX)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV U32	Perl_to_uni_upper_lc(pTHX_ U32 c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV U32	Perl_to_uni_title_lc(pTHX_ U32 c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV U32	Perl_to_uni_lower_lc(pTHX_ U32 c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_alnum(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_alnumc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_idfirst(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_alpha(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_ascii(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_space(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_cntrl(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_graph(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_digit(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_upper(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_lower(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_print(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_punct(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_xdigit(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV UV	Perl_to_uni_upper(pTHX_ UV c, U8 *p, STRLEN *lenp);
+PERL_CALLCONV UV	Perl_to_uni_title(pTHX_ UV c, U8 *p, STRLEN *lenp);
+PERL_CALLCONV UV	Perl_to_uni_lower(pTHX_ UV c, U8 *p, STRLEN *lenp);
+PERL_CALLCONV UV	Perl_to_uni_fold(pTHX_ UV c, U8 *p, STRLEN *lenp);
+PERL_CALLCONV bool	Perl_is_uni_alnum_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_alnumc_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_idfirst_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_alpha_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_ascii_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_space_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_cntrl_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_graph_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_digit_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_upper_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_lower_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_print_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_punct_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV bool	Perl_is_uni_xdigit_lc(pTHX_ UV c)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV STRLEN	Perl_is_utf8_char(pTHX_ U8 *p);
+PERL_CALLCONV bool	Perl_is_utf8_string_loc(pTHX_ U8 *s, STRLEN len, U8 **p);
+PERL_CALLCONV bool	Perl_is_utf8_string(pTHX_ U8 *s, STRLEN len);
+PERL_CALLCONV bool	Perl_is_utf8_alnum(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_alnumc(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_idfirst(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_idcont(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_alpha(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_ascii(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_space(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_cntrl(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_digit(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_graph(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_upper(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_lower(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_print(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_punct(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_xdigit(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_is_utf8_mark(pTHX_ U8 *p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_jmaybe(pTHX_ OP* arg);
+PERL_CALLCONV I32	Perl_keyword(pTHX_ char* d, I32 len)
+			__attribute__pure__;
+
+PERL_CALLCONV void	Perl_leave_scope(pTHX_ I32 base);
+PERL_CALLCONV void	Perl_lex_end(pTHX);
+PERL_CALLCONV void	Perl_lex_start(pTHX_ SV* line);
+PERL_CALLCONV void	Perl_op_null(pTHX_ OP* o);
+PERL_CALLCONV void	Perl_op_clear(pTHX_ OP* o);
+PERL_CALLCONV OP*	Perl_linklist(pTHX_ OP* o);
+PERL_CALLCONV OP*	Perl_list(pTHX_ OP* o);
+PERL_CALLCONV OP*	Perl_listkids(pTHX_ OP* o);
+PERL_CALLCONV void	Perl_load_module(pTHX_ U32 flags, SV* name, SV* ver, ...);
+PERL_CALLCONV void	Perl_vload_module(pTHX_ U32 flags, SV* name, SV* ver, va_list* args);
+PERL_CALLCONV OP*	Perl_localize(pTHX_ OP* arg, I32 lexical);
+PERL_CALLCONV I32	Perl_looks_like_number(pTHX_ SV* sv)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV UV	Perl_grok_bin(pTHX_ char* start, STRLEN* len, I32* flags, NV *result);
+PERL_CALLCONV UV	Perl_grok_hex(pTHX_ char* start, STRLEN* len, I32* flags, NV *result);
+PERL_CALLCONV int	Perl_grok_number(pTHX_ const char *pv, STRLEN len, UV *valuep);
+PERL_CALLCONV bool	Perl_grok_numeric_radix(pTHX_ const char **sp, const char *send)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV UV	Perl_grok_oct(pTHX_ char* start, STRLEN* len_p, I32* flags, NV *result);
+PERL_CALLCONV int	Perl_magic_clearenv(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_clear_all_env(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_clearpack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_clearsig(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_existspack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_freeregexp(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_freeovrld(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_get(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_getarylen(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_getdefelem(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_getglob(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_getnkeys(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_getpack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_getpos(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_getsig(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_getsubstr(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_gettaint(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_getuvar(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_getvec(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV U32	Perl_magic_len(pTHX_ SV* sv, MAGIC* mg);
+#if defined(USE_5005THREADS)
+PERL_CALLCONV int	Perl_magic_mutexfree(pTHX_ SV* sv, MAGIC* mg);
+#endif
+PERL_CALLCONV int	Perl_magic_nextpack(pTHX_ SV* sv, MAGIC* mg, SV* key);
+PERL_CALLCONV U32	Perl_magic_regdata_cnt(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_regdatum_get(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_regdatum_set(pTHX_ SV* sv, MAGIC* mg)
+			__attribute__noreturn__;
+
+PERL_CALLCONV int	Perl_magic_set(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setamagic(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setarylen(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setbm(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setdbline(pTHX_ SV* sv, MAGIC* mg);
+#if defined(USE_LOCALE_COLLATE)
+PERL_CALLCONV int	Perl_magic_setcollxfrm(pTHX_ SV* sv, MAGIC* mg);
+#endif
+PERL_CALLCONV int	Perl_magic_setdefelem(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setenv(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setfm(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setisa(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setglob(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setmglob(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setnkeys(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setpack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setpos(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setregexp(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setsig(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setsubstr(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_settaint(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setuvar(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setvec(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_setutf8(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_set_all_env(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV U32	Perl_magic_sizepack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int	Perl_magic_wipepack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV void	Perl_magicname(pTHX_ char* sym, char* name, I32 namlen);
+PERL_CALLCONV void	Perl_markstack_grow(pTHX);
+#if defined(USE_LOCALE_COLLATE)
+PERL_CALLCONV char*	Perl_mem_collxfrm(pTHX_ const char* s, STRLEN len, STRLEN* xlen);
+#endif
+PERL_CALLCONV SV*	Perl_mess(pTHX_ const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_1,pTHX_2);
+
+PERL_CALLCONV SV*	Perl_vmess(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV void	Perl_qerror(pTHX_ SV* err);
+PERL_CALLCONV void	Perl_sortsv(pTHX_ SV** array, size_t num_elts, SVCOMPARE_t cmp);
+PERL_CALLCONV int	Perl_mg_clear(pTHX_ SV* sv);
+PERL_CALLCONV int	Perl_mg_copy(pTHX_ SV* sv, SV* nsv, const char* key, I32 klen);
+PERL_CALLCONV MAGIC*	Perl_mg_find(pTHX_ SV* sv, int type)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV int	Perl_mg_free(pTHX_ SV* sv);
+PERL_CALLCONV int	Perl_mg_get(pTHX_ SV* sv);
+PERL_CALLCONV U32	Perl_mg_length(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_mg_magical(pTHX_ SV* sv);
+PERL_CALLCONV int	Perl_mg_set(pTHX_ SV* sv);
+PERL_CALLCONV I32	Perl_mg_size(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_mini_mktime(pTHX_ struct tm *pm);
+PERL_CALLCONV OP*	Perl_mod(pTHX_ OP* o, I32 type);
+PERL_CALLCONV int	Perl_mode_from_discipline(pTHX_ SV* discp);
+PERL_CALLCONV char*	Perl_moreswitches(pTHX_ char* s);
+PERL_CALLCONV OP*	Perl_my(pTHX_ OP* o);
+PERL_CALLCONV NV	Perl_my_atof(pTHX_ const char *s);
+#if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
+PERL_CALLCONV char*	Perl_my_bcopy(const char* from, char* to, I32 len);
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+PERL_CALLCONV char*	Perl_my_bzero(char* loc, I32 len);
+#endif
+PERL_CALLCONV void	Perl_my_exit(pTHX_ U32 status)
+			__attribute__noreturn__;
+
+PERL_CALLCONV void	Perl_my_failure_exit(pTHX)
+			__attribute__noreturn__;
+
+PERL_CALLCONV I32	Perl_my_fflush_all(pTHX);
+PERL_CALLCONV Pid_t	Perl_my_fork(void);
+PERL_CALLCONV void	Perl_atfork_lock(void);
+PERL_CALLCONV void	Perl_atfork_unlock(void);
+PERL_CALLCONV I32	Perl_my_lstat(pTHX);
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+PERL_CALLCONV I32	Perl_my_memcmp(const char* s1, const char* s2, I32 len)
+			__attribute__pure__;
+
+#endif
+#if !defined(HAS_MEMSET)
+PERL_CALLCONV void*	Perl_my_memset(char* loc, I32 ch, I32 len);
+#endif
+PERL_CALLCONV I32	Perl_my_pclose(pTHX_ PerlIO* ptr);
+PERL_CALLCONV PerlIO*	Perl_my_popen(pTHX_ char* cmd, char* mode);
+PERL_CALLCONV PerlIO*	Perl_my_popen_list(pTHX_ char* mode, int n, SV ** args);
+PERL_CALLCONV void	Perl_my_setenv(pTHX_ char* nam, char* val);
+PERL_CALLCONV I32	Perl_my_stat(pTHX);
+PERL_CALLCONV char *	Perl_my_strftime(pTHX_ char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst);
+#if defined(MYSWAP)
+PERL_CALLCONV short	Perl_my_swap(pTHX_ short s)
+			__attribute__malloc__
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV long	Perl_my_htonl(pTHX_ long l)
+			__attribute__malloc__
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV long	Perl_my_ntohl(pTHX_ long l)
+			__attribute__malloc__
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+#endif
+PERL_CALLCONV void	Perl_my_unexec(pTHX);
+PERL_CALLCONV OP*	Perl_newANONLIST(pTHX_ OP* o)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newANONHASH(pTHX_ OP* o)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newANONSUB(pTHX_ I32 floor, OP* proto, OP* block);
+PERL_CALLCONV OP*	Perl_newASSIGNOP(pTHX_ I32 flags, OP* left, I32 optype, OP* right)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newCONDOP(pTHX_ I32 flags, OP* first, OP* trueop, OP* falseop)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV CV*	Perl_newCONSTSUB(pTHX_ HV* stash, char* name, SV* sv);
+PERL_CALLCONV void	Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block);
+PERL_CALLCONV OP*	Perl_newFOROP(pTHX_ I32 flags, char* label, line_t forline, OP* sv, OP* expr, OP* block, OP* cont)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newLOGOP(pTHX_ I32 optype, I32 flags, OP* left, OP* right)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newLOOPEX(pTHX_ I32 type, OP* label)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP* expr, OP* block)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newNULLLIST(pTHX)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newOP(pTHX_ I32 optype, I32 flags)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_newPROG(pTHX_ OP* o);
+PERL_CALLCONV OP*	Perl_newRANGE(pTHX_ I32 flags, OP* left, OP* right)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newSLICEOP(pTHX_ I32 flags, OP* subscript, OP* listop)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newSTATEOP(pTHX_ I32 flags, char* label, OP* o)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV CV*	Perl_newSUB(pTHX_ I32 floor, OP* o, OP* proto, OP* block);
+PERL_CALLCONV CV*	Perl_newXS(pTHX_ char* name, XSUBADDR_t f, char* filename);
+PERL_CALLCONV AV*	Perl_newAV(pTHX)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newAVREF(pTHX_ OP* o)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newBINOP(pTHX_ I32 type, I32 flags, OP* first, OP* last)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newCVREF(pTHX_ I32 flags, OP* o)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newGVOP(pTHX_ I32 type, I32 flags, GV* gv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV GV*	Perl_newGVgen(pTHX_ char* pack)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newGVREF(pTHX_ I32 type, OP* o)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newHVREF(pTHX_ OP* o)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV HV*	Perl_newHV(pTHX)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV HV*	Perl_newHVhv(pTHX_ HV* hv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV IO*	Perl_newIO(pTHX)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP* first, OP* last)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newPADOP(pTHX_ I32 type, I32 flags, SV* sv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newPMOP(pTHX_ I32 type, I32 flags)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newPVOP(pTHX_ I32 type, I32 flags, char* pv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newRV(pTHX_ SV* pref)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newRV_noinc(pTHX_ SV *sv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newSV(pTHX_ STRLEN len)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newSVREF(pTHX_ OP* o)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newSVOP(pTHX_ I32 type, I32 flags, SV* sv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newSViv(pTHX_ IV i)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newSVuv(pTHX_ UV u)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newSVnv(pTHX_ NV n)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newSVpv(pTHX_ const char* s, STRLEN len)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newSVpvn(pTHX_ const char* s, STRLEN len)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newSVpvn_share(pTHX_ const char* s, I32 len, U32 hash)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newSVpvf(pTHX_ const char* pat, ...)
+			__attribute__malloc__
+			__attribute__warn_unused_result__
+			__attribute__format__(__printf__,pTHX_1,pTHX_2);
+
+PERL_CALLCONV SV*	Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_newSVrv(pTHX_ SV* rv, const char* classname);
+PERL_CALLCONV SV*	Perl_newSVsv(pTHX_ SV* old)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newUNOP(pTHX_ I32 type, I32 flags, OP* first)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP* loop, I32 whileline, OP* expr, OP* block, OP* cont)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV PERL_SI*	Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV char*	Perl_scan_vstring(pTHX_ char *vstr, SV *sv);
+PERL_CALLCONV PerlIO*	Perl_nextargv(pTHX_ GV* gv);
+PERL_CALLCONV char*	Perl_ninstr(pTHX_ const char* big, const char* bigend, const char* little, const char* lend)
+			__attribute__pure__;
+
+PERL_CALLCONV OP*	Perl_oopsCV(pTHX_ OP* o)
+			__attribute__noreturn__;
+
+PERL_CALLCONV void	Perl_op_free(pTHX_ OP* arg);
+PERL_CALLCONV void	Perl_package(pTHX_ OP* o);
+PERL_CALLCONV PADOFFSET	Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype);
+PERL_CALLCONV PADOFFSET	Perl_allocmy(pTHX_ char* name);
+PERL_CALLCONV PADOFFSET	Perl_pad_findmy(pTHX_ char* name)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_oopsAV(pTHX_ OP* o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_oopsHV(pTHX_ OP* o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_pad_leavemy(pTHX);
+PERL_CALLCONV SV*	Perl_pad_sv(pTHX_ PADOFFSET po);
+PERL_CALLCONV void	Perl_pad_free(pTHX_ PADOFFSET po);
+PERL_CALLCONV void	Perl_pad_reset(pTHX);
+PERL_CALLCONV void	Perl_pad_swipe(pTHX_ PADOFFSET po, bool refadjust);
+PERL_CALLCONV void	Perl_peep(pTHX_ OP* o);
+PERL_CALLCONV PerlIO*	Perl_start_glob(pTHX_ SV* pattern, IO *io);
+#if defined(USE_5005THREADS)
+PERL_CALLCONV struct perl_thread*	Perl_new_struct_thread(pTHX_ struct perl_thread *t);
+#endif
+#if defined(USE_REENTRANT_API)
+PERL_CALLCONV void	Perl_reentrant_size(pTHX);
+PERL_CALLCONV void	Perl_reentrant_init(pTHX);
+PERL_CALLCONV void	Perl_reentrant_free(pTHX);
+PERL_CALLCONV void*	Perl_reentrant_retry(const char*, ...);
+#endif
+PERL_CALLCONV void	Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr);
+PERL_CALLCONV I32	Perl_call_argv(pTHX_ const char* sub_name, I32 flags, char** argv);
+PERL_CALLCONV I32	Perl_call_method(pTHX_ const char* methname, I32 flags);
+PERL_CALLCONV I32	Perl_call_pv(pTHX_ const char* sub_name, I32 flags);
+PERL_CALLCONV I32	Perl_call_sv(pTHX_ SV* sv, I32 flags);
+PERL_CALLCONV void	Perl_despatch_signals(pTHX);
+PERL_CALLCONV SV*	Perl_eval_pv(pTHX_ const char* p, I32 croak_on_error);
+PERL_CALLCONV I32	Perl_eval_sv(pTHX_ SV* sv, I32 flags);
+PERL_CALLCONV SV*	Perl_get_sv(pTHX_ const char* name, I32 create);
+PERL_CALLCONV AV*	Perl_get_av(pTHX_ const char* name, I32 create);
+PERL_CALLCONV HV*	Perl_get_hv(pTHX_ const char* name, I32 create);
+PERL_CALLCONV CV*	Perl_get_cv(pTHX_ const char* name, I32 create);
+PERL_CALLCONV int	Perl_init_i18nl10n(pTHX_ int printwarn);
+PERL_CALLCONV int	Perl_init_i18nl14n(pTHX_ int printwarn);
+PERL_CALLCONV void	Perl_new_collate(pTHX_ char* newcoll);
+PERL_CALLCONV void	Perl_new_ctype(pTHX_ char* newctype);
+PERL_CALLCONV void	Perl_new_numeric(pTHX_ char* newcoll);
+PERL_CALLCONV void	Perl_set_numeric_local(pTHX);
+PERL_CALLCONV void	Perl_set_numeric_radix(pTHX);
+PERL_CALLCONV void	Perl_set_numeric_standard(pTHX);
+PERL_CALLCONV void	Perl_require_pv(pTHX_ const char* pv);
+PERL_CALLCONV void	Perl_pack_cat(pTHX_ SV *cat, char *pat, char *patend, SV **beglist, SV **endlist, SV ***next_in_list, U32 flags);
+PERL_CALLCONV void	Perl_packlist(pTHX_ SV *cat, char *pat, char *patend, SV **beglist, SV **endlist);
+PERL_CALLCONV void	Perl_pidgone(pTHX_ Pid_t pid, int status);
+PERL_CALLCONV void	Perl_pmflag(pTHX_ U32* pmfl, int ch);
+PERL_CALLCONV OP*	Perl_pmruntime(pTHX_ OP* pm, OP* expr, OP* repl);
+PERL_CALLCONV OP*	Perl_pmtrans(pTHX_ OP* o, OP* expr, OP* repl);
+PERL_CALLCONV OP*	Perl_pop_return(pTHX);
+PERL_CALLCONV void	Perl_pop_scope(pTHX);
+PERL_CALLCONV OP*	Perl_prepend_elem(pTHX_ I32 optype, OP* head, OP* tail);
+PERL_CALLCONV void	Perl_push_return(pTHX_ OP* o);
+PERL_CALLCONV void	Perl_push_scope(pTHX);
+PERL_CALLCONV OP*	Perl_ref(pTHX_ OP* o, I32 type);
+PERL_CALLCONV OP*	Perl_refkids(pTHX_ OP* o, I32 type);
+PERL_CALLCONV void	Perl_regdump(pTHX_ regexp* r);
+PERL_CALLCONV SV*	Perl_regclass_swash(pTHX_ struct regnode *n, bool doinit, SV **listsvp, SV **altsvp);
+PERL_CALLCONV I32	Perl_pregexec(pTHX_ regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, U32 nosave);
+PERL_CALLCONV void	Perl_pregfree(pTHX_ struct regexp* r);
+PERL_CALLCONV regexp*	Perl_pregcomp(pTHX_ char* exp, char* xend, PMOP* pm);
+PERL_CALLCONV char*	Perl_re_intuit_start(pTHX_ regexp* prog, SV* sv, char* strpos, char* strend, U32 flags, struct re_scream_pos_data_s *data);
+PERL_CALLCONV SV*	Perl_re_intuit_string(pTHX_ regexp* prog);
+PERL_CALLCONV I32	Perl_regexec_flags(pTHX_ regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, void* data, U32 flags);
+PERL_CALLCONV regnode*	Perl_regnext(pTHX_ regnode* p)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_regprop(pTHX_ SV* sv, regnode* o);
+PERL_CALLCONV void	Perl_repeatcpy(pTHX_ char* to, const char* from, I32 len, I32 count);
+PERL_CALLCONV char*	Perl_rninstr(pTHX_ const char* big, const char* bigend, const char* little, const char* lend)
+			__attribute__pure__;
+
+PERL_CALLCONV Sighandler_t	Perl_rsignal(pTHX_ int i, Sighandler_t t);
+PERL_CALLCONV int	Perl_rsignal_restore(pTHX_ int i, Sigsave_t* t);
+PERL_CALLCONV int	Perl_rsignal_save(pTHX_ int i, Sighandler_t t1, Sigsave_t* t2);
+PERL_CALLCONV Sighandler_t	Perl_rsignal_state(pTHX_ int i);
+PERL_CALLCONV void	Perl_rxres_free(pTHX_ void** rsp);
+PERL_CALLCONV void	Perl_rxres_restore(pTHX_ void** rsp, REGEXP* prx);
+PERL_CALLCONV void	Perl_rxres_save(pTHX_ void** rsp, REGEXP* prx);
+#if !defined(HAS_RENAME)
+PERL_CALLCONV I32	Perl_same_dirent(pTHX_ char* a, char* b);
+#endif
+PERL_CALLCONV char*	Perl_savepv(pTHX_ const char* pv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV char*	Perl_savepvn(pTHX_ const char* pv, I32 len)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV char*	Perl_savesharedpv(pTHX_ const char* pv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_savestack_grow(pTHX);
+PERL_CALLCONV void	Perl_savestack_grow_cnt(pTHX_ I32 need);
+PERL_CALLCONV void	Perl_save_aelem(pTHX_ AV* av, I32 idx, SV **sptr);
+PERL_CALLCONV I32	Perl_save_alloc(pTHX_ I32 size, I32 pad);
+PERL_CALLCONV void	Perl_save_aptr(pTHX_ AV** aptr);
+PERL_CALLCONV AV*	Perl_save_ary(pTHX_ GV* gv);
+PERL_CALLCONV void	Perl_save_bool(pTHX_ bool* boolp);
+PERL_CALLCONV void	Perl_save_clearsv(pTHX_ SV** svp);
+PERL_CALLCONV void	Perl_save_delete(pTHX_ HV* hv, char* key, I32 klen);
+PERL_CALLCONV void	Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p);
+PERL_CALLCONV void	Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p);
+PERL_CALLCONV void	Perl_save_freesv(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_save_freeop(pTHX_ OP* o);
+PERL_CALLCONV void	Perl_save_freepv(pTHX_ char* pv);
+PERL_CALLCONV void	Perl_save_generic_svref(pTHX_ SV** sptr);
+PERL_CALLCONV void	Perl_save_generic_pvref(pTHX_ char** str);
+PERL_CALLCONV void	Perl_save_shared_pvref(pTHX_ char** str);
+PERL_CALLCONV void	Perl_save_gp(pTHX_ GV* gv, I32 empty);
+PERL_CALLCONV HV*	Perl_save_hash(pTHX_ GV* gv);
+PERL_CALLCONV void	Perl_save_helem(pTHX_ HV* hv, SV *key, SV **sptr);
+PERL_CALLCONV void	Perl_save_hints(pTHX)
+			__attribute__noreturn__;
+
+PERL_CALLCONV void	Perl_save_hptr(pTHX_ HV** hptr);
+PERL_CALLCONV void	Perl_save_I16(pTHX_ I16* intp);
+PERL_CALLCONV void	Perl_save_I32(pTHX_ I32* intp);
+PERL_CALLCONV void	Perl_save_I8(pTHX_ I8* bytep);
+PERL_CALLCONV void	Perl_save_int(pTHX_ int* intp);
+PERL_CALLCONV void	Perl_save_item(pTHX_ SV* item);
+PERL_CALLCONV void	Perl_save_iv(pTHX_ IV* iv);
+PERL_CALLCONV void	Perl_save_list(pTHX_ SV** sarg, I32 maxsarg);
+PERL_CALLCONV void	Perl_save_long(pTHX_ long* longp);
+PERL_CALLCONV void	Perl_save_mortalizesv(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_save_nogv(pTHX_ GV* gv);
+PERL_CALLCONV void	Perl_save_op(pTHX);
+PERL_CALLCONV SV*	Perl_save_scalar(pTHX_ GV* gv);
+PERL_CALLCONV void	Perl_save_pptr(pTHX_ char** pptr);
+PERL_CALLCONV void	Perl_save_vptr(pTHX_ void* pptr);
+PERL_CALLCONV void	Perl_save_re_context(pTHX);
+PERL_CALLCONV void	Perl_save_padsv(pTHX_ PADOFFSET off);
+PERL_CALLCONV void	Perl_save_sptr(pTHX_ SV** sptr);
+PERL_CALLCONV SV*	Perl_save_svref(pTHX_ SV** sptr);
+#ifdef USE_5005THREADS
+PERL_CALLCONV SV**	Perl_save_threadsv(pTHX_ PADOFFSET i);
+#else
+PERL_CALLCONV SV**	Perl_save_threadsv(pTHX_ PADOFFSET i)
+			__attribute__noreturn__;
+
+#endif
+PERL_CALLCONV OP*	Perl_sawparens(pTHX_ OP* o);
+PERL_CALLCONV OP*	Perl_scalar(pTHX_ OP* o);
+PERL_CALLCONV OP*	Perl_scalarkids(pTHX_ OP* o);
+PERL_CALLCONV OP*	Perl_scalarseq(pTHX_ OP* o);
+PERL_CALLCONV OP*	Perl_scalarvoid(pTHX_ OP* o);
+PERL_CALLCONV NV	Perl_scan_bin(pTHX_ char* start, STRLEN len, STRLEN* retlen);
+PERL_CALLCONV NV	Perl_scan_hex(pTHX_ char* start, STRLEN len, STRLEN* retlen);
+PERL_CALLCONV char*	Perl_scan_num(pTHX_ char* s, YYSTYPE *lvalp);
+PERL_CALLCONV NV	Perl_scan_oct(pTHX_ char* start, STRLEN len, STRLEN* retlen);
+PERL_CALLCONV OP*	Perl_scope(pTHX_ OP* o);
+PERL_CALLCONV char*	Perl_screaminstr(pTHX_ SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *oldposp, I32 last);
+#if !defined(VMS)
+PERL_CALLCONV I32	Perl_setenv_getix(pTHX_ char* nam);
+#endif
+PERL_CALLCONV void	Perl_setdefout(pTHX_ GV* gv);
+PERL_CALLCONV HEK*	Perl_share_hek(pTHX_ const char* str, I32 len, U32 hash);
+PERL_CALLCONV Signal_t	Perl_sighandler(int sig);
+PERL_CALLCONV Signal_t	Perl_csighandler(int sig);
+PERL_CALLCONV SV**	Perl_stack_grow(pTHX_ SV** sp, SV**p, int n);
+PERL_CALLCONV I32	Perl_start_subparse(pTHX_ I32 is_format, U32 flags);
+PERL_CALLCONV void	Perl_sub_crush_depth(pTHX_ CV* cv);
+PERL_CALLCONV bool	Perl_sv_2bool(pTHX_ SV* sv);
+PERL_CALLCONV CV*	Perl_sv_2cv(pTHX_ SV* sv, HV** st, GV** gvp, I32 lref);
+PERL_CALLCONV IO*	Perl_sv_2io(pTHX_ SV* sv);
+PERL_CALLCONV IV	Perl_sv_2iv(pTHX_ SV* sv);
+PERL_CALLCONV SV*	Perl_sv_2mortal(pTHX_ SV* sv);
+PERL_CALLCONV NV	Perl_sv_2nv(pTHX_ SV* sv);
+/* PERL_CALLCONV char*	sv_2pv(pTHX_ SV* sv, STRLEN* lp); */
+PERL_CALLCONV char*	Perl_sv_2pvutf8(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV char*	Perl_sv_2pvbyte(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV char*	Perl_sv_pvn_nomg(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV UV	Perl_sv_2uv(pTHX_ SV* sv);
+PERL_CALLCONV IV	Perl_sv_iv(pTHX_ SV* sv);
+PERL_CALLCONV UV	Perl_sv_uv(pTHX_ SV* sv);
+PERL_CALLCONV NV	Perl_sv_nv(pTHX_ SV* sv);
+PERL_CALLCONV char*	Perl_sv_pvn(pTHX_ SV *sv, STRLEN *len);
+PERL_CALLCONV char*	Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *len);
+PERL_CALLCONV char*	Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *len);
+PERL_CALLCONV I32	Perl_sv_true(pTHX_ SV *sv);
+PERL_CALLCONV void	Perl_sv_add_arena(pTHX_ char* ptr, U32 size, U32 flags);
+PERL_CALLCONV int	Perl_sv_backoff(pTHX_ SV* sv);
+PERL_CALLCONV SV*	Perl_sv_bless(pTHX_ SV* sv, HV* stash);
+PERL_CALLCONV void	Perl_sv_catpvf(pTHX_ SV* sv, const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_2,pTHX_3);
+
+PERL_CALLCONV void	Perl_sv_vcatpvf(pTHX_ SV* sv, const char* pat, va_list* args);
+PERL_CALLCONV void	Perl_sv_catpv(pTHX_ SV* sv, const char* ptr);
+/* PERL_CALLCONV void	sv_catpvn(pTHX_ SV* sv, const char* ptr, STRLEN len); */
+/* PERL_CALLCONV void	sv_catsv(pTHX_ SV* dsv, SV* ssv); */
+PERL_CALLCONV void	Perl_sv_chop(pTHX_ SV* sv, char* ptr);
+PERL_CALLCONV I32	Perl_sv_clean_all(pTHX);
+PERL_CALLCONV void	Perl_sv_clean_objs(pTHX);
+PERL_CALLCONV void	Perl_sv_clear(pTHX_ SV* sv);
+PERL_CALLCONV I32	Perl_sv_cmp(pTHX_ SV* sv1, SV* sv2);
+PERL_CALLCONV I32	Perl_sv_cmp_locale(pTHX_ SV* sv1, SV* sv2);
+#if defined(USE_LOCALE_COLLATE)
+PERL_CALLCONV char*	Perl_sv_collxfrm(pTHX_ SV* sv, STRLEN* nxp);
+#endif
+PERL_CALLCONV OP*	Perl_sv_compile_2op(pTHX_ SV* sv, OP** startp, char* code, PAD** padp);
+PERL_CALLCONV int	Perl_getcwd_sv(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_sv_dec(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_sv_dump(pTHX_ SV* sv);
+PERL_CALLCONV bool	Perl_sv_derived_from(pTHX_ SV* sv, const char* name)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV I32	Perl_sv_eq(pTHX_ SV* sv1, SV* sv2);
+PERL_CALLCONV void	Perl_sv_free(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_sv_free_arenas(pTHX);
+PERL_CALLCONV char*	Perl_sv_gets(pTHX_ SV* sv, PerlIO* fp, I32 append);
+PERL_CALLCONV char*	Perl_sv_grow(pTHX_ SV* sv, STRLEN newlen);
+PERL_CALLCONV void	Perl_sv_inc(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_sv_insert(pTHX_ SV* bigsv, STRLEN offset, STRLEN len, char* little, STRLEN littlelen);
+PERL_CALLCONV int	Perl_sv_isa(pTHX_ SV* sv, const char* name);
+PERL_CALLCONV int	Perl_sv_isobject(pTHX_ SV* sv);
+PERL_CALLCONV STRLEN	Perl_sv_len(pTHX_ SV* sv);
+PERL_CALLCONV STRLEN	Perl_sv_len_utf8(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_sv_magic(pTHX_ SV* sv, SV* obj, int how, const char* name, I32 namlen);
+PERL_CALLCONV MAGIC *	Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtbl, const char* name, I32 namlen);
+PERL_CALLCONV SV*	Perl_sv_mortalcopy(pTHX_ SV* oldsv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_sv_newmortal(pTHX)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_sv_newref(pTHX_ SV* sv);
+PERL_CALLCONV char*	Perl_sv_peek(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_sv_pos_u2b(pTHX_ SV* sv, I32* offsetp, I32* lenp);
+PERL_CALLCONV void	Perl_sv_pos_b2u(pTHX_ SV* sv, I32* offsetp);
+/* PERL_CALLCONV char*	sv_pvn_force(pTHX_ SV* sv, STRLEN* lp); */
+PERL_CALLCONV char*	Perl_sv_pvutf8n_force(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV char*	Perl_sv_pvbyten_force(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV char*	Perl_sv_recode_to_utf8(pTHX_ SV* sv, SV *encoding);
+PERL_CALLCONV bool	Perl_sv_cat_decode(pTHX_ SV* dsv, SV *encoding, SV *ssv, int *offset, char* tstr, int tlen);
+PERL_CALLCONV char*	Perl_sv_reftype(pTHX_ SV* sv, int ob)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_sv_replace(pTHX_ SV* sv, SV* nsv);
+PERL_CALLCONV void	Perl_sv_report_used(pTHX);
+PERL_CALLCONV void	Perl_sv_reset(pTHX_ char* s, HV* stash);
+PERL_CALLCONV void	Perl_sv_setpvf(pTHX_ SV* sv, const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_2,pTHX_3);
+
+PERL_CALLCONV void	Perl_sv_vsetpvf(pTHX_ SV* sv, const char* pat, va_list* args);
+PERL_CALLCONV void	Perl_sv_setiv(pTHX_ SV* sv, IV num);
+PERL_CALLCONV void	Perl_sv_setpviv(pTHX_ SV* sv, IV num);
+PERL_CALLCONV void	Perl_sv_setuv(pTHX_ SV* sv, UV num);
+PERL_CALLCONV void	Perl_sv_setnv(pTHX_ SV* sv, NV num);
+PERL_CALLCONV SV*	Perl_sv_setref_iv(pTHX_ SV* rv, const char* classname, IV iv);
+PERL_CALLCONV SV*	Perl_sv_setref_uv(pTHX_ SV* rv, const char* classname, UV uv);
+PERL_CALLCONV SV*	Perl_sv_setref_nv(pTHX_ SV* rv, const char* classname, NV nv);
+PERL_CALLCONV SV*	Perl_sv_setref_pv(pTHX_ SV* rv, const char* classname, void* pv);
+PERL_CALLCONV SV*	Perl_sv_setref_pvn(pTHX_ SV* rv, const char* classname, char* pv, STRLEN n);
+PERL_CALLCONV void	Perl_sv_setpv(pTHX_ SV* sv, const char* ptr);
+PERL_CALLCONV void	Perl_sv_setpvn(pTHX_ SV* sv, const char* ptr, STRLEN len);
+/* PERL_CALLCONV void	sv_setsv(pTHX_ SV* dsv, SV* ssv); */
+PERL_CALLCONV void	Perl_sv_taint(pTHX_ SV* sv);
+PERL_CALLCONV bool	Perl_sv_tainted(pTHX_ SV* sv)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV int	Perl_sv_unmagic(pTHX_ SV* sv, int type);
+PERL_CALLCONV void	Perl_sv_unref(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_sv_unref_flags(pTHX_ SV* sv, U32 flags);
+PERL_CALLCONV void	Perl_sv_untaint(pTHX_ SV* sv);
+PERL_CALLCONV bool	Perl_sv_upgrade(pTHX_ SV* sv, U32 mt);
+PERL_CALLCONV void	Perl_sv_usepvn(pTHX_ SV* sv, char* ptr, STRLEN len);
+PERL_CALLCONV void	Perl_sv_vcatpvfn(pTHX_ SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted);
+PERL_CALLCONV void	Perl_sv_vsetpvfn(pTHX_ SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted);
+PERL_CALLCONV NV	Perl_str_to_version(pTHX_ SV *sv)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_swash_init(pTHX_ char* pkg, char* name, SV* listsv, I32 minbits, I32 none);
+PERL_CALLCONV UV	Perl_swash_fetch(pTHX_ SV *sv, U8 *ptr, bool do_utf8);
+PERL_CALLCONV void	Perl_taint_env(pTHX);
+PERL_CALLCONV void	Perl_taint_proper(pTHX_ const char* f, const char* s);
+PERL_CALLCONV UV	Perl_to_utf8_case(pTHX_ U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp, char *normal, char *special);
+PERL_CALLCONV UV	Perl_to_utf8_lower(pTHX_ U8 *p, U8* ustrp, STRLEN *lenp);
+PERL_CALLCONV UV	Perl_to_utf8_upper(pTHX_ U8 *p, U8* ustrp, STRLEN *lenp);
+PERL_CALLCONV UV	Perl_to_utf8_title(pTHX_ U8 *p, U8* ustrp, STRLEN *lenp);
+PERL_CALLCONV UV	Perl_to_utf8_fold(pTHX_ U8 *p, U8* ustrp, STRLEN *lenp);
+#if defined(UNLINK_ALL_VERSIONS)
+PERL_CALLCONV I32	Perl_unlnk(pTHX_ char* f);
+#endif
+#if defined(USE_5005THREADS)
+PERL_CALLCONV void	Perl_unlock_condpair(pTHX_ void* svv);
+#endif
+PERL_CALLCONV I32	Perl_unpack_str(pTHX_ char *pat, char *patend, char *s, char *strbeg, char *strend, char **new_s, I32 ocnt, U32 flags);
+PERL_CALLCONV I32	Perl_unpackstring(pTHX_ char *pat, char *patend, char *s, char *strend, U32 flags);
+PERL_CALLCONV void	Perl_unsharepvn(pTHX_ const char* sv, I32 len, U32 hash);
+PERL_CALLCONV void	Perl_unshare_hek(pTHX_ HEK* hek);
+PERL_CALLCONV void	Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg);
+PERL_CALLCONV U8*	Perl_utf16_to_utf8(pTHX_ U8* p, U8 *d, I32 bytelen, I32 *newlen);
+PERL_CALLCONV U8*	Perl_utf16_to_utf8_reversed(pTHX_ U8* p, U8 *d, I32 bytelen, I32 *newlen);
+PERL_CALLCONV STRLEN	Perl_utf8_length(pTHX_ U8* s, U8 *e)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV IV	Perl_utf8_distance(pTHX_ U8 *a, U8 *b)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV U8*	Perl_utf8_hop(pTHX_ U8 *s, I32 off)
+			__attribute__warn_unused_result__
+			__attribute__pure__;
+
+PERL_CALLCONV U8*	Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *len);
+PERL_CALLCONV U8*	Perl_bytes_from_utf8(pTHX_ U8 *s, STRLEN *len, bool *is_utf8);
+PERL_CALLCONV U8*	Perl_bytes_to_utf8(pTHX_ U8 *s, STRLEN *len);
+PERL_CALLCONV UV	Perl_utf8_to_uvchr(pTHX_ U8 *s, STRLEN *retlen);
+PERL_CALLCONV UV	Perl_utf8_to_uvuni(pTHX_ U8 *s, STRLEN *retlen);
+PERL_CALLCONV UV	Perl_utf8n_to_uvchr(pTHX_ U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags);
+PERL_CALLCONV UV	Perl_utf8n_to_uvuni(pTHX_ U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags);
+PERL_CALLCONV U8*	Perl_uvchr_to_utf8(pTHX_ U8 *d, UV uv);
+PERL_CALLCONV U8*	Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv);
+PERL_CALLCONV U8*	Perl_uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags);
+PERL_CALLCONV U8*	Perl_uvuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags);
+PERL_CALLCONV char*	Perl_pv_uni_display(pTHX_ SV *dsv, U8 *spv, STRLEN len, STRLEN pvlim, UV flags);
+PERL_CALLCONV char*	Perl_sv_uni_display(pTHX_ SV *dsv, SV *ssv, STRLEN pvlim, UV flags)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_vivify_defelem(pTHX_ SV* sv);
+PERL_CALLCONV void	Perl_vivify_ref(pTHX_ SV* sv, U32 to_what);
+PERL_CALLCONV I32	Perl_wait4pid(pTHX_ Pid_t pid, int* statusp, int flags);
+PERL_CALLCONV U32	Perl_parse_unicode_opts(pTHX_ char **popt);
+PERL_CALLCONV U32	Perl_seed(pTHX);
+PERL_CALLCONV UV	Perl_get_hash_seed(pTHX)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_report_evil_fh(pTHX_ GV *gv, IO *io, I32 op);
+PERL_CALLCONV void	Perl_report_uninit(pTHX);
+PERL_CALLCONV void	Perl_warn(pTHX_ const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_1,pTHX_2);
+
+PERL_CALLCONV void	Perl_vwarn(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV void	Perl_warner(pTHX_ U32 err, const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_2,pTHX_3);
+
+PERL_CALLCONV void	Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args);
+PERL_CALLCONV void	Perl_watch(pTHX_ char** addr);
+PERL_CALLCONV I32	Perl_whichsig(pTHX_ char* sig);
+PERL_CALLCONV void	Perl_write_to_stderr(pTHX_ const char* message, int msglen);
+PERL_CALLCONV int	Perl_yyerror(pTHX_ char* s);
+#ifdef USE_PURE_BISON
+PERL_CALLCONV int	Perl_yylex_r(pTHX_ YYSTYPE *lvalp, int *lcharp);
+#endif
+PERL_CALLCONV int	Perl_yylex(pTHX);
+PERL_CALLCONV int	Perl_yyparse(pTHX);
+PERL_CALLCONV int	Perl_yywarn(pTHX_ char* s);
+#if defined(MYMALLOC)
+PERL_CALLCONV void	Perl_dump_mstats(pTHX_ char* s);
+PERL_CALLCONV int	Perl_get_mstats(pTHX_ perl_mstats_t *buf, int buflen, int level)
+			__attribute__warn_unused_result__;
+
+#endif
+PERL_CALLCONV Malloc_t	Perl_safesysmalloc(MEM_SIZE nbytes)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV Malloc_t	Perl_safesyscalloc(MEM_SIZE elements, MEM_SIZE size)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV Malloc_t	Perl_safesysrealloc(Malloc_t where, MEM_SIZE nbytes)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV Free_t	Perl_safesysfree(Malloc_t where);
+#if defined(PERL_GLOBAL_STRUCT)
+PERL_CALLCONV struct perl_vars *	Perl_GetVars(pTHX);
+#endif
+PERL_CALLCONV int	Perl_runops_standard(pTHX);
+PERL_CALLCONV int	Perl_runops_debug(pTHX);
+#if defined(USE_5005THREADS)
+PERL_CALLCONV SV*	Perl_sv_lock(pTHX_ SV *sv);
+#endif
+PERL_CALLCONV void	Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_2,pTHX_3);
+
+PERL_CALLCONV void	Perl_sv_vcatpvf_mg(pTHX_ SV* sv, const char* pat, va_list* args);
+PERL_CALLCONV void	Perl_sv_catpv_mg(pTHX_ SV *sv, const char *ptr);
+PERL_CALLCONV void	Perl_sv_catpvn_mg(pTHX_ SV *sv, const char *ptr, STRLEN len);
+PERL_CALLCONV void	Perl_sv_catsv_mg(pTHX_ SV *dstr, SV *sstr);
+PERL_CALLCONV void	Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_2,pTHX_3);
+
+PERL_CALLCONV void	Perl_sv_vsetpvf_mg(pTHX_ SV* sv, const char* pat, va_list* args);
+PERL_CALLCONV void	Perl_sv_setiv_mg(pTHX_ SV *sv, IV i);
+PERL_CALLCONV void	Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv);
+PERL_CALLCONV void	Perl_sv_setuv_mg(pTHX_ SV *sv, UV u);
+PERL_CALLCONV void	Perl_sv_setnv_mg(pTHX_ SV *sv, NV num);
+PERL_CALLCONV void	Perl_sv_setpv_mg(pTHX_ SV *sv, const char *ptr);
+PERL_CALLCONV void	Perl_sv_setpvn_mg(pTHX_ SV *sv, const char *ptr, STRLEN len);
+PERL_CALLCONV void	Perl_sv_setsv_mg(pTHX_ SV *dstr, SV *sstr);
+PERL_CALLCONV void	Perl_sv_usepvn_mg(pTHX_ SV *sv, char *ptr, STRLEN len);
+PERL_CALLCONV MGVTBL*	Perl_get_vtbl(pTHX_ int vtbl_id)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV char*	Perl_pv_display(pTHX_ SV *dsv, char *pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+PERL_CALLCONV void	Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
+			__attribute__format__(__printf__,pTHX_3,pTHX_4);
+
+PERL_CALLCONV void	Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args);
+PERL_CALLCONV void	Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, char *name, GV *sv);
+PERL_CALLCONV void	Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, char *name, GV *sv);
+PERL_CALLCONV void	Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, char *name, HV *sv);
+PERL_CALLCONV void	Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim);
+PERL_CALLCONV void	Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, OP *o);
+PERL_CALLCONV void	Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, PMOP *pm);
+PERL_CALLCONV void	Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim);
+PERL_CALLCONV void	Perl_magic_dump(pTHX_ MAGIC *mg);
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+PERL_CALLCONV void*	Perl_default_protect(pTHX_ volatile JMPENV *je, int *excpt, protect_body_t body, ...);
+PERL_CALLCONV void*	Perl_vdefault_protect(pTHX_ volatile JMPENV *je, int *excpt, protect_body_t body, va_list *args);
+#endif
+PERL_CALLCONV void	Perl_reginitcolors(pTHX);
+PERL_CALLCONV char*	Perl_sv_2pv_nolen(pTHX_ SV* sv)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV char*	Perl_sv_2pvutf8_nolen(pTHX_ SV* sv)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV char*	Perl_sv_2pvbyte_nolen(pTHX_ SV* sv)
+			__attribute__warn_unused_result__;
+
+/* PERL_CALLCONV char*	sv_pv(pTHX_ SV *sv)
+			__attribute__warn_unused_result__; */
+
+/* PERL_CALLCONV char*	sv_pvutf8(pTHX_ SV *sv)
+			__attribute__warn_unused_result__; */
+
+/* PERL_CALLCONV char*	sv_pvbyte(pTHX_ SV *sv)
+			__attribute__warn_unused_result__; */
+
+/* PERL_CALLCONV STRLEN	sv_utf8_upgrade(pTHX_ SV *sv); */
+PERL_CALLCONV bool	Perl_sv_utf8_downgrade(pTHX_ SV *sv, bool fail_ok);
+PERL_CALLCONV void	Perl_sv_utf8_encode(pTHX_ SV *sv);
+PERL_CALLCONV bool	Perl_sv_utf8_decode(pTHX_ SV *sv);
+PERL_CALLCONV void	Perl_sv_force_normal(pTHX_ SV *sv);
+PERL_CALLCONV void	Perl_sv_force_normal_flags(pTHX_ SV *sv, U32 flags);
+PERL_CALLCONV void	Perl_tmps_grow(pTHX_ I32 n);
+PERL_CALLCONV SV*	Perl_sv_rvweaken(pTHX_ SV *sv);
+PERL_CALLCONV int	Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg);
+PERL_CALLCONV OP*	Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block);
+PERL_CALLCONV CV*	Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block);
+PERL_CALLCONV void	Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
+			__attribute__noreturn__;
+
+PERL_CALLCONV OP *	Perl_my_attrs(pTHX_ OP *o, OP *attrs);
+PERL_CALLCONV void	Perl_boot_core_xsutils(pTHX);
+#if defined(USE_ITHREADS)
+PERL_CALLCONV PERL_CONTEXT*	Perl_cx_dup(pTHX_ PERL_CONTEXT* cx, I32 ix, I32 max, CLONE_PARAMS* param)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV PERL_SI*	Perl_si_dup(pTHX_ PERL_SI* si, CLONE_PARAMS* param)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV ANY*	Perl_ss_dup(pTHX_ PerlInterpreter* proto_perl, CLONE_PARAMS* param)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void*	Perl_any_dup(pTHX_ void* v, PerlInterpreter* proto_perl)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV HE*	Perl_he_dup(pTHX_ HE* e, bool shared, CLONE_PARAMS* param)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV REGEXP*	Perl_re_dup(pTHX_ REGEXP* r, CLONE_PARAMS* param)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV PerlIO*	Perl_fp_dup(pTHX_ PerlIO* fp, char type, CLONE_PARAMS* param)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV DIR*	Perl_dirp_dup(pTHX_ DIR* dp)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV GP*	Perl_gp_dup(pTHX_ GP* gp, CLONE_PARAMS* param)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV MAGIC*	Perl_mg_dup(pTHX_ MAGIC* mg, CLONE_PARAMS* param)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_sv_dup(pTHX_ SV* sstr, CLONE_PARAMS* param)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_rvpv_dup(pTHX_ SV* dstr, SV *sstr, CLONE_PARAMS* param);
+#if defined(HAVE_INTERP_INTERN)
+PERL_CALLCONV void	Perl_sys_intern_dup(pTHX_ struct interp_intern* src, struct interp_intern* dst);
+#endif
+PERL_CALLCONV PTR_TBL_t*	Perl_ptr_table_new(pTHX)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void*	Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldsv, void *newsv);
+PERL_CALLCONV void	Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl);
+PERL_CALLCONV void	Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl);
+PERL_CALLCONV void	Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl);
+#endif
+#if defined(HAVE_INTERP_INTERN)
+PERL_CALLCONV void	Perl_sys_intern_clear(pTHX);
+PERL_CALLCONV void	Perl_sys_intern_init(pTHX);
+#endif
+
+PERL_CALLCONV char *	Perl_custom_op_name(pTHX_ OP* op)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV char *	Perl_custom_op_desc(pTHX_ OP* op)
+			__attribute__warn_unused_result__;
+
+
+PERL_CALLCONV void	Perl_sv_nosharing(pTHX_ SV *);
+PERL_CALLCONV void	Perl_sv_nolocking(pTHX_ SV *);
+PERL_CALLCONV void	Perl_sv_nounlocking(pTHX_ SV *);
+PERL_CALLCONV int	Perl_nothreadhook(pTHX);
+
+END_EXTERN_C
+
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+STATIC I32	S_avhv_index_sv(pTHX_ SV* sv);
+STATIC I32	S_avhv_index(pTHX_ AV* av, SV* sv, U32 hash);
+#endif
+
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+STATIC I32	S_do_trans_simple(pTHX_ SV *sv)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_do_trans_count(pTHX_ SV *sv)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_do_trans_complex(pTHX_ SV *sv)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_do_trans_simple_utf8(pTHX_ SV *sv)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_do_trans_count_utf8(pTHX_ SV *sv)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_do_trans_complex_utf8(pTHX_ SV *sv)
+			__attribute__warn_unused_result__;
+
+#endif
+
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+STATIC void	S_gv_init_sv(pTHX_ GV *gv, I32 sv_type);
+STATIC void	S_require_errno(pTHX_ GV *gv);
+#endif
+
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+STATIC void	S_hsplit(pTHX_ HV *hv);
+STATIC void	S_hfreeentries(pTHX_ HV *hv);
+STATIC HE*	S_new_he(pTHX)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+STATIC void	S_del_he(pTHX_ HE *p);
+STATIC HEK*	S_save_hek_flags(pTHX_ const char *str, I32 len, U32 hash, int flags)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+STATIC void	S_hv_magic_check(pTHX_ HV *hv, bool *needs_copy, bool *needs_store);
+STATIC void	S_unshare_hek_or_pvn(pTHX_ HEK* hek, const char* str, I32 len, U32 hash);
+STATIC HEK*	S_share_hek_flags(pTHX_ const char* str, I32 len, U32 hash, int flags)
+			__attribute__warn_unused_result__;
+
+STATIC void	S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen, const char *msg)
+			__attribute__noreturn__;
+
+#endif
+
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+STATIC void	S_save_magic(pTHX_ I32 mgs_ix, SV *sv);
+STATIC int	S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth);
+STATIC int	S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 f, int n, SV *val);
+STATIC void	S_restore_magic(pTHX_ const void *p);
+STATIC void	S_unwind_handler_stack(pTHX_ const void *p);
+
+#endif
+
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+STATIC bool	S_is_handle_constructor(pTHX_ const OP *o, I32 numargs)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_is_list_assignment(pTHX_ const OP *o)
+			__attribute__warn_unused_result__;
+
+STATIC void	S_cop_free(pTHX_ COP *cop);
+STATIC OP*	S_modkids(pTHX_ OP *o, I32 type);
+STATIC OP*	S_scalarboolean(pTHX_ OP *o);
+STATIC OP*	S_newDEFSVOP(pTHX)
+			__attribute__warn_unused_result__;
+
+STATIC OP*	S_new_logop(pTHX_ I32 type, I32 flags, OP **firstp, OP **otherp)
+			__attribute__warn_unused_result__;
+
+STATIC void	S_simplify_sort(pTHX_ OP *o);
+STATIC const char*	S_gv_ename(pTHX_ GV *gv);
+STATIC bool	S_scalar_mod_type(pTHX_ const OP *o, I32 type);
+STATIC OP *	S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp);
+STATIC OP *	S_dup_attrlist(pTHX_ OP *o);
+STATIC void	S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs, bool for_my);
+STATIC void	S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp);
+STATIC void	S_bad_type(pTHX_ I32 n, const char *t, const char *name, const OP *kid);
+STATIC void	S_no_bareword_allowed(pTHX_ const OP *o);
+STATIC OP*	S_no_fh_allowed(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+STATIC OP*	S_too_few_arguments(pTHX_ OP *o, const char* name)
+			__attribute__warn_unused_result__;
+
+STATIC OP*	S_too_many_arguments(pTHX_ OP *o, const char* name)
+			__attribute__warn_unused_result__;
+
+#endif
+#if defined(PL_OP_SLAB_ALLOC)
+PERL_CALLCONV void*	Perl_Slab_Alloc(pTHX_ int m, size_t sz)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_Slab_Free(pTHX_ void *op);
+#endif
+
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+STATIC void	S_find_beginning(pTHX);
+STATIC void	S_forbid_setid(pTHX_ const char * s);
+STATIC void	S_incpush(pTHX_ const char *dir, bool addsubdirs, bool addoldvers, bool usesep);
+STATIC void	S_init_interp(pTHX);
+STATIC void	S_init_ids(pTHX);
+STATIC void	S_init_lexer(pTHX);
+STATIC void	S_init_main_stash(pTHX);
+STATIC void	S_init_perllib(pTHX);
+STATIC void	S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env);
+STATIC void	S_init_predump_symbols(pTHX);
+STATIC void	S_my_exit_jump(pTHX)
+			__attribute__noreturn__;
+
+STATIC void	S_nuke_stacks(pTHX);
+STATIC void	S_open_script(pTHX_ const char *scriptname, bool dosearch, SV *sv);
+STATIC void	S_usage(pTHX_ const char *name);
+STATIC void	S_validate_suid(pTHX_ const char *validarg, const char *scriptname);
+#  if defined(IAMSUID)
+STATIC int	S_fd_on_nosuid_fs(pTHX_ int fd);
+#  endif
+STATIC void*	S_parse_body(pTHX_ char **env, XSINIT_t xsinit);
+STATIC void	S_run_body(pTHX_ I32 oldscope)
+			__attribute__noreturn__;
+
+STATIC void	S_call_body(pTHX_ const OP *myop, bool is_eval);
+STATIC void*	S_call_list_body(pTHX_ CV *cv);
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+STATIC void*	S_vparse_body(pTHX_ va_list args);
+STATIC void*	S_vrun_body(pTHX_ va_list args);
+STATIC void*	S_vcall_body(pTHX_ va_list args);
+STATIC void*	S_vcall_list_body(pTHX_ va_list args);
+#endif
+#  if defined(USE_5005THREADS)
+STATIC struct perl_thread *	S_init_main_thread(pTHX);
+#  endif
+#endif
+
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+STATIC SV*	S_refto(pTHX_ SV* sv)
+			__attribute__warn_unused_result__;
+
+#endif
+
+#if defined(PERL_IN_PP_PACK_C) || defined(PERL_DECL_PROT)
+STATIC I32	S_unpack_rec(pTHX_ tempsym_t* symptr, char *s, char *strbeg, char *strend, char **new_s);
+STATIC SV **	S_pack_rec(pTHX_ SV *cat, tempsym_t* symptr, SV **beglist, SV **endlist);
+STATIC SV*	S_mul128(pTHX_ SV *sv, U8 m);
+STATIC I32	S_measure_struct(pTHX_ tempsym_t* symptr);
+STATIC const char *	S_group_end(pTHX_ const char *pat, const char *patend, char ender);
+STATIC const char *	S_get_num(pTHX_ const char *ppat, I32 *);
+STATIC bool	S_next_symbol(pTHX_ tempsym_t* symptr);
+STATIC void	S_doencodes(pTHX_ SV* sv, char* s, I32 len);
+STATIC SV*	S_is_an_int(pTHX_ const char *s, STRLEN l)
+			__attribute__warn_unused_result__;
+
+STATIC int	S_div128(pTHX_ SV *pnum, bool *done);
+#endif
+
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+STATIC OP*	S_docatch(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+STATIC void	S_docatch_body(pTHX);
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+STATIC void*	S_vdocatch_body(pTHX_ va_list args);
+#endif
+STATIC OP*	S_dofindlabel(pTHX_ OP *o, const char *label, OP **opstack, OP **oplimit)
+			__attribute__warn_unused_result__;
+
+STATIC OP*	S_doparseform(pTHX_ SV *sv)
+			__attribute__warn_unused_result__;
+
+STATIC bool	S_num_overflow(NV value, I32 fldsize, I32 frcsize)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_dopoptoeval(pTHX_ I32 startingblock)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_dopoptolabel(pTHX_ const char *label)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_dopoptoloop(pTHX_ I32 startingblock)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_dopoptosub(pTHX_ I32 startingblock)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_dopoptosub_at(pTHX_ const PERL_CONTEXT* cxstk, I32 startingblock)
+			__attribute__warn_unused_result__;
+
+STATIC void	S_save_lines(pTHX_ AV *array, SV *sv);
+STATIC OP*	S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq)
+			__attribute__warn_unused_result__;
+
+STATIC PerlIO *	S_check_type_and_open(pTHX_ const char *name, const char *mode)
+			__attribute__warn_unused_result__;
+
+STATIC PerlIO *	S_doopen_pm(pTHX_ const char *name, const char *mode)
+			__attribute__warn_unused_result__;
+
+STATIC bool	S_path_is_absolute(pTHX_ const char *name)
+			__attribute__warn_unused_result__;
+
+#endif
+
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+STATIC int	S_do_maybe_phash(pTHX_ AV *ary, SV **lelem, SV **firstlelem, SV **relem, SV **lastrelem);
+STATIC void	S_do_oddball(pTHX_ HV *hash, SV **relem, SV **firstrelem);
+STATIC CV*	S_get_db_sub(pTHX_ SV **svp, CV *cv)
+			__attribute__warn_unused_result__;
+
+STATIC SV*	S_method_common(pTHX_ SV* meth, U32* hashp)
+			__attribute__warn_unused_result__;
+
+#endif
+
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+STATIC OP*	S_doform(pTHX_ CV *cv, GV *gv, OP *retop);
+STATIC int	S_emulate_eaccess(pTHX_ const char* path, Mode_t mode);
+#  if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+STATIC int	S_dooneliner(pTHX_ const char *cmd, const char *filename)
+			__attribute__warn_unused_result__;
+
+#  endif
+#endif
+
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+STATIC regnode*	S_reg(pTHX_ struct RExC_state_t *state, I32 paren, I32 *flagp);
+STATIC regnode*	S_reganode(pTHX_ struct RExC_state_t *state, U8 op, U32 arg);
+STATIC regnode*	S_regatom(pTHX_ struct RExC_state_t *state, I32 *flagp);
+STATIC regnode*	S_regbranch(pTHX_ struct RExC_state_t *state, I32 *flagp, I32 first);
+STATIC void	S_reguni(pTHX_ const struct RExC_state_t *state, UV uv, char *s, STRLEN *lenp);
+STATIC regnode*	S_regclass(pTHX_ struct RExC_state_t *state);
+STATIC I32	S_regcurly(pTHX_ const char *)
+			__attribute__warn_unused_result__;
+
+STATIC regnode*	S_reg_node(pTHX_ struct RExC_state_t *state, U8 op);
+STATIC regnode*	S_regpiece(pTHX_ struct RExC_state_t *state, I32 *flagp);
+STATIC void	S_reginsert(pTHX_ struct RExC_state_t *state, U8 op, regnode *opnd);
+STATIC void	S_regoptail(pTHX_ struct RExC_state_t *state, regnode *p, regnode *val);
+STATIC void	S_regtail(pTHX_ struct RExC_state_t *state, regnode *p, regnode *val);
+STATIC char*	S_regwhite(pTHX_ char *p, const char *e);
+STATIC char*	S_nextchar(pTHX_ struct RExC_state_t*);
+#  ifdef DEBUGGING
+STATIC regnode*	S_dumpuntil(pTHX_ regnode *start, regnode *node, regnode *last, SV* sv, I32 l);
+STATIC void	S_put_byte(pTHX_ SV* sv, int c);
+#  endif
+STATIC void	S_scan_commit(pTHX_ struct RExC_state_t*, struct scan_data_t *data);
+STATIC void	S_cl_anything(pTHX_ struct RExC_state_t*, struct regnode_charclass_class *cl);
+STATIC int	S_cl_is_anything(pTHX_ const struct regnode_charclass_class *cl);
+STATIC void	S_cl_init(pTHX_ struct RExC_state_t*, struct regnode_charclass_class *cl);
+STATIC void	S_cl_init_zero(pTHX_ struct RExC_state_t*, struct regnode_charclass_class *cl);
+STATIC void	S_cl_and(pTHX_ struct regnode_charclass_class *cl, const struct regnode_charclass_class *and_with);
+STATIC void	S_cl_or(pTHX_ struct RExC_state_t*, struct regnode_charclass_class *cl, const struct regnode_charclass_class *or_with);
+STATIC I32	S_study_chunk(pTHX_ struct RExC_state_t* pRExC_state, regnode **scanp, I32 *deltap, regnode *last, struct scan_data_t *data, U32 flags);
+STATIC I32	S_add_data(pTHX_ struct RExC_state_t*, I32 n, const char *s);
+STATIC void	S_re_croak2(pTHX_ const char* pat1, const char* pat2, ...)
+			__attribute__noreturn__;
+
+STATIC I32	S_regpposixcc(pTHX_ struct RExC_state_t*, I32 value);
+STATIC void	S_checkposixcc(pTHX_ struct RExC_state_t*);
+#endif
+
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+STATIC I32	S_regmatch(pTHX_ regnode *prog)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_regrepeat(pTHX_ const regnode *p, I32 max)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_regrepeat_hard(pTHX_ regnode *p, I32 max, I32 *lp)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_regtry(pTHX_ regexp *prog, char *startpos)
+			__attribute__warn_unused_result__;
+
+STATIC bool	S_reginclass(pTHX_ const regnode *n, const U8 *p, STRLEN *lenp, bool do_utf8sv_is_utf8)
+			__attribute__warn_unused_result__;
+
+STATIC CHECKPOINT	S_regcppush(pTHX_ I32 parenfloor);
+STATIC char*	S_regcppop(pTHX);
+STATIC char*	S_regcp_set_to(pTHX_ I32 ss);
+STATIC void	S_cache_re(pTHX_ regexp *prog);
+STATIC U8*	S_reghop(pTHX_ U8 *pos, I32 off)
+			__attribute__warn_unused_result__;
+
+STATIC U8*	S_reghop3(pTHX_ U8 *pos, I32 off, U8 *lim)
+			__attribute__warn_unused_result__;
+
+STATIC U8*	S_reghopmaybe(pTHX_ U8 *pos, I32 off)
+			__attribute__warn_unused_result__;
+
+STATIC U8*	S_reghopmaybe3(pTHX_ U8 *pos, I32 off, U8 *lim)
+			__attribute__warn_unused_result__;
+
+STATIC char*	S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, const char *strend, I32 norun)
+			__attribute__warn_unused_result__;
+
+STATIC void	S_to_utf8_substr(pTHX_ regexp * prog);
+STATIC void	S_to_byte_substr(pTHX_ regexp * prog);
+#endif
+
+#if defined(PERL_IN_DUMP_C) || defined(PERL_DECL_PROT)
+STATIC CV*	S_deb_curcv(pTHX_ I32 ix);
+STATIC void	S_debprof(pTHX_ const OP *o);
+#endif
+
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+STATIC SV*	S_save_scalar_at(pTHX_ SV **sptr);
+#endif
+
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+STATIC char *	S_uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
+			__attribute__warn_unused_result__;
+
+STATIC IV	S_asIV(pTHX_ SV* sv)
+			__attribute__warn_unused_result__;
+
+STATIC UV	S_asUV(pTHX_ SV* sv)
+			__attribute__warn_unused_result__;
+
+STATIC XPVIV*	S_new_xiv(pTHX);
+STATIC XPVNV*	S_new_xnv(pTHX);
+STATIC XPV*	S_new_xpv(pTHX);
+STATIC XPVIV*	S_new_xpviv(pTHX);
+STATIC XPVNV*	S_new_xpvnv(pTHX);
+STATIC XPVCV*	S_new_xpvcv(pTHX);
+STATIC XPVAV*	S_new_xpvav(pTHX);
+STATIC XPVHV*	S_new_xpvhv(pTHX);
+STATIC XPVMG*	S_new_xpvmg(pTHX);
+STATIC XPVLV*	S_new_xpvlv(pTHX);
+STATIC XPVBM*	S_new_xpvbm(pTHX);
+STATIC XRV*	S_new_xrv(pTHX);
+STATIC void	S_del_xiv(pTHX_ XPVIV* p);
+STATIC void	S_del_xnv(pTHX_ XPVNV* p);
+STATIC void	S_del_xpv(pTHX_ XPV* p);
+STATIC void	S_del_xpviv(pTHX_ XPVIV* p);
+STATIC void	S_del_xpvnv(pTHX_ XPVNV* p);
+STATIC void	S_del_xpvcv(pTHX_ XPVCV* p);
+STATIC void	S_del_xpvav(pTHX_ XPVAV* p);
+STATIC void	S_del_xpvhv(pTHX_ XPVHV* p);
+STATIC void	S_del_xpvmg(pTHX_ XPVMG* p);
+STATIC void	S_del_xpvlv(pTHX_ XPVLV* p);
+STATIC void	S_del_xpvbm(pTHX_ XPVBM* p);
+STATIC void	S_del_xrv(pTHX_ XRV* p);
+STATIC void	S_sv_unglob(pTHX_ SV* sv);
+STATIC void	S_not_a_number(pTHX_ SV *sv);
+STATIC I32	S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask);
+STATIC void	S_sv_add_backref(pTHX_ SV *tsv, SV *sv);
+STATIC void	S_sv_del_backref(pTHX_ SV *sv);
+#  ifdef DEBUGGING
+STATIC void	S_del_sv(pTHX_ SV *p);
+#  endif
+#  if !defined(NV_PRESERVES_UV)
+STATIC int	S_sv_2iuv_non_preserve(pTHX_ SV *sv, I32 numtype);
+#  endif
+STATIC I32	S_expect_number(pTHX_ char** pattern)
+			__attribute__warn_unused_result__;
+
+#
+STATIC bool	S_utf8_mg_pos(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 *offsetp, I32 uoff, const U8 **sp, const U8 *start, const U8 *send);
+STATIC bool	S_utf8_mg_pos_init(pTHX_ SV *sv, MAGIC **mgp, STRLEN **cachep, I32 i, I32 offsetp, const U8 *s, const U8 *start);
+#endif
+
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+STATIC void	S_check_uni(pTHX);
+STATIC void	S_force_next(pTHX_ I32 type);
+STATIC char*	S_force_version(pTHX_ char *start, int guessing);
+STATIC char*	S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack, int allow_tick);
+STATIC SV*	S_tokeq(pTHX_ SV *sv);
+STATIC int	S_pending_ident(pTHX);
+STATIC char*	S_scan_const(pTHX_ char *start)
+			__attribute__warn_unused_result__;
+
+STATIC char*	S_scan_formline(pTHX_ char *s)
+			__attribute__warn_unused_result__;
+
+STATIC char*	S_scan_heredoc(pTHX_ char *s)
+			__attribute__warn_unused_result__;
+
+STATIC char*	S_scan_ident(pTHX_ char *s, const char *send, char *dest, STRLEN destlen, I32 ck_uni);
+STATIC char*	S_scan_inputsymbol(pTHX_ char *start)
+			__attribute__warn_unused_result__;
+
+STATIC char*	S_scan_pat(pTHX_ char *start, I32 type)
+			__attribute__warn_unused_result__;
+
+STATIC char*	S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
+			__attribute__warn_unused_result__;
+
+STATIC char*	S_scan_subst(pTHX_ char *start)
+			__attribute__warn_unused_result__;
+
+STATIC char*	S_scan_trans(pTHX_ char *start)
+			__attribute__warn_unused_result__;
+
+STATIC char*	S_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp);
+STATIC char*	S_skipspace(pTHX_ char *s)
+			__attribute__warn_unused_result__;
+
+STATIC char*	S_swallow_bom(pTHX_ U8 *s)
+			__attribute__warn_unused_result__;
+
+STATIC void	S_checkcomma(pTHX_ char *s, const char *name, const char *what);
+STATIC void	S_force_ident(pTHX_ const char *s, int kind);
+STATIC void	S_incline(pTHX_ char *s);
+STATIC int	S_intuit_method(pTHX_ char *s, GV *gv);
+STATIC int	S_intuit_more(pTHX_ char *s);
+STATIC I32	S_lop(pTHX_ I32 f, int x, char *s);
+STATIC void	S_missingterm(pTHX_ char *s)
+			__attribute__noreturn__;
+
+STATIC void	S_no_op(pTHX_ const char *what, char *s);
+STATIC void	S_set_csh(pTHX);
+STATIC I32	S_sublex_done(pTHX)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_sublex_push(pTHX)
+			__attribute__warn_unused_result__;
+
+STATIC I32	S_sublex_start(pTHX)
+			__attribute__warn_unused_result__;
+
+STATIC char *	S_filter_gets(pTHX_ SV *sv, PerlIO *fp, STRLEN append)
+			__attribute__warn_unused_result__;
+
+STATIC HV *	S_find_in_my_stash(pTHX_ const char *pkgname, I32 len)
+			__attribute__warn_unused_result__;
+
+STATIC SV*	S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv, const char *type);
+#  if defined(DEBUGGING)
+STATIC int	S_tokereport(pTHX_ const char *s, I32 rv);
+#  endif
+STATIC int	S_ao(pTHX_ int toketype);
+STATIC void	S_depcom(pTHX);
+STATIC const char*	S_incl_perldb(pTHX);
+#  if defined(PERL_CR_FILTER)
+STATIC I32	S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen);
+#  endif
+#endif
+
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+STATIC SV*	S_isa_lookup(pTHX_ HV *stash, const char *name, HV *name_stash, int len, int level);
+#endif
+
+#if defined(PERL_IN_LOCALE_C) || defined(PERL_DECL_PROT)
+STATIC char*	S_stdize_locale(pTHX_ char* locs);
+#endif
+
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+STATIC COP*	S_closest_cop(pTHX_ COP *cop, const OP *o);
+STATIC SV*	S_mess_alloc(pTHX);
+PERL_CALLCONV const char *	vdie_croak_common(pTHX_ const char *pat, va_list *args, STRLEN *msglen, I32* utf8);
+PERL_CALLCONV void	vdie_common(pTHX_ const char *message, STRLEN msglen, I32 utf8);
+#endif
+
+#if defined(PERL_IN_NUMERIC_C) || defined(PERL_DECL_PROT)
+STATIC NV	S_mulexp10(NV value, I32 exponent);
+#endif
+
+#if defined(PERL_IN_UTF8_C) || defined(PERL_DECL_PROT)
+STATIC STRLEN	S_is_utf8_char_slow(pTHX_ const U8 *s, const STRLEN len);
+#endif
+
+START_EXTERN_C
+
+PERL_CALLCONV void	Perl_sv_setsv_flags(pTHX_ SV* dsv, SV* ssv, I32 flags);
+PERL_CALLCONV void	Perl_sv_catpvn_flags(pTHX_ SV* sv, const char* ptr, STRLEN len, I32 flags);
+PERL_CALLCONV void	Perl_sv_catsv_flags(pTHX_ SV* dsv, SV* ssv, I32 flags);
+PERL_CALLCONV STRLEN	Perl_sv_utf8_upgrade_flags(pTHX_ SV *sv, I32 flags);
+PERL_CALLCONV char*	Perl_sv_pvn_force_flags(pTHX_ SV* sv, STRLEN* lp, I32 flags);
+PERL_CALLCONV char*	Perl_sv_2pv_flags(pTHX_ SV* sv, STRLEN* lp, I32 flags);
+PERL_CALLCONV void	Perl_sv_copypv(pTHX_ SV* dsv, SV* ssv);
+PERL_CALLCONV char*	Perl_my_atof2(pTHX_ const char *s, NV* value);
+PERL_CALLCONV int	Perl_my_socketpair(int family, int type, int protocol, int fd[2]);
+
+#if defined(USE_PERLIO) && !defined(USE_SFIO)
+PERL_CALLCONV int	Perl_PerlIO_close(pTHX_ PerlIO *f);
+PERL_CALLCONV int	Perl_PerlIO_fill(pTHX_ PerlIO *f);
+PERL_CALLCONV int	Perl_PerlIO_fileno(pTHX_ PerlIO *f);
+PERL_CALLCONV int	Perl_PerlIO_eof(pTHX_ PerlIO *f);
+PERL_CALLCONV int	Perl_PerlIO_error(pTHX_ PerlIO *f);
+PERL_CALLCONV int	Perl_PerlIO_flush(pTHX_ PerlIO *f);
+PERL_CALLCONV void	Perl_PerlIO_clearerr(pTHX_ PerlIO *f);
+PERL_CALLCONV void	Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt);
+PERL_CALLCONV void	Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR *ptr, int cnt);
+PERL_CALLCONV void	Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f);
+PERL_CALLCONV SSize_t	Perl_PerlIO_read(pTHX_ PerlIO *f, void *buf, Size_t count);
+PERL_CALLCONV SSize_t	Perl_PerlIO_write(pTHX_ PerlIO *f, const void *buf, Size_t count);
+PERL_CALLCONV SSize_t	Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *buf, Size_t count);
+PERL_CALLCONV Off_t	Perl_PerlIO_tell(pTHX_ PerlIO *f);
+PERL_CALLCONV int	Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+
+PERL_CALLCONV STDCHAR *	Perl_PerlIO_get_base(pTHX_ PerlIO *f);
+PERL_CALLCONV STDCHAR *	Perl_PerlIO_get_ptr(pTHX_ PerlIO *f);
+PERL_CALLCONV int	Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV int	Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
+			__attribute__warn_unused_result__;
+
+
+PERL_CALLCONV PerlIO *	Perl_PerlIO_stdin(pTHX)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV PerlIO *	Perl_PerlIO_stdout(pTHX)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV PerlIO *	Perl_PerlIO_stderr(pTHX)
+			__attribute__warn_unused_result__;
+
+#endif /* PERLIO_LAYERS */
+
+PERL_CALLCONV void	Perl_deb_stack_all(pTHX);
+#ifdef PERL_IN_DEB_C
+STATIC void	S_deb_stack_n(pTHX_ SV** stack_base, I32 stack_min, I32 stack_max, I32 mark_min, I32 mark_max);
+#endif
+
+PERL_CALLCONV PADLIST*	Perl_pad_new(pTHX_ int flags)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_pad_undef(pTHX_ CV* cv);
+PERL_CALLCONV PADOFFSET	Perl_pad_add_name(pTHX_ char *name, HV* typestash, HV* ourstash, bool clone);
+PERL_CALLCONV PADOFFSET	Perl_pad_add_anon(pTHX_ SV* sv, OPCODE op_type);
+PERL_CALLCONV void	Perl_pad_check_dup(pTHX_ char* name, bool is_our, HV* ourstash);
+#ifdef DEBUGGING
+PERL_CALLCONV void	Perl_pad_setsv(pTHX_ PADOFFSET po, SV* sv);
+#endif
+PERL_CALLCONV void	Perl_pad_block_start(pTHX_ int full);
+PERL_CALLCONV void	Perl_pad_tidy(pTHX_ padtidy_type type);
+PERL_CALLCONV void	Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full);
+PERL_CALLCONV void	Perl_pad_fixup_inner_anons(pTHX_ PADLIST *padlist, CV *old_cv, CV *new_cv);
+
+PERL_CALLCONV void	Perl_pad_push(pTHX_ PADLIST *padlist, int depth, int has_args);
+PERL_CALLCONV HV*	Perl_pad_compname_type(pTHX_ const PADOFFSET po)
+			__attribute__warn_unused_result__;
+
+
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+STATIC PADOFFSET	S_pad_findlex(pTHX_ const char* name, PADOFFSET newoff, const CV* innercv);
+#  if defined(DEBUGGING)
+STATIC void	S_cv_dump(pTHX_ const CV *cv, const char *title);
+#  endif
+STATIC CV*	S_cv_clone2(pTHX_ CV *proto, CV *outside);
+#endif
+PERL_CALLCONV CV*	Perl_find_runcv(pTHX_ U32 *db_seqp)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV void	Perl_free_tied_hv_pool(pTHX);
+#if defined(DEBUGGING)
+PERL_CALLCONV int	Perl_get_debug_opts(pTHX_ char **s)
+			__attribute__warn_unused_result__;
+
+#endif
+
+PERL_CALLCONV void	Perl_hv_clear_placeholders(pTHX_ HV* hb);
+
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+STATIC SV*	S_hv_delete_common(pTHX_ HV* tb, SV* key_sv, const char* key, STRLEN klen, int k_flags, I32 d_flags, U32 hash);
+STATIC HE*	S_hv_fetch_common(pTHX_ HV* tb, SV* key_sv, const char* key, STRLEN klen, int flags, int action, SV* val, U32 hash);
+#endif
+PERL_CALLCONV SV*	Perl_hv_scalar(pTHX_ HV* hv)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV SV*	Perl_magic_scalarpack(pTHX_ HV* hv, MAGIC* mg);
+
+#if defined(DEBUGGING)
+PERL_CALLCONV int	Perl_get_debug_opts_flags(pTHX_ char **s, int flags);
+#endif
+
+PERL_CALLCONV void	Perl_op_refcnt_lock(pTHX);
+PERL_CALLCONV void	Perl_op_refcnt_unlock(pTHX);
+PERL_CALLCONV char*	Perl_savesvpv(pTHX_ SV* sv)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+
+#ifdef PERL_NEED_MY_HTOLE16
+PERL_CALLCONV U16	Perl_my_htole16(U16 n);
+#endif
+#ifdef PERL_NEED_MY_LETOH16
+PERL_CALLCONV U16	Perl_my_letoh16(U16 n);
+#endif
+#ifdef PERL_NEED_MY_HTOBE16
+PERL_CALLCONV U16	Perl_my_htobe16(U16 n);
+#endif
+#ifdef PERL_NEED_MY_BETOH16
+PERL_CALLCONV U16	Perl_my_betoh16(U16 n);
+#endif
+#ifdef PERL_NEED_MY_HTOLE32
+PERL_CALLCONV U32	Perl_my_htole32(U32 n);
+#endif
+#ifdef PERL_NEED_MY_LETOH32
+PERL_CALLCONV U32	Perl_my_letoh32(U32 n);
+#endif
+#ifdef PERL_NEED_MY_HTOBE32
+PERL_CALLCONV U32	Perl_my_htobe32(U32 n);
+#endif
+#ifdef PERL_NEED_MY_BETOH32
+PERL_CALLCONV U32	Perl_my_betoh32(U32 n);
+#endif
+#ifdef PERL_NEED_MY_HTOLE64
+PERL_CALLCONV U64	Perl_my_htole64(U64 n);
+#endif
+#ifdef PERL_NEED_MY_LETOH64
+PERL_CALLCONV U64	Perl_my_letoh64(U64 n);
+#endif
+#ifdef PERL_NEED_MY_HTOBE64
+PERL_CALLCONV U64	Perl_my_htobe64(U64 n);
+#endif
+#ifdef PERL_NEED_MY_BETOH64
+PERL_CALLCONV U64	Perl_my_betoh64(U64 n);
+#endif
+
+#ifdef PERL_NEED_MY_HTOLES
+PERL_CALLCONV short	Perl_my_htoles(short n);
+#endif
+#ifdef PERL_NEED_MY_LETOHS
+PERL_CALLCONV short	Perl_my_letohs(short n);
+#endif
+#ifdef PERL_NEED_MY_HTOBES
+PERL_CALLCONV short	Perl_my_htobes(short n);
+#endif
+#ifdef PERL_NEED_MY_BETOHS
+PERL_CALLCONV short	Perl_my_betohs(short n);
+#endif
+#ifdef PERL_NEED_MY_HTOLEI
+PERL_CALLCONV int	Perl_my_htolei(int n);
+#endif
+#ifdef PERL_NEED_MY_LETOHI
+PERL_CALLCONV int	Perl_my_letohi(int n);
+#endif
+#ifdef PERL_NEED_MY_HTOBEI
+PERL_CALLCONV int	Perl_my_htobei(int n);
+#endif
+#ifdef PERL_NEED_MY_BETOHI
+PERL_CALLCONV int	Perl_my_betohi(int n);
+#endif
+#ifdef PERL_NEED_MY_HTOLEL
+PERL_CALLCONV long	Perl_my_htolel(long n);
+#endif
+#ifdef PERL_NEED_MY_LETOHL
+PERL_CALLCONV long	Perl_my_letohl(long n);
+#endif
+#ifdef PERL_NEED_MY_HTOBEL
+PERL_CALLCONV long	Perl_my_htobel(long n);
+#endif
+#ifdef PERL_NEED_MY_BETOHL
+PERL_CALLCONV long	Perl_my_betohl(long n);
+#endif
+
+PERL_CALLCONV void	Perl_my_swabn(void* ptr, int n);
+
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+PERL_CALLCONV OP*	Perl_ck_anoncode(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_bitop(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_concat(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_defined(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_delete(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_die(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_eof(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_eval(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_exec(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_exists(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_exit(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_ftst(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_fun(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_glob(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_grep(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_index(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_join(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_lengthconst(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_lfun(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_listiob(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_match(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_method(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_null(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_open(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_repeat(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_require(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_return(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_rfun(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_rvconst(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_sassign(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_select(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_shift(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_sort(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_spair(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_split(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_subr(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_substr(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_svconst(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV OP*	Perl_ck_trunc(pTHX_ OP *o)
+			__attribute__warn_unused_result__;
+
+#endif
+
+PERL_CALLCONV bool	Perl_is_utf8_string_loclen(pTHX_ const U8 *s, STRLEN len, const U8 **ep, STRLEN *el);
+PERL_CALLCONV SV*	Perl_newSVhek(pTHX_ const HEK *hek)
+			__attribute__malloc__
+			__attribute__warn_unused_result__;
+
+PERL_CALLCONV bool	Perl_stashpv_hvname_match(pTHX_ const COP *cop, const HV *hv)
+			__attribute__warn_unused_result__;
+
+
+PERL_CALLCONV void	Perl_offer_nice_chunk(pTHX_ void *chunk, U32 chunk_size);
+
+
+#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+PERL_CALLCONV void	Perl_dump_sv_child(pTHX_ SV *sv);
+#endif
+
+#ifdef PERL_DONT_CREATE_GVSV
+PERL_CALLCONV GV*	Perl_gv_SVadd(pTHX_ GV* gv);
+#endif
+PERL_CALLCONV bool	Perl_ckwarn(pTHX_ U32 w);
+PERL_CALLCONV bool	Perl_ckwarn_d(pTHX_ U32 w);
+
+PERL_CALLCONV void	Perl_my_clearenv(pTHX);
+
+END_EXTERN_C
+/*
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/reentr.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/reentr.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/reentr.h	(revision 14489)
@@ -0,0 +1,784 @@
+/* -*- buffer-read-only: t -*-
+ *
+ *    reentr.h
+ *
+ *    Copyright (C) 2002, 2003, 2005 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ *  !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ *  This file is built by reentr.pl from data in reentr.pl.
+ */
+
+#ifndef REENTR_H
+#define REENTR_H
+
+#ifdef USE_REENTRANT_API
+
+#ifdef PERL_CORE
+#   define PL_REENTRANT_RETINT PL_reentrant_retint
+#endif
+
+/* Deprecations: some platforms have the said reentrant interfaces
+ * but they are declared obsolete and are not to be used.  Often this
+ * means that the platform has threadsafed the interfaces (hopefully).
+ * All this is OS version dependent, so we are of course fooling ourselves.
+ * If you know of more deprecations on some platforms, please add your own. */
+
+#ifdef __hpux
+#   undef HAS_CRYPT_R
+#   undef HAS_DRAND48_R
+#   undef HAS_ENDGRENT_R
+#   undef HAS_ENDPWENT_R
+#   undef HAS_GETGRENT_R
+#   undef HAS_GETPWENT_R
+#   undef HAS_SETLOCALE_R
+#   undef HAS_SRAND48_R
+#   undef HAS_STRERROR_R
+#   define NETDB_R_OBSOLETE
+#endif
+
+#if defined(__osf__) && defined(__alpha) /* Tru64 aka Digital UNIX */
+#   undef HAS_CRYPT_R
+#   undef HAS_STRERROR_R
+#   define NETDB_R_OBSOLETE
+#endif
+
+#ifdef NETDB_R_OBSOLETE
+#   undef HAS_ENDHOSTENT_R
+#   undef HAS_ENDNETENT_R
+#   undef HAS_ENDPROTOENT_R
+#   undef HAS_ENDSERVENT_R
+#   undef HAS_GETHOSTBYADDR_R
+#   undef HAS_GETHOSTBYNAME_R
+#   undef HAS_GETHOSTENT_R
+#   undef HAS_GETNETBYADDR_R
+#   undef HAS_GETNETBYNAME_R
+#   undef HAS_GETNETENT_R
+#   undef HAS_GETPROTOBYNAME_R
+#   undef HAS_GETPROTOBYNUMBER_R
+#   undef HAS_GETPROTOENT_R
+#   undef HAS_GETSERVBYNAME_R
+#   undef HAS_GETSERVBYPORT_R
+#   undef HAS_GETSERVENT_R
+#   undef HAS_SETHOSTENT_R
+#   undef HAS_SETNETENT_R
+#   undef HAS_SETPROTOENT_R
+#   undef HAS_SETSERVENT_R
+#endif
+
+#ifdef I_PWD
+#   include <pwd.h>
+#endif
+#ifdef I_GRP
+#   include <grp.h>
+#endif
+#ifdef I_NETDB
+#   include <netdb.h>
+#endif
+#ifdef I_STDLIB
+#   include <stdlib.h>	/* drand48_data */
+#endif
+#ifdef I_CRYPT
+#   ifdef I_CRYPT
+#       include <crypt.h>
+#   endif
+#endif
+#ifdef HAS_GETSPNAM_R
+#   ifdef I_SHADOW
+#       include <shadow.h>
+#   endif
+#endif
+
+#define REENTRANT_PROTO_B_B	1
+#define REENTRANT_PROTO_B_BI	2
+#define REENTRANT_PROTO_B_BW	3
+#define REENTRANT_PROTO_B_CCD	4
+#define REENTRANT_PROTO_B_CCS	5
+#define REENTRANT_PROTO_B_IBI	6
+#define REENTRANT_PROTO_B_IBW	7
+#define REENTRANT_PROTO_B_SB	8
+#define REENTRANT_PROTO_B_SBI	9
+#define REENTRANT_PROTO_I_BI	10
+#define REENTRANT_PROTO_I_BW	11
+#define REENTRANT_PROTO_I_CCSBWR	12
+#define REENTRANT_PROTO_I_CCSD	13
+#define REENTRANT_PROTO_I_CII	14
+#define REENTRANT_PROTO_I_CIISD	15
+#define REENTRANT_PROTO_I_CSBI	16
+#define REENTRANT_PROTO_I_CSBIR	17
+#define REENTRANT_PROTO_I_CSBWR	18
+#define REENTRANT_PROTO_I_CSBWRE	19
+#define REENTRANT_PROTO_I_CSD	20
+#define REENTRANT_PROTO_I_CWISBWRE	21
+#define REENTRANT_PROTO_I_CWISD	22
+#define REENTRANT_PROTO_I_D	23
+#define REENTRANT_PROTO_I_H	24
+#define REENTRANT_PROTO_I_IBI	25
+#define REENTRANT_PROTO_I_IBW	26
+#define REENTRANT_PROTO_I_ICBI	27
+#define REENTRANT_PROTO_I_ICSBWR	28
+#define REENTRANT_PROTO_I_ICSD	29
+#define REENTRANT_PROTO_I_ID	30
+#define REENTRANT_PROTO_I_IISD	31
+#define REENTRANT_PROTO_I_ISBWR	32
+#define REENTRANT_PROTO_I_ISD	33
+#define REENTRANT_PROTO_I_LISBI	34
+#define REENTRANT_PROTO_I_LISD	35
+#define REENTRANT_PROTO_I_LS	36
+#define REENTRANT_PROTO_I_SB	37
+#define REENTRANT_PROTO_I_SBI	38
+#define REENTRANT_PROTO_I_SBIE	39
+#define REENTRANT_PROTO_I_SBIH	40
+#define REENTRANT_PROTO_I_SBIR	41
+#define REENTRANT_PROTO_I_SBWR	42
+#define REENTRANT_PROTO_I_SBWRE	43
+#define REENTRANT_PROTO_I_SD	44
+#define REENTRANT_PROTO_I_ST	45
+#define REENTRANT_PROTO_I_St	46
+#define REENTRANT_PROTO_I_TISD	47
+#define REENTRANT_PROTO_I_TS	48
+#define REENTRANT_PROTO_I_TSBI	49
+#define REENTRANT_PROTO_I_TSBIR	50
+#define REENTRANT_PROTO_I_TSBWR	51
+#define REENTRANT_PROTO_I_TSR	52
+#define REENTRANT_PROTO_I_TsISBWRE	53
+#define REENTRANT_PROTO_I_UISBWRE	54
+#define REENTRANT_PROTO_I_iS	55
+#define REENTRANT_PROTO_I_lS	56
+#define REENTRANT_PROTO_I_uISBWRE	57
+#define REENTRANT_PROTO_S_CBI	58
+#define REENTRANT_PROTO_S_CCSBI	59
+#define REENTRANT_PROTO_S_CIISBIE	60
+#define REENTRANT_PROTO_S_CSBI	61
+#define REENTRANT_PROTO_S_CSBIE	62
+#define REENTRANT_PROTO_S_CWISBIE	63
+#define REENTRANT_PROTO_S_CWISBWIE	64
+#define REENTRANT_PROTO_S_ICSBI	65
+#define REENTRANT_PROTO_S_ISBI	66
+#define REENTRANT_PROTO_S_LISBI	67
+#define REENTRANT_PROTO_S_SBI	68
+#define REENTRANT_PROTO_S_SBIE	69
+#define REENTRANT_PROTO_S_SBW	70
+#define REENTRANT_PROTO_S_TISBI	71
+#define REENTRANT_PROTO_S_TS	72
+#define REENTRANT_PROTO_S_TSBI	73
+#define REENTRANT_PROTO_S_TSBIE	74
+#define REENTRANT_PROTO_S_TWISBIE	75
+#define REENTRANT_PROTO_V_D	76
+#define REENTRANT_PROTO_V_H	77
+#define REENTRANT_PROTO_V_ID	78
+
+/* Defines for indicating which special features are supported. */
+
+/* The getgrent getgrgid getgrnam using buffer? */
+
+#if defined(HAS_GETGRENT_R) && (GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIR || GETGRENT_R_PROTO == REENTRANT_PROTO_S_SBW || GETGRENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
+#   define GETGRENT_R_HAS_BUFFER
+#else
+#   undef  GETGRENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETGRGID_R) && (GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBWR || GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBIR || GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBI || GETGRGID_R_PROTO == REENTRANT_PROTO_S_TSBI)
+#   define GETGRGID_R_HAS_BUFFER
+#else
+#   undef  GETGRGID_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETGRNAM_R) && (GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR || GETGRNAM_R_PROTO == REENTRANT_PROTO_S_CBI || GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBI || GETGRNAM_R_PROTO == REENTRANT_PROTO_S_CSBI)
+#   define GETGRNAM_R_HAS_BUFFER
+#else
+#   undef  GETGRNAM_R_HAS_BUFFER
+#endif
+
+/* Any of the getgrent getgrgid getgrnam using buffer? */
+
+#if (defined(GETGRENT_R_HAS_BUFFER) || defined(GETGRGID_R_HAS_BUFFER) || defined(GETGRNAM_R_HAS_BUFFER))
+#   define USE_GRENT_BUFFER
+#else
+#   undef  USE_GRENT_BUFFER
+#endif
+
+/* The getgrent getgrgid getgrnam using ptr? */
+
+#if defined(HAS_GETGRENT_R) && (GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIR)
+#   define GETGRENT_R_HAS_PTR
+#else
+#   undef  GETGRENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETGRGID_R) && (GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBWR || GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBIR)
+#   define GETGRGID_R_HAS_PTR
+#else
+#   undef  GETGRGID_R_HAS_PTR
+#endif
+#if defined(HAS_GETGRNAM_R) && (GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR)
+#   define GETGRNAM_R_HAS_PTR
+#else
+#   undef  GETGRNAM_R_HAS_PTR
+#endif
+
+/* Any of the getgrent getgrgid getgrnam using ptr? */
+
+#if (defined(GETGRENT_R_HAS_PTR) || defined(GETGRGID_R_HAS_PTR) || defined(GETGRNAM_R_HAS_PTR))
+#   define USE_GRENT_PTR
+#else
+#   undef  USE_GRENT_PTR
+#endif
+
+/* The getpwent getpwnam getpwuid using ptr? */
+
+#if defined(HAS_GETPWENT_R) && (GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIR)
+#   define GETPWENT_R_HAS_PTR
+#else
+#   undef  GETPWENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETPWNAM_R) && (GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR)
+#   define GETPWNAM_R_HAS_PTR
+#else
+#   undef  GETPWNAM_R_HAS_PTR
+#endif
+#if defined(HAS_GETPWUID_R) && (GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBWR || GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBIR)
+#   define GETPWUID_R_HAS_PTR
+#else
+#   undef  GETPWUID_R_HAS_PTR
+#endif
+
+/* Any of the getpwent getpwnam getpwuid using ptr? */
+
+#if (defined(GETPWENT_R_HAS_PTR) || defined(GETPWNAM_R_HAS_PTR) || defined(GETPWUID_R_HAS_PTR))
+#   define USE_PWENT_PTR
+#else
+#   undef  USE_PWENT_PTR
+#endif
+
+/* The getspent getspnam using ptr? */
+
+#if defined(HAS_GETSPNAM_R) && (GETSPNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR)
+#   define GETSPNAM_R_HAS_PTR
+#else
+#   undef  GETSPNAM_R_HAS_PTR
+#endif
+
+/* Any of the getspent getspnam using ptr? */
+
+#if (defined(GETSPENT_R_HAS_PTR) || defined(GETSPNAM_R_HAS_PTR))
+#   define USE_SPENT_PTR
+#else
+#   undef  USE_SPENT_PTR
+#endif
+
+/* The getgrent getgrgid getgrnam setgrent endgrent using fptr? */
+
+#if defined(HAS_GETGRENT_R) && (GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
+#   define GETGRENT_R_HAS_FPTR
+#else
+#   undef  GETGRENT_R_HAS_FPTR
+#endif
+#if defined(HAS_SETGRENT_R) && (SETGRENT_R_PROTO == REENTRANT_PROTO_I_H || SETGRENT_R_PROTO == REENTRANT_PROTO_V_H)
+#   define SETGRENT_R_HAS_FPTR
+#else
+#   undef  SETGRENT_R_HAS_FPTR
+#endif
+#if defined(HAS_ENDGRENT_R) && (ENDGRENT_R_PROTO == REENTRANT_PROTO_I_H || ENDGRENT_R_PROTO == REENTRANT_PROTO_V_H)
+#   define ENDGRENT_R_HAS_FPTR
+#else
+#   undef  ENDGRENT_R_HAS_FPTR
+#endif
+
+/* Any of the getgrent getgrgid getgrnam setgrent endgrent using fptr? */
+
+#if (defined(GETGRENT_R_HAS_FPTR) || defined(GETGRGID_R_HAS_FPTR) || defined(GETGRNAM_R_HAS_FPTR) || defined(SETGRENT_R_HAS_FPTR) || defined(ENDGRENT_R_HAS_FPTR))
+#   define USE_GRENT_FPTR
+#else
+#   undef  USE_GRENT_FPTR
+#endif
+
+/* The getpwent getpwnam getpwuid setpwent endpwent using fptr? */
+
+#if defined(HAS_GETPWENT_R) && (GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
+#   define GETPWENT_R_HAS_FPTR
+#else
+#   undef  GETPWENT_R_HAS_FPTR
+#endif
+#if defined(HAS_SETPWENT_R) && (SETPWENT_R_PROTO == REENTRANT_PROTO_I_H || SETPWENT_R_PROTO == REENTRANT_PROTO_V_H)
+#   define SETPWENT_R_HAS_FPTR
+#else
+#   undef  SETPWENT_R_HAS_FPTR
+#endif
+#if defined(HAS_ENDPWENT_R) && (ENDPWENT_R_PROTO == REENTRANT_PROTO_I_H || ENDPWENT_R_PROTO == REENTRANT_PROTO_V_H)
+#   define ENDPWENT_R_HAS_FPTR
+#else
+#   undef  ENDPWENT_R_HAS_FPTR
+#endif
+
+/* Any of the getpwent getpwnam getpwuid setpwent endpwent using fptr? */
+
+#if (defined(GETPWENT_R_HAS_FPTR) || defined(GETPWNAM_R_HAS_FPTR) || defined(GETPWUID_R_HAS_FPTR) || defined(SETPWENT_R_HAS_FPTR) || defined(ENDPWENT_R_HAS_FPTR))
+#   define USE_PWENT_FPTR
+#else
+#   undef  USE_PWENT_FPTR
+#endif
+
+/* The getpwent getpwgid getpwnam using buffer? */
+
+#if defined(HAS_GETPWENT_R) && (GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIR || GETPWENT_R_PROTO == REENTRANT_PROTO_S_SBW || GETPWENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
+#   define GETPWENT_R_HAS_BUFFER
+#else
+#   undef  GETPWENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETPWNAM_R) && (GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR || GETPWNAM_R_PROTO == REENTRANT_PROTO_S_CSBI || GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBI)
+#   define GETPWNAM_R_HAS_BUFFER
+#else
+#   undef  GETPWNAM_R_HAS_BUFFER
+#endif
+
+/* Any of the getpwent getpwgid getpwnam using buffer? */
+
+#if (defined(GETPWENT_R_HAS_BUFFER) || defined(GETPWGID_R_HAS_BUFFER) || defined(GETPWNAM_R_HAS_BUFFER))
+#   define USE_PWENT_BUFFER
+#else
+#   undef  USE_PWENT_BUFFER
+#endif
+
+/* The gethostent gethostbyaddr gethostbyname using ptr? */
+
+#if defined(HAS_GETHOSTENT_R) && (GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE)
+#   define GETHOSTENT_R_HAS_PTR
+#else
+#   undef  GETHOSTENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETHOSTBYADDR_R) && (GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE)
+#   define GETHOSTBYADDR_R_HAS_PTR
+#else
+#   undef  GETHOSTBYADDR_R_HAS_PTR
+#endif
+#if defined(HAS_GETHOSTBYNAME_R) && (GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE)
+#   define GETHOSTBYNAME_R_HAS_PTR
+#else
+#   undef  GETHOSTBYNAME_R_HAS_PTR
+#endif
+
+/* Any of the gethostent gethostbyaddr gethostbyname using ptr? */
+
+#if (defined(GETHOSTENT_R_HAS_PTR) || defined(GETHOSTBYADDR_R_HAS_PTR) || defined(GETHOSTBYNAME_R_HAS_PTR))
+#   define USE_HOSTENT_PTR
+#else
+#   undef  USE_HOSTENT_PTR
+#endif
+
+/* The getnetent getnetbyaddr getnetbyname using ptr? */
+
+#if defined(HAS_GETNETENT_R) && (GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE)
+#   define GETNETENT_R_HAS_PTR
+#else
+#   undef  GETNETENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETNETBYADDR_R) && (GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE)
+#   define GETNETBYADDR_R_HAS_PTR
+#else
+#   undef  GETNETBYADDR_R_HAS_PTR
+#endif
+#if defined(HAS_GETNETBYNAME_R) && (GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE)
+#   define GETNETBYNAME_R_HAS_PTR
+#else
+#   undef  GETNETBYNAME_R_HAS_PTR
+#endif
+
+/* Any of the getnetent getnetbyaddr getnetbyname using ptr? */
+
+#if (defined(GETNETENT_R_HAS_PTR) || defined(GETNETBYADDR_R_HAS_PTR) || defined(GETNETBYNAME_R_HAS_PTR))
+#   define USE_NETENT_PTR
+#else
+#   undef  USE_NETENT_PTR
+#endif
+
+/* The getprotoent getprotobyname getprotobynumber using ptr? */
+
+#if defined(HAS_GETPROTOENT_R) && (GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBWR)
+#   define GETPROTOENT_R_HAS_PTR
+#else
+#   undef  GETPROTOENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETPROTOBYNAME_R) && (GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWR)
+#   define GETPROTOBYNAME_R_HAS_PTR
+#else
+#   undef  GETPROTOBYNAME_R_HAS_PTR
+#endif
+#if defined(HAS_GETPROTOBYNUMBER_R) && (GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_I_ISBWR)
+#   define GETPROTOBYNUMBER_R_HAS_PTR
+#else
+#   undef  GETPROTOBYNUMBER_R_HAS_PTR
+#endif
+
+/* Any of the getprotoent getprotobyname getprotobynumber using ptr? */
+
+#if (defined(GETPROTOENT_R_HAS_PTR) || defined(GETPROTOBYNAME_R_HAS_PTR) || defined(GETPROTOBYNUMBER_R_HAS_PTR))
+#   define USE_PROTOENT_PTR
+#else
+#   undef  USE_PROTOENT_PTR
+#endif
+
+/* The getservent getservbyname getservbyport using ptr? */
+
+#if defined(HAS_GETSERVENT_R) && (GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBWR)
+#   define GETSERVENT_R_HAS_PTR
+#else
+#   undef  GETSERVENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETSERVBYNAME_R) && (GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSBWR)
+#   define GETSERVBYNAME_R_HAS_PTR
+#else
+#   undef  GETSERVBYNAME_R_HAS_PTR
+#endif
+#if defined(HAS_GETSERVBYPORT_R) && (GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_I_ICSBWR)
+#   define GETSERVBYPORT_R_HAS_PTR
+#else
+#   undef  GETSERVBYPORT_R_HAS_PTR
+#endif
+
+/* Any of the getservent getservbyname getservbyport using ptr? */
+
+#if (defined(GETSERVENT_R_HAS_PTR) || defined(GETSERVBYNAME_R_HAS_PTR) || defined(GETSERVBYPORT_R_HAS_PTR))
+#   define USE_SERVENT_PTR
+#else
+#   undef  USE_SERVENT_PTR
+#endif
+
+/* The gethostent gethostbyaddr gethostbyname using buffer? */
+
+#if defined(HAS_GETHOSTENT_R) && (GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBIE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBI)
+#   define GETHOSTENT_R_HAS_BUFFER
+#else
+#   undef  GETHOSTENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETHOSTBYADDR_R) && (GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBWIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CIISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE)
+#   define GETHOSTBYADDR_R_HAS_BUFFER
+#else
+#   undef  GETHOSTBYADDR_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETHOSTBYNAME_R) && (GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE || GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBIE)
+#   define GETHOSTBYNAME_R_HAS_BUFFER
+#else
+#   undef  GETHOSTBYNAME_R_HAS_BUFFER
+#endif
+
+/* Any of the gethostent gethostbyaddr gethostbyname using buffer? */
+
+#if (defined(GETHOSTENT_R_HAS_BUFFER) || defined(GETHOSTBYADDR_R_HAS_BUFFER) || defined(GETHOSTBYNAME_R_HAS_BUFFER))
+#   define USE_HOSTENT_BUFFER
+#else
+#   undef  USE_HOSTENT_BUFFER
+#endif
+
+/* The getnetent getnetbyaddr getnetbyname using buffer? */
+
+#if defined(HAS_GETNETENT_R) && (GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBIE || GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBI)
+#   define GETNETENT_R_HAS_BUFFER
+#else
+#   undef  GETNETENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETNETBYADDR_R) && (GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_LISBI || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_S_TISBI || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_S_LISBI || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE)
+#   define GETNETBYADDR_R_HAS_BUFFER
+#else
+#   undef  GETNETBYADDR_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETNETBYNAME_R) && (GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE || GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBI || GETNETBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBI)
+#   define GETNETBYNAME_R_HAS_BUFFER
+#else
+#   undef  GETNETBYNAME_R_HAS_BUFFER
+#endif
+
+/* Any of the getnetent getnetbyaddr getnetbyname using buffer? */
+
+#if (defined(GETNETENT_R_HAS_BUFFER) || defined(GETNETBYADDR_R_HAS_BUFFER) || defined(GETNETBYNAME_R_HAS_BUFFER))
+#   define USE_NETENT_BUFFER
+#else
+#   undef  USE_NETENT_BUFFER
+#endif
+
+/* The getprotoent getprotobyname getprotobynumber using buffer? */
+
+#if defined(HAS_GETPROTOENT_R) && (GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETPROTOENT_R_PROTO == REENTRANT_PROTO_S_SBI)
+#   define GETPROTOENT_R_HAS_BUFFER
+#else
+#   undef  GETPROTOENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETPROTOBYNAME_R) && (GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBI)
+#   define GETPROTOBYNAME_R_HAS_BUFFER
+#else
+#   undef  GETPROTOBYNAME_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETPROTOBYNUMBER_R) && (GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_I_ISBWR || GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_S_ISBI)
+#   define GETPROTOBYNUMBER_R_HAS_BUFFER
+#else
+#   undef  GETPROTOBYNUMBER_R_HAS_BUFFER
+#endif
+
+/* Any of the getprotoent getprotobyname getprotobynumber using buffer? */
+
+#if (defined(GETPROTOENT_R_HAS_BUFFER) || defined(GETPROTOBYNAME_R_HAS_BUFFER) || defined(GETPROTOBYNUMBER_R_HAS_BUFFER))
+#   define USE_PROTOENT_BUFFER
+#else
+#   undef  USE_PROTOENT_BUFFER
+#endif
+
+/* The getservent getservbyname getservbyport using buffer? */
+
+#if defined(HAS_GETSERVENT_R) && (GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETSERVENT_R_PROTO == REENTRANT_PROTO_S_SBI)
+#   define GETSERVENT_R_HAS_BUFFER
+#else
+#   undef  GETSERVENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETSERVBYNAME_R) && (GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSBWR || GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_S_CCSBI)
+#   define GETSERVBYNAME_R_HAS_BUFFER
+#else
+#   undef  GETSERVBYNAME_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETSERVBYPORT_R) && (GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_I_ICSBWR || GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_S_ICSBI)
+#   define GETSERVBYPORT_R_HAS_BUFFER
+#else
+#   undef  GETSERVBYPORT_R_HAS_BUFFER
+#endif
+
+/* Any of the getservent getservbyname getservbyport using buffer? */
+
+#if (defined(GETSERVENT_R_HAS_BUFFER) || defined(GETSERVBYNAME_R_HAS_BUFFER) || defined(GETSERVBYPORT_R_HAS_BUFFER))
+#   define USE_SERVENT_BUFFER
+#else
+#   undef  USE_SERVENT_BUFFER
+#endif
+
+/* The gethostent gethostbyaddr gethostbyname using errno? */
+
+#if defined(HAS_GETHOSTENT_R) && (GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBIE)
+#   define GETHOSTENT_R_HAS_ERRNO
+#else
+#   undef  GETHOSTENT_R_HAS_ERRNO
+#endif
+#if defined(HAS_GETHOSTBYADDR_R) && (GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBWIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CIISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE)
+#   define GETHOSTBYADDR_R_HAS_ERRNO
+#else
+#   undef  GETHOSTBYADDR_R_HAS_ERRNO
+#endif
+#if defined(HAS_GETHOSTBYNAME_R) && (GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE || GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBIE)
+#   define GETHOSTBYNAME_R_HAS_ERRNO
+#else
+#   undef  GETHOSTBYNAME_R_HAS_ERRNO
+#endif
+
+/* Any of the gethostent gethostbyaddr gethostbyname using errno? */
+
+#if (defined(GETHOSTENT_R_HAS_ERRNO) || defined(GETHOSTBYADDR_R_HAS_ERRNO) || defined(GETHOSTBYNAME_R_HAS_ERRNO))
+#   define USE_HOSTENT_ERRNO
+#else
+#   undef  USE_HOSTENT_ERRNO
+#endif
+
+/* The getnetent getnetbyaddr getnetbyname using errno? */
+
+#if defined(HAS_GETNETENT_R) && (GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBIE)
+#   define GETNETENT_R_HAS_ERRNO
+#else
+#   undef  GETNETENT_R_HAS_ERRNO
+#endif
+#if defined(HAS_GETNETBYADDR_R) && (GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE)
+#   define GETNETBYADDR_R_HAS_ERRNO
+#else
+#   undef  GETNETBYADDR_R_HAS_ERRNO
+#endif
+#if defined(HAS_GETNETBYNAME_R) && (GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE)
+#   define GETNETBYNAME_R_HAS_ERRNO
+#else
+#   undef  GETNETBYNAME_R_HAS_ERRNO
+#endif
+
+/* Any of the getnetent getnetbyaddr getnetbyname using errno? */
+
+#if (defined(GETNETENT_R_HAS_ERRNO) || defined(GETNETBYADDR_R_HAS_ERRNO) || defined(GETNETBYNAME_R_HAS_ERRNO))
+#   define USE_NETENT_ERRNO
+#else
+#   undef  USE_NETENT_ERRNO
+#endif
+
+
+typedef struct {
+#ifdef HAS_ASCTIME_R
+	char*	_asctime_buffer;
+	size_t	_asctime_size;
+#endif /* HAS_ASCTIME_R */
+#ifdef HAS_CRYPT_R
+#if CRYPT_R_PROTO == REENTRANT_PROTO_B_CCD
+	CRYPTD* _crypt_data;
+#else
+	struct crypt_data _crypt_struct;
+#endif
+#endif /* HAS_CRYPT_R */
+#ifdef HAS_CTIME_R
+	char*	_ctime_buffer;
+	size_t	_ctime_size;
+#endif /* HAS_CTIME_R */
+#ifdef HAS_DRAND48_R
+	struct drand48_data _drand48_struct;
+	double	_drand48_double;
+#endif /* HAS_DRAND48_R */
+#ifdef HAS_GETGRNAM_R
+	struct group	_grent_struct;
+	char*	_grent_buffer;
+	size_t	_grent_size;
+#   ifdef USE_GRENT_PTR
+	struct group*	_grent_ptr;
+#   endif
+#   ifdef USE_GRENT_FPTR
+	FILE*	_grent_fptr;
+#   endif
+#endif /* HAS_GETGRNAM_R */
+#ifdef HAS_GETHOSTBYNAME_R
+	struct hostent	_hostent_struct;
+#   if GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+	struct hostent_data	_hostent_data;
+#   else
+	char*	_hostent_buffer;
+	size_t	_hostent_size;
+#   endif
+#   ifdef USE_HOSTENT_PTR
+	struct hostent*	_hostent_ptr;
+#   endif
+#   ifdef USE_HOSTENT_ERRNO
+	int	_hostent_errno;
+#   endif 
+#endif /* HAS_GETHOSTBYNAME_R */
+#ifdef HAS_GETLOGIN_R
+	char*	_getlogin_buffer;
+	size_t	_getlogin_size;
+#endif /* HAS_GETLOGIN_R */
+#ifdef HAS_GETNETBYNAME_R
+	struct netent	_netent_struct;
+#   if GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+	struct netent_data	_netent_data;
+#   else
+	char*	_netent_buffer;
+	size_t	_netent_size;
+#   endif
+#   ifdef USE_NETENT_PTR
+	struct netent*	_netent_ptr;
+#   endif
+#   ifdef USE_NETENT_ERRNO
+	int	_netent_errno;
+#   endif 
+#endif /* HAS_GETNETBYNAME_R */
+#ifdef HAS_GETPROTOBYNAME_R
+	struct protoent	_protoent_struct;
+#   if GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+	struct protoent_data	_protoent_data;
+#   else
+	char*	_protoent_buffer;
+	size_t	_protoent_size;
+#   endif
+#   ifdef USE_PROTOENT_PTR
+	struct protoent*	_protoent_ptr;
+#   endif
+#   ifdef USE_PROTOENT_ERRNO
+	int	_protoent_errno;
+#   endif 
+#endif /* HAS_GETPROTOBYNAME_R */
+#ifdef HAS_GETPWNAM_R
+	struct passwd	_pwent_struct;
+	char*	_pwent_buffer;
+	size_t	_pwent_size;
+#   ifdef USE_PWENT_PTR
+	struct passwd*	_pwent_ptr;
+#   endif
+#   ifdef USE_PWENT_FPTR
+	FILE*	_pwent_fptr;
+#   endif
+#endif /* HAS_GETPWNAM_R */
+#ifdef HAS_GETSERVBYNAME_R
+	struct servent	_servent_struct;
+#   if GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD
+	struct servent_data	_servent_data;
+#   else
+	char*	_servent_buffer;
+	size_t	_servent_size;
+#   endif
+#   ifdef USE_SERVENT_PTR
+	struct servent*	_servent_ptr;
+#   endif
+#   ifdef USE_SERVENT_ERRNO
+	int	_servent_errno;
+#   endif 
+#endif /* HAS_GETSERVBYNAME_R */
+#ifdef HAS_GETSPNAM_R
+	struct spwd	_spent_struct;
+	char*	_spent_buffer;
+	size_t	_spent_size;
+#   ifdef USE_SPENT_PTR
+	struct spwd*	_spent_ptr;
+#   endif
+#   ifdef USE_SPENT_FPTR
+	FILE*	_spent_fptr;
+#   endif
+#endif /* HAS_GETSPNAM_R */
+#ifdef HAS_GMTIME_R
+	struct tm _gmtime_struct;
+#endif /* HAS_GMTIME_R */
+#ifdef HAS_LOCALTIME_R
+	struct tm _localtime_struct;
+#endif /* HAS_LOCALTIME_R */
+#ifdef HAS_RANDOM_R
+#   if RANDOM_R_PROTO != REENTRANT_PROTO_I_St
+	struct random_data _random_struct;
+#   endif
+#endif /* HAS_RANDOM_R */
+#ifdef HAS_READDIR_R
+	struct dirent*	_readdir_struct;
+	size_t	_readdir_size;
+#   if READDIR_R_PROTO == REENTRANT_PROTO_I_TSR
+	struct dirent*	_readdir_ptr;
+#   endif
+#endif /* HAS_READDIR_R */
+#ifdef HAS_READDIR64_R
+	struct dirent64*	_readdir64_struct;
+	size_t	_readdir64_size;
+#   if READDIR64_R_PROTO == REENTRANT_PROTO_I_TSR
+	struct dirent64*	_readdir64_ptr;
+#   endif
+#endif /* HAS_READDIR64_R */
+#ifdef HAS_SETLOCALE_R
+	char*	_setlocale_buffer;
+	size_t	_setlocale_size;
+#endif /* HAS_SETLOCALE_R */
+#ifdef HAS_STRERROR_R
+	char*	_strerror_buffer;
+	size_t	_strerror_size;
+#endif /* HAS_STRERROR_R */
+#ifdef HAS_TTYNAME_R
+	char*	_ttyname_buffer;
+	size_t	_ttyname_size;
+#endif /* HAS_TTYNAME_R */
+#ifdef HAS_CRYPT_R
+#if CRYPT_R_PROTO == REENTRANT_PROTO_B_CCD
+#else
+	struct crypt_data *_crypt_struct_buffer;
+#endif
+#endif /* HAS_CRYPT_R */
+#ifdef HAS_RANDOM_R
+#   if RANDOM_R_PROTO == REENTRANT_PROTO_I_iS
+	int	_random_retval;
+#   endif
+#   if RANDOM_R_PROTO == REENTRANT_PROTO_I_lS
+	long	_random_retval;
+#   endif
+#   if RANDOM_R_PROTO == REENTRANT_PROTO_I_St
+	struct random_data _random_struct;
+	int32_t	_random_retval;
+#   endif
+#endif /* HAS_RANDOM_R */
+#ifdef HAS_SRANDOM_R
+	struct random_data _srandom_struct;
+#endif /* HAS_SRANDOM_R */
+
+    int dummy; /* cannot have empty structs */
+} REENTR;
+
+#endif /* USE_REENTRANT_API */
+
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/reentr.inc
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/reentr.inc	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/reentr.inc	(revision 14489)
@@ -0,0 +1,1531 @@
+/*
+ *    reentr.inc
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ *  !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+ *  This file is built by reentrl.pl from data in reentr.pl.
+ */
+
+#ifndef REENTRINC
+#define REENTRINC
+
+#ifdef USE_REENTRANT_API
+
+/*
+ * As of OpenBSD 3.7, reentrant functions are now working, they just are
+ * incompatible with everyone else.  To make OpenBSD happy, we have to
+ * memzero out certain structures before calling the functions.
+ */
+#if defined(__OpenBSD__)
+#    define REENTR_MEMZERO(a,b) memzero(a,b)
+#else
+#    define REENTR_MEMZERO(a,b) 0
+#endif
+
+/* The reentrant wrappers. */
+
+#ifdef HAS_ASCTIME_R
+#   undef asctime
+#   if !defined(asctime) && ASCTIME_R_PROTO == REENTRANT_PROTO_B_SB
+#       define asctime(a) asctime_r(a, PL_reentrant_buffer->_asctime_buffer)
+#   endif
+#   if !defined(asctime) && ASCTIME_R_PROTO == REENTRANT_PROTO_B_SBI
+#       define asctime(a) asctime_r(a, PL_reentrant_buffer->_asctime_buffer, PL_reentrant_buffer->_asctime_size)
+#   endif
+#   if !defined(asctime) && ASCTIME_R_PROTO == REENTRANT_PROTO_I_SB
+#       define asctime(a) (asctime_r(a, PL_reentrant_buffer->_asctime_buffer) == 0 ? PL_reentrant_buffer->_asctime_buffer : 0)
+#   endif
+#   if !defined(asctime) && ASCTIME_R_PROTO == REENTRANT_PROTO_I_SBI
+#       define asctime(a) (asctime_r(a, PL_reentrant_buffer->_asctime_buffer, PL_reentrant_buffer->_asctime_size) == 0 ? PL_reentrant_buffer->_asctime_buffer : 0)
+#   endif
+#endif /* HAS_ASCTIME_R */
+
+#ifdef HAS_CRYPT_R
+#   undef crypt
+#   if !defined(crypt) && CRYPT_R_PROTO == REENTRANT_PROTO_B_CCS
+#       define crypt(a, b) crypt_r(a, b, PL_reentrant_buffer->_crypt_struct_buffer)
+#   endif
+#   if !defined(crypt) && CRYPT_R_PROTO == REENTRANT_PROTO_B_CCD
+#       define crypt(a, b) crypt_r(a, b, &PL_reentrant_buffer->_crypt_data)
+#   endif
+#endif /* HAS_CRYPT_R */
+
+#ifdef HAS_CTERMID_R
+#   undef ctermid
+#   if !defined(ctermid) && CTERMID_R_PROTO == REENTRANT_PROTO_B_B
+#       define ctermid(a) ctermid_r(a)
+#   endif
+#endif /* HAS_CTERMID_R */
+
+#ifdef HAS_CTIME_R
+#   undef ctime
+#   if !defined(ctime) && CTIME_R_PROTO == REENTRANT_PROTO_B_SB
+#       define ctime(a) ctime_r(a, PL_reentrant_buffer->_ctime_buffer)
+#   endif
+#   if !defined(ctime) && CTIME_R_PROTO == REENTRANT_PROTO_B_SBI
+#       define ctime(a) ctime_r(a, PL_reentrant_buffer->_ctime_buffer, PL_reentrant_buffer->_ctime_size)
+#   endif
+#   if !defined(ctime) && CTIME_R_PROTO == REENTRANT_PROTO_I_SB
+#       define ctime(a) (ctime_r(a, PL_reentrant_buffer->_ctime_buffer) == 0 ? PL_reentrant_buffer->_ctime_buffer : 0)
+#   endif
+#   if !defined(ctime) && CTIME_R_PROTO == REENTRANT_PROTO_I_SBI
+#       define ctime(a) (ctime_r(a, PL_reentrant_buffer->_ctime_buffer, PL_reentrant_buffer->_ctime_size) == 0 ? PL_reentrant_buffer->_ctime_buffer : 0)
+#   endif
+#endif /* HAS_CTIME_R */
+
+#ifdef HAS_DRAND48_R
+#   undef drand48
+#   if !defined(drand48) && DRAND48_R_PROTO == REENTRANT_PROTO_I_ST
+#       define drand48() (drand48_r(&PL_reentrant_buffer->_drand48_struct, &PL_reentrant_buffer->_drand48_double) == 0 ? PL_reentrant_buffer->_drand48_double : 0)
+#   endif
+#endif /* HAS_DRAND48_R */
+
+#ifdef HAS_ENDGRENT_R
+#   undef endgrent
+#   if !defined(endgrent) && ENDGRENT_R_PROTO == REENTRANT_PROTO_I_H
+#       define endgrent() (endgrent_r(&PL_reentrant_buffer->_grent_fptr) == 0 ? 1 : 0)
+#   endif
+#   if !defined(endgrent) && ENDGRENT_R_PROTO == REENTRANT_PROTO_V_H
+#       define endgrent() endgrent_r(&PL_reentrant_buffer->_grent_fptr)
+#   endif
+#endif /* HAS_ENDGRENT_R */
+
+#ifdef HAS_ENDHOSTENT_R
+#   undef endhostent
+#   if !defined(endhostent) && ENDHOSTENT_R_PROTO == REENTRANT_PROTO_I_D
+#       define endhostent() (endhostent_r(&PL_reentrant_buffer->_hostent_data) == 0 ? 1 : 0)
+#   endif
+#   if !defined(endhostent) && ENDHOSTENT_R_PROTO == REENTRANT_PROTO_V_D
+#       define endhostent() endhostent_r(&PL_reentrant_buffer->_hostent_data)
+#   endif
+#endif /* HAS_ENDHOSTENT_R */
+
+#ifdef HAS_ENDNETENT_R
+#   undef endnetent
+#   if !defined(endnetent) && ENDNETENT_R_PROTO == REENTRANT_PROTO_I_D
+#       define endnetent() (endnetent_r(&PL_reentrant_buffer->_netent_data) == 0 ? 1 : 0)
+#   endif
+#   if !defined(endnetent) && ENDNETENT_R_PROTO == REENTRANT_PROTO_V_D
+#       define endnetent() endnetent_r(&PL_reentrant_buffer->_netent_data)
+#   endif
+#endif /* HAS_ENDNETENT_R */
+
+#ifdef HAS_ENDPROTOENT_R
+#   undef endprotoent
+#   if !defined(endprotoent) && ENDPROTOENT_R_PROTO == REENTRANT_PROTO_I_D
+#       define endprotoent() (endprotoent_r(&PL_reentrant_buffer->_protoent_data) == 0 ? 1 : 0)
+#   endif
+#   if !defined(endprotoent) && ENDPROTOENT_R_PROTO == REENTRANT_PROTO_V_D
+#       define endprotoent() endprotoent_r(&PL_reentrant_buffer->_protoent_data)
+#   endif
+#endif /* HAS_ENDPROTOENT_R */
+
+#ifdef HAS_ENDPWENT_R
+#   undef endpwent
+#   if !defined(endpwent) && ENDPWENT_R_PROTO == REENTRANT_PROTO_I_H
+#       define endpwent() (endpwent_r(&PL_reentrant_buffer->_pwent_fptr) == 0 ? 1 : 0)
+#   endif
+#   if !defined(endpwent) && ENDPWENT_R_PROTO == REENTRANT_PROTO_V_H
+#       define endpwent() endpwent_r(&PL_reentrant_buffer->_pwent_fptr)
+#   endif
+#endif /* HAS_ENDPWENT_R */
+
+#ifdef HAS_ENDSERVENT_R
+#   undef endservent
+#   if !defined(endservent) && ENDSERVENT_R_PROTO == REENTRANT_PROTO_I_D
+#       define endservent() (endservent_r(&PL_reentrant_buffer->_servent_data) == 0 ? 1 : 0)
+#   endif
+#   if !defined(endservent) && ENDSERVENT_R_PROTO == REENTRANT_PROTO_V_D
+#       define endservent() endservent_r(&PL_reentrant_buffer->_servent_data)
+#   endif
+#endif /* HAS_ENDSERVENT_R */
+
+#ifdef HAS_GETGRENT_R
+#   undef getgrent
+#   if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBWR
+#       ifdef PERL_CORE
+#           define getgrent() (((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getgrent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0));})
+#           else
+#               define getgrent() Perl_reentr_getgrent()
+                static struct group* Perl_reentr_getgrent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIR
+#       ifdef PERL_CORE
+#           define getgrent() (((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getgrent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0));})
+#           else
+#               define getgrent() Perl_reentr_getgrent()
+                static struct group* Perl_reentr_getgrent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_S_SBW
+#       define getgrent() (getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size) ? &PL_reentrant_buffer->_grent_struct : ((errno == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrent") : 0))
+#   endif
+#   if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_S_SBI
+#       define getgrent() (getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size) ? &PL_reentrant_buffer->_grent_struct : ((errno == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrent") : 0))
+#   endif
+#   if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBI
+#       ifdef PERL_CORE
+#           define getgrent() (((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getgrent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0));})
+#           else
+#               define getgrent() Perl_reentr_getgrent()
+                static struct group* Perl_reentr_getgrent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIH
+#       ifdef PERL_CORE
+#           define getgrent() (((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_fptr)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getgrent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_fptr)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0));})
+#           else
+#               define getgrent() Perl_reentr_getgrent()
+                static struct group* Perl_reentr_getgrent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_fptr)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETGRENT_R */
+
+#ifdef HAS_GETGRGID_R
+#   undef getgrgid
+#   if !defined(getgrgid) && GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBWR
+#       ifdef PERL_CORE
+#           define getgrgid(a) (((PL_REENTRANT_RETINT = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrgid", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getgrgid(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrgid", a) : 0));})
+#           else
+#               define getgrgid(a) Perl_reentr_getgrgid(a)
+                static struct group* Perl_reentr_getgrgid(gid_t a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrgid", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getgrgid) && GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBIR
+#       ifdef PERL_CORE
+#           define getgrgid(a) (((PL_REENTRANT_RETINT = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrgid", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getgrgid(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrgid", a) : 0));})
+#           else
+#               define getgrgid(a) Perl_reentr_getgrgid(a)
+                static struct group* Perl_reentr_getgrgid(gid_t a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrgid", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getgrgid) && GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBI
+#       ifdef PERL_CORE
+#           define getgrgid(a) (((PL_REENTRANT_RETINT = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrgid", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getgrgid(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrgid", a) : 0));})
+#           else
+#               define getgrgid(a) Perl_reentr_getgrgid(a)
+                static struct group* Perl_reentr_getgrgid(gid_t a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrgid", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getgrgid) && GETGRGID_R_PROTO == REENTRANT_PROTO_S_TSBI
+#       define getgrgid(a) (getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size) ? &PL_reentrant_buffer->_grent_struct : ((errno == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrgid", a) : 0))
+#   endif
+#endif /* HAS_GETGRGID_R */
+
+#ifdef HAS_GETGRNAM_R
+#   undef getgrnam
+#   if !defined(getgrnam) && GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR
+#       ifdef PERL_CORE
+#           define getgrnam(a) (((PL_REENTRANT_RETINT = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrnam", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getgrnam(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrnam", a) : 0));})
+#           else
+#               define getgrnam(a) Perl_reentr_getgrnam(a)
+                static struct group* Perl_reentr_getgrnam(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrnam", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getgrnam) && GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR
+#       ifdef PERL_CORE
+#           define getgrnam(a) (((PL_REENTRANT_RETINT = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrnam", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getgrnam(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrnam", a) : 0));})
+#           else
+#               define getgrnam(a) Perl_reentr_getgrnam(a)
+                static struct group* Perl_reentr_getgrnam(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrnam", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getgrnam) && GETGRNAM_R_PROTO == REENTRANT_PROTO_S_CBI
+#       define getgrnam(a) (getgrnam_r(a, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size) ? PL_reentrant_buffer->_grent_buffer : ((errno == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrnam", a) : 0))
+#   endif
+#   if !defined(getgrnam) && GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBI
+#       ifdef PERL_CORE
+#           define getgrnam(a) (((PL_REENTRANT_RETINT = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrnam", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getgrnam(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrnam", a) : 0));})
+#           else
+#               define getgrnam(a) Perl_reentr_getgrnam(a)
+                static struct group* Perl_reentr_getgrnam(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct group*)Perl_reentrant_retry("getgrnam", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getgrnam) && GETGRNAM_R_PROTO == REENTRANT_PROTO_S_CSBI
+#       define getgrnam(a) (getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size) ? &PL_reentrant_buffer->_grent_struct : ((errno == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrnam", a) : 0))
+#   endif
+#endif /* HAS_GETGRNAM_R */
+
+#ifdef HAS_GETHOSTBYADDR_R
+#   undef gethostbyaddr
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE
+#       ifdef PERL_CORE
+#           define gethostbyaddr(a, b, c) (((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostbyaddr(a, b, c) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0));})
+#           else
+#               define gethostbyaddr(a, b, c) Perl_reentr_gethostbyaddr(a, b, c)
+                static struct hostent* Perl_reentr_gethostbyaddr(const char* a, size_t b, int c) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBWIE
+#       define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+#   endif
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBIE
+#       define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+#   endif
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TWISBIE
+#       define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+#   endif
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CIISBIE
+#       define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+#   endif
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CSBIE
+#       define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? 1 : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+#   endif
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TSBIE
+#       define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? 1 : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+#   endif
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISD
+#       ifdef PERL_CORE
+#           define gethostbyaddr(a, b, c) (((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostbyaddr(a, b, c) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0));})
+#           else
+#               define gethostbyaddr(a, b, c) Perl_reentr_gethostbyaddr(a, b, c)
+                static struct hostent* Perl_reentr_gethostbyaddr(const char* a, size_t b, int c) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CIISD
+#       ifdef PERL_CORE
+#           define gethostbyaddr(a, b, c) (((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostbyaddr(a, b, c) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0));})
+#           else
+#               define gethostbyaddr(a, b, c) Perl_reentr_gethostbyaddr(a, b, c)
+                static struct hostent* Perl_reentr_gethostbyaddr(const char* a, int b, int c) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CII
+#       ifdef PERL_CORE
+#           define gethostbyaddr(a, b, c) (((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c)) == 0 ? 1 : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostbyaddr(a, b, c) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c)) == 0 ? 1 : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0));})
+#           else
+#               define gethostbyaddr(a, b, c) Perl_reentr_gethostbyaddr(a, b, c)
+                static struct hostent* Perl_reentr_gethostbyaddr(const char* a, int b, int c) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c)) == 0 ? 1 : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE
+#       ifdef PERL_CORE
+#           define gethostbyaddr(a, b, c) (((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostbyaddr(a, b, c) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0));})
+#           else
+#               define gethostbyaddr(a, b, c) Perl_reentr_gethostbyaddr(a, b, c)
+                static struct hostent* Perl_reentr_gethostbyaddr(const void* a, socklen_t b, int c) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETHOSTBYADDR_R */
+
+#ifdef HAS_GETHOSTBYNAME_R
+#   undef gethostbyname
+#   if !defined(gethostbyname) && GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE
+#       ifdef PERL_CORE
+#           define gethostbyname(a) (((PL_REENTRANT_RETINT = gethostbyname_r(a, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyname", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostbyname(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostbyname_r(a, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyname", a) : 0));})
+#           else
+#               define gethostbyname(a) Perl_reentr_gethostbyname(a)
+                static struct hostent* Perl_reentr_gethostbyname(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostbyname_r(a, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyname", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(gethostbyname) && GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBIE
+#       define gethostbyname(a) (gethostbyname_r(a, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyname", a) : 0))
+#   endif
+#   if !defined(gethostbyname) && GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+#       ifdef PERL_CORE
+#           define gethostbyname(a) (((PL_REENTRANT_RETINT = gethostbyname_r(a, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyname", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostbyname(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostbyname_r(a, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyname", a) : 0));})
+#           else
+#               define gethostbyname(a) Perl_reentr_gethostbyname(a)
+                static struct hostent* Perl_reentr_gethostbyname(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostbyname_r(a, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostbyname", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETHOSTBYNAME_R */
+
+#ifdef HAS_GETHOSTENT_R
+#   undef gethostent
+#   if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE
+#       ifdef PERL_CORE
+#           define gethostent() (((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0));})
+#           else
+#               define gethostent() Perl_reentr_gethostent()
+                static struct hostent* Perl_reentr_gethostent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBIE
+#       ifdef PERL_CORE
+#           define gethostent() (((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0));})
+#           else
+#               define gethostent() Perl_reentr_gethostent()
+                static struct hostent* Perl_reentr_gethostent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBIE
+#       define gethostent() (gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostent") : 0))
+#   endif
+#   if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBI
+#       define gethostent() (gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostent") : 0))
+#   endif
+#   if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBI
+#       ifdef PERL_CORE
+#           define gethostent() (((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0));})
+#           else
+#               define gethostent() Perl_reentr_gethostent()
+                static struct hostent* Perl_reentr_gethostent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SD
+#       ifdef PERL_CORE
+#           define gethostent() (((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define gethostent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0));})
+#           else
+#               define gethostent() Perl_reentr_gethostent()
+                static struct hostent* Perl_reentr_gethostent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = gethostent_r(&PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct hostent*)Perl_reentrant_retry("gethostent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETHOSTENT_R */
+
+#ifdef HAS_GETLOGIN_R
+#   undef getlogin
+#   if !defined(getlogin) && GETLOGIN_R_PROTO == REENTRANT_PROTO_I_BW
+#       ifdef PERL_CORE
+#           define getlogin() (((PL_REENTRANT_RETINT = getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)) == 0 ? PL_reentrant_buffer->_getlogin_buffer : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (char*)Perl_reentrant_retry("getlogin") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getlogin() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)) == 0 ? PL_reentrant_buffer->_getlogin_buffer : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (char*)Perl_reentrant_retry("getlogin") : 0));})
+#           else
+#               define getlogin() Perl_reentr_getlogin()
+                static char* Perl_reentr_getlogin() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)) == 0 ? PL_reentrant_buffer->_getlogin_buffer : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (char*)Perl_reentrant_retry("getlogin") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getlogin) && GETLOGIN_R_PROTO == REENTRANT_PROTO_I_BI
+#       ifdef PERL_CORE
+#           define getlogin() (((PL_REENTRANT_RETINT = getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)) == 0 ? PL_reentrant_buffer->_getlogin_buffer : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (char*)Perl_reentrant_retry("getlogin") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getlogin() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)) == 0 ? PL_reentrant_buffer->_getlogin_buffer : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (char*)Perl_reentrant_retry("getlogin") : 0));})
+#           else
+#               define getlogin() Perl_reentr_getlogin()
+                static char* Perl_reentr_getlogin() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)) == 0 ? PL_reentrant_buffer->_getlogin_buffer : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (char*)Perl_reentrant_retry("getlogin") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getlogin) && GETLOGIN_R_PROTO == REENTRANT_PROTO_B_BW
+#       define getlogin() getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)
+#   endif
+#   if !defined(getlogin) && GETLOGIN_R_PROTO == REENTRANT_PROTO_B_BI
+#       define getlogin() getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)
+#   endif
+#endif /* HAS_GETLOGIN_R */
+
+#ifdef HAS_GETNETBYADDR_R
+#   undef getnetbyaddr
+#   if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE
+#       ifdef PERL_CORE
+#           define getnetbyaddr(a, b) (((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetbyaddr(a, b) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));})
+#           else
+#               define getnetbyaddr(a, b) Perl_reentr_getnetbyaddr(a, b)
+                static struct netent* Perl_reentr_getnetbyaddr(unsigned long a, int b) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_LISBI
+#       ifdef PERL_CORE
+#           define getnetbyaddr(a, b) (((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetbyaddr(a, b) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));})
+#           else
+#               define getnetbyaddr(a, b) Perl_reentr_getnetbyaddr(a, b)
+                static struct netent* Perl_reentr_getnetbyaddr(long a, int b) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_S_TISBI
+#       define getnetbyaddr(a, b) (getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size) ? &PL_reentrant_buffer->_netent_struct : ((errno == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyaddr", a, b) : 0))
+#   endif
+#   if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_S_LISBI
+#       define getnetbyaddr(a, b) (getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size) ? &PL_reentrant_buffer->_netent_struct : ((errno == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyaddr", a, b) : 0))
+#   endif
+#   if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_TISD
+#       ifdef PERL_CORE
+#           define getnetbyaddr(a, b) (((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetbyaddr(a, b) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));})
+#           else
+#               define getnetbyaddr(a, b) Perl_reentr_getnetbyaddr(a, b)
+                static struct netent* Perl_reentr_getnetbyaddr(in_addr_t a, int b) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_LISD
+#       ifdef PERL_CORE
+#           define getnetbyaddr(a, b) (((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetbyaddr(a, b) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));})
+#           else
+#               define getnetbyaddr(a, b) Perl_reentr_getnetbyaddr(a, b)
+                static struct netent* Perl_reentr_getnetbyaddr(long a, int b) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_IISD
+#       ifdef PERL_CORE
+#           define getnetbyaddr(a, b) (((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetbyaddr(a, b) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));})
+#           else
+#               define getnetbyaddr(a, b) Perl_reentr_getnetbyaddr(a, b)
+                static struct netent* Perl_reentr_getnetbyaddr(int a, int b) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE
+#       ifdef PERL_CORE
+#           define getnetbyaddr(a, b) (((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetbyaddr(a, b) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));})
+#           else
+#               define getnetbyaddr(a, b) Perl_reentr_getnetbyaddr(a, b)
+                static struct netent* Perl_reentr_getnetbyaddr(uint32_t a, int b) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyaddr", a, b) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETNETBYADDR_R */
+
+#ifdef HAS_GETNETBYNAME_R
+#   undef getnetbyname
+#   if !defined(getnetbyname) && GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE
+#       ifdef PERL_CORE
+#           define getnetbyname(a) (((PL_REENTRANT_RETINT = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyname", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetbyname(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyname", a) : 0));})
+#           else
+#               define getnetbyname(a) Perl_reentr_getnetbyname(a)
+                static struct netent* Perl_reentr_getnetbyname(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyname", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getnetbyname) && GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBI
+#       ifdef PERL_CORE
+#           define getnetbyname(a) (((PL_REENTRANT_RETINT = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyname", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetbyname(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyname", a) : 0));})
+#           else
+#               define getnetbyname(a) Perl_reentr_getnetbyname(a)
+                static struct netent* Perl_reentr_getnetbyname(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyname", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getnetbyname) && GETNETBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBI
+#       define getnetbyname(a) (getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size) ? &PL_reentrant_buffer->_netent_struct : ((errno == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyname", a) : 0))
+#   endif
+#   if !defined(getnetbyname) && GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+#       ifdef PERL_CORE
+#           define getnetbyname(a) (((PL_REENTRANT_RETINT = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyname", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetbyname(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyname", a) : 0));})
+#           else
+#               define getnetbyname(a) Perl_reentr_getnetbyname(a)
+                static struct netent* Perl_reentr_getnetbyname(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetbyname", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETNETBYNAME_R */
+
+#ifdef HAS_GETNETENT_R
+#   undef getnetent
+#   if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE
+#       ifdef PERL_CORE
+#           define getnetent() (((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0));})
+#           else
+#               define getnetent() Perl_reentr_getnetent()
+                static struct netent* Perl_reentr_getnetent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBIE
+#       ifdef PERL_CORE
+#           define getnetent() (((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_errno)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_errno)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0));})
+#           else
+#               define getnetent() Perl_reentr_getnetent()
+                static struct netent* Perl_reentr_getnetent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_errno)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBIE
+#       define getnetent() (getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_errno) ? &PL_reentrant_buffer->_netent_struct : ((errno == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetent") : 0))
+#   endif
+#   if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBI
+#       define getnetent() (getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size) ? &PL_reentrant_buffer->_netent_struct : ((errno == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetent") : 0))
+#   endif
+#   if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBI
+#       ifdef PERL_CORE
+#           define getnetent() (((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0));})
+#           else
+#               define getnetent() Perl_reentr_getnetent()
+                static struct netent* Perl_reentr_getnetent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_I_SD
+#       ifdef PERL_CORE
+#           define getnetent() (((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getnetent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0));})
+#           else
+#               define getnetent() Perl_reentr_getnetent()
+                static struct netent* Perl_reentr_getnetent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getnetent_r(&PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct netent*)Perl_reentrant_retry("getnetent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETNETENT_R */
+
+#ifdef HAS_GETPROTOBYNAME_R
+#   undef getprotobyname
+#   if !defined(getprotobyname) && GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWR
+#       ifdef PERL_CORE
+#           define getprotobyname(a) (((PL_REENTRANT_RETINT = getprotobyname_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobyname", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getprotobyname(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getprotobyname_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobyname", a) : 0));})
+#           else
+#               define getprotobyname(a) Perl_reentr_getprotobyname(a)
+                static struct protoent* Perl_reentr_getprotobyname(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getprotobyname_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobyname", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getprotobyname) && GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBI
+#       define getprotobyname(a) (getprotobyname_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size) ? &PL_reentrant_buffer->_protoent_struct : ((errno == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotobyname", a) : 0))
+#   endif
+#   if !defined(getprotobyname) && GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+#       ifdef PERL_CORE
+#           define getprotobyname(a) (REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data)), ((PL_REENTRANT_RETINT = getprotobyname_r(a, &PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobyname", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getprotobyname(a) ({int PL_REENTRANT_RETINT; REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data)); ((PL_REENTRANT_RETINT = getprotobyname_r(a, &PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobyname", a) : 0));})
+#           else
+#               define getprotobyname(a) Perl_reentr_getprotobyname(a)
+                static struct protoent* Perl_reentr_getprotobyname(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data));
+		    return ((PL_REENTRANT_RETINT = getprotobyname_r(a, &PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobyname", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETPROTOBYNAME_R */
+
+#ifdef HAS_GETPROTOBYNUMBER_R
+#   undef getprotobynumber
+#   if !defined(getprotobynumber) && GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_I_ISBWR
+#       ifdef PERL_CORE
+#           define getprotobynumber(a) (((PL_REENTRANT_RETINT = getprotobynumber_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobynumber", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getprotobynumber(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getprotobynumber_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobynumber", a) : 0));})
+#           else
+#               define getprotobynumber(a) Perl_reentr_getprotobynumber(a)
+                static struct protoent* Perl_reentr_getprotobynumber(int a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getprotobynumber_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobynumber", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getprotobynumber) && GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_S_ISBI
+#       define getprotobynumber(a) (getprotobynumber_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size) ? &PL_reentrant_buffer->_protoent_struct : ((errno == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotobynumber", a) : 0))
+#   endif
+#   if !defined(getprotobynumber) && GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_I_ISD
+#       ifdef PERL_CORE
+#           define getprotobynumber(a) (REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data)), ((PL_REENTRANT_RETINT = getprotobynumber_r(a, &PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobynumber", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getprotobynumber(a) ({int PL_REENTRANT_RETINT; REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data)); ((PL_REENTRANT_RETINT = getprotobynumber_r(a, &PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobynumber", a) : 0));})
+#           else
+#               define getprotobynumber(a) Perl_reentr_getprotobynumber(a)
+                static struct protoent* Perl_reentr_getprotobynumber(int a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data));
+		    return ((PL_REENTRANT_RETINT = getprotobynumber_r(a, &PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotobynumber", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETPROTOBYNUMBER_R */
+
+#ifdef HAS_GETPROTOENT_R
+#   undef getprotoent
+#   if !defined(getprotoent) && GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBWR
+#       ifdef PERL_CORE
+#           define getprotoent() (((PL_REENTRANT_RETINT = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotoent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getprotoent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotoent") : 0));})
+#           else
+#               define getprotoent() Perl_reentr_getprotoent()
+                static struct protoent* Perl_reentr_getprotoent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotoent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getprotoent) && GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBI
+#       ifdef PERL_CORE
+#           define getprotoent() (((PL_REENTRANT_RETINT = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotoent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getprotoent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotoent") : 0));})
+#           else
+#               define getprotoent() Perl_reentr_getprotoent()
+                static struct protoent* Perl_reentr_getprotoent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotoent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getprotoent) && GETPROTOENT_R_PROTO == REENTRANT_PROTO_S_SBI
+#       define getprotoent() (getprotoent_r(&PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size) ? &PL_reentrant_buffer->_protoent_struct : ((errno == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotoent") : 0))
+#   endif
+#   if !defined(getprotoent) && GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SD
+#       ifdef PERL_CORE
+#           define getprotoent() (REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data)), ((PL_REENTRANT_RETINT = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotoent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getprotoent() ({int PL_REENTRANT_RETINT; REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data)); ((PL_REENTRANT_RETINT = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotoent") : 0));})
+#           else
+#               define getprotoent() Perl_reentr_getprotoent()
+                static struct protoent* Perl_reentr_getprotoent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data));
+		    return ((PL_REENTRANT_RETINT = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct protoent*)Perl_reentrant_retry("getprotoent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETPROTOENT_R */
+
+#ifdef HAS_GETPWENT_R
+#   undef getpwent
+#   if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBWR
+#       ifdef PERL_CORE
+#           define getpwent() (((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getpwent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0));})
+#           else
+#               define getpwent() Perl_reentr_getpwent()
+                static struct passwd* Perl_reentr_getpwent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIR
+#       ifdef PERL_CORE
+#           define getpwent() (((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getpwent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0));})
+#           else
+#               define getpwent() Perl_reentr_getpwent()
+                static struct passwd* Perl_reentr_getpwent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_S_SBW
+#       define getpwent() (getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size) ? &PL_reentrant_buffer->_pwent_struct : ((errno == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwent") : 0))
+#   endif
+#   if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_S_SBI
+#       define getpwent() (getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size) ? &PL_reentrant_buffer->_pwent_struct : ((errno == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwent") : 0))
+#   endif
+#   if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBI
+#       ifdef PERL_CORE
+#           define getpwent() (((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getpwent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0));})
+#           else
+#               define getpwent() Perl_reentr_getpwent()
+                static struct passwd* Perl_reentr_getpwent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIH
+#       ifdef PERL_CORE
+#           define getpwent() (((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_fptr)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getpwent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_fptr)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0));})
+#           else
+#               define getpwent() Perl_reentr_getpwent()
+                static struct passwd* Perl_reentr_getpwent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_fptr)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETPWENT_R */
+
+#ifdef HAS_GETPWNAM_R
+#   undef getpwnam
+#   if !defined(getpwnam) && GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR
+#       ifdef PERL_CORE
+#           define getpwnam(a) (((PL_REENTRANT_RETINT = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwnam", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getpwnam(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwnam", a) : 0));})
+#           else
+#               define getpwnam(a) Perl_reentr_getpwnam(a)
+                static struct passwd* Perl_reentr_getpwnam(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwnam", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getpwnam) && GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR
+#       ifdef PERL_CORE
+#           define getpwnam(a) (((PL_REENTRANT_RETINT = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwnam", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getpwnam(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwnam", a) : 0));})
+#           else
+#               define getpwnam(a) Perl_reentr_getpwnam(a)
+                static struct passwd* Perl_reentr_getpwnam(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwnam", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getpwnam) && GETPWNAM_R_PROTO == REENTRANT_PROTO_S_CSBI
+#       define getpwnam(a) (getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size) ? &PL_reentrant_buffer->_pwent_struct : ((errno == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwnam", a) : 0))
+#   endif
+#   if !defined(getpwnam) && GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBI
+#       ifdef PERL_CORE
+#           define getpwnam(a) (((PL_REENTRANT_RETINT = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwnam", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getpwnam(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwnam", a) : 0));})
+#           else
+#               define getpwnam(a) Perl_reentr_getpwnam(a)
+                static struct passwd* Perl_reentr_getpwnam(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwnam", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETPWNAM_R */
+
+#ifdef HAS_GETPWUID_R
+#   undef getpwuid
+#   if !defined(getpwuid) && GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBWR
+#       ifdef PERL_CORE
+#           define getpwuid(a) (((PL_REENTRANT_RETINT = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwuid", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getpwuid(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwuid", a) : 0));})
+#           else
+#               define getpwuid(a) Perl_reentr_getpwuid(a)
+                static struct passwd* Perl_reentr_getpwuid(uid_t a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwuid", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getpwuid) && GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBIR
+#       ifdef PERL_CORE
+#           define getpwuid(a) (((PL_REENTRANT_RETINT = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwuid", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getpwuid(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwuid", a) : 0));})
+#           else
+#               define getpwuid(a) Perl_reentr_getpwuid(a)
+                static struct passwd* Perl_reentr_getpwuid(uid_t a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwuid", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getpwuid) && GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBI
+#       ifdef PERL_CORE
+#           define getpwuid(a) (((PL_REENTRANT_RETINT = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwuid", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getpwuid(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwuid", a) : 0));})
+#           else
+#               define getpwuid(a) Perl_reentr_getpwuid(a)
+                static struct passwd* Perl_reentr_getpwuid(uid_t a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct passwd*)Perl_reentrant_retry("getpwuid", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getpwuid) && GETPWUID_R_PROTO == REENTRANT_PROTO_S_TSBI
+#       define getpwuid(a) (getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size) ? &PL_reentrant_buffer->_pwent_struct : ((errno == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwuid", a) : 0))
+#   endif
+#endif /* HAS_GETPWUID_R */
+
+#ifdef HAS_GETSERVBYNAME_R
+#   undef getservbyname
+#   if !defined(getservbyname) && GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSBWR
+#       ifdef PERL_CORE
+#           define getservbyname(a, b) (((PL_REENTRANT_RETINT = getservbyname_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyname", a, b) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getservbyname(a, b) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getservbyname_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyname", a, b) : 0));})
+#           else
+#               define getservbyname(a, b) Perl_reentr_getservbyname(a, b)
+                static struct servent* Perl_reentr_getservbyname(const char* a, const char* b) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getservbyname_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyname", a, b) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getservbyname) && GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_S_CCSBI
+#       define getservbyname(a, b) (getservbyname_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size) ? &PL_reentrant_buffer->_servent_struct : ((errno == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservbyname", a, b) : 0))
+#   endif
+#   if !defined(getservbyname) && GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD
+#       ifdef PERL_CORE
+#           define getservbyname(a, b) (REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data)), ((PL_REENTRANT_RETINT = getservbyname_r(a, b, &PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyname", a, b) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getservbyname(a, b) ({int PL_REENTRANT_RETINT; REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data)); ((PL_REENTRANT_RETINT = getservbyname_r(a, b, &PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyname", a, b) : 0));})
+#           else
+#               define getservbyname(a, b) Perl_reentr_getservbyname(a, b)
+                static struct servent* Perl_reentr_getservbyname(const char* a, const char* b) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data));
+		    return ((PL_REENTRANT_RETINT = getservbyname_r(a, b, &PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyname", a, b) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETSERVBYNAME_R */
+
+#ifdef HAS_GETSERVBYPORT_R
+#   undef getservbyport
+#   if !defined(getservbyport) && GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_I_ICSBWR
+#       ifdef PERL_CORE
+#           define getservbyport(a, b) (((PL_REENTRANT_RETINT = getservbyport_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyport", a, b) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getservbyport(a, b) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getservbyport_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyport", a, b) : 0));})
+#           else
+#               define getservbyport(a, b) Perl_reentr_getservbyport(a, b)
+                static struct servent* Perl_reentr_getservbyport(int a, const char* b) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getservbyport_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyport", a, b) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getservbyport) && GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_S_ICSBI
+#       define getservbyport(a, b) (getservbyport_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size) ? &PL_reentrant_buffer->_servent_struct : ((errno == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservbyport", a, b) : 0))
+#   endif
+#   if !defined(getservbyport) && GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_I_ICSD
+#       ifdef PERL_CORE
+#           define getservbyport(a, b) (REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data)), ((PL_REENTRANT_RETINT = getservbyport_r(a, b, &PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyport", a, b) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getservbyport(a, b) ({int PL_REENTRANT_RETINT; REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data)); ((PL_REENTRANT_RETINT = getservbyport_r(a, b, &PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyport", a, b) : 0));})
+#           else
+#               define getservbyport(a, b) Perl_reentr_getservbyport(a, b)
+                static struct servent* Perl_reentr_getservbyport(int a, const char* b) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data));
+		    return ((PL_REENTRANT_RETINT = getservbyport_r(a, b, &PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservbyport", a, b) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETSERVBYPORT_R */
+
+#ifdef HAS_GETSERVENT_R
+#   undef getservent
+#   if !defined(getservent) && GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBWR
+#       ifdef PERL_CORE
+#           define getservent() (((PL_REENTRANT_RETINT = getservent_r(&PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getservent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getservent_r(&PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservent") : 0));})
+#           else
+#               define getservent() Perl_reentr_getservent()
+                static struct servent* Perl_reentr_getservent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getservent_r(&PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getservent) && GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBI
+#       ifdef PERL_CORE
+#           define getservent() (((PL_REENTRANT_RETINT = getservent_r(&PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getservent() ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getservent_r(&PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservent") : 0));})
+#           else
+#               define getservent() Perl_reentr_getservent()
+                static struct servent* Perl_reentr_getservent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getservent_r(&PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getservent) && GETSERVENT_R_PROTO == REENTRANT_PROTO_S_SBI
+#       define getservent() (getservent_r(&PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size) ? &PL_reentrant_buffer->_servent_struct : ((errno == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservent") : 0))
+#   endif
+#   if !defined(getservent) && GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SD
+#       ifdef PERL_CORE
+#           define getservent() (REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data)), ((PL_REENTRANT_RETINT = getservent_r(&PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservent") : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getservent() ({int PL_REENTRANT_RETINT; REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data)); ((PL_REENTRANT_RETINT = getservent_r(&PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservent") : 0));})
+#           else
+#               define getservent() Perl_reentr_getservent()
+                static struct servent* Perl_reentr_getservent() {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data));
+		    return ((PL_REENTRANT_RETINT = getservent_r(&PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct servent*)Perl_reentrant_retry("getservent") : 0));
+                }
+#           endif
+#       endif
+#   endif
+#endif /* HAS_GETSERVENT_R */
+
+#ifdef HAS_GETSPNAM_R
+#   undef getspnam
+#   if !defined(getspnam) && GETSPNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR
+#       ifdef PERL_CORE
+#           define getspnam(a) (((PL_REENTRANT_RETINT = getspnam_r(a, &PL_reentrant_buffer->_spent_struct, PL_reentrant_buffer->_spent_buffer, PL_reentrant_buffer->_spent_size, &PL_reentrant_buffer->_spent_ptr)) == 0 ? PL_reentrant_buffer->_spent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct spwd*)Perl_reentrant_retry("getspnam", a) : 0)))
+#       else
+#           if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#               define getspnam(a) ({int PL_REENTRANT_RETINT; ; ((PL_REENTRANT_RETINT = getspnam_r(a, &PL_reentrant_buffer->_spent_struct, PL_reentrant_buffer->_spent_buffer, PL_reentrant_buffer->_spent_size, &PL_reentrant_buffer->_spent_ptr)) == 0 ? PL_reentrant_buffer->_spent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct spwd*)Perl_reentrant_retry("getspnam", a) : 0));})
+#           else
+#               define getspnam(a) Perl_reentr_getspnam(a)
+                static struct spwd* Perl_reentr_getspnam(const char* a) {
+                    dTHX;
+                    int PL_REENTRANT_RETINT;
+                    ;
+		    return ((PL_REENTRANT_RETINT = getspnam_r(a, &PL_reentrant_buffer->_spent_struct, PL_reentrant_buffer->_spent_buffer, PL_reentrant_buffer->_spent_size, &PL_reentrant_buffer->_spent_ptr)) == 0 ? PL_reentrant_buffer->_spent_ptr : (((PL_REENTRANT_RETINT == ERANGE) || (errno == ERANGE)) ? (struct spwd*)Perl_reentrant_retry("getspnam", a) : 0));
+                }
+#           endif
+#       endif
+#   endif
+#   if !defined(getspnam) && GETSPNAM_R_PROTO == REENTRANT_PROTO_S_CSBI
+#       define getspnam(a) (getspnam_r(a, &PL_reentrant_buffer->_spent_struct, PL_reentrant_buffer->_spent_buffer, PL_reentrant_buffer->_spent_size) ? &PL_reentrant_buffer->_spent_struct : ((errno == ERANGE) ? (struct spwd *) Perl_reentrant_retry("getspnam", a) : 0))
+#   endif
+#endif /* HAS_GETSPNAM_R */
+
+#ifdef HAS_GMTIME_R
+#   undef gmtime
+#   if !defined(gmtime) && GMTIME_R_PROTO == REENTRANT_PROTO_S_TS
+#       define gmtime(a) (gmtime_r(a, &PL_reentrant_buffer->_gmtime_struct) ? &PL_reentrant_buffer->_gmtime_struct : 0)
+#   endif
+#   if !defined(gmtime) && GMTIME_R_PROTO == REENTRANT_PROTO_I_TS
+#       define gmtime(a) (gmtime_r(a, &PL_reentrant_buffer->_gmtime_struct) == 0 ? &PL_reentrant_buffer->_gmtime_struct : 0)
+#   endif
+#endif /* HAS_GMTIME_R */
+
+#ifdef HAS_LOCALTIME_R
+#   undef localtime
+#   if !defined(localtime) && LOCALTIME_R_PROTO == REENTRANT_PROTO_S_TS
+#       define localtime(a) (localtime_r(a, &PL_reentrant_buffer->_localtime_struct) ? &PL_reentrant_buffer->_localtime_struct : 0)
+#   endif
+#   if !defined(localtime) && LOCALTIME_R_PROTO == REENTRANT_PROTO_I_TS
+#       define localtime(a) (localtime_r(a, &PL_reentrant_buffer->_localtime_struct) == 0 ? &PL_reentrant_buffer->_localtime_struct : 0)
+#   endif
+#endif /* HAS_LOCALTIME_R */
+
+#ifdef HAS_RANDOM_R
+#   undef random
+#   if !defined(random) && RANDOM_R_PROTO == REENTRANT_PROTO_I_iS
+#       define random() (random_r(&PL_reentrant_buffer->_random_retval, &PL_reentrant_buffer->_random_struct) == 0 ? PL_reentrant_buffer->_random_retval : 0)
+#   endif
+#   if !defined(random) && RANDOM_R_PROTO == REENTRANT_PROTO_I_lS
+#       define random() (random_r(&PL_reentrant_buffer->_random_retval, &PL_reentrant_buffer->_random_struct) == 0 ? PL_reentrant_buffer->_random_retval : 0)
+#   endif
+#   if !defined(random) && RANDOM_R_PROTO == REENTRANT_PROTO_I_St
+#       define random() (random_r(&PL_reentrant_buffer->_random_struct, &PL_reentrant_buffer->_random_retval) == 0 ? PL_reentrant_buffer->_random_retval : 0)
+#   endif
+#endif /* HAS_RANDOM_R */
+
+#ifdef HAS_READDIR_R
+#   undef readdir
+#   if !defined(readdir) && READDIR_R_PROTO == REENTRANT_PROTO_I_TSR
+#       define readdir(a) (readdir_r(a, PL_reentrant_buffer->_readdir_struct, &PL_reentrant_buffer->_readdir_ptr) == 0 ? PL_reentrant_buffer->_readdir_ptr : 0)
+#   endif
+#   if !defined(readdir) && READDIR_R_PROTO == REENTRANT_PROTO_I_TS
+#       define readdir(a) (readdir_r(a, PL_reentrant_buffer->_readdir_struct) == 0 ? PL_reentrant_buffer->_readdir_struct : 0)
+#   endif
+#endif /* HAS_READDIR_R */
+
+#ifdef HAS_READDIR64_R
+#   undef readdir64
+#   if !defined(readdir64) && READDIR64_R_PROTO == REENTRANT_PROTO_I_TSR
+#       define readdir64(a) (readdir64_r(a, PL_reentrant_buffer->_readdir64_struct, &PL_reentrant_buffer->_readdir64_ptr) == 0 ? PL_reentrant_buffer->_readdir64_ptr : 0)
+#   endif
+#   if !defined(readdir64) && READDIR64_R_PROTO == REENTRANT_PROTO_I_TS
+#       define readdir64(a) (readdir64_r(a, PL_reentrant_buffer->_readdir64_struct) == 0 ? PL_reentrant_buffer->_readdir64_struct : 0)
+#   endif
+#endif /* HAS_READDIR64_R */
+
+#ifdef HAS_SETGRENT_R
+#   undef setgrent
+#   if !defined(setgrent) && SETGRENT_R_PROTO == REENTRANT_PROTO_I_H
+#       define setgrent() (setgrent_r(&PL_reentrant_buffer->_grent_fptr) == 0 ? 1 : 0)
+#   endif
+#   if !defined(setgrent) && SETGRENT_R_PROTO == REENTRANT_PROTO_V_H
+#       define setgrent() setgrent_r(&PL_reentrant_buffer->_grent_fptr)
+#   endif
+#endif /* HAS_SETGRENT_R */
+
+#ifdef HAS_SETHOSTENT_R
+#   undef sethostent
+#   if !defined(sethostent) && SETHOSTENT_R_PROTO == REENTRANT_PROTO_I_ID
+#       define sethostent(a) (sethostent_r(a, &PL_reentrant_buffer->_hostent_data) == 0 ? 1 : 0)
+#   endif
+#   if !defined(sethostent) && SETHOSTENT_R_PROTO == REENTRANT_PROTO_V_ID
+#       define sethostent(a) sethostent_r(a, &PL_reentrant_buffer->_hostent_data)
+#   endif
+#endif /* HAS_SETHOSTENT_R */
+
+#ifdef HAS_SETLOCALE_R
+#   undef setlocale
+#   if !defined(setlocale) && SETLOCALE_R_PROTO == REENTRANT_PROTO_I_ICBI
+#       define setlocale(a, b) (setlocale_r(a, b, PL_reentrant_buffer->_setlocale_buffer, PL_reentrant_buffer->_setlocale_size) == 0 ? PL_reentrant_buffer->_setlocale_buffer : 0)
+#   endif
+#endif /* HAS_SETLOCALE_R */
+
+#ifdef HAS_SETNETENT_R
+#   undef setnetent
+#   if !defined(setnetent) && SETNETENT_R_PROTO == REENTRANT_PROTO_I_ID
+#       define setnetent(a) (setnetent_r(a, &PL_reentrant_buffer->_netent_data) == 0 ? 1 : 0)
+#   endif
+#   if !defined(setnetent) && SETNETENT_R_PROTO == REENTRANT_PROTO_V_ID
+#       define setnetent(a) setnetent_r(a, &PL_reentrant_buffer->_netent_data)
+#   endif
+#endif /* HAS_SETNETENT_R */
+
+#ifdef HAS_SETPROTOENT_R
+#   undef setprotoent
+#   if !defined(setprotoent) && SETPROTOENT_R_PROTO == REENTRANT_PROTO_I_ID
+#       define setprotoent(a) (setprotoent_r(a, &PL_reentrant_buffer->_protoent_data) == 0 ? 1 : 0)
+#   endif
+#   if !defined(setprotoent) && SETPROTOENT_R_PROTO == REENTRANT_PROTO_V_ID
+#       define setprotoent(a) setprotoent_r(a, &PL_reentrant_buffer->_protoent_data)
+#   endif
+#endif /* HAS_SETPROTOENT_R */
+
+#ifdef HAS_SETPWENT_R
+#   undef setpwent
+#   if !defined(setpwent) && SETPWENT_R_PROTO == REENTRANT_PROTO_I_H
+#       define setpwent() (setpwent_r(&PL_reentrant_buffer->_pwent_fptr) == 0 ? 1 : 0)
+#   endif
+#   if !defined(setpwent) && SETPWENT_R_PROTO == REENTRANT_PROTO_V_H
+#       define setpwent() setpwent_r(&PL_reentrant_buffer->_pwent_fptr)
+#   endif
+#endif /* HAS_SETPWENT_R */
+
+#ifdef HAS_SETSERVENT_R
+#   undef setservent
+#   if !defined(setservent) && SETSERVENT_R_PROTO == REENTRANT_PROTO_I_ID
+#       define setservent(a) (setservent_r(a, &PL_reentrant_buffer->_servent_data) == 0 ? 1 : 0)
+#   endif
+#   if !defined(setservent) && SETSERVENT_R_PROTO == REENTRANT_PROTO_V_ID
+#       define setservent(a) setservent_r(a, &PL_reentrant_buffer->_servent_data)
+#   endif
+#endif /* HAS_SETSERVENT_R */
+
+#ifdef HAS_SRAND48_R
+#   undef srand48
+#   if !defined(srand48) && SRAND48_R_PROTO == REENTRANT_PROTO_I_LS
+#       define srand48(a) (srand48_r(a, &PL_reentrant_buffer->_drand48_struct) == 0 ? &PL_reentrant_buffer->_drand48_struct : 0)
+#   endif
+#endif /* HAS_SRAND48_R */
+
+#ifdef HAS_SRANDOM_R
+#   undef srandom
+#   if !defined(srandom) && SRANDOM_R_PROTO == REENTRANT_PROTO_I_TS
+#       define srandom(a) (srandom_r(a, &PL_reentrant_buffer->_srandom_struct) == 0 ? &PL_reentrant_buffer->_srandom_struct : 0)
+#   endif
+#endif /* HAS_SRANDOM_R */
+
+#ifdef HAS_STRERROR_R
+#   undef strerror
+#   if !defined(strerror) && STRERROR_R_PROTO == REENTRANT_PROTO_I_IBW
+#       define strerror(a) (strerror_r(a, PL_reentrant_buffer->_strerror_buffer, PL_reentrant_buffer->_strerror_size) == 0 ? PL_reentrant_buffer->_strerror_buffer : 0)
+#   endif
+#   if !defined(strerror) && STRERROR_R_PROTO == REENTRANT_PROTO_I_IBI
+#       define strerror(a) (strerror_r(a, PL_reentrant_buffer->_strerror_buffer, PL_reentrant_buffer->_strerror_size) == 0 ? PL_reentrant_buffer->_strerror_buffer : 0)
+#   endif
+#   if !defined(strerror) && STRERROR_R_PROTO == REENTRANT_PROTO_B_IBW
+#       define strerror(a) strerror_r(a, PL_reentrant_buffer->_strerror_buffer, PL_reentrant_buffer->_strerror_size)
+#   endif
+#endif /* HAS_STRERROR_R */
+
+#ifdef HAS_TMPNAM_R
+#   undef tmpnam
+#   if !defined(tmpnam) && TMPNAM_R_PROTO == REENTRANT_PROTO_B_B
+#       define tmpnam(a) tmpnam_r(a)
+#   endif
+#endif /* HAS_TMPNAM_R */
+
+#ifdef HAS_TTYNAME_R
+#   undef ttyname
+#   if !defined(ttyname) && TTYNAME_R_PROTO == REENTRANT_PROTO_I_IBW
+#       define ttyname(a) (ttyname_r(a, PL_reentrant_buffer->_ttyname_buffer, PL_reentrant_buffer->_ttyname_size) == 0 ? PL_reentrant_buffer->_ttyname_buffer : 0)
+#   endif
+#   if !defined(ttyname) && TTYNAME_R_PROTO == REENTRANT_PROTO_I_IBI
+#       define ttyname(a) (ttyname_r(a, PL_reentrant_buffer->_ttyname_buffer, PL_reentrant_buffer->_ttyname_size) == 0 ? PL_reentrant_buffer->_ttyname_buffer : 0)
+#   endif
+#   if !defined(ttyname) && TTYNAME_R_PROTO == REENTRANT_PROTO_B_IBI
+#       define ttyname(a) ttyname_r(a, PL_reentrant_buffer->_ttyname_buffer, PL_reentrant_buffer->_ttyname_size)
+#   endif
+#endif /* HAS_TTYNAME_R */
+
+
+
+#endif /* USE_REENTRANT_API */
+ 
+#endif
+
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/regcomp.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/regcomp.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/regcomp.h	(revision 14489)
@@ -0,0 +1,398 @@
+/*    regcomp.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2005 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+typedef OP OP_4tree;			/* Will be redefined later. */
+
+/*
+ * The "internal use only" fields in regexp.h are present to pass info from
+ * compile to execute that permits the execute phase to run lots faster on
+ * simple cases.  They are:
+ *
+ * regstart	sv that must begin a match; Nullch if none obvious
+ * reganch	is the match anchored (at beginning-of-line only)?
+ * regmust	string (pointer into program) that match must include, or NULL
+ *  [regmust changed to SV* for bminstr()--law]
+ * regmlen	length of regmust string
+ *  [regmlen not used currently]
+ *
+ * Regstart and reganch permit very fast decisions on suitable starting points
+ * for a match, cutting down the work a lot.  Regmust permits fast rejection
+ * of lines that cannot possibly match.  The regmust tests are costly enough
+ * that pregcomp() supplies a regmust only if the r.e. contains something
+ * potentially expensive (at present, the only such thing detected is * or +
+ * at the start of the r.e., which can involve a lot of backup).  Regmlen is
+ * supplied because the test in pregexec() needs it and pregcomp() is computing
+ * it anyway.
+ * [regmust is now supplied always.  The tests that use regmust have a
+ * heuristic that disables the test if it usually matches.]
+ *
+ * [In fact, we now use regmust in many cases to locate where the search
+ * starts in the string, so if regback is >= 0, the regmust search is never
+ * wasted effort.  The regback variable says how many characters back from
+ * where regmust matched is the earliest possible start of the match.
+ * For instance, /[a-z].foo/ has a regmust of 'foo' and a regback of 2.]
+ */
+
+/*
+ * Structure for regexp "program".  This is essentially a linear encoding
+ * of a nondeterministic finite-state machine (aka syntax charts or
+ * "railroad normal form" in parsing technology).  Each node is an opcode
+ * plus a "next" pointer, possibly plus an operand.  "Next" pointers of
+ * all nodes except BRANCH implement concatenation; a "next" pointer with
+ * a BRANCH on both ends of it is connecting two alternatives.  (Here we
+ * have one of the subtle syntax dependencies:  an individual BRANCH (as
+ * opposed to a collection of them) is never concatenated with anything
+ * because of operator precedence.)  The operand of some types of node is
+ * a literal string; for others, it is a node leading into a sub-FSM.  In
+ * particular, the operand of a BRANCH node is the first node of the branch.
+ * (NB this is *not* a tree structure:  the tail of the branch connects
+ * to the thing following the set of BRANCHes.)  The opcodes are:
+ */
+
+/*
+ * A node is one char of opcode followed by two chars of "next" pointer.
+ * "Next" pointers are stored as two 8-bit pieces, high order first.  The
+ * value is a positive offset from the opcode of the node containing it.
+ * An operand, if any, simply follows the node.  (Note that much of the
+ * code generation knows about this implicit relationship.)
+ *
+ * Using two bytes for the "next" pointer is vast overkill for most things,
+ * but allows patterns to get big without disasters.
+ *
+ * [The "next" pointer is always aligned on an even
+ * boundary, and reads the offset directly as a short.  Also, there is no
+ * special test to reverse the sign of BACK pointers since the offset is
+ * stored negative.]
+ */
+
+struct regnode_string {
+    U8	str_len;
+    U8  type;
+    U16 next_off;
+    char string[1];
+};
+
+struct regnode_1 {
+    U8	flags;
+    U8  type;
+    U16 next_off;
+    U32 arg1;
+};
+
+struct regnode_2 {
+    U8	flags;
+    U8  type;
+    U16 next_off;
+    U16 arg1;
+    U16 arg2;
+};
+
+#define ANYOF_BITMAP_SIZE	32	/* 256 b/(8 b/B) */
+#define ANYOF_CLASSBITMAP_SIZE	 4	/* up to 32 (8*4) named classes */
+
+struct regnode_charclass {
+    U8	flags;
+    U8  type;
+    U16 next_off;
+    U32 arg1;
+    char bitmap[ANYOF_BITMAP_SIZE];	/* only compile-time */
+};
+
+struct regnode_charclass_class {	/* has [[:blah:]] classes */
+    U8	flags;				/* should have ANYOF_CLASS here */
+    U8  type;
+    U16 next_off;
+    U32 arg1;
+    char bitmap[ANYOF_BITMAP_SIZE];		/* both compile-time */
+    char classflags[ANYOF_CLASSBITMAP_SIZE];	/* and run-time */
+};
+
+/* XXX fix this description.
+   Impose a limit of REG_INFTY on various pattern matching operations
+   to limit stack growth and to avoid "infinite" recursions.
+*/
+/* The default size for REG_INFTY is I16_MAX, which is the same as
+   SHORT_MAX (see perl.h).  Unfortunately I16 isn't necessarily 16 bits
+   (see handy.h).  On the Cray C90, sizeof(short)==4 and hence I16_MAX is
+   ((1<<31)-1), while on the Cray T90, sizeof(short)==8 and I16_MAX is
+   ((1<<63)-1).  To limit stack growth to reasonable sizes, supply a
+   smaller default.
+	--Andy Dougherty  11 June 1998
+*/
+#if SHORTSIZE > 2
+#  ifndef REG_INFTY
+#    define REG_INFTY ((1<<15)-1)
+#  endif
+#endif
+
+#ifndef REG_INFTY
+#  define REG_INFTY I16_MAX
+#endif
+
+#define ARG_VALUE(arg) (arg)
+#define ARG__SET(arg,val) ((arg) = (val))
+
+#undef ARG
+#undef ARG1
+#undef ARG2
+
+#define ARG(p) ARG_VALUE(ARG_LOC(p))
+#define ARG1(p) ARG_VALUE(ARG1_LOC(p))
+#define ARG2(p) ARG_VALUE(ARG2_LOC(p))
+#define ARG_SET(p, val) ARG__SET(ARG_LOC(p), (val))
+#define ARG1_SET(p, val) ARG__SET(ARG1_LOC(p), (val))
+#define ARG2_SET(p, val) ARG__SET(ARG2_LOC(p), (val))
+
+#undef NEXT_OFF
+#undef NODE_ALIGN
+
+#define NEXT_OFF(p) ((p)->next_off)
+#define NODE_ALIGN(node)
+#define NODE_ALIGN_FILL(node) ((node)->flags = 0xde) /* deadbeef */
+
+#define SIZE_ALIGN NODE_ALIGN
+
+#undef OP
+#undef OPERAND
+#undef MASK
+#undef STRING
+
+#define	OP(p)		((p)->type)
+#define	OPERAND(p)	(((struct regnode_string *)p)->string)
+#define MASK(p)		((char*)OPERAND(p))
+#define	STR_LEN(p)	(((struct regnode_string *)p)->str_len)
+#define	STRING(p)	(((struct regnode_string *)p)->string)
+#define STR_SZ(l)	((l + sizeof(regnode) - 1) / sizeof(regnode))
+#define NODE_SZ_STR(p)	(STR_SZ(STR_LEN(p))+1)
+
+#undef NODE_ALIGN
+#undef ARG_LOC
+#undef NEXTOPER
+#undef PREVOPER
+
+#define	NODE_ALIGN(node)
+#define	ARG_LOC(p)	(((struct regnode_1 *)p)->arg1)
+#define	ARG1_LOC(p)	(((struct regnode_2 *)p)->arg1)
+#define	ARG2_LOC(p)	(((struct regnode_2 *)p)->arg2)
+#define NODE_STEP_REGNODE	1	/* sizeof(regnode)/sizeof(regnode) */
+#define EXTRA_STEP_2ARGS	EXTRA_SIZE(struct regnode_2)
+
+#define NODE_STEP_B	4
+
+#define	NEXTOPER(p)	((p) + NODE_STEP_REGNODE)
+#define	PREVOPER(p)	((p) - NODE_STEP_REGNODE)
+
+#define FILL_ADVANCE_NODE(ptr, op) STMT_START { \
+    (ptr)->type = op;    (ptr)->next_off = 0;   (ptr)++; } STMT_END
+#define FILL_ADVANCE_NODE_ARG(ptr, op, arg) STMT_START { \
+    ARG_SET(ptr, arg);  FILL_ADVANCE_NODE(ptr, op); (ptr) += 1; } STMT_END
+
+#define REG_MAGIC 0234
+
+#define SIZE_ONLY (RExC_emit == &PL_regdummy)
+
+/* Flags for node->flags of ANYOF */
+
+#define ANYOF_CLASS		0x08	/* has [[:blah:]] classes */
+#define ANYOF_INVERT		0x04
+#define ANYOF_FOLD		0x02
+#define ANYOF_LOCALE		0x01
+
+/* Used for regstclass only */
+#define ANYOF_EOS		0x10		/* Can match an empty string too */
+
+/* There is a character or a range past 0xff */
+#define ANYOF_UNICODE		0x20
+#define ANYOF_UNICODE_ALL	0x40	/* Can match any char past 0xff */
+
+/* size of node is large (includes class pointer) */
+#define ANYOF_LARGE 		0x80
+
+/* Are there any runtime flags on in this node? */
+#define ANYOF_RUNTIME(s)	(ANYOF_FLAGS(s) & 0x0f)
+
+#define ANYOF_FLAGS_ALL		0xff
+
+/* Character classes for node->classflags of ANYOF */
+/* Should be synchronized with a table in regprop() */
+/* 2n should pair with 2n+1 */
+
+#define ANYOF_ALNUM	 0	/* \w, PL_utf8_alnum, utf8::IsWord, ALNUM */
+#define ANYOF_NALNUM	 1
+#define ANYOF_SPACE	 2	/* \s */
+#define ANYOF_NSPACE	 3
+#define ANYOF_DIGIT	 4
+#define ANYOF_NDIGIT	 5
+#define ANYOF_ALNUMC	 6	/* isalnum(3), utf8::IsAlnum, ALNUMC */
+#define ANYOF_NALNUMC	 7
+#define ANYOF_ALPHA	 8
+#define ANYOF_NALPHA	 9
+#define ANYOF_ASCII	10
+#define ANYOF_NASCII	11
+#define ANYOF_CNTRL	12
+#define ANYOF_NCNTRL	13
+#define ANYOF_GRAPH	14
+#define ANYOF_NGRAPH	15
+#define ANYOF_LOWER	16
+#define ANYOF_NLOWER	17
+#define ANYOF_PRINT	18
+#define ANYOF_NPRINT	19
+#define ANYOF_PUNCT	20
+#define ANYOF_NPUNCT	21
+#define ANYOF_UPPER	22
+#define ANYOF_NUPPER	23
+#define ANYOF_XDIGIT	24
+#define ANYOF_NXDIGIT	25
+#define ANYOF_PSXSPC	26	/* POSIX space: \s plus the vertical tab */
+#define ANYOF_NPSXSPC	27
+#define ANYOF_BLANK	28	/* GNU extension: space and tab: non-vertical space */
+#define ANYOF_NBLANK	29
+
+#define ANYOF_MAX	32
+
+/* Backward source code compatibility. */
+
+#define ANYOF_ALNUML	 ANYOF_ALNUM
+#define ANYOF_NALNUML	 ANYOF_NALNUM
+#define ANYOF_SPACEL	 ANYOF_SPACE
+#define ANYOF_NSPACEL	 ANYOF_NSPACE
+
+/* Utility macros for the bitmap and classes of ANYOF */
+
+#define ANYOF_SIZE		(sizeof(struct regnode_charclass))
+#define ANYOF_CLASS_SIZE	(sizeof(struct regnode_charclass_class))
+
+#define ANYOF_FLAGS(p)		((p)->flags)
+
+#define ANYOF_BIT(c)		(1 << ((c) & 7))
+
+#define ANYOF_CLASS_BYTE(p, c)	(((struct regnode_charclass_class*)(p))->classflags[((c) >> 3) & 3])
+#define ANYOF_CLASS_SET(p, c)	(ANYOF_CLASS_BYTE(p, c) |=  ANYOF_BIT(c))
+#define ANYOF_CLASS_CLEAR(p, c)	(ANYOF_CLASS_BYTE(p, c) &= ~ANYOF_BIT(c))
+#define ANYOF_CLASS_TEST(p, c)	(ANYOF_CLASS_BYTE(p, c) &   ANYOF_BIT(c))
+
+#define ANYOF_CLASS_ZERO(ret)	Zero(((struct regnode_charclass_class*)(ret))->classflags, ANYOF_CLASSBITMAP_SIZE, char)
+#define ANYOF_BITMAP_ZERO(ret)	Zero(((struct regnode_charclass*)(ret))->bitmap, ANYOF_BITMAP_SIZE, char)
+
+#define ANYOF_BITMAP(p)		(((struct regnode_charclass*)(p))->bitmap)
+#define ANYOF_BITMAP_BYTE(p, c)	(ANYOF_BITMAP(p)[((c) >> 3) & 31])
+#define ANYOF_BITMAP_SET(p, c)	(ANYOF_BITMAP_BYTE(p, c) |=  ANYOF_BIT(c))
+#define ANYOF_BITMAP_CLEAR(p,c)	(ANYOF_BITMAP_BYTE(p, c) &= ~ANYOF_BIT(c))
+#define ANYOF_BITMAP_TEST(p, c)	(ANYOF_BITMAP_BYTE(p, c) &   ANYOF_BIT(c))
+
+#define ANYOF_BITMAP_SETALL(p)		\
+	memset (ANYOF_BITMAP(p), 255, ANYOF_BITMAP_SIZE)
+#define ANYOF_BITMAP_CLEARALL(p)	\
+	Zero (ANYOF_BITMAP(p), ANYOF_BITMAP_SIZE)
+/* Check that all 256 bits are all set.  Used in S_cl_is_anything()  */
+#define ANYOF_BITMAP_TESTALLSET(p)	\
+	memEQ (ANYOF_BITMAP(p), "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377", ANYOF_BITMAP_SIZE)
+
+#define ANYOF_SKIP		((ANYOF_SIZE - 1)/sizeof(regnode))
+#define ANYOF_CLASS_SKIP	((ANYOF_CLASS_SIZE - 1)/sizeof(regnode))
+#define ANYOF_CLASS_ADD_SKIP	(ANYOF_CLASS_SKIP - ANYOF_SKIP)
+
+/*
+ * Utility definitions.
+ */
+#ifndef CHARMASK
+#  define UCHARAT(p)	((int)*(const U8*)(p))
+#else
+#  define UCHARAT(p)	((int)*(p)&CHARMASK)
+#endif
+
+#define EXTRA_SIZE(guy) ((sizeof(guy)-1)/sizeof(struct regnode))
+
+#define REG_SEEN_ZERO_LEN	 1
+#define REG_SEEN_LOOKBEHIND	 2
+#define REG_SEEN_GPOS		 4
+#define REG_SEEN_EVAL		 8
+#define REG_SEEN_CANY		16
+#define REG_SEEN_SANY		REG_SEEN_CANY /* src bckwrd cmpt */
+
+START_EXTERN_C
+
+#include "regnodes.h"
+
+/* The following have no fixed length. U8 so we can do strchr() on it. */
+#ifndef DOINIT
+EXTCONST U8 PL_varies[];
+#else
+EXTCONST U8 PL_varies[] = {
+    BRANCH, BACK, STAR, PLUS, CURLY, CURLYX, REF, REFF, REFFL, 
+    WHILEM, CURLYM, CURLYN, BRANCHJ, IFTHEN, SUSPEND, CLUMP, 0
+};
+#endif
+
+/* The following always have a length of 1. U8 we can do strchr() on it. */
+/* (Note that length 1 means "one character" under UTF8, not "one octet".) */
+#ifndef DOINIT
+EXTCONST U8 PL_simple[];
+#else
+EXTCONST U8 PL_simple[] = {
+    REG_ANY,	SANY,	CANY,
+    ANYOF,
+    ALNUM,	ALNUML,
+    NALNUM,	NALNUML,
+    SPACE,	SPACEL,
+    NSPACE,	NSPACEL,
+    DIGIT,	NDIGIT,
+    0
+};
+#endif
+
+END_EXTERN_C
+
+typedef struct re_scream_pos_data_s
+{
+    char **scream_olds;		/* match pos */
+    I32 *scream_pos;		/* Internal iterator of scream. */
+} re_scream_pos_data;
+
+/* .what is a character array with one character for each member of .data
+ * The character describes the function of the corresponding .data item:
+ *   f - start-class data for regstclass optimization  
+ *   n - Root of op tree for (?{EVAL}) item
+ *   o - Start op for (?{EVAL}) item
+ *   p - Pad for (?{EVAL} item
+ *   s - swash for unicode-style character class, and the multicharacter
+ *       strings resulting from casefolding the single-character entries
+ *       in the character class
+ * 20010712 mjd@plover.com
+ * (Remember to update re_dup() and pregfree() if you add any items.)
+ */
+struct reg_data {
+    U32 count;
+    U8 *what;
+    void* data[1];
+};
+
+struct reg_substr_datum {
+    I32 min_offset;
+    I32 max_offset;
+    SV *substr;		/* non-utf8 variant */
+    SV *utf8_substr;	/* utf8 variant */
+};
+
+struct reg_substr_data {
+    struct reg_substr_datum data[3];	/* Actual array */
+};
+
+#define anchored_substr substrs->data[0].substr
+#define anchored_utf8 substrs->data[0].utf8_substr
+#define anchored_offset substrs->data[0].min_offset
+#define float_substr substrs->data[1].substr
+#define float_utf8 substrs->data[1].utf8_substr
+#define float_min_offset substrs->data[1].min_offset
+#define float_max_offset substrs->data[1].max_offset
+#define check_substr substrs->data[2].substr
+#define check_utf8 substrs->data[2].utf8_substr
+#define check_offset_min substrs->data[2].min_offset
+#define check_offset_max substrs->data[2].max_offset
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/regexp.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/regexp.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/regexp.h	(revision 14489)
@@ -0,0 +1,129 @@
+/*    regexp.h
+ *
+ *    Copyright (C) 1993, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
+ *    by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * Definitions etc. for regexp(3) routines.
+ *
+ * Caveat:  this is V8 regexp(3) [actually, a reimplementation thereof],
+ * not the System V one.
+ */
+
+
+struct regnode {
+    U8	flags;
+    U8  type;
+    U16 next_off;
+};
+
+typedef struct regnode regnode;
+
+struct reg_substr_data;
+
+struct reg_data;
+
+typedef struct regexp {
+	I32 *startp;
+	I32 *endp;
+	regnode *regstclass;
+        struct reg_substr_data *substrs;
+	char *precomp;		/* pre-compilation regular expression */
+        struct reg_data *data;	/* Additional data. */
+	char *subbeg;		/* saved or original string 
+				   so \digit works forever. */
+        U32 *offsets;           /* offset annotations 20001228 MJD */
+	I32 sublen;		/* Length of string pointed by subbeg */
+	I32 refcnt;
+	I32 minlen;		/* mininum possible length of $& */
+	I32 prelen;		/* length of precomp */
+	U32 nparens;		/* number of parentheses */
+	U32 lastparen;		/* last paren matched */
+	U32 lastcloseparen;	/* last paren matched */
+	U32 reganch;		/* Internal use only +
+				   Tainted information used by regexec? */
+	regnode program[1];	/* Unwarranted chumminess with compiler. */
+} regexp;
+
+#define ROPT_ANCH		(ROPT_ANCH_BOL|ROPT_ANCH_MBOL|ROPT_ANCH_GPOS|ROPT_ANCH_SBOL)
+#define ROPT_ANCH_SINGLE	(ROPT_ANCH_SBOL|ROPT_ANCH_GPOS)
+#define ROPT_ANCH_BOL	 	0x00001
+#define ROPT_ANCH_MBOL	 	0x00002
+#define ROPT_ANCH_SBOL	 	0x00004
+#define ROPT_ANCH_GPOS	 	0x00008
+#define ROPT_SKIP		0x00010
+#define ROPT_IMPLICIT		0x00020	/* Converted .* to ^.* */
+#define ROPT_NOSCAN		0x00040	/* Check-string always at start. */
+#define ROPT_GPOS_SEEN		0x00080
+#define ROPT_CHECK_ALL		0x00100
+#define ROPT_LOOKBEHIND_SEEN	0x00200
+#define ROPT_EVAL_SEEN		0x00400
+#define ROPT_CANY_SEEN		0x00800
+#define ROPT_SANY_SEEN		ROPT_CANY_SEEN /* src bckwrd cmpt */
+
+/* 0xf800 of reganch is used by PMf_COMPILETIME */
+
+#define ROPT_UTF8		0x10000
+#define ROPT_NAUGHTY		0x20000 /* how exponential is this pattern? */
+#define ROPT_COPY_DONE		0x40000	/* subbeg is a copy of the string */
+#define ROPT_TAINTED_SEEN	0x80000
+#define ROPT_MATCH_UTF8		0x10000000 /* subbeg is utf-8 */
+
+#define RE_USE_INTUIT_NOML	0x0100000 /* Best to intuit before matching */
+#define RE_USE_INTUIT_ML	0x0200000
+#define REINT_AUTORITATIVE_NOML	0x0400000 /* Can trust a positive answer */
+#define REINT_AUTORITATIVE_ML	0x0800000 
+#define REINT_ONCE_NOML		0x1000000 /* Intuit can succed once only. */
+#define REINT_ONCE_ML		0x2000000
+#define RE_INTUIT_ONECHAR	0x4000000
+#define RE_INTUIT_TAIL		0x8000000
+
+#define RE_USE_INTUIT		(RE_USE_INTUIT_NOML|RE_USE_INTUIT_ML)
+#define REINT_AUTORITATIVE	(REINT_AUTORITATIVE_NOML|REINT_AUTORITATIVE_ML)
+#define REINT_ONCE		(REINT_ONCE_NOML|REINT_ONCE_ML)
+
+#define RX_MATCH_TAINTED(prog)	((prog)->reganch & ROPT_TAINTED_SEEN)
+#define RX_MATCH_TAINTED_on(prog) ((prog)->reganch |= ROPT_TAINTED_SEEN)
+#define RX_MATCH_TAINTED_off(prog) ((prog)->reganch &= ~ROPT_TAINTED_SEEN)
+#define RX_MATCH_TAINTED_set(prog, t) ((t) \
+				       ? RX_MATCH_TAINTED_on(prog) \
+				       : RX_MATCH_TAINTED_off(prog))
+
+#define RX_MATCH_COPIED(prog)		((prog)->reganch & ROPT_COPY_DONE)
+#define RX_MATCH_COPIED_on(prog)	((prog)->reganch |= ROPT_COPY_DONE)
+#define RX_MATCH_COPIED_off(prog)	((prog)->reganch &= ~ROPT_COPY_DONE)
+#define RX_MATCH_COPIED_set(prog,t)	((t) \
+					 ? RX_MATCH_COPIED_on(prog) \
+					 : RX_MATCH_COPIED_off(prog))
+
+#define RX_MATCH_UTF8(prog)		((prog)->reganch & ROPT_MATCH_UTF8)
+#define RX_MATCH_UTF8_on(prog)		((prog)->reganch |= ROPT_MATCH_UTF8)
+#define RX_MATCH_UTF8_off(prog)		((prog)->reganch &= ~ROPT_MATCH_UTF8)
+#define RX_MATCH_UTF8_set(prog, t)	((t) \
+			? (RX_MATCH_UTF8_on(prog), (PL_reg_match_utf8 = 1)) \
+			: (RX_MATCH_UTF8_off(prog), (PL_reg_match_utf8 = 0)))
+    
+#define REXEC_COPY_STR	0x01		/* Need to copy the string. */
+#define REXEC_CHECKED	0x02		/* check_substr already checked. */
+#define REXEC_SCREAM	0x04		/* use scream table. */
+#define REXEC_IGNOREPOS	0x08		/* \G matches at start. */
+#define REXEC_NOT_FIRST	0x10		/* This is another iteration of //g. */
+#define REXEC_ML	0x20		/* $* was set. */
+
+#define ReREFCNT_inc(re) ((void)(re && re->refcnt++), re)
+#define ReREFCNT_dec(re) CALLREGFREE(aTHX_ re)
+
+#define FBMcf_TAIL_DOLLAR	1
+#define FBMcf_TAIL_DOLLARM	2
+#define FBMcf_TAIL_Z		4
+#define FBMcf_TAIL_z		8
+#define FBMcf_TAIL		(FBMcf_TAIL_DOLLAR|FBMcf_TAIL_DOLLARM|FBMcf_TAIL_Z|FBMcf_TAIL_z)
+
+#define FBMrf_MULTILINE	1
+
+struct re_scream_pos_data_s;
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/regnodes.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/regnodes.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/regnodes.h	(revision 14489)
@@ -0,0 +1,342 @@
+/* -*- buffer-read-only: t -*-
+   !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+   This file is built by regcomp.pl from regcomp.sym.
+   Any changes made here will be lost!
+*/
+
+#define	END	0	/*    0 End of program. */
+#define	SUCCEED	1	/*  0x1 Return from a subroutine, basically. */
+#define	BOL	2	/*  0x2 Match "" at beginning of line. */
+#define	MBOL	3	/*  0x3 Same, assuming multiline. */
+#define	SBOL	4	/*  0x4 Same, assuming singleline. */
+#define	EOS	5	/*  0x5 Match "" at end of string. */
+#define	EOL	6	/*  0x6 Match "" at end of line. */
+#define	MEOL	7	/*  0x7 Same, assuming multiline. */
+#define	SEOL	8	/*  0x8 Same, assuming singleline. */
+#define	BOUND	9	/*  0x9 Match "" at any word boundary */
+#define	BOUNDL	10	/*  0xa Match "" at any word boundary */
+#define	NBOUND	11	/*  0xb Match "" at any word non-boundary */
+#define	NBOUNDL	12	/*  0xc Match "" at any word non-boundary */
+#define	GPOS	13	/*  0xd Matches where last m//g left off. */
+#define	REG_ANY	14	/*  0xe Match any one character (except newline). */
+#define	SANY	15	/*  0xf Match any one character. */
+#define	CANY	16	/* 0x10 Match any one byte. */
+#define	ANYOF	17	/* 0x11 Match character in (or not in) this class. */
+#define	ALNUM	18	/* 0x12 Match any alphanumeric character */
+#define	ALNUML	19	/* 0x13 Match any alphanumeric char in locale */
+#define	NALNUM	20	/* 0x14 Match any non-alphanumeric character */
+#define	NALNUML	21	/* 0x15 Match any non-alphanumeric char in locale */
+#define	SPACE	22	/* 0x16 Match any whitespace character */
+#define	SPACEL	23	/* 0x17 Match any whitespace char in locale */
+#define	NSPACE	24	/* 0x18 Match any non-whitespace character */
+#define	NSPACEL	25	/* 0x19 Match any non-whitespace char in locale */
+#define	DIGIT	26	/* 0x1a Match any numeric character */
+#define	DIGITL	27	/* 0x1b Match any numeric character in locale */
+#define	NDIGIT	28	/* 0x1c Match any non-numeric character */
+#define	NDIGITL	29	/* 0x1d Match any non-numeric character in locale */
+#define	CLUMP	30	/* 0x1e Match any combining character sequence */
+#define	BRANCH	31	/* 0x1f Match this alternative, or the next... */
+#define	BACK	32	/* 0x20 Match "", "next" ptr points backward. */
+#define	EXACT	33	/* 0x21 Match this string (preceded by length). */
+#define	EXACTF	34	/* 0x22 Match this string, folded (prec. by length). */
+#define	EXACTFL	35	/* 0x23 Match this string, folded in locale (w/len). */
+#define	NOTHING	36	/* 0x24 Match empty string. */
+#define	TAIL	37	/* 0x25 Match empty string. Can jump here from outside. */
+#define	STAR	38	/* 0x26 Match this (simple) thing 0 or more times. */
+#define	PLUS	39	/* 0x27 Match this (simple) thing 1 or more times. */
+#define	CURLY	40	/* 0x28 Match this simple thing {n,m} times. */
+#define	CURLYN	41	/* 0x29 Match next-after-this simple thing  */
+#define	CURLYM	42	/* 0x2a Match this medium-complex thing {n,m} times. */
+#define	CURLYX	43	/* 0x2b Match this complex thing {n,m} times. */
+#define	WHILEM	44	/* 0x2c Do curly processing and see if rest matches. */
+#define	OPEN	45	/* 0x2d Mark this point in input as start of #n. */
+#define	CLOSE	46	/* 0x2e Analogous to OPEN. */
+#define	REF	47	/* 0x2f Match some already matched string */
+#define	REFF	48	/* 0x30 Match already matched string, folded */
+#define	REFFL	49	/* 0x31 Match already matched string, folded in loc. */
+#define	IFMATCH	50	/* 0x32 Succeeds if the following matches. */
+#define	UNLESSM	51	/* 0x33 Fails if the following matches. */
+#define	SUSPEND	52	/* 0x34 "Independent" sub-RE. */
+#define	IFTHEN	53	/* 0x35 Switch, should be preceeded by switcher . */
+#define	GROUPP	54	/* 0x36 Whether the group matched. */
+#define	LONGJMP	55	/* 0x37 Jump far away. */
+#define	BRANCHJ	56	/* 0x38 BRANCH with long offset. */
+#define	EVAL	57	/* 0x39 Execute some Perl code. */
+#define	MINMOD	58	/* 0x3a Next operator is not greedy. */
+#define	LOGICAL	59	/* 0x3b Next opcode should set the flag only. */
+#define	RENUM	60	/* 0x3c Group with independently numbered parens. */
+#define	OPTIMIZED	61	/* 0x3d Placeholder for dump. */
+
+#ifndef DOINIT
+EXTCONST U8 PL_regkind[];
+#else
+EXTCONST U8 PL_regkind[] = {
+	END,		/* END */
+	END,		/* SUCCEED */
+	BOL,		/* BOL */
+	BOL,		/* MBOL */
+	BOL,		/* SBOL */
+	EOL,		/* EOS */
+	EOL,		/* EOL */
+	EOL,		/* MEOL */
+	EOL,		/* SEOL */
+	BOUND,		/* BOUND */
+	BOUND,		/* BOUNDL */
+	NBOUND,		/* NBOUND */
+	NBOUND,		/* NBOUNDL */
+	GPOS,		/* GPOS */
+	REG_ANY,		/* REG_ANY */
+	REG_ANY,		/* SANY */
+	REG_ANY,		/* CANY */
+	ANYOF,		/* ANYOF */
+	ALNUM,		/* ALNUM */
+	ALNUM,		/* ALNUML */
+	NALNUM,		/* NALNUM */
+	NALNUM,		/* NALNUML */
+	SPACE,		/* SPACE */
+	SPACE,		/* SPACEL */
+	NSPACE,		/* NSPACE */
+	NSPACE,		/* NSPACEL */
+	DIGIT,		/* DIGIT */
+	DIGIT,		/* DIGITL */
+	NDIGIT,		/* NDIGIT */
+	NDIGIT,		/* NDIGITL */
+	CLUMP,		/* CLUMP */
+	BRANCH,		/* BRANCH */
+	BACK,		/* BACK */
+	EXACT,		/* EXACT */
+	EXACT,		/* EXACTF */
+	EXACT,		/* EXACTFL */
+	NOTHING,		/* NOTHING */
+	NOTHING,		/* TAIL */
+	STAR,		/* STAR */
+	PLUS,		/* PLUS */
+	CURLY,		/* CURLY */
+	CURLY,		/* CURLYN */
+	CURLY,		/* CURLYM */
+	CURLY,		/* CURLYX */
+	WHILEM,		/* WHILEM */
+	OPEN,		/* OPEN */
+	CLOSE,		/* CLOSE */
+	REF,		/* REF */
+	REF,		/* REFF */
+	REF,		/* REFFL */
+	BRANCHJ,		/* IFMATCH */
+	BRANCHJ,		/* UNLESSM */
+	BRANCHJ,		/* SUSPEND */
+	BRANCHJ,		/* IFTHEN */
+	GROUPP,		/* GROUPP */
+	LONGJMP,		/* LONGJMP */
+	BRANCHJ,		/* BRANCHJ */
+	EVAL,		/* EVAL */
+	MINMOD,		/* MINMOD */
+	LOGICAL,		/* LOGICAL */
+	BRANCHJ,		/* RENUM */
+	NOTHING,		/* OPTIMIZED */
+};
+#endif
+
+
+#ifdef REG_COMP_C
+static const U8 regarglen[] = {
+	0,		/* END */
+	0,		/* SUCCEED */
+	0,		/* BOL */
+	0,		/* MBOL */
+	0,		/* SBOL */
+	0,		/* EOS */
+	0,		/* EOL */
+	0,		/* MEOL */
+	0,		/* SEOL */
+	0,		/* BOUND */
+	0,		/* BOUNDL */
+	0,		/* NBOUND */
+	0,		/* NBOUNDL */
+	0,		/* GPOS */
+	0,		/* REG_ANY */
+	0,		/* SANY */
+	0,		/* CANY */
+	0,		/* ANYOF */
+	0,		/* ALNUM */
+	0,		/* ALNUML */
+	0,		/* NALNUM */
+	0,		/* NALNUML */
+	0,		/* SPACE */
+	0,		/* SPACEL */
+	0,		/* NSPACE */
+	0,		/* NSPACEL */
+	0,		/* DIGIT */
+	0,		/* DIGITL */
+	0,		/* NDIGIT */
+	0,		/* NDIGITL */
+	0,		/* CLUMP */
+	0,		/* BRANCH */
+	0,		/* BACK */
+	0,		/* EXACT */
+	0,		/* EXACTF */
+	0,		/* EXACTFL */
+	0,		/* NOTHING */
+	0,		/* TAIL */
+	0,		/* STAR */
+	0,		/* PLUS */
+	EXTRA_SIZE(struct regnode_2),		/* CURLY */
+	EXTRA_SIZE(struct regnode_2),		/* CURLYN */
+	EXTRA_SIZE(struct regnode_2),		/* CURLYM */
+	EXTRA_SIZE(struct regnode_2),		/* CURLYX */
+	0,		/* WHILEM */
+	EXTRA_SIZE(struct regnode_1),		/* OPEN */
+	EXTRA_SIZE(struct regnode_1),		/* CLOSE */
+	EXTRA_SIZE(struct regnode_1),		/* REF */
+	EXTRA_SIZE(struct regnode_1),		/* REFF */
+	EXTRA_SIZE(struct regnode_1),		/* REFFL */
+	EXTRA_SIZE(struct regnode_1),		/* IFMATCH */
+	EXTRA_SIZE(struct regnode_1),		/* UNLESSM */
+	EXTRA_SIZE(struct regnode_1),		/* SUSPEND */
+	EXTRA_SIZE(struct regnode_1),		/* IFTHEN */
+	EXTRA_SIZE(struct regnode_1),		/* GROUPP */
+	EXTRA_SIZE(struct regnode_1),		/* LONGJMP */
+	EXTRA_SIZE(struct regnode_1),		/* BRANCHJ */
+	EXTRA_SIZE(struct regnode_1),		/* EVAL */
+	0,		/* MINMOD */
+	0,		/* LOGICAL */
+	EXTRA_SIZE(struct regnode_1),		/* RENUM */
+	0,		/* OPTIMIZED */
+};
+
+static const char reg_off_by_arg[] = {
+	0,		/* END */
+	0,		/* SUCCEED */
+	0,		/* BOL */
+	0,		/* MBOL */
+	0,		/* SBOL */
+	0,		/* EOS */
+	0,		/* EOL */
+	0,		/* MEOL */
+	0,		/* SEOL */
+	0,		/* BOUND */
+	0,		/* BOUNDL */
+	0,		/* NBOUND */
+	0,		/* NBOUNDL */
+	0,		/* GPOS */
+	0,		/* REG_ANY */
+	0,		/* SANY */
+	0,		/* CANY */
+	0,		/* ANYOF */
+	0,		/* ALNUM */
+	0,		/* ALNUML */
+	0,		/* NALNUM */
+	0,		/* NALNUML */
+	0,		/* SPACE */
+	0,		/* SPACEL */
+	0,		/* NSPACE */
+	0,		/* NSPACEL */
+	0,		/* DIGIT */
+	0,		/* DIGITL */
+	0,		/* NDIGIT */
+	0,		/* NDIGITL */
+	0,		/* CLUMP */
+	0,		/* BRANCH */
+	0,		/* BACK */
+	0,		/* EXACT */
+	0,		/* EXACTF */
+	0,		/* EXACTFL */
+	0,		/* NOTHING */
+	0,		/* TAIL */
+	0,		/* STAR */
+	0,		/* PLUS */
+	0,		/* CURLY */
+	0,		/* CURLYN */
+	0,		/* CURLYM */
+	0,		/* CURLYX */
+	0,		/* WHILEM */
+	0,		/* OPEN */
+	0,		/* CLOSE */
+	0,		/* REF */
+	0,		/* REFF */
+	0,		/* REFFL */
+	2,		/* IFMATCH */
+	2,		/* UNLESSM */
+	1,		/* SUSPEND */
+	1,		/* IFTHEN */
+	0,		/* GROUPP */
+	1,		/* LONGJMP */
+	1,		/* BRANCHJ */
+	0,		/* EVAL */
+	0,		/* MINMOD */
+	0,		/* LOGICAL */
+	1,		/* RENUM */
+	0,		/* OPTIMIZED */
+};
+
+#ifdef DEBUGGING
+static const char * const reg_name[] = {
+	"END",		/*    0 */
+	"SUCCEED",		/*  0x1 */
+	"BOL",		/*  0x2 */
+	"MBOL",		/*  0x3 */
+	"SBOL",		/*  0x4 */
+	"EOS",		/*  0x5 */
+	"EOL",		/*  0x6 */
+	"MEOL",		/*  0x7 */
+	"SEOL",		/*  0x8 */
+	"BOUND",		/*  0x9 */
+	"BOUNDL",		/*  0xa */
+	"NBOUND",		/*  0xb */
+	"NBOUNDL",		/*  0xc */
+	"GPOS",		/*  0xd */
+	"REG_ANY",		/*  0xe */
+	"SANY",		/*  0xf */
+	"CANY",		/* 0x10 */
+	"ANYOF",		/* 0x11 */
+	"ALNUM",		/* 0x12 */
+	"ALNUML",		/* 0x13 */
+	"NALNUM",		/* 0x14 */
+	"NALNUML",		/* 0x15 */
+	"SPACE",		/* 0x16 */
+	"SPACEL",		/* 0x17 */
+	"NSPACE",		/* 0x18 */
+	"NSPACEL",		/* 0x19 */
+	"DIGIT",		/* 0x1a */
+	"DIGITL",		/* 0x1b */
+	"NDIGIT",		/* 0x1c */
+	"NDIGITL",		/* 0x1d */
+	"CLUMP",		/* 0x1e */
+	"BRANCH",		/* 0x1f */
+	"BACK",		/* 0x20 */
+	"EXACT",		/* 0x21 */
+	"EXACTF",		/* 0x22 */
+	"EXACTFL",		/* 0x23 */
+	"NOTHING",		/* 0x24 */
+	"TAIL",		/* 0x25 */
+	"STAR",		/* 0x26 */
+	"PLUS",		/* 0x27 */
+	"CURLY",		/* 0x28 */
+	"CURLYN",		/* 0x29 */
+	"CURLYM",		/* 0x2a */
+	"CURLYX",		/* 0x2b */
+	"WHILEM",		/* 0x2c */
+	"OPEN",		/* 0x2d */
+	"CLOSE",		/* 0x2e */
+	"REF",		/* 0x2f */
+	"REFF",		/* 0x30 */
+	"REFFL",		/* 0x31 */
+	"IFMATCH",		/* 0x32 */
+	"UNLESSM",		/* 0x33 */
+	"SUSPEND",		/* 0x34 */
+	"IFTHEN",		/* 0x35 */
+	"GROUPP",		/* 0x36 */
+	"LONGJMP",		/* 0x37 */
+	"BRANCHJ",		/* 0x38 */
+	"EVAL",		/* 0x39 */
+	"MINMOD",		/* 0x3a */
+	"LOGICAL",		/* 0x3b */
+	"RENUM",		/* 0x3c */
+	"OPTIMIZED",		/* 0x3d */
+};
+
+static const int reg_num = 62;
+
+#endif /* DEBUGGING */
+#endif /* REG_COMP_C */
+
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/scope.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/scope.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/scope.h	(revision 14489)
@@ -0,0 +1,411 @@
+/*    scope.h
+ *
+ *    Copyright (C) 1993, 1994, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2004, 2005 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#define SAVEt_ITEM		0
+#define SAVEt_SV		1
+#define SAVEt_AV		2
+#define SAVEt_HV		3
+#define SAVEt_INT		4
+#define SAVEt_LONG		5
+#define SAVEt_I32		6
+#define SAVEt_IV		7
+#define SAVEt_SPTR		8
+#define SAVEt_APTR		9
+#define SAVEt_HPTR		10
+#define SAVEt_PPTR		11
+#define SAVEt_NSTAB		12
+#define SAVEt_SVREF		13
+#define SAVEt_GP		14
+#define SAVEt_FREESV		15
+#define SAVEt_FREEOP		16
+#define SAVEt_FREEPV		17
+#define SAVEt_CLEARSV		18
+#define SAVEt_DELETE		19
+#define SAVEt_DESTRUCTOR	20
+#define SAVEt_REGCONTEXT	21
+#define SAVEt_STACK_POS		22
+#define SAVEt_I16		23
+#define SAVEt_AELEM		24
+#define SAVEt_HELEM		25
+#define SAVEt_OP		26
+#define SAVEt_HINTS		27
+#define SAVEt_ALLOC		28
+#define SAVEt_GENERIC_SVREF	29
+#define SAVEt_DESTRUCTOR_X	30
+#define SAVEt_VPTR		31
+#define SAVEt_I8		32
+#define SAVEt_COMPPAD		33
+#define SAVEt_GENERIC_PVREF	34
+#define SAVEt_PADSV		35
+#define SAVEt_MORTALIZESV	36
+#define SAVEt_SHARED_PVREF	37
+#define SAVEt_BOOL		38
+#define SAVEt_SAVESWITCHSTACK	40
+
+#ifndef SCOPE_SAVES_SIGNAL_MASK
+#define SCOPE_SAVES_SIGNAL_MASK 0
+#endif
+
+#define SSCHECK(need) if (PL_savestack_ix + (need) > PL_savestack_max) savestack_grow()
+#define SSGROW(need) if (PL_savestack_ix + (need) > PL_savestack_max) savestack_grow_cnt(need)
+#define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i))
+#define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i))
+#define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p))
+#define SSPUSHIV(i) (PL_savestack[PL_savestack_ix++].any_iv = (IV)(i))
+#define SSPUSHPTR(p) (PL_savestack[PL_savestack_ix++].any_ptr = (void*)(p))
+#define SSPUSHDPTR(p) (PL_savestack[PL_savestack_ix++].any_dptr = (p))
+#define SSPUSHDXPTR(p) (PL_savestack[PL_savestack_ix++].any_dxptr = (p))
+#define SSPOPINT (PL_savestack[--PL_savestack_ix].any_i32)
+#define SSPOPLONG (PL_savestack[--PL_savestack_ix].any_long)
+#define SSPOPBOOL (PL_savestack[--PL_savestack_ix].any_bool)
+#define SSPOPIV (PL_savestack[--PL_savestack_ix].any_iv)
+#define SSPOPPTR (PL_savestack[--PL_savestack_ix].any_ptr)
+#define SSPOPDPTR (PL_savestack[--PL_savestack_ix].any_dptr)
+#define SSPOPDXPTR (PL_savestack[--PL_savestack_ix].any_dxptr)
+
+/*
+=head1 Callback Functions
+
+=for apidoc Ams||SAVETMPS
+Opening bracket for temporaries on a callback.  See C<FREETMPS> and
+L<perlcall>.
+
+=for apidoc Ams||FREETMPS
+Closing bracket for temporaries on a callback.  See C<SAVETMPS> and
+L<perlcall>.
+
+=for apidoc Ams||ENTER
+Opening bracket on a callback.  See C<LEAVE> and L<perlcall>.
+
+=for apidoc Ams||LEAVE
+Closing bracket on a callback.  See C<ENTER> and L<perlcall>.
+
+=cut
+*/
+
+#define SAVETMPS save_int((int*)&PL_tmps_floor), PL_tmps_floor = PL_tmps_ix
+#define FREETMPS if (PL_tmps_ix > PL_tmps_floor) free_tmps()
+
+#ifdef DEBUGGING
+#define ENTER							\
+    STMT_START {						\
+	push_scope();						\
+	DEBUG_SCOPE("ENTER")					\
+    } STMT_END
+#define LEAVE							\
+    STMT_START {						\
+	DEBUG_SCOPE("LEAVE")					\
+	pop_scope();						\
+    } STMT_END
+#else
+#define ENTER push_scope()
+#define LEAVE pop_scope()
+#endif
+#define LEAVE_SCOPE(old) if (PL_savestack_ix > old) leave_scope(old)
+
+/*
+ * Not using SOFT_CAST on SAVESPTR, SAVEGENERICSV and SAVEFREESV
+ * because these are used for several kinds of pointer values
+ */
+#define SAVEI8(i)	save_I8(SOFT_CAST(I8*)&(i))
+#define SAVEI16(i)	save_I16(SOFT_CAST(I16*)&(i))
+#define SAVEI32(i)	save_I32(SOFT_CAST(I32*)&(i))
+#define SAVEINT(i)	save_int(SOFT_CAST(int*)&(i))
+#define SAVEIV(i)	save_iv(SOFT_CAST(IV*)&(i))
+#define SAVELONG(l)	save_long(SOFT_CAST(long*)&(l))
+#define SAVEBOOL(b)	save_bool(SOFT_CAST(bool*)&(b))
+#define SAVESPTR(s)	save_sptr((SV**)&(s))
+#define SAVEPPTR(s)	save_pptr(SOFT_CAST(char**)&(s))
+#define SAVEVPTR(s)	save_vptr((void*)&(s))
+#define SAVEPADSV(s)	save_padsv(s)
+#define SAVEFREESV(s)	save_freesv((SV*)(s))
+#define SAVEMORTALIZESV(s)	save_mortalizesv((SV*)(s))
+#define SAVEFREEOP(o)	save_freeop(SOFT_CAST(OP*)(o))
+#define SAVEFREEPV(p)	save_freepv(SOFT_CAST(char*)(p))
+#define SAVECLEARSV(sv)	save_clearsv(SOFT_CAST(SV**)&(sv))
+#define SAVEGENERICSV(s)	save_generic_svref((SV**)&(s))
+#define SAVEGENERICPV(s)	save_generic_pvref((char**)&(s))
+#define SAVESHAREDPV(s)		save_shared_pvref((char**)&(s))
+#define SAVEDELETE(h,k,l) \
+	  save_delete(SOFT_CAST(HV*)(h), SOFT_CAST(char*)(k), (I32)(l))
+#define SAVEDESTRUCTOR(f,p) \
+	  save_destructor((DESTRUCTORFUNC_NOCONTEXT_t)(f), SOFT_CAST(void*)(p))
+
+#define SAVEDESTRUCTOR_X(f,p) \
+	  save_destructor_x((DESTRUCTORFUNC_t)(f), SOFT_CAST(void*)(p))
+
+#define SAVESTACK_POS() \
+    STMT_START {				\
+	SSCHECK(2);				\
+	SSPUSHINT(PL_stack_sp - PL_stack_base);	\
+	SSPUSHINT(SAVEt_STACK_POS);		\
+    } STMT_END
+
+#define SAVEOP()	save_op()
+
+#define SAVEHINTS() \
+    STMT_START {					\
+	SSCHECK(3);					\
+	if (PL_hints & HINT_LOCALIZE_HH) {		\
+	    SSPUSHPTR(GvHV(PL_hintgv));			\
+	    GvHV(PL_hintgv) = newHVhv(GvHV(PL_hintgv));	\
+	}						\
+	SSPUSHINT(PL_hints);				\
+	SSPUSHINT(SAVEt_HINTS);				\
+    } STMT_END
+
+#define SAVECOMPPAD() \
+    STMT_START {						\
+	SSCHECK(2);						\
+	SSPUSHPTR((SV*)PL_comppad);				\
+	SSPUSHINT(SAVEt_COMPPAD);				\
+    } STMT_END
+
+#define SAVESWITCHSTACK(f,t) \
+    STMT_START {					\
+	SSCHECK(3);					\
+	SSPUSHPTR((SV*)(f));				\
+	SSPUSHPTR((SV*)(t));				\
+	SSPUSHINT(SAVEt_SAVESWITCHSTACK);		\
+	SWITCHSTACK((f),(t));				\
+	PL_curstackinfo->si_stack = (t);		\
+    } STMT_END
+
+#ifdef USE_ITHREADS
+#  define SAVECOPSTASH(c)	SAVEPPTR(CopSTASHPV(c))
+#  define SAVECOPSTASH_FREE(c)	SAVESHAREDPV(CopSTASHPV(c))
+#  define SAVECOPFILE(c)	SAVEPPTR(CopFILE(c))
+#  define SAVECOPFILE_FREE(c)	SAVESHAREDPV(CopFILE(c))
+#else
+#  define SAVECOPSTASH(c)	SAVESPTR(CopSTASH(c))
+#  define SAVECOPSTASH_FREE(c)	SAVECOPSTASH(c)	/* XXX not refcounted */
+#  define SAVECOPFILE(c)	SAVESPTR(CopFILEGV(c))
+#  define SAVECOPFILE_FREE(c)	SAVEGENERICSV(CopFILEGV(c))
+#endif
+
+#define SAVECOPLINE(c)		SAVEI32(CopLINE(c))
+
+/* SSNEW() temporarily allocates a specified number of bytes of data on the
+ * savestack.  It returns an integer index into the savestack, because a
+ * pointer would get broken if the savestack is moved on reallocation.
+ * SSNEWa() works like SSNEW(), but also aligns the data to the specified
+ * number of bytes.  MEM_ALIGNBYTES is perhaps the most useful.  The
+ * alignment will be preserved therough savestack reallocation *only* if
+ * realloc returns data aligned to a size divisible by "align"!
+ *
+ * SSPTR() converts the index returned by SSNEW/SSNEWa() into a pointer.
+ */
+
+#define SSNEW(size)             Perl_save_alloc(aTHX_ (size), 0)
+#define SSNEWt(n,t)             SSNEW((n)*sizeof(t))
+#define SSNEWa(size,align)	Perl_save_alloc(aTHX_ (size), \
+    (align - ((int)((caddr_t)&PL_savestack[PL_savestack_ix]) % align)) % align)
+#define SSNEWat(n,t,align)	SSNEWa((n)*sizeof(t), align)
+
+#define SSPTR(off,type)         ((type)  ((char*)PL_savestack + off))
+#define SSPTRt(off,type)        ((type*) ((char*)PL_savestack + off))
+
+/* A jmpenv packages the state required to perform a proper non-local jump.
+ * Note that there is a start_env initialized when perl starts, and top_env
+ * points to this initially, so top_env should always be non-null.
+ *
+ * Existence of a non-null top_env->je_prev implies it is valid to call
+ * longjmp() at that runlevel (we make sure start_env.je_prev is always
+ * null to ensure this).
+ *
+ * je_mustcatch, when set at any runlevel to TRUE, means eval ops must
+ * establish a local jmpenv to handle exception traps.  Care must be taken
+ * to restore the previous value of je_mustcatch before exiting the
+ * stack frame iff JMPENV_PUSH was not called in that stack frame.
+ * GSAR 97-03-27
+ */
+
+struct jmpenv {
+    struct jmpenv *	je_prev;
+    Sigjmp_buf		je_buf;		/* only for use if !je_throw */
+    int			je_ret;		/* last exception thrown */
+    bool		je_mustcatch;	/* need to call longjmp()? */
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+    void		(*je_throw)(int v); /* last for bincompat */
+    bool		je_noset;	/* no need for setjmp() */
+#endif
+};
+
+typedef struct jmpenv JMPENV;
+
+#ifdef OP_IN_REGISTER
+#define OP_REG_TO_MEM	PL_opsave = op
+#define OP_MEM_TO_REG	op = PL_opsave
+#else
+#define OP_REG_TO_MEM	NOOP
+#define OP_MEM_TO_REG	NOOP
+#endif
+
+/*
+ * How to build the first jmpenv.
+ *
+ * top_env needs to be non-zero. It points to an area
+ * in which longjmp() stuff is stored, as C callstack
+ * info there at least is thread specific this has to
+ * be per-thread. Otherwise a 'die' in a thread gives
+ * that thread the C stack of last thread to do an eval {}!
+ */
+
+#define JMPENV_BOOTSTRAP \
+    STMT_START {				\
+	Zero(&PL_start_env, 1, JMPENV);		\
+	PL_start_env.je_ret = -1;		\
+	PL_start_env.je_mustcatch = TRUE;	\
+	PL_top_env = &PL_start_env;		\
+    } STMT_END
+
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+
+/*
+ * These exception-handling macros are split up to
+ * ease integration with C++ exceptions.
+ *
+ * To use C++ try+catch to catch Perl exceptions, an extension author
+ * needs to first write an extern "C" function to throw an appropriate
+ * exception object; typically it will be or contain an integer,
+ * because Perl's internals use integers to track exception types:
+ *    extern "C" { static void thrower(int i) { throw i; } }
+ *
+ * Then (as shown below) the author needs to use, not the simple
+ * JMPENV_PUSH, but several of its constitutent macros, to arrange for
+ * the Perl internals to call thrower() rather than longjmp() to
+ * report exceptions:
+ *
+ *    dJMPENV;
+ *    JMPENV_PUSH_INIT(thrower);
+ *    try {
+ *        ... stuff that may throw exceptions ...
+ *    }
+ *    catch (int why) {  // or whatever matches thrower()
+ *        JMPENV_POST_CATCH;
+ *        EXCEPT_SET(why);
+ *        switch (why) {
+ *          ... // handle various Perl exception codes
+ *        }
+ *    }
+ *    JMPENV_POP;  // don't forget this!
+ */
+
+/*
+ * Function that catches/throws, and its callback for the
+ *  body of protected processing.
+ */
+typedef void *(CPERLscope(*protect_body_t)) (pTHX_ va_list);
+typedef void *(CPERLscope(*protect_proc_t)) (pTHX_ volatile JMPENV *pcur_env,
+					     int *, protect_body_t, ...);
+
+#define dJMPENV	JMPENV cur_env;	\
+		volatile JMPENV *pcur_env = ((cur_env.je_noset = 0),&cur_env)
+
+#define JMPENV_PUSH_INIT_ENV(ce,THROWFUNC) \
+    STMT_START {					\
+	(ce).je_throw = (THROWFUNC);			\
+	(ce).je_ret = -1;				\
+	(ce).je_mustcatch = FALSE;			\
+	(ce).je_prev = PL_top_env;			\
+	PL_top_env = &(ce);				\
+	OP_REG_TO_MEM;					\
+    } STMT_END
+
+#define JMPENV_PUSH_INIT(THROWFUNC) JMPENV_PUSH_INIT_ENV(*(JMPENV*)pcur_env,THROWFUNC)
+
+#define JMPENV_POST_CATCH_ENV(ce) \
+    STMT_START {					\
+	OP_MEM_TO_REG;					\
+	PL_top_env = &(ce);				\
+    } STMT_END
+
+#define JMPENV_POST_CATCH JMPENV_POST_CATCH_ENV(*(JMPENV*)pcur_env)
+
+#define JMPENV_PUSH_ENV(ce,v) \
+    STMT_START {						\
+	if (!(ce).je_noset) {					\
+	    DEBUG_l(Perl_deb(aTHX_ "Setting up jumplevel %p, was %p\n",	\
+			     ce, PL_top_env));			\
+	    JMPENV_PUSH_INIT_ENV(ce,NULL);			\
+	    EXCEPT_SET_ENV(ce,PerlProc_setjmp((ce).je_buf, SCOPE_SAVES_SIGNAL_MASK));\
+	    (ce).je_noset = 1;					\
+	}							\
+	else							\
+	    EXCEPT_SET_ENV(ce,0);				\
+	JMPENV_POST_CATCH_ENV(ce);				\
+	(v) = EXCEPT_GET_ENV(ce);				\
+    } STMT_END
+
+#define JMPENV_PUSH(v) JMPENV_PUSH_ENV(*(JMPENV*)pcur_env,v)
+
+#define JMPENV_POP_ENV(ce) \
+    STMT_START {						\
+	if (PL_top_env == &(ce))				\
+	    PL_top_env = (ce).je_prev;				\
+    } STMT_END
+
+#define JMPENV_POP  JMPENV_POP_ENV(*(JMPENV*)pcur_env)
+
+#define JMPENV_JUMP(v) \
+    STMT_START {						\
+	OP_REG_TO_MEM;						\
+	if (PL_top_env->je_prev) {				\
+	    if (PL_top_env->je_throw)				\
+		PL_top_env->je_throw(v);			\
+	    else						\
+		PerlProc_longjmp(PL_top_env->je_buf, (v));	\
+	}							\
+	if ((v) == 2)						\
+	    PerlProc_exit(STATUS_NATIVE_EXPORT);		\
+	PerlIO_printf(Perl_error_log, "panic: top_env\n");	\
+	PerlProc_exit(1);					\
+    } STMT_END
+
+#define EXCEPT_GET_ENV(ce)	((ce).je_ret)
+#define EXCEPT_GET		EXCEPT_GET_ENV(*(JMPENV*)pcur_env)
+#define EXCEPT_SET_ENV(ce,v)	((ce).je_ret = (v))
+#define EXCEPT_SET(v)		EXCEPT_SET_ENV(*(JMPENV*)pcur_env,v)
+
+#else /* !PERL_FLEXIBLE_EXCEPTIONS */
+
+#define dJMPENV		JMPENV cur_env
+
+#define JMPENV_PUSH(v) \
+    STMT_START {							\
+	DEBUG_l(Perl_deb(aTHX_ "Setting up jumplevel %p, was %p\n",	\
+			 &cur_env, PL_top_env));			\
+	cur_env.je_prev = PL_top_env;					\
+	OP_REG_TO_MEM;							\
+	cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, SCOPE_SAVES_SIGNAL_MASK);		\
+	OP_MEM_TO_REG;							\
+	PL_top_env = &cur_env;						\
+	cur_env.je_mustcatch = FALSE;					\
+	(v) = cur_env.je_ret;						\
+    } STMT_END
+
+#define JMPENV_POP \
+    STMT_START { PL_top_env = cur_env.je_prev; } STMT_END
+
+#define JMPENV_JUMP(v) \
+    STMT_START {						\
+	OP_REG_TO_MEM;						\
+	if (PL_top_env->je_prev)				\
+	    PerlProc_longjmp(PL_top_env->je_buf, (v));		\
+	if ((v) == 2)						\
+	    PerlProc_exit(STATUS_NATIVE_EXPORT);		\
+	PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");	\
+	PerlProc_exit(1);					\
+    } STMT_END
+
+#endif /* PERL_FLEXIBLE_EXCEPTIONS */
+
+#define CATCH_GET		(PL_top_env->je_mustcatch)
+#define CATCH_SET(v)		(PL_top_env->je_mustcatch = (v))
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/sv.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/sv.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/sv.h	(revision 14489)
@@ -0,0 +1,1389 @@
+/*    sv.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifdef sv_flags
+#undef sv_flags		/* Convex has this in <signal.h> for sigvec() */
+#endif
+
+/*
+=head1 SV Flags
+
+=for apidoc AmU||svtype
+An enum of flags for Perl types.  These are found in the file B<sv.h>
+in the C<svtype> enum.  Test these flags with the C<SvTYPE> macro.
+
+=for apidoc AmU||SVt_PV
+Pointer type flag for scalars.  See C<svtype>.
+
+=for apidoc AmU||SVt_IV
+Integer type flag for scalars.  See C<svtype>.
+
+=for apidoc AmU||SVt_NV
+Double type flag for scalars.  See C<svtype>.
+
+=for apidoc AmU||SVt_PVMG
+Type flag for blessed scalars.  See C<svtype>.
+
+=for apidoc AmU||SVt_PVAV
+Type flag for arrays.  See C<svtype>.
+
+=for apidoc AmU||SVt_PVHV
+Type flag for hashes.  See C<svtype>.
+
+=for apidoc AmU||SVt_PVCV
+Type flag for code refs.  See C<svtype>.
+
+=cut
+*/
+
+typedef enum {
+	SVt_NULL,	/* 0 */
+	SVt_IV,		/* 1 */
+	SVt_NV,		/* 2 */
+	SVt_RV,		/* 3 */
+	SVt_PV,		/* 4 */
+	SVt_PVIV,	/* 5 */
+	SVt_PVNV,	/* 6 */
+	SVt_PVMG,	/* 7 */
+	SVt_PVBM,	/* 8 */
+	SVt_PVLV,	/* 9 */
+	SVt_PVAV,	/* 10 */
+	SVt_PVHV,	/* 11 */
+	SVt_PVCV,	/* 12 */
+	SVt_PVGV,	/* 13 */
+	SVt_PVFM,	/* 14 */
+	SVt_PVIO	/* 15 */
+} svtype;
+
+/* Using C's structural equivalence to help emulate C++ inheritance here... */
+
+struct STRUCT_SV {		/* struct sv { */
+    void*	sv_any;		/* pointer to something */
+    U32		sv_refcnt;	/* how many references to us */
+    U32		sv_flags;	/* what we are */
+};
+
+struct gv {
+    XPVGV*	sv_any;		/* pointer to something */
+    U32		sv_refcnt;	/* how many references to us */
+    U32		sv_flags;	/* what we are */
+};
+
+struct cv {
+    XPVCV*	sv_any;		/* pointer to something */
+    U32		sv_refcnt;	/* how many references to us */
+    U32		sv_flags;	/* what we are */
+};
+
+struct av {
+    XPVAV*	sv_any;		/* pointer to something */
+    U32		sv_refcnt;	/* how many references to us */
+    U32		sv_flags;	/* what we are */
+};
+
+struct hv {
+    XPVHV*	sv_any;		/* pointer to something */
+    U32		sv_refcnt;	/* how many references to us */
+    U32		sv_flags;	/* what we are */
+};
+
+struct io {
+    XPVIO*	sv_any;		/* pointer to something */
+    U32		sv_refcnt;	/* how many references to us */
+    U32		sv_flags;	/* what we are */
+};
+
+/*
+=head1 SV Manipulation Functions
+
+=for apidoc Am|U32|SvREFCNT|SV* sv
+Returns the value of the object's reference count.
+
+=for apidoc Am|SV*|SvREFCNT_inc|SV* sv
+Increments the reference count of the given SV.
+
+=for apidoc Am|void|SvREFCNT_dec|SV* sv
+Decrements the reference count of the given SV.
+
+=for apidoc Am|svtype|SvTYPE|SV* sv
+Returns the type of the SV.  See C<svtype>.
+
+=for apidoc Am|void|SvUPGRADE|SV* sv|svtype type
+Used to upgrade an SV to a more complex form.  Uses C<sv_upgrade> to
+perform the upgrade if necessary.  See C<svtype>.
+
+=cut
+*/
+
+#define SvANY(sv)	(sv)->sv_any
+#define SvFLAGS(sv)	(sv)->sv_flags
+#define SvREFCNT(sv)	(sv)->sv_refcnt
+
+#ifdef USE_5005THREADS
+
+#  if defined(VMS)
+#    define ATOMIC_INC(count) __ATOMIC_INCREMENT_LONG(&count)
+#    define ATOMIC_DEC_AND_TEST(res,count) res=(1==__ATOMIC_DECREMENT_LONG(&count))
+ #  else
+#    ifdef EMULATE_ATOMIC_REFCOUNTS
+ #      define ATOMIC_INC(count) STMT_START {	\
+	  MUTEX_LOCK(&PL_svref_mutex);		\
+	  ++count;				\
+	  MUTEX_UNLOCK(&PL_svref_mutex);		\
+       } STMT_END
+#      define ATOMIC_DEC_AND_TEST(res,count) STMT_START {	\
+	  MUTEX_LOCK(&PL_svref_mutex);			\
+	  res = (--count == 0);				\
+	  MUTEX_UNLOCK(&PL_svref_mutex);			\
+       } STMT_END
+#    else
+#      define ATOMIC_INC(count) atomic_inc(&count)
+#      define ATOMIC_DEC_AND_TEST(res,count) (res = atomic_dec_and_test(&count))
+#    endif /* EMULATE_ATOMIC_REFCOUNTS */
+#  endif /* VMS */
+#else
+#  define ATOMIC_INC(count) (++count)
+#  define ATOMIC_DEC_AND_TEST(res, count) (res = (--count == 0))
+#endif /* USE_5005THREADS */
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#  define SvREFCNT_inc(sv)		\
+    ({					\
+	SV * const _sv = (SV*)(sv);	\
+	if (_sv)			\
+	     ATOMIC_INC(SvREFCNT(_sv));	\
+	_sv;				\
+    })
+#else
+#  ifdef USE_5005THREADS
+#    if defined(VMS) && defined(__ALPHA)
+#      define SvREFCNT_inc(sv) \
+          (PL_Sv=(SV*)(sv), (PL_Sv && __ATOMIC_INCREMENT_LONG(&(SvREFCNT(PL_Sv)))), (SV *)PL_Sv)
+#    else
+#      define SvREFCNT_inc(sv) sv_newref((SV*)sv)
+#    endif
+#  else
+#    define SvREFCNT_inc(sv)	\
+	((PL_Sv=(SV*)(sv)), (PL_Sv && ATOMIC_INC(SvREFCNT(PL_Sv))), (SV*)PL_Sv)
+#  endif
+#endif
+
+#define SvREFCNT_dec(sv)	sv_free((SV*)(sv))
+
+#define SVTYPEMASK	0xff
+#define SvTYPE(sv)	((sv)->sv_flags & SVTYPEMASK)
+
+#define SvUPGRADE(sv, mt) (SvTYPE(sv) >= mt || sv_upgrade(sv, mt))
+
+#define SVs_PADBUSY	0x00000100	/* reserved for tmp or my already */
+#define SVs_PADTMP	0x00000200	/* in use as tmp */
+#define SVs_PADMY	0x00000400	/* in use a "my" variable */
+#define SVs_TEMP	0x00000800	/* string is stealable? */
+#define SVs_OBJECT	0x00001000	/* is "blessed" */
+#define SVs_GMG		0x00002000	/* has magical get method */
+#define SVs_SMG		0x00004000	/* has magical set method */
+#define SVs_RMG		0x00008000	/* has random magical methods */
+
+#define SVf_IOK		0x00010000	/* has valid public integer value */
+#define SVf_NOK		0x00020000	/* has valid public numeric value */
+#define SVf_POK		0x00040000	/* has valid public pointer value */
+#define SVf_ROK		0x00080000	/* has a valid reference pointer */
+
+#define SVf_FAKE	0x00100000	/* glob or lexical is just a copy */
+#define SVf_OOK		0x00200000	/* has valid offset value */
+#define SVf_BREAK	0x00400000	/* refcnt is artificially low - used
+					 * by SV's in final arena  cleanup */
+#define SVf_READONLY	0x00800000	/* may not be modified */
+
+
+#define SVp_IOK		0x01000000	/* has valid non-public integer value */
+#define SVp_NOK		0x02000000	/* has valid non-public numeric value */
+#define SVp_POK		0x04000000	/* has valid non-public pointer value */
+#define SVp_SCREAM	0x08000000	/* has been studied? */
+
+#define SVf_UTF8        0x20000000      /* SvPV is UTF-8 encoded */
+
+#define SVf_THINKFIRST	(SVf_READONLY|SVf_ROK|SVf_FAKE)
+
+#define SVf_OK		(SVf_IOK|SVf_NOK|SVf_POK|SVf_ROK| \
+			 SVp_IOK|SVp_NOK|SVp_POK)
+
+#define SVf_AMAGIC	0x10000000      /* has magical overloaded methods */
+
+#define PRIVSHIFT 8	/* (SVp_?OK >> PRIVSHIFT) == SVf_?OK */
+
+/* Some private flags. */
+
+/* SVpad_OUR may be set on SVt_PV{NV,MG,GV} types */
+#define SVpad_OUR	0x80000000	/* pad name is "our" instead of "my" */
+#define SVpad_TYPED	0x40000000	/* Typed Lexical */
+
+#define SVf_IVisUV	0x80000000	/* use XPVUV instead of XPVIV */
+
+#define SVpfm_COMPILED	0x80000000	/* FORMLINE is compiled */
+
+#define SVpbm_VALID	0x80000000
+#define SVpbm_TAIL	0x40000000
+
+#define SVrepl_EVAL	0x40000000	/* Replacement part of s///e */
+
+#define SVphv_CLONEABLE	0x08000000	/* for stashes: clone its objects */
+#define SVphv_REHASH	0x10000000	/* HV is recalculating hash values */
+#define SVphv_SHAREKEYS 0x20000000	/* keys live on shared string table */
+#define SVphv_LAZYDEL	0x40000000	/* entry in xhv_eiter must be deleted */
+#define SVphv_HASKFLAGS	0x80000000	/* keys have flag byte after hash */
+
+#define SVprv_WEAKREF   0x80000000      /* Weak reference */
+
+struct xrv {
+    SV *	xrv_rv;		/* pointer to another SV */
+};
+
+struct xpv {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+};
+
+struct xpviv {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    IV		xiv_iv;		/* integer value or pv offset */
+};
+
+struct xpvuv {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    UV		xuv_uv;		/* unsigned value or pv offset */
+};
+
+struct xpvnv {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    IV		xiv_iv;		/* integer value or pv offset */
+    NV    	xnv_nv;		/* numeric value, if any */
+};
+
+/* These structure must match the beginning of struct xpvhv in hv.h. */
+struct xpvmg {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    IV		xiv_iv;		/* integer value or pv offset */
+    NV    	xnv_nv;		/* numeric value, if any */
+    MAGIC*	xmg_magic;	/* linked list of magicalness */
+    HV*		xmg_stash;	/* class package */
+};
+
+struct xpvlv {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    IV		xiv_iv;		/* integer value or pv offset */
+    NV    	xnv_nv;		/* numeric value, if any */
+    MAGIC*	xmg_magic;	/* linked list of magicalness */
+    HV*		xmg_stash;	/* class package */
+
+    STRLEN	xlv_targoff;
+    STRLEN	xlv_targlen;
+    SV*		xlv_targ;
+    char	xlv_type;	/* k=keys .=pos x=substr v=vec /=join/re
+				 * y=alem/helem/iter t=tie T=tied HE */
+};
+
+struct xpvgv {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    IV		xiv_iv;		/* integer value or pv offset */
+    NV		xnv_nv;		/* numeric value, if any */
+    MAGIC*	xmg_magic;	/* linked list of magicalness */
+    HV*		xmg_stash;	/* class package */
+
+    GP*		xgv_gp;
+    char*	xgv_name;
+    STRLEN	xgv_namelen;
+    HV*		xgv_stash;
+    U8		xgv_flags;
+};
+
+struct xpvbm {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    IV		xiv_iv;		/* integer value or pv offset */
+    NV		xnv_nv;		/* numeric value, if any */
+    MAGIC*	xmg_magic;	/* linked list of magicalness */
+    HV*		xmg_stash;	/* class package */
+
+    I32		xbm_useful;	/* is this constant pattern being useful? */
+    U16		xbm_previous;	/* how many characters in string before rare? */
+    U8		xbm_rare;	/* rarest character in string */
+};
+
+/* This structure must match XPVCV in cv.h */
+
+typedef U16 cv_flags_t;
+
+struct xpvfm {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    IV		xiv_iv;		/* integer value or pv offset */
+    NV		xnv_nv;		/* numeric value, if any */
+    MAGIC*	xmg_magic;	/* linked list of magicalness */
+    HV*		xmg_stash;	/* class package */
+
+    HV *	xcv_stash;
+    OP *	xcv_start;
+    OP *	xcv_root;
+    void      (*xcv_xsub)(pTHX_ CV*);
+    ANY		xcv_xsubany;
+    GV *	xcv_gv;
+    char *	xcv_file;
+    long	xcv_depth;	/* >= 2 indicates recursive call */
+    AV *	xcv_padlist;
+    CV *	xcv_outside;
+#ifdef USE_5005THREADS
+    perl_mutex *xcv_mutexp;	/* protects xcv_owner */
+    struct perl_thread *xcv_owner;	/* current owner thread */
+#endif /* USE_5005THREADS */
+    cv_flags_t	xcv_flags;
+    U32		xcv_outside_seq; /* the COP sequence (at the point of our
+				  * compilation) in the lexically enclosing
+				  * sub */
+    IV		xfm_lines;
+};
+
+struct xpvio {
+    char *	xpv_pv;		/* pointer to malloced string */
+    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */
+    STRLEN	xpv_len;	/* allocated size */
+    IV		xiv_iv;		/* integer value or pv offset */
+    NV		xnv_nv;		/* numeric value, if any */
+    MAGIC*	xmg_magic;	/* linked list of magicalness */
+    HV*		xmg_stash;	/* class package */
+
+    PerlIO *	xio_ifp;	/* ifp and ofp are normally the same */
+    PerlIO *	xio_ofp;	/* but sockets need separate streams */
+    /* Cray addresses everything by word boundaries (64 bits) and
+     * code and data pointers cannot be mixed (which is exactly what
+     * Perl_filter_add() tries to do with the dirp), hence the following
+     * union trick (as suggested by Gurusamy Sarathy).
+     * For further information see Geir Johansen's problem report titled
+       [ID 20000612.002] Perl problem on Cray system
+     * The any pointer (known as IoANY()) will also be a good place
+     * to hang any IO disciplines to.
+     */
+    union {
+	DIR *	xiou_dirp;	/* for opendir, readdir, etc */
+	void *	xiou_any;	/* for alignment */
+    } xio_dirpu;
+    IV		xio_lines;	/* $. */
+    IV		xio_page;	/* $% */
+    IV		xio_page_len;	/* $= */
+    IV		xio_lines_left;	/* $- */
+    char *	xio_top_name;	/* $^ */
+    GV *	xio_top_gv;	/* $^ */
+    char *	xio_fmt_name;	/* $~ */
+    GV *	xio_fmt_gv;	/* $~ */
+    char *	xio_bottom_name;/* $^B */
+    GV *	xio_bottom_gv;	/* $^B */
+    short	xio_subprocess;	/* -| or |- */
+    char	xio_type;
+    char	xio_flags;
+};
+#define xio_dirp	xio_dirpu.xiou_dirp
+#define xio_any		xio_dirpu.xiou_any
+
+#define IOf_ARGV	1	/* this fp iterates over ARGV */
+#define IOf_START	2	/* check for null ARGV and substitute '-' */
+#define IOf_FLUSH	4	/* this fp wants a flush after write op */
+#define IOf_DIDTOP	8	/* just did top of form */
+#define IOf_UNTAINT	16	/* consider this fp (and its data) "safe" */
+#define IOf_NOLINE	32	/* slurped a pseudo-line from empty file */
+#define IOf_FAKE_DIRP	64	/* xio_dirp is fake (source filters kludge) */
+
+/* The following macros define implementation-independent predicates on SVs. */
+
+/*
+=for apidoc Am|bool|SvNIOK|SV* sv
+Returns a boolean indicating whether the SV contains a number, integer or
+double.
+
+=for apidoc Am|bool|SvNIOKp|SV* sv
+Returns a boolean indicating whether the SV contains a number, integer or
+double.  Checks the B<private> setting.  Use C<SvNIOK>.
+
+=for apidoc Am|void|SvNIOK_off|SV* sv
+Unsets the NV/IV status of an SV.
+
+=for apidoc Am|bool|SvOK|SV* sv
+Returns a boolean indicating whether the value is an SV. It also tells
+whether the value is defined or not.
+
+=for apidoc Am|bool|SvIOKp|SV* sv
+Returns a boolean indicating whether the SV contains an integer.  Checks
+the B<private> setting.  Use C<SvIOK>.
+
+=for apidoc Am|bool|SvNOKp|SV* sv
+Returns a boolean indicating whether the SV contains a double.  Checks the
+B<private> setting.  Use C<SvNOK>.
+
+=for apidoc Am|bool|SvPOKp|SV* sv
+Returns a boolean indicating whether the SV contains a character string.
+Checks the B<private> setting.  Use C<SvPOK>.
+
+=for apidoc Am|bool|SvIOK|SV* sv
+Returns a boolean indicating whether the SV contains an integer.
+
+=for apidoc Am|void|SvIOK_on|SV* sv
+Tells an SV that it is an integer.
+
+=for apidoc Am|void|SvIOK_off|SV* sv
+Unsets the IV status of an SV.
+
+=for apidoc Am|void|SvIOK_only|SV* sv
+Tells an SV that it is an integer and disables all other OK bits.
+
+=for apidoc Am|void|SvIOK_only_UV|SV* sv
+Tells and SV that it is an unsigned integer and disables all other OK bits.
+
+=for apidoc Am|bool|SvIOK_UV|SV* sv
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+=for apidoc Am|void|SvUOK|SV* sv
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+=for apidoc Am|bool|SvIOK_notUV|SV* sv
+Returns a boolean indicating whether the SV contains a signed integer.
+
+=for apidoc Am|bool|SvNOK|SV* sv
+Returns a boolean indicating whether the SV contains a double.
+
+=for apidoc Am|void|SvNOK_on|SV* sv
+Tells an SV that it is a double.
+
+=for apidoc Am|void|SvNOK_off|SV* sv
+Unsets the NV status of an SV.
+
+=for apidoc Am|void|SvNOK_only|SV* sv
+Tells an SV that it is a double and disables all other OK bits.
+
+=for apidoc Am|bool|SvPOK|SV* sv
+Returns a boolean indicating whether the SV contains a character
+string.
+
+=for apidoc Am|void|SvPOK_on|SV* sv
+Tells an SV that it is a string.
+
+=for apidoc Am|void|SvPOK_off|SV* sv
+Unsets the PV status of an SV.
+
+=for apidoc Am|void|SvPOK_only|SV* sv
+Tells an SV that it is a string and disables all other OK bits.
+Will also turn off the UTF-8 status.
+
+=for apidoc Am|bool|SvOOK|SV* sv
+Returns a boolean indicating whether the SvIVX is a valid offset value for
+the SvPVX.  This hack is used internally to speed up removal of characters
+from the beginning of a SvPV.  When SvOOK is true, then the start of the
+allocated string buffer is really (SvPVX - SvIVX).
+
+=for apidoc Am|bool|SvROK|SV* sv
+Tests if the SV is an RV.
+
+=for apidoc Am|void|SvROK_on|SV* sv
+Tells an SV that it is an RV.
+
+=for apidoc Am|void|SvROK_off|SV* sv
+Unsets the RV status of an SV.
+
+=for apidoc Am|SV*|SvRV|SV* sv
+Dereferences an RV to return the SV.
+
+=for apidoc Am|IV|SvIVX|SV* sv
+Returns the raw value in the SV's IV slot, without checks or conversions.
+Only use when you are sure SvIOK is true. See also C<SvIV()>.
+
+=for apidoc Am|UV|SvUVX|SV* sv
+Returns the raw value in the SV's UV slot, without checks or conversions.
+Only use when you are sure SvIOK is true. See also C<SvUV()>.
+
+=for apidoc Am|NV|SvNVX|SV* sv
+Returns the raw value in the SV's NV slot, without checks or conversions.
+Only use when you are sure SvNOK is true. See also C<SvNV()>.
+
+=for apidoc Am|char*|SvPVX|SV* sv
+Returns a pointer to the physical string in the SV.  The SV must contain a
+string.
+
+=for apidoc Am|STRLEN|SvCUR|SV* sv
+Returns the length of the string which is in the SV.  See C<SvLEN>.
+
+=for apidoc Am|STRLEN|SvLEN|SV* sv
+Returns the size of the string buffer in the SV, not including any part
+attributable to C<SvOOK>.  See C<SvCUR>.
+
+=for apidoc Am|char*|SvEND|SV* sv
+Returns a pointer to the last character in the string which is in the SV.
+See C<SvCUR>.  Access the character as *(SvEND(sv)).
+
+=for apidoc Am|HV*|SvSTASH|SV* sv
+Returns the stash of the SV.
+
+=for apidoc Am|void|SvIV_set|SV* sv|IV val
+Set the value of the IV pointer in sv to val.  It is possible to perform
+the same function of this macro with an lvalue assignment to C<SvIVX>.
+With future Perls, however, it will be more efficient to use 
+C<SvIV_set> instead of the lvalue assignment to C<SvIVX>.
+
+=for apidoc Am|void|SvNV_set|SV* sv|NV val
+Set the value of the NV pointer in sv to val.  See C<SvIV_set>.
+
+=for apidoc Am|void|SvPV_set|SV* sv|char* val
+Set the value of the PV pointer in sv to val.  See C<SvIV_set>.
+
+=for apidoc Am|void|SvUV_set|SV* sv|UV val
+Set the value of the UV pointer in sv to val.  See C<SvIV_set>.
+
+=for apidoc Am|void|SvRV_set|SV* sv|SV* val
+Set the value of the RV pointer in sv to val.  See C<SvIV_set>.
+
+=for apidoc Am|void|SvMAGIC_set|SV* sv|MAGIC* val
+Set the value of the MAGIC pointer in sv to val.  See C<SvIV_set>.
+
+=for apidoc Am|void|SvSTASH_set|SV* sv|STASH* val
+Set the value of the STASH pointer in sv to val.  See C<SvIV_set>.
+
+=for apidoc Am|void|SvCUR_set|SV* sv|STRLEN len
+Set the current length of the string which is in the SV.  See C<SvCUR>
+and C<SvIV_set>.
+
+=for apidoc Am|void|SvLEN_set|SV* sv|STRLEN len
+Set the actual length of the string which is in the SV.  See C<SvIV_set>.
+
+=cut
+*/
+
+#define SvNIOK(sv)		(SvFLAGS(sv) & (SVf_IOK|SVf_NOK))
+#define SvNIOKp(sv)		(SvFLAGS(sv) & (SVp_IOK|SVp_NOK))
+#define SvNIOK_off(sv)		(SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK| \
+						  SVp_IOK|SVp_NOK|SVf_IVisUV))
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#define assert_not_ROK(sv)	({assert(!SvROK(sv) || !SvRV(sv));}),
+#else
+#define assert_not_ROK(sv)	
+#endif
+
+#define SvOK(sv)		(SvFLAGS(sv) & SVf_OK)
+#define SvOK_off(sv)		(assert_not_ROK(sv)			\
+				 SvFLAGS(sv) &=	~(SVf_OK|SVf_AMAGIC|	\
+						  SVf_IVisUV|SVf_UTF8),	\
+							SvOOK_off(sv))
+#define SvOK_off_exc_UV(sv)	(assert_not_ROK(sv)			\
+				 SvFLAGS(sv) &=	~(SVf_OK|SVf_AMAGIC|	\
+						  SVf_UTF8),		\
+							SvOOK_off(sv))
+
+#define SvOKp(sv)		(SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK))
+#define SvIOKp(sv)		(SvFLAGS(sv) & SVp_IOK)
+#define SvIOKp_on(sv)		((void)SvOOK_off(sv), SvFLAGS(sv) |= SVp_IOK)
+#define SvNOKp(sv)		(SvFLAGS(sv) & SVp_NOK)
+#define SvNOKp_on(sv)		(SvFLAGS(sv) |= SVp_NOK)
+#define SvPOKp(sv)		(SvFLAGS(sv) & SVp_POK)
+#define SvPOKp_on(sv)		(assert_not_ROK(sv)			\
+				 SvFLAGS(sv) |= SVp_POK)
+
+#define SvIOK(sv)		(SvFLAGS(sv) & SVf_IOK)
+#define SvIOK_on(sv)		((void)SvOOK_off(sv), \
+				    SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
+#define SvIOK_off(sv)		(SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK|SVf_IVisUV))
+#define SvIOK_only(sv)		(SvOK_off(sv), \
+				    SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
+#define SvIOK_only_UV(sv)	(SvOK_off_exc_UV(sv), \
+				    SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
+
+#define SvIOK_UV(sv)		((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV))	\
+				 == (SVf_IOK|SVf_IVisUV))
+#define SvUOK(sv)		SvIOK_UV(sv)
+#define SvIOK_notUV(sv)		((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV))	\
+				 == SVf_IOK)
+
+#define SvVOK(sv)		(SvMAGICAL(sv) && mg_find(sv,'V'))
+#define SvIsUV(sv)		(SvFLAGS(sv) & SVf_IVisUV)
+#define SvIsUV_on(sv)		(SvFLAGS(sv) |= SVf_IVisUV)
+#define SvIsUV_off(sv)		(SvFLAGS(sv) &= ~SVf_IVisUV)
+
+#define SvNOK(sv)		(SvFLAGS(sv) & SVf_NOK)
+#define SvNOK_on(sv)		(SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
+#define SvNOK_off(sv)		(SvFLAGS(sv) &= ~(SVf_NOK|SVp_NOK))
+#define SvNOK_only(sv)		(SvOK_off(sv), \
+				    SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
+
+/*
+=for apidoc Am|bool|SvUTF8|SV* sv
+Returns a boolean indicating whether the SV contains UTF-8 encoded data.
+
+=for apidoc Am|void|SvUTF8_on|SV *sv
+Turn on the UTF-8 status of an SV (the data is not changed, just the flag).
+Do not use frivolously.
+
+=for apidoc Am|void|SvUTF8_off|SV *sv
+Unsets the UTF-8 status of an SV.
+
+=for apidoc Am|void|SvPOK_only_UTF8|SV* sv
+Tells an SV that it is a string and disables all other OK bits,
+and leaves the UTF-8 status as it was.
+
+=cut
+ */
+
+#define SvUTF8(sv)		(SvFLAGS(sv) & SVf_UTF8)
+#define SvUTF8_on(sv)		(SvFLAGS(sv) |= (SVf_UTF8))
+#define SvUTF8_off(sv)		(SvFLAGS(sv) &= ~(SVf_UTF8))
+
+#define SvPOK(sv)		(SvFLAGS(sv) & SVf_POK)
+#define SvPOK_on(sv)		(assert_not_ROK(sv)			\
+				 SvFLAGS(sv) |= (SVf_POK|SVp_POK))
+#define SvPOK_off(sv)		(SvFLAGS(sv) &= ~(SVf_POK|SVp_POK))
+#define SvPOK_only(sv)		(assert_not_ROK(sv)			\
+				 SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|	\
+						  SVf_IVisUV|SVf_UTF8),	\
+				    SvFLAGS(sv) |= (SVf_POK|SVp_POK))
+#define SvPOK_only_UTF8(sv)	(assert_not_ROK(sv)			\
+				 SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|	\
+						  SVf_IVisUV),		\
+				    SvFLAGS(sv) |= (SVf_POK|SVp_POK))
+
+#define SvOOK(sv)		(SvFLAGS(sv) & SVf_OOK)
+#define SvOOK_on(sv)		((void)SvIOK_off(sv), SvFLAGS(sv) |= SVf_OOK)
+#define SvOOK_off(sv)		((void)(SvOOK(sv) && sv_backoff(sv)))
+
+#define SvFAKE(sv)		(SvFLAGS(sv) & SVf_FAKE)
+#define SvFAKE_on(sv)		(SvFLAGS(sv) |= SVf_FAKE)
+#define SvFAKE_off(sv)		(SvFLAGS(sv) &= ~SVf_FAKE)
+
+#define SvROK(sv)		(SvFLAGS(sv) & SVf_ROK)
+#define SvROK_on(sv)		(SvFLAGS(sv) |= SVf_ROK)
+#define SvROK_off(sv)		(SvFLAGS(sv) &= ~(SVf_ROK|SVf_AMAGIC))
+
+#define SvMAGICAL(sv)		(SvFLAGS(sv) & (SVs_GMG|SVs_SMG|SVs_RMG))
+#define SvMAGICAL_on(sv)	(SvFLAGS(sv) |= (SVs_GMG|SVs_SMG|SVs_RMG))
+#define SvMAGICAL_off(sv)	(SvFLAGS(sv) &= ~(SVs_GMG|SVs_SMG|SVs_RMG))
+
+#define SvGMAGICAL(sv)		(SvFLAGS(sv) & SVs_GMG)
+#define SvGMAGICAL_on(sv)	(SvFLAGS(sv) |= SVs_GMG)
+#define SvGMAGICAL_off(sv)	(SvFLAGS(sv) &= ~SVs_GMG)
+
+#define SvSMAGICAL(sv)		(SvFLAGS(sv) & SVs_SMG)
+#define SvSMAGICAL_on(sv)	(SvFLAGS(sv) |= SVs_SMG)
+#define SvSMAGICAL_off(sv)	(SvFLAGS(sv) &= ~SVs_SMG)
+
+#define SvRMAGICAL(sv)		(SvFLAGS(sv) & SVs_RMG)
+#define SvRMAGICAL_on(sv)	(SvFLAGS(sv) |= SVs_RMG)
+#define SvRMAGICAL_off(sv)	(SvFLAGS(sv) &= ~SVs_RMG)
+
+#define SvAMAGIC(sv)		(SvFLAGS(sv) & SVf_AMAGIC)
+#define SvAMAGIC_on(sv)		(SvFLAGS(sv) |= SVf_AMAGIC)
+#define SvAMAGIC_off(sv)	(SvFLAGS(sv) &= ~SVf_AMAGIC)
+
+#define SvGAMAGIC(sv)           (SvFLAGS(sv) & (SVs_GMG|SVf_AMAGIC))
+
+/*
+#define Gv_AMG(stash) \
+        (HV_AMAGICmb(stash) && \
+         ((!HV_AMAGICbad(stash) && HV_AMAGIC(stash)) || Gv_AMupdate(stash)))
+*/
+#define Gv_AMG(stash)           (PL_amagic_generation && Gv_AMupdate(stash))
+
+#define SvWEAKREF(sv)		((SvFLAGS(sv) & (SVf_ROK|SVprv_WEAKREF)) \
+				  == (SVf_ROK|SVprv_WEAKREF))
+#define SvWEAKREF_on(sv)	(SvFLAGS(sv) |=  (SVf_ROK|SVprv_WEAKREF))
+#define SvWEAKREF_off(sv)	(SvFLAGS(sv) &= ~(SVf_ROK|SVprv_WEAKREF))
+
+#define SvTHINKFIRST(sv)	(SvFLAGS(sv) & SVf_THINKFIRST)
+
+#define SvPADBUSY(sv)		(SvFLAGS(sv) & SVs_PADBUSY)
+
+#define SvPADTMP(sv)		(SvFLAGS(sv) & SVs_PADTMP)
+#define SvPADTMP_on(sv)		(SvFLAGS(sv) |= SVs_PADTMP|SVs_PADBUSY)
+#define SvPADTMP_off(sv)	(SvFLAGS(sv) &= ~SVs_PADTMP)
+
+#define SvPADMY(sv)		(SvFLAGS(sv) & SVs_PADMY)
+#define SvPADMY_on(sv)		(SvFLAGS(sv) |= SVs_PADMY|SVs_PADBUSY)
+
+#define SvTEMP(sv)		(SvFLAGS(sv) & SVs_TEMP)
+#define SvTEMP_on(sv)		(SvFLAGS(sv) |= SVs_TEMP)
+#define SvTEMP_off(sv)		(SvFLAGS(sv) &= ~SVs_TEMP)
+
+#define SvOBJECT(sv)		(SvFLAGS(sv) & SVs_OBJECT)
+#define SvOBJECT_on(sv)		(SvFLAGS(sv) |= SVs_OBJECT)
+#define SvOBJECT_off(sv)	(SvFLAGS(sv) &= ~SVs_OBJECT)
+
+#define SvREADONLY(sv)		(SvFLAGS(sv) & SVf_READONLY)
+#define SvREADONLY_on(sv)	(SvFLAGS(sv) |= SVf_READONLY)
+#define SvREADONLY_off(sv)	(SvFLAGS(sv) &= ~SVf_READONLY)
+
+#define SvSCREAM(sv)		(SvFLAGS(sv) & SVp_SCREAM)
+#define SvSCREAM_on(sv)		(SvFLAGS(sv) |= SVp_SCREAM)
+#define SvSCREAM_off(sv)	(SvFLAGS(sv) &= ~SVp_SCREAM)
+
+#define SvCOMPILED(sv)		(SvFLAGS(sv) & SVpfm_COMPILED)
+#define SvCOMPILED_on(sv)	(SvFLAGS(sv) |= SVpfm_COMPILED)
+#define SvCOMPILED_off(sv)	(SvFLAGS(sv) &= ~SVpfm_COMPILED)
+
+#define SvEVALED(sv)		(SvFLAGS(sv) & SVrepl_EVAL)
+#define SvEVALED_on(sv)		(SvFLAGS(sv) |= SVrepl_EVAL)
+#define SvEVALED_off(sv)	(SvFLAGS(sv) &= ~SVrepl_EVAL)
+
+#define SvTAIL(sv)		(SvFLAGS(sv) & SVpbm_TAIL)
+#define SvTAIL_on(sv)		(SvFLAGS(sv) |= SVpbm_TAIL)
+#define SvTAIL_off(sv)		(SvFLAGS(sv) &= ~SVpbm_TAIL)
+
+#define SvVALID(sv)		(SvFLAGS(sv) & SVpbm_VALID)
+#define SvVALID_on(sv)		(SvFLAGS(sv) |= SVpbm_VALID)
+#define SvVALID_off(sv)		(SvFLAGS(sv) &= ~SVpbm_VALID)
+
+#ifdef USE_ITHREADS
+/* The following uses the FAKE flag to show that a regex pointer is infact
+   its own offset in the regexpad for ithreads */
+#define SvREPADTMP(sv)		(SvFLAGS(sv) & SVf_FAKE)
+#define SvREPADTMP_on(sv)	(SvFLAGS(sv) |= SVf_FAKE)
+#define SvREPADTMP_off(sv)	(SvFLAGS(sv) &= ~SVf_FAKE)
+#endif
+
+#define SvRV(sv) ((XRV*)  SvANY(sv))->xrv_rv
+#define SvRVx(sv) SvRV(sv)
+
+#define SvIVX(sv) ((XPVIV*)  SvANY(sv))->xiv_iv
+#define SvUVX(sv) ((XPVUV*)  SvANY(sv))->xuv_uv
+#define SvNVX(sv)  ((XPVNV*)SvANY(sv))->xnv_nv
+#define SvPVX(sv)  ((XPV*)  SvANY(sv))->xpv_pv
+/* Given that these two are new, there can't be any existing code using them
+ *  as LVALUEs  */
+#define SvPVX_mutable(sv)	(0 + SvPVX(sv))
+#define SvPVX_const(sv)	((const char*) (0 + SvPVX(sv)))
+#define SvCUR(sv) ((XPV*)  SvANY(sv))->xpv_cur
+#define SvLEN(sv) ((XPV*)  SvANY(sv))->xpv_len
+#define SvEND(sv)(((XPV*)  SvANY(sv))->xpv_pv + ((XPV*)SvANY(sv))->xpv_cur)
+
+#define SvIVXx(sv) SvIVX(sv)
+#define SvUVXx(sv) SvUVX(sv)
+#define SvNVXx(sv) SvNVX(sv)
+#define SvPVXx(sv) SvPVX(sv)
+#define SvLENx(sv) SvLEN(sv)
+#define SvENDx(sv) ((PL_Sv = (sv)), SvEND(PL_Sv))
+#define SvMAGIC(sv)	((XPVMG*)  SvANY(sv))->xmg_magic
+#define SvSTASH(sv)	((XPVMG*)  SvANY(sv))->xmg_stash
+
+/* Ask a scalar nicely to try to become an IV, if possible.
+   Not guaranteed to stay returning void */
+/* Macro won't actually call sv_2iv if already IOK */
+#define SvIV_please(sv) \
+	STMT_START {if (!SvIOKp(sv) && (SvNOK(sv) || SvPOK(sv))) \
+		(void) SvIV(sv); } STMT_END
+/* Put the asserts back at some point and figure out where they reveal bugs
+*/
+#define SvIV_set(sv, val) \
+	STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+		(((XPVIV*)  SvANY(sv))->xiv_iv = (val)); } STMT_END
+#define SvNV_set(sv, val) \
+	STMT_START { assert(SvTYPE(sv) == SVt_NV || SvTYPE(sv) >= SVt_PVNV); \
+		(((XPVNV*)SvANY(sv))->xnv_nv = (val)); } STMT_END
+/* assert(SvTYPE(sv) >= SVt_PV); */
+#define SvPV_set(sv, val) \
+	STMT_START { \
+		(((XPV*)  SvANY(sv))->xpv_pv = (val)); } STMT_END
+/* assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); */
+#define SvUV_set(sv, val) \
+	STMT_START { \
+		(((XPVUV*)SvANY(sv))->xuv_uv = (val)); } STMT_END
+/* assert(SvTYPE(sv) >=  SVt_RV); */
+#define SvRV_set(sv, val) \
+        STMT_START { \
+                (((XRV*)SvANY(sv))->xrv_rv = (val)); } STMT_END
+/* assert(SvTYPE(sv) >= SVt_PVMG); */
+#define SvMAGIC_set(sv, val) \
+        STMT_START {  \
+                (((XPVMG*)SvANY(sv))->xmg_magic = (val)); } STMT_END
+/* assert(SvTYPE(sv) >= SVt_PVMG); */
+#define SvSTASH_set(sv, val) \
+        STMT_START { \
+                (((XPVMG*)  SvANY(sv))->xmg_stash = (val)); } STMT_END
+/* assert(SvTYPE(sv) >= SVt_PV); */
+#define SvCUR_set(sv, val) \
+	STMT_START { \
+		(((XPV*)  SvANY(sv))->xpv_cur = (val)); } STMT_END
+/* assert(SvTYPE(sv) >= SVt_PV); */
+#define SvLEN_set(sv, val) \
+	STMT_START { \
+		(((XPV*)  SvANY(sv))->xpv_len = (val)); } STMT_END
+#define SvEND_set(sv, val) \
+	STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
+		(SvCUR(sv) = (val) - SvPVX(sv)); } STMT_END
+
+#define SvPV_renew(sv,n) \
+	STMT_START { SvLEN_set(sv, n); \
+		SvPV_set((sv), (MEM_WRAP_CHECK_(n,char)			\
+				(char*)saferealloc((Malloc_t)SvPVX(sv), \
+						   (MEM_SIZE)((n)))));  \
+		 } STMT_END
+
+#define SvPV_shrink_to_cur(sv) STMT_START { \
+		   const STRLEN _lEnGtH = SvCUR(sv) + 1; \
+		   SvPV_renew(sv, _lEnGtH); \
+		 } STMT_END
+
+#define SvPV_free(sv) \
+	STMT_START { assert(SvTYPE(sv) >= SVt_PV);	\
+		if (SvLEN(sv)) {			\
+		    if(SvOOK(sv)) {			\
+		      Safefree(SvPVX(sv) - SvIVX(sv));	\
+		      SvFLAGS(sv) &= ~SVf_OOK;		\
+		    } else {				\
+		      Safefree(SvPVX(sv));		\
+		    }					\
+		}					\
+	} STMT_END
+
+#define BmRARE(sv)	((XPVBM*)  SvANY(sv))->xbm_rare
+#define BmUSEFUL(sv)	((XPVBM*)  SvANY(sv))->xbm_useful
+#define BmPREVIOUS(sv)	((XPVBM*)  SvANY(sv))->xbm_previous
+
+#define FmLINES(sv)	((XPVFM*)  SvANY(sv))->xfm_lines
+
+#define LvTYPE(sv)	((XPVLV*)  SvANY(sv))->xlv_type
+#define LvTARG(sv)	((XPVLV*)  SvANY(sv))->xlv_targ
+#define LvTARGOFF(sv)	((XPVLV*)  SvANY(sv))->xlv_targoff
+#define LvTARGLEN(sv)	((XPVLV*)  SvANY(sv))->xlv_targlen
+
+#define IoIFP(sv)	((XPVIO*)  SvANY(sv))->xio_ifp
+#define IoOFP(sv)	((XPVIO*)  SvANY(sv))->xio_ofp
+#define IoDIRP(sv)	((XPVIO*)  SvANY(sv))->xio_dirp
+#define IoANY(sv)	((XPVIO*)  SvANY(sv))->xio_any
+#define IoLINES(sv)	((XPVIO*)  SvANY(sv))->xio_lines
+#define IoPAGE(sv)	((XPVIO*)  SvANY(sv))->xio_page
+#define IoPAGE_LEN(sv)	((XPVIO*)  SvANY(sv))->xio_page_len
+#define IoLINES_LEFT(sv)((XPVIO*)  SvANY(sv))->xio_lines_left
+#define IoTOP_NAME(sv)	((XPVIO*)  SvANY(sv))->xio_top_name
+#define IoTOP_GV(sv)	((XPVIO*)  SvANY(sv))->xio_top_gv
+#define IoFMT_NAME(sv)	((XPVIO*)  SvANY(sv))->xio_fmt_name
+#define IoFMT_GV(sv)	((XPVIO*)  SvANY(sv))->xio_fmt_gv
+#define IoBOTTOM_NAME(sv)((XPVIO*) SvANY(sv))->xio_bottom_name
+#define IoBOTTOM_GV(sv)	((XPVIO*)  SvANY(sv))->xio_bottom_gv
+#define IoSUBPROCESS(sv)((XPVIO*)  SvANY(sv))->xio_subprocess
+#define IoTYPE(sv)	((XPVIO*)  SvANY(sv))->xio_type
+#define IoFLAGS(sv)	((XPVIO*)  SvANY(sv))->xio_flags
+
+/* IoTYPE(sv) is a single character telling the type of I/O connection. */
+#define IoTYPE_RDONLY		'<'
+#define IoTYPE_WRONLY		'>'
+#define IoTYPE_RDWR		'+'
+#define IoTYPE_APPEND 		'a'
+#define IoTYPE_PIPE		'|'
+#define IoTYPE_STD		'-'	/* stdin or stdout */
+#define IoTYPE_SOCKET		's'
+#define IoTYPE_CLOSED		' '
+#define IoTYPE_IMPLICIT		'I'	/* stdin or stdout or stderr */
+#define IoTYPE_NUMERIC		'#'	/* fdopen */
+
+/*
+=for apidoc Am|bool|SvTAINTED|SV* sv
+Checks to see if an SV is tainted. Returns TRUE if it is, FALSE if
+not.
+
+=for apidoc Am|void|SvTAINTED_on|SV* sv
+Marks an SV as tainted if tainting is enabled.
+
+=for apidoc Am|void|SvTAINTED_off|SV* sv
+Untaints an SV. Be I<very> careful with this routine, as it short-circuits
+some of Perl's fundamental security features. XS module authors should not
+use this function unless they fully understand all the implications of
+unconditionally untainting the value. Untainting should be done in the
+standard perl fashion, via a carefully crafted regexp, rather than directly
+untainting variables.
+
+=for apidoc Am|void|SvTAINT|SV* sv
+Taints an SV if tainting is enabled.
+
+=cut
+*/
+
+#define SvTAINTED(sv)	  (SvMAGICAL(sv) && sv_tainted(sv))
+#define SvTAINTED_on(sv)  STMT_START{ if(PL_tainting){sv_taint(sv);}   }STMT_END
+#define SvTAINTED_off(sv) STMT_START{ if(PL_tainting){sv_untaint(sv);} }STMT_END
+
+#define SvTAINT(sv)			\
+    STMT_START {			\
+	if (PL_tainting) {		\
+	    if (PL_tainted)		\
+		SvTAINTED_on(sv);	\
+	}				\
+    } STMT_END
+
+/*
+=for apidoc Am|char*|SvPV_force|SV* sv|STRLEN len
+Like C<SvPV> but will force the SV into containing just a string
+(C<SvPOK_only>).  You want force if you are going to update the C<SvPVX>
+directly.
+
+=for apidoc Am|char*|SvPV_force_nomg|SV* sv|STRLEN len
+Like C<SvPV> but will force the SV into containing just a string
+(C<SvPOK_only>).  You want force if you are going to update the C<SvPVX>
+directly. Doesn't process magic.
+
+=for apidoc Am|char*|SvPV|SV* sv|STRLEN len
+Returns a pointer to the string in the SV, or a stringified form of
+the SV if the SV does not contain a string.  The SV may cache the
+stringified version becoming C<SvPOK>.  Handles 'get' magic. See also
+C<SvPVx> for a version which guarantees to evaluate sv only once.
+
+=for apidoc Am|char*|SvPVx|SV* sv|STRLEN len
+A version of C<SvPV> which guarantees to evaluate sv only once.
+
+=for apidoc Am|char*|SvPV_nolen|SV* sv
+Returns a pointer to the string in the SV, or a stringified form of
+the SV if the SV does not contain a string.  The SV may cache the
+stringified form becoming C<SvPOK>.  Handles 'get' magic.
+
+=for apidoc Am|IV|SvIV|SV* sv
+Coerces the given SV to an integer and returns it. See  C<SvIVx> for a
+version which guarantees to evaluate sv only once.
+
+=for apidoc Am|IV|SvIVx|SV* sv
+Coerces the given SV to an integer and returns it. Guarantees to evaluate
+sv only once. Use the more efficient C<SvIV> otherwise.
+
+=for apidoc Am|NV|SvNV|SV* sv
+Coerce the given SV to a double and return it. See  C<SvNVx> for a version
+which guarantees to evaluate sv only once.
+
+=for apidoc Am|NV|SvNVx|SV* sv
+Coerces the given SV to a double and returns it. Guarantees to evaluate
+sv only once. Use the more efficient C<SvNV> otherwise.
+
+=for apidoc Am|UV|SvUV|SV* sv
+Coerces the given SV to an unsigned integer and returns it.  See C<SvUVx>
+for a version which guarantees to evaluate sv only once.
+
+=for apidoc Am|UV|SvUVx|SV* sv
+Coerces the given SV to an unsigned integer and returns it. Guarantees to
+evaluate sv only once. Use the more efficient C<SvUV> otherwise.
+
+=for apidoc Am|bool|SvTRUE|SV* sv
+Returns a boolean indicating whether Perl would evaluate the SV as true or
+false, defined or undefined.  Does not handle 'get' magic.
+
+=for apidoc Am|char*|SvPVutf8_force|SV* sv|STRLEN len
+Like C<SvPV_force>, but converts sv to utf8 first if necessary.
+
+=for apidoc Am|char*|SvPVutf8|SV* sv|STRLEN len
+Like C<SvPV>, but converts sv to utf8 first if necessary.
+
+=for apidoc Am|char*|SvPVutf8_nolen|SV* sv
+Like C<SvPV_nolen>, but converts sv to utf8 first if necessary.
+
+=for apidoc Am|char*|SvPVbyte_force|SV* sv|STRLEN len
+Like C<SvPV_force>, but converts sv to byte representation first if necessary.
+
+=for apidoc Am|char*|SvPVbyte|SV* sv|STRLEN len
+Like C<SvPV>, but converts sv to byte representation first if necessary.
+
+=for apidoc Am|char*|SvPVbyte_nolen|SV* sv
+Like C<SvPV_nolen>, but converts sv to byte representation first if necessary.
+
+=for apidoc Am|char*|SvPVutf8x_force|SV* sv|STRLEN len
+Like C<SvPV_force>, but converts sv to utf8 first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVutf8_force>
+otherwise.
+
+=for apidoc Am|char*|SvPVutf8x|SV* sv|STRLEN len
+Like C<SvPV>, but converts sv to utf8 first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVutf8>
+otherwise.
+
+=for apidoc Am|char*|SvPVbytex_force|SV* sv|STRLEN len
+Like C<SvPV_force>, but converts sv to byte representation first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte_force>
+otherwise.
+
+=for apidoc Am|char*|SvPVbytex|SV* sv|STRLEN len
+Like C<SvPV>, but converts sv to byte representation first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte>
+otherwise.
+
+=for apidoc Am|bool|SvIsCOW|SV* sv
+Returns a boolean indicating whether the SV is Copy-On-Write. (either shared
+hash key scalars, or full Copy On Write scalars if 5.9.0 is configured for
+COW)
+
+=for apidoc Am|bool|SvIsCOW_shared_hash|SV* sv
+Returns a boolean indicating whether the SV is Copy-On-Write shared hash key
+scalar.
+
+=for apidoc Am|void|sv_catpvn_nomg|SV* sv|const char* ptr|STRLEN len
+Like C<sv_catpvn> but doesn't process magic.
+
+=for apidoc Am|void|sv_setsv_nomg|SV* dsv|SV* ssv
+Like C<sv_setsv> but doesn't process magic.
+
+=for apidoc Am|void|sv_catsv_nomg|SV* dsv|SV* ssv
+Like C<sv_catsv> but doesn't process magic.
+
+=cut
+*/
+
+/* Let us hope that bitmaps for UV and IV are the same */
+#define SvIV(sv) (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv))
+#define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+#define SvNV(sv) (SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv))
+
+/* ----*/
+
+#define SvPV(sv, lp) SvPV_flags(sv, lp, SV_GMAGIC)
+#define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC)
+#define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC)
+
+#define SvPV_flags(sv, lp, flags) \
+    ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+     ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags))
+#define SvPV_flags_const(sv, lp, flags) \
+    ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+     ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \
+     (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN))
+#define SvPV_flags_const_nolen(sv, flags) \
+    ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+     ? SvPVX_const(sv) : \
+     (const char*) sv_2pv_flags(sv, 0, flags|SV_CONST_RETURN))
+#define SvPV_flags_mutable(sv, lp, flags) \
+    ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+     ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \
+     sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+
+#define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC)
+#define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC)
+#define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC)
+
+#define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0)
+#define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0)
+
+#define SvPV_force_flags(sv, lp, flags) \
+    ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+    ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags))
+#define SvPV_force_flags_nolen(sv, flags) \
+    ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+    ? SvPVX(sv) : sv_pvn_force_flags(sv, 0, flags))
+#define SvPV_force_flags_mutable(sv, lp, flags) \
+    ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+    ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \
+     : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+
+#define SvPV_nolen(sv) \
+    ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+     ? SvPVX(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC))
+
+#define SvPV_nolen_const(sv) \
+    ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+     ? SvPVX_const(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC|SV_CONST_RETURN))
+
+#define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0)
+#define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0)
+#define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0)
+
+/* ----*/
+
+#define SvPVutf8(sv, lp) \
+    ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK|SVf_UTF8) \
+     ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &lp))
+
+#define SvPVutf8_force(sv, lp) \
+    ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == (SVf_POK|SVf_UTF8) \
+     ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvutf8n_force(sv, &lp))
+
+
+#define SvPVutf8_nolen(sv) \
+    ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK|SVf_UTF8)\
+     ? SvPVX(sv) : sv_2pvutf8(sv, 0))
+
+/* ----*/
+
+#define SvPVbyte(sv, lp) \
+    ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
+     ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+
+#define SvPVbyte_force(sv, lp) \
+    ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8|SVf_THINKFIRST)) == (SVf_POK) \
+     ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvbyten_force(sv, &lp))
+
+#define SvPVbyte_nolen(sv) \
+    ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)\
+     ? SvPVX(sv) : sv_2pvbyte(sv, 0))
+
+
+    
+/* define FOOx(): idempotent versions of FOO(). If possible, use a local
+ * var to evaluate the arg once; failing that, use a global if possible;
+ * failing that, call a function to do the work
+ */
+
+#define SvPVx_force(sv, lp) sv_pvn_force(sv, &lp)
+#define SvPVutf8x_force(sv, lp) sv_pvutf8n_force(sv, &lp)
+#define SvPVbytex_force(sv, lp) sv_pvbyten_force(sv, &lp)
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+
+#  define SvIVx(sv) ({SV *_sv = (SV*)(sv); SvIV(_sv); })
+#  define SvUVx(sv) ({SV *_sv = (SV*)(sv); SvUV(_sv); })
+#  define SvNVx(sv) ({SV *_sv = (SV*)(sv); SvNV(_sv); })
+#  define SvPVx(sv, lp) ({SV *_sv = (sv); SvPV(_sv, lp); })
+#  define SvPVx_const(sv, lp) ({SV *_sv = (sv); SvPV_const(_sv, lp); })
+#  define SvPVx_nolen(sv) ({SV *_sv = (sv); SvPV_nolen(_sv); })
+#  define SvPVx_nolen_const(sv) ({SV *_sv = (sv); SvPV_nolen_const(_sv); })
+#  define SvPVutf8x(sv, lp) ({SV *_sv = (sv); SvPVutf8(_sv, lp); })
+#  define SvPVbytex(sv, lp) ({SV *_sv = (sv); SvPVbyte(_sv, lp); })
+#  define SvPVbytex_nolen(sv) ({SV *_sv = (sv); SvPVbyte_nolen(_sv); })
+#  define SvTRUE(sv) (						\
+    !sv								\
+    ? 0								\
+    :    SvPOK(sv)						\
+	?   (({XPV *nxpv = (XPV*)SvANY(sv);			\
+	     nxpv &&						\
+	     (nxpv->xpv_cur > 1 ||				\
+	      (nxpv->xpv_cur && *nxpv->xpv_pv != '0')); })	\
+	     ? 1						\
+	     : 0)						\
+	:							\
+	    SvIOK(sv)						\
+	    ? SvIVX(sv) != 0					\
+	    :   SvNOK(sv)					\
+		? SvNVX(sv) != 0.0				\
+		: sv_2bool(sv) )
+#  define SvTRUEx(sv) ({SV *_sv = (sv); SvTRUE(_sv); })
+
+#else /* __GNUC__ */
+
+#  ifdef USE_5005THREADS
+#    define SvIVx(sv) sv_iv(sv)
+#    define SvUVx(sv) sv_uv(sv)
+#    define SvNVx(sv) sv_nv(sv)
+#    define SvPVx(sv, lp) sv_pvn(sv, &lp)
+#    define SvPVutf8x(sv, lp) sv_pvutf8n(sv, &lp)
+#    define SvPVbytex(sv, lp) sv_pvbyten(sv, &lp)
+#    define SvTRUE(sv) SvTRUEx(sv)
+#    define SvTRUEx(sv) sv_true(sv)
+
+#  else /* USE_5005THREADS */
+
+/* These inlined macros use globals, which will require a thread
+ * declaration in user code, so we avoid them under threads */
+
+#    define SvIVx(sv) ((PL_Sv = (sv)), SvIV(PL_Sv))
+#    define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
+#    define SvNVx(sv) ((PL_Sv = (sv)), SvNV(PL_Sv))
+#    define SvPVx(sv, lp) ((PL_Sv = (sv)), SvPV(PL_Sv, lp))
+#    define SvPVx_const(sv, lp) ((PL_Sv = (sv)), SvPV_const(PL_Sv, lp))
+#    define SvPVx_nolen(sv) ((PL_Sv = (sv)), SvPV_nolen(PL_Sv))
+#    define SvPVx_nolen_const(sv) ((PL_Sv = (sv)), SvPV_nolen_const(PL_Sv))
+#    define SvPVutf8x(sv, lp) ((PL_Sv = (sv)), SvPVutf8(PL_Sv, lp))
+#    define SvPVbytex(sv, lp) ((PL_Sv = (sv)), SvPVbyte(PL_Sv, lp))
+#    define SvPVbytex_nolen(sv) ((PL_Sv = (sv)), SvPVbyte_nolen(PL_Sv))
+#    define SvTRUE(sv) (						\
+    !sv								\
+    ? 0								\
+    :    SvPOK(sv)						\
+	?   ((PL_Xpv = (XPV*)SvANY(sv)) &&			\
+	     (PL_Xpv->xpv_cur > 1 ||				\
+	      (PL_Xpv->xpv_cur && *PL_Xpv->xpv_pv != '0'))	\
+	     ? 1						\
+	     : 0)						\
+	:							\
+	    SvIOK(sv)						\
+	    ? SvIVX(sv) != 0					\
+	    :   SvNOK(sv)					\
+		? SvNVX(sv) != 0.0				\
+		: sv_2bool(sv) )
+#    define SvTRUEx(sv) ((PL_Sv = (sv)), SvTRUE(PL_Sv))
+#  endif /* USE_5005THREADS */
+#endif /* __GNU__ */
+
+#define SvIsCOW(sv)		((SvFLAGS(sv) & (SVf_FAKE | SVf_READONLY)) == \
+				    (SVf_FAKE | SVf_READONLY))
+#define SvIsCOW_shared_hash(sv)	(SvIsCOW(sv) && SvLEN(sv) == 0)
+
+#define SvSHARED_HASH(sv) (0 + SvUVX(sv))
+
+/* flag values for sv_*_flags functions */
+#define SV_IMMEDIATE_UNREF	1
+#define SV_GMAGIC		2
+#define SV_COW_DROP_PV		4	/* Unused in Perl 5.8.x */
+#define SV_UTF8_NO_ENCODING	8
+#define SV_NOSTEAL		16
+#define SV_CONST_RETURN		32
+#define SV_MUTABLE_RETURN	64
+
+/* all these 'functions' are now just macros */
+
+#define sv_pv(sv) SvPV_nolen(sv)
+#define sv_pvutf8(sv) SvPVutf8_nolen(sv)
+#define sv_pvbyte(sv) SvPVbyte_nolen(sv)
+
+#define sv_pvn_force_nomg(sv, lp) sv_pvn_force_flags(sv, lp, 0)
+#define sv_utf8_upgrade_nomg(sv) sv_utf8_upgrade_flags(sv, 0)
+#define sv_catpvn_nomg(dsv, sstr, slen) sv_catpvn_flags(dsv, sstr, slen, 0)
+#define sv_setsv(dsv, ssv) sv_setsv_flags(dsv, ssv, SV_GMAGIC)
+#define sv_setsv_nomg(dsv, ssv) sv_setsv_flags(dsv, ssv, 0)
+#define sv_catsv(dsv, ssv) sv_catsv_flags(dsv, ssv, SV_GMAGIC)
+#define sv_catsv_nomg(dsv, ssv) sv_catsv_flags(dsv, ssv, 0)
+#define sv_catpvn(dsv, sstr, slen) sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC)
+#define sv_2pv(sv, lp) sv_2pv_flags(sv, lp, SV_GMAGIC)
+#define sv_2pv_nomg(sv, lp) sv_2pv_flags(sv, lp, 0)
+#define sv_pvn_force(sv, lp) sv_pvn_force_flags(sv, lp, SV_GMAGIC)
+#define sv_utf8_upgrade(sv) sv_utf8_upgrade_flags(sv, SV_GMAGIC)
+
+/* Should be named SvCatPVN_utf8_upgrade? */
+#define sv_catpvn_utf8_upgrade(dsv, sstr, slen, nsv)	\
+	STMT_START {					\
+	    if (!(nsv))					\
+		nsv = sv_2mortal(newSVpvn(sstr, slen));	\
+	    else					\
+		sv_setpvn(nsv, sstr, slen);		\
+	    SvUTF8_off(nsv);				\
+	    sv_utf8_upgrade(nsv);			\
+	    sv_catsv(dsv, nsv);	\
+	} STMT_END
+
+/*
+=for apidoc Am|SV*|newRV_inc|SV* sv
+
+Creates an RV wrapper for an SV.  The reference count for the original SV is
+incremented.
+
+=cut
+*/
+
+#define newRV_inc(sv)	newRV(sv)
+
+/* the following macros update any magic values this sv is associated with */
+
+/*
+=head1 Magical Functions
+
+=for apidoc Am|void|SvGETMAGIC|SV* sv
+Invokes C<mg_get> on an SV if it has 'get' magic.  This macro evaluates its
+argument more than once.
+
+=for apidoc Am|void|SvSETMAGIC|SV* sv
+Invokes C<mg_set> on an SV if it has 'set' magic.  This macro evaluates its
+argument more than once.
+
+=for apidoc Am|void|SvSetSV|SV* dsb|SV* ssv
+Calls C<sv_setsv> if dsv is not the same as ssv.  May evaluate arguments
+more than once.
+
+=for apidoc Am|void|SvSetSV_nosteal|SV* dsv|SV* ssv
+Calls a non-destructive version of C<sv_setsv> if dsv is not the same as
+ssv. May evaluate arguments more than once.
+
+=for apidoc Am|void|SvSetMagicSV|SV* dsb|SV* ssv
+Like C<SvSetSV>, but does any set magic required afterwards.
+
+=for apidoc Am|void|SvSetMagicSV_nosteal|SV* dsv|SV* ssv
+Like C<SvSetSV_nosteal>, but does any set magic required afterwards.
+
+=for apidoc Am|void|SvSHARE|SV* sv
+Arranges for sv to be shared between threads if a suitable module
+has been loaded.
+
+=for apidoc Am|void|SvLOCK|SV* sv
+Arranges for a mutual exclusion lock to be obtained on sv if a suitable module
+has been loaded.
+
+=for apidoc Am|void|SvUNLOCK|SV* sv
+Releases a mutual exclusion lock on sv if a suitable module
+has been loaded.
+
+=head1 SV Manipulation Functions
+
+=for apidoc Am|char *|SvGROW|SV* sv|STRLEN len
+Expands the character buffer in the SV so that it has room for the
+indicated number of bytes (remember to reserve space for an extra trailing
+NUL character).  Calls C<sv_grow> to perform the expansion if necessary.
+Returns a pointer to the character buffer.
+
+=cut
+*/
+
+#define SvSHARE(sv) CALL_FPTR(PL_sharehook)(aTHX_ sv)
+#define SvLOCK(sv) CALL_FPTR(PL_lockhook)(aTHX_ sv)
+#define SvUNLOCK(sv) CALL_FPTR(PL_unlockhook)(aTHX_ sv)
+
+#define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
+#define SvSETMAGIC(x) STMT_START { if (SvSMAGICAL(x)) mg_set(x); } STMT_END
+
+#define SvSetSV_and(dst,src,finally) \
+	STMT_START {					\
+	    if ((dst) != (src)) {			\
+		sv_setsv(dst, src);			\
+		finally;				\
+	    }						\
+	} STMT_END
+#define SvSetSV_nosteal_and(dst,src,finally) \
+	STMT_START {					\
+	    if ((dst) != (src)) {			\
+		sv_setsv_flags(dst, src, SV_GMAGIC | SV_NOSTEAL);	\
+		finally;				\
+	    }						\
+	} STMT_END
+
+#define SvSetSV(dst,src) \
+		SvSetSV_and(dst,src,/*nothing*/;)
+#define SvSetSV_nosteal(dst,src) \
+		SvSetSV_nosteal_and(dst,src,/*nothing*/;)
+
+#define SvSetMagicSV(dst,src) \
+		SvSetSV_and(dst,src,SvSETMAGIC(dst))
+#define SvSetMagicSV_nosteal(dst,src) \
+		SvSetSV_nosteal_and(dst,src,SvSETMAGIC(dst))
+
+
+#if !defined(SKIP_DEBUGGING)
+#define SvPEEK(sv) sv_peek(sv)
+#else
+#define SvPEEK(sv) ""
+#endif
+
+#define SvIMMORTAL(sv) ((sv)==&PL_sv_undef || (sv)==&PL_sv_yes || (sv)==&PL_sv_no || (sv)==&PL_sv_placeholder)
+
+#define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
+
+#define isGV(sv) (SvTYPE(sv) == SVt_PVGV)
+
+#define SvGROW(sv,len) (SvLEN(sv) < (len) ? sv_grow(sv,len) : SvPVX(sv))
+#define SvGROW_mutable(sv,len) \
+    (SvLEN(sv) < (len) ? sv_grow(sv,len) : SvPVX_mutable(sv))
+#define Sv_Grow sv_grow
+
+#define CLONEf_COPY_STACKS 1
+#define CLONEf_KEEP_PTR_TABLE 2
+#define CLONEf_CLONE_HOST 4
+#define CLONEf_JOIN_IN 8
+
+struct clone_params {
+  AV* stashes;
+  UV  flags;
+  PerlInterpreter *proto_perl;
+};
+
+#define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_force_normal(sv)
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/sys/socket.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/sys/socket.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/sys/socket.h	(revision 14489)
@@ -0,0 +1,183 @@
+/* sys/socket.h */
+
+/* djl */
+/* Provide UNIX compatibility */
+
+#ifndef  _INC_SYS_SOCKET
+#define  _INC_SYS_SOCKET
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define WIN32_LEAN_AND_MEAN
+#ifdef __GNUC__
+#  define Win32_Winsock
+#endif
+#include <windows.h>
+
+/* Too late to include winsock2.h if winsock.h has already been loaded */
+#ifndef _WINSOCKAPI_
+#  include <winsock2.h>
+#endif
+
+#include "win32.h"
+
+#define  ENOTSOCK	WSAENOTSOCK
+
+#ifdef USE_SOCKETS_AS_HANDLES
+
+#ifndef PERL_FD_SETSIZE
+#define PERL_FD_SETSIZE		64
+#endif
+
+#define PERL_BITS_PER_BYTE	8
+#define	PERL_NFDBITS		(sizeof(Perl_fd_mask)*PERL_BITS_PER_BYTE)
+
+typedef int			Perl_fd_mask;
+
+typedef struct	Perl_fd_set {
+    Perl_fd_mask bits[(PERL_FD_SETSIZE+PERL_NFDBITS-1)/PERL_NFDBITS];
+}				Perl_fd_set;
+
+#define PERL_FD_CLR(n,p) \
+    ((p)->bits[(n)/PERL_NFDBITS] &= ~((unsigned)1 << ((n)%PERL_NFDBITS)))
+
+#define PERL_FD_SET(n,p) \
+    ((p)->bits[(n)/PERL_NFDBITS] |=  ((unsigned)1 << ((n)%PERL_NFDBITS)))
+
+#define PERL_FD_ZERO(p) memset((char *)(p),0,sizeof(*(p)))
+
+#define PERL_FD_ISSET(n,p) \
+    ((p)->bits[(n)/PERL_NFDBITS] &   ((unsigned)1 << ((n)%PERL_NFDBITS)))
+
+#else	/* USE_SOCKETS_AS_HANDLES */
+
+#define Perl_fd_set	fd_set
+#define PERL_FD_SET(n,p)	FD_SET(n,p)
+#define PERL_FD_CLR(n,p)	FD_CLR(n,p)
+#define PERL_FD_ISSET(n,p)	FD_ISSET(n,p)
+#define PERL_FD_ZERO(p)		FD_ZERO(p)
+
+#endif	/* USE_SOCKETS_AS_HANDLES */
+
+SOCKET win32_accept (SOCKET s, struct sockaddr *addr, int *addrlen);
+int win32_bind (SOCKET s, const struct sockaddr *addr, int namelen);
+int win32_closesocket (SOCKET s);
+int win32_connect (SOCKET s, const struct sockaddr *name, int namelen);
+int win32_ioctlsocket (SOCKET s, long cmd, u_long *argp);
+int win32_getpeername (SOCKET s, struct sockaddr *name, int * namelen);
+int win32_getsockname (SOCKET s, struct sockaddr *name, int * namelen);
+int win32_getsockopt (SOCKET s, int level, int optname, char * optval, int *optlen);
+u_long win32_htonl (u_long hostlong);
+u_short win32_htons (u_short hostshort);
+unsigned long win32_inet_addr (const char * cp);
+char * win32_inet_ntoa (struct in_addr in);
+int win32_listen (SOCKET s, int backlog);
+u_long win32_ntohl (u_long netlong);
+u_short win32_ntohs (u_short netshort);
+int win32_recv (SOCKET s, char * buf, int len, int flags);
+int win32_recvfrom (SOCKET s, char * buf, int len, int flags,
+                         struct sockaddr *from, int * fromlen);
+int win32_select (int nfds, Perl_fd_set *rfds, Perl_fd_set *wfds, Perl_fd_set *xfds,
+		  const struct timeval *timeout);
+int win32_send (SOCKET s, const char * buf, int len, int flags);
+int win32_sendto (SOCKET s, const char * buf, int len, int flags,
+                       const struct sockaddr *to, int tolen);
+int win32_setsockopt (SOCKET s, int level, int optname,
+                           const char * optval, int optlen);
+SOCKET win32_socket (int af, int type, int protocol);
+int win32_shutdown (SOCKET s, int how);
+
+/* Database function prototypes */
+
+struct hostent * win32_gethostbyaddr(const char * addr, int len, int type);
+struct hostent * win32_gethostbyname(const char * name);
+int win32_gethostname (char * name, int namelen);
+struct servent * win32_getservbyport(int port, const char * proto);
+struct servent * win32_getservbyname(const char * name, const char * proto);
+struct protoent * win32_getprotobynumber(int proto);
+struct protoent * win32_getprotobyname(const char * name);
+struct protoent *win32_getprotoent(void);
+struct servent *win32_getservent(void);
+void win32_sethostent(int stayopen);
+void win32_setnetent(int stayopen);
+struct netent * win32_getnetent(void);
+struct netent * win32_getnetbyname(char *name);
+struct netent * win32_getnetbyaddr(long net, int type);
+void win32_setprotoent(int stayopen);
+void win32_setservent(int stayopen);
+void win32_endhostent(void);
+void win32_endnetent(void);
+void win32_endprotoent(void);
+void win32_endservent(void);
+
+#ifndef WIN32SCK_IS_STDSCK
+
+/* direct to our version */
+
+#define htonl		win32_htonl
+#define htons		win32_htons
+#define ntohl		win32_ntohl
+#define ntohs		win32_ntohs
+#define inet_addr	win32_inet_addr
+#define inet_ntoa	win32_inet_ntoa
+
+#define socket		win32_socket
+#define bind		win32_bind
+#define listen		win32_listen
+#define accept		win32_accept
+#define connect		win32_connect
+#define send		win32_send
+#define sendto		win32_sendto
+#define recv		win32_recv
+#define recvfrom	win32_recvfrom
+#define shutdown	win32_shutdown
+#define closesocket	win32_closesocket
+#define ioctlsocket	win32_ioctlsocket
+#define setsockopt	win32_setsockopt
+#define getsockopt	win32_getsockopt
+#define getpeername	win32_getpeername
+#define getsockname	win32_getsockname
+#define gethostname	win32_gethostname
+#define gethostbyname	win32_gethostbyname
+#define gethostbyaddr	win32_gethostbyaddr
+#define getprotobyname	win32_getprotobyname
+#define getprotobynumber win32_getprotobynumber
+#define getservbyname	win32_getservbyname
+#define getservbyport	win32_getservbyport
+#define select		win32_select
+#define endhostent	win32_endhostent
+#define endnetent	win32_endnetent
+#define endprotoent	win32_endprotoent
+#define endservent	win32_endservent
+#define getnetent	win32_getnetent
+#define getnetbyname	win32_getnetbyname
+#define getnetbyaddr	win32_getnetbyaddr
+#define getprotoent	win32_getprotoent
+#define getservent	win32_getservent
+#define sethostent	win32_sethostent
+#define setnetent	win32_setnetent
+#define setprotoent	win32_setprotoent
+#define setservent	win32_setservent
+
+#ifdef USE_SOCKETS_AS_HANDLES
+#undef fd_set
+#undef FD_SET
+#undef FD_CLR
+#undef FD_ISSET
+#undef FD_ZERO
+#define fd_set		Perl_fd_set
+#define FD_SET(n,p)	PERL_FD_SET(n,p)
+#define FD_CLR(n,p)	PERL_FD_CLR(n,p)
+#define FD_ISSET(n,p)	PERL_FD_ISSET(n,p)
+#define FD_ZERO(p)	PERL_FD_ZERO(p)
+#endif	/* USE_SOCKETS_AS_HANDLES */
+
+#endif	/* WIN32SCK_IS_STDSCK */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _INC_SYS_SOCKET */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/thrdvar.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/thrdvar.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/thrdvar.h	(revision 14489)
@@ -0,0 +1,277 @@
+/*    thdrvar.h
+ *
+ *    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+=head1 Global Variables
+*/
+
+/***********************************************/
+/* Global only to current thread               */
+/***********************************************/
+
+/* Don't forget to re-run embed.pl to propagate changes! */
+
+/* The 'T' prefix is only needed for vars that need appropriate #defines
+ * generated when built with or without USE_5005THREADS.  It is also used
+ * to generate the appropriate export list for win32.
+ *
+ * When building without USE_5005THREADS, these variables will be truly global.
+ * When building without USE_5005THREADS but with MULTIPLICITY, these variables
+ * will be global per-interpreter. */
+
+/* Important ones in the first cache line (if alignment is done right) */
+
+#ifdef USE_5005THREADS
+PERLVAR(interp,		PerlInterpreter*)	/* thread owner */
+#endif
+
+PERLVAR(Tstack_sp,	SV **)		/* top of the stack */
+#ifdef OP_IN_REGISTER
+PERLVAR(Topsave,	OP *)
+#else
+PERLVAR(Top,		OP *)		/* currently executing op */
+#endif
+PERLVAR(Tcurpad,	SV **)		/* active pad (lexicals+tmps) */
+
+PERLVAR(Tstack_base,	SV **)
+PERLVAR(Tstack_max,	SV **)
+
+PERLVAR(Tscopestack,	I32 *)		/* scopes we've ENTERed */
+PERLVAR(Tscopestack_ix,	I32)
+PERLVAR(Tscopestack_max,I32)
+
+PERLVAR(Tsavestack,	ANY *)		/* items that need to be restored
+					   when LEAVEing scopes we've ENTERed */
+PERLVAR(Tsavestack_ix,	I32)
+PERLVAR(Tsavestack_max,	I32)
+
+PERLVAR(Ttmps_stack,	SV **)		/* mortals we've made */
+PERLVARI(Ttmps_ix,	I32,	-1)
+PERLVARI(Ttmps_floor,	I32,	-1)
+PERLVAR(Ttmps_max,	I32)
+
+PERLVAR(Tmarkstack,	I32 *)		/* stack_sp locations we're remembering */
+PERLVAR(Tmarkstack_ptr,	I32 *)
+PERLVAR(Tmarkstack_max,	I32 *)
+
+PERLVAR(Tretstack,	OP **)		/* OPs we have postponed executing */
+PERLVAR(Tretstack_ix,	I32)
+PERLVAR(Tretstack_max,	I32)
+
+PERLVAR(TSv,		SV *)		/* used to hold temporary values */
+PERLVAR(TXpv,		XPV *)		/* used to hold temporary values */
+
+/*
+=for apidoc Amn|STRLEN|PL_na
+
+A convenience variable which is typically used with C<SvPV> when one
+doesn't care about the length of the string.  It is usually more efficient
+to either declare a local variable and use that instead or to use the
+C<SvPV_nolen> macro.
+
+=cut
+*/
+
+PERLVAR(Tna,		STRLEN)		/* for use in SvPV when length is
+					   Not Applicable */
+
+/* stat stuff */
+PERLVAR(Tstatbuf,	Stat_t)
+PERLVAR(Tstatcache,	Stat_t)		/* _ */
+PERLVAR(Tstatgv,	GV *)
+PERLVARI(Tstatname,	SV *,	Nullsv)
+
+#ifdef HAS_TIMES
+PERLVAR(Ttimesbuf,	struct tms)
+#endif
+
+/* Fields used by magic variables such as $@, $/ and so on */
+PERLVAR(Ttainted,	bool)		/* using variables controlled by $< */
+PERLVAR(Tcurpm,		PMOP *)		/* what to do \ interps in REs from */
+PERLVAR(Tnrs,		SV *)		/* placeholder: unused since 5.8.0 (5.7.2 patch #12027 for bug ID 20010815.012) */
+
+/*
+=for apidoc mn|SV*|PL_rs
+
+The input record separator - C<$/> in Perl space.
+
+=for apidoc mn|GV*|PL_last_in_gv
+
+The GV which was last used for a filehandle input operation. (C<< <FH> >>)
+
+=for apidoc mn|SV*|PL_ofs_sv
+
+The output field separator - C<$,> in Perl space.
+
+=cut
+*/
+
+PERLVAR(Trs,		SV *)		/* input record separator $/ */
+PERLVAR(Tlast_in_gv,	GV *)		/* GV used in last <FH> */
+PERLVAR(Tofs_sv,	SV *)		/* output field separator $, */
+PERLVAR(Tdefoutgv,	GV *)		/* default FH for output */
+PERLVARI(Tchopset,	const char *,	" \n-")	/* $: */
+PERLVAR(Tformtarget,	SV *)
+PERLVAR(Tbodytarget,	SV *)
+PERLVAR(Ttoptarget,	SV *)
+
+/* Stashes */
+PERLVAR(Tdefstash,	HV *)		/* main symbol table */
+PERLVAR(Tcurstash,	HV *)		/* symbol table for current package */
+
+PERLVAR(Trestartop,	OP *)		/* propagating an error from croak? */
+PERLVARI(Tcurcop,	COP * VOL,	&PL_compiling)
+PERLVAR(Tin_eval,	VOL int)	/* trap "fatal" errors? */
+PERLVAR(Tdelaymagic,	int)		/* ($<,$>) = ... */
+PERLVARI(Tdirty,	bool, FALSE)	/* in the middle of tearing things down? */
+PERLVAR(Tlocalizing,	int)		/* are we processing a local() list? */
+
+PERLVAR(Tcurstack,	AV *)		/* THE STACK */
+PERLVAR(Tcurstackinfo,	PERL_SI *)	/* current stack + context */
+PERLVAR(Tmainstack,	AV *)		/* the stack when nothing funny is happening */
+
+PERLVAR(Ttop_env,	JMPENV *)	/* ptr. to current sigjmp() environment */
+PERLVAR(Tstart_env,	JMPENV)		/* empty startup sigjmp() environment */
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+PERLVARI(Tprotect,	protect_proc_t,	MEMBER_TO_FPTR(Perl_default_protect))
+#endif
+PERLVARI(Terrors,	SV *, Nullsv)	/* outstanding queued errors */
+
+/* statics "owned" by various functions */
+PERLVAR(Tav_fetch_sv,	SV *)		/* unused as of change #19268 */
+PERLVAR(Thv_fetch_sv,	SV *)		/* unused as of change #19268 */
+PERLVAR(Thv_fetch_ent_mh, HE*)		/* owned by hv_fetch_ent() */
+
+PERLVAR(Tmodcount,	I32)		/* how much mod()ification in assignment? */
+
+PERLVAR(Tlastgotoprobe,	OP*)		/* from pp_ctl.c */
+PERLVARI(Tdumpindent,	I32, 4)		/* # of blanks per dump indentation level */
+
+/* sort stuff */
+PERLVAR(Tsortcop,	OP *)		/* user defined sort routine */
+PERLVAR(Tsortstash,	HV *)		/* which is in some package or other */
+PERLVAR(Tfirstgv,	GV *)		/* $a */
+PERLVAR(Tsecondgv,	GV *)		/* $b */
+PERLVAR(Tsortcxix,	I32)		/* from pp_ctl.c */
+
+/* float buffer */
+PERLVAR(Tefloatbuf,	char*)
+PERLVAR(Tefloatsize,	STRLEN)
+
+/* regex stuff */
+
+PERLVAR(Tscreamfirst,	I32 *)
+PERLVAR(Tscreamnext,	I32 *)
+PERLVARI(Tmaxscream,	I32,	-1)
+PERLVAR(Tlastscream,	SV *)
+
+PERLVAR(Tregdummy,	regnode)	/* from regcomp.c */
+PERLVAR(Tregcomp_parse,	char*)		/* Input-scan pointer. */
+PERLVAR(Tregxend,	char*)		/* End of input for compile */
+PERLVAR(Tregcode,	regnode*)	/* Code-emit pointer; &regdummy = don't */
+PERLVAR(Tregnaughty,	I32)		/* How bad is this pattern? */
+PERLVAR(Tregsawback,	I32)		/* Did we see \1, ...? */
+PERLVAR(Tregprecomp,	char *)		/* uncompiled string. */
+PERLVAR(Tregnpar,	I32)		/* () count. */
+PERLVAR(Tregsize,	I32)		/* Code size. */
+PERLVAR(Tregflags,	U32)		/* are we folding, multilining? */
+PERLVAR(Tregseen,	U32)		/* from regcomp.c */
+PERLVAR(Tseen_zerolen,	I32)		/* from regcomp.c */
+PERLVAR(Tseen_evals,	I32)		/* from regcomp.c */
+PERLVAR(Tregcomp_rx,	regexp *)	/* from regcomp.c */
+PERLVAR(Textralen,	I32)		/* from regcomp.c */
+PERLVAR(Tcolorset,	int)		/* from regcomp.c */
+PERLVARA(Tcolors,6,	char *)		/* from regcomp.c */
+PERLVAR(Treg_whilem_seen, I32)		/* number of WHILEM in this expr */
+PERLVAR(Treginput,	char *)		/* String-input pointer. */
+PERLVAR(Tregbol,	char *)		/* Beginning of input, for ^ check. */
+PERLVAR(Tregeol,	char *)		/* End of input, for $ check. */
+PERLVAR(Tregstartp,	I32 *)		/* Pointer to startp array. */
+PERLVAR(Tregendp,	I32 *)		/* Ditto for endp. */
+PERLVAR(Treglastparen,	U32 *)		/* Similarly for lastparen. */
+PERLVAR(Treglastcloseparen, U32 *)	/* Similarly for lastcloseparen. */
+PERLVAR(Tregtill,	char *)		/* How far we are required to go. */
+PERLVAR(Tregcompat1,	char)		/* used to be regprev1 */
+PERLVAR(Treg_start_tmp,	char **)	/* from regexec.c */
+PERLVAR(Treg_start_tmpl,U32)		/* from regexec.c */
+PERLVAR(Tregdata,	struct reg_data *)
+					/* from regexec.c renamed was data */
+PERLVAR(Tbostr,		char *)		/* from regexec.c */
+PERLVAR(Treg_flags,	U32)		/* from regexec.c */
+PERLVAR(Treg_eval_set,	I32)		/* from regexec.c */
+PERLVAR(Tregnarrate,	I32)		/* from regexec.c */
+PERLVAR(Tregprogram,	regnode *)	/* from regexec.c */
+PERLVARI(Tregindent,	int,	    0)	/* from regexec.c */
+PERLVAR(Tregcc,		CURCUR *)	/* from regexec.c */
+PERLVAR(Treg_call_cc,	struct re_cc_state *)	/* from regexec.c */
+PERLVAR(Treg_re,	regexp *)	/* from regexec.c */
+PERLVAR(Treg_ganch,	char *)		/* position of \G */
+PERLVAR(Treg_sv,	SV *)		/* what we match against */
+PERLVAR(Treg_magic,	MAGIC *)	/* pos-magic of what we match */
+PERLVAR(Treg_oldpos,	I32)		/* old pos of what we match */
+PERLVARI(Treg_oldcurpm,	PMOP*, NULL)	/* curpm before match */
+PERLVARI(Treg_curpm,	PMOP*, NULL)	/* curpm during match */
+PERLVAR(Treg_oldsaved,	char*)		/* old saved substr during match */
+PERLVAR(Treg_oldsavedlen, STRLEN)	/* old length of saved substr during match */
+PERLVAR(Treg_maxiter,	I32)		/* max wait until caching pos */
+PERLVAR(Treg_leftiter,	I32)		/* wait until caching pos */
+PERLVARI(Treg_poscache, char *, Nullch)	/* cache of pos of WHILEM */
+PERLVAR(Treg_poscache_size, STRLEN)	/* size of pos cache of WHILEM */
+
+PERLVARI(Tpeepp,	peep_t, MEMBER_TO_FPTR(Perl_peep))
+					/* Pointer to peephole optimizer */
+PERLVARI(Tregcompp,	regcomp_t, MEMBER_TO_FPTR(Perl_pregcomp))
+					/* Pointer to REx compiler */
+PERLVARI(Tregexecp,	regexec_t, MEMBER_TO_FPTR(Perl_regexec_flags))
+					/* Pointer to REx executer */
+PERLVARI(Tregint_start,	re_intuit_start_t, MEMBER_TO_FPTR(Perl_re_intuit_start))
+					/* Pointer to optimized REx executer */
+PERLVARI(Tregint_string,re_intuit_string_t, MEMBER_TO_FPTR(Perl_re_intuit_string))
+					/* Pointer to optimized REx string */
+PERLVARI(Tregfree,	regfree_t, MEMBER_TO_FPTR(Perl_pregfree))
+					/* Pointer to REx free()er */
+
+PERLVARI(Treginterp_cnt,int,	    0)	/* Whether "Regexp" was interpolated. */
+PERLVARI(Treg_starttry,	char *,	    0)	/* -Dr: where regtry was called. */
+PERLVARI(Twatchaddr,	char **,    0)
+PERLVAR(Twatchok,	char *)
+
+/* Note that the variables below are all explicitly referenced in the code
+ * as thr->whatever and therefore don't need the 'T' prefix. */
+
+#ifdef USE_5005THREADS
+
+PERLVAR(oursv,		SV *)
+PERLVAR(cvcache,	HV *)
+PERLVAR(self,		perl_os_thread)	/* Underlying thread object */
+PERLVAR(flags,		U32)
+PERLVAR(threadsv,	AV *)		/* Per-thread SVs ($_, $@ etc.) */
+PERLVAR(threadsvp,	SV **)		/* AvARRAY(threadsv) */
+PERLVAR(specific,	AV *)		/* Thread-specific user data */
+PERLVAR(errsv,		SV *)		/* Backing SV for $@ */
+PERLVAR(mutex,		perl_mutex)	/* For the fields others can change */
+PERLVAR(tid,		U32)
+PERLVAR(prev,		struct perl_thread *)
+PERLVAR(next,		struct perl_thread *)
+					/* Circular linked list of threads */
+
+#ifdef HAVE_THREAD_INTERN
+PERLVAR(i,		struct thread_intern)
+					/* Platform-dependent internals */
+#endif
+
+PERLVAR(trailing_nul,	char)		/* For the sake of thrsv and oursv */
+PERLVAR(thr_done,	bool)		/* True when the thread has finished */
+
+#endif /* USE_5005THREADS */
+
+PERLVAR(Treg_match_utf8,	bool)		/* was what we matched against utf8 */
+
+PERLVAR(Tcomppad,	AV *)		/* storage for lexically scoped temporaries */
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/thread.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/thread.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/thread.h	(revision 14489)
@@ -0,0 +1,526 @@
+/*    thread.h
+ *
+ *    Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005
+ *    by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
+
+#if defined(VMS)
+#include <builtins.h>
+#endif
+
+#ifdef WIN32
+#  include <win32thread.h>
+#else
+#ifdef NETWARE
+#  include <nw5thread.h>
+#else
+#  ifdef OLD_PTHREADS_API /* Here be dragons. */
+#    define DETACH(t) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_detach(&(t)->self))) {		\
+	    MUTEX_UNLOCK(&(t)->mutex);				\
+	    Perl_croak_nocontext("panic: DETACH (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+	}							\
+    } STMT_END
+
+#    define PERL_GET_CONTEXT	Perl_get_context()
+#    define PERL_SET_CONTEXT(t)	Perl_set_context((void*)t)
+
+#    define PTHREAD_GETSPECIFIC_INT
+#    ifdef DJGPP
+#      define pthread_addr_t any_t
+#      define NEED_PTHREAD_INIT
+#      define PTHREAD_CREATE_JOINABLE (1)
+#    endif
+#    ifdef __OPEN_VM
+#      define pthread_addr_t void *
+#    endif
+#    ifdef OEMVS
+#      define pthread_addr_t void *
+#      define pthread_create(t,a,s,d)        pthread_create(t,&(a),s,d)
+#      define pthread_keycreate              pthread_key_create
+#    endif
+#    ifdef VMS
+#      define pthread_attr_init(a) pthread_attr_create(a)
+#      define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_setdetach_np(a,s)
+#      define PTHREAD_CREATE(t,a,s,d) pthread_create(t,a,s,d)
+#      define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
+#      define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
+#      define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
+#    endif
+#    if defined(__hpux) && defined(__ux_version) && __ux_version <= 1020
+#      define pthread_attr_init(a) pthread_attr_create(a)
+       /* XXX pthread_setdetach_np() missing in DCE threads on HP-UX 10.20 */
+#      define PTHREAD_ATTR_SETDETACHSTATE(a,s)	(0)
+#      define PTHREAD_CREATE(t,a,s,d) pthread_create(t,a,s,d)
+#      define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
+#      define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
+#      define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
+#    endif
+#    if defined(DJGPP) || defined(__OPEN_VM) || defined(OEMVS)
+#      define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,&(s))
+#      define YIELD pthread_yield(NULL)
+#    endif
+#  endif
+#  if !defined(__hpux) || !defined(__ux_version) || __ux_version > 1020
+#    define pthread_mutexattr_default NULL
+#    define pthread_condattr_default  NULL
+#  endif
+#endif	/* NETWARE */
+#endif
+
+#ifndef PTHREAD_CREATE
+/* You are not supposed to pass NULL as the 2nd arg of PTHREAD_CREATE(). */
+#  define PTHREAD_CREATE(t,a,s,d) pthread_create(t,&(a),s,d)
+#endif
+
+#ifndef PTHREAD_ATTR_SETDETACHSTATE
+#  define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,s)
+#endif
+
+#ifndef PTHREAD_CREATE_JOINABLE
+#  ifdef OLD_PTHREAD_CREATE_JOINABLE
+#    define PTHREAD_CREATE_JOINABLE OLD_PTHREAD_CREATE_JOINABLE
+#  else
+#    define PTHREAD_CREATE_JOINABLE 0 /* Panic?  No, guess. */
+#  endif
+#endif
+
+#ifdef DGUX
+#  define THREAD_CREATE_NEEDS_STACK (32*1024)
+#endif
+
+#ifdef I_MACH_CTHREADS
+
+/* cthreads interface */
+
+/* #include <mach/cthreads.h> is in perl.h #ifdef I_MACH_CTHREADS */
+
+#define MUTEX_INIT(m) \
+    STMT_START {						\
+	*m = mutex_alloc();					\
+	if (*m) {						\
+	    mutex_init(*m);					\
+	} else {						\
+	    Perl_croak_nocontext("panic: MUTEX_INIT [%s:%d]",	\
+				 __FILE__, __LINE__);		\
+	}							\
+    } STMT_END
+
+#define MUTEX_LOCK(m)			mutex_lock(*m)
+#define MUTEX_UNLOCK(m)			mutex_unlock(*m)
+#define MUTEX_DESTROY(m) \
+    STMT_START {						\
+	mutex_free(*m);						\
+	*m = 0;							\
+    } STMT_END
+
+#define COND_INIT(c) \
+    STMT_START {						\
+	*c = condition_alloc();					\
+	if (*c) {						\
+	    condition_init(*c);					\
+	}							\
+	else {							\
+	    Perl_croak_nocontext("panic: COND_INIT [%s:%d]",	\
+				 __FILE__, __LINE__);		\
+	}							\
+    } STMT_END
+
+#define COND_SIGNAL(c)		condition_signal(*c)
+#define COND_BROADCAST(c)	condition_broadcast(*c)
+#define COND_WAIT(c, m)		condition_wait(*c, *m)
+#define COND_DESTROY(c) \
+    STMT_START {						\
+	condition_free(*c);					\
+	*c = 0;							\
+    } STMT_END
+
+#define THREAD_CREATE(thr, f)	(thr->self = cthread_fork(f, thr), 0)
+#define THREAD_POST_CREATE(thr)
+
+#define THREAD_RET_TYPE		any_t
+#define THREAD_RET_CAST(x)	((any_t) x)
+
+#define DETACH(t)		cthread_detach(t->self)
+#define JOIN(t, avp)		(*(avp) = (AV *)cthread_join(t->self))
+
+#define PERL_SET_CONTEXT(t)	cthread_set_data(cthread_self(), t)
+#define PERL_GET_CONTEXT	cthread_data(cthread_self())
+
+#define INIT_THREADS		cthread_init()
+#define YIELD			cthread_yield()
+#define ALLOC_THREAD_KEY	NOOP
+#define FREE_THREAD_KEY		NOOP
+#define SET_THREAD_SELF(thr)	(thr->self = cthread_self())
+
+#endif /* I_MACH_CTHREADS */
+
+#ifndef YIELD
+#  ifdef SCHED_YIELD
+#    define YIELD SCHED_YIELD
+#  else
+#    ifdef HAS_SCHED_YIELD
+#      define YIELD sched_yield()
+#    else
+#      ifdef HAS_PTHREAD_YIELD
+    /* pthread_yield(NULL) platforms are expected
+     * to have #defined YIELD for themselves. */
+#        define YIELD pthread_yield()
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __hpux
+#  define MUTEX_INIT_NEEDS_MUTEX_ZEROED
+#endif
+
+#ifndef MUTEX_INIT
+
+#  ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED
+    /* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */
+#    define MUTEX_INIT(m) \
+    STMT_START {						\
+	int _eC_;						\
+	Zero((m), 1, perl_mutex);                               \
+ 	if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default)))	\
+	    Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+#  else
+#    define MUTEX_INIT(m) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default)))	\
+	    Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+#  endif
+
+#  define MUTEX_LOCK(m) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_mutex_lock((m))))			\
+	    Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+
+#  define MUTEX_UNLOCK(m) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_mutex_unlock((m))))			\
+	    Perl_croak_nocontext("panic: MUTEX_UNLOCK (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+
+#  define MUTEX_DESTROY(m) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_mutex_destroy((m))))		\
+	    Perl_croak_nocontext("panic: MUTEX_DESTROY (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+#endif /* MUTEX_INIT */
+
+#ifndef COND_INIT
+#  define COND_INIT(c) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_cond_init((c), pthread_condattr_default)))	\
+	    Perl_croak_nocontext("panic: COND_INIT (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+
+#  define COND_SIGNAL(c) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_cond_signal((c))))			\
+	    Perl_croak_nocontext("panic: COND_SIGNAL (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+
+#  define COND_BROADCAST(c) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_cond_broadcast((c))))		\
+	    Perl_croak_nocontext("panic: COND_BROADCAST (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+
+#  define COND_WAIT(c, m) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_cond_wait((c), (m))))		\
+	    Perl_croak_nocontext("panic: COND_WAIT (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+
+#  define COND_DESTROY(c) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_cond_destroy((c))))			\
+	    Perl_croak_nocontext("panic: COND_DESTROY (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+#endif /* COND_INIT */
+
+/* DETACH(t) must only be called while holding t->mutex */
+#ifndef DETACH
+#  define DETACH(t) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_detach((t)->self))) {		\
+	    MUTEX_UNLOCK(&(t)->mutex);				\
+	    Perl_croak_nocontext("panic: DETACH (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+	}							\
+    } STMT_END
+#endif /* DETACH */
+
+#ifndef JOIN
+#  define JOIN(t, avp) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_join((t)->self, (void**)(avp))))	\
+	    Perl_croak_nocontext("panic: pthread_join (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+#endif /* JOIN */
+
+/* Use an unchecked fetch of thread-specific data instead of a checked one.
+ * It would fail if the key were bogus, but if the key were bogus then
+ * Really Bad Things would be happening anyway. --dan */
+#if (defined(__ALPHA) && (__VMS_VER >= 70000000)) || \
+    (defined(__alpha) && defined(__osf__) && !defined(__GNUC__)) /* Available only on >= 4.0 */
+#  define HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP /* Configure test needed */
+#endif
+
+#ifdef HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP
+#  define PTHREAD_GETSPECIFIC(key) pthread_unchecked_getspecific_np(key)
+#else
+#    define PTHREAD_GETSPECIFIC(key) pthread_getspecific(key)
+#endif
+
+#ifndef PERL_GET_CONTEXT
+#  define PERL_GET_CONTEXT	PTHREAD_GETSPECIFIC(PL_thr_key)
+#endif
+
+#ifndef PERL_SET_CONTEXT
+#  define PERL_SET_CONTEXT(t) \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_setspecific(PL_thr_key, (void *)(t))))	\
+	    Perl_croak_nocontext("panic: pthread_setspecific (%d) [%s:%d]",	\
+				 _eC_, __FILE__, __LINE__);	\
+    } STMT_END
+#endif /* PERL_SET_CONTEXT */
+
+#ifndef INIT_THREADS
+#  ifdef NEED_PTHREAD_INIT
+#    define INIT_THREADS pthread_init()
+#  endif
+#endif
+
+#ifndef ALLOC_THREAD_KEY
+#  define ALLOC_THREAD_KEY \
+    STMT_START {						\
+	int _eC_;						\
+	if ((_eC_ = pthread_key_create(&PL_thr_key, 0))) {	\
+            write(2, "panic: pthread_key_create failed\n", 33); \
+	    exit(1);						\
+	}							\
+    } STMT_END
+#endif
+
+#ifndef FREE_THREAD_KEY
+#  define FREE_THREAD_KEY \
+    STMT_START {						\
+	pthread_key_delete(PL_thr_key);				\
+    } STMT_END
+#endif
+
+#ifndef PTHREAD_ATFORK
+#  ifdef HAS_PTHREAD_ATFORK
+#    define PTHREAD_ATFORK(prepare,parent,child)		\
+	pthread_atfork(prepare,parent,child)
+#  else
+#    define PTHREAD_ATFORK(prepare,parent,child)		\
+	NOOP
+#  endif
+#endif
+
+#ifndef THREAD_RET_TYPE
+#  define THREAD_RET_TYPE	void *
+#  define THREAD_RET_CAST(p)	((void *)(p))
+#endif /* THREAD_RET */
+
+#if defined(USE_5005THREADS)
+
+/* Accessor for per-thread SVs */
+#  define THREADSV(i) (thr->threadsvp[i])
+
+/*
+ * LOCK_SV_MUTEX and UNLOCK_SV_MUTEX are performance-critical. Here, we
+ * try only locking them if there may be more than one thread in existence.
+ * Systems with very fast mutexes (and/or slow conditionals) may wish to
+ * remove the "if (threadnum) ..." test.
+ * XXX do NOT use C<if (PL_threadnum) ...> -- it sets up race conditions!
+ */
+#  define LOCK_SV_MUTEX		MUTEX_LOCK(&PL_sv_mutex)
+#  define UNLOCK_SV_MUTEX	MUTEX_UNLOCK(&PL_sv_mutex)
+#  define LOCK_STRTAB_MUTEX	MUTEX_LOCK(&PL_strtab_mutex)
+#  define UNLOCK_STRTAB_MUTEX	MUTEX_UNLOCK(&PL_strtab_mutex)
+#  define LOCK_CRED_MUTEX	MUTEX_LOCK(&PL_cred_mutex)
+#  define UNLOCK_CRED_MUTEX	MUTEX_UNLOCK(&PL_cred_mutex)
+#  define LOCK_FDPID_MUTEX	MUTEX_LOCK(&PL_fdpid_mutex)
+#  define UNLOCK_FDPID_MUTEX	MUTEX_UNLOCK(&PL_fdpid_mutex)
+#  define LOCK_SV_LOCK_MUTEX	MUTEX_LOCK(&PL_sv_lock_mutex)
+#  define UNLOCK_SV_LOCK_MUTEX	MUTEX_UNLOCK(&PL_sv_lock_mutex)
+
+/* Values and macros for thr->flags */
+#define THRf_STATE_MASK	7
+#define THRf_R_JOINABLE	0
+#define THRf_R_JOINED	1
+#define THRf_R_DETACHED	2
+#define THRf_ZOMBIE	3
+#define THRf_DEAD	4
+
+#define THRf_DID_DIE	8
+
+/* ThrSTATE(t) and ThrSETSTATE(t) must only be called while holding t->mutex */
+#define ThrSTATE(t) ((t)->flags & THRf_STATE_MASK)
+#define ThrSETSTATE(t, s) STMT_START {		\
+	(t)->flags &= ~THRf_STATE_MASK;		\
+	(t)->flags |= (s);			\
+	DEBUG_S(PerlIO_printf(Perl_debug_log,	\
+			      "thread %p set to state %d\n", (t), (s))); \
+    } STMT_END
+
+typedef struct condpair {
+    perl_mutex	mutex;		/* Protects all other fields */
+    perl_cond	owner_cond;	/* For when owner changes at all */
+    perl_cond	cond;		/* For cond_signal and cond_broadcast */
+    Thread	owner;		/* Currently owning thread */
+} condpair_t;
+
+#define MgMUTEXP(mg) (&((condpair_t *)(mg->mg_ptr))->mutex)
+#define MgOWNERCONDP(mg) (&((condpair_t *)(mg->mg_ptr))->owner_cond)
+#define MgCONDP(mg) (&((condpair_t *)(mg->mg_ptr))->cond)
+#define MgOWNER(mg) ((condpair_t *)(mg->mg_ptr))->owner
+
+#endif /* USE_5005THREADS */
+
+#  define LOCK_DOLLARZERO_MUTEX		MUTEX_LOCK(&PL_dollarzero_mutex)
+#  define UNLOCK_DOLLARZERO_MUTEX	MUTEX_UNLOCK(&PL_dollarzero_mutex)
+
+#endif /* USE_5005THREADS || USE_ITHREADS */
+
+#ifndef MUTEX_LOCK
+#  define MUTEX_LOCK(m)
+#endif
+
+#ifndef MUTEX_UNLOCK
+#  define MUTEX_UNLOCK(m)
+#endif
+
+#ifndef MUTEX_INIT
+#  define MUTEX_INIT(m)
+#endif
+
+#ifndef MUTEX_DESTROY
+#  define MUTEX_DESTROY(m)
+#endif
+
+#ifndef COND_INIT
+#  define COND_INIT(c)
+#endif
+
+#ifndef COND_SIGNAL
+#  define COND_SIGNAL(c)
+#endif
+
+#ifndef COND_BROADCAST
+#  define COND_BROADCAST(c)
+#endif
+
+#ifndef COND_WAIT
+#  define COND_WAIT(c, m)
+#endif
+
+#ifndef COND_DESTROY
+#  define COND_DESTROY(c)
+#endif
+
+#ifndef LOCK_SV_MUTEX
+#  define LOCK_SV_MUTEX
+#endif
+
+#ifndef UNLOCK_SV_MUTEX
+#  define UNLOCK_SV_MUTEX
+#endif
+
+#ifndef LOCK_STRTAB_MUTEX
+#  define LOCK_STRTAB_MUTEX
+#endif
+
+#ifndef UNLOCK_STRTAB_MUTEX
+#  define UNLOCK_STRTAB_MUTEX
+#endif
+
+#ifndef LOCK_CRED_MUTEX
+#  define LOCK_CRED_MUTEX
+#endif
+
+#ifndef UNLOCK_CRED_MUTEX
+#  define UNLOCK_CRED_MUTEX
+#endif
+
+#ifndef LOCK_FDPID_MUTEX
+#  define LOCK_FDPID_MUTEX
+#endif
+
+#ifndef UNLOCK_FDPID_MUTEX
+#  define UNLOCK_FDPID_MUTEX
+#endif
+
+#ifndef LOCK_SV_LOCK_MUTEX
+#  define LOCK_SV_LOCK_MUTEX
+#endif
+
+#ifndef UNLOCK_SV_LOCK_MUTEX
+#  define UNLOCK_SV_LOCK_MUTEX
+#endif
+
+#ifndef LOCK_DOLLARZERO_MUTEX
+#  define LOCK_DOLLARZERO_MUTEX
+#endif
+
+#ifndef UNLOCK_DOLLARZERO_MUTEX
+#  define UNLOCK_DOLLARZERO_MUTEX
+#endif
+
+/* THR, SET_THR, and dTHR are there for compatibility with old versions */
+#ifndef THR
+#  define THR		PERL_GET_THX
+#endif
+
+#ifndef SET_THR
+#  define SET_THR(t)	PERL_SET_THX(t)
+#endif
+
+#ifndef dTHR
+#  define dTHR dNOOP
+#endif
+
+#ifndef INIT_THREADS
+#  define INIT_THREADS NOOP
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/uconfig.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/uconfig.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/uconfig.h	(revision 14489)
@@ -0,0 +1,4351 @@
+/*
+ * This file was produced by running the config_h.SH script, which
+ * gets its values from uconfig.sh, which is generally produced by
+ * running Configure.
+ *
+ * Feel free to modify any of this as the need arises.  Note, however,
+ * that running config_h.SH again will wipe out any changes you've made.
+ * For a more permanent change edit uconfig.sh and rerun config_h.SH.
+ *
+ * $Id: Config_h.U,v 3.0.1.5 1997/02/28 14:57:43 ram Exp $
+ */
+
+/*
+ * Package name      : 
+ * Source directory  : 
+ * Configuration time: 
+ * Configured by     : 
+ * Target system     : unknown
+ */
+
+#ifndef _config_h_
+#define _config_h_
+
+/* LOC_SED:
+ *	This symbol holds the complete pathname to the sed program.
+ */
+#define LOC_SED 	""	/**/
+
+/* HAS_ALARM:
+ *	This symbol, if defined, indicates that the alarm routine is
+ *	available.
+ */
+/*#define HAS_ALARM		/ **/
+
+/* HAS_BCMP:
+ *	This symbol is defined if the bcmp() routine is available to
+ *	compare blocks of memory.
+ */
+/*#define HAS_BCMP	/ **/
+
+/* HAS_BCOPY:
+ *	This symbol is defined if the bcopy() routine is available to
+ *	copy blocks of memory.
+ */
+/*#define HAS_BCOPY	/ **/
+
+/* HAS_BZERO:
+ *	This symbol is defined if the bzero() routine is available to
+ *	set a memory block to 0.
+ */
+/*#define HAS_BZERO	/ **/
+
+/* HAS_CHOWN:
+ *	This symbol, if defined, indicates that the chown routine is
+ *	available.
+ */
+/*#define HAS_CHOWN		/ **/
+
+/* HAS_CHROOT:
+ *	This symbol, if defined, indicates that the chroot routine is
+ *	available.
+ */
+/*#define HAS_CHROOT		/ **/
+
+/* HAS_CHSIZE:
+ *	This symbol, if defined, indicates that the chsize routine is available
+ *	to truncate files.  You might need a -lx to get this routine.
+ */
+/*#define	HAS_CHSIZE		/ **/
+
+/* HASCONST:
+ *	This symbol, if defined, indicates that this C compiler knows about
+ *	the const type. There is no need to actually test for that symbol
+ *	within your programs. The mere use of the "const" keyword will
+ *	trigger the necessary tests.
+ */
+/*#define HASCONST	/ **/
+#ifndef HASCONST
+#define const
+#endif
+
+/* HAS_CUSERID:
+ *	This symbol, if defined, indicates that the cuserid routine is
+ *	available to get character login names.
+ */
+/*#define HAS_CUSERID		/ **/
+
+/* HAS_DBL_DIG:
+ *	This symbol, if defined, indicates that this system's <float.h>
+ *	or <limits.h> defines the symbol DBL_DIG, which is the number
+ *	of significant digits in a double precision number.  If this
+ *	symbol is not defined, a guess of 15 is usually pretty good.
+ */
+/*#define HAS_DBL_DIG 	/ * */
+
+/* HAS_DIFFTIME:
+ *	This symbol, if defined, indicates that the difftime routine is
+ *	available.
+ */
+/*#define HAS_DIFFTIME		/ **/
+
+/* HAS_DLERROR:
+ *	This symbol, if defined, indicates that the dlerror routine is
+ *	available to return a string describing the last error that
+ *	occurred from a call to dlopen(), dlclose() or dlsym().
+ */
+/*#define HAS_DLERROR	/ **/
+
+/* HAS_DUP2:
+ *	This symbol, if defined, indicates that the dup2 routine is
+ *	available to duplicate file descriptors.
+ */
+/*#define HAS_DUP2	/ **/
+
+/* HAS_FCHMOD:
+ *	This symbol, if defined, indicates that the fchmod routine is available
+ *	to change mode of opened files.  If unavailable, use chmod().
+ */
+/*#define HAS_FCHMOD		/ **/
+
+/* HAS_FCHOWN:
+ *	This symbol, if defined, indicates that the fchown routine is available
+ *	to change ownership of opened files.  If unavailable, use chown().
+ */
+/*#define HAS_FCHOWN		/ **/
+
+/* HAS_FCNTL:
+ *	This symbol, if defined, indicates to the C program that
+ *	the fcntl() function exists.
+ */
+/*#define HAS_FCNTL		/ **/
+
+/* HAS_FGETPOS:
+ *	This symbol, if defined, indicates that the fgetpos routine is
+ *	available to get the file position indicator, similar to ftell().
+ */
+/*#define HAS_FGETPOS	/ **/
+
+/* HAS_FLOCK:
+ *	This symbol, if defined, indicates that the flock routine is
+ *	available to do file locking.
+ */
+/*#define HAS_FLOCK		/ **/
+
+/* HAS_FORK:
+ *	This symbol, if defined, indicates that the fork routine is
+ *	available.
+ */
+#define HAS_FORK		/**/
+
+/* HAS_FSETPOS:
+ *	This symbol, if defined, indicates that the fsetpos routine is
+ *	available to set the file position indicator, similar to fseek().
+ */
+/*#define HAS_FSETPOS	/ **/
+
+/* HAS_GETTIMEOFDAY:
+ *	This symbol, if defined, indicates that the gettimeofday() system
+ *	call is available for a sub-second accuracy clock. Usually, the file
+ *	<sys/resource.h> needs to be included (see I_SYS_RESOURCE).
+ *	The type "Timeval" should be used to refer to "struct timeval".
+ */
+/*#define HAS_GETTIMEOFDAY	/ **/
+#ifdef HAS_GETTIMEOFDAY
+#define Timeval struct timeval	/* Structure used by gettimeofday() */
+#endif
+
+/* HAS_GETGROUPS:
+ *	This symbol, if defined, indicates that the getgroups() routine is
+ *	available to get the list of process groups.  If unavailable, multiple
+ *	groups are probably not supported.
+ */
+/*#define HAS_GETGROUPS		/ **/
+
+/* HAS_GETLOGIN:
+ *	This symbol, if defined, indicates that the getlogin routine is
+ *	available to get the login name.
+ */
+/*#define HAS_GETLOGIN		/ **/
+
+/* HAS_GETPGID:
+ *	This symbol, if defined, indicates to the C program that 
+ *	the getpgid(pid) function is available to get the
+ *	process group id.
+ */
+/*#define HAS_GETPGID		/ **/
+
+/* HAS_GETPGRP2:
+ *	This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
+ *	routine is available to get the current process group.
+ */
+/*#define HAS_GETPGRP2		/ **/
+
+/* HAS_GETPPID:
+ *	This symbol, if defined, indicates that the getppid routine is
+ *	available to get the parent process ID.
+ */
+/*#define HAS_GETPPID		/ **/
+
+/* HAS_GETPRIORITY:
+ *	This symbol, if defined, indicates that the getpriority routine is
+ *	available to get a process's priority.
+ */
+/*#define HAS_GETPRIORITY		/ **/
+
+/* HAS_INET_ATON:
+ *	This symbol, if defined, indicates to the C program that the
+ *	inet_aton() function is available to parse IP address "dotted-quad"
+ *	strings.
+ */
+/*#define HAS_INET_ATON		/ **/
+
+/* HAS_KILLPG:
+ *	This symbol, if defined, indicates that the killpg routine is available
+ *	to kill process groups.  If unavailable, you probably should use kill
+ *	with a negative process number.
+ */
+/*#define HAS_KILLPG	/ **/
+
+/* HAS_LINK:
+ *	This symbol, if defined, indicates that the link routine is
+ *	available to create hard links.
+ */
+/*#define HAS_LINK	/ **/
+
+/* HAS_LOCALECONV:
+ *	This symbol, if defined, indicates that the localeconv routine is
+ *	available for numeric and monetary formatting conventions.
+ */
+/*#define HAS_LOCALECONV	/ **/
+
+/* HAS_LOCKF:
+ *	This symbol, if defined, indicates that the lockf routine is
+ *	available to do file locking.
+ */
+/*#define HAS_LOCKF		/ **/
+
+/* HAS_LSTAT:
+ *	This symbol, if defined, indicates that the lstat routine is
+ *	available to do file stats on symbolic links.
+ */
+/*#define HAS_LSTAT		/ **/
+
+/* HAS_MBLEN:
+ *	This symbol, if defined, indicates that the mblen routine is available
+ *	to find the number of bytes in a multibye character.
+ */
+/*#define HAS_MBLEN		/ **/
+
+/* HAS_MBSTOWCS:
+ *	This symbol, if defined, indicates that the mbstowcs routine is
+ *	available to covert a multibyte string into a wide character string.
+ */
+/*#define	HAS_MBSTOWCS		/ **/
+
+/* HAS_MBTOWC:
+ *	This symbol, if defined, indicates that the mbtowc routine is available
+ *	to covert a multibyte to a wide character.
+ */
+/*#define HAS_MBTOWC		/ **/
+
+/* HAS_MEMCMP:
+ *	This symbol, if defined, indicates that the memcmp routine is available
+ *	to compare blocks of memory.
+ */
+/*#define HAS_MEMCMP	/ **/
+
+/* HAS_MEMCPY:
+ *	This symbol, if defined, indicates that the memcpy routine is available
+ *	to copy blocks of memory.
+ */
+/*#define HAS_MEMCPY	/ **/
+
+/* HAS_MEMMOVE:
+ *	This symbol, if defined, indicates that the memmove routine is available
+ *	to copy potentially overlapping blocks of memory. This should be used
+ *	only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your
+ *	own version.
+ */
+/*#define HAS_MEMMOVE	/ **/
+
+/* HAS_MEMSET:
+ *	This symbol, if defined, indicates that the memset routine is available
+ *	to set blocks of memory.
+ */
+/*#define HAS_MEMSET	/ **/
+
+/* HAS_MKDIR:
+ *	This symbol, if defined, indicates that the mkdir routine is available
+ *	to create directories.  Otherwise you should fork off a new process to
+ *	exec /bin/mkdir.
+ */
+/*#define HAS_MKDIR		/ **/
+
+/* HAS_MKFIFO:
+ *	This symbol, if defined, indicates that the mkfifo routine is
+ *	available to create FIFOs. Otherwise, mknod should be able to
+ *	do it for you. However, if mkfifo is there, mknod might require
+ *	super-user privileges which mkfifo will not.
+ */
+/*#define HAS_MKFIFO		/ **/
+
+/* HAS_MKTIME:
+ *	This symbol, if defined, indicates that the mktime routine is
+ *	available.
+ */
+/*#define HAS_MKTIME		/ **/
+
+/* HAS_MSYNC:
+ *	This symbol, if defined, indicates that the msync system call is
+ *	available to synchronize a mapped file.
+ */
+/*#define HAS_MSYNC		/ **/
+
+/* HAS_MUNMAP:
+ *	This symbol, if defined, indicates that the munmap system call is
+ *	available to unmap a region, usually mapped by mmap().
+ */
+/*#define HAS_MUNMAP		/ **/
+
+/* HAS_NICE:
+ *	This symbol, if defined, indicates that the nice routine is
+ *	available.
+ */
+/*#define HAS_NICE		/ **/
+
+/* HAS_PATHCONF:
+ *	This symbol, if defined, indicates that pathconf() is available
+ *	to determine file-system related limits and options associated
+ *	with a given filename.
+ */
+/* HAS_FPATHCONF:
+ *	This symbol, if defined, indicates that pathconf() is available
+ *	to determine file-system related limits and options associated
+ *	with a given open file descriptor.
+ */
+/*#define HAS_PATHCONF		/ **/
+/*#define HAS_FPATHCONF		/ **/
+
+/* HAS_PAUSE:
+ *	This symbol, if defined, indicates that the pause routine is
+ *	available to suspend a process until a signal is received.
+ */
+/*#define HAS_PAUSE		/ **/
+
+/* HAS_PIPE:
+ *	This symbol, if defined, indicates that the pipe routine is
+ *	available to create an inter-process channel.
+ */
+/*#define HAS_PIPE		/ **/
+
+/* HAS_POLL:
+ *	This symbol, if defined, indicates that the poll routine is
+ *	available to poll active file descriptors. You may safely
+ *	include <poll.h> when this symbol is defined.
+ */
+/*#define HAS_POLL		/ **/
+
+/* HAS_READDIR:
+ *	This symbol, if defined, indicates that the readdir routine is
+ *	available to read directory entries. You may have to include
+ *	<dirent.h>. See I_DIRENT.
+ */
+#define HAS_READDIR		/**/
+
+/* HAS_SEEKDIR:
+ *	This symbol, if defined, indicates that the seekdir routine is
+ *	available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+/*#define HAS_SEEKDIR		/ **/
+
+/* HAS_TELLDIR:
+ *	This symbol, if defined, indicates that the telldir routine is
+ *	available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+/*#define HAS_TELLDIR		/ **/
+
+/* HAS_REWINDDIR:
+ *	This symbol, if defined, indicates that the rewinddir routine is
+ *	available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+/*#define HAS_REWINDDIR		/ **/
+
+/* HAS_READLINK:
+ *	This symbol, if defined, indicates that the readlink routine is
+ *	available to read the value of a symbolic link.
+ */
+/*#define HAS_READLINK		/ **/
+
+/* HAS_RENAME:
+ *	This symbol, if defined, indicates that the rename routine is available
+ *	to rename files.  Otherwise you should do the unlink(), link(), unlink()
+ *	trick.
+ */
+#define HAS_RENAME	/**/
+
+/* HAS_RMDIR:
+ *	This symbol, if defined, indicates that the rmdir routine is
+ *	available to remove directories. Otherwise you should fork off a
+ *	new process to exec /bin/rmdir.
+ */
+/*#define HAS_RMDIR		/ **/
+
+/* HAS_SELECT:
+ *	This symbol, if defined, indicates that the select routine is
+ *	available to select active file descriptors. If the timeout field
+ *	is used, <sys/time.h> may need to be included.
+ */
+/*#define HAS_SELECT	/ **/
+
+/* HAS_SETEGID:
+ *	This symbol, if defined, indicates that the setegid routine is available
+ *	to change the effective gid of the current program.
+ */
+/*#define HAS_SETEGID		/ **/
+
+/* HAS_SETEUID:
+ *	This symbol, if defined, indicates that the seteuid routine is available
+ *	to change the effective uid of the current program.
+ */
+/*#define HAS_SETEUID		/ **/
+
+/* HAS_SETLINEBUF:
+ *	This symbol, if defined, indicates that the setlinebuf routine is
+ *	available to change stderr or stdout from block-buffered or unbuffered
+ *	to a line-buffered mode.
+ */
+/*#define HAS_SETLINEBUF		/ **/
+
+/* HAS_SETLOCALE:
+ *	This symbol, if defined, indicates that the setlocale routine is
+ *	available to handle locale-specific ctype implementations.
+ */
+/*#define HAS_SETLOCALE	/ **/
+
+/* HAS_SETPGID:
+ *	This symbol, if defined, indicates that the setpgid(pid, gpid)
+ *	routine is available to set process group ID.
+ */
+/*#define HAS_SETPGID	/ **/
+
+/* HAS_SETPGRP2:
+ *	This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
+ *	routine is available to set the current process group.
+ */
+/*#define HAS_SETPGRP2		/ **/
+
+/* HAS_SETPRIORITY:
+ *	This symbol, if defined, indicates that the setpriority routine is
+ *	available to set a process's priority.
+ */
+/*#define HAS_SETPRIORITY		/ **/
+
+/* HAS_SETREGID:
+ *	This symbol, if defined, indicates that the setregid routine is
+ *	available to change the real and effective gid of the current
+ *	process.
+ */
+/* HAS_SETRESGID:
+ *	This symbol, if defined, indicates that the setresgid routine is
+ *	available to change the real, effective and saved gid of the current
+ *	process.
+ */
+/*#define HAS_SETREGID		/ **/
+/*#define HAS_SETRESGID		/ **/
+
+/* HAS_SETREUID:
+ *	This symbol, if defined, indicates that the setreuid routine is
+ *	available to change the real and effective uid of the current
+ *	process.
+ */
+/* HAS_SETRESUID:
+ *	This symbol, if defined, indicates that the setresuid routine is
+ *	available to change the real, effective and saved uid of the current
+ *	process.
+ */
+/*#define HAS_SETREUID		/ **/
+/*#define HAS_SETRESUID		/ **/
+
+/* HAS_SETRGID:
+ *	This symbol, if defined, indicates that the setrgid routine is available
+ *	to change the real gid of the current program.
+ */
+/*#define HAS_SETRGID		/ **/
+
+/* HAS_SETRUID:
+ *	This symbol, if defined, indicates that the setruid routine is available
+ *	to change the real uid of the current program.
+ */
+/*#define HAS_SETRUID		/ **/
+
+/* HAS_SETSID:
+ *	This symbol, if defined, indicates that the setsid routine is
+ *	available to set the process group ID.
+ */
+/*#define HAS_SETSID	/ **/
+
+/* HAS_STRCHR:
+ *	This symbol is defined to indicate that the strchr()/strrchr()
+ *	functions are available for string searching. If not, try the
+ *	index()/rindex() pair.
+ */
+/* HAS_INDEX:
+ *	This symbol is defined to indicate that the index()/rindex()
+ *	functions are available for string searching.
+ */
+/*#define HAS_STRCHR	/ **/
+/*#define HAS_INDEX	/ **/
+
+/* HAS_STRCOLL:
+ *	This symbol, if defined, indicates that the strcoll routine is
+ *	available to compare strings using collating information.
+ */
+/*#define HAS_STRCOLL	/ **/
+
+/* USE_STRUCT_COPY:
+ *	This symbol, if defined, indicates that this C compiler knows how
+ *	to copy structures.  If undefined, you'll need to use a block copy
+ *	routine of some sort instead.
+ */
+/*#define	USE_STRUCT_COPY	/ **/
+
+/* HAS_STRTOD:
+ *	This symbol, if defined, indicates that the strtod routine is
+ *	available to provide better numeric string conversion than atof().
+ */
+/*#define HAS_STRTOD	/ **/
+
+/* HAS_STRTOL:
+ *	This symbol, if defined, indicates that the strtol routine is available
+ *	to provide better numeric string conversion than atoi() and friends.
+ */
+/*#define HAS_STRTOL	/ **/
+
+/* HAS_STRXFRM:
+ *	This symbol, if defined, indicates that the strxfrm() routine is
+ *	available to transform strings.
+ */
+/*#define HAS_STRXFRM	/ **/
+
+/* HAS_SYMLINK:
+ *	This symbol, if defined, indicates that the symlink routine is available
+ *	to create symbolic links.
+ */
+/*#define HAS_SYMLINK	/ **/
+
+/* HAS_SYSCALL:
+ *	This symbol, if defined, indicates that the syscall routine is
+ *	available to call arbitrary system calls. If undefined, that's tough.
+ */
+/*#define HAS_SYSCALL	/ **/
+
+/* HAS_SYSCONF:
+ *	This symbol, if defined, indicates that sysconf() is available
+ *	to determine system related limits and options.
+ */
+/*#define HAS_SYSCONF	/ **/
+
+/* HAS_SYSTEM:
+ *	This symbol, if defined, indicates that the system routine is
+ *	available to issue a shell command.
+ */
+/*#define HAS_SYSTEM	/ **/
+
+/* HAS_TCGETPGRP:
+ *	This symbol, if defined, indicates that the tcgetpgrp routine is
+ *	available to get foreground process group ID.
+ */
+/*#define HAS_TCGETPGRP		/ **/
+
+/* HAS_TCSETPGRP:
+ *	This symbol, if defined, indicates that the tcsetpgrp routine is
+ *	available to set foreground process group ID.
+ */
+/*#define HAS_TCSETPGRP		/ **/
+
+/* HAS_TRUNCATE:
+ *	This symbol, if defined, indicates that the truncate routine is
+ *	available to truncate files.
+ */
+/*#define HAS_TRUNCATE	/ **/
+
+/* HAS_TZNAME:
+ *	This symbol, if defined, indicates that the tzname[] array is
+ *	available to access timezone names.
+ */
+/*#define HAS_TZNAME		/ **/
+
+/* HAS_UMASK:
+ *	This symbol, if defined, indicates that the umask routine is
+ *	available to set and get the value of the file creation mask.
+ */
+/*#define HAS_UMASK		/ **/
+
+/* HAS_USLEEP:
+ *	This symbol, if defined, indicates that the usleep routine is
+ *	available to let the process sleep on a sub-second accuracy.
+ */
+/*#define HAS_USLEEP		/ **/
+
+/* HASVOLATILE:
+ *	This symbol, if defined, indicates that this C compiler knows about
+ *	the volatile declaration.
+ */
+/*#define	HASVOLATILE	/ **/
+#ifndef HASVOLATILE
+#define volatile
+#endif
+
+/* HAS_WAIT4:
+ *	This symbol, if defined, indicates that wait4() exists.
+ */
+/*#define HAS_WAIT4	/ **/
+
+/* HAS_WAITPID:
+ *	This symbol, if defined, indicates that the waitpid routine is
+ *	available to wait for child process.
+ */
+/*#define HAS_WAITPID	/ **/
+
+/* HAS_WCSTOMBS:
+ *	This symbol, if defined, indicates that the wcstombs routine is
+ *	available to convert wide character strings to multibyte strings.
+ */
+/*#define HAS_WCSTOMBS	/ **/
+
+/* HAS_WCTOMB:
+ *	This symbol, if defined, indicates that the wctomb routine is available
+ *	to covert a wide character to a multibyte.
+ */
+/*#define HAS_WCTOMB		/ **/
+
+/* I_ARPA_INET:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <arpa/inet.h> to get inet_addr and friends declarations.
+ */
+/*#define	I_ARPA_INET		/ **/
+
+/* I_DBM:
+ *	This symbol, if defined, indicates that <dbm.h> exists and should
+ *	be included.
+ */
+/* I_RPCSVC_DBM:
+ *	This symbol, if defined, indicates that <rpcsvc/dbm.h> exists and
+ *	should be included.
+ */
+/*#define I_DBM	/ **/
+/*#define I_RPCSVC_DBM	/ **/
+
+/* I_DIRENT:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <dirent.h>. Using this symbol also triggers the definition
+ *	of the Direntry_t define which ends up being 'struct dirent' or
+ *	'struct direct' depending on the availability of <dirent.h>.
+ */
+/* DIRNAMLEN:
+ *	This symbol, if defined, indicates to the C program that the length
+ *	of directory entry names is provided by a d_namlen field.  Otherwise
+ *	you need to do strlen() on the d_name field.
+ */
+/* Direntry_t:
+ *	This symbol is set to 'struct direct' or 'struct dirent' depending on
+ *	whether dirent is available or not. You should use this pseudo type to
+ *	portably declare your directory entries.
+ */
+#define I_DIRENT		/**/
+/*#define DIRNAMLEN	/ **/
+#define Direntry_t struct dirent
+
+/* I_DLFCN:
+ *	This symbol, if defined, indicates that <dlfcn.h> exists and should
+ *	be included.
+ */
+/*#define I_DLFCN		/ **/
+
+/* I_FCNTL:
+ *	This manifest constant tells the C program to include <fcntl.h>.
+ */
+/*#define I_FCNTL	/ **/
+
+/* I_FLOAT:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <float.h> to get definition of symbols like DBL_MAX or
+ *	DBL_MIN, i.e. machine dependent floating point values.
+ */
+/*#define I_FLOAT		/ **/
+
+/* I_LIMITS:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <limits.h> to get definition of symbols like WORD_BIT or
+ *	LONG_MAX, i.e. machine dependant limitations.
+ */
+/*#define I_LIMITS		/ **/
+
+/* I_LOCALE:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <locale.h>.
+ */
+/*#define	I_LOCALE		/ **/
+
+/* I_MATH:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <math.h>.
+ */
+#define I_MATH		/**/
+
+/* I_MEMORY:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <memory.h>.
+ */
+/*#define I_MEMORY		/ **/
+
+/* I_NET_ERRNO:
+ *	This symbol, if defined, indicates that <net/errno.h> exists and 
+ *	should be included.
+ */
+/*#define I_NET_ERRNO		/ **/
+
+/* I_NETINET_IN:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <netinet/in.h>. Otherwise, you may try <sys/in.h>.
+ */
+/*#define I_NETINET_IN	/ **/
+
+/* I_SFIO:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sfio.h>.
+ */
+/*#define	I_SFIO		/ **/
+
+/* I_STDDEF:
+ *	This symbol, if defined, indicates that <stddef.h> exists and should
+ *	be included.
+ */
+/*#define I_STDDEF	/ **/
+
+/* I_STDLIB:
+ *	This symbol, if defined, indicates that <stdlib.h> exists and should
+ *	be included.
+ */
+#define I_STDLIB		/**/
+
+/* I_STRING:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <string.h> (USG systems) instead of <strings.h> (BSD systems).
+ */
+#define I_STRING		/**/
+
+/* I_SYS_DIR:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/dir.h>.
+ */
+/*#define I_SYS_DIR		/ **/
+
+/* I_SYS_FILE:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/file.h> to get definition of R_OK and friends.
+ */
+/*#define I_SYS_FILE		/ **/
+
+/* I_SYS_IOCTL:
+ *	This symbol, if defined, indicates that <sys/ioctl.h> exists and should
+ *	be included. Otherwise, include <sgtty.h> or <termio.h>.
+ */
+/* I_SYS_SOCKIO:
+ *	This symbol, if defined, indicates the <sys/sockio.h> should be included
+ *	to get socket ioctl options, like SIOCATMARK.
+ */
+/*#define	I_SYS_IOCTL		/ **/
+/*#define I_SYS_SOCKIO	/ **/
+
+/* I_SYS_NDIR:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/ndir.h>.
+ */
+/*#define I_SYS_NDIR	/ **/
+
+/* I_SYS_PARAM:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/param.h>.
+ */
+/*#define I_SYS_PARAM		/ **/
+
+/* I_SYS_RESOURCE:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/resource.h>.
+ */
+/*#define I_SYS_RESOURCE		/ **/
+
+/* I_SYS_SELECT:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/select.h> in order to get definition of struct timeval.
+ */
+/*#define I_SYS_SELECT	/ **/
+
+/* I_SYS_STAT:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/stat.h>.
+ */
+#define	I_SYS_STAT		/**/
+
+/* I_SYS_TIMES:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/times.h>.
+ */
+/*#define	I_SYS_TIMES		/ **/
+
+/* I_SYS_TYPES:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/types.h>.
+ */
+/*#define	I_SYS_TYPES		/ **/
+
+/* I_SYS_UN:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/un.h> to get UNIX domain socket definitions.
+ */
+/*#define I_SYS_UN		/ **/
+
+/* I_SYS_WAIT:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/wait.h>.
+ */
+/*#define I_SYS_WAIT	/ **/
+
+/* I_TERMIO:
+ *	This symbol, if defined, indicates that the program should include
+ *	<termio.h> rather than <sgtty.h>.  There are also differences in
+ *	the ioctl() calls that depend on the value of this symbol.
+ */
+/* I_TERMIOS:
+ *	This symbol, if defined, indicates that the program should include
+ *	the POSIX termios.h rather than sgtty.h or termio.h.
+ *	There are also differences in the ioctl() calls that depend on the
+ *	value of this symbol.
+ */
+/* I_SGTTY:
+ *	This symbol, if defined, indicates that the program should include
+ *	<sgtty.h> rather than <termio.h>.  There are also differences in
+ *	the ioctl() calls that depend on the value of this symbol.
+ */
+/*#define I_TERMIO		/ **/
+/*#define I_TERMIOS		/ **/
+/*#define I_SGTTY		/ **/
+
+/* I_UNISTD:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <unistd.h>.
+ */
+/*#define I_UNISTD		/ **/
+
+/* I_UTIME:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <utime.h>.
+ */
+/*#define I_UTIME		/ **/
+
+/* I_VALUES:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <values.h> to get definition of symbols like MINFLOAT or
+ *	MAXLONG, i.e. machine dependant limitations.  Probably, you
+ *	should use <limits.h> instead, if it is available.
+ */
+/*#define I_VALUES		/ **/
+
+/* I_VFORK:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include vfork.h.
+ */
+/*#define I_VFORK	/ **/
+
+/* HAS_ACCESSX:
+ *	This symbol, if defined, indicates that the accessx routine is
+ *	available to do extended access checks.
+ */
+/*#define HAS_ACCESSX		/ **/
+
+/* HAS_EACCESS:
+ *	This symbol, if defined, indicates that the eaccess routine is
+ *	available to do extended access checks.
+ */
+/*#define HAS_EACCESS		/ **/
+
+/* I_SYS_ACCESS:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/access.h>.
+ */
+/*#define   I_SYS_ACCESS                / **/
+
+/* I_SYS_SECURITY:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/security.h>.
+ */
+/*#define   I_SYS_SECURITY	/ **/
+
+/* OSNAME:
+ *	This symbol contains the name of the operating system, as determined
+ *	by Configure.  You shouldn't rely on it too much; the specific
+ *	feature tests from Configure are generally more reliable.
+ */
+/* OSVERS:
+ *	This symbol contains the version of the operating system, as determined
+ *	by Configure.  You shouldn't rely on it too much; the specific
+ *	feature tests from Configure are generally more reliable.
+ */
+#define OSNAME "unknown"		/**/
+#define OSVERS ""		/**/
+
+/* USE_CROSS_COMPILE:
+ *	This symbol, if defined, indicates that Perl is being cross-compiled.
+ */
+/* PERL_TARGETARCH:
+ *	This symbol, if defined, indicates the target architecture
+ *	Perl has been cross-compiled to.  Undefined if not a cross-compile.
+ */
+#ifndef USE_CROSS_COMPILE
+/*#define	USE_CROSS_COMPILE	/ **/
+#define	PERL_TARGETARCH	""	/**/
+#endif
+
+/* MULTIARCH:
+ *	This symbol, if defined, signifies that the build
+ *	process will produce some binary files that are going to be
+ *	used in a cross-platform environment.  This is the case for
+ *	example with the NeXT "fat" binaries that contain executables
+ *	for several CPUs.
+ */
+/*#define MULTIARCH		/ **/
+
+/* MEM_ALIGNBYTES:
+ *	This symbol contains the number of bytes required to align a
+ *	double, or a long double when applicable. Usual values are 2,
+ *	4 and 8. The default is eight, for safety.
+ */
+#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH)
+#  define MEM_ALIGNBYTES 8
+#else
+#define MEM_ALIGNBYTES 4
+#endif
+
+/* ARCHLIB:
+ *	This variable, if defined, holds the name of the directory in
+ *	which the user wants to put architecture-dependent public
+ *	library files for .  It is most often a local directory
+ *	such as /usr/local/lib.  Programs using this variable must be
+ *	prepared to deal with filename expansion.  If ARCHLIB is the
+ *	same as PRIVLIB, it is not defined, since presumably the
+ *	program already searches PRIVLIB.
+ */
+/* ARCHLIB_EXP:
+ *	This symbol contains the ~name expanded version of ARCHLIB, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/*#define ARCHLIB "/usr/local/lib/perl5/5.9/unknown"		/ **/
+/*#define ARCHLIB_EXP "/usr/local/lib/perl5/5.9/unknown"		/ **/
+
+/* ARCHNAME:
+ *	This symbol holds a string representing the architecture name.
+ *	It may be used to construct an architecture-dependant pathname
+ *	where library files may be held under a private library, for
+ *	instance.
+ */
+#define ARCHNAME "unknown"		/**/
+
+/* HAS_ATOLF:
+ *	This symbol, if defined, indicates that the atolf routine is
+ *	available to convert strings into long doubles.
+ */
+/*#define HAS_ATOLF		/ **/
+
+/* HAS_ATOLL:
+ *	This symbol, if defined, indicates that the atoll routine is
+ *	available to convert strings into long longs.
+ */
+/*#define HAS_ATOLL		/ **/
+
+/* BIN:
+ *	This symbol holds the path of the bin directory where the package will
+ *	be installed. Program must be prepared to deal with ~name substitution.
+ */
+/* BIN_EXP:
+ *	This symbol is the filename expanded version of the BIN symbol, for
+ *	programs that do not want to deal with that at run-time.
+ */
+#define BIN "/usr/local/bin"	/**/
+#define BIN_EXP ""	/**/
+
+/* INTSIZE:
+ *	This symbol contains the value of sizeof(int) so that the C
+ *	preprocessor can make decisions based on it.
+ */
+/* LONGSIZE:
+ *	This symbol contains the value of sizeof(long) so that the C
+ *	preprocessor can make decisions based on it.
+ */
+/* SHORTSIZE:
+ *	This symbol contains the value of sizeof(short) so that the C
+ *	preprocessor can make decisions based on it.
+ */
+#define INTSIZE 4		/**/
+#define LONGSIZE 4		/**/
+#define SHORTSIZE 2		/**/
+
+/* BYTEORDER:
+ *	This symbol holds the hexadecimal constant defined in byteorder,
+ *	in a UV, i.e. 0x1234 or 0x4321 or 0x12345678, etc...
+ *	If the compiler supports cross-compiling or multiple-architecture
+ *	binaries (eg. on NeXT systems), use compiler-defined macros to
+ *	determine the byte order.
+ *	On NeXT 3.2 (and greater), you can build "Fat" Multiple Architecture
+ *	Binaries (MAB) on either big endian or little endian machines.
+ *	The endian-ness is available at compile-time.  This only matters
+ *	for perl, where the config.h can be generated and installed on 
+ *	one system, and used by a different architecture to build an
+ *	extension.  Older versions of NeXT that might not have
+ *	defined either *_ENDIAN__ were all on Motorola 680x0 series,
+ *	so the default case (for NeXT) is big endian to catch them. 
+ *	This might matter for NeXT 3.0.
+ */
+#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH)
+#  ifdef __LITTLE_ENDIAN__
+#    if LONGSIZE == 4
+#      define BYTEORDER 0x1234
+#    else
+#      if LONGSIZE == 8
+#        define BYTEORDER 0x12345678
+#      endif
+#    endif
+#  else
+#    ifdef __BIG_ENDIAN__
+#      if LONGSIZE == 4
+#        define BYTEORDER 0x4321
+#      else
+#        if LONGSIZE == 8
+#          define BYTEORDER 0x87654321
+#        endif
+#      endif
+#    endif
+#  endif
+#  if !defined(BYTEORDER) && (defined(NeXT) || defined(__NeXT__))
+#    define BYTEORDER 0x4321
+#  endif
+#else
+#define BYTEORDER 0x1234	/* large digits for MSB */
+#endif /* NeXT */
+
+/* CAT2:
+ *	This macro concatenates 2 tokens together.
+ */
+/* STRINGIFY:
+ *	This macro surrounds its token with double quotes.
+ */
+#if 42 == 1
+#define CAT2(a,b)	a/**/b
+#define STRINGIFY(a)	"a"
+		/* If you can get stringification with catify, tell me how! */
+#endif
+#if 42 == 42
+#define PeRl_CaTiFy(a, b)	a ## b	
+#define PeRl_StGiFy(a)	#a
+/* the additional level of indirection enables these macros to be
+ * used as arguments to other macros.  See K&R 2nd ed., page 231. */
+#define CAT2(a,b)	PeRl_CaTiFy(a,b)
+#define StGiFy(a)	PeRl_StGiFy(a)
+#define STRINGIFY(a)	PeRl_StGiFy(a)
+#endif
+#if 42 != 1 && 42 != 42
+#   include "Bletch: How does this C preprocessor concatenate tokens?"
+#endif
+
+/* CPPSTDIN:
+ *	This symbol contains the first part of the string which will invoke
+ *	the C preprocessor on the standard input and produce to standard
+ *	output.	 Typical value of "cc -E" or "/lib/cpp", but it can also
+ *	call a wrapper. See CPPRUN.
+ */
+/* CPPMINUS:
+ *	This symbol contains the second part of the string which will invoke
+ *	the C preprocessor on the standard input and produce to standard
+ *	output.  This symbol will have the value "-" if CPPSTDIN needs a minus
+ *	to specify standard input, otherwise the value is "".
+ */
+/* CPPRUN:
+ *	This symbol contains the string which will invoke a C preprocessor on
+ *	the standard input and produce to standard output. It needs to end
+ *	with CPPLAST, after all other preprocessor flags have been specified.
+ *	The main difference with CPPSTDIN is that this program will never be a
+ *	pointer to a shell wrapper, i.e. it will be empty if no preprocessor is
+ *	available directly to the user. Note that it may well be different from
+ *	the preprocessor used to compile the C program.
+ */
+/* CPPLAST:
+ *	This symbol is intended to be used along with CPPRUN in the same manner
+ *	symbol CPPMINUS is used with CPPSTDIN. It contains either "-" or "".
+ */
+#define CPPSTDIN ""
+#define CPPMINUS ""
+#define CPPRUN ""
+#define CPPLAST ""
+
+/* HAS__FWALK:
+ *	This symbol, if defined, indicates that the _fwalk system call is
+ *	available to apply a function to all the file handles.
+ */
+/*#define HAS__FWALK		/ **/
+
+/* HAS_ACCESS:
+ *	This manifest constant lets the C program know that the access()
+ *	system call is available to check for accessibility using real UID/GID.
+ *	(always present on UNIX.)
+ */
+/*#define HAS_ACCESS		/ **/
+
+/* HAS_ASCTIME_R:
+ *	This symbol, if defined, indicates that the asctime_r routine
+ *	is available to asctime re-entrantly.
+ */
+/* ASCTIME_R_PROTO:
+ *	This symbol encodes the prototype of asctime_r.
+ *	It is zero if d_asctime_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_asctime_r
+ *	is defined.
+ */
+/*#define HAS_ASCTIME_R	   / **/
+#define ASCTIME_R_PROTO 0	   /**/
+
+/* CASTI32:
+ *	This symbol is defined if the C compiler can cast negative
+ *	or large floating point numbers to 32-bit ints.
+ */
+/*#define	CASTI32		/ **/
+
+/* CASTNEGFLOAT:
+ *	This symbol is defined if the C compiler can cast negative
+ *	numbers to unsigned longs, ints and shorts.
+ */
+/* CASTFLAGS:
+ *	This symbol contains flags that say what difficulties the compiler
+ *	has casting odd floating values to unsigned long:
+ *		0 = ok
+ *		1 = couldn't cast < 0
+ *		2 = couldn't cast >= 0x80000000
+ *		4 = couldn't cast in argument expression list
+ */
+/*#define	CASTNEGFLOAT		/ **/
+#define CASTFLAGS 0		/**/
+
+/* HAS_CLASS:
+ *	This symbol, if defined, indicates that the class routine is
+ *	available to classify doubles.  Available for example in AIX.
+ *	The returned values are defined in <float.h> and are:
+ *
+ *	FP_PLUS_NORM	Positive normalized, nonzero
+ *	FP_MINUS_NORM	Negative normalized, nonzero
+ *	FP_PLUS_DENORM	Positive denormalized, nonzero
+ *	FP_MINUS_DENORM	Negative denormalized, nonzero
+ *	FP_PLUS_ZERO	+0.0
+ *	FP_MINUS_ZERO	-0.0
+ *	FP_PLUS_INF	+INF
+ *	FP_MINUS_INF	-INF
+ *	FP_NANS		Signaling Not a Number (NaNS)
+ *	FP_NANQ		Quiet Not a Number (NaNQ)
+ */
+/*#define HAS_CLASS		/ **/
+
+/* VOID_CLOSEDIR:
+ *	This symbol, if defined, indicates that the closedir() routine
+ *	does not return a value.
+ */
+/*#define VOID_CLOSEDIR		/ **/
+
+/* HAS_STRUCT_CMSGHDR:
+ *	This symbol, if defined, indicates that the struct cmsghdr
+ *	is supported.
+ */
+/*#define HAS_STRUCT_CMSGHDR	/ **/
+
+/* HAS_CRYPT_R:
+ *	This symbol, if defined, indicates that the crypt_r routine
+ *	is available to crypt re-entrantly.
+ */
+/* CRYPT_R_PROTO:
+ *	This symbol encodes the prototype of crypt_r.
+ *	It is zero if d_crypt_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_crypt_r
+ *	is defined.
+ */
+/*#define HAS_CRYPT_R	   / **/
+#define CRYPT_R_PROTO 0	   /**/
+
+/* HAS_CSH:
+ *	This symbol, if defined, indicates that the C-shell exists.
+ */
+/* CSH:
+ *	This symbol, if defined, contains the full pathname of csh.
+ */
+/*#define HAS_CSH		/ **/
+#ifdef HAS_CSH
+#define CSH ""	/**/
+#endif
+
+/* HAS_CTIME_R:
+ *	This symbol, if defined, indicates that the ctime_r routine
+ *	is available to ctime re-entrantly.
+ */
+/* CTIME_R_PROTO:
+ *	This symbol encodes the prototype of ctime_r.
+ *	It is zero if d_ctime_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctime_r
+ *	is defined.
+ */
+/*#define HAS_CTIME_R	   / **/
+#define CTIME_R_PROTO 0	   /**/
+
+/* DLSYM_NEEDS_UNDERSCORE:
+ *	This symbol, if defined, indicates that we need to prepend an
+ *	underscore to the symbol name before calling dlsym().  This only
+ *	makes sense if you *have* dlsym, which we will presume is the
+ *	case if you're using dl_dlopen.xs.
+ */
+/*#define 	DLSYM_NEEDS_UNDERSCORE 	/ **/
+
+/* HAS_DRAND48_R:
+ *	This symbol, if defined, indicates that the drand48_r routine
+ *	is available to drand48 re-entrantly.
+ */
+/* DRAND48_R_PROTO:
+ *	This symbol encodes the prototype of drand48_r.
+ *	It is zero if d_drand48_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_drand48_r
+ *	is defined.
+ */
+/*#define HAS_DRAND48_R	   / **/
+#define DRAND48_R_PROTO 0	   /**/
+
+/* HAS_DRAND48_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the drand48() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern double drand48(void);
+ */
+/*#define	HAS_DRAND48_PROTO	/ **/
+
+/* HAS_ENDGRENT:
+ *	This symbol, if defined, indicates that the getgrent routine is
+ *	available for finalizing sequential access of the group database.
+ */
+/*#define HAS_ENDGRENT		/ **/
+
+/* HAS_ENDGRENT_R:
+ *	This symbol, if defined, indicates that the endgrent_r routine
+ *	is available to endgrent re-entrantly.
+ */
+/* ENDGRENT_R_PROTO:
+ *	This symbol encodes the prototype of endgrent_r.
+ *	It is zero if d_endgrent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endgrent_r
+ *	is defined.
+ */
+/*#define HAS_ENDGRENT_R	   / **/
+#define ENDGRENT_R_PROTO 0	   /**/
+
+/* HAS_ENDHOSTENT:
+ *	This symbol, if defined, indicates that the endhostent() routine is
+ *	available to close whatever was being used for host queries.
+ */
+/*#define HAS_ENDHOSTENT		/ **/
+
+/* HAS_ENDNETENT:
+ *	This symbol, if defined, indicates that the endnetent() routine is
+ *	available to close whatever was being used for network queries.
+ */
+/*#define HAS_ENDNETENT		/ **/
+
+/* HAS_ENDPROTOENT:
+ *	This symbol, if defined, indicates that the endprotoent() routine is
+ *	available to close whatever was being used for protocol queries.
+ */
+/*#define HAS_ENDPROTOENT		/ **/
+
+/* HAS_ENDPWENT:
+ *	This symbol, if defined, indicates that the getgrent routine is
+ *	available for finalizing sequential access of the passwd database.
+ */
+/*#define HAS_ENDPWENT		/ **/
+
+/* HAS_ENDPWENT_R:
+ *	This symbol, if defined, indicates that the endpwent_r routine
+ *	is available to endpwent re-entrantly.
+ */
+/* ENDPWENT_R_PROTO:
+ *	This symbol encodes the prototype of endpwent_r.
+ *	It is zero if d_endpwent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endpwent_r
+ *	is defined.
+ */
+/*#define HAS_ENDPWENT_R	   / **/
+#define ENDPWENT_R_PROTO 0	   /**/
+
+/* HAS_ENDSERVENT:
+ *	This symbol, if defined, indicates that the endservent() routine is
+ *	available to close whatever was being used for service queries.
+ */
+/*#define HAS_ENDSERVENT		/ **/
+
+/* HAS_FCHDIR:
+ *	This symbol, if defined, indicates that the fchdir routine is
+ *	available to change directory using a file descriptor.
+ */
+/*#define HAS_FCHDIR		/ **/
+
+/* FCNTL_CAN_LOCK:
+ *	This symbol, if defined, indicates that fcntl() can be used
+ *	for file locking.  Normally on Unix systems this is defined.
+ *	It may be undefined on VMS.
+ */
+/*#define FCNTL_CAN_LOCK		/ **/
+
+/* HAS_FD_SET:
+ *	This symbol, when defined, indicates presence of the fd_set typedef
+ *	in <sys/types.h>
+ */
+/*#define HAS_FD_SET	/ **/
+
+/* HAS_FINITE:
+ *	This symbol, if defined, indicates that the finite routine is
+ *	available to check whether a double is finite (non-infinity non-NaN).
+ */
+/*#define HAS_FINITE		/ **/
+
+/* HAS_FINITEL:
+ *	This symbol, if defined, indicates that the finitel routine is
+ *	available to check whether a long double is finite
+ *	(non-infinity non-NaN).
+ */
+/*#define HAS_FINITEL		/ **/
+
+/* FLEXFILENAMES:
+ *	This symbol, if defined, indicates that the system supports filenames
+ *	longer than 14 characters.
+ */
+/*#define	FLEXFILENAMES		/ **/
+
+/* HAS_FP_CLASS:
+ *	This symbol, if defined, indicates that the fp_class routine is
+ *	available to classify doubles.  Available for example in Digital UNIX.
+ *	The returned values are defined in <math.h> and are:
+ *
+ *	FP_SNAN           Signaling NaN (Not-a-Number)
+ *	FP_QNAN           Quiet NaN (Not-a-Number)
+ *	FP_POS_INF        +infinity
+ *	FP_NEG_INF        -infinity
+ *	FP_POS_NORM       Positive normalized
+ *	FP_NEG_NORM       Negative normalized
+ *	FP_POS_DENORM     Positive denormalized
+ *	FP_NEG_DENORM     Negative denormalized
+ *	FP_POS_ZERO       +0.0 (positive zero)
+ *	FP_NEG_ZERO       -0.0 (negative zero)
+ */
+/*#define HAS_FP_CLASS		/ **/
+
+/* HAS_FPCLASS:
+ *	This symbol, if defined, indicates that the fpclass routine is
+ *	available to classify doubles.  Available for example in Solaris/SVR4.
+ *	The returned values are defined in <ieeefp.h> and are:
+ *
+ *	FP_SNAN		signaling NaN
+ *	FP_QNAN		quiet NaN
+ *	FP_NINF		negative infinity
+ *	FP_PINF		positive infinity
+ *	FP_NDENORM	negative denormalized non-zero
+ *	FP_PDENORM	positive denormalized non-zero
+ *	FP_NZERO	negative zero
+ *	FP_PZERO	positive zero
+ *	FP_NNORM	negative normalized non-zero
+ *	FP_PNORM	positive normalized non-zero
+ */
+/*#define HAS_FPCLASS		/ **/
+
+/* HAS_FPCLASSIFY:
+ *	This symbol, if defined, indicates that the fpclassify routine is
+ *	available to classify doubles.  Available for example in HP-UX.
+ *	The returned values are defined in <math.h> and are
+ *
+ *           FP_NORMAL     Normalized
+ *           FP_ZERO       Zero
+ *           FP_INFINITE   Infinity
+ *           FP_SUBNORMAL  Denormalized
+ *           FP_NAN        NaN
+ *
+ */
+/*#define HAS_FPCLASSIFY		/ **/
+
+/* HAS_FPOS64_T:
+ *	This symbol will be defined if the C compiler supports fpos64_t.
+ */
+/*#define	HAS_FPOS64_T    	/ **/
+
+/* HAS_FREXPL:
+ *	This symbol, if defined, indicates that the frexpl routine is
+ *	available to break a long double floating-point number into
+ *	a normalized fraction and an integral power of 2.
+ */
+/*#define HAS_FREXPL		/ **/
+
+/* HAS_STRUCT_FS_DATA:
+ *	This symbol, if defined, indicates that the struct fs_data
+ *	to do statfs() is supported.
+ */
+/*#define HAS_STRUCT_FS_DATA	/ **/
+
+/* HAS_FSEEKO:
+ *	This symbol, if defined, indicates that the fseeko routine is
+ *	available to fseek beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FSEEKO		/ **/
+
+/* HAS_FSTATFS:
+ *	This symbol, if defined, indicates that the fstatfs routine is
+ *	available to stat filesystems by file descriptors.
+ */
+/*#define HAS_FSTATFS		/ **/
+
+/* HAS_FSYNC:
+ *	This symbol, if defined, indicates that the fsync routine is
+ *	available to write a file's modified data and attributes to
+ *	permanent storage.
+ */
+/*#define HAS_FSYNC		/ **/
+
+/* HAS_FTELLO:
+ *	This symbol, if defined, indicates that the ftello routine is
+ *	available to ftell beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FTELLO		/ **/
+
+/* Gconvert:
+ *	This preprocessor macro is defined to convert a floating point
+ *	number to a string without a trailing decimal point.  This
+ *	emulates the behavior of sprintf("%g"), but is sometimes much more
+ *	efficient.  If gconvert() is not available, but gcvt() drops the
+ *	trailing decimal point, then gcvt() is used.  If all else fails,
+ *	a macro using sprintf("%g") is used. Arguments for the Gconvert
+ *	macro are: value, number of digits, whether trailing zeros should
+ *	be retained, and the output buffer.
+ *	The usual values are:
+ *		d_Gconvert='gconvert((x),(n),(t),(b))'
+ *		d_Gconvert='gcvt((x),(n),(b))'
+ *		d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+ *	The last two assume trailing zeros should not be kept.
+ */
+#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))
+
+/* HAS_GETCWD:
+ *	This symbol, if defined, indicates that the getcwd routine is
+ *	available to get the current working directory.
+ */
+/*#define HAS_GETCWD		/ **/
+
+/* HAS_GETESPWNAM:
+ *	This symbol, if defined, indicates that the getespwnam system call is
+ *	available to retrieve enchanced (shadow) password entries by name.
+ */
+/*#define HAS_GETESPWNAM		/ **/
+
+/* HAS_GETFSSTAT:
+ *	This symbol, if defined, indicates that the getfsstat routine is
+ *	available to stat filesystems in bulk.
+ */
+/*#define HAS_GETFSSTAT		/ **/
+
+/* HAS_GETGRENT:
+ *	This symbol, if defined, indicates that the getgrent routine is
+ *	available for sequential access of the group database.
+ */
+/*#define HAS_GETGRENT		/ **/
+
+/* HAS_GETGRENT_R:
+ *	This symbol, if defined, indicates that the getgrent_r routine
+ *	is available to getgrent re-entrantly.
+ */
+/* GETGRENT_R_PROTO:
+ *	This symbol encodes the prototype of getgrent_r.
+ *	It is zero if d_getgrent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrent_r
+ *	is defined.
+ */
+/*#define HAS_GETGRENT_R	   / **/
+#define GETGRENT_R_PROTO 0	   /**/
+
+/* HAS_GETGRGID_R:
+ *	This symbol, if defined, indicates that the getgrgid_r routine
+ *	is available to getgrgid re-entrantly.
+ */
+/* GETGRGID_R_PROTO:
+ *	This symbol encodes the prototype of getgrgid_r.
+ *	It is zero if d_getgrgid_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrgid_r
+ *	is defined.
+ */
+/*#define HAS_GETGRGID_R	   / **/
+#define GETGRGID_R_PROTO 0	   /**/
+
+/* HAS_GETGRNAM_R:
+ *	This symbol, if defined, indicates that the getgrnam_r routine
+ *	is available to getgrnam re-entrantly.
+ */
+/* GETGRNAM_R_PROTO:
+ *	This symbol encodes the prototype of getgrnam_r.
+ *	It is zero if d_getgrnam_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrnam_r
+ *	is defined.
+ */
+/*#define HAS_GETGRNAM_R	   / **/
+#define GETGRNAM_R_PROTO 0	   /**/
+
+/* HAS_GETHOSTBYADDR:
+ *	This symbol, if defined, indicates that the gethostbyaddr() routine is
+ *	available to look up hosts by their IP addresses.
+ */
+/*#define HAS_GETHOSTBYADDR		/ **/
+
+/* HAS_GETHOSTBYNAME:
+ *	This symbol, if defined, indicates that the gethostbyname() routine is
+ *	available to look up host names in some data base or other.
+ */
+/*#define HAS_GETHOSTBYNAME		/ **/
+
+/* HAS_GETHOSTENT:
+ *	This symbol, if defined, indicates that the gethostent() routine is
+ *	available to look up host names in some data base or another.
+ */
+/*#define HAS_GETHOSTENT		/ **/
+
+/* HAS_GETHOSTNAME:
+ *	This symbol, if defined, indicates that the C program may use the
+ *	gethostname() routine to derive the host name.  See also HAS_UNAME
+ *	and PHOSTNAME.
+ */
+/* HAS_UNAME:
+ *	This symbol, if defined, indicates that the C program may use the
+ *	uname() routine to derive the host name.  See also HAS_GETHOSTNAME
+ *	and PHOSTNAME.
+ */
+/* PHOSTNAME:
+ *	This symbol, if defined, indicates the command to feed to the
+ *	popen() routine to derive the host name.  See also HAS_GETHOSTNAME
+ *	and HAS_UNAME.	Note that the command uses a fully qualified path,
+ *	so that it is safe even if used by a process with super-user
+ *	privileges.
+ */
+/* HAS_PHOSTNAME:
+ *	This symbol, if defined, indicates that the C program may use the
+ *	contents of PHOSTNAME as a command to feed to the popen() routine
+ *	to derive the host name.
+ */
+/*#define HAS_GETHOSTNAME	/ **/
+/*#define HAS_UNAME		/ **/
+/*#define HAS_PHOSTNAME	/ **/
+#ifdef HAS_PHOSTNAME
+#define PHOSTNAME ""	/* How to get the host name */
+#endif
+
+/* HAS_GETHOST_PROTOS:
+ *	This symbol, if defined, indicates that <netdb.h> includes
+ *	prototypes for gethostent(), gethostbyname(), and
+ *	gethostbyaddr().  Otherwise, it is up to the program to guess
+ *	them.  See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+/*#define	HAS_GETHOST_PROTOS	/ **/
+
+/* HAS_GETITIMER:
+ *	This symbol, if defined, indicates that the getitimer routine is
+ *	available to return interval timers.
+ */
+/*#define HAS_GETITIMER		/ **/
+
+/* HAS_GETLOGIN_R:
+ *	This symbol, if defined, indicates that the getlogin_r routine
+ *	is available to getlogin re-entrantly.
+ */
+/* GETLOGIN_R_PROTO:
+ *	This symbol encodes the prototype of getlogin_r.
+ *	It is zero if d_getlogin_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getlogin_r
+ *	is defined.
+ */
+/*#define HAS_GETLOGIN_R	   / **/
+#define GETLOGIN_R_PROTO 0	   /**/
+
+/* HAS_GETMNT:
+ *	This symbol, if defined, indicates that the getmnt routine is
+ *	available to get filesystem mount info by filename.
+ */
+/*#define HAS_GETMNT		/ **/
+
+/* HAS_GETMNTENT:
+ *	This symbol, if defined, indicates that the getmntent routine is
+ *	available to iterate through mounted file systems to get their info.
+ */
+/*#define HAS_GETMNTENT		/ **/
+
+/* HAS_GETNETBYADDR:
+ *	This symbol, if defined, indicates that the getnetbyaddr() routine is
+ *	available to look up networks by their IP addresses.
+ */
+/*#define HAS_GETNETBYADDR		/ **/
+
+/* HAS_GETNETBYNAME:
+ *	This symbol, if defined, indicates that the getnetbyname() routine is
+ *	available to look up networks by their names.
+ */
+/*#define HAS_GETNETBYNAME		/ **/
+
+/* HAS_GETNETENT:
+ *	This symbol, if defined, indicates that the getnetent() routine is
+ *	available to look up network names in some data base or another.
+ */
+/*#define HAS_GETNETENT		/ **/
+
+/* HAS_GETNET_PROTOS:
+ *	This symbol, if defined, indicates that <netdb.h> includes
+ *	prototypes for getnetent(), getnetbyname(), and
+ *	getnetbyaddr().  Otherwise, it is up to the program to guess
+ *	them.  See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+/*#define	HAS_GETNET_PROTOS	/ **/
+
+/* HAS_GETPAGESIZE:
+ *	This symbol, if defined, indicates that the getpagesize system call
+ *	is available to get system page size, which is the granularity of
+ *	many memory management calls.
+ */
+/*#define HAS_GETPAGESIZE		/ **/
+
+/* HAS_GETPROTOENT:
+ *	This symbol, if defined, indicates that the getprotoent() routine is
+ *	available to look up protocols in some data base or another.
+ */
+/*#define HAS_GETPROTOENT		/ **/
+
+/* HAS_GETPGRP:
+ *	This symbol, if defined, indicates that the getpgrp routine is
+ *	available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ *	This symbol, if defined, indicates that getpgrp needs one
+ *	arguments whereas USG one needs none.
+ */
+/*#define HAS_GETPGRP		/ **/
+/*#define USE_BSD_GETPGRP	/ **/
+
+/* HAS_GETPROTOBYNAME:
+ *	This symbol, if defined, indicates that the getprotobyname()
+ *	routine is available to look up protocols by their name.
+ */
+/* HAS_GETPROTOBYNUMBER:
+ *	This symbol, if defined, indicates that the getprotobynumber()
+ *	routine is available to look up protocols by their number.
+ */
+/*#define HAS_GETPROTOBYNAME		/ **/
+/*#define HAS_GETPROTOBYNUMBER		/ **/
+
+/* HAS_GETPROTO_PROTOS:
+ *	This symbol, if defined, indicates that <netdb.h> includes
+ *	prototypes for getprotoent(), getprotobyname(), and
+ *	getprotobyaddr().  Otherwise, it is up to the program to guess
+ *	them.  See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+/*#define	HAS_GETPROTO_PROTOS	/ **/
+
+/* HAS_GETPRPWNAM:
+ *	This symbol, if defined, indicates that the getprpwnam system call is
+ *	available to retrieve protected (shadow) password entries by name.
+ */
+/*#define HAS_GETPRPWNAM		/ **/
+
+/* HAS_GETPWENT:
+ *	This symbol, if defined, indicates that the getpwent routine is
+ *	available for sequential access of the passwd database.
+ *	If this is not available, the older getpw() function may be available.
+ */
+/*#define HAS_GETPWENT		/ **/
+
+/* HAS_GETPWENT_R:
+ *	This symbol, if defined, indicates that the getpwent_r routine
+ *	is available to getpwent re-entrantly.
+ */
+/* GETPWENT_R_PROTO:
+ *	This symbol encodes the prototype of getpwent_r.
+ *	It is zero if d_getpwent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwent_r
+ *	is defined.
+ */
+/*#define HAS_GETPWENT_R	   / **/
+#define GETPWENT_R_PROTO 0	   /**/
+
+/* HAS_GETPWNAM_R:
+ *	This symbol, if defined, indicates that the getpwnam_r routine
+ *	is available to getpwnam re-entrantly.
+ */
+/* GETPWNAM_R_PROTO:
+ *	This symbol encodes the prototype of getpwnam_r.
+ *	It is zero if d_getpwnam_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwnam_r
+ *	is defined.
+ */
+/*#define HAS_GETPWNAM_R	   / **/
+#define GETPWNAM_R_PROTO 0	   /**/
+
+/* HAS_GETPWUID_R:
+ *	This symbol, if defined, indicates that the getpwuid_r routine
+ *	is available to getpwuid re-entrantly.
+ */
+/* GETPWUID_R_PROTO:
+ *	This symbol encodes the prototype of getpwuid_r.
+ *	It is zero if d_getpwuid_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwuid_r
+ *	is defined.
+ */
+/*#define HAS_GETPWUID_R	   / **/
+#define GETPWUID_R_PROTO 0	   /**/
+
+/* HAS_GETSERVENT:
+ *	This symbol, if defined, indicates that the getservent() routine is
+ *	available to look up network services in some data base or another.
+ */
+/*#define HAS_GETSERVENT		/ **/
+
+/* HAS_GETSERV_PROTOS:
+ *	This symbol, if defined, indicates that <netdb.h> includes
+ *	prototypes for getservent(), getservbyname(), and
+ *	getservbyaddr().  Otherwise, it is up to the program to guess
+ *	them.  See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+/*#define	HAS_GETSERV_PROTOS	/ **/
+
+/* HAS_GETSPNAM:
+ *	This symbol, if defined, indicates that the getspnam system call is
+ *	available to retrieve SysV shadow password entries by name.
+ */
+/*#define HAS_GETSPNAM		/ **/
+
+/* HAS_GETSPNAM_R:
+ *	This symbol, if defined, indicates that the getspnam_r routine
+ *	is available to getspnam re-entrantly.
+ */
+/* GETSPNAM_R_PROTO:
+ *	This symbol encodes the prototype of getspnam_r.
+ *	It is zero if d_getspnam_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getspnam_r
+ *	is defined.
+ */
+/*#define HAS_GETSPNAM_R	   / **/
+#define GETSPNAM_R_PROTO 0	   /**/
+
+/* HAS_GETSERVBYNAME:
+ *	This symbol, if defined, indicates that the getservbyname()
+ *	routine is available to look up services by their name.
+ */
+/* HAS_GETSERVBYPORT:
+ *	This symbol, if defined, indicates that the getservbyport()
+ *	routine is available to look up services by their port.
+ */
+/*#define HAS_GETSERVBYNAME		/ **/
+/*#define HAS_GETSERVBYPORT		/ **/
+
+/* HAS_GMTIME_R:
+ *	This symbol, if defined, indicates that the gmtime_r routine
+ *	is available to gmtime re-entrantly.
+ */
+/* GMTIME_R_PROTO:
+ *	This symbol encodes the prototype of gmtime_r.
+ *	It is zero if d_gmtime_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_gmtime_r
+ *	is defined.
+ */
+/*#define HAS_GMTIME_R	   / **/
+#define GMTIME_R_PROTO 0	   /**/
+
+/* HAS_GNULIBC:
+ *	This symbol, if defined, indicates to the C program that 
+ *	the GNU C library is being used.  A better check is to use
+ *	the __GLIBC__ and __GLIBC_MINOR__ symbols supplied with glibc.
+ */
+/*#define HAS_GNULIBC  	/ **/
+#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE)
+#   define _GNU_SOURCE
+#endif
+/* HAS_HASMNTOPT:
+ *	This symbol, if defined, indicates that the hasmntopt routine is
+ *	available to query the mount options of file systems.
+ */
+/*#define HAS_HASMNTOPT		/ **/
+
+/* HAS_HTONL:
+ *	This symbol, if defined, indicates that the htonl() routine (and
+ *	friends htons() ntohl() ntohs()) are available to do network
+ *	order byte swapping.
+ */
+/* HAS_HTONS:
+ *	This symbol, if defined, indicates that the htons() routine (and
+ *	friends htonl() ntohl() ntohs()) are available to do network
+ *	order byte swapping.
+ */
+/* HAS_NTOHL:
+ *	This symbol, if defined, indicates that the ntohl() routine (and
+ *	friends htonl() htons() ntohs()) are available to do network
+ *	order byte swapping.
+ */
+/* HAS_NTOHS:
+ *	This symbol, if defined, indicates that the ntohs() routine (and
+ *	friends htonl() htons() ntohl()) are available to do network
+ *	order byte swapping.
+ */
+/*#define HAS_HTONL		/ **/
+/*#define HAS_HTONS		/ **/
+/*#define HAS_NTOHL		/ **/
+/*#define HAS_NTOHS		/ **/
+
+/* HAS_INT64_T:
+ *     This symbol will defined if the C compiler supports int64_t.
+ *     Usually the <inttypes.h> needs to be included, but sometimes
+ *	<sys/types.h> is enough.
+ */
+/*#define     HAS_INT64_T               / **/
+
+/* HAS_ISASCII:
+ *	This manifest constant lets the C program know that isascii 
+ *	is available.
+ */
+/*#define HAS_ISASCII		/ **/
+
+/* HAS_ISFINITE:
+ *	This symbol, if defined, indicates that the isfinite routine is
+ *	available to check whether a double is finite (non-infinity non-NaN).
+ */
+/*#define HAS_ISFINITE		/ **/
+
+/* HAS_ISINF:
+ *	This symbol, if defined, indicates that the isinf routine is
+ *	available to check whether a double is an infinity.
+ */
+/*#define HAS_ISINF		/ **/
+
+/* HAS_ISNAN:
+ *	This symbol, if defined, indicates that the isnan routine is
+ *	available to check whether a double is a NaN.
+ */
+/*#define HAS_ISNAN		/ **/
+
+/* HAS_ISNANL:
+ *	This symbol, if defined, indicates that the isnanl routine is
+ *	available to check whether a long double is a NaN.
+ */
+/*#define HAS_ISNANL		/ **/
+
+/* HAS_LCHOWN:
+ *	This symbol, if defined, indicates that the lchown routine is
+ *	available to operate on a symbolic link (instead of following the
+ *	link).
+ */
+/*#define HAS_LCHOWN		/ **/
+
+/* HAS_LDBL_DIG:
+ *	This symbol, if defined, indicates that this system's <float.h>
+ *	or <limits.h> defines the symbol LDBL_DIG, which is the number
+ *	of significant digits in a long double precision number. Unlike
+ *	for DBL_DIG, there's no good guess for LDBL_DIG if it is undefined.
+ */
+/*#define HAS_LDBL_DIG 	/ * */
+
+/* HAS_LOCALTIME_R:
+ *	This symbol, if defined, indicates that the localtime_r routine
+ *	is available to localtime re-entrantly.
+ */
+/* LOCALTIME_R_PROTO:
+ *	This symbol encodes the prototype of localtime_r.
+ *	It is zero if d_localtime_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_localtime_r
+ *	is defined.
+ */
+/*#define HAS_LOCALTIME_R	   / **/
+#define LOCALTIME_R_PROTO 0	   /**/
+
+/* HAS_LONG_DOUBLE:
+ *	This symbol will be defined if the C compiler supports long
+ *	doubles.
+ */
+/* LONG_DOUBLESIZE:
+ *	This symbol contains the size of a long double, so that the 
+ *	C preprocessor can make decisions based on it.  It is only
+ *	defined if the system supports long doubles.
+ */
+/*#define HAS_LONG_DOUBLE		/ **/
+#ifdef HAS_LONG_DOUBLE
+#define LONG_DOUBLESIZE 8		/**/
+#endif
+
+/* HAS_LONG_LONG:
+ *	This symbol will be defined if the C compiler supports long long.
+ */
+/* LONGLONGSIZE:
+ *	This symbol contains the size of a long long, so that the 
+ *	C preprocessor can make decisions based on it.  It is only
+ *	defined if the system supports long long.
+ */
+/*#define HAS_LONG_LONG		/ **/
+#ifdef HAS_LONG_LONG
+#define LONGLONGSIZE 8		/**/
+#endif
+
+/* HAS_LSEEK_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the lseek() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern off_t lseek(int, off_t, int);
+ */
+/*#define	HAS_LSEEK_PROTO	/ **/
+
+/* HAS_MADVISE:
+ *	This symbol, if defined, indicates that the madvise system call is
+ *	available to map a file into memory.
+ */
+/*#define HAS_MADVISE		/ **/
+
+/* HAS_MALLOC_SIZE:
+ *	This symbol, if defined, indicates that the malloc_size
+ *	routine is available for use.
+ */
+/*#define HAS_MALLOC_SIZE		/ **/
+
+/* HAS_MALLOC_GOOD_SIZE:
+ *	This symbol, if defined, indicates that the malloc_good_size
+ *	routine is available for use.
+ */
+/*#define HAS_MALLOC_GOOD_SIZE	/ **/
+
+/* HAS_MEMCHR:
+ *	This symbol, if defined, indicates that the memchr routine is available
+ *	to locate characters within a C string.
+ */
+/*#define HAS_MEMCHR	/ **/
+
+/* HAS_MKDTEMP:
+ *	This symbol, if defined, indicates that the mkdtemp routine is
+ *	available to exclusively create a uniquely named temporary directory.
+ */
+/*#define HAS_MKDTEMP		/ **/
+
+/* HAS_MKSTEMP:
+ *	This symbol, if defined, indicates that the mkstemp routine is
+ *	available to exclusively create and open a uniquely named
+ *	temporary file.
+ */
+/*#define HAS_MKSTEMP		/ **/
+
+/* HAS_MKSTEMPS:
+ *	This symbol, if defined, indicates that the mkstemps routine is
+ *	available to excluslvely create and open a uniquely named
+ *	(with a suffix) temporary file.
+ */
+/*#define HAS_MKSTEMPS		/ **/
+
+/* HAS_MMAP:
+ *	This symbol, if defined, indicates that the mmap system call is
+ *	available to map a file into memory.
+ */
+/* Mmap_t:
+ *	This symbol holds the return type of the mmap() system call
+ *	(and simultaneously the type of the first argument).
+ *	Usually set to 'void *' or 'cadd_t'.
+ */
+/*#define HAS_MMAP		/ **/
+#define Mmap_t 	/**/
+
+/* HAS_MODFL:
+ *	This symbol, if defined, indicates that the modfl routine is
+ *	available to split a long double x into a fractional part f and
+ *	an integer part i such that |f| < 1.0 and (f + i) = x.
+ */
+/* HAS_MODFL_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the modfl() function.  Otherwise, it is up
+ *	to the program to supply one.
+ */
+/* HAS_MODFL_POW32_BUG:
+ *	This symbol, if defined, indicates that the modfl routine is
+ *	broken for long doubles >= pow(2, 32).
+ *	For example from 4294967303.150000 one would get 4294967302.000000
+ *	and 1.150000.  The bug has been seen in certain versions of glibc,
+ *	release 2.2.2 is known to be okay.
+ */
+/*#define HAS_MODFL		/ **/
+/*#define HAS_MODFL_PROTO		/ **/
+/*#define HAS_MODFL_POW32_BUG		/ **/
+
+/* HAS_MPROTECT:
+ *	This symbol, if defined, indicates that the mprotect system call is
+ *	available to modify the access protection of a memory mapped file.
+ */
+/*#define HAS_MPROTECT		/ **/
+
+/* HAS_MSG:
+ *	This symbol, if defined, indicates that the entire msg*(2) library is
+ *	supported (IPC mechanism based on message queues).
+ */
+/*#define HAS_MSG		/ **/
+
+/* HAS_STRUCT_MSGHDR:
+ *	This symbol, if defined, indicates that the struct msghdr
+ *	is supported.
+ */
+/*#define HAS_STRUCT_MSGHDR	/ **/
+
+/* HAS_OFF64_T:
+ *	This symbol will be defined if the C compiler supports off64_t.
+ */
+/*#define	HAS_OFF64_T    		/ **/
+
+/* HAS_OPEN3:
+ *	This manifest constant lets the C program know that the three
+ *	argument form of open(2) is available.
+ */
+/*#define HAS_OPEN3		/ **/
+
+/* OLD_PTHREAD_CREATE_JOINABLE:
+ *	This symbol, if defined, indicates how to create pthread
+ *	in joinable (aka undetached) state.  NOTE: not defined
+ *	if pthread.h already has defined PTHREAD_CREATE_JOINABLE
+ *	(the new version of the constant).
+ *	If defined, known values are PTHREAD_CREATE_UNDETACHED
+ *	and __UNDETACHED.
+ */
+/*#define OLD_PTHREAD_CREATE_JOINABLE  / **/
+
+/* HAS_PTHREAD_YIELD:
+ *	This symbol, if defined, indicates that the pthread_yield 
+ *	routine is available to yield the execution of the current
+ *	thread.	 sched_yield is preferable to pthread_yield.
+ */
+/* SCHED_YIELD:
+ *	This symbol defines the way to yield the execution of
+ *	the current thread.  Known ways are sched_yield,
+ *	pthread_yield, and pthread_yield with NULL.
+ */
+/* HAS_SCHED_YIELD:
+ *	This symbol, if defined, indicates that the sched_yield
+ *	routine is available to yield the execution of the current
+ *	thread.	 sched_yield is preferable to pthread_yield.
+ */
+/*#define HAS_PTHREAD_YIELD	/ **/
+#define SCHED_YIELD	sched_yield()	/**/
+/*#define HAS_SCHED_YIELD	/ **/
+
+/* HAS_RANDOM_R:
+ *	This symbol, if defined, indicates that the random_r routine
+ *	is available to random re-entrantly.
+ */
+/* RANDOM_R_PROTO:
+ *	This symbol encodes the prototype of random_r.
+ *	It is zero if d_random_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_random_r
+ *	is defined.
+ */
+/*#define HAS_RANDOM_R	   / **/
+#define RANDOM_R_PROTO 0	   /**/
+
+/* HAS_READDIR_R:
+ *	This symbol, if defined, indicates that the readdir_r routine
+ *	is available to readdir re-entrantly.
+ */
+/* READDIR_R_PROTO:
+ *	This symbol encodes the prototype of readdir_r.
+ *	It is zero if d_readdir_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir_r
+ *	is defined.
+ */
+/*#define HAS_READDIR_R	   / **/
+#define READDIR_R_PROTO 0	   /**/
+
+/* HAS_READV:
+ *	This symbol, if defined, indicates that the readv routine is
+ *	available to do gather reads.  You will also need <sys/uio.h>
+ *	and there I_SYSUIO.
+ */
+/*#define HAS_READV		/ **/
+
+/* HAS_RECVMSG:
+ *	This symbol, if defined, indicates that the recvmsg routine is
+ *	available to send structured socket messages.
+ */
+/*#define HAS_RECVMSG		/ **/
+
+/* HAS_SAFE_BCOPY:
+ *	This symbol, if defined, indicates that the bcopy routine is available
+ *	to copy potentially overlapping memory blocks. Normally, you should
+ *	probably use memmove() or memcpy(). If neither is defined, roll your
+ *	own version.
+ */
+/*#define HAS_SAFE_BCOPY	/ **/
+
+/* HAS_SAFE_MEMCPY:
+ *	This symbol, if defined, indicates that the memcpy routine is available
+ *	to copy potentially overlapping memory blocks.  If you need to
+ *	copy overlapping memory blocks, you should check HAS_MEMMOVE and
+ *	use memmove() instead, if available.
+ */
+/*#define HAS_SAFE_MEMCPY	/ **/
+
+/* HAS_SANE_MEMCMP:
+ *	This symbol, if defined, indicates that the memcmp routine is available
+ *	and can be used to compare relative magnitudes of chars with their high
+ *	bits set.  If it is not defined, roll your own version.
+ */
+/*#define HAS_SANE_MEMCMP	/ **/
+
+/* HAS_SBRK_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the sbrk() function.  Otherwise, it is up
+ *	to the program to supply one.  Good guesses are
+ *		extern void* sbrk(int);
+ *		extern void* sbrk(size_t);
+ */
+/*#define	HAS_SBRK_PROTO	/ **/
+
+/* HAS_SEM:
+ *	This symbol, if defined, indicates that the entire sem*(2) library is
+ *	supported.
+ */
+/*#define HAS_SEM		/ **/
+
+/* HAS_SENDMSG:
+ *	This symbol, if defined, indicates that the sendmsg routine is
+ *	available to send structured socket messages.
+ */
+/*#define HAS_SENDMSG		/ **/
+
+/* HAS_SETGRENT:
+ *	This symbol, if defined, indicates that the setgrent routine is
+ *	available for initializing sequential access of the group database.
+ */
+/*#define HAS_SETGRENT		/ **/
+
+/* HAS_SETGRENT_R:
+ *	This symbol, if defined, indicates that the setgrent_r routine
+ *	is available to setgrent re-entrantly.
+ */
+/* SETGRENT_R_PROTO:
+ *	This symbol encodes the prototype of setgrent_r.
+ *	It is zero if d_setgrent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setgrent_r
+ *	is defined.
+ */
+/*#define HAS_SETGRENT_R	   / **/
+#define SETGRENT_R_PROTO 0	   /**/
+
+/* HAS_SETGROUPS:
+ *	This symbol, if defined, indicates that the setgroups() routine is
+ *	available to set the list of process groups.  If unavailable, multiple
+ *	groups are probably not supported.
+ */
+/*#define HAS_SETGROUPS		/ **/
+
+/* HAS_SETHOSTENT:
+ *	This symbol, if defined, indicates that the sethostent() routine is
+ *	available.
+ */
+/*#define HAS_SETHOSTENT		/ **/
+
+/* HAS_SETITIMER:
+ *	This symbol, if defined, indicates that the setitimer routine is
+ *	available to set interval timers.
+ */
+/*#define HAS_SETITIMER		/ **/
+
+/* HAS_SETNETENT:
+ *	This symbol, if defined, indicates that the setnetent() routine is
+ *	available.
+ */
+/*#define HAS_SETNETENT		/ **/
+
+/* HAS_SETPROTOENT:
+ *	This symbol, if defined, indicates that the setprotoent() routine is
+ *	available.
+ */
+/*#define HAS_SETPROTOENT		/ **/
+
+/* HAS_SETPGRP:
+ *	This symbol, if defined, indicates that the setpgrp routine is
+ *	available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ *	This symbol, if defined, indicates that setpgrp needs two
+ *	arguments whereas USG one needs none.  See also HAS_SETPGID
+ *	for a POSIX interface.
+ */
+/*#define HAS_SETPGRP		/ **/
+/*#define USE_BSD_SETPGRP	/ **/
+
+/* HAS_SETPROCTITLE:
+ *	This symbol, if defined, indicates that the setproctitle routine is
+ *	available to set process title.
+ */
+/*#define HAS_SETPROCTITLE		/ **/
+
+/* HAS_SETPWENT:
+ *	This symbol, if defined, indicates that the setpwent routine is
+ *	available for initializing sequential access of the passwd database.
+ */
+/*#define HAS_SETPWENT		/ **/
+
+/* HAS_SETPWENT_R:
+ *	This symbol, if defined, indicates that the setpwent_r routine
+ *	is available to setpwent re-entrantly.
+ */
+/* SETPWENT_R_PROTO:
+ *	This symbol encodes the prototype of setpwent_r.
+ *	It is zero if d_setpwent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setpwent_r
+ *	is defined.
+ */
+/*#define HAS_SETPWENT_R	   / **/
+#define SETPWENT_R_PROTO 0	   /**/
+
+/* HAS_SETSERVENT:
+ *	This symbol, if defined, indicates that the setservent() routine is
+ *	available.
+ */
+/*#define HAS_SETSERVENT		/ **/
+
+/* HAS_SETVBUF:
+ *	This symbol, if defined, indicates that the setvbuf routine is
+ *	available to change buffering on an open stdio stream.
+ *	to a line-buffered mode.
+ */
+/*#define HAS_SETVBUF		/ **/
+
+/* USE_SFIO:
+ *	This symbol, if defined, indicates that sfio should
+ *	be used.
+ */
+/*#define	USE_SFIO		/ **/
+
+/* HAS_SHM:
+ *	This symbol, if defined, indicates that the entire shm*(2) library is
+ *	supported.
+ */
+/*#define HAS_SHM		/ **/
+
+/* HAS_SIGACTION:
+ *	This symbol, if defined, indicates that Vr4's sigaction() routine
+ *	is available.
+ */
+/*#define HAS_SIGACTION	/ **/
+
+/* HAS_SIGSETJMP:
+ *	This variable indicates to the C program that the sigsetjmp()
+ *	routine is available to save the calling process's registers
+ *	and stack environment for later use by siglongjmp(), and
+ *	to optionally save the process's signal mask.  See
+ *	Sigjmp_buf, Sigsetjmp, and Siglongjmp.
+ */
+/* Sigjmp_buf:
+ *	This is the buffer type to be used with Sigsetjmp and Siglongjmp.
+ */
+/* Sigsetjmp:
+ *	This macro is used in the same way as sigsetjmp(), but will invoke
+ *	traditional setjmp() if sigsetjmp isn't available.
+ *	See HAS_SIGSETJMP.
+ */
+/* Siglongjmp:
+ *	This macro is used in the same way as siglongjmp(), but will invoke
+ *	traditional longjmp() if siglongjmp isn't available.
+ *	See HAS_SIGSETJMP.
+ */
+/*#define HAS_SIGSETJMP	/ **/
+#ifdef HAS_SIGSETJMP
+#define Sigjmp_buf sigjmp_buf
+#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask))
+#define Siglongjmp(buf,retval) siglongjmp((buf),(retval))
+#else
+#define Sigjmp_buf jmp_buf
+#define Sigsetjmp(buf,save_mask) setjmp((buf))
+#define Siglongjmp(buf,retval) longjmp((buf),(retval))
+#endif
+
+/* USE_SITECUSTOMIZE:
+ *	This symbol, if defined, indicates that sitecustomize should
+ *	be used.
+ */
+/*#define	USE_SITECUSTOMIZE		/ **/
+
+/* HAS_SOCKET:
+ *	This symbol, if defined, indicates that the BSD socket interface is
+ *	supported.
+ */
+/* HAS_SOCKETPAIR:
+ *	This symbol, if defined, indicates that the BSD socketpair() call is
+ *	supported.
+ */
+/* HAS_MSG_CTRUNC:
+ *	This symbol, if defined, indicates that the MSG_CTRUNC is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/* HAS_MSG_DONTROUTE:
+ *	This symbol, if defined, indicates that the MSG_DONTROUTE is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/* HAS_MSG_OOB:
+ *	This symbol, if defined, indicates that the MSG_OOB is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/* HAS_MSG_PEEK:
+ *	This symbol, if defined, indicates that the MSG_PEEK is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/* HAS_MSG_PROXY:
+ *	This symbol, if defined, indicates that the MSG_PROXY is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/* HAS_SCM_RIGHTS:
+ *	This symbol, if defined, indicates that the SCM_RIGHTS is supported.
+ *	Checking just with #ifdef might not be enough because this symbol
+ *	has been known to be an enum.
+ */
+/*#define	HAS_SOCKET		/ **/
+/*#define	HAS_SOCKETPAIR	/ **/
+/*#define	HAS_MSG_CTRUNC	/ **/
+/*#define	HAS_MSG_DONTROUTE	/ **/
+/*#define	HAS_MSG_OOB	/ **/
+/*#define	HAS_MSG_PEEK	/ **/
+/*#define	HAS_MSG_PROXY	/ **/
+/*#define	HAS_SCM_RIGHTS	/ **/
+
+/* HAS_SOCKS5_INIT:
+ *	This symbol, if defined, indicates that the socks5_init routine is
+ *	available to initialize SOCKS 5.
+ */
+/*#define HAS_SOCKS5_INIT		/ **/
+
+/* HAS_SQRTL:
+ *	This symbol, if defined, indicates that the sqrtl routine is
+ *	available to do long double square roots.
+ */
+/*#define HAS_SQRTL		/ **/
+
+/* HAS_SRAND48_R:
+ *	This symbol, if defined, indicates that the srand48_r routine
+ *	is available to srand48 re-entrantly.
+ */
+/* SRAND48_R_PROTO:
+ *	This symbol encodes the prototype of srand48_r.
+ *	It is zero if d_srand48_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_srand48_r
+ *	is defined.
+ */
+/*#define HAS_SRAND48_R	   / **/
+#define SRAND48_R_PROTO 0	   /**/
+
+/* HAS_SRANDOM_R:
+ *	This symbol, if defined, indicates that the srandom_r routine
+ *	is available to srandom re-entrantly.
+ */
+/* SRANDOM_R_PROTO:
+ *	This symbol encodes the prototype of srandom_r.
+ *	It is zero if d_srandom_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_srandom_r
+ *	is defined.
+ */
+/*#define HAS_SRANDOM_R	   / **/
+#define SRANDOM_R_PROTO 0	   /**/
+
+/* USE_STAT_BLOCKS:
+ *	This symbol is defined if this system has a stat structure declaring
+ *	st_blksize and st_blocks.
+ */
+#ifndef USE_STAT_BLOCKS
+/*#define USE_STAT_BLOCKS 	/ **/
+#endif
+
+/* HAS_STRUCT_STATFS_F_FLAGS:
+ *	This symbol, if defined, indicates that the struct statfs
+ *	does have the f_flags member containing the mount flags of
+ *	the filesystem containing the file.
+ *	This kind of struct statfs is coming from <sys/mount.h> (BSD 4.3),
+ *	not from <sys/statfs.h> (SYSV).  Older BSDs (like Ultrix) do not
+ *	have statfs() and struct statfs, they have ustat() and getmnt()
+ *	with struct ustat and struct fs_data.
+ */
+/*#define HAS_STRUCT_STATFS_F_FLAGS		/ **/
+
+/* HAS_STRUCT_STATFS:
+ *	This symbol, if defined, indicates that the struct statfs
+ *	to do statfs() is supported.
+ */
+/*#define HAS_STRUCT_STATFS	/ **/
+
+/* HAS_FSTATVFS:
+ *	This symbol, if defined, indicates that the fstatvfs routine is
+ *	available to stat filesystems by file descriptors.
+ */
+/*#define HAS_FSTATVFS		/ **/
+
+/* USE_STDIO_PTR:
+ *	This symbol is defined if the _ptr and _cnt fields (or similar)
+ *	of the stdio FILE structure can be used to access the stdio buffer
+ *	for a file handle.  If this is defined, then the FILE_ptr(fp)
+ *	and FILE_cnt(fp) macros will also be defined and should be used
+ *	to access these fields.
+ */
+/* FILE_ptr:
+ *	This macro is used to access the _ptr field (or equivalent) of the
+ *	FILE structure pointed to by its argument. This macro will always be
+ *	defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_PTR_LVALUE:
+ *	This symbol is defined if the FILE_ptr macro can be used as an
+ *	lvalue.
+ */
+/* FILE_cnt:
+ *	This macro is used to access the _cnt field (or equivalent) of the
+ *	FILE structure pointed to by its argument. This macro will always be
+ *	defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_CNT_LVALUE:
+ *	This symbol is defined if the FILE_cnt macro can be used as an
+ *	lvalue.
+ */
+/* STDIO_PTR_LVAL_SETS_CNT:
+ *	This symbol is defined if using the FILE_ptr macro as an lvalue
+ *	to increase the pointer by n has the side effect of decreasing the
+ *	value of File_cnt(fp) by n.
+ */
+/* STDIO_PTR_LVAL_NOCHANGE_CNT:
+ *	This symbol is defined if using the FILE_ptr macro as an lvalue
+ *	to increase the pointer by n leaves File_cnt(fp) unchanged.
+ */
+/*#define USE_STDIO_PTR 	/ **/
+#ifdef USE_STDIO_PTR
+#define FILE_ptr(fp)	((fp)->_IO_read_ptr)
+/*#define STDIO_PTR_LVALUE 		/ **/
+#define FILE_cnt(fp)	((fp)->_IO_read_end - (fp)->_IO_read_ptr)
+/*#define STDIO_CNT_LVALUE 		/ **/
+/*#define STDIO_PTR_LVAL_SETS_CNT	/ **/
+/*#define STDIO_PTR_LVAL_NOCHANGE_CNT	/ **/
+#endif
+
+/* USE_STDIO_BASE:
+ *	This symbol is defined if the _base field (or similar) of the
+ *	stdio FILE structure can be used to access the stdio buffer for
+ *	a file handle.  If this is defined, then the FILE_base(fp) macro
+ *	will also be defined and should be used to access this field.
+ *	Also, the FILE_bufsiz(fp) macro will be defined and should be used
+ *	to determine the number of bytes in the buffer.  USE_STDIO_BASE
+ *	will never be defined unless USE_STDIO_PTR is.
+ */
+/* FILE_base:
+ *	This macro is used to access the _base field (or equivalent) of the
+ *	FILE structure pointed to by its argument. This macro will always be
+ *	defined if USE_STDIO_BASE is defined.
+ */
+/* FILE_bufsiz:
+ *	This macro is used to determine the number of bytes in the I/O
+ *	buffer pointed to by _base field (or equivalent) of the FILE
+ *	structure pointed to its argument. This macro will always be defined
+ *	if USE_STDIO_BASE is defined.
+ */
+/*#define USE_STDIO_BASE 	/ **/
+#ifdef USE_STDIO_BASE
+#define FILE_base(fp)	((fp)->_IO_read_base)
+#define FILE_bufsiz(fp)	((fp)->_IO_read_end - (fp)->_IO_read_base)
+#endif
+
+/* HAS_STRERROR:
+ *	This symbol, if defined, indicates that the strerror routine is
+ *	available to translate error numbers to strings. See the writeup
+ *	of Strerror() in this file before you try to define your own.
+ */
+/* HAS_SYS_ERRLIST:
+ *	This symbol, if defined, indicates that the sys_errlist array is
+ *	available to translate error numbers to strings. The extern int
+ *	sys_nerr gives the size of that table.
+ */
+/* Strerror:
+ *	This preprocessor symbol is defined as a macro if strerror() is
+ *	not available to translate error numbers to strings but sys_errlist[]
+ *	array is there.
+ */
+/*#define HAS_STRERROR		/ **/
+/*#define HAS_SYS_ERRLIST	/ **/
+#define Strerror(e) strerror(e)
+
+/* HAS_STRERROR_R:
+ *	This symbol, if defined, indicates that the strerror_r routine
+ *	is available to strerror re-entrantly.
+ */
+/* STRERROR_R_PROTO:
+ *	This symbol encodes the prototype of strerror_r.
+ *	It is zero if d_strerror_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_strerror_r
+ *	is defined.
+ */
+/*#define HAS_STRERROR_R	   / **/
+#define STRERROR_R_PROTO 0	   /**/
+
+/* HAS_STRTOLD:
+ *	This symbol, if defined, indicates that the strtold routine is
+ *	available to convert strings to long doubles.
+ */
+/*#define HAS_STRTOLD		/ **/
+
+/* HAS_STRTOLL:
+ *	This symbol, if defined, indicates that the strtoll routine is
+ *	available to convert strings to long longs.
+ */
+/*#define HAS_STRTOLL		/ **/
+
+/* HAS_STRTOQ:
+ *	This symbol, if defined, indicates that the strtoq routine is
+ *	available to convert strings to long longs (quads).
+ */
+/*#define HAS_STRTOQ		/ **/
+
+/* HAS_STRTOUL:
+ *	This symbol, if defined, indicates that the strtoul routine is
+ *	available to provide conversion of strings to unsigned long.
+ */
+#define HAS_STRTOUL	/**/
+
+/* HAS_STRTOULL:
+ *	This symbol, if defined, indicates that the strtoull routine is
+ *	available to convert strings to unsigned long longs.
+ */
+/*#define HAS_STRTOULL		/ **/
+
+/* HAS_STRTOUQ:
+ *	This symbol, if defined, indicates that the strtouq routine is
+ *	available to convert strings to unsigned long longs (quads).
+ */
+/*#define HAS_STRTOUQ		/ **/
+
+/* HAS_TELLDIR_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the telldir() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern long telldir(DIR*);
+ */
+/*#define	HAS_TELLDIR_PROTO	/ **/
+
+/* HAS_TIME:
+ *	This symbol, if defined, indicates that the time() routine exists.
+ */
+/* Time_t:
+ *	This symbol holds the type returned by time(). It can be long,
+ *	or time_t on BSD sites (in which case <sys/types.h> should be
+ *	included).
+ */
+#define HAS_TIME		/**/
+#define Time_t time_t		/* Time type */
+
+/* HAS_TIMES:
+ *	This symbol, if defined, indicates that the times() routine exists.
+ *	Note that this became obsolete on some systems (SUNOS), which now
+ * use getrusage(). It may be necessary to include <sys/times.h>.
+ */
+/*#define HAS_TIMES		/ **/
+
+/* HAS_TMPNAM_R:
+ *	This symbol, if defined, indicates that the tmpnam_r routine
+ *	is available to tmpnam re-entrantly.
+ */
+/* TMPNAM_R_PROTO:
+ *	This symbol encodes the prototype of tmpnam_r.
+ *	It is zero if d_tmpnam_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_tmpnam_r
+ *	is defined.
+ */
+/*#define HAS_TMPNAM_R	   / **/
+#define TMPNAM_R_PROTO 0	   /**/
+
+/* HAS_UALARM:
+ *	This symbol, if defined, indicates that the ualarm routine is
+ *	available to do alarms with microsecond granularity.
+ */
+/*#define HAS_UALARM		/ **/
+
+/* HAS_UNION_SEMUN:
+ *	This symbol, if defined, indicates that the union semun is
+ *	defined by including <sys/sem.h>.  If not, the user code
+ *	probably needs to define it as:
+ *	union semun {
+ *	    int val;
+ *	    struct semid_ds *buf;
+ *	    unsigned short *array;
+ *	}
+ */
+/* USE_SEMCTL_SEMUN:
+ *	This symbol, if defined, indicates that union semun is
+ *	used for semctl IPC_STAT.
+ */
+/* USE_SEMCTL_SEMID_DS:
+ *	This symbol, if defined, indicates that struct semid_ds * is
+ *	used for semctl IPC_STAT.
+ */
+/*#define HAS_UNION_SEMUN	/ **/
+/*#define USE_SEMCTL_SEMUN	/ **/
+/*#define USE_SEMCTL_SEMID_DS	/ **/
+
+/* HAS_UNORDERED:
+ *	This symbol, if defined, indicates that the unordered routine is
+ *	available to check whether two doubles are unordered
+ *	(effectively: whether either of them is NaN)
+ */
+/*#define HAS_UNORDERED		/ **/
+
+/* HAS_UNSETENV:
+ *	This symbol, if defined, indicates that the unsetenv () routine is
+ *	available for use.
+ */
+/*#define HAS_UNSETENV		/ **/
+
+/* HAS_USTAT:
+ *	This symbol, if defined, indicates that the ustat system call is
+ *	available to query file system statistics by dev_t.
+ */
+/*#define HAS_USTAT		/ **/
+
+/* HAS_VFORK:
+ *	This symbol, if defined, indicates that vfork() exists.
+ */
+/*#define HAS_VFORK	/ **/
+
+/* Signal_t:
+ *	This symbol's value is either "void" or "int", corresponding to the
+ *	appropriate return type of a signal handler.  Thus, you can declare
+ *	a signal handler using "Signal_t (*handler)()", and define the
+ *	handler using "Signal_t handler(sig)".
+ */
+#define Signal_t int	/* Signal handler's return type */
+
+/* HAS_VPRINTF:
+ *	This symbol, if defined, indicates that the vprintf routine is available
+ *	to printf with a pointer to an argument list.  If unavailable, you
+ *	may need to write your own, probably in terms of _doprnt().
+ */
+/* USE_CHAR_VSPRINTF:
+ *	This symbol is defined if this system has vsprintf() returning type
+ *	(char*).  The trend seems to be to declare it as "int vsprintf()".  It
+ *	is up to the package author to declare vsprintf correctly based on the
+ *	symbol.
+ */
+#define HAS_VPRINTF	/**/
+/*#define USE_CHAR_VSPRINTF 	/ **/
+
+/* HAS_WRITEV:
+ *	This symbol, if defined, indicates that the writev routine is
+ *	available to do scatter writes.
+ */
+/*#define HAS_WRITEV		/ **/
+
+/* USE_DYNAMIC_LOADING:
+ *	This symbol, if defined, indicates that dynamic loading of
+ *	some sort is available.
+ */
+/*#define USE_DYNAMIC_LOADING		/ **/
+
+/* DOUBLESIZE:
+ *	This symbol contains the size of a double, so that the C preprocessor
+ *	can make decisions based on it.
+ */
+#define DOUBLESIZE 8		/**/
+
+/* EBCDIC:
+ *     This symbol, if defined, indicates that this system uses
+ *	EBCDIC encoding.
+ */
+/*#define	EBCDIC 		/ **/
+
+/* FFLUSH_NULL:
+ *	This symbol, if defined, tells that fflush(NULL) does flush
+ *	all pending stdio output.
+ */
+/* FFLUSH_ALL:
+ *	This symbol, if defined, tells that to flush
+ *	all pending stdio output one must loop through all
+ *	the stdio file handles stored in an array and fflush them.
+ *	Note that if fflushNULL is defined, fflushall will not
+ *	even be probed for and will be left undefined.
+ */
+/*#define	FFLUSH_NULL 		/ **/
+/*#define	FFLUSH_ALL 		/ **/
+
+/* Fpos_t:
+ *	This symbol holds the type used to declare file positions in libc.
+ *	It can be fpos_t, long, uint, etc... It may be necessary to include
+ *	<sys/types.h> to get any typedef'ed information.
+ */
+#define Fpos_t int		/* File position type */
+
+/* Gid_t_f:
+ *	This symbol defines the format string used for printing a Gid_t.
+ */
+#define	Gid_t_f		"lu"		/**/
+
+/* Gid_t_sign:
+ *	This symbol holds the signedess of a Gid_t.
+ *	1 for unsigned, -1 for signed.
+ */
+#define Gid_t_sign	1		/* GID sign */
+
+/* Gid_t_size:
+ *	This symbol holds the size of a Gid_t in bytes.
+ */
+#define Gid_t_size 4		/* GID size */
+
+/* Gid_t:
+ *	This symbol holds the return type of getgid() and the type of
+ *	argument to setrgid() and related functions.  Typically,
+ *	it is the type of group ids in the kernel. It can be int, ushort,
+ *	gid_t, etc... It may be necessary to include <sys/types.h> to get
+ *	any typedef'ed information.
+ */
+#define Gid_t int		/* Type for getgid(), etc... */
+
+/* Groups_t:
+ *	This symbol holds the type used for the second argument to
+ *	getgroups() and setgroups().  Usually, this is the same as
+ *	gidtype (gid_t) , but sometimes it isn't.
+ *	It can be int, ushort, gid_t, etc... 
+ *	It may be necessary to include <sys/types.h> to get any 
+ *	typedef'ed information.  This is only required if you have
+ *	getgroups() or setgroups()..
+ */
+#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
+#define Groups_t int	/* Type for 2nd arg to [sg]etgroups() */
+#endif
+
+/* DB_Prefix_t:
+ *	This symbol contains the type of the prefix structure element
+ *	in the <db.h> header file.  In older versions of DB, it was
+ *	int, while in newer ones it is u_int32_t.
+ */
+/* DB_Hash_t:
+ *	This symbol contains the type of the prefix structure element
+ *	in the <db.h> header file.  In older versions of DB, it was
+ *	int, while in newer ones it is size_t.
+ */
+/* DB_VERSION_MAJOR_CFG:
+ *	This symbol, if defined, defines the major version number of
+ *	Berkeley DB found in the <db.h> header when Perl was configured.
+ */
+/* DB_VERSION_MINOR_CFG:
+ *	This symbol, if defined, defines the minor version number of
+ *	Berkeley DB found in the <db.h> header when Perl was configured.
+ *	For DB version 1 this is always 0.
+ */
+/* DB_VERSION_PATCH_CFG:
+ *	This symbol, if defined, defines the patch version number of
+ *	Berkeley DB found in the <db.h> header when Perl was configured.
+ *	For DB version 1 this is always 0.
+ */
+#define DB_Hash_t	u_int32_t		/**/
+#define DB_Prefix_t	size_t  	/**/
+#define DB_VERSION_MAJOR_CFG	  	/**/
+#define DB_VERSION_MINOR_CFG	  	/**/
+#define DB_VERSION_PATCH_CFG	  	/**/
+
+/* I_FP_CLASS:
+ *	This symbol, if defined, indicates that <fp_class.h> exists and
+ *	should be included.
+ */
+/*#define	I_FP_CLASS		/ **/
+
+/* I_GRP:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <grp.h>.
+ */
+/* GRPASSWD:
+ *	This symbol, if defined, indicates to the C program that struct group
+ *	in <grp.h> contains gr_passwd.
+ */
+/*#define I_GRP		/ **/
+/*#define GRPASSWD	/ **/
+
+/* I_IEEEFP:
+ *	This symbol, if defined, indicates that <ieeefp.h> exists and
+ *	should be included.
+ */
+/*#define	I_IEEEFP		/ **/
+
+/* I_INTTYPES:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <inttypes.h>.
+ */
+/*#define   I_INTTYPES                / **/
+
+/* I_LIBUTIL:
+ *	This symbol, if defined, indicates that <libutil.h> exists and
+ *	should be included.
+ */
+/*#define	I_LIBUTIL		/ **/
+
+/* I_MACH_CTHREADS:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <mach/cthreads.h>.
+ */
+/*#define   I_MACH_CTHREADS	/ **/
+
+/* I_MNTENT:
+ *	This symbol, if defined, indicates that <mntent.h> exists and
+ *	should be included.
+ */
+/*#define	I_MNTENT		/ **/
+
+/* I_NETDB:
+ *	This symbol, if defined, indicates that <netdb.h> exists and
+ *	should be included.
+ */
+/*#define I_NETDB		/ **/
+
+/* I_NETINET_TCP:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <netinet/tcp.h>.
+ */
+/*#define   I_NETINET_TCP                / **/
+
+/* I_POLL:
+ *	This symbol, if defined, indicates that <poll.h> exists and
+ *	should be included.
+ */
+/*#define	I_POLL		/ **/
+
+/* I_PROT:
+ *	This symbol, if defined, indicates that <prot.h> exists and
+ *	should be included.
+ */
+/*#define	I_PROT		/ **/
+
+/* I_PTHREAD:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <pthread.h>.
+ */
+/*#define   I_PTHREAD	/ **/
+
+/* I_PWD:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <pwd.h>.
+ */
+/* PWQUOTA:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_quota.
+ */
+/* PWAGE:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_age.
+ */
+/* PWCHANGE:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_change.
+ */
+/* PWCLASS:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_class.
+ */
+/* PWEXPIRE:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_expire.
+ */
+/* PWCOMMENT:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_comment.
+ */
+/* PWGECOS:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_gecos.
+ */
+/* PWPASSWD:
+ *	This symbol, if defined, indicates to the C program that struct passwd
+ *	contains pw_passwd.
+ */
+/*#define I_PWD		/ **/
+/*#define PWQUOTA	/ **/
+/*#define PWAGE	/ **/
+/*#define PWCHANGE	/ **/
+/*#define PWCLASS	/ **/
+/*#define PWEXPIRE	/ **/
+/*#define PWCOMMENT	/ **/
+/*#define PWGECOS	/ **/
+/*#define PWPASSWD	/ **/
+
+/* I_SHADOW:
+ *	This symbol, if defined, indicates that <shadow.h> exists and
+ *	should be included.
+ */
+/*#define	I_SHADOW		/ **/
+
+/* I_SOCKS:
+ *	This symbol, if defined, indicates that <socks.h> exists and
+ *	should be included.
+ */
+/*#define	I_SOCKS		/ **/
+
+/* I_SUNMATH:
+ *	This symbol, if defined, indicates that <sunmath.h> exists and
+ *	should be included.
+ */
+/*#define	I_SUNMATH		/ **/
+
+/* I_SYSLOG:
+ *	This symbol, if defined, indicates that <syslog.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYSLOG		/ **/
+
+/* I_SYSMODE:
+ *	This symbol, if defined, indicates that <sys/mode.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYSMODE		/ **/
+
+/* I_SYS_MOUNT:
+ *	This symbol, if defined, indicates that <sys/mount.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYS_MOUNT		/ **/
+
+/* I_SYS_STATFS:
+ *	This symbol, if defined, indicates that <sys/statfs.h> exists.
+ */
+/*#define	I_SYS_STATFS		/ **/
+
+/* I_SYS_STATVFS:
+ *	This symbol, if defined, indicates that <sys/statvfs.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYS_STATVFS		/ **/
+
+/* I_SYSUIO:
+ *	This symbol, if defined, indicates that <sys/uio.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYSUIO		/ **/
+
+/* I_SYSUTSNAME:
+ *	This symbol, if defined, indicates that <sys/utsname.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYSUTSNAME		/ **/
+
+/* I_SYS_VFS:
+ *	This symbol, if defined, indicates that <sys/vfs.h> exists and
+ *	should be included.
+ */
+/*#define	I_SYS_VFS		/ **/
+
+/* I_TIME:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <time.h>.
+ */
+/* I_SYS_TIME:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/time.h>.
+ */
+/* I_SYS_TIME_KERNEL:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <sys/time.h> with KERNEL defined.
+ */
+/* HAS_TM_TM_ZONE:
+ *	This symbol, if defined, indicates to the C program that
+ *	the struct tm has a tm_zone field.
+ */
+/* HAS_TM_TM_GMTOFF:
+ *	This symbol, if defined, indicates to the C program that
+ *	the struct tm has a tm_gmtoff field.
+ */
+#define I_TIME		/**/
+/*#define I_SYS_TIME		/ **/
+/*#define I_SYS_TIME_KERNEL		/ **/
+/*#define HAS_TM_TM_ZONE		/ **/
+/*#define HAS_TM_TM_GMTOFF		/ **/
+
+/* I_USTAT:
+ *	This symbol, if defined, indicates that <ustat.h> exists and
+ *	should be included.
+ */
+/*#define	I_USTAT		/ **/
+
+/* PERL_INC_VERSION_LIST:
+ *	This variable specifies the list of subdirectories in over
+ *	which perl.c:incpush() and lib/lib.pm will automatically
+ *	search when adding directories to @INC, in a format suitable
+ *	for a C initialization string.  See the inc_version_list entry
+ *	in Porting/Glossary for more details.
+ */
+#define PERL_INC_VERSION_LIST NULL		/**/
+
+/* INSTALL_USR_BIN_PERL:
+ *	This symbol, if defined, indicates that Perl is to be installed
+ * 	also as /usr/bin/perl.
+ */
+/*#define INSTALL_USR_BIN_PERL	/ **/
+
+/* PERL_PRIfldbl:
+ *	This symbol, if defined, contains the string used by stdio to
+ *	format long doubles (format 'f') for output.
+ */
+/* PERL_PRIgldbl:
+ *	This symbol, if defined, contains the string used by stdio to
+ *	format long doubles (format 'g') for output.
+ */
+/* PERL_PRIeldbl:
+ *	This symbol, if defined, contains the string used by stdio to
+ *	format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ *	This symbol, if defined, contains the string used by stdio to
+ *	format long doubles (format 'f') for input.
+ */
+/*#define PERL_PRIfldbl	"llf"	/ **/
+/*#define PERL_PRIgldbl	"llg"	/ **/
+/*#define PERL_PRIeldbl	"lle"	/ **/
+/*#define PERL_SCNfldbl	"llf"	/ **/
+
+/* Off_t:
+ *	This symbol holds the type used to declare offsets in the kernel.
+ *	It can be int, long, off_t, etc... It may be necessary to include
+ *	<sys/types.h> to get any typedef'ed information.
+ */
+/* LSEEKSIZE:
+ *	This symbol holds the number of bytes used by the Off_t.
+ */
+/* Off_t_size:
+ *	This symbol holds the number of bytes used by the Off_t.
+ */
+#define Off_t int		/* <offset> type */
+#define LSEEKSIZE 4		/* <offset> size */
+#define Off_t_size 4	/* <offset> size */
+
+/* Free_t:
+ *	This variable contains the return type of free().  It is usually
+ * void, but occasionally int.
+ */
+/* Malloc_t:
+ *	This symbol is the type of pointer returned by malloc and realloc.
+ */
+#define Malloc_t void *			/**/
+#define Free_t int			/**/
+
+/* PERL_MALLOC_WRAP:
+ *	This symbol, if defined, indicates that we'd like malloc wrap checks.
+ */
+/*#define PERL_MALLOC_WRAP		/ **/
+
+/* MYMALLOC:
+ *	This symbol, if defined, indicates that we're using our own malloc.
+ */
+/*#define MYMALLOC			/ **/
+
+/* Mode_t:
+ *	This symbol holds the type used to declare file modes 
+ *	for systems calls.  It is usually mode_t, but may be
+ *	int or unsigned short.  It may be necessary to include <sys/types.h>
+ *	to get any typedef'ed information.
+ */
+#define Mode_t int	 /* file mode parameter for system calls */
+
+/* VAL_O_NONBLOCK:
+ *	This symbol is to be used during open() or fcntl(F_SETFL) to turn on
+ *	non-blocking I/O for the file descriptor. Note that there is no way
+ *	back, i.e. you cannot turn it blocking again this way. If you wish to
+ *	alternatively switch between blocking and non-blocking, use the
+ *	ioctl(FIOSNBIO) call instead, but that is not supported by all devices.
+ */
+/* VAL_EAGAIN:
+ *	This symbol holds the errno error code set by read() when no data was
+ *	present on the non-blocking file descriptor.
+ */
+/* RD_NODATA:
+ *	This symbol holds the return code from read() when no data is present
+ *	on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is
+ *	not defined, then you can't distinguish between no data and EOF by
+ *	issuing a read(). You'll have to find another way to tell for sure!
+ */
+/* EOF_NONBLOCK:
+ *	This symbol, if defined, indicates to the C program that a read() on
+ *	a non-blocking file descriptor will return 0 on EOF, and not the value
+ *	held in RD_NODATA (-1 usually, in that case!).
+ */
+#define VAL_O_NONBLOCK O_NONBLOCK
+#define VAL_EAGAIN EAGAIN
+#define RD_NODATA -1
+#undef EOF_NONBLOCK
+
+/* NEED_VA_COPY:
+ *	This symbol, if defined, indicates that the system stores
+ *	the variable argument list datatype, va_list, in a format
+ *	that cannot be copied by simple assignment, so that some
+ *	other means must be used when copying is required.
+ *	As such systems vary in their provision (or non-provision)
+ *	of copying mechanisms, handy.h defines a platform-
+ *	independent macro, Perl_va_copy(src, dst), to do the job.
+ */
+/*#define	NEED_VA_COPY		/ **/
+
+/* Netdb_host_t:
+ *	This symbol holds the type used for the 1st argument
+ *	to gethostbyaddr().
+ */
+/* Netdb_hlen_t:
+ *	This symbol holds the type used for the 2nd argument
+ *	to gethostbyaddr().
+ */
+/* Netdb_name_t:
+ *	This symbol holds the type used for the argument to
+ *	gethostbyname().
+ */
+/* Netdb_net_t:
+ *	This symbol holds the type used for the 1st argument to
+ *	getnetbyaddr().
+ */
+#define Netdb_host_t		const char * /**/
+#define Netdb_hlen_t		int /**/
+#define Netdb_name_t		const char * /**/
+#define Netdb_net_t		unsigned long /**/
+
+/* PERL_OTHERLIBDIRS:
+ *	This variable contains a colon-separated set of paths for the perl
+ *	binary to search for additional library files or modules.
+ *	These directories will be tacked to the end of @INC.
+ *	Perl will automatically search below each path for version-
+ *	and architecture-specific directories.  See PERL_INC_VERSION_LIST
+ *	for more details.
+ */
+/*#define PERL_OTHERLIBDIRS ""		/ **/
+
+/* HAS_QUAD:
+ *	This symbol, if defined, tells that there's a 64-bit integer type,
+ *	Quad_t, and its unsigned counterpar, Uquad_t. QUADKIND will be one
+ *	of QUAD_IS_INT, QUAD_IS_LONG, QUAD_IS_LONG_LONG, or QUAD_IS_INT64_T.
+ */
+/*#define HAS_QUAD	/ **/
+#ifdef HAS_QUAD
+#   define Quad_t int64_t	/**/
+#   define Uquad_t uint64_t	/**/
+#   define QUADKIND 4	/**/
+#   define QUAD_IS_INT	1
+#   define QUAD_IS_LONG	2
+#   define QUAD_IS_LONG_LONG	3
+#   define QUAD_IS_INT64_T	4
+#endif
+
+/* IVTYPE:
+ *	This symbol defines the C type used for Perl's IV.
+ */
+/* UVTYPE:
+ *	This symbol defines the C type used for Perl's UV.
+ */
+/* I8TYPE:
+ *	This symbol defines the C type used for Perl's I8.
+ */
+/* U8TYPE:
+ *	This symbol defines the C type used for Perl's U8.
+ */
+/* I16TYPE:
+ *	This symbol defines the C type used for Perl's I16.
+ */
+/* U16TYPE:
+ *	This symbol defines the C type used for Perl's U16.
+ */
+/* I32TYPE:
+ *	This symbol defines the C type used for Perl's I32.
+ */
+/* U32TYPE:
+ *	This symbol defines the C type used for Perl's U32.
+ */
+/* I64TYPE:
+ *	This symbol defines the C type used for Perl's I64.
+ */
+/* U64TYPE:
+ *	This symbol defines the C type used for Perl's U64.
+ */
+/* NVTYPE:
+ *	This symbol defines the C type used for Perl's NV.
+ */
+/* IVSIZE:
+ *	This symbol contains the sizeof(IV).
+ */
+/* UVSIZE:
+ *	This symbol contains the sizeof(UV).
+ */
+/* I8SIZE:
+ *	This symbol contains the sizeof(I8).
+ */
+/* U8SIZE:
+ *	This symbol contains the sizeof(U8).
+ */
+/* I16SIZE:
+ *	This symbol contains the sizeof(I16).
+ */
+/* U16SIZE:
+ *	This symbol contains the sizeof(U16).
+ */
+/* I32SIZE:
+ *	This symbol contains the sizeof(I32).
+ */
+/* U32SIZE:
+ *	This symbol contains the sizeof(U32).
+ */
+/* I64SIZE:
+ *	This symbol contains the sizeof(I64).
+ */
+/* U64SIZE:
+ *	This symbol contains the sizeof(U64).
+ */
+/* NVSIZE:
+ *	This symbol contains the sizeof(NV).
+ */
+/* NV_PRESERVES_UV:
+ *	This symbol, if defined, indicates that a variable of type NVTYPE
+ *	can preserve all the bits of a variable of type UVTYPE.
+ */
+/* NV_PRESERVES_UV_BITS:
+ *	This symbol contains the number of bits a variable of type NVTYPE
+ *	can preserve of a variable of type UVTYPE.
+ */
+/* NV_ZERO_IS_ALLBITS_ZERO:
+ *	This symbol, if defined, indicates that a variable of type NVTYPE
+ *	stores 0.0 in memory as all bits zero.
+ */
+#define	IVTYPE		long		/**/
+#define	UVTYPE		unsigned long		/**/
+#define	I8TYPE		char		/**/
+#define	U8TYPE		unsigned char		/**/
+#define	I16TYPE		short	/**/
+#define	U16TYPE		unsigned short	/**/
+#define	I32TYPE		long	/**/
+#define	U32TYPE		unsigned long	/**/
+#ifdef HAS_QUAD
+#define	I64TYPE		int64_t	/**/
+#define	U64TYPE		uint64_t	/**/
+#endif
+#define	NVTYPE		double		/**/
+#define	IVSIZE		4		/**/
+#define	UVSIZE		4		/**/
+#define	I8SIZE		1		/**/
+#define	U8SIZE		1		/**/
+#define	I16SIZE		2	/**/
+#define	U16SIZE		2	/**/
+#define	I32SIZE		4	/**/
+#define	U32SIZE		4	/**/
+#ifdef HAS_QUAD
+#define	I64SIZE		8	/**/
+#define	U64SIZE		8	/**/
+#endif
+#define	NVSIZE		8		/**/
+#undef	NV_PRESERVES_UV
+#define	NV_PRESERVES_UV_BITS	0
+#undef	NV_ZERO_IS_ALLBITS_ZERO
+#if UVSIZE == 8
+#   ifdef BYTEORDER
+#       if BYTEORDER == 0x1234
+#           undef BYTEORDER
+#           define BYTEORDER 0x12345678
+#       else
+#           if BYTEORDER == 0x4321
+#               undef BYTEORDER
+#               define BYTEORDER 0x87654321
+#           endif
+#       endif
+#   endif
+#endif
+
+/* IVdf:
+ *	This symbol defines the format string used for printing a Perl IV
+ *	as a signed decimal integer.
+ */
+/* UVuf:
+ *	This symbol defines the format string used for printing a Perl UV
+ *	as an unsigned decimal integer.
+ */
+/* UVof:
+ *	This symbol defines the format string used for printing a Perl UV
+ *	as an unsigned octal integer.
+ */
+/* UVxf:
+ *	This symbol defines the format string used for printing a Perl UV
+ *	as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* UVXf:
+ *	This symbol defines the format string used for printing a Perl UV
+ *	as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+/* NVef:
+ *	This symbol defines the format string used for printing a Perl NV
+ *	using %e-ish floating point format.
+ */
+/* NVff:
+ *	This symbol defines the format string used for printing a Perl NV
+ *	using %f-ish floating point format.
+ */
+/* NVgf:
+ *	This symbol defines the format string used for printing a Perl NV
+ *	using %g-ish floating point format.
+ */
+#define	IVdf		"ld"		/**/
+#define	UVuf		"lu"		/**/
+#define	UVof		"lo"		/**/
+#define	UVxf		"lx"		/**/
+#define	UVXf		"lX"		/**/
+#define	NVef		"e"		/**/
+#define	NVff		"f"		/**/
+#define	NVgf		"g"		/**/
+
+/* Pid_t:
+ *	This symbol holds the type used to declare process ids in the kernel.
+ *	It can be int, uint, pid_t, etc... It may be necessary to include
+ *	<sys/types.h> to get any typedef'ed information.
+ */
+#define Pid_t int		/* PID type */
+
+/* PRIVLIB:
+ *	This symbol contains the name of the private library for this package.
+ *	The library is private in the sense that it needn't be in anyone's
+ *	execution path, but it should be accessible by the world.  The program
+ *	should be prepared to do ~ expansion.
+ */
+/* PRIVLIB_EXP:
+ *	This symbol contains the ~name expanded version of PRIVLIB, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define PRIVLIB "/usr/local/lib/perl5/5.9"		/**/
+#define PRIVLIB_EXP "/usr/local/lib/perl5/5.9"		/**/
+
+/* PTRSIZE:
+ *	This symbol contains the size of a pointer, so that the C preprocessor
+ *	can make decisions based on it.  It will be sizeof(void *) if
+ *	the compiler supports (void *); otherwise it will be
+ *	sizeof(char *).
+ */
+#define PTRSIZE 4		/**/
+
+/* Drand01:
+ *	This macro is to be used to generate uniformly distributed
+ *	random numbers over the range [0., 1.[.  You may have to supply
+ *	an 'extern double drand48();' in your program since SunOS 4.1.3
+ *	doesn't provide you with anything relevant in its headers.
+ *	See HAS_DRAND48_PROTO.
+ */
+/* Rand_seed_t:
+ *	This symbol defines the type of the argument of the
+ *	random seed function.
+ */
+/* seedDrand01:
+ *	This symbol defines the macro to be used in seeding the
+ *	random number generator (see Drand01).
+ */
+/* RANDBITS:
+ *	This symbol indicates how many bits are produced by the
+ *	function used to generate normalized random numbers.
+ *	Values include 15, 16, 31, and 48.
+ */
+#define Drand01()		((rand() & 0x7FFF) / (double) ((unsigned long)1 << 15))		/**/
+#define Rand_seed_t		int		/**/
+#define seedDrand01(x)	srand((Rand_seed_t)x)	/**/
+#define RANDBITS		48		/**/
+
+/* SELECT_MIN_BITS:
+ *	This symbol holds the minimum number of bits operated by select.
+ *	That is, if you do select(n, ...), how many bits at least will be
+ *	cleared in the masks if some activity is detected.  Usually this
+ *	is either n or 32*ceil(n/32), especially many little-endians do
+ *	the latter.  This is only useful if you have select(), naturally.
+ */
+#define SELECT_MIN_BITS 	32	/**/
+
+/* Select_fd_set_t:
+ *	This symbol holds the type used for the 2nd, 3rd, and 4th
+ *	arguments to select.  Usually, this is 'fd_set *', if HAS_FD_SET
+ *	is defined, and 'int *' otherwise.  This is only useful if you 
+ *	have select(), of course.
+ */
+#define Select_fd_set_t 	int	/**/
+
+/* SIG_NAME:
+ *	This symbol contains a list of signal names in order of
+ *	signal number. This is intended
+ *	to be used as a static array initialization, like this:
+ *		char *sig_name[] = { SIG_NAME };
+ *	The signals in the list are separated with commas, and each signal
+ *	is surrounded by double quotes. There is no leading SIG in the signal
+ *	name, i.e. SIGQUIT is known as "QUIT".
+ *	Gaps in the signal numbers (up to NSIG) are filled in with NUMnn,
+ *	etc., where nn is the actual signal number (e.g. NUM37).
+ *	The signal number for sig_name[i] is stored in sig_num[i].
+ *	The last element is 0 to terminate the list with a NULL.  This
+ *	corresponds to the 0 at the end of the sig_name_init list.
+ *	Note that this variable is initialized from the sig_name_init,
+ *	not from sig_name (which is unused).
+ */
+/* SIG_NUM:
+ *	This symbol contains a list of signal numbers, in the same order as the
+ *	SIG_NAME list. It is suitable for static array initialization, as in:
+ *		int sig_num[] = { SIG_NUM };
+ *	The signals in the list are separated with commas, and the indices
+ *	within that list and the SIG_NAME list match, so it's easy to compute
+ *	the signal name from a number or vice versa at the price of a small
+ *	dynamic linear lookup. 
+ *	Duplicates are allowed, but are moved to the end of the list.
+ *	The signal number corresponding to sig_name[i] is sig_number[i].
+ *	if (i < NSIG) then sig_number[i] == i.  
+ *	The last element is 0, corresponding to the 0 at the end of
+ *	the sig_name_init list.
+ *	Note that this variable is initialized from the sig_num_init,
+ *	not from sig_num (which is unused).
+ */
+/* SIG_SIZE:
+ *	This variable contains the number of elements of the SIG_NAME
+ *	and SIG_NUM arrays, excluding the final NULL entry.
+ */
+#define SIG_NAME 0		/**/
+#define SIG_NUM  0		/**/
+#define SIG_SIZE 1			/**/
+
+/* SITEARCH:
+ *	This symbol contains the name of the private library for this package.
+ *	The library is private in the sense that it needn't be in anyone's
+ *	execution path, but it should be accessible by the world.  The program
+ *	should be prepared to do ~ expansion.
+ *	The standard distribution will put nothing in this directory.
+ *	After perl has been installed, users may install their own local
+ *	architecture-dependent modules in this directory with
+ *		MakeMaker Makefile.PL
+ *	or equivalent.  See INSTALL for details.
+ */
+/* SITEARCH_EXP:
+ *	This symbol contains the ~name expanded version of SITEARCH, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define SITEARCH ""		/**/
+#define SITEARCH_EXP ""		/**/
+
+/* SITELIB:
+ *	This symbol contains the name of the private library for this package.
+ *	The library is private in the sense that it needn't be in anyone's
+ *	execution path, but it should be accessible by the world.  The program
+ *	should be prepared to do ~ expansion.
+ *	The standard distribution will put nothing in this directory.
+ *	After perl has been installed, users may install their own local
+ *	architecture-independent modules in this directory with
+ *		MakeMaker Makefile.PL
+ *	or equivalent.  See INSTALL for details.
+ */
+/* SITELIB_EXP:
+ *	This symbol contains the ~name expanded version of SITELIB, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/* SITELIB_STEM:
+ *	This define is SITELIB_EXP with any trailing version-specific component
+ *	removed.  The elements in inc_version_list (inc_version_list.U) can
+ *	be tacked onto this variable to generate a list of directories to search.
+ */
+#define SITELIB ""		/**/
+#define SITELIB_EXP ""		/**/
+#define SITELIB_STEM ""		/**/
+
+/* Size_t_size:
+ *	This symbol holds the size of a Size_t in bytes.
+ */
+#define Size_t_size 4		/* */
+
+/* Size_t:
+ *	This symbol holds the type used to declare length parameters
+ *	for string functions.  It is usually size_t, but may be
+ *	unsigned long, int, etc.  It may be necessary to include
+ *	<sys/types.h> to get any typedef'ed information.
+ */
+#define Size_t size_t	 /* length paramater for string functions */
+
+/* Sock_size_t:
+ *	This symbol holds the type used for the size argument of
+ *	various socket calls (just the base type, not the pointer-to).
+ */
+#define Sock_size_t		int /**/
+
+/* SSize_t:
+ *	This symbol holds the type used by functions that return
+ *	a count of bytes or an error condition.  It must be a signed type.
+ *	It is usually ssize_t, but may be long or int, etc.
+ *	It may be necessary to include <sys/types.h> or <unistd.h>
+ *	to get any typedef'ed information.
+ *	We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+ */
+#define SSize_t int	 /* signed count of bytes */
+
+/* STARTPERL:
+ *	This variable contains the string to put in front of a perl
+ *	script to make sure (one hopes) that it runs with perl and not
+ *	some shell.
+ */
+#define STARTPERL ""		/**/
+
+/* STDCHAR:
+ *	This symbol is defined to be the type of char used in stdio.h.
+ *	It has the values "unsigned char" or "char".
+ */
+#define STDCHAR char	/**/
+
+/* HAS_STDIO_STREAM_ARRAY:
+ *	This symbol, if defined, tells that there is an array
+ *	holding the stdio streams.
+ */
+/* STDIO_STREAM_ARRAY:
+ *	This symbol tells the name of the array holding the stdio streams.
+ *	Usual values include _iob, __iob, and __sF.
+ */
+/*#define	HAS_STDIO_STREAM_ARRAY	/ **/
+#define STDIO_STREAM_ARRAY	
+
+/* Uid_t_f:
+ *	This symbol defines the format string used for printing a Uid_t.
+ */
+#define	Uid_t_f		"lu"		/**/
+
+/* Uid_t_sign:
+ *	This symbol holds the signedess of a Uid_t.
+ *	1 for unsigned, -1 for signed.
+ */
+#define Uid_t_sign	1		/* UID sign */
+
+/* Uid_t_size:
+ *	This symbol holds the size of a Uid_t in bytes.
+ */
+#define Uid_t_size 4		/* UID size */
+
+/* Uid_t:
+ *	This symbol holds the type used to declare user ids in the kernel.
+ *	It can be int, ushort, uid_t, etc... It may be necessary to include
+ *	<sys/types.h> to get any typedef'ed information.
+ */
+#define Uid_t int		/* UID type */
+
+/* USE_64_BIT_INT:
+ *	This symbol, if defined, indicates that 64-bit integers should
+ *	be used when available.  If not defined, the native integers
+ *	will be employed (be they 32 or 64 bits).  The minimal possible
+ *	64-bitness is used, just enough to get 64-bit integers into Perl.
+ *	This may mean using for example "long longs", while your memory
+ *	may still be limited to 2 gigabytes.
+ */
+/* USE_64_BIT_ALL:
+ *	This symbol, if defined, indicates that 64-bit integers should
+ *	be used when available.  If not defined, the native integers
+ *	will be used (be they 32 or 64 bits).  The maximal possible
+ *	64-bitness is employed: LP64 or ILP64, meaning that you will
+ *	be able to use more than 2 gigabytes of memory.  This mode is
+ *	even more binary incompatible than USE_64_BIT_INT. You may not
+ *	be able to run the resulting executable in a 32-bit CPU at all or
+ *	you may need at least to reboot your OS to 64-bit mode.
+ */
+#ifndef USE_64_BIT_INT
+/*#define	USE_64_BIT_INT		/ **/
+#endif
+
+#ifndef USE_64_BIT_ALL
+/*#define	USE_64_BIT_ALL		/ **/
+#endif
+
+/* USE_LARGE_FILES:
+ *	This symbol, if defined, indicates that large file support
+ *	should be used when available.
+ */
+#ifndef USE_LARGE_FILES
+/*#define	USE_LARGE_FILES		/ **/
+#endif
+
+/* USE_LONG_DOUBLE:
+ *	This symbol, if defined, indicates that long doubles should
+ *	be used when available.
+ */
+#ifndef USE_LONG_DOUBLE
+/*#define	USE_LONG_DOUBLE		/ **/
+#endif
+
+/* USE_MORE_BITS:
+ *	This symbol, if defined, indicates that 64-bit interfaces and
+ *	long doubles should be used when available.
+ */
+#ifndef USE_MORE_BITS
+/*#define	USE_MORE_BITS		/ **/
+#endif
+
+/* MULTIPLICITY:
+ *	This symbol, if defined, indicates that Perl should
+ *	be built to use multiplicity.
+ */
+#ifndef MULTIPLICITY
+/*#define	MULTIPLICITY		/ **/
+#endif
+
+/* USE_PERLIO:
+ *	This symbol, if defined, indicates that the PerlIO abstraction should
+ *	be used throughout.  If not defined, stdio should be
+ *	used in a fully backward compatible manner.
+ */
+#ifndef USE_PERLIO
+/*#define	USE_PERLIO		/ **/
+#endif
+
+/* USE_SOCKS:
+ *	This symbol, if defined, indicates that Perl should
+ *	be built to use socks.
+ */
+#ifndef USE_SOCKS
+/*#define	USE_SOCKS		/ **/
+#endif
+
+/* USE_ITHREADS:
+ *	This symbol, if defined, indicates that Perl should be built to
+ *	use the interpreter-based threading implementation.
+ */
+/* USE_5005THREADS:
+ *	This symbol, if defined, indicates that Perl should be built to
+ *	use the 5.005-based threading implementation.
+ */
+/* OLD_PTHREADS_API:
+ *	This symbol, if defined, indicates that Perl should
+ *	be built to use the old draft POSIX threads API.
+ */
+/* USE_REENTRANT_API:
+ *	This symbol, if defined, indicates that Perl should
+ *	try to use the various _r versions of library functions.
+ *	This is extremely experimental.
+ */
+/*#define	USE_5005THREADS		/ **/
+/*#define	USE_ITHREADS		/ **/
+#if defined(USE_5005THREADS) && !defined(USE_ITHREADS)
+#define		USE_THREADS		/* until src is revised*/
+#endif
+/*#define	OLD_PTHREADS_API		/ **/
+/*#define	USE_REENTRANT_API	/ **/
+
+/* PERL_VENDORARCH:
+ *	If defined, this symbol contains the name of a private library.
+ *	The library is private in the sense that it needn't be in anyone's
+ *	execution path, but it should be accessible by the world.
+ *	It may have a ~ on the front. 
+ *	The standard distribution will put nothing in this directory.
+ *	Vendors who distribute perl may wish to place their own
+ *	architecture-dependent modules and extensions in this directory with
+ *		MakeMaker Makefile.PL INSTALLDIRS=vendor 
+ *	or equivalent.  See INSTALL for details.
+ */
+/* PERL_VENDORARCH_EXP:
+ *	This symbol contains the ~name expanded version of PERL_VENDORARCH, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/*#define PERL_VENDORARCH ""		/ **/
+/*#define PERL_VENDORARCH_EXP ""		/ **/
+
+/* PERL_VENDORLIB_EXP:
+ *	This symbol contains the ~name expanded version of VENDORLIB, to be used
+ *	in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/* PERL_VENDORLIB_STEM:
+ *	This define is PERL_VENDORLIB_EXP with any trailing version-specific component
+ *	removed.  The elements in inc_version_list (inc_version_list.U) can
+ *	be tacked onto this variable to generate a list of directories to search.
+ */
+/*#define PERL_VENDORLIB_EXP ""		/ **/
+/*#define PERL_VENDORLIB_STEM ""		/ **/
+
+/* VOIDFLAGS:
+ *	This symbol indicates how much support of the void type is given by this
+ *	compiler.  What various bits mean:
+ *
+ *	    1 = supports declaration of void
+ *	    2 = supports arrays of pointers to functions returning void
+ *	    4 = supports comparisons between pointers to void functions and
+ *		    addresses of void functions
+ *	    8 = suports declaration of generic void pointers
+ *
+ *	The package designer should define VOIDUSED to indicate the requirements
+ *	of the package.  This can be done either by #defining VOIDUSED before
+ *	including config.h, or by defining defvoidused in Myinit.U.  If the
+ *	latter approach is taken, only those flags will be tested.  If the
+ *	level of void support necessary is not present, defines void to int.
+ */
+#ifndef VOIDUSED
+#define VOIDUSED 1
+#endif
+#define VOIDFLAGS 1
+#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#define void int		/* is void to be avoided? */
+#define M_VOID			/* Xenix strikes again */
+#endif
+
+/* HASATTRIBUTE_FORMAT:
+ *	Can we handle GCC attribute for checking printf-style formats
+ */
+/* HASATTRIBUTE_MALLOC:
+ *	Can we handle GCC attribute for malloc-style functions.
+ */
+/* HASATTRIBUTE_NONNULL:
+ *	Can we handle GCC attribute for nonnull function parms.
+ */
+/* HASATTRIBUTE_NORETURN:
+ *	Can we handle GCC attribute for functions that do not return
+ */
+/* HASATTRIBUTE_PURE:
+ *	Can we handle GCC attribute for pure functions
+ */
+/* HASATTRIBUTE_UNUSED:
+ *	Can we handle GCC attribute for unused variables and arguments
+ */
+/* HASATTRIBUTE_WARN_UNUSED_RESULT:
+ *	Can we handle GCC attribute for warning on unused results
+ */
+/*#define HASATTRIBUTE_FORMAT	/ **/
+/*#define HASATTRIBUTE_NORETURN	/ **/
+/*#define HASATTRIBUTE_MALLOC	/ **/
+/*#define HASATTRIBUTE_NONNULL	/ **/
+/*#define HASATTRIBUTE_PURE	/ **/
+/*#define HASATTRIBUTE_UNUSED	/ **/
+/*#define HASATTRIBUTE_WARN_UNUSED_RESULT	/ **/
+
+/* HAS_CRYPT:
+ *	This symbol, if defined, indicates that the crypt routine is available
+ *	to encrypt passwords and the like.
+ */
+/*#define HAS_CRYPT		/ **/
+
+/* SETUID_SCRIPTS_ARE_SECURE_NOW:
+ *	This symbol, if defined, indicates that the bug that prevents
+ *	setuid scripts from being secure is not present in this kernel.
+ */
+/* DOSUID:
+ *	This symbol, if defined, indicates that the C program should
+ *	check the script that it is executing for setuid/setgid bits, and
+ *	attempt to emulate setuid/setgid on systems that have disabled
+ *	setuid #! scripts because the kernel can't do it securely.
+ *	It is up to the package designer to make sure that this emulation
+ *	is done securely.  Among other things, it should do an fstat on
+ *	the script it just opened to make sure it really is a setuid/setgid
+ *	script, it should make sure the arguments passed correspond exactly
+ *	to the argument on the #! line, and it should not trust any
+ *	subprocesses to which it must pass the filename rather than the
+ *	file descriptor of the script to be executed.
+ */
+/*#define SETUID_SCRIPTS_ARE_SECURE_NOW	/ **/
+/*#define DOSUID		/ **/
+
+/* Shmat_t:
+ *	This symbol holds the return type of the shmat() system call.
+ *	Usually set to 'void *' or 'char *'.
+ */
+/* HAS_SHMAT_PROTOTYPE:
+ *	This symbol, if defined, indicates that the sys/shm.h includes
+ *	a prototype for shmat().  Otherwise, it is up to the program to
+ *	guess one.  Shmat_t shmat(int, Shmat_t, int) is a good guess,
+ *	but not always right so it should be emitted by the program only
+ *	when HAS_SHMAT_PROTOTYPE is not defined to avoid conflicting defs.
+ */
+#define Shmat_t void *	/**/
+/*#define HAS_SHMAT_PROTOTYPE	/ **/
+
+/* I_NDBM:
+ *	This symbol, if defined, indicates that <ndbm.h> exists and should
+ *	be included.
+ */
+/*#define I_NDBM	/ **/
+
+/* I_STDARG:
+ *	This symbol, if defined, indicates that <stdarg.h> exists and should
+ *	be included.
+ */
+/* I_VARARGS:
+ *	This symbol, if defined, indicates to the C program that it should
+ *	include <varargs.h>.
+ */
+#define I_STDARG		/**/
+/*#define I_VARARGS	/ **/
+
+/* CAN_PROTOTYPE:
+ *	If defined, this macro indicates that the C compiler can handle
+ *	function prototypes.
+ */
+/* _:
+ *	This macro is used to declare function parameters for folks who want
+ *	to make declarations with prototypes using a different style than
+ *	the above macros.  Use double parentheses.  For example:
+ *
+ *		int main _((int argc, char *argv[]));
+ */
+/*#define	CAN_PROTOTYPE	/ **/
+#ifdef CAN_PROTOTYPE
+#define	_(args) args
+#else
+#define	_(args) ()
+#endif
+
+/* SH_PATH:
+ *	This symbol contains the full pathname to the shell used on this
+ *	on this system to execute Bourne shell scripts.  Usually, this will be
+ *	/bin/sh, though it's possible that some systems will have /bin/ksh,
+ *	/bin/pdksh, /bin/ash, /bin/bash, or even something such as
+ *	D:/bin/sh.exe.
+ */
+#define SH_PATH ""  /**/
+
+/* HAS_AINTL:
+ *	This symbol, if defined, indicates that the aintl routine is
+ *	available.  If copysignl is also present we can emulate modfl.
+ */
+/*#define HAS_AINTL		/ **/
+
+/* HAS_COPYSIGNL:
+ *	This symbol, if defined, indicates that the copysignl routine is
+ *	available.  If aintl is also present we can emulate modfl.
+ */
+/*#define HAS_COPYSIGNL		/ **/
+
+/* HAS_DBMINIT_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the dbminit() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern int dbminit(char *);
+ */
+/*#define	HAS_DBMINIT_PROTO	/ **/
+
+/* HAS_DIRFD:
+ *	This manifest constant lets the C program know that dirfd
+ *	is available.
+ */
+/*#define HAS_DIRFD		/ **/
+
+/* HAS_FAST_STDIO:
+ *	This symbol, if defined, indicates that the "fast stdio"
+ *	is available to manipulate the stdio buffers directly.
+ */
+/*#define HAS_FAST_STDIO		/ **/
+
+/* HAS_FLOCK_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the flock() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern int flock(int, int);
+ */
+/*#define	HAS_FLOCK_PROTO	/ **/
+
+/* HAS_FPCLASSL:
+ *	This symbol, if defined, indicates that the fpclassl routine is
+ *	available to classify long doubles.  Available for example in IRIX.
+ *	The returned values are defined in <ieeefp.h> and are:
+ *
+ *	FP_SNAN		signaling NaN
+ *	FP_QNAN		quiet NaN
+ *	FP_NINF		negative infinity
+ *	FP_PINF		positive infinity
+ *	FP_NDENORM	negative denormalized non-zero
+ *	FP_PDENORM	positive denormalized non-zero
+ *	FP_NZERO	negative zero
+ *	FP_PZERO	positive zero
+ *	FP_NNORM	negative normalized non-zero
+ *	FP_PNORM	positive normalized non-zero
+ */
+/*#define HAS_FPCLASSL		/ **/
+
+/* HAS_ILOGBL:
+ *	This symbol, if defined, indicates that the ilogbl routine is
+ *	available.  If scalbnl is also present we can emulate frexpl.
+ */
+/*#define HAS_ILOGBL		/ **/
+
+/* LIBM_LIB_VERSION:
+ *	This symbol, if defined, indicates that libm exports _LIB_VERSION
+ *	and that math.h defines the enum to manipulate it.
+ */
+/*#define LIBM_LIB_VERSION		/ **/
+
+/* HAS_NL_LANGINFO:
+ *	This symbol, if defined, indicates that the nl_langinfo routine is
+ *	available to return local data.  You will also need <langinfo.h>
+ *	and therefore I_LANGINFO.
+ */
+/*#define HAS_NL_LANGINFO		/ **/
+
+/* HAS_PROCSELFEXE:
+ *	This symbol is defined if PROCSELFEXE_PATH is a symlink
+ *	to the absolute pathname of the executing program.
+ */
+/* PROCSELFEXE_PATH:
+ *	If HAS_PROCSELFEXE is defined this symbol is the filename
+ *	of the symbolic link pointing to the absolute pathname of
+ *	the executing program.
+ */
+/*#define HAS_PROCSELFEXE	/ **/
+#if defined(HAS_PROCSELFEXE) && !defined(PROCSELFEXE_PATH)
+#define PROCSELFEXE_PATH		/**/
+#endif
+
+/* HAS_PTHREAD_ATTR_SETSCOPE:
+ *	This symbol, if defined, indicates that the pthread_attr_setscope
+ *	system call is available to set the contention scope attribute of
+ *	a thread attribute object.
+ */
+/*#define HAS_PTHREAD_ATTR_SETSCOPE		/ **/
+
+/* HAS_SCALBNL:
+ *	This symbol, if defined, indicates that the scalbnl routine is
+ *	available.  If ilogbl is also present we can emulate frexpl.
+ */
+/*#define HAS_SCALBNL		/ **/
+
+/* HAS_SIGPROCMASK:
+ *	This symbol, if defined, indicates that the sigprocmask
+ *	system call is available to examine or change the signal mask
+ *	of the calling process.
+ */
+/*#define HAS_SIGPROCMASK		/ **/
+
+/* HAS_SOCKATMARK:
+ *	This symbol, if defined, indicates that the sockatmark routine is
+ *	available to test whether a socket is at the out-of-band mark.
+ */
+/*#define HAS_SOCKATMARK		/ **/
+
+/* HAS_SOCKATMARK_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the sockatmark() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern int sockatmark(int);
+ */
+/*#define	HAS_SOCKATMARK_PROTO	/ **/
+
+/* HAS_SETRESGID_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the setresgid() function.  Otherwise, it is up
+ *	to the program to supply one.  Good guesses are
+ *		extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
+ */
+/*#define	HAS_SETRESGID_PROTO	/ **/
+
+/* HAS_SETRESUID_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the setresuid() function.  Otherwise, it is up
+ *	to the program to supply one.  Good guesses are
+ *		extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
+ */
+/*#define	HAS_SETRESUID_PROTO	/ **/
+
+/* HAS_STRFTIME:
+ *	This symbol, if defined, indicates that the strftime routine is
+ *	available to do time formatting.
+ */
+/*#define HAS_STRFTIME		/ **/
+
+/* HAS_STRLCAT:
+ *	This symbol, if defined, indicates that the strlcat () routine is
+ *	available to do string concatenation.
+ */
+/*#define HAS_STRLCAT		/ **/
+
+/* HAS_STRLCPY:
+ *	This symbol, if defined, indicates that the strlcpy () routine is
+ *	available to do string copying.
+ */
+/*#define HAS_STRLCPY		/ **/
+
+/* HAS_SYSCALL_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the syscall() function.  Otherwise, it is up
+ *	to the program to supply one.  Good guesses are
+ *		extern int syscall(int,  ...);
+ *		extern int syscall(long, ...);
+ */
+/*#define	HAS_SYSCALL_PROTO	/ **/
+
+/* U32_ALIGNMENT_REQUIRED:
+ *	This symbol, if defined, indicates that you must access
+ *	character data through U32-aligned pointers.
+ */
+#ifndef U32_ALIGNMENT_REQUIRED
+#define U32_ALIGNMENT_REQUIRED	/**/
+#endif
+
+/* HAS_USLEEP_PROTO:
+ *	This symbol, if defined, indicates that the system provides
+ *	a prototype for the usleep() function.  Otherwise, it is up
+ *	to the program to supply one.  A good guess is
+ *		extern int usleep(useconds_t);
+ */
+/*#define	HAS_USLEEP_PROTO	/ **/
+
+/* I_CRYPT:
+ *	This symbol, if defined, indicates that <crypt.h> exists and
+ *	should be included.
+ */
+/*#define	I_CRYPT		/ **/
+
+/* I_FP:
+ *	This symbol, if defined, indicates that <fp.h> exists and
+ *	should be included.
+ */
+/*#define	I_FP		/ **/
+
+/* I_LANGINFO:
+ *	This symbol, if defined, indicates that <langinfo.h> exists and
+ *	should be included.
+ */
+/*#define	I_LANGINFO		/ **/
+
+/* USE_FAST_STDIO:
+ *	This symbol, if defined, indicates that Perl should
+ *	be built to use 'fast stdio'.
+ *	Defaults to define in Perls 5.8 and earlier, to undef later.
+ */
+#ifndef USE_FAST_STDIO
+/*#define	USE_FAST_STDIO		/ **/
+#endif
+
+/* PERL_RELOCATABLE_INC:
+ *	This symbol, if defined, indicates that we'd like to relocate entries
+ *	in @INC at run time based on the location of the perl binary.
+ */
+#define PERL_RELOCATABLE_INC "" 		/**/
+
+/* HAS_CTERMID_R:
+ *	This symbol, if defined, indicates that the ctermid_r routine
+ *	is available to ctermid re-entrantly.
+ */
+/* CTERMID_R_PROTO:
+ *	This symbol encodes the prototype of ctermid_r.
+ *	It is zero if d_ctermid_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctermid_r
+ *	is defined.
+ */
+/*#define HAS_CTERMID_R	   / **/
+#define CTERMID_R_PROTO 0	   /**/
+
+/* HAS_ENDHOSTENT_R:
+ *	This symbol, if defined, indicates that the endhostent_r routine
+ *	is available to endhostent re-entrantly.
+ */
+/* ENDHOSTENT_R_PROTO:
+ *	This symbol encodes the prototype of endhostent_r.
+ *	It is zero if d_endhostent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endhostent_r
+ *	is defined.
+ */
+/*#define HAS_ENDHOSTENT_R	   / **/
+#define ENDHOSTENT_R_PROTO 0	   /**/
+
+/* HAS_ENDNETENT_R:
+ *	This symbol, if defined, indicates that the endnetent_r routine
+ *	is available to endnetent re-entrantly.
+ */
+/* ENDNETENT_R_PROTO:
+ *	This symbol encodes the prototype of endnetent_r.
+ *	It is zero if d_endnetent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endnetent_r
+ *	is defined.
+ */
+/*#define HAS_ENDNETENT_R	   / **/
+#define ENDNETENT_R_PROTO 0	   /**/
+
+/* HAS_ENDPROTOENT_R:
+ *	This symbol, if defined, indicates that the endprotoent_r routine
+ *	is available to endprotoent re-entrantly.
+ */
+/* ENDPROTOENT_R_PROTO:
+ *	This symbol encodes the prototype of endprotoent_r.
+ *	It is zero if d_endprotoent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endprotoent_r
+ *	is defined.
+ */
+/*#define HAS_ENDPROTOENT_R	   / **/
+#define ENDPROTOENT_R_PROTO 0	   /**/
+
+/* HAS_ENDSERVENT_R:
+ *	This symbol, if defined, indicates that the endservent_r routine
+ *	is available to endservent re-entrantly.
+ */
+/* ENDSERVENT_R_PROTO:
+ *	This symbol encodes the prototype of endservent_r.
+ *	It is zero if d_endservent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_endservent_r
+ *	is defined.
+ */
+/*#define HAS_ENDSERVENT_R	   / **/
+#define ENDSERVENT_R_PROTO 0	   /**/
+
+/* HAS_GETHOSTBYADDR_R:
+ *	This symbol, if defined, indicates that the gethostbyaddr_r routine
+ *	is available to gethostbyaddr re-entrantly.
+ */
+/* GETHOSTBYADDR_R_PROTO:
+ *	This symbol encodes the prototype of gethostbyaddr_r.
+ *	It is zero if d_gethostbyaddr_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyaddr_r
+ *	is defined.
+ */
+/*#define HAS_GETHOSTBYADDR_R	   / **/
+#define GETHOSTBYADDR_R_PROTO 0	   /**/
+
+/* HAS_GETHOSTBYNAME_R:
+ *	This symbol, if defined, indicates that the gethostbyname_r routine
+ *	is available to gethostbyname re-entrantly.
+ */
+/* GETHOSTBYNAME_R_PROTO:
+ *	This symbol encodes the prototype of gethostbyname_r.
+ *	It is zero if d_gethostbyname_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyname_r
+ *	is defined.
+ */
+/*#define HAS_GETHOSTBYNAME_R	   / **/
+#define GETHOSTBYNAME_R_PROTO 0	   /**/
+
+/* HAS_GETHOSTENT_R:
+ *	This symbol, if defined, indicates that the gethostent_r routine
+ *	is available to gethostent re-entrantly.
+ */
+/* GETHOSTENT_R_PROTO:
+ *	This symbol encodes the prototype of gethostent_r.
+ *	It is zero if d_gethostent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostent_r
+ *	is defined.
+ */
+/*#define HAS_GETHOSTENT_R	   / **/
+#define GETHOSTENT_R_PROTO 0	   /**/
+
+/* HAS_GETNETBYADDR_R:
+ *	This symbol, if defined, indicates that the getnetbyaddr_r routine
+ *	is available to getnetbyaddr re-entrantly.
+ */
+/* GETNETBYADDR_R_PROTO:
+ *	This symbol encodes the prototype of getnetbyaddr_r.
+ *	It is zero if d_getnetbyaddr_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyaddr_r
+ *	is defined.
+ */
+/*#define HAS_GETNETBYADDR_R	   / **/
+#define GETNETBYADDR_R_PROTO 0	   /**/
+
+/* HAS_GETNETBYNAME_R:
+ *	This symbol, if defined, indicates that the getnetbyname_r routine
+ *	is available to getnetbyname re-entrantly.
+ */
+/* GETNETBYNAME_R_PROTO:
+ *	This symbol encodes the prototype of getnetbyname_r.
+ *	It is zero if d_getnetbyname_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyname_r
+ *	is defined.
+ */
+/*#define HAS_GETNETBYNAME_R	   / **/
+#define GETNETBYNAME_R_PROTO 0	   /**/
+
+/* HAS_GETNETENT_R:
+ *	This symbol, if defined, indicates that the getnetent_r routine
+ *	is available to getnetent re-entrantly.
+ */
+/* GETNETENT_R_PROTO:
+ *	This symbol encodes the prototype of getnetent_r.
+ *	It is zero if d_getnetent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetent_r
+ *	is defined.
+ */
+/*#define HAS_GETNETENT_R	   / **/
+#define GETNETENT_R_PROTO 0	   /**/
+
+/* HAS_GETPROTOBYNAME_R:
+ *	This symbol, if defined, indicates that the getprotobyname_r routine
+ *	is available to getprotobyname re-entrantly.
+ */
+/* GETPROTOBYNAME_R_PROTO:
+ *	This symbol encodes the prototype of getprotobyname_r.
+ *	It is zero if d_getprotobyname_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobyname_r
+ *	is defined.
+ */
+/*#define HAS_GETPROTOBYNAME_R	   / **/
+#define GETPROTOBYNAME_R_PROTO 0	   /**/
+
+/* HAS_GETPROTOBYNUMBER_R:
+ *	This symbol, if defined, indicates that the getprotobynumber_r routine
+ *	is available to getprotobynumber re-entrantly.
+ */
+/* GETPROTOBYNUMBER_R_PROTO:
+ *	This symbol encodes the prototype of getprotobynumber_r.
+ *	It is zero if d_getprotobynumber_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobynumber_r
+ *	is defined.
+ */
+/*#define HAS_GETPROTOBYNUMBER_R	   / **/
+#define GETPROTOBYNUMBER_R_PROTO 0	   /**/
+
+/* HAS_GETPROTOENT_R:
+ *	This symbol, if defined, indicates that the getprotoent_r routine
+ *	is available to getprotoent re-entrantly.
+ */
+/* GETPROTOENT_R_PROTO:
+ *	This symbol encodes the prototype of getprotoent_r.
+ *	It is zero if d_getprotoent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotoent_r
+ *	is defined.
+ */
+/*#define HAS_GETPROTOENT_R	   / **/
+#define GETPROTOENT_R_PROTO 0	   /**/
+
+/* HAS_GETSERVBYNAME_R:
+ *	This symbol, if defined, indicates that the getservbyname_r routine
+ *	is available to getservbyname re-entrantly.
+ */
+/* GETSERVBYNAME_R_PROTO:
+ *	This symbol encodes the prototype of getservbyname_r.
+ *	It is zero if d_getservbyname_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyname_r
+ *	is defined.
+ */
+/*#define HAS_GETSERVBYNAME_R	   / **/
+#define GETSERVBYNAME_R_PROTO 0	   /**/
+
+/* HAS_GETSERVBYPORT_R:
+ *	This symbol, if defined, indicates that the getservbyport_r routine
+ *	is available to getservbyport re-entrantly.
+ */
+/* GETSERVBYPORT_R_PROTO:
+ *	This symbol encodes the prototype of getservbyport_r.
+ *	It is zero if d_getservbyport_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyport_r
+ *	is defined.
+ */
+/*#define HAS_GETSERVBYPORT_R	   / **/
+#define GETSERVBYPORT_R_PROTO 0	   /**/
+
+/* HAS_GETSERVENT_R:
+ *	This symbol, if defined, indicates that the getservent_r routine
+ *	is available to getservent re-entrantly.
+ */
+/* GETSERVENT_R_PROTO:
+ *	This symbol encodes the prototype of getservent_r.
+ *	It is zero if d_getservent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservent_r
+ *	is defined.
+ */
+/*#define HAS_GETSERVENT_R	   / **/
+#define GETSERVENT_R_PROTO 0	   /**/
+
+/* HAS_PTHREAD_ATFORK:
+ *	This symbol, if defined, indicates that the pthread_atfork routine
+ *	is available to setup fork handlers.
+ */
+/*#define HAS_PTHREAD_ATFORK		/ **/
+
+/* HAS_READDIR64_R:
+ *	This symbol, if defined, indicates that the readdir64_r routine
+ *	is available to readdir64 re-entrantly.
+ */
+/* READDIR64_R_PROTO:
+ *	This symbol encodes the prototype of readdir64_r.
+ *	It is zero if d_readdir64_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir64_r
+ *	is defined.
+ */
+/*#define HAS_READDIR64_R	   / **/
+#define READDIR64_R_PROTO 0	   /**/
+
+/* HAS_SETHOSTENT_R:
+ *	This symbol, if defined, indicates that the sethostent_r routine
+ *	is available to sethostent re-entrantly.
+ */
+/* SETHOSTENT_R_PROTO:
+ *	This symbol encodes the prototype of sethostent_r.
+ *	It is zero if d_sethostent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_sethostent_r
+ *	is defined.
+ */
+/*#define HAS_SETHOSTENT_R	   / **/
+#define SETHOSTENT_R_PROTO 0	   /**/
+
+/* HAS_SETLOCALE_R:
+ *	This symbol, if defined, indicates that the setlocale_r routine
+ *	is available to setlocale re-entrantly.
+ */
+/* SETLOCALE_R_PROTO:
+ *	This symbol encodes the prototype of setlocale_r.
+ *	It is zero if d_setlocale_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setlocale_r
+ *	is defined.
+ */
+/*#define HAS_SETLOCALE_R	   / **/
+#define SETLOCALE_R_PROTO 0	   /**/
+
+/* HAS_SETNETENT_R:
+ *	This symbol, if defined, indicates that the setnetent_r routine
+ *	is available to setnetent re-entrantly.
+ */
+/* SETNETENT_R_PROTO:
+ *	This symbol encodes the prototype of setnetent_r.
+ *	It is zero if d_setnetent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setnetent_r
+ *	is defined.
+ */
+/*#define HAS_SETNETENT_R	   / **/
+#define SETNETENT_R_PROTO 0	   /**/
+
+/* HAS_SETPROTOENT_R:
+ *	This symbol, if defined, indicates that the setprotoent_r routine
+ *	is available to setprotoent re-entrantly.
+ */
+/* SETPROTOENT_R_PROTO:
+ *	This symbol encodes the prototype of setprotoent_r.
+ *	It is zero if d_setprotoent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setprotoent_r
+ *	is defined.
+ */
+/*#define HAS_SETPROTOENT_R	   / **/
+#define SETPROTOENT_R_PROTO 0	   /**/
+
+/* HAS_SETSERVENT_R:
+ *	This symbol, if defined, indicates that the setservent_r routine
+ *	is available to setservent re-entrantly.
+ */
+/* SETSERVENT_R_PROTO:
+ *	This symbol encodes the prototype of setservent_r.
+ *	It is zero if d_setservent_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_setservent_r
+ *	is defined.
+ */
+/*#define HAS_SETSERVENT_R	   / **/
+#define SETSERVENT_R_PROTO 0	   /**/
+
+/* HAS_TTYNAME_R:
+ *	This symbol, if defined, indicates that the ttyname_r routine
+ *	is available to ttyname re-entrantly.
+ */
+/* TTYNAME_R_PROTO:
+ *	This symbol encodes the prototype of ttyname_r.
+ *	It is zero if d_ttyname_r is undef, and one of the
+ *	REENTRANT_PROTO_T_ABC macros of reentr.h if d_ttyname_r
+ *	is defined.
+ */
+/*#define HAS_TTYNAME_R	   / **/
+#define TTYNAME_R_PROTO 0	   /**/
+
+#endif
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/unixish.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/unixish.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/unixish.h	(revision 14489)
@@ -0,0 +1,142 @@
+/*    unixish.h
+ *
+ *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
+ *    by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * The following symbols are defined if your operating system supports
+ * functions by that name.  All Unixes I know of support them, thus they
+ * are not checked by the configuration script, but are directly defined
+ * here.
+ */
+
+#ifndef PERL_MICRO
+
+/* HAS_IOCTL:
+ *	This symbol, if defined, indicates that the ioctl() routine is
+ *	available to set I/O characteristics
+ */
+#define	HAS_IOCTL		/**/
+ 
+/* HAS_UTIME:
+ *	This symbol, if defined, indicates that the routine utime() is
+ *	available to update the access and modification times of files.
+ */
+#define HAS_UTIME		/**/
+
+/* HAS_GROUP
+ *	This symbol, if defined, indicates that the getgrnam() and
+ *	getgrgid() routines are available to get group entries.
+ *	The getgrent() has a separate definition, HAS_GETGRENT.
+ */
+#define HAS_GROUP		/**/
+
+/* HAS_PASSWD
+ *	This symbol, if defined, indicates that the getpwnam() and
+ *	getpwuid() routines are available to get password entries.
+ *	The getpwent() has a separate definition, HAS_GETPWENT.
+ */
+#define HAS_PASSWD		/**/
+
+#define HAS_KILL
+#define HAS_WAIT
+
+#endif /* !PERL_MICRO */
+  
+/* USEMYBINMODE
+ *	This symbol, if defined, indicates that the program should
+ *	use the routine my_binmode(FILE *fp, char iotype) to insure
+ *	that a file is in "binary" mode -- that is, that no translation
+ *	of bytes occurs on read or write operations.
+ */
+#undef USEMYBINMODE
+
+/* Stat_t:
+ *	This symbol holds the type used to declare buffers for information
+ *	returned by stat().  It's usually just struct stat.  It may be necessary
+ *	to include <sys/stat.h> and <sys/types.h> to get any typedef'ed
+ *	information.
+ */
+#define Stat_t struct stat
+
+/* USE_STAT_RDEV:
+ *	This symbol is defined if this system has a stat structure declaring
+ *	st_rdev
+ */
+#define USE_STAT_RDEV 	/**/
+
+/* ACME_MESS:
+ *	This symbol, if defined, indicates that error messages should be 
+ *	should be generated in a format that allows the use of the Acme
+ *	GUI/editor's autofind feature.
+ */
+#undef ACME_MESS	/**/
+
+/* UNLINK_ALL_VERSIONS:
+ *	This symbol, if defined, indicates that the program should arrange
+ *	to remove all versions of a file if unlink() is called.  This is
+ *	probably only relevant for VMS.
+ */
+/* #define UNLINK_ALL_VERSIONS		/ **/
+
+/* VMS:
+ *	This symbol, if defined, indicates that the program is running under
+ *	VMS.  It is currently automatically set by cpps running under VMS,
+ *	and is included here for completeness only.
+ */
+/* #define VMS		/ **/
+
+/* ALTERNATE_SHEBANG:
+ *	This symbol, if defined, contains a "magic" string which may be used
+ *	as the first line of a Perl program designed to be executed directly
+ *	by name, instead of the standard Unix #!.  If ALTERNATE_SHEBANG
+ *	begins with a character other then #, then Perl will only treat
+ *	it as a command line if it finds the string "perl" in the first
+ *	word; otherwise it's treated as the first line of code in the script.
+ *	(IOW, Perl won't hand off to another interpreter via an alternate
+ *	shebang sequence that might be legal Perl code.)
+ */
+/* #define ALTERNATE_SHEBANG "#!" / **/
+
+# include <signal.h>
+
+#ifndef SIGABRT
+#    define SIGABRT SIGILL
+#endif
+#ifndef SIGILL
+#    define SIGILL 6         /* blech */
+#endif
+#define ABORT() kill(PerlProc_getpid(),SIGABRT);
+
+/*
+ * fwrite1() should be a routine with the same calling sequence as fwrite(),
+ * but which outputs all of the bytes requested as a single stream (unlike
+ * fwrite() itself, which on some systems outputs several distinct records
+ * if the number_of_items parameter is >1).
+ */
+#define fwrite1 fwrite
+
+#define Stat(fname,bufptr) stat((fname),(bufptr))
+#define Fstat(fd,bufptr)   fstat((fd),(bufptr))
+#define Fflush(fp)         fflush(fp)
+#define Mkdir(path,mode)   mkdir((path),(mode))
+
+#ifndef PERL_SYS_INIT
+#  define PERL_SYS_INIT(c,v) MALLOC_CHECK_TAINT2(*c,*v) PERL_FPU_INIT MALLOC_INIT
+#endif
+
+#ifndef PERL_SYS_TERM
+#define PERL_SYS_TERM()		OP_REFCNT_TERM; MALLOC_TERM
+#endif
+
+#define BIT_BUCKET "/dev/null"
+
+#define dXSUB_SYS
+
+#define USE_ENVIRON_ARRAY
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/utf8.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/utf8.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/utf8.h	(revision 14489)
@@ -0,0 +1,335 @@
+/*    utf8.h
+ *
+ *    Copyright (C) 2000, 2001, 2002, 2005 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/* Use UTF-8 as the default script encoding?
+ * Turning this on will break scripts having non-UTF-8 binary
+ * data (such as Latin-1) in string literals. */
+#ifdef USE_UTF8_SCRIPTS
+#    define USE_UTF8_IN_NAMES (!IN_BYTES)
+#else
+#    define USE_UTF8_IN_NAMES (PL_hints & HINT_UTF8)
+#endif
+
+#ifdef EBCDIC
+/* The equivalent of these macros but implementing UTF-EBCDIC
+   are in the following header file:
+ */
+
+#include "utfebcdic.h"
+#else
+START_EXTERN_C
+
+#ifdef DOINIT
+EXTCONST unsigned char PL_utf8skip[] = {
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bogus */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bogus */
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, /* scripts */
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,	 /* cjk etc. */
+7,13, /* Perl extended (not UTF-8).  Up to 72bit allowed (64-bit + reserved). */
+};
+#else
+EXTCONST unsigned char PL_utf8skip[];
+#endif
+
+END_EXTERN_C
+#define UTF8SKIP(s) PL_utf8skip[*(const U8*)s]
+
+/* Native character to iso-8859-1 */
+#define NATIVE_TO_ASCII(ch)      (ch)
+#define ASCII_TO_NATIVE(ch)      (ch)
+/* Transform after encoding */
+#define NATIVE_TO_UTF(ch)        (ch)
+#define UTF_TO_NATIVE(ch)        (ch)
+/* Transforms in wide UV chars */
+#define UNI_TO_NATIVE(ch)        (ch)
+#define NATIVE_TO_UNI(ch)        (ch)
+/* Transforms in invariant space */
+#define NATIVE_TO_NEED(enc,ch)   (ch)
+#define ASCII_TO_NEED(enc,ch)    (ch)
+
+/* As there are no translations avoid the function wrapper */
+#define Perl_utf8n_to_uvchr Perl_utf8n_to_uvuni
+#define Perl_uvchr_to_utf8  Perl_uvuni_to_utf8
+
+/*
+
+ The following table is from Unicode 3.2.
+
+ Code Points		1st Byte  2nd Byte  3rd Byte  4th Byte
+
+   U+0000..U+007F	00..7F
+   U+0080..U+07FF	C2..DF    80..BF
+   U+0800..U+0FFF	E0        A0..BF    80..BF
+   U+1000..U+CFFF       E1..EC    80..BF    80..BF
+   U+D000..U+D7FF       ED        80..9F    80..BF
+   U+D800..U+DFFF       ******* ill-formed *******
+   U+E000..U+FFFF       EE..EF    80..BF    80..BF
+  U+10000..U+3FFFF	F0        90..BF    80..BF    80..BF
+  U+40000..U+FFFFF	F1..F3    80..BF    80..BF    80..BF
+ U+100000..U+10FFFF	F4        80..8F    80..BF    80..BF
+
+Note the A0..BF in U+0800..U+0FFF, the 80..9F in U+D000...U+D7FF,
+the 90..BF in U+10000..U+3FFFF, and the 80...8F in U+100000..U+10FFFF.
+The "gaps" are caused by legal UTF-8 avoiding non-shortest encodings:
+it is technically possible to UTF-8-encode a single code point in different
+ways, but that is explicitly forbidden, and the shortest possible encoding
+should always be used (and that is what Perl does).
+
+ */
+
+/*
+ Another way to look at it, as bits:
+
+ Code Points                    1st Byte   2nd Byte  3rd Byte  4th Byte
+
+                    0aaaaaaa     0aaaaaaa
+            00000bbbbbaaaaaa     110bbbbb  10aaaaaa
+            ccccbbbbbbaaaaaa     1110cccc  10bbbbbb  10aaaaaa
+  00000dddccccccbbbbbbaaaaaa     11110ddd  10cccccc  10bbbbbb  10aaaaaa
+
+As you can see, the continuation bytes all begin with C<10>, and the
+leading bits of the start byte tell how many bytes the are in the
+encoded character.
+
+*/
+
+
+#define UNI_IS_INVARIANT(c)		(((UV)c) <  0x80)
+#define UTF8_IS_INVARIANT(c)		UNI_IS_INVARIANT(NATIVE_TO_UTF(c))
+#define NATIVE_IS_INVARIANT(c)		UNI_IS_INVARIANT(NATIVE_TO_ASCII(c))
+#define UTF8_IS_START(c)		(((U8)c) >= 0xc0 && (((U8)c) <= 0xfd))
+#define UTF8_IS_CONTINUATION(c)		(((U8)c) >= 0x80 && (((U8)c) <= 0xbf))
+#define UTF8_IS_CONTINUED(c) 		(((U8)c) &  0x80)
+#define UTF8_IS_DOWNGRADEABLE_START(c)	(((U8)c & 0xfc) == 0xc0)
+
+#define UTF_START_MARK(len) ((len >  7) ? 0xFF : (0xFE << (7-len)))
+#define UTF_START_MASK(len) ((len >= 7) ? 0x00 : (0x1F >> (len-2)))
+
+#define UTF_CONTINUATION_MARK		0x80
+#define UTF_ACCUMULATION_SHIFT		6
+#define UTF_CONTINUATION_MASK		((U8)0x3f)
+#define UTF8_ACCUMULATE(old, new)	(((old) << UTF_ACCUMULATION_SHIFT) | (((U8)new) & UTF_CONTINUATION_MASK))
+
+#define UTF8_EIGHT_BIT_HI(c)	((((U8)(c))>>UTF_ACCUMULATION_SHIFT)|UTF_START_MARK(2))
+#define UTF8_EIGHT_BIT_LO(c)	(((((U8)(c)))&UTF_CONTINUATION_MASK)|UTF_CONTINUATION_MARK)
+
+#ifdef HAS_QUAD
+#define UNISKIP(uv) ( (uv) < 0x80           ? 1 : \
+		      (uv) < 0x800          ? 2 : \
+		      (uv) < 0x10000        ? 3 : \
+		      (uv) < 0x200000       ? 4 : \
+		      (uv) < 0x4000000      ? 5 : \
+		      (uv) < 0x80000000     ? 6 : \
+                      (uv) < UTF8_QUAD_MAX ? 7 : 13 )
+#else
+/* No, I'm not even going to *TRY* putting #ifdef inside a #define */
+#define UNISKIP(uv) ( (uv) < 0x80           ? 1 : \
+		      (uv) < 0x800          ? 2 : \
+		      (uv) < 0x10000        ? 3 : \
+		      (uv) < 0x200000       ? 4 : \
+		      (uv) < 0x4000000      ? 5 : \
+		      (uv) < 0x80000000     ? 6 : 7 )
+#endif
+
+/*
+ * Note: we try to be careful never to call the isXXX_utf8() functions
+ * unless we're pretty sure we've seen the beginning of a UTF-8 character
+ * (that is, the two high bits are set).  Otherwise we risk loading in the
+ * heavy-duty SWASHINIT and SWASHGET routines unnecessarily.
+ */
+#define isIDFIRST_lazy_if(p,c) ((IN_BYTES || (!c || (*((const U8*)p) < 0xc0))) \
+				? isIDFIRST(*(p)) \
+				: isIDFIRST_utf8((U8*)p))
+#define isALNUM_lazy_if(p,c)   ((IN_BYTES || (!c || (*((const U8*)p) < 0xc0))) \
+				? isALNUM(*(p)) \
+				: isALNUM_utf8((U8*)p))
+
+
+#endif /* EBCDIC vs ASCII */
+
+/* Rest of these are attributes of Unicode and perl's internals rather than the encoding */
+
+#define isIDFIRST_lazy(p)	isIDFIRST_lazy_if(p,1)
+#define isALNUM_lazy(p)		isALNUM_lazy_if(p,1)
+
+#define UTF8_MAXBYTES 13
+/* How wide can a single UTF-8 encoded character become in bytes.
+ * NOTE: Strictly speaking Perl's UTF-8 should not be called UTF-8
+ * since UTF-8 is an encoding of Unicode and given Unicode's current
+ * upper limit only four bytes is possible.  Perl thinks of UTF-8
+ * as a way to encode non-negative integers in a binary format. */
+#define UTF8_MAXLEN UTF8_MAXBYTES
+
+#define UTF8_MAXLEN_UCLC 3		/* Obsolete, do not use. */
+#define UTF8_MAXLEN_UCLC_MULT 39	/* Obsolete, do not use. */
+#define UTF8_MAXLEN_FOLD 3		/* Obsolete, do not use. */
+#define UTF8_MAXLEN_FOLD_MULT 39	/* Obsolete, do not use. */
+
+/* The maximum number of UTF-8 bytes a single Unicode character can
+ * uppercase/lowercase/fold into; this number depends on the Unicode
+ * version.  An example of maximal expansion is the U+03B0 which
+ * uppercases to U+03C5 U+0308 U+0301.  The Unicode databases that
+ * tell these things are UnicodeDatabase.txt, CaseFolding.txt, and
+ * SpecialCasing.txt. */
+#define UTF8_MAXBYTES_CASE	6
+
+#define IN_BYTES (PL_curcop->op_private & HINT_BYTES)
+#define DO_UTF8(sv) (SvUTF8(sv) && !IN_BYTES)
+
+#define UTF8_ALLOW_EMPTY		0x0001
+#define UTF8_ALLOW_CONTINUATION		0x0002
+#define UTF8_ALLOW_NON_CONTINUATION	0x0004
+#define UTF8_ALLOW_FE_FF		0x0008
+#define UTF8_ALLOW_SHORT		0x0010
+#define UTF8_ALLOW_SURROGATE		0x0020
+#define UTF8_ALLOW_FFFF			0x0040 /* Allows also FFFE. */
+#define UTF8_ALLOW_LONG			0x0080
+#define UTF8_ALLOW_ANYUV		(UTF8_ALLOW_EMPTY|UTF8_ALLOW_FE_FF|\
+					 UTF8_ALLOW_SURROGATE|UTF8_ALLOW_FFFF)
+#define UTF8_ALLOW_ANY			0x00FF
+#define UTF8_CHECK_ONLY			0x0200
+
+#define UNICODE_SURROGATE_FIRST		0xD800
+#define UNICODE_SURROGATE_LAST		0xDFFF
+#define UNICODE_REPLACEMENT		0xFFFD
+#define UNICODE_BYTE_ORDER_MARK		0xFEFF
+#define UNICODE_ILLEGAL			0xFFFF
+
+/* Though our UTF-8 encoding can go beyond this,
+ * let's be conservative and do as Unicode 3.2 says. */
+#define PERL_UNICODE_MAX	0x10FFFF
+
+#define UNICODE_ALLOW_SURROGATE 0x0001	/* Allow UTF-16 surrogates (EVIL) */
+#define UNICODE_ALLOW_FDD0	0x0002	/* Allow the U+FDD0...U+FDEF */
+#define UNICODE_ALLOW_FFFF	0x0004	/* Allow 0xFFF[EF], 0x1FFF[EF], ... */
+#define UNICODE_ALLOW_SUPER	0x0008	/* Allow past 10xFFFF */
+#define UNICODE_ALLOW_ANY	0x000F
+
+#define UNICODE_IS_SURROGATE(c)		((c) >= UNICODE_SURROGATE_FIRST && \
+					 (c) <= UNICODE_SURROGATE_LAST)
+#define UNICODE_IS_REPLACEMENT(c)	((c) == UNICODE_REPLACEMENT)
+#define UNICODE_IS_BYTE_ORDER_MARK(c)	((c) == UNICODE_BYTE_ORDER_MARK)
+#define UNICODE_IS_ILLEGAL(c)		((c) == UNICODE_ILLEGAL)
+
+#ifdef HAS_QUAD
+#    define UTF8_QUAD_MAX	UINT64_C(0x1000000000)
+#endif
+
+#define UTF8_IS_ASCII(c) UTF8_IS_INVARIANT(c)
+
+#define UNICODE_LATIN_SMALL_LETTER_SHARP_S	0x00DF
+#define UNICODE_GREEK_CAPITAL_LETTER_SIGMA	0x03A3
+#define UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA	0x03C2
+#define UNICODE_GREEK_SMALL_LETTER_SIGMA	0x03C3
+
+#define EBCDIC_LATIN_SMALL_LETTER_SHARP_S	0x0059
+
+#define UNI_DISPLAY_ISPRINT	0x0001
+#define UNI_DISPLAY_BACKSLASH	0x0002
+#define UNI_DISPLAY_QQ		(UNI_DISPLAY_ISPRINT|UNI_DISPLAY_BACKSLASH)
+#define UNI_DISPLAY_REGEX	(UNI_DISPLAY_ISPRINT|UNI_DISPLAY_BACKSLASH)
+
+#ifdef EBCDIC
+#   define ANYOF_FOLD_SHARP_S(node, input, end)	\
+	(ANYOF_BITMAP_TEST(node, EBCDIC_LATIN_SMALL_LETTER_SHARP_S) && \
+	 (ANYOF_FLAGS(node) & ANYOF_UNICODE) && \
+	 (ANYOF_FLAGS(node) & ANYOF_FOLD) && \
+	 ((end) > (input) + 1) && \
+	 toLOWER((input)[0]) == 's' && \
+	 toLOWER((input)[1]) == 's')
+#else
+#   define ANYOF_FOLD_SHARP_S(node, input, end)	\
+	(ANYOF_BITMAP_TEST(node, UNICODE_LATIN_SMALL_LETTER_SHARP_S) && \
+	 (ANYOF_FLAGS(node) & ANYOF_UNICODE) && \
+	 (ANYOF_FLAGS(node) & ANYOF_FOLD) && \
+	 ((end) > (input) + 1) && \
+	 toLOWER((input)[0]) == 's' && \
+	 toLOWER((input)[1]) == 's')
+#endif
+#define SHARP_S_SKIP 2
+
+#ifdef EBCDIC
+/* IS_UTF8_CHAR() is not ported to EBCDIC */
+#else
+#define IS_UTF8_CHAR_1(p)	\
+	((p)[0] <= 0x7F)
+#define IS_UTF8_CHAR_2(p)	\
+	((p)[0] >= 0xC2 && (p)[0] <= 0xDF && \
+	 (p)[1] >= 0x80 && (p)[1] <= 0xBF)
+#define IS_UTF8_CHAR_3a(p)	\
+	((p)[0] == 0xE0 && \
+	 (p)[1] >= 0xA0 && (p)[1] <= 0xBF && \
+	 (p)[2] >= 0x80 && (p)[2] <= 0xBF)
+#define IS_UTF8_CHAR_3b(p)	\
+	((p)[0] >= 0xE1 && (p)[0] <= 0xEC && \
+	 (p)[1] >= 0x80 && (p)[1] <= 0xBF && \
+	 (p)[2] >= 0x80 && (p)[2] <= 0xBF)
+#define IS_UTF8_CHAR_3c(p)	\
+	((p)[0] == 0xED && \
+	 (p)[1] >= 0x80 && (p)[1] <= 0xBF && \
+	 (p)[2] >= 0x80 && (p)[2] <= 0xBF)
+/* In IS_UTF8_CHAR_3c(p) one could use
+ * (p)[1] >= 0x80 && (p)[1] <= 0x9F
+ * if one wanted to exclude surrogates. */
+#define IS_UTF8_CHAR_3d(p)	\
+	((p)[0] >= 0xEE && (p)[0] <= 0xEF && \
+	 (p)[1] >= 0x80 && (p)[1] <= 0xBF && \
+	 (p)[2] >= 0x80 && (p)[2] <= 0xBF)
+#define IS_UTF8_CHAR_4a(p)	\
+	((p)[0] == 0xF0 && \
+	 (p)[1] >= 0x90 && (p)[1] <= 0xBF && \
+	 (p)[2] >= 0x80 && (p)[2] <= 0xBF && \
+	 (p)[3] >= 0x80 && (p)[3] <= 0xBF)
+#define IS_UTF8_CHAR_4b(p)	\
+	((p)[0] >= 0xF1 && (p)[0] <= 0xF3 && \
+	 (p)[1] >= 0x80 && (p)[1] <= 0xBF && \
+	 (p)[2] >= 0x80 && (p)[2] <= 0xBF && \
+	 (p)[3] >= 0x80 && (p)[3] <= 0xBF)
+/* In IS_UTF8_CHAR_4c(p) one could use
+ * (p)[0] == 0xF4
+ * if one wanted to stop at the Unicode limit U+10FFFF.
+ * The 0xF7 allows us to go to 0x1fffff (0x200000 would
+ * require five bytes).  Not doing any further code points
+ * since that is not needed (and that would not be strict
+ * UTF-8, anyway).  The "slow path" in Perl_is_utf8_char()
+ * will take care of the "extended UTF-8". */
+#define IS_UTF8_CHAR_4c(p)	\
+	((p)[0] == 0xF4 && (p)[0] <= 0xF7 && \
+	 (p)[1] >= 0x80 && (p)[1] <= 0xBF && \
+	 (p)[2] >= 0x80 && (p)[2] <= 0xBF && \
+	 (p)[3] >= 0x80 && (p)[3] <= 0xBF)
+
+#define IS_UTF8_CHAR_3(p)	\
+	(IS_UTF8_CHAR_3a(p) || \
+	 IS_UTF8_CHAR_3b(p) || \
+	 IS_UTF8_CHAR_3c(p) || \
+	 IS_UTF8_CHAR_3d(p))
+#define IS_UTF8_CHAR_4(p)	\
+	(IS_UTF8_CHAR_4a(p) || \
+	 IS_UTF8_CHAR_4b(p) || \
+	 IS_UTF8_CHAR_4c(p))
+
+/* IS_UTF8_CHAR(p) is strictly speaking wrong (not UTF-8) because it
+ * (1) allows UTF-8 encoded UTF-16 surrogates
+ * (2) it allows code points past U+10FFFF.
+ * The Perl_is_utf8_char() full "slow" code will handle the Perl
+ * "extended UTF-8". */
+#define IS_UTF8_CHAR(p, n)	\
+	((n) == 1 ? IS_UTF8_CHAR_1(p) : \
+ 	 (n) == 2 ? IS_UTF8_CHAR_2(p) : \
+	 (n) == 3 ? IS_UTF8_CHAR_3(p) : \
+	 (n) == 4 ? IS_UTF8_CHAR_4(p) : 0)
+
+#define IS_UTF8_CHAR_FAST(n) ((n) <= 4)
+
+#endif /* IS_UTF8_CHAR() for UTF-8 */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/utfebcdic.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/utfebcdic.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/utfebcdic.h	(revision 14489)
@@ -0,0 +1,420 @@
+/*    utfebcdic.h
+ *
+ *    Copyright (C) 2001, 2002, by Larry Wall, Nick Ing-Simmons, and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * Macros to implement UTF-EBCDIC as perl's internal encoding
+ * Taken from version 7.1 of Unicode Techical Report #16:
+ *  http://www.unicode.org/unicode/reports/tr16
+ */
+
+START_EXTERN_C
+
+#ifdef DOINIT
+/* Indexed by encoded byte this table gives the length of the sequence.
+   Adapted from the shadow flags table in tr16.
+   The entries marked 9 in tr6 are continuation bytes and are marked
+   as length 1 here so that we can recover.
+*/
+#if '^' == 95   /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */
+EXTCONST unsigned char PL_utf8skip[] = {
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,
+2,2,2,2,2,2,2,3,3,3,3,3,3,1,3,3,
+1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,
+1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,
+1,4,1,1,1,1,1,1,1,1,4,4,4,5,5,5,
+1,1,1,1,1,1,1,1,1,1,5,6,6,7,7,1
+};
+#endif
+
+#if '^' == 106  /* if defined(_OSD_POSIX) POSIX-BC */
+unsigned char PL_utf8skip[] = {
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,3,1,1,1,1,1,1,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,3,1,1,1,1,1,1,1,1,2,2,2,3,2,2,
+1,2,2,2,2,2,2,3,3,3,2,1,1,1,3,3,
+4,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,
+1,1,1,1,1,1,1,1,1,1,3,3,4,6,4,4,
+7,4,1,1,1,1,1,1,1,1,4,4,4,5,5,5,
+1,1,1,1,1,1,1,1,1,1,5,1,6,1,7,1
+};
+#endif
+
+#if '^' == 176  /* if defined(??) (OS/400?) 037 */
+unsigned char PL_utf8skip[] = {
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,1,1,1,1,1,1,1,1,1,2,2,2,3,2,2,
+1,2,2,2,2,2,2,3,3,3,1,1,3,3,3,3,
+1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,
+1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,
+1,4,1,1,1,1,1,1,1,1,4,4,4,5,5,5,
+1,1,1,1,1,1,1,1,1,1,5,6,6,7,7,1
+};
+#endif
+
+/* Transform tables from tr16 applied after encoding to render encoding EBCDIC like */
+
+#if '^' == 95   /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */
+EXTCONST unsigned char PL_utf2e[] = { /* UTF-8-mod to EBCDIC (IBM-1047) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
+ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF,
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
+ 0x57, 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x70, 0x71, 0x72, 0x73,
+ 0x74, 0x75, 0x76, 0x77, 0x78, 0x80, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x9A, 0x9B, 0x9C,
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xAA, 0xAB, 0xAC, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
+ 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBE, 0xBF, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xDA, 0xDB,
+ 0xDC, 0xDD, 0xDE, 0xDF, 0xE1, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE,
+};
+
+EXTCONST unsigned char PL_e2utf[] = { /* EBCDIC (IBM-1047) to UTF-8-mod */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
+ 0x2D, 0x2F, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xC5, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB,
+ 0xCC, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2,
+ 0xD3, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xD4, 0xD5, 0xD6, 0x5B, 0xD7, 0xD8,
+ 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0x5D, 0xE6, 0xE7,
+ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED,
+ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3,
+ 0x5C, 0xF4, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x9F,
+};
+#endif /* 1047 */
+
+#if '^' == 106  /* if defined(_OSD_POSIX) POSIX-BC */
+unsigned char PL_utf2e[] = { /* UTF-8-mod to EBCDIC (POSIX-BC) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xBB, 0xBC, 0xBD, 0x6A, 0x6D,
+ 0x4A, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xFB, 0x4F, 0xFD, 0xFF, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0x5F,
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xB0, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
+ 0x57, 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xD0, 0x70, 0x71, 0x72, 0x73,
+ 0x74, 0x75, 0x76, 0x77, 0x78, 0x80, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x9A, 0x9B, 0x9C,
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xAA, 0xAB, 0xAC, 0xAE, 0xAF, 0xBA, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
+ 0xB7, 0xB8, 0xB9, 0xAD, 0x79, 0xA1, 0xBE, 0xBF, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xDA, 0xDB,
+ 0xDC, 0xC0, 0xDE, 0xDF, 0xE1, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xFA, 0xDD, 0xFC, 0xE0, 0xFE,
+};
+
+unsigned char PL_e2utf[] = { /* EBCDIC (POSIX-BC) to UTF-8-mod */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0x60, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x9F,
+ 0x2D, 0x2F, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0x5E, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xE4, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xC5, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB,
+ 0xCC, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2,
+ 0xD3, 0xE5, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xD4, 0xD5, 0xD6, 0xE3, 0xD7, 0xD8,
+ 0xA9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xD9, 0x5B, 0x5C, 0x5D, 0xE6, 0xE7,
+ 0xF1, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED,
+ 0xBB, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xEE, 0xEF, 0xF0, 0xFC, 0xF2, 0xF3,
+ 0xFE, 0xF4, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xFB, 0x7B, 0xFD, 0x7D, 0xFF, 0x7E,
+};
+#endif /* POSIX-BC */
+
+#if '^' == 176  /* if defined(??) (OS/400?) 037 */
+unsigned char PL_utf2e[] = { /* UTF-8-mod to EBCDIC (IBM-037) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D,
+ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF,
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
+ 0x57, 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x70, 0x71, 0x72, 0x73,
+ 0x74, 0x75, 0x76, 0x77, 0x78, 0x80, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x9A, 0x9B, 0x9C,
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xAA, 0xAB, 0xAC, 0xAE, 0xAF, 0x5F, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
+ 0xB7, 0xB8, 0xB9, 0xAD, 0xBD, 0xBC, 0xBE, 0xBF, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xDA, 0xDB,
+ 0xDC, 0xDD, 0xDE, 0xDF, 0xE1, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE,
+};
+
+unsigned char PL_e2utf[] = { /* EBCDIC (IBM-037) to UTF-8-mod */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xD9,
+ 0x2D, 0x2F, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xC5, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB,
+ 0xCC, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2,
+ 0xD3, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xD4, 0xD5, 0xD6, 0xE3, 0xD7, 0xD8,
+ 0x5E, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0x5B, 0x5D, 0xE5, 0xE4, 0xE6, 0xE7,
+ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED,
+ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3,
+ 0x5C, 0xF4, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x9F,
+};
+#endif          /* 037 */
+
+/* These tables moved from perl.h and converted to hex.
+   They map platfrom code page from/to bottom 256 codes of Unicode (i.e. iso-8859-1).
+*/
+
+#if '^' == 95   /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */
+EXTCONST unsigned char PL_a2e[] = { /* ASCII (iso-8859-1) to EBCDIC (IBM-1047) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
+ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF,
+ 0x41, 0xAA, 0x4A, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5, 0xBB, 0xB4, 0x9A, 0x8A, 0xB0, 0xCA, 0xAF, 0xBC,
+ 0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, 0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB,
+ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68, 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77,
+ 0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, 0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xBA, 0xAE, 0x59,
+ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48, 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57,
+ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, 0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF
+};
+
+EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (IBM-1047) to ASCII (iso-8859-1) */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, 0xE7, 0xF1, 0xA2, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, 0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
+ 0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, 0xC7, 0xD1, 0xA6, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, 0xCC, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1,
+ 0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4,
+ 0xB5, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0x5B, 0xDE, 0xAE,
+ 0xAC, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, 0xBD, 0xBE, 0xDD, 0xA8, 0xAF, 0x5D, 0xB4, 0xD7,
+ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5,
+ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xF9, 0xFA, 0xFF,
+ 0x5C, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F
+};
+#endif /* 1047 */
+
+#if '^' == 106  /* if defined(_OSD_POSIX) POSIX-BC */
+EXTCONST unsigned char PL_a2e[] = { /* ASCII (ISO8859-1) to EBCDIC (POSIX-BC) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xBB, 0xBC, 0xBD, 0x6A, 0x6D,
+ 0x4A, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xFB, 0x4F, 0xFD, 0xFF, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0x5F,
+ 0x41, 0xAA, 0xB0, 0xB1, 0x9F, 0xB2, 0xD0, 0xB5, 0x79, 0xB4, 0x9A, 0x8A, 0xBA, 0xCA, 0xAF, 0xA1,
+ 0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, 0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB,
+ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68, 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77,
+ 0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, 0x80, 0xE0, 0xFE, 0xDD, 0xFC, 0xAD, 0xAE, 0x59,
+ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48, 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57,
+ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, 0x70, 0xC0, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF
+};
+
+EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (POSIX-BC) to ASCII (ISO8859-1) */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, 0xE7, 0xF1, 0x60, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, 0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x9F,
+ 0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, 0xC7, 0xD1, 0x5E, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, 0xCC, 0xA8, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1,
+ 0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4,
+ 0xB5, 0xAF, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0xDD, 0xDE, 0xAE,
+ 0xA2, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, 0xBD, 0xBE, 0xAC, 0x5B, 0x5C, 0x5D, 0xB4, 0xD7,
+ 0xF9, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5,
+ 0xA6, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xDB, 0xFA, 0xFF,
+ 0xD9, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xB3, 0x7B, 0xDC, 0x7D, 0xDA, 0x7E
+};
+#endif          /* POSIX-BC */
+
+#if '^' == 176  /* if defined(??) (OS/400?) 037 */
+EXTCONST unsigned char PL_a2e[] = { /* ASCII (ISO8859-1) to EBCDIC (IBM-037) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D,
+ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF,
+ 0x41, 0xAA, 0x4A, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5, 0xBD, 0xB4, 0x9A, 0x8A, 0x5F, 0xCA, 0xAF, 0xBC,
+ 0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, 0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB,
+ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68, 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77,
+ 0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, 0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xAD, 0xAE, 0x59,
+ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48, 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57,
+ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, 0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF
+};
+
+EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (IBM-037) to ASCII (ISO8859-1) */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, 0xE7, 0xF1, 0xA2, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, 0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAC,
+ 0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, 0xC7, 0xD1, 0xA6, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, 0xCC, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1,
+ 0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4,
+ 0xB5, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0xDD, 0xDE, 0xAE,
+ 0x5E, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, 0xBD, 0xBE, 0x5B, 0x5D, 0xAF, 0xA8, 0xB4, 0xD7,
+ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5,
+ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xF9, 0xFA, 0xFF,
+ 0x5C, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F
+};
+#endif          /* 037 */
+
+#else
+EXTCONST unsigned char PL_utf8skip[];
+EXTCONST unsigned char PL_e2utf[];
+EXTCONST unsigned char PL_utf2e[];
+EXTCONST unsigned char PL_e2a[];
+EXTCONST unsigned char PL_a2e[];
+#endif
+
+END_EXTERN_C
+
+#define UTF8SKIP(s) PL_utf8skip[*(const U8*)s]
+
+/* EBCDIC-happy ways of converting native code to UTF-8 */
+
+/* Native to iso-8859-1 */
+#define NATIVE_TO_ASCII(ch)      PL_e2a[(U8)(ch)]
+#define ASCII_TO_NATIVE(ch)      PL_a2e[(U8)(ch)]
+/* Transform after encoding */
+#define NATIVE_TO_UTF(ch)        PL_e2utf[(U8)(ch)]
+#define UTF_TO_NATIVE(ch)        PL_utf2e[(U8)(ch)]
+/* Transform in wide UV char space */
+#define NATIVE_TO_UNI(ch)        (((ch) > 255) ? (ch) : NATIVE_TO_ASCII(ch))
+#define UNI_TO_NATIVE(ch)        (((ch) > 255) ? (ch) : ASCII_TO_NATIVE(ch))
+/* Transform in invariant..byte space */
+#define NATIVE_TO_NEED(enc,ch)   ((enc) ? UTF_TO_NATIVE(NATIVE_TO_ASCII(ch)) : (ch))
+#define ASCII_TO_NEED(enc,ch)    ((enc) ? UTF_TO_NATIVE(ch) : ASCII_TO_NATIVE(ch))
+
+/*
+ * Note: we should try and be careful never to call the isXXX_utf8() functions
+ * unless we're pretty sure we've seen the beginning of a UTF-EBCDIC character
+ * Otherwise we risk loading in the heavy-duty SWASHINIT and SWASHGET routines
+ * unnecessarily.
+ */
+
+#define isIDFIRST_lazy_if(p,c) ((IN_BYTES || (!c || UTF8_IS_INVARIANT(*p))) \
+				? isIDFIRST(*(p)) \
+				: isIDFIRST_utf8((const U8*)p))
+#define isALNUM_lazy_if(p,c)   ((IN_BYTES || (!c || UTF8_IS_INVARIANT(*p))) \
+				? isALNUM(*(p)) \
+				: isALNUM_utf8((const U8*)p))
+
+/*
+  The following table is adapted from tr16, it shows UTF-8-mod encoding of Unicode code points.
+
+        Unicode                             Bit pattern 1st Byte 2nd Byte 3rd Byte 4th Byte 5th Byte 6th Byte 7th byte
+    U+0000..U+007F                     000000000xxxxxxx 0xxxxxxx
+    U+0080..U+009F                     00000000100xxxxx 100xxxxx
+    U+00A0..U+00FF                     00000000yyyxxxxx 11000yyy 101xxxxx
+
+    U+00A0..U+03FF                     000000yyyyyxxxxx 110yyyyy 101xxxxx
+    U+0400..U+3FFF                     00zzzzyyyyyxxxxx 1110zzzz 101yyyyy 101xxxxx
+    U+4000..U+3FFFF                 0wwwzzzzzyyyyyxxxxx 11110www 101zzzzz 101yyyyy 101xxxxx
+   U+40000..U+3FFFFF            0vvwwwwwzzzzzyyyyyxxxxx 111110vv 101wwwww 101zzzzz 101yyyyy 101xxxxx
+  U+400000..U+3FFFFFF       0uvvvvvwwwwwzzzzzyyyyyxxxxx 1111110u 101vvvvv 101wwwww 101zzzzz 101yyyyy 101xxxxx
+ U+4000000..U+7FFFFFFF 0tuuuuuvvvvvwwwwwzzzzzyyyyyxxxxx 1111111t 101uuuuu 101vvvvv 101wwwww 101zzzzz 101yyyyy 101xxxxx
+
+  Note: The UTF-8-Mod transformation is valid for UCS-4 values X'0' to
+  X'7FFFFFFF' (the full extent of ISO/IEC 10646 coding space).
+
+ */
+
+#define UNISKIP(uv) ( (uv) < 0xA0           ? 1 : \
+		      (uv) < 0x400          ? 2 : \
+		      (uv) < 0x4000         ? 3 : \
+		      (uv) < 0x40000        ? 4 : \
+		      (uv) < 0x400000       ? 5 : \
+		      (uv) < 0x4000000      ? 6 : 7 )
+
+
+#define UNI_IS_INVARIANT(c)		((c) <  0xA0)
+/* UTF-EBCDIC sematic macros - transform back into UTF-8-Mod and then compare */
+#define NATIVE_IS_INVARIANT(c)		UNI_IS_INVARIANT(NATIVE_TO_ASCII(c))
+#define UTF8_IS_INVARIANT(c)		UNI_IS_INVARIANT(NATIVE_TO_UTF(c))
+#define UTF8_IS_START(c)		(NATIVE_TO_UTF(c) >= 0xA0 && (NATIVE_TO_UTF(c) & 0xE0) != 0xA0)
+#define UTF8_IS_CONTINUATION(c)		((NATIVE_TO_UTF(c) & 0xE0) == 0xA0)
+#define UTF8_IS_CONTINUED(c) 		(NATIVE_TO_UTF(c) >= 0xA0)
+#define UTF8_IS_DOWNGRADEABLE_START(c)	(NATIVE_TO_UTF(c) >= 0xA0 && (NATIVE_TO_UTF(c) & 0xF8) == 0xC0)
+
+#define UTF_START_MARK(len) ((len >  7) ? 0xFF : (0xFE << (7-len)))
+#define UTF_START_MASK(len) ((len >= 6) ? 0x01 : (0x1F >> (len-2)))
+#define UTF_CONTINUATION_MARK		0xA0
+#define UTF_CONTINUATION_MASK		((U8)0x1f)
+#define UTF_ACCUMULATION_SHIFT		5
+
+#define UTF8_ACCUMULATE(old, new)	(((old) << UTF_ACCUMULATION_SHIFT)|(NATIVE_TO_UTF(new) & UTF_CONTINUATION_MASK))
+
+/* UTF-EBCDIC encode a downgradeable value */
+#define UTF8_EIGHT_BIT_HI(c)	UTF_TO_NATIVE((((U8)(c))>>UTF_ACCUMULATION_SHIFT)|UTF_START_MARK(2))
+#define UTF8_EIGHT_BIT_LO(c)	UTF_TO_NATIVE(((((U8)(c)))&UTF_CONTINUATION_MASK)|UTF_CONTINUATION_MARK)
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/util.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/util.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/util.h	(revision 14489)
@@ -0,0 +1,43 @@
+/*    util.h
+ *
+ *    Copyright (C) 1991, 1992, 1993, 1999, 2001, 2002,
+ *    by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifdef VMS
+#  define PERL_FILE_IS_ABSOLUTE(f) \
+	(*(f) == '/'							\
+	 || (strchr(f,':')						\
+	     || ((*(f) == '[' || *(f) == '<')				\
+		 && (isALNUM((f)[1]) || strchr("$-_]>",(f)[1])))))
+
+#else		/* !VMS */
+#  if defined(WIN32) || defined(__CYGWIN__)
+#    define PERL_FILE_IS_ABSOLUTE(f) \
+	(*(f) == '/' || *(f) == '\\'		/* UNC/rooted path */	\
+	 || ((f)[0] && (f)[1] == ':'))		/* drive name */
+#  else		/* !WIN32 */
+#  ifdef NETWARE
+#    define PERL_FILE_IS_ABSOLUTE(f) \
+	(((f)[0] && (f)[1] == ':')		/* drive name */	\
+	 || ((f)[0] == '\\' && (f)[1] == '\\')	/* UNC path */	\
+	 ||	((f)[3] == ':'))				/* volume name, currently only sys */
+#  else		/* !NETWARE */
+#    if defined( DOSISH) || defined(EPOC)
+#      define PERL_FILE_IS_ABSOLUTE(f) \
+	(*(f) == '/'							\
+	 || ((f)[0] && (f)[1] == ':'))		/* drive name */
+#    else	/* NEITHER DOSISH NOR EPOCISH */
+#      ifdef MACOS_TRADITIONAL
+#        define PERL_FILE_IS_ABSOLUTE(f)	(strchr(f, ':') && *(f) != ':')
+#      else /* !MACOS_TRADITIONAL */
+#        define PERL_FILE_IS_ABSOLUTE(f)	(*(f) == '/')
+#      endif /* MACOS_TRADITIONAL */
+#    endif	/* DOSISH */
+#   endif	/* NETWARE */
+#  endif	/* WIN32 */
+#endif		/* VMS */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/vdir.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/vdir.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/vdir.h	(revision 14489)
@@ -0,0 +1,691 @@
+/* vdir.h
+ *
+ * (c) 1999 Microsoft Corporation. All rights reserved. 
+ * Portions (c) 1999 ActiveState Tool Corp, http://www.ActiveState.com/
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ */
+
+#ifndef ___VDir_H___
+#define ___VDir_H___
+
+/*
+ * Allow one slot for each possible drive letter
+ * and one additional slot for a UNC name
+ */
+const int driveCount = ('Z'-'A')+1+1;
+
+class VDir
+{
+public:
+    VDir(int bManageDir = 1);
+    ~VDir() {};
+
+    void Init(VDir* pDir, VMem *pMem);
+    void SetDefaultA(char const *pDefault);
+    void SetDefaultW(WCHAR const *pDefault);
+    char* MapPathA(const char *pInName);
+    WCHAR* MapPathW(const WCHAR *pInName);
+    int SetCurrentDirectoryA(char *lpBuffer);
+    int SetCurrentDirectoryW(WCHAR *lpBuffer);
+    inline int GetDefault(void) { return nDefault; };
+
+    inline char* GetCurrentDirectoryA(int dwBufSize, char *lpBuffer)
+    {
+	char* ptr = dirTableA[nDefault];
+	while (dwBufSize--)
+	{
+	    if ((*lpBuffer++ = *ptr++) == '\0')
+		break;
+	}
+	return lpBuffer;
+    };
+    inline WCHAR* GetCurrentDirectoryW(int dwBufSize, WCHAR *lpBuffer)
+    {
+	WCHAR* ptr = dirTableW[nDefault];
+	while (dwBufSize--)
+	{
+	    if ((*lpBuffer++ = *ptr++) == '\0')
+		break;
+	}
+	return lpBuffer;
+    };
+
+
+    DWORD CalculateEnvironmentSpace(void);
+    LPSTR BuildEnvironmentSpace(LPSTR lpStr);
+
+protected:
+    int SetDirA(char const *pPath, int index);
+    void FromEnvA(char *pEnv, int index);
+    inline const char *GetDefaultDirA(void)
+    {
+	return dirTableA[nDefault];
+    };
+
+    inline void SetDefaultDirA(char const *pPath, int index)
+    {
+	SetDirA(pPath, index);
+	nDefault = index;
+    };
+    int SetDirW(WCHAR const *pPath, int index);
+    inline const WCHAR *GetDefaultDirW(void)
+    {
+	return dirTableW[nDefault];
+    };
+
+    inline void SetDefaultDirW(WCHAR const *pPath, int index)
+    {
+	SetDirW(pPath, index);
+	nDefault = index;
+    };
+    inline const char *GetDirA(int index)
+    {
+	char *ptr = dirTableA[index];
+	if (!ptr) {
+	    /* simulate the existance of this drive */
+	    ptr = szLocalBufferA;
+	    ptr[0] = 'A' + index;
+	    ptr[1] = ':';
+	    ptr[2] = '\\';
+	    ptr[3] = 0;
+	}
+	return ptr;
+    };
+    inline const WCHAR *GetDirW(int index)
+    {
+	WCHAR *ptr = dirTableW[index];
+	if (!ptr) {
+	    /* simulate the existance of this drive */
+	    ptr = szLocalBufferW;
+	    ptr[0] = 'A' + index;
+	    ptr[1] = ':';
+	    ptr[2] = '\\';
+	    ptr[3] = 0;
+	}
+	return ptr;
+    };
+
+    inline int DriveIndex(char chr)
+    {
+	if (chr == '\\' || chr == '/')
+	    return ('Z'-'A')+1;
+	return (chr | 0x20)-'a';
+    };
+
+    VMem *pMem;
+    int nDefault, bManageDirectory;
+    char *dirTableA[driveCount];
+    char szLocalBufferA[MAX_PATH+1];
+    WCHAR *dirTableW[driveCount];
+    WCHAR szLocalBufferW[MAX_PATH+1];
+};
+
+
+VDir::VDir(int bManageDir /* = 1 */)
+{
+    nDefault = 0;
+    bManageDirectory = bManageDir;
+    memset(dirTableA, 0, sizeof(dirTableA));
+    memset(dirTableW, 0, sizeof(dirTableW));
+}
+
+void VDir::Init(VDir* pDir, VMem *p)
+{
+    int index;
+    DWORD driveBits;
+    int nSave;
+    char szBuffer[MAX_PATH*driveCount];
+
+    pMem = p;
+    if (pDir) {
+	for (index = 0; index < driveCount; ++index) {
+	    SetDirW(pDir->GetDirW(index), index);
+	}
+	nDefault = pDir->GetDefault();
+    }
+    else {
+	nSave = bManageDirectory;
+	bManageDirectory = 0;
+	driveBits = GetLogicalDrives();
+	if (GetLogicalDriveStrings(sizeof(szBuffer), szBuffer)) {
+	    char* pEnv = GetEnvironmentStrings();
+	    char* ptr = szBuffer;
+	    for (index = 0; index < driveCount; ++index) {
+		if (driveBits & (1<<index)) {
+		    ptr += SetDirA(ptr, index) + 1;
+		    FromEnvA(pEnv, index);
+		}
+	    }
+	    FreeEnvironmentStrings(pEnv);
+	}
+	SetDefaultA(".");
+	bManageDirectory = nSave;
+    }
+}
+
+int VDir::SetDirA(char const *pPath, int index)
+{
+    char chr, *ptr;
+    int length = 0;
+    WCHAR wBuffer[MAX_PATH+1];
+    if (index < driveCount && pPath != NULL) {
+	length = strlen(pPath);
+	pMem->Free(dirTableA[index]);
+	ptr = dirTableA[index] = (char*)pMem->Malloc(length+2);
+	if (ptr != NULL) {
+	    strcpy(ptr, pPath);
+	    ptr += length-1;
+	    chr = *ptr++;
+	    if (chr != '\\' && chr != '/') {
+		*ptr++ = '\\';
+		*ptr = '\0';
+	    }
+	    MultiByteToWideChar(CP_ACP, 0, dirTableA[index], -1,
+		    wBuffer, (sizeof(wBuffer)/sizeof(WCHAR)));
+	    length = wcslen(wBuffer);
+	    pMem->Free(dirTableW[index]);
+	    dirTableW[index] = (WCHAR*)pMem->Malloc((length+1)*2);
+	    if (dirTableW[index] != NULL) {
+		wcscpy(dirTableW[index], wBuffer);
+	    }
+	}
+    }
+
+    if(bManageDirectory)
+	::SetCurrentDirectoryA(pPath);
+
+    return length;
+}
+
+void VDir::FromEnvA(char *pEnv, int index)
+{   /* gets the directory for index from the environment variable. */
+    while (*pEnv != '\0') {
+	if ((pEnv[0] == '=') && (DriveIndex(pEnv[1]) == index)) {
+	    SetDirA(&pEnv[4], index);
+	    break;
+	}
+	else
+	    pEnv += strlen(pEnv)+1;
+    }
+}
+
+void VDir::SetDefaultA(char const *pDefault)
+{
+    char szBuffer[MAX_PATH+1];
+    char *pPtr;
+
+    if (GetFullPathNameA(pDefault, sizeof(szBuffer), szBuffer, &pPtr)) {
+        if (*pDefault != '.' && pPtr != NULL)
+	    *pPtr = '\0';
+
+	SetDefaultDirA(szBuffer, DriveIndex(szBuffer[0]));
+    }
+}
+
+int VDir::SetDirW(WCHAR const *pPath, int index)
+{
+    WCHAR chr, *ptr;
+    char szBuffer[MAX_PATH+1];
+    int length = 0;
+    if (index < driveCount && pPath != NULL) {
+	length = wcslen(pPath);
+	pMem->Free(dirTableW[index]);
+	ptr = dirTableW[index] = (WCHAR*)pMem->Malloc((length+2)*2);
+	if (ptr != NULL) {
+	    wcscpy(ptr, pPath);
+	    ptr += length-1;
+	    chr = *ptr++;
+	    if (chr != '\\' && chr != '/') {
+		*ptr++ = '\\';
+		*ptr = '\0';
+	    }
+	    WideCharToMultiByte(CP_ACP, 0, dirTableW[index], -1, szBuffer, sizeof(szBuffer), NULL, NULL);
+	    length = strlen(szBuffer);
+	    pMem->Free(dirTableA[index]);
+	    dirTableA[index] = (char*)pMem->Malloc(length+1);
+	    if (dirTableA[index] != NULL) {
+		strcpy(dirTableA[index], szBuffer);
+	    }
+	}
+    }
+
+    if(bManageDirectory)
+	::SetCurrentDirectoryW(pPath);
+
+    return length;
+}
+
+void VDir::SetDefaultW(WCHAR const *pDefault)
+{
+    WCHAR szBuffer[MAX_PATH+1];
+    WCHAR *pPtr;
+
+    if (GetFullPathNameW(pDefault, (sizeof(szBuffer)/sizeof(WCHAR)), szBuffer, &pPtr)) {
+        if (*pDefault != '.' && pPtr != NULL)
+	    *pPtr = '\0';
+
+	SetDefaultDirW(szBuffer, DriveIndex((char)szBuffer[0]));
+    }
+}
+
+inline BOOL IsPathSep(char ch)
+{
+    return (ch == '\\' || ch == '/');
+}
+
+inline void DoGetFullPathNameA(char* lpBuffer, DWORD dwSize, char* Dest)
+{
+    char *pPtr;
+
+    /*
+     * On WinNT GetFullPathName does not fail, (or at least always
+     * succeeds when the drive is valid) WinNT does set *Dest to Nullch
+     * On Win98 GetFullPathName will set last error if it fails, but
+     * does not touch *Dest
+     */
+    *Dest = '\0';
+    GetFullPathNameA(lpBuffer, dwSize, Dest, &pPtr);
+}
+
+inline bool IsSpecialFileName(const char* pName)
+{
+    /* specical file names are devices that the system can open
+     * these include AUX, CON, NUL, PRN, COMx, LPTx, CLOCK$, CONIN$, CONOUT$
+     * (x is a single digit, and names are case-insensitive)
+     */
+    char ch = (pName[0] & ~0x20);
+    switch (ch)
+    {
+	case 'A': /* AUX */
+	    if (((pName[1] & ~0x20) == 'U')
+		&& ((pName[2] & ~0x20) == 'X')
+		&& !pName[3])
+		    return true;
+	    break;
+	case 'C': /* CLOCK$, COMx,  CON, CONIN$ CONOUT$ */
+	    ch = (pName[1] & ~0x20);
+	    switch (ch)
+	    {
+		case 'L': /* CLOCK$ */
+		    if (((pName[2] & ~0x20) == 'O')
+			&& ((pName[3] & ~0x20) == 'C')
+			&& ((pName[4] & ~0x20) == 'K')
+			&& (pName[5] == '$')
+			&& !pName[6])
+			    return true;
+		    break;
+		case 'O': /* COMx,  CON, CONIN$ CONOUT$ */
+		    if ((pName[2] & ~0x20) == 'M') {
+			if ((pName[3] >= '1') && (pName[3] <= '9')
+			    && !pName[4])
+			    return true;
+		    }
+		    else if ((pName[2] & ~0x20) == 'N') {
+			if (!pName[3])
+			    return true;
+			else if ((pName[3] & ~0x20) == 'I') {
+			    if (((pName[4] & ~0x20) == 'N')
+				&& (pName[5] == '$')
+				&& !pName[6])
+			    return true;
+			}
+			else if ((pName[3] & ~0x20) == 'O') {
+			    if (((pName[4] & ~0x20) == 'U')
+				&& ((pName[5] & ~0x20) == 'T')
+				&& (pName[6] == '$')
+				&& !pName[7])
+			    return true;
+			}
+		    }
+		    break;
+	    }
+	    break;
+	case 'L': /* LPTx */
+	    if (((pName[1] & ~0x20) == 'U')
+		&& ((pName[2] & ~0x20) == 'X')
+		&& (pName[3] >= '1') && (pName[3] <= '9')
+		&& !pName[4])
+		    return true;
+	    break;
+	case 'N': /* NUL */
+	    if (((pName[1] & ~0x20) == 'U')
+		&& ((pName[2] & ~0x20) == 'L')
+		&& !pName[3])
+		    return true;
+	    break;
+	case 'P': /* PRN */
+	    if (((pName[1] & ~0x20) == 'R')
+		&& ((pName[2] & ~0x20) == 'N')
+		&& !pName[3])
+		    return true;
+	    break;
+    }
+    return false;
+}
+
+char *VDir::MapPathA(const char *pInName)
+{   /*
+     * possiblities -- relative path or absolute path with or without drive letter
+     * OR UNC name
+     */
+    char szBuffer[(MAX_PATH+1)*2];
+    char szlBuf[MAX_PATH+1];
+    int length = strlen(pInName);
+
+    if (!length)
+	return (char*)pInName;
+
+    if (length > MAX_PATH) {
+	strncpy(szlBuf, pInName, MAX_PATH);
+	if (IsPathSep(pInName[0]) && !IsPathSep(pInName[1])) {   
+	    /* absolute path - reduce length by 2 for drive specifier */
+	    szlBuf[MAX_PATH-2] = '\0';
+	}
+	else
+	    szlBuf[MAX_PATH] = '\0';
+	pInName = szlBuf;
+    }
+    /* strlen(pInName) is now <= MAX_PATH */
+
+    if (pInName[1] == ':') {
+	/* has drive letter */
+	if (IsPathSep(pInName[2])) {
+	    /* absolute with drive letter */
+	    DoGetFullPathNameA((char*)pInName, sizeof(szLocalBufferA), szLocalBufferA);
+	}
+	else {
+	    /* relative path with drive letter */
+	    strcpy(szBuffer, GetDirA(DriveIndex(*pInName)));
+	    strcat(szBuffer, &pInName[2]);
+	    if(strlen(szBuffer) > MAX_PATH)
+		szBuffer[MAX_PATH] = '\0';
+
+	    DoGetFullPathNameA(szBuffer, sizeof(szLocalBufferA), szLocalBufferA);
+	}
+    }
+    else {
+	/* no drive letter */
+	if (IsPathSep(pInName[1]) && IsPathSep(pInName[0])) {
+	    /* UNC name */
+	    DoGetFullPathNameA((char*)pInName, sizeof(szLocalBufferA), szLocalBufferA);
+	}
+	else {
+	    strcpy(szBuffer, GetDefaultDirA());
+	    if (IsPathSep(pInName[0])) {
+		/* absolute path */
+		strcpy(&szBuffer[2], pInName);
+		DoGetFullPathNameA(szBuffer, sizeof(szLocalBufferA), szLocalBufferA);
+	    }
+	    else {
+		/* relative path */
+		if (IsSpecialFileName(pInName)) {
+		    return (char*)pInName;
+		}
+		else {
+		    strcat(szBuffer, pInName);
+		    if (strlen(szBuffer) > MAX_PATH)
+			szBuffer[MAX_PATH] = '\0';
+
+		    DoGetFullPathNameA(szBuffer, sizeof(szLocalBufferA), szLocalBufferA);
+		}
+	    }
+	}
+    }
+
+    return szLocalBufferA;
+}
+
+int VDir::SetCurrentDirectoryA(char *lpBuffer)
+{
+    char *pPtr;
+    int length, nRet = -1;
+
+    pPtr = MapPathA(lpBuffer);
+    length = strlen(pPtr);
+    if(length > 3 && IsPathSep(pPtr[length-1])) {
+	/* don't remove the trailing slash from 'x:\'  */
+	pPtr[length-1] = '\0';
+    }
+
+    DWORD r = GetFileAttributesA(pPtr);
+    if ((r != 0xffffffff) && (r & FILE_ATTRIBUTE_DIRECTORY))
+    {
+	char szBuffer[(MAX_PATH+1)*2];
+	DoGetFullPathNameA(pPtr, sizeof(szBuffer), szBuffer);
+	SetDefaultDirA(szBuffer, DriveIndex(szBuffer[0]));
+	nRet = 0;
+    }
+
+    return nRet;
+}
+
+DWORD VDir::CalculateEnvironmentSpace(void)
+{   /* the current directory environment strings are stored as '=D:=d:\path' */
+    int index;
+    DWORD dwSize = 0;
+    for (index = 0; index < driveCount; ++index) {
+	if (dirTableA[index] != NULL) {
+	    dwSize += strlen(dirTableA[index]) + 5;  /* add 1 for trailing NULL and 4 for '=D:=' */
+	}
+    }
+    return dwSize;
+}
+
+LPSTR VDir::BuildEnvironmentSpace(LPSTR lpStr)
+{   /* store the current directory environment strings as '=D:=d:\path' */
+    int index, length;
+    LPSTR lpDirStr;
+    for (index = 0; index < driveCount; ++index) {
+	lpDirStr = dirTableA[index];
+	if (lpDirStr != NULL) {
+	    lpStr[0] = '=';
+	    lpStr[1] = lpDirStr[0];
+	    lpStr[2] = '\0';
+	    CharUpper(&lpStr[1]);
+	    lpStr[2] = ':';
+	    lpStr[3] = '=';
+	    strcpy(&lpStr[4], lpDirStr);
+	    length = strlen(lpDirStr);
+	    lpStr += length + 5; /* add 1 for trailing NULL and 4 for '=D:=' */
+	    if (length > 3 && IsPathSep(lpStr[-2])) {
+		lpStr[-2] = '\0';   /* remove the trailing path separator */
+		--lpStr;
+	    }
+	}
+    }
+    return lpStr;
+}
+
+inline BOOL IsPathSep(WCHAR ch)
+{
+    return (ch == '\\' || ch == '/');
+}
+
+inline void DoGetFullPathNameW(WCHAR* lpBuffer, DWORD dwSize, WCHAR* Dest)
+{
+    WCHAR *pPtr;
+
+    /*
+     * On WinNT GetFullPathName does not fail, (or at least always
+     * succeeds when the drive is valid) WinNT does set *Dest to Nullch
+     * On Win98 GetFullPathName will set last error if it fails, but
+     * does not touch *Dest
+     */
+    *Dest = '\0';
+    GetFullPathNameW(lpBuffer, dwSize, Dest, &pPtr);
+}
+
+inline bool IsSpecialFileName(const WCHAR* pName)
+{
+    /* specical file names are devices that the system can open
+     * these include AUX, CON, NUL, PRN, COMx, LPTx, CLOCK$, CONIN$, CONOUT$
+     * (x is a single digit, and names are case-insensitive)
+     */
+    WCHAR ch = (pName[0] & ~0x20);
+    switch (ch)
+    {
+	case 'A': /* AUX */
+	    if (((pName[1] & ~0x20) == 'U')
+		&& ((pName[2] & ~0x20) == 'X')
+		&& !pName[3])
+		    return true;
+	    break;
+	case 'C': /* CLOCK$, COMx,  CON, CONIN$ CONOUT$ */
+	    ch = (pName[1] & ~0x20);
+	    switch (ch)
+	    {
+		case 'L': /* CLOCK$ */
+		    if (((pName[2] & ~0x20) == 'O')
+			&& ((pName[3] & ~0x20) == 'C')
+			&& ((pName[4] & ~0x20) == 'K')
+			&& (pName[5] == '$')
+			&& !pName[6])
+			    return true;
+		    break;
+		case 'O': /* COMx,  CON, CONIN$ CONOUT$ */
+		    if ((pName[2] & ~0x20) == 'M') {
+			if ((pName[3] >= '1') && (pName[3] <= '9')
+			    && !pName[4])
+			    return true;
+		    }
+		    else if ((pName[2] & ~0x20) == 'N') {
+			if (!pName[3])
+			    return true;
+			else if ((pName[3] & ~0x20) == 'I') {
+			    if (((pName[4] & ~0x20) == 'N')
+				&& (pName[5] == '$')
+				&& !pName[6])
+			    return true;
+			}
+			else if ((pName[3] & ~0x20) == 'O') {
+			    if (((pName[4] & ~0x20) == 'U')
+				&& ((pName[5] & ~0x20) == 'T')
+				&& (pName[6] == '$')
+				&& !pName[7])
+			    return true;
+			}
+		    }
+		    break;
+	    }
+	    break;
+	case 'L': /* LPTx */
+	    if (((pName[1] & ~0x20) == 'U')
+		&& ((pName[2] & ~0x20) == 'X')
+		&& (pName[3] >= '1') && (pName[3] <= '9')
+		&& !pName[4])
+		    return true;
+	    break;
+	case 'N': /* NUL */
+	    if (((pName[1] & ~0x20) == 'U')
+		&& ((pName[2] & ~0x20) == 'L')
+		&& !pName[3])
+		    return true;
+	    break;
+	case 'P': /* PRN */
+	    if (((pName[1] & ~0x20) == 'R')
+		&& ((pName[2] & ~0x20) == 'N')
+		&& !pName[3])
+		    return true;
+	    break;
+    }
+    return false;
+}
+
+WCHAR* VDir::MapPathW(const WCHAR *pInName)
+{   /*
+     * possiblities -- relative path or absolute path with or without drive letter
+     * OR UNC name
+     */
+    WCHAR szBuffer[(MAX_PATH+1)*2];
+    WCHAR szlBuf[MAX_PATH+1];
+    int length = wcslen(pInName);
+
+    if (!length)
+	return (WCHAR*)pInName;
+
+    if (length > MAX_PATH) {
+	wcsncpy(szlBuf, pInName, MAX_PATH);
+	if (IsPathSep(pInName[0]) && !IsPathSep(pInName[1])) {   
+	    /* absolute path - reduce length by 2 for drive specifier */
+	    szlBuf[MAX_PATH-2] = '\0';
+	}
+	else
+	    szlBuf[MAX_PATH] = '\0';
+	pInName = szlBuf;
+    }
+    /* strlen(pInName) is now <= MAX_PATH */
+
+    if (pInName[1] == ':') {
+	/* has drive letter */
+	if (IsPathSep(pInName[2])) {
+	    /* absolute with drive letter */
+	    DoGetFullPathNameW((WCHAR*)pInName, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
+	}
+	else {
+	    /* relative path with drive letter */
+	    wcscpy(szBuffer, GetDirW(DriveIndex((char)*pInName)));
+	    wcscat(szBuffer, &pInName[2]);
+	    if(wcslen(szBuffer) > MAX_PATH)
+		szBuffer[MAX_PATH] = '\0';
+
+	    DoGetFullPathNameW(szBuffer, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
+	}
+    }
+    else {
+	/* no drive letter */
+	if (IsPathSep(pInName[1]) && IsPathSep(pInName[0])) {
+	    /* UNC name */
+	    DoGetFullPathNameW((WCHAR*)pInName, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
+	}
+	else {
+	    wcscpy(szBuffer, GetDefaultDirW());
+	    if (IsPathSep(pInName[0])) {
+		/* absolute path */
+		wcscpy(&szBuffer[2], pInName);
+		DoGetFullPathNameW(szBuffer, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
+	    }
+	    else {
+		/* relative path */
+		if (IsSpecialFileName(pInName)) {
+		    return (WCHAR*)pInName;
+		}
+		else {
+		    wcscat(szBuffer, pInName);
+		    if (wcslen(szBuffer) > MAX_PATH)
+			szBuffer[MAX_PATH] = '\0';
+
+		    DoGetFullPathNameW(szBuffer, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
+		}
+	    }
+	}
+    }
+    return szLocalBufferW;
+}
+
+int VDir::SetCurrentDirectoryW(WCHAR *lpBuffer)
+{
+    WCHAR *pPtr;
+    int length, nRet = -1;
+
+    pPtr = MapPathW(lpBuffer);
+    length = wcslen(pPtr);
+    if(length > 3 && IsPathSep(pPtr[length-1])) {
+	/* don't remove the trailing slash from 'x:\'  */
+	pPtr[length-1] = '\0';
+    }
+
+    DWORD r = GetFileAttributesW(pPtr);
+    if ((r != 0xffffffff) && (r & FILE_ATTRIBUTE_DIRECTORY))
+    {
+	WCHAR wBuffer[(MAX_PATH+1)*2];
+	DoGetFullPathNameW(pPtr, (sizeof(wBuffer)/sizeof(WCHAR)), wBuffer);
+	SetDefaultDirW(wBuffer, DriveIndex((char)wBuffer[0]));
+	nRet = 0;
+    }
+
+    return nRet;
+}
+
+#endif	/* ___VDir_H___ */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/vmem.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/vmem.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/vmem.h	(revision 14489)
@@ -0,0 +1,1248 @@
+/* vmem.h
+ *
+ * (c) 1999 Microsoft Corporation. All rights reserved. 
+ * Portions (c) 1999 ActiveState Tool Corp, http://www.ActiveState.com/
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * Options:
+ *
+ * Defining _USE_MSVCRT_MEM_ALLOC will cause all memory allocations
+ * to be forwarded to MSVCRT.DLL. Defining _USE_LINKED_LIST as well will
+ * track all allocations in a doubly linked list, so that the host can
+ * free all memory allocated when it goes away.
+ * If _USE_MSVCRT_MEM_ALLOC is not defined then Knuth's boundary tag algorithm
+ * is used; defining _USE_BUDDY_BLOCKS will use Knuth's algorithm R
+ * (Buddy system reservation)
+ *
+ */
+
+#ifndef ___VMEM_H_INC___
+#define ___VMEM_H_INC___
+
+#define _USE_MSVCRT_MEM_ALLOC
+#define _USE_LINKED_LIST
+
+// #define _USE_BUDDY_BLOCKS
+
+// #define _DEBUG_MEM
+#ifdef _DEBUG_MEM
+#define ASSERT(f) if(!(f)) DebugBreak();
+
+inline void MEMODS(char *str)
+{
+    OutputDebugString(str);
+    OutputDebugString("\n");
+}
+
+inline void MEMODSlx(char *str, long x)
+{
+    char szBuffer[512];	
+    sprintf(szBuffer, "%s %lx\n", str, x);
+    OutputDebugString(szBuffer);
+}
+
+#define WALKHEAP() WalkHeap(0)
+#define WALKHEAPTRACE() WalkHeap(1)
+
+#else
+
+#define ASSERT(f)
+#define MEMODS(x)
+#define MEMODSlx(x, y)
+#define WALKHEAP()
+#define WALKHEAPTRACE()
+
+#endif
+
+#ifdef _USE_MSVCRT_MEM_ALLOC
+
+#ifndef _USE_LINKED_LIST
+// #define _USE_LINKED_LIST
+#endif
+
+/* 
+ * Pass all memory requests throught to msvcrt.dll 
+ * optionaly track by using a doubly linked header
+ */
+
+typedef void (*LPFREE)(void *block);
+typedef void* (*LPMALLOC)(size_t size);
+typedef void* (*LPREALLOC)(void *block, size_t size);
+#ifdef _USE_LINKED_LIST
+class VMem;
+typedef struct _MemoryBlockHeader* PMEMORY_BLOCK_HEADER;
+typedef struct _MemoryBlockHeader {
+    PMEMORY_BLOCK_HEADER    pNext;
+    PMEMORY_BLOCK_HEADER    pPrev;
+    VMem *owner;
+} MEMORY_BLOCK_HEADER, *PMEMORY_BLOCK_HEADER;
+#endif
+
+class VMem
+{
+public:
+    VMem();
+    ~VMem();
+    virtual void* Malloc(size_t size);
+    virtual void* Realloc(void* pMem, size_t size);
+    virtual void Free(void* pMem);
+    virtual void GetLock(void);
+    virtual void FreeLock(void);
+    virtual int IsLocked(void);
+    virtual long Release(void);
+    virtual long AddRef(void);
+
+    inline BOOL CreateOk(void)
+    {
+	return TRUE;
+    };
+
+protected:
+#ifdef _USE_LINKED_LIST
+    void LinkBlock(PMEMORY_BLOCK_HEADER ptr)
+    {
+	PMEMORY_BLOCK_HEADER next = m_Dummy.pNext;
+	m_Dummy.pNext = ptr;
+	ptr->pPrev = &m_Dummy;
+	ptr->pNext = next;
+        ptr->owner = this;
+	next->pPrev = ptr;
+    }
+    void UnlinkBlock(PMEMORY_BLOCK_HEADER ptr)
+    {
+	PMEMORY_BLOCK_HEADER next = ptr->pNext;
+	PMEMORY_BLOCK_HEADER prev = ptr->pPrev;
+	prev->pNext = next;
+	next->pPrev = prev;
+    }
+
+    MEMORY_BLOCK_HEADER	m_Dummy;
+#endif
+
+    long		m_lRefCount;	// number of current users
+    CRITICAL_SECTION	m_cs;		// access lock
+    HINSTANCE		m_hLib;
+    LPFREE		m_pfree;
+    LPMALLOC		m_pmalloc;
+    LPREALLOC		m_prealloc;
+};
+
+VMem::VMem()
+{
+    m_lRefCount = 1;
+    InitializeCriticalSection(&m_cs);
+#ifdef _USE_LINKED_LIST
+    m_Dummy.pNext = m_Dummy.pPrev =  &m_Dummy;
+    m_Dummy.owner = this;
+#endif
+    m_hLib = LoadLibrary("msvcrt.dll");
+    if (m_hLib) {
+	m_pfree = (LPFREE)GetProcAddress(m_hLib, "free");
+	m_pmalloc = (LPMALLOC)GetProcAddress(m_hLib, "malloc");
+	m_prealloc = (LPREALLOC)GetProcAddress(m_hLib, "realloc");
+    }
+}
+
+VMem::~VMem(void)
+{
+#ifdef _USE_LINKED_LIST
+    while (m_Dummy.pNext != &m_Dummy) {
+	Free(m_Dummy.pNext+1);
+    }
+#endif
+    if (m_hLib)
+	FreeLibrary(m_hLib);
+    DeleteCriticalSection(&m_cs);
+}
+
+void* VMem::Malloc(size_t size)
+{
+#ifdef _USE_LINKED_LIST
+    GetLock();
+    PMEMORY_BLOCK_HEADER ptr = (PMEMORY_BLOCK_HEADER)m_pmalloc(size+sizeof(MEMORY_BLOCK_HEADER));
+    LinkBlock(ptr);
+    FreeLock();
+    return (ptr+1);
+#else
+    return m_pmalloc(size);
+#endif
+}
+
+void* VMem::Realloc(void* pMem, size_t size)
+{
+#ifdef _USE_LINKED_LIST
+    if (!pMem)
+	return Malloc(size);
+
+    if (!size) {
+	Free(pMem);
+	return NULL;
+    }
+
+    GetLock();
+    PMEMORY_BLOCK_HEADER ptr = (PMEMORY_BLOCK_HEADER)(((char*)pMem)-sizeof(MEMORY_BLOCK_HEADER));
+    UnlinkBlock(ptr);
+    ptr = (PMEMORY_BLOCK_HEADER)m_prealloc(ptr, size+sizeof(MEMORY_BLOCK_HEADER));
+    LinkBlock(ptr);
+    FreeLock();
+
+    return (ptr+1);
+#else
+    return m_prealloc(pMem, size);
+#endif
+}
+
+void VMem::Free(void* pMem)
+{
+#ifdef _USE_LINKED_LIST
+    if (pMem) {
+	PMEMORY_BLOCK_HEADER ptr = (PMEMORY_BLOCK_HEADER)(((char*)pMem)-sizeof(MEMORY_BLOCK_HEADER));
+        if (ptr->owner != this) {
+	    if (ptr->owner) {
+#if 1
+		dTHX;
+	    	int *nowhere = NULL;
+	    	Perl_warn(aTHX_ "Free to wrong pool %p not %p",this,ptr->owner);
+            	*nowhere = 0;
+#else
+                ptr->owner->Free(pMem);	
+#endif
+	    }
+	    return;
+        }
+	GetLock();
+	UnlinkBlock(ptr);
+	ptr->owner = NULL;
+	m_pfree(ptr);
+	FreeLock();
+    }
+#else
+    m_pfree(pMem);
+#endif
+}
+
+void VMem::GetLock(void)
+{
+    EnterCriticalSection(&m_cs);
+}
+
+void VMem::FreeLock(void)
+{
+    LeaveCriticalSection(&m_cs);
+}
+
+int VMem::IsLocked(void)
+{
+#if 0
+    /* XXX TryEnterCriticalSection() is not available in some versions
+     * of Windows 95.  Since this code is not used anywhere yet, we 
+     * skirt the issue for now. */
+    BOOL bAccessed = TryEnterCriticalSection(&m_cs);
+    if(bAccessed) {
+	LeaveCriticalSection(&m_cs);
+    }
+    return !bAccessed;
+#else
+    ASSERT(0);	/* alarm bells for when somebody calls this */
+    return 0;
+#endif
+}
+
+long VMem::Release(void)
+{
+    long lCount = InterlockedDecrement(&m_lRefCount);
+    if(!lCount)
+	delete this;
+    return lCount;
+}
+
+long VMem::AddRef(void)
+{
+    long lCount = InterlockedIncrement(&m_lRefCount);
+    return lCount;
+}
+
+#else	/* _USE_MSVCRT_MEM_ALLOC */
+
+/*
+ * Knuth's boundary tag algorithm Vol #1, Page 440.
+ *
+ * Each block in the heap has tag words before and after it,
+ *  TAG
+ *  block
+ *  TAG
+ * The size is stored in these tags as a long word, and includes the 8 bytes
+ * of overhead that the boundary tags consume.  Blocks are allocated on long
+ * word boundaries, so the size is always multiples of long words.  When the
+ * block is allocated, bit 0, (the tag bit), of the size is set to 1.  When 
+ * a block is freed, it is merged with adjacent free blocks, and the tag bit
+ * is set to 0.
+ *
+ * A linked list is used to manage the free list. The first two long words of
+ * the block contain double links.  These links are only valid when the block
+ * is freed, therefore space needs to be reserved for them.  Thus, the minimum
+ * block size (not counting the tags) is 8 bytes.
+ *
+ * Since memory allocation may occur on a single threaded, explict locks are not
+ * provided.
+ * 
+ */
+
+const long lAllocStart = 0x00020000; /* start at 128K */
+const long minBlockSize = sizeof(void*)*2;
+const long sizeofTag = sizeof(long);
+const long blockOverhead = sizeofTag*2;
+const long minAllocSize = minBlockSize+blockOverhead;
+#ifdef _USE_BUDDY_BLOCKS
+const long lSmallBlockSize = 1024;
+const size_t nListEntries = ((lSmallBlockSize-minAllocSize)/sizeof(long));
+
+inline size_t CalcEntry(size_t size)
+{
+    ASSERT((size&(sizeof(long)-1)) == 0);
+    return ((size - minAllocSize) / sizeof(long));
+}
+#endif
+
+typedef BYTE* PBLOCK;	/* pointer to a memory block */
+
+/*
+ * Macros for accessing hidden fields in a memory block:
+ *
+ * SIZE	    size of this block (tag bit 0 is 1 if block is allocated)
+ * PSIZE    size of previous physical block
+ */
+
+#define SIZE(block)	(*(ULONG*)(((PBLOCK)(block))-sizeofTag))
+#define PSIZE(block)	(*(ULONG*)(((PBLOCK)(block))-(blockOverhead)))
+inline void SetTags(PBLOCK block, long size)
+{
+    SIZE(block) = size;
+    PSIZE(block+(size&~1)) = size;
+}
+
+/*
+ * Free list pointers
+ * PREV	pointer to previous block
+ * NEXT	pointer to next block
+ */
+
+#define PREV(block)	(*(PBLOCK*)(block))
+#define NEXT(block)	(*(PBLOCK*)((block)+sizeof(PBLOCK)))
+inline void SetLink(PBLOCK block, PBLOCK prev, PBLOCK next)
+{
+    PREV(block) = prev;
+    NEXT(block) = next;
+}
+inline void Unlink(PBLOCK p)
+{
+    PBLOCK next = NEXT(p);
+    PBLOCK prev = PREV(p);
+    NEXT(prev) = next;
+    PREV(next) = prev;
+}
+#ifndef _USE_BUDDY_BLOCKS
+inline void AddToFreeList(PBLOCK block, PBLOCK pInList)
+{
+    PBLOCK next = NEXT(pInList);
+    NEXT(pInList) = block;
+    SetLink(block, pInList, next);
+    PREV(next) = block;
+}
+#endif
+
+/* Macro for rounding up to the next sizeof(long) */
+#define ROUND_UP(n)	(((ULONG)(n)+sizeof(long)-1)&~(sizeof(long)-1))
+#define ROUND_UP64K(n)	(((ULONG)(n)+0x10000-1)&~(0x10000-1))
+#define ROUND_DOWN(n)	((ULONG)(n)&~(sizeof(long)-1))
+
+/*
+ * HeapRec - a list of all non-contiguous heap areas
+ *
+ * Each record in this array contains information about a non-contiguous heap area.
+ */
+
+const int maxHeaps = 32; /* 64 was overkill */
+const long lAllocMax   = 0x80000000; /* max size of allocation */
+
+#ifdef _USE_BUDDY_BLOCKS
+typedef struct _FreeListEntry
+{
+    BYTE    Dummy[minAllocSize];	// dummy free block
+} FREE_LIST_ENTRY, *PFREE_LIST_ENTRY;
+#endif
+
+#ifndef _USE_BUDDY_BLOCKS
+#define USE_BIGBLOCK_ALLOC
+#endif
+/*
+ * performance tuning
+ * Use VirtualAlloc() for blocks bigger than nMaxHeapAllocSize since
+ * Windows 95/98/Me have heap managers that are designed for memory 
+ * blocks smaller than four megabytes.
+ */
+
+#ifdef USE_BIGBLOCK_ALLOC
+const int nMaxHeapAllocSize = (1024*512);  /* don't allocate anything larger than this from the heap */
+#endif
+
+typedef struct _HeapRec
+{
+    PBLOCK	base;	/* base of heap area */
+    ULONG	len;	/* size of heap area */
+#ifdef USE_BIGBLOCK_ALLOC
+    BOOL	bBigBlock;  /* was allocate using VirtualAlloc */
+#endif
+} HeapRec;
+
+class VMem
+{
+public:
+    VMem();
+    ~VMem();
+    virtual void* Malloc(size_t size);
+    virtual void* Realloc(void* pMem, size_t size);
+    virtual void Free(void* pMem);
+    virtual void GetLock(void);
+    virtual void FreeLock(void);
+    virtual int IsLocked(void);
+    virtual long Release(void);
+    virtual long AddRef(void);
+
+    inline BOOL CreateOk(void)
+    {
+#ifdef _USE_BUDDY_BLOCKS
+	return TRUE;
+#else
+	return m_hHeap != NULL;
+#endif
+    };
+
+    void ReInit(void);
+
+protected:
+    void Init(void);
+    int Getmem(size_t size);
+
+    int HeapAdd(void* ptr, size_t size
+#ifdef USE_BIGBLOCK_ALLOC
+	, BOOL bBigBlock
+#endif
+    );
+
+    void* Expand(void* block, size_t size);
+
+#ifdef _USE_BUDDY_BLOCKS
+    inline PBLOCK GetFreeListLink(int index)
+    {
+	if (index >= nListEntries)
+	    index = nListEntries-1;
+	return &m_FreeList[index].Dummy[sizeofTag];
+    }
+    inline PBLOCK GetOverSizeFreeList(void)
+    {
+	return &m_FreeList[nListEntries-1].Dummy[sizeofTag];
+    }
+    inline PBLOCK GetEOLFreeList(void)
+    {
+	return &m_FreeList[nListEntries].Dummy[sizeofTag];
+    }
+
+    void AddToFreeList(PBLOCK block, size_t size)
+    {
+	PBLOCK pFreeList = GetFreeListLink(CalcEntry(size));
+	PBLOCK next = NEXT(pFreeList);
+	NEXT(pFreeList) = block;
+	SetLink(block, pFreeList, next);
+	PREV(next) = block;
+    }
+#endif
+    inline size_t CalcAllocSize(size_t size)
+    {
+	/*
+	 * Adjust the real size of the block to be a multiple of sizeof(long), and add
+	 * the overhead for the boundary tags.  Disallow negative or zero sizes.
+	 */
+	return (size < minBlockSize) ? minAllocSize : (size_t)ROUND_UP(size) + blockOverhead;
+    }
+
+#ifdef _USE_BUDDY_BLOCKS
+    FREE_LIST_ENTRY	m_FreeList[nListEntries+1];	// free list with dummy end of list entry as well
+#else
+    HANDLE		m_hHeap;		    // memory heap for this script
+    char		m_FreeDummy[minAllocSize];  // dummy free block
+    PBLOCK		m_pFreeList;		    // pointer to first block on free list
+#endif
+    PBLOCK		m_pRover;		    // roving pointer into the free list
+    HeapRec		m_heaps[maxHeaps];	    // list of all non-contiguous heap areas 
+    int			m_nHeaps;		    // no. of heaps in m_heaps 
+    long		m_lAllocSize;		    // current alloc size
+    long		m_lRefCount;		    // number of current users
+    CRITICAL_SECTION	m_cs;			    // access lock
+
+#ifdef _DEBUG_MEM
+    void WalkHeap(int complete);
+    void MemoryUsageMessage(char *str, long x, long y, int c);
+    FILE*		m_pLog;
+#endif
+};
+
+VMem::VMem()
+{
+    m_lRefCount = 1;
+#ifndef _USE_BUDDY_BLOCKS
+    BOOL bRet = (NULL != (m_hHeap = HeapCreate(HEAP_NO_SERIALIZE,
+				lAllocStart,	/* initial size of heap */
+				0)));		/* no upper limit on size of heap */
+    ASSERT(bRet);
+#endif
+
+    InitializeCriticalSection(&m_cs);
+#ifdef _DEBUG_MEM
+    m_pLog = 0;
+#endif
+
+    Init();
+}
+
+VMem::~VMem(void)
+{
+#ifndef _USE_BUDDY_BLOCKS
+    ASSERT(HeapValidate(m_hHeap, HEAP_NO_SERIALIZE, NULL));
+#endif
+    WALKHEAPTRACE();
+
+    DeleteCriticalSection(&m_cs);
+#ifdef _USE_BUDDY_BLOCKS
+    for(int index = 0; index < m_nHeaps; ++index) {
+	VirtualFree(m_heaps[index].base, 0, MEM_RELEASE);
+    }
+#else /* !_USE_BUDDY_BLOCKS */
+#ifdef USE_BIGBLOCK_ALLOC
+    for(int index = 0; index < m_nHeaps; ++index) {
+	if (m_heaps[index].bBigBlock) {
+	    VirtualFree(m_heaps[index].base, 0, MEM_RELEASE);
+	}
+    }
+#endif
+    BOOL bRet = HeapDestroy(m_hHeap);
+    ASSERT(bRet);
+#endif /* _USE_BUDDY_BLOCKS */
+}
+
+void VMem::ReInit(void)
+{
+    for(int index = 0; index < m_nHeaps; ++index) {
+#ifdef _USE_BUDDY_BLOCKS
+	VirtualFree(m_heaps[index].base, 0, MEM_RELEASE);
+#else
+#ifdef USE_BIGBLOCK_ALLOC
+	if (m_heaps[index].bBigBlock) {
+	    VirtualFree(m_heaps[index].base, 0, MEM_RELEASE);
+	}
+	else
+#endif
+	    HeapFree(m_hHeap, HEAP_NO_SERIALIZE, m_heaps[index].base);
+#endif /* _USE_BUDDY_BLOCKS */
+    }
+
+    Init();
+}
+
+void VMem::Init(void)
+{
+#ifdef _USE_BUDDY_BLOCKS
+    PBLOCK pFreeList;
+    /*
+     * Initialize the free list by placing a dummy zero-length block on it.
+     * Set the end of list marker.
+     * Set the number of non-contiguous heaps to zero.
+     * Set the next allocation size.
+     */
+    for (int index = 0; index < nListEntries; ++index) {
+	pFreeList = GetFreeListLink(index);
+	SIZE(pFreeList) = PSIZE(pFreeList+minAllocSize) = 0;
+	PREV(pFreeList) = NEXT(pFreeList) = pFreeList;
+    }
+    pFreeList = GetEOLFreeList();
+    SIZE(pFreeList) = PSIZE(pFreeList+minAllocSize) = 0;
+    PREV(pFreeList) = NEXT(pFreeList) = NULL;
+    m_pRover = GetOverSizeFreeList();
+#else
+    /*
+     * Initialize the free list by placing a dummy zero-length block on it.
+     * Set the number of non-contiguous heaps to zero.
+     */
+    m_pFreeList = m_pRover = (PBLOCK)(&m_FreeDummy[sizeofTag]);
+    PSIZE(m_pFreeList+minAllocSize) = SIZE(m_pFreeList) = 0;
+    PREV(m_pFreeList) = NEXT(m_pFreeList) = m_pFreeList;
+#endif
+
+    m_nHeaps = 0;
+    m_lAllocSize = lAllocStart;
+}
+
+void* VMem::Malloc(size_t size)
+{
+    WALKHEAP();
+
+    PBLOCK ptr;
+    size_t lsize, rem;
+    /*
+     * Disallow negative or zero sizes.
+     */
+    size_t realsize = CalcAllocSize(size);
+    if((int)realsize < minAllocSize || size == 0)
+	return NULL;
+
+#ifdef _USE_BUDDY_BLOCKS
+    /*
+     * Check the free list of small blocks if this is free use it
+     * Otherwise check the rover if it has no blocks then
+     * Scan the free list entries use the first free block
+     * split the block if needed, stop at end of list marker
+     */
+    {
+	int index = CalcEntry(realsize);
+	if (index < nListEntries-1) {
+	    ptr = GetFreeListLink(index);
+	    lsize = SIZE(ptr);
+	    if (lsize >= realsize) {
+		rem = lsize - realsize;
+		if(rem < minAllocSize) {
+		    /* Unlink the block from the free list. */
+		    Unlink(ptr);
+		}
+		else {
+		    /*
+		     * split the block
+		     * The remainder is big enough to split off into a new block.
+		     * Use the end of the block, resize the beginning of the block
+		     * no need to change the free list.
+		     */
+		    SetTags(ptr, rem);
+		    ptr += SIZE(ptr);
+		    lsize = realsize;
+		}
+		SetTags(ptr, lsize | 1);
+		return ptr;
+	    }
+	    ptr = m_pRover;
+	    lsize = SIZE(ptr);
+	    if (lsize >= realsize) {
+		rem = lsize - realsize;
+		if(rem < minAllocSize) {
+		    /* Unlink the block from the free list. */
+		    Unlink(ptr);
+		}
+		else {
+		    /*
+		     * split the block
+		     * The remainder is big enough to split off into a new block.
+		     * Use the end of the block, resize the beginning of the block
+		     * no need to change the free list.
+		     */
+		    SetTags(ptr, rem);
+		    ptr += SIZE(ptr);
+		    lsize = realsize;
+		}
+		SetTags(ptr, lsize | 1);
+		return ptr;
+	    }
+	    ptr = GetFreeListLink(index+1);
+	    while (NEXT(ptr)) {
+		lsize = SIZE(ptr);
+		if (lsize >= realsize) {
+		    size_t rem = lsize - realsize;
+		    if(rem < minAllocSize) {
+			/* Unlink the block from the free list. */
+			Unlink(ptr);
+		    }
+		    else {
+			/*
+			 * split the block
+			 * The remainder is big enough to split off into a new block.
+			 * Use the end of the block, resize the beginning of the block
+			 * no need to change the free list.
+			 */
+			SetTags(ptr, rem);
+			ptr += SIZE(ptr);
+			lsize = realsize;
+		    }
+		    SetTags(ptr, lsize | 1);
+		    return ptr;
+		}
+		ptr += sizeof(FREE_LIST_ENTRY);
+	    }
+	}
+    }
+#endif
+
+    /*
+     * Start searching the free list at the rover.  If we arrive back at rover without
+     * finding anything, allocate some memory from the heap and try again.
+     */
+    ptr = m_pRover;	/* start searching at rover */
+    int loops = 2;	/* allow two times through the loop  */
+    for(;;) {
+	lsize = SIZE(ptr);
+	ASSERT((lsize&1)==0);
+	/* is block big enough? */
+	if(lsize >= realsize) {	
+	    /* if the remainder is too small, don't bother splitting the block. */
+	    rem = lsize - realsize;
+	    if(rem < minAllocSize) {
+		if(m_pRover == ptr)
+		    m_pRover = NEXT(ptr);
+
+		/* Unlink the block from the free list. */
+		Unlink(ptr);
+	    }
+	    else {
+		/*
+		 * split the block
+		 * The remainder is big enough to split off into a new block.
+		 * Use the end of the block, resize the beginning of the block
+		 * no need to change the free list.
+		 */
+		SetTags(ptr, rem);
+		ptr += SIZE(ptr);
+		lsize = realsize;
+	    }
+	    /* Set the boundary tags to mark it as allocated. */
+	    SetTags(ptr, lsize | 1);
+	    return ((void *)ptr);
+	}
+
+	/*
+	 * This block was unsuitable.  If we've gone through this list once already without
+	 * finding anything, allocate some new memory from the heap and try again.
+	 */
+	ptr = NEXT(ptr);
+	if(ptr == m_pRover) {
+	    if(!(loops-- && Getmem(realsize))) {
+		return NULL;
+	    }
+	    ptr = m_pRover;
+	}
+    }
+}
+
+void* VMem::Realloc(void* block, size_t size)
+{
+    WALKHEAP();
+
+    /* if size is zero, free the block. */
+    if(size == 0) {
+	Free(block);
+	return (NULL);
+    }
+
+    /* if block pointer is NULL, do a Malloc(). */
+    if(block == NULL)
+	return Malloc(size);
+
+    /*
+     * Grow or shrink the block in place.
+     * if the block grows then the next block will be used if free
+     */
+    if(Expand(block, size) != NULL)
+	return block;
+
+    size_t realsize = CalcAllocSize(size);
+    if((int)realsize < minAllocSize)
+	return NULL;
+
+    /*
+     * see if the previous block is free, and is it big enough to cover the new size
+     * if merged with the current block.
+     */
+    PBLOCK ptr = (PBLOCK)block;
+    size_t cursize = SIZE(ptr) & ~1;
+    size_t psize = PSIZE(ptr);
+    if((psize&1) == 0 && (psize + cursize) >= realsize) {
+	PBLOCK prev = ptr - psize;
+	if(m_pRover == prev)
+	    m_pRover = NEXT(prev);
+
+	/* Unlink the next block from the free list. */
+	Unlink(prev);
+
+	/* Copy contents of old block to new location, make it the current block. */
+	memmove(prev, ptr, cursize);
+	cursize += psize;	/* combine sizes */
+	ptr = prev;
+
+	size_t rem = cursize - realsize;
+	if(rem >= minAllocSize) {
+	    /*
+	     * The remainder is big enough to be a new block.  Set boundary
+	     * tags for the resized block and the new block.
+	     */
+	    prev = ptr + realsize;
+	    /*
+	     * add the new block to the free list.
+	     * next block cannot be free
+	     */
+	    SetTags(prev, rem);
+#ifdef _USE_BUDDY_BLOCKS
+	    AddToFreeList(prev, rem);
+#else
+	    AddToFreeList(prev, m_pFreeList);
+#endif
+	    cursize = realsize;
+        }
+	/* Set the boundary tags to mark it as allocated. */
+	SetTags(ptr, cursize | 1);
+        return ((void *)ptr);
+    }
+
+    /* Allocate a new block, copy the old to the new, and free the old. */
+    if((ptr = (PBLOCK)Malloc(size)) != NULL) {
+	memmove(ptr, block, cursize-blockOverhead);
+	Free(block);
+    }
+    return ((void *)ptr);
+}
+
+void VMem::Free(void* p)
+{
+    WALKHEAP();
+
+    /* Ignore null pointer. */
+    if(p == NULL)
+	return;
+
+    PBLOCK ptr = (PBLOCK)p;
+
+    /* Check for attempt to free a block that's already free. */
+    size_t size = SIZE(ptr);
+    if((size&1) == 0) {
+	MEMODSlx("Attempt to free previously freed block", (long)p);
+	return;
+    }
+    size &= ~1;	/* remove allocated tag */
+
+    /* if previous block is free, add this block to it. */
+#ifndef _USE_BUDDY_BLOCKS
+    int linked = FALSE;
+#endif
+    size_t psize = PSIZE(ptr);
+    if((psize&1) == 0) {
+	ptr -= psize;	/* point to previous block */
+	size += psize;	/* merge the sizes of the two blocks */
+#ifdef _USE_BUDDY_BLOCKS
+	Unlink(ptr);
+#else
+	linked = TRUE;	/* it's already on the free list */
+#endif
+    }
+
+    /* if the next physical block is free, merge it with this block. */
+    PBLOCK next = ptr + size;	/* point to next physical block */
+    size_t nsize = SIZE(next);
+    if((nsize&1) == 0) {
+	/* block is free move rover if needed */
+	if(m_pRover == next)
+	    m_pRover = NEXT(next);
+
+	/* unlink the next block from the free list. */
+	Unlink(next);
+
+	/* merge the sizes of this block and the next block. */
+	size += nsize;
+    }
+
+    /* Set the boundary tags for the block; */
+    SetTags(ptr, size);
+
+    /* Link the block to the head of the free list. */
+#ifdef _USE_BUDDY_BLOCKS
+	AddToFreeList(ptr, size);
+#else
+    if(!linked) {
+	AddToFreeList(ptr, m_pFreeList);
+    }
+#endif
+}
+
+void VMem::GetLock(void)
+{
+    EnterCriticalSection(&m_cs);
+}
+
+void VMem::FreeLock(void)
+{
+    LeaveCriticalSection(&m_cs);
+}
+
+int VMem::IsLocked(void)
+{
+#if 0
+    /* XXX TryEnterCriticalSection() is not available in some versions
+     * of Windows 95.  Since this code is not used anywhere yet, we 
+     * skirt the issue for now. */
+    BOOL bAccessed = TryEnterCriticalSection(&m_cs);
+    if(bAccessed) {
+	LeaveCriticalSection(&m_cs);
+    }
+    return !bAccessed;
+#else
+    ASSERT(0);	/* alarm bells for when somebody calls this */
+    return 0;
+#endif
+}
+
+
+long VMem::Release(void)
+{
+    long lCount = InterlockedDecrement(&m_lRefCount);
+    if(!lCount)
+	delete this;
+    return lCount;
+}
+
+long VMem::AddRef(void)
+{
+    long lCount = InterlockedIncrement(&m_lRefCount);
+    return lCount;
+}
+
+
+int VMem::Getmem(size_t requestSize)
+{   /* returns -1 is successful 0 if not */
+#ifdef USE_BIGBLOCK_ALLOC
+    BOOL bBigBlock;
+#endif
+    void *ptr;
+
+    /* Round up size to next multiple of 64K. */
+    size_t size = (size_t)ROUND_UP64K(requestSize);
+
+    /*
+     * if the size requested is smaller than our current allocation size
+     * adjust up
+     */
+    if(size < (unsigned long)m_lAllocSize)
+	size = m_lAllocSize;
+
+    /* Update the size to allocate on the next request */
+    if(m_lAllocSize != lAllocMax)
+	m_lAllocSize <<= 2;
+
+#ifndef _USE_BUDDY_BLOCKS
+    if(m_nHeaps != 0
+#ifdef USE_BIGBLOCK_ALLOC
+	&& !m_heaps[m_nHeaps-1].bBigBlock
+#endif
+		    ) {
+	/* Expand the last allocated heap */
+	ptr = HeapReAlloc(m_hHeap, HEAP_REALLOC_IN_PLACE_ONLY|HEAP_NO_SERIALIZE,
+		m_heaps[m_nHeaps-1].base,
+		m_heaps[m_nHeaps-1].len + size);
+	if(ptr != 0) {
+	    HeapAdd(((char*)ptr) + m_heaps[m_nHeaps-1].len, size
+#ifdef USE_BIGBLOCK_ALLOC
+		, FALSE
+#endif
+		);
+	    return -1;
+	}
+    }
+#endif /* _USE_BUDDY_BLOCKS */
+
+    /*
+     * if we didn't expand a block to cover the requested size
+     * allocate a new Heap
+     * the size of this block must include the additional dummy tags at either end
+     * the above ROUND_UP64K may not have added any memory to include this.
+     */
+    if(size == requestSize)
+	size = (size_t)ROUND_UP64K(requestSize+(blockOverhead));
+
+Restart:
+#ifdef _USE_BUDDY_BLOCKS
+    ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
+#else
+#ifdef USE_BIGBLOCK_ALLOC
+    bBigBlock = FALSE;
+    if (size >= nMaxHeapAllocSize) {
+	bBigBlock = TRUE;
+	ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
+    }
+    else
+#endif
+    ptr = HeapAlloc(m_hHeap, HEAP_NO_SERIALIZE, size);
+#endif /* _USE_BUDDY_BLOCKS */
+
+    if (!ptr) {
+	/* try to allocate a smaller chunk */
+	size >>= 1;
+	if(size > requestSize)
+	    goto Restart;
+    }
+
+    if(ptr == 0) {
+	MEMODSlx("HeapAlloc failed on size!!!", size);
+	return 0;
+    }
+
+#ifdef _USE_BUDDY_BLOCKS
+    if (HeapAdd(ptr, size)) {
+	VirtualFree(ptr, 0, MEM_RELEASE);
+	return 0;
+    }
+#else
+#ifdef USE_BIGBLOCK_ALLOC
+    if (HeapAdd(ptr, size, bBigBlock)) {
+	if (bBigBlock) {
+	    VirtualFree(ptr, 0, MEM_RELEASE);
+	}
+    }
+#else
+    HeapAdd(ptr, size);
+#endif
+#endif /* _USE_BUDDY_BLOCKS */
+    return -1;
+}
+
+int VMem::HeapAdd(void* p, size_t size
+#ifdef USE_BIGBLOCK_ALLOC
+    , BOOL bBigBlock
+#endif
+    )
+{   /* if the block can be succesfully added to the heap, returns 0; otherwise -1. */
+    int index;
+
+    /* Check size, then round size down to next long word boundary. */
+    if(size < minAllocSize)
+	return -1;
+
+    size = (size_t)ROUND_DOWN(size);
+    PBLOCK ptr = (PBLOCK)p;
+
+#ifdef USE_BIGBLOCK_ALLOC
+    if (!bBigBlock) {
+#endif
+	/*
+	 * Search for another heap area that's contiguous with the bottom of this new area.
+	 * (It should be extremely unusual to find one that's contiguous with the top).
+	 */
+	for(index = 0; index < m_nHeaps; ++index) {
+	    if(ptr == m_heaps[index].base + (int)m_heaps[index].len) {
+		/*
+		 * The new block is contiguous with a previously allocated heap area.  Add its
+		 * length to that of the previous heap.  Merge it with the dummy end-of-heap
+		 * area marker of the previous heap.
+		 */
+		m_heaps[index].len += size;
+		break;
+	    }
+	}
+#ifdef USE_BIGBLOCK_ALLOC
+    }
+    else {
+	index = m_nHeaps;
+    }
+#endif
+
+    if(index == m_nHeaps) {
+	/* The new block is not contiguous, or is BigBlock.  Add it to the heap list. */
+	if(m_nHeaps == maxHeaps) {
+	    return -1;	/* too many non-contiguous heaps */
+	}
+	m_heaps[m_nHeaps].base = ptr;
+	m_heaps[m_nHeaps].len = size;
+#ifdef USE_BIGBLOCK_ALLOC
+	m_heaps[m_nHeaps].bBigBlock = bBigBlock;
+#endif
+	m_nHeaps++;
+
+	/*
+	 * Reserve the first LONG in the block for the ending boundary tag of a dummy
+	 * block at the start of the heap area.
+	 */
+	size -= blockOverhead;
+	ptr += blockOverhead;
+	PSIZE(ptr) = 1;	/* mark the dummy previous block as allocated */
+    }
+
+    /*
+     * Convert the heap to one large block.  Set up its boundary tags, and those of
+     * marker block after it.  The marker block before the heap will already have
+     * been set up if this heap is not contiguous with the end of another heap.
+     */
+    SetTags(ptr, size | 1);
+    PBLOCK next = ptr + size;	/* point to dummy end block */
+    SIZE(next) = 1;	/* mark the dummy end block as allocated */
+
+    /*
+     * Link the block to the start of the free list by calling free().
+     * This will merge the block with any adjacent free blocks.
+     */
+    Free(ptr);
+    return 0;
+}
+
+
+void* VMem::Expand(void* block, size_t size)
+{
+    /*
+     * Disallow negative or zero sizes.
+     */
+    size_t realsize = CalcAllocSize(size);
+    if((int)realsize < minAllocSize || size == 0)
+	return NULL;
+
+    PBLOCK ptr = (PBLOCK)block; 
+
+    /* if the current size is the same as requested, do nothing. */
+    size_t cursize = SIZE(ptr) & ~1;
+    if(cursize == realsize) {
+	return block;
+    }
+
+    /* if the block is being shrunk, convert the remainder of the block into a new free block. */
+    if(realsize <= cursize) {
+	size_t nextsize = cursize - realsize;	/* size of new remainder block */
+	if(nextsize >= minAllocSize) {
+	    /*
+	     * Split the block
+	     * Set boundary tags for the resized block and the new block.
+	     */
+	    SetTags(ptr, realsize | 1);
+	    ptr += realsize;
+
+	    /*
+	     * add the new block to the free list.
+	     * call Free to merge this block with next block if free
+	     */
+	    SetTags(ptr, nextsize | 1);
+	    Free(ptr);
+	}
+
+	return block;
+    }
+
+    PBLOCK next = ptr + cursize;
+    size_t nextsize = SIZE(next);
+
+    /* Check the next block for consistency.*/
+    if((nextsize&1) == 0 && (nextsize + cursize) >= realsize) {
+	/*
+	 * The next block is free and big enough.  Add the part that's needed
+	 * to our block, and split the remainder off into a new block.
+	 */
+	if(m_pRover == next)
+	    m_pRover = NEXT(next);
+
+	/* Unlink the next block from the free list. */
+	Unlink(next);
+	cursize += nextsize;	/* combine sizes */
+
+	size_t rem = cursize - realsize;	/* size of remainder */
+	if(rem >= minAllocSize) {
+	    /*
+	     * The remainder is big enough to be a new block.
+	     * Set boundary tags for the resized block and the new block.
+	     */
+	    next = ptr + realsize;
+	    /*
+	     * add the new block to the free list.
+	     * next block cannot be free
+	     */
+	    SetTags(next, rem);
+#ifdef _USE_BUDDY_BLOCKS
+	    AddToFreeList(next, rem);
+#else
+	    AddToFreeList(next, m_pFreeList);
+#endif
+	    cursize = realsize;
+        }
+	/* Set the boundary tags to mark it as allocated. */
+	SetTags(ptr, cursize | 1);
+	return ((void *)ptr);
+    }
+    return NULL;
+}
+
+#ifdef _DEBUG_MEM
+#define LOG_FILENAME ".\\MemLog.txt"
+
+void VMem::MemoryUsageMessage(char *str, long x, long y, int c)
+{
+    char szBuffer[512];
+    if(str) {
+	if(!m_pLog)
+	    m_pLog = fopen(LOG_FILENAME, "w");
+	sprintf(szBuffer, str, x, y, c);
+	fputs(szBuffer, m_pLog);
+    }
+    else {
+	if(m_pLog) {
+	    fflush(m_pLog);
+	    fclose(m_pLog);
+	    m_pLog = 0;
+	}
+    }
+}
+
+void VMem::WalkHeap(int complete)
+{
+    if(complete) {
+	MemoryUsageMessage(NULL, 0, 0, 0);
+	size_t total = 0;
+	for(int i = 0; i < m_nHeaps; ++i) {
+	    total += m_heaps[i].len;
+	}
+	MemoryUsageMessage("VMem heaps used %d. Total memory %08x\n", m_nHeaps, total, 0);
+
+	/* Walk all the heaps - verify structures */
+	for(int index = 0; index < m_nHeaps; ++index) {
+	    PBLOCK ptr = m_heaps[index].base;
+	    size_t size = m_heaps[index].len;
+#ifndef _USE_BUDDY_BLOCKS
+#ifdef USE_BIGBLOCK_ALLOC
+	    if (!m_heaps[m_nHeaps].bBigBlock)
+#endif
+		ASSERT(HeapValidate(m_hHeap, HEAP_NO_SERIALIZE, ptr));
+#endif
+
+	    /* set over reserved header block */
+	    size -= blockOverhead;
+	    ptr += blockOverhead;
+	    PBLOCK pLast = ptr + size;
+	    ASSERT(PSIZE(ptr) == 1); /* dummy previous block is allocated */
+	    ASSERT(SIZE(pLast) == 1); /* dummy next block is allocated */
+	    while(ptr < pLast) {
+		ASSERT(ptr > m_heaps[index].base);
+		size_t cursize = SIZE(ptr) & ~1;
+		ASSERT((PSIZE(ptr+cursize) & ~1) == cursize);
+		MemoryUsageMessage("Memory Block %08x: Size %08x %c\n", (long)ptr, cursize, (SIZE(ptr)&1) ? 'x' : ' ');
+		if(!(SIZE(ptr)&1)) {
+		    /* this block is on the free list */
+		    PBLOCK tmp = NEXT(ptr);
+		    while(tmp != ptr) {
+			ASSERT((SIZE(tmp)&1)==0);
+			if(tmp == m_pFreeList)
+			    break;
+			ASSERT(NEXT(tmp));
+			tmp = NEXT(tmp);
+		    }
+		    if(tmp == ptr) {
+			MemoryUsageMessage("Memory Block %08x: Size %08x free but not in free list\n", (long)ptr, cursize, 0);
+		    }
+		}
+		ptr += cursize;
+	    }
+	}
+	MemoryUsageMessage(NULL, 0, 0, 0);
+    }
+}
+#endif	/* _DEBUG_MEM */
+
+#endif	/* _USE_MSVCRT_MEM_ALLOC */
+
+#endif	/* ___VMEM_H_INC___ */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/warnings.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/warnings.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/warnings.h	(revision 14489)
@@ -0,0 +1,117 @@
+/* -*- buffer-read-only: t -*-
+   !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+   This file is built by warnings.pl
+   Any changes made here will be lost!
+*/
+
+
+#define Off(x)			((x) / 8)
+#define Bit(x)			(1 << ((x) % 8))
+#define IsSet(a, x)		((a)[Off(x)] & Bit(x))
+
+
+#define G_WARN_OFF		0 	/* $^W == 0 */
+#define G_WARN_ON		1	/* -w flag and $^W != 0 */
+#define G_WARN_ALL_ON		2	/* -W flag */
+#define G_WARN_ALL_OFF		4	/* -X flag */
+#define G_WARN_ONCE		8	/* set if 'once' ever enabled */
+#define G_WARN_ALL_MASK		(G_WARN_ALL_ON|G_WARN_ALL_OFF)
+
+#define pWARN_STD		Nullsv
+#define pWARN_ALL		(Nullsv+1)	/* use warnings 'all' */
+#define pWARN_NONE		(Nullsv+2)	/* no  warnings 'all' */
+
+#define specialWARN(x)		((x) == pWARN_STD || (x) == pWARN_ALL ||	\
+				 (x) == pWARN_NONE)
+
+/* Warnings Categories added in Perl 5.008 */
+
+#define WARN_ALL		0
+#define WARN_CLOSURE		1
+#define WARN_DEPRECATED		2
+#define WARN_EXITING		3
+#define WARN_GLOB		4
+#define WARN_IO			5
+#define WARN_CLOSED		6
+#define WARN_EXEC		7
+#define WARN_LAYER		8
+#define WARN_NEWLINE		9
+#define WARN_PIPE		10
+#define WARN_UNOPENED		11
+#define WARN_MISC		12
+#define WARN_NUMERIC		13
+#define WARN_ONCE		14
+#define WARN_OVERFLOW		15
+#define WARN_PACK		16
+#define WARN_PORTABLE		17
+#define WARN_RECURSION		18
+#define WARN_REDEFINE		19
+#define WARN_REGEXP		20
+#define WARN_SEVERE		21
+#define WARN_DEBUGGING		22
+#define WARN_INPLACE		23
+#define WARN_INTERNAL		24
+#define WARN_MALLOC		25
+#define WARN_SIGNAL		26
+#define WARN_SUBSTR		27
+#define WARN_SYNTAX		28
+#define WARN_AMBIGUOUS		29
+#define WARN_BAREWORD		30
+#define WARN_DIGIT		31
+#define WARN_PARENTHESIS	32
+#define WARN_PRECEDENCE		33
+#define WARN_PRINTF		34
+#define WARN_PROTOTYPE		35
+#define WARN_QW			36
+#define WARN_RESERVED		37
+#define WARN_SEMICOLON		38
+#define WARN_TAINT		39
+#define WARN_THREADS		40
+#define WARN_UNINITIALIZED	41
+#define WARN_UNPACK		42
+#define WARN_UNTIE		43
+#define WARN_UTF8		44
+#define WARN_VOID		45
+#define WARN_Y2K		46
+
+#define WARNsize		12
+#define WARN_ALLstring		"\125\125\125\125\125\125\125\125\125\125\125\125"
+#define WARN_NONEstring		"\0\0\0\0\0\0\0\0\0\0\0\0"
+#define WARN_TAINTstring	"\0\0\0\0\0\0\0\0\0\100\0\0"
+
+#define isLEXWARN_on 	(PL_curcop->cop_warnings != pWARN_STD)
+#define isLEXWARN_off	(PL_curcop->cop_warnings == pWARN_STD)
+#define isWARN_ONCE	(PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
+#define isWARN_on(c,x)	(IsSet(SvPVX_const(c), 2*(x)))
+#define isWARNf_on(c,x)	(IsSet(SvPVX_const(c), 2*(x)+1))
+
+#define ckWARN(w)		Perl_ckwarn(aTHX_ packWARN(w))
+#define ckWARN2(w1,w2)		Perl_ckwarn(aTHX_ packWARN2(w1,w2))
+#define ckWARN3(w1,w2,w3)	Perl_ckwarn(aTHX_ packWARN3(w1,w2,w3))
+#define ckWARN4(w1,w2,w3,w4)	Perl_ckwarn(aTHX_ packWARN4(w1,w2,w3,w4))
+
+#define ckWARN_d(w)		Perl_ckwarn_d(aTHX_ packWARN(w))
+#define ckWARN2_d(w1,w2)	Perl_ckwarn_d(aTHX_ packWARN2(w1,w2))
+#define ckWARN3_d(w1,w2,w3)	Perl_ckwarn_d(aTHX_ packWARN3(w1,w2,w3))
+#define ckWARN4_d(w1,w2,w3,w4)	Perl_ckwarn_d(aTHX_ packWARN4(w1,w2,w3,w4))
+
+#define packWARN(a)		(a                                      )
+#define packWARN2(a,b)		((a) | ((b)<<8)                         )
+#define packWARN3(a,b,c)	((a) | ((b)<<8) | ((c)<<16)             )
+#define packWARN4(a,b,c,d)	((a) | ((b)<<8) | ((c)<<16) | ((d) <<24))
+
+#define unpackWARN1(x)		((x)        & 0xFF)
+#define unpackWARN2(x)		(((x) >>8)  & 0xFF)
+#define unpackWARN3(x)		(((x) >>16) & 0xFF)
+#define unpackWARN4(x)		(((x) >>24) & 0xFF)
+
+#define ckDEAD(x)							\
+	   ( ! specialWARN(PL_curcop->cop_warnings) &&			\
+	    ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) || 		\
+	      isWARNf_on(PL_curcop->cop_warnings, unpackWARN1(x)) ||	\
+	      isWARNf_on(PL_curcop->cop_warnings, unpackWARN2(x)) ||	\
+	      isWARNf_on(PL_curcop->cop_warnings, unpackWARN3(x)) ||	\
+	      isWARNf_on(PL_curcop->cop_warnings, unpackWARN4(x))))
+
+/* end of file warnings.h */
+/* ex: set ro: */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/win32.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/win32.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/win32.h	(revision 14489)
@@ -0,0 +1,577 @@
+/* WIN32.H
+ *
+ * (c) 1995 Microsoft Corporation. All rights reserved.
+ * 		Developed by hip communications inc., http://info.hip.com/info/
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ */
+#ifndef  _INC_WIN32_PERL5
+#define  _INC_WIN32_PERL5
+
+#ifndef _WIN32_WINNT
+#  define _WIN32_WINNT 0x0400     /* needed for TryEnterCriticalSection() etc. */
+#endif
+
+#if defined(PERL_IMPLICIT_SYS)
+#  define DYNAMIC_ENV_FETCH
+#  define HAS_GETENV_LEN
+#  define prime_env_iter()
+#  define WIN32IO_IS_STDIO		/* don't pull in custom stdio layer */
+#  define WIN32SCK_IS_STDSCK		/* don't pull in custom wsock layer */
+#  ifdef PERL_GLOBAL_STRUCT
+#    error PERL_GLOBAL_STRUCT cannot be defined with PERL_IMPLICIT_SYS
+#  endif
+#  define win32_get_privlib PerlEnv_lib_path
+#  define win32_get_sitelib PerlEnv_sitelib_path
+#  define win32_get_vendorlib PerlEnv_vendorlib_path
+#endif
+
+#ifdef __GNUC__
+#  ifndef __int64		/* some versions seem to #define it already */
+#    define __int64 long long
+#  endif
+#  define Win32_Winsock
+#ifdef __cplusplus
+/* Mingw32 gcc -xc++ objects to __attribute((unused)) at least */
+#undef  PERL_UNUSED_DECL
+#define PERL_UNUSED_DECL
+#endif
+#endif
+
+
+/* Define DllExport akin to perl's EXT,
+ * If we are in the DLL or mimicing the DLL for Win95 work round
+ * then Export the symbol,
+ * otherwise import it.
+ */
+
+/* now even GCC supports __declspec() */
+
+#if defined(PERLDLL) || defined(WIN95FIX)
+#define DllExport
+/*#define DllExport __declspec(dllexport)*/	/* noises with VC5+sp3 */
+#else
+#define DllExport __declspec(dllimport)
+#endif
+
+#define  WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#ifdef   WIN32_LEAN_AND_MEAN		/* C file is NOT a Perl5 original. */
+#define  CONTEXT	PERL_CONTEXT	/* Avoid conflict of CONTEXT defs. */
+#endif /*WIN32_LEAN_AND_MEAN */
+
+#ifndef TLS_OUT_OF_INDEXES
+#define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
+#endif
+
+#include <dirent.h>
+#include <io.h>
+#include <process.h>
+#include <stdio.h>
+#include <direct.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <fcntl.h>
+#ifndef EXT
+#include "EXTERN.h"
+#endif
+
+struct tms {
+	long	tms_utime;
+	long	tms_stime;
+	long	tms_cutime;
+	long	tms_cstime;
+};
+
+#ifndef SYS_NMLN
+#define SYS_NMLN	257
+#endif
+
+struct utsname {
+    char sysname[SYS_NMLN];
+    char nodename[SYS_NMLN];
+    char release[SYS_NMLN];
+    char version[SYS_NMLN];
+    char machine[SYS_NMLN];
+};
+
+#ifndef START_EXTERN_C
+#undef EXTERN_C
+#ifdef __cplusplus
+#  define START_EXTERN_C extern "C" {
+#  define END_EXTERN_C }
+#  define EXTERN_C extern "C"
+#else
+#  define START_EXTERN_C
+#  define END_EXTERN_C
+#  define EXTERN_C
+#endif
+#endif
+
+#define  STANDARD_C	1
+#define  DOSISH		1		/* no escaping our roots */
+#define  OP_BINARY	O_BINARY	/* mistake in in pp_sys.c? */
+
+/* Define USE_SOCKETS_AS_HANDLES to enable emulation of windows sockets as
+ * real filehandles. XXX Should always be defined (the other version is untested) */
+#define USE_SOCKETS_AS_HANDLES
+
+/* read() and write() aren't transparent for socket handles */
+#define PERL_SOCK_SYSREAD_IS_RECV
+#define PERL_SOCK_SYSWRITE_IS_SEND
+
+#define PERL_NO_FORCE_LINK		/* no need for PL_force_link_funcs */
+
+/* Define USE_FIXED_OSFHANDLE to fix MSVCRT's _open_osfhandle() on W95.
+   It now uses some black magic to work seamlessly with the DLL CRT and
+   works with MSVC++ 4.0+ or GCC/Mingw32
+	-- BKS 1-24-2000 */
+#if (defined(_M_IX86) && _MSC_VER >= 1000) || defined(__MINGW32__)
+#define USE_FIXED_OSFHANDLE
+#endif
+
+/* Define PERL_WIN32_SOCK_DLOAD to have Perl dynamically load the winsock
+   DLL when needed. Don't use if your compiler supports delayloading (ie, VC++ 6.0)
+	-- BKS 5-29-2000 */
+#if !(defined(_M_IX86) && _MSC_VER >= 1200)
+#define PERL_WIN32_SOCK_DLOAD
+#endif
+#define ENV_IS_CASELESS
+
+#define PIPESOCK_MODE	"b"		/* pipes, sockets default to binmode */
+
+#ifndef VER_PLATFORM_WIN32_WINDOWS	/* VC-2.0 headers don't have this */
+#define VER_PLATFORM_WIN32_WINDOWS	1
+#endif
+
+#ifndef FILE_SHARE_DELETE		/* VC-4.0 headers don't have this */
+#define FILE_SHARE_DELETE		0x00000004
+#endif
+
+/* access() mode bits */
+#ifndef R_OK
+#  define	R_OK	4
+#  define	W_OK	2
+#  define	X_OK	1
+#  define	F_OK	0
+#endif
+
+/* for waitpid() */
+#ifndef WNOHANG
+#  define WNOHANG	1
+#endif
+
+#define PERL_GET_CONTEXT_DEFINED
+
+/* Compiler-specific stuff. */
+
+#ifdef __BORLANDC__		/* Borland C++ */
+
+#if (__BORLANDC__ <= 0x520)
+#define _access access
+#define _chdir chdir
+#endif
+
+#define _getpid getpid
+#define wcsicmp _wcsicmp
+#include <sys/types.h>
+
+#ifndef DllMain
+#define DllMain DllEntryPoint
+#endif
+
+#pragma warn -ccc	/* "condition is always true/false" */
+#pragma warn -rch	/* "unreachable code" */
+#pragma warn -sig	/* "conversion may lose significant digits" */
+#pragma warn -pia	/* "possibly incorrect assignment" */
+#pragma warn -par	/* "parameter 'foo' is never used" */
+#pragma warn -aus	/* "'foo' is assigned a value that is never used" */
+#pragma warn -use	/* "'foo' is declared but never used" */
+#pragma warn -csu	/* "comparing signed and unsigned values" */
+
+/* Borland C thinks that a pointer to a member variable is 12 bytes in size. */
+#define PERL_MEMBER_PTR_SIZE	12
+
+#define isnan		_isnan
+
+#endif
+
+#ifdef _MSC_VER			/* Microsoft Visual C++ */
+
+typedef long		uid_t;
+typedef long		gid_t;
+typedef unsigned short	mode_t;
+#pragma  warning(disable: 4102)	/* "unreferenced label" */
+
+/* Visual C thinks that a pointer to a member variable is 16 bytes in size. */
+#define PERL_MEMBER_PTR_SIZE	16
+
+#define isnan		_isnan
+
+#endif /* _MSC_VER */
+
+#ifdef __MINGW32__		/* Minimal Gnu-Win32 */
+
+typedef long		uid_t;
+typedef long		gid_t;
+#ifndef _environ
+#define _environ	environ
+#endif
+#define flushall	_flushall
+#define fcloseall	_fcloseall
+#define isnan		_isnan	/* ...same libraries as MSVC */
+
+#ifndef _O_NOINHERIT
+#  define _O_NOINHERIT	0x0080
+#  ifndef _NO_OLDNAMES
+#    define O_NOINHERIT	_O_NOINHERIT
+#  endif
+#endif
+
+/* <stdint.h>, pulled in by <io.h> as of mingw-runtime-3.3, typedef's
+ * (u)intptr_t but doesn't set the _(U)INTPTR_T_DEFINED defines */
+#ifdef _STDINT_H
+#  ifndef _INTPTR_T_DEFINED
+#    define _INTPTR_T_DEFINED
+#  endif
+#  ifndef _UINTPTR_T_DEFINED
+#    define _UINTPTR_T_DEFINED
+#  endif
+#endif
+
+#endif /* __MINGW32__ */
+
+/* both GCC/Mingw32 and MSVC++ 4.0 are missing this, so we put it here */
+#ifndef CP_UTF8
+#  define CP_UTF8	65001
+#endif
+
+/* compatibility stuff for other compilers goes here */
+
+#ifndef _INTPTR_T_DEFINED
+typedef int		intptr_t;
+#  define _INTPTR_T_DEFINED
+#endif
+
+#ifndef _UINTPTR_T_DEFINED
+typedef unsigned int	uintptr_t;
+#  define _UINTPTR_T_DEFINED
+#endif
+
+START_EXTERN_C
+
+/* For UNIX compatibility. */
+
+extern  uid_t	getuid(void);
+extern  gid_t	getgid(void);
+extern  uid_t	geteuid(void);
+extern  gid_t	getegid(void);
+extern  int	setuid(uid_t uid);
+extern  int	setgid(gid_t gid);
+extern  int	kill(int pid, int sig);
+#ifndef USE_PERL_SBRK
+extern  void	*sbrk(ptrdiff_t need);
+#  define HAS_SBRK_PROTO
+#endif
+extern	char *	getlogin(void);
+extern	int	chown(const char *p, uid_t o, gid_t g);
+extern  int	mkstemp(const char *path);
+
+#undef	 Stat
+#define  Stat		win32_stat
+
+#undef   init_os_extras
+#define  init_os_extras Perl_init_os_extras
+
+DllExport void		Perl_win32_init(int *argcp, char ***argvp);
+DllExport void		Perl_win32_term(void);
+DllExport void		Perl_init_os_extras(void);
+DllExport void		win32_str_os_error(void *sv, DWORD err);
+DllExport int		RunPerl(int argc, char **argv, char **env);
+
+typedef struct {
+    HANDLE	childStdIn;
+    HANDLE	childStdOut;
+    HANDLE	childStdErr;
+    /*
+     * the following correspond to the fields of the same name
+     * in the STARTUPINFO structure. Embedders can use these to
+     * control the spawning process' look.
+     * Example - to hide the window of the spawned process:
+     *    dwFlags = STARTF_USESHOWWINDOW;
+     *	  wShowWindow = SW_HIDE;
+     */
+    DWORD	dwFlags;
+    DWORD	dwX;
+    DWORD	dwY;
+    DWORD	dwXSize;
+    DWORD	dwYSize;
+    DWORD	dwXCountChars;
+    DWORD	dwYCountChars;
+    DWORD	dwFillAttribute;
+    WORD	wShowWindow;
+} child_IO_table;
+
+DllExport void		win32_get_child_IO(child_IO_table* ptr);
+
+#ifndef USE_SOCKETS_AS_HANDLES
+extern FILE *		my_fdopen(int, char *);
+#endif
+extern int		my_fclose(FILE *);
+extern int		my_fstat(int fd, Stat_t *sbufptr);
+extern char *		win32_get_privlib(const char *pl);
+extern char *		win32_get_sitelib(const char *pl);
+extern char *		win32_get_vendorlib(const char *pl);
+extern int		IsWin95(void);
+extern int		IsWinNT(void);
+extern void		win32_argv2utf8(int argc, char** argv);
+
+#ifdef PERL_IMPLICIT_SYS
+extern void		win32_delete_internal_host(void *h);
+#endif
+
+extern char *		staticlinkmodules[];
+
+END_EXTERN_C
+
+typedef  char *		caddr_t;	/* In malloc.c (core address). */
+
+/*
+ * handle socket stuff, assuming socket is always available
+ */
+#include <sys/socket.h>
+#include <netdb.h>
+
+#ifdef MYMALLOC
+#define EMBEDMYMALLOC	/**/
+/* #define USE_PERL_SBRK	/**/
+/* #define PERL_SBRK_VIA_MALLOC	/**/
+#endif
+
+#if defined(PERLDLL) && !defined(PERL_CORE)
+#define PERL_CORE
+#endif
+
+#ifdef PERL_TEXTMODE_SCRIPTS
+#  define PERL_SCRIPT_MODE		"r"
+#else
+#  define PERL_SCRIPT_MODE		"rb"
+#endif
+
+/*
+ * Now Win32 specific per-thread data stuff
+ */
+
+struct thread_intern {
+    /* XXX can probably use one buffer instead of several */
+    char		Wstrerror_buffer[512];
+    struct servent	Wservent;
+    char		Wgetlogin_buffer[128];
+#    ifdef USE_SOCKETS_AS_HANDLES
+    int			Winit_socktype;
+#    endif
+#    ifdef HAVE_DES_FCRYPT
+    char		Wcrypt_buffer[30];
+#    endif
+#    ifdef USE_RTL_THREAD_API
+    void *		retv;	/* slot for thread return value */
+#    endif
+    BOOL               Wuse_showwindow;
+    WORD               Wshowwindow;
+};
+
+#ifdef USE_5005THREADS
+#  ifndef USE_DECLSPEC_THREAD
+#    define HAVE_THREAD_INTERN
+#  endif /* !USE_DECLSPEC_THREAD */
+#endif /* USE_5005THREADS */
+
+#define HAVE_INTERP_INTERN
+typedef struct {
+    long	num;
+    DWORD	pids[MAXIMUM_WAIT_OBJECTS];
+    HANDLE	handles[MAXIMUM_WAIT_OBJECTS];
+} child_tab;
+
+#ifndef Sighandler_t
+typedef Signal_t (*Sighandler_t) (int);
+#define Sighandler_t	Sighandler_t
+#endif
+
+struct interp_intern {
+    char *	perlshell_tokens;
+    char **	perlshell_vec;
+    long	perlshell_items;
+    struct av *	fdpid;
+    child_tab *	children;
+#ifdef USE_ITHREADS
+    DWORD	pseudo_id;
+    child_tab *	pseudo_children;
+#endif
+    void *	internal_host;
+#ifndef USE_5005THREADS
+    struct thread_intern	thr_intern;
+#endif
+    UINT	timerid;
+    unsigned 	poll_count;
+    Sighandler_t sigtable[SIG_SIZE];
+};
+
+DllExport int win32_async_check(pTHX);
+
+#define WIN32_POLL_INTERVAL 32768
+#define PERL_ASYNC_CHECK() if (w32_do_async || PL_sig_pending) win32_async_check(aTHX)
+
+#define w32_perlshell_tokens	(PL_sys_intern.perlshell_tokens)
+#define w32_perlshell_vec	(PL_sys_intern.perlshell_vec)
+#define w32_perlshell_items	(PL_sys_intern.perlshell_items)
+#define w32_fdpid		(PL_sys_intern.fdpid)
+#define w32_children		(PL_sys_intern.children)
+#define w32_num_children	(w32_children->num)
+#define w32_child_pids		(w32_children->pids)
+#define w32_child_handles	(w32_children->handles)
+#define w32_pseudo_id		(PL_sys_intern.pseudo_id)
+#define w32_pseudo_children	(PL_sys_intern.pseudo_children)
+#define w32_num_pseudo_children		(w32_pseudo_children->num)
+#define w32_pseudo_child_pids		(w32_pseudo_children->pids)
+#define w32_pseudo_child_handles	(w32_pseudo_children->handles)
+#define w32_internal_host		(PL_sys_intern.internal_host)
+#define w32_timerid			(PL_sys_intern.timerid)
+#define w32_sighandler			(PL_sys_intern.sigtable)
+#define w32_poll_count			(PL_sys_intern.poll_count)
+#define w32_do_async			(w32_poll_count++ > WIN32_POLL_INTERVAL)
+#ifdef USE_5005THREADS
+#  define w32_strerror_buffer	(thr->i.Wstrerror_buffer)
+#  define w32_getlogin_buffer	(thr->i.Wgetlogin_buffer)
+#  define w32_crypt_buffer	(thr->i.Wcrypt_buffer)
+#  define w32_servent		(thr->i.Wservent)
+#  define w32_init_socktype	(thr->i.Winit_socktype)
+#  define w32_use_showwindow	(thr->i.Wuse_showwindow)
+#  define w32_showwindow	(thr->i.Wshowwindow)
+#else
+#  define w32_strerror_buffer	(PL_sys_intern.thr_intern.Wstrerror_buffer)
+#  define w32_getlogin_buffer	(PL_sys_intern.thr_intern.Wgetlogin_buffer)
+#  define w32_crypt_buffer	(PL_sys_intern.thr_intern.Wcrypt_buffer)
+#  define w32_servent		(PL_sys_intern.thr_intern.Wservent)
+#  define w32_init_socktype	(PL_sys_intern.thr_intern.Winit_socktype)
+#  define w32_use_showwindow	(PL_sys_intern.thr_intern.Wuse_showwindow)
+#  define w32_showwindow	(PL_sys_intern.thr_intern.Wshowwindow)
+#endif /* USE_5005THREADS */
+
+/* UNICODE<>ANSI translation helpers */
+/* Use CP_ACP when mode is ANSI */
+/* Use CP_UTF8 when mode is UTF8 */
+
+#define A2WHELPER_LEN(lpa, alen, lpw, nBytes)\
+    (lpw[0] = 0, MultiByteToWideChar((IN_BYTES) ? CP_ACP : CP_UTF8, 0, \
+				    lpa, alen, lpw, (nBytes/sizeof(WCHAR))))
+#define A2WHELPER(lpa, lpw, nBytes)	A2WHELPER_LEN(lpa, -1, lpw, nBytes)
+
+#define W2AHELPER_LEN(lpw, wlen, lpa, nChars)\
+    (lpa[0] = '\0', WideCharToMultiByte((IN_BYTES) ? CP_ACP : CP_UTF8, 0, \
+				       lpw, wlen, (LPSTR)lpa, nChars,NULL,NULL))
+#define W2AHELPER(lpw, lpa, nChars)	W2AHELPER_LEN(lpw, -1, lpa, nChars)
+
+#define USING_WIDE() (0)
+
+#ifdef USE_ITHREADS
+#  define PERL_WAIT_FOR_CHILDREN \
+    STMT_START {							\
+	if (w32_pseudo_children && w32_num_pseudo_children) {		\
+	    long children = w32_num_pseudo_children;			\
+	    WaitForMultipleObjects(children,				\
+				   w32_pseudo_child_handles,		\
+				   TRUE, INFINITE);			\
+	    while (children)						\
+		CloseHandle(w32_pseudo_child_handles[--children]);	\
+	}								\
+    } STMT_END
+#endif
+
+#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
+#ifdef PERL_CORE
+
+/* C doesn't like repeat struct definitions */
+#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3)
+#undef _CRTIMP
+#endif
+#ifndef _CRTIMP
+#define _CRTIMP __declspec(dllimport)
+#endif
+
+/*
+ * Control structure for lowio file handles
+ */
+typedef struct {
+    intptr_t osfhnd;/* underlying OS file HANDLE */
+    char osfile;    /* attributes of file (e.g., open in text mode?) */
+    char pipech;    /* one char buffer for handles opened on pipes */
+    int lockinitflag;
+    CRITICAL_SECTION lock;
+} ioinfo;
+
+
+/*
+ * Array of arrays of control structures for lowio files.
+ */
+EXTERN_C _CRTIMP ioinfo* __pioinfo[];
+
+/*
+ * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
+ * array of ioinfo structs.
+ */
+#define IOINFO_L2E	    5
+
+/*
+ * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
+ */
+#define IOINFO_ARRAY_ELTS   (1 << IOINFO_L2E)
+
+/*
+ * Access macros for getting at an ioinfo struct and its fields from a
+ * file handle
+ */
+#define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
+#define _osfhnd(i)  (_pioinfo(i)->osfhnd)
+#define _osfile(i)  (_pioinfo(i)->osfile)
+#define _pipech(i)  (_pioinfo(i)->pipech)
+
+/* since we are not doing a dup2(), this works fine */
+#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (intptr_t)osfh)
+#endif
+#endif
+
+/* IO.xs and POSIX.xs define PERLIO_NOT_STDIO to 1 */
+#if defined(PERL_EXT_IO) || defined(PERL_EXT_POSIX)
+#undef  PERLIO_NOT_STDIO
+#endif
+#define PERLIO_NOT_STDIO 0
+
+#include "perlio.h"
+
+/*
+ * This provides a layer of functions and macros to ensure extensions will
+ * get to use the same RTL functions as the core.
+ */
+#include "win32iop.h"
+
+#define EXEC_ARGV_CAST(x) ((const char *const *) x)
+
+#if !defined(ECONNABORTED) && defined(WSAECONNABORTED)
+#define ECONNABORTED WSAECONNABORTED
+#endif
+#if !defined(ECONNRESET) && defined(WSAECONNRESET)
+#define ECONNRESET WSAECONNRESET
+#endif
+#if !defined(EAFNOSUPPORT) && defined(WSAEAFNOSUPPORT)
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+#endif
+/* Why not needed for ECONNREFUSED? --abe */
+
+DllExport void *win32_signal_context(void);
+#define PERL_GET_SIG_CONTEXT win32_signal_context()
+
+#endif /* _INC_WIN32_PERL5 */
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/win32iop.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/win32iop.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/win32iop.h	(revision 14489)
@@ -0,0 +1,338 @@
+#ifndef WIN32IOP_H
+#define WIN32IOP_H
+
+#ifndef START_EXTERN_C
+#ifdef __cplusplus
+#  define START_EXTERN_C extern "C" {
+#  define END_EXTERN_C }
+#  define EXTERN_C extern "C"
+#else
+#  define START_EXTERN_C
+#  define END_EXTERN_C
+#  define EXTERN_C
+#endif
+#endif
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+#  include <sys/utime.h>
+#else
+#  include <utime.h>
+#endif
+
+/*
+ * defines for flock emulation
+ */
+#define LOCK_SH 1
+#define LOCK_EX 2
+#define LOCK_NB 4
+#define LOCK_UN 8
+
+/*
+ * Make this as close to original stdio as possible.
+ */
+
+/*
+ * function prototypes for our own win32io layer
+ */
+START_EXTERN_C
+
+DllExport  int * 	win32_errno(void);
+DllExport  char *** 	win32_environ(void);
+DllExport  FILE*	win32_stdin(void);
+DllExport  FILE*	win32_stdout(void);
+DllExport  FILE*	win32_stderr(void);
+DllExport  int		win32_ferror(FILE *fp);
+DllExport  int		win32_feof(FILE *fp);
+DllExport  char*	win32_strerror(int e);
+
+DllExport  int		win32_fprintf(FILE *pf, const char *format, ...);
+DllExport  int		win32_printf(const char *format, ...);
+DllExport  int		win32_vfprintf(FILE *pf, const char *format, va_list arg);
+DllExport  int		win32_vprintf(const char *format, va_list arg);
+DllExport  size_t	win32_fread(void *buf, size_t size, size_t count, FILE *pf);
+DllExport  size_t	win32_fwrite(const void *buf, size_t size, size_t count, FILE *pf);
+DllExport  FILE*	win32_fopen(const char *path, const char *mode);
+DllExport  FILE*	win32_fdopen(int fh, const char *mode);
+DllExport  FILE*	win32_freopen(const char *path, const char *mode, FILE *pf);
+DllExport  int		win32_fclose(FILE *pf);
+DllExport  int		win32_fputs(const char *s,FILE *pf);
+DllExport  int		win32_fputc(int c,FILE *pf);
+DllExport  int		win32_ungetc(int c,FILE *pf);
+DllExport  int		win32_getc(FILE *pf);
+DllExport  int		win32_fileno(FILE *pf);
+DllExport  void		win32_clearerr(FILE *pf);
+DllExport  int		win32_fflush(FILE *pf);
+DllExport  Off_t	win32_ftell(FILE *pf);
+DllExport  int		win32_fseek(FILE *pf,Off_t offset,int origin);
+DllExport  int		win32_fgetpos(FILE *pf,fpos_t *p);
+DllExport  int		win32_fsetpos(FILE *pf,const fpos_t *p);
+DllExport  void		win32_rewind(FILE *pf);
+DllExport  int		win32_tmpfd(void);
+DllExport  FILE*	win32_tmpfile(void);
+DllExport  void		win32_abort(void);
+DllExport  int  	win32_fstat(int fd,Stat_t *sbufptr);
+DllExport  int  	win32_stat(const char *name,Stat_t *sbufptr);
+DllExport  int		win32_pipe( int *phandles, unsigned int psize, int textmode );
+DllExport  PerlIO*	win32_popen( const char *command, const char *mode );
+DllExport  PerlIO*	win32_popenlist(const char *mode, IV narg, SV **args);
+DllExport  int		win32_pclose( PerlIO *pf);
+DllExport  int		win32_rename( const char *oname, const char *newname);
+DllExport  int		win32_setmode( int fd, int mode);
+DllExport  int		win32_chsize(int fd, Off_t size);
+DllExport  Off_t	win32_lseek( int fd, Off_t offset, int origin);
+DllExport  Off_t	win32_tell( int fd);
+DllExport  int		win32_dup( int fd);
+DllExport  int		win32_dup2(int h1, int h2);
+DllExport  int		win32_open(const char *path, int oflag,...);
+DllExport  int		win32_close(int fd);
+DllExport  int		win32_eof(int fd);
+DllExport  int		win32_read(int fd, void *buf, unsigned int cnt);
+DllExport  int		win32_write(int fd, const void *buf, unsigned int cnt);
+DllExport  int		win32_spawnvp(int mode, const char *cmdname,
+			      const char *const *argv);
+DllExport  int		win32_mkdir(const char *dir, int mode);
+DllExport  int		win32_rmdir(const char *dir);
+DllExport  int		win32_chdir(const char *dir);
+DllExport  int		win32_flock(int fd, int oper);
+DllExport  int		win32_execv(const char *cmdname, const char *const *argv);
+DllExport  int		win32_execvp(const char *cmdname, const char *const *argv);
+DllExport  void		win32_perror(const char *str);
+DllExport  void		win32_setbuf(FILE *pf, char *buf);
+DllExport  int		win32_setvbuf(FILE *pf, char *buf, int type, size_t size);
+DllExport  int		win32_flushall(void);
+DllExport  int		win32_fcloseall(void);
+DllExport  char*	win32_fgets(char *s, int n, FILE *pf);
+DllExport  char*	win32_gets(char *s);
+DllExport  int		win32_fgetc(FILE *pf);
+DllExport  int		win32_putc(int c, FILE *pf);
+DllExport  int		win32_puts(const char *s);
+DllExport  int		win32_getchar(void);
+DllExport  int		win32_putchar(int c);
+DllExport  void*	win32_malloc(size_t size);
+DllExport  void*	win32_calloc(size_t numitems, size_t size);
+DllExport  void*	win32_realloc(void *block, size_t size);
+DllExport  void		win32_free(void *block);
+
+DllExport  int		win32_open_osfhandle(intptr_t handle, int flags);
+DllExport  intptr_t	win32_get_osfhandle(int fd);
+DllExport  FILE*	win32_fdupopen(FILE *pf);
+
+DllExport  DIR*		win32_opendir(char *filename);
+DllExport  struct direct*	win32_readdir(DIR *dirp);
+DllExport  long		win32_telldir(DIR *dirp);
+DllExport  void		win32_seekdir(DIR *dirp, long loc);
+DllExport  void		win32_rewinddir(DIR *dirp);
+DllExport  int		win32_closedir(DIR *dirp);
+
+DllExport  char*	win32_getenv(const char *name);
+DllExport  int		win32_putenv(const char *name);
+
+DllExport  unsigned 	win32_sleep(unsigned int);
+DllExport  int		win32_times(struct tms *timebuf);
+DllExport  unsigned 	win32_alarm(unsigned int sec);
+DllExport  int		win32_stat(const char *path, Stat_t *buf);
+DllExport  char*	win32_longpath(char *path);
+DllExport  int		win32_ioctl(int i, unsigned int u, char *data);
+DllExport  int          win32_link(const char *oldname, const char *newname);
+DllExport  int		win32_unlink(const char *f);
+DllExport  int		win32_utime(const char *f, struct utimbuf *t);
+DllExport  int		win32_gettimeofday(struct timeval *tp, void *not_used);
+DllExport  int		win32_uname(struct utsname *n);
+DllExport  int		win32_wait(int *status);
+DllExport  int		win32_waitpid(int pid, int *status, int flags);
+DllExport  int		win32_kill(int pid, int sig);
+DllExport  unsigned long	win32_os_id(void);
+DllExport  void*	win32_dynaload(const char*filename);
+DllExport  int		win32_access(const char *path, int mode);
+DllExport  int		win32_chmod(const char *path, int mode);
+DllExport  int		win32_getpid(void);
+
+DllExport char *	win32_crypt(const char *txt, const char *salt);
+
+DllExport void *	win32_get_childenv(void);
+DllExport void		win32_free_childenv(void* d);
+DllExport void		win32_clearenv(void);
+DllExport char *	win32_get_childdir(void);
+DllExport void		win32_free_childdir(char* d);
+DllExport Sighandler_t	win32_signal(int sig, Sighandler_t subcode);
+
+
+END_EXTERN_C
+
+#undef alarm
+#define alarm			win32_alarm
+
+/*
+ * the following six(6) is #define in stdio.h
+ */
+#ifndef WIN32IO_IS_STDIO
+#undef errno
+#undef environ
+#undef stderr
+#undef stdin
+#undef stdout
+#undef ferror
+#undef feof
+#undef fclose
+#undef pipe
+#undef pause
+#undef sleep
+#undef times
+#undef ioctl
+#undef unlink
+#undef utime
+#undef gettimeofday
+#undef uname
+#undef wait
+
+#ifdef __BORLANDC__
+#undef ungetc
+#undef getc
+#undef putc
+#undef getchar
+#undef putchar
+#endif
+
+#if defined(__MINGW32__) || defined(__BORLANDC__)
+#undef fileno
+#endif
+
+#define stderr				win32_stderr()
+#define stdout				win32_stdout()
+#define	stdin				win32_stdin()
+#define feof(f)				win32_feof(f)
+#define ferror(f)			win32_ferror(f)
+#define errno 				(*win32_errno())
+#define environ				(*win32_environ())
+#define strerror			win32_strerror
+
+/*
+ * redirect to our own version
+ */
+#undef fprintf
+#define	fprintf			win32_fprintf
+#define	vfprintf		win32_vfprintf
+#define	printf			win32_printf
+#define	vprintf			win32_vprintf
+#define fread(buf,size,count,f)	win32_fread(buf,size,count,f)
+#define fwrite(buf,size,count,f)	win32_fwrite(buf,size,count,f)
+#define fopen			win32_fopen
+#undef fdopen
+#define fdopen			win32_fdopen
+#define freopen			win32_freopen
+#define	fclose(f)		win32_fclose(f)
+#define fputs(s,f)		win32_fputs(s,f)
+#define fputc(c,f)		win32_fputc(c,f)
+#define ungetc(c,f)		win32_ungetc(c,f)
+#undef getc
+#define getc(f)			win32_getc(f)
+#define fileno(f)		win32_fileno(f)
+#define clearerr(f)		win32_clearerr(f)
+#define fflush(f)		win32_fflush(f)
+#define ftell(f)		win32_ftell(f)
+#define fseek(f,o,w)		win32_fseek(f,o,w)
+#define fgetpos(f,p)		win32_fgetpos(f,p)
+#define fsetpos(f,p)		win32_fsetpos(f,p)
+#define rewind(f)		win32_rewind(f)
+#define tmpfile()		win32_tmpfile()
+#define abort()			win32_abort()
+#define fstat(fd,bufptr)   	win32_fstat(fd,bufptr)
+#define stat(pth,bufptr)   	win32_stat(pth,bufptr)
+#define longpath(pth)   	win32_longpath(pth)
+#define rename(old,new)		win32_rename(old,new)
+#define setmode(fd,mode)	win32_setmode(fd,mode)
+#define chsize(fd,sz)		win32_chsize(fd,sz)
+#define lseek(fd,offset,orig)	win32_lseek(fd,offset,orig)
+#define tell(fd)		win32_tell(fd)
+#define dup(fd)			win32_dup(fd)
+#define dup2(fd1,fd2)		win32_dup2(fd1,fd2)
+#define open			win32_open
+#define close(fd)		win32_close(fd)
+#define eof(fd)			win32_eof(fd)
+#define read(fd,b,s)		win32_read(fd,b,s)
+#define write(fd,b,s)		win32_write(fd,b,s)
+#define _open_osfhandle		win32_open_osfhandle
+#define _get_osfhandle		win32_get_osfhandle
+#define spawnvp			win32_spawnvp
+#define mkdir			win32_mkdir
+#define rmdir			win32_rmdir
+#define chdir			win32_chdir
+#define flock(fd,o)		win32_flock(fd,o)
+#define execv			win32_execv
+#define execvp			win32_execvp
+#define perror			win32_perror
+#define setbuf			win32_setbuf
+#define setvbuf			win32_setvbuf
+#undef flushall
+#define flushall		win32_flushall
+#undef fcloseall
+#define fcloseall		win32_fcloseall
+#define fgets			win32_fgets
+#define gets			win32_gets
+#define fgetc			win32_fgetc
+#undef putc
+#define putc			win32_putc
+#define puts			win32_puts
+#undef getchar
+#define getchar			win32_getchar
+#undef putchar
+#define putchar			win32_putchar
+#define access(p,m)		win32_access(p,m)
+#define chmod(p,m)		win32_chmod(p,m)
+
+
+#if !defined(MYMALLOC) || !defined(PERL_CORE)
+#undef malloc
+#undef calloc
+#undef realloc
+#undef free
+#define malloc			win32_malloc
+#define calloc			win32_calloc
+#define realloc			win32_realloc
+#define free			win32_free
+#endif
+
+#define pipe(fd)		win32_pipe((fd), 512, O_BINARY)
+#define pause()			win32_sleep((32767L << 16) + 32767)
+#define sleep			win32_sleep
+#define times			win32_times
+#define ioctl			win32_ioctl
+#define link			win32_link
+#define unlink			win32_unlink
+#define utime			win32_utime
+#define gettimeofday		win32_gettimeofday
+#define uname			win32_uname
+#define wait			win32_wait
+#define waitpid			win32_waitpid
+#define kill			win32_kill
+
+#define opendir			win32_opendir
+#define readdir			win32_readdir
+#define telldir			win32_telldir
+#define seekdir			win32_seekdir
+#define rewinddir		win32_rewinddir
+#define closedir		win32_closedir
+#define os_id			win32_os_id
+#define getpid			win32_getpid
+
+#undef crypt
+#define crypt(t,s)		win32_crypt(t,s)
+
+#undef get_childenv
+#undef free_childenv
+#undef clearenv
+#undef get_childdir
+#undef free_childdir
+#define get_childenv()		win32_get_childenv()
+#define free_childenv(d)	win32_free_childenv(d)
+#define clearenv()		win32_clearenv()
+#define get_childdir()		win32_get_childdir()
+#define free_childdir(d)	win32_free_childdir(d)
+
+#undef getenv
+#define getenv win32_getenv
+#undef putenv
+#define putenv win32_putenv
+
+#endif /* WIN32IO_IS_STDIO */
+#endif /* WIN32IOP_H */
Index: /for-distributions/trunk/bin/windows/perl/lib/CORE/win32thread.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CORE/win32thread.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CORE/win32thread.h	(revision 14489)
@@ -0,0 +1,207 @@
+#ifndef _WIN32THREAD_H
+#define _WIN32THREAD_H
+
+#include "win32.h"
+
+typedef struct win32_cond { LONG waiters; HANDLE sem; } perl_cond;
+typedef DWORD perl_key;
+typedef HANDLE perl_os_thread;
+
+#ifndef DONT_USE_CRITICAL_SECTION
+
+/* Critical Sections used instead of mutexes: lightweight,
+ * but can't be communicated to child processes, and can't get
+ * HANDLE to it for use elsewhere.
+ */
+typedef CRITICAL_SECTION perl_mutex;
+#define MUTEX_INIT(m) InitializeCriticalSection(m)
+#define MUTEX_LOCK(m) EnterCriticalSection(m)
+#define MUTEX_UNLOCK(m) LeaveCriticalSection(m)
+#define MUTEX_DESTROY(m) DeleteCriticalSection(m)
+
+#else
+
+typedef HANDLE perl_mutex;
+#  define MUTEX_INIT(m) \
+    STMT_START {						\
+	if ((*(m) = CreateMutex(NULL,FALSE,NULL)) == NULL)	\
+	    Perl_croak_nocontext("panic: MUTEX_INIT");		\
+    } STMT_END
+
+#  define MUTEX_LOCK(m) \
+    STMT_START {						\
+	if (WaitForSingleObject(*(m),INFINITE) == WAIT_FAILED)	\
+	    Perl_croak_nocontext("panic: MUTEX_LOCK");		\
+    } STMT_END
+
+#  define MUTEX_UNLOCK(m) \
+    STMT_START {						\
+	if (ReleaseMutex(*(m)) == 0)				\
+	    Perl_croak_nocontext("panic: MUTEX_UNLOCK");	\
+    } STMT_END
+
+#  define MUTEX_DESTROY(m) \
+    STMT_START {						\
+	if (CloseHandle(*(m)) == 0)				\
+	    Perl_croak_nocontext("panic: MUTEX_DESTROY");	\
+    } STMT_END
+
+#endif
+
+/* These macros assume that the mutex associated with the condition
+ * will always be held before COND_{SIGNAL,BROADCAST,WAIT,DESTROY},
+ * so there's no separate mutex protecting access to (c)->waiters
+ */
+#define COND_INIT(c) \
+    STMT_START {						\
+	(c)->waiters = 0;					\
+	(c)->sem = CreateSemaphore(NULL,0,LONG_MAX,NULL);	\
+	if ((c)->sem == NULL)					\
+	    Perl_croak_nocontext("panic: COND_INIT (%ld)",GetLastError());	\
+    } STMT_END
+
+#define COND_SIGNAL(c) \
+    STMT_START {						\
+	if ((c)->waiters > 0 &&					\
+	    ReleaseSemaphore((c)->sem,1,NULL) == 0)		\
+	    Perl_croak_nocontext("panic: COND_SIGNAL (%ld)",GetLastError());	\
+    } STMT_END
+
+#define COND_BROADCAST(c) \
+    STMT_START {						\
+	if ((c)->waiters > 0 &&					\
+	    ReleaseSemaphore((c)->sem,(c)->waiters,NULL) == 0)	\
+	    Perl_croak_nocontext("panic: COND_BROADCAST (%ld)",GetLastError());\
+    } STMT_END
+
+#define COND_WAIT(c, m) \
+    STMT_START {						\
+	(c)->waiters++;						\
+	MUTEX_UNLOCK(m);					\
+	/* Note that there's no race here, since a		\
+	 * COND_BROADCAST() on another thread will have seen the\
+	 * right number of waiters (i.e. including this one) */	\
+	if (WaitForSingleObject((c)->sem,INFINITE)==WAIT_FAILED)\
+	    Perl_croak_nocontext("panic: COND_WAIT (%ld)",GetLastError());	\
+	/* XXX there may be an inconsequential race here */	\
+	MUTEX_LOCK(m);						\
+	(c)->waiters--;						\
+    } STMT_END
+
+#define COND_DESTROY(c) \
+    STMT_START {						\
+	(c)->waiters = 0;					\
+	if (CloseHandle((c)->sem) == 0)				\
+	    Perl_croak_nocontext("panic: COND_DESTROY (%ld)",GetLastError());	\
+    } STMT_END
+
+#define DETACH(t) \
+    STMT_START {						\
+	if (CloseHandle((t)->self) == 0) {			\
+	    MUTEX_UNLOCK(&(t)->mutex);				\
+	    Perl_croak_nocontext("panic: DETACH");		\
+	}							\
+    } STMT_END
+
+
+#define THREAD_CREATE(t, f)	Perl_thread_create(t, f)
+#define THREAD_POST_CREATE(t)	NOOP
+
+/* XXX Docs mention that the RTL versions of thread creation routines
+ * should be used, but that advice only seems applicable when the RTL
+ * is not in a DLL.  RTL DLLs in both Borland and VC seem to do all of
+ * the init/deinit required upon DLL_THREAD_ATTACH/DETACH.  So we seem
+ * to be completely safe using straight Win32 API calls, rather than
+ * the much braindamaged RTL calls.
+ *
+ * _beginthread() in the RTLs call CloseHandle() just after the thread
+ * function returns, which means: 1) we have a race on our hands
+ * 2) it is impossible to implement join() semantics.
+ *
+ * IOW, do *NOT* turn on USE_RTL_THREAD_API!  It is here
+ * for experimental purposes only. GSAR 98-01-02
+ */
+#ifdef USE_RTL_THREAD_API
+#  include <process.h>
+#  if defined(__BORLANDC__)
+     /* Borland RTL doesn't allow a return value from thread function! */
+#    define THREAD_RET_TYPE	void _USERENTRY
+#    define THREAD_RET_CAST(p)	((void)(thr->i.retv = (void *)(p)))
+#  elif defined (_MSC_VER)
+#    define THREAD_RET_TYPE	unsigned __stdcall
+#    define THREAD_RET_CAST(p)	((unsigned)(p))
+#  else
+     /* CRTDLL.DLL doesn't allow a return value from thread function! */
+#    define THREAD_RET_TYPE	void __cdecl
+#    define THREAD_RET_CAST(p)	((void)(thr->i.retv = (void *)(p)))
+#  endif
+#else	/* !USE_RTL_THREAD_API */
+#  define THREAD_RET_TYPE	DWORD WINAPI
+#  define THREAD_RET_CAST(p)	((DWORD)(p))
+#endif	/* !USE_RTL_THREAD_API */
+
+typedef THREAD_RET_TYPE thread_func_t(void *);
+
+
+START_EXTERN_C
+
+#if defined(PERLDLL) && defined(USE_DECLSPEC_THREAD) && (!defined(__BORLANDC__) || defined(_DLL))
+extern __declspec(thread) void *PL_current_context;
+#define PERL_SET_CONTEXT(t)   		(PL_current_context = t)
+#define PERL_GET_CONTEXT		PL_current_context
+#else
+#define PERL_GET_CONTEXT		Perl_get_context()
+#define PERL_SET_CONTEXT(t)		Perl_set_context(t)
+#endif
+
+#if defined(USE_5005THREADS)
+struct perl_thread;
+int Perl_thread_create (struct perl_thread *thr, thread_func_t *fn);
+void Perl_set_thread_self (struct perl_thread *thr);
+void Perl_init_thread_intern (struct perl_thread *t);
+
+#define SET_THREAD_SELF(thr) Perl_set_thread_self(thr)
+
+#endif /* USE_5005THREADS */
+
+END_EXTERN_C
+
+#define INIT_THREADS		NOOP
+#define ALLOC_THREAD_KEY \
+    STMT_START {							\
+	if ((PL_thr_key = TlsAlloc()) == TLS_OUT_OF_INDEXES) {		\
+	    PerlIO_printf(PerlIO_stderr(),"panic: TlsAlloc");				\
+	    exit(1);							\
+	}								\
+    } STMT_END
+
+#define FREE_THREAD_KEY \
+    STMT_START {							\
+	TlsFree(PL_thr_key);						\
+    } STMT_END
+
+#define PTHREAD_ATFORK(prepare,parent,child)	NOOP
+
+#if defined(USE_RTL_THREAD_API) && !defined(_MSC_VER)
+#define JOIN(t, avp)							\
+    STMT_START {							\
+	if ((WaitForSingleObject((t)->self,INFINITE) == WAIT_FAILED)	\
+	     || (GetExitCodeThread((t)->self,(LPDWORD)(avp)) == 0)	\
+	     || (CloseHandle((t)->self) == 0))				\
+	    Perl_croak_nocontext("panic: JOIN");			\
+	*avp = (AV *)((t)->i.retv);					\
+    } STMT_END
+#else	/* !USE_RTL_THREAD_API || _MSC_VER */
+#define JOIN(t, avp)							\
+    STMT_START {							\
+	if ((WaitForSingleObject((t)->self,INFINITE) == WAIT_FAILED)	\
+	     || (GetExitCodeThread((t)->self,(LPDWORD)(avp)) == 0)	\
+	     || (CloseHandle((t)->self) == 0))				\
+	    Perl_croak_nocontext("panic: JOIN");			\
+    } STMT_END
+#endif	/* !USE_RTL_THREAD_API || _MSC_VER */
+
+#define YIELD			Sleep(0)
+
+#endif /* _WIN32THREAD_H */
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CPAN.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CPAN.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CPAN.pm	(revision 14489)
@@ -0,0 +1,7168 @@
+# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
+package CPAN;
+$VERSION = '1.76_02';
+$VERSION = eval $VERSION;
+# $Id: CPAN.pm,v 1.412 2003/07/31 14:53:04 k Exp $
+
+# only used during development:
+$Revision = "";
+# $Revision = "[".substr(q$Revision: 1.412 $, 10)."]";
+
+use Carp ();
+use Config ();
+use Cwd ();
+use DirHandle;
+use Exporter ();
+use ExtUtils::MakeMaker (); # $SelfLoader::DEBUG=1;
+use File::Basename ();
+use File::Copy ();
+use File::Find;
+use File::Path ();
+use FileHandle ();
+use Safe ();
+use Text::ParseWords ();
+use Text::Wrap;
+use File::Spec;
+use Sys::Hostname;
+no lib "."; # we need to run chdir all over and we would get at wrong
+            # libraries there
+
+require Mac::BuildTools if $^O eq 'MacOS';
+
+END { $End++; &cleanup; }
+
+%CPAN::DEBUG = qw[
+		  CPAN              1
+		  Index             2
+		  InfoObj           4
+		  Author            8
+		  Distribution     16
+		  Bundle           32
+		  Module           64
+		  CacheMgr        128
+		  Complete        256
+		  FTP             512
+		  Shell          1024
+		  Eval           2048
+		  Config         4096
+		  Tarzip         8192
+		  Version       16384
+		  Queue         32768
+];
+
+$CPAN::DEBUG ||= 0;
+$CPAN::Signal ||= 0;
+$CPAN::Frontend ||= "CPAN::Shell";
+$CPAN::Defaultsite ||= "ftp://ftp.perl.org/pub/CPAN";
+
+package CPAN;
+use strict qw(vars);
+
+use vars qw($VERSION @EXPORT $AUTOLOAD $DEBUG $META $HAS_USABLE $term
+            $Revision $Signal $End $Suppress_readline $Frontend
+            $Defaultsite $Have_warned);
+
+@CPAN::ISA = qw(CPAN::Debug Exporter);
+
+@EXPORT = qw(
+	     autobundle bundle expand force get cvs_import
+	     install make readme recompile shell test clean
+	    );
+
+#-> sub CPAN::AUTOLOAD ;
+sub AUTOLOAD {
+    my($l) = $AUTOLOAD;
+    $l =~ s/.*:://;
+    my(%EXPORT);
+    @EXPORT{@EXPORT} = '';
+    CPAN::Config->load unless $CPAN::Config_loaded++;
+    if (exists $EXPORT{$l}){
+	CPAN::Shell->$l(@_);
+    } else {
+	$CPAN::Frontend->mywarn(qq{Unknown command "$AUTOLOAD". }.
+				qq{Type ? for help.
+});
+    }
+}
+
+#-> sub CPAN::shell ;
+sub shell {
+    my($self) = @_;
+    $Suppress_readline = ! -t STDIN unless defined $Suppress_readline;
+    CPAN::Config->load unless $CPAN::Config_loaded++;
+
+    my $oprompt = shift || "cpan> ";
+    my $prompt = $oprompt;
+    my $commandline = shift || "";
+
+    local($^W) = 1;
+    unless ($Suppress_readline) {
+	require Term::ReadLine;
+        if (! $term
+            or
+            $term->ReadLine eq "Term::ReadLine::Stub"
+           ) {
+            $term = Term::ReadLine->new('CPAN Monitor');
+        }
+	if ($term->ReadLine eq "Term::ReadLine::Gnu") {
+	    my $attribs = $term->Attribs;
+	     $attribs->{attempted_completion_function} = sub {
+		 &CPAN::Complete::gnu_cpl;
+	     }
+	} else {
+	    $readline::rl_completion_function =
+		$readline::rl_completion_function = 'CPAN::Complete::cpl';
+	}
+        if (my $histfile = $CPAN::Config->{'histfile'}) {{
+            unless ($term->can("AddHistory")) {
+                $CPAN::Frontend->mywarn("Terminal does not support AddHistory.\n");
+                last;
+            }
+            my($fh) = FileHandle->new;
+            open $fh, "<$histfile" or last;
+            local $/ = "\n";
+            while (<$fh>) {
+                chomp;
+                $term->AddHistory($_);
+            }
+            close $fh;
+        }}
+	# $term->OUT is autoflushed anyway
+	my $odef = select STDERR;
+	$| = 1;
+	select STDOUT;
+	$| = 1;
+	select $odef;
+    }
+
+    # no strict; # I do not recall why no strict was here (2000-09-03)
+    $META->checklock();
+    my $cwd = CPAN::anycwd();
+    my $try_detect_readline;
+    $try_detect_readline = $term->ReadLine eq "Term::ReadLine::Stub" if $term;
+    my $rl_avail = $Suppress_readline ? "suppressed" :
+	($term->ReadLine ne "Term::ReadLine::Stub") ? "enabled" :
+	    "available (try 'install Bundle::CPAN')";
+
+    $CPAN::Frontend->myprint(
+			     sprintf qq{
+cpan shell -- CPAN exploration and modules installation (v%s%s)
+ReadLine support %s
+
+},
+                             $CPAN::VERSION,
+                             $CPAN::Revision,
+                             $rl_avail
+                            )
+        unless $CPAN::Config->{'inhibit_startup_message'} ;
+    my($continuation) = "";
+  SHELLCOMMAND: while () {
+	if ($Suppress_readline) {
+	    print $prompt;
+	    last SHELLCOMMAND unless defined ($_ = <> );
+	    chomp;
+	} else {
+	    last SHELLCOMMAND unless
+                defined ($_ = $term->readline($prompt, $commandline));
+	}
+	$_ = "$continuation$_" if $continuation;
+	s/^\s+//;
+	next SHELLCOMMAND if /^$/;
+	$_ = 'h' if /^\s*\?/;
+	if (/^(?:q(?:uit)?|bye|exit)$/i) {
+	    last SHELLCOMMAND;
+	} elsif (s/\\$//s) {
+	    chomp;
+	    $continuation = $_;
+	    $prompt = "    > ";
+	} elsif (/^\!/) {
+	    s/^\!//;
+	    my($eval) = $_;
+	    package CPAN::Eval;
+	    use vars qw($import_done);
+	    CPAN->import(':DEFAULT') unless $import_done++;
+	    CPAN->debug("eval[$eval]") if $CPAN::DEBUG;
+	    eval($eval);
+	    warn $@ if $@;
+	    $continuation = "";
+	    $prompt = $oprompt;
+	} elsif (/./) {
+	    my(@line);
+	    if ($] < 5.00322) { # parsewords had a bug until recently
+		@line = split;
+	    } else {
+		eval { @line = Text::ParseWords::shellwords($_) };
+		warn($@), next SHELLCOMMAND if $@;
+                warn("Text::Parsewords could not parse the line [$_]"),
+                    next SHELLCOMMAND unless @line;
+	    }
+	    $CPAN::META->debug("line[".join("|",@line)."]") if $CPAN::DEBUG;
+	    my $command = shift @line;
+	    eval { CPAN::Shell->$command(@line) };
+	    warn $@ if $@;
+	    chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd": $!});
+	    $CPAN::Frontend->myprint("\n");
+	    $continuation = "";
+	    $prompt = $oprompt;
+	}
+    } continue {
+      $commandline = ""; # I do want to be able to pass a default to
+                         # shell, but on the second command I see no
+                         # use in that
+      $Signal=0;
+      CPAN::Queue->nullify_queue;
+      if ($try_detect_readline) {
+	if ($CPAN::META->has_inst("Term::ReadLine::Gnu")
+	    ||
+	    $CPAN::META->has_inst("Term::ReadLine::Perl")
+	   ) {
+	    delete $INC{"Term/ReadLine.pm"};
+	    my $redef = 0;
+	    local($SIG{__WARN__}) = CPAN::Shell::paintdots_onreload(\$redef);
+	    require Term::ReadLine;
+	    $CPAN::Frontend->myprint("\n$redef subroutines in ".
+				     "Term::ReadLine redefined\n");
+            @_ = ($oprompt,"");
+	    goto &shell;
+	}
+      }
+    }
+    chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd": $!});
+}
+
+package CPAN::CacheMgr;
+@CPAN::CacheMgr::ISA = qw(CPAN::InfoObj CPAN);
+use File::Find;
+
+package CPAN::Config;
+use vars qw(%can $dot_cpan);
+
+%can = (
+  'commit' => "Commit changes to disk",
+  'defaults' => "Reload defaults from disk",
+  'init'   => "Interactive setting of all options",
+);
+
+package CPAN::FTP;
+use vars qw($Ua $Thesite $Themethod);
+@CPAN::FTP::ISA = qw(CPAN::Debug);
+
+package CPAN::LWP::UserAgent;
+use vars qw(@ISA $USER $PASSWD $SETUPDONE);
+# we delay requiring LWP::UserAgent and setting up inheritence until we need it
+
+package CPAN::Complete;
+@CPAN::Complete::ISA = qw(CPAN::Debug);
+@CPAN::Complete::COMMANDS = sort qw(
+		       ! a b d h i m o q r u autobundle clean dump
+		       make test install force readme reload look
+                       cvs_import ls
+) unless @CPAN::Complete::COMMANDS;
+
+package CPAN::Index;
+use vars qw($LAST_TIME $DATE_OF_02 $DATE_OF_03);
+@CPAN::Index::ISA = qw(CPAN::Debug);
+$LAST_TIME ||= 0;
+$DATE_OF_03 ||= 0;
+# use constant PROTOCOL => "2.0"; # outcommented to avoid warning on upgrade from 1.57
+sub PROTOCOL { 2.0 }
+
+package CPAN::InfoObj;
+@CPAN::InfoObj::ISA = qw(CPAN::Debug);
+
+package CPAN::Author;
+@CPAN::Author::ISA = qw(CPAN::InfoObj);
+
+package CPAN::Distribution;
+@CPAN::Distribution::ISA = qw(CPAN::InfoObj);
+
+package CPAN::Bundle;
+@CPAN::Bundle::ISA = qw(CPAN::Module);
+
+package CPAN::Module;
+@CPAN::Module::ISA = qw(CPAN::InfoObj);
+
+package CPAN::Exception::RecursiveDependency;
+use overload '""' => "as_string";
+
+sub new {
+    my($class) = shift;
+    my($deps) = shift;
+    my @deps;
+    my %seen;
+    for my $dep (@$deps) {
+        push @deps, $dep;
+        last if $seen{$dep}++;
+    }
+    bless { deps => \@deps }, $class;
+}
+
+sub as_string {
+    my($self) = shift;
+    "\nRecursive dependency detected:\n    " .
+        join("\n => ", @{$self->{deps}}) .
+            ".\nCannot continue.\n";
+}
+
+package CPAN::Shell;
+use vars qw($AUTOLOAD @ISA $COLOR_REGISTERED $ADVANCED_QUERY $PRINT_ORNAMENTING);
+@CPAN::Shell::ISA = qw(CPAN::Debug);
+$COLOR_REGISTERED ||= 0;
+$PRINT_ORNAMENTING ||= 0;
+
+#-> sub CPAN::Shell::AUTOLOAD ;
+sub AUTOLOAD {
+    my($autoload) = $AUTOLOAD;
+    my $class = shift(@_);
+    # warn "autoload[$autoload] class[$class]";
+    $autoload =~ s/.*:://;
+    if ($autoload =~ /^w/) {
+	if ($CPAN::META->has_inst('CPAN::WAIT')) {
+	    CPAN::WAIT->$autoload(@_);
+	} else {
+	    $CPAN::Frontend->mywarn(qq{
+Commands starting with "w" require CPAN::WAIT to be installed.
+Please consider installing CPAN::WAIT to use the fulltext index.
+For this you just need to type
+    install CPAN::WAIT
+});
+	}
+    } else {
+	$CPAN::Frontend->mywarn(qq{Unknown command '$autoload'. }.
+				qq{Type ? for help.
+});
+    }
+}
+
+package CPAN::Tarzip;
+use vars qw($AUTOLOAD @ISA $BUGHUNTING);
+@CPAN::Tarzip::ISA = qw(CPAN::Debug);
+$BUGHUNTING = 0; # released code must have turned off
+
+package CPAN::Queue;
+
+# One use of the queue is to determine if we should or shouldn't
+# announce the availability of a new CPAN module
+
+# Now we try to use it for dependency tracking. For that to happen
+# we need to draw a dependency tree and do the leaves first. This can
+# easily be reached by running CPAN.pm recursively, but we don't want
+# to waste memory and run into deep recursion. So what we can do is
+# this:
+
+# CPAN::Queue is the package where the queue is maintained. Dependencies
+# often have high priority and must be brought to the head of the queue,
+# possibly by jumping the queue if they are already there. My first code
+# attempt tried to be extremely correct. Whenever a module needed
+# immediate treatment, I either unshifted it to the front of the queue,
+# or, if it was already in the queue, I spliced and let it bypass the
+# others. This became a too correct model that made it impossible to put
+# an item more than once into the queue. Why would you need that? Well,
+# you need temporary duplicates as the manager of the queue is a loop
+# that
+#
+#  (1) looks at the first item in the queue without shifting it off
+#
+#  (2) cares for the item
+#
+#  (3) removes the item from the queue, *even if its agenda failed and
+#      even if the item isn't the first in the queue anymore* (that way
+#      protecting against never ending queues)
+#
+# So if an item has prerequisites, the installation fails now, but we
+# want to retry later. That's easy if we have it twice in the queue.
+#
+# I also expect insane dependency situations where an item gets more
+# than two lives in the queue. Simplest example is triggered by 'install
+# Foo Foo Foo'. People make this kind of mistakes and I don't want to
+# get in the way. I wanted the queue manager to be a dumb servant, not
+# one that knows everything.
+#
+# Who would I tell in this model that the user wants to be asked before
+# processing? I can't attach that information to the module object,
+# because not modules are installed but distributions. So I'd have to
+# tell the distribution object that it should ask the user before
+# processing. Where would the question be triggered then? Most probably
+# in CPAN::Distribution::rematein.
+# Hope that makes sense, my head is a bit off:-) -- AK
+
+use vars qw{ @All };
+
+# CPAN::Queue::new ;
+sub new {
+  my($class,$s) = @_;
+  my $self = bless { qmod => $s }, $class;
+  push @All, $self;
+  return $self;
+}
+
+# CPAN::Queue::first ;
+sub first {
+  my $obj = $All[0];
+  $obj->{qmod};
+}
+
+# CPAN::Queue::delete_first ;
+sub delete_first {
+  my($class,$what) = @_;
+  my $i;
+  for my $i (0..$#All) {
+    if (  $All[$i]->{qmod} eq $what ) {
+      splice @All, $i, 1;
+      return;
+    }
+  }
+}
+
+# CPAN::Queue::jumpqueue ;
+sub jumpqueue {
+    my $class = shift;
+    my @what = @_;
+    CPAN->debug(sprintf("before jumpqueue All[%s] what[%s]",
+                        join(",",map {$_->{qmod}} @All),
+                        join(",",@what)
+                       )) if $CPAN::DEBUG;
+  WHAT: for my $what (reverse @what) {
+        my $jumped = 0;
+        for (my $i=0; $i<$#All;$i++) { #prevent deep recursion
+            CPAN->debug("i[$All[$i]]what[$what]") if $CPAN::DEBUG;
+            if ($All[$i]->{qmod} eq $what){
+                $jumped++;
+                if ($jumped > 100) { # one's OK if e.g. just
+                                     # processing now; more are OK if
+                                     # user typed it several times
+                    $CPAN::Frontend->mywarn(
+qq{Object [$what] queued more than 100 times, ignoring}
+				 );
+                    next WHAT;
+                }
+            }
+        }
+        my $obj = bless { qmod => $what }, $class;
+        unshift @All, $obj;
+    }
+    CPAN->debug(sprintf("after jumpqueue All[%s] what[%s]",
+                        join(",",map {$_->{qmod}} @All),
+                        join(",",@what)
+                       )) if $CPAN::DEBUG;
+}
+
+# CPAN::Queue::exists ;
+sub exists {
+  my($self,$what) = @_;
+  my @all = map { $_->{qmod} } @All;
+  my $exists = grep { $_->{qmod} eq $what } @All;
+  # warn "in exists what[$what] all[@all] exists[$exists]";
+  $exists;
+}
+
+# CPAN::Queue::delete ;
+sub delete {
+  my($self,$mod) = @_;
+  @All = grep { $_->{qmod} ne $mod } @All;
+}
+
+# CPAN::Queue::nullify_queue ;
+sub nullify_queue {
+  @All = ();
+}
+
+
+
+package CPAN;
+
+$META ||= CPAN->new; # In case we re-eval ourselves we need the ||
+
+# from here on only subs.
+################################################################################
+
+#-> sub CPAN::all_objects ;
+sub all_objects {
+    my($mgr,$class) = @_;
+    CPAN::Config->load unless $CPAN::Config_loaded++;
+    CPAN->debug("mgr[$mgr] class[$class]") if $CPAN::DEBUG;
+    CPAN::Index->reload;
+    values %{ $META->{readwrite}{$class} }; # unsafe meta access, ok
+}
+*all = \&all_objects;
+
+# Called by shell, not in batch mode. In batch mode I see no risk in
+# having many processes updating something as installations are
+# continually checked at runtime. In shell mode I suspect it is
+# unintentional to open more than one shell at a time
+
+#-> sub CPAN::checklock ;
+sub checklock {
+    my($self) = @_;
+    my $lockfile = File::Spec->catfile($CPAN::Config->{cpan_home},".lock");
+    if (-f $lockfile && -M _ > 0) {
+	my $fh = FileHandle->new($lockfile) or
+            $CPAN::Frontend->mydie("Could not open $lockfile: $!");
+	my $otherpid  = <$fh>;
+	my $otherhost = <$fh>;
+	$fh->close;
+	if (defined $otherpid && $otherpid) {
+	    chomp $otherpid;
+        }
+	if (defined $otherhost && $otherhost) {
+	    chomp $otherhost;
+	}
+	my $thishost  = hostname();
+	if (defined $otherhost && defined $thishost &&
+	    $otherhost ne '' && $thishost ne '' &&
+	    $otherhost ne $thishost) {
+            $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: Lockfile $lockfile\n".
+                                           "reports other host $otherhost and other process $otherpid.\n".
+                                           "Cannot proceed.\n"));
+	}
+	elsif (defined $otherpid && $otherpid) {
+	    return if $$ == $otherpid; # should never happen
+	    $CPAN::Frontend->mywarn(
+				    qq{
+There seems to be running another CPAN process (pid $otherpid).  Contacting...
+});
+	    if (kill 0, $otherpid) {
+		$CPAN::Frontend->mydie(qq{Other job is running.
+You may want to kill it and delete the lockfile, maybe. On UNIX try:
+    kill $otherpid
+    rm $lockfile
+});
+	    } elsif (-w $lockfile) {
+		my($ans) =
+		    ExtUtils::MakeMaker::prompt
+			(qq{Other job not responding. Shall I overwrite }.
+			 qq{the lockfile? (Y/N)},"y");
+		$CPAN::Frontend->myexit("Ok, bye\n")
+		    unless $ans =~ /^y/i;
+	    } else {
+		Carp::croak(
+			    qq{Lockfile $lockfile not writeable by you. }.
+			    qq{Cannot proceed.\n}.
+			    qq{    On UNIX try:\n}.
+			    qq{    rm $lockfile\n}.
+			    qq{  and then rerun us.\n}
+			   );
+	    }
+	} else {
+            $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: Lockfile $lockfile\n".
+                                           "reports other process with ID ".
+                                           "$otherpid. Cannot proceed.\n"));
+        }
+    }
+    my $dotcpan = $CPAN::Config->{cpan_home};
+    eval { File::Path::mkpath($dotcpan);};
+    if ($@) {
+      # A special case at least for Jarkko.
+      my $firsterror = $@;
+      my $seconderror;
+      my $symlinkcpan;
+      if (-l $dotcpan) {
+	$symlinkcpan = readlink $dotcpan;
+	die "readlink $dotcpan failed: $!" unless defined $symlinkcpan;
+	eval { File::Path::mkpath($symlinkcpan); };
+	if ($@) {
+	  $seconderror = $@;
+	} else {
+	  $CPAN::Frontend->mywarn(qq{
+Working directory $symlinkcpan created.
+});
+	}
+      }
+      unless (-d $dotcpan) {
+	my $diemess = qq{
+Your configuration suggests "$dotcpan" as your
+CPAN.pm working directory. I could not create this directory due
+to this error: $firsterror\n};
+	$diemess .= qq{
+As "$dotcpan" is a symlink to "$symlinkcpan",
+I tried to create that, but I failed with this error: $seconderror
+} if $seconderror;
+	$diemess .= qq{
+Please make sure the directory exists and is writable.
+};
+	$CPAN::Frontend->mydie($diemess);
+      }
+    }
+    my $fh;
+    unless ($fh = FileHandle->new(">$lockfile")) {
+	if ($! =~ /Permission/) {
+	    my $incc = $INC{'CPAN/Config.pm'};
+	    my $myincc = File::Spec->catfile($ENV{HOME},'.cpan','CPAN','MyConfig.pm');
+	    $CPAN::Frontend->myprint(qq{
+
+Your configuration suggests that CPAN.pm should use a working
+directory of
+    $CPAN::Config->{cpan_home}
+Unfortunately we could not create the lock file
+    $lockfile
+due to permission problems.
+
+Please make sure that the configuration variable
+    \$CPAN::Config->{cpan_home}
+points to a directory where you can write a .lock file. You can set
+this variable in either
+    $incc
+or
+    $myincc
+
+});
+	}
+	$CPAN::Frontend->mydie("Could not open >$lockfile: $!");
+    }
+    $fh->print($$, "\n");
+    $fh->print(hostname(), "\n");
+    $self->{LOCK} = $lockfile;
+    $fh->close;
+    $SIG{TERM} = sub {
+      &cleanup;
+      $CPAN::Frontend->mydie("Got SIGTERM, leaving");
+    };
+    $SIG{INT} = sub {
+      # no blocks!!!
+      &cleanup if $Signal;
+      $CPAN::Frontend->mydie("Got another SIGINT") if $Signal;
+      print "Caught SIGINT\n";
+      $Signal++;
+    };
+
+#       From: Larry Wall <larry@wall.org>
+#       Subject: Re: deprecating SIGDIE
+#       To: perl5-porters@perl.org
+#       Date: Thu, 30 Sep 1999 14:58:40 -0700 (PDT)
+#
+#       The original intent of __DIE__ was only to allow you to substitute one
+#       kind of death for another on an application-wide basis without respect
+#       to whether you were in an eval or not.  As a global backstop, it should
+#       not be used any more lightly (or any more heavily :-) than class
+#       UNIVERSAL.  Any attempt to build a general exception model on it should
+#       be politely squashed.  Any bug that causes every eval {} to have to be
+#       modified should be not so politely squashed.
+#
+#       Those are my current opinions.  It is also my optinion that polite
+#       arguments degenerate to personal arguments far too frequently, and that
+#       when they do, it's because both people wanted it to, or at least didn't
+#       sufficiently want it not to.
+#
+#       Larry
+
+    # global backstop to cleanup if we should really die
+    $SIG{__DIE__} = \&cleanup;
+    $self->debug("Signal handler set.") if $CPAN::DEBUG;
+}
+
+#-> sub CPAN::DESTROY ;
+sub DESTROY {
+    &cleanup; # need an eval?
+}
+
+#-> sub CPAN::anycwd ;
+sub anycwd () {
+    my $getcwd;
+    $getcwd = $CPAN::Config->{'getcwd'} || 'cwd';
+    CPAN->$getcwd();
+}
+
+#-> sub CPAN::cwd ;
+sub cwd {Cwd::cwd();}
+
+#-> sub CPAN::getcwd ;
+sub getcwd {Cwd::getcwd();}
+
+#-> sub CPAN::exists ;
+sub exists {
+    my($mgr,$class,$id) = @_;
+    CPAN::Config->load unless $CPAN::Config_loaded++;
+    CPAN::Index->reload;
+    ### Carp::croak "exists called without class argument" unless $class;
+    $id ||= "";
+    exists $META->{readonly}{$class}{$id} or
+        exists $META->{readwrite}{$class}{$id}; # unsafe meta access, ok
+}
+
+#-> sub CPAN::delete ;
+sub delete {
+  my($mgr,$class,$id) = @_;
+  delete $META->{readonly}{$class}{$id}; # unsafe meta access, ok
+  delete $META->{readwrite}{$class}{$id}; # unsafe meta access, ok
+}
+
+#-> sub CPAN::has_usable
+# has_inst is sometimes too optimistic, we should replace it with this
+# has_usable whenever a case is given
+sub has_usable {
+    my($self,$mod,$message) = @_;
+    return 1 if $HAS_USABLE->{$mod};
+    my $has_inst = $self->has_inst($mod,$message);
+    return unless $has_inst;
+    my $usable;
+    $usable = {
+               LWP => [ # we frequently had "Can't locate object
+                        # method "new" via package "LWP::UserAgent" at
+                        # (eval 69) line 2006
+                       sub {require LWP},
+                       sub {require LWP::UserAgent},
+                       sub {require HTTP::Request},
+                       sub {require URI::URL},
+                      ],
+               Net::FTP => [
+                            sub {require Net::FTP},
+                            sub {require Net::Config},
+                           ]
+              };
+    if ($usable->{$mod}) {
+      for my $c (0..$#{$usable->{$mod}}) {
+        my $code = $usable->{$mod}[$c];
+        my $ret = eval { &$code() };
+        if ($@) {
+          warn "DEBUG: c[$c]\$\@[$@]ret[$ret]";
+          return;
+        }
+      }
+    }
+    return $HAS_USABLE->{$mod} = 1;
+}
+
+#-> sub CPAN::has_inst
+sub has_inst {
+    my($self,$mod,$message) = @_;
+    Carp::croak("CPAN->has_inst() called without an argument")
+	unless defined $mod;
+    if (defined $message && $message eq "no"
+        ||
+        exists $CPAN::META->{dontload_hash}{$mod} # unsafe meta access, ok
+        ||
+        exists $CPAN::Config->{dontload_hash}{$mod}
+       ) {
+      $CPAN::META->{dontload_hash}{$mod}||=1; # unsafe meta access, ok
+      return 0;
+    }
+    my $file = $mod;
+    my $obj;
+    $file =~ s|::|/|g;
+    $file .= ".pm";
+    if ($INC{$file}) {
+	# checking %INC is wrong, because $INC{LWP} may be true
+	# although $INC{"URI/URL.pm"} may have failed. But as
+	# I really want to say "bla loaded OK", I have to somehow
+	# cache results.
+	### warn "$file in %INC"; #debug
+	return 1;
+    } elsif (eval { require $file }) {
+	# eval is good: if we haven't yet read the database it's
+	# perfect and if we have installed the module in the meantime,
+	# it tries again. The second require is only a NOOP returning
+	# 1 if we had success, otherwise it's retrying
+
+	$CPAN::Frontend->myprint("CPAN: $mod loaded ok\n");
+	if ($mod eq "CPAN::WAIT") {
+	    push @CPAN::Shell::ISA, CPAN::WAIT;
+	}
+	return 1;
+    } elsif ($mod eq "Net::FTP") {
+	$CPAN::Frontend->mywarn(qq{
+  Please, install Net::FTP as soon as possible. CPAN.pm installs it for you
+  if you just type
+      install Bundle::libnet
+
+}) unless $Have_warned->{"Net::FTP"}++;
+	sleep 3;
+    } elsif ($mod eq "Digest::MD5"){
+	$CPAN::Frontend->myprint(qq{
+  CPAN: MD5 security checks disabled because Digest::MD5 not installed.
+  Please consider installing the Digest::MD5 module.
+
+});
+	sleep 2;
+    } else {
+	delete $INC{$file}; # if it inc'd LWP but failed during, say, URI
+    }
+    return 0;
+}
+
+#-> sub CPAN::instance ;
+sub instance {
+    my($mgr,$class,$id) = @_;
+    CPAN::Index->reload;
+    $id ||= "";
+    # unsafe meta access, ok?
+    return $META->{readwrite}{$class}{$id} if exists $META->{readwrite}{$class}{$id};
+    $META->{readwrite}{$class}{$id} ||= $class->new(ID => $id);
+}
+
+#-> sub CPAN::new ;
+sub new {
+    bless {}, shift;
+}
+
+#-> sub CPAN::cleanup ;
+sub cleanup {
+  # warn "cleanup called with arg[@_] End[$End] Signal[$Signal]";
+  local $SIG{__DIE__} = '';
+  my($message) = @_;
+  my $i = 0;
+  my $ineval = 0;
+  my($subroutine);
+  while ((undef,undef,undef,$subroutine) = caller(++$i)) {
+      $ineval = 1, last if
+	  $subroutine eq '(eval)';
+  }
+  return if $ineval && !$End;
+  return unless defined $META->{LOCK};
+  return unless -f $META->{LOCK};
+  $META->savehist;
+  unlink $META->{LOCK};
+  # require Carp;
+  # Carp::cluck("DEBUGGING");
+  $CPAN::Frontend->mywarn("Lockfile removed.\n");
+}
+
+#-> sub CPAN::savehist
+sub savehist {
+    my($self) = @_;
+    my($histfile,$histsize);
+    unless ($histfile = $CPAN::Config->{'histfile'}){
+        $CPAN::Frontend->mywarn("No history written (no histfile specified).\n");
+        return;
+    }
+    $histsize = $CPAN::Config->{'histsize'} || 100;
+    if ($CPAN::term){
+        unless ($CPAN::term->can("GetHistory")) {
+            $CPAN::Frontend->mywarn("Terminal does not support GetHistory.\n");
+            return;
+        }
+    } else {
+        return;
+    }
+    my @h = $CPAN::term->GetHistory;
+    splice @h, 0, @h-$histsize if @h>$histsize;
+    my($fh) = FileHandle->new;
+    open $fh, ">$histfile" or $CPAN::Frontend->mydie("Couldn't open >$histfile: $!");
+    local $\ = local $, = "\n";
+    print $fh @h;
+    close $fh;
+}
+
+sub is_tested {
+    my($self,$what) = @_;
+    $self->{is_tested}{$what} = 1;
+}
+
+sub is_installed {
+    my($self,$what) = @_;
+    delete $self->{is_tested}{$what};
+}
+
+sub set_perl5lib {
+    my($self) = @_;
+    $self->{is_tested} ||= {};
+    return unless %{$self->{is_tested}};
+    my $env = $ENV{PERL5LIB};
+    $env = $ENV{PERLLIB} unless defined $env;
+    my @env;
+    push @env, $env if defined $env and length $env;
+    my @dirs = map {("$_/blib/arch", "$_/blib/lib")} keys %{$self->{is_tested}};
+    $CPAN::Frontend->myprint("Prepending @dirs to PERL5LIB.\n");
+    $ENV{PERL5LIB} = join $Config::Config{path_sep}, @dirs, @env;
+}
+
+package CPAN::CacheMgr;
+
+#-> sub CPAN::CacheMgr::as_string ;
+sub as_string {
+    eval { require Data::Dumper };
+    if ($@) {
+	return shift->SUPER::as_string;
+    } else {
+	return Data::Dumper::Dumper(shift);
+    }
+}
+
+#-> sub CPAN::CacheMgr::cachesize ;
+sub cachesize {
+    shift->{DU};
+}
+
+#-> sub CPAN::CacheMgr::tidyup ;
+sub tidyup {
+  my($self) = @_;
+  return unless -d $self->{ID};
+  while ($self->{DU} > $self->{'MAX'} ) {
+    my($toremove) = shift @{$self->{FIFO}};
+    $CPAN::Frontend->myprint(sprintf(
+				     "Deleting from cache".
+				     ": $toremove (%.1f>%.1f MB)\n",
+				     $self->{DU}, $self->{'MAX'})
+			    );
+    return if $CPAN::Signal;
+    $self->force_clean_cache($toremove);
+    return if $CPAN::Signal;
+  }
+}
+
+#-> sub CPAN::CacheMgr::dir ;
+sub dir {
+    shift->{ID};
+}
+
+#-> sub CPAN::CacheMgr::entries ;
+sub entries {
+    my($self,$dir) = @_;
+    return unless defined $dir;
+    $self->debug("reading dir[$dir]") if $CPAN::DEBUG;
+    $dir ||= $self->{ID};
+    my($cwd) = CPAN::anycwd();
+    chdir $dir or Carp::croak("Can't chdir to $dir: $!");
+    my $dh = DirHandle->new(File::Spec->curdir)
+        or Carp::croak("Couldn't opendir $dir: $!");
+    my(@entries);
+    for ($dh->read) {
+	next if $_ eq "." || $_ eq "..";
+	if (-f $_) {
+	    push @entries, File::Spec->catfile($dir,$_);
+	} elsif (-d _) {
+	    push @entries, File::Spec->catdir($dir,$_);
+	} else {
+	    $CPAN::Frontend->mywarn("Warning: weird direntry in $dir: $_\n");
+	}
+    }
+    chdir $cwd or Carp::croak("Can't chdir to $cwd: $!");
+    sort { -M $b <=> -M $a} @entries;
+}
+
+#-> sub CPAN::CacheMgr::disk_usage ;
+sub disk_usage {
+    my($self,$dir) = @_;
+    return if exists $self->{SIZE}{$dir};
+    return if $CPAN::Signal;
+    my($Du) = 0;
+    find(
+	 sub {
+	   $File::Find::prune++ if $CPAN::Signal;
+	   return if -l $_;
+	   if ($^O eq 'MacOS') {
+	     require Mac::Files;
+	     my $cat  = Mac::Files::FSpGetCatInfo($_);
+	     $Du += $cat->ioFlLgLen() + $cat->ioFlRLgLen() if $cat;
+	   } else {
+	     $Du += (-s _);
+	   }
+	 },
+	 $dir
+	);
+    return if $CPAN::Signal;
+    $self->{SIZE}{$dir} = $Du/1024/1024;
+    push @{$self->{FIFO}}, $dir;
+    $self->debug("measured $dir is $Du") if $CPAN::DEBUG;
+    $self->{DU} += $Du/1024/1024;
+    $self->{DU};
+}
+
+#-> sub CPAN::CacheMgr::force_clean_cache ;
+sub force_clean_cache {
+    my($self,$dir) = @_;
+    return unless -e $dir;
+    $self->debug("have to rmtree $dir, will free $self->{SIZE}{$dir}")
+	if $CPAN::DEBUG;
+    File::Path::rmtree($dir);
+    $self->{DU} -= $self->{SIZE}{$dir};
+    delete $self->{SIZE}{$dir};
+}
+
+#-> sub CPAN::CacheMgr::new ;
+sub new {
+    my $class = shift;
+    my $time = time;
+    my($debug,$t2);
+    $debug = "";
+    my $self = {
+		ID => $CPAN::Config->{'build_dir'},
+		MAX => $CPAN::Config->{'build_cache'},
+		SCAN => $CPAN::Config->{'scan_cache'} || 'atstart',
+		DU => 0
+	       };
+    File::Path::mkpath($self->{ID});
+    my $dh = DirHandle->new($self->{ID});
+    bless $self, $class;
+    $self->scan_cache;
+    $t2 = time;
+    $debug .= "timing of CacheMgr->new: ".($t2 - $time);
+    $time = $t2;
+    CPAN->debug($debug) if $CPAN::DEBUG;
+    $self;
+}
+
+#-> sub CPAN::CacheMgr::scan_cache ;
+sub scan_cache {
+    my $self = shift;
+    return if $self->{SCAN} eq 'never';
+    $CPAN::Frontend->mydie("Unknown scan_cache argument: $self->{SCAN}")
+	unless $self->{SCAN} eq 'atstart';
+    $CPAN::Frontend->myprint(
+			     sprintf("Scanning cache %s for sizes\n",
+				     $self->{ID}));
+    my $e;
+    for $e ($self->entries($self->{ID})) {
+	next if $e eq ".." || $e eq ".";
+	$self->disk_usage($e);
+	return if $CPAN::Signal;
+    }
+    $self->tidyup;
+}
+
+package CPAN::Debug;
+
+#-> sub CPAN::Debug::debug ;
+sub debug {
+    my($self,$arg) = @_;
+    my($caller,$func,$line,@rest) = caller(1); # caller(0) eg
+                                               # Complete, caller(1)
+                                               # eg readline
+    ($caller) = caller(0);
+    $caller =~ s/.*:://;
+    $arg = "" unless defined $arg;
+    my $rest = join "|", map { defined $_ ? $_ : "UNDEF" } @rest;
+    if ($CPAN::DEBUG{$caller} & $CPAN::DEBUG){
+	if ($arg and ref $arg) {
+	    eval { require Data::Dumper };
+	    if ($@) {
+		$CPAN::Frontend->myprint($arg->as_string);
+	    } else {
+		$CPAN::Frontend->myprint(Data::Dumper::Dumper($arg));
+	    }
+	} else {
+	    $CPAN::Frontend->myprint("Debug($caller:$func,$line,[$rest]): $arg\n");
+	}
+    }
+}
+
+package CPAN::Config;
+
+#-> sub CPAN::Config::edit ;
+# returns true on successful action
+sub edit {
+    my($self,@args) = @_;
+    return unless @args;
+    CPAN->debug("self[$self]args[".join(" | ",@args)."]");
+    my($o,$str,$func,$args,$key_exists);
+    $o = shift @args;
+    if($can{$o}) {
+	$self->$o(@args);
+	return 1;
+    } else {
+        CPAN->debug("o[$o]") if $CPAN::DEBUG;
+	if ($o =~ /list$/) {
+	    $func = shift @args;
+	    $func ||= "";
+            CPAN->debug("func[$func]") if $CPAN::DEBUG;
+            my $changed;
+	    # Let's avoid eval, it's easier to comprehend without.
+	    if ($func eq "push") {
+		push @{$CPAN::Config->{$o}}, @args;
+                $changed = 1;
+	    } elsif ($func eq "pop") {
+		pop @{$CPAN::Config->{$o}};
+                $changed = 1;
+	    } elsif ($func eq "shift") {
+		shift @{$CPAN::Config->{$o}};
+                $changed = 1;
+	    } elsif ($func eq "unshift") {
+		unshift @{$CPAN::Config->{$o}}, @args;
+                $changed = 1;
+	    } elsif ($func eq "splice") {
+		splice @{$CPAN::Config->{$o}}, @args;
+                $changed = 1;
+	    } elsif (@args) {
+		$CPAN::Config->{$o} = [@args];
+                $changed = 1;
+	    } else {
+                $self->prettyprint($o);
+	    }
+            if ($o eq "urllist" && $changed) {
+                # reset the cached values
+                undef $CPAN::FTP::Thesite;
+                undef $CPAN::FTP::Themethod;
+            }
+            return $changed;
+	} else {
+	    $CPAN::Config->{$o} = $args[0] if defined $args[0];
+	    $self->prettyprint($o);
+	}
+    }
+}
+
+sub prettyprint {
+  my($self,$k) = @_;
+  my $v = $CPAN::Config->{$k};
+  if (ref $v) {
+    my(@report) = ref $v eq "ARRAY" ?
+        @$v :
+            map { sprintf("   %-18s => %s\n",
+                          $_,
+                          defined $v->{$_} ? $v->{$_} : "UNDEFINED"
+                         )} keys %$v;
+    $CPAN::Frontend->myprint(
+                             join(
+                                  "",
+                                  sprintf(
+                                          "    %-18s\n",
+                                          $k
+                                         ),
+                                  map {"\t$_\n"} @report
+                                 )
+                            );
+  } elsif (defined $v) {
+    $CPAN::Frontend->myprint(sprintf "    %-18s %s\n", $k, $v);
+  } else {
+    $CPAN::Frontend->myprint(sprintf "    %-18s %s\n", $k, "UNDEFINED");
+  }
+}
+
+#-> sub CPAN::Config::commit ;
+sub commit {
+    my($self,$configpm) = @_;
+    unless (defined $configpm){
+	$configpm ||= $INC{"CPAN/MyConfig.pm"};
+	$configpm ||= $INC{"CPAN/Config.pm"};
+	$configpm || Carp::confess(q{
+CPAN::Config::commit called without an argument.
+Please specify a filename where to save the configuration or try
+"o conf init" to have an interactive course through configing.
+});
+    }
+    my($mode);
+    if (-f $configpm) {
+	$mode = (stat $configpm)[2];
+	if ($mode && ! -w _) {
+	    Carp::confess("$configpm is not writable");
+	}
+    }
+
+    my $msg;
+    $msg = <<EOF unless $configpm =~ /MyConfig/;
+
+# This is CPAN.pm's systemwide configuration file. This file provides
+# defaults for users, and the values can be changed in a per-user
+# configuration file. The user-config file is being looked for as
+# ~/.cpan/CPAN/MyConfig.pm.
+
+EOF
+    $msg ||= "\n";
+    my($fh) = FileHandle->new;
+    rename $configpm, "$configpm~" if -f $configpm;
+    open $fh, ">$configpm" or
+        $CPAN::Frontend->mydie("Couldn't open >$configpm: $!");
+    $fh->print(qq[$msg\$CPAN::Config = \{\n]);
+    foreach (sort keys %$CPAN::Config) {
+	$fh->print(
+		   "  '$_' => ",
+		   ExtUtils::MakeMaker::neatvalue($CPAN::Config->{$_}),
+		   ",\n"
+		  );
+    }
+
+    $fh->print("};\n1;\n__END__\n");
+    close $fh;
+
+    #$mode = 0444 | ( $mode & 0111 ? 0111 : 0 );
+    #chmod $mode, $configpm;
+###why was that so?    $self->defaults;
+    $CPAN::Frontend->myprint("commit: wrote $configpm\n");
+    1;
+}
+
+*default = \&defaults;
+#-> sub CPAN::Config::defaults ;
+sub defaults {
+    my($self) = @_;
+    $self->unload;
+    $self->load;
+    1;
+}
+
+sub init {
+    my($self) = @_;
+    undef $CPAN::Config->{'inhibit_startup_message'}; # lazy trick to
+                                                      # have the least
+                                                      # important
+                                                      # variable
+                                                      # undefined
+    $self->load;
+    1;
+}
+
+# This is a piece of repeated code that is abstracted here for
+# maintainability.  RMB
+#
+sub _configpmtest {
+    my($configpmdir, $configpmtest) = @_; 
+    if (-w $configpmtest) {
+        return $configpmtest;
+    } elsif (-w $configpmdir) {
+        #_#_# following code dumped core on me with 5.003_11, a.k.
+        my $configpm_bak = "$configpmtest.bak";
+        unlink $configpm_bak if -f $configpm_bak;
+        if( -f $configpmtest ) {	
+            if( rename $configpmtest, $configpm_bak ) {  
+                $CPAN::Frontend->mywarn(<<END)
+Old configuration file $configpmtest
+    moved to $configpm_bak
+END
+	    }
+	}	
+	my $fh = FileHandle->new;
+	if ($fh->open(">$configpmtest")) {
+	    $fh->print("1;\n");
+	    return $configpmtest;
+	} else {
+	    # Should never happen
+	    Carp::confess("Cannot open >$configpmtest");
+	}
+    } else { return } 
+}
+
+#-> sub CPAN::Config::load ;
+sub load {
+    my($self) = shift;
+    my(@miss);
+    use Carp;
+    eval {require CPAN::Config;};       # We eval because of some
+                                        # MakeMaker problems
+    unless ($dot_cpan++){
+      unshift @INC, File::Spec->catdir($ENV{HOME},".cpan");
+      eval {require CPAN::MyConfig;};   # where you can override
+                                        # system wide settings
+      shift @INC;
+    }
+    return unless @miss = $self->missing_config_data;
+
+    require CPAN::FirstTime;
+    my($configpm,$fh,$redo,$theycalled);
+    $redo ||= "";
+    $theycalled++ if @miss==1 && $miss[0] eq 'inhibit_startup_message';
+    if (defined $INC{"CPAN/Config.pm"} && -w $INC{"CPAN/Config.pm"}) {
+	$configpm = $INC{"CPAN/Config.pm"};
+	$redo++;
+    } elsif (defined $INC{"CPAN/MyConfig.pm"} && -w $INC{"CPAN/MyConfig.pm"}) {
+	$configpm = $INC{"CPAN/MyConfig.pm"};
+	$redo++;
+    } else {
+	my($path_to_cpan) = File::Basename::dirname($INC{"CPAN.pm"});
+	my($configpmdir) = File::Spec->catdir($path_to_cpan,"CPAN");
+	my($configpmtest) = File::Spec->catfile($configpmdir,"Config.pm");
+	if (-d $configpmdir or File::Path::mkpath($configpmdir)) {
+	    $configpm = _configpmtest($configpmdir,$configpmtest); 
+	}
+	unless ($configpm) {
+	    $configpmdir = File::Spec->catdir($ENV{HOME},".cpan","CPAN");
+	    File::Path::mkpath($configpmdir);
+	    $configpmtest = File::Spec->catfile($configpmdir,"MyConfig.pm");
+	    $configpm = _configpmtest($configpmdir,$configpmtest); 
+	    unless ($configpm) {
+		Carp::confess(qq{WARNING: CPAN.pm is unable to }.
+			      qq{create a configuration file.});
+	    }
+	}
+    }
+    local($") = ", ";
+    $CPAN::Frontend->myprint(<<END) if $redo && ! $theycalled;
+We have to reconfigure CPAN.pm due to following uninitialized parameters:
+
+@miss
+END
+    $CPAN::Frontend->myprint(qq{
+$configpm initialized.
+});
+    sleep 2;
+    CPAN::FirstTime::init($configpm);
+}
+
+#-> sub CPAN::Config::missing_config_data ;
+sub missing_config_data {
+    my(@miss);
+    for (
+         "cpan_home", "keep_source_where", "build_dir", "build_cache",
+         "scan_cache", "index_expire", "gzip", "tar", "unzip", "make",
+         "pager",
+         "makepl_arg", "make_arg", "make_install_arg", "urllist",
+         "inhibit_startup_message", "ftp_proxy", "http_proxy", "no_proxy",
+         "prerequisites_policy",
+         "cache_metadata",
+        ) {
+	push @miss, $_ unless defined $CPAN::Config->{$_};
+    }
+    return @miss;
+}
+
+#-> sub CPAN::Config::unload ;
+sub unload {
+    delete $INC{'CPAN/MyConfig.pm'};
+    delete $INC{'CPAN/Config.pm'};
+}
+
+#-> sub CPAN::Config::help ;
+sub help {
+    $CPAN::Frontend->myprint(q[
+Known options:
+  defaults  reload default config values from disk
+  commit    commit session changes to disk
+  init      go through a dialog to set all parameters
+
+You may edit key values in the follow fashion (the "o" is a literal
+letter o):
+
+  o conf build_cache 15
+
+  o conf build_dir "/foo/bar"
+
+  o conf urllist shift
+
+  o conf urllist unshift ftp://ftp.foo.bar/
+
+]);
+    undef; #don't reprint CPAN::Config
+}
+
+#-> sub CPAN::Config::cpl ;
+sub cpl {
+    my($word,$line,$pos) = @_;
+    $word ||= "";
+    CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
+    my(@words) = split " ", substr($line,0,$pos+1);
+    if (
+	defined($words[2])
+	and
+	(
+	 $words[2] =~ /list$/ && @words == 3
+	 ||
+	 $words[2] =~ /list$/ && @words == 4 && length($word)
+	)
+       ) {
+	return grep /^\Q$word\E/, qw(splice shift unshift pop push);
+    } elsif (@words >= 4) {
+	return ();
+    }
+    my(@o_conf) = (keys %CPAN::Config::can, keys %$CPAN::Config);
+    return grep /^\Q$word\E/, @o_conf;
+}
+
+package CPAN::Shell;
+
+#-> sub CPAN::Shell::h ;
+sub h {
+    my($class,$about) = @_;
+    if (defined $about) {
+	$CPAN::Frontend->myprint("Detailed help not yet implemented\n");
+    } else {
+	$CPAN::Frontend->myprint(q{
+Display Information
+ command  argument          description
+ a,b,d,m  WORD or /REGEXP/  about authors, bundles, distributions, modules
+ i        WORD or /REGEXP/  about anything of above
+ r        NONE              reinstall recommendations
+ ls       AUTHOR            about files in the author's directory
+
+Download, Test, Make, Install...
+ get                        download
+ make                       make (implies get)
+ test      MODULES,         make test (implies make)
+ install   DISTS, BUNDLES   make install (implies test)
+ clean                      make clean
+ look                       open subshell in these dists' directories
+ readme                     display these dists' README files
+
+Other
+ h,?           display this menu       ! perl-code   eval a perl command
+ o conf [opt]  set and query options   q             quit the cpan shell
+ reload cpan   load CPAN.pm again      reload index  load newer indices
+ autobundle    Snapshot                force cmd     unconditionally do cmd});
+    }
+}
+
+*help = \&h;
+
+#-> sub CPAN::Shell::a ;
+sub a {
+  my($self,@arg) = @_;
+  # authors are always UPPERCASE
+  for (@arg) {
+    $_ = uc $_ unless /=/;
+  }
+  $CPAN::Frontend->myprint($self->format_result('Author',@arg));
+}
+
+#-> sub CPAN::Shell::ls ;
+sub ls      {
+    my($self,@arg) = @_;
+    my @accept;
+    for (@arg) {
+        unless (/^[A-Z\-]+$/i) {
+            $CPAN::Frontend->mywarn("ls command rejects argument $_: not an author\n");
+            next;
+        }
+        push @accept, uc $_;
+    }
+    for my $a (@accept){
+        my $author = $self->expand('Author',$a) or die "No author found for $a";
+        $author->ls;
+    }
+}
+
+#-> sub CPAN::Shell::local_bundles ;
+sub local_bundles {
+    my($self,@which) = @_;
+    my($incdir,$bdir,$dh);
+    foreach $incdir ($CPAN::Config->{'cpan_home'},@INC) {
+        my @bbase = "Bundle";
+        while (my $bbase = shift @bbase) {
+            $bdir = File::Spec->catdir($incdir,split /::/, $bbase);
+            CPAN->debug("bdir[$bdir]\@bbase[@bbase]") if $CPAN::DEBUG;
+            if ($dh = DirHandle->new($bdir)) { # may fail
+                my($entry);
+                for $entry ($dh->read) {
+                    next if $entry =~ /^\./;
+                    if (-d File::Spec->catdir($bdir,$entry)){
+                        push @bbase, "$bbase\::$entry";
+                    } else {
+                        next unless $entry =~ s/\.pm(?!\n)\Z//;
+                        $CPAN::META->instance('CPAN::Bundle',"$bbase\::$entry");
+                    }
+                }
+            }
+        }
+    }
+}
+
+#-> sub CPAN::Shell::b ;
+sub b {
+    my($self,@which) = @_;
+    CPAN->debug("which[@which]") if $CPAN::DEBUG;
+    $self->local_bundles;
+    $CPAN::Frontend->myprint($self->format_result('Bundle',@which));
+}
+
+#-> sub CPAN::Shell::d ;
+sub d { $CPAN::Frontend->myprint(shift->format_result('Distribution',@_));}
+
+#-> sub CPAN::Shell::m ;
+sub m { # emacs confused here }; sub mimimimimi { # emacs in sync here
+    my $self = shift;
+    $CPAN::Frontend->myprint($self->format_result('Module',@_));
+}
+
+#-> sub CPAN::Shell::i ;
+sub i {
+    my($self) = shift;
+    my(@args) = @_;
+    my(@type,$type,@m);
+    @type = qw/Author Bundle Distribution Module/;
+    @args = '/./' unless @args;
+    my(@result);
+    for $type (@type) {
+	push @result, $self->expand($type,@args);
+    }
+    my $result = @result == 1 ?
+	$result[0]->as_string :
+            @result == 0 ?
+                "No objects found of any type for argument @args\n" :
+                    join("",
+                         (map {$_->as_glimpse} @result),
+                         scalar @result, " items found\n",
+                        );
+    $CPAN::Frontend->myprint($result);
+}
+
+#-> sub CPAN::Shell::o ;
+
+# CPAN::Shell::o and CPAN::Config::edit are closely related. 'o conf'
+# should have been called set and 'o debug' maybe 'set debug'
+sub o {
+    my($self,$o_type,@o_what) = @_;
+    $o_type ||= "";
+    CPAN->debug("o_type[$o_type] o_what[".join(" | ",@o_what)."]\n");
+    if ($o_type eq 'conf') {
+	shift @o_what if @o_what && $o_what[0] eq 'help';
+	if (!@o_what) { # print all things, "o conf"
+	    my($k,$v);
+	    $CPAN::Frontend->myprint("CPAN::Config options");
+	    if (exists $INC{'CPAN/Config.pm'}) {
+	      $CPAN::Frontend->myprint(" from $INC{'CPAN/Config.pm'}");
+	    }
+	    if (exists $INC{'CPAN/MyConfig.pm'}) {
+	      $CPAN::Frontend->myprint(" and $INC{'CPAN/MyConfig.pm'}");
+	    }
+	    $CPAN::Frontend->myprint(":\n");
+	    for $k (sort keys %CPAN::Config::can) {
+		$v = $CPAN::Config::can{$k};
+		$CPAN::Frontend->myprint(sprintf "    %-18s %s\n", $k, $v);
+	    }
+	    $CPAN::Frontend->myprint("\n");
+	    for $k (sort keys %$CPAN::Config) {
+                CPAN::Config->prettyprint($k);
+	    }
+	    $CPAN::Frontend->myprint("\n");
+	} elsif (!CPAN::Config->edit(@o_what)) {
+	    $CPAN::Frontend->myprint(qq{Type 'o conf' to view configuration }.
+                                     qq{edit options\n\n});
+	}
+    } elsif ($o_type eq 'debug') {
+	my(%valid);
+	@o_what = () if defined $o_what[0] && $o_what[0] =~ /help/i;
+	if (@o_what) {
+	    while (@o_what) {
+		my($what) = shift @o_what;
+                if ($what =~ s/^-// && exists $CPAN::DEBUG{$what}) {
+                    $CPAN::DEBUG &= $CPAN::DEBUG ^ $CPAN::DEBUG{$what};
+                    next;
+                }
+		if ( exists $CPAN::DEBUG{$what} ) {
+		    $CPAN::DEBUG |= $CPAN::DEBUG{$what};
+		} elsif ($what =~ /^\d/) {
+		    $CPAN::DEBUG = $what;
+		} elsif (lc $what eq 'all') {
+		    my($max) = 0;
+		    for (values %CPAN::DEBUG) {
+			$max += $_;
+		    }
+		    $CPAN::DEBUG = $max;
+		} else {
+		    my($known) = 0;
+		    for (keys %CPAN::DEBUG) {
+			next unless lc($_) eq lc($what);
+			$CPAN::DEBUG |= $CPAN::DEBUG{$_};
+			$known = 1;
+		    }
+		    $CPAN::Frontend->myprint("unknown argument [$what]\n")
+			unless $known;
+		}
+	    }
+	} else {
+	  my $raw = "Valid options for debug are ".
+	      join(", ",sort(keys %CPAN::DEBUG), 'all').
+		  qq{ or a number. Completion works on the options. }.
+		      qq{Case is ignored.};
+	  require Text::Wrap;
+	  $CPAN::Frontend->myprint(Text::Wrap::fill("","",$raw));
+	  $CPAN::Frontend->myprint("\n\n");
+	}
+	if ($CPAN::DEBUG) {
+	    $CPAN::Frontend->myprint("Options set for debugging:\n");
+	    my($k,$v);
+	    for $k (sort {$CPAN::DEBUG{$a} <=> $CPAN::DEBUG{$b}} keys %CPAN::DEBUG) {
+		$v = $CPAN::DEBUG{$k};
+		$CPAN::Frontend->myprint(sprintf "    %-14s(%s)\n", $k, $v)
+                    if $v & $CPAN::DEBUG;
+	    }
+	} else {
+	    $CPAN::Frontend->myprint("Debugging turned off completely.\n");
+	}
+    } else {
+	$CPAN::Frontend->myprint(qq{
+Known options:
+  conf    set or get configuration variables
+  debug   set or get debugging options
+});
+    }
+}
+
+sub paintdots_onreload {
+    my($ref) = shift;
+    sub {
+	if ( $_[0] =~ /[Ss]ubroutine ([\w:]+) redefined/ ) {
+	    my($subr) = $1;
+	    ++$$ref;
+	    local($|) = 1;
+	    # $CPAN::Frontend->myprint(".($subr)");
+	    $CPAN::Frontend->myprint(".");
+	    return;
+	}
+	warn @_;
+    };
+}
+
+#-> sub CPAN::Shell::reload ;
+sub reload {
+    my($self,$command,@arg) = @_;
+    $command ||= "";
+    $self->debug("self[$self]command[$command]arg[@arg]") if $CPAN::DEBUG;
+    if ($command =~ /cpan/i) {
+        for my $f (qw(CPAN.pm CPAN/FirstTime.pm)) {
+            next unless $INC{$f};
+            CPAN->debug("reloading the whole $f") if $CPAN::DEBUG;
+            my $fh = FileHandle->new($INC{$f});
+            local($/);
+            my $redef = 0;
+            local($SIG{__WARN__}) = paintdots_onreload(\$redef);
+            eval <$fh>;
+            warn $@ if $@;
+            $CPAN::Frontend->myprint("\n$redef subroutines redefined\n");
+        }
+    } elsif ($command =~ /index/) {
+      CPAN::Index->force_reload;
+    } else {
+      $CPAN::Frontend->myprint(qq{cpan     re-evals the CPAN.pm file
+index    re-reads the index files\n});
+    }
+}
+
+#-> sub CPAN::Shell::_binary_extensions ;
+sub _binary_extensions {
+    my($self) = shift @_;
+    my(@result,$module,%seen,%need,$headerdone);
+    for $module ($self->expand('Module','/./')) {
+	my $file  = $module->cpan_file;
+	next if $file eq "N/A";
+	next if $file =~ /^Contact Author/;
+        my $dist = $CPAN::META->instance('CPAN::Distribution',$file);
+	next if $dist->isa_perl;
+	next unless $module->xs_file;
+	local($|) = 1;
+	$CPAN::Frontend->myprint(".");
+	push @result, $module;
+    }
+#    print join " | ", @result;
+    $CPAN::Frontend->myprint("\n");
+    return @result;
+}
+
+#-> sub CPAN::Shell::recompile ;
+sub recompile {
+    my($self) = shift @_;
+    my($module,@module,$cpan_file,%dist);
+    @module = $self->_binary_extensions();
+    for $module (@module){  # we force now and compile later, so we
+                            # don't do it twice
+	$cpan_file = $module->cpan_file;
+	my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file);
+	$pack->force;
+	$dist{$cpan_file}++;
+    }
+    for $cpan_file (sort keys %dist) {
+	$CPAN::Frontend->myprint("  CPAN: Recompiling $cpan_file\n\n");
+	my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file);
+	$pack->install;
+	$CPAN::Signal = 0; # it's tempting to reset Signal, so we can
+                           # stop a package from recompiling,
+                           # e.g. IO-1.12 when we have perl5.003_10
+    }
+}
+
+#-> sub CPAN::Shell::_u_r_common ;
+sub _u_r_common {
+    my($self) = shift @_;
+    my($what) = shift @_;
+    CPAN->debug("self[$self] what[$what] args[@_]") if $CPAN::DEBUG;
+    Carp::croak "Usage: \$obj->_u_r_common(a|r|u)" unless
+          $what && $what =~ /^[aru]$/;
+    my(@args) = @_;
+    @args = '/./' unless @args;
+    my(@result,$module,%seen,%need,$headerdone,
+       $version_undefs,$version_zeroes);
+    $version_undefs = $version_zeroes = 0;
+    my $sprintf = "%s%-25s%s %9s %9s  %s\n";
+    my @expand = $self->expand('Module',@args);
+    my $expand = scalar @expand;
+    if (0) { # Looks like noise to me, was very useful for debugging
+             # for metadata cache
+        $CPAN::Frontend->myprint(sprintf "%d matches in the database\n", $expand);
+    }
+    for $module (@expand) {
+	my $file  = $module->cpan_file;
+	next unless defined $file; # ??
+	my($latest) = $module->cpan_version;
+	my($inst_file) = $module->inst_file;
+	my($have);
+	return if $CPAN::Signal;
+	if ($inst_file){
+	    if ($what eq "a") {
+		$have = $module->inst_version;
+	    } elsif ($what eq "r") {
+		$have = $module->inst_version;
+		local($^W) = 0;
+		if ($have eq "undef"){
+		    $version_undefs++;
+		} elsif ($have == 0){
+		    $version_zeroes++;
+		}
+		next unless CPAN::Version->vgt($latest, $have);
+# to be pedantic we should probably say:
+#    && !($have eq "undef" && $latest ne "undef" && $latest gt "");
+# to catch the case where CPAN has a version 0 and we have a version undef
+	    } elsif ($what eq "u") {
+		next;
+	    }
+	} else {
+	    if ($what eq "a") {
+		next;
+	    } elsif ($what eq "r") {
+		next;
+	    } elsif ($what eq "u") {
+		$have = "-";
+	    }
+	}
+	return if $CPAN::Signal; # this is sometimes lengthy
+	$seen{$file} ||= 0;
+	if ($what eq "a") {
+	    push @result, sprintf "%s %s\n", $module->id, $have;
+	} elsif ($what eq "r") {
+	    push @result, $module->id;
+	    next if $seen{$file}++;
+	} elsif ($what eq "u") {
+	    push @result, $module->id;
+	    next if $seen{$file}++;
+	    next if $file =~ /^Contact/;
+	}
+	unless ($headerdone++){
+	    $CPAN::Frontend->myprint("\n");
+	    $CPAN::Frontend->myprint(sprintf(
+                                             $sprintf,
+                                             "",
+                                             "Package namespace",
+                                             "",
+                                             "installed",
+                                             "latest",
+                                             "in CPAN file"
+                                            ));
+	}
+        my $color_on = "";
+        my $color_off = "";
+        if (
+            $COLOR_REGISTERED
+            &&
+            $CPAN::META->has_inst("Term::ANSIColor")
+            &&
+            $module->{RO}{description}
+           ) {
+            $color_on = Term::ANSIColor::color("green");
+            $color_off = Term::ANSIColor::color("reset");
+        }
+	$CPAN::Frontend->myprint(sprintf $sprintf,
+                                 $color_on,
+                                 $module->id,
+                                 $color_off,
+                                 $have,
+                                 $latest,
+                                 $file);
+	$need{$module->id}++;
+    }
+    unless (%need) {
+	if ($what eq "u") {
+	    $CPAN::Frontend->myprint("No modules found for @args\n");
+	} elsif ($what eq "r") {
+	    $CPAN::Frontend->myprint("All modules are up to date for @args\n");
+	}
+    }
+    if ($what eq "r") {
+	if ($version_zeroes) {
+	    my $s_has = $version_zeroes > 1 ? "s have" : " has";
+	    $CPAN::Frontend->myprint(qq{$version_zeroes installed module$s_has }.
+		qq{a version number of 0\n});
+	}
+	if ($version_undefs) {
+	    my $s_has = $version_undefs > 1 ? "s have" : " has";
+	    $CPAN::Frontend->myprint(qq{$version_undefs installed module$s_has no }.
+		qq{parseable version number\n});
+	}
+    }
+    @result;
+}
+
+#-> sub CPAN::Shell::r ;
+sub r {
+    shift->_u_r_common("r",@_);
+}
+
+#-> sub CPAN::Shell::u ;
+sub u {
+    shift->_u_r_common("u",@_);
+}
+
+#-> sub CPAN::Shell::autobundle ;
+sub autobundle {
+    my($self) = shift;
+    CPAN::Config->load unless $CPAN::Config_loaded++;
+    my(@bundle) = $self->_u_r_common("a",@_);
+    my($todir) = File::Spec->catdir($CPAN::Config->{'cpan_home'},"Bundle");
+    File::Path::mkpath($todir);
+    unless (-d $todir) {
+	$CPAN::Frontend->myprint("Couldn't mkdir $todir for some reason\n");
+	return;
+    }
+    my($y,$m,$d) =  (localtime)[5,4,3];
+    $y+=1900;
+    $m++;
+    my($c) = 0;
+    my($me) = sprintf "Snapshot_%04d_%02d_%02d_%02d", $y, $m, $d, $c;
+    my($to) = File::Spec->catfile($todir,"$me.pm");
+    while (-f $to) {
+	$me = sprintf "Snapshot_%04d_%02d_%02d_%02d", $y, $m, $d, ++$c;
+	$to = File::Spec->catfile($todir,"$me.pm");
+    }
+    my($fh) = FileHandle->new(">$to") or Carp::croak "Can't open >$to: $!";
+    $fh->print(
+	       "package Bundle::$me;\n\n",
+	       "\$VERSION = '0.01';\n\n",
+	       "1;\n\n",
+	       "__END__\n\n",
+	       "=head1 NAME\n\n",
+	       "Bundle::$me - Snapshot of installation on ",
+	       $Config::Config{'myhostname'},
+	       " on ",
+	       scalar(localtime),
+	       "\n\n=head1 SYNOPSIS\n\n",
+	       "perl -MCPAN -e 'install Bundle::$me'\n\n",
+	       "=head1 CONTENTS\n\n",
+	       join("\n", @bundle),
+	       "\n\n=head1 CONFIGURATION\n\n",
+	       Config->myconfig,
+	       "\n\n=head1 AUTHOR\n\n",
+	       "This Bundle has been generated automatically ",
+	       "by the autobundle routine in CPAN.pm.\n",
+	      );
+    $fh->close;
+    $CPAN::Frontend->myprint("\nWrote bundle file
+    $to\n\n");
+}
+
+#-> sub CPAN::Shell::expandany ;
+sub expandany {
+    my($self,$s) = @_;
+    CPAN->debug("s[$s]") if $CPAN::DEBUG;
+    if ($s =~ m|/|) { # looks like a file
+        $s = CPAN::Distribution->normalize($s);
+        return $CPAN::META->instance('CPAN::Distribution',$s);
+        # Distributions spring into existence, not expand
+    } elsif ($s =~ m|^Bundle::|) {
+        $self->local_bundles; # scanning so late for bundles seems
+                              # both attractive and crumpy: always
+                              # current state but easy to forget
+                              # somewhere
+        return $self->expand('Bundle',$s);
+    } else {
+        return $self->expand('Module',$s)
+            if $CPAN::META->exists('CPAN::Module',$s);
+    }
+    return;
+}
+
+#-> sub CPAN::Shell::expand ;
+sub expand {
+    shift;
+    my($type,@args) = @_;
+    my($arg,@m);
+    CPAN->debug("type[$type]args[@args]") if $CPAN::DEBUG;
+    for $arg (@args) {
+	my($regex,$command);
+	if ($arg =~ m|^/(.*)/$|) {
+	    $regex = $1;
+	} elsif ($arg =~ m/=/) {
+            $command = 1;
+        }
+	my $class = "CPAN::$type";
+	my $obj;
+        CPAN->debug(sprintf "class[%s]regex[%s]command[%s]",
+                    $class,
+                    defined $regex ? $regex : "UNDEFINED",
+                    $command || "UNDEFINED",
+                   ) if $CPAN::DEBUG;
+	if (defined $regex) {
+            for $obj (
+                      sort
+                      {$a->id cmp $b->id}
+                      $CPAN::META->all_objects($class)
+                     ) {
+                unless ($obj->id){
+                    # BUG, we got an empty object somewhere
+                    require Data::Dumper;
+                    CPAN->debug(sprintf(
+                                        "Bug in CPAN: Empty id on obj[%s][%s]",
+                                        $obj,
+                                        Data::Dumper::Dumper($obj)
+                                       )) if $CPAN::DEBUG;
+                    next;
+                }
+                push @m, $obj
+                    if $obj->id =~ /$regex/i
+                        or
+                            (
+                             (
+                              $] < 5.00303 ### provide sort of
+                              ### compatibility with 5.003
+                              ||
+                              $obj->can('name')
+                             )
+                             &&
+                             $obj->name  =~ /$regex/i
+                            );
+            }
+        } elsif ($command) {
+            die "equal sign in command disabled (immature interface), ".
+                "you can set
+ ! \$CPAN::Shell::ADVANCED_QUERY=1
+to enable it. But please note, this is HIGHLY EXPERIMENTAL code
+that may go away anytime.\n"
+                    unless $ADVANCED_QUERY;
+            my($method,$criterion) = $arg =~ /(.+?)=(.+)/;
+            my($matchcrit) = $criterion =~ m/^~(.+)/;
+            for my $self (
+                          sort
+                          {$a->id cmp $b->id}
+                          $CPAN::META->all_objects($class)
+                         ) {
+                my $lhs = $self->$method() or next; # () for 5.00503
+                if ($matchcrit) {
+                    push @m, $self if $lhs =~ m/$matchcrit/;
+                } else {
+                    push @m, $self if $lhs eq $criterion;
+                }
+            }
+	} else {
+	    my($xarg) = $arg;
+	    if ( $type eq 'Bundle' ) {
+		$xarg =~ s/^(Bundle::)?(.*)/Bundle::$2/;
+	    } elsif ($type eq "Distribution") {
+                $xarg = CPAN::Distribution->normalize($arg);
+            }
+	    if ($CPAN::META->exists($class,$xarg)) {
+		$obj = $CPAN::META->instance($class,$xarg);
+	    } elsif ($CPAN::META->exists($class,$arg)) {
+		$obj = $CPAN::META->instance($class,$arg);
+	    } else {
+		next;
+	    }
+	    push @m, $obj;
+	}
+    }
+    return wantarray ? @m : $m[0];
+}
+
+#-> sub CPAN::Shell::format_result ;
+sub format_result {
+    my($self) = shift;
+    my($type,@args) = @_;
+    @args = '/./' unless @args;
+    my(@result) = $self->expand($type,@args);
+    my $result = @result == 1 ?
+	$result[0]->as_string :
+            @result == 0 ?
+                "No objects of type $type found for argument @args\n" :
+                    join("",
+                         (map {$_->as_glimpse} @result),
+                         scalar @result, " items found\n",
+                        );
+    $result;
+}
+
+# The only reason for this method is currently to have a reliable
+# debugging utility that reveals which output is going through which
+# channel. No, I don't like the colors ;-)
+
+#-> sub CPAN::Shell::print_ornameted ;
+sub print_ornamented {
+    my($self,$what,$ornament) = @_;
+    my $longest = 0;
+    return unless defined $what;
+
+    if ($CPAN::Config->{term_is_latin}){
+        # courtesy jhi:
+        $what
+            =~ s{([\xC0-\xDF])([\x80-\xBF])}{chr(ord($1)<<6&0xC0|ord($2)&0x3F)}eg; #};
+    }
+    if ($PRINT_ORNAMENTING) {
+	unless (defined &color) {
+	    if ($CPAN::META->has_inst("Term::ANSIColor")) {
+		import Term::ANSIColor "color";
+	    } else {
+		*color = sub { return "" };
+	    }
+	}
+	my $line;
+	for $line (split /\n/, $what) {
+	    $longest = length($line) if length($line) > $longest;
+	}
+	my $sprintf = "%-" . $longest . "s";
+	while ($what){
+	    $what =~ s/(.*\n?)//m;
+	    my $line = $1;
+	    last unless $line;
+	    my($nl) = chomp $line ? "\n" : "";
+	    #	print "line[$line]ornament[$ornament]sprintf[$sprintf]\n";
+	    print color($ornament), sprintf($sprintf,$line), color("reset"), $nl;
+	}
+    } else {
+        # chomp $what;
+        # $what .= "\n"; # newlines unless $PRINT_ORNAMENTING
+	print $what;
+    }
+}
+
+sub myprint {
+    my($self,$what) = @_;
+
+    $self->print_ornamented($what, 'bold blue on_yellow');
+}
+
+sub myexit {
+    my($self,$what) = @_;
+    $self->myprint($what);
+    exit;
+}
+
+sub mywarn {
+    my($self,$what) = @_;
+    $self->print_ornamented($what, 'bold red on_yellow');
+}
+
+sub myconfess {
+    my($self,$what) = @_;
+    $self->print_ornamented($what, 'bold red on_white');
+    Carp::confess "died";
+}
+
+sub mydie {
+    my($self,$what) = @_;
+    $self->print_ornamented($what, 'bold red on_white');
+    die "\n";
+}
+
+sub setup_output {
+    return if -t STDOUT;
+    my $odef = select STDERR;
+    $| = 1;
+    select STDOUT;
+    $| = 1;
+    select $odef;
+}
+
+#-> sub CPAN::Shell::rematein ;
+# RE-adme||MA-ke||TE-st||IN-stall
+sub rematein {
+    shift;
+    my($meth,@some) = @_;
+    my $pragma = "";
+    if ($meth eq 'force') {
+	$pragma = $meth;
+	$meth = shift @some;
+    }
+    setup_output();
+    CPAN->debug("pragma[$pragma]meth[$meth] some[@some]") if $CPAN::DEBUG;
+
+    # Here is the place to set "test_count" on all involved parties to
+    # 0. We then can pass this counter on to the involved
+    # distributions and those can refuse to test if test_count > X. In
+    # the first stab at it we could use a 1 for "X".
+
+    # But when do I reset the distributions to start with 0 again?
+    # Jost suggested to have a random or cycling interaction ID that
+    # we pass through. But the ID is something that is just left lying
+    # around in addition to the counter, so I'd prefer to set the
+    # counter to 0 now, and repeat at the end of the loop. But what
+    # about dependencies? They appear later and are not reset, they
+    # enter the queue but not its copy. How do they get a sensible
+    # test_count?
+
+    # construct the queue
+    my($s,@s,@qcopy);
+    foreach $s (@some) {
+	my $obj;
+	if (ref $s) {
+            CPAN->debug("s is an object[$s]") if $CPAN::DEBUG;
+	    $obj = $s;
+	} elsif ($s =~ m|^/|) { # looks like a regexp
+            $CPAN::Frontend->mywarn("Sorry, $meth with a regular expression is ".
+                                    "not supported\n");
+            sleep 2;
+            next;
+	} else {
+            CPAN->debug("calling expandany [$s]") if $CPAN::DEBUG;
+	    $obj = CPAN::Shell->expandany($s);
+	}
+	if (ref $obj) {
+            $obj->color_cmd_tmps(0,1);
+            CPAN::Queue->new($obj->id);
+            push @qcopy, $obj;
+	} elsif ($CPAN::META->exists('CPAN::Author',$s)) {
+	    $obj = $CPAN::META->instance('CPAN::Author',$s);
+            if ($meth =~ /^(dump|ls)$/) {
+                $obj->$meth();
+            } else {
+                $CPAN::Frontend->myprint(
+                                         join "",
+                                         "Don't be silly, you can't $meth ",
+                                         $obj->fullname,
+                                         " ;-)\n"
+                                        );
+                sleep 2;
+            }
+	} else {
+	    $CPAN::Frontend
+		->myprint(qq{Warning: Cannot $meth $s, }.
+			  qq{don\'t know what it is.
+Try the command
+
+    i /$s/
+
+to find objects with matching identifiers.
+});
+            sleep 2;
+	}
+    }
+
+    # queuerunner (please be warned: when I started to change the
+    # queue to hold objects instead of names, I made one or two
+    # mistakes and never found which. I reverted back instead)
+    while ($s = CPAN::Queue->first) {
+        my $obj;
+	if (ref $s) {
+	    $obj = $s; # I do not believe, we would survive if this happened
+	} else {
+	    $obj = CPAN::Shell->expandany($s);
+	}
+        if ($pragma
+            &&
+            ($] < 5.00303 || $obj->can($pragma))){
+            ### compatibility with 5.003
+            $obj->$pragma($meth); # the pragma "force" in
+                                  # "CPAN::Distribution" must know
+                                  # what we are intending
+        }
+        if ($]>=5.00303 && $obj->can('called_for')) {
+            $obj->called_for($s);
+        }
+        CPAN->debug(
+                    qq{pragma[$pragma]meth[$meth]obj[$obj]as_string\[}.
+                    $obj->as_string.
+                    qq{\]}
+                   ) if $CPAN::DEBUG;
+
+        if ($obj->$meth()){
+            CPAN::Queue->delete($s);
+        } else {
+            CPAN->debug("failed");
+        }
+
+        $obj->undelay;
+	CPAN::Queue->delete_first($s);
+    }
+    for my $obj (@qcopy) {
+        $obj->color_cmd_tmps(0,0);
+    }
+}
+
+#-> sub CPAN::Shell::dump ;
+sub dump    { shift->rematein('dump',@_); }
+#-> sub CPAN::Shell::force ;
+sub force   { shift->rematein('force',@_); }
+#-> sub CPAN::Shell::get ;
+sub get     { shift->rematein('get',@_); }
+#-> sub CPAN::Shell::readme ;
+sub readme  { shift->rematein('readme',@_); }
+#-> sub CPAN::Shell::make ;
+sub make    { shift->rematein('make',@_); }
+#-> sub CPAN::Shell::test ;
+sub test    { shift->rematein('test',@_); }
+#-> sub CPAN::Shell::install ;
+sub install { shift->rematein('install',@_); }
+#-> sub CPAN::Shell::clean ;
+sub clean   { shift->rematein('clean',@_); }
+#-> sub CPAN::Shell::look ;
+sub look   { shift->rematein('look',@_); }
+#-> sub CPAN::Shell::cvs_import ;
+sub cvs_import   { shift->rematein('cvs_import',@_); }
+
+package CPAN::LWP::UserAgent;
+
+sub config {
+    return if $SETUPDONE;
+    if ($CPAN::META->has_usable('LWP::UserAgent')) {
+        require LWP::UserAgent;
+        @ISA = qw(Exporter LWP::UserAgent);
+        $SETUPDONE++;
+    } else {
+        $CPAN::Frontend->mywarn("LWP::UserAgent not available\n");
+    }
+}
+
+sub get_basic_credentials {
+    my($self, $realm, $uri, $proxy) = @_;
+    return unless $proxy;
+    if ($USER && $PASSWD) {
+    } elsif (defined $CPAN::Config->{proxy_user} &&
+             defined $CPAN::Config->{proxy_pass}) {
+        $USER = $CPAN::Config->{proxy_user};
+        $PASSWD = $CPAN::Config->{proxy_pass};
+    } else {
+        require ExtUtils::MakeMaker;
+        ExtUtils::MakeMaker->import(qw(prompt));
+        $USER = prompt("Proxy authentication needed!
+ (Note: to permanently configure username and password run
+   o conf proxy_user your_username
+   o conf proxy_pass your_password
+ )\nUsername:");
+        if ($CPAN::META->has_inst("Term::ReadKey")) {
+            Term::ReadKey::ReadMode("noecho");
+        } else {
+            $CPAN::Frontend->mywarn("Warning: Term::ReadKey seems not to be available, your password will be echoed to the terminal!\n");
+        }
+        $PASSWD = prompt("Password:");
+        if ($CPAN::META->has_inst("Term::ReadKey")) {
+            Term::ReadKey::ReadMode("restore");
+        }
+        $CPAN::Frontend->myprint("\n\n");
+    }
+    return($USER,$PASSWD);
+}
+
+# mirror(): Its purpose is to deal with proxy authentication. When we
+# call SUPER::mirror, we relly call the mirror method in
+# LWP::UserAgent. LWP::UserAgent will then call
+# $self->get_basic_credentials or some equivalent and this will be
+# $self->dispatched to our own get_basic_credentials method.
+
+# Our own get_basic_credentials sets $USER and $PASSWD, two globals.
+
+# 407 stands for HTTP_PROXY_AUTHENTICATION_REQUIRED. Which means
+# although we have gone through our get_basic_credentials, the proxy
+# server refuses to connect. This could be a case where the username or
+# password has changed in the meantime, so I'm trying once again without
+# $USER and $PASSWD to give the get_basic_credentials routine another
+# chance to set $USER and $PASSWD.
+
+sub mirror {
+    my($self,$url,$aslocal) = @_;
+    my $result = $self->SUPER::mirror($url,$aslocal);
+    if ($result->code == 407) {
+        undef $USER;
+        undef $PASSWD;
+        $result = $self->SUPER::mirror($url,$aslocal);
+    }
+    $result;
+}
+
+package CPAN::FTP;
+
+#-> sub CPAN::FTP::ftp_get ;
+sub ftp_get {
+  my($class,$host,$dir,$file,$target) = @_;
+  $class->debug(
+		qq[Going to fetch file [$file] from dir [$dir]
+	on host [$host] as local [$target]\n]
+		      ) if $CPAN::DEBUG;
+  my $ftp = Net::FTP->new($host);
+  return 0 unless defined $ftp;
+  $ftp->debug(1) if $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG;
+  $class->debug(qq[Going to login("anonymous","$Config::Config{cf_email}")]);
+  unless ( $ftp->login("anonymous",$Config::Config{'cf_email'}) ){
+    warn "Couldn't login on $host";
+    return;
+  }
+  unless ( $ftp->cwd($dir) ){
+    warn "Couldn't cwd $dir";
+    return;
+  }
+  $ftp->binary;
+  $class->debug(qq[Going to ->get("$file","$target")\n]) if $CPAN::DEBUG;
+  unless ( $ftp->get($file,$target) ){
+    warn "Couldn't fetch $file from $host\n";
+    return;
+  }
+  $ftp->quit; # it's ok if this fails
+  return 1;
+}
+
+# If more accuracy is wanted/needed, Chris Leach sent me this patch...
+
+ # > *** /install/perl/live/lib/CPAN.pm-	Wed Sep 24 13:08:48 1997
+ # > --- /tmp/cp	Wed Sep 24 13:26:40 1997
+ # > ***************
+ # > *** 1562,1567 ****
+ # > --- 1562,1580 ----
+ # >       return 1 if substr($url,0,4) eq "file";
+ # >       return 1 unless $url =~ m|://([^/]+)|;
+ # >       my $host = $1;
+ # > +     my $proxy = $CPAN::Config->{'http_proxy'} || $ENV{'http_proxy'};
+ # > +     if ($proxy) {
+ # > +         $proxy =~ m|://([^/:]+)|;
+ # > +         $proxy = $1;
+ # > +         my $noproxy = $CPAN::Config->{'no_proxy'} || $ENV{'no_proxy'};
+ # > +         if ($noproxy) {
+ # > +             if ($host !~ /$noproxy$/) {
+ # > +                 $host = $proxy;
+ # > +             }
+ # > +         } else {
+ # > +             $host = $proxy;
+ # > +         }
+ # > +     }
+ # >       require Net::Ping;
+ # >       return 1 unless $Net::Ping::VERSION >= 2;
+ # >       my $p;
+
+
+#-> sub CPAN::FTP::localize ;
+sub localize {
+    my($self,$file,$aslocal,$force) = @_;
+    $force ||= 0;
+    Carp::croak "Usage: ->localize(cpan_file,as_local_file[,$force])"
+	unless defined $aslocal;
+    $self->debug("file[$file] aslocal[$aslocal] force[$force]")
+	if $CPAN::DEBUG;
+
+    if ($^O eq 'MacOS') {
+        # Comment by AK on 2000-09-03: Uniq short filenames would be
+        # available in CHECKSUMS file
+        my($name, $path) = File::Basename::fileparse($aslocal, '');
+        if (length($name) > 31) {
+            $name =~ s/(
+                        \.(
+                           readme(\.(gz|Z))? |
+                           (tar\.)?(gz|Z) |
+                           tgz |
+                           zip |
+                           pm\.(gz|Z)
+                          )
+                       )$//x;
+            my $suf = $1;
+            my $size = 31 - length($suf);
+            while (length($name) > $size) {
+                chop $name;
+            }
+            $name .= $suf;
+            $aslocal = File::Spec->catfile($path, $name);
+        }
+    }
+
+    return $aslocal if -f $aslocal && -r _ && !($force & 1);
+    my($restore) = 0;
+    if (-f $aslocal){
+	rename $aslocal, "$aslocal.bak";
+	$restore++;
+    }
+
+    my($aslocal_dir) = File::Basename::dirname($aslocal);
+    File::Path::mkpath($aslocal_dir);
+    $CPAN::Frontend->mywarn(qq{Warning: You are not allowed to write into }.
+	qq{directory "$aslocal_dir".
+    I\'ll continue, but if you encounter problems, they may be due
+    to insufficient permissions.\n}) unless -w $aslocal_dir;
+
+    # Inheritance is not easier to manage than a few if/else branches
+    if ($CPAN::META->has_usable('LWP::UserAgent')) {
+ 	unless ($Ua) {
+            CPAN::LWP::UserAgent->config;
+	    eval {$Ua = CPAN::LWP::UserAgent->new;}; # Why is has_usable still not fit enough?
+            if ($@) {
+                $CPAN::Frontend->mywarn("CPAN::LWP::UserAgent->new dies with $@\n")
+                    if $CPAN::DEBUG;
+            } else {
+                my($var);
+                $Ua->proxy('ftp',  $var)
+                    if $var = $CPAN::Config->{ftp_proxy} || $ENV{ftp_proxy};
+                $Ua->proxy('http', $var)
+                    if $var = $CPAN::Config->{http_proxy} || $ENV{http_proxy};
+
+
+# >>>>> On Wed, 13 Dec 2000 09:21:34 -0500, "Robison, Jonathon (J.M.)" <jrobiso2@visteon.com> said:
+# 
+#  > I note that although CPAN.pm can use proxies, it doesn't seem equipped to
+#  > use ones that require basic autorization.
+#  
+#  > Example of when I use it manually in my own stuff:
+#  
+#  > $ua->proxy(['http','ftp'], http://my.proxy.server:83');
+#  > $req->proxy_authorization_basic("username","password");
+#  > $res = $ua->request($req);
+# 
+
+                $Ua->no_proxy($var)
+                    if $var = $CPAN::Config->{no_proxy} || $ENV{no_proxy};
+            }
+	}
+    }
+    for my $prx (qw(ftp_proxy http_proxy no_proxy)) {
+        $ENV{$prx} = $CPAN::Config->{$prx} if $CPAN::Config->{$prx};
+    }
+
+    # Try the list of urls for each single object. We keep a record
+    # where we did get a file from
+    my(@reordered,$last);
+    $CPAN::Config->{urllist} ||= [];
+    unless (ref $CPAN::Config->{urllist} eq 'ARRAY') {
+        warn "Malformed urllist; ignoring.  Configuration file corrupt?\n";
+    }
+    $last = $#{$CPAN::Config->{urllist}};
+    if ($force & 2) { # local cpans probably out of date, don't reorder
+	@reordered = (0..$last);
+    } else {
+	@reordered =
+	    sort {
+		(substr($CPAN::Config->{urllist}[$b],0,4) eq "file")
+		    <=>
+		(substr($CPAN::Config->{urllist}[$a],0,4) eq "file")
+		    or
+		defined($Thesite)
+		    and
+		($b == $Thesite)
+		    <=>
+		($a == $Thesite)
+	    } 0..$last;
+    }
+    my(@levels);
+    if ($Themethod) {
+	@levels = ($Themethod, grep {$_ ne $Themethod} qw/easy hard hardest/);
+    } else {
+	@levels = qw/easy hard hardest/;
+    }
+    @levels = qw/easy/ if $^O eq 'MacOS';
+    my($levelno);
+    for $levelno (0..$#levels) {
+        my $level = $levels[$levelno];
+	my $method = "host$level";
+	my @host_seq = $level eq "easy" ?
+	    @reordered : 0..$last;  # reordered has CDROM up front
+	@host_seq = (0) unless @host_seq;
+	my $ret = $self->$method(\@host_seq,$file,$aslocal);
+	if ($ret) {
+	  $Themethod = $level;
+	  my $now = time;
+	  # utime $now, $now, $aslocal; # too bad, if we do that, we
+                                      # might alter a local mirror
+	  $self->debug("level[$level]") if $CPAN::DEBUG;
+	  return $ret;
+	} else {
+	  unlink $aslocal;
+          last if $CPAN::Signal; # need to cleanup
+	}
+    }
+    unless ($CPAN::Signal) {
+        my(@mess);
+        push @mess,
+            qq{Please check, if the URLs I found in your configuration file \(}.
+                join(", ", @{$CPAN::Config->{urllist}}).
+                    qq{\) are valid. The urllist can be edited.},
+                        qq{E.g. with 'o conf urllist push ftp://myurl/'};
+        $CPAN::Frontend->myprint(Text::Wrap::wrap("","",@mess). "\n\n");
+        sleep 2;
+        $CPAN::Frontend->myprint("Could not fetch $file\n");
+    }
+    if ($restore) {
+	rename "$aslocal.bak", $aslocal;
+	$CPAN::Frontend->myprint("Trying to get away with old file:\n" .
+				 $self->ls($aslocal));
+	return $aslocal;
+    }
+    return;
+}
+
+sub hosteasy {
+    my($self,$host_seq,$file,$aslocal) = @_;
+    my($i);
+  HOSTEASY: for $i (@$host_seq) {
+        my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
+	$url .= "/" unless substr($url,-1) eq "/";
+	$url .= $file;
+	$self->debug("localizing perlish[$url]") if $CPAN::DEBUG;
+	if ($url =~ /^file:/) {
+	    my $l;
+	    if ($CPAN::META->has_inst('URI::URL')) {
+		my $u =  URI::URL->new($url);
+		$l = $u->path;
+	    } else { # works only on Unix, is poorly constructed, but
+		# hopefully better than nothing.
+		# RFC 1738 says fileurl BNF is
+		# fileurl = "file://" [ host | "localhost" ] "/" fpath
+		# Thanks to "Mark D. Baushke" <mdb@cisco.com> for
+		# the code
+		($l = $url) =~ s|^file://[^/]*/|/|; # discard the host part
+		$l =~ s|^file:||;                   # assume they
+                                                    # meant
+                                                    # file://localhost
+		$l =~ s|^/||s unless -f $l;         # e.g. /P:
+		$self->debug("without URI::URL we try local file $l") if $CPAN::DEBUG;
+	    }
+	    if ( -f $l && -r _) {
+		$Thesite = $i;
+		return $l;
+	    }
+	    # Maybe mirror has compressed it?
+	    if (-f "$l.gz") {
+		$self->debug("found compressed $l.gz") if $CPAN::DEBUG;
+		CPAN::Tarzip->gunzip("$l.gz", $aslocal);
+		if ( -f $aslocal) {
+		    $Thesite = $i;
+		    return $aslocal;
+		}
+	    }
+	}
+        if ($CPAN::META->has_usable('LWP')) {
+	  $CPAN::Frontend->myprint("Fetching with LWP:
+  $url
+");
+	  unless ($Ua) {
+              CPAN::LWP::UserAgent->config;
+              eval { $Ua = CPAN::LWP::UserAgent->new; };
+              if ($@) {
+                  $CPAN::Frontend->mywarn("CPAN::LWP::UserAgent->new dies with $@\n");
+              }
+	  }
+	  my $res = $Ua->mirror($url, $aslocal);
+	  if ($res->is_success) {
+	    $Thesite = $i;
+	    my $now = time;
+	    utime $now, $now, $aslocal; # download time is more
+                                        # important than upload time
+	    return $aslocal;
+	  } elsif ($url !~ /\.gz(?!\n)\Z/) {
+	    my $gzurl = "$url.gz";
+	    $CPAN::Frontend->myprint("Fetching with LWP:
+  $gzurl
+");
+	    $res = $Ua->mirror($gzurl, "$aslocal.gz");
+	    if ($res->is_success &&
+		CPAN::Tarzip->gunzip("$aslocal.gz",$aslocal)
+	       ) {
+	      $Thesite = $i;
+	      return $aslocal;
+	    }
+	  } else {
+              $CPAN::Frontend->myprint(sprintf(
+                                               "LWP failed with code[%s] message[%s]\n",
+                                               $res->code,
+                                               $res->message,
+                                              ));
+	    # Alan Burlison informed me that in firewall environments
+	    # Net::FTP can still succeed where LWP fails. So we do not
+	    # skip Net::FTP anymore when LWP is available.
+	  }
+	} else {
+            $CPAN::Frontend->myprint("LWP not available\n");
+	}
+        return if $CPAN::Signal;
+	if ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
+	    # that's the nice and easy way thanks to Graham
+	    my($host,$dir,$getfile) = ($1,$2,$3);
+	    if ($CPAN::META->has_usable('Net::FTP')) {
+		$dir =~ s|/+|/|g;
+		$CPAN::Frontend->myprint("Fetching with Net::FTP:
+  $url
+");
+		$self->debug("getfile[$getfile]dir[$dir]host[$host]" .
+			     "aslocal[$aslocal]") if $CPAN::DEBUG;
+		if (CPAN::FTP->ftp_get($host,$dir,$getfile,$aslocal)) {
+		    $Thesite = $i;
+		    return $aslocal;
+		}
+		if ($aslocal !~ /\.gz(?!\n)\Z/) {
+		    my $gz = "$aslocal.gz";
+		    $CPAN::Frontend->myprint("Fetching with Net::FTP
+  $url.gz
+");
+		   if (CPAN::FTP->ftp_get($host,
+					   $dir,
+					   "$getfile.gz",
+					   $gz) &&
+			CPAN::Tarzip->gunzip($gz,$aslocal)
+		       ){
+			$Thesite = $i;
+			return $aslocal;
+		    }
+		}
+		# next HOSTEASY;
+	    }
+	}
+        return if $CPAN::Signal;
+    }
+}
+
+sub hosthard {
+  my($self,$host_seq,$file,$aslocal) = @_;
+
+  # Came back if Net::FTP couldn't establish connection (or
+  # failed otherwise) Maybe they are behind a firewall, but they
+  # gave us a socksified (or other) ftp program...
+
+  my($i);
+  my($devnull) = $CPAN::Config->{devnull} || "";
+  # < /dev/null ";
+  my($aslocal_dir) = File::Basename::dirname($aslocal);
+  File::Path::mkpath($aslocal_dir);
+  HOSTHARD: for $i (@$host_seq) {
+	my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
+	$url .= "/" unless substr($url,-1) eq "/";
+	$url .= $file;
+	my($proto,$host,$dir,$getfile);
+
+	# Courtesy Mark Conty mark_conty@cargill.com change from
+	# if ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
+	# to
+	if ($url =~ m|^([^:]+)://(.*?)/(.*)/(.*)|) {
+	  # proto not yet used
+	  ($proto,$host,$dir,$getfile) = ($1,$2,$3,$4);
+	} else {
+	  next HOSTHARD; # who said, we could ftp anything except ftp?
+	}
+        next HOSTHARD if $proto eq "file"; # file URLs would have had
+                                           # success above. Likely a bogus URL
+
+	$self->debug("localizing funkyftpwise[$url]") if $CPAN::DEBUG;
+	my($f,$funkyftp);
+	for $f ('lynx','ncftpget','ncftp','wget') {
+	  next unless exists $CPAN::Config->{$f};
+	  $funkyftp = $CPAN::Config->{$f};
+	  next unless defined $funkyftp;
+	  next if $funkyftp =~ /^\s*$/;
+	  my($asl_ungz, $asl_gz);
+	  ($asl_ungz = $aslocal) =~ s/\.gz//;
+          $asl_gz = "$asl_ungz.gz";
+	  my($src_switch) = "";
+	  if ($f eq "lynx"){
+	    $src_switch = " -source";
+	  } elsif ($f eq "ncftp"){
+	    $src_switch = " -c";
+          } elsif ($f eq "wget"){
+              $src_switch = " -O -";
+	  }
+	  my($chdir) = "";
+	  my($stdout_redir) = " > $asl_ungz";
+	  if ($f eq "ncftpget"){
+	    $chdir = "cd $aslocal_dir && ";
+	    $stdout_redir = "";
+	  }
+	  $CPAN::Frontend->myprint(
+				   qq[
+Trying with "$funkyftp$src_switch" to get
+    $url
+]);
+	  my($system) =
+	      "$chdir$funkyftp$src_switch \"$url\" $devnull$stdout_redir";
+	  $self->debug("system[$system]") if $CPAN::DEBUG;
+	  my($wstatus);
+	  if (($wstatus = system($system)) == 0
+	      &&
+	      ($f eq "lynx" ?
+	       -s $asl_ungz # lynx returns 0 when it fails somewhere
+	       : 1
+	      )
+	     ) {
+	    if (-s $aslocal) {
+	      # Looks good
+	    } elsif ($asl_ungz ne $aslocal) {
+	      # test gzip integrity
+	      if (CPAN::Tarzip->gtest($asl_ungz)) {
+                  # e.g. foo.tar is gzipped --> foo.tar.gz
+                  rename $asl_ungz, $aslocal;
+	      } else {
+                  CPAN::Tarzip->gzip($asl_ungz,$asl_gz);
+	      }
+	    }
+	    $Thesite = $i;
+	    return $aslocal;
+	  } elsif ($url !~ /\.gz(?!\n)\Z/) {
+	    unlink $asl_ungz if
+		-f $asl_ungz && -s _ == 0;
+	    my $gz = "$aslocal.gz";
+	    my $gzurl = "$url.gz";
+	    $CPAN::Frontend->myprint(
+				     qq[
+Trying with "$funkyftp$src_switch" to get
+  $url.gz
+]);
+	    my($system) = "$funkyftp$src_switch \"$url.gz\" $devnull > $asl_gz";
+	    $self->debug("system[$system]") if $CPAN::DEBUG;
+	    my($wstatus);
+	    if (($wstatus = system($system)) == 0
+		&&
+		-s $asl_gz
+	       ) {
+	      # test gzip integrity
+	      if (CPAN::Tarzip->gtest($asl_gz)) {
+                  CPAN::Tarzip->gunzip($asl_gz,$aslocal);
+	      } else {
+                  # somebody uncompressed file for us?
+                  rename $asl_ungz, $aslocal;
+	      }
+	      $Thesite = $i;
+	      return $aslocal;
+	    } else {
+	      unlink $asl_gz if -f $asl_gz;
+	    }
+	  } else {
+	    my $estatus = $wstatus >> 8;
+	    my $size = -f $aslocal ?
+		", left\n$aslocal with size ".-s _ :
+		    "\nWarning: expected file [$aslocal] doesn't exist";
+	    $CPAN::Frontend->myprint(qq{
+System call "$system"
+returned status $estatus (wstat $wstatus)$size
+});
+	  }
+          return if $CPAN::Signal;
+	} # lynx,ncftpget,ncftp
+    } # host
+}
+
+sub hosthardest {
+    my($self,$host_seq,$file,$aslocal) = @_;
+
+    my($i);
+    my($aslocal_dir) = File::Basename::dirname($aslocal);
+    File::Path::mkpath($aslocal_dir);
+    my $ftpbin = $CPAN::Config->{ftp};
+  HOSTHARDEST: for $i (@$host_seq) {
+	unless (length $ftpbin && MM->maybe_command($ftpbin)) {
+	    $CPAN::Frontend->myprint("No external ftp command available\n\n");
+	    last HOSTHARDEST;
+	}
+	my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
+	$url .= "/" unless substr($url,-1) eq "/";
+	$url .= $file;
+	$self->debug("localizing ftpwise[$url]") if $CPAN::DEBUG;
+	unless ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
+	    next;
+	}
+	my($host,$dir,$getfile) = ($1,$2,$3);
+	my $timestamp = 0;
+	my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,
+	   $ctime,$blksize,$blocks) = stat($aslocal);
+	$timestamp = $mtime ||= 0;
+	my($netrc) = CPAN::FTP::netrc->new;
+	my($netrcfile) = $netrc->netrc;
+	my($verbose) = $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG ? " -v" : "";
+	my $targetfile = File::Basename::basename($aslocal);
+	my(@dialog);
+	push(
+	     @dialog,
+	     "lcd $aslocal_dir",
+	     "cd /",
+	     map("cd $_", split /\//, $dir), # RFC 1738
+	     "bin",
+	     "get $getfile $targetfile",
+	     "quit"
+	    );
+	if (! $netrcfile) {
+	    CPAN->debug("No ~/.netrc file found") if $CPAN::DEBUG;
+	} elsif ($netrc->hasdefault || $netrc->contains($host)) {
+	    CPAN->debug(sprintf("hasdef[%d]cont($host)[%d]",
+				$netrc->hasdefault,
+				$netrc->contains($host))) if $CPAN::DEBUG;
+	    if ($netrc->protected) {
+		$CPAN::Frontend->myprint(qq{
+  Trying with external ftp to get
+    $url
+  As this requires some features that are not thoroughly tested, we\'re
+  not sure, that we get it right....
+
+}
+		     );
+		$self->talk_ftp("$ftpbin$verbose $host",
+				@dialog);
+		($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+		 $atime,$mtime,$ctime,$blksize,$blocks) = stat($aslocal);
+		$mtime ||= 0;
+		if ($mtime > $timestamp) {
+		    $CPAN::Frontend->myprint("GOT $aslocal\n");
+		    $Thesite = $i;
+		    return $aslocal;
+		} else {
+		    $CPAN::Frontend->myprint("Hmm... Still failed!\n");
+		}
+                return if $CPAN::Signal;
+	    } else {
+		$CPAN::Frontend->mywarn(qq{Your $netrcfile is not }.
+					qq{correctly protected.\n});
+	    }
+	} else {
+	    $CPAN::Frontend->mywarn("Your ~/.netrc neither contains $host
+  nor does it have a default entry\n");
+	}
+
+	# OK, they don't have a valid ~/.netrc. Use 'ftp -n'
+	# then and login manually to host, using e-mail as
+	# password.
+	$CPAN::Frontend->myprint(qq{Issuing "$ftpbin$verbose -n"\n});
+	unshift(
+		@dialog,
+		"open $host",
+		"user anonymous $Config::Config{'cf_email'}"
+	       );
+	$self->talk_ftp("$ftpbin$verbose -n", @dialog);
+	($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+	 $atime,$mtime,$ctime,$blksize,$blocks) = stat($aslocal);
+	$mtime ||= 0;
+	if ($mtime > $timestamp) {
+	    $CPAN::Frontend->myprint("GOT $aslocal\n");
+	    $Thesite = $i;
+	    return $aslocal;
+	} else {
+	    $CPAN::Frontend->myprint("Bad luck... Still failed!\n");
+	}
+        return if $CPAN::Signal;
+	$CPAN::Frontend->myprint("Can't access URL $url.\n\n");
+	sleep 2;
+    } # host
+}
+
+sub talk_ftp {
+    my($self,$command,@dialog) = @_;
+    my $fh = FileHandle->new;
+    $fh->open("|$command") or die "Couldn't open ftp: $!";
+    foreach (@dialog) { $fh->print("$_\n") }
+    $fh->close;		# Wait for process to complete
+    my $wstatus = $?;
+    my $estatus = $wstatus >> 8;
+    $CPAN::Frontend->myprint(qq{
+Subprocess "|$command"
+  returned status $estatus (wstat $wstatus)
+}) if $wstatus;
+}
+
+# find2perl needs modularization, too, all the following is stolen
+# from there
+# CPAN::FTP::ls
+sub ls {
+    my($self,$name) = @_;
+    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$sizemm,
+     $atime,$mtime,$ctime,$blksize,$blocks) = lstat($name);
+
+    my($perms,%user,%group);
+    my $pname = $name;
+
+    if ($blocks) {
+	$blocks = int(($blocks + 1) / 2);
+    }
+    else {
+	$blocks = int(($sizemm + 1023) / 1024);
+    }
+
+    if    (-f _) { $perms = '-'; }
+    elsif (-d _) { $perms = 'd'; }
+    elsif (-c _) { $perms = 'c'; $sizemm = &sizemm; }
+    elsif (-b _) { $perms = 'b'; $sizemm = &sizemm; }
+    elsif (-p _) { $perms = 'p'; }
+    elsif (-S _) { $perms = 's'; }
+    else         { $perms = 'l'; $pname .= ' -> ' . readlink($_); }
+
+    my(@rwx) = ('---','--x','-w-','-wx','r--','r-x','rw-','rwx');
+    my(@moname) = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
+    my $tmpmode = $mode;
+    my $tmp = $rwx[$tmpmode & 7];
+    $tmpmode >>= 3;
+    $tmp = $rwx[$tmpmode & 7] . $tmp;
+    $tmpmode >>= 3;
+    $tmp = $rwx[$tmpmode & 7] . $tmp;
+    substr($tmp,2,1) =~ tr/-x/Ss/ if -u _;
+    substr($tmp,5,1) =~ tr/-x/Ss/ if -g _;
+    substr($tmp,8,1) =~ tr/-x/Tt/ if -k _;
+    $perms .= $tmp;
+
+    my $user = $user{$uid} || $uid;   # too lazy to implement lookup
+    my $group = $group{$gid} || $gid;
+
+    my($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime);
+    my($timeyear);
+    my($moname) = $moname[$mon];
+    if (-M _ > 365.25 / 2) {
+	$timeyear = $year + 1900;
+    }
+    else {
+	$timeyear = sprintf("%02d:%02d", $hour, $min);
+    }
+
+    sprintf "%5lu %4ld %-10s %2d %-8s %-8s %8s %s %2d %5s %s\n",
+	    $ino,
+		 $blocks,
+		      $perms,
+			    $nlink,
+				$user,
+				     $group,
+					  $sizemm,
+					      $moname,
+						 $mday,
+						     $timeyear,
+							 $pname;
+}
+
+package CPAN::FTP::netrc;
+
+sub new {
+    my($class) = @_;
+    my $file = File::Spec->catfile($ENV{HOME},".netrc");
+
+    my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+       $atime,$mtime,$ctime,$blksize,$blocks)
+	= stat($file);
+    $mode ||= 0;
+    my $protected = 0;
+
+    my($fh,@machines,$hasdefault);
+    $hasdefault = 0;
+    $fh = FileHandle->new or die "Could not create a filehandle";
+
+    if($fh->open($file)){
+	$protected = ($mode & 077) == 0;
+	local($/) = "";
+      NETRC: while (<$fh>) {
+	    my(@tokens) = split " ", $_;
+	  TOKEN: while (@tokens) {
+		my($t) = shift @tokens;
+		if ($t eq "default"){
+		    $hasdefault++;
+		    last NETRC;
+		}
+		last TOKEN if $t eq "macdef";
+		if ($t eq "machine") {
+		    push @machines, shift @tokens;
+		}
+	    }
+	}
+    } else {
+	$file = $hasdefault = $protected = "";
+    }
+
+    bless {
+	   'mach' => [@machines],
+	   'netrc' => $file,
+	   'hasdefault' => $hasdefault,
+	   'protected' => $protected,
+	  }, $class;
+}
+
+# CPAN::FTP::hasdefault;
+sub hasdefault { shift->{'hasdefault'} }
+sub netrc      { shift->{'netrc'}      }
+sub protected  { shift->{'protected'}  }
+sub contains {
+    my($self,$mach) = @_;
+    for ( @{$self->{'mach'}} ) {
+	return 1 if $_ eq $mach;
+    }
+    return 0;
+}
+
+package CPAN::Complete;
+
+sub gnu_cpl {
+    my($text, $line, $start, $end) = @_;
+    my(@perlret) = cpl($text, $line, $start);
+    # find longest common match. Can anybody show me how to peruse
+    # T::R::Gnu to have this done automatically? Seems expensive.
+    return () unless @perlret;
+    my($newtext) = $text;
+    for (my $i = length($text)+1;;$i++) {
+	last unless length($perlret[0]) && length($perlret[0]) >= $i;
+	my $try = substr($perlret[0],0,$i);
+	my @tries = grep {substr($_,0,$i) eq $try} @perlret;
+	# warn "try[$try]tries[@tries]";
+	if (@tries == @perlret) {
+	    $newtext = $try;
+	} else {
+	    last;
+	}
+    }
+    ($newtext,@perlret);
+}
+
+#-> sub CPAN::Complete::cpl ;
+sub cpl {
+    my($word,$line,$pos) = @_;
+    $word ||= "";
+    $line ||= "";
+    $pos ||= 0;
+    CPAN->debug("word [$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
+    $line =~ s/^\s*//;
+    if ($line =~ s/^(force\s*)//) {
+	$pos -= length($1);
+    }
+    my @return;
+    if ($pos == 0) {
+	@return = grep /^$word/, @CPAN::Complete::COMMANDS;
+    } elsif ( $line !~ /^[\!abcdghimorutl]/ ) {
+	@return = ();
+    } elsif ($line =~ /^(a|ls)\s/) {
+	@return = cplx('CPAN::Author',uc($word));
+    } elsif ($line =~ /^b\s/) {
+        CPAN::Shell->local_bundles;
+	@return = cplx('CPAN::Bundle',$word);
+    } elsif ($line =~ /^d\s/) {
+	@return = cplx('CPAN::Distribution',$word);
+    } elsif ($line =~ m/^(
+                          [mru]|make|clean|dump|get|test|install|readme|look|cvs_import
+                         )\s/x ) {
+        if ($word =~ /^Bundle::/) {
+            CPAN::Shell->local_bundles;
+        }
+	@return = (cplx('CPAN::Module',$word),cplx('CPAN::Bundle',$word));
+    } elsif ($line =~ /^i\s/) {
+	@return = cpl_any($word);
+    } elsif ($line =~ /^reload\s/) {
+	@return = cpl_reload($word,$line,$pos);
+    } elsif ($line =~ /^o\s/) {
+	@return = cpl_option($word,$line,$pos);
+    } elsif ($line =~ m/^\S+\s/ ) {
+        # fallback for future commands and what we have forgotten above
+	@return = (cplx('CPAN::Module',$word),cplx('CPAN::Bundle',$word));
+    } else {
+	@return = ();
+    }
+    return @return;
+}
+
+#-> sub CPAN::Complete::cplx ;
+sub cplx {
+    my($class, $word) = @_;
+    # I believed for many years that this was sorted, today I
+    # realized, it wasn't sorted anymore. Now (rev 1.301 / v 1.55) I
+    # make it sorted again. Maybe sort was dropped when GNU-readline
+    # support came in? The RCS file is difficult to read on that:-(
+    sort grep /^\Q$word\E/, map { $_->id } $CPAN::META->all_objects($class);
+}
+
+#-> sub CPAN::Complete::cpl_any ;
+sub cpl_any {
+    my($word) = shift;
+    return (
+	    cplx('CPAN::Author',$word),
+	    cplx('CPAN::Bundle',$word),
+	    cplx('CPAN::Distribution',$word),
+	    cplx('CPAN::Module',$word),
+	   );
+}
+
+#-> sub CPAN::Complete::cpl_reload ;
+sub cpl_reload {
+    my($word,$line,$pos) = @_;
+    $word ||= "";
+    my(@words) = split " ", $line;
+    CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
+    my(@ok) = qw(cpan index);
+    return @ok if @words == 1;
+    return grep /^\Q$word\E/, @ok if @words == 2 && $word;
+}
+
+#-> sub CPAN::Complete::cpl_option ;
+sub cpl_option {
+    my($word,$line,$pos) = @_;
+    $word ||= "";
+    my(@words) = split " ", $line;
+    CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
+    my(@ok) = qw(conf debug);
+    return @ok if @words == 1;
+    return grep /^\Q$word\E/, @ok if @words == 2 && length($word);
+    if (0) {
+    } elsif ($words[1] eq 'index') {
+	return ();
+    } elsif ($words[1] eq 'conf') {
+	return CPAN::Config::cpl(@_);
+    } elsif ($words[1] eq 'debug') {
+	return sort grep /^\Q$word\E/, sort keys %CPAN::DEBUG, 'all';
+    }
+}
+
+package CPAN::Index;
+
+#-> sub CPAN::Index::force_reload ;
+sub force_reload {
+    my($class) = @_;
+    $CPAN::Index::LAST_TIME = 0;
+    $class->reload(1);
+}
+
+#-> sub CPAN::Index::reload ;
+sub reload {
+    my($cl,$force) = @_;
+    my $time = time;
+
+    # XXX check if a newer one is available. (We currently read it
+    # from time to time)
+    for ($CPAN::Config->{index_expire}) {
+	$_ = 0.001 unless $_ && $_ > 0.001;
+    }
+    unless (1 || $CPAN::Have_warned->{readmetadatacache}++) {
+        # debug here when CPAN doesn't seem to read the Metadata
+        require Carp;
+        Carp::cluck("META-PROTOCOL[$CPAN::META->{PROTOCOL}]");
+    }
+    unless ($CPAN::META->{PROTOCOL}) {
+        $cl->read_metadata_cache;
+        $CPAN::META->{PROTOCOL} ||= "1.0";
+    }
+    if ( $CPAN::META->{PROTOCOL} < PROTOCOL  ) {
+        # warn "Setting last_time to 0";
+        $LAST_TIME = 0; # No warning necessary
+    }
+    return if $LAST_TIME + $CPAN::Config->{index_expire}*86400 > $time
+	and ! $force;
+    if (0) {
+        # IFF we are developing, it helps to wipe out the memory
+        # between reloads, otherwise it is not what a user expects.
+        undef $CPAN::META; # Neue Gruendlichkeit since v1.52(r1.274)
+        $CPAN::META = CPAN->new;
+    }
+    {
+        my($debug,$t2);
+        local $LAST_TIME = $time;
+        local $CPAN::META->{PROTOCOL} = PROTOCOL;
+
+        my $needshort = $^O eq "dos";
+
+        $cl->rd_authindex($cl
+                          ->reload_x(
+                                     "authors/01mailrc.txt.gz",
+                                     $needshort ?
+                                     File::Spec->catfile('authors', '01mailrc.gz') :
+                                     File::Spec->catfile('authors', '01mailrc.txt.gz'),
+                                     $force));
+        $t2 = time;
+        $debug = "timing reading 01[".($t2 - $time)."]";
+        $time = $t2;
+        return if $CPAN::Signal; # this is sometimes lengthy
+        $cl->rd_modpacks($cl
+                         ->reload_x(
+                                    "modules/02packages.details.txt.gz",
+                                    $needshort ?
+                                    File::Spec->catfile('modules', '02packag.gz') :
+                                    File::Spec->catfile('modules', '02packages.details.txt.gz'),
+                                    $force));
+        $t2 = time;
+        $debug .= "02[".($t2 - $time)."]";
+        $time = $t2;
+        return if $CPAN::Signal; # this is sometimes lengthy
+        $cl->rd_modlist($cl
+                        ->reload_x(
+                                   "modules/03modlist.data.gz",
+                                   $needshort ?
+                                   File::Spec->catfile('modules', '03mlist.gz') :
+                                   File::Spec->catfile('modules', '03modlist.data.gz'),
+                                   $force));
+        $cl->write_metadata_cache;
+        $t2 = time;
+        $debug .= "03[".($t2 - $time)."]";
+        $time = $t2;
+        CPAN->debug($debug) if $CPAN::DEBUG;
+    }
+    $LAST_TIME = $time;
+    $CPAN::META->{PROTOCOL} = PROTOCOL;
+}
+
+#-> sub CPAN::Index::reload_x ;
+sub reload_x {
+    my($cl,$wanted,$localname,$force) = @_;
+    $force |= 2; # means we're dealing with an index here
+    CPAN::Config->load; # we should guarantee loading wherever we rely
+                        # on Config XXX
+    $localname ||= $wanted;
+    my $abs_wanted = File::Spec->catfile($CPAN::Config->{'keep_source_where'},
+					 $localname);
+    if (
+	-f $abs_wanted &&
+	-M $abs_wanted < $CPAN::Config->{'index_expire'} &&
+	!($force & 1)
+       ) {
+	my $s = $CPAN::Config->{'index_expire'} == 1 ? "" : "s";
+	$cl->debug(qq{$abs_wanted younger than $CPAN::Config->{'index_expire'} }.
+		   qq{day$s. I\'ll use that.});
+	return $abs_wanted;
+    } else {
+	$force |= 1; # means we're quite serious about it.
+    }
+    return CPAN::FTP->localize($wanted,$abs_wanted,$force);
+}
+
+#-> sub CPAN::Index::rd_authindex ;
+sub rd_authindex {
+    my($cl, $index_target) = @_;
+    my @lines;
+    return unless defined $index_target;
+    $CPAN::Frontend->myprint("Going to read $index_target\n");
+    local(*FH);
+    tie *FH, CPAN::Tarzip, $index_target;
+    local($/) = "\n";
+    push @lines, split /\012/ while <FH>;
+    foreach (@lines) {
+	my($userid,$fullname,$email) =
+	    m/alias\s+(\S+)\s+\"([^\"\<]+)\s+\<([^\>]+)\>\"/;
+	next unless $userid && $fullname && $email;
+
+	# instantiate an author object
+ 	my $userobj = $CPAN::META->instance('CPAN::Author',$userid);
+	$userobj->set('FULLNAME' => $fullname, 'EMAIL' => $email);
+	return if $CPAN::Signal;
+    }
+}
+
+sub userid {
+  my($self,$dist) = @_;
+  $dist = $self->{'id'} unless defined $dist;
+  my($ret) = $dist =~ m|(?:\w/\w\w/)?([^/]+)/|;
+  $ret;
+}
+
+#-> sub CPAN::Index::rd_modpacks ;
+sub rd_modpacks {
+    my($self, $index_target) = @_;
+    my @lines;
+    return unless defined $index_target;
+    $CPAN::Frontend->myprint("Going to read $index_target\n");
+    my $fh = CPAN::Tarzip->TIEHANDLE($index_target);
+    local($/) = "\n";
+    while ($_ = $fh->READLINE) {
+	s/\012/\n/g;
+	my @ls = map {"$_\n"} split /\n/, $_;
+	unshift @ls, "\n" x length($1) if /^(\n+)/;
+	push @lines, @ls;
+    }
+    # read header
+    my($line_count,$last_updated);
+    while (@lines) {
+	my $shift = shift(@lines);
+	last if $shift =~ /^\s*$/;
+	$shift =~ /^Line-Count:\s+(\d+)/ and $line_count = $1;
+        $shift =~ /^Last-Updated:\s+(.+)/ and $last_updated = $1;
+    }
+    if (not defined $line_count) {
+
+	warn qq{Warning: Your $index_target does not contain a Line-Count header.
+Please check the validity of the index file by comparing it to more
+than one CPAN mirror. I'll continue but problems seem likely to
+happen.\a
+};
+
+	sleep 5;
+    } elsif ($line_count != scalar @lines) {
+
+	warn sprintf qq{Warning: Your %s
+contains a Line-Count header of %d but I see %d lines there. Please
+check the validity of the index file by comparing it to more than one
+CPAN mirror. I'll continue but problems seem likely to happen.\a\n},
+$index_target, $line_count, scalar(@lines);
+
+    }
+    if (not defined $last_updated) {
+
+	warn qq{Warning: Your $index_target does not contain a Last-Updated header.
+Please check the validity of the index file by comparing it to more
+than one CPAN mirror. I'll continue but problems seem likely to
+happen.\a
+};
+
+	sleep 5;
+    } else {
+
+	$CPAN::Frontend
+            ->myprint(sprintf qq{  Database was generated on %s\n},
+                      $last_updated);
+        $DATE_OF_02 = $last_updated;
+
+        if ($CPAN::META->has_inst(HTTP::Date)) {
+            require HTTP::Date;
+            my($age) = (time - HTTP::Date::str2time($last_updated))/3600/24;
+            if ($age > 30) {
+
+                $CPAN::Frontend
+                    ->mywarn(sprintf
+                             qq{Warning: This index file is %d days old.
+  Please check the host you chose as your CPAN mirror for staleness.
+  I'll continue but problems seem likely to happen.\a\n},
+                             $age);
+
+            }
+        } else {
+            $CPAN::Frontend->myprint("  HTTP::Date not available\n");
+        }
+    }
+
+
+    # A necessity since we have metadata_cache: delete what isn't
+    # there anymore
+    my $secondtime = $CPAN::META->exists("CPAN::Module","CPAN");
+    CPAN->debug("secondtime[$secondtime]") if $CPAN::DEBUG;
+    my(%exists);
+    foreach (@lines) {
+	chomp;
+        # before 1.56 we split into 3 and discarded the rest. From
+        # 1.57 we assign remaining text to $comment thus allowing to
+        # influence isa_perl
+	my($mod,$version,$dist,$comment) = split " ", $_, 4;
+	my($bundle,$id,$userid);
+
+	if ($mod eq 'CPAN' &&
+	    ! (
+	       CPAN::Queue->exists('Bundle::CPAN') ||
+	       CPAN::Queue->exists('CPAN')
+	      )
+	   ) {
+            local($^W)= 0;
+            if ($version > $CPAN::VERSION){
+                $CPAN::Frontend->myprint(qq{
+  There's a new CPAN.pm version (v$version) available!
+  [Current version is v$CPAN::VERSION]
+  You might want to try
+    install Bundle::CPAN
+    reload cpan
+  without quitting the current session. It should be a seamless upgrade
+  while we are running...
+}); #});
+                sleep 2;
+		$CPAN::Frontend->myprint(qq{\n});
+	    }
+	    last if $CPAN::Signal;
+	} elsif ($mod =~ /^Bundle::(.*)/) {
+	    $bundle = $1;
+	}
+
+	if ($bundle){
+	    $id =  $CPAN::META->instance('CPAN::Bundle',$mod);
+	    # Let's make it a module too, because bundles have so much
+	    # in common with modules.
+
+            # Changed in 1.57_63: seems like memory bloat now without
+            # any value, so commented out
+
+	    # $CPAN::META->instance('CPAN::Module',$mod);
+
+	} else {
+
+	    # instantiate a module object
+	    $id = $CPAN::META->instance('CPAN::Module',$mod);
+
+	}
+
+	if ($id->cpan_file ne $dist){ # update only if file is
+                                      # different. CPAN prohibits same
+                                      # name with different version
+	    $userid = $id->userid || $self->userid($dist);
+	    $id->set(
+		     'CPAN_USERID' => $userid,
+		     'CPAN_VERSION' => $version,
+		     'CPAN_FILE' => $dist,
+		    );
+	}
+
+	# instantiate a distribution object
+	if ($CPAN::META->exists('CPAN::Distribution',$dist)) {
+	  # we do not need CONTAINSMODS unless we do something with
+	  # this dist, so we better produce it on demand.
+
+	  ## my $obj = $CPAN::META->instance(
+	  ## 				  'CPAN::Distribution' => $dist
+	  ## 				 );
+	  ## $obj->{CONTAINSMODS}{$mod} = undef; # experimental
+	} else {
+	  $CPAN::META->instance(
+				'CPAN::Distribution' => $dist
+			       )->set(
+				      'CPAN_USERID' => $userid,
+                                      'CPAN_COMMENT' => $comment,
+				     );
+	}
+        if ($secondtime) {
+            for my $name ($mod,$dist) {
+                CPAN->debug("exists name[$name]") if $CPAN::DEBUG;
+                $exists{$name} = undef;
+            }
+        }
+	return if $CPAN::Signal;
+    }
+    undef $fh;
+    if ($secondtime) {
+        for my $class (qw(CPAN::Module CPAN::Bundle CPAN::Distribution)) {
+            for my $o ($CPAN::META->all_objects($class)) {
+                next if exists $exists{$o->{ID}};
+                $CPAN::META->delete($class,$o->{ID});
+                CPAN->debug("deleting ID[$o->{ID}] in class[$class]")
+                    if $CPAN::DEBUG;
+            }
+        }
+    }
+}
+
+#-> sub CPAN::Index::rd_modlist ;
+sub rd_modlist {
+    my($cl,$index_target) = @_;
+    return unless defined $index_target;
+    $CPAN::Frontend->myprint("Going to read $index_target\n");
+    my $fh = CPAN::Tarzip->TIEHANDLE($index_target);
+    my @eval;
+    local($/) = "\n";
+    while ($_ = $fh->READLINE) {
+	s/\012/\n/g;
+	my @ls = map {"$_\n"} split /\n/, $_;
+	unshift @ls, "\n" x length($1) if /^(\n+)/;
+	push @eval, @ls;
+    }
+    while (@eval) {
+	my $shift = shift(@eval);
+	if ($shift =~ /^Date:\s+(.*)/){
+	    return if $DATE_OF_03 eq $1;
+	    ($DATE_OF_03) = $1;
+	}
+	last if $shift =~ /^\s*$/;
+    }
+    undef $fh;
+    push @eval, q{CPAN::Modulelist->data;};
+    local($^W) = 0;
+    my($comp) = Safe->new("CPAN::Safe1");
+    my($eval) = join("", @eval);
+    my $ret = $comp->reval($eval);
+    Carp::confess($@) if $@;
+    return if $CPAN::Signal;
+    for (keys %$ret) {
+	my $obj = $CPAN::META->instance("CPAN::Module",$_);
+        delete $ret->{$_}{modid}; # not needed here, maybe elsewhere
+	$obj->set(%{$ret->{$_}});
+	return if $CPAN::Signal;
+    }
+}
+
+#-> sub CPAN::Index::write_metadata_cache ;
+sub write_metadata_cache {
+    my($self) = @_;
+    return unless $CPAN::Config->{'cache_metadata'};
+    return unless $CPAN::META->has_usable("Storable");
+    my $cache;
+    foreach my $k (qw(CPAN::Bundle CPAN::Author CPAN::Module
+		      CPAN::Distribution)) {
+	$cache->{$k} = $CPAN::META->{readonly}{$k}; # unsafe meta access, ok
+    }
+    my $metadata_file = File::Spec->catfile($CPAN::Config->{cpan_home},"Metadata");
+    $cache->{last_time} = $LAST_TIME;
+    $cache->{DATE_OF_02} = $DATE_OF_02;
+    $cache->{PROTOCOL} = PROTOCOL;
+    $CPAN::Frontend->myprint("Going to write $metadata_file\n");
+    eval { Storable::nstore($cache, $metadata_file) };
+    $CPAN::Frontend->mywarn($@) if $@; # ?? missing "\n" after $@ in mywarn ??
+}
+
+#-> sub CPAN::Index::read_metadata_cache ;
+sub read_metadata_cache {
+    my($self) = @_;
+    return unless $CPAN::Config->{'cache_metadata'};
+    return unless $CPAN::META->has_usable("Storable");
+    my $metadata_file = File::Spec->catfile($CPAN::Config->{cpan_home},"Metadata");
+    return unless -r $metadata_file and -f $metadata_file;
+    $CPAN::Frontend->myprint("Going to read $metadata_file\n");
+    my $cache;
+    eval { $cache = Storable::retrieve($metadata_file) };
+    $CPAN::Frontend->mywarn($@) if $@; # ?? missing "\n" after $@ in mywarn ??
+    if (!$cache || ref $cache ne 'HASH'){
+        $LAST_TIME = 0;
+        return;
+    }
+    if (exists $cache->{PROTOCOL}) {
+        if (PROTOCOL > $cache->{PROTOCOL}) {
+            $CPAN::Frontend->mywarn(sprintf("Ignoring Metadata cache written ".
+                                            "with protocol v%s, requiring v%s\n",
+                                            $cache->{PROTOCOL},
+                                            PROTOCOL)
+                                   );
+            return;
+        }
+    } else {
+        $CPAN::Frontend->mywarn("Ignoring Metadata cache written ".
+                                "with protocol v1.0\n");
+        return;
+    }
+    my $clcnt = 0;
+    my $idcnt = 0;
+    while(my($class,$v) = each %$cache) {
+	next unless $class =~ /^CPAN::/;
+	$CPAN::META->{readonly}{$class} = $v; # unsafe meta access, ok
+        while (my($id,$ro) = each %$v) {
+            $CPAN::META->{readwrite}{$class}{$id} ||=
+                $class->new(ID=>$id, RO=>$ro);
+            $idcnt++;
+        }
+        $clcnt++;
+    }
+    unless ($clcnt) { # sanity check
+        $CPAN::Frontend->myprint("Warning: Found no data in $metadata_file\n");
+        return;
+    }
+    if ($idcnt < 1000) {
+        $CPAN::Frontend->myprint("Warning: Found only $idcnt objects ".
+                                 "in $metadata_file\n");
+        return;
+    }
+    $CPAN::META->{PROTOCOL} ||=
+        $cache->{PROTOCOL}; # reading does not up or downgrade, but it
+                            # does initialize to some protocol
+    $LAST_TIME = $cache->{last_time};
+    $DATE_OF_02 = $cache->{DATE_OF_02};
+    $CPAN::Frontend->myprint("  Database was generated on $DATE_OF_02\n")
+	if defined $DATE_OF_02; # An old cache may not contain DATE_OF_02
+    return;
+}
+
+package CPAN::InfoObj;
+
+# Accessors
+sub cpan_userid {
+    my $self = shift;
+    $self->{RO}{CPAN_USERID}
+}
+
+sub id { shift->{ID}; }
+
+#-> sub CPAN::InfoObj::new ;
+sub new {
+    my $this = bless {}, shift;
+    %$this = @_;
+    $this
+}
+
+# The set method may only be used by code that reads index data or
+# otherwise "objective" data from the outside world. All session
+# related material may do anything else with instance variables but
+# must not touch the hash under the RO attribute. The reason is that
+# the RO hash gets written to Metadata file and is thus persistent.
+
+#-> sub CPAN::InfoObj::set ;
+sub set {
+    my($self,%att) = @_;
+    my $class = ref $self;
+
+    # This must be ||=, not ||, because only if we write an empty
+    # reference, only then the set method will write into the readonly
+    # area. But for Distributions that spring into existence, maybe
+    # because of a typo, we do not like it that they are written into
+    # the readonly area and made permanent (at least for a while) and
+    # that is why we do not "allow" other places to call ->set.
+    unless ($self->id) {
+        CPAN->debug("Bug? Empty ID, rejecting");
+        return;
+    }
+    my $ro = $self->{RO} =
+        $CPAN::META->{readonly}{$class}{$self->id} ||= {};
+
+    while (my($k,$v) = each %att) {
+        $ro->{$k} = $v;
+    }
+}
+
+#-> sub CPAN::InfoObj::as_glimpse ;
+sub as_glimpse {
+    my($self) = @_;
+    my(@m);
+    my $class = ref($self);
+    $class =~ s/^CPAN:://;
+    push @m, sprintf "%-15s %s\n", $class, $self->{ID};
+    join "", @m;
+}
+
+#-> sub CPAN::InfoObj::as_string ;
+sub as_string {
+    my($self) = @_;
+    my(@m);
+    my $class = ref($self);
+    $class =~ s/^CPAN:://;
+    push @m, $class, " id = $self->{ID}\n";
+    for (sort keys %{$self->{RO}}) {
+	# next if m/^(ID|RO)$/;
+	my $extra = "";
+	if ($_ eq "CPAN_USERID") {
+            $extra .= " (".$self->author;
+            my $email; # old perls!
+            if ($email = $CPAN::META->instance("CPAN::Author",
+                                               $self->cpan_userid
+                                              )->email) {
+                $extra .= " <$email>";
+            } else {
+                $extra .= " <no email>";
+            }
+            $extra .= ")";
+        } elsif ($_ eq "FULLNAME") { # potential UTF-8 conversion
+            push @m, sprintf "    %-12s %s\n", $_, $self->fullname;
+            next;
+        }
+        next unless defined $self->{RO}{$_};
+        push @m, sprintf "    %-12s %s%s\n", $_, $self->{RO}{$_}, $extra;
+    }
+    for (sort keys %$self) {
+	next if m/^(ID|RO)$/;
+	if (ref($self->{$_}) eq "ARRAY") {
+	  push @m, sprintf "    %-12s %s\n", $_, "@{$self->{$_}}";
+	} elsif (ref($self->{$_}) eq "HASH") {
+	  push @m, sprintf(
+			   "    %-12s %s\n",
+			   $_,
+			   join(" ",keys %{$self->{$_}}),
+                          );
+	} else {
+	  push @m, sprintf "    %-12s %s\n", $_, $self->{$_};
+	}
+    }
+    join "", @m, "\n";
+}
+
+#-> sub CPAN::InfoObj::author ;
+sub author {
+    my($self) = @_;
+    $CPAN::META->instance("CPAN::Author",$self->cpan_userid)->fullname;
+}
+
+#-> sub CPAN::InfoObj::dump ;
+sub dump {
+  my($self) = @_;
+  require Data::Dumper;
+  print Data::Dumper::Dumper($self);
+}
+
+package CPAN::Author;
+
+#-> sub CPAN::Author::id
+sub id {
+    my $self = shift;
+    my $id = $self->{ID};
+    $CPAN::Frontend->mydie("Illegal author id[$id]") unless $id =~ /^[A-Z]/;
+    $id;
+}
+
+#-> sub CPAN::Author::as_glimpse ;
+sub as_glimpse {
+    my($self) = @_;
+    my(@m);
+    my $class = ref($self);
+    $class =~ s/^CPAN:://;
+    push @m, sprintf(qq{%-15s %s ("%s" <%s>)\n},
+                     $class,
+                     $self->{ID},
+                     $self->fullname,
+                     $self->email);
+    join "", @m;
+}
+
+#-> sub CPAN::Author::fullname ;
+sub fullname {
+    shift->{RO}{FULLNAME};
+}
+*name = \&fullname;
+
+#-> sub CPAN::Author::email ;
+sub email    { shift->{RO}{EMAIL}; }
+
+#-> sub CPAN::Author::ls ;
+sub ls {
+    my $self = shift;
+    my $id = $self->id;
+
+    # adapted from CPAN::Distribution::verifyMD5 ;
+    my(@csf); # chksumfile
+    @csf = $self->id =~ /(.)(.)(.*)/;
+    $csf[1] = join "", @csf[0,1];
+    $csf[2] = join "", @csf[1,2];
+    my(@dl);
+    @dl = $self->dir_listing([$csf[0],"CHECKSUMS"], 0);
+    unless (grep {$_->[2] eq $csf[1]} @dl) {
+        $CPAN::Frontend->myprint("No files in the directory of $id\n");
+        return;
+    }
+    @dl = $self->dir_listing([@csf[0,1],"CHECKSUMS"], 0);
+    unless (grep {$_->[2] eq $csf[2]} @dl) {
+        $CPAN::Frontend->myprint("No files in the directory of $id\n");
+        return;
+    }
+    @dl = $self->dir_listing([@csf,"CHECKSUMS"], 1);
+    $CPAN::Frontend->myprint(join "", map {
+        sprintf("%8d %10s %s/%s\n", $_->[0], $_->[1], $id, $_->[2])
+    } sort { $a->[2] cmp $b->[2] } @dl);
+}
+
+# returns an array of arrays, the latter contain (size,mtime,filename)
+#-> sub CPAN::Author::dir_listing ;
+sub dir_listing {
+    my $self = shift;
+    my $chksumfile = shift;
+    my $recursive = shift;
+    my $lc_want =
+	File::Spec->catfile($CPAN::Config->{keep_source_where},
+			    "authors", "id", @$chksumfile);
+    local($") = "/";
+    # connect "force" argument with "index_expire".
+    my $force = 0;
+    if (my @stat = stat $lc_want) {
+        $force = $stat[9] + $CPAN::Config->{index_expire}*86400 <= time;
+    }
+    my $lc_file = CPAN::FTP->localize("authors/id/@$chksumfile",
+                                      $lc_want,$force);
+    unless ($lc_file) {
+        $CPAN::Frontend->myprint("Trying $lc_want.gz\n");
+	$chksumfile->[-1] .= ".gz";
+	$lc_file = CPAN::FTP->localize("authors/id/@$chksumfile",
+                                       "$lc_want.gz",1);
+	if ($lc_file) {
+	    $lc_file =~ s{\.gz(?!\n)\Z}{}; #};
+	    CPAN::Tarzip->gunzip("$lc_file.gz",$lc_file);
+	} else {
+	    return;
+	}
+    }
+
+    # adapted from CPAN::Distribution::MD5_check_file ;
+    my $fh = FileHandle->new;
+    my($cksum);
+    if (open $fh, $lc_file){
+	local($/);
+	my $eval = <$fh>;
+	$eval =~ s/\015?\012/\n/g;
+	close $fh;
+	my($comp) = Safe->new();
+	$cksum = $comp->reval($eval);
+	if ($@) {
+	    rename $lc_file, "$lc_file.bad";
+	    Carp::confess($@) if $@;
+	}
+    } else {
+	Carp::carp "Could not open $lc_file for reading";
+    }
+    my(@result,$f);
+    for $f (sort keys %$cksum) {
+        if (exists $cksum->{$f}{isdir}) {
+            if ($recursive) {
+                my(@dir) = @$chksumfile;
+                pop @dir;
+                push @dir, $f, "CHECKSUMS";
+                push @result, map {
+                    [$_->[0], $_->[1], "$f/$_->[2]"]
+                } $self->dir_listing(\@dir,1);
+            } else {
+                push @result, [ 0, "-", $f ];
+            }
+        } else {
+            push @result, [
+                           ($cksum->{$f}{"size"}||0),
+                           $cksum->{$f}{"mtime"}||"---",
+                           $f
+                          ];
+        }
+    }
+    @result;
+}
+
+package CPAN::Distribution;
+
+# Accessors
+sub cpan_comment { shift->{RO}{CPAN_COMMENT} }
+
+sub undelay {
+    my $self = shift;
+    delete $self->{later};
+}
+
+# CPAN::Distribution::normalize
+sub normalize {
+    my($self,$s) = @_;
+    $s = $self->id unless defined $s;
+    if (
+        $s =~ tr|/|| == 1
+        or
+        $s !~ m|[A-Z]/[A-Z-]{2}/[A-Z-]{2,}/|
+       ) {
+        return $s if $s =~ m:^N/A|^Contact Author: ;
+        $s =~ s|^(.)(.)([^/]*/)(.+)$|$1/$1$2/$1$2$3$4| or
+            $CPAN::Frontend->mywarn("Strange distribution name [$s]\n");
+        CPAN->debug("s[$s]") if $CPAN::DEBUG;
+    }
+    $s;
+}
+
+#-> sub CPAN::Distribution::color_cmd_tmps ;
+sub color_cmd_tmps {
+    my($self) = shift;
+    my($depth) = shift || 0;
+    my($color) = shift || 0;
+    my($ancestors) = shift || [];
+    # a distribution needs to recurse into its prereq_pms
+
+    return if exists $self->{incommandcolor}
+        && $self->{incommandcolor}==$color;
+    if ($depth>=100){
+        $CPAN::Frontend->mydie(CPAN::Exception::RecursiveDependency->new($ancestors));
+    }
+    # warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1;
+    my $prereq_pm = $self->prereq_pm;
+    if (defined $prereq_pm) {
+        for my $pre (keys %$prereq_pm) {
+            my $premo = CPAN::Shell->expand("Module",$pre);
+            $premo->color_cmd_tmps($depth+1,$color,[@$ancestors, $self->id]);
+        }
+    }
+    if ($color==0) {
+        delete $self->{sponsored_mods};
+        delete $self->{badtestcnt};
+    }
+    $self->{incommandcolor} = $color;
+}
+
+#-> sub CPAN::Distribution::as_string ;
+sub as_string {
+  my $self = shift;
+  $self->containsmods;
+  $self->SUPER::as_string(@_);
+}
+
+#-> sub CPAN::Distribution::containsmods ;
+sub containsmods {
+  my $self = shift;
+  return keys %{$self->{CONTAINSMODS}} if exists $self->{CONTAINSMODS};
+  my $dist_id = $self->{ID};
+  for my $mod ($CPAN::META->all_objects("CPAN::Module")) {
+    my $mod_file = $mod->cpan_file or next;
+    my $mod_id = $mod->{ID} or next;
+    # warn "mod_file[$mod_file] dist_id[$dist_id] mod_id[$mod_id]";
+    # sleep 1;
+    $self->{CONTAINSMODS}{$mod_id} = undef if $mod_file eq $dist_id;
+  }
+  keys %{$self->{CONTAINSMODS}};
+}
+
+#-> sub CPAN::Distribution::uptodate ;
+sub uptodate {
+    my($self) = @_;
+    my $c;
+    foreach $c ($self->containsmods) {
+        my $obj = CPAN::Shell->expandany($c);
+        return 0 unless $obj->uptodate;
+    }
+    return 1;
+}
+
+#-> sub CPAN::Distribution::called_for ;
+sub called_for {
+    my($self,$id) = @_;
+    $self->{CALLED_FOR} = $id if defined $id;
+    return $self->{CALLED_FOR};
+}
+
+#-> sub CPAN::Distribution::safe_chdir ;
+sub safe_chdir {
+    my($self,$todir) = @_;
+    # we die if we cannot chdir and we are debuggable
+    Carp::confess("safe_chdir called without todir argument")
+          unless defined $todir and length $todir;
+    if (chdir $todir) {
+        $self->debug(sprintf "changed directory to %s", CPAN::anycwd())
+            if $CPAN::DEBUG;
+    } else {
+        my $cwd = CPAN::anycwd();
+        $CPAN::Frontend->mydie(qq{Could not chdir from cwd[$cwd] }.
+                               qq{to todir[$todir]: $!});
+    }
+}
+
+#-> sub CPAN::Distribution::get ;
+sub get {
+    my($self) = @_;
+  EXCUSE: {
+	my @e;
+	exists $self->{'build_dir'} and push @e,
+	    "Is already unwrapped into directory $self->{'build_dir'}";
+	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
+    }
+    my $sub_wd = CPAN::anycwd(); # for cleaning up as good as possible
+
+    #
+    # Get the file on local disk
+    #
+
+    my($local_file);
+    my($local_wanted) =
+        File::Spec->catfile(
+			    $CPAN::Config->{keep_source_where},
+			    "authors",
+			    "id",
+			    split(/\//,$self->id)
+			   );
+
+    $self->debug("Doing localize") if $CPAN::DEBUG;
+    unless ($local_file =
+            CPAN::FTP->localize("authors/id/$self->{ID}",
+                                $local_wanted)) {
+        my $note = "";
+        if ($CPAN::Index::DATE_OF_02) {
+            $note = "Note: Current database in memory was generated ".
+                "on $CPAN::Index::DATE_OF_02\n";
+        }
+        $CPAN::Frontend->mydie("Giving up on '$local_wanted'\n$note");
+    }
+    $self->debug("local_file[$local_file]") if $CPAN::DEBUG;
+    $self->{localfile} = $local_file;
+    return if $CPAN::Signal;
+
+    #
+    # Check integrity
+    #
+    if ($CPAN::META->has_inst("Digest::MD5")) {
+	$self->debug("Digest::MD5 is installed, verifying");
+	$self->verifyMD5;
+    } else {
+	$self->debug("Digest::MD5 is NOT installed");
+    }
+    return if $CPAN::Signal;
+
+    #
+    # Create a clean room and go there
+    #
+    $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new(); # unsafe meta access, ok
+    my $builddir = $CPAN::META->{cachemgr}->dir; # unsafe meta access, ok
+    $self->safe_chdir($builddir);
+    $self->debug("Removing tmp") if $CPAN::DEBUG;
+    File::Path::rmtree("tmp");
+    mkdir "tmp", 0755 or Carp::croak "Couldn't mkdir tmp: $!";
+    if ($CPAN::Signal){
+        $self->safe_chdir($sub_wd);
+        return;
+    }
+    $self->safe_chdir("tmp");
+
+    #
+    # Unpack the goods
+    #
+    if ($local_file =~ /(\.tar\.(gz|Z)|\.tgz)(?!\n)\Z/i){
+        $self->{was_uncompressed}++ unless CPAN::Tarzip->gtest($local_file);
+	$self->untar_me($local_file);
+    } elsif ( $local_file =~ /\.zip(?!\n)\Z/i ) {
+	$self->unzip_me($local_file);
+    } elsif ( $local_file =~ /\.pm\.(gz|Z)(?!\n)\Z/) {
+        $self->{was_uncompressed}++ unless CPAN::Tarzip->gtest($local_file);
+	$self->pm2dir_me($local_file);
+    } else {
+	$self->{archived} = "NO";
+        $self->safe_chdir($sub_wd);
+        return;
+    }
+
+    # we are still in the tmp directory!
+    # Let's check if the package has its own directory.
+    my $dh = DirHandle->new(File::Spec->curdir)
+        or Carp::croak("Couldn't opendir .: $!");
+    my @readdir = grep $_ !~ /^\.\.?(?!\n)\Z/s, $dh->read; ### MAC??
+    $dh->close;
+    my ($distdir,$packagedir);
+    if (@readdir == 1 && -d $readdir[0]) {
+        $distdir = $readdir[0];
+        $packagedir = File::Spec->catdir($builddir,$distdir);
+        $self->debug("packagedir[$packagedir]builddir[$builddir]distdir[$distdir]")
+            if $CPAN::DEBUG;
+        -d $packagedir and $CPAN::Frontend->myprint("Removing previously used ".
+                                                    "$packagedir\n");
+        File::Path::rmtree($packagedir);
+        rename($distdir,$packagedir) or
+            Carp::confess("Couldn't rename $distdir to $packagedir: $!");
+        $self->debug(sprintf("renamed distdir[%s] to packagedir[%s] -e[%s]-d[%s]",
+                             $distdir,
+                             $packagedir,
+                             -e $packagedir,
+                             -d $packagedir,
+                            )) if $CPAN::DEBUG;
+    } else {
+        my $userid = $self->cpan_userid;
+        unless ($userid) {
+            CPAN->debug("no userid? self[$self]");
+            $userid = "anon";
+        }
+        my $pragmatic_dir = $userid . '000';
+        $pragmatic_dir =~ s/\W_//g;
+        $pragmatic_dir++ while -d "../$pragmatic_dir";
+        $packagedir = File::Spec->catdir($builddir,$pragmatic_dir);
+        $self->debug("packagedir[$packagedir]") if $CPAN::DEBUG;
+        File::Path::mkpath($packagedir);
+        my($f);
+        for $f (@readdir) { # is already without "." and ".."
+            my $to = File::Spec->catdir($packagedir,$f);
+            rename($f,$to) or Carp::confess("Couldn't rename $f to $to: $!");
+        }
+    }
+    if ($CPAN::Signal){
+        $self->safe_chdir($sub_wd);
+        return;
+    }
+
+    $self->{'build_dir'} = $packagedir;
+    $self->safe_chdir($builddir);
+    File::Path::rmtree("tmp");
+
+    my($mpl) = File::Spec->catfile($packagedir,"Makefile.PL");
+    my($mpl_exists) = -f $mpl;
+    unless ($mpl_exists) {
+        # NFS has been reported to have racing problems after the
+        # renaming of a directory in some environments.
+        # This trick helps.
+        sleep 1;
+        my $mpldh = DirHandle->new($packagedir)
+            or Carp::croak("Couldn't opendir $packagedir: $!");
+        $mpl_exists = grep /^Makefile\.PL$/, $mpldh->read;
+        $mpldh->close;
+    }
+    unless ($mpl_exists) {
+        $self->debug(sprintf("makefilepl[%s]anycwd[%s]",
+                             $mpl,
+                             CPAN::anycwd(),
+                            )) if $CPAN::DEBUG;
+        my($configure) = File::Spec->catfile($packagedir,"Configure");
+        if (-f $configure) {
+            # do we have anything to do?
+            $self->{'configure'} = $configure;
+        } elsif (-f File::Spec->catfile($packagedir,"Makefile")) {
+            $CPAN::Frontend->myprint(qq{
+Package comes with a Makefile and without a Makefile.PL.
+We\'ll try to build it with that Makefile then.
+});
+            $self->{writemakefile} = "YES";
+            sleep 2;
+        } else {
+            my $cf = $self->called_for || "unknown";
+            if ($cf =~ m|/|) {
+                $cf =~ s|.*/||;
+                $cf =~ s|\W.*||;
+            }
+            $cf =~ s|[/\\:]||g; # risk of filesystem damage
+            $cf = "unknown" unless length($cf);
+            $CPAN::Frontend->myprint(qq{Package seems to come without Makefile.PL.
+  (The test -f "$mpl" returned false.)
+  Writing one on our own (setting NAME to $cf)\a\n});
+            $self->{had_no_makefile_pl}++;
+            sleep 3;
+
+            # Writing our own Makefile.PL
+
+            my $fh = FileHandle->new;
+            $fh->open(">$mpl")
+                or Carp::croak("Could not open >$mpl: $!");
+            $fh->print(
+qq{# This Makefile.PL has been autogenerated by the module CPAN.pm
+# because there was no Makefile.PL supplied.
+# Autogenerated on: }.scalar localtime().qq{
+
+use ExtUtils::MakeMaker;
+WriteMakefile(NAME => q[$cf]);
+
+});
+            $fh->close;
+        }
+    }
+
+    return $self;
+}
+
+# CPAN::Distribution::untar_me ;
+sub untar_me {
+    my($self,$local_file) = @_;
+    $self->{archived} = "tar";
+    if (CPAN::Tarzip->untar($local_file)) {
+	$self->{unwrapped} = "YES";
+    } else {
+	$self->{unwrapped} = "NO";
+    }
+}
+
+# CPAN::Distribution::unzip_me ;
+sub unzip_me {
+    my($self,$local_file) = @_;
+    $self->{archived} = "zip";
+    if (CPAN::Tarzip->unzip($local_file)) {
+	$self->{unwrapped} = "YES";
+    } else {
+	$self->{unwrapped} = "NO";
+    }
+    return;
+}
+
+sub pm2dir_me {
+    my($self,$local_file) = @_;
+    $self->{archived} = "pm";
+    my $to = File::Basename::basename($local_file);
+    $to =~ s/\.(gz|Z)(?!\n)\Z//;
+    if (CPAN::Tarzip->gunzip($local_file,$to)) {
+	$self->{unwrapped} = "YES";
+    } else {
+	$self->{unwrapped} = "NO";
+    }
+}
+
+#-> sub CPAN::Distribution::new ;
+sub new {
+    my($class,%att) = @_;
+
+    # $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new();
+
+    my $this = { %att };
+    return bless $this, $class;
+}
+
+#-> sub CPAN::Distribution::look ;
+sub look {
+    my($self) = @_;
+
+    if ($^O eq 'MacOS') {
+      $self->Mac::BuildTools::look;
+      return;
+    }
+
+    if (  $CPAN::Config->{'shell'} ) {
+	$CPAN::Frontend->myprint(qq{
+Trying to open a subshell in the build directory...
+});
+    } else {
+	$CPAN::Frontend->myprint(qq{
+Your configuration does not define a value for subshells.
+Please define it with "o conf shell <your shell>"
+});
+	return;
+    }
+    my $dist = $self->id;
+    my $dir;
+    unless ($dir = $self->dir) {
+        $self->get;
+    }
+    unless ($dir ||= $self->dir) {
+	$CPAN::Frontend->mywarn(qq{
+Could not determine which directory to use for looking at $dist.
+});
+	return;
+    }
+    my $pwd  = CPAN::anycwd();
+    $self->safe_chdir($dir);
+    $CPAN::Frontend->myprint(qq{Working directory is $dir\n});
+    unless (system($CPAN::Config->{'shell'}) == 0) {
+        my $code = $? >> 8;
+        $CPAN::Frontend->mywarn("Subprocess shell exit code $code\n");
+    }
+    $self->safe_chdir($pwd);
+}
+
+# CPAN::Distribution::cvs_import ;
+sub cvs_import {
+    my($self) = @_;
+    $self->get;
+    my $dir = $self->dir;
+
+    my $package = $self->called_for;
+    my $module = $CPAN::META->instance('CPAN::Module', $package);
+    my $version = $module->cpan_version;
+
+    my $userid = $self->cpan_userid;
+
+    my $cvs_dir = (split /\//, $dir)[-1];
+    $cvs_dir =~ s/-\d+[^-]+(?!\n)\Z//;
+    my $cvs_root = 
+      $CPAN::Config->{cvsroot} || $ENV{CVSROOT};
+    my $cvs_site_perl = 
+      $CPAN::Config->{cvs_site_perl} || $ENV{CVS_SITE_PERL};
+    if ($cvs_site_perl) {
+	$cvs_dir = "$cvs_site_perl/$cvs_dir";
+    }
+    my $cvs_log = qq{"imported $package $version sources"};
+    $version =~ s/\./_/g;
+    my @cmd = ('cvs', '-d', $cvs_root, 'import', '-m', $cvs_log,
+	       "$cvs_dir", $userid, "v$version");
+
+    my $pwd  = CPAN::anycwd();
+    chdir($dir) or $CPAN::Frontend->mydie(qq{Could not chdir to "$dir": $!});
+
+    $CPAN::Frontend->myprint(qq{Working directory is $dir\n});
+
+    $CPAN::Frontend->myprint(qq{@cmd\n});
+    system(@cmd) == 0 or
+	$CPAN::Frontend->mydie("cvs import failed");
+    chdir($pwd) or $CPAN::Frontend->mydie(qq{Could not chdir to "$pwd": $!});
+}
+
+#-> sub CPAN::Distribution::readme ;
+sub readme {
+    my($self) = @_;
+    my($dist) = $self->id;
+    my($sans,$suffix) = $dist =~ /(.+)\.(tgz|tar[\._-]gz|tar\.Z|zip)$/;
+    $self->debug("sans[$sans] suffix[$suffix]\n") if $CPAN::DEBUG;
+    my($local_file);
+    my($local_wanted) =
+	 File::Spec->catfile(
+			     $CPAN::Config->{keep_source_where},
+			     "authors",
+			     "id",
+			     split(/\//,"$sans.readme"),
+			    );
+    $self->debug("Doing localize") if $CPAN::DEBUG;
+    $local_file = CPAN::FTP->localize("authors/id/$sans.readme",
+				      $local_wanted)
+	or $CPAN::Frontend->mydie(qq{No $sans.readme found});;
+
+    if ($^O eq 'MacOS') {
+        Mac::BuildTools::launch_file($local_file);
+        return;
+    }
+
+    my $fh_pager = FileHandle->new;
+    local($SIG{PIPE}) = "IGNORE";
+    $fh_pager->open("|$CPAN::Config->{'pager'}")
+	or die "Could not open pager $CPAN::Config->{'pager'}: $!";
+    my $fh_readme = FileHandle->new;
+    $fh_readme->open($local_file)
+	or $CPAN::Frontend->mydie(qq{Could not open "$local_file": $!});
+    $CPAN::Frontend->myprint(qq{
+Displaying file
+  $local_file
+with pager "$CPAN::Config->{'pager'}"
+});
+    sleep 2;
+    $fh_pager->print(<$fh_readme>);
+}
+
+#-> sub CPAN::Distribution::verifyMD5 ;
+sub verifyMD5 {
+    my($self) = @_;
+  EXCUSE: {
+	my @e;
+	$self->{MD5_STATUS} ||= "";
+	$self->{MD5_STATUS} eq "OK" and push @e, "MD5 Checksum was ok";
+	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
+    }
+    my($lc_want,$lc_file,@local,$basename);
+    @local = split(/\//,$self->id);
+    pop @local;
+    push @local, "CHECKSUMS";
+    $lc_want =
+	File::Spec->catfile($CPAN::Config->{keep_source_where},
+			    "authors", "id", @local);
+    local($") = "/";
+    if (
+	-s $lc_want
+	&&
+	$self->MD5_check_file($lc_want)
+       ) {
+	return $self->{MD5_STATUS} = "OK";
+    }
+    $lc_file = CPAN::FTP->localize("authors/id/@local",
+				   $lc_want,1);
+    unless ($lc_file) {
+        $CPAN::Frontend->myprint("Trying $lc_want.gz\n");
+	$local[-1] .= ".gz";
+	$lc_file = CPAN::FTP->localize("authors/id/@local",
+				       "$lc_want.gz",1);
+	if ($lc_file) {
+	    $lc_file =~ s/\.gz(?!\n)\Z//;
+	    CPAN::Tarzip->gunzip("$lc_file.gz",$lc_file);
+	} else {
+	    return;
+	}
+    }
+    $self->MD5_check_file($lc_file);
+}
+
+#-> sub CPAN::Distribution::MD5_check_file ;
+sub MD5_check_file {
+    my($self,$chk_file) = @_;
+    my($cksum,$file,$basename);
+    $file = $self->{localfile};
+    $basename = File::Basename::basename($file);
+    my $fh = FileHandle->new;
+    if (open $fh, $chk_file){
+	local($/);
+	my $eval = <$fh>;
+	$eval =~ s/\015?\012/\n/g;
+	close $fh;
+	my($comp) = Safe->new();
+	$cksum = $comp->reval($eval);
+	if ($@) {
+	    rename $chk_file, "$chk_file.bad";
+	    Carp::confess($@) if $@;
+	}
+    } else {
+	Carp::carp "Could not open $chk_file for reading";
+    }
+
+    if (exists $cksum->{$basename}{md5}) {
+	$self->debug("Found checksum for $basename:" .
+		     "$cksum->{$basename}{md5}\n") if $CPAN::DEBUG;
+
+	open($fh, $file);
+	binmode $fh;
+	my $eq = $self->eq_MD5($fh,$cksum->{$basename}{'md5'});
+	$fh->close;
+	$fh = CPAN::Tarzip->TIEHANDLE($file);
+
+	unless ($eq) {
+	  # had to inline it, when I tied it, the tiedness got lost on
+	  # the call to eq_MD5. (Jan 1998)
+	  my $md5 = Digest::MD5->new;
+	  my($data,$ref);
+	  $ref = \$data;
+	  while ($fh->READ($ref, 4096) > 0){
+	    $md5->add($data);
+	  }
+	  my $hexdigest = $md5->hexdigest;
+	  $eq += $hexdigest eq $cksum->{$basename}{'md5-ungz'};
+	}
+
+	if ($eq) {
+	  $CPAN::Frontend->myprint("Checksum for $file ok\n");
+	  return $self->{MD5_STATUS} = "OK";
+	} else {
+	    $CPAN::Frontend->myprint(qq{\nChecksum mismatch for }.
+				     qq{distribution file. }.
+				     qq{Please investigate.\n\n}.
+				     $self->as_string,
+				     $CPAN::META->instance(
+							   'CPAN::Author',
+							   $self->cpan_userid
+							  )->as_string);
+
+	    my $wrap = qq{I\'d recommend removing $file. Its MD5
+checksum is incorrect. Maybe you have configured your 'urllist' with
+a bad URL. Please check this array with 'o conf urllist', and
+retry.};
+
+            $CPAN::Frontend->mydie(Text::Wrap::wrap("","",$wrap));
+
+            # former versions just returned here but this seems a
+            # serious threat that deserves a die
+
+	    # $CPAN::Frontend->myprint("\n\n");
+	    # sleep 3;
+	    # return;
+	}
+	# close $fh if fileno($fh);
+    } else {
+	$self->{MD5_STATUS} ||= "";
+	if ($self->{MD5_STATUS} eq "NIL") {
+	    $CPAN::Frontend->mywarn(qq{
+Warning: No md5 checksum for $basename in $chk_file.
+
+The cause for this may be that the file is very new and the checksum
+has not yet been calculated, but it may also be that something is
+going awry right now.
+});
+            my $answer = ExtUtils::MakeMaker::prompt("Proceed?", "yes");
+            $answer =~ /^\s*y/i or $CPAN::Frontend->mydie("Aborted.");
+	}
+	$self->{MD5_STATUS} = "NIL";
+	return;
+    }
+}
+
+#-> sub CPAN::Distribution::eq_MD5 ;
+sub eq_MD5 {
+    my($self,$fh,$expectMD5) = @_;
+    my $md5 = Digest::MD5->new;
+    my($data);
+    while (read($fh, $data, 4096)){
+      $md5->add($data);
+    }
+    # $md5->addfile($fh);
+    my $hexdigest = $md5->hexdigest;
+    # warn "fh[$fh] hex[$hexdigest] aexp[$expectMD5]";
+    $hexdigest eq $expectMD5;
+}
+
+#-> sub CPAN::Distribution::force ;
+
+# Both modules and distributions know if "force" is in effect by
+# autoinspection, not by inspecting a global variable. One of the
+# reason why this was chosen to work that way was the treatment of
+# dependencies. They should not autpomatically inherit the force
+# status. But this has the downside that ^C and die() will return to
+# the prompt but will not be able to reset the force_update
+# attributes. We try to correct for it currently in the read_metadata
+# routine, and immediately before we check for a Signal. I hope this
+# works out in one of v1.57_53ff
+
+sub force {
+  my($self, $method) = @_;
+  for my $att (qw(
+  MD5_STATUS archived build_dir localfile make install unwrapped
+  writemakefile
+ )) {
+    delete $self->{$att};
+  }
+  if ($method && $method eq "install") {
+    $self->{"force_update"}++; # name should probably have been force_install
+  }
+}
+
+#-> sub CPAN::Distribution::unforce ;
+sub unforce {
+  my($self) = @_;
+  delete $self->{'force_update'};
+}
+
+#-> sub CPAN::Distribution::isa_perl ;
+sub isa_perl {
+  my($self) = @_;
+  my $file = File::Basename::basename($self->id);
+  if ($file =~ m{ ^ perl
+                  -?
+		  (5)
+		  ([._-])
+		  (
+                   \d{3}(_[0-4][0-9])?
+                   |
+                   \d*[24680]\.\d+
+                  )
+		  \.tar[._-]gz
+		  (?!\n)\Z
+		}xs){
+    return "$1.$3";
+  } elsif ($self->cpan_comment
+           &&
+           $self->cpan_comment =~ /isa_perl\(.+?\)/){
+    return $1;
+  }
+}
+
+#-> sub CPAN::Distribution::perl ;
+sub perl {
+    my($self) = @_;
+    my($perl) = File::Spec->file_name_is_absolute($^X) ? $^X : "";
+    my $pwd  = CPAN::anycwd();
+    my $candidate = File::Spec->catfile($pwd,$^X);
+    $perl ||= $candidate if MM->maybe_command($candidate);
+    unless ($perl) {
+	my ($component,$perl_name);
+      DIST_PERLNAME: foreach $perl_name ($^X, 'perl', 'perl5', "perl$]") {
+	    PATH_COMPONENT: foreach $component (File::Spec->path(),
+						$Config::Config{'binexp'}) {
+		  next unless defined($component) && $component;
+		  my($abs) = File::Spec->catfile($component,$perl_name);
+		  if (MM->maybe_command($abs)) {
+		      $perl = $abs;
+		      last DIST_PERLNAME;
+		  }
+	      }
+	  }
+    }
+    $perl;
+}
+
+#-> sub CPAN::Distribution::make ;
+sub make {
+    my($self) = @_;
+    $CPAN::Frontend->myprint(sprintf "Running make for %s\n", $self->id);
+    # Emergency brake if they said install Pippi and get newest perl
+    if ($self->isa_perl) {
+      if (
+	  $self->called_for ne $self->id &&
+          ! $self->{force_update}
+	 ) {
+        # if we die here, we break bundles
+	$CPAN::Frontend->mywarn(sprintf qq{
+The most recent version "%s" of the module "%s"
+comes with the current version of perl (%s).
+I\'ll build that only if you ask for something like
+    force install %s
+or
+    install %s
+},
+			       $CPAN::META->instance(
+						     'CPAN::Module',
+						     $self->called_for
+						    )->cpan_version,
+			       $self->called_for,
+			       $self->isa_perl,
+			       $self->called_for,
+			       $self->id);
+        sleep 5; return;
+      }
+    }
+    $self->get;
+  EXCUSE: {
+	my @e;
+	$self->{archived} eq "NO" and push @e,
+	"Is neither a tar nor a zip archive.";
+
+	$self->{unwrapped} eq "NO" and push @e,
+	"had problems unarchiving. Please build manually";
+
+	exists $self->{writemakefile} &&
+	    $self->{writemakefile} =~ m/ ^ NO\s* ( .* ) /sx and push @e,
+		$1 || "Had some problem writing Makefile";
+
+	defined $self->{'make'} and push @e,
+            "Has already been processed within this session";
+
+        exists $self->{later} and length($self->{later}) and
+            push @e, $self->{later};
+
+	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
+    }
+    $CPAN::Frontend->myprint("\n  CPAN.pm: Going to build ".$self->id."\n\n");
+    my $builddir = $self->dir;
+    chdir $builddir or Carp::croak("Couldn't chdir $builddir: $!");
+    $self->debug("Changed directory to $builddir") if $CPAN::DEBUG;
+
+    if ($^O eq 'MacOS') {
+        Mac::BuildTools::make($self);
+        return;
+    }
+
+    my $system;
+    if ($self->{'configure'}) {
+      $system = $self->{'configure'};
+    } else {
+	my($perl) = $self->perl or die "Couldn\'t find executable perl\n";
+	my $switch = "";
+# This needs a handler that can be turned on or off:
+#	$switch = "-MExtUtils::MakeMaker ".
+#	    "-Mops=:default,:filesys_read,:filesys_open,require,chdir"
+#	    if $] > 5.00310;
+	$system = "$perl $switch Makefile.PL $CPAN::Config->{makepl_arg}";
+    }
+    unless (exists $self->{writemakefile}) {
+	local($SIG{ALRM}) = sub { die "inactivity_timeout reached\n" };
+	my($ret,$pid);
+	$@ = "";
+	if ($CPAN::Config->{inactivity_timeout}) {
+	    eval {
+		alarm $CPAN::Config->{inactivity_timeout};
+		local $SIG{CHLD}; # = sub { wait };
+		if (defined($pid = fork)) {
+		    if ($pid) { #parent
+			# wait;
+			waitpid $pid, 0;
+		    } else {    #child
+		      # note, this exec isn't necessary if
+		      # inactivity_timeout is 0. On the Mac I'd
+		      # suggest, we set it always to 0.
+		      exec $system;
+		    }
+		} else {
+		    $CPAN::Frontend->myprint("Cannot fork: $!");
+		    return;
+		}
+	    };
+	    alarm 0;
+	    if ($@){
+		kill 9, $pid;
+		waitpid $pid, 0;
+		$CPAN::Frontend->myprint($@);
+		$self->{writemakefile} = "NO $@";
+		$@ = "";
+		return;
+	    }
+	} else {
+	  $ret = system($system);
+	  if ($ret != 0) {
+	    $self->{writemakefile} = "NO Makefile.PL returned status $ret";
+	    return;
+	  }
+	}
+	if (-f "Makefile") {
+	  $self->{writemakefile} = "YES";
+          delete $self->{make_clean}; # if cleaned before, enable next
+	} else {
+	  $self->{writemakefile} =
+	      qq{NO Makefile.PL refused to write a Makefile.};
+	  # It's probably worth it to record the reason, so let's retry
+	  # local $/;
+	  # my $fh = IO::File->new("$system |"); # STDERR? STDIN?
+	  # $self->{writemakefile} .= <$fh>;
+	}
+    }
+    if ($CPAN::Signal){
+      delete $self->{force_update};
+      return;
+    }
+    if (my @prereq = $self->unsat_prereq){
+      return 1 if $self->follow_prereqs(@prereq); # signal success to the queuerunner
+    }
+    $system = join " ", $CPAN::Config->{'make'}, $CPAN::Config->{make_arg};
+    if (system($system) == 0) {
+	 $CPAN::Frontend->myprint("  $system -- OK\n");
+	 $self->{'make'} = "YES";
+    } else {
+	 $self->{writemakefile} ||= "YES";
+	 $self->{'make'} = "NO";
+	 $CPAN::Frontend->myprint("  $system -- NOT OK\n");
+    }
+}
+
+sub follow_prereqs {
+    my($self) = shift;
+    my(@prereq) = @_;
+    my $id = $self->id;
+    $CPAN::Frontend->myprint("---- Unsatisfied dependencies detected ".
+                             "during [$id] -----\n");
+
+    for my $p (@prereq) {
+	$CPAN::Frontend->myprint("    $p\n");
+    }
+    my $follow = 0;
+    if ($CPAN::Config->{prerequisites_policy} eq "follow") {
+	$follow = 1;
+    } elsif ($CPAN::Config->{prerequisites_policy} eq "ask") {
+	require ExtUtils::MakeMaker;
+	my $answer = ExtUtils::MakeMaker::prompt(
+"Shall I follow them and prepend them to the queue
+of modules we are processing right now?", "yes");
+	$follow = $answer =~ /^\s*y/i;
+    } else {
+	local($") = ", ";
+	$CPAN::Frontend->
+            myprint("  Ignoring dependencies on modules @prereq\n");
+    }
+    if ($follow) {
+        # color them as dirty
+        for my $p (@prereq) {
+            # warn "calling color_cmd_tmps(0,1)";
+            CPAN::Shell->expandany($p)->color_cmd_tmps(0,1);
+        }
+        CPAN::Queue->jumpqueue(@prereq,$id); # queue them and requeue yourself
+        $self->{later} = "Delayed until after prerequisites";
+        return 1; # signal success to the queuerunner
+    }
+}
+
+#-> sub CPAN::Distribution::unsat_prereq ;
+sub unsat_prereq {
+    my($self) = @_;
+    my $prereq_pm = $self->prereq_pm or return;
+    my(@need);
+  NEED: while (my($need_module, $need_version) = each %$prereq_pm) {
+        my $nmo = $CPAN::META->instance("CPAN::Module",$need_module);
+        # we were too demanding:
+        next if $nmo->uptodate;
+
+        # if they have not specified a version, we accept any installed one
+        if (not defined $need_version or
+           $need_version == 0 or
+           $need_version eq "undef") {
+            next if defined $nmo->inst_file;
+        }
+
+        # We only want to install prereqs if either they're not installed
+        # or if the installed version is too old. We cannot omit this
+        # check, because if 'force' is in effect, nobody else will check.
+        {
+            local($^W) = 0;
+            if (
+                defined $nmo->inst_file &&
+                ! CPAN::Version->vgt($need_version, $nmo->inst_version)
+               ){
+                CPAN->debug(sprintf "id[%s]inst_file[%s]inst_version[%s]need_version[%s]",
+                            $nmo->id,
+                            $nmo->inst_file,
+                            $nmo->inst_version,
+                            CPAN::Version->readable($need_version)
+                           );
+                next NEED;
+            }
+        }
+
+        if ($self->{sponsored_mods}{$need_module}++){
+            # We have already sponsored it and for some reason it's still
+            # not available. So we do nothing. Or what should we do?
+            # if we push it again, we have a potential infinite loop
+            next;
+        }
+        push @need, $need_module;
+    }
+    @need;
+}
+
+#-> sub CPAN::Distribution::prereq_pm ;
+sub prereq_pm {
+  my($self) = @_;
+  return $self->{prereq_pm} if
+      exists $self->{prereq_pm_detected} && $self->{prereq_pm_detected};
+  return unless $self->{writemakefile}; # no need to have succeeded
+                                        # but we must have run it
+  my $build_dir = $self->{build_dir} or die "Panic: no build_dir?";
+  my $makefile = File::Spec->catfile($build_dir,"Makefile");
+  my(%p) = ();
+  my $fh;
+  if (-f $makefile
+      and
+      $fh = FileHandle->new("<$makefile\0")) {
+
+      local($/) = "\n";
+
+      #  A.Speer @p -> %p, where %p is $p{Module::Name}=Required_Version
+      while (<$fh>) {
+          last if /MakeMaker post_initialize section/;
+          my($p) = m{^[\#]
+		 \s+PREREQ_PM\s+=>\s+(.+)
+		 }x;
+          next unless $p;
+          # warn "Found prereq expr[$p]";
+
+          #  Regexp modified by A.Speer to remember actual version of file
+          #  PREREQ_PM hash key wants, then add to
+          while ( $p =~ m/(?:\s)([\w\:]+)=>q\[(.*?)\],?/g ){
+              # In case a prereq is mentioned twice, complain.
+              if ( defined $p{$1} ) {
+                  warn "Warning: PREREQ_PM mentions $1 more than once, last mention wins";
+              }
+              $p{$1} = $2;
+          }
+          last;
+      }
+  }
+  $self->{prereq_pm_detected}++;
+  return $self->{prereq_pm} = \%p;
+}
+
+#-> sub CPAN::Distribution::test ;
+sub test {
+    my($self) = @_;
+    $self->make;
+    if ($CPAN::Signal){
+      delete $self->{force_update};
+      return;
+    }
+    $CPAN::Frontend->myprint("Running make test\n");
+    if (my @prereq = $self->unsat_prereq){
+      return 1 if $self->follow_prereqs(@prereq); # signal success to the queuerunner
+    }
+  EXCUSE: {
+	my @e;
+	exists $self->{make} or exists $self->{later} or push @e,
+	"Make had some problems, maybe interrupted? Won't test";
+
+	exists $self->{'make'} and
+	    $self->{'make'} eq 'NO' and
+		push @e, "Can't test without successful make";
+
+	exists $self->{build_dir} or push @e, "Has no own directory";
+        $self->{badtestcnt} ||= 0;
+        $self->{badtestcnt} > 0 and
+            push @e, "Won't repeat unsuccessful test during this command";
+
+        exists $self->{later} and length($self->{later}) and
+            push @e, $self->{later};
+
+	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
+    }
+    chdir $self->{'build_dir'} or
+	Carp::croak("Couldn't chdir to $self->{'build_dir'}");
+    $self->debug("Changed directory to $self->{'build_dir'}")
+	if $CPAN::DEBUG;
+
+    if ($^O eq 'MacOS') {
+        Mac::BuildTools::make_test($self);
+        return;
+    }
+
+    local $ENV{PERL5LIB} = $ENV{PERL5LIB} || "";
+    $CPAN::META->set_perl5lib;
+    my $system = join " ", $CPAN::Config->{'make'}, "test";
+    if (system($system) == 0) {
+	 $CPAN::Frontend->myprint("  $system -- OK\n");
+	 $CPAN::META->is_tested($self->{'build_dir'});
+	 $self->{make_test} = "YES";
+    } else {
+	 $self->{make_test} = "NO";
+         $self->{badtestcnt}++;
+	 $CPAN::Frontend->myprint("  $system -- NOT OK\n");
+    }
+}
+
+#-> sub CPAN::Distribution::clean ;
+sub clean {
+    my($self) = @_;
+    $CPAN::Frontend->myprint("Running make clean\n");
+  EXCUSE: {
+	my @e;
+        exists $self->{make_clean} and $self->{make_clean} eq "YES" and
+            push @e, "make clean already called once";
+	exists $self->{build_dir} or push @e, "Has no own directory";
+	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
+    }
+    chdir $self->{'build_dir'} or
+	Carp::croak("Couldn't chdir to $self->{'build_dir'}");
+    $self->debug("Changed directory to $self->{'build_dir'}") if $CPAN::DEBUG;
+
+    if ($^O eq 'MacOS') {
+        Mac::BuildTools::make_clean($self);
+        return;
+    }
+
+    my $system = join " ", $CPAN::Config->{'make'}, "clean";
+    if (system($system) == 0) {
+      $CPAN::Frontend->myprint("  $system -- OK\n");
+
+      # $self->force;
+
+      # Jost Krieger pointed out that this "force" was wrong because
+      # it has the effect that the next "install" on this distribution
+      # will untar everything again. Instead we should bring the
+      # object's state back to where it is after untarring.
+
+      delete $self->{force_update};
+      delete $self->{install};
+      delete $self->{writemakefile};
+      delete $self->{make};
+      delete $self->{make_test}; # no matter if yes or no, tests must be redone
+      $self->{make_clean} = "YES";
+
+    } else {
+      # Hmmm, what to do if make clean failed?
+
+      $CPAN::Frontend->myprint(qq{  $system -- NOT OK
+
+make clean did not succeed, marking directory as unusable for further work.
+});
+      $self->force("make"); # so that this directory won't be used again
+
+    }
+}
+
+#-> sub CPAN::Distribution::install ;
+sub install {
+    my($self) = @_;
+    $self->test;
+    if ($CPAN::Signal){
+      delete $self->{force_update};
+      return;
+    }
+    $CPAN::Frontend->myprint("Running make install\n");
+  EXCUSE: {
+	my @e;
+	exists $self->{build_dir} or push @e, "Has no own directory";
+
+	exists $self->{make} or exists $self->{later} or push @e,
+	"Make had some problems, maybe interrupted? Won't install";
+
+	exists $self->{'make'} and
+	    $self->{'make'} eq 'NO' and
+		push @e, "make had returned bad status, install seems impossible";
+
+	push @e, "make test had returned bad status, ".
+	    "won't install without force"
+	    if exists $self->{'make_test'} and
+	    $self->{'make_test'} eq 'NO' and
+	    ! $self->{'force_update'};
+
+	exists $self->{'install'} and push @e,
+	$self->{'install'} eq "YES" ?
+	    "Already done" : "Already tried without success";
+
+        exists $self->{later} and length($self->{later}) and
+            push @e, $self->{later};
+
+	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
+    }
+    chdir $self->{'build_dir'} or
+	Carp::croak("Couldn't chdir to $self->{'build_dir'}");
+    $self->debug("Changed directory to $self->{'build_dir'}")
+	if $CPAN::DEBUG;
+
+    if ($^O eq 'MacOS') {
+        Mac::BuildTools::make_install($self);
+        return;
+    }
+
+    my $system = join(" ", $CPAN::Config->{'make'},
+		      "install", $CPAN::Config->{make_install_arg});
+    my($stderr) = $^O =~ /Win/i ? "" : " 2>&1 ";
+    my($pipe) = FileHandle->new("$system $stderr |");
+    my($makeout) = "";
+    while (<$pipe>){
+	$CPAN::Frontend->myprint($_);
+	$makeout .= $_;
+    }
+    $pipe->close;
+    if ($?==0) {
+	 $CPAN::Frontend->myprint("  $system -- OK\n");
+	 $CPAN::META->is_installed($self->{'build_dir'});
+	 return $self->{'install'} = "YES";
+    } else {
+	 $self->{'install'} = "NO";
+	 $CPAN::Frontend->myprint("  $system -- NOT OK\n");
+	 if ($makeout =~ /permission/s && $> > 0) {
+	     $CPAN::Frontend->myprint(qq{    You may have to su }.
+				      qq{to root to install the package\n});
+	 }
+    }
+    delete $self->{force_update};
+}
+
+#-> sub CPAN::Distribution::dir ;
+sub dir {
+    shift->{'build_dir'};
+}
+
+package CPAN::Bundle;
+
+sub look {
+    my $self = shift;
+    $CPAN::Frontend->myprint($self->as_string);
+}
+
+sub undelay {
+    my $self = shift;
+    delete $self->{later};
+    for my $c ( $self->contains ) {
+        my $obj = CPAN::Shell->expandany($c) or next;
+        $obj->undelay;
+    }
+}
+
+#-> sub CPAN::Bundle::color_cmd_tmps ;
+sub color_cmd_tmps {
+    my($self) = shift;
+    my($depth) = shift || 0;
+    my($color) = shift || 0;
+    my($ancestors) = shift || [];
+    # a module needs to recurse to its cpan_file, a distribution needs
+    # to recurse into its prereq_pms, a bundle needs to recurse into its modules
+
+    return if exists $self->{incommandcolor}
+        && $self->{incommandcolor}==$color;
+    if ($depth>=100){
+        $CPAN::Frontend->mydie(CPAN::Exception::RecursiveDependency->new($ancestors));
+    }
+    # warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1;
+
+    for my $c ( $self->contains ) {
+        my $obj = CPAN::Shell->expandany($c) or next;
+        CPAN->debug("c[$c]obj[$obj]") if $CPAN::DEBUG;
+        $obj->color_cmd_tmps($depth+1,$color,[@$ancestors, $self->id]);
+    }
+    if ($color==0) {
+        delete $self->{badtestcnt};
+    }
+    $self->{incommandcolor} = $color;
+}
+
+#-> sub CPAN::Bundle::as_string ;
+sub as_string {
+    my($self) = @_;
+    $self->contains;
+    # following line must be "=", not "||=" because we have a moving target
+    $self->{INST_VERSION} = $self->inst_version;
+    return $self->SUPER::as_string;
+}
+
+#-> sub CPAN::Bundle::contains ;
+sub contains {
+    my($self) = @_;
+    my($inst_file) = $self->inst_file || "";
+    my($id) = $self->id;
+    $self->debug("inst_file[$inst_file]id[$id]") if $CPAN::DEBUG;
+    unless ($inst_file) {
+        # Try to get at it in the cpan directory
+        $self->debug("no inst_file") if $CPAN::DEBUG;
+        my $cpan_file;
+        $CPAN::Frontend->mydie("I don't know a bundle with ID $id\n") unless
+              $cpan_file = $self->cpan_file;
+        if ($cpan_file eq "N/A") {
+            $CPAN::Frontend->mydie("Bundle $id not found on disk and not on CPAN.
+  Maybe stale symlink? Maybe removed during session? Giving up.\n");
+        }
+        my $dist = $CPAN::META->instance('CPAN::Distribution',
+                                         $self->cpan_file);
+        $dist->get;
+        $self->debug($dist->as_string) if $CPAN::DEBUG;
+        my($todir) = $CPAN::Config->{'cpan_home'};
+        my(@me,$from,$to,$me);
+        @me = split /::/, $self->id;
+        $me[-1] .= ".pm";
+        $me = File::Spec->catfile(@me);
+        $from = $self->find_bundle_file($dist->{'build_dir'},$me);
+        $to = File::Spec->catfile($todir,$me);
+        File::Path::mkpath(File::Basename::dirname($to));
+        File::Copy::copy($from, $to)
+              or Carp::confess("Couldn't copy $from to $to: $!");
+        $inst_file = $to;
+    }
+    my @result;
+    my $fh = FileHandle->new;
+    local $/ = "\n";
+    open($fh,$inst_file) or die "Could not open '$inst_file': $!";
+    my $in_cont = 0;
+    $self->debug("inst_file[$inst_file]") if $CPAN::DEBUG;
+    while (<$fh>) {
+        $in_cont = m/^=(?!head1\s+CONTENTS)/ ? 0 :
+            m/^=head1\s+CONTENTS/ ? 1 : $in_cont;
+        next unless $in_cont;
+        next if /^=/;
+        s/\#.*//;
+        next if /^\s+$/;
+        chomp;
+        push @result, (split " ", $_, 2)[0];
+    }
+    close $fh;
+    delete $self->{STATUS};
+    $self->{CONTAINS} = \@result;
+    $self->debug("CONTAINS[@result]") if $CPAN::DEBUG;
+    unless (@result) {
+        $CPAN::Frontend->mywarn(qq{
+The bundle file "$inst_file" may be a broken
+bundlefile. It seems not to contain any bundle definition.
+Please check the file and if it is bogus, please delete it.
+Sorry for the inconvenience.
+});
+    }
+    @result;
+}
+
+#-> sub CPAN::Bundle::find_bundle_file
+sub find_bundle_file {
+    my($self,$where,$what) = @_;
+    $self->debug("where[$where]what[$what]") if $CPAN::DEBUG;
+### The following two lines let CPAN.pm become Bundle/CPAN.pm :-(
+###    my $bu = File::Spec->catfile($where,$what);
+###    return $bu if -f $bu;
+    my $manifest = File::Spec->catfile($where,"MANIFEST");
+    unless (-f $manifest) {
+	require ExtUtils::Manifest;
+	my $cwd = CPAN::anycwd();
+	chdir $where or $CPAN::Frontend->mydie(qq{Could not chdir to "$where": $!});
+	ExtUtils::Manifest::mkmanifest();
+	chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd": $!});
+    }
+    my $fh = FileHandle->new($manifest)
+	or Carp::croak("Couldn't open $manifest: $!");
+    local($/) = "\n";
+    my $what2 = $what;
+    if ($^O eq 'MacOS') {
+      $what =~ s/^://;
+      $what =~ tr|:|/|;
+      $what2 =~ s/:Bundle://;
+      $what2 =~ tr|:|/|;
+    } else {
+	$what2 =~ s|Bundle[/\\]||;
+    }
+    my $bu;
+    while (<$fh>) {
+	next if /^\s*\#/;
+	my($file) = /(\S+)/;
+	if ($file =~ m|\Q$what\E$|) {
+	    $bu = $file;
+	    # return File::Spec->catfile($where,$bu); # bad
+	    last;
+	}
+	# retry if she managed to
+	# have no Bundle directory
+	$bu = $file if $file =~ m|\Q$what2\E$|;
+    }
+    $bu =~ tr|/|:| if $^O eq 'MacOS';
+    return File::Spec->catfile($where, $bu) if $bu;
+    Carp::croak("Couldn't find a Bundle file in $where");
+}
+
+# needs to work quite differently from Module::inst_file because of
+# cpan_home/Bundle/ directory and the possibility that we have
+# shadowing effect. As it makes no sense to take the first in @INC for
+# Bundles, we parse them all for $VERSION and take the newest.
+
+#-> sub CPAN::Bundle::inst_file ;
+sub inst_file {
+    my($self) = @_;
+    my($inst_file);
+    my(@me);
+    @me = split /::/, $self->id;
+    $me[-1] .= ".pm";
+    my($incdir,$bestv);
+    foreach $incdir ($CPAN::Config->{'cpan_home'},@INC) {
+        my $bfile = File::Spec->catfile($incdir, @me);
+        CPAN->debug("bfile[$bfile]") if $CPAN::DEBUG;
+        next unless -f $bfile;
+        my $foundv = MM->parse_version($bfile);
+        if (!$bestv || CPAN::Version->vgt($foundv,$bestv)) {
+            $self->{INST_FILE} = $bfile;
+            $self->{INST_VERSION} = $bestv = $foundv;
+        }
+    }
+    $self->{INST_FILE};
+}
+
+#-> sub CPAN::Bundle::inst_version ;
+sub inst_version {
+    my($self) = @_;
+    $self->inst_file; # finds INST_VERSION as side effect
+    $self->{INST_VERSION};
+}
+
+#-> sub CPAN::Bundle::rematein ;
+sub rematein {
+    my($self,$meth) = @_;
+    $self->debug("self[$self] meth[$meth]") if $CPAN::DEBUG;
+    my($id) = $self->id;
+    Carp::croak "Can't $meth $id, don't have an associated bundle file. :-(\n"
+	unless $self->inst_file || $self->cpan_file;
+    my($s,%fail);
+    for $s ($self->contains) {
+	my($type) = $s =~ m|/| ? 'CPAN::Distribution' :
+	    $s =~ m|^Bundle::| ? 'CPAN::Bundle' : 'CPAN::Module';
+	if ($type eq 'CPAN::Distribution') {
+	    $CPAN::Frontend->mywarn(qq{
+The Bundle }.$self->id.qq{ contains
+explicitly a file $s.
+});
+	    sleep 3;
+	}
+	# possibly noisy action:
+        $self->debug("type[$type] s[$s]") if $CPAN::DEBUG;
+	my $obj = $CPAN::META->instance($type,$s);
+	$obj->$meth();
+        if ($obj->isa(CPAN::Bundle)
+            &&
+            exists $obj->{install_failed}
+            &&
+            ref($obj->{install_failed}) eq "HASH"
+           ) {
+          for (keys %{$obj->{install_failed}}) {
+            $self->{install_failed}{$_} = undef; # propagate faiure up
+                                                 # to me in a
+                                                 # recursive call
+            $fail{$s} = 1; # the bundle itself may have succeeded but
+                           # not all children
+          }
+        } else {
+          my $success;
+          $success = $obj->can("uptodate") ? $obj->uptodate : 0;
+          $success ||= $obj->{'install'} && $obj->{'install'} eq "YES";
+          if ($success) {
+            delete $self->{install_failed}{$s};
+          } else {
+            $fail{$s} = 1;
+          }
+        }
+    }
+
+    # recap with less noise
+    if ( $meth eq "install" ) {
+	if (%fail) {
+	    require Text::Wrap;
+	    my $raw = sprintf(qq{Bundle summary:
+The following items in bundle %s had installation problems:},
+			      $self->id
+			     );
+	    $CPAN::Frontend->myprint(Text::Wrap::fill("","",$raw));
+	    $CPAN::Frontend->myprint("\n");
+	    my $paragraph = "";
+            my %reported;
+	    for $s ($self->contains) {
+              if ($fail{$s}){
+		$paragraph .= "$s ";
+                $self->{install_failed}{$s} = undef;
+                $reported{$s} = undef;
+              }
+	    }
+            my $report_propagated;
+            for $s (sort keys %{$self->{install_failed}}) {
+              next if exists $reported{$s};
+              $paragraph .= "and the following items had problems
+during recursive bundle calls: " unless $report_propagated++;
+              $paragraph .= "$s ";
+            }
+	    $CPAN::Frontend->myprint(Text::Wrap::fill("  ","  ",$paragraph));
+	    $CPAN::Frontend->myprint("\n");
+	} else {
+	    $self->{'install'} = 'YES';
+	}
+    }
+}
+
+#sub CPAN::Bundle::xs_file
+sub xs_file {
+    # If a bundle contains another that contains an xs_file we have
+    # here, we just don't bother I suppose
+    return 0;
+}
+
+#-> sub CPAN::Bundle::force ;
+sub force   { shift->rematein('force',@_); }
+#-> sub CPAN::Bundle::get ;
+sub get     { shift->rematein('get',@_); }
+#-> sub CPAN::Bundle::make ;
+sub make    { shift->rematein('make',@_); }
+#-> sub CPAN::Bundle::test ;
+sub test    {
+    my $self = shift;
+    $self->{badtestcnt} ||= 0;
+    $self->rematein('test',@_);
+}
+#-> sub CPAN::Bundle::install ;
+sub install {
+  my $self = shift;
+  $self->rematein('install',@_);
+}
+#-> sub CPAN::Bundle::clean ;
+sub clean   { shift->rematein('clean',@_); }
+
+#-> sub CPAN::Bundle::uptodate ;
+sub uptodate {
+    my($self) = @_;
+    return 0 unless $self->SUPER::uptodate; # we mut have the current Bundle def
+    my $c;
+    foreach $c ($self->contains) {
+        my $obj = CPAN::Shell->expandany($c);
+        return 0 unless $obj->uptodate;
+    }
+    return 1;
+}
+
+#-> sub CPAN::Bundle::readme ;
+sub readme  {
+    my($self) = @_;
+    my($file) = $self->cpan_file or $CPAN::Frontend->myprint(qq{
+No File found for bundle } . $self->id . qq{\n}), return;
+    $self->debug("self[$self] file[$file]") if $CPAN::DEBUG;
+    $CPAN::META->instance('CPAN::Distribution',$file)->readme;
+}
+
+package CPAN::Module;
+
+# Accessors
+# sub CPAN::Module::userid
+sub userid {
+    my $self = shift;
+    return unless exists $self->{RO}; # should never happen
+    return $self->{RO}{userid} || $self->{RO}{CPAN_USERID};
+}
+# sub CPAN::Module::description
+sub description { shift->{RO}{description} }
+
+sub undelay {
+    my $self = shift;
+    delete $self->{later};
+    if ( my $dist = CPAN::Shell->expand("Distribution", $self->cpan_file) ) {
+        $dist->undelay;
+    }
+}
+
+#-> sub CPAN::Module::color_cmd_tmps ;
+sub color_cmd_tmps {
+    my($self) = shift;
+    my($depth) = shift || 0;
+    my($color) = shift || 0;
+    my($ancestors) = shift || [];
+    # a module needs to recurse to its cpan_file
+
+    return if exists $self->{incommandcolor}
+        && $self->{incommandcolor}==$color;
+    if ($depth>=100){
+        $CPAN::Frontend->mydie(CPAN::Exception::RecursiveDependency->new($ancestors));
+    }
+    # warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1;
+
+    if ( my $dist = CPAN::Shell->expand("Distribution", $self->cpan_file) ) {
+        $dist->color_cmd_tmps($depth+1,$color,[@$ancestors, $self->id]);
+    }
+    if ($color==0) {
+        delete $self->{badtestcnt};
+    }
+    $self->{incommandcolor} = $color;
+}
+
+#-> sub CPAN::Module::as_glimpse ;
+sub as_glimpse {
+    my($self) = @_;
+    my(@m);
+    my $class = ref($self);
+    $class =~ s/^CPAN:://;
+    my $color_on = "";
+    my $color_off = "";
+    if (
+        $CPAN::Shell::COLOR_REGISTERED
+        &&
+        $CPAN::META->has_inst("Term::ANSIColor")
+        &&
+        $self->{RO}{description}
+       ) {
+        $color_on = Term::ANSIColor::color("green");
+        $color_off = Term::ANSIColor::color("reset");
+    }
+    push @m, sprintf("%-15s %s%-15s%s (%s)\n",
+                     $class,
+                     $color_on,
+                     $self->id,
+                     $color_off,
+		     $self->cpan_file);
+    join "", @m;
+}
+
+#-> sub CPAN::Module::as_string ;
+sub as_string {
+    my($self) = @_;
+    my(@m);
+    CPAN->debug("$self entering as_string") if $CPAN::DEBUG;
+    my $class = ref($self);
+    $class =~ s/^CPAN:://;
+    local($^W) = 0;
+    push @m, $class, " id = $self->{ID}\n";
+    my $sprintf = "    %-12s %s\n";
+    push @m, sprintf($sprintf, 'DESCRIPTION', $self->description)
+	if $self->description;
+    my $sprintf2 = "    %-12s %s (%s)\n";
+    my($userid);
+    $userid = $self->userid;
+    if ( $userid ){
+	my $author;
+	if ($author = CPAN::Shell->expand('Author',$userid)) {
+	  my $email = "";
+	  my $m; # old perls
+	  if ($m = $author->email) {
+            $email = " <$m>";
+          }
+	  push @m, sprintf(
+			   $sprintf2,
+			   'CPAN_USERID',
+			   $userid,
+			   $author->fullname . $email
+			  );
+	}
+    }
+    push @m, sprintf($sprintf, 'CPAN_VERSION', $self->cpan_version)
+	if $self->cpan_version;
+    push @m, sprintf($sprintf, 'CPAN_FILE', $self->cpan_file)
+	if $self->cpan_file;
+    my $sprintf3 = "    %-12s %1s%1s%1s%1s (%s,%s,%s,%s)\n";
+    my(%statd,%stats,%statl,%stati);
+    @statd{qw,? i c a b R M S,} = qw,unknown idea
+	pre-alpha alpha beta released mature standard,;
+    @stats{qw,? m d u n a,}       = qw,unknown mailing-list
+	developer comp.lang.perl.* none abandoned,;
+    @statl{qw,? p c + o h,}       = qw,unknown perl C C++ other hybrid,;
+    @stati{qw,? f r O h,}         = qw,unknown functions
+	references+ties object-oriented hybrid,;
+    $statd{' '} = 'unknown';
+    $stats{' '} = 'unknown';
+    $statl{' '} = 'unknown';
+    $stati{' '} = 'unknown';
+    push @m, sprintf(
+		     $sprintf3,
+		     'DSLI_STATUS',
+		     $self->{RO}{statd},
+		     $self->{RO}{stats},
+		     $self->{RO}{statl},
+		     $self->{RO}{stati},
+		     $statd{$self->{RO}{statd}},
+		     $stats{$self->{RO}{stats}},
+		     $statl{$self->{RO}{statl}},
+		     $stati{$self->{RO}{stati}}
+		    ) if $self->{RO}{statd};
+    my $local_file = $self->inst_file;
+    unless ($self->{MANPAGE}) {
+        if ($local_file) {
+            $self->{MANPAGE} = $self->manpage_headline($local_file);
+        } else {
+            # If we have already untarred it, we should look there
+            my $dist = $CPAN::META->instance('CPAN::Distribution',
+                                             $self->cpan_file);
+            # warn "dist[$dist]";
+            # mff=manifest file; mfh=manifest handle
+            my($mff,$mfh);
+            if (
+                $dist->{build_dir}
+                and
+                (-f  ($mff = File::Spec->catfile($dist->{build_dir}, "MANIFEST")))
+                and
+                $mfh = FileHandle->new($mff)
+               ) {
+                CPAN->debug("mff[$mff]") if $CPAN::DEBUG;
+                my $lfre = $self->id; # local file RE
+                $lfre =~ s/::/./g;
+                $lfre .= "\\.pm\$";
+                my($lfl); # local file file
+                local $/ = "\n";
+                my(@mflines) = <$mfh>;
+                for (@mflines) {
+                    s/^\s+//;
+                    s/\s.*//s;
+                }
+                while (length($lfre)>5 and !$lfl) {
+                    ($lfl) = grep /$lfre/, @mflines;
+                    CPAN->debug("lfl[$lfl]lfre[$lfre]") if $CPAN::DEBUG;
+                    $lfre =~ s/.+?\.//;
+                }
+                $lfl =~ s/\s.*//; # remove comments
+                $lfl =~ s/\s+//g; # chomp would maybe be too system-specific
+                my $lfl_abs = File::Spec->catfile($dist->{build_dir},$lfl);
+                # warn "lfl_abs[$lfl_abs]";
+                if (-f $lfl_abs) {
+                    $self->{MANPAGE} = $self->manpage_headline($lfl_abs);
+                }
+            }
+        }
+    }
+    my($item);
+    for $item (qw/MANPAGE/) {
+	push @m, sprintf($sprintf, $item, $self->{$item})
+	    if exists $self->{$item};
+    }
+    for $item (qw/CONTAINS/) {
+	push @m, sprintf($sprintf, $item, join(" ",@{$self->{$item}}))
+	    if exists $self->{$item} && @{$self->{$item}};
+    }
+    push @m, sprintf($sprintf, 'INST_FILE',
+		     $local_file || "(not installed)");
+    push @m, sprintf($sprintf, 'INST_VERSION',
+		     $self->inst_version) if $local_file;
+    join "", @m, "\n";
+}
+
+sub manpage_headline {
+  my($self,$local_file) = @_;
+  my(@local_file) = $local_file;
+  $local_file =~ s/\.pm(?!\n)\Z/.pod/;
+  push @local_file, $local_file;
+  my(@result,$locf);
+  for $locf (@local_file) {
+    next unless -f $locf;
+    my $fh = FileHandle->new($locf)
+	or $Carp::Frontend->mydie("Couldn't open $locf: $!");
+    my $inpod = 0;
+    local $/ = "\n";
+    while (<$fh>) {
+      $inpod = m/^=(?!head1\s+NAME\s*$)/ ? 0 :
+	  m/^=head1\s+NAME\s*$/ ? 1 : $inpod;
+      next unless $inpod;
+      next if /^=/;
+      next if /^\s+$/;
+      chomp;
+      push @result, $_;
+    }
+    close $fh;
+    last if @result;
+  }
+  join " ", @result;
+}
+
+#-> sub CPAN::Module::cpan_file ;
+# Note: also inherited by CPAN::Bundle
+sub cpan_file {
+    my $self = shift;
+    CPAN->debug(sprintf "id[%s]", $self->id) if $CPAN::DEBUG;
+    unless (defined $self->{RO}{CPAN_FILE}) {
+	CPAN::Index->reload;
+    }
+    if (exists $self->{RO}{CPAN_FILE} && defined $self->{RO}{CPAN_FILE}){
+	return $self->{RO}{CPAN_FILE};
+    } else {
+        my $userid = $self->userid;
+        if ( $userid ) {
+            if ($CPAN::META->exists("CPAN::Author",$userid)) {
+                my $author = $CPAN::META->instance("CPAN::Author",
+                                                   $userid);
+                my $fullname = $author->fullname;
+                my $email = $author->email;
+                unless (defined $fullname && defined $email) {
+                    return sprintf("Contact Author %s",
+                                   $userid,
+                                  );
+                }
+                return "Contact Author $fullname <$email>";
+            } else {
+                return "Contact Author $userid (Email address not available)";
+            }
+        } else {
+            return "N/A";
+        }
+    }
+}
+
+#-> sub CPAN::Module::cpan_version ;
+sub cpan_version {
+    my $self = shift;
+
+    $self->{RO}{CPAN_VERSION} = 'undef'
+	unless defined $self->{RO}{CPAN_VERSION};
+    # I believe this is always a bug in the index and should be reported
+    # as such, but usually I find out such an error and do not want to
+    # provoke too many bugreports
+
+    $self->{RO}{CPAN_VERSION};
+}
+
+#-> sub CPAN::Module::force ;
+sub force {
+    my($self) = @_;
+    $self->{'force_update'}++;
+}
+
+#-> sub CPAN::Module::rematein ;
+sub rematein {
+    my($self,$meth) = @_;
+    $CPAN::Frontend->myprint(sprintf("Running %s for module %s\n",
+                                     $meth,
+                                     $self->id));
+    my $cpan_file = $self->cpan_file;
+    if ($cpan_file eq "N/A" || $cpan_file =~ /^Contact Author/){
+      $CPAN::Frontend->mywarn(sprintf qq{
+  The module %s isn\'t available on CPAN.
+
+  Either the module has not yet been uploaded to CPAN, or it is
+  temporary unavailable. Please contact the author to find out
+  more about the status. Try 'i %s'.
+},
+			      $self->id,
+			      $self->id,
+			     );
+      return;
+    }
+    my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file);
+    $pack->called_for($self->id);
+    $pack->force($meth) if exists $self->{'force_update'};
+    $pack->$meth();
+    $pack->unforce if $pack->can("unforce") && exists $self->{'force_update'};
+    delete $self->{'force_update'};
+}
+
+#-> sub CPAN::Module::readme ;
+sub readme { shift->rematein('readme') }
+#-> sub CPAN::Module::look ;
+sub look { shift->rematein('look') }
+#-> sub CPAN::Module::cvs_import ;
+sub cvs_import { shift->rematein('cvs_import') }
+#-> sub CPAN::Module::get ;
+sub get    { shift->rematein('get',@_); }
+#-> sub CPAN::Module::make ;
+sub make   {
+    my $self = shift;
+    $self->rematein('make');
+}
+#-> sub CPAN::Module::test ;
+sub test   {
+    my $self = shift;
+    $self->{badtestcnt} ||= 0;
+    $self->rematein('test',@_);
+}
+#-> sub CPAN::Module::uptodate ;
+sub uptodate {
+    my($self) = @_;
+    my($latest) = $self->cpan_version;
+    $latest ||= 0;
+    my($inst_file) = $self->inst_file;
+    my($have) = 0;
+    if (defined $inst_file) {
+	$have = $self->inst_version;
+    }
+    local($^W)=0;
+    if ($inst_file
+	&&
+	! CPAN::Version->vgt($latest, $have)
+       ) {
+        CPAN->debug("returning uptodate. inst_file[$inst_file] ".
+                    "latest[$latest] have[$have]") if $CPAN::DEBUG;
+        return 1;
+    }
+    return;
+}
+#-> sub CPAN::Module::install ;
+sub install {
+    my($self) = @_;
+    my($doit) = 0;
+    if ($self->uptodate
+	&&
+	not exists $self->{'force_update'}
+       ) {
+	$CPAN::Frontend->myprint( $self->id. " is up to date.\n");
+    } else {
+	$doit = 1;
+    }
+    if ($self->{RO}{stats} && $self->{RO}{stats} eq "a") {
+        $CPAN::Frontend->mywarn(qq{
+\n\n\n     ***WARNING***
+     The module $self->{ID} has no active maintainer.\n\n\n
+});
+        sleep 5;
+    }
+    $self->rematein('install') if $doit;
+}
+#-> sub CPAN::Module::clean ;
+sub clean  { shift->rematein('clean') }
+
+#-> sub CPAN::Module::inst_file ;
+sub inst_file {
+    my($self) = @_;
+    my($dir,@packpath);
+    @packpath = split /::/, $self->{ID};
+    $packpath[-1] .= ".pm";
+    foreach $dir (@INC) {
+	my $pmfile = File::Spec->catfile($dir,@packpath);
+	if (-f $pmfile){
+	    return $pmfile;
+	}
+    }
+    return;
+}
+
+#-> sub CPAN::Module::xs_file ;
+sub xs_file {
+    my($self) = @_;
+    my($dir,@packpath);
+    @packpath = split /::/, $self->{ID};
+    push @packpath, $packpath[-1];
+    $packpath[-1] .= "." . $Config::Config{'dlext'};
+    foreach $dir (@INC) {
+	my $xsfile = File::Spec->catfile($dir,'auto',@packpath);
+	if (-f $xsfile){
+	    return $xsfile;
+	}
+    }
+    return;
+}
+
+#-> sub CPAN::Module::inst_version ;
+sub inst_version {
+    my($self) = @_;
+    my $parsefile = $self->inst_file or return;
+    local($^W) = 0 if $] < 5.00303 && $ExtUtils::MakeMaker::VERSION < 5.38;
+    my $have;
+
+    # there was a bug in 5.6.0 that let lots of unini warnings out of
+    # parse_version. Fixed shortly after 5.6.0 by PMQS. We can remove
+    # the following workaround after 5.6.1 is out.
+    local($SIG{__WARN__}) =  sub { my $w = shift;
+                                   return if $w =~ /uninitialized/i;
+                                   warn $w;
+                                 };
+
+    $have = MM->parse_version($parsefile) || "undef";
+    $have =~ s/^ //; # since the %vd hack these two lines here are needed
+    $have =~ s/ $//; # trailing whitespace happens all the time
+
+    # My thoughts about why %vd processing should happen here
+
+    # Alt1 maintain it as string with leading v:
+    # read index files     do nothing
+    # compare it           use utility for compare
+    # print it             do nothing
+
+    # Alt2 maintain it as what it is
+    # read index files     convert
+    # compare it           use utility because there's still a ">" vs "gt" issue
+    # print it             use CPAN::Version for print
+
+    # Seems cleaner to hold it in memory as a string starting with a "v"
+
+    # If the author of this module made a mistake and wrote a quoted
+    # "v1.13" instead of v1.13, we simply leave it at that with the
+    # effect that *we* will treat it like a v-tring while the rest of
+    # perl won't. Seems sensible when we consider that any action we
+    # could take now would just add complexity.
+
+    $have = CPAN::Version->readable($have);
+
+    $have =~ s/\s*//g; # stringify to float around floating point issues
+    $have; # no stringify needed, \s* above matches always
+}
+
+package CPAN::Tarzip;
+
+# CPAN::Tarzip::gzip
+sub gzip {
+  my($class,$read,$write) = @_;
+  if ($CPAN::META->has_inst("Compress::Zlib")) {
+    my($buffer,$fhw);
+    $fhw = FileHandle->new($read)
+	or $CPAN::Frontend->mydie("Could not open $read: $!");
+    my $gz = Compress::Zlib::gzopen($write, "wb")
+	or $CPAN::Frontend->mydie("Cannot gzopen $write: $!\n");
+    $gz->gzwrite($buffer)
+	while read($fhw,$buffer,4096) > 0 ;
+    $gz->gzclose() ;
+    $fhw->close;
+    return 1;
+  } else {
+    system("$CPAN::Config->{gzip} -c $read > $write")==0;
+  }
+}
+
+
+# CPAN::Tarzip::gunzip
+sub gunzip {
+  my($class,$read,$write) = @_;
+  if ($CPAN::META->has_inst("Compress::Zlib")) {
+    my($buffer,$fhw);
+    $fhw = FileHandle->new(">$write")
+	or $CPAN::Frontend->mydie("Could not open >$write: $!");
+    my $gz = Compress::Zlib::gzopen($read, "rb")
+	or $CPAN::Frontend->mydie("Cannot gzopen $read: $!\n");
+    $fhw->print($buffer)
+	while $gz->gzread($buffer) > 0 ;
+    $CPAN::Frontend->mydie("Error reading from $read: $!\n")
+	if $gz->gzerror != Compress::Zlib::Z_STREAM_END();
+    $gz->gzclose() ;
+    $fhw->close;
+    return 1;
+  } else {
+    system("$CPAN::Config->{gzip} -dc $read > $write")==0;
+  }
+}
+
+
+# CPAN::Tarzip::gtest
+sub gtest {
+  my($class,$read) = @_;
+  # After I had reread the documentation in zlib.h, I discovered that
+  # uncompressed files do not lead to an gzerror (anymore?).
+  if ( $CPAN::META->has_inst("Compress::Zlib") ) {
+    my($buffer,$len);
+    $len = 0;
+    my $gz = Compress::Zlib::gzopen($read, "rb")
+	or $CPAN::Frontend->mydie(sprintf("Cannot gzopen %s: %s\n",
+                                          $read,
+                                          $Compress::Zlib::gzerrno));
+    while ($gz->gzread($buffer) > 0 ){
+        $len += length($buffer);
+        $buffer = "";
+    }
+    my $err = $gz->gzerror;
+    my $success = ! $err || $err == Compress::Zlib::Z_STREAM_END();
+    if ($len == -s $read){
+        $success = 0;
+        CPAN->debug("hit an uncompressed file") if $CPAN::DEBUG;
+    }
+    $gz->gzclose();
+    CPAN->debug("err[$err]success[$success]") if $CPAN::DEBUG;
+    return $success;
+  } else {
+      return system("$CPAN::Config->{gzip} -dt $read")==0;
+  }
+}
+
+
+# CPAN::Tarzip::TIEHANDLE
+sub TIEHANDLE {
+  my($class,$file) = @_;
+  my $ret;
+  $class->debug("file[$file]");
+  if ($CPAN::META->has_inst("Compress::Zlib")) {
+    my $gz = Compress::Zlib::gzopen($file,"rb") or
+	die "Could not gzopen $file";
+    $ret = bless {GZ => $gz}, $class;
+  } else {
+    my $pipe = "$CPAN::Config->{gzip} --decompress --stdout $file |";
+    my $fh = FileHandle->new($pipe) or die "Could not pipe[$pipe]: $!";
+    binmode $fh;
+    $ret = bless {FH => $fh}, $class;
+  }
+  $ret;
+}
+
+
+# CPAN::Tarzip::READLINE
+sub READLINE {
+  my($self) = @_;
+  if (exists $self->{GZ}) {
+    my $gz = $self->{GZ};
+    my($line,$bytesread);
+    $bytesread = $gz->gzreadline($line);
+    return undef if $bytesread <= 0;
+    return $line;
+  } else {
+    my $fh = $self->{FH};
+    return scalar <$fh>;
+  }
+}
+
+
+# CPAN::Tarzip::READ
+sub READ {
+  my($self,$ref,$length,$offset) = @_;
+  die "read with offset not implemented" if defined $offset;
+  if (exists $self->{GZ}) {
+    my $gz = $self->{GZ};
+    my $byteread = $gz->gzread($$ref,$length);# 30eaf79e8b446ef52464b5422da328a8
+    return $byteread;
+  } else {
+    my $fh = $self->{FH};
+    return read($fh,$$ref,$length);
+  }
+}
+
+
+# CPAN::Tarzip::DESTROY
+sub DESTROY {
+    my($self) = @_;
+    if (exists $self->{GZ}) {
+        my $gz = $self->{GZ};
+        $gz->gzclose() if defined $gz; # hard to say if it is allowed
+                                       # to be undef ever. AK, 2000-09
+    } else {
+        my $fh = $self->{FH};
+        $fh->close if defined $fh;
+    }
+    undef $self;
+}
+
+
+# CPAN::Tarzip::untar
+sub untar {
+  my($class,$file) = @_;
+  my($prefer) = 0;
+
+  if (0) { # makes changing order easier
+  } elsif ($BUGHUNTING){
+      $prefer=2;
+  } elsif (MM->maybe_command($CPAN::Config->{gzip})
+           &&
+           MM->maybe_command($CPAN::Config->{'tar'})) {
+      # should be default until Archive::Tar is fixed
+      $prefer = 1;
+  } elsif (
+           $CPAN::META->has_inst("Archive::Tar")
+           &&
+           $CPAN::META->has_inst("Compress::Zlib") ) {
+      $prefer = 2;
+  } else {
+    $CPAN::Frontend->mydie(qq{
+CPAN.pm needs either both external programs tar and gzip installed or
+both the modules Archive::Tar and Compress::Zlib. Neither prerequisite
+is available. Can\'t continue.
+});
+  }
+  if ($prefer==1) { # 1 => external gzip+tar
+    my($system);
+    my $is_compressed = $class->gtest($file);
+    if ($is_compressed) {
+        $system = "$CPAN::Config->{gzip} --decompress --stdout " .
+            "< $file | $CPAN::Config->{tar} xvf -";
+    } else {
+        $system = "$CPAN::Config->{tar} xvf $file";
+    }
+    if (system($system) != 0) {
+        # people find the most curious tar binaries that cannot handle
+        # pipes
+        if ($is_compressed) {
+            (my $ungzf = $file) =~ s/\.gz(?!\n)\Z//;
+            if (CPAN::Tarzip->gunzip($file, $ungzf)) {
+                $CPAN::Frontend->myprint(qq{Uncompressed $file successfully\n});
+            } else {
+                $CPAN::Frontend->mydie(qq{Couldn\'t uncompress $file\n});
+            }
+            $file = $ungzf;
+        }
+        $system = "$CPAN::Config->{tar} xvf $file";
+        $CPAN::Frontend->myprint(qq{Using Tar:$system:\n});
+        if (system($system)==0) {
+            $CPAN::Frontend->myprint(qq{Untarred $file successfully\n});
+        } else {
+            $CPAN::Frontend->mydie(qq{Couldn\'t untar $file\n});
+        }
+        return 1;
+    } else {
+        return 1;
+    }
+  } elsif ($prefer==2) { # 2 => modules
+    my $tar = Archive::Tar->new($file,1);
+    my $af; # archive file
+    my @af;
+    if ($BUGHUNTING) {
+        # RCS 1.337 had this code, it turned out unacceptable slow but
+        # it revealed a bug in Archive::Tar. Code is only here to hunt
+        # the bug again. It should never be enabled in published code.
+        # GDGraph3d-0.53 was an interesting case according to Larry
+        # Virden.
+        warn(">>>Bughunting code enabled<<< " x 20);
+        for $af ($tar->list_files) {
+            if ($af =~ m!^(/|\.\./)!) {
+                $CPAN::Frontend->mydie("ALERT: Archive contains ".
+                                       "illegal member [$af]");
+            }
+            $CPAN::Frontend->myprint("$af\n");
+            $tar->extract($af); # slow but effective for finding the bug
+            return if $CPAN::Signal;
+        }
+    } else {
+        for $af ($tar->list_files) {
+            if ($af =~ m!^(/|\.\./)!) {
+                $CPAN::Frontend->mydie("ALERT: Archive contains ".
+                                       "illegal member [$af]");
+            }
+            $CPAN::Frontend->myprint("$af\n");
+            push @af, $af;
+            return if $CPAN::Signal;
+        }
+        $tar->extract(@af);
+    }
+
+    Mac::BuildTools::convert_files([$tar->list_files], 1)
+        if ($^O eq 'MacOS');
+
+    return 1;
+  }
+}
+
+sub unzip {
+    my($class,$file) = @_;
+    if ($CPAN::META->has_inst("Archive::Zip")) {
+        # blueprint of the code from Archive::Zip::Tree::extractTree();
+        my $zip = Archive::Zip->new();
+        my $status;
+        $status = $zip->read($file);
+        die "Read of file[$file] failed\n" if $status != Archive::Zip::AZ_OK();
+        $CPAN::META->debug("Successfully read file[$file]") if $CPAN::DEBUG;
+        my @members = $zip->members();
+        for my $member ( @members ) {
+            my $af = $member->fileName();
+            if ($af =~ m!^(/|\.\./)!) {
+                $CPAN::Frontend->mydie("ALERT: Archive contains ".
+                                       "illegal member [$af]");
+            }
+            my $status = $member->extractToFileNamed( $af );
+            $CPAN::META->debug("af[$af]status[$status]") if $CPAN::DEBUG;
+            die "Extracting of file[$af] from zipfile[$file] failed\n" if
+                $status != Archive::Zip::AZ_OK();
+            return if $CPAN::Signal;
+        }
+        return 1;
+    } else {
+        my $unzip = $CPAN::Config->{unzip} or
+            $CPAN::Frontend->mydie("Cannot unzip, no unzip program available");
+        my @system = ($unzip, $file);
+        return system(@system) == 0;
+    }
+}
+
+
+package CPAN::Version;
+# CPAN::Version::vcmp courtesy Jost Krieger
+sub vcmp {
+  my($self,$l,$r) = @_;
+  local($^W) = 0;
+  CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG;
+
+  return 0 if $l eq $r; # short circuit for quicker success
+
+  if ($l=~/^v/ <=> $r=~/^v/) {
+      for ($l,$r) {
+          next if /^v/;
+          $_ = $self->float2vv($_);
+      }
+  }
+
+  return
+      ($l ne "undef") <=> ($r ne "undef") ||
+          ($] >= 5.006 &&
+           $l =~ /^v/ &&
+           $r =~ /^v/ &&
+           $self->vstring($l) cmp $self->vstring($r)) ||
+               $l <=> $r ||
+                   $l cmp $r;
+}
+
+sub vgt {
+  my($self,$l,$r) = @_;
+  $self->vcmp($l,$r) > 0;
+}
+
+sub vstring {
+  my($self,$n) = @_;
+  $n =~ s/^v// or die "CPAN::Version::vstring() called with invalid arg [$n]";
+  pack "U*", split /\./, $n;
+}
+
+# vv => visible vstring
+sub float2vv {
+    my($self,$n) = @_;
+    my($rev) = int($n);
+    $rev ||= 0;
+    my($mantissa) = $n =~ /\.(\d{1,12})/; # limit to 12 digits to limit
+                                          # architecture influence
+    $mantissa ||= 0;
+    $mantissa .= "0" while length($mantissa)%3;
+    my $ret = "v" . $rev;
+    while ($mantissa) {
+        $mantissa =~ s/(\d{1,3})// or
+            die "Panic: length>0 but not a digit? mantissa[$mantissa]";
+        $ret .= ".".int($1);
+    }
+    # warn "n[$n]ret[$ret]";
+    $ret;
+}
+
+sub readable {
+  my($self,$n) = @_;
+  $n =~ /^([\w\-\+\.]+)/;
+
+  return $1 if defined $1 && length($1)>0;
+  # if the first user reaches version v43, he will be treated as "+".
+  # We'll have to decide about a new rule here then, depending on what
+  # will be the prevailing versioning behavior then.
+
+  if ($] < 5.006) { # or whenever v-strings were introduced
+    # we get them wrong anyway, whatever we do, because 5.005 will
+    # have already interpreted 0.2.4 to be "0.24". So even if he
+    # indexer sends us something like "v0.2.4" we compare wrongly.
+
+    # And if they say v1.2, then the old perl takes it as "v12"
+
+    $CPAN::Frontend->mywarn("Suspicious version string seen [$n]\n");
+    return $n;
+  }
+  my $better = sprintf "v%vd", $n;
+  CPAN->debug("n[$n] better[$better]") if $CPAN::DEBUG;
+  return $better;
+}
+
+package CPAN;
+
+1;
+
+__END__
+
+=head1 NAME
+
+CPAN - query, download and build perl modules from CPAN sites
+
+=head1 SYNOPSIS
+
+Interactive mode:
+
+  perl -MCPAN -e shell;
+
+Batch mode:
+
+  use CPAN;
+
+  autobundle, clean, install, make, recompile, test
+
+=head1 STATUS
+
+This module will eventually be replaced by CPANPLUS. CPANPLUS is kind
+of a modern rewrite from ground up with greater extensibility and more
+features but no full compatibility. If you're new to CPAN.pm, you
+probably should investigate if CPANPLUS is the better choice for you.
+If you're already used to CPAN.pm you're welcome to continue using it,
+if you accept that its development is mostly (though not completely)
+stalled.
+
+=head1 DESCRIPTION
+
+The CPAN module is designed to automate the make and install of perl
+modules and extensions. It includes some primitive searching capabilities and
+knows how to use Net::FTP or LWP (or lynx or an external ftp client)
+to fetch the raw data from the net.
+
+Modules are fetched from one or more of the mirrored CPAN
+(Comprehensive Perl Archive Network) sites and unpacked in a dedicated
+directory.
+
+The CPAN module also supports the concept of named and versioned
+I<bundles> of modules. Bundles simplify the handling of sets of
+related modules. See Bundles below.
+
+The package contains a session manager and a cache manager. There is
+no status retained between sessions. The session manager keeps track
+of what has been fetched, built and installed in the current
+session. The cache manager keeps track of the disk space occupied by
+the make processes and deletes excess space according to a simple FIFO
+mechanism.
+
+For extended searching capabilities there's a plugin for CPAN available,
+L<C<CPAN::WAIT>|CPAN::WAIT>. C<CPAN::WAIT> is a full-text search engine
+that indexes all documents available in CPAN authors directories. If
+C<CPAN::WAIT> is installed on your system, the interactive shell of
+CPAN.pm will enable the C<wq>, C<wr>, C<wd>, C<wl>, and C<wh> commands
+which send queries to the WAIT server that has been configured for your
+installation.
+
+All other methods provided are accessible in a programmer style and in an
+interactive shell style.
+
+=head2 Interactive Mode
+
+The interactive mode is entered by running
+
+    perl -MCPAN -e shell
+
+which puts you into a readline interface. You will have the most fun if
+you install Term::ReadKey and Term::ReadLine to enjoy both history and
+command completion.
+
+Once you are on the command line, type 'h' and the rest should be
+self-explanatory.
+
+The function call C<shell> takes two optional arguments, one is the
+prompt, the second is the default initial command line (the latter
+only works if a real ReadLine interface module is installed).
+
+The most common uses of the interactive modes are
+
+=over 2
+
+=item Searching for authors, bundles, distribution files and modules
+
+There are corresponding one-letter commands C<a>, C<b>, C<d>, and C<m>
+for each of the four categories and another, C<i> for any of the
+mentioned four. Each of the four entities is implemented as a class
+with slightly differing methods for displaying an object.
+
+Arguments you pass to these commands are either strings exactly matching
+the identification string of an object or regular expressions that are
+then matched case-insensitively against various attributes of the
+objects. The parser recognizes a regular expression only if you
+enclose it between two slashes.
+
+The principle is that the number of found objects influences how an
+item is displayed. If the search finds one item, the result is
+displayed with the rather verbose method C<as_string>, but if we find
+more than one, we display each object with the terse method
+<as_glimpse>.
+
+=item make, test, install, clean  modules or distributions
+
+These commands take any number of arguments and investigate what is
+necessary to perform the action. If the argument is a distribution
+file name (recognized by embedded slashes), it is processed. If it is
+a module, CPAN determines the distribution file in which this module
+is included and processes that, following any dependencies named in
+the module's Makefile.PL (this behavior is controlled by
+I<prerequisites_policy>.)
+
+Any C<make> or C<test> are run unconditionally. An
+
+  install <distribution_file>
+
+also is run unconditionally. But for
+
+  install <module>
+
+CPAN checks if an install is actually needed for it and prints
+I<module up to date> in the case that the distribution file containing
+the module doesn't need to be updated.
+
+CPAN also keeps track of what it has done within the current session
+and doesn't try to build a package a second time regardless if it
+succeeded or not. The C<force> command takes as a first argument the
+method to invoke (currently: C<make>, C<test>, or C<install>) and executes the
+command from scratch.
+
+Example:
+
+    cpan> install OpenGL
+    OpenGL is up to date.
+    cpan> force install OpenGL
+    Running make
+    OpenGL-0.4/
+    OpenGL-0.4/COPYRIGHT
+    [...]
+
+A C<clean> command results in a
+
+  make clean
+
+being executed within the distribution file's working directory.
+
+=item get, readme, look module or distribution
+
+C<get> downloads a distribution file without further action. C<readme>
+displays the README file of the associated distribution. C<Look> gets
+and untars (if not yet done) the distribution file, changes to the
+appropriate directory and opens a subshell process in that directory.
+
+=item ls author
+
+C<ls> lists all distribution files in and below an author's CPAN
+directory. Only those files that contain modules are listed and if
+there is more than one for any given module, only the most recent one
+is listed.
+
+=item Signals
+
+CPAN.pm installs signal handlers for SIGINT and SIGTERM. While you are
+in the cpan-shell it is intended that you can press C<^C> anytime and
+return to the cpan-shell prompt. A SIGTERM will cause the cpan-shell
+to clean up and leave the shell loop. You can emulate the effect of a
+SIGTERM by sending two consecutive SIGINTs, which usually means by
+pressing C<^C> twice.
+
+CPAN.pm ignores a SIGPIPE. If the user sets inactivity_timeout, a
+SIGALRM is used during the run of the C<perl Makefile.PL> subprocess.
+
+=back
+
+=head2 CPAN::Shell
+
+The commands that are available in the shell interface are methods in
+the package CPAN::Shell. If you enter the shell command, all your
+input is split by the Text::ParseWords::shellwords() routine which
+acts like most shells do. The first word is being interpreted as the
+method to be called and the rest of the words are treated as arguments
+to this method. Continuation lines are supported if a line ends with a
+literal backslash.
+
+=head2 autobundle
+
+C<autobundle> writes a bundle file into the
+C<$CPAN::Config-E<gt>{cpan_home}/Bundle> directory. The file contains
+a list of all modules that are both available from CPAN and currently
+installed within @INC. The name of the bundle file is based on the
+current date and a counter.
+
+=head2 recompile
+
+recompile() is a very special command in that it takes no argument and
+runs the make/test/install cycle with brute force over all installed
+dynamically loadable extensions (aka XS modules) with 'force' in
+effect. The primary purpose of this command is to finish a network
+installation. Imagine, you have a common source tree for two different
+architectures. You decide to do a completely independent fresh
+installation. You start on one architecture with the help of a Bundle
+file produced earlier. CPAN installs the whole Bundle for you, but
+when you try to repeat the job on the second architecture, CPAN
+responds with a C<"Foo up to date"> message for all modules. So you
+invoke CPAN's recompile on the second architecture and you're done.
+
+Another popular use for C<recompile> is to act as a rescue in case your
+perl breaks binary compatibility. If one of the modules that CPAN uses
+is in turn depending on binary compatibility (so you cannot run CPAN
+commands), then you should try the CPAN::Nox module for recovery.
+
+=head2 The four C<CPAN::*> Classes: Author, Bundle, Module, Distribution
+
+Although it may be considered internal, the class hierarchy does matter
+for both users and programmer. CPAN.pm deals with above mentioned four
+classes, and all those classes share a set of methods. A classical
+single polymorphism is in effect. A metaclass object registers all
+objects of all kinds and indexes them with a string. The strings
+referencing objects have a separated namespace (well, not completely
+separated):
+
+         Namespace                         Class
+
+   words containing a "/" (slash)      Distribution
+    words starting with Bundle::          Bundle
+          everything else            Module or Author
+
+Modules know their associated Distribution objects. They always refer
+to the most recent official release. Developers may mark their releases
+as unstable development versions (by inserting an underbar into the
+module version number which will also be reflected in the distribution
+name when you run 'make dist'), so the really hottest and newest 
+distribution is not always the default.  If a module Foo circulates 
+on CPAN in both version 1.23 and 1.23_90, CPAN.pm offers a convenient 
+way to install version 1.23 by saying
+
+    install Foo
+
+This would install the complete distribution file (say
+BAR/Foo-1.23.tar.gz) with all accompanying material. But if you would
+like to install version 1.23_90, you need to know where the
+distribution file resides on CPAN relative to the authors/id/
+directory. If the author is BAR, this might be BAR/Foo-1.23_90.tar.gz;
+so you would have to say
+
+    install BAR/Foo-1.23_90.tar.gz
+
+The first example will be driven by an object of the class
+CPAN::Module, the second by an object of class CPAN::Distribution.
+
+=head2 Programmer's interface
+
+If you do not enter the shell, the available shell commands are both
+available as methods (C<CPAN::Shell-E<gt>install(...)>) and as
+functions in the calling package (C<install(...)>).
+
+There's currently only one class that has a stable interface -
+CPAN::Shell. All commands that are available in the CPAN shell are
+methods of the class CPAN::Shell. Each of the commands that produce
+listings of modules (C<r>, C<autobundle>, C<u>) also return a list of
+the IDs of all modules within the list.
+
+=over 2
+
+=item expand($type,@things)
+
+The IDs of all objects available within a program are strings that can
+be expanded to the corresponding real objects with the
+C<CPAN::Shell-E<gt>expand("Module",@things)> method. Expand returns a
+list of CPAN::Module objects according to the C<@things> arguments
+given. In scalar context it only returns the first element of the
+list.
+
+=item expandany(@things)
+
+Like expand, but returns objects of the appropriate type, i.e.
+CPAN::Bundle objects for bundles, CPAN::Module objects for modules and
+CPAN::Distribution objects fro distributions.
+
+=item Programming Examples
+
+This enables the programmer to do operations that combine
+functionalities that are available in the shell.
+
+    # install everything that is outdated on my disk:
+    perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'
+
+    # install my favorite programs if necessary:
+    for $mod (qw(Net::FTP Digest::MD5 Data::Dumper)){
+        my $obj = CPAN::Shell->expand('Module',$mod);
+        $obj->install;
+    }
+
+    # list all modules on my disk that have no VERSION number
+    for $mod (CPAN::Shell->expand("Module","/./")){
+	next unless $mod->inst_file;
+        # MakeMaker convention for undefined $VERSION:
+	next unless $mod->inst_version eq "undef";
+	print "No VERSION in ", $mod->id, "\n";
+    }
+
+    # find out which distribution on CPAN contains a module:
+    print CPAN::Shell->expand("Module","Apache::Constants")->cpan_file
+
+Or if you want to write a cronjob to watch The CPAN, you could list
+all modules that need updating. First a quick and dirty way:
+
+    perl -e 'use CPAN; CPAN::Shell->r;'
+
+If you don't want to get any output in the case that all modules are
+up to date, you can parse the output of above command for the regular
+expression //modules are up to date// and decide to mail the output
+only if it doesn't match. Ick?
+
+If you prefer to do it more in a programmer style in one single
+process, maybe something like this suits you better:
+
+  # list all modules on my disk that have newer versions on CPAN
+  for $mod (CPAN::Shell->expand("Module","/./")){
+    next unless $mod->inst_file;
+    next if $mod->uptodate;
+    printf "Module %s is installed as %s, could be updated to %s from CPAN\n",
+        $mod->id, $mod->inst_version, $mod->cpan_version;
+  }
+
+If that gives you too much output every day, you maybe only want to
+watch for three modules. You can write
+
+  for $mod (CPAN::Shell->expand("Module","/Apache|LWP|CGI/")){
+
+as the first line instead. Or you can combine some of the above
+tricks:
+
+  # watch only for a new mod_perl module
+  $mod = CPAN::Shell->expand("Module","mod_perl");
+  exit if $mod->uptodate;
+  # new mod_perl arrived, let me know all update recommendations
+  CPAN::Shell->r;
+
+=back
+
+=head2 Methods in the other Classes
+
+The programming interface for the classes CPAN::Module,
+CPAN::Distribution, CPAN::Bundle, and CPAN::Author is still considered
+beta and partially even alpha. In the following paragraphs only those
+methods are documented that have proven useful over a longer time and
+thus are unlikely to change.
+
+=over 4
+
+=item CPAN::Author::as_glimpse()
+
+Returns a one-line description of the author
+
+=item CPAN::Author::as_string()
+
+Returns a multi-line description of the author
+
+=item CPAN::Author::email()
+
+Returns the author's email address
+
+=item CPAN::Author::fullname()
+
+Returns the author's name
+
+=item CPAN::Author::name()
+
+An alias for fullname
+
+=item CPAN::Bundle::as_glimpse()
+
+Returns a one-line description of the bundle
+
+=item CPAN::Bundle::as_string()
+
+Returns a multi-line description of the bundle
+
+=item CPAN::Bundle::clean()
+
+Recursively runs the C<clean> method on all items contained in the bundle.
+
+=item CPAN::Bundle::contains()
+
+Returns a list of objects' IDs contained in a bundle. The associated
+objects may be bundles, modules or distributions.
+
+=item CPAN::Bundle::force($method,@args)
+
+Forces CPAN to perform a task that normally would have failed. Force
+takes as arguments a method name to be called and any number of
+additional arguments that should be passed to the called method. The
+internals of the object get the needed changes so that CPAN.pm does
+not refuse to take the action. The C<force> is passed recursively to
+all contained objects.
+
+=item CPAN::Bundle::get()
+
+Recursively runs the C<get> method on all items contained in the bundle
+
+=item CPAN::Bundle::inst_file()
+
+Returns the highest installed version of the bundle in either @INC or
+C<$CPAN::Config->{cpan_home}>. Note that this is different from
+CPAN::Module::inst_file.
+
+=item CPAN::Bundle::inst_version()
+
+Like CPAN::Bundle::inst_file, but returns the $VERSION
+
+=item CPAN::Bundle::uptodate()
+
+Returns 1 if the bundle itself and all its members are uptodate.
+
+=item CPAN::Bundle::install()
+
+Recursively runs the C<install> method on all items contained in the bundle
+
+=item CPAN::Bundle::make()
+
+Recursively runs the C<make> method on all items contained in the bundle
+
+=item CPAN::Bundle::readme()
+
+Recursively runs the C<readme> method on all items contained in the bundle
+
+=item CPAN::Bundle::test()
+
+Recursively runs the C<test> method on all items contained in the bundle
+
+=item CPAN::Distribution::as_glimpse()
+
+Returns a one-line description of the distribution
+
+=item CPAN::Distribution::as_string()
+
+Returns a multi-line description of the distribution
+
+=item CPAN::Distribution::clean()
+
+Changes to the directory where the distribution has been unpacked and
+runs C<make clean> there.
+
+=item CPAN::Distribution::containsmods()
+
+Returns a list of IDs of modules contained in a distribution file.
+Only works for distributions listed in the 02packages.details.txt.gz
+file. This typically means that only the most recent version of a
+distribution is covered.
+
+=item CPAN::Distribution::cvs_import()
+
+Changes to the directory where the distribution has been unpacked and
+runs something like
+
+    cvs -d $cvs_root import -m $cvs_log $cvs_dir $userid v$version
+
+there.
+
+=item CPAN::Distribution::dir()
+
+Returns the directory into which this distribution has been unpacked.
+
+=item CPAN::Distribution::force($method,@args)
+
+Forces CPAN to perform a task that normally would have failed. Force
+takes as arguments a method name to be called and any number of
+additional arguments that should be passed to the called method. The
+internals of the object get the needed changes so that CPAN.pm does
+not refuse to take the action.
+
+=item CPAN::Distribution::get()
+
+Downloads the distribution from CPAN and unpacks it. Does nothing if
+the distribution has already been downloaded and unpacked within the
+current session.
+
+=item CPAN::Distribution::install()
+
+Changes to the directory where the distribution has been unpacked and
+runs the external command C<make install> there. If C<make> has not
+yet been run, it will be run first. A C<make test> will be issued in
+any case and if this fails, the install will be canceled. The
+cancellation can be avoided by letting C<force> run the C<install> for
+you.
+
+=item CPAN::Distribution::isa_perl()
+
+Returns 1 if this distribution file seems to be a perl distribution.
+Normally this is derived from the file name only, but the index from
+CPAN can contain a hint to achieve a return value of true for other
+filenames too.
+
+=item CPAN::Distribution::look()
+
+Changes to the directory where the distribution has been unpacked and
+opens a subshell there. Exiting the subshell returns.
+
+=item CPAN::Distribution::make()
+
+First runs the C<get> method to make sure the distribution is
+downloaded and unpacked. Changes to the directory where the
+distribution has been unpacked and runs the external commands C<perl
+Makefile.PL> and C<make> there.
+
+=item CPAN::Distribution::prereq_pm()
+
+Returns the hash reference that has been announced by a distribution
+as the PREREQ_PM hash in the Makefile.PL. Note: works only after an
+attempt has been made to C<make> the distribution. Returns undef
+otherwise.
+
+=item CPAN::Distribution::readme()
+
+Downloads the README file associated with a distribution and runs it
+through the pager specified in C<$CPAN::Config->{pager}>.
+
+=item CPAN::Distribution::test()
+
+Changes to the directory where the distribution has been unpacked and
+runs C<make test> there.
+
+=item CPAN::Distribution::uptodate()
+
+Returns 1 if all the modules contained in the distribution are
+uptodate. Relies on containsmods.
+
+=item CPAN::Index::force_reload()
+
+Forces a reload of all indices.
+
+=item CPAN::Index::reload()
+
+Reloads all indices if they have been read more than
+C<$CPAN::Config->{index_expire}> days.
+
+=item CPAN::InfoObj::dump()
+
+CPAN::Author, CPAN::Bundle, CPAN::Module, and CPAN::Distribution
+inherit this method. It prints the data structure associated with an
+object. Useful for debugging. Note: the data structure is considered
+internal and thus subject to change without notice.
+
+=item CPAN::Module::as_glimpse()
+
+Returns a one-line description of the module
+
+=item CPAN::Module::as_string()
+
+Returns a multi-line description of the module
+
+=item CPAN::Module::clean()
+
+Runs a clean on the distribution associated with this module.
+
+=item CPAN::Module::cpan_file()
+
+Returns the filename on CPAN that is associated with the module.
+
+=item CPAN::Module::cpan_version()
+
+Returns the latest version of this module available on CPAN.
+
+=item CPAN::Module::cvs_import()
+
+Runs a cvs_import on the distribution associated with this module.
+
+=item CPAN::Module::description()
+
+Returns a 44 character description of this module. Only available for
+modules listed in The Module List (CPAN/modules/00modlist.long.html
+or 00modlist.long.txt.gz)
+
+=item CPAN::Module::force($method,@args)
+
+Forces CPAN to perform a task that normally would have failed. Force
+takes as arguments a method name to be called and any number of
+additional arguments that should be passed to the called method. The
+internals of the object get the needed changes so that CPAN.pm does
+not refuse to take the action.
+
+=item CPAN::Module::get()
+
+Runs a get on the distribution associated with this module.
+
+=item CPAN::Module::inst_file()
+
+Returns the filename of the module found in @INC. The first file found
+is reported just like perl itself stops searching @INC when it finds a
+module.
+
+=item CPAN::Module::inst_version()
+
+Returns the version number of the module in readable format.
+
+=item CPAN::Module::install()
+
+Runs an C<install> on the distribution associated with this module.
+
+=item CPAN::Module::look()
+
+Changes to the directory where the distribution associated with this
+module has been unpacked and opens a subshell there. Exiting the
+subshell returns.
+
+=item CPAN::Module::make()
+
+Runs a C<make> on the distribution associated with this module.
+
+=item CPAN::Module::manpage_headline()
+
+If module is installed, peeks into the module's manpage, reads the
+headline and returns it. Moreover, if the module has been downloaded
+within this session, does the equivalent on the downloaded module even
+if it is not installed.
+
+=item CPAN::Module::readme()
+
+Runs a C<readme> on the distribution associated with this module.
+
+=item CPAN::Module::test()
+
+Runs a C<test> on the distribution associated with this module.
+
+=item CPAN::Module::uptodate()
+
+Returns 1 if the module is installed and up-to-date.
+
+=item CPAN::Module::userid()
+
+Returns the author's ID of the module.
+
+=back
+
+=head2 Cache Manager
+
+Currently the cache manager only keeps track of the build directory
+($CPAN::Config->{build_dir}). It is a simple FIFO mechanism that
+deletes complete directories below C<build_dir> as soon as the size of
+all directories there gets bigger than $CPAN::Config->{build_cache}
+(in MB). The contents of this cache may be used for later
+re-installations that you intend to do manually, but will never be
+trusted by CPAN itself. This is due to the fact that the user might
+use these directories for building modules on different architectures.
+
+There is another directory ($CPAN::Config->{keep_source_where}) where
+the original distribution files are kept. This directory is not
+covered by the cache manager and must be controlled by the user. If
+you choose to have the same directory as build_dir and as
+keep_source_where directory, then your sources will be deleted with
+the same fifo mechanism.
+
+=head2 Bundles
+
+A bundle is just a perl module in the namespace Bundle:: that does not
+define any functions or methods. It usually only contains documentation.
+
+It starts like a perl module with a package declaration and a $VERSION
+variable. After that the pod section looks like any other pod with the
+only difference being that I<one special pod section> exists starting with
+(verbatim):
+
+	=head1 CONTENTS
+
+In this pod section each line obeys the format
+
+        Module_Name [Version_String] [- optional text]
+
+The only required part is the first field, the name of a module
+(e.g. Foo::Bar, ie. I<not> the name of the distribution file). The rest
+of the line is optional. The comment part is delimited by a dash just
+as in the man page header.
+
+The distribution of a bundle should follow the same convention as
+other distributions.
+
+Bundles are treated specially in the CPAN package. If you say 'install
+Bundle::Tkkit' (assuming such a bundle exists), CPAN will install all
+the modules in the CONTENTS section of the pod. You can install your
+own Bundles locally by placing a conformant Bundle file somewhere into
+your @INC path. The autobundle() command which is available in the
+shell interface does that for you by including all currently installed
+modules in a snapshot bundle file.
+
+=head2 Prerequisites
+
+If you have a local mirror of CPAN and can access all files with
+"file:" URLs, then you only need a perl better than perl5.003 to run
+this module. Otherwise Net::FTP is strongly recommended. LWP may be
+required for non-UNIX systems or if your nearest CPAN site is
+associated with a URL that is not C<ftp:>.
+
+If you have neither Net::FTP nor LWP, there is a fallback mechanism
+implemented for an external ftp command or for an external lynx
+command.
+
+=head2 Finding packages and VERSION
+
+This module presumes that all packages on CPAN
+
+=over 2
+
+=item *
+
+declare their $VERSION variable in an easy to parse manner. This
+prerequisite can hardly be relaxed because it consumes far too much
+memory to load all packages into the running program just to determine
+the $VERSION variable. Currently all programs that are dealing with
+version use something like this
+
+    perl -MExtUtils::MakeMaker -le \
+        'print MM->parse_version(shift)' filename
+
+If you are author of a package and wonder if your $VERSION can be
+parsed, please try the above method.
+
+=item *
+
+come as compressed or gzipped tarfiles or as zip files and contain a
+Makefile.PL (well, we try to handle a bit more, but without much
+enthusiasm).
+
+=back
+
+=head2 Debugging
+
+The debugging of this module is a bit complex, because we have
+interferences of the software producing the indices on CPAN, of the
+mirroring process on CPAN, of packaging, of configuration, of
+synchronicity, and of bugs within CPAN.pm.
+
+For code debugging in interactive mode you can try "o debug" which
+will list options for debugging the various parts of the code. You
+should know that "o debug" has built-in completion support.
+
+For data debugging there is the C<dump> command which takes the same
+arguments as make/test/install and outputs the object's Data::Dumper
+dump.
+
+=head2 Floppy, Zip, Offline Mode
+
+CPAN.pm works nicely without network too. If you maintain machines
+that are not networked at all, you should consider working with file:
+URLs. Of course, you have to collect your modules somewhere first. So
+you might use CPAN.pm to put together all you need on a networked
+machine. Then copy the $CPAN::Config->{keep_source_where} (but not
+$CPAN::Config->{build_dir}) directory on a floppy. This floppy is kind
+of a personal CPAN. CPAN.pm on the non-networked machines works nicely
+with this floppy. See also below the paragraph about CD-ROM support.
+
+=head1 CONFIGURATION
+
+When the CPAN module is used for the first time, a configuration
+dialog tries to determine a couple of site specific options. The
+result of the dialog is stored in a hash reference C< $CPAN::Config >
+in a file CPAN/Config.pm.
+
+The default values defined in the CPAN/Config.pm file can be
+overridden in a user specific file: CPAN/MyConfig.pm. Such a file is
+best placed in $HOME/.cpan/CPAN/MyConfig.pm, because $HOME/.cpan is
+added to the search path of the CPAN module before the use() or
+require() statements.
+
+The configuration dialog can be started any time later again by
+issueing the command C< o conf init > in the CPAN shell.
+
+Currently the following keys in the hash reference $CPAN::Config are
+defined:
+
+  build_cache        size of cache for directories to build modules
+  build_dir          locally accessible directory to build modules
+  index_expire       after this many days refetch index files
+  cache_metadata     use serializer to cache metadata
+  cpan_home          local directory reserved for this package
+  dontload_hash      anonymous hash: modules in the keys will not be
+                     loaded by the CPAN::has_inst() routine
+  gzip		     location of external program gzip
+  histfile           file to maintain history between sessions
+  histsize           maximum number of lines to keep in histfile
+  inactivity_timeout breaks interactive Makefile.PLs after this
+                     many seconds inactivity. Set to 0 to never break.
+  inhibit_startup_message
+                     if true, does not print the startup message
+  keep_source_where  directory in which to keep the source (if we do)
+  make               location of external make program
+  make_arg	     arguments that should always be passed to 'make'
+  make_install_arg   same as make_arg for 'make install'
+  makepl_arg	     arguments passed to 'perl Makefile.PL'
+  pager              location of external program more (or any pager)
+  prerequisites_policy
+                     what to do if you are missing module prerequisites
+                     ('follow' automatically, 'ask' me, or 'ignore')
+  proxy_user         username for accessing an authenticating proxy
+  proxy_pass         password for accessing an authenticating proxy
+  scan_cache	     controls scanning of cache ('atstart' or 'never')
+  tar                location of external program tar
+  term_is_latin      if true internal UTF-8 is translated to ISO-8859-1
+                     (and nonsense for characters outside latin range)
+  unzip              location of external program unzip
+  urllist	     arrayref to nearby CPAN sites (or equivalent locations)
+  wait_list          arrayref to a wait server to try (See CPAN::WAIT)
+  ftp_proxy,      }  the three usual variables for configuring
+    http_proxy,   }  proxy requests. Both as CPAN::Config variables
+    no_proxy      }  and as environment variables configurable.
+
+You can set and query each of these options interactively in the cpan
+shell with the command set defined within the C<o conf> command:
+
+=over 2
+
+=item C<o conf E<lt>scalar optionE<gt>>
+
+prints the current value of the I<scalar option>
+
+=item C<o conf E<lt>scalar optionE<gt> E<lt>valueE<gt>>
+
+Sets the value of the I<scalar option> to I<value>
+
+=item C<o conf E<lt>list optionE<gt>>
+
+prints the current value of the I<list option> in MakeMaker's
+neatvalue format.
+
+=item C<o conf E<lt>list optionE<gt> [shift|pop]>
+
+shifts or pops the array in the I<list option> variable
+
+=item C<o conf E<lt>list optionE<gt> [unshift|push|splice] E<lt>listE<gt>>
+
+works like the corresponding perl commands.
+
+=back
+
+=head2 Note on urllist parameter's format
+
+urllist parameters are URLs according to RFC 1738. We do a little
+guessing if your URL is not compliant, but if you have problems with
+file URLs, please try the correct format. Either:
+
+    file://localhost/whatever/ftp/pub/CPAN/
+
+or
+
+    file:///home/ftp/pub/CPAN/
+
+=head2 urllist parameter has CD-ROM support
+
+The C<urllist> parameter of the configuration table contains a list of
+URLs that are to be used for downloading. If the list contains any
+C<file> URLs, CPAN always tries to get files from there first. This
+feature is disabled for index files. So the recommendation for the
+owner of a CD-ROM with CPAN contents is: include your local, possibly
+outdated CD-ROM as a C<file> URL at the end of urllist, e.g.
+
+  o conf urllist push file://localhost/CDROM/CPAN
+
+CPAN.pm will then fetch the index files from one of the CPAN sites
+that come at the beginning of urllist. It will later check for each
+module if there is a local copy of the most recent version.
+
+Another peculiarity of urllist is that the site that we could
+successfully fetch the last file from automatically gets a preference
+token and is tried as the first site for the next request. So if you
+add a new site at runtime it may happen that the previously preferred
+site will be tried another time. This means that if you want to disallow
+a site for the next transfer, it must be explicitly removed from
+urllist.
+
+=head1 SECURITY
+
+There's no strong security layer in CPAN.pm. CPAN.pm helps you to
+install foreign, unmasked, unsigned code on your machine. We compare
+to a checksum that comes from the net just as the distribution file
+itself. If somebody has managed to tamper with the distribution file,
+they may have as well tampered with the CHECKSUMS file. Future
+development will go towards strong authentication.
+
+=head1 EXPORT
+
+Most functions in package CPAN are exported per default. The reason
+for this is that the primary use is intended for the cpan shell or for
+one-liners.
+
+=head1 POPULATE AN INSTALLATION WITH LOTS OF MODULES
+
+Populating a freshly installed perl with my favorite modules is pretty
+easy if you maintain a private bundle definition file. To get a useful
+blueprint of a bundle definition file, the command autobundle can be used
+on the CPAN shell command line. This command writes a bundle definition
+file for all modules that are installed for the currently running perl
+interpreter. It's recommended to run this command only once and from then
+on maintain the file manually under a private name, say
+Bundle/my_bundle.pm. With a clever bundle file you can then simply say
+
+    cpan> install Bundle::my_bundle
+
+then answer a few questions and then go out for a coffee.
+
+Maintaining a bundle definition file means keeping track of two
+things: dependencies and interactivity. CPAN.pm sometimes fails on
+calculating dependencies because not all modules define all MakeMaker
+attributes correctly, so a bundle definition file should specify
+prerequisites as early as possible. On the other hand, it's a bit
+annoying that many distributions need some interactive configuring. So
+what I try to accomplish in my private bundle file is to have the
+packages that need to be configured early in the file and the gentle
+ones later, so I can go out after a few minutes and leave CPAN.pm
+untended.
+
+=head1 WORKING WITH CPAN.pm BEHIND FIREWALLS
+
+Thanks to Graham Barr for contributing the following paragraphs about
+the interaction between perl, and various firewall configurations. For
+further informations on firewalls, it is recommended to consult the
+documentation that comes with the ncftp program. If you are unable to
+go through the firewall with a simple Perl setup, it is very likely
+that you can configure ncftp so that it works for your firewall.
+
+=head2 Three basic types of firewalls
+
+Firewalls can be categorized into three basic types.
+
+=over 4
+
+=item http firewall
+
+This is where the firewall machine runs a web server and to access the
+outside world you must do it via the web server. If you set environment
+variables like http_proxy or ftp_proxy to a values beginning with http://
+or in your web browser you have to set proxy information then you know
+you are running an http firewall.
+
+To access servers outside these types of firewalls with perl (even for
+ftp) you will need to use LWP.
+
+=item ftp firewall
+
+This where the firewall machine runs an ftp server. This kind of
+firewall will only let you access ftp servers outside the firewall.
+This is usually done by connecting to the firewall with ftp, then
+entering a username like "user@outside.host.com"
+
+To access servers outside these type of firewalls with perl you
+will need to use Net::FTP.
+
+=item One way visibility
+
+I say one way visibility as these firewalls try to make themselves look
+invisible to the users inside the firewall. An FTP data connection is
+normally created by sending the remote server your IP address and then
+listening for the connection. But the remote server will not be able to
+connect to you because of the firewall. So for these types of firewall
+FTP connections need to be done in a passive mode.
+
+There are two that I can think off.
+
+=over 4
+
+=item SOCKS
+
+If you are using a SOCKS firewall you will need to compile perl and link
+it with the SOCKS library, this is what is normally called a 'socksified'
+perl. With this executable you will be able to connect to servers outside
+the firewall as if it is not there.
+
+=item IP Masquerade
+
+This is the firewall implemented in the Linux kernel, it allows you to
+hide a complete network behind one IP address. With this firewall no
+special compiling is needed as you can access hosts directly.
+
+For accessing ftp servers behind such firewalls you may need to set
+the environment variable C<FTP_PASSIVE> to a true value, e.g.
+
+    env FTP_PASSIVE=1 perl -MCPAN -eshell
+
+or
+
+    perl -MCPAN -e '$ENV{FTP_PASSIVE} = 1; shell'
+
+
+=back
+
+=back
+
+=head2 Configuring lynx or ncftp for going through a firewall
+
+If you can go through your firewall with e.g. lynx, presumably with a
+command such as
+
+    /usr/local/bin/lynx -pscott:tiger
+
+then you would configure CPAN.pm with the command
+
+    o conf lynx "/usr/local/bin/lynx -pscott:tiger"
+
+That's all. Similarly for ncftp or ftp, you would configure something
+like
+
+    o conf ncftp "/usr/bin/ncftp -f /home/scott/ncftplogin.cfg"
+
+Your mileage may vary...
+
+=head1 FAQ
+
+=over 4
+
+=item 1)
+
+I installed a new version of module X but CPAN keeps saying,
+I have the old version installed
+
+Most probably you B<do> have the old version installed. This can
+happen if a module installs itself into a different directory in the
+@INC path than it was previously installed. This is not really a
+CPAN.pm problem, you would have the same problem when installing the
+module manually. The easiest way to prevent this behaviour is to add
+the argument C<UNINST=1> to the C<make install> call, and that is why
+many people add this argument permanently by configuring
+
+  o conf make_install_arg UNINST=1
+
+=item 2)
+
+So why is UNINST=1 not the default?
+
+Because there are people who have their precise expectations about who
+may install where in the @INC path and who uses which @INC array. In
+fine tuned environments C<UNINST=1> can cause damage.
+
+=item 3)
+
+I want to clean up my mess, and install a new perl along with
+all modules I have. How do I go about it?
+
+Run the autobundle command for your old perl and optionally rename the
+resulting bundle file (e.g. Bundle/mybundle.pm), install the new perl
+with the Configure option prefix, e.g.
+
+    ./Configure -Dprefix=/usr/local/perl-5.6.78.9
+
+Install the bundle file you produced in the first step with something like
+
+    cpan> install Bundle::mybundle
+
+and you're done.
+
+=item 4)
+
+When I install bundles or multiple modules with one command
+there is too much output to keep track of.
+
+You may want to configure something like
+
+  o conf make_arg "| tee -ai /root/.cpan/logs/make.out"
+  o conf make_install_arg "| tee -ai /root/.cpan/logs/make_install.out"
+
+so that STDOUT is captured in a file for later inspection.
+
+
+=item 5)
+
+I am not root, how can I install a module in a personal directory?
+
+You will most probably like something like this:
+
+  o conf makepl_arg "LIB=~/myperl/lib \
+                    INSTALLMAN1DIR=~/myperl/man/man1 \
+                    INSTALLMAN3DIR=~/myperl/man/man3"
+  install Sybase::Sybperl
+
+You can make this setting permanent like all C<o conf> settings with
+C<o conf commit>.
+
+You will have to add ~/myperl/man to the MANPATH environment variable
+and also tell your perl programs to look into ~/myperl/lib, e.g. by
+including
+
+  use lib "$ENV{HOME}/myperl/lib";
+
+or setting the PERL5LIB environment variable.
+
+Another thing you should bear in mind is that the UNINST parameter
+should never be set if you are not root.
+
+=item 6)
+
+How to get a package, unwrap it, and make a change before building it?
+
+  look Sybase::Sybperl
+
+=item 7)
+
+I installed a Bundle and had a couple of fails. When I
+retried, everything resolved nicely. Can this be fixed to work
+on first try?
+
+The reason for this is that CPAN does not know the dependencies of all
+modules when it starts out. To decide about the additional items to
+install, it just uses data found in the generated Makefile. An
+undetected missing piece breaks the process. But it may well be that
+your Bundle installs some prerequisite later than some depending item
+and thus your second try is able to resolve everything. Please note,
+CPAN.pm does not know the dependency tree in advance and cannot sort
+the queue of things to install in a topologically correct order. It
+resolves perfectly well IFF all modules declare the prerequisites
+correctly with the PREREQ_PM attribute to MakeMaker. For bundles which
+fail and you need to install often, it is recommended sort the Bundle
+definition file manually. It is planned to improve the metadata
+situation for dependencies on CPAN in general, but this will still
+take some time.
+
+=item 8)
+
+In our intranet we have many modules for internal use. How
+can I integrate these modules with CPAN.pm but without uploading
+the modules to CPAN?
+
+Have a look at the CPAN::Site module.
+
+=item 9)
+
+When I run CPAN's shell, I get error msg about line 1 to 4,
+setting meta input/output via the /etc/inputrc file.
+
+Some versions of readline are picky about capitalization in the
+/etc/inputrc file and specifically RedHat 6.2 comes with a
+/etc/inputrc that contains the word C<on> in lowercase. Change the
+occurrences of C<on> to C<On> and the bug should disappear.
+
+=item 10)
+
+Some authors have strange characters in their names.
+
+Internally CPAN.pm uses the UTF-8 charset. If your terminal is
+expecting ISO-8859-1 charset, a converter can be activated by setting
+term_is_latin to a true value in your config file. One way of doing so
+would be
+
+    cpan> ! $CPAN::Config->{term_is_latin}=1
+
+Extended support for converters will be made available as soon as perl
+becomes stable with regard to charset issues.
+
+=back
+
+=head1 BUGS
+
+We should give coverage for B<all> of the CPAN and not just the PAUSE
+part, right? In this discussion CPAN and PAUSE have become equal --
+but they are not. PAUSE is authors/, modules/ and scripts/. CPAN is
+PAUSE plus the clpa/, doc/, misc/, ports/, and src/.
+
+Future development should be directed towards a better integration of
+the other parts.
+
+If a Makefile.PL requires special customization of libraries, prompts
+the user for special input, etc. then you may find CPAN is not able to
+build the distribution. In that case, you should attempt the
+traditional method of building a Perl module package from a shell.
+
+=head1 AUTHOR
+
+Andreas Koenig E<lt>andreas.koenig@anima.deE<gt>
+
+=head1 TRANSLATIONS
+
+Kawai,Takanori provides a Japanese translation of this manpage at
+http://member.nifty.ne.jp/hippo2000/perltips/CPAN.htm
+
+=head1 SEE ALSO
+
+perl(1), CPAN::Nox(3)
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CPAN/FirstTime.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CPAN/FirstTime.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CPAN/FirstTime.pm	(revision 14489)
@@ -0,0 +1,719 @@
+# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
+package CPAN::Mirrored::By;
+
+sub new { 
+    my($self,@arg) = @_;
+    bless [@arg], $self;
+}
+sub continent { shift->[0] }
+sub country { shift->[1] }
+sub url { shift->[2] }
+
+package CPAN::FirstTime;
+
+use strict;
+use ExtUtils::MakeMaker qw(prompt);
+use FileHandle ();
+use File::Basename ();
+use File::Path ();
+use File::Spec;
+use vars qw($VERSION);
+$VERSION = substr q$Revision: 1.60 $, 10;
+
+=head1 NAME
+
+CPAN::FirstTime - Utility for CPAN::Config file Initialization
+
+=head1 SYNOPSIS
+
+CPAN::FirstTime::init()
+
+=head1 DESCRIPTION
+
+The init routine asks a few questions and writes a CPAN::Config
+file. Nothing special.
+
+=cut
+
+
+sub init {
+    my($configpm) = @_;
+    use Config;
+    unless ($CPAN::VERSION) {
+	require CPAN::Nox;
+    }
+    eval {require CPAN::Config;};
+    $CPAN::Config ||= {};
+    local($/) = "\n";
+    local($\) = "";
+    local($|) = 1;
+
+    my($ans,$default);
+
+    #
+    # Files, directories
+    #
+
+    print qq[
+
+CPAN is the world-wide archive of perl resources. It consists of about
+100 sites that all replicate the same contents all around the globe.
+Many countries have at least one CPAN site already. The resources
+found on CPAN are easily accessible with the CPAN.pm module. If you
+want to use CPAN.pm, you have to configure it properly.
+
+If you do not want to enter a dialog now, you can answer 'no' to this
+question and I\'ll try to autoconfigure. (Note: you can revisit this
+dialog anytime later by typing 'o conf init' at the cpan prompt.)
+
+];
+
+    my $manual_conf =
+	ExtUtils::MakeMaker::prompt("Are you ready for manual configuration?",
+				    "yes");
+    my $fastread;
+    {
+      local $^W;
+      if ($manual_conf =~ /^\s*y/i) {
+	$fastread = 0;
+	*prompt = \&ExtUtils::MakeMaker::prompt;
+      } else {
+	$fastread = 1;
+	$CPAN::Config->{urllist} ||= [];
+	# prototype should match that of &MakeMaker::prompt
+	*prompt = sub ($;$) {
+	  my($q,$a) = @_;
+	  my($ret) = defined $a ? $a : "";
+	  printf qq{%s [%s]\n\n}, $q, $ret;
+	  $ret;
+	};
+      }
+    }
+    print qq{
+
+The following questions are intended to help you with the
+configuration. The CPAN module needs a directory of its own to cache
+important index files and maybe keep a temporary mirror of CPAN files.
+This may be a site-wide directory or a personal directory.
+
+};
+
+    my $cpan_home = $CPAN::Config->{cpan_home} || File::Spec->catdir($ENV{HOME}, ".cpan");
+    if (-d $cpan_home) {
+	print qq{
+
+I see you already have a  directory
+    $cpan_home
+Shall we use it as the general CPAN build and cache directory?
+
+};
+    } else {
+	print qq{
+
+First of all, I\'d like to create this directory. Where?
+
+};
+    }
+
+    $default = $cpan_home;
+    while ($ans = prompt("CPAN build and cache directory?",$default)) {
+      unless (File::Spec->file_name_is_absolute($ans)) {
+        require Cwd;
+        my $cwd = Cwd::cwd();
+        my $absans = File::Spec->catdir($cwd,$ans);
+        warn "The path '$ans' is not an absolute path. Please specify an absolute path\n";
+        $default = $absans;
+        next;
+      }
+      eval { File::Path::mkpath($ans); }; # dies if it can't
+      if ($@) {
+	warn "Couldn't create directory $ans.
+Please retry.\n";
+	next;
+      }
+      if (-d $ans && -w _) {
+	last;
+      } else {
+	warn "Couldn't find directory $ans
+  or directory is not writable. Please retry.\n";
+      }
+    }
+    $CPAN::Config->{cpan_home} = $ans;
+
+    print qq{
+
+If you want, I can keep the source files after a build in the cpan
+home directory. If you choose so then future builds will take the
+files from there. If you don\'t want to keep them, answer 0 to the
+next question.
+
+};
+
+    $CPAN::Config->{keep_source_where} = File::Spec->catdir($CPAN::Config->{cpan_home},"sources");
+    $CPAN::Config->{build_dir} = File::Spec->catdir($CPAN::Config->{cpan_home},"build");
+
+    #
+    # Cache size, Index expire
+    #
+
+    print qq{
+
+How big should the disk cache be for keeping the build directories
+with all the intermediate files\?
+
+};
+
+    $default = $CPAN::Config->{build_cache} || 10;
+    $ans = prompt("Cache size for build directory (in MB)?", $default);
+    $CPAN::Config->{build_cache} = $ans;
+
+    # XXX This the time when we refetch the index files (in days)
+    $CPAN::Config->{'index_expire'} = 1;
+
+    print qq{
+
+By default, each time the CPAN module is started, cache scanning
+is performed to keep the cache size in sync. To prevent from this,
+disable the cache scanning with 'never'.
+
+};
+
+    $default = $CPAN::Config->{scan_cache} || 'atstart';
+    do {
+        $ans = prompt("Perform cache scanning (atstart or never)?", $default);
+    } while ($ans ne 'atstart' && $ans ne 'never');
+    $CPAN::Config->{scan_cache} = $ans;
+
+    #
+    # cache_metadata
+    #
+    print qq{
+
+To considerably speed up the initial CPAN shell startup, it is
+possible to use Storable to create a cache of metadata. If Storable
+is not available, the normal index mechanism will be used.
+
+};
+
+    defined($default = $CPAN::Config->{cache_metadata}) or $default = 1;
+    do {
+        $ans = prompt("Cache metadata (yes/no)?", ($default ? 'yes' : 'no'));
+    } while ($ans !~ /^\s*[yn]/i);
+    $CPAN::Config->{cache_metadata} = ($ans =~ /^\s*y/i ? 1 : 0);
+
+    #
+    # term_is_latin
+    #
+    print qq{
+
+The next option deals with the charset your terminal supports. In
+general CPAN is English speaking territory, thus the charset does not
+matter much, but some of the aliens out there who upload their
+software to CPAN bear names that are outside the ASCII range. If your
+terminal supports UTF-8, you say no to the next question, if it
+supports ISO-8859-1 (also known as LATIN1) then you say yes, and if it
+supports neither nor, your answer does not matter, you will not be
+able to read the names of some authors anyway. If you answer no, names
+will be output in UTF-8.
+
+};
+
+    defined($default = $CPAN::Config->{term_is_latin}) or $default = 1;
+    do {
+        $ans = prompt("Your terminal expects ISO-8859-1 (yes/no)?",
+                      ($default ? 'yes' : 'no'));
+    } while ($ans !~ /^\s*[yn]/i);
+    $CPAN::Config->{term_is_latin} = ($ans =~ /^\s*y/i ? 1 : 0);
+
+    #
+    # save history in file histfile
+    #
+    print qq{
+
+If you have one of the readline packages (Term::ReadLine::Perl,
+Term::ReadLine::Gnu, possibly others) installed, the interactive CPAN
+shell will have history support. The next two questions deal with the
+filename of the history file and with its size. If you do not want to
+set this variable, please hit SPACE RETURN to the following question.
+
+};
+
+    defined($default = $CPAN::Config->{histfile}) or
+        $default = File::Spec->catfile($CPAN::Config->{cpan_home},"histfile");
+    $ans = prompt("File to save your history?", $default);
+    $ans =~ s/^\s+//;
+    $ans =~ s/\s+\z//;
+    $CPAN::Config->{histfile} = $ans;
+
+    if ($CPAN::Config->{histfile}) {
+      defined($default = $CPAN::Config->{histsize}) or $default = 100;
+      $ans = prompt("Number of lines to save?", $default);
+      $CPAN::Config->{histsize} = $ans;
+    }
+
+    #
+    # prerequisites_policy
+    # Do we follow PREREQ_PM?
+    #
+    print qq{
+
+The CPAN module can detect when a module that which you are trying to
+build depends on prerequisites. If this happens, it can build the
+prerequisites for you automatically ('follow'), ask you for
+confirmation ('ask'), or just ignore them ('ignore'). Please set your
+policy to one of the three values.
+
+};
+
+    $default = $CPAN::Config->{prerequisites_policy} || 'ask';
+    do {
+      $ans =
+	  prompt("Policy on building prerequisites (follow, ask or ignore)?",
+		 $default);
+    } while ($ans ne 'follow' && $ans ne 'ask' && $ans ne 'ignore');
+    $CPAN::Config->{prerequisites_policy} = $ans;
+
+    #
+    # External programs
+    #
+
+    print qq{
+
+The CPAN module will need a few external programs to work properly.
+Please correct me, if I guess the wrong path for a program. Don\'t
+panic if you do not have some of them, just press ENTER for those. To
+disable the use of a download program, you can type a space followed
+by ENTER.
+
+};
+
+    my $old_warn = $^W;
+    local $^W if $^O eq 'MacOS';
+    my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
+    local $^W = $old_warn;
+    my $progname;
+    for $progname (qw/gzip tar unzip make lynx wget ncftpget ncftp ftp gpg/){
+      if ($^O eq 'MacOS') {
+          $CPAN::Config->{$progname} = 'not_here';
+          next;
+      }
+      my $progcall = $progname;
+      # we don't need ncftp if we have ncftpget
+      next if $progname eq "ncftp" && $CPAN::Config->{ncftpget} gt " ";
+      my $path = $CPAN::Config->{$progname} 
+	  || $Config::Config{$progname}
+	      || "";
+      if (File::Spec->file_name_is_absolute($path)) {
+	# testing existence is not good enough, some have these exe
+	# extensions
+
+	# warn "Warning: configured $path does not exist\n" unless -e $path;
+	# $path = "";
+      } else {
+	$path = '';
+      }
+      unless ($path) {
+	# e.g. make -> nmake
+	$progcall = $Config::Config{$progname} if $Config::Config{$progname};
+      }
+
+      $path ||= find_exe($progcall,[@path]);
+      warn "Warning: $progcall not found in PATH\n" unless
+	  $path; # not -e $path, because find_exe already checked that
+      $ans = prompt("Where is your $progname program?",$path) || $path;
+      $CPAN::Config->{$progname} = $ans;
+    }
+    my $path = $CPAN::Config->{'pager'} || 
+	$ENV{PAGER} || find_exe("less",[@path]) || 
+	    find_exe("more",[@path]) || ($^O eq 'MacOS' ? $ENV{EDITOR} : 0 )
+	    || "more";
+    $ans = prompt("What is your favorite pager program?",$path);
+    $CPAN::Config->{'pager'} = $ans;
+    $path = $CPAN::Config->{'shell'};
+    if (File::Spec->file_name_is_absolute($path)) {
+	warn "Warning: configured $path does not exist\n" unless -e $path;
+	$path = "";
+    }
+    $path ||= $ENV{SHELL};
+    if ($^O eq 'MacOS') {
+        $CPAN::Config->{'shell'} = 'not_here';
+    } else {
+        $path =~ s,\\,/,g if $^O eq 'os2';	# Cosmetic only
+        $ans = prompt("What is your favorite shell?",$path);
+        $CPAN::Config->{'shell'} = $ans;
+    }
+
+    #
+    # Arguments to make etc.
+    #
+
+    print qq{
+
+Every Makefile.PL is run by perl in a separate process. Likewise we
+run \'make\' and \'make install\' in processes. If you have any
+parameters \(e.g. PREFIX, LIB, UNINST or the like\) you want to pass
+to the calls, please specify them here.
+
+If you don\'t understand this question, just press ENTER.
+
+};
+
+    $default = $CPAN::Config->{makepl_arg} || "";
+    $CPAN::Config->{makepl_arg} =
+	prompt("Parameters for the 'perl Makefile.PL' command?
+Typical frequently used settings:
+
+    PREFIX=~/perl       non-root users (please see manual for more hints)
+
+Your choice: ",$default);
+    $default = $CPAN::Config->{make_arg} || "";
+    $CPAN::Config->{make_arg} = prompt("Parameters for the 'make' command?
+Typical frequently used setting:
+
+    -j3              dual processor system
+
+Your choice: ",$default);
+
+    $default = $CPAN::Config->{make_install_arg} || $CPAN::Config->{make_arg} || "";
+    $CPAN::Config->{make_install_arg} =
+	prompt("Parameters for the 'make install' command?
+Typical frequently used setting:
+
+    UNINST=1         to always uninstall potentially conflicting files
+
+Your choice: ",$default);
+
+    #
+    # Alarm period
+    #
+
+    print qq{
+
+Sometimes you may wish to leave the processes run by CPAN alone
+without caring about them. As sometimes the Makefile.PL contains
+question you\'re expected to answer, you can set a timer that will
+kill a 'perl Makefile.PL' process after the specified time in seconds.
+
+If you set this value to 0, these processes will wait forever. This is
+the default and recommended setting.
+
+};
+
+    $default = $CPAN::Config->{inactivity_timeout} || 0;
+    $CPAN::Config->{inactivity_timeout} =
+	prompt("Timeout for inactivity during Makefile.PL?",$default);
+
+    # Proxies
+
+    print qq{
+
+If you\'re accessing the net via proxies, you can specify them in the
+CPAN configuration or via environment variables. The variable in
+the \$CPAN::Config takes precedence.
+
+};
+
+    for (qw/ftp_proxy http_proxy no_proxy/) {
+	$default = $CPAN::Config->{$_} || $ENV{$_};
+	$CPAN::Config->{$_} = prompt("Your $_?",$default);
+    }
+
+    if ($CPAN::Config->{ftp_proxy} ||
+        $CPAN::Config->{http_proxy}) {
+        $default = $CPAN::Config->{proxy_user} || $CPAN::LWP::UserAgent::USER;
+        print qq{
+
+If your proxy is an authenticating proxy, you can store your username
+permanently. If you do not want that, just press RETURN. You will then
+be asked for your username in every future session.
+
+};
+        if ($CPAN::Config->{proxy_user} = prompt("Your proxy user id?",$default)) {
+            print qq{
+
+Your password for the authenticating proxy can also be stored
+permanently on disk. If this violates your security policy, just press
+RETURN. You will then be asked for the password in every future
+session.
+
+};
+
+            if ($CPAN::META->has_inst("Term::ReadKey")) {
+                Term::ReadKey::ReadMode("noecho");
+            } else {
+                print qq{
+
+Warning: Term::ReadKey seems not to be available, your password will
+be echoed to the terminal!
+
+};
+            }
+            $CPAN::Config->{proxy_pass} = prompt("Your proxy password?");
+            if ($CPAN::META->has_inst("Term::ReadKey")) {
+                Term::ReadKey::ReadMode("restore");
+            }
+            $CPAN::Frontend->myprint("\n\n");
+        }
+    }
+
+    #
+    # MIRRORED.BY
+    #
+
+    conf_sites() unless $fastread;
+
+    # We don't ask that now, it will be noticed in time, won't it?
+    $CPAN::Config->{'inhibit_startup_message'} = 0;
+    $CPAN::Config->{'getcwd'} = 'cwd';
+
+    print "\n\n";
+    CPAN::Config->commit($configpm);
+}
+
+sub conf_sites {
+  my $m = 'MIRRORED.BY';
+  my $mby = File::Spec->catfile($CPAN::Config->{keep_source_where},$m);
+  File::Path::mkpath(File::Basename::dirname($mby));
+  if (-f $mby && -f $m && -M $m < -M $mby) {
+    require File::Copy;
+    File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
+  }
+  my $loopcount = 0;
+  local $^T = time;
+  my $overwrite_local = 0;
+  if ($mby && -f $mby && -M _ <= 60 && -s _ > 0) {
+      my $mtime = localtime((stat _)[9]);
+      my $prompt = qq{Found $mby as of $mtime
+
+I\'d use that as a database of CPAN sites. If that is OK for you,
+please answer 'y', but if you want me to get a new database now,
+please answer 'n' to the following question.
+
+Shall I use the local database in $mby?};
+      my $ans = prompt($prompt,"y");
+      $overwrite_local = 1 unless $ans =~ /^y/i;
+  }
+  while ($mby) {
+    if ($overwrite_local) {
+      print qq{Trying to overwrite $mby
+};
+      $mby = CPAN::FTP->localize($m,$mby,3);
+      $overwrite_local = 0;
+    } elsif ( ! -f $mby ){
+      print qq{You have no $mby
+  I\'m trying to fetch one
+};
+      $mby = CPAN::FTP->localize($m,$mby,3);
+    } elsif (-M $mby > 60 && $loopcount == 0) {
+      print qq{Your $mby is older than 60 days,
+  I\'m trying to fetch one
+};
+      $mby = CPAN::FTP->localize($m,$mby,3);
+      $loopcount++;
+    } elsif (-s $mby == 0) {
+      print qq{You have an empty $mby,
+  I\'m trying to fetch one
+};
+      $mby = CPAN::FTP->localize($m,$mby,3);
+    } else {
+      last;
+    }
+  }
+  read_mirrored_by($mby);
+  bring_your_own();
+}
+
+sub find_exe {
+    my($exe,$path) = @_;
+    my($dir);
+    #warn "in find_exe exe[$exe] path[@$path]";
+    for $dir (@$path) {
+	my $abs = File::Spec->catfile($dir,$exe);
+	if (($abs = MM->maybe_command($abs))) {
+	    return $abs;
+	}
+    }
+}
+
+sub picklist {
+    my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_;
+    $default ||= '';
+
+    my $pos = 0;
+
+    my @nums;
+    while (1) {
+
+        # display, at most, 15 items at a time
+        my $limit = $#{ $items } - $pos;
+        $limit = 15 if $limit > 15;
+
+        # show the next $limit items, get the new position
+        $pos = display_some($items, $limit, $pos);
+        $pos = 0 if $pos >= @$items;
+
+        my $num = prompt($prompt,$default);
+
+        @nums = split (' ', $num);
+        my $i = scalar @$items;
+        (warn "invalid items entered, try again\n"), next
+            if grep (/\D/ || $_ < 1 || $_ > $i, @nums);
+        if ($require_nonempty) {
+            (warn "$empty_warning\n");
+        }
+        print "\n";
+
+        # a blank line continues...
+        next unless @nums;
+        last;
+    }
+    for (@nums) { $_-- }
+    @{$items}[@nums];
+}
+
+sub display_some {
+	my ($items, $limit, $pos) = @_;
+	$pos ||= 0;
+
+	my @displayable = @$items[$pos .. ($pos + $limit)];
+    for my $item (@displayable) {
+		printf "(%d) %s\n", ++$pos, $item;
+    }
+	printf("%d more items, hit SPACE RETURN to show them\n",
+               (@$items - $pos)
+              )
+            if $pos < @$items;
+	return $pos;
+}
+
+sub read_mirrored_by {
+    my $local = shift or return;
+    my(%all,$url,$expected_size,$default,$ans,$host,$dst,$country,$continent,@location);
+    my $fh = FileHandle->new;
+    $fh->open($local) or die "Couldn't open $local: $!";
+    local $/ = "\012";
+    while (<$fh>) {
+	($host) = /^([\w\.\-]+)/ unless defined $host;
+	next unless defined $host;
+	next unless /\s+dst_(dst|location)/;
+	/location\s+=\s+\"([^\"]+)/ and @location = (split /\s*,\s*/, $1) and
+	    ($continent, $country) = @location[-1,-2];
+	$continent =~ s/\s\(.*//;
+	$continent =~ s/\W+$//; # if Jarkko doesn't know latitude/longitude
+	/dst_dst\s+=\s+\"([^\"]+)/  and $dst = $1;
+	next unless $host && $dst && $continent && $country;
+	$all{$continent}{$country}{$dst} = CPAN::Mirrored::By->new($continent,$country,$dst);
+	undef $host;
+	$dst=$continent=$country="";
+    }
+    $fh->close;
+    $CPAN::Config->{urllist} ||= [];
+    my(@previous_urls);
+    if (@previous_urls = @{$CPAN::Config->{urllist}}) {
+	$CPAN::Config->{urllist} = [];
+    }
+
+    print qq{
+
+Now we need to know where your favorite CPAN sites are located. Push
+a few sites onto the array (just in case the first on the array won\'t
+work). If you are mirroring CPAN to your local workstation, specify a
+file: URL.
+
+First, pick a nearby continent and country (you can pick several of
+each, separated by spaces, or none if you just want to keep your
+existing selections). Then, you will be presented with a list of URLs
+of CPAN mirrors in the countries you selected, along with previously
+selected URLs. Select some of those URLs, or just keep the old list.
+Finally, you will be prompted for any extra URLs -- file:, ftp:, or
+http: -- that host a CPAN mirror.
+
+};
+
+    my (@cont, $cont, %cont, @countries, @urls, %seen);
+    my $no_previous_warn = 
+       "Sorry! since you don't have any existing picks, you must make a\n" .
+       "geographic selection.";
+    @cont = picklist([sort keys %all],
+                     "Select your continent (or several nearby continents)",
+                     '',
+                     ! @previous_urls,
+                     $no_previous_warn);
+
+
+    foreach $cont (@cont) {
+        my @c = sort keys %{$all{$cont}};
+        @cont{@c} = map ($cont, 0..$#c);
+        @c = map ("$_ ($cont)", @c) if @cont > 1;
+        push (@countries, @c);
+    }
+
+    if (@countries) {
+        @countries = picklist (\@countries,
+                               "Select your country (or several nearby countries)",
+                               '',
+                               ! @previous_urls,
+                               $no_previous_warn);
+        %seen = map (($_ => 1), @previous_urls);
+        # hmmm, should take list of defaults from CPAN::Config->{'urllist'}...
+        foreach $country (@countries) {
+            (my $bare_country = $country) =~ s/ \(.*\)//;
+            my @u = sort keys %{$all{$cont{$bare_country}}{$bare_country}};
+            @u = grep (! $seen{$_}, @u);
+            @u = map ("$_ ($bare_country)", @u)
+               if @countries > 1;
+            push (@urls, @u);
+        }
+    }
+    push (@urls, map ("$_ (previous pick)", @previous_urls));
+    my $prompt = "Select as many URLs as you like (by number),
+put them on one line, separated by blanks, e.g. '1 4 5'";
+    if (@previous_urls) {
+       $default = join (' ', ((scalar @urls) - (scalar @previous_urls) + 1) ..
+                             (scalar @urls));
+       $prompt .= "\n(or just hit RETURN to keep your previous picks)";
+    }
+
+    @urls = picklist (\@urls, $prompt, $default);
+    foreach (@urls) { s/ \(.*\)//; }
+    push @{$CPAN::Config->{urllist}}, @urls;
+}
+
+sub bring_your_own {
+    my %seen = map (($_ => 1), @{$CPAN::Config->{urllist}});
+    my($ans,@urls);
+    do {
+	my $prompt = "Enter another URL or RETURN to quit:";
+	unless (%seen) {
+	    $prompt = qq{CPAN.pm needs at least one URL where it can fetch CPAN files from.
+
+Please enter your CPAN site:};
+	}
+        $ans = prompt ($prompt, "");
+
+        if ($ans) {
+            $ans =~ s/^\s+//;  # no leading spaces
+            $ans =~ s/\s+\z//; # no trailing spaces
+            $ans =~ s|/?\z|/|; # has to end with one slash
+            $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file:
+            if ($ans =~ /^\w+:\/./) {
+                push @urls, $ans unless $seen{$ans}++;
+            } else {
+                printf(qq{"%s" doesn\'t look like an URL at first sight.
+I\'ll ignore it for now.
+You can add it to your %s
+later if you\'re sure it\'s right.\n},
+                       $ans,
+                       $INC{'CPAN/MyConfig.pm'} || $INC{'CPAN/Config.pm'} || "configuration file",
+                      );
+            }
+        }
+    } while $ans || !%seen;
+
+    push @{$CPAN::Config->{urllist}}, @urls;
+    # xxx delete or comment these out when you're happy that it works
+    print "New set of picks:\n";
+    map { print "  $_\n" } @{$CPAN::Config->{urllist}};
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/CPAN/Nox.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CPAN/Nox.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CPAN/Nox.pm	(revision 14489)
@@ -0,0 +1,46 @@
+package CPAN::Nox;
+use strict;
+use vars qw($VERSION @EXPORT);
+
+BEGIN{
+  $CPAN::Suppress_readline=1 unless defined $CPAN::term;
+}
+
+use base 'Exporter';
+use CPAN;
+
+$VERSION = "1.03";
+$CPAN::META->has_inst('Digest::MD5','no');
+$CPAN::META->has_inst('LWP','no');
+$CPAN::META->has_inst('Compress::Zlib','no');
+@EXPORT = @CPAN::EXPORT;
+
+*AUTOLOAD = \&CPAN::AUTOLOAD;
+
+1;
+
+__END__
+
+=head1 NAME
+
+CPAN::Nox - Wrapper around CPAN.pm without using any XS module
+
+=head1 SYNOPSIS
+
+Interactive mode:
+
+  perl -MCPAN::Nox -e shell;
+
+=head1 DESCRIPTION
+
+This package has the same functionality as CPAN.pm, but tries to
+prevent the usage of compiled extensions during its own
+execution. Its primary purpose is a rescue in case you upgraded perl
+and broke binary compatibility somehow.
+
+=head1  SEE ALSO
+
+CPAN(3)
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/CPAN/PAUSE2003.pub
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CPAN/PAUSE2003.pub	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CPAN/PAUSE2003.pub	(revision 14489)
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: OpenKeyServer v1.2
+Comment: Extracted from belgium.keyserver.net
+
+mQGiBD4+cJARBACxOByY0SJBBuJoFrH2hoqRFny423gY6V3jq1uTgGY/PPaxP+Sq
+r3RzxPct4vJcsoo48pwBsMHLrWfORq26zb6eKgmMq/CQo2gzaRbeRxCi3ke4KBmu
+aREi6RjaZSU94yABtDmspUBrpYV8zfZMv5ZIQlg9W1Tu66BFOUrrNeDpKwCgosCp
+9dtNAMhHkzxs8UJH5i3Uzb0D/0VLoAE8sOfUXqjc38rxiHuGBFSNC70Ih4mzGUCJ
+MGT4z1X3K6uUawnXMoc8XqPaYnEgOzztMymydtr+urjUwcGnuXDSpV6nulE5irxh
+zlikSTJy/42QzTMcrdRynffmJo9PRgymMI8GgWaYG5g3zzGAhi5BA6G8JKfC93IV
+xiRPBACXJpLBYQljqJY9UDNJuq8nHhKiWHBXdZzrC3LM0FSF3PKuP/ugc+KBIKXm
+clNPNFKla/SRbH6dMHsGIy8wnGPI5AtTS0roNQrttv3/ghRT7+OKXrGmBxZ/KHVr
+v3PVgiRA5MDr1mIsovfuc9WQnFu2TkgnN/F3pDcrVVSi5b+rZLQzUEFVU0UgQmF0
+Y2ggU2lnbmluZyBLZXkgMjAwMyA8cGF1c2VAcGF1c2UucGVybC5vcmc+iF8EExEC
+AB8FAj4+cJAFCQPCZwAECwcDAgMVAgMDFgIBAh4BAheAAAoJEDKNqGdFD4nsd4sA
+n3gYvr37VkUycx61wm5t4BoSO904AJ9dkl/zU5BbDnXEPKk0FNWFSnwnxbkCDQQ+
+PnCyEAgAjAKDcvpogvJvSrg3rkstDhxP4O+JZvfxzrdL9Qk0FPBlb31ECxPMBf2z
+KObrwGKwxgD3+lSb/y9SgOYnAsuwztn6BqjQ8AVKiI0MFDTa+tLrtY5860X7TxJD
+9bzMx/A4gEsYoFZYR4s/alGAzcqFcdQ2IiFnKE4KPtNXEMQ67lCEw5zdYSoJta9J
+UKsCX3KI/DOne1NnjNZL2dQadqjsEc8mjvUOTXSG1sCawzTP5tNoPHg13GeyJ0XG
+HbHY35BbF33yr9kP76+zQFaiMyLDUnyQAU/0P+rm/I6Ts6q4OZwKK/tC5LD0SPDe
+08uAzkb4krRqxheo6seHdT7HjdDbKwADBgf/RGpQhhZc+F9o79S9aLV4XnY5CFev
+4EJvUqq6TF9V0rvZg148mbO/b8EtOfcBSdvAfo3H8w6wcC7X8Kt/6Pl69UZKuQOt
+354092gTrjJyg1uZBK9Ey/LSh0k+BNCfIw04+6W8ijARkpdoBrU3CwDKTyroWYkS
+FDkkzLvJRTkMpVpqyI0xIEExPXZTf67Abv1dzceTDciblLJfQcsfDyWYv8D12ELE
+zLYQnFM1s6yD6Q51Xk/XQ6MJ59bB3uuFO8VpkCMEvqIxZXsLjgqyQgo73y1qFizs
+KnFG+TTvooBdG3yqSt9OsLSoRrJkZbMX3PKpbT0ceWL8dULc1v2ol4fJGohMBBgR
+AgAMBQI+PnCyBQkDwmcAAAoJEDKNqGdFD4nsS44An14sFX5E2jJc87HFJeqPmeas
+hdayAKCCmOqjo0CW5uepN19pXdP7BujUOw==
+=ocE3
+-----END PGP PUBLIC KEY BLOCK-----
Index: /for-distributions/trunk/bin/windows/perl/lib/CPAN/SIGNATURE
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/CPAN/SIGNATURE	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/CPAN/SIGNATURE	(revision 14489)
@@ -0,0 +1,45 @@
+This file contains message digests of all files listed in MANIFEST,
+signed via the Module::Signature module, version 0.26.
+
+To verify the content in this distribution, first make sure you have
+Module::Signature installed, then type:
+
+    % cpansign -v
+
+It would check each file's integrity, as well as the signature's
+validity.  If "==> Signature verified OK! <==" is not displayed,
+the distribution may already have been compromised, and you should
+not run its Makefile.PL or Build.PL.
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+SHA1 efbe8e6882a2caa0d741b113959a706830ab5882 BUNDLE/Test/Builder.pm
+SHA1 ae1d68262bedc2475e2c6fd478d99b259b4fb109 BUNDLE/Test/More.pm
+SHA1 2b02ead396d701c16a93a54b0f15f7073addb407 ChangeLog
+SHA1 a029ffa2f2252bb8914eb658666244710994d256 Changes.old
+SHA1 ed0c9e6c6b83e39e3822cf71aeed81f829386dd9 MANIFEST
+SHA1 21e313600b36ee8adb724a43c247ee0f873b5b81 MANIFEST.SKIP
+SHA1 1b0753e38574181a9d0e041cb9082d09c32f0fbf META.yml
+SHA1 441f9a3ec80bfa266d889d5c56a9a75eeb119626 Makefile.PL
+SHA1 37e858c51409a297ef5d3fb35dc57cd3b57f9a4d PAUSE2003.pub
+SHA1 0006bf6573858fbeb094d0becc5030c36d41a46d README
+SHA1 9e6e9cf9ae517d91ef3bda61f2c5d0c6409073d6 Todo
+SHA1 859ee1f3ba026d269c44b29d715d9af1e35333bc lib/Bundle/CPAN.pm
+SHA1 3aaaaf913748abe1cfa3f89ccf70d8f6315e5fe8 lib/CPAN.pm
+SHA1 e00d87017076b26de7696ae8b75d397bee737bbb lib/CPAN/Admin.pm
+SHA1 536e9720a6161510b50a2948c768d1daabc87dcd lib/CPAN/FirstTime.pm
+SHA1 33dd610c4b5d679bbcf3e61df290e33b460feaab lib/CPAN/Nox.pm
+SHA1 0a7b5d987e699afe63d9e314f1aa456214c8e1d0 scripts/cpan
+SHA1 1ef040435bd29f7d46db02c079fcb79cc279780c t/Nox.t
+SHA1 6a3fa699be244f587ef1d14e4c345bc57affd0c8 t/loadme.t
+SHA1 d765dc589a77265e305ef27ff386e31f562ad70b t/mirroredby.t
+SHA1 44ee216f4a129193a62fc1cd61088fd2de8e9538 t/signature.t
+SHA1 ada872f52e59a537c444e12ca9d79e4df4bd18c4 t/vcmp.t
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.2 (GNU/Linux)
+
+iD8DBQE/KTBH7IA58KMXwV0RAvwzAKDqt5FPLl5zA2RkWRoLz/ASslZqKACfV1pg
+VUyR6PLFLNoGHDZXCzmn1co=
+=8wMs
+-----END PGP SIGNATURE-----
Index: /for-distributions/trunk/bin/windows/perl/lib/Carp.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Carp.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Carp.pm	(revision 14489)
@@ -0,0 +1,274 @@
+package Carp;
+
+our $VERSION = '1.04';
+
+=head1 NAME
+
+carp    - warn of errors (from perspective of caller)
+
+cluck   - warn of errors with stack backtrace
+          (not exported by default)
+
+croak   - die of errors (from perspective of caller)
+
+confess - die of errors with stack backtrace
+
+shortmess - return the message that carp and croak produce
+
+longmess - return the message that cluck and confess produce
+
+=head1 SYNOPSIS
+
+    use Carp;
+    croak "We're outta here!";
+
+    use Carp qw(cluck);
+    cluck "This is how we got here!";
+
+    print FH Carp::shortmess("This will have caller's details added");
+    print FH Carp::longmess("This will have stack backtrace added");
+
+=head1 DESCRIPTION
+
+The Carp routines are useful in your own modules because
+they act like die() or warn(), but with a message which is more
+likely to be useful to a user of your module.  In the case of
+cluck, confess, and longmess that context is a summary of every
+call in the call-stack.  For a shorter message you can use carp,
+croak or shortmess which report the error as being from where
+your module was called.  There is no guarantee that that is where
+the error was, but it is a good educated guess.
+
+You can also alter the way the output and logic of C<Carp> works, by
+changing some global variables in the C<Carp> namespace. See the
+section on C<GLOBAL VARIABLES> below.
+
+Here is a more complete description of how shortmess works.  What
+it does is search the call-stack for a function call stack where
+it hasn't been told that there shouldn't be an error.  If every
+call is marked safe, it then gives up and gives a full stack
+backtrace instead.  In other words it presumes that the first likely
+looking potential suspect is guilty.  Its rules for telling whether
+a call shouldn't generate errors work as follows:
+
+=over 4
+
+=item 1.
+
+Any call from a package to itself is safe.
+
+=item 2.
+
+Packages claim that there won't be errors on calls to or from
+packages explicitly marked as safe by inclusion in @CARP_NOT, or
+(if that array is empty) @ISA.  The ability to override what
+@ISA says is new in 5.8.
+
+=item 3.
+
+The trust in item 2 is transitive.  If A trusts B, and B
+trusts C, then A trusts C.  So if you do not override @ISA
+with @CARP_NOT, then this trust relationship is identical to,
+"inherits from".
+
+=item 4.
+
+Any call from an internal Perl module is safe.  (Nothing keeps
+user modules from marking themselves as internal to Perl, but
+this practice is discouraged.)
+
+=item 5.
+
+Any call to Carp is safe.  (This rule is what keeps it from
+reporting the error where you call carp/croak/shortmess.)
+
+=back
+
+=head2 Forcing a Stack Trace
+
+As a debugging aid, you can force Carp to treat a croak as a confess
+and a carp as a cluck across I<all> modules. In other words, force a
+detailed stack trace to be given.  This can be very helpful when trying
+to understand why, or from where, a warning or error is being generated.
+
+This feature is enabled by 'importing' the non-existent symbol
+'verbose'. You would typically enable it by saying
+
+    perl -MCarp=verbose script.pl
+
+or by including the string C<MCarp=verbose> in the PERL5OPT
+environment variable.
+
+Alternately, you can set the global variable C<$Carp::Verbose> to true.
+See the C<GLOBAL VARIABLES> section below.
+
+=cut
+
+# This package is heavily used. Be small. Be fast. Be good.
+
+# Comments added by Andy Wardley <abw@kfs.org> 09-Apr-98, based on an
+# _almost_ complete understanding of the package.  Corrections and
+# comments are welcome.
+
+# The members of %Internal are packages that are internal to perl.
+# Carp will not report errors from within these packages if it
+# can.  The members of %CarpInternal are internal to Perl's warning
+# system.  Carp will not report errors from within these packages
+# either, and will not report calls *to* these packages for carp and
+# croak.  They replace $CarpLevel, which is deprecated.    The
+# $Max(EvalLen|(Arg(Len|Nums)) variables are used to specify how the eval
+# text and function arguments should be formatted when printed.
+
+# Comments added by Jos I. Boumans <kane@dwim.org> 11-Aug-2004
+# I can not get %CarpInternal or %Internal to work as advertised,
+# therefor leaving it out of the below documentation.
+# $CarpLevel may be decprecated according to the last comment, but
+# after 6 years, it's still around and in heavy use ;)
+
+=pod
+
+=head1 GLOBAL VARIABLES
+
+=head2 $Carp::CarpLevel
+
+This variable determines how many call frames are to be skipped when
+reporting where an error occurred on a call to one of C<Carp>'s
+functions. For example:
+
+    $Carp::CarpLevel = 1;
+    sub bar     { .... or _error('Wrong input') }
+    sub _error  { Carp::carp(@_) }
+
+This would make Carp report the error as coming from C<bar>'s caller,
+rather than from C<_error>'s caller, as it normally would.
+
+Defaults to C<0>.
+
+=head2 $Carp::MaxEvalLen
+
+This variable determines how many characters of a string-eval are to
+be shown in the output. Use a value of C<0> to show all text.
+
+Defaults to C<0>.
+
+=head2 $Carp::MaxArgLen
+
+This variable determines how many characters of each argument to a
+function to print. Use a value of C<0> to show the full length of the
+argument.
+
+Defaults to C<64>.
+
+=head2 $Carp::MaxArgNums
+
+This variable determines how many arguments to each function to show.
+Use a value of C<0> to show all arguments to a function call.
+
+Defaults to C<8>.
+
+=head2 $Carp::Verbose
+
+This variable makes C<Carp> use the C<longmess> function at all times.
+This effectively means that all calls to C<carp> become C<cluck> and
+all calls to C<croak> become C<confess>.
+
+Note, this is analogous to using C<use Carp 'verbose'>.
+
+Defaults to C<0>.
+
+=cut
+
+
+$CarpInternal{Carp}++;
+$CarpInternal{warnings}++;
+$CarpLevel = 0;     # How many extra package levels to skip on carp.
+                    # How many calls to skip on confess.
+                    # Reconciling these notions is hard, use
+                    # %Internal and %CarpInternal instead.
+$MaxEvalLen = 0;    # How much eval '...text...' to show. 0 = all.
+$MaxArgLen = 64;    # How much of each argument to print. 0 = all.
+$MaxArgNums = 8;    # How many arguments to print. 0 = all.
+$Verbose = 0;       # If true then make shortmess call longmess instead
+
+require Exporter;
+@ISA = ('Exporter');
+@EXPORT = qw(confess croak carp);
+@EXPORT_OK = qw(cluck verbose longmess shortmess);
+@EXPORT_FAIL = qw(verbose);	# hook to enable verbose mode
+
+=head1 BUGS
+
+The Carp routines don't handle exception objects currently.
+If called with a first argument that is a reference, they simply
+call die() or warn(), as appropriate.
+
+=cut
+
+# if the caller specifies verbose usage ("perl -MCarp=verbose script.pl")
+# then the following method will be called by the Exporter which knows
+# to do this thanks to @EXPORT_FAIL, above.  $_[1] will contain the word
+# 'verbose'.
+
+sub export_fail {
+    shift;
+    $Verbose = shift if $_[0] eq 'verbose';
+    return @_;
+}
+
+
+# longmess() crawls all the way up the stack reporting on all the function
+# calls made.  The error string, $error, is originally constructed from the
+# arguments passed into longmess() via confess(), cluck() or shortmess().
+# This gets appended with the stack trace messages which are generated for
+# each function call on the stack.
+
+sub longmess {
+    {
+	local($@, $!);
+	# XXX fix require to not clear $@ or $!?
+	# don't use require unless we need to (for Safe compartments)
+	require Carp::Heavy unless $INC{"Carp/Heavy.pm"};
+    }
+    # Icky backwards compatibility wrapper. :-(
+    my $call_pack = caller();
+    if ($Internal{$call_pack} or $CarpInternal{$call_pack}) {
+      return longmess_heavy(@_);
+    }
+    else {
+      local $CarpLevel = $CarpLevel + 1;
+      return longmess_heavy(@_);
+    }
+}
+
+
+# shortmess() is called by carp() and croak() to skip all the way up to
+# the top-level caller's package and report the error from there.  confess()
+# and cluck() generate a full stack trace so they call longmess() to
+# generate that.  In verbose mode shortmess() calls longmess() so
+# you always get a stack trace
+
+sub shortmess {	# Short-circuit &longmess if called via multiple packages
+    {
+	local($@, $!);
+	# XXX fix require to not clear $@ or $!?
+	# don't use require unless we need to (for Safe compartments)
+	require Carp::Heavy unless $INC{"Carp/Heavy.pm"};
+    }
+    # Icky backwards compatibility wrapper. :-(
+    my $call_pack = caller();
+    local @CARP_NOT = caller();
+    shortmess_heavy(@_);
+}
+
+
+# the following four functions call longmess() or shortmess() depending on
+# whether they should generate a full stack trace (confess() and cluck())
+# or simply report the caller's package (croak() and carp()), respectively.
+# confess() and croak() die, carp() and cluck() warn.
+
+sub croak   { die  shortmess @_ }
+sub confess { die  longmess  @_ }
+sub carp    { warn shortmess @_ }
+sub cluck   { warn longmess  @_ }
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Carp/Heavy.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Carp/Heavy.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Carp/Heavy.pm	(revision 14489)
@@ -0,0 +1,241 @@
+# Carp::Heavy uses some variables in common with Carp.
+package Carp;
+
+=head1 NAME
+
+Carp::Heavy - heavy machinery, no user serviceable parts inside
+
+=cut
+
+# use strict; # not yet
+
+# On one line so MakeMaker will see it.
+use Carp;  our $VERSION = $Carp::VERSION;
+
+our ($CarpLevel, $MaxArgNums, $MaxEvalLen, $MaxArgLen, $Verbose);
+
+sub caller_info {
+  my $i = shift(@_) + 1;
+  package DB;
+  my %call_info;
+  @call_info{
+    qw(pack file line sub has_args wantarray evaltext is_require)
+  } = caller($i);
+  
+  unless (defined $call_info{pack}) {
+    return ();
+  }
+
+  my $sub_name = Carp::get_subname(\%call_info);
+  if ($call_info{has_args}) {
+    my @args = map {Carp::format_arg($_)} @DB::args;
+    if ($MaxArgNums and @args > $MaxArgNums) { # More than we want to show?
+      $#args = $MaxArgNums;
+      push @args, '...';
+    }
+    # Push the args onto the subroutine
+    $sub_name .= '(' . join (', ', @args) . ')';
+  }
+  $call_info{sub_name} = $sub_name;
+  return wantarray() ? %call_info : \%call_info;
+}
+
+# Transform an argument to a function into a string.
+sub format_arg {
+  my $arg = shift;
+  if (ref($arg)) {
+      $arg = defined($overload::VERSION) ? overload::StrVal($arg) : "$arg";
+  }elsif (not defined($arg)) {
+    $arg = 'undef';
+  }
+  $arg =~ s/'/\\'/g;
+  $arg = str_len_trim($arg, $MaxArgLen);
+  
+  # Quote it?
+  $arg = "'$arg'" unless $arg =~ /^-?[\d.]+\z/;
+
+  # The following handling of "control chars" is direct from
+  # the original code - it is broken on Unicode though.
+  # Suggestions?
+  utf8::is_utf8($arg)
+    or $arg =~ s/([[:cntrl:]]|[[:^ascii:]])/sprintf("\\x{%x}",ord($1))/eg;
+  return $arg;
+}
+
+# Takes an inheritance cache and a package and returns
+# an anon hash of known inheritances and anon array of
+# inheritances which consequences have not been figured
+# for.
+sub get_status {
+    my $cache = shift;
+    my $pkg = shift;
+    $cache->{$pkg} ||= [{$pkg => $pkg}, [trusts_directly($pkg)]];
+    return @{$cache->{$pkg}};
+}
+
+# Takes the info from caller() and figures out the name of
+# the sub/require/eval
+sub get_subname {
+  my $info = shift;
+  if (defined($info->{evaltext})) {
+    my $eval = $info->{evaltext};
+    if ($info->{is_require}) {
+      return "require $eval";
+    }
+    else {
+      $eval =~ s/([\\\'])/\\$1/g;
+      return "eval '" . str_len_trim($eval, $MaxEvalLen) . "'";
+    }
+  }
+
+  return ($info->{sub} eq '(eval)') ? 'eval {...}' : $info->{sub};
+}
+
+# Figures out what call (from the point of view of the caller)
+# the long error backtrace should start at.
+sub long_error_loc {
+  my $i;
+  my $lvl = $CarpLevel;
+  {
+    my $pkg = caller(++$i);
+    unless(defined($pkg)) {
+      # This *shouldn't* happen.
+      if (%Internal) {
+        local %Internal;
+        $i = long_error_loc();
+        last;
+      }
+      else {
+        # OK, now I am irritated.
+        return 2;
+      }
+    }
+    redo if $CarpInternal{$pkg};
+    redo unless 0 > --$lvl;
+    redo if $Internal{$pkg};
+  }
+  return $i - 1;
+}
+
+
+sub longmess_heavy {
+  return @_ if ref($_[0]); # don't break references as exceptions
+  my $i = long_error_loc();
+  return ret_backtrace($i, @_);
+}
+
+# Returns a full stack backtrace starting from where it is
+# told.
+sub ret_backtrace {
+  my ($i, @error) = @_;
+  my $mess;
+  my $err = join '', @error;
+  $i++;
+
+  my $tid_msg = '';
+  if (defined &Thread::tid) {
+    my $tid = Thread->self->tid;
+    $tid_msg = " thread $tid" if $tid;
+  }
+
+  my %i = caller_info($i);
+  $mess = "$err at $i{file} line $i{line}$tid_msg\n";
+
+  while (my %i = caller_info(++$i)) {
+      $mess .= "\t$i{sub_name} called at $i{file} line $i{line}$tid_msg\n";
+  }
+  
+  return $mess;
+}
+
+sub ret_summary {
+  my ($i, @error) = @_;
+  my $err = join '', @error;
+  $i++;
+
+  my $tid_msg = '';
+  if (defined &Thread::tid) {
+    my $tid = Thread->self->tid;
+    $tid_msg = " thread $tid" if $tid;
+  }
+
+  my %i = caller_info($i);
+  return "$err at $i{file} line $i{line}$tid_msg\n";
+}
+
+
+sub short_error_loc {
+  my $cache;
+  my $i = 1;
+  my $lvl = $CarpLevel;
+  {
+    my $called = caller($i++);
+    my $caller = caller($i);
+    return 0 unless defined($caller); # What happened?
+    redo if $Internal{$caller};
+    redo if $CarpInternal{$called};
+    redo if trusts($called, $caller, $cache);
+    redo if trusts($caller, $called, $cache);
+    redo unless 0 > --$lvl;
+  }
+  return $i - 1;
+}
+
+sub shortmess_heavy {
+  return longmess_heavy(@_) if $Verbose;
+  return @_ if ref($_[0]); # don't break references as exceptions
+  my $i = short_error_loc();
+  if ($i) {
+    ret_summary($i, @_);
+  }
+  else {
+    longmess_heavy(@_);
+  }
+}
+
+# If a string is too long, trims it with ...
+sub str_len_trim {
+  my $str = shift;
+  my $max = shift || 0;
+  if (2 < $max and $max < length($str)) {
+    substr($str, $max - 3) = '...';
+  }
+  return $str;
+}
+
+# Takes two packages and an optional cache.  Says whether the
+# first inherits from the second.
+#
+# Recursive versions of this have to work to avoid certain
+# possible endless loops, and when following long chains of
+# inheritance are less efficient.
+sub trusts {
+    my $child = shift;
+    my $parent = shift;
+    my $cache = shift || {};
+    my ($known, $partial) = get_status($cache, $child);
+    # Figure out consequences until we have an answer
+    while (@$partial and not exists $known->{$parent}) {
+        my $anc = shift @$partial;
+        next if exists $known->{$anc};
+        $known->{$anc}++;
+        my ($anc_knows, $anc_partial) = get_status($cache, $anc);
+        my @found = keys %$anc_knows;
+        @$known{@found} = ();
+        push @$partial, @$anc_partial;
+    }
+    return exists $known->{$parent};
+}
+
+# Takes a package and gives a list of those trusted directly
+sub trusts_directly {
+    my $class = shift;
+    no strict 'refs';
+    no warnings 'once'; 
+    return @{"$class\::CARP_NOT"}
+      ? @{"$class\::CARP_NOT"}
+      : @{"$class\::ISA"};
+}
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Class/ISA.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Class/ISA.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Class/ISA.pm	(revision 14489)
@@ -0,0 +1,214 @@
+#!/usr/local/bin/perl
+# Time-stamp: "2004-12-29 20:01:02 AST" -*-Perl-*-
+
+package Class::ISA;
+require 5;
+use strict;
+use vars qw($Debug $VERSION);
+$VERSION = '0.33';
+$Debug = 0 unless defined $Debug;
+
+=head1 NAME
+
+Class::ISA -- report the search path for a class's ISA tree
+
+=head1 SYNOPSIS
+
+  # Suppose you go: use Food::Fishstick, and that uses and
+  # inherits from other things, which in turn use and inherit
+  # from other things.  And suppose, for sake of brevity of
+  # example, that their ISA tree is the same as:
+
+  @Food::Fishstick::ISA = qw(Food::Fish  Life::Fungus  Chemicals);
+  @Food::Fish::ISA = qw(Food);
+  @Food::ISA = qw(Matter);
+  @Life::Fungus::ISA = qw(Life);
+  @Chemicals::ISA = qw(Matter);
+  @Life::ISA = qw(Matter);
+  @Matter::ISA = qw();
+
+  use Class::ISA;
+  print "Food::Fishstick path is:\n ",
+        join(", ", Class::ISA::super_path('Food::Fishstick')),
+        "\n";
+
+That prints:
+
+  Food::Fishstick path is:
+   Food::Fish, Food, Matter, Life::Fungus, Life, Chemicals
+
+=head1 DESCRIPTION
+
+Suppose you have a class (like Food::Fish::Fishstick) that is derived,
+via its @ISA, from one or more superclasses (as Food::Fish::Fishstick
+is from Food::Fish, Life::Fungus, and Chemicals), and some of those
+superclasses may themselves each be derived, via its @ISA, from one or
+more superclasses (as above).
+
+When, then, you call a method in that class ($fishstick->calories),
+Perl first searches there for that method, but if it's not there, it
+goes searching in its superclasses, and so on, in a depth-first (or
+maybe "height-first" is the word) search.  In the above example, it'd
+first look in Food::Fish, then Food, then Matter, then Life::Fungus,
+then Life, then Chemicals.
+
+This library, Class::ISA, provides functions that return that list --
+the list (in order) of names of classes Perl would search to find a
+method, with no duplicates.
+
+=head1 FUNCTIONS
+
+=over
+
+=item the function Class::ISA::super_path($CLASS)
+
+This returns the ordered list of names of classes that Perl would
+search thru in order to find a method, with no duplicates in the list.
+$CLASS is not included in the list.  UNIVERSAL is not included -- if
+you need to consider it, add it to the end.
+
+
+=item the function Class::ISA::self_and_super_path($CLASS)
+
+Just like C<super_path>, except that $CLASS is included as the first
+element.
+
+=item the function Class::ISA::self_and_super_versions($CLASS)
+
+This returns a hash whose keys are $CLASS and its
+(super-)superclasses, and whose values are the contents of each
+class's $VERSION (or undef, for classes with no $VERSION).
+
+The code for self_and_super_versions is meant to serve as an example
+for precisely the kind of tasks I anticipate that self_and_super_path
+and super_path will be used for.  You are strongly advised to read the
+source for self_and_super_versions, and the comments there.
+
+=back
+
+=head1 CAUTIONARY NOTES
+
+* Class::ISA doesn't export anything.  You have to address the
+functions with a "Class::ISA::" on the front.
+
+* Contrary to its name, Class::ISA isn't a class; it's just a package.
+Strange, isn't it?
+
+* Say you have a loop in the ISA tree of the class you're calling one
+of the Class::ISA functions on: say that Food inherits from Matter,
+but Matter inherits from Food (for sake of argument).  If Perl, while
+searching for a method, actually discovers this cyclicity, it will
+throw a fatal error.  The functions in Class::ISA effectively ignore
+this cyclicity; the Class::ISA algorithm is "never go down the same
+path twice", and cyclicities are just a special case of that.
+
+* The Class::ISA functions just look at @ISAs.  But theoretically, I
+suppose, AUTOLOADs could bypass Perl's ISA-based search mechanism and
+do whatever they please.  That would be bad behavior, tho; and I try
+not to think about that.
+
+* If Perl can't find a method anywhere in the ISA tree, it then looks
+in the magical class UNIVERSAL.  This is rarely relevant to the tasks
+that I expect Class::ISA functions to be put to, but if it matters to
+you, then instead of this:
+
+  @supers = Class::Tree::super_path($class);
+
+do this:
+
+  @supers = (Class::Tree::super_path($class), 'UNIVERSAL');
+
+And don't say no-one ever told ya!
+
+* When you call them, the Class::ISA functions look at @ISAs anew --
+that is, there is no memoization, and so if ISAs change during
+runtime, you get the current ISA tree's path, not anything memoized.
+However, changing ISAs at runtime is probably a sign that you're out
+of your mind!
+
+=head1 COPYRIGHT
+
+Copyright (c) 1999, 2000 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
+###########################################################################
+
+sub self_and_super_versions {
+  no strict 'refs';
+  map {
+        $_ => (defined(${"$_\::VERSION"}) ? ${"$_\::VERSION"} : undef)
+      } self_and_super_path($_[0])
+}
+
+# Also consider magic like:
+#   no strict 'refs';
+#   my %class2SomeHashr =
+#     map { defined(%{"$_\::SomeHash"}) ? ($_ => \%{"$_\::SomeHash"}) : () }
+#         Class::ISA::self_and_super_path($class);
+# to get a hash of refs to all the defined (and non-empty) hashes in
+# $class and its superclasses.
+#
+# Or even consider this incantation for doing something like hash-data
+# inheritance:
+#   no strict 'refs';
+#   %union_hash = 
+#     map { defined(%{"$_\::SomeHash"}) ? %{"$_\::SomeHash"}) : () }
+#         reverse(Class::ISA::self_and_super_path($class));
+# Consider that reverse() is necessary because with
+#   %foo = ('a', 'wun', 'b', 'tiw', 'a', 'foist');
+# $foo{'a'} is 'foist', not 'wun'.
+
+###########################################################################
+sub super_path {
+  my @ret = &self_and_super_path(@_);
+  shift @ret if @ret;
+  return @ret;
+}
+
+#--------------------------------------------------------------------------
+sub self_and_super_path {
+  # Assumption: searching is depth-first.
+  # Assumption: '' (empty string) can't be a class package name.
+  # Note: 'UNIVERSAL' is not given any special treatment.
+  return () unless @_;
+
+  my @out = ();
+
+  my @in_stack = ($_[0]);
+  my %seen = ($_[0] => 1);
+
+  my $current;
+  while(@in_stack) {
+    next unless defined($current = shift @in_stack) && length($current);
+    print "At $current\n" if $Debug;
+    push @out, $current;
+    no strict 'refs';
+    unshift @in_stack,
+      map
+        { my $c = $_; # copy, to avoid being destructive
+          substr($c,0,2) = "main::" if substr($c,0,2) eq '::';
+           # Canonize the :: -> main::, ::foo -> main::foo thing.
+           # Should I ever canonize the Foo'Bar = Foo::Bar thing? 
+          $seen{$c}++ ? () : $c;
+        }
+        @{"$current\::ISA"}
+    ;
+    # I.e., if this class has any parents (at least, ones I've never seen
+    # before), push them, in order, onto the stack of classes I need to
+    # explore.
+  }
+
+  return @out;
+}
+#--------------------------------------------------------------------------
+1;
+
+__END__
Index: /for-distributions/trunk/bin/windows/perl/lib/Class/Struct.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Class/Struct.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Class/Struct.pm	(revision 14489)
@@ -0,0 +1,636 @@
+package Class::Struct;
+
+## See POD after __END__
+
+use 5.006_001;
+
+use strict;
+use warnings::register;
+our(@ISA, @EXPORT, $VERSION);
+
+use Carp;
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(struct);
+
+$VERSION = '0.63';
+
+## Tested on 5.002 and 5.003 without class membership tests:
+my $CHECK_CLASS_MEMBERSHIP = ($] >= 5.003_95);
+
+my $print = 0;
+sub printem {
+    if (@_) { $print = shift }
+    else    { $print++ }
+}
+
+{
+    package Class::Struct::Tie_ISA;
+
+    sub TIEARRAY {
+        my $class = shift;
+        return bless [], $class;
+    }
+
+    sub STORE {
+        my ($self, $index, $value) = @_;
+        Class::Struct::_subclass_error();
+    }
+
+    sub FETCH {
+        my ($self, $index) = @_;
+        $self->[$index];
+    }
+
+    sub FETCHSIZE {
+        my $self = shift;
+        return scalar(@$self);
+    }
+
+    sub DESTROY { }
+}
+
+sub import {
+    my $self = shift;
+
+    if ( @_ == 0 ) {
+      $self->export_to_level( 1, $self, @EXPORT );
+    } elsif ( @_ == 1 ) {
+	# This is admittedly a little bit silly:
+	# do we ever export anything else than 'struct'...?
+      $self->export_to_level( 1, $self, @_ );
+    } else {
+      goto &struct;
+    }
+}
+
+sub struct {
+
+    # Determine parameter list structure, one of:
+    #   struct( class => [ element-list ])
+    #   struct( class => { element-list })
+    #   struct( element-list )
+    # Latter form assumes current package name as struct name.
+
+    my ($class, @decls);
+    my $base_type = ref $_[1];
+    if ( $base_type eq 'HASH' ) {
+        $class = shift;
+        @decls = %{shift()};
+        _usage_error() if @_;
+    }
+    elsif ( $base_type eq 'ARRAY' ) {
+        $class = shift;
+        @decls = @{shift()};
+        _usage_error() if @_;
+    }
+    else {
+        $base_type = 'ARRAY';
+        $class = (caller())[0];
+        @decls = @_;
+    }
+
+    _usage_error() if @decls % 2 == 1;
+
+    # Ensure we are not, and will not be, a subclass.
+
+    my $isa = do {
+        no strict 'refs';
+        \@{$class . '::ISA'};
+    };
+    _subclass_error() if @$isa;
+    tie @$isa, 'Class::Struct::Tie_ISA';
+
+    # Create constructor.
+
+    croak "function 'new' already defined in package $class"
+        if do { no strict 'refs'; defined &{$class . "::new"} };
+
+    my @methods = ();
+    my %refs = ();
+    my %arrays = ();
+    my %hashes = ();
+    my %classes = ();
+    my $got_class = 0;
+    my $out = '';
+
+    $out = "{\n  package $class;\n  use Carp;\n  sub new {\n";
+    $out .= "    my (\$class, \%init) = \@_;\n";
+    $out .= "    \$class = __PACKAGE__ unless \@_;\n";
+
+    my $cnt = 0;
+    my $idx = 0;
+    my( $cmt, $name, $type, $elem );
+
+    if( $base_type eq 'HASH' ){
+        $out .= "    my(\$r) = {};\n";
+        $cmt = '';
+    }
+    elsif( $base_type eq 'ARRAY' ){
+        $out .= "    my(\$r) = [];\n";
+    }
+    while( $idx < @decls ){
+        $name = $decls[$idx];
+        $type = $decls[$idx+1];
+        push( @methods, $name );
+        if( $base_type eq 'HASH' ){
+            $elem = "{'${class}::$name'}";
+        }
+        elsif( $base_type eq 'ARRAY' ){
+            $elem = "[$cnt]";
+            ++$cnt;
+            $cmt = " # $name";
+        }
+        if( $type =~ /^\*(.)/ ){
+            $refs{$name}++;
+            $type = $1;
+        }
+        my $init = "defined(\$init{'$name'}) ? \$init{'$name'} :";
+        if( $type eq '@' ){
+            $out .= "    croak 'Initializer for $name must be array reference'\n"; 
+            $out .= "        if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'ARRAY';\n";
+            $out .= "    \$r->$elem = $init [];$cmt\n"; 
+            $arrays{$name}++;
+        }
+        elsif( $type eq '%' ){
+            $out .= "    croak 'Initializer for $name must be hash reference'\n";
+            $out .= "        if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'HASH';\n";
+            $out .= "    \$r->$elem = $init {};$cmt\n";
+            $hashes{$name}++;
+        }
+        elsif ( $type eq '$') {
+            $out .= "    \$r->$elem = $init undef;$cmt\n";
+        }
+        elsif( $type =~ /^\w+(?:::\w+)*$/ ){
+            $out .= "    if (defined(\$init{'$name'})) {\n";
+           $out .= "       if (ref \$init{'$name'} eq 'HASH')\n";
+            $out .= "            { \$r->$elem = $type->new(\%{\$init{'$name'}}) } $cmt\n";
+           $out .= "       elsif (UNIVERSAL::isa(\$init{'$name'}, '$type'))\n";
+            $out .= "            { \$r->$elem = \$init{'$name'} } $cmt\n";
+            $out .= "       else { croak 'Initializer for $name must be hash or $type reference' }\n";
+            $out .= "    }\n";
+            $classes{$name} = $type;
+            $got_class = 1;
+        }
+        else{
+            croak "'$type' is not a valid struct element type";
+        }
+        $idx += 2;
+    }
+    $out .= "    bless \$r, \$class;\n  }\n";
+
+    # Create accessor methods.
+
+    my( $pre, $pst, $sel );
+    $cnt = 0;
+    foreach $name (@methods){
+        if ( do { no strict 'refs'; defined &{$class . "::$name"} } ) {
+            warnings::warnif("function '$name' already defined, overrides struct accessor method");
+        }
+        else {
+            $pre = $pst = $cmt = $sel = '';
+            if( defined $refs{$name} ){
+                $pre = "\\(";
+                $pst = ")";
+                $cmt = " # returns ref";
+            }
+            $out .= "  sub $name {$cmt\n    my \$r = shift;\n";
+            if( $base_type eq 'ARRAY' ){
+                $elem = "[$cnt]";
+                ++$cnt;
+            }
+            elsif( $base_type eq 'HASH' ){
+                $elem = "{'${class}::$name'}";
+            }
+            if( defined $arrays{$name} ){
+                $out .= "    my \$i;\n";
+                $out .= "    \@_ ? (\$i = shift) : return \$r->$elem;\n"; 
+                $out .= "    if (ref(\$i) eq 'ARRAY' && !\@_) { \$r->$elem = \$i; return \$r }\n";
+                $sel = "->[\$i]";
+            }
+            elsif( defined $hashes{$name} ){
+                $out .= "    my \$i;\n";
+                $out .= "    \@_ ? (\$i = shift) : return \$r->$elem;\n";
+                $out .= "    if (ref(\$i) eq 'HASH' && !\@_) { \$r->$elem = \$i; return \$r }\n";
+                $sel = "->{\$i}";
+            }
+            elsif( defined $classes{$name} ){
+                if ( $CHECK_CLASS_MEMBERSHIP ) {
+                    $out .= "    croak '$name argument is wrong class' if \@_ && ! UNIVERSAL::isa(\$_[0], '$classes{$name}');\n";
+                }
+            }
+            $out .= "    croak 'Too many args to $name' if \@_ > 1;\n";
+            $out .= "    \@_ ? ($pre\$r->$elem$sel = shift$pst) : $pre\$r->$elem$sel$pst;\n";
+            $out .= "  }\n";
+        }
+    }
+    $out .= "}\n1;\n";
+
+    print $out if $print;
+    my $result = eval $out;
+    carp $@ if $@;
+}
+
+sub _usage_error {
+    confess "struct usage error";
+}
+
+sub _subclass_error {
+    croak 'struct class cannot be a subclass (@ISA not allowed)';
+}
+
+1; # for require
+
+
+__END__
+
+=head1 NAME
+
+Class::Struct - declare struct-like datatypes as Perl classes
+
+=head1 SYNOPSIS
+
+    use Class::Struct;
+            # declare struct, based on array:
+    struct( CLASS_NAME => [ ELEMENT_NAME => ELEMENT_TYPE, ... ]);
+            # declare struct, based on hash:
+    struct( CLASS_NAME => { ELEMENT_NAME => ELEMENT_TYPE, ... });
+
+    package CLASS_NAME;
+    use Class::Struct;
+            # declare struct, based on array, implicit class name:
+    struct( ELEMENT_NAME => ELEMENT_TYPE, ... );
+
+    # Declare struct at compile time
+    use Class::Struct CLASS_NAME => [ ELEMENT_NAME => ELEMENT_TYPE, ... ];
+    use Class::Struct CLASS_NAME => { ELEMENT_NAME => ELEMENT_TYPE, ... };
+
+    # declare struct at compile time, based on array, implicit class name:
+    package CLASS_NAME;
+    use Class::Struct ELEMENT_NAME => ELEMENT_TYPE, ... ;
+
+    package Myobj;
+    use Class::Struct;
+            # declare struct with four types of elements:
+    struct( s => '$', a => '@', h => '%', c => 'My_Other_Class' );
+
+    $obj = new Myobj;               # constructor
+
+                                    # scalar type accessor:
+    $element_value = $obj->s;           # element value
+    $obj->s('new value');               # assign to element
+
+                                    # array type accessor:
+    $ary_ref = $obj->a;                 # reference to whole array
+    $ary_element_value = $obj->a(2);    # array element value
+    $obj->a(2, 'new value');            # assign to array element
+
+                                    # hash type accessor:
+    $hash_ref = $obj->h;                # reference to whole hash
+    $hash_element_value = $obj->h('x'); # hash element value
+    $obj->h('x', 'new value');          # assign to hash element
+
+                                    # class type accessor:
+    $element_value = $obj->c;           # object reference
+    $obj->c->method(...);               # call method of object
+    $obj->c(new My_Other_Class);        # assign a new object
+
+=head1 DESCRIPTION
+
+C<Class::Struct> exports a single function, C<struct>.
+Given a list of element names and types, and optionally
+a class name, C<struct> creates a Perl 5 class that implements
+a "struct-like" data structure.
+
+The new class is given a constructor method, C<new>, for creating
+struct objects.
+
+Each element in the struct data has an accessor method, which is
+used to assign to the element and to fetch its value.  The
+default accessor can be overridden by declaring a C<sub> of the
+same name in the package.  (See Example 2.)
+
+Each element's type can be scalar, array, hash, or class.
+
+=head2 The C<struct()> function
+
+The C<struct> function has three forms of parameter-list.
+
+    struct( CLASS_NAME => [ ELEMENT_LIST ]);
+    struct( CLASS_NAME => { ELEMENT_LIST });
+    struct( ELEMENT_LIST );
+
+The first and second forms explicitly identify the name of the
+class being created.  The third form assumes the current package
+name as the class name.
+
+An object of a class created by the first and third forms is
+based on an array, whereas an object of a class created by the
+second form is based on a hash. The array-based forms will be
+somewhat faster and smaller; the hash-based forms are more
+flexible.
+
+The class created by C<struct> must not be a subclass of another
+class other than C<UNIVERSAL>.
+
+It can, however, be used as a superclass for other classes. To facilitate
+this, the generated constructor method uses a two-argument blessing.
+Furthermore, if the class is hash-based, the key of each element is
+prefixed with the class name (see I<Perl Cookbook>, Recipe 13.12).
+
+A function named C<new> must not be explicitly defined in a class
+created by C<struct>.
+
+The I<ELEMENT_LIST> has the form
+
+    NAME => TYPE, ...
+
+Each name-type pair declares one element of the struct. Each
+element name will be defined as an accessor method unless a
+method by that name is explicitly defined; in the latter case, a
+warning is issued if the warning flag (B<-w>) is set.
+
+=head2 Class Creation at Compile Time
+
+C<Class::Struct> can create your class at compile time.  The main reason
+for doing this is obvious, so your class acts like every other class in
+Perl.  Creating your class at compile time will make the order of events
+similar to using any other class ( or Perl module ).
+
+There is no significant speed gain between compile time and run time
+class creation, there is just a new, more standard order of events.
+
+=head2 Element Types and Accessor Methods
+
+The four element types -- scalar, array, hash, and class -- are
+represented by strings -- C<'$'>, C<'@'>, C<'%'>, and a class name --
+optionally preceded by a C<'*'>.
+
+The accessor method provided by C<struct> for an element depends
+on the declared type of the element.
+
+=over 4
+
+=item Scalar (C<'$'> or C<'*$'>)
+
+The element is a scalar, and by default is initialized to C<undef>
+(but see L<Initializing with new>).
+
+The accessor's argument, if any, is assigned to the element.
+
+If the element type is C<'$'>, the value of the element (after
+assignment) is returned. If the element type is C<'*$'>, a reference
+to the element is returned.
+
+=item Array (C<'@'> or C<'*@'>)
+
+The element is an array, initialized by default to C<()>.
+
+With no argument, the accessor returns a reference to the
+element's whole array (whether or not the element was
+specified as C<'@'> or C<'*@'>).
+
+With one or two arguments, the first argument is an index
+specifying one element of the array; the second argument, if
+present, is assigned to the array element.  If the element type
+is C<'@'>, the accessor returns the array element value.  If the
+element type is C<'*@'>, a reference to the array element is
+returned.
+
+As a special case, when the accessor is called with an array reference
+as the sole argument, this causes an assignment of the whole array element.
+The object reference is returned.
+
+=item Hash (C<'%'> or C<'*%'>)
+
+The element is a hash, initialized by default to C<()>.
+
+With no argument, the accessor returns a reference to the
+element's whole hash (whether or not the element was
+specified as C<'%'> or C<'*%'>).
+
+With one or two arguments, the first argument is a key specifying
+one element of the hash; the second argument, if present, is
+assigned to the hash element.  If the element type is C<'%'>, the
+accessor returns the hash element value.  If the element type is
+C<'*%'>, a reference to the hash element is returned.
+
+As a special case, when the accessor is called with a hash reference
+as the sole argument, this causes an assignment of the whole hash element.
+The object reference is returned.
+
+=item Class (C<'Class_Name'> or C<'*Class_Name'>)
+
+The element's value must be a reference blessed to the named
+class or to one of its subclasses. The element is not initialized
+by default.
+
+The accessor's argument, if any, is assigned to the element. The
+accessor will C<croak> if this is not an appropriate object
+reference.
+
+If the element type does not start with a C<'*'>, the accessor
+returns the element value (after assignment). If the element type
+starts with a C<'*'>, a reference to the element itself is returned.
+
+=back
+
+=head2 Initializing with C<new>
+
+C<struct> always creates a constructor called C<new>. That constructor
+may take a list of initializers for the various elements of the new
+struct. 
+
+Each initializer is a pair of values: I<element name>C< =E<gt> >I<value>.
+The initializer value for a scalar element is just a scalar value. The 
+initializer for an array element is an array reference. The initializer
+for a hash is a hash reference.
+
+The initializer for a class element is an object of the corresponding class,
+or of one of it's subclasses, or a reference to a hash containing named 
+arguments to be passed to the element's constructor.
+
+See Example 3 below for an example of initialization.
+
+=head1 EXAMPLES
+
+=over 4
+
+=item Example 1
+
+Giving a struct element a class type that is also a struct is how
+structs are nested.  Here, C<Timeval> represents a time (seconds and
+microseconds), and C<Rusage> has two elements, each of which is of
+type C<Timeval>.
+
+    use Class::Struct;
+
+    struct( Rusage => {
+        ru_utime => 'Timeval',  # user time used
+        ru_stime => 'Timeval',  # system time used
+    });
+
+    struct( Timeval => [
+        tv_secs  => '$',        # seconds
+        tv_usecs => '$',        # microseconds
+    ]);
+
+        # create an object:
+    my $t = Rusage->new(ru_utime=>Timeval->new(), ru_stime=>Timeval->new());
+
+        # $t->ru_utime and $t->ru_stime are objects of type Timeval.
+        # set $t->ru_utime to 100.0 sec and $t->ru_stime to 5.0 sec.
+    $t->ru_utime->tv_secs(100);
+    $t->ru_utime->tv_usecs(0);
+    $t->ru_stime->tv_secs(5);
+    $t->ru_stime->tv_usecs(0);
+
+=item Example 2
+
+An accessor function can be redefined in order to provide
+additional checking of values, etc.  Here, we want the C<count>
+element always to be nonnegative, so we redefine the C<count>
+accessor accordingly.
+
+    package MyObj;
+    use Class::Struct;
+
+    # declare the struct
+    struct ( 'MyObj', { count => '$', stuff => '%' } );
+
+    # override the default accessor method for 'count'
+    sub count {
+        my $self = shift;
+        if ( @_ ) {
+            die 'count must be nonnegative' if $_[0] < 0;
+            $self->{'MyObj::count'} = shift;
+            warn "Too many args to count" if @_;
+        }
+        return $self->{'MyObj::count'};
+    }
+
+    package main;
+    $x = new MyObj;
+    print "\$x->count(5) = ", $x->count(5), "\n";
+                            # prints '$x->count(5) = 5'
+
+    print "\$x->count = ", $x->count, "\n";
+                            # prints '$x->count = 5'
+
+    print "\$x->count(-5) = ", $x->count(-5), "\n";
+                            # dies due to negative argument!
+
+=item Example 3
+
+The constructor of a generated class can be passed a list
+of I<element>=>I<value> pairs, with which to initialize the struct.
+If no initializer is specified for a particular element, its default
+initialization is performed instead. Initializers for non-existent
+elements are silently ignored.
+
+Note that the initializer for a nested class may be specified as
+an object of that class, or as a reference to a hash of initializers
+that are passed on to the nested struct's constructor.
+
+    use Class::Struct;
+
+    struct Breed =>
+    {
+        name  => '$',
+        cross => '$',
+    };
+
+    struct Cat =>
+    [
+        name     => '$',
+        kittens  => '@',
+        markings => '%',
+        breed    => 'Breed',
+    ];
+
+
+    my $cat = Cat->new( name     => 'Socks',
+                        kittens  => ['Monica', 'Kenneth'],
+                        markings => { socks=>1, blaze=>"white" },
+                        breed    => Breed->new(name=>'short-hair', cross=>1),
+                   or:  breed    => {name=>'short-hair', cross=>1},
+                      );
+
+    print "Once a cat called ", $cat->name, "\n";
+    print "(which was a ", $cat->breed->name, ")\n";
+    print "had two kittens: ", join(' and ', @{$cat->kittens}), "\n";
+
+=back
+
+=head1 Author and Modification History
+
+Modified by Damian Conway, 2001-09-10, v0.62.
+
+   Modified implicit construction of nested objects.
+   Now will also take an object ref instead of requiring a hash ref.
+   Also default initializes nested object attributes to undef, rather
+   than calling object constructor without args
+   Original over-helpfulness was fraught with problems:
+       * the class's constructor might not be called 'new'
+       * the class might not have a hash-like-arguments constructor
+       * the class might not have a no-argument constructor
+       * "recursive" data structures didn't work well:
+                 package Person;
+                 struct { mother => 'Person', father => 'Person'};
+
+
+Modified by Casey West, 2000-11-08, v0.59.
+
+    Added the ability for compile time class creation.
+
+Modified by Damian Conway, 1999-03-05, v0.58.
+
+    Added handling of hash-like arg list to class ctor.
+
+    Changed to two-argument blessing in ctor to support
+    derivation from created classes.
+
+    Added classname prefixes to keys in hash-based classes
+    (refer to "Perl Cookbook", Recipe 13.12 for rationale).
+
+    Corrected behaviour of accessors for '*@' and '*%' struct
+    elements.  Package now implements documented behaviour when
+    returning a reference to an entire hash or array element.
+    Previously these were returned as a reference to a reference
+    to the element.
+
+Renamed to C<Class::Struct> and modified by Jim Miner, 1997-04-02.
+
+    members() function removed.
+    Documentation corrected and extended.
+    Use of struct() in a subclass prohibited.
+    User definition of accessor allowed.
+    Treatment of '*' in element types corrected.
+    Treatment of classes as element types corrected.
+    Class name to struct() made optional.
+    Diagnostic checks added.
+
+Originally C<Class::Template> by Dean Roehrich.
+
+    # Template.pm   --- struct/member template builder
+    #   12mar95
+    #   Dean Roehrich
+    #
+    # changes/bugs fixed since 28nov94 version:
+    #  - podified
+    # changes/bugs fixed since 21nov94 version:
+    #  - Fixed examples.
+    # changes/bugs fixed since 02sep94 version:
+    #  - Moved to Class::Template.
+    # changes/bugs fixed since 20feb94 version:
+    #  - Updated to be a more proper module.
+    #  - Added "use strict".
+    #  - Bug in build_methods, was using @var when @$var needed.
+    #  - Now using my() rather than local().
+    #
+    # Uses perl5 classes to create nested data types.
+    # This is offered as one implementation of Tom Christiansen's "structs.pl"
+    # idea.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Config.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Config.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Config.pm	(revision 14489)
@@ -0,0 +1,95 @@
+# This file was created by configpm when Perl was built. Any changes
+# made to this file will be lost the next time perl is built.
+
+package Config;
+use strict;
+# use warnings; Pulls in Carp
+# use vars pulls in Carp
+@Config::EXPORT = qw(%Config);
+@Config::EXPORT_OK = qw(myconfig config_sh config_vars config_re);
+
+# Need to stub all the functions to make code such as print Config::config_sh
+# keep working
+
+sub myconfig;
+sub config_sh;
+sub config_vars;
+sub config_re;
+
+my %Export_Cache = map {($_ => 1)} (@Config::EXPORT, @Config::EXPORT_OK);
+
+our %Config;
+
+# Define our own import method to avoid pulling in the full Exporter:
+sub import {
+    my $pkg = shift;
+    @_ = @Config::EXPORT unless @_;
+
+    my @funcs = grep $_ ne '%Config', @_;
+    my $export_Config = @funcs < @_ ? 1 : 0;
+
+    no strict 'refs';
+    my $callpkg = caller(0);
+    foreach my $func (@funcs) {
+	die sprintf qq{"%s" is not exported by the %s module\n},
+	    $func, __PACKAGE__ unless $Export_Cache{$func};
+	*{$callpkg.'::'.$func} = \&{$func};
+    }
+
+    *{"$callpkg\::Config"} = \%Config if $export_Config;
+    return;
+}
+
+die "Perl lib version (v5.8.8) doesn't match executable version ($])"
+    unless $^V;
+
+$^V eq v5.8.8
+    or die "Perl lib version (v5.8.8) doesn't match executable version (" .
+	sprintf("v%vd",$^V) . ")";
+
+
+sub FETCH {
+    my($self, $key) = @_;
+
+    # check for cached value (which may be undef so we use exists not defined)
+    return $self->{$key} if exists $self->{$key};
+
+    return $self->fetch_string($key);
+}
+sub TIEHASH {
+    bless $_[1], $_[0];
+}
+
+sub DESTROY { }
+
+sub AUTOLOAD {
+    require 'Config_heavy.pl';
+    goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
+    die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
+}
+
+# tie returns the object, so the value returned to require will be true.
+tie %Config, 'Config', {
+    archlibexp => 'c:\\shaoqunWu\\perl\\lib',
+    archname => 'MSWin32-x86-multi-thread',
+    cc => 'cl',
+    d_readlink => undef,
+    d_symlink => undef,
+    dlsrc => 'dl_win32.xs',
+    dont_use_nlink => undef,
+    exe_ext => '.exe',
+    inc_version_list => '',
+    intsize => '4',
+    ldlibpthname => '',
+    libpth => 'C:\\PROGRA~1\\MICROS~3\\VC98\\lib',
+    osname => 'MSWin32',
+    osvers => '5.1',
+    path_sep => ';',
+    privlibexp => 'c:\\shaoqunWu\\perl\\lib',
+    scriptdir => 'c:\\shaoqunWu\\perl\\bin',
+    sitearchexp => 'c:\\shaoqunWu\\perl\\site\\lib',
+    sitelibexp => 'c:\\shaoqunWu\\perl\\site\\lib',
+    useithreads => 'define',
+    usevendorprefix => undef,
+    version => '5.8.8',
+};
Index: /for-distributions/trunk/bin/windows/perl/lib/Config.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Config.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Config.pod	(revision 14489)
@@ -0,0 +1,8257 @@
+=head1 NAME
+
+Config - access Perl configuration information
+
+=head1 SYNOPSIS
+
+    use Config;
+    if ($Config{usethreads}) {
+	print "has thread support\n"
+    } 
+
+    use Config qw(myconfig config_sh config_vars config_re);
+
+    print myconfig();
+
+    print config_sh();
+
+    print config_re();
+
+    config_vars(qw(osname archname));
+
+
+=head1 DESCRIPTION
+
+The Config module contains all the information that was available to
+the C<Configure> program at Perl build time (over 900 values).
+
+Shell variables from the F<config.sh> file (written by Configure) are
+stored in the readonly-variable C<%Config>, indexed by their names.
+
+Values stored in config.sh as 'undef' are returned as undefined
+values.  The perl C<exists> function can be used to check if a
+named variable exists.
+
+=over 4
+
+=item myconfig()
+
+Returns a textual summary of the major perl configuration values.
+See also C<-V> in L<perlrun/Switches>.
+
+=item config_sh()
+
+Returns the entire perl configuration information in the form of the
+original config.sh shell variable assignment script.
+
+=item config_re($regex)
+
+Like config_sh() but returns, as a list, only the config entries who's
+names match the $regex.
+
+=item config_vars(@names)
+
+Prints to STDOUT the values of the named configuration variable. Each is
+printed on a separate line in the form:
+
+  name='value';
+
+Names which are unknown are output as C<name='UNKNOWN';>.
+See also C<-V:name> in L<perlrun/Switches>.
+
+=back
+
+=head1 EXAMPLE
+
+Here's a more sophisticated example of using %Config:
+
+    use Config;
+    use strict;
+
+    my %sig_num;
+    my @sig_name;
+    unless($Config{sig_name} && $Config{sig_num}) {
+	die "No sigs?";
+    } else {
+	my @names = split ' ', $Config{sig_name};
+	@sig_num{@names} = split ' ', $Config{sig_num};
+	foreach (@names) {
+	    $sig_name[$sig_num{$_}] ||= $_;
+	}   
+    }
+
+    print "signal #17 = $sig_name[17]\n";
+    if ($sig_num{ALRM}) { 
+	print "SIGALRM is $sig_num{ALRM}\n";
+    }   
+
+=head1 WARNING
+
+Because this information is not stored within the perl executable
+itself it is possible (but unlikely) that the information does not
+relate to the actual perl binary which is being used to access it.
+
+The Config module is installed into the architecture and version
+specific library directory ($Config{installarchlib}) and it checks the
+perl version number when loaded.
+
+The values stored in config.sh may be either single-quoted or
+double-quoted. Double-quoted strings are handy for those cases where you
+need to include escape sequences in the strings. To avoid runtime variable
+interpolation, any C<$> and C<@> characters are replaced by C<\$> and
+C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$>
+or C<\@> in double-quoted strings unless you're willing to deal with the
+consequences. (The slashes will end up escaped and the C<$> or C<@> will
+trigger variable interpolation)
+
+=head1 GLOSSARY
+
+Most C<Config> variables are determined by the C<Configure> script
+on platforms supported by it (which is most UNIX platforms).  Some
+platforms have custom-made C<Config> variables, and may thus not have
+some of the variables described below, or may have extraneous variables
+specific to that particular port.  See the port specific documentation
+in such cases.
+
+=head2 _
+
+=over 4
+
+=item C<_a>
+
+From F<Unix.U>:
+
+This variable defines the extension used for ordinary library files.
+For unix, it is F<.a>.  The F<.> is included.  Other possible
+values include F<.lib>.
+
+=item C<_exe>
+
+From F<Unix.U>:
+
+This variable defines the extension used for executable files.
+C<DJGPP>, Cygwin and F<OS/2> use F<.exe>.  Stratus C<VOS> uses F<.pm>.
+On operating systems which do not require a specific extension
+for executable files, this variable is empty.
+
+=item C<_o>
+
+From F<Unix.U>:
+
+This variable defines the extension used for object files.
+For unix, it is F<.o>.  The F<.> is included.  Other possible
+values include F<.obj>.
+
+=back
+
+=head2 a
+
+=over 4
+
+=item C<afs>
+
+From F<afs.U>:
+
+This variable is set to C<true> if C<AFS> (Andrew File System) is used
+on the system, C<false> otherwise.  It is possible to override this
+with a hint value or command line option, but you'd better know
+what you are doing.
+
+=item C<afsroot>
+
+From F<afs.U>:
+
+This variable is by default set to F</afs>. In the unlikely case
+this is not the correct root, it is possible to override this with
+a hint value or command line option.  This will be used in subsequent
+tests for AFSness in the Perl configure and test process. 
+
+=item C<alignbytes>
+
+From F<alignbytes.U>:
+
+This variable holds the number of bytes required to align a
+double-- or a long double when applicable. Usual values are
+2, 4 and 8.  The default is eight, for safety.
+
+=item C<ansi2knr>
+
+From F<ansi2knr.U>:
+
+This variable is set if the user needs to run ansi2knr.  
+Currently, this is not supported, so we just abort.
+
+=item C<aphostname>
+
+From F<d_gethname.U>:
+
+This variable contains the command which can be used to compute the
+host name. The command is fully qualified by its absolute path, to make
+it safe when used by a process with super-user privileges.
+
+=item C<api_revision>
+
+From F<patchlevel.U>:
+
+The three variables, api_revision, api_version, and
+api_subversion, specify the version of the oldest perl binary
+compatible with the present perl.  In a full version string
+such as F<5.6.1>, api_revision is the C<5>.
+Prior to 5.5.640, the format was a floating point number,
+like 5.00563.
+
+F<perl.c>:incpush() and F<lib/lib.pm> will automatically search in
+F<$sitelib/.>. for older directories back to the limit specified
+by these api_ variables.  This is only useful if you have a
+perl library directory tree structured like the default one.
+See C<INSTALL> for how this works.  The versioned site_perl
+directory was introduced in 5.005, so that is the lowest
+possible value.  The version list appropriate for the current
+system is determined in F<inc_version_list.U>.
+
+C<XXX> To do:  Since compatibility can depend on compile time
+options (such as bincompat, longlong, etc.) it should
+(perhaps) be set by Configure, but currently it isn't.
+Currently, we read a hard-wired value from F<patchlevel.h>.
+Perhaps what we ought to do is take the hard-wired value from
+F<patchlevel.h> but then modify it if the current Configure
+options warrant.  F<patchlevel.h> then would use an #ifdef guard.
+
+=item C<api_subversion>
+
+From F<patchlevel.U>:
+
+The three variables, api_revision, api_version, and
+api_subversion, specify the version of the oldest perl binary
+compatible with the present perl.  In a full version string
+such as F<5.6.1>, api_subversion is the C<1>.  See api_revision for
+full details.
+
+=item C<api_version>
+
+From F<patchlevel.U>:
+
+The three variables, api_revision, api_version, and
+api_subversion, specify the version of the oldest perl binary
+compatible with the present perl.  In a full version string
+such as F<5.6.1>, api_version is the C<6>.  See api_revision for
+full details.  As a special case, 5.5.0 is rendered in the
+old-style as 5.005.  (In the 5.005_0x maintenance series,
+this was the only versioned directory in $sitelib.)
+
+=item C<api_versionstring>
+
+From F<patchlevel.U>:
+
+This variable combines api_revision, api_version, and
+api_subversion in a format such as 5.6.1 (or 5_6_1) suitable
+for use as a directory name.  This is filesystem dependent.
+
+=item C<ar>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the ar program.  After Configure runs,
+the value is reset to a plain C<ar> and is not useful.
+
+=item C<archlib>
+
+From F<archlib.U>:
+
+This variable holds the name of the directory in which the user wants
+to put architecture-dependent public library files for $package.
+It is most often a local directory such as F</usr/local/lib>.
+Programs using this variable must be prepared to deal
+with filename expansion.
+
+=item C<archlibexp>
+
+From F<archlib.U>:
+
+This variable is the same as the archlib variable, but is
+filename expanded at configuration time, for convenient use.
+
+=item C<archname64>
+
+From F<use64bits.U>:
+
+This variable is used for the 64-bitness part of $archname.
+
+=item C<archname>
+
+From F<archname.U>:
+
+This variable is a short name to characterize the current
+architecture.  It is used mainly to construct the default archlib.
+
+=item C<archobjs>
+
+From F<Unix.U>:
+
+This variable defines any additional objects that must be linked
+in with the program on this architecture.  On unix, it is usually
+empty.  It is typically used to include emulations of unix calls
+or other facilities.  For perl on F<OS/2>, for example, this would
+include F<os2/os2.obj>.
+
+=item C<asctime_r_proto>
+
+From F<d_asctime_r.U>:
+
+This variable encodes the prototype of asctime_r.
+It is zero if d_asctime_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_asctime_r
+is defined.
+
+=item C<awk>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the awk program.  After Configure runs,
+the value is reset to a plain C<awk> and is not useful.
+
+=back
+
+=head2 b
+
+=over 4
+
+=item C<baserev>
+
+From F<baserev.U>:
+
+The base revision level of this package, from the F<.package> file.
+
+=item C<bash>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<bin>
+
+From F<bin.U>:
+
+This variable holds the name of the directory in which the user wants
+to put publicly executable images for the package in question.  It
+is most often a local directory such as F</usr/local/bin>. Programs using
+this variable must be prepared to deal with F<~name> substitution.
+
+=item C<binexp>
+
+From F<bin.U>:
+
+This is the same as the bin variable, but is filename expanded at
+configuration time, for use in your makefiles.
+
+=item C<bison>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the bison program.  After Configure runs,
+the value is reset to a plain C<bison> and is not useful.
+
+=item C<byacc>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the byacc program.  After Configure runs,
+the value is reset to a plain C<byacc> and is not useful.
+
+=item C<byteorder>
+
+From F<byteorder.U>:
+
+This variable holds the byte order in a C<UV>. In the following,
+larger digits indicate more significance.  The variable byteorder
+is either 4321 on a big-endian machine, or 1234 on a little-endian,
+or 87654321 on a Cray ... or 3412 with weird order !
+
+=back
+
+=head2 c
+
+=over 4
+
+=item C<c>
+
+From F<n.U>:
+
+This variable contains the \c string if that is what causes the echo
+command to suppress newline.  Otherwise it is null.  Correct usage is
+$echo $n "prompt for a question: $c".
+
+=item C<castflags>
+
+From F<d_castneg.U>:
+
+This variable contains a flag that precise difficulties the
+compiler has casting odd floating values to unsigned long:
+0 = ok
+1 = couldn't cast < 0
+2 = couldn't cast >= 0x80000000
+4 = couldn't cast in argument expression list
+
+=item C<cat>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the cat program.  After Configure runs,
+the value is reset to a plain C<cat> and is not useful.
+
+=item C<cc>
+
+From F<cc.U>:
+
+This variable holds the name of a command to execute a C compiler which
+can resolve multiple global references that happen to have the same
+name.  Usual values are C<cc> and C<gcc>.
+Fervent C<ANSI> compilers may be called C<c89>.  C<AIX> has xlc.
+
+=item C<cccdlflags>
+
+From F<dlsrc.U>:
+
+This variable contains any special flags that might need to be
+passed with C<cc -c> to compile modules to be used to create a shared
+library that will be used for dynamic loading.  For hpux, this
+should be +z.  It is up to the makefile to use it.
+
+=item C<ccdlflags>
+
+From F<dlsrc.U>:
+
+This variable contains any special flags that might need to be
+passed to cc to link with a shared library for dynamic loading.
+It is up to the makefile to use it.  For sunos 4.1, it should
+be empty.
+
+=item C<ccflags>
+
+From F<ccflags.U>:
+
+This variable contains any additional C compiler flags desired by
+the user.  It is up to the Makefile to use this.
+
+=item C<ccflags_uselargefiles>
+
+From F<uselfs.U>:
+
+This variable contains the compiler flags needed by large file builds
+and added to ccflags by hints files.
+
+=item C<ccname>
+
+From F<Checkcc.U>:
+
+This can set either by hints files or by Configure.  If using
+gcc, this is gcc, and if not, usually equal to cc, unimpressive, no?
+Some platforms, however, make good use of this by storing the
+flavor of the C compiler being used here.  For example if using
+the Sun WorkShop suite, ccname will be C<workshop>.
+
+=item C<ccsymbols>
+
+From F<Cppsym.U>:
+
+The variable contains the symbols defined by the C compiler alone.
+The symbols defined by cpp or by cc when it calls cpp are not in
+this list, see cppsymbols and cppccsymbols.
+The list is a space-separated list of symbol=value tokens.
+
+=item C<ccversion>
+
+From F<Checkcc.U>:
+
+This can set either by hints files or by Configure.  If using
+a (non-gcc) vendor cc, this variable may contain a version for
+the compiler.
+
+=item C<cf_by>
+
+From F<cf_who.U>:
+
+Login name of the person who ran the Configure script and answered the
+questions. This is used to tag both F<config.sh> and F<config_h.SH>.
+
+=item C<cf_email>
+
+From F<cf_email.U>:
+
+Electronic mail address of the person who ran Configure. This can be
+used by units that require the user's e-mail, like F<MailList.U>.
+
+=item C<cf_time>
+
+From F<cf_who.U>:
+
+Holds the output of the C<date> command when the configuration file was
+produced. This is used to tag both F<config.sh> and F<config_h.SH>.
+
+=item C<charsize>
+
+From F<charsize.U>:
+
+This variable contains the value of the C<CHARSIZE> symbol, which
+indicates to the C program how many bytes there are in a character.
+
+=item C<chgrp>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<chmod>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the chmod program.  After Configure runs,
+the value is reset to a plain C<chmod> and is not useful.
+
+=item C<chown>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<clocktype>
+
+From F<d_times.U>:
+
+This variable holds the type returned by times(). It can be long,
+or clock_t on C<BSD> sites (in which case <sys/types.h> should be
+included).
+
+=item C<comm>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the comm program.  After Configure runs,
+the value is reset to a plain C<comm> and is not useful.
+
+=item C<compress>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<contains>
+
+From F<contains.U>:
+
+This variable holds the command to do a grep with a proper return
+status.  On most sane systems it is simply C<grep>.  On insane systems
+it is a grep followed by a cat followed by a test.  This variable
+is primarily for the use of other Configure units.
+
+=item C<cp>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the cp program.  After Configure runs,
+the value is reset to a plain C<cp> and is not useful.
+
+=item C<cpio>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<cpp>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the cpp program.  After Configure runs,
+the value is reset to a plain C<cpp> and is not useful.
+
+=item C<cpp_stuff>
+
+From F<cpp_stuff.U>:
+
+This variable contains an identification of the concatenation mechanism
+used by the C preprocessor.
+
+=item C<cppccsymbols>
+
+From F<Cppsym.U>:
+
+The variable contains the symbols defined by the C compiler
+when it calls cpp.  The symbols defined by the cc alone or cpp
+alone are not in this list, see ccsymbols and cppsymbols.
+The list is a space-separated list of symbol=value tokens.
+
+=item C<cppflags>
+
+From F<ccflags.U>:
+
+This variable holds the flags that will be passed to the C pre-
+processor. It is up to the Makefile to use it.
+
+=item C<cpplast>
+
+From F<cppstdin.U>:
+
+This variable has the same functionality as cppminus, only it applies
+to cpprun and not cppstdin.
+
+=item C<cppminus>
+
+From F<cppstdin.U>:
+
+This variable contains the second part of the string which will invoke
+the C preprocessor on the standard input and produce to standard
+output.  This variable will have the value C<-> if cppstdin needs
+a minus to specify standard input, otherwise the value is "".
+
+=item C<cpprun>
+
+From F<cppstdin.U>:
+
+This variable contains the command which will invoke a C preprocessor
+on standard input and put the output to stdout. It is guaranteed not
+to be a wrapper and may be a null string if no preprocessor can be
+made directly available. This preprocessor might be different from the
+one used by the C compiler. Don't forget to append cpplast after the
+preprocessor options.
+
+=item C<cppstdin>
+
+From F<cppstdin.U>:
+
+This variable contains the command which will invoke the C
+preprocessor on standard input and put the output to stdout.
+It is primarily used by other Configure units that ask about
+preprocessor symbols.
+
+=item C<cppsymbols>
+
+From F<Cppsym.U>:
+
+The variable contains the symbols defined by the C preprocessor
+alone.  The symbols defined by cc or by cc when it calls cpp are
+not in this list, see ccsymbols and cppccsymbols.
+The list is a space-separated list of symbol=value tokens.
+
+=item C<crypt_r_proto>
+
+From F<d_crypt_r.U>:
+
+This variable encodes the prototype of crypt_r.
+It is zero if d_crypt_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_crypt_r
+is defined.
+
+=item C<cryptlib>
+
+From F<d_crypt.U>:
+
+This variable holds -lcrypt or the path to a F<libcrypt.a> archive if
+the crypt() function is not defined in the standard C library. It is
+up to the Makefile to use this.
+
+=item C<csh>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the csh program.  After Configure runs,
+the value is reset to a plain C<csh> and is not useful.
+
+=item C<ctermid_r_proto>
+
+From F<d_ctermid_r.U>:
+
+This variable encodes the prototype of ctermid_r.
+It is zero if d_ctermid_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_ctermid_r
+is defined.
+
+=item C<ctime_r_proto>
+
+From F<d_ctime_r.U>:
+
+This variable encodes the prototype of ctime_r.
+It is zero if d_ctime_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_ctime_r
+is defined.
+
+=back
+
+=head2 d
+
+=over 4
+
+=item C<d__fwalk>
+
+From F<d__fwalk.U>:
+
+This variable conditionally defines C<HAS__FWALK> if _fwalk() is
+available to apply a function to all the file handles.
+
+=item C<d_access>
+
+From F<d_access.U>:
+
+This variable conditionally defines C<HAS_ACCESS> if the access() system
+call is available to check for access permissions using real IDs.
+
+=item C<d_accessx>
+
+From F<d_accessx.U>:
+
+This variable conditionally defines the C<HAS_ACCESSX> symbol, which
+indicates to the C program that the accessx() routine is available.
+
+=item C<d_aintl>
+
+From F<d_aintl.U>:
+
+This variable conditionally defines the C<HAS_AINTL> symbol, which
+indicates to the C program that the aintl() routine is available.
+If copysignl is also present we can emulate modfl.
+
+=item C<d_alarm>
+
+From F<d_alarm.U>:
+
+This variable conditionally defines the C<HAS_ALARM> symbol, which
+indicates to the C program that the alarm() routine is available.
+
+=item C<d_archlib>
+
+From F<archlib.U>:
+
+This variable conditionally defines C<ARCHLIB> to hold the pathname
+of architecture-dependent library files for $package.  If
+$archlib is the same as $privlib, then this is set to undef.
+
+=item C<d_asctime_r>
+
+From F<d_asctime_r.U>:
+
+This variable conditionally defines the C<HAS_ASCTIME_R> symbol,
+which indicates to the C program that the asctime_r()
+routine is available.
+
+=item C<d_atolf>
+
+From F<atolf.U>:
+
+This variable conditionally defines the C<HAS_ATOLF> symbol, which
+indicates to the C program that the atolf() routine is available.
+
+=item C<d_atoll>
+
+From F<atoll.U>:
+
+This variable conditionally defines the C<HAS_ATOLL> symbol, which
+indicates to the C program that the atoll() routine is available.
+
+=item C<d_attribute_format>
+
+From F<d_attribut_format.U>:
+
+This variable conditionally defines C<HASATTRIBUTE_FORMAT>, which
+indicates the C compiler can check for printf-like formats.
+
+=item C<d_attribute_malloc>
+
+From F<d_attribute_malloc.U>:
+
+This variable conditionally defines C<HASATTRIBUTE_MALLOC>, which
+indicates the C compiler can understand functions as having
+malloc-like semantics.
+
+=item C<d_attribute_nonnull>
+
+From F<d_attribute_nonnull.U>:
+
+This variable conditionally defines C<HASATTRIBUTE_NONNULL>, which
+indicates that the C compiler can know that certain arguments
+must not be C<NULL>, and will check accordingly at compile time.
+
+=item C<d_attribute_noreturn>
+
+From F<d_attribute_noreturn.U>:
+
+This variable conditionally defines C<HASATTRIBUTE_NORETURN>, which
+indicates that the C compiler can know that certain functions
+are guaranteed never to return.
+
+=item C<d_attribute_pure>
+
+From F<d_attribute_pure.U>:
+
+This variable conditionally defines C<HASATTRIBUTE_PURE>, which
+indicates that the C compiler can know that certain functions
+are C<pure> functions, meaning that they have no side effects, and
+only rely on function input F<and/or> global data for their results.
+
+=item C<d_attribute_unused>
+
+From F<d_attribute_unused.U>:
+
+This variable conditionally defines C<HASATTRIBUTE_UNUSED>, which
+indicates that the C compiler can know that certain variables
+and arguments may not always be used, and to not throw warnings
+if they don't get used.
+
+=item C<d_attribute_warn_unused_result>
+
+From F<d_attribute_warn_unused_result.U>:
+
+This variable conditionally defines
+C<HASATTRIBUTE_WARN_UNUSED_RESULT>, which indicates that the C
+compiler can know that certain functions have a return values
+that must not be ignored, such as malloc() or open().
+
+=item C<d_bcmp>
+
+From F<d_bcmp.U>:
+
+This variable conditionally defines the C<HAS_BCMP> symbol if
+the bcmp() routine is available to compare strings.
+
+=item C<d_bcopy>
+
+From F<d_bcopy.U>:
+
+This variable conditionally defines the C<HAS_BCOPY> symbol if
+the bcopy() routine is available to copy strings.
+
+=item C<d_bsd>
+
+From F<Guess.U>:
+
+This symbol conditionally defines the symbol C<BSD> when running on a
+C<BSD> system.
+
+=item C<d_bsdgetpgrp>
+
+From F<d_getpgrp.U>:
+
+This variable conditionally defines C<USE_BSD_GETPGRP> if
+getpgrp needs one arguments whereas C<USG> one needs none.
+
+=item C<d_bsdsetpgrp>
+
+From F<d_setpgrp.U>:
+
+This variable conditionally defines C<USE_BSD_SETPGRP> if
+setpgrp needs two arguments whereas C<USG> one needs none.
+See also d_setpgid for a C<POSIX> interface.
+
+=item C<d_bzero>
+
+From F<d_bzero.U>:
+
+This variable conditionally defines the C<HAS_BZERO> symbol if
+the bzero() routine is available to set memory to 0.
+
+=item C<d_casti32>
+
+From F<d_casti32.U>:
+
+This variable conditionally defines CASTI32, which indicates
+whether the C compiler can cast large floats to 32-bit ints.
+
+=item C<d_castneg>
+
+From F<d_castneg.U>:
+
+This variable conditionally defines C<CASTNEG>, which indicates
+wether the C compiler can cast negative float to unsigned.
+
+=item C<d_charvspr>
+
+From F<d_vprintf.U>:
+
+This variable conditionally defines C<CHARVSPRINTF> if this system
+has vsprintf returning type (char*).  The trend seems to be to
+declare it as "int vsprintf()".
+
+=item C<d_chown>
+
+From F<d_chown.U>:
+
+This variable conditionally defines the C<HAS_CHOWN> symbol, which
+indicates to the C program that the chown() routine is available.
+
+=item C<d_chroot>
+
+From F<d_chroot.U>:
+
+This variable conditionally defines the C<HAS_CHROOT> symbol, which
+indicates to the C program that the chroot() routine is available.
+
+=item C<d_chsize>
+
+From F<d_chsize.U>:
+
+This variable conditionally defines the C<CHSIZE> symbol, which
+indicates to the C program that the chsize() routine is available
+to truncate files.  You might need a -lx to get this routine.
+
+=item C<d_class>
+
+From F<d_class.U>:
+
+This variable conditionally defines the C<HAS_CLASS> symbol, which
+indicates to the C program that the class() routine is available.
+
+=item C<d_clearenv>
+
+From F<d_clearenv.U>:
+
+This variable conditionally defines the C<HAS_CLEARENV> symbol, which
+indicates to the C program that the clearenv () routine is available.
+
+=item C<d_closedir>
+
+From F<d_closedir.U>:
+
+This variable conditionally defines C<HAS_CLOSEDIR> if closedir() is
+available.
+
+=item C<d_cmsghdr_s>
+
+From F<d_cmsghdr_s.U>:
+
+This variable conditionally defines the C<HAS_STRUCT_CMSGHDR> symbol,
+which indicates that the struct cmsghdr is supported.
+
+=item C<d_const>
+
+From F<d_const.U>:
+
+This variable conditionally defines the C<HASCONST> symbol, which
+indicates to the C program that this C compiler knows about the
+const type.
+
+=item C<d_copysignl>
+
+From F<d_copysignl.U>:
+
+This variable conditionally defines the C<HAS_COPYSIGNL> symbol, which
+indicates to the C program that the copysignl() routine is available.
+If aintl is also present we can emulate modfl.
+
+=item C<d_crypt>
+
+From F<d_crypt.U>:
+
+This variable conditionally defines the C<CRYPT> symbol, which
+indicates to the C program that the crypt() routine is available
+to encrypt passwords and the like.
+
+=item C<d_crypt_r>
+
+From F<d_crypt_r.U>:
+
+This variable conditionally defines the C<HAS_CRYPT_R> symbol,
+which indicates to the C program that the crypt_r()
+routine is available.
+
+=item C<d_csh>
+
+From F<d_csh.U>:
+
+This variable conditionally defines the C<CSH> symbol, which
+indicates to the C program that the C-shell exists.
+
+=item C<d_ctermid_r>
+
+From F<d_ctermid_r.U>:
+
+This variable conditionally defines the C<HAS_CTERMID_R> symbol,
+which indicates to the C program that the ctermid_r()
+routine is available.
+
+=item C<d_ctime_r>
+
+From F<d_ctime_r.U>:
+
+This variable conditionally defines the C<HAS_CTIME_R> symbol,
+which indicates to the C program that the ctime_r()
+routine is available.
+
+=item C<d_cuserid>
+
+From F<d_cuserid.U>:
+
+This variable conditionally defines the C<HAS_CUSERID> symbol, which
+indicates to the C program that the cuserid() routine is available
+to get character login names.
+
+=item C<d_dbl_dig>
+
+From F<d_dbl_dig.U>:
+
+This variable conditionally defines d_dbl_dig if this system's
+header files provide C<DBL_DIG>, which is the number of significant
+digits in a double precision number.
+
+=item C<d_dbminitproto>
+
+From F<d_dbminitproto.U>:
+
+This variable conditionally defines the C<HAS_DBMINIT_PROTO> symbol,
+which indicates to the C program that the system provides
+a prototype for the dbminit() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_difftime>
+
+From F<d_difftime.U>:
+
+This variable conditionally defines the C<HAS_DIFFTIME> symbol, which
+indicates to the C program that the difftime() routine is available.
+
+=item C<d_dirfd>
+
+From F<d_dirfd.U>:
+
+This variable conditionally defines the C<HAS_DIRFD> constant,
+which indicates to the C program that dirfd() is available
+to return the file descriptor of a directory stream.
+
+=item C<d_dirnamlen>
+
+From F<i_dirent.U>:
+
+This variable conditionally defines C<DIRNAMLEN>, which indicates
+to the C program that the length of directory entry names is
+provided by a d_namelen field.
+
+=item C<d_dlerror>
+
+From F<d_dlerror.U>:
+
+This variable conditionally defines the C<HAS_DLERROR> symbol, which
+indicates to the C program that the dlerror() routine is available.
+
+=item C<d_dlopen>
+
+From F<d_dlopen.U>:
+
+This variable conditionally defines the C<HAS_DLOPEN> symbol, which
+indicates to the C program that the dlopen() routine is available.
+
+=item C<d_dlsymun>
+
+From F<d_dlsymun.U>:
+
+This variable conditionally defines C<DLSYM_NEEDS_UNDERSCORE>, which
+indicates that we need to prepend an underscore to the symbol
+name before calling dlsym().
+
+=item C<d_dosuid>
+
+From F<d_dosuid.U>:
+
+This variable conditionally defines the symbol C<DOSUID>, which
+tells the C program that it should insert setuid emulation code
+on hosts which have setuid #! scripts disabled.
+
+=item C<d_drand48_r>
+
+From F<d_drand48_r.U>:
+
+This variable conditionally defines the HAS_DRAND48_R symbol,
+which indicates to the C program that the drand48_r()
+routine is available.
+
+=item C<d_drand48proto>
+
+From F<d_drand48proto.U>:
+
+This variable conditionally defines the HAS_DRAND48_PROTO symbol,
+which indicates to the C program that the system provides
+a prototype for the drand48() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_dup2>
+
+From F<d_dup2.U>:
+
+This variable conditionally defines HAS_DUP2 if dup2() is
+available to duplicate file descriptors.
+
+=item C<d_eaccess>
+
+From F<d_eaccess.U>:
+
+This variable conditionally defines the C<HAS_EACCESS> symbol, which
+indicates to the C program that the eaccess() routine is available.
+
+=item C<d_endgrent>
+
+From F<d_endgrent.U>:
+
+This variable conditionally defines the C<HAS_ENDGRENT> symbol, which
+indicates to the C program that the endgrent() routine is available
+for sequential access of the group database.
+
+=item C<d_endgrent_r>
+
+From F<d_endgrent_r.U>:
+
+This variable conditionally defines the C<HAS_ENDGRENT_R> symbol,
+which indicates to the C program that the endgrent_r()
+routine is available.
+
+=item C<d_endhent>
+
+From F<d_endhent.U>:
+
+This variable conditionally defines C<HAS_ENDHOSTENT> if endhostent() is
+available to close whatever was being used for host queries.
+
+=item C<d_endhostent_r>
+
+From F<d_endhostent_r.U>:
+
+This variable conditionally defines the C<HAS_ENDHOSTENT_R> symbol,
+which indicates to the C program that the endhostent_r()
+routine is available.
+
+=item C<d_endnent>
+
+From F<d_endnent.U>:
+
+This variable conditionally defines C<HAS_ENDNETENT> if endnetent() is
+available to close whatever was being used for network queries.
+
+=item C<d_endnetent_r>
+
+From F<d_endnetent_r.U>:
+
+This variable conditionally defines the C<HAS_ENDNETENT_R> symbol,
+which indicates to the C program that the endnetent_r()
+routine is available.
+
+=item C<d_endpent>
+
+From F<d_endpent.U>:
+
+This variable conditionally defines C<HAS_ENDPROTOENT> if endprotoent() is
+available to close whatever was being used for protocol queries.
+
+=item C<d_endprotoent_r>
+
+From F<d_endprotoent_r.U>:
+
+This variable conditionally defines the C<HAS_ENDPROTOENT_R> symbol,
+which indicates to the C program that the endprotoent_r()
+routine is available.
+
+=item C<d_endpwent>
+
+From F<d_endpwent.U>:
+
+This variable conditionally defines the C<HAS_ENDPWENT> symbol, which
+indicates to the C program that the endpwent() routine is available
+for sequential access of the passwd database.
+
+=item C<d_endpwent_r>
+
+From F<d_endpwent_r.U>:
+
+This variable conditionally defines the C<HAS_ENDPWENT_R> symbol,
+which indicates to the C program that the endpwent_r()
+routine is available.
+
+=item C<d_endsent>
+
+From F<d_endsent.U>:
+
+This variable conditionally defines C<HAS_ENDSERVENT> if endservent() is
+available to close whatever was being used for service queries.
+
+=item C<d_endservent_r>
+
+From F<d_endservent_r.U>:
+
+This variable conditionally defines the C<HAS_ENDSERVENT_R> symbol,
+which indicates to the C program that the endservent_r()
+routine is available.
+
+=item C<d_eofnblk>
+
+From F<nblock_io.U>:
+
+This variable conditionally defines C<EOF_NONBLOCK> if C<EOF> can be seen
+when reading from a non-blocking I/O source.
+
+=item C<d_eunice>
+
+From F<Guess.U>:
+
+This variable conditionally defines the symbols C<EUNICE> and C<VAX>, which
+alerts the C program that it must deal with ideosyncracies of C<VMS>.
+
+=item C<d_faststdio>
+
+From F<d_faststdio.U>:
+
+This variable conditionally defines the C<HAS_FAST_STDIO> symbol,
+which indicates to the C program that the "fast stdio" is available
+to manipulate the stdio buffers directly.
+
+=item C<d_fchdir>
+
+From F<d_fchdir.U>:
+
+This variable conditionally defines the C<HAS_FCHDIR> symbol, which
+indicates to the C program that the fchdir() routine is available.
+
+=item C<d_fchmod>
+
+From F<d_fchmod.U>:
+
+This variable conditionally defines the C<HAS_FCHMOD> symbol, which
+indicates to the C program that the fchmod() routine is available
+to change mode of opened files.
+
+=item C<d_fchown>
+
+From F<d_fchown.U>:
+
+This variable conditionally defines the C<HAS_FCHOWN> symbol, which
+indicates to the C program that the fchown() routine is available
+to change ownership of opened files.
+
+=item C<d_fcntl>
+
+From F<d_fcntl.U>:
+
+This variable conditionally defines the C<HAS_FCNTL> symbol, and indicates
+whether the fcntl() function exists
+
+=item C<d_fcntl_can_lock>
+
+From F<d_fcntl_can_lock.U>:
+
+This variable conditionally defines the C<FCNTL_CAN_LOCK> symbol
+and indicates whether file locking with fcntl() works.
+
+=item C<d_fd_macros>
+
+From F<d_fd_set.U>:
+
+This variable contains the eventual value of the C<HAS_FD_MACROS> symbol,
+which indicates if your C compiler knows about the macros which
+manipulate an fd_set.
+
+=item C<d_fd_set>
+
+From F<d_fd_set.U>:
+
+This variable contains the eventual value of the C<HAS_FD_SET> symbol,
+which indicates if your C compiler knows about the fd_set typedef.
+
+=item C<d_fds_bits>
+
+From F<d_fd_set.U>:
+
+This variable contains the eventual value of the C<HAS_FDS_BITS> symbol,
+which indicates if your fd_set typedef contains the fds_bits member.
+If you have an fd_set typedef, but the dweebs who installed it did
+a half-fast job and neglected to provide the macros to manipulate
+an fd_set, C<HAS_FDS_BITS> will let us know how to fix the gaffe.
+
+=item C<d_fgetpos>
+
+From F<d_fgetpos.U>:
+
+This variable conditionally defines C<HAS_FGETPOS> if fgetpos() is
+available to get the file position indicator.
+
+=item C<d_finite>
+
+From F<d_finite.U>:
+
+This variable conditionally defines the C<HAS_FINITE> symbol, which
+indicates to the C program that the finite() routine is available.
+
+=item C<d_finitel>
+
+From F<d_finitel.U>:
+
+This variable conditionally defines the C<HAS_FINITEL> symbol, which
+indicates to the C program that the finitel() routine is available.
+
+=item C<d_flexfnam>
+
+From F<d_flexfnam.U>:
+
+This variable conditionally defines the C<FLEXFILENAMES> symbol, which
+indicates that the system supports filenames longer than 14 characters.
+
+=item C<d_flock>
+
+From F<d_flock.U>:
+
+This variable conditionally defines C<HAS_FLOCK> if flock() is
+available to do file locking.
+
+=item C<d_flockproto>
+
+From F<d_flockproto.U>:
+
+This variable conditionally defines the C<HAS_FLOCK_PROTO> symbol,
+which indicates to the C program that the system provides
+a prototype for the flock() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_fork>
+
+From F<d_fork.U>:
+
+This variable conditionally defines the C<HAS_FORK> symbol, which
+indicates to the C program that the fork() routine is available.
+
+=item C<d_fp_class>
+
+From F<d_fp_class.U>:
+
+This variable conditionally defines the C<HAS_FP_CLASS> symbol, which
+indicates to the C program that the fp_class() routine is available.
+
+=item C<d_fpathconf>
+
+From F<d_pathconf.U>:
+
+This variable conditionally defines the C<HAS_FPATHCONF> symbol, which
+indicates to the C program that the pathconf() routine is available
+to determine file-system related limits and options associated
+with a given open file descriptor.
+
+=item C<d_fpclass>
+
+From F<d_fpclass.U>:
+
+This variable conditionally defines the C<HAS_FPCLASS> symbol, which
+indicates to the C program that the fpclass() routine is available.
+
+=item C<d_fpclassify>
+
+From F<d_fpclassify.U>:
+
+This variable conditionally defines the C<HAS_FPCLASSIFY> symbol, which
+indicates to the C program that the fpclassify() routine is available.
+
+=item C<d_fpclassl>
+
+From F<d_fpclassl.U>:
+
+This variable conditionally defines the C<HAS_FPCLASSL> symbol, which
+indicates to the C program that the fpclassl() routine is available.
+
+=item C<d_fpos64_t>
+
+From F<d_fpos64_t.U>:
+
+This symbol will be defined if the C compiler supports fpos64_t.
+
+=item C<d_frexpl>
+
+From F<d_frexpl.U>:
+
+This variable conditionally defines the C<HAS_FREXPL> symbol, which
+indicates to the C program that the frexpl() routine is available.
+
+=item C<d_fs_data_s>
+
+From F<d_fs_data_s.U>:
+
+This variable conditionally defines the C<HAS_STRUCT_FS_DATA> symbol,
+which indicates that the struct fs_data is supported.
+
+=item C<d_fseeko>
+
+From F<d_fseeko.U>:
+
+This variable conditionally defines the C<HAS_FSEEKO> symbol, which
+indicates to the C program that the fseeko() routine is available.
+
+=item C<d_fsetpos>
+
+From F<d_fsetpos.U>:
+
+This variable conditionally defines C<HAS_FSETPOS> if fsetpos() is
+available to set the file position indicator.
+
+=item C<d_fstatfs>
+
+From F<d_fstatfs.U>:
+
+This variable conditionally defines the C<HAS_FSTATFS> symbol, which
+indicates to the C program that the fstatfs() routine is available.
+
+=item C<d_fstatvfs>
+
+From F<d_statvfs.U>:
+
+This variable conditionally defines the C<HAS_FSTATVFS> symbol, which
+indicates to the C program that the fstatvfs() routine is available.
+
+=item C<d_fsync>
+
+From F<d_fsync.U>:
+
+This variable conditionally defines the C<HAS_FSYNC> symbol, which
+indicates to the C program that the fsync() routine is available.
+
+=item C<d_ftello>
+
+From F<d_ftello.U>:
+
+This variable conditionally defines the C<HAS_FTELLO> symbol, which
+indicates to the C program that the ftello() routine is available.
+
+=item C<d_ftime>
+
+From F<d_ftime.U>:
+
+This variable conditionally defines the C<HAS_FTIME> symbol, which indicates
+that the ftime() routine exists.  The ftime() routine is basically
+a sub-second accuracy clock.
+
+=item C<d_futimes>
+
+From F<f_futimes.U>:
+
+This variable conditionally defines the C<HAS_FUTIMES> symbol, which
+indicates to the C program that the futimes() routine is available.
+
+=item C<d_Gconvert>
+
+From F<d_gconvert.U>:
+
+This variable holds what Gconvert is defined as to convert
+floating point numbers into strings.  By default, Configure
+sets C<this> macro to use the first of gconvert, gcvt, or sprintf
+that pass sprintf-%g-like behaviour tests.  If perl is using
+long doubles, the macro uses the first of the following
+functions that pass Configure's tests: qgcvt, sprintf (if
+Configure knows how to make sprintf format long doubles--see
+sPRIgldbl), gconvert, gcvt, and sprintf (casting to double).  
+The gconvert_preference and gconvert_ld_preference variables   
+can be used to alter Configure's preferences, for doubles and
+long doubles, respectively.  If present, they contain a       
+space-separated list of one or more of the above function       
+names in the order they should be tried.
+
+d_Gconvert may be set to override Configure with a platform-
+specific function.  If this function expects a double, a
+different value may need to be set by the F<uselongdouble.cbu>
+call-back unit so that long doubles can be formatted without
+loss of precision.
+
+=item C<d_getcwd>
+
+From F<d_getcwd.U>:
+
+This variable conditionally defines the C<HAS_GETCWD> symbol, which
+indicates to the C program that the getcwd() routine is available
+to get the current working directory.
+
+=item C<d_getespwnam>
+
+From F<d_getespwnam.U>:
+
+This variable conditionally defines C<HAS_GETESPWNAM> if getespwnam() is
+available to retrieve enchanced (shadow) password entries by name.
+
+=item C<d_getfsstat>
+
+From F<d_getfsstat.U>:
+
+This variable conditionally defines the C<HAS_GETFSSTAT> symbol, which
+indicates to the C program that the getfsstat() routine is available.
+
+=item C<d_getgrent>
+
+From F<d_getgrent.U>:
+
+This variable conditionally defines the C<HAS_GETGRENT> symbol, which
+indicates to the C program that the getgrent() routine is available
+for sequential access of the group database.
+
+=item C<d_getgrent_r>
+
+From F<d_getgrent_r.U>:
+
+This variable conditionally defines the C<HAS_GETGRENT_R> symbol,
+which indicates to the C program that the getgrent_r()
+routine is available.
+
+=item C<d_getgrgid_r>
+
+From F<d_getgrgid_r.U>:
+
+This variable conditionally defines the C<HAS_GETGRGID_R> symbol,
+which indicates to the C program that the getgrgid_r()
+routine is available.
+
+=item C<d_getgrnam_r>
+
+From F<d_getgrnam_r.U>:
+
+This variable conditionally defines the C<HAS_GETGRNAM_R> symbol,
+which indicates to the C program that the getgrnam_r()
+routine is available.
+
+=item C<d_getgrps>
+
+From F<d_getgrps.U>:
+
+This variable conditionally defines the C<HAS_GETGROUPS> symbol, which
+indicates to the C program that the getgroups() routine is available
+to get the list of process groups.
+
+=item C<d_gethbyaddr>
+
+From F<d_gethbyad.U>:
+
+This variable conditionally defines the C<HAS_GETHOSTBYADDR> symbol, which
+indicates to the C program that the gethostbyaddr() routine is available
+to look up hosts by their C<IP> addresses.
+
+=item C<d_gethbyname>
+
+From F<d_gethbynm.U>:
+
+This variable conditionally defines the C<HAS_GETHOSTBYNAME> symbol, which
+indicates to the C program that the gethostbyname() routine is available
+to look up host names in some data base or other.
+
+=item C<d_gethent>
+
+From F<d_gethent.U>:
+
+This variable conditionally defines C<HAS_GETHOSTENT> if gethostent() is
+available to look up host names in some data base or another.
+
+=item C<d_gethname>
+
+From F<d_gethname.U>:
+
+This variable conditionally defines the C<HAS_GETHOSTNAME> symbol, which
+indicates to the C program that the gethostname() routine may be
+used to derive the host name.
+
+=item C<d_gethostbyaddr_r>
+
+From F<d_gethostbyaddr_r.U>:
+
+This variable conditionally defines the C<HAS_GETHOSTBYADDR_R> symbol,
+which indicates to the C program that the gethostbyaddr_r()
+routine is available.
+
+=item C<d_gethostbyname_r>
+
+From F<d_gethostbyname_r.U>:
+
+This variable conditionally defines the C<HAS_GETHOSTBYNAME_R> symbol,
+which indicates to the C program that the gethostbyname_r()
+routine is available.
+
+=item C<d_gethostent_r>
+
+From F<d_gethostent_r.U>:
+
+This variable conditionally defines the C<HAS_GETHOSTENT_R> symbol,
+which indicates to the C program that the gethostent_r()
+routine is available.
+
+=item C<d_gethostprotos>
+
+From F<d_gethostprotos.U>:
+
+This variable conditionally defines the C<HAS_GETHOST_PROTOS> symbol,
+which indicates to the C program that <netdb.h> supplies
+prototypes for the various gethost*() functions.  
+See also F<netdbtype.U> for probing for various netdb types.
+
+=item C<d_getitimer>
+
+From F<d_getitimer.U>:
+
+This variable conditionally defines the C<HAS_GETITIMER> symbol, which
+indicates to the C program that the getitimer() routine is available.
+
+=item C<d_getlogin>
+
+From F<d_getlogin.U>:
+
+This variable conditionally defines the C<HAS_GETLOGIN> symbol, which
+indicates to the C program that the getlogin() routine is available
+to get the login name.
+
+=item C<d_getlogin_r>
+
+From F<d_getlogin_r.U>:
+
+This variable conditionally defines the C<HAS_GETLOGIN_R> symbol,
+which indicates to the C program that the getlogin_r()
+routine is available.
+
+=item C<d_getmnt>
+
+From F<d_getmnt.U>:
+
+This variable conditionally defines the C<HAS_GETMNT> symbol, which
+indicates to the C program that the getmnt() routine is available
+to retrieve one or more mount info blocks by filename.
+
+=item C<d_getmntent>
+
+From F<d_getmntent.U>:
+
+This variable conditionally defines the C<HAS_GETMNTENT> symbol, which
+indicates to the C program that the getmntent() routine is available
+to iterate through mounted files to get their mount info.
+
+=item C<d_getnbyaddr>
+
+From F<d_getnbyad.U>:
+
+This variable conditionally defines the C<HAS_GETNETBYADDR> symbol, which
+indicates to the C program that the getnetbyaddr() routine is available
+to look up networks by their C<IP> addresses.
+
+=item C<d_getnbyname>
+
+From F<d_getnbynm.U>:
+
+This variable conditionally defines the C<HAS_GETNETBYNAME> symbol, which
+indicates to the C program that the getnetbyname() routine is available
+to look up networks by their names.
+
+=item C<d_getnent>
+
+From F<d_getnent.U>:
+
+This variable conditionally defines C<HAS_GETNETENT> if getnetent() is
+available to look up network names in some data base or another.
+
+=item C<d_getnetbyaddr_r>
+
+From F<d_getnetbyaddr_r.U>:
+
+This variable conditionally defines the C<HAS_GETNETBYADDR_R> symbol,
+which indicates to the C program that the getnetbyaddr_r()
+routine is available.
+
+=item C<d_getnetbyname_r>
+
+From F<d_getnetbyname_r.U>:
+
+This variable conditionally defines the C<HAS_GETNETBYNAME_R> symbol,
+which indicates to the C program that the getnetbyname_r()
+routine is available.
+
+=item C<d_getnetent_r>
+
+From F<d_getnetent_r.U>:
+
+This variable conditionally defines the C<HAS_GETNETENT_R> symbol,
+which indicates to the C program that the getnetent_r()
+routine is available.
+
+=item C<d_getnetprotos>
+
+From F<d_getnetprotos.U>:
+
+This variable conditionally defines the C<HAS_GETNET_PROTOS> symbol,
+which indicates to the C program that <netdb.h> supplies
+prototypes for the various getnet*() functions.  
+See also F<netdbtype.U> for probing for various netdb types.
+
+=item C<d_getpagsz>
+
+From F<d_getpagsz.U>:
+
+This variable conditionally defines C<HAS_GETPAGESIZE> if getpagesize()
+is available to get the system page size.
+
+=item C<d_getpbyname>
+
+From F<d_getprotby.U>:
+
+This variable conditionally defines the C<HAS_GETPROTOBYNAME> 
+symbol, which indicates to the C program that the 
+getprotobyname() routine is available to look up protocols
+by their name.
+
+=item C<d_getpbynumber>
+
+From F<d_getprotby.U>:
+
+This variable conditionally defines the C<HAS_GETPROTOBYNUMBER> 
+symbol, which indicates to the C program that the 
+getprotobynumber() routine is available to look up protocols
+by their number.
+
+=item C<d_getpent>
+
+From F<d_getpent.U>:
+
+This variable conditionally defines C<HAS_GETPROTOENT> if getprotoent() is
+available to look up protocols in some data base or another.
+
+=item C<d_getpgid>
+
+From F<d_getpgid.U>:
+
+This variable conditionally defines the C<HAS_GETPGID> symbol, which
+indicates to the C program that the getpgid(pid) function
+is available to get the process group id.
+
+=item C<d_getpgrp2>
+
+From F<d_getpgrp2.U>:
+
+This variable conditionally defines the HAS_GETPGRP2 symbol, which
+indicates to the C program that the getpgrp2() (as in F<DG/C<UX>>) routine
+is available to get the current process group.
+
+=item C<d_getpgrp>
+
+From F<d_getpgrp.U>:
+
+This variable conditionally defines C<HAS_GETPGRP> if getpgrp() is
+available to get the current process group.
+
+=item C<d_getppid>
+
+From F<d_getppid.U>:
+
+This variable conditionally defines the C<HAS_GETPPID> symbol, which
+indicates to the C program that the getppid() routine is available
+to get the parent process C<ID>.
+
+=item C<d_getprior>
+
+From F<d_getprior.U>:
+
+This variable conditionally defines C<HAS_GETPRIORITY> if getpriority()
+is available to get a process's priority.
+
+=item C<d_getprotobyname_r>
+
+From F<d_getprotobyname_r.U>:
+
+This variable conditionally defines the C<HAS_GETPROTOBYNAME_R> symbol,
+which indicates to the C program that the getprotobyname_r()
+routine is available.
+
+=item C<d_getprotobynumber_r>
+
+From F<d_getprotobynumber_r.U>:
+
+This variable conditionally defines the C<HAS_GETPROTOBYNUMBER_R> symbol,
+which indicates to the C program that the getprotobynumber_r()
+routine is available.
+
+=item C<d_getprotoent_r>
+
+From F<d_getprotoent_r.U>:
+
+This variable conditionally defines the C<HAS_GETPROTOENT_R> symbol,
+which indicates to the C program that the getprotoent_r()
+routine is available.
+
+=item C<d_getprotoprotos>
+
+From F<d_getprotoprotos.U>:
+
+This variable conditionally defines the C<HAS_GETPROTO_PROTOS> symbol,
+which indicates to the C program that <netdb.h> supplies
+prototypes for the various getproto*() functions.  
+See also F<netdbtype.U> for probing for various netdb types.
+
+=item C<d_getprpwnam>
+
+From F<d_getprpwnam.U>:
+
+This variable conditionally defines C<HAS_GETPRPWNAM> if getprpwnam() is
+available to retrieve protected (shadow) password entries by name.
+
+=item C<d_getpwent>
+
+From F<d_getpwent.U>:
+
+This variable conditionally defines the C<HAS_GETPWENT> symbol, which
+indicates to the C program that the getpwent() routine is available
+for sequential access of the passwd database.
+
+=item C<d_getpwent_r>
+
+From F<d_getpwent_r.U>:
+
+This variable conditionally defines the C<HAS_GETPWENT_R> symbol,
+which indicates to the C program that the getpwent_r()
+routine is available.
+
+=item C<d_getpwnam_r>
+
+From F<d_getpwnam_r.U>:
+
+This variable conditionally defines the C<HAS_GETPWNAM_R> symbol,
+which indicates to the C program that the getpwnam_r()
+routine is available.
+
+=item C<d_getpwuid_r>
+
+From F<d_getpwuid_r.U>:
+
+This variable conditionally defines the C<HAS_GETPWUID_R> symbol,
+which indicates to the C program that the getpwuid_r()
+routine is available.
+
+=item C<d_getsbyname>
+
+From F<d_getsrvby.U>:
+
+This variable conditionally defines the C<HAS_GETSERVBYNAME> 
+symbol, which indicates to the C program that the 
+getservbyname() routine is available to look up services
+by their name.
+
+=item C<d_getsbyport>
+
+From F<d_getsrvby.U>:
+
+This variable conditionally defines the C<HAS_GETSERVBYPORT> 
+symbol, which indicates to the C program that the 
+getservbyport() routine is available to look up services
+by their port.
+
+=item C<d_getsent>
+
+From F<d_getsent.U>:
+
+This variable conditionally defines C<HAS_GETSERVENT> if getservent() is
+available to look up network services in some data base or another.
+
+=item C<d_getservbyname_r>
+
+From F<d_getservbyname_r.U>:
+
+This variable conditionally defines the C<HAS_GETSERVBYNAME_R> symbol,
+which indicates to the C program that the getservbyname_r()
+routine is available.
+
+=item C<d_getservbyport_r>
+
+From F<d_getservbyport_r.U>:
+
+This variable conditionally defines the C<HAS_GETSERVBYPORT_R> symbol,
+which indicates to the C program that the getservbyport_r()
+routine is available.
+
+=item C<d_getservent_r>
+
+From F<d_getservent_r.U>:
+
+This variable conditionally defines the C<HAS_GETSERVENT_R> symbol,
+which indicates to the C program that the getservent_r()
+routine is available.
+
+=item C<d_getservprotos>
+
+From F<d_getservprotos.U>:
+
+This variable conditionally defines the C<HAS_GETSERV_PROTOS> symbol,
+which indicates to the C program that <netdb.h> supplies
+prototypes for the various getserv*() functions.  
+See also F<netdbtype.U> for probing for various netdb types.
+
+=item C<d_getspnam>
+
+From F<d_getspnam.U>:
+
+This variable conditionally defines C<HAS_GETSPNAM> if getspnam() is
+available to retrieve SysV shadow password entries by name.
+
+=item C<d_getspnam_r>
+
+From F<d_getspnam_r.U>:
+
+This variable conditionally defines the C<HAS_GETSPNAM_R> symbol,
+which indicates to the C program that the getspnam_r()
+routine is available.
+
+=item C<d_gettimeod>
+
+From F<d_ftime.U>:
+
+This variable conditionally defines the C<HAS_GETTIMEOFDAY> symbol, which
+indicates that the gettimeofday() system call exists (to obtain a
+sub-second accuracy clock). You should probably include <sys/resource.h>.
+
+=item C<d_gmtime_r>
+
+From F<d_gmtime_r.U>:
+
+This variable conditionally defines the C<HAS_GMTIME_R> symbol,
+which indicates to the C program that the gmtime_r()
+routine is available.
+
+=item C<d_gnulibc>
+
+From F<d_gnulibc.U>:
+
+Defined if we're dealing with the C<GNU> C Library.
+
+=item C<d_grpasswd>
+
+From F<i_grp.U>:
+
+This variable conditionally defines C<GRPASSWD>, which indicates
+that struct group in <grp.h> contains gr_passwd.
+
+=item C<d_hasmntopt>
+
+From F<d_hasmntopt.U>:
+
+This variable conditionally defines the C<HAS_HASMNTOPT> symbol, which
+indicates to the C program that the hasmntopt() routine is available
+to query the mount options of file systems.
+
+=item C<d_htonl>
+
+From F<d_htonl.U>:
+
+This variable conditionally defines C<HAS_HTONL> if htonl() and its
+friends are available to do network order byte swapping.
+
+=item C<d_ilogbl>
+
+From F<d_ilogbl.U>:
+
+This variable conditionally defines the C<HAS_ILOGBL> symbol, which
+indicates to the C program that the ilogbl() routine is available.
+If scalbnl is also present we can emulate frexpl.
+
+=item C<d_index>
+
+From F<d_strchr.U>:
+
+This variable conditionally defines C<HAS_INDEX> if index() and
+rindex() are available for string searching.
+
+=item C<d_inetaton>
+
+From F<d_inetaton.U>:
+
+This variable conditionally defines the C<HAS_INET_ATON> symbol, which
+indicates to the C program that the inet_aton() function is available
+to parse C<IP> address C<dotted-quad> strings.
+
+=item C<d_int64_t>
+
+From F<d_int64_t.U>:
+
+This symbol will be defined if the C compiler supports int64_t.
+
+=item C<d_isascii>
+
+From F<d_isascii.U>:
+
+This variable conditionally defines the C<HAS_ISASCII> constant,
+which indicates to the C program that isascii() is available.
+
+=item C<d_isfinite>
+
+From F<d_isfinite.U>:
+
+This variable conditionally defines the C<HAS_ISFINITE> symbol, which
+indicates to the C program that the isfinite() routine is available.
+
+=item C<d_isinf>
+
+From F<d_isinf.U>:
+
+This variable conditionally defines the C<HAS_ISINF> symbol, which
+indicates to the C program that the isinf() routine is available.
+
+=item C<d_isnan>
+
+From F<d_isnan.U>:
+
+This variable conditionally defines the C<HAS_ISNAN> symbol, which
+indicates to the C program that the isnan() routine is available.
+
+=item C<d_isnanl>
+
+From F<d_isnanl.U>:
+
+This variable conditionally defines the C<HAS_ISNANL> symbol, which
+indicates to the C program that the isnanl() routine is available.
+
+=item C<d_killpg>
+
+From F<d_killpg.U>:
+
+This variable conditionally defines the C<HAS_KILLPG> symbol, which
+indicates to the C program that the killpg() routine is available
+to kill process groups.
+
+=item C<d_lchown>
+
+From F<d_lchown.U>:
+
+This variable conditionally defines the C<HAS_LCHOWN> symbol, which
+indicates to the C program that the lchown() routine is available
+to operate on a symbolic link (instead of following the link).
+
+=item C<d_ldbl_dig>
+
+From F<d_ldbl_dig.U>:
+
+This variable conditionally defines d_ldbl_dig if this system's
+header files provide C<LDBL_DIG>, which is the number of significant
+digits in a long double precision number.
+
+=item C<d_link>
+
+From F<d_link.U>:
+
+This variable conditionally defines C<HAS_LINK> if link() is
+available to create hard links.
+
+=item C<d_localtime_r>
+
+From F<d_localtime_r.U>:
+
+This variable conditionally defines the C<HAS_LOCALTIME_R> symbol,
+which indicates to the C program that the localtime_r()
+routine is available.
+
+=item C<d_locconv>
+
+From F<d_locconv.U>:
+
+This variable conditionally defines C<HAS_LOCALECONV> if localeconv() is
+available for numeric and monetary formatting conventions.
+
+=item C<d_lockf>
+
+From F<d_lockf.U>:
+
+This variable conditionally defines C<HAS_LOCKF> if lockf() is
+available to do file locking.
+
+=item C<d_longdbl>
+
+From F<d_longdbl.U>:
+
+This variable conditionally defines C<HAS_LONG_DOUBLE> if 
+the long double type is supported.
+
+=item C<d_longlong>
+
+From F<d_longlong.U>:
+
+This variable conditionally defines C<HAS_LONG_LONG> if 
+the long long type is supported.
+
+=item C<d_lseekproto>
+
+From F<d_lseekproto.U>:
+
+This variable conditionally defines the C<HAS_LSEEK_PROTO> symbol,
+which indicates to the C program that the system provides
+a prototype for the lseek() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_lstat>
+
+From F<d_lstat.U>:
+
+This variable conditionally defines C<HAS_LSTAT> if lstat() is
+available to do file stats on symbolic links.
+
+=item C<d_madvise>
+
+From F<d_madvise.U>:
+
+This variable conditionally defines C<HAS_MADVISE> if madvise() is
+available to map a file into memory.
+
+=item C<d_malloc_size>
+
+From F<d_malloc_size.U>:
+
+This symbol, if defined, indicates that the malloc_size
+routine is available for use.
+
+=item C<d_malloc_good_size>
+
+From F<d_malloc_good_size.U>:
+
+This symbol, if defined, indicates that the malloc_good_size
+routine is available for use.
+
+=item C<d_mblen>
+
+From F<d_mblen.U>:
+
+This variable conditionally defines the C<HAS_MBLEN> symbol, which
+indicates to the C program that the mblen() routine is available
+to find the number of bytes in a multibye character.
+
+=item C<d_mbstowcs>
+
+From F<d_mbstowcs.U>:
+
+This variable conditionally defines the C<HAS_MBSTOWCS> symbol, which
+indicates to the C program that the mbstowcs() routine is available
+to convert a multibyte string into a wide character string.
+
+=item C<d_mbtowc>
+
+From F<d_mbtowc.U>:
+
+This variable conditionally defines the C<HAS_MBTOWC> symbol, which
+indicates to the C program that the mbtowc() routine is available
+to convert multibyte to a wide character.
+
+=item C<d_memchr>
+
+From F<d_memchr.U>:
+
+This variable conditionally defines the C<HAS_MEMCHR> symbol, which
+indicates to the C program that the memchr() routine is available
+to locate characters within a C string.
+
+=item C<d_memcmp>
+
+From F<d_memcmp.U>:
+
+This variable conditionally defines the C<HAS_MEMCMP> symbol, which
+indicates to the C program that the memcmp() routine is available
+to compare blocks of memory.
+
+=item C<d_memcpy>
+
+From F<d_memcpy.U>:
+
+This variable conditionally defines the C<HAS_MEMCPY> symbol, which
+indicates to the C program that the memcpy() routine is available
+to copy blocks of memory.
+
+=item C<d_memmove>
+
+From F<d_memmove.U>:
+
+This variable conditionally defines the C<HAS_MEMMOVE> symbol, which
+indicates to the C program that the memmove() routine is available
+to copy potentatially overlapping blocks of memory.
+
+=item C<d_memset>
+
+From F<d_memset.U>:
+
+This variable conditionally defines the C<HAS_MEMSET> symbol, which
+indicates to the C program that the memset() routine is available
+to set blocks of memory.
+
+=item C<d_mkdir>
+
+From F<d_mkdir.U>:
+
+This variable conditionally defines the C<HAS_MKDIR> symbol, which
+indicates to the C program that the mkdir() routine is available
+to create F<directories.>.
+
+=item C<d_mkdtemp>
+
+From F<d_mkdtemp.U>:
+
+This variable conditionally defines the C<HAS_MKDTEMP> symbol, which
+indicates to the C program that the mkdtemp() routine is available
+to exclusively create a uniquely named temporary directory.
+
+=item C<d_mkfifo>
+
+From F<d_mkfifo.U>:
+
+This variable conditionally defines the C<HAS_MKFIFO> symbol, which
+indicates to the C program that the mkfifo() routine is available.
+
+=item C<d_mkstemp>
+
+From F<d_mkstemp.U>:
+
+This variable conditionally defines the C<HAS_MKSTEMP> symbol, which
+indicates to the C program that the mkstemp() routine is available
+to exclusively create and open a uniquely named temporary file.
+
+=item C<d_mkstemps>
+
+From F<d_mkstemps.U>:
+
+This variable conditionally defines the C<HAS_MKSTEMPS> symbol, which
+indicates to the C program that the mkstemps() routine is available
+to exclusively create and open a uniquely named (with a suffix)
+temporary file.
+
+=item C<d_mktime>
+
+From F<d_mktime.U>:
+
+This variable conditionally defines the C<HAS_MKTIME> symbol, which
+indicates to the C program that the mktime() routine is available.
+
+=item C<d_mmap>
+
+From F<d_mmap.U>:
+
+This variable conditionally defines C<HAS_MMAP> if mmap() is
+available to map a file into memory.
+
+=item C<d_modfl>
+
+From F<d_modfl.U>:
+
+This variable conditionally defines the C<HAS_MODFL> symbol, which
+indicates to the C program that the modfl() routine is available.
+
+=item C<d_modfl_pow32_bug>
+
+From F<d_modfl.U>:
+
+This variable conditionally defines the HAS_MODFL_POW32_BUG symbol,
+which indicates that modfl() is broken for long doubles >= pow(2, 32).
+For example from 4294967303.150000 one would get 4294967302.000000
+and 1.150000.  The bug has been seen in certain versions of glibc,
+release 2.2.2 is known to be okay.
+
+=item C<d_modflproto>
+
+From F<d_modfl.U>:
+
+This symbol, if defined, indicates that the system provides
+a prototype for the modfl() function.  Otherwise, it is up
+to the program to supply one.  C99 says it should be
+long double modfl(long double, long double *);
+
+=item C<d_mprotect>
+
+From F<d_mprotect.U>:
+
+This variable conditionally defines C<HAS_MPROTECT> if mprotect() is
+available to modify the access protection of a memory mapped file.
+
+=item C<d_msg>
+
+From F<d_msg.U>:
+
+This variable conditionally defines the C<HAS_MSG> symbol, which
+indicates that the entire msg*(2) library is present.
+
+=item C<d_msg_ctrunc>
+
+From F<d_socket.U>:
+
+This variable conditionally defines the C<HAS_MSG_CTRUNC> symbol,
+which indicates that the C<MSG_CTRUNC> is available.  #ifdef is
+not enough because it may be an enum, glibc has been known to do this.
+
+=item C<d_msg_dontroute>
+
+From F<d_socket.U>:
+
+This variable conditionally defines the C<HAS_MSG_DONTROUTE> symbol,
+which indicates that the C<MSG_DONTROUTE> is available.  #ifdef is
+not enough because it may be an enum, glibc has been known to do this.
+
+=item C<d_msg_oob>
+
+From F<d_socket.U>:
+
+This variable conditionally defines the C<HAS_MSG_OOB> symbol,
+which indicates that the C<MSG_OOB> is available.  #ifdef is
+not enough because it may be an enum, glibc has been known to do this.
+
+=item C<d_msg_peek>
+
+From F<d_socket.U>:
+
+This variable conditionally defines the C<HAS_MSG_PEEK> symbol,
+which indicates that the C<MSG_PEEK> is available.  #ifdef is
+not enough because it may be an enum, glibc has been known to do this.
+
+=item C<d_msg_proxy>
+
+From F<d_socket.U>:
+
+This variable conditionally defines the C<HAS_MSG_PROXY> symbol,
+which indicates that the C<MSG_PROXY> is available.  #ifdef is
+not enough because it may be an enum, glibc has been known to do this.
+
+=item C<d_msgctl>
+
+From F<d_msgctl.U>:
+
+This variable conditionally defines the C<HAS_MSGCTL> symbol, which
+indicates to the C program that the msgctl() routine is available.
+
+=item C<d_msgget>
+
+From F<d_msgget.U>:
+
+This variable conditionally defines the C<HAS_MSGGET> symbol, which
+indicates to the C program that the msgget() routine is available.
+
+=item C<d_msghdr_s>
+
+From F<d_msghdr_s.U>:
+
+This variable conditionally defines the C<HAS_STRUCT_MSGHDR> symbol,
+which indicates that the struct msghdr is supported.
+
+=item C<d_msgrcv>
+
+From F<d_msgrcv.U>:
+
+This variable conditionally defines the C<HAS_MSGRCV> symbol, which
+indicates to the C program that the msgrcv() routine is available.
+
+=item C<d_msgsnd>
+
+From F<d_msgsnd.U>:
+
+This variable conditionally defines the C<HAS_MSGSND> symbol, which
+indicates to the C program that the msgsnd() routine is available.
+
+=item C<d_msync>
+
+From F<d_msync.U>:
+
+This variable conditionally defines C<HAS_MSYNC> if msync() is
+available to synchronize a mapped file.
+
+=item C<d_munmap>
+
+From F<d_munmap.U>:
+
+This variable conditionally defines C<HAS_MUNMAP> if munmap() is
+available to unmap a region mapped by mmap().
+
+=item C<d_mymalloc>
+
+From F<mallocsrc.U>:
+
+This variable conditionally defines C<MYMALLOC> in case other parts
+of the source want to take special action if C<MYMALLOC> is used.
+This may include different sorts of profiling or error detection.
+
+=item C<d_nanosleep>
+
+From F<d_nanosleep.U>:
+
+This variable conditionally defines C<HAS_NANOSLEEP>
+if nanosleep() is available to sleep with 1E-9 sec accuracy.
+
+=item C<d_nice>
+
+From F<d_nice.U>:
+
+This variable conditionally defines the C<HAS_NICE> symbol, which
+indicates to the C program that the nice() routine is available.
+
+=item C<d_nl_langinfo>
+
+From F<d_nl_langinfo.U>:
+
+This variable conditionally defines the C<HAS_NL_LANGINFO> symbol, which
+indicates to the C program that the nl_langinfo() routine is available.
+
+=item C<d_nv_preserves_uv>
+
+From F<perlxv.U>:
+
+This variable indicates whether a variable of type nvtype
+can preserve all the bits a variable of type uvtype.
+
+=item C<d_nv_zero_is_allbits_zero>
+
+From F<perlxv.U>:
+
+This variable indicates whether a variable of type nvtype
+stores 0.0 in memory as all bits zero.
+
+=item C<d_off64_t>
+
+From F<d_off64_t.U>:
+
+This symbol will be defined if the C compiler supports off64_t.
+
+=item C<d_old_pthread_create_joinable>
+
+From F<d_pthrattrj.U>:
+
+This variable conditionally defines pthread_create_joinable.
+undef if F<pthread.h> defines C<PTHREAD_CREATE_JOINABLE>.
+
+=item C<d_oldpthreads>
+
+From F<usethreads.U>:
+
+This variable conditionally defines the C<OLD_PTHREADS_API> symbol,
+and indicates that Perl should be built to use the old
+draft C<POSIX> threads C<API>.  This is only potentially meaningful if
+usethreads is set.
+
+=item C<d_oldsock>
+
+From F<d_socket.U>:
+
+This variable conditionally defines the C<OLDSOCKET> symbol, which
+indicates that the C<BSD> socket interface is based on 4.1c and not 4.2.
+
+=item C<d_open3>
+
+From F<d_open3.U>:
+
+This variable conditionally defines the HAS_OPEN3 manifest constant,
+which indicates to the C program that the 3 argument version of
+the open(2) function is available.
+
+=item C<d_pathconf>
+
+From F<d_pathconf.U>:
+
+This variable conditionally defines the C<HAS_PATHCONF> symbol, which
+indicates to the C program that the pathconf() routine is available
+to determine file-system related limits and options associated
+with a given filename.
+
+=item C<d_pause>
+
+From F<d_pause.U>:
+
+This variable conditionally defines the C<HAS_PAUSE> symbol, which
+indicates to the C program that the pause() routine is available
+to suspend a process until a signal is received.
+
+=item C<d_perl_otherlibdirs>
+
+From F<otherlibdirs.U>:
+
+This variable conditionally defines C<PERL_OTHERLIBDIRS>, which
+contains a colon-separated set of paths for the perl binary to
+include in @C<INC>.  See also otherlibdirs.
+
+=item C<d_phostname>
+
+From F<d_gethname.U>:
+
+This variable conditionally defines the C<HAS_PHOSTNAME> symbol, which
+contains the shell command which, when fed to popen(), may be
+used to derive the host name.
+
+=item C<d_pipe>
+
+From F<d_pipe.U>:
+
+This variable conditionally defines the C<HAS_PIPE> symbol, which
+indicates to the C program that the pipe() routine is available
+to create an inter-process channel.
+
+=item C<d_poll>
+
+From F<d_poll.U>:
+
+This variable conditionally defines the C<HAS_POLL> symbol, which
+indicates to the C program that the poll() routine is available
+to poll active file descriptors.
+
+=item C<d_portable>
+
+From F<d_portable.U>:
+
+This variable conditionally defines the C<PORTABLE> symbol, which
+indicates to the C program that it should not assume that it is
+running on the machine it was compiled on.
+
+=item C<d_PRId64>
+
+From F<quadfio.U>:
+
+This variable conditionally defines the PERL_PRId64 symbol, which
+indiciates that stdio has a symbol to print 64-bit decimal numbers.
+
+=item C<d_PRIeldbl>
+
+From F<longdblfio.U>:
+
+This variable conditionally defines the PERL_PRIfldbl symbol, which
+indiciates that stdio has a symbol to print long doubles.
+
+=item C<d_PRIEUldbl>
+
+From F<longdblfio.U>:
+
+This variable conditionally defines the PERL_PRIfldbl symbol, which
+indiciates that stdio has a symbol to print long doubles.
+The C<U> in the name is to separate this from d_PRIeldbl so that even
+case-blind systems can see the difference.
+
+=item C<d_PRIfldbl>
+
+From F<longdblfio.U>:
+
+This variable conditionally defines the PERL_PRIfldbl symbol, which
+indiciates that stdio has a symbol to print long doubles.
+
+=item C<d_PRIFUldbl>
+
+From F<longdblfio.U>:
+
+This variable conditionally defines the PERL_PRIfldbl symbol, which
+indiciates that stdio has a symbol to print long doubles.
+The C<U> in the name is to separate this from d_PRIfldbl so that even
+case-blind systems can see the difference.
+
+=item C<d_PRIgldbl>
+
+From F<longdblfio.U>:
+
+This variable conditionally defines the PERL_PRIfldbl symbol, which
+indiciates that stdio has a symbol to print long doubles.
+
+=item C<d_PRIGUldbl>
+
+From F<longdblfio.U>:
+
+This variable conditionally defines the PERL_PRIfldbl symbol, which
+indiciates that stdio has a symbol to print long doubles.
+The C<U> in the name is to separate this from d_PRIgldbl so that even
+case-blind systems can see the difference.
+
+=item C<d_PRIi64>
+
+From F<quadfio.U>:
+
+This variable conditionally defines the PERL_PRIi64 symbol, which
+indiciates that stdio has a symbol to print 64-bit decimal numbers.
+
+=item C<d_PRIo64>
+
+From F<quadfio.U>:
+
+This variable conditionally defines the PERL_PRIo64 symbol, which
+indiciates that stdio has a symbol to print 64-bit octal numbers.
+
+=item C<d_PRIu64>
+
+From F<quadfio.U>:
+
+This variable conditionally defines the PERL_PRIu64 symbol, which
+indiciates that stdio has a symbol to print 64-bit unsigned decimal
+numbers.
+
+=item C<d_PRIx64>
+
+From F<quadfio.U>:
+
+This variable conditionally defines the PERL_PRIx64 symbol, which
+indiciates that stdio has a symbol to print 64-bit hexadecimal numbers.
+
+=item C<d_PRIXU64>
+
+From F<quadfio.U>:
+
+This variable conditionally defines the PERL_PRIXU64 symbol, which
+indiciates that stdio has a symbol to print 64-bit hExADECimAl numbers.
+The C<U> in the name is to separate this from d_PRIx64 so that even
+case-blind systems can see the difference.
+
+=item C<d_procselfexe>
+
+From F<d_procselfexe.U>:
+
+Defined if $procselfexe is symlink to the absolute
+pathname of the executing program.
+
+=item C<d_pthread_atfork>
+
+From F<d_pthread_atfork.U>:
+
+This variable conditionally defines the C<HAS_PTHREAD_ATFORK> symbol,
+which indicates to the C program that the pthread_atfork()
+routine is available.
+
+=item C<d_pthread_attr_setscope>
+
+From F<d_pthread_attr_ss.U>:
+
+This variable conditionally defines C<HAS_PTHREAD_ATTR_SETSCOPE> if
+pthread_attr_setscope() is available to set the contention scope
+attribute of a thread attribute object.
+
+=item C<d_pthread_yield>
+
+From F<d_pthread_y.U>:
+
+This variable conditionally defines the C<HAS_PTHREAD_YIELD>
+symbol if the pthread_yield routine is available to yield
+the execution of the current thread.
+
+=item C<d_pwage>
+
+From F<i_pwd.U>:
+
+This variable conditionally defines C<PWAGE>, which indicates
+that struct passwd contains pw_age.
+
+=item C<d_pwchange>
+
+From F<i_pwd.U>:
+
+This variable conditionally defines C<PWCHANGE>, which indicates
+that struct passwd contains pw_change.
+
+=item C<d_pwclass>
+
+From F<i_pwd.U>:
+
+This variable conditionally defines C<PWCLASS>, which indicates
+that struct passwd contains pw_class.
+
+=item C<d_pwcomment>
+
+From F<i_pwd.U>:
+
+This variable conditionally defines C<PWCOMMENT>, which indicates
+that struct passwd contains pw_comment.
+
+=item C<d_pwexpire>
+
+From F<i_pwd.U>:
+
+This variable conditionally defines C<PWEXPIRE>, which indicates
+that struct passwd contains pw_expire.
+
+=item C<d_pwgecos>
+
+From F<i_pwd.U>:
+
+This variable conditionally defines C<PWGECOS>, which indicates
+that struct passwd contains pw_gecos.
+
+=item C<d_pwpasswd>
+
+From F<i_pwd.U>:
+
+This variable conditionally defines C<PWPASSWD>, which indicates
+that struct passwd contains pw_passwd.
+
+=item C<d_pwquota>
+
+From F<i_pwd.U>:
+
+This variable conditionally defines C<PWQUOTA>, which indicates
+that struct passwd contains pw_quota.
+
+=item C<d_qgcvt>
+
+From F<d_qgcvt.U>:
+
+This variable conditionally defines the C<HAS_QGCVT> symbol, which
+indicates to the C program that the qgcvt() routine is available.
+
+=item C<d_quad>
+
+From F<quadtype.U>:
+
+This variable, if defined, tells that there's a 64-bit integer type,
+quadtype.
+
+=item C<d_random_r>
+
+From F<d_random_r.U>:
+
+This variable conditionally defines the C<HAS_RANDOM_R> symbol,
+which indicates to the C program that the random_r()
+routine is available.
+
+=item C<d_readdir64_r>
+
+From F<d_readdir64_r.U>:
+
+This variable conditionally defines the HAS_READDIR64_R symbol,
+which indicates to the C program that the readdir64_r()
+routine is available.
+
+=item C<d_readdir>
+
+From F<d_readdir.U>:
+
+This variable conditionally defines C<HAS_READDIR> if readdir() is
+available to read directory entries.
+
+=item C<d_readdir_r>
+
+From F<d_readdir_r.U>:
+
+This variable conditionally defines the C<HAS_READDIR_R> symbol,
+which indicates to the C program that the readdir_r()
+routine is available.
+
+=item C<d_readlink>
+
+From F<d_readlink.U>:
+
+This variable conditionally defines the C<HAS_READLINK> symbol, which
+indicates to the C program that the readlink() routine is available
+to read the value of a symbolic link.
+
+=item C<d_readv>
+
+From F<d_readv.U>:
+
+This variable conditionally defines the C<HAS_READV> symbol, which
+indicates to the C program that the readv() routine is available.
+
+=item C<d_recvmsg>
+
+From F<d_recvmsg.U>:
+
+This variable conditionally defines the C<HAS_RECVMSG> symbol, which
+indicates to the C program that the recvmsg() routine is available.
+
+=item C<d_rename>
+
+From F<d_rename.U>:
+
+This variable conditionally defines the C<HAS_RENAME> symbol, which
+indicates to the C program that the rename() routine is available
+to rename files.
+
+=item C<d_rewinddir>
+
+From F<d_readdir.U>:
+
+This variable conditionally defines C<HAS_REWINDDIR> if rewinddir() is
+available.
+
+=item C<d_rmdir>
+
+From F<d_rmdir.U>:
+
+This variable conditionally defines C<HAS_RMDIR> if rmdir() is
+available to remove directories.
+
+=item C<d_safebcpy>
+
+From F<d_safebcpy.U>:
+
+This variable conditionally defines the C<HAS_SAFE_BCOPY> symbol if
+the bcopy() routine can do overlapping copies.  Normally, you
+should probably use memmove().
+
+=item C<d_safemcpy>
+
+From F<d_safemcpy.U>:
+
+This variable conditionally defines the C<HAS_SAFE_MEMCPY> symbol if
+the memcpy() routine can do overlapping copies.
+For overlapping copies, memmove() should be used, if available.
+
+=item C<d_sanemcmp>
+
+From F<d_sanemcmp.U>:
+
+This variable conditionally defines the C<HAS_SANE_MEMCMP> symbol if
+the memcpy() routine is available and can be used to compare relative
+magnitudes of chars with their high bits set.
+
+=item C<d_sbrkproto>
+
+From F<d_sbrkproto.U>:
+
+This variable conditionally defines the C<HAS_SBRK_PROTO> symbol,
+which indicates to the C program that the system provides
+a prototype for the sbrk() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_scalbnl>
+
+From F<d_scalbnl.U>:
+
+This variable conditionally defines the C<HAS_SCALBNL> symbol, which
+indicates to the C program that the scalbnl() routine is available.
+If ilogbl is also present we can emulate frexpl.
+
+=item C<d_sched_yield>
+
+From F<d_pthread_y.U>:
+
+This variable conditionally defines the C<HAS_SCHED_YIELD>
+symbol if the sched_yield routine is available to yield
+the execution of the current thread.
+
+=item C<d_scm_rights>
+
+From F<d_socket.U>:
+
+This variable conditionally defines the C<HAS_SCM_RIGHTS> symbol,
+which indicates that the C<SCM_RIGHTS> is available.  #ifdef is
+not enough because it may be an enum, glibc has been known to do this.
+
+=item C<d_SCNfldbl>
+
+From F<longdblfio.U>:
+
+This variable conditionally defines the PERL_PRIfldbl symbol, which
+indiciates that stdio has a symbol to scan long doubles.
+
+=item C<d_seekdir>
+
+From F<d_readdir.U>:
+
+This variable conditionally defines C<HAS_SEEKDIR> if seekdir() is
+available.
+
+=item C<d_select>
+
+From F<d_select.U>:
+
+This variable conditionally defines C<HAS_SELECT> if select() is
+available to select active file descriptors. A <sys/time.h>
+inclusion may be necessary for the timeout field.
+
+=item C<d_sem>
+
+From F<d_sem.U>:
+
+This variable conditionally defines the C<HAS_SEM> symbol, which
+indicates that the entire sem*(2) library is present.
+
+=item C<d_semctl>
+
+From F<d_semctl.U>:
+
+This variable conditionally defines the C<HAS_SEMCTL> symbol, which
+indicates to the C program that the semctl() routine is available.
+
+=item C<d_semctl_semid_ds>
+
+From F<d_union_semun.U>:
+
+This variable conditionally defines C<USE_SEMCTL_SEMID_DS>, which
+indicates that struct semid_ds * is to be used for semctl C<IPC_STAT>.
+
+=item C<d_semctl_semun>
+
+From F<d_union_semun.U>:
+
+This variable conditionally defines C<USE_SEMCTL_SEMUN>, which
+indicates that union semun is to be used for semctl C<IPC_STAT>.
+
+=item C<d_semget>
+
+From F<d_semget.U>:
+
+This variable conditionally defines the C<HAS_SEMGET> symbol, which
+indicates to the C program that the semget() routine is available.
+
+=item C<d_semop>
+
+From F<d_semop.U>:
+
+This variable conditionally defines the C<HAS_SEMOP> symbol, which
+indicates to the C program that the semop() routine is available.
+
+=item C<d_sendmsg>
+
+From F<d_sendmsg.U>:
+
+This variable conditionally defines the C<HAS_SENDMSG> symbol, which
+indicates to the C program that the sendmsg() routine is available.
+
+=item C<d_setegid>
+
+From F<d_setegid.U>:
+
+This variable conditionally defines the C<HAS_SETEGID> symbol, which
+indicates to the C program that the setegid() routine is available
+to change the effective gid of the current program.
+
+=item C<d_seteuid>
+
+From F<d_seteuid.U>:
+
+This variable conditionally defines the C<HAS_SETEUID> symbol, which
+indicates to the C program that the seteuid() routine is available
+to change the effective uid of the current program.
+
+=item C<d_setgrent>
+
+From F<d_setgrent.U>:
+
+This variable conditionally defines the C<HAS_SETGRENT> symbol, which
+indicates to the C program that the setgrent() routine is available
+for initializing sequential access to the group database.
+
+=item C<d_setgrent_r>
+
+From F<d_setgrent_r.U>:
+
+This variable conditionally defines the C<HAS_SETGRENT_R> symbol,
+which indicates to the C program that the setgrent_r()
+routine is available.
+
+=item C<d_setgrps>
+
+From F<d_setgrps.U>:
+
+This variable conditionally defines the C<HAS_SETGROUPS> symbol, which
+indicates to the C program that the setgroups() routine is available
+to set the list of process groups.
+
+=item C<d_sethent>
+
+From F<d_sethent.U>:
+
+This variable conditionally defines C<HAS_SETHOSTENT> if sethostent() is
+available.
+
+=item C<d_sethostent_r>
+
+From F<d_sethostent_r.U>:
+
+This variable conditionally defines the C<HAS_SETHOSTENT_R> symbol,
+which indicates to the C program that the sethostent_r()
+routine is available.
+
+=item C<d_setitimer>
+
+From F<d_setitimer.U>:
+
+This variable conditionally defines the C<HAS_SETITIMER> symbol, which
+indicates to the C program that the setitimer() routine is available.
+
+=item C<d_setlinebuf>
+
+From F<d_setlnbuf.U>:
+
+This variable conditionally defines the C<HAS_SETLINEBUF> symbol, which
+indicates to the C program that the setlinebuf() routine is available
+to change stderr or stdout from block-buffered or unbuffered to a
+line-buffered mode.
+
+=item C<d_setlocale>
+
+From F<d_setlocale.U>:
+
+This variable conditionally defines C<HAS_SETLOCALE> if setlocale() is
+available to handle locale-specific ctype implementations.
+
+=item C<d_setlocale_r>
+
+From F<d_setlocale_r.U>:
+
+This variable conditionally defines the C<HAS_SETLOCALE_R> symbol,
+which indicates to the C program that the setlocale_r()
+routine is available.
+
+=item C<d_setnent>
+
+From F<d_setnent.U>:
+
+This variable conditionally defines C<HAS_SETNETENT> if setnetent() is
+available.
+
+=item C<d_setnetent_r>
+
+From F<d_setnetent_r.U>:
+
+This variable conditionally defines the C<HAS_SETNETENT_R> symbol,
+which indicates to the C program that the setnetent_r()
+routine is available.
+
+=item C<d_setpent>
+
+From F<d_setpent.U>:
+
+This variable conditionally defines C<HAS_SETPROTOENT> if setprotoent() is
+available.
+
+=item C<d_setpgid>
+
+From F<d_setpgid.U>:
+
+This variable conditionally defines the C<HAS_SETPGID> symbol if the
+setpgid(pid, gpid) function is available to set process group C<ID>.
+
+=item C<d_setpgrp2>
+
+From F<d_setpgrp2.U>:
+
+This variable conditionally defines the HAS_SETPGRP2 symbol, which
+indicates to the C program that the setpgrp2() (as in F<DG/C<UX>>) routine
+is available to set the current process group.
+
+=item C<d_setpgrp>
+
+From F<d_setpgrp.U>:
+
+This variable conditionally defines C<HAS_SETPGRP> if setpgrp() is
+available to set the current process group.
+
+=item C<d_setprior>
+
+From F<d_setprior.U>:
+
+This variable conditionally defines C<HAS_SETPRIORITY> if setpriority()
+is available to set a process's priority.
+
+=item C<d_setproctitle>
+
+From F<d_setproctitle.U>:
+
+This variable conditionally defines the C<HAS_SETPROCTITLE> symbol,
+which indicates to the C program that the setproctitle() routine
+is available.
+
+=item C<d_setprotoent_r>
+
+From F<d_setprotoent_r.U>:
+
+This variable conditionally defines the C<HAS_SETPROTOENT_R> symbol,
+which indicates to the C program that the setprotoent_r()
+routine is available.
+
+=item C<d_setpwent>
+
+From F<d_setpwent.U>:
+
+This variable conditionally defines the C<HAS_SETPWENT> symbol, which
+indicates to the C program that the setpwent() routine is available
+for initializing sequential access to the passwd database.
+
+=item C<d_setpwent_r>
+
+From F<d_setpwent_r.U>:
+
+This variable conditionally defines the C<HAS_SETPWENT_R> symbol,
+which indicates to the C program that the setpwent_r()
+routine is available.
+
+=item C<d_setregid>
+
+From F<d_setregid.U>:
+
+This variable conditionally defines C<HAS_SETREGID> if setregid() is
+available to change the real and effective gid of the current
+process.
+
+=item C<d_setresgid>
+
+From F<d_setregid.U>:
+
+This variable conditionally defines C<HAS_SETRESGID> if setresgid() is
+available to change the real, effective and saved gid of the current
+process.
+
+=item C<d_setresuid>
+
+From F<d_setreuid.U>:
+
+This variable conditionally defines C<HAS_SETREUID> if setresuid() is
+available to change the real, effective and saved uid of the current
+process.
+
+=item C<d_setreuid>
+
+From F<d_setreuid.U>:
+
+This variable conditionally defines C<HAS_SETREUID> if setreuid() is
+available to change the real and effective uid of the current
+process.
+
+=item C<d_setrgid>
+
+From F<d_setrgid.U>:
+
+This variable conditionally defines the C<HAS_SETRGID> symbol, which
+indicates to the C program that the setrgid() routine is available
+to change the real gid of the current program.
+
+=item C<d_setruid>
+
+From F<d_setruid.U>:
+
+This variable conditionally defines the C<HAS_SETRUID> symbol, which
+indicates to the C program that the setruid() routine is available
+to change the real uid of the current program.
+
+=item C<d_setsent>
+
+From F<d_setsent.U>:
+
+This variable conditionally defines C<HAS_SETSERVENT> if setservent() is
+available.
+
+=item C<d_setservent_r>
+
+From F<d_setservent_r.U>:
+
+This variable conditionally defines the C<HAS_SETSERVENT_R> symbol,
+which indicates to the C program that the setservent_r()
+routine is available.
+
+=item C<d_setsid>
+
+From F<d_setsid.U>:
+
+This variable conditionally defines C<HAS_SETSID> if setsid() is
+available to set the process group C<ID>.
+
+=item C<d_setvbuf>
+
+From F<d_setvbuf.U>:
+
+This variable conditionally defines the C<HAS_SETVBUF> symbol, which
+indicates to the C program that the setvbuf() routine is available
+to change buffering on an open stdio stream.
+
+=item C<d_sfio>
+
+From F<d_sfio.U>:
+
+This variable conditionally defines the C<USE_SFIO> symbol,
+and indicates whether sfio is available (and should be used).
+
+=item C<d_shm>
+
+From F<d_shm.U>:
+
+This variable conditionally defines the C<HAS_SHM> symbol, which
+indicates that the entire shm*(2) library is present.
+
+=item C<d_shmat>
+
+From F<d_shmat.U>:
+
+This variable conditionally defines the C<HAS_SHMAT> symbol, which
+indicates to the C program that the shmat() routine is available.
+
+=item C<d_shmatprototype>
+
+From F<d_shmat.U>:
+
+This variable conditionally defines the C<HAS_SHMAT_PROTOTYPE> 
+symbol, which indicates that F<sys/shm.h> has a prototype for
+shmat.
+
+=item C<d_shmctl>
+
+From F<d_shmctl.U>:
+
+This variable conditionally defines the C<HAS_SHMCTL> symbol, which
+indicates to the C program that the shmctl() routine is available.
+
+=item C<d_shmdt>
+
+From F<d_shmdt.U>:
+
+This variable conditionally defines the C<HAS_SHMDT> symbol, which
+indicates to the C program that the shmdt() routine is available.
+
+=item C<d_shmget>
+
+From F<d_shmget.U>:
+
+This variable conditionally defines the C<HAS_SHMGET> symbol, which
+indicates to the C program that the shmget() routine is available.
+
+=item C<d_sigaction>
+
+From F<d_sigaction.U>:
+
+This variable conditionally defines the C<HAS_SIGACTION> symbol, which
+indicates that the Vr4 sigaction() routine is available.
+
+=item C<d_sigprocmask>
+
+From F<d_sigprocmask.U>:
+
+This variable conditionally defines C<HAS_SIGPROCMASK>
+if sigprocmask() is available to examine or change the signal mask
+of the calling process.
+
+=item C<d_sigsetjmp>
+
+From F<d_sigsetjmp.U>:
+
+This variable conditionally defines the C<HAS_SIGSETJMP> symbol,
+which indicates that the sigsetjmp() routine is available to
+call setjmp() and optionally save the process's signal mask.
+
+=item C<d_sockatmark>
+
+From F<d_sockatmark.U>:
+
+This variable conditionally defines the C<HAS_SOCKATMARK> symbol, which
+indicates to the C program that the sockatmark() routine is available.
+
+=item C<d_sockatmarkproto>
+
+From F<d_sockatmarkproto.U>:
+
+This variable conditionally defines the C<HAS_SOCKATMARK_PROTO> symbol,
+which indicates to the C program that the system provides
+a prototype for the sockatmark() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_socket>
+
+From F<d_socket.U>:
+
+This variable conditionally defines C<HAS_SOCKET>, which indicates
+that the C<BSD> socket interface is supported.
+
+=item C<d_socklen_t>
+
+From F<d_socklen_t.U>:
+
+This symbol will be defined if the C compiler supports socklen_t.
+
+=item C<d_sockpair>
+
+From F<d_socket.U>:
+
+This variable conditionally defines the C<HAS_SOCKETPAIR> symbol, which
+indicates that the C<BSD> socketpair() is supported.
+
+=item C<d_socks5_init>
+
+From F<d_socks5_init.U>:
+
+This variable conditionally defines the HAS_SOCKS5_INIT symbol, which
+indicates to the C program that the socks5_init() routine is available.
+
+=item C<d_sprintf_returns_strlen>
+
+From F<d_sprintf_returns_strlen.U>:
+
+This variable defines whether sprintf returns the length of the string
+(as per the C<ANSI> spec). Some C libraries retain compatibility with
+pre-C<ANSI> C and return a pointer to the passed in buffer; for these
+this variable will be undef.
+
+=item C<d_sqrtl>
+
+From F<d_sqrtl.U>:
+
+This variable conditionally defines the C<HAS_SQRTL> symbol, which
+indicates to the C program that the sqrtl() routine is available.
+
+=item C<d_srand48_r>
+
+From F<d_srand48_r.U>:
+
+This variable conditionally defines the HAS_SRAND48_R symbol,
+which indicates to the C program that the srand48_r()
+routine is available.
+
+=item C<d_srandom_r>
+
+From F<d_srandom_r.U>:
+
+This variable conditionally defines the C<HAS_SRANDOM_R> symbol,
+which indicates to the C program that the srandom_r()
+routine is available.
+
+=item C<d_sresgproto>
+
+From F<d_sresgproto.U>:
+
+This variable conditionally defines the C<HAS_SETRESGID_PROTO> symbol,
+which indicates to the C program that the system provides
+a prototype for the setresgid() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_sresuproto>
+
+From F<d_sresuproto.U>:
+
+This variable conditionally defines the C<HAS_SETRESUID_PROTO> symbol,
+which indicates to the C program that the system provides
+a prototype for the setresuid() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_statblks>
+
+From F<d_statblks.U>:
+
+This variable conditionally defines C<USE_STAT_BLOCKS>
+if this system has a stat structure declaring
+st_blksize and st_blocks.
+
+=item C<d_statfs_f_flags>
+
+From F<d_statfs_f_flags.U>:
+
+This variable conditionally defines the C<HAS_STRUCT_STATFS_F_FLAGS>
+symbol, which indicates to struct statfs from has f_flags member.
+This kind of struct statfs is coming from F<sys/mount.h> (C<BSD>),
+not from F<sys/statfs.h> (C<SYSV>).
+
+=item C<d_statfs_s>
+
+From F<d_statfs_s.U>:
+
+This variable conditionally defines the C<HAS_STRUCT_STATFS> symbol,
+which indicates that the struct statfs is supported.
+
+=item C<d_statvfs>
+
+From F<d_statvfs.U>:
+
+This variable conditionally defines the C<HAS_STATVFS> symbol, which
+indicates to the C program that the statvfs() routine is available.
+
+=item C<d_stdio_cnt_lval>
+
+From F<d_stdstdio.U>:
+
+This variable conditionally defines C<STDIO_CNT_LVALUE> if the
+C<FILE_cnt> macro can be used as an lvalue.
+
+=item C<d_stdio_ptr_lval>
+
+From F<d_stdstdio.U>:
+
+This variable conditionally defines C<STDIO_PTR_LVALUE> if the
+C<FILE_ptr> macro can be used as an lvalue.
+
+=item C<d_stdio_ptr_lval_nochange_cnt>
+
+From F<d_stdstdio.U>:
+
+This symbol is defined if using the C<FILE_ptr> macro as an lvalue
+to increase the pointer by n leaves File_cnt(fp) unchanged.
+
+=item C<d_stdio_ptr_lval_sets_cnt>
+
+From F<d_stdstdio.U>:
+
+This symbol is defined if using the C<FILE_ptr> macro as an lvalue
+to increase the pointer by n has the side effect of decreasing the
+value of File_cnt(fp) by n.
+
+=item C<d_stdio_stream_array>
+
+From F<stdio_streams.U>:
+
+This variable tells whether there is an array holding
+the stdio streams.
+
+=item C<d_stdiobase>
+
+From F<d_stdstdio.U>:
+
+This variable conditionally defines C<USE_STDIO_BASE> if this system
+has a C<FILE> structure declaring a usable _base field (or equivalent)
+in F<stdio.h>.
+
+=item C<d_stdstdio>
+
+From F<d_stdstdio.U>:
+
+This variable conditionally defines C<USE_STDIO_PTR> if this system
+has a C<FILE> structure declaring usable _ptr and _cnt fields (or
+equivalent) in F<stdio.h>.
+
+=item C<d_strchr>
+
+From F<d_strchr.U>:
+
+This variable conditionally defines C<HAS_STRCHR> if strchr() and
+strrchr() are available for string searching.
+
+=item C<d_strcoll>
+
+From F<d_strcoll.U>:
+
+This variable conditionally defines C<HAS_STRCOLL> if strcoll() is
+available to compare strings using collating information.
+
+=item C<d_strctcpy>
+
+From F<d_strctcpy.U>:
+
+This variable conditionally defines the C<USE_STRUCT_COPY> symbol, which
+indicates to the C program that this C compiler knows how to copy
+structures.
+
+=item C<d_strerrm>
+
+From F<d_strerror.U>:
+
+This variable holds what Strerrr is defined as to translate an error
+code condition into an error message string. It could be C<strerror>
+or a more C<complex> macro emulating strrror with sys_errlist[], or the
+C<unknown> string when both strerror and sys_errlist are missing.
+
+=item C<d_strerror>
+
+From F<d_strerror.U>:
+
+This variable conditionally defines C<HAS_STRERROR> if strerror() is
+available to translate error numbers to strings.
+
+=item C<d_strerror_r>
+
+From F<d_strerror_r.U>:
+
+This variable conditionally defines the C<HAS_STRERROR_R> symbol,
+which indicates to the C program that the strerror_r()
+routine is available.
+
+=item C<d_strftime>
+
+From F<d_strftime.U>:
+
+This variable conditionally defines the C<HAS_STRFTIME> symbol, which
+indicates to the C program that the strftime() routine is available.
+
+=item C<d_strlcat>
+
+From F<d_strlcat.U>:
+
+This variable conditionally defines the C<HAS_STRLCAT> symbol, which
+indicates to the C program that the strlcat () routine is available.
+
+=item C<d_strlcpy>
+
+From F<d_strlcpy.U>:
+
+This variable conditionally defines the C<HAS_STRLCPY> symbol, which
+indicates to the C program that the strlcpy () routine is available.
+
+=item C<d_strtod>
+
+From F<d_strtod.U>:
+
+This variable conditionally defines the C<HAS_STRTOD> symbol, which
+indicates to the C program that the strtod() routine is available
+to provide better numeric string conversion than atof().
+
+=item C<d_strtol>
+
+From F<d_strtol.U>:
+
+This variable conditionally defines the C<HAS_STRTOL> symbol, which
+indicates to the C program that the strtol() routine is available
+to provide better numeric string conversion than atoi() and friends.
+
+=item C<d_strtold>
+
+From F<d_strtold.U>:
+
+This variable conditionally defines the C<HAS_STRTOLD> symbol, which
+indicates to the C program that the strtold() routine is available.
+
+=item C<d_strtoll>
+
+From F<d_strtoll.U>:
+
+This variable conditionally defines the C<HAS_STRTOLL> symbol, which
+indicates to the C program that the strtoll() routine is available.
+
+=item C<d_strtoq>
+
+From F<d_strtoq.U>:
+
+This variable conditionally defines the C<HAS_STRTOQ> symbol, which
+indicates to the C program that the strtoq() routine is available.
+
+=item C<d_strtoul>
+
+From F<d_strtoul.U>:
+
+This variable conditionally defines the C<HAS_STRTOUL> symbol, which
+indicates to the C program that the strtoul() routine is available
+to provide conversion of strings to unsigned long.
+
+=item C<d_strtoull>
+
+From F<d_strtoull.U>:
+
+This variable conditionally defines the C<HAS_STRTOULL> symbol, which
+indicates to the C program that the strtoull() routine is available.
+
+=item C<d_strtouq>
+
+From F<d_strtouq.U>:
+
+This variable conditionally defines the C<HAS_STRTOUQ> symbol, which
+indicates to the C program that the strtouq() routine is available.
+
+=item C<d_strxfrm>
+
+From F<d_strxfrm.U>:
+
+This variable conditionally defines C<HAS_STRXFRM> if strxfrm() is
+available to transform strings.
+
+=item C<d_suidsafe>
+
+From F<d_dosuid.U>:
+
+This variable conditionally defines C<SETUID_SCRIPTS_ARE_SECURE_NOW>
+if setuid scripts can be secure.  This test looks in F</dev/fd/>.
+
+=item C<d_symlink>
+
+From F<d_symlink.U>:
+
+This variable conditionally defines the C<HAS_SYMLINK> symbol, which
+indicates to the C program that the symlink() routine is available
+to create symbolic links.
+
+=item C<d_syscall>
+
+From F<d_syscall.U>:
+
+This variable conditionally defines C<HAS_SYSCALL> if syscall() is
+available call arbitrary system calls.
+
+=item C<d_syscallproto>
+
+From F<d_syscallproto.U>:
+
+This variable conditionally defines the C<HAS_SYSCALL_PROTO> symbol,
+which indicates to the C program that the system provides
+a prototype for the syscall() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_sysconf>
+
+From F<d_sysconf.U>:
+
+This variable conditionally defines the C<HAS_SYSCONF> symbol, which
+indicates to the C program that the sysconf() routine is available
+to determine system related limits and options.
+
+=item C<d_sysernlst>
+
+From F<d_strerror.U>:
+
+This variable conditionally defines C<HAS_SYS_ERRNOLIST> if sys_errnolist[]
+is available to translate error numbers to the symbolic name.
+
+=item C<d_syserrlst>
+
+From F<d_strerror.U>:
+
+This variable conditionally defines C<HAS_SYS_ERRLIST> if sys_errlist[] is
+available to translate error numbers to strings.
+
+=item C<d_system>
+
+From F<d_system.U>:
+
+This variable conditionally defines C<HAS_SYSTEM> if system() is
+available to issue a shell command.
+
+=item C<d_tcgetpgrp>
+
+From F<d_tcgtpgrp.U>:
+
+This variable conditionally defines the C<HAS_TCGETPGRP> symbol, which
+indicates to the C program that the tcgetpgrp() routine is available.
+to get foreground process group C<ID>.
+
+=item C<d_tcsetpgrp>
+
+From F<d_tcstpgrp.U>:
+
+This variable conditionally defines the C<HAS_TCSETPGRP> symbol, which
+indicates to the C program that the tcsetpgrp() routine is available
+to set foreground process group C<ID>.
+
+=item C<d_telldir>
+
+From F<d_readdir.U>:
+
+This variable conditionally defines C<HAS_TELLDIR> if telldir() is
+available.
+
+=item C<d_telldirproto>
+
+From F<d_telldirproto.U>:
+
+This variable conditionally defines the C<HAS_TELLDIR_PROTO> symbol,
+which indicates to the C program that the system provides
+a prototype for the telldir() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_time>
+
+From F<d_time.U>:
+
+This variable conditionally defines the C<HAS_TIME> symbol, which indicates
+that the time() routine exists.  The time() routine is normaly
+provided on C<UNIX> systems.
+
+=item C<d_times>
+
+From F<d_times.U>:
+
+This variable conditionally defines the C<HAS_TIMES> symbol, which indicates
+that the times() routine exists.  The times() routine is normaly
+provided on C<UNIX> systems. You may have to include <sys/times.h>.
+
+=item C<d_tm_tm_gmtoff>
+
+From F<i_time.U>:
+
+This variable conditionally defines C<HAS_TM_TM_GMTOFF>, which indicates
+indicates to the C program that the struct tm has the tm_gmtoff field.
+
+=item C<d_tm_tm_zone>
+
+From F<i_time.U>:
+
+This variable conditionally defines C<HAS_TM_TM_ZONE>, which indicates
+indicates to the C program that the struct tm has the tm_zone field.
+
+=item C<d_tmpnam_r>
+
+From F<d_tmpnam_r.U>:
+
+This variable conditionally defines the C<HAS_TMPNAM_R> symbol,
+which indicates to the C program that the tmpnam_r()
+routine is available.
+
+=item C<d_truncate>
+
+From F<d_truncate.U>:
+
+This variable conditionally defines C<HAS_TRUNCATE> if truncate() is
+available to truncate files.
+
+=item C<d_ttyname_r>
+
+From F<d_ttyname_r.U>:
+
+This variable conditionally defines the C<HAS_TTYNAME_R> symbol,
+which indicates to the C program that the ttyname_r()
+routine is available.
+
+=item C<d_tzname>
+
+From F<d_tzname.U>:
+
+This variable conditionally defines C<HAS_TZNAME> if tzname[] is
+available to access timezone names.
+
+=item C<d_u32align>
+
+From F<d_u32align.U>:
+
+This variable tells whether you must access character data
+through U32-aligned pointers.
+
+=item C<d_ualarm>
+
+From F<d_ualarm.U>:
+
+This variable conditionally defines the C<HAS_UALARM> symbol, which
+indicates to the C program that the ualarm() routine is available.
+
+=item C<d_umask>
+
+From F<d_umask.U>:
+
+This variable conditionally defines the C<HAS_UMASK> symbol, which
+indicates to the C program that the umask() routine is available.
+to set and get the value of the file creation mask.
+
+=item C<d_uname>
+
+From F<d_gethname.U>:
+
+This variable conditionally defines the C<HAS_UNAME> symbol, which
+indicates to the C program that the uname() routine may be
+used to derive the host name.
+
+=item C<d_union_semun>
+
+From F<d_union_semun.U>:
+
+This variable conditionally defines C<HAS_UNION_SEMUN> if the
+union semun is defined by including <sys/sem.h>.
+
+=item C<d_unordered>
+
+From F<d_unordered.U>:
+
+This variable conditionally defines the C<HAS_UNORDERED> symbol, which
+indicates to the C program that the unordered() routine is available.
+
+=item C<d_unsetenv>
+
+From F<d_unsetenv.U>:
+
+This variable conditionally defines the C<HAS_UNSETENV> symbol, which
+indicates to the C program that the unsetenv () routine is available.
+
+=item C<d_usleep>
+
+From F<d_usleep.U>:
+
+This variable conditionally defines C<HAS_USLEEP> if usleep() is
+available to do high granularity sleeps.
+
+=item C<d_usleepproto>
+
+From F<d_usleepproto.U>:
+
+This variable conditionally defines the C<HAS_USLEEP_PROTO> symbol,
+which indicates to the C program that the system provides
+a prototype for the usleep() function.  Otherwise, it is
+up to the program to supply one.
+
+=item C<d_ustat>
+
+From F<d_ustat.U>:
+
+This variable conditionally defines C<HAS_USTAT> if ustat() is
+available to query file system statistics by dev_t.
+
+=item C<d_vendorarch>
+
+From F<vendorarch.U>:
+
+This variable conditionally defined C<PERL_VENDORARCH>.
+
+=item C<d_vendorbin>
+
+From F<vendorbin.U>:
+
+This variable conditionally defines C<PERL_VENDORBIN>.
+
+=item C<d_vendorlib>
+
+From F<vendorlib.U>:
+
+This variable conditionally defines C<PERL_VENDORLIB>.
+
+=item C<d_vendorscript>
+
+From F<vendorscript.U>:
+
+This variable conditionally defines C<PERL_VENDORSCRIPT>.
+
+=item C<d_vfork>
+
+From F<d_vfork.U>:
+
+This variable conditionally defines the C<HAS_VFORK> symbol, which
+indicates the vfork() routine is available.
+
+=item C<d_void_closedir>
+
+From F<d_closedir.U>:
+
+This variable conditionally defines C<VOID_CLOSEDIR> if closedir()
+does not return a value.
+
+=item C<d_voidsig>
+
+From F<d_voidsig.U>:
+
+This variable conditionally defines C<VOIDSIG> if this system
+declares "void (*signal(...))()" in F<signal.h>.  The old way was to
+declare it as "int (*signal(...))()".
+
+=item C<d_voidtty>
+
+From F<i_sysioctl.U>:
+
+This variable conditionally defines C<USE_IOCNOTTY> to indicate that the
+ioctl() call with C<TIOCNOTTY> should be used to void tty association.
+Otherwise (on C<USG> probably), it is enough to close the standard file
+decriptors and do a setpgrp().
+
+=item C<d_volatile>
+
+From F<d_volatile.U>:
+
+This variable conditionally defines the C<HASVOLATILE> symbol, which
+indicates to the C program that this C compiler knows about the
+volatile declaration.
+
+=item C<d_vprintf>
+
+From F<d_vprintf.U>:
+
+This variable conditionally defines the C<HAS_VPRINTF> symbol, which
+indicates to the C program that the vprintf() routine is available
+to printf with a pointer to an argument list.
+
+=item C<d_wait4>
+
+From F<d_wait4.U>:
+
+This variable conditionally defines the HAS_WAIT4 symbol, which
+indicates the wait4() routine is available.
+
+=item C<d_waitpid>
+
+From F<d_waitpid.U>:
+
+This variable conditionally defines C<HAS_WAITPID> if waitpid() is
+available to wait for child process.
+
+=item C<d_wcstombs>
+
+From F<d_wcstombs.U>:
+
+This variable conditionally defines the C<HAS_WCSTOMBS> symbol, which
+indicates to the C program that the wcstombs() routine is available
+to convert wide character strings to multibyte strings.
+
+=item C<d_wctomb>
+
+From F<d_wctomb.U>:
+
+This variable conditionally defines the C<HAS_WCTOMB> symbol, which
+indicates to the C program that the wctomb() routine is available
+to convert a wide character to a multibyte.
+
+=item C<d_writev>
+
+From F<d_writev.U>:
+
+This variable conditionally defines the C<HAS_WRITEV> symbol, which
+indicates to the C program that the writev() routine is available.
+
+=item C<d_xenix>
+
+From F<Guess.U>:
+
+This variable conditionally defines the symbol C<XENIX>, which alerts
+the C program that it runs under Xenix.
+
+=item C<date>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the date program.  After Configure runs,
+the value is reset to a plain C<date> and is not useful.
+
+=item C<db_hashtype>
+
+From F<i_db.U>:
+
+This variable contains the type of the hash structure element
+in the <db.h> header file.  In older versions of C<DB>, it was
+int, while in newer ones it is u_int32_t.
+
+=item C<db_prefixtype>
+
+From F<i_db.U>:
+
+This variable contains the type of the prefix structure element
+in the <db.h> header file.  In older versions of C<DB>, it was
+int, while in newer ones it is size_t.
+
+=item C<db_version_major>
+
+From F<i_db.U>:
+
+This variable contains the major version number of
+Berkeley C<DB> found in the <db.h> header file.
+
+=item C<db_version_minor>
+
+From F<i_db.U>:
+
+This variable contains the minor version number of
+Berkeley C<DB> found in the <db.h> header file.
+For C<DB> version 1 this is always 0.
+
+=item C<db_version_patch>
+
+From F<i_db.U>:
+
+This variable contains the patch version number of
+Berkeley C<DB> found in the <db.h> header file.
+For C<DB> version 1 this is always 0.
+
+=item C<defvoidused>
+
+From F<voidflags.U>:
+
+This variable contains the default value of the C<VOIDUSED> symbol (15).
+
+=item C<direntrytype>
+
+From F<i_dirent.U>:
+
+This symbol is set to C<struct direct> or C<struct dirent> depending on
+whether dirent is available or not. You should use this pseudo type to
+portably declare your directory entries.
+
+=item C<dlext>
+
+From F<dlext.U>:
+
+This variable contains the extension that is to be used for the
+dynamically loaded modules that perl generaties.
+
+=item C<dlsrc>
+
+From F<dlsrc.U>:
+
+This variable contains the name of the dynamic loading file that
+will be used with the package.
+
+=item C<doublesize>
+
+From F<doublesize.U>:
+
+This variable contains the value of the C<DOUBLESIZE> symbol, which
+indicates to the C program how many bytes there are in a double.
+
+=item C<drand01>
+
+From F<randfunc.U>:
+
+Indicates the macro to be used to generate normalized
+random numbers.  Uses randfunc, often divided by
+(double) (((unsigned long) 1 << randbits)) in order to
+normalize the result.
+In C programs, the macro C<Drand01> is mapped to drand01.
+
+=item C<drand48_r_proto>
+
+From F<d_drand48_r.U>:
+
+This variable encodes the prototype of drand48_r.
+It is zero if d_drand48_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_drand48_r
+is defined.
+
+=item C<dynamic_ext>
+
+From F<Extensions.U>:
+
+This variable holds a list of C<XS> extension files we want to
+link dynamically into the package.  It is used by Makefile.
+
+=back
+
+=head2 e
+
+=over 4
+
+=item C<eagain>
+
+From F<nblock_io.U>:
+
+This variable bears the symbolic errno code set by read() when no
+data is present on the file and non-blocking I/O was enabled (otherwise,
+read() blocks naturally).
+
+=item C<ebcdic>
+
+From F<ebcdic.U>:
+
+This variable conditionally defines C<EBCDIC> if this
+system uses C<EBCDIC> encoding.  Among other things, this
+means that the character ranges are not contiguous.
+See F<trnl.U>
+
+=item C<echo>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the echo program.  After Configure runs,
+the value is reset to a plain C<echo> and is not useful.
+
+=item C<egrep>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the egrep program.  After Configure runs,
+the value is reset to a plain C<egrep> and is not useful.
+
+=item C<emacs>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<endgrent_r_proto>
+
+From F<d_endgrent_r.U>:
+
+This variable encodes the prototype of endgrent_r.
+It is zero if d_endgrent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_endgrent_r
+is defined.
+
+=item C<endhostent_r_proto>
+
+From F<d_endhostent_r.U>:
+
+This variable encodes the prototype of endhostent_r.
+It is zero if d_endhostent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_endhostent_r
+is defined.
+
+=item C<endnetent_r_proto>
+
+From F<d_endnetent_r.U>:
+
+This variable encodes the prototype of endnetent_r.
+It is zero if d_endnetent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_endnetent_r
+is defined.
+
+=item C<endprotoent_r_proto>
+
+From F<d_endprotoent_r.U>:
+
+This variable encodes the prototype of endprotoent_r.
+It is zero if d_endprotoent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_endprotoent_r
+is defined.
+
+=item C<endpwent_r_proto>
+
+From F<d_endpwent_r.U>:
+
+This variable encodes the prototype of endpwent_r.
+It is zero if d_endpwent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_endpwent_r
+is defined.
+
+=item C<endservent_r_proto>
+
+From F<d_endservent_r.U>:
+
+This variable encodes the prototype of endservent_r.
+It is zero if d_endservent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_endservent_r
+is defined.
+
+=item C<eunicefix>
+
+From F<Init.U>:
+
+When running under Eunice this variable contains a command which will
+convert a shell script to the proper form of text file for it to be
+executable by the shell.  On other systems it is a no-op.
+
+=item C<exe_ext>
+
+From F<Unix.U>:
+
+This is an old synonym for _exe.
+
+=item C<expr>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the expr program.  After Configure runs,
+the value is reset to a plain C<expr> and is not useful.
+
+=item C<extensions>
+
+From F<Extensions.U>:
+
+This variable holds a list of all extension files (both C<XS> and
+non-xs linked into the package.  It is propagated to F<Config.pm>
+and is typically used to test whether a particular extesion 
+is available.
+
+=item C<extras>
+
+From F<Extras.U>:
+
+This variable holds a list of extra modules to install.
+
+=back
+
+=head2 f
+
+=over 4
+
+=item C<fflushall>
+
+From F<fflushall.U>:
+
+This symbol, if defined, tells that to flush
+all pending stdio output one must loop through all
+the stdio file handles stored in an array and fflush them.
+Note that if fflushNULL is defined, fflushall will not
+even be probed for and will be left undefined.
+
+=item C<fflushNULL>
+
+From F<fflushall.U>:
+
+This symbol, if defined, tells that fflush(C<NULL>) does flush
+all pending stdio output.
+
+=item C<find>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<firstmakefile>
+
+From F<Unix.U>:
+
+This variable defines the first file searched by make.  On unix,
+it is makefile (then Makefile).  On case-insensitive systems,
+it might be something else.  This is only used to deal with
+convoluted make depend tricks.
+
+=item C<flex>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<fpossize>
+
+From F<fpossize.U>:
+
+This variable contains the size of a fpostype in bytes.
+
+=item C<fpostype>
+
+From F<fpostype.U>:
+
+This variable defines Fpos_t to be something like fpos_t, long, 
+uint, or whatever type is used to declare file positions in libc.
+
+=item C<freetype>
+
+From F<mallocsrc.U>:
+
+This variable contains the return type of free().  It is usually
+void, but occasionally int.
+
+=item C<from>
+
+From F<Cross.U>:
+
+This variable contains the command used by Configure
+to copy files from the target host.  Useful and available
+only during Perl build.
+The string C<:> if not cross-compiling.
+
+=item C<full_ar>
+
+From F<Loc_ar.U>:
+
+This variable contains the full pathname to C<ar>, whether or
+not the user has specified C<portability>.  This is only used
+in the F<Makefile.SH>.
+
+=item C<full_csh>
+
+From F<d_csh.U>:
+
+This variable contains the full pathname to C<csh>, whether or
+not the user has specified C<portability>.  This is only used
+in the compiled C program, and we assume that all systems which
+can share this executable will have the same full pathname to
+F<csh.>
+
+=item C<full_sed>
+
+From F<Loc_sed.U>:
+
+This variable contains the full pathname to C<sed>, whether or
+not the user has specified C<portability>.  This is only used
+in the compiled C program, and we assume that all systems which
+can share this executable will have the same full pathname to
+F<sed.>
+
+=back
+
+=head2 g
+
+=over 4
+
+=item C<gccansipedantic>
+
+From F<gccvers.U>:
+
+If C<GNU> cc (gcc) is used, this variable will enable (if set) the
+-ansi and -pedantic ccflags for building core files (through
+cflags script). (See F<Porting/pumpkin.pod> for full description).
+
+=item C<gccosandvers>
+
+From F<gccvers.U>:
+
+If C<GNU> cc (gcc) is used, this variable holds the operating system
+and version used to compile gcc.  It is set to '' if not gcc,
+or if nothing useful can be parsed as the os version.
+
+=item C<gccversion>
+
+From F<gccvers.U>:
+
+If C<GNU> cc (gcc) is used, this variable holds C<1> or C<2> to
+indicate whether the compiler is version 1 or 2.  This is used in
+setting some of the default cflags.  It is set to '' if not gcc.
+
+=item C<getgrent_r_proto>
+
+From F<d_getgrent_r.U>:
+
+This variable encodes the prototype of getgrent_r.
+It is zero if d_getgrent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getgrent_r
+is defined.
+
+=item C<getgrgid_r_proto>
+
+From F<d_getgrgid_r.U>:
+
+This variable encodes the prototype of getgrgid_r.
+It is zero if d_getgrgid_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getgrgid_r
+is defined.
+
+=item C<getgrnam_r_proto>
+
+From F<d_getgrnam_r.U>:
+
+This variable encodes the prototype of getgrnam_r.
+It is zero if d_getgrnam_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getgrnam_r
+is defined.
+
+=item C<gethostbyaddr_r_proto>
+
+From F<d_gethostbyaddr_r.U>:
+
+This variable encodes the prototype of gethostbyaddr_r.
+It is zero if d_gethostbyaddr_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_gethostbyaddr_r
+is defined.
+
+=item C<gethostbyname_r_proto>
+
+From F<d_gethostbyname_r.U>:
+
+This variable encodes the prototype of gethostbyname_r.
+It is zero if d_gethostbyname_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_gethostbyname_r
+is defined.
+
+=item C<gethostent_r_proto>
+
+From F<d_gethostent_r.U>:
+
+This variable encodes the prototype of gethostent_r.
+It is zero if d_gethostent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_gethostent_r
+is defined.
+
+=item C<getlogin_r_proto>
+
+From F<d_getlogin_r.U>:
+
+This variable encodes the prototype of getlogin_r.
+It is zero if d_getlogin_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getlogin_r
+is defined.
+
+=item C<getnetbyaddr_r_proto>
+
+From F<d_getnetbyaddr_r.U>:
+
+This variable encodes the prototype of getnetbyaddr_r.
+It is zero if d_getnetbyaddr_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getnetbyaddr_r
+is defined.
+
+=item C<getnetbyname_r_proto>
+
+From F<d_getnetbyname_r.U>:
+
+This variable encodes the prototype of getnetbyname_r.
+It is zero if d_getnetbyname_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getnetbyname_r
+is defined.
+
+=item C<getnetent_r_proto>
+
+From F<d_getnetent_r.U>:
+
+This variable encodes the prototype of getnetent_r.
+It is zero if d_getnetent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getnetent_r
+is defined.
+
+=item C<getprotobyname_r_proto>
+
+From F<d_getprotobyname_r.U>:
+
+This variable encodes the prototype of getprotobyname_r.
+It is zero if d_getprotobyname_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getprotobyname_r
+is defined.
+
+=item C<getprotobynumber_r_proto>
+
+From F<d_getprotobynumber_r.U>:
+
+This variable encodes the prototype of getprotobynumber_r.
+It is zero if d_getprotobynumber_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getprotobynumber_r
+is defined.
+
+=item C<getprotoent_r_proto>
+
+From F<d_getprotoent_r.U>:
+
+This variable encodes the prototype of getprotoent_r.
+It is zero if d_getprotoent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getprotoent_r
+is defined.
+
+=item C<getpwent_r_proto>
+
+From F<d_getpwent_r.U>:
+
+This variable encodes the prototype of getpwent_r.
+It is zero if d_getpwent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getpwent_r
+is defined.
+
+=item C<getpwnam_r_proto>
+
+From F<d_getpwnam_r.U>:
+
+This variable encodes the prototype of getpwnam_r.
+It is zero if d_getpwnam_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getpwnam_r
+is defined.
+
+=item C<getpwuid_r_proto>
+
+From F<d_getpwuid_r.U>:
+
+This variable encodes the prototype of getpwuid_r.
+It is zero if d_getpwuid_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getpwuid_r
+is defined.
+
+=item C<getservbyname_r_proto>
+
+From F<d_getservbyname_r.U>:
+
+This variable encodes the prototype of getservbyname_r.
+It is zero if d_getservbyname_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getservbyname_r
+is defined.
+
+=item C<getservbyport_r_proto>
+
+From F<d_getservbyport_r.U>:
+
+This variable encodes the prototype of getservbyport_r.
+It is zero if d_getservbyport_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getservbyport_r
+is defined.
+
+=item C<getservent_r_proto>
+
+From F<d_getservent_r.U>:
+
+This variable encodes the prototype of getservent_r.
+It is zero if d_getservent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getservent_r
+is defined.
+
+=item C<getspnam_r_proto>
+
+From F<d_getspnam_r.U>:
+
+This variable encodes the prototype of getspnam_r.
+It is zero if d_getspnam_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_getspnam_r
+is defined.
+
+=item C<gidformat>
+
+From F<gidf.U>:
+
+This variable contains the format string used for printing a Gid_t.
+
+=item C<gidsign>
+
+From F<gidsign.U>:
+
+This variable contains the signedness of a gidtype.
+1 for unsigned, -1 for signed.
+
+=item C<gidsize>
+
+From F<gidsize.U>:
+
+This variable contains the size of a gidtype in bytes.
+
+=item C<gidtype>
+
+From F<gidtype.U>:
+
+This variable defines Gid_t to be something like gid_t, int,
+ushort, or whatever type is used to declare the return type
+of getgid().  Typically, it is the type of group ids in the kernel.
+
+=item C<glibpth>
+
+From F<libpth.U>:
+
+This variable holds the general path (space-separated) used to
+find libraries.  It may contain directories that do not exist on
+this platform, libpth is the cleaned-up version.
+
+=item C<gmake>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the gmake program.  After Configure runs,
+the value is reset to a plain C<gmake> and is not useful.
+
+=item C<gmtime_r_proto>
+
+From F<d_gmtime_r.U>:
+
+This variable encodes the prototype of gmtime_r.
+It is zero if d_gmtime_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_gmtime_r
+is defined.
+
+=item C<gnulibc_version>
+
+From F<d_gnulibc.U>:
+
+This variable contains the version number of the C<GNU> C library.
+It is usually something like F<2.2.5>.  It is a plain '' if this
+is not the C<GNU> C library, or if the version is unknown.
+
+=item C<grep>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the grep program.  After Configure runs,
+the value is reset to a plain C<grep> and is not useful.
+
+=item C<groupcat>
+
+From F<nis.U>:
+
+This variable contains a command that produces the text of the
+F</etc/group> file.  This is normally "cat F</etc/group>", but can be
+"ypcat group" when C<NIS> is used.
+On some systems, such as os390, there may be no equivalent
+command, in which case this variable is unset.
+
+=item C<groupstype>
+
+From F<groupstype.U>:
+
+This variable defines Groups_t to be something like gid_t, int, 
+ushort, or whatever type is used for the second argument to
+getgroups() and setgroups().  Usually, this is the same as
+gidtype (gid_t), but sometimes it isn't.
+
+=item C<gzip>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the gzip program.  After Configure runs,
+the value is reset to a plain C<gzip> and is not useful.
+
+=back
+
+=head2 h
+
+=over 4
+
+=item C<h_fcntl>
+
+From F<h_fcntl.U>:
+
+This is variable gets set in various places to tell i_fcntl that
+<fcntl.h> should be included.
+
+=item C<h_sysfile>
+
+From F<h_sysfile.U>:
+
+This is variable gets set in various places to tell i_sys_file that
+<sys/file.h> should be included.
+
+=item C<hint>
+
+From F<Oldconfig.U>:
+
+Gives the type of hints used for previous answers. May be one of
+C<default>, C<recommended> or C<previous>.
+
+=item C<hostcat>
+
+From F<nis.U>:
+
+This variable contains a command that produces the text of the
+F</etc/hosts> file.  This is normally "cat F</etc/hosts>", but can be
+"ypcat hosts" when C<NIS> is used.
+On some systems, such as os390, there may be no equivalent
+command, in which case this variable is unset.
+
+=item C<html1dir>
+
+From F<html1dir.U>:
+
+This variable contains the name of the directory in which html
+source pages are to be put.  This directory is for pages
+that describe whole programs, not libraries or modules.  It
+is intended to correspond roughly to section 1 of the Unix
+manuals.
+
+=item C<html1direxp>
+
+From F<html1dir.U>:
+
+This variable is the same as the html1dir variable, but is filename
+expanded at configuration time, for convenient use in makefiles.
+
+=item C<html3dir>
+
+From F<html3dir.U>:
+
+This variable contains the name of the directory in which html
+source pages are to be put.  This directory is for pages
+that describe libraries or modules.  It is intended to
+correspond roughly to section 3 of the Unix manuals.
+
+=item C<html3direxp>
+
+From F<html3dir.U>:
+
+This variable is the same as the html3dir variable, but is filename
+expanded at configuration time, for convenient use in makefiles.
+
+=back
+
+=head2 i
+
+=over 4
+
+=item C<i16size>
+
+From F<perlxv.U>:
+
+This variable is the size of an I16 in bytes.
+
+=item C<i16type>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's I16.
+
+=item C<i32size>
+
+From F<perlxv.U>:
+
+This variable is the size of an I32 in bytes.
+
+=item C<i32type>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's I32.
+
+=item C<i64size>
+
+From F<perlxv.U>:
+
+This variable is the size of an I64 in bytes.
+
+=item C<i64type>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's I64.
+
+=item C<i8size>
+
+From F<perlxv.U>:
+
+This variable is the size of an I8 in bytes.
+
+=item C<i8type>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's I8.
+
+=item C<i_arpainet>
+
+From F<i_arpainet.U>:
+
+This variable conditionally defines the C<I_ARPA_INET> symbol,
+and indicates whether a C program should include <arpa/inet.h>.
+
+=item C<i_bsdioctl>
+
+From F<i_sysioctl.U>:
+
+This variable conditionally defines the C<I_SYS_BSDIOCTL> symbol, which
+indicates to the C program that <sys/bsdioctl.h> exists and should
+be included.
+
+=item C<i_crypt>
+
+From F<i_crypt.U>:
+
+This variable conditionally defines the C<I_CRYPT> symbol, and indicates
+whether a C program should include <crypt.h>.
+
+=item C<i_db>
+
+From F<i_db.U>:
+
+This variable conditionally defines the C<I_DB> symbol, and indicates
+whether a C program may include Berkeley's C<DB> include file <db.h>.
+
+=item C<i_dbm>
+
+From F<i_dbm.U>:
+
+This variable conditionally defines the C<I_DBM> symbol, which
+indicates to the C program that <dbm.h> exists and should
+be included.
+
+=item C<i_dirent>
+
+From F<i_dirent.U>:
+
+This variable conditionally defines C<I_DIRENT>, which indicates
+to the C program that it should include <dirent.h>.
+
+=item C<i_dld>
+
+From F<i_dld.U>:
+
+This variable conditionally defines the C<I_DLD> symbol, which
+indicates to the C program that <dld.h> (C<GNU> dynamic loading)
+exists and should be included.
+
+=item C<i_dlfcn>
+
+From F<i_dlfcn.U>:
+
+This variable conditionally defines the C<I_DLFCN> symbol, which
+indicates to the C program that <dlfcn.h> exists and should
+be included.
+
+=item C<i_fcntl>
+
+From F<i_fcntl.U>:
+
+This variable controls the value of C<I_FCNTL> (which tells
+the C program to include <fcntl.h>).
+
+=item C<i_float>
+
+From F<i_float.U>:
+
+This variable conditionally defines the C<I_FLOAT> symbol, and indicates
+whether a C program may include <float.h> to get symbols like C<DBL_MAX>
+or C<DBL_MIN>, F<i.e>. machine dependent floating point values.
+
+=item C<i_fp>
+
+From F<i_fp.U>:
+
+This variable conditionally defines the C<I_FP> symbol, and indicates
+whether a C program should include <fp.h>.
+
+=item C<i_fp_class>
+
+From F<i_fp_class.U>:
+
+This variable conditionally defines the C<I_FP_CLASS> symbol, and indicates
+whether a C program should include <fp_class.h>.
+
+=item C<i_gdbm>
+
+From F<i_gdbm.U>:
+
+This variable conditionally defines the C<I_GDBM> symbol, which
+indicates to the C program that <gdbm.h> exists and should
+be included.
+
+=item C<i_grp>
+
+From F<i_grp.U>:
+
+This variable conditionally defines the C<I_GRP> symbol, and indicates
+whether a C program should include <grp.h>.
+
+=item C<i_ieeefp>
+
+From F<i_ieeefp.U>:
+
+This variable conditionally defines the C<I_IEEEFP> symbol, and indicates
+whether a C program should include <ieeefp.h>.
+
+=item C<i_inttypes>
+
+From F<i_inttypes.U>:
+
+This variable conditionally defines the C<I_INTTYPES> symbol,
+and indicates whether a C program should include <inttypes.h>.
+
+=item C<i_langinfo>
+
+From F<i_langinfo.U>:
+
+This variable conditionally defines the C<I_LANGINFO> symbol,
+and indicates whether a C program should include <langinfo.h>.
+
+=item C<i_libutil>
+
+From F<i_libutil.U>:
+
+This variable conditionally defines the C<I_LIBUTIL> symbol, and indicates
+whether a C program should include <libutil.h>.
+
+=item C<i_limits>
+
+From F<i_limits.U>:
+
+This variable conditionally defines the C<I_LIMITS> symbol, and indicates
+whether a C program may include <limits.h> to get symbols like C<WORD_BIT>
+and friends.
+
+=item C<i_locale>
+
+From F<i_locale.U>:
+
+This variable conditionally defines the C<I_LOCALE> symbol,
+and indicates whether a C program should include <locale.h>.
+
+=item C<i_machcthr>
+
+From F<i_machcthr.U>:
+
+This variable conditionally defines the C<I_MACH_CTHREADS> symbol,
+and indicates whether a C program should include <mach/cthreads.h>.
+
+=item C<i_malloc>
+
+From F<i_malloc.U>:
+
+This variable conditionally defines the C<I_MALLOC> symbol, and indicates
+whether a C program should include <malloc.h>.
+
+=item C<i_math>
+
+From F<i_math.U>:
+
+This variable conditionally defines the C<I_MATH> symbol, and indicates
+whether a C program may include <math.h>.
+
+=item C<i_memory>
+
+From F<i_memory.U>:
+
+This variable conditionally defines the C<I_MEMORY> symbol, and indicates
+whether a C program should include <memory.h>.
+
+=item C<i_mntent>
+
+From F<i_mntent.U>:
+
+This variable conditionally defines the C<I_MNTENT> symbol, and indicates
+whether a C program should include <mntent.h>.
+
+=item C<i_ndbm>
+
+From F<i_ndbm.U>:
+
+This variable conditionally defines the C<I_NDBM> symbol, which
+indicates to the C program that <ndbm.h> exists and should
+be included.
+
+=item C<i_netdb>
+
+From F<i_netdb.U>:
+
+This variable conditionally defines the C<I_NETDB> symbol, and indicates
+whether a C program should include <netdb.h>.
+
+=item C<i_neterrno>
+
+From F<i_neterrno.U>:
+
+This variable conditionally defines the C<I_NET_ERRNO> symbol, which
+indicates to the C program that <net/errno.h> exists and should
+be included.
+
+=item C<i_netinettcp>
+
+From F<i_netinettcp.U>:
+
+This variable conditionally defines the C<I_NETINET_TCP> symbol,
+and indicates whether a C program should include <netinet/tcp.h>.
+
+=item C<i_niin>
+
+From F<i_niin.U>:
+
+This variable conditionally defines C<I_NETINET_IN>, which indicates
+to the C program that it should include <netinet/in.h>. Otherwise,
+you may try <sys/in.h>.
+
+=item C<i_poll>
+
+From F<i_poll.U>:
+
+This variable conditionally defines the C<I_POLL> symbol, and indicates
+whether a C program should include <poll.h>.
+
+=item C<i_prot>
+
+From F<i_prot.U>:
+
+This variable conditionally defines the C<I_PROT> symbol, and indicates
+whether a C program should include <prot.h>.
+
+=item C<i_pthread>
+
+From F<i_pthread.U>:
+
+This variable conditionally defines the C<I_PTHREAD> symbol,
+and indicates whether a C program should include <pthread.h>.
+
+=item C<i_pwd>
+
+From F<i_pwd.U>:
+
+This variable conditionally defines C<I_PWD>, which indicates
+to the C program that it should include <pwd.h>.
+
+=item C<i_rpcsvcdbm>
+
+From F<i_dbm.U>:
+
+This variable conditionally defines the C<I_RPCSVC_DBM> symbol, which
+indicates to the C program that <rpcsvc/dbm.h> exists and should
+be included.  Some System V systems might need this instead of <dbm.h>.
+
+=item C<i_sfio>
+
+From F<i_sfio.U>:
+
+This variable conditionally defines the C<I_SFIO> symbol,
+and indicates whether a C program should include <sfio.h>.
+
+=item C<i_sgtty>
+
+From F<i_termio.U>:
+
+This variable conditionally defines the C<I_SGTTY> symbol, which
+indicates to the C program that it should include <sgtty.h> rather
+than <termio.h>.
+
+=item C<i_shadow>
+
+From F<i_shadow.U>:
+
+This variable conditionally defines the C<I_SHADOW> symbol, and indicates
+whether a C program should include <shadow.h>.
+
+=item C<i_socks>
+
+From F<i_socks.U>:
+
+This variable conditionally defines the C<I_SOCKS> symbol, and indicates
+whether a C program should include <socks.h>.
+
+=item C<i_stdarg>
+
+From F<i_varhdr.U>:
+
+This variable conditionally defines the C<I_STDARG> symbol, which
+indicates to the C program that <stdarg.h> exists and should
+be included.
+
+=item C<i_stddef>
+
+From F<i_stddef.U>:
+
+This variable conditionally defines the C<I_STDDEF> symbol, which
+indicates to the C program that <stddef.h> exists and should
+be included.
+
+=item C<i_stdlib>
+
+From F<i_stdlib.U>:
+
+This variable conditionally defines the C<I_STDLIB> symbol, which
+indicates to the C program that <stdlib.h> exists and should
+be included.
+
+=item C<i_string>
+
+From F<i_string.U>:
+
+This variable conditionally defines the C<I_STRING> symbol, which
+indicates that <string.h> should be included rather than <strings.h>.
+
+=item C<i_sunmath>
+
+From F<i_sunmath.U>:
+
+This variable conditionally defines the C<I_SUNMATH> symbol, and indicates
+whether a C program should include <sunmath.h>.
+
+=item C<i_sysaccess>
+
+From F<i_sysaccess.U>:
+
+This variable conditionally defines the C<I_SYS_ACCESS> symbol,
+and indicates whether a C program should include <sys/access.h>.
+
+=item C<i_sysdir>
+
+From F<i_sysdir.U>:
+
+This variable conditionally defines the C<I_SYS_DIR> symbol, and indicates
+whether a C program should include <sys/dir.h>.
+
+=item C<i_sysfile>
+
+From F<i_sysfile.U>:
+
+This variable conditionally defines the C<I_SYS_FILE> symbol, and indicates
+whether a C program should include <sys/file.h> to get C<R_OK> and friends.
+
+=item C<i_sysfilio>
+
+From F<i_sysioctl.U>:
+
+This variable conditionally defines the C<I_SYS_FILIO> symbol, which
+indicates to the C program that <sys/filio.h> exists and should
+be included in preference to <sys/ioctl.h>.
+
+=item C<i_sysin>
+
+From F<i_niin.U>:
+
+This variable conditionally defines C<I_SYS_IN>, which indicates
+to the C program that it should include <sys/in.h> instead of
+<netinet/in.h>.
+
+=item C<i_sysioctl>
+
+From F<i_sysioctl.U>:
+
+This variable conditionally defines the C<I_SYS_IOCTL> symbol, which
+indicates to the C program that <sys/ioctl.h> exists and should
+be included.
+
+=item C<i_syslog>
+
+From F<i_syslog.U>:
+
+This variable conditionally defines the C<I_SYSLOG> symbol,
+and indicates whether a C program should include <syslog.h>.
+
+=item C<i_sysmman>
+
+From F<i_sysmman.U>:
+
+This variable conditionally defines the C<I_SYS_MMAN> symbol, and
+indicates whether a C program should include <sys/mman.h>.
+
+=item C<i_sysmode>
+
+From F<i_sysmode.U>:
+
+This variable conditionally defines the C<I_SYSMODE> symbol,
+and indicates whether a C program should include <sys/mode.h>.
+
+=item C<i_sysmount>
+
+From F<i_sysmount.U>:
+
+This variable conditionally defines the C<I_SYSMOUNT> symbol,
+and indicates whether a C program should include <sys/mount.h>.
+
+=item C<i_sysndir>
+
+From F<i_sysndir.U>:
+
+This variable conditionally defines the C<I_SYS_NDIR> symbol, and indicates
+whether a C program should include <sys/ndir.h>.
+
+=item C<i_sysparam>
+
+From F<i_sysparam.U>:
+
+This variable conditionally defines the C<I_SYS_PARAM> symbol, and indicates
+whether a C program should include <sys/param.h>.
+
+=item C<i_sysresrc>
+
+From F<i_sysresrc.U>:
+
+This variable conditionally defines the C<I_SYS_RESOURCE> symbol,
+and indicates whether a C program should include <sys/resource.h>.
+
+=item C<i_syssecrt>
+
+From F<i_syssecrt.U>:
+
+This variable conditionally defines the C<I_SYS_SECURITY> symbol,
+and indicates whether a C program should include <sys/security.h>.
+
+=item C<i_sysselct>
+
+From F<i_sysselct.U>:
+
+This variable conditionally defines C<I_SYS_SELECT>, which indicates
+to the C program that it should include <sys/select.h> in order to
+get the definition of struct timeval.
+
+=item C<i_syssockio>
+
+From F<i_sysioctl.U>:
+
+This variable conditionally defines C<I_SYS_SOCKIO> to indicate to the
+C program that socket ioctl codes may be found in <sys/sockio.h>
+instead of <sys/ioctl.h>.
+
+=item C<i_sysstat>
+
+From F<i_sysstat.U>:
+
+This variable conditionally defines the C<I_SYS_STAT> symbol,
+and indicates whether a C program should include <sys/stat.h>.
+
+=item C<i_sysstatfs>
+
+From F<i_sysstatfs.U>:
+
+This variable conditionally defines the C<I_SYSSTATFS> symbol,
+and indicates whether a C program should include <sys/statfs.h>.
+
+=item C<i_sysstatvfs>
+
+From F<i_sysstatvfs.U>:
+
+This variable conditionally defines the C<I_SYSSTATVFS> symbol,
+and indicates whether a C program should include <sys/statvfs.h>.
+
+=item C<i_systime>
+
+From F<i_time.U>:
+
+This variable conditionally defines C<I_SYS_TIME>, which indicates
+to the C program that it should include <sys/time.h>.
+
+=item C<i_systimek>
+
+From F<i_time.U>:
+
+This variable conditionally defines C<I_SYS_TIME_KERNEL>, which
+indicates to the C program that it should include <sys/time.h>
+with C<KERNEL> defined.
+
+=item C<i_systimes>
+
+From F<i_systimes.U>:
+
+This variable conditionally defines the C<I_SYS_TIMES> symbol, and indicates
+whether a C program should include <sys/times.h>.
+
+=item C<i_systypes>
+
+From F<i_systypes.U>:
+
+This variable conditionally defines the C<I_SYS_TYPES> symbol,
+and indicates whether a C program should include <sys/types.h>.
+
+=item C<i_sysuio>
+
+From F<i_sysuio.U>:
+
+This variable conditionally defines the C<I_SYSUIO> symbol, and indicates
+whether a C program should include <sys/uio.h>.
+
+=item C<i_sysun>
+
+From F<i_sysun.U>:
+
+This variable conditionally defines C<I_SYS_UN>, which indicates
+to the C program that it should include <sys/un.h> to get C<UNIX>
+domain socket definitions.
+
+=item C<i_sysutsname>
+
+From F<i_sysutsname.U>:
+
+This variable conditionally defines the C<I_SYSUTSNAME> symbol,
+and indicates whether a C program should include <sys/utsname.h>.
+
+=item C<i_sysvfs>
+
+From F<i_sysvfs.U>:
+
+This variable conditionally defines the C<I_SYSVFS> symbol,
+and indicates whether a C program should include <sys/vfs.h>.
+
+=item C<i_syswait>
+
+From F<i_syswait.U>:
+
+This variable conditionally defines C<I_SYS_WAIT>, which indicates
+to the C program that it should include <sys/wait.h>.
+
+=item C<i_termio>
+
+From F<i_termio.U>:
+
+This variable conditionally defines the C<I_TERMIO> symbol, which
+indicates to the C program that it should include <termio.h> rather
+than <sgtty.h>.
+
+=item C<i_termios>
+
+From F<i_termio.U>:
+
+This variable conditionally defines the C<I_TERMIOS> symbol, which
+indicates to the C program that the C<POSIX> <termios.h> file is
+to be included.
+
+=item C<i_time>
+
+From F<i_time.U>:
+
+This variable conditionally defines C<I_TIME>, which indicates
+to the C program that it should include <time.h>.
+
+=item C<i_unistd>
+
+From F<i_unistd.U>:
+
+This variable conditionally defines the C<I_UNISTD> symbol, and indicates
+whether a C program should include <unistd.h>.
+
+=item C<i_ustat>
+
+From F<i_ustat.U>:
+
+This variable conditionally defines the C<I_USTAT> symbol, and indicates
+whether a C program should include <ustat.h>.
+
+=item C<i_utime>
+
+From F<i_utime.U>:
+
+This variable conditionally defines the C<I_UTIME> symbol, and indicates
+whether a C program should include <utime.h>.
+
+=item C<i_values>
+
+From F<i_values.U>:
+
+This variable conditionally defines the C<I_VALUES> symbol, and indicates
+whether a C program may include <values.h> to get symbols like C<MAXLONG>
+and friends.
+
+=item C<i_varargs>
+
+From F<i_varhdr.U>:
+
+This variable conditionally defines C<I_VARARGS>, which indicates
+to the C program that it should include <varargs.h>.
+
+=item C<i_varhdr>
+
+From F<i_varhdr.U>:
+
+Contains the name of the header to be included to get va_dcl definition.
+Typically one of F<varargs.h> or F<stdarg.h>.
+
+=item C<i_vfork>
+
+From F<i_vfork.U>:
+
+This variable conditionally defines the C<I_VFORK> symbol, and indicates
+whether a C program should include F<vfork.h>.
+
+=item C<ignore_versioned_solibs>
+
+From F<libs.U>:
+
+This variable should be non-empty if non-versioned shared
+libraries (F<libfoo.so.x.y>) are to be ignored (because they
+cannot be linked against).
+
+=item C<inc_version_list>
+
+From F<inc_version_list.U>:
+
+This variable specifies the list of subdirectories in over
+which F<perl.c>:incpush() and F<lib/lib.pm> will automatically
+search when adding directories to @C<INC>.  The elements in
+the list are separated by spaces.  This is only useful
+if you have a perl library directory tree structured like the
+default one.  See C<INSTALL> for how this works.  The versioned
+site_perl directory was introduced in 5.005, so that is the
+lowest possible value.
+
+=item C<inc_version_list_init>
+
+From F<inc_version_list.U>:
+
+This variable holds the same list as inc_version_list, but
+each item is enclosed in double quotes and separated by commas, 
+suitable for use in the C<PERL_INC_VERSION_LIST> initialization.
+
+=item C<incpath>
+
+From F<usrinc.U>:
+
+This variable must preceed the normal include path to get hte
+right one, as in F<$F<incpath/usr/include>> or F<$F<incpath/usr/lib>>.
+Value can be "" or F</bsd43> on mips.
+
+=item C<inews>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<installarchlib>
+
+From F<archlib.U>:
+
+This variable is really the same as archlibexp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installbin>
+
+From F<bin.U>:
+
+This variable is the same as binexp unless C<AFS> is running in which case
+the user is explicitely prompted for it. This variable should always
+be used in your makefiles for maximum portability.
+
+=item C<installhtml1dir>
+
+From F<html1dir.U>:
+
+This variable is really the same as html1direxp, unless you are 
+using a different installprefix.  For extra portability, you 
+should only use this variable within your makefiles.
+
+=item C<installhtml3dir>
+
+From F<html3dir.U>:
+
+This variable is really the same as html3direxp, unless you are 
+using a different installprefix.  For extra portability, you 
+should only use this variable within your makefiles.
+
+=item C<installman1dir>
+
+From F<man1dir.U>:
+
+This variable is really the same as man1direxp, unless you are using
+C<AFS> in which case it points to the read/write location whereas
+man1direxp only points to the read-only access location. For extra
+portability, you should only use this variable within your makefiles.
+
+=item C<installman3dir>
+
+From F<man3dir.U>:
+
+This variable is really the same as man3direxp, unless you are using
+C<AFS> in which case it points to the read/write location whereas
+man3direxp only points to the read-only access location. For extra
+portability, you should only use this variable within your makefiles.
+
+=item C<installprefix>
+
+From F<installprefix.U>:
+
+This variable holds the name of the directory below which 
+"make install" will install the package.  For most users, this
+is the same as prefix.  However, it is useful for
+installing the software into a different (usually temporary)
+location after which it can be bundled up and moved somehow
+to the final location specified by prefix.
+
+=item C<installprefixexp>
+
+From F<installprefix.U>:
+
+This variable holds the full absolute path of installprefix
+with all F<~>-expansion done.
+
+=item C<installprivlib>
+
+From F<privlib.U>:
+
+This variable is really the same as privlibexp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installscript>
+
+From F<scriptdir.U>:
+
+This variable is usually the same as scriptdirexp, unless you are on
+a system running C<AFS>, in which case they may differ slightly. You
+should always use this variable within your makefiles for portability.
+
+=item C<installsitearch>
+
+From F<sitearch.U>:
+
+This variable is really the same as sitearchexp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installsitebin>
+
+From F<sitebin.U>:
+
+This variable is usually the same as sitebinexp, unless you are on
+a system running C<AFS>, in which case they may differ slightly. You
+should always use this variable within your makefiles for portability.
+
+=item C<installsitehtml1dir>
+
+From F<sitehtml1dir.U>:
+
+This variable is really the same as sitehtml1direxp, unless you are using
+C<AFS> in which case it points to the read/write location whereas
+html1direxp only points to the read-only access location. For extra
+portability, you should only use this variable within your makefiles.
+
+=item C<installsitehtml3dir>
+
+From F<sitehtml3dir.U>:
+
+This variable is really the same as sitehtml3direxp, unless you are using
+C<AFS> in which case it points to the read/write location whereas
+html3direxp only points to the read-only access location. For extra
+portability, you should only use this variable within your makefiles.
+
+=item C<installsitelib>
+
+From F<sitelib.U>:
+
+This variable is really the same as sitelibexp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installsiteman1dir>
+
+From F<siteman1dir.U>:
+
+This variable is really the same as siteman1direxp, unless you are using
+C<AFS> in which case it points to the read/write location whereas
+man1direxp only points to the read-only access location. For extra
+portability, you should only use this variable within your makefiles.
+
+=item C<installsiteman3dir>
+
+From F<siteman3dir.U>:
+
+This variable is really the same as siteman3direxp, unless you are using
+C<AFS> in which case it points to the read/write location whereas
+man3direxp only points to the read-only access location. For extra
+portability, you should only use this variable within your makefiles.
+
+=item C<installsitescript>
+
+From F<sitescript.U>:
+
+This variable is usually the same as sitescriptexp, unless you are on
+a system running C<AFS>, in which case they may differ slightly. You
+should always use this variable within your makefiles for portability.
+
+=item C<installstyle>
+
+From F<installstyle.U>:
+
+This variable describes the C<style> of the perl installation.
+This is intended to be useful for tools that need to
+manipulate entire perl distributions.  Perl itself doesn't use
+this to find its libraries -- the library directories are
+stored directly in F<Config.pm>.  Currently, there are only two
+styles:  C<lib> and F<lib/perl5>.  The default library locations
+(e.g. privlib, sitelib) are either F<$prefix/lib> or
+F<$prefix/lib/perl5>.  The former is useful if $prefix is a
+directory dedicated to perl (e.g. F</opt/perl>), while the latter
+is useful if $prefix is shared by many packages, e.g. if
+$prefix=F</usr/local>.
+
+Unfortunately, while this C<style> variable is used to set
+defaults for all three directory hierarchies (core, vendor, and
+site), there is no guarantee that the same style is actually
+appropriate for all those directories.  For example, $prefix
+might be F</opt/perl>, but $siteprefix might be F</usr/local>.
+(Perhaps, in retrospect, the C<lib> style should never have been
+supported, but it did seem like a nice idea at the time.)
+
+The situation is even less clear for tools such as MakeMaker
+that can be used to install additional modules into
+non-standard places.  For example, if a user intends to install
+a module into a private directory (perhaps by setting C<PREFIX> on
+the F<Makefile.PL> command line), then there is no reason to
+assume that the Configure-time $installstyle setting will be
+relevant for that C<PREFIX>.
+
+This may later be extended to include other information, so
+be careful with pattern-matching on the results.
+
+For compatibility with F<perl5.005> and earlier, the default
+setting is based on whether or not $prefix contains the string
+C<perl>.
+
+=item C<installusrbinperl>
+
+From F<instubperl.U>:
+
+This variable tells whether Perl should be installed also as
+F</usr/bin/perl> in addition to
+F<$installbin/perl>
+
+=item C<installvendorarch>
+
+From F<vendorarch.U>:
+
+This variable is really the same as vendorarchexp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installvendorbin>
+
+From F<vendorbin.U>:
+
+This variable is really the same as vendorbinexp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installvendorhtml1dir>
+
+From F<vendorhtml1dir.U>:
+
+This variable is really the same as vendorhtml1direxp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installvendorhtml3dir>
+
+From F<vendorhtml3dir.U>:
+
+This variable is really the same as vendorhtml3direxp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installvendorlib>
+
+From F<vendorlib.U>:
+
+This variable is really the same as vendorlibexp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installvendorman1dir>
+
+From F<vendorman1dir.U>:
+
+This variable is really the same as vendorman1direxp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installvendorman3dir>
+
+From F<vendorman3dir.U>:
+
+This variable is really the same as vendorman3direxp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<installvendorscript>
+
+From F<vendorscript.U>:
+
+This variable is really the same as vendorscriptexp but may differ on
+those systems using C<AFS>. For extra portability, only this variable
+should be used in makefiles.
+
+=item C<intsize>
+
+From F<intsize.U>:
+
+This variable contains the value of the C<INTSIZE> symbol, which
+indicates to the C program how many bytes there are in an int.
+
+=item C<issymlink>
+
+From F<issymlink.U>:
+
+This variable holds the test command to test for a symbolic link
+(if they are supported).  Typical values include C<test -h> and
+C<test -L>.
+
+=item C<ivdformat>
+
+From F<perlxvf.U>:
+
+This variable contains the format string used for printing
+a Perl C<IV> as a signed decimal integer. 
+
+=item C<ivsize>
+
+From F<perlxv.U>:
+
+This variable is the size of an C<IV> in bytes.
+
+=item C<ivtype>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's C<IV>.
+
+=back
+
+=head2 k
+
+=over 4
+
+=item C<known_extensions>
+
+From F<Extensions.U>:
+
+This variable holds a list of all C<XS> extensions included in 
+the package.
+
+=item C<ksh>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=back
+
+=head2 l
+
+=over 4
+
+=item C<ld>
+
+From F<dlsrc.U>:
+
+This variable indicates the program to be used to link
+libraries for dynamic loading.  On some systems, it is C<ld>.
+On C<ELF> systems, it should be $cc.  Mostly, we'll try to respect
+the hint file setting.
+
+=item C<lddlflags>
+
+From F<dlsrc.U>:
+
+This variable contains any special flags that might need to be
+passed to $ld to create a shared library suitable for dynamic
+loading.  It is up to the makefile to use it.  For hpux, it
+should be C<-b>.  For sunos 4.1, it is empty.
+
+=item C<ldflags>
+
+From F<ccflags.U>:
+
+This variable contains any additional C loader flags desired by
+the user.  It is up to the Makefile to use this.
+
+=item C<ldflags_uselargefiles>
+
+From F<uselfs.U>:
+
+This variable contains the loader flags needed by large file builds
+and added to ldflags by hints files.
+
+=item C<ldlibpthname>
+
+From F<libperl.U>:
+
+This variable holds the name of the shared library
+search path, often C<LD_LIBRARY_PATH>.  To get an empty
+string, the hints file must set this to C<none>.
+
+=item C<less>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the less program.  After Configure runs,
+the value is reset to a plain C<less> and is not useful.
+
+=item C<lib_ext>
+
+From F<Unix.U>:
+
+This is an old synonym for _a.
+
+=item C<libc>
+
+From F<libc.U>:
+
+This variable contains the location of the C library.
+
+=item C<libperl>
+
+From F<libperl.U>:
+
+The perl executable is obtained by linking F<perlmain.c> with
+libperl, any static extensions (usually just DynaLoader),
+and any other libraries needed on this system.  libperl
+is usually F<libperl.a>, but can also be F<libperl.so.xxx> if
+the user wishes to build a perl executable with a shared
+library.
+
+=item C<libpth>
+
+From F<libpth.U>:
+
+This variable holds the general path (space-separated) used to find
+libraries. It is intended to be used by other units.
+
+=item C<libs>
+
+From F<libs.U>:
+
+This variable holds the additional libraries we want to use.
+It is up to the Makefile to deal with it.  The list can be empty.
+
+=item C<libsdirs>
+
+From F<libs.U>:
+
+This variable holds the directory names aka dirnames of the libraries
+we found and accepted, duplicates are removed.
+
+=item C<libsfiles>
+
+From F<libs.U>:
+
+This variable holds the filenames aka basenames of the libraries
+we found and accepted.
+
+=item C<libsfound>
+
+From F<libs.U>:
+
+This variable holds the full pathnames of the libraries
+we found and accepted.
+
+=item C<libspath>
+
+From F<libs.U>:
+
+This variable holds the directory names probed for libraries.
+
+=item C<libswanted>
+
+From F<Myinit.U>:
+
+This variable holds a list of all the libraries we want to
+search.  The order is chosen to pick up the c library
+ahead of ucb or bsd libraries for SVR4.
+
+=item C<libswanted_uselargefiles>
+
+From F<uselfs.U>:
+
+This variable contains the libraries needed by large file builds
+and added to ldflags by hints files.  It is a space separated list
+of the library names without the C<lib> prefix or any suffix, just
+like F<libswanted.>.
+
+=item C<line>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<lint>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<lkflags>
+
+From F<ccflags.U>:
+
+This variable contains any additional C partial linker flags desired by
+the user.  It is up to the Makefile to use this.
+
+=item C<ln>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the ln program.  After Configure runs,
+the value is reset to a plain C<ln> and is not useful.
+
+=item C<lns>
+
+From F<lns.U>:
+
+This variable holds the name of the command to make 
+symbolic links (if they are supported).  It can be used
+in the Makefile. It is either C<ln -s> or C<ln>
+
+=item C<localtime_r_proto>
+
+From F<d_localtime_r.U>:
+
+This variable encodes the prototype of localtime_r.
+It is zero if d_localtime_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_localtime_r
+is defined.
+
+=item C<locincpth>
+
+From F<ccflags.U>:
+
+This variable contains a list of additional directories to be
+searched by the compiler.  The appropriate C<-I> directives will
+be added to ccflags.  This is intended to simplify setting
+local directories from the Configure command line.
+It's not much, but it parallels the loclibpth stuff in F<libpth.U>.
+
+=item C<loclibpth>
+
+From F<libpth.U>:
+
+This variable holds the paths (space-separated) used to find local
+libraries.  It is prepended to libpth, and is intended to be easily
+set from the command line.
+
+=item C<longdblsize>
+
+From F<d_longdbl.U>:
+
+This variable contains the value of the C<LONG_DOUBLESIZE> symbol, which
+indicates to the C program how many bytes there are in a long double,
+if this system supports long doubles.
+
+=item C<longlongsize>
+
+From F<d_longlong.U>:
+
+This variable contains the value of the C<LONGLONGSIZE> symbol, which
+indicates to the C program how many bytes there are in a long long,
+if this system supports long long.
+
+=item C<longsize>
+
+From F<intsize.U>:
+
+This variable contains the value of the C<LONGSIZE> symbol, which
+indicates to the C program how many bytes there are in a long.
+
+=item C<lp>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<lpr>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<ls>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the ls program.  After Configure runs,
+the value is reset to a plain C<ls> and is not useful.
+
+=item C<lseeksize>
+
+From F<lseektype.U>:
+
+This variable defines lseektype to be something like off_t, long, 
+or whatever type is used to declare lseek offset's type in the
+kernel (which also appears to be lseek's return type).
+
+=item C<lseektype>
+
+From F<lseektype.U>:
+
+This variable defines lseektype to be something like off_t, long, 
+or whatever type is used to declare lseek offset's type in the
+kernel (which also appears to be lseek's return type).
+
+=back
+
+=head2 m
+
+=over 4
+
+=item C<mail>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<mailx>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<make>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the make program.  After Configure runs,
+the value is reset to a plain C<make> and is not useful.
+
+=item C<make_set_make>
+
+From F<make.U>:
+
+Some versions of C<make> set the variable C<MAKE>.  Others do not.
+This variable contains the string to be included in F<Makefile.SH>
+so that C<MAKE> is set if needed, and not if not needed.
+Possible values are:
+
+make_set_make=C<#>		# If your make program handles this for you,
+
+make_set_make=C<MAKE=$make>	# if it doesn't.
+
+This uses a comment character to distinguish a
+C<set> value (from a previous F<config.sh> or Configure C<-D> option)
+from an uncomputed value.
+
+=item C<mallocobj>
+
+From F<mallocsrc.U>:
+
+This variable contains the name of the F<malloc.o> that this package
+generates, if that F<malloc.o> is preferred over the system malloc.
+Otherwise the value is null.  This variable is intended for generating
+Makefiles.  See mallocsrc.
+
+=item C<mallocsrc>
+
+From F<mallocsrc.U>:
+
+This variable contains the name of the F<malloc.c> that comes with
+the package, if that F<malloc.c> is preferred over the system malloc.
+Otherwise the value is null.  This variable is intended for generating
+Makefiles.
+
+=item C<malloctype>
+
+From F<mallocsrc.U>:
+
+This variable contains the kind of ptr returned by malloc and realloc.
+
+=item C<man1dir>
+
+From F<man1dir.U>:
+
+This variable contains the name of the directory in which manual
+source pages are to be put.  It is the responsibility of the
+F<Makefile.SH> to get the value of this into the proper command.
+You must be prepared to do the F<~name> expansion yourself.
+
+=item C<man1direxp>
+
+From F<man1dir.U>:
+
+This variable is the same as the man1dir variable, but is filename
+expanded at configuration time, for convenient use in makefiles.
+
+=item C<man1ext>
+
+From F<man1dir.U>:
+
+This variable contains the extension that the manual page should
+have: one of C<n>, C<l>, or C<1>.  The Makefile must supply the F<.>.
+See man1dir.
+
+=item C<man3dir>
+
+From F<man3dir.U>:
+
+This variable contains the name of the directory in which manual
+source pages are to be put.  It is the responsibility of the
+F<Makefile.SH> to get the value of this into the proper command.
+You must be prepared to do the F<~name> expansion yourself.
+
+=item C<man3direxp>
+
+From F<man3dir.U>:
+
+This variable is the same as the man3dir variable, but is filename
+expanded at configuration time, for convenient use in makefiles.
+
+=item C<man3ext>
+
+From F<man3dir.U>:
+
+This variable contains the extension that the manual page should
+have: one of C<n>, C<l>, or C<3>.  The Makefile must supply the F<.>.
+See man3dir.
+
+=back
+
+=head2 M
+
+=over 4
+
+=item C<Mcc>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the Mcc program.  After Configure runs,
+the value is reset to a plain C<Mcc> and is not useful.
+
+=item C<mips_type>
+
+From F<usrinc.U>:
+
+This variable holds the environment type for the mips system.
+Possible values are "BSD 4.3" and "System V".
+
+=item C<mistrustnm>
+
+From F<Csym.U>:
+
+This variable can be used to establish a fallthrough for the cases
+where nm fails to find a symbol.  If usenm is false or usenm is true
+and mistrustnm is false, this variable has no effect.  If usenm is true
+and mistrustnm is C<compile>, a test program will be compiled to try to
+find any symbol that can't be located via nm lookup.  If mistrustnm is
+C<run>, the test program will be run as well as being compiled.
+
+=item C<mkdir>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the mkdir program.  After Configure runs,
+the value is reset to a plain C<mkdir> and is not useful.
+
+=item C<mmaptype>
+
+From F<d_mmap.U>:
+
+This symbol contains the type of pointer returned by mmap()
+(and simultaneously the type of the first argument).
+It can be C<void *> or C<caddr_t>.
+
+=item C<modetype>
+
+From F<modetype.U>:
+
+This variable defines modetype to be something like mode_t, 
+int, unsigned short, or whatever type is used to declare file 
+modes for system calls.
+
+=item C<more>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the more program.  After Configure runs,
+the value is reset to a plain C<more> and is not useful.
+
+=item C<multiarch>
+
+From F<multiarch.U>:
+
+This variable conditionally defines the C<MULTIARCH> symbol
+which signifies the presence of multiplatform files.
+This is normally set by hints files.
+
+=item C<mv>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<myarchname>
+
+From F<archname.U>:
+
+This variable holds the architecture name computed by Configure in
+a previous run. It is not intended to be perused by any user and
+should never be set in a hint file.
+
+=item C<mydomain>
+
+From F<myhostname.U>:
+
+This variable contains the eventual value of the C<MYDOMAIN> symbol,
+which is the domain of the host the program is going to run on.
+The domain must be appended to myhostname to form a complete host name.
+The dot comes with mydomain, and need not be supplied by the program.
+
+=item C<myhostname>
+
+From F<myhostname.U>:
+
+This variable contains the eventual value of the C<MYHOSTNAME> symbol,
+which is the name of the host the program is going to run on.
+The domain is not kept with hostname, but must be gotten from mydomain.
+The dot comes with mydomain, and need not be supplied by the program.
+
+=item C<myuname>
+
+From F<Oldconfig.U>:
+
+The output of C<uname -a> if available, otherwise the hostname. On Xenix,
+pseudo variables assignments in the output are stripped, thank you. The
+whole thing is then lower-cased.
+
+=back
+
+=head2 n
+
+=over 4
+
+=item C<n>
+
+From F<n.U>:
+
+This variable contains the C<-n> flag if that is what causes the echo
+command to suppress newline.  Otherwise it is null.  Correct usage is
+$echo $n "prompt for a question: $c".
+
+=item C<need_va_copy>
+
+From F<need_va_copy.U>:
+
+This symbol, if defined, indicates that the system stores
+the variable argument list datatype, va_list, in a format
+that cannot be copied by simple assignment, so that some
+other means must be used when copying is required.
+As such systems vary in their provision (or non-provision)
+of copying mechanisms, F<handy.h> defines a platform-
+C<independent> macro, Perl_va_copy(src, dst), to do the job.
+
+=item C<netdb_hlen_type>
+
+From F<netdbtype.U>:
+
+This variable holds the type used for the 2nd argument to
+gethostbyaddr().  Usually, this is int or size_t or unsigned.
+This is only useful if you have gethostbyaddr(), naturally.
+
+=item C<netdb_host_type>
+
+From F<netdbtype.U>:
+
+This variable holds the type used for the 1st argument to
+gethostbyaddr().  Usually, this is char * or void *,  possibly
+with or without a const prefix.
+This is only useful if you have gethostbyaddr(), naturally.
+
+=item C<netdb_name_type>
+
+From F<netdbtype.U>:
+
+This variable holds the type used for the argument to
+gethostbyname().  Usually, this is char * or const char *.
+This is only useful if you have gethostbyname(), naturally.
+
+=item C<netdb_net_type>
+
+From F<netdbtype.U>:
+
+This variable holds the type used for the 1st argument to
+getnetbyaddr().  Usually, this is int or long.
+This is only useful if you have getnetbyaddr(), naturally.
+
+=item C<nm>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the nm program.  After Configure runs,
+the value is reset to a plain C<nm> and is not useful.
+
+=item C<nm_opt>
+
+From F<usenm.U>:
+
+This variable holds the options that may be necessary for nm.
+
+=item C<nm_so_opt>
+
+From F<usenm.U>:
+
+This variable holds the options that may be necessary for nm
+to work on a shared library but that can not be used on an
+archive library.  Currently, this is only used by Linux, where
+nm --dynamic is *required* to get symbols from an C<ELF> library which
+has been stripped, but nm --dynamic is *fatal* on an archive library.
+Maybe Linux should just always set usenm=false.
+
+=item C<nonxs_ext>
+
+From F<Extensions.U>:
+
+This variable holds a list of all non-xs extensions included
+in the package.  All of them will be built.
+
+=item C<nroff>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the nroff program.  After Configure runs,
+the value is reset to a plain C<nroff> and is not useful.
+
+=item C<nv_preserves_uv_bits>
+
+From F<perlxv.U>:
+
+This variable indicates how many of bits type uvtype
+a variable nvtype can preserve.
+
+=item C<nveformat>
+
+From F<perlxvf.U>:
+
+This variable contains the format string used for printing
+a Perl C<NV> using %e-ish floating point format.
+
+=item C<nvEUformat>
+
+From F<perlxvf.U>:
+
+This variable contains the format string used for printing
+a Perl C<NV> using %E-ish floating point format.
+
+=item C<nvfformat>
+
+From F<perlxvf.U>:
+
+This variable confains the format string used for printing
+a Perl C<NV> using %f-ish floating point format.
+
+=item C<nvFUformat>
+
+From F<perlxvf.U>:
+
+This variable confains the format string used for printing
+a Perl C<NV> using %F-ish floating point format.
+
+=item C<nvgformat>
+
+From F<perlxvf.U>:
+
+This variable contains the format string used for printing
+a Perl C<NV> using %g-ish floating point format.
+
+=item C<nvGUformat>
+
+From F<perlxvf.U>:
+
+This variable contains the format string used for printing
+a Perl C<NV> using %G-ish floating point format.
+
+=item C<nvsize>
+
+From F<perlxv.U>:
+
+This variable is the size of an C<NV> in bytes.
+
+=item C<nvtype>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's C<NV>.
+
+=back
+
+=head2 o
+
+=over 4
+
+=item C<o_nonblock>
+
+From F<nblock_io.U>:
+
+This variable bears the symbol value to be used during open() or fcntl()
+to turn on non-blocking I/O for a file descriptor. If you wish to switch
+between blocking and non-blocking, you may try ioctl(C<FIOSNBIO>) instead,
+but that is only supported by some devices.
+
+=item C<obj_ext>
+
+From F<Unix.U>:
+
+This is an old synonym for _o.
+
+=item C<old_pthread_create_joinable>
+
+From F<d_pthrattrj.U>:
+
+This variable defines the constant to use for creating joinable
+(aka undetached) pthreads.  Unused if F<pthread.h> defines
+C<PTHREAD_CREATE_JOINABLE>.  If used, possible values are
+C<PTHREAD_CREATE_UNDETACHED> and C<__UNDETACHED>.
+
+=item C<optimize>
+
+From F<ccflags.U>:
+
+This variable contains any F<optimizer/debugger> flag that should be used.
+It is up to the Makefile to use it.
+
+=item C<orderlib>
+
+From F<orderlib.U>:
+
+This variable is C<true> if the components of libraries must be ordered
+(with `lorder $* | tsort`) before placing them in an archive.  Set to
+C<false> if ranlib or ar can generate random libraries.
+
+=item C<osname>
+
+From F<Oldconfig.U>:
+
+This variable contains the operating system name (e.g. sunos,
+solaris, hpux, etc.).  It can be useful later on for setting
+defaults.  Any spaces are replaced with underscores.  It is set
+to a null string if we can't figure it out.
+
+=item C<osvers>
+
+From F<Oldconfig.U>:
+
+This variable contains the operating system version (e.g.
+4.1.3, 5.2, etc.).  It is primarily used for helping select
+an appropriate hints file, but might be useful elsewhere for
+setting defaults.  It is set to '' if we can't figure it out.
+We try to be flexible about how much of the version number
+to keep, e.g. if 4.1.1, 4.1.2, and 4.1.3 are essentially the
+same for this package, hints files might just be F<os_4.0> or
+F<os_4.1>, etc., not keeping separate files for each little release.
+
+=item C<otherlibdirs>
+
+From F<otherlibdirs.U>:
+
+This variable contains a colon-separated set of paths for the perl
+binary to search for additional library files or modules.
+These directories will be tacked to the end of @C<INC>.
+Perl will automatically search below each path for version-
+and architecture-specific directories.  See inc_version_list
+for more details.
+A value of C< > means C<none> and is used to preserve this value
+for the next run through Configure.
+
+=back
+
+=head2 p
+
+=over 4
+
+=item C<package>
+
+From F<package.U>:
+
+This variable contains the name of the package being constructed.
+It is primarily intended for the use of later Configure units.
+
+=item C<pager>
+
+From F<pager.U>:
+
+This variable contains the name of the preferred pager on the system.
+Usual values are (the full pathnames of) more, less, pg, or cat.
+
+=item C<passcat>
+
+From F<nis.U>:
+
+This variable contains a command that produces the text of the
+F</etc/passwd> file.  This is normally "cat F</etc/passwd>", but can be
+"ypcat passwd" when C<NIS> is used.
+On some systems, such as os390, there may be no equivalent
+command, in which case this variable is unset.
+
+=item C<patchlevel>
+
+From F<patchlevel.U>:
+
+The patchlevel level of this package.
+The value of patchlevel comes from the F<patchlevel.h> file.
+In a version number such as 5.6.1, this is the C<6>.
+In F<patchlevel.h>, this is referred to as C<PERL_VERSION>.
+
+=item C<path_sep>
+
+From F<Unix.U>:
+
+This is an old synonym for p_ in F<Head.U>, the character
+used to separate elements in the command shell search C<PATH>.
+
+=item C<perl5>
+
+From F<perl5.U>:
+
+This variable contains the full path (if any) to a previously
+installed F<perl5.005> or later suitable for running the script
+to determine inc_version_list.
+
+=item C<perl>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<perl_patchlevel>
+
+From F<patchlevel.U>:
+
+This is the Perl patch level, a numeric change identifier,
+as defined by whichever source code maintenance system
+is used to maintain the patches; currently Perforce.
+It does not correlate with the Perl version numbers or
+the maintenance versus development dichotomy except
+by also being increasing.
+
+=back
+
+=head2 P
+
+=over 4
+
+=item C<PERL_REVISION>
+
+From F<Oldsyms.U>:
+
+In a Perl version number such as 5.6.2, this is the 5.
+This value is manually set in F<patchlevel.h>
+
+=item C<PERL_SUBVERSION>
+
+From F<Oldsyms.U>:
+
+In a Perl version number such as 5.6.2, this is the 2.
+Values greater than 50 represent potentially unstable
+development subversions.
+This value is manually set in F<patchlevel.h>
+
+=item C<PERL_VERSION>
+
+From F<Oldsyms.U>:
+
+In a Perl version number such as 5.6.2, this is the 6.
+This value is manually set in F<patchlevel.h>
+
+=item C<perladmin>
+
+From F<perladmin.U>:
+
+Electronic mail address of the perl5 administrator.
+
+=item C<perllibs>
+
+From F<End.U>:
+
+The list of libraries needed by Perl only (any libraries needed
+by extensions only will by dropped, if using dynamic loading).
+
+=item C<perlpath>
+
+From F<perlpath.U>:
+
+This variable contains the eventual value of the C<PERLPATH> symbol,
+which contains the name of the perl interpreter to be used in
+shell scripts and in the "eval C<exec>" idiom.  This variable is
+not necessarily the pathname of the file containing the perl
+interpreter; you must append the executable extension (_exe) if
+it is not already present.  Note that Perl code that runs during
+the Perl build process cannot reference this variable, as Perl
+may not have been installed, or even if installed, may be a
+different version of Perl.
+
+=item C<pg>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the pg program.  After Configure runs,
+the value is reset to a plain C<pg> and is not useful.
+
+=item C<phostname>
+
+From F<myhostname.U>:
+
+This variable contains the eventual value of the C<PHOSTNAME> symbol,
+which is a command that can be fed to popen() to get the host name.
+The program should probably not presume that the domain is or isn't
+there already.
+
+=item C<pidtype>
+
+From F<pidtype.U>:
+
+This variable defines C<PIDTYPE> to be something like pid_t, int, 
+ushort, or whatever type is used to declare process ids in the kernel.
+
+=item C<plibpth>
+
+From F<libpth.U>:
+
+Holds the private path used by Configure to find out the libraries.
+Its value is prepend to libpth. This variable takes care of special
+machines, like the mips.  Usually, it should be empty.
+
+=item C<pmake>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<pr>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<prefix>
+
+From F<prefix.U>:
+
+This variable holds the name of the directory below which the
+user will install the package.  Usually, this is F</usr/local>, and
+executables go in F</usr/local/bin>, library stuff in F</usr/local/lib>,
+man pages in F</usr/local/man>, etc.  It is only used to set defaults
+for things in F<bin.U>, F<mansrc.U>, F<privlib.U>, or F<scriptdir.U>.
+
+=item C<prefixexp>
+
+From F<prefix.U>:
+
+This variable holds the full absolute path of the directory below
+which the user will install the package.  Derived from prefix.
+
+=item C<privlib>
+
+From F<privlib.U>:
+
+This variable contains the eventual value of the C<PRIVLIB> symbol,
+which is the name of the private library for this package.  It may
+have a F<~> on the front. It is up to the makefile to eventually create
+this directory while performing installation (with F<~> substitution).
+
+=item C<privlibexp>
+
+From F<privlib.U>:
+
+This variable is the F<~name> expanded version of privlib, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<procselfexe>
+
+From F<d_procselfexe.U>:
+
+If d_procselfexe is defined, $procselfexe is the filename
+of the symbolic link pointing to the absolute pathname of
+the executing program.
+
+=item C<prototype>
+
+From F<prototype.U>:
+
+This variable holds the eventual value of C<CAN_PROTOTYPE>, which
+indicates the C compiler can handle funciton prototypes.
+
+=item C<ptrsize>
+
+From F<ptrsize.U>:
+
+This variable contains the value of the C<PTRSIZE> symbol, which
+indicates to the C program how many bytes there are in a pointer.
+
+=back
+
+=head2 q
+
+=over 4
+
+=item C<quadkind>
+
+From F<quadtype.U>:
+
+This variable, if defined, encodes the type of a quad:
+1 = int, 2 = long, 3 = long long, 4 = int64_t.
+
+=item C<quadtype>
+
+From F<quadtype.U>:
+
+This variable defines Quad_t to be something like long, int, 
+long long, int64_t, or whatever type is used for 64-bit integers.
+
+=back
+
+=head2 r
+
+=over 4
+
+=item C<randbits>
+
+From F<randfunc.U>:
+
+Indicates how many bits are produced by the function used to
+generate normalized random numbers.
+
+=item C<randfunc>
+
+From F<randfunc.U>:
+
+Indicates the name of the random number function to use.
+Values include drand48, random, and rand. In C programs,
+the C<Drand01> macro is defined to generate uniformly distributed
+random numbers over the range [0., 1.[ (see drand01 and nrand).
+
+=item C<random_r_proto>
+
+From F<d_random_r.U>:
+
+This variable encodes the prototype of random_r.
+It is zero if d_random_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_random_r
+is defined.
+
+=item C<randseedtype>
+
+From F<randfunc.U>:
+
+Indicates the type of the argument of the seedfunc.
+
+=item C<ranlib>
+
+From F<orderlib.U>:
+
+This variable is set to the pathname of the ranlib program, if it is
+needed to generate random libraries.  Set to C<:> if ar can generate
+random libraries or if random libraries are not supported
+
+=item C<rd_nodata>
+
+From F<nblock_io.U>:
+
+This variable holds the return code from read() when no data is
+present. It should be -1, but some systems return 0 when C<O_NDELAY> is
+used, which is a shame because you cannot make the difference between
+no data and an F<EOF.>. Sigh!
+
+=item C<readdir64_r_proto>
+
+From F<d_readdir64_r.U>:
+
+This variable encodes the prototype of readdir64_r.
+It is zero if d_readdir64_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_readdir64_r
+is defined.
+
+=item C<readdir_r_proto>
+
+From F<d_readdir_r.U>:
+
+This variable encodes the prototype of readdir_r.
+It is zero if d_readdir_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_readdir_r
+is defined.
+
+=item C<revision>
+
+From F<patchlevel.U>:
+
+The value of revision comes from the F<patchlevel.h> file.
+In a version number such as 5.6.1, this is the C<5>.
+In F<patchlevel.h>, this is referred to as C<PERL_REVISION>.
+
+=item C<rm>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the rm program.  After Configure runs,
+the value is reset to a plain C<rm> and is not useful.
+
+=item C<rmail>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<run>
+
+From F<Cross.U>:
+
+This variable contains the command used by Configure
+to copy and execute a cross-compiled executable in the
+target host.  Useful and available only during Perl build.
+Empty string '' if not cross-compiling.
+
+=item C<runnm>
+
+From F<usenm.U>:
+
+This variable contains C<true> or C<false> depending whether the
+nm extraction should be performed or not, according to the value
+of usenm and the flags on the Configure command line.
+
+=back
+
+=head2 s
+
+=over 4
+
+=item C<sched_yield>
+
+From F<d_pthread_y.U>:
+
+This variable defines the way to yield the execution
+of the current thread.
+
+=item C<scriptdir>
+
+From F<scriptdir.U>:
+
+This variable holds the name of the directory in which the user wants
+to put publicly scripts for the package in question.  It is either
+the same directory as for binaries, or a special one that can be
+mounted across different architectures, like F</usr/share>. Programs
+must be prepared to deal with F<~name> expansion.
+
+=item C<scriptdirexp>
+
+From F<scriptdir.U>:
+
+This variable is the same as scriptdir, but is filename expanded
+at configuration time, for programs not wanting to bother with it.
+
+=item C<sed>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the sed program.  After Configure runs,
+the value is reset to a plain C<sed> and is not useful.
+
+=item C<seedfunc>
+
+From F<randfunc.U>:
+
+Indicates the random number generating seed function.
+Values include srand48, srandom, and srand.
+
+=item C<selectminbits>
+
+From F<selectminbits.U>:
+
+This variable holds the minimum number of bits operated by select.
+That is, if you do select(n, ...), how many bits at least will be
+cleared in the masks if some activity is detected.  Usually this
+is either n or 32*ceil(F<n/32>), especially many little-endians do
+the latter.  This is only useful if you have select(), naturally.
+
+=item C<selecttype>
+
+From F<selecttype.U>:
+
+This variable holds the type used for the 2nd, 3rd, and 4th
+arguments to select.  Usually, this is C<fd_set *>, if C<HAS_FD_SET>
+is defined, and C<int *> otherwise.  This is only useful if you 
+have select(), naturally.
+
+=item C<sendmail>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<setgrent_r_proto>
+
+From F<d_setgrent_r.U>:
+
+This variable encodes the prototype of setgrent_r.
+It is zero if d_setgrent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_setgrent_r
+is defined.
+
+=item C<sethostent_r_proto>
+
+From F<d_sethostent_r.U>:
+
+This variable encodes the prototype of sethostent_r.
+It is zero if d_sethostent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_sethostent_r
+is defined.
+
+=item C<setlocale_r_proto>
+
+From F<d_setlocale_r.U>:
+
+This variable encodes the prototype of setlocale_r.
+It is zero if d_setlocale_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_setlocale_r
+is defined.
+
+=item C<setnetent_r_proto>
+
+From F<d_setnetent_r.U>:
+
+This variable encodes the prototype of setnetent_r.
+It is zero if d_setnetent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_setnetent_r
+is defined.
+
+=item C<setprotoent_r_proto>
+
+From F<d_setprotoent_r.U>:
+
+This variable encodes the prototype of setprotoent_r.
+It is zero if d_setprotoent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_setprotoent_r
+is defined.
+
+=item C<setpwent_r_proto>
+
+From F<d_setpwent_r.U>:
+
+This variable encodes the prototype of setpwent_r.
+It is zero if d_setpwent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_setpwent_r
+is defined.
+
+=item C<setservent_r_proto>
+
+From F<d_setservent_r.U>:
+
+This variable encodes the prototype of setservent_r.
+It is zero if d_setservent_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_setservent_r
+is defined.
+
+=item C<sh>
+
+From F<sh.U>:
+
+This variable contains the full pathname of the shell used
+on this system to execute Bourne shell scripts.  Usually, this will be
+F</bin/sh>, though it's possible that some systems will have F</bin/ksh>,
+F</bin/pdksh>, F</bin/ash>, F</bin/bash>, or even something such as
+D:F</bin/sh.exe>.
+This unit comes before F<Options.U>, so you can't set sh with a C<-D>
+option, though you can override this (and startsh)
+with C<-O -Dsh=F</bin/whatever> -Dstartsh=whatever>
+
+=item C<shar>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<sharpbang>
+
+From F<spitshell.U>:
+
+This variable contains the string #! if this system supports that
+construct.
+
+=item C<shmattype>
+
+From F<d_shmat.U>:
+
+This symbol contains the type of pointer returned by shmat().
+It can be C<void *> or C<char *>.
+
+=item C<shortsize>
+
+From F<intsize.U>:
+
+This variable contains the value of the C<SHORTSIZE> symbol which
+indicates to the C program how many bytes there are in a short.
+
+=item C<shrpenv>
+
+From F<libperl.U>:
+
+If the user builds a shared F<libperl.so>, then we need to tell the
+C<perl> executable where it will be able to find the installed F<libperl.so>. 
+One way to do this on some systems is to set the environment variable
+C<LD_RUN_PATH> to the directory that will be the final location of the
+shared F<libperl.so>.  The makefile can use this with something like
+$shrpenv $(C<CC>) -o perl F<perlmain.o> $libperl $libs
+Typical values are
+shrpenv="env C<LD_RUN_PATH>=F<$archlibexp/C<CORE>>"
+or
+shrpenv=''
+See the main perl F<Makefile.SH> for actual working usage.
+Alternatively, we might be able to use a command line option such
+as -R F<$archlibexp/C<CORE>> (Solaris) or -Wl,-rpath
+F<$archlibexp/C<CORE>> (Linux).
+
+=item C<shsharp>
+
+From F<spitshell.U>:
+
+This variable tells further Configure units whether your sh can
+handle # comments.
+
+=item C<sig_count>
+
+From F<sig_name.U>:
+
+This variable holds a number larger than the largest valid
+signal number.  This is usually the same as the C<NSIG> macro.
+
+=item C<sig_name>
+
+From F<sig_name.U>:
+
+This variable holds the signal names, space separated. The leading
+C<SIG> in signal name is removed.  A C<ZERO> is prepended to the list.
+This is currently not used, sig_name_init is used instead.
+
+=item C<sig_name_init>
+
+From F<sig_name.U>:
+
+This variable holds the signal names, enclosed in double quotes and
+separated by commas, suitable for use in the C<SIG_NAME> definition 
+below.  A C<ZERO> is prepended to the list, and the list is 
+terminated with a plain 0.  The leading C<SIG> in signal names
+is removed. See sig_num.
+
+=item C<sig_num>
+
+From F<sig_name.U>:
+
+This variable holds the signal numbers, space separated. A C<ZERO> is
+prepended to the list (corresponding to the fake C<SIGZERO>).
+Those numbers correspond to  the value of the signal listed
+in the same place within the sig_name list.
+This is currently not used, sig_num_init is used instead.
+
+=item C<sig_num_init>
+
+From F<sig_name.U>:
+
+This variable holds the signal numbers, enclosed in double quotes and
+separated by commas, suitable for use in the C<SIG_NUM> definition 
+below.  A C<ZERO> is prepended to the list, and the list is 
+terminated with a plain 0.
+
+=item C<sig_size>
+
+From F<sig_name.U>:
+
+This variable contains the number of elements of the sig_name
+and sig_num arrays.
+
+=item C<signal_t>
+
+From F<d_voidsig.U>:
+
+This variable holds the type of the signal handler (void or int).
+
+=item C<sitearch>
+
+From F<sitearch.U>:
+
+This variable contains the eventual value of the C<SITEARCH> symbol,
+which is the name of the private library for this package.  It may
+have a F<~> on the front. It is up to the makefile to eventually create
+this directory while performing installation (with F<~> substitution).
+The standard distribution will put nothing in this directory.
+After perl has been installed, users may install their own local
+architecture-dependent modules in this directory with
+MakeMaker F<Makefile.PL>
+or equivalent.  See C<INSTALL> for details.
+
+=item C<sitearchexp>
+
+From F<sitearch.U>:
+
+This variable is the F<~name> expanded version of sitearch, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<sitebin>
+
+From F<sitebin.U>:
+
+This variable holds the name of the directory in which the user wants
+to put add-on publicly executable files for the package in question.  It
+is most often a local directory such as F</usr/local/bin>. Programs using
+this variable must be prepared to deal with F<~name> substitution.
+The standard distribution will put nothing in this directory.
+After perl has been installed, users may install their own local
+executables in this directory with
+MakeMaker F<Makefile.PL>
+or equivalent.  See C<INSTALL> for details.
+
+=item C<sitebinexp>
+
+From F<sitebin.U>:
+
+This is the same as the sitebin variable, but is filename expanded at
+configuration time, for use in your makefiles.
+
+=item C<sitehtml1dir>
+
+From F<sitehtml1dir.U>:
+
+This variable contains the name of the directory in which site-specific
+html source pages are to be put.  It is the responsibility of the
+F<Makefile.SH> to get the value of this into the proper command.
+You must be prepared to do the F<~name> expansion yourself.
+The standard distribution will put nothing in this directory.
+After perl has been installed, users may install their own local
+html pages in this directory with
+MakeMaker F<Makefile.PL>
+or equivalent.  See C<INSTALL> for details.
+
+=item C<sitehtml1direxp>
+
+From F<sitehtml1dir.U>:
+
+This variable is the same as the sitehtml1dir variable, but is filename
+expanded at configuration time, for convenient use in makefiles.
+
+=item C<sitehtml3dir>
+
+From F<sitehtml3dir.U>:
+
+This variable contains the name of the directory in which site-specific
+library html source pages are to be put.  It is the responsibility of the
+F<Makefile.SH> to get the value of this into the proper command.
+You must be prepared to do the F<~name> expansion yourself.
+The standard distribution will put nothing in this directory.
+After perl has been installed, users may install their own local
+library html pages in this directory with
+MakeMaker F<Makefile.PL>
+or equivalent.  See C<INSTALL> for details.
+
+=item C<sitehtml3direxp>
+
+From F<sitehtml3dir.U>:
+
+This variable is the same as the sitehtml3dir variable, but is filename
+expanded at configuration time, for convenient use in makefiles.
+
+=item C<sitelib>
+
+From F<sitelib.U>:
+
+This variable contains the eventual value of the C<SITELIB> symbol,
+which is the name of the private library for this package.  It may
+have a F<~> on the front. It is up to the makefile to eventually create
+this directory while performing installation (with F<~> substitution).
+The standard distribution will put nothing in this directory.
+After perl has been installed, users may install their own local
+architecture-independent modules in this directory with
+MakeMaker F<Makefile.PL>
+or equivalent.  See C<INSTALL> for details.
+
+=item C<sitelib_stem>
+
+From F<sitelib.U>:
+
+This variable is $sitelibexp with any trailing version-specific component
+removed.  The elements in inc_version_list (F<inc_version_list.U>) can
+be tacked onto this variable to generate a list of directories to search.
+
+=item C<sitelibexp>
+
+From F<sitelib.U>:
+
+This variable is the F<~name> expanded version of sitelib, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<siteman1dir>
+
+From F<siteman1dir.U>:
+
+This variable contains the name of the directory in which site-specific
+manual source pages are to be put.  It is the responsibility of the
+F<Makefile.SH> to get the value of this into the proper command.
+You must be prepared to do the F<~name> expansion yourself.
+The standard distribution will put nothing in this directory.
+After perl has been installed, users may install their own local
+man1 pages in this directory with
+MakeMaker F<Makefile.PL>
+or equivalent.  See C<INSTALL> for details.
+
+=item C<siteman1direxp>
+
+From F<siteman1dir.U>:
+
+This variable is the same as the siteman1dir variable, but is filename
+expanded at configuration time, for convenient use in makefiles.
+
+=item C<siteman3dir>
+
+From F<siteman3dir.U>:
+
+This variable contains the name of the directory in which site-specific
+library man source pages are to be put.  It is the responsibility of the
+F<Makefile.SH> to get the value of this into the proper command.
+You must be prepared to do the F<~name> expansion yourself.
+The standard distribution will put nothing in this directory.
+After perl has been installed, users may install their own local
+man3 pages in this directory with
+MakeMaker F<Makefile.PL>
+or equivalent.  See C<INSTALL> for details.
+
+=item C<siteman3direxp>
+
+From F<siteman3dir.U>:
+
+This variable is the same as the siteman3dir variable, but is filename
+expanded at configuration time, for convenient use in makefiles.
+
+=item C<siteprefix>
+
+From F<siteprefix.U>:
+
+This variable holds the full absolute path of the directory below
+which the user will install add-on packages.
+See C<INSTALL> for usage and examples.
+
+=item C<siteprefixexp>
+
+From F<siteprefix.U>:
+
+This variable holds the full absolute path of the directory below
+which the user will install add-on packages.  Derived from siteprefix.
+
+=item C<sitescript>
+
+From F<sitescript.U>:
+
+This variable holds the name of the directory in which the user wants
+to put add-on publicly executable files for the package in question.  It
+is most often a local directory such as F</usr/local/bin>. Programs using
+this variable must be prepared to deal with F<~name> substitution.
+The standard distribution will put nothing in this directory.
+After perl has been installed, users may install their own local
+scripts in this directory with
+MakeMaker F<Makefile.PL>
+or equivalent.  See C<INSTALL> for details.
+
+=item C<sitescriptexp>
+
+From F<sitescript.U>:
+
+This is the same as the sitescript variable, but is filename expanded at
+configuration time, for use in your makefiles.
+
+=item C<sizesize>
+
+From F<sizesize.U>:
+
+This variable contains the size of a sizetype in bytes.
+
+=item C<sizetype>
+
+From F<sizetype.U>:
+
+This variable defines sizetype to be something like size_t, 
+unsigned long, or whatever type is used to declare length 
+parameters for string functions.
+
+=item C<sleep>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<smail>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<so>
+
+From F<so.U>:
+
+This variable holds the extension used to identify shared libraries
+(also known as shared objects) on the system. Usually set to C<so>.
+
+=item C<sockethdr>
+
+From F<d_socket.U>:
+
+This variable has any cpp C<-I> flags needed for socket support.
+
+=item C<socketlib>
+
+From F<d_socket.U>:
+
+This variable has the names of any libraries needed for socket support.
+
+=item C<socksizetype>
+
+From F<socksizetype.U>:
+
+This variable holds the type used for the size argument
+for various socket calls like accept.  Usual values include
+socklen_t, size_t, and int.
+
+=item C<sort>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the sort program.  After Configure runs,
+the value is reset to a plain C<sort> and is not useful.
+
+=item C<spackage>
+
+From F<package.U>:
+
+This variable contains the name of the package being constructed,
+with the first letter uppercased, F<i.e>. suitable for starting
+sentences.
+
+=item C<spitshell>
+
+From F<spitshell.U>:
+
+This variable contains the command necessary to spit out a runnable
+shell on this system.  It is either cat or a grep C<-v> for # comments.
+
+=item C<sPRId64>
+
+From F<quadfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format 64-bit decimal numbers (format C<d>) for output.
+
+=item C<sPRIeldbl>
+
+From F<longdblfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format long doubles (format C<e>) for output.
+
+=item C<sPRIEUldbl>
+
+From F<longdblfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format long doubles (format C<E>) for output.
+The C<U> in the name is to separate this from sPRIeldbl so that even
+case-blind systems can see the difference.
+
+=item C<sPRIfldbl>
+
+From F<longdblfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format long doubles (format C<f>) for output.
+
+=item C<sPRIFUldbl>
+
+From F<longdblfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format long doubles (format C<F>) for output.
+The C<U> in the name is to separate this from sPRIfldbl so that even
+case-blind systems can see the difference.
+
+=item C<sPRIgldbl>
+
+From F<longdblfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format long doubles (format C<g>) for output.
+
+=item C<sPRIGUldbl>
+
+From F<longdblfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format long doubles (format C<G>) for output.
+The C<U> in the name is to separate this from sPRIgldbl so that even
+case-blind systems can see the difference.
+
+=item C<sPRIi64>
+
+From F<quadfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format 64-bit decimal numbers (format C<i>) for output.
+
+=item C<sPRIo64>
+
+From F<quadfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format 64-bit octal numbers (format C<o>) for output.
+
+=item C<sPRIu64>
+
+From F<quadfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format 64-bit unsigned decimal numbers (format C<u>) for output.
+
+=item C<sPRIx64>
+
+From F<quadfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format 64-bit hexadecimal numbers (format C<x>) for output.
+
+=item C<sPRIXU64>
+
+From F<quadfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format 64-bit hExADECimAl numbers (format C<X>) for output.
+The C<U> in the name is to separate this from sPRIx64 so that even
+case-blind systems can see the difference.
+
+=item C<srand48_r_proto>
+
+From F<d_srand48_r.U>:
+
+This variable encodes the prototype of srand48_r.
+It is zero if d_srand48_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_srand48_r
+is defined.
+
+=item C<srandom_r_proto>
+
+From F<d_srandom_r.U>:
+
+This variable encodes the prototype of srandom_r.
+It is zero if d_srandom_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_srandom_r
+is defined.
+
+=item C<src>
+
+From F<src.U>:
+
+This variable holds the path to the package source. It is up to
+the Makefile to use this variable and set C<VPATH> accordingly to
+find the sources remotely.
+
+=item C<sSCNfldbl>
+
+From F<longdblfio.U>:
+
+This variable, if defined, contains the string used by stdio to
+format long doubles (format C<f>) for input.
+
+=item C<ssizetype>
+
+From F<ssizetype.U>:
+
+This variable defines ssizetype to be something like ssize_t, 
+long or int.  It is used by functions that return a count 
+of bytes or an error condition.  It must be a signed type.
+We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+
+=item C<startperl>
+
+From F<startperl.U>:
+
+This variable contains the string to put on the front of a perl
+script to make sure (hopefully) that it runs with perl and not some
+shell. Of course, that leading line must be followed by the classical
+perl idiom:
+eval 'exec perl -S $0 ${1+C<$@>}'
+if $running_under_some_shell;
+to guarantee perl startup should the shell execute the script. Note
+that this magic incatation is not understood by csh.
+
+=item C<startsh>
+
+From F<startsh.U>:
+
+This variable contains the string to put on the front of a shell
+script to make sure (hopefully) that it runs with sh and not some
+other shell.
+
+=item C<static_ext>
+
+From F<Extensions.U>:
+
+This variable holds a list of C<XS> extension files we want to
+link statically into the package.  It is used by Makefile.
+
+=item C<stdchar>
+
+From F<stdchar.U>:
+
+This variable conditionally defines C<STDCHAR> to be the type of char
+used in F<stdio.h>.  It has the values "unsigned char" or C<char>.
+
+=item C<stdio_base>
+
+From F<d_stdstdio.U>:
+
+This variable defines how, given a C<FILE> pointer, fp, to access the
+_base field (or equivalent) of F<stdio.h>'s C<FILE> structure.  This will
+be used to define the macro FILE_base(fp).
+
+=item C<stdio_bufsiz>
+
+From F<d_stdstdio.U>:
+
+This variable defines how, given a C<FILE> pointer, fp, to determine
+the number of bytes store in the I/O buffer pointer to by the
+_base field (or equivalent) of F<stdio.h>'s C<FILE> structure.  This will
+be used to define the macro FILE_bufsiz(fp).
+
+=item C<stdio_cnt>
+
+From F<d_stdstdio.U>:
+
+This variable defines how, given a C<FILE> pointer, fp, to access the
+_cnt field (or equivalent) of F<stdio.h>'s C<FILE> structure.  This will
+be used to define the macro FILE_cnt(fp).
+
+=item C<stdio_filbuf>
+
+From F<d_stdstdio.U>:
+
+This variable defines how, given a C<FILE> pointer, fp, to tell
+stdio to refill its internal buffers (?).  This will
+be used to define the macro FILE_filbuf(fp).
+
+=item C<stdio_ptr>
+
+From F<d_stdstdio.U>:
+
+This variable defines how, given a C<FILE> pointer, fp, to access the
+_ptr field (or equivalent) of F<stdio.h>'s C<FILE> structure.  This will
+be used to define the macro FILE_ptr(fp).
+
+=item C<stdio_stream_array>
+
+From F<stdio_streams.U>:
+
+This variable tells the name of the array holding the stdio streams.
+Usual values include _iob, __iob, and __sF.
+
+=item C<strerror_r_proto>
+
+From F<d_strerror_r.U>:
+
+This variable encodes the prototype of strerror_r.
+It is zero if d_strerror_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_strerror_r
+is defined.
+
+=item C<strings>
+
+From F<i_string.U>:
+
+This variable holds the full path of the string header that will be
+used. Typically F</usr/include/string.h> or F</usr/include/strings.h>.
+
+=item C<submit>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<subversion>
+
+From F<patchlevel.U>:
+
+The subversion level of this package.
+The value of subversion comes from the F<patchlevel.h> file.
+In a version number such as 5.6.1, this is the C<1>.
+In F<patchlevel.h>, this is referred to as C<PERL_SUBVERSION>.
+This is unique to perl.
+
+=item C<sysman>
+
+From F<sysman.U>:
+
+This variable holds the place where the manual is located on this
+system. It is not the place where the user wants to put his manual
+pages. Rather it is the place where Configure may look to find manual
+for unix commands (section 1 of the manual usually). See mansrc.
+
+=back
+
+=head2 t
+
+=over 4
+
+=item C<tail>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<tar>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<targetarch>
+
+From F<Cross.U>:
+
+If cross-compiling, this variable contains the target architecture.
+If not, this will be empty.
+
+=item C<tbl>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<tee>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<test>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the test program.  After Configure runs,
+the value is reset to a plain C<test> and is not useful.
+
+=item C<timeincl>
+
+From F<i_time.U>:
+
+This variable holds the full path of the included time header(s).
+
+=item C<timetype>
+
+From F<d_time.U>:
+
+This variable holds the type returned by time(). It can be long,
+or time_t on C<BSD> sites (in which case <sys/types.h> should be
+included). Anyway, the type Time_t should be used.
+
+=item C<tmpnam_r_proto>
+
+From F<d_tmpnam_r.U>:
+
+This variable encodes the prototype of tmpnam_r.
+It is zero if d_tmpnam_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_tmpnam_r
+is defined.
+
+=item C<to>
+
+From F<Cross.U>:
+
+This variable contains the command used by Configure
+to copy to from the target host.  Useful and available
+only during Perl build.
+The string C<:> if not cross-compiling.
+
+=item C<touch>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the touch program.  After Configure runs,
+the value is reset to a plain C<touch> and is not useful.
+
+=item C<tr>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the tr program.  After Configure runs,
+the value is reset to a plain C<tr> and is not useful.
+
+=item C<trnl>
+
+From F<trnl.U>:
+
+This variable contains the value to be passed to the tr(1)
+command to transliterate a newline.  Typical values are
+C<\012> and C<\n>.  This is needed for C<EBCDIC> systems where
+newline is not necessarily C<\012>.
+
+=item C<troff>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<ttyname_r_proto>
+
+From F<d_ttyname_r.U>:
+
+This variable encodes the prototype of ttyname_r.
+It is zero if d_ttyname_r is undef, and one of the
+C<REENTRANT_PROTO_T_ABC> macros of F<reentr.h> if d_ttyname_r
+is defined.
+
+=back
+
+=head2 u
+
+=over 4
+
+=item C<u16size>
+
+From F<perlxv.U>:
+
+This variable is the size of an U16 in bytes.
+
+=item C<u16type>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's U16.
+
+=item C<u32size>
+
+From F<perlxv.U>:
+
+This variable is the size of an U32 in bytes.
+
+=item C<u32type>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's U32.
+
+=item C<u64size>
+
+From F<perlxv.U>:
+
+This variable is the size of an U64 in bytes.
+
+=item C<u64type>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's U64.
+
+=item C<u8size>
+
+From F<perlxv.U>:
+
+This variable is the size of an U8 in bytes.
+
+=item C<u8type>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's U8.
+
+=item C<uidformat>
+
+From F<uidf.U>:
+
+This variable contains the format string used for printing a Uid_t.
+
+=item C<uidsign>
+
+From F<uidsign.U>:
+
+This variable contains the signedness of a uidtype.
+1 for unsigned, -1 for signed.
+
+=item C<uidsize>
+
+From F<uidsize.U>:
+
+This variable contains the size of a uidtype in bytes.
+
+=item C<uidtype>
+
+From F<uidtype.U>:
+
+This variable defines Uid_t to be something like uid_t, int, 
+ushort, or whatever type is used to declare user ids in the kernel.
+
+=item C<uname>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the uname program.  After Configure runs,
+the value is reset to a plain C<uname> and is not useful.
+
+=item C<uniq>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the uniq program.  After Configure runs,
+the value is reset to a plain C<uniq> and is not useful.
+
+=item C<uquadtype>
+
+From F<quadtype.U>:
+
+This variable defines Uquad_t to be something like unsigned long,
+unsigned int, unsigned long long, uint64_t, or whatever type is
+used for 64-bit integers.
+
+=item C<use5005threads>
+
+From F<usethreads.U>:
+
+This variable conditionally defines the USE_5005THREADS symbol,
+and indicates that Perl should be built to use the 5.005-based
+threading implementation.
+
+=item C<use64bitall>
+
+From F<use64bits.U>:
+
+This variable conditionally defines the USE_64_BIT_ALL symbol,
+and indicates that 64-bit integer types should be used
+when available.  The maximal possible
+64-bitness is employed: LP64 or ILP64, meaning that you will
+be able to use more than 2 gigabytes of memory.  This mode is
+even more binary incompatible than USE_64_BIT_INT. You may not
+be able to run the resulting executable in a 32-bit C<CPU> at all or
+you may need at least to reboot your C<OS> to 64-bit mode.
+
+=item C<use64bitint>
+
+From F<use64bits.U>:
+
+This variable conditionally defines the USE_64_BIT_INT symbol,
+and indicates that 64-bit integer types should be used
+when available.  The minimal possible 64-bitness
+is employed, just enough to get 64-bit integers into Perl.
+This may mean using for example "long longs", while your memory
+may still be limited to 2 gigabytes.
+
+=item C<usecrosscompile>
+
+From F<Cross.U>:
+
+This variable conditionally defines the C<USE_CROSS_COMPILE> symbol,
+and indicates that Perl has been cross-compiled.
+
+=item C<usedl>
+
+From F<dlsrc.U>:
+
+This variable indicates if the system supports dynamic
+loading of some sort.  See also dlsrc and dlobj.
+
+=item C<usefaststdio>
+
+From F<usefaststdio.U>:
+
+This variable conditionally defines the C<USE_FAST_STDIO> symbol,
+and indicates that Perl should be built to use C<fast stdio>.
+Defaults to define in Perls 5.8 and earlier, to undef later.
+
+=item C<useithreads>
+
+From F<usethreads.U>:
+
+This variable conditionally defines the C<USE_ITHREADS> symbol,
+and indicates that Perl should be built to use the interpreter-based
+threading implementation.
+
+=item C<uselargefiles>
+
+From F<uselfs.U>:
+
+This variable conditionally defines the C<USE_LARGE_FILES> symbol,
+and indicates that large file interfaces should be used when
+available.
+
+=item C<uselongdouble>
+
+From F<uselongdbl.U>:
+
+This variable conditionally defines the C<USE_LONG_DOUBLE> symbol,
+and indicates that long doubles should be used when available.
+
+=item C<usemallocwrap>
+
+From F<mallocsrc.U>:
+
+This variable contains y if we are wrapping malloc to prevent
+integer overflow during size calculations.
+
+=item C<usemorebits>
+
+From F<usemorebits.U>:
+
+This variable conditionally defines the C<USE_MORE_BITS> symbol,
+and indicates that explicit 64-bit interfaces and long doubles
+should be used when available.
+
+=item C<usemultiplicity>
+
+From F<usemultiplicity.U>:
+
+This variable conditionally defines the C<MULTIPLICITY> symbol,
+and indicates that Perl should be built to use multiplicity.
+
+=item C<usemymalloc>
+
+From F<mallocsrc.U>:
+
+This variable contains y if the malloc that comes with this package
+is desired over the system's version of malloc.  People often include
+special versions of malloc for effiency, but such versions are often
+less portable.  See also mallocsrc and mallocobj.
+If this is C<y>, then -lmalloc is removed from $libs.
+
+=item C<usenm>
+
+From F<usenm.U>:
+
+This variable contains C<true> or C<false> depending whether the
+nm extraction is wanted or not.
+
+=item C<useopcode>
+
+From F<Extensions.U>:
+
+This variable holds either C<true> or C<false> to indicate
+whether the Opcode extension should be used.  The sole
+use for this currently is to allow an easy mechanism
+for users to skip the Opcode extension from the Configure
+command line.
+
+=item C<useperlio>
+
+From F<useperlio.U>:
+
+This variable conditionally defines the C<USE_PERLIO> symbol,
+and indicates that the PerlIO abstraction should be
+used throughout.
+
+=item C<useposix>
+
+From F<Extensions.U>:
+
+This variable holds either C<true> or C<false> to indicate
+whether the C<POSIX> extension should be used.  The sole
+use for this currently is to allow an easy mechanism
+for hints files to indicate that C<POSIX> will not compile
+on a particular system.
+
+=item C<usereentrant>
+
+From F<usethreads.U>:
+
+This variable conditionally defines the C<USE_REENTRANT_API> symbol,
+which indicates that the thread code may try to use the various
+_r versions of library functions.  This is only potentially
+meaningful if usethreads is set and is very experimental, it is
+not even prompted for.
+
+=item C<usesfio>
+
+From F<d_sfio.U>:
+
+This variable is set to true when the user agrees to use sfio.
+It is set to false when sfio is not available or when the user
+explicitely requests not to use sfio.  It is here primarily so
+that command-line settings can override the auto-detection of
+d_sfio without running into a "WHOA THERE".
+
+=item C<useshrplib>
+
+From F<libperl.U>:
+
+This variable is set to C<true> if the user wishes
+to build a shared libperl, and C<false> otherwise.
+
+=item C<usesocks>
+
+From F<usesocks.U>:
+
+This variable conditionally defines the C<USE_SOCKS> symbol,
+and indicates that Perl should be built to use C<SOCKS>.
+
+=item C<usethreads>
+
+From F<usethreads.U>:
+
+This variable conditionally defines the C<USE_THREADS> symbol,
+and indicates that Perl should be built to use threads.
+
+=item C<usevendorprefix>
+
+From F<vendorprefix.U>:
+
+This variable tells whether the vendorprefix
+and consequently other vendor* paths are in use.
+
+=item C<usevfork>
+
+From F<d_vfork.U>:
+
+This variable is set to true when the user accepts to use vfork.
+It is set to false when no vfork is available or when the user
+explicitely requests not to use vfork.
+
+=item C<usrinc>
+
+From F<usrinc.U>:
+
+This variable holds the path of the include files, which is
+usually F</usr/include>. It is mainly used by other Configure units.
+
+=item C<uuname>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<uvoformat>
+
+From F<perlxvf.U>:
+
+This variable contains the format string used for printing
+a Perl C<UV> as an unsigned octal integer. 
+
+=item C<uvsize>
+
+From F<perlxv.U>:
+
+This variable is the size of a C<UV> in bytes.
+
+=item C<uvtype>
+
+From F<perlxv.U>:
+
+This variable contains the C type used for Perl's C<UV>.
+
+=item C<uvuformat>
+
+From F<perlxvf.U>:
+
+This variable contains the format string used for printing
+a Perl C<UV> as an unsigned decimal integer. 
+
+=item C<uvxformat>
+
+From F<perlxvf.U>:
+
+This variable contains the format string used for printing
+a Perl C<UV> as an unsigned hexadecimal integer in lowercase abcdef.
+
+=item C<uvXUformat>
+
+From F<perlxvf.U>:
+
+This variable contains the format string used for printing
+a Perl C<UV> as an unsigned hexadecimal integer in uppercase C<ABCDEF>.
+
+=back
+
+=head2 v
+
+=over 4
+
+=item C<vendorarch>
+
+From F<vendorarch.U>:
+
+This variable contains the value of the C<PERL_VENDORARCH> symbol.
+It may have a F<~> on the front. 
+The standard distribution will put nothing in this directory.
+Vendors who distribute perl may wish to place their own
+architecture-dependent modules and extensions in this directory with
+MakeMaker F<Makefile.PL> C<INSTALLDIRS>=vendor 
+or equivalent.  See C<INSTALL> for details.
+
+=item C<vendorarchexp>
+
+From F<vendorarch.U>:
+
+This variable is the F<~name> expanded version of vendorarch, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<vendorbin>
+
+From F<vendorbin.U>:
+
+This variable contains the eventual value of the C<VENDORBIN> symbol.
+It may have a F<~> on the front.
+The standard distribution will put nothing in this directory.
+Vendors who distribute perl may wish to place additional
+binaries in this directory with
+MakeMaker F<Makefile.PL> C<INSTALLDIRS>=vendor 
+or equivalent.  See C<INSTALL> for details.
+
+=item C<vendorbinexp>
+
+From F<vendorbin.U>:
+
+This variable is the F<~name> expanded version of vendorbin, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<vendorhtml1dir>
+
+From F<vendorhtml1dir.U>:
+
+This variable contains the name of the directory for html 
+pages.  It may have a F<~> on the front.
+The standard distribution will put nothing in this directory.
+Vendors who distribute perl may wish to place their own
+html pages in this directory with
+MakeMaker F<Makefile.PL> C<INSTALLDIRS>=vendor 
+or equivalent.  See C<INSTALL> for details.
+
+=item C<vendorhtml1direxp>
+
+From F<vendorhtml1dir.U>:
+
+This variable is the F<~name> expanded version of vendorhtml1dir, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<vendorhtml3dir>
+
+From F<vendorhtml3dir.U>:
+
+This variable contains the name of the directory for html 
+library pages.  It may have a F<~> on the front.
+The standard distribution will put nothing in this directory.
+Vendors who distribute perl may wish to place their own
+html pages for modules and extensions in this directory with
+MakeMaker F<Makefile.PL> C<INSTALLDIRS>=vendor 
+or equivalent.  See C<INSTALL> for details.
+
+=item C<vendorhtml3direxp>
+
+From F<vendorhtml3dir.U>:
+
+This variable is the F<~name> expanded version of vendorhtml3dir, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<vendorlib>
+
+From F<vendorlib.U>:
+
+This variable contains the eventual value of the C<VENDORLIB> symbol,
+which is the name of the private library for this package.
+The standard distribution will put nothing in this directory.
+Vendors who distribute perl may wish to place their own
+modules in this directory with
+MakeMaker F<Makefile.PL> C<INSTALLDIRS>=vendor 
+or equivalent.  See C<INSTALL> for details.
+
+=item C<vendorlib_stem>
+
+From F<vendorlib.U>:
+
+This variable is $vendorlibexp with any trailing version-specific component
+removed.  The elements in inc_version_list (F<inc_version_list.U>) can
+be tacked onto this variable to generate a list of directories to search.
+
+=item C<vendorlibexp>
+
+From F<vendorlib.U>:
+
+This variable is the F<~name> expanded version of vendorlib, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<vendorman1dir>
+
+From F<vendorman1dir.U>:
+
+This variable contains the name of the directory for man1 
+pages.  It may have a F<~> on the front.
+The standard distribution will put nothing in this directory.
+Vendors who distribute perl may wish to place their own
+man1 pages in this directory with
+MakeMaker F<Makefile.PL> C<INSTALLDIRS>=vendor 
+or equivalent.  See C<INSTALL> for details.
+
+=item C<vendorman1direxp>
+
+From F<vendorman1dir.U>:
+
+This variable is the F<~name> expanded version of vendorman1dir, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<vendorman3dir>
+
+From F<vendorman3dir.U>:
+
+This variable contains the name of the directory for man3 
+pages.  It may have a F<~> on the front.
+The standard distribution will put nothing in this directory.
+Vendors who distribute perl may wish to place their own
+man3 pages in this directory with
+MakeMaker F<Makefile.PL> C<INSTALLDIRS>=vendor 
+or equivalent.  See C<INSTALL> for details.
+
+=item C<vendorman3direxp>
+
+From F<vendorman3dir.U>:
+
+This variable is the F<~name> expanded version of vendorman3dir, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<vendorprefix>
+
+From F<vendorprefix.U>:
+
+This variable holds the full absolute path of the directory below
+which the vendor will install add-on packages.
+See C<INSTALL> for usage and examples.
+
+=item C<vendorprefixexp>
+
+From F<vendorprefix.U>:
+
+This variable holds the full absolute path of the directory below
+which the vendor will install add-on packages.  Derived from vendorprefix.
+
+=item C<vendorscript>
+
+From F<vendorscript.U>:
+
+This variable contains the eventual value of the C<VENDORSCRIPT> symbol.
+It may have a F<~> on the front.
+The standard distribution will put nothing in this directory.
+Vendors who distribute perl may wish to place additional
+executable scripts in this directory with
+MakeMaker F<Makefile.PL> C<INSTALLDIRS>=vendor 
+or equivalent.  See C<INSTALL> for details.
+
+=item C<vendorscriptexp>
+
+From F<vendorscript.U>:
+
+This variable is the F<~name> expanded version of vendorscript, so that you
+may use it directly in Makefiles or shell scripts.
+
+=item C<version>
+
+From F<patchlevel.U>:
+
+The full version number of this package, such as 5.6.1 (or 5_6_1).
+This combines revision, patchlevel, and subversion to get the
+full version number, including any possible subversions.
+This is suitable for use as a directory name, and hence is
+filesystem dependent.
+
+=item C<version_patchlevel_string>
+
+From F<patchlevel.U>:
+
+This is a string combining version, subversion and
+perl_patchlevel (if perl_patchlevel is non-zero).  
+It is typically something like 
+'version 7 subversion 1'  or
+'version 7 subversion 1 patchlevel 11224'
+It is computed here to avoid duplication of code in F<myconfig.SH>
+and F<lib/Config.pm>. 
+
+=item C<versiononly>
+
+From F<versiononly.U>:
+
+If set, this symbol indicates that only the version-specific
+components of a perl installation should be installed.
+This may be useful for making a test installation of a new
+version without disturbing the existing installation.
+Setting versiononly is equivalent to setting installperl's -v option.
+In particular, the non-versioned scripts and programs such as
+a2p, c2ph, h2xs, pod2*, and perldoc are not installed
+(see C<INSTALL> for a more complete list).  Nor are the man
+pages installed.
+Usually, this is undef.
+
+=item C<vi>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<voidflags>
+
+From F<voidflags.U>:
+
+This variable contains the eventual value of the C<VOIDFLAGS> symbol,
+which indicates how much support of the void type is given by this
+compiler.  See C<VOIDFLAGS> for more info.
+
+=back
+
+=head2 x
+
+=over 4
+
+=item C<xlibpth>
+
+From F<libpth.U>:
+
+This variable holds extra path (space-separated) used to find
+libraries on this platform, for example C<CPU>-specific libraries
+(on multi-C<CPU> platforms) may be listed here.
+
+=back
+
+=head2 y
+
+=over 4
+
+=item C<yacc>
+
+From F<yacc.U>:
+
+This variable holds the name of the compiler compiler we
+want to use in the Makefile. It can be yacc, byacc, or bison -y.
+
+=item C<yaccflags>
+
+From F<yacc.U>:
+
+This variable contains any additional yacc flags desired by the
+user.  It is up to the Makefile to use this.
+
+=back
+
+=head2 z
+
+=over 4
+
+=item C<zcat>
+
+From F<Loc.U>:
+
+This variable is defined but not used by Configure.
+The value is a plain '' and is not useful.
+
+=item C<zip>
+
+From F<Loc.U>:
+
+This variable is used internally by Configure to determine the
+full pathname (if any) of the zip program.  After Configure runs,
+the value is reset to a plain C<zip> and is not useful.
+
+
+=back
+
+=head1 NOTE
+
+This module contains a good example of how to use tie to implement a
+cache and an example of how to make a tied variable readonly to those
+outside of it.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Config_heavy.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Config_heavy.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Config_heavy.pl	(revision 14489)
@@ -0,0 +1,1185 @@
+# This file was created by configpm when Perl was built. Any changes
+# made to this file will be lost the next time perl is built.
+
+package Config;
+use strict;
+# use warnings; Pulls in Carp
+# use vars pulls in Carp
+### Configured by: shaoqun@kohekohe.cs.waikato.ac.nz
+### Target system: WIN32 
+
+our $summary = <<'!END!';
+Summary of my $package (revision $revision $version_patchlevel_string) configuration:
+  Platform:
+    osname=$osname, osvers=$osvers, archname=$archname
+    uname='$myuname'
+    config_args='$config_args'
+    hint=$hint, useposix=$useposix, d_sigaction=$d_sigaction
+    usethreads=$usethreads use5005threads=$use5005threads useithreads=$useithreads usemultiplicity=$usemultiplicity
+    useperlio=$useperlio d_sfio=$d_sfio uselargefiles=$uselargefiles usesocks=$usesocks
+    use64bitint=$use64bitint use64bitall=$use64bitall uselongdouble=$uselongdouble
+    usemymalloc=$usemymalloc, bincompat5005=undef
+  Compiler:
+    cc='$cc', ccflags ='$ccflags',
+    optimize='$optimize',
+    cppflags='$cppflags'
+    ccversion='$ccversion', gccversion='$gccversion', gccosandvers='$gccosandvers'
+    intsize=$intsize, longsize=$longsize, ptrsize=$ptrsize, doublesize=$doublesize, byteorder=$byteorder
+    d_longlong=$d_longlong, longlongsize=$longlongsize, d_longdbl=$d_longdbl, longdblsize=$longdblsize
+    ivtype='$ivtype', ivsize=$ivsize, nvtype='$nvtype', nvsize=$nvsize, Off_t='$lseektype', lseeksize=$lseeksize
+    alignbytes=$alignbytes, prototype=$prototype
+  Linker and Libraries:
+    ld='$ld', ldflags ='$ldflags'
+    libpth=$libpth
+    libs=$libs
+    perllibs=$perllibs
+    libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl
+    gnulibc_version='$gnulibc_version'
+  Dynamic Linking:
+    dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags'
+    cccdlflags='$cccdlflags', lddlflags='$lddlflags'
+
+!END!
+my $summary_expanded;
+
+sub myconfig {
+    return $summary_expanded if $summary_expanded;
+    ($summary_expanded = $summary) =~ s{\$(\w+)}
+		 { my $c = $Config::Config{$1}; defined($c) ? $c : 'undef' }ge;
+    $summary_expanded;
+}
+
+local *_ = \my $a;
+$_ = <<'!END!';
+Author=''
+CONFIG='true'
+Date='$Date'
+Header=''
+Id='$Id'
+Locker=''
+Log='$Log'
+Mcc='Mcc'
+PATCHLEVEL='8'
+PERL_API_REVISION='5'
+PERL_API_SUBVERSION='0'
+PERL_API_VERSION='8'
+PERL_CONFIG_SH='true'
+PERL_PATCHLEVEL='8'
+PERL_REVISION='5'
+PERL_SUBVERSION='8'
+PERL_VERSION='8'
+RCSfile='$RCSfile'
+Revision='$Revision'
+SUBVERSION='8'
+Source=''
+State=''
+_a='.lib'
+_exe='.exe'
+_o='.obj'
+afs='false'
+afsroot='/afs'
+alignbytes='8'
+ansi2knr=''
+aphostname=''
+api_revision='5'
+api_subversion='0'
+api_version='8'
+api_versionstring='5.8.0'
+ar='lib'
+archlib='c:\shaoqunWu\perl\lib'
+archlibexp='c:\shaoqunWu\perl\lib'
+archname64=''
+archname='MSWin32-x86-multi-thread'
+archobjs=''
+asctime_r_proto='0'
+awk='awk'
+baserev='5'
+bash=''
+bin='c:\shaoqunWu\perl\bin'
+binexp='c:\shaoqunWu\perl\bin'
+bison=''
+byacc='byacc'
+byteorder='1234'
+c=''
+castflags='0'
+cat='type'
+cc='cl'
+cccdlflags=' '
+ccdlflags=' '
+ccflags='-nologo -Gf -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT  -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX'
+ccflags_uselargefiles=''
+ccname='cl'
+ccsymbols=''
+ccversion='12.00.8804'
+cf_by='shaoqun'
+cf_email='shaoqun@kohekohe.cs.waikato.ac.nz'
+cf_time='Wed Aug  2 11:33:07 2006'
+charsize='1'
+chgrp=''
+chmod=''
+chown=''
+clocktype='clock_t'
+comm=''
+compress=''
+contains='grep'
+cp='copy'
+cpio=''
+cpp='cl -nologo -E'
+cpp_stuff='42'
+cppccsymbols=''
+cppflags='-DWIN32'
+cpplast=''
+cppminus=''
+cpprun='cl -nologo -E'
+cppstdin='cppstdin'
+cppsymbols=''
+crypt_r_proto='0'
+cryptlib=''
+csh='undef'
+ctermid_r_proto='0'
+ctime_r_proto='0'
+d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+d_PRIEUldbl='undef'
+d_PRIFUldbl='undef'
+d_PRIGUldbl='undef'
+d_PRIXU64='undef'
+d_PRId64='undef'
+d_PRIeldbl='undef'
+d_PRIfldbl='undef'
+d_PRIgldbl='undef'
+d_PRIi64='undef'
+d_PRIo64='undef'
+d_PRIu64='undef'
+d_PRIx64='undef'
+d_SCNfldbl='undef'
+d__fwalk='undef'
+d_access='define'
+d_accessx='undef'
+d_aintl='undef'
+d_alarm='define'
+d_archlib='define'
+d_asctime_r='undef'
+d_atolf='undef'
+d_atoll='undef'
+d_attribute_format='undef'
+d_attribute_malloc='undef'
+d_attribute_nonnull='undef'
+d_attribute_noreturn='undef'
+d_attribute_pure='undef'
+d_attribute_unused='undef'
+d_attribute_warn_unused_result='undef'
+d_bcmp='undef'
+d_bcopy='undef'
+d_bsd='define'
+d_bsdgetpgrp='undef'
+d_bsdsetpgrp='undef'
+d_bzero='undef'
+d_casti32='undef'
+d_castneg='define'
+d_charvspr='undef'
+d_chown='undef'
+d_chroot='undef'
+d_chsize='define'
+d_class='undef'
+d_clearenv='undef'
+d_closedir='define'
+d_cmsghdr_s='undef'
+d_const='define'
+d_copysignl='undef'
+d_crypt='define'
+d_crypt_r='undef'
+d_csh='undef'
+d_ctermid_r='undef'
+d_ctime_r='undef'
+d_cuserid='undef'
+d_dbl_dig='define'
+d_dbminitproto='undef'
+d_difftime='define'
+d_dirfd='undef'
+d_dirnamlen='define'
+d_dlerror='define'
+d_dlopen='define'
+d_dlsymun='undef'
+d_dosuid='undef'
+d_drand48_r='undef'
+d_drand48proto='undef'
+d_dup2='define'
+d_eaccess='undef'
+d_endgrent='undef'
+d_endgrent_r='undef'
+d_endhent='undef'
+d_endhostent_r='undef'
+d_endnent='undef'
+d_endnetent_r='undef'
+d_endpent='undef'
+d_endprotoent_r='undef'
+d_endpwent='undef'
+d_endpwent_r='undef'
+d_endsent='undef'
+d_endservent_r='undef'
+d_eofnblk='define'
+d_eunice='undef'
+d_faststdio='define'
+d_fchdir='undef'
+d_fchmod='undef'
+d_fchown='undef'
+d_fcntl='undef'
+d_fcntl_can_lock='undef'
+d_fd_macros='define'
+d_fd_set='define'
+d_fds_bits='define'
+d_fgetpos='define'
+d_finite='undef'
+d_finitel='undef'
+d_flexfnam='define'
+d_flock='define'
+d_flockproto='define'
+d_fork='undef'
+d_fp_class='undef'
+d_fpathconf='undef'
+d_fpclass='undef'
+d_fpclassify='undef'
+d_fpclassl='undef'
+d_fpos64_t='undef'
+d_frexpl='undef'
+d_fs_data_s='undef'
+d_fseeko='undef'
+d_fsetpos='define'
+d_fstatfs='undef'
+d_fstatvfs='undef'
+d_fsync='undef'
+d_ftello='undef'
+d_ftime='define'
+d_futimes='undef'
+d_getcwd='define'
+d_getespwnam='undef'
+d_getfsstat='undef'
+d_getgrent='undef'
+d_getgrent_r='undef'
+d_getgrgid_r='undef'
+d_getgrnam_r='undef'
+d_getgrps='undef'
+d_gethbyaddr='define'
+d_gethbyname='define'
+d_gethent='undef'
+d_gethname='define'
+d_gethostbyaddr_r='undef'
+d_gethostbyname_r='undef'
+d_gethostent_r='undef'
+d_gethostprotos='define'
+d_getitimer='undef'
+d_getlogin='define'
+d_getlogin_r='undef'
+d_getmnt='undef'
+d_getmntent='undef'
+d_getnbyaddr='undef'
+d_getnbyname='undef'
+d_getnent='undef'
+d_getnetbyaddr_r='undef'
+d_getnetbyname_r='undef'
+d_getnetent_r='undef'
+d_getnetprotos='undef'
+d_getpagsz='undef'
+d_getpbyname='define'
+d_getpbynumber='define'
+d_getpent='undef'
+d_getpgid='undef'
+d_getpgrp2='undef'
+d_getpgrp='undef'
+d_getppid='undef'
+d_getprior='undef'
+d_getprotobyname_r='undef'
+d_getprotobynumber_r='undef'
+d_getprotoent_r='undef'
+d_getprotoprotos='define'
+d_getprpwnam='undef'
+d_getpwent='undef'
+d_getpwent_r='undef'
+d_getpwnam_r='undef'
+d_getpwuid_r='undef'
+d_getsbyname='define'
+d_getsbyport='define'
+d_getsent='undef'
+d_getservbyname_r='undef'
+d_getservbyport_r='undef'
+d_getservent_r='undef'
+d_getservprotos='define'
+d_getspnam='undef'
+d_getspnam_r='undef'
+d_gettimeod='define'
+d_gmtime_r='undef'
+d_gnulibc='undef'
+d_grpasswd='undef'
+d_hasmntopt='undef'
+d_htonl='define'
+d_ilogbl='undef'
+d_index='undef'
+d_inetaton='undef'
+d_int64_t='undef'
+d_isascii='define'
+d_isfinite='undef'
+d_isinf='undef'
+d_isnan='define'
+d_isnanl='undef'
+d_killpg='undef'
+d_lchown='undef'
+d_ldbl_dig='define'
+d_libm_lib_version='undef'
+d_link='define'
+d_localtime_r='undef'
+d_locconv='define'
+d_lockf='undef'
+d_longdbl='define'
+d_longlong='undef'
+d_lseekproto='define'
+d_lstat='undef'
+d_madvise='undef'
+d_malloc_good_size='undef'
+d_malloc_size='undef'
+d_mblen='define'
+d_mbstowcs='define'
+d_mbtowc='define'
+d_memchr='define'
+d_memcmp='define'
+d_memcpy='define'
+d_memmove='define'
+d_memset='define'
+d_mkdir='define'
+d_mkdtemp='undef'
+d_mkfifo='undef'
+d_mkstemp='undef'
+d_mkstemps='undef'
+d_mktime='define'
+d_mmap='undef'
+d_modfl='undef'
+d_modfl_pow32_bug='undef'
+d_modflproto='undef'
+d_mprotect='undef'
+d_msg='undef'
+d_msg_ctrunc='undef'
+d_msg_dontroute='undef'
+d_msg_oob='undef'
+d_msg_peek='undef'
+d_msg_proxy='undef'
+d_msgctl='undef'
+d_msgget='undef'
+d_msghdr_s='undef'
+d_msgrcv='undef'
+d_msgsnd='undef'
+d_msync='undef'
+d_munmap='undef'
+d_mymalloc='undef'
+d_nice='undef'
+d_nl_langinfo='undef'
+d_nv_preserves_uv='define'
+d_nv_zero_is_allbits_zero='define'
+d_off64_t='undef'
+d_old_pthread_create_joinable='undef'
+d_oldpthreads='undef'
+d_oldsock='undef'
+d_open3='undef'
+d_pathconf='undef'
+d_pause='define'
+d_perl_otherlibdirs='undef'
+d_phostname='undef'
+d_pipe='define'
+d_poll='undef'
+d_portable='define'
+d_procselfexe='undef'
+d_pthread_atfork='undef'
+d_pthread_attr_setscope='undef'
+d_pthread_yield='undef'
+d_pwage='undef'
+d_pwchange='undef'
+d_pwclass='undef'
+d_pwcomment='undef'
+d_pwexpire='undef'
+d_pwgecos='undef'
+d_pwpasswd='undef'
+d_pwquota='undef'
+d_qgcvt='undef'
+d_quad='undef'
+d_random_r='undef'
+d_readdir64_r='undef'
+d_readdir='define'
+d_readdir_r='undef'
+d_readlink='undef'
+d_readv='undef'
+d_recvmsg='undef'
+d_rename='define'
+d_rewinddir='define'
+d_rmdir='define'
+d_safebcpy='undef'
+d_safemcpy='undef'
+d_sanemcmp='define'
+d_sbrkproto='undef'
+d_scalbnl='undef'
+d_sched_yield='undef'
+d_scm_rights='undef'
+d_seekdir='define'
+d_select='define'
+d_sem='undef'
+d_semctl='undef'
+d_semctl_semid_ds='undef'
+d_semctl_semun='undef'
+d_semget='undef'
+d_semop='undef'
+d_sendmsg='undef'
+d_setegid='undef'
+d_seteuid='undef'
+d_setgrent='undef'
+d_setgrent_r='undef'
+d_setgrps='undef'
+d_sethent='undef'
+d_sethostent_r='undef'
+d_setitimer='undef'
+d_setlinebuf='undef'
+d_setlocale='define'
+d_setlocale_r='undef'
+d_setnent='undef'
+d_setnetent_r='undef'
+d_setpent='undef'
+d_setpgid='undef'
+d_setpgrp2='undef'
+d_setpgrp='undef'
+d_setprior='undef'
+d_setproctitle='undef'
+d_setprotoent_r='undef'
+d_setpwent='undef'
+d_setpwent_r='undef'
+d_setregid='undef'
+d_setresgid='undef'
+d_setresuid='undef'
+d_setreuid='undef'
+d_setrgid='undef'
+d_setruid='undef'
+d_setsent='undef'
+d_setservent_r='undef'
+d_setsid='undef'
+d_setvbuf='define'
+d_sfio='undef'
+d_shm='undef'
+d_shmat='undef'
+d_shmatprototype='undef'
+d_shmctl='undef'
+d_shmdt='undef'
+d_shmget='undef'
+d_sigaction='undef'
+d_sigprocmask='undef'
+d_sigsetjmp='undef'
+d_sockatmark='undef'
+d_sockatmarkproto='undef'
+d_socket='define'
+d_socklen_t='undef'
+d_sockpair='undef'
+d_socks5_init='undef'
+d_sprintf_returns_strlen='define'
+d_sqrtl='undef'
+d_srand48_r='undef'
+d_srandom_r='undef'
+d_sresgproto='undef'
+d_sresuproto='undef'
+d_statblks='undef'
+d_statfs_f_flags='undef'
+d_statfs_s='undef'
+d_statvfs='undef'
+d_stdio_cnt_lval='define'
+d_stdio_ptr_lval='define'
+d_stdio_ptr_lval_nochange_cnt='define'
+d_stdio_ptr_lval_sets_cnt='undef'
+d_stdio_stream_array='undef'
+d_stdiobase='define'
+d_stdstdio='define'
+d_strchr='define'
+d_strcoll='define'
+d_strctcpy='define'
+d_strerrm='strerror(e)'
+d_strerror='define'
+d_strerror_r='undef'
+d_strftime='define'
+d_strlcat='undef'
+d_strlcpy='undef'
+d_strtod='define'
+d_strtol='define'
+d_strtold='undef'
+d_strtoll='undef'
+d_strtoq='undef'
+d_strtoul='define'
+d_strtoull='undef'
+d_strtouq='undef'
+d_strxfrm='define'
+d_suidsafe='undef'
+d_symlink='undef'
+d_syscall='undef'
+d_syscallproto='undef'
+d_sysconf='undef'
+d_sysernlst=''
+d_syserrlst='define'
+d_system='define'
+d_tcgetpgrp='undef'
+d_tcsetpgrp='undef'
+d_telldir='define'
+d_telldirproto='define'
+d_time='define'
+d_times='define'
+d_tm_tm_gmtoff='undef'
+d_tm_tm_zone='undef'
+d_tmpnam_r='undef'
+d_truncate='undef'
+d_ttyname_r='undef'
+d_tzname='define'
+d_u32align='define'
+d_ualarm='undef'
+d_umask='define'
+d_uname='define'
+d_union_semun='define'
+d_unordered='undef'
+d_unsetenv='undef'
+d_usleep='undef'
+d_usleepproto='undef'
+d_ustat='undef'
+d_vendorarch='undef'
+d_vendorbin='undef'
+d_vendorlib='undef'
+d_vendorscript='undef'
+d_vfork='undef'
+d_void_closedir='undef'
+d_voidsig='define'
+d_voidtty=''
+d_volatile='define'
+d_vprintf='define'
+d_wait4='undef'
+d_waitpid='define'
+d_wcstombs='define'
+d_wctomb='define'
+d_writev='undef'
+d_xenix='undef'
+date='date'
+db_hashtype='int'
+db_prefixtype='int'
+db_version_major='0'
+db_version_minor='0'
+db_version_patch='0'
+defvoidused='15'
+direntrytype='struct direct'
+dlext='dll'
+dlsrc='dl_win32.xs'
+doublesize='8'
+drand01='(rand()/(double)((unsigned)1<<RANDBITS))'
+drand48_r_proto='0'
+dynamic_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call IO List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
+eagain='EAGAIN'
+ebcdic='undef'
+echo='echo'
+egrep='egrep'
+emacs=''
+endgrent_r_proto='0'
+endhostent_r_proto='0'
+endnetent_r_proto='0'
+endprotoent_r_proto='0'
+endpwent_r_proto='0'
+endservent_r_proto='0'
+eunicefix=':'
+exe_ext='.exe'
+expr='expr'
+extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Errno Fcntl File/Glob Filter/Util/Call IO List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
+extras=''
+fflushNULL='define'
+fflushall='undef'
+find='find'
+firstmakefile='makefile'
+flex=''
+fpossize='8'
+fpostype='fpos_t'
+freetype='void'
+from=':'
+full_ar=''
+full_csh=''
+full_sed=''
+gccansipedantic=''
+gccosandvers=''
+gccversion=''
+getgrent_r_proto='0'
+getgrgid_r_proto='0'
+getgrnam_r_proto='0'
+gethostbyaddr_r_proto='0'
+gethostbyname_r_proto='0'
+gethostent_r_proto='0'
+getlogin_r_proto='0'
+getnetbyaddr_r_proto='0'
+getnetbyname_r_proto='0'
+getnetent_r_proto='0'
+getprotobyname_r_proto='0'
+getprotobynumber_r_proto='0'
+getprotoent_r_proto='0'
+getpwent_r_proto='0'
+getpwnam_r_proto='0'
+getpwuid_r_proto='0'
+getservbyname_r_proto='0'
+getservbyport_r_proto='0'
+getservent_r_proto='0'
+getspnam_r_proto='0'
+gidformat='"ld"'
+gidsign='-1'
+gidsize='4'
+gidtype='gid_t'
+glibpth='/usr/shlib  /lib/pa1.1 /usr/lib/large /lib /usr/lib /usr/lib/386 /lib/386 /lib/large /usr/lib/small /lib/small /usr/ccs/lib /usr/ucblib /usr/shlib '
+gmake='gmake'
+gmtime_r_proto='0'
+gnulibc_version=''
+grep='grep'
+groupcat=''
+groupstype='gid_t'
+gzip='gzip'
+h_fcntl='false'
+h_sysfile='true'
+hint='recommended'
+hostcat='ypcat hosts'
+html1dir=' '
+html1direxp=''
+html3dir=' '
+html3direxp=''
+i16size='2'
+i16type='short'
+i32size='4'
+i32type='long'
+i64size='8'
+i64type='__int64'
+i8size='1'
+i8type='char'
+i_arpainet='define'
+i_bsdioctl=''
+i_crypt='undef'
+i_db='undef'
+i_dbm='undef'
+i_dirent='define'
+i_dld='undef'
+i_dlfcn='define'
+i_fcntl='define'
+i_float='define'
+i_fp='undef'
+i_fp_class='undef'
+i_gdbm='undef'
+i_grp='undef'
+i_ieeefp='undef'
+i_inttypes='undef'
+i_langinfo='undef'
+i_libutil='undef'
+i_limits='define'
+i_locale='define'
+i_machcthr='undef'
+i_malloc='define'
+i_math='define'
+i_memory='undef'
+i_mntent='undef'
+i_ndbm='undef'
+i_netdb='undef'
+i_neterrno='undef'
+i_netinettcp='undef'
+i_niin='undef'
+i_poll='undef'
+i_prot='undef'
+i_pthread='undef'
+i_pwd='undef'
+i_rpcsvcdbm='define'
+i_sfio='undef'
+i_sgtty='undef'
+i_shadow='undef'
+i_socks='undef'
+i_stdarg='define'
+i_stddef='define'
+i_stdlib='define'
+i_string='define'
+i_sunmath='undef'
+i_sysaccess='undef'
+i_sysdir='undef'
+i_sysfile='undef'
+i_sysfilio='define'
+i_sysin='undef'
+i_sysioctl='undef'
+i_syslog='undef'
+i_sysmman='undef'
+i_sysmode='undef'
+i_sysmount='undef'
+i_sysndir='undef'
+i_sysparam='undef'
+i_sysresrc='undef'
+i_syssecrt='undef'
+i_sysselct='undef'
+i_syssockio='undef'
+i_sysstat='define'
+i_sysstatfs='undef'
+i_sysstatvfs='undef'
+i_systime='undef'
+i_systimek='undef'
+i_systimes='undef'
+i_systypes='define'
+i_sysuio='undef'
+i_sysun='undef'
+i_sysutsname='undef'
+i_sysvfs='undef'
+i_syswait='undef'
+i_termio='undef'
+i_termios='undef'
+i_time='define'
+i_unistd='undef'
+i_ustat='undef'
+i_utime='define'
+i_values='undef'
+i_varargs='undef'
+i_varhdr='varargs.h'
+i_vfork='undef'
+ignore_versioned_solibs=''
+inc_version_list=''
+inc_version_list_init='0'
+incpath='C:\PROGRA~1\MICROS~3\VC98\include'
+inews=''
+installarchlib='c:\shaoqunWu\perl\lib'
+installbin='c:\shaoqunWu\perl\bin'
+installhtml1dir=''
+installhtml3dir=''
+installhtmldir='c:\shaoqunWu\perl\html'
+installhtmlhelpdir='c:\shaoqunWu\perl\htmlhelp'
+installman1dir='c:\shaoqunWu\perl\man\man1'
+installman3dir='c:\shaoqunWu\perl\man\man3'
+installprefix='c:\shaoqunWu\perl'
+installprefixexp='c:\shaoqunWu\perl'
+installprivlib='c:\shaoqunWu\perl\lib'
+installscript='c:\shaoqunWu\perl\bin'
+installsitearch='c:\shaoqunWu\perl\site\lib'
+installsitebin='c:\shaoqunWu\perl\bin'
+installsitehtml1dir=''
+installsitehtml3dir=''
+installsitelib='c:\shaoqunWu\perl\site\lib'
+installsiteman1dir=''
+installsiteman3dir=''
+installsitescript=''
+installstyle='lib'
+installusrbinperl='undef'
+installvendorarch=''
+installvendorbin=''
+installvendorhtml1dir=''
+installvendorhtml3dir=''
+installvendorlib=''
+installvendorman1dir=''
+installvendorman3dir=''
+installvendorscript=''
+intsize='4'
+issymlink=''
+ivdformat='"ld"'
+ivsize='4'
+ivtype='long'
+known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
+ksh=''
+ld='link'
+lddlflags='-dll -nologo -nodefaultlib -debug -opt:ref,icf  -libpath:"c:\shaoqunWu\perl\lib\CORE"  -machine:x86'
+ldflags='-nologo -nodefaultlib -debug -opt:ref,icf  -libpath:"c:\shaoqunWu\perl\lib\CORE"  -machine:x86'
+ldflags_uselargefiles=''
+ldlibpthname=''
+less='less'
+lib_ext='.lib'
+libc='msvcrt.lib'
+libperl='perl58.lib'
+libpth='C:\PROGRA~1\MICROS~3\VC98\lib'
+libs='  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib'
+libsdirs=''
+libsfiles=''
+libsfound=''
+libspath=''
+libswanted='net socket inet nsl nm ndbm gdbm dbm db malloc dl dld ld sun m c cposix posix ndir dir crypt ucb bsd BSD PW x'
+libswanted_uselargefiles='net socket inet nsl nm ndbm gdbm dbm db malloc dl dld ld sun m c cposix posix ndir dir crypt ucb bsd BSD PW x'
+line='line'
+lint=''
+lkflags=''
+ln=''
+lns='copy'
+localtime_r_proto='0'
+locincpth='/usr/local/include /opt/local/include /usr/gnu/include /opt/gnu/include /usr/GNU/include /opt/GNU/include'
+loclibpth='/usr/local/lib /opt/local/lib /usr/gnu/lib /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib'
+longdblsize='10'
+longlongsize='8'
+longsize='4'
+lp=''
+lpr=''
+ls='dir'
+lseeksize='8'
+lseektype='__int64'
+mail=''
+mailx=''
+make='nmake'
+make_set_make='#'
+mallocobj='malloc.o'
+mallocsrc='malloc.c'
+malloctype='void *'
+man1dir='c:\shaoqunWu\perl\man\man1'
+man1direxp='c:\shaoqunWu\perl\man\man1'
+man1ext='1'
+man3dir='c:\shaoqunWu\perl\man\man3'
+man3direxp='c:\shaoqunWu\perl\man\man3'
+man3ext='3'
+mips_type=''
+mistrustnm=''
+mkdir='mkdir'
+mmaptype='void *'
+modetype='mode_t'
+more='more /e'
+multiarch='undef'
+mv=''
+myarchname='MSWin32'
+mydomain=''
+myhostname=''
+myuname=''
+n='-n'
+need_va_copy='undef'
+netdb_hlen_type='int'
+netdb_host_type='char *'
+netdb_name_type='char *'
+netdb_net_type='long'
+nm=''
+nm_opt=''
+nm_so_opt=''
+nonxs_ext='Errno'
+nroff=''
+nvEUformat='"E"'
+nvFUformat='"F"'
+nvGUformat='"G"'
+nv_preserves_uv_bits='32'
+nveformat='"e"'
+nvfformat='"f"'
+nvgformat='"g"'
+nvsize='8'
+nvtype='double'
+o_nonblock='O_NONBLOCK'
+obj_ext='.obj'
+old_pthread_create_joinable=''
+optimize='-MD -Zi -DNDEBUG -O1'
+orderlib='false'
+osname='MSWin32'
+osvers='5.1'
+otherlibdirs=''
+package='perl5'
+pager='more /e'
+passcat=''
+patchlevel=''
+path_sep=';'
+perl5=''
+perl='perl'
+perl_patchlevel=''
+perladmin=''
+perllibs='  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib'
+perlpath='c:\shaoqunWu\perl\bin\perl.exe'
+pg=''
+phostname='hostname'
+pidtype='int'
+plibpth=''
+pmake=''
+pr=''
+prefix='c:\shaoqunWu\perl'
+prefixexp='c:\shaoqunWu\perl'
+privlib='c:\shaoqunWu\perl\lib'
+privlibexp='c:\shaoqunWu\perl\lib'
+procselfexe=''
+prototype='define'
+ptrsize='4'
+quadkind='5'
+quadtype='__int64'
+randbits='15'
+randfunc='rand'
+random_r_proto='0'
+randseedtype='unsigned'
+ranlib='rem'
+rd_nodata='-1'
+readdir64_r_proto='0'
+readdir_r_proto='0'
+revision='5'
+rm='del'
+rmail=''
+run=''
+runnm='true'
+sPRIEUldbl='"E"'
+sPRIFUldbl='"F"'
+sPRIGUldbl='"G"'
+sPRIXU64='"lX"'
+sPRId64='"ld"'
+sPRIeldbl='"e"'
+sPRIfldbl='"f"'
+sPRIgldbl='"g"'
+sPRIi64='"li"'
+sPRIo64='"lo"'
+sPRIu64='"lu"'
+sPRIx64='"lx"'
+sSCNfldbl='"f"'
+sched_yield=''
+scriptdir='c:\shaoqunWu\perl\bin'
+scriptdirexp='c:\shaoqunWu\perl\bin'
+sed='sed'
+seedfunc='srand'
+selectminbits='32'
+selecttype='Perl_fd_set *'
+sendmail='blat'
+setgrent_r_proto='0'
+sethostent_r_proto='0'
+setlocale_r_proto='0'
+setnetent_r_proto='0'
+setprotoent_r_proto='0'
+setpwent_r_proto='0'
+setservent_r_proto='0'
+sh='cmd /x /c'
+shar=''
+sharpbang='#!'
+shmattype='void *'
+shortsize='2'
+shrpenv=''
+shsharp='true'
+sig_count='26'
+sig_name='ZERO HUP INT QUIT ILL NUM05 NUM06 NUM07 FPE KILL NUM10 SEGV NUM12 PIPE ALRM TERM NUM16 NUM17 NUM18 NUM19 CHLD BREAK ABRT STOP NUM24 CONT CLD'
+sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "NUM05", "NUM06", "NUM07", "FPE", "KILL", "NUM10", "SEGV", "NUM12", "PIPE", "ALRM", "TERM", "NUM16", "NUM17", "NUM18", "NUM19", "CHLD", "BREAK", "ABRT", "STOP", "NUM24", "CONT", "CLD", 0'
+sig_num='0 1 2 21 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 20'
+sig_num_init='0, 1, 2, 21, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 20, 0'
+sig_size='27'
+signal_t='void'
+sitearch='c:\shaoqunWu\perl\site\lib'
+sitearchexp='c:\shaoqunWu\perl\site\lib'
+sitebin='c:\shaoqunWu\perl\site\bin'
+sitebinexp='c:\shaoqunWu\perl\site\bin'
+sitehtml1dir=''
+sitehtml1direxp=''
+sitehtml3dir=''
+sitehtml3direxp=''
+sitelib='c:\shaoqunWu\perl\site\lib'
+sitelib_stem=''
+sitelibexp='c:\shaoqunWu\perl\site\lib'
+siteman1dir=''
+siteman1direxp=''
+siteman3dir=''
+siteman3direxp=''
+siteprefix='c:\shaoqunWu\perl\site'
+siteprefixexp='c:\shaoqunWu\perl\site'
+sitescript=''
+sitescriptexp=''
+sizesize='4'
+sizetype='size_t'
+sleep=''
+smail=''
+so='dll'
+sockethdr=''
+socketlib=''
+socksizetype='int'
+sort='sort'
+spackage='Perl5'
+spitshell=''
+srand48_r_proto='0'
+srandom_r_proto='0'
+src=''
+ssizetype='int'
+startperl='#!perl'
+startsh='#!/bin/sh'
+static_ext=' '
+stdchar='char'
+stdio_base='((fp)->_base)'
+stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)'
+stdio_cnt='((fp)->_cnt)'
+stdio_filbuf=''
+stdio_ptr='((fp)->_ptr)'
+stdio_stream_array=''
+strerror_r_proto='0'
+strings='/usr/include/string.h'
+submit=''
+subversion=''
+sysman='/usr/man/man1'
+tail=''
+tar=''
+targetarch=''
+tbl=''
+tee=''
+test=''
+timeincl='/usr/include/sys/time.h '
+timetype='time_t'
+tmpnam_r_proto='0'
+to=':'
+touch='touch'
+tr=''
+trnl='\012'
+troff=''
+ttyname_r_proto='0'
+u16size='2'
+u16type='unsigned short'
+u32size='4'
+u32type='unsigned long'
+u64size='8'
+u64type='unsigned __int64'
+u8size='1'
+u8type='unsigned char'
+uidformat='"ld"'
+uidsign='-1'
+uidsize='4'
+uidtype='uid_t'
+uname='uname'
+uniq='uniq'
+uquadtype='unsigned __int64'
+use5005threads='undef'
+use64bitall='undef'
+use64bitint='undef'
+usecrosscompile='undef'
+usedl='define'
+usefaststdio='define'
+useithreads='define'
+uselargefiles='define'
+uselongdouble='undef'
+usemallocwrap='define'
+usemorebits='undef'
+usemultiplicity='define'
+usemymalloc='n'
+usenm='false'
+useopcode='true'
+useperlio='define'
+useposix='true'
+usereentrant='undef'
+userelocatableinc='undef'
+usesfio='false'
+useshrplib='yes'
+usesitecustomize='define'
+usesocks='undef'
+usethreads='define'
+usevendorprefix='undef'
+usevfork='false'
+usrinc='/usr/include'
+uuname=''
+uvXUformat='"lX"'
+uvoformat='"lo"'
+uvsize='4'
+uvtype='unsigned long'
+uvuformat='"lu"'
+uvxformat='"lx"'
+vendorarch=''
+vendorarchexp=''
+vendorbin=''
+vendorbinexp=''
+vendorhtml1dir=' '
+vendorhtml1direxp=''
+vendorhtml3dir=' '
+vendorhtml3direxp=''
+vendorlib=''
+vendorlib_stem=''
+vendorlibexp=''
+vendorman1dir=' '
+vendorman1direxp=''
+vendorman3dir=' '
+vendorman3direxp=''
+vendorprefix=''
+vendorprefixexp=''
+vendorscript=''
+vendorscriptexp=''
+version='5.8.8'
+version_patchlevel_string='version 8 subversion 8'
+versiononly='undef'
+vi=''
+voidflags='15'
+xlibpth='/usr/lib/386 /lib/386'
+yacc='yacc'
+yaccflags=''
+zcat=''
+zip='zip'
+!END!
+
+my $i = 0;
+foreach my $c (4,3,2) { $i |= ord($c); $i <<= 8 }
+$i |= ord(1);
+our $byteorder = join('', unpack('aaaa', pack('L!', $i)));
+s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
+
+my $config_sh_len = length $_;
+
+our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL';
+ccflags_nolargefiles='-nologo -Gf -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT  -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX'
+ldflags_nolargefiles='-nologo -nodefaultlib -debug -opt:ref,icf  -libpath:"c:\shaoqunWu\perl\lib\CORE"  -machine:x86'
+libs_nolargefiles=''
+libswanted_nolargefiles=''
+EOVIRTUAL
+
+# Search for it in the big string
+sub fetch_string {
+    my($self, $key) = @_;
+
+    # We only have ' delimted.
+    my $start = index($Config_SH_expanded, "\n$key=\'");
+    # Start can never be -1 now, as we've rigged the long string we're
+    # searching with an initial dummy newline.
+    return undef if $start == -1;
+
+    $start += length($key) + 3;
+
+    my $value = substr($Config_SH_expanded, $start,
+                       index($Config_SH_expanded, "'\n", $start)
+		       - $start);
+    # So we can say "if $Config{'foo'}".
+    $value = undef if $value eq 'undef';
+    $self->{$key} = $value; # cache it
+}
+
+my $prevpos = 0;
+
+sub FIRSTKEY {
+    $prevpos = 0;
+    substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 );
+}
+
+sub NEXTKEY {
+    my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2;
+    my $len = index($Config_SH_expanded, "=", $pos) - $pos;
+    $prevpos = $pos;
+    $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef;
+}
+
+sub EXISTS {
+    return 1 if exists($_[0]->{$_[1]});
+
+    return(index($Config_SH_expanded, "\n$_[1]='") != -1
+          );
+}
+
+sub STORE  { die "\%Config::Config is read-only\n" }
+*DELETE = \&STORE;
+*CLEAR  = \&STORE;
+
+
+sub config_sh {
+    substr $Config_SH_expanded, 1, $config_sh_len;
+}
+
+sub config_re {
+    my $re = shift;
+    return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/,
+    $Config_SH_expanded;
+}
+
+sub config_vars {
+    # implements -V:cfgvar option (see perlrun -V:)
+    foreach (@_) {
+	# find optional leading, trailing colons; and query-spec
+	my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/;	# flags fore and aft, 
+	# map colon-flags to print decorations
+	my $prfx = $notag ? '': "$qry=";		# tag-prefix for print
+	my $lnend = $lncont ? ' ' : ";\n";		# line ending for print
+
+	# all config-vars are by definition \w only, any \W means regex
+	if ($qry =~ /\W/) {
+	    my @matches = config_re($qry);
+	    print map "$_$lnend", @matches ? @matches : "$qry: not found"		if !$notag;
+	    print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found"	if  $notag;
+	} else {
+	    my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
+						   : 'UNKNOWN';
+	    $v = 'undef' unless defined $v;
+	    print "${prfx}'${v}'$lnend";
+	}
+    }
+}
+
+# Called by the real AUTOLOAD
+sub launcher {
+    undef &AUTOLOAD;
+    goto \&$Config::AUTOLOAD;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Cwd.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Cwd.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Cwd.pm	(revision 14489)
@@ -0,0 +1,710 @@
+package Cwd;
+
+=head1 NAME
+
+Cwd - get pathname of current working directory
+
+=head1 SYNOPSIS
+
+    use Cwd;
+    my $dir = getcwd;
+
+    use Cwd 'abs_path';
+    my $abs_path = abs_path($file);
+
+=head1 DESCRIPTION
+
+This module provides functions for determining the pathname of the
+current working directory.  It is recommended that getcwd (or another
+*cwd() function) be used in I<all> code to ensure portability.
+
+By default, it exports the functions cwd(), getcwd(), fastcwd(), and
+fastgetcwd() (and, on Win32, getdcwd()) into the caller's namespace.  
+
+
+=head2 getcwd and friends
+
+Each of these functions are called without arguments and return the
+absolute path of the current working directory.
+
+=over 4
+
+=item getcwd
+
+    my $cwd = getcwd();
+
+Returns the current working directory.
+
+Re-implements the getcwd(3) (or getwd(3)) functions in Perl.
+
+=item cwd
+
+    my $cwd = cwd();
+
+The cwd() is the most natural form for the current architecture. For
+most systems it is identical to `pwd` (but without the trailing line
+terminator).
+
+=item fastcwd
+
+    my $cwd = fastcwd();
+
+A more dangerous version of getcwd(), but potentially faster.
+
+It might conceivably chdir() you out of a directory that it can't
+chdir() you back into.  If fastcwd encounters a problem it will return
+undef but will probably leave you in a different directory.  For a
+measure of extra security, if everything appears to have worked, the
+fastcwd() function will check that it leaves you in the same directory
+that it started in. If it has changed it will C<die> with the message
+"Unstable directory path, current directory changed
+unexpectedly". That should never happen.
+
+=item fastgetcwd
+
+  my $cwd = fastgetcwd();
+
+The fastgetcwd() function is provided as a synonym for cwd().
+
+=item getdcwd
+
+    my $cwd = getdcwd();
+    my $cwd = getdcwd('C:');
+
+The getdcwd() function is also provided on Win32 to get the current working
+directory on the specified drive, since Windows maintains a separate current
+working directory for each drive.  If no drive is specified then the current
+drive is assumed.
+
+This function simply calls the Microsoft C library _getdcwd() function.
+
+=back
+
+
+=head2 abs_path and friends
+
+These functions are exported only on request.  They each take a single
+argument and return the absolute pathname for it.  If no argument is
+given they'll use the current working directory.
+
+=over 4
+
+=item abs_path
+
+  my $abs_path = abs_path($file);
+
+Uses the same algorithm as getcwd().  Symbolic links and relative-path
+components ("." and "..") are resolved to return the canonical
+pathname, just like realpath(3).
+
+=item realpath
+
+  my $abs_path = realpath($file);
+
+A synonym for abs_path().
+
+=item fast_abs_path
+
+  my $abs_path = fast_abs_path($file);
+
+A more dangerous, but potentially faster version of abs_path.
+
+=back
+
+=head2 $ENV{PWD}
+
+If you ask to override your chdir() built-in function, 
+
+  use Cwd qw(chdir);
+
+then your PWD environment variable will be kept up to date.  Note that
+it will only be kept up to date if all packages which use chdir import
+it from Cwd.
+
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+Since the path seperators are different on some operating systems ('/'
+on Unix, ':' on MacPerl, etc...) we recommend you use the File::Spec
+modules wherever portability is a concern.
+
+=item *
+
+Actually, on Mac OS, the C<getcwd()>, C<fastgetcwd()> and C<fastcwd()>
+functions  are all aliases for the C<cwd()> function, which, on Mac OS,
+calls `pwd`. Likewise, the C<abs_path()> function is an alias for
+C<fast_abs_path()>.
+
+=back
+
+=head1 AUTHOR
+
+Originally by the perl5-porters.
+
+Maintained by Ken Williams <KWILLIAMS@cpan.org>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters.  All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Portions of the C code in this library are copyright (c) 1994 by the
+Regents of the University of California.  All rights reserved.  The
+license on this code is compatible with the licensing of the rest of
+the distribution - please see the source code in F<Cwd.xs> for the
+details.
+
+=head1 SEE ALSO
+
+L<File::chdir>
+
+=cut
+
+use strict;
+use Exporter;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+
+$VERSION = '3.12';
+
+@ISA = qw/ Exporter /;
+@EXPORT = qw(cwd getcwd fastcwd fastgetcwd);
+push @EXPORT, qw(getdcwd) if $^O eq 'MSWin32';
+@EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath);
+
+# sys_cwd may keep the builtin command
+
+# All the functionality of this module may provided by builtins,
+# there is no sense to process the rest of the file.
+# The best choice may be to have this in BEGIN, but how to return from BEGIN?
+
+if ($^O eq 'os2') {
+    local $^W = 0;
+
+    *cwd                = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
+    *getcwd             = \&cwd;
+    *fastgetcwd         = \&cwd;
+    *fastcwd            = \&cwd;
+
+    *fast_abs_path      = \&sys_abspath if defined &sys_abspath;
+    *abs_path           = \&fast_abs_path;
+    *realpath           = \&fast_abs_path;
+    *fast_realpath      = \&fast_abs_path;
+
+    return 1;
+}
+
+# If loading the XS stuff doesn't work, we can fall back to pure perl
+eval {
+  if ( $] >= 5.006 ) {
+    require XSLoader;
+    XSLoader::load( __PACKAGE__, $VERSION );
+  } else {
+    require DynaLoader;
+    push @ISA, 'DynaLoader';
+    __PACKAGE__->bootstrap( $VERSION );
+  }
+};
+
+# Must be after the DynaLoader stuff:
+$VERSION = eval $VERSION;
+
+# Big nasty table of function aliases
+my %METHOD_MAP =
+  (
+   VMS =>
+   {
+    cwd			=> '_vms_cwd',
+    getcwd		=> '_vms_cwd',
+    fastcwd		=> '_vms_cwd',
+    fastgetcwd		=> '_vms_cwd',
+    abs_path		=> '_vms_abs_path',
+    fast_abs_path	=> '_vms_abs_path',
+   },
+
+   MSWin32 =>
+   {
+    # We assume that &_NT_cwd is defined as an XSUB or in the core.
+    cwd			=> '_NT_cwd',
+    getcwd		=> '_NT_cwd',
+    fastcwd		=> '_NT_cwd',
+    fastgetcwd		=> '_NT_cwd',
+    abs_path		=> 'fast_abs_path',
+    realpath		=> 'fast_abs_path',
+   },
+
+   dos => 
+   {
+    cwd			=> '_dos_cwd',
+    getcwd		=> '_dos_cwd',
+    fastgetcwd		=> '_dos_cwd',
+    fastcwd		=> '_dos_cwd',
+    abs_path		=> 'fast_abs_path',
+   },
+
+   qnx =>
+   {
+    cwd			=> '_qnx_cwd',
+    getcwd		=> '_qnx_cwd',
+    fastgetcwd		=> '_qnx_cwd',
+    fastcwd		=> '_qnx_cwd',
+    abs_path		=> '_qnx_abs_path',
+    fast_abs_path	=> '_qnx_abs_path',
+   },
+
+   cygwin =>
+   {
+    getcwd		=> 'cwd',
+    fastgetcwd		=> 'cwd',
+    fastcwd		=> 'cwd',
+    abs_path		=> 'fast_abs_path',
+    realpath		=> 'fast_abs_path',
+   },
+
+   epoc =>
+   {
+    cwd			=> '_epoc_cwd',
+    getcwd	        => '_epoc_cwd',
+    fastgetcwd		=> '_epoc_cwd',
+    fastcwd		=> '_epoc_cwd',
+    abs_path		=> 'fast_abs_path',
+   },
+
+   MacOS =>
+   {
+    getcwd		=> 'cwd',
+    fastgetcwd		=> 'cwd',
+    fastcwd		=> 'cwd',
+    abs_path		=> 'fast_abs_path',
+   },
+  );
+
+$METHOD_MAP{NT} = $METHOD_MAP{MSWin32};
+$METHOD_MAP{nto} = $METHOD_MAP{qnx};
+
+
+# Find the pwd command in the expected locations.  We assume these
+# are safe.  This prevents _backtick_pwd() consulting $ENV{PATH}
+# so everything works under taint mode.
+my $pwd_cmd;
+foreach my $try ('/bin/pwd',
+		 '/usr/bin/pwd',
+		 '/QOpenSys/bin/pwd', # OS/400 PASE.
+		) {
+
+    if( -x $try ) {
+        $pwd_cmd = $try;
+        last;
+    }
+}
+unless ($pwd_cmd) {
+    # Isn't this wrong?  _backtick_pwd() will fail if somenone has
+    # pwd in their path but it is not /bin/pwd or /usr/bin/pwd?
+    # See [perl #16774]. --jhi
+    $pwd_cmd = 'pwd';
+}
+
+# Lazy-load Carp
+sub _carp  { require Carp; Carp::carp(@_)  }
+sub _croak { require Carp; Carp::croak(@_) }
+
+# The 'natural and safe form' for UNIX (pwd may be setuid root)
+sub _backtick_pwd {
+    # Localize %ENV entries in a way that won't create new hash keys
+    my @localize = grep exists $ENV{$_}, qw(PATH IFS CDPATH ENV BASH_ENV);
+    local @ENV{@localize};
+    
+    my $cwd = `$pwd_cmd`;
+    # Belt-and-suspenders in case someone said "undef $/".
+    local $/ = "\n";
+    # `pwd` may fail e.g. if the disk is full
+    chomp($cwd) if defined $cwd;
+    $cwd;
+}
+
+# Since some ports may predefine cwd internally (e.g., NT)
+# we take care not to override an existing definition for cwd().
+
+unless ($METHOD_MAP{$^O}{cwd} or defined &cwd) {
+    # The pwd command is not available in some chroot(2)'ed environments
+    my $sep = $Config::Config{path_sep} || ':';
+    my $os = $^O;  # Protect $^O from tainting
+    if( $os eq 'MacOS' || (defined $ENV{PATH} &&
+			   $os ne 'MSWin32' &&  # no pwd on Windows
+			   grep { -x "$_/pwd" } split($sep, $ENV{PATH})) )
+    {
+	*cwd = \&_backtick_pwd;
+    }
+    else {
+	*cwd = \&getcwd;
+    }
+}
+
+# set a reasonable (and very safe) default for fastgetcwd, in case it
+# isn't redefined later (20001212 rspier)
+*fastgetcwd = \&cwd;
+
+# By Brandon S. Allbery
+#
+# Usage: $cwd = getcwd();
+
+sub getcwd
+{
+    abs_path('.');
+}
+
+
+# By John Bazik
+#
+# Usage: $cwd = &fastcwd;
+#
+# This is a faster version of getcwd.  It's also more dangerous because
+# you might chdir out of a directory that you can't chdir back into.
+    
+sub fastcwd_ {
+    my($odev, $oino, $cdev, $cino, $tdev, $tino);
+    my(@path, $path);
+    local(*DIR);
+
+    my($orig_cdev, $orig_cino) = stat('.');
+    ($cdev, $cino) = ($orig_cdev, $orig_cino);
+    for (;;) {
+	my $direntry;
+	($odev, $oino) = ($cdev, $cino);
+	CORE::chdir('..') || return undef;
+	($cdev, $cino) = stat('.');
+	last if $odev == $cdev && $oino == $cino;
+	opendir(DIR, '.') || return undef;
+	for (;;) {
+	    $direntry = readdir(DIR);
+	    last unless defined $direntry;
+	    next if $direntry eq '.';
+	    next if $direntry eq '..';
+
+	    ($tdev, $tino) = lstat($direntry);
+	    last unless $tdev != $odev || $tino != $oino;
+	}
+	closedir(DIR);
+	return undef unless defined $direntry; # should never happen
+	unshift(@path, $direntry);
+    }
+    $path = '/' . join('/', @path);
+    if ($^O eq 'apollo') { $path = "/".$path; }
+    # At this point $path may be tainted (if tainting) and chdir would fail.
+    # Untaint it then check that we landed where we started.
+    $path =~ /^(.*)\z/s		# untaint
+	&& CORE::chdir($1) or return undef;
+    ($cdev, $cino) = stat('.');
+    die "Unstable directory path, current directory changed unexpectedly"
+	if $cdev != $orig_cdev || $cino != $orig_cino;
+    $path;
+}
+if (not defined &fastcwd) { *fastcwd = \&fastcwd_ }
+
+
+# Keeps track of current working directory in PWD environment var
+# Usage:
+#	use Cwd 'chdir';
+#	chdir $newdir;
+
+my $chdir_init = 0;
+
+sub chdir_init {
+    if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') {
+	my($dd,$di) = stat('.');
+	my($pd,$pi) = stat($ENV{'PWD'});
+	if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
+	    $ENV{'PWD'} = cwd();
+	}
+    }
+    else {
+	my $wd = cwd();
+	$wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32';
+	$ENV{'PWD'} = $wd;
+    }
+    # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar)
+    if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {
+	my($pd,$pi) = stat($2);
+	my($dd,$di) = stat($1);
+	if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
+	    $ENV{'PWD'}="$2$3";
+	}
+    }
+    $chdir_init = 1;
+}
+
+sub chdir {
+    my $newdir = @_ ? shift : '';	# allow for no arg (chdir to HOME dir)
+    $newdir =~ s|///*|/|g unless $^O eq 'MSWin32';
+    chdir_init() unless $chdir_init;
+    my $newpwd;
+    if ($^O eq 'MSWin32') {
+	# get the full path name *before* the chdir()
+	$newpwd = Win32::GetFullPathName($newdir);
+    }
+
+    return 0 unless CORE::chdir $newdir;
+
+    if ($^O eq 'VMS') {
+	return $ENV{'PWD'} = $ENV{'DEFAULT'}
+    }
+    elsif ($^O eq 'MacOS') {
+	return $ENV{'PWD'} = cwd();
+    }
+    elsif ($^O eq 'MSWin32') {
+	$ENV{'PWD'} = $newpwd;
+	return 1;
+    }
+
+    if ($newdir =~ m#^/#s) {
+	$ENV{'PWD'} = $newdir;
+    } else {
+	my @curdir = split(m#/#,$ENV{'PWD'});
+	@curdir = ('') unless @curdir;
+	my $component;
+	foreach $component (split(m#/#, $newdir)) {
+	    next if $component eq '.';
+	    pop(@curdir),next if $component eq '..';
+	    push(@curdir,$component);
+	}
+	$ENV{'PWD'} = join('/',@curdir) || '/';
+    }
+    1;
+}
+
+
+sub _perl_abs_path
+{
+    my $start = @_ ? shift : '.';
+    my($dotdots, $cwd, @pst, @cst, $dir, @tst);
+
+    unless (@cst = stat( $start ))
+    {
+	_carp("stat($start): $!");
+	return '';
+    }
+
+    unless (-d _) {
+        # Make sure we can be invoked on plain files, not just directories.
+        # NOTE that this routine assumes that '/' is the only directory separator.
+	
+        my ($dir, $file) = $start =~ m{^(.*)/(.+)$}
+	    or return cwd() . '/' . $start;
+	
+	# Can't use "-l _" here, because the previous stat was a stat(), not an lstat().
+	if (-l $start) {
+	    my $link_target = readlink($start);
+	    die "Can't resolve link $start: $!" unless defined $link_target;
+	    
+	    require File::Spec;
+            $link_target = $dir . '/' . $link_target
+                unless File::Spec->file_name_is_absolute($link_target);
+	    
+	    return abs_path($link_target);
+	}
+	
+	return $dir ? abs_path($dir) . "/$file" : "/$file";
+    }
+
+    $cwd = '';
+    $dotdots = $start;
+    do
+    {
+	$dotdots .= '/..';
+	@pst = @cst;
+	local *PARENT;
+	unless (opendir(PARENT, $dotdots))
+	{
+	    _carp("opendir($dotdots): $!");
+	    return '';
+	}
+	unless (@cst = stat($dotdots))
+	{
+	    _carp("stat($dotdots): $!");
+	    closedir(PARENT);
+	    return '';
+	}
+	if ($pst[0] == $cst[0] && $pst[1] == $cst[1])
+	{
+	    $dir = undef;
+	}
+	else
+	{
+	    do
+	    {
+		unless (defined ($dir = readdir(PARENT)))
+	        {
+		    _carp("readdir($dotdots): $!");
+		    closedir(PARENT);
+		    return '';
+		}
+		$tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir"))
+	    }
+	    while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] ||
+		   $tst[1] != $pst[1]);
+	}
+	$cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ;
+	closedir(PARENT);
+    } while (defined $dir);
+    chop($cwd) unless $cwd eq '/'; # drop the trailing /
+    $cwd;
+}
+
+
+my $Curdir;
+sub fast_abs_path {
+    local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage
+    my $cwd = getcwd();
+    require File::Spec;
+    my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir);
+
+    # Detaint else we'll explode in taint mode.  This is safe because
+    # we're not doing anything dangerous with it.
+    ($path) = $path =~ /(.*)/;
+    ($cwd)  = $cwd  =~ /(.*)/;
+
+    unless (-e $path) {
+ 	_croak("$path: No such file or directory");
+    }
+
+    unless (-d _) {
+        # Make sure we can be invoked on plain files, not just directories.
+	
+	my ($vol, $dir, $file) = File::Spec->splitpath($path);
+	return File::Spec->catfile($cwd, $path) unless length $dir;
+
+	if (-l $path) {
+	    my $link_target = readlink($path);
+	    die "Can't resolve link $path: $!" unless defined $link_target;
+	    
+	    $link_target = File::Spec->catpath($vol, $dir, $link_target)
+                unless File::Spec->file_name_is_absolute($link_target);
+	    
+	    return fast_abs_path($link_target);
+	}
+	
+	return $dir eq File::Spec->rootdir
+	  ? File::Spec->catpath($vol, $dir, $file)
+	  : fast_abs_path(File::Spec->catpath($vol, $dir, '')) . '/' . $file;
+    }
+
+    if (!CORE::chdir($path)) {
+ 	_croak("Cannot chdir to $path: $!");
+    }
+    my $realpath = getcwd();
+    if (! ((-d $cwd) && (CORE::chdir($cwd)))) {
+ 	_croak("Cannot chdir back to $cwd: $!");
+    }
+    $realpath;
+}
+
+# added function alias to follow principle of least surprise
+# based on previous aliasing.  --tchrist 27-Jan-00
+*fast_realpath = \&fast_abs_path;
+
+
+# --- PORTING SECTION ---
+
+# VMS: $ENV{'DEFAULT'} points to default directory at all times
+# 06-Mar-1996  Charles Bailey  bailey@newman.upenn.edu
+# Note: Use of Cwd::chdir() causes the logical name PWD to be defined
+#   in the process logical name table as the default device and directory
+#   seen by Perl. This may not be the same as the default device
+#   and directory seen by DCL after Perl exits, since the effects
+#   the CRTL chdir() function persist only until Perl exits.
+
+sub _vms_cwd {
+    return $ENV{'DEFAULT'};
+}
+
+sub _vms_abs_path {
+    return $ENV{'DEFAULT'} unless @_;
+
+    # may need to turn foo.dir into [.foo]
+    my $path = VMS::Filespec::pathify($_[0]);
+    $path = $_[0] unless defined $path;
+
+    return VMS::Filespec::rmsexpand($path);
+}
+
+sub _os2_cwd {
+    $ENV{'PWD'} = `cmd /c cd`;
+    chomp $ENV{'PWD'};
+    $ENV{'PWD'} =~ s:\\:/:g ;
+    return $ENV{'PWD'};
+}
+
+sub _win32_cwd {
+    $ENV{'PWD'} = Win32::GetCwd();
+    $ENV{'PWD'} =~ s:\\:/:g ;
+    return $ENV{'PWD'};
+}
+
+*_NT_cwd = defined &Win32::GetCwd ? \&_win32_cwd : \&_os2_cwd;
+
+sub _dos_cwd {
+    if (!defined &Dos::GetCwd) {
+        $ENV{'PWD'} = `command /c cd`;
+        chomp $ENV{'PWD'};
+        $ENV{'PWD'} =~ s:\\:/:g ;
+    } else {
+        $ENV{'PWD'} = Dos::GetCwd();
+    }
+    return $ENV{'PWD'};
+}
+
+sub _qnx_cwd {
+	local $ENV{PATH} = '';
+	local $ENV{CDPATH} = '';
+	local $ENV{ENV} = '';
+    $ENV{'PWD'} = `/usr/bin/fullpath -t`;
+    chomp $ENV{'PWD'};
+    return $ENV{'PWD'};
+}
+
+sub _qnx_abs_path {
+	local $ENV{PATH} = '';
+	local $ENV{CDPATH} = '';
+	local $ENV{ENV} = '';
+    my $path = @_ ? shift : '.';
+    local *REALPATH;
+
+    defined( open(REALPATH, '-|') || exec '/usr/bin/fullpath', '-t', $path ) or
+      die "Can't open /usr/bin/fullpath: $!";
+    my $realpath = <REALPATH>;
+    close REALPATH;
+    chomp $realpath;
+    return $realpath;
+}
+
+sub _epoc_cwd {
+    $ENV{'PWD'} = EPOC::getcwd();
+    return $ENV{'PWD'};
+}
+
+
+# Now that all the base-level functions are set up, alias the
+# user-level functions to the right places
+
+if (exists $METHOD_MAP{$^O}) {
+  my $map = $METHOD_MAP{$^O};
+  foreach my $name (keys %$map) {
+    local $^W = 0;  # assignments trigger 'subroutine redefined' warning
+    no strict 'refs';
+    *{$name} = \&{$map->{$name}};
+  }
+}
+
+# In case the XS version doesn't load.
+*abs_path = \&_perl_abs_path unless defined &abs_path;
+
+# added function alias for those of us more
+# used to the libc function.  --tchrist 27-Jan-00
+*realpath = \&abs_path;
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/DB.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/DB.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/DB.pm	(revision 14489)
@@ -0,0 +1,810 @@
+#
+# Documentation is at the __END__
+#
+
+package DB;
+
+# "private" globals
+
+my ($running, $ready, $deep, $usrctxt, $evalarg, 
+    @stack, @saved, @skippkg, @clients);
+my $preeval = {};
+my $posteval = {};
+my $ineval = {};
+
+####
+#
+# Globals - must be defined at startup so that clients can refer to 
+# them right after a C<require DB;>
+#
+####
+
+BEGIN {
+
+  # these are hardcoded in perl source (some are magical)
+
+  $DB::sub = '';        # name of current subroutine
+  %DB::sub = ();        # "filename:fromline-toline" for every known sub
+  $DB::single = 0;      # single-step flag (set it to 1 to enable stops in BEGIN/use)
+  $DB::signal = 0;      # signal flag (will cause a stop at the next line)
+  $DB::trace = 0;       # are we tracing through subroutine calls?
+  @DB::args = ();       # arguments of current subroutine or @ARGV array
+  @DB::dbline = ();     # list of lines in currently loaded file
+  %DB::dbline = ();     # actions in current file (keyed by line number)
+  @DB::ret = ();        # return value of last sub executed in list context
+  $DB::ret = '';        # return value of last sub executed in scalar context
+
+  # other "public" globals  
+
+  $DB::package = '';    # current package space
+  $DB::filename = '';   # current filename
+  $DB::subname = '';    # currently executing sub (fullly qualified name)
+  $DB::lineno = '';     # current line number
+
+  $DB::VERSION = $DB::VERSION = '1.01';
+
+  # initialize private globals to avoid warnings
+
+  $running = 1;         # are we running, or are we stopped?
+  @stack = (0);
+  @clients = ();
+  $deep = 100;
+  $ready = 0;
+  @saved = ();
+  @skippkg = ();
+  $usrctxt = '';
+  $evalarg = '';
+}
+
+####
+# entry point for all subroutine calls
+#
+sub sub {
+  push(@stack, $DB::single);
+  $DB::single &= 1;
+  $DB::single |= 4 if $#stack == $deep;
+  if ($DB::sub eq 'DESTROY' or substr($DB::sub, -9) eq '::DESTROY' or not defined wantarray) {
+    &$DB::sub;
+    $DB::single |= pop(@stack);
+    $DB::ret = undef;
+  }
+  elsif (wantarray) {
+    @DB::ret = &$DB::sub;
+    $DB::single |= pop(@stack);
+    @DB::ret;
+  }
+  else {
+    $DB::ret = &$DB::sub;
+    $DB::single |= pop(@stack);
+    $DB::ret;
+  }
+}
+
+####
+# this is called by perl for every statement
+#
+sub DB {
+  return unless $ready;
+  &save;
+  ($DB::package, $DB::filename, $DB::lineno) = caller;
+
+  return if @skippkg and grep { $_ eq $DB::package } @skippkg;
+
+  $usrctxt = "package $DB::package;";		# this won't let them modify, alas
+  local(*DB::dbline) = "::_<$DB::filename";
+
+  # we need to check for pseudofiles on Mac OS (these are files
+  # not attached to a filename, but instead stored in Dev:Pseudo)
+  # since this is done late, $DB::filename will be "wrong" after
+  # skippkg
+  if ($^O eq 'MacOS' && $#DB::dbline < 0) {
+    $DB::filename = 'Dev:Pseudo';
+    *DB::dbline = "::_<$DB::filename";
+  }
+
+  my ($stop, $action);
+  if (($stop,$action) = split(/\0/,$DB::dbline{$DB::lineno})) {
+    if ($stop eq '1') {
+      $DB::signal |= 1;
+    }
+    else {
+      $stop = 0 unless $stop;			# avoid un_init warning
+      $evalarg = "\$DB::signal |= do { $stop; }"; &eval;
+      $DB::dbline{$DB::lineno} =~ s/;9($|\0)/$1/;    # clear any temp breakpt
+    }
+  }
+  if ($DB::single || $DB::trace || $DB::signal) {
+    $DB::subname = ($DB::sub =~ /\'|::/) ? $DB::sub : "${DB::package}::$DB::sub"; #';
+    DB->loadfile($DB::filename, $DB::lineno);
+  }
+  $evalarg = $action, &eval if $action;
+  if ($DB::single || $DB::signal) {
+    _outputall($#stack . " levels deep in subroutine calls.\n") if $DB::single & 4;
+    $DB::single = 0;
+    $DB::signal = 0;
+    $running = 0;
+    
+    &eval if ($evalarg = DB->prestop);
+    my $c;
+    for $c (@clients) {
+      # perform any client-specific prestop actions
+      &eval if ($evalarg = $c->cprestop);
+      
+      # Now sit in an event loop until something sets $running
+      do {
+	$c->idle;                     # call client event loop; must not block
+	if ($running == 2) {          # client wants something eval-ed
+	  &eval if ($evalarg = $c->evalcode);
+	  $running = 0;
+	}
+      } until $running;
+      
+      # perform any client-specific poststop actions
+      &eval if ($evalarg = $c->cpoststop);
+    }
+    &eval if ($evalarg = DB->poststop);
+  }
+  ($@, $!, $,, $/, $\, $^W) = @saved;
+  ();
+}
+  
+####
+# this takes its argument via $evalarg to preserve current @_
+#    
+sub eval {
+  ($@, $!, $,, $/, $\, $^W) = @saved;
+  eval "$usrctxt $evalarg; &DB::save";
+  _outputall($@) if $@;
+}
+
+###############################################################################
+#         no compile-time subroutine call allowed before this point           #
+###############################################################################
+
+use strict;                # this can run only after DB() and sub() are defined
+
+sub save {
+  @saved = ($@, $!, $,, $/, $\, $^W);
+  $, = ""; $/ = "\n"; $\ = ""; $^W = 0;
+}
+
+sub catch {
+  for (@clients) { $_->awaken; }
+  $DB::signal = 1;
+  $ready = 1;
+}
+
+####
+#
+# Client callable (read inheritable) methods defined after this point
+#
+####
+
+sub register {
+  my $s = shift;
+  $s = _clientname($s) if ref($s);
+  push @clients, $s;
+}
+
+sub done {
+  my $s = shift;
+  $s = _clientname($s) if ref($s);
+  @clients = grep {$_ ne $s} @clients;
+  $s->cleanup;
+#  $running = 3 unless @clients;
+  exit(0) unless @clients;
+}
+
+sub _clientname {
+  my $name = shift;
+  "$name" =~ /^(.+)=[A-Z]+\(.+\)$/;
+  return $1;
+}
+
+sub next {
+  my $s = shift;
+  $DB::single = 2;
+  $running = 1;
+}
+
+sub step {
+  my $s = shift;
+  $DB::single = 1;
+  $running = 1;
+}
+
+sub cont {
+  my $s = shift;
+  my $i = shift;
+  $s->set_tbreak($i) if $i;
+  for ($i = 0; $i <= $#stack;) {
+	$stack[$i++] &= ~1;
+  }
+  $DB::single = 0;
+  $running = 1;
+}
+
+####
+# XXX caller must experimentally determine $i (since it depends
+# on how many client call frames are between this call and the DB call).
+# Such is life.
+#
+sub ret {
+  my $s = shift;
+  my $i = shift;      # how many levels to get to DB sub
+  $i = 0 unless defined $i;
+  $stack[$#stack-$i] |= 1;
+  $DB::single = 0;
+  $running = 1;
+}
+
+####
+# XXX caller must experimentally determine $start (since it depends
+# on how many client call frames are between this call and the DB call).
+# Such is life.
+#
+sub backtrace {
+  my $self = shift;
+  my $start = shift;
+  my($p,$f,$l,$s,$h,$w,$e,$r,$a, @a, @ret,$i);
+  $start = 1 unless $start;
+  for ($i = $start; ($p,$f,$l,$s,$h,$w,$e,$r) = caller($i); $i++) {
+    @a = @DB::args;
+    for (@a) {
+      s/'/\\'/g;
+      s/([^\0]*)/'$1'/ unless /^-?[\d.]+$/;
+      s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
+      s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
+    }
+    $w = $w ? '@ = ' : '$ = ';
+    $a = $h ? '(' . join(', ', @a) . ')' : '';
+    $e =~ s/\n\s*\;\s*\Z// if $e;
+    $e =~ s/[\\\']/\\$1/g if $e;
+    if ($r) {
+      $s = "require '$e'";
+    } elsif (defined $r) {
+      $s = "eval '$e'";
+    } elsif ($s eq '(eval)') {
+      $s = "eval {...}";
+    }
+    $f = "file `$f'" unless $f eq '-e';
+    push @ret, "$w&$s$a from $f line $l";
+    last if $DB::signal;
+  }
+  return @ret;
+}
+
+sub _outputall {
+  my $c;
+  for $c (@clients) {
+    $c->output(@_);
+  }
+}
+
+sub trace_toggle {
+  my $s = shift;
+  $DB::trace = !$DB::trace;
+}
+
+
+####
+# without args: returns all defined subroutine names
+# with subname args: returns a listref [file, start, end]
+#
+sub subs {
+  my $s = shift;
+  if (@_) {
+    my(@ret) = ();
+    while (@_) {
+      my $name = shift;
+      push @ret, [$DB::sub{$name} =~ /^(.*)\:(\d+)-(\d+)$/] 
+	if exists $DB::sub{$name};
+    }
+    return @ret;
+  }
+  return keys %DB::sub;
+}
+
+####
+# first argument is a filename whose subs will be returned
+# if a filename is not supplied, all subs in the current
+# filename are returned.
+#
+sub filesubs {
+  my $s = shift;
+  my $fname = shift;
+  $fname = $DB::filename unless $fname;
+  return grep { $DB::sub{$_} =~ /^$fname/ } keys %DB::sub;
+}
+
+####
+# returns a list of all filenames that DB knows about
+#
+sub files {
+  my $s = shift;
+  my(@f) = grep(m|^_<|, keys %main::);
+  return map { substr($_,2) } @f;
+}
+
+####
+# returns reference to an array holding the lines in currently
+# loaded file
+#
+sub lines {
+  my $s = shift;
+  return \@DB::dbline;
+}
+
+####
+# loadfile($file, $line)
+#
+sub loadfile {
+  my $s = shift;
+  my($file, $line) = @_;
+  if (!defined $main::{'_<' . $file}) {
+    my $try;
+    if (($try) = grep(m|^_<.*$file|, keys %main::)) {  
+      $file = substr($try,2);
+    }
+  }
+  if (defined($main::{'_<' . $file})) {
+    my $c;
+#    _outputall("Loading file $file..");
+    *DB::dbline = "::_<$file";
+    $DB::filename = $file;
+    for $c (@clients) {
+#      print "2 ", $file, '|', $line, "\n";
+      $c->showfile($file, $line);
+    }
+    return $file;
+  }
+  return undef;
+}
+
+sub lineevents {
+  my $s = shift;
+  my $fname = shift;
+  my(%ret) = ();
+  my $i;
+  $fname = $DB::filename unless $fname;
+  local(*DB::dbline) = "::_<$fname";
+  for ($i = 1; $i <= $#DB::dbline; $i++) {
+    $ret{$i} = [$DB::dbline[$i], split(/\0/, $DB::dbline{$i})] 
+      if defined $DB::dbline{$i};
+  }
+  return %ret;
+}
+
+sub set_break {
+  my $s = shift;
+  my $i = shift;
+  my $cond = shift;
+  $i ||= $DB::lineno;
+  $cond ||= '1';
+  $i = _find_subline($i) if ($i =~ /\D/);
+  $s->output("Subroutine not found.\n") unless $i;
+  if ($i) {
+    if ($DB::dbline[$i] == 0) {
+      $s->output("Line $i not breakable.\n");
+    }
+    else {
+      $DB::dbline{$i} =~ s/^[^\0]*/$cond/;
+    }
+  }
+}
+
+sub set_tbreak {
+  my $s = shift;
+  my $i = shift;
+  $i = _find_subline($i) if ($i =~ /\D/);
+  $s->output("Subroutine not found.\n") unless $i;
+  if ($i) {
+    if ($DB::dbline[$i] == 0) {
+      $s->output("Line $i not breakable.\n");
+    }
+    else {
+      $DB::dbline{$i} =~ s/($|\0)/;9$1/; # add one-time-only b.p.
+    }
+  }
+}
+
+sub _find_subline {
+  my $name = shift;
+  $name =~ s/\'/::/;
+  $name = "${DB::package}\:\:" . $name if $name !~ /::/;
+  $name = "main" . $name if substr($name,0,2) eq "::";
+  my($fname, $from, $to) = ($DB::sub{$name} =~ /^(.*):(\d+)-(\d+)$/);
+  if ($from) {
+    local *DB::dbline = "::_<$fname";
+    ++$from while $DB::dbline[$from] == 0 && $from < $to;
+    return $from;
+  }
+  return undef;
+}
+
+sub clr_breaks {
+  my $s = shift;
+  my $i;
+  if (@_) {
+    while (@_) {
+      $i = shift;
+      $i = _find_subline($i) if ($i =~ /\D/);
+      $s->output("Subroutine not found.\n") unless $i;
+      if (defined $DB::dbline{$i}) {
+        $DB::dbline{$i} =~ s/^[^\0]+//;
+        if ($DB::dbline{$i} =~ s/^\0?$//) {
+          delete $DB::dbline{$i};
+        }
+      }
+    }
+  }
+  else {
+    for ($i = 1; $i <= $#DB::dbline ; $i++) {
+      if (defined $DB::dbline{$i}) {
+        $DB::dbline{$i} =~ s/^[^\0]+//;
+        if ($DB::dbline{$i} =~ s/^\0?$//) {
+          delete $DB::dbline{$i};
+        }
+      }
+    }
+  }
+}
+
+sub set_action {
+  my $s = shift;
+  my $i = shift;
+  my $act = shift;
+  $i = _find_subline($i) if ($i =~ /\D/);
+  $s->output("Subroutine not found.\n") unless $i;
+  if ($i) {
+    if ($DB::dbline[$i] == 0) {
+      $s->output("Line $i not actionable.\n");
+    }
+    else {
+      $DB::dbline{$i} =~ s/\0[^\0]*//;
+      $DB::dbline{$i} .= "\0" . $act;
+    }
+  }
+}
+
+sub clr_actions {
+  my $s = shift;
+  my $i;
+  if (@_) {
+    while (@_) {
+      my $i = shift;
+      $i = _find_subline($i) if ($i =~ /\D/);
+      $s->output("Subroutine not found.\n") unless $i;
+      if ($i && $DB::dbline[$i] != 0) {
+	$DB::dbline{$i} =~ s/\0[^\0]*//;
+	delete $DB::dbline{$i} if $DB::dbline{$i} =~ s/^\0?$//;
+      }
+    }
+  }
+  else {
+    for ($i = 1; $i <= $#DB::dbline ; $i++) {
+      if (defined $DB::dbline{$i}) {
+	$DB::dbline{$i} =~ s/\0[^\0]*//;
+	delete $DB::dbline{$i} if $DB::dbline{$i} =~ s/^\0?$//;
+      }
+    }
+  }
+}
+
+sub prestop {
+  my ($client, $val) = @_;
+  return defined($val) ? $preeval->{$client} = $val : $preeval->{$client};
+}
+
+sub poststop {
+  my ($client, $val) = @_;
+  return defined($val) ? $posteval->{$client} = $val : $posteval->{$client};
+}
+
+#
+# "pure virtual" methods
+#
+
+# client-specific pre/post-stop actions.
+sub cprestop {}
+sub cpoststop {}
+
+# client complete startup
+sub awaken {}
+
+sub skippkg {
+  my $s = shift;
+  push @skippkg, @_ if @_;
+}
+
+sub evalcode {
+  my ($client, $val) = @_;
+  if (defined $val) {
+    $running = 2;    # hand over to DB() to evaluate in its context
+    $ineval->{$client} = $val;
+  }
+  return $ineval->{$client};
+}
+
+sub ready {
+  my $s = shift;
+  return $ready = 1;
+}
+
+# stubs
+    
+sub init {}
+sub stop {}
+sub idle {}
+sub cleanup {}
+sub output {}
+
+#
+# client init
+#
+for (@clients) { $_->init }
+
+$SIG{'INT'} = \&DB::catch;
+
+# disable this if stepping through END blocks is desired
+# (looks scary and deconstructivist with Swat)
+END { $ready = 0 }
+
+1;
+__END__
+
+=head1 NAME
+
+DB - programmatic interface to the Perl debugging API (draft, subject to
+change)
+
+=head1 SYNOPSIS
+
+    package CLIENT;
+    use DB;
+    @ISA = qw(DB);
+
+    # these (inherited) methods can be called by the client
+
+    CLIENT->register()      # register a client package name
+    CLIENT->done()          # de-register from the debugging API
+    CLIENT->skippkg('hide::hide')  # ask DB not to stop in this package
+    CLIENT->cont([WHERE])       # run some more (until BREAK or another breakpt)
+    CLIENT->step()              # single step
+    CLIENT->next()              # step over
+    CLIENT->ret()               # return from current subroutine
+    CLIENT->backtrace()         # return the call stack description
+    CLIENT->ready()             # call when client setup is done
+    CLIENT->trace_toggle()      # toggle subroutine call trace mode
+    CLIENT->subs([SUBS])        # return subroutine information
+    CLIENT->files()             # return list of all files known to DB
+    CLIENT->lines()             # return lines in currently loaded file
+    CLIENT->loadfile(FILE,LINE) # load a file and let other clients know
+    CLIENT->lineevents()        # return info on lines with actions
+    CLIENT->set_break([WHERE],[COND])
+    CLIENT->set_tbreak([WHERE])
+    CLIENT->clr_breaks([LIST])
+    CLIENT->set_action(WHERE,ACTION)
+    CLIENT->clr_actions([LIST])
+    CLIENT->evalcode(STRING)  # eval STRING in executing code's context
+    CLIENT->prestop([STRING]) # execute in code context before stopping
+    CLIENT->poststop([STRING])# execute in code context before resuming
+
+    # These methods will be called at the appropriate times.
+    # Stub versions provided do nothing.
+    # None of these can block.
+
+    CLIENT->init()          # called when debug API inits itself
+    CLIENT->stop(FILE,LINE) # when execution stops
+    CLIENT->idle()          # while stopped (can be a client event loop)
+    CLIENT->cleanup()       # just before exit
+    CLIENT->output(LIST)    # called to print any output that API must show
+
+=head1 DESCRIPTION
+
+Perl debug information is frequently required not just by debuggers,
+but also by modules that need some "special" information to do their
+job properly, like profilers.
+
+This module abstracts and provides all of the hooks into Perl internal
+debugging functionality, so that various implementations of Perl debuggers
+(or packages that want to simply get at the "privileged" debugging data)
+can all benefit from the development of this common code.  Currently used
+by Swat, the perl/Tk GUI debugger.
+
+Note that multiple "front-ends" can latch into this debugging API
+simultaneously.  This is intended to facilitate things like
+debugging with a command line and GUI at the same time, debugging 
+debuggers etc.  [Sounds nice, but this needs some serious support -- GSAR]
+
+In particular, this API does B<not> provide the following functions:
+
+=over 4
+
+=item *
+
+data display
+
+=item *
+
+command processing
+
+=item *
+
+command alias management
+
+=item *
+
+user interface (tty or graphical)
+
+=back
+
+These are intended to be services performed by the clients of this API.
+
+This module attempts to be squeaky clean w.r.t C<use strict;> and when
+warnings are enabled.
+
+
+=head2 Global Variables
+
+The following "public" global names can be read by clients of this API.
+Beware that these should be considered "readonly".
+
+=over 8
+
+=item  $DB::sub
+
+Name of current executing subroutine.
+
+=item  %DB::sub
+
+The keys of this hash are the names of all the known subroutines.  Each value
+is an encoded string that has the sprintf(3) format 
+C<("%s:%d-%d", filename, fromline, toline)>.
+
+=item  $DB::single
+
+Single-step flag.  Will be true if the API will stop at the next statement.
+
+=item  $DB::signal
+
+Signal flag. Will be set to a true value if a signal was caught.  Clients may
+check for this flag to abort time-consuming operations.
+
+=item  $DB::trace
+
+This flag is set to true if the API is tracing through subroutine calls.
+
+=item  @DB::args
+
+Contains the arguments of current subroutine, or the C<@ARGV> array if in the 
+toplevel context.
+
+=item  @DB::dbline
+
+List of lines in currently loaded file.
+
+=item  %DB::dbline
+
+Actions in current file (keys are line numbers).  The values are strings that
+have the sprintf(3) format C<("%s\000%s", breakcondition, actioncode)>. 
+
+=item  $DB::package
+
+Package namespace of currently executing code.
+
+=item  $DB::filename
+
+Currently loaded filename.
+
+=item  $DB::subname
+
+Fully qualified name of currently executing subroutine.
+
+=item  $DB::lineno
+
+Line number that will be executed next.
+
+=back
+
+=head2 API Methods
+
+The following are methods in the DB base class.  A client must
+access these methods by inheritance (*not* by calling them directly),
+since the API keeps track of clients through the inheritance
+mechanism.
+
+=over 8
+
+=item CLIENT->register()
+
+register a client object/package
+
+=item CLIENT->evalcode(STRING)
+
+eval STRING in executing code context
+
+=item CLIENT->skippkg('D::hide')
+
+ask DB not to stop in these packages
+
+=item CLIENT->run()
+
+run some more (until a breakpt is reached)
+
+=item CLIENT->step()
+
+single step
+
+=item CLIENT->next()
+
+step over
+
+=item CLIENT->done()
+
+de-register from the debugging API
+
+=back
+
+=head2 Client Callback Methods
+
+The following "virtual" methods can be defined by the client.  They will
+be called by the API at appropriate points.  Note that unless specified
+otherwise, the debug API only defines empty, non-functional default versions
+of these methods.
+
+=over 8
+
+=item CLIENT->init()
+
+Called after debug API inits itself.
+
+=item CLIENT->prestop([STRING])
+
+Usually inherited from DB package.  If no arguments are passed,
+returns the prestop action string.
+
+=item CLIENT->stop()
+
+Called when execution stops (w/ args file, line).
+
+=item CLIENT->idle()
+
+Called while stopped (can be a client event loop).
+
+=item CLIENT->poststop([STRING])
+
+Usually inherited from DB package.  If no arguments are passed,
+returns the poststop action string.
+
+=item CLIENT->evalcode(STRING)
+
+Usually inherited from DB package.  Ask for a STRING to be C<eval>-ed
+in executing code context.
+
+=item CLIENT->cleanup()
+
+Called just before exit.
+
+=item CLIENT->output(LIST)
+
+Called when API must show a message (warnings, errors etc.).
+
+
+=back
+
+
+=head1 BUGS
+
+The interface defined by this module is missing some of the later additions
+to perl's debugging functionality.  As such, this interface should be considered
+highly experimental and subject to change.
+
+=head1 AUTHOR
+
+Gurusamy Sarathy	gsar@activestate.com
+
+This code heavily adapted from an early version of perl5db.pl attributable
+to Larry Wall and the Perl Porters.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter.pm	(revision 14489)
@@ -0,0 +1,605 @@
+package DBM_Filter ;
+
+use strict;
+use warnings;
+our $VERSION = '0.01';
+
+package Tie::Hash ;
+
+use strict;
+use warnings;
+
+use Carp;
+
+
+our %LayerStack = ();
+our %origDESTROY = ();
+
+our %Filters = map { $_, undef } qw(
+            Fetch_Key
+            Fetch_Value
+            Store_Key
+            Store_Value
+	);
+
+our %Options = map { $_, 1 } qw(
+            fetch
+            store
+	);
+
+#sub Filter_Enable
+#{
+#}
+#
+#sub Filter_Disable
+#{
+#}
+
+sub Filtered
+{
+    my $this = shift;
+    return defined $LayerStack{$this} ;
+}
+
+sub Filter_Pop
+{
+    my $this = shift;
+    my $stack = $LayerStack{$this} || return undef ;
+    my $filter = pop @{ $stack };
+
+    # remove the filter hooks if this is the last filter to pop
+    if ( @{ $stack } == 0 ) {
+        $this->filter_store_key  ( undef );
+        $this->filter_store_value( undef );
+        $this->filter_fetch_key  ( undef );
+        $this->filter_fetch_value( undef );
+        delete $LayerStack{$this};
+    }
+
+    return $filter;
+}
+
+sub Filter_Key_Push
+{
+    &_do_Filter_Push;
+}
+
+sub Filter_Value_Push
+{
+    &_do_Filter_Push;
+}
+
+
+sub Filter_Push
+{
+    &_do_Filter_Push;
+}
+
+sub _do_Filter_Push
+{
+    my $this = shift;
+    my %callbacks = ();
+    my $caller = (caller(1))[3];
+    $caller =~ s/^.*:://;
+ 
+    croak "$caller: no parameters present" unless @_ ;
+
+    if ( ! $Options{lc $_[0]} ) {
+        my $class = shift;
+        my @params = @_;
+
+        # if $class already contains "::", don't prefix "DBM_Filter::"
+        $class = "DBM_Filter::$class" unless $class =~ /::/;
+    
+        # does the "DBM_Filter::$class" exist?
+	if ( ! defined %{ "${class}::"} ) {
+	    # Nope, so try to load it.
+            eval " require $class ; " ;
+            croak "$caller: Cannot Load DBM Filter '$class': $@" if $@;
+        }
+    
+        no strict 'refs';
+        my $fetch  = *{ "${class}::Fetch"  }{CODE};
+        my $store  = *{ "${class}::Store"  }{CODE};
+        my $filter = *{ "${class}::Filter" }{CODE};
+        use strict 'refs';
+
+        my $count = defined($filter) + defined($store) + defined($fetch) ;
+
+        if ( $count == 0 )
+          { croak "$caller: No methods (Filter, Fetch or Store) found in class '$class'" }
+        elsif ( $count == 1 && ! defined $filter) {
+           my $need = defined($fetch) ? 'Store' : 'Fetch';
+           croak "$caller: Missing method '$need' in class '$class'" ;
+        }
+        elsif ( $count >= 2 && defined $filter)
+          { croak "$caller: Can't mix Filter with Store and Fetch in class '$class'" }
+
+        if (defined $filter) {
+            my $callbacks = &{ $filter }(@params);
+            croak "$caller: '${class}::Filter' did not return a hash reference" 
+                unless ref $callbacks && ref $callbacks eq 'HASH';
+            %callbacks = %{ $callbacks } ;
+        }
+        else {
+            $callbacks{Fetch} = $fetch;
+            $callbacks{Store} = $store;
+        }
+    }
+    else {
+        croak "$caller: not even params" unless @_ % 2 == 0;
+        %callbacks = @_;
+    }
+    
+    my %filters = %Filters ;
+    my @got = ();
+    while (my ($k, $v) = each %callbacks )
+    {
+        my $key = $k;
+        $k = lc $k;
+        if ($k eq 'fetch') {
+            push @got, 'Fetch';
+            if ($caller eq 'Filter_Push')
+              { $filters{Fetch_Key} = $filters{Fetch_Value} = $v }
+            elsif ($caller eq 'Filter_Key_Push')
+              { $filters{Fetch_Key} = $v }
+            elsif ($caller eq 'Filter_Value_Push')
+              { $filters{Fetch_Value} = $v }
+        }
+        elsif ($k eq 'store') {
+            push @got, 'Store';
+            if ($caller eq 'Filter_Push')
+              { $filters{Store_Key} = $filters{Store_Value} = $v }
+            elsif ($caller eq 'Filter_Key_Push')
+              { $filters{Store_Key} = $v }
+            elsif ($caller eq 'Filter_Value_Push')
+              { $filters{Store_Value} = $v }
+        }
+        else
+          { croak "$caller: Unknown key '$key'" }
+
+        croak "$caller: value associated with key '$key' is not a code reference"
+            unless ref $v && ref $v eq 'CODE';
+    }
+
+    if ( @got != 2 ) {
+        push @got, 'neither' if @got == 0 ;
+        croak "$caller: expected both Store & Fetch - got @got";
+    }
+
+    # remember the class
+    push @{ $LayerStack{$this} }, \%filters ;
+
+    my $str_this = "$this" ; # Avoid a closure with $this in the subs below
+
+    $this->filter_store_key  ( sub { store_hook($str_this, 'Store_Key')   });
+    $this->filter_store_value( sub { store_hook($str_this, 'Store_Value') });
+    $this->filter_fetch_key  ( sub { fetch_hook($str_this, 'Fetch_Key')   });
+    $this->filter_fetch_value( sub { fetch_hook($str_this, 'Fetch_Value') });
+
+    # Hijack the callers DESTROY method
+    $this =~ /^(.*)=/;
+    my $type = $1 ;
+    no strict 'refs';
+    if ( *{ "${type}::DESTROY" }{CODE} ne \&MyDESTROY )
+    {
+        $origDESTROY{$type} = *{ "${type}::DESTROY" }{CODE};
+        no warnings 'redefine';
+        *{ "${type}::DESTROY" } = \&MyDESTROY ;
+    }
+}
+
+sub store_hook
+{
+    my $this = shift ;
+    my $type = shift ;
+    foreach my $layer (@{ $LayerStack{$this} })
+    {
+        &{ $layer->{$type} }() if defined $layer->{$type} ;
+    }
+}
+
+sub fetch_hook
+{
+    my $this = shift ;
+    my $type = shift ;
+    foreach my $layer (reverse @{ $LayerStack{$this} })
+    {
+        &{ $layer->{$type} }() if defined $layer->{$type} ;
+    }
+}
+
+sub MyDESTROY
+{
+    my $this = shift ;
+    delete $LayerStack{$this} ;
+
+    # call real DESTROY
+    $this =~ /^(.*)=/;
+    &{ $origDESTROY{$1} }($this);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+DBM_Filter -- Filter DBM keys/values 
+
+=head1 SYNOPSIS
+
+    use DBM_Filter ;
+    use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+
+    $db = tie %hash, ...
+
+    $db->Filter_Push(Fetch => sub {...},
+                     Store => sub {...});
+
+    $db->Filter_Push('my_filter1');
+    $db->Filter_Push('my_filter2', params...);
+
+    $db->Filter_Key_Push(...) ;
+    $db->Filter_Value_Push(...) ;
+
+    $db->Filter_Pop();
+    $db->Filtered();
+
+    package DBM_Filter::my_filter1;
+    
+    sub Store { ... }
+    sub Fetch { ... }
+
+    1;
+
+    package DBM_Filter::my_filter2;
+
+    sub Filter
+    {
+        my @opts = @_;
+        ...
+        return (
+            sub Store { ... },
+            sub Fetch { ... } );
+    }
+
+    1;
+
+=head1 DESCRIPTION
+
+This module provides an interface that allows filters to be applied
+to tied Hashes associated with DBM files. It builds on the DBM Filter
+hooks that are present in all the *DB*_File modules included with the
+standard Perl source distribution from version 5.6.1 onwards. In addition
+to the *DB*_File modules distributed with Perl, the BerkeleyDB module,
+available on CPAN, supports the DBM Filter hooks. See L<perldbmfilter>
+for more details on the DBM Filter hooks.
+
+=head1 What is a DBM Filter?
+
+A DBM Filter allows the keys and/or values in a tied hash to be modified
+by some user-defined code just before it is written to the DBM file and
+just after it is read back from the DBM file. For example, this snippet
+of code
+
+    $some_hash{"abc"} = 42;
+
+could potentially trigger two filters, one for the writing of the key
+"abc" and another for writing the value 42.  Similarly, this snippet
+
+    my ($key, $value) = each %some_hash
+
+will trigger two filters, one for the reading of the key and one for
+the reading of the value.
+
+Like the existing DBM Filter functionality, this module arranges for the
+C<$_> variable to be populated with the key or value that a filter will
+check. This usually means that most DBM filters tend to be very short.
+
+=head2 So what's new?
+
+The main enhancements over the standard DBM Filter hooks are:
+
+=over 4
+
+=item *
+
+A cleaner interface.
+
+=item *
+
+The ability to easily apply multiple filters to a single DBM file.
+
+=item *
+
+The ability to create "canned" filters. These allow commonly used filters
+to be packaged into a stand-alone module.
+
+=back
+
+=head1 METHODS
+
+This module will arrange for the following methods to be available via
+the object returned from the C<tie> call.
+
+=head2 $db->Filter_Push()
+
+=head2 $db->Filter_Key_Push()
+
+=head2 $db->Filter_Value_Push()
+
+Add a filter to filter stack for the database, C<$db>. The three formats
+vary only in whether they apply to the DBM key, the DBM value or both.
+
+=over 5
+
+=item Filter_Push
+
+The filter is applied to I<both> keys and values.
+
+=item Filter_Key_Push
+
+The filter is applied to the key I<only>.
+
+=item Filter_Value_Push
+
+The filter is applied to the value I<only>.
+
+=back
+
+
+=head2 $db->Filter_Pop()
+
+Removes the last filter that was applied to the DBM file associated with
+C<$db>, if present.
+
+=head2 $db->Filtered()
+
+Returns TRUE if there are any filters applied to the DBM associated
+with C<$db>.  Otherwise returns FALSE.
+
+
+
+=head1 Writing a Filter
+
+Filters can be created in two main ways
+
+=head2 Immediate Filters
+
+An immediate filter allows you to specify the filter code to be used
+at the point where the filter is applied to a dbm. In this mode the
+Filter_*_Push methods expects to receive exactly two parameters.
+
+    my $db = tie %hash, 'SDBM_File', ...
+    $db->Filter_Push( Store => sub { },
+                      Fetch => sub { });
+
+The code reference associated with C<Store> will be called before any
+key/value is written to the database and the code reference associated
+with C<Fetch> will be called after any key/value is read from the
+database.
+
+For example, here is a sample filter that adds a trailing NULL character
+to all strings before they are written to the DBM file, and removes the
+trailing NULL when they are read from the DBM file
+
+    my $db = tie %hash, 'SDBM_File', ...
+    $db->Filter_Push( Store => sub { $_ .= "\x00" ; },
+                      Fetch => sub { s/\x00$// ;    });
+
+
+Points to note:
+
+=over 5
+
+=item 1.
+
+Both the Store and Fetch filters manipulate C<$_>.
+
+=back
+
+=head2 Canned Filters
+
+Immediate filters are useful for one-off situations. For more generic
+problems it can be useful to package the filter up in its own module.
+
+The usage is for a canned filter is:
+
+    $db->Filter_Push("name", params)
+
+where
+
+=over 5
+
+=item "name"
+
+is the name of the module to load. If the string specified does not
+contain the package separator characters "::", it is assumed to refer to
+the full module name "DBM_Filter::name". This means that the full names
+for canned filters, "null" and "utf8", included with this module are:
+
+    DBM_Filter::null
+    DBM_Filter::utf8
+
+=item params
+
+any optional parameters that need to be sent to the filter. See the
+encode filter for an example of a module that uses parameters.
+
+=back
+
+The module that implements the canned filter can take one of two
+forms. Here is a template for the first
+
+    package DBM_Filter::null ;
+
+    use strict;
+    use warnings;
+
+    sub Store 
+    {
+        # store code here    
+    }
+
+    sub Fetch
+    {
+        # fetch code here
+    }
+
+    1;
+
+
+Notes:
+
+=over 5
+
+=item 1.
+
+The package name uses the C<DBM_Filter::> prefix.
+
+=item 2.
+
+The module I<must> have both a Store and a Fetch method. If only one is
+present, or neither are present, a fatal error will be thrown.
+
+=back
+
+The second form allows the filter to hold state information using a
+closure, thus:
+
+    package DBM_Filter::encoding ;
+
+    use strict;
+    use warnings;
+
+    sub Filter
+    {
+        my @params = @_ ;
+
+        ...
+        return {
+            Store   => sub { $_ = $encoding->encode($_) },
+            Fetch   => sub { $_ = $encoding->decode($_) }
+            } ;
+    }
+
+    1;
+
+
+In this instance the "Store" and "Fetch" methods are encapsulated inside a
+"Filter" method.
+
+
+=head1 Filters Included
+
+A number of canned filers are provided with this module. They cover a
+number of the main areas that filters are needed when interfacing with
+DBM files. They also act as templates for your own filters.
+
+The filter included are:
+
+=over 5
+
+=item * utf8
+
+This module will ensure that all data written to the DBM will be encoded
+in UTF-8.
+
+This module needs the Encode module.
+
+=item * encode
+
+Allows you to choose the character encoding will be store in the DBM file.
+
+=item * compress
+
+This filter will compress all data before it is written to the database
+and uncompressed it on reading.
+
+This module needs Compress::Zlib. 
+
+=item * int32
+
+This module is used when interoperating with a C/C++ application that
+uses a C int as either the key and/or value in the DBM file.
+
+=item * null
+
+This module ensures that all data written to the DBM file is null
+terminated. This is useful when you have a perl script that needs
+to interoperate with a DBM file that a C program also uses. A fairly
+common issue is for the C application to include the terminating null
+in a string when it writes to the DBM file. This filter will ensure that
+all data written to the DBM file can be read by the C application.
+
+=back
+
+=head1 NOTES
+
+=head2 Maintain Round Trip Integrity
+
+When writing a DBM filter it is I<very> important to ensure that it is
+possible to retrieve all data that you have written when the DBM filter
+is in place. In practice, this means that whatever transformation is
+applied to the data in the Store method, the I<exact> inverse operation
+should be applied in the Fetch method.
+
+If you don't provide an exact inverse transformation, you will find that
+code like this will not behave as you expect.
+
+     while (my ($k, $v) = each %hash)
+     {
+         ...
+     }
+
+Depending on the transformation, you will find that one or more of the
+following will happen
+
+=over 5
+
+=item 1
+
+The loop will never terminate.
+
+=item 2
+
+Too few records will be retrieved.
+
+=item 3
+
+Too many will be retrieved.
+
+=item 4
+
+The loop will do the right thing for a while, but it will unexpectedly fail. 
+
+=back
+
+=head2 Don't mix filtered & non-filtered data in the same database file. 
+
+This is just a restatement of the previous section. Unless you are
+completely certain you know what you are doing, avoid mixing filtered &
+non-filtered data.
+
+=head1 EXAMPLE
+
+Say you need to interoperate with a legacy C application that stores
+keys as C ints and the values and null terminated UTF-8 strings. Here
+is how you would set that up
+
+    my $db = tie %hash, 'SDBM_File', ...
+
+    $db->Filter_Key_Push('int32') ;
+
+    $db->Filter_Value_Push('utf8');
+    $db->Filter_Value_Push('null');
+
+=head1 SEE ALSO
+
+<DB_File>,  L<GDBM_File>, L<NDBM_File>, L<ODBM_File>, L<SDBM_File>, L<perldbmfilter>
+
+=head1 AUTHOR
+
+Paul Marquess <pmqs@cpan.org>
+
Index: /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/compress.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/compress.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/compress.pm	(revision 14489)
@@ -0,0 +1,51 @@
+package DBM_Filter::compress ;
+
+use strict;
+use warnings;
+use Carp;
+
+our $VERSION = '0.01';
+
+BEGIN
+{
+    eval { require Compress::Zlib; Compress::Zlib->import() };
+
+    croak "Compress::Zlib module not found.\n"
+        if $@;
+}
+
+
+
+sub Store { $_ = compress($_) }
+sub Fetch { $_ = uncompress($_) }
+
+1;
+
+__END__
+
+=head1 DBM_Filter::compress
+
+=head1 SYNOPSIS
+
+    use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+    use DBM_Filter ;
+
+    $db = tie %hash, ...
+    $db->Filter_Push('compress');
+    
+=head1 DESCRIPTION
+
+This DBM filter will compress all data before it is written to the database
+and uncompressed it on reading.
+
+A fatal error will be thrown if the Compress::Zlib module is not
+available.
+
+=head1 SEE ALSO
+
+L<DBM_Filter>, L<perldbmfilter>, L<Compress::Zlib>
+
+=head1 AUTHOR
+
+Paul Marquess pmqs@cpan.org
+
Index: /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/encode.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/encode.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/encode.pm	(revision 14489)
@@ -0,0 +1,84 @@
+package DBM_Filter::encode ;
+
+use strict;
+use warnings;
+use Carp;
+
+our $VERSION = '0.01';
+
+BEGIN
+{
+    eval { require Encode; };
+
+    croak "Encode module not found.\n"
+        if $@;
+}
+
+
+sub Filter
+{
+    my $encoding_name = shift || "utf8";
+
+    my $encoding = Encode::find_encoding($encoding_name) ;
+
+    croak "Encoding '$encoding_name' is not available"
+        unless $encoding;
+
+    return {
+        Store   => sub { 
+			 $_ = $encoding->encode($_) 
+			     if defined $_ ;
+		   },
+        Fetch   => sub { 
+			 $_ = $encoding->decode($_)
+			     if defined $_ ;
+			}
+        } ;
+}
+
+1;
+
+__END__
+
+=head1 DBM_Filter::encode
+
+=head1 SYNOPSIS
+
+    use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+    use DBM_Filter ;
+
+    $db = tie %hash, ...
+    $db->Filter_Push('encode' => 'iso-8859-16');
+    
+=head1 DESCRIPTION
+
+This DBM filter allows you to choose the character encoding will be
+store in the DBM file. The usage is
+
+    $db->Filter_Push('encode' => ENCODING);
+
+where "ENCODING" must be a valid encoding name that the Encode module
+recognises.
+
+A fatal error will be thrown if:
+
+=over 5
+
+=item 1
+
+The Encode module is not available.
+
+=item 2
+
+The encoding requested is not supported by the Encode module.
+
+=back
+
+=head1 SEE ALSO
+
+L<DBM_Filter>, L<perldbmfilter>, L<Encode>
+
+=head1 AUTHOR
+
+Paul Marquess pmqs@cpan.org
+
Index: /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/int32.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/int32.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/int32.pm	(revision 14489)
@@ -0,0 +1,48 @@
+package DBM_Filter::int32 ;
+
+use strict;
+use warnings;
+
+our $VERSION = '0.01';
+
+# todo get Filter to figure endian.
+
+sub Store
+{
+    $_ = 0 if ! defined $_ || $_ eq "" ;
+    $_ = pack("i", $_);
+}
+
+sub Fetch
+{
+    no warnings 'uninitialized';
+    $_ = unpack("i", $_);
+}
+
+1;
+
+__END__
+
+=head1 DBM_Filter::int32
+
+=head1 SYNOPSIS
+
+    use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+    use DBM_Filter ;
+
+    $db = tie %hash, ...
+    $db->Filter_Push('int32');
+    
+=head1 DESCRIPTION
+
+This DBM filter is used when interoperating with a C/C++ application
+that uses a C int as either the key and/or value in the DBM file.
+
+=head1 SEE ALSO
+
+L<DBM_Filter>, L<perldbmfilter>
+
+=head1 AUTHOR
+
+Paul Marquess pmqs@cpan.org
+
Index: /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/null.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/null.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/null.pm	(revision 14489)
@@ -0,0 +1,50 @@
+package DBM_Filter::null ;
+
+use strict;
+use warnings;
+
+our $VERSION = '0.01';
+
+sub Store
+{
+    no warnings 'uninitialized';
+    $_ .= "\x00" ;
+}
+
+sub Fetch
+{
+    no warnings 'uninitialized';
+    s/\x00$// ;
+}
+
+1;
+
+__END__
+
+=head1 DBM_Filter::null
+
+=head1 SYNOPSIS
+
+    use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+    use DBM_Filter ;
+
+    $db = tie %hash, ...
+    $db->Filter_Push('null');
+    
+=head1 DESCRIPTION
+
+This filter ensures that all data written to the DBM file is null
+terminated. This is useful when you have a perl script that needs
+to interoperate with a DBM file that a C program also uses. A fairly
+common issue is for the C application to include the terminating null
+in a string when it writes to the DBM file. This filter will ensure that
+all data written to the DBM file can be read by the C application.
+
+
+=head1 SEE ALSO
+
+L<DBM_Filter>, L<perldbmfilter>
+
+=head1 AUTHOR
+
+Paul Marquess pmqs@cpan.org
Index: /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/utf8.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/utf8.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/DBM_Filter/utf8.pm	(revision 14489)
@@ -0,0 +1,50 @@
+package DBM_Filter::utf8 ;
+
+use strict;
+use warnings;
+use Carp;
+
+our $VERSION = '0.01';
+
+BEGIN
+{
+    eval { require Encode; };
+
+    croak "Encode module not found.\n"
+        if $@;
+}
+
+sub Store { $_ = Encode::encode_utf8($_) if defined $_ }
+
+sub Fetch { $_ = Encode::decode_utf8($_) if defined $_ }
+
+1;
+
+__END__
+
+=head1 DBM_Filter::utf8
+
+=head1 SYNOPSIS
+
+    use SDBM_File; # or DB_File, or GDBM_File, or NDBM_File, or ODBM_File
+    use DBM_Filter ;
+    
+
+    $db = tie %hash, ...
+    $db->Filter_Push('utf8');
+    
+=head1 DESCRIPTION
+
+This Filter will ensure that all data written to the DBM will be encoded
+in UTF-8.
+
+This module uses the Encode module.
+
+=head1 SEE ALSO
+
+L<DBM_Filter>, L<perldbmfilter>, L<Encode>
+
+=head1 AUTHOR
+
+Paul Marquess pmqs@cpan.org
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Data/Dumper.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Data/Dumper.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Data/Dumper.pm	(revision 14489)
@@ -0,0 +1,1264 @@
+#
+# Data/Dumper.pm
+#
+# convert perl data structures into perl syntax suitable for both printing
+# and eval
+#
+# Documentation at the __END__
+#
+
+package Data::Dumper;
+
+$VERSION = '2.121_08';
+
+#$| = 1;
+
+use 5.006_001;
+require Exporter;
+require overload;
+
+use Carp;
+
+BEGIN {
+    @ISA = qw(Exporter);
+    @EXPORT = qw(Dumper);
+    @EXPORT_OK = qw(DumperX);
+
+    # if run under miniperl, or otherwise lacking dynamic loading,
+    # XSLoader should be attempted to load, or the pure perl flag
+    # toggled on load failure.
+    eval {
+	require XSLoader;
+    };
+    $Useperl = 1 if $@;
+}
+
+XSLoader::load( 'Data::Dumper' ) unless $Useperl;
+
+# module vars and their defaults
+$Indent     = 2         unless defined $Indent;
+$Purity     = 0         unless defined $Purity;
+$Pad        = ""        unless defined $Pad;
+$Varname    = "VAR"     unless defined $Varname;
+$Useqq      = 0         unless defined $Useqq;
+$Terse      = 0         unless defined $Terse;
+$Freezer    = ""        unless defined $Freezer;
+$Toaster    = ""        unless defined $Toaster;
+$Deepcopy   = 0         unless defined $Deepcopy;
+$Quotekeys  = 1         unless defined $Quotekeys;
+$Bless      = "bless"   unless defined $Bless;
+#$Expdepth   = 0         unless defined $Expdepth;
+$Maxdepth   = 0         unless defined $Maxdepth;
+$Pair       = ' => '    unless defined $Pair;
+$Useperl    = 0         unless defined $Useperl;
+$Sortkeys   = 0         unless defined $Sortkeys;
+$Deparse    = 0         unless defined $Deparse;
+
+#
+# expects an arrayref of values to be dumped.
+# can optionally pass an arrayref of names for the values.
+# names must have leading $ sign stripped. begin the name with *
+# to cause output of arrays and hashes rather than refs.
+#
+sub new {
+  my($c, $v, $n) = @_;
+
+  croak "Usage:  PACKAGE->new(ARRAYREF, [ARRAYREF])" 
+    unless (defined($v) && (ref($v) eq 'ARRAY'));
+  $n = [] unless (defined($n) && (ref($v) eq 'ARRAY'));
+
+  my($s) = { 
+             level      => 0,           # current recursive depth
+	     indent     => $Indent,     # various styles of indenting
+	     pad	=> $Pad,        # all lines prefixed by this string
+	     xpad       => "",          # padding-per-level
+	     apad       => "",          # added padding for hash keys n such
+	     sep        => "",          # list separator
+	     pair	=> $Pair,	# hash key/value separator: defaults to ' => '
+	     seen       => {},          # local (nested) refs (id => [name, val])
+	     todump     => $v,          # values to dump []
+	     names      => $n,          # optional names for values []
+	     varname    => $Varname,    # prefix to use for tagging nameless ones
+             purity     => $Purity,     # degree to which output is evalable
+             useqq 	=> $Useqq,      # use "" for strings (backslashitis ensues)
+             terse 	=> $Terse,      # avoid name output (where feasible)
+             freezer	=> $Freezer,    # name of Freezer method for objects
+             toaster	=> $Toaster,    # name of method to revive objects
+             deepcopy	=> $Deepcopy,   # dont cross-ref, except to stop recursion
+             quotekeys	=> $Quotekeys,  # quote hash keys
+             'bless'	=> $Bless,	# keyword to use for "bless"
+#	     expdepth   => $Expdepth,   # cutoff depth for explicit dumping
+	     maxdepth	=> $Maxdepth,   # depth beyond which we give up
+	     useperl    => $Useperl,    # use the pure Perl implementation
+	     sortkeys   => $Sortkeys,   # flag or filter for sorting hash keys
+	     deparse	=> $Deparse,	# use B::Deparse for coderefs
+	   };
+
+  if ($Indent > 0) {
+    $s->{xpad} = "  ";
+    $s->{sep} = "\n";
+  }
+  return bless($s, $c);
+}
+
+sub init_refaddr_format {
+  require Config;
+  my $f = $Config::Config{uvxformat};
+  $f =~ tr/"//d;
+  our $refaddr_format = "0x%" . $f;
+}
+
+sub format_refaddr {
+  require Scalar::Util;
+  sprintf our $refaddr_format, Scalar::Util::refaddr(shift);
+}
+
+#
+# add-to or query the table of already seen references
+#
+sub Seen {
+  my($s, $g) = @_;
+  if (defined($g) && (ref($g) eq 'HASH'))  {
+    my($k, $v, $id);
+    while (($k, $v) = each %$g) {
+      if (defined $v and ref $v) {
+	$id = format_refaddr($v);
+	if ($k =~ /^[*](.*)$/) {
+	  $k = (ref $v eq 'ARRAY') ? ( "\\\@" . $1 ) :
+	       (ref $v eq 'HASH')  ? ( "\\\%" . $1 ) :
+	       (ref $v eq 'CODE')  ? ( "\\\&" . $1 ) :
+				     (   "\$" . $1 ) ;
+	}
+	elsif ($k !~ /^\$/) {
+	  $k = "\$" . $k;
+	}
+	$s->{seen}{$id} = [$k, $v];
+      }
+      else {
+	carp "Only refs supported, ignoring non-ref item \$$k";
+      }
+    }
+    return $s;
+  }
+  else {
+    return map { @$_ } values %{$s->{seen}};
+  }
+}
+
+#
+# set or query the values to be dumped
+#
+sub Values {
+  my($s, $v) = @_;
+  if (defined($v) && (ref($v) eq 'ARRAY'))  {
+    $s->{todump} = [@$v];        # make a copy
+    return $s;
+  }
+  else {
+    return @{$s->{todump}};
+  }
+}
+
+#
+# set or query the names of the values to be dumped
+#
+sub Names {
+  my($s, $n) = @_;
+  if (defined($n) && (ref($n) eq 'ARRAY'))  {
+    $s->{names} = [@$n];         # make a copy
+    return $s;
+  }
+  else {
+    return @{$s->{names}};
+  }
+}
+
+sub DESTROY {}
+
+sub Dump {
+    return &Dumpxs
+	unless $Data::Dumper::Useperl || (ref($_[0]) && $_[0]->{useperl}) ||
+	       $Data::Dumper::Useqq   || (ref($_[0]) && $_[0]->{useqq}) ||
+	       $Data::Dumper::Deparse || (ref($_[0]) && $_[0]->{deparse});
+    return &Dumpperl;
+}
+
+#
+# dump the refs in the current dumper object.
+# expects same args as new() if called via package name.
+#
+sub Dumpperl {
+  my($s) = shift;
+  my(@out, $val, $name);
+  my($i) = 0;
+  local(@post);
+  init_refaddr_format();
+
+  $s = $s->new(@_) unless ref $s;
+
+  for $val (@{$s->{todump}}) {
+    my $out = "";
+    @post = ();
+    $name = $s->{names}[$i++];
+    if (defined $name) {
+      if ($name =~ /^[*](.*)$/) {
+	if (defined $val) {
+	  $name = (ref $val eq 'ARRAY') ? ( "\@" . $1 ) :
+		  (ref $val eq 'HASH')  ? ( "\%" . $1 ) :
+		  (ref $val eq 'CODE')  ? ( "\*" . $1 ) :
+					  ( "\$" . $1 ) ;
+	}
+	else {
+	  $name = "\$" . $1;
+	}
+      }
+      elsif ($name !~ /^\$/) {
+	$name = "\$" . $name;
+      }
+    }
+    else {
+      $name = "\$" . $s->{varname} . $i;
+    }
+
+    my $valstr;
+    {
+      local($s->{apad}) = $s->{apad};
+      $s->{apad} .= ' ' x (length($name) + 3) if $s->{indent} >= 2;
+      $valstr = $s->_dump($val, $name);
+    }
+
+    $valstr = "$name = " . $valstr . ';' if @post or !$s->{terse};
+    $out .= $s->{pad} . $valstr . $s->{sep};
+    $out .= $s->{pad} . join(';' . $s->{sep} . $s->{pad}, @post) 
+      . ';' . $s->{sep} if @post;
+
+    push @out, $out;
+  }
+  return wantarray ? @out : join('', @out);
+}
+
+#
+# twist, toil and turn;
+# and recurse, of course.
+# sometimes sordidly;
+# and curse if no recourse.
+#
+sub _dump {
+  my($s, $val, $name) = @_;
+  my($sname);
+  my($out, $realpack, $realtype, $type, $ipad, $id, $blesspad);
+
+  $type = ref $val;
+  $out = "";
+
+  if ($type) {
+
+    # Call the freezer method if it's specified and the object has the
+    # method.  Trap errors and warn() instead of die()ing, like the XS
+    # implementation.
+    my $freezer = $s->{freezer};
+    if ($freezer and UNIVERSAL::can($val, $freezer)) {
+      eval { $val->$freezer() };
+      warn "WARNING(Freezer method call failed): $@" if $@;
+    }
+
+    require Scalar::Util;
+    $realpack = Scalar::Util::blessed($val);
+    $realtype = $realpack ? Scalar::Util::reftype($val) : ref $val;
+    $id = format_refaddr($val);
+
+    # if it has a name, we need to either look it up, or keep a tab
+    # on it so we know when we hit it later
+    if (defined($name) and length($name)) {
+      # keep a tab on it so that we dont fall into recursive pit
+      if (exists $s->{seen}{$id}) {
+#	if ($s->{expdepth} < $s->{level}) {
+	  if ($s->{purity} and $s->{level} > 0) {
+	    $out = ($realtype eq 'HASH')  ? '{}' :
+	      ($realtype eq 'ARRAY') ? '[]' :
+		'do{my $o}' ;
+	    push @post, $name . " = " . $s->{seen}{$id}[0];
+	  }
+	  else {
+	    $out = $s->{seen}{$id}[0];
+	    if ($name =~ /^([\@\%])/) {
+	      my $start = $1;
+	      if ($out =~ /^\\$start/) {
+		$out = substr($out, 1);
+	      }
+	      else {
+		$out = $start . '{' . $out . '}';
+	      }
+	    }
+          }
+	  return $out;
+#        }
+      }
+      else {
+        # store our name
+        $s->{seen}{$id} = [ (($name =~ /^[@%]/)     ? ('\\' . $name ) :
+			     ($realtype eq 'CODE' and
+			      $name =~ /^[*](.*)$/) ? ('\\&' . $1 )   :
+			     $name          ),
+			    $val ];
+      }
+    }
+
+    if ($realpack and $realpack eq 'Regexp') {
+	$out = "$val";
+	$out =~ s,/,\\/,g;
+	return "qr/$out/";
+    }
+
+    # If purity is not set and maxdepth is set, then check depth: 
+    # if we have reached maximum depth, return the string
+    # representation of the thing we are currently examining
+    # at this depth (i.e., 'Foo=ARRAY(0xdeadbeef)'). 
+    if (!$s->{purity}
+	and $s->{maxdepth} > 0
+	and $s->{level} >= $s->{maxdepth})
+    {
+      return qq['$val'];
+    }
+
+    # we have a blessed ref
+    if ($realpack) {
+      $out = $s->{'bless'} . '( ';
+      $blesspad = $s->{apad};
+      $s->{apad} .= '       ' if ($s->{indent} >= 2);
+    }
+
+    $s->{level}++;
+    $ipad = $s->{xpad} x $s->{level};
+
+    if ($realtype eq 'SCALAR' || $realtype eq 'REF') {
+      if ($realpack) {
+	$out .= 'do{\\(my $o = ' . $s->_dump($$val, "\${$name}") . ')}';
+      }
+      else {
+	$out .= '\\' . $s->_dump($$val, "\${$name}");
+      }
+    }
+    elsif ($realtype eq 'GLOB') {
+	$out .= '\\' . $s->_dump($$val, "*{$name}");
+    }
+    elsif ($realtype eq 'ARRAY') {
+      my($v, $pad, $mname);
+      my($i) = 0;
+      $out .= ($name =~ /^\@/) ? '(' : '[';
+      $pad = $s->{sep} . $s->{pad} . $s->{apad};
+      ($name =~ /^\@(.*)$/) ? ($mname = "\$" . $1) : 
+	# omit -> if $foo->[0]->{bar}, but not ${$foo->[0]}->{bar}
+	($name =~ /^\\?[\%\@\*\$][^{].*[]}]$/) ? ($mname = $name) :
+	  ($mname = $name . '->');
+      $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/;
+      for $v (@$val) {
+	$sname = $mname . '[' . $i . ']';
+	$out .= $pad . $ipad . '#' . $i if $s->{indent} >= 3;
+	$out .= $pad . $ipad . $s->_dump($v, $sname);
+	$out .= "," if $i++ < $#$val;
+      }
+      $out .= $pad . ($s->{xpad} x ($s->{level} - 1)) if $i;
+      $out .= ($name =~ /^\@/) ? ')' : ']';
+    }
+    elsif ($realtype eq 'HASH') {
+      my($k, $v, $pad, $lpad, $mname, $pair);
+      $out .= ($name =~ /^\%/) ? '(' : '{';
+      $pad = $s->{sep} . $s->{pad} . $s->{apad};
+      $lpad = $s->{apad};
+      $pair = $s->{pair};
+      ($name =~ /^\%(.*)$/) ? ($mname = "\$" . $1) :
+	# omit -> if $foo->[0]->{bar}, but not ${$foo->[0]}->{bar}
+	($name =~ /^\\?[\%\@\*\$][^{].*[]}]$/) ? ($mname = $name) :
+	  ($mname = $name . '->');
+      $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/;
+      my ($sortkeys, $keys, $key) = ("$s->{sortkeys}");
+      if ($sortkeys) {
+	if (ref($s->{sortkeys}) eq 'CODE') {
+	  $keys = $s->{sortkeys}($val);
+	  unless (ref($keys) eq 'ARRAY') {
+	    carp "Sortkeys subroutine did not return ARRAYREF";
+	    $keys = [];
+	  }
+	}
+	else {
+	  $keys = [ sort keys %$val ];
+	}
+      }
+      while (($k, $v) = ! $sortkeys ? (each %$val) :
+	     @$keys ? ($key = shift(@$keys), $val->{$key}) :
+	     () ) 
+      {
+	my $nk = $s->_dump($k, "");
+	$nk = $1 if !$s->{quotekeys} and $nk =~ /^[\"\']([A-Za-z_]\w*)[\"\']$/;
+	$sname = $mname . '{' . $nk . '}';
+	$out .= $pad . $ipad . $nk . $pair;
+
+	# temporarily alter apad
+	$s->{apad} .= (" " x (length($nk) + 4)) if $s->{indent} >= 2;
+	$out .= $s->_dump($val->{$k}, $sname) . ",";
+	$s->{apad} = $lpad if $s->{indent} >= 2;
+      }
+      if (substr($out, -1) eq ',') {
+	chop $out;
+	$out .= $pad . ($s->{xpad} x ($s->{level} - 1));
+      }
+      $out .= ($name =~ /^\%/) ? ')' : '}';
+    }
+    elsif ($realtype eq 'CODE') {
+      if ($s->{deparse}) {
+	require B::Deparse;
+	my $sub =  'sub ' . (B::Deparse->new)->coderef2text($val);
+	$pad    =  $s->{sep} . $s->{pad} . $s->{apad} . $s->{xpad} x ($s->{level} - 1);
+	$sub    =~ s/\n/$pad/gse;
+	$out   .=  $sub;
+      } else {
+        $out .= 'sub { "DUMMY" }';
+        carp "Encountered CODE ref, using dummy placeholder" if $s->{purity};
+      }
+    }
+    else {
+      croak "Can\'t handle $realtype type.";
+    }
+    
+    if ($realpack) { # we have a blessed ref
+      $out .= ', \'' . $realpack . '\'' . ' )';
+      $out .= '->' . $s->{toaster} . '()'  if $s->{toaster} ne '';
+      $s->{apad} = $blesspad;
+    }
+    $s->{level}--;
+
+  }
+  else {                                 # simple scalar
+
+    my $ref = \$_[1];
+    # first, catalog the scalar
+    if ($name ne '') {
+      $id = format_refaddr($ref);
+      if (exists $s->{seen}{$id}) {
+        if ($s->{seen}{$id}[2]) {
+	  $out = $s->{seen}{$id}[0];
+	  #warn "[<$out]\n";
+	  return "\${$out}";
+	}
+      }
+      else {
+	#warn "[>\\$name]\n";
+	$s->{seen}{$id} = ["\\$name", $ref];
+      }
+    }
+    if (ref($ref) eq 'GLOB' or "$ref" =~ /=GLOB\([^()]+\)$/) {  # glob
+      my $name = substr($val, 1);
+      if ($name =~ /^[A-Za-z_][\w:]*$/) {
+	$name =~ s/^main::/::/;
+	$sname = $name;
+      }
+      else {
+	$sname = $s->_dump($name, "");
+	$sname = '{' . $sname . '}';
+      }
+      if ($s->{purity}) {
+	my $k;
+	local ($s->{level}) = 0;
+	for $k (qw(SCALAR ARRAY HASH)) {
+	  my $gval = *$val{$k};
+	  next unless defined $gval;
+	  next if $k eq "SCALAR" && ! defined $$gval;  # always there
+
+	  # _dump can push into @post, so we hold our place using $postlen
+	  my $postlen = scalar @post;
+	  $post[$postlen] = "\*$sname = ";
+	  local ($s->{apad}) = " " x length($post[$postlen]) if $s->{indent} >= 2;
+	  $post[$postlen] .= $s->_dump($gval, "\*$sname\{$k\}");
+	}
+      }
+      $out .= '*' . $sname;
+    }
+    elsif (!defined($val)) {
+      $out .= "undef";
+    }
+    elsif ($val =~ /^(?:0|-?[1-9]\d{0,8})\z/) { # safe decimal number
+      $out .= $val;
+    }
+    else {				 # string
+      if ($s->{useqq} or $val =~ tr/\0-\377//c) {
+        # Fall back to qq if there's unicode
+	$out .= qquote($val, $s->{useqq});
+      }
+      else {
+	$val =~ s/([\\\'])/\\$1/g;
+	$out .= '\'' . $val .  '\'';
+      }
+    }
+  }
+  if ($id) {
+    # if we made it this far, $id was added to seen list at current
+    # level, so remove it to get deep copies
+    if ($s->{deepcopy}) {
+      delete($s->{seen}{$id});
+    }
+    elsif ($name) {
+      $s->{seen}{$id}[2] = 1;
+    }
+  }
+  return $out;
+}
+  
+#
+# non-OO style of earlier version
+#
+sub Dumper {
+  return Data::Dumper->Dump([@_]);
+}
+
+# compat stub
+sub DumperX {
+  return Data::Dumper->Dumpxs([@_], []);
+}
+
+sub Dumpf { return Data::Dumper->Dump(@_) }
+
+sub Dumpp { print Data::Dumper->Dump(@_) }
+
+#
+# reset the "seen" cache 
+#
+sub Reset {
+  my($s) = shift;
+  $s->{seen} = {};
+  return $s;
+}
+
+sub Indent {
+  my($s, $v) = @_;
+  if (defined($v)) {
+    if ($v == 0) {
+      $s->{xpad} = "";
+      $s->{sep} = "";
+    }
+    else {
+      $s->{xpad} = "  ";
+      $s->{sep} = "\n";
+    }
+    $s->{indent} = $v;
+    return $s;
+  }
+  else {
+    return $s->{indent};
+  }
+}
+
+sub Pair {
+    my($s, $v) = @_;
+    defined($v) ? (($s->{pair} = $v), return $s) : $s->{pair};
+}
+
+sub Pad {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{pad} = $v), return $s) : $s->{pad};
+}
+
+sub Varname {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{varname} = $v), return $s) : $s->{varname};
+}
+
+sub Purity {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{purity} = $v), return $s) : $s->{purity};
+}
+
+sub Useqq {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{useqq} = $v), return $s) : $s->{useqq};
+}
+
+sub Terse {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{terse} = $v), return $s) : $s->{terse};
+}
+
+sub Freezer {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{freezer} = $v), return $s) : $s->{freezer};
+}
+
+sub Toaster {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{toaster} = $v), return $s) : $s->{toaster};
+}
+
+sub Deepcopy {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{deepcopy} = $v), return $s) : $s->{deepcopy};
+}
+
+sub Quotekeys {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{quotekeys} = $v), return $s) : $s->{quotekeys};
+}
+
+sub Bless {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{'bless'} = $v), return $s) : $s->{'bless'};
+}
+
+sub Maxdepth {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{'maxdepth'} = $v), return $s) : $s->{'maxdepth'};
+}
+
+sub Useperl {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{'useperl'} = $v), return $s) : $s->{'useperl'};
+}
+
+sub Sortkeys {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{'sortkeys'} = $v), return $s) : $s->{'sortkeys'};
+}
+
+sub Deparse {
+  my($s, $v) = @_;
+  defined($v) ? (($s->{'deparse'} = $v), return $s) : $s->{'deparse'};
+}
+
+# used by qquote below
+my %esc = (  
+    "\a" => "\\a",
+    "\b" => "\\b",
+    "\t" => "\\t",
+    "\n" => "\\n",
+    "\f" => "\\f",
+    "\r" => "\\r",
+    "\e" => "\\e",
+);
+
+# put a string value in double quotes
+sub qquote {
+  local($_) = shift;
+  s/([\\\"\@\$])/\\$1/g;
+  my $bytes; { use bytes; $bytes = length }
+  s/([^\x00-\x7f])/'\x{'.sprintf("%x",ord($1)).'}'/ge if $bytes > length;
+  return qq("$_") unless 
+    /[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~]/;  # fast exit
+
+  my $high = shift || "";
+  s/([\a\b\t\n\f\r\e])/$esc{$1}/g;
+
+  if (ord('^')==94)  { # ascii
+    # no need for 3 digits in escape for these
+    s/([\0-\037])(?!\d)/'\\'.sprintf('%o',ord($1))/eg;
+    s/([\0-\037\177])/'\\'.sprintf('%03o',ord($1))/eg;
+    # all but last branch below not supported --BEHAVIOR SUBJECT TO CHANGE--
+    if ($high eq "iso8859") {
+      s/([\200-\240])/'\\'.sprintf('%o',ord($1))/eg;
+    } elsif ($high eq "utf8") {
+#     use utf8;
+#     $str =~ s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge;
+    } elsif ($high eq "8bit") {
+        # leave it as it is
+    } else {
+      s/([\200-\377])/'\\'.sprintf('%03o',ord($1))/eg;
+      s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge;
+    }
+  }
+  else { # ebcdic
+      s{([^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~])(?!\d)}
+       {my $v = ord($1); '\\'.sprintf(($v <= 037 ? '%o' : '%03o'), $v)}eg;
+      s{([^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~])}
+       {'\\'.sprintf('%03o',ord($1))}eg;
+  }
+
+  return qq("$_");
+}
+
+# helper sub to sort hash keys in Perl < 5.8.0 where we don't have
+# access to sortsv() from XS
+sub _sortkeys { [ sort keys %{$_[0]} ] }
+
+1;
+__END__
+
+=head1 NAME
+
+Data::Dumper - stringified perl data structures, suitable for both printing and C<eval>
+
+=head1 SYNOPSIS
+
+    use Data::Dumper;
+
+    # simple procedural interface
+    print Dumper($foo, $bar);
+
+    # extended usage with names
+    print Data::Dumper->Dump([$foo, $bar], [qw(foo *ary)]);
+
+    # configuration variables
+    {
+      local $Data::Dumper::Purity = 1;
+      eval Data::Dumper->Dump([$foo, $bar], [qw(foo *ary)]);
+    }
+
+    # OO usage
+    $d = Data::Dumper->new([$foo, $bar], [qw(foo *ary)]);
+       ...
+    print $d->Dump;
+       ...
+    $d->Purity(1)->Terse(1)->Deepcopy(1);
+    eval $d->Dump;
+
+
+=head1 DESCRIPTION
+
+Given a list of scalars or reference variables, writes out their contents in
+perl syntax. The references can also be objects.  The contents of each
+variable is output in a single Perl statement.  Handles self-referential
+structures correctly.
+
+The return value can be C<eval>ed to get back an identical copy of the
+original reference structure.
+
+Any references that are the same as one of those passed in will be named
+C<$VAR>I<n> (where I<n> is a numeric suffix), and other duplicate references
+to substructures within C<$VAR>I<n> will be appropriately labeled using arrow
+notation.  You can specify names for individual values to be dumped if you
+use the C<Dump()> method, or you can change the default C<$VAR> prefix to
+something else.  See C<$Data::Dumper::Varname> and C<$Data::Dumper::Terse>
+below.
+
+The default output of self-referential structures can be C<eval>ed, but the
+nested references to C<$VAR>I<n> will be undefined, since a recursive
+structure cannot be constructed using one Perl statement.  You should set the
+C<Purity> flag to 1 to get additional statements that will correctly fill in
+these references.  Moreover, if C<eval>ed when strictures are in effect,
+you need to ensure that any variables it accesses are previously declared.
+
+In the extended usage form, the references to be dumped can be given
+user-specified names.  If a name begins with a C<*>, the output will 
+describe the dereferenced type of the supplied reference for hashes and
+arrays, and coderefs.  Output of names will be avoided where possible if
+the C<Terse> flag is set.
+
+In many cases, methods that are used to set the internal state of the
+object will return the object itself, so method calls can be conveniently
+chained together.
+
+Several styles of output are possible, all controlled by setting
+the C<Indent> flag.  See L<Configuration Variables or Methods> below 
+for details.
+
+
+=head2 Methods
+
+=over 4
+
+=item I<PACKAGE>->new(I<ARRAYREF [>, I<ARRAYREF]>)
+
+Returns a newly created C<Data::Dumper> object.  The first argument is an
+anonymous array of values to be dumped.  The optional second argument is an
+anonymous array of names for the values.  The names need not have a leading
+C<$> sign, and must be comprised of alphanumeric characters.  You can begin
+a name with a C<*> to specify that the dereferenced type must be dumped
+instead of the reference itself, for ARRAY and HASH references.
+
+The prefix specified by C<$Data::Dumper::Varname> will be used with a
+numeric suffix if the name for a value is undefined.
+
+Data::Dumper will catalog all references encountered while dumping the
+values. Cross-references (in the form of names of substructures in perl
+syntax) will be inserted at all possible points, preserving any structural
+interdependencies in the original set of values.  Structure traversal is
+depth-first,  and proceeds in order from the first supplied value to
+the last.
+
+=item I<$OBJ>->Dump  I<or>  I<PACKAGE>->Dump(I<ARRAYREF [>, I<ARRAYREF]>)
+
+Returns the stringified form of the values stored in the object (preserving
+the order in which they were supplied to C<new>), subject to the
+configuration options below.  In a list context, it returns a list
+of strings corresponding to the supplied values.
+
+The second form, for convenience, simply calls the C<new> method on its
+arguments before dumping the object immediately.
+
+=item I<$OBJ>->Seen(I<[HASHREF]>)
+
+Queries or adds to the internal table of already encountered references.
+You must use C<Reset> to explicitly clear the table if needed.  Such
+references are not dumped; instead, their names are inserted wherever they
+are encountered subsequently.  This is useful especially for properly
+dumping subroutine references.
+
+Expects an anonymous hash of name => value pairs.  Same rules apply for names
+as in C<new>.  If no argument is supplied, will return the "seen" list of
+name => value pairs, in a list context.  Otherwise, returns the object
+itself.
+
+=item I<$OBJ>->Values(I<[ARRAYREF]>)
+
+Queries or replaces the internal array of values that will be dumped.
+When called without arguments, returns the values.  Otherwise, returns the
+object itself.
+
+=item I<$OBJ>->Names(I<[ARRAYREF]>)
+
+Queries or replaces the internal array of user supplied names for the values
+that will be dumped.  When called without arguments, returns the names.
+Otherwise, returns the object itself.
+
+=item I<$OBJ>->Reset
+
+Clears the internal table of "seen" references and returns the object
+itself.
+
+=back
+
+=head2 Functions
+
+=over 4
+
+=item Dumper(I<LIST>)
+
+Returns the stringified form of the values in the list, subject to the
+configuration options below.  The values will be named C<$VAR>I<n> in the
+output, where I<n> is a numeric suffix.  Will return a list of strings
+in a list context.
+
+=back
+
+=head2 Configuration Variables or Methods
+
+Several configuration variables can be used to control the kind of output
+generated when using the procedural interface.  These variables are usually
+C<local>ized in a block so that other parts of the code are not affected by
+the change.  
+
+These variables determine the default state of the object created by calling
+the C<new> method, but cannot be used to alter the state of the object
+thereafter.  The equivalent method names should be used instead to query
+or set the internal state of the object.
+
+The method forms return the object itself when called with arguments,
+so that they can be chained together nicely.
+
+=over 4
+
+=item *
+
+$Data::Dumper::Indent  I<or>  I<$OBJ>->Indent(I<[NEWVAL]>)
+
+Controls the style of indentation.  It can be set to 0, 1, 2 or 3.  Style 0
+spews output without any newlines, indentation, or spaces between list
+items.  It is the most compact format possible that can still be called
+valid perl.  Style 1 outputs a readable form with newlines but no fancy
+indentation (each level in the structure is simply indented by a fixed
+amount of whitespace).  Style 2 (the default) outputs a very readable form
+which takes into account the length of hash keys (so the hash value lines
+up).  Style 3 is like style 2, but also annotates the elements of arrays
+with their index (but the comment is on its own line, so array output
+consumes twice the number of lines).  Style 2 is the default.
+
+=item *
+
+$Data::Dumper::Purity  I<or>  I<$OBJ>->Purity(I<[NEWVAL]>)
+
+Controls the degree to which the output can be C<eval>ed to recreate the
+supplied reference structures.  Setting it to 1 will output additional perl
+statements that will correctly recreate nested references.  The default is
+0.
+
+=item *
+
+$Data::Dumper::Pad  I<or>  I<$OBJ>->Pad(I<[NEWVAL]>)
+
+Specifies the string that will be prefixed to every line of the output.
+Empty string by default.
+
+=item *
+
+$Data::Dumper::Varname  I<or>  I<$OBJ>->Varname(I<[NEWVAL]>)
+
+Contains the prefix to use for tagging variable names in the output. The
+default is "VAR".
+
+=item *
+
+$Data::Dumper::Useqq  I<or>  I<$OBJ>->Useqq(I<[NEWVAL]>)
+
+When set, enables the use of double quotes for representing string values.
+Whitespace other than space will be represented as C<[\n\t\r]>, "unsafe"
+characters will be backslashed, and unprintable characters will be output as
+quoted octal integers.  Since setting this variable imposes a performance
+penalty, the default is 0.  C<Dump()> will run slower if this flag is set,
+since the fast XSUB implementation doesn't support it yet.
+
+=item *
+
+$Data::Dumper::Terse  I<or>  I<$OBJ>->Terse(I<[NEWVAL]>)
+
+When set, Data::Dumper will emit single, non-self-referential values as
+atoms/terms rather than statements.  This means that the C<$VAR>I<n> names
+will be avoided where possible, but be advised that such output may not
+always be parseable by C<eval>.
+
+=item *
+
+$Data::Dumper::Freezer  I<or>  $I<OBJ>->Freezer(I<[NEWVAL]>)
+
+Can be set to a method name, or to an empty string to disable the feature.
+Data::Dumper will invoke that method via the object before attempting to
+stringify it.  This method can alter the contents of the object (if, for
+instance, it contains data allocated from C), and even rebless it in a
+different package.  The client is responsible for making sure the specified
+method can be called via the object, and that the object ends up containing
+only perl data types after the method has been called.  Defaults to an empty
+string.
+
+If an object does not support the method specified (determined using
+UNIVERSAL::can()) then the call will be skipped.  If the method dies a
+warning will be generated.
+
+=item *
+
+$Data::Dumper::Toaster  I<or>  $I<OBJ>->Toaster(I<[NEWVAL]>)
+
+Can be set to a method name, or to an empty string to disable the feature.
+Data::Dumper will emit a method call for any objects that are to be dumped
+using the syntax C<bless(DATA, CLASS)-E<gt>METHOD()>.  Note that this means that
+the method specified will have to perform any modifications required on the
+object (like creating new state within it, and/or reblessing it in a
+different package) and then return it.  The client is responsible for making
+sure the method can be called via the object, and that it returns a valid
+object.  Defaults to an empty string.
+
+=item *
+
+$Data::Dumper::Deepcopy  I<or>  $I<OBJ>->Deepcopy(I<[NEWVAL]>)
+
+Can be set to a boolean value to enable deep copies of structures.
+Cross-referencing will then only be done when absolutely essential
+(i.e., to break reference cycles).  Default is 0.
+
+=item *
+
+$Data::Dumper::Quotekeys  I<or>  $I<OBJ>->Quotekeys(I<[NEWVAL]>)
+
+Can be set to a boolean value to control whether hash keys are quoted.
+A false value will avoid quoting hash keys when it looks like a simple
+string.  Default is 1, which will always enclose hash keys in quotes.
+
+=item *
+
+$Data::Dumper::Bless  I<or>  $I<OBJ>->Bless(I<[NEWVAL]>)
+
+Can be set to a string that specifies an alternative to the C<bless>
+builtin operator used to create objects.  A function with the specified
+name should exist, and should accept the same arguments as the builtin.
+Default is C<bless>.
+
+=item *
+
+$Data::Dumper::Pair  I<or>  $I<OBJ>->Pair(I<[NEWVAL]>)
+
+Can be set to a string that specifies the separator between hash keys
+and values. To dump nested hash, array and scalar values to JavaScript,
+use: C<$Data::Dumper::Pair = ' : ';>. Implementing C<bless> in JavaScript
+is left as an exercise for the reader.
+A function with the specified name exists, and accepts the same arguments
+as the builtin.
+
+Default is: C< =E<gt> >.
+
+=item *
+
+$Data::Dumper::Maxdepth  I<or>  $I<OBJ>->Maxdepth(I<[NEWVAL]>)
+
+Can be set to a positive integer that specifies the depth beyond which
+which we don't venture into a structure.  Has no effect when
+C<Data::Dumper::Purity> is set.  (Useful in debugger when we often don't
+want to see more than enough).  Default is 0, which means there is 
+no maximum depth. 
+
+=item *
+
+$Data::Dumper::Useperl  I<or>  $I<OBJ>->Useperl(I<[NEWVAL]>)
+
+Can be set to a boolean value which controls whether the pure Perl
+implementation of C<Data::Dumper> is used. The C<Data::Dumper> module is
+a dual implementation, with almost all functionality written in both
+pure Perl and also in XS ('C'). Since the XS version is much faster, it
+will always be used if possible. This option lets you override the
+default behavior, usually for testing purposes only. Default is 0, which
+means the XS implementation will be used if possible.
+
+=item *
+
+$Data::Dumper::Sortkeys  I<or>  $I<OBJ>->Sortkeys(I<[NEWVAL]>)
+
+Can be set to a boolean value to control whether hash keys are dumped in
+sorted order. A true value will cause the keys of all hashes to be
+dumped in Perl's default sort order. Can also be set to a subroutine
+reference which will be called for each hash that is dumped. In this
+case C<Data::Dumper> will call the subroutine once for each hash,
+passing it the reference of the hash. The purpose of the subroutine is
+to return a reference to an array of the keys that will be dumped, in
+the order that they should be dumped. Using this feature, you can
+control both the order of the keys, and which keys are actually used. In
+other words, this subroutine acts as a filter by which you can exclude
+certain keys from being dumped. Default is 0, which means that hash keys
+are not sorted.
+
+=item *
+
+$Data::Dumper::Deparse  I<or>  $I<OBJ>->Deparse(I<[NEWVAL]>)
+
+Can be set to a boolean value to control whether code references are
+turned into perl source code. If set to a true value, C<B::Deparse>
+will be used to get the source of the code reference. Using this option
+will force using the Perl implementation of the dumper, since the fast
+XSUB implementation doesn't support it.
+
+Caution : use this option only if you know that your coderefs will be
+properly reconstructed by C<B::Deparse>.
+
+=back
+
+=head2 Exports
+
+=over 4
+
+=item Dumper
+
+=back
+
+=head1 EXAMPLES
+
+Run these code snippets to get a quick feel for the behavior of this
+module.  When you are through with these examples, you may want to
+add or change the various configuration variables described above,
+to see their behavior.  (See the testsuite in the Data::Dumper
+distribution for more examples.)
+
+
+    use Data::Dumper;
+
+    package Foo;
+    sub new {bless {'a' => 1, 'b' => sub { return "foo" }}, $_[0]};
+
+    package Fuz;                       # a weird REF-REF-SCALAR object
+    sub new {bless \($_ = \ 'fu\'z'), $_[0]};
+
+    package main;
+    $foo = Foo->new;
+    $fuz = Fuz->new;
+    $boo = [ 1, [], "abcd", \*foo,
+             {1 => 'a', 023 => 'b', 0x45 => 'c'}, 
+             \\"p\q\'r", $foo, $fuz];
+
+    ########
+    # simple usage
+    ########
+
+    $bar = eval(Dumper($boo));
+    print($@) if $@;
+    print Dumper($boo), Dumper($bar);  # pretty print (no array indices)
+
+    $Data::Dumper::Terse = 1;          # don't output names where feasible
+    $Data::Dumper::Indent = 0;         # turn off all pretty print
+    print Dumper($boo), "\n";
+
+    $Data::Dumper::Indent = 1;         # mild pretty print
+    print Dumper($boo);
+
+    $Data::Dumper::Indent = 3;         # pretty print with array indices
+    print Dumper($boo);
+
+    $Data::Dumper::Useqq = 1;          # print strings in double quotes
+    print Dumper($boo);
+
+    $Data::Dumper::Pair = " : ";       # specify hash key/value separator
+    print Dumper($boo);
+
+
+    ########
+    # recursive structures
+    ########
+
+    @c = ('c');
+    $c = \@c;
+    $b = {};
+    $a = [1, $b, $c];
+    $b->{a} = $a;
+    $b->{b} = $a->[1];
+    $b->{c} = $a->[2];
+    print Data::Dumper->Dump([$a,$b,$c], [qw(a b c)]);
+
+
+    $Data::Dumper::Purity = 1;         # fill in the holes for eval
+    print Data::Dumper->Dump([$a, $b], [qw(*a b)]); # print as @a
+    print Data::Dumper->Dump([$b, $a], [qw(*b a)]); # print as %b
+
+
+    $Data::Dumper::Deepcopy = 1;       # avoid cross-refs
+    print Data::Dumper->Dump([$b, $a], [qw(*b a)]);
+
+
+    $Data::Dumper::Purity = 0;         # avoid cross-refs
+    print Data::Dumper->Dump([$b, $a], [qw(*b a)]);
+
+    ########
+    # deep structures
+    ########
+
+    $a = "pearl";
+    $b = [ $a ];
+    $c = { 'b' => $b };
+    $d = [ $c ];
+    $e = { 'd' => $d };
+    $f = { 'e' => $e };
+    print Data::Dumper->Dump([$f], [qw(f)]);
+
+    $Data::Dumper::Maxdepth = 3;       # no deeper than 3 refs down
+    print Data::Dumper->Dump([$f], [qw(f)]);
+
+
+    ########
+    # object-oriented usage
+    ########
+
+    $d = Data::Dumper->new([$a,$b], [qw(a b)]);
+    $d->Seen({'*c' => $c});            # stash a ref without printing it
+    $d->Indent(3);
+    print $d->Dump;
+    $d->Reset->Purity(0);              # empty the seen cache
+    print join "----\n", $d->Dump;
+
+
+    ########
+    # persistence
+    ########
+
+    package Foo;
+    sub new { bless { state => 'awake' }, shift }
+    sub Freeze {
+        my $s = shift;
+	print STDERR "preparing to sleep\n";
+	$s->{state} = 'asleep';
+	return bless $s, 'Foo::ZZZ';
+    }
+
+    package Foo::ZZZ;
+    sub Thaw {
+        my $s = shift;
+	print STDERR "waking up\n";
+	$s->{state} = 'awake';
+	return bless $s, 'Foo';
+    }
+
+    package Foo;
+    use Data::Dumper;
+    $a = Foo->new;
+    $b = Data::Dumper->new([$a], ['c']);
+    $b->Freezer('Freeze');
+    $b->Toaster('Thaw');
+    $c = $b->Dump;
+    print $c;
+    $d = eval $c;
+    print Data::Dumper->Dump([$d], ['d']);
+
+
+    ########
+    # symbol substitution (useful for recreating CODE refs)
+    ########
+
+    sub foo { print "foo speaking\n" }
+    *other = \&foo;
+    $bar = [ \&other ];
+    $d = Data::Dumper->new([\&other,$bar],['*other','bar']);
+    $d->Seen({ '*foo' => \&foo });
+    print $d->Dump;
+
+
+    ########
+    # sorting and filtering hash keys
+    ########
+
+    $Data::Dumper::Sortkeys = \&my_filter;
+    my $foo = { map { (ord, "$_$_$_") } 'I'..'Q' };
+    my $bar = { %$foo };
+    my $baz = { reverse %$foo };
+    print Dumper [ $foo, $bar, $baz ];
+
+    sub my_filter {
+        my ($hash) = @_;
+        # return an array ref containing the hash keys to dump
+        # in the order that you want them to be dumped
+        return [
+          # Sort the keys of %$foo in reverse numeric order
+            $hash eq $foo ? (sort {$b <=> $a} keys %$hash) :
+          # Only dump the odd number keys of %$bar
+            $hash eq $bar ? (grep {$_ % 2} keys %$hash) :
+          # Sort keys in default order for all other hashes
+            (sort keys %$hash)
+        ];
+    }
+
+=head1 BUGS
+
+Due to limitations of Perl subroutine call semantics, you cannot pass an
+array or hash.  Prepend it with a C<\> to pass its reference instead.  This
+will be remedied in time, now that Perl has subroutine prototypes.
+For now, you need to use the extended usage form, and prepend the
+name with a C<*> to output it as a hash or array.
+
+C<Data::Dumper> cheats with CODE references.  If a code reference is
+encountered in the structure being processed (and if you haven't set
+the C<Deparse> flag), an anonymous subroutine that
+contains the string '"DUMMY"' will be inserted in its place, and a warning
+will be printed if C<Purity> is set.  You can C<eval> the result, but bear
+in mind that the anonymous sub that gets created is just a placeholder.
+Someday, perl will have a switch to cache-on-demand the string
+representation of a compiled piece of code, I hope.  If you have prior
+knowledge of all the code refs that your data structures are likely
+to have, you can use the C<Seen> method to pre-seed the internal reference
+table and make the dumped output point to them, instead.  See L</EXAMPLES>
+above.
+
+The C<Useqq> and C<Deparse> flags makes Dump() run slower, since the
+XSUB implementation does not support them.
+
+SCALAR objects have the weirdest looking C<bless> workaround.
+
+Pure Perl version of C<Data::Dumper> escapes UTF-8 strings correctly
+only in Perl 5.8.0 and later.
+
+=head2 NOTE
+
+Starting from Perl 5.8.1 different runs of Perl will have different
+ordering of hash keys.  The change was done for greater security,
+see L<perlsec/"Algorithmic Complexity Attacks">.  This means that
+different runs of Perl will have different Data::Dumper outputs if
+the data contains hashes.  If you need to have identical Data::Dumper
+outputs from different runs of Perl, use the environment variable
+PERL_HASH_SEED, see L<perlrun/PERL_HASH_SEED>.  Using this restores
+the old (platform-specific) ordering: an even prettier solution might
+be to use the C<Sortkeys> filter of Data::Dumper.
+
+=head1 AUTHOR
+
+Gurusamy Sarathy        gsar@activestate.com
+
+Copyright (c) 1996-98 Gurusamy Sarathy. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 VERSION
+
+Version 2.121  (Aug 24 2003)
+
+=head1 SEE ALSO
+
+perl(1)
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Devel/DProf.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Devel/DProf.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Devel/DProf.pm	(revision 14489)
@@ -0,0 +1,213 @@
+use 5.006_001;
+
+=head1 NAME
+
+Devel::DProf - a Perl code profiler
+
+=head1 SYNOPSIS
+
+	perl -d:DProf test.pl
+
+=head1 DESCRIPTION
+
+The Devel::DProf package is a Perl code profiler.  This will collect
+information on the execution time of a Perl script and of the subs in that
+script.  This information can be used to determine which subroutines are
+using the most time and which subroutines are being called most often.  This
+information can also be used to create an execution graph of the script,
+showing subroutine relationships.
+
+To profile a Perl script run the perl interpreter with the B<-d> debugging
+switch.  The profiler uses the debugging hooks.  So to profile script
+F<test.pl> the following command should be used:
+
+	perl -d:DProf test.pl
+
+When the script terminates (or when the output buffer is filled) the
+profiler will dump the profile information to a file called
+F<tmon.out>.  A tool like I<dprofpp> can be used to interpret the
+information which is in that profile.  The following command will
+print the top 15 subroutines which used the most time:
+
+	dprofpp
+
+To print an execution graph of the subroutines in the script use the
+following command:
+
+	dprofpp -T
+
+Consult L<dprofpp> for other options.
+
+=head1 PROFILE FORMAT
+
+The old profile is a text file which looks like this:
+
+	#fOrTyTwO
+	$hz=100;
+	$XS_VERSION='DProf 19970606';
+	# All values are given in HZ
+	$rrun_utime=2; $rrun_stime=0; $rrun_rtime=7
+	PART2
+	+ 26 28 566822884 DynaLoader::import
+	- 26 28 566822884 DynaLoader::import
+	+ 27 28 566822885 main::bar
+	- 27 28 566822886 main::bar
+	+ 27 28 566822886 main::baz
+	+ 27 28 566822887 main::bar
+	- 27 28 566822888 main::bar
+	[....]
+
+The first line is the magic number.  The second line is the hertz value, or
+clock ticks, of the machine where the profile was collected.  The third line
+is the name and version identifier of the tool which created the profile.
+The fourth line is a comment.  The fifth line contains three variables
+holding the user time, system time, and realtime of the process while it was
+being profiled.  The sixth line indicates the beginning of the sub
+entry/exit profile section.
+
+The columns in B<PART2> are:
+
+	sub entry(+)/exit(-) mark
+	app's user time at sub entry/exit mark, in ticks
+	app's system time at sub entry/exit mark, in ticks
+	app's realtime at sub entry/exit mark, in ticks
+	fully-qualified sub name, when possible
+
+With newer perls another format is used, which may look like this:
+
+        #fOrTyTwO
+        $hz=10000;
+        $XS_VERSION='DProf 19971213';
+        # All values are given in HZ
+        $over_utime=5917; $over_stime=0; $over_rtime=5917;
+        $over_tests=10000;
+        $rrun_utime=1284; $rrun_stime=0; $rrun_rtime=1284;
+        $total_marks=6;
+
+        PART2
+        @ 406 0 406
+        & 2 main bar
+        + 2
+        @ 456 0 456
+        - 2
+        @ 1 0 1
+        & 3 main baz
+        + 3
+        @ 141 0 141
+        + 2
+        @ 141 0 141
+        - 2
+        @ 1 0 1
+        & 4 main foo
+        + 4
+        @ 142 0 142
+        + & Devel::DProf::write
+        @ 5 0 5
+        - & Devel::DProf::write
+
+(with high value of $ENV{PERL_DPROF_TICKS}).  
+
+New C<$over_*> values show the measured overhead of making $over_tests
+calls to the profiler These values are used by the profiler to
+subtract the overhead from the runtimes.
+
+The lines starting with C<@> mark time passed from the previous C<@>
+line.  The lines starting with C<&> introduce new subroutine I<id> and
+show the package and the subroutine name of this id.  Lines starting
+with C<+>, C<-> and C<*> mark entering and exit of subroutines by
+I<id>s, and C<goto &subr>.
+
+The I<old-style> C<+>- and C<->-lines are used to mark the overhead
+related to writing to profiler-output file.
+
+=head1 AUTOLOAD
+
+When Devel::DProf finds a call to an C<&AUTOLOAD> subroutine it looks at the
+C<$AUTOLOAD> variable to find the real name of the sub being called.  See
+L<perlsub/"Autoloading">.
+
+=head1 ENVIRONMENT
+
+C<PERL_DPROF_BUFFER> sets size of output buffer in words.  Defaults to 2**14.
+
+C<PERL_DPROF_TICKS> sets number of ticks per second on some systems where
+a replacement for times() is used.  Defaults to the value of C<HZ> macro.
+
+C<PERL_DPROF_OUT_FILE_NAME> sets the name of the output file.  If not set,
+defaults to tmon.out.
+
+=head1 BUGS
+
+Builtin functions cannot be measured by Devel::DProf.
+
+With a newer Perl DProf relies on the fact that the numeric slot of
+$DB::sub contains an address of a subroutine.  Excessive manipulation
+of this variable may overwrite this slot, as in
+
+  $DB::sub = 'current_sub';
+  ...
+  $addr = $DB::sub + 0;
+
+will set this numeric slot to numeric value of the string
+C<current_sub>, i.e., to C<0>.  This will cause a segfault on the exit
+from this subroutine.  Note that the first assignment above does not
+change the numeric slot (it will I<mark> it as invalid, but will not
+write over it).
+
+Another problem is that if a subroutine exits using goto(LABEL),
+last(LABEL) or next(LABEL) then perl may crash or Devel::DProf will die
+with the error:
+
+   panic: Devel::DProf inconsistent subroutine return
+
+For example, this code will break under Devel::DProf:
+
+   sub foo {
+     last FOO;
+   }
+   FOO: {
+     foo();
+   }
+
+A pattern like this is used by Test::More's skip() function, for
+example.  See L<perldiag> for more details.
+
+Mail bug reports and feature requests to the perl5-porters mailing list at
+F<E<lt>perl5-porters@perl.orgE<gt>>.
+
+=head1 SEE ALSO
+
+L<perl>, L<dprofpp>, times(2)
+
+=cut
+
+# This sub is needed for calibration.
+package Devel::DProf;
+
+sub NONESUCH_noxs {
+	return $Devel::DProf::VERSION;
+}
+
+package DB;
+
+#
+# As of perl5.003_20, &DB::sub stub is not needed (some versions
+# even had problems if stub was redefined with XS version).
+#
+
+# disable DB single-stepping
+BEGIN { $single = 0; }
+
+# This sub is needed during startup.
+sub DB { 
+#	print "nonXS DBDB\n";
+}
+
+use XSLoader ();
+
+$Devel::DProf::VERSION = '20050603.00';  # this version not authorized by
+				         # Dean Roehrich. See "Changes" file.
+
+XSLoader::load 'Devel::DProf', $Devel::DProf::VERSION;
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Devel/PPPort.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Devel/PPPort.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Devel/PPPort.pm	(revision 14489)
@@ -0,0 +1,5892 @@
+################################################################################
+#
+#  !!!!! Do NOT edit this file directly! -- Edit PPPort_pm.PL instead. !!!!!
+#
+################################################################################
+#
+#  Perl/Pollution/Portability
+#
+################################################################################
+#
+#  $Revision: 36 $
+#  $Author: mhx $
+#  $Date: 2005/06/25 17:56:28 +0200 $
+#
+################################################################################
+#
+#  Version 3.x, Copyright (C) 2004-2005, Marcus Holland-Moritz.
+#  Version 2.x, Copyright (C) 2001, Paul Marquess.
+#  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the same terms as Perl itself.
+#
+################################################################################
+
+=head1 NAME
+
+Devel::PPPort - Perl/Pollution/Portability
+
+=head1 SYNOPSIS
+
+    Devel::PPPort::WriteFile();   # defaults to ./ppport.h
+    Devel::PPPort::WriteFile('someheader.h');
+
+=head1 DESCRIPTION
+
+Perl's API has changed over time, gaining new features, new functions,
+increasing its flexibility, and reducing the impact on the C namespace
+environment (reduced pollution). The header file written by this module,
+typically F<ppport.h>, attempts to bring some of the newer Perl API
+features to older versions of Perl, so that you can worry less about
+keeping track of old releases, but users can still reap the benefit.
+
+C<Devel::PPPort> contains a single function, called C<WriteFile>. Its
+only purpose is to write the F<ppport.h> C header file. This file
+contains a series of macros and, if explicitly requested, functions that
+allow XS modules to be built using older versions of Perl. Currently,
+Perl versions from 5.003 to 5.9.3 are supported.
+
+This module is used by C<h2xs> to write the file F<ppport.h>.
+
+=head2 Why use ppport.h?
+
+You should use F<ppport.h> in modern code so that your code will work
+with the widest range of Perl interpreters possible, without significant
+additional work.
+
+You should attempt older code to fully use F<ppport.h>, because the
+reduced pollution of newer Perl versions is an important thing. It's so
+important that the old polluting ways of original Perl modules will not be
+supported very far into the future, and your module will almost certainly
+break! By adapting to it now, you'll gain compatibility and a sense of
+having done the electronic ecology some good.
+
+=head2 How to use ppport.h
+
+Don't direct the users of your module to download C<Devel::PPPort>.
+They are most probably no XS writers. Also, don't make F<ppport.h>
+optional. Rather, just take the most recent copy of F<ppport.h> that
+you can find (e.g. by generating it with the latest C<Devel::PPPort>
+release from CPAN), copy it into your project, adjust your project to
+use it, and distribute the header along with your module.
+
+=head2 Running ppport.h
+
+But F<ppport.h> is more than just a C header. It's also a Perl script
+that can check your source code. It will suggest hints and portability
+notes, and can even make suggestions on how to change your code. You
+can run it like any other Perl program:
+
+    perl ppport.h [options] [files]
+
+It also has embedded documentation, so you can use
+
+    perldoc ppport.h
+
+to find out more about how to use it.
+
+=head1 FUNCTIONS
+
+=head2 WriteFile
+
+C<WriteFile> takes one optional argument. When called with one
+argument, it expects to be passed a filename. When called with
+no arguments, it defaults to the filename F<ppport.h>.
+
+The function returns a true value if the file was written successfully.
+Otherwise it returns a false value.
+
+=head1 COMPATIBILITY
+
+F<ppport.h> supports Perl versions from 5.003 to 5.9.3
+in threaded and non-threaded configurations.
+
+=head2 Provided Perl compatibility API
+
+The header file written by this module, typically F<ppport.h>, provides
+access to the following elements of the Perl API that is not available
+in older Perl releases:
+
+    _aMY_CXT
+    _pMY_CXT
+    aMY_CXT
+    aMY_CXT_
+    aTHX
+    aTHX_
+    AvFILLp
+    boolSV
+    call_argv
+    call_method
+    call_pv
+    call_sv
+    CopFILE
+    CopFILE_set
+    CopFILEAV
+    CopFILEGV
+    CopFILEGV_set
+    CopFILESV
+    CopSTASH
+    CopSTASH_eq
+    CopSTASH_set
+    CopSTASHPV
+    CopSTASHPV_set
+    CopyD
+    dAX
+    DEFSV
+    dITEMS
+    dMY_CXT
+    dMY_CXT_SV
+    dNOOP
+    dTHR
+    dTHX
+    dTHXa
+    dTHXoa
+    dUNDERBAR
+    dXCPT
+    dXSTARG
+    END_EXTERN_C
+    ERRSV
+    eval_pv
+    eval_sv
+    EXTERN_C
+    get_av
+    get_cv
+    get_hv
+    get_sv
+    grok_bin
+    grok_hex
+    grok_number
+    GROK_NUMERIC_RADIX
+    grok_numeric_radix
+    grok_oct
+    gv_stashpvn
+    IN_LOCALE
+    IN_LOCALE_COMPILETIME
+    IN_LOCALE_RUNTIME
+    IN_PERL_COMPILETIME
+    INT2PTR
+    IS_NUMBER_GREATER_THAN_UV_MAX
+    IS_NUMBER_IN_UV
+    IS_NUMBER_INFINITY
+    IS_NUMBER_NAN
+    IS_NUMBER_NEG
+    IS_NUMBER_NOT_INT
+    IVdf
+    IVSIZE
+    IVTYPE
+    memEQ
+    memNE
+    MoveD
+    mPUSHi
+    mPUSHn
+    mPUSHp
+    mPUSHu
+    mXPUSHi
+    mXPUSHn
+    mXPUSHp
+    mXPUSHu
+    MY_CXT
+    MY_CXT_CLONE
+    MY_CXT_INIT
+    newCONSTSUB
+    newRV_inc
+    newRV_noinc
+    newSVpvn
+    newSVuv
+    NOOP
+    NUM2PTR
+    NVef
+    NVff
+    NVgf
+    NVTYPE
+    PERL_BCDVERSION
+    PERL_GCC_BRACE_GROUPS_FORBIDDEN
+    PERL_INT_MAX
+    PERL_INT_MIN
+    PERL_LONG_MAX
+    PERL_LONG_MIN
+    PERL_MAGIC_arylen
+    PERL_MAGIC_backref
+    PERL_MAGIC_bm
+    PERL_MAGIC_collxfrm
+    PERL_MAGIC_dbfile
+    PERL_MAGIC_dbline
+    PERL_MAGIC_defelem
+    PERL_MAGIC_env
+    PERL_MAGIC_envelem
+    PERL_MAGIC_ext
+    PERL_MAGIC_fm
+    PERL_MAGIC_glob
+    PERL_MAGIC_isa
+    PERL_MAGIC_isaelem
+    PERL_MAGIC_mutex
+    PERL_MAGIC_nkeys
+    PERL_MAGIC_overload
+    PERL_MAGIC_overload_elem
+    PERL_MAGIC_overload_table
+    PERL_MAGIC_pos
+    PERL_MAGIC_qr
+    PERL_MAGIC_regdata
+    PERL_MAGIC_regdatum
+    PERL_MAGIC_regex_global
+    PERL_MAGIC_shared
+    PERL_MAGIC_shared_scalar
+    PERL_MAGIC_sig
+    PERL_MAGIC_sigelem
+    PERL_MAGIC_substr
+    PERL_MAGIC_sv
+    PERL_MAGIC_taint
+    PERL_MAGIC_tied
+    PERL_MAGIC_tiedelem
+    PERL_MAGIC_tiedscalar
+    PERL_MAGIC_utf8
+    PERL_MAGIC_uvar
+    PERL_MAGIC_uvar_elem
+    PERL_MAGIC_vec
+    PERL_MAGIC_vstring
+    PERL_QUAD_MAX
+    PERL_QUAD_MIN
+    PERL_REVISION
+    PERL_SCAN_ALLOW_UNDERSCORES
+    PERL_SCAN_DISALLOW_PREFIX
+    PERL_SCAN_GREATER_THAN_UV_MAX
+    PERL_SCAN_SILENT_ILLDIGIT
+    PERL_SHORT_MAX
+    PERL_SHORT_MIN
+    PERL_SUBVERSION
+    PERL_UCHAR_MAX
+    PERL_UCHAR_MIN
+    PERL_UINT_MAX
+    PERL_UINT_MIN
+    PERL_ULONG_MAX
+    PERL_ULONG_MIN
+    PERL_UNUSED_DECL
+    PERL_UQUAD_MAX
+    PERL_UQUAD_MIN
+    PERL_USHORT_MAX
+    PERL_USHORT_MIN
+    PERL_VERSION
+    PL_compiling
+    PL_copline
+    PL_curcop
+    PL_curstash
+    PL_DBsingle
+    PL_DBsub
+    PL_debstash
+    PL_defgv
+    PL_diehook
+    PL_dirty
+    PL_dowarn
+    PL_errgv
+    PL_hexdigit
+    PL_hints
+    PL_na
+    PL_no_modify
+    PL_perl_destruct_level
+    PL_perldb
+    PL_ppaddr
+    PL_rsfp
+    PL_rsfp_filters
+    PL_stack_base
+    PL_stack_sp
+    PL_stdingv
+    PL_Sv
+    PL_sv_arenaroot
+    PL_sv_no
+    PL_sv_undef
+    PL_sv_yes
+    PL_tainted
+    PL_tainting
+    pMY_CXT
+    pMY_CXT_
+    Poison
+    pTHX
+    pTHX_
+    PTR2IV
+    PTR2NV
+    PTR2ul
+    PTR2UV
+    PTRV
+    PUSHmortal
+    PUSHu
+    SAVE_DEFSV
+    START_EXTERN_C
+    START_MY_CXT
+    STMT_END
+    STMT_START
+    sv_2pv_nolen
+    sv_2pvbyte
+    sv_2uv
+    sv_catpv_mg
+    sv_catpvf_mg
+    sv_catpvf_mg_nocontext
+    sv_catpvn_mg
+    sv_catpvn_nomg
+    sv_catsv_mg
+    sv_catsv_nomg
+    sv_pvn
+    sv_pvn_force
+    sv_pvn_nomg
+    sv_setiv_mg
+    sv_setnv_mg
+    sv_setpv_mg
+    sv_setpvf_mg
+    sv_setpvf_mg_nocontext
+    sv_setpvn_mg
+    sv_setsv_mg
+    sv_setsv_nomg
+    sv_setuv
+    sv_setuv_mg
+    sv_usepvn_mg
+    sv_uv
+    sv_vcatpvf
+    sv_vcatpvf_mg
+    sv_vsetpvf
+    sv_vsetpvf_mg
+    SvGETMAGIC
+    SvIV_nomg
+    SvPV_force_nomg
+    SvPV_nolen
+    SvPV_nomg
+    SvPVbyte
+    SvUV
+    SvUV_nomg
+    SvUVX
+    SvUVx
+    SvUVXx
+    UNDERBAR
+    UVof
+    UVSIZE
+    UVTYPE
+    UVuf
+    UVXf
+    UVxf
+    vnewSVpvf
+    XCPT_CATCH
+    XCPT_RETHROW
+    XCPT_TRY_END
+    XCPT_TRY_START
+    XPUSHmortal
+    XPUSHu
+    XSRETURN_UV
+    XST_mUV
+    ZeroD
+
+=head2 Perl API not supported by ppport.h
+
+There is still a big part of the API not supported by F<ppport.h>.
+Either because it doesn't make sense to back-port that part of the API,
+or simply because it hasn't been implemented yet. Patches welcome!
+
+Here's a list of the currently unsupported API, and also the version of
+Perl below which it is unsupported:
+
+=over 4
+
+=item perl 5.9.3
+
+  SvMAGIC_set
+  SvRV_set
+  SvSTASH_set
+  SvUV_set
+  av_arylen_p
+  dAXMARK
+  hv_eiter_p
+  hv_eiter_set
+  hv_name_set
+  hv_placeholders_get
+  hv_placeholders_p
+  hv_placeholders_set
+  hv_riter_p
+  hv_riter_set
+  is_utf8_string_loclen
+  newSVhek
+  newWHILEOP
+  stashpv_hvname_match
+
+=item perl 5.9.2
+
+  SvPVbyte_force
+  find_rundefsvoffset
+  gv_fetchpvn_flags
+  gv_fetchsv
+  op_refcnt_lock
+  op_refcnt_unlock
+  savesvpv
+  vnormal
+
+=item perl 5.9.1
+
+  hv_assert
+  hv_clear_placeholders
+  hv_scalar
+  scan_version
+  sv_2iv_flags
+  sv_2uv_flags
+
+=item perl 5.9.0
+
+  new_version
+  save_set_svflags
+  upg_version
+  vcmp
+  vnumify
+  vstringify
+
+=item perl 5.8.3
+
+  SvIsCOW
+  SvIsCOW_shared_hash
+
+=item perl 5.8.1
+
+  SvVOK
+  doing_taint
+  is_utf8_string_loc
+  packlist
+  save_bool
+  savestack_grow_cnt
+  scan_vstring
+  sv_cat_decode
+  sv_compile_2op
+  sv_setpviv
+  sv_setpviv_mg
+  unpackstring
+
+=item perl 5.8.0
+
+  hv_iternext_flags
+  hv_store_flags
+  is_utf8_idcont
+  nothreadhook
+
+=item perl 5.7.3
+
+  PerlIO_clearerr
+  PerlIO_close
+  PerlIO_eof
+  PerlIO_error
+  PerlIO_fileno
+  PerlIO_fill
+  PerlIO_flush
+  PerlIO_get_base
+  PerlIO_get_bufsiz
+  PerlIO_get_cnt
+  PerlIO_get_ptr
+  PerlIO_read
+  PerlIO_seek
+  PerlIO_set_cnt
+  PerlIO_set_ptrcnt
+  PerlIO_setlinebuf
+  PerlIO_stderr
+  PerlIO_stdin
+  PerlIO_stdout
+  PerlIO_tell
+  PerlIO_unread
+  PerlIO_write
+  SvLOCK
+  SvSHARE
+  SvUNLOCK
+  atfork_lock
+  atfork_unlock
+  custom_op_desc
+  custom_op_name
+  deb
+  debstack
+  debstackptrs
+  gv_fetchmeth_autoload
+  ibcmp_utf8
+  my_fork
+  my_socketpair
+  pack_cat
+  perl_destruct
+  pv_uni_display
+  regclass_swash
+  save_shared_pvref
+  savesharedpv
+  sortsv
+  sv_copypv
+  sv_magicext
+  sv_nolocking
+  sv_nosharing
+  sv_nounlocking
+  sv_recode_to_utf8
+  sv_uni_display
+  to_uni_fold
+  to_uni_lower
+  to_uni_title
+  to_uni_upper
+  to_utf8_case
+  to_utf8_fold
+  to_utf8_lower
+  to_utf8_title
+  to_utf8_upper
+  unpack_str
+  uvchr_to_utf8_flags
+  uvuni_to_utf8_flags
+  vdeb
+
+=item perl 5.7.2
+
+  calloc
+  getcwd_sv
+  init_tm
+  malloc
+  mfree
+  mini_mktime
+  my_atof2
+  my_strftime
+  op_null
+  realloc
+  sv_2pv_flags
+  sv_catpvn_flags
+  sv_catsv_flags
+  sv_pvn_force_flags
+  sv_setsv_flags
+  sv_utf8_upgrade_flags
+  swash_fetch
+
+=item perl 5.7.1
+
+  POPpbytex
+  SvUOK
+  bytes_from_utf8
+  csighandler
+  despatch_signals
+  do_openn
+  gv_handler
+  is_lvalue_sub
+  my_popen_list
+  newSVpvn_share
+  save_mortalizesv
+  save_padsv
+  scan_num
+  sv_force_normal_flags
+  sv_setref_uv
+  sv_unref_flags
+  sv_utf8_upgrade
+  utf8_length
+  utf8_to_uvchr
+  utf8_to_uvuni
+  utf8n_to_uvchr
+  utf8n_to_uvuni
+  uvchr_to_utf8
+  uvuni_to_utf8
+
+=item perl 5.6.1
+
+  apply_attrs_string
+  bytes_to_utf8
+  gv_efullname4
+  gv_fullname4
+  is_utf8_string
+  save_generic_pvref
+  utf16_to_utf8
+  utf16_to_utf8_reversed
+  utf8_to_bytes
+
+=item perl 5.6.0
+
+  SvIOK_UV
+  SvIOK_notUV
+  SvIOK_only_UV
+  SvPOK_only_UTF8
+  SvPVbyte_nolen
+  SvPVbytex
+  SvPVbytex_force
+  SvPVutf8
+  SvPVutf8_force
+  SvPVutf8_nolen
+  SvPVutf8x
+  SvPVutf8x_force
+  SvUTF8
+  SvUTF8_off
+  SvUTF8_on
+  av_delete
+  av_exists
+  call_atexit
+  cast_i32
+  cast_iv
+  cast_ulong
+  cast_uv
+  do_gv_dump
+  do_gvgv_dump
+  do_hv_dump
+  do_magic_dump
+  do_op_dump
+  do_open9
+  do_pmop_dump
+  do_sv_dump
+  dump_all
+  dump_eval
+  dump_form
+  dump_indent
+  dump_packsubs
+  dump_sub
+  dump_vindent
+  get_context
+  get_ppaddr
+  gv_dump
+  init_i18nl10n
+  init_i18nl14n
+  is_uni_alnum
+  is_uni_alnum_lc
+  is_uni_alnumc
+  is_uni_alnumc_lc
+  is_uni_alpha
+  is_uni_alpha_lc
+  is_uni_ascii
+  is_uni_ascii_lc
+  is_uni_cntrl
+  is_uni_cntrl_lc
+  is_uni_digit
+  is_uni_digit_lc
+  is_uni_graph
+  is_uni_graph_lc
+  is_uni_idfirst
+  is_uni_idfirst_lc
+  is_uni_lower
+  is_uni_lower_lc
+  is_uni_print
+  is_uni_print_lc
+  is_uni_punct
+  is_uni_punct_lc
+  is_uni_space
+  is_uni_space_lc
+  is_uni_upper
+  is_uni_upper_lc
+  is_uni_xdigit
+  is_uni_xdigit_lc
+  is_utf8_alnum
+  is_utf8_alnumc
+  is_utf8_alpha
+  is_utf8_ascii
+  is_utf8_char
+  is_utf8_cntrl
+  is_utf8_digit
+  is_utf8_graph
+  is_utf8_idfirst
+  is_utf8_lower
+  is_utf8_mark
+  is_utf8_print
+  is_utf8_punct
+  is_utf8_space
+  is_utf8_upper
+  is_utf8_xdigit
+  load_module
+  magic_dump
+  mess
+  my_atof
+  my_fflush_all
+  newANONATTRSUB
+  newATTRSUB
+  newMYSUB
+  newPADOP
+  newXS
+  newXSproto
+  new_collate
+  new_ctype
+  new_numeric
+  op_dump
+  perl_parse
+  pmop_dump
+  pv_display
+  re_intuit_start
+  re_intuit_string
+  reginitcolors
+  require_pv
+  safesyscalloc
+  safesysfree
+  safesysmalloc
+  safesysrealloc
+  save_I8
+  save_alloc
+  save_destructor
+  save_destructor_x
+  save_re_context
+  save_vptr
+  scan_bin
+  set_context
+  set_numeric_local
+  set_numeric_radix
+  set_numeric_standard
+  str_to_version
+  sv_2pvutf8
+  sv_2pvutf8_nolen
+  sv_force_normal
+  sv_len_utf8
+  sv_pos_b2u
+  sv_pos_u2b
+  sv_pv
+  sv_pvbyte
+  sv_pvbyten
+  sv_pvbyten_force
+  sv_pvutf8
+  sv_pvutf8n
+  sv_pvutf8n_force
+  sv_rvweaken
+  sv_utf8_decode
+  sv_utf8_downgrade
+  sv_utf8_encode
+  swash_init
+  tmps_grow
+  to_uni_lower_lc
+  to_uni_title_lc
+  to_uni_upper_lc
+  utf8_distance
+  utf8_hop
+  vcroak
+  vform
+  vload_module
+  vmess
+  vwarn
+  vwarner
+  warner
+
+=item perl 5.005_03
+
+  POPpx
+  get_vtbl
+  save_generic_svref
+
+=item perl 5.005
+
+  PL_modglobal
+  cx_dump
+  debop
+  debprofdump
+  fbm_compile
+  fbm_instr
+  get_op_descs
+  get_op_names
+  init_stacks
+  mg_length
+  mg_size
+  newHVhv
+  new_stackinfo
+  regdump
+  regexec_flags
+  regnext
+  runops_debug
+  runops_standard
+  save_hints
+  save_iv
+  save_threadsv
+  screaminstr
+  sv_iv
+  sv_nv
+  sv_peek
+  sv_true
+
+=item perl 5.004_05
+
+  do_binmode
+  save_aelem
+  save_helem
+
+=item perl 5.004
+
+  GIMME_V
+  G_VOID
+  HEf_SVKEY
+  HeHASH
+  HeKEY
+  HeKLEN
+  HePV
+  HeSVKEY
+  HeSVKEY_force
+  HeSVKEY_set
+  HeVAL
+  SvSetMagicSV
+  SvSetMagicSV_nosteal
+  SvSetSV_nosteal
+  SvTAINTED
+  SvTAINTED_off
+  SvTAINTED_on
+  block_gimme
+  call_list
+  cv_const_sv
+  delimcpy
+  do_open
+  form
+  gv_autoload4
+  gv_efullname3
+  gv_fetchmethod_autoload
+  gv_fullname3
+  hv_delayfree_ent
+  hv_delete_ent
+  hv_exists_ent
+  hv_fetch_ent
+  hv_free_ent
+  hv_iterkeysv
+  hv_ksplit
+  hv_store_ent
+  ibcmp_locale
+  my_failure_exit
+  my_memcmp
+  my_pclose
+  my_popen
+  newSVpvf
+  rsignal
+  rsignal_state
+  save_I16
+  save_gp
+  start_subparse
+  sv_catpvf
+  sv_catpvf_mg
+  sv_cmp_locale
+  sv_derived_from
+  sv_gets
+  sv_setpvf
+  sv_setpvf_mg
+  sv_taint
+  sv_tainted
+  sv_untaint
+  sv_vcatpvf
+  sv_vcatpvf_mg
+  sv_vcatpvfn
+  sv_vsetpvf
+  sv_vsetpvf_mg
+  sv_vsetpvfn
+  unsharepvn
+  vnewSVpvf
+
+=back
+
+=head1 BUGS
+
+If you find any bugs, C<Devel::PPPort> doesn't seem to build on your
+system or any of its tests fail, please use the CPAN Request Tracker
+at L<http://rt.cpan.org/> to create a ticket for the module.
+
+=head1 AUTHORS
+
+=over 2
+
+=item *
+
+Version 1.x of Devel::PPPort was written by Kenneth Albanowski.
+
+=item *
+
+Version 2.x was ported to the Perl core by Paul Marquess.
+
+=item *
+
+Version 3.x was ported back to CPAN by Marcus Holland-Moritz.
+
+=back
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (C) 2004-2005, Marcus Holland-Moritz.
+
+Version 2.x, Copyright (C) 2001, Paul Marquess.
+
+Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<h2xs>, L<ppport.h>.
+
+=cut
+
+package Devel::PPPort;
+
+require DynaLoader;
+use strict;
+use vars qw($VERSION @ISA $data);
+
+$VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.06_01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+
+@ISA = qw(DynaLoader);
+
+bootstrap Devel::PPPort;
+
+sub _init_data
+{
+  $data = do { local $/; <DATA> };
+  my $now = localtime;
+  my $pkg = 'Devel::PPPort';
+  $data =~ s/__PERL_VERSION__/$]/g;
+  $data =~ s/__VERSION__/$VERSION/g;
+  $data =~ s/__DATE__/$now/g;
+  $data =~ s/__PKG__/$pkg/g;
+  $data =~ s/^\|>//gm;
+}
+
+sub WriteFile
+{
+  my $file = shift || 'ppport.h';
+  defined $data or _init_data();
+  my $copy = $data;
+  $copy =~ s/\bppport\.h\b/$file/g;
+
+  open F, ">$file" or return undef;
+  print F $copy;
+  close F;
+
+  return 1;
+}
+
+1;
+
+__DATA__
+#if 0
+<<'SKIP';
+#endif
+/*
+----------------------------------------------------------------------
+
+    ppport.h -- Perl/Pollution/Portability Version __VERSION__
+
+    Automatically created by __PKG__ running under
+    perl __PERL_VERSION__ on __DATE__.
+
+    Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
+    includes in parts/inc/ instead.
+
+    Use 'perldoc ppport.h' to view the documentation below.
+
+----------------------------------------------------------------------
+
+SKIP
+
+|>=pod
+|>
+|>=head1 NAME
+|>
+|>ppport.h - Perl/Pollution/Portability version __VERSION__
+|>
+|>=head1 SYNOPSIS
+|>
+|>  perl ppport.h [options] [source files]
+|>
+|>  Searches current directory for files if no [source files] are given
+|>
+|>  --help                      show short help
+|>
+|>  --patch=file                write one patch file with changes
+|>  --copy=suffix               write changed copies with suffix
+|>  --diff=program              use diff program and options
+|>
+|>  --compat-version=version    provide compatibility with Perl version
+|>  --cplusplus                 accept C++ comments
+|>
+|>  --quiet                     don't output anything except fatal errors
+|>  --nodiag                    don't show diagnostics
+|>  --nohints                   don't show hints
+|>  --nochanges                 don't suggest changes
+|>  --nofilter                  don't filter input files
+|>
+|>  --list-provided             list provided API
+|>  --list-unsupported          list unsupported API
+|>  --api-info=name             show Perl API portability information
+|>
+|>=head1 COMPATIBILITY
+|>
+|>This version of F<ppport.h> is designed to support operation with Perl
+|>installations back to 5.003, and has been tested up to 5.9.3.
+|>
+|>=head1 OPTIONS
+|>
+|>=head2 --help
+|>
+|>Display a brief usage summary.
+|>
+|>=head2 --patch=I<file>
+|>
+|>If this option is given, a single patch file will be created if
+|>any changes are suggested. This requires a working diff program
+|>to be installed on your system.
+|>
+|>=head2 --copy=I<suffix>
+|>
+|>If this option is given, a copy of each file will be saved with
+|>the given suffix that contains the suggested changes. This does
+|>not require any external programs.
+|>
+|>If neither C<--patch> or C<--copy> are given, the default is to
+|>simply print the diffs for each file. This requires either
+|>C<Text::Diff> or a C<diff> program to be installed.
+|>
+|>=head2 --diff=I<program>
+|>
+|>Manually set the diff program and options to use. The default
+|>is to use C<Text::Diff>, when installed, and output unified
+|>context diffs.
+|>
+|>=head2 --compat-version=I<version>
+|>
+|>Tell F<ppport.h> to check for compatibility with the given
+|>Perl version. The default is to check for compatibility with Perl
+|>version 5.003. You can use this option to reduce the output
+|>of F<ppport.h> if you intend to be backward compatible only
+|>up to a certain Perl version.
+|>
+|>=head2 --cplusplus
+|>
+|>Usually, F<ppport.h> will detect C++ style comments and
+|>replace them with C style comments for portability reasons.
+|>Using this option instructs F<ppport.h> to leave C++
+|>comments untouched.
+|>
+|>=head2 --quiet
+|>
+|>Be quiet. Don't print anything except fatal errors.
+|>
+|>=head2 --nodiag
+|>
+|>Don't output any diagnostic messages. Only portability
+|>alerts will be printed.
+|>
+|>=head2 --nohints
+|>
+|>Don't output any hints. Hints often contain useful portability
+|>notes.
+|>
+|>=head2 --nochanges
+|>
+|>Don't suggest any changes. Only give diagnostic output and hints
+|>unless these are also deactivated.
+|>
+|>=head2 --nofilter
+|>
+|>Don't filter the list of input files. By default, files not looking
+|>like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
+|>
+|>=head2 --list-provided
+|>
+|>Lists the API elements for which compatibility is provided by
+|>F<ppport.h>. Also lists if it must be explicitly requested,
+|>if it has dependencies, and if there are hints for it.
+|>
+|>=head2 --list-unsupported
+|>
+|>Lists the API elements that are known not to be supported by
+|>F<ppport.h> and below which version of Perl they probably
+|>won't be available or work.
+|>
+|>=head2 --api-info=I<name>
+|>
+|>Show portability information for API elements matching I<name>.
+|>If I<name> is surrounded by slashes, it is interpreted as a regular
+|>expression.
+|>
+|>=head1 DESCRIPTION
+|>
+|>In order for a Perl extension (XS) module to be as portable as possible
+|>across differing versions of Perl itself, certain steps need to be taken.
+|>
+|>=over 4
+|>
+|>=item *
+|>
+|>Including this header is the first major one. This alone will give you
+|>access to a large part of the Perl API that hasn't been available in
+|>earlier Perl releases. Use
+|>
+|>    perl ppport.h --list-provided
+|>
+|>to see which API elements are provided by ppport.h.
+|>
+|>=item *
+|>
+|>You should avoid using deprecated parts of the API. For example, using
+|>global Perl variables without the C<PL_> prefix is deprecated. Also,
+|>some API functions used to have a C<perl_> prefix. Using this form is
+|>also deprecated. You can safely use the supported API, as F<ppport.h>
+|>will provide wrappers for older Perl versions.
+|>
+|>=item *
+|>
+|>If you use one of a few functions that were not present in earlier
+|>versions of Perl, and that can't be provided using a macro, you have
+|>to explicitly request support for these functions by adding one or
+|>more C<#define>s in your source code before the inclusion of F<ppport.h>.
+|>
+|>These functions will be marked C<explicit> in the list shown by
+|>C<--list-provided>.
+|>
+|>Depending on whether you module has a single or multiple files that
+|>use such functions, you want either C<static> or global variants.
+|>
+|>For a C<static> function, use:
+|>
+|>    #define NEED_function
+|>
+|>For a global function, use:
+|>
+|>    #define NEED_function_GLOBAL
+|>
+|>Note that you mustn't have more than one global request for one
+|>function in your project.
+|>
+|>    Function                  Static Request               Global Request
+|>    -----------------------------------------------------------------------------------------
+|>    eval_pv()                 NEED_eval_pv                 NEED_eval_pv_GLOBAL
+|>    grok_bin()                NEED_grok_bin                NEED_grok_bin_GLOBAL
+|>    grok_hex()                NEED_grok_hex                NEED_grok_hex_GLOBAL
+|>    grok_number()             NEED_grok_number             NEED_grok_number_GLOBAL
+|>    grok_numeric_radix()      NEED_grok_numeric_radix      NEED_grok_numeric_radix_GLOBAL
+|>    grok_oct()                NEED_grok_oct                NEED_grok_oct_GLOBAL
+|>    newCONSTSUB()             NEED_newCONSTSUB             NEED_newCONSTSUB_GLOBAL
+|>    newRV_noinc()             NEED_newRV_noinc             NEED_newRV_noinc_GLOBAL
+|>    sv_2pv_nolen()            NEED_sv_2pv_nolen            NEED_sv_2pv_nolen_GLOBAL
+|>    sv_2pvbyte()              NEED_sv_2pvbyte              NEED_sv_2pvbyte_GLOBAL
+|>    sv_catpvf_mg()            NEED_sv_catpvf_mg            NEED_sv_catpvf_mg_GLOBAL
+|>    sv_catpvf_mg_nocontext()  NEED_sv_catpvf_mg_nocontext  NEED_sv_catpvf_mg_nocontext_GLOBAL
+|>    sv_setpvf_mg()            NEED_sv_setpvf_mg            NEED_sv_setpvf_mg_GLOBAL
+|>    sv_setpvf_mg_nocontext()  NEED_sv_setpvf_mg_nocontext  NEED_sv_setpvf_mg_nocontext_GLOBAL
+|>    vnewSVpvf()               NEED_vnewSVpvf               NEED_vnewSVpvf_GLOBAL
+|>
+|>To avoid namespace conflicts, you can change the namespace of the
+|>explicitly exported functions using the C<DPPP_NAMESPACE> macro.
+|>Just C<#define> the macro before including C<ppport.h>:
+|>
+|>    #define DPPP_NAMESPACE MyOwnNamespace_
+|>    #include "ppport.h"
+|>
+|>The default namespace is C<DPPP_>.
+|>
+|>=back
+|>
+|>The good thing is that most of the above can be checked by running
+|>F<ppport.h> on your source code. See the next section for
+|>details.
+|>
+|>=head1 EXAMPLES
+|>
+|>To verify whether F<ppport.h> is needed for your module, whether you
+|>should make any changes to your code, and whether any special defines
+|>should be used, F<ppport.h> can be run as a Perl script to check your
+|>source code. Simply say:
+|>
+|>    perl ppport.h
+|>
+|>The result will usually be a list of patches suggesting changes
+|>that should at least be acceptable, if not necessarily the most
+|>efficient solution, or a fix for all possible problems.
+|>
+|>If you know that your XS module uses features only available in
+|>newer Perl releases, if you're aware that it uses C++ comments,
+|>and if you want all suggestions as a single patch file, you could
+|>use something like this:
+|>
+|>    perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
+|>
+|>If you only want your code to be scanned without any suggestions
+|>for changes, use:
+|>
+|>    perl ppport.h --nochanges
+|>
+|>You can specify a different C<diff> program or options, using
+|>the C<--diff> option:
+|>
+|>    perl ppport.h --diff='diff -C 10'
+|>
+|>This would output context diffs with 10 lines of context.
+|>
+|>To display portability information for the C<newSVpvn> function,
+|>use:
+|>
+|>    perl ppport.h --api-info=newSVpvn
+|>
+|>Since the argument to C<--api-info> can be a regular expression,
+|>you can use
+|>
+|>    perl ppport.h --api-info=/_nomg$/
+|>
+|>to display portability information for all C<_nomg> functions or
+|>
+|>    perl ppport.h --api-info=/./
+|>
+|>to display information for all known API elements.
+|>
+|>=head1 BUGS
+|>
+|>If this version of F<ppport.h> is causing failure during
+|>the compilation of this module, please check if newer versions
+|>of either this module or C<Devel::PPPort> are available on CPAN
+|>before sending a bug report.
+|>
+|>If F<ppport.h> was generated using the latest version of
+|>C<Devel::PPPort> and is causing failure of this module, please
+|>file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
+|>
+|>Please include the following information:
+|>
+|>=over 4
+|>
+|>=item 1.
+|>
+|>The complete output from running "perl -V"
+|>
+|>=item 2.
+|>
+|>This file.
+|>
+|>=item 3.
+|>
+|>The name and version of the module you were trying to build.
+|>
+|>=item 4.
+|>
+|>A full log of the build that failed.
+|>
+|>=item 5.
+|>
+|>Any other information that you think could be relevant.
+|>
+|>=back
+|>
+|>For the latest version of this code, please get the C<Devel::PPPort>
+|>module from CPAN.
+|>
+|>=head1 COPYRIGHT
+|>
+|>Version 3.x, Copyright (c) 2004-2005, Marcus Holland-Moritz.
+|>
+|>Version 2.x, Copyright (C) 2001, Paul Marquess.
+|>
+|>Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+|>
+|>This program is free software; you can redistribute it and/or
+|>modify it under the same terms as Perl itself.
+|>
+|>=head1 SEE ALSO
+|>
+|>See L<Devel::PPPort>.
+
+=cut
+
+use strict;
+
+my %opt = (
+  quiet     => 0,
+  diag      => 1,
+  hints     => 1,
+  changes   => 1,
+  cplusplus => 0,
+  filter    => 1,
+);
+
+my($ppport) = $0 =~ /([\w.]+)$/;
+my $LF = '(?:\r\n|[\r\n])';   # line feed
+my $HS = "[ \t]";             # horizontal whitespace
+
+eval {
+  require Getopt::Long;
+  Getopt::Long::GetOptions(\%opt, qw(
+    help quiet diag! filter! hints! changes! cplusplus
+    patch=s copy=s diff=s compat-version=s
+    list-provided list-unsupported api-info=s
+  )) or usage();
+};
+
+if ($@ and grep /^-/, @ARGV) {
+  usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
+  die "Getopt::Long not found. Please don't use any options.\n";
+}
+
+usage() if $opt{help};
+
+if (exists $opt{'compat-version'}) {
+  my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
+  if ($@) {
+    die "Invalid version number format: '$opt{'compat-version'}'\n";
+  }
+  die "Only Perl 5 is supported\n" if $r != 5;
+  die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
+  $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
+}
+else {
+  $opt{'compat-version'} = 5;
+}
+
+# Never use C comments in this file!!!!!
+my $ccs  = '/'.'*';
+my $cce  = '*'.'/';
+my $rccs = quotemeta $ccs;
+my $rcce = quotemeta $cce;
+
+my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
+                ? ( $1 => {
+                      ($2                  ? ( base     => $2 ) : ()),
+                      ($3                  ? ( todo     => $3 ) : ()),
+                      (index($4, 'v') >= 0 ? ( varargs  => 1  ) : ()),
+                      (index($4, 'p') >= 0 ? ( provided => 1  ) : ()),
+                      (index($4, 'n') >= 0 ? ( nothxarg => 1  ) : ()),
+                    } )
+                : die "invalid spec: $_" } qw(
+AvFILLp|5.004050||p
+AvFILL|||
+CLASS|||n
+CX_CURPAD_SAVE|||
+CX_CURPAD_SV|||
+CopFILEAV|5.006000||p
+CopFILEGV_set|5.006000||p
+CopFILEGV|5.006000||p
+CopFILESV|5.006000||p
+CopFILE_set|5.006000||p
+CopFILE|5.006000||p
+CopSTASHPV_set|5.006000||p
+CopSTASHPV|5.006000||p
+CopSTASH_eq|5.006000||p
+CopSTASH_set|5.006000||p
+CopSTASH|5.006000||p
+CopyD|5.009002||p
+Copy|||
+CvPADLIST|||
+CvSTASH|||
+CvWEAKOUTSIDE|||
+DEFSV|5.004050||p
+END_EXTERN_C|5.005000||p
+ENTER|||
+ERRSV|5.004050||p
+EXTEND|||
+EXTERN_C|5.005000||p
+FREETMPS|||
+GIMME_V||5.004000|n
+GIMME|||n
+GROK_NUMERIC_RADIX|5.007002||p
+G_ARRAY|||
+G_DISCARD|||
+G_EVAL|||
+G_NOARGS|||
+G_SCALAR|||
+G_VOID||5.004000|
+GetVars|||
+GvSV|||
+Gv_AMupdate|||
+HEf_SVKEY||5.004000|
+HeHASH||5.004000|
+HeKEY||5.004000|
+HeKLEN||5.004000|
+HePV||5.004000|
+HeSVKEY_force||5.004000|
+HeSVKEY_set||5.004000|
+HeSVKEY||5.004000|
+HeVAL||5.004000|
+HvNAME|||
+INT2PTR|5.006000||p
+IN_LOCALE_COMPILETIME|5.007002||p
+IN_LOCALE_RUNTIME|5.007002||p
+IN_LOCALE|5.007002||p
+IN_PERL_COMPILETIME|5.008001||p
+IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
+IS_NUMBER_INFINITY|5.007002||p
+IS_NUMBER_IN_UV|5.007002||p
+IS_NUMBER_NAN|5.007003||p
+IS_NUMBER_NEG|5.007002||p
+IS_NUMBER_NOT_INT|5.007002||p
+IVSIZE|5.006000||p
+IVTYPE|5.006000||p
+IVdf|5.006000||p
+LEAVE|||
+LVRET|||
+MARK|||
+MY_CXT_CLONE|5.009002||p
+MY_CXT_INIT|5.007003||p
+MY_CXT|5.007003||p
+MoveD|5.009002||p
+Move|||
+NEWSV|||
+NOOP|5.005000||p
+NUM2PTR|5.006000||p
+NVTYPE|5.006000||p
+NVef|5.006001||p
+NVff|5.006001||p
+NVgf|5.006001||p
+Newc|||
+Newz|||
+New|||
+Nullav|||
+Nullch|||
+Nullcv|||
+Nullhv|||
+Nullsv|||
+ORIGMARK|||
+PAD_BASE_SV|||
+PAD_CLONE_VARS|||
+PAD_COMPNAME_FLAGS|||
+PAD_COMPNAME_GEN_set|||
+PAD_COMPNAME_GEN|||
+PAD_COMPNAME_OURSTASH|||
+PAD_COMPNAME_PV|||
+PAD_COMPNAME_TYPE|||
+PAD_RESTORE_LOCAL|||
+PAD_SAVE_LOCAL|||
+PAD_SAVE_SETNULLPAD|||
+PAD_SETSV|||
+PAD_SET_CUR_NOSAVE|||
+PAD_SET_CUR|||
+PAD_SVl|||
+PAD_SV|||
+PERL_BCDVERSION|5.009003||p
+PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
+PERL_INT_MAX|5.004000||p
+PERL_INT_MIN|5.004000||p
+PERL_LONG_MAX|5.004000||p
+PERL_LONG_MIN|5.004000||p
+PERL_MAGIC_arylen|5.007002||p
+PERL_MAGIC_backref|5.007002||p
+PERL_MAGIC_bm|5.007002||p
+PERL_MAGIC_collxfrm|5.007002||p
+PERL_MAGIC_dbfile|5.007002||p
+PERL_MAGIC_dbline|5.007002||p
+PERL_MAGIC_defelem|5.007002||p
+PERL_MAGIC_envelem|5.007002||p
+PERL_MAGIC_env|5.007002||p
+PERL_MAGIC_ext|5.007002||p
+PERL_MAGIC_fm|5.007002||p
+PERL_MAGIC_glob|5.007002||p
+PERL_MAGIC_isaelem|5.007002||p
+PERL_MAGIC_isa|5.007002||p
+PERL_MAGIC_mutex|5.007002||p
+PERL_MAGIC_nkeys|5.007002||p
+PERL_MAGIC_overload_elem|5.007002||p
+PERL_MAGIC_overload_table|5.007002||p
+PERL_MAGIC_overload|5.007002||p
+PERL_MAGIC_pos|5.007002||p
+PERL_MAGIC_qr|5.007002||p
+PERL_MAGIC_regdata|5.007002||p
+PERL_MAGIC_regdatum|5.007002||p
+PERL_MAGIC_regex_global|5.007002||p
+PERL_MAGIC_shared_scalar|5.007003||p
+PERL_MAGIC_shared|5.007003||p
+PERL_MAGIC_sigelem|5.007002||p
+PERL_MAGIC_sig|5.007002||p
+PERL_MAGIC_substr|5.007002||p
+PERL_MAGIC_sv|5.007002||p
+PERL_MAGIC_taint|5.007002||p
+PERL_MAGIC_tiedelem|5.007002||p
+PERL_MAGIC_tiedscalar|5.007002||p
+PERL_MAGIC_tied|5.007002||p
+PERL_MAGIC_utf8|5.008001||p
+PERL_MAGIC_uvar_elem|5.007003||p
+PERL_MAGIC_uvar|5.007002||p
+PERL_MAGIC_vec|5.007002||p
+PERL_MAGIC_vstring|5.008001||p
+PERL_QUAD_MAX|5.004000||p
+PERL_QUAD_MIN|5.004000||p
+PERL_REVISION|5.006000||p
+PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
+PERL_SCAN_DISALLOW_PREFIX|5.007003||p
+PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
+PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
+PERL_SHORT_MAX|5.004000||p
+PERL_SHORT_MIN|5.004000||p
+PERL_SUBVERSION|5.006000||p
+PERL_UCHAR_MAX|5.004000||p
+PERL_UCHAR_MIN|5.004000||p
+PERL_UINT_MAX|5.004000||p
+PERL_UINT_MIN|5.004000||p
+PERL_ULONG_MAX|5.004000||p
+PERL_ULONG_MIN|5.004000||p
+PERL_UNUSED_DECL|5.007002||p
+PERL_UQUAD_MAX|5.004000||p
+PERL_UQUAD_MIN|5.004000||p
+PERL_USHORT_MAX|5.004000||p
+PERL_USHORT_MIN|5.004000||p
+PERL_VERSION|5.006000||p
+PL_DBsingle|||pn
+PL_DBsub|||pn
+PL_DBtrace|||n
+PL_Sv|5.005000||p
+PL_compiling|5.004050||p
+PL_copline|5.005000||p
+PL_curcop|5.004050||p
+PL_curstash|5.004050||p
+PL_debstash|5.004050||p
+PL_defgv|5.004050||p
+PL_diehook|5.004050||p
+PL_dirty|5.004050||p
+PL_dowarn|||pn
+PL_errgv|5.004050||p
+PL_hexdigit|5.005000||p
+PL_hints|5.005000||p
+PL_last_in_gv|||n
+PL_modglobal||5.005000|n
+PL_na|5.004050||pn
+PL_no_modify|5.006000||p
+PL_ofs_sv|||n
+PL_perl_destruct_level|5.004050||p
+PL_perldb|5.004050||p
+PL_ppaddr|5.006000||p
+PL_rsfp_filters|5.004050||p
+PL_rsfp|5.004050||p
+PL_rs|||n
+PL_stack_base|5.004050||p
+PL_stack_sp|5.004050||p
+PL_stdingv|5.004050||p
+PL_sv_arenaroot|5.004050||p
+PL_sv_no|5.004050||pn
+PL_sv_undef|5.004050||pn
+PL_sv_yes|5.004050||pn
+PL_tainted|5.004050||p
+PL_tainting|5.004050||p
+POPi|||n
+POPl|||n
+POPn|||n
+POPpbytex||5.007001|n
+POPpx||5.005030|n
+POPp|||n
+POPs|||n
+PTR2IV|5.006000||p
+PTR2NV|5.006000||p
+PTR2UV|5.006000||p
+PTR2ul|5.007001||p
+PTRV|5.006000||p
+PUSHMARK|||
+PUSHi|||
+PUSHmortal|5.009002||p
+PUSHn|||
+PUSHp|||
+PUSHs|||
+PUSHu|5.004000||p
+PUTBACK|||
+PerlIO_clearerr||5.007003|
+PerlIO_close||5.007003|
+PerlIO_eof||5.007003|
+PerlIO_error||5.007003|
+PerlIO_fileno||5.007003|
+PerlIO_fill||5.007003|
+PerlIO_flush||5.007003|
+PerlIO_get_base||5.007003|
+PerlIO_get_bufsiz||5.007003|
+PerlIO_get_cnt||5.007003|
+PerlIO_get_ptr||5.007003|
+PerlIO_read||5.007003|
+PerlIO_seek||5.007003|
+PerlIO_set_cnt||5.007003|
+PerlIO_set_ptrcnt||5.007003|
+PerlIO_setlinebuf||5.007003|
+PerlIO_stderr||5.007003|
+PerlIO_stdin||5.007003|
+PerlIO_stdout||5.007003|
+PerlIO_tell||5.007003|
+PerlIO_unread||5.007003|
+PerlIO_write||5.007003|
+Poison|5.008000||p
+RETVAL|||n
+Renewc|||
+Renew|||
+SAVECLEARSV|||
+SAVECOMPPAD|||
+SAVEPADSV|||
+SAVETMPS|||
+SAVE_DEFSV|5.004050||p
+SPAGAIN|||
+SP|||
+START_EXTERN_C|5.005000||p
+START_MY_CXT|5.007003||p
+STMT_END|||p
+STMT_START|||p
+ST|||
+SVt_IV|||
+SVt_NV|||
+SVt_PVAV|||
+SVt_PVCV|||
+SVt_PVHV|||
+SVt_PVMG|||
+SVt_PV|||
+Safefree|||
+Slab_Alloc|||
+Slab_Free|||
+StructCopy|||
+SvCUR_set|||
+SvCUR|||
+SvEND|||
+SvGETMAGIC|5.004050||p
+SvGROW|||
+SvIOK_UV||5.006000|
+SvIOK_notUV||5.006000|
+SvIOK_off|||
+SvIOK_only_UV||5.006000|
+SvIOK_only|||
+SvIOK_on|||
+SvIOKp|||
+SvIOK|||
+SvIVX|||
+SvIV_nomg|5.009001||p
+SvIV_set|||
+SvIVx|||
+SvIV|||
+SvIsCOW_shared_hash||5.008003|
+SvIsCOW||5.008003|
+SvLEN_set|||
+SvLEN|||
+SvLOCK||5.007003|
+SvMAGIC_set||5.009003|
+SvNIOK_off|||
+SvNIOKp|||
+SvNIOK|||
+SvNOK_off|||
+SvNOK_only|||
+SvNOK_on|||
+SvNOKp|||
+SvNOK|||
+SvNVX|||
+SvNV_set|||
+SvNVx|||
+SvNV|||
+SvOK|||
+SvOOK|||
+SvPOK_off|||
+SvPOK_only_UTF8||5.006000|
+SvPOK_only|||
+SvPOK_on|||
+SvPOKp|||
+SvPOK|||
+SvPVX|||
+SvPV_force_nomg|5.007002||p
+SvPV_force|||
+SvPV_nolen|5.006000||p
+SvPV_nomg|5.007002||p
+SvPV_set|||
+SvPVbyte_force||5.009002|
+SvPVbyte_nolen||5.006000|
+SvPVbytex_force||5.006000|
+SvPVbytex||5.006000|
+SvPVbyte|5.006000||p
+SvPVutf8_force||5.006000|
+SvPVutf8_nolen||5.006000|
+SvPVutf8x_force||5.006000|
+SvPVutf8x||5.006000|
+SvPVutf8||5.006000|
+SvPVx|||
+SvPV|||
+SvREFCNT_dec|||
+SvREFCNT_inc|||
+SvREFCNT|||
+SvROK_off|||
+SvROK_on|||
+SvROK|||
+SvRV_set||5.009003|
+SvRV|||
+SvSETMAGIC|||
+SvSHARE||5.007003|
+SvSTASH_set||5.009003|
+SvSTASH|||
+SvSetMagicSV_nosteal||5.004000|
+SvSetMagicSV||5.004000|
+SvSetSV_nosteal||5.004000|
+SvSetSV|||
+SvTAINTED_off||5.004000|
+SvTAINTED_on||5.004000|
+SvTAINTED||5.004000|
+SvTAINT|||
+SvTRUE|||
+SvTYPE|||
+SvUNLOCK||5.007003|
+SvUOK||5.007001|
+SvUPGRADE|||
+SvUTF8_off||5.006000|
+SvUTF8_on||5.006000|
+SvUTF8||5.006000|
+SvUVXx|5.004000||p
+SvUVX|5.004000||p
+SvUV_nomg|5.009001||p
+SvUV_set||5.009003|
+SvUVx|5.004000||p
+SvUV|5.004000||p
+SvVOK||5.008001|
+THIS|||n
+UNDERBAR|5.009002||p
+UVSIZE|5.006000||p
+UVTYPE|5.006000||p
+UVXf|5.007001||p
+UVof|5.006000||p
+UVuf|5.006000||p
+UVxf|5.006000||p
+XCPT_CATCH|5.009002||p
+XCPT_RETHROW|5.009002||p
+XCPT_TRY_END|5.009002||p
+XCPT_TRY_START|5.009002||p
+XPUSHi|||
+XPUSHmortal|5.009002||p
+XPUSHn|||
+XPUSHp|||
+XPUSHs|||
+XPUSHu|5.004000||p
+XSRETURN_EMPTY|||
+XSRETURN_IV|||
+XSRETURN_NO|||
+XSRETURN_NV|||
+XSRETURN_PV|||
+XSRETURN_UNDEF|||
+XSRETURN_UV|5.008001||p
+XSRETURN_YES|||
+XSRETURN|||
+XST_mIV|||
+XST_mNO|||
+XST_mNV|||
+XST_mPV|||
+XST_mUNDEF|||
+XST_mUV|5.008001||p
+XST_mYES|||
+XS_VERSION_BOOTCHECK|||
+XS_VERSION|||
+XS|||
+ZeroD|5.009002||p
+Zero|||
+_aMY_CXT|5.007003||p
+_pMY_CXT|5.007003||p
+aMY_CXT_|5.007003||p
+aMY_CXT|5.007003||p
+aTHX_|5.006000||p
+aTHX|5.006000||p
+add_data|||
+allocmy|||
+amagic_call|||
+any_dup|||
+ao|||
+append_elem|||
+append_list|||
+apply_attrs_my|||
+apply_attrs_string||5.006001|
+apply_attrs|||
+apply|||
+asIV|||
+asUV|||
+atfork_lock||5.007003|n
+atfork_unlock||5.007003|n
+av_arylen_p||5.009003|
+av_clear|||
+av_delete||5.006000|
+av_exists||5.006000|
+av_extend|||
+av_fake|||
+av_fetch|||
+av_fill|||
+av_len|||
+av_make|||
+av_pop|||
+av_push|||
+av_reify|||
+av_shift|||
+av_store|||
+av_undef|||
+av_unshift|||
+ax|||n
+bad_type|||
+bind_match|||
+block_end|||
+block_gimme||5.004000|
+block_start|||
+boolSV|5.004000||p
+boot_core_PerlIO|||
+boot_core_UNIVERSAL|||
+boot_core_xsutils|||
+bytes_from_utf8||5.007001|
+bytes_to_utf8||5.006001|
+cache_re|||
+call_argv|5.006000||p
+call_atexit||5.006000|
+call_body|||
+call_list_body|||
+call_list||5.004000|
+call_method|5.006000||p
+call_pv|5.006000||p
+call_sv|5.006000||p
+calloc||5.007002|n
+cando|||
+cast_i32||5.006000|
+cast_iv||5.006000|
+cast_ulong||5.006000|
+cast_uv||5.006000|
+check_uni|||
+checkcomma|||
+checkposixcc|||
+ck_anoncode|||
+ck_bitop|||
+ck_concat|||
+ck_defined|||
+ck_delete|||
+ck_die|||
+ck_eof|||
+ck_eval|||
+ck_exec|||
+ck_exists|||
+ck_exit|||
+ck_ftst|||
+ck_fun|||
+ck_glob|||
+ck_grep|||
+ck_index|||
+ck_join|||
+ck_lengthconst|||
+ck_lfun|||
+ck_listiob|||
+ck_match|||
+ck_method|||
+ck_null|||
+ck_open|||
+ck_repeat|||
+ck_require|||
+ck_retarget|||
+ck_return|||
+ck_rfun|||
+ck_rvconst|||
+ck_sassign|||
+ck_select|||
+ck_shift|||
+ck_sort|||
+ck_spair|||
+ck_split|||
+ck_subr|||
+ck_substr|||
+ck_svconst|||
+ck_trunc|||
+ck_unpack|||
+cl_and|||
+cl_anything|||
+cl_init_zero|||
+cl_init|||
+cl_is_anything|||
+cl_or|||
+closest_cop|||
+convert|||
+cop_free|||
+cr_textfilter|||
+croak_nocontext|||vn
+croak|||v
+csighandler||5.007001|n
+custom_op_desc||5.007003|
+custom_op_name||5.007003|
+cv_ckproto|||
+cv_clone|||
+cv_const_sv||5.004000|
+cv_dump|||
+cv_undef|||
+cx_dump||5.005000|
+cx_dup|||
+cxinc|||
+dAXMARK||5.009003|
+dAX|5.007002||p
+dITEMS|5.007002||p
+dMARK|||
+dMY_CXT_SV|5.007003||p
+dMY_CXT|5.007003||p
+dNOOP|5.006000||p
+dORIGMARK|||
+dSP|||
+dTHR|5.004050||p
+dTHXa|5.006000||p
+dTHXoa|5.006000||p
+dTHX|5.006000||p
+dUNDERBAR|5.009002||p
+dXCPT|5.009002||p
+dXSARGS|||
+dXSI32|||
+dXSTARG|5.006000||p
+deb_curcv|||
+deb_nocontext|||vn
+deb_stack_all|||
+deb_stack_n|||
+debop||5.005000|
+debprofdump||5.005000|
+debprof|||
+debstackptrs||5.007003|
+debstack||5.007003|
+deb||5.007003|v
+del_he|||
+del_sv|||
+delimcpy||5.004000|
+depcom|||
+deprecate_old|||
+deprecate|||
+despatch_signals||5.007001|
+die_nocontext|||vn
+die_where|||
+die|||v
+dirp_dup|||
+div128|||
+djSP|||
+do_aexec5|||
+do_aexec|||
+do_aspawn|||
+do_binmode||5.004050|
+do_chomp|||
+do_chop|||
+do_close|||
+do_dump_pad|||
+do_eof|||
+do_exec3|||
+do_execfree|||
+do_exec|||
+do_gv_dump||5.006000|
+do_gvgv_dump||5.006000|
+do_hv_dump||5.006000|
+do_ipcctl|||
+do_ipcget|||
+do_join|||
+do_kv|||
+do_magic_dump||5.006000|
+do_msgrcv|||
+do_msgsnd|||
+do_oddball|||
+do_op_dump||5.006000|
+do_open9||5.006000|
+do_openn||5.007001|
+do_open||5.004000|
+do_pipe|||
+do_pmop_dump||5.006000|
+do_print|||
+do_readline|||
+do_seek|||
+do_semop|||
+do_shmio|||
+do_spawn_nowait|||
+do_spawn|||
+do_sprintf|||
+do_sv_dump||5.006000|
+do_sysseek|||
+do_tell|||
+do_trans_complex_utf8|||
+do_trans_complex|||
+do_trans_count_utf8|||
+do_trans_count|||
+do_trans_simple_utf8|||
+do_trans_simple|||
+do_trans|||
+do_vecget|||
+do_vecset|||
+do_vop|||
+docatch_body|||
+docatch|||
+doeval|||
+dofile|||
+dofindlabel|||
+doform|||
+doing_taint||5.008001|n
+dooneliner|||
+doopen_pm|||
+doparseform|||
+dopoptoeval|||
+dopoptolabel|||
+dopoptoloop|||
+dopoptosub_at|||
+dopoptosub|||
+dounwind|||
+dowantarray|||
+dump_all||5.006000|
+dump_eval||5.006000|
+dump_fds|||
+dump_form||5.006000|
+dump_indent||5.006000|v
+dump_mstats|||
+dump_packsubs||5.006000|
+dump_sub||5.006000|
+dump_vindent||5.006000|
+dumpuntil|||
+dup_attrlist|||
+emulate_eaccess|||
+eval_pv|5.006000||p
+eval_sv|5.006000||p
+expect_number|||
+fbm_compile||5.005000|
+fbm_instr||5.005000|
+fd_on_nosuid_fs|||
+filter_add|||
+filter_del|||
+filter_gets|||
+filter_read|||
+find_beginning|||
+find_byclass|||
+find_in_my_stash|||
+find_runcv|||
+find_rundefsvoffset||5.009002|
+find_script|||
+find_uninit_var|||
+fold_constants|||
+forbid_setid|||
+force_ident|||
+force_list|||
+force_next|||
+force_version|||
+force_word|||
+form_nocontext|||vn
+form||5.004000|v
+fp_dup|||
+fprintf_nocontext|||vn
+free_global_struct|||
+free_tied_hv_pool|||
+free_tmps|||
+gen_constant_list|||
+get_av|5.006000||p
+get_context||5.006000|n
+get_cv|5.006000||p
+get_db_sub|||
+get_debug_opts|||
+get_hash_seed|||
+get_hv|5.006000||p
+get_mstats|||
+get_no_modify|||
+get_num|||
+get_op_descs||5.005000|
+get_op_names||5.005000|
+get_opargs|||
+get_ppaddr||5.006000|
+get_sv|5.006000||p
+get_vtbl||5.005030|
+getcwd_sv||5.007002|
+getenv_len|||
+gp_dup|||
+gp_free|||
+gp_ref|||
+grok_bin|5.007003||p
+grok_hex|5.007003||p
+grok_number|5.007002||p
+grok_numeric_radix|5.007002||p
+grok_oct|5.007003||p
+group_end|||
+gv_AVadd|||
+gv_HVadd|||
+gv_IOadd|||
+gv_autoload4||5.004000|
+gv_check|||
+gv_dump||5.006000|
+gv_efullname3||5.004000|
+gv_efullname4||5.006001|
+gv_efullname|||
+gv_ename|||
+gv_fetchfile|||
+gv_fetchmeth_autoload||5.007003|
+gv_fetchmethod_autoload||5.004000|
+gv_fetchmethod|||
+gv_fetchmeth|||
+gv_fetchpvn_flags||5.009002|
+gv_fetchpv|||
+gv_fetchsv||5.009002|
+gv_fullname3||5.004000|
+gv_fullname4||5.006001|
+gv_fullname|||
+gv_handler||5.007001|
+gv_init_sv|||
+gv_init|||
+gv_share|||
+gv_stashpvn|5.006000||p
+gv_stashpv|||
+gv_stashsv|||
+he_dup|||
+hek_dup|||
+hfreeentries|||
+hsplit|||
+hv_assert||5.009001|
+hv_auxinit|||
+hv_clear_placeholders||5.009001|
+hv_clear|||
+hv_delayfree_ent||5.004000|
+hv_delete_common|||
+hv_delete_ent||5.004000|
+hv_delete|||
+hv_eiter_p||5.009003|
+hv_eiter_set||5.009003|
+hv_exists_ent||5.004000|
+hv_exists|||
+hv_fetch_common|||
+hv_fetch_ent||5.004000|
+hv_fetch|||
+hv_free_ent||5.004000|
+hv_iterinit|||
+hv_iterkeysv||5.004000|
+hv_iterkey|||
+hv_iternext_flags||5.008000|
+hv_iternextsv|||
+hv_iternext|||
+hv_iterval|||
+hv_ksplit||5.004000|
+hv_magic_check|||
+hv_magic|||
+hv_name_set||5.009003|
+hv_notallowed|||
+hv_placeholders_get||5.009003|
+hv_placeholders_p||5.009003|
+hv_placeholders_set||5.009003|
+hv_riter_p||5.009003|
+hv_riter_set||5.009003|
+hv_scalar||5.009001|
+hv_store_ent||5.004000|
+hv_store_flags||5.008000|
+hv_store|||
+hv_undef|||
+ibcmp_locale||5.004000|
+ibcmp_utf8||5.007003|
+ibcmp|||
+incl_perldb|||
+incline|||
+incpush|||
+ingroup|||
+init_argv_symbols|||
+init_debugger|||
+init_global_struct|||
+init_i18nl10n||5.006000|
+init_i18nl14n||5.006000|
+init_ids|||
+init_interp|||
+init_lexer|||
+init_main_stash|||
+init_perllib|||
+init_postdump_symbols|||
+init_predump_symbols|||
+init_stacks||5.005000|
+init_tm||5.007002|
+instr|||
+intro_my|||
+intuit_method|||
+intuit_more|||
+invert|||
+io_close|||
+isALNUM|||
+isALPHA|||
+isDIGIT|||
+isLOWER|||
+isSPACE|||
+isUPPER|||
+is_an_int|||
+is_gv_magical_sv|||
+is_gv_magical|||
+is_handle_constructor|||
+is_list_assignment|||
+is_lvalue_sub||5.007001|
+is_uni_alnum_lc||5.006000|
+is_uni_alnumc_lc||5.006000|
+is_uni_alnumc||5.006000|
+is_uni_alnum||5.006000|
+is_uni_alpha_lc||5.006000|
+is_uni_alpha||5.006000|
+is_uni_ascii_lc||5.006000|
+is_uni_ascii||5.006000|
+is_uni_cntrl_lc||5.006000|
+is_uni_cntrl||5.006000|
+is_uni_digit_lc||5.006000|
+is_uni_digit||5.006000|
+is_uni_graph_lc||5.006000|
+is_uni_graph||5.006000|
+is_uni_idfirst_lc||5.006000|
+is_uni_idfirst||5.006000|
+is_uni_lower_lc||5.006000|
+is_uni_lower||5.006000|
+is_uni_print_lc||5.006000|
+is_uni_print||5.006000|
+is_uni_punct_lc||5.006000|
+is_uni_punct||5.006000|
+is_uni_space_lc||5.006000|
+is_uni_space||5.006000|
+is_uni_upper_lc||5.006000|
+is_uni_upper||5.006000|
+is_uni_xdigit_lc||5.006000|
+is_uni_xdigit||5.006000|
+is_utf8_alnumc||5.006000|
+is_utf8_alnum||5.006000|
+is_utf8_alpha||5.006000|
+is_utf8_ascii||5.006000|
+is_utf8_char_slow|||
+is_utf8_char||5.006000|
+is_utf8_cntrl||5.006000|
+is_utf8_digit||5.006000|
+is_utf8_graph||5.006000|
+is_utf8_idcont||5.008000|
+is_utf8_idfirst||5.006000|
+is_utf8_lower||5.006000|
+is_utf8_mark||5.006000|
+is_utf8_print||5.006000|
+is_utf8_punct||5.006000|
+is_utf8_space||5.006000|
+is_utf8_string_loclen||5.009003|
+is_utf8_string_loc||5.008001|
+is_utf8_string||5.006001|
+is_utf8_upper||5.006000|
+is_utf8_xdigit||5.006000|
+isa_lookup|||
+items|||n
+ix|||n
+jmaybe|||
+keyword|||
+leave_scope|||
+lex_end|||
+lex_start|||
+linklist|||
+listkids|||
+list|||
+load_module_nocontext|||vn
+load_module||5.006000|v
+localize|||
+looks_like_number|||
+lop|||
+mPUSHi|5.009002||p
+mPUSHn|5.009002||p
+mPUSHp|5.009002||p
+mPUSHu|5.009002||p
+mXPUSHi|5.009002||p
+mXPUSHn|5.009002||p
+mXPUSHp|5.009002||p
+mXPUSHu|5.009002||p
+magic_clear_all_env|||
+magic_clearenv|||
+magic_clearpack|||
+magic_clearsig|||
+magic_dump||5.006000|
+magic_existspack|||
+magic_freearylen_p|||
+magic_freeovrld|||
+magic_freeregexp|||
+magic_getarylen|||
+magic_getdefelem|||
+magic_getglob|||
+magic_getnkeys|||
+magic_getpack|||
+magic_getpos|||
+magic_getsig|||
+magic_getsubstr|||
+magic_gettaint|||
+magic_getuvar|||
+magic_getvec|||
+magic_get|||
+magic_killbackrefs|||
+magic_len|||
+magic_methcall|||
+magic_methpack|||
+magic_nextpack|||
+magic_regdata_cnt|||
+magic_regdatum_get|||
+magic_regdatum_set|||
+magic_scalarpack|||
+magic_set_all_env|||
+magic_setamagic|||
+magic_setarylen|||
+magic_setbm|||
+magic_setcollxfrm|||
+magic_setdbline|||
+magic_setdefelem|||
+magic_setenv|||
+magic_setfm|||
+magic_setglob|||
+magic_setisa|||
+magic_setmglob|||
+magic_setnkeys|||
+magic_setpack|||
+magic_setpos|||
+magic_setregexp|||
+magic_setsig|||
+magic_setsubstr|||
+magic_settaint|||
+magic_setutf8|||
+magic_setuvar|||
+magic_setvec|||
+magic_set|||
+magic_sizepack|||
+magic_wipepack|||
+magicname|||
+make_trie|||
+malloced_size|||n
+malloc||5.007002|n
+markstack_grow|||
+measure_struct|||
+memEQ|5.004000||p
+memNE|5.004000||p
+mem_collxfrm|||
+mess_alloc|||
+mess_nocontext|||vn
+mess||5.006000|v
+method_common|||
+mfree||5.007002|n
+mg_clear|||
+mg_copy|||
+mg_dup|||
+mg_find|||
+mg_free|||
+mg_get|||
+mg_length||5.005000|
+mg_localize|||
+mg_magical|||
+mg_set|||
+mg_size||5.005000|
+mini_mktime||5.007002|
+missingterm|||
+mode_from_discipline|||
+modkids|||
+mod|||
+moreswitches|||
+mul128|||
+mulexp10|||n
+my_atof2||5.007002|
+my_atof||5.006000|
+my_attrs|||
+my_bcopy|||n
+my_betoh16|||n
+my_betoh32|||n
+my_betoh64|||n
+my_betohi|||n
+my_betohl|||n
+my_betohs|||n
+my_bzero|||n
+my_chsize|||
+my_exit_jump|||
+my_exit|||
+my_failure_exit||5.004000|
+my_fflush_all||5.006000|
+my_fork||5.007003|n
+my_htobe16|||n
+my_htobe32|||n
+my_htobe64|||n
+my_htobei|||n
+my_htobel|||n
+my_htobes|||n
+my_htole16|||n
+my_htole32|||n
+my_htole64|||n
+my_htolei|||n
+my_htolel|||n
+my_htoles|||n
+my_htonl|||
+my_kid|||
+my_letoh16|||n
+my_letoh32|||n
+my_letoh64|||n
+my_letohi|||n
+my_letohl|||n
+my_letohs|||n
+my_lstat|||
+my_memcmp||5.004000|n
+my_memset|||n
+my_ntohl|||
+my_pclose||5.004000|
+my_popen_list||5.007001|
+my_popen||5.004000|
+my_setenv|||
+my_socketpair||5.007003|n
+my_stat|||
+my_strftime||5.007002|
+my_swabn|||n
+my_swap|||
+my_unexec|||
+my|||
+newANONATTRSUB||5.006000|
+newANONHASH|||
+newANONLIST|||
+newANONSUB|||
+newASSIGNOP|||
+newATTRSUB||5.006000|
+newAVREF|||
+newAV|||
+newBINOP|||
+newCONDOP|||
+newCONSTSUB|5.006000||p
+newCVREF|||
+newDEFSVOP|||
+newFORM|||
+newFOROP|||
+newGVOP|||
+newGVREF|||
+newGVgen|||
+newHVREF|||
+newHVhv||5.005000|
+newHV|||
+newIO|||
+newLISTOP|||
+newLOGOP|||
+newLOOPEX|||
+newLOOPOP|||
+newMYSUB||5.006000|
+newNULLLIST|||
+newOP|||
+newPADOP||5.006000|
+newPMOP|||
+newPROG|||
+newPVOP|||
+newRANGE|||
+newRV_inc|5.004000||p
+newRV_noinc|5.006000||p
+newRV|||
+newSLICEOP|||
+newSTATEOP|||
+newSUB|||
+newSVOP|||
+newSVREF|||
+newSVhek||5.009003|
+newSViv|||
+newSVnv|||
+newSVpvf_nocontext|||vn
+newSVpvf||5.004000|v
+newSVpvn_share||5.007001|
+newSVpvn|5.006000||p
+newSVpv|||
+newSVrv|||
+newSVsv|||
+newSVuv|5.006000||p
+newSV|||
+newUNOP|||
+newWHILEOP||5.009003|
+newXSproto||5.006000|
+newXS||5.006000|
+new_collate||5.006000|
+new_constant|||
+new_ctype||5.006000|
+new_he|||
+new_logop|||
+new_numeric||5.006000|
+new_stackinfo||5.005000|
+new_version||5.009000|
+next_symbol|||
+nextargv|||
+nextchar|||
+ninstr|||
+no_bareword_allowed|||
+no_fh_allowed|||
+no_op|||
+not_a_number|||
+nothreadhook||5.008000|
+nuke_stacks|||
+num_overflow|||n
+oopsAV|||
+oopsCV|||
+oopsHV|||
+op_clear|||
+op_const_sv|||
+op_dump||5.006000|
+op_free|||
+op_null||5.007002|
+op_refcnt_lock||5.009002|
+op_refcnt_unlock||5.009002|
+open_script|||
+pMY_CXT_|5.007003||p
+pMY_CXT|5.007003||p
+pTHX_|5.006000||p
+pTHX|5.006000||p
+pack_cat||5.007003|
+pack_rec|||
+package|||
+packlist||5.008001|
+pad_add_anon|||
+pad_add_name|||
+pad_alloc|||
+pad_block_start|||
+pad_check_dup|||
+pad_compname_type|||
+pad_findlex|||
+pad_findmy|||
+pad_fixup_inner_anons|||
+pad_free|||
+pad_leavemy|||
+pad_new|||
+pad_push|||
+pad_reset|||
+pad_setsv|||
+pad_sv|||
+pad_swipe|||
+pad_tidy|||
+pad_undef|||
+parse_body|||
+parse_unicode_opts|||
+path_is_absolute|||
+peep|||
+pending_ident|||
+perl_alloc_using|||n
+perl_alloc|||n
+perl_clone_using|||n
+perl_clone|||n
+perl_construct|||n
+perl_destruct||5.007003|n
+perl_free|||n
+perl_parse||5.006000|n
+perl_run|||n
+pidgone|||
+pmflag|||
+pmop_dump||5.006000|
+pmruntime|||
+pmtrans|||
+pop_scope|||
+pregcomp|||
+pregexec|||
+pregfree|||
+prepend_elem|||
+printf_nocontext|||vn
+ptr_table_clear|||
+ptr_table_fetch|||
+ptr_table_free|||
+ptr_table_new|||
+ptr_table_split|||
+ptr_table_store|||
+push_scope|||
+put_byte|||
+pv_display||5.006000|
+pv_uni_display||5.007003|
+qerror|||
+re_croak2|||
+re_dup|||
+re_intuit_start||5.006000|
+re_intuit_string||5.006000|
+realloc||5.007002|n
+reentrant_free|||
+reentrant_init|||
+reentrant_retry|||vn
+reentrant_size|||
+refkids|||
+refto|||
+ref|||
+reg_node|||
+reganode|||
+regatom|||
+regbranch|||
+regclass_swash||5.007003|
+regclass|||
+regcp_set_to|||
+regcppop|||
+regcppush|||
+regcurly|||
+regdump||5.005000|
+regexec_flags||5.005000|
+reghop3|||
+reghopmaybe3|||
+reghopmaybe|||
+reghop|||
+reginclass|||
+reginitcolors||5.006000|
+reginsert|||
+regmatch|||
+regnext||5.005000|
+regoptail|||
+regpiece|||
+regpposixcc|||
+regprop|||
+regrepeat_hard|||
+regrepeat|||
+regtail|||
+regtry|||
+reguni|||
+regwhite|||
+reg|||
+repeatcpy|||
+report_evil_fh|||
+report_uninit|||
+require_errno|||
+require_pv||5.006000|
+rninstr|||
+rsignal_restore|||
+rsignal_save|||
+rsignal_state||5.004000|
+rsignal||5.004000|
+run_body|||
+runops_debug||5.005000|
+runops_standard||5.005000|
+rvpv_dup|||
+rxres_free|||
+rxres_restore|||
+rxres_save|||
+safesyscalloc||5.006000|n
+safesysfree||5.006000|n
+safesysmalloc||5.006000|n
+safesysrealloc||5.006000|n
+same_dirent|||
+save_I16||5.004000|
+save_I32|||
+save_I8||5.006000|
+save_aelem||5.004050|
+save_alloc||5.006000|
+save_aptr|||
+save_ary|||
+save_bool||5.008001|
+save_clearsv|||
+save_delete|||
+save_destructor_x||5.006000|
+save_destructor||5.006000|
+save_freeop|||
+save_freepv|||
+save_freesv|||
+save_generic_pvref||5.006001|
+save_generic_svref||5.005030|
+save_gp||5.004000|
+save_hash|||
+save_hek_flags|||
+save_helem||5.004050|
+save_hints||5.005000|
+save_hptr|||
+save_int|||
+save_item|||
+save_iv||5.005000|
+save_lines|||
+save_list|||
+save_long|||
+save_magic|||
+save_mortalizesv||5.007001|
+save_nogv|||
+save_op|||
+save_padsv||5.007001|
+save_pptr|||
+save_re_context||5.006000|
+save_scalar_at|||
+save_scalar|||
+save_set_svflags||5.009000|
+save_shared_pvref||5.007003|
+save_sptr|||
+save_svref|||
+save_threadsv||5.005000|
+save_vptr||5.006000|
+savepvn|||
+savepv|||
+savesharedpv||5.007003|
+savestack_grow_cnt||5.008001|
+savestack_grow|||
+savesvpv||5.009002|
+sawparens|||
+scalar_mod_type|||
+scalarboolean|||
+scalarkids|||
+scalarseq|||
+scalarvoid|||
+scalar|||
+scan_bin||5.006000|
+scan_commit|||
+scan_const|||
+scan_formline|||
+scan_heredoc|||
+scan_hex|||
+scan_ident|||
+scan_inputsymbol|||
+scan_num||5.007001|
+scan_oct|||
+scan_pat|||
+scan_str|||
+scan_subst|||
+scan_trans|||
+scan_version||5.009001|
+scan_vstring||5.008001|
+scan_word|||
+scope|||
+screaminstr||5.005000|
+seed|||
+set_context||5.006000|n
+set_csh|||
+set_numeric_local||5.006000|
+set_numeric_radix||5.006000|
+set_numeric_standard||5.006000|
+setdefout|||
+setenv_getix|||
+share_hek_flags|||
+share_hek|||
+si_dup|||
+sighandler|||n
+simplify_sort|||
+skipspace|||
+sortsv||5.007003|
+ss_dup|||
+stack_grow|||
+start_glob|||
+start_subparse||5.004000|
+stashpv_hvname_match||5.009003|
+stdize_locale|||
+strEQ|||
+strGE|||
+strGT|||
+strLE|||
+strLT|||
+strNE|||
+str_to_version||5.006000|
+strnEQ|||
+strnNE|||
+study_chunk|||
+sub_crush_depth|||
+sublex_done|||
+sublex_push|||
+sublex_start|||
+sv_2bool|||
+sv_2cv|||
+sv_2io|||
+sv_2iuv_non_preserve|||
+sv_2iv_flags||5.009001|
+sv_2iv|||
+sv_2mortal|||
+sv_2nv|||
+sv_2pv_flags||5.007002|
+sv_2pv_nolen|5.006000||p
+sv_2pvbyte_nolen|||
+sv_2pvbyte|5.006000||p
+sv_2pvutf8_nolen||5.006000|
+sv_2pvutf8||5.006000|
+sv_2pv|||
+sv_2uv_flags||5.009001|
+sv_2uv|5.004000||p
+sv_add_arena|||
+sv_add_backref|||
+sv_backoff|||
+sv_bless|||
+sv_cat_decode||5.008001|
+sv_catpv_mg|5.006000||p
+sv_catpvf_mg_nocontext|||pvn
+sv_catpvf_mg|5.006000|5.004000|pv
+sv_catpvf_nocontext|||vn
+sv_catpvf||5.004000|v
+sv_catpvn_flags||5.007002|
+sv_catpvn_mg|5.006000||p
+sv_catpvn_nomg|5.007002||p
+sv_catpvn|||
+sv_catpv|||
+sv_catsv_flags||5.007002|
+sv_catsv_mg|5.006000||p
+sv_catsv_nomg|5.007002||p
+sv_catsv|||
+sv_chop|||
+sv_clean_all|||
+sv_clean_objs|||
+sv_clear|||
+sv_cmp_locale||5.004000|
+sv_cmp|||
+sv_collxfrm|||
+sv_compile_2op||5.008001|
+sv_copypv||5.007003|
+sv_dec|||
+sv_del_backref|||
+sv_derived_from||5.004000|
+sv_dump|||
+sv_dup|||
+sv_eq|||
+sv_force_normal_flags||5.007001|
+sv_force_normal||5.006000|
+sv_free2|||
+sv_free_arenas|||
+sv_free|||
+sv_gets||5.004000|
+sv_grow|||
+sv_inc|||
+sv_insert|||
+sv_isa|||
+sv_isobject|||
+sv_iv||5.005000|
+sv_len_utf8||5.006000|
+sv_len|||
+sv_magicext||5.007003|
+sv_magic|||
+sv_mortalcopy|||
+sv_newmortal|||
+sv_newref|||
+sv_nolocking||5.007003|
+sv_nosharing||5.007003|
+sv_nounlocking||5.007003|
+sv_nv||5.005000|
+sv_peek||5.005000|
+sv_pos_b2u||5.006000|
+sv_pos_u2b||5.006000|
+sv_pvbyten_force||5.006000|
+sv_pvbyten||5.006000|
+sv_pvbyte||5.006000|
+sv_pvn_force_flags||5.007002|
+sv_pvn_force|||p
+sv_pvn_nomg|5.007003||p
+sv_pvn|5.006000||p
+sv_pvutf8n_force||5.006000|
+sv_pvutf8n||5.006000|
+sv_pvutf8||5.006000|
+sv_pv||5.006000|
+sv_recode_to_utf8||5.007003|
+sv_reftype|||
+sv_release_COW|||
+sv_release_IVX|||
+sv_replace|||
+sv_report_used|||
+sv_reset|||
+sv_rvweaken||5.006000|
+sv_setiv_mg|5.006000||p
+sv_setiv|||
+sv_setnv_mg|5.006000||p
+sv_setnv|||
+sv_setpv_mg|5.006000||p
+sv_setpvf_mg_nocontext|||pvn
+sv_setpvf_mg|5.006000|5.004000|pv
+sv_setpvf_nocontext|||vn
+sv_setpvf||5.004000|v
+sv_setpviv_mg||5.008001|
+sv_setpviv||5.008001|
+sv_setpvn_mg|5.006000||p
+sv_setpvn|||
+sv_setpv|||
+sv_setref_iv|||
+sv_setref_nv|||
+sv_setref_pvn|||
+sv_setref_pv|||
+sv_setref_uv||5.007001|
+sv_setsv_cow|||
+sv_setsv_flags||5.007002|
+sv_setsv_mg|5.006000||p
+sv_setsv_nomg|5.007002||p
+sv_setsv|||
+sv_setuv_mg|5.006000||p
+sv_setuv|5.006000||p
+sv_tainted||5.004000|
+sv_taint||5.004000|
+sv_true||5.005000|
+sv_unglob|||
+sv_uni_display||5.007003|
+sv_unmagic|||
+sv_unref_flags||5.007001|
+sv_unref|||
+sv_untaint||5.004000|
+sv_upgrade|||
+sv_usepvn_mg|5.006000||p
+sv_usepvn|||
+sv_utf8_decode||5.006000|
+sv_utf8_downgrade||5.006000|
+sv_utf8_encode||5.006000|
+sv_utf8_upgrade_flags||5.007002|
+sv_utf8_upgrade||5.007001|
+sv_uv|5.006000||p
+sv_vcatpvf_mg|5.006000|5.004000|p
+sv_vcatpvfn||5.004000|
+sv_vcatpvf|5.006000|5.004000|p
+sv_vsetpvf_mg|5.006000|5.004000|p
+sv_vsetpvfn||5.004000|
+sv_vsetpvf|5.006000|5.004000|p
+svtype|||
+swallow_bom|||
+swash_fetch||5.007002|
+swash_init||5.006000|
+sys_intern_clear|||
+sys_intern_dup|||
+sys_intern_init|||
+taint_env|||
+taint_proper|||
+tmps_grow||5.006000|
+toLOWER|||
+toUPPER|||
+to_byte_substr|||
+to_uni_fold||5.007003|
+to_uni_lower_lc||5.006000|
+to_uni_lower||5.007003|
+to_uni_title_lc||5.006000|
+to_uni_title||5.007003|
+to_uni_upper_lc||5.006000|
+to_uni_upper||5.007003|
+to_utf8_case||5.007003|
+to_utf8_fold||5.007003|
+to_utf8_lower||5.007003|
+to_utf8_substr|||
+to_utf8_title||5.007003|
+to_utf8_upper||5.007003|
+tokeq|||
+tokereport|||
+too_few_arguments|||
+too_many_arguments|||
+unlnk|||
+unpack_rec|||
+unpack_str||5.007003|
+unpackstring||5.008001|
+unshare_hek_or_pvn|||
+unshare_hek|||
+unsharepvn||5.004000|
+upg_version||5.009000|
+usage|||
+utf16_textfilter|||
+utf16_to_utf8_reversed||5.006001|
+utf16_to_utf8||5.006001|
+utf16rev_textfilter|||
+utf8_distance||5.006000|
+utf8_hop||5.006000|
+utf8_length||5.007001|
+utf8_mg_pos_init|||
+utf8_mg_pos|||
+utf8_to_bytes||5.006001|
+utf8_to_uvchr||5.007001|
+utf8_to_uvuni||5.007001|
+utf8n_to_uvchr||5.007001|
+utf8n_to_uvuni||5.007001|
+utilize|||
+uvchr_to_utf8_flags||5.007003|
+uvchr_to_utf8||5.007001|
+uvuni_to_utf8_flags||5.007003|
+uvuni_to_utf8||5.007001|
+validate_suid|||
+varname|||
+vcmp||5.009000|
+vcroak||5.006000|
+vdeb||5.007003|
+vdie|||
+vform||5.006000|
+visit|||
+vivify_defelem|||
+vivify_ref|||
+vload_module||5.006000|
+vmess||5.006000|
+vnewSVpvf|5.006000|5.004000|p
+vnormal||5.009002|
+vnumify||5.009000|
+vstringify||5.009000|
+vwarner||5.006000|
+vwarn||5.006000|
+wait4pid|||
+warn_nocontext|||vn
+warner_nocontext|||vn
+warner||5.006000|v
+warn|||v
+watch|||
+whichsig|||
+write_to_stderr|||
+yyerror|||
+yylex|||
+yyparse|||
+yywarn|||
+);
+
+if (exists $opt{'list-unsupported'}) {
+  my $f;
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $API{$f}{todo};
+    print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
+  }
+  exit 0;
+}
+
+# Scan for possible replacement candidates
+
+my(%replace, %need, %hints, %depends);
+my $replace = 0;
+my $hint = '';
+
+while (<DATA>) {
+  if ($hint) {
+    if (m{^\s*\*\s(.*?)\s*$}) {
+      $hints{$hint} ||= '';  # suppress warning with older perls
+      $hints{$hint} .= "$1\n";
+    }
+    else {
+      $hint = '';
+    }
+  }
+  $hint = $1 if m{^\s*$rccs\sHint:\s+(\w+)\s*$};
+
+  $replace     = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
+  $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
+  $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
+  $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
+
+  if (m{^\s*$rccs\s+(\w+)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
+    push @{$depends{$1}}, map { s/\s+//g; $_ } split /,/, $2;
+  }
+
+  $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
+}
+
+if (exists $opt{'api-info'}) {
+  my $f;
+  my $count = 0;
+  my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $f =~ /$match/;
+    print "\n=== $f ===\n\n";
+    my $info = 0;
+    if ($API{$f}{base} || $API{$f}{todo}) {
+      my $base = format_version($API{$f}{base} || $API{$f}{todo});
+      print "Supported at least starting from perl-$base.\n";
+      $info++;
+    }
+    if ($API{$f}{provided}) {
+      my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
+      print "Support by $ppport provided back to perl-$todo.\n";
+      print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
+      print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
+      print "$hints{$f}" if exists $hints{$f};
+      $info++;
+    }
+    unless ($info) {
+      print "No portability information available.\n";
+    }
+    $count++;
+  }
+  if ($count > 0) {
+    print "\n";
+  }
+  else {
+    print "Found no API matching '$opt{'api-info'}'.\n";
+  }
+  exit 0;
+}
+
+if (exists $opt{'list-provided'}) {
+  my $f;
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $API{$f}{provided};
+    my @flags;
+    push @flags, 'explicit' if exists $need{$f};
+    push @flags, 'depend'   if exists $depends{$f};
+    push @flags, 'hint'     if exists $hints{$f};
+    my $flags = @flags ? '  ['.join(', ', @flags).']' : '';
+    print "$f$flags\n";
+  }
+  exit 0;
+}
+
+my @files;
+my @srcext = qw( xs c h cc cpp );
+my $srcext = join '|', @srcext;
+
+if (@ARGV) {
+  my %seen;
+  @files = grep { -f && !exists $seen{$_} } map { glob $_ } @ARGV;
+}
+else {
+  eval {
+    require File::Find;
+    File::Find::find(sub {
+      $File::Find::name =~ /\.($srcext)$/i
+          and push @files, $File::Find::name;
+    }, '.');
+  };
+  if ($@) {
+    @files = map { glob "*.$_" } @srcext;
+  }
+}
+
+if (!@ARGV || $opt{filter}) {
+  my(@in, @out);
+  my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
+  for (@files) {
+    my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/\.($srcext)$/i;
+    push @{ $out ? \@out : \@in }, $_;
+  }
+  if (@ARGV && @out) {
+    warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
+  }
+  @files = @in;
+}
+
+unless (@files) {
+  die "No input files given!\n";
+}
+
+my(%files, %global, %revreplace);
+%revreplace = reverse %replace;
+my $filename;
+my $patch_opened = 0;
+
+for $filename (@files) {
+  unless (open IN, "<$filename") {
+    warn "Unable to read from $filename: $!\n";
+    next;
+  }
+
+  info("Scanning $filename ...");
+
+  my $c = do { local $/; <IN> };
+  close IN;
+
+  my %file = (orig => $c, changes => 0);
+
+  # temporarily remove C comments from the code
+  my @ccom;
+  $c =~ s{
+    (
+        [^"'/]+
+      |
+        (?:"[^"\\]*(?:\\.[^"\\]*)*" [^"'/]*)+
+      |
+        (?:'[^'\\]*(?:\\.[^'\\]*)*' [^"'/]*)+
+    )
+  |
+    (/ (?:
+        \*[^*]*\*+(?:[^$ccs][^*]*\*+)* /
+        |
+        /[^\r\n]*
+      ))
+  }{
+    defined $2 and push @ccom, $2;
+    defined $1 ? $1 : "$ccs$#ccom$cce";
+  }egsx;
+
+  $file{ccom} = \@ccom;
+  $file{code} = $c;
+  $file{has_inc_ppport} = ($c =~ /#.*include.*\Q$ppport\E/);
+
+  my $func;
+
+  for $func (keys %API) {
+    my $match = $func;
+    $match .= "|$revreplace{$func}" if exists $revreplace{$func};
+    if ($c =~ /\b(?:Perl_)?($match)\b/) {
+      $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
+      $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
+      if (exists $API{$func}{provided}) {
+        if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
+          $file{uses}{$func}++;
+          my @deps = rec_depend($func);
+          if (@deps) {
+            $file{uses_deps}{$func} = \@deps;
+            for (@deps) {
+              $file{uses}{$_} = 0 unless exists $file{uses}{$_};
+            }
+          }
+          for ($func, @deps) {
+            if (exists $need{$_}) {
+              $file{needs}{$_} = 'static';
+            }
+          }
+        }
+      }
+      if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
+        if ($c =~ /\b$func\b/) {
+          $file{uses_todo}{$func}++;
+        }
+      }
+    }
+  }
+
+  while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
+    if (exists $need{$2}) {
+      $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
+    }
+    else {
+      warning("Possibly wrong #define $1 in $filename");
+    }
+  }
+
+  for (qw(uses needs uses_todo needed_global needed_static)) {
+    for $func (keys %{$file{$_}}) {
+      push @{$global{$_}{$func}}, $filename;
+    }
+  }
+
+  $files{$filename} = \%file;
+}
+
+# Globally resolve NEED_'s
+my $need;
+for $need (keys %{$global{needs}}) {
+  if (@{$global{needs}{$need}} > 1) {
+    my @targets = @{$global{needs}{$need}};
+    my @t = grep $files{$_}{needed_global}{$need}, @targets;
+    @targets = @t if @t;
+    @t = grep /\.xs$/i, @targets;
+    @targets = @t if @t;
+    my $target = shift @targets;
+    $files{$target}{needs}{$need} = 'global';
+    for (@{$global{needs}{$need}}) {
+      $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
+    }
+  }
+}
+
+for $filename (@files) {
+  exists $files{$filename} or next;
+
+  info("=== Analyzing $filename ===");
+
+  my %file = %{$files{$filename}};
+  my $func;
+  my $c = $file{code};
+
+  for $func (sort keys %{$file{uses_Perl}}) {
+    if ($API{$func}{varargs}) {
+      my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
+                            { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
+      if ($changes) {
+        warning("Doesn't pass interpreter argument aTHX to Perl_$func");
+        $file{changes} += $changes;
+      }
+    }
+    else {
+      warning("Uses Perl_$func instead of $func");
+      $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
+                                {$func$1(}g);
+    }
+  }
+
+  for $func (sort keys %{$file{uses_replace}}) {
+    warning("Uses $func instead of $replace{$func}");
+    $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+  }
+
+  for $func (sort keys %{$file{uses}}) {
+    next unless $file{uses}{$func};   # if it's only a dependency
+    if (exists $file{uses_deps}{$func}) {
+      diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
+    }
+    elsif (exists $replace{$func}) {
+      warning("Uses $func instead of $replace{$func}");
+      $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+    }
+    else {
+      diag("Uses $func");
+    }
+    hint($func);
+  }
+
+  for $func (sort keys %{$file{uses_todo}}) {
+    warning("Uses $func, which may not be portable below perl ",
+            format_version($API{$func}{todo}));
+  }
+
+  for $func (sort keys %{$file{needed_static}}) {
+    my $message = '';
+    if (not exists $file{uses}{$func}) {
+      $message = "No need to define NEED_$func if $func is never used";
+    }
+    elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
+      $message = "No need to define NEED_$func when already needed globally";
+    }
+    if ($message) {
+      diag($message);
+      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
+    }
+  }
+
+  for $func (sort keys %{$file{needed_global}}) {
+    my $message = '';
+    if (not exists $global{uses}{$func}) {
+      $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
+    }
+    elsif (exists $file{needs}{$func}) {
+      if ($file{needs}{$func} eq 'extern') {
+        $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
+      }
+      elsif ($file{needs}{$func} eq 'static') {
+        $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
+      }
+    }
+    if ($message) {
+      diag($message);
+      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
+    }
+  }
+
+  $file{needs_inc_ppport} = keys %{$file{uses}};
+
+  if ($file{needs_inc_ppport}) {
+    my $pp = '';
+
+    for $func (sort keys %{$file{needs}}) {
+      my $type = $file{needs}{$func};
+      next if $type eq 'extern';
+      my $suffix = $type eq 'global' ? '_GLOBAL' : '';
+      unless (exists $file{"needed_$type"}{$func}) {
+        if ($type eq 'global') {
+          diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
+        }
+        else {
+          diag("File needs $func, adding static request");
+        }
+        $pp .= "#define NEED_$func$suffix\n";
+      }
+    }
+
+    if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
+      $pp = '';
+      $file{changes}++;
+    }
+
+    unless ($file{has_inc_ppport}) {
+      diag("Needs to include '$ppport'");
+      $pp .= qq(#include "$ppport"\n)
+    }
+
+    if ($pp) {
+      $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
+                     || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
+                     || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
+                     || ($c =~ s/^/$pp/);
+    }
+  }
+  else {
+    if ($file{has_inc_ppport}) {
+      diag("No need to include '$ppport'");
+      $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
+    }
+  }
+
+  # put back in our C comments
+  my $ix;
+  my $cppc = 0;
+  my @ccom = @{$file{ccom}};
+  for $ix (0 .. $#ccom) {
+    if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
+      $cppc++;
+      $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
+    }
+    else {
+      $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
+    }
+  }
+
+  if ($cppc) {
+    my $s = $cppc != 1 ? 's' : '';
+    warning("Uses $cppc C++ style comment$s, which is not portable");
+  }
+
+  if ($file{changes}) {
+    if (exists $opt{copy}) {
+      my $newfile = "$filename$opt{copy}";
+      if (-e $newfile) {
+        error("'$newfile' already exists, refusing to write copy of '$filename'");
+      }
+      else {
+        local *F;
+        if (open F, ">$newfile") {
+          info("Writing copy of '$filename' with changes to '$newfile'");
+          print F $c;
+          close F;
+        }
+        else {
+          error("Cannot open '$newfile' for writing: $!");
+        }
+      }
+    }
+    elsif (exists $opt{patch} || $opt{changes}) {
+      if (exists $opt{patch}) {
+        unless ($patch_opened) {
+          if (open PATCH, ">$opt{patch}") {
+            $patch_opened = 1;
+          }
+          else {
+            error("Cannot open '$opt{patch}' for writing: $!");
+            delete $opt{patch};
+            $opt{changes} = 1;
+            goto fallback;
+          }
+        }
+        mydiff(\*PATCH, $filename, $c);
+      }
+      else {
+fallback:
+        info("Suggested changes:");
+        mydiff(\*STDOUT, $filename, $c);
+      }
+    }
+    else {
+      my $s = $file{changes} == 1 ? '' : 's';
+      info("$file{changes} potentially required change$s detected");
+    }
+  }
+  else {
+    info("Looks good");
+  }
+}
+
+close PATCH if $patch_opened;
+
+exit 0;
+
+
+sub mydiff
+{
+  local *F = shift;
+  my($file, $str) = @_;
+  my $diff;
+
+  if (exists $opt{diff}) {
+    $diff = run_diff($opt{diff}, $file, $str);
+  }
+
+  if (!defined $diff and can_use('Text::Diff')) {
+    $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
+    $diff = <<HEADER . $diff;
+--- $file
++++ $file.patched
+HEADER
+  }
+
+  if (!defined $diff) {
+    $diff = run_diff('diff -u', $file, $str);
+  }
+
+  if (!defined $diff) {
+    $diff = run_diff('diff', $file, $str);
+  }
+
+  if (!defined $diff) {
+    error("Cannot generate a diff. Please install Text::Diff or use --copy.");
+    return;
+  }
+
+  print F $diff;
+
+}
+
+sub run_diff
+{
+  my($prog, $file, $str) = @_;
+  my $tmp = 'dppptemp';
+  my $suf = 'aaa';
+  my $diff = '';
+  local *F;
+
+  while (-e "$tmp.$suf") { $suf++ }
+  $tmp = "$tmp.$suf";
+
+  if (open F, ">$tmp") {
+    print F $str;
+    close F;
+
+    if (open F, "$prog $file $tmp |") {
+      while (<F>) {
+        s/\Q$tmp\E/$file.patched/;
+        $diff .= $_;
+      }
+      close F;
+      unlink $tmp;
+      return $diff;
+    }
+
+    unlink $tmp;
+  }
+  else {
+    error("Cannot open '$tmp' for writing: $!");
+  }
+
+  return undef;
+}
+
+sub can_use
+{
+  eval "use @_;";
+  return $@ eq '';
+}
+
+sub rec_depend
+{
+  my $func = shift;
+  my %seen;
+  return () unless exists $depends{$func};
+  grep !$seen{$_}++, map { ($_, rec_depend($_)) } @{$depends{$func}};
+}
+
+sub parse_version
+{
+  my $ver = shift;
+
+  if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
+    return ($1, $2, $3);
+  }
+  elsif ($ver !~ /^\d+\.[\d_]+$/) {
+    die "cannot parse version '$ver'\n";
+  }
+
+  $ver =~ s/_//g;
+  $ver =~ s/$/000000/;
+
+  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+  $v = int $v;
+  $s = int $s;
+
+  if ($r < 5 || ($r == 5 && $v < 6)) {
+    if ($s % 10) {
+      die "cannot parse version '$ver'\n";
+    }
+  }
+
+  return ($r, $v, $s);
+}
+
+sub format_version
+{
+  my $ver = shift;
+
+  $ver =~ s/$/000000/;
+  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+  $v = int $v;
+  $s = int $s;
+
+  if ($r < 5 || ($r == 5 && $v < 6)) {
+    if ($s % 10) {
+      die "invalid version '$ver'\n";
+    }
+    $s /= 10;
+
+    $ver = sprintf "%d.%03d", $r, $v;
+    $s > 0 and $ver .= sprintf "_%02d", $s;
+
+    return $ver;
+  }
+
+  return sprintf "%d.%d.%d", $r, $v, $s;
+}
+
+sub info
+{
+  $opt{quiet} and return;
+  print @_, "\n";
+}
+
+sub diag
+{
+  $opt{quiet} and return;
+  $opt{diag} and print @_, "\n";
+}
+
+sub warning
+{
+  $opt{quiet} and return;
+  print "*** ", @_, "\n";
+}
+
+sub error
+{
+  print "*** ERROR: ", @_, "\n";
+}
+
+my %given_hints;
+sub hint
+{
+  $opt{quiet} and return;
+  $opt{hints} or return;
+  my $func = shift;
+  exists $hints{$func} or return;
+  $given_hints{$func}++ and return;
+  my $hint = $hints{$func};
+  $hint =~ s/^/   /mg;
+  print "   --- hint for $func ---\n", $hint;
+}
+
+sub usage
+{
+  my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
+  my %M = ( 'I' => '*' );
+  $usage =~ s/^\s*perl\s+\S+/$^X $0/;
+  $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
+
+  print <<ENDUSAGE;
+
+Usage: $usage
+
+See perldoc $0 for details.
+
+ENDUSAGE
+
+  exit 2;
+}
+
+__DATA__
+*/
+
+#ifndef _P_P_PORTABILITY_H_
+#define _P_P_PORTABILITY_H_
+
+#ifndef DPPP_NAMESPACE
+#  define DPPP_NAMESPACE DPPP_
+#endif
+
+#define DPPP_CAT2(x,y) CAT2(x,y)
+#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
+
+#ifndef PERL_REVISION
+#  if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
+#    define PERL_PATCHLEVEL_H_IMPLICIT
+#    include <patchlevel.h>
+#  endif
+#  if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
+#    include <could_not_find_Perl_patchlevel.h>
+#  endif
+#  ifndef PERL_REVISION
+#    define PERL_REVISION       (5)
+     /* Replace: 1 */
+#    define PERL_VERSION        PATCHLEVEL
+#    define PERL_SUBVERSION     SUBVERSION
+     /* Replace PERL_PATCHLEVEL with PERL_VERSION */
+     /* Replace: 0 */
+#  endif
+#endif
+
+#define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
+
+/* It is very unlikely that anyone will try to use this with Perl 6
+   (or greater), but who knows.
+ */
+#if PERL_REVISION != 5
+#  error ppport.h only works with Perl version 5
+#endif /* PERL_REVISION != 5 */
+
+#ifdef I_LIMITS
+#  include <limits.h>
+#endif
+
+#ifndef PERL_UCHAR_MIN
+#  define PERL_UCHAR_MIN ((unsigned char)0)
+#endif
+
+#ifndef PERL_UCHAR_MAX
+#  ifdef UCHAR_MAX
+#    define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
+#  else
+#    ifdef MAXUCHAR
+#      define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
+#    else
+#      define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_USHORT_MIN
+#  define PERL_USHORT_MIN ((unsigned short)0)
+#endif
+
+#ifndef PERL_USHORT_MAX
+#  ifdef USHORT_MAX
+#    define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
+#  else
+#    ifdef MAXUSHORT
+#      define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
+#    else
+#      ifdef USHRT_MAX
+#        define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
+#      else
+#        define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_SHORT_MAX
+#  ifdef SHORT_MAX
+#    define PERL_SHORT_MAX ((short)SHORT_MAX)
+#  else
+#    ifdef MAXSHORT    /* Often used in <values.h> */
+#      define PERL_SHORT_MAX ((short)MAXSHORT)
+#    else
+#      ifdef SHRT_MAX
+#        define PERL_SHORT_MAX ((short)SHRT_MAX)
+#      else
+#        define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_SHORT_MIN
+#  ifdef SHORT_MIN
+#    define PERL_SHORT_MIN ((short)SHORT_MIN)
+#  else
+#    ifdef MINSHORT
+#      define PERL_SHORT_MIN ((short)MINSHORT)
+#    else
+#      ifdef SHRT_MIN
+#        define PERL_SHORT_MIN ((short)SHRT_MIN)
+#      else
+#        define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_UINT_MAX
+#  ifdef UINT_MAX
+#    define PERL_UINT_MAX ((unsigned int)UINT_MAX)
+#  else
+#    ifdef MAXUINT
+#      define PERL_UINT_MAX ((unsigned int)MAXUINT)
+#    else
+#      define PERL_UINT_MAX (~(unsigned int)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_UINT_MIN
+#  define PERL_UINT_MIN ((unsigned int)0)
+#endif
+
+#ifndef PERL_INT_MAX
+#  ifdef INT_MAX
+#    define PERL_INT_MAX ((int)INT_MAX)
+#  else
+#    ifdef MAXINT    /* Often used in <values.h> */
+#      define PERL_INT_MAX ((int)MAXINT)
+#    else
+#      define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_INT_MIN
+#  ifdef INT_MIN
+#    define PERL_INT_MIN ((int)INT_MIN)
+#  else
+#    ifdef MININT
+#      define PERL_INT_MIN ((int)MININT)
+#    else
+#      define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_ULONG_MAX
+#  ifdef ULONG_MAX
+#    define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
+#  else
+#    ifdef MAXULONG
+#      define PERL_ULONG_MAX ((unsigned long)MAXULONG)
+#    else
+#      define PERL_ULONG_MAX (~(unsigned long)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_ULONG_MIN
+#  define PERL_ULONG_MIN ((unsigned long)0L)
+#endif
+
+#ifndef PERL_LONG_MAX
+#  ifdef LONG_MAX
+#    define PERL_LONG_MAX ((long)LONG_MAX)
+#  else
+#    ifdef MAXLONG
+#      define PERL_LONG_MAX ((long)MAXLONG)
+#    else
+#      define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_LONG_MIN
+#  ifdef LONG_MIN
+#    define PERL_LONG_MIN ((long)LONG_MIN)
+#  else
+#    ifdef MINLONG
+#      define PERL_LONG_MIN ((long)MINLONG)
+#    else
+#      define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
+#    endif
+#  endif
+#endif
+
+#if defined(HAS_QUAD) && (defined(convex) || defined(uts))
+#  ifndef PERL_UQUAD_MAX
+#    ifdef ULONGLONG_MAX
+#      define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
+#    else
+#      ifdef MAXULONGLONG
+#        define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
+#      else
+#        define PERL_UQUAD_MAX (~(unsigned long long)0)
+#      endif
+#    endif
+#  endif
+
+#  ifndef PERL_UQUAD_MIN
+#    define PERL_UQUAD_MIN ((unsigned long long)0L)
+#  endif
+
+#  ifndef PERL_QUAD_MAX
+#    ifdef LONGLONG_MAX
+#      define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
+#    else
+#      ifdef MAXLONGLONG
+#        define PERL_QUAD_MAX ((long long)MAXLONGLONG)
+#      else
+#        define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
+#      endif
+#    endif
+#  endif
+
+#  ifndef PERL_QUAD_MIN
+#    ifdef LONGLONG_MIN
+#      define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
+#    else
+#      ifdef MINLONGLONG
+#        define PERL_QUAD_MIN ((long long)MINLONGLONG)
+#      else
+#        define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+#      endif
+#    endif
+#  endif
+#endif
+
+/* This is based on code from 5.003 perl.h */
+#ifdef HAS_QUAD
+#  ifdef cray
+#ifndef IVTYPE
+#  define IVTYPE                         int
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_INT_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_INT_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_UINT_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_UINT_MAX
+#endif
+
+#    ifdef INTSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         INTSIZE
+#endif
+
+#    endif
+#  else
+#    if defined(convex) || defined(uts)
+#ifndef IVTYPE
+#  define IVTYPE                         long long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_QUAD_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_QUAD_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_UQUAD_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_UQUAD_MAX
+#endif
+
+#      ifdef LONGLONGSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         LONGLONGSIZE
+#endif
+
+#      endif
+#    else
+#ifndef IVTYPE
+#  define IVTYPE                         long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_ULONG_MAX
+#endif
+
+#      ifdef LONGSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         LONGSIZE
+#endif
+
+#      endif
+#    endif
+#  endif
+#ifndef IVSIZE
+#  define IVSIZE                         8
+#endif
+
+#ifndef PERL_QUAD_MIN
+#  define PERL_QUAD_MIN                  IV_MIN
+#endif
+
+#ifndef PERL_QUAD_MAX
+#  define PERL_QUAD_MAX                  IV_MAX
+#endif
+
+#ifndef PERL_UQUAD_MIN
+#  define PERL_UQUAD_MIN                 UV_MIN
+#endif
+
+#ifndef PERL_UQUAD_MAX
+#  define PERL_UQUAD_MAX                 UV_MAX
+#endif
+
+#else
+#ifndef IVTYPE
+#  define IVTYPE                         long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_ULONG_MAX
+#endif
+
+#endif
+
+#ifndef IVSIZE
+#  ifdef LONGSIZE
+#    define IVSIZE LONGSIZE
+#  else
+#    define IVSIZE 4 /* A bold guess, but the best we can make. */
+#  endif
+#endif
+#ifndef UVTYPE
+#  define UVTYPE                         unsigned IVTYPE
+#endif
+
+#ifndef UVSIZE
+#  define UVSIZE                         IVSIZE
+#endif
+
+#ifndef sv_setuv
+#  define sv_setuv(sv, uv)                  \
+   STMT_START {                             \
+       UV TeMpUv = uv;                      \
+       if (TeMpUv <= IV_MAX)                \
+           sv_setiv(sv, TeMpUv);            \
+       else                                 \
+           sv_setnv(sv, (double)TeMpUv);    \
+   } STMT_END
+#endif
+
+#ifndef newSVuv
+#  define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
+#endif
+#ifndef sv_2uv
+#  define sv_2uv(sv)                     ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
+#endif
+
+#ifndef SvUVX
+#  define SvUVX(sv)                      ((UV)SvIVX(sv))
+#endif
+
+#ifndef SvUVXx
+#  define SvUVXx(sv)                     SvUVX(sv)
+#endif
+
+#ifndef SvUV
+#  define SvUV(sv)                       (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+#endif
+
+#ifndef SvUVx
+#  define SvUVx(sv)                      ((PL_Sv = (sv)), SvUV(PL_Sv))
+#endif
+
+/* Hint: sv_uv
+ * Always use the SvUVx() macro instead of sv_uv().
+ */
+#ifndef sv_uv
+#  define sv_uv(sv)                      SvUVx(sv)
+#endif
+#ifndef XST_mUV
+#  define XST_mUV(i,v)                   (ST(i) = sv_2mortal(newSVuv(v))  )
+#endif
+
+#ifndef XSRETURN_UV
+#  define XSRETURN_UV(v)                 STMT_START { XST_mUV(0,v);  XSRETURN(1); } STMT_END
+#endif
+#ifndef PUSHu
+#  define PUSHu(u)                       STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG;  } STMT_END
+#endif
+
+#ifndef XPUSHu
+#  define XPUSHu(u)                      STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+#endif
+
+#if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))
+/* Replace: 1 */
+#  define PL_DBsingle               DBsingle
+#  define PL_DBsub                  DBsub
+#  define PL_Sv                     Sv
+#  define PL_compiling              compiling
+#  define PL_copline                copline
+#  define PL_curcop                 curcop
+#  define PL_curstash               curstash
+#  define PL_debstash               debstash
+#  define PL_defgv                  defgv
+#  define PL_diehook                diehook
+#  define PL_dirty                  dirty
+#  define PL_dowarn                 dowarn
+#  define PL_errgv                  errgv
+#  define PL_hexdigit               hexdigit
+#  define PL_hints                  hints
+#  define PL_na	                    na
+#  define PL_no_modify              no_modify
+#  define PL_perl_destruct_level    perl_destruct_level
+#  define PL_perldb                 perldb
+#  define PL_ppaddr                 ppaddr
+#  define PL_rsfp_filters           rsfp_filters
+#  define PL_rsfp                   rsfp
+#  define PL_stack_base             stack_base
+#  define PL_stack_sp               stack_sp
+#  define PL_stdingv                stdingv
+#  define PL_sv_arenaroot           sv_arenaroot
+#  define PL_sv_no                  sv_no
+#  define PL_sv_undef               sv_undef
+#  define PL_sv_yes                 sv_yes
+#  define PL_tainted                tainted
+#  define PL_tainting               tainting
+/* Replace: 0 */
+#endif
+
+#ifndef PERL_UNUSED_DECL
+#  ifdef HASATTRIBUTE
+#    if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
+#      define PERL_UNUSED_DECL
+#    else
+#      define PERL_UNUSED_DECL __attribute__((unused))
+#    endif
+#  else
+#    define PERL_UNUSED_DECL
+#  endif
+#endif
+#ifndef NOOP
+#  define NOOP                           (void)0
+#endif
+
+#ifndef dNOOP
+#  define dNOOP                          extern int Perl___notused PERL_UNUSED_DECL
+#endif
+
+#ifndef NVTYPE
+#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+#    define NVTYPE long double
+#  else
+#    define NVTYPE double
+#  endif
+typedef NVTYPE NV;
+#endif
+
+#ifndef INT2PTR
+
+#  if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+#    define PTRV                  UV
+#    define INT2PTR(any,d)        (any)(d)
+#  else
+#    if PTRSIZE == LONGSIZE
+#      define PTRV                unsigned long
+#    else
+#      define PTRV                unsigned
+#    endif
+#    define INT2PTR(any,d)        (any)(PTRV)(d)
+#  endif
+
+#  define NUM2PTR(any,d)  (any)(PTRV)(d)
+#  define PTR2IV(p)       INT2PTR(IV,p)
+#  define PTR2UV(p)       INT2PTR(UV,p)
+#  define PTR2NV(p)       NUM2PTR(NV,p)
+
+#  if PTRSIZE == LONGSIZE
+#    define PTR2ul(p)     (unsigned long)(p)
+#  else
+#    define PTR2ul(p)     INT2PTR(unsigned long,p)
+#  endif
+
+#endif /* !INT2PTR */
+
+#undef START_EXTERN_C
+#undef END_EXTERN_C
+#undef EXTERN_C
+#ifdef __cplusplus
+#  define START_EXTERN_C extern "C" {
+#  define END_EXTERN_C }
+#  define EXTERN_C extern "C"
+#else
+#  define START_EXTERN_C
+#  define END_EXTERN_C
+#  define EXTERN_C extern
+#endif
+
+#ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#  if defined(__STRICT_ANSI__) && defined(PERL_GCC_PEDANTIC)
+#    define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#  endif
+#endif
+
+#undef STMT_START
+#undef STMT_END
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+#  define STMT_START	(void)(	/* gcc supports ``({ STATEMENTS; })'' */
+#  define STMT_END	)
+#else
+#  if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
+#    define STMT_START	if (1)
+#    define STMT_END	else (void)0
+#  else
+#    define STMT_START	do
+#    define STMT_END	while (0)
+#  endif
+#endif
+#ifndef boolSV
+#  define boolSV(b)                      ((b) ? &PL_sv_yes : &PL_sv_no)
+#endif
+
+/* DEFSV appears first in 5.004_56 */
+#ifndef DEFSV
+#  define DEFSV                          GvSV(PL_defgv)
+#endif
+
+#ifndef SAVE_DEFSV
+#  define SAVE_DEFSV                     SAVESPTR(GvSV(PL_defgv))
+#endif
+
+/* Older perls (<=5.003) lack AvFILLp */
+#ifndef AvFILLp
+#  define AvFILLp                        AvFILL
+#endif
+#ifndef ERRSV
+#  define ERRSV                          get_sv("@",FALSE)
+#endif
+#ifndef newSVpvn
+#  define newSVpvn(data,len)             ((data)                                              \
+                                    ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
+                                    : newSV(0))
+#endif
+
+/* Hint: gv_stashpvn
+ * This function's backport doesn't support the length parameter, but
+ * rather ignores it. Portability can only be ensured if the length
+ * parameter is used for speed reasons, but the length can always be
+ * correctly computed from the string argument.
+ */
+#ifndef gv_stashpvn
+#  define gv_stashpvn(str,len,create)    gv_stashpv(str,create)
+#endif
+
+/* Replace: 1 */
+#ifndef get_cv
+#  define get_cv                         perl_get_cv
+#endif
+
+#ifndef get_sv
+#  define get_sv                         perl_get_sv
+#endif
+
+#ifndef get_av
+#  define get_av                         perl_get_av
+#endif
+
+#ifndef get_hv
+#  define get_hv                         perl_get_hv
+#endif
+
+/* Replace: 0 */
+
+#ifdef HAS_MEMCMP
+#ifndef memNE
+#  define memNE(s1,s2,l)                 (memcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+#  define memEQ(s1,s2,l)                 (!memcmp(s1,s2,l))
+#endif
+
+#else
+#ifndef memNE
+#  define memNE(s1,s2,l)                 (bcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+#  define memEQ(s1,s2,l)                 (!bcmp(s1,s2,l))
+#endif
+
+#endif
+#ifndef MoveD
+#  define MoveD(s,d,n,t)                 memmove((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifndef CopyD
+#  define CopyD(s,d,n,t)                 memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifdef HAS_MEMSET
+#ifndef ZeroD
+#  define ZeroD(d,n,t)                   memzero((char*)(d), (n) * sizeof(t))
+#endif
+
+#else
+#ifndef ZeroD
+#  define ZeroD(d,n,t)                   ((void)memzero((char*)(d), (n) * sizeof(t)),d)
+#endif
+
+#endif
+#ifndef Poison
+#  define Poison(d,n,t)                  (void)memset((char*)(d), 0xAB, (n) * sizeof(t))
+#endif
+#ifndef dUNDERBAR
+#  define dUNDERBAR                      dNOOP
+#endif
+
+#ifndef UNDERBAR
+#  define UNDERBAR                       DEFSV
+#endif
+#ifndef dAX
+#  define dAX                            I32 ax = MARK - PL_stack_base + 1
+#endif
+
+#ifndef dITEMS
+#  define dITEMS                         I32 items = SP - MARK
+#endif
+#ifndef dXSTARG
+#  define dXSTARG                        SV * targ = sv_newmortal()
+#endif
+#ifndef dTHR
+#  define dTHR                           dNOOP
+#endif
+#ifndef dTHX
+#  define dTHX                           dNOOP
+#endif
+
+#ifndef dTHXa
+#  define dTHXa(x)                       dNOOP
+#endif
+#ifndef pTHX
+#  define pTHX                           void
+#endif
+
+#ifndef pTHX_
+#  define pTHX_
+#endif
+
+#ifndef aTHX
+#  define aTHX
+#endif
+
+#ifndef aTHX_
+#  define aTHX_
+#endif
+#ifndef dTHXoa
+#  define dTHXoa(x)                      dTHXa(x)
+#endif
+#ifndef PUSHmortal
+#  define PUSHmortal                     PUSHs(sv_newmortal())
+#endif
+
+#ifndef mPUSHp
+#  define mPUSHp(p,l)                    sv_setpvn_mg(PUSHmortal, (p), (l))
+#endif
+
+#ifndef mPUSHn
+#  define mPUSHn(n)                      sv_setnv_mg(PUSHmortal, (NV)(n))
+#endif
+
+#ifndef mPUSHi
+#  define mPUSHi(i)                      sv_setiv_mg(PUSHmortal, (IV)(i))
+#endif
+
+#ifndef mPUSHu
+#  define mPUSHu(u)                      sv_setuv_mg(PUSHmortal, (UV)(u))
+#endif
+#ifndef XPUSHmortal
+#  define XPUSHmortal                    XPUSHs(sv_newmortal())
+#endif
+
+#ifndef mXPUSHp
+#  define mXPUSHp(p,l)                   STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END
+#endif
+
+#ifndef mXPUSHn
+#  define mXPUSHn(n)                     STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END
+#endif
+
+#ifndef mXPUSHi
+#  define mXPUSHi(i)                     STMT_START { EXTEND(sp,1); sv_setiv_mg(PUSHmortal, (IV)(i)); } STMT_END
+#endif
+
+#ifndef mXPUSHu
+#  define mXPUSHu(u)                     STMT_START { EXTEND(sp,1); sv_setuv_mg(PUSHmortal, (UV)(u)); } STMT_END
+#endif
+
+/* Replace: 1 */
+#ifndef call_sv
+#  define call_sv                        perl_call_sv
+#endif
+
+#ifndef call_pv
+#  define call_pv                        perl_call_pv
+#endif
+
+#ifndef call_argv
+#  define call_argv                      perl_call_argv
+#endif
+
+#ifndef call_method
+#  define call_method                    perl_call_method
+#endif
+#ifndef eval_sv
+#  define eval_sv                        perl_eval_sv
+#endif
+
+/* Replace: 0 */
+
+/* Replace perl_eval_pv with eval_pv */
+/* eval_pv depends on eval_sv */
+
+#ifndef eval_pv
+#if defined(NEED_eval_pv)
+static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+static
+#else
+extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+#endif
+
+#ifdef eval_pv
+#  undef eval_pv
+#endif
+#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
+#define Perl_eval_pv DPPP_(my_eval_pv)
+
+#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
+
+SV*
+DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
+{
+    dSP;
+    SV* sv = newSVpv(p, 0);
+
+    PUSHMARK(sp);
+    eval_sv(sv, G_SCALAR);
+    SvREFCNT_dec(sv);
+
+    SPAGAIN;
+    sv = POPs;
+    PUTBACK;
+
+    if (croak_on_error && SvTRUE(GvSV(errgv)))
+	croak(SvPVx(GvSV(errgv), na));
+
+    return sv;
+}
+
+#endif
+#endif
+#ifndef newRV_inc
+#  define newRV_inc(sv)                  newRV(sv)   /* Replace */
+#endif
+
+#ifndef newRV_noinc
+#if defined(NEED_newRV_noinc)
+static SV * DPPP_(my_newRV_noinc)(SV *sv);
+static
+#else
+extern SV * DPPP_(my_newRV_noinc)(SV *sv);
+#endif
+
+#ifdef newRV_noinc
+#  undef newRV_noinc
+#endif
+#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
+#define Perl_newRV_noinc DPPP_(my_newRV_noinc)
+
+#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
+SV *
+DPPP_(my_newRV_noinc)(SV *sv)
+{
+  SV *rv = (SV *)newRV(sv);
+  SvREFCNT_dec(sv);
+  return rv;
+}
+#endif
+#endif
+
+/* Hint: newCONSTSUB
+ * Returns a CV* as of perl-5.7.1. This return value is not supported
+ * by Devel::PPPort.
+ */
+
+/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
+#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63))) && ((PERL_VERSION != 4) || (PERL_SUBVERSION != 5))
+#if defined(NEED_newCONSTSUB)
+static void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
+static
+#else
+extern void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
+#endif
+
+#ifdef newCONSTSUB
+#  undef newCONSTSUB
+#endif
+#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
+#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
+
+#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
+
+void
+DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv)
+{
+	U32 oldhints = PL_hints;
+	HV *old_cop_stash = PL_curcop->cop_stash;
+	HV *old_curstash = PL_curstash;
+	line_t oldline = PL_curcop->cop_line;
+	PL_curcop->cop_line = PL_copline;
+
+	PL_hints &= ~HINT_BLOCK_SCOPE;
+	if (stash)
+		PL_curstash = PL_curcop->cop_stash = stash;
+
+	newSUB(
+
+#if   ((PERL_VERSION < 3) || ((PERL_VERSION == 3) && (PERL_SUBVERSION < 22)))
+		start_subparse(),
+#elif ((PERL_VERSION == 3) && (PERL_SUBVERSION == 22))
+     		start_subparse(0),
+#else  /* 5.003_23  onwards */
+     		start_subparse(FALSE, 0),
+#endif
+
+		newSVOP(OP_CONST, 0, newSVpv(name,0)),
+		newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
+		newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
+	);
+
+	PL_hints = oldhints;
+	PL_curcop->cop_stash = old_cop_stash;
+	PL_curstash = old_curstash;
+	PL_curcop->cop_line = oldline;
+}
+#endif
+#endif
+
+/*
+ * Boilerplate macros for initializing and accessing interpreter-local
+ * data from C.  All statics in extensions should be reworked to use
+ * this, if you want to make the extension thread-safe.  See ext/re/re.xs
+ * for an example of the use of these macros.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+ *    all the data that needs to be interpreter-local.
+ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+ *    (typically put in the BOOT: section).
+ * 5. Use the members of the my_cxt_t structure everywhere as
+ *    MY_CXT.member.
+ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+ *    access MY_CXT.
+ */
+
+#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
+    defined(PERL_CAPI)    || defined(PERL_IMPLICIT_CONTEXT)
+
+#ifndef START_MY_CXT
+
+/* This must appear in all extensions that define a my_cxt_t structure,
+ * right after the definition (i.e. at file scope).  The non-threads
+ * case below uses it to declare the data as static. */
+#define START_MY_CXT
+
+#if (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION < 68 ))
+/* Fetches the SV that keeps the per-interpreter data. */
+#define dMY_CXT_SV \
+	SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
+#else /* >= perl5.004_68 */
+#define dMY_CXT_SV \
+	SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,		\
+				  sizeof(MY_CXT_KEY)-1, TRUE)
+#endif /* < perl5.004_68 */
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT	\
+	dMY_CXT_SV;							\
+	my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
+
+/* Creates and zeroes the per-interpreter data.
+ * (We allocate my_cxtp in a Perl SV so that it will be released when
+ * the interpreter goes away.) */
+#define MY_CXT_INIT \
+	dMY_CXT_SV;							\
+	/* newSV() allocates one more than needed */			\
+	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+	Zero(my_cxtp, 1, my_cxt_t);					\
+	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+
+/* This macro must be used to access members of the my_cxt_t structure.
+ * e.g. MYCXT.some_data */
+#define MY_CXT		(*my_cxtp)
+
+/* Judicious use of these macros can reduce the number of times dMY_CXT
+ * is used.  Use is similar to pTHX, aTHX etc. */
+#define pMY_CXT		my_cxt_t *my_cxtp
+#define pMY_CXT_	pMY_CXT,
+#define _pMY_CXT	,pMY_CXT
+#define aMY_CXT		my_cxtp
+#define aMY_CXT_	aMY_CXT,
+#define _aMY_CXT	,aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+	dMY_CXT_SV;							\
+	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+	Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
+	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+#endif
+
+#else /* single interpreter */
+
+#ifndef START_MY_CXT
+
+#define START_MY_CXT	static my_cxt_t my_cxt;
+#define dMY_CXT_SV	dNOOP
+#define dMY_CXT		dNOOP
+#define MY_CXT_INIT	NOOP
+#define MY_CXT		my_cxt
+
+#define pMY_CXT		void
+#define pMY_CXT_
+#define _pMY_CXT
+#define aMY_CXT
+#define aMY_CXT_
+#define _aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+#define MY_CXT_CLONE	NOOP
+#endif
+
+#endif
+
+#ifndef IVdf
+#  if IVSIZE == LONGSIZE
+#    define	IVdf      "ld"
+#    define	UVuf      "lu"
+#    define	UVof      "lo"
+#    define	UVxf      "lx"
+#    define	UVXf      "lX"
+#  else
+#    if IVSIZE == INTSIZE
+#      define	IVdf      "d"
+#      define	UVuf      "u"
+#      define	UVof      "o"
+#      define	UVxf      "x"
+#      define	UVXf      "X"
+#    endif
+#  endif
+#endif
+
+#ifndef NVef
+#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
+      defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */
+#    define NVef          PERL_PRIeldbl
+#    define NVff          PERL_PRIfldbl
+#    define NVgf          PERL_PRIgldbl
+#  else
+#    define NVef          "e"
+#    define NVff          "f"
+#    define NVgf          "g"
+#  endif
+#endif
+
+#ifndef SvPV_nolen
+
+#if defined(NEED_sv_2pv_nolen)
+static char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
+static
+#else
+extern char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
+#endif
+
+#ifdef sv_2pv_nolen
+#  undef sv_2pv_nolen
+#endif
+#define sv_2pv_nolen(a) DPPP_(my_sv_2pv_nolen)(aTHX_ a)
+#define Perl_sv_2pv_nolen DPPP_(my_sv_2pv_nolen)
+
+#if defined(NEED_sv_2pv_nolen) || defined(NEED_sv_2pv_nolen_GLOBAL)
+
+char *
+DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv)
+{
+  STRLEN n_a;
+  return sv_2pv(sv, &n_a);
+}
+
+#endif
+
+/* Hint: sv_2pv_nolen
+ * Use the SvPV_nolen() macro instead of sv_2pv_nolen().
+ */
+
+/* SvPV_nolen depends on sv_2pv_nolen */
+#define SvPV_nolen(sv) \
+          ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+           ? SvPVX(sv) : sv_2pv_nolen(sv))
+
+#endif
+
+#ifdef SvPVbyte
+
+/* Hint: SvPVbyte
+ * Does not work in perl-5.6.1, ppport.h implements a version
+ * borrowed from perl-5.7.3.
+ */
+
+#if ((PERL_VERSION < 7) || ((PERL_VERSION == 7) && (PERL_SUBVERSION < 0)))
+
+#if defined(NEED_sv_2pvbyte)
+static char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
+static
+#else
+extern char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
+#endif
+
+#ifdef sv_2pvbyte
+#  undef sv_2pvbyte
+#endif
+#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
+#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
+
+#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
+
+char *
+DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp)
+{
+  sv_utf8_downgrade(sv,0);
+  return SvPV(sv,*lp);
+}
+
+#endif
+
+/* Hint: sv_2pvbyte
+ * Use the SvPVbyte() macro instead of sv_2pvbyte().
+ */
+
+#undef SvPVbyte
+
+/* SvPVbyte depends on sv_2pvbyte */
+#define SvPVbyte(sv, lp)                                                \
+        ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)                \
+         ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+
+#endif
+
+#else
+
+#  define SvPVbyte          SvPV
+#  define sv_2pvbyte        sv_2pv
+
+#endif
+
+/* sv_2pvbyte_nolen depends on sv_2pv_nolen */
+#ifndef sv_2pvbyte_nolen
+#  define sv_2pvbyte_nolen               sv_2pv_nolen
+#endif
+
+/* Hint: sv_pvn
+ * Always use the SvPV() macro instead of sv_pvn().
+ */
+#ifndef sv_pvn
+#  define sv_pvn(sv, len)                SvPV(sv, len)
+#endif
+
+/* Hint: sv_pvn_force
+ * Always use the SvPV_force() macro instead of sv_pvn_force().
+ */
+#ifndef sv_pvn_force
+#  define sv_pvn_force(sv, len)          SvPV_force(sv, len)
+#endif
+
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(vnewSVpvf)
+#if defined(NEED_vnewSVpvf)
+static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
+static
+#else
+extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
+#endif
+
+#ifdef vnewSVpvf
+#  undef vnewSVpvf
+#endif
+#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
+#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
+
+#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
+
+SV *
+DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
+{
+  register SV *sv = newSV(0);
+  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+  return sv;
+}
+
+#endif
+#endif
+
+/* sv_vcatpvf depends on sv_vcatpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf)
+#  define sv_vcatpvf(sv, pat, args)  sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+/* sv_vsetpvf depends on sv_vsetpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf)
+#  define sv_vsetpvf(sv, pat, args)  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+/* sv_catpvf_mg depends on sv_vcatpvfn, sv_catpvf_mg_nocontext */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg)
+#if defined(NEED_sv_catpvf_mg)
+static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+#endif
+
+#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
+
+#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+  va_list args;
+  va_start(args, pat);
+  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+
+/* sv_catpvf_mg_nocontext depends on sv_vcatpvfn */
+#ifdef PERL_IMPLICIT_CONTEXT
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg_nocontext)
+#if defined(NEED_sv_catpvf_mg_nocontext)
+static void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+#endif
+
+#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+
+#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+  dTHX;
+  va_list args;
+  va_start(args, pat);
+  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+#ifndef sv_catpvf_mg
+#  ifdef PERL_IMPLICIT_CONTEXT
+#    define sv_catpvf_mg   Perl_sv_catpvf_mg_nocontext
+#  else
+#    define sv_catpvf_mg   Perl_sv_catpvf_mg
+#  endif
+#endif
+
+/* sv_vcatpvf_mg depends on sv_vcatpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf_mg)
+#  define sv_vcatpvf_mg(sv, pat, args)                                     \
+   STMT_START {                                                            \
+     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
+     SvSETMAGIC(sv);                                                       \
+   } STMT_END
+#endif
+
+/* sv_setpvf_mg depends on sv_vsetpvfn, sv_setpvf_mg_nocontext */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg)
+#if defined(NEED_sv_setpvf_mg)
+static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+#endif
+
+#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
+
+#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+  va_list args;
+  va_start(args, pat);
+  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+
+/* sv_setpvf_mg_nocontext depends on sv_vsetpvfn */
+#ifdef PERL_IMPLICIT_CONTEXT
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg_nocontext)
+#if defined(NEED_sv_setpvf_mg_nocontext)
+static void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+#endif
+
+#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+
+#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+  dTHX;
+  va_list args;
+  va_start(args, pat);
+  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+#ifndef sv_setpvf_mg
+#  ifdef PERL_IMPLICIT_CONTEXT
+#    define sv_setpvf_mg   Perl_sv_setpvf_mg_nocontext
+#  else
+#    define sv_setpvf_mg   Perl_sv_setpvf_mg
+#  endif
+#endif
+
+/* sv_vsetpvf_mg depends on sv_vsetpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf_mg)
+#  define sv_vsetpvf_mg(sv, pat, args)                                     \
+   STMT_START {                                                            \
+     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
+     SvSETMAGIC(sv);                                                       \
+   } STMT_END
+#endif
+#ifndef SvGETMAGIC
+#  define SvGETMAGIC(x)                  STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
+#endif
+#ifndef PERL_MAGIC_sv
+#  define PERL_MAGIC_sv                  '\0'
+#endif
+
+#ifndef PERL_MAGIC_overload
+#  define PERL_MAGIC_overload            'A'
+#endif
+
+#ifndef PERL_MAGIC_overload_elem
+#  define PERL_MAGIC_overload_elem       'a'
+#endif
+
+#ifndef PERL_MAGIC_overload_table
+#  define PERL_MAGIC_overload_table      'c'
+#endif
+
+#ifndef PERL_MAGIC_bm
+#  define PERL_MAGIC_bm                  'B'
+#endif
+
+#ifndef PERL_MAGIC_regdata
+#  define PERL_MAGIC_regdata             'D'
+#endif
+
+#ifndef PERL_MAGIC_regdatum
+#  define PERL_MAGIC_regdatum            'd'
+#endif
+
+#ifndef PERL_MAGIC_env
+#  define PERL_MAGIC_env                 'E'
+#endif
+
+#ifndef PERL_MAGIC_envelem
+#  define PERL_MAGIC_envelem             'e'
+#endif
+
+#ifndef PERL_MAGIC_fm
+#  define PERL_MAGIC_fm                  'f'
+#endif
+
+#ifndef PERL_MAGIC_regex_global
+#  define PERL_MAGIC_regex_global        'g'
+#endif
+
+#ifndef PERL_MAGIC_isa
+#  define PERL_MAGIC_isa                 'I'
+#endif
+
+#ifndef PERL_MAGIC_isaelem
+#  define PERL_MAGIC_isaelem             'i'
+#endif
+
+#ifndef PERL_MAGIC_nkeys
+#  define PERL_MAGIC_nkeys               'k'
+#endif
+
+#ifndef PERL_MAGIC_dbfile
+#  define PERL_MAGIC_dbfile              'L'
+#endif
+
+#ifndef PERL_MAGIC_dbline
+#  define PERL_MAGIC_dbline              'l'
+#endif
+
+#ifndef PERL_MAGIC_mutex
+#  define PERL_MAGIC_mutex               'm'
+#endif
+
+#ifndef PERL_MAGIC_shared
+#  define PERL_MAGIC_shared              'N'
+#endif
+
+#ifndef PERL_MAGIC_shared_scalar
+#  define PERL_MAGIC_shared_scalar       'n'
+#endif
+
+#ifndef PERL_MAGIC_collxfrm
+#  define PERL_MAGIC_collxfrm            'o'
+#endif
+
+#ifndef PERL_MAGIC_tied
+#  define PERL_MAGIC_tied                'P'
+#endif
+
+#ifndef PERL_MAGIC_tiedelem
+#  define PERL_MAGIC_tiedelem            'p'
+#endif
+
+#ifndef PERL_MAGIC_tiedscalar
+#  define PERL_MAGIC_tiedscalar          'q'
+#endif
+
+#ifndef PERL_MAGIC_qr
+#  define PERL_MAGIC_qr                  'r'
+#endif
+
+#ifndef PERL_MAGIC_sig
+#  define PERL_MAGIC_sig                 'S'
+#endif
+
+#ifndef PERL_MAGIC_sigelem
+#  define PERL_MAGIC_sigelem             's'
+#endif
+
+#ifndef PERL_MAGIC_taint
+#  define PERL_MAGIC_taint               't'
+#endif
+
+#ifndef PERL_MAGIC_uvar
+#  define PERL_MAGIC_uvar                'U'
+#endif
+
+#ifndef PERL_MAGIC_uvar_elem
+#  define PERL_MAGIC_uvar_elem           'u'
+#endif
+
+#ifndef PERL_MAGIC_vstring
+#  define PERL_MAGIC_vstring             'V'
+#endif
+
+#ifndef PERL_MAGIC_vec
+#  define PERL_MAGIC_vec                 'v'
+#endif
+
+#ifndef PERL_MAGIC_utf8
+#  define PERL_MAGIC_utf8                'w'
+#endif
+
+#ifndef PERL_MAGIC_substr
+#  define PERL_MAGIC_substr              'x'
+#endif
+
+#ifndef PERL_MAGIC_defelem
+#  define PERL_MAGIC_defelem             'y'
+#endif
+
+#ifndef PERL_MAGIC_glob
+#  define PERL_MAGIC_glob                '*'
+#endif
+
+#ifndef PERL_MAGIC_arylen
+#  define PERL_MAGIC_arylen              '#'
+#endif
+
+#ifndef PERL_MAGIC_pos
+#  define PERL_MAGIC_pos                 '.'
+#endif
+
+#ifndef PERL_MAGIC_backref
+#  define PERL_MAGIC_backref             '<'
+#endif
+
+#ifndef PERL_MAGIC_ext
+#  define PERL_MAGIC_ext                 '~'
+#endif
+
+/* That's the best we can do... */
+#ifndef SvPV_force_nomg
+#  define SvPV_force_nomg                SvPV_force
+#endif
+
+#ifndef SvPV_nomg
+#  define SvPV_nomg                      SvPV
+#endif
+
+#ifndef sv_catpvn_nomg
+#  define sv_catpvn_nomg                 sv_catpvn
+#endif
+
+#ifndef sv_catsv_nomg
+#  define sv_catsv_nomg                  sv_catsv
+#endif
+
+#ifndef sv_setsv_nomg
+#  define sv_setsv_nomg                  sv_setsv
+#endif
+
+#ifndef sv_pvn_nomg
+#  define sv_pvn_nomg                    sv_pvn
+#endif
+
+#ifndef SvIV_nomg
+#  define SvIV_nomg                      SvIV
+#endif
+
+#ifndef SvUV_nomg
+#  define SvUV_nomg                      SvUV
+#endif
+
+#ifndef sv_catpv_mg
+#  define sv_catpv_mg(sv, ptr)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_catpv(TeMpSv,ptr);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_catpvn_mg
+#  define sv_catpvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_catpvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_catsv_mg
+#  define sv_catsv_mg(dsv, ssv)         \
+   STMT_START {                         \
+     SV *TeMpSv = dsv;                  \
+     sv_catsv(TeMpSv,ssv);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setiv_mg
+#  define sv_setiv_mg(sv, i)            \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setiv(TeMpSv,i);                \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setnv_mg
+#  define sv_setnv_mg(sv, num)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setnv(TeMpSv,num);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setpv_mg
+#  define sv_setpv_mg(sv, ptr)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setpv(TeMpSv,ptr);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setpvn_mg
+#  define sv_setpvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setpvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setsv_mg
+#  define sv_setsv_mg(dsv, ssv)         \
+   STMT_START {                         \
+     SV *TeMpSv = dsv;                  \
+     sv_setsv(TeMpSv,ssv);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setuv_mg
+#  define sv_setuv_mg(sv, i)            \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setuv(TeMpSv,i);                \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_usepvn_mg
+#  define sv_usepvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_usepvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifdef USE_ITHREADS
+#ifndef CopFILE
+#  define CopFILE(c)                     ((c)->cop_file)
+#endif
+
+#ifndef CopFILEGV
+#  define CopFILEGV(c)                   (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
+#endif
+
+#ifndef CopFILE_set
+#  define CopFILE_set(c,pv)              ((c)->cop_file = savepv(pv))
+#endif
+
+#ifndef CopFILESV
+#  define CopFILESV(c)                   (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+#  define CopFILEAV(c)                   (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
+#endif
+
+#ifndef CopSTASHPV
+#  define CopSTASHPV(c)                  ((c)->cop_stashpv)
+#endif
+
+#ifndef CopSTASHPV_set
+#  define CopSTASHPV_set(c,pv)           ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
+#endif
+
+#ifndef CopSTASH
+#  define CopSTASH(c)                    (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
+#endif
+
+#ifndef CopSTASH_set
+#  define CopSTASH_set(c,hv)             CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
+#endif
+
+#ifndef CopSTASH_eq
+#  define CopSTASH_eq(c,hv)              ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
+					|| (CopSTASHPV(c) && HvNAME(hv) \
+					&& strEQ(CopSTASHPV(c), HvNAME(hv)))))
+#endif
+
+#else
+#ifndef CopFILEGV
+#  define CopFILEGV(c)                   ((c)->cop_filegv)
+#endif
+
+#ifndef CopFILEGV_set
+#  define CopFILEGV_set(c,gv)            ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
+#endif
+
+#ifndef CopFILE_set
+#  define CopFILE_set(c,pv)              CopFILEGV_set((c), gv_fetchfile(pv))
+#endif
+
+#ifndef CopFILESV
+#  define CopFILESV(c)                   (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+#  define CopFILEAV(c)                   (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
+#endif
+
+#ifndef CopFILE
+#  define CopFILE(c)                     (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
+#endif
+
+#ifndef CopSTASH
+#  define CopSTASH(c)                    ((c)->cop_stash)
+#endif
+
+#ifndef CopSTASH_set
+#  define CopSTASH_set(c,hv)             ((c)->cop_stash = (hv))
+#endif
+
+#ifndef CopSTASHPV
+#  define CopSTASHPV(c)                  (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
+#endif
+
+#ifndef CopSTASHPV_set
+#  define CopSTASHPV_set(c,pv)           CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
+#endif
+
+#ifndef CopSTASH_eq
+#  define CopSTASH_eq(c,hv)              (CopSTASH(c) == (hv))
+#endif
+
+#endif /* USE_ITHREADS */
+#ifndef IN_PERL_COMPILETIME
+#  define IN_PERL_COMPILETIME            (PL_curcop == &PL_compiling)
+#endif
+
+#ifndef IN_LOCALE_RUNTIME
+#  define IN_LOCALE_RUNTIME              (PL_curcop->op_private & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE_COMPILETIME
+#  define IN_LOCALE_COMPILETIME          (PL_hints & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE
+#  define IN_LOCALE                      (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
+#endif
+#ifndef IS_NUMBER_IN_UV
+#  define IS_NUMBER_IN_UV                0x01
+#endif
+
+#ifndef IS_NUMBER_GREATER_THAN_UV_MAX
+#  define IS_NUMBER_GREATER_THAN_UV_MAX  0x02
+#endif
+
+#ifndef IS_NUMBER_NOT_INT
+#  define IS_NUMBER_NOT_INT              0x04
+#endif
+
+#ifndef IS_NUMBER_NEG
+#  define IS_NUMBER_NEG                  0x08
+#endif
+
+#ifndef IS_NUMBER_INFINITY
+#  define IS_NUMBER_INFINITY             0x10
+#endif
+
+#ifndef IS_NUMBER_NAN
+#  define IS_NUMBER_NAN                  0x20
+#endif
+
+/* GROK_NUMERIC_RADIX depends on grok_numeric_radix */
+#ifndef GROK_NUMERIC_RADIX
+#  define GROK_NUMERIC_RADIX(sp, send)   grok_numeric_radix(sp, send)
+#endif
+#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
+#  define PERL_SCAN_GREATER_THAN_UV_MAX  0x02
+#endif
+
+#ifndef PERL_SCAN_SILENT_ILLDIGIT
+#  define PERL_SCAN_SILENT_ILLDIGIT      0x04
+#endif
+
+#ifndef PERL_SCAN_ALLOW_UNDERSCORES
+#  define PERL_SCAN_ALLOW_UNDERSCORES    0x01
+#endif
+
+#ifndef PERL_SCAN_DISALLOW_PREFIX
+#  define PERL_SCAN_DISALLOW_PREFIX      0x02
+#endif
+
+#ifndef grok_numeric_radix
+#if defined(NEED_grok_numeric_radix)
+static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+static
+#else
+extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+#endif
+
+#ifdef grok_numeric_radix
+#  undef grok_numeric_radix
+#endif
+#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
+#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
+
+#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
+bool
+DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
+{
+#ifdef USE_LOCALE_NUMERIC
+#ifdef PL_numeric_radix_sv
+    if (PL_numeric_radix_sv && IN_LOCALE) {
+        STRLEN len;
+        char* radix = SvPV(PL_numeric_radix_sv, len);
+        if (*sp + len <= send && memEQ(*sp, radix, len)) {
+            *sp += len;
+            return TRUE;
+        }
+    }
+#else
+    /* older perls don't have PL_numeric_radix_sv so the radix
+     * must manually be requested from locale.h
+     */
+#include <locale.h>
+    dTHR;  /* needed for older threaded perls */
+    struct lconv *lc = localeconv();
+    char *radix = lc->decimal_point;
+    if (radix && IN_LOCALE) {
+        STRLEN len = strlen(radix);
+        if (*sp + len <= send && memEQ(*sp, radix, len)) {
+            *sp += len;
+            return TRUE;
+        }
+    }
+#endif /* PERL_VERSION */
+#endif /* USE_LOCALE_NUMERIC */
+    /* always try "." if numeric radix didn't match because
+     * we may have data from different locales mixed */
+    if (*sp < send && **sp == '.') {
+        ++*sp;
+        return TRUE;
+    }
+    return FALSE;
+}
+#endif
+#endif
+
+/* grok_number depends on grok_numeric_radix */
+
+#ifndef grok_number
+#if defined(NEED_grok_number)
+static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+static
+#else
+extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+#endif
+
+#ifdef grok_number
+#  undef grok_number
+#endif
+#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
+#define Perl_grok_number DPPP_(my_grok_number)
+
+#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
+int
+DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
+{
+  const char *s = pv;
+  const char *send = pv + len;
+  const UV max_div_10 = UV_MAX / 10;
+  const char max_mod_10 = UV_MAX % 10;
+  int numtype = 0;
+  int sawinf = 0;
+  int sawnan = 0;
+
+  while (s < send && isSPACE(*s))
+    s++;
+  if (s == send) {
+    return 0;
+  } else if (*s == '-') {
+    s++;
+    numtype = IS_NUMBER_NEG;
+  }
+  else if (*s == '+')
+  s++;
+
+  if (s == send)
+    return 0;
+
+  /* next must be digit or the radix separator or beginning of infinity */
+  if (isDIGIT(*s)) {
+    /* UVs are at least 32 bits, so the first 9 decimal digits cannot
+       overflow.  */
+    UV value = *s - '0';
+    /* This construction seems to be more optimiser friendly.
+       (without it gcc does the isDIGIT test and the *s - '0' separately)
+       With it gcc on arm is managing 6 instructions (6 cycles) per digit.
+       In theory the optimiser could deduce how far to unroll the loop
+       before checking for overflow.  */
+    if (++s < send) {
+      int digit = *s - '0';
+      if (digit >= 0 && digit <= 9) {
+        value = value * 10 + digit;
+        if (++s < send) {
+          digit = *s - '0';
+          if (digit >= 0 && digit <= 9) {
+            value = value * 10 + digit;
+            if (++s < send) {
+              digit = *s - '0';
+              if (digit >= 0 && digit <= 9) {
+                value = value * 10 + digit;
+		if (++s < send) {
+                  digit = *s - '0';
+                  if (digit >= 0 && digit <= 9) {
+                    value = value * 10 + digit;
+                    if (++s < send) {
+                      digit = *s - '0';
+                      if (digit >= 0 && digit <= 9) {
+                        value = value * 10 + digit;
+                        if (++s < send) {
+                          digit = *s - '0';
+                          if (digit >= 0 && digit <= 9) {
+                            value = value * 10 + digit;
+                            if (++s < send) {
+                              digit = *s - '0';
+                              if (digit >= 0 && digit <= 9) {
+                                value = value * 10 + digit;
+                                if (++s < send) {
+                                  digit = *s - '0';
+                                  if (digit >= 0 && digit <= 9) {
+                                    value = value * 10 + digit;
+                                    if (++s < send) {
+                                      /* Now got 9 digits, so need to check
+                                         each time for overflow.  */
+                                      digit = *s - '0';
+                                      while (digit >= 0 && digit <= 9
+                                             && (value < max_div_10
+                                                 || (value == max_div_10
+                                                     && digit <= max_mod_10))) {
+                                        value = value * 10 + digit;
+                                        if (++s < send)
+                                          digit = *s - '0';
+                                        else
+                                          break;
+                                      }
+                                      if (digit >= 0 && digit <= 9
+                                          && (s < send)) {
+                                        /* value overflowed.
+                                           skip the remaining digits, don't
+                                           worry about setting *valuep.  */
+                                        do {
+                                          s++;
+                                        } while (s < send && isDIGIT(*s));
+                                        numtype |=
+                                          IS_NUMBER_GREATER_THAN_UV_MAX;
+                                        goto skip_value;
+                                      }
+                                    }
+                                  }
+				}
+                              }
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+	}
+      }
+    }
+    numtype |= IS_NUMBER_IN_UV;
+    if (valuep)
+      *valuep = value;
+
+  skip_value:
+    if (GROK_NUMERIC_RADIX(&s, send)) {
+      numtype |= IS_NUMBER_NOT_INT;
+      while (s < send && isDIGIT(*s))  /* optional digits after the radix */
+        s++;
+    }
+  }
+  else if (GROK_NUMERIC_RADIX(&s, send)) {
+    numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
+    /* no digits before the radix means we need digits after it */
+    if (s < send && isDIGIT(*s)) {
+      do {
+        s++;
+      } while (s < send && isDIGIT(*s));
+      if (valuep) {
+        /* integer approximation is valid - it's 0.  */
+        *valuep = 0;
+      }
+    }
+    else
+      return 0;
+  } else if (*s == 'I' || *s == 'i') {
+    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+    s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
+    s++; if (s < send && (*s == 'I' || *s == 'i')) {
+      s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+      s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
+      s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
+      s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
+      s++;
+    }
+    sawinf = 1;
+  } else if (*s == 'N' || *s == 'n') {
+    /* XXX TODO: There are signaling NaNs and quiet NaNs. */
+    s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
+    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+    s++;
+    sawnan = 1;
+  } else
+    return 0;
+
+  if (sawinf) {
+    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
+    numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
+  } else if (sawnan) {
+    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
+    numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
+  } else if (s < send) {
+    /* we can have an optional exponent part */
+    if (*s == 'e' || *s == 'E') {
+      /* The only flag we keep is sign.  Blow away any "it's UV"  */
+      numtype &= IS_NUMBER_NEG;
+      numtype |= IS_NUMBER_NOT_INT;
+      s++;
+      if (s < send && (*s == '-' || *s == '+'))
+        s++;
+      if (s < send && isDIGIT(*s)) {
+        do {
+          s++;
+        } while (s < send && isDIGIT(*s));
+      }
+      else
+      return 0;
+    }
+  }
+  while (s < send && isSPACE(*s))
+    s++;
+  if (s >= send)
+    return numtype;
+  if (len == 10 && memEQ(pv, "0 but true", 10)) {
+    if (valuep)
+      *valuep = 0;
+    return IS_NUMBER_IN_UV;
+  }
+  return 0;
+}
+#endif
+#endif
+
+/*
+ * The grok_* routines have been modified to use warn() instead of
+ * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
+ * which is why the stack variable has been renamed to 'xdigit'.
+ */
+
+#ifndef grok_bin
+#if defined(NEED_grok_bin)
+static UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static
+#else
+extern UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+#endif
+
+#ifdef grok_bin
+#  undef grok_bin
+#endif
+#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
+#define Perl_grok_bin DPPP_(my_grok_bin)
+
+#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
+UV
+DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_2 = UV_MAX / 2;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+
+    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+        /* strip off leading b or 0b.
+           for compatibility silently suffer "b" and "0b" as valid binary
+           numbers. */
+        if (len >= 1) {
+            if (s[0] == 'b') {
+                s++;
+                len--;
+            }
+            else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
+                s+=2;
+                len-=2;
+            }
+        }
+    }
+
+    for (; len-- && *s; s++) {
+        char bit = *s;
+        if (bit == '0' || bit == '1') {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+               With gcc seems to be much straighter code than old scan_bin.  */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_2) {
+                    value = (value << 1) | (bit - '0');
+                    continue;
+                }
+                /* Bah. We're just overflowed.  */
+                warn("Integer overflow in binary number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 2.0;
+	    /* If an NV has not enough bits in its mantissa to
+	     * represent a UV this summing of small low-order numbers
+	     * is a waste of time (because the NV cannot preserve
+	     * the low-order bits anyway): we could just remember when
+	     * did we overflow and in the end just multiply value_nv by the
+	     * right amount. */
+            value_nv += (NV)(bit - '0');
+            continue;
+        }
+        if (bit == '_' && len && allow_underscores && (bit = s[1])
+            && (bit == '0' || bit == '1'))
+	    {
+		--len;
+		++s;
+                goto redo;
+	    }
+        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+            warn("Illegal binary digit '%c' ignored", *s);
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+	|| (!overflowed && value > 0xffffffff  )
+#endif
+	) {
+	warn("Binary number > 0b11111111111111111111111111111111 non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_hex
+#if defined(NEED_grok_hex)
+static UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static
+#else
+extern UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+#endif
+
+#ifdef grok_hex
+#  undef grok_hex
+#endif
+#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
+#define Perl_grok_hex DPPP_(my_grok_hex)
+
+#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
+UV
+DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_16 = UV_MAX / 16;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+    const char *xdigit;
+
+    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+        /* strip off leading x or 0x.
+           for compatibility silently suffer "x" and "0x" as valid hex numbers.
+        */
+        if (len >= 1) {
+            if (s[0] == 'x') {
+                s++;
+                len--;
+            }
+            else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
+                s+=2;
+                len-=2;
+            }
+        }
+    }
+
+    for (; len-- && *s; s++) {
+	xdigit = strchr((char *) PL_hexdigit, *s);
+        if (xdigit) {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+               With gcc seems to be much straighter code than old scan_hex.  */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_16) {
+                    value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
+                    continue;
+                }
+                warn("Integer overflow in hexadecimal number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 16.0;
+	    /* If an NV has not enough bits in its mantissa to
+	     * represent a UV this summing of small low-order numbers
+	     * is a waste of time (because the NV cannot preserve
+	     * the low-order bits anyway): we could just remember when
+	     * did we overflow and in the end just multiply value_nv by the
+	     * right amount of 16-tuples. */
+            value_nv += (NV)((xdigit - PL_hexdigit) & 15);
+            continue;
+        }
+        if (*s == '_' && len && allow_underscores && s[1]
+		&& (xdigit = strchr((char *) PL_hexdigit, s[1])))
+	    {
+		--len;
+		++s;
+                goto redo;
+	    }
+        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+            warn("Illegal hexadecimal digit '%c' ignored", *s);
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+	|| (!overflowed && value > 0xffffffff  )
+#endif
+	) {
+	warn("Hexadecimal number > 0xffffffff non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_oct
+#if defined(NEED_grok_oct)
+static UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static
+#else
+extern UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+#endif
+
+#ifdef grok_oct
+#  undef grok_oct
+#endif
+#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
+#define Perl_grok_oct DPPP_(my_grok_oct)
+
+#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
+UV
+DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_8 = UV_MAX / 8;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+
+    for (; len-- && *s; s++) {
+         /* gcc 2.95 optimiser not smart enough to figure that this subtraction
+            out front allows slicker code.  */
+        int digit = *s - '0';
+        if (digit >= 0 && digit <= 7) {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+            */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_8) {
+                    value = (value << 3) | digit;
+                    continue;
+                }
+                /* Bah. We're just overflowed.  */
+                warn("Integer overflow in octal number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 8.0;
+	    /* If an NV has not enough bits in its mantissa to
+	     * represent a UV this summing of small low-order numbers
+	     * is a waste of time (because the NV cannot preserve
+	     * the low-order bits anyway): we could just remember when
+	     * did we overflow and in the end just multiply value_nv by the
+	     * right amount of 8-tuples. */
+            value_nv += (NV)digit;
+            continue;
+        }
+        if (digit == ('_' - '0') && len && allow_underscores
+            && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
+	    {
+		--len;
+		++s;
+                goto redo;
+	    }
+        /* Allow \octal to work the DWIM way (that is, stop scanning
+         * as soon as non-octal characters are seen, complain only iff
+         * someone seems to want to use the digits eight and nine). */
+        if (digit == 8 || digit == 9) {
+            if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+                warn("Illegal octal digit '%c' ignored", *s);
+        }
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+	|| (!overflowed && value > 0xffffffff  )
+#endif
+	) {
+	warn("Octal number > 037777777777 non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#ifdef NO_XSLOCKS
+#  ifdef dJMPENV
+#    define dXCPT             dJMPENV; int rEtV = 0
+#    define XCPT_TRY_START    JMPENV_PUSH(rEtV); if (rEtV == 0)
+#    define XCPT_TRY_END      JMPENV_POP;
+#    define XCPT_CATCH        if (rEtV != 0)
+#    define XCPT_RETHROW      JMPENV_JUMP(rEtV)
+#  else
+#    define dXCPT             Sigjmp_buf oldTOP; int rEtV = 0
+#    define XCPT_TRY_START    Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
+#    define XCPT_TRY_END      Copy(oldTOP, top_env, 1, Sigjmp_buf);
+#    define XCPT_CATCH        if (rEtV != 0)
+#    define XCPT_RETHROW      Siglongjmp(top_env, rEtV)
+#  endif
+#endif
+
+#endif /* _P_P_PORTABILITY_H_ */
+
+/* End of File ppport.h */
Index: /for-distributions/trunk/bin/windows/perl/lib/Devel/Peek.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Devel/Peek.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Devel/Peek.pm	(revision 14489)
@@ -0,0 +1,570 @@
+# Devel::Peek - A data debugging tool for the XS programmer
+# The documentation is after the __END__
+
+package Devel::Peek;
+
+$VERSION = '1.03';
+$XS_VERSION = $VERSION;
+$VERSION = eval $VERSION;
+
+require Exporter;
+use XSLoader ();
+
+@ISA = qw(Exporter);
+@EXPORT = qw(Dump mstat DeadCode DumpArray DumpWithOP DumpProg
+	     fill_mstats mstats_fillhash mstats2hash runops_debug debug_flags);
+@EXPORT_OK = qw(SvREFCNT SvREFCNT_inc SvREFCNT_dec CvGV);
+%EXPORT_TAGS = ('ALL' => [@EXPORT, @EXPORT_OK]);
+
+XSLoader::load 'Devel::Peek';
+
+sub import {
+  my $c = shift;
+  my $ops_rx = qr/^:opd(=[stP]*)?\b/;
+  my @db = grep m/$ops_rx/, @_;
+  @_ = grep !m/$ops_rx/, @_;
+  if (@db) {
+    die "Too many :opd options" if @db > 1;
+    runops_debug(1);
+    my $flags = ($db[0] =~ m/$ops_rx/ and $1);
+    $flags = 'st' unless defined $flags;
+    my $f = 0;
+    $f |= 2  if $flags =~ /s/;
+    $f |= 8  if $flags =~ /t/;
+    $f |= 64 if $flags =~ /P/;
+    $^D |= $f if $f;
+  }
+  unshift @_, $c;
+  goto &Exporter::import;
+}
+
+sub DumpWithOP ($;$) {
+   local($Devel::Peek::dump_ops)=1;
+   my $depth = @_ > 1 ? $_[1] : 4 ;
+   Dump($_[0],$depth);
+}
+
+$D_flags = 'psltocPmfrxuLHXDSTR';
+
+sub debug_flags (;$) {
+  my $out = "";
+  for my $i (0 .. length($D_flags)-1) {
+    $out .= substr $D_flags, $i, 1 if $^D & (1<<$i);
+  }
+  my $arg = shift;
+  my $num = $arg;
+  if (defined $arg and $arg =~ /\D/) {
+    die "unknown flags in debug_flags()" if $arg =~ /[^-$D_flags]/;
+    my ($on,$off) = split /-/, "$arg-";
+    $num = $^D;
+    $num |=  (1<<index($D_flags, $_)) for split //, $on;
+    $num &= ~(1<<index($D_flags, $_)) for split //, $off;
+  }
+  $^D = $num if defined $arg;
+  $out
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Devel::Peek - A data debugging tool for the XS programmer
+
+=head1 SYNOPSIS
+
+        use Devel::Peek;
+        Dump( $a );
+        Dump( $a, 5 );
+        DumpArray( 5, $a, $b, ... );
+	mstat "Point 5";
+
+        use Devel::Peek ':opd=st';
+
+=head1 DESCRIPTION
+
+Devel::Peek contains functions which allows raw Perl datatypes to be
+manipulated from a Perl script.  This is used by those who do XS programming
+to check that the data they are sending from C to Perl looks as they think
+it should look.  The trick, then, is to know what the raw datatype is
+supposed to look like when it gets to Perl.  This document offers some tips
+and hints to describe good and bad raw data.
+
+It is very possible that this document will fall far short of being useful
+to the casual reader.  The reader is expected to understand the material in
+the first few sections of L<perlguts>.
+
+Devel::Peek supplies a C<Dump()> function which can dump a raw Perl
+datatype, and C<mstat("marker")> function to report on memory usage
+(if perl is compiled with corresponding option).  The function
+DeadCode() provides statistics on the data "frozen" into inactive
+C<CV>.  Devel::Peek also supplies C<SvREFCNT()>, C<SvREFCNT_inc()>, and
+C<SvREFCNT_dec()> which can query, increment, and decrement reference
+counts on SVs.  This document will take a passive, and safe, approach
+to data debugging and for that it will describe only the C<Dump()>
+function.
+
+Function C<DumpArray()> allows dumping of multiple values (useful when you
+need to analyze returns of functions).
+
+The global variable $Devel::Peek::pv_limit can be set to limit the
+number of character printed in various string values.  Setting it to 0
+means no limit.
+
+If C<use Devel::Peek> directive has a C<:opd=FLAGS> argument,
+this switches on debugging of opcode dispatch.  C<FLAGS> should be a
+combination of C<s>, C<t>, and C<P> (see B<-D> flags in L<perlrun>).
+C<:opd> is a shortcut for C<:opd=st>.
+
+=head2 Runtime debugging
+
+C<CvGV($cv)> return one of the globs associated to a subroutine reference $cv.
+
+debug_flags() returns a string representation of C<$^D> (similar to
+what is allowed for B<-D> flag).  When called with a numeric argument,
+sets $^D to the corresponding value.  When called with an argument of
+the form C<"flags-flags">, set on/off bits of C<$^D> corresponding to
+letters before/after C<->.  (The returned value is for C<$^D> before
+the modification.)
+
+runops_debug() returns true if the current I<opcode dispatcher> is the
+debugging one.  When called with an argument, switches to debugging or
+non-debugging dispatcher depending on the argument (active for
+newly-entered subs/etc only).  (The returned value is for the dispatcher before the modification.)
+
+=head2 Memory footprint debugging
+
+When perl is compiled with support for memory footprint debugging
+(default with Perl's malloc()), Devel::Peek provides an access to this API.
+
+Use mstat() function to emit a memory state statistic to the terminal.
+For more information on the format of output of mstat() see
+L<perldebguts/Using C<$ENV{PERL_DEBUG_MSTATS}>>.
+
+Three additional functions allow access to this statistic from Perl.
+First, use C<mstats_fillhash(%hash)> to get the information contained
+in the output of mstat() into %hash. The field of this hash are
+
+  minbucket nbuckets sbrk_good sbrk_slack sbrked_remains sbrks start_slack
+  topbucket topbucket_ev topbucket_odd total total_chain total_sbrk totfree
+
+Two additional fields C<free>, C<used> contain array references which
+provide per-bucket count of free and used chunks.  Two other fields
+C<mem_size>, C<available_size> contain array references which provide
+the information about the allocated size and usable size of chunks in
+each bucket.  Again, see L<perldebguts/Using C<$ENV{PERL_DEBUG_MSTATS}>>
+for details.
+
+Keep in mind that only the first several "odd-numbered" buckets are
+used, so the information on size of the "odd-numbered" buckets which are
+not used is probably meaningless.
+
+The information in
+
+ mem_size available_size minbucket nbuckets
+
+is the property of a particular build of perl, and does not depend on
+the current process.  If you do not provide the optional argument to
+the functions mstats_fillhash(), fill_mstats(), mstats2hash(), then
+the information in fields C<mem_size>, C<available_size> is not
+updated.
+
+C<fill_mstats($buf)> is a much cheaper call (both speedwise and
+memory-wise) which collects the statistic into $buf in
+machine-readable form.  At a later moment you may need to call
+C<mstats2hash($buf, %hash)> to use this information to fill %hash.
+
+All three APIs C<fill_mstats($buf)>, C<mstats_fillhash(%hash)>, and
+C<mstats2hash($buf, %hash)> are designed to allocate no memory if used
+I<the second time> on the same $buf and/or %hash.
+
+So, if you want to collect memory info in a cycle, you may call
+
+  $#buf = 999;
+  fill_mstats($_) for @buf;
+  mstats_fillhash(%report, 1);		# Static info too
+
+  foreach (@buf) {
+    # Do something...
+    fill_mstats $_;			# Collect statistic
+  }
+  foreach (@buf) {
+    mstats2hash($_, %report);		# Preserve static info
+    # Do something with %report
+  }
+
+=head1 EXAMPLES
+
+The following examples don't attempt to show everything as that would be a
+monumental task, and, frankly, we don't want this manpage to be an internals
+document for Perl.  The examples do demonstrate some basics of the raw Perl
+datatypes, and should suffice to get most determined people on their way.
+There are no guidewires or safety nets, nor blazed trails, so be prepared to
+travel alone from this point and on and, if at all possible, don't fall into
+the quicksand (it's bad for business).
+
+Oh, one final bit of advice: take L<perlguts> with you.  When you return we
+expect to see it well-thumbed.
+
+=head2 A simple scalar string
+
+Let's begin by looking a simple scalar which is holding a string.
+
+        use Devel::Peek;
+        $a = "hello";
+        Dump $a;
+
+The output:
+
+        SV = PVIV(0xbc288)
+          REFCNT = 1
+          FLAGS = (POK,pPOK)
+          IV = 0
+          PV = 0xb2048 "hello"\0
+          CUR = 5
+          LEN = 6
+
+This says C<$a> is an SV, a scalar.  The scalar is a PVIV, a string.
+Its reference count is 1.  It has the C<POK> flag set, meaning its
+current PV field is valid.  Because POK is set we look at the PV item
+to see what is in the scalar.  The \0 at the end indicate that this
+PV is properly NUL-terminated.
+If the FLAGS had been IOK we would look
+at the IV item.  CUR indicates the number of characters in the PV.
+LEN indicates the number of bytes requested for the PV (one more than
+CUR, in this case, because LEN includes an extra byte for the
+end-of-string marker).
+
+=head2 A simple scalar number
+
+If the scalar contains a number the raw SV will be leaner.
+
+        use Devel::Peek;
+        $a = 42;
+        Dump $a;
+
+The output:
+
+        SV = IV(0xbc818)
+          REFCNT = 1
+          FLAGS = (IOK,pIOK)
+          IV = 42
+
+This says C<$a> is an SV, a scalar.  The scalar is an IV, a number.  Its
+reference count is 1.  It has the C<IOK> flag set, meaning it is currently
+being evaluated as a number.  Because IOK is set we look at the IV item to
+see what is in the scalar.
+
+=head2 A simple scalar with an extra reference
+
+If the scalar from the previous example had an extra reference:
+
+        use Devel::Peek;
+        $a = 42;
+        $b = \$a;
+        Dump $a;
+
+The output:
+
+        SV = IV(0xbe860)
+          REFCNT = 2
+          FLAGS = (IOK,pIOK)
+          IV = 42
+
+Notice that this example differs from the previous example only in its
+reference count.  Compare this to the next example, where we dump C<$b>
+instead of C<$a>.
+
+=head2 A reference to a simple scalar
+
+This shows what a reference looks like when it references a simple scalar.
+
+        use Devel::Peek;
+        $a = 42;
+        $b = \$a;
+        Dump $b;
+
+The output:
+
+        SV = RV(0xf041c)
+          REFCNT = 1
+          FLAGS = (ROK)
+          RV = 0xbab08
+        SV = IV(0xbe860)
+          REFCNT = 2
+          FLAGS = (IOK,pIOK)
+          IV = 42
+
+Starting from the top, this says C<$b> is an SV.  The scalar is an RV, a
+reference.  It has the C<ROK> flag set, meaning it is a reference.  Because
+ROK is set we have an RV item rather than an IV or PV.  Notice that Dump
+follows the reference and shows us what C<$b> was referencing.  We see the
+same C<$a> that we found in the previous example.
+
+Note that the value of C<RV> coincides with the numbers we see when we
+stringify $b. The addresses inside RV() and IV() are addresses of
+C<X***> structure which holds the current state of an C<SV>. This
+address may change during lifetime of an SV.
+
+=head2 A reference to an array
+
+This shows what a reference to an array looks like.
+
+        use Devel::Peek;
+        $a = [42];
+        Dump $a;
+
+The output:
+
+        SV = RV(0xf041c)
+          REFCNT = 1
+          FLAGS = (ROK)
+          RV = 0xb2850
+        SV = PVAV(0xbd448)
+          REFCNT = 1
+          FLAGS = ()
+          IV = 0
+          NV = 0
+          ARRAY = 0xb2048
+          ALLOC = 0xb2048
+          FILL = 0
+          MAX = 0
+          ARYLEN = 0x0
+          FLAGS = (REAL)
+        Elt No. 0 0xb5658
+        SV = IV(0xbe860)
+          REFCNT = 1
+          FLAGS = (IOK,pIOK)
+          IV = 42
+
+This says C<$a> is an SV and that it is an RV.  That RV points to
+another SV which is a PVAV, an array.  The array has one element,
+element zero, which is another SV. The field C<FILL> above indicates
+the last element in the array, similar to C<$#$a>.
+
+If C<$a> pointed to an array of two elements then we would see the
+following.
+
+        use Devel::Peek 'Dump';
+        $a = [42,24];
+        Dump $a;
+
+The output:
+
+        SV = RV(0xf041c)
+          REFCNT = 1
+          FLAGS = (ROK)
+          RV = 0xb2850
+        SV = PVAV(0xbd448)
+          REFCNT = 1
+          FLAGS = ()
+          IV = 0
+          NV = 0
+          ARRAY = 0xb2048
+          ALLOC = 0xb2048
+          FILL = 0
+          MAX = 0
+          ARYLEN = 0x0
+          FLAGS = (REAL)
+        Elt No. 0  0xb5658
+        SV = IV(0xbe860)
+          REFCNT = 1
+          FLAGS = (IOK,pIOK)
+          IV = 42
+        Elt No. 1  0xb5680
+        SV = IV(0xbe818)
+          REFCNT = 1
+          FLAGS = (IOK,pIOK)
+          IV = 24
+
+Note that C<Dump> will not report I<all> the elements in the array,
+only several first (depending on how deep it already went into the
+report tree).
+
+=head2 A reference to a hash
+
+The following shows the raw form of a reference to a hash.
+
+        use Devel::Peek;
+        $a = {hello=>42};
+        Dump $a;
+
+The output:
+
+	SV = RV(0x8177858) at 0x816a618
+	  REFCNT = 1
+	  FLAGS = (ROK)
+	  RV = 0x814fc10
+	  SV = PVHV(0x8167768) at 0x814fc10
+	    REFCNT = 1
+	    FLAGS = (SHAREKEYS)
+	    IV = 1
+	    NV = 0
+	    ARRAY = 0x816c5b8  (0:7, 1:1)
+	    hash quality = 100.0%
+	    KEYS = 1
+	    FILL = 1
+	    MAX = 7
+	    RITER = -1
+	    EITER = 0x0
+	    Elt "hello" HASH = 0xc8fd181b
+	    SV = IV(0x816c030) at 0x814fcf4
+	      REFCNT = 1
+	      FLAGS = (IOK,pIOK)
+	      IV = 42
+
+This shows C<$a> is a reference pointing to an SV.  That SV is a PVHV, a
+hash. Fields RITER and EITER are used by C<L<each>>.
+
+The "quality" of a hash is defined as the total number of comparisons needed
+to access every element once, relative to the expected number needed for a
+random hash. The value can go over 100%.
+
+The total number of comparisons is equal to the sum of the squares of the
+number of entries in each bucket.  For a random hash of C<<n>> keys into
+C<<k>> buckets, the expected value is:
+
+		n + n(n-1)/2k
+
+=head2 Dumping a large array or hash
+
+The C<Dump()> function, by default, dumps up to 4 elements from a
+toplevel array or hash.  This number can be increased by supplying a
+second argument to the function.
+
+        use Devel::Peek;
+        $a = [10,11,12,13,14];
+        Dump $a;
+
+Notice that C<Dump()> prints only elements 10 through 13 in the above code.
+The following code will print all of the elements.
+
+        use Devel::Peek 'Dump';
+        $a = [10,11,12,13,14];
+        Dump $a, 5;
+
+=head2 A reference to an SV which holds a C pointer
+
+This is what you really need to know as an XS programmer, of course.  When
+an XSUB returns a pointer to a C structure that pointer is stored in an SV
+and a reference to that SV is placed on the XSUB stack.  So the output from
+an XSUB which uses something like the T_PTROBJ map might look something like
+this:
+
+        SV = RV(0xf381c)
+          REFCNT = 1
+          FLAGS = (ROK)
+          RV = 0xb8ad8
+        SV = PVMG(0xbb3c8)
+          REFCNT = 1
+          FLAGS = (OBJECT,IOK,pIOK)
+          IV = 729160
+          NV = 0
+          PV = 0
+          STASH = 0xc1d10       "CookBookB::Opaque"
+
+This shows that we have an SV which is an RV.  That RV points at another
+SV.  In this case that second SV is a PVMG, a blessed scalar.  Because it is
+blessed it has the C<OBJECT> flag set.  Note that an SV which holds a C
+pointer also has the C<IOK> flag set.  The C<STASH> is set to the package
+name which this SV was blessed into.
+
+The output from an XSUB which uses something like the T_PTRREF map, which
+doesn't bless the object, might look something like this:
+
+        SV = RV(0xf381c)
+          REFCNT = 1
+          FLAGS = (ROK)
+          RV = 0xb8ad8
+        SV = PVMG(0xbb3c8)
+          REFCNT = 1
+          FLAGS = (IOK,pIOK)
+          IV = 729160
+          NV = 0
+          PV = 0
+
+=head2 A reference to a subroutine
+
+Looks like this:
+
+	SV = RV(0x798ec)
+	  REFCNT = 1
+	  FLAGS = (TEMP,ROK)
+	  RV = 0x1d453c
+	SV = PVCV(0x1c768c)
+	  REFCNT = 2
+	  FLAGS = ()
+	  IV = 0
+	  NV = 0
+	  COMP_STASH = 0x31068  "main"
+	  START = 0xb20e0
+	  ROOT = 0xbece0
+	  XSUB = 0x0
+	  XSUBANY = 0
+	  GVGV::GV = 0x1d44e8   "MY" :: "top_targets"
+	  FILE = "(eval 5)"
+	  DEPTH = 0
+	  PADLIST = 0x1c9338
+
+This shows that 
+
+=over 4
+
+=item *
+
+the subroutine is not an XSUB (since C<START> and C<ROOT> are
+non-zero, and C<XSUB> is zero);
+
+=item *
+
+that it was compiled in the package C<main>;
+
+=item *
+
+under the name C<MY::top_targets>; 
+
+=item *
+
+inside a 5th eval in the program;
+
+=item *
+
+it is not currently executed (see C<DEPTH>);
+
+=item *
+
+it has no prototype (C<PROTOTYPE> field is missing).
+
+=back
+
+=head1 EXPORTS
+
+C<Dump>, C<mstat>, C<DeadCode>, C<DumpArray>, C<DumpWithOP> and
+C<DumpProg>, C<fill_mstats>, C<mstats_fillhash>, C<mstats2hash> by
+default. Additionally available C<SvREFCNT>, C<SvREFCNT_inc> and
+C<SvREFCNT_dec>.
+
+=head1 BUGS
+
+Readers have been known to skip important parts of L<perlguts>, causing much
+frustration for all.
+
+=head1 AUTHOR
+
+Ilya Zakharevich	ilya@math.ohio-state.edu
+
+Copyright (c) 1995-98 Ilya Zakharevich. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+Author of this software makes no claim whatsoever about suitability,
+reliability, edability, editability or usability of this product, and
+should not be kept liable for any damage resulting from the use of
+it. If you can use it, you are in luck, if not, I should not be kept
+responsible. Keep a handy copy of your backup tape at hand.
+
+=head1 SEE ALSO
+
+L<perlguts>, and L<perlguts>, again.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Devel/SelfStubber.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Devel/SelfStubber.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Devel/SelfStubber.pm	(revision 14489)
@@ -0,0 +1,152 @@
+package Devel::SelfStubber;
+use File::Spec;
+require SelfLoader;
+@ISA = qw(SelfLoader);
+@EXPORT = 'AUTOLOAD';
+$JUST_STUBS = 1;
+$VERSION = 1.03;
+sub Version {$VERSION}
+
+# Use as
+# perl -e 'use Devel::SelfStubber;Devel::SelfStubber->stub(MODULE_NAME,LIB)'
+# (LIB defaults to '.') e.g.
+# perl -e 'use Devel::SelfStubber;Devel::SelfStubber->stub('Math::BigInt')'
+# would print out stubs needed if you added a __DATA__ before the subs.
+# Setting $Devel::SelfStubber::JUST_STUBS to 0 will print out the whole
+# module with the stubs entered just before the __DATA__
+
+sub _add_to_cache {
+    my($self,$fullname,$pack,$lines, $prototype) = @_;
+    push(@DATA,@{$lines});
+    if($fullname){push(@STUBS,"sub $fullname $prototype;\n")}; # stubs
+    '1;';
+}
+
+sub _package_defined {
+    my($self,$line) = @_;
+    push(@DATA,$line);
+}
+
+sub stub {
+    my($self,$module,$lib) = @_;
+    my($line,$end_data,$fh,$mod_file,$found_selfloader);
+    $lib ||= File::Spec->curdir();
+    ($mod_file = $module) =~ s,::,/,g;
+    $mod_file =~ tr|/|:| if $^O eq 'MacOS';
+    
+    $mod_file = File::Spec->catfile($lib, "$mod_file.pm");
+    $fh = "${module}::DATA";
+    my (@BEFORE_DATA, @AFTER_DATA, @AFTER_END);
+    @DATA = @STUBS = ();
+
+    open($fh,$mod_file) || die "Unable to open $mod_file";
+    local $/ = "\n";
+    while(defined ($line = <$fh>) and $line !~ m/^__DATA__/) {
+	push(@BEFORE_DATA,$line);
+	$line =~ /use\s+SelfLoader/ && $found_selfloader++;
+    }
+    (defined ($line) && $line =~ m/^__DATA__/)
+      || die "$mod_file doesn't contain a __DATA__ token";
+    $found_selfloader || 
+	print 'die "\'use SelfLoader;\' statement NOT FOUND!!\n"',"\n";
+    if ($JUST_STUBS) {
+        $self->_load_stubs($module);
+    } else {
+        $self->_load_stubs($module, \@AFTER_END);
+    }
+    if ( fileno($fh) ) {
+	$end_data = 1;
+	while(defined($line = <$fh>)) {
+	    push(@AFTER_DATA,$line);
+	}
+    }
+    close($fh);
+    unless ($JUST_STUBS) {
+    	print @BEFORE_DATA;
+    }
+    print @STUBS;
+    unless ($JUST_STUBS) {
+    	print "1;\n__DATA__\n",@DATA;
+    	if($end_data) { print "__END__ DATA\n",@AFTER_DATA; }
+    	if(@AFTER_END) { print "__END__\n",@AFTER_END; }
+    }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Devel::SelfStubber - generate stubs for a SelfLoading module
+
+=head1 SYNOPSIS
+
+To generate just the stubs:
+
+    use Devel::SelfStubber;
+    Devel::SelfStubber->stub('MODULENAME','MY_LIB_DIR');
+
+or to generate the whole module with stubs inserted correctly
+
+    use Devel::SelfStubber;
+    $Devel::SelfStubber::JUST_STUBS=0;
+    Devel::SelfStubber->stub('MODULENAME','MY_LIB_DIR');
+
+MODULENAME is the Perl module name, e.g. Devel::SelfStubber,
+NOT 'Devel/SelfStubber' or 'Devel/SelfStubber.pm'.
+
+MY_LIB_DIR defaults to '.' if not present.
+
+=head1 DESCRIPTION
+
+Devel::SelfStubber prints the stubs you need to put in the module
+before the __DATA__ token (or you can get it to print the entire
+module with stubs correctly placed). The stubs ensure that if
+a method is called, it will get loaded. They are needed specifically
+for inherited autoloaded methods.
+
+This is best explained using the following example:
+
+Assume four classes, A,B,C & D.
+
+A is the root class, B is a subclass of A, C is a subclass of B,
+and D is another subclass of A.
+
+                        A
+                       / \
+                      B   D
+                     /
+                    C
+
+If D calls an autoloaded method 'foo' which is defined in class A,
+then the method is loaded into class A, then executed. If C then
+calls method 'foo', and that method was reimplemented in class
+B, but set to be autoloaded, then the lookup mechanism never gets to
+the AUTOLOAD mechanism in B because it first finds the method
+already loaded in A, and so erroneously uses that. If the method
+foo had been stubbed in B, then the lookup mechanism would have
+found the stub, and correctly loaded and used the sub from B.
+
+So, for classes and subclasses to have inheritance correctly
+work with autoloading, you need to ensure stubs are loaded.
+
+The SelfLoader can load stubs automatically at module initialization
+with the statement 'SelfLoader-E<gt>load_stubs()';, but you may wish to
+avoid having the stub loading overhead associated with your
+initialization (though note that the SelfLoader::load_stubs method
+will be called sooner or later - at latest when the first sub
+is being autoloaded). In this case, you can put the sub stubs
+before the __DATA__ token. This can be done manually, but this
+module allows automatic generation of the stubs.
+
+By default it just prints the stubs, but you can set the
+global $Devel::SelfStubber::JUST_STUBS to 0 and it will
+print out the entire module with the stubs positioned correctly.
+
+At the very least, this is useful to see what the SelfLoader
+thinks are stubs - in order to ensure future versions of the
+SelfStubber remain in step with the SelfLoader, the
+SelfStubber actually uses the SelfLoader to determine which
+stubs are needed.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Digest.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Digest.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Digest.pm	(revision 14489)
@@ -0,0 +1,284 @@
+package Digest;
+
+use strict;
+use vars qw($VERSION %MMAP $AUTOLOAD);
+
+$VERSION = "1.14";
+
+%MMAP = (
+  "SHA-1"      => ["Digest::SHA1", ["Digest::SHA", 1], ["Digest::SHA2", 1]],
+  "SHA-224"    => [["Digest::SHA", 224]],
+  "SHA-256"    => [["Digest::SHA", 256], ["Digest::SHA2", 256]],
+  "SHA-384"    => [["Digest::SHA", 384], ["Digest::SHA2", 384]],
+  "SHA-512"    => [["Digest::SHA", 512], ["Digest::SHA2", 512]],
+  "HMAC-MD5"   => "Digest::HMAC_MD5",
+  "HMAC-SHA-1" => "Digest::HMAC_SHA1",
+  "CRC-16"     => [["Digest::CRC", type => "crc16"]],
+  "CRC-32"     => [["Digest::CRC", type => "crc32"]],
+  "CRC-CCITT"  => [["Digest::CRC", type => "crcccitt"]],
+);
+
+sub new
+{
+    shift;  # class ignored
+    my $algorithm = shift;
+    my $impl = $MMAP{$algorithm} || do {
+	$algorithm =~ s/\W+//;
+	"Digest::$algorithm";
+    };
+    $impl = [$impl] unless ref($impl);
+    my $err;
+    for  (@$impl) {
+	my $class = $_;
+	my @args;
+	($class, @args) = @$class if ref($class);
+	no strict 'refs';
+	unless (exists ${"$class\::"}{"VERSION"}) {
+	    eval "require $class";
+	    if ($@) {
+		$err ||= $@;
+		next;
+	    }
+	}
+	return $class->new(@args, @_);
+    }
+    die $err;
+}
+
+sub AUTOLOAD
+{
+    my $class = shift;
+    my $algorithm = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
+    $class->new($algorithm, @_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Digest - Modules that calculate message digests
+
+=head1 SYNOPSIS
+
+  $md5  = Digest->new("MD5");
+  $sha1 = Digest->new("SHA-1");
+  $sha256 = Digest->new("SHA-256");
+  $sha384 = Digest->new("SHA-384");
+  $sha512 = Digest->new("SHA-512");
+
+  $hmac = Digest->HMAC_MD5($key);
+
+=head1 DESCRIPTION
+
+The C<Digest::> modules calculate digests, also called "fingerprints"
+or "hashes", of some data, called a message.  The digest is (usually)
+some small/fixed size string.  The actual size of the digest depend of
+the algorithm used.  The message is simply a sequence of arbitrary
+bytes or bits.
+
+An important property of the digest algorithms is that the digest is
+I<likely> to change if the message change in some way.  Another
+property is that digest functions are one-way functions, that is it
+should be I<hard> to find a message that correspond to some given
+digest.  Algorithms differ in how "likely" and how "hard", as well as
+how efficient they are to compute.
+
+Note that the properties of the algorithms change over time, as the
+algorithms are analyzed and machines grow faster.  If your application
+for instance depends on it being "impossible" to generate the same
+digest for a different message it is wise to make it easy to plug in
+stronger algorithms as the one used grow weaker.  Using the interface
+documented here should make it easy to change algorithms later.
+
+All C<Digest::> modules provide the same programming interface.  A
+functional interface for simple use, as well as an object oriented
+interface that can handle messages of arbitrary length and which can
+read files directly.
+
+The digest can be delivered in three formats:
+
+=over 8
+
+=item I<binary>
+
+This is the most compact form, but it is not well suited for printing
+or embedding in places that can't handle arbitrary data.
+
+=item I<hex>
+
+A twice as long string of lowercase hexadecimal digits.
+
+=item I<base64>
+
+A string of portable printable characters.  This is the base64 encoded
+representation of the digest with any trailing padding removed.  The
+string will be about 30% longer than the binary version.
+L<MIME::Base64> tells you more about this encoding.
+
+=back
+
+
+The functional interface is simply importable functions with the same
+name as the algorithm.  The functions take the message as argument and
+return the digest.  Example:
+
+  use Digest::MD5 qw(md5);
+  $digest = md5($message);
+
+There are also versions of the functions with "_hex" or "_base64"
+appended to the name, which returns the digest in the indicated form.
+
+=head1 OO INTERFACE
+
+The following methods are available for all C<Digest::> modules:
+
+=over 4
+
+=item $ctx = Digest->XXX($arg,...)
+
+=item $ctx = Digest->new(XXX => $arg,...)
+
+=item $ctx = Digest::XXX->new($arg,...)
+
+The constructor returns some object that encapsulate the state of the
+message-digest algorithm.  You can add data to the object and finally
+ask for the digest.  The "XXX" should of course be replaced by the proper
+name of the digest algorithm you want to use.
+
+The two first forms are simply syntactic sugar which automatically
+load the right module on first use.  The second form allow you to use
+algorithm names which contains letters which are not legal perl
+identifiers, e.g. "SHA-1".  If no implementation for the given algorithm
+can be found, then an exception is raised.
+
+If new() is called as an instance method (i.e. $ctx->new) it will just
+reset the state the object to the state of a newly created object.  No
+new object is created in this case, and the return value is the
+reference to the object (i.e. $ctx).
+
+=item $other_ctx = $ctx->clone
+
+The clone method creates a copy of the digest state object and returns
+a reference to the copy.
+
+=item $ctx->reset
+
+This is just an alias for $ctx->new.
+
+=item $ctx->add( $data, ... )
+
+The $data provided as argument are appended to the message we
+calculate the digest for.  The return value is the $ctx object itself.
+
+=item $ctx->addfile( $io_handle )
+
+The $io_handle is read until EOF and the content is appended to the
+message we calculate the digest for.  The return value is the $ctx
+object itself.
+
+=item $ctx->add_bits( $data, $nbits )
+
+=item $ctx->add_bits( $bitstring )
+
+The bits provided are appended to the message we calculate the digest
+for.  The return value is the $ctx object itself.
+
+The two argument form of add_bits() will add the first $nbits bits
+from data.  For the last potentially partial byte only the high order
+C<< $nbits % 8 >> bits are used.  If $nbits is greater than C<<
+length($data) * 8 >>, then this method would do the same as C<<
+$ctx->add($data) >>, that is $nbits is silently ignored.
+
+The one argument form of add_bits() takes a $bitstring of "1" and "0"
+chars as argument.  It's a shorthand for C<< $ctx->add_bits(pack("B*",
+$bitstring), length($bitstring)) >>.
+
+This example shows two calls that should have the same effect:
+
+   $ctx->add_bits("111100001010");
+   $ctx->add_bits("\xF0\xA0", 12);
+
+Most digest algorithms are byte based.  For those it is not possible
+to add bits that are not a multiple of 8, and the add_bits() method
+will croak if you try.
+
+=item $ctx->digest
+
+Return the binary digest for the message.
+
+Note that the C<digest> operation is effectively a destructive,
+read-once operation. Once it has been performed, the $ctx object is
+automatically C<reset> and can be used to calculate another digest
+value.  Call $ctx->clone->digest if you want to calculate the digest
+without reseting the digest state.
+
+=item $ctx->hexdigest
+
+Same as $ctx->digest, but will return the digest in hexadecimal form.
+
+=item $ctx->b64digest
+
+Same as $ctx->digest, but will return the digest as a base64 encoded
+string.
+
+=back
+
+=head1 Digest speed
+
+This table should give some indication on the relative speed of
+different algorithms.  It is sorted by throughput based on a benchmark
+done with of some implementations of this API:
+
+ Algorithm      Size    Implementation                  MB/s
+
+ MD4            128     Digest::MD4 v1.3               165.0
+ MD5            128     Digest::MD5 v2.33               98.8
+ SHA-256        256     Digest::SHA2 v1.1.0             66.7
+ SHA-1          160     Digest::SHA v4.3.1              58.9
+ SHA-1          160     Digest::SHA1 v2.10              48.8
+ SHA-256        256     Digest::SHA v4.3.1              41.3
+ Haval-256      256     Digest::Haval256 v1.0.4         39.8
+ SHA-384        384     Digest::SHA2 v1.1.0             19.6
+ SHA-512        512     Digest::SHA2 v1.1.0             19.3
+ SHA-384        384     Digest::SHA v4.3.1              19.2
+ SHA-512        512     Digest::SHA v4.3.1              19.2
+ Whirlpool      512     Digest::Whirlpool v1.0.2        13.0
+ MD2            128     Digest::MD2 v2.03                9.5
+
+ Adler-32        32     Digest::Adler32 v0.03            1.3
+ CRC-16          16     Digest::CRC v0.05                1.1
+ CRC-32          32     Digest::CRC v0.05                1.1
+ MD5            128     Digest::Perl::MD5 v1.5           1.0
+ CRC-CCITT       16     Digest::CRC v0.05                0.8
+
+These numbers was achieved Apr 2004 with ActivePerl-5.8.3 running
+under Linux on a P4 2.8 GHz CPU.  The last 5 entries differ by being
+pure perl implementations of the algorithms, which explains why they
+are so slow.
+
+=head1 SEE ALSO
+
+L<Digest::Adler32>, L<Digest::CRC>, L<Digest::Haval256>,
+L<Digest::HMAC>, L<Digest::MD2>, L<Digest::MD4>, L<Digest::MD5>,
+L<Digest::SHA>, L<Digest::SHA1>, L<Digest::SHA2>, L<Digest::Whirlpool>
+
+New digest implementations should consider subclassing from L<Digest::base>.
+
+L<MIME::Base64>
+
+=head1 AUTHOR
+
+Gisle Aas <gisle@aas.no>
+
+The C<Digest::> interface is based on the interface originally
+developed by Neil Winton for his C<MD5> module.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+    Copyright 1998-2001,2003-2004 Gisle Aas.
+    Copyright 1995-1996 Neil Winton.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Digest/MD5.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Digest/MD5.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Digest/MD5.pm	(revision 14489)
@@ -0,0 +1,376 @@
+package Digest::MD5;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT_OK);
+
+$VERSION = '2.36';  # $Date: 2005/11/30 13:46:47 $
+
+require Exporter;
+*import = \&Exporter::import;
+@EXPORT_OK = qw(md5 md5_hex md5_base64);
+
+eval {
+    require Digest::base;
+    push(@ISA, 'Digest::base');
+};
+if ($@) {
+    my $err = $@;
+    *add_bits = sub { die $err };
+}
+
+
+eval {
+    require XSLoader;
+    XSLoader::load('Digest::MD5', $VERSION);
+};
+if ($@) {
+    my $olderr = $@;
+    eval {
+	# Try to load the pure perl version
+	require Digest::Perl::MD5;
+
+	Digest::Perl::MD5->import(qw(md5 md5_hex md5_base64));
+	push(@ISA, "Digest::Perl::MD5");  # make OO interface work
+    };
+    if ($@) {
+	# restore the original error
+	die $olderr;
+    }
+}
+else {
+    *reset = \&new;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Digest::MD5 - Perl interface to the MD5 Algorithm
+
+=head1 SYNOPSIS
+
+ # Functional style
+ use Digest::MD5 qw(md5 md5_hex md5_base64);
+
+ $digest = md5($data);
+ $digest = md5_hex($data);
+ $digest = 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
+
+The C<Digest::MD5> module allows you to use the RSA Data Security
+Inc. MD5 Message Digest algorithm from within Perl programs.  The
+algorithm takes as input a message of arbitrary length and produces as
+output a 128-bit "fingerprint" or "message digest" of the input.
+
+Note that the MD5 algorithm is not as strong as it used to be.  It has
+since 2005 been easy to generate different messages that produce the
+same MD5 digest.  It still seems hard to generate messages that
+produce a given digest, but it is probably wise to move to stronger
+algorithms for applications that depend on the digest to uniquely identify
+a message.
+
+The C<Digest::MD5> module provide a procedural interface for simple
+use, as well as an object oriented interface that can handle messages
+of arbitrary length and which can read files directly.
+
+=head1 FUNCTIONS
+
+The following functions are provided by the C<Digest::MD5> module.
+None of these functions are exported by default.
+
+=over 4
+
+=item md5($data,...)
+
+This function will concatenate all arguments, calculate the MD5 digest
+of this "message", and return it in binary form.  The returned string
+will be 16 bytes long.
+
+The result of md5("a", "b", "c") will be exactly the same as the
+result of md5("abc").
+
+=item md5_hex($data,...)
+
+Same as md5(), but will return the digest in hexadecimal form. The
+length of the returned string will be 32 and it will only contain
+characters from this set: '0'..'9' and 'a'..'f'.
+
+=item md5_base64($data,...)
+
+Same as md5(), but will return the digest as a base64 encoded string.
+The length of the returned string will be 22 and it will only contain
+characters from this set: 'A'..'Z', 'a'..'z', '0'..'9', '+' and
+'/'.
+
+Note that the base64 encoded string returned is not padded to be a
+multiple of 4 bytes long.  If you want interoperability with other
+base64 encoded md5 digests you might want to append the redundant
+string "==" to the result.
+
+=back
+
+=head1 METHODS
+
+The object oriented interface to C<Digest::MD5> is described in this
+section.  After a C<Digest::MD5> object has been created, you will add
+data to it and finally ask for the digest in a suitable format.  A
+single object can be used to calculate multiple digests.
+
+The following methods are provided:
+
+=over 4
+
+=item $md5 = Digest::MD5->new
+
+The constructor returns a new C<Digest::MD5> object which encapsulate
+the state of the MD5 message-digest algorithm.
+
+If called as an instance method (i.e. $md5->new) it will just reset the
+state the object to the state of a newly created object.  No new
+object is created in this case.
+
+=item $md5->reset
+
+This is just an alias for $md5->new.
+
+=item $md5->clone
+
+This a copy of the $md5 object. It is useful when you do not want to
+destroy the digests state, but need an intermediate value of the
+digest, e.g. when calculating digests iteratively on a continuous data
+stream.  Example:
+
+    my $md5 = Digest::MD5->new;
+    while (<>) {
+	$md5->add($_);
+	print "Line $.: ", $md5->clone->hexdigest, "\n";
+    }
+
+=item $md5->add($data,...)
+
+The $data provided as argument are appended to the message we
+calculate the digest for.  The return value is the $md5 object itself.
+
+All these lines will have the same effect on the state of the $md5
+object:
+
+    $md5->add("a"); $md5->add("b"); $md5->add("c");
+    $md5->add("a")->add("b")->add("c");
+    $md5->add("a", "b", "c");
+    $md5->add("abc");
+
+=item $md5->addfile($io_handle)
+
+The $io_handle will be read until EOF and its content appended to the
+message we calculate the digest for.  The return value is the $md5
+object itself.
+
+The addfile() method will croak() if it fails reading data for some
+reason.  If it croaks it is unpredictable what the state of the $md5
+object will be in. The addfile() method might have been able to read
+the file partially before it failed.  It is probably wise to discard
+or reset the $md5 object if this occurs.
+
+In most cases you want to make sure that the $io_handle is in
+C<binmode> before you pass it as argument to the addfile() method.
+
+=item $md5->add_bits($data, $nbits)
+
+=item $md5->add_bits($bitstring)
+
+Since the MD5 algorithm is byte oriented you might only add bits as
+multiples of 8, so you probably want to just use add() instead.  The
+add_bits() method is provided for compatibility with other digest
+implementations.  See L<Digest> for description of the arguments
+that add_bits() take.
+
+=item $md5->digest
+
+Return the binary digest for the message.  The returned string will be
+16 bytes long.
+
+Note that the C<digest> operation is effectively a destructive,
+read-once operation. Once it has been performed, the C<Digest::MD5>
+object is automatically C<reset> and can be used to calculate another
+digest value.  Call $md5->clone->digest if you want to calculate the
+digest without resetting the digest state.
+
+=item $md5->hexdigest
+
+Same as $md5->digest, but will return the digest in hexadecimal
+form. The length of the returned string will be 32 and it will only
+contain characters from this set: '0'..'9' and 'a'..'f'.
+
+=item $md5->b64digest
+
+Same as $md5->digest, but will return the digest as a base64 encoded
+string.  The length of the returned string will be 22 and it will only
+contain characters from this set: 'A'..'Z', 'a'..'z', '0'..'9', '+'
+and '/'.
+
+
+The base64 encoded string returned is not padded to be a multiple of 4
+bytes long.  If you want interoperability with other base64 encoded
+md5 digests you might want to append the string "==" to the result.
+
+=back
+
+
+=head1 EXAMPLES
+
+The simplest way to use this library is to import the md5_hex()
+function (or one of its cousins):
+
+    use Digest::MD5 qw(md5_hex);
+    print "Digest is ", md5_hex("foobarbaz"), "\n";
+
+The above example would print out the message:
+
+    Digest is 6df23dc03f9b54cc38a0fc1483df6e21
+
+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";
+
+With OO style you can break the message arbitrary.  This means that we
+are no longer limited to have space for the whole message in memory, i.e.
+we can handle messages of any size.
+
+This is useful when calculating checksum for files:
+
+    use Digest::MD5;
+
+    my $file = shift || "/etc/passwd";
+    open(FILE, $file) or die "Can't open '$file': $!";
+    binmode(FILE);
+
+    $md5 = Digest::MD5->new;
+    while (<FILE>) {
+        $md5->add($_);
+    }
+    close(FILE);
+    print $md5->b64digest, " $file\n";
+
+Or we can use the addfile method for more efficient reading of
+the file:
+
+    use Digest::MD5;
+
+    my $file = shift || "/etc/passwd";
+    open(FILE, $file) or die "Can't open '$file': $!";
+    binmode(FILE);
+
+    print Digest::MD5->new->addfile(*FILE)->hexdigest, " $file\n";
+
+Perl 5.8 support Unicode characters in strings.  Since the MD5
+algorithm is only defined for strings of bytes, it can not be used on
+strings that contains chars with ordinal number above 255.  The MD5
+functions and methods will croak if you try to feed them such input
+data:
+
+    use Digest::MD5 qw(md5_hex);
+
+    my $str = "abc\x{300}";
+    print md5_hex($str), "\n";  # croaks
+    # Wide character in subroutine entry
+
+What you can do is calculate the MD5 checksum of the UTF-8
+representation of such strings.  This is achieved by filtering the
+string through encode_utf8() function:
+
+    use Digest::MD5 qw(md5_hex);
+    use Encode qw(encode_utf8);
+
+    my $str = "abc\x{300}";
+    print md5_hex(encode_utf8($str)), "\n";
+    # 8c2d46911f3f5a326455f0ed7a8ed3b3
+
+=head1 SEE ALSO
+
+L<Digest>,
+L<Digest::MD2>,
+L<Digest::SHA1>,
+L<Digest::HMAC>
+
+L<md5sum(1)>
+
+RFC 1321
+
+http://en.wikipedia.org/wiki/MD5
+
+The paper "How to Break MD5 and Other Hash Functions" by Xiaoyun Wang
+and Hongbo Yu.
+
+=head1 COPYRIGHT
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+ Copyright 1998-2003 Gisle Aas.
+ Copyright 1995-1996 Neil Winton.
+ Copyright 1991-1992 RSA Data Security, Inc.
+
+The MD5 algorithm is defined in RFC 1321. This implementation is
+derived from the reference C code in RFC 1321 which is covered by
+the following copyright statement:
+
+=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 C<MD5> interface was written by Neil Winton
+(C<N.Winton@axion.bt.co.uk>).
+
+The C<Digest::MD5> module is written by Gisle Aas <gisle@ActiveState.com>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Digest/base.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Digest/base.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Digest/base.pm	(revision 14489)
@@ -0,0 +1,100 @@
+package Digest::base;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = "1.00";
+
+# subclass is supposed to implement at least these
+sub new;
+sub clone;
+sub add;
+sub digest;
+
+sub reset {
+    my $self = shift;
+    $self->new(@_);  # ugly
+}
+
+sub addfile {
+    my ($self, $handle) = @_;
+
+    my $n;
+    my $buf = "";
+
+    while (($n = read($handle, $buf, 4*1024))) {
+        $self->add($buf);
+    }
+    unless (defined $n) {
+	require Carp;
+	Carp::croak("Read failed: $!");
+    }
+
+    $self;
+}
+
+sub add_bits {
+    my $self = shift;
+    my $bits;
+    my $nbits;
+    if (@_ == 1) {
+	my $arg = shift;
+	$bits = pack("B*", $arg);
+	$nbits = length($arg);
+    }
+    else {
+	($bits, $nbits) = @_;
+    }
+    if (($nbits % 8) != 0) {
+	require Carp;
+	Carp::croak("Number of bits must be multiple of 8 for this algorithm");
+    }
+    return $self->add(substr($bits, 0, $nbits/8));
+}
+
+sub hexdigest {
+    my $self = shift;
+    return unpack("H*", $self->digest(@_));
+}
+
+sub b64digest {
+    my $self = shift;
+    require MIME::Base64;
+    my $b64 = MIME::Base64::encode($self->digest(@_), "");
+    $b64 =~ s/=+$//;
+    return $b64;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Digest::base - Digest base class
+
+=head1 SYNOPSIS
+
+  package Digest::Foo;
+  use base 'Digest::base';
+
+=head1 DESCRIPTION
+
+The C<Digest::base> class provide implementations of the methods
+C<addfile> and C<add_bits> in terms of C<add>, and of the methods
+C<hexdigest> and C<b64digest> in terms of C<digest>.
+
+Digest implementations might want to inherit from this class to get
+this implementations of the alternative I<add> and I<digest> methods.
+A minimal subclass needs to implement the following methods by itself:
+
+    new
+    clone
+    add
+    digest
+
+The arguments and expected behaviour of these methods are described in
+L<Digest>.
+
+=head1 SEE ALSO
+
+L<Digest>
Index: /for-distributions/trunk/bin/windows/perl/lib/Digest/file.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Digest/file.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Digest/file.pm	(revision 14489)
@@ -0,0 +1,85 @@
+package Digest::file;
+
+use strict;
+
+use Exporter ();
+use Carp qw(croak);
+use Digest ();
+
+use vars qw($VERSION @ISA @EXPORT_OK);
+
+$VERSION = "1.00";
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(digest_file_ctx digest_file digest_file_hex digest_file_base64);
+
+sub digest_file_ctx {
+    my $file = shift;
+    croak("No digest algorithm specified") unless @_;
+    local *F;
+    open(F, $file) || croak("Can't open '$file': $!");
+    binmode(F);
+    my $ctx = Digest->new(@_);
+    $ctx->addfile(*F);
+    close(F);
+    return $ctx;
+}
+
+sub digest_file {
+    digest_file_ctx(@_)->digest;
+}
+
+sub digest_file_hex {
+    digest_file_ctx(@_)->hexdigest;
+}
+
+sub digest_file_base64 {
+    digest_file_ctx(@_)->b64digest;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Digest::file - Calculate digests of files
+
+=head1 SYNOPSIS
+
+  # Poor mans "md5sum" command
+  use Digest::file qw(digest_file_hex);
+  for (@ARGV) {
+      print digest_file_hex($_, "MD5"), "  $_\n";
+  }
+
+=head1 DESCRIPTION
+
+This module provide 3 convenience functions to calculate the digest
+of files.  The following functions are provided:
+
+=over
+
+=item digest_file( $file, $algorithm, [$arg,...] )
+
+This function will calculate and return the binary digest of the bytes
+of the given file.  The function will croak if it fails to open or
+read the file.
+
+The $algorithm is a string like "MD2", "MD5", "SHA-1", "SHA-512".
+Additional arguments are passed to the constructor for the
+implementation of the given algorithm.
+
+=item digest_file_hex( $file, $algorithm, [$arg,...] )
+
+Same as digest_file(), but return the digest in hex form.
+
+=item digest_file_base64( $file, $algorithm, [$arg,...] )
+
+Same as digest_file(), but return the digest as a base64 encoded
+string.
+
+=back
+
+=head1 SEE ALSO
+
+L<Digest>
Index: /for-distributions/trunk/bin/windows/perl/lib/DirHandle.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/DirHandle.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/DirHandle.pm	(revision 14489)
@@ -0,0 +1,88 @@
+package DirHandle;
+
+our $VERSION = '1.00';
+
+=head1 NAME 
+
+DirHandle - supply object methods for directory handles
+
+=head1 SYNOPSIS
+
+    use DirHandle;
+    $d = new DirHandle ".";
+    if (defined $d) {
+        while (defined($_ = $d->read)) { something($_); }
+        $d->rewind;
+        while (defined($_ = $d->read)) { something_else($_); }
+        undef $d;
+    }
+
+=head1 DESCRIPTION
+
+The C<DirHandle> method provide an alternative interface to the
+opendir(), closedir(), readdir(), and rewinddir() functions.
+
+The only objective benefit to using C<DirHandle> is that it avoids
+namespace pollution by creating globs to hold directory handles.
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+On Mac OS (Classic), the path separator is ':', not '/', and the 
+current directory is denoted as ':', not '.'. You should be careful 
+about specifying relative pathnames. While a full path always begins 
+with a volume name, a relative pathname should always begin with a 
+':'.  If specifying a volume name only, a trailing ':' is required.
+
+=back
+
+=cut
+
+require 5.000;
+use Carp;
+use Symbol;
+
+sub new {
+    @_ >= 1 && @_ <= 2 or croak 'usage: new DirHandle [DIRNAME]';
+    my $class = shift;
+    my $dh = gensym;
+    if (@_) {
+	DirHandle::open($dh, $_[0])
+	    or return undef;
+    }
+    bless $dh, $class;
+}
+
+sub DESTROY {
+    my ($dh) = @_;
+    closedir($dh);
+}
+
+sub open {
+    @_ == 2 or croak 'usage: $dh->open(DIRNAME)';
+    my ($dh, $dirname) = @_;
+    opendir($dh, $dirname);
+}
+
+sub close {
+    @_ == 1 or croak 'usage: $dh->close()';
+    my ($dh) = @_;
+    closedir($dh);
+}
+
+sub read {
+    @_ == 1 or croak 'usage: $dh->read()';
+    my ($dh) = @_;
+    readdir($dh);
+}
+
+sub rewind {
+    @_ == 1 or croak 'usage: $dh->rewind()';
+    my ($dh) = @_;
+    rewinddir($dh);
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Dumpvalue.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Dumpvalue.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Dumpvalue.pm	(revision 14489)
@@ -0,0 +1,648 @@
+use 5.006_001;			# for (defined ref) and $#$v and our
+package Dumpvalue;
+use strict;
+our $VERSION = '1.12';
+our(%address, $stab, @stab, %stab, %subs);
+
+# documentation nits, handle complex data structures better by chromatic
+# translate control chars to ^X - Randal Schwartz
+# Modifications to print types by Peter Gordon v1.0
+
+# Ilya Zakharevich -- patches after 5.001 (and some before ;-)
+
+# Won't dump symbol tables and contents of debugged files by default
+
+# (IZ) changes for objectification:
+#   c) quote() renamed to method set_quote();
+#   d) unctrlSet() renamed to method set_unctrl();
+#   f) Compiles with `use strict', but in two places no strict refs is needed:
+#      maybe more problems are waiting...
+
+my %defaults = (
+		globPrint	      => 0,
+		printUndef	      => 1,
+		tick		      => "auto",
+		unctrl		      => 'quote',
+		subdump		      => 1,
+		dumpReused	      => 0,
+		bareStringify	      => 1,
+		hashDepth	      => '',
+		arrayDepth	      => '',
+		dumpDBFiles	      => '',
+		dumpPackages	      => '',
+		quoteHighBit	      => '',
+		usageOnly	      => '',
+		compactDump	      => '',
+		veryCompact	      => '',
+		stopDbSignal	      => '',
+	       );
+
+sub new {
+  my $class = shift;
+  my %opt = (%defaults, @_);
+  bless \%opt, $class;
+}
+
+sub set {
+  my $self = shift;
+  my %opt = @_;
+  @$self{keys %opt} = values %opt;
+}
+
+sub get {
+  my $self = shift;
+  wantarray ? @$self{@_} : $$self{pop @_};
+}
+
+sub dumpValue {
+  my $self = shift;
+  die "usage: \$dumper->dumpValue(value)" unless @_ == 1;
+  local %address;
+  local $^W=0;
+  (print "undef\n"), return unless defined $_[0];
+  (print $self->stringify($_[0]), "\n"), return unless ref $_[0];
+  $self->unwrap($_[0],0);
+}
+
+sub dumpValues {
+  my $self = shift;
+  local %address;
+  local $^W=0;
+  (print "undef\n"), return unless defined $_[0];
+  $self->unwrap(\@_,0);
+}
+
+# This one is good for variable names:
+
+sub unctrl {
+  local($_) = @_;
+
+  return \$_ if ref \$_ eq "GLOB";
+  s/([\001-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+  $_;
+}
+
+sub stringify {
+  my $self = shift;
+  local $_ = shift;
+  my $noticks = shift;
+  my $tick = $self->{tick};
+
+  return 'undef' unless defined $_ or not $self->{printUndef};
+  return $_ . "" if ref \$_ eq 'GLOB';
+  { no strict 'refs';
+    $_ = &{'overload::StrVal'}($_)
+      if $self->{bareStringify} and ref $_
+	and %overload:: and defined &{'overload::StrVal'};
+  }
+
+  if ($tick eq 'auto') {
+    if (/[\000-\011\013-\037\177]/) {
+      $tick = '"';
+    } else {
+      $tick = "'";
+    }
+  }
+  if ($tick eq "'") {
+    s/([\'\\])/\\$1/g;
+  } elsif ($self->{unctrl} eq 'unctrl') {
+    s/([\"\\])/\\$1/g ;
+    s/([\000-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+    s/([\200-\377])/'\\0x'.sprintf('%2X',ord($1))/eg
+      if $self->{quoteHighBit};
+  } elsif ($self->{unctrl} eq 'quote') {
+    s/([\"\\\$\@])/\\$1/g if $tick eq '"';
+    s/\033/\\e/g;
+    s/([\000-\037\177])/'\\c'.chr(ord($1)^64)/eg;
+  }
+  s/([\200-\377])/'\\'.sprintf('%3o',ord($1))/eg if $self->{quoteHighBit};
+  ($noticks || /^\d+(\.\d*)?\Z/)
+    ? $_
+      : $tick . $_ . $tick;
+}
+
+sub DumpElem {
+  my ($self, $v) = (shift, shift);
+  my $short = $self->stringify($v, ref $v);
+  my $shortmore = '';
+  if ($self->{veryCompact} && ref $v
+      && (ref $v eq 'ARRAY' and !grep(ref $_, @$v) )) {
+    my $depth = $#$v;
+    ($shortmore, $depth) = (' ...', $self->{arrayDepth} - 1)
+      if $self->{arrayDepth} and $depth >= $self->{arrayDepth};
+    my @a = map $self->stringify($_), @$v[0..$depth];
+    print "0..$#{$v}  @a$shortmore\n";
+  } elsif ($self->{veryCompact} && ref $v
+	   && (ref $v eq 'HASH') and !grep(ref $_, values %$v)) {
+    my @a = sort keys %$v;
+    my $depth = $#a;
+    ($shortmore, $depth) = (' ...', $self->{hashDepth} - 1)
+      if $self->{hashDepth} and $depth >= $self->{hashDepth};
+    my @b = map {$self->stringify($_) . " => " . $self->stringify($$v{$_})}
+      @a[0..$depth];
+    local $" = ', ';
+    print "@b$shortmore\n";
+  } else {
+    print "$short\n";
+    $self->unwrap($v,shift);
+  }
+}
+
+sub unwrap {
+  my $self = shift;
+  return if $DB::signal and $self->{stopDbSignal};
+  my ($v) = shift ;
+  my ($s) = shift ;		# extra no of spaces
+  my $sp;
+  my (%v,@v,$address,$short,$fileno);
+
+  $sp = " " x $s ;
+  $s += 3 ;
+
+  # Check for reused addresses
+  if (ref $v) {
+    my $val = $v;
+    { no strict 'refs';
+      $val = &{'overload::StrVal'}($v)
+	if %overload:: and defined &{'overload::StrVal'};
+    }
+    ($address) = $val =~ /(0x[0-9a-f]+)\)$/ ;
+    if (!$self->{dumpReused} && defined $address) {
+      $address{$address}++ ;
+      if ( $address{$address} > 1 ) {
+	print "${sp}-> REUSED_ADDRESS\n" ;
+	return ;
+      }
+    }
+  } elsif (ref \$v eq 'GLOB') {
+    $address = "$v" . "";	# To avoid a bug with globs
+    $address{$address}++ ;
+    if ( $address{$address} > 1 ) {
+      print "${sp}*DUMPED_GLOB*\n" ;
+      return ;
+    }
+  }
+
+  if (ref $v eq 'Regexp') {
+    my $re = "$v";
+    $re =~ s,/,\\/,g;
+    print "$sp-> qr/$re/\n";
+    return;
+  }
+
+  if ( UNIVERSAL::isa($v, 'HASH') ) {
+    my @sortKeys = sort keys(%$v) ;
+    my $more;
+    my $tHashDepth = $#sortKeys ;
+    $tHashDepth = $#sortKeys < $self->{hashDepth}-1 ? $#sortKeys : $self->{hashDepth}-1
+      unless $self->{hashDepth} eq '' ;
+    $more = "....\n" if $tHashDepth < $#sortKeys ;
+    my $shortmore = "";
+    $shortmore = ", ..." if $tHashDepth < $#sortKeys ;
+    $#sortKeys = $tHashDepth ;
+    if ($self->{compactDump} && !grep(ref $_, values %{$v})) {
+      $short = $sp;
+      my @keys;
+      for (@sortKeys) {
+	push @keys, $self->stringify($_) . " => " . $self->stringify($v->{$_});
+      }
+      $short .= join ', ', @keys;
+      $short .= $shortmore;
+      (print "$short\n"), return if length $short <= $self->{compactDump};
+    }
+    for my $key (@sortKeys) {
+      return if $DB::signal and $self->{stopDbSignal};
+      my $value = $ {$v}{$key} ;
+      print $sp, $self->stringify($key), " => ";
+      $self->DumpElem($value, $s);
+    }
+    print "$sp  empty hash\n" unless @sortKeys;
+    print "$sp$more" if defined $more ;
+  } elsif ( UNIVERSAL::isa($v, 'ARRAY') ) {
+    my $tArrayDepth = $#{$v} ;
+    my $more ;
+    $tArrayDepth = $#$v < $self->{arrayDepth}-1 ? $#$v : $self->{arrayDepth}-1
+      unless  $self->{arrayDepth} eq '' ;
+    $more = "....\n" if $tArrayDepth < $#{$v} ;
+    my $shortmore = "";
+    $shortmore = " ..." if $tArrayDepth < $#{$v} ;
+    if ($self->{compactDump} && !grep(ref $_, @{$v})) {
+      if ($#$v >= 0) {
+	$short = $sp . "0..$#{$v}  " .
+	  join(" ", 
+	       map {exists $v->[$_] ? $self->stringify($v->[$_]) : "empty"} ($[..$tArrayDepth)
+	      ) . "$shortmore";
+      } else {
+	$short = $sp . "empty array";
+      }
+      (print "$short\n"), return if length $short <= $self->{compactDump};
+    }
+    for my $num ($[ .. $tArrayDepth) {
+      return if $DB::signal and $self->{stopDbSignal};
+      print "$sp$num  ";
+      if (exists $v->[$num]) {
+        $self->DumpElem($v->[$num], $s);
+      } else {
+	print "empty slot\n";
+      }
+    }
+    print "$sp  empty array\n" unless @$v;
+    print "$sp$more" if defined $more ;
+  } elsif (  UNIVERSAL::isa($v, 'SCALAR') or ref $v eq 'REF' ) {
+    print "$sp-> ";
+    $self->DumpElem($$v, $s);
+  } elsif ( UNIVERSAL::isa($v, 'CODE') ) {
+    print "$sp-> ";
+    $self->dumpsub(0, $v);
+  } elsif ( UNIVERSAL::isa($v, 'GLOB') ) {
+    print "$sp-> ",$self->stringify($$v,1),"\n";
+    if ($self->{globPrint}) {
+      $s += 3;
+      $self->dumpglob('', $s, "{$$v}", $$v, 1);
+    } elsif (defined ($fileno = fileno($v))) {
+      print( (' ' x ($s+3)) .  "FileHandle({$$v}) => fileno($fileno)\n" );
+    }
+  } elsif (ref \$v eq 'GLOB') {
+    if ($self->{globPrint}) {
+      $self->dumpglob('', $s, "{$v}", $v, 1);
+    } elsif (defined ($fileno = fileno(\$v))) {
+      print( (' ' x $s) .  "FileHandle({$v}) => fileno($fileno)\n" );
+    }
+  }
+}
+
+sub matchvar {
+  $_[0] eq $_[1] or
+    ($_[1] =~ /^([!~])(.)([\x00-\xff]*)/) and
+      ($1 eq '!') ^ (eval {($_[2] . "::" . $_[0]) =~ /$2$3/});
+}
+
+sub compactDump {
+  my $self = shift;
+  $self->{compactDump} = shift if @_;
+  $self->{compactDump} = 6*80-1 
+    if $self->{compactDump} and $self->{compactDump} < 2;
+  $self->{compactDump};
+}
+
+sub veryCompact {
+  my $self = shift;
+  $self->{veryCompact} = shift if @_;
+  $self->compactDump(1) if !$self->{compactDump} and $self->{veryCompact};
+  $self->{veryCompact};
+}
+
+sub set_unctrl {
+  my $self = shift;
+  if (@_) {
+    my $in = shift;
+    if ($in eq 'unctrl' or $in eq 'quote') {
+      $self->{unctrl} = $in;
+    } else {
+      print "Unknown value for `unctrl'.\n";
+    }
+  }
+  $self->{unctrl};
+}
+
+sub set_quote {
+  my $self = shift;
+  if (@_ and $_[0] eq '"') {
+    $self->{tick} = '"';
+    $self->{unctrl} = 'quote';
+  } elsif (@_ and $_[0] eq 'auto') {
+    $self->{tick} = 'auto';
+    $self->{unctrl} = 'quote';
+  } elsif (@_) {		# Need to set
+    $self->{tick} = "'";
+    $self->{unctrl} = 'unctrl';
+  }
+  $self->{tick};
+}
+
+sub dumpglob {
+  my $self = shift;
+  return if $DB::signal and $self->{stopDbSignal};
+  my ($package, $off, $key, $val, $all) = @_;
+  local(*stab) = $val;
+  my $fileno;
+  if (($key !~ /^_</ or $self->{dumpDBFiles}) and defined $stab) {
+    print( (' ' x $off) . "\$", &unctrl($key), " = " );
+    $self->DumpElem($stab, 3+$off);
+  }
+  if (($key !~ /^_</ or $self->{dumpDBFiles}) and @stab) {
+    print( (' ' x $off) . "\@$key = (\n" );
+    $self->unwrap(\@stab,3+$off) ;
+    print( (' ' x $off) .  ")\n" );
+  }
+  if ($key ne "main::" && $key ne "DB::" && %stab
+      && ($self->{dumpPackages} or $key !~ /::$/)
+      && ($key !~ /^_</ or $self->{dumpDBFiles})
+      && !($package eq "Dumpvalue" and $key eq "stab")) {
+    print( (' ' x $off) . "\%$key = (\n" );
+    $self->unwrap(\%stab,3+$off) ;
+    print( (' ' x $off) .  ")\n" );
+  }
+  if (defined ($fileno = fileno(*stab))) {
+    print( (' ' x $off) .  "FileHandle($key) => fileno($fileno)\n" );
+  }
+  if ($all) {
+    if (defined &stab) {
+      $self->dumpsub($off, $key);
+    }
+  }
+}
+
+sub CvGV_name {
+  my $self = shift;
+  my $in = shift;
+  return if $self->{skipCvGV};	# Backdoor to avoid problems if XS broken...
+  $in = \&$in;			# Hard reference...
+  eval {require Devel::Peek; 1} or return;
+  my $gv = Devel::Peek::CvGV($in) or return;
+  *$gv{PACKAGE} . '::' . *$gv{NAME};
+}
+
+sub dumpsub {
+  my $self = shift;
+  my ($off,$sub) = @_;
+  my $ini = $sub;
+  my $s;
+  $sub = $1 if $sub =~ /^\{\*(.*)\}$/;
+  my $subref = defined $1 ? \&$sub : \&$ini;
+  my $place = $DB::sub{$sub} || (($s = $subs{"$subref"}) && $DB::sub{$s})
+    || (($s = $self->CvGV_name($subref)) && $DB::sub{$s})
+    || ($self->{subdump} && ($s = $self->findsubs("$subref"))
+	&& $DB::sub{$s});
+  $s = $sub unless defined $s;
+  $place = '???' unless defined $place;
+  print( (' ' x $off) .  "&$s in $place\n" );
+}
+
+sub findsubs {
+  my $self = shift;
+  return undef unless %DB::sub;
+  my ($addr, $name, $loc);
+  while (($name, $loc) = each %DB::sub) {
+    $addr = \&$name;
+    $subs{"$addr"} = $name;
+  }
+  $self->{subdump} = 0;
+  $subs{ shift() };
+}
+
+sub dumpvars {
+  my $self = shift;
+  my ($package,@vars) = @_;
+  local(%address,$^W);
+  my ($key,$val);
+  $package .= "::" unless $package =~ /::$/;
+  *stab = *main::;
+
+  while ($package =~ /(\w+?::)/g) {
+    *stab = $ {stab}{$1};
+  }
+  $self->{TotalStrings} = 0;
+  $self->{Strings} = 0;
+  $self->{CompleteTotal} = 0;
+  while (($key,$val) = each(%stab)) {
+    return if $DB::signal and $self->{stopDbSignal};
+    next if @vars && !grep( matchvar($key, $_), @vars );
+    if ($self->{usageOnly}) {
+      $self->globUsage(\$val, $key)
+	if ($package ne 'Dumpvalue' or $key ne 'stab')
+	   and ref(\$val) eq 'GLOB';
+    } else {
+      $self->dumpglob($package, 0,$key, $val);
+    }
+  }
+  if ($self->{usageOnly}) {
+    print <<EOP;
+String space: $self->{TotalStrings} bytes in $self->{Strings} strings.
+EOP
+    $self->{CompleteTotal} += $self->{TotalStrings};
+    print <<EOP;
+Grand total = $self->{CompleteTotal} bytes (1 level deep) + overhead.
+EOP
+  }
+}
+
+sub scalarUsage {
+  my $self = shift;
+  my $size;
+  if (UNIVERSAL::isa($_[0], 'ARRAY')) {
+	$size = $self->arrayUsage($_[0]);
+  } elsif (UNIVERSAL::isa($_[0], 'HASH')) {
+	$size = $self->hashUsage($_[0]);
+  } elsif (!ref($_[0])) {
+	$size = length($_[0]);
+  }
+  $self->{TotalStrings} += $size;
+  $self->{Strings}++;
+  $size;
+}
+
+sub arrayUsage {		# array ref, name
+  my $self = shift;
+  my $size = 0;
+  map {$size += $self->scalarUsage($_)} @{$_[0]};
+  my $len = @{$_[0]};
+  print "\@$_[1] = $len item", ($len > 1 ? "s" : ""), " (data: $size bytes)\n"
+      if defined $_[1];
+  $self->{CompleteTotal} +=  $size;
+  $size;
+}
+
+sub hashUsage {			# hash ref, name
+  my $self = shift;
+  my @keys = keys %{$_[0]};
+  my @values = values %{$_[0]};
+  my $keys = $self->arrayUsage(\@keys);
+  my $values = $self->arrayUsage(\@values);
+  my $len = @keys;
+  my $total = $keys + $values;
+  print "\%$_[1] = $len item", ($len > 1 ? "s" : ""),
+    " (keys: $keys; values: $values; total: $total bytes)\n"
+      if defined $_[1];
+  $total;
+}
+
+sub globUsage {			# glob ref, name
+  my $self = shift;
+  local *stab = *{$_[0]};
+  my $total = 0;
+  $total += $self->scalarUsage($stab) if defined $stab;
+  $total += $self->arrayUsage(\@stab, $_[1]) if @stab;
+  $total += $self->hashUsage(\%stab, $_[1]) 
+    if %stab and $_[1] ne "main::" and $_[1] ne "DB::";	
+  #and !($package eq "Dumpvalue" and $key eq "stab"));
+  $total;
+}
+
+1;
+
+=head1 NAME
+
+Dumpvalue - provides screen dump of Perl data.
+
+=head1 SYNOPSIS
+
+  use Dumpvalue;
+  my $dumper = new Dumpvalue;
+  $dumper->set(globPrint => 1);
+  $dumper->dumpValue(\*::);
+  $dumper->dumpvars('main');
+  my $dump = $dumper->stringify($some_value);
+
+=head1 DESCRIPTION
+
+=head2 Creation
+
+A new dumper is created by a call
+
+  $d = new Dumpvalue(option1 => value1, option2 => value2)
+
+Recognized options:
+
+=over 4
+
+=item C<arrayDepth>, C<hashDepth>
+
+Print only first N elements of arrays and hashes.  If false, prints all the
+elements.
+
+=item C<compactDump>, C<veryCompact>
+
+Change style of array and hash dump.  If true, short array
+may be printed on one line.
+
+=item C<globPrint>
+
+Whether to print contents of globs.
+
+=item C<dumpDBFiles>
+
+Dump arrays holding contents of debugged files.
+
+=item C<dumpPackages>
+
+Dump symbol tables of packages.
+
+=item C<dumpReused>
+
+Dump contents of "reused" addresses.
+
+=item C<tick>, C<quoteHighBit>, C<printUndef>
+
+Change style of string dump.  Default value of C<tick> is C<auto>, one
+can enable either double-quotish dump, or single-quotish by setting it
+to C<"> or C<'>.  By default, characters with high bit set are printed
+I<as is>.  If C<quoteHighBit> is set, they will be quoted.
+
+=item C<usageOnly>
+
+rudimentally per-package memory usage dump.  If set,
+C<dumpvars> calculates total size of strings in variables in the package.
+
+=item unctrl
+
+Changes the style of printout of strings.  Possible values are
+C<unctrl> and C<quote>.
+
+=item subdump
+
+Whether to try to find the subroutine name given the reference.
+
+=item bareStringify
+
+Whether to write the non-overloaded form of the stringify-overloaded objects.
+
+=item quoteHighBit
+
+Whether to print chars with high bit set in binary or "as is".
+
+=item stopDbSignal
+
+Whether to abort printing if debugger signal flag is raised.
+
+=back
+
+Later in the life of the object the methods may be queries with get()
+method and set() method (which accept multiple arguments).
+
+=head2 Methods
+
+=over 4
+
+=item dumpValue
+
+  $dumper->dumpValue($value);
+  $dumper->dumpValue([$value1, $value2]);
+
+Prints a dump to the currently selected filehandle.
+
+=item dumpValues
+
+  $dumper->dumpValues($value1, $value2);
+
+Same as C< $dumper->dumpValue([$value1, $value2]); >.
+
+=item stringify
+
+  my $dump = $dumper->stringify($value [,$noticks] );
+
+Returns the dump of a single scalar without printing. If the second
+argument is true, the return value does not contain enclosing ticks.
+Does not handle data structures.
+
+=item dumpvars
+
+  $dumper->dumpvars('my_package');
+  $dumper->dumpvars('my_package', 'foo', '~bar$', '!......');
+
+The optional arguments are considered as literal strings unless they
+start with C<~> or C<!>, in which case they are interpreted as regular
+expressions (possibly negated).
+
+The second example prints entries with names C<foo>, and also entries
+with names which ends on C<bar>, or are shorter than 5 chars.
+
+=item set_quote
+
+  $d->set_quote('"');
+
+Sets C<tick> and C<unctrl> options to suitable values for printout with the
+given quote char.  Possible values are C<auto>, C<'> and C<">.
+
+=item set_unctrl
+
+  $d->set_unctrl('unctrl');
+
+Sets C<unctrl> option with checking for an invalid argument.
+Possible values are C<unctrl> and C<quote>.
+
+=item compactDump
+
+  $d->compactDump(1);
+
+Sets C<compactDump> option.  If the value is 1, sets to a reasonable
+big number.
+
+=item veryCompact
+
+  $d->veryCompact(1);
+
+Sets C<compactDump> and C<veryCompact> options simultaneously.
+
+=item set
+
+  $d->set(option1 => value1, option2 => value2);
+
+=item get
+
+  @values = $d->get('option1', 'option2');
+
+=back
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/DynaLoader.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/DynaLoader.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/DynaLoader.pm	(revision 14489)
@@ -0,0 +1,833 @@
+
+# Generated from DynaLoader.pm.PL
+
+package DynaLoader;
+
+#   And Gandalf said: 'Many folk like to know beforehand what is to
+#   be set on the table; but those who have laboured to prepare the
+#   feast like to keep their secret; for wonder makes the words of
+#   praise louder.'
+
+#   (Quote from Tolkien suggested by Anno Siegel.)
+#
+# See pod text at end of file for documentation.
+# See also ext/DynaLoader/README in source tree for other information.
+#
+# Tim.Bunce@ig.co.uk, August 1994
+
+use vars qw($VERSION *AUTOLOAD);
+
+$VERSION = '1.05';	# avoid typo warning
+
+require AutoLoader;
+*AUTOLOAD = \&AutoLoader::AUTOLOAD;
+
+use Config;
+
+# The following require can't be removed during maintenance
+# releases, sadly, because of the risk of buggy code that does 
+# require Carp; Carp::croak "..."; without brackets dying 
+# if Carp hasn't been loaded in earlier compile time. :-( 
+# We'll let those bugs get found on the development track.
+require Carp if $] < 5.00450; 
+
+# enable debug/trace messages from DynaLoader perl code
+$dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug;
+
+#
+# Flags to alter dl_load_file behaviour.  Assigned bits:
+#   0x01  make symbols available for linking later dl_load_file's.
+#         (only known to work on Solaris 2 using dlopen(RTLD_GLOBAL))
+#         (ignored under VMS; effect is built-in to image linking)
+#
+# This is called as a class method $module->dl_load_flags.  The
+# definition here will be inherited and result on "default" loading
+# behaviour unless a sub-class of DynaLoader defines its own version.
+#
+
+sub dl_load_flags { 0x00 }
+
+# ($dl_dlext, $dlsrc)
+#         = @Config::Config{'dlext', 'dlsrc'};
+  ($dl_dlext, $dlsrc) = ('dll','dl_win32.xs')
+;
+# Some systems need special handling to expand file specifications
+# (VMS support by Charles Bailey <bailey@HMIVAX.HUMGEN.UPENN.EDU>)
+# See dl_expandspec() for more details. Should be harmless but
+# inefficient to define on systems that don't need it.
+$Is_VMS    = $^O eq 'VMS';
+$do_expand = $Is_VMS;
+$Is_MacOS  = $^O eq 'MacOS';
+
+my $Mac_FS;
+$Mac_FS = eval { require Mac::FileSpec::Unixish } if $Is_MacOS;
+
+@dl_require_symbols = ();       # names of symbols we need
+@dl_resolve_using   = ();       # names of files to link with
+@dl_library_path    = ();       # path to look for files
+
+#XSLoader.pm may have added elements before we were required
+#@dl_shared_objects  = ();       # shared objects for symbols we have 
+#@dl_librefs         = ();       # things we have loaded
+#@dl_modules         = ();       # Modules we have loaded
+
+# This is a fix to support DLD's unfortunate desire to relink -lc
+@dl_resolve_using = dl_findfile('-lc') if $dlsrc eq "dl_dld.xs";
+
+# Initialise @dl_library_path with the 'standard' library path
+# for this platform as determined by Configure.
+
+push(@dl_library_path, split(' ', $Config::Config{libpth}));
+
+
+my $ldlibpthname         = $Config::Config{ldlibpthname};
+my $ldlibpthname_defined = defined $Config::Config{ldlibpthname};
+my $pthsep               = $Config::Config{path_sep};
+
+# Add to @dl_library_path any extra directories we can gather from environment
+# during runtime.
+
+if ($ldlibpthname_defined &&
+    exists $ENV{$ldlibpthname}) {
+    push(@dl_library_path, split(/$pthsep/, $ENV{$ldlibpthname}));
+}
+
+# E.g. HP-UX supports both its native SHLIB_PATH *and* LD_LIBRARY_PATH.
+
+if ($ldlibpthname_defined &&
+    $ldlibpthname ne 'LD_LIBRARY_PATH' &&
+    exists $ENV{LD_LIBRARY_PATH}) {
+    push(@dl_library_path, split(/$pthsep/, $ENV{LD_LIBRARY_PATH}));
+}
+
+
+# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
+# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB
+boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
+                                !defined(&dl_error);
+
+if ($dl_debug) {
+    print STDERR "DynaLoader.pm loaded (@INC, @dl_library_path)\n";
+    print STDERR "DynaLoader not linked into this perl\n"
+	    unless defined(&boot_DynaLoader);
+}
+
+1; # End of main code
+
+
+sub croak   { require Carp; Carp::croak(@_)   }
+
+sub bootstrap_inherit {
+    my $module = $_[0];
+    local *isa = *{"$module\::ISA"};
+    local @isa = (@isa, 'DynaLoader');
+    # Cannot goto due to delocalization.  Will report errors on a wrong line?
+    bootstrap(@_);
+}
+
+# The bootstrap function cannot be autoloaded (without complications)
+# so we define it here:
+
+sub bootstrap {
+    # use local vars to enable $module.bs script to edit values
+    local(@args) = @_;
+    local($module) = $args[0];
+    local(@dirs, $file);
+
+    unless ($module) {
+	require Carp;
+	Carp::confess("Usage: DynaLoader::bootstrap(module)");
+    }
+
+    # A common error on platforms which don't support dynamic loading.
+    # Since it's fatal and potentially confusing we give a detailed message.
+    croak("Can't load module $module, dynamic loading not available in this perl.\n".
+	"  (You may need to build a new perl executable which either supports\n".
+	"  dynamic loading or has the $module module statically linked into it.)\n")
+	unless defined(&dl_load_file);
+
+    my @modparts = split(/::/,$module);
+    my $modfname = $modparts[-1];
+
+    # Some systems have restrictions on files names for DLL's etc.
+    # mod2fname returns appropriate file base name (typically truncated)
+    # It may also edit @modparts if required.
+    $modfname = &mod2fname(\@modparts) if defined &mod2fname;
+
+    # Truncate the module name to 8.3 format for NetWare
+	if (($^O eq 'NetWare') && (length($modfname) > 8)) {
+		$modfname = substr($modfname, 0, 8);
+	}
+
+    my $modpname = join(($Is_MacOS ? ':' : '/'),@modparts);
+
+    print STDERR "DynaLoader::bootstrap for $module ",
+		($Is_MacOS
+		       ? "(:auto:$modpname:$modfname.$dl_dlext)\n" :
+		       "(auto/$modpname/$modfname.$dl_dlext)\n")
+	if $dl_debug;
+
+    foreach (@INC) {
+	chop($_ = VMS::Filespec::unixpath($_)) if $Is_VMS;
+	my $dir;
+	if ($Is_MacOS) {
+	    my $path = $_;
+	    if ($Mac_FS && ! -d $path) {
+		$path = Mac::FileSpec::Unixish::nativize($path);
+	    }
+	    $path .= ":"  unless /:$/;
+	    $dir = "${path}auto:$modpname";
+	} else {
+	    $dir = "$_/auto/$modpname";
+	}
+	
+	next unless -d $dir; # skip over uninteresting directories
+	
+	# check for common cases to avoid autoload of dl_findfile
+	my $try = $Is_MacOS ? "$dir:$modfname.$dl_dlext" : "$dir/$modfname.$dl_dlext";
+	last if $file = ($do_expand) ? dl_expandspec($try) : ((-f $try) && $try);
+	
+	# no luck here, save dir for possible later dl_findfile search
+	push @dirs, $dir;
+    }
+    # last resort, let dl_findfile have a go in all known locations
+    $file = dl_findfile(map("-L$_",@dirs,@INC), $modfname) unless $file;
+
+    croak("Can't locate loadable object for module $module in \@INC (\@INC contains: @INC)")
+	unless $file;	# wording similar to error from 'require'
+
+    $file = uc($file) if $Is_VMS && $Config::Config{d_vms_case_sensitive_symbols};
+    my $bootname = "boot_$module";
+    $bootname =~ s/\W/_/g;
+    @dl_require_symbols = ($bootname);
+
+    # Execute optional '.bootstrap' perl script for this module.
+    # The .bs file can be used to configure @dl_resolve_using etc to
+    # match the needs of the individual module on this architecture.
+    my $bs = $file;
+    $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library
+    if (-s $bs) { # only read file if it's not empty
+        print STDERR "BS: $bs ($^O, $dlsrc)\n" if $dl_debug;
+        eval { do $bs; };
+        warn "$bs: $@\n" if $@;
+    }
+
+    my $boot_symbol_ref;
+
+    if ($^O eq 'darwin') {
+        if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) {
+            goto boot; #extension library has already been loaded, e.g. darwin
+        }
+    }
+
+    # Many dynamic extension loading problems will appear to come from
+    # this section of code: XYZ failed at line 123 of DynaLoader.pm.
+    # Often these errors are actually occurring in the initialisation
+    # C code of the extension XS file. Perl reports the error as being
+    # in this perl code simply because this was the last perl code
+    # it executed.
+
+    my $libref = dl_load_file($file, $module->dl_load_flags) or
+	croak("Can't load '$file' for module $module: ".dl_error());
+
+    push(@dl_librefs,$libref);  # record loaded object
+
+    my @unresolved = dl_undef_symbols();
+    if (@unresolved) {
+	require Carp;
+	Carp::carp("Undefined symbols present after loading $file: @unresolved\n");
+    }
+
+    $boot_symbol_ref = dl_find_symbol($libref, $bootname) or
+         croak("Can't find '$bootname' symbol in $file\n");
+
+    push(@dl_modules, $module); # record loaded module
+
+  boot:
+    my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file);
+
+    # See comment block above
+
+	push(@dl_shared_objects, $file); # record files loaded
+
+    &$xs(@args);
+}
+
+
+#sub _check_file {   # private utility to handle dl_expandspec vs -f tests
+#    my($file) = @_;
+#    return $file if (!$do_expand && -f $file); # the common case
+#    return $file if ( $do_expand && ($file=dl_expandspec($file)));
+#    return undef;
+#}
+
+
+# Let autosplit and the autoloader deal with these functions:
+__END__
+
+
+sub dl_findfile {
+    # Read ext/DynaLoader/DynaLoader.doc for detailed information.
+    # This function does not automatically consider the architecture
+    # or the perl library auto directories.
+    my (@args) = @_;
+    my (@dirs,  $dir);   # which directories to search
+    my (@found);         # full paths to real files we have found
+    my $dl_ext= 'dll'; # $Config::Config{'dlext'} suffix for perl extensions
+    my $dl_so = 'dll'; # $Config::Config{'so'} suffix for shared libraries
+
+    print STDERR "dl_findfile(@args)\n" if $dl_debug;
+
+    # accumulate directories but process files as they appear
+    arg: foreach(@args) {
+        #  Special fast case: full filepath requires no search
+        if ($Is_VMS && m%[:>/\]]% && -f $_) {
+	    push(@found,dl_expandspec(VMS::Filespec::vmsify($_)));
+	    last arg unless wantarray;
+	    next;
+        }
+	elsif ($Is_MacOS) {
+	    if (m/:/ && -f $_) {
+	    	push(@found,$_);
+	    	last arg unless wantarray;
+	    }
+	}
+        elsif (m:/: && -f $_ && !$do_expand) {
+	    push(@found,$_);
+	    last arg unless wantarray;
+	    next;
+	}
+
+        # Deal with directories first:
+        #  Using a -L prefix is the preferred option (faster and more robust)
+        if (m:^-L:) { s/^-L//; push(@dirs, $_); next; }
+
+	if ($Is_MacOS) {
+            #  Otherwise we try to try to spot directories by a heuristic
+            #  (this is a more complicated issue than it first appears)
+	    if (m/:/ && -d $_) {   push(@dirs, $_); next; }
+            #  Only files should get this far...
+            my(@names, $name);    # what filenames to look for
+	    s/^-l//;
+	    push(@names, $_);
+            foreach $dir (@dirs, @dl_library_path) {
+            	next unless -d $dir;
+		$dir =~ s/^([^:]+)$/:$1/;
+		$dir =~ s/:$//;
+            	foreach $name (@names) {
+	    	    my($file) = "$dir:$name";
+                    print STDERR " checking in $dir for $name\n" if $dl_debug;
+		    if (-f $file) {
+                    	push(@found, $file);
+                    	next arg; # no need to look any further
+                    }
+                }
+	    }
+	    next;
+	}
+	
+        #  Otherwise we try to try to spot directories by a heuristic
+        #  (this is a more complicated issue than it first appears)
+        if (m:/: && -d $_) {   push(@dirs, $_); next; }
+
+        # VMS: we may be using native VMS directory syntax instead of
+        # Unix emulation, so check this as well
+        if ($Is_VMS && /[:>\]]/ && -d $_) {   push(@dirs, $_); next; }
+
+        #  Only files should get this far...
+        my(@names, $name);    # what filenames to look for
+        if (m:-l: ) {          # convert -lname to appropriate library name
+            s/-l//;
+            push(@names,"lib$_.$dl_so");
+            push(@names,"lib$_.a");
+        } else {                # Umm, a bare name. Try various alternatives:
+            # these should be ordered with the most likely first
+            push(@names,"$_.$dl_ext")    unless m/\.$dl_ext$/o;
+            push(@names,"$_.$dl_so")     unless m/\.$dl_so$/o;
+            push(@names,"lib$_.$dl_so")  unless m:/:;
+            push(@names,"$_.a")          if !m/\.a$/ and $dlsrc eq "dl_dld.xs";
+            push(@names, $_);
+        }
+        foreach $dir (@dirs, @dl_library_path) {
+            next unless -d $dir;
+            chop($dir = VMS::Filespec::unixpath($dir)) if $Is_VMS;
+            foreach $name (@names) {
+		my($file) = "$dir/$name";
+                print STDERR " checking in $dir for $name\n" if $dl_debug;
+		$file = ($do_expand) ? dl_expandspec($file) : (-f $file && $file);
+		#$file = _check_file($file);
+		if ($file) {
+                    push(@found, $file);
+                    next arg; # no need to look any further
+                }
+            }
+        }
+    }
+    if ($dl_debug) {
+        foreach(@dirs) {
+            print STDERR " dl_findfile ignored non-existent directory: $_\n" unless -d $_;
+        }
+        print STDERR "dl_findfile found: @found\n";
+    }
+    return $found[0] unless wantarray;
+    @found;
+}
+
+
+sub dl_expandspec {
+    my($spec) = @_;
+    # Optional function invoked if DynaLoader.pm sets $do_expand.
+    # Most systems do not require or use this function.
+    # Some systems may implement it in the dl_*.xs file in which case
+    # this autoload version will not be called but is harmless.
+
+    # This function is designed to deal with systems which treat some
+    # 'filenames' in a special way. For example VMS 'Logical Names'
+    # (something like unix environment variables - but different).
+    # This function should recognise such names and expand them into
+    # full file paths.
+    # Must return undef if $spec is invalid or file does not exist.
+
+    my $file = $spec; # default output to input
+
+    if ($Is_VMS) { # dl_expandspec should be defined in dl_vms.xs
+	require Carp;
+	Carp::croak("dl_expandspec: should be defined in XS file!\n");
+    } else {
+	return undef unless -f $file;
+    }
+    print STDERR "dl_expandspec($spec) => $file\n" if $dl_debug;
+    $file;
+}
+
+sub dl_find_symbol_anywhere
+{
+    my $sym = shift;
+    my $libref;
+    foreach $libref (@dl_librefs) {
+	my $symref = dl_find_symbol($libref,$sym);
+	return $symref if $symref;
+    }
+    return undef;
+}
+
+=head1 NAME
+
+DynaLoader - Dynamically load C libraries into Perl code
+
+=head1 SYNOPSIS
+
+    package YourPackage;
+    require DynaLoader;
+    @ISA = qw(... DynaLoader ...);
+    bootstrap YourPackage;
+
+    # optional method for 'global' loading
+    sub dl_load_flags { 0x01 }     
+
+
+=head1 DESCRIPTION
+
+This document defines a standard generic interface to the dynamic
+linking mechanisms available on many platforms.  Its primary purpose is
+to implement automatic dynamic loading of Perl modules.
+
+This document serves as both a specification for anyone wishing to
+implement the DynaLoader for a new platform and as a guide for
+anyone wishing to use the DynaLoader directly in an application.
+
+The DynaLoader is designed to be a very simple high-level
+interface that is sufficiently general to cover the requirements
+of SunOS, HP-UX, NeXT, Linux, VMS and other platforms.
+
+It is also hoped that the interface will cover the needs of OS/2, NT
+etc and also allow pseudo-dynamic linking (using C<ld -A> at runtime).
+
+It must be stressed that the DynaLoader, by itself, is practically
+useless for accessing non-Perl libraries because it provides almost no
+Perl-to-C 'glue'.  There is, for example, no mechanism for calling a C
+library function or supplying arguments.  A C::DynaLib module
+is available from CPAN sites which performs that function for some
+common system types.  And since the year 2000, there's also Inline::C,
+a module that allows you to write Perl subroutines in C.  Also available
+from your local CPAN site.
+
+DynaLoader Interface Summary
+
+  @dl_library_path
+  @dl_resolve_using
+  @dl_require_symbols
+  $dl_debug
+  @dl_librefs
+  @dl_modules
+  @dl_shared_objects
+                                                  Implemented in:
+  bootstrap($modulename)                               Perl
+  @filepaths = dl_findfile(@names)                     Perl
+  $flags = $modulename->dl_load_flags                  Perl
+  $symref  = dl_find_symbol_anywhere($symbol)          Perl
+
+  $libref  = dl_load_file($filename, $flags)           C
+  $status  = dl_unload_file($libref)                   C
+  $symref  = dl_find_symbol($libref, $symbol)          C
+  @symbols = dl_undef_symbols()                        C
+  dl_install_xsub($name, $symref [, $filename])        C
+  $message = dl_error                                  C
+
+=over 4
+
+=item @dl_library_path
+
+The standard/default list of directories in which dl_findfile() will
+search for libraries etc.  Directories are searched in order:
+$dl_library_path[0], [1], ... etc
+
+@dl_library_path is initialised to hold the list of 'normal' directories
+(F</usr/lib>, etc) determined by B<Configure> (C<$Config{'libpth'}>).  This should
+ensure portability across a wide range of platforms.
+
+@dl_library_path should also be initialised with any other directories
+that can be determined from the environment at runtime (such as
+LD_LIBRARY_PATH for SunOS).
+
+After initialisation @dl_library_path can be manipulated by an
+application using push and unshift before calling dl_findfile().
+Unshift can be used to add directories to the front of the search order
+either to save search time or to override libraries with the same name
+in the 'normal' directories.
+
+The load function that dl_load_file() calls may require an absolute
+pathname.  The dl_findfile() function and @dl_library_path can be
+used to search for and return the absolute pathname for the
+library/object that you wish to load.
+
+=item @dl_resolve_using
+
+A list of additional libraries or other shared objects which can be
+used to resolve any undefined symbols that might be generated by a
+later call to load_file().
+
+This is only required on some platforms which do not handle dependent
+libraries automatically.  For example the Socket Perl extension
+library (F<auto/Socket/Socket.so>) contains references to many socket
+functions which need to be resolved when it's loaded.  Most platforms
+will automatically know where to find the 'dependent' library (e.g.,
+F</usr/lib/libsocket.so>).  A few platforms need to be told the
+location of the dependent library explicitly.  Use @dl_resolve_using
+for this.
+
+Example usage:
+
+    @dl_resolve_using = dl_findfile('-lsocket');
+
+=item @dl_require_symbols
+
+A list of one or more symbol names that are in the library/object file
+to be dynamically loaded.  This is only required on some platforms.
+
+=item @dl_librefs
+
+An array of the handles returned by successful calls to dl_load_file(),
+made by bootstrap, in the order in which they were loaded.
+Can be used with dl_find_symbol() to look for a symbol in any of
+the loaded files.
+
+=item @dl_modules
+
+An array of module (package) names that have been bootstrap'ed.
+
+=item @dl_shared_objects
+
+An array of file names for the shared objects that were loaded.
+
+=item dl_error()
+
+Syntax:
+
+    $message = dl_error();
+
+Error message text from the last failed DynaLoader function.  Note
+that, similar to errno in unix, a successful function call does not
+reset this message.
+
+Implementations should detect the error as soon as it occurs in any of
+the other functions and save the corresponding message for later
+retrieval.  This will avoid problems on some platforms (such as SunOS)
+where the error message is very temporary (e.g., dlerror()).
+
+=item $dl_debug
+
+Internal debugging messages are enabled when $dl_debug is set true.
+Currently setting $dl_debug only affects the Perl side of the
+DynaLoader.  These messages should help an application developer to
+resolve any DynaLoader usage problems.
+
+$dl_debug is set to C<$ENV{'PERL_DL_DEBUG'}> if defined.
+
+For the DynaLoader developer/porter there is a similar debugging
+variable added to the C code (see dlutils.c) and enabled if Perl was
+built with the B<-DDEBUGGING> flag.  This can also be set via the
+PERL_DL_DEBUG environment variable.  Set to 1 for minimal information or
+higher for more.
+
+=item dl_findfile()
+
+Syntax:
+
+    @filepaths = dl_findfile(@names)
+
+Determine the full paths (including file suffix) of one or more
+loadable files given their generic names and optionally one or more
+directories.  Searches directories in @dl_library_path by default and
+returns an empty list if no files were found.
+
+Names can be specified in a variety of platform independent forms.  Any
+names in the form B<-lname> are converted into F<libname.*>, where F<.*> is
+an appropriate suffix for the platform.
+
+If a name does not already have a suitable prefix and/or suffix then
+the corresponding file will be searched for by trying combinations of
+prefix and suffix appropriate to the platform: "$name.o", "lib$name.*"
+and "$name".
+
+If any directories are included in @names they are searched before
+@dl_library_path.  Directories may be specified as B<-Ldir>.  Any other
+names are treated as filenames to be searched for.
+
+Using arguments of the form C<-Ldir> and C<-lname> is recommended.
+
+Example: 
+
+    @dl_resolve_using = dl_findfile(qw(-L/usr/5lib -lposix));
+
+
+=item dl_expandspec()
+
+Syntax:
+
+    $filepath = dl_expandspec($spec)
+
+Some unusual systems, such as VMS, require special filename handling in
+order to deal with symbolic names for files (i.e., VMS's Logical Names).
+
+To support these systems a dl_expandspec() function can be implemented
+either in the F<dl_*.xs> file or code can be added to the autoloadable
+dl_expandspec() function in F<DynaLoader.pm>.  See F<DynaLoader.pm> for
+more information.
+
+=item dl_load_file()
+
+Syntax:
+
+    $libref = dl_load_file($filename, $flags)
+
+Dynamically load $filename, which must be the path to a shared object
+or library.  An opaque 'library reference' is returned as a handle for
+the loaded object.  Returns undef on error.
+
+The $flags argument to alters dl_load_file behaviour.  
+Assigned bits:
+
+ 0x01  make symbols available for linking later dl_load_file's.
+       (only known to work on Solaris 2 using dlopen(RTLD_GLOBAL))
+       (ignored under VMS; this is a normal part of image linking)
+
+(On systems that provide a handle for the loaded object such as SunOS
+and HPUX, $libref will be that handle.  On other systems $libref will
+typically be $filename or a pointer to a buffer containing $filename.
+The application should not examine or alter $libref in any way.)
+
+This is the function that does the real work.  It should use the
+current values of @dl_require_symbols and @dl_resolve_using if required.
+
+    SunOS: dlopen($filename)
+    HP-UX: shl_load($filename)
+    Linux: dld_create_reference(@dl_require_symbols); dld_link($filename)
+    NeXT:  rld_load($filename, @dl_resolve_using)
+    VMS:   lib$find_image_symbol($filename,$dl_require_symbols[0])
+
+(The dlopen() function is also used by Solaris and some versions of
+Linux, and is a common choice when providing a "wrapper" on other
+mechanisms as is done in the OS/2 port.)
+
+=item dl_unload_file()
+
+Syntax:
+
+    $status = dl_unload_file($libref)
+
+Dynamically unload $libref, which must be an opaque 'library reference' as
+returned from dl_load_file.  Returns one on success and zero on failure.
+
+This function is optional and may not necessarily be provided on all platforms.
+If it is defined, it is called automatically when the interpreter exits for
+every shared object or library loaded by DynaLoader::bootstrap.  All such
+library references are stored in @dl_librefs by DynaLoader::Bootstrap as it
+loads the libraries.  The files are unloaded in last-in, first-out order.
+
+This unloading is usually necessary when embedding a shared-object perl (e.g.
+one configured with -Duseshrplib) within a larger application, and the perl
+interpreter is created and destroyed several times within the lifetime of the
+application.  In this case it is possible that the system dynamic linker will
+unload and then subsequently reload the shared libperl without relocating any
+references to it from any files DynaLoaded by the previous incarnation of the
+interpreter.  As a result, any shared objects opened by DynaLoader may point to
+a now invalid 'ghost' of the libperl shared object, causing apparently random
+memory corruption and crashes.  This behaviour is most commonly seen when using
+Apache and mod_perl built with the APXS mechanism.
+
+    SunOS: dlclose($libref)
+    HP-UX: ???
+    Linux: ???
+    NeXT:  ???
+    VMS:   ???
+
+(The dlclose() function is also used by Solaris and some versions of
+Linux, and is a common choice when providing a "wrapper" on other
+mechanisms as is done in the OS/2 port.)
+
+=item dl_load_flags()
+
+Syntax:
+
+    $flags = dl_load_flags $modulename;
+
+Designed to be a method call, and to be overridden by a derived class
+(i.e. a class which has DynaLoader in its @ISA).  The definition in
+DynaLoader itself returns 0, which produces standard behavior from
+dl_load_file().
+
+=item dl_find_symbol()
+
+Syntax:
+
+    $symref = dl_find_symbol($libref, $symbol)
+
+Return the address of the symbol $symbol or C<undef> if not found.  If the
+target system has separate functions to search for symbols of different
+types then dl_find_symbol() should search for function symbols first and
+then other types.
+
+The exact manner in which the address is returned in $symref is not
+currently defined.  The only initial requirement is that $symref can
+be passed to, and understood by, dl_install_xsub().
+
+    SunOS: dlsym($libref, $symbol)
+    HP-UX: shl_findsym($libref, $symbol)
+    Linux: dld_get_func($symbol) and/or dld_get_symbol($symbol)
+    NeXT:  rld_lookup("_$symbol")
+    VMS:   lib$find_image_symbol($libref,$symbol)
+
+
+=item dl_find_symbol_anywhere()
+
+Syntax:
+
+    $symref = dl_find_symbol_anywhere($symbol)
+
+Applies dl_find_symbol() to the members of @dl_librefs and returns
+the first match found.
+
+=item dl_undef_symbols()
+
+Example
+
+    @symbols = dl_undef_symbols()
+
+Return a list of symbol names which remain undefined after load_file().
+Returns C<()> if not known.  Don't worry if your platform does not provide
+a mechanism for this.  Most do not need it and hence do not provide it,
+they just return an empty list.
+
+
+=item dl_install_xsub()
+
+Syntax:
+
+    dl_install_xsub($perl_name, $symref [, $filename])
+
+Create a new Perl external subroutine named $perl_name using $symref as
+a pointer to the function which implements the routine.  This is simply
+a direct call to newXSUB().  Returns a reference to the installed
+function.
+
+The $filename parameter is used by Perl to identify the source file for
+the function if required by die(), caller() or the debugger.  If
+$filename is not defined then "DynaLoader" will be used.
+
+
+=item bootstrap()
+
+Syntax:
+
+bootstrap($module)
+
+This is the normal entry point for automatic dynamic loading in Perl.
+
+It performs the following actions:
+
+=over 8
+
+=item *
+
+locates an auto/$module directory by searching @INC
+
+=item *
+
+uses dl_findfile() to determine the filename to load
+
+=item *
+
+sets @dl_require_symbols to C<("boot_$module")>
+
+=item *
+
+executes an F<auto/$module/$module.bs> file if it exists
+(typically used to add to @dl_resolve_using any files which
+are required to load the module on the current platform)
+
+=item *
+
+calls dl_load_flags() to determine how to load the file.
+
+=item *
+
+calls dl_load_file() to load the file
+
+=item *
+
+calls dl_undef_symbols() and warns if any symbols are undefined
+
+=item *
+
+calls dl_find_symbol() for "boot_$module"
+
+=item *
+
+calls dl_install_xsub() to install it as "${module}::bootstrap"
+
+=item *
+
+calls &{"${module}::bootstrap"} to bootstrap the module (actually
+it uses the function reference returned by dl_install_xsub for speed)
+
+=back
+
+=back
+
+
+=head1 AUTHOR
+
+Tim Bunce, 11 August 1994.
+
+This interface is based on the work and comments of (in no particular
+order): Larry Wall, Robert Sanders, Dean Roehrich, Jeff Okamoto, Anno
+Siegel, Thomas Neumann, Paul Marquess, Charles Bailey, myself and others.
+
+Larry Wall designed the elegant inherited bootstrap mechanism and
+implemented the first Perl 5 dynamic loader using it.
+
+Solaris global loading added by Nick Ing-Simmons with design/coding
+assistance from Tim Bunce, January 1996.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode.pm	(revision 14489)
@@ -0,0 +1,851 @@
+#
+# $Id: Encode.pm,v 2.12 2005/09/08 14:17:17 dankogai Exp dankogai $
+#
+package Encode;
+use strict;
+our $VERSION = sprintf "%d.%02d", q$Revision: 2.12 $ =~ /(\d+)/g;
+sub DEBUG () { 0 }
+use XSLoader ();
+XSLoader::load(__PACKAGE__, $VERSION);
+
+require Exporter;
+use base qw/Exporter/;
+
+# Public, encouraged API is exported by default
+
+our @EXPORT = qw(
+  decode  decode_utf8  encode  encode_utf8
+  encodings  find_encoding clone_encoding
+);
+
+our @FB_FLAGS  = qw(DIE_ON_ERR WARN_ON_ERR RETURN_ON_ERR LEAVE_SRC
+		    PERLQQ HTMLCREF XMLCREF STOP_AT_PARTIAL);
+our @FB_CONSTS = qw(FB_DEFAULT FB_CROAK FB_QUIET FB_WARN
+		    FB_PERLQQ FB_HTMLCREF FB_XMLCREF);
+
+our @EXPORT_OK =
+    (
+     qw(
+       _utf8_off _utf8_on define_encoding from_to is_16bit is_8bit
+       is_utf8 perlio_ok resolve_alias utf8_downgrade utf8_upgrade
+      ),
+     @FB_FLAGS, @FB_CONSTS,
+    );
+
+our %EXPORT_TAGS =
+    (
+     all          =>  [ @EXPORT, @EXPORT_OK ],
+     fallbacks    =>  [ @FB_CONSTS ],
+     fallback_all =>  [ @FB_CONSTS, @FB_FLAGS ],
+    );
+
+# Documentation moved after __END__ for speed - NI-S
+
+our $ON_EBCDIC = (ord("A") == 193);
+
+use Encode::Alias;
+
+# Make a %Encoding package variable to allow a certain amount of cheating
+our %Encoding;
+our %ExtModule;
+require Encode::Config;
+eval { require Encode::ConfigLocal };
+
+sub encodings
+{
+    my $class = shift;
+    my %enc;
+    if (@_ and $_[0] eq ":all"){
+	%enc = ( %Encoding, %ExtModule );
+    }else{
+	%enc = %Encoding;
+	for my $mod (map {m/::/o ? $_ : "Encode::$_" } @_){
+	    DEBUG and warn $mod;
+	    for my $enc (keys %ExtModule){
+		$ExtModule{$enc} eq $mod and $enc{$enc} = $mod;
+	    }
+	}
+    }
+    return
+	sort { lc $a cmp lc $b }
+             grep {!/^(?:Internal|Unicode|Guess)$/o} keys %enc;
+}
+
+sub perlio_ok{
+    my $obj = ref($_[0]) ? $_[0] : find_encoding($_[0]);
+    $obj->can("perlio_ok") and return $obj->perlio_ok();
+    return 0; # safety net
+}
+
+sub define_encoding
+{
+    my $obj  = shift;
+    my $name = shift;
+    $Encoding{$name} = $obj;
+    my $lc = lc($name);
+    define_alias($lc => $obj) unless $lc eq $name;
+    while (@_){
+	my $alias = shift;
+	define_alias($alias, $obj);
+    }
+    return $obj;
+}
+
+sub getEncoding
+{
+    my ($class, $name, $skip_external) = @_;
+
+    ref($name) && $name->can('renew') and return $name;
+    exists $Encoding{$name} and return $Encoding{$name};
+    my $lc = lc $name;
+    exists $Encoding{$lc} and return $Encoding{$lc};
+
+    my $oc = $class->find_alias($name);
+    defined($oc) and return $oc;
+    $lc ne $name and $oc = $class->find_alias($lc);
+    defined($oc) and return $oc;
+
+    unless ($skip_external)
+    {
+	if (my $mod = $ExtModule{$name} || $ExtModule{$lc}){
+	    $mod =~ s,::,/,g ; $mod .= '.pm';
+	    eval{ require $mod; };
+	    exists $Encoding{$name} and return $Encoding{$name};
+	}
+    }
+    return;
+}
+
+sub find_encoding($;$)
+{
+    my ($name, $skip_external) = @_;
+    return __PACKAGE__->getEncoding($name,$skip_external);
+}
+
+sub resolve_alias($){
+    my $obj = find_encoding(shift);
+    defined $obj and return $obj->name;
+    return;
+}
+
+sub clone_encoding($){
+    my $obj = find_encoding(shift);
+    ref $obj or return;
+    eval { require Storable };
+    $@ and return;
+    return Storable::dclone($obj);
+}
+
+sub encode($$;$)
+{
+    my ($name, $string, $check) = @_;
+    return undef unless defined $string;
+    $string .= '' if ref $string; # stringify;
+    $check ||=0;
+    my $enc = find_encoding($name);
+    unless(defined $enc){
+	require Carp;
+	Carp::croak("Unknown encoding '$name'");
+    }
+    my $octets = $enc->encode($string,$check);
+    $_[1] = $string if $check and !($check & LEAVE_SRC());
+    return $octets;
+}
+
+sub decode($$;$)
+{
+    my ($name,$octets,$check) = @_;
+    return undef unless defined $octets;
+    $octets .= '' if ref $octets;
+    $check ||=0;
+    my $enc = find_encoding($name);
+    unless(defined $enc){
+	require Carp;
+	Carp::croak("Unknown encoding '$name'");
+    }
+    my $string = $enc->decode($octets,$check);
+    $_[1] = $octets if $check and !($check & LEAVE_SRC());
+    return $string;
+}
+
+sub from_to($$$;$)
+{
+    my ($string,$from,$to,$check) = @_;
+    return undef unless defined $string;
+    $check ||=0;
+    my $f = find_encoding($from);
+    unless (defined $f){
+	require Carp;
+	Carp::croak("Unknown encoding '$from'");
+    }
+    my $t = find_encoding($to);
+    unless (defined $t){
+	require Carp;
+	Carp::croak("Unknown encoding '$to'");
+    }
+    my $uni = $f->decode($string,$check);
+    return undef if ($check && length($string));
+    $string =  $t->encode($uni,$check);
+    return undef if ($check && length($uni));
+    return defined($_[0] = $string) ? length($string) : undef ;
+}
+
+sub encode_utf8($)
+{
+    my ($str) = @_;
+    utf8::encode($str);
+    return $str;
+}
+
+sub decode_utf8($;$)
+{
+    my ($str, $check) = @_;
+    if ($check){
+	return decode("utf8", $str, $check);
+    }else{
+	return decode("utf8", $str);
+	return $str;
+    }
+}
+
+predefine_encodings(1);
+
+#
+# This is to restore %Encoding if really needed;
+#
+
+sub predefine_encodings{
+    use Encode::Encoding;
+    no warnings 'redefine';
+    my $use_xs = shift;
+    if ($ON_EBCDIC) {
+	# was in Encode::UTF_EBCDIC
+	package Encode::UTF_EBCDIC;
+	push @Encode::UTF_EBCDIC::ISA, 'Encode::Encoding';
+	*decode = sub{
+	    my ($obj,$str,$chk) = @_;
+	    my $res = '';
+	    for (my $i = 0; $i < length($str); $i++) {
+		$res .=
+		    chr(utf8::unicode_to_native(ord(substr($str,$i,1))));
+	    }
+	    $_[1] = '' if $chk;
+	    return $res;
+	};
+	*encode = sub{
+	    my ($obj,$str,$chk) = @_;
+	    my $res = '';
+	    for (my $i = 0; $i < length($str); $i++) {
+		$res .=
+		    chr(utf8::native_to_unicode(ord(substr($str,$i,1))));
+	    }
+	    $_[1] = '' if $chk;
+	    return $res;
+	};
+	$Encode::Encoding{Unicode} =
+	    bless {Name => "UTF_EBCDIC"} => "Encode::UTF_EBCDIC";
+    } else {
+	package Encode::Internal;
+	push @Encode::Internal::ISA, 'Encode::Encoding';
+	*decode = sub{
+	    my ($obj,$str,$chk) = @_;
+	    utf8::upgrade($str);
+	    $_[1] = '' if $chk;
+	    return $str;
+	};
+	*encode = \&decode;
+	$Encode::Encoding{Unicode} =
+	    bless {Name => "Internal"} => "Encode::Internal";
+    }
+
+    {
+	# was in Encode::utf8
+	package Encode::utf8;
+	push @Encode::utf8::ISA, 'Encode::Encoding';
+	# 
+	if ($use_xs){
+	    Encode::DEBUG and warn __PACKAGE__, " XS on";
+	    *decode = \&decode_xs;
+	    *encode = \&encode_xs;
+	}else{
+	    Encode::DEBUG and warn __PACKAGE__, " XS off";
+	    *decode = sub{
+		my ($obj,$octets,$chk) = @_;
+		my $str = Encode::decode_utf8($octets);
+		if (defined $str) {
+		    $_[1] = '' if $chk;
+		    return $str;
+		}
+		return undef;
+	    };
+	    *encode = sub {
+		my ($obj,$string,$chk) = @_;
+		my $octets = Encode::encode_utf8($string);
+		$_[1] = '' if $chk;
+		return $octets;
+	    };
+	}
+	*cat_decode = sub{ # ($obj, $dst, $src, $pos, $trm, $chk)
+	    my ($obj, undef, undef, $pos, $trm) = @_; # currently ignores $chk
+	    my ($rdst, $rsrc, $rpos) = \@_[1,2,3];
+	    use bytes;
+	    if ((my $npos = index($$rsrc, $trm, $pos)) >= 0) {
+		$$rdst .= substr($$rsrc, $pos, $npos - $pos + length($trm));
+		$$rpos = $npos + length($trm);
+		return 1;
+	    }
+	    $$rdst .= substr($$rsrc, $pos);
+	    $$rpos = length($$rsrc);
+	    return '';
+	};
+	$Encode::Encoding{utf8} =
+	    bless {Name => "utf8"} => "Encode::utf8";
+	$Encode::Encoding{"utf-8-strict"} =
+	    bless {Name => "utf-8-strict", strict_utf8 => 1 } => "Encode::utf8";
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Encode - character encodings
+
+=head1 SYNOPSIS
+
+    use Encode;
+
+=head2 Table of Contents
+
+Encode consists of a collection of modules whose details are too big
+to fit in one document.  This POD itself explains the top-level APIs
+and general topics at a glance.  For other topics and more details,
+see the PODs below:
+
+  Name			        Description
+  --------------------------------------------------------
+  Encode::Alias         Alias definitions to encodings
+  Encode::Encoding      Encode Implementation Base Class
+  Encode::Supported     List of Supported Encodings
+  Encode::CN            Simplified Chinese Encodings
+  Encode::JP            Japanese Encodings
+  Encode::KR            Korean Encodings
+  Encode::TW            Traditional Chinese Encodings
+  --------------------------------------------------------
+
+=head1 DESCRIPTION
+
+The C<Encode> module provides the interfaces between Perl's strings
+and the rest of the system.  Perl strings are sequences of
+B<characters>.
+
+The repertoire of characters that Perl can represent is at least that
+defined by the Unicode Consortium. On most platforms the ordinal
+values of the characters (as returned by C<ord(ch)>) is the "Unicode
+codepoint" for the character (the exceptions are those platforms where
+the legacy encoding is some variant of EBCDIC rather than a super-set
+of ASCII - see L<perlebcdic>).
+
+Traditionally, computer data has been moved around in 8-bit chunks
+often called "bytes". These chunks are also known as "octets" in
+networking standards. Perl is widely used to manipulate data of many
+types - not only strings of characters representing human or computer
+languages but also "binary" data being the machine's representation of
+numbers, pixels in an image - or just about anything.
+
+When Perl is processing "binary data", the programmer wants Perl to
+process "sequences of bytes". This is not a problem for Perl - as a
+byte has 256 possible values, it easily fits in Perl's much larger
+"logical character".
+
+=head2 TERMINOLOGY
+
+=over 2
+
+=item *
+
+I<character>: a character in the range 0..(2**32-1) (or more).
+(What Perl's strings are made of.)
+
+=item *
+
+I<byte>: a character in the range 0..255
+(A special case of a Perl character.)
+
+=item *
+
+I<octet>: 8 bits of data, with ordinal values 0..255
+(Term for bytes passed to or from a non-Perl context, e.g. a disk file.)
+
+=back
+
+=head1 PERL ENCODING API
+
+=over 2
+
+=item $octets  = encode(ENCODING, $string [, CHECK])
+
+Encodes a string from Perl's internal form into I<ENCODING> and returns
+a sequence of octets.  ENCODING can be either a canonical name or
+an alias.  For encoding names and aliases, see L</"Defining Aliases">.
+For CHECK, see L</"Handling Malformed Data">.
+
+For example, to convert a string from Perl's internal format to
+iso-8859-1 (also known as Latin1),
+
+  $octets = encode("iso-8859-1", $string);
+
+B<CAVEAT>: When you run C<$octets = encode("utf8", $string)>, then $octets
+B<may not be equal to> $string.  Though they both contain the same data, the utf8 flag
+for $octets is B<always> off.  When you encode anything, utf8 flag of
+the result is always off, even when it contains completely valid utf8
+string. See L</"The UTF-8 flag"> below.
+
+If the $string is C<undef> then C<undef> is returned.
+
+=item $string = decode(ENCODING, $octets [, CHECK])
+
+Decodes a sequence of octets assumed to be in I<ENCODING> into Perl's
+internal form and returns the resulting string.  As in encode(),
+ENCODING can be either a canonical name or an alias. For encoding names
+and aliases, see L</"Defining Aliases">.  For CHECK, see
+L</"Handling Malformed Data">.
+
+For example, to convert ISO-8859-1 data to a string in Perl's internal format:
+
+  $string = decode("iso-8859-1", $octets);
+
+B<CAVEAT>: When you run C<$string = decode("utf8", $octets)>, then $string
+B<may not be equal to> $octets.  Though they both contain the same data,
+the utf8 flag for $string is on unless $octets entirely consists of
+ASCII data (or EBCDIC on EBCDIC machines).  See L</"The UTF-8 flag">
+below.
+
+If the $string is C<undef> then C<undef> is returned.
+
+=item [$length =] from_to($octets, FROM_ENC, TO_ENC [, CHECK])
+
+Converts B<in-place> data between two encodings. The data in $octets
+must be encoded as octets and not as characters in Perl's internal
+format. For example, to convert ISO-8859-1 data to Microsoft's CP1250
+encoding:
+
+  from_to($octets, "iso-8859-1", "cp1250");
+
+and to convert it back:
+
+  from_to($octets, "cp1250", "iso-8859-1");
+
+Note that because the conversion happens in place, the data to be
+converted cannot be a string constant; it must be a scalar variable.
+
+from_to() returns the length of the converted string in octets on
+success, I<undef> on error.
+
+B<CAVEAT>: The following operations look the same but are not quite so;
+
+  from_to($data, "iso-8859-1", "utf8"); #1
+  $data = decode("iso-8859-1", $data);  #2
+
+Both #1 and #2 make $data consist of a completely valid UTF-8 string
+but only #2 turns utf8 flag on.  #1 is equivalent to
+
+  $data = encode("utf8", decode("iso-8859-1", $data));
+
+See L</"The UTF-8 flag"> below.
+
+=item $octets = encode_utf8($string);
+
+Equivalent to C<$octets = encode("utf8", $string);> The characters
+that comprise $string are encoded in Perl's internal format and the
+result is returned as a sequence of octets. All possible
+characters have a UTF-8 representation so this function cannot fail.
+
+
+=item $string = decode_utf8($octets [, CHECK]);
+
+equivalent to C<$string = decode("utf8", $octets [, CHECK])>.
+The sequence of octets represented by
+$octets is decoded from UTF-8 into a sequence of logical
+characters. Not all sequences of octets form valid UTF-8 encodings, so
+it is possible for this call to fail.  For CHECK, see
+L</"Handling Malformed Data">.
+
+=back
+
+=head2 Listing available encodings
+
+  use Encode;
+  @list = Encode->encodings();
+
+Returns a list of the canonical names of the available encodings that
+are loaded.  To get a list of all available encodings including the
+ones that are not loaded yet, say
+
+  @all_encodings = Encode->encodings(":all");
+
+Or you can give the name of a specific module.
+
+  @with_jp = Encode->encodings("Encode::JP");
+
+When "::" is not in the name, "Encode::" is assumed.
+
+  @ebcdic = Encode->encodings("EBCDIC");
+
+To find out in detail which encodings are supported by this package,
+see L<Encode::Supported>.
+
+=head2 Defining Aliases
+
+To add a new alias to a given encoding, use:
+
+  use Encode;
+  use Encode::Alias;
+  define_alias(newName => ENCODING);
+
+After that, newName can be used as an alias for ENCODING.
+ENCODING may be either the name of an encoding or an
+I<encoding object>
+
+But before you do so, make sure the alias is nonexistent with
+C<resolve_alias()>, which returns the canonical name thereof.
+i.e.
+
+  Encode::resolve_alias("latin1") eq "iso-8859-1" # true
+  Encode::resolve_alias("iso-8859-12")   # false; nonexistent
+  Encode::resolve_alias($name) eq $name  # true if $name is canonical
+
+resolve_alias() does not need C<use Encode::Alias>; it can be
+exported via C<use Encode qw(resolve_alias)>.
+
+See L<Encode::Alias> for details.
+
+=head1 Encoding via PerlIO
+
+If your perl supports I<PerlIO> (which is the default), you can use a PerlIO layer to decode
+and encode directly via a filehandle.  The following two examples
+are totally identical in their functionality.
+
+  # via PerlIO
+  open my $in,  "<:encoding(shiftjis)", $infile  or die;
+  open my $out, ">:encoding(euc-jp)",   $outfile or die;
+  while(<$in>){ print $out $_; }
+
+  # via from_to
+  open my $in,  "<", $infile  or die;
+  open my $out, ">", $outfile or die;
+  while(<$in>){
+    from_to($_, "shiftjis", "euc-jp", 1);
+    print $out $_;
+  }
+
+Unfortunately, it may be that encodings are PerlIO-savvy.  You can check
+if your encoding is supported by PerlIO by calling the C<perlio_ok>
+method.
+
+  Encode::perlio_ok("hz");             # False
+  find_encoding("euc-cn")->perlio_ok;  # True where PerlIO is available
+
+  use Encode qw(perlio_ok);            # exported upon request
+  perlio_ok("euc-jp")
+
+Fortunately, all encodings that come with Encode core are PerlIO-savvy
+except for hz and ISO-2022-kr.  For gory details, see
+L<Encode::Encoding> and L<Encode::PerlIO>.
+
+=head1 Handling Malformed Data
+
+The optional I<CHECK> argument tells Encode what to do when it
+encounters malformed data.  Without CHECK, Encode::FB_DEFAULT ( == 0 )
+is assumed.
+
+As of version 2.12 Encode supports coderef values for CHECK.  See below.
+
+=over 2
+
+=item B<NOTE:> Not all encoding support this feature
+
+Some encodings ignore I<CHECK> argument.  For example,
+L<Encode::Unicode> ignores I<CHECK> and it always croaks on error.
+
+=back
+
+Now here is the list of I<CHECK> values available
+
+=over 2
+
+=item I<CHECK> = Encode::FB_DEFAULT ( == 0)
+
+If I<CHECK> is 0, (en|de)code will put a I<substitution character> in
+place of a malformed character.  When you encode, E<lt>subcharE<gt>
+will be used.  When you decode the code point C<0xFFFD> is used.  If
+the data is supposed to be UTF-8, an optional lexical warning
+(category utf8) is given.
+
+=item I<CHECK> = Encode::FB_CROAK ( == 1)
+
+If I<CHECK> is 1, methods will die on error immediately with an error
+message.  Therefore, when I<CHECK> is set to 1,  you should trap the
+error with eval{} unless you really want to let it die.
+
+=item I<CHECK> = Encode::FB_QUIET
+
+If I<CHECK> is set to Encode::FB_QUIET, (en|de)code will immediately
+return the portion of the data that has been processed so far when an
+error occurs. The data argument will be overwritten with everything
+after that point (that is, the unprocessed part of data).  This is
+handy when you have to call decode repeatedly in the case where your
+source data may contain partial multi-byte character sequences,
+(i.e. you are reading with a fixed-width buffer). Here is a sample
+code that does exactly this:
+
+  my $buffer = ''; my $string = '';
+  while(read $fh, $buffer, 256, length($buffer)){
+    $string .= decode($encoding, $buffer, Encode::FB_QUIET);
+    # $buffer now contains the unprocessed partial character
+  }
+
+=item I<CHECK> = Encode::FB_WARN
+
+This is the same as above, except that it warns on error.  Handy when
+you are debugging the mode above.
+
+=item perlqq mode (I<CHECK> = Encode::FB_PERLQQ)
+
+=item HTML charref mode (I<CHECK> = Encode::FB_HTMLCREF)
+
+=item XML charref mode (I<CHECK> = Encode::FB_XMLCREF)
+
+For encodings that are implemented by Encode::XS, CHECK ==
+Encode::FB_PERLQQ turns (en|de)code into C<perlqq> fallback mode.
+
+When you decode, C<\xI<HH>> will be inserted for a malformed character,
+where I<HH> is the hex representation of the octet  that could not be
+decoded to utf8.  And when you encode, C<\x{I<HHHH>}> will be inserted,
+where I<HHHH> is the Unicode ID of the character that cannot be found
+in the character repertoire of the encoding.
+
+HTML/XML character reference modes are about the same, in place of
+C<\x{I<HHHH>}>, HTML uses C<&#I<NNN>;> where I<NNN> is a decimal number and
+XML uses C<&#xI<HHHH>;> where I<HHHH> is the hexadecimal number.
+
+In Encode 2.10 or later, C<LEAVE_SRC> is also implied.
+
+=item The bitmask
+
+These modes are actually set via a bitmask.  Here is how the FB_XX
+constants are laid out.  You can import the FB_XX constants via
+C<use Encode qw(:fallbacks)>; you can import the generic bitmask
+constants via C<use Encode qw(:fallback_all)>.
+
+                     FB_DEFAULT FB_CROAK FB_QUIET FB_WARN  FB_PERLQQ
+ DIE_ON_ERR    0x0001             X
+ WARN_ON_ERR   0x0002                               X
+ RETURN_ON_ERR 0x0004                      X        X
+ LEAVE_SRC     0x0008                                        X
+ PERLQQ        0x0100                                        X
+ HTMLCREF      0x0200
+ XMLCREF       0x0400
+
+=back
+
+=head2 coderef for CHECK
+
+As of Encode 2.12 CHECK can also be a code reference which takes the
+ord value of unmapped caharacter as an argument and returns a string
+that represents the fallback character.  For instance,
+
+  $ascii = encode("ascii", $utf8, sub{ sprintf "<U+%04X>", shift });
+
+Acts like FB_PERLQQ but E<lt>U+I<XXXX>E<gt> is used instead of
+\x{I<XXXX>}.
+
+=head1 Defining Encodings
+
+To define a new encoding, use:
+
+    use Encode qw(define_encoding);
+    define_encoding($object, 'canonicalName' [, alias...]);
+
+I<canonicalName> will be associated with I<$object>.  The object
+should provide the interface described in L<Encode::Encoding>.
+If more than two arguments are provided then additional
+arguments are taken as aliases for I<$object>.
+
+See L<Encode::Encoding> for more details.
+
+=head1 The UTF-8 flag
+
+Before the introduction of utf8 support in perl, The C<eq> operator
+just compared the strings represented by two scalars. Beginning with
+perl 5.8, C<eq> compares two strings with simultaneous consideration
+of I<the utf8 flag>. To explain why we made it so, I will quote page
+402 of C<Programming Perl, 3rd ed.>
+
+=over 2
+
+=item Goal #1:
+
+Old byte-oriented programs should not spontaneously break on the old
+byte-oriented data they used to work on.
+
+=item Goal #2:
+
+Old byte-oriented programs should magically start working on the new
+character-oriented data when appropriate.
+
+=item Goal #3:
+
+Programs should run just as fast in the new character-oriented mode
+as in the old byte-oriented mode.
+
+=item Goal #4:
+
+Perl should remain one language, rather than forking into a
+byte-oriented Perl and a character-oriented Perl.
+
+=back
+
+Back when C<Programming Perl, 3rd ed.> was written, not even Perl 5.6.0
+was born and many features documented in the book remained
+unimplemented for a long time.  Perl 5.8 corrected this and the introduction
+of the UTF-8 flag is one of them.  You can think of this perl notion as of a
+byte-oriented mode (utf8 flag off) and a character-oriented mode (utf8
+flag on).
+
+Here is how Encode takes care of the utf8 flag.
+
+=over 2
+
+=item *
+
+When you encode, the resulting utf8 flag is always off.
+
+=item *
+
+When you decode, the resulting utf8 flag is on unless you can
+unambiguously represent data.  Here is the definition of
+dis-ambiguity.
+
+After C<$utf8 = decode('foo', $octet);>,
+
+  When $octet is...   The utf8 flag in $utf8 is
+  ---------------------------------------------
+  In ASCII only (or EBCDIC only)            OFF
+  In ISO-8859-1                              ON
+  In any other Encoding                      ON
+  ---------------------------------------------
+
+As you see, there is one exception, In ASCII.  That way you can assume
+Goal #1.  And with Encode Goal #2 is assumed but you still have to be
+careful in such cases mentioned in B<CAVEAT> paragraphs.
+
+This utf8 flag is not visible in perl scripts, exactly for the same
+reason you cannot (or you I<don't have to>) see if a scalar contains a
+string, integer, or floating point number.   But you can still peek
+and poke these if you will.  See the section below.
+
+=back
+
+=head2 Messing with Perl's Internals
+
+The following API uses parts of Perl's internals in the current
+implementation.  As such, they are efficient but may change.
+
+=over 2
+
+=item is_utf8(STRING [, CHECK])
+
+[INTERNAL] Tests whether the UTF-8 flag is turned on in the STRING.
+If CHECK is true, also checks the data in STRING for being well-formed
+UTF-8.  Returns true if successful, false otherwise.
+
+As of perl 5.8.1, L<utf8> also has utf8::is_utf8().
+
+=item _utf8_on(STRING)
+
+[INTERNAL] Turns on the UTF-8 flag in STRING.  The data in STRING is
+B<not> checked for being well-formed UTF-8.  Do not use unless you
+B<know> that the STRING is well-formed UTF-8.  Returns the previous
+state of the UTF-8 flag (so please don't treat the return value as
+indicating success or failure), or C<undef> if STRING is not a string.
+
+=item _utf8_off(STRING)
+
+[INTERNAL] Turns off the UTF-8 flag in STRING.  Do not use frivolously.
+Returns the previous state of the UTF-8 flag (so please don't treat the
+return value as indicating success or failure), or C<undef> if STRING is
+not a string.
+
+=back
+
+=head1 UTF-8 vs. utf8
+
+  ....We now view strings not as sequences of bytes, but as sequences
+  of numbers in the range 0 .. 2**32-1 (or in the case of 64-bit
+  computers, 0 .. 2**64-1) -- Programming Perl, 3rd ed.
+
+That has been the perl's notion of UTF-8 but official UTF-8 is more
+strict; Its ranges is much narrower (0 .. 10FFFF), some sequences are
+not allowed (i.e. Those used in the surrogate pair, 0xFFFE, et al).
+
+Now that is overruled by Larry Wall himself.
+
+  From: Larry Wall <larry@wall.org>
+  Date: December 04, 2004 11:51:58 JST
+  To: perl-unicode@perl.org
+  Subject: Re: Make Encode.pm support the real UTF-8
+  Message-Id: <20041204025158.GA28754@wall.org>
+  
+  On Fri, Dec 03, 2004 at 10:12:12PM +0000, Tim Bunce wrote:
+  : I've no problem with 'utf8' being perl's unrestricted uft8 encoding,
+  : but "UTF-8" is the name of the standard and should give the
+  : corresponding behaviour.
+  
+  For what it's worth, that's how I've always kept them straight in my
+  head.
+  
+  Also for what it's worth, Perl 6 will mostly default to strict but
+  make it easy to switch back to lax.
+  
+  Larry
+
+Do you copy?  As of Perl 5.8.7, B<UTF-8> means strict, official UTF-8
+while B<utf8> means liberal, lax, version thereof.  And Encode version
+2.10 or later thus groks the difference between C<UTF-8> and C"utf8".
+
+  encode("utf8",  "\x{FFFF_FFFF}", 1); # okay
+  encode("UTF-8", "\x{FFFF_FFFF}", 1); # croaks
+
+C<UTF-8> in Encode is actually a canonical name for C<utf-8-strict>.
+Yes, the hyphen between "UTF" and "8" is important.  Without it Encode
+goes "liberal"
+
+  find_encoding("UTF-8")->name # is 'utf-8-strict'
+  find_encoding("utf-8")->name # ditto. names are case insensitive
+  find_encoding("utf8")->name  # ditto. "_" are treated as "-"
+  find_encoding("UTF8")->name  # is 'utf8'.
+
+
+=head1 SEE ALSO
+
+L<Encode::Encoding>,
+L<Encode::Supported>,
+L<Encode::PerlIO>,
+L<encoding>,
+L<perlebcdic>,
+L<perlfunc/open>,
+L<perlunicode>,
+L<utf8>,
+the Perl Unicode Mailing List E<lt>perl-unicode@perl.orgE<gt>
+
+=head1 MAINTAINER
+
+This project was originated by Nick Ing-Simmons and later maintained
+by Dan Kogai E<lt>dankogai@dan.co.jpE<gt>.  See AUTHORS for a full
+list of people involved.  For any questions, use
+E<lt>perl-unicode@perl.orgE<gt> so we can all share.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Alias.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Alias.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Alias.pm	(revision 14489)
@@ -0,0 +1,341 @@
+package Encode::Alias;
+use strict;
+no warnings 'redefine';
+use Encode;
+our $VERSION = do { my @r = (q$Revision: 2.4 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+sub DEBUG () { 0 }
+
+use base qw(Exporter);
+
+# Public, encouraged API is exported by default
+
+our @EXPORT = 
+    qw (
+	define_alias
+	find_alias
+	);
+
+our @Alias;  # ordered matching list
+our %Alias;  # cached known aliases
+
+sub find_alias{
+    my $class = shift;
+    my $find = shift;
+    unless (exists $Alias{$find}) {
+        $Alias{$find} = undef; # Recursion guard
+	for (my $i=0; $i < @Alias; $i += 2){
+	    my $alias = $Alias[$i];
+	    my $val   = $Alias[$i+1];
+	    my $new;
+	    if (ref($alias) eq 'Regexp' && $find =~ $alias){
+		DEBUG and warn "eval $val";
+		$new = eval $val;
+		DEBUG and $@ and warn "$val, $@";
+	    }elsif (ref($alias) eq 'CODE'){
+		DEBUG and warn "$alias", "->", "($find)";
+		$new = $alias->($find);
+	    }elsif (lc($find) eq lc($alias)){
+		$new = $val;
+	    }
+	    if (defined($new)){
+		next if $new eq $find; # avoid (direct) recursion on bugs
+		DEBUG and warn "$alias, $new";
+		my $enc = (ref($new)) ? $new : Encode::find_encoding($new);
+		if ($enc){
+		    $Alias{$find} = $enc;
+		    last;
+		}
+	    }
+	}
+	# case insensitive search when canonical is not in all lowercase
+	# RT ticket #7835
+	unless ($Alias{$find}){
+	    my $lcfind = lc($find);
+	    for my $name (keys %Encode::Encoding, keys %Encode::ExtModule){
+		$lcfind eq lc($name) or next;
+		$Alias{$find} =  Encode::find_encoding($name);
+		DEBUG and warn "$find => $name";
+	    }
+	}
+    }
+    if (DEBUG){
+	my $name;
+	if (my $e = $Alias{$find}){
+	    $name = $e->name;
+	}else{
+	    $name = "";
+	}
+	warn "find_alias($class, $find)->name = $name";
+    }
+    return $Alias{$find};
+}
+
+sub define_alias{
+    while (@_){
+	my ($alias,$name) = splice(@_,0,2);
+	unshift(@Alias, $alias => $name);   # newer one has precedence
+	if (ref($alias)){
+	    # clear %Alias cache to allow overrides
+	    my @a = keys %Alias;
+	    for my $k (@a){
+		if (ref($alias) eq 'Regexp' && $k =~ $alias){
+		    DEBUG and warn "delete \$Alias\{$k\}";
+		    delete $Alias{$k};
+		}
+		elsif (ref($alias) eq 'CODE'){
+		    DEBUG and warn "delete \$Alias\{$k\}";
+		    delete $Alias{$alias->($name)};
+		}
+	    }
+	}else{
+	    DEBUG and warn "delete \$Alias\{$alias\}";
+	    delete $Alias{$alias};
+	}
+    }
+}
+
+# Allow latin-1 style names as well
+# 0  1  2  3  4  5   6   7   8   9  10
+our @Latin2iso = ( 0, 1, 2, 3, 4, 9, 10, 13, 14, 15, 16 );
+# Allow winlatin1 style names as well
+our %Winlatin2cp   = (
+		      'latin1'     => 1252,
+		      'latin2'     => 1250,
+		      'cyrillic'   => 1251,
+		      'greek'      => 1253,
+		      'turkish'    => 1254,
+		      'hebrew'     => 1255,
+		      'arabic'     => 1256,
+		      'baltic'     => 1257,
+		      'vietnamese' => 1258,
+		     );
+
+init_aliases();
+
+sub undef_aliases{
+    @Alias = ();
+    %Alias = ();
+}
+
+sub init_aliases
+{
+    undef_aliases();
+    # Try all-lower-case version should all else fails
+    define_alias( qr/^(.*)$/ => '"\L$1"' );
+
+    # UTF/UCS stuff
+    define_alias( qr/^UTF-?7$/i           => '"UTF-7"');
+    define_alias( qr/^UCS-?2-?LE$/i       => '"UCS-2LE"' );
+    define_alias( qr/^UCS-?2-?(BE)?$/i    => '"UCS-2BE"',
+                  qr/^UCS-?4-?(BE|LE)?$/i => 'uc("UTF-32$1")',
+		  qr/^iso-10646-1$/i      => '"UCS-2BE"' );
+    define_alias( qr/^UTF-?(16|32)-?BE$/i   => '"UTF-$1BE"',
+		  qr/^UTF-?(16|32)-?LE$/i   => '"UTF-$1LE"',
+		  qr/^UTF-?(16|32)$/i       => '"UTF-$1"',
+		);
+    # ASCII
+    define_alias(qr/^(?:US-?)ascii$/i => '"ascii"');
+    define_alias('C' => 'ascii');
+    define_alias(qr/\bISO[-_]?646[-_]?US$/i => '"ascii"');
+    # Allow variants of iso-8859-1 etc.
+    define_alias( qr/\biso[-_]?(\d+)[-_](\d+)$/i => '"iso-$1-$2"' );
+
+    # At least HP-UX has these.
+    define_alias( qr/\biso8859(\d+)$/i => '"iso-8859-$1"' );
+
+    # More HP stuff.
+    define_alias( qr/\b(?:hp-)?(arabic|greek|hebrew|kana|roman|thai|turkish)8$/i => '"${1}8"' );
+
+    # The Official name of ASCII.
+    define_alias( qr/\bANSI[-_]?X3\.4[-_]?1968$/i => '"ascii"' );
+
+    # This is a font issue, not an encoding issue.
+    # (The currency symbol of the Latin 1 upper half
+    #  has been redefined as the euro symbol.)
+    define_alias( qr/^(.+)\@euro$/i => '"$1"' );
+
+    define_alias( qr/\b(?:iso[-_]?)?latin[-_]?(\d+)$/i 
+		  => 'defined $Encode::Alias::Latin2iso[$1] ? "iso-8859-$Encode::Alias::Latin2iso[$1]" : undef' );
+
+    define_alias( qr/\bwin(latin[12]|cyrillic|baltic|greek|turkish|
+			 hebrew|arabic|baltic|vietnamese)$/ix => 
+		  '"cp" . $Encode::Alias::Winlatin2cp{lc($1)}' );
+
+    # Common names for non-latin preferred MIME names
+    define_alias( 'ascii'    => 'US-ascii',
+		  'cyrillic' => 'iso-8859-5',
+		  'arabic'   => 'iso-8859-6',
+		  'greek'    => 'iso-8859-7',
+		  'hebrew'   => 'iso-8859-8',
+		  'thai'     => 'iso-8859-11',
+		  'tis620'   => 'iso-8859-11',
+		  );
+
+    # At least AIX has IBM-NNN (surprisingly...) instead of cpNNN.
+    # And Microsoft has their own naming (again, surprisingly).
+    # And windows-* is registered in IANA! 
+    define_alias( qr/\b(?:cp|ibm|ms|windows)[-_ ]?(\d{2,4})$/i => '"cp$1"');
+
+    # Sometimes seen with a leading zero.
+    # define_alias( qr/\bcp037\b/i => '"cp37"');
+
+    # Mac Mappings
+    # predefined in *.ucm; unneeded
+    # define_alias( qr/\bmacIcelandic$/i => '"macIceland"');
+    define_alias( qr/^mac_(.*)$/i => '"mac$1"');
+    # Ououououou. gone.  They are differente!
+    # define_alias( qr/\bmacRomanian$/i => '"macRumanian"');
+  
+    # Standardize on the dashed versions.
+    define_alias( qr/\bkoi8[\s\-_]*([ru])$/i => '"koi8-$1"' );
+
+    unless ($Encode::ON_EBCDIC){
+        # for Encode::CN
+	define_alias( qr/\beuc.*cn$/i        => '"euc-cn"' );
+	define_alias( qr/\bcn.*euc$/i        => '"euc-cn"' );
+	# define_alias( qr/\bGB[- ]?(\d+)$/i => '"euc-cn"' )
+	# CP936 doesn't have vendor-addon for GBK, so they're identical.
+	define_alias( qr/^gbk$/i => '"cp936"');
+	# This fixes gb2312 vs. euc-cn confusion, practically
+	define_alias( qr/\bGB[-_ ]?2312(?!-?raw)/i => '"euc-cn"' );
+	# for Encode::JP
+	define_alias( qr/\bjis$/i            => '"7bit-jis"' );
+	define_alias( qr/\beuc.*jp$/i        => '"euc-jp"' );
+	define_alias( qr/\bjp.*euc$/i        => '"euc-jp"' );
+	define_alias( qr/\bujis$/i           => '"euc-jp"' );
+	define_alias( qr/\bshift.*jis$/i     => '"shiftjis"' );
+	define_alias( qr/\bsjis$/i           => '"shiftjis"' );
+	define_alias( qr/\bwindows-31j$/i    => '"cp932"' );
+        # for Encode::KR
+	define_alias( qr/\beuc.*kr$/i        => '"euc-kr"' );
+	define_alias( qr/\bkr.*euc$/i        => '"euc-kr"' );
+	# This fixes ksc5601 vs. euc-kr confusion, practically
+        define_alias( qr/(?:x-)?uhc$/i            => '"cp949"' );
+        define_alias( qr/(?:x-)?windows-949$/i    => '"cp949"' );
+        define_alias( qr/\bks_c_5601-1987$/i      => '"cp949"' );
+        # for Encode::TW
+	define_alias( qr/\bbig-?5$/i		  => '"big5-eten"' );
+	define_alias( qr/\bbig5-?et(?:en)?$/i	  => '"big5-eten"' );
+	define_alias( qr/\btca[-_]?big5$/i	  => '"big5-eten"' );
+	define_alias( qr/\bbig5-?hk(?:scs)?$/i	  => '"big5-hkscs"' );
+	define_alias( qr/\bhk(?:scs)?[-_]?big5$/i  => '"big5-hkscs"' );
+    }
+    # utf8 is blessed :)
+    define_alias( qr/^UTF-8$/i => '"utf-8-strict"');
+    # At last, Map white space and _ to '-'
+    define_alias( qr/^(\S+)[\s_]+(.*)$/i => '"$1-$2"' );
+}
+
+1;
+__END__
+
+# TODO: HP-UX '8' encodings arabic8 greek8 hebrew8 kana8 thai8 turkish8
+# TODO: HP-UX '15' encodings japanese15 korean15 roi15
+# TODO: Cyrillic encoding ISO-IR-111 (useful?)
+# TODO: Armenian encoding ARMSCII-8
+# TODO: Hebrew encoding ISO-8859-8-1
+# TODO: Thai encoding TCVN
+# TODO: Vietnamese encodings VPS
+# TODO: Mac Asian+African encodings: Arabic Armenian Bengali Burmese
+#       ChineseSimp ChineseTrad Devanagari Ethiopic ExtArabic
+#       Farsi Georgian Gujarati Gurmukhi Hebrew Japanese
+#       Kannada Khmer Korean Laotian Malayalam Mongolian
+#       Oriya Sinhalese Symbol Tamil Telugu Tibetan Vietnamese
+
+=head1 NAME
+
+Encode::Alias - alias definitions to encodings
+
+=head1 SYNOPSIS
+
+  use Encode;
+  use Encode::Alias;
+  define_alias( newName => ENCODING);
+
+=head1 DESCRIPTION
+
+Allows newName to be used as an alias for ENCODING. ENCODING may be
+either the name of an encoding or an encoding object (as described 
+in L<Encode>).
+
+Currently I<newName> can be specified in the following ways:
+
+=over 4
+
+=item As a simple string.
+
+=item As a qr// compiled regular expression, e.g.:
+
+  define_alias( qr/^iso8859-(\d+)$/i => '"iso-8859-$1"' );
+
+In this case, if I<ENCODING> is not a reference, it is C<eval>-ed
+in order to allow C<$1> etc. to be substituted.  The example is one
+way to alias names as used in X11 fonts to the MIME names for the
+iso-8859-* family.  Note the double quotes inside the single quotes.
+
+(or, you don't have to do this yourself because this example is predefined)
+
+If you are using a regex here, you have to use the quotes as shown or
+it won't work.  Also note that regex handling is tricky even for the
+experienced.  Use this feature with caution.
+
+=item As a code reference, e.g.:
+
+  define_alias( sub {shift =~ /^iso8859-(\d+)$/i ? "iso-8859-$1" : undef } );
+
+The same effect as the example above in a different way.  The coderef
+takes the alias name as an argument and returns a canonical name on
+success or undef if not.  Note the second argument is not required.
+Use this with even more caution than the regex version.
+
+=back
+
+=head3 Changes in code reference aliasing
+
+As of Encode 1.87, the older form
+
+  define_alias( sub { return  /^iso8859-(\d+)$/i ? "iso-8859-$1" : undef } );
+
+no longer works. 
+
+Encode up to 1.86 internally used "local $_" to implement ths older
+form.  But consider the code below;
+
+  use Encode;
+  $_ = "eeeee" ;
+  while (/(e)/g) {
+    my $utf = decode('aliased-encoding-name', $1);
+    print "position:",pos,"\n";
+  }
+
+Prior to Encode 1.86 this fails because of "local $_".
+
+=head2 Alias overloading
+
+You can override predefined aliases by simply applying define_alias().
+The new alias is always evaluated first, and when necessary,
+define_alias() flushes the internal cache to make the new definition
+available.
+
+  # redirect SHIFT_JIS to MS/IBM Code Page 932, which is a
+  # superset of SHIFT_JIS
+
+  define_alias( qr/shift.*jis$/i  => '"cp932"' );
+  define_alias( qr/sjis$/i        => '"cp932"' );
+
+If you want to zap all predefined aliases, you can use
+
+  Encode::Alias->undef_aliases;
+
+to do so.  And
+
+  Encode::Alias->init_aliases;
+
+gets the factory settings back.
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::Supported>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Byte.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Byte.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Byte.pm	(revision 14489)
@@ -0,0 +1,119 @@
+package Encode::Byte;
+use Encode;
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use XSLoader;
+XSLoader::load(__PACKAGE__,$VERSION);
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Byte - Single Byte Encodings
+
+=head1 SYNOPSIS
+
+    use Encode qw/encode decode/; 
+    $greek = encode("iso-8859-7", $utf8);  # loads Encode::Byte implicitly
+    $utf8  = decode("iso-8859-7", $greek); # ditto
+
+=head1 ABSTRACT
+
+This module implements various single byte encodings.  For most cases it uses
+\x80-\xff (upper half) to map non-ASCII characters.  Encodings
+supported are as follows.   
+
+  Canonical      Alias		                      Description
+  --------------------------------------------------------------------
+  # ISO 8859 series
+  (iso-8859-1	is in built-in)
+  iso-8859-2	latin2					     [ISO]
+  iso-8859-3	latin3					     [ISO]
+  iso-8859-4	latin4					     [ISO]
+  iso-8859-5						     [ISO]
+  iso-8859-6						     [ISO]
+  iso-8859-7						     [ISO]
+  iso-8859-8						     [ISO]
+  iso-8859-9	latin5					     [ISO]
+  iso-8859-10	latin6					     [ISO]
+  iso-8859-11
+  (iso-8859-12 is nonexistent)
+  iso-8859-13   latin7					     [ISO]
+  iso-8859-14	latin8					     [ISO]
+  iso-8859-15	latin9					     [ISO]
+  iso-8859-16	latin10					     [ISO]
+
+  # Cyrillic
+  koi8-f					
+  koi8-r        cp878					 [RFC1489]
+  koi8-u						 [RFC2319]
+
+  # Vietnamese
+  viscii
+
+  # all cp* are also available as ibm-*, ms-*, and windows-*
+  # also see L<http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset4.asp>
+
+  cp424  
+  cp437  
+  cp737  
+  cp775  
+  cp850  
+  cp852  
+  cp855  
+  cp856  
+  cp857  
+  cp860  
+  cp861  
+  cp862  
+  cp863  
+  cp864  
+  cp865  
+  cp866  
+  cp869  
+  cp874  
+  cp1006  
+  cp1250	WinLatin2
+  cp1251	WinCyrillic
+  cp1252	WinLatin1
+  cp1253	WinGreek
+  cp1254	WinTurkish
+  cp1255	WinHebrew
+  cp1256	WinArabic
+  cp1257	WinBaltic
+  cp1258	WinVietnamese
+
+  # Macintosh
+  # Also see L<http://developer.apple.com/technotes/tn/tn1150.html>
+  MacArabic  
+  MacCentralEurRoman  
+  MacCroatian  
+  MacCyrillic  
+  MacFarsi  
+  MacGreek  
+  MacHebrew  
+  MacIcelandic  
+  MacRoman  
+  MacRomanian  
+  MacRumanian  
+  MacSami  
+  MacThai  
+  MacTurkish  
+  MacUkrainian  
+
+  # More vendor encodings
+  AdobeStandardEncoding
+  nextstep
+  gsm0338	# used in GSM handsets
+  hp-roman8
+
+=head1 DESCRIPTION
+
+To find how to use this module in detail, see L<Encode>.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/CJKConstants.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/CJKConstants.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/CJKConstants.pm	(revision 14489)
@@ -0,0 +1,66 @@
+#
+# $Id: CJKConstants.pm,v 2.0 2004/05/16 20:55:16 dankogai Exp $
+#
+
+package Encode::CJKConstants;
+
+use strict;
+
+our $RCSID = q$Id: CJKConstants.pm,v 2.0 2004/05/16 20:55:16 dankogai Exp $;
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use Carp;
+
+require Exporter;
+our @ISA         = qw(Exporter);
+our @EXPORT      = qw();
+our @EXPORT_OK   = qw(%CHARCODE %ESC %RE);
+our %EXPORT_TAGS = ( 'all' => [ @EXPORT_OK, @EXPORT ] );
+
+my %_0208 = (
+	       1978 => '\e\$\@',
+	       1983 => '\e\$B',
+	       1990 => '\e&\@\e\$B',
+		);
+
+our %CHARCODE = (
+	     UNDEF_EUC  =>     "\xa2\xae",  # ¢® in EUC
+	     UNDEF_SJIS =>     "\x81\xac",  # ¢® in SJIS
+	     UNDEF_JIS  =>     "\xa2\xf7",  # ¢÷ -- used in unicode
+	     UNDEF_UNICODE  => "\x20\x20",  # ¢÷ -- used in unicode
+	 );
+
+our %ESC =  (
+	 GB_2312  => "\e\$A",
+	 JIS_0208 => "\e\$B",
+	 JIS_0212 => "\e\$(D",
+	 KSC_5601 => "\e\$(C",
+	 ASC      => "\e\(B",
+	 KANA     => "\e\(I",
+	 '2022_KR' => "\e\$)C",
+	 );
+
+our %RE =
+    (
+     ASCII     => '[\x00-\x7f]',
+     BIN       => '[\x00-\x06\x7f\xff]',
+     EUC_0212  => '\x8f[\xa1-\xfe][\xa1-\xfe]',
+     EUC_C     => '[\xa1-\xfe][\xa1-\xfe]',
+     EUC_KANA  => '\x8e[\xa1-\xdf]',
+     JIS_0208  =>  "$_0208{1978}|$_0208{1983}|$_0208{1990}",
+     JIS_0212  => "\e" . '\$\(D',
+     ISO_ASC   => "\e" . '\([BJ]',     
+     JIS_KANA  => "\e" . '\(I',
+     '2022_KR' => "\e" . '\$\)C',
+     SJIS_C    => '[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]',
+     SJIS_KANA => '[\xa1-\xdf]',
+     UTF8      => '[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf][\x80-\xbf]'
+     );
+
+1;
+
+=head1 NAME
+
+Encode::CJKConstants.pm -- Internally used by Encode::??::ISO_2022_*
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/CN.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/CN.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/CN.pm	(revision 14489)
@@ -0,0 +1,76 @@
+package Encode::CN;
+BEGIN {
+    if (ord("A") == 193) {
+	die "Encode::CN not supported on EBCDIC\n";
+    }
+}
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use Encode;
+use XSLoader;
+XSLoader::load(__PACKAGE__,$VERSION);
+
+# Relocated from Encode.pm
+
+use Encode::CN::HZ;
+# use Encode::CN::2022_CN;
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::CN - China-based Chinese Encodings
+
+=head1 SYNOPSIS
+
+    use Encode qw/encode decode/; 
+    $euc_cn = encode("euc-cn", $utf8);   # loads Encode::CN implicitly
+    $utf8   = decode("euc-cn", $euc_cn); # ditto
+
+=head1 DESCRIPTION
+
+This module implements China-based Chinese charset encodings.
+Encodings supported are as follows.
+
+  Canonical   Alias		Description
+  --------------------------------------------------------------------
+  euc-cn      /\beuc.*cn$/i	EUC (Extended Unix Character)
+	      /\bcn.*euc$/i
+              /\bGB[-_ ]?2312(?:\D.*$|$)/i (see below)
+  gb2312-raw			The raw (low-bit) GB2312 character map
+  gb12345-raw			Traditional chinese counterpart to 
+				GB2312 (raw)
+  iso-ir-165			GB2312 + GB6345 + GB8565 + additions
+  MacChineseSimp                GB2312 + Apple Additions
+  cp936				Code Page 936, also known as GBK 
+				(Extended GuoBiao)
+  hz				7-bit escaped GB2312 encoding
+  --------------------------------------------------------------------
+
+To find how to use this module in detail, see L<Encode>.
+
+=head1 NOTES
+
+Due to size concerns, C<GB 18030> (an extension to C<GBK>) is distributed
+separately on CPAN, under the name L<Encode::HanExtra>. That module
+also contains extra Taiwan-based encodings.
+
+=head1 BUGS
+
+When you see C<charset=gb2312> on mails and web pages, they really
+mean C<euc-cn> encodings.  To fix that, C<gb2312> is aliased to C<euc-cn>.
+Use C<gb2312-raw> when you really mean it.
+
+The ASCII region (0x00-0x7f) is preserved for all encodings, even though
+this conflicts with mappings by the Unicode Consortium.  See
+
+L<http://www.debian.or.jp/~kubota/unicode-symbols.html.en>
+
+to find out why it is implemented that way.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/CN/HZ.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/CN/HZ.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/CN/HZ.pm	(revision 14489)
@@ -0,0 +1,196 @@
+package Encode::CN::HZ;
+
+use strict;
+
+use vars qw($VERSION);
+$VERSION = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use Encode qw(:fallbacks);
+
+use base qw(Encode::Encoding);
+__PACKAGE__->Define('hz');
+
+# HZ is a combination of ASCII and escaped GB, so we implement it
+# with the GB2312(raw) encoding here. Cf. RFCs 1842 & 1843.
+
+# not ported for EBCDIC.  Which should be used, "~" or "\x7E"?
+
+sub needs_lines  { 1 }
+
+sub decode ($$;$)
+{
+    my ($obj,$str,$chk) = @_;
+
+    my $GB = Encode::find_encoding('gb2312-raw');
+    my $ret = '';
+    my $in_ascii = 1; # default mode is ASCII.
+
+    while (length $str) {
+	if ($in_ascii) { # ASCII mode
+	    if ($str =~ s/^([\x00-\x7D\x7F]+)//) { # no '~' => ASCII
+		$ret .= $1;
+		# EBCDIC should need ascii2native, but not ported.
+	    }
+	    elsif ($str =~ s/^\x7E\x7E//) { # escaped tilde
+		$ret .= '~';
+	    }
+	    elsif ($str =~ s/^\x7E\cJ//) { # '\cJ' == LF in ASCII
+		1; # no-op
+	    }
+	    elsif ($str =~ s/^\x7E\x7B//) { # '~{'
+		$in_ascii = 0; # to GB
+	    }
+	    else { # encounters an invalid escape, \x80 or greater
+		last;
+	    }
+	}
+	else { # GB mode; the byte ranges are as in RFC 1843.
+	    if ($str =~ s/^((?:[\x21-\x77][\x21-\x7E])+)//) {
+		$ret .= $GB->decode($1, $chk);
+	    }
+	    elsif ($str =~ s/^\x7E\x7D//) { # '~}'
+		$in_ascii = 1;
+	    }
+	    else { # invalid
+		last;
+	    }
+	}
+    }
+    $_[1] = '' if $chk; # needs_lines guarantees no partial character
+    return $ret;
+}
+
+sub cat_decode {
+    my ($obj, undef, $src, $pos, $trm, $chk) = @_;
+    my ($rdst, $rsrc, $rpos) = \@_[1..3];
+
+    my $GB = Encode::find_encoding('gb2312-raw');
+    my $ret = '';
+    my $in_ascii = 1; # default mode is ASCII.
+
+    my $ini_pos = pos($$rsrc);
+
+    substr($src, 0, $pos) = '';
+
+    my $ini_len = bytes::length($src);
+
+    # $trm is the first of the pair '~~', then 2nd tilde is to be removed.
+    # XXX: Is better C<$src =~ s/^\x7E// or die if ...>?
+    $src =~ s/^\x7E// if $trm eq "\x7E";
+
+    while (length $src) {
+	my $now;
+	if ($in_ascii) { # ASCII mode
+	    if ($src =~ s/^([\x00-\x7D\x7F])//) { # no '~' => ASCII
+		$now = $1;
+	    }
+	    elsif ($src =~ s/^\x7E\x7E//) { # escaped tilde
+		$now = '~';
+	    }
+	    elsif ($src =~ s/^\x7E\cJ//) { # '\cJ' == LF in ASCII
+		next;
+	    }
+	    elsif ($src =~ s/^\x7E\x7B//) { # '~{'
+		$in_ascii = 0; # to GB
+		next;
+	    }
+	    else { # encounters an invalid escape, \x80 or greater
+		last;
+	    }
+	}
+	else { # GB mode; the byte ranges are as in RFC 1843.
+	    if ($src =~ s/^((?:[\x21-\x77][\x21-\x7F])+)//) {
+		$now = $GB->decode($1, $chk);
+	    }
+	    elsif ($src =~ s/^\x7E\x7D//) { # '~}'
+		$in_ascii = 1;
+		next;
+	    }
+	    else { # invalid
+		last;
+	    }
+	}
+
+	next if ! defined $now;
+
+	$ret .= $now;
+
+	if ($now eq $trm) {
+	    $$rdst .= $ret;
+	    $$rpos = $ini_pos + $pos + $ini_len - bytes::length($src);
+	    pos($$rsrc) = $ini_pos;
+	    return 1;
+	}
+    }
+
+    $$rdst .= $ret;
+    $$rpos = $ini_pos + $pos + $ini_len - bytes::length($src);
+    pos($$rsrc) = $ini_pos;
+    return ''; # terminator not found
+}
+
+
+sub encode($$;$)
+{
+    my ($obj,$str,$chk) = @_;
+
+    my $GB = Encode::find_encoding('gb2312-raw');
+    my $ret = '';
+    my $in_ascii = 1; # default mode is ASCII.
+
+    no warnings 'utf8'; # $str may be malformed UTF8 at the end of a chunk.
+
+    while (length $str) {
+	if ($str =~ s/^([[:ascii:]]+)//) {
+	    my $tmp = $1;
+	    $tmp =~ s/~/~~/g; # escapes tildes
+	    if (! $in_ascii) {
+		$ret .= "\x7E\x7D"; # '~}'
+		$in_ascii = 1;
+	    }
+	    $ret .= pack 'a*', $tmp; # remove UTF8 flag.
+	}
+	elsif ($str =~ s/(.)//) {
+	    my $s = $1;
+	    my $tmp = $GB->encode($s, $chk);
+	    last if !defined $tmp;
+	    if (length $tmp == 2) { # maybe a valid GB char (XXX)
+		if ($in_ascii) {
+		    $ret .= "\x7E\x7B"; # '~{'
+		    $in_ascii = 0;
+		}
+		$ret .= $tmp;
+	    }
+	    elsif (length $tmp) { # maybe FALLBACK in ASCII (XXX)
+		if (!$in_ascii) {
+		    $ret .= "\x7E\x7D"; # '~}'
+		    $in_ascii = 1;
+		}
+		$ret .= $tmp;
+	    }
+	}
+	else { # if $str is malformed UTF8 *and* if length $str != 0.
+	    last;
+	}
+    }
+    $_[1] = $str if $chk;
+
+  # The state at the end of the chunk is discarded, even if in GB mode.
+  # That results in the combination of GB-OUT and GB-IN, i.e. "~}~{".
+  # Parhaps it is harmless, but further investigations may be required...
+
+    if (! $in_ascii) {
+	$ret .= "\x7E\x7D"; # '~}'
+	$in_ascii = 1;
+    }
+    return $ret;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::CN::HZ -- internally used by Encode::CN
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Changes.e2x
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Changes.e2x	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Changes.e2x	(revision 14489)
@@ -0,0 +1,7 @@
+#
+# $Id: Changes.e2x,v 2.0 2004/05/16 20:55:15 dankogai Exp $
+# Revision history for Perl extension Encode::$_Name_.
+#
+
+0.01  $_Now_
+  Autogenerated by enc2xs version $_Version_.
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Config.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Config.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Config.pm	(revision 14489)
@@ -0,0 +1,166 @@
+#
+# Demand-load module list
+#
+package Encode::Config;
+our $VERSION = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use strict;
+
+our %ExtModule = 
+    (
+      # Encode::Byte
+      #iso-8859-1 is in Encode.pm itself
+     'iso-8859-2'             => 'Encode::Byte',
+     'iso-8859-3'             => 'Encode::Byte',
+     'iso-8859-4'             => 'Encode::Byte',
+     'iso-8859-5'             => 'Encode::Byte',
+     'iso-8859-6'             => 'Encode::Byte',
+     'iso-8859-7'             => 'Encode::Byte',
+     'iso-8859-8'             => 'Encode::Byte',
+     'iso-8859-9'             => 'Encode::Byte',
+     'iso-8859-10'            => 'Encode::Byte',
+     'iso-8859-11'            => 'Encode::Byte',
+     'iso-8859-13'            => 'Encode::Byte',
+     'iso-8859-14'            => 'Encode::Byte',
+     'iso-8859-15'            => 'Encode::Byte',
+     'iso-8859-16'            => 'Encode::Byte',
+     'koi8-f'                 => 'Encode::Byte',
+     'koi8-r'                 => 'Encode::Byte',
+     'koi8-u'                 => 'Encode::Byte',
+     'viscii'                 => 'Encode::Byte',
+     'cp424'                  => 'Encode::Byte',
+     'cp437'                  => 'Encode::Byte',
+     'cp737'                  => 'Encode::Byte',
+     'cp775'                  => 'Encode::Byte',
+     'cp850'                  => 'Encode::Byte',
+     'cp852'                  => 'Encode::Byte',
+     'cp855'                  => 'Encode::Byte',
+     'cp856'                  => 'Encode::Byte',
+     'cp857'                  => 'Encode::Byte',
+     'cp860'                  => 'Encode::Byte',
+     'cp861'                  => 'Encode::Byte',
+     'cp862'                  => 'Encode::Byte',
+     'cp863'                  => 'Encode::Byte',
+     'cp864'                  => 'Encode::Byte',
+     'cp865'                  => 'Encode::Byte',
+     'cp866'                  => 'Encode::Byte',
+     'cp869'                  => 'Encode::Byte',
+     'cp874'                  => 'Encode::Byte',
+     'cp1006'                 => 'Encode::Byte',
+     'cp1250'                 => 'Encode::Byte',
+     'cp1251'                 => 'Encode::Byte',
+     'cp1252'                 => 'Encode::Byte',
+     'cp1253'                 => 'Encode::Byte',
+     'cp1254'                 => 'Encode::Byte',
+     'cp1255'                 => 'Encode::Byte',
+     'cp1256'                 => 'Encode::Byte',
+     'cp1257'                 => 'Encode::Byte',
+     'cp1258'                 => 'Encode::Byte',
+     'AdobeStandardEncoding'  => 'Encode::Byte',
+     'MacArabic'              => 'Encode::Byte',
+     'MacCentralEurRoman'     => 'Encode::Byte',
+     'MacCroatian'            => 'Encode::Byte',
+     'MacCyrillic'            => 'Encode::Byte',
+     'MacFarsi'               => 'Encode::Byte',
+     'MacGreek'               => 'Encode::Byte',
+     'MacHebrew'              => 'Encode::Byte',
+     'MacIcelandic'           => 'Encode::Byte',
+     'MacRoman'               => 'Encode::Byte',
+     'MacRomanian'            => 'Encode::Byte',
+     'MacRumanian'            => 'Encode::Byte',
+     'MacSami'                => 'Encode::Byte',
+     'MacThai'                => 'Encode::Byte',
+     'MacTurkish'             => 'Encode::Byte',
+     'MacUkrainian'           => 'Encode::Byte',
+     'nextstep'               => 'Encode::Byte',
+     'hp-roman8'              => 'Encode::Byte',
+     'gsm0338'                => 'Encode::Byte',
+     # Encode::EBCDIC
+     'cp37'                   => 'Encode::EBCDIC',
+     'cp500'                  => 'Encode::EBCDIC',
+     'cp875'                  => 'Encode::EBCDIC',
+     'cp1026'                 => 'Encode::EBCDIC',
+     'cp1047'                 => 'Encode::EBCDIC',
+     'posix-bc'               => 'Encode::EBCDIC',
+     # Encode::Symbol
+     'dingbats'               => 'Encode::Symbol',
+     'symbol'                 => 'Encode::Symbol',
+     'AdobeSymbol'            => 'Encode::Symbol',
+     'AdobeZdingbat'          => 'Encode::Symbol',
+     'MacDingbats'            => 'Encode::Symbol',
+     'MacSymbol'              => 'Encode::Symbol',
+     # Encode::Unicode
+     'UCS-2BE'                => 'Encode::Unicode',
+     'UCS-2LE'                => 'Encode::Unicode',
+     'UTF-16'                 => 'Encode::Unicode',
+     'UTF-16BE'               => 'Encode::Unicode',
+     'UTF-16LE'               => 'Encode::Unicode',
+     'UTF-32'                 => 'Encode::Unicode',
+     'UTF-32BE'               => 'Encode::Unicode',
+     'UTF-32LE'               => 'Encode::Unicode',
+     'UTF-7'                  => 'Encode::Unicode::UTF7',
+    );
+
+unless (ord("A") == 193){
+    %ExtModule =
+	(
+	 %ExtModule,
+	 'euc-cn'             => 'Encode::CN',
+	 'gb12345-raw'        => 'Encode::CN',
+	 'gb2312-raw'         => 'Encode::CN',
+	 'hz'                 => 'Encode::CN',
+	 'iso-ir-165'         => 'Encode::CN',
+	 'cp936'              => 'Encode::CN',
+	 'MacChineseSimp'     => 'Encode::CN',
+
+	 '7bit-jis'           => 'Encode::JP',
+	 'euc-jp'             => 'Encode::JP',
+	 'iso-2022-jp'        => 'Encode::JP',
+	 'iso-2022-jp-1'      => 'Encode::JP',
+	 'jis0201-raw'        => 'Encode::JP',
+	 'jis0208-raw'        => 'Encode::JP',
+	 'jis0212-raw'        => 'Encode::JP',
+	 'cp932'              => 'Encode::JP',
+	 'MacJapanese'        => 'Encode::JP',
+	 'shiftjis'           => 'Encode::JP',
+
+
+	 'euc-kr'             => 'Encode::KR',
+	 'iso-2022-kr'        => 'Encode::KR',
+	 'johab'              => 'Encode::KR',
+	 'ksc5601-raw'        => 'Encode::KR',
+	 'cp949'              => 'Encode::KR',
+	 'MacKorean'          => 'Encode::KR',
+
+	 'big5-eten'          => 'Encode::TW',
+	 'big5-hkscs'         => 'Encode::TW',
+	 'cp950'              => 'Encode::TW',
+	 'MacChineseTrad'     => 'Encode::TW',
+
+	 #'big5plus'           => 'Encode::HanExtra',
+	 #'euc-tw'             => 'Encode::HanExtra',
+	 #'gb18030'            => 'Encode::HanExtra',
+
+	 'MIME-Header'        => 'Encode::MIME::Header',
+	 'MIME-B'             => 'Encode::MIME::Header',
+	 'MIME-Q'             => 'Encode::MIME::Header',
+
+	 'MIME-Header-ISO_2022_JP' => 'Encode::MIME::Header::ISO_2022_JP',
+	);
+}
+
+#
+# Why not export ? to keep ConfigLocal Happy!
+#
+while (my ($enc,$mod) = each %ExtModule){
+    $Encode::ExtModule{$enc} = $mod;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Config -- internally used by Encode
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/ConfigLocal_PM.e2x
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/ConfigLocal_PM.e2x	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/ConfigLocal_PM.e2x	(revision 14489)
@@ -0,0 +1,13 @@
+#
+# Local demand-load module list
+#
+# You should not edit this file by hand!  use "enc2xs -C"
+# 
+package Encode::ConfigLocal;
+our $VERSION = $_LocalVer_;
+
+use strict;
+
+$_ModLines_
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/EBCDIC.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/EBCDIC.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/EBCDIC.pm	(revision 14489)
@@ -0,0 +1,43 @@
+package Encode::EBCDIC;
+use Encode;
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use XSLoader;
+XSLoader::load(__PACKAGE__,$VERSION);
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::EBCDIC - EBCDIC Encodings
+
+=head1 SYNOPSIS
+
+    use Encode qw/encode decode/; 
+    $posix_bc  = encode("posix-bc", $utf8); # loads Encode::EBCDIC implicitly
+    $utf8 = decode("", $posix_bc);          # ditto
+
+=head1 ABSTRACT
+
+This module implements various EBCDIC-Based encodings.  Encodings
+supported are as follows.   
+
+  Canonical   Alias		Description
+  --------------------------------------------------------------------
+  cp37  
+  cp500  
+  cp875  
+  cp1026  
+  cp1047  
+  posix-bc
+
+=head1 DESCRIPTION
+
+To find how to use this module in detail, see L<Encode>.
+
+=head1 SEE ALSO
+
+L<Encode>, L<perlebcdic>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Encoder.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Encoder.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Encoder.pm	(revision 14489)
@@ -0,0 +1,249 @@
+#
+# $Id: Encoder.pm,v 2.0 2004/05/16 20:55:17 dankogai Exp $
+#
+package Encode::Encoder;
+use strict;
+use warnings;
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d"  x $#r, @r };
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw ( encoder );
+
+our $AUTOLOAD;
+sub DEBUG () { 0 }
+use Encode qw(encode decode find_encoding from_to);
+use Carp;
+
+sub new{
+    my ($class, $data, $encname) = @_;
+    unless($encname){
+	$encname = Encode::is_utf8($data) ? 'utf8' : '';
+    }else{
+	my $obj = find_encoding($encname) 
+	    or croak __PACKAGE__, ": unknown encoding: $encname";
+	$encname = $obj->name;
+    }
+    my $self = {
+		data     => $data,
+		encoding => $encname,
+	       };
+    bless $self => $class;
+}
+
+sub encoder{ __PACKAGE__->new(@_) }
+
+sub data{
+    my ($self, $data) = @_;
+    if (defined $data){
+	$self->{data} = $data;
+	return $data;
+    }else{
+	return $self->{data};
+    }
+}
+
+sub encoding{
+    my ($self, $encname) = @_;
+    if ($encname){
+	my $obj = find_encoding($encname) 
+	    or confess __PACKAGE__, ": unknown encoding: $encname";
+	$self->{encoding} = $obj->name;
+	return $self;
+    }else{
+	return $self->{encoding}
+    }
+}
+
+sub bytes {
+    my ($self, $encname) = @_;
+    $encname ||= $self->{encoding};
+    my $obj = find_encoding($encname) 
+	    or confess __PACKAGE__, ": unknown encoding: $encname";
+    $self->{data} = $obj->decode($self->{data}, 1);
+    $self->{encoding} = '' ;
+    return $self;
+}
+
+sub DESTROY{ # defined so it won't autoload.
+    DEBUG and warn shift;
+}
+
+sub AUTOLOAD {
+    my $self = shift;
+    my $type = ref($self)
+	or confess "$self is not an object";
+    my $myname = $AUTOLOAD;
+    $myname =~ s/.*://;   # strip fully-qualified portion
+    my $obj = find_encoding($myname) 
+	    or confess __PACKAGE__, ": unknown encoding: $myname";
+    DEBUG and warn $self->{encoding}, " => ", $obj->name;
+    if ($self->{encoding}){
+	from_to($self->{data}, $self->{encoding}, $obj->name, 1);
+    }else{
+	$self->{data} = $obj->encode($self->{data}, 1);
+    }
+    $self->{encoding} = $obj->name;
+    return $self;
+}
+
+use overload 
+    q("") => sub { $_[0]->{data} },
+    q(0+) => sub { use bytes (); bytes::length($_[0]->{data}) },
+    fallback => 1,
+    ;
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Encoder -- Object Oriented Encoder
+
+=head1 SYNOPSIS
+
+  use Encode::Encoder;
+  # Encode::encode("ISO-8859-1", $data); 
+  Encode::Encoder->new($data)->iso_8859_1; # OOP way
+  # shortcut
+  use Encode::Encoder qw(encoder);
+  encoder($data)->iso_8859_1;
+  # you can stack them!
+  encoder($data)->iso_8859_1->base64;  # provided base64() is defined
+  # you can use it as a decoder as well
+  encoder($base64)->bytes('base64')->latin1;
+  # stringified
+  print encoder($data)->utf8->latin1;  # prints the string in latin1
+  # numified
+  encoder("\x{abcd}\x{ef}g")->utf8 == 6; # true. bytes::length($data)
+
+=head1 ABSTRACT
+
+B<Encode::Encoder> allows you to use Encode in an object-oriented
+style.  This is not only more intuitive than a functional approach,
+but also handier when you want to stack encodings.  Suppose you want
+your UTF-8 string converted to Latin1 then Base64: you can simply say
+
+  my $base64 = encoder($utf8)->latin1->base64;
+
+instead of
+
+  my $latin1 = encode("latin1", $utf8);
+  my $base64 = encode_base64($utf8);
+
+or the lazier and more convoluted
+
+  my $base64 = encode_base64(encode("latin1", $utf8));
+
+=head1 Description
+
+Here is how to use this module.
+
+=over 4
+
+=item *
+
+There are at least two instance variables stored in a hash reference,
+{data} and {encoding}.
+
+=item *
+
+When there is no method, it takes the method name as the name of the
+encoding and encodes the instance I<data> with I<encoding>.  If successful,
+the instance I<encoding> is set accordingly.
+
+=item *
+
+You can retrieve the result via -E<gt>data but usually you don't have to 
+because the stringify operator ("") is overridden to do exactly that.
+
+=back
+
+=head2 Predefined Methods
+
+This module predefines the methods below:
+
+=over 4
+
+=item $e = Encode::Encoder-E<gt>new([$data, $encoding]);
+
+returns an encoder object.  Its data is initialized with $data if
+present, and its encoding is set to $encoding if present.
+
+When $encoding is omitted, it defaults to utf8 if $data is already in
+utf8 or "" (empty string) otherwise.
+
+=item encoder()
+
+is an alias of Encode::Encoder-E<gt>new().  This one is exported on demand.
+
+=item $e-E<gt>data([$data])
+
+When $data is present, sets the instance data to $data and returns the
+object itself.  Otherwise, the current instance data is returned.
+
+=item $e-E<gt>encoding([$encoding])
+
+When $encoding is present, sets the instance encoding to $encoding and
+returns the object itself.  Otherwise, the current instance encoding is
+returned.
+
+=item $e-E<gt>bytes([$encoding])
+
+decodes instance data from $encoding, or the instance encoding if
+omitted.  If the conversion is successful, the instance encoding
+will be set to "".
+
+The name I<bytes> was deliberately picked to avoid namespace tainting
+-- this module may be used as a base class so method names that appear
+in Encode::Encoding are avoided.
+
+=back
+
+=head2 Example: base64 transcoder
+
+This module is designed to work with L<Encode::Encoding>.
+To make the Base64 transcoder example above really work, you could
+write a module like this:
+
+  package Encode::Base64;
+  use base 'Encode::Encoding';
+  __PACKAGE__->Define('base64');
+  use MIME::Base64;
+  sub encode{ 
+      my ($obj, $data) = @_; 
+      return encode_base64($data);
+  }
+  sub decode{
+      my ($obj, $data) = @_; 
+      return decode_base64($data);
+  }
+  1;
+  __END__
+
+And your caller module would be something like this:
+
+  use Encode::Encoder;
+  use Encode::Base64;
+
+  # now you can really do the following
+
+  encoder($data)->iso_8859_1->base64;
+  encoder($base64)->bytes('base64')->latin1;
+
+=head2 Operator Overloading
+
+This module overloads two operators, stringify ("") and numify (0+).
+
+Stringify dumps the data inside the object.
+
+Numify returns the number of bytes in the instance data.
+
+They come in handy when you want to print or find the size of data.
+
+=head1 SEE ALSO
+
+L<Encode>,
+L<Encode::Encoding>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Encoding.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Encoding.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Encoding.pm	(revision 14489)
@@ -0,0 +1,341 @@
+package Encode::Encoding;
+# Base class for classes which implement encodings
+use strict;
+our $VERSION = do { my @r = (q$Revision: 2.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+require Encode;
+
+sub DEBUG { 0 }
+sub Define
+{
+    my $obj = shift;
+    my $canonical = shift;
+    $obj = bless { Name => $canonical },$obj unless ref $obj;
+    # warn "$canonical => $obj\n";
+    Encode::define_encoding($obj, $canonical, @_);
+}
+
+sub name  { return shift->{'Name'} }
+
+# sub renew { return $_[0] }
+
+sub renew {
+    my $self = shift;
+    my $clone = bless { %$self } => ref($self);
+    $clone->{renewed}++; # so the caller can see it
+    DEBUG and warn $clone->{renewed};
+    return $clone;
+}
+
+sub renewed{ return $_[0]->{renewed} || 0 }
+
+*new_sequence = \&renew;
+
+sub needs_lines { 0 };
+
+sub perlio_ok { 
+    eval{ require PerlIO::encoding };
+    return $@ ? 0 : 1;
+}
+
+# (Temporary|legacy) methods
+
+sub toUnicode    { shift->decode(@_) }
+sub fromUnicode  { shift->encode(@_) }
+
+#
+# Needs to be overloaded or just croak
+#
+
+sub encode {
+    require Carp;
+    my $obj = shift;
+    my $class = ref($obj) ? ref($obj) : $obj;
+    Carp::croak($class . "->encode() not defined!");
+}
+
+sub decode{
+    require Carp;
+    my $obj = shift;
+    my $class = ref($obj) ? ref($obj) : $obj;
+    Carp::croak($class . "->encode() not defined!");
+}
+
+sub DESTROY {}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Encoding - Encode Implementation Base Class
+
+=head1 SYNOPSIS
+
+  package Encode::MyEncoding;
+  use base qw(Encode::Encoding);
+
+  __PACKAGE__->Define(qw(myCanonical myAlias));
+
+=head1 DESCRIPTION
+
+As mentioned in L<Encode>, encodings are (in the current
+implementation at least) defined as objects. The mapping of encoding
+name to object is via the C<%Encode::Encoding> hash.  Though you can
+directly manipulate this hash, it is strongly encouraged to use this
+base class module and add encode() and decode() methods.
+
+=head2 Methods you should implement
+
+You are strongly encouraged to implement methods below, at least
+either encode() or decode().
+
+=over 4
+
+=item -E<gt>encode($string [,$check])
+
+MUST return the octet sequence representing I<$string>. 
+
+=over 2
+
+=item *
+
+If I<$check> is true, it SHOULD modify I<$string> in place to remove
+the converted part (i.e.  the whole string unless there is an error).
+If perlio_ok() is true, SHOULD becomes MUST.
+
+=item *
+
+If an error occurs, it SHOULD return the octet sequence for the
+fragment of string that has been converted and modify $string in-place
+to remove the converted part leaving it starting with the problem
+fragment.  If perlio_ok() is true, SHOULD becomes MUST.
+
+=item *
+
+If I<$check> is is false then C<encode> MUST  make a "best effort" to
+convert the string - for example, by using a replacement character.
+
+=back
+
+=item -E<gt>decode($octets [,$check])
+
+MUST return the string that I<$octets> represents. 
+
+=over 2
+
+=item *
+
+If I<$check> is true, it SHOULD modify I<$octets> in place to remove
+the converted part (i.e.  the whole sequence unless there is an
+error).  If perlio_ok() is true, SHOULD becomes MUST.
+
+=item *
+
+If an error occurs, it SHOULD return the fragment of string that has
+been converted and modify $octets in-place to remove the converted
+part leaving it starting with the problem fragment.  If perlio_ok() is
+true, SHOULD becomes MUST.
+
+=item *
+
+If I<$check> is false then C<decode> should make a "best effort" to
+convert the string - for example by using Unicode's "\x{FFFD}" as a
+replacement character.
+
+=back
+
+=back
+
+If you want your encoding to work with L<encoding> pragma, you should
+also implement the method below.
+
+=over 4
+
+=item -E<gt>cat_decode($destination, $octets, $offset, $terminator [,$check])
+
+MUST decode I<$octets> with I<$offset> and concatenate it to I<$destination>.
+Decoding will terminate when $terminator (a string) appears in output.
+I<$offset> will be modified to the last $octets position at end of decode.
+Returns true if $terminator appears output, else returns false.
+
+=back
+
+=head2 Other methods defined in Encode::Encodings
+
+You do not have to override methods shown below unless you have to.
+
+=over 4
+
+=item -E<gt>name
+
+Predefined As:
+
+  sub name  { return shift->{'Name'} }
+
+MUST return the string representing the canonical name of the encoding.
+
+=item -E<gt>renew
+
+Predefined As:
+
+  sub renew {
+    my $self = shift;
+    my $clone = bless { %$self } => ref($self);
+    $clone->{renewed}++;
+    return $clone;
+  }
+
+This method reconstructs the encoding object if necessary.  If you need
+to store the state during encoding, this is where you clone your object.
+
+PerlIO ALWAYS calls this method to make sure it has its own private
+encoding object.
+
+=item -E<gt>renewed
+
+Predefined As:
+
+  sub renewed { $_[0]->{renewed} || 0 }
+
+Tells whether the object is renewed (and how many times).  Some
+modules emit C<Use of uninitialized value in null operation> warning
+unless the value is numeric so return 0 for false.
+
+=item -E<gt>perlio_ok()
+
+Predefined As:
+
+  sub perlio_ok { 
+      eval{ require PerlIO::encoding };
+      return $@ ? 0 : 1;
+  }
+
+If your encoding does not support PerlIO for some reasons, just;
+
+ sub perlio_ok { 0 }
+
+=item -E<gt>needs_lines()
+
+Predefined As:
+
+  sub needs_lines { 0 };
+
+If your encoding can work with PerlIO but needs line buffering, you
+MUST define this method so it returns true.  7bit ISO-2022 encodings
+are one example that needs this.  When this method is missing, false
+is assumed.
+
+=back
+
+=head2 Example: Encode::ROT13
+
+  package Encode::ROT13;
+  use strict;
+  use base qw(Encode::Encoding);
+
+  __PACKAGE__->Define('rot13');
+
+  sub encode($$;$){
+      my ($obj, $str, $chk) = @_;
+      $str =~ tr/A-Za-z/N-ZA-Mn-za-m/;
+      $_[1] = '' if $chk; # this is what in-place edit means
+      return $str;
+  }
+
+  # Jr pna or ynml yvxr guvf;
+  *decode = \&encode;
+
+  1;
+
+=head1 Why the heck Encode API is different?
+
+It should be noted that the I<$check> behaviour is different from the
+outer public API. The logic is that the "unchecked" case is useful
+when the encoding is part of a stream which may be reporting errors
+(e.g. STDERR).  In such cases, it is desirable to get everything
+through somehow without causing additional errors which obscure the
+original one. Also, the encoding is best placed to know what the
+correct replacement character is, so if that is the desired behaviour
+then letting low level code do it is the most efficient.
+
+By contrast, if I<$check> is true, the scheme above allows the
+encoding to do as much as it can and tell the layer above how much
+that was. What is lacking at present is a mechanism to report what
+went wrong. The most likely interface will be an additional method
+call to the object, or perhaps (to avoid forcing per-stream objects
+on otherwise stateless encodings) an additional parameter.
+
+It is also highly desirable that encoding classes inherit from
+C<Encode::Encoding> as a base class. This allows that class to define
+additional behaviour for all encoding objects.
+
+  package Encode::MyEncoding;
+  use base qw(Encode::Encoding);
+
+  __PACKAGE__->Define(qw(myCanonical myAlias));
+
+to create an object with C<< bless {Name => ...}, $class >>, and call
+define_encoding.  They inherit their C<name> method from
+C<Encode::Encoding>.
+
+=head2 Compiled Encodings
+
+For the sake of speed and efficiency, most of the encodings are now
+supported via a I<compiled form>: XS modules generated from UCM
+files.   Encode provides the enc2xs tool to achieve that.  Please see
+L<enc2xs> for more details.
+
+=head1 SEE ALSO
+
+L<perlmod>, L<enc2xs>
+
+=begin future
+
+=over 4
+
+=item Scheme 1
+
+The fixup routine gets passed the remaining fragment of string being
+processed.  It modifies it in place to remove bytes/characters it can
+understand and returns a string used to represent them.  For example:
+
+ sub fixup {
+   my $ch = substr($_[0],0,1,'');
+   return sprintf("\x{%02X}",ord($ch);
+ }
+
+This scheme is close to how the underlying C code for Encode works,
+but gives the fixup routine very little context.
+
+=item Scheme 2
+
+The fixup routine gets passed the original string, an index into
+it of the problem area, and the output string so far.  It appends
+what it wants to the output string and returns a new index into the
+original string.  For example:
+
+ sub fixup {
+   # my ($s,$i,$d) = @_;
+   my $ch = substr($_[0],$_[1],1);
+   $_[2] .= sprintf("\x{%02X}",ord($ch);
+   return $_[1]+1;
+ }
+
+This scheme gives maximal control to the fixup routine but is more
+complicated to code, and may require that the internals of Encode be tweaked to
+keep the original string intact.
+
+=item Other Schemes
+
+Hybrids of the above.
+
+Multiple return values rather than in-place modifications.
+
+Index into the string could be C<pos($str)> allowing C<s/\G...//>.
+
+=back
+
+=end future
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Guess.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Guess.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Guess.pm	(revision 14489)
@@ -0,0 +1,351 @@
+package Encode::Guess;
+use strict;
+
+use Encode qw(:fallbacks find_encoding);
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+my $Canon = 'Guess';
+sub DEBUG () { 0 }
+our %DEF_SUSPECTS = map { $_ => find_encoding($_) } qw(ascii utf8);
+$Encode::Encoding{$Canon} = 
+    bless { 
+	   Name       => $Canon,
+	   Suspects => { %DEF_SUSPECTS },
+	  } => __PACKAGE__;
+
+use base qw(Encode::Encoding);
+sub needs_lines { 1 }
+sub perlio_ok { 0 }
+
+our @EXPORT = qw(guess_encoding);
+our $NoUTFAutoGuess = 0;
+our $UTF8_BOM = pack("C3", 0xef, 0xbb, 0xbf);
+
+sub import { # Exporter not used so we do it on our own
+    my $callpkg = caller;
+    for my $item (@EXPORT){
+	no strict 'refs';
+	*{"$callpkg\::$item"} = \&{"$item"};
+    }
+    set_suspects(@_);
+}
+
+sub set_suspects{
+    my $class = shift;
+    my $self = ref($class) ? $class : $Encode::Encoding{$Canon};
+    $self->{Suspects} = { %DEF_SUSPECTS };
+    $self->add_suspects(@_);
+}
+
+sub add_suspects{
+    my $class = shift;
+    my $self = ref($class) ? $class : $Encode::Encoding{$Canon};
+    for my $c (@_){
+	my $e = find_encoding($c) or die "Unknown encoding: $c";
+	$self->{Suspects}{$e->name} = $e;
+	DEBUG and warn "Added: ", $e->name;
+    }
+}
+
+sub decode($$;$){
+    my ($obj, $octet, $chk) = @_;
+    my $guessed = guess($obj, $octet);
+    unless (ref($guessed)){
+	require Carp;
+	Carp::croak($guessed);
+    }
+    my $utf8 = $guessed->decode($octet, $chk);
+    $_[1] = $octet if $chk;
+    return $utf8;
+}
+
+sub guess_encoding{
+    guess($Encode::Encoding{$Canon}, @_);
+}
+
+sub guess {
+    my $class = shift;
+    my $obj   = ref($class) ? $class : $Encode::Encoding{$Canon};
+    my $octet = shift;
+
+    # sanity check
+    return unless defined $octet and length $octet;
+
+    # cheat 0: utf8 flag;
+    if ( Encode::is_utf8($octet) ) {
+	return find_encoding('utf8') unless $NoUTFAutoGuess;
+	Encode::_utf8_off($octet);
+    }
+    # cheat 1: BOM
+    use Encode::Unicode;
+    unless ($NoUTFAutoGuess) {
+	my $BOM = pack('C3', unpack("C3", $octet));
+	return find_encoding('utf8')
+	    if (defined $BOM and $BOM eq $UTF8_BOM);
+	$BOM = unpack('N', $octet);
+	return find_encoding('UTF-32')
+	    if (defined $BOM and ($BOM == 0xFeFF or $BOM == 0xFFFe0000));
+	$BOM = unpack('n', $octet);
+	return find_encoding('UTF-16')
+	    if (defined $BOM and ($BOM == 0xFeFF or $BOM == 0xFFFe));
+	if ($octet =~ /\x00/o){ # if \x00 found, we assume UTF-(16|32)(BE|LE)
+	    my $utf;
+	    my ($be, $le) = (0, 0);
+	    if ($octet =~ /\x00\x00/o){ # UTF-32(BE|LE) assumed
+		$utf = "UTF-32";
+		for my $char (unpack('N*', $octet)){
+		    $char & 0x0000ffff and $be++;
+		    $char & 0xffff0000 and $le++;
+		}
+	    }else{ # UTF-16(BE|LE) assumed
+		$utf = "UTF-16";
+		for my $char (unpack('n*', $octet)){
+		    $char & 0x00ff and $be++;
+		    $char & 0xff00 and $le++;
+		}
+	    }
+	    DEBUG and warn "$utf, be == $be, le == $le";
+	    $be == $le 
+		and return
+		    "Encodings ambiguous between $utf BE and LE ($be, $le)";
+	    $utf .= ($be > $le) ? 'BE' : 'LE';
+	    return find_encoding($utf);
+	}
+    }
+    my %try =  %{$obj->{Suspects}};
+    for my $c (@_){
+	my $e = find_encoding($c) or die "Unknown encoding: $c";
+	$try{$e->name} = $e;
+	DEBUG and warn "Added: ", $e->name;
+    }
+    my $nline = 1;
+    for my $line (split /\r\n?|\n/, $octet){
+	# cheat 2 -- \e in the string
+	if ($line =~ /\e/o){
+	    my @keys = keys %try;
+	    delete @try{qw/utf8 ascii/};
+	    for my $k (@keys){
+		ref($try{$k}) eq 'Encode::XS' and delete $try{$k};
+	    }
+	}
+	my %ok = %try;
+	# warn join(",", keys %try);
+	for my $k (keys %try){
+	    my $scratch = $line;
+	    $try{$k}->decode($scratch, FB_QUIET);
+	    if ($scratch eq ''){
+		DEBUG and warn sprintf("%4d:%-24s ok\n", $nline, $k);
+	    }else{
+		use bytes ();
+		DEBUG and 
+		    warn sprintf("%4d:%-24s not ok; %d bytes left\n", 
+				 $nline, $k, bytes::length($scratch));
+		delete $ok{$k};
+	    }
+	}
+	%ok or return "No appropriate encodings found!";
+	if (scalar(keys(%ok)) == 1){
+	    my ($retval) = values(%ok);
+	    return $retval;
+	}
+	%try = %ok; $nline++;
+    }
+    $try{ascii} or 
+	return  "Encodings too ambiguous: ", join(" or ", keys %try);
+    return $try{ascii};
+}
+
+
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Guess -- Guesses encoding from data
+
+=head1 SYNOPSIS
+
+  # if you are sure $data won't contain anything bogus
+
+  use Encode;
+  use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
+  my $utf8 = decode("Guess", $data);
+  my $data = encode("Guess", $utf8);   # this doesn't work!
+
+  # more elaborate way
+  use Encode::Guess;
+  my $enc = guess_encoding($data, qw/euc-jp shiftjis 7bit-jis/);
+  ref($enc) or die "Can't guess: $enc"; # trap error this way
+  $utf8 = $enc->decode($data);
+  # or
+  $utf8 = decode($enc->name, $data)
+
+=head1 ABSTRACT
+
+Encode::Guess enables you to guess in what encoding a given data is
+encoded, or at least tries to.  
+
+=head1 DESCRIPTION
+
+By default, it checks only ascii, utf8 and UTF-16/32 with BOM.
+
+  use Encode::Guess; # ascii/utf8/BOMed UTF
+
+To use it more practically, you have to give the names of encodings to
+check (I<suspects> as follows).  The name of suspects can either be
+canonical names or aliases.
+
+CAVEAT: Unlike UTF-(16|32), BOM in utf8 is NOT AUTOMATICALLY STRIPPED.
+
+ # tries all major Japanese Encodings as well
+  use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
+
+If the C<$Encode::Guess::NoUTFAutoGuess> variable is set to a true
+value, no heuristics will be applied to UTF8/16/32, and the result
+will be limited to the suspects and C<ascii>.
+
+=over 4
+
+=item Encode::Guess->set_suspects
+
+You can also change the internal suspects list via C<set_suspects>
+method. 
+
+  use Encode::Guess;
+  Encode::Guess->set_suspects(qw/euc-jp shiftjis 7bit-jis/);
+
+=item Encode::Guess->add_suspects
+
+Or you can use C<add_suspects> method.  The difference is that
+C<set_suspects> flushes the current suspects list while
+C<add_suspects> adds.
+
+  use Encode::Guess;
+  Encode::Guess->add_suspects(qw/euc-jp shiftjis 7bit-jis/);
+  # now the suspects are euc-jp,shiftjis,7bit-jis, AND
+  # euc-kr,euc-cn, and big5-eten
+  Encode::Guess->add_suspects(qw/euc-kr euc-cn big5-eten/);
+
+=item Encode::decode("Guess" ...)
+
+When you are content with suspects list, you can now
+
+  my $utf8 = Encode::decode("Guess", $data);
+
+=item Encode::Guess->guess($data)
+
+But it will croak if:
+
+=over
+
+=item *
+
+Two or more suspects remain
+
+=item *
+
+No suspects left
+
+=back
+
+So you should instead try this;
+
+  my $decoder = Encode::Guess->guess($data);
+
+On success, $decoder is an object that is documented in
+L<Encode::Encoding>.  So you can now do this;
+
+  my $utf8 = $decoder->decode($data);
+
+On failure, $decoder now contains an error message so the whole thing
+would be as follows;
+
+  my $decoder = Encode::Guess->guess($data);
+  die $decoder unless ref($decoder);
+  my $utf8 = $decoder->decode($data);
+
+=item guess_encoding($data, [, I<list of suspects>])
+
+You can also try C<guess_encoding> function which is exported by
+default.  It takes $data to check and it also takes the list of
+suspects by option.  The optional suspect list is I<not reflected> to
+the internal suspects list.
+
+  my $decoder = guess_encoding($data, qw/euc-jp euc-kr euc-cn/);
+  die $decoder unless ref($decoder);
+  my $utf8 = $decoder->decode($data);
+  # check only ascii and utf8
+  my $decoder = guess_encoding($data);
+
+=back
+
+=head1 CAVEATS
+
+=over 4
+
+=item *
+
+Because of the algorithm used, ISO-8859 series and other single-byte
+encodings do not work well unless either one of ISO-8859 is the only
+one suspect (besides ascii and utf8).
+
+  use Encode::Guess;
+  # perhaps ok
+  my $decoder = guess_encoding($data, 'latin1');
+  # definitely NOT ok
+  my $decoder = guess_encoding($data, qw/latin1 greek/);
+
+The reason is that Encode::Guess guesses encoding by trial and error.
+It first splits $data into lines and tries to decode the line for each
+suspect.  It keeps it going until all but one encoding is eliminated
+out of suspects list.  ISO-8859 series is just too successful for most
+cases (because it fills almost all code points in \x00-\xff).
+
+=item *
+
+Do not mix national standard encodings and the corresponding vendor
+encodings.
+
+  # a very bad idea
+  my $decoder
+     = guess_encoding($data, qw/shiftjis MacJapanese cp932/);
+
+The reason is that vendor encoding is usually a superset of national
+standard so it becomes too ambiguous for most cases.
+
+=item *
+
+On the other hand, mixing various national standard encodings
+automagically works unless $data is too short to allow for guessing.
+
+ # This is ok if $data is long enough
+ my $decoder =  
+  guess_encoding($data, qw/euc-cn
+                           euc-jp shiftjis 7bit-jis
+                           euc-kr
+                           big5-eten/);
+
+=item *
+
+DO NOT PUT TOO MANY SUSPECTS!  Don't you try something like this!
+
+  my $decoder = guess_encoding($data, 
+                               Encode->encodings(":all"));
+
+=back
+
+It is, after all, just a guess.  You should alway be explicit when it
+comes to encodings.  But there are some, especially Japanese,
+environment that guess-coding is a must.  Use this module with care. 
+
+=head1 TO DO
+
+Encode::Guess does not work on EBCDIC platforms.
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::Encoding>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/JP.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/JP.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/JP.pm	(revision 14489)
@@ -0,0 +1,97 @@
+package Encode::JP;
+BEGIN {
+    if (ord("A") == 193) {
+	die "Encode::JP not supported on EBCDIC\n";
+    }
+}
+use Encode;
+our $VERSION = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use XSLoader;
+XSLoader::load(__PACKAGE__,$VERSION);
+
+use Encode::JP::JIS7;
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::JP - Japanese Encodings
+
+=head1 SYNOPSIS
+
+    use Encode qw/encode decode/; 
+    $euc_jp = encode("euc-jp", $utf8);   # loads Encode::JP implicitly
+    $utf8   = decode("euc-jp", $euc_jp); # ditto
+
+=head1 ABSTRACT
+
+This module implements Japanese charset encodings.  Encodings
+supported are as follows.
+
+  Canonical   Alias		Description
+  --------------------------------------------------------------------
+  euc-jp      /\beuc.*jp$/i	EUC (Extended Unix Character)
+              /\bjp.*euc/i   
+	      /\bujis$/i
+  shiftjis    /\bshift.*jis$/i	Shift JIS (aka MS Kanji)
+	      /\bsjis$/i
+  7bit-jis    /\bjis$/i		7bit JIS
+  iso-2022-jp			ISO-2022-JP                  [RFC1468]
+				= 7bit JIS with all Halfwidth Kana 
+				  converted to Fullwidth
+  iso-2022-jp-1			ISO-2022-JP-1                [RFC2237]
+                                = ISO-2022-JP with JIS X 0212-1990
+				  support.  See below
+  MacJapanese	                Shift JIS + Apple vendor mappings
+  cp932       /\bwindows-31j$/i Code Page 932
+                                = Shift JIS + MS/IBM vendor mappings
+  jis0201-raw                   JIS0201, raw format
+  jis0208-raw                   JIS0201, raw format
+  jis0212-raw                   JIS0201, raw format
+  --------------------------------------------------------------------
+
+=head1 DESCRIPTION
+
+To find out how to use this module in detail, see L<Encode>.
+
+=head1 Note on ISO-2022-JP(-1)?
+
+ISO-2022-JP-1 (RFC2237) is a superset of ISO-2022-JP (RFC1468) which
+adds support for JIS X 0212-1990.  That means you can use the same
+code to decode to utf8 but not vice versa.
+
+  $utf8 = decode('iso-2022-jp-1', $stream);
+
+and
+
+  $utf8 = decode('iso-2022-jp',   $stream);
+
+yield the same result but
+
+  $with_0212 = encode('iso-2022-jp-1', $utf8);
+
+is now different from
+
+  $without_0212 = encode('iso-2022-jp', $utf8 );
+
+In the latter case, characters that map to 0212 are first converted
+to U+3013 (0xA2AE in EUC-JP; a white square also known as 'Tofu' or
+'geta mark') then fed to the decoding engine.  U+FFFD is not used,
+in order to preserve text layout as much as possible.
+
+=head1 BUGS
+
+The ASCII region (0x00-0x7f) is preserved for all encodings, even
+though this conflicts with mappings by the Unicode Consortium.  See
+
+L<http://www.debian.or.jp/~kubota/unicode-symbols.html.en>
+
+to find out why it is implemented that way.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/JP/H2Z.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/JP/H2Z.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/JP/H2Z.pm	(revision 14489)
@@ -0,0 +1,174 @@
+#
+# $Id: H2Z.pm,v 2.0 2004/05/16 20:55:17 dankogai Exp $
+#
+
+package Encode::JP::H2Z;
+
+use strict;
+
+our $RCSID = q$Id: H2Z.pm,v 2.0 2004/05/16 20:55:17 dankogai Exp $;
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use Encode::CJKConstants qw(:all);
+
+use vars qw(%_D2Z  $_PAT_D2Z
+	    %_Z2D  $_PAT_Z2D
+	    %_H2Z  $_PAT_H2Z
+	    %_Z2H  $_PAT_Z2H);
+
+%_H2Z = (
+	 "\x8e\xa1"	=>	"\xa1\xa3",	#¡£
+	 "\x8e\xa2"	=>	"\xa1\xd6",	#¡Ö
+	 "\x8e\xa3"	=>	"\xa1\xd7",	#¡×
+	 "\x8e\xa4"	=>	"\xa1\xa2",	#¡¢
+	 "\x8e\xa5"	=>	"\xa1\xa6",	#¡Š
+	 "\x8e\xa6"	=>	"\xa5\xf2",	#¥ò
+	 "\x8e\xa7"	=>	"\xa5\xa1",	#¥¡
+	 "\x8e\xa8"	=>	"\xa5\xa3",	#¥£
+	 "\x8e\xa9"	=>	"\xa5\xa5",	#¥¥
+	 "\x8e\xaa"	=>	"\xa5\xa7",	#¥§
+	 "\x8e\xab"	=>	"\xa5\xa9",	#¥©
+	 "\x8e\xac"	=>	"\xa5\xe3",	#¥ã
+	 "\x8e\xad"	=>	"\xa5\xe5",	#¥å
+	 "\x8e\xae"	=>	"\xa5\xe7",	#¥ç
+	 "\x8e\xaf"	=>	"\xa5\xc3",	#¥Ã
+	 "\x8e\xb0"	=>	"\xa1\xbc",	#¡Œ
+	 "\x8e\xb1"	=>	"\xa5\xa2",	#¥¢
+	 "\x8e\xb2"	=>	"\xa5\xa4",	#¥€
+	 "\x8e\xb3"	=>	"\xa5\xa6",	#¥Š
+	 "\x8e\xb4"	=>	"\xa5\xa8",	#¥š
+	 "\x8e\xb5"	=>	"\xa5\xaa",	#¥ª
+	 "\x8e\xb6"	=>	"\xa5\xab",	#¥«
+	 "\x8e\xb7"	=>	"\xa5\xad",	#¥­
+	 "\x8e\xb8"	=>	"\xa5\xaf",	#¥¯
+	 "\x8e\xb9"	=>	"\xa5\xb1",	#¥±
+	 "\x8e\xba"	=>	"\xa5\xb3",	#¥³
+	 "\x8e\xbb"	=>	"\xa5\xb5",	#¥µ
+	 "\x8e\xbc"	=>	"\xa5\xb7",	#¥·
+	 "\x8e\xbd"	=>	"\xa5\xb9",	#¥¹
+	 "\x8e\xbe"	=>	"\xa5\xbb",	#¥»
+	 "\x8e\xbf"	=>	"\xa5\xbd",	#¥œ
+	 "\x8e\xc0"	=>	"\xa5\xbf",	#¥¿
+	 "\x8e\xc1"	=>	"\xa5\xc1",	#¥Á
+	 "\x8e\xc2"	=>	"\xa5\xc4",	#¥Ä
+	 "\x8e\xc3"	=>	"\xa5\xc6",	#¥Æ
+	 "\x8e\xc4"	=>	"\xa5\xc8",	#¥È
+	 "\x8e\xc5"	=>	"\xa5\xca",	#¥Ê
+	 "\x8e\xc6"	=>	"\xa5\xcb",	#¥Ë
+	 "\x8e\xc7"	=>	"\xa5\xcc",	#¥Ì
+	 "\x8e\xc8"	=>	"\xa5\xcd",	#¥Í
+	 "\x8e\xc9"	=>	"\xa5\xce",	#¥Î
+	 "\x8e\xca"	=>	"\xa5\xcf",	#¥Ï
+	 "\x8e\xcb"	=>	"\xa5\xd2",	#¥Ò
+	 "\x8e\xcc"	=>	"\xa5\xd5",	#¥Õ
+	 "\x8e\xcd"	=>	"\xa5\xd8",	#¥Ø
+	 "\x8e\xce"	=>	"\xa5\xdb",	#¥Û
+	 "\x8e\xcf"	=>	"\xa5\xde",	#¥Þ
+	 "\x8e\xd0"	=>	"\xa5\xdf",	#¥ß
+	 "\x8e\xd1"	=>	"\xa5\xe0",	#¥à
+	 "\x8e\xd2"	=>	"\xa5\xe1",	#¥á
+	 "\x8e\xd3"	=>	"\xa5\xe2",	#¥â
+	 "\x8e\xd4"	=>	"\xa5\xe4",	#¥ä
+	 "\x8e\xd5"	=>	"\xa5\xe6",	#¥æ
+	 "\x8e\xd6"	=>	"\xa5\xe8",	#¥è
+	 "\x8e\xd7"	=>	"\xa5\xe9",	#¥é
+	 "\x8e\xd8"	=>	"\xa5\xea",	#¥ê
+	 "\x8e\xd9"	=>	"\xa5\xeb",	#¥ë
+	 "\x8e\xda"	=>	"\xa5\xec",	#¥ì
+	 "\x8e\xdb"	=>	"\xa5\xed",	#¥í
+	 "\x8e\xdc"	=>	"\xa5\xef",	#¥ï
+	 "\x8e\xdd"	=>	"\xa5\xf3",	#¥ó
+	 "\x8e\xde"	=>	"\xa1\xab",	#¡«
+	 "\x8e\xdf"	=>	"\xa1\xac",	#¡¬
+);
+
+%_D2Z = (
+	 "\x8e\xb6\x8e\xde"	=>	"\xa5\xac",	#¥¬
+	 "\x8e\xb7\x8e\xde"	=>	"\xa5\xae",	#¥®
+	 "\x8e\xb8\x8e\xde"	=>	"\xa5\xb0",	#¥°
+	 "\x8e\xb9\x8e\xde"	=>	"\xa5\xb2",	#¥²
+	 "\x8e\xba\x8e\xde"	=>	"\xa5\xb4",	#¥Ž
+	 "\x8e\xbb\x8e\xde"	=>	"\xa5\xb6",	#¥¶
+	 "\x8e\xbc\x8e\xde"	=>	"\xa5\xb8",	#¥ž
+	 "\x8e\xbd\x8e\xde"	=>	"\xa5\xba",	#¥º
+	 "\x8e\xbe\x8e\xde"	=>	"\xa5\xbc",	#¥Œ
+	 "\x8e\xbf\x8e\xde"	=>	"\xa5\xbe",	#¥Ÿ
+	 "\x8e\xc0\x8e\xde"	=>	"\xa5\xc0",	#¥À
+	 "\x8e\xc1\x8e\xde"	=>	"\xa5\xc2",	#¥Â
+	 "\x8e\xc2\x8e\xde"	=>	"\xa5\xc5",	#¥Å
+	 "\x8e\xc3\x8e\xde"	=>	"\xa5\xc7",	#¥Ç
+	 "\x8e\xc4\x8e\xde"	=>	"\xa5\xc9",	#¥É
+	 "\x8e\xca\x8e\xde"	=>	"\xa5\xd0",	#¥Ð
+	 "\x8e\xcb\x8e\xde"	=>	"\xa5\xd3",	#¥Ó
+	 "\x8e\xcc\x8e\xde"	=>	"\xa5\xd6",	#¥Ö
+	 "\x8e\xcd\x8e\xde"	=>	"\xa5\xd9",	#¥Ù
+	 "\x8e\xce\x8e\xde"	=>	"\xa5\xdc",	#¥Ü
+	 "\x8e\xca\x8e\xdf"	=>	"\xa5\xd1",	#¥Ñ
+	 "\x8e\xcb\x8e\xdf"	=>	"\xa5\xd4",	#¥Ô
+	 "\x8e\xcc\x8e\xdf"	=>	"\xa5\xd7",	#¥×
+	 "\x8e\xcd\x8e\xdf"	=>	"\xa5\xda",	#¥Ú
+	 "\x8e\xce\x8e\xdf"	=>	"\xa5\xdd",	#¥Ý
+	 "\x8e\xb3\x8e\xde"     =>      "\xa5\xf4",     #¥ô
+);
+
+# init only once;
+
+#$_PAT_D2Z = join("|", keys %_D2Z);
+#$_PAT_H2Z = join("|", keys %_H2Z);
+
+%_Z2H = reverse %_H2Z;
+%_Z2D = reverse %_D2Z;
+
+#$_PAT_Z2H    = join("|", keys %_Z2H);
+#$_PAT_Z2D    = join("|", keys %_Z2D);
+
+sub h2z {
+    no warnings qw(uninitialized);
+    my $r_str = shift;
+    my ($keep_dakuten) = @_;
+    my $n = 0;
+    unless ($keep_dakuten){
+	$n = (
+	      $$r_str =~ s(
+			   ($RE{EUC_KANA}
+			    (?:\x8e[\xde\xdf])?)
+			   ){
+		  my $str = $1;
+		  $_D2Z{$str} || $_H2Z{$str} || 
+		      # in case dakuten and handakuten are side-by-side!
+		      $_H2Z{substr($str,0,2)} . $_H2Z{substr($str,2,2)};
+		  }eogx
+	      );
+    }else{
+	$n = (
+	      $$r_str =~ s(
+			   ($RE{EUC_KANA})
+			   ){
+		  $_H2Z{$1};
+		  }eogx
+	      );
+    }
+    $n;
+}
+
+sub z2h {
+    my $r_str = shift;
+    my $n = (
+	     $$r_str =~ s(
+			  ($RE{EUC_C}|$RE{EUC_0212}|$RE{EUC_KANA})
+			  ){
+		 $_Z2D{$1} || $_Z2H{$1} || $1;
+		 }eogx
+	     );
+    $n;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Encode::JP::H2Z -- internally used by Encode::JP::2022_JP*
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/JP/JIS7.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/JP/JIS7.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/JP/JIS7.pm	(revision 14489)
@@ -0,0 +1,165 @@
+package Encode::JP::JIS7;
+use strict;
+
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use Encode qw(:fallbacks);
+
+for my $name ('7bit-jis', 'iso-2022-jp', 'iso-2022-jp-1'){
+    my $h2z     = ($name eq '7bit-jis')    ? 0 : 1;
+    my $jis0212 = ($name eq 'iso-2022-jp') ? 0 : 1;
+
+    $Encode::Encoding{$name} =
+        bless {
+               Name      =>   $name,
+               h2z       =>   $h2z,
+               jis0212   =>   $jis0212,
+              } => __PACKAGE__;
+}
+
+use base qw(Encode::Encoding);
+
+# we override this to 1 so PerlIO works
+sub needs_lines { 1 }
+
+use Encode::CJKConstants qw(:all);
+
+#
+# decode is identical for all 2022 variants
+#
+
+sub decode($$;$)
+{
+    my ($obj, $str, $chk) = @_;
+    my $residue = '';
+    if ($chk){
+	$str =~ s/([^\x00-\x7f].*)$//so and $residue = $1;
+    }
+    $residue .= jis_euc(\$str);
+    $_[1] = $residue if $chk;
+    return Encode::decode('euc-jp', $str, FB_PERLQQ);
+}
+
+#
+# encode is different
+#
+
+sub encode($$;$)
+{
+    require Encode::JP::H2Z;
+    my ($obj, $utf8, $chk) = @_;
+    # empty the input string in the stack so perlio is ok
+    $_[1] = '' if $chk;
+    my ($h2z, $jis0212) = @$obj{qw(h2z jis0212)};
+    my $octet = Encode::encode('euc-jp', $utf8, FB_PERLQQ) ;
+    $h2z and &Encode::JP::H2Z::h2z(\$octet);
+    euc_jis(\$octet, $jis0212);
+    return $octet;
+}
+
+#
+# cat_decode
+#
+my $re_scan_jis_g = qr{
+   \G ( ($RE{JIS_0212}) |  $RE{JIS_0208}  |
+        ($RE{ISO_ASC})  | ($RE{JIS_KANA}) | )
+      ([^\e]*)
+}x;
+sub cat_decode { # ($obj, $dst, $src, $pos, $trm, $chk)
+    my ($obj, undef, undef, $pos, $trm) = @_; # currently ignores $chk
+    my ($rdst, $rsrc, $rpos) = \@_[1,2,3];
+    local ${^ENCODING};
+    use bytes;
+    my $opos = pos($$rsrc);
+    pos($$rsrc) = $pos;
+    while ($$rsrc =~ /$re_scan_jis_g/gc) {
+	my ($esc, $esc_0212, $esc_asc, $esc_kana, $chunk) =
+	  ($1, $2, $3, $4, $5);
+
+	unless ($chunk) { $esc or last;  next; }
+
+	if ($esc && !$esc_asc) {
+	    $chunk =~ tr/\x21-\x7e/\xa1-\xfe/;
+	    if ($esc_kana) {
+		$chunk =~ s/([\xa1-\xdf])/\x8e$1/og;
+	    } elsif ($esc_0212) {
+		$chunk =~ s/([\xa1-\xfe][\xa1-\xfe])/\x8f$1/og;
+	    }
+	    $chunk = Encode::decode('euc-jp', $chunk, 0);
+	}
+	elsif ((my $npos = index($chunk, $trm)) >= 0) {
+	    $$rdst .= substr($chunk, 0, $npos + length($trm));
+	    $$rpos += length($esc) + $npos + length($trm);
+	    pos($$rsrc) = $opos;
+	    return 1;
+	}
+	$$rdst .= $chunk;
+	$$rpos = pos($$rsrc);
+    }
+    $$rpos = pos($$rsrc);
+    pos($$rsrc) = $opos;
+    return '';
+}
+
+# JIS<->EUC
+my $re_scan_jis = qr{
+   (?:($RE{JIS_0212})|$RE{JIS_0208}|($RE{ISO_ASC})|($RE{JIS_KANA}))([^\e]*)
+}x;
+
+sub jis_euc {
+    local ${^ENCODING};
+    my $r_str = shift;
+    $$r_str =~ s($re_scan_jis)
+    {
+	my ($esc_0212, $esc_asc, $esc_kana, $chunk) =
+	   ($1, $2, $3, $4);
+	if (!$esc_asc) {
+	    $chunk =~ tr/\x21-\x7e/\xa1-\xfe/;
+	    if ($esc_kana) {
+		$chunk =~ s/([\xa1-\xdf])/\x8e$1/og;
+	    }
+	    elsif ($esc_0212) {
+		$chunk =~ s/([\xa1-\xfe][\xa1-\xfe])/\x8f$1/og;
+	    }
+	}
+	$chunk;
+    }geox;
+    my ($residue) = ($$r_str =~ s/(\e.*)$//so);
+    return $residue;
+}
+
+sub euc_jis{
+    no warnings qw(uninitialized);
+    my $r_str = shift;
+    my $jis0212 = shift;
+    $$r_str =~ s{
+	((?:$RE{EUC_C})+|(?:$RE{EUC_KANA})+|(?:$RE{EUC_0212})+)
+	}{
+	    my $chunk = $1;
+	    my $esc =
+		( $chunk =~ tr/\x8E//d ) ? $ESC{KANA} :
+		    ( $chunk =~ tr/\x8F//d ) ? $ESC{JIS_0212} :
+			$ESC{JIS_0208};
+	    if ($esc eq $ESC{JIS_0212} && !$jis0212){
+		# fallback to '?'
+		$chunk =~ tr/\xA1-\xFE/\x3F/;
+	    }else{
+		$chunk =~ tr/\xA1-\xFE/\x21-\x7E/;
+	    }
+	    $esc . $chunk . $ESC{ASC};
+	}geox;
+    $$r_str =~
+	s/\Q$ESC{ASC}\E
+	    (\Q$ESC{KANA}\E|\Q$ESC{JIS_0212}\E|\Q$ESC{JIS_0208}\E)/$1/gox;
+    $$r_str;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Encode::JP::JIS7 -- internally used by Encode::JP
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/KR.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/KR.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/KR.pm	(revision 14489)
@@ -0,0 +1,72 @@
+package Encode::KR;
+BEGIN {
+    if (ord("A") == 193) {
+	die "Encode::KR not supported on EBCDIC\n";
+    }
+}
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use Encode;
+use XSLoader;
+XSLoader::load(__PACKAGE__,$VERSION);
+
+use Encode::KR::2022_KR;
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::KR - Korean Encodings
+
+=head1 SYNOPSIS
+
+    use Encode qw/encode decode/; 
+    $euc_kr = encode("euc-kr", $utf8);   # loads Encode::KR implicitly
+    $utf8   = decode("euc-kr", $euc_kr); # ditto
+
+=head1 DESCRIPTION
+
+This module implements Korean charset encodings.  Encodings supported
+are as follows.
+
+
+  Canonical   Alias		Description
+  --------------------------------------------------------------------
+  euc-kr      /\beuc.*kr$/i	EUC (Extended Unix Character)
+	      /\bkr.*euc$/i
+  ksc5601-raw			Korean standard code set (as is)
+  cp949	      /(?:x-)?uhc$/i
+              /(?:x-)?windows-949$/i
+              /\bks_c_5601-1987$/i
+                                Code Page 949 (EUC-KR + 8,822 
+                                (additional Hangul syllables)
+  MacKorean			EUC-KR + Apple Vendor Mappings
+  johab       JOHAB             A supplementary encoding defined in 
+                                             Annex 3 of KS X 1001:1998
+  iso-2022-kr                   iso-2022-kr                  [RFC1557]
+  --------------------------------------------------------------------
+
+To find how to use this module in detail, see L<Encode>.
+
+=head1 BUGS
+
+When you see C<charset=ks_c_5601-1987> on mails and web pages, they really
+mean "cp949" encodings.  To fix that, the following aliases are set;
+
+  qr/(?:x-)?uhc$/i         => '"cp949"'
+  qr/(?:x-)?windows-949$/i => '"cp949"'
+  qr/ks_c_5601-1987$/i     => '"cp949"'
+
+The ASCII region (0x00-0x7f) is preserved for all encodings, even
+though this conflicts with mappings by the Unicode Consortium.  See
+
+L<http://www.debian.or.jp/~kubota/unicode-symbols.html.en>
+
+to find out why it is implemented that way.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/KR/2022_KR.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/KR/2022_KR.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/KR/2022_KR.pm	(revision 14489)
@@ -0,0 +1,79 @@
+package Encode::KR::2022_KR;
+use strict;
+
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use Encode qw(:fallbacks);
+
+use base qw(Encode::Encoding);
+__PACKAGE__->Define('iso-2022-kr');
+
+sub needs_lines  { 1 }
+
+sub perlio_ok { 
+    return 0; # for the time being
+}
+
+sub decode
+{
+    my ($obj, $str, $chk) = @_;
+    my $res = $str;
+    my $residue = iso_euc(\$res);
+    # This is for PerlIO
+    $_[1] = $residue if $chk;
+    return Encode::decode('euc-kr', $res, FB_PERLQQ);
+}
+
+sub encode
+{
+    my ($obj, $utf8, $chk) = @_;
+    # empty the input string in the stack so perlio is ok
+    $_[1] = '' if $chk;
+    my $octet = Encode::encode('euc-kr', $utf8, FB_PERLQQ) ;
+    euc_iso(\$octet);
+    return $octet;
+}
+
+use Encode::CJKConstants qw(:all);
+
+# ISO<->EUC
+
+sub iso_euc{
+    my $r_str = shift;
+    $$r_str =~ s/$RE{'2022_KR'}//gox;  # remove the designator
+    $$r_str =~ s{                      # replace characters in GL
+     \x0e                              # between SO(\x0e) and SI(\x0f)
+     ([^\x0f]*)                        # with characters in GR
+     \x0f
+        }
+    {
+                        my $out= $1;
+      $out =~ tr/\x21-\x7e/\xa1-\xfe/;
+      $out;
+    }geox;
+    my ($residue) = ($$r_str =~ s/(\e.*)$//so);
+    return $residue;
+}
+
+sub euc_iso{
+    no warnings qw(uninitialized);
+    my $r_str = shift;
+    substr($$r_str,0,0)=$ESC{'2022_KR'};  # put the designator at the beg.
+    $$r_str =~ s{                         # move KS X 1001 characters in GR to GL
+        ($RE{EUC_C}+)                     # and enclose them with SO and SI
+        }{
+            my $str = $1;
+            $str =~ tr/\xA1-\xFE/\x21-\x7E/;
+            "\x0e" . $str . "\x0f";
+        }geox;
+    $$r_str;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::KR::2022_KR -- internally used by Encode::KR
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/MIME/Header.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/MIME/Header.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/MIME/Header.pm	(revision 14489)
@@ -0,0 +1,230 @@
+package Encode::MIME::Header;
+use strict;
+# use warnings;
+our $VERSION = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+use Encode qw(find_encoding encode_utf8 decode_utf8);
+use MIME::Base64;
+use Carp;
+
+my %seed = 
+    (
+     decode_b     => '1', # decodes 'B' encoding ?
+     decode_q     => '1', # decodes 'Q' encoding ?
+     encode       => 'B', # encode with 'B' or 'Q' ?
+     bpl          => 75,  # bytes per line
+     );
+
+$Encode::Encoding{'MIME-Header'} =
+    bless {
+	%seed,
+	Name => 'MIME-Header',
+    } => __PACKAGE__;
+
+$Encode::Encoding{'MIME-B'} =
+    bless {
+	%seed,
+	decode_q  => 0,
+	Name      => 'MIME-B',
+    } => __PACKAGE__;
+
+$Encode::Encoding{'MIME-Q'} =
+    bless {
+	%seed,
+	decode_q    => 1,
+	encode      => 'Q',
+	Name        => 'MIME-Q',
+    } => __PACKAGE__;
+
+use base qw(Encode::Encoding);
+
+sub needs_lines { 1 }
+sub perlio_ok{ 0 };
+
+sub decode($$;$){
+    use utf8;
+    my ($obj, $str, $chk) = @_;
+    # zap spaces between encoded words
+    $str =~ s/\?=\s+=\?/\?==\?/gos;
+    # multi-line header to single line
+    $str =~ s/(:?\r|\n|\r\n)[ \t]//gos;
+    $str =~
+	s{
+	    =\?                  # begin encoded word
+		([0-9A-Za-z\-_]+) # charset (encoding)
+		\?([QqBb])\?     # delimiter
+		(.*?)            # Base64-encodede contents
+		\?=              # end encoded word      
+	    }{
+		if    (uc($2) eq 'B'){
+		    $obj->{decode_b} or croak qq(MIME "B" unsupported);
+		    decode_b($1, $3);
+		}elsif(uc($2) eq 'Q'){
+		    $obj->{decode_q} or croak qq(MIME "Q" unsupported);
+		    decode_q($1, $3);
+		}else{
+		    croak qq(MIME "$2" encoding is nonexistent!);
+		}
+	    }egox;
+    $_[1] = '' if $chk;
+    return $str;
+}
+
+sub decode_b{
+    my $enc = shift;
+    my $d = find_encoding($enc)        or croak qq(Unknown encoding "$enc");
+    my $db64 = decode_base64(shift);
+    return $d->name eq 'utf8' ?
+	Encode::decode_utf8($db64) : $d->decode($db64, Encode::FB_PERLQQ);
+}
+
+sub decode_q{
+    my ($enc, $q) = @_;
+    my $d = find_encoding($enc) or croak qq(Unknown encoding "$enc");
+    $q =~ s/_/ /go;
+    $q =~ s/=([0-9A-Fa-f]{2})/pack("C", hex($1))/ego;
+    return $d->name eq 'utf8' ? 
+	Encode::decode_utf8($q) : $d->decode($q, Encode::FB_PERLQQ);
+}
+
+my $especials = 
+    join('|' =>
+	 map {quotemeta(chr($_))} 
+	 unpack("C*", qq{()<>@,;:\"\'/[]?.=}));
+
+my $re_encoded_word =
+    qr{
+       (?:
+	=\?               # begin encoded word
+	(?:[0-9A-Za-z\-_]+) # charset (encoding)
+	\?(?:[QqBb])\?      # delimiter
+	(?:.*?)             # Base64-encodede contents
+	\?=                 # end encoded word
+       )
+      }xo;
+
+my $re_especials = qr{$re_encoded_word|$especials}xo;
+
+sub encode($$;$){
+    my ($obj, $str, $chk) = @_;
+    my @line = ();
+    for my $line (split /\r|\n|\r\n/o, $str){
+	my (@word, @subline);
+        for my $word (split /($re_especials)/o, $line){
+	    if ($word =~ /[^\x00-\x7f]/o or $word =~ /^$re_encoded_word$/o){
+		push @word, $obj->_encode($word);
+	    }else{
+		push @word, $word;
+	    }
+	}
+	my $subline = '';
+	for my $word (@word){
+	    use bytes ();
+	    if (bytes::length($subline) + bytes::length($word) > $obj->{bpl}){
+		push @subline, $subline;
+		$subline = '';
+	    }
+	    $subline .= $word;
+	}
+	$subline and push @subline, $subline;
+	push @line, join("\n " => @subline);
+    }
+    $_[1] = '' if $chk;
+    return join("\n", @line);
+}
+
+use constant HEAD  => '=?UTF-8?';
+use constant TAIL    => '?=';
+use constant SINGLE => { B => \&_encode_b, Q => \&_encode_q, };
+
+sub _encode{
+    my ($o, $str) = @_;
+    my $enc = $o->{encode};
+    my $llen = ($o->{bpl} - length(HEAD) - 2 - length(TAIL));
+    # to coerce a floating-point arithmetics, the following contains
+    # .0 in numbers -- dankogai
+    $llen *= $enc eq 'B' ? 3.0/4.0 : 1.0/3.0;
+    my @result = ();
+    my $chunk = '';
+    while(length(my $chr = substr($str, 0, 1, ''))){
+	use bytes ();
+	if (bytes::length($chunk) + bytes::length($chr) > $llen){
+	    push @result, SINGLE->{$enc}($chunk);
+	    $chunk = '';
+	}
+	$chunk .= $chr;
+    }
+    $chunk and push @result, SINGLE->{$enc}($chunk);
+    return @result;
+}
+
+sub _encode_b{
+    HEAD . 'B?' . encode_base64(encode_utf8(shift), '') . TAIL;
+}
+
+sub _encode_q{
+    my $chunk = shift;
+    $chunk =~ s{
+		([^0-9A-Za-z])
+	       }{
+		   join("" => map {sprintf "=%02X", $_} unpack("C*", $1))
+	       }egox;
+    return decode_utf8(HEAD . 'Q?' . $chunk . TAIL);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::MIME::Header -- MIME 'B' and 'Q' header encoding
+
+=head1 SYNOPSIS
+
+    use Encode qw/encode decode/; 
+    $utf8   = decode('MIME-Header', $header);
+    $header = encode('MIME-Header', $utf8);
+
+=head1 ABSTRACT
+
+This module implements RFC 2047 Mime Header Encoding.  There are 3
+variant encoding names; C<MIME-Header>, C<MIME-B> and C<MIME-Q>.  The
+difference is described below
+
+              decode()          encode()
+  ----------------------------------------------
+  MIME-Header Both B and Q      =?UTF-8?B?....?=
+  MIME-B      B only; Q croaks  =?UTF-8?B?....?=
+  MIME-Q      Q only; B croaks  =?UTF-8?Q?....?=
+
+=head1 DESCRIPTION
+
+When you decode(=?I<encoding>?I<X>?I<ENCODED WORD>?=), I<ENCODED WORD>
+is extracted and decoded for I<X> encoding (B for Base64, Q for
+Quoted-Printable). Then the decoded chunk is fed to
+decode(I<encoding>).  So long as I<encoding> is supported by Encode,
+any source encoding is fine.
+
+When you encode, it just encodes UTF-8 string with I<X> encoding then
+quoted with =?UTF-8?I<X>?....?= .  The parts that RFC 2047 forbids to
+encode are left as is and long lines are folded within 76 bytes per
+line.
+
+=head1 BUGS
+
+It would be nice to support encoding to non-UTF8, such as =?ISO-2022-JP?
+and =?ISO-8859-1?= but that makes the implementation too complicated.
+These days major mail agents all support =?UTF-8? so I think it is
+just good enough.
+
+Due to popular demand, 'MIME-Header-ISO_2022_JP' was introduced by
+Makamaka.  Thre are still too many MUAs especially cellular phone
+handsets which does not grok UTF-8.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+RFC 2047, L<http://www.faqs.org/rfcs/rfc2047.html> and many other
+locations. 
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/MIME/Header/ISO_2022_JP.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/MIME/Header/ISO_2022_JP.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/MIME/Header/ISO_2022_JP.pm	(revision 14489)
@@ -0,0 +1,127 @@
+package Encode::MIME::Header::ISO_2022_JP;
+
+use strict;
+use base qw(Encode::MIME::Header);
+
+$Encode::Encoding{'MIME-Header-ISO_2022_JP'}
+  = bless {encode => 'B', bpl => 76, Name => 'MIME-Header-ISO_2022_JP'}
+   => __PACKAGE__;
+
+use constant HEAD   => '=?ISO-2022-JP?B?';
+use constant TAIL   => '?=';
+
+use Encode::CJKConstants qw(%RE);
+
+our $VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+
+# I owe the below codes totally to
+#   Jcode by Dan Kogai & http://www.din.or.jp/~ohzaki/perl.htm#JP_Base64
+
+sub encode {
+	my $self = shift;
+	my $str  = shift;
+
+	utf8::encode($str) if( Encode::is_utf8($str) );
+	Encode::from_to($str, 'utf8', 'euc-jp');
+
+	my($trailing_crlf) = ($str =~ /(\n|\r|\x0d\x0a)$/o);
+
+	$str = _mime_unstructured_header($str, $self->{bpl});
+
+	not $trailing_crlf and $str =~ s/(\n|\r|\x0d\x0a)$//o;
+
+	return $str;
+}
+
+
+sub _mime_unstructured_header {
+    my ($oldheader, $bpl) = @_;
+	my $crlf = $oldheader =~ /\n$/;
+	my($header, @words, @wordstmp, $i) = ('');
+
+	$oldheader =~ s/\s+$//;
+
+	@wordstmp = split /\s+/, $oldheader;
+
+	for ($i = 0; $i < $#wordstmp; $i++){
+		if( $wordstmp[$i] !~ /^[\x21-\x7E]+$/ and $wordstmp[$i + 1] !~ /^[\x21-\x7E]+$/){
+			$wordstmp[$i + 1] = "$wordstmp[$i] $wordstmp[$i + 1]";
+		}
+		else{
+			push(@words, $wordstmp[$i]);
+		}
+	}
+
+	push(@words, $wordstmp[-1]);
+
+	for my $word (@words){
+		if ($word =~ /^[\x21-\x7E]+$/) {
+			$header =~ /(?:.*\n)*(.*)/;
+			if (length($1) + length($word) > $bpl) {
+				$header .= "\n $word";
+			}
+			else{
+				$header .= $word;
+			}
+		}
+		else{
+			$header = _add_encoded_word($word, $header, $bpl);
+		}
+
+		$header =~ /(?:.*\n)*(.*)/;
+
+		if(length($1) == $bpl){
+			$header .= "\n ";
+		}
+		else {
+			$header .= ' ';
+		}
+	}
+
+	$header =~ s/\n? $//mg;
+
+	$crlf ? "$header\n" : $header;
+}
+
+
+sub _add_encoded_word {
+	my($str, $line, $bpl) = @_;
+	my $result = '';
+
+	while( length($str) ){
+		my $target = $str;
+		$str = '';
+
+		if(length($line) + 22 + ($target =~ /^(?:$RE{EUC_0212}|$RE{EUC_C})/o) * 8 > $bpl){
+			$line =~ s/[ \t\n\r]*$/\n/;
+			$result .= $line;
+			$line = ' ';
+		}
+
+		while(1){
+			my $iso_2022_jp = $target;
+			Encode::from_to($iso_2022_jp, 'euc-jp', 'iso-2022-jp');
+
+			my $encoded
+			 = HEAD . MIME::Base64::encode_base64($iso_2022_jp, '') . TAIL;
+
+			if(length($encoded) + length($line) > $bpl){
+				$target =~ s/($RE{EUC_0212}|$RE{EUC_KANA}|$RE{EUC_C}|$RE{ASCII})$//o;
+				$str = $1 . $str;
+			}
+			else{
+				$line .= $encoded;
+				last;
+			}
+		}
+
+	}
+
+	$result . $line;
+}
+
+
+1;
+__END__
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Makefile_PL.e2x
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Makefile_PL.e2x	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Makefile_PL.e2x	(revision 14489)
@@ -0,0 +1,180 @@
+#
+# This file is auto-generated by:
+# enc2xs version $_Version_
+# $_Now_
+#
+use 5.7.2;
+use strict;
+use ExtUtils::MakeMaker;
+use Config;
+
+# Please edit the following to the taste!
+my $name = '$_Name_';
+my %tables = (
+	     $_Name__t   => [ $_TableFiles_ ],
+	     );
+
+#### DO NOT EDIT BEYOND THIS POINT!
+require File::Spec;
+my ($enc2xs, $encode_h) = ();
+PATHLOOP:
+for my $d (@Config{qw/bin sitebin vendorbin/}, 
+	   (split /$Config{path_sep}/o, $ENV{PATH})){
+    for my $f (qw/enc2xs enc2xs5.7.3/){
+        my $path = File::Spec->catfile($d, $f);
+        -r $path and $enc2xs = $path and last PATHLOOP;
+    }
+}
+$enc2xs or die "enc2xs not found!";
+print "enc2xs is $enc2xs\n";
+my %encode_h = ();
+for my $d (@INC){
+    my $dir = File::Spec->catfile($d, "Encode");
+    my $file =  File::Spec->catfile($dir, "encode.h");
+    -f $file and $encode_h{$dir} = -M $file;
+}
+%encode_h or die "encode.h not found!";
+# find the latest one
+($encode_h) = sort {$encode_h{$b} <=> $encode_h{$a}} keys %encode_h;
+print "encode.h is at $encode_h\n";
+
+WriteMakefile(
+              INC		=> "-I$encode_h",
+#### END_OF_HEADER -- DO NOT EDIT THIS LINE BY HAND! ####
+	      NAME		=> 'Encode::'.$name,
+	      VERSION_FROM	=> "$name.pm",
+	      OBJECT		=> '$(O_FILES)',
+	      'dist'		=> {
+		  COMPRESS	=> 'gzip -9f',
+		  SUFFIX	=> 'gz',
+		  DIST_DEFAULT => 'all tardist',
+	      },
+	      MAN3PODS	=> {},
+	      PREREQ_PM => {
+			    'Encode'     => "1.41",
+                           },
+	      # OS 390 winges about line numbers > 64K ???
+	      XSOPT => '-nolinenumbers',
+	      );
+
+package MY;
+
+sub post_initialize
+{
+    my ($self) = @_;
+    my %o;
+    my $x = $self->{'OBJ_EXT'};
+    # Add the table O_FILES
+    foreach my $e (keys %tables)
+    {
+	$o{$e.$x} = 1;
+    }
+    $o{"$name$x"} = 1;
+    $self->{'O_FILES'} = [sort keys %o];
+    my @files = ("$name.xs");
+    $self->{'C'} = ["$name.c"];
+    # The next two lines to make MacPerl Happy -- dankogai via pudge
+    $self->{SOURCE} .= " $name.c"
+        if $^O eq 'MacOS' && $self->{SOURCE} !~ /\b$name\.c\b/;
+    # $self->{'H'} = [$self->catfile($self->updir,'encode.h')];
+    my %xs;
+    foreach my $table (keys %tables) {
+	push (@{$self->{'C'}},"$table.c");
+	# Do NOT add $table.h etc. to H_FILES unless we own up as to how they
+	# get built.
+	foreach my $ext (qw($(OBJ_EXT) .c .h .exh .fnm)) {
+	    push (@files,$table.$ext);
+	}
+    }
+    $self->{'XS'} = { "$name.xs" => "$name.c" };
+    $self->{'clean'}{'FILES'} .= join(' ',@files);
+    open(XS,">$name.xs") || die "Cannot open $name.xs:$!";
+    print XS <<'END';
+#include <EXTERN.h>
+#include <perl.h>
+#include <XSUB.h>
+#define U8 U8
+#include "encode.h"
+END
+    foreach my $table (keys %tables) {
+	print XS qq[#include "${table}.h"\n];
+    }
+    print XS <<"END";
+
+static void
+Encode_XSEncoding(pTHX_ encode_t *enc)
+{
+ dSP;
+ HV *stash = gv_stashpv("Encode::XS", TRUE);
+ SV *sv    = sv_bless(newRV_noinc(newSViv(PTR2IV(enc))),stash);
+ int i = 0;
+ PUSHMARK(sp);
+ XPUSHs(sv);
+ while (enc->name[i])
+  {
+   const char *name = enc->name[i++];
+   XPUSHs(sv_2mortal(newSVpvn(name,strlen(name))));
+  }
+ PUTBACK;
+ call_pv("Encode::define_encoding",G_DISCARD);
+ SvREFCNT_dec(sv);
+}
+
+MODULE = Encode::$name	PACKAGE = Encode::$name
+PROTOTYPES: DISABLE
+BOOT:
+{
+END
+    foreach my $table (keys %tables) {
+	print XS qq[#include "${table}.exh"\n];
+    }
+    print XS "}\n";
+    close(XS);
+    return "# Built $name.xs\n\n";
+}
+
+sub postamble
+{
+    my $self = shift;
+    my $dir  = "."; # $self->catdir('Encode');
+    my $str  = "# $name\$(OBJ_EXT) depends on .h and .exh files not .c files - but all written by enc2xs\n";
+    $str    .= "$name.c : $name.xs ";
+    foreach my $table (keys %tables)
+    {
+	$str .= " $table.c";
+    }
+    $str .= "\n\n";
+    $str .= "$name\$(OBJ_EXT) : $name.c\n\n";
+
+    foreach my $table (keys %tables)
+    {
+	my $numlines = 1;
+	my $lengthsofar = length($str);
+	my $continuator = '';
+	$str .= "$table.c : Makefile.PL";
+	foreach my $file (@{$tables{$table}})
+	{
+	    $str .= $continuator.' '.$self->catfile($dir,$file);
+	    if ( length($str)-$lengthsofar > 128*$numlines )
+	    {
+		$continuator .= " \\\n\t";
+		$numlines++;
+	    } else {
+		$continuator = '';
+	    }
+	}
+	my $plib   = $self->{PERL_CORE} ? '"-I$(PERL_LIB)"' : '';
+	my $ucopts = '-"Q"';
+	$str .=  
+	    qq{\n\t\$(PERL) $plib $enc2xs $ucopts -o \$\@ -f $table.fnm\n\n};
+	open (FILELIST, ">$table.fnm")
+	    || die "Could not open $table.fnm: $!";
+	foreach my $file (@{$tables{$table}})
+	{
+	    print FILELIST $self->catfile($dir,$file) . "\n";
+	}
+	close(FILELIST);
+    }
+    return $str;
+}
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/PerlIO.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/PerlIO.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/PerlIO.pod	(revision 14489)
@@ -0,0 +1,167 @@
+=head1 NAME
+
+Encode::PerlIO -- a detailed document on Encode and PerlIO
+
+=head1 Overview
+
+It is very common to want to do encoding transformations when
+reading or writing files, network connections, pipes etc.
+If Perl is configured to use the new 'perlio' IO system then
+C<Encode> provides a "layer" (see L<PerlIO>) which can transform
+data as it is read or written.
+
+Here is how the blind poet would modernise the encoding:
+
+    use Encode;
+    open(my $iliad,'<:encoding(iso-8859-7)','iliad.greek');
+    open(my $utf8,'>:utf8','iliad.utf8');
+    my @epic = <$iliad>;
+    print $utf8 @epic;
+    close($utf8);
+    close($illiad);
+
+In addition, the new IO system can also be configured to read/write
+UTF-8 encoded characters (as noted above, this is efficient):
+
+    open(my $fh,'>:utf8','anything');
+    print $fh "Any \x{0021} string \N{SMILEY FACE}\n";
+
+Either of the above forms of "layer" specifications can be made the default
+for a lexical scope with the C<use open ...> pragma. See L<open>.
+
+Once a handle is open, its layers can be altered using C<binmode>.
+
+Without any such configuration, or if Perl itself is built using the
+system's own IO, then write operations assume that the file handle
+accepts only I<bytes> and will C<die> if a character larger than 255 is
+written to the handle. When reading, each octet from the handle becomes
+a byte-in-a-character. Note that this default is the same behaviour
+as bytes-only languages (including Perl before v5.6) would have,
+and is sufficient to handle native 8-bit encodings e.g. iso-8859-1,
+EBCDIC etc. and any legacy mechanisms for handling other encodings
+and binary data.
+
+In other cases, it is the program's responsibility to transform
+characters into bytes using the API above before doing writes, and to
+transform the bytes read from a handle into characters before doing
+"character operations" (e.g. C<lc>, C</\W+/>, ...).
+
+You can also use PerlIO to convert larger amounts of data you don't
+want to bring into memory.  For example, to convert between ISO-8859-1
+(Latin 1) and UTF-8 (or UTF-EBCDIC in EBCDIC machines):
+
+    open(F, "<:encoding(iso-8859-1)", "data.txt") or die $!;
+    open(G, ">:utf8",                 "data.utf") or die $!;
+    while (<F>) { print G }
+
+    # Could also do "print G <F>" but that would pull
+    # the whole file into memory just to write it out again.
+
+More examples:
+
+    open(my $f, "<:encoding(cp1252)")
+    open(my $g, ">:encoding(iso-8859-2)")
+    open(my $h, ">:encoding(latin9)")       # iso-8859-15
+
+See also L<encoding> for how to change the default encoding of the
+data in your script.
+
+=head1 How does it work?
+
+Here is a crude diagram of how filehandle, PerlIO, and Encode
+interact.
+
+  filehandle <-> PerlIO        PerlIO <-> scalar (read/printed)
+                       \      /
+                        Encode   
+
+When PerlIO receives data from either direction, it fills a buffer
+(currently with 1024 bytes) and passes the buffer to Encode.
+Encode tries to convert the valid part and passes it back to PerlIO,
+leaving invalid parts (usually a partial character) in the buffer.
+PerlIO then appends more data to the buffer, calls Encode again,
+and so on until the data stream ends.
+
+To do so, PerlIO always calls (de|en)code methods with CHECK set to 1.
+This ensures that the method stops at the right place when it
+encounters partial character.  The following is what happens when
+PerlIO and Encode tries to encode (from utf8) more than 1024 bytes
+and the buffer boundary happens to be in the middle of a character.
+
+   A   B   C   ....   ~     \x{3000}    ....
+  41  42  43   ....  7E   e3   80   80  ....
+  <- buffer --------------->
+  << encoded >>>>>>>>>>
+                       <- next buffer ------
+
+Encode converts from the beginning to \x7E, leaving \xe3 in the buffer
+because it is invalid (partial character).
+
+Unfortunately, this scheme does not work well with escape-based
+encodings such as ISO-2022-JP.
+
+=head1 Line Buffering
+
+Now let's see what happens when you try to decode from ISO-2022-JP and
+the buffer ends in the middle of a character.
+
+			  JIS208-ESC   \x{5f3e}
+   A   B   C   ....   ~   \e   $   B  |DAN | ....
+  41  42  43   ....  7E   1b  24  41  43  46 ....
+  <- buffer --------------------------->
+  << encoded >>>>>>>>>>>>>>>>>>>>>>>
+
+As you see, the next buffer begins with \x43.  But \x43 is 'C' in
+ASCII, which is wrong in this case because we are now in JISX 0208
+area so it has to convert \x43\x46, not \x43.  Unlike utf8 and EUC,
+in escape-based encodings you can't tell if a given octet is a whole
+character or just part of it.
+
+Fortunately PerlIO also supports line buffer if you tell PerlIO to use
+one instead of fixed buffer.  Since ISO-2022-JP is guaranteed to revert to ASCII at the end of the line, partial
+character will never happen when line buffer is used.
+
+To tell PerlIO to use line buffer, implement -E<gt>needs_lines method
+for your encoding object.  See  L<Encode::Encoding> for details.
+
+Thanks to these efforts most encodings that come with Encode support
+PerlIO but that still leaves following encodings.
+
+  iso-2022-kr
+  MIME-B
+  MIME-Header
+  MIME-Q
+
+Fortunately iso-2022-kr is hardly used (according to Jungshik) and
+MIME-* are very unlikely to be fed to PerlIO because they are for mail
+headers.  See L<Encode::MIME::Header> for details.
+
+=head2 How can I tell whether my encoding fully supports PerlIO ?
+
+As of this writing, any encoding whose class belongs to Encode::XS and
+Encode::Unicode works.  The Encode module has a C<perlio_ok> method
+which you can use before applying PerlIO encoding to the filehandle.
+Here is an example:
+
+  my $use_perlio = perlio_ok($enc);
+  my $layer = $use_perlio ? "<:raw" : "<:encoding($enc)";
+  open my $fh, $layer, $file or die "$file : $!";
+  while(<$fh>){
+    $_ = decode($enc, $_) unless $use_perlio;
+    # .... 
+  }
+
+=head1 SEE ALSO
+
+L<Encode::Encoding>,
+L<Encode::Supported>,
+L<Encode::PerlIO>, 
+L<encoding>,
+L<perlebcdic>, 
+L<perlfunc/open>, 
+L<perlunicode>, 
+L<utf8>, 
+the Perl Unicode Mailing List E<lt>perl-unicode@perl.orgE<gt>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/README.e2x
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/README.e2x	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/README.e2x	(revision 14489)
@@ -0,0 +1,31 @@
+Encode::$_Name_ version 0.1
+========
+
+NAME
+       Encode::$_Name_ - <describe encoding>
+
+SYNOPSIS
+       use Encode::$_Name_;
+       #<put more words here>
+ABSTRACT
+      <fill this in>
+INSTALLATION
+
+To install this module type the following:
+
+   perl Makefile.PL
+   make
+   make test
+   make install
+
+DEPENDENCIES
+
+This module requires perl version 5.7.3 or later.
+
+COPYRIGHT AND LICENCE
+
+Copyright (C) 2002 Your Name <your@address.domain>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself. 
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Supported.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Supported.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Supported.pod	(revision 14489)
@@ -0,0 +1,890 @@
+=head1 NAME
+
+Encode::Supported -- Encodings supported by Encode
+
+=head1 DESCRIPTION
+
+=head2 Encoding Names
+
+Encoding names are case insensitive. White space in names
+is ignored.  In addition, an encoding may have aliases.
+Each encoding has one "canonical" name.  The "canonical"
+name is chosen from the names of the encoding by picking
+the first in the following sequence (with a few exceptions).
+
+=over 4
+
+=item *
+
+The name used by the Perl community.  That includes 'utf8' and 'ascii'.
+Unlike aliases, canonical names directly reach the method so such
+frequently used words like 'utf8' don't need to do alias lookups.
+
+=item *
+
+The MIME name as defined in IETF RFCs.  This includes all "iso-"s.
+
+=item * 
+
+The name in the IANA registry.
+
+=item *
+
+The name used by the organization that defined it.
+
+=back
+
+In case I<de jure> canonical names differ from that of the Encode
+module, they are always aliased if it ever be implemented.  So you can
+safely tell if a given encoding is implemented or not just by passing 
+the canonical name.
+
+Because of all the alias issues, and because in the general case 
+encodings have state, "Encode" uses an encoding object internally 
+once an operation is in progress.
+
+=head1 Supported Encodings
+
+As of Perl 5.8.0, at least the following encodings are recognized.
+Note that unless otherwise specified, they are all case insensitive
+(via alias) and all occurrence of spaces are replaced with '-'.
+In other words, "ISO 8859 1" and "iso-8859-1" are identical.
+
+Encodings are categorized and implemented in several different modules
+but you don't have to C<use Encode::XX> to make them available for
+most cases.  Encode.pm will automatically load those modules on demand.
+
+=head2 Built-in Encodings
+
+The following encodings are always available.
+
+  Canonical     Aliases                      Comments & References
+  ----------------------------------------------------------------
+  ascii         US-ascii ISO-646-US                         [ECMA]
+  ascii-ctrl			                  Special Encoding
+  iso-8859-1    latin1                                       [ISO]
+  null				                  Special Encoding
+  utf8          UTF-8                                    [RFC2279]
+  ----------------------------------------------------------------
+
+I<null> and I<ascii-ctrl> are special.  "null" fails for all character
+so when you set fallback mode to PERLQQ, HTMLCREF or XMLCREF, ALL
+CHARACTERS will fall back to character references.  Ditto for
+"ascii-ctrl" except for control characters.  For fallback modes, see
+L<Encode>.
+
+=head2 Encode::Unicode -- other Unicode encodings
+
+Unicode coding schemes other than native utf8 are supported by
+Encode::Unicode, which will be autoloaded on demand.
+
+  ----------------------------------------------------------------
+  UCS-2BE       UCS-2, iso-10646-1                      [IANA, UC]
+  UCS-2LE                                                     [UC]
+  UTF-16                                                      [UC]
+  UTF-16BE                                                    [UC]
+  UTF-16LE                                                    [UC]
+  UTF-32                                                      [UC]
+  UTF-32BE	UCS-4                                         [UC]
+  UTF-32LE                                                    [UC]
+  UTF-7                                                  [RFC2152]
+  ----------------------------------------------------------------
+
+To find how (UCS-2|UTF-(16|32))(LE|BE)? differ from one another,
+see L<Encode::Unicode>. 
+
+UTF-7 is a special encoding which "re-encodes" UTF-16BE into a 7-bit
+encoding.  It is implemented seperately by Encode::Unicode::UTF7.
+
+=head2 Encode::Byte -- Extended ASCII
+
+Encode::Byte implements most single-byte encodings except for
+Symbols and EBCDIC. The following encodings are based on single-byte
+encodings implemented as extended ASCII.  Most of them map
+\x80-\xff (upper half) to non-ASCII characters.
+
+=over 4
+
+=item ISO-8859 and corresponding vendor mappings
+
+Since there are so many, they are presented in table format with
+languages and corresponding encoding names by vendors.  Note that
+the table is sorted in order of ISO-8859 and the corresponding vendor
+mappings are slightly different from that of ISO.  See
+L<http://czyborra.com/charsets/iso8859.html> for details.
+
+  Lang/Regions  ISO/Other Std.  DOS     Windows Macintosh  Others
+  ----------------------------------------------------------------
+  N. America    (ASCII)         cp437        AdobeStandardEncoding
+                                cp863 (DOSCanadaF)
+  W. Europe     iso-8859-1      cp850   cp1252  MacRoman  nextstep
+                                                         hp-roman8
+                                cp860 (DOSPortuguese)
+  Cntrl. Europe iso-8859-2      cp852   cp1250  MacCentralEurRoman
+                                                MacCroatian
+                                                MacRomanian
+                                                MacRumanian
+  Latin3[1]     iso-8859-3      
+  Latin4[2]     iso-8859-4              
+  Cyrillics     iso-8859-5      cp855   cp1251  MacCyrillic
+    (See also next section)     cp866           MacUkrainian
+  Arabic        iso-8859-6      cp864   cp1256  MacArabic
+                                cp1006          MacFarsi
+  Greek         iso-8859-7      cp737   cp1253  MacGreek
+                                cp869 (DOSGreek2)
+  Hebrew        iso-8859-8      cp862   cp1255  MacHebrew
+  Turkish       iso-8859-9      cp857   cp1254  MacTurkish
+  Nordics       iso-8859-10     cp865
+                                cp861           MacIcelandic
+                                                MacSami
+  Thai          iso-8859-11[3]  cp874           MacThai
+  (iso-8859-12 is nonexistent. Reserved for Indics?)
+  Baltics       iso-8859-13     cp775           cp1257
+  Celtics       iso-8859-14
+  Latin9 [4]    iso-8859-15
+  Latin10       iso-8859-16
+  Vietnamese    viscii                  cp1258  MacVietnamese
+  ----------------------------------------------------------------
+
+  [1] Esperanto, Maltese, and Turkish. Turkish is now on 8859-9.
+  [2] Baltics.  Now on 8859-10, except for Latvian.
+  [3] TIS 620 +  Non-Breaking Space (0xA0 / U+00A0)
+  [4] Nicknamed Latin0; the Euro sign as well as French and Finnish
+      letters that are missing from 8859-1 were added.
+
+All cp* are also available as ibm-*, ms-*, and windows-* .  See also
+L<http://czyborra.com/charsets/codepages.html>.
+
+Macintosh encodings don't seem to be registered in such entities as
+IANA.  "Canonical" names in Encode are based upon Apple's Tech Note
+1150.  See L<http://developer.apple.com/technotes/tn/tn1150.html> 
+for details.
+
+=item KOI8 - De Facto Standard for the Cyrillic world
+
+Though ISO-8859 does have ISO-8859-5, the KOI8 series is far more
+popular in the Net.   L<Encode> comes with the following KOI charsets.
+For gory details, see L<http://czyborra.com/charsets/cyrillic.html>
+
+  ----------------------------------------------------------------
+  koi8-f                                        
+  koi8-r cp878                                           [RFC1489]
+  koi8-u                                                 [RFC2319]
+  ----------------------------------------------------------------
+
+=item gsm0338 - Hentai Latin 1
+
+GSM0338 is for GSM handsets. Though it shares alphanumerals with
+ASCII, control character ranges and other parts are mapped very
+differently, mainly to store Greek characters.  There are also escape
+sequences (starting with 0x1B) to cover e.g. the Euro sign.  Some
+special cases like a trailing 0x00 byte or a lone 0x1B byte are not
+well-defined and decode() will return an empty string for them.
+One possible workaround is
+
+   $gsm =~ s/\x00\z/\x00\x00/;
+   $uni = decode("gsm0338", $gsm);
+   $uni .= "\xA0" if $gsm =~ /\x1B\z/;
+
+Note that the Encode implementation of GSM0338 does not implement the
+reuse of Latin capital letters as Greek capital letters (for example,
+the 0x5A is U+005A (LATIN CAPITAL LETTER Z), not U+0396 (GREEK CAPITAL
+LETTER ZETA).
+
+The GSM0338 is also covered in Encode::Byte even though it is not
+an "extended ASCII" encoding.
+
+=back
+
+=head2 CJK: Chinese, Japanese, Korean (Multibyte)
+
+Note that Vietnamese is listed above.  Also read "Encoding vs Charset"
+below.  Also note that these are implemented in distinct modules by
+countries, due to the size concerns (simplified Chinese is mapped
+to 'CN', continental China, while traditional Chinese is mapped to
+'TW', Taiwan).  Please refer to their respective documentation pages.
+
+=over 4
+
+=item Encode::CN -- Continental China
+
+  Standard      DOS/Win Macintosh                Comment/Reference
+  ----------------------------------------------------------------
+  euc-cn [1]            MacChineseSimp
+  (gbk)         cp936 [2]
+  gb12345-raw                      { GB12345 without CES }
+  gb2312-raw                       { GB2312  without CES }
+  hz
+  iso-ir-165
+  ----------------------------------------------------------------
+
+  [1] GB2312 is aliased to this.  See L<Microsoft-related naming mess>
+  [2] gbk is aliased to this.  See L<Microsoft-related naming mess>
+
+=item Encode::JP -- Japan
+
+  Standard      DOS/Win Macintosh                Comment/Reference
+  ----------------------------------------------------------------
+  euc-jp
+  shiftjis      cp932   macJapanese
+  7bit-jis
+  iso-2022-jp                                            [RFC1468]
+  iso-2022-jp-1                                          [RFC2237]
+  jis0201-raw  { JIS X 0201 (roman + halfwidth kana) without CES }
+  jis0208-raw  { JIS X 0208 (Kanji + fullwidth kana) without CES }
+  jis0212-raw  { JIS X 0212 (Extended Kanji)         without CES }
+  ----------------------------------------------------------------
+
+=item Encode::KR -- Korea
+
+  Standard      DOS/Win Macintosh                Comment/Reference
+  ----------------------------------------------------------------
+  euc-kr                MacKorean                        [RFC1557]
+                cp949 [1]                    
+  iso-2022-kr                                            [RFC1557]
+  johab                                  [KS X 1001:1998, Annex 3]
+  ksc5601-raw                              { KSC5601 without CES }
+  ----------------------------------------------------------------
+
+  [1] ks_c_5601-1987, (x-)?windows-949, and uhc are aliased to this.
+  See below.
+
+=item Encode::TW -- Taiwan
+
+  Standard      DOS/Win Macintosh                Comment/Reference
+  ----------------------------------------------------------------
+  big5-eten     cp950   MacChineseTrad {big5 aliased to big5-eten}
+  big5-hkscs                              
+  ----------------------------------------------------------------
+
+=item Encode::HanExtra -- More Chinese via CPAN
+
+Due to the size concerns, additional Chinese encodings below are
+distributed separately on CPAN, under the name Encode::HanExtra.
+
+  Standard      DOS/Win Macintosh                Comment/Reference
+  ----------------------------------------------------------------
+  big5ext                                   CMEX's Big5e Extension
+  big5plus                                  CMEX's Big5+ Extension
+  cccii         Chinese Character Code for Information Interchange
+  euc-tw                             EUC (Extended Unix Character)
+  gb18030                          GBK with Traditional Characters
+  ----------------------------------------------------------------
+
+=item Encode::JIS2K -- JIS X 0213 encodings via CPAN
+
+Due to size concerns, additional Japanese encodings below are
+distributed separately on CPAN, under the name Encode::JIS2K.
+
+  Standard      DOS/Win Macintosh                Comment/Reference
+  ----------------------------------------------------------------
+  euc-jisx0213
+  shiftjisx0123
+  iso-2022-jp-3
+  jis0213-1-raw
+  jis0213-2-raw
+  ----------------------------------------------------------------
+
+=back
+
+=head2 Miscellaneous encodings
+
+=over 4
+
+=item Encode::EBCDIC
+
+See L<perlebcdic> for details.
+
+  ----------------------------------------------------------------
+  cp37
+  cp500  
+  cp875  
+  cp1026  
+  cp1047  
+  posix-bc
+  ----------------------------------------------------------------
+
+=item Encode::Symbols
+
+For symbols  and dingbats.
+
+  ----------------------------------------------------------------
+  symbol
+  dingbats
+  MacDingbats
+  AdobeZdingbat
+  AdobeSymbol
+  ----------------------------------------------------------------
+
+=item Encode::MIME::Header
+
+Strictly speaking, MIME header encoding documented in RFC 2047 is more
+of encapsulation than encoding.  However, their support in modern
+world is imperative so they are supported.
+
+  ----------------------------------------------------------------
+  MIME-Header                                            [RFC2047]
+  MIME-B                                                 [RFC2047]
+  MIME-Q                                                 [RFC2047]
+  ----------------------------------------------------------------
+
+=item Encode::Guess
+
+This one is not a name of encoding but a utility that lets you pick up
+the most appropriate encoding for a data out of given I<suspects>.  See
+L<Encode::Guess> for details.
+
+=back
+
+=head1 Unsupported encodings
+
+The following encodings are not supported as yet; some because they
+are rarely used, some because of technical difficulties.  They may
+be supported by external modules via CPAN in the future, however.
+
+=over 4
+
+=item   ISO-2022-JP-2 [RFC1554]
+
+Not very popular yet.  Needs Unicode Database or equivalent to
+implement encode() (because it includes JIS X 0208/0212, KSC5601, and
+GB2312 simultaneously, whose code points in Unicode overlap.  So you
+need to lookup the database to determine to what character set a given
+Unicode character should belong). 
+
+=item ISO-2022-CN [RFC1922]
+
+Not very popular.  Needs CNS 11643-1 and -2 which are not available in
+this module.  CNS 11643 is supported (via euc-tw) in Encode::HanExtra.
+Autrijus Tang may add support for this encoding in his module in future.
+
+=item Various HP-UX encodings
+
+The following are unsupported due to the lack of mapping data.
+
+  '8'  - arabic8, greek8, hebrew8, kana8, thai8, and turkish8
+  '15' - japanese15, korean15, and roi15
+
+=item Cyrillic encoding ISO-IR-111
+
+Anton Tagunov doubts its usefulness.
+
+=item ISO-8859-8-1 [Hebrew]
+
+None of the Encode team knows Hebrew enough (ISO-8859-8, cp1255 and
+MacHebrew are supported because and just because there were mappings
+available at L<http://www.unicode.org/>).  Contributions welcome.
+
+=item ISIRI 3342, Iran System, ISIRI 2900 [Farsi]
+
+Ditto.
+
+=item Thai encoding TCVN
+
+Ditto.
+
+=item Vietnamese encodings VPS
+
+Though Jungshik Shin has reported that Mozilla supports this encoding,
+it was too late before 5.8.0 for us to add it.  In the future, it
+may be available via a separate module.  See
+L<http://lxr.mozilla.org/seamonkey/source/intl/uconv/ucvlatin/vps.uf>
+and
+L<http://lxr.mozilla.org/seamonkey/source/intl/uconv/ucvlatin/vps.ut>
+if you are interested in helping us.
+
+=item Various Mac encodings
+
+The following are unsupported due to the lack of mapping data. 
+
+  MacArmenian,  MacBengali,   MacBurmese,   MacEthiopic
+  MacExtArabic, MacGeorgian,  MacKannada,   MacKhmer
+  MacLaotian,   MacMalayalam, MacMongolian, MacOriya
+  MacSinhalese, MacTamil,     MacTelugu,    MacTibetan
+  MacVietnamese
+
+The rest which are already available are based upon the vendor mappings
+at L<http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/> .
+
+=item (Mac) Indic encodings
+
+The maps for the following are available at L<http://www.unicode.org/>
+but remain unsupport because those encodings need algorithmical
+approach, currently unsupported by F<enc2xs>:
+
+  MacDevanagari
+  MacGurmukhi
+  MacGujarati
+
+For details, please see C<Unicode mapping issues and notes:> at
+L<http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/DEVANAGA.TXT> .
+
+I believe this issue is prevalent not only for Mac Indics but also in
+other Indic encodings, but the above were the only Indic encodings
+maps that I could find at L<http://www.unicode.org/> .
+
+=back
+
+=head1 Encoding vs. Charset -- terminology
+
+We are used to using the term (character) I<encoding> and I<character
+set> interchangeably.  But just as confusing the terms byte and
+character is dangerous and the terms should be differentiated when
+needed, we need to differentiate I<encoding> and I<character set>.
+
+To understand that, here is a description of how we make computers
+grok our characters.
+
+=over 4
+
+=item *
+
+First we start with which characters to include.  We call this
+collection of characters I<character repertoire>.
+
+=item *
+
+Then we have to give each character a unique ID so your computer can
+tell the difference between 'a' and 'A'.  This itemized character
+repertoire is now a I<character set>.
+
+=item *
+
+If your computer can grow the character set without further
+processing, you can go ahead and use it.  This is called a I<coded
+character set> (CCS) or I<raw character encoding>.  ASCII is used this
+way for most cases.
+
+=item *
+
+But in many cases, especially multi-byte CJK encodings, you have to
+tweak a little more.  Your network connection may not accept any data
+with the Most Significant Bit set, and your computer may not be able to
+tell if a given byte is a whole character or just half of it.  So you
+have to I<encode> the character set to use it.
+
+A I<character encoding scheme> (CES) determines how to encode a given
+character set, or a set of multiple character sets.  7bit ISO-2022 is
+an example of a CES.  You switch between character sets via I<escape
+sequences>.
+
+=back
+
+Technically, or mathematically, speaking, a character set encoded in
+such a CES that maps character by character may form a CCS.  EUC is such
+an example.  The CES of EUC is as follows:
+
+=over 4
+
+=item *
+
+Map ASCII unchanged.
+
+=item *
+
+Map such a character set that consists of 94 or 96 powered by N
+members by adding 0x80 to each byte.
+
+=item *
+
+You can also use 0x8e and 0x8f to indicate that the following sequence of
+characters belongs to yet another character set.  To each following byte
+is added the value 0x80.
+
+=back
+
+By carefully looking at the encoded byte sequence, you can find that the
+byte sequence conforms a unique number.  In that sense, EUC is a CCS
+generated by a CES above from up to four CCS (complicated?).  UTF-8
+falls into this category.  See L<perlUnicode/"UTF-8"> to find out how
+UTF-8 maps Unicode to a byte sequence.
+
+You may also have found out by now why 7bit ISO-2022 cannot comprise
+a CCS.  If you look at a byte sequence \x21\x21, you can't tell if
+it is two !'s or IDEOGRAPHIC SPACE.  EUC maps the latter to \xA1\xA1
+so you have no trouble differentiating between "!!". and S<"  ">.
+
+=head1 Encoding Classification (by Anton Tagunov and Dan Kogai)
+
+This section tries to classify the supported encodings by their 
+applicability for information exchange over the Internet and to 
+choose the most suitable aliases to name them in the context of 
+such communication.
+
+=over 4
+
+=item * 
+
+To (en|de)code encodings marked by C<(**)>, you need 
+C<Encode::HanExtra>, available from CPAN.
+
+=back
+
+Encoding names
+
+  US-ASCII    UTF-8    ISO-8859-*  KOI8-R
+  Shift_JIS   EUC-JP   ISO-2022-JP ISO-2022-JP-1
+  EUC-KR      Big5     GB2312
+
+are registered with IANA as preferred MIME names and may
+be used over the Internet.
+
+C<Shift_JIS> has been officialized by JIS X 0208:1997.
+L<Microsoft-related naming mess> gives details.
+
+C<GB2312> is the IANA name for C<EUC-CN>.
+See L<Microsoft-related naming mess> for details.
+
+C<GB_2312-80> I<raw> encoding is available as C<gb2312-raw>
+with Encode. See L<Encode::CN> for details.
+
+  EUC-CN
+  KOI8-U        [RFC2319]
+
+have not been registered with IANA (as of March 2002) but
+seem to be supported by major web browsers. 
+The IANA name for C<EUC-CN> is C<GB2312>.
+
+  KS_C_5601-1987
+
+is heavily misused.
+See L<Microsoft-related naming mess> for details.
+
+C<KS_C_5601-1987> I<raw> encoding is available as C<kcs5601-raw>
+with Encode. See L<Encode::KR> for details.
+
+  UTF-16 UTF-16BE UTF-16LE
+
+are IANA-registered C<charset>s. See [RFC 2781] for details.
+Jungshik Shin reports that UTF-16 with a BOM is well accepted
+by MS IE 5/6 and NS 4/6. Beware however that
+
+=over 4
+
+=item *
+
+C<UTF-16> support in any software you're going to be
+using/interoperating with has probably been less tested
+then C<UTF-8> support
+
+=item *
+
+C<UTF-8> coded data seamlessly passes traditional
+command piping (C<cat>, C<more>, etc.) while C<UTF-16> coded
+data is likely to cause confusion (with its zero bytes,
+for example)
+
+=item *
+
+it is beyond the power of words to describe the way HTML browsers
+encode non-C<ASCII> form data. To get a general impression, visit
+L<http://ppewww.ph.gla.ac.uk/~flavell/charset/form-i18n.html>.
+While encoding of form data has stabilized for C<UTF-8> encoded pages
+(at least IE 5/6, NS 6, and Opera 6 behave consistently), be sure to
+expect fun (and cross-browser discrepancies) with C<UTF-16> encoded
+pages!
+
+=back
+
+The rule of thumb is to use C<UTF-8> unless you know what
+you're doing and unless you really benefit from using C<UTF-16>.
+
+  ISO-IR-165    [RFC1345]
+  VISCII
+  GB 12345
+  GB 18030 (**)  (see links bellow)
+  EUC-TW   (**)
+
+are totally valid encodings but not registered at IANA.
+The names under which they are listed here are probably the
+most widely-known names for these encodings and are recommended
+names.
+
+  BIG5PLUS (**)
+
+is a proprietary name. 
+
+=head2 Microsoft-related naming mess
+
+Microsoft products misuse the following names:
+
+=over 4
+
+=item KS_C_5601-1987
+
+Microsoft extension to C<EUC-KR>.
+
+Proper names: C<CP949>, C<UHC>, C<x-windows-949> (as used by Mozilla).
+
+See L<http://lists.w3.org/Archives/Public/ietf-charsets/2001AprJun/0033.html>
+for details.
+
+Encode aliases C<KS_C_5601-1987> to C<cp949> to reflect this common
+misusage. I<Raw> C<KS_C_5601-1987> encoding is available as
+C<kcs5601-raw>.
+
+See L<Encode::KR> for details.
+
+=item GB2312
+
+Microsoft extension to C<EUC-CN>.
+
+Proper names: C<CP936>, C<GBK>.
+
+C<GB2312> has been registered in the C<EUC-CN> meaning at
+IANA. This has partially repaired the situation: Microsoft's 
+C<GB2312> has become a superset of the official C<GB2312>.
+
+Encode aliases C<GB2312> to C<euc-cn> in full agreement with
+IANA registration. C<cp936> is supported separately.
+I<Raw> C<GB_2312-80> encoding is available as C<gb2312-raw>.
+
+See L<Encode::CN> for details.
+
+=item Big5
+
+Microsoft extension to C<Big5>.
+
+Proper name: C<CP950>.
+
+Encode separately supports C<Big5> and C<cp950>.
+
+=item Shift_JIS
+
+Microsoft's understanding of C<Shift_JIS>.
+
+JIS has not endorsed the full Microsoft standard however.
+The official C<Shift_JIS> includes only JIS X 0201 and JIS X 0208
+character sets, while Microsoft has always used C<Shift_JIS>
+to encode a wider character repertoire. See C<IANA> registration for
+C<Windows-31J>.
+
+As a historical predecessor, Microsoft's variant
+probably has more rights for the name, though it may be objected
+that Microsoft shouldn't have used JIS as part of the name
+in the first place.
+
+Unambiguous name: C<CP932>. C<IANA> name (also used by Mozilla, and
+provided as an alias by Encode): C<Windows-31J>.
+
+Encode separately supports C<Shift_JIS> and C<cp932>.
+
+=back
+
+=head1 Glossary
+
+=over 4
+
+=item character repertoire
+
+A collection of unique characters.  A I<character> set in the strictest
+sense. At this stage, characters are not numbered.
+
+=item coded character set (CCS)
+
+A character set that is mapped in a way computers can use directly.
+Many character encodings, including EUC, fall in this category.
+
+=item character encoding scheme (CES)
+
+An algorithm to map a character set to a byte sequence.  You don't
+have to be able to tell which character set a given byte sequence
+belongs.  7-bit ISO-2022 is a CES but it cannot be a CCS.  EUC is an
+example of being both a CCS and CES.
+
+=item charset (in MIME context)
+
+has long been used in the meaning of C<encoding>, CES.
+
+While the word combination C<character set> has lost this meaning
+in MIME context since [RFC 2130], the C<charset> abbreviation has
+retained it. This is how [RFC 2277] and [RFC 2278] bless C<charset>:
+
+ This document uses the term "charset" to mean a set of rules for
+ mapping from a sequence of octets to a sequence of characters, such
+ as the combination of a coded character set and a character encoding
+ scheme; this is also what is used as an identifier in MIME "charset="
+ parameters, and registered in the IANA charset registry ...  (Note
+ that this is NOT a term used by other standards bodies, such as ISO).
+ [RFC 2277]
+
+=item EUC
+
+Extended Unix Character.  See ISO-2022.
+
+=item ISO-2022
+
+A CES that was carefully designed to coexist with ASCII.  There are a 7
+bit version and an 8 bit version.  
+
+The 7 bit version switches character set via escape sequence so it
+cannot form a CCS.  Since this is more difficult to handle in programs
+than the 8 bit version, the 7 bit version is not very popular except for
+iso-2022-jp, the I<de facto> standard CES for e-mails.
+
+The 8 bit version can form a CCS.  EUC and ISO-8859 are two examples
+thereof.  Pre-5.6 perl could use them as string literals.
+
+=item UCS
+
+Short for I<Universal Character Set>.  When you say just UCS, it means
+I<Unicode>.
+
+=item UCS-2
+
+ISO/IEC 10646 encoding form: Universal Character Set coded in two
+octets.
+
+=item Unicode
+
+A character set that aims to include all character repertoires of the
+world.  Many character sets in various national as well as industrial
+standards have become, in a way, just subsets of Unicode.
+
+=item UTF
+
+Short for I<Unicode Transformation Format>.  Determines how to map a
+Unicode character into a byte sequence.
+
+=item UTF-16
+
+A UTF in 16-bit encoding.  Can either be in big endian or little
+endian.  The big endian version is called UTF-16BE (equal to UCS-2 + 
+surrogate support) and the little endian version is called UTF-16LE.
+
+=back
+
+=head1 See Also
+
+L<Encode>, 
+L<Encode::Byte>, 
+L<Encode::CN>, L<Encode::JP>, L<Encode::KR>, L<Encode::TW>,
+L<Encode::EBCDIC>, L<Encode::Symbol>
+L<Encode::MIME::Header>, L<Encode::Guess>
+
+=head1 References
+
+=over 4
+
+=item ECMA
+
+European Computer Manufacturers Association
+L<http://www.ecma.ch>
+
+=over 4
+
+=item ECMA-035 (eq C<ISO-2022>)
+
+L<http://www.ecma.ch/ecma1/STAND/ECMA-035.HTM> 
+
+The specification of ISO-2022 is available from the link above.
+
+=back
+
+=item IANA
+
+Internet Assigned Numbers Authority
+L<http://www.iana.org/>
+
+=over 4
+
+=item Assigned Charset Names by IANA
+
+L<http://www.iana.org/assignments/character-sets>
+
+Most of the C<canonical names> in Encode derive from this list
+so you can directly apply the string you have extracted from MIME
+header of mails and web pages.
+
+=back
+
+=item ISO
+
+International Organization for Standardization
+L<http://www.iso.ch/>
+
+=item RFC
+
+Request For Comments -- need I say more?
+L<http://www.rfc-editor.org/>, L<http://www.rfc.net/>,
+L<http://www.faqs.org/rfcs/>
+
+=item UC
+
+Unicode Consortium
+L<http://www.unicode.org/>
+
+=over 4
+
+=item Unicode Glossary
+
+L<http://www.unicode.org/glossary/>
+
+The glossary of this document is based upon this site.
+
+=back
+
+=back
+
+=head2 Other Notable Sites
+
+=over 4
+
+=item czyborra.com
+
+L<http://czyborra.com/>
+
+Contains a lot of useful information, especially gory details of ISO
+vs. vendor mappings.
+
+=item CJK.inf
+
+L<http://www.oreilly.com/people/authors/lunde/cjk_inf.html>
+
+Somewhat obsolete (last update in 1996), but still useful.  Also try
+
+L<ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/pdf/GB18030_Summary.pdf>
+
+You will find brief info on C<EUC-CN>, C<GBK> and mostly on C<GB 18030>.
+
+=item Jungshik Shin's Hangul FAQ
+
+L<http://jshin.net/faq>
+
+And especially its subject 8.
+
+L<http://jshin.net/faq/qa8.html>
+
+A comprehensive overview of the Korean (C<KS *>) standards.
+
+=item debian.org: "Introduction to i18n"
+
+A brief description for most of the mentioned CJK encodings is
+contained in
+L<http://www.debian.org/doc/manuals/intro-i18n/ch-codes.en.html>
+
+=back
+
+=head2 Offline sources
+
+=over 4
+
+=item C<CJKV Information Processing> by Ken Lunde
+
+CJKV Information Processing
+1999 O'Reilly & Associates, ISBN : 1-56592-224-7
+
+The modern successor of C<CJK.inf>.
+
+Features a comprehensive coverage of CJKV character sets and
+encodings along with many other issues faced by anyone trying
+to better support CJKV languages/scripts in all the areas of
+information processing.
+
+To purchase this book, visit
+L<http://www.oreilly.com/catalog/cjkvinfo/>
+or your favourite bookstore.
+
+=back
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Symbol.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Symbol.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Symbol.pm	(revision 14489)
@@ -0,0 +1,42 @@
+package Encode::Symbol;
+use Encode;
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use XSLoader;
+XSLoader::load(__PACKAGE__,$VERSION);
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Symbol - Symbol Encodings
+
+=head1 SYNOPSIS
+
+    use Encode qw/encode decode/; 
+    $symbol  = encode("symbol", $utf8); # loads Encode::Symbol implicitly
+    $utf8 = decode("", $symbol);        # ditto
+
+=head1 ABSTRACT
+
+This module implements symbol and dingbats encodings.  Encodings
+supported are as follows.   
+
+  Canonical   Alias		Description
+  --------------------------------------------------------------------
+  symbol
+  dingbats
+  AdobeZDingbat
+  AdobeSymbol
+  MacDingbats
+
+=head1 DESCRIPTION
+
+To find out how to use this module in detail, see L<Encode>.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/TW.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/TW.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/TW.pm	(revision 14489)
@@ -0,0 +1,78 @@
+package Encode::TW;
+BEGIN {
+    if (ord("A") == 193) {
+	die "Encode::TW not supported on EBCDIC\n";
+    }
+}
+our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use Encode;
+use XSLoader;
+XSLoader::load(__PACKAGE__,$VERSION);
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::TW - Taiwan-based Chinese Encodings
+
+=head1 SYNOPSIS
+
+    use Encode qw/encode decode/; 
+    $big5 = encode("big5", $utf8); # loads Encode::TW implicitly
+    $utf8 = decode("big5", $big5); # ditto
+
+=head1 DESCRIPTION
+
+This module implements tradition Chinese charset encodings as used
+in Taiwan and Hong Kong.
+Encodings supported are as follows.
+
+  Canonical   Alias		Description
+  --------------------------------------------------------------------
+  big5-eten   /\bbig-?5$/i	Big5 encoding (with ETen extensions)
+	      /\bbig5-?et(en)?$/i
+	      /\btca-?big5$/i
+  big5-hkscs  /\bbig5-?hk(scs)?$/i
+              /\bhk(scs)?-?big5$/i
+                                Big5 + Cantonese characters in Hong Kong
+  MacChineseTrad		Big5 + Apple Vendor Mappings
+  cp950		                Code Page 950 
+                                = Big5 + Microsoft vendor mappings
+  --------------------------------------------------------------------
+
+To find out how to use this module in detail, see L<Encode>.
+
+=head1 NOTES
+
+Due to size concerns, C<EUC-TW> (Extended Unix Character), C<CCCII>
+(Chinese Character Code for Information Interchange), C<BIG5PLUS>
+(CMEX's Big5+) and C<BIG5EXT> (CMEX's Big5e) are distributed separately
+on CPAN, under the name L<Encode::HanExtra>. That module also contains
+extra China-based encodings.
+
+=head1 BUGS
+
+Since the original C<big5> encoding (1984) is not supported anywhere
+(glibc and DOS-based systems uses C<big5> to mean C<big5-eten>; Microsoft
+uses C<big5> to mean C<cp950>), a conscious decision was made to alias
+C<big5> to C<big5-eten>, which is the de facto superset of the original
+big5.
+
+The C<CNS11643> encoding files are not complete. For common C<CNS11643>
+manipulation, please use C<EUC-TW> in L<Encode::HanExtra>, which contains
+planes 1-7.
+
+The ASCII region (0x00-0x7f) is preserved for all encodings, even
+though this conflicts with mappings by the Unicode Consortium.  See
+
+L<http://www.debian.or.jp/~kubota/unicode-symbols.html.en>
+
+to find out why it is implemented that way.
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Unicode.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Unicode.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Unicode.pm	(revision 14489)
@@ -0,0 +1,268 @@
+package Encode::Unicode;
+
+use strict;
+use warnings;
+no warnings 'redefine';
+
+our $VERSION = do { my @r = (q$Revision: 2.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use XSLoader;
+XSLoader::load(__PACKAGE__,$VERSION);
+
+#
+# Object Generator 8 transcoders all at once!
+#
+
+require Encode;
+
+our %BOM_Unknown = map {$_ => 1} qw(UTF-16 UTF-32);
+
+for my $name (qw(UTF-16 UTF-16BE UTF-16LE
+                 UTF-32 UTF-32BE UTF-32LE
+                        UCS-2BE  UCS-2LE))
+{
+    my ($size, $endian, $ucs2, $mask);
+    $name =~ /^(\w+)-(\d+)(\w*)$/o;
+    if ($ucs2 = ($1 eq 'UCS')){
+	$size = 2;
+    }else{
+	$size = $2/8;
+    }
+    $endian = ($3 eq 'BE') ? 'n' : ($3 eq 'LE') ? 'v' : '' ;
+    $size == 4 and $endian = uc($endian);
+
+    $Encode::Encoding{$name} = 	
+	bless {
+	       Name   =>   $name,
+	       size   =>   $size,
+	       endian => $endian,
+	       ucs2   =>   $ucs2,
+	      } => __PACKAGE__;
+}
+
+use base qw(Encode::Encoding);
+
+sub renew { 
+    my $self = shift;
+    $BOM_Unknown{$self->name} or return $self;
+    my $clone = bless { %$self } => ref($self);
+    $clone->{renewed}++; # so the caller knows it is renewed.
+    return $clone;
+}
+
+# There used to be a perl implemntation of (en|de)code but with
+# XS version is ripe, perl version is zapped for optimal speed
+
+*decode = \&decode_xs;
+*encode = \&encode_xs;
+
+1;
+__END__
+
+=head1 NAME
+
+Encode::Unicode -- Various Unicode Transformation Formats
+
+=cut
+
+=head1 SYNOPSIS
+
+    use Encode qw/encode decode/; 
+    $ucs2 = encode("UCS-2BE", $utf8);
+    $utf8 = decode("UCS-2BE", $ucs2);
+
+=head1 ABSTRACT
+
+This module implements all Character Encoding Schemes of Unicode that
+are officially documented by Unicode Consortium (except, of course,
+for UTF-8, which is a native format in perl).
+
+=over 4
+
+=item L<http://www.unicode.org/glossary/> says:
+
+I<Character Encoding Scheme> A character encoding form plus byte
+serialization. There are Seven character encoding schemes in Unicode:
+UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32 (UCS-4), UTF-32BE (UCS-4BE) and
+UTF-32LE (UCS-4LE), and UTF-7.
+
+Since UTF-7 is a 7-bit (re)encoded version of UTF-16BE, It is not part of
+Unicode's Character Encoding Scheme.  It is separately implemented in
+Encode::Unicode::UTF7.  For details see L<Encode::Unicode::UTF7>.
+
+=item Quick Reference
+
+                Decodes from ord(N)           Encodes chr(N) to...
+       octet/char BOM S.P d800-dfff  ord > 0xffff     \x{1abcd} ==
+  ---------------+-----------------+------------------------------
+  UCS-2BE	2   N   N  is bogus                  Not Available
+  UCS-2LE       2   N   N     bogus                  Not Available
+  UTF-16      2/4   Y   Y  is   S.P           S.P            BE/LE
+  UTF-16BE    2/4   N   Y       S.P           S.P    0xd82a,0xdfcd
+  UTF-16LE	2   N   Y       S.P           S.P    0x2ad8,0xcddf
+  UTF-32	4   Y   -  is bogus         As is            BE/LE
+  UTF-32BE	4   N   -     bogus         As is       0x0001abcd
+  UTF-32LE	4   N   -     bogus         As is       0xcdab0100
+  UTF-8       1-4   -   -     bogus   >= 4 octets   \xf0\x9a\af\8d
+  ---------------+-----------------+------------------------------
+
+=back
+
+=head1 Size, Endianness, and BOM
+
+You can categorize these CES by 3 criteria:  size of each character,
+endianness, and Byte Order Mark.
+
+=head2 by size
+
+UCS-2 is a fixed-length encoding with each character taking 16 bits.
+It B<does not> support I<surrogate pairs>.  When a surrogate pair
+is encountered during decode(), its place is filled with \x{FFFD}
+if I<CHECK> is 0, or the routine croaks if I<CHECK> is 1.  When a
+character whose ord value is larger than 0xFFFF is encountered,
+its place is filled with \x{FFFD} if I<CHECK> is 0, or the routine
+croaks if I<CHECK> is 1.
+
+UTF-16 is almost the same as UCS-2 but it supports I<surrogate pairs>.
+When it encounters a high surrogate (0xD800-0xDBFF), it fetches the
+following low surrogate (0xDC00-0xDFFF) and C<desurrogate>s them to
+form a character.  Bogus surrogates result in death.  When \x{10000}
+or above is encountered during encode(), it C<ensurrogate>s them and
+pushes the surrogate pair to the output stream.
+
+UTF-32 (UCS-4) is a fixed-length encoding with each character taking 32 bits.
+Since it is 32-bit, there is no need for I<surrogate pairs>.
+
+=head2 by endianness
+
+The first (and now failed) goal of Unicode was to map all character
+repertoires into a fixed-length integer so that programmers are happy.
+Since each character is either a I<short> or I<long> in C, you have to
+pay attention to the endianness of each platform when you pass data
+to one another.
+
+Anything marked as BE is Big Endian (or network byte order) and LE is
+Little Endian (aka VAX byte order).  For anything not marked either
+BE or LE, a character called Byte Order Mark (BOM) indicating the
+endianness is prepended to the string.
+
+CAVEAT: Though BOM in utf8 (\xEF\xBB\xBF) is valid, it is meaningless
+and as of this writing Encode suite just leave it as is (\x{FeFF}).
+
+=over 4
+
+=item BOM as integer when fetched in network byte order
+
+              16         32 bits/char
+  -------------------------
+  BE      0xFeFF 0x0000FeFF
+  LE      0xFFeF 0xFFFe0000
+  -------------------------
+
+=back
+
+This modules handles the BOM as follows.
+
+=over 4
+
+=item *
+
+When BE or LE is explicitly stated as the name of encoding, BOM is
+simply treated as a normal character (ZERO WIDTH NO-BREAK SPACE).
+
+=item *
+
+When BE or LE is omitted during decode(), it checks if BOM is at the
+beginning of the string; if one is found, the endianness is set to
+what the BOM says.  If no BOM is found, the routine dies.
+
+=item *
+
+When BE or LE is omitted during encode(), it returns a BE-encoded
+string with BOM prepended.  So when you want to encode a whole text
+file, make sure you encode() the whole text at once, not line by line
+or each line, not file, will have a BOM prepended.
+
+=item *
+
+C<UCS-2> is an exception.  Unlike others, this is an alias of UCS-2BE.
+UCS-2 is already registered by IANA and others that way.
+
+=back
+
+=head1 Surrogate Pairs
+
+To say the least, surrogate pairs were the biggest mistake of the
+Unicode Consortium.  But according to the late Douglas Adams in I<The
+Hitchhiker's Guide to the Galaxy> Trilogy, C<In the beginning the
+Universe was created. This has made a lot of people very angry and
+been widely regarded as a bad move>.  Their mistake was not of this
+magnitude so let's forgive them.
+
+(I don't dare make any comparison with Unicode Consortium and the
+Vogons here ;)  Or, comparing Encode to Babel Fish is completely
+appropriate -- if you can only stick this into your ear :)
+
+Surrogate pairs were born when the Unicode Consortium finally
+admitted that 16 bits were not big enough to hold all the world's
+character repertoires.  But they already made UCS-2 16-bit.  What
+do we do?
+
+Back then, the range 0xD800-0xDFFF was not allocated.  Let's split
+that range in half and use the first half to represent the C<upper
+half of a character> and the second half to represent the C<lower
+half of a character>.  That way, you can represent 1024 * 1024 =
+1048576 more characters.  Now we can store character ranges up to
+\x{10ffff} even with 16-bit encodings.  This pair of half-character is
+now called a I<surrogate pair> and UTF-16 is the name of the encoding
+that embraces them.
+
+Here is a formula to ensurrogate a Unicode character \x{10000} and
+above;
+
+  $hi = ($uni - 0x10000) / 0x400 + 0xD800;
+  $lo = ($uni - 0x10000) % 0x400 + 0xDC00;
+
+And to desurrogate;
+
+ $uni = 0x10000 + ($hi - 0xD800) * 0x400 + ($lo - 0xDC00);
+
+Note this move has made \x{D800}-\x{DFFF} into a forbidden zone but
+perl does not prohibit the use of characters within this range.  To perl, 
+every one of \x{0000_0000} up to \x{ffff_ffff} (*) is I<a character>.
+
+  (*) or \x{ffff_ffff_ffff_ffff} if your perl is compiled with 64-bit
+  integer support!
+
+=head1 Error Checking
+
+Unlike most encodings which accept various ways to handle errors,
+Unicode encodings simply croaks.
+
+  % perl -MEncode -e '$_ = "\xfe\xff\xd8\xd9\xda\xdb\0\n"' \
+         -e 'Encode::from_to($_, "utf16","shift_jis", 0); print'
+  UTF-16:Malformed LO surrogate d8d9 at /path/to/Encode.pm line 184.
+  % perl -MEncode -e '$a = "BOM missing"' \
+         -e ' Encode::from_to($a, "utf16", "shift_jis", 0); print'
+  UTF-16:Unrecognised BOM 424f at /path/to/Encode.pm line 184.
+
+Unlike other encodings where mappings are not one-to-one against
+Unicode, UTFs are supposed to map 100% against one another.  So Encode
+is more strict on UTFs.
+
+Consider that "division by zero" of Encode :)
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::Unicode::UTF7>, L<http://www.unicode.org/glossary/>,
+L<http://www.unicode.org/unicode/faq/utf_bom.html>,
+
+RFC 2781 L<http://rfc.net/rfc2781.html>,
+
+The whole Unicode standard L<http://www.unicode.org/unicode/uni2book/u2.html>
+
+Ch. 15, pp. 403 of C<Programming Perl (3rd Edition)>
+by Larry Wall, Tom Christiansen, Jon Orwant; 
+O'Reilly & Associates; ISBN 0-596-00027-8
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/Unicode/UTF7.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/Unicode/UTF7.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/Unicode/UTF7.pm	(revision 14489)
@@ -0,0 +1,118 @@
+#
+# $Id: UTF7.pm,v 2.1 2004/05/25 16:27:14 dankogai Exp $
+#
+package Encode::Unicode::UTF7;
+use strict;
+no warnings 'redefine';
+use base qw(Encode::Encoding);
+__PACKAGE__->Define('UTF-7');
+our $VERSION = do { my @r = (q$Revision: 2.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+use MIME::Base64;
+use Encode;
+
+#
+# Algorithms taken from Unicode::String by Gisle Aas
+#
+
+our $OPTIONAL_DIRECT_CHARS = 1;
+my $specials =   quotemeta "\'(),-./:?";
+$OPTIONAL_DIRECT_CHARS and
+    $specials .= quotemeta "!\"#$%&*;<=>@[]^_`{|}";
+# \s will not work because it matches U+3000 DEOGRAPHIC SPACE
+# We use qr/[\n\r\t\ ] instead 
+my $re_asis =     qr/(?:[\n\r\t\ A-Za-z0-9$specials])/;
+my $re_encoded = qr/(?:[^\n\r\t\ A-Za-z0-9$specials])/;
+my $e_utf16 = find_encoding("UTF-16BE");
+
+sub needs_lines { 1 };
+
+sub encode($$;$){
+    my ($obj, $str, $chk) = @_;
+    my $len = length($str);
+    pos($str) = 0;
+    my $bytes = '';
+    while (pos($str) < $len){
+	if    ($str =~ /\G($re_asis+)/ogc){
+	    $bytes .= $1;
+	}elsif($str =~ /\G($re_encoded+)/ogsc){
+	    if ($1 eq "+"){
+		$bytes .= "+-";
+	    }else{
+		my $s = $1;
+		my $base64 = encode_base64($e_utf16->encode($s), '');
+		$base64 =~ s/=+$//;
+		$bytes .= "+$base64-";
+	    }
+	}else{
+	    die "This should not happen! (pos=" . pos($str) . ")";
+	}
+    }
+    $_[1] = '' if $chk;
+    return $bytes;
+}
+	   
+sub decode{
+    my ($obj, $bytes, $chk) = @_;
+    my $len = length($bytes);
+    my $str = "";
+    while (pos($bytes) < $len) {
+	if    ($bytes =~ /\G([^+]+)/ogc) {
+	    $str .= $1;
+	}elsif($bytes =~ /\G\+-/ogc) {
+	    $str .= "+";
+	}elsif($bytes =~ /\G\+([A-Za-z0-9+\/]+)-?/ogsc) {
+	    my $base64 = $1;
+	    my $pad = length($base64) % 4;
+	    $base64 .= "=" x (4 - $pad) if $pad;
+	    $str .= $e_utf16->decode(decode_base64($base64));
+	}elsif($bytes =~ /\G\+/ogc) {
+	    $^W and warn "Bad UTF7 data escape";
+	    $str .= "+";
+	}else{
+	    die "This should not happen " . pos($bytes);
+	}
+    }
+    $_[1] = '' if $chk;
+    return $str;
+}
+1;
+__END__
+
+=head1 NAME
+
+Encode::Unicode::UTF7 -- UTF-7 encoding
+
+=head1 SYNOPSIS
+
+    use Encode qw/encode decode/; 
+    $utf7 = encode("UTF-7", $utf8);
+    $utf8 = decode("UTF-7", $ucs2);
+
+=head1 ABSTRACT
+
+This module implements UTF-7 encoding documented in RFC 2152.  UTF-7,
+as its name suggests, is a 7-bit re-encoded version of UTF-16BE.  It
+is designed to be MTA-safe and expected to be a standard way to
+exchange Unicoded mails via mails.  But with the advent of UTF-8 and
+8-bit compliant MTAs, UTF-7 is hardly ever used.
+
+UTF-7 was not supported by Encode until version 1.95 because of that.
+But Unicode::String, a module by Gisle Aas which adds Unicode supports
+to non-utf8-savvy perl did support UTF-7, the UTF-7 support was added
+so Encode can supersede Unicode::String 100%.
+
+=head1 In Practice
+
+When you want to encode Unicode for mails and web pages, however, do
+not use UTF-7 unless you are sure your recipients and readers can
+handle it.  Very few MUAs and WWW Browsers support these days (only
+Mozilla seems to support one).  For general cases, use UTF-8 for
+message body and MIME-Header for header instead.
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::Unicode>, L<Unicode::String>
+
+RFC 2781 L<http://www.ietf.org/rfc/rfc2152.txt>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/_PM.e2x
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/_PM.e2x	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/_PM.e2x	(revision 14489)
@@ -0,0 +1,23 @@
+package Encode::$_Name_;
+our $VERSION = "0.01";
+ 
+use Encode;
+use XSLoader;
+XSLoader::load(__PACKAGE__,$VERSION);
+
+1;
+__END__
+
+=head1 NAME
+ 
+Encode::$_Name_ - New Encoding
+ 
+=head1 SYNOPSIS
+
+You got to fill this in!
+
+=head1 SEE ALSO
+
+L<Encode>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/_T.e2x
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/_T.e2x	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/_T.e2x	(revision 14489)
@@ -0,0 +1,7 @@
+use strict;
+# Adjust the number here!
+use Test::More tests => 2;
+
+use_ok('Encode');
+use_ok('Encode::$_Name_');
+# Add more test here!
Index: /for-distributions/trunk/bin/windows/perl/lib/Encode/encode.h
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Encode/encode.h	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Encode/encode.h	(revision 14489)
@@ -0,0 +1,111 @@
+#ifndef ENCODE_H
+#define ENCODE_H
+
+#ifndef U8
+/* 
+   A tad devious this:
+   perl normally has a #define for U8 - if that isn't present then we
+   typedef it - leaving it #ifndef so we can do data parts without
+   getting extern references to the code parts
+*/
+typedef unsigned char U8;
+#endif
+
+typedef struct encpage_s encpage_t;
+
+struct encpage_s
+{
+	/* fields ordered to pack nicely on 32-bit machines */
+	const U8   *seq;       /* Packed output sequences we generate 
+				  if we match */
+	encpage_t  *next;      /* Page to go to if we match */
+	U8         min;        /* Min value of octet to match this entry */
+	U8         max;        /* Max value of octet to match this entry */
+	U8         dlen;       /* destination length - 
+				  size of entries in seq */
+	U8         slen;       /* source length - 
+				  number of source octets needed */
+};
+
+/*
+  At any point in a translation there is a page pointer which points
+  at an array of the above structures.
+
+  Basic operation :
+  get octet from source stream.
+  if (octet >= min && octet < max) {
+    if slen is 0 then we cannot represent this character.
+    if we have less than slen octets (including this one) then 
+      we have a partial character.
+    otherwise
+      copy dlen octets from seq + dlen*(octet-min) to output
+      (dlen may be zero if we don't know yet.)
+      load page pointer with next to continue.
+      (is slen is one this is end of a character)
+      get next octet.
+  }
+  else {
+    increment the page pointer to look at next slot in the array
+  }
+
+  arrays SHALL be constructed so there is an entry which matches
+  ..0xFF at the end, and either maps it or indicates no
+  representation.
+
+  if MSB of slen is set then mapping is an approximate "FALLBACK" entry.
+
+*/
+
+
+typedef struct encode_s encode_t;
+struct encode_s
+{
+	encpage_t  *t_utf8;    /* Starting table for translation from 
+				  the encoding to UTF-8 form */
+	encpage_t  *f_utf8;    /* Starting table for translation 
+				  from UTF-8 to the encoding */
+	const U8   *rep;       /* Replacement character in this encoding 
+				  e.g. "?" */
+	int        replen;     /* Number of octets in rep */
+	U8         min_el;     /* Minimum octets to represent a character */
+	U8         max_el;     /* Maximum octets to represent a character */
+	const char *name[2];   /* name(s) of this encoding */
+};
+
+#ifdef U8
+/* See comment at top of file for deviousness */
+
+extern int do_encode(encpage_t *enc, const U8 *src, STRLEN *slen,
+                     U8 *dst, STRLEN dlen, STRLEN *dout, int approx,
+		     const U8 *term, STRLEN tlen);
+
+extern void Encode_DefineEncoding(encode_t *enc);
+
+#endif /* U8 */
+
+#define ENCODE_NOSPACE  1
+#define ENCODE_PARTIAL  2
+#define ENCODE_NOREP    3
+#define ENCODE_FALLBACK 4
+#define ENCODE_FOUND_TERM 5
+
+#define FBCHAR_UTF8		"\xEF\xBF\xBD"
+
+#define  ENCODE_DIE_ON_ERR     0x0001 /* croaks immediately */
+#define  ENCODE_WARN_ON_ERR    0x0002 /* warn on error; may proceed */
+#define  ENCODE_RETURN_ON_ERR  0x0004 /* immediately returns on NOREP */
+#define  ENCODE_LEAVE_SRC      0x0008 /* $src updated unless set */
+#define  ENCODE_PERLQQ         0x0100 /* perlqq fallback string */
+#define  ENCODE_HTMLCREF       0x0200 /* HTML character ref. fb mode */
+#define  ENCODE_XMLCREF        0x0400 /* XML  character ref. fb mode */
+#define  ENCODE_STOP_AT_PARTIAL 0x0800 /* stop at partial explicitly */
+
+#define  ENCODE_FB_DEFAULT     0x0000
+#define  ENCODE_FB_CROAK       0x0001
+#define  ENCODE_FB_QUIET       ENCODE_RETURN_ON_ERR
+#define  ENCODE_FB_WARN        (ENCODE_RETURN_ON_ERR|ENCODE_WARN_ON_ERR)
+#define  ENCODE_FB_PERLQQ      (ENCODE_PERLQQ|ENCODE_LEAVE_SRC)
+#define  ENCODE_FB_HTMLCREF    (ENCODE_HTMLCREF|ENCODE_LEAVE_SRC)
+#define  ENCODE_FB_XMLCREF     (ENCODE_XMLCREF|ENCODE_LEAVE_SRC)
+
+#endif /* ENCODE_H */
Index: /for-distributions/trunk/bin/windows/perl/lib/English.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/English.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/English.pm	(revision 14489)
@@ -0,0 +1,231 @@
+package English;
+
+our $VERSION = '1.02';
+
+require Exporter;
+@ISA = (Exporter);
+
+=head1 NAME
+
+English - use nice English (or awk) names for ugly punctuation variables
+
+=head1 SYNOPSIS
+
+    use English qw( -no_match_vars ) ;  # Avoids regex performance penalty
+    use English;
+    ...
+    if ($ERRNO =~ /denied/) { ... }
+
+=head1 DESCRIPTION
+
+This module provides aliases for the built-in variables whose
+names no one seems to like to read.  Variables with side-effects
+which get triggered just by accessing them (like $0) will still 
+be affected.
+
+For those variables that have an B<awk> version, both long
+and short English alternatives are provided.  For example, 
+the C<$/> variable can be referred to either $RS or 
+$INPUT_RECORD_SEPARATOR if you are using the English module.
+
+See L<perlvar> for a complete list of these.
+
+=head1 PERFORMANCE
+
+This module can provoke sizeable inefficiencies for regular expressions,
+due to unfortunate implementation details.  If performance matters in
+your application and you don't need $PREMATCH, $MATCH, or $POSTMATCH,
+try doing
+
+   use English qw( -no_match_vars ) ;
+
+.  B<It is especially important to do this in modules to avoid penalizing
+all applications which use them.>
+
+=cut
+
+no warnings;
+
+my $globbed_match ;
+
+# Grandfather $NAME import
+sub import {
+    my $this = shift;
+    my @list = grep { ! /^-no_match_vars$/ } @_ ;
+    local $Exporter::ExportLevel = 1;
+    if ( @_ == @list ) {
+        *EXPORT = \@COMPLETE_EXPORT ;
+        $globbed_match ||= (
+	    eval q{
+		*MATCH				= *&	;
+		*PREMATCH			= *`	;
+		*POSTMATCH			= *'	;
+		1 ;
+	       }
+	    || do {
+		require Carp ;
+		Carp::croak "Can't create English for match leftovers: $@" ;
+	    }
+	) ;
+    }
+    else {
+        *EXPORT = \@MINIMAL_EXPORT ;
+    }
+    Exporter::import($this,grep {s/^\$/*/} @list);
+}
+
+@MINIMAL_EXPORT = qw(
+	*ARG
+	*LAST_PAREN_MATCH
+	*INPUT_LINE_NUMBER
+	*NR
+	*INPUT_RECORD_SEPARATOR
+	*RS
+	*OUTPUT_AUTOFLUSH
+	*OUTPUT_FIELD_SEPARATOR
+	*OFS
+	*OUTPUT_RECORD_SEPARATOR
+	*ORS
+	*LIST_SEPARATOR
+	*SUBSCRIPT_SEPARATOR
+	*SUBSEP
+	*FORMAT_PAGE_NUMBER
+	*FORMAT_LINES_PER_PAGE
+	*FORMAT_LINES_LEFT
+	*FORMAT_NAME
+	*FORMAT_TOP_NAME
+	*FORMAT_LINE_BREAK_CHARACTERS
+	*FORMAT_FORMFEED
+	*CHILD_ERROR
+	*OS_ERROR
+	*ERRNO
+	*EXTENDED_OS_ERROR
+	*EVAL_ERROR
+	*PROCESS_ID
+	*PID
+	*REAL_USER_ID
+	*UID
+	*EFFECTIVE_USER_ID
+	*EUID
+	*REAL_GROUP_ID
+	*GID
+	*EFFECTIVE_GROUP_ID
+	*EGID
+	*PROGRAM_NAME
+	*PERL_VERSION
+	*ACCUMULATOR
+	*COMPILING
+	*DEBUGGING
+	*SYSTEM_FD_MAX
+	*INPLACE_EDIT
+	*PERLDB
+	*BASETIME
+	*WARNING
+	*EXECUTABLE_NAME
+	*OSNAME
+	*LAST_REGEXP_CODE_RESULT
+	*EXCEPTIONS_BEING_CAUGHT
+	*LAST_SUBMATCH_RESULT
+	@LAST_MATCH_START
+	@LAST_MATCH_END
+);
+
+
+@MATCH_EXPORT = qw(
+	*MATCH
+	*PREMATCH
+	*POSTMATCH
+);
+
+@COMPLETE_EXPORT = ( @MINIMAL_EXPORT, @MATCH_EXPORT ) ;
+
+# The ground of all being. @ARG is deprecated (5.005 makes @_ lexical)
+
+	*ARG					= *_	;
+
+# Matching.
+
+	*LAST_PAREN_MATCH			= *+	;
+	*LAST_SUBMATCH_RESULT			= *^N ;
+	*LAST_MATCH_START			= *-{ARRAY} ;
+	*LAST_MATCH_END				= *+{ARRAY} ;
+
+# Input.
+
+	*INPUT_LINE_NUMBER			= *.	;
+	    *NR					= *.	;
+	*INPUT_RECORD_SEPARATOR			= */	;
+	    *RS					= */	;
+
+# Output.
+
+	*OUTPUT_AUTOFLUSH			= *|	;
+	*OUTPUT_FIELD_SEPARATOR			= *,	;
+	    *OFS				= *,	;
+	*OUTPUT_RECORD_SEPARATOR		= *\	;
+	    *ORS				= *\	;
+
+# Interpolation "constants".
+
+	*LIST_SEPARATOR				= *"	;
+	*SUBSCRIPT_SEPARATOR			= *;	;
+	    *SUBSEP				= *;	;
+
+# Formats
+
+	*FORMAT_PAGE_NUMBER			= *%	;
+	*FORMAT_LINES_PER_PAGE			= *=	;
+	*FORMAT_LINES_LEFT			= *-	;
+	*FORMAT_NAME				= *~	;
+	*FORMAT_TOP_NAME			= *^	;
+	*FORMAT_LINE_BREAK_CHARACTERS		= *:	;
+	*FORMAT_FORMFEED			= *^L	;
+
+# Error status.
+
+	*CHILD_ERROR				= *?	;
+	*OS_ERROR				= *!	;
+	    *ERRNO				= *!	;
+	*OS_ERROR				= *!	;
+	    *ERRNO				= *!	;
+	*EXTENDED_OS_ERROR			= *^E	;
+	*EVAL_ERROR				= *@	;
+
+# Process info.
+
+	*PROCESS_ID				= *$	;
+	    *PID				= *$	;
+	*REAL_USER_ID				= *<	;
+	    *UID				= *<	;
+	*EFFECTIVE_USER_ID			= *>	;
+	    *EUID				= *>	;
+	*REAL_GROUP_ID				= *(	;
+	    *GID				= *(	;
+	*EFFECTIVE_GROUP_ID			= *)	;
+	    *EGID				= *)	;
+	*PROGRAM_NAME				= *0	;
+
+# Internals.
+
+	*PERL_VERSION				= *^V	;
+	*ACCUMULATOR				= *^A	;
+	*COMPILING				= *^C	;
+	*DEBUGGING				= *^D	;
+	*SYSTEM_FD_MAX				= *^F	;
+	*INPLACE_EDIT				= *^I	;
+	*PERLDB					= *^P	;
+	*LAST_REGEXP_CODE_RESULT		= *^R	;
+	*EXCEPTIONS_BEING_CAUGHT		= *^S	;
+	*BASETIME				= *^T	;
+	*WARNING				= *^W	;
+	*EXECUTABLE_NAME			= *^X	;
+	*OSNAME					= *^O	;
+
+# Deprecated.
+
+#	*ARRAY_BASE				= *[	;
+#	*OFMT					= *#	;
+#	*MULTILINE_MATCHING			= **	;
+#	*OLD_PERL_VERSION			= *]	;
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Env.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Env.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Env.pm	(revision 14489)
@@ -0,0 +1,235 @@
+package Env;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+Env - perl module that imports environment variables as scalars or arrays
+
+=head1 SYNOPSIS
+
+    use Env;
+    use Env qw(PATH HOME TERM);
+    use Env qw($SHELL @LD_LIBRARY_PATH);
+
+=head1 DESCRIPTION
+
+Perl maintains environment variables in a special hash named C<%ENV>.  For
+when this access method is inconvenient, the Perl module C<Env> allows
+environment variables to be treated as scalar or array variables.
+
+The C<Env::import()> function ties environment variables with suitable
+names to global Perl variables with the same names.  By default it
+ties all existing environment variables (C<keys %ENV>) to scalars.  If
+the C<import> function receives arguments, it takes them to be a list of
+variables to tie; it's okay if they don't yet exist. The scalar type
+prefix '$' is inferred for any element of this list not prefixed by '$'
+or '@'. Arrays are implemented in terms of C<split> and C<join>, using
+C<$Config::Config{path_sep}> as the delimiter.
+
+After an environment variable is tied, merely use it like a normal variable.
+You may access its value 
+
+    @path = split(/:/, $PATH);
+    print join("\n", @LD_LIBRARY_PATH), "\n";
+
+or modify it
+
+    $PATH .= ":.";
+    push @LD_LIBRARY_PATH, $dir;
+
+however you'd like. Bear in mind, however, that each access to a tied array
+variable requires splitting the environment variable's string anew.
+
+The code:
+
+    use Env qw(@PATH);
+    push @PATH, '.';
+
+is equivalent to:
+
+    use Env qw(PATH);
+    $PATH .= ":.";
+
+except that if C<$ENV{PATH}> started out empty, the second approach leaves
+it with the (odd) value "C<:.>", but the first approach leaves it with "C<.>".
+
+To remove a tied environment variable from
+the environment, assign it the undefined value
+
+    undef $PATH;
+    undef @LD_LIBRARY_PATH;
+
+=head1 LIMITATIONS
+
+On VMS systems, arrays tied to environment variables are read-only. Attempting
+to change anything will cause a warning.
+
+=head1 AUTHOR
+
+Chip Salzenberg E<lt>F<chip@fin.uucp>E<gt>
+and
+Gregor N. Purdy E<lt>F<gregor@focusresearch.com>E<gt>
+
+=cut
+
+sub import {
+    my ($callpack) = caller(0);
+    my $pack = shift;
+    my @vars = grep /^[\$\@]?[A-Za-z_]\w*$/, (@_ ? @_ : keys(%ENV));
+    return unless @vars;
+
+    @vars = map { m/^[\$\@]/ ? $_ : '$'.$_ } @vars;
+
+    eval "package $callpack; use vars qw(" . join(' ', @vars) . ")";
+    die $@ if $@;
+    foreach (@vars) {
+	my ($type, $name) = m/^([\$\@])(.*)$/;
+	if ($type eq '$') {
+	    tie ${"${callpack}::$name"}, Env, $name;
+	} else {
+	    if ($^O eq 'VMS') {
+		tie @{"${callpack}::$name"}, Env::Array::VMS, $name;
+	    } else {
+		tie @{"${callpack}::$name"}, Env::Array, $name;
+	    }
+	}
+    }
+}
+
+sub TIESCALAR {
+    bless \($_[1]);
+}
+
+sub FETCH {
+    my ($self) = @_;
+    $ENV{$$self};
+}
+
+sub STORE {
+    my ($self, $value) = @_;
+    if (defined($value)) {
+	$ENV{$$self} = $value;
+    } else {
+	delete $ENV{$$self};
+    }
+}
+
+######################################################################
+
+package Env::Array;
+ 
+use Config;
+use Tie::Array;
+
+@ISA = qw(Tie::Array);
+
+my $sep = $Config::Config{path_sep};
+
+sub TIEARRAY {
+    bless \($_[1]);
+}
+
+sub FETCHSIZE {
+    my ($self) = @_;
+    my @temp = split($sep, $ENV{$$self});
+    return scalar(@temp);
+}
+
+sub STORESIZE {
+    my ($self, $size) = @_;
+    my @temp = split($sep, $ENV{$$self});
+    $#temp = $size - 1;
+    $ENV{$$self} = join($sep, @temp);
+}
+
+sub CLEAR {
+    my ($self) = @_;
+    $ENV{$$self} = '';
+}
+
+sub FETCH {
+    my ($self, $index) = @_;
+    return (split($sep, $ENV{$$self}))[$index];
+}
+
+sub STORE {
+    my ($self, $index, $value) = @_;
+    my @temp = split($sep, $ENV{$$self});
+    $temp[$index] = $value;
+    $ENV{$$self} = join($sep, @temp);
+    return $value;
+}
+
+sub PUSH {
+    my $self = shift;
+    my @temp = split($sep, $ENV{$$self});
+    push @temp, @_;
+    $ENV{$$self} = join($sep, @temp);
+    return scalar(@temp);
+}
+
+sub POP {
+    my ($self) = @_;
+    my @temp = split($sep, $ENV{$$self});
+    my $result = pop @temp;
+    $ENV{$$self} = join($sep, @temp);
+    return $result;
+}
+
+sub UNSHIFT {
+    my $self = shift;
+    my @temp = split($sep, $ENV{$$self});
+    my $result = unshift @temp, @_;
+    $ENV{$$self} = join($sep, @temp);
+    return $result;
+}
+
+sub SHIFT {
+    my ($self) = @_;
+    my @temp = split($sep, $ENV{$$self});
+    my $result = shift @temp;
+    $ENV{$$self} = join($sep, @temp);
+    return $result;
+}
+
+sub SPLICE {
+    my $self = shift;
+    my $offset = shift;
+    my $length = shift;
+    my @temp = split($sep, $ENV{$$self});
+    if (wantarray) {
+	my @result = splice @temp, $self, $offset, $length, @_;
+	$ENV{$$self} = join($sep, @temp);
+	return @result;
+    } else {
+	my $result = scalar splice @temp, $offset, $length, @_;
+	$ENV{$$self} = join($sep, @temp);
+	return $result;
+    }
+}
+
+######################################################################
+
+package Env::Array::VMS;
+use Tie::Array;
+
+@ISA = qw(Tie::Array);
+ 
+sub TIEARRAY {
+    bless \($_[1]);
+}
+
+sub FETCHSIZE {
+    my ($self) = @_;
+    my $i = 0;
+    while ($i < 127 and defined $ENV{$$self . ';' . $i}) { $i++; };
+    return $i;
+}
+
+sub FETCH {
+    my ($self, $index) = @_;
+    return $ENV{$$self . ';' . $index};
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Errno.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Errno.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Errno.pm	(revision 14489)
@@ -0,0 +1,222 @@
+#
+# This file is auto-generated. ***ANY*** changes here will be lost
+#
+
+package Errno;
+our (@EXPORT_OK,%EXPORT_TAGS,@ISA,$VERSION,%errno,$AUTOLOAD);
+use Exporter ();
+use Config;
+use strict;
+
+"$Config{'archname'}-$Config{'osvers'}" eq
+"MSWin32-x86-multi-thread-5.1" or
+	die "Errno architecture (MSWin32-x86-multi-thread-5.1) does not match executable architecture ($Config{'archname'}-$Config{'osvers'})";
+
+$VERSION = "1.09_01";
+$VERSION = eval $VERSION;
+@ISA = qw(Exporter);
+
+@EXPORT_OK = qw(EROFS ESHUTDOWN EPROTONOSUPPORT ENFILE ENOLCK
+	EADDRINUSE ECONNABORTED EBADF EDEADLK ENOTDIR EINVAL ENOTTY EXDEV
+	ELOOP ECONNREFUSED EISCONN EFBIG ECONNRESET EPFNOSUPPORT ENOENT
+	EDISCON EWOULDBLOCK EDOM EMSGSIZE EDESTADDRREQ ENOTSOCK EIO ENOSPC
+	ENOBUFS EINPROGRESS ERANGE EADDRNOTAVAIL EAFNOSUPPORT ENOSYS EINTR
+	EHOSTDOWN EREMOTE EILSEQ ENOMEM ENOTCONN ENETUNREACH EPIPE ESTALE
+	EDQUOT EUSERS EOPNOTSUPP ESPIPE EALREADY EMFILE ENAMETOOLONG EACCES
+	ENOEXEC EISDIR EPROCLIM EBUSY E2BIG EPERM EEXIST ETOOMANYREFS
+	ESOCKTNOSUPPORT ETIMEDOUT ENXIO ESRCH ENODEV EFAULT EAGAIN EMLINK
+	EDEADLOCK ENOPROTOOPT ECHILD ENETDOWN EHOSTUNREACH EPROTOTYPE
+	ENETRESET ENOTEMPTY);
+
+%EXPORT_TAGS = (
+    POSIX => [qw(
+	E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY
+	EBADF EBUSY ECHILD ECONNABORTED ECONNREFUSED ECONNRESET EDEADLK
+	EDESTADDRREQ EDOM EDQUOT EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH
+	EINPROGRESS EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
+	EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS
+	ENODEV ENOENT ENOEXEC ENOLCK ENOMEM ENOPROTOOPT ENOSPC ENOSYS ENOTCONN
+	ENOTDIR ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM EPFNOSUPPORT
+	EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE ERANGE EREMOTE EROFS
+	ESHUTDOWN ESOCKTNOSUPPORT ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS
+	EUSERS EWOULDBLOCK EXDEV
+    )]
+);
+
+sub EPERM () { 1 }
+sub ENOENT () { 2 }
+sub ESRCH () { 3 }
+sub EINTR () { 4 }
+sub EIO () { 5 }
+sub ENXIO () { 6 }
+sub E2BIG () { 7 }
+sub ENOEXEC () { 8 }
+sub EBADF () { 9 }
+sub ECHILD () { 10 }
+sub EAGAIN () { 11 }
+sub ENOMEM () { 12 }
+sub EACCES () { 13 }
+sub EFAULT () { 14 }
+sub EBUSY () { 16 }
+sub EEXIST () { 17 }
+sub EXDEV () { 18 }
+sub ENODEV () { 19 }
+sub ENOTDIR () { 20 }
+sub EISDIR () { 21 }
+sub EINVAL () { 22 }
+sub ENFILE () { 23 }
+sub EMFILE () { 24 }
+sub ENOTTY () { 25 }
+sub EFBIG () { 27 }
+sub ENOSPC () { 28 }
+sub ESPIPE () { 29 }
+sub EROFS () { 30 }
+sub EMLINK () { 31 }
+sub EPIPE () { 32 }
+sub EDOM () { 33 }
+sub ERANGE () { 34 }
+sub EDEADLK () { 36 }
+sub EDEADLOCK () { 36 }
+sub ENAMETOOLONG () { 38 }
+sub ENOLCK () { 39 }
+sub ENOSYS () { 40 }
+sub ENOTEMPTY () { 41 }
+sub EILSEQ () { 42 }
+sub EWOULDBLOCK () { 10035 }
+sub EINPROGRESS () { 10036 }
+sub EALREADY () { 10037 }
+sub ENOTSOCK () { 10038 }
+sub EDESTADDRREQ () { 10039 }
+sub EMSGSIZE () { 10040 }
+sub EPROTOTYPE () { 10041 }
+sub ENOPROTOOPT () { 10042 }
+sub EPROTONOSUPPORT () { 10043 }
+sub ESOCKTNOSUPPORT () { 10044 }
+sub EOPNOTSUPP () { 10045 }
+sub EPFNOSUPPORT () { 10046 }
+sub EAFNOSUPPORT () { 10047 }
+sub EADDRINUSE () { 10048 }
+sub EADDRNOTAVAIL () { 10049 }
+sub ENETDOWN () { 10050 }
+sub ENETUNREACH () { 10051 }
+sub ENETRESET () { 10052 }
+sub ECONNABORTED () { 10053 }
+sub ECONNRESET () { 10054 }
+sub ENOBUFS () { 10055 }
+sub EISCONN () { 10056 }
+sub ENOTCONN () { 10057 }
+sub ESHUTDOWN () { 10058 }
+sub ETOOMANYREFS () { 10059 }
+sub ETIMEDOUT () { 10060 }
+sub ECONNREFUSED () { 10061 }
+sub ELOOP () { 10062 }
+sub EHOSTDOWN () { 10064 }
+sub EHOSTUNREACH () { 10065 }
+sub EPROCLIM () { 10067 }
+sub EUSERS () { 10068 }
+sub EDQUOT () { 10069 }
+sub ESTALE () { 10070 }
+sub EREMOTE () { 10071 }
+sub EDISCON () { 10101 }
+
+sub TIEHASH { bless [] }
+
+sub FETCH {
+    my ($self, $errname) = @_;
+    my $proto = prototype("Errno::$errname");
+    my $errno = "";
+    if (defined($proto) && $proto eq "") {
+	no strict 'refs';
+	$errno = &$errname;
+        $errno = 0 unless $! == $errno;
+    }
+    return $errno;
+}
+
+sub STORE {
+    require Carp;
+    Carp::confess("ERRNO hash is read only!");
+}
+
+*CLEAR = \&STORE;
+*DELETE = \&STORE;
+
+sub NEXTKEY {
+    my($k,$v);
+    while(($k,$v) = each %Errno::) {
+	my $proto = prototype("Errno::$k");
+	last if (defined($proto) && $proto eq "");
+    }
+    $k
+}
+
+sub FIRSTKEY {
+    my $s = scalar keys %Errno::;	# initialize iterator
+    goto &NEXTKEY;
+}
+
+sub EXISTS {
+    my ($self, $errname) = @_;
+    my $r = ref $errname;
+    my $proto = !$r || $r eq 'CODE' ? prototype($errname) : undef;
+    defined($proto) && $proto eq "";
+}
+
+tie %!, __PACKAGE__;
+
+1;
+__END__
+
+=head1 NAME
+
+Errno - System errno constants
+
+=head1 SYNOPSIS
+
+    use Errno qw(EINTR EIO :POSIX);
+
+=head1 DESCRIPTION
+
+C<Errno> defines and conditionally exports all the error constants
+defined in your system C<errno.h> include file. It has a single export
+tag, C<:POSIX>, which will export all POSIX defined error numbers.
+
+C<Errno> also makes C<%!> magic such that each element of C<%!> has a
+non-zero value only if C<$!> is set to that value. For example:
+
+    use Errno;
+
+    unless (open(FH, "/fangorn/spouse")) {
+        if ($!{ENOENT}) {
+            warn "Get a wife!\n";
+        } else {
+            warn "This path is barred: $!";
+        } 
+    } 
+
+If a specified constant C<EFOO> does not exist on the system, C<$!{EFOO}>
+returns C<"">.  You may use C<exists $!{EFOO}> to check whether the
+constant is available on the system.
+
+=head1 CAVEATS
+
+Importing a particular constant may not be very portable, because the
+import will fail on platforms that do not have that constant.  A more
+portable way to set C<$!> to a valid value is to use:
+
+    if (exists &Errno::EFOO) {
+        $! = &Errno::EFOO;
+    }
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-8 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
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Exporter.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Exporter.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Exporter.pm	(revision 14489)
@@ -0,0 +1,440 @@
+package Exporter;
+
+require 5.006;
+
+# Be lean.
+#use strict;
+#no strict 'refs';
+
+our $Debug = 0;
+our $ExportLevel = 0;
+our $Verbose ||= 0;
+our $VERSION = '5.58';
+our (%Cache);
+$Carp::Internal{Exporter} = 1;
+
+sub as_heavy {
+  require Exporter::Heavy;
+  # Unfortunately, this does not work if the caller is aliased as *name = \&foo
+  # Thus the need to create a lot of identical subroutines
+  my $c = (caller(1))[3];
+  $c =~ s/.*:://;
+  \&{"Exporter::Heavy::heavy_$c"};
+}
+
+sub export {
+  goto &{as_heavy()};
+}
+
+sub import {
+  my $pkg = shift;
+  my $callpkg = caller($ExportLevel);
+
+  if ($pkg eq "Exporter" and @_ and $_[0] eq "import") {
+    *{$callpkg."::import"} = \&import;
+    return;
+  }
+
+  # We *need* to treat @{"$pkg\::EXPORT_FAIL"} since Carp uses it :-(
+  my($exports, $fail) = (\@{"$pkg\::EXPORT"}, \@{"$pkg\::EXPORT_FAIL"});
+  return export $pkg, $callpkg, @_
+    if $Verbose or $Debug or @$fail > 1;
+  my $export_cache = ($Cache{$pkg} ||= {});
+  my $args = @_ or @_ = @$exports;
+
+  local $_;
+  if ($args and not %$export_cache) {
+    s/^&//, $export_cache->{$_} = 1
+      foreach (@$exports, @{"$pkg\::EXPORT_OK"});
+  }
+  my $heavy;
+  # Try very hard not to use {} and hence have to  enter scope on the foreach
+  # We bomb out of the loop with last as soon as heavy is set.
+  if ($args or $fail) {
+    ($heavy = (/\W/ or $args and not exists $export_cache->{$_}
+               or @$fail and $_ eq $fail->[0])) and last
+                 foreach (@_);
+  } else {
+    ($heavy = /\W/) and last
+      foreach (@_);
+  }
+  return export $pkg, $callpkg, ($args ? @_ : ()) if $heavy;
+  local $SIG{__WARN__} = 
+	sub {require Carp; &Carp::carp};
+  # shortcut for the common case of no type character
+  *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_;
+}
+
+# Default methods
+
+sub export_fail {
+    my $self = shift;
+    @_;
+}
+
+# Unfortunately, caller(1)[3] "does not work" if the caller is aliased as
+# *name = \&foo.  Thus the need to create a lot of identical subroutines
+# Otherwise we could have aliased them to export().
+
+sub export_to_level {
+  goto &{as_heavy()};
+}
+
+sub export_tags {
+  goto &{as_heavy()};
+}
+
+sub export_ok_tags {
+  goto &{as_heavy()};
+}
+
+sub require_version {
+  goto &{as_heavy()};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Exporter - Implements default import method for modules
+
+=head1 SYNOPSIS
+
+In module YourModule.pm:
+
+  package YourModule;
+  require Exporter;
+  @ISA = qw(Exporter);
+  @EXPORT_OK = qw(munge frobnicate);  # symbols to export on request
+
+or
+
+  package YourModule;
+  use Exporter 'import'; # gives you Exporter's import() method directly
+  @EXPORT_OK = qw(munge frobnicate);  # symbols to export on request
+
+In other files which wish to use YourModule:
+
+  use ModuleName qw(frobnicate);      # import listed symbols
+  frobnicate ($left, $right)          # calls YourModule::frobnicate
+
+=head1 DESCRIPTION
+
+The Exporter module implements an C<import> method which allows a module
+to export functions and variables to its users' namespaces. Many modules
+use Exporter rather than implementing their own C<import> method because
+Exporter provides a highly flexible interface, with an implementation optimised
+for the common case.
+
+Perl automatically calls the C<import> method when processing a
+C<use> statement for a module. Modules and C<use> are documented
+in L<perlfunc> and L<perlmod>. Understanding the concept of
+modules and how the C<use> statement operates is important to
+understanding the Exporter.
+
+=head2 How to Export
+
+The arrays C<@EXPORT> and C<@EXPORT_OK> in a module hold lists of
+symbols that are going to be exported into the users name space by
+default, or which they can request to be exported, respectively.  The
+symbols can represent functions, scalars, arrays, hashes, or typeglobs.
+The symbols must be given by full name with the exception that the
+ampersand in front of a function is optional, e.g.
+
+    @EXPORT    = qw(afunc $scalar @array);   # afunc is a function
+    @EXPORT_OK = qw(&bfunc %hash *typeglob); # explicit prefix on &bfunc
+
+If you are only exporting function names it is recommended to omit the
+ampersand, as the implementation is faster this way.
+
+=head2 Selecting What To Export
+
+Do B<not> export method names!
+
+Do B<not> export anything else by default without a good reason!
+
+Exports pollute the namespace of the module user.  If you must export
+try to use @EXPORT_OK in preference to @EXPORT and avoid short or
+common symbol names to reduce the risk of name clashes.
+
+Generally anything not exported is still accessible from outside the
+module using the ModuleName::item_name (or $blessed_ref-E<gt>method)
+syntax.  By convention you can use a leading underscore on names to
+informally indicate that they are 'internal' and not for public use.
+
+(It is actually possible to get private functions by saying:
+
+  my $subref = sub { ... };
+  $subref->(@args);            # Call it as a function
+  $obj->$subref(@args);        # Use it as a method
+
+However if you use them for methods it is up to you to figure out
+how to make inheritance work.)
+
+As a general rule, if the module is trying to be object oriented
+then export nothing. If it's just a collection of functions then
+@EXPORT_OK anything but use @EXPORT with caution. For function and
+method names use barewords in preference to names prefixed with
+ampersands for the export lists.
+
+Other module design guidelines can be found in L<perlmod>.
+
+=head2 How to Import
+
+In other files which wish to use your module there are three basic ways for
+them to load your module and import its symbols:
+
+=over 4
+
+=item C<use ModuleName;>
+
+This imports all the symbols from ModuleName's @EXPORT into the namespace
+of the C<use> statement.
+
+=item C<use ModuleName ();>
+
+This causes perl to load your module but does not import any symbols.
+
+=item C<use ModuleName qw(...);>
+
+This imports only the symbols listed by the caller into their namespace.
+All listed symbols must be in your @EXPORT or @EXPORT_OK, else an error
+occurs. The advanced export features of Exporter are accessed like this,
+but with list entries that are syntactically distinct from symbol names.
+
+=back
+
+Unless you want to use its advanced features, this is probably all you
+need to know to use Exporter.
+
+=head1 Advanced features
+
+=head2 Specialised Import Lists
+
+If any of the entries in an import list begins with !, : or / then
+the list is treated as a series of specifications which either add to
+or delete from the list of names to import. They are processed left to
+right. Specifications are in the form:
+
+    [!]name         This name only
+    [!]:DEFAULT     All names in @EXPORT
+    [!]:tag         All names in $EXPORT_TAGS{tag} anonymous list
+    [!]/pattern/    All names in @EXPORT and @EXPORT_OK which match
+
+A leading ! indicates that matching names should be deleted from the
+list of names to import.  If the first specification is a deletion it
+is treated as though preceded by :DEFAULT. If you just want to import
+extra names in addition to the default set you will still need to
+include :DEFAULT explicitly.
+
+e.g., Module.pm defines:
+
+    @EXPORT      = qw(A1 A2 A3 A4 A5);
+    @EXPORT_OK   = qw(B1 B2 B3 B4 B5);
+    %EXPORT_TAGS = (T1 => [qw(A1 A2 B1 B2)], T2 => [qw(A1 A2 B3 B4)]);
+
+    Note that you cannot use tags in @EXPORT or @EXPORT_OK.
+    Names in EXPORT_TAGS must also appear in @EXPORT or @EXPORT_OK.
+
+An application using Module can say something like:
+
+    use Module qw(:DEFAULT :T2 !B3 A3);
+
+Other examples include:
+
+    use Socket qw(!/^[AP]F_/ !SOMAXCONN !SOL_SOCKET);
+    use POSIX  qw(:errno_h :termios_h !TCSADRAIN !/^EXIT/);
+
+Remember that most patterns (using //) will need to be anchored
+with a leading ^, e.g., C</^EXIT/> rather than C</EXIT/>.
+
+You can say C<BEGIN { $Exporter::Verbose=1 }> to see how the
+specifications are being processed and what is actually being imported
+into modules.
+
+=head2 Exporting without using Exporter's import method
+
+Exporter has a special method, 'export_to_level' which is used in situations
+where you can't directly call Exporter's import method. The export_to_level
+method looks like:
+
+    MyPackage->export_to_level($where_to_export, $package, @what_to_export);
+
+where $where_to_export is an integer telling how far up the calling stack
+to export your symbols, and @what_to_export is an array telling what
+symbols *to* export (usually this is @_).  The $package argument is
+currently unused.
+
+For example, suppose that you have a module, A, which already has an
+import function:
+
+    package A;
+
+    @ISA = qw(Exporter);
+    @EXPORT_OK = qw ($b);
+
+    sub import
+    {
+	$A::b = 1;     # not a very useful import method
+    }
+
+and you want to Export symbol $A::b back to the module that called 
+package A. Since Exporter relies on the import method to work, via 
+inheritance, as it stands Exporter::import() will never get called. 
+Instead, say the following:
+
+    package A;
+    @ISA = qw(Exporter);
+    @EXPORT_OK = qw ($b);
+
+    sub import
+    {
+	$A::b = 1;
+	A->export_to_level(1, @_);
+    }
+
+This will export the symbols one level 'above' the current package - ie: to 
+the program or module that used package A. 
+
+Note: Be careful not to modify C<@_> at all before you call export_to_level
+- or people using your package will get very unexplained results!
+
+=head2 Exporting without inheriting from Exporter
+
+By including Exporter in your @ISA you inherit an Exporter's import() method
+but you also inherit several other helper methods which you probably don't
+want. To avoid this you can do
+
+  package YourModule;
+  use Exporter qw( import );
+
+which will export Exporter's own import() method into YourModule.
+Everything will work as before but you won't need to include Exporter in
+@YourModule::ISA.
+
+=head2 Module Version Checking
+
+The Exporter module will convert an attempt to import a number from a
+module into a call to $module_name-E<gt>require_version($value). This can
+be used to validate that the version of the module being used is
+greater than or equal to the required version.
+
+The Exporter module supplies a default require_version method which
+checks the value of $VERSION in the exporting module.
+
+Since the default require_version method treats the $VERSION number as
+a simple numeric value it will regard version 1.10 as lower than
+1.9. For this reason it is strongly recommended that you use numbers
+with at least two decimal places, e.g., 1.09.
+
+=head2 Managing Unknown Symbols
+
+In some situations you may want to prevent certain symbols from being
+exported. Typically this applies to extensions which have functions
+or constants that may not exist on some systems.
+
+The names of any symbols that cannot be exported should be listed
+in the C<@EXPORT_FAIL> array.
+
+If a module attempts to import any of these symbols the Exporter
+will give the module an opportunity to handle the situation before
+generating an error. The Exporter will call an export_fail method
+with a list of the failed symbols:
+
+  @failed_symbols = $module_name->export_fail(@failed_symbols);
+
+If the export_fail method returns an empty list then no error is
+recorded and all the requested symbols are exported. If the returned
+list is not empty then an error is generated for each symbol and the
+export fails. The Exporter provides a default export_fail method which
+simply returns the list unchanged.
+
+Uses for the export_fail method include giving better error messages
+for some symbols and performing lazy architectural checks (put more
+symbols into @EXPORT_FAIL by default and then take them out if someone
+actually tries to use them and an expensive check shows that they are
+usable on that platform).
+
+=head2 Tag Handling Utility Functions
+
+Since the symbols listed within %EXPORT_TAGS must also appear in either
+@EXPORT or @EXPORT_OK, two utility functions are provided which allow
+you to easily add tagged sets of symbols to @EXPORT or @EXPORT_OK:
+
+  %EXPORT_TAGS = (foo => [qw(aa bb cc)], bar => [qw(aa cc dd)]);
+
+  Exporter::export_tags('foo');     # add aa, bb and cc to @EXPORT
+  Exporter::export_ok_tags('bar');  # add aa, cc and dd to @EXPORT_OK
+
+Any names which are not tags are added to @EXPORT or @EXPORT_OK
+unchanged but will trigger a warning (with C<-w>) to avoid misspelt tags
+names being silently added to @EXPORT or @EXPORT_OK. Future versions
+may make this a fatal error.
+
+=head2 Generating combined tags
+
+If several symbol categories exist in %EXPORT_TAGS, it's usually
+useful to create the utility ":all" to simplify "use" statements.
+
+The simplest way to do this is:
+
+  %EXPORT_TAGS = (foo => [qw(aa bb cc)], bar => [qw(aa cc dd)]);
+
+  # add all the other ":class" tags to the ":all" class,
+  # deleting duplicates
+  {
+    my %seen;
+
+    push @{$EXPORT_TAGS{all}},
+      grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}} foreach keys %EXPORT_TAGS;
+  }
+
+CGI.pm creates an ":all" tag which contains some (but not really
+all) of its categories.  That could be done with one small
+change:
+
+  # add some of the other ":class" tags to the ":all" class,
+  # deleting duplicates
+  {
+    my %seen;
+
+    push @{$EXPORT_TAGS{all}},
+      grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}}
+        foreach qw/html2 html3 netscape form cgi internal/;
+  }
+
+Note that the tag names in %EXPORT_TAGS don't have the leading ':'.
+
+=head2 C<AUTOLOAD>ed Constants
+
+Many modules make use of C<AUTOLOAD>ing for constant subroutines to
+avoid having to compile and waste memory on rarely used values (see
+L<perlsub> for details on constant subroutines).  Calls to such
+constant subroutines are not optimized away at compile time because
+they can't be checked at compile time for constancy.
+
+Even if a prototype is available at compile time, the body of the
+subroutine is not (it hasn't been C<AUTOLOAD>ed yet). perl needs to
+examine both the C<()> prototype and the body of a subroutine at
+compile time to detect that it can safely replace calls to that
+subroutine with the constant value.
+
+A workaround for this is to call the constants once in a C<BEGIN> block:
+
+   package My ;
+
+   use Socket ;
+
+   foo( SO_LINGER );     ## SO_LINGER NOT optimized away; called at runtime
+   BEGIN { SO_LINGER }
+   foo( SO_LINGER );     ## SO_LINGER optimized away at compile time.
+
+This forces the C<AUTOLOAD> for C<SO_LINGER> to take place before
+SO_LINGER is encountered later in C<My> package.
+
+If you are writing a package that C<AUTOLOAD>s, consider forcing
+an C<AUTOLOAD> for any constants explicitly imported by other packages
+or which are usually used when your package is C<use>d.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Exporter/Heavy.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Exporter/Heavy.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Exporter/Heavy.pm	(revision 14489)
@@ -0,0 +1,248 @@
+package Exporter::Heavy;
+
+use strict;
+no strict 'refs';
+
+# On one line so MakeMaker will see it.
+require Exporter;  our $VERSION = $Exporter::VERSION;
+$Carp::Internal{"Exporter::Heavy"} = 1;
+
+=head1 NAME
+
+Exporter::Heavy - Exporter guts
+
+=head1 SYNOPSIS
+
+(internal use only)
+
+=head1 DESCRIPTION
+
+No user-serviceable parts inside.
+
+=cut
+
+#
+# We go to a lot of trouble not to 'require Carp' at file scope,
+#  because Carp requires Exporter, and something has to give.
+#
+
+sub _rebuild_cache {
+    my ($pkg, $exports, $cache) = @_;
+    s/^&// foreach @$exports;
+    @{$cache}{@$exports} = (1) x @$exports;
+    my $ok = \@{"${pkg}::EXPORT_OK"};
+    if (@$ok) {
+	s/^&// foreach @$ok;
+	@{$cache}{@$ok} = (1) x @$ok;
+    }
+}
+
+sub heavy_export {
+
+    # First make import warnings look like they're coming from the "use".
+    local $SIG{__WARN__} = sub {
+	my $text = shift;
+	if ($text =~ s/ at \S*Exporter\S*.pm line \d+.*\n//) {
+	    require Carp;
+	    local $Carp::CarpLevel = 1;	# ignore package calling us too.
+	    Carp::carp($text);
+	}
+	else {
+	    warn $text;
+	}
+    };
+    local $SIG{__DIE__} = sub {
+	require Carp;
+	local $Carp::CarpLevel = 1;	# ignore package calling us too.
+	Carp::croak("$_[0]Illegal null symbol in \@${1}::EXPORT")
+	    if $_[0] =~ /^Unable to create sub named "(.*?)::"/;
+    };
+
+    my($pkg, $callpkg, @imports) = @_;
+    my($type, $sym, $cache_is_current, $oops);
+    my($exports, $export_cache) = (\@{"${pkg}::EXPORT"},
+                                   $Exporter::Cache{$pkg} ||= {});
+
+    if (@imports) {
+	if (!%$export_cache) {
+	    _rebuild_cache ($pkg, $exports, $export_cache);
+	    $cache_is_current = 1;
+	}
+
+	if (grep m{^[/!:]}, @imports) {
+	    my $tagsref = \%{"${pkg}::EXPORT_TAGS"};
+	    my $tagdata;
+	    my %imports;
+	    my($remove, $spec, @names, @allexports);
+	    # negated first item implies starting with default set:
+	    unshift @imports, ':DEFAULT' if $imports[0] =~ m/^!/;
+	    foreach $spec (@imports){
+		$remove = $spec =~ s/^!//;
+
+		if ($spec =~ s/^://){
+		    if ($spec eq 'DEFAULT'){
+			@names = @$exports;
+		    }
+		    elsif ($tagdata = $tagsref->{$spec}) {
+			@names = @$tagdata;
+		    }
+		    else {
+			warn qq["$spec" is not defined in %${pkg}::EXPORT_TAGS];
+			++$oops;
+			next;
+		    }
+		}
+		elsif ($spec =~ m:^/(.*)/$:){
+		    my $patn = $1;
+		    @allexports = keys %$export_cache unless @allexports; # only do keys once
+		    @names = grep(/$patn/, @allexports); # not anchored by default
+		}
+		else {
+		    @names = ($spec); # is a normal symbol name
+		}
+
+		warn "Import ".($remove ? "del":"add").": @names "
+		    if $Exporter::Verbose;
+
+		if ($remove) {
+		   foreach $sym (@names) { delete $imports{$sym} } 
+		}
+		else {
+		    @imports{@names} = (1) x @names;
+		}
+	    }
+	    @imports = keys %imports;
+	}
+
+        my @carp;
+	foreach $sym (@imports) {
+	    if (!$export_cache->{$sym}) {
+		if ($sym =~ m/^\d/) {
+		    $pkg->VERSION($sym); # inherit from UNIVERSAL
+		    # If the version number was the only thing specified
+		    # then we should act as if nothing was specified:
+		    if (@imports == 1) {
+			@imports = @$exports;
+			last;
+		    }
+		    # We need a way to emulate 'use Foo ()' but still
+		    # allow an easy version check: "use Foo 1.23, ''";
+		    if (@imports == 2 and !$imports[1]) {
+			@imports = ();
+			last;
+		    }
+		} elsif ($sym !~ s/^&// || !$export_cache->{$sym}) {
+		    # Last chance - see if they've updated EXPORT_OK since we
+		    # cached it.
+
+		    unless ($cache_is_current) {
+			%$export_cache = ();
+			_rebuild_cache ($pkg, $exports, $export_cache);
+			$cache_is_current = 1;
+		    }
+
+		    if (!$export_cache->{$sym}) {
+			# accumulate the non-exports
+			push @carp,
+			  qq["$sym" is not exported by the $pkg module\n];
+			$oops++;
+		    }
+		}
+	    }
+	}
+	if ($oops) {
+	    require Carp;
+	    Carp::croak("@{carp}Can't continue after import errors");
+	}
+    }
+    else {
+	@imports = @$exports;
+    }
+
+    my($fail, $fail_cache) = (\@{"${pkg}::EXPORT_FAIL"},
+                              $Exporter::FailCache{$pkg} ||= {});
+
+    if (@$fail) {
+	if (!%$fail_cache) {
+	    # Build cache of symbols. Optimise the lookup by adding
+	    # barewords twice... both with and without a leading &.
+	    # (Technique could be applied to $export_cache at cost of memory)
+	    my @expanded = map { /^\w/ ? ($_, '&'.$_) : $_ } @$fail;
+	    warn "${pkg}::EXPORT_FAIL cached: @expanded" if $Exporter::Verbose;
+	    @{$fail_cache}{@expanded} = (1) x @expanded;
+	}
+	my @failed;
+	foreach $sym (@imports) { push(@failed, $sym) if $fail_cache->{$sym} }
+	if (@failed) {
+	    @failed = $pkg->export_fail(@failed);
+	    foreach $sym (@failed) {
+                require Carp;
+		Carp::carp(qq["$sym" is not implemented by the $pkg module ],
+			"on this architecture");
+	    }
+	    if (@failed) {
+		require Carp;
+		Carp::croak("Can't continue after import errors");
+	    }
+	}
+    }
+
+    warn "Importing into $callpkg from $pkg: ",
+		join(", ",sort @imports) if $Exporter::Verbose;
+
+    foreach $sym (@imports) {
+	# shortcut for the common case of no type character
+	(*{"${callpkg}::$sym"} = \&{"${pkg}::$sym"}, next)
+	    unless $sym =~ s/^(\W)//;
+	$type = $1;
+	*{"${callpkg}::$sym"} =
+	    $type eq '&' ? \&{"${pkg}::$sym"} :
+	    $type eq '$' ? \${"${pkg}::$sym"} :
+	    $type eq '@' ? \@{"${pkg}::$sym"} :
+	    $type eq '%' ? \%{"${pkg}::$sym"} :
+	    $type eq '*' ?  *{"${pkg}::$sym"} :
+	    do { require Carp; Carp::croak("Can't export symbol: $type$sym") };
+    }
+}
+
+sub heavy_export_to_level
+{
+      my $pkg = shift;
+      my $level = shift;
+      (undef) = shift;			# XXX redundant arg
+      my $callpkg = caller($level);
+      $pkg->export($callpkg, @_);
+}
+
+# Utility functions
+
+sub _push_tags {
+    my($pkg, $var, $syms) = @_;
+    my @nontag = ();
+    my $export_tags = \%{"${pkg}::EXPORT_TAGS"};
+    push(@{"${pkg}::$var"},
+	map { $export_tags->{$_} ? @{$export_tags->{$_}} 
+                                 : scalar(push(@nontag,$_),$_) }
+		(@$syms) ? @$syms : keys %$export_tags);
+    if (@nontag and $^W) {
+	# This may change to a die one day
+	require Carp;
+	Carp::carp(join(", ", @nontag)." are not tags of $pkg");
+    }
+}
+
+sub heavy_require_version {
+    my($self, $wanted) = @_;
+    my $pkg = ref $self || $self;
+    return ${pkg}->VERSION($wanted);
+}
+
+sub heavy_export_tags {
+  _push_tags((caller)[0], "EXPORT",    \@_);
+}
+
+sub heavy_export_ok_tags {
+  _push_tags((caller)[0], "EXPORT_OK", \@_);
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Command.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Command.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Command.pm	(revision 14489)
@@ -0,0 +1,319 @@
+package ExtUtils::Command;
+
+use 5.00503;
+use strict;
+use Carp;
+use File::Copy;
+use File::Compare;
+use File::Basename;
+use File::Path qw(rmtree);
+require Exporter;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+@ISA       = qw(Exporter);
+@EXPORT    = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f chmod 
+                dos2unix);
+$VERSION = '1.09';
+
+my $Is_VMS = $^O eq 'VMS';
+
+=head1 NAME
+
+ExtUtils::Command - utilities to replace common UNIX commands in Makefiles etc.
+
+=head1 SYNOPSIS
+
+  perl -MExtUtils::Command  -e cat files... > destination
+  perl -MExtUtils::Command  -e mv source... destination
+  perl -MExtUtils::Command  -e cp source... destination
+  perl -MExtUtils::Command  -e touch files...
+  perl -MExtUtils::Command  -e rm_f files...
+  perl -MExtUtils::Command  -e rm_rf directories...
+  perl -MExtUtils::Command  -e mkpath directories...
+  perl -MExtUtils::Command  -e eqtime source destination
+  perl -MExtUtils::Command  -e test_f file
+  perl -MExtUtils::Command  -e chmod mode files...
+  ...
+
+=head1 DESCRIPTION
+
+The module is used to replace common UNIX commands.  In all cases the
+functions work from @ARGV rather than taking arguments.  This makes
+them easier to deal with in Makefiles.
+
+  perl -MExtUtils::Command -e some_command some files to work on
+
+I<NOT>
+
+  perl -MExtUtils::Command -e 'some_command qw(some files to work on)'
+
+For that use L<Shell::Command>.
+
+Filenames with * and ? will be glob expanded.
+
+=over 4
+
+=cut
+
+# VMS uses % instead of ? to mean "one character"
+my $wild_regex = $Is_VMS ? '*%' : '*?';
+sub expand_wildcards
+{
+ @ARGV = map(/[$wild_regex]/o ? glob($_) : $_,@ARGV);
+}
+
+
+=item cat
+
+    cat file ...
+
+Concatenates all files mentioned on command line to STDOUT.
+
+=cut 
+
+sub cat ()
+{
+ expand_wildcards();
+ print while (<>);
+}
+
+=item eqtime
+
+    eqtime source destination
+
+Sets modified time of destination to that of source.
+
+=cut 
+
+sub eqtime
+{
+ my ($src,$dst) = @ARGV;
+ local @ARGV = ($dst);  touch();  # in case $dst doesn't exist
+ utime((stat($src))[8,9],$dst);
+}
+
+=item rm_rf
+
+    rm_rf files or directories ...
+
+Removes files and directories - recursively (even if readonly)
+
+=cut 
+
+sub rm_rf
+{
+ expand_wildcards();
+ rmtree([grep -e $_,@ARGV],0,0);
+}
+
+=item rm_f
+
+    rm_f file ...
+
+Removes files (even if readonly)
+
+=cut 
+
+sub rm_f {
+    expand_wildcards();
+
+    foreach my $file (@ARGV) {
+        next unless -f $file;
+
+        next if _unlink($file);
+
+        chmod(0777, $file);
+
+        next if _unlink($file);
+
+        carp "Cannot delete $file: $!";
+    }
+}
+
+sub _unlink {
+    my $files_unlinked = 0;
+    foreach my $file (@_) {
+        my $delete_count = 0;
+        $delete_count++ while unlink $file;
+        $files_unlinked++ if $delete_count;
+    }
+    return $files_unlinked;
+}
+
+
+=item touch
+
+    touch file ...
+
+Makes files exist, with current timestamp 
+
+=cut 
+
+sub touch {
+    my $t    = time;
+    expand_wildcards();
+    foreach my $file (@ARGV) {
+        open(FILE,">>$file") || die "Cannot write $file:$!";
+        close(FILE);
+        utime($t,$t,$file);
+    }
+}
+
+=item mv
+
+    mv source_file destination_file
+    mv source_file source_file destination_dir
+
+Moves source to destination.  Multiple sources are allowed if
+destination is an existing directory.
+
+Returns true if all moves succeeded, false otherwise.
+
+=cut 
+
+sub mv {
+    expand_wildcards();
+    my @src = @ARGV;
+    my $dst = pop @src;
+
+    croak("Too many arguments") if (@src > 1 && ! -d $dst);
+
+    my $nok = 0;
+    foreach my $src (@src) {
+        $nok ||= !move($src,$dst);
+    }
+    return !$nok;
+}
+
+=item cp
+
+    cp source_file destination_file
+    cp source_file source_file destination_dir
+
+Copies sources to the destination.  Multiple sources are allowed if
+destination is an existing directory.
+
+Returns true if all copies succeeded, false otherwise.
+
+=cut
+
+sub cp {
+    expand_wildcards();
+    my @src = @ARGV;
+    my $dst = pop @src;
+
+    croak("Too many arguments") if (@src > 1 && ! -d $dst);
+
+    my $nok = 0;
+    foreach my $src (@src) {
+        $nok ||= !copy($src,$dst);
+    }
+    return $nok;
+}
+
+=item chmod
+
+    chmod mode files ...
+
+Sets UNIX like permissions 'mode' on all the files.  e.g. 0666
+
+=cut 
+
+sub chmod {
+    local @ARGV = @ARGV;
+    my $mode = shift(@ARGV);
+    expand_wildcards();
+
+    if( $Is_VMS ) {
+        foreach my $idx (0..$#ARGV) {
+            my $path = $ARGV[$idx];
+            next unless -d $path;
+
+            # chmod 0777, [.foo.bar] doesn't work on VMS, you have to do
+            # chmod 0777, [.foo]bar.dir
+            my @dirs = File::Spec->splitdir( $path );
+            $dirs[-1] .= '.dir';
+            $path = File::Spec->catfile(@dirs);
+
+            $ARGV[$idx] = $path;
+        }
+    }
+
+    chmod(oct $mode,@ARGV) || die "Cannot chmod ".join(' ',$mode,@ARGV).":$!";
+}
+
+=item mkpath
+
+    mkpath directory ...
+
+Creates directories, including any parent directories.
+
+=cut 
+
+sub mkpath
+{
+ expand_wildcards();
+ File::Path::mkpath([@ARGV],0,0777);
+}
+
+=item test_f
+
+    test_f file
+
+Tests if a file exists
+
+=cut 
+
+sub test_f
+{
+ exit !-f $ARGV[0];
+}
+
+=item dos2unix
+
+    dos2unix files or dirs ...
+
+Converts DOS and OS/2 linefeeds to Unix style recursively.
+
+=cut
+
+sub dos2unix {
+    require File::Find;
+    File::Find::find(sub {
+        return if -d;
+        return unless -w _;
+        return unless -r _;
+        return if -B _;
+
+        local $\;
+
+	my $orig = $_;
+	my $temp = '.dos2unix_tmp';
+	open ORIG, $_ or do { warn "dos2unix can't open $_: $!"; return };
+	open TEMP, ">$temp" or 
+	    do { warn "dos2unix can't create .dos2unix_tmp: $!"; return };
+        while (my $line = <ORIG>) { 
+            $line =~ s/\015\012/\012/g;
+            print TEMP $line;
+        }
+	close ORIG;
+	close TEMP;
+	rename $temp, $orig;
+
+    }, @ARGV);
+}
+
+=back
+
+=head1 SEE ALSO 
+
+Shell::Command which is these same functions but take arguments normally.
+
+
+=head1 AUTHOR
+
+Nick Ing-Simmons C<ni-s@cpan.org>
+
+Currently maintained by Michael G Schwern C<schwern@pobox.com>.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Command/MM.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Command/MM.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Command/MM.pm	(revision 14489)
@@ -0,0 +1,265 @@
+package ExtUtils::Command::MM;
+
+use strict;
+
+require 5.005_03;
+require Exporter;
+use vars qw($VERSION @ISA @EXPORT);
+@ISA = qw(Exporter);
+
+@EXPORT  = qw(test_harness pod2man perllocal_install uninstall 
+              warn_if_old_packlist);
+$VERSION = '0.05';
+
+my $Is_VMS = $^O eq 'VMS';
+
+
+=head1 NAME
+
+ExtUtils::Command::MM - Commands for the MM's to use in Makefiles
+
+=head1 SYNOPSIS
+
+  perl "-MExtUtils::Command::MM" -e "function" "--" arguments...
+
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY!>  The interface is not stable.
+
+ExtUtils::Command::MM encapsulates code which would otherwise have to
+be done with large "one" liners.
+
+Any $(FOO) used in the examples are make variables, not Perl.
+
+=over 4
+
+=item B<test_harness>
+
+  test_harness($verbose, @test_libs);
+
+Runs the tests on @ARGV via Test::Harness passing through the $verbose
+flag.  Any @test_libs will be unshifted onto the test's @INC.
+
+@test_libs are run in alphabetical order.
+
+=cut
+
+sub test_harness {
+    require Test::Harness;
+    require File::Spec;
+
+    $Test::Harness::verbose = shift;
+
+    # Because Windows doesn't do this for us and listing all the *.t files
+    # out on the command line can blow over its exec limit.
+    require ExtUtils::Command;
+    my @argv = ExtUtils::Command::expand_wildcards(@ARGV);
+
+    local @INC = @INC;
+    unshift @INC, map { File::Spec->rel2abs($_) } @_;
+    Test::Harness::runtests(sort { lc $a cmp lc $b } @argv);
+}
+
+
+
+=item B<pod2man>
+
+  pod2man( '--option=value',
+           $podfile1 => $manpage1,
+           $podfile2 => $manpage2,
+           ...
+         );
+
+  # or args on @ARGV
+
+pod2man() is a function performing most of the duties of the pod2man
+program.  Its arguments are exactly the same as pod2man as of 5.8.0
+with the addition of:
+
+    --perm_rw   octal permission to set the resulting manpage to
+
+And the removal of:
+
+    --verbose/-v
+    --help/-h
+
+If no arguments are given to pod2man it will read from @ARGV.
+
+=cut
+
+sub pod2man {
+    require Pod::Man;
+    require Getopt::Long;
+
+    my %options = ();
+
+    # We will cheat and just use Getopt::Long.  We fool it by putting
+    # our arguments into @ARGV.  Should be safe.
+    local @ARGV = @_ ? @_ : @ARGV;
+    Getopt::Long::config ('bundling_override');
+    Getopt::Long::GetOptions (\%options, 
+                'section|s=s', 'release|r=s', 'center|c=s',
+                'date|d=s', 'fixed=s', 'fixedbold=s', 'fixeditalic=s',
+                'fixedbolditalic=s', 'official|o', 'quotes|q=s', 'lax|l',
+                'name|n=s', 'perm_rw:i'
+    );
+
+    # If there's no files, don't bother going further.
+    return 0 unless @ARGV;
+
+    # Official sets --center, but don't override things explicitly set.
+    if ($options{official} && !defined $options{center}) {
+        $options{center} = q[Perl Programmer's Reference Guide];
+    }
+
+    # This isn't a valid Pod::Man option and is only accepted for backwards
+    # compatibility.
+    delete $options{lax};
+
+    my $parser = Pod::Man->new(%options);
+
+    do {{  # so 'next' works
+        my ($pod, $man) = splice(@ARGV, 0, 2);
+
+        next if ((-e $man) &&
+                 (-M $man < -M $pod) &&
+                 (-M $man < -M "Makefile"));
+
+        print "Manifying $man\n";
+
+        $parser->parse_from_file($pod, $man)
+          or do { warn("Could not install $man\n");  next };
+
+        if (length $options{perm_rw}) {
+            chmod(oct($options{perm_rw}), $man)
+              or do { warn("chmod $options{perm_rw} $man: $!\n"); next };
+        }
+    }} while @ARGV;
+
+    return 1;
+}
+
+
+=item B<warn_if_old_packlist>
+
+  perl "-MExtUtils::Command::MM" -e warn_if_old_packlist <somefile>
+
+Displays a warning that an old packlist file was found.  Reads the
+filename from @ARGV.
+
+=cut
+
+sub warn_if_old_packlist {
+    my $packlist = $ARGV[0];
+
+    return unless -f $packlist;
+    print <<"PACKLIST_WARNING";
+WARNING: I have found an old package in
+    $packlist.
+Please make sure the two installations are not conflicting
+PACKLIST_WARNING
+
+}
+
+
+=item B<perllocal_install>
+
+    perl "-MExtUtils::Command::MM" -e perllocal_install 
+        <type> <module name> <key> <value> ...
+
+    # VMS only, key|value pairs come on STDIN
+    perl "-MExtUtils::Command::MM" -e perllocal_install
+        <type> <module name> < <key>|<value> ...
+
+Prints a fragment of POD suitable for appending to perllocal.pod.
+Arguments are read from @ARGV.
+
+'type' is the type of what you're installing.  Usually 'Module'.
+
+'module name' is simply the name of your module.  (Foo::Bar)
+
+Key/value pairs are extra information about the module.  Fields include:
+
+    installed into      which directory your module was out into
+    LINKTYPE            dynamic or static linking
+    VERSION             module version number
+    EXE_FILES           any executables installed in a space seperated 
+                        list
+
+=cut
+
+sub perllocal_install {
+    my($type, $name) = splice(@ARGV, 0, 2);
+
+    # VMS feeds args as a piped file on STDIN since it usually can't
+    # fit all the args on a single command line.
+    @ARGV = split /\|/, <STDIN> if $Is_VMS;
+
+    my $pod;
+    $pod = sprintf <<POD, scalar localtime;
+ =head2 %s: C<$type> L<$name|$name>
+ 
+ =over 4
+ 
+POD
+
+    do {
+        my($key, $val) = splice(@ARGV, 0, 2);
+
+        $pod .= <<POD
+ =item *
+ 
+ C<$key: $val>
+ 
+POD
+
+    } while(@ARGV);
+
+    $pod .= "=back\n\n";
+    $pod =~ s/^ //mg;
+    print $pod;
+
+    return 1;
+}
+
+=item B<uninstall>
+
+    perl "-MExtUtils::Command::MM" -e uninstall <packlist>
+
+A wrapper around ExtUtils::Install::uninstall().  Warns that
+uninstallation is deprecated and doesn't actually perform the
+uninstallation.
+
+=cut
+
+sub uninstall {
+    my($packlist) = shift @ARGV;
+
+    require ExtUtils::Install;
+
+    print <<'WARNING';
+
+Uninstall is unsafe and deprecated, the uninstallation was not performed.
+We will show what would have been done.
+
+WARNING
+
+    ExtUtils::Install::uninstall($packlist, 1, 1);
+
+    print <<'WARNING';
+
+Uninstall is unsafe and deprecated, the uninstallation was not performed.
+Please check the list above carefully, there may be errors.
+Remove the appropriate files manually.
+Sorry for the inconvenience.
+
+WARNING
+
+}
+
+=back
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant.pm	(revision 14489)
@@ -0,0 +1,525 @@
+package ExtUtils::Constant;
+use vars qw (@ISA $VERSION @EXPORT_OK %EXPORT_TAGS);
+$VERSION = 0.17;
+
+=head1 NAME
+
+ExtUtils::Constant - generate XS code to import C header constants
+
+=head1 SYNOPSIS
+
+    use ExtUtils::Constant qw (WriteConstants);
+    WriteConstants(
+        NAME => 'Foo',
+        NAMES => [qw(FOO BAR BAZ)],
+    );
+    # Generates wrapper code to make the values of the constants FOO BAR BAZ
+    #  available to perl
+
+=head1 DESCRIPTION
+
+ExtUtils::Constant facilitates generating C and XS wrapper code to allow
+perl modules to AUTOLOAD constants defined in C library header files.
+It is principally used by the C<h2xs> utility, on which this code is based.
+It doesn't contain the routines to scan header files to extract these
+constants.
+
+=head1 USAGE
+
+Generally one only needs to call the C<WriteConstants> function, and then
+
+    #include "const-c.inc"
+
+in the C section of C<Foo.xs>
+
+    INCLUDE: const-xs.inc
+
+in the XS section of C<Foo.xs>.
+
+For greater flexibility use C<constant_types()>, C<C_constant> and
+C<XS_constant>, with which C<WriteConstants> is implemented.
+
+Currently this module understands the following types. h2xs may only know
+a subset. The sizes of the numeric types are chosen by the C<Configure>
+script at compile time.
+
+=over 4
+
+=item IV
+
+signed integer, at least 32 bits.
+
+=item UV
+
+unsigned integer, the same size as I<IV>
+
+=item NV
+
+floating point type, probably C<double>, possibly C<long double>
+
+=item PV
+
+NUL terminated string, length will be determined with C<strlen>
+
+=item PVN
+
+A fixed length thing, given as a [pointer, length] pair. If you know the
+length of a string at compile time you may use this instead of I<PV>
+
+=item SV
+
+A B<mortal> SV.
+
+=item YES
+
+Truth.  (C<PL_sv_yes>)  The value is not needed (and ignored).
+
+=item NO
+
+Defined Falsehood.  (C<PL_sv_no>)  The value is not needed (and ignored).
+
+=item UNDEF
+
+C<undef>.  The value of the macro is not needed.
+
+=back
+
+=head1 FUNCTIONS
+
+=over 4
+
+=cut
+
+if ($] >= 5.006) {
+  eval "use warnings; 1" or die $@;
+}
+use strict;
+use Carp qw(croak cluck);
+
+use Exporter;
+use ExtUtils::Constant::Utils qw(C_stringify);
+use ExtUtils::Constant::XS qw(%XS_Constant %XS_TypeSet);
+
+@ISA = 'Exporter';
+
+%EXPORT_TAGS = ( 'all' => [ qw(
+	XS_constant constant_types return_clause memEQ_clause C_stringify
+	C_constant autoload WriteConstants WriteMakefileSnippet
+) ] );
+
+@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+
+=item constant_types
+
+A function returning a single scalar with C<#define> definitions for the
+constants used internally between the generated C and XS functions.
+
+=cut
+
+sub constant_types {
+  ExtUtils::Constant::XS->header();
+}
+
+sub memEQ_clause {
+  cluck "ExtUtils::Constant::memEQ_clause is deprecated";
+  ExtUtils::Constant::XS->memEQ_clause({name=>$_[0], checked_at=>$_[1],
+					indent=>$_[2]});
+}
+
+sub return_clause ($$) {
+  cluck "ExtUtils::Constant::return_clause is deprecated";
+  my $indent = shift;
+  ExtUtils::Constant::XS->return_clause({indent=>$indent}, @_);
+}
+
+sub switch_clause {
+  cluck "ExtUtils::Constant::switch_clause is deprecated";
+  my $indent = shift;
+  my $comment = shift;
+  ExtUtils::Constant::XS->switch_clause({indent=>$indent, comment=>$comment},
+					@_);
+}
+
+sub C_constant {
+  my ($package, $subname, $default_type, $what, $indent, $breakout, @items)
+    = @_;
+  ExtUtils::Constant::XS->C_constant({package => $package, subname => $subname,
+				      default_type => $default_type,
+				      types => $what, indent => $indent,
+				      breakout => $breakout}, @items);
+}
+
+=item XS_constant PACKAGE, TYPES, SUBNAME, C_SUBNAME
+
+A function to generate the XS code to implement the perl subroutine
+I<PACKAGE>::constant used by I<PACKAGE>::AUTOLOAD to load constants.
+This XS code is a wrapper around a C subroutine usually generated by
+C<C_constant>, and usually named C<constant>.
+
+I<TYPES> should be given either as a comma separated list of types that the
+C subroutine C<constant> will generate or as a reference to a hash. It should
+be the same list of types as C<C_constant> was given.
+[Otherwise C<XS_constant> and C<C_constant> may have different ideas about
+the number of parameters passed to the C function C<constant>]
+
+You can call the perl visible subroutine something other than C<constant> if
+you give the parameter I<SUBNAME>. The C subroutine it calls defaults to
+the name of the perl visible subroutine, unless you give the parameter
+I<C_SUBNAME>.
+
+=cut
+
+sub XS_constant {
+  my $package = shift;
+  my $what = shift;
+  my $subname = shift;
+  my $C_subname = shift;
+  $subname ||= 'constant';
+  $C_subname ||= $subname;
+
+  if (!ref $what) {
+    # Convert line of the form IV,UV,NV to hash
+    $what = {map {$_ => 1} split /,\s*/, ($what)};
+  }
+  my $params = ExtUtils::Constant::XS->params ($what);
+  my $type;
+
+  my $xs = <<"EOT";
+void
+$subname(sv)
+    PREINIT:
+#ifdef dXSTARG
+	dXSTARG; /* Faster if we have it.  */
+#else
+	dTARGET;
+#endif
+	STRLEN		len;
+        int		type;
+EOT
+
+  if ($params->{IV}) {
+    $xs .= "	IV		iv;\n";
+  } else {
+    $xs .= "	/* IV\t\tiv;\tUncomment this if you need to return IVs */\n";
+  }
+  if ($params->{NV}) {
+    $xs .= "	NV		nv;\n";
+  } else {
+    $xs .= "	/* NV\t\tnv;\tUncomment this if you need to return NVs */\n";
+  }
+  if ($params->{PV}) {
+    $xs .= "	const char	*pv;\n";
+  } else {
+    $xs .=
+      "	/* const char\t*pv;\tUncomment this if you need to return PVs */\n";
+  }
+
+  $xs .= << 'EOT';
+    INPUT:
+	SV *		sv;
+        const char *	s = SvPV(sv, len);
+EOT
+  if ($params->{''}) {
+  $xs .= << 'EOT';
+    INPUT:
+	int		utf8 = SvUTF8(sv);
+EOT
+  }
+  $xs .= << 'EOT';
+    PPCODE:
+EOT
+
+  if ($params->{IV} xor $params->{NV}) {
+    $xs .= << "EOT";
+        /* Change this to $C_subname(aTHX_ s, len, &iv, &nv);
+           if you need to return both NVs and IVs */
+EOT
+  }
+  $xs .= "	type = $C_subname(aTHX_ s, len";
+  $xs .= ', utf8' if $params->{''};
+  $xs .= ', &iv' if $params->{IV};
+  $xs .= ', &nv' if $params->{NV};
+  $xs .= ', &pv' if $params->{PV};
+  $xs .= ', &sv' if $params->{SV};
+  $xs .= ");\n";
+
+  $xs .= << "EOT";
+      /* Return 1 or 2 items. First is error message, or undef if no error.
+           Second, if present, is found value */
+        switch (type) {
+        case PERL_constant_NOTFOUND:
+          sv = sv_2mortal(newSVpvf("%s is not a valid $package macro", s));
+          PUSHs(sv);
+          break;
+        case PERL_constant_NOTDEF:
+          sv = sv_2mortal(newSVpvf(
+	    "Your vendor has not defined $package macro %s, used", s));
+          PUSHs(sv);
+          break;
+EOT
+
+  foreach $type (sort keys %XS_Constant) {
+    # '' marks utf8 flag needed.
+    next if $type eq '';
+    $xs .= "\t/* Uncomment this if you need to return ${type}s\n"
+      unless $what->{$type};
+    $xs .= "        case PERL_constant_IS$type:\n";
+    if (length $XS_Constant{$type}) {
+      $xs .= << "EOT";
+          EXTEND(SP, 1);
+          PUSHs(&PL_sv_undef);
+          $XS_Constant{$type};
+EOT
+    } else {
+      # Do nothing. return (), which will be correctly interpreted as
+      # (undef, undef)
+    }
+    $xs .= "          break;\n";
+    unless ($what->{$type}) {
+      chop $xs; # Yes, another need for chop not chomp.
+      $xs .= " */\n";
+    }
+  }
+  $xs .= << "EOT";
+        default:
+          sv = sv_2mortal(newSVpvf(
+	    "Unexpected return type %d while processing $package macro %s, used",
+               type, s));
+          PUSHs(sv);
+        }
+EOT
+
+  return $xs;
+}
+
+
+=item autoload PACKAGE, VERSION, AUTOLOADER
+
+A function to generate the AUTOLOAD subroutine for the module I<PACKAGE>
+I<VERSION> is the perl version the code should be backwards compatible with.
+It defaults to the version of perl running the subroutine.  If I<AUTOLOADER>
+is true, the AUTOLOAD subroutine falls back on AutoLoader::AUTOLOAD for all
+names that the constant() routine doesn't recognise.
+
+=cut
+
+# ' # Grr. syntax highlighters that don't grok pod.
+
+sub autoload {
+  my ($module, $compat_version, $autoloader) = @_;
+  $compat_version ||= $];
+  croak "Can't maintain compatibility back as far as version $compat_version"
+    if $compat_version < 5;
+  my $func = "sub AUTOLOAD {\n"
+  . "    # This AUTOLOAD is used to 'autoload' constants from the constant()\n"
+  . "    # XS function.";
+  $func .= "  If a constant is not found then control is passed\n"
+  . "    # to the AUTOLOAD in AutoLoader." if $autoloader;
+
+
+  $func .= "\n\n"
+  . "    my \$constname;\n";
+  $func .=
+    "    our \$AUTOLOAD;\n"  if ($compat_version >= 5.006);
+
+  $func .= <<"EOT";
+    (\$constname = \$AUTOLOAD) =~ s/.*:://;
+    croak "&${module}::constant not defined" if \$constname eq 'constant';
+    my (\$error, \$val) = constant(\$constname);
+EOT
+
+  if ($autoloader) {
+    $func .= <<'EOT';
+    if ($error) {
+	if ($error =~  /is not a valid/) {
+	    $AutoLoader::AUTOLOAD = $AUTOLOAD;
+	    goto &AutoLoader::AUTOLOAD;
+	} else {
+	    croak $error;
+	}
+    }
+EOT
+  } else {
+    $func .=
+      "    if (\$error) { croak \$error; }\n";
+  }
+
+  $func .= <<'END';
+    {
+	no strict 'refs';
+	# Fixed between 5.005_53 and 5.005_61
+#XXX	if ($] >= 5.00561) {
+#XXX	    *$AUTOLOAD = sub () { $val };
+#XXX	}
+#XXX	else {
+	    *$AUTOLOAD = sub { $val };
+#XXX	}
+    }
+    goto &$AUTOLOAD;
+}
+
+END
+
+  return $func;
+}
+
+
+=item WriteMakefileSnippet
+
+WriteMakefileSnippet ATTRIBUTE =E<gt> VALUE [, ...] 
+
+A function to generate perl code for Makefile.PL that will regenerate
+the constant subroutines.  Parameters are named as passed to C<WriteConstants>,
+with the addition of C<INDENT> to specify the number of leading spaces
+(default 2).
+
+Currently only C<INDENT>, C<NAME>, C<DEFAULT_TYPE>, C<NAMES>, C<C_FILE> and
+C<XS_FILE> are recognised.
+
+=cut
+
+sub WriteMakefileSnippet {
+  my %args = @_;
+  my $indent = $args{INDENT} || 2;
+
+  my $result = <<"EOT";
+ExtUtils::Constant::WriteConstants(
+                                   NAME         => '$args{NAME}',
+                                   NAMES        => \\\@names,
+                                   DEFAULT_TYPE => '$args{DEFAULT_TYPE}',
+EOT
+  foreach (qw (C_FILE XS_FILE)) {
+    next unless exists $args{$_};
+    $result .= sprintf "                                   %-12s => '%s',\n",
+      $_, $args{$_};
+  }
+  $result .= <<'EOT';
+                                );
+EOT
+
+  $result =~ s/^/' 'x$indent/gem;
+  return ExtUtils::Constant::XS->dump_names({default_type=>$args{DEFAULT_TYPE},
+					     indent=>$indent,},
+					    @{$args{NAMES}})
+    . $result;
+}
+
+=item WriteConstants ATTRIBUTE =E<gt> VALUE [, ...]
+
+Writes a file of C code and a file of XS code which you should C<#include>
+and C<INCLUDE> in the C and XS sections respectively of your module's XS
+code.  You probably want to do this in your C<Makefile.PL>, so that you can
+easily edit the list of constants without touching the rest of your module.
+The attributes supported are
+
+=over 4
+
+=item NAME
+
+Name of the module.  This must be specified
+
+=item DEFAULT_TYPE
+
+The default type for the constants.  If not specified C<IV> is assumed.
+
+=item BREAKOUT_AT
+
+The names of the constants are grouped by length.  Generate child subroutines
+for each group with this number or more names in.
+
+=item NAMES
+
+An array of constants' names, either scalars containing names, or hashrefs
+as detailed in L<"C_constant">.
+
+=item C_FILE
+
+The name of the file to write containing the C code.  The default is
+C<const-c.inc>.  The C<-> in the name ensures that the file can't be
+mistaken for anything related to a legitimate perl package name, and
+not naming the file C<.c> avoids having to override Makefile.PL's
+C<.xs> to C<.c> rules.
+
+=item XS_FILE
+
+The name of the file to write containing the XS code.  The default is
+C<const-xs.inc>.
+
+=item SUBNAME
+
+The perl visible name of the XS subroutine generated which will return the
+constants. The default is C<constant>.
+
+=item C_SUBNAME
+
+The name of the C subroutine generated which will return the constants.
+The default is I<SUBNAME>.  Child subroutines have C<_> and the name
+length appended, so constants with 10 character names would be in
+C<constant_10> with the default I<XS_SUBNAME>.
+
+=back
+
+=cut
+
+sub WriteConstants {
+  my %ARGS =
+    ( # defaults
+     C_FILE =>       'const-c.inc',
+     XS_FILE =>      'const-xs.inc',
+     SUBNAME =>      'constant',
+     DEFAULT_TYPE => 'IV',
+     @_);
+
+  $ARGS{C_SUBNAME} ||= $ARGS{SUBNAME}; # No-one sane will have C_SUBNAME eq '0'
+
+  croak "Module name not specified" unless length $ARGS{NAME};
+
+  my ($c_fh, $xs_fh);
+  if ($] <= 5.008) {
+      # We need these little games, rather than doing things unconditionally,
+      # because we're used in core Makefile.PLs before IO is available (needed
+      # by filehandle), but also we want to work on older perls where undefined
+      # scalars do not automatically turn into anonymous file handles.
+      require FileHandle;
+      $c_fh = FileHandle->new();
+      $xs_fh = FileHandle->new();
+  }
+  open $c_fh, ">$ARGS{C_FILE}" or die "Can't open $ARGS{C_FILE}: $!";
+  open $xs_fh, ">$ARGS{XS_FILE}" or die "Can't open $ARGS{XS_FILE}: $!";
+
+  # As this subroutine is intended to make code that isn't edited, there's no
+  # need for the user to specify any types that aren't found in the list of
+  # names.
+  my $types = {};
+
+  print $c_fh constant_types(); # macro defs
+  print $c_fh "\n";
+
+  # indent is still undef. Until anyone implements indent style rules with it.
+  foreach (ExtUtils::Constant::XS->C_constant({package => $ARGS{NAME},
+					       subname => $ARGS{C_SUBNAME},
+					       default_type =>
+					       $ARGS{DEFAULT_TYPE},
+					       types => $types,
+					       breakout => $ARGS{BREAKOUT_AT}},
+					       @{$ARGS{NAMES}})) {
+    print $c_fh $_, "\n"; # C constant subs
+  }
+  print $xs_fh XS_constant ($ARGS{NAME}, $types, $ARGS{XS_SUBNAME},
+                            $ARGS{C_SUBNAME});
+
+  close $c_fh or warn "Error closing $ARGS{C_FILE}: $!";
+  close $xs_fh or warn "Error closing $ARGS{XS_FILE}: $!";
+}
+
+1;
+__END__
+
+=back
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org> based on the code in C<h2xs> by Larry Wall and
+others
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant/Base.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant/Base.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant/Base.pm	(revision 14489)
@@ -0,0 +1,973 @@
+package ExtUtils::Constant::Base;
+
+use strict;
+use vars qw($VERSION $is_perl56);
+use Carp;
+use Text::Wrap;
+use ExtUtils::Constant::Utils qw(C_stringify perl_stringify);
+
+$VERSION = '0.01';
+
+$is_perl56 = ($] < 5.007 && $] > 5.005_50);
+
+
+=head1 NAME
+
+ExtUtils::Constant::Base - base class for ExtUtils::Constant objects
+
+=head1 SYNOPSIS
+
+    require ExtUtils::Constant::Base;
+    @ISA = 'ExtUtils::Constant::Base';
+
+=head1 DESCRIPTION
+
+ExtUtils::Constant::Base provides a base implementation of methods to
+generate C code to give fast constant value lookup by named string. Currently
+it's mostly used ExtUtils::Constant::XS, which generates the lookup code
+for the constant() subroutine found in many XS modules.
+
+=head1 USAGE
+
+ExtUtils::Constant::Base exports no subroutines. The following methods are
+available
+
+=over 4
+
+=cut
+
+sub valid_type {
+  # Default to assuming that you don't need different types of return data.
+  1;
+}
+sub default_type {
+  '';
+}
+
+=item header
+
+A method returning a scalar containing definitions needed, typically for a
+C header file.
+
+=cut
+
+sub header {
+  ''
+}
+
+# This might actually be a return statement. Note that you are responsible
+# for any space you might need before your value, as it lets to perform
+# "tricks" such as "return KEY_" and have strings appended.
+sub assignment_clause_for_type;
+# In which case this might be an empty string
+sub return_statement_for_type {undef};
+sub return_statement_for_notdef;
+sub return_statement_for_notfound;
+
+# "#if 1" is true to a C pre-processor
+sub macro_from_name {
+  1;
+}
+
+sub name_param {
+  'name';
+}
+
+# This is possibly buggy, in that it's not mandatory (below, in the main
+# C_constant parameters, but is expected to exist here, if it's needed)
+# Buggy because if you're definitely pure 8 bit only, and will never be
+# presented with your constants in utf8, the default form of C_constant can't
+# be told not to do the utf8 version.
+
+sub is_utf8_param {
+  'utf8';
+}
+
+sub memEQ {
+  "!memcmp";
+}
+
+=item memEQ_clause args_hashref
+
+A method to return a suitable C C<if> statement to check whether I<name>
+is equal to the C variable C<name>. If I<checked_at> is defined, then it
+is used to avoid C<memEQ> for short names, or to generate a comment to
+highlight the position of the character in the C<switch> statement.
+
+If i<checked_at> is a reference to a scalar, then instead it gives
+the characters pre-checked at the beginning, (and the number of chars by
+which the C variable name has been advanced. These need to be chopped from
+the front of I<name>).
+
+=cut
+
+sub memEQ_clause {
+#    if (memEQ(name, "thingy", 6)) {
+  # Which could actually be a character comparison or even ""
+  my ($self, $args) = @_;
+  my ($name, $checked_at, $indent) = @{$args}{qw(name checked_at indent)};
+  $indent = ' ' x ($indent || 4);
+  my $front_chop;
+  if (ref $checked_at) {
+    # regexp won't work on 5.6.1 without use utf8; in turn that won't work
+    # on 5.005_03.
+    substr ($name, 0, length $$checked_at,) = '';
+    $front_chop = C_stringify ($$checked_at);
+    undef $checked_at;
+  }
+  my $len = length $name;
+
+  if ($len < 2) {
+    return $indent . "{\n"
+	if (defined $checked_at and $checked_at == 0) or $len == 0;
+    # We didn't switch, drop through to the code for the 2 character string
+    $checked_at = 1;
+  }
+
+  my $name_param = $self->name_param;
+
+  if ($len < 3 and defined $checked_at) {
+    my $check;
+    if ($checked_at == 1) {
+      $check = 0;
+    } elsif ($checked_at == 0) {
+      $check = 1;
+    }
+    if (defined $check) {
+      my $char = C_stringify (substr $name, $check, 1);
+      # Placate 5.005 with a break in the string. I can't see a good way of
+      # getting it to not take [ as introducing an array lookup, even with
+      # ${name_param}[$check]
+      return $indent . "if ($name_param" . "[$check] == '$char') {\n";
+    }
+  }
+  if (($len == 2 and !defined $checked_at)
+     or ($len == 3 and defined ($checked_at) and $checked_at == 2)) {
+    my $char1 = C_stringify (substr $name, 0, 1);
+    my $char2 = C_stringify (substr $name, 1, 1);
+    return $indent .
+      "if ($name_param" . "[0] == '$char1' && $name_param" . "[1] == '$char2') {\n";
+  }
+  if (($len == 3 and defined ($checked_at) and $checked_at == 1)) {
+    my $char1 = C_stringify (substr $name, 0, 1);
+    my $char2 = C_stringify (substr $name, 2, 1);
+    return $indent .
+      "if ($name_param" . "[0] == '$char1' && $name_param" . "[2] == '$char2') {\n";
+  }
+
+  my $pointer = '^';
+  my $have_checked_last = defined ($checked_at) && $len == $checked_at + 1;
+  if ($have_checked_last) {
+    # Checked at the last character, so no need to memEQ it.
+    $pointer = C_stringify (chop $name);
+    $len--;
+  }
+
+  $name = C_stringify ($name);
+  my $memEQ = $self->memEQ();
+  my $body = $indent . "if ($memEQ($name_param, \"$name\", $len)) {\n";
+  # Put a little ^ under the letter we checked at
+  # Screws up for non printable and non-7 bit stuff, but that's too hard to
+  # get right.
+  if (defined $checked_at) {
+    $body .= $indent . "/*      " . (' ' x length $memEQ)
+      . (' ' x length $name_param)
+      . (' ' x $checked_at) . $pointer
+      . (' ' x ($len - $checked_at + length $len)) . "    */\n";
+  } elsif (defined $front_chop) {
+    $body .= $indent . "/*                $front_chop"
+      . (' ' x ($len + 1 + length $len)) . "    */\n";
+  }
+  return $body;
+}
+
+=item dump_names arg_hashref, ITEM...
+
+An internal function to generate the embedded perl code that will regenerate
+the constant subroutines.  I<default_type>, I<types> and I<ITEM>s are the
+same as for C_constant.  I<indent> is treated as number of spaces to indent
+by.  If C<declare_types> is true a C<$types> is always declared in the perl
+code generated, if defined and false never declared, and if undefined C<$types>
+is only declared if the values in I<types> as passed in cannot be inferred from
+I<default_types> and the I<ITEM>s.
+
+=cut
+
+sub dump_names {
+  my ($self, $args, @items) = @_;
+  my ($default_type, $what, $indent, $declare_types)
+    = @{$args}{qw(default_type what indent declare_types)};
+  $indent = ' ' x ($indent || 0);
+
+  my $result;
+  my (@simple, @complex, %used_types);
+  foreach (@items) {
+    my $type;
+    if (ref $_) {
+      $type = $_->{type} || $default_type;
+      if ($_->{utf8}) {
+        # For simplicity always skip the bytes case, and reconstitute this entry
+        # from its utf8 twin.
+        next if $_->{utf8} eq 'no';
+        # Copy the hashref, as we don't want to mess with the caller's hashref.
+        $_ = {%$_};
+        unless ($is_perl56) {
+          utf8::decode ($_->{name});
+        } else {
+          $_->{name} = pack 'U*', unpack 'U0U*', $_->{name};
+        }
+        delete $_->{utf8};
+      }
+    } else {
+      $_ = {name=>$_};
+      $type = $default_type;
+    }
+    $used_types{$type}++;
+    if ($type eq $default_type
+        # grr 5.6.1
+        and length $_->{name}
+        and length $_->{name} == ($_->{name} =~ tr/A-Za-z0-9_//)
+        and !defined ($_->{macro}) and !defined ($_->{value})
+        and !defined ($_->{default}) and !defined ($_->{pre})
+        and !defined ($_->{post}) and !defined ($_->{def_pre})
+        and !defined ($_->{def_post}) and !defined ($_->{weight})) {
+      # It's the default type, and the name consists only of A-Za-z0-9_
+      push @simple, $_->{name};
+    } else {
+      push @complex, $_;
+    }
+  }
+
+  if (!defined $declare_types) {
+    # Do they pass in any types we weren't already using?
+    foreach (keys %$what) {
+      next if $used_types{$_};
+      $declare_types++; # Found one in $what that wasn't used.
+      last; # And one is enough to terminate this loop
+    }
+  }
+  if ($declare_types) {
+    $result = $indent . 'my $types = {map {($_, 1)} qw('
+      . join (" ", sort keys %$what) . ")};\n";
+  }
+  local $Text::Wrap::huge = 'overflow';
+  local $Text::Wrap::columns = 80;
+  $result .= wrap ($indent . "my \@names = (qw(",
+		   $indent . "               ", join (" ", sort @simple) . ")");
+  if (@complex) {
+    foreach my $item (sort {$a->{name} cmp $b->{name}} @complex) {
+      my $name = perl_stringify $item->{name};
+      my $line = ",\n$indent            {name=>\"$name\"";
+      $line .= ", type=>\"$item->{type}\"" if defined $item->{type};
+      foreach my $thing (qw (macro value default pre post def_pre def_post)) {
+        my $value = $item->{$thing};
+        if (defined $value) {
+          if (ref $value) {
+            $line .= ", $thing=>[\""
+              . join ('", "', map {perl_stringify $_} @$value) . '"]';
+          } else {
+            $line .= ", $thing=>\"" . perl_stringify($value) . "\"";
+          }
+        }
+      }
+      $line .= "}";
+      # Ensure that the enclosing C comment doesn't end
+      # by turning */  into *" . "/
+      $line =~ s!\*\/!\*" . "/!gs;
+      # gcc -Wall doesn't like finding /* inside a comment
+      $line =~ s!\/\*!/" . "\*!gs;
+      $result .= $line;
+    }
+  }
+  $result .= ");\n";
+
+  $result;
+}
+
+=item assign arg_hashref, VALUE...
+
+A method to return a suitable assignment clause. If I<type> is aggregate
+(eg I<PVN> expects both pointer and length) then there should be multiple
+I<VALUE>s for the components. I<pre> and I<post> if defined give snippets
+of C code to proceed and follow the assignment. I<pre> will be at the start
+of a block, so variables may be defined in it.
+
+=cut
+# Hmm. value undef to to NOTDEF? value () to do NOTFOUND?
+
+sub assign {
+  my $self = shift;
+  my $args = shift;
+  my ($indent, $type, $pre, $post, $item)
+      = @{$args}{qw(indent type pre post item)};
+  $post ||= '';
+  my $clause;
+  my $close;
+  if ($pre) {
+    chomp $pre;
+    $close = "$indent}\n";
+    $clause = $indent . "{\n";
+    $indent .= "  ";
+    $clause .= "$indent$pre";
+    $clause .= ";" unless $pre =~ /;$/;
+    $clause .= "\n";
+  }
+  confess "undef \$type" unless defined $type;
+  confess "Can't generate code for type $type"
+    unless $self->valid_type($type);
+
+  $clause .= join '', map {"$indent$_\n"}
+    $self->assignment_clause_for_type({type=>$type,item=>$item}, @_);
+  chomp $post;
+  if (length $post) {
+    $clause .= "$post";
+    $clause .= ";" unless $post =~ /;$/;
+    $clause .= "\n";
+  }
+  my $return = $self->return_statement_for_type($type);
+  $clause .= "$indent$return\n" if defined $return;
+  $clause .= $close if $close;
+  return $clause;
+}
+
+=item return_clause arg_hashref, ITEM
+
+A method to return a suitable C<#ifdef> clause. I<ITEM> is a hashref
+(as passed to C<C_constant> and C<match_clause>. I<indent> is the number
+of spaces to indent, defaulting to 6.
+
+=cut
+
+sub return_clause {
+
+##ifdef thingy
+#      *iv_return = thingy;
+#      return PERL_constant_ISIV;
+##else
+#      return PERL_constant_NOTDEF;
+##endif
+  my ($self, $args, $item) = @_;
+  my $indent = $args->{indent};
+
+  my ($name, $value, $macro, $default, $pre, $post, $def_pre, $def_post, $type)
+    = @$item{qw (name value macro default pre post def_pre def_post type)};
+  $value = $name unless defined $value;
+  $macro = $self->macro_from_name($item) unless defined $macro;
+  # "#if 1" is true to a C pre-processor
+  $macro = 1 if !defined $macro or $macro eq '';
+  $indent = ' ' x ($indent || 6);
+  unless (defined $type) {
+    # use Data::Dumper; print STDERR Dumper ($item);
+    confess "undef \$type";
+  }
+
+  my $clause;
+
+  ##ifdef thingy
+  if (ref $macro) {
+    $clause = $macro->[0];
+  } elsif ($macro ne "1") {
+    $clause = "#ifdef $macro\n";
+  }
+
+  #      *iv_return = thingy;
+  #      return PERL_constant_ISIV;
+  $clause
+    .= $self->assign ({indent=>$indent, type=>$type, pre=>$pre, post=>$post,
+		       item=>$item}, ref $value ? @$value : $value);
+
+  if (ref $macro or $macro ne "1") {
+    ##else
+    $clause .= "#else\n";
+
+    #      return PERL_constant_NOTDEF;
+    if (!defined $default) {
+      my $notdef = $self->return_statement_for_notdef();
+      $clause .= "$indent$notdef\n" if defined $notdef;
+    } else {
+      my @default = ref $default ? @$default : $default;
+      $type = shift @default;
+      $clause .= $self->assign ({indent=>$indent, type=>$type, pre=>$pre,
+				 post=>$post, item=>$item}, @default);
+    }
+
+    ##endif
+    if (ref $macro) {
+      $clause .= $macro->[1];
+    } else {
+      $clause .= "#endif\n";
+    }
+  }
+  return $clause;
+}
+
+sub match_clause {
+  # $offset defined if we have checked an offset.
+  my ($self, $args, $item) = @_;
+  my ($offset, $indent) = @{$args}{qw(checked_at indent)};
+  $indent = ' ' x ($indent || 4);
+  my $body = '';
+  my ($no, $yes, $either, $name, $inner_indent);
+  if (ref $item eq 'ARRAY') {
+    ($yes, $no) = @$item;
+    $either = $yes || $no;
+    confess "$item is $either expecting hashref in [0] || [1]"
+      unless ref $either eq 'HASH';
+    $name = $either->{name};
+  } else {
+    confess "$item->{name} has utf8 flag '$item->{utf8}', should be false"
+      if $item->{utf8};
+    $name = $item->{name};
+    $inner_indent = $indent;
+  }
+
+  $body .= $self->memEQ_clause ({name => $name, checked_at => $offset,
+				 indent => length $indent});
+  # If we've been presented with an arrayref for $item, then the user string
+  # contains in the range 128-255, and we need to check whether it was utf8
+  # (or not).
+  # In the worst case we have two named constants, where one's name happens
+  # encoded in UTF8 happens to be the same byte sequence as the second's
+  # encoded in (say) ISO-8859-1.
+  # In this case, $yes and $no both have item hashrefs.
+  if ($yes) {
+    $body .= $indent . "  if (" . $self->is_utf8_param . ") {\n";
+  } elsif ($no) {
+    $body .= $indent . "  if (!" . $self->is_utf8_param . ") {\n";
+  }
+  if ($either) {
+    $body .= $self->return_clause ({indent=>4 + length $indent}, $either);
+    if ($yes and $no) {
+      $body .= $indent . "  } else {\n";
+      $body .= $self->return_clause ({indent=>4 + length $indent}, $no);
+    }
+    $body .= $indent . "  }\n";
+  } else {
+    $body .= $self->return_clause ({indent=>2 + length $indent}, $item);
+  }
+  $body .= $indent . "}\n";
+}
+
+
+=item switch_clause arg_hashref, NAMELEN, ITEMHASH, ITEM...
+
+An internal method to generate a suitable C<switch> clause, called by
+C<C_constant> I<ITEM>s are in the hash ref format as given in the description
+of C<C_constant>, and must all have the names of the same length, given by
+I<NAMELEN>.  I<ITEMHASH> is a reference to a hash, keyed by name, values being
+the hashrefs in the I<ITEM> list.  (No parameters are modified, and there can
+be keys in the I<ITEMHASH> that are not in the list of I<ITEM>s without
+causing problems - the hash is passed in to save generating it afresh for
+each call).
+
+=cut
+
+sub switch_clause {
+  my ($self, $args, $namelen, $items, @items) = @_;
+  my ($indent, $comment) = @{$args}{qw(indent comment)};
+  $indent = ' ' x ($indent || 2);
+
+  local $Text::Wrap::huge = 'overflow';
+  local $Text::Wrap::columns = 80;
+
+  my @names = sort map {$_->{name}} @items;
+  my $leader = $indent . '/* ';
+  my $follower = ' ' x length $leader;
+  my $body = $indent . "/* Names all of length $namelen.  */\n";
+  if (defined $comment) {
+    $body = wrap ($leader, $follower, $comment) . "\n";
+    $leader = $follower;
+  }
+  my @safe_names = @names;
+  foreach (@safe_names) {
+    confess sprintf "Name '$_' is length %d, not $namelen", length
+      unless length == $namelen;
+    # Argh. 5.6.1
+    # next unless tr/A-Za-z0-9_//c;
+    next if tr/A-Za-z0-9_// == length;
+    $_ = '"' . perl_stringify ($_) . '"';
+    # Ensure that the enclosing C comment doesn't end
+    # by turning */  into *" . "/
+    s!\*\/!\*"."/!gs;
+    # gcc -Wall doesn't like finding /* inside a comment
+    s!\/\*!/"."\*!gs;
+  }
+  $body .= wrap ($leader, $follower, join (" ", @safe_names) . " */") . "\n";
+  # Figure out what to switch on.
+  # (RMS, Spread of jump table, Position, Hashref)
+  my @best = (1e38, ~0);
+  # Prefer the last character over the others. (As it lets us shorten the
+  # memEQ clause at no cost).
+  foreach my $i ($namelen - 1, 0 .. ($namelen - 2)) {
+    my ($min, $max) = (~0, 0);
+    my %spread;
+    if ($is_perl56) {
+      # Need proper Unicode preserving hash keys for bytes in range 128-255
+      # here too, for some reason. grr 5.6.1 yet again.
+      tie %spread, 'ExtUtils::Constant::Aaargh56Hash';
+    }
+    foreach (@names) {
+      my $char = substr $_, $i, 1;
+      my $ord = ord $char;
+      confess "char $ord is out of range" if $ord > 255;
+      $max = $ord if $ord > $max;
+      $min = $ord if $ord < $min;
+      push @{$spread{$char}}, $_;
+      # warn "$_ $char";
+    }
+    # I'm going to pick the character to split on that minimises the root
+    # mean square of the number of names in each case. Normally this should
+    # be the one with the most keys, but it may pick a 7 where the 8 has
+    # one long linear search. I'm not sure if RMS or just sum of squares is
+    # actually better.
+    # $max and $min are for the tie-breaker if the root mean squares match.
+    # Assuming that the compiler may be building a jump table for the
+    # switch() then try to minimise the size of that jump table.
+    # Finally use < not <= so that if it still ties the earliest part of
+    # the string wins. Because if that passes but the memEQ fails, it may
+    # only need the start of the string to bin the choice.
+    # I think. But I'm micro-optimising. :-)
+    # OK. Trump that. Now favour the last character of the string, before the
+    # rest.
+    my $ss;
+    $ss += @$_ * @$_ foreach values %spread;
+    my $rms = sqrt ($ss / keys %spread);
+    if ($rms < $best[0] || ($rms == $best[0] && ($max - $min) < $best[1])) {
+      @best = ($rms, $max - $min, $i, \%spread);
+    }
+  }
+  confess "Internal error. Failed to pick a switch point for @names"
+    unless defined $best[2];
+  # use Data::Dumper; print Dumper (@best);
+  my ($offset, $best) = @best[2,3];
+  $body .= $indent . "/* Offset $offset gives the best switch position.  */\n";
+
+  my $do_front_chop = $offset == 0 && $namelen > 2;
+  if ($do_front_chop) {
+    $body .= $indent . "switch (*" . $self->name_param() . "++) {\n";
+  } else {
+    $body .= $indent . "switch (" . $self->name_param() . "[$offset]) {\n";
+  }
+  foreach my $char (sort keys %$best) {
+    confess sprintf "'$char' is %d bytes long, not 1", length $char
+      if length ($char) != 1;
+    confess sprintf "char %#X is out of range", ord $char if ord ($char) > 255;
+    $body .= $indent . "case '" . C_stringify ($char) . "':\n";
+    foreach my $thisone (sort {
+	# Deal with the case of an item actually being an array ref to 1 or 2
+	# hashrefs. Don't assign to $a or $b, as they're aliases to the orignal
+	my $l = ref $a eq 'ARRAY' ? ($a->[0] || $->[1]) : $a;
+	my $r = ref $b eq 'ARRAY' ? ($b->[0] || $->[1]) : $b;
+	# Sort by weight first
+	($r->{weight} || 0) <=> ($l->{weight} || 0)
+	    # Sort equal weights by name
+	    or $l->{name} cmp $r->{name}}
+			 # If this looks evil, maybe it is.  $items is a
+			 # hashref, and we're doing a hash slice on it
+			 @{$items}{@{$best->{$char}}}) {
+      # warn "You are here";
+      if ($do_front_chop) {
+        $body .= $self->match_clause ({indent => 2 + length $indent,
+				       checked_at => \$char}, $thisone);
+      } else {
+        $body .= $self->match_clause ({indent => 2 + length $indent,
+				       checked_at => $offset}, $thisone);
+      }
+    }
+    $body .= $indent . "  break;\n";
+  }
+  $body .= $indent . "}\n";
+  return $body;
+}
+
+sub C_constant_return_type {
+  "static int";
+}
+
+sub C_constant_prefix_param {
+  '';
+}
+
+sub C_constant_prefix_param_defintion {
+  '';
+}
+
+sub name_param_definition {
+  "const char *" . $_[0]->name_param;
+}
+
+sub namelen_param {
+  'len';
+}
+
+sub namelen_param_definition {
+  'size_t ' . $_[0]->namelen_param;
+}
+
+sub C_constant_other_params {
+  '';
+}
+
+sub C_constant_other_params_defintion {
+  '';
+}
+
+=item params WHAT
+
+An "internal" method, subject to change, currently called to allow an
+overriding class to cache information that will then be passed into all
+the C<*param*> calls. (Yes, having to read the source to make sense of this is
+considered a known bug). I<WHAT> is be a hashref of types the constant
+function will return. In ExtUtils::Constant::XS this method is used to
+returns a hashref keyed IV NV PV SV to show which combination of pointers will
+be needed in the C argument list generated by
+C_constant_other_params_definition and C_constant_other_params
+
+=cut
+
+sub params {
+  '';
+}
+
+
+=item dogfood arg_hashref, ITEM...
+
+An internal function to generate the embedded perl code that will regenerate
+the constant subroutines.  Parameters are the same as for C_constant.
+
+Currently the base class does nothing and returns an empty string.
+
+=cut
+
+sub dogfood {
+  ''
+}
+
+=item C_constant arg_hashref, ITEM...
+
+A function that returns a B<list> of C subroutine definitions that return
+the value and type of constants when passed the name by the XS wrapper.
+I<ITEM...> gives a list of constant names. Each can either be a string,
+which is taken as a C macro name, or a reference to a hash with the following
+keys
+
+=over 8
+
+=item name
+
+The name of the constant, as seen by the perl code.
+
+=item type
+
+The type of the constant (I<IV>, I<NV> etc)
+
+=item value
+
+A C expression for the value of the constant, or a list of C expressions if
+the type is aggregate. This defaults to the I<name> if not given.
+
+=item macro
+
+The C pre-processor macro to use in the C<#ifdef>. This defaults to the
+I<name>, and is mainly used if I<value> is an C<enum>. If a reference an
+array is passed then the first element is used in place of the C<#ifdef>
+line, and the second element in place of the C<#endif>. This allows
+pre-processor constructions such as
+
+    #if defined (foo)
+    #if !defined (bar)
+    ...
+    #endif
+    #endif
+
+to be used to determine if a constant is to be defined.
+
+A "macro" 1 signals that the constant is always defined, so the C<#if>/C<#endif>
+test is omitted.
+
+=item default
+
+Default value to use (instead of C<croak>ing with "your vendor has not
+defined...") to return if the macro isn't defined. Specify a reference to
+an array with type followed by value(s).
+
+=item pre
+
+C code to use before the assignment of the value of the constant. This allows
+you to use temporary variables to extract a value from part of a C<struct>
+and return this as I<value>. This C code is places at the start of a block,
+so you can declare variables in it.
+
+=item post
+
+C code to place between the assignment of value (to a temporary) and the
+return from the function. This allows you to clear up anything in I<pre>.
+Rarely needed.
+
+=item def_pre
+
+=item def_post
+
+Equivalents of I<pre> and I<post> for the default value.
+
+=item utf8
+
+Generated internally. Is zero or undefined if name is 7 bit ASCII,
+"no" if the name is 8 bit (and so should only match if SvUTF8() is false),
+"yes" if the name is utf8 encoded.
+
+The internals automatically clone any name with characters 128-255 but none
+256+ (ie one that could be either in bytes or utf8) into a second entry
+which is utf8 encoded.
+
+=item weight
+
+Optional sorting weight for names, to determine the order of
+linear testing when multiple names fall in the same case of a switch clause.
+Higher comes earlier, undefined defaults to zero.
+
+=back
+
+In the argument hashref, I<package> is the name of the package, and is only
+used in comments inside the generated C code. I<subname> defaults to
+C<constant> if undefined.
+
+I<default_type> is the type returned by C<ITEM>s that don't specify their
+type. It defaults to the value of C<default_type()>. I<types> should be given
+either as a comma separated list of types that the C subroutine I<subname>
+will generate or as a reference to a hash. I<default_type> will be added to
+the list if not present, as will any types given in the list of I<ITEM>s. The
+resultant list should be the same list of types that C<XS_constant> is
+given. [Otherwise C<XS_constant> and C<C_constant> may differ in the number of
+parameters to the constant function. I<indent> is currently unused and
+ignored. In future it may be used to pass in information used to change the C
+indentation style used.]  The best way to maintain consistency is to pass in a
+hash reference and let this function update it.
+
+I<breakout> governs when child functions of I<subname> are generated.  If there
+are I<breakout> or more I<ITEM>s with the same length of name, then the code
+to switch between them is placed into a function named I<subname>_I<len>, for
+example C<constant_5> for names 5 characters long.  The default I<breakout> is
+3.  A single C<ITEM> is always inlined.
+
+=cut
+
+# The parameter now BREAKOUT was previously documented as:
+#
+# I<NAMELEN> if defined signals that all the I<name>s of the I<ITEM>s are of
+# this length, and that the constant name passed in by perl is checked and
+# also of this length. It is used during recursion, and should be C<undef>
+# unless the caller has checked all the lengths during code generation, and
+# the generated subroutine is only to be called with a name of this length.
+#
+# As you can see it now performs this function during recursion by being a
+# scalar reference.
+
+sub C_constant {
+  my ($self, $args, @items) = @_;
+  my ($package, $subname, $default_type, $what, $indent, $breakout) =
+    @{$args}{qw(package subname default_type types indent breakout)};
+  $package ||= 'Foo';
+  $subname ||= 'constant';
+  # I'm not using this. But a hashref could be used for full formatting without
+  # breaking this API
+  # $indent ||= 0;
+
+  my ($namelen, $items);
+  if (ref $breakout) {
+    # We are called recursively. We trust @items to be normalised, $what to
+    # be a hashref, and pinch %$items from our parent to save recalculation.
+    ($namelen, $items) = @$breakout;
+  } else {
+    if ($is_perl56) {
+      # Need proper Unicode preserving hash keys.
+      require ExtUtils::Constant::Aaargh56Hash;
+      $items = {};
+      tie %$items, 'ExtUtils::Constant::Aaargh56Hash';
+    }
+    $breakout ||= 3;
+    $default_type ||= $self->default_type();
+    if (!ref $what) {
+      # Convert line of the form IV,UV,NV to hash
+      $what = {map {$_ => 1} split /,\s*/, ($what || '')};
+      # Figure out what types we're dealing with, and assign all unknowns to the
+      # default type
+    }
+    my @new_items;
+    foreach my $orig (@items) {
+      my ($name, $item);
+      if (ref $orig) {
+        # Make a copy which is a normalised version of the ref passed in.
+        $name = $orig->{name};
+        my ($type, $macro, $value) = @$orig{qw (type macro value)};
+        $type ||= $default_type;
+        $what->{$type} = 1;
+        $item = {name=>$name, type=>$type};
+
+        undef $macro if defined $macro and $macro eq $name;
+        $item->{macro} = $macro if defined $macro;
+        undef $value if defined $value and $value eq $name;
+        $item->{value} = $value if defined $value;
+        foreach my $key (qw(default pre post def_pre def_post weight)) {
+          my $value = $orig->{$key};
+          $item->{$key} = $value if defined $value;
+          # warn "$key $value";
+        }
+      } else {
+        $name = $orig;
+        $item = {name=>$name, type=>$default_type};
+        $what->{$default_type} = 1;
+      }
+      warn +(ref ($self) || $self)
+	. "doesn't know how to handle values of type $_ used in macro $name"
+	  unless $self->valid_type ($item->{type});
+      # tr///c is broken on 5.6.1 for utf8, so my original tr/\0-\177//c
+      # doesn't work. Upgrade to 5.8
+      # if ($name !~ tr/\0-\177//c || $] < 5.005_50) {
+      if ($name =~ tr/\0-\177// == length $name || $] < 5.005_50) {
+        # No characters outside 7 bit ASCII.
+        if (exists $items->{$name}) {
+          die "Multiple definitions for macro $name";
+        }
+        $items->{$name} = $item;
+      } else {
+        # No characters outside 8 bit. This is hardest.
+        if (exists $items->{$name} and ref $items->{$name} ne 'ARRAY') {
+          confess "Unexpected ASCII definition for macro $name";
+        }
+        # Again, 5.6.1 tr broken, so s/5\.6.*/5\.8\.0/;
+        # if ($name !~ tr/\0-\377//c) {
+        if ($name =~ tr/\0-\377// == length $name) {
+#          if ($] < 5.007) {
+#            $name = pack "C*", unpack "U*", $name;
+#          }
+          $item->{utf8} = 'no';
+          $items->{$name}[1] = $item;
+          push @new_items, $item;
+          # Copy item, to create the utf8 variant.
+          $item = {%$item};
+        }
+        # Encode the name as utf8 bytes.
+        unless ($is_perl56) {
+          utf8::encode($name);
+        } else {
+#          warn "Was >$name< " . length ${name};
+          $name = pack 'C*', unpack 'C*', $name . pack 'U*';
+#          warn "Now '${name}' " . length ${name};
+        }
+        if ($items->{$name}[0]) {
+          die "Multiple definitions for macro $name";
+        }
+        $item->{utf8} = 'yes';
+        $item->{name} = $name;
+        $items->{$name}[0] = $item;
+        # We have need for the utf8 flag.
+        $what->{''} = 1;
+      }
+      push @new_items, $item;
+    }
+    @items = @new_items;
+    # use Data::Dumper; print Dumper @items;
+  }
+  my $params = $self->params ($what);
+
+  # Probably "static int"
+  my ($body, @subs);
+  $body = $self->C_constant_return_type($params) . "\n$subname ("
+    # Eg "pTHX_ "
+    . $self->C_constant_prefix_param_defintion($params)
+      # Probably "const char *name"
+      . $self->name_param_definition($params);
+  # Something like ", STRLEN len"
+  $body .= ", " . $self->namelen_param_definition($params)
+    unless defined $namelen;
+  $body .= $self->C_constant_other_params_defintion($params);
+  $body .= ") {\n";
+
+  if (defined $namelen) {
+    # We are a child subroutine. Print the simple description
+    my $comment = 'When generated this function returned values for the list'
+      . ' of names given here.  However, subsequent manual editing may have'
+        . ' added or removed some.';
+    $body .= $self->switch_clause ({indent=>2, comment=>$comment},
+				   $namelen, $items, @items);
+  } else {
+    # We are the top level.
+    $body .= "  /* Initially switch on the length of the name.  */\n";
+    $body .= $self->dogfood ({package => $package, subname => $subname,
+			      default_type => $default_type, what => $what,
+			      indent => $indent, breakout => $breakout},
+			     @items);
+    $body .= '  switch ('.$self->namelen_param().") {\n";
+    # Need to group names of the same length
+    my @by_length;
+    foreach (@items) {
+      push @{$by_length[length $_->{name}]}, $_;
+    }
+    foreach my $i (0 .. $#by_length) {
+      next unless $by_length[$i];	# None of this length
+      $body .= "  case $i:\n";
+      if (@{$by_length[$i]} == 1) {
+        my $only_thing = $by_length[$i]->[0];
+        if ($only_thing->{utf8}) {
+          if ($only_thing->{utf8} eq 'yes') {
+            # With utf8 on flag item is passed in element 0
+            $body .= $self->match_clause (undef, [$only_thing]);
+          } else {
+            # With utf8 off flag item is passed in element 1
+            $body .= $self->match_clause (undef, [undef, $only_thing]);
+          }
+        } else {
+          $body .= $self->match_clause (undef, $only_thing);
+        }
+      } elsif (@{$by_length[$i]} < $breakout) {
+        $body .= $self->switch_clause ({indent=>4},
+				       $i, $items, @{$by_length[$i]});
+      } else {
+        # Only use the minimal set of parameters actually needed by the types
+        # of the names of this length.
+        my $what = {};
+        foreach (@{$by_length[$i]}) {
+          $what->{$_->{type}} = 1;
+          $what->{''} = 1 if $_->{utf8};
+        }
+        $params = $self->params ($what);
+        push @subs, $self->C_constant ({package=>$package,
+					subname=>"${subname}_$i",
+					default_type => $default_type,
+					types => $what, indent => $indent,
+					breakout => [$i, $items]},
+				       @{$by_length[$i]});
+        $body .= "    return ${subname}_$i ("
+	  # Eg "aTHX_ "
+	  . $self->C_constant_prefix_param($params)
+	    # Probably "name"
+	    . $self->name_param($params);
+	$body .= $self->C_constant_other_params($params);
+        $body .= ");\n";
+      }
+      $body .= "    break;\n";
+    }
+    $body .= "  }\n";
+  }
+  my $notfound = $self->return_statement_for_notfound();
+  $body .= "  $notfound\n" if $notfound;
+  $body .= "}\n";
+  return (@subs, $body);
+}
+
+1;
+__END__
+
+=back
+
+=head1 BUGS
+
+Not everything is documented yet.
+
+Probably others.
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org> based on the code in C<h2xs> by Larry Wall and
+others
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant/Utils.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant/Utils.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant/Utils.pm	(revision 14489)
@@ -0,0 +1,123 @@
+package ExtUtils::Constant::Utils;
+
+use strict;
+use vars qw($VERSION @EXPORT_OK @ISA $is_perl56);
+use Carp;
+
+@ISA = 'Exporter';
+@EXPORT_OK = qw(C_stringify perl_stringify);
+$VERSION = '0.01';
+
+$is_perl56 = ($] < 5.007 && $] > 5.005_50);
+
+=head1 NAME
+
+ExtUtils::Constant::Utils - helper functions for ExtUtils::Constant
+
+=head1 SYNOPSIS
+
+    use ExtUtils::Constant::Utils qw (C_stringify);
+    $C_code = C_stringify $stuff;
+
+=head1 DESCRIPTION
+
+ExtUtils::Constant::Utils packages up utility subroutines used by
+ExtUtils::Constant, ExtUtils::Constant::Base and derived classes. All its
+functions are explicitly exportable.
+
+=head1 USAGE
+
+=over 4
+
+=item C_stringify NAME
+
+A function which returns a 7 bit ASCII correctly \ escaped version of the
+string passed suitable for C's "" or ''. It will die if passed Unicode
+characters.
+
+=cut
+
+# Hopefully make a happy C identifier.
+sub C_stringify {
+  local $_ = shift;
+  return unless defined $_;
+  # grr 5.6.1
+  confess "Wide character in '$_' intended as a C identifier"
+    if tr/\0-\377// != length;
+  # grr 5.6.1 moreso because its regexps will break on data that happens to
+  # be utf8, which includes my 8 bit test cases.
+  $_ = pack 'C*', unpack 'U*', $_ . pack 'U*' if $is_perl56;
+  s/\\/\\\\/g;
+  s/([\"\'])/\\$1/g;	# Grr. fix perl mode.
+  s/\n/\\n/g;		# Ensure newlines don't end up in octal
+  s/\r/\\r/g;
+  s/\t/\\t/g;
+  s/\f/\\f/g;
+  s/\a/\\a/g;
+  s/([^\0-\177])/sprintf "\\%03o", ord $1/ge;
+  unless ($] < 5.006) {
+    # This will elicit a warning on 5.005_03 about [: :] being reserved unless
+    # I cheat
+    my $cheat = '([[:^print:]])';
+    s/$cheat/sprintf "\\%03o", ord $1/ge;
+  } else {
+    require POSIX;
+    s/([^A-Za-z0-9_])/POSIX::isprint($1) ? $1 : sprintf "\\%03o", ord $1/ge;
+  }
+  $_;
+}
+
+=item perl_stringify NAME
+
+A function which returns a 7 bit ASCII correctly \ escaped version of the
+string passed suitable for a perl "" string.
+
+=cut
+
+# Hopefully make a happy perl identifier.
+sub perl_stringify {
+  local $_ = shift;
+  return unless defined $_;
+  s/\\/\\\\/g;
+  s/([\"\'])/\\$1/g;	# Grr. fix perl mode.
+  s/\n/\\n/g;		# Ensure newlines don't end up in octal
+  s/\r/\\r/g;
+  s/\t/\\t/g;
+  s/\f/\\f/g;
+  s/\a/\\a/g;
+  unless ($] < 5.006) {
+    if ($] > 5.007) {
+      s/([^\0-\177])/sprintf "\\x{%X}", ord $1/ge;
+    } else {
+      # Grr 5.6.1. And I don't think I can use utf8; to force the regexp
+      # because 5.005_03 will fail.
+      # This is grim, but I also can't split on //
+      my $copy;
+      foreach my $index (0 .. length ($_) - 1) {
+        my $char = substr ($_, $index, 1);
+        $copy .= ($char le "\177") ? $char : sprintf "\\x{%X}", ord $char;
+      }
+      $_ = $copy;
+    }
+    # This will elicit a warning on 5.005_03 about [: :] being reserved unless
+    # I cheat
+    my $cheat = '([[:^print:]])';
+    s/$cheat/sprintf "\\%03o", ord $1/ge;
+  } else {
+    # Turns out "\x{}" notation only arrived with 5.6
+    s/([^\0-\177])/sprintf "\\x%02X", ord $1/ge;
+    require POSIX;
+    s/([^A-Za-z0-9_])/POSIX::isprint($1) ? $1 : sprintf "\\%03o", ord $1/ge;
+  }
+  $_;
+}
+
+1;
+__END__
+
+=back
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org> based on the code in C<h2xs> by Larry Wall and
+others
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant/XS.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant/XS.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Constant/XS.pm	(revision 14489)
@@ -0,0 +1,252 @@
+package ExtUtils::Constant::XS;
+
+use strict;
+use vars qw($VERSION %XS_Constant %XS_TypeSet @ISA @EXPORT_OK $is_perl56);
+use Carp;
+use ExtUtils::Constant::Utils 'perl_stringify';
+require ExtUtils::Constant::Base;
+
+
+@ISA = qw(ExtUtils::Constant::Base Exporter);
+@EXPORT_OK = qw(%XS_Constant %XS_TypeSet);
+
+$VERSION = '0.01';
+
+$is_perl56 = ($] < 5.007 && $] > 5.005_50);
+
+=head1 NAME
+
+ExtUtils::Constant::Base - base class for ExtUtils::Constant objects
+
+=head1 SYNOPSIS
+
+    require ExtUtils::Constant::XS;
+
+=head1 DESCRIPTION
+
+ExtUtils::Constant::XS overrides ExtUtils::Constant::Base to generate C
+code for XS modules' constants.
+
+=head1 BUGS
+
+Nothing is documented.
+
+Probably others.
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org> based on the code in C<h2xs> by Larry Wall and
+others
+
+=cut
+
+# '' is used as a flag to indicate non-ascii macro names, and hence the need
+# to pass in the utf8 on/off flag.
+%XS_Constant = (
+		''    => '',
+		IV    => 'PUSHi(iv)',
+		UV    => 'PUSHu((UV)iv)',
+		NV    => 'PUSHn(nv)',
+		PV    => 'PUSHp(pv, strlen(pv))',
+		PVN   => 'PUSHp(pv, iv)',
+		SV    => 'PUSHs(sv)',
+		YES   => 'PUSHs(&PL_sv_yes)',
+		NO    => 'PUSHs(&PL_sv_no)',
+		UNDEF => '',	# implicit undef
+);
+
+%XS_TypeSet = (
+		IV    => '*iv_return = ',
+		UV    => '*iv_return = (IV)',
+		NV    => '*nv_return = ',
+		PV    => '*pv_return = ',
+		PVN   => ['*pv_return = ', '*iv_return = (IV)'],
+		SV    => '*sv_return = ',
+		YES   => undef,
+		NO    => undef,
+		UNDEF => undef,
+);
+
+sub header {
+  my $start = 1;
+  my @lines;
+  push @lines, "#define PERL_constant_NOTFOUND\t$start\n"; $start++;
+  push @lines, "#define PERL_constant_NOTDEF\t$start\n"; $start++;
+  foreach (sort keys %XS_Constant) {
+    next if $_ eq '';
+    push @lines, "#define PERL_constant_IS$_\t$start\n"; $start++;
+  }
+  push @lines, << 'EOT';
+
+#ifndef NVTYPE
+typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it.  */
+#endif
+#ifndef aTHX_
+#define aTHX_ /* 5.6 or later define this for threading support.  */
+#endif
+#ifndef pTHX_
+#define pTHX_ /* 5.6 or later define this for threading support.  */
+#endif
+EOT
+
+  return join '', @lines;
+}
+
+sub valid_type {
+  my ($self, $type) = @_;
+  return exists $XS_TypeSet{$type};
+}
+
+# This might actually be a return statement
+sub assignment_clause_for_type {
+  my $self = shift;
+  my $args = shift;
+  my $type = $args->{type};
+  my $typeset = $XS_TypeSet{$type};
+  if (ref $typeset) {
+    die "Type $type is aggregate, but only single value given"
+      if @_ == 1;
+    return map {"$typeset->[$_]$_[$_];"} 0 .. $#$typeset;
+  } elsif (defined $typeset) {
+    confess "Aggregate value given for type $type"
+      if @_ > 1;
+    return "$typeset$_[0];";
+  }
+  return ();
+}
+
+sub return_statement_for_type {
+  my ($self, $type) = @_;
+  # In the future may pass in an options hash
+  $type = $type->{type} if ref $type;
+  "return PERL_constant_IS$type;";
+}
+
+sub return_statement_for_notdef {
+  # my ($self) = @_;
+  "return PERL_constant_NOTDEF;";
+}
+
+sub return_statement_for_notfound {
+  # my ($self) = @_;
+  "return PERL_constant_NOTFOUND;";
+}
+
+sub default_type {
+  'IV';
+}
+
+sub macro_from_name {
+  my ($self, $item) = @_;
+  my $macro = $item->{name};
+  $macro = $item->{value} unless defined $macro;
+  $macro;
+}
+
+# Keep to the traditional perl source macro
+sub memEQ {
+  "memEQ";
+}
+
+sub params {
+  my ($self, $what) = @_;
+  foreach (sort keys %$what) {
+    warn "ExtUtils::Constant doesn't know how to handle values of type $_" unless defined $XS_Constant{$_};
+  }
+  my $params = {};
+  $params->{''} = 1 if $what->{''};
+  $params->{IV} = 1 if $what->{IV} || $what->{UV} || $what->{PVN};
+  $params->{NV} = 1 if $what->{NV};
+  $params->{PV} = 1 if $what->{PV} || $what->{PVN};
+  $params->{SV} = 1 if $what->{SV};
+  return $params;
+}
+
+
+sub C_constant_prefix_param {
+  "aTHX_ ";
+}
+
+sub C_constant_prefix_param_defintion {
+  "pTHX_ ";
+}
+
+sub namelen_param_definition {
+  'STRLEN ' . $_[0] -> namelen_param;
+}
+
+sub C_constant_other_params_defintion {
+  my ($self, $params) = @_;
+  my $body = '';
+  $body .= ", int utf8" if $params->{''};
+  $body .= ", IV *iv_return" if $params->{IV};
+  $body .= ", NV *nv_return" if $params->{NV};
+  $body .= ", const char **pv_return" if $params->{PV};
+  $body .= ", SV **sv_return" if $params->{SV};
+  $body;
+}
+
+sub C_constant_other_params {
+  my ($self, $params) = @_;
+  my $body = '';
+  $body .= ", utf8" if $params->{''};
+  $body .= ", iv_return" if $params->{IV};
+  $body .= ", nv_return" if $params->{NV};
+  $body .= ", pv_return" if $params->{PV};
+  $body .= ", sv_return" if $params->{SV};
+  $body;
+}
+
+sub dogfood {
+  my ($self, $args, @items) = @_;
+  my ($package, $subname, $default_type, $what, $indent, $breakout) =
+    @{$args}{qw(package subname default_type what indent breakout)};
+  my $result = <<"EOT";
+  /* When generated this function returned values for the list of names given
+     in this section of perl code.  Rather than manually editing these functions
+     to add or remove constants, which would result in this comment and section
+     of code becoming inaccurate, we recommend that you edit this section of
+     code, and use it to regenerate a new set of constant functions which you
+     then use to replace the originals.
+
+     Regenerate these constant functions by feeding this entire source file to
+     perl -x
+
+#!$^X -w
+use ExtUtils::Constant qw (constant_types C_constant XS_constant);
+
+EOT
+  $result .= $self->dump_names ({default_type=>$default_type, what=>$what,
+				 indent=>0, declare_types=>1},
+				@items);
+  $result .= <<'EOT';
+
+print constant_types(); # macro defs
+EOT
+  $package = perl_stringify($package);
+  $result .=
+    "foreach (C_constant (\"$package\", '$subname', '$default_type', \$types, ";
+  # The form of the indent parameter isn't defined. (Yet)
+  if (defined $indent) {
+    require Data::Dumper;
+    $Data::Dumper::Terse=1;
+    $Data::Dumper::Terse=1; # Not used once. :-)
+    chomp ($indent = Data::Dumper::Dumper ($indent));
+    $result .= $indent;
+  } else {
+    $result .= 'undef';
+  }
+  $result .= ", $breakout" . ', @names) ) {
+    print $_, "\n"; # C constant subs
+}
+print "#### XS Section:\n";
+print XS_constant ("' . $package . '", $types);
+__END__
+   */
+
+';
+
+  $result;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Embed.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Embed.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Embed.pm	(revision 14489)
@@ -0,0 +1,515 @@
+# $Id: Embed.pm,v 1.1.1.1 2002/01/16 19:27:19 schwern Exp $
+require 5.002;
+
+package ExtUtils::Embed;
+require Exporter;
+require FileHandle;
+use Config;
+use Getopt::Std;
+use File::Spec;
+
+#Only when we need them
+#require ExtUtils::MakeMaker;
+#require ExtUtils::Liblist;
+
+use vars qw(@ISA @EXPORT $VERSION
+	    @Extensions $Verbose $lib_ext
+	    $opt_o $opt_s 
+	    );
+use strict;
+
+$VERSION = 1.26;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(&xsinit &ldopts 
+	     &ccopts &ccflags &ccdlflags &perl_inc
+	     &xsi_header &xsi_protos &xsi_body);
+
+#let's have Miniperl borrow from us instead
+#require ExtUtils::Miniperl;
+#*canon = \&ExtUtils::Miniperl::canon;
+
+$Verbose = 0;
+$lib_ext = $Config{lib_ext} || '.a';
+
+sub is_cmd { $0 eq '-e' }
+
+sub my_return {
+    my $val = shift;
+    if(is_cmd) {
+	print $val;
+    }
+    else {
+	return $val;
+    }
+}
+
+sub xsinit { 
+    my($file, $std, $mods) = @_;
+    my($fh,@mods,%seen);
+    $file ||= "perlxsi.c";
+    my $xsinit_proto = "pTHX";
+
+    if (@_) {
+       @mods = @$mods if $mods;
+    }
+    else {
+       getopts('o:s:');
+       $file = $opt_o if defined $opt_o;
+       $std  = $opt_s  if defined $opt_s;
+       @mods = @ARGV;
+    }
+    $std = 1 unless scalar @mods;
+
+    if ($file eq "STDOUT") {
+	$fh = \*STDOUT;
+    }
+    else {
+	$fh = new FileHandle "> $file";
+    }
+
+    push(@mods, static_ext()) if defined $std;
+    @mods = grep(!$seen{$_}++, @mods);
+
+    print $fh &xsi_header();
+    print $fh "EXTERN_C void xs_init ($xsinit_proto);\n\n";     
+    print $fh &xsi_protos(@mods);
+
+    print $fh "\nEXTERN_C void\nxs_init($xsinit_proto)\n{\n";
+    print $fh &xsi_body(@mods);
+    print $fh "}\n";
+
+}
+
+sub xsi_header {
+    return <<EOF;
+#include <EXTERN.h>
+#include <perl.h>
+
+EOF
+}    
+
+sub xsi_protos {
+    my(@exts) = @_;
+    my(@retval,%seen);
+    my $boot_proto = "pTHX_ CV* cv";
+    foreach $_ (@exts){
+        my($pname) = canon('/', $_);
+        my($mname, $cname);
+        ($mname = $pname) =~ s!/!::!g;
+        ($cname = $pname) =~ s!/!__!g;
+	my($ccode) = "EXTERN_C void boot_${cname} ($boot_proto);\n";
+	next if $seen{$ccode}++;
+        push(@retval, $ccode);
+    }
+    return join '', @retval;
+}
+
+sub xsi_body {
+    my(@exts) = @_;
+    my($pname,@retval,%seen);
+    my($dl) = canon('/','DynaLoader');
+    push(@retval, "\tchar *file = __FILE__;\n");
+    push(@retval, "\tdXSUB_SYS;\n") if $] > 5.002;
+    push(@retval, "\n");
+
+    foreach $_ (@exts){
+        my($pname) = canon('/', $_);
+        my($mname, $cname, $ccode);
+        ($mname = $pname) =~ s!/!::!g;
+        ($cname = $pname) =~ s!/!__!g;
+        if ($pname eq $dl){
+            # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
+            # boot_DynaLoader is called directly in DynaLoader.pm
+            $ccode = "\t/* DynaLoader is a special case */\n\tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
+            push(@retval, $ccode) unless $seen{$ccode}++;
+        } else {
+            $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n";
+            push(@retval, $ccode) unless $seen{$ccode}++;
+        }
+    }
+    return join '', @retval;
+}
+
+sub static_ext {
+    unless (scalar @Extensions) {
+	@Extensions = sort split /\s+/, $Config{static_ext};
+	unshift @Extensions, qw(DynaLoader);
+    }
+    @Extensions;
+}
+
+sub _escape {
+    my $arg = shift;
+    $$arg =~ s/([\(\)])/\\$1/g;
+}
+
+sub _ldflags {
+    my $ldflags = $Config{ldflags};
+    _escape(\$ldflags);
+    return $ldflags;
+}
+
+sub _ccflags {
+    my $ccflags = $Config{ccflags};
+    _escape(\$ccflags);
+    return $ccflags;
+}
+
+sub _ccdlflags {
+    my $ccdlflags = $Config{ccdlflags};
+    _escape(\$ccdlflags);
+    return $ccdlflags;
+}
+
+sub ldopts {
+    require ExtUtils::MakeMaker;
+    require ExtUtils::Liblist;
+    my($std,$mods,$link_args,$path) = @_;
+    my(@mods,@link_args,@argv);
+    my($dllib,$config_libs,@potential_libs,@path);
+    local($") = ' ' unless $" eq ' ';
+    if (scalar @_) {
+       @link_args = @$link_args if $link_args;
+       @mods = @$mods if $mods;
+    }
+    else {
+       @argv = @ARGV;
+       #hmm
+       while($_ = shift @argv) {
+	   /^-std$/  && do { $std = 1; next; };
+	   /^--$/    && do { @link_args = @argv; last; };
+	   /^-I(.*)/ && do { $path = $1 || shift @argv; next; };
+	   push(@mods, $_); 
+       }
+    }
+    $std = 1 unless scalar @link_args;
+    my $sep = $Config{path_sep} || ':';
+    @path = $path ? split(/\Q$sep/, $path) : @INC;
+
+    push(@potential_libs, @link_args)    if scalar @link_args;
+    # makemaker includes std libs on windows by default
+    if ($^O ne 'MSWin32' and defined($std)) {
+	push(@potential_libs, $Config{perllibs});
+    }
+
+    push(@mods, static_ext()) if $std;
+
+    my($mod,@ns,$root,$sub,$extra,$archive,@archives);
+    print STDERR "Searching (@path) for archives\n" if $Verbose;
+    foreach $mod (@mods) {
+	@ns = split(/::|\/|\\/, $mod);
+	$sub = $ns[-1];
+	$root = File::Spec->catdir(@ns);
+	
+	print STDERR "searching for '$sub${lib_ext}'\n" if $Verbose;
+	foreach (@path) {
+	    next unless -e ($archive = File::Spec->catdir($_,"auto",$root,"$sub$lib_ext"));
+	    push @archives, $archive;
+	    if(-e ($extra = File::Spec->catdir($_,"auto",$root,"extralibs.ld"))) {
+		local(*FH); 
+		if(open(FH, $extra)) {
+		    my($libs) = <FH>; chomp $libs;
+		    push @potential_libs, split /\s+/, $libs;
+		}
+		else {  
+		    warn "Couldn't open '$extra'"; 
+		}
+	    }
+	    last;
+	}
+    }
+    #print STDERR "\@potential_libs = @potential_libs\n";
+
+    my $libperl;
+    if ($^O eq 'MSWin32') {
+	$libperl = $Config{libperl};
+    }
+    else {
+	$libperl = (grep(/^-l\w*perl\w*$/, @link_args))[0]
+	    || ($Config{libperl} =~ /^lib(\w+)(\Q$lib_ext\E|\.\Q$Config{dlext}\E)$/
+		? "-l$1" : '')
+	    || "-lperl";
+    }
+
+    my $lpath = File::Spec->catdir($Config{archlibexp}, 'CORE');
+    $lpath = qq["$lpath"] if $^O eq 'MSWin32';
+    my($extralibs, $bsloadlibs, $ldloadlibs, $ld_run_path) =
+	MM->ext(join ' ', "-L$lpath", $libperl, @potential_libs);
+
+    my $ld_or_bs = $bsloadlibs || $ldloadlibs;
+    print STDERR "bs: $bsloadlibs ** ld: $ldloadlibs" if $Verbose;
+    my $ccdlflags = _ccdlflags();
+    my $ldflags   = _ldflags();
+    my $linkage = "$ccdlflags $ldflags @archives $ld_or_bs";
+    print STDERR "ldopts: '$linkage'\n" if $Verbose;
+
+    return $linkage if scalar @_;
+    my_return("$linkage\n");
+}
+
+sub ccflags {
+    my $ccflags = _ccflags();
+    my_return(" $ccflags ");
+}
+
+sub ccdlflags {
+    my $ccdlflags = _ccdlflags();
+    my_return(" $ccdlflags ");
+}
+
+sub perl_inc {
+    my $dir = File::Spec->catdir($Config{archlibexp}, 'CORE');
+    $dir = qq["$dir"] if $^O eq 'MSWin32';
+    my_return(" -I$dir ");
+}
+
+sub ccopts {
+   ccflags . perl_inc;
+}
+
+sub canon {
+    my($as, @ext) = @_;
+    foreach(@ext) {
+       # might be X::Y or lib/auto/X/Y/Y.a
+       next if s!::!/!g;
+       s:^(lib|ext)/(auto/)?::;
+       s:/\w+\.\w+$::;
+    }
+    grep(s:/:$as:, @ext) if ($as ne '/');
+    @ext;
+}
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications
+
+=head1 SYNOPSIS
+
+
+ perl -MExtUtils::Embed -e xsinit 
+ perl -MExtUtils::Embed -e ccopts 
+ perl -MExtUtils::Embed -e ldopts 
+
+=head1 DESCRIPTION
+
+ExtUtils::Embed provides utility functions for embedding a Perl interpreter
+and extensions in your C/C++ applications.  
+Typically, an application B<Makefile> will invoke ExtUtils::Embed
+functions while building your application.  
+
+=head1 @EXPORT
+
+ExtUtils::Embed exports the following functions:
+
+xsinit(), ldopts(), ccopts(), perl_inc(), ccflags(), 
+ccdlflags(), xsi_header(), xsi_protos(), xsi_body()
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item xsinit()
+
+Generate C/C++ code for the XS initializer function.
+
+When invoked as C<`perl -MExtUtils::Embed -e xsinit --`>
+the following options are recognized:
+
+B<-o> E<lt>output filenameE<gt> (Defaults to B<perlxsi.c>)
+
+B<-o STDOUT> will print to STDOUT.
+
+B<-std> (Write code for extensions that are linked with the current Perl.)
+
+Any additional arguments are expected to be names of modules
+to generate code for.
+
+When invoked with parameters the following are accepted and optional:
+
+C<xsinit($filename,$std,[@modules])>
+
+Where,
+
+B<$filename> is equivalent to the B<-o> option.
+
+B<$std> is boolean, equivalent to the B<-std> option.  
+
+B<[@modules]> is an array ref, same as additional arguments mentioned above.
+
+=item Examples
+
+
+ perl -MExtUtils::Embed -e xsinit -- -o xsinit.c Socket
+
+
+This will generate code with an B<xs_init> function that glues the perl B<Socket::bootstrap> function 
+to the C B<boot_Socket> function and writes it to a file named F<xsinit.c>.
+
+Note that B<DynaLoader> is a special case where it must call B<boot_DynaLoader> directly.
+
+ perl -MExtUtils::Embed -e xsinit
+
+
+This will generate code for linking with B<DynaLoader> and 
+each static extension found in B<$Config{static_ext}>.
+The code is written to the default file name B<perlxsi.c>.
+
+
+ perl -MExtUtils::Embed -e xsinit -- -o xsinit.c -std DBI DBD::Oracle
+
+
+Here, code is written for all the currently linked extensions along with code
+for B<DBI> and B<DBD::Oracle>.
+
+If you have a working B<DynaLoader> then there is rarely any need to statically link in any 
+other extensions.
+
+=item ldopts()
+
+Output arguments for linking the Perl library and extensions to your
+application.
+
+When invoked as C<`perl -MExtUtils::Embed -e ldopts --`>
+the following options are recognized:
+
+B<-std> 
+
+Output arguments for linking the Perl library and any extensions linked
+with the current Perl.
+
+B<-I> E<lt>path1:path2E<gt>
+
+Search path for ModuleName.a archives.  
+Default path is B<@INC>.
+Library archives are expected to be found as 
+B</some/path/auto/ModuleName/ModuleName.a>
+For example, when looking for B<Socket.a> relative to a search path, 
+we should find B<auto/Socket/Socket.a>  
+
+When looking for B<DBD::Oracle> relative to a search path,
+we should find B<auto/DBD/Oracle/Oracle.a>
+
+Keep in mind that you can always supply B</my/own/path/ModuleName.a>
+as an additional linker argument.
+
+B<-->  E<lt>list of linker argsE<gt>
+
+Additional linker arguments to be considered.
+
+Any additional arguments found before the B<--> token 
+are expected to be names of modules to generate code for.
+
+When invoked with parameters the following are accepted and optional:
+
+C<ldopts($std,[@modules],[@link_args],$path)>
+
+Where:
+
+B<$std> is boolean, equivalent to the B<-std> option.  
+
+B<[@modules]> is equivalent to additional arguments found before the B<--> token.
+
+B<[@link_args]> is equivalent to arguments found after the B<--> token.
+
+B<$path> is equivalent to the B<-I> option.
+
+In addition, when ldopts is called with parameters, it will return the argument string
+rather than print it to STDOUT.
+
+=item Examples
+
+
+ perl -MExtUtils::Embed -e ldopts
+
+
+This will print arguments for linking with B<libperl.a>, B<DynaLoader> and 
+extensions found in B<$Config{static_ext}>.  This includes libraries
+found in B<$Config{libs}> and the first ModuleName.a library
+for each extension that is found by searching B<@INC> or the path 
+specified by the B<-I> option.  
+In addition, when ModuleName.a is found, additional linker arguments
+are picked up from the B<extralibs.ld> file in the same directory.
+
+
+ perl -MExtUtils::Embed -e ldopts -- -std Socket
+
+
+This will do the same as the above example, along with printing additional arguments for linking with the B<Socket> extension.
+
+
+ perl -MExtUtils::Embed -e ldopts -- DynaLoader
+
+
+This will print arguments for linking with just the B<DynaLoader> extension
+and B<libperl.a>.
+
+
+ perl -MExtUtils::Embed -e ldopts -- -std Msql -- -L/usr/msql/lib -lmsql
+
+
+Any arguments after the second '--' token are additional linker
+arguments that will be examined for potential conflict.  If there is no
+conflict, the additional arguments will be part of the output.  
+
+
+=item perl_inc()
+
+For including perl header files this function simply prints:
+
+ -I$Config{archlibexp}/CORE  
+
+So, rather than having to say:
+
+ perl -MConfig -e 'print "-I$Config{archlibexp}/CORE"'
+
+Just say:
+
+ perl -MExtUtils::Embed -e perl_inc
+
+=item ccflags(), ccdlflags()
+
+These functions simply print $Config{ccflags} and $Config{ccdlflags}
+
+=item ccopts()
+
+This function combines perl_inc(), ccflags() and ccdlflags() into one.
+
+=item xsi_header()
+
+This function simply returns a string defining the same B<EXTERN_C> macro as
+B<perlmain.c> along with #including B<perl.h> and B<EXTERN.h>.  
+
+=item xsi_protos(@modules)
+
+This function returns a string of B<boot_$ModuleName> prototypes for each @modules.
+
+=item xsi_body(@modules)
+
+This function returns a string of calls to B<newXS()> that glue the module B<bootstrap>
+function to B<boot_ModuleName> for each @modules.
+
+B<xsinit()> uses the xsi_* functions to generate most of its code.
+
+=back
+
+=head1 EXAMPLES
+
+For examples on how to use B<ExtUtils::Embed> for building C/C++ applications
+with embedded perl, see L<perlembed>.
+
+=head1 SEE ALSO
+
+L<perlembed>
+
+=head1 AUTHOR
+
+Doug MacEachern E<lt>F<dougm@osf.org>E<gt>
+
+Based on ideas from Tim Bunce E<lt>F<Tim.Bunce@ig.co.uk>E<gt> and
+B<minimod.pl> by Andreas Koenig E<lt>F<k@anna.in-berlin.de>E<gt> and Tim Bunce.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Install.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Install.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Install.pm	(revision 14489)
@@ -0,0 +1,544 @@
+package ExtUtils::Install;
+
+use 5.00503;
+use vars qw(@ISA @EXPORT $VERSION);
+$VERSION = '1.33';
+
+use Exporter;
+use Carp ();
+use Config qw(%Config);
+@ISA = ('Exporter');
+@EXPORT = ('install','uninstall','pm_to_blib', 'install_default');
+$Is_VMS     = $^O eq 'VMS';
+$Is_MacPerl = $^O eq 'MacOS';
+
+my $Inc_uninstall_warn_handler;
+
+# install relative to here
+
+my $INSTALL_ROOT = $ENV{PERL_INSTALL_ROOT};
+
+use File::Spec;
+my $Curdir = File::Spec->curdir;
+my $Updir  = File::Spec->updir;
+
+
+=head1 NAME
+
+ExtUtils::Install - install files from here to there
+
+=head1 SYNOPSIS
+
+  use ExtUtils::Install;
+
+  install({ 'blib/lib' => 'some/install/dir' } );
+
+  uninstall($packlist);
+
+  pm_to_blib({ 'lib/Foo/Bar.pm' => 'blib/lib/Foo/Bar.pm' });
+
+
+=head1 DESCRIPTION
+
+Handles the installing and uninstalling of perl modules, scripts, man
+pages, etc...
+
+Both install() and uninstall() are specific to the way
+ExtUtils::MakeMaker handles the installation and deinstallation of
+perl modules. They are not designed as general purpose tools.
+
+=head2 Functions
+
+=over 4
+
+=item B<install>
+
+    install(\%from_to);
+    install(\%from_to, $verbose, $dont_execute, $uninstall_shadows);
+
+Copies each directory tree of %from_to to its corresponding value
+preserving timestamps and permissions.
+
+There are two keys with a special meaning in the hash: "read" and
+"write".  These contain packlist files.  After the copying is done,
+install() will write the list of target files to $from_to{write}. If
+$from_to{read} is given the contents of this file will be merged into
+the written file. The read and the written file may be identical, but
+on AFS it is quite likely that people are installing to a different
+directory than the one where the files later appear.
+
+If $verbose is true, will print out each file removed.  Default is
+false.  This is "make install VERBINST=1"
+
+If $dont_execute is true it will only print what it was going to do
+without actually doing it.  Default is false.
+
+If $uninstall_shadows is true any differing versions throughout @INC
+will be uninstalled.  This is "make install UNINST=1"
+
+=cut
+
+sub install {
+    my($from_to,$verbose,$nonono,$inc_uninstall) = @_;
+    $verbose ||= 0;
+    $nonono  ||= 0;
+
+    use Cwd qw(cwd);
+    use ExtUtils::Packlist;
+    use File::Basename qw(dirname);
+    use File::Copy qw(copy);
+    use File::Find qw(find);
+    use File::Path qw(mkpath);
+    use File::Compare qw(compare);
+
+    my(%from_to) = %$from_to;
+    my(%pack, $dir, $warn_permissions);
+    my($packlist) = ExtUtils::Packlist->new();
+    # -w doesn't work reliably on FAT dirs
+    $warn_permissions++ if $^O eq 'MSWin32';
+    local(*DIR);
+    for (qw/read write/) {
+	$pack{$_}=$from_to{$_};
+	delete $from_to{$_};
+    }
+    my($source_dir_or_file);
+    foreach $source_dir_or_file (sort keys %from_to) {
+	#Check if there are files, and if yes, look if the corresponding
+	#target directory is writable for us
+	opendir DIR, $source_dir_or_file or next;
+	for (readdir DIR) {
+	    next if $_ eq $Curdir || $_ eq $Updir || $_ eq ".exists";
+            my $targetdir = install_rooted_dir($from_to{$source_dir_or_file});
+            mkpath($targetdir) unless $nonono;
+	    if (!$nonono && !-w $targetdir) {
+		warn "Warning: You do not have permissions to " .
+		    "install into $from_to{$source_dir_or_file}"
+		    unless $warn_permissions++;
+	    }
+	}
+	closedir DIR;
+    }
+    my $tmpfile = install_rooted_file($pack{"read"});
+    $packlist->read($tmpfile) if (-f $tmpfile);
+    my $cwd = cwd();
+
+    MOD_INSTALL: foreach my $source (sort keys %from_to) {
+	#copy the tree to the target directory without altering
+	#timestamp and permission and remember for the .packlist
+	#file. The packlist file contains the absolute paths of the
+	#install locations. AFS users may call this a bug. We'll have
+	#to reconsider how to add the means to satisfy AFS users also.
+
+	#October 1997: we want to install .pm files into archlib if
+	#there are any files in arch. So we depend on having ./blib/arch
+	#hardcoded here.
+
+	my $targetroot = install_rooted_dir($from_to{$source});
+
+        my $blib_lib  = File::Spec->catdir('blib', 'lib');
+        my $blib_arch = File::Spec->catdir('blib', 'arch');
+	if ($source eq $blib_lib and
+	    exists $from_to{$blib_arch} and
+	    directory_not_empty($blib_arch)) {
+	    $targetroot = install_rooted_dir($from_to{$blib_arch});
+            print "Files found in $blib_arch: installing files in $blib_lib into architecture dependent library tree\n";
+	}
+
+        chdir $source or next;
+	find(sub {
+	    my ($mode,$size,$atime,$mtime) = (stat)[2,7,8,9];
+	    return unless -f _;
+
+            my $origfile = $_;
+	    return if $origfile eq ".exists";
+	    my $targetdir  = File::Spec->catdir($targetroot, $File::Find::dir);
+	    my $targetfile = File::Spec->catfile($targetdir, $origfile);
+            my $sourcedir  = File::Spec->catdir($source, $File::Find::dir);
+            my $sourcefile = File::Spec->catfile($sourcedir, $origfile);
+
+            my $save_cwd = cwd;
+            chdir $cwd;  # in case the target is relative
+                         # 5.5.3's File::Find missing no_chdir option.
+
+	    my $diff = 0;
+	    if ( -f $targetfile && -s _ == $size) {
+		# We have a good chance, we can skip this one
+		$diff = compare($sourcefile, $targetfile);
+	    } else {
+		print "$sourcefile differs\n" if $verbose>1;
+		$diff++;
+	    }
+
+	    if ($diff){
+		if (-f $targetfile){
+		    forceunlink($targetfile) unless $nonono;
+		} else {
+		    mkpath($targetdir,0,0755) unless $nonono;
+		    print "mkpath($targetdir,0,0755)\n" if $verbose>1;
+		}
+		copy($sourcefile, $targetfile) unless $nonono;
+		print "Installing $targetfile\n";
+		utime($atime,$mtime + $Is_VMS,$targetfile) unless $nonono>1;
+		print "utime($atime,$mtime,$targetfile)\n" if $verbose>1;
+		$mode = 0444 | ( $mode & 0111 ? 0111 : 0 );
+		chmod $mode, $targetfile;
+		print "chmod($mode, $targetfile)\n" if $verbose>1;
+	    } else {
+		print "Skipping $targetfile (unchanged)\n" if $verbose;
+	    }
+
+	    if (defined $inc_uninstall) {
+		inc_uninstall($sourcefile,$File::Find::dir,$verbose, 
+                              $inc_uninstall ? 0 : 1);
+	    }
+
+	    # Record the full pathname.
+	    $packlist->{$targetfile}++;
+
+            # File::Find can get confused if you chdir in here.
+            chdir $save_cwd;
+
+        # File::Find seems to always be Unixy except on MacPerl :(
+	}, $Is_MacPerl ? $Curdir : '.' );
+	chdir($cwd) or Carp::croak("Couldn't chdir to $cwd: $!");
+    }
+    if ($pack{'write'}) {
+	$dir = install_rooted_dir(dirname($pack{'write'}));
+	mkpath($dir,0,0755) unless $nonono;
+	print "Writing $pack{'write'}\n";
+	$packlist->write(install_rooted_file($pack{'write'})) unless $nonono;
+    }
+}
+
+sub install_rooted_file {
+    if (defined $INSTALL_ROOT) {
+	File::Spec->catfile($INSTALL_ROOT, $_[0]);
+    } else {
+	$_[0];
+    }
+}
+
+
+sub install_rooted_dir {
+    if (defined $INSTALL_ROOT) {
+	File::Spec->catdir($INSTALL_ROOT, $_[0]);
+    } else {
+	$_[0];
+    }
+}
+
+
+sub forceunlink {
+    chmod 0666, $_[0];
+    unlink $_[0] or Carp::croak("Cannot forceunlink $_[0]: $!")
+}
+
+
+sub directory_not_empty ($) {
+  my($dir) = @_;
+  my $files = 0;
+  find(sub {
+	   return if $_ eq ".exists";
+	   if (-f) {
+	     $File::Find::prune++;
+	     $files = 1;
+	   }
+       }, $dir);
+  return $files;
+}
+
+
+=item B<install_default> I<DISCOURAGED>
+
+    install_default();
+    install_default($fullext);
+
+Calls install() with arguments to copy a module from blib/ to the
+default site installation location.
+
+$fullext is the name of the module converted to a directory
+(ie. Foo::Bar would be Foo/Bar).  If $fullext is not specified, it
+will attempt to read it from @ARGV.
+
+This is primarily useful for install scripts.
+
+B<NOTE> This function is not really useful because of the hard-coded
+install location with no way to control site vs core vs vendor
+directories and the strange way in which the module name is given.
+Consider its use discouraged.
+
+=cut
+
+sub install_default {
+  @_ < 2 or die "install_default should be called with 0 or 1 argument";
+  my $FULLEXT = @_ ? shift : $ARGV[0];
+  defined $FULLEXT or die "Do not know to where to write install log";
+  my $INST_LIB = File::Spec->catdir($Curdir,"blib","lib");
+  my $INST_ARCHLIB = File::Spec->catdir($Curdir,"blib","arch");
+  my $INST_BIN = File::Spec->catdir($Curdir,'blib','bin');
+  my $INST_SCRIPT = File::Spec->catdir($Curdir,'blib','script');
+  my $INST_MAN1DIR = File::Spec->catdir($Curdir,'blib','man1');
+  my $INST_MAN3DIR = File::Spec->catdir($Curdir,'blib','man3');
+  install({
+	   read => "$Config{sitearchexp}/auto/$FULLEXT/.packlist",
+	   write => "$Config{installsitearch}/auto/$FULLEXT/.packlist",
+	   $INST_LIB => (directory_not_empty($INST_ARCHLIB)) ?
+			 $Config{installsitearch} :
+			 $Config{installsitelib},
+	   $INST_ARCHLIB => $Config{installsitearch},
+	   $INST_BIN => $Config{installbin} ,
+	   $INST_SCRIPT => $Config{installscript},
+	   $INST_MAN1DIR => $Config{installman1dir},
+	   $INST_MAN3DIR => $Config{installman3dir},
+	  },1,0,0);
+}
+
+
+=item B<uninstall>
+
+    uninstall($packlist_file);
+    uninstall($packlist_file, $verbose, $dont_execute);
+
+Removes the files listed in a $packlist_file.
+
+If $verbose is true, will print out each file removed.  Default is
+false.
+
+If $dont_execute is true it will only print what it was going to do
+without actually doing it.  Default is false.
+
+=cut
+
+sub uninstall {
+    use ExtUtils::Packlist;
+    my($fil,$verbose,$nonono) = @_;
+    $verbose ||= 0;
+    $nonono  ||= 0;
+
+    die "no packlist file found: $fil" unless -f $fil;
+    # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
+    # require $my_req; # Hairy, but for the first
+    my ($packlist) = ExtUtils::Packlist->new($fil);
+    foreach (sort(keys(%$packlist))) {
+	chomp;
+	print "unlink $_\n" if $verbose;
+	forceunlink($_) unless $nonono;
+    }
+    print "unlink $fil\n" if $verbose;
+    forceunlink($fil) unless $nonono;
+}
+
+sub inc_uninstall {
+    my($filepath,$libdir,$verbose,$nonono) = @_;
+    my($dir);
+    my $file = (File::Spec->splitpath($filepath))[2];
+    my %seen_dir = ();
+
+    my @PERL_ENV_LIB = split $Config{path_sep}, defined $ENV{'PERL5LIB'} 
+      ? $ENV{'PERL5LIB'} : $ENV{'PERLLIB'} || '';
+
+    foreach $dir (@INC, @PERL_ENV_LIB, @Config{qw(archlibexp
+						  privlibexp
+						  sitearchexp
+						  sitelibexp)}) {
+	next if $dir eq $Curdir;
+	next if $seen_dir{$dir}++;
+	my($targetfile) = File::Spec->catfile($dir,$libdir,$file);
+	next unless -f $targetfile;
+
+	# The reason why we compare file's contents is, that we cannot
+	# know, which is the file we just installed (AFS). So we leave
+	# an identical file in place
+	my $diff = 0;
+	if ( -f $targetfile && -s _ == -s $filepath) {
+	    # We have a good chance, we can skip this one
+	    $diff = compare($filepath,$targetfile);
+	} else {
+	    print "#$file and $targetfile differ\n" if $verbose>1;
+	    $diff++;
+	}
+
+	next unless $diff;
+	if ($nonono) {
+	    if ($verbose) {
+		$Inc_uninstall_warn_handler ||= new ExtUtils::Install::Warn;
+		$libdir =~ s|^\./||s ; # That's just cosmetics, no need to port. It looks prettier.
+		$Inc_uninstall_warn_handler->add(
+                                     File::Spec->catfile($libdir, $file),
+                                     $targetfile
+                                    );
+	    }
+	    # if not verbose, we just say nothing
+	} else {
+	    print "Unlinking $targetfile (shadowing?)\n";
+	    forceunlink($targetfile);
+	}
+    }
+}
+
+sub run_filter {
+    my ($cmd, $src, $dest) = @_;
+    local(*CMD, *SRC);
+    open(CMD, "|$cmd >$dest") || die "Cannot fork: $!";
+    open(SRC, $src)           || die "Cannot open $src: $!";
+    my $buf;
+    my $sz = 1024;
+    while (my $len = sysread(SRC, $buf, $sz)) {
+	syswrite(CMD, $buf, $len);
+    }
+    close SRC;
+    close CMD or die "Filter command '$cmd' failed for $src";
+}
+
+
+=item B<pm_to_blib>
+
+    pm_to_blib(\%from_to, $autosplit_dir);
+    pm_to_blib(\%from_to, $autosplit_dir, $filter_cmd);
+
+Copies each key of %from_to to its corresponding value efficiently.
+Filenames with the extension .pm are autosplit into the $autosplit_dir.
+Any destination directories are created.
+
+$filter_cmd is an optional shell command to run each .pm file through
+prior to splitting and copying.  Input is the contents of the module,
+output the new module contents.
+
+You can have an environment variable PERL_INSTALL_ROOT set which will
+be prepended as a directory to each installed file (and directory).
+
+=cut
+
+sub pm_to_blib {
+    my($fromto,$autodir,$pm_filter) = @_;
+
+    use File::Basename qw(dirname);
+    use File::Copy qw(copy);
+    use File::Path qw(mkpath);
+    use File::Compare qw(compare);
+    use AutoSplit;
+
+    mkpath($autodir,0,0755);
+    while(my($from, $to) = each %$fromto) {
+	if( -f $to && -s $from == -s $to && -M $to < -M $from ) {
+            print "Skip $to (unchanged)\n";
+            next;
+        }
+
+	# When a pm_filter is defined, we need to pre-process the source first
+	# to determine whether it has changed or not.  Therefore, only perform
+	# the comparison check when there's no filter to be ran.
+	#    -- RAM, 03/01/2001
+
+	my $need_filtering = defined $pm_filter && length $pm_filter && 
+                             $from =~ /\.pm$/;
+
+	if (!$need_filtering && 0 == compare($from,$to)) {
+	    print "Skip $to (unchanged)\n";
+	    next;
+	}
+	if (-f $to){
+	    forceunlink($to);
+	} else {
+	    mkpath(dirname($to),0,0755);
+	}
+	if ($need_filtering) {
+	    run_filter($pm_filter, $from, $to);
+	    print "$pm_filter <$from >$to\n";
+	} else {
+	    copy($from,$to);
+	    print "cp $from $to\n";
+	}
+	my($mode,$atime,$mtime) = (stat $from)[2,8,9];
+	utime($atime,$mtime+$Is_VMS,$to);
+	chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$to);
+	next unless $from =~ /\.pm$/;
+	_autosplit($to,$autodir);
+    }
+}
+
+
+=begin _private
+
+=item _autosplit
+
+From 1.0307 back, AutoSplit will sometimes leave an open filehandle to
+the file being split.  This causes problems on systems with mandatory
+locking (ie. Windows).  So we wrap it and close the filehandle.
+
+=end _private
+
+=cut
+
+sub _autosplit {
+    my $retval = autosplit(@_);
+    close *AutoSplit::IN if defined *AutoSplit::IN{IO};
+
+    return $retval;
+}
+
+
+package ExtUtils::Install::Warn;
+
+sub new { bless {}, shift }
+
+sub add {
+    my($self,$file,$targetfile) = @_;
+    push @{$self->{$file}}, $targetfile;
+}
+
+sub DESTROY {
+    unless(defined $INSTALL_ROOT) {
+        my $self = shift;
+        my($file,$i,$plural);
+        foreach $file (sort keys %$self) {
+            $plural = @{$self->{$file}} > 1 ? "s" : "";
+            print "## Differing version$plural of $file found. You might like to\n";
+            for (0..$#{$self->{$file}}) {
+                print "rm ", $self->{$file}[$_], "\n";
+                $i++;
+            }
+        }
+        $plural = $i>1 ? "all those files" : "this file";
+        print "## Running 'make install UNINST=1' will unlink $plural for you.\n";
+    }
+}
+
+=back
+
+
+=head1 ENVIRONMENT
+
+=over 4
+
+=item B<PERL_INSTALL_ROOT>
+
+Will be prepended to each install path.
+
+=back
+
+=head1 AUTHOR
+
+Original author lost in the mists of time.  Probably the same as Makemaker.
+
+Currently maintained by Michael G Schwern C<schwern@pobox.com>
+
+Send patches and ideas to C<makemaker@perl.org>.
+
+Send bug reports via http://rt.cpan.org/.  Please send your
+generated Makefile along with your report.
+
+For more up-to-date information, see L<http://www.makemaker.org>.
+
+
+=head1 LICENSE
+
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Installed.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Installed.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Installed.pm	(revision 14489)
@@ -0,0 +1,337 @@
+package ExtUtils::Installed;
+
+use 5.00503;
+use strict;
+use Carp qw();
+use ExtUtils::Packlist;
+use ExtUtils::MakeMaker;
+use Config;
+use File::Find;
+use File::Basename;
+use File::Spec;
+
+my $Is_VMS = $^O eq 'VMS';
+my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/);
+
+require VMS::Filespec if $Is_VMS;
+
+use vars qw($VERSION);
+$VERSION = '0.08';
+
+sub _is_prefix {
+    my ($self, $path, $prefix) = @_;
+    return unless defined $prefix && defined $path;
+
+    if( $Is_VMS ) {
+        $prefix = VMS::Filespec::unixify($prefix);
+        $path   = VMS::Filespec::unixify($path);
+    }
+
+    # Sloppy Unix path normalization.
+    $prefix =~ s{/+}{/}g;
+    $path   =~ s{/+}{/}g;
+
+    return 1 if substr($path, 0, length($prefix)) eq $prefix;
+
+    if ($DOSISH) {
+        $path =~ s|\\|/|g;
+        $prefix =~ s|\\|/|g;
+        return 1 if $path =~ m{^\Q$prefix\E}i;
+    }
+    return(0);
+}
+
+sub _is_doc { 
+    my ($self, $path) = @_;
+    my $man1dir = $Config{man1direxp};
+    my $man3dir = $Config{man3direxp};
+    return(($man1dir && $self->_is_prefix($path, $man1dir))
+           ||
+           ($man3dir && $self->_is_prefix($path, $man3dir))
+           ? 1 : 0)
+}
+ 
+sub _is_type {
+    my ($self, $path, $type) = @_;
+    return 1 if $type eq "all";
+
+    return($self->_is_doc($path)) if $type eq "doc";
+
+    if ($type eq "prog") {
+        return($self->_is_prefix($path, $Config{prefix} || $Config{prefixexp})
+               &&
+               !($self->_is_doc($path))
+               ? 1 : 0);
+    }
+    return(0);
+}
+
+sub _is_under {
+    my ($self, $path, @under) = @_;
+    $under[0] = "" if (! @under);
+    foreach my $dir (@under) {
+        return(1) if ($self->_is_prefix($path, $dir));
+    }
+
+    return(0);
+}
+
+sub new {
+    my ($class) = @_;
+    $class = ref($class) || $class;
+    my $self = {};
+
+    my $archlib = $Config{archlibexp};
+    my $sitearch = $Config{sitearchexp};
+
+    # File::Find does not know how to deal with VMS filepaths.
+    if( $Is_VMS ) {
+        $archlib  = VMS::Filespec::unixify($archlib);
+        $sitearch = VMS::Filespec::unixify($sitearch);
+    }
+
+    if ($DOSISH) {
+        $archlib =~ s|\\|/|g;
+        $sitearch =~ s|\\|/|g;
+    }
+
+    # Read the core packlist
+    $self->{Perl}{packlist} =
+      ExtUtils::Packlist->new( File::Spec->catfile($archlib, '.packlist') );
+    $self->{Perl}{version} = $Config{version};
+
+    # Read the module packlists
+    my $sub = sub {
+        # Only process module .packlists
+        return if $_ ne ".packlist" || $File::Find::dir eq $archlib;
+
+        # Hack of the leading bits of the paths & convert to a module name
+        my $module = $File::Find::name;
+
+        $module =~ s!\Q$archlib\E/?auto/(.*)/.packlist!$1!s  or
+        $module =~ s!\Q$sitearch\E/?auto/(.*)/.packlist!$1!s;
+        my $modfile = "$module.pm";
+        $module =~ s!/!::!g;
+
+        # Find the top-level module file in @INC
+        $self->{$module}{version} = '';
+        foreach my $dir (@INC) {
+            my $p = File::Spec->catfile($dir, $modfile);
+            if (-r $p) {
+                $module = _module_name($p, $module) if $Is_VMS;
+
+                require ExtUtils::MM;
+                $self->{$module}{version} = MM->parse_version($p);
+                last;
+            }
+        }
+
+        # Read the .packlist
+        $self->{$module}{packlist} = 
+          ExtUtils::Packlist->new($File::Find::name);
+    };
+
+    my(@dirs) = grep { -e } ($archlib, $sitearch);
+    find($sub, @dirs) if @dirs;
+
+    return(bless($self, $class));
+}
+
+# VMS's non-case preserving file-system means the package name can't
+# be reconstructed from the filename.
+sub _module_name {
+    my($file, $orig_module) = @_;
+
+    my $module = '';
+    if (open PACKFH, $file) {
+        while (<PACKFH>) {
+            if (/package\s+(\S+)\s*;/) {
+                my $pack = $1;
+                # Make a sanity check, that lower case $module
+                # is identical to lowercase $pack before
+                # accepting it
+                if (lc($pack) eq lc($orig_module)) {
+                    $module = $pack;
+                    last;
+                }
+            }
+        }
+        close PACKFH;
+    }
+
+    print STDERR "Couldn't figure out the package name for $file\n"
+      unless $module;
+
+    return $module;
+}
+
+
+
+sub modules {
+    my ($self) = @_;
+
+    # Bug/feature of sort in scalar context requires this.
+    return wantarray ? sort keys %$self : keys %$self;
+}
+
+sub files {
+    my ($self, $module, $type, @under) = @_;
+
+    # Validate arguments
+    Carp::croak("$module is not installed") if (! exists($self->{$module}));
+    $type = "all" if (! defined($type));
+    Carp::croak('type must be "all", "prog" or "doc"')
+        if ($type ne "all" && $type ne "prog" && $type ne "doc");
+
+    my (@files);
+    foreach my $file (keys(%{$self->{$module}{packlist}})) {
+        push(@files, $file)
+          if ($self->_is_type($file, $type) && 
+              $self->_is_under($file, @under));
+    }
+    return(@files);
+}
+
+sub directories {
+    my ($self, $module, $type, @under) = @_;
+    my (%dirs);
+    foreach my $file ($self->files($module, $type, @under)) {
+        $dirs{dirname($file)}++;
+    }
+    return sort keys %dirs;
+}
+
+sub directory_tree {
+    my ($self, $module, $type, @under) = @_;
+    my (%dirs);
+    foreach my $dir ($self->directories($module, $type, @under)) {
+        $dirs{$dir}++;
+        my ($last) = ("");
+        while ($last ne $dir) {
+            $last = $dir;
+            $dir = dirname($dir);
+            last if !$self->_is_under($dir, @under);
+            $dirs{$dir}++;
+        }
+    }
+    return(sort(keys(%dirs)));
+}
+
+sub validate {
+    my ($self, $module, $remove) = @_;
+    Carp::croak("$module is not installed") if (! exists($self->{$module}));
+    return($self->{$module}{packlist}->validate($remove));
+}
+
+sub packlist {
+    my ($self, $module) = @_;
+    Carp::croak("$module is not installed") if (! exists($self->{$module}));
+    return($self->{$module}{packlist});
+}
+
+sub version {
+    my ($self, $module) = @_;
+    Carp::croak("$module is not installed") if (! exists($self->{$module}));
+    return($self->{$module}{version});
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Installed - Inventory management of installed modules
+
+=head1 SYNOPSIS
+
+   use ExtUtils::Installed;
+   my ($inst) = ExtUtils::Installed->new();
+   my (@modules) = $inst->modules();
+   my (@missing) = $inst->validate("DBI");
+   my $all_files = $inst->files("DBI");
+   my $files_below_usr_local = $inst->files("DBI", "all", "/usr/local");
+   my $all_dirs = $inst->directories("DBI");
+   my $dirs_below_usr_local = $inst->directory_tree("DBI", "prog");
+   my $packlist = $inst->packlist("DBI");
+
+=head1 DESCRIPTION
+
+ExtUtils::Installed  provides a standard way to find out what core and module
+files have been installed.  It uses the information stored in .packlist files
+created during installation to provide this information.  In addition it
+provides facilities to classify the installed files and to extract directory
+information from the .packlist files.
+
+=head1 USAGE
+
+The new() function searches for all the installed .packlists on the system, and
+stores their contents. The .packlists can be queried with the functions
+described below.
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item new()
+
+This takes no parameters, and searches for all the installed .packlists on the
+system.  The packlists are read using the ExtUtils::packlist module.
+
+=item modules()
+
+This returns a list of the names of all the installed modules.  The perl 'core'
+is given the special name 'Perl'.
+
+=item files()
+
+This takes one mandatory parameter, the name of a module.  It returns a list of
+all the filenames from the package.  To obtain a list of core perl files, use
+the module name 'Perl'.  Additional parameters are allowed.  The first is one
+of the strings "prog", "doc" or "all", to select either just program files,
+just manual files or all files.  The remaining parameters are a list of
+directories. The filenames returned will be restricted to those under the
+specified directories.
+
+=item directories()
+
+This takes one mandatory parameter, the name of a module.  It returns a list of
+all the directories from the package.  Additional parameters are allowed.  The
+first is one of the strings "prog", "doc" or "all", to select either just
+program directories, just manual directories or all directories.  The remaining
+parameters are a list of directories. The directories returned will be
+restricted to those under the specified directories.  This method returns only
+the leaf directories that contain files from the specified module.
+
+=item directory_tree()
+
+This is identical in operation to directories(), except that it includes all the
+intermediate directories back up to the specified directories.
+
+=item validate()
+
+This takes one mandatory parameter, the name of a module.  It checks that all
+the files listed in the modules .packlist actually exist, and returns a list of
+any missing files.  If an optional second argument which evaluates to true is
+given any missing files will be removed from the .packlist
+
+=item packlist()
+
+This returns the ExtUtils::Packlist object for the specified module.
+
+=item version()
+
+This returns the version number for the specified module.
+
+=back
+
+=head1 EXAMPLE
+
+See the example in L<ExtUtils::Packlist>.
+
+=head1 AUTHOR
+
+Alan Burlison <Alan.Burlison@uk.sun.com>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Liblist.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Liblist.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Liblist.pm	(revision 14489)
@@ -0,0 +1,285 @@
+package ExtUtils::Liblist;
+
+use vars qw($VERSION);
+$VERSION = '1.01';
+
+use File::Spec;
+require ExtUtils::Liblist::Kid;
+@ISA = qw(ExtUtils::Liblist::Kid File::Spec);
+
+# Backwards compatibility with old interface.
+sub ext {
+    goto &ExtUtils::Liblist::Kid::ext;
+}
+
+sub lsdir {
+  shift;
+  my $rex = qr/$_[1]/;
+  opendir DIR, $_[0];
+  my @out = grep /$rex/, readdir DIR;
+  closedir DIR;
+  return @out;
+}
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Liblist - determine libraries to use and how to use them
+
+=head1 SYNOPSIS
+
+  require ExtUtils::Liblist;
+
+  $MM->ext($potential_libs, $verbose, $need_names);
+
+  # Usually you can get away with:
+  ExtUtils::Liblist->ext($potential_libs, $verbose, $need_names)
+
+=head1 DESCRIPTION
+
+This utility takes a list of libraries in the form C<-llib1 -llib2
+-llib3> and returns lines suitable for inclusion in an extension
+Makefile.  Extra library paths may be included with the form
+C<-L/another/path> this will affect the searches for all subsequent
+libraries.
+
+It returns an array of four or five scalar values: EXTRALIBS,
+BSLOADLIBS, LDLOADLIBS, LD_RUN_PATH, and, optionally, a reference to
+the array of the filenames of actual libraries.  Some of these don't
+mean anything unless on Unix.  See the details about those platform
+specifics below.  The list of the filenames is returned only if
+$need_names argument is true.
+
+Dependent libraries can be linked in one of three ways:
+
+=over 2
+
+=item * For static extensions
+
+by the ld command when the perl binary is linked with the extension
+library. See EXTRALIBS below.
+
+=item * For dynamic extensions at build/link time
+
+by the ld command when the shared object is built/linked. See
+LDLOADLIBS below.
+
+=item * For dynamic extensions at load time
+
+by the DynaLoader when the shared object is loaded. See BSLOADLIBS
+below.
+
+=back
+
+=head2 EXTRALIBS
+
+List of libraries that need to be linked with when linking a perl
+binary which includes this extension. Only those libraries that
+actually exist are included.  These are written to a file and used
+when linking perl.
+
+=head2 LDLOADLIBS and LD_RUN_PATH
+
+List of those libraries which can or must be linked into the shared
+library when created using ld. These may be static or dynamic
+libraries.  LD_RUN_PATH is a colon separated list of the directories
+in LDLOADLIBS. It is passed as an environment variable to the process
+that links the shared library.
+
+=head2 BSLOADLIBS
+
+List of those libraries that are needed but can be linked in
+dynamically at run time on this platform.  SunOS/Solaris does not need
+this because ld records the information (from LDLOADLIBS) into the
+object file.  This list is used to create a .bs (bootstrap) file.
+
+=head1 PORTABILITY
+
+This module deals with a lot of system dependencies and has quite a
+few architecture specific C<if>s in the code.
+
+=head2 VMS implementation
+
+The version of ext() which is executed under VMS differs from the
+Unix-OS/2 version in several respects:
+
+=over 2
+
+=item *
+
+Input library and path specifications are accepted with or without the
+C<-l> and C<-L> prefixes used by Unix linkers.  If neither prefix is
+present, a token is considered a directory to search if it is in fact
+a directory, and a library to search for otherwise.  Authors who wish
+their extensions to be portable to Unix or OS/2 should use the Unix
+prefixes, since the Unix-OS/2 version of ext() requires them.
+
+=item *
+
+Wherever possible, shareable images are preferred to object libraries,
+and object libraries to plain object files.  In accordance with VMS
+naming conventions, ext() looks for files named I<lib>shr and I<lib>rtl;
+it also looks for I<lib>lib and libI<lib> to accommodate Unix conventions
+used in some ported software.
+
+=item *
+
+For each library that is found, an appropriate directive for a linker options
+file is generated.  The return values are space-separated strings of
+these directives, rather than elements used on the linker command line.
+
+=item *
+
+LDLOADLIBS contains both the libraries found based on C<$potential_libs> and
+the CRTLs, if any, specified in Config.pm.  EXTRALIBS contains just those
+libraries found based on C<$potential_libs>.  BSLOADLIBS and LD_RUN_PATH
+are always empty.
+
+=back
+
+In addition, an attempt is made to recognize several common Unix library
+names, and filter them out or convert them to their VMS equivalents, as
+appropriate.
+
+In general, the VMS version of ext() should properly handle input from
+extensions originally designed for a Unix or VMS environment.  If you
+encounter problems, or discover cases where the search could be improved,
+please let us know.
+
+=head2 Win32 implementation
+
+The version of ext() which is executed under Win32 differs from the
+Unix-OS/2 version in several respects:
+
+=over 2
+
+=item *
+
+If C<$potential_libs> is empty, the return value will be empty.
+Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm)
+will be appended to the list of C<$potential_libs>.  The libraries
+will be searched for in the directories specified in C<$potential_libs>,
+C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>.
+For each library that is found,  a space-separated list of fully qualified
+library pathnames is generated.
+
+=item *
+
+Input library and path specifications are accepted with or without the
+C<-l> and C<-L> prefixes used by Unix linkers.
+
+An entry of the form C<-La:\foo> specifies the C<a:\foo> directory to look
+for the libraries that follow.
+
+An entry of the form C<-lfoo> specifies the library C<foo>, which may be
+spelled differently depending on what kind of compiler you are using.  If
+you are using GCC, it gets translated to C<libfoo.a>, but for other win32
+compilers, it becomes C<foo.lib>.  If no files are found by those translated
+names, one more attempt is made to find them using either C<foo.a> or
+C<libfoo.lib>, depending on whether GCC or some other win32 compiler is
+being used, respectively.
+
+If neither the C<-L> or C<-l> prefix is present in an entry, the entry is
+considered a directory to search if it is in fact a directory, and a
+library to search for otherwise.  The C<$Config{lib_ext}> suffix will
+be appended to any entries that are not directories and don't already have
+the suffix.
+
+Note that the C<-L> and C<-l> prefixes are B<not required>, but authors
+who wish their extensions to be portable to Unix or OS/2 should use the
+prefixes, since the Unix-OS/2 version of ext() requires them.
+
+=item *
+
+Entries cannot be plain object files, as many Win32 compilers will
+not handle object files in the place of libraries.
+
+=item *
+
+Entries in C<$potential_libs> beginning with a colon and followed by
+alphanumeric characters are treated as flags.  Unknown flags will be ignored.
+
+An entry that matches C</:nodefault/i> disables the appending of default
+libraries found in C<$Config{perllibs}> (this should be only needed very rarely).
+
+An entry that matches C</:nosearch/i> disables all searching for
+the libraries specified after it.  Translation of C<-Lfoo> and
+C<-lfoo> still happens as appropriate (depending on compiler being used,
+as reflected by C<$Config{cc}>), but the entries are not verified to be
+valid files or directories.
+
+An entry that matches C</:search/i> reenables searching for
+the libraries specified after it.  You can put it at the end to
+enable searching for default libraries specified by C<$Config{perllibs}>.
+
+=item *
+
+The libraries specified may be a mixture of static libraries and
+import libraries (to link with DLLs).  Since both kinds are used
+pretty transparently on the Win32 platform, we do not attempt to
+distinguish between them.
+
+=item *
+
+LDLOADLIBS and EXTRALIBS are always identical under Win32, and BSLOADLIBS
+and LD_RUN_PATH are always empty (this may change in future).
+
+=item *
+
+You must make sure that any paths and path components are properly
+surrounded with double-quotes if they contain spaces. For example,
+C<$potential_libs> could be (literally):
+
+	"-Lc:\Program Files\vc\lib" msvcrt.lib "la test\foo bar.lib"
+
+Note how the first and last entries are protected by quotes in order
+to protect the spaces.
+
+=item *
+
+Since this module is most often used only indirectly from extension
+C<Makefile.PL> files, here is an example C<Makefile.PL> entry to add
+a library to the build process for an extension:
+
+        LIBS => ['-lgl']
+
+When using GCC, that entry specifies that MakeMaker should first look
+for C<libgl.a> (followed by C<gl.a>) in all the locations specified by
+C<$Config{libpth}>.
+
+When using a compiler other than GCC, the above entry will search for
+C<gl.lib> (followed by C<libgl.lib>).
+
+If the library happens to be in a location not in C<$Config{libpth}>,
+you need:
+
+        LIBS => ['-Lc:\gllibs -lgl']
+
+Here is a less often used example:
+
+        LIBS => ['-lgl', ':nosearch -Ld:\mesalibs -lmesa -luser32']
+
+This specifies a search for library C<gl> as before.  If that search
+fails to find the library, it looks at the next item in the list. The
+C<:nosearch> flag will prevent searching for the libraries that follow,
+so it simply returns the value as C<-Ld:\mesalibs -lmesa -luser32>,
+since GCC can use that value as is with its linker.
+
+When using the Visual C compiler, the second item is returned as
+C<-libpath:d:\mesalibs mesa.lib user32.lib>.
+
+When using the Borland compiler, the second item is returned as
+C<-Ld:\mesalibs mesa.lib user32.lib>, and MakeMaker takes care of
+moving the C<-Ld:\mesalibs> to the correct place in the linker
+command line.
+
+=back
+
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Liblist/Kid.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Liblist/Kid.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Liblist/Kid.pm	(revision 14489)
@@ -0,0 +1,548 @@
+package ExtUtils::Liblist::Kid;
+
+# XXX Splitting this out into its own .pm is a temporary solution.
+
+# This kid package is to be used by MakeMaker.  It will not work if
+# $self is not a Makemaker.
+
+use 5.00503;
+# Broken out of MakeMaker from version 4.11
+
+use strict;
+use vars qw($VERSION);
+$VERSION = 1.30;
+
+use Config;
+use Cwd 'cwd';
+use File::Basename;
+use File::Spec;
+
+sub ext {
+  if   ($^O eq 'VMS')     { return &_vms_ext;      }
+  elsif($^O eq 'MSWin32') { return &_win32_ext;    }
+  else                    { return &_unix_os2_ext; }
+}
+
+sub _unix_os2_ext {
+    my($self,$potential_libs, $verbose, $give_libs) = @_;
+    $verbose ||= 0;
+
+    if ($^O =~ 'os2' and $Config{perllibs}) { 
+	# Dynamic libraries are not transitive, so we may need including
+	# the libraries linked against perl.dll again.
+
+	$potential_libs .= " " if $potential_libs;
+	$potential_libs .= $Config{perllibs};
+    }
+    return ("", "", "", "", ($give_libs ? [] : ())) unless $potential_libs;
+    warn "Potential libraries are '$potential_libs':\n" if $verbose;
+
+    my($so)   = $Config{so};
+    my($libs) = defined $Config{perllibs} ? $Config{perllibs} : $Config{libs};
+    my $Config_libext = $Config{lib_ext} || ".a";
+
+
+    # compute $extralibs, $bsloadlibs and $ldloadlibs from
+    # $potential_libs
+    # this is a rewrite of Andy Dougherty's extliblist in perl
+
+    my(@searchpath); # from "-L/path" entries in $potential_libs
+    my(@libpath) = split " ", $Config{'libpth'};
+    my(@ldloadlibs, @bsloadlibs, @extralibs, @ld_run_path, %ld_run_path_seen);
+    my(@libs, %libs_seen);
+    my($fullname, $thislib, $thispth, @fullname);
+    my($pwd) = cwd(); # from Cwd.pm
+    my($found) = 0;
+
+    foreach $thislib (split ' ', $potential_libs){
+
+	# Handle possible linker path arguments.
+	if ($thislib =~ s/^(-[LR]|-Wl,-R)//){	# save path flag type
+	    my($ptype) = $1;
+	    unless (-d $thislib){
+		warn "$ptype$thislib ignored, directory does not exist\n"
+			if $verbose;
+		next;
+	    }
+	    my($rtype) = $ptype;
+	    if (($ptype eq '-R') or ($ptype eq '-Wl,-R')) {
+		if ($Config{'lddlflags'} =~ /-Wl,-R/) {
+		    $rtype = '-Wl,-R';
+		} elsif ($Config{'lddlflags'} =~ /-R/) {
+		    $rtype = '-R';
+		}
+	    }
+	    unless (File::Spec->file_name_is_absolute($thislib)) {
+	      warn "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
+	      $thislib = $self->catdir($pwd,$thislib);
+	    }
+	    push(@searchpath, $thislib);
+	    push(@extralibs,  "$ptype$thislib");
+	    push(@ldloadlibs, "$rtype$thislib");
+	    next;
+	}
+
+	# Handle possible library arguments.
+	unless ($thislib =~ s/^-l//){
+	  warn "Unrecognized argument in LIBS ignored: '$thislib'\n";
+	  next;
+	}
+
+	my($found_lib)=0;
+	foreach $thispth (@searchpath, @libpath){
+
+		# Try to find the full name of the library.  We need this to
+		# determine whether it's a dynamically-loadable library or not.
+		# This tends to be subject to various os-specific quirks.
+		# For gcc-2.6.2 on linux (March 1995), DLD can not load
+		# .sa libraries, with the exception of libm.sa, so we
+		# deliberately skip them.
+	    if (@fullname =
+		    $self->lsdir($thispth,"^\Qlib$thislib.$so.\E[0-9]+")){
+		# Take care that libfoo.so.10 wins against libfoo.so.9.
+		# Compare two libraries to find the most recent version
+		# number.  E.g.  if you have libfoo.so.9.0.7 and
+		# libfoo.so.10.1, first convert all digits into two
+		# decimal places.  Then we'll add ".00" to the shorter
+		# strings so that we're comparing strings of equal length
+		# Thus we'll compare libfoo.so.09.07.00 with
+		# libfoo.so.10.01.00.  Some libraries might have letters
+		# in the version.  We don't know what they mean, but will
+		# try to skip them gracefully -- we'll set any letter to
+		# '0'.  Finally, sort in reverse so we can take the
+		# first element.
+
+		#TODO: iterate through the directory instead of sorting
+
+		$fullname = "$thispth/" .
+		(sort { my($ma) = $a;
+			my($mb) = $b;
+			$ma =~ tr/A-Za-z/0/s;
+			$ma =~ s/\b(\d)\b/0$1/g;
+			$mb =~ tr/A-Za-z/0/s;
+			$mb =~ s/\b(\d)\b/0$1/g;
+			while (length($ma) < length($mb)) { $ma .= ".00"; }
+			while (length($mb) < length($ma)) { $mb .= ".00"; }
+			# Comparison deliberately backwards
+			$mb cmp $ma;} @fullname)[0];
+	    } elsif (-f ($fullname="$thispth/lib$thislib.$so")
+		 && (($Config{'dlsrc'} ne "dl_dld.xs") || ($thislib eq "m"))){
+	    } elsif (-f ($fullname="$thispth/lib${thislib}_s$Config_libext")
+                 && (! $Config{'archname'} =~ /RM\d\d\d-svr4/)
+		 && ($thislib .= "_s") ){ # we must explicitly use _s version
+	    } elsif (-f ($fullname="$thispth/lib$thislib$Config_libext")){
+	    } elsif (-f ($fullname="$thispth/$thislib$Config_libext")){
+            } elsif (-f ($fullname="$thispth/lib$thislib.dll$Config_libext")){
+	    } elsif (-f ($fullname="$thispth/Slib$thislib$Config_libext")){
+	    } elsif ($^O eq 'dgux'
+		 && -l ($fullname="$thispth/lib$thislib$Config_libext")
+		 && readlink($fullname) =~ /^elink:/s) {
+		 # Some of DG's libraries look like misconnected symbolic
+		 # links, but development tools can follow them.  (They
+		 # look like this:
+		 #
+		 #    libm.a -> elink:${SDE_PATH:-/usr}/sde/\
+		 #    ${TARGET_BINARY_INTERFACE:-m88kdgux}/usr/lib/libm.a
+		 #
+		 # , the compilation tools expand the environment variables.)
+	    } else {
+		warn "$thislib not found in $thispth\n" if $verbose;
+		next;
+	    }
+	    warn "'-l$thislib' found at $fullname\n" if $verbose;
+	    push @libs, $fullname unless $libs_seen{$fullname}++;
+	    $found++;
+	    $found_lib++;
+
+	    # Now update library lists
+
+	    # what do we know about this library...
+	    my $is_dyna = ($fullname !~ /\Q$Config_libext\E\z/);
+	    my $in_perl = ($libs =~ /\B-l\Q${thislib}\E\b/s);
+
+            # include the path to the lib once in the dynamic linker path
+            # but only if it is a dynamic lib and not in Perl itself
+            my($fullnamedir) = dirname($fullname);
+            push @ld_run_path, $fullnamedir
+                 if $is_dyna && !$in_perl &&
+                    !$ld_run_path_seen{$fullnamedir}++;
+
+	    # Do not add it into the list if it is already linked in
+	    # with the main perl executable.
+	    # We have to special-case the NeXT, because math and ndbm 
+	    # are both in libsys_s
+	    unless ($in_perl || 
+		($Config{'osname'} eq 'next' &&
+		    ($thislib eq 'm' || $thislib eq 'ndbm')) ){
+		push(@extralibs, "-l$thislib");
+	    }
+
+	    # We might be able to load this archive file dynamically
+	    if ( ($Config{'dlsrc'} =~ /dl_next/ && $Config{'osvers'} lt '4_0')
+	    ||   ($Config{'dlsrc'} =~ /dl_dld/) )
+	    {
+		# We push -l$thislib instead of $fullname because
+		# it avoids hardwiring a fixed path into the .bs file.
+		# Mkbootstrap will automatically add dl_findfile() to
+		# the .bs file if it sees a name in the -l format.
+		# USE THIS, when dl_findfile() is fixed: 
+		# push(@bsloadlibs, "-l$thislib");
+		# OLD USE WAS while checking results against old_extliblist
+		push(@bsloadlibs, "$fullname");
+	    } else {
+		if ($is_dyna){
+                    # For SunOS4, do not add in this shared library if
+                    # it is already linked in the main perl executable
+		    push(@ldloadlibs, "-l$thislib")
+			unless ($in_perl and $^O eq 'sunos');
+		} else {
+		    push(@ldloadlibs, "-l$thislib");
+		}
+	    }
+	    last;	# found one here so don't bother looking further
+	}
+	warn "Note (probably harmless): "
+		     ."No library found for -l$thislib\n"
+	    unless $found_lib>0;
+    }
+
+    unless( $found ) {
+        return ('','','','', ($give_libs ? \@libs : ()));
+    }
+    else {
+        return ("@extralibs", "@bsloadlibs", "@ldloadlibs",
+                join(":",@ld_run_path), ($give_libs ? \@libs : ()));
+    }
+}
+
+sub _win32_ext {
+
+    require Text::ParseWords;
+
+    my($self, $potential_libs, $verbose, $give_libs) = @_;
+    $verbose ||= 0;
+
+    # If user did not supply a list, we punt.
+    # (caller should probably use the list in $Config{libs})
+    return ("", "", "", "", ($give_libs ? [] : ())) unless $potential_libs;
+
+    my $cc		= $Config{cc};
+    my $VC		= $cc =~ /^cl/i;
+    my $BC		= $cc =~ /^bcc/i;
+    my $GC		= $cc =~ /^gcc/i;
+    my $so		= $Config{'so'};
+    my $libs		= $Config{'perllibs'};
+    my $libpth		= $Config{'libpth'};
+    my $libext		= $Config{'lib_ext'} || ".lib";
+    my(@libs, %libs_seen);
+
+    if ($libs and $potential_libs !~ /:nodefault/i) { 
+	# If Config.pm defines a set of default libs, we always
+	# tack them on to the user-supplied list, unless the user
+	# specified :nodefault
+
+	$potential_libs .= " " if $potential_libs;
+	$potential_libs .= $libs;
+    }
+    warn "Potential libraries are '$potential_libs':\n" if $verbose;
+
+    # normalize to forward slashes
+    $libpth =~ s,\\,/,g;
+    $potential_libs =~ s,\\,/,g;
+
+    # compute $extralibs from $potential_libs
+
+    my @searchpath;		    # from "-L/path" in $potential_libs
+    my @libpath		= Text::ParseWords::quotewords('\s+', 0, $libpth);
+    my @extralibs;
+    my $pwd		= cwd();    # from Cwd.pm
+    my $lib		= '';
+    my $found		= 0;
+    my $search		= 1;
+    my($fullname, $thislib, $thispth);
+
+    # add "$Config{installarchlib}/CORE" to default search path
+    push @libpath, "$Config{installarchlib}/CORE";
+
+    if ($VC and exists $ENV{LIB} and $ENV{LIB}) {
+        push @libpath, split /;/, $ENV{LIB};
+    }
+
+    foreach (Text::ParseWords::quotewords('\s+', 0, $potential_libs)){
+
+	$thislib = $_;
+
+        # see if entry is a flag
+	if (/^:\w+$/) {
+	    $search	= 0 if lc eq ':nosearch';
+	    $search	= 1 if lc eq ':search';
+	    warn "Ignoring unknown flag '$thislib'\n"
+		if $verbose and !/^:(no)?(search|default)$/i;
+	    next;
+	}
+
+	# if searching is disabled, do compiler-specific translations
+	unless ($search) {
+	    s/^-l(.+)$/$1.lib/ unless $GC;
+	    s/^-L/-libpath:/ if $VC;
+	    push(@extralibs, $_);
+	    $found++;
+	    next;
+	}
+
+	# handle possible linker path arguments
+	if (s/^-L// and not -d) {
+	    warn "$thislib ignored, directory does not exist\n"
+		if $verbose;
+	    next;
+	}
+	elsif (-d) {
+	    unless (File::Spec->file_name_is_absolute($_)) {
+	      warn "Warning: '$thislib' changed to '-L$pwd/$_'\n";
+	      $_ = $self->catdir($pwd,$_);
+	    }
+	    push(@searchpath, $_);
+	    next;
+	}
+
+	# handle possible library arguments
+	if (s/^-l// and $GC and !/^lib/i) {
+	    $_ = "lib$_";
+	}
+	$_ .= $libext if !/\Q$libext\E$/i;
+
+	my $secondpass = 0;
+    LOOKAGAIN:
+
+        # look for the file itself
+	if (-f) {
+	    warn "'$thislib' found as '$_'\n" if $verbose;
+	    $found++;
+	    push(@extralibs, $_);
+	    next;
+	}
+
+	my $found_lib = 0;
+	foreach $thispth (@searchpath, @libpath){
+	    unless (-f ($fullname="$thispth\\$_")) {
+		warn "'$thislib' not found as '$fullname'\n" if $verbose;
+		next;
+	    }
+	    warn "'$thislib' found as '$fullname'\n" if $verbose;
+	    $found++;
+	    $found_lib++;
+	    push(@extralibs, $fullname);
+	    push @libs, $fullname unless $libs_seen{$fullname}++;
+	    last;
+	}
+
+	# do another pass with (or without) leading 'lib' if they used -l
+	if (!$found_lib and $thislib =~ /^-l/ and !$secondpass++) {
+	    if ($GC) {
+		goto LOOKAGAIN if s/^lib//i;
+	    }
+	    elsif (!/^lib/i) {
+		$_ = "lib$_";
+		goto LOOKAGAIN;
+	    }
+	}
+
+	# give up
+	warn "Note (probably harmless): "
+		     ."No library found for $thislib\n"
+	    unless $found_lib>0;
+
+    }
+
+    return ('','','','', ($give_libs ? \@libs : ())) unless $found;
+
+    # make sure paths with spaces are properly quoted
+    @extralibs = map { (/\s/ && !/^".*"$/) ? qq["$_"] : $_ } @extralibs;
+    @libs = map { (/\s/ && !/^".*"$/) ? qq["$_"] : $_ } @libs;
+    $lib = join(' ',@extralibs);
+
+    # normalize back to backward slashes (to help braindead tools)
+    # XXX this may break equally braindead GNU tools that don't understand
+    # backslashes, either.  Seems like one can't win here.  Cursed be CP/M.
+    $lib =~ s,/,\\,g;
+
+    warn "Result: $lib\n" if $verbose;
+    wantarray ? ($lib, '', $lib, '', ($give_libs ? \@libs : ())) : $lib;
+}
+
+
+sub _vms_ext {
+  my($self, $potential_libs,$verbose,$give_libs) = @_;
+  $verbose ||= 0;
+
+  my(@crtls,$crtlstr);
+  my($dbgqual) = $self->{OPTIMIZE} || $Config{'optimize'} ||
+                 $self->{CCFLAGS}   || $Config{'ccflags'};
+  @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '')
+              . 'PerlShr/Share' );
+  push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'});
+  push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'});
+  # In general, we pass through the basic libraries from %Config unchanged.
+  # The one exception is that if we're building in the Perl source tree, and
+  # a library spec could be resolved via a logical name, we go to some trouble
+  # to insure that the copy in the local tree is used, rather than one to
+  # which a system-wide logical may point.
+  if ($self->{PERL_SRC}) {
+    my($lib,$locspec,$type);
+    foreach $lib (@crtls) { 
+      if (($locspec,$type) = $lib =~ m-^([\w$\-]+)(/\w+)?- and $locspec =~ /perl/i) {
+        if    (lc $type eq '/share')   { $locspec .= $Config{'exe_ext'}; }
+        elsif (lc $type eq '/library') { $locspec .= $Config{'lib_ext'}; }
+        else                           { $locspec .= $Config{'obj_ext'}; }
+        $locspec = $self->catfile($self->{PERL_SRC},$locspec);
+        $lib = "$locspec$type" if -e $locspec;
+      }
+    }
+  }
+  $crtlstr = @crtls ? join(' ',@crtls) : '';
+
+  unless ($potential_libs) {
+    warn "Result:\n\tEXTRALIBS: \n\tLDLOADLIBS: $crtlstr\n" if $verbose;
+    return ('', '', $crtlstr, '', ($give_libs ? [] : ()));
+  }
+
+  my(@dirs,@libs,$dir,$lib,%found,@fndlibs,$ldlib);
+  my $cwd = cwd();
+  my($so,$lib_ext,$obj_ext) = @Config{'so','lib_ext','obj_ext'};
+  # List of common Unix library names and their VMS equivalents
+  # (VMS equivalent of '' indicates that the library is automatically
+  # searched by the linker, and should be skipped here.)
+  my(@flibs, %libs_seen);
+  my %libmap = ( 'm' => '', 'f77' => '', 'F77' => '', 'V77' => '', 'c' => '',
+                 'malloc' => '', 'crypt' => '', 'resolv' => '', 'c_s' => '',
+                 'socket' => '', 'X11' => 'DECW$XLIBSHR',
+                 'Xt' => 'DECW$XTSHR', 'Xm' => 'DECW$XMLIBSHR',
+                 'Xmu' => 'DECW$XMULIBSHR');
+  if ($Config{'vms_cc_type'} ne 'decc') { $libmap{'curses'} = 'VAXCCURSE'; }
+
+  warn "Potential libraries are '$potential_libs'\n" if $verbose;
+
+  # First, sort out directories and library names in the input
+  foreach $lib (split ' ',$potential_libs) {
+    push(@dirs,$1),   next if $lib =~ /^-L(.*)/;
+    push(@dirs,$lib), next if $lib =~ /[:>\]]$/;
+    push(@dirs,$lib), next if -d $lib;
+    push(@libs,$1),   next if $lib =~ /^-l(.*)/;
+    push(@libs,$lib);
+  }
+  push(@dirs,split(' ',$Config{'libpth'}));
+
+  # Now make sure we've got VMS-syntax absolute directory specs
+  # (We don't, however, check whether someone's hidden a relative
+  # path in a logical name.)
+  foreach $dir (@dirs) {
+    unless (-d $dir) {
+      warn "Skipping nonexistent Directory $dir\n" if $verbose > 1;
+      $dir = '';
+      next;
+    }
+    warn "Resolving directory $dir\n" if $verbose;
+    if (File::Spec->file_name_is_absolute($dir)) { 
+        $dir = $self->fixpath($dir,1); 
+    }
+    else { 
+        $dir = $self->catdir($cwd,$dir); 
+    }
+  }
+  @dirs = grep { length($_) } @dirs;
+  unshift(@dirs,''); # Check each $lib without additions first
+
+  LIB: foreach $lib (@libs) {
+    if (exists $libmap{$lib}) {
+      next unless length $libmap{$lib};
+      $lib = $libmap{$lib};
+    }
+
+    my(@variants,$variant,$cand);
+    my($ctype) = '';
+
+    # If we don't have a file type, consider it a possibly abbreviated name and
+    # check for common variants.  We try these first to grab libraries before
+    # a like-named executable image (e.g. -lperl resolves to perlshr.exe
+    # before perl.exe).
+    if ($lib !~ /\.[^:>\]]*$/) {
+      push(@variants,"${lib}shr","${lib}rtl","${lib}lib");
+      push(@variants,"lib$lib") if $lib !~ /[:>\]]/;
+    }
+    push(@variants,$lib);
+    warn "Looking for $lib\n" if $verbose;
+    foreach $variant (@variants) {
+      my($fullname, $name);
+
+      foreach $dir (@dirs) {
+        my($type);
+
+        $name = "$dir$variant";
+        warn "\tChecking $name\n" if $verbose > 2;
+        $fullname = VMS::Filespec::rmsexpand($name);
+        if (defined $fullname and -f $fullname) {
+          # It's got its own suffix, so we'll have to figure out the type
+          if    ($fullname =~ /(?:$so|exe)$/i)      { $type = 'SHR'; }
+          elsif ($fullname =~ /(?:$lib_ext|olb)$/i) { $type = 'OLB'; }
+          elsif ($fullname =~ /(?:$obj_ext|obj)$/i) {
+            warn "Note (probably harmless): "
+                ."Plain object file $fullname found in library list\n";
+            $type = 'OBJ';
+          }
+          else {
+            warn "Note (probably harmless): "
+                ."Unknown library type for $fullname; assuming shared\n";
+            $type = 'SHR';
+          }
+        }
+        elsif (-f ($fullname = VMS::Filespec::rmsexpand($name,$so))      or
+               -f ($fullname = VMS::Filespec::rmsexpand($name,'.exe')))     {
+          $type = 'SHR';
+          $name = $fullname unless $fullname =~ /exe;?\d*$/i;
+        }
+        elsif (not length($ctype) and  # If we've got a lib already, 
+                                       # don't bother
+               ( -f ($fullname = VMS::Filespec::rmsexpand($name,$lib_ext)) or
+                 -f ($fullname = VMS::Filespec::rmsexpand($name,'.olb'))))  {
+          $type = 'OLB';
+          $name = $fullname unless $fullname =~ /olb;?\d*$/i;
+        }
+        elsif (not length($ctype) and  # If we've got a lib already, 
+                                       # don't bother
+               ( -f ($fullname = VMS::Filespec::rmsexpand($name,$obj_ext)) or
+                 -f ($fullname = VMS::Filespec::rmsexpand($name,'.obj'))))  {
+          warn "Note (probably harmless): "
+		       ."Plain object file $fullname found in library list\n";
+          $type = 'OBJ';
+          $name = $fullname unless $fullname =~ /obj;?\d*$/i;
+        }
+        if (defined $type) {
+          $ctype = $type; $cand = $name;
+          last if $ctype eq 'SHR';
+        }
+      }
+      if ($ctype) { 
+        # This has to precede any other CRTLs, so just make it first
+        if ($cand eq 'VAXCCURSE') { unshift @{$found{$ctype}}, $cand; }  
+        else                      { push    @{$found{$ctype}}, $cand; }
+        warn "\tFound as $cand (really $fullname), type $ctype\n" 
+          if $verbose > 1;
+	push @flibs, $name unless $libs_seen{$fullname}++;
+        next LIB;
+      }
+    }
+    warn "Note (probably harmless): "
+		 ."No library found for $lib\n";
+  }
+
+  push @fndlibs, @{$found{OBJ}}                      if exists $found{OBJ};
+  push @fndlibs, map { "$_/Library" } @{$found{OLB}} if exists $found{OLB};
+  push @fndlibs, map { "$_/Share"   } @{$found{SHR}} if exists $found{SHR};
+  $lib = join(' ',@fndlibs);
+
+  $ldlib = $crtlstr ? "$lib $crtlstr" : $lib;
+  warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose;
+  wantarray ? ($lib, '', $ldlib, '', ($give_libs ? \@flibs : ())) : $lib;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MANIFEST.SKIP
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MANIFEST.SKIP	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MANIFEST.SKIP	(revision 14489)
@@ -0,0 +1,30 @@
+# Avoid version control files.
+\bRCS\b
+\bCVS\b
+\bSCCS\b
+,v$
+\B\.svn\b
+\b_darcs\b
+
+# Avoid Makemaker generated and utility files.
+\bMANIFEST\.bak
+\bMakefile$
+\bblib/
+\bMakeMaker-\d
+\bpm_to_blib\.ts$
+\bpm_to_blib$
+\bblibdirs\.ts$         # 6.18 through 6.25 generated this
+
+# Avoid Module::Build generated and utility files.
+\bBuild$
+\b_build/
+
+# Avoid temp and backup files.
+~$
+\.old$
+\#$
+\b\.#
+\.bak$
+
+# Avoid Devel::Cover files.
+\bcover_db\b
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM.pm	(revision 14489)
@@ -0,0 +1,83 @@
+package ExtUtils::MM;
+
+use strict;
+use ExtUtils::MakeMaker::Config;
+use vars qw(@ISA $VERSION);
+$VERSION = '0.05';
+
+require ExtUtils::Liblist;
+require ExtUtils::MakeMaker;
+
+@ISA = qw(ExtUtils::Liblist ExtUtils::MakeMaker);
+
+=head1 NAME
+
+ExtUtils::MM - OS adjusted ExtUtils::MakeMaker subclass
+
+=head1 SYNOPSIS
+
+  require ExtUtils::MM;
+  my $mm = MM->new(...);
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY>
+
+ExtUtils::MM is a subclass of ExtUtils::MakeMaker which automatically
+chooses the appropriate OS specific subclass for you
+(ie. ExtUils::MM_Unix, etc...).
+
+It also provides a convenient alias via the MM class (I didn't want
+MakeMaker modules outside of ExtUtils/).
+
+This class might turn out to be a temporary solution, but MM won't go
+away.
+
+=cut
+
+{
+    # Convenient alias.
+    package MM;
+    use vars qw(@ISA);
+    @ISA = qw(ExtUtils::MM);
+    sub DESTROY {}
+}
+
+my %Is = ();
+$Is{VMS}    = $^O eq 'VMS';
+$Is{OS2}    = $^O eq 'os2';
+$Is{MacOS}  = $^O eq 'MacOS';
+if( $^O eq 'MSWin32' ) {
+    Win32::IsWin95() ? $Is{Win95} = 1 : $Is{Win32} = 1;
+}
+$Is{UWIN}   = $^O =~ /^uwin(-nt)?$/;
+$Is{Cygwin} = $^O eq 'cygwin';
+$Is{NW5}    = $Config{osname} eq 'NetWare';  # intentional
+$Is{BeOS}   = $^O =~ /beos/i;    # XXX should this be that loose?
+$Is{DOS}    = $^O eq 'dos';
+if( $Is{NW5} ) {
+    $^O = 'NetWare';
+    delete $Is{Win32};
+}
+$Is{VOS}    = $^O eq 'vos';
+$Is{QNX}    = $^O eq 'qnx';
+$Is{AIX}    = $^O eq 'aix';
+
+$Is{Unix}   = !grep { $_ } values %Is;
+
+map { delete $Is{$_} unless $Is{$_} } keys %Is;
+_assert( keys %Is == 1 );
+my($OS) = keys %Is;
+
+
+my $class = "ExtUtils::MM_$OS";
+eval "require $class" unless $INC{"ExtUtils/MM_$OS.pm"};
+die $@ if $@;
+unshift @ISA, $class;
+
+
+sub _assert {
+    my $sanity = shift;
+    die sprintf "Assert failed at %s line %d\n", (caller)[1,2] unless $sanity;
+    return;
+}
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_AIX.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_AIX.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_AIX.pm	(revision 14489)
@@ -0,0 +1,80 @@
+package ExtUtils::MM_AIX;
+
+use strict;
+use vars qw($VERSION @ISA);
+$VERSION = '0.03';
+
+require ExtUtils::MM_Unix;
+@ISA = qw(ExtUtils::MM_Unix);
+
+use ExtUtils::MakeMaker qw(neatvalue);
+
+
+=head1 NAME
+
+ExtUtils::MM_AIX - AIX specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+  Don't use this module directly.
+  Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+AIX.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=head3 dlsyms
+
+Define DL_FUNCS and DL_VARS and write the *.exp files.
+
+=cut
+
+sub dlsyms {
+    my($self,%attribs) = @_;
+
+    return '' unless $self->needs_linking();
+
+    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
+    my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];
+    my($funclist)  = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
+    my(@m);
+
+    push(@m,"
+dynamic :: $self->{BASEEXT}.exp
+
+") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
+
+    push(@m,"
+static :: $self->{BASEEXT}.exp
+
+") unless $self->{SKIPHASH}{'static'};  # we avoid a warning if we tick them
+
+    push(@m,"
+$self->{BASEEXT}.exp: Makefile.PL
+",'	$(PERLRUN) -e \'use ExtUtils::Mksymlists; \\
+	Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
+	neatvalue($funcs), ', "FUNCLIST" => ', neatvalue($funclist),
+	', "DL_VARS" => ', neatvalue($vars), ');\'
+');
+
+    join('',@m);
+}
+
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Any.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Any.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Any.pm	(revision 14489)
@@ -0,0 +1,1683 @@
+package ExtUtils::MM_Any;
+
+use strict;
+use vars qw($VERSION @ISA);
+$VERSION = '0.13';
+
+use File::Spec;
+BEGIN { @ISA = qw(File::Spec); }
+
+# We need $Verbose
+use ExtUtils::MakeMaker qw($Verbose);
+
+use ExtUtils::MakeMaker::Config;
+
+
+# So we don't have to keep calling the methods over and over again,
+# we have these globals to cache the values.  Faster and shrtr.
+my $Curdir  = __PACKAGE__->curdir;
+my $Rootdir = __PACKAGE__->rootdir;
+my $Updir   = __PACKAGE__->updir;
+
+
+=head1 NAME
+
+ExtUtils::MM_Any - Platform-agnostic MM methods
+
+=head1 SYNOPSIS
+
+  FOR INTERNAL USE ONLY!
+
+  package ExtUtils::MM_SomeOS;
+
+  # Temporarily, you have to subclass both.  Put MM_Any first.
+  require ExtUtils::MM_Any;
+  require ExtUtils::MM_Unix;
+  @ISA = qw(ExtUtils::MM_Any ExtUtils::Unix);
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY!>
+
+ExtUtils::MM_Any is a superclass for the ExtUtils::MM_* set of
+modules.  It contains methods which are either inherently
+cross-platform or are written in a cross-platform manner.
+
+Subclass off of ExtUtils::MM_Any I<and> ExtUtils::MM_Unix.  This is a
+temporary solution.
+
+B<THIS MAY BE TEMPORARY!>
+
+
+=head1 METHODS
+
+Any methods marked I<Abstract> must be implemented by subclasses.
+
+
+=head2 Cross-platform helper methods
+
+These are methods which help writing cross-platform code.
+
+
+
+=head3 os_flavor  I<Abstract>
+
+    my @os_flavor = $mm->os_flavor;
+
+@os_flavor is the style of operating system this is, usually
+corresponding to the MM_*.pm file we're using.  
+
+The first element of @os_flavor is the major family (ie. Unix,
+Windows, VMS, OS/2, etc...) and the rest are sub families.
+
+Some examples:
+
+    Cygwin98       ('Unix',  'Cygwin', 'Cygwin9x')
+    Windows NT     ('Win32', 'WinNT')
+    Win98          ('Win32', 'Win9x')
+    Linux          ('Unix',  'Linux')
+    MacOS X        ('Unix',  'Darwin', 'MacOS', 'MacOS X')
+    OS/2           ('OS/2')
+
+This is used to write code for styles of operating system.  
+See os_flavor_is() for use.
+
+
+=head3 os_flavor_is
+
+    my $is_this_flavor = $mm->os_flavor_is($this_flavor);
+    my $is_this_flavor = $mm->os_flavor_is(@one_of_these_flavors);
+
+Checks to see if the current operating system is one of the given flavors.
+
+This is useful for code like:
+
+    if( $mm->os_flavor_is('Unix') ) {
+        $out = `foo 2>&1`;
+    }
+    else {
+        $out = `foo`;
+    }
+
+=cut
+
+sub os_flavor_is {
+    my $self = shift;
+    my %flavors = map { ($_ => 1) } $self->os_flavor;
+    return (grep { $flavors{$_} } @_) ? 1 : 0;
+}
+
+
+=head3 split_command
+
+    my @cmds = $MM->split_command($cmd, @args);
+
+Most OS have a maximum command length they can execute at once.  Large
+modules can easily generate commands well past that limit.  Its
+necessary to split long commands up into a series of shorter commands.
+
+C<split_command> will return a series of @cmds each processing part of
+the args.  Collectively they will process all the arguments.  Each
+individual line in @cmds will not be longer than the
+$self->max_exec_len being careful to take into account macro expansion.
+
+$cmd should include any switches and repeated initial arguments.
+
+If no @args are given, no @cmds will be returned.
+
+Pairs of arguments will always be preserved in a single command, this
+is a heuristic for things like pm_to_blib and pod2man which work on
+pairs of arguments.  This makes things like this safe:
+
+    $self->split_command($cmd, %pod2man);
+
+
+=cut
+
+sub split_command {
+    my($self, $cmd, @args) = @_;
+
+    my @cmds = ();
+    return(@cmds) unless @args;
+
+    # If the command was given as a here-doc, there's probably a trailing
+    # newline.
+    chomp $cmd;
+
+    # set aside 20% for macro expansion.
+    my $len_left = int($self->max_exec_len * 0.80);
+    $len_left -= length $self->_expand_macros($cmd);
+
+    do {
+        my $arg_str = '';
+        my @next_args;
+        while( @next_args = splice(@args, 0, 2) ) {
+            # Two at a time to preserve pairs.
+            my $next_arg_str = "\t  ". join ' ', @next_args, "\n";
+
+            if( !length $arg_str ) {
+                $arg_str .= $next_arg_str
+            }
+            elsif( length($arg_str) + length($next_arg_str) > $len_left ) {
+                unshift @args, @next_args;
+                last;
+            }
+            else {
+                $arg_str .= $next_arg_str;
+            }
+        }
+        chop $arg_str;
+
+        push @cmds, $self->escape_newlines("$cmd \n$arg_str");
+    } while @args;
+
+    return @cmds;
+}
+
+
+sub _expand_macros {
+    my($self, $cmd) = @_;
+
+    $cmd =~ s{\$\((\w+)\)}{
+        defined $self->{$1} ? $self->{$1} : "\$($1)"
+    }e;
+    return $cmd;
+}
+
+
+=head3 echo
+
+    my @commands = $MM->echo($text);
+    my @commands = $MM->echo($text, $file);
+    my @commands = $MM->echo($text, $file, $appending);
+
+Generates a set of @commands which print the $text to a $file.
+
+If $file is not given, output goes to STDOUT.
+
+If $appending is true the $file will be appended to rather than
+overwritten.
+
+=cut
+
+sub echo {
+    my($self, $text, $file, $appending) = @_;
+    $appending ||= 0;
+
+    my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_) } 
+               split /\n/, $text;
+    if( $file ) {
+        my $redirect = $appending ? '>>' : '>';
+        $cmds[0] .= " $redirect $file";
+        $_ .= " >> $file" foreach @cmds[1..$#cmds];
+    }
+
+    return @cmds;
+}
+
+
+=head3 wraplist
+
+  my $args = $mm->wraplist(@list);
+
+Takes an array of items and turns them into a well-formatted list of
+arguments.  In most cases this is simply something like:
+
+    FOO \
+    BAR \
+    BAZ
+
+=cut
+
+sub wraplist {
+    my $self = shift;
+    return join " \\\n\t", @_;
+}
+
+
+=head3 cd  I<Abstract>
+
+  my $subdir_cmd = $MM->cd($subdir, @cmds);
+
+This will generate a make fragment which runs the @cmds in the given
+$dir.  The rough equivalent to this, except cross platform.
+
+  cd $subdir && $cmd
+
+Currently $dir can only go down one level.  "foo" is fine.  "foo/bar" is
+not.  "../foo" is right out.
+
+The resulting $subdir_cmd has no leading tab nor trailing newline.  This
+makes it easier to embed in a make string.  For example.
+
+      my $make = sprintf <<'CODE', $subdir_cmd;
+  foo :
+      $(ECHO) what
+      %s
+      $(ECHO) mouche
+  CODE
+
+
+=head3 oneliner  I<Abstract>
+
+  my $oneliner = $MM->oneliner($perl_code);
+  my $oneliner = $MM->oneliner($perl_code, \@switches);
+
+This will generate a perl one-liner safe for the particular platform
+you're on based on the given $perl_code and @switches (a -e is
+assumed) suitable for using in a make target.  It will use the proper
+shell quoting and escapes.
+
+$(PERLRUN) will be used as perl.
+
+Any newlines in $perl_code will be escaped.  Leading and trailing
+newlines will be stripped.  Makes this idiom much easier:
+
+    my $code = $MM->oneliner(<<'CODE', [...switches...]);
+some code here
+another line here
+CODE
+
+Usage might be something like:
+
+    # an echo emulation
+    $oneliner = $MM->oneliner('print "Foo\n"');
+    $make = '$oneliner > somefile';
+
+All dollar signs must be doubled in the $perl_code if you expect them
+to be interpreted normally, otherwise it will be considered a make
+macro.  Also remember to quote make macros else it might be used as a
+bareword.  For example:
+
+    # Assign the value of the $(VERSION_FROM) make macro to $vf.
+    $oneliner = $MM->oneliner('$$vf = "$(VERSION_FROM)"');
+
+Its currently very simple and may be expanded sometime in the figure
+to include more flexible code and switches.
+
+
+=head3 quote_literal  I<Abstract>
+
+    my $safe_text = $MM->quote_literal($text);
+
+This will quote $text so it is interpreted literally in the shell.
+
+For example, on Unix this would escape any single-quotes in $text and
+put single-quotes around the whole thing.
+
+
+=head3 escape_newlines  I<Abstract>
+
+    my $escaped_text = $MM->escape_newlines($text);
+
+Shell escapes newlines in $text.
+
+
+=head3 max_exec_len  I<Abstract>
+
+    my $max_exec_len = $MM->max_exec_len;
+
+Calculates the maximum command size the OS can exec.  Effectively,
+this is the max size of a shell command line.
+
+=for _private
+$self->{_MAX_EXEC_LEN} is set by this method, but only for testing purposes.
+
+
+
+
+
+=head2 Targets
+
+These are methods which produce make targets.
+
+
+=head3 all_target
+
+Generate the default target 'all'.
+
+=cut
+
+sub all_target {
+    my $self = shift;
+
+    return <<'MAKE_EXT';
+all :: pure_all
+	$(NOECHO) $(NOOP)
+MAKE_EXT
+
+}
+
+
+=head3 blibdirs_target
+
+    my $make_frag = $mm->blibdirs_target;
+
+Creates the blibdirs target which creates all the directories we use
+in blib/.
+
+The blibdirs.ts target is deprecated.  Depend on blibdirs instead.
+
+
+=cut
+
+sub blibdirs_target {
+    my $self = shift;
+
+    my @dirs = map { uc "\$(INST_$_)" } qw(libdir archlib
+                                           autodir archautodir
+                                           bin script
+                                           man1dir man3dir
+                                          );
+
+    my @exists = map { $_.'$(DFSEP).exists' } @dirs;
+
+    my $make = sprintf <<'MAKE', join(' ', @exists);
+blibdirs : %s
+	$(NOECHO) $(NOOP)
+
+# Backwards compat with 6.18 through 6.25
+blibdirs.ts : blibdirs
+	$(NOECHO) $(NOOP)
+
+MAKE
+
+    $make .= $self->dir_target(@dirs);
+
+    return $make;
+}
+
+
+=head3 clean (o)
+
+Defines the clean target.
+
+=cut
+
+sub clean {
+# --- Cleanup and Distribution Sections ---
+
+    my($self, %attribs) = @_;
+    my @m;
+    push(@m, '
+# Delete temporary files but do not touch installed files. We don\'t delete
+# the Makefile here so a later make realclean still has a makefile to use.
+
+clean :: clean_subdirs
+');
+
+    my @files = values %{$self->{XS}}; # .c files from *.xs files
+    my @dirs  = qw(blib);
+
+    # Normally these are all under blib but they might have been
+    # redefined.
+    # XXX normally this would be a good idea, but the Perl core sets
+    # INST_LIB = ../../lib rather than actually installing the files.
+    # So a "make clean" in an ext/ directory would blow away lib.
+    # Until the core is adjusted let's leave this out.
+#     push @dirs, qw($(INST_ARCHLIB) $(INST_LIB)
+#                    $(INST_BIN) $(INST_SCRIPT)
+#                    $(INST_MAN1DIR) $(INST_MAN3DIR)
+#                    $(INST_LIBDIR) $(INST_ARCHLIBDIR) $(INST_AUTODIR) 
+#                    $(INST_STATIC) $(INST_DYNAMIC) $(INST_BOOT)
+#                 );
+                  
+
+    if( $attribs{FILES} ) {
+        # Use @dirs because we don't know what's in here.
+        push @dirs, ref $attribs{FILES}                ?
+                        @{$attribs{FILES}}             :
+                        split /\s+/, $attribs{FILES}   ;
+    }
+
+    push(@files, qw[$(MAKE_APERL_FILE) 
+                    perlmain.c tmon.out mon.out so_locations 
+                    blibdirs.ts pm_to_blib pm_to_blib.ts
+                    *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
+                    $(BOOTSTRAP) $(BASEEXT).bso
+                    $(BASEEXT).def lib$(BASEEXT).def
+                    $(BASEEXT).exp $(BASEEXT).x
+                   ]);
+
+    push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
+    push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.ld'));
+
+    # core files
+    push(@files, qw[core core.*perl.*.? *perl.core]);
+    push(@files, map { "core." . "[0-9]"x$_ } (1..5));
+
+    # OS specific things to clean up.  Use @dirs since we don't know
+    # what might be in here.
+    push @dirs, $self->extra_clean_files;
+
+    # Occasionally files are repeated several times from different sources
+    { my(%f) = map { ($_ => 1) } @files; @files = keys %f; }
+    { my(%d) = map { ($_ => 1) } @dirs;  @dirs  = keys %d; }
+
+    push @m, map "\t$_\n", $self->split_command('- $(RM_F)',  @files);
+    push @m, map "\t$_\n", $self->split_command('- $(RM_RF)', @dirs);
+
+    # Leave Makefile.old around for realclean
+    push @m, <<'MAKE';
+	- $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
+MAKE
+
+    push(@m, "\t$attribs{POSTOP}\n")   if $attribs{POSTOP};
+
+    join("", @m);
+}
+
+
+=head3 clean_subdirs_target
+
+  my $make_frag = $MM->clean_subdirs_target;
+
+Returns the clean_subdirs target.  This is used by the clean target to
+call clean on any subdirectories which contain Makefiles.
+
+=cut
+
+sub clean_subdirs_target {
+    my($self) = shift;
+
+    # No subdirectories, no cleaning.
+    return <<'NOOP_FRAG' unless @{$self->{DIR}};
+clean_subdirs :
+	$(NOECHO) $(NOOP)
+NOOP_FRAG
+
+
+    my $clean = "clean_subdirs :\n";
+
+    for my $dir (@{$self->{DIR}}) {
+        my $subclean = $self->oneliner(sprintf <<'CODE', $dir);
+chdir '%s';  system '$(MAKE) clean' if -f '$(FIRST_MAKEFILE)';
+CODE
+
+        $clean .= "\t$subclean\n";
+    }
+
+    return $clean;
+}
+
+
+=head3 dir_target
+
+    my $make_frag = $mm->dir_target(@directories);
+
+Generates targets to create the specified directories and set its
+permission to 0755.
+
+Because depending on a directory to just ensure it exists doesn't work
+too well (the modified time changes too often) dir_target() creates a
+.exists file in the created directory.  It is this you should depend on.
+For portability purposes you should use the $(DIRFILESEP) macro rather
+than a '/' to seperate the directory from the file.
+
+    yourdirectory$(DIRFILESEP).exists
+
+=cut
+
+sub dir_target {
+    my($self, @dirs) = @_;
+
+    my $make = '';
+    foreach my $dir (@dirs) {
+        $make .= sprintf <<'MAKE', ($dir) x 7;
+%s$(DFSEP).exists :: Makefile.PL
+	$(NOECHO) $(MKPATH) %s
+	$(NOECHO) $(CHMOD) 755 %s
+	$(NOECHO) $(TOUCH) %s$(DFSEP).exists
+
+MAKE
+
+    }
+
+    return $make;
+}
+
+
+=head3 distdir
+
+Defines the scratch directory target that will hold the distribution
+before tar-ing (or shar-ing).
+
+=cut
+
+# For backwards compatibility.
+*dist_dir = *distdir;
+
+sub distdir {
+    my($self) = shift;
+
+    my $meta_target = $self->{NO_META} ? '' : 'distmeta';
+    my $sign_target = !$self->{SIGN}   ? '' : 'distsignature';
+
+    return sprintf <<'MAKE_FRAG', $meta_target, $sign_target;
+create_distdir :
+	$(RM_RF) $(DISTVNAME)
+	$(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
+		-e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
+
+distdir : create_distdir %s %s
+	$(NOECHO) $(NOOP)
+
+MAKE_FRAG
+
+}
+
+
+=head3 dist_test
+
+Defines a target that produces the distribution in the
+scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
+subdirectory.
+
+=cut
+
+sub dist_test {
+    my($self) = shift;
+
+    my $mpl_args = join " ", map qq["$_"], @ARGV;
+
+    my $test = $self->cd('$(DISTVNAME)',
+                         '$(ABSPERLRUN) Makefile.PL '.$mpl_args,
+                         '$(MAKE) $(PASTHRU)',
+                         '$(MAKE) test $(PASTHRU)'
+                        );
+
+    return sprintf <<'MAKE_FRAG', $test;
+disttest : distdir
+	%s
+
+MAKE_FRAG
+
+
+}
+
+
+=head3 dynamic (o)
+
+Defines the dynamic target.
+
+=cut
+
+sub dynamic {
+# --- Dynamic Loading Sections ---
+
+    my($self) = shift;
+    '
+dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
+	$(NOECHO) $(NOOP)
+';
+}
+
+
+=head3 makemakerdflt_target
+
+  my $make_frag = $mm->makemakerdflt_target
+
+Returns a make fragment with the makemakerdeflt_target specified.
+This target is the first target in the Makefile, is the default target
+and simply points off to 'all' just in case any make variant gets
+confused or something gets snuck in before the real 'all' target.
+
+=cut
+
+sub makemakerdflt_target {
+    return <<'MAKE_FRAG';
+makemakerdflt: all
+	$(NOECHO) $(NOOP)
+MAKE_FRAG
+
+}
+
+
+=head3 manifypods_target
+
+  my $manifypods_target = $self->manifypods_target;
+
+Generates the manifypods target.  This target generates man pages from
+all POD files in MAN1PODS and MAN3PODS.
+
+=cut
+
+sub manifypods_target {
+    my($self) = shift;
+
+    my $man1pods      = '';
+    my $man3pods      = '';
+    my $dependencies  = '';
+
+    # populate manXpods & dependencies:
+    foreach my $name (keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}}) {
+        $dependencies .= " \\\n\t$name";
+    }
+
+    foreach my $name (keys %{$self->{MAN3PODS}}) {
+        $dependencies .= " \\\n\t$name"
+    }
+
+    my $manify = <<END;
+manifypods : pure_all $dependencies
+END
+
+    my @man_cmds;
+    foreach my $section (qw(1 3)) {
+        my $pods = $self->{"MAN${section}PODS"};
+        push @man_cmds, $self->split_command(<<CMD, %$pods);
+	\$(NOECHO) \$(POD2MAN) --section=$section --perm_rw=\$(PERM_RW)
+CMD
+    }
+
+    $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds;
+    $manify .= join '', map { "$_\n" } @man_cmds;
+
+    return $manify;
+}
+
+
+=head3 metafile_target
+
+    my $target = $mm->metafile_target;
+
+Generate the metafile target.
+
+Writes the file META.yml YAML encoded meta-data about the module in
+the distdir.  The format follows Module::Build's as closely as
+possible.  Additionally, we include:
+
+    version_from
+    installdirs
+
+=cut
+
+sub metafile_target {
+    my $self = shift;
+
+    return <<'MAKE_FRAG' if $self->{NO_META};
+metafile:
+	$(NOECHO) $(NOOP)
+MAKE_FRAG
+
+    my $prereq_pm = '';
+    foreach my $mod ( sort { lc $a cmp lc $b } keys %{$self->{PREREQ_PM}} ) {
+        my $ver = $self->{PREREQ_PM}{$mod};
+        $prereq_pm .= sprintf "    %-30s %s\n", "$mod:", $ver;
+    }
+
+    my $meta = <<YAML;
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
+name:         $self->{DISTNAME}
+version:      $self->{VERSION}
+version_from: $self->{VERSION_FROM}
+installdirs:  $self->{INSTALLDIRS}
+requires:
+$prereq_pm
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION
+YAML
+
+    my @write_meta = $self->echo($meta, 'META_new.yml');
+
+    return sprintf <<'MAKE_FRAG', join("\n\t", @write_meta);
+metafile : create_distdir
+	$(NOECHO) $(ECHO) Generating META.yml
+	%s
+	-$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
+MAKE_FRAG
+
+}
+
+
+=head3 distmeta_target
+
+    my $make_frag = $mm->distmeta_target;
+
+Generates the distmeta target to add META.yml to the MANIFEST in the
+distdir.
+
+=cut
+
+sub distmeta_target {
+    my $self = shift;
+
+    my $add_meta = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
+eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } 
+    or print "Could not add META.yml to MANIFEST: $${'@'}\n"
+CODE
+
+    my $add_meta_to_distdir = $self->cd('$(DISTVNAME)', $add_meta);
+
+    return sprintf <<'MAKE', $add_meta_to_distdir;
+distmeta : create_distdir metafile
+	$(NOECHO) %s
+
+MAKE
+
+}
+
+
+=head3 realclean (o)
+
+Defines the realclean target.
+
+=cut
+
+sub realclean {
+    my($self, %attribs) = @_;
+
+    my @dirs  = qw($(DISTVNAME));
+    my @files = qw($(FIRST_MAKEFILE) $(MAKEFILE_OLD));
+
+    # Special exception for the perl core where INST_* is not in blib.
+    # This cleans up the files built from the ext/ directory (all XS).
+    if( $self->{PERL_CORE} ) {
+	push @dirs, qw($(INST_AUTODIR) $(INST_ARCHAUTODIR));
+        push @files, values %{$self->{PM}};
+    }
+
+    if( $self->has_link_code ){
+        push @files, qw($(OBJECT));
+    }
+
+    if( $attribs{FILES} ) {
+        if( ref $attribs{FILES} ) {
+            push @dirs, @{ $attribs{FILES} };
+        }
+        else {
+            push @dirs, split /\s+/, $attribs{FILES};
+        }
+    }
+
+    # Occasionally files are repeated several times from different sources
+    { my(%f) = map { ($_ => 1) } @files;  @files = keys %f; }
+    { my(%d) = map { ($_ => 1) } @dirs;   @dirs  = keys %d; }
+
+    my $rm_cmd  = join "\n\t", map { "$_" } 
+                    $self->split_command('- $(RM_F)',  @files);
+    my $rmf_cmd = join "\n\t", map { "$_" } 
+                    $self->split_command('- $(RM_RF)', @dirs);
+
+    my $m = sprintf <<'MAKE', $rm_cmd, $rmf_cmd;
+# Delete temporary files (via clean) and also delete dist files
+realclean purge ::  clean realclean_subdirs
+	%s
+	%s
+MAKE
+
+    $m .= "\t$attribs{POSTOP}\n" if $attribs{POSTOP};
+
+    return $m;
+}
+
+
+=head3 realclean_subdirs_target
+
+  my $make_frag = $MM->realclean_subdirs_target;
+
+Returns the realclean_subdirs target.  This is used by the realclean
+target to call realclean on any subdirectories which contain Makefiles.
+
+=cut
+
+sub realclean_subdirs_target {
+    my $self = shift;
+
+    return <<'NOOP_FRAG' unless @{$self->{DIR}};
+realclean_subdirs :
+	$(NOECHO) $(NOOP)
+NOOP_FRAG
+
+    my $rclean = "realclean_subdirs :\n";
+
+    foreach my $dir (@{$self->{DIR}}) {
+        foreach my $makefile ('$(MAKEFILE_OLD)', '$(FIRST_MAKEFILE)' ) {
+            my $subrclean .= $self->oneliner(sprintf <<'CODE', $dir, ($makefile) x 2);
+chdir '%s';  system '$(MAKE) $(USEMAKEFILE) %s realclean' if -f '%s';
+CODE
+
+            $rclean .= sprintf <<'RCLEAN', $subrclean;
+	- %s
+RCLEAN
+
+        }
+    }
+
+    return $rclean;
+}
+
+
+=head3 signature_target
+
+    my $target = $mm->signature_target;
+
+Generate the signature target.
+
+Writes the file SIGNATURE with "cpansign -s".
+
+=cut
+
+sub signature_target {
+    my $self = shift;
+
+    return <<'MAKE_FRAG';
+signature :
+	cpansign -s
+MAKE_FRAG
+
+}
+
+
+=head3 distsignature_target
+
+    my $make_frag = $mm->distsignature_target;
+
+Generates the distsignature target to add SIGNATURE to the MANIFEST in the
+distdir.
+
+=cut
+
+sub distsignature_target {
+    my $self = shift;
+
+    my $add_sign = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
+eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } 
+    or print "Could not add SIGNATURE to MANIFEST: $${'@'}\n"
+CODE
+
+    my $sign_dist        = $self->cd('$(DISTVNAME)' => 'cpansign -s');
+
+    # cpansign -s complains if SIGNATURE is in the MANIFEST yet does not
+    # exist
+    my $touch_sig        = $self->cd('$(DISTVNAME)' => '$(TOUCH) SIGNATURE');
+    my $add_sign_to_dist = $self->cd('$(DISTVNAME)' => $add_sign );
+
+    return sprintf <<'MAKE', $add_sign_to_dist, $touch_sig, $sign_dist
+distsignature : create_distdir
+	$(NOECHO) %s
+	$(NOECHO) %s
+	%s
+
+MAKE
+
+}
+
+
+=head3 special_targets
+
+  my $make_frag = $mm->special_targets
+
+Returns a make fragment containing any targets which have special
+meaning to make.  For example, .SUFFIXES and .PHONY.
+
+=cut
+
+sub special_targets {
+    my $make_frag = <<'MAKE_FRAG';
+.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
+
+.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir
+
+MAKE_FRAG
+
+    $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT};
+.NO_CONFIG_REC: Makefile
+
+MAKE_FRAG
+
+    return $make_frag;
+}
+
+
+
+
+=head2 Init methods
+
+Methods which help initialize the MakeMaker object and macros.
+
+
+=head3 init_INST
+
+    $mm->init_INST;
+
+Called by init_main.  Sets up all INST_* variables except those related
+to XS code.  Those are handled in init_xs.
+
+=cut
+
+sub init_INST {
+    my($self) = shift;
+
+    $self->{INST_ARCHLIB} ||= $self->catdir($Curdir,"blib","arch");
+    $self->{INST_BIN}     ||= $self->catdir($Curdir,'blib','bin');
+
+    # INST_LIB typically pre-set if building an extension after
+    # perl has been built and installed. Setting INST_LIB allows
+    # you to build directly into, say $Config{privlibexp}.
+    unless ($self->{INST_LIB}){
+	if ($self->{PERL_CORE}) {
+            if (defined $Cross::platform) {
+                $self->{INST_LIB} = $self->{INST_ARCHLIB} = 
+                  $self->catdir($self->{PERL_LIB},"..","xlib",
+                                     $Cross::platform);
+            }
+            else {
+                $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
+            }
+	} else {
+	    $self->{INST_LIB} = $self->catdir($Curdir,"blib","lib");
+	}
+    }
+
+    my @parentdir = split(/::/, $self->{PARENT_NAME});
+    $self->{INST_LIBDIR}      = $self->catdir('$(INST_LIB)',     @parentdir);
+    $self->{INST_ARCHLIBDIR}  = $self->catdir('$(INST_ARCHLIB)', @parentdir);
+    $self->{INST_AUTODIR}     = $self->catdir('$(INST_LIB)', 'auto', 
+                                              '$(FULLEXT)');
+    $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)', 'auto',
+                                              '$(FULLEXT)');
+
+    $self->{INST_SCRIPT}  ||= $self->catdir($Curdir,'blib','script');
+
+    $self->{INST_MAN1DIR} ||= $self->catdir($Curdir,'blib','man1');
+    $self->{INST_MAN3DIR} ||= $self->catdir($Curdir,'blib','man3');
+
+    return 1;
+}
+
+
+=head3 init_INSTALL
+
+    $mm->init_INSTALL;
+
+Called by init_main.  Sets up all INSTALL_* variables (except
+INSTALLDIRS) and *PREFIX.
+
+=cut
+
+sub init_INSTALL {
+    my($self) = shift;
+
+    if( $self->{ARGS}{INSTALLBASE} and $self->{ARGS}{PREFIX} ) {
+        die "Only one of PREFIX or INSTALLBASE can be given.  Not both.\n";
+    }
+
+    if( $self->{ARGS}{INSTALLBASE} ) {
+        $self->init_INSTALL_from_INSTALLBASE;
+    }
+    else {
+        $self->init_INSTALL_from_PREFIX;
+    }
+}
+
+
+=head3 init_INSTALL_from_PREFIX
+
+  $mm->init_INSTALL_from_PREFIX;
+
+=cut
+
+sub init_INSTALL_from_PREFIX {
+    my $self = shift;
+
+    $self->init_lib2arch;
+
+    # There are often no Config.pm defaults for these new man variables so 
+    # we fall back to the old behavior which is to use installman*dir
+    foreach my $num (1, 3) {
+        my $k = 'installsiteman'.$num.'dir';
+
+        $self->{uc $k} ||= uc "\$(installman${num}dir)"
+          unless $Config{$k};
+    }
+
+    foreach my $num (1, 3) {
+        my $k = 'installvendorman'.$num.'dir';
+
+        unless( $Config{$k} ) {
+            $self->{uc $k}  ||= $Config{usevendorprefix}
+                              ? uc "\$(installman${num}dir)"
+                              : '';
+        }
+    }
+
+    $self->{INSTALLSITEBIN} ||= '$(INSTALLBIN)'
+      unless $Config{installsitebin};
+
+    unless( $Config{installvendorbin} ) {
+        $self->{INSTALLVENDORBIN} ||= $Config{usevendorprefix} 
+                                    ? $Config{installbin}
+                                    : '';
+    }
+
+
+    my $iprefix = $Config{installprefixexp} || $Config{installprefix} || 
+                  $Config{prefixexp}        || $Config{prefix} || '';
+    my $vprefix = $Config{usevendorprefix}  ? $Config{vendorprefixexp} : '';
+    my $sprefix = $Config{siteprefixexp}    || '';
+
+    # 5.005_03 doesn't have a siteprefix.
+    $sprefix = $iprefix unless $sprefix;
+
+
+    $self->{PREFIX}       ||= '';
+
+    if( $self->{PREFIX} ) {
+        @{$self}{qw(PERLPREFIX SITEPREFIX VENDORPREFIX)} =
+          ('$(PREFIX)') x 3;
+    }
+    else {
+        $self->{PERLPREFIX}   ||= $iprefix;
+        $self->{SITEPREFIX}   ||= $sprefix;
+        $self->{VENDORPREFIX} ||= $vprefix;
+
+        # Lots of MM extension authors like to use $(PREFIX) so we
+        # put something sensible in there no matter what.
+        $self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)';
+    }
+
+    my $arch    = $Config{archname};
+    my $version = $Config{version};
+
+    # default style
+    my $libstyle = $Config{installstyle} || 'lib/perl5';
+    my $manstyle = '';
+
+    if( $self->{LIBSTYLE} ) {
+        $libstyle = $self->{LIBSTYLE};
+        $manstyle = $self->{LIBSTYLE} eq 'lib/perl5' ? 'lib/perl5' : '';
+    }
+
+    # Some systems, like VOS, set installman*dir to '' if they can't
+    # read man pages.
+    for my $num (1, 3) {
+        $self->{'INSTALLMAN'.$num.'DIR'} ||= 'none'
+          unless $Config{'installman'.$num.'dir'};
+    }
+
+    my %bin_layouts = 
+    (
+        bin         => { s => $iprefix,
+                         t => 'perl',
+                         d => 'bin' },
+        vendorbin   => { s => $vprefix,
+                         t => 'vendor',
+                         d => 'bin' },
+        sitebin     => { s => $sprefix,
+                         t => 'site',
+                         d => 'bin' },
+        script      => { s => $iprefix,
+                         t => 'perl',
+                         d => 'bin' },
+    );
+    
+    my %man_layouts =
+    (
+        man1dir         => { s => $iprefix,
+                             t => 'perl',
+                             d => 'man/man1',
+                             style => $manstyle, },
+        siteman1dir     => { s => $sprefix,
+                             t => 'site',
+                             d => 'man/man1',
+                             style => $manstyle, },
+        vendorman1dir   => { s => $vprefix,
+                             t => 'vendor',
+                             d => 'man/man1',
+                             style => $manstyle, },
+
+        man3dir         => { s => $iprefix,
+                             t => 'perl',
+                             d => 'man/man3',
+                             style => $manstyle, },
+        siteman3dir     => { s => $sprefix,
+                             t => 'site',
+                             d => 'man/man3',
+                             style => $manstyle, },
+        vendorman3dir   => { s => $vprefix,
+                             t => 'vendor',
+                             d => 'man/man3',
+                             style => $manstyle, },
+    );
+
+    my %lib_layouts =
+    (
+        privlib     => { s => $iprefix,
+                         t => 'perl',
+                         d => '',
+                         style => $libstyle, },
+        vendorlib   => { s => $vprefix,
+                         t => 'vendor',
+                         d => '',
+                         style => $libstyle, },
+        sitelib     => { s => $sprefix,
+                         t => 'site',
+                         d => 'site_perl',
+                         style => $libstyle, },
+        
+        archlib     => { s => $iprefix,
+                         t => 'perl',
+                         d => "$version/$arch",
+                         style => $libstyle },
+        vendorarch  => { s => $vprefix,
+                         t => 'vendor',
+                         d => "$version/$arch",
+                         style => $libstyle },
+        sitearch    => { s => $sprefix,
+                         t => 'site',
+                         d => "site_perl/$version/$arch",
+                         style => $libstyle },
+    );
+
+
+    # Special case for LIB.
+    if( $self->{LIB} ) {
+        foreach my $var (keys %lib_layouts) {
+            my $Installvar = uc "install$var";
+
+            if( $var =~ /arch/ ) {
+                $self->{$Installvar} ||= 
+                  $self->catdir($self->{LIB}, $Config{archname});
+            }
+            else {
+                $self->{$Installvar} ||= $self->{LIB};
+            }
+        }
+    }
+
+    my %type2prefix = ( perl    => 'PERLPREFIX',
+                        site    => 'SITEPREFIX',
+                        vendor  => 'VENDORPREFIX'
+                      );
+
+    my %layouts = (%bin_layouts, %man_layouts, %lib_layouts);
+    while( my($var, $layout) = each(%layouts) ) {
+        my($s, $t, $d, $style) = @{$layout}{qw(s t d style)};
+        my $r = '$('.$type2prefix{$t}.')';
+
+        print STDERR "Prefixing $var\n" if $Verbose >= 2;
+
+        my $installvar = "install$var";
+        my $Installvar = uc $installvar;
+        next if $self->{$Installvar};
+
+        $d = "$style/$d" if $style;
+        $self->prefixify($installvar, $s, $r, $d);
+
+        print STDERR "  $Installvar == $self->{$Installvar}\n" 
+          if $Verbose >= 2;
+    }
+
+    # Generate these if they weren't figured out.
+    $self->{VENDORARCHEXP} ||= $self->{INSTALLVENDORARCH};
+    $self->{VENDORLIBEXP}  ||= $self->{INSTALLVENDORLIB};
+
+    return 1;
+}
+
+
+=head3 init_from_INSTALLBASE
+
+    $mm->init_from_INSTALLBASE
+
+=cut
+
+my %map = (
+           lib      => [qw(lib perl5)],
+           arch     => [('lib', 'perl5', $Config{archname})],
+           bin      => [qw(bin)],
+           man1dir  => [qw(man man1)],
+           man3dir  => [qw(man man3)]
+          );
+$map{script} = $map{bin};
+
+sub init_INSTALL_from_INSTALLBASE {
+    my $self = shift;
+
+    @{$self}{qw(PREFIX VENDORPREFIX SITEPREFIX PERLPREFIX)} = 
+                                                         '$(INSTALLBASE)';
+
+    my %install;
+    foreach my $thing (keys %map) {
+        foreach my $dir (('', 'SITE', 'VENDOR')) {
+            my $uc_thing = uc $thing;
+            my $key = "INSTALL".$dir.$uc_thing;
+
+            $install{$key} ||= 
+              $self->catdir('$(INSTALLBASE)', @{$map{$thing}});
+        }
+    }
+
+    # Adjust for variable quirks.
+    $install{INSTALLARCHLIB} ||= delete $install{INSTALLARCH};
+    $install{INSTALLPRIVLIB} ||= delete $install{INSTALLLIB};
+    delete @install{qw(INSTALLVENDORSCRIPT INSTALLSITESCRIPT)};
+
+    foreach my $key (keys %install) {
+        $self->{$key} ||= $install{$key};
+    }
+
+    return 1;
+}
+
+
+=head3 init_VERSION  I<Abstract>
+
+    $mm->init_VERSION
+
+Initialize macros representing versions of MakeMaker and other tools
+
+MAKEMAKER: path to the MakeMaker module.
+
+MM_VERSION: ExtUtils::MakeMaker Version
+
+MM_REVISION: ExtUtils::MakeMaker version control revision (for backwards 
+             compat)
+
+VERSION: version of your module
+
+VERSION_MACRO: which macro represents the version (usually 'VERSION')
+
+VERSION_SYM: like version but safe for use as an RCS revision number
+
+DEFINE_VERSION: -D line to set the module version when compiling
+
+XS_VERSION: version in your .xs file.  Defaults to $(VERSION)
+
+XS_VERSION_MACRO: which macro represents the XS version.
+
+XS_DEFINE_VERSION: -D line to set the xs version when compiling.
+
+Called by init_main.
+
+=cut
+
+sub init_VERSION {
+    my($self) = shift;
+
+    $self->{MAKEMAKER}  = $ExtUtils::MakeMaker::Filename;
+    $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION;
+    $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision;
+    $self->{VERSION_FROM} ||= '';
+
+    if ($self->{VERSION_FROM}){
+        $self->{VERSION} = $self->parse_version($self->{VERSION_FROM});
+        if( $self->{VERSION} eq 'undef' ) {
+            require Carp;
+            Carp::carp("WARNING: Setting VERSION via file ".
+                       "'$self->{VERSION_FROM}' failed\n");
+        }
+    }
+
+    # strip blanks
+    if (defined $self->{VERSION}) {
+        $self->{VERSION} =~ s/^\s+//;
+        $self->{VERSION} =~ s/\s+$//;
+    }
+    else {
+        $self->{VERSION} = '';
+    }
+
+
+    $self->{VERSION_MACRO}  = 'VERSION';
+    ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
+    $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"';
+
+
+    # Graham Barr and Paul Marquess had some ideas how to ensure
+    # version compatibility between the *.pm file and the
+    # corresponding *.xs file. The bottomline was, that we need an
+    # XS_VERSION macro that defaults to VERSION:
+    $self->{XS_VERSION} ||= $self->{VERSION};
+
+    $self->{XS_VERSION_MACRO}  = 'XS_VERSION';
+    $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"';
+
+}
+
+
+=head3 init_others  I<Abstract>
+
+    $MM->init_others();
+
+Initializes the macro definitions used by tools_other() and places them
+in the $MM object.
+
+If there is no description, its the same as the parameter to
+WriteMakefile() documented in ExtUtils::MakeMaker.
+
+Defines at least these macros.
+
+  Macro             Description
+
+  NOOP              Do nothing
+  NOECHO            Tell make not to display the command itself
+
+  MAKEFILE
+  FIRST_MAKEFILE
+  MAKEFILE_OLD
+  MAKE_APERL_FILE   File used by MAKE_APERL
+
+  SHELL             Program used to run
+                    shell commands
+
+  ECHO              Print text adding a newline on the end
+  RM_F              Remove a file 
+  RM_RF             Remove a directory          
+  TOUCH             Update a file's timestamp   
+  TEST_F            Test for a file's existence 
+  CP                Copy a file                 
+  MV                Move a file                 
+  CHMOD             Change permissions on a     
+                    file
+
+  UMASK_NULL        Nullify umask
+  DEV_NULL          Supress all command output
+
+
+=head3 init_DIRFILESEP  I<Abstract>
+
+  $MM->init_DIRFILESEP;
+  my $dirfilesep = $MM->{DIRFILESEP};
+
+Initializes the DIRFILESEP macro which is the seperator between the
+directory and filename in a filepath.  ie. / on Unix, \ on Win32 and
+nothing on VMS.
+
+For example:
+
+    # instead of $(INST_ARCHAUTODIR)/extralibs.ld
+    $(INST_ARCHAUTODIR)$(DIRFILESEP)extralibs.ld
+
+Something of a hack but it prevents a lot of code duplication between
+MM_* variants.
+
+Do not use this as a seperator between directories.  Some operating
+systems use different seperators between subdirectories as between
+directories and filenames (for example:  VOLUME:[dir1.dir2]file on VMS).
+
+=head3 init_linker  I<Abstract>
+
+    $mm->init_linker;
+
+Initialize macros which have to do with linking.
+
+PERL_ARCHIVE: path to libperl.a equivalent to be linked to dynamic
+extensions.
+
+PERL_ARCHIVE_AFTER: path to a library which should be put on the
+linker command line I<after> the external libraries to be linked to
+dynamic extensions.  This may be needed if the linker is one-pass, and
+Perl includes some overrides for C RTL functions, such as malloc().
+
+EXPORT_LIST: name of a file that is passed to linker to define symbols
+to be exported.
+
+Some OSes do not need these in which case leave it blank.
+
+
+=head3 init_platform
+
+    $mm->init_platform
+
+Initialize any macros which are for platform specific use only.
+
+A typical one is the version number of your OS specific mocule.
+(ie. MM_Unix_VERSION or MM_VMS_VERSION).
+
+=cut
+
+sub init_platform {
+    return '';
+}
+
+
+
+
+
+=head2 Tools
+
+A grab bag of methods to generate specific macros and commands.
+
+
+
+=head3 manifypods
+
+Defines targets and routines to translate the pods into manpages and
+put them into the INST_* directories.
+
+=cut
+
+sub manifypods {
+    my $self          = shift;
+
+    my $POD2MAN_macro = $self->POD2MAN_macro();
+    my $manifypods_target = $self->manifypods_target();
+
+    return <<END_OF_TARGET;
+
+$POD2MAN_macro
+
+$manifypods_target
+
+END_OF_TARGET
+
+}
+
+
+=head3 POD2MAN_macro
+
+  my $pod2man_macro = $self->POD2MAN_macro
+
+Returns a definition for the POD2MAN macro.  This is a program
+which emulates the pod2man utility.  You can add more switches to the
+command by simply appending them on the macro.
+
+Typical usage:
+
+    $(POD2MAN) --section=3 --perm_rw=$(PERM_RW) podfile1 man_page1 ...
+
+=cut
+
+sub POD2MAN_macro {
+    my $self = shift;
+
+# Need the trailing '--' so perl stops gobbling arguments and - happens
+# to be an alternative end of line seperator on VMS so we quote it
+    return <<'END_OF_DEF';
+POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
+POD2MAN = $(POD2MAN_EXE)
+END_OF_DEF
+}
+
+
+=head3 test_via_harness
+
+  my $command = $mm->test_via_harness($perl, $tests);
+
+Returns a $command line which runs the given set of $tests with
+Test::Harness and the given $perl.
+
+Used on the t/*.t files.
+
+=cut
+
+sub test_via_harness {
+    my($self, $perl, $tests) = @_;
+
+    return qq{\t$perl "-MExtUtils::Command::MM" }.
+           qq{"-e" "test_harness(\$(TEST_VERBOSE), '\$(INST_LIB)', '\$(INST_ARCHLIB)')" $tests\n};
+}
+
+=head3 test_via_script
+
+  my $command = $mm->test_via_script($perl, $script);
+
+Returns a $command line which just runs a single test without
+Test::Harness.  No checks are done on the results, they're just
+printed.
+
+Used for test.pl, since they don't always follow Test::Harness
+formatting.
+
+=cut
+
+sub test_via_script {
+    my($self, $perl, $script) = @_;
+    return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n};
+}
+
+
+=head3 tool_autosplit
+
+Defines a simple perl call that runs autosplit. May be deprecated by
+pm_to_blib soon.
+
+=cut
+
+sub tool_autosplit {
+    my($self, %attribs) = @_;
+
+    my $maxlen = $attribs{MAXLEN} ? '$$AutoSplit::Maxlen=$attribs{MAXLEN};' 
+                                  : '';
+
+    my $asplit = $self->oneliner(sprintf <<'PERL_CODE', $maxlen);
+use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)
+PERL_CODE
+
+    return sprintf <<'MAKE_FRAG', $asplit;
+# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
+AUTOSPLITFILE = %s
+
+MAKE_FRAG
+
+}
+
+
+
+
+=head2 File::Spec wrappers
+
+ExtUtils::MM_Any is a subclass of File::Spec.  The methods noted here
+override File::Spec.
+
+
+
+=head3 catfile
+
+File::Spec <= 0.83 has a bug where the file part of catfile is not
+canonicalized.  This override fixes that bug.
+
+=cut
+
+sub catfile {
+    my $self = shift;
+    return $self->canonpath($self->SUPER::catfile(@_));
+}
+
+
+
+=head2 Misc
+
+Methods I can't really figure out where they should go yet.
+
+
+=head3 find_tests
+
+  my $test = $mm->find_tests;
+
+Returns a string suitable for feeding to the shell to return all
+tests in t/*.t.
+
+=cut
+
+sub find_tests {
+    my($self) = shift;
+    return -d 't' ? 't/*.t' : '';
+}
+
+
+=head3 extra_clean_files
+
+    my @files_to_clean = $MM->extra_clean_files;
+
+Returns a list of OS specific files to be removed in the clean target in
+addition to the usual set.
+
+=cut
+
+# An empty method here tickled a perl 5.8.1 bug and would return its object.
+sub extra_clean_files { 
+    return;
+}
+
+
+=head3 installvars
+
+    my @installvars = $mm->installvars;
+
+A list of all the INSTALL* variables without the INSTALL prefix.  Useful
+for iteration or building related variable sets.
+
+=cut
+
+sub installvars {
+    return qw(PRIVLIB SITELIB  VENDORLIB
+              ARCHLIB SITEARCH VENDORARCH
+              BIN     SITEBIN  VENDORBIN
+              SCRIPT
+              MAN1DIR SITEMAN1DIR VENDORMAN1DIR
+              MAN3DIR SITEMAN3DIR VENDORMAN3DIR
+             );
+}
+
+
+=head3 libscan
+
+  my $wanted = $self->libscan($path);
+
+Takes a path to a file or dir and returns an empty string if we don't
+want to include this file in the library.  Otherwise it returns the
+the $path unchanged.
+
+Mainly used to exclude version control administrative directories from
+installation.
+
+=cut
+
+sub libscan {
+    my($self,$path) = @_;
+    my($dirs,$file) = ($self->splitpath($path))[1,2];
+    return '' if grep /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/, 
+                     $self->splitdir($dirs), $file;
+
+    return $path;
+}
+
+
+=head3 platform_constants
+
+    my $make_frag = $mm->platform_constants
+
+Returns a make fragment defining all the macros initialized in
+init_platform() rather than put them in constants().
+
+=cut
+
+sub platform_constants {
+    return '';
+}
+
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> and the denizens of
+makemaker@perl.org with code from ExtUtils::MM_Unix and
+ExtUtils::MM_Win32.
+
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_BeOS.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_BeOS.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_BeOS.pm	(revision 14489)
@@ -0,0 +1,60 @@
+package ExtUtils::MM_BeOS;
+
+=head1 NAME
+
+ExtUtils::MM_BeOS - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_BeOS;	# Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=over 4
+
+=cut 
+
+use ExtUtils::MakeMaker::Config;
+use File::Spec;
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+
+use vars qw(@ISA $VERSION);
+@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+$VERSION = '1.05';
+
+
+=item os_flavor
+
+BeOS is BeOS.
+
+=cut
+
+sub os_flavor {
+    return('BeOS');
+}
+
+=item init_linker
+
+libperl.a equivalent to be linked to dynamic extensions.
+
+=cut
+
+sub init_linker {
+    my($self) = shift;
+
+    $self->{PERL_ARCHIVE} ||= 
+      File::Spec->catdir('$(PERL_INC)',$Config{libperl});
+    $self->{PERL_ARCHIVE_AFTER} ||= '';
+    $self->{EXPORT_LIST}  ||= '';
+}
+
+=back
+
+1;
+__END__
+
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Cygwin.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Cygwin.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Cygwin.pm	(revision 14489)
@@ -0,0 +1,106 @@
+package ExtUtils::MM_Cygwin;
+
+use strict;
+use vars qw($VERSION @ISA);
+
+use ExtUtils::MakeMaker::Config;
+use File::Spec;
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+
+$VERSION = '1.08';
+
+
+=head1 NAME
+
+ExtUtils::MM_Cygwin - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_Cygwin; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided there.
+
+=over 4
+
+=item os_flavor
+
+We're Unix and Cygwin.
+
+=cut
+
+sub os_flavor {
+    return('Unix', 'Cygwin');
+}
+
+=item cflags
+
+if configured for dynamic loading, triggers #define EXT in EXTERN.h
+
+=cut
+
+sub cflags {
+    my($self,$libperl)=@_;
+    return $self->{CFLAGS} if $self->{CFLAGS};
+    return '' unless $self->needs_linking();
+
+    my $base = $self->SUPER::cflags($libperl);
+    foreach (split /\n/, $base) {
+        /^(\S*)\s*=\s*(\S*)$/ and $self->{$1} = $2;
+    };
+    $self->{CCFLAGS} .= " -DUSEIMPORTLIB" if ($Config{useshrplib} eq 'true');
+
+    return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+};
+
+}
+
+
+=item replace_manpage_separator
+
+replaces strings '::' with '.' in MAN*POD man page names
+
+=cut
+
+sub replace_manpage_separator {
+    my($self, $man) = @_;
+    $man =~ s{/+}{.}g;
+    return $man;
+}
+
+=item init_linker
+
+points to libperl.a
+
+=cut
+
+sub init_linker {
+    my $self = shift;
+
+    if ($Config{useshrplib} eq 'true') {
+        my $libperl = '$(PERL_INC)' .'/'. "$Config{libperl}";
+        if( $] >= 5.006002 ) {
+            $libperl =~ s/a$/dll.a/;
+        }
+        $self->{PERL_ARCHIVE} = $libperl;
+    } else {
+        $self->{PERL_ARCHIVE} = 
+          '$(PERL_INC)' .'/'. ("$Config{libperl}" or "libperl.a");
+    }
+
+    $self->{PERL_ARCHIVE_AFTER} ||= '';
+    $self->{EXPORT_LIST}  ||= '';
+}
+
+=back
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_DOS.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_DOS.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_DOS.pm	(revision 14489)
@@ -0,0 +1,66 @@
+package ExtUtils::MM_DOS;
+
+use strict;
+use vars qw($VERSION @ISA);
+
+$VERSION = 0.02;
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+
+
+=head1 NAME
+
+ExtUtils::MM_DOS - DOS specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+  Don't use this module directly.
+  Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality
+for DOS.
+
+Unless otherwise stated, it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=over 4
+
+=item os_flavor
+
+=cut
+
+sub os_flavor {
+    return('DOS');
+}
+
+=item B<replace_manpage_separator>
+
+Generates Foo__Bar.3 style man page names
+
+=cut
+
+sub replace_manpage_separator {
+    my($self, $man) = @_;
+
+    $man =~ s,/+,__,g;
+    return $man;
+}
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MM_Unix>, L<ExtUtils::MakeMaker>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_MacOS.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_MacOS.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_MacOS.pm	(revision 14489)
@@ -0,0 +1,38 @@
+package ExtUtils::MM_MacOS;
+
+$VERSION = 1.08;
+
+sub new {
+    die <<'UNSUPPORTED';
+MacOS Classic (MacPerl) is no longer supported by MakeMaker.
+Please use Module::Build instead.
+UNSUPPORTED
+}
+
+=head1 NAME
+
+ExtUtils::MM_MacOS - once produced Makefiles for MacOS Classic
+
+=head1 SYNOPSIS
+
+  # MM_MacOS no longer contains any code.  This is just a stub.
+
+=head1 DESCRIPTION
+
+Once upon a time, MakeMaker could produce an approximation of a correct
+Makefile on MacOS Classic (MacPerl).  Due to a lack of maintainers, this
+fell out of sync with the rest of MakeMaker and hadn't worked in years.
+Since there's little chance of it being repaired, MacOS Classic is fading
+away, and the code was icky to begin with, the code has been deleted to
+make maintenance easier.
+
+Those interested in writing modules for MacPerl should use Module::Build
+which works better than MakeMaker ever did.
+
+Anyone interested in resurrecting this file should pull the old version
+from the MakeMaker CVS repository and contact makemaker@perl.org, but we
+really encourage you to work on Module::Build instead.
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_NW5.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_NW5.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_NW5.pm	(revision 14489)
@@ -0,0 +1,271 @@
+package ExtUtils::MM_NW5;
+
+=head1 NAME
+
+ExtUtils::MM_NW5 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_NW5; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=over
+
+=cut 
+
+use strict;
+use ExtUtils::MakeMaker::Config;
+use File::Basename;
+
+use vars qw(@ISA $VERSION);
+$VERSION = '2.08';
+
+require ExtUtils::MM_Win32;
+@ISA = qw(ExtUtils::MM_Win32);
+
+use ExtUtils::MakeMaker qw( &neatvalue );
+
+$ENV{EMXSHELL} = 'sh'; # to run `commands`
+
+my $BORLAND  = $Config{'cc'} =~ /^bcc/i;
+my $GCC      = $Config{'cc'} =~ /^gcc/i;
+my $DMAKE    = $Config{'make'} =~ /^dmake/i;
+
+
+=item os_flavor
+
+We're Netware in addition to being Windows.
+
+=cut
+
+sub os_flavor {
+    my $self = shift;
+    return ($self->SUPER::os_flavor, 'Netware');
+}
+
+=item init_platform
+
+Add Netware macros.
+
+LIBPTH, BASE_IMPORT, NLM_VERSION, MPKTOOL, TOOLPATH, BOOT_SYMBOL,
+NLM_SHORT_NAME, INCLUDE, PATH, MM_NW5_REVISION
+
+
+=item platform_constants
+
+Add Netware macros initialized above to the Makefile.
+
+=cut
+
+sub init_platform {
+    my($self) = shift;
+
+    # To get Win32's setup.
+    $self->SUPER::init_platform;
+
+    # incpath is copied to makefile var INCLUDE in constants sub, here just 
+    # make it empty
+    my $libpth = $Config{'libpth'};
+    $libpth =~ s( )(;);
+    $self->{'LIBPTH'} = $libpth;
+
+    $self->{'BASE_IMPORT'} = $Config{'base_import'};
+
+    # Additional import file specified from Makefile.pl
+    if($self->{'base_import'}) {
+        $self->{'BASE_IMPORT'} .= ', ' . $self->{'base_import'};
+    }
+ 
+    $self->{'NLM_VERSION'} = $Config{'nlm_version'};
+    $self->{'MPKTOOL'}	= $Config{'mpktool'};
+    $self->{'TOOLPATH'}	= $Config{'toolpath'};
+
+    (my $boot = $self->{'NAME'}) =~ s/:/_/g;
+    $self->{'BOOT_SYMBOL'}=$boot;
+
+    # If the final binary name is greater than 8 chars,
+    # truncate it here.
+    if(length($self->{'BASEEXT'}) > 8) {
+        $self->{'NLM_SHORT_NAME'} = substr($self->{'BASEEXT'},0,8);
+    }
+
+    # Get the include path and replace the spaces with ;
+    # Copy this to makefile as INCLUDE = d:\...;d:\;
+    ($self->{INCLUDE} = $Config{'incpath'}) =~ s/([ ]*)-I/;/g;
+
+    # Set the path to CodeWarrior binaries which might not have been set in
+    # any other place
+    $self->{PATH} = '$(PATH);$(TOOLPATH)';
+
+    $self->{MM_NW5_VERSION} = $VERSION;
+}
+
+sub platform_constants {
+    my($self) = shift;
+    my $make_frag = '';
+
+    # Setup Win32's constants.
+    $make_frag .= $self->SUPER::platform_constants;
+
+    foreach my $macro (qw(LIBPTH BASE_IMPORT NLM_VERSION MPKTOOL 
+                          TOOLPATH BOOT_SYMBOL NLM_SHORT_NAME INCLUDE PATH
+                          MM_NW5_VERSION
+                      ))
+    {
+        next unless defined $self->{$macro};
+        $make_frag .= "$macro = $self->{$macro}\n";
+    }
+
+    return $make_frag;
+}
+
+
+=item const_cccmd
+
+=cut
+
+sub const_cccmd {
+    my($self,$libperl)=@_;
+    return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
+    return '' unless $self->needs_linking();
+    return $self->{CONST_CCCMD} = <<'MAKE_FRAG';
+CCCMD = $(CC) $(CCFLAGS) $(INC) $(OPTIMIZE) \
+	$(PERLTYPE) $(MPOLLUTE) -o $@ \
+	-DVERSION=\"$(VERSION)\" -DXS_VERSION=\"$(XS_VERSION)\"
+MAKE_FRAG
+
+}
+
+
+=item static_lib
+
+=cut
+
+sub static_lib {
+    my($self) = @_;
+
+    return '' unless $self->has_link_code;
+
+    my $m = <<'END';
+$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists
+	$(RM_RF) $@
+END
+
+    # If this extension has it's own library (eg SDBM_File)
+    # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
+    $m .= <<'END'  if $self->{MYEXTLIB};
+	$self->{CP} $(MYEXTLIB) $@
+END
+
+    my $ar_arg;
+    if( $BORLAND ) {
+        $ar_arg = '$@ $(OBJECT:^"+")';
+    }
+    elsif( $GCC ) {
+        $ar_arg = '-ru $@ $(OBJECT)';
+    }
+    else {
+        $ar_arg = '-type library -o $@ $(OBJECT)';
+    }
+
+    $m .= sprintf <<'END', $ar_arg;
+	$(AR) %s
+	$(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
+	$(CHMOD) 755 $@
+END
+
+    $m .= <<'END' if $self->{PERL_SRC};
+	$(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs
+
+
+END
+    return $m;
+}
+
+=item dynamic_lib
+
+Defines how to produce the *.so (or equivalent) files.
+
+=cut
+
+sub dynamic_lib {
+    my($self, %attribs) = @_;
+    return '' unless $self->needs_linking(); #might be because of a subdir
+
+    return '' unless $self->has_link_code;
+
+    my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
+    my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
+    my($ldfrom) = '$(LDFROM)';
+
+    (my $boot = $self->{NAME}) =~ s/:/_/g;
+
+    my $m = <<'MAKE_FRAG';
+# This section creates the dynamically loadable $(INST_DYNAMIC)
+# from $(OBJECT) and possibly $(MYEXTLIB).
+OTHERLDFLAGS = '.$otherldflags.'
+INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
+
+# Create xdc data for an MT safe NLM in case of mpk build
+$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists
+	$(NOECHO) $(ECHO) Export boot_$(BOOT_SYMBOL) > $(BASEEXT).def
+	$(NOECHO) $(ECHO) $(BASE_IMPORT) >> $(BASEEXT).def
+	$(NOECHO) $(ECHO) Import @$(PERL_INC)\perl.imp >> $(BASEEXT).def
+MAKE_FRAG
+
+
+    if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) {
+        $m .= <<'MAKE_FRAG';
+	$(MPKTOOL) $(XDCFLAGS) $(BASEEXT).xdc
+	$(NOECHO) $(ECHO) xdcdata $(BASEEXT).xdc >> $(BASEEXT).def
+MAKE_FRAG
+    }
+
+    # Reconstruct the X.Y.Z version.
+    my $version = join '.', map { sprintf "%d", $_ }
+                              $] =~ /(\d)\.(\d{3})(\d{2})/;
+    $m .= sprintf '	$(LD) $(LDFLAGS) $(OBJECT:.obj=.obj) -desc "Perl %s Extension ($(BASEEXT))  XS_VERSION: $(XS_VERSION)" -nlmversion $(NLM_VERSION)', $version;
+
+    # Taking care of long names like FileHandle, ByteLoader, SDBM_File etc
+    if($self->{NLM_SHORT_NAME}) {
+        # In case of nlms with names exceeding 8 chars, build nlm in the 
+        # current dir, rename and move to auto\lib.
+        $m .= q{ -o $(NLM_SHORT_NAME).$(DLEXT)}
+    } else {
+        $m .= q{ -o $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT)}
+    }
+
+    # Add additional lib files if any (SDBM_File)
+    $m .= q{ $(MYEXTLIB) } if $self->{MYEXTLIB};
+
+    $m .= q{ $(PERL_INC)\Main.lib -commandfile $(BASEEXT).def}."\n";
+
+    if($self->{NLM_SHORT_NAME}) {
+        $m .= <<'MAKE_FRAG';
+	if exist $(INST_AUTODIR)\$(NLM_SHORT_NAME).$(DLEXT) del $(INST_AUTODIR)\$(NLM_SHORT_NAME).$(DLEXT) 
+	move $(NLM_SHORT_NAME).$(DLEXT) $(INST_AUTODIR)
+MAKE_FRAG
+    }
+
+    $m .= <<'MAKE_FRAG';
+
+	$(CHMOD) 755 $@
+MAKE_FRAG
+
+    return $m;
+}
+
+
+1;
+__END__
+
+=back
+
+=cut 
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_OS2.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_OS2.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_OS2.pm	(revision 14489)
@@ -0,0 +1,153 @@
+package ExtUtils::MM_OS2;
+
+use strict;
+use vars qw($VERSION @ISA);
+
+use ExtUtils::MakeMaker qw(neatvalue);
+use File::Spec;
+
+$VERSION = '1.05';
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+@ISA = qw(ExtUtils::MM_Any ExtUtils::MM_Unix);
+
+=pod
+
+=head1 NAME
+
+ExtUtils::MM_OS2 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_OS2; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=head1 METHODS
+
+=over 4
+
+=item init_dist
+
+Define TO_UNIX to convert OS2 linefeeds to Unix style.
+
+=cut
+
+sub init_dist {
+    my($self) = @_;
+
+    $self->{TO_UNIX} ||= <<'MAKE_TEXT';
+$(NOECHO) $(TEST_F) tmp.zip && $(RM_F) tmp.zip; $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM_F) tmp.zip
+MAKE_TEXT
+
+    $self->SUPER::init_dist;
+}
+
+sub dlsyms {
+    my($self,%attribs) = @_;
+
+    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
+    my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];
+    my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
+    my($imports)  = $attribs{IMPORTS} || $self->{IMPORTS} || {};
+    my(@m);
+    (my $boot = $self->{NAME}) =~ s/:/_/g;
+
+    if (not $self->{SKIPHASH}{'dynamic'}) {
+	push(@m,"
+$self->{BASEEXT}.def: Makefile.PL
+",
+     '	$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
+     Mksymlists("NAME" => "$(NAME)", "DLBASE" => "$(DLBASE)", ',
+     '"VERSION" => "$(VERSION)", "DISTNAME" => "$(DISTNAME)", ',
+     '"INSTALLDIRS" => "$(INSTALLDIRS)", ',
+     '"DL_FUNCS" => ',neatvalue($funcs),
+     ', "FUNCLIST" => ',neatvalue($funclist),
+     ', "IMPORTS" => ',neatvalue($imports),
+     ', "DL_VARS" => ', neatvalue($vars), ');\'
+');
+    }
+    if ($self->{IMPORTS} && %{$self->{IMPORTS}}) {
+	# Make import files (needed for static build)
+	-d 'tmp_imp' or mkdir 'tmp_imp', 0777 or die "Can't mkdir tmp_imp";
+	open IMP, '>tmpimp.imp' or die "Can't open tmpimp.imp";
+	my ($name, $exp);
+	while (($name, $exp)= each %{$self->{IMPORTS}}) {
+	    my ($lib, $id) = ($exp =~ /(.*)\.(.*)/) or die "Malformed IMPORT `$exp'";
+	    print IMP "$name $lib $id ?\n";
+	}
+	close IMP or die "Can't close tmpimp.imp";
+	# print "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp\n";
+	system "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp" 
+	    and die "Cannot make import library: $!, \$?=$?";
+	unlink <tmp_imp/*>;
+	system "cd tmp_imp; $Config::Config{ar} x ../tmpimp$Config::Config{lib_ext}" 
+	    and die "Cannot extract import objects: $!, \$?=$?";      
+    }
+    join('',@m);
+}
+
+sub static_lib {
+    my($self) = @_;
+    my $old = $self->ExtUtils::MM_Unix::static_lib();
+    return $old unless $self->{IMPORTS} && %{$self->{IMPORTS}};
+    
+    my @chunks = split /\n{2,}/, $old;
+    shift @chunks unless length $chunks[0]; # Empty lines at the start
+    $chunks[0] .= <<'EOC';
+
+	$(AR) $(AR_STATIC_ARGS) $@ tmp_imp/* && $(RANLIB) $@
+EOC
+    return join "\n\n". '', @chunks;
+}
+
+sub replace_manpage_separator {
+    my($self,$man) = @_;
+    $man =~ s,/+,.,g;
+    $man;
+}
+
+sub maybe_command {
+    my($self,$file) = @_;
+    $file =~ s,[/\\]+,/,g;
+    return $file if -x $file && ! -d _;
+    return "$file.exe" if -x "$file.exe" && ! -d _;
+    return "$file.cmd" if -x "$file.cmd" && ! -d _;
+    return;
+}
+
+=item init_linker
+
+=cut
+
+sub init_linker {
+    my $self = shift;
+
+    $self->{PERL_ARCHIVE} = "\$(PERL_INC)/libperl\$(LIB_EXT)";
+
+    $self->{PERL_ARCHIVE_AFTER} = $OS2::is_aout
+      ? ''
+      : '$(PERL_INC)/libperl_override$(LIB_EXT)';
+    $self->{EXPORT_LIST} = '$(BASEEXT).def';
+}
+
+=item os_flavor
+
+OS/2 is OS/2
+
+=cut
+
+sub os_flavor {
+    return('OS/2');
+}
+
+=back
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_QNX.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_QNX.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_QNX.pm	(revision 14489)
@@ -0,0 +1,58 @@
+package ExtUtils::MM_QNX;
+
+use strict;
+use vars qw($VERSION @ISA);
+$VERSION = '0.02';
+
+require ExtUtils::MM_Unix;
+@ISA = qw(ExtUtils::MM_Unix);
+
+
+=head1 NAME
+
+ExtUtils::MM_QNX - QNX specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+  Don't use this module directly.
+  Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+QNX.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=head3 extra_clean_files
+
+Add .err files corresponding to each .c file.
+
+=cut
+
+sub extra_clean_files {
+    my $self = shift;
+
+    my @errfiles = @{$self->{C}};
+    for ( @errfiles ) {
+	s/.c$/.err/;
+    }
+
+    return( @errfiles, 'perlmain.err' );
+}
+
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_UWIN.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_UWIN.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_UWIN.pm	(revision 14489)
@@ -0,0 +1,65 @@
+package ExtUtils::MM_UWIN;
+
+use strict;
+use vars qw($VERSION @ISA);
+$VERSION = 0.02;
+
+require ExtUtils::MM_Unix;
+@ISA = qw(ExtUtils::MM_Unix);
+
+
+=head1 NAME
+
+ExtUtils::MM_UWIN - U/WIN specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+  Don't use this module directly.
+  Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+the AT&T U/WIN UNIX on Windows environment.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=over 4
+
+=item os_flavor
+
+In addition to being Unix, we're U/WIN.
+
+=cut
+
+sub os_flavor {
+    return('Unix', 'U/WIN');
+}
+
+
+=item B<replace_manpage_separator>
+
+=cut
+
+sub replace_manpage_separator {
+    my($self, $man) = @_;
+
+    $man =~ s,/+,.,g;
+    return $man;
+}
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MM_Win32>, L<ExtUtils::MakeMaker>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Unix.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Unix.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Unix.pm	(revision 14489)
@@ -0,0 +1,3674 @@
+package ExtUtils::MM_Unix;
+
+require 5.005_03;  # Maybe further back, dunno
+
+use strict;
+
+use Exporter ();
+use Carp;
+use ExtUtils::MakeMaker::Config;
+use File::Basename qw(basename dirname);
+use DirHandle;
+
+use vars qw($VERSION @ISA
+            $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos
+            $Is_OSF $Is_IRIX  $Is_NetBSD $Is_BSD
+            $Is_SunOS4 $Is_Solaris $Is_SunOS $Is_Interix
+            $Verbose %pm
+            %Config_Override
+           );
+
+use ExtUtils::MakeMaker qw($Verbose neatvalue);
+
+$VERSION = '1.50';
+
+require ExtUtils::MM_Any;
+@ISA = qw(ExtUtils::MM_Any);
+
+BEGIN { 
+    $Is_OS2     = $^O eq 'os2';
+    $Is_Win32   = $^O eq 'MSWin32' || $Config{osname} eq 'NetWare';
+    $Is_Dos     = $^O eq 'dos';
+    $Is_VMS     = $^O eq 'VMS';
+    $Is_OSF     = $^O eq 'dec_osf';
+    $Is_IRIX    = $^O eq 'irix';
+    $Is_NetBSD  = $^O eq 'netbsd';
+    $Is_Interix = $^O eq 'interix';
+    $Is_SunOS4  = $^O eq 'sunos';
+    $Is_Solaris = $^O eq 'solaris';
+    $Is_SunOS   = $Is_SunOS4 || $Is_Solaris;
+    $Is_BSD     = $^O =~ /^(?:free|net|open)bsd$/ or
+                  $^O eq 'bsdos' or $^O eq 'interix';
+}
+
+BEGIN {
+    if( $Is_VMS ) {
+        # For things like vmsify()
+        require VMS::Filespec;
+        VMS::Filespec->import;
+    }
+}
+
+
+=head1 NAME
+
+ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+C<require ExtUtils::MM_Unix;>
+
+=head1 DESCRIPTION
+
+The methods provided by this package are designed to be used in
+conjunction with ExtUtils::MakeMaker. When MakeMaker writes a
+Makefile, it creates one or more objects that inherit their methods
+from a package C<MM>. MM itself doesn't provide any methods, but it
+ISA ExtUtils::MM_Unix class. The inheritance tree of MM lets operating
+specific packages take the responsibility for all the methods provided
+by MM_Unix. We are trying to reduce the number of the necessary
+overrides by defining rather primitive operations within
+ExtUtils::MM_Unix.
+
+If you are going to write a platform specific MM package, please try
+to limit the necessary overrides to primitive methods, and if it is not
+possible to do so, let's work out how to achieve that gain.
+
+If you are overriding any of these methods in your Makefile.PL (in the
+MY class), please report that to the makemaker mailing list. We are
+trying to minimize the necessary method overrides and switch to data
+driven Makefile.PLs wherever possible. In the long run less methods
+will be overridable via the MY class.
+
+=head1 METHODS
+
+The following description of methods is still under
+development. Please refer to the code for not suitably documented
+sections and complain loudly to the makemaker@perl.org mailing list.
+Better yet, provide a patch.
+
+Not all of the methods below are overridable in a
+Makefile.PL. Overridable methods are marked as (o). All methods are
+overridable by a platform specific MM_*.pm file.
+
+Cross-platform methods are being moved into MM_Any.  If you can't find
+something that used to be in here, look in MM_Any.
+
+=cut
+
+# So we don't have to keep calling the methods over and over again,
+# we have these globals to cache the values.  Faster and shrtr.
+my $Curdir  = __PACKAGE__->curdir;
+my $Rootdir = __PACKAGE__->rootdir;
+my $Updir   = __PACKAGE__->updir;
+
+
+=head2 Methods
+
+=over 4
+
+=item os_flavor
+
+Simply says that we're Unix.
+
+=cut
+
+sub os_flavor {
+    return('Unix');
+}
+
+
+=item c_o (o)
+
+Defines the suffix rules to compile different flavors of C files to
+object files.
+
+=cut
+
+sub c_o {
+# --- Translation Sections ---
+
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    my(@m);
+    if (my $cpp = $Config{cpprun}) {
+        my $cpp_cmd = $self->const_cccmd;
+        $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/;
+        push @m, '
+.c.i:
+	'. $cpp_cmd . ' $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c > $*.i
+';
+    }
+    push @m, '
+.c.s:
+	$(CCCMD) -S $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c
+';
+    push @m, '
+.c$(OBJ_EXT):
+	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c
+';
+    push @m, '
+.C$(OBJ_EXT):
+	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.C
+' if !$Is_OS2 and !$Is_Win32 and !$Is_Dos; #Case-specific
+    push @m, '
+.cpp$(OBJ_EXT):
+	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cpp
+
+.cxx$(OBJ_EXT):
+	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cxx
+
+.cc$(OBJ_EXT):
+	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cc
+';
+    join "", @m;
+}
+
+=item cflags (o)
+
+Does very much the same as the cflags script in the perl
+distribution. It doesn't return the whole compiler command line, but
+initializes all of its parts. The const_cccmd method then actually
+returns the definition of the CCCMD macro which uses these parts.
+
+=cut
+
+#'
+
+sub cflags {
+    my($self,$libperl)=@_;
+    return $self->{CFLAGS} if $self->{CFLAGS};
+    return '' unless $self->needs_linking();
+
+    my($prog, $uc, $perltype, %cflags);
+    $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
+    $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
+
+    @cflags{qw(cc ccflags optimize shellflags)}
+	= @Config{qw(cc ccflags optimize shellflags)};
+    my($optdebug) = "";
+
+    $cflags{shellflags} ||= '';
+
+    my(%map) =  (
+		D =>   '-DDEBUGGING',
+		E =>   '-DEMBED',
+		DE =>  '-DDEBUGGING -DEMBED',
+		M =>   '-DEMBED -DMULTIPLICITY',
+		DM =>  '-DDEBUGGING -DEMBED -DMULTIPLICITY',
+		);
+
+    if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
+	$uc = uc($1);
+    } else {
+	$uc = ""; # avoid warning
+    }
+    $perltype = $map{$uc} ? $map{$uc} : "";
+
+    if ($uc =~ /^D/) {
+	$optdebug = "-g";
+    }
+
+
+    my($name);
+    ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
+    if ($prog = $Config{$name}) {
+	# Expand hints for this extension via the shell
+	print STDOUT "Processing $name hint:\n" if $Verbose;
+	my(@o)=`cc=\"$cflags{cc}\"
+	  ccflags=\"$cflags{ccflags}\"
+	  optimize=\"$cflags{optimize}\"
+	  perltype=\"$cflags{perltype}\"
+	  optdebug=\"$cflags{optdebug}\"
+	  eval '$prog'
+	  echo cc=\$cc
+	  echo ccflags=\$ccflags
+	  echo optimize=\$optimize
+	  echo perltype=\$perltype
+	  echo optdebug=\$optdebug
+	  `;
+	my($line);
+	foreach $line (@o){
+	    chomp $line;
+	    if ($line =~ /(.*?)=\s*(.*)\s*$/){
+		$cflags{$1} = $2;
+		print STDOUT "	$1 = $2\n" if $Verbose;
+	    } else {
+		print STDOUT "Unrecognised result from hint: '$line'\n";
+	    }
+	}
+    }
+
+    if ($optdebug) {
+	$cflags{optimize} = $optdebug;
+    }
+
+    for (qw(ccflags optimize perltype)) {
+        $cflags{$_} ||= '';
+	$cflags{$_} =~ s/^\s+//;
+	$cflags{$_} =~ s/\s+/ /g;
+	$cflags{$_} =~ s/\s+$//;
+	$self->{uc $_} ||= $cflags{$_};
+    }
+
+    if ($self->{POLLUTE}) {
+	$self->{CCFLAGS} .= ' -DPERL_POLLUTE ';
+    }
+
+    my $pollute = '';
+    if ($Config{usemymalloc} and not $Config{bincompat5005}
+	and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/
+	and $self->{PERL_MALLOC_OK}) {
+	$pollute = '$(PERL_MALLOC_DEF)';
+    }
+
+    $self->{CCFLAGS}  = quote_paren($self->{CCFLAGS});
+    $self->{OPTIMIZE} = quote_paren($self->{OPTIMIZE});
+
+    return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+MPOLLUTE = $pollute
+};
+
+}
+
+
+=item const_cccmd (o)
+
+Returns the full compiler call for C programs and stores the
+definition in CONST_CCCMD.
+
+=cut
+
+sub const_cccmd {
+    my($self,$libperl)=@_;
+    return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
+    return '' unless $self->needs_linking();
+    return $self->{CONST_CCCMD} =
+	q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\
+	$(CCFLAGS) $(OPTIMIZE) \\
+	$(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
+	$(XS_DEFINE_VERSION)};
+}
+
+=item const_config (o)
+
+Defines a couple of constants in the Makefile that are imported from
+%Config.
+
+=cut
+
+sub const_config {
+# --- Constants Sections ---
+
+    my($self) = shift;
+    my(@m,$m);
+    push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
+    push(@m,"\n# They may have been overridden via Makefile.PL or on the command line\n");
+    my(%once_only);
+    foreach $m (@{$self->{CONFIG}}){
+	# SITE*EXP macros are defined in &constants; avoid duplicates here
+	next if $once_only{$m};
+	$self->{uc $m} = quote_paren($self->{uc $m});
+	push @m, uc($m) , ' = ' , $self->{uc $m}, "\n";
+	$once_only{$m} = 1;
+    }
+    join('', @m);
+}
+
+=item const_loadlibs (o)
+
+Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
+L<ExtUtils::Liblist> for details.
+
+=cut
+
+sub const_loadlibs {
+    my($self) = shift;
+    return "" unless $self->needs_linking;
+    my @m;
+    push @m, qq{
+# $self->{NAME} might depend on some other libraries:
+# See ExtUtils::Liblist for details
+#
+};
+    my($tmp);
+    for $tmp (qw/
+	 EXTRALIBS LDLOADLIBS BSLOADLIBS
+	 /) {
+	next unless defined $self->{$tmp};
+	push @m, "$tmp = $self->{$tmp}\n";
+    }
+    # don't set LD_RUN_PATH if empty
+    for $tmp (qw/
+	 LD_RUN_PATH
+	 /) {
+	next unless $self->{$tmp};
+	push @m, "$tmp = $self->{$tmp}\n";
+    }
+    return join "", @m;
+}
+
+=item constants (o)
+
+  my $make_frag = $mm->constants;
+
+Prints out macros for lots of constants.
+
+=cut
+
+sub constants {
+    my($self) = @_;
+    my @m = ();
+
+    $self->{DFSEP} = '$(DIRFILESEP)';  # alias for internal use
+
+    for my $macro (qw(
+
+              AR_STATIC_ARGS DIRFILESEP DFSEP
+              NAME NAME_SYM 
+              VERSION    VERSION_MACRO    VERSION_SYM DEFINE_VERSION
+              XS_VERSION XS_VERSION_MACRO             XS_DEFINE_VERSION
+              INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB
+              INST_MAN1DIR INST_MAN3DIR
+              MAN1EXT      MAN3EXT
+              INSTALLDIRS INSTALLBASE DESTDIR PREFIX
+              PERLPREFIX      SITEPREFIX      VENDORPREFIX
+                   ),
+                   (map { ("INSTALL".$_,
+                          "DESTINSTALL".$_)
+                        } $self->installvars),
+                   qw(
+              PERL_LIB    
+              PERL_ARCHLIB
+              LIBPERL_A MYEXTLIB
+              FIRST_MAKEFILE MAKEFILE_OLD MAKE_APERL_FILE 
+              PERLMAINCC PERL_SRC PERL_INC 
+              PERL            FULLPERL          ABSPERL
+              PERLRUN         FULLPERLRUN       ABSPERLRUN
+              PERLRUNINST     FULLPERLRUNINST   ABSPERLRUNINST
+              PERL_CORE
+              PERM_RW PERM_RWX
+
+	      ) ) 
+    {
+	next unless defined $self->{$macro};
+
+        # pathnames can have sharp signs in them; escape them so
+        # make doesn't think it is a comment-start character.
+        $self->{$macro} =~ s/#/\\#/g;
+	push @m, "$macro = $self->{$macro}\n";
+    }
+
+    push @m, qq{
+MAKEMAKER   = $self->{MAKEMAKER}
+MM_VERSION  = $self->{MM_VERSION}
+MM_REVISION = $self->{MM_REVISION}
+};
+
+    push @m, q{
+# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
+# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
+# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
+# DLBASE  = Basename part of dynamic library. May be just equal BASEEXT.
+};
+
+    for my $macro (qw/
+              MAKE
+	      FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
+	      LDFROM LINKTYPE BOOTDEP
+	      /	) 
+    {
+	next unless defined $self->{$macro};
+	push @m, "$macro = $self->{$macro}\n";
+    }
+
+    push @m, "
+# Handy lists of source code files:
+XS_FILES = ".$self->wraplist(sort keys %{$self->{XS}})."
+C_FILES  = ".$self->wraplist(@{$self->{C}})."
+O_FILES  = ".$self->wraplist(@{$self->{O_FILES}})."
+H_FILES  = ".$self->wraplist(@{$self->{H}})."
+MAN1PODS = ".$self->wraplist(sort keys %{$self->{MAN1PODS}})."
+MAN3PODS = ".$self->wraplist(sort keys %{$self->{MAN3PODS}})."
+";
+
+
+    push @m, q{
+# Where is the Config information that we are using/depend on
+CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h
+};
+
+
+    push @m, qq{
+# Where to build things
+INST_LIBDIR      = $self->{INST_LIBDIR}
+INST_ARCHLIBDIR  = $self->{INST_ARCHLIBDIR}
+
+INST_AUTODIR     = $self->{INST_AUTODIR}
+INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
+
+INST_STATIC      = $self->{INST_STATIC}
+INST_DYNAMIC     = $self->{INST_DYNAMIC}
+INST_BOOT        = $self->{INST_BOOT}
+};
+
+
+    push @m, qq{
+# Extra linker info
+EXPORT_LIST        = $self->{EXPORT_LIST}
+PERL_ARCHIVE       = $self->{PERL_ARCHIVE}
+PERL_ARCHIVE_AFTER = $self->{PERL_ARCHIVE_AFTER}
+};
+
+    push @m, "
+
+TO_INST_PM = ".$self->wraplist(sort keys %{$self->{PM}})."
+
+PM_TO_BLIB = ".$self->wraplist(%{$self->{PM}})."
+";
+
+    join('',@m);
+}
+
+
+=item depend (o)
+
+Same as macro for the depend attribute.
+
+=cut
+
+sub depend {
+    my($self,%attribs) = @_;
+    my(@m,$key,$val);
+    while (($key,$val) = each %attribs){
+	last unless defined $key;
+	push @m, "$key : $val\n";
+    }
+    join "", @m;
+}
+
+
+=item init_DEST
+
+  $mm->init_DEST
+
+Defines the DESTDIR and DEST* variables paralleling the INSTALL*.
+
+=cut
+
+sub init_DEST {
+    my $self = shift;
+
+    # Initialize DESTDIR
+    $self->{DESTDIR} ||= '';
+
+    # Make DEST variables.
+    foreach my $var ($self->installvars) {
+        my $destvar = 'DESTINSTALL'.$var;
+        $self->{$destvar} ||= '$(DESTDIR)$(INSTALL'.$var.')';
+    }
+}
+
+
+=item init_dist
+
+  $mm->init_dist;
+
+Defines a lot of macros for distribution support.
+
+  macro         description                     default
+
+  TAR           tar command to use              tar
+  TARFLAGS      flags to pass to TAR            cvf
+
+  ZIP           zip command to use              zip
+  ZIPFLAGS      flags to pass to ZIP            -r
+
+  COMPRESS      compression command to          gzip --best
+                use for tarfiles
+  SUFFIX        suffix to put on                .gz 
+                compressed files
+
+  SHAR          shar command to use             shar
+
+  PREOP         extra commands to run before
+                making the archive 
+  POSTOP        extra commands to run after
+                making the archive
+
+  TO_UNIX       a command to convert linefeeds
+                to Unix style in your archive 
+
+  CI            command to checkin your         ci -u
+                sources to version control
+  RCS_LABEL     command to label your sources   rcs -Nv$(VERSION_SYM): -q
+                just after CI is run
+
+  DIST_CP       $how argument to manicopy()     best
+                when the distdir is created
+
+  DIST_DEFAULT  default target to use to        tardist
+                create a distribution
+
+  DISTVNAME     name of the resulting archive   $(DISTNAME)-$(VERSION)
+                (minus suffixes)
+
+=cut
+
+sub init_dist {
+    my $self = shift;
+
+    $self->{TAR}      ||= 'tar';
+    $self->{TARFLAGS} ||= 'cvf';
+    $self->{ZIP}      ||= 'zip';
+    $self->{ZIPFLAGS} ||= '-r';
+    $self->{COMPRESS} ||= 'gzip --best';
+    $self->{SUFFIX}   ||= '.gz';
+    $self->{SHAR}     ||= 'shar';
+    $self->{PREOP}    ||= '$(NOECHO) $(NOOP)'; # eg update MANIFEST
+    $self->{POSTOP}   ||= '$(NOECHO) $(NOOP)'; # eg remove the distdir
+    $self->{TO_UNIX}  ||= '$(NOECHO) $(NOOP)';
+
+    $self->{CI}       ||= 'ci -u';
+    $self->{RCS_LABEL}||= 'rcs -Nv$(VERSION_SYM): -q';
+    $self->{DIST_CP}  ||= 'best';
+    $self->{DIST_DEFAULT} ||= 'tardist';
+
+    ($self->{DISTNAME} = $self->{NAME}) =~ s{::}{-}g unless $self->{DISTNAME};
+    $self->{DISTVNAME} ||= $self->{DISTNAME}.'-'.$self->{VERSION};
+
+}
+
+=item dist (o)
+
+  my $dist_macros = $mm->dist(%overrides);
+
+Generates a make fragment defining all the macros initialized in
+init_dist.
+
+%overrides can be used to override any of the above.
+
+=cut
+
+sub dist {
+    my($self, %attribs) = @_;
+
+    my $make = '';
+    foreach my $key (qw( 
+            TAR TARFLAGS ZIP ZIPFLAGS COMPRESS SUFFIX SHAR
+            PREOP POSTOP TO_UNIX
+            CI RCS_LABEL DIST_CP DIST_DEFAULT
+            DISTNAME DISTVNAME
+           ))
+    {
+        my $value = $attribs{$key} || $self->{$key};
+        $make .= "$key = $value\n";
+    }
+
+    return $make;
+}
+
+=item dist_basics (o)
+
+Defines the targets distclean, distcheck, skipcheck, manifest, veryclean.
+
+=cut
+
+sub dist_basics {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+distclean :: realclean distcheck
+	$(NOECHO) $(NOOP)
+
+distcheck :
+	$(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck
+
+skipcheck :
+	$(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck
+
+manifest :
+	$(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
+
+veryclean : realclean
+	$(RM_F) *~ *.orig */*~ */*.orig
+
+MAKE_FRAG
+
+}
+
+=item dist_ci (o)
+
+Defines a check in target for RCS.
+
+=cut
+
+sub dist_ci {
+    my($self) = shift;
+    return q{
+ci :
+	$(PERLRUN) "-MExtUtils::Manifest=maniread" \\
+	  -e "@all = keys %{ maniread() };" \\
+	  -e "print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});" \\
+	  -e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});"
+};
+}
+
+=item dist_core (o)
+
+  my $dist_make_fragment = $MM->dist_core;
+
+Puts the targets necessary for 'make dist' together into one make
+fragment.
+
+=cut
+
+sub dist_core {
+    my($self) = shift;
+
+    my $make_frag = '';
+    foreach my $target (qw(dist tardist uutardist tarfile zipdist zipfile 
+                           shdist))
+    {
+        my $method = $target.'_target';
+        $make_frag .= "\n";
+        $make_frag .= $self->$method();
+    }
+
+    return $make_frag;
+}
+
+
+=item B<dist_target>
+
+  my $make_frag = $MM->dist_target;
+
+Returns the 'dist' target to make an archive for distribution.  This
+target simply checks to make sure the Makefile is up-to-date and
+depends on $(DIST_DEFAULT).
+
+=cut
+
+sub dist_target {
+    my($self) = shift;
+
+    my $date_check = $self->oneliner(<<'CODE', ['-l']);
+print 'Warning: Makefile possibly out of date with $(VERSION_FROM)'
+    if -e '$(VERSION_FROM)' and -M '$(VERSION_FROM)' < -M '$(FIRST_MAKEFILE)';
+CODE
+
+    return sprintf <<'MAKE_FRAG', $date_check;
+dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
+	$(NOECHO) %s
+MAKE_FRAG
+}
+
+=item B<tardist_target>
+
+  my $make_frag = $MM->tardist_target;
+
+Returns the 'tardist' target which is simply so 'make tardist' works.
+The real work is done by the dynamically named tardistfile_target()
+method, tardist should have that as a dependency.
+
+=cut
+
+sub tardist_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+tardist : $(DISTVNAME).tar$(SUFFIX)
+	$(NOECHO) $(NOOP)
+MAKE_FRAG
+}
+
+=item B<zipdist_target>
+
+  my $make_frag = $MM->zipdist_target;
+
+Returns the 'zipdist' target which is simply so 'make zipdist' works.
+The real work is done by the dynamically named zipdistfile_target()
+method, zipdist should have that as a dependency.
+
+=cut
+
+sub zipdist_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+zipdist : $(DISTVNAME).zip
+	$(NOECHO) $(NOOP)
+MAKE_FRAG
+}
+
+=item B<tarfile_target>
+
+  my $make_frag = $MM->tarfile_target;
+
+The name of this target is the name of the tarball generated by
+tardist.  This target does the actual work of turning the distdir into
+a tarball.
+
+=cut
+
+sub tarfile_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+$(DISTVNAME).tar$(SUFFIX) : distdir
+	$(PREOP)
+	$(TO_UNIX)
+	$(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
+	$(RM_RF) $(DISTVNAME)
+	$(COMPRESS) $(DISTVNAME).tar
+	$(POSTOP)
+MAKE_FRAG
+}
+
+=item zipfile_target
+
+  my $make_frag = $MM->zipfile_target;
+
+The name of this target is the name of the zip file generated by
+zipdist.  This target does the actual work of turning the distdir into
+a zip file.
+
+=cut
+
+sub zipfile_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+$(DISTVNAME).zip : distdir
+	$(PREOP)
+	$(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
+	$(RM_RF) $(DISTVNAME)
+	$(POSTOP)
+MAKE_FRAG
+}
+
+=item uutardist_target
+
+  my $make_frag = $MM->uutardist_target;
+
+Converts the tarfile into a uuencoded file
+
+=cut
+
+sub uutardist_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+uutardist : $(DISTVNAME).tar$(SUFFIX)
+	uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu
+MAKE_FRAG
+}
+
+
+=item shdist_target
+
+  my $make_frag = $MM->shdist_target;
+
+Converts the distdir into a shell archive.
+
+=cut
+
+sub shdist_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+shdist : distdir
+	$(PREOP)
+	$(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
+	$(RM_RF) $(DISTVNAME)
+	$(POSTOP)
+MAKE_FRAG
+}
+
+
+=item dlsyms (o)
+
+Used by some OS' to define DL_FUNCS and DL_VARS and write the *.exp files.
+
+Normally just returns an empty string.
+
+=cut
+
+sub dlsyms {
+    return '';
+}
+
+
+=item dynamic_bs (o)
+
+Defines targets for bootstrap files.
+
+=cut
+
+sub dynamic_bs {
+    my($self, %attribs) = @_;
+    return '
+BOOTSTRAP =
+' unless $self->has_link_code();
+
+    my $target = $Is_VMS ? '$(MMS$TARGET)' : '$@';
+
+    return sprintf <<'MAKE_FRAG', ($target) x 5;
+BOOTSTRAP = $(BASEEXT).bs
+
+# As Mkbootstrap might not write a file (if none is required)
+# we use touch to prevent make continually trying to remake it.
+# The DynaLoader only reads a non-empty file.
+$(BOOTSTRAP) : $(FIRST_MAKEFILE) $(BOOTDEP) $(INST_ARCHAUTODIR)$(DFSEP).exists
+	$(NOECHO) $(ECHO) "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
+	$(NOECHO) $(PERLRUN) \
+		"-MExtUtils::Mkbootstrap" \
+		-e "Mkbootstrap('$(BASEEXT)','$(BSLOADLIBS)');"
+	$(NOECHO) $(TOUCH) %s
+	$(CHMOD) $(PERM_RW) %s
+
+$(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists
+	$(NOECHO) $(RM_RF) %s
+	- $(CP) $(BOOTSTRAP) %s
+	$(CHMOD) $(PERM_RW) %s
+MAKE_FRAG
+}
+
+=item dynamic_lib (o)
+
+Defines how to produce the *.so (or equivalent) files.
+
+=cut
+
+sub dynamic_lib {
+    my($self, %attribs) = @_;
+    return '' unless $self->needs_linking(); #might be because of a subdir
+
+    return '' unless $self->has_link_code;
+
+    my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
+    my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
+    my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
+    my($ldfrom) = '$(LDFROM)';
+    $armaybe = 'ar' if ($Is_OSF and $armaybe eq ':');
+    my(@m);
+    my $ld_opt = $Is_OS2 ? '$(OPTIMIZE) ' : '';	# Useful on other systems too?
+    my $ld_fix = $Is_OS2 ? '|| ( $(RM_F) $@ && sh -c false )' : '';
+    push(@m,'
+# This section creates the dynamically loadable $(INST_DYNAMIC)
+# from $(OBJECT) and possibly $(MYEXTLIB).
+ARMAYBE = '.$armaybe.'
+OTHERLDFLAGS = '.$ld_opt.$otherldflags.'
+INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
+INST_DYNAMIC_FIX = '.$ld_fix.'
+
+$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
+');
+    if ($armaybe ne ':'){
+	$ldfrom = 'tmp$(LIB_EXT)';
+	push(@m,'	$(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
+	push(@m,'	$(RANLIB) '."$ldfrom\n");
+    }
+    $ldfrom = "-all $ldfrom -none" if $Is_OSF;
+
+    # The IRIX linker doesn't use LD_RUN_PATH
+    my $ldrun = $Is_IRIX && $self->{LD_RUN_PATH} ?         
+                       qq{-rpath "$self->{LD_RUN_PATH}"} : '';
+
+    # For example in AIX the shared objects/libraries from previous builds
+    # linger quite a while in the shared dynalinker cache even when nobody
+    # is using them.  This is painful if one for instance tries to restart
+    # a failed build because the link command will fail unnecessarily 'cos
+    # the shared object/library is 'busy'.
+    push(@m,'	$(RM_F) $@
+');
+
+    my $libs = '$(LDLOADLIBS)';
+
+    if (($Is_NetBSD || $Is_Interix) && $Config{'useshrplib'}) {
+	# Use nothing on static perl platforms, and to the flags needed
+	# to link against the shared libperl library on shared perl
+	# platforms.  We peek at lddlflags to see if we need -Wl,-R
+	# or -R to add paths to the run-time library search path.
+        if ($Config{'lddlflags'} =~ /-Wl,-R/) {
+            $libs .= ' -L$(PERL_INC) -Wl,-R$(INSTALLARCHLIB)/CORE -Wl,-R$(PERL_ARCHLIB)/CORE -lperl';
+        } elsif ($Config{'lddlflags'} =~ /-R/) {
+            $libs .= ' -L$(PERL_INC) -R$(INSTALLARCHLIB)/CORE -R$(PERL_ARCHLIB)/CORE -lperl';
+        }
+    }
+
+    my $ld_run_path_shell = "";
+    if ($self->{LD_RUN_PATH} ne "") {
+	$ld_run_path_shell = 'LD_RUN_PATH="$(LD_RUN_PATH)" ';
+    }
+
+    push @m, sprintf <<'MAKE', $ld_run_path_shell, $ldrun, $ldfrom, $libs;
+	%s$(LD) %s $(LDDLFLAGS) %s $(OTHERLDFLAGS) -o $@ $(MYEXTLIB)	\
+	  $(PERL_ARCHIVE) %s $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)	\
+	  $(INST_DYNAMIC_FIX)
+MAKE
+
+    push @m, <<'MAKE';
+	$(CHMOD) $(PERM_RWX) $@
+MAKE
+
+    return join('',@m);
+}
+
+=item exescan
+
+Deprecated method. Use libscan instead.
+
+=cut
+
+sub exescan {
+    my($self,$path) = @_;
+    $path;
+}
+
+=item extliblist
+
+Called by init_others, and calls ext ExtUtils::Liblist. See
+L<ExtUtils::Liblist> for details.
+
+=cut
+
+sub extliblist {
+    my($self,$libs) = @_;
+    require ExtUtils::Liblist;
+    $self->ext($libs, $Verbose);
+}
+
+=item find_perl
+
+Finds the executables PERL and FULLPERL
+
+=cut
+
+sub find_perl {
+    my($self, $ver, $names, $dirs, $trace) = @_;
+    my($name, $dir);
+    if ($trace >= 2){
+        print "Looking for perl $ver by these names:
+@$names
+in these dirs:
+@$dirs
+";
+    }
+
+    my $stderr_duped = 0;
+    local *STDERR_COPY;
+    unless ($Is_BSD) {
+        if( open(STDERR_COPY, '>&STDERR') ) {
+            $stderr_duped = 1;
+        }
+        else {
+            warn <<WARNING;
+find_perl() can't dup STDERR: $!
+You might see some garbage while we search for Perl
+WARNING
+        }
+    }
+
+    foreach $name (@$names){
+        foreach $dir (@$dirs){
+            next unless defined $dir; # $self->{PERL_SRC} may be undefined
+            my ($abs, $val);
+            if ($self->file_name_is_absolute($name)) {     # /foo/bar
+                $abs = $name;
+            } elsif ($self->canonpath($name) eq 
+                     $self->canonpath(basename($name))) {  # foo
+                $abs = $self->catfile($dir, $name);
+            } else {                                            # foo/bar
+                $abs = $self->catfile($Curdir, $name);
+            }
+            print "Checking $abs\n" if ($trace >= 2);
+            next unless $self->maybe_command($abs);
+            print "Executing $abs\n" if ($trace >= 2);
+
+            my $version_check = qq{$abs -le "require $ver; print qq{VER_OK}"};
+            # To avoid using the unportable 2>&1 to supress STDERR,
+            # we close it before running the command.
+            # However, thanks to a thread library bug in many BSDs
+            # ( http://www.freebsd.org/cgi/query-pr.cgi?pr=51535 )
+            # we cannot use the fancier more portable way in here
+            # but instead need to use the traditional 2>&1 construct.
+            if ($Is_BSD) {
+                $val = `$version_check 2>&1`;
+            } else {
+                close STDERR if $stderr_duped;
+                $val = `$version_check`;
+                open STDERR, '>&STDERR_COPY' if $stderr_duped;
+            }
+
+            if ($val =~ /^VER_OK/) {
+                print "Using PERL=$abs\n" if $trace;
+                return $abs;
+            } elsif ($trace >= 2) {
+                print "Result: '$val'\n";
+            }
+        }
+    }
+    print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
+    0; # false and not empty
+}
+
+
+=item fixin
+
+  $mm->fixin(@files);
+
+Inserts the sharpbang or equivalent magic number to a set of @files.
+
+=cut
+
+sub fixin { # stolen from the pink Camel book, more or less
+    my($self, @files) = @_;
+
+    my($does_shbang) = $Config{'sharpbang'} =~ /^\s*\#\!/;
+    for my $file (@files) {
+        my $file_new = "$file.new";
+        my $file_bak = "$file.bak";
+
+	local(*FIXIN);
+	local(*FIXOUT);
+	open(FIXIN, $file) or croak "Can't process '$file': $!";
+	local $/ = "\n";
+	chomp(my $line = <FIXIN>);
+	next unless $line =~ s/^\s*\#!\s*//;     # Not a shbang file.
+	# Now figure out the interpreter name.
+	my($cmd,$arg) = split ' ', $line, 2;
+	$cmd =~ s!^.*/!!;
+
+	# Now look (in reverse) for interpreter in absolute PATH (unless perl).
+        my $interpreter;
+	if ($cmd eq "perl") {
+            if ($Config{startperl} =~ m,^\#!.*/perl,) {
+                $interpreter = $Config{startperl};
+                $interpreter =~ s,^\#!,,;
+            } else {
+                $interpreter = $Config{perlpath};
+            }
+	} else {
+	    my(@absdirs) = reverse grep {$self->file_name_is_absolute} $self->path;
+	    $interpreter = '';
+	    my($dir);
+	    foreach $dir (@absdirs) {
+		if ($self->maybe_command($cmd)) {
+		    warn "Ignoring $interpreter in $file\n" if $Verbose && $interpreter;
+		    $interpreter = $self->catfile($dir,$cmd);
+		}
+	    }
+	}
+	# Figure out how to invoke interpreter on this machine.
+
+	my($shb) = "";
+	if ($interpreter) {
+	    print STDOUT "Changing sharpbang in $file to $interpreter" if $Verbose;
+	    # this is probably value-free on DOSISH platforms
+	    if ($does_shbang) {
+		$shb .= "$Config{'sharpbang'}$interpreter";
+		$shb .= ' ' . $arg if defined $arg;
+		$shb .= "\n";
+	    }
+	    $shb .= qq{
+eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
+    if 0; # not running under some shell
+} unless $Is_Win32; # this won't work on win32, so don't
+	} else {
+	    warn "Can't find $cmd in PATH, $file unchanged"
+		if $Verbose;
+	    next;
+	}
+
+	unless ( open(FIXOUT,">$file_new") ) {
+	    warn "Can't create new $file: $!\n";
+	    next;
+	}
+	
+	# Print out the new #! line (or equivalent).
+	local $\;
+	undef $/;
+	print FIXOUT $shb, <FIXIN>;
+	close FIXIN;
+	close FIXOUT;
+
+        chmod 0666, $file_bak;
+        unlink $file_bak;
+	unless ( _rename($file, $file_bak) ) {	
+	    warn "Can't rename $file to $file_bak: $!";
+	    next;
+	}
+	unless ( _rename($file_new, $file) ) {	
+	    warn "Can't rename $file_new to $file: $!";
+	    unless ( _rename($file_bak, $file) ) {
+	        warn "Can't rename $file_bak back to $file either: $!";
+		warn "Leaving $file renamed as $file_bak\n";
+	    }
+	    next;
+	}
+	unlink $file_bak;
+    } continue {
+	close(FIXIN) if fileno(FIXIN);
+	system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';;
+    }
+}
+
+
+sub _rename {
+    my($old, $new) = @_;
+
+    foreach my $file ($old, $new) {
+        if( $Is_VMS and basename($file) !~ /\./ ) {
+            # rename() in 5.8.0 on VMS will not rename a file if it
+            # does not contain a dot yet it returns success.
+            $file = "$file.";
+        }
+    }
+
+    return rename($old, $new);
+}
+
+
+=item force (o)
+
+Writes an empty FORCE: target.
+
+=cut
+
+sub force {
+    my($self) = shift;
+    '# Phony target to force checking subdirectories.
+FORCE:
+	$(NOECHO) $(NOOP)
+';
+}
+
+=item guess_name
+
+Guess the name of this package by examining the working directory's
+name. MakeMaker calls this only if the developer has not supplied a
+NAME attribute.
+
+=cut
+
+# ';
+
+sub guess_name {
+    my($self) = @_;
+    use Cwd 'cwd';
+    my $name = basename(cwd());
+    $name =~ s|[\-_][\d\.\-]+\z||;  # this is new with MM 5.00, we
+                                    # strip minus or underline
+                                    # followed by a float or some such
+    print "Warning: Guessing NAME [$name] from current directory name.\n";
+    $name;
+}
+
+=item has_link_code
+
+Returns true if C, XS, MYEXTLIB or similar objects exist within this
+object that need a compiler. Does not descend into subdirectories as
+needs_linking() does.
+
+=cut
+
+sub has_link_code {
+    my($self) = shift;
+    return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
+    if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
+	$self->{HAS_LINK_CODE} = 1;
+	return 1;
+    }
+    return $self->{HAS_LINK_CODE} = 0;
+}
+
+
+=item init_dirscan
+
+Scans the directory structure and initializes DIR, XS, XS_FILES, PM,
+C, C_FILES, O_FILES, H, H_FILES, PL_FILES, MAN*PODS, EXE_FILES.
+
+Called by init_main.
+
+=cut
+
+sub init_dirscan {	# --- File and Directory Lists (.xs .pm .pod etc)
+    my($self) = @_;
+    my($name, %dir, %xs, %c, %h, %pl_files, %manifypods);
+    my %pm;
+
+    my %ignore = map {( $_ => 1 )} qw(Makefile.PL Build.PL test.pl t);
+
+    # ignore the distdir
+    $Is_VMS ? $ignore{"$self->{DISTVNAME}.dir"} = 1
+            : $ignore{$self->{DISTVNAME}} = 1;
+
+    @ignore{map lc, keys %ignore} = values %ignore if $Is_VMS;
+
+    foreach $name ($self->lsdir($Curdir)){
+	next if $name =~ /\#/;
+	next if $name eq $Curdir or $name eq $Updir or $ignore{$name};
+	next unless $self->libscan($name);
+	if (-d $name){
+	    next if -l $name; # We do not support symlinks at all
+            next if $self->{NORECURS};
+	    $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
+	} elsif ($name =~ /\.xs\z/){
+	    my($c); ($c = $name) =~ s/\.xs\z/.c/;
+	    $xs{$name} = $c;
+	    $c{$c} = 1;
+	} elsif ($name =~ /\.c(pp|xx|c)?\z/i){  # .c .C .cpp .cxx .cc
+	    $c{$name} = 1
+		unless $name =~ m/perlmain\.c/; # See MAP_TARGET
+	} elsif ($name =~ /\.h\z/i){
+	    $h{$name} = 1;
+	} elsif ($name =~ /\.PL\z/) {
+	    ($pl_files{$name} = $name) =~ s/\.PL\z// ;
+	} elsif (($Is_VMS || $Is_Dos) && $name =~ /[._]pl$/i) {
+	    # case-insensitive filesystem, one dot per name, so foo.h.PL
+	    # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
+	    local($/); open(PL,$name); my $txt = <PL>; close PL;
+	    if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
+		($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
+	    }
+	    else { 
+                $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name); 
+            }
+	} elsif ($name =~ /\.(p[ml]|pod)\z/){
+	    $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name);
+	}
+    }
+
+    # Some larger extensions often wish to install a number of *.pm/pl
+    # files into the library in various locations.
+
+    # The attribute PMLIBDIRS holds an array reference which lists
+    # subdirectories which we should search for library files to
+    # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ].  We
+    # recursively search through the named directories (skipping any
+    # which don't exist or contain Makefile.PL files).
+
+    # For each *.pm or *.pl file found $self->libscan() is called with
+    # the default installation path in $_[1]. The return value of
+    # libscan defines the actual installation location.  The default
+    # libscan function simply returns the path.  The file is skipped
+    # if libscan returns false.
+
+    # The default installation location passed to libscan in $_[1] is:
+    #
+    #  ./*.pm		=> $(INST_LIBDIR)/*.pm
+    #  ./xyz/...	=> $(INST_LIBDIR)/xyz/...
+    #  ./lib/...	=> $(INST_LIB)/...
+    #
+    # In this way the 'lib' directory is seen as the root of the actual
+    # perl library whereas the others are relative to INST_LIBDIR
+    # (which includes PARENT_NAME). This is a subtle distinction but one
+    # that's important for nested modules.
+
+    unless( $self->{PMLIBDIRS} ) {
+        if( $Is_VMS ) {
+            # Avoid logical name vs directory collisions
+            $self->{PMLIBDIRS} = ['./lib', "./$self->{BASEEXT}"];
+        }
+        else {
+            $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}];
+        }
+    }
+
+    #only existing directories that aren't in $dir are allowed
+
+    # Avoid $_ wherever possible:
+    # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
+    my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
+    my ($pmlibdir);
+    @{$self->{PMLIBDIRS}} = ();
+    foreach $pmlibdir (@pmlibdirs) {
+	-d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
+    }
+
+    if (@{$self->{PMLIBDIRS}}){
+	print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
+	    if ($Verbose >= 2);
+	require File::Find;
+        File::Find::find(sub {
+            if (-d $_){
+                unless ($self->libscan($_)){
+                    $File::Find::prune = 1;
+                }
+                return;
+            }
+            return if /\#/;
+            return if /~$/;    # emacs temp files
+            return if /,v$/;   # RCS files
+
+	    my $path   = $File::Find::name;
+            my $prefix = $self->{INST_LIBDIR};
+            my $striplibpath;
+
+	    $prefix =  $self->{INST_LIB} 
+                if ($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i;
+
+	    my($inst) = $self->catfile($prefix,$striplibpath);
+	    local($_) = $inst; # for backwards compatibility
+	    $inst = $self->libscan($inst);
+	    print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
+	    return unless $inst;
+	    $pm{$path} = $inst;
+	}, @{$self->{PMLIBDIRS}});
+    }
+
+    $self->{PM}  ||= \%pm;
+    $self->{PL_FILES} ||= \%pl_files;
+
+    $self->{DIR} ||= [sort keys %dir];
+
+    $self->{XS}  ||= \%xs;
+    $self->{C}   ||= [sort keys %c];
+    my @o_files = @{$self->{C}};
+    $self->{O_FILES} = [grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files];
+                            
+    $self->{H}   ||= [sort keys %h];
+
+    # Set up names of manual pages to generate from pods
+    my %pods;
+    foreach my $man (qw(MAN1 MAN3)) {
+	unless ($self->{"${man}PODS"}) {
+	    $self->{"${man}PODS"} = {};
+	    $pods{$man} = 1 unless 
+              $self->{"INSTALL${man}DIR"} =~ /^(none|\s*)$/;
+	}
+    }
+
+    if ($pods{MAN1}) {
+	if ( exists $self->{EXE_FILES} ) {
+	    foreach $name (@{$self->{EXE_FILES}}) {
+		local *FH;
+		my($ispod)=0;
+		if (open(FH,"<$name")) {
+		    while (<FH>) {
+			if (/^=(?:head\d+|item|pod)\b/) {
+			    $ispod=1;
+			    last;
+			}
+		    }
+		    close FH;
+		} else {
+		    # If it doesn't exist yet, we assume, it has pods in it
+		    $ispod = 1;
+		}
+		next unless $ispod;
+		if ($pods{MAN1}) {
+		    $self->{MAN1PODS}->{$name} =
+		      $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)");
+		}
+	    }
+	}
+    }
+    if ($pods{MAN3}) {
+	my %manifypods = (); # we collect the keys first, i.e. the files
+			     # we have to convert to pod
+	foreach $name (keys %{$self->{PM}}) {
+	    if ($name =~ /\.pod\z/ ) {
+		$manifypods{$name} = $self->{PM}{$name};
+	    } elsif ($name =~ /\.p[ml]\z/ ) {
+		local *FH;
+		my($ispod)=0;
+		if (open(FH,"<$name")) {
+		    while (<FH>) {
+			if (/^=head1\s+\w+/) {
+			    $ispod=1;
+			    last;
+			}
+		    }
+		    close FH;
+		} else {
+		    $ispod = 1;
+		}
+		if( $ispod ) {
+		    $manifypods{$name} = $self->{PM}{$name};
+		}
+	    }
+	}
+
+	# Remove "Configure.pm" and similar, if it's not the only pod listed
+	# To force inclusion, just name it "Configure.pod", or override 
+        # MAN3PODS
+	foreach $name (keys %manifypods) {
+           if ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) {
+		delete $manifypods{$name};
+		next;
+	    }
+	    my($manpagename) = $name;
+	    $manpagename =~ s/\.p(od|m|l)\z//;
+           # everything below lib is ok
+	    unless($manpagename =~ s!^\W*lib\W+!!s) {
+		$manpagename = $self->catfile(
+                                split(/::/,$self->{PARENT_NAME}),$manpagename
+                               );
+	    }
+	    if ($pods{MAN3}) {
+		$manpagename = $self->replace_manpage_separator($manpagename);
+		$self->{MAN3PODS}->{$name} =
+		  $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
+	    }
+	}
+    }
+}
+
+=item init_DIRFILESEP
+
+Using / for Unix.  Called by init_main.
+
+=cut
+
+sub init_DIRFILESEP {
+    my($self) = shift;
+
+    $self->{DIRFILESEP} = '/';
+}
+    
+
+=item init_main
+
+Initializes AR, AR_STATIC_ARGS, BASEEXT, CONFIG, DISTNAME, DLBASE,
+EXE_EXT, FULLEXT, FULLPERL, FULLPERLRUN, FULLPERLRUNINST, INST_*,
+INSTALL*, INSTALLDIRS, LIB_EXT, LIBPERL_A, MAP_TARGET, NAME,
+OBJ_EXT, PARENT_NAME, PERL, PERL_ARCHLIB, PERL_INC, PERL_LIB,
+PERL_SRC, PERLRUN, PERLRUNINST, PREFIX, VERSION,
+VERSION_SYM, XS_VERSION.
+
+=cut
+
+sub init_main {
+    my($self) = @_;
+
+    # --- Initialize Module Name and Paths
+
+    # NAME    = Foo::Bar::Oracle
+    # FULLEXT = Foo/Bar/Oracle
+    # BASEEXT = Oracle
+    # PARENT_NAME = Foo::Bar
+### Only UNIX:
+###    ($self->{FULLEXT} =
+###     $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
+    $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
+
+
+    # Copied from DynaLoader:
+
+    my(@modparts) = split(/::/,$self->{NAME});
+    my($modfname) = $modparts[-1];
+
+    # Some systems have restrictions on files names for DLL's etc.
+    # mod2fname returns appropriate file base name (typically truncated)
+    # It may also edit @modparts if required.
+    if (defined &DynaLoader::mod2fname) {
+        $modfname = &DynaLoader::mod2fname(\@modparts);
+    }
+
+    ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
+    $self->{PARENT_NAME} ||= '';
+
+    if (defined &DynaLoader::mod2fname) {
+	# As of 5.001m, dl_os2 appends '_'
+	$self->{DLBASE} = $modfname;
+    } else {
+	$self->{DLBASE} = '$(BASEEXT)';
+    }
+
+
+    # --- Initialize PERL_LIB, PERL_SRC
+
+    # *Real* information: where did we get these two from? ...
+    my $inc_config_dir = dirname($INC{'Config.pm'});
+    my $inc_carp_dir   = dirname($INC{'Carp.pm'});
+
+    unless ($self->{PERL_SRC}){
+	my($dir);
+	foreach $dir ($Updir,
+                  $self->catdir($Updir,$Updir),
+                  $self->catdir($Updir,$Updir,$Updir),
+                  $self->catdir($Updir,$Updir,$Updir,$Updir),
+                  $self->catdir($Updir,$Updir,$Updir,$Updir,$Updir))
+        {
+	    if (
+		-f $self->catfile($dir,"config_h.SH")
+		&&
+		-f $self->catfile($dir,"perl.h")
+		&&
+		-f $self->catfile($dir,"lib","Exporter.pm")
+	       ) {
+		$self->{PERL_SRC}=$dir ;
+		last;
+	    }
+	}
+    }
+
+    warn "PERL_CORE is set but I can't find your PERL_SRC!\n" if
+      $self->{PERL_CORE} and !$self->{PERL_SRC};
+
+    if ($self->{PERL_SRC}){
+	$self->{PERL_LIB}     ||= $self->catdir("$self->{PERL_SRC}","lib");
+
+        if (defined $Cross::platform) {
+            $self->{PERL_ARCHLIB} = 
+              $self->catdir("$self->{PERL_SRC}","xlib",$Cross::platform);
+            $self->{PERL_INC}     = 
+              $self->catdir("$self->{PERL_SRC}","xlib",$Cross::platform, 
+                                 $Is_Win32?("CORE"):());
+        }
+        else {
+            $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
+            $self->{PERL_INC}     = ($Is_Win32) ? 
+              $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
+        }
+
+	# catch a situation that has occurred a few times in the past:
+	unless (
+		-s $self->catfile($self->{PERL_SRC},'cflags')
+		or
+		$Is_VMS
+		&&
+		-s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt')
+		or
+		$Is_Win32
+	       ){
+	    warn qq{
+You cannot build extensions below the perl source tree after executing
+a 'make clean' in the perl source tree.
+
+To rebuild extensions distributed with the perl source you should
+simply Configure (to include those extensions) and then build perl as
+normal. After installing perl the source tree can be deleted. It is
+not needed for building extensions by running 'perl Makefile.PL'
+usually without extra arguments.
+
+It is recommended that you unpack and build additional extensions away
+from the perl source tree.
+};
+	}
+    } else {
+	# we should also consider $ENV{PERL5LIB} here
+        my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
+	$self->{PERL_LIB}     ||= $Config{privlibexp};
+	$self->{PERL_ARCHLIB} ||= $Config{archlibexp};
+	$self->{PERL_INC}     = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
+	my $perl_h;
+
+	if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
+	    and not $old){
+	    # Maybe somebody tries to build an extension with an
+	    # uninstalled Perl outside of Perl build tree
+	    my $found;
+	    for my $dir (@INC) {
+	      $found = $dir, last if -e $self->catdir($dir, "Config.pm");
+	    }
+	    if ($found) {
+	      my $inc = dirname $found;
+	      if (-e $self->catdir($inc, "perl.h")) {
+		$self->{PERL_LIB}	   = $found;
+		$self->{PERL_ARCHLIB}	   = $found;
+		$self->{PERL_INC}	   = $inc;
+		$self->{UNINSTALLED_PERL}  = 1;
+		print STDOUT <<EOP;
+... Detected uninstalled Perl.  Trying to continue.
+EOP
+	      }
+	    }
+	}	
+    }
+
+    # We get SITELIBEXP and SITEARCHEXP directly via
+    # Get_from_Config. When we are running standard modules, these
+    # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
+    # set it to "site". I prefer that INSTALLDIRS be set from outside
+    # MakeMaker.
+    $self->{INSTALLDIRS} ||= "site";
+
+    $self->{MAN1EXT} ||= $Config{man1ext};
+    $self->{MAN3EXT} ||= $Config{man3ext};
+
+    # Get some stuff out of %Config if we haven't yet done so
+    print STDOUT "CONFIG must be an array ref\n"
+	if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
+    $self->{CONFIG} = [] unless (ref $self->{CONFIG});
+    push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
+    push(@{$self->{CONFIG}}, 'shellflags') if $Config{shellflags};
+    my(%once_only);
+    foreach my $m (@{$self->{CONFIG}}){
+	next if $once_only{$m};
+	print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
+		unless exists $Config{$m};
+	$self->{uc $m} ||= $Config{$m};
+	$once_only{$m} = 1;
+    }
+
+# This is too dangerous:
+#    if ($^O eq "next") {
+#	$self->{AR} = "libtool";
+#	$self->{AR_STATIC_ARGS} = "-o";
+#    }
+# But I leave it as a placeholder
+
+    $self->{AR_STATIC_ARGS} ||= "cr";
+
+    # These should never be needed
+    $self->{OBJ_EXT} ||= '.o';
+    $self->{LIB_EXT} ||= '.a';
+
+    $self->{MAP_TARGET} ||= "perl";
+
+    $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
+
+    # make a simple check if we find Exporter
+    warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
+        (Exporter.pm not found)"
+	unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
+        $self->{NAME} eq "ExtUtils::MakeMaker";
+}
+
+=item init_others
+
+Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH, LD,
+OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, SHELL, NOOP,
+FIRST_MAKEFILE, MAKEFILE_OLD, NOECHO, RM_F, RM_RF, TEST_F,
+TOUCH, CP, MV, CHMOD, UMASK_NULL, ECHO, ECHO_N
+
+=cut
+
+sub init_others {	# --- Initialize Other Attributes
+    my($self) = shift;
+
+    $self->{LD} ||= 'ld';
+
+    # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
+    # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
+    # undefined. In any case we turn it into an anon array:
+
+    # May check $Config{libs} too, thus not empty.
+    $self->{LIBS} = [$self->{LIBS}] unless ref $self->{LIBS};
+
+    $self->{LIBS} = [''] unless @{$self->{LIBS}} && defined $self->{LIBS}[0];
+    $self->{LD_RUN_PATH} = "";
+    my($libs);
+    foreach $libs ( @{$self->{LIBS}} ){
+	$libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
+	my(@libs) = $self->extliblist($libs);
+	if ($libs[0] or $libs[1] or $libs[2]){
+	    # LD_RUN_PATH now computed by ExtUtils::Liblist
+	    ($self->{EXTRALIBS},  $self->{BSLOADLIBS}, 
+             $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
+	    last;
+	}
+    }
+
+    if ( $self->{OBJECT} ) {
+	$self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
+    } else {
+	# init_dirscan should have found out, if we have C files
+	$self->{OBJECT} = "";
+	$self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
+    }
+    $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
+    $self->{BOOTDEP}  = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
+    $self->{PERLMAINCC} ||= '$(CC)';
+    $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
+
+    # Sanity check: don't define LINKTYPE = dynamic if we're skipping
+    # the 'dynamic' section of MM.  We don't have this problem with
+    # 'static', since we either must use it (%Config says we can't
+    # use dynamic loading) or the caller asked for it explicitly.
+    if (!$self->{LINKTYPE}) {
+       $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
+                        ? 'static'
+                        : ($Config{usedl} ? 'dynamic' : 'static');
+    };
+
+    $self->{NOOP}               ||= '$(SHELL) -c true';
+    $self->{NOECHO}             = '@' unless defined $self->{NOECHO};
+
+    $self->{FIRST_MAKEFILE}     ||= $self->{MAKEFILE} || 'Makefile';
+    $self->{MAKEFILE}           ||= $self->{FIRST_MAKEFILE};
+    $self->{MAKEFILE_OLD}       ||= $self->{MAKEFILE}.'.old';
+    $self->{MAKE_APERL_FILE}    ||= $self->{MAKEFILE}.'.aperl';
+
+    # Some makes require a wrapper around macros passed in on the command 
+    # line.
+    $self->{MACROSTART}         ||= '';
+    $self->{MACROEND}           ||= '';
+
+    # Not everybody uses -f to indicate "use this Makefile instead"
+    $self->{USEMAKEFILE}        ||= '-f';
+
+    $self->{SHELL}              ||= $Config{sh} || '/bin/sh';
+
+    $self->{ECHO}       ||= 'echo';
+    $self->{ECHO_N}     ||= 'echo -n';
+    $self->{RM_F}       ||= "rm -f";
+    $self->{RM_RF}      ||= "rm -rf";
+    $self->{TOUCH}      ||= "touch";
+    $self->{TEST_F}     ||= "test -f";
+    $self->{CP}         ||= "cp";
+    $self->{MV}         ||= "mv";
+    $self->{CHMOD}      ||= "chmod";
+    $self->{MKPATH}     ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e mkpath';
+    $self->{EQUALIZE_TIMESTAMP} ||= 
+      '$(ABSPERLRUN) "-MExtUtils::Command" -e eqtime';
+
+    $self->{UNINST}     ||= 0;
+    $self->{VERBINST}   ||= 0;
+    $self->{MOD_INSTALL} ||= 
+      $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
+install({@ARGV}, '$(VERBINST)', 0, '$(UNINST)');
+CODE
+    $self->{DOC_INSTALL}        ||= 
+      '$(ABSPERLRUN) "-MExtUtils::Command::MM" -e perllocal_install';
+    $self->{UNINSTALL}          ||= 
+      '$(ABSPERLRUN) "-MExtUtils::Command::MM" -e uninstall';
+    $self->{WARN_IF_OLD_PACKLIST} ||= 
+      '$(ABSPERLRUN) "-MExtUtils::Command::MM" -e warn_if_old_packlist';
+    $self->{FIXIN}              ||= 
+      q{$(PERLRUN) "-MExtUtils::MY" -e "MY->fixin(shift)"};
+
+    $self->{UMASK_NULL}         ||= "umask 0";
+    $self->{DEV_NULL}           ||= "> /dev/null 2>&1";
+
+    return 1;
+}
+
+
+=item init_linker
+
+Unix has no need of special linker flags.
+
+=cut
+
+sub init_linker {
+    my($self) = shift;
+    $self->{PERL_ARCHIVE} ||= '';
+    $self->{PERL_ARCHIVE_AFTER} ||= '';
+    $self->{EXPORT_LIST}  ||= '';
+}
+
+
+=begin _protected
+
+=item init_lib2arch
+
+    $mm->init_lib2arch
+
+=end _protected
+
+=cut
+
+sub init_lib2arch {
+    my($self) = shift;
+
+    # The user who requests an installation directory explicitly
+    # should not have to tell us an architecture installation directory
+    # as well. We look if a directory exists that is named after the
+    # architecture. If not we take it as a sign that it should be the
+    # same as the requested installation directory. Otherwise we take
+    # the found one.
+    for my $libpair ({l=>"privlib",   a=>"archlib"}, 
+                     {l=>"sitelib",   a=>"sitearch"},
+                     {l=>"vendorlib", a=>"vendorarch"},
+                    )
+    {
+        my $lib = "install$libpair->{l}";
+        my $Lib = uc $lib;
+        my $Arch = uc "install$libpair->{a}";
+        if( $self->{$Lib} && ! $self->{$Arch} ){
+            my($ilib) = $Config{$lib};
+
+            $self->prefixify($Arch,$ilib,$self->{$Lib});
+
+            unless (-d $self->{$Arch}) {
+                print STDOUT "Directory $self->{$Arch} not found\n" 
+                  if $Verbose;
+                $self->{$Arch} = $self->{$Lib};
+            }
+            print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
+        }
+    }
+}
+
+
+=item init_PERL
+
+    $mm->init_PERL;
+
+Called by init_main.  Sets up ABSPERL, PERL, FULLPERL and all the
+*PERLRUN* permutations.
+
+    PERL is allowed to be miniperl
+    FULLPERL must be a complete perl
+
+    ABSPERL is PERL converted to an absolute path
+
+    *PERLRUN contains everything necessary to run perl, find it's
+         libraries, etc...
+
+    *PERLRUNINST is *PERLRUN + everything necessary to find the
+         modules being built.
+
+=cut
+
+sub init_PERL {
+    my($self) = shift;
+
+    my @defpath = ();
+    foreach my $component ($self->{PERL_SRC}, $self->path(), 
+                           $Config{binexp}) 
+    {
+	push @defpath, $component if defined $component;
+    }
+
+    # Build up a set of file names (not command names).
+    my $thisperl = $self->canonpath($^X);
+    $thisperl .= $Config{exe_ext} unless 
+                # VMS might have a file version # at the end
+      $Is_VMS ? $thisperl =~ m/$Config{exe_ext}(;\d+)?$/i
+              : $thisperl =~ m/$Config{exe_ext}$/i;
+
+    # We need a relative path to perl when in the core.
+    $thisperl = $self->abs2rel($thisperl) if $self->{PERL_CORE};
+
+    my @perls = ($thisperl);
+    push @perls, map { "$_$Config{exe_ext}" }
+                     ('perl', 'perl5', "perl$Config{version}");
+
+    # miniperl has priority over all but the cannonical perl when in the
+    # core.  Otherwise its a last resort.
+    my $miniperl = "miniperl$Config{exe_ext}";
+    if( $self->{PERL_CORE} ) {
+        splice @perls, 1, 0, $miniperl;
+    }
+    else {
+        push @perls, $miniperl;
+    }
+
+    $self->{PERL} ||=
+        $self->find_perl(5.0, \@perls, \@defpath, $Verbose );
+    # don't check if perl is executable, maybe they have decided to
+    # supply switches with perl
+
+    # When built for debugging, VMS doesn't create perl.exe but ndbgperl.exe.
+    my $perl_name = 'perl';
+    $perl_name = 'ndbgperl' if $Is_VMS && 
+      defined $Config{usevmsdebug} && $Config{usevmsdebug} eq 'define';
+
+    # XXX This logic is flawed.  If "miniperl" is anywhere in the path
+    # it will get confused.  It should be fixed to work only on the filename.
+    # Define 'FULLPERL' to be a non-miniperl (used in test: target)
+    ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/$perl_name/i
+	unless $self->{FULLPERL};
+
+    # Little hack to get around VMS's find_perl putting "MCR" in front
+    # sometimes.
+    $self->{ABSPERL} = $self->{PERL};
+    my $has_mcr = $self->{ABSPERL} =~ s/^MCR\s*//;
+    if( $self->file_name_is_absolute($self->{ABSPERL}) ) {
+        $self->{ABSPERL} = '$(PERL)';
+    }
+    else {
+        $self->{ABSPERL} = $self->rel2abs($self->{ABSPERL});
+        $self->{ABSPERL} = 'MCR '.$self->{ABSPERL} if $has_mcr;
+    }
+
+    # Are we building the core?
+    $self->{PERL_CORE} = $ENV{PERL_CORE} unless exists $self->{PERL_CORE};
+    $self->{PERL_CORE} = 0               unless defined $self->{PERL_CORE};
+
+    # How do we run perl?
+    foreach my $perl (qw(PERL FULLPERL ABSPERL)) {
+        my $run  = $perl.'RUN';
+
+        $self->{$run}  = "\$($perl)";
+
+        # Make sure perl can find itself before it's installed.
+        $self->{$run} .= q{ "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)"} 
+          if $self->{UNINSTALLED_PERL} || $self->{PERL_CORE};
+
+        $self->{$perl.'RUNINST'} = 
+          sprintf q{$(%sRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"}, $perl;
+    }
+
+    return 1;
+}
+
+
+=item init_platform
+
+=item platform_constants
+
+Add MM_Unix_VERSION.
+
+=cut
+
+sub init_platform {
+    my($self) = shift;
+
+    $self->{MM_Unix_VERSION} = $VERSION;
+    $self->{PERL_MALLOC_DEF} = '-DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc '.
+                               '-Dfree=Perl_mfree -Drealloc=Perl_realloc '.
+                               '-Dcalloc=Perl_calloc';
+
+}
+
+sub platform_constants {
+    my($self) = shift;
+    my $make_frag = '';
+
+    foreach my $macro (qw(MM_Unix_VERSION PERL_MALLOC_DEF))
+    {
+        next unless defined $self->{$macro};
+        $make_frag .= "$macro = $self->{$macro}\n";
+    }
+
+    return $make_frag;
+}
+
+
+=item init_PERM
+
+  $mm->init_PERM
+
+Called by init_main.  Initializes PERL_*
+
+=cut
+
+sub init_PERM {
+    my($self) = shift;
+
+    $self->{PERM_RW}  = 644  unless defined $self->{PERM_RW};
+    $self->{PERM_RWX} = 755  unless defined $self->{PERM_RWX};
+
+    return 1;
+}
+
+
+=item init_xs
+
+    $mm->init_xs
+
+Sets up macros having to do with XS code.  Currently just INST_STATIC,
+INST_DYNAMIC and INST_BOOT.
+
+=cut
+
+sub init_xs {
+    my $self = shift;
+
+    if ($self->has_link_code()) {
+        $self->{INST_STATIC}  = 
+          $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT)$(LIB_EXT)');
+        $self->{INST_DYNAMIC} = 
+          $self->catfile('$(INST_ARCHAUTODIR)', '$(DLBASE).$(DLEXT)');
+        $self->{INST_BOOT}    = 
+          $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT).bs');
+    } else {
+        $self->{INST_STATIC}  = '';
+        $self->{INST_DYNAMIC} = '';
+        $self->{INST_BOOT}    = '';
+    }
+}    
+
+=item install (o)
+
+Defines the install target.
+
+=cut
+
+sub install {
+    my($self, %attribs) = @_;
+    my(@m);
+
+    push @m, q{
+install :: all pure_install doc_install
+	$(NOECHO) $(NOOP)
+
+install_perl :: all pure_perl_install doc_perl_install
+	$(NOECHO) $(NOOP)
+
+install_site :: all pure_site_install doc_site_install
+	$(NOECHO) $(NOOP)
+
+install_vendor :: all pure_vendor_install doc_vendor_install
+	$(NOECHO) $(NOOP)
+
+pure_install :: pure_$(INSTALLDIRS)_install
+	$(NOECHO) $(NOOP)
+
+doc_install :: doc_$(INSTALLDIRS)_install
+	$(NOECHO) $(NOOP)
+
+pure__install : pure_site_install
+	$(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+
+doc__install : doc_site_install
+	$(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+
+pure_perl_install ::
+	$(NOECHO) $(MOD_INSTALL) \
+		read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
+		write }.$self->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
+		$(INST_LIB) $(DESTINSTALLPRIVLIB) \
+		$(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \
+		$(INST_BIN) $(DESTINSTALLBIN) \
+		$(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+		$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) \
+		$(INST_MAN3DIR) $(DESTINSTALLMAN3DIR)
+	$(NOECHO) $(WARN_IF_OLD_PACKLIST) \
+		}.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
+
+
+pure_site_install ::
+	$(NOECHO) $(MOD_INSTALL) \
+		read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
+		write }.$self->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
+		$(INST_LIB) $(DESTINSTALLSITELIB) \
+		$(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \
+		$(INST_BIN) $(DESTINSTALLSITEBIN) \
+		$(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+		$(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \
+		$(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR)
+	$(NOECHO) $(WARN_IF_OLD_PACKLIST) \
+		}.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
+
+pure_vendor_install ::
+	$(NOECHO) $(MOD_INSTALL) \
+		read }.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
+		write }.$self->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').q{ \
+		$(INST_LIB) $(DESTINSTALLVENDORLIB) \
+		$(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \
+		$(INST_BIN) $(DESTINSTALLVENDORBIN) \
+		$(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+		$(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \
+		$(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR)
+
+doc_perl_install ::
+	$(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+	-$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+	-$(NOECHO) $(DOC_INSTALL) \
+		"Module" "$(NAME)" \
+		"installed into" "$(INSTALLPRIVLIB)" \
+		LINKTYPE "$(LINKTYPE)" \
+		VERSION "$(VERSION)" \
+		EXE_FILES "$(EXE_FILES)" \
+		>> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
+
+doc_site_install ::
+	$(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+	-$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+	-$(NOECHO) $(DOC_INSTALL) \
+		"Module" "$(NAME)" \
+		"installed into" "$(INSTALLSITELIB)" \
+		LINKTYPE "$(LINKTYPE)" \
+		VERSION "$(VERSION)" \
+		EXE_FILES "$(EXE_FILES)" \
+		>> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
+
+doc_vendor_install ::
+	$(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+	-$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+	-$(NOECHO) $(DOC_INSTALL) \
+		"Module" "$(NAME)" \
+		"installed into" "$(INSTALLVENDORLIB)" \
+		LINKTYPE "$(LINKTYPE)" \
+		VERSION "$(VERSION)" \
+		EXE_FILES "$(EXE_FILES)" \
+		>> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
+
+};
+
+    push @m, q{
+uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+	$(NOECHO) $(NOOP)
+
+uninstall_from_perldirs ::
+	$(NOECHO) $(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
+
+uninstall_from_sitedirs ::
+	$(NOECHO) $(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
+
+uninstall_from_vendordirs ::
+	$(NOECHO) $(UNINSTALL) }.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{
+};
+
+    join("",@m);
+}
+
+=item installbin (o)
+
+Defines targets to make and to install EXE_FILES.
+
+=cut
+
+sub installbin {
+    my($self) = shift;
+
+    return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
+    my @exefiles = @{$self->{EXE_FILES}};
+    return "" unless @exefiles;
+
+    @exefiles = map vmsify($_), @exefiles if $Is_VMS;
+
+    my %fromto;
+    for my $from (@exefiles) {
+	my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
+
+	local($_) = $path; # for backwards compatibility
+	my $to = $self->libscan($path);
+	print "libscan($from) => '$to'\n" if ($Verbose >=2);
+
+        $to = vmsify($to) if $Is_VMS;
+	$fromto{$from} = $to;
+    }
+    my @to   = values %fromto;
+
+    my @m;
+    push(@m, qq{
+EXE_FILES = @exefiles
+
+pure_all :: @to
+	\$(NOECHO) \$(NOOP)
+
+realclean ::
+});
+
+    # realclean can get rather large.
+    push @m, map "\t$_\n", $self->split_command('$(RM_F)', @to);
+    push @m, "\n";
+
+
+    # A target for each exe file.
+    while (my($from,$to) = each %fromto) {
+	last unless defined $from;
+
+	push @m, sprintf <<'MAKE', $to, $from, $to, $from, $to, $to, $to;
+%s : %s $(FIRST_MAKEFILE) $(INST_SCRIPT)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists
+	$(NOECHO) $(RM_F) %s
+	$(CP) %s %s
+	$(FIXIN) %s
+	-$(NOECHO) $(CHMOD) $(PERM_RWX) %s
+
+MAKE
+
+    }
+
+    join "", @m;
+}
+
+
+=item linkext (o)
+
+Defines the linkext target which in turn defines the LINKTYPE.
+
+=cut
+
+sub linkext {
+    my($self, %attribs) = @_;
+    # LINKTYPE => static or dynamic or ''
+    my($linktype) = defined $attribs{LINKTYPE} ?
+      $attribs{LINKTYPE} : '$(LINKTYPE)';
+    "
+linkext :: $linktype
+	\$(NOECHO) \$(NOOP)
+";
+}
+
+=item lsdir
+
+Takes as arguments a directory name and a regular expression. Returns
+all entries in the directory that match the regular expression.
+
+=cut
+
+sub lsdir {
+    my($self) = shift;
+    my($dir, $regex) = @_;
+    my(@ls);
+    my $dh = new DirHandle;
+    $dh->open($dir || ".") or return ();
+    @ls = $dh->read;
+    $dh->close;
+    @ls = grep(/$regex/, @ls) if $regex;
+    @ls;
+}
+
+=item macro (o)
+
+Simple subroutine to insert the macros defined by the macro attribute
+into the Makefile.
+
+=cut
+
+sub macro {
+    my($self,%attribs) = @_;
+    my(@m,$key,$val);
+    while (($key,$val) = each %attribs){
+	last unless defined $key;
+	push @m, "$key = $val\n";
+    }
+    join "", @m;
+}
+
+=item makeaperl (o)
+
+Called by staticmake. Defines how to write the Makefile to produce a
+static new perl.
+
+By default the Makefile produced includes all the static extensions in
+the perl library. (Purified versions of library files, e.g.,
+DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
+
+=cut
+
+sub makeaperl {
+    my($self, %attribs) = @_;
+    my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
+	@attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
+    my(@m);
+    push @m, "
+# --- MakeMaker makeaperl section ---
+MAP_TARGET    = $target
+FULLPERL      = $self->{FULLPERL}
+";
+    return join '', @m if $self->{PARENT};
+
+    my($dir) = join ":", @{$self->{DIR}};
+
+    unless ($self->{MAKEAPERL}) {
+	push @m, q{
+$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
+	$(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@
+
+$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) pm_to_blib
+	$(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
+	$(NOECHO) $(PERLRUNINST) \
+		Makefile.PL DIR=}, $dir, q{ \
+		MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
+		MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
+
+	foreach (@ARGV){
+		if( /\s/ ){
+			s/=(.*)/='$1'/;
+		}
+		push @m, " \\\n\t\t$_";
+	}
+#	push @m, map( " \\\n\t\t$_", @ARGV );
+	push @m, "\n";
+
+	return join '', @m;
+    }
+
+
+
+    my($cccmd, $linkcmd, $lperl);
+
+
+    $cccmd = $self->const_cccmd($libperl);
+    $cccmd =~ s/^CCCMD\s*=\s*//;
+    $cccmd =~ s/\$\(INC\)/ "-I$self->{PERL_INC}" /;
+    $cccmd .= " $Config{cccdlflags}"
+	if ($Config{useshrplib} eq 'true');
+    $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
+
+    # The front matter of the linkcommand...
+    $linkcmd = join ' ', "\$(CC)",
+	    grep($_, @Config{qw(ldflags ccdlflags)});
+    $linkcmd =~ s/\s+/ /g;
+    $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
+
+    # Which *.a files could we make use of...
+    my %static;
+    require File::Find;
+    File::Find::find(sub {
+	return unless m/\Q$self->{LIB_EXT}\E$/;
+
+        # Skip perl's libraries.
+        return if m/^libperl/ or m/^perl\Q$self->{LIB_EXT}\E$/;
+
+	# Skip purified versions of libraries 
+        # (e.g., DynaLoader_pure_p1_c0_032.a)
+	return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
+
+	if( exists $self->{INCLUDE_EXT} ){
+		my $found = 0;
+		my $incl;
+		my $xx;
+
+		($xx = $File::Find::name) =~ s,.*?/auto/,,s;
+		$xx =~ s,/?$_,,;
+		$xx =~ s,/,::,g;
+
+		# Throw away anything not explicitly marked for inclusion.
+		# DynaLoader is implied.
+		foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
+			if( $xx eq $incl ){
+				$found++;
+				last;
+			}
+		}
+		return unless $found;
+	}
+	elsif( exists $self->{EXCLUDE_EXT} ){
+		my $excl;
+		my $xx;
+
+		($xx = $File::Find::name) =~ s,.*?/auto/,,s;
+		$xx =~ s,/?$_,,;
+		$xx =~ s,/,::,g;
+
+		# Throw away anything explicitly marked for exclusion
+		foreach $excl (@{$self->{EXCLUDE_EXT}}){
+			return if( $xx eq $excl );
+		}
+	}
+
+	# don't include the installed version of this extension. I
+	# leave this line here, although it is not necessary anymore:
+	# I patched minimod.PL instead, so that Miniperl.pm won't
+	# enclude duplicates
+
+	# Once the patch to minimod.PL is in the distribution, I can
+	# drop it
+	return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:;
+	use Cwd 'cwd';
+	$static{cwd() . "/" . $_}++;
+    }, grep( -d $_, @{$searchdirs || []}) );
+
+    # We trust that what has been handed in as argument, will be buildable
+    $static = [] unless $static;
+    @static{@{$static}} = (1) x @{$static};
+
+    $extra = [] unless $extra && ref $extra eq 'ARRAY';
+    for (sort keys %static) {
+	next unless /\Q$self->{LIB_EXT}\E\z/;
+	$_ = dirname($_) . "/extralibs.ld";
+	push @$extra, $_;
+    }
+
+    grep(s/^(.*)/"-I$1"/, @{$perlinc || []});
+
+    $target ||= "perl";
+    $tmp    ||= ".";
+
+# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
+# regenerate the Makefiles, MAP_STATIC and the dependencies for
+# extralibs.all are computed correctly
+    push @m, "
+MAP_LINKCMD   = $linkcmd
+MAP_PERLINC   = @{$perlinc || []}
+MAP_STATIC    = ",
+join(" \\\n\t", reverse sort keys %static), "
+
+MAP_PRELIBS   = $Config{perllibs} $Config{cryptlib}
+";
+
+    if (defined $libperl) {
+	($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
+    }
+    unless ($libperl && -f $lperl) { # Ilya's code...
+	my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
+	$dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL};
+	$libperl ||= "libperl$self->{LIB_EXT}";
+	$libperl   = "$dir/$libperl";
+	$lperl   ||= "libperl$self->{LIB_EXT}";
+	$lperl     = "$dir/$lperl";
+
+        if (! -f $libperl and ! -f $lperl) {
+          # We did not find a static libperl. Maybe there is a shared one?
+          if ($Is_SunOS) {
+            $lperl  = $libperl = "$dir/$Config{libperl}";
+            # SUNOS ld does not take the full path to a shared library
+            $libperl = '' if $Is_SunOS4;
+          }
+        }
+
+	print STDOUT "Warning: $libperl not found
+    If you're going to build a static perl binary, make sure perl is installed
+    otherwise ignore this warning\n"
+		unless (-f $lperl || defined($self->{PERL_SRC}));
+    }
+
+    # SUNOS ld does not take the full path to a shared library
+    my $llibperl = $libperl ? '$(MAP_LIBPERL)' : '-lperl';
+
+    push @m, "
+MAP_LIBPERL = $libperl
+LLIBPERL    = $llibperl
+";
+
+    push @m, '
+$(INST_ARCHAUTODIR)/extralibs.all : $(INST_ARCHAUTODIR)$(DFSEP).exists '.join(" \\\n\t", @$extra).'
+	$(NOECHO) $(RM_F)  $@
+	$(NOECHO) $(TOUCH) $@
+';
+
+    my $catfile;
+    foreach $catfile (@$extra){
+	push @m, "\tcat $catfile >> \$\@\n";
+    }
+
+push @m, "
+\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
+	\$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) \$(LLIBPERL) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
+	\$(NOECHO) \$(ECHO) 'To install the new \"\$(MAP_TARGET)\" binary, call'
+	\$(NOECHO) \$(ECHO) '    \$(MAKE) \$(USEMAKEFILE) $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
+	\$(NOECHO) \$(ECHO) 'To remove the intermediate files say'
+	\$(NOECHO) \$(ECHO) '    \$(MAKE) \$(USEMAKEFILE) $makefilename map_clean'
+
+$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
+";
+    push @m, "\t".$self->cd($tmp, qq[$cccmd "-I\$(PERL_INC)" perlmain.c])."\n";
+
+    push @m, qq{
+$tmp/perlmain.c: $makefilename}, q{
+	$(NOECHO) $(ECHO) Writing $@
+	$(NOECHO) $(PERL) $(MAP_PERLINC) "-MExtUtils::Miniperl" \\
+		-e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
+
+};
+    push @m, "\t", q{$(NOECHO) $(PERL) $(INSTALLSCRIPT)/fixpmain
+} if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
+
+
+    push @m, q{
+doc_inst_perl:
+	$(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+	-$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+	-$(NOECHO) $(DOC_INSTALL) \
+		"Perl binary" "$(MAP_TARGET)" \
+		MAP_STATIC "$(MAP_STATIC)" \
+		MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
+		MAP_LIBPERL "$(MAP_LIBPERL)" \
+		>> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
+
+};
+
+    push @m, q{
+inst_perl: pure_inst_perl doc_inst_perl
+
+pure_inst_perl: $(MAP_TARGET)
+	}.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(DESTINSTALLBIN)','$(MAP_TARGET)').q{
+
+clean :: map_clean
+
+map_clean :
+	}.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
+};
+
+    join '', @m;
+}
+
+=item makefile (o)
+
+Defines how to rewrite the Makefile.
+
+=cut
+
+sub makefile {
+    my($self) = shift;
+    my $m;
+    # We do not know what target was originally specified so we
+    # must force a manual rerun to be sure. But as it should only
+    # happen very rarely it is not a significant problem.
+    $m = '
+$(OBJECT) : $(FIRST_MAKEFILE)
+
+' if $self->{OBJECT};
+
+    my $newer_than_target = $Is_VMS ? '$(MMS$SOURCE_LIST)' : '$?';
+    my $mpl_args = join " ", map qq["$_"], @ARGV;
+
+    $m .= sprintf <<'MAKE_FRAG', $newer_than_target, $mpl_args;
+# We take a very conservative approach here, but it's worth it.
+# We move Makefile to Makefile.old here to avoid gnu make looping.
+$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
+	$(NOECHO) $(ECHO) "Makefile out-of-date with respect to %s"
+	$(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
+	-$(NOECHO) $(RM_F) $(MAKEFILE_OLD)
+	-$(NOECHO) $(MV)   $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
+	- $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL)
+	$(PERLRUN) Makefile.PL %s
+	$(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
+	$(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command.  <=="
+	false
+
+MAKE_FRAG
+
+    return $m;
+}
+
+
+=item maybe_command
+
+Returns true, if the argument is likely to be a command.
+
+=cut
+
+sub maybe_command {
+    my($self,$file) = @_;
+    return $file if -x $file && ! -d $file;
+    return;
+}
+
+
+=item needs_linking (o)
+
+Does this module need linking? Looks into subdirectory objects (see
+also has_link_code())
+
+=cut
+
+sub needs_linking {
+    my($self) = shift;
+    my($child,$caller);
+    $caller = (caller(0))[3];
+    confess("needs_linking called too early") if 
+      $caller =~ /^ExtUtils::MakeMaker::/;
+    return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
+    if ($self->has_link_code or $self->{MAKEAPERL}){
+	$self->{NEEDS_LINKING} = 1;
+	return 1;
+    }
+    foreach $child (keys %{$self->{CHILDREN}}) {
+	if ($self->{CHILDREN}->{$child}->needs_linking) {
+	    $self->{NEEDS_LINKING} = 1;
+	    return 1;
+	}
+    }
+    return $self->{NEEDS_LINKING} = 0;
+}
+
+=item nicetext
+
+misnamed method (will have to be changed). The MM_Unix method just
+returns the argument without further processing.
+
+On VMS used to insure that colons marking targets are preceded by
+space - most Unix Makes don't need this, but it's necessary under VMS
+to distinguish the target delimiter from a colon appearing as part of
+a filespec.
+
+=cut
+
+sub nicetext {
+    my($self,$text) = @_;
+    $text;
+}
+
+=item parse_abstract
+
+parse a file and return what you think is the ABSTRACT
+
+=cut
+
+sub parse_abstract {
+    my($self,$parsefile) = @_;
+    my $result;
+    local *FH;
+    local $/ = "\n";
+    open(FH,$parsefile) or die "Could not open '$parsefile': $!";
+    my $inpod = 0;
+    my $package = $self->{DISTNAME};
+    $package =~ s/-/::/g;
+    while (<FH>) {
+        $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
+        next if !$inpod;
+        chop;
+        next unless /^($package\s-\s)(.*)/;
+        $result = $2;
+        last;
+    }
+    close FH;
+    return $result;
+}
+
+=item parse_version
+
+parse a file and return what you think is $VERSION in this file set to.
+It will return the string "undef" if it can't figure out what $VERSION
+is. $VERSION should be for all to see, so our $VERSION or plain $VERSION
+are okay, but my $VERSION is not.
+
+=cut
+
+sub parse_version {
+    my($self,$parsefile) = @_;
+    my $result;
+    local *FH;
+    local $/ = "\n";
+    local $_;
+    open(FH,$parsefile) or die "Could not open '$parsefile': $!";
+    my $inpod = 0;
+    while (<FH>) {
+	$inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
+	next if $inpod || /^\s*#/;
+	chop;
+	next unless /(?<!\\)([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
+	my $eval = qq{
+	    package ExtUtils::MakeMaker::_version;
+	    no strict;
+
+	    local $1$2;
+	    \$$2=undef; do {
+		$_
+	    }; \$$2
+	};
+        local $^W = 0;
+	$result = eval($eval);
+	warn "Could not eval '$eval' in $parsefile: $@" if $@;
+	last;
+    }
+    close FH;
+
+    $result = "undef" unless defined $result;
+    return $result;
+}
+
+
+=item pasthru (o)
+
+Defines the string that is passed to recursive make calls in
+subdirectories.
+
+=cut
+
+sub pasthru {
+    my($self) = shift;
+    my(@m,$key);
+
+    my(@pasthru);
+    my($sep) = $Is_VMS ? ',' : '';
+    $sep .= "\\\n\t";
+
+    foreach $key (qw(LIB LIBPERL_A LINKTYPE OPTIMIZE
+                     PREFIX INSTALLBASE)
+                 ) 
+    {
+        next unless defined $self->{$key};
+	push @pasthru, "$key=\"\$($key)\"";
+    }
+
+    foreach $key (qw(DEFINE INC)) {
+        next unless defined $self->{$key};
+	push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\"";
+    }
+
+    push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
+    join "", @m;
+}
+
+=item perl_script
+
+Takes one argument, a file name, and returns the file name, if the
+argument is likely to be a perl script. On MM_Unix this is true for
+any ordinary, readable file.
+
+=cut
+
+sub perl_script {
+    my($self,$file) = @_;
+    return $file if -r $file && -f _;
+    return;
+}
+
+=item perldepend (o)
+
+Defines the dependency from all *.h files that come with the perl
+distribution.
+
+=cut
+
+sub perldepend {
+    my($self) = shift;
+    my(@m);
+
+    my $make_config = $self->cd('$(PERL_SRC)', '$(MAKE) lib/Config.pm');
+
+    push @m, sprintf <<'MAKE_FRAG', $make_config if $self->{PERL_SRC};
+# Check for unpropogated config.sh changes. Should never happen.
+# We do NOT just update config.h because that is not sufficient.
+# An out of date config.h is not fatal but complains loudly!
+$(PERL_INC)/config.h: $(PERL_SRC)/config.sh
+	-$(NOECHO) $(ECHO) "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
+
+$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
+	$(NOECHO) $(ECHO) "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
+	%s
+MAKE_FRAG
+
+    return join "", @m unless $self->needs_linking;
+
+    push @m, q{
+PERL_HDRS = \
+	$(PERL_INC)/EXTERN.h		\
+	$(PERL_INC)/INTERN.h		\
+	$(PERL_INC)/XSUB.h		\
+	$(PERL_INC)/av.h		\
+	$(PERL_INC)/cc_runtime.h	\
+	$(PERL_INC)/config.h		\
+	$(PERL_INC)/cop.h		\
+	$(PERL_INC)/cv.h		\
+	$(PERL_INC)/dosish.h		\
+	$(PERL_INC)/embed.h		\
+	$(PERL_INC)/embedvar.h		\
+	$(PERL_INC)/fakethr.h		\
+	$(PERL_INC)/form.h		\
+	$(PERL_INC)/gv.h		\
+	$(PERL_INC)/handy.h		\
+	$(PERL_INC)/hv.h		\
+	$(PERL_INC)/intrpvar.h		\
+	$(PERL_INC)/iperlsys.h		\
+	$(PERL_INC)/keywords.h		\
+	$(PERL_INC)/mg.h		\
+	$(PERL_INC)/nostdio.h		\
+	$(PERL_INC)/op.h		\
+	$(PERL_INC)/opcode.h		\
+	$(PERL_INC)/patchlevel.h	\
+	$(PERL_INC)/perl.h		\
+	$(PERL_INC)/perlio.h		\
+	$(PERL_INC)/perlsdio.h		\
+	$(PERL_INC)/perlsfio.h		\
+	$(PERL_INC)/perlvars.h		\
+	$(PERL_INC)/perly.h		\
+	$(PERL_INC)/pp.h		\
+	$(PERL_INC)/pp_proto.h		\
+	$(PERL_INC)/proto.h		\
+	$(PERL_INC)/regcomp.h		\
+	$(PERL_INC)/regexp.h		\
+	$(PERL_INC)/regnodes.h		\
+	$(PERL_INC)/scope.h		\
+	$(PERL_INC)/sv.h		\
+	$(PERL_INC)/thrdvar.h		\
+	$(PERL_INC)/thread.h		\
+	$(PERL_INC)/unixish.h		\
+	$(PERL_INC)/util.h
+
+$(OBJECT) : $(PERL_HDRS)
+} if $self->{OBJECT};
+
+    push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n"  if %{$self->{XS}};
+
+    join "\n", @m;
+}
+
+
+=item perm_rw (o)
+
+Returns the attribute C<PERM_RW> or the string C<644>.
+Used as the string that is passed
+to the C<chmod> command to set the permissions for read/writeable files.
+MakeMaker chooses C<644> because it has turned out in the past that
+relying on the umask provokes hard-to-track bug reports.
+When the return value is used by the perl function C<chmod>, it is
+interpreted as an octal value.
+
+=cut
+
+sub perm_rw {
+    return shift->{PERM_RW};
+}
+
+=item perm_rwx (o)
+
+Returns the attribute C<PERM_RWX> or the string C<755>,
+i.e. the string that is passed
+to the C<chmod> command to set the permissions for executable files.
+See also perl_rw.
+
+=cut
+
+sub perm_rwx {
+    return shift->{PERM_RWX};
+}
+
+=item pm_to_blib
+
+Defines target that copies all files in the hash PM to their
+destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
+
+=cut
+
+sub pm_to_blib {
+    my $self = shift;
+    my($autodir) = $self->catdir('$(INST_LIB)','auto');
+    my $r = q{
+pm_to_blib : $(TO_INST_PM)
+};
+
+    my $pm_to_blib = $self->oneliner(<<CODE, ['-MExtUtils::Install']);
+pm_to_blib({\@ARGV}, '$autodir', '\$(PM_FILTER)')
+CODE
+
+    my @cmds = $self->split_command($pm_to_blib, %{$self->{PM}});
+
+    $r .= join '', map { "\t\$(NOECHO) $_\n" } @cmds;
+    $r .= qq{\t\$(NOECHO) \$(TOUCH) pm_to_blib\n};
+
+    return $r;
+}
+
+=item post_constants (o)
+
+Returns an empty string per default. Dedicated to overrides from
+within Makefile.PL after all constants have been defined.
+
+=cut
+
+sub post_constants{
+    "";
+}
+
+=item post_initialize (o)
+
+Returns an empty string per default. Used in Makefile.PLs to add some
+chunk of text to the Makefile after the object is initialized.
+
+=cut
+
+sub post_initialize {
+    "";
+}
+
+=item postamble (o)
+
+Returns an empty string. Can be used in Makefile.PLs to write some
+text to the Makefile at the end.
+
+=cut
+
+sub postamble {
+    "";
+}
+
+=item ppd
+
+Defines target that creates a PPD (Perl Package Description) file
+for a binary distribution.
+
+=cut
+
+sub ppd {
+    my($self) = @_;
+
+    if ($self->{ABSTRACT_FROM}){
+        $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
+            carp "WARNING: Setting ABSTRACT via file ".
+                 "'$self->{ABSTRACT_FROM}' failed\n";
+    }
+
+    my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0)x4)[0..3];
+
+    my $abstract = $self->{ABSTRACT} || '';
+    $abstract =~ s/\n/\\n/sg;
+    $abstract =~ s/</&lt;/g;
+    $abstract =~ s/>/&gt;/g;
+
+    my $author = $self->{AUTHOR} || '';
+    $author =~ s/</&lt;/g;
+    $author =~ s/>/&gt;/g;
+
+    my $ppd_xml = sprintf <<'PPD_HTML', $pack_ver, $abstract, $author;
+<SOFTPKG NAME="$(DISTNAME)" VERSION="%s">
+    <TITLE>$(DISTNAME)</TITLE>
+    <ABSTRACT>%s</ABSTRACT>
+    <AUTHOR>%s</AUTHOR>
+PPD_HTML
+
+    $ppd_xml .= "    <IMPLEMENTATION>\n";
+    foreach my $prereq (sort keys %{$self->{PREREQ_PM}}) {
+        my $pre_req = $prereq;
+        $pre_req =~ s/::/-/g;
+        my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), 
+                                  (0) x 4) [0 .. 3];
+        $ppd_xml .= sprintf <<'PPD_OUT', $pre_req, $dep_ver;
+        <DEPENDENCY NAME="%s" VERSION="%s" />
+PPD_OUT
+
+    }
+
+    $ppd_xml .= sprintf <<'PPD_OUT', $Config{archname};
+        <OS NAME="$(OSNAME)" />
+        <ARCHITECTURE NAME="%s" />
+PPD_OUT
+
+    if ($self->{PPM_INSTALL_SCRIPT}) {
+        if ($self->{PPM_INSTALL_EXEC}) {
+            $ppd_xml .= sprintf qq{        <INSTALL EXEC="%s">%s</INSTALL>\n},
+                  $self->{PPM_INSTALL_EXEC}, $self->{PPM_INSTALL_SCRIPT};
+        }
+        else {
+            $ppd_xml .= sprintf qq{        <INSTALL>%s</INSTALL>\n}, 
+                  $self->{PPM_INSTALL_SCRIPT};
+        }
+    }
+
+    my ($bin_location) = $self->{BINARY_LOCATION} || '';
+    $bin_location =~ s/\\/\\\\/g;
+
+    $ppd_xml .= sprintf <<'PPD_XML', $bin_location;
+        <CODEBASE HREF="%s" />
+    </IMPLEMENTATION>
+</SOFTPKG>
+PPD_XML
+
+    my @ppd_cmds = $self->echo($ppd_xml, '$(DISTNAME).ppd');
+
+    return sprintf <<'PPD_OUT', join "\n\t", @ppd_cmds;
+# Creates a PPD (Perl Package Description) for a binary distribution.
+ppd:
+	%s
+PPD_OUT
+
+}
+
+=item prefixify
+
+  $MM->prefixify($var, $prefix, $new_prefix, $default);
+
+Using either $MM->{uc $var} || $Config{lc $var}, it will attempt to
+replace it's $prefix with a $new_prefix.  
+
+Should the $prefix fail to match I<AND> a PREFIX was given as an
+argument to WriteMakefile() it will set it to the $new_prefix +
+$default.  This is for systems whose file layouts don't neatly fit into
+our ideas of prefixes.
+
+This is for heuristics which attempt to create directory structures
+that mirror those of the installed perl.
+
+For example:
+
+    $MM->prefixify('installman1dir', '/usr', '/home/foo', 'man/man1');
+
+this will attempt to remove '/usr' from the front of the
+$MM->{INSTALLMAN1DIR} path (initializing it to $Config{installman1dir}
+if necessary) and replace it with '/home/foo'.  If this fails it will
+simply use '/home/foo/man/man1'.
+
+=cut
+
+sub prefixify {
+    my($self,$var,$sprefix,$rprefix,$default) = @_;
+
+    my $path = $self->{uc $var} || 
+               $Config_Override{lc $var} || $Config{lc $var} || '';
+
+    $rprefix .= '/' if $sprefix =~ m|/$|;
+
+    print STDERR "  prefixify $var => $path\n" if $Verbose >= 2;
+    print STDERR "    from $sprefix to $rprefix\n" if $Verbose >= 2;
+
+    if( $self->{ARGS}{PREFIX} && $self->file_name_is_absolute($path) && 
+        $path !~ s{^\Q$sprefix\E\b}{$rprefix}s ) 
+    {
+
+        print STDERR "    cannot prefix, using default.\n" if $Verbose >= 2;
+        print STDERR "    no default!\n" if !$default && $Verbose >= 2;
+
+        $path = $self->catdir($rprefix, $default) if $default;
+    }
+
+    print "    now $path\n" if $Verbose >= 2;
+    return $self->{uc $var} = $path;
+}
+
+
+=item processPL (o)
+
+Defines targets to run *.PL files.
+
+=cut
+
+sub processPL {
+    my $self = shift;
+    my $pl_files = $self->{PL_FILES};
+
+    return "" unless $pl_files;
+
+    my $m = '';
+    foreach my $plfile (sort keys %$pl_files) {
+        my $list = ref($pl_files->{$plfile})
+                     ?  $pl_files->{$plfile}
+		     : [$pl_files->{$plfile}];
+
+	foreach my $target (@$list) {
+            if( $Is_VMS ) {
+                $plfile = vmsify($plfile);
+                $target = vmsify($target);
+            }
+
+	    # Normally a .PL file runs AFTER pm_to_blib so it can have
+	    # blib in its @INC and load the just built modules.  BUT if
+	    # the generated module is something in $(TO_INST_PM) which
+	    # pm_to_blib depends on then it can't depend on pm_to_blib
+	    # else we have a dependency loop.
+	    my $pm_dep;
+	    my $perlrun;
+	    if( defined $self->{PM}{$target} ) {
+		$pm_dep  = '';
+		$perlrun = 'PERLRUN';
+	    }
+	    else {
+		$pm_dep  = 'pm_to_blib';
+		$perlrun = 'PERLRUNINST';
+	    }
+
+            $m .= <<MAKE_FRAG;
+
+all :: $target
+	\$(NOECHO) \$(NOOP)
+
+$target :: $plfile $pm_dep
+	\$($perlrun) $plfile $target
+MAKE_FRAG
+
+	}
+    }
+
+    return $m;
+}
+
+=item quote_paren
+
+Backslashes parentheses C<()> in command line arguments.
+Doesn't handle recursive Makefile C<$(...)> constructs,
+but handles simple ones.
+
+=cut
+
+sub quote_paren {
+    my $arg = shift;
+    $arg =~ s{\$\((.+?)\)}{\$\\\\($1\\\\)}g;	# protect $(...)
+    $arg =~ s{(?<!\\)([()])}{\\$1}g;		# quote unprotected
+    $arg =~ s{\$\\\\\((.+?)\\\\\)}{\$($1)}g;	# unprotect $(...)
+    return $arg;
+}
+
+=item replace_manpage_separator
+
+  my $man_name = $MM->replace_manpage_separator($file_path);
+
+Takes the name of a package, which may be a nested package, in the
+form 'Foo/Bar.pm' and replaces the slash with C<::> or something else
+safe for a man page file name.  Returns the replacement.
+
+=cut
+
+sub replace_manpage_separator {
+    my($self,$man) = @_;
+
+    $man =~ s,/+,::,g;
+    return $man;
+}
+
+
+=item cd
+
+=cut
+
+sub cd {
+    my($self, $dir, @cmds) = @_;
+
+    # No leading tab and no trailing newline makes for easier embedding
+    my $make_frag = join "\n\t", map { "cd $dir && $_" } @cmds;
+
+    return $make_frag;
+}
+
+=item oneliner
+
+=cut
+
+sub oneliner {
+    my($self, $cmd, $switches) = @_;
+    $switches = [] unless defined $switches;
+
+    # Strip leading and trailing newlines
+    $cmd =~ s{^\n+}{};
+    $cmd =~ s{\n+$}{};
+
+    my @cmds = split /\n/, $cmd;
+    $cmd = join " \n\t  -e ", map $self->quote_literal($_), @cmds;
+    $cmd = $self->escape_newlines($cmd);
+
+    $switches = join ' ', @$switches;
+
+    return qq{\$(ABSPERLRUN) $switches -e $cmd};   
+}
+
+
+=item quote_literal
+
+=cut
+
+sub quote_literal {
+    my($self, $text) = @_;
+
+    # I think all we have to quote is single quotes and I think
+    # this is a safe way to do it.
+    $text =~ s{'}{'\\''}g;
+
+    return "'$text'";
+}
+
+
+=item escape_newlines
+
+=cut
+
+sub escape_newlines {
+    my($self, $text) = @_;
+
+    $text =~ s{\n}{\\\n}g;
+
+    return $text;
+}
+
+
+=item max_exec_len
+
+Using POSIX::ARG_MAX.  Otherwise falling back to 4096.
+
+=cut
+
+sub max_exec_len {
+    my $self = shift;
+
+    if (!defined $self->{_MAX_EXEC_LEN}) {
+        if (my $arg_max = eval { require POSIX;  &POSIX::ARG_MAX }) {
+            $self->{_MAX_EXEC_LEN} = $arg_max;
+        }
+        else {      # POSIX minimum exec size
+            $self->{_MAX_EXEC_LEN} = 4096;
+        }
+    }
+
+    return $self->{_MAX_EXEC_LEN};
+}
+
+
+=item static (o)
+
+Defines the static target.
+
+=cut
+
+sub static {
+# --- Static Loading Sections ---
+
+    my($self) = shift;
+    '
+## $(INST_PM) has been moved to the all: target.
+## It remains here for awhile to allow for old usage: "make static"
+static :: $(FIRST_MAKEFILE) $(INST_STATIC)
+	$(NOECHO) $(NOOP)
+';
+}
+
+=item static_lib (o)
+
+Defines how to produce the *.a (or equivalent) files.
+
+=cut
+
+sub static_lib {
+    my($self) = @_;
+    return '' unless $self->has_link_code;
+
+    my(@m);
+    push(@m, <<'END');
+
+$(INST_STATIC) : $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists
+	$(RM_RF) $@
+END
+
+    # If this extension has its own library (eg SDBM_File)
+    # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
+    push(@m, <<'MAKE_FRAG') if $self->{MYEXTLIB};
+	$(CP) $(MYEXTLIB) $@
+MAKE_FRAG
+
+    my $ar; 
+    if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
+        # Prefer the absolute pathed ar if available so that PATH
+        # doesn't confuse us.  Perl itself is built with the full_ar.  
+        $ar = 'FULL_AR';
+    } else {
+        $ar = 'AR';
+    }
+    push @m, sprintf <<'MAKE_FRAG', $ar;
+	$(%s) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
+	$(CHMOD) $(PERM_RWX) $@
+	$(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
+MAKE_FRAG
+
+    # Old mechanism - still available:
+    push @m, <<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS};
+	$(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
+MAKE_FRAG
+
+    join('', @m);
+}
+
+=item staticmake (o)
+
+Calls makeaperl.
+
+=cut
+
+sub staticmake {
+    my($self, %attribs) = @_;
+    my(@static);
+
+    my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP},  $self->{INST_ARCHLIB});
+
+    # And as it's not yet built, we add the current extension
+    # but only if it has some C code (or XS code, which implies C code)
+    if (@{$self->{C}}) {
+	@static = $self->catfile($self->{INST_ARCHLIB},
+				 "auto",
+				 $self->{FULLEXT},
+				 "$self->{BASEEXT}$self->{LIB_EXT}"
+				);
+    }
+
+    # Either we determine now, which libraries we will produce in the
+    # subdirectories or we do it at runtime of the make.
+
+    # We could ask all subdir objects, but I cannot imagine, why it
+    # would be necessary.
+
+    # Instead we determine all libraries for the new perl at
+    # runtime.
+    my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
+
+    $self->makeaperl(MAKE	=> $self->{MAKEFILE},
+		     DIRS	=> \@searchdirs,
+		     STAT	=> \@static,
+		     INCL	=> \@perlinc,
+		     TARGET	=> $self->{MAP_TARGET},
+		     TMP	=> "",
+		     LIBPERL	=> $self->{LIBPERL_A}
+		    );
+}
+
+=item subdir_x (o)
+
+Helper subroutine for subdirs
+
+=cut
+
+sub subdir_x {
+    my($self, $subdir) = @_;
+
+    my $subdir_cmd = $self->cd($subdir, 
+      '$(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) all $(PASTHRU)'
+    );
+    return sprintf <<'EOT', $subdir_cmd;
+
+subdirs ::
+	$(NOECHO) %s
+EOT
+
+}
+
+=item subdirs (o)
+
+Defines targets to process subdirectories.
+
+=cut
+
+sub subdirs {
+# --- Sub-directory Sections ---
+    my($self) = shift;
+    my(@m,$dir);
+    # This method provides a mechanism to automatically deal with
+    # subdirectories containing further Makefile.PL scripts.
+    # It calls the subdir_x() method for each subdirectory.
+    foreach $dir (@{$self->{DIR}}){
+	push(@m, $self->subdir_x($dir));
+####	print "Including $dir subdirectory\n";
+    }
+    if (@m){
+	unshift(@m, "
+# The default clean, realclean and test targets in this Makefile
+# have automatically been given entries for each subdir.
+
+");
+    } else {
+	push(@m, "\n# none")
+    }
+    join('',@m);
+}
+
+=item test (o)
+
+Defines the test targets.
+
+=cut
+
+sub test {
+# --- Test and Installation Sections ---
+
+    my($self, %attribs) = @_;
+    my $tests = $attribs{TESTS} || '';
+    if (!$tests && -d 't') {
+        $tests = $self->find_tests;
+    }
+    # note: 'test.pl' name is also hardcoded in init_dirscan()
+    my(@m);
+    push(@m,"
+TEST_VERBOSE=0
+TEST_TYPE=test_\$(LINKTYPE)
+TEST_FILE = test.pl
+TEST_FILES = $tests
+TESTDB_SW = -d
+
+testdb :: testdb_\$(LINKTYPE)
+
+test :: \$(TEST_TYPE)
+");
+
+    foreach my $dir (@{ $self->{DIR} }) {
+        my $test = $self->oneliner(sprintf <<'CODE', $dir);
+chdir '%s';  
+system '$(MAKE) test $(PASTHRU)' 
+    if -f '$(FIRST_MAKEFILE)';
+CODE
+
+        push(@m, "\t\$(NOECHO) $test\n");
+    }
+
+    push(@m, "\t\$(NOECHO) \$(ECHO) 'No tests defined for \$(NAME) extension.'\n")
+	unless $tests or -f "test.pl" or @{$self->{DIR}};
+    push(@m, "\n");
+
+    push(@m, "test_dynamic :: pure_all\n");
+    push(@m, $self->test_via_harness('$(FULLPERLRUN)', '$(TEST_FILES)')) 
+      if $tests;
+    push(@m, $self->test_via_script('$(FULLPERLRUN)', '$(TEST_FILE)')) 
+      if -f "test.pl";
+    push(@m, "\n");
+
+    push(@m, "testdb_dynamic :: pure_all\n");
+    push(@m, $self->test_via_script('$(FULLPERLRUN) $(TESTDB_SW)', 
+                                    '$(TEST_FILE)'));
+    push(@m, "\n");
+
+    # Occasionally we may face this degenerate target:
+    push @m, "test_ : test_dynamic\n\n";
+
+    if ($self->needs_linking()) {
+	push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
+	push(@m, $self->test_via_harness('./$(MAP_TARGET)', '$(TEST_FILES)')) if $tests;
+	push(@m, $self->test_via_script('./$(MAP_TARGET)', '$(TEST_FILE)')) if -f "test.pl";
+	push(@m, "\n");
+	push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
+	push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
+	push(@m, "\n");
+    } else {
+	push @m, "test_static :: test_dynamic\n";
+	push @m, "testdb_static :: testdb_dynamic\n";
+    }
+    join("", @m);
+}
+
+=item test_via_harness (override)
+
+For some reason which I forget, Unix machines like to have
+PERL_DL_NONLAZY set for tests.
+
+=cut
+
+sub test_via_harness {
+    my($self, $perl, $tests) = @_;
+    return $self->SUPER::test_via_harness("PERL_DL_NONLAZY=1 $perl", $tests);
+}
+
+=item test_via_script (override)
+
+Again, the PERL_DL_NONLAZY thing.
+
+=cut
+
+sub test_via_script {
+    my($self, $perl, $script) = @_;
+    return $self->SUPER::test_via_script("PERL_DL_NONLAZY=1 $perl", $script);
+}
+
+
+=item tools_other (o)
+
+    my $make_frag = $MM->tools_other;
+
+Returns a make fragment containing definitions for the macros init_others() 
+initializes.
+
+=cut
+
+sub tools_other {
+    my($self) = shift;
+    my @m;
+
+    # We set PM_FILTER as late as possible so it can see all the earlier
+    # on macro-order sensitive makes such as nmake.
+    for my $tool (qw{ SHELL CHMOD CP MV NOOP NOECHO RM_F RM_RF TEST_F TOUCH 
+                      UMASK_NULL DEV_NULL MKPATH EQUALIZE_TIMESTAMP 
+                      ECHO ECHO_N
+                      UNINST VERBINST
+                      MOD_INSTALL DOC_INSTALL UNINSTALL
+                      WARN_IF_OLD_PACKLIST
+		      MACROSTART MACROEND
+                      USEMAKEFILE
+                      PM_FILTER
+                      FIXIN
+                    } ) 
+    {
+        next unless defined $self->{$tool};
+        push @m, "$tool = $self->{$tool}\n";
+    }
+
+    return join "", @m;
+}
+
+=item tool_xsubpp (o)
+
+Determines typemaps, xsubpp version, prototype behaviour.
+
+=cut
+
+sub tool_xsubpp {
+    my($self) = shift;
+    return "" unless $self->needs_linking;
+
+    my $xsdir;
+    my @xsubpp_dirs = @INC;
+
+    # Make sure we pick up the new xsubpp if we're building perl.
+    unshift @xsubpp_dirs, $self->{PERL_LIB} if $self->{PERL_CORE};
+
+    foreach my $dir (@xsubpp_dirs) {
+        $xsdir = $self->catdir($dir, 'ExtUtils');
+        if( -r $self->catfile($xsdir, "xsubpp") ) {
+            last;
+        }
+    }
+
+    my $tmdir   = File::Spec->catdir($self->{PERL_LIB},"ExtUtils");
+    my(@tmdeps) = $self->catfile($tmdir,'typemap');
+    if( $self->{TYPEMAPS} ){
+	my $typemap;
+	foreach $typemap (@{$self->{TYPEMAPS}}){
+		if( ! -f  $typemap ){
+			warn "Typemap $typemap not found.\n";
+		}
+		else{
+			push(@tmdeps,  $typemap);
+		}
+	}
+    }
+    push(@tmdeps, "typemap") if -f "typemap";
+    my(@tmargs) = map("-typemap $_", @tmdeps);
+    if( exists $self->{XSOPT} ){
+ 	unshift( @tmargs, $self->{XSOPT} );
+    }
+
+    if ($Is_VMS                          &&
+        $Config{'ldflags'}               && 
+        $Config{'ldflags'} =~ m!/Debug!i &&
+        (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)
+       ) 
+    {
+        unshift(@tmargs,'-nolinenumbers');
+    }
+
+
+    $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
+
+    return qq{
+XSUBPPDIR = $xsdir
+XSUBPP = \$(XSUBPPDIR)\$(DFSEP)xsubpp
+XSUBPPRUN = \$(PERLRUN) \$(XSUBPP)
+XSPROTOARG = $self->{XSPROTOARG}
+XSUBPPDEPS = @tmdeps \$(XSUBPP)
+XSUBPPARGS = @tmargs
+XSUBPP_EXTRA_ARGS = 
+};
+};
+
+
+=item all_target
+
+Build man pages, too
+
+=cut
+
+sub all_target {
+    my $self = shift;
+
+    return <<'MAKE_EXT';
+all :: pure_all manifypods
+	$(NOECHO) $(NOOP)
+MAKE_EXT
+}
+
+=item top_targets (o)
+
+Defines the targets all, subdirs, config, and O_FILES
+
+=cut
+
+sub top_targets {
+# --- Target Sections ---
+
+    my($self) = shift;
+    my(@m);
+
+    push @m, $self->all_target, "\n" unless $self->{SKIPHASH}{'all'};
+
+    push @m, '
+pure_all :: config pm_to_blib subdirs linkext
+	$(NOECHO) $(NOOP)
+
+subdirs :: $(MYEXTLIB)
+	$(NOECHO) $(NOOP)
+
+config :: $(FIRST_MAKEFILE) blibdirs
+	$(NOECHO) $(NOOP)
+';
+
+    push @m, '
+$(O_FILES): $(H_FILES)
+' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
+
+    push @m, q{
+help :
+	perldoc ExtUtils::MakeMaker
+};
+
+    join('',@m);
+}
+
+=item writedoc
+
+Obsolete, deprecated method. Not used since Version 5.21.
+
+=cut
+
+sub writedoc {
+# --- perllocal.pod section ---
+    my($self,$what,$name,@attribs)=@_;
+    my $time = localtime;
+    print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
+    print join "\n\n=item *\n\n", map("C<$_>",@attribs);
+    print "\n\n=back\n\n";
+}
+
+=item xs_c (o)
+
+Defines the suffix rules to compile XS files to C.
+
+=cut
+
+sub xs_c {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xs.c:
+	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
+';
+}
+
+=item xs_cpp (o)
+
+Defines the suffix rules to compile XS files to C++.
+
+=cut
+
+sub xs_cpp {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xs.cpp:
+	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp
+';
+}
+
+=item xs_o (o)
+
+Defines suffix rules to go from XS to object files directly. This is
+only intended for broken make implementations.
+
+=cut
+
+sub xs_o {	# many makes are too dumb to use xs_c then c_o
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xs$(OBJ_EXT):
+	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
+	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c
+';
+}
+
+
+1;
+
+=back
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
+__END__
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_VMS.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_VMS.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_VMS.pm	(revision 14489)
@@ -0,0 +1,1953 @@
+package ExtUtils::MM_VMS;
+
+use strict;
+
+use ExtUtils::MakeMaker::Config;
+require Exporter;
+
+BEGIN {
+    # so we can compile the thing on non-VMS platforms.
+    if( $^O eq 'VMS' ) {
+        require VMS::Filespec;
+        VMS::Filespec->import;
+    }
+}
+
+use File::Basename;
+
+# $Revision can't be on the same line or SVN/K gets confused
+use vars qw($Revision
+            $VERSION @ISA);
+$VERSION = '5.73';
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+
+use ExtUtils::MakeMaker qw($Verbose neatvalue);
+$Revision = $ExtUtils::MakeMaker::Revision;
+
+
+=head1 NAME
+
+ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+  Do not use this directly.
+  Instead, use ExtUtils::MM and it will figure out which MM_*
+  class to use for you.
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=head2 Methods always loaded
+
+=over 4
+
+=item wraplist
+
+Converts a list into a string wrapped at approximately 80 columns.
+
+=cut
+
+sub wraplist {
+    my($self) = shift;
+    my($line,$hlen) = ('',0);
+
+    foreach my $word (@_) {
+      # Perl bug -- seems to occasionally insert extra elements when
+      # traversing array (scalar(@array) doesn't show them, but
+      # foreach(@array) does) (5.00307)
+      next unless $word =~ /\w/;
+      $line .= ' ' if length($line);
+      if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
+      $line .= $word;
+      $hlen += length($word) + 2;
+    }
+    $line;
+}
+
+
+# This isn't really an override.  It's just here because ExtUtils::MM_VMS
+# appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
+# in MM_VMS, then AUTOLOAD is called, and bad things happen.  So, we just
+# mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
+# XXX This hackery will die soon. --Schwern
+sub ext {
+    require ExtUtils::Liblist::Kid;
+    goto &ExtUtils::Liblist::Kid::ext;
+}
+
+=back
+
+=head2 Methods
+
+Those methods which override default MM_Unix methods are marked
+"(override)", while methods unique to MM_VMS are marked "(specific)".
+For overridden methods, documentation is limited to an explanation
+of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
+documentation for more details.
+
+=over 4
+
+=item guess_name (override)
+
+Try to determine name of extension being built.  We begin with the name
+of the current directory.  Since VMS filenames are case-insensitive,
+however, we look for a F<.pm> file whose name matches that of the current
+directory (presumably the 'main' F<.pm> file for this extension), and try
+to find a C<package> statement from which to obtain the Mixed::Case
+package name.
+
+=cut
+
+sub guess_name {
+    my($self) = @_;
+    my($defname,$defpm,@pm,%xs,$pm);
+    local *PM;
+
+    $defname = basename(fileify($ENV{'DEFAULT'}));
+    $defname =~ s![\d\-_]*\.dir.*$!!;  # Clip off .dir;1 suffix, and package version
+    $defpm = $defname;
+    # Fallback in case for some reason a user has copied the files for an
+    # extension into a working directory whose name doesn't reflect the
+    # extension's name.  We'll use the name of a unique .pm file, or the
+    # first .pm file with a matching .xs file.
+    if (not -e "${defpm}.pm") {
+      @pm = map { s/.pm$//; $_ } glob('*.pm');
+      if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
+      elsif (@pm) {
+        %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
+        if (keys %xs) { 
+            foreach $pm (@pm) { 
+                $defpm = $pm, last if exists $xs{$pm}; 
+            } 
+        }
+      }
+    }
+    if (open(PM,"${defpm}.pm")){
+        while (<PM>) {
+            if (/^\s*package\s+([^;]+)/i) {
+                $defname = $1;
+                last;
+            }
+        }
+        print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
+                     "defaulting package name to $defname\n"
+            if eof(PM);
+        close PM;
+    }
+    else {
+        print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
+                     "defaulting package name to $defname\n";
+    }
+    $defname =~ s#[\d.\-_]+$##;
+    $defname;
+}
+
+=item find_perl (override)
+
+Use VMS file specification syntax and CLI commands to find and
+invoke Perl images.
+
+=cut
+
+sub find_perl {
+    my($self, $ver, $names, $dirs, $trace) = @_;
+    my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
+    my($rslt);
+    my($inabs) = 0;
+    local *TCF;
+
+    if( $self->{PERL_CORE} ) {
+        # Check in relative directories first, so we pick up the current
+        # version of Perl if we're running MakeMaker as part of the main build.
+        @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
+                        my($absb) = $self->file_name_is_absolute($b);
+                        if ($absa && $absb) { return $a cmp $b }
+                        else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
+                      } @$dirs;
+        # Check miniperl before perl, and check names likely to contain
+        # version numbers before "generic" names, so we pick up an
+        # executable that's less likely to be from an old installation.
+        @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!;  # basename
+                         my($bb) = $b =~ m!([^:>\]/]+)$!;
+                         my($ahasdir) = (length($a) - length($ba) > 0);
+                         my($bhasdir) = (length($b) - length($bb) > 0);
+                         if    ($ahasdir and not $bhasdir) { return 1; }
+                         elsif ($bhasdir and not $ahasdir) { return -1; }
+                         else { $bb =~ /\d/ <=> $ba =~ /\d/
+                                  or substr($ba,0,1) cmp substr($bb,0,1)
+                                  or length($bb) <=> length($ba) } } @$names;
+    }
+    else {
+        @sdirs  = @$dirs;
+        @snames = @$names;
+    }
+
+    # Image names containing Perl version use '_' instead of '.' under VMS
+    foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
+    if ($trace >= 2){
+	print "Looking for perl $ver by these names:\n";
+	print "\t@snames,\n";
+	print "in these dirs:\n";
+	print "\t@sdirs\n";
+    }
+    foreach $dir (@sdirs){
+	next unless defined $dir; # $self->{PERL_SRC} may be undefined
+	$inabs++ if $self->file_name_is_absolute($dir);
+	if ($inabs == 1) {
+	    # We've covered relative dirs; everything else is an absolute
+	    # dir (probably an installed location).  First, we'll try potential
+	    # command names, to see whether we can avoid a long MCR expression.
+	    foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
+	    $inabs++; # Should happen above in next $dir, but just in case . . .
+	}
+	foreach $name (@snames){
+	    if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); }
+	    else                     { push(@cand,$self->fixpath($name,0));    }
+	}
+    }
+    foreach $name (@cand) {
+	print "Checking $name\n" if ($trace >= 2);
+	# If it looks like a potential command, try it without the MCR
+        if ($name =~ /^[\w\-\$]+$/) {
+            open(TCF,">temp_mmvms.com") || die('unable to open temp file');
+            print TCF "\$ set message/nofacil/nosever/noident/notext\n";
+            print TCF "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
+            close TCF;
+            $rslt = `\@temp_mmvms.com` ;
+            unlink('temp_mmvms.com');
+            if ($rslt =~ /VER_OK/) {
+                print "Using PERL=$name\n" if $trace;
+                return $name;
+            }
+        }
+	next unless $vmsfile = $self->maybe_command($name);
+	$vmsfile =~ s/;[\d\-]*$//;  # Clip off version number; we can use a newer version as well
+	print "Executing $vmsfile\n" if ($trace >= 2);
+        open(TCF,">temp_mmvms.com") || die('unable to open temp file');
+        print TCF "\$ set message/nofacil/nosever/noident/notext\n";
+        print TCF "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
+        close TCF;
+        $rslt = `\@temp_mmvms.com`;
+        unlink('temp_mmvms.com');
+        if ($rslt =~ /VER_OK/) {
+	    print "Using PERL=MCR $vmsfile\n" if $trace;
+	    return "MCR $vmsfile";
+	}
+    }
+    print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
+    0; # false and not empty
+}
+
+=item maybe_command (override)
+
+Follows VMS naming conventions for executable files.
+If the name passed in doesn't exactly match an executable file,
+appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
+to check for DCL procedure.  If this fails, checks directories in DCL$PATH
+and finally F<Sys$System:> for an executable file having the name specified,
+with or without the F<.Exe>-equivalent suffix.
+
+=cut
+
+sub maybe_command {
+    my($self,$file) = @_;
+    return $file if -x $file && ! -d _;
+    my(@dirs) = ('');
+    my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
+    my($dir,$ext);
+    if ($file !~ m![/:>\]]!) {
+	for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
+	    $dir = $ENV{"DCL\$PATH;$i"};
+	    $dir .= ':' unless $dir =~ m%[\]:]$%;
+	    push(@dirs,$dir);
+	}
+	push(@dirs,'Sys$System:');
+	foreach $dir (@dirs) {
+	    my $sysfile = "$dir$file";
+	    foreach $ext (@exts) {
+		return $file if -x "$sysfile$ext" && ! -d _;
+	    }
+	}
+    }
+    return 0;
+}
+
+
+=item pasthru (override)
+
+VMS has $(MMSQUALIFIERS) which is a listing of all the original command line
+options.  This is used in every invokation of make in the VMS Makefile so
+PASTHRU should not be necessary.  Using PASTHRU tends to blow commands past
+the 256 character limit.
+
+=cut
+
+sub pasthru {
+    return "PASTHRU=\n";
+}
+
+
+=item pm_to_blib (override)
+
+VMS wants a dot in every file so we can't have one called 'pm_to_blib',
+it becomes 'pm_to_blib.' and MMS/K isn't smart enough to know that when
+you have a target called 'pm_to_blib' it should look for 'pm_to_blib.'.
+
+So in VMS its pm_to_blib.ts.
+
+=cut
+
+sub pm_to_blib {
+    my $self = shift;
+
+    my $make = $self->SUPER::pm_to_blib;
+
+    $make =~ s{^pm_to_blib :}{pm_to_blib.ts :}m;
+    $make =~ s{\$\(TOUCH\) pm_to_blib}{\$(TOUCH) pm_to_blib.ts};
+
+    $make = <<'MAKE' . $make;
+# Dummy target to match Unix target name; we use pm_to_blib.ts as
+# timestamp file to avoid repeated invocations under VMS
+pm_to_blib : pm_to_blib.ts
+	$(NOECHO) $(NOOP)
+
+MAKE
+
+    return $make;
+}
+
+
+=item perl_script (override)
+
+If name passed in doesn't specify a readable file, appends F<.com> or
+F<.pl> and tries again, since it's customary to have file types on all files
+under VMS.
+
+=cut
+
+sub perl_script {
+    my($self,$file) = @_;
+    return $file if -r $file && ! -d _;
+    return "$file.com" if -r "$file.com";
+    return "$file.pl" if -r "$file.pl";
+    return '';
+}
+
+
+=item replace_manpage_separator
+
+Use as separator a character which is legal in a VMS-syntax file name.
+
+=cut
+
+sub replace_manpage_separator {
+    my($self,$man) = @_;
+    $man = unixify($man);
+    $man =~ s#/+#__#g;
+    $man;
+}
+
+=item init_DEST
+
+(override) Because of the difficulty concatenating VMS filepaths we
+must pre-expand the DEST* variables.
+
+=cut
+
+sub init_DEST {
+    my $self = shift;
+
+    $self->SUPER::init_DEST;
+
+    # Expand DEST variables.
+    foreach my $var ($self->installvars) {
+        my $destvar = 'DESTINSTALL'.$var;
+        $self->{$destvar} = File::Spec->eliminate_macros($self->{$destvar});
+    }
+}
+
+
+=item init_DIRFILESEP
+
+No seperator between a directory path and a filename on VMS.
+
+=cut
+
+sub init_DIRFILESEP {
+    my($self) = shift;
+
+    $self->{DIRFILESEP} = '';
+    return 1;
+}
+
+
+=item init_main (override)
+
+
+=cut
+
+sub init_main {
+    my($self) = shift;
+
+    $self->SUPER::init_main;
+
+    $self->{DEFINE} ||= '';
+    if ($self->{DEFINE} ne '') {
+        my(@terms) = split(/\s+/,$self->{DEFINE});
+        my(@defs,@udefs);
+        foreach my $def (@terms) {
+            next unless $def;
+            my $targ = \@defs;
+            if ($def =~ s/^-([DU])//) {    # If it was a Unix-style definition
+                $targ = \@udefs if $1 eq 'U';
+                $def =~ s/='(.*)'$/=$1/;  # then remove shell-protection ''
+                $def =~ s/^'(.*)'$/$1/;   # from entire term or argument
+            }
+            if ($def =~ /=/) {
+                $def =~ s/"/""/g;  # Protect existing " from DCL
+                $def = qq["$def"]; # and quote to prevent parsing of =
+            }
+            push @$targ, $def;
+        }
+
+        $self->{DEFINE} = '';
+        if (@defs)  { 
+            $self->{DEFINE}  = '/Define=(' . join(',',@defs)  . ')'; 
+        }
+        if (@udefs) { 
+            $self->{DEFINE} .= '/Undef=('  . join(',',@udefs) . ')'; 
+        }
+    }
+}
+
+=item init_others (override)
+
+Provide VMS-specific forms of various utility commands, then hand
+off to the default MM_Unix method.
+
+DEV_NULL should probably be overriden with something.
+
+Also changes EQUALIZE_TIMESTAMP to set revision date of target file to
+one second later than source file, since MMK interprets precisely
+equal revision dates for a source and target file as a sign that the
+target needs to be updated.
+
+=cut
+
+sub init_others {
+    my($self) = @_;
+
+    $self->{NOOP}               = 'Continue';
+    $self->{NOECHO}             ||= '@ ';
+
+    $self->{MAKEFILE}           ||= 'Descrip.MMS';
+    $self->{FIRST_MAKEFILE}     ||= $self->{MAKEFILE};
+    $self->{MAKE_APERL_FILE}    ||= 'Makeaperl.MMS';
+    $self->{MAKEFILE_OLD}       ||= '$(FIRST_MAKEFILE)_old';
+
+    $self->{MACROSTART}         ||= '/Macro=(';
+    $self->{MACROEND}           ||= ')';
+    $self->{USEMAKEFILE}        ||= '/Descrip=';
+
+    $self->{ECHO}     ||= '$(ABSPERLRUN) -le "print qq{@ARGV}"';
+    $self->{ECHO_N}   ||= '$(ABSPERLRUN) -e  "print qq{@ARGV}"';
+    $self->{TOUCH}    ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e touch';
+    $self->{CHMOD}    ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e chmod'; 
+    $self->{RM_F}     ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e rm_f';
+    $self->{RM_RF}    ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e rm_rf';
+    $self->{TEST_F}   ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e test_f';
+    $self->{EQUALIZE_TIMESTAMP} ||= '$(ABSPERLRUN) -we "open F,qq{>>$ARGV[1]};close F;utime(0,(stat($ARGV[0]))[9]+1,$ARGV[1])"';
+
+    $self->{MOD_INSTALL} ||= 
+      $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
+install({split(' ',<STDIN>)}, '$(VERBINST)', 0, '$(UNINST)');
+CODE
+
+    $self->{SHELL}    ||= 'Posix';
+
+    $self->SUPER::init_others;
+
+    # So we can copy files into directories with less fuss
+    $self->{CP}         = '$(ABSPERLRUN) "-MExtUtils::Command" -e cp';
+    $self->{MV}         = '$(ABSPERLRUN) "-MExtUtils::Command" -e mv';
+
+    $self->{UMASK_NULL} = '! ';  
+
+    # Redirection on VMS goes before the command, not after as on Unix.
+    # $(DEV_NULL) is used once and its not worth going nuts over making
+    # it work.  However, Unix's DEV_NULL is quite wrong for VMS.
+    $self->{DEV_NULL}   = '';
+
+    if ($self->{OBJECT} =~ /\s/) {
+        $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
+        $self->{OBJECT} = $self->wraplist(
+            map $self->fixpath($_,0), split /,?\s+/, $self->{OBJECT}
+        );
+    }
+
+    $self->{LDFROM} = $self->wraplist(
+        map $self->fixpath($_,0), split /,?\s+/, $self->{LDFROM}
+    );
+}
+
+
+=item init_platform (override)
+
+Add PERL_VMS, MM_VMS_REVISION and MM_VMS_VERSION.
+
+MM_VMS_REVISION is for backwards compatibility before MM_VMS had a
+$VERSION.
+
+=cut
+
+sub init_platform {
+    my($self) = shift;
+
+    $self->{MM_VMS_REVISION} = $Revision;
+    $self->{MM_VMS_VERSION}  = $VERSION;
+    $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC}, 'VMS')
+      if $self->{PERL_SRC};
+}
+
+
+=item platform_constants
+
+=cut
+
+sub platform_constants {
+    my($self) = shift;
+    my $make_frag = '';
+
+    foreach my $macro (qw(PERL_VMS MM_VMS_REVISION MM_VMS_VERSION))
+    {
+        next unless defined $self->{$macro};
+        $make_frag .= "$macro = $self->{$macro}\n";
+    }
+
+    return $make_frag;
+}
+
+
+=item init_VERSION (override)
+
+Override the *DEFINE_VERSION macros with VMS semantics.  Translate the
+MAKEMAKER filepath to VMS style.
+
+=cut
+
+sub init_VERSION {
+    my $self = shift;
+
+    $self->SUPER::init_VERSION;
+
+    $self->{DEFINE_VERSION}    = '"$(VERSION_MACRO)=""$(VERSION)"""';
+    $self->{XS_DEFINE_VERSION} = '"$(XS_VERSION_MACRO)=""$(XS_VERSION)"""';
+    $self->{MAKEMAKER} = vmsify($INC{'ExtUtils/MakeMaker.pm'});
+}
+
+
+=item constants (override)
+
+Fixes up numerous file and directory macros to insure VMS syntax
+regardless of input syntax.  Also makes lists of files
+comma-separated.
+
+=cut
+
+sub constants {
+    my($self) = @_;
+
+    # Be kind about case for pollution
+    for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
+
+    # Cleanup paths for directories in MMS macros.
+    foreach my $macro ( qw [
+            INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB 
+            PERL_LIB PERL_ARCHLIB
+            PERL_INC PERL_SRC ],
+                        (map { 'INSTALL'.$_ } $self->installvars)
+                      ) 
+    {
+        next unless defined $self->{$macro};
+        next if $macro =~ /MAN/ && $self->{$macro} eq 'none';
+        $self->{$macro} = $self->fixpath($self->{$macro},1);
+    }
+
+    # Cleanup paths for files in MMS macros.
+    foreach my $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKEFILE_OLD 
+                           MAKE_APERL_FILE MYEXTLIB] ) 
+    {
+        next unless defined $self->{$macro};
+        $self->{$macro} = $self->fixpath($self->{$macro},0);
+    }
+
+    # Fixup files for MMS macros
+    # XXX is this list complete?
+    for my $macro (qw/
+                   FULLEXT VERSION_FROM OBJECT LDFROM
+	      /	) {
+        next unless defined $self->{$macro};
+        $self->{$macro} = $self->fixpath($self->{$macro},0);
+    }
+
+
+    for my $macro (qw/ XS MAN1PODS MAN3PODS PM /) {
+        # Where is the space coming from? --jhi
+        next unless $self ne " " && defined $self->{$macro};
+        my %tmp = ();
+        for my $key (keys %{$self->{$macro}}) {
+            $tmp{$self->fixpath($key,0)} = 
+                                     $self->fixpath($self->{$macro}{$key},0);
+        }
+        $self->{$macro} = \%tmp;
+    }
+
+    for my $macro (qw/ C O_FILES H /) {
+        next unless defined $self->{$macro};
+        my @tmp = ();
+        for my $val (@{$self->{$macro}}) {
+            push(@tmp,$self->fixpath($val,0));
+        }
+        $self->{$macro} = \@tmp;
+    }
+
+    # mms/k does not define a $(MAKE) macro.
+    $self->{MAKE} = '$(MMS)$(MMSQUALIFIERS)';
+
+    return $self->SUPER::constants;
+}
+
+
+=item special_targets
+
+Clear the default .SUFFIXES and put in our own list.
+
+=cut
+
+sub special_targets {
+    my $self = shift;
+
+    my $make_frag .= <<'MAKE_FRAG';
+.SUFFIXES :
+.SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs
+
+MAKE_FRAG
+
+    return $make_frag;
+}
+
+=item cflags (override)
+
+Bypass shell script and produce qualifiers for CC directly (but warn
+user if a shell script for this extension exists).  Fold multiple
+/Defines into one, since some C compilers pay attention to only one
+instance of this qualifier on the command line.
+
+=cut
+
+sub cflags {
+    my($self,$libperl) = @_;
+    my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
+    my($definestr,$undefstr,$flagoptstr) = ('','','');
+    my($incstr) = '/Include=($(PERL_INC)';
+    my($name,$sys,@m);
+
+    ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
+    print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
+         " required to modify CC command for $self->{'BASEEXT'}\n"
+    if ($Config{$name});
+
+    if ($quals =~ / -[DIUOg]/) {
+	while ($quals =~ / -([Og])(\d*)\b/) {
+	    my($type,$lvl) = ($1,$2);
+	    $quals =~ s/ -$type$lvl\b\s*//;
+	    if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
+	    else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
+	}
+	while ($quals =~ / -([DIU])(\S+)/) {
+	    my($type,$def) = ($1,$2);
+	    $quals =~ s/ -$type$def\s*//;
+	    $def =~ s/"/""/g;
+	    if    ($type eq 'D') { $definestr .= qq["$def",]; }
+	    elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
+	    else                 { $undefstr  .= qq["$def",]; }
+	}
+    }
+    if (length $quals and $quals !~ m!/!) {
+	warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
+	$quals = '';
+    }
+    $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
+    if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
+    if (length $undefstr)  { chop($undefstr);  $quals .= "/Undef=($undefstr)";   }
+    # Deal with $self->{DEFINE} here since some C compilers pay attention
+    # to only one /Define clause on command line, so we have to
+    # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
+    # ($self->{DEFINE} has already been VMSified in constants() above)
+    if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
+    for my $type (qw(Def Undef)) {
+	my(@terms);
+	while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
+		my $term = $1;
+		$term =~ s:^\((.+)\)$:$1:;
+		push @terms, $term;
+	    }
+	if ($type eq 'Def') {
+	    push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
+	}
+	if (@terms) {
+	    $quals =~ s:/${type}i?n?e?=[^/]+::ig;
+	    $quals .= "/${type}ine=(" . join(',',@terms) . ')';
+	}
+    }
+
+    $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
+
+    # Likewise with $self->{INC} and /Include
+    if ($self->{'INC'}) {
+	my(@includes) = split(/\s+/,$self->{INC});
+	foreach (@includes) {
+	    s/^-I//;
+	    $incstr .= ','.$self->fixpath($_,1);
+	}
+    }
+    $quals .= "$incstr)";
+#    $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
+    $self->{CCFLAGS} = $quals;
+
+    $self->{PERLTYPE} ||= '';
+
+    $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
+    if ($self->{OPTIMIZE} !~ m!/!) {
+	if    ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
+	elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
+	    $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
+	}
+	else {
+	    warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
+	    $self->{OPTIMIZE} = '/Optimize';
+	}
+    }
+
+    return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+};
+}
+
+=item const_cccmd (override)
+
+Adds directives to point C preprocessor to the right place when
+handling #include E<lt>sys/foo.hE<gt> directives.  Also constructs CC
+command line a bit differently than MM_Unix method.
+
+=cut
+
+sub const_cccmd {
+    my($self,$libperl) = @_;
+    my(@m);
+
+    return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
+    return '' unless $self->needs_linking();
+    if ($Config{'vms_cc_type'} eq 'gcc') {
+        push @m,'
+.FIRST
+	',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
+    }
+    elsif ($Config{'vms_cc_type'} eq 'vaxc') {
+        push @m,'
+.FIRST
+	',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
+	',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
+    }
+    else {
+        push @m,'
+.FIRST
+	',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
+		($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
+	',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
+    }
+
+    push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
+
+    $self->{CONST_CCCMD} = join('',@m);
+}
+
+
+=item tools_other (override)
+
+Throw in some dubious extra macros for Makefile args.
+
+Also keep around the old $(SAY) macro in case somebody's using it.
+
+=cut
+
+sub tools_other {
+    my($self) = @_;
+
+    # XXX Are these necessary?  Does anyone override them?  They're longer
+    # than just typing the literal string.
+    my $extra_tools = <<'EXTRA_TOOLS';
+
+# Just in case anyone is using the old macro.
+USEMACROS = $(MACROSTART)
+SAY = $(ECHO)
+
+EXTRA_TOOLS
+
+    return $self->SUPER::tools_other . $extra_tools;
+}
+
+=item init_dist (override)
+
+VMSish defaults for some values.
+
+  macro         description                     default
+
+  ZIPFLAGS      flags to pass to ZIP            -Vu
+
+  COMPRESS      compression command to          gzip
+                use for tarfiles
+  SUFFIX        suffix to put on                -gz 
+                compressed files
+
+  SHAR          shar command to use             vms_share
+
+  DIST_DEFAULT  default target to use to        tardist
+                create a distribution
+
+  DISTVNAME     Use VERSION_SYM instead of      $(DISTNAME)-$(VERSION_SYM)
+                VERSION for the name
+
+=cut
+
+sub init_dist {
+    my($self) = @_;
+    $self->{ZIPFLAGS}     ||= '-Vu';
+    $self->{COMPRESS}     ||= 'gzip';
+    $self->{SUFFIX}       ||= '-gz';
+    $self->{SHAR}         ||= 'vms_share';
+    $self->{DIST_DEFAULT} ||= 'zipdist';
+
+    $self->SUPER::init_dist;
+
+    $self->{DISTVNAME}    = "$self->{DISTNAME}-$self->{VERSION_SYM}";
+}
+
+=item c_o (override)
+
+Use VMS syntax on command line.  In particular, $(DEFINE) and
+$(PERL_INC) have been pulled into $(CCCMD).  Also use MM[SK] macros.
+
+=cut
+
+sub c_o {
+    my($self) = @_;
+    return '' unless $self->needs_linking();
+    '
+.c$(OBJ_EXT) :
+	$(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
+
+.cpp$(OBJ_EXT) :
+	$(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
+
+.cxx$(OBJ_EXT) :
+	$(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
+
+';
+}
+
+=item xs_c (override)
+
+Use MM[SK] macros.
+
+=cut
+
+sub xs_c {
+    my($self) = @_;
+    return '' unless $self->needs_linking();
+    '
+.xs.c :
+	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
+';
+}
+
+=item xs_o (override)
+
+Use MM[SK] macros, and VMS command line for C compiler.
+
+=cut
+
+sub xs_o {	# many makes are too dumb to use xs_c then c_o
+    my($self) = @_;
+    return '' unless $self->needs_linking();
+    '
+.xs$(OBJ_EXT) :
+	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
+	$(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
+';
+}
+
+
+=item dlsyms (override)
+
+Create VMS linker options files specifying universal symbols for this
+extension's shareable image, and listing other shareable images or 
+libraries to which it should be linked.
+
+=cut
+
+sub dlsyms {
+    my($self,%attribs) = @_;
+
+    return '' unless $self->needs_linking();
+
+    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
+    my($vars)  = $attribs{DL_VARS}  || $self->{DL_VARS}  || [];
+    my($funclist)  = $attribs{FUNCLIST}  || $self->{FUNCLIST}  || [];
+    my(@m);
+
+    unless ($self->{SKIPHASH}{'dynamic'}) {
+	push(@m,'
+dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
+	$(NOECHO) $(NOOP)
+');
+    }
+
+    push(@m,'
+static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
+	$(NOECHO) $(NOOP)
+') unless $self->{SKIPHASH}{'static'};
+
+    push @m,'
+$(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
+	$(CP) $(MMS$SOURCE) $(MMS$TARGET)
+
+$(BASEEXT).opt : Makefile.PL
+	$(PERLRUN) -e "use ExtUtils::Mksymlists;" -
+	',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
+	neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
+	q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
+
+    push @m, '	$(PERL) -e "print ""$(INST_STATIC)/Include=';
+    if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
+        $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) { 
+        push @m, ($Config{d_vms_case_sensitive_symbols}
+	           ? uc($self->{BASEEXT}) :'$(BASEEXT)');
+    }
+    else {  # We don't have a "main" object file, so pull 'em all in
+       # Upcase module names if linker is being case-sensitive
+       my($upcase) = $Config{d_vms_case_sensitive_symbols};
+	my(@omods) = map { s/\.[^.]*$//;         # Trim off file type
+	                   s[\$\(\w+_EXT\)][];   # even as a macro
+	                   s/.*[:>\/\]]//;       # Trim off dir spec
+			   $upcase ? uc($_) : $_;
+	                 } split ' ', $self->eliminate_macros($self->{OBJECT});
+        my($tmp,@lines,$elt) = '';
+	$tmp = shift @omods;
+	foreach $elt (@omods) {
+	    $tmp .= ",$elt";
+		if (length($tmp) > 80) { push @lines, $tmp;  $tmp = ''; }
+	}
+	push @lines, $tmp;
+	push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
+    }
+	push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
+
+    if (length $self->{LDLOADLIBS}) {
+	my($lib); my($line) = '';
+	foreach $lib (split ' ', $self->{LDLOADLIBS}) {
+	    $lib =~ s%\$%\\\$%g;  # Escape '$' in VMS filespecs
+	    if (length($line) + length($lib) > 160) {
+		push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
+		$line = $lib . '\n';
+	    }
+	    else { $line .= $lib . '\n'; }
+	}
+	push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
+    }
+
+    join('',@m);
+
+}
+
+=item dynamic_lib (override)
+
+Use VMS Link command.
+
+=cut
+
+sub dynamic_lib {
+    my($self, %attribs) = @_;
+    return '' unless $self->needs_linking(); #might be because of a subdir
+
+    return '' unless $self->has_link_code();
+
+    my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
+    my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
+    my $shr = $Config{'dbgprefix'} . 'PerlShr';
+    my(@m);
+    push @m,"
+
+OTHERLDFLAGS = $otherldflags
+INST_DYNAMIC_DEP = $inst_dynamic_dep
+
+";
+    push @m, '
+$(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
+	If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
+	Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
+';
+
+    join('',@m);
+}
+
+
+=item static_lib (override)
+
+Use VMS commands to manipulate object library.
+
+=cut
+
+sub static_lib {
+    my($self) = @_;
+    return '' unless $self->needs_linking();
+
+    return '
+$(INST_STATIC) :
+	$(NOECHO) $(NOOP)
+' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
+
+    my(@m,$lib);
+    push @m,'
+# Rely on suffix rule for update action
+$(OBJECT) : $(INST_ARCHAUTODIR)$(DFSEP).exists
+
+$(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
+';
+    # If this extension has its own library (eg SDBM_File)
+    # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
+    push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
+
+    push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
+
+    # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
+    # 'cause it's a library and you can't stick them in other libraries.
+    # In that case, we use $OBJECT instead and hope for the best
+    if ($self->{MYEXTLIB}) {
+      push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
+    } else {
+      push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
+    }
+    
+    push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
+    foreach $lib (split ' ', $self->{EXTRALIBS}) {
+      push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
+    }
+    join('',@m);
+}
+
+
+=item extra_clean_files
+
+Clean up some OS specific files.  Plus the temp file used to shorten
+a lot of commands.
+
+=cut
+
+sub extra_clean_files {
+    return qw(
+              *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *.Opt $(BASEEXT).bso
+              .MM_Tmp
+             );
+}
+
+
+=item zipfile_target
+
+=item tarfile_target
+
+=item shdist_target
+
+Syntax for invoking shar, tar and zip differs from that for Unix.
+
+=cut
+
+sub zipfile_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+$(DISTVNAME).zip : distdir
+	$(PREOP)
+	$(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
+	$(RM_RF) $(DISTVNAME)
+	$(POSTOP)
+MAKE_FRAG
+}
+
+sub tarfile_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+$(DISTVNAME).tar$(SUFFIX) : distdir
+	$(PREOP)
+	$(TO_UNIX)
+        $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
+	$(RM_RF) $(DISTVNAME)
+	$(COMPRESS) $(DISTVNAME).tar
+	$(POSTOP)
+MAKE_FRAG
+}
+
+sub shdist_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+shdist : distdir
+	$(PREOP)
+	$(SHAR) [.$(DISTVNAME)...]*.*; $(DISTVNAME).share
+	$(RM_RF) $(DISTVNAME)
+	$(POSTOP)
+MAKE_FRAG
+}
+
+
+# --- Test and Installation Sections ---
+
+=item install (override)
+
+Work around DCL's 255 character limit several times,and use
+VMS-style command line quoting in a few cases.
+
+=cut
+
+sub install {
+    my($self, %attribs) = @_;
+    my(@m);
+
+    push @m, q[
+install :: all pure_install doc_install
+	$(NOECHO) $(NOOP)
+
+install_perl :: all pure_perl_install doc_perl_install
+	$(NOECHO) $(NOOP)
+
+install_site :: all pure_site_install doc_site_install
+	$(NOECHO) $(NOOP)
+
+pure_install :: pure_$(INSTALLDIRS)_install
+	$(NOECHO) $(NOOP)
+
+doc_install :: doc_$(INSTALLDIRS)_install
+        $(NOECHO) $(NOOP)
+
+pure__install : pure_site_install
+	$(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
+
+doc__install : doc_site_install
+	$(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
+
+# This hack brought to you by DCL's 255-character command line limit
+pure_perl_install ::
+	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
+	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLPRIVLIB) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLARCHLIB) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLBIN) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLMAN3DIR) " >>.MM_tmp
+	$(NOECHO) $(MOD_INSTALL) <.MM_tmp
+	$(NOECHO) $(RM_F) .MM_tmp
+	$(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
+
+# Likewise
+pure_site_install ::
+	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
+	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLSITELIB) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLSITEARCH) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLSITEBIN) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR) " >>.MM_tmp
+	$(NOECHO) $(MOD_INSTALL) <.MM_tmp
+	$(NOECHO) $(RM_F) .MM_tmp
+	$(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
+
+pure_vendor_install ::
+	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
+	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLVENDORLIB) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLVENDORBIN) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) " >>.MM_tmp
+	$(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR) " >>.MM_tmp
+	$(NOECHO) $(MOD_INSTALL) <.MM_tmp
+	$(NOECHO) $(RM_F) .MM_tmp
+
+# Ditto
+doc_perl_install ::
+	$(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
+	$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+	$(NOECHO) $(ECHO_N) "installed into|$(INSTALLPRIVLIB)|" >.MM_tmp
+	$(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
+	$(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
+	$(NOECHO) $(RM_F) .MM_tmp
+
+# And again
+doc_site_install ::
+	$(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
+	$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+	$(NOECHO) $(ECHO_N) "installed into|$(INSTALLSITELIB)|" >.MM_tmp
+	$(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
+	$(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
+	$(NOECHO) $(RM_F) .MM_tmp
+
+doc_vendor_install ::
+	$(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
+	$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+	$(NOECHO) $(ECHO_N) "installed into|$(INSTALLVENDORLIB)|" >.MM_tmp
+	$(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
+	$(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
+	$(NOECHO) $(RM_F) .MM_tmp
+
+];
+
+    push @m, q[
+uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+	$(NOECHO) $(NOOP)
+
+uninstall_from_perldirs ::
+	$(NOECHO) $(UNINSTALL) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
+	$(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
+	$(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
+	$(NOECHO) $(ECHO) "the appropriate files.  Sorry for the inconvenience."
+
+uninstall_from_sitedirs ::
+	$(NOECHO) $(UNINSTALL) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
+	$(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
+	$(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
+	$(NOECHO) $(ECHO) "the appropriate files.  Sorry for the inconvenience."
+];
+
+    join('',@m);
+}
+
+=item perldepend (override)
+
+Use VMS-style syntax for files; it's cheaper to just do it directly here
+than to have the MM_Unix method call C<catfile> repeatedly.  Also, if
+we have to rebuild Config.pm, use MM[SK] to do it.
+
+=cut
+
+sub perldepend {
+    my($self) = @_;
+    my(@m);
+
+    push @m, '
+$(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
+$(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
+$(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
+$(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)form.h
+$(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
+$(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
+$(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
+$(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
+$(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlio.h
+$(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlvars.h
+$(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
+$(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
+$(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
+$(OBJECT) : $(PERL_INC)thrdvar.h, $(PERL_INC)thread.h
+$(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h
+
+' if $self->{OBJECT}; 
+
+    if ($self->{PERL_SRC}) {
+	my(@macros);
+	my($mmsquals) = '$(USEMAKEFILE)[.vms]$(FIRST_MAKEFILE)';
+	push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
+	push(@macros,'DECC=1')    if $Config{'vms_cc_type'} eq 'decc';
+	push(@macros,'GNUC=1')    if $Config{'vms_cc_type'} eq 'gcc';
+	push(@macros,'SOCKET=1')  if $Config{'d_has_sockets'};
+	push(@macros,qq["CC=$Config{'cc'}"])  if $Config{'cc'} =~ m!/!;
+	$mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
+	push(@m,q[
+# Check for unpropagated config.sh changes. Should never happen.
+# We do NOT just update config.h because that is not sufficient.
+# An out of date config.h is not fatal but complains loudly!
+$(PERL_INC)config.h : $(PERL_SRC)config.sh
+	$(NOOP)
+
+$(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
+	$(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
+	olddef = F$Environment("Default")
+	Set Default $(PERL_SRC)
+	$(MMS)],$mmsquals,);
+	if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
+	    my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
+	    $target =~ s/\Q$prefix/[/;
+	    push(@m," $target");
+	}
+	else { push(@m,' $(MMS$TARGET)'); }
+	push(@m,q[
+	Set Default 'olddef'
+]);
+    }
+
+    push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
+      if %{$self->{XS}};
+
+    join('',@m);
+}
+
+
+=item makeaperl (override)
+
+Undertake to build a new set of Perl images using VMS commands.  Since
+VMS does dynamic loading, it's not necessary to statically link each
+extension into the Perl image, so this isn't the normal build path.
+Consequently, it hasn't really been tested, and may well be incomplete.
+
+=cut
+
+use vars qw(%olbs);
+
+sub makeaperl {
+    my($self, %attribs) = @_;
+    my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmpdir, $libperl) = 
+      @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
+    my(@m);
+    push @m, "
+# --- MakeMaker makeaperl section ---
+MAP_TARGET    = $target
+";
+    return join '', @m if $self->{PARENT};
+
+    my($dir) = join ":", @{$self->{DIR}};
+
+    unless ($self->{MAKEAPERL}) {
+	push @m, q{
+$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
+	$(NOECHO) $(ECHO) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
+	$(NOECHO) $(PERLRUNINST) \
+		Makefile.PL DIR=}, $dir, q{ \
+		FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
+		MAKEAPERL=1 NORECURS=1 };
+
+	push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
+
+$(MAP_TARGET) :: $(MAKE_APERL_FILE)
+	$(MAKE)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
+};
+	push @m, "\n";
+
+	return join '', @m;
+    }
+
+
+    my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
+    local($_);
+
+    # The front matter of the linkcommand...
+    $linkcmd = join ' ', $Config{'ld'},
+	    grep($_, @Config{qw(large split ldflags ccdlflags)});
+    $linkcmd =~ s/\s+/ /g;
+
+    # Which *.olb files could we make use of...
+    local(%olbs);       # XXX can this be lexical?
+    $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
+    require File::Find;
+    File::Find::find(sub {
+	return unless m/\Q$self->{LIB_EXT}\E$/;
+	return if m/^libperl/;
+
+	if( exists $self->{INCLUDE_EXT} ){
+		my $found = 0;
+		my $incl;
+		my $xx;
+
+		($xx = $File::Find::name) =~ s,.*?/auto/,,;
+		$xx =~ s,/?$_,,;
+		$xx =~ s,/,::,g;
+
+		# Throw away anything not explicitly marked for inclusion.
+		# DynaLoader is implied.
+		foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
+			if( $xx eq $incl ){
+				$found++;
+				last;
+			}
+		}
+		return unless $found;
+	}
+	elsif( exists $self->{EXCLUDE_EXT} ){
+		my $excl;
+		my $xx;
+
+		($xx = $File::Find::name) =~ s,.*?/auto/,,;
+		$xx =~ s,/?$_,,;
+		$xx =~ s,/,::,g;
+
+		# Throw away anything explicitly marked for exclusion
+		foreach $excl (@{$self->{EXCLUDE_EXT}}){
+			return if( $xx eq $excl );
+		}
+	}
+
+	$olbs{$ENV{DEFAULT}} = $_;
+    }, grep( -d $_, @{$searchdirs || []}));
+
+    # We trust that what has been handed in as argument will be buildable
+    $static = [] unless $static;
+    @olbs{@{$static}} = (1) x @{$static};
+ 
+    $extra = [] unless $extra && ref $extra eq 'ARRAY';
+    # Sort the object libraries in inverse order of
+    # filespec length to try to insure that dependent extensions
+    # will appear before their parents, so the linker will
+    # search the parent library to resolve references.
+    # (e.g. Intuit::DWIM will precede Intuit, so unresolved
+    # references from [.intuit.dwim]dwim.obj can be found
+    # in [.intuit]intuit.olb).
+    for (sort { length($a) <=> length($b) } keys %olbs) {
+	next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
+	my($dir) = $self->fixpath($_,1);
+	my($extralibs) = $dir . "extralibs.ld";
+	my($extopt) = $dir . $olbs{$_};
+	$extopt =~ s/$self->{LIB_EXT}$/.opt/;
+	push @optlibs, "$dir$olbs{$_}";
+	# Get external libraries this extension will need
+	if (-f $extralibs ) {
+	    my %seenthis;
+	    open LIST,$extralibs or warn $!,next;
+	    while (<LIST>) {
+		chomp;
+		# Include a library in the link only once, unless it's mentioned
+		# multiple times within a single extension's options file, in which
+		# case we assume the builder needed to search it again later in the
+		# link.
+		my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
+		$libseen{$_}++;  $seenthis{$_}++;
+		next if $skip;
+		push @$extra,$_;
+	    }
+	    close LIST;
+	}
+	# Get full name of extension for ExtUtils::Miniperl
+	if (-f $extopt) {
+	    open OPT,$extopt or die $!;
+	    while (<OPT>) {
+		next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
+		my $pkg = $1;
+		$pkg =~ s#__*#::#g;
+		push @staticpkgs,$pkg;
+	    }
+	}
+    }
+    # Place all of the external libraries after all of the Perl extension
+    # libraries in the final link, in order to maximize the opportunity
+    # for XS code from multiple extensions to resolve symbols against the
+    # same external library while only including that library once.
+    push @optlibs, @$extra;
+
+    $target = "Perl$Config{'exe_ext'}" unless $target;
+    my $shrtarget;
+    ($shrtarget,$targdir) = fileparse($target);
+    $shrtarget =~ s/^([^.]*)/$1Shr/;
+    $shrtarget = $targdir . $shrtarget;
+    $target = "Perlshr.$Config{'dlext'}" unless $target;
+    $tmpdir = "[]" unless $tmpdir;
+    $tmpdir = $self->fixpath($tmpdir,1);
+    if (@optlibs) { $extralist = join(' ',@optlibs); }
+    else          { $extralist = ''; }
+    # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
+    # that's what we're building here).
+    push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
+    if ($libperl) {
+	unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
+	    print STDOUT "Warning: $libperl not found\n";
+	    undef $libperl;
+	}
+    }
+    unless ($libperl) {
+	if (defined $self->{PERL_SRC}) {
+	    $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
+	} elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
+	} else {
+	    print STDOUT "Warning: $libperl not found
+    If you're going to build a static perl binary, make sure perl is installed
+    otherwise ignore this warning\n";
+	}
+    }
+    $libperldir = $self->fixpath((fileparse($libperl))[1],1);
+
+    push @m, '
+# Fill in the target you want to produce if it\'s not perl
+MAP_TARGET    = ',$self->fixpath($target,0),'
+MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
+MAP_LINKCMD   = $linkcmd
+MAP_PERLINC   = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
+MAP_EXTRA     = $extralist
+MAP_LIBPERL = ",$self->fixpath($libperl,0),'
+';
+
+
+    push @m,"\n${tmpdir}Makeaperl.Opt : \$(MAP_EXTRA)\n";
+    foreach (@optlibs) {
+	push @m,'	$(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
+    }
+    push @m,"\n${tmpdir}PerlShr.Opt :\n\t";
+    push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
+
+    push @m,'
+$(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
+	$(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
+$(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}PerlShr.Opt",'
+	$(MAP_LINKCMD) ',"${tmpdir}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
+	$(NOECHO) $(ECHO) "To install the new ""$(MAP_TARGET)"" binary, say"
+	$(NOECHO) $(ECHO) "    $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
+	$(NOECHO) $(ECHO) "To remove the intermediate files, say
+	$(NOECHO) $(ECHO) "    $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) map_clean"
+';
+    push @m,"\n${tmpdir}perlmain.c : \$(FIRST_MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmpdir}Writemain.tmp\n";
+    push @m, "# More from the 255-char line length limit\n";
+    foreach (@staticpkgs) {
+	push @m,'	$(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmpdir}Writemain.tmp\n];
+    }
+
+    push @m, sprintf <<'MAKE_FRAG', $tmpdir, $tmpdir;
+	$(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" %sWritemain.tmp >$(MMS$TARGET)
+	$(NOECHO) $(RM_F) %sWritemain.tmp
+MAKE_FRAG
+
+    push @m, q[
+# Still more from the 255-char line length limit
+doc_inst_perl :
+	$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
+	$(NOECHO) $(ECHO) "Perl binary $(MAP_TARGET)|" >.MM_tmp
+	$(NOECHO) $(ECHO) "MAP_STATIC|$(MAP_STATIC)|" >>.MM_tmp
+	$(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
+	$(NOECHO) $(ECHO) -e "MAP_LIBPERL|$(MAP_LIBPERL)|" >>.MM_tmp
+	$(NOECHO) $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q[
+	$(NOECHO) $(RM_F) .MM_tmp
+];
+
+    push @m, "
+inst_perl : pure_inst_perl doc_inst_perl
+	\$(NOECHO) \$(NOOP)
+
+pure_inst_perl : \$(MAP_TARGET)
+	$self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
+	$self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
+
+clean :: map_clean
+	\$(NOECHO) \$(NOOP)
+
+map_clean :
+	\$(RM_F) ${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}perlmain.c \$(FIRST_MAKEFILE)
+	\$(RM_F) ${tmpdir}Makeaperl.Opt ${tmpdir}PerlShr.Opt \$(MAP_TARGET)
+";
+
+    join '', @m;
+}
+  
+# --- Output postprocessing section ---
+
+=item nicetext (override)
+
+Insure that colons marking targets are preceded by space, in order
+to distinguish the target delimiter from a colon appearing as
+part of a filespec.
+
+=cut
+
+sub nicetext {
+    my($self,$text) = @_;
+    return $text if $text =~ m/^\w+\s*=/; # leave macro defs alone
+    $text =~ s/([^\s:])(:+\s)/$1 $2/gs;
+    $text;
+}
+
+=item prefixify (override)
+
+prefixifying on VMS is simple.  Each should simply be:
+
+    perl_root:[some.dir]
+
+which can just be converted to:
+
+    volume:[your.prefix.some.dir]
+
+otherwise you get the default layout.
+
+In effect, your search prefix is ignored and $Config{vms_prefix} is
+used instead.
+
+=cut
+
+sub prefixify {
+    my($self, $var, $sprefix, $rprefix, $default) = @_;
+
+    # Translate $(PERLPREFIX) to a real path.
+    $rprefix = $self->eliminate_macros($rprefix);
+    $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix;
+    $sprefix = VMS::Filespec::vmspath($sprefix) if $sprefix;
+
+    $default = VMS::Filespec::vmsify($default) 
+      unless $default =~ /\[.*\]/;
+
+    (my $var_no_install = $var) =~ s/^install//;
+    my $path = $self->{uc $var} || 
+               $ExtUtils::MM_Unix::Config_Override{lc $var} || 
+               $Config{lc $var} || $Config{lc $var_no_install};
+
+    if( !$path ) {
+        print STDERR "  no Config found for $var.\n" if $Verbose >= 2;
+        $path = $self->_prefixify_default($rprefix, $default);
+    }
+    elsif( !$self->{ARGS}{PREFIX} || !$self->file_name_is_absolute($path) ) {
+        # do nothing if there's no prefix or if its relative
+    }
+    elsif( $sprefix eq $rprefix ) {
+        print STDERR "  no new prefix.\n" if $Verbose >= 2;
+    }
+    else {
+
+        print STDERR "  prefixify $var => $path\n"     if $Verbose >= 2;
+        print STDERR "    from $sprefix to $rprefix\n" if $Verbose >= 2;
+
+        my($path_vol, $path_dirs) = $self->splitpath( $path );
+        if( $path_vol eq $Config{vms_prefix}.':' ) {
+            print STDERR "  $Config{vms_prefix}: seen\n" if $Verbose >= 2;
+
+            $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
+            $path = $self->_catprefix($rprefix, $path_dirs);
+        }
+        else {
+            $path = $self->_prefixify_default($rprefix, $default);
+        }
+    }
+
+    print "    now $path\n" if $Verbose >= 2;
+    return $self->{uc $var} = $path;
+}
+
+
+sub _prefixify_default {
+    my($self, $rprefix, $default) = @_;
+
+    print STDERR "  cannot prefix, using default.\n" if $Verbose >= 2;
+
+    if( !$default ) {
+        print STDERR "No default!\n" if $Verbose >= 1;
+        return;
+    }
+    if( !$rprefix ) {
+        print STDERR "No replacement prefix!\n" if $Verbose >= 1;
+        return '';
+    }
+
+    return $self->_catprefix($rprefix, $default);
+}
+
+sub _catprefix {
+    my($self, $rprefix, $default) = @_;
+
+    my($rvol, $rdirs) = $self->splitpath($rprefix);
+    if( $rvol ) {
+        return $self->catpath($rvol,
+                                   $self->catdir($rdirs, $default),
+                                   ''
+                                  )
+    }
+    else {
+        return $self->catdir($rdirs, $default);
+    }
+}
+
+
+=item cd
+
+=cut
+
+sub cd {
+    my($self, $dir, @cmds) = @_;
+
+    $dir = vmspath($dir);
+
+    my $cmd = join "\n\t", map "$_", @cmds;
+
+    # No leading tab makes it look right when embedded
+    my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd;
+startdir = F$Environment("Default")
+	Set Default %s
+	%s
+	Set Default 'startdir'
+MAKE_FRAG
+
+    # No trailing newline makes this easier to embed
+    chomp $make_frag;
+
+    return $make_frag;
+}
+
+
+=item oneliner
+
+=cut
+
+sub oneliner {
+    my($self, $cmd, $switches) = @_;
+    $switches = [] unless defined $switches;
+
+    # Strip leading and trailing newlines
+    $cmd =~ s{^\n+}{};
+    $cmd =~ s{\n+$}{};
+
+    $cmd = $self->quote_literal($cmd);
+    $cmd = $self->escape_newlines($cmd);
+
+    # Switches must be quoted else they will be lowercased.
+    $switches = join ' ', map { qq{"$_"} } @$switches;
+
+    return qq{\$(ABSPERLRUN) $switches -e $cmd};
+}
+
+
+=item B<echo>
+
+perl trips up on "<foo>" thinking it's an input redirect.  So we use the
+native Write command instead.  Besides, its faster.
+
+=cut
+
+sub echo {
+    my($self, $text, $file, $appending) = @_;
+    $appending ||= 0;
+
+    my $opencmd = $appending ? 'Open/Append' : 'Open/Write';
+
+    my @cmds = ("\$(NOECHO) $opencmd MMECHOFILE $file ");
+    push @cmds, map { '$(NOECHO) Write MMECHOFILE '.$self->quote_literal($_) } 
+                split /\n/, $text;
+    push @cmds, '$(NOECHO) Close MMECHOFILE';
+    return @cmds;
+}
+
+
+=item quote_literal
+
+=cut
+
+sub quote_literal {
+    my($self, $text) = @_;
+
+    # I believe this is all we should need.
+    $text =~ s{"}{""}g;
+
+    return qq{"$text"};
+}
+
+=item escape_newlines
+
+=cut
+
+sub escape_newlines {
+    my($self, $text) = @_;
+
+    $text =~ s{\n}{-\n}g;
+
+    return $text;
+}
+
+=item max_exec_len
+
+256 characters.
+
+=cut
+
+sub max_exec_len {
+    my $self = shift;
+
+    return $self->{_MAX_EXEC_LEN} ||= 256;
+}
+
+=item init_linker
+
+=cut
+
+sub init_linker {
+    my $self = shift;
+    $self->{EXPORT_LIST} ||= '$(BASEEXT).opt';
+
+    my $shr = $Config{dbgprefix} . 'PERLSHR';
+    if ($self->{PERL_SRC}) {
+        $self->{PERL_ARCHIVE} ||=
+          $self->catfile($self->{PERL_SRC}, "$shr.$Config{'dlext'}");
+    }
+    else {
+        $self->{PERL_ARCHIVE} ||=
+          $ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}";
+    }
+
+    $self->{PERL_ARCHIVE_AFTER} ||= '';
+}
+
+=item eliminate_macros
+
+Expands MM[KS]/Make macros in a text string, using the contents of
+identically named elements of C<%$self>, and returns the result
+as a file specification in Unix syntax.
+
+NOTE:  This is the canonical version of the method.  The version in
+File::Spec::VMS is deprecated.
+
+=cut
+
+sub eliminate_macros {
+    my($self,$path) = @_;
+    return '' unless $path;
+    $self = {} unless ref $self;
+
+    if ($path =~ /\s/) {
+      return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
+    }
+
+    my($npath) = unixify($path);
+    # sometimes unixify will return a string with an off-by-one trailing null
+    $npath =~ s{\0$}{};
+
+    my($complex) = 0;
+    my($head,$macro,$tail);
+
+    # perform m##g in scalar context so it acts as an iterator
+    while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) { 
+        if (defined $self->{$2}) {
+            ($head,$macro,$tail) = ($1,$2,$3);
+            if (ref $self->{$macro}) {
+                if (ref $self->{$macro} eq 'ARRAY') {
+                    $macro = join ' ', @{$self->{$macro}};
+                }
+                else {
+                    print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
+                          "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
+                    $macro = "\cB$macro\cB";
+                    $complex = 1;
+                }
+            }
+            else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
+            $npath = "$head$macro$tail";
+        }
+    }
+    if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
+    $npath;
+}
+
+=item fixpath
+
+   my $path = $mm->fixpath($path);
+   my $path = $mm->fixpath($path, $is_dir);
+
+Catchall routine to clean up problem MM[SK]/Make macros.  Expands macros
+in any directory specification, in order to avoid juxtaposing two
+VMS-syntax directories when MM[SK] is run.  Also expands expressions which
+are all macro, so that we can tell how long the expansion is, and avoid
+overrunning DCL's command buffer when MM[KS] is running.
+
+fixpath() checks to see whether the result matches the name of a
+directory in the current default directory and returns a directory or
+file specification accordingly.  C<$is_dir> can be set to true to
+force fixpath() to consider the path to be a directory or false to force
+it to be a file.
+
+NOTE:  This is the canonical version of the method.  The version in
+File::Spec::VMS is deprecated.
+
+=cut
+
+sub fixpath {
+    my($self,$path,$force_path) = @_;
+    return '' unless $path;
+    $self = bless {} unless ref $self;
+    my($fixedpath,$prefix,$name);
+
+    if ($path =~ /[ \t]/) {
+      return join ' ',
+             map { $self->fixpath($_,$force_path) }
+	     split /[ \t]+/, $path;
+    }
+
+    if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) { 
+        if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
+            $fixedpath = vmspath($self->eliminate_macros($path));
+        }
+        else {
+            $fixedpath = vmsify($self->eliminate_macros($path));
+        }
+    }
+    elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
+        my($vmspre) = $self->eliminate_macros("\$($prefix)");
+        # is it a dir or just a name?
+        $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
+        $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
+        $fixedpath = vmspath($fixedpath) if $force_path;
+    }
+    else {
+        $fixedpath = $path;
+        $fixedpath = vmspath($fixedpath) if $force_path;
+    }
+    # No hints, so we try to guess
+    if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
+        $fixedpath = vmspath($fixedpath) if -d $fixedpath;
+    }
+
+    # Trim off root dirname if it's had other dirs inserted in front of it.
+    $fixedpath =~ s/\.000000([\]>])/$1/;
+    # Special case for VMS absolute directory specs: these will have had device
+    # prepended during trip through Unix syntax in eliminate_macros(), since
+    # Unix syntax has no way to express "absolute from the top of this device's
+    # directory tree".
+    if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
+
+    return $fixedpath;
+}
+
+
+=item os_flavor
+
+VMS is VMS.
+
+=cut
+
+sub os_flavor {
+    return('VMS');
+}
+
+=back
+
+
+=head1 AUTHOR
+
+Original author Charles Bailey F<bailey@newman.upenn.edu>
+
+Maintained by Michael G Schwern F<schwern@pobox.com>
+
+See L<ExtUtils::MakeMaker> for patching and contact information.
+
+
+=cut
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_VOS.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_VOS.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_VOS.pm	(revision 14489)
@@ -0,0 +1,51 @@
+package ExtUtils::MM_VOS;
+
+use strict;
+use vars qw($VERSION @ISA);
+$VERSION = '0.02';
+
+require ExtUtils::MM_Unix;
+@ISA = qw(ExtUtils::MM_Unix);
+
+
+=head1 NAME
+
+ExtUtils::MM_VOS - VOS specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+  Don't use this module directly.
+  Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+VOS.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=head3 extra_clean_files
+
+Cleanup VOS core files
+
+=cut
+
+sub extra_clean_files {
+    return qw(*.kp);
+}
+
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Win32.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Win32.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Win32.pm	(revision 14489)
@@ -0,0 +1,537 @@
+package ExtUtils::MM_Win32;
+
+use strict;
+
+
+=head1 NAME
+
+ExtUtils::MM_Win32 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_Win32; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=cut 
+
+use ExtUtils::MakeMaker::Config;
+use File::Basename;
+use File::Spec;
+use ExtUtils::MakeMaker qw( neatvalue );
+
+use vars qw(@ISA $VERSION $BORLAND $GCC $DMAKE $NMAKE);
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+$VERSION = '1.12';
+
+$ENV{EMXSHELL} = 'sh'; # to run `commands`
+
+$BORLAND = 1 if $Config{'cc'} =~ /^bcc/i;
+$GCC     = 1 if $Config{'cc'} =~ /^gcc/i;
+$DMAKE = 1 if $Config{'make'} =~ /^dmake/i;
+$NMAKE = 1 if $Config{'make'} =~ /^nmake/i;
+
+
+=head2 Overridden methods
+
+=over 4
+
+=item B<dlsyms>
+
+=cut
+
+sub dlsyms {
+    my($self,%attribs) = @_;
+
+    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
+    my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];
+    my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
+    my($imports)  = $attribs{IMPORTS} || $self->{IMPORTS} || {};
+    my(@m);
+
+    if (not $self->{SKIPHASH}{'dynamic'}) {
+	push(@m,"
+$self->{BASEEXT}.def: Makefile.PL
+",
+     q!	$(PERLRUN) -MExtUtils::Mksymlists \\
+     -e "Mksymlists('NAME'=>\"!, $self->{NAME},
+     q!\", 'DLBASE' => '!,$self->{DLBASE},
+     # The above two lines quoted differently to work around
+     # a bug in the 4DOS/4NT command line interpreter.  The visible
+     # result of the bug was files named q('extension_name',) *with the
+     # single quotes and the comma* in the extension build directories.
+     q!', 'DL_FUNCS' => !,neatvalue($funcs),
+     q!, 'FUNCLIST' => !,neatvalue($funclist),
+     q!, 'IMPORTS' => !,neatvalue($imports),
+     q!, 'DL_VARS' => !, neatvalue($vars), q!);"
+!);
+    }
+    join('',@m);
+}
+
+=item replace_manpage_separator
+
+Changes the path separator with .
+
+=cut
+
+sub replace_manpage_separator {
+    my($self,$man) = @_;
+    $man =~ s,/+,.,g;
+    $man;
+}
+
+
+=item B<maybe_command>
+
+Since Windows has nothing as simple as an executable bit, we check the
+file extension.
+
+The PATHEXT env variable will be used to get a list of extensions that
+might indicate a command, otherwise .com, .exe, .bat and .cmd will be
+used by default.
+
+=cut
+
+sub maybe_command {
+    my($self,$file) = @_;
+    my @e = exists($ENV{'PATHEXT'})
+          ? split(/;/, $ENV{PATHEXT})
+	  : qw(.com .exe .bat .cmd);
+    my $e = '';
+    for (@e) { $e .= "\Q$_\E|" }
+    chop $e;
+    # see if file ends in one of the known extensions
+    if ($file =~ /($e)$/i) {
+	return $file if -e $file;
+    }
+    else {
+	for (@e) {
+	    return "$file$_" if -e "$file$_";
+	}
+    }
+    return;
+}
+
+
+=item B<init_DIRFILESEP>
+
+Using \ for Windows.
+
+=cut
+
+sub init_DIRFILESEP {
+    my($self) = shift;
+
+    # The ^ makes sure its not interpreted as an escape in nmake
+    $self->{DIRFILESEP} = $NMAKE ? '^\\' :
+                          $DMAKE ? '\\\\'
+                                 : '\\';
+}
+
+=item B<init_others>
+
+Override some of the Unix specific commands with portable
+ExtUtils::Command ones.
+
+Also provide defaults for LD and AR in case the %Config values aren't
+set.
+
+LDLOADLIBS's default is changed to $Config{libs}.
+
+Adjustments are made for Borland's quirks needing -L to come first.
+
+=cut
+
+sub init_others {
+    my ($self) = @_;
+
+    # Used in favor of echo because echo won't strip quotes. :(
+    $self->{ECHO}     ||= $self->oneliner('print qq{@ARGV}', ['-l']);
+    $self->{ECHO_N}   ||= $self->oneliner('print qq{@ARGV}');
+
+    $self->{TOUCH}    ||= '$(ABSPERLRUN) -MExtUtils::Command -e touch';
+    $self->{CHMOD}    ||= '$(ABSPERLRUN) -MExtUtils::Command -e chmod'; 
+    $self->{CP}       ||= '$(ABSPERLRUN) -MExtUtils::Command -e cp';
+    $self->{RM_F}     ||= '$(ABSPERLRUN) -MExtUtils::Command -e rm_f';
+    $self->{RM_RF}    ||= '$(ABSPERLRUN) -MExtUtils::Command -e rm_rf';
+    $self->{MV}       ||= '$(ABSPERLRUN) -MExtUtils::Command -e mv';
+    $self->{NOOP}     ||= 'rem';
+    $self->{TEST_F}   ||= '$(ABSPERLRUN) -MExtUtils::Command -e test_f';
+    $self->{DEV_NULL} ||= '> NUL';
+
+    $self->{FIXIN}    ||= $self->{PERL_CORE} ? 
+      "\$(PERLRUN) $self->{PERL_SRC}/win32/bin/pl2bat.pl" : 
+      'pl2bat.bat';
+
+    $self->{LD}     ||= $Config{ld} || 'link';
+    $self->{AR}     ||= $Config{ar} || 'lib';
+
+    $self->SUPER::init_others;
+
+    # Setting SHELL from $Config{sh} can break dmake.  Its ok without it.
+    delete $self->{SHELL};
+
+    $self->{LDLOADLIBS} ||= $Config{libs};
+    # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
+    if ($BORLAND) {
+        my $libs = $self->{LDLOADLIBS};
+        my $libpath = '';
+        while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {
+            $libpath .= ' ' if length $libpath;
+            $libpath .= $1;
+        }
+        $self->{LDLOADLIBS} = $libs;
+        $self->{LDDLFLAGS} ||= $Config{lddlflags};
+        $self->{LDDLFLAGS} .= " $libpath";
+    }
+
+    return 1;
+}
+
+
+=item init_platform
+
+Add MM_Win32_VERSION.
+
+=item platform_constants
+
+=cut
+
+sub init_platform {
+    my($self) = shift;
+
+    $self->{MM_Win32_VERSION} = $VERSION;
+}
+
+sub platform_constants {
+    my($self) = shift;
+    my $make_frag = '';
+
+    foreach my $macro (qw(MM_Win32_VERSION))
+    {
+        next unless defined $self->{$macro};
+        $make_frag .= "$macro = $self->{$macro}\n";
+    }
+
+    return $make_frag;
+}
+
+
+=item special_targets
+
+Add .USESHELL target for dmake.
+
+=cut
+
+sub special_targets {
+    my($self) = @_;
+
+    my $make_frag = $self->SUPER::special_targets;
+
+    $make_frag .= <<'MAKE_FRAG' if $DMAKE;
+.USESHELL :
+MAKE_FRAG
+
+    return $make_frag;
+}
+
+
+=item static_lib
+
+Changes how to run the linker.
+
+The rest is duplicate code from MM_Unix.  Should move the linker code
+to its own method.
+
+=cut
+
+sub static_lib {
+    my($self) = @_;
+    return '' unless $self->has_link_code;
+
+    my(@m);
+    push(@m, <<'END');
+$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists
+	$(RM_RF) $@
+END
+
+    # If this extension has its own library (eg SDBM_File)
+    # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
+    push @m, <<'MAKE_FRAG' if $self->{MYEXTLIB};
+	$(CP) $(MYEXTLIB) $@
+MAKE_FRAG
+
+    push @m,
+q{	$(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
+			  : ($GCC ? '-ru $@ $(OBJECT)'
+			          : '-out:$@ $(OBJECT)')).q{
+	$(CHMOD) $(PERM_RWX) $@
+	$(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
+};
+
+    # Old mechanism - still available:
+    push @m, <<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS};
+	$(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs
+MAKE_FRAG
+
+    join('', @m);
+}
+
+
+=item dynamic_lib
+
+Complicated stuff for Win32 that I don't understand. :(
+
+=cut
+
+sub dynamic_lib {
+    my($self, %attribs) = @_;
+    return '' unless $self->needs_linking(); #might be because of a subdir
+
+    return '' unless $self->has_link_code;
+
+    my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
+    my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
+    my($ldfrom) = '$(LDFROM)';
+    my(@m);
+
+# one thing for GCC/Mingw32:
+# we try to overcome non-relocateable-DLL problems by generating
+#    a (hopefully unique) image-base from the dll's name
+# -- BKS, 10-19-1999
+    if ($GCC) { 
+	my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
+	$dllname =~ /(....)(.{0,4})/;
+	my $baseaddr = unpack("n", $1 ^ $2);
+	$otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
+    }
+
+    push(@m,'
+# This section creates the dynamically loadable $(INST_DYNAMIC)
+# from $(OBJECT) and possibly $(MYEXTLIB).
+OTHERLDFLAGS = '.$otherldflags.'
+INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
+
+$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
+');
+    if ($GCC) {
+      push(@m,  
+       q{	dlltool --def $(EXPORT_LIST) --output-exp dll.exp
+	$(LD) -o $@ -Wl,--base-file -Wl,dll.base $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp
+	dlltool --def $(EXPORT_LIST) --base-file dll.base --output-exp dll.exp
+	$(LD) -o $@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp });
+    } elsif ($BORLAND) {
+      push(@m,
+       q{	$(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,}
+       .($DMAKE ? q{$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) }
+		 .q{$(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,)}
+		: q{$(subst /,\,$(PERL_ARCHIVE)) $(subst /,\,$(LDLOADLIBS)) }
+		 .q{$(subst /,\,$(MYEXTLIB)),$(subst /,\,$(EXPORT_LIST))})
+       .q{,$(RESFILES)});
+    } else {	# VC
+      push(@m,
+       q{	$(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
+      .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
+    }
+    push @m, '
+	$(CHMOD) $(PERM_RWX) $@
+';
+
+    join('',@m);
+}
+
+=item extra_clean_files
+
+Clean out some extra dll.{base,exp} files which might be generated by
+gcc.  Otherwise, take out all *.pdb files.
+
+=cut
+
+sub extra_clean_files {
+    my $self = shift;
+
+    return $GCC ? (qw(dll.base dll.exp)) : ('*.pdb');
+}
+
+=item init_linker
+
+=cut
+
+sub init_linker {
+    my $self = shift;
+
+    $self->{PERL_ARCHIVE}       = "\$(PERL_INC)\\$Config{libperl}";
+    $self->{PERL_ARCHIVE_AFTER} = '';
+    $self->{EXPORT_LIST}        = '$(BASEEXT).def';
+}
+
+
+=item perl_script
+
+Checks for the perl program under several common perl extensions.
+
+=cut
+
+sub perl_script {
+    my($self,$file) = @_;
+    return $file if -r $file && -f _;
+    return "$file.pl"  if -r "$file.pl" && -f _;
+    return "$file.plx" if -r "$file.plx" && -f _;
+    return "$file.bat" if -r "$file.bat" && -f _;
+    return;
+}
+
+
+=item xs_o
+
+This target is stubbed out.  Not sure why.
+
+=cut
+
+sub xs_o {
+    return ''
+}
+
+
+=item pasthru
+
+All we send is -nologo to nmake to prevent it from printing its damned
+banner.
+
+=cut
+
+sub pasthru {
+    my($self) = shift;
+    return "PASTHRU = " . ($NMAKE ? "-nologo" : "");
+}
+
+
+=item oneliner
+
+These are based on what command.com does on Win98.  They may be wrong
+for other Windows shells, I don't know.
+
+=cut
+
+sub oneliner {
+    my($self, $cmd, $switches) = @_;
+    $switches = [] unless defined $switches;
+
+    # Strip leading and trailing newlines
+    $cmd =~ s{^\n+}{};
+    $cmd =~ s{\n+$}{};
+
+    $cmd = $self->quote_literal($cmd);
+    $cmd = $self->escape_newlines($cmd);
+
+    $switches = join ' ', @$switches;
+
+    return qq{\$(ABSPERLRUN) $switches -e $cmd};
+}
+
+
+sub quote_literal {
+    my($self, $text) = @_;
+
+    # I don't know if this is correct, but it seems to work on
+    # Win98's command.com
+    $text =~ s{"}{\\"}g;
+
+    # dmake eats '{' inside double quotes and leaves alone { outside double
+    # quotes; however it transforms {{ into { either inside and outside double
+    # quotes.  It also translates }} into }.  The escaping below is not
+    # 100% correct.
+    if( $DMAKE ) {
+        $text =~ s/{/{{/g;
+        $text =~ s/}}/}}}/g;
+    }
+
+    return qq{"$text"};
+}
+
+
+sub escape_newlines {
+    my($self, $text) = @_;
+
+    # Escape newlines
+    $text =~ s{\n}{\\\n}g;
+
+    return $text;
+}
+
+
+=item cd
+
+dmake can handle Unix style cd'ing but nmake (at least 1.5) cannot.  It
+wants:
+
+    cd dir
+    command
+    another_command
+    cd ..
+
+B<NOTE> This cd can only go one level down.  So far this sufficient for
+what MakeMaker needs.
+
+=cut
+
+sub cd {
+    my($self, $dir, @cmds) = @_;
+
+    return $self->SUPER::cd($dir, @cmds) unless $NMAKE;
+
+    my $cmd = join "\n\t", map "$_", @cmds;
+
+    # No leading tab and no trailing newline makes for easier embedding.
+    my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd;
+cd %s
+	%s
+	cd ..
+MAKE_FRAG
+
+    chomp $make_frag;
+
+    return $make_frag;
+}
+
+
+=item max_exec_len
+
+nmake 1.50 limits command length to 2048 characters.
+
+=cut
+
+sub max_exec_len {
+    my $self = shift;
+
+    return $self->{_MAX_EXEC_LEN} ||= 2 * 1024;
+}
+
+
+=item os_flavor
+
+Windows is Win32.
+
+=cut
+
+sub os_flavor {
+    return('Win32');
+}
+
+
+1;
+__END__
+
+=back
+
+=cut 
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Win95.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Win95.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MM_Win95.pm	(revision 14489)
@@ -0,0 +1,123 @@
+package ExtUtils::MM_Win95;
+
+use vars qw($VERSION @ISA);
+$VERSION = '0.04';
+
+require ExtUtils::MM_Win32;
+@ISA = qw(ExtUtils::MM_Win32);
+
+use ExtUtils::MakeMaker::Config;
+
+
+=head1 NAME
+
+ExtUtils::MM_Win95 - method to customize MakeMaker for Win9X
+
+=head1 SYNOPSIS
+
+  You should not be using this module directly.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Win32 containing changes necessary
+to get MakeMaker playing nice with command.com and other Win9Xisms.
+
+=head2 Overriden methods
+
+Most of these make up for limitations in the Win9x/nmake command shell.
+Mostly its lack of &&.
+
+=over 4
+
+
+=item xs_c
+
+The && problem.
+
+=cut
+
+sub xs_c {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xs.c:
+	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
+	'
+}
+
+
+=item xs_cpp
+
+The && problem
+
+=cut
+
+sub xs_cpp {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xs.cpp:
+	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.cpp
+	';
+}
+
+=item xs_o 
+
+The && problem.
+
+=cut
+
+sub xs_o {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xs$(OBJ_EXT):
+	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
+	$(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
+	';
+}
+
+
+=item max_exec_len
+
+Win98 chokes on things like Encode if we set the max length to nmake's max
+of 2K.  So we go for a more conservative value of 1K.
+
+=cut
+
+sub max_exec_len {
+    my $self = shift;
+
+    return $self->{_MAX_EXEC_LEN} ||= 1024;
+}
+
+
+=item os_flavor
+
+Win95 and Win98 and WinME are collectively Win9x and Win32
+
+=cut
+
+sub os_flavor {
+    my $self = shift;
+    return ($self->SUPER::os_flavor, 'Win9x');
+}
+
+
+=back
+
+
+=head1 AUTHOR
+
+Code originally inside MM_Win32.  Original author unknown.
+
+Currently maintained by Michael G Schwern C<schwern@pobox.com>.
+
+Send patches and ideas to C<makemaker@perl.org>.
+
+See http://www.makemaker.org.
+
+=cut
+
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MY.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MY.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MY.pm	(revision 14489)
@@ -0,0 +1,42 @@
+package ExtUtils::MY;
+
+use strict;
+require ExtUtils::MM;
+
+use vars qw(@ISA $VERSION);
+$VERSION = 0.01;
+@ISA = qw(ExtUtils::MM);
+
+{
+    package MY;
+    use vars qw(@ISA);
+    @ISA = qw(ExtUtils::MY);
+}
+
+sub DESTROY {}
+
+
+=head1 NAME
+
+ExtUtils::MY - ExtUtils::MakeMaker subclass for customization
+
+=head1 SYNOPSIS
+
+  # in your Makefile.PL
+  sub MY::whatever {
+      ...
+  }
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY>
+
+ExtUtils::MY is a subclass of ExtUtils::MM.  Its provided in your
+Makefile.PL for you to add and override MakeMaker functionality.
+
+It also provides a convenient alias via the MY class.
+
+ExtUtils::MY might turn out to be a temporary solution, but MY won't
+go away.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker.pm	(revision 14489)
@@ -0,0 +1,2519 @@
+# $Id: /local/schwern.org/CPAN/ExtUtils-MakeMaker/trunk/lib/ExtUtils/MakeMaker.pm 4535 2005-05-20T23:08:34.937906Z schwern  $
+package ExtUtils::MakeMaker;
+
+BEGIN {require 5.005_03;}
+
+require Exporter;
+use ExtUtils::MakeMaker::Config;
+use Carp ();
+use File::Path;
+
+use vars qw(
+            @ISA @EXPORT @EXPORT_OK
+            $VERSION $Verbose %Config 
+            @Prepend_parent @Parent
+            %Recognized_Att_Keys @Get_from_Config @MM_Sections @Overridable 
+            $Filename
+           );
+
+# Has to be on its own line with no $ after it to avoid being noticed by
+# the version control system
+use vars qw($Revision);
+use strict;
+
+$VERSION = '6.30';
+($Revision = q$Revision: 4535 $) =~ /Revision:\s+(\S+)/;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(&WriteMakefile &writeMakefile $Verbose &prompt);
+@EXPORT_OK = qw($VERSION &neatvalue &mkbootstrap &mksymlists);
+
+# These will go away once the last of the Win32 & VMS specific code is 
+# purged.
+my $Is_VMS     = $^O eq 'VMS';
+my $Is_Win32   = $^O eq 'MSWin32';
+
+# Our filename for diagnostic and debugging purposes.  More reliable
+# than %INC (think caseless filesystems)
+$Filename = __FILE__;
+
+full_setup();
+
+require ExtUtils::MM;  # Things like CPAN assume loading ExtUtils::MakeMaker
+                       # will give them MM.
+
+require ExtUtils::MY;  # XXX pre-5.8 versions of ExtUtils::Embed expect
+                       # loading ExtUtils::MakeMaker will give them MY.
+                       # This will go when Embed is it's own CPAN module.
+
+
+sub WriteMakefile {
+    Carp::croak "WriteMakefile: Need even number of args" if @_ % 2;
+
+    require ExtUtils::MY;
+    my %att = @_;
+
+    _verify_att(\%att);
+
+    my $mm = MM->new(\%att);
+    $mm->flush;
+
+    return $mm;
+}
+
+
+# Basic signatures of the attributes WriteMakefile takes.  Each is the
+# reference type.  Empty value indicate it takes a non-reference
+# scalar.
+my %Att_Sigs;
+my %Special_Sigs = (
+ C                  => 'array',
+ CONFIG             => 'array',
+ CONFIGURE          => 'code',
+ DIR                => 'array',
+ DL_FUNCS           => 'hash',
+ DL_VARS            => 'array',
+ EXCLUDE_EXT        => 'array',
+ EXE_FILES          => 'array',
+ FUNCLIST           => 'array',
+ H                  => 'array',
+ IMPORTS            => 'hash',
+ INCLUDE_EXT        => 'array',
+ LIBS               => ['array',''],
+ MAN1PODS           => 'hash',
+ MAN3PODS           => 'hash',
+ PL_FILES           => 'hash',
+ PM                 => 'hash',
+ PMLIBDIRS          => 'array',
+ PREREQ_PM          => 'hash',
+ SKIP               => 'array',
+ TYPEMAPS           => 'array',
+ XS                 => 'hash',
+ _KEEP_AFTER_FLUSH  => '',
+
+ clean      => 'hash',
+ depend     => 'hash',
+ dist       => 'hash',
+ dynamic_lib=> 'hash',
+ linkext    => 'hash',
+ macro      => 'hash',
+ postamble  => 'hash',
+ realclean  => 'hash',
+ test       => 'hash',
+ tool_autosplit => 'hash',
+);
+
+@Att_Sigs{keys %Recognized_Att_Keys} = ('') x keys %Recognized_Att_Keys;
+@Att_Sigs{keys %Special_Sigs} = values %Special_Sigs;
+
+
+sub _verify_att {
+    my($att) = @_;
+
+    while( my($key, $val) = each %$att ) {
+        my $sig = $Att_Sigs{$key};
+        unless( defined $sig ) {
+            warn "WARNING: $key is not a known parameter.\n";
+            next;
+        }
+
+        my @sigs   = ref $sig ? @$sig : $sig;
+        my $given = lc ref $val;
+        unless( grep $given eq $_, @sigs ) {
+            my $takes = join " or ", map { $_ ne '' ? "$_ reference"
+                                                    : "string/number"
+                                         } @sigs;
+            my $has   = $given ne '' ? "$given reference"
+                                     : "string/number";
+            warn "WARNING: $key takes a $takes not a $has.\n".
+                 "         Please inform the author.\n";
+        }
+    }
+}
+
+sub prompt ($;$) {
+    my($mess, $def) = @_;
+    Carp::confess("prompt function called without an argument") 
+        unless defined $mess;
+
+    my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ;
+
+    my $dispdef = defined $def ? "[$def] " : " ";
+    $def = defined $def ? $def : "";
+
+    local $|=1;
+    local $\;
+    print "$mess $dispdef";
+
+    my $ans;
+    if ($ENV{PERL_MM_USE_DEFAULT} || (!$isa_tty && eof STDIN)) {
+        print "$def\n";
+    }
+    else {
+        $ans = <STDIN>;
+        if( defined $ans ) {
+            chomp $ans;
+        }
+        else { # user hit ctrl-D
+            print "\n";
+        }
+    }
+
+    return (!defined $ans || $ans eq '') ? $def : $ans;
+}
+
+sub eval_in_subdirs {
+    my($self) = @_;
+    use Cwd qw(cwd abs_path);
+    my $pwd = cwd() || die "Can't figure out your cwd!";
+
+    local @INC = map eval {abs_path($_) if -e} || $_, @INC;
+    push @INC, '.';     # '.' has to always be at the end of @INC
+
+    foreach my $dir (@{$self->{DIR}}){
+        my($abs) = $self->catdir($pwd,$dir);
+        eval { $self->eval_in_x($abs); };
+        last if $@;
+    }
+    chdir $pwd;
+    die $@ if $@;
+}
+
+sub eval_in_x {
+    my($self,$dir) = @_;
+    chdir $dir or Carp::carp("Couldn't change to directory $dir: $!");
+
+    {
+        package main;
+        do './Makefile.PL';
+    };
+    if ($@) {
+#         if ($@ =~ /prerequisites/) {
+#             die "MakeMaker WARNING: $@";
+#         } else {
+#             warn "WARNING from evaluation of $dir/Makefile.PL: $@";
+#         }
+        die "ERROR from evaluation of $dir/Makefile.PL: $@";
+    }
+}
+
+
+# package name for the classes into which the first object will be blessed
+my $PACKNAME = 'PACK000';
+
+sub full_setup {
+    $Verbose ||= 0;
+
+    my @attrib_help = qw/
+
+    AUTHOR ABSTRACT ABSTRACT_FROM BINARY_LOCATION
+    C CAPI CCFLAGS CONFIG CONFIGURE DEFINE DIR DISTNAME DL_FUNCS DL_VARS
+    EXCLUDE_EXT EXE_FILES FIRST_MAKEFILE
+    FULLPERL FULLPERLRUN FULLPERLRUNINST
+    FUNCLIST H IMPORTS
+
+    INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB INST_MAN1DIR INST_MAN3DIR
+    INSTALLDIRS
+    DESTDIR PREFIX INSTALLBASE
+    PERLPREFIX      SITEPREFIX      VENDORPREFIX
+    INSTALLPRIVLIB  INSTALLSITELIB  INSTALLVENDORLIB
+    INSTALLARCHLIB  INSTALLSITEARCH INSTALLVENDORARCH
+    INSTALLBIN      INSTALLSITEBIN  INSTALLVENDORBIN
+    INSTALLMAN1DIR          INSTALLMAN3DIR
+    INSTALLSITEMAN1DIR      INSTALLSITEMAN3DIR
+    INSTALLVENDORMAN1DIR    INSTALLVENDORMAN3DIR
+    INSTALLSCRIPT 
+    PERL_LIB        PERL_ARCHLIB 
+    SITELIBEXP      SITEARCHEXP 
+
+    INC INCLUDE_EXT LDFROM LIB LIBPERL_A LIBS
+    LINKTYPE MAKEAPERL MAKEFILE MAKEFILE_OLD MAN1PODS MAN3PODS MAP_TARGET 
+    MYEXTLIB NAME NEEDS_LINKING NOECHO NO_META NORECURS NO_VC OBJECT OPTIMIZE 
+    PERL_MALLOC_OK PERL PERLMAINCC PERLRUN PERLRUNINST PERL_CORE
+    PERL_SRC PERM_RW PERM_RWX
+    PL_FILES PM PM_FILTER PMLIBDIRS POLLUTE PPM_INSTALL_EXEC
+    PPM_INSTALL_SCRIPT PREREQ_FATAL PREREQ_PM PREREQ_PRINT PRINT_PREREQ
+    SIGN SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG
+    XS_VERSION clean depend dist dynamic_lib linkext macro realclean
+    tool_autosplit
+
+    MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC
+    MACLIBS_ALL_68K MACLIBS_ALL_PPC MACLIBS_SHARED
+        /;
+
+    # IMPORTS is used under OS/2 and Win32
+
+    # @Overridable is close to @MM_Sections but not identical.  The
+    # order is important. Many subroutines declare macros. These
+    # depend on each other. Let's try to collect the macros up front,
+    # then pasthru, then the rules.
+
+    # MM_Sections are the sections we have to call explicitly
+    # in Overridable we have subroutines that are used indirectly
+
+
+    @MM_Sections = 
+        qw(
+
+ post_initialize const_config constants platform_constants 
+ tool_autosplit tool_xsubpp tools_other 
+
+ makemakerdflt
+
+ dist macro depend cflags const_loadlibs const_cccmd
+ post_constants
+
+ pasthru
+
+ special_targets
+ c_o xs_c xs_o
+ top_targets blibdirs linkext dlsyms dynamic dynamic_bs
+ dynamic_lib static static_lib manifypods processPL
+ installbin subdirs
+ clean_subdirs clean realclean_subdirs realclean 
+ metafile signature
+ dist_basics dist_core distdir dist_test dist_ci distmeta distsignature
+ install force perldepend makefile staticmake test ppd
+
+          ); # loses section ordering
+
+    @Overridable = @MM_Sections;
+    push @Overridable, qw[
+
+ libscan makeaperl needs_linking perm_rw perm_rwx
+ subdir_x test_via_harness test_via_script init_PERL
+                         ];
+
+    push @MM_Sections, qw[
+
+ pm_to_blib selfdocument
+
+                         ];
+
+    # Postamble needs to be the last that was always the case
+    push @MM_Sections, "postamble";
+    push @Overridable, "postamble";
+
+    # All sections are valid keys.
+    @Recognized_Att_Keys{@MM_Sections} = (1) x @MM_Sections;
+
+    # we will use all these variables in the Makefile
+    @Get_from_Config = 
+        qw(
+           ar cc cccdlflags ccdlflags dlext dlsrc ld lddlflags ldflags libc
+           lib_ext obj_ext osname osvers ranlib sitelibexp sitearchexp so
+           exe_ext full_ar
+          );
+
+    # 5.5.3 doesn't have any concept of vendor libs
+    push @Get_from_Config, qw( vendorarchexp vendorlibexp ) if $] >= 5.006;
+
+    foreach my $item (@attrib_help){
+        $Recognized_Att_Keys{$item} = 1;
+    }
+    foreach my $item (@Get_from_Config) {
+        $Recognized_Att_Keys{uc $item} = $Config{$item};
+        print "Attribute '\U$item\E' => '$Config{$item}'\n"
+            if ($Verbose >= 2);
+    }
+
+    #
+    # When we eval a Makefile.PL in a subdirectory, that one will ask
+    # us (the parent) for the values and will prepend "..", so that
+    # all files to be installed end up below OUR ./blib
+    #
+    @Prepend_parent = qw(
+           INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT
+           MAP_TARGET INST_MAN1DIR INST_MAN3DIR PERL_SRC
+           PERL FULLPERL
+    );
+}
+
+sub writeMakefile {
+    die <<END;
+
+The extension you are trying to build apparently is rather old and
+most probably outdated. We detect that from the fact, that a
+subroutine "writeMakefile" is called, and this subroutine is not
+supported anymore since about October 1994.
+
+Please contact the author or look into CPAN (details about CPAN can be
+found in the FAQ and at http:/www.perl.com) for a more recent version
+of the extension. If you're really desperate, you can try to change
+the subroutine name from writeMakefile to WriteMakefile and rerun
+'perl Makefile.PL', but you're most probably left alone, when you do
+so.
+
+The MakeMaker team
+
+END
+}
+
+sub new {
+    my($class,$self) = @_;
+    my($key);
+
+    # Store the original args passed to WriteMakefile()
+    foreach my $k (keys %$self) {
+        $self->{ARGS}{$k} = $self->{$k};
+    }
+
+    if ("@ARGV" =~ /\bPREREQ_PRINT\b/) {
+        require Data::Dumper;
+        print Data::Dumper->Dump([$self->{PREREQ_PM}], [qw(PREREQ_PM)]);
+        exit 0;
+    }
+
+    # PRINT_PREREQ is RedHatism.
+    if ("@ARGV" =~ /\bPRINT_PREREQ\b/) {
+        print join(" ", map { "perl($_)>=$self->{PREREQ_PM}->{$_} " } 
+                        sort keys %{$self->{PREREQ_PM}}), "\n";
+        exit 0;
+   }
+
+    print STDOUT "MakeMaker (v$VERSION)\n" if $Verbose;
+    if (-f "MANIFEST" && ! -f "Makefile"){
+        check_manifest();
+    }
+
+    $self = {} unless (defined $self);
+
+    check_hints($self);
+
+    my %configure_att;         # record &{$self->{CONFIGURE}} attributes
+    my(%initial_att) = %$self; # record initial attributes
+
+    my(%unsatisfied) = ();
+    foreach my $prereq (sort keys %{$self->{PREREQ_PM}}) {
+        # 5.8.0 has a bug with require Foo::Bar alone in an eval, so an
+        # extra statement is a workaround.
+        my $file = "$prereq.pm";
+        $file =~ s{::}{/}g;
+        eval { require $file };
+
+        my $pr_version = $prereq->VERSION || 0;
+
+        # convert X.Y_Z alpha version #s to X.YZ for easier comparisons
+        $pr_version =~ s/(\d+)\.(\d+)_(\d+)/$1.$2$3/;
+
+        if ($@) {
+            warn sprintf "Warning: prerequisite %s %s not found.\n", 
+              $prereq, $self->{PREREQ_PM}{$prereq} 
+                   unless $self->{PREREQ_FATAL};
+            $unsatisfied{$prereq} = 'not installed';
+        } elsif ($pr_version < $self->{PREREQ_PM}->{$prereq} ){
+            warn sprintf "Warning: prerequisite %s %s not found. We have %s.\n",
+              $prereq, $self->{PREREQ_PM}{$prereq}, 
+                ($pr_version || 'unknown version') 
+                  unless $self->{PREREQ_FATAL};
+            $unsatisfied{$prereq} = $self->{PREREQ_PM}->{$prereq} ? 
+              $self->{PREREQ_PM}->{$prereq} : 'unknown version' ;
+        }
+    }
+    if (%unsatisfied && $self->{PREREQ_FATAL}){
+        my $failedprereqs = join ', ', map {"$_ $unsatisfied{$_}"} 
+                            keys %unsatisfied;
+        die qq{MakeMaker FATAL: prerequisites not found ($failedprereqs)\n
+               Please install these modules first and rerun 'perl Makefile.PL'.\n};
+    }
+
+    if (defined $self->{CONFIGURE}) {
+        if (ref $self->{CONFIGURE} eq 'CODE') {
+            %configure_att = %{&{$self->{CONFIGURE}}};
+            $self = { %$self, %configure_att };
+        } else {
+            Carp::croak "Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n";
+        }
+    }
+
+    # This is for old Makefiles written pre 5.00, will go away
+    if ( Carp::longmess("") =~ /runsubdirpl/s ){
+        Carp::carp("WARNING: Please rerun 'perl Makefile.PL' to regenerate your Makefiles\n");
+    }
+
+    my $newclass = ++$PACKNAME;
+    local @Parent = @Parent;    # Protect against non-local exits
+    {
+        no strict 'refs';
+        print "Blessing Object into class [$newclass]\n" if $Verbose>=2;
+        mv_all_methods("MY",$newclass);
+        bless $self, $newclass;
+        push @Parent, $self;
+        require ExtUtils::MY;
+        @{"$newclass\:\:ISA"} = 'MM';
+    }
+
+    if (defined $Parent[-2]){
+        $self->{PARENT} = $Parent[-2];
+        my $key;
+        for $key (@Prepend_parent) {
+            next unless defined $self->{PARENT}{$key};
+
+            # Don't stomp on WriteMakefile() args.
+            next if defined $self->{ARGS}{$key} and
+                    $self->{ARGS}{$key} eq $self->{$key};
+
+            $self->{$key} = $self->{PARENT}{$key};
+
+            unless ($Is_VMS && $key =~ /PERL$/) {
+                $self->{$key} = $self->catdir("..",$self->{$key})
+                  unless $self->file_name_is_absolute($self->{$key});
+            } else {
+                # PERL or FULLPERL will be a command verb or even a
+                # command with an argument instead of a full file
+                # specification under VMS.  So, don't turn the command
+                # into a filespec, but do add a level to the path of
+                # the argument if not already absolute.
+                my @cmd = split /\s+/, $self->{$key};
+                $cmd[1] = $self->catfile('[-]',$cmd[1])
+                  unless (@cmd < 2) || $self->file_name_is_absolute($cmd[1]);
+                $self->{$key} = join(' ', @cmd);
+            }
+        }
+        if ($self->{PARENT}) {
+            $self->{PARENT}->{CHILDREN}->{$newclass} = $self;
+            foreach my $opt (qw(POLLUTE PERL_CORE)) {
+                if (exists $self->{PARENT}->{$opt}
+                    and not exists $self->{$opt})
+                    {
+                        # inherit, but only if already unspecified
+                        $self->{$opt} = $self->{PARENT}->{$opt};
+                    }
+            }
+        }
+        my @fm = grep /^FIRST_MAKEFILE=/, @ARGV;
+        parse_args($self,@fm) if @fm;
+    } else {
+        parse_args($self,split(' ', $ENV{PERL_MM_OPT} || ''),@ARGV);
+    }
+
+    $self->{NAME} ||= $self->guess_name;
+
+    ($self->{NAME_SYM} = $self->{NAME}) =~ s/\W+/_/g;
+
+    $self->init_main;
+    $self->init_VERSION;
+    $self->init_dist;
+    $self->init_INST;
+    $self->init_INSTALL;
+    $self->init_DEST;
+    $self->init_dirscan;
+    $self->init_xs;
+    $self->init_PERL;
+    $self->init_DIRFILESEP;
+    $self->init_linker;
+
+    if (! $self->{PERL_SRC} ) {
+        require VMS::Filespec if $Is_VMS;
+        my($pthinks) = $self->canonpath($INC{'Config.pm'});
+        my($cthinks) = $self->catfile($Config{'archlibexp'},'Config.pm');
+        $pthinks = VMS::Filespec::vmsify($pthinks) if $Is_VMS;
+        if ($pthinks ne $cthinks &&
+            !($Is_Win32 and lc($pthinks) eq lc($cthinks))) {
+            print "Have $pthinks expected $cthinks\n";
+            if ($Is_Win32) {
+                $pthinks =~ s![/\\]Config\.pm$!!i; $pthinks =~ s!.*[/\\]!!;
+            }
+            else {
+                $pthinks =~ s!/Config\.pm$!!; $pthinks =~ s!.*/!!;
+            }
+            print STDOUT <<END unless $self->{UNINSTALLED_PERL};
+Your perl and your Config.pm seem to have different ideas about the 
+architecture they are running on.
+Perl thinks: [$pthinks]
+Config says: [$Config{archname}]
+This may or may not cause problems. Please check your installation of perl 
+if you have problems building this extension.
+END
+        }
+    }
+
+    $self->init_others();
+    $self->init_platform();
+    $self->init_PERM();
+    my($argv) = neatvalue(\@ARGV);
+    $argv =~ s/^\[/(/;
+    $argv =~ s/\]$/)/;
+
+    push @{$self->{RESULT}}, <<END;
+# This Makefile is for the $self->{NAME} extension to perl.
+#
+# It was generated automatically by MakeMaker version
+# $VERSION (Revision: $Revision) from the contents of
+# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
+#
+#       ANY CHANGES MADE HERE WILL BE LOST!
+#
+#   MakeMaker ARGV: $argv
+#
+#   MakeMaker Parameters:
+END
+
+    foreach my $key (sort keys %initial_att){
+        next if $key eq 'ARGS';
+
+        my($v) = neatvalue($initial_att{$key});
+        $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
+        $v =~ tr/\n/ /s;
+        push @{$self->{RESULT}}, "#     $key => $v";
+    }
+    undef %initial_att;        # free memory
+
+    if (defined $self->{CONFIGURE}) {
+       push @{$self->{RESULT}}, <<END;
+
+#   MakeMaker 'CONFIGURE' Parameters:
+END
+        if (scalar(keys %configure_att) > 0) {
+            foreach my $key (sort keys %configure_att){
+               next if $key eq 'ARGS';
+               my($v) = neatvalue($configure_att{$key});
+               $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
+               $v =~ tr/\n/ /s;
+               push @{$self->{RESULT}}, "#     $key => $v";
+            }
+        }
+        else
+        {
+           push @{$self->{RESULT}}, "# no values returned";
+        }
+        undef %configure_att;  # free memory
+    }
+
+    # turn the SKIP array into a SKIPHASH hash
+    my (%skip,$skip);
+    for $skip (@{$self->{SKIP} || []}) {
+        $self->{SKIPHASH}{$skip} = 1;
+    }
+    delete $self->{SKIP}; # free memory
+
+    if ($self->{PARENT}) {
+        for (qw/install dist dist_basics dist_core distdir dist_test dist_ci/) {
+            $self->{SKIPHASH}{$_} = 1;
+        }
+    }
+
+    # We run all the subdirectories now. They don't have much to query
+    # from the parent, but the parent has to query them: if they need linking!
+    unless ($self->{NORECURS}) {
+        $self->eval_in_subdirs if @{$self->{DIR}};
+    }
+
+    foreach my $section ( @MM_Sections ){
+        # Support for new foo_target() methods.
+        my $method = $section;
+        $method .= '_target' unless $self->can($method);
+
+        print "Processing Makefile '$section' section\n" if ($Verbose >= 2);
+        my($skipit) = $self->skipcheck($section);
+        if ($skipit){
+            push @{$self->{RESULT}}, "\n# --- MakeMaker $section section $skipit.";
+        } else {
+            my(%a) = %{$self->{$section} || {}};
+            push @{$self->{RESULT}}, "\n# --- MakeMaker $section section:";
+            push @{$self->{RESULT}}, "# " . join ", ", %a if $Verbose && %a;
+            push @{$self->{RESULT}}, $self->nicetext($self->$method( %a ));
+        }
+    }
+
+    push @{$self->{RESULT}}, "\n# End.";
+
+    $self;
+}
+
+sub WriteEmptyMakefile {
+    Carp::croak "WriteEmptyMakefile: Need even number of args" if @_ % 2;
+
+    my %att = @_;
+    my $self = MM->new(\%att);
+    if (-f $self->{MAKEFILE_OLD}) {
+      _unlink($self->{MAKEFILE_OLD}) or 
+        warn "unlink $self->{MAKEFILE_OLD}: $!";
+    }
+    if ( -f $self->{MAKEFILE} ) {
+        _rename($self->{MAKEFILE}, $self->{MAKEFILE_OLD}) or
+          warn "rename $self->{MAKEFILE} => $self->{MAKEFILE_OLD}: $!"
+    }
+    open MF, '>'.$self->{MAKEFILE} or die "open $self->{MAKEFILE} for write: $!";
+    print MF <<'EOP';
+all:
+
+clean:
+
+install:
+
+makemakerdflt:
+
+test:
+
+EOP
+    close MF or die "close $self->{MAKEFILE} for write: $!";
+}
+
+sub check_manifest {
+    print STDOUT "Checking if your kit is complete...\n";
+    require ExtUtils::Manifest;
+    # avoid warning
+    $ExtUtils::Manifest::Quiet = $ExtUtils::Manifest::Quiet = 1;
+    my(@missed) = ExtUtils::Manifest::manicheck();
+    if (@missed) {
+        print STDOUT "Warning: the following files are missing in your kit:\n";
+        print "\t", join "\n\t", @missed;
+        print STDOUT "\n";
+        print STDOUT "Please inform the author.\n";
+    } else {
+        print STDOUT "Looks good\n";
+    }
+}
+
+sub parse_args{
+    my($self, @args) = @_;
+    foreach (@args) {
+        unless (m/(.*?)=(.*)/) {
+            ++$Verbose if m/^verb/;
+            next;
+        }
+        my($name, $value) = ($1, $2);
+        if ($value =~ m/^~(\w+)?/) { # tilde with optional username
+            $value =~ s [^~(\w*)]
+                [$1 ?
+                 ((getpwnam($1))[7] || "~$1") :
+                 (getpwuid($>))[7]
+                 ]ex;
+        }
+
+        # Remember the original args passed it.  It will be useful later.
+        $self->{ARGS}{uc $name} = $self->{uc $name} = $value;
+    }
+
+    # catch old-style 'potential_libs' and inform user how to 'upgrade'
+    if (defined $self->{potential_libs}){
+        my($msg)="'potential_libs' => '$self->{potential_libs}' should be";
+        if ($self->{potential_libs}){
+            print STDOUT "$msg changed to:\n\t'LIBS' => ['$self->{potential_libs}']\n";
+        } else {
+            print STDOUT "$msg deleted.\n";
+        }
+        $self->{LIBS} = [$self->{potential_libs}];
+        delete $self->{potential_libs};
+    }
+    # catch old-style 'ARMAYBE' and inform user how to 'upgrade'
+    if (defined $self->{ARMAYBE}){
+        my($armaybe) = $self->{ARMAYBE};
+        print STDOUT "ARMAYBE => '$armaybe' should be changed to:\n",
+                        "\t'dynamic_lib' => {ARMAYBE => '$armaybe'}\n";
+        my(%dl) = %{$self->{dynamic_lib} || {}};
+        $self->{dynamic_lib} = { %dl, ARMAYBE => $armaybe};
+        delete $self->{ARMAYBE};
+    }
+    if (defined $self->{LDTARGET}){
+        print STDOUT "LDTARGET should be changed to LDFROM\n";
+        $self->{LDFROM} = $self->{LDTARGET};
+        delete $self->{LDTARGET};
+    }
+    # Turn a DIR argument on the command line into an array
+    if (defined $self->{DIR} && ref \$self->{DIR} eq 'SCALAR') {
+        # So they can choose from the command line, which extensions they want
+        # the grep enables them to have some colons too much in case they
+        # have to build a list with the shell
+        $self->{DIR} = [grep $_, split ":", $self->{DIR}];
+    }
+    # Turn a INCLUDE_EXT argument on the command line into an array
+    if (defined $self->{INCLUDE_EXT} && ref \$self->{INCLUDE_EXT} eq 'SCALAR') {
+        $self->{INCLUDE_EXT} = [grep $_, split '\s+', $self->{INCLUDE_EXT}];
+    }
+    # Turn a EXCLUDE_EXT argument on the command line into an array
+    if (defined $self->{EXCLUDE_EXT} && ref \$self->{EXCLUDE_EXT} eq 'SCALAR') {
+        $self->{EXCLUDE_EXT} = [grep $_, split '\s+', $self->{EXCLUDE_EXT}];
+    }
+
+    foreach my $mmkey (sort keys %$self){
+        next if $mmkey eq 'ARGS';
+        print STDOUT "  $mmkey => ", neatvalue($self->{$mmkey}), "\n" if $Verbose;
+        print STDOUT "'$mmkey' is not a known MakeMaker parameter name.\n"
+            unless exists $Recognized_Att_Keys{$mmkey};
+    }
+    $| = 1 if $Verbose;
+}
+
+sub check_hints {
+    my($self) = @_;
+    # We allow extension-specific hints files.
+
+    require File::Spec;
+    my $curdir = File::Spec->curdir;
+
+    my $hint_dir = File::Spec->catdir($curdir, "hints");
+    return unless -d $hint_dir;
+
+    # First we look for the best hintsfile we have
+    my($hint)="${^O}_$Config{osvers}";
+    $hint =~ s/\./_/g;
+    $hint =~ s/_$//;
+    return unless $hint;
+
+    # Also try without trailing minor version numbers.
+    while (1) {
+        last if -f File::Spec->catfile($hint_dir, "$hint.pl");  # found
+    } continue {
+        last unless $hint =~ s/_[^_]*$//; # nothing to cut off
+    }
+    my $hint_file = File::Spec->catfile($hint_dir, "$hint.pl");
+
+    return unless -f $hint_file;    # really there
+
+    _run_hintfile($self, $hint_file);
+}
+
+sub _run_hintfile {
+    no strict 'vars';
+    local($self) = shift;       # make $self available to the hint file.
+    my($hint_file) = shift;
+
+    local($@, $!);
+    print STDERR "Processing hints file $hint_file\n";
+
+    # Just in case the ./ isn't on the hint file, which File::Spec can
+    # often strip off, we bung the curdir into @INC
+    local @INC = (File::Spec->curdir, @INC);
+    my $ret = do $hint_file;
+    if( !defined $ret ) {
+        my $error = $@ || $!;
+        print STDERR $error;
+    }
+}
+
+sub mv_all_methods {
+    my($from,$to) = @_;
+    no strict 'refs';
+    my($symtab) = \%{"${from}::"};
+
+    # Here you see the *current* list of methods that are overridable
+    # from Makefile.PL via MY:: subroutines. As of VERSION 5.07 I'm
+    # still trying to reduce the list to some reasonable minimum --
+    # because I want to make it easier for the user. A.K.
+
+    local $SIG{__WARN__} = sub { 
+        # can't use 'no warnings redefined', 5.6 only
+        warn @_ unless $_[0] =~ /^Subroutine .* redefined/ 
+    };
+    foreach my $method (@Overridable) {
+
+        # We cannot say "next" here. Nick might call MY->makeaperl
+        # which isn't defined right now
+
+        # Above statement was written at 4.23 time when Tk-b8 was
+        # around. As Tk-b9 only builds with 5.002something and MM 5 is
+        # standard, we try to enable the next line again. It was
+        # commented out until MM 5.23
+
+        next unless defined &{"${from}::$method"};
+
+        *{"${to}::$method"} = \&{"${from}::$method"};
+
+        # delete would do, if we were sure, nobody ever called
+        # MY->makeaperl directly
+
+        # delete $symtab->{$method};
+
+        # If we delete a method, then it will be undefined and cannot
+        # be called.  But as long as we have Makefile.PLs that rely on
+        # %MY:: being intact, we have to fill the hole with an
+        # inheriting method:
+
+        eval "package MY; sub $method { shift->SUPER::$method(\@_); }";
+    }
+
+    # We have to clean out %INC also, because the current directory is
+    # changed frequently and Graham Barr prefers to get his version
+    # out of a History.pl file which is "required" so woudn't get
+    # loaded again in another extension requiring a History.pl
+
+    # With perl5.002_01 the deletion of entries in %INC caused Tk-b11
+    # to core dump in the middle of a require statement. The required
+    # file was Tk/MMutil.pm.  The consequence is, we have to be
+    # extremely careful when we try to give perl a reason to reload a
+    # library with same name.  The workaround prefers to drop nothing
+    # from %INC and teach the writers not to use such libraries.
+
+#    my $inc;
+#    foreach $inc (keys %INC) {
+#       #warn "***$inc*** deleted";
+#       delete $INC{$inc};
+#    }
+}
+
+sub skipcheck {
+    my($self) = shift;
+    my($section) = @_;
+    if ($section eq 'dynamic') {
+        print STDOUT "Warning (non-fatal): Target 'dynamic' depends on targets ",
+        "in skipped section 'dynamic_bs'\n"
+            if $self->{SKIPHASH}{dynamic_bs} && $Verbose;
+        print STDOUT "Warning (non-fatal): Target 'dynamic' depends on targets ",
+        "in skipped section 'dynamic_lib'\n"
+            if $self->{SKIPHASH}{dynamic_lib} && $Verbose;
+    }
+    if ($section eq 'dynamic_lib') {
+        print STDOUT "Warning (non-fatal): Target '\$(INST_DYNAMIC)' depends on ",
+        "targets in skipped section 'dynamic_bs'\n"
+            if $self->{SKIPHASH}{dynamic_bs} && $Verbose;
+    }
+    if ($section eq 'static') {
+        print STDOUT "Warning (non-fatal): Target 'static' depends on targets ",
+        "in skipped section 'static_lib'\n"
+            if $self->{SKIPHASH}{static_lib} && $Verbose;
+    }
+    return 'skipped' if $self->{SKIPHASH}{$section};
+    return '';
+}
+
+sub flush {
+    my $self = shift;
+    my($chunk);
+    local *FH;
+    print STDOUT "Writing $self->{MAKEFILE} for $self->{NAME}\n";
+
+    unlink($self->{MAKEFILE}, "MakeMaker.tmp", $Is_VMS ? 'Descrip.MMS' : '');
+    open(FH,">MakeMaker.tmp") or die "Unable to open MakeMaker.tmp: $!";
+
+    for $chunk (@{$self->{RESULT}}) {
+        print FH "$chunk\n";
+    }
+
+    close FH;
+    my($finalname) = $self->{MAKEFILE};
+    _rename("MakeMaker.tmp", $finalname) or
+      warn "rename MakeMaker.tmp => $finalname: $!";
+    chmod 0644, $finalname unless $Is_VMS;
+
+    my %keep = map { ($_ => 1) } qw(NEEDS_LINKING HAS_LINK_CODE);
+
+    if ($self->{PARENT} && !$self->{_KEEP_AFTER_FLUSH}) {
+        foreach (keys %$self) { # safe memory
+            delete $self->{$_} unless $keep{$_};
+        }
+    }
+
+    system("$Config::Config{eunicefix} $finalname") unless $Config::Config{eunicefix} eq ":";
+}
+
+
+# This is a rename for OS's where the target must be unlinked first.
+sub _rename {
+    my($src, $dest) = @_;
+    chmod 0666, $dest;
+    unlink $dest;
+    return rename $src, $dest;
+}
+
+# This is an unlink for OS's where the target must be writable first.
+sub _unlink {
+    my @files = @_;
+    chmod 0666, @files;
+    return unlink @files;
+}
+
+
+# The following mkbootstrap() is only for installations that are calling
+# the pre-4.1 mkbootstrap() from their old Makefiles. This MakeMaker
+# writes Makefiles, that use ExtUtils::Mkbootstrap directly.
+sub mkbootstrap {
+    die <<END;
+!!! Your Makefile has been built such a long time ago, !!!
+!!! that is unlikely to work with current MakeMaker.   !!!
+!!! Please rebuild your Makefile                       !!!
+END
+}
+
+# Ditto for mksymlists() as of MakeMaker 5.17
+sub mksymlists {
+    die <<END;
+!!! Your Makefile has been built such a long time ago, !!!
+!!! that is unlikely to work with current MakeMaker.   !!!
+!!! Please rebuild your Makefile                       !!!
+END
+}
+
+sub neatvalue {
+    my($v) = @_;
+    return "undef" unless defined $v;
+    my($t) = ref $v;
+    return "q[$v]" unless $t;
+    if ($t eq 'ARRAY') {
+        my(@m, @neat);
+        push @m, "[";
+        foreach my $elem (@$v) {
+            push @neat, "q[$elem]";
+        }
+        push @m, join ", ", @neat;
+        push @m, "]";
+        return join "", @m;
+    }
+    return "$v" unless $t eq 'HASH';
+    my(@m, $key, $val);
+    while (($key,$val) = each %$v){
+        last unless defined $key; # cautious programming in case (undef,undef) is true
+        push(@m,"$key=>".neatvalue($val)) ;
+    }
+    return "{ ".join(', ',@m)." }";
+}
+
+sub selfdocument {
+    my($self) = @_;
+    my(@m);
+    if ($Verbose){
+        push @m, "\n# Full list of MakeMaker attribute values:";
+        foreach my $key (sort keys %$self){
+            next if $key eq 'RESULT' || $key =~ /^[A-Z][a-z]/;
+            my($v) = neatvalue($self->{$key});
+            $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
+            $v =~ tr/\n/ /s;
+            push @m, "# $key => $v";
+        }
+    }
+    join "\n", @m;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::MakeMaker - Create a module Makefile
+
+=head1 SYNOPSIS
+
+  use ExtUtils::MakeMaker;
+
+  WriteMakefile( ATTRIBUTE => VALUE [, ...] );
+
+=head1 DESCRIPTION
+
+This utility is designed to write a Makefile for an extension module
+from a Makefile.PL. It is based on the Makefile.SH model provided by
+Andy Dougherty and the perl5-porters.
+
+It splits the task of generating the Makefile into several subroutines
+that can be individually overridden.  Each subroutine returns the text
+it wishes to have written to the Makefile.
+
+MakeMaker is object oriented. Each directory below the current
+directory that contains a Makefile.PL is treated as a separate
+object. This makes it possible to write an unlimited number of
+Makefiles with a single invocation of WriteMakefile().
+
+=head2 How To Write A Makefile.PL
+
+See ExtUtils::MakeMaker::Tutorial.
+
+The long answer is the rest of the manpage :-)
+
+=head2 Default Makefile Behaviour
+
+The generated Makefile enables the user of the extension to invoke
+
+  perl Makefile.PL # optionally "perl Makefile.PL verbose"
+  make
+  make test        # optionally set TEST_VERBOSE=1
+  make install     # See below
+
+The Makefile to be produced may be altered by adding arguments of the
+form C<KEY=VALUE>. E.g.
+
+  perl Makefile.PL PREFIX=~
+
+Other interesting targets in the generated Makefile are
+
+  make config     # to check if the Makefile is up-to-date
+  make clean      # delete local temp files (Makefile gets renamed)
+  make realclean  # delete derived files (including ./blib)
+  make ci         # check in all the files in the MANIFEST file
+  make dist       # see below the Distribution Support section
+
+=head2 make test
+
+MakeMaker checks for the existence of a file named F<test.pl> in the
+current directory and if it exists it execute the script with the
+proper set of perl C<-I> options.
+
+MakeMaker also checks for any files matching glob("t/*.t"). It will
+execute all matching files in alphabetical order via the
+L<Test::Harness> module with the C<-I> switches set correctly.
+
+If you'd like to see the raw output of your tests, set the
+C<TEST_VERBOSE> variable to true.
+
+  make test TEST_VERBOSE=1
+
+=head2 make testdb
+
+A useful variation of the above is the target C<testdb>. It runs the
+test under the Perl debugger (see L<perldebug>). If the file
+F<test.pl> exists in the current directory, it is used for the test.
+
+If you want to debug some other testfile, set the C<TEST_FILE> variable
+thusly:
+
+  make testdb TEST_FILE=t/mytest.t
+
+By default the debugger is called using C<-d> option to perl. If you
+want to specify some other option, set the C<TESTDB_SW> variable:
+
+  make testdb TESTDB_SW=-Dx
+
+=head2 make install
+
+make alone puts all relevant files into directories that are named by
+the macros INST_LIB, INST_ARCHLIB, INST_SCRIPT, INST_MAN1DIR and
+INST_MAN3DIR.  All these default to something below ./blib if you are
+I<not> building below the perl source directory. If you I<are>
+building below the perl source, INST_LIB and INST_ARCHLIB default to
+../../lib, and INST_SCRIPT is not defined.
+
+The I<install> target of the generated Makefile copies the files found
+below each of the INST_* directories to their INSTALL*
+counterparts. Which counterparts are chosen depends on the setting of
+INSTALLDIRS according to the following table:
+
+                                 INSTALLDIRS set to
+                           perl        site          vendor
+
+                 PERLPREFIX      SITEPREFIX          VENDORPREFIX
+  INST_ARCHLIB   INSTALLARCHLIB  INSTALLSITEARCH     INSTALLVENDORARCH
+  INST_LIB       INSTALLPRIVLIB  INSTALLSITELIB      INSTALLVENDORLIB
+  INST_BIN       INSTALLBIN      INSTALLSITEBIN      INSTALLVENDORBIN
+  INST_SCRIPT    INSTALLSCRIPT   INSTALLSCRIPT       INSTALLSCRIPT
+  INST_MAN1DIR   INSTALLMAN1DIR  INSTALLSITEMAN1DIR  INSTALLVENDORMAN1DIR
+  INST_MAN3DIR   INSTALLMAN3DIR  INSTALLSITEMAN3DIR  INSTALLVENDORMAN3DIR
+
+The INSTALL... macros in turn default to their %Config
+($Config{installprivlib}, $Config{installarchlib}, etc.) counterparts.
+
+You can check the values of these variables on your system with
+
+    perl '-V:install.*'
+
+And to check the sequence in which the library directories are
+searched by perl, run
+
+    perl -le 'print join $/, @INC'
+
+Sometimes older versions of the module you're installing live in other
+directories in @INC.  Because Perl loads the first version of a module it 
+finds, not the newest, you might accidentally get one of these older
+versions even after installing a brand new version.  To delete I<all other
+versions of the module you're installing> (not simply older ones) set the
+C<UNINST> variable.
+
+    make install UNINST=1
+
+
+=head2 PREFIX and LIB attribute
+
+PREFIX and LIB can be used to set several INSTALL* attributes in one
+go. The quickest way to install a module in a non-standard place might
+be
+
+    perl Makefile.PL PREFIX=~
+
+This will install all files in the module under your home directory,
+with man pages and libraries going into an appropriate place (usually
+~/man and ~/lib).
+
+Another way to specify many INSTALL directories with a single
+parameter is LIB.
+
+    perl Makefile.PL LIB=~/lib
+
+This will install the module's architecture-independent files into
+~/lib, the architecture-dependent files into ~/lib/$archname.
+
+Note, that in both cases the tilde expansion is done by MakeMaker, not
+by perl by default, nor by make.
+
+Conflicts between parameters LIB, PREFIX and the various INSTALL*
+arguments are resolved so that:
+
+=over 4
+
+=item *
+
+setting LIB overrides any setting of INSTALLPRIVLIB, INSTALLARCHLIB,
+INSTALLSITELIB, INSTALLSITEARCH (and they are not affected by PREFIX);
+
+=item *
+
+without LIB, setting PREFIX replaces the initial C<$Config{prefix}>
+part of those INSTALL* arguments, even if the latter are explicitly
+set (but are set to still start with C<$Config{prefix}>).
+
+=back
+
+If the user has superuser privileges, and is not working on AFS or
+relatives, then the defaults for INSTALLPRIVLIB, INSTALLARCHLIB,
+INSTALLSCRIPT, etc. will be appropriate, and this incantation will be
+the best:
+
+    perl Makefile.PL; 
+    make; 
+    make test
+    make install
+
+make install per default writes some documentation of what has been
+done into the file C<$(INSTALLARCHLIB)/perllocal.pod>. This feature
+can be bypassed by calling make pure_install.
+
+=head2 AFS users
+
+will have to specify the installation directories as these most
+probably have changed since perl itself has been installed. They will
+have to do this by calling
+
+    perl Makefile.PL INSTALLSITELIB=/afs/here/today \
+        INSTALLSCRIPT=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
+    make
+
+Be careful to repeat this procedure every time you recompile an
+extension, unless you are sure the AFS installation directories are
+still valid.
+
+=head2 Static Linking of a new Perl Binary
+
+An extension that is built with the above steps is ready to use on
+systems supporting dynamic loading. On systems that do not support
+dynamic loading, any newly created extension has to be linked together
+with the available resources. MakeMaker supports the linking process
+by creating appropriate targets in the Makefile whenever an extension
+is built. You can invoke the corresponding section of the makefile with
+
+    make perl
+
+That produces a new perl binary in the current directory with all
+extensions linked in that can be found in INST_ARCHLIB, SITELIBEXP,
+and PERL_ARCHLIB. To do that, MakeMaker writes a new Makefile, on
+UNIX, this is called Makefile.aperl (may be system dependent). If you
+want to force the creation of a new perl, it is recommended, that you
+delete this Makefile.aperl, so the directories are searched-through
+for linkable libraries again.
+
+The binary can be installed into the directory where perl normally
+resides on your machine with
+
+    make inst_perl
+
+To produce a perl binary with a different name than C<perl>, either say
+
+    perl Makefile.PL MAP_TARGET=myperl
+    make myperl
+    make inst_perl
+
+or say
+
+    perl Makefile.PL
+    make myperl MAP_TARGET=myperl
+    make inst_perl MAP_TARGET=myperl
+
+In any case you will be prompted with the correct invocation of the
+C<inst_perl> target that installs the new binary into INSTALLBIN.
+
+make inst_perl per default writes some documentation of what has been
+done into the file C<$(INSTALLARCHLIB)/perllocal.pod>. This
+can be bypassed by calling make pure_inst_perl.
+
+Warning: the inst_perl: target will most probably overwrite your
+existing perl binary. Use with care!
+
+Sometimes you might want to build a statically linked perl although
+your system supports dynamic loading. In this case you may explicitly
+set the linktype with the invocation of the Makefile.PL or make:
+
+    perl Makefile.PL LINKTYPE=static    # recommended
+
+or
+
+    make LINKTYPE=static                # works on most systems
+
+=head2 Determination of Perl Library and Installation Locations
+
+MakeMaker needs to know, or to guess, where certain things are
+located.  Especially INST_LIB and INST_ARCHLIB (where to put the files
+during the make(1) run), PERL_LIB and PERL_ARCHLIB (where to read
+existing modules from), and PERL_INC (header files and C<libperl*.*>).
+
+Extensions may be built either using the contents of the perl source
+directory tree or from the installed perl library. The recommended way
+is to build extensions after you have run 'make install' on perl
+itself. You can do that in any directory on your hard disk that is not
+below the perl source tree. The support for extensions below the ext
+directory of the perl distribution is only good for the standard
+extensions that come with perl.
+
+If an extension is being built below the C<ext/> directory of the perl
+source then MakeMaker will set PERL_SRC automatically (e.g.,
+C<../..>).  If PERL_SRC is defined and the extension is recognized as
+a standard extension, then other variables default to the following:
+
+  PERL_INC     = PERL_SRC
+  PERL_LIB     = PERL_SRC/lib
+  PERL_ARCHLIB = PERL_SRC/lib
+  INST_LIB     = PERL_LIB
+  INST_ARCHLIB = PERL_ARCHLIB
+
+If an extension is being built away from the perl source then MakeMaker
+will leave PERL_SRC undefined and default to using the installed copy
+of the perl library. The other variables default to the following:
+
+  PERL_INC     = $archlibexp/CORE
+  PERL_LIB     = $privlibexp
+  PERL_ARCHLIB = $archlibexp
+  INST_LIB     = ./blib/lib
+  INST_ARCHLIB = ./blib/arch
+
+If perl has not yet been installed then PERL_SRC can be defined on the
+command line as shown in the previous section.
+
+
+=head2 Which architecture dependent directory?
+
+If you don't want to keep the defaults for the INSTALL* macros,
+MakeMaker helps you to minimize the typing needed: the usual
+relationship between INSTALLPRIVLIB and INSTALLARCHLIB is determined
+by Configure at perl compilation time. MakeMaker supports the user who
+sets INSTALLPRIVLIB. If INSTALLPRIVLIB is set, but INSTALLARCHLIB not,
+then MakeMaker defaults the latter to be the same subdirectory of
+INSTALLPRIVLIB as Configure decided for the counterparts in %Config ,
+otherwise it defaults to INSTALLPRIVLIB. The same relationship holds
+for INSTALLSITELIB and INSTALLSITEARCH.
+
+MakeMaker gives you much more freedom than needed to configure
+internal variables and get different results. It is worth to mention,
+that make(1) also lets you configure most of the variables that are
+used in the Makefile. But in the majority of situations this will not
+be necessary, and should only be done if the author of a package
+recommends it (or you know what you're doing).
+
+=head2 Using Attributes and Parameters
+
+The following attributes may be specified as arguments to WriteMakefile()
+or as NAME=VALUE pairs on the command line.
+
+=over 2
+
+=item ABSTRACT
+
+One line description of the module. Will be included in PPD file.
+
+=item ABSTRACT_FROM
+
+Name of the file that contains the package description. MakeMaker looks
+for a line in the POD matching /^($package\s-\s)(.*)/. This is typically
+the first line in the "=head1 NAME" section. $2 becomes the abstract.
+
+=item AUTHOR
+
+String containing name (and email address) of package author(s). Is used
+in PPD (Perl Package Description) files for PPM (Perl Package Manager).
+
+=item BINARY_LOCATION
+
+Used when creating PPD files for binary packages.  It can be set to a
+full or relative path or URL to the binary archive for a particular
+architecture.  For example:
+
+        perl Makefile.PL BINARY_LOCATION=x86/Agent.tar.gz
+
+builds a PPD package that references a binary of the C<Agent> package,
+located in the C<x86> directory relative to the PPD itself.
+
+=item C
+
+Ref to array of *.c file names. Initialised from a directory scan
+and the values portion of the XS attribute hash. This is not
+currently used by MakeMaker but may be handy in Makefile.PLs.
+
+=item CCFLAGS
+
+String that will be included in the compiler call command line between
+the arguments INC and OPTIMIZE.
+
+=item CONFIG
+
+Arrayref. E.g. [qw(archname manext)] defines ARCHNAME & MANEXT from
+config.sh. MakeMaker will add to CONFIG the following values anyway:
+ar
+cc
+cccdlflags
+ccdlflags
+dlext
+dlsrc
+ld
+lddlflags
+ldflags
+libc
+lib_ext
+obj_ext
+ranlib
+sitelibexp
+sitearchexp
+so
+
+=item CONFIGURE
+
+CODE reference. The subroutine should return a hash reference. The
+hash may contain further attributes, e.g. {LIBS =E<gt> ...}, that have to
+be determined by some evaluation method.
+
+=item DEFINE
+
+Something like C<"-DHAVE_UNISTD_H">
+
+=item DESTDIR
+
+This is the root directory into which the code will be installed.  It
+I<prepends itself to the normal prefix>.  For example, if your code
+would normally go into F</usr/local/lib/perl> you could set DESTDIR=~/tmp/
+and installation would go into F<~/tmp/usr/local/lib/perl>.
+
+This is primarily of use for people who repackage Perl modules.
+
+NOTE: Due to the nature of make, it is important that you put the trailing
+slash on your DESTDIR.  F<~/tmp/> not F<~/tmp>.
+
+=item DIR
+
+Ref to array of subdirectories containing Makefile.PLs e.g. [ 'sdbm'
+] in ext/SDBM_File
+
+=item DISTNAME
+
+A safe filename for the package. 
+
+Defaults to NAME above but with :: replaced with -.
+
+For example, Foo::Bar becomes Foo-Bar.
+
+=item DISTVNAME
+
+Your name for distributing the package with the version number
+included.  This is used by 'make dist' to name the resulting archive
+file.
+
+Defaults to DISTNAME-VERSION.
+
+For example, version 1.04 of Foo::Bar becomes Foo-Bar-1.04.
+
+On some OS's where . has special meaning VERSION_SYM may be used in
+place of VERSION.
+
+=item DL_FUNCS
+
+Hashref of symbol names for routines to be made available as universal
+symbols.  Each key/value pair consists of the package name and an
+array of routine names in that package.  Used only under AIX, OS/2,
+VMS and Win32 at present.  The routine names supplied will be expanded
+in the same way as XSUB names are expanded by the XS() macro.
+Defaults to
+
+  {"$(NAME)" => ["boot_$(NAME)" ] }
+
+e.g.
+
+  {"RPC" => [qw( boot_rpcb rpcb_gettime getnetconfigent )],
+   "NetconfigPtr" => [ 'DESTROY'] }
+
+Please see the L<ExtUtils::Mksymlists> documentation for more information
+about the DL_FUNCS, DL_VARS and FUNCLIST attributes.
+
+=item DL_VARS
+
+Array of symbol names for variables to be made available as universal symbols.
+Used only under AIX, OS/2, VMS and Win32 at present.  Defaults to [].
+(e.g. [ qw(Foo_version Foo_numstreams Foo_tree ) ])
+
+=item EXCLUDE_EXT
+
+Array of extension names to exclude when doing a static build.  This
+is ignored if INCLUDE_EXT is present.  Consult INCLUDE_EXT for more
+details.  (e.g.  [ qw( Socket POSIX ) ] )
+
+This attribute may be most useful when specified as a string on the
+command line:  perl Makefile.PL EXCLUDE_EXT='Socket Safe'
+
+=item EXE_FILES
+
+Ref to array of executable files. The files will be copied to the
+INST_SCRIPT directory. Make realclean will delete them from there
+again.
+
+If your executables start with something like #!perl or
+#!/usr/bin/perl MakeMaker will change this to the path of the perl
+'Makefile.PL' was invoked with so the programs will be sure to run
+properly even if perl is not in /usr/bin/perl.
+
+=item FIRST_MAKEFILE
+
+The name of the Makefile to be produced.  This is used for the second
+Makefile that will be produced for the MAP_TARGET.
+
+Defaults to 'Makefile' or 'Descrip.MMS' on VMS.
+
+(Note: we couldn't use MAKEFILE because dmake uses this for something
+else).
+
+=item FULLPERL
+
+Perl binary able to run this extension, load XS modules, etc...
+
+=item FULLPERLRUN
+
+Like PERLRUN, except it uses FULLPERL.
+
+=item FULLPERLRUNINST
+
+Like PERLRUNINST, except it uses FULLPERL.
+
+=item FUNCLIST
+
+This provides an alternate means to specify function names to be
+exported from the extension.  Its value is a reference to an
+array of function names to be exported by the extension.  These
+names are passed through unaltered to the linker options file.
+
+=item H
+
+Ref to array of *.h file names. Similar to C.
+
+=item IMPORTS
+
+This attribute is used to specify names to be imported into the
+extension. Takes a hash ref.
+
+It is only used on OS/2 and Win32.
+
+=item INC
+
+Include file dirs eg: C<"-I/usr/5include -I/path/to/inc">
+
+=item INCLUDE_EXT
+
+Array of extension names to be included when doing a static build.
+MakeMaker will normally build with all of the installed extensions when
+doing a static build, and that is usually the desired behavior.  If
+INCLUDE_EXT is present then MakeMaker will build only with those extensions
+which are explicitly mentioned. (e.g.  [ qw( Socket POSIX ) ])
+
+It is not necessary to mention DynaLoader or the current extension when
+filling in INCLUDE_EXT.  If the INCLUDE_EXT is mentioned but is empty then
+only DynaLoader and the current extension will be included in the build.
+
+This attribute may be most useful when specified as a string on the
+command line:  perl Makefile.PL INCLUDE_EXT='POSIX Socket Devel::Peek'
+
+=item INSTALLARCHLIB
+
+Used by 'make install', which copies files from INST_ARCHLIB to this
+directory if INSTALLDIRS is set to perl.
+
+=item INSTALLBIN
+
+Directory to install binary files (e.g. tkperl) into if
+INSTALLDIRS=perl.
+
+=item INSTALLDIRS
+
+Determines which of the sets of installation directories to choose:
+perl, site or vendor.  Defaults to site.
+
+=item INSTALLMAN1DIR
+
+=item INSTALLMAN3DIR
+
+These directories get the man pages at 'make install' time if
+INSTALLDIRS=perl.  Defaults to $Config{installman*dir}.
+
+If set to 'none', no man pages will be installed.
+
+=item INSTALLPRIVLIB
+
+Used by 'make install', which copies files from INST_LIB to this
+directory if INSTALLDIRS is set to perl.
+
+Defaults to $Config{installprivlib}.
+
+=item INSTALLSCRIPT
+
+Used by 'make install' which copies files from INST_SCRIPT to this
+directory.
+
+=item INSTALLSITEARCH
+
+Used by 'make install', which copies files from INST_ARCHLIB to this
+directory if INSTALLDIRS is set to site (default).
+
+=item INSTALLSITEBIN
+
+Used by 'make install', which copies files from INST_BIN to this
+directory if INSTALLDIRS is set to site (default).
+
+=item INSTALLSITELIB
+
+Used by 'make install', which copies files from INST_LIB to this
+directory if INSTALLDIRS is set to site (default).
+
+=item INSTALLSITEMAN1DIR
+
+=item INSTALLSITEMAN3DIR
+
+These directories get the man pages at 'make install' time if
+INSTALLDIRS=site (default).  Defaults to 
+$(SITEPREFIX)/man/man$(MAN*EXT).
+
+If set to 'none', no man pages will be installed.
+
+=item INSTALLVENDORARCH
+
+Used by 'make install', which copies files from INST_ARCHLIB to this
+directory if INSTALLDIRS is set to vendor.
+
+=item INSTALLVENDORBIN
+
+Used by 'make install', which copies files from INST_BIN to this
+directory if INSTALLDIRS is set to vendor.
+
+=item INSTALLVENDORLIB
+
+Used by 'make install', which copies files from INST_LIB to this
+directory if INSTALLDIRS is set to vendor.
+
+=item INSTALLVENDORMAN1DIR
+
+=item INSTALLVENDORMAN3DIR
+
+These directories get the man pages at 'make install' time if
+INSTALLDIRS=vendor.  Defaults to $(VENDORPREFIX)/man/man$(MAN*EXT).
+
+If set to 'none', no man pages will be installed.
+
+=item INST_ARCHLIB
+
+Same as INST_LIB for architecture dependent files.
+
+=item INST_BIN
+
+Directory to put real binary files during 'make'. These will be copied
+to INSTALLBIN during 'make install'
+
+=item INST_LIB
+
+Directory where we put library files of this extension while building
+it.
+
+=item INST_MAN1DIR
+
+Directory to hold the man pages at 'make' time
+
+=item INST_MAN3DIR
+
+Directory to hold the man pages at 'make' time
+
+=item INST_SCRIPT
+
+Directory, where executable files should be installed during
+'make'. Defaults to "./blib/script", just to have a dummy location during
+testing. make install will copy the files in INST_SCRIPT to
+INSTALLSCRIPT.
+
+=item LD
+
+Program to be used to link libraries for dynamic loading.
+
+Defaults to $Config{ld}.
+
+=item LDDLFLAGS
+
+Any special flags that might need to be passed to ld to create a
+shared library suitable for dynamic loading.  It is up to the makefile
+to use it.  (See L<Config/lddlflags>)
+
+Defaults to $Config{lddlflags}.
+
+=item LDFROM
+
+Defaults to "$(OBJECT)" and is used in the ld command to specify
+what files to link/load from (also see dynamic_lib below for how to
+specify ld flags)
+
+=item LIB
+
+LIB should only be set at C<perl Makefile.PL> time but is allowed as a
+MakeMaker argument. It has the effect of setting both INSTALLPRIVLIB
+and INSTALLSITELIB to that value regardless any explicit setting of
+those arguments (or of PREFIX).  INSTALLARCHLIB and INSTALLSITEARCH
+are set to the corresponding architecture subdirectory.
+
+=item LIBPERL_A
+
+The filename of the perllibrary that will be used together with this
+extension. Defaults to libperl.a.
+
+=item LIBS
+
+An anonymous array of alternative library
+specifications to be searched for (in order) until
+at least one library is found. E.g.
+
+  'LIBS' => ["-lgdbm", "-ldbm -lfoo", "-L/path -ldbm.nfs"]
+
+Mind, that any element of the array
+contains a complete set of arguments for the ld
+command. So do not specify
+
+  'LIBS' => ["-ltcl", "-ltk", "-lX11"]
+
+See ODBM_File/Makefile.PL for an example, where an array is needed. If
+you specify a scalar as in
+
+  'LIBS' => "-ltcl -ltk -lX11"
+
+MakeMaker will turn it into an array with one element.
+
+=item LINKTYPE
+
+'static' or 'dynamic' (default unless usedl=undef in
+config.sh). Should only be used to force static linking (also see
+linkext below).
+
+=item MAKEAPERL
+
+Boolean which tells MakeMaker, that it should include the rules to
+make a perl. This is handled automatically as a switch by
+MakeMaker. The user normally does not need it.
+
+=item MAKEFILE_OLD
+
+When 'make clean' or similar is run, the $(FIRST_MAKEFILE) will be
+backed up at this location.
+
+Defaults to $(FIRST_MAKEFILE).old or $(FIRST_MAKEFILE)_old on VMS.
+
+=item MAN1PODS
+
+Hashref of pod-containing files. MakeMaker will default this to all
+EXE_FILES files that include POD directives. The files listed
+here will be converted to man pages and installed as was requested
+at Configure time.
+
+=item MAN3PODS
+
+Hashref that assigns to *.pm and *.pod files the files into which the
+manpages are to be written. MakeMaker parses all *.pod and *.pm files
+for POD directives. Files that contain POD will be the default keys of
+the MAN3PODS hashref. These will then be converted to man pages during
+C<make> and will be installed during C<make install>.
+
+=item MAP_TARGET
+
+If it is intended, that a new perl binary be produced, this variable
+may hold a name for that binary. Defaults to perl
+
+=item MYEXTLIB
+
+If the extension links to a library that it builds set this to the
+name of the library (see SDBM_File)
+
+=item NAME
+
+Perl module name for this extension (DBD::Oracle). This will default
+to the directory name but should be explicitly defined in the
+Makefile.PL.
+
+=item NEEDS_LINKING
+
+MakeMaker will figure out if an extension contains linkable code
+anywhere down the directory tree, and will set this variable
+accordingly, but you can speed it up a very little bit if you define
+this boolean variable yourself.
+
+=item NOECHO
+
+Command so make does not print the literal commands its running.
+
+By setting it to an empty string you can generate a Makefile that
+prints all commands. Mainly used in debugging MakeMaker itself.
+
+Defaults to C<@>.
+
+=item NORECURS
+
+Boolean.  Attribute to inhibit descending into subdirectories.
+
+=item NO_META
+
+When true, suppresses the generation and addition to the MANIFEST of
+the META.yml module meta-data file during 'make distdir'.
+
+Defaults to false.
+
+=item NO_VC
+
+In general, any generated Makefile checks for the current version of
+MakeMaker and the version the Makefile was built under. If NO_VC is
+set, the version check is neglected. Do not write this into your
+Makefile.PL, use it interactively instead.
+
+=item OBJECT
+
+List of object files, defaults to '$(BASEEXT)$(OBJ_EXT)', but can be a long
+string containing all object files, e.g. "tkpBind.o
+tkpButton.o tkpCanvas.o"
+
+(Where BASEEXT is the last component of NAME, and OBJ_EXT is $Config{obj_ext}.)
+
+=item OPTIMIZE
+
+Defaults to C<-O>. Set it to C<-g> to turn debugging on. The flag is
+passed to subdirectory makes.
+
+=item PERL
+
+Perl binary for tasks that can be done by miniperl
+
+=item PERL_CORE
+
+Set only when MakeMaker is building the extensions of the Perl core
+distribution.
+
+=item PERLMAINCC
+
+The call to the program that is able to compile perlmain.c. Defaults
+to $(CC).
+
+=item PERL_ARCHLIB
+
+Same as for PERL_LIB, but for architecture dependent files.
+
+Used only when MakeMaker is building the extensions of the Perl core
+distribution (because normally $(PERL_ARCHLIB) is automatically in @INC,
+and adding it would get in the way of PERL5LIB).
+
+=item PERL_LIB
+
+Directory containing the Perl library to use.
+
+Used only when MakeMaker is building the extensions of the Perl core
+distribution (because normally $(PERL_LIB) is automatically in @INC,
+and adding it would get in the way of PERL5LIB).
+
+=item PERL_MALLOC_OK
+
+defaults to 0.  Should be set to TRUE if the extension can work with
+the memory allocation routines substituted by the Perl malloc() subsystem.
+This should be applicable to most extensions with exceptions of those
+
+=over 4
+
+=item *
+
+with bugs in memory allocations which are caught by Perl's malloc();
+
+=item *
+
+which interact with the memory allocator in other ways than via
+malloc(), realloc(), free(), calloc(), sbrk() and brk();
+
+=item *
+
+which rely on special alignment which is not provided by Perl's malloc().
+
+=back
+
+B<NOTE.>  Negligence to set this flag in I<any one> of loaded extension
+nullifies many advantages of Perl's malloc(), such as better usage of
+system resources, error detection, memory usage reporting, catchable failure
+of memory allocations, etc.
+
+=item PERLPREFIX
+
+Directory under which core modules are to be installed.
+
+Defaults to $Config{installprefixexp} falling back to
+$Config{installprefix}, $Config{prefixexp} or $Config{prefix} should
+$Config{installprefixexp} not exist.
+
+Overridden by PREFIX.
+
+=item PERLRUN
+
+Use this instead of $(PERL) when you wish to run perl.  It will set up
+extra necessary flags for you.
+
+=item PERLRUNINST
+
+Use this instead of $(PERL) when you wish to run perl to work with
+modules.  It will add things like -I$(INST_ARCH) and other necessary
+flags so perl can see the modules you're about to install.
+
+=item PERL_SRC
+
+Directory containing the Perl source code (use of this should be
+avoided, it may be undefined)
+
+=item PERM_RW
+
+Desired permission for read/writable files. Defaults to C<644>.
+See also L<MM_Unix/perm_rw>.
+
+=item PERM_RWX
+
+Desired permission for executable files. Defaults to C<755>.
+See also L<MM_Unix/perm_rwx>.
+
+=item PL_FILES
+
+MakeMaker can run programs to generate files for you at build time.
+By default any file named *.PL (except Makefile.PL and Build.PL) in
+the top level directory will be assumed to be a Perl program and run
+passing its own basename in as an argument.  For example...
+
+    perl foo.PL foo
+
+This behavior can be overridden by supplying your own set of files to
+search.  PL_FILES accepts a hash ref, the key being the file to run
+and the value is passed in as the first argument when the PL file is run.
+
+    PL_FILES => {'bin/foobar.PL' => 'bin/foobar'}
+
+Would run bin/foobar.PL like this:
+
+    perl bin/foobar.PL bin/foobar
+
+If multiple files from one program are desired an array ref can be used.
+
+    PL_FILES => {'bin/foobar.PL' => [qw(bin/foobar1 bin/foobar2)]}
+
+In this case the program will be run multiple times using each target file.
+
+    perl bin/foobar.PL bin/foobar1
+    perl bin/foobar.PL bin/foobar2
+
+PL files are normally run B<after> pm_to_blib and include INST_LIB and
+INST_ARCH in its C<@INC> so the just built modules can be
+accessed... unless the PL file is making a module (or anything else in
+PM) in which case it is run B<before> pm_to_blib and does not include
+INST_LIB and INST_ARCH in its C<@INC>.  This apparently odd behavior
+is there for backwards compatibility (and its somewhat DWIM).
+
+
+=item PM
+
+Hashref of .pm files and *.pl files to be installed.  e.g.
+
+  {'name_of_file.pm' => '$(INST_LIBDIR)/install_as.pm'}
+
+By default this will include *.pm and *.pl and the files found in
+the PMLIBDIRS directories.  Defining PM in the
+Makefile.PL will override PMLIBDIRS.
+
+=item PMLIBDIRS
+
+Ref to array of subdirectories containing library files.  Defaults to
+[ 'lib', $(BASEEXT) ]. The directories will be scanned and I<any> files
+they contain will be installed in the corresponding location in the
+library.  A libscan() method can be used to alter the behaviour.
+Defining PM in the Makefile.PL will override PMLIBDIRS.
+
+(Where BASEEXT is the last component of NAME.)
+
+=item PM_FILTER
+
+A filter program, in the traditional Unix sense (input from stdin, output
+to stdout) that is passed on each .pm file during the build (in the
+pm_to_blib() phase).  It is empty by default, meaning no filtering is done.
+
+Great care is necessary when defining the command if quoting needs to be
+done.  For instance, you would need to say:
+
+  {'PM_FILTER' => 'grep -v \\"^\\#\\"'}
+
+to remove all the leading coments on the fly during the build.  The
+extra \\ are necessary, unfortunately, because this variable is interpolated
+within the context of a Perl program built on the command line, and double
+quotes are what is used with the -e switch to build that command line.  The
+# is escaped for the Makefile, since what is going to be generated will then
+be:
+
+  PM_FILTER = grep -v \"^\#\"
+
+Without the \\ before the #, we'd have the start of a Makefile comment,
+and the macro would be incorrectly defined.
+
+=item POLLUTE
+
+Release 5.005 grandfathered old global symbol names by providing preprocessor
+macros for extension source compatibility.  As of release 5.6, these
+preprocessor definitions are not available by default.  The POLLUTE flag
+specifies that the old names should still be defined:
+
+  perl Makefile.PL POLLUTE=1
+
+Please inform the module author if this is necessary to successfully install
+a module under 5.6 or later.
+
+=item PPM_INSTALL_EXEC
+
+Name of the executable used to run C<PPM_INSTALL_SCRIPT> below. (e.g. perl)
+
+=item PPM_INSTALL_SCRIPT
+
+Name of the script that gets executed by the Perl Package Manager after
+the installation of a package.
+
+=item PREFIX
+
+This overrides all the default install locations.  Man pages,
+libraries, scripts, etc...  MakeMaker will try to make an educated
+guess about where to place things under the new PREFIX based on your
+Config defaults.  Failing that, it will fall back to a structure
+which should be sensible for your platform.
+
+If you specify LIB or any INSTALL* variables they will not be effected
+by the PREFIX.
+
+=item PREREQ_FATAL
+
+Bool. If this parameter is true, failing to have the required modules
+(or the right versions thereof) will be fatal. perl Makefile.PL will die
+with the proper message.
+
+Note: see L<Test::Harness> for a shortcut for stopping tests early if
+you are missing dependencies.
+
+Do I<not> use this parameter for simple requirements, which could be resolved
+at a later time, e.g. after an unsuccessful B<make test> of your module.
+
+It is I<extremely> rare to have to use C<PREREQ_FATAL> at all!
+
+=item PREREQ_PM
+
+Hashref: Names of modules that need to be available to run this
+extension (e.g. Fcntl for SDBM_File) are the keys of the hash and the
+desired version is the value. If the required version number is 0, we
+only check if any version is installed already.
+
+=item PREREQ_PRINT
+
+Bool.  If this parameter is true, the prerequisites will be printed to
+stdout and MakeMaker will exit.  The output format is an evalable hash
+ref.
+
+$PREREQ_PM = {
+               'A::B' => Vers1,
+               'C::D' => Vers2,
+               ...
+             };
+
+=item PRINT_PREREQ
+
+RedHatism for C<PREREQ_PRINT>.  The output format is different, though:
+
+    perl(A::B)>=Vers1 perl(C::D)>=Vers2 ...
+
+=item SITEPREFIX
+
+Like PERLPREFIX, but only for the site install locations.
+
+Defaults to $Config{siteprefixexp}.  Perls prior to 5.6.0 didn't have
+an explicit siteprefix in the Config.  In those cases
+$Config{installprefix} will be used.
+
+Overridable by PREFIX
+
+=item SIGN
+
+When true, perform the generation and addition to the MANIFEST of the
+SIGNATURE file in the distdir during 'make distdir', via 'cpansign
+-s'.
+
+Note that you need to install the Module::Signature module to
+perform this operation.
+
+Defaults to false.
+
+=item SKIP
+
+Arrayref. E.g. [qw(name1 name2)] skip (do not write) sections of the
+Makefile. Caution! Do not use the SKIP attribute for the negligible
+speedup. It may seriously damage the resulting Makefile. Only use it
+if you really need it.
+
+=item TYPEMAPS
+
+Ref to array of typemap file names.  Use this when the typemaps are
+in some directory other than the current directory or when they are
+not named B<typemap>.  The last typemap in the list takes
+precedence.  A typemap in the current directory has highest
+precedence, even if it isn't listed in TYPEMAPS.  The default system
+typemap has lowest precedence.
+
+=item VENDORPREFIX
+
+Like PERLPREFIX, but only for the vendor install locations.
+
+Defaults to $Config{vendorprefixexp}.
+
+Overridable by PREFIX
+
+=item VERBINST
+
+If true, make install will be verbose
+
+=item VERSION
+
+Your version number for distributing the package.  This defaults to
+0.1.
+
+=item VERSION_FROM
+
+Instead of specifying the VERSION in the Makefile.PL you can let
+MakeMaker parse a file to determine the version number. The parsing
+routine requires that the file named by VERSION_FROM contains one
+single line to compute the version number. The first line in the file
+that contains the regular expression
+
+    /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/
+
+will be evaluated with eval() and the value of the named variable
+B<after> the eval() will be assigned to the VERSION attribute of the
+MakeMaker object. The following lines will be parsed o.k.:
+
+    $VERSION = '1.00';
+    *VERSION = \'1.01';
+    $VERSION = sprintf "%d.%03d", q$Revision: 4535 $ =~ /(\d+)/g;
+    $FOO::VERSION = '1.10';
+    *FOO::VERSION = \'1.11';
+    our $VERSION = 1.2.3;       # new for perl5.6.0 
+
+but these will fail:
+
+    my $VERSION = '1.01';
+    local $VERSION = '1.02';
+    local $FOO::VERSION = '1.30';
+
+(Putting C<my> or C<local> on the preceding line will work o.k.)
+
+The file named in VERSION_FROM is not added as a dependency to
+Makefile. This is not really correct, but it would be a major pain
+during development to have to rewrite the Makefile for any smallish
+change in that file. If you want to make sure that the Makefile
+contains the correct VERSION macro after any change of the file, you
+would have to do something like
+
+    depend => { Makefile => '$(VERSION_FROM)' }
+
+See attribute C<depend> below.
+
+=item VERSION_SYM
+
+A sanitized VERSION with . replaced by _.  For places where . has
+special meaning (some filesystems, RCS labels, etc...)
+
+=item XS
+
+Hashref of .xs files. MakeMaker will default this.  e.g.
+
+  {'name_of_file.xs' => 'name_of_file.c'}
+
+The .c files will automatically be included in the list of files
+deleted by a make clean.
+
+=item XSOPT
+
+String of options to pass to xsubpp.  This might include C<-C++> or
+C<-extern>.  Do not include typemaps here; the TYPEMAP parameter exists for
+that purpose.
+
+=item XSPROTOARG
+
+May be set to an empty string, which is identical to C<-prototypes>, or
+C<-noprototypes>. See the xsubpp documentation for details. MakeMaker
+defaults to the empty string.
+
+=item XS_VERSION
+
+Your version number for the .xs file of this package.  This defaults
+to the value of the VERSION attribute.
+
+=back
+
+=head2 Additional lowercase attributes
+
+can be used to pass parameters to the methods which implement that
+part of the Makefile.  Parameters are specified as a hash ref but are
+passed to the method as a hash.
+
+=over 2
+
+=item clean
+
+  {FILES => "*.xyz foo"}
+
+=item depend
+
+  {ANY_TARGET => ANY_DEPENDECY, ...}
+
+(ANY_TARGET must not be given a double-colon rule by MakeMaker.)
+
+=item dist
+
+  {TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => '.gz',
+  SHAR => 'shar -m', DIST_CP => 'ln', ZIP => '/bin/zip',
+  ZIPFLAGS => '-rl', DIST_DEFAULT => 'private tardist' }
+
+If you specify COMPRESS, then SUFFIX should also be altered, as it is
+needed to tell make the target file of the compression. Setting
+DIST_CP to ln can be useful, if you need to preserve the timestamps on
+your files. DIST_CP can take the values 'cp', which copies the file,
+'ln', which links the file, and 'best' which copies symbolic links and
+links the rest. Default is 'best'.
+
+=item dynamic_lib
+
+  {ARMAYBE => 'ar', OTHERLDFLAGS => '...', INST_DYNAMIC_DEP => '...'}
+
+=item linkext
+
+  {LINKTYPE => 'static', 'dynamic' or ''}
+
+NB: Extensions that have nothing but *.pm files had to say
+
+  {LINKTYPE => ''}
+
+with Pre-5.0 MakeMakers. Since version 5.00 of MakeMaker such a line
+can be deleted safely. MakeMaker recognizes when there's nothing to
+be linked.
+
+=item macro
+
+  {ANY_MACRO => ANY_VALUE, ...}
+
+=item postamble
+
+Anything put here will be passed to MY::postamble() if you have one.
+
+=item realclean
+
+  {FILES => '$(INST_ARCHAUTODIR)/*.xyz'}
+
+=item test
+
+  {TESTS => 't/*.t'}
+
+=item tool_autosplit
+
+  {MAXLEN => 8}
+
+=back
+
+=head2 Overriding MakeMaker Methods
+
+If you cannot achieve the desired Makefile behaviour by specifying
+attributes you may define private subroutines in the Makefile.PL.
+Each subroutine returns the text it wishes to have written to
+the Makefile. To override a section of the Makefile you can
+either say:
+
+        sub MY::c_o { "new literal text" }
+
+or you can edit the default by saying something like:
+
+        package MY; # so that "SUPER" works right
+        sub c_o {
+            my $inherited = shift->SUPER::c_o(@_);
+            $inherited =~ s/old text/new text/;
+            $inherited;
+        }
+
+If you are running experiments with embedding perl as a library into
+other applications, you might find MakeMaker is not sufficient. You'd
+better have a look at ExtUtils::Embed which is a collection of utilities
+for embedding.
+
+If you still need a different solution, try to develop another
+subroutine that fits your needs and submit the diffs to
+C<makemaker@perl.org>
+
+For a complete description of all MakeMaker methods see
+L<ExtUtils::MM_Unix>.
+
+Here is a simple example of how to add a new target to the generated
+Makefile:
+
+    sub MY::postamble {
+        return <<'MAKE_FRAG';
+    $(MYEXTLIB): sdbm/Makefile
+            cd sdbm && $(MAKE) all
+
+    MAKE_FRAG
+    }
+
+=head2 The End Of Cargo Cult Programming
+
+WriteMakefile() now does some basic sanity checks on its parameters to
+protect against typos and malformatted values.  This means some things
+which happened to work in the past will now throw warnings and
+possibly produce internal errors.
+
+Some of the most common mistakes:
+
+=over 2
+
+=item C<< MAN3PODS => ' ' >>
+
+This is commonly used to supress the creation of man pages.  MAN3PODS
+takes a hash ref not a string, but the above worked by accident in old
+versions of MakeMaker.
+
+The correct code is C<< MAN3PODS => { } >>.
+
+=back
+
+
+=head2 Hintsfile support
+
+MakeMaker.pm uses the architecture specific information from
+Config.pm. In addition it evaluates architecture specific hints files
+in a C<hints/> directory. The hints files are expected to be named
+like their counterparts in C<PERL_SRC/hints>, but with an C<.pl> file
+name extension (eg. C<next_3_2.pl>). They are simply C<eval>ed by
+MakeMaker within the WriteMakefile() subroutine, and can be used to
+execute commands as well as to include special variables. The rules
+which hintsfile is chosen are the same as in Configure.
+
+The hintsfile is eval()ed immediately after the arguments given to
+WriteMakefile are stuffed into a hash reference $self but before this
+reference becomes blessed. So if you want to do the equivalent to
+override or create an attribute you would say something like
+
+    $self->{LIBS} = ['-ldbm -lucb -lc'];
+
+=head2 Distribution Support
+
+For authors of extensions MakeMaker provides several Makefile
+targets. Most of the support comes from the ExtUtils::Manifest module,
+where additional documentation can be found.
+
+=over 4
+
+=item    make distcheck
+
+reports which files are below the build directory but not in the
+MANIFEST file and vice versa. (See ExtUtils::Manifest::fullcheck() for
+details)
+
+=item    make skipcheck
+
+reports which files are skipped due to the entries in the
+C<MANIFEST.SKIP> file (See ExtUtils::Manifest::skipcheck() for
+details)
+
+=item    make distclean
+
+does a realclean first and then the distcheck. Note that this is not
+needed to build a new distribution as long as you are sure that the
+MANIFEST file is ok.
+
+=item    make manifest
+
+rewrites the MANIFEST file, adding all remaining files found (See
+ExtUtils::Manifest::mkmanifest() for details)
+
+=item    make distdir
+
+Copies all the files that are in the MANIFEST file to a newly created
+directory with the name C<$(DISTNAME)-$(VERSION)>. If that directory
+exists, it will be removed first.
+
+Additionally, it will create a META.yml module meta-data file in the
+distdir and add this to the distdir's MANFIEST.  You can shut this
+behavior off with the NO_META flag.
+
+=item   make disttest
+
+Makes a distdir first, and runs a C<perl Makefile.PL>, a make, and
+a make test in that directory.
+
+=item    make tardist
+
+First does a distdir. Then a command $(PREOP) which defaults to a null
+command, followed by $(TOUNIX), which defaults to a null command under
+UNIX, and will convert files in distribution directory to UNIX format
+otherwise. Next it runs C<tar> on that directory into a tarfile and
+deletes the directory. Finishes with a command $(POSTOP) which
+defaults to a null command.
+
+=item    make dist
+
+Defaults to $(DIST_DEFAULT) which in turn defaults to tardist.
+
+=item    make uutardist
+
+Runs a tardist first and uuencodes the tarfile.
+
+=item    make shdist
+
+First does a distdir. Then a command $(PREOP) which defaults to a null
+command. Next it runs C<shar> on that directory into a sharfile and
+deletes the intermediate directory again. Finishes with a command
+$(POSTOP) which defaults to a null command.  Note: For shdist to work
+properly a C<shar> program that can handle directories is mandatory.
+
+=item    make zipdist
+
+First does a distdir. Then a command $(PREOP) which defaults to a null
+command. Runs C<$(ZIP) $(ZIPFLAGS)> on that directory into a
+zipfile. Then deletes that directory. Finishes with a command
+$(POSTOP) which defaults to a null command.
+
+=item    make ci
+
+Does a $(CI) and a $(RCS_LABEL) on all files in the MANIFEST file.
+
+=back
+
+Customization of the dist targets can be done by specifying a hash
+reference to the dist attribute of the WriteMakefile call. The
+following parameters are recognized:
+
+    CI           ('ci -u')
+    COMPRESS     ('gzip --best')
+    POSTOP       ('@ :')
+    PREOP        ('@ :')
+    TO_UNIX      (depends on the system)
+    RCS_LABEL    ('rcs -q -Nv$(VERSION_SYM):')
+    SHAR         ('shar')
+    SUFFIX       ('.gz')
+    TAR          ('tar')
+    TARFLAGS     ('cvf')
+    ZIP          ('zip')
+    ZIPFLAGS     ('-r')
+
+An example:
+
+    WriteMakefile( 'dist' => { COMPRESS=>"bzip2", SUFFIX=>".bz2" })
+
+
+=head2 Module Meta-Data
+
+Long plaguing users of MakeMaker based modules has been the problem of
+getting basic information about the module out of the sources
+I<without> running the F<Makefile.PL> and doing a bunch of messy
+heuristics on the resulting F<Makefile>.  To this end a simple module
+meta-data file has been introduced, F<META.yml>.
+
+F<META.yml> is a YAML document (see http://www.yaml.org) containing
+basic information about the module (name, version, prerequisites...)
+in an easy to read format.  The format is developed and defined by the
+Module::Build developers (see 
+http://module-build.sourceforge.net/META-spec.html)
+
+MakeMaker will automatically generate a F<META.yml> file for you and
+add it to your F<MANIFEST> as part of the 'distdir' target (and thus
+the 'dist' target).  This is intended to seamlessly and rapidly
+populate CPAN with module meta-data.  If you wish to shut this feature
+off, set the C<NO_META> C<WriteMakefile()> flag to true.
+
+
+=head2 Disabling an extension
+
+If some events detected in F<Makefile.PL> imply that there is no way
+to create the Module, but this is a normal state of things, then you
+can create a F<Makefile> which does nothing, but succeeds on all the
+"usual" build targets.  To do so, use
+
+   ExtUtils::MakeMaker::WriteEmptyMakefile();
+
+instead of WriteMakefile().
+
+This may be useful if other modules expect this module to be I<built>
+OK, as opposed to I<work> OK (say, this system-dependent module builds
+in a subdirectory of some other distribution, or is listed as a
+dependency in a CPAN::Bundle, but the functionality is supported by
+different means on the current architecture).
+
+=head2 Other Handy Functions
+
+=over 4
+
+=item prompt
+
+    my $value = prompt($message);
+    my $value = prompt($message, $default);
+
+The C<prompt()> function provides an easy way to request user input
+used to write a makefile.  It displays the $message as a prompt for
+input.  If a $default is provided it will be used as a default.  The
+function returns the $value selected by the user.
+
+If C<prompt()> detects that it is not running interactively and there
+is nothing on STDIN or if the PERL_MM_USE_DEFAULT environment variable
+is set to true, the $default will be used without prompting.  This
+prevents automated processes from blocking on user input. 
+
+If no $default is provided an empty string will be used instead.
+
+=back
+
+
+=head1 ENVIRONMENT
+
+=over 4
+
+=item PERL_MM_OPT
+
+Command line options used by C<MakeMaker-E<gt>new()>, and thus by
+C<WriteMakefile()>.  The string is split on whitespace, and the result
+is processed before any actual command line arguments are processed.
+
+=item PERL_MM_USE_DEFAULT
+
+If set to a true value then MakeMaker's prompt function will
+always return the default without waiting for user input.
+
+=item PERL_CORE
+
+Same as the PERL_CORE parameter.  The parameter overrides this.
+
+=back
+
+=head1 SEE ALSO
+
+ExtUtils::MM_Unix, ExtUtils::Manifest ExtUtils::Install,
+ExtUtils::Embed
+
+=head1 AUTHORS
+
+Andy Dougherty C<doughera@lafayette.edu>, Andreas KE<ouml>nig
+C<andreas.koenig@mind.de>, Tim Bunce C<timb@cpan.org>.  VMS
+support by Charles Bailey C<bailey@newman.upenn.edu>.  OS/2 support
+by Ilya Zakharevich C<ilya@math.ohio-state.edu>.
+
+Currently maintained by Michael G Schwern C<schwern@pobox.com>
+
+Send patches and ideas to C<makemaker@perl.org>.
+
+Send bug reports via http://rt.cpan.org/.  Please send your
+generated Makefile along with your report.
+
+For more up-to-date information, see L<http://www.makemaker.org>.
+
+=head1 LICENSE
+
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/Config.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/Config.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/Config.pm	(revision 14489)
@@ -0,0 +1,39 @@
+package ExtUtils::MakeMaker::Config;
+
+$VERSION = '0.02';
+
+use strict;
+use Config ();
+
+# Give us an overridable config.
+use vars qw(%Config);
+%Config = %Config::Config;
+
+sub import {
+    my $caller = caller;
+
+    no strict 'refs';
+    *{$caller.'::Config'} = \%Config;
+}
+
+1;
+
+
+=head1 NAME
+
+ExtUtils::MakeMaker::Config - Wrapper around Config.pm
+
+
+=head1 SYNOPSIS
+
+  use ExtUtils::MakeMaker::Config;
+  print $Config{installbin};  # or whatever
+
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY>
+
+A very thin wrapper around Config.pm so MakeMaker is easier to test.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/FAQ.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/FAQ.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/FAQ.pod	(revision 14489)
@@ -0,0 +1,300 @@
+package ExtUtils::MakeMaker::FAQ;
+
+use vars qw($VERSION);
+$VERSION = '1.11';
+
+1;
+__END__
+
+=head1 NAME
+
+ExtUtils::MakeMaker::FAQ - Frequently Asked Questions About MakeMaker
+
+=head1 DESCRIPTION
+
+FAQs, tricks and tips for C<ExtUtils::MakeMaker>.
+
+
+=head2 Module Installation
+
+=over 4
+
+=item How do I keep from installing man pages?
+
+Recent versions of MakeMaker will only install man pages on Unix like
+operating systems.
+
+For an individual module:
+
+        perl Makefile.PL INSTALLMAN1DIR=none INSTALLMAN3DIR=none
+
+If you want to suppress man page installation for all modules you have
+to reconfigure Perl and tell it 'none' when it asks where to install
+man pages.
+
+
+=item How do I use a module without installing it?
+
+Two ways.  One is to build the module normally...
+
+        perl Makefile.PL
+        make
+
+...and then set the PERL5LIB environment variable to point at the
+blib/lib and blib/arch directories.
+
+The other is to install the module in a temporary location.
+
+        perl Makefile.PL PREFIX=~/tmp LIB=~/tmp/lib/perl
+
+And then set PERL5LIB to F<~/tmp/lib/perl>.  This works well when you have
+multiple modules to work with.  It also ensures that the module goes
+through its full installation process which may modify it.
+
+=back
+
+
+=head2 Philosophy and History
+
+=over 4
+
+=item Why not just use <insert other build config tool here>?
+
+Why did MakeMaker reinvent the build configuration wheel?  Why not
+just use autoconf or automake or ppm or Ant or ...
+
+There are many reasons, but the major one is cross-platform
+compatibility.
+
+Perl is one of the most ported pieces of software ever.  It works on
+operating systems I've never even heard of (see perlport for details).
+It needs a build tool that can work on all those platforms and with
+any wacky C compilers and linkers they might have.
+
+No such build tool exists.  Even make itself has wildly different
+dialects.  So we have to build our own.
+
+
+=item What is Module::Build and how does it relate to MakeMaker?
+
+Module::Build is a project by Ken Williams to supplant MakeMaker.
+Its primary advantages are:
+
+=over 8
+
+=item * pure perl.  no make, no shell commands
+
+=item * easier to customize
+
+=item * cleaner internals
+
+=item * less cruft
+
+=back
+
+Module::Build is the official heir apparent to MakeMaker and we
+encourage people to work on M::B rather than spending time adding features
+to MakeMaker.
+
+=back
+
+
+=head2 Module Writing
+
+=over 4
+
+=item How do I keep my $VERSION up to date without resetting it manually?
+
+Often you want to manually set the $VERSION in the main module
+distribution because this is the version that everybody sees on CPAN
+and maybe you want to customize it a bit.  But for all the other
+modules in your dist, $VERSION is really just bookkeeping and all that's
+important is it goes up every time the module is changed.  Doing this
+by hand is a pain and you often forget.
+
+Simplest way to do it automatically is to use your version control
+system's revision number (you are using version control, right?).
+
+In CVS, RCS and SVN you use $Revision$ (see the documentation of your
+version control system for details) writing it like so:
+
+    $VERSION = sprintf "%d.%03d", q$Revision$ =~ /(\d+)/g;
+
+Every time the file is checked in the $Revision$ will be updated,
+updating your $VERSION.
+
+In CVS version 1.9 is followed by 1.10.  Since CPAN compares version
+numbers numerically we use a sprintf() to convert 1.9 to 1.009 and
+1.10 to 1.010 which compare properly.
+
+If branches are involved (ie. $Revision: 1.5.3.4$) its a little more
+complicated.
+
+    # must be all on one line or MakeMaker will get confused.
+    $VERSION = do { my @r = (q$Revision$ =~ /\d+/g); sprintf "%d."."%03d" x $#r, @r };
+
+=item What's this F<META.yml> thing and how did it get in my F<MANIFEST>?!
+
+F<META.yml> is a module meta-data file pioneered by Module::Build and
+automatically generated as part of the 'distdir' target (and thus
+'dist').  See L<ExtUtils::MakeMaker/"Module Meta-Data">.
+
+To shut off its generation, pass the C<NO_META> flag to C<WriteMakefile()>.
+
+=back
+
+=head2 XS
+
+=over 4
+
+=item How to I prevent "object version X.XX does not match bootstrap parameter Y.YY" errors?
+
+XS code is very sensitive to the module version number and will
+complain if the version number in your Perl module doesn't match.  If
+you change your module's version # without reruning Makefile.PL the old
+version number will remain in the Makefile causing the XS code to be built
+with the wrong number.
+
+To avoid this, you can force the Makefile to be rebuilt whenever you
+change the module containing the version number by adding this to your
+WriteMakefile() arguments.
+
+    depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' }
+
+
+=item How do I make two or more XS files coexist in the same directory?
+
+Sometimes you need to have two and more XS files in the same package.
+One way to go is to put them into separate directories, but sometimes
+this is not the most suitable solution. The following technique allows
+you to put two (and more) XS files in the same directory.
+
+Let's assume that we have a package C<Cool::Foo>, which includes
+C<Cool::Foo> and C<Cool::Bar> modules each having a separate XS
+file. First we use the following I<Makefile.PL>:
+
+  use ExtUtils::MakeMaker;
+
+  WriteMakefile(
+      NAME		=> 'Cool::Foo',
+      VERSION_FROM	=> 'Foo.pm',
+      OBJECT              => q/$(O_FILES)/,
+      # ... other attrs ...
+  );
+
+Notice the C<OBJECT> attribute. MakeMaker generates the following
+variables in I<Makefile>:
+
+  # Handy lists of source code files:
+  XS_FILES= Bar.xs \
+  	Foo.xs
+  C_FILES = Bar.c \
+  	Foo.c
+  O_FILES = Bar.o \
+  	Foo.o
+
+Therefore we can use the C<O_FILES> variable to tell MakeMaker to use
+these objects into the shared library.
+
+That's pretty much it. Now write I<Foo.pm> and I<Foo.xs>, I<Bar.pm>
+and I<Bar.xs>, where I<Foo.pm> bootstraps the shared library and
+I<Bar.pm> simply loading I<Foo.pm>.
+
+The only issue left is to how to bootstrap I<Bar.xs>. This is done
+from I<Foo.xs>:
+
+  MODULE = Cool::Foo PACKAGE = Cool::Foo
+
+  BOOT:
+  # boot the second XS file
+  boot_Cool__Bar(aTHX_ cv);
+
+If you have more than two files, this is the place where you should
+boot extra XS files from.
+
+The following four files sum up all the details discussed so far.
+
+  Foo.pm:
+  -------
+  package Cool::Foo;
+
+  require DynaLoader;
+
+  our @ISA = qw(DynaLoader);
+  our $VERSION = '0.01';
+  bootstrap Cool::Foo $VERSION;
+
+  1;
+
+  Bar.pm:
+  -------
+  package Cool::Bar;
+
+  use Cool::Foo; # bootstraps Bar.xs
+
+  1;
+
+  Foo.xs:
+  -------
+  #include "EXTERN.h"
+  #include "perl.h"
+  #include "XSUB.h"
+
+  MODULE = Cool::Foo  PACKAGE = Cool::Foo
+
+  BOOT:
+  # boot the second XS file
+  boot_Cool__Bar(aTHX_ cv);
+
+  MODULE = Cool::Foo  PACKAGE = Cool::Foo  PREFIX = cool_foo_
+
+  void
+  cool_foo_perl_rules()
+
+      CODE:
+      fprintf(stderr, "Cool::Foo says: Perl Rules\n");
+
+  Bar.xs:
+  -------
+  #include "EXTERN.h"
+  #include "perl.h"
+  #include "XSUB.h"
+
+  MODULE = Cool::Bar  PACKAGE = Cool::Bar PREFIX = cool_bar_
+
+  void
+  cool_bar_perl_rules()
+
+      CODE:
+      fprintf(stderr, "Cool::Bar says: Perl Rules\n");
+
+And of course a very basic test:
+
+  test.pl:
+  --------
+  use Test;
+  BEGIN { plan tests => 1 };
+  use Cool::Foo;
+  use Cool::Bar;
+  Cool::Foo::perl_rules();
+  Cool::Bar::perl_rules();
+  ok 1;
+
+This tip has been brought to you by Nick Ing-Simmons and Stas Bekman.
+
+=back
+
+=head1 PATCHING
+
+If you have a question you'd like to see added to the FAQ (whether or
+not you have the answer) please send it to makemaker@perl.org.
+
+=head1 AUTHOR
+
+The denizens of makemaker@perl.org.
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/Tutorial.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/Tutorial.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/Tutorial.pod	(revision 14489)
@@ -0,0 +1,181 @@
+package ExtUtils::MakeMaker::Tutorial;
+
+use vars qw($VERSION);
+$VERSION = 0.02;
+
+
+=head1 NAME
+
+ExtUtils::MakeMaker::Tutorial - Writing a module with MakeMaker
+
+=head1 SYNOPSIS
+
+    use ExtUtils::MakeMaker;
+
+    WriteMakefile(
+        NAME            => 'Your::Module',
+        VERSION_FROM    => 'lib/Your/Module.pm'
+    );
+
+=head1 DESCRIPTION
+
+This is a short tutorial on writing a simple module with MakeMaker.
+Its really not that hard.
+
+
+=head2 The Mantra
+
+MakeMaker modules are installed using this simple mantra
+
+        perl Makefile.PL
+        make
+        make test
+        make install
+
+There are lots more commands and options, but the above will do it.
+
+
+=head2 The Layout
+
+The basic files in a module look something like this.
+
+        Makefile.PL
+        MANIFEST
+        lib/Your/Module.pm
+
+That's all that's strictly necessary.  There's additional files you might
+want:
+
+        lib/Your/Other/Module.pm
+        t/some_test.t
+        t/some_other_test.t
+        Changes
+        README
+        INSTALL
+        MANIFEST.SKIP
+        bin/some_program
+
+=over 4
+
+=item Makefile.PL
+
+When you run Makefile.PL, it makes a Makefile.  That's the whole point of
+MakeMaker.  The Makefile.PL is a simple program which loads
+ExtUtils::MakeMaker and runs the WriteMakefile() function to generate a
+Makefile.
+
+Here's an example of what you need for a simple module:
+
+    use ExtUtils::MakeMaker;
+
+    WriteMakefile(
+        NAME            => 'Your::Module',
+        VERSION_FROM    => 'lib/Your/Module.pm'
+    );
+
+NAME is the top-level namespace of your module.  VERSION_FROM is the file
+which contains the $VERSION variable for the entire distribution.  Typically
+this is the same as your top-level module.
+
+
+=item MANIFEST
+
+A simple listing of all the files in your distribution.
+
+        Makefile.PL
+        MANIFEST
+        lib/Your/Module.pm
+
+File paths in a MANIFEST always use Unix conventions (ie. /) even if you're
+not on Unix.
+
+You can write this by hand or generate it with 'make manifest'.
+
+See L<ExtUtils::Manifest> for more details.
+
+
+=item lib/
+
+This is the directory where your .pm and .pod files you wish to have
+installed go.  They are layed out according to namespace.  So Foo::Bar
+is F<lib/Foo/Bar.pm>.
+
+
+=item t/
+
+Tests for your modules go here.  Each test filename ends with a .t.
+So F<t/foo.t>/  'make test' will run these tests.  The directory is flat,
+you cannot, for example, have t/foo/bar.t run by 'make test'.
+
+Tests are run from the top level of your distribution.  So inside a test
+you would refer to ./lib to enter the lib directory, for example.
+
+
+=item Changes
+
+A log of changes you've made to this module.  The layout is free-form.
+Here's an example:
+
+    1.01 Fri Apr 11 00:21:25 PDT 2003
+        - thing() does some stuff now
+        - fixed the wiggy bug in withit()
+
+    1.00 Mon Apr  7 00:57:15 PDT 2003
+        - "Rain of Frogs" now supported
+
+
+=item README
+
+A short description of your module, what it does, why someone would use it
+and its limitations.  CPAN automatically pulls your README file out of
+the archive and makes it available to CPAN users, it is the first thing
+they will read to decide if your module is right for them.
+
+
+=item INSTALL
+
+Instructions on how to install your module along with any dependencies.
+Suggested information to include here:
+
+    any extra modules required for use
+    the minimum version of Perl required
+    if only works on certain operating systems
+
+
+=item MANIFEST.SKIP
+
+A file full of regular expressions to exclude when using 'make
+manifest' to generate the MANIFEST.  These regular expressions
+are checked against each file path found in the distribution (so
+you're matching against "t/foo.t" not "foo.t").
+
+Here's a sample:
+
+    ~$          # ignore emacs and vim backup files
+    .bak$       # ignore manual backups
+    \#          # ignore CVS old revision files and emacs temp files
+
+Since # can be used for comments, # must be escaped.
+
+MakeMaker comes with a default MANIFEST.SKIP to avoid things like
+version control directories and backup files.  Specifying your own
+will override this default.
+
+
+=item bin/
+
+
+=back
+
+=head1 SEE ALSO
+
+L<perlmodstyle> gives stylistic help writing a module.
+
+L<perlnewmod> gives more information about how to write a module.
+
+There are modules to help you through the process of writing a module:
+L<ExtUtils::ModuleMaker>, L<Module::Install>, L<PAR>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/bytes.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/bytes.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/bytes.pm	(revision 14489)
@@ -0,0 +1,39 @@
+package ExtUtils::MakeMaker::bytes;
+
+use vars qw($VERSION);
+$VERSION = 0.01;
+
+my $Have_Bytes = eval q{require bytes; 1;};
+
+sub import {
+    return unless $Have_Bytes;
+
+    shift;
+    unshift @_, 'bytes';
+
+    goto &bytes::import;
+}
+
+1;
+
+
+=head1 NAME
+
+ExtUtils::MakeMaker::bytes - Version-agnostic bytes.pm
+
+=head1 SYNOPSIS
+
+  use just like bytes.pm
+
+=head1 DESCRIPTION
+
+bytes.pm was introduced with 5.6.  This means any code which has 'use
+bytes' in it won't even compile on 5.5.X.  Since bytes is a lexical
+pragma and must be used at compile time we can't simply wrap it in
+a BEGIN { eval 'use bytes' } block.
+
+ExtUtils::MakeMaker::bytes is just a very thin wrapper around bytes
+which works just like it when bytes.pm exists and everywhere else it
+does nothing.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/vmsish.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/vmsish.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/MakeMaker/vmsish.pm	(revision 14489)
@@ -0,0 +1,40 @@
+package ExtUtils::MakeMaker::vmsish;
+
+use vars qw($VERSION);
+$VERSION = 0.01;
+
+my $IsVMS = $^O eq 'VMS';
+
+require vmsish if $IsVMS;
+
+
+sub import {
+    return unless $IsVMS;
+
+    shift;
+    unshift @_, 'vmsish';
+
+    goto &vmsish::import;
+}
+
+1;
+
+
+=head1 NAME
+
+ExtUtils::MakeMaker::vmsish - Platform-agnostic vmsish.pm
+
+=head1 SYNOPSIS
+
+  use just like vmsish.pm
+
+=head1 DESCRIPTION
+
+Until 5.8.0, vmsish.pm is only installed on VMS.  This means any code
+which has 'use vmsish' in it won't even compile outside VMS.  This
+makes ExtUtils::MM_VMS very hard to test.
+
+ExtUtils::MakeMaker::vmsish is just a very thin wrapper around vmsish
+which works just like it on VMS and everywhere else it does nothing.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Manifest.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Manifest.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Manifest.pm	(revision 14489)
@@ -0,0 +1,708 @@
+package ExtUtils::Manifest;
+
+require Exporter;
+use Config;
+use File::Basename;
+use File::Copy 'copy';
+use File::Find;
+use File::Spec;
+use Carp;
+use strict;
+
+use vars qw($VERSION @ISA @EXPORT_OK 
+          $Is_MacOS $Is_VMS 
+          $Debug $Verbose $Quiet $MANIFEST $DEFAULT_MSKIP);
+
+$VERSION = '1.46';
+@ISA=('Exporter');
+@EXPORT_OK = qw(mkmanifest
+                manicheck  filecheck  fullcheck  skipcheck
+                manifind   maniread   manicopy   maniadd
+               );
+
+$Is_MacOS = $^O eq 'MacOS';
+$Is_VMS   = $^O eq 'VMS';
+require VMS::Filespec if $Is_VMS;
+
+$Debug   = $ENV{PERL_MM_MANIFEST_DEBUG} || 0;
+$Verbose = defined $ENV{PERL_MM_MANIFEST_VERBOSE} ?
+                   $ENV{PERL_MM_MANIFEST_VERBOSE} : 1;
+$Quiet = 0;
+$MANIFEST = 'MANIFEST';
+
+$DEFAULT_MSKIP = File::Spec->catfile( dirname(__FILE__), "$MANIFEST.SKIP" );
+
+
+=head1 NAME
+
+ExtUtils::Manifest - utilities to write and check a MANIFEST file
+
+=head1 SYNOPSIS
+
+    use ExtUtils::Manifest qw(...funcs to import...);
+
+    mkmanifest();
+
+    my @missing_files    = manicheck;
+    my @skipped          = skipcheck;
+    my @extra_files      = filecheck;
+    my($missing, $extra) = fullcheck;
+
+    my $found    = manifind();
+
+    my $manifest = maniread();
+
+    manicopy($read,$target);
+
+    maniadd({$file => $comment, ...});
+
+
+=head1 DESCRIPTION
+
+=head2 Functions
+
+ExtUtils::Manifest exports no functions by default.  The following are
+exported on request
+
+=over 4
+
+=item mkmanifest
+
+    mkmanifest();
+
+Writes all files in and below the current directory to your F<MANIFEST>.
+It works similar to
+
+    find . > MANIFEST
+
+All files that match any regular expression in a file F<MANIFEST.SKIP>
+(if it exists) are ignored.
+
+Any existing F<MANIFEST> file will be saved as F<MANIFEST.bak>.  Lines
+from the old F<MANIFEST> file is preserved, including any comments
+that are found in the existing F<MANIFEST> file in the new one.
+
+=cut
+
+sub _sort {
+    return sort { lc $a cmp lc $b } @_;
+}
+
+sub mkmanifest {
+    my $manimiss = 0;
+    my $read = (-r 'MANIFEST' && maniread()) or $manimiss++;
+    $read = {} if $manimiss;
+    local *M;
+    rename $MANIFEST, "$MANIFEST.bak" unless $manimiss;
+    open M, ">$MANIFEST" or die "Could not open $MANIFEST: $!";
+    my $skip = _maniskip();
+    my $found = manifind();
+    my($key,$val,$file,%all);
+    %all = (%$found, %$read);
+    $all{$MANIFEST} = ($Is_VMS ? "$MANIFEST\t\t" : '') . 'This list of files'
+        if $manimiss; # add new MANIFEST to known file list
+    foreach $file (_sort keys %all) {
+	if ($skip->($file)) {
+	    # Policy: only remove files if they're listed in MANIFEST.SKIP.
+	    # Don't remove files just because they don't exist.
+	    warn "Removed from $MANIFEST: $file\n" if $Verbose and exists $read->{$file};
+	    next;
+	}
+	if ($Verbose){
+	    warn "Added to $MANIFEST: $file\n" unless exists $read->{$file};
+	}
+	my $text = $all{$file};
+	($file,$text) = split(/\s+/,$text,2) if $Is_VMS && $text;
+	$file = _unmacify($file);
+	my $tabs = (5 - (length($file)+1)/8);
+	$tabs = 1 if $tabs < 1;
+	$tabs = 0 unless $text;
+	print M $file, "\t" x $tabs, $text, "\n";
+    }
+    close M;
+}
+
+# Geez, shouldn't this use File::Spec or File::Basename or something?  
+# Why so careful about dependencies?
+sub clean_up_filename {
+  my $filename = shift;
+  $filename =~ s|^\./||;
+  $filename =~ s/^:([^:]+)$/$1/ if $Is_MacOS;
+  return $filename;
+}
+
+
+=item manifind
+
+    my $found = manifind();
+
+returns a hash reference. The keys of the hash are the files found
+below the current directory.
+
+=cut
+
+sub manifind {
+    my $p = shift || {};
+    my $found = {};
+
+    my $wanted = sub {
+	my $name = clean_up_filename($File::Find::name);
+	warn "Debug: diskfile $name\n" if $Debug;
+	return if -d $_;
+	
+        if( $Is_VMS ) {
+            $name =~ s#(.*)\.$#\L$1#;
+            $name = uc($name) if $name =~ /^MANIFEST(\.SKIP)?$/i;
+        }
+	$found->{$name} = "";
+    };
+
+    # We have to use "$File::Find::dir/$_" in preprocess, because 
+    # $File::Find::name is unavailable.
+    # Also, it's okay to use / here, because MANIFEST files use Unix-style 
+    # paths.
+    find({wanted => $wanted},
+	 $Is_MacOS ? ":" : ".");
+
+    return $found;
+}
+
+
+=item manicheck
+
+    my @missing_files = manicheck();
+
+checks if all the files within a C<MANIFEST> in the current directory
+really do exist. If C<MANIFEST> and the tree below the current
+directory are in sync it silently returns an empty list.
+Otherwise it returns a list of files which are listed in the
+C<MANIFEST> but missing from the directory, and by default also
+outputs these names to STDERR.
+
+=cut
+
+sub manicheck {
+    return _check_files();
+}
+
+
+=item filecheck
+
+    my @extra_files = filecheck();
+
+finds files below the current directory that are not mentioned in the
+C<MANIFEST> file. An optional file C<MANIFEST.SKIP> will be
+consulted. Any file matching a regular expression in such a file will
+not be reported as missing in the C<MANIFEST> file. The list of any
+extraneous files found is returned, and by default also reported to
+STDERR.
+
+=cut
+
+sub filecheck {
+    return _check_manifest();
+}
+
+
+=item fullcheck
+
+    my($missing, $extra) = fullcheck();
+
+does both a manicheck() and a filecheck(), returning then as two array
+refs.
+
+=cut
+
+sub fullcheck {
+    return [_check_files()], [_check_manifest()];
+}
+
+
+=item skipcheck
+
+    my @skipped = skipcheck();
+
+lists all the files that are skipped due to your C<MANIFEST.SKIP>
+file.
+
+=cut
+
+sub skipcheck {
+    my($p) = @_;
+    my $found = manifind();
+    my $matches = _maniskip();
+
+    my @skipped = ();
+    foreach my $file (_sort keys %$found){
+        if (&$matches($file)){
+            warn "Skipping $file\n";
+            push @skipped, $file;
+            next;
+        }
+    }
+
+    return @skipped;
+}
+
+
+sub _check_files {
+    my $p = shift;
+    my $dosnames=(defined(&Dos::UseLFN) && Dos::UseLFN()==0);
+    my $read = maniread() || {};
+    my $found = manifind($p);
+
+    my(@missfile) = ();
+    foreach my $file (_sort keys %$read){
+        warn "Debug: manicheck checking from $MANIFEST $file\n" if $Debug;
+        if ($dosnames){
+            $file = lc $file;
+            $file =~ s=(\.(\w|-)+)=substr ($1,0,4)=ge;
+            $file =~ s=((\w|-)+)=substr ($1,0,8)=ge;
+        }
+        unless ( exists $found->{$file} ) {
+            warn "No such file: $file\n" unless $Quiet;
+            push @missfile, $file;
+        }
+    }
+
+    return @missfile;
+}
+
+
+sub _check_manifest {
+    my($p) = @_;
+    my $read = maniread() || {};
+    my $found = manifind($p);
+    my $skip  = _maniskip();
+
+    my @missentry = ();
+    foreach my $file (_sort keys %$found){
+        next if $skip->($file);
+        warn "Debug: manicheck checking from disk $file\n" if $Debug;
+        unless ( exists $read->{$file} ) {
+            my $canon = $Is_MacOS ? "\t" . _unmacify($file) : '';
+            warn "Not in $MANIFEST: $file$canon\n" unless $Quiet;
+            push @missentry, $file;
+        }
+    }
+
+    return @missentry;
+}
+
+
+=item maniread
+
+    my $manifest = maniread();
+    my $manifest = maniread($manifest_file);
+
+reads a named C<MANIFEST> file (defaults to C<MANIFEST> in the current
+directory) and returns a HASH reference with files being the keys and
+comments being the values of the HASH.  Blank lines and lines which
+start with C<#> in the C<MANIFEST> file are discarded.
+
+=cut
+
+sub maniread {
+    my ($mfile) = @_;
+    $mfile ||= $MANIFEST;
+    my $read = {};
+    local *M;
+    unless (open M, $mfile){
+        warn "$mfile: $!";
+        return $read;
+    }
+    local $_;
+    while (<M>){
+        chomp;
+        next if /^\s*#/;
+
+        my($file, $comment) = /^(\S+)\s*(.*)/;
+        next unless $file;
+
+        if ($Is_MacOS) {
+            $file = _macify($file);
+            $file =~ s/\\([0-3][0-7][0-7])/sprintf("%c", oct($1))/ge;
+        }
+        elsif ($Is_VMS) {
+            require File::Basename;
+            my($base,$dir) = File::Basename::fileparse($file);
+            # Resolve illegal file specifications in the same way as tar
+            $dir =~ tr/./_/;
+            my(@pieces) = split(/\./,$base);
+            if (@pieces > 2) { $base = shift(@pieces) . '.' . join('_',@pieces); }
+            my $okfile = "$dir$base";
+            warn "Debug: Illegal name $file changed to $okfile\n" if $Debug;
+            $file = $okfile;
+            $file = lc($file) unless $file =~ /^MANIFEST(\.SKIP)?$/;
+        }
+
+        $read->{$file} = $comment;
+    }
+    close M;
+    $read;
+}
+
+# returns an anonymous sub that decides if an argument matches
+sub _maniskip {
+    my @skip ;
+    my $mfile = "$MANIFEST.SKIP";
+    local(*M,$_);
+    open M, $mfile or open M, $DEFAULT_MSKIP or return sub {0};
+    while (<M>){
+	chomp;
+	next if /^#/;
+	next if /^\s*$/;
+	push @skip, _macify($_);
+    }
+    close M;
+    my $opts = $Is_VMS ? '(?i)' : '';
+
+    # Make sure each entry is isolated in its own parentheses, in case
+    # any of them contain alternations
+    my $regex = join '|', map "(?:$_)", @skip;
+
+    return sub { $_[0] =~ qr{$opts$regex} };
+}
+
+=item manicopy
+
+    manicopy(\%src, $dest_dir);
+    manicopy(\%src, $dest_dir, $how);
+
+Copies the files that are the keys in %src to the $dest_dir.  %src is
+typically returned by the maniread() function.
+
+    manicopy( maniread(), $dest_dir );
+
+This function is useful for producing a directory tree identical to the 
+intended distribution tree. 
+
+$how can be used to specify a different methods of "copying".  Valid
+values are C<cp>, which actually copies the files, C<ln> which creates
+hard links, and C<best> which mostly links the files but copies any
+symbolic link to make a tree without any symbolic link.  C<cp> is the 
+default.
+
+=cut
+
+sub manicopy {
+    my($read,$target,$how)=@_;
+    croak "manicopy() called without target argument" unless defined $target;
+    $how ||= 'cp';
+    require File::Path;
+    require File::Basename;
+
+    $target = VMS::Filespec::unixify($target) if $Is_VMS;
+    File::Path::mkpath([ $target ],! $Quiet,$Is_VMS ? undef : 0755);
+    foreach my $file (keys %$read){
+    	if ($Is_MacOS) {
+	    if ($file =~ m!:!) { 
+	   	my $dir = _maccat($target, $file);
+		$dir =~ s/[^:]+$//;
+	    	File::Path::mkpath($dir,1,0755);
+	    }
+	    cp_if_diff($file, _maccat($target, $file), $how);
+	} else {
+	    $file = VMS::Filespec::unixify($file) if $Is_VMS;
+	    if ($file =~ m!/!) { # Ilya, that hurts, I fear, or maybe not?
+		my $dir = File::Basename::dirname($file);
+		$dir = VMS::Filespec::unixify($dir) if $Is_VMS;
+		File::Path::mkpath(["$target/$dir"],! $Quiet,$Is_VMS ? undef : 0755);
+	    }
+	    cp_if_diff($file, "$target/$file", $how);
+	}
+    }
+}
+
+sub cp_if_diff {
+    my($from, $to, $how)=@_;
+    -f $from or carp "$0: $from not found";
+    my($diff) = 0;
+    local(*F,*T);
+    open(F,"< $from\0") or die "Can't read $from: $!\n";
+    if (open(T,"< $to\0")) {
+        local $_;
+	while (<F>) { $diff++,last if $_ ne <T>; }
+	$diff++ unless eof(T);
+	close T;
+    }
+    else { $diff++; }
+    close F;
+    if ($diff) {
+	if (-e $to) {
+	    unlink($to) or confess "unlink $to: $!";
+	}
+        STRICT_SWITCH: {
+	    best($from,$to), last STRICT_SWITCH if $how eq 'best';
+	    cp($from,$to), last STRICT_SWITCH if $how eq 'cp';
+	    ln($from,$to), last STRICT_SWITCH if $how eq 'ln';
+	    croak("ExtUtils::Manifest::cp_if_diff " .
+		  "called with illegal how argument [$how]. " .
+		  "Legal values are 'best', 'cp', and 'ln'.");
+	}
+    }
+}
+
+sub cp {
+    my ($srcFile, $dstFile) = @_;
+    my ($access,$mod) = (stat $srcFile)[8,9];
+
+    copy($srcFile,$dstFile);
+    utime $access, $mod + ($Is_VMS ? 1 : 0), $dstFile;
+    _manicopy_chmod($dstFile);
+}
+
+
+sub ln {
+    my ($srcFile, $dstFile) = @_;
+    return &cp if $Is_VMS or ($^O eq 'MSWin32' and Win32::IsWin95());
+    link($srcFile, $dstFile);
+
+    unless( _manicopy_chmod($dstFile) ) {
+        unlink $dstFile;
+        return;
+    }
+    1;
+}
+
+# 1) Strip off all group and world permissions.
+# 2) Let everyone read it.
+# 3) If the owner can execute it, everyone can.
+sub _manicopy_chmod {
+    my($file) = shift;
+
+    my $perm = 0444 | (stat $file)[2] & 0700;
+    chmod( $perm | ( $perm & 0100 ? 0111 : 0 ), $file );
+}
+
+# Files that are often modified in the distdir.  Don't hard link them.
+my @Exceptions = qw(MANIFEST META.yml SIGNATURE);
+sub best {
+    my ($srcFile, $dstFile) = @_;
+
+    my $is_exception = grep $srcFile =~ /$_/, @Exceptions;
+    if ($is_exception or !$Config{d_link} or -l $srcFile) {
+	cp($srcFile, $dstFile);
+    } else {
+	ln($srcFile, $dstFile) or cp($srcFile, $dstFile);
+    }
+}
+
+sub _macify {
+    my($file) = @_;
+
+    return $file unless $Is_MacOS;
+
+    $file =~ s|^\./||;
+    if ($file =~ m|/|) {
+	$file =~ s|/+|:|g;
+	$file = ":$file";
+    }
+
+    $file;
+}
+
+sub _maccat {
+    my($f1, $f2) = @_;
+
+    return "$f1/$f2" unless $Is_MacOS;
+
+    $f1 .= ":$f2";
+    $f1 =~ s/([^:]:):/$1/g;
+    return $f1;
+}
+
+sub _unmacify {
+    my($file) = @_;
+
+    return $file unless $Is_MacOS;
+
+    $file =~ s|^:||;
+    $file =~ s|([/ \n])|sprintf("\\%03o", unpack("c", $1))|ge;
+    $file =~ y|:|/|;
+
+    $file;
+}
+
+
+=item maniadd
+
+  maniadd({ $file => $comment, ...});
+
+Adds an entry to an existing F<MANIFEST> unless its already there.
+
+$file will be normalized (ie. Unixified).  B<UNIMPLEMENTED>
+
+=cut
+
+sub maniadd {
+    my($additions) = shift;
+
+    _normalize($additions);
+    _fix_manifest($MANIFEST);
+
+    my $manifest = maniread();
+    my @needed = grep { !exists $manifest->{$_} } keys %$additions;
+    return 1 unless @needed;
+
+    open(MANIFEST, ">>$MANIFEST") or 
+      die "maniadd() could not open $MANIFEST: $!";
+
+    foreach my $file (_sort @needed) {
+        my $comment = $additions->{$file} || '';
+        printf MANIFEST "%-40s %s\n", $file, $comment;
+    }
+    close MANIFEST or die "Error closing $MANIFEST: $!";
+
+    return 1;
+}
+
+
+# Sometimes MANIFESTs are missing a trailing newline.  Fix this.
+sub _fix_manifest {
+    my $manifest_file = shift;
+
+    open MANIFEST, $MANIFEST or die "Could not open $MANIFEST: $!";
+
+    # Yes, we should be using seek(), but I'd like to avoid loading POSIX
+    # to get SEEK_*
+    my @manifest = <MANIFEST>;
+    close MANIFEST;
+
+    unless( $manifest[-1] =~ /\n\z/ ) {
+        open MANIFEST, ">>$MANIFEST" or die "Could not open $MANIFEST: $!";
+        print MANIFEST "\n";
+        close MANIFEST;
+    }
+}
+
+
+# UNIMPLEMENTED
+sub _normalize {
+    return;
+}
+
+
+=back
+
+=head2 MANIFEST
+
+A list of files in the distribution, one file per line.  The MANIFEST
+always uses Unix filepath conventions even if you're not on Unix.  This
+means F<foo/bar> style not F<foo\bar>.
+
+Anything between white space and an end of line within a C<MANIFEST>
+file is considered to be a comment.  Any line beginning with # is also
+a comment.
+
+    # this a comment
+    some/file
+    some/other/file            comment about some/file
+
+
+=head2 MANIFEST.SKIP
+
+The file MANIFEST.SKIP may contain regular expressions of files that
+should be ignored by mkmanifest() and filecheck(). The regular
+expressions should appear one on each line. Blank lines and lines
+which start with C<#> are skipped.  Use C<\#> if you need a regular
+expression to start with a C<#>.
+
+For example:
+
+    # Version control files and dirs.
+    \bRCS\b
+    \bCVS\b
+    ,v$
+    \B\.svn\b
+
+    # Makemaker generated files and dirs.
+    ^MANIFEST\.
+    ^Makefile$
+    ^blib/
+    ^MakeMaker-\d
+
+    # Temp, old and emacs backup files.
+    ~$
+    \.old$
+    ^#.*#$
+    ^\.#
+
+If no MANIFEST.SKIP file is found, a default set of skips will be
+used, similar to the example above.  If you want nothing skipped,
+simply make an empty MANIFEST.SKIP file.
+
+
+=head2 EXPORT_OK
+
+C<&mkmanifest>, C<&manicheck>, C<&filecheck>, C<&fullcheck>,
+C<&maniread>, and C<&manicopy> are exportable.
+
+=head2 GLOBAL VARIABLES
+
+C<$ExtUtils::Manifest::MANIFEST> defaults to C<MANIFEST>. Changing it
+results in both a different C<MANIFEST> and a different
+C<MANIFEST.SKIP> file. This is useful if you want to maintain
+different distributions for different audiences (say a user version
+and a developer version including RCS).
+
+C<$ExtUtils::Manifest::Quiet> defaults to 0. If set to a true value,
+all functions act silently.
+
+C<$ExtUtils::Manifest::Debug> defaults to 0.  If set to a true value,
+or if PERL_MM_MANIFEST_DEBUG is true, debugging output will be
+produced.
+
+=head1 DIAGNOSTICS
+
+All diagnostic output is sent to C<STDERR>.
+
+=over 4
+
+=item C<Not in MANIFEST:> I<file>
+
+is reported if a file is found which is not in C<MANIFEST>.
+
+=item C<Skipping> I<file>
+
+is reported if a file is skipped due to an entry in C<MANIFEST.SKIP>.
+
+=item C<No such file:> I<file>
+
+is reported if a file mentioned in a C<MANIFEST> file does not
+exist.
+
+=item C<MANIFEST:> I<$!>
+
+is reported if C<MANIFEST> could not be opened.
+
+=item C<Added to MANIFEST:> I<file>
+
+is reported by mkmanifest() if $Verbose is set and a file is added
+to MANIFEST. $Verbose is set to 1 by default.
+
+=back
+
+=head1 ENVIRONMENT
+
+=over 4
+
+=item B<PERL_MM_MANIFEST_DEBUG>
+
+Turns on debugging
+
+=back
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker> which has handy targets for most of the functionality.
+
+=head1 AUTHOR
+
+Andreas Koenig C<andreas.koenig@anima.de>
+
+Currently maintained by Michael G Schwern C<schwern@pobox.com>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Miniperl.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Miniperl.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Miniperl.pm	(revision 14489)
@@ -0,0 +1,235 @@
+# This File keeps the contents of miniperlmain.c.
+#
+# It was generated automatically by minimod.PL from the contents
+# of miniperlmain.c. Don't edit this file!
+#
+#       ANY CHANGES MADE HERE WILL BE LOST! 
+#
+
+
+package ExtUtils::Miniperl;
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(&writemain);
+
+$head= <<'EOF!HEAD';
+/*    miniperlmain.c
+ *
+ *    Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003,
+ *    2004, 2005 by Larry Wall and others
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * "The Road goes ever on and on, down from the door where it began."
+ */
+
+/* This file contains the main() function for the perl interpreter.
+ * Note that miniperlmain.c contains main() for the 'miniperl' binary,
+ * while perlmain.c contains main() for the 'perl' binary.
+ *
+ * Miniperl is like perl except that it does not support dynamic loading,
+ * and in fact is used to build the dynamic modules needed for the 'real'
+ * perl executable.
+ */
+
+#ifdef OEMVS
+#ifdef MYMALLOC
+/* sbrk is limited to first heap segment so make it big */
+#pragma runopts(HEAP(8M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON))
+#else
+#pragma runopts(HEAP(2M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON))
+#endif
+#endif
+
+
+#include "EXTERN.h"
+#define PERL_IN_MINIPERLMAIN_C
+#include "perl.h"
+
+static void xs_init (pTHX);
+static PerlInterpreter *my_perl;
+
+#if defined (__MINT__) || defined (atarist)
+/* The Atari operating system doesn't have a dynamic stack.  The
+   stack size is determined from this value.  */
+long _stksize = 64 * 1024;
+#endif
+
+int
+main(int argc, char **argv, char **env)
+{
+    int exitstatus;
+    (void)env;
+#ifndef PERL_USE_SAFE_PUTENV
+    PL_use_safe_putenv = 0;
+#endif /* PERL_USE_SAFE_PUTENV */
+
+#ifdef PERL_GLOBAL_STRUCT
+#define PERLVAR(var,type) /**/
+#define PERLVARA(var,type) /**/
+#define PERLVARI(var,type,init) PL_Vars.var = init;
+#define PERLVARIC(var,type,init) PL_Vars.var = init;
+#include "perlvars.h"
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#endif
+
+    /* if user wants control of gprof profiling off by default */
+    /* noop unless Configure is given -Accflags=-DPERL_GPROF_CONTROL */
+    PERL_GPROF_MONCONTROL(0);
+
+    PERL_SYS_INIT3(&argc,&argv,&env);
+
+#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
+    /* XXX Ideally, this should really be happening in perl_alloc() or
+     * perl_construct() to keep libperl.a transparently fork()-safe.
+     * It is currently done here only because Apache/mod_perl have
+     * problems due to lack of a call to cancel pthread_atfork()
+     * handlers when shared objects that contain the handlers may
+     * be dlclose()d.  This forces applications that embed perl to
+     * call PTHREAD_ATFORK() explicitly, but if and only if it hasn't
+     * been called at least once before in the current process.
+     * --GSAR 2001-07-20 */
+    PTHREAD_ATFORK(Perl_atfork_lock,
+                   Perl_atfork_unlock,
+                   Perl_atfork_unlock);
+#endif
+
+    if (!PL_do_undump) {
+	my_perl = perl_alloc();
+	if (!my_perl)
+	    exit(1);
+	perl_construct(my_perl);
+	PL_perl_destruct_level = 0;
+    }
+    PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+    exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
+    if (!exitstatus)
+        perl_run(my_perl);
+      
+    exitstatus = perl_destruct(my_perl);
+
+    perl_free(my_perl);
+
+    PERL_SYS_TERM();
+
+    exit(exitstatus);
+    return exitstatus;
+}
+
+/* Register any extra external extensions */
+
+EOF!HEAD
+$tail=<<'EOF!TAIL';
+
+static void
+xs_init(pTHX)
+{
+}
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
+EOF!TAIL
+
+sub writemain{
+    my(@exts) = @_;
+
+    my($pname);
+    my($dl) = canon('/','DynaLoader');
+    print $head;
+
+    foreach $_ (@exts){
+	my($pname) = canon('/', $_);
+	my($mname, $cname);
+	($mname = $pname) =~ s!/!::!g;
+	($cname = $pname) =~ s!/!__!g;
+        print "EXTERN_C void boot_${cname} (pTHX_ CV* cv);\n";
+    }
+
+    my ($tail1,$tail2) = ( $tail =~ /\A(.*\n)(\s*\}.*)\Z/s );
+    print $tail1;
+
+    print "\tconst char file[] = __FILE__;\n";
+    print "\tdXSUB_SYS;\n" if $] > 5.002;
+
+    foreach $_ (@exts){
+	my($pname) = canon('/', $_);
+	my($mname, $cname, $ccode);
+	($mname = $pname) =~ s!/!::!g;
+	($cname = $pname) =~ s!/!__!g;
+	print "\t{\n";
+	if ($pname eq $dl){
+	    # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
+	    # boot_DynaLoader is called directly in DynaLoader.pm
+	    $ccode = "\t/* DynaLoader is a special case */\n
+\tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
+	    print $ccode unless $SEEN{$ccode}++;
+	} else {
+	    $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n";
+	    print $ccode unless $SEEN{$ccode}++;
+	}
+	print "\t}\n";
+    }
+    print $tail2;
+}
+
+sub canon{
+    my($as, @ext) = @_;
+	foreach(@ext){
+	    # might be X::Y or lib/auto/X/Y/Y.a
+		next if s!::!/!g;
+	    s:^(lib|ext)/(auto/)?::;
+	    s:/\w+\.\w+$::;
+	}
+	grep(s:/:$as:, @ext) if ($as ne '/');
+	@ext;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+ExtUtils::Miniperl, writemain - write the C code for perlmain.c
+
+=head1 SYNOPSIS
+
+C<use ExtUtils::Miniperl;>
+
+C<writemain(@directories);>
+
+=head1 DESCRIPTION
+
+This whole module is written when perl itself is built from a script
+called minimod.PL. In case you want to patch it, please patch
+minimod.PL in the perl distribution instead.
+
+writemain() takes an argument list of directories containing archive
+libraries that relate to perl modules and should be linked into a new
+perl binary. It writes to STDOUT a corresponding perlmain.c file that
+is a plain C file containing all the bootstrap code to make the
+modules associated with the libraries available from within perl.
+
+The typical usage is from within a Makefile generated by
+ExtUtils::MakeMaker. So under normal circumstances you won't have to
+deal with this module directly.
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Mkbootstrap.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Mkbootstrap.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Mkbootstrap.pm	(revision 14489)
@@ -0,0 +1,102 @@
+package ExtUtils::Mkbootstrap;
+
+$VERSION = 1.15;
+
+use Config;
+use Exporter;
+@ISA=('Exporter');
+@EXPORT='&Mkbootstrap';
+
+sub Mkbootstrap {
+    my($baseext, @bsloadlibs)=@_;
+    @bsloadlibs = grep($_, @bsloadlibs); # strip empty libs
+
+    print STDOUT "	bsloadlibs=@bsloadlibs\n" if $Verbose;
+
+    # We need DynaLoader here because we and/or the *_BS file may
+    # call dl_findfile(). We don't say `use' here because when
+    # first building perl extensions the DynaLoader will not have
+    # been built when MakeMaker gets first used.
+    require DynaLoader;
+
+    rename "$baseext.bs", "$baseext.bso"
+      if -s "$baseext.bs";
+
+    if (-f "${baseext}_BS"){
+	$_ = "${baseext}_BS";
+	package DynaLoader; # execute code as if in DynaLoader
+	local($osname, $dlsrc) = (); # avoid warnings
+	($osname, $dlsrc) = @Config::Config{qw(osname dlsrc)};
+	$bscode = "";
+	unshift @INC, ".";
+	require $_;
+	shift @INC;
+    }
+
+    if ($Config{'dlsrc'} =~ /^dl_dld/){
+	package DynaLoader;
+	push(@dl_resolve_using, dl_findfile('-lc'));
+    }
+
+    my(@all) = (@bsloadlibs, @DynaLoader::dl_resolve_using);
+    my($method) = '';
+    if (@all){
+	open BS, ">$baseext.bs"
+		or die "Unable to open $baseext.bs: $!";
+	print STDOUT "Writing $baseext.bs\n";
+	print STDOUT "	containing: @all" if $Verbose;
+	print BS "# $baseext DynaLoader bootstrap file for $^O architecture.\n";
+	print BS "# Do not edit this file, changes will be lost.\n";
+	print BS "# This file was automatically generated by the\n";
+	print BS "# Mkbootstrap routine in ExtUtils::Mkbootstrap (v$VERSION).\n";
+	print BS "\@DynaLoader::dl_resolve_using = ";
+	# If @all contains names in the form -lxxx or -Lxxx then it's asking for
+	# runtime library location so we automatically add a call to dl_findfile()
+	if (" @all" =~ m/ -[lLR]/){
+	    print BS "  dl_findfile(qw(\n  @all\n  ));\n";
+	}else{
+	    print BS "  qw(@all);\n";
+	}
+	# write extra code if *_BS says so
+	print BS $DynaLoader::bscode if $DynaLoader::bscode;
+	print BS "\n1;\n";
+	close BS;
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader
+
+=head1 SYNOPSIS
+
+C<Mkbootstrap>
+
+=head1 DESCRIPTION
+
+Mkbootstrap typically gets called from an extension Makefile.
+
+There is no C<*.bs> file supplied with the extension. Instead, there may
+be a C<*_BS> file which has code for the special cases, like posix for
+berkeley db on the NeXT.
+
+This file will get parsed, and produce a maybe empty
+C<@DynaLoader::dl_resolve_using> array for the current architecture.
+That will be extended by $BSLOADLIBS, which was computed by
+ExtUtils::Liblist::ext(). If this array still is empty, we do nothing,
+else we write a .bs file with an C<@DynaLoader::dl_resolve_using>
+array.
+
+The C<*_BS> file can put some code into the generated C<*.bs> file by
+placing it in C<$bscode>. This is a handy 'escape' mechanism that may
+prove useful in complex situations.
+
+If @DynaLoader::dl_resolve_using contains C<-L*> or C<-l*> entries then
+Mkbootstrap will automatically add a dl_findfile() call to the
+generated C<*.bs> file.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Mksymlists.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Mksymlists.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Mksymlists.pm	(revision 14489)
@@ -0,0 +1,309 @@
+package ExtUtils::Mksymlists;
+
+use 5.00503;
+use strict qw[ subs refs ];
+# no strict 'vars';  # until filehandles are exempted
+
+use Carp;
+use Exporter;
+use Config;
+
+use vars qw(@ISA @EXPORT $VERSION);
+@ISA = 'Exporter';
+@EXPORT = '&Mksymlists';
+$VERSION = 1.19;
+
+sub Mksymlists {
+    my(%spec) = @_;
+    my($osname) = $^O;
+
+    croak("Insufficient information specified to Mksymlists")
+        unless ( $spec{NAME} or
+                 ($spec{FILE} and ($spec{DL_FUNCS} or $spec{FUNCLIST})) );
+
+    $spec{DL_VARS} = [] unless $spec{DL_VARS};
+    ($spec{FILE} = $spec{NAME}) =~ s/.*::// unless $spec{FILE};
+    $spec{FUNCLIST} = [] unless $spec{FUNCLIST};
+    $spec{DL_FUNCS} = { $spec{NAME} => [] }
+        unless ( ($spec{DL_FUNCS} and keys %{$spec{DL_FUNCS}}) or
+                 @{$spec{FUNCLIST}});
+    if (defined $spec{DL_FUNCS}) {
+        my($package);
+        foreach $package (keys %{$spec{DL_FUNCS}}) {
+            my($packprefix,$sym,$bootseen);
+            ($packprefix = $package) =~ s/\W/_/g;
+            foreach $sym (@{$spec{DL_FUNCS}->{$package}}) {
+                if ($sym =~ /^boot_/) {
+                    push(@{$spec{FUNCLIST}},$sym);
+                    $bootseen++;
+                }
+                else { push(@{$spec{FUNCLIST}},"XS_${packprefix}_$sym"); }
+            }
+            push(@{$spec{FUNCLIST}},"boot_$packprefix") unless $bootseen;
+        }
+    }
+
+#    We'll need this if we ever add any OS which uses mod2fname
+#    not as pseudo-builtin.
+#    require DynaLoader;
+    if (defined &DynaLoader::mod2fname and not $spec{DLBASE}) {
+        $spec{DLBASE} = DynaLoader::mod2fname([ split(/::/,$spec{NAME}) ]);
+    }
+
+    if    ($osname eq 'aix') { _write_aix(\%spec); }
+    elsif ($osname eq 'MacOS'){ _write_aix(\%spec) }
+    elsif ($osname eq 'VMS') { _write_vms(\%spec) }
+    elsif ($osname eq 'os2') { _write_os2(\%spec) }
+    elsif ($osname eq 'MSWin32') { _write_win32(\%spec) }
+    else { croak("Don't know how to create linker option file for $osname\n"); }
+}
+
+
+sub _write_aix {
+    my($data) = @_;
+
+    rename "$data->{FILE}.exp", "$data->{FILE}.exp_old";
+
+    open(EXP,">$data->{FILE}.exp")
+        or croak("Can't create $data->{FILE}.exp: $!\n");
+    print EXP join("\n",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}};
+    print EXP join("\n",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}};
+    close EXP;
+}
+
+
+sub _write_os2 {
+    my($data) = @_;
+    require Config;
+    my $threaded = ($Config::Config{archname} =~ /-thread/ ? " threaded" : "");
+
+    if (not $data->{DLBASE}) {
+        ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
+        $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
+    }
+    my $distname = $data->{DISTNAME} || $data->{NAME};
+    $distname = "Distribution $distname";
+    my $patchlevel = " pl$Config{perl_patchlevel}" || '';
+    my $comment = sprintf "Perl (v%s%s%s) module %s", 
+      $Config::Config{version}, $threaded, $patchlevel, $data->{NAME};
+    chomp $comment;
+    if ($data->{INSTALLDIRS} and $data->{INSTALLDIRS} eq 'perl') {
+	$distname = 'perl5-porters@perl.org';
+	$comment = "Core $comment";
+    }
+    $comment = "$comment (Perl-config: $Config{config_args})";
+    $comment = substr($comment, 0, 200) . "...)" if length $comment > 203;
+    rename "$data->{FILE}.def", "$data->{FILE}_def.old";
+
+    open(DEF,">$data->{FILE}.def")
+        or croak("Can't create $data->{FILE}.def: $!\n");
+    print DEF "LIBRARY '$data->{DLBASE}' INITINSTANCE TERMINSTANCE\n";
+    print DEF "DESCRIPTION '\@#$distname:$data->{VERSION}#\@ $comment'\n";
+    print DEF "CODE LOADONCALL\n";
+    print DEF "DATA LOADONCALL NONSHARED MULTIPLE\n";
+    print DEF "EXPORTS\n  ";
+    print DEF join("\n  ",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}};
+    print DEF join("\n  ",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}};
+    if (%{$data->{IMPORTS}}) {
+        print DEF "IMPORTS\n";
+	my ($name, $exp);
+	while (($name, $exp)= each %{$data->{IMPORTS}}) {
+	    print DEF "  $name=$exp\n";
+	}
+    }
+    close DEF;
+}
+
+sub _write_win32 {
+    my($data) = @_;
+
+    require Config;
+    if (not $data->{DLBASE}) {
+        ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
+        $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
+    }
+    rename "$data->{FILE}.def", "$data->{FILE}_def.old";
+
+    open(DEF,">$data->{FILE}.def")
+        or croak("Can't create $data->{FILE}.def: $!\n");
+    # put library name in quotes (it could be a keyword, like 'Alias')
+    if ($Config::Config{'cc'} !~ /^gcc/i) {
+      print DEF "LIBRARY \"$data->{DLBASE}\"\n";
+    }
+    print DEF "EXPORTS\n  ";
+    my @syms;
+    # Export public symbols both with and without underscores to
+    # ensure compatibility between DLLs from different compilers
+    # NOTE: DynaLoader itself only uses the names without underscores,
+    # so this is only to cover the case when the extension DLL may be
+    # linked to directly from C. GSAR 97-07-10
+    if ($Config::Config{'cc'} =~ /^bcc/i) {
+	for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}) {
+	    push @syms, "_$_", "$_ = _$_";
+	}
+    }
+    else {
+	for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}) {
+	    push @syms, "$_", "_$_ = $_";
+	}
+    }
+    print DEF join("\n  ",@syms, "\n") if @syms;
+    if (%{$data->{IMPORTS}}) {
+        print DEF "IMPORTS\n";
+        my ($name, $exp);
+        while (($name, $exp)= each %{$data->{IMPORTS}}) {
+            print DEF "  $name=$exp\n";
+        }
+    }
+    close DEF;
+}
+
+
+sub _write_vms {
+    my($data) = @_;
+
+    require Config; # a reminder for once we do $^O
+    require ExtUtils::XSSymSet;
+
+    my($isvax) = $Config::Config{'archname'} =~ /VAX/i;
+    my($set) = new ExtUtils::XSSymSet;
+    my($sym);
+
+    rename "$data->{FILE}.opt", "$data->{FILE}.opt_old";
+
+    open(OPT,">$data->{FILE}.opt")
+        or croak("Can't create $data->{FILE}.opt: $!\n");
+
+    # Options file declaring universal symbols
+    # Used when linking shareable image for dynamic extension,
+    # or when linking PerlShr into which we've added this package
+    # as a static extension
+    # We don't do anything to preserve order, so we won't relax
+    # the GSMATCH criteria for a dynamic extension
+
+    print OPT "case_sensitive=yes\n"
+        if $Config::Config{d_vms_case_sensitive_symbols};
+    foreach $sym (@{$data->{FUNCLIST}}) {
+        my $safe = $set->addsym($sym);
+        if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
+        else        { print OPT "SYMBOL_VECTOR=($safe=PROCEDURE)\n"; }
+    }
+    foreach $sym (@{$data->{DL_VARS}}) {
+        my $safe = $set->addsym($sym);
+        print OPT "PSECT_ATTR=${sym},PIC,OVR,RD,NOEXE,WRT,NOSHR\n";
+        if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
+        else        { print OPT "SYMBOL_VECTOR=($safe=DATA)\n"; }
+    }
+    close OPT;
+
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Mksymlists - write linker options files for dynamic extension
+
+=head1 SYNOPSIS
+
+    use ExtUtils::Mksymlists;
+    Mksymlists({ NAME     => $name ,
+                 DL_VARS  => [ $var1, $var2, $var3 ],
+                 DL_FUNCS => { $pkg1 => [ $func1, $func2 ],
+                               $pkg2 => [ $func3 ] });
+
+=head1 DESCRIPTION
+
+C<ExtUtils::Mksymlists> produces files used by the linker under some OSs
+during the creation of shared libraries for dynamic extensions.  It is
+normally called from a MakeMaker-generated Makefile when the extension
+is built.  The linker option file is generated by calling the function
+C<Mksymlists>, which is exported by default from C<ExtUtils::Mksymlists>.
+It takes one argument, a list of key-value pairs, in which the following
+keys are recognized:
+
+=over 4
+
+=item DLBASE
+
+This item specifies the name by which the linker knows the
+extension, which may be different from the name of the
+extension itself (for instance, some linkers add an '_' to the
+name of the extension).  If it is not specified, it is derived
+from the NAME attribute.  It is presently used only by OS2 and Win32.
+
+=item DL_FUNCS
+
+This is identical to the DL_FUNCS attribute available via MakeMaker,
+from which it is usually taken.  Its value is a reference to an
+associative array, in which each key is the name of a package, and
+each value is an a reference to an array of function names which
+should be exported by the extension.  For instance, one might say
+C<DL_FUNCS =E<gt> { Homer::Iliad =E<gt> [ qw(trojans greeks) ],
+Homer::Odyssey =E<gt> [ qw(travellers family suitors) ] }>.  The
+function names should be identical to those in the XSUB code;
+C<Mksymlists> will alter the names written to the linker option
+file to match the changes made by F<xsubpp>.  In addition, if
+none of the functions in a list begin with the string B<boot_>,
+C<Mksymlists> will add a bootstrap function for that package,
+just as xsubpp does.  (If a B<boot_E<lt>pkgE<gt>> function is
+present in the list, it is passed through unchanged.)  If
+DL_FUNCS is not specified, it defaults to the bootstrap
+function for the extension specified in NAME.
+
+=item DL_VARS
+
+This is identical to the DL_VARS attribute available via MakeMaker,
+and, like DL_FUNCS, it is usually specified via MakeMaker.  Its
+value is a reference to an array of variable names which should
+be exported by the extension.
+
+=item FILE
+
+This key can be used to specify the name of the linker option file
+(minus the OS-specific extension), if for some reason you do not
+want to use the default value, which is the last word of the NAME
+attribute (I<e.g.> for C<Tk::Canvas>, FILE defaults to C<Canvas>).
+
+=item FUNCLIST
+
+This provides an alternate means to specify function names to be
+exported from the extension.  Its value is a reference to an
+array of function names to be exported by the extension.  These
+names are passed through unaltered to the linker options file.
+Specifying a value for the FUNCLIST attribute suppresses automatic
+generation of the bootstrap function for the package. To still create
+the bootstrap name you have to specify the package name in the
+DL_FUNCS hash:
+
+    Mksymlists({ NAME     => $name ,
+		 FUNCLIST => [ $func1, $func2 ],
+                 DL_FUNCS => { $pkg => [] } });
+
+
+=item IMPORTS
+
+This attribute is used to specify names to be imported into the
+extension. It is currently only used by OS/2 and Win32.
+
+=item NAME
+
+This gives the name of the extension (I<e.g.> C<Tk::Canvas>) for which
+the linker option file will be produced.
+
+=back
+
+When calling C<Mksymlists>, one should always specify the NAME
+attribute.  In most cases, this is all that's necessary.  In
+the case of unusual extensions, however, the other attributes
+can be used to provide additional information to the linker.
+
+=head1 AUTHOR
+
+Charles Bailey I<E<lt>bailey@newman.upenn.eduE<gt>>
+
+=head1 REVISION
+
+Last revised 14-Feb-1996, for Perl 5.002.
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/NOTES
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/NOTES	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/NOTES	(revision 14489)
@@ -0,0 +1,96 @@
+The Simplified MakeMaker class hierarchy
+****************************************
+
+What most people need to know.
+
+(Subclasses on top.)
+
+               MY
+                |
+        ExtUtils::MakeMaker
+                |
+        ExtUtils::MM_{Current OS}
+                |
+        ExtUtils::MM_Unix
+                |
+        ExtUtils::MM_Any
+
+The object actually used is of the class MY which allows you to
+override bits of MakeMaker inside your Makefile.PL by declaring
+MY::foo() methods.
+
+
+The Real MakeMaker class hierarchy
+**********************************
+
+You wish it was that simple.
+
+Here's how it really works.
+
+               PACK### (created each call to ExtUtils::MakeMaker->new)
+                    .                       |
+                 (mixin)                    |
+                    .                       |
+        MY (created by ExtUtils::MY)        |
+        |                                   |
+        ExtUtils::MY         MM (created by ExtUtils::MM)
+                   |          |
+                   ExtUtils::MM
+                    |     |   |-----------------------
+                    |     |                          |   
+    ExtUtils::Liblist     ExtUtils::MakeMaker        |
+          |                                          |
+    ExtUtils::Liblist::Kid                           |
+                                                     |
+                                                     |
+                                                     |
+                                    ExtUtils::MM_{Current OS} (if necessary)
+                                            |
+                                    ExtUtils::MM_Unix
+                                            |
+                                    ExtUtils::MM_Any
+
+
+NOTE: Yes, this is a mess.  See
+http://archive.develooper.com/makemaker@perl.org/msg00134.html
+for some history.
+
+NOTE: When ExtUtils::MM is loaded it chooses a superclass for MM from
+amongst the ExtUtils::MM_* modules based on the current operating
+system.
+
+NOTE: ExtUtils::MM_{Current OS} represents one of the ExtUtils::MM_*
+modules except ExtUtils::MM_Any chosen based on your operating system.
+
+NOTE: The main object used by MakeMaker is a PACK### object, *not*
+ExtUtils::MakeMaker.  It is, effectively, a subclass of MY,
+ExtUtils::Makemaker, ExtUtils::Liblist and ExtUtils::MM_{Current OS}
+
+NOTE: The methods in MY are simply copied into PACK### rather than
+MY being a superclass of PACK###.  I don't remember the rationale.
+
+NOTE: ExtUtils::Liblist should be removed from the inheritence hiearchy
+and simply be called as functions.
+
+NOTE: Modules like File::Spec and Exporter have been omitted for clarity.
+
+
+The MM_* hierarchy
+******************
+
+                               MM_Win95   MM_NW5
+                                    \      /
+MM_BeOS  MM_Cygwin  MM_OS2  MM_VMS  MM_Win32  MM_DOS  MM_UWIN
+      \        |      |         |        /      /      /
+       ------------------------------------------------
+                           |       |
+                        MM_Unix    |
+                              |    |
+                              MM_Any
+
+NOTE: Each direct MM_Unix subclass is also an MM_Any subclass.  This
+is a temporary hack because MM_Unix overrides some MM_Any methods with
+Unix specific code.  It allows the non-Unix modules to see the
+original MM_Any implementations.
+
+NOTE: Modules like File::Spec and Exporter have been omitted for clarity.
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/PATCHING
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/PATCHING	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/PATCHING	(revision 14489)
@@ -0,0 +1,199 @@
+This is a short set of guidelines for those patching
+ExtUtils::MakeMaker.  Its not an iron-clad set of rules, but just
+things which make life easier when reading and integrating a patch.
+
+Lots of information can be found in makemaker.org.
+
+MakerMaker is being maintained until something else can replace it.
+Bugs will be fixed and compatibility improved, but I would like to
+avoid new features.  If you want to add something to MakeMaker,
+consider instead working on Module::Build, MakeMaker's heir apparent.
+
+
+Reporting bugs
+
+- Often the only information we have for fixing a bug is contained in your
+  report.  So...
+
+- Please report your bugs via http://rt.cpan.org or by mailing to
+  makemaker@perl.org.  RT is preferred.
+
+- Please report your bug immediately upon encountering it.  Do not wait
+  until you have a patch to fix the bug.  Patches are good, but not at
+  the expense of timely bug reports.
+
+- Please be as verbose as possible.  Include the complete output of
+  your 'make test' or even 'make test TEST_VERBOSE=1' and a copy of the 
+  generated Makefile.  Err on the side of verbosity.  The more data we
+  have to work with, the faster we can diagnose the problem.
+
+- If you find an undocumented feature, or if a feature has changed/been
+  added which causes a problem, report it.  Do not assume it was done
+  deliberately.  Even if it was done deliberately, we still want to hear
+  if it caused problems.
+
+- If you're testing MakeMaker against a development version of Perl,
+  please also check it against the latest stable version.  This makes it
+  easier to figure out if its MakeMaker or Perl at fault.
+
+
+Patching details
+
+- Please use unified diffs.  (diff -u)
+
+- Patches against the latest development snapshot from makemaker.org are 
+  preferred.  Patches against the latest CPAN version are ok, too.
+
+- Post your patch to makemaker@perl.org.
+
+
+Code formatting
+
+- No literal tabs (except where necessary inside Makefile code, obviously).
+
+- 4 character indentation.
+
+- this_style is prefered instead of studlyCaps.
+
+- Private subroutine names (ie. those used only in the same package
+  they're declared in) should start with an underscore (_sekret_method).
+
+- Protected subroutines (ie. ones intended to be used by other modules in
+  ExtUtils::*) should be named normally (no leading underscore) but
+  documented as protected (see Documentation below).
+
+- Do not use indirect object syntax (ie. new Foo::Bar (@args))
+
+- make variables use dollar signs like Perl scalars.  This causes problems
+  when you have to mix them both in a string.  If you find yourself
+  backwacking lots of dollar signs because you have one interpolated
+  perl variable, like this:
+
+    return <<EOT;
+subdirs ::
+	\$(NOECHO)cd $subdir && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
+
+EOT
+
+  or are switching quoting contexts:
+
+    return q{
+subdirs ::
+	$(NOECHO)cd }.$subdir.q{ && $(MAKE) -f $(FIRST_MAKEFILE) all $(PASTHRU)
+
+};
+
+  consider using sprintf instead.
+
+    return sprintf <<'EOT', $subdir;
+subdirs ::
+	$(NOECHO)cd %s && $(MAKE) -f $(FIRST_MAKEFILE) all $(PASTHRU)
+
+EOT
+
+
+Refactoring and Cleanup
+
+- MakeMaker is a mess.  We like patches which clean things up.
+
+
+Backwards Compatibility
+
+- MakeMaker must be backwards compatible to 5.5.4 (5.005_04).  Avoid any
+  obvious 5.6-isms (threads, warnings.pm, Unicode, our, v1.2.3, attributes
+  open my $fh, lvalue subroutines, any new core modules, etc...).
+
+- MakeMaker should avoid having module dependencies.  Avoid using modules
+  which didn't come with 5.5.4 and avoid using features from newer 
+  versions.  Sometimes this is unavoidable.
+
+
+Cross-Platform Compatibility
+
+- With the exception of MacOS Classic, MakeMaker must work on all 
+  architectures Perl works on (see perlport.pod).  This means all Unixen 
+  (including Cygwin and MacOS X), Windows (including Win9x and DOS), and VMS.
+
+- Use the available macros rather than shell commands $(MV), $(CP),
+  $(TOUCH), etc...
+
+- MakeMaker must work on many makes.  GNU, BSD, Solaris, nmake, dmake, MMS
+  and MMK to name the most common.  Keep your make code as simple as 
+  possible.  
+
+- Avoid special variables (even $@).  
+
+- Format targets as "target : dependency", the spacing is important.  
+
+- Use $(NOECHO) instead of @.
+
+- Always put a space between $(NOECHO) and the command.
+
+- Always put a space between - (ignore) and the command.
+
+- Always put $(NOECHO) and - together, no space between them.
+
+- Often when you patch ExtUtils::MM_Unix, similar patches must be done
+  to the other MM_* modules.  If you can, please do this extra work
+  otherwise I have to.  If you can't, that's ok.  We can help.
+
+- If possible, please test your patch on two Very Different architectures.
+  Unix, Windows and VMS being Very Different.  Note: Cygwin and OS X are 
+  Unixen for our purposes.
+
+- If nothing else, at least try it on two different Unixen or Windows
+  machines (ie. Linux and IRIX or WinNT and Win95).
+
+- HP's TestDrive (www.testdrive.compaq.com) and SourceForge's
+  compile farm (www.sourceforge.net) are good sources of testing
+  machines of many different architectures and platforms.  Accounts are 
+  free.
+
+- If you find yourself writing "do_this if $^O eq 'That'" (ie. checks on
+  the OS type) perhaps your code belongs in one of the non-Unix MM_*
+  modules (ie. MM_Win32, MM_VMS, etc...).  If one does not exist, consider
+  creating one.  Its ok to have an MM_* module with only one method.
+
+- Some shells have very small buffers.  This means command lines must
+  be as small as possible.  If your command is just too long, consider
+  making it an ExtUtils::Command::MM function.  If your command might
+  receive many arguments (such as pod2man or pm_to_blib) consider
+  using split_command() to split it into several, shorter calls.
+
+- Most shells quote differently.  If you need to put a perl one-liner
+  in the Makefile, please use oneliner() to generate it.
+
+
+Tests
+
+- Tests would be nice, but I'm not going to pretend testing MakeMaker
+  is easy.  If nothing else, let us know how you tested your patch by
+  hand.
+
+
+Documentation
+
+- Documentation would be nice.
+
+- If the new feature/method is private, please document it with POD
+  wrapped in "=begin/end private" tags.  That way it will be documented,
+  but won't be displayed (future versions of perldoc may have options
+  to display).
+
+    =begin private
+
+    =head3 _foo_bar
+
+       $mm->_foo_bar
+
+    Blah blah blah
+
+    =end private
+
+    =cut
+
+    sub _foo_bar {
+       ...
+
+- If you're overriding a method, document that its an override and
+  *why* its being overridden.  Don't repeat the original documentation.
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Packlist.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Packlist.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/Packlist.pm	(revision 14489)
@@ -0,0 +1,295 @@
+package ExtUtils::Packlist;
+
+use 5.00503;
+use strict;
+use Carp qw();
+use vars qw($VERSION);
+$VERSION = '0.04';
+
+# Used for generating filehandle globs.  IO::File might not be available!
+my $fhname = "FH1";
+
+sub mkfh()
+{
+no strict;
+my $fh = \*{$fhname++};
+use strict;
+return($fh);
+}
+
+sub new($$)
+{
+my ($class, $packfile) = @_;
+$class = ref($class) || $class;
+my %self;
+tie(%self, $class, $packfile);
+return(bless(\%self, $class));
+}
+
+sub TIEHASH
+{
+my ($class, $packfile) = @_;
+my $self = { packfile => $packfile };
+bless($self, $class);
+$self->read($packfile) if (defined($packfile) && -f $packfile);
+return($self);
+}
+
+sub STORE
+{
+$_[0]->{data}->{$_[1]} = $_[2];
+}
+
+sub FETCH
+{
+return($_[0]->{data}->{$_[1]});
+}
+
+sub FIRSTKEY
+{
+my $reset = scalar(keys(%{$_[0]->{data}}));
+return(each(%{$_[0]->{data}}));
+}
+
+sub NEXTKEY
+{
+return(each(%{$_[0]->{data}}));
+}
+
+sub EXISTS
+{
+return(exists($_[0]->{data}->{$_[1]}));
+}
+
+sub DELETE
+{
+return(delete($_[0]->{data}->{$_[1]}));
+}
+
+sub CLEAR
+{
+%{$_[0]->{data}} = ();
+}
+
+sub DESTROY
+{
+}
+
+sub read($;$)
+{
+my ($self, $packfile) = @_;
+$self = tied(%$self) || $self;
+
+if (defined($packfile)) { $self->{packfile} = $packfile; }
+else { $packfile = $self->{packfile}; }
+Carp::croak("No packlist filename specified") if (! defined($packfile));
+my $fh = mkfh();
+open($fh, "<$packfile") || Carp::croak("Can't open file $packfile: $!");
+$self->{data} = {};
+my ($line);
+while (defined($line = <$fh>))
+   {
+   chomp $line;
+   my ($key, @kvs) = $line;
+   if ($key =~ /^(.*?)( \w+=.*)$/)
+      {
+      $key = $1;
+      @kvs = split(' ', $2);
+      }
+   $key =~ s!/\./!/!g;   # Some .packlists have spurious '/./' bits in the paths
+   if (! @kvs)
+      {
+      $self->{data}->{$key} = undef;
+      }
+   else
+      {
+      my ($data) = {};
+      foreach my $kv (@kvs)
+         {
+         my ($k, $v) = split('=', $kv);
+         $data->{$k} = $v;
+         }
+      $self->{data}->{$key} = $data;
+      }
+   }
+close($fh);
+}
+
+sub write($;$)
+{
+my ($self, $packfile) = @_;
+$self = tied(%$self) || $self;
+if (defined($packfile)) { $self->{packfile} = $packfile; }
+else { $packfile = $self->{packfile}; }
+Carp::croak("No packlist filename specified") if (! defined($packfile));
+my $fh = mkfh();
+open($fh, ">$packfile") || Carp::croak("Can't open file $packfile: $!");
+foreach my $key (sort(keys(%{$self->{data}})))
+   {
+   print $fh ("$key");
+   if (ref($self->{data}->{$key}))
+      {
+      my $data = $self->{data}->{$key};
+      foreach my $k (sort(keys(%$data)))
+         {
+         print $fh (" $k=$data->{$k}");
+         }
+      }
+   print $fh ("\n");
+   }
+close($fh);
+}
+
+sub validate($;$)
+{
+my ($self, $remove) = @_;
+$self = tied(%$self) || $self;
+my @missing;
+foreach my $key (sort(keys(%{$self->{data}})))
+   {
+   if (! -e $key)
+      {
+      push(@missing, $key);
+      delete($self->{data}{$key}) if ($remove);
+      }
+   }
+return(@missing);
+}
+
+sub packlist_file($)
+{
+my ($self) = @_;
+$self = tied(%$self) || $self;
+return($self->{packfile});
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Packlist - manage .packlist files
+
+=head1 SYNOPSIS
+
+   use ExtUtils::Packlist;
+   my ($pl) = ExtUtils::Packlist->new('.packlist');
+   $pl->read('/an/old/.packlist');
+   my @missing_files = $pl->validate();
+   $pl->write('/a/new/.packlist');
+
+   $pl->{'/some/file/name'}++;
+      or
+   $pl->{'/some/other/file/name'} = { type => 'file',
+                                      from => '/some/file' };
+
+=head1 DESCRIPTION
+
+ExtUtils::Packlist provides a standard way to manage .packlist files.
+Functions are provided to read and write .packlist files.  The original
+.packlist format is a simple list of absolute pathnames, one per line.  In
+addition, this package supports an extended format, where as well as a filename
+each line may contain a list of attributes in the form of a space separated
+list of key=value pairs.  This is used by the installperl script to
+differentiate between files and links, for example.
+
+=head1 USAGE
+
+The hash reference returned by the new() function can be used to examine and
+modify the contents of the .packlist.  Items may be added/deleted from the
+.packlist by modifying the hash.  If the value associated with a hash key is a
+scalar, the entry written to the .packlist by any subsequent write() will be a
+simple filename.  If the value is a hash, the entry written will be the
+filename followed by the key=value pairs from the hash.  Reading back the
+.packlist will recreate the original entries.
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item new()
+
+This takes an optional parameter, the name of a .packlist.  If the file exists,
+it will be opened and the contents of the file will be read.  The new() method
+returns a reference to a hash.  This hash holds an entry for each line in the
+.packlist.  In the case of old-style .packlists, the value associated with each
+key is undef.  In the case of new-style .packlists, the value associated with
+each key is a hash containing the key=value pairs following the filename in the
+.packlist.
+
+=item read()
+
+This takes an optional parameter, the name of the .packlist to be read.  If
+no file is specified, the .packlist specified to new() will be read.  If the
+.packlist does not exist, Carp::croak will be called.
+
+=item write()
+
+This takes an optional parameter, the name of the .packlist to be written.  If
+no file is specified, the .packlist specified to new() will be overwritten.
+
+=item validate()
+
+This checks that every file listed in the .packlist actually exists.  If an
+argument which evaluates to true is given, any missing files will be removed
+from the internal hash.  The return value is a list of the missing files, which
+will be empty if they all exist.
+
+=item packlist_file()
+
+This returns the name of the associated .packlist file
+
+=back
+
+=head1 EXAMPLE
+
+Here's C<modrm>, a little utility to cleanly remove an installed module.
+
+    #!/usr/local/bin/perl -w
+
+    use strict;
+    use IO::Dir;
+    use ExtUtils::Packlist;
+    use ExtUtils::Installed;
+
+    sub emptydir($) {
+	my ($dir) = @_;
+	my $dh = IO::Dir->new($dir) || return(0);
+	my @count = $dh->read();
+	$dh->close();
+	return(@count == 2 ? 1 : 0);
+    }
+
+    # Find all the installed packages
+    print("Finding all installed modules...\n");
+    my $installed = ExtUtils::Installed->new();
+
+    foreach my $module (grep(!/^Perl$/, $installed->modules())) {
+       my $version = $installed->version($module) || "???";
+       print("Found module $module Version $version\n");
+       print("Do you want to delete $module? [n] ");
+       my $r = <STDIN>; chomp($r);
+       if ($r && $r =~ /^y/i) {
+	  # Remove all the files
+	  foreach my $file (sort($installed->files($module))) {
+	     print("rm $file\n");
+	     unlink($file);
+	  }
+	  my $pf = $installed->packlist($module)->packlist_file();
+	  print("rm $pf\n");
+	  unlink($pf);
+	  foreach my $dir (sort($installed->directory_tree($module))) {
+	     if (emptydir($dir)) {
+		print("rmdir $dir\n");
+		rmdir($dir);
+	     }
+	  }
+       }
+    }
+
+=head1 AUTHOR
+
+Alan Burlison <Alan.Burlison@uk.sun.com>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/testlib.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/testlib.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/testlib.pm	(revision 14489)
@@ -0,0 +1,37 @@
+package ExtUtils::testlib;
+$VERSION = 1.15;
+
+use Cwd;
+use File::Spec;
+
+# So the tests can chdir around and not break @INC.
+# We use getcwd() because otherwise rel2abs will blow up under taint
+# mode pre-5.8.  We detaint is so @INC won't be tainted.  This is
+# no worse, and probably better, than just shoving an untainted, 
+# relative "blib/lib" onto @INC.
+my $cwd;
+BEGIN {
+    ($cwd) = getcwd() =~ /(.*)/;
+}
+use lib map File::Spec->rel2abs($_, $cwd), qw(blib/arch blib/lib);
+1;
+__END__
+
+=head1 NAME
+
+ExtUtils::testlib - add blib/* directories to @INC
+
+=head1 SYNOPSIS
+
+  use ExtUtils::testlib;
+
+=head1 DESCRIPTION
+
+After an extension has been built and before it is installed it may be
+desirable to test it bypassing C<make test>. By adding
+
+    use ExtUtils::testlib;
+
+to a test program the intermediate directories used by C<make> are
+added to @INC.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/typemap
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/typemap	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/typemap	(revision 14489)
@@ -0,0 +1,314 @@
+# basic C types
+int			T_IV
+unsigned		T_UV
+unsigned int		T_UV
+long			T_IV
+unsigned long		T_UV
+short			T_IV
+unsigned short		T_UV
+char			T_CHAR
+unsigned char		T_U_CHAR
+char *			T_PV
+unsigned char *		T_PV
+const char *		T_PV
+caddr_t			T_PV
+wchar_t *		T_PV
+wchar_t			T_IV
+# bool_t is defined in <rpc/rpc.h>
+bool_t			T_IV
+size_t			T_UV
+ssize_t			T_IV
+time_t			T_NV
+unsigned long *		T_OPAQUEPTR
+char **			T_PACKEDARRAY
+void *			T_PTR
+Time_t *		T_PV
+SV *			T_SV
+SVREF			T_SVREF
+AV *			T_AVREF
+HV *			T_HVREF
+CV *			T_CVREF
+
+IV			T_IV
+UV			T_UV
+NV                      T_NV
+I32			T_IV
+I16			T_IV
+I8			T_IV
+STRLEN			T_UV
+U32			T_U_LONG
+U16			T_U_SHORT
+U8			T_UV
+Result			T_U_CHAR
+Boolean			T_BOOL
+float                   T_FLOAT
+double			T_DOUBLE
+SysRet			T_SYSRET
+SysRetLong		T_SYSRET
+FILE *			T_STDIO
+PerlIO *		T_INOUT
+FileHandle		T_PTROBJ
+InputStream		T_IN
+InOutStream		T_INOUT
+OutputStream		T_OUT
+bool			T_BOOL
+
+#############################################################################
+INPUT
+T_SV
+	$var = $arg
+T_SVREF
+	if (SvROK($arg))
+	    $var = (SV*)SvRV($arg);
+	else
+	    Perl_croak(aTHX_ \"$var is not a reference\")
+T_AVREF
+	if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV)
+	    $var = (AV*)SvRV($arg);
+	else
+	    Perl_croak(aTHX_ \"$var is not an array reference\")
+T_HVREF
+	if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVHV)
+	    $var = (HV*)SvRV($arg);
+	else
+	    Perl_croak(aTHX_ \"$var is not a hash reference\")
+T_CVREF
+	if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVCV)
+	    $var = (CV*)SvRV($arg);
+	else
+	    Perl_croak(aTHX_ \"$var is not a code reference\")
+T_SYSRET
+	$var NOT IMPLEMENTED
+T_UV
+	$var = ($type)SvUV($arg)
+T_IV
+	$var = ($type)SvIV($arg)
+T_INT
+	$var = (int)SvIV($arg)
+T_ENUM
+	$var = ($type)SvIV($arg)
+T_BOOL
+	$var = (bool)SvTRUE($arg)
+T_U_INT
+	$var = (unsigned int)SvUV($arg)
+T_SHORT
+	$var = (short)SvIV($arg)
+T_U_SHORT
+	$var = (unsigned short)SvUV($arg)
+T_LONG
+	$var = (long)SvIV($arg)
+T_U_LONG
+	$var = (unsigned long)SvUV($arg)
+T_CHAR
+	$var = (char)*SvPV_nolen($arg)
+T_U_CHAR
+	$var = (unsigned char)SvUV($arg)
+T_FLOAT
+	$var = (float)SvNV($arg)
+T_NV
+	$var = ($type)SvNV($arg)
+T_DOUBLE
+	$var = (double)SvNV($arg)
+T_PV
+	$var = ($type)SvPV_nolen($arg)
+T_PTR
+	$var = INT2PTR($type,SvIV($arg))
+T_PTRREF
+	if (SvROK($arg)) {
+	    IV tmp = SvIV((SV*)SvRV($arg));
+	    $var = INT2PTR($type,tmp);
+	}
+	else
+	    Perl_croak(aTHX_ \"$var is not a reference\")
+T_REF_IV_REF
+	if (sv_isa($arg, \"${ntype}\")) {
+	    IV tmp = SvIV((SV*)SvRV($arg));
+	    $var = *INT2PTR($type *, tmp);
+	}
+	else
+	    Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
+T_REF_IV_PTR
+	if (sv_isa($arg, \"${ntype}\")) {
+	    IV tmp = SvIV((SV*)SvRV($arg));
+	    $var = INT2PTR($type, tmp);
+	}
+	else
+	    Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
+T_PTROBJ
+	if (sv_derived_from($arg, \"${ntype}\")) {
+	    IV tmp = SvIV((SV*)SvRV($arg));
+	    $var = INT2PTR($type,tmp);
+	}
+	else
+	    Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
+T_PTRDESC
+	if (sv_isa($arg, \"${ntype}\")) {
+	    IV tmp = SvIV((SV*)SvRV($arg));
+	    ${type}_desc = (\U${type}_DESC\E*) tmp;
+	    $var = ${type}_desc->ptr;
+	}
+	else
+	    Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
+T_REFREF
+	if (SvROK($arg)) {
+	    IV tmp = SvIV((SV*)SvRV($arg));
+	    $var = *INT2PTR($type,tmp);
+	}
+	else
+	    Perl_croak(aTHX_ \"$var is not a reference\")
+T_REFOBJ
+	if (sv_isa($arg, \"${ntype}\")) {
+	    IV tmp = SvIV((SV*)SvRV($arg));
+	    $var = *INT2PTR($type,tmp);
+	}
+	else
+	    Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
+T_OPAQUE
+	$var = *($type *)SvPV_nolen($arg)
+T_OPAQUEPTR
+	$var = ($type)SvPV_nolen($arg)
+T_PACKED
+	$var = XS_unpack_$ntype($arg)
+T_PACKEDARRAY
+	$var = XS_unpack_$ntype($arg)
+T_CALLBACK
+	$var = make_perl_cb_$type($arg)
+T_ARRAY
+	U32 ix_$var = $argoff;
+	$var = $ntype(items -= $argoff);
+	while (items--) {
+	    DO_ARRAY_ELEM;
+	    ix_$var++;
+	}
+        /* this is the number of elements in the array */
+        ix_$var -= $argoff
+T_STDIO
+	$var = PerlIO_findFILE(IoIFP(sv_2io($arg)))
+T_IN
+	$var = IoIFP(sv_2io($arg))
+T_INOUT
+	$var = IoIFP(sv_2io($arg))
+T_OUT
+	$var = IoOFP(sv_2io($arg))
+#############################################################################
+OUTPUT
+T_SV
+	$arg = $var;
+T_SVREF
+	$arg = newRV((SV*)$var);
+T_AVREF
+	$arg = newRV((SV*)$var);
+T_HVREF
+	$arg = newRV((SV*)$var);
+T_CVREF
+	$arg = newRV((SV*)$var);
+T_IV
+	sv_setiv($arg, (IV)$var);
+T_UV
+	sv_setuv($arg, (UV)$var);
+T_INT
+	sv_setiv($arg, (IV)$var);
+T_SYSRET
+	if ($var != -1) {
+	    if ($var == 0)
+		sv_setpvn($arg, "0 but true", 10);
+	    else
+		sv_setiv($arg, (IV)$var);
+	}
+T_ENUM
+	sv_setiv($arg, (IV)$var);
+T_BOOL
+	$arg = boolSV($var);
+T_U_INT
+	sv_setuv($arg, (UV)$var);
+T_SHORT
+	sv_setiv($arg, (IV)$var);
+T_U_SHORT
+	sv_setuv($arg, (UV)$var);
+T_LONG
+	sv_setiv($arg, (IV)$var);
+T_U_LONG
+	sv_setuv($arg, (UV)$var);
+T_CHAR
+	sv_setpvn($arg, (char *)&$var, 1);
+T_U_CHAR
+	sv_setuv($arg, (UV)$var);
+T_FLOAT
+	sv_setnv($arg, (double)$var);
+T_NV
+	sv_setnv($arg, (NV)$var);
+T_DOUBLE
+	sv_setnv($arg, (double)$var);
+T_PV
+	sv_setpv((SV*)$arg, $var);
+T_PTR
+	sv_setiv($arg, PTR2IV($var));
+T_PTRREF
+	sv_setref_pv($arg, Nullch, (void*)$var);
+T_REF_IV_REF
+	sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var));
+T_REF_IV_PTR
+	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
+T_PTROBJ
+	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
+T_PTRDESC
+	sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var));
+T_REFREF
+	NOT_IMPLEMENTED
+T_REFOBJ
+	NOT IMPLEMENTED
+T_OPAQUE
+	sv_setpvn($arg, (char *)&$var, sizeof($var));
+T_OPAQUEPTR
+	sv_setpvn($arg, (char *)$var, sizeof(*$var));
+T_PACKED
+	XS_pack_$ntype($arg, $var);
+T_PACKEDARRAY
+	XS_pack_$ntype($arg, $var, count_$ntype);
+T_DATAUNIT	
+	sv_setpvn($arg, $var.chp(), $var.size());
+T_CALLBACK
+	sv_setpvn($arg, $var.context.value().chp(),
+		$var.context.value().size());
+T_ARRAY
+        {
+	    U32 ix_$var;
+	    EXTEND(SP,size_$var);
+	    for (ix_$var = 0; ix_$var < size_$var; ix_$var++) {
+		ST(ix_$var) = sv_newmortal();
+	DO_ARRAY_ELEM
+	    }
+        }
+T_STDIO
+	{
+	    GV *gv = newGVgen("$Package");
+	    PerlIO *fp = PerlIO_importFILE($var,0);
+	    if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) )
+		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+	    else
+		$arg = &PL_sv_undef;
+	}
+T_IN
+	{
+	    GV *gv = newGVgen("$Package");
+	    if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) )
+		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+	    else
+		$arg = &PL_sv_undef;
+	}
+T_INOUT
+	{
+	    GV *gv = newGVgen("$Package");
+	    if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) )
+		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+	    else
+		$arg = &PL_sv_undef;
+	}
+T_OUT
+	{
+	    GV *gv = newGVgen("$Package");
+	    if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) )
+		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+	    else
+		$arg = &PL_sv_undef;
+	}
Index: /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/xsubpp
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/xsubpp	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ExtUtils/xsubpp	(revision 14489)
@@ -0,0 +1,1908 @@
+#!./miniperl
+
+=head1 NAME
+
+xsubpp - compiler to convert Perl XS code into C code
+
+=head1 SYNOPSIS
+
+B<xsubpp> [B<-v>] [B<-C++>] [B<-csuffix csuffix>] [B<-except>] [B<-s pattern>] [B<-prototypes>] [B<-noversioncheck>] [B<-nolinenumbers>] [B<-nooptimize>] [B<-typemap typemap>] ... file.xs
+
+=head1 DESCRIPTION
+
+This compiler is typically run by the makefiles created by L<ExtUtils::MakeMaker>.
+
+I<xsubpp> will compile XS code into C code by embedding the constructs
+necessary to let C functions manipulate Perl values and creates the glue
+necessary to let Perl access those functions.  The compiler uses typemaps to
+determine how to map C function parameters and variables to Perl values.
+
+The compiler will search for typemap files called I<typemap>.  It will use
+the following search path to find default typemaps, with the rightmost
+typemap taking precedence.
+
+	../../../typemap:../../typemap:../typemap:typemap
+
+=head1 OPTIONS
+
+Note that the C<XSOPT> MakeMaker option may be used to add these options to
+any makefiles generated by MakeMaker.
+
+=over 5
+
+=item B<-C++>
+
+Adds ``extern "C"'' to the C code.
+
+=item B<-csuffix csuffix>
+
+Set the suffix used for the generated C or C++ code.  Defaults to '.c'
+(even with B<-C++>), but some platforms might want to have e.g. '.cpp'.
+Don't forget the '.' from the front.
+
+=item B<-hiertype>
+
+Retains '::' in type names so that C++ hierachical types can be mapped.
+
+=item B<-except>
+
+Adds exception handling stubs to the C code.
+
+=item B<-typemap typemap>
+
+Indicates that a user-supplied typemap should take precedence over the
+default typemaps.  This option may be used multiple times, with the last
+typemap having the highest precedence.
+
+=item B<-v>
+
+Prints the I<xsubpp> version number to standard output, then exits.
+
+=item B<-prototypes>
+
+By default I<xsubpp> will not automatically generate prototype code for
+all xsubs. This flag will enable prototypes.
+
+=item B<-noversioncheck>
+
+Disables the run time test that determines if the object file (derived
+from the C<.xs> file) and the C<.pm> files have the same version
+number.
+
+=item B<-nolinenumbers>
+
+Prevents the inclusion of `#line' directives in the output.
+
+=item B<-nooptimize>
+
+Disables certain optimizations.  The only optimization that is currently
+affected is the use of I<target>s by the output C code (see L<perlguts>).
+This may significantly slow down the generated code, but this is the way
+B<xsubpp> of 5.005 and earlier operated.
+
+=item B<-noinout>
+
+Disable recognition of C<IN>, C<OUT_LIST> and C<INOUT_LIST> declarations.
+
+=item B<-noargtypes>
+
+Disable recognition of ANSI-like descriptions of function signature.
+
+=back
+
+=head1 ENVIRONMENT
+
+No environment variables are used.
+
+=head1 AUTHOR
+
+Larry Wall
+
+=head1 MODIFICATION HISTORY
+
+See the file F<changes.pod>.
+
+=head1 SEE ALSO
+
+perl(1), perlxs(1), perlxstut(1)
+
+=cut
+
+require 5.002;
+use Cwd;
+use vars qw($cplusplus $hiertype);
+use vars '%v';
+
+use Config;
+
+sub Q ;
+
+# Global Constants
+
+$XSUBPP_version = "1.9508";
+
+my ($Is_VMS, $SymSet);
+if ($^O eq 'VMS') {
+    $Is_VMS = 1;
+    # Establish set of global symbols with max length 28, since xsubpp
+    # will later add the 'XS_' prefix.
+    require ExtUtils::XSSymSet;
+    $SymSet = new ExtUtils::XSSymSet 28;
+}
+
+$FH = 'File0000' ;
+
+$usage = "Usage: xsubpp [-v] [-C++] [-csuffix csuffix] [-except] [-prototypes] [-noversioncheck] [-nolinenumbers] [-nooptimize] [-noinout] [-noargtypes] [-s pattern] [-typemap typemap]... file.xs\n";
+
+$proto_re = "[" . quotemeta('\$%&*@;[]') . "]" ;
+
+$except = "";
+$WantPrototypes = -1 ;
+$WantVersionChk = 1 ;
+$ProtoUsed = 0 ;
+$WantLineNumbers = 1 ;
+$WantOptimize = 1 ;
+$Overload = 0;
+$Fallback = 'PL_sv_undef';
+
+my $process_inout = 1;
+my $process_argtypes = 1;
+my $csuffix = '.c';
+
+SWITCH: while (@ARGV and $ARGV[0] =~ /^-./) {
+    $flag = shift @ARGV;
+    $flag =~ s/^-// ;
+    $spat = quotemeta shift,	next SWITCH	if $flag eq 's';
+    $cplusplus = 1,	next SWITCH	if $flag eq 'C++';
+    $csuffix   = shift,	next SWITCH	if $flag eq 'csuffix';
+    $hiertype  = 1,	next SWITCH	if $flag eq 'hiertype';
+    $WantPrototypes = 0, next SWITCH	if $flag eq 'noprototypes';
+    $WantPrototypes = 1, next SWITCH	if $flag eq 'prototypes';
+    $WantVersionChk = 0, next SWITCH	if $flag eq 'noversioncheck';
+    $WantVersionChk = 1, next SWITCH	if $flag eq 'versioncheck';
+    # XXX left this in for compat
+    next SWITCH                         if $flag eq 'object_capi';
+    $except = " TRY",	next SWITCH	if $flag eq 'except';
+    push(@tm,shift),	next SWITCH	if $flag eq 'typemap';
+    $WantLineNumbers = 0, next SWITCH	if $flag eq 'nolinenumbers';
+    $WantLineNumbers = 1, next SWITCH	if $flag eq 'linenumbers';
+    $WantOptimize = 0, next SWITCH	if $flag eq 'nooptimize';
+    $WantOptimize = 1, next SWITCH	if $flag eq 'optimize';
+    $process_inout = 0, next SWITCH	if $flag eq 'noinout';
+    $process_inout = 1, next SWITCH	if $flag eq 'inout';
+    $process_argtypes = 0, next SWITCH	if $flag eq 'noargtypes';
+    $process_argtypes = 1, next SWITCH	if $flag eq 'argtypes';
+    (print "xsubpp version $XSUBPP_version\n"), exit
+	if $flag eq 'v';
+    die $usage;
+}
+if ($WantPrototypes == -1)
+  { $WantPrototypes = 0}
+else
+  { $ProtoUsed = 1 }
+
+
+@ARGV == 1 or die $usage;
+($dir, $filename) = $ARGV[0] =~ m#(.*)/(.*)#
+	or ($dir, $filename) = $ARGV[0] =~ m#(.*)\\(.*)#
+	or ($dir, $filename) = $ARGV[0] =~ m#(.*[>\]])(.*)#
+	or ($dir, $filename) = ('.', $ARGV[0]);
+chdir($dir);
+$pwd = cwd();
+
+++ $IncludedFiles{$ARGV[0]} ;
+
+my(@XSStack) = ({type => 'none'});	# Stack of conditionals and INCLUDEs
+my($XSS_work_idx, $cpp_next_tmp) = (0, "XSubPPtmpAAAA");
+
+
+sub TrimWhitespace
+{
+    $_[0] =~ s/^\s+|\s+$//go ;
+}
+
+sub TidyType
+{
+    local ($_) = @_ ;
+
+    # rationalise any '*' by joining them into bunches and removing whitespace
+    s#\s*(\*+)\s*#$1#g;
+    s#(\*+)# $1 #g ;
+
+    # change multiple whitespace into a single space
+    s/\s+/ /g ;
+
+    # trim leading & trailing whitespace
+    TrimWhitespace($_) ;
+
+    $_ ;
+}
+
+$typemap = shift @ARGV;
+foreach $typemap (@tm) {
+    die "Can't find $typemap in $pwd\n" unless -r $typemap;
+}
+unshift @tm, qw(../../../../lib/ExtUtils/typemap ../../../lib/ExtUtils/typemap
+                ../../lib/ExtUtils/typemap ../../../typemap ../../typemap
+                ../typemap typemap);
+foreach $typemap (@tm) {
+    next unless -f $typemap ;
+    # skip directories, binary files etc.
+    warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
+	unless -T $typemap ;
+    open(TYPEMAP, $typemap)
+	or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
+    $mode = 'Typemap';
+    $junk = "" ;
+    $current = \$junk;
+    while (<TYPEMAP>) {
+	next if /^\s*#/;
+        my $line_no = $. + 1;
+	if (/^INPUT\s*$/)   { $mode = 'Input';   $current = \$junk;  next; }
+	if (/^OUTPUT\s*$/)  { $mode = 'Output';  $current = \$junk;  next; }
+	if (/^TYPEMAP\s*$/) { $mode = 'Typemap'; $current = \$junk;  next; }
+	if ($mode eq 'Typemap') {
+	    chomp;
+	    my $line = $_ ;
+            TrimWhitespace($_) ;
+	    # skip blank lines and comment lines
+	    next if /^$/ or /^#/ ;
+	    my($type,$kind, $proto) = /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/ or
+		warn("Warning: File '$typemap' Line $. '$line' TYPEMAP entry needs 2 or 3 columns\n"), next;
+            $type = TidyType($type) ;
+	    $type_kind{$type} = $kind ;
+            # prototype defaults to '$'
+            $proto = "\$" unless $proto ;
+            warn("Warning: File '$typemap' Line $. '$line' Invalid prototype '$proto'\n")
+                unless ValidProtoString($proto) ;
+            $proto_letter{$type} = C_string($proto) ;
+	}
+	elsif (/^\s/) {
+	    $$current .= $_;
+	}
+	elsif ($mode eq 'Input') {
+	    s/\s+$//;
+	    $input_expr{$_} = '';
+	    $current = \$input_expr{$_};
+	}
+	else {
+	    s/\s+$//;
+	    $output_expr{$_} = '';
+	    $current = \$output_expr{$_};
+	}
+    }
+    close(TYPEMAP);
+}
+
+foreach $key (keys %input_expr) {
+    $input_expr{$key} =~ s/;*\s+\z//;
+}
+
+$bal = qr[(?:(?>[^()]+)|\((??{ $bal })\))*];	# ()-balanced
+$cast = qr[(?:\(\s*SV\s*\*\s*\)\s*)?];		# Optional (SV*) cast
+$size = qr[,\s* (??{ $bal }) ]x;		# Third arg (to setpvn)
+
+foreach $key (keys %output_expr) {
+    use re 'eval';
+
+    my ($t, $with_size, $arg, $sarg) =
+      ($output_expr{$key} =~
+	 m[^ \s+ sv_set ( [iunp] ) v (n)? 	# Type, is_setpvn
+	     \s* \( \s* $cast \$arg \s* ,
+	     \s* ( (??{ $bal }) )		# Set from
+	     ( (??{ $size }) )?			# Possible sizeof set-from
+	     \) \s* ; \s* $
+	  ]x);
+    $targetable{$key} = [$t, $with_size, $arg, $sarg] if $t;
+}
+
+$END = "!End!\n\n";		# "impossible" keyword (multiple newline)
+
+# Match an XS keyword
+$BLOCK_re= '\s*(' . join('|', qw(
+	REQUIRE BOOT CASE PREINIT INPUT INIT CODE PPCODE OUTPUT
+	CLEANUP ALIAS ATTRS PROTOTYPES PROTOTYPE VERSIONCHECK INCLUDE
+	SCOPE INTERFACE INTERFACE_MACRO C_ARGS POSTCALL OVERLOAD FALLBACK
+	)) . "|$END)\\s*:";
+
+# Input:  ($_, @line) == unparsed input.
+# Output: ($_, @line) == (rest of line, following lines).
+# Return: the matched keyword if found, otherwise 0
+sub check_keyword {
+	$_ = shift(@line) while !/\S/ && @line;
+	s/^(\s*)($_[0])\s*:\s*(?:#.*)?/$1/s && $2;
+}
+
+my ($C_group_rex, $C_arg);
+# Group in C (no support for comments or literals)
+$C_group_rex = qr/ [({\[]
+		   (?: (?> [^()\[\]{}]+ ) | (??{ $C_group_rex }) )*
+		   [)}\]] /x ;
+# Chunk in C without comma at toplevel (no comments):
+$C_arg = qr/ (?: (?> [^()\[\]{},"']+ )
+	     |   (??{ $C_group_rex })
+	     |   " (?: (?> [^\\"]+ )
+		   |   \\.
+		   )* "		# String literal
+	     |   ' (?: (?> [^\\']+ ) | \\. )* ' # Char literal
+	     )* /xs;
+
+if ($WantLineNumbers) {
+    {
+	package xsubpp::counter;
+	sub TIEHANDLE {
+	    my ($class, $cfile) = @_;
+	    my $buf = "";
+	    $SECTION_END_MARKER = "#line --- \"$cfile\"";
+	    $line_no = 1;
+	    bless \$buf;
+	}
+
+	sub PRINT {
+	    my $self = shift;
+	    for (@_) {
+		$$self .= $_;
+		while ($$self =~ s/^([^\n]*\n)//) {
+		    my $line = $1;
+		    ++ $line_no;
+		    $line =~ s|^\#line\s+---(?=\s)|#line $line_no|;
+		    print STDOUT $line;
+		}
+	    }
+	}
+
+	sub PRINTF {
+	    my $self = shift;
+	    my $fmt = shift;
+	    $self->PRINT(sprintf($fmt, @_));
+	}
+
+	sub DESTROY {
+	    # Not necessary if we're careful to end with a "\n"
+	    my $self = shift;
+	    print STDOUT $$self;
+	}
+    }
+
+    my $cfile = $filename;
+    $cfile =~ s/\.xs$/$csuffix/i or $cfile .= $csuffix;
+    tie(*PSEUDO_STDOUT, 'xsubpp::counter', $cfile);
+    select PSEUDO_STDOUT;
+}
+
+sub print_section {
+    # the "do" is required for right semantics
+    do { $_ = shift(@line) } while !/\S/ && @line;
+
+    print("#line ", $line_no[@line_no - @line -1], " \"$filename\"\n")
+	if $WantLineNumbers && !/^\s*#\s*line\b/ && !/^#if XSubPPtmp/;
+    for (;  defined($_) && !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	print "$_\n";
+    }
+    print "$xsubpp::counter::SECTION_END_MARKER\n" if $WantLineNumbers;
+}
+
+sub merge_section {
+    my $in = '';
+
+    while (!/\S/ && @line) {
+        $_ = shift(@line);
+    }
+
+    for (;  defined($_) && !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	$in .= "$_\n";
+    }
+    chomp $in;
+    return $in;
+}
+
+sub process_keyword($)
+{
+    my($pattern) = @_ ;
+    my $kwd ;
+
+    &{"${kwd}_handler"}()
+        while $kwd = check_keyword($pattern) ;
+}
+
+sub CASE_handler {
+    blurt ("Error: `CASE:' after unconditional `CASE:'")
+	if $condnum && $cond eq '';
+    $cond = $_;
+    TrimWhitespace($cond);
+    print "   ", ($condnum++ ? " else" : ""), ($cond ? " if ($cond)\n" : "\n");
+    $_ = '' ;
+}
+
+sub INPUT_handler {
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	last if /^\s*NOT_IMPLEMENTED_YET/;
+	next unless /\S/;	# skip blank lines
+
+	TrimWhitespace($_) ;
+	my $line = $_ ;
+
+	# remove trailing semicolon if no initialisation
+	s/\s*;$//g unless /[=;+].*\S/ ;
+
+	# Process the length(foo) declarations
+	if (s/^([^=]*)\blength\(\s*(\w+)\s*\)\s*$/$1 XSauto_length_of_$2=NO_INIT/x) {
+	  print "\tSTRLEN\tSTRLEN_length_of_$2;\n";
+	  $lengthof{$2} = $name;
+	  # $islengthof{$name} = $1;
+	  $deferred .= "\n\tXSauto_length_of_$2 = STRLEN_length_of_$2;";
+	}
+
+	# check for optional initialisation code
+	my $var_init = '' ;
+	$var_init = $1 if s/\s*([=;+].*)$//s ;
+	$var_init =~ s/"/\\"/g;
+
+	s/\s+/ /g;
+	my ($var_type, $var_addr, $var_name) = /^(.*?[^&\s])\s*(\&?)\s*\b(\w+)$/s
+	    or blurt("Error: invalid argument declaration '$line'"), next;
+
+	# Check for duplicate definitions
+	blurt ("Error: duplicate definition of argument '$var_name' ignored"), next
+	    if $arg_list{$var_name}++
+	      or defined $argtype_seen{$var_name} and not $processing_arg_with_types;
+
+	$thisdone |= $var_name eq "THIS";
+	$retvaldone |= $var_name eq "RETVAL";
+	$var_types{$var_name} = $var_type;
+	# XXXX This check is a safeguard against the unfinished conversion of
+	# generate_init().  When generate_init() is fixed,
+	# one can use 2-args map_type() unconditionally.
+	if ($var_type =~ / \( \s* \* \s* \) /x) {
+	  # Function pointers are not yet supported with &output_init!
+	  print "\t" . &map_type($var_type, $var_name);
+	  $name_printed = 1;
+	} else {
+	  print "\t" . &map_type($var_type);
+	  $name_printed = 0;
+	}
+	$var_num = $args_match{$var_name};
+
+        $proto_arg[$var_num] = ProtoString($var_type)
+	    if $var_num ;
+	$func_args =~ s/\b($var_name)\b/&$1/ if $var_addr;
+	if ($var_init =~ /^[=;]\s*NO_INIT\s*;?\s*$/
+	    or $in_out{$var_name} and $in_out{$var_name} =~ /^OUT/
+	    and $var_init !~ /\S/) {
+	  if ($name_printed) {
+	    print ";\n";
+	  } else {
+	    print "\t$var_name;\n";
+	  }
+	} elsif ($var_init =~ /\S/) {
+	    &output_init($var_type, $var_num, $var_name, $var_init, $name_printed);
+	} elsif ($var_num) {
+	    # generate initialization code
+	    &generate_init($var_type, $var_num, $var_name, $name_printed);
+	} else {
+	    print ";\n";
+	}
+    }
+}
+
+sub OUTPUT_handler {
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	next unless /\S/;
+	if (/^\s*SETMAGIC\s*:\s*(ENABLE|DISABLE)\s*/) {
+	    $DoSetMagic = ($1 eq "ENABLE" ? 1 : 0);
+	    next;
+	}
+	my ($outarg, $outcode) = /^\s*(\S+)\s*(.*?)\s*$/s ;
+	blurt ("Error: duplicate OUTPUT argument '$outarg' ignored"), next
+	    if $outargs{$outarg} ++ ;
+	if (!$gotRETVAL and $outarg eq 'RETVAL') {
+	    # deal with RETVAL last
+	    $RETVAL_code = $outcode ;
+	    $gotRETVAL = 1 ;
+	    next ;
+	}
+	blurt ("Error: OUTPUT $outarg not an argument"), next
+	    unless defined($args_match{$outarg});
+	blurt("Error: No input definition for OUTPUT argument '$outarg' - ignored"), next
+	    unless defined $var_types{$outarg} ;
+	$var_num = $args_match{$outarg};
+	if ($outcode) {
+	    print "\t$outcode\n";
+	    print "\tSvSETMAGIC(ST(" , $var_num-1 , "));\n" if $DoSetMagic;
+	} else {
+	    &generate_output($var_types{$outarg}, $var_num, $outarg, $DoSetMagic);
+	}
+	delete $in_out{$outarg} 	# No need to auto-OUTPUT
+	  if exists $in_out{$outarg} and $in_out{$outarg} =~ /OUT$/;
+    }
+}
+
+sub C_ARGS_handler() {
+    my $in = merge_section();
+
+    TrimWhitespace($in);
+    $func_args = $in;
+}
+
+sub INTERFACE_MACRO_handler() {
+    my $in = merge_section();
+
+    TrimWhitespace($in);
+    if ($in =~ /\s/) {		# two
+        ($interface_macro, $interface_macro_set) = split ' ', $in;
+    } else {
+        $interface_macro = $in;
+	$interface_macro_set = 'UNKNOWN_CVT'; # catch later
+    }
+    $interface = 1;		# local
+    $Interfaces = 1;		# global
+}
+
+sub INTERFACE_handler() {
+    my $in = merge_section();
+
+    TrimWhitespace($in);
+
+    foreach (split /[\s,]+/, $in) {
+        $Interfaces{$_} = $_;
+    }
+    print Q<<"EOF";
+#	XSFUNCTION = $interface_macro($ret_type,cv,XSANY.any_dptr);
+EOF
+    $interface = 1;		# local
+    $Interfaces = 1;		# global
+}
+
+sub CLEANUP_handler() { print_section() }
+sub PREINIT_handler() { print_section() }
+sub POSTCALL_handler() { print_section() }
+sub INIT_handler()    { print_section() }
+
+sub GetAliases
+{
+    my ($line) = @_ ;
+    my ($orig) = $line ;
+    my ($alias) ;
+    my ($value) ;
+
+    # Parse alias definitions
+    # format is
+    #    alias = value alias = value ...
+
+    while ($line =~ s/^\s*([\w:]+)\s*=\s*(\w+)\s*//) {
+        $alias = $1 ;
+        $orig_alias = $alias ;
+        $value = $2 ;
+
+        # check for optional package definition in the alias
+	$alias = $Packprefix . $alias if $alias !~ /::/ ;
+
+        # check for duplicate alias name & duplicate value
+	Warn("Warning: Ignoring duplicate alias '$orig_alias'")
+	    if defined $XsubAliases{$alias} ;
+
+	Warn("Warning: Aliases '$orig_alias' and '$XsubAliasValues{$value}' have identical values")
+	    if $XsubAliasValues{$value} ;
+
+	$XsubAliases = 1;
+	$XsubAliases{$alias} = $value ;
+	$XsubAliasValues{$value} = $orig_alias ;
+    }
+
+    blurt("Error: Cannot parse ALIAS definitions from '$orig'")
+        if $line ;
+}
+
+sub ATTRS_handler ()
+{
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	next unless /\S/;
+	TrimWhitespace($_) ;
+        push @Attributes, $_;
+    }
+}
+
+sub ALIAS_handler ()
+{
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	next unless /\S/;
+	TrimWhitespace($_) ;
+        GetAliases($_) if $_ ;
+    }
+}
+
+sub OVERLOAD_handler()
+{
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	next unless /\S/;
+	TrimWhitespace($_) ;
+        while ( s/^\s*([\w:"\\)\+\-\*\/\%\<\>\.\&\|\^\!\~\{\}\=]+)\s*//) {
+	    $Overload = 1 unless $Overload;
+	    my $overload = "$Package\::(".$1 ;
+            push(@InitFileCode,
+    	     "        newXS(\"$overload\", XS_$Full_func_name, file$proto);\n");
+        }
+    }
+
+}
+
+sub FALLBACK_handler()
+{
+    # the rest of the current line should contain either TRUE, 
+    # FALSE or UNDEF
+
+    TrimWhitespace($_) ;
+    my %map = (
+	TRUE => "PL_sv_yes", 1 => "PL_sv_yes",
+	FALSE => "PL_sv_no", 0 => "PL_sv_no",
+	UNDEF => "PL_sv_undef",
+    ) ;
+
+    # check for valid FALLBACK value
+    death ("Error: FALLBACK: TRUE/FALSE/UNDEF") unless exists $map{uc $_} ;
+
+    $Fallback = $map{uc $_} ;
+}
+
+sub REQUIRE_handler ()
+{
+    # the rest of the current line should contain a version number
+    my ($Ver) = $_ ;
+
+    TrimWhitespace($Ver) ;
+
+    death ("Error: REQUIRE expects a version number")
+	unless $Ver ;
+
+    # check that the version number is of the form n.n
+    death ("Error: REQUIRE: expected a number, got '$Ver'")
+	unless $Ver =~ /^\d+(\.\d*)?/ ;
+
+    death ("Error: xsubpp $Ver (or better) required--this is only $XSUBPP_version.")
+        unless $XSUBPP_version >= $Ver ;
+}
+
+sub VERSIONCHECK_handler ()
+{
+    # the rest of the current line should contain either ENABLE or
+    # DISABLE
+
+    TrimWhitespace($_) ;
+
+    # check for ENABLE/DISABLE
+    death ("Error: VERSIONCHECK: ENABLE/DISABLE")
+        unless /^(ENABLE|DISABLE)/i ;
+
+    $WantVersionChk = 1 if $1 eq 'ENABLE' ;
+    $WantVersionChk = 0 if $1 eq 'DISABLE' ;
+
+}
+
+sub PROTOTYPE_handler ()
+{
+    my $specified ;
+
+    death("Error: Only 1 PROTOTYPE definition allowed per xsub")
+        if $proto_in_this_xsub ++ ;
+
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+	next unless /\S/;
+	$specified = 1 ;
+	TrimWhitespace($_) ;
+        if ($_ eq 'DISABLE') {
+	   $ProtoThisXSUB = 0
+        }
+        elsif ($_ eq 'ENABLE') {
+	   $ProtoThisXSUB = 1
+        }
+        else {
+            # remove any whitespace
+            s/\s+//g ;
+            death("Error: Invalid prototype '$_'")
+                unless ValidProtoString($_) ;
+            $ProtoThisXSUB = C_string($_) ;
+        }
+    }
+
+    # If no prototype specified, then assume empty prototype ""
+    $ProtoThisXSUB = 2 unless $specified ;
+
+    $ProtoUsed = 1 ;
+
+}
+
+sub SCOPE_handler ()
+{
+    death("Error: Only 1 SCOPE declaration allowed per xsub")
+        if $scope_in_this_xsub ++ ;
+
+    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
+		next unless /\S/;
+		TrimWhitespace($_) ;
+        if ($_ =~ /^DISABLE/i) {
+		   $ScopeThisXSUB = 0
+        }
+        elsif ($_ =~ /^ENABLE/i) {
+		   $ScopeThisXSUB = 1
+        }
+    }
+
+}
+
+sub PROTOTYPES_handler ()
+{
+    # the rest of the current line should contain either ENABLE or
+    # DISABLE
+
+    TrimWhitespace($_) ;
+
+    # check for ENABLE/DISABLE
+    death ("Error: PROTOTYPES: ENABLE/DISABLE")
+        unless /^(ENABLE|DISABLE)/i ;
+
+    $WantPrototypes = 1 if $1 eq 'ENABLE' ;
+    $WantPrototypes = 0 if $1 eq 'DISABLE' ;
+    $ProtoUsed = 1 ;
+
+}
+
+sub INCLUDE_handler ()
+{
+    # the rest of the current line should contain a valid filename
+
+    TrimWhitespace($_) ;
+
+    death("INCLUDE: filename missing")
+        unless $_ ;
+
+    death("INCLUDE: output pipe is illegal")
+        if /^\s*\|/ ;
+
+    # simple minded recursion detector
+    death("INCLUDE loop detected")
+        if $IncludedFiles{$_} ;
+
+    ++ $IncludedFiles{$_} unless /\|\s*$/ ;
+
+    # Save the current file context.
+    push(@XSStack, {
+	type		=> 'file',
+        LastLine        => $lastline,
+        LastLineNo      => $lastline_no,
+        Line            => \@line,
+        LineNo          => \@line_no,
+        Filename        => $filename,
+        Handle          => $FH,
+        }) ;
+
+    ++ $FH ;
+
+    # open the new file
+    open ($FH, "$_") or death("Cannot open '$_': $!") ;
+
+    print Q<<"EOF" ;
+#
+#/* INCLUDE:  Including '$_' from '$filename' */
+#
+EOF
+
+    $filename = $_ ;
+
+    # Prime the pump by reading the first
+    # non-blank line
+
+    # skip leading blank lines
+    while (<$FH>) {
+        last unless /^\s*$/ ;
+    }
+
+    $lastline = $_ ;
+    $lastline_no = $. ;
+
+}
+
+sub PopFile()
+{
+    return 0 unless $XSStack[-1]{type} eq 'file' ;
+
+    my $data     = pop @XSStack ;
+    my $ThisFile = $filename ;
+    my $isPipe   = ($filename =~ /\|\s*$/) ;
+
+    -- $IncludedFiles{$filename}
+        unless $isPipe ;
+
+    close $FH ;
+
+    $FH         = $data->{Handle} ;
+    $filename   = $data->{Filename} ;
+    $lastline   = $data->{LastLine} ;
+    $lastline_no = $data->{LastLineNo} ;
+    @line       = @{ $data->{Line} } ;
+    @line_no    = @{ $data->{LineNo} } ;
+
+    if ($isPipe and $? ) {
+        -- $lastline_no ;
+        print STDERR "Error reading from pipe '$ThisFile': $! in $filename, line $lastline_no\n"  ;
+        exit 1 ;
+    }
+
+    print Q<<"EOF" ;
+#
+#/* INCLUDE: Returning to '$filename' from '$ThisFile' */
+#
+EOF
+
+    return 1 ;
+}
+
+sub ValidProtoString ($)
+{
+    my($string) = @_ ;
+
+    if ( $string =~ /^$proto_re+$/ ) {
+        return $string ;
+    }
+
+    return 0 ;
+}
+
+sub C_string ($)
+{
+    my($string) = @_ ;
+
+    $string =~ s[\\][\\\\]g ;
+    $string ;
+}
+
+sub ProtoString ($)
+{
+    my ($type) = @_ ;
+
+    $proto_letter{$type} or "\$" ;
+}
+
+sub check_cpp {
+    my @cpp = grep(/^\#\s*(?:if|e\w+)/, @line);
+    if (@cpp) {
+	my ($cpp, $cpplevel);
+	for $cpp (@cpp) {
+	    if ($cpp =~ /^\#\s*if/) {
+		$cpplevel++;
+	    } elsif (!$cpplevel) {
+		Warn("Warning: #else/elif/endif without #if in this function");
+		print STDERR "    (precede it with a blank line if the matching #if is outside the function)\n"
+		    if $XSStack[-1]{type} eq 'if';
+		return;
+	    } elsif ($cpp =~ /^\#\s*endif/) {
+		$cpplevel--;
+	    }
+	}
+	Warn("Warning: #if without #endif in this function") if $cpplevel;
+    }
+}
+
+
+sub Q {
+    my($text) = @_;
+    $text =~ s/^#//gm;
+    $text =~ s/\[\[/{/g;
+    $text =~ s/\]\]/}/g;
+    $text;
+}
+
+open($FH, $filename) or die "cannot open $filename: $!\n";
+
+# Identify the version of xsubpp used
+print <<EOM ;
+/*
+ * This file was generated automatically by xsubpp version $XSUBPP_version from the
+ * contents of $filename. Do not edit this file, edit $filename instead.
+ *
+ *	ANY CHANGES MADE HERE WILL BE LOST!
+ *
+ */
+
+EOM
+
+
+print("#line 1 \"$filename\"\n")
+    if $WantLineNumbers;
+
+firstmodule:
+while (<$FH>) {
+    if (/^=/) {
+        my $podstartline = $.;
+    	do {
+	    if (/^=cut\s*$/) {
+		# We can't just write out a /* */ comment, as our embedded
+		# POD might itself be in a comment. We can't put a /**/
+		# comment inside #if 0, as the C standard says that the source
+		# file is decomposed into preprocessing characters in the stage
+		# before preprocessing commands are executed.
+		# I don't want to leave the text as barewords, because the spec
+		# isn't clear whether macros are expanded before or after
+		# preprocessing commands are executed, and someone pathological
+		# may just have defined one of the 3 words as a macro that does
+		# something strange. Multiline strings are illegal in C, so
+		# the "" we write must be a string literal. And they aren't
+		# concatenated until 2 steps later, so we are safe.
+		print("#if 0\n  \"Skipped embedded POD.\"\n#endif\n");
+		printf("#line %d \"$filename\"\n", $. + 1)
+		  if $WantLineNumbers;
+		next firstmodule
+	    }
+
+	} while (<$FH>);
+	# At this point $. is at end of file so die won't state the start
+	# of the problem, and as we haven't yet read any lines &death won't
+	# show the correct line in the message either.
+	die ("Error: Unterminated pod in $filename, line $podstartline\n")
+	  unless $lastline;
+    }
+    last if ($Module, $Package, $Prefix) =
+	/^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/;
+
+    print $_;
+}
+&Exit unless defined $_;
+
+print "$xsubpp::counter::SECTION_END_MARKER\n" if $WantLineNumbers;
+
+$lastline    = $_;
+$lastline_no = $.;
+
+# Read next xsub into @line from ($lastline, <$FH>).
+sub fetch_para {
+    # parse paragraph
+    death ("Error: Unterminated `#if/#ifdef/#ifndef'")
+	if !defined $lastline && $XSStack[-1]{type} eq 'if';
+    @line = ();
+    @line_no = () ;
+    return PopFile() if !defined $lastline;
+
+    if ($lastline =~
+	/^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/) {
+	$Module = $1;
+	$Package = defined($2) ? $2 : '';	# keep -w happy
+	$Prefix  = defined($3) ? $3 : '';	# keep -w happy
+	$Prefix = quotemeta $Prefix ;
+	($Module_cname = $Module) =~ s/\W/_/g;
+	($Packid = $Package) =~ tr/:/_/;
+	$Packprefix = $Package;
+	$Packprefix .= "::" if $Packprefix ne "";
+	$lastline = "";
+    }
+
+    for(;;) {
+	# Skip embedded PODs
+	while ($lastline =~ /^=/) {
+    	    while ($lastline = <$FH>) {
+	    	last if ($lastline =~ /^=cut\s*$/);
+	    }
+	    death ("Error: Unterminated pod") unless $lastline;
+	    $lastline = <$FH>;
+	    chomp $lastline;
+	    $lastline =~ s/^\s+$//;
+	}
+	if ($lastline !~ /^\s*#/ ||
+	    # CPP directives:
+	    #	ANSI:	if ifdef ifndef elif else endif define undef
+	    #		line error pragma
+	    #	gcc:	warning include_next
+	    #   obj-c:	import
+	    #   others:	ident (gcc notes that some cpps have this one)
+	    $lastline =~ /^#[ \t]*(?:(?:if|ifn?def|elif|else|endif|define|undef|pragma|error|warning|line\s+\d+|ident)\b|(?:include(?:_next)?|import)\s*["<].*[>"])/) {
+	    last if $lastline =~ /^\S/ && @line && $line[-1] eq "";
+	    push(@line, $lastline);
+	    push(@line_no, $lastline_no) ;
+	}
+
+	# Read next line and continuation lines
+	last unless defined($lastline = <$FH>);
+	$lastline_no = $.;
+	my $tmp_line;
+	$lastline .= $tmp_line
+	    while ($lastline =~ /\\$/ && defined($tmp_line = <$FH>));
+
+	chomp $lastline;
+	$lastline =~ s/^\s+$//;
+    }
+    pop(@line), pop(@line_no) while @line && $line[-1] eq "";
+    1;
+}
+
+PARAGRAPH:
+while (fetch_para()) {
+    # Print initial preprocessor statements and blank lines
+    while (@line && $line[0] !~ /^[^\#]/) {
+	my $line = shift(@line);
+	print $line, "\n";
+	next unless $line =~ /^\#\s*((if)(?:n?def)?|elsif|else|endif)\b/;
+	my $statement = $+;
+	if ($statement eq 'if') {
+	    $XSS_work_idx = @XSStack;
+	    push(@XSStack, {type => 'if'});
+	} else {
+	    death ("Error: `$statement' with no matching `if'")
+		if $XSStack[-1]{type} ne 'if';
+	    if ($XSStack[-1]{varname}) {
+		push(@InitFileCode, "#endif\n");
+		push(@BootCode,     "#endif");
+	    }
+
+	    my(@fns) = keys %{$XSStack[-1]{functions}};
+	    if ($statement ne 'endif') {
+		# Hide the functions defined in other #if branches, and reset.
+		@{$XSStack[-1]{other_functions}}{@fns} = (1) x @fns;
+		@{$XSStack[-1]}{qw(varname functions)} = ('', {});
+	    } else {
+		my($tmp) = pop(@XSStack);
+		0 while (--$XSS_work_idx
+			 && $XSStack[$XSS_work_idx]{type} ne 'if');
+		# Keep all new defined functions
+		push(@fns, keys %{$tmp->{other_functions}});
+		@{$XSStack[$XSS_work_idx]{functions}}{@fns} = (1) x @fns;
+	    }
+	}
+    }
+
+    next PARAGRAPH unless @line;
+
+    if ($XSS_work_idx && !$XSStack[$XSS_work_idx]{varname}) {
+	# We are inside an #if, but have not yet #defined its xsubpp variable.
+	print "#define $cpp_next_tmp 1\n\n";
+	push(@InitFileCode, "#if $cpp_next_tmp\n");
+	push(@BootCode,     "#if $cpp_next_tmp");
+	$XSStack[$XSS_work_idx]{varname} = $cpp_next_tmp++;
+    }
+
+    death ("Code is not inside a function"
+	   ." (maybe last function was ended by a blank line "
+	   ." followed by a statement on column one?)")
+	if $line[0] =~ /^\s/;
+
+    # initialize info arrays
+    undef(%args_match);
+    undef(%var_types);
+    undef(%defaults);
+    undef($class);
+    undef($externC);
+    undef($static);
+    undef($elipsis);
+    undef($wantRETVAL) ;
+    undef($RETVAL_no_return) ;
+    undef(%arg_list) ;
+    undef(@proto_arg) ;
+    undef(@fake_INPUT_pre) ;	# For length(s) generated variables
+    undef(@fake_INPUT) ;
+    undef($processing_arg_with_types) ;
+    undef(%argtype_seen) ;
+    undef(@outlist) ;
+    undef(%in_out) ;
+    undef(%lengthof) ;
+    # undef(%islengthof) ;
+    undef($proto_in_this_xsub) ;
+    undef($scope_in_this_xsub) ;
+    undef($interface);
+    undef($prepush_done);
+    $interface_macro = 'XSINTERFACE_FUNC' ;
+    $interface_macro_set = 'XSINTERFACE_FUNC_SET' ;
+    $ProtoThisXSUB = $WantPrototypes ;
+    $ScopeThisXSUB = 0;
+    $xsreturn = 0;
+
+    $_ = shift(@line);
+    while ($kwd = check_keyword("REQUIRE|PROTOTYPES|FALLBACK|VERSIONCHECK|INCLUDE")) {
+        &{"${kwd}_handler"}() ;
+        next PARAGRAPH unless @line ;
+        $_ = shift(@line);
+    }
+
+    if (check_keyword("BOOT")) {
+	&check_cpp;
+	push (@BootCode, "#line $line_no[@line_no - @line] \"$filename\"")
+	  if $WantLineNumbers && $line[0] !~ /^\s*#\s*line\b/;
+        push (@BootCode, @line, "") ;
+        next PARAGRAPH ;
+    }
+
+
+    # extract return type, function name and arguments
+    ($ret_type) = TidyType($_);
+    $RETVAL_no_return = 1 if $ret_type =~ s/^NO_OUTPUT\s+//;
+
+    # Allow one-line ANSI-like declaration
+    unshift @line, $2
+      if $process_argtypes
+	and $ret_type =~ s/^(.*?\w.*?)\s*\b(\w+\s*\(.*)/$1/s;
+
+    # a function definition needs at least 2 lines
+    blurt ("Error: Function definition too short '$ret_type'"), next PARAGRAPH
+	unless @line ;
+
+    $externC = 1 if $ret_type =~ s/^extern "C"\s+//;
+    $static  = 1 if $ret_type =~ s/^static\s+//;
+
+    $func_header = shift(@line);
+    blurt ("Error: Cannot parse function definition from '$func_header'"), next PARAGRAPH
+	unless $func_header =~ /^(?:([\w:]*)::)?(\w+)\s*\(\s*(.*?)\s*\)\s*(const)?\s*(;\s*)?$/s;
+
+    ($class, $func_name, $orig_args) =  ($1, $2, $3) ;
+    $class = "$4 $class" if $4;
+    ($pname = $func_name) =~ s/^($Prefix)?/$Packprefix/;
+    ($clean_func_name = $func_name) =~ s/^$Prefix//;
+    $Full_func_name = "${Packid}_$clean_func_name";
+    if ($Is_VMS) { $Full_func_name = $SymSet->addsym($Full_func_name); }
+
+    # Check for duplicate function definition
+    for $tmp (@XSStack) {
+	next unless defined $tmp->{functions}{$Full_func_name};
+	Warn("Warning: duplicate function definition '$clean_func_name' detected");
+	last;
+    }
+    $XSStack[$XSS_work_idx]{functions}{$Full_func_name} ++ ;
+    %XsubAliases = %XsubAliasValues = %Interfaces = @Attributes = ();
+    $DoSetMagic = 1;
+
+    $orig_args =~ s/\\\s*/ /g;		# process line continuations
+
+    my %only_C_inlist;	# Not in the signature of Perl function
+    if ($process_argtypes and $orig_args =~ /\S/) {
+	my $args = "$orig_args ,";
+	if ($args =~ /^( (??{ $C_arg }) , )* $ /x) {
+	    @args = ($args =~ /\G ( (??{ $C_arg }) ) , /xg);
+	    for ( @args ) {
+		s/^\s+//;
+		s/\s+$//;
+		my ($arg, $default) = / ( [^=]* ) ( (?: = .* )? ) /x;
+		my ($pre, $name) = ($arg =~ /(.*?) \s*
+					     \b ( \w+ | length\( \s*\w+\s* \) )
+					     \s* $ /x);
+		next unless length $pre;
+		my $out_type;
+		my $inout_var;
+		if ($process_inout and s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\s+//) {
+		    my $type = $1;
+		    $out_type = $type if $type ne 'IN';
+		    $arg =~ s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\s+//;
+		    $pre =~ s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\s+//;
+		}
+		my $islength;
+		if ($name =~ /^length\( \s* (\w+) \s* \)\z/x) {
+		  $name = "XSauto_length_of_$1";
+		  $islength = 1;
+		  die "Default value on length() argument: `$_'"
+		    if length $default;
+		}
+		if (length $pre or $islength) {	# Has a type
+		    if ($islength) {
+		      push @fake_INPUT_pre, $arg;
+		    } else {
+		      push @fake_INPUT, $arg;
+		    }
+		    # warn "pushing '$arg'\n";
+		    $argtype_seen{$name}++;
+		    $_ = "$name$default"; # Assigns to @args
+		}
+		$only_C_inlist{$_} = 1 if $out_type eq "OUTLIST" or $islength;
+		push @outlist, $name if $out_type =~ /OUTLIST$/;
+		$in_out{$name} = $out_type if $out_type;
+	    }
+	} else {
+	    @args = split(/\s*,\s*/, $orig_args);
+	    Warn("Warning: cannot parse argument list '$orig_args', fallback to split");
+	}
+    } else {
+	@args = split(/\s*,\s*/, $orig_args);
+	for (@args) {
+	    if ($process_inout and s/^(IN|IN_OUTLIST|OUTLIST|IN_OUT|OUT)\s+//) {
+		my $out_type = $1;
+		next if $out_type eq 'IN';
+		$only_C_inlist{$_} = 1 if $out_type eq "OUTLIST";
+		push @outlist, $name if $out_type =~ /OUTLIST$/;
+		$in_out{$_} = $out_type;
+	    }
+	}
+    }
+    if (defined($class)) {
+	my $arg0 = ((defined($static) or $func_name eq 'new')
+		    ? "CLASS" : "THIS");
+	unshift(@args, $arg0);
+	($report_args = "$arg0, $report_args") =~ s/^\w+, $/$arg0/;
+    }
+    my $extra_args = 0;
+    @args_num = ();
+    $num_args = 0;
+    my $report_args = '';
+    foreach $i (0 .. $#args) {
+	    if ($args[$i] =~ s/\.\.\.//) {
+		    $elipsis = 1;
+		    if ($args[$i] eq '' && $i == $#args) {
+		        $report_args .= ", ...";
+			pop(@args);
+			last;
+		    }
+	    }
+	    if ($only_C_inlist{$args[$i]}) {
+		push @args_num, undef;
+	    } else {
+		push @args_num, ++$num_args;
+		$report_args .= ", $args[$i]";
+	    }
+	    if ($args[$i] =~ /^([^=]*[^\s=])\s*=\s*(.*)/s) {
+		    $extra_args++;
+		    $args[$i] = $1;
+		    $defaults{$args[$i]} = $2;
+		    $defaults{$args[$i]} =~ s/"/\\"/g;
+	    }
+	    $proto_arg[$i+1] = "\$" ;
+    }
+    $min_args = $num_args - $extra_args;
+    $report_args =~ s/"/\\"/g;
+    $report_args =~ s/^,\s+//;
+    my @func_args = @args;
+    shift @func_args if defined($class);
+
+    for (@func_args) {
+	s/^/&/ if $in_out{$_};
+    }
+    $func_args = join(", ", @func_args);
+    @args_match{@args} = @args_num;
+
+    $PPCODE = grep(/^\s*PPCODE\s*:/, @line);
+    $CODE = grep(/^\s*CODE\s*:/, @line);
+    # Detect CODE: blocks which use ST(n)= or XST_m*(n,v)
+    #   to set explicit return values.
+    $EXPLICIT_RETURN = ($CODE &&
+		("@line" =~ /(\bST\s*\([^;]*=) | (\bXST_m\w+\s*\()/x ));
+    $ALIAS  = grep(/^\s*ALIAS\s*:/,  @line);
+    $INTERFACE  = grep(/^\s*INTERFACE\s*:/,  @line);
+
+    $xsreturn = 1 if $EXPLICIT_RETURN;
+
+    $externC = $externC ? qq[extern "C"] : "";
+
+    # print function header
+    print Q<<"EOF";
+#$externC
+#XS(XS_${Full_func_name}); /* prototype to pass -Wmissing-prototypes */
+#XS(XS_${Full_func_name})
+#[[
+#    dXSARGS;
+EOF
+    print Q<<"EOF" if $ALIAS ;
+#    dXSI32;
+EOF
+    print Q<<"EOF" if $INTERFACE ;
+#    dXSFUNCTION($ret_type);
+EOF
+    if ($elipsis) {
+	$cond = ($min_args ? qq(items < $min_args) : 0);
+    }
+    elsif ($min_args == $num_args) {
+	$cond = qq(items != $min_args);
+    }
+    else {
+	$cond = qq(items < $min_args || items > $num_args);
+    }
+
+    print Q<<"EOF" if $except;
+#    char errbuf[1024];
+#    *errbuf = '\0';
+EOF
+
+    if ($ALIAS)
+      { print Q<<"EOF" if $cond }
+#    if ($cond)
+#       Perl_croak(aTHX_ "Usage: %s($report_args)", GvNAME(CvGV(cv)));
+EOF
+    else
+      { print Q<<"EOF" if $cond }
+#    if ($cond)
+#	Perl_croak(aTHX_ "Usage: $pname($report_args)");
+EOF
+
+    #gcc -Wall: if an xsub has no arguments and PPCODE is used
+    #it is likely none of ST, XSRETURN or XSprePUSH macros are used
+    #hence `ax' (setup by dXSARGS) is unused
+    #XXX: could breakup the dXSARGS; into dSP;dMARK;dITEMS
+    #but such a move could break third-party extensions
+    print Q<<"EOF" if $PPCODE and $num_args == 0;
+#   PERL_UNUSED_VAR(ax); /* -Wall */
+EOF
+
+    print Q<<"EOF" if $PPCODE;
+#    SP -= items;
+EOF
+
+    # Now do a block of some sort.
+
+    $condnum = 0;
+    $cond = '';			# last CASE: condidional
+    push(@line, "$END:");
+    push(@line_no, $line_no[-1]);
+    $_ = '';
+    &check_cpp;
+    while (@line) {
+	&CASE_handler if check_keyword("CASE");
+	print Q<<"EOF";
+#   $except [[
+EOF
+
+	# do initialization of input variables
+	$thisdone = 0;
+	$retvaldone = 0;
+	$deferred = "";
+	%arg_list = () ;
+        $gotRETVAL = 0;
+
+	INPUT_handler() ;
+	process_keyword("INPUT|PREINIT|INTERFACE_MACRO|C_ARGS|ALIAS|ATTRS|PROTOTYPE|SCOPE|OVERLOAD") ;
+
+	print Q<<"EOF" if $ScopeThisXSUB;
+#   ENTER;
+#   [[
+EOF
+	
+	if (!$thisdone && defined($class)) {
+	    if (defined($static) or $func_name eq 'new') {
+		print "\tchar *";
+		$var_types{"CLASS"} = "char *";
+		&generate_init("char *", 1, "CLASS");
+	    }
+	    else {
+		print "\t$class *";
+		$var_types{"THIS"} = "$class *";
+		&generate_init("$class *", 1, "THIS");
+	    }
+	}
+
+	# do code
+	if (/^\s*NOT_IMPLEMENTED_YET/) {
+		print "\n\tPerl_croak(aTHX_ \"$pname: not implemented yet\");\n";
+		$_ = '' ;
+	} else {
+		if ($ret_type ne "void") {
+			print "\t" . &map_type($ret_type, 'RETVAL') . ";\n"
+				if !$retvaldone;
+			$args_match{"RETVAL"} = 0;
+			$var_types{"RETVAL"} = $ret_type;
+			print "\tdXSTARG;\n"
+				if $WantOptimize and $targetable{$type_kind{$ret_type}};
+		}
+
+		if (@fake_INPUT or @fake_INPUT_pre) {
+		    unshift @line, @fake_INPUT_pre, @fake_INPUT, $_;
+		    $_ = "";
+		    $processing_arg_with_types = 1;
+		    INPUT_handler() ;
+		}
+		print $deferred;
+
+        process_keyword("INIT|ALIAS|ATTRS|PROTOTYPE|INTERFACE_MACRO|INTERFACE|C_ARGS|OVERLOAD") ;
+
+		if (check_keyword("PPCODE")) {
+			print_section();
+			death ("PPCODE must be last thing") if @line;
+			print "\tLEAVE;\n" if $ScopeThisXSUB;
+			print "\tPUTBACK;\n\treturn;\n";
+		} elsif (check_keyword("CODE")) {
+			print_section() ;
+		} elsif (defined($class) and $func_name eq "DESTROY") {
+			print "\n\t";
+			print "delete THIS;\n";
+		} else {
+			print "\n\t";
+			if ($ret_type ne "void") {
+				print "RETVAL = ";
+				$wantRETVAL = 1;
+			}
+			if (defined($static)) {
+			    if ($func_name eq 'new') {
+				$func_name = "$class";
+			    } else {
+				print "${class}::";
+			    }
+			} elsif (defined($class)) {
+			    if ($func_name eq 'new') {
+				$func_name .= " $class";
+			    } else {
+				print "THIS->";
+			    }
+			}
+			$func_name =~ s/^($spat)//
+			    if defined($spat);
+			$func_name = 'XSFUNCTION' if $interface;
+			print "$func_name($func_args);\n";
+		}
+	}
+
+	# do output variables
+	$gotRETVAL = 0;		# 1 if RETVAL seen in OUTPUT section;
+	undef $RETVAL_code ;	# code to set RETVAL (from OUTPUT section);
+	# $wantRETVAL set if 'RETVAL =' autogenerated
+	($wantRETVAL, $ret_type) = (0, 'void') if $RETVAL_no_return;
+	undef %outargs ;
+	process_keyword("POSTCALL|OUTPUT|ALIAS|ATTRS|PROTOTYPE|OVERLOAD");
+
+	&generate_output($var_types{$_}, $args_match{$_}, $_, $DoSetMagic)
+	  for grep $in_out{$_} =~ /OUT$/, keys %in_out;
+
+	# all OUTPUT done, so now push the return value on the stack
+	if ($gotRETVAL && $RETVAL_code) {
+	    print "\t$RETVAL_code\n";
+	} elsif ($gotRETVAL || $wantRETVAL) {
+	    my $t = $WantOptimize && $targetable{$type_kind{$ret_type}};
+	    my $var = 'RETVAL';
+	    my $type = $ret_type;
+
+	    # 0: type, 1: with_size, 2: how, 3: how_size
+	    if ($t and not $t->[1] and $t->[0] eq 'p') {
+		# PUSHp corresponds to setpvn.  Treate setpv directly
+		my $what = eval qq("$t->[2]");
+		warn $@ if $@;
+
+		print "\tsv_setpv(TARG, $what); XSprePUSH; PUSHTARG;\n";
+		$prepush_done = 1;
+	    }
+	    elsif ($t) {
+		my $what = eval qq("$t->[2]");
+		warn $@ if $@;
+
+		my $size = $t->[3];
+		$size = '' unless defined $size;
+		$size = eval qq("$size");
+		warn $@ if $@;
+		print "\tXSprePUSH; PUSH$t->[0]($what$size);\n";
+		$prepush_done = 1;
+	    }
+	    else {
+		# RETVAL almost never needs SvSETMAGIC()
+		&generate_output($ret_type, 0, 'RETVAL', 0);
+	    }
+	}
+
+	$xsreturn = 1 if $ret_type ne "void";
+	my $num = $xsreturn;
+	my $c = @outlist;
+	# (PP)CODE set different values of SP; reset to PPCODE's with 0 output
+	print "\tXSprePUSH;"    if $c and not $prepush_done;
+	# Take into account stuff already put on stack
+	print "\t++SP;"         if $c and not $prepush_done and $xsreturn;
+	# Now SP corresponds to ST($xsreturn), so one can combine PUSH and ST()
+	print "\tEXTEND(SP,$c);\n" if $c;
+	$xsreturn += $c;
+	generate_output($var_types{$_}, $num++, $_, 0, 1) for @outlist;
+
+	# do cleanup
+	process_keyword("CLEANUP|ALIAS|ATTRS|PROTOTYPE|OVERLOAD") ;
+
+	print Q<<"EOF" if $ScopeThisXSUB;
+#   ]]
+EOF
+	print Q<<"EOF" if $ScopeThisXSUB and not $PPCODE;
+#   LEAVE;
+EOF
+
+	# print function trailer
+	print Q<<EOF;
+#    ]]
+EOF
+	print Q<<EOF if $except;
+#    BEGHANDLERS
+#    CATCHALL
+#	sprintf(errbuf, "%s: %s\\tpropagated", Xname, Xreason);
+#    ENDHANDLERS
+EOF
+	if (check_keyword("CASE")) {
+	    blurt ("Error: No `CASE:' at top of function")
+		unless $condnum;
+	    $_ = "CASE: $_";	# Restore CASE: label
+	    next;
+	}
+	last if $_ eq "$END:";
+	death(/^$BLOCK_re/o ? "Misplaced `$1:'" : "Junk at end of function");
+    }
+
+    print Q<<EOF if $except;
+#    if (errbuf[0])
+#	Perl_croak(aTHX_ errbuf);
+EOF
+
+    if ($xsreturn) {
+        print Q<<EOF unless $PPCODE;
+#    XSRETURN($xsreturn);
+EOF
+    } else {
+        print Q<<EOF unless $PPCODE;
+#    XSRETURN_EMPTY;
+EOF
+    }
+
+    print Q<<EOF;
+#]]
+#
+EOF
+
+    my $newXS = "newXS" ;
+    my $proto = "" ;
+
+    # Build the prototype string for the xsub
+    if ($ProtoThisXSUB) {
+	$newXS = "newXSproto";
+
+	if ($ProtoThisXSUB eq 2) {
+	    # User has specified empty prototype
+	    $proto = ', ""' ;
+	}
+        elsif ($ProtoThisXSUB ne 1) {
+            # User has specified a prototype
+            $proto = ', "' . $ProtoThisXSUB . '"';
+        }
+        else {
+	    my $s = ';';
+            if ($min_args < $num_args)  {
+                $s = '';
+		$proto_arg[$min_args] .= ";" ;
+	    }
+            push @proto_arg, "$s\@"
+                if $elipsis ;
+
+            $proto = ', "' . join ("", @proto_arg) . '"';
+        }
+    }
+
+    if (%XsubAliases) {
+	$XsubAliases{$pname} = 0
+	    unless defined $XsubAliases{$pname} ;
+	while ( ($name, $value) = each %XsubAliases) {
+	    push(@InitFileCode, Q<<"EOF");
+#        cv = newXS(\"$name\", XS_$Full_func_name, file);
+#        XSANY.any_i32 = $value ;
+EOF
+	push(@InitFileCode, Q<<"EOF") if $proto;
+#        sv_setpv((SV*)cv$proto) ;
+EOF
+        }
+    }
+    elsif (@Attributes) {
+	    push(@InitFileCode, Q<<"EOF");
+#        cv = newXS(\"$pname\", XS_$Full_func_name, file);
+#        apply_attrs_string("$Package", cv, "@Attributes", 0);
+EOF
+    }
+    elsif ($interface) {
+	while ( ($name, $value) = each %Interfaces) {
+	    $name = "$Package\::$name" unless $name =~ /::/;
+	    push(@InitFileCode, Q<<"EOF");
+#        cv = newXS(\"$name\", XS_$Full_func_name, file);
+#        $interface_macro_set(cv,$value) ;
+EOF
+	    push(@InitFileCode, Q<<"EOF") if $proto;
+#        sv_setpv((SV*)cv$proto) ;
+EOF
+        }
+    }
+    else {
+	push(@InitFileCode,
+	     "        ${newXS}(\"$pname\", XS_$Full_func_name, file$proto);\n");
+    }
+}
+
+if ($Overload) # make it findable with fetchmethod
+{
+    
+    print Q<<"EOF"; 
+#XS(XS_${Packid}_nil); /* prototype to pass -Wmissing-prototypes */
+#XS(XS_${Packid}_nil)
+#{
+#   XSRETURN_EMPTY;
+#}
+#
+EOF
+    unshift(@InitFileCode, <<"MAKE_FETCHMETHOD_WORK");
+    /* Making a sub named "${Package}::()" allows the package */
+    /* to be findable via fetchmethod(), and causes */
+    /* overload::Overloaded("${Package}") to return true. */
+    newXS("${Package}::()", XS_${Packid}_nil, file$proto);
+MAKE_FETCHMETHOD_WORK
+}
+
+# print initialization routine
+
+print Q<<"EOF";
+##ifdef __cplusplus
+#extern "C"
+##endif
+EOF
+
+print Q<<"EOF";
+#XS(boot_$Module_cname); /* prototype to pass -Wmissing-prototypes */
+#XS(boot_$Module_cname)
+EOF
+
+print Q<<"EOF";
+#[[
+#    dXSARGS;
+EOF
+
+#-Wall: if there is no $Full_func_name there are no xsubs in this .xs
+#so `file' is unused
+print Q<<"EOF" if $Full_func_name;
+#    char* file = __FILE__;
+EOF
+
+print Q "#\n";
+
+print Q<<"EOF" if $WantVersionChk ;
+#    XS_VERSION_BOOTCHECK ;
+#
+EOF
+
+print Q<<"EOF" if defined $XsubAliases or defined $Interfaces ;
+#    {
+#        CV * cv ;
+#
+EOF
+
+print Q<<"EOF" if ($Overload);
+#    /* register the overloading (type 'A') magic */
+#    PL_amagic_generation++;
+#    /* The magic for overload gets a GV* via gv_fetchmeth as */
+#    /* mentioned above, and looks in the SV* slot of it for */
+#    /* the "fallback" status. */
+#    sv_setsv(
+#        get_sv( "${Package}::()", TRUE ),
+#        $Fallback
+#    );
+EOF
+
+print @InitFileCode;
+
+print Q<<"EOF" if defined $XsubAliases or defined $Interfaces ;
+#    }
+EOF
+
+if (@BootCode)
+{
+    print "\n    /* Initialisation Section */\n\n" ;
+    @line = @BootCode;
+    print_section();
+    print "\n    /* End of Initialisation Section */\n\n" ;
+}
+
+print Q<<"EOF";;
+#    XSRETURN_YES;
+#]]
+#
+EOF
+
+warn("Please specify prototyping behavior for $filename (see perlxs manual)\n")
+    unless $ProtoUsed ;
+&Exit;
+
+sub output_init {
+    local($type, $num, $var, $init, $name_printed) = @_;
+    local($arg) = "ST(" . ($num - 1) . ")";
+
+    if(  $init =~ /^=/  ) {
+        if ($name_printed) {
+	  eval qq/print " $init\\n"/;
+	} else {
+	  eval qq/print "\\t$var $init\\n"/;
+	}
+	warn $@   if  $@;
+    } else {
+	if(  $init =~ s/^\+//  &&  $num  ) {
+	    &generate_init($type, $num, $var, $name_printed);
+	} elsif ($name_printed) {
+	    print ";\n";
+	    $init =~ s/^;//;
+	} else {
+	    eval qq/print "\\t$var;\\n"/;
+	    warn $@   if  $@;
+	    $init =~ s/^;//;
+	}
+	$deferred .= eval qq/"\\n\\t$init\\n"/;
+	warn $@   if  $@;
+    }
+}
+
+sub Warn
+{
+    # work out the line number
+    my $line_no = $line_no[@line_no - @line -1] ;
+
+    print STDERR "@_ in $filename, line $line_no\n" ;
+}
+
+sub blurt
+{
+    Warn @_ ;
+    $errors ++
+}
+
+sub death
+{
+    Warn @_ ;
+    exit 1 ;
+}
+
+sub generate_init {
+    local($type, $num, $var) = @_;
+    local($arg) = "ST(" . ($num - 1) . ")";
+    local($argoff) = $num - 1;
+    local($ntype);
+    local($tk);
+
+    $type = TidyType($type) ;
+    blurt("Error: '$type' not in typemap"), return
+	unless defined($type_kind{$type});
+
+    ($ntype = $type) =~ s/\s*\*/Ptr/g;
+    ($subtype = $ntype) =~ s/(?:Array)?(?:Ptr)?$//;
+    $tk = $type_kind{$type};
+    $tk =~ s/OBJ$/REF/ if $func_name =~ /DESTROY$/;
+    if ($tk eq 'T_PV' and exists $lengthof{$var}) {
+      print "\t$var" unless $name_printed;
+      print " = ($type)SvPV($arg, STRLEN_length_of_$var);\n";
+      die "default value not supported with length(NAME) supplied"
+	if defined $defaults{$var};
+      return;
+    }
+    $type =~ tr/:/_/ unless $hiertype;
+    blurt("Error: No INPUT definition for type '$type', typekind '$type_kind{$type}' found"), return
+        unless defined $input_expr{$tk} ;
+    $expr = $input_expr{$tk};
+    if ($expr =~ /DO_ARRAY_ELEM/) {
+        blurt("Error: '$subtype' not in typemap"), return
+	    unless defined($type_kind{$subtype});
+        blurt("Error: No INPUT definition for type '$subtype', typekind '$type_kind{$subtype}' found"), return
+            unless defined $input_expr{$type_kind{$subtype}} ;
+	$subexpr = $input_expr{$type_kind{$subtype}};
+        $subexpr =~ s/\$type/\$subtype/g;
+	$subexpr =~ s/ntype/subtype/g;
+	$subexpr =~ s/\$arg/ST(ix_$var)/g;
+	$subexpr =~ s/\n\t/\n\t\t/g;
+	$subexpr =~ s/is not of (.*\")/[arg %d] is not of $1, ix_$var + 1/g;
+	$subexpr =~ s/\$var/${var}[ix_$var - $argoff]/;
+	$expr =~ s/DO_ARRAY_ELEM/$subexpr/;
+    }
+    if ($expr =~ m#/\*.*scope.*\*/#i) { # "scope" in C comments
+    	$ScopeThisXSUB = 1;
+    }
+    if (defined($defaults{$var})) {
+	    $expr =~ s/(\t+)/$1    /g;
+	    $expr =~ s/        /\t/g;
+	    if ($name_printed) {
+	      print ";\n";
+	    } else {
+	      eval qq/print "\\t$var;\\n"/;
+	      warn $@   if  $@;
+	    }
+	    if ($defaults{$var} eq 'NO_INIT') {
+		$deferred .= eval qq/"\\n\\tif (items >= $num) {\\n$expr;\\n\\t}\\n"/;
+	    } else {
+		$deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t    $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
+	    }
+	    warn $@   if  $@;
+    } elsif ($ScopeThisXSUB or $expr !~ /^\s*\$var =/) {
+	    if ($name_printed) {
+	      print ";\n";
+	    } else {
+	      eval qq/print "\\t$var;\\n"/;
+	      warn $@   if  $@;
+	    }
+	    $deferred .= eval qq/"\\n$expr;\\n"/;
+	    warn $@   if  $@;
+    } else {
+	    die "panic: do not know how to handle this branch for function pointers"
+	      if $name_printed;
+	    eval qq/print "$expr;\\n"/;
+	    warn $@   if  $@;
+    }
+}
+
+sub generate_output {
+    local($type, $num, $var, $do_setmagic, $do_push) = @_;
+    local($arg) = "ST(" . ($num - ($num != 0)) . ")";
+    local($argoff) = $num - 1;
+    local($ntype);
+
+    $type = TidyType($type) ;
+    if ($type =~ /^array\(([^,]*),(.*)\)/) {
+            print "\t$arg = sv_newmortal();\n";
+	    print "\tsv_setpvn($arg, (char *)$var, $2 * sizeof($1));\n";
+	    print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
+    } else {
+	    blurt("Error: '$type' not in typemap"), return
+		unless defined($type_kind{$type});
+            blurt("Error: No OUTPUT definition for type '$type', typekind '$type_kind{$type}' found"), return
+                unless defined $output_expr{$type_kind{$type}} ;
+	    ($ntype = $type) =~ s/\s*\*/Ptr/g;
+	    $ntype =~ s/\(\)//g;
+	    ($subtype = $ntype) =~ s/(?:Array)?(?:Ptr)?$//;
+	    $expr = $output_expr{$type_kind{$type}};
+	    if ($expr =~ /DO_ARRAY_ELEM/) {
+	        blurt("Error: '$subtype' not in typemap"), return
+		    unless defined($type_kind{$subtype});
+                blurt("Error: No OUTPUT definition for type '$subtype', typekind '$type_kind{$subtype}' found"), return
+                    unless defined $output_expr{$type_kind{$subtype}} ;
+		$subexpr = $output_expr{$type_kind{$subtype}};
+		$subexpr =~ s/ntype/subtype/g;
+		$subexpr =~ s/\$arg/ST(ix_$var)/g;
+		$subexpr =~ s/\$var/${var}[ix_$var]/g;
+		$subexpr =~ s/\n\t/\n\t\t/g;
+		$expr =~ s/DO_ARRAY_ELEM\n/$subexpr/;
+		eval "print qq\a$expr\a";
+		warn $@   if  $@;
+		print "\t\tSvSETMAGIC(ST(ix_$var));\n" if $do_setmagic;
+	    }
+	    elsif ($var eq 'RETVAL') {
+		if ($expr =~ /^\t\$arg = new/) {
+		    # We expect that $arg has refcnt 1, so we need to
+		    # mortalize it.
+		    eval "print qq\a$expr\a";
+		    warn $@   if  $@;
+		    print "\tsv_2mortal(ST($num));\n";
+		    print "\tSvSETMAGIC(ST($num));\n" if $do_setmagic;
+		}
+		elsif ($expr =~ /^\s*\$arg\s*=/) {
+		    # We expect that $arg has refcnt >=1, so we need
+		    # to mortalize it!
+		    eval "print qq\a$expr\a";
+		    warn $@   if  $@;
+		    print "\tsv_2mortal(ST(0));\n";
+		    print "\tSvSETMAGIC(ST(0));\n" if $do_setmagic;
+		}
+		else {
+		    # Just hope that the entry would safely write it
+		    # over an already mortalized value. By
+		    # coincidence, something like $arg = &sv_undef
+		    # works too.
+		    print "\tST(0) = sv_newmortal();\n";
+		    eval "print qq\a$expr\a";
+		    warn $@   if  $@;
+		    # new mortals don't have set magic
+		}
+	    }
+	    elsif ($do_push) {
+	        print "\tPUSHs(sv_newmortal());\n";
+		$arg = "ST($num)";
+		eval "print qq\a$expr\a";
+		warn $@   if  $@;
+		print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
+	    }
+	    elsif ($arg =~ /^ST\(\d+\)$/) {
+		eval "print qq\a$expr\a";
+		warn $@   if  $@;
+		print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
+	    }
+    }
+}
+
+sub map_type {
+    my($type, $varname) = @_;
+
+    # C++ has :: in types too so skip this
+    $type =~ tr/:/_/ unless $hiertype;
+    $type =~ s/^array\(([^,]*),(.*)\).*/$1 */s;
+    if ($varname) {
+      if ($varname && $type =~ / \( \s* \* (?= \s* \) ) /xg) {
+	(substr $type, pos $type, 0) = " $varname ";
+      } else {
+	$type .= "\t$varname";
+      }
+    }
+    $type;
+}
+
+
+sub Exit {
+# If this is VMS, the exit status has meaning to the shell, so we
+# use a predictable value (SS$_Normal or SS$_Abort) rather than an
+# arbitrary number.
+#    exit ($Is_VMS ? ($errors ? 44 : 1) : $errors) ;
+    exit ($errors ? 1 : 0);
+}
Index: /for-distributions/trunk/bin/windows/perl/lib/Fatal.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Fatal.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Fatal.pm	(revision 14489)
@@ -0,0 +1,186 @@
+package Fatal;
+
+use 5.006_001;
+use Carp;
+use strict;
+our($AUTOLOAD, $Debug, $VERSION);
+
+$VERSION = 1.03;
+
+$Debug = 0 unless defined $Debug;
+
+sub import {
+    my $self = shift(@_);
+    my($sym, $pkg);
+    my $void = 0;
+    $pkg = (caller)[0];
+    foreach $sym (@_) {
+	if ($sym eq ":void") {
+	    $void = 1;
+	}
+	else {
+	    &_make_fatal($sym, $pkg, $void);
+	}
+    }
+};
+
+sub AUTOLOAD {
+    my $cmd = $AUTOLOAD;
+    $cmd =~ s/.*:://;
+    &_make_fatal($cmd, (caller)[0]);
+    goto &$AUTOLOAD;
+}
+
+sub fill_protos {
+  my $proto = shift;
+  my ($n, $isref, @out, @out1, $seen_semi) = -1;
+  while ($proto =~ /\S/) {
+    $n++;
+    push(@out1,[$n,@out]) if $seen_semi;
+    push(@out, $1 . "{\$_[$n]}"), next if $proto =~ s/^\s*\\([\@%\$\&])//;
+    push(@out, "\$_[$n]"), next if $proto =~ s/^\s*([*\$&])//;
+    push(@out, "\@_[$n..\$#_]"), last if $proto =~ s/^\s*(;\s*)?\@//;
+    $seen_semi = 1, $n--, next if $proto =~ s/^\s*;//; # XXXX ????
+    die "Unknown prototype letters: \"$proto\"";
+  }
+  push(@out1,[$n+1,@out]);
+  @out1;
+}
+
+sub write_invocation {
+  my ($core, $call, $name, $void, @argvs) = @_;
+  if (@argvs == 1) {		# No optional arguments
+    my @argv = @{$argvs[0]};
+    shift @argv;
+    return "\t" . one_invocation($core, $call, $name, $void, @argv) . ";\n";
+  } else {
+    my $else = "\t";
+    my (@out, @argv, $n);
+    while (@argvs) {
+      @argv = @{shift @argvs};
+      $n = shift @argv;
+      push @out, "$ {else}if (\@_ == $n) {\n";
+      $else = "\t} els";
+      push @out, 
+          "\t\treturn " . one_invocation($core, $call, $name, $void, @argv) . ";\n";
+    }
+    push @out, <<EOC;
+	}
+	die "$name(\@_): Do not expect to get ", scalar \@_, " arguments";
+EOC
+    return join '', @out;
+  }
+}
+
+sub one_invocation {
+  my ($core, $call, $name, $void, @argv) = @_;
+  local $" = ', ';
+  if ($void) { 
+    return qq/(defined wantarray)?$call(@argv):
+              $call(@argv) || croak "Can't $name(\@_)/ . 
+           ($core ? ': $!' : ', \$! is \"$!\"') . '"'
+  } else {
+    return qq{$call(@argv) || croak "Can't $name(\@_)} . 
+           ($core ? ': $!' : ', \$! is \"$!\"') . '"';
+  }
+}
+
+sub _make_fatal {
+    my($sub, $pkg, $void) = @_;
+    my($name, $code, $sref, $real_proto, $proto, $core, $call);
+    my $ini = $sub;
+
+    $sub = "${pkg}::$sub" unless $sub =~ /::/;
+    $name = $sub;
+    $name =~ s/.*::// or $name =~ s/^&//;
+    print "# _make_fatal: sub=$sub pkg=$pkg name=$name void=$void\n" if $Debug;
+    croak "Bad subroutine name for Fatal: $name" unless $name =~ /^\w+$/;
+    if (defined(&$sub)) {	# user subroutine
+	$sref = \&$sub;
+	$proto = prototype $sref;
+	$call = '&$sref';
+    } elsif ($sub eq $ini) {	# Stray user subroutine
+	die "$sub is not a Perl subroutine" 
+    } else {			# CORE subroutine
+        $proto = eval { prototype "CORE::$name" };
+	die "$name is neither a builtin, nor a Perl subroutine" 
+	  if $@;
+	die "Cannot make a non-overridable builtin fatal"
+	  if not defined $proto;
+	$core = 1;
+	$call = "CORE::$name";
+    }
+    if (defined $proto) {
+      $real_proto = " ($proto)";
+    } else {
+      $real_proto = '';
+      $proto = '@';
+    }
+    $code = <<EOS;
+sub$real_proto {
+	local(\$", \$!) = (', ', 0);
+EOS
+    my @protos = fill_protos($proto);
+    $code .= write_invocation($core, $call, $name, $void, @protos);
+    $code .= "}\n";
+    print $code if $Debug;
+    {
+      no strict 'refs'; # to avoid: Can't use string (...) as a symbol ref ...
+      $code = eval("package $pkg; use Carp; $code");
+      die if $@;
+      no warnings;   # to avoid: Subroutine foo redefined ...
+      *{$sub} = $code;
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Fatal - replace functions with equivalents which succeed or die
+
+=head1 SYNOPSIS
+
+    use Fatal qw(open close);
+
+    sub juggle { . . . }
+    import Fatal 'juggle';
+
+=head1 DESCRIPTION
+
+C<Fatal> provides a way to conveniently replace functions which normally
+return a false value when they fail with equivalents which raise exceptions
+if they are not successful.  This lets you use these functions without
+having to test their return values explicitly on each call.  Exceptions
+can be caught using C<eval{}>.  See L<perlfunc> and L<perlvar> for details.
+
+The do-or-die equivalents are set up simply by calling Fatal's
+C<import> routine, passing it the names of the functions to be
+replaced.  You may wrap both user-defined functions and overridable
+CORE operators (except C<exec>, C<system> which cannot be expressed
+via prototypes) in this way.
+
+If the symbol C<:void> appears in the import list, then functions
+named later in that import list raise an exception only when
+these are called in void context--that is, when their return
+values are ignored.  For example
+
+	use Fatal qw/:void open close/;
+
+	# properly checked, so no exception raised on error
+	if(open(FH, "< /bogotic") {
+		warn "bogo file, dude: $!";
+	}
+
+	# not checked, so error raises an exception
+	close FH;
+
+=head1 AUTHOR
+
+Lionel.Cons@cern.ch
+
+prototype updates by Ilya Zakharevich ilya@math.ohio-state.edu
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Fcntl.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Fcntl.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Fcntl.pm	(revision 14489)
@@ -0,0 +1,236 @@
+package Fcntl;
+
+=head1 NAME
+
+Fcntl - load the C Fcntl.h defines
+
+=head1 SYNOPSIS
+
+    use Fcntl;
+    use Fcntl qw(:DEFAULT :flock);
+
+=head1 DESCRIPTION
+
+This module is just a translation of the C F<fcntl.h> file.
+Unlike the old mechanism of requiring a translated F<fcntl.ph>
+file, this uses the B<h2xs> program (see the Perl source distribution)
+and your native C compiler.  This means that it has a 
+far more likely chance of getting the numbers right.
+
+=head1 NOTE
+
+Only C<#define> symbols get translated; you must still correctly
+pack up your own arguments to pass as args for locking functions, etc.
+
+=head1 EXPORTED SYMBOLS
+
+By default your system's F_* and O_* constants (eg, F_DUPFD and
+O_CREAT) and the FD_CLOEXEC constant are exported into your namespace.
+
+You can request that the flock() constants (LOCK_SH, LOCK_EX, LOCK_NB
+and LOCK_UN) be provided by using the tag C<:flock>.  See L<Exporter>.
+
+You can request that the old constants (FAPPEND, FASYNC, FCREAT,
+FDEFER, FEXCL, FNDELAY, FNONBLOCK, FSYNC, FTRUNC) be provided for
+compatibility reasons by using the tag C<:Fcompat>.  For new
+applications the newer versions of these constants are suggested
+(O_APPEND, O_ASYNC, O_CREAT, O_DEFER, O_EXCL, O_NDELAY, O_NONBLOCK,
+O_SYNC, O_TRUNC).
+
+For ease of use also the SEEK_* constants (for seek() and sysseek(),
+e.g. SEEK_END) and the S_I* constants (for chmod() and stat()) are
+available for import.  They can be imported either separately or using
+the tags C<:seek> and C<:mode>.
+
+Please refer to your native fcntl(2), open(2), fseek(3), lseek(2)
+(equal to Perl's seek() and sysseek(), respectively), and chmod(2)
+documentation to see what constants are implemented in your system.
+
+See L<perlopentut> to learn about the uses of the O_* constants
+with sysopen().
+
+See L<perlfunc/seek> and L<perlfunc/sysseek> about the SEEK_* constants.
+
+See L<perlfunc/stat> about the S_I* constants.
+
+=cut
+
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $AUTOLOAD);
+
+require Exporter;
+use XSLoader ();
+@ISA = qw(Exporter);
+$VERSION = "1.05";
+# Items to export into callers namespace by default
+# (move infrequently used names to @EXPORT_OK below)
+@EXPORT =
+  qw(
+	FD_CLOEXEC
+	F_ALLOCSP
+	F_ALLOCSP64
+	F_COMPAT
+	F_DUP2FD
+	F_DUPFD
+	F_EXLCK
+	F_FREESP
+	F_FREESP64
+	F_FSYNC
+	F_FSYNC64
+	F_GETFD
+	F_GETFL
+	F_GETLK
+	F_GETLK64
+	F_GETOWN
+	F_NODNY
+	F_POSIX
+	F_RDACC
+	F_RDDNY
+	F_RDLCK
+	F_RWACC
+	F_RWDNY
+	F_SETFD
+	F_SETFL
+	F_SETLK
+	F_SETLK64
+	F_SETLKW
+	F_SETLKW64
+	F_SETOWN
+	F_SHARE
+	F_SHLCK
+	F_UNLCK
+	F_UNSHARE
+	F_WRACC
+	F_WRDNY
+	F_WRLCK
+	O_ACCMODE
+	O_ALIAS
+	O_APPEND
+	O_ASYNC
+	O_BINARY
+	O_CREAT
+	O_DEFER
+	O_DIRECT
+	O_DIRECTORY
+	O_DSYNC
+	O_EXCL
+	O_EXLOCK
+	O_LARGEFILE
+	O_NDELAY
+	O_NOCTTY
+	O_NOFOLLOW
+	O_NOINHERIT
+	O_NONBLOCK
+	O_RANDOM
+	O_RAW
+	O_RDONLY
+	O_RDWR
+	O_RSRC
+	O_RSYNC
+	O_SEQUENTIAL
+	O_SHLOCK
+	O_SYNC
+	O_TEMPORARY
+	O_TEXT
+	O_TRUNC
+	O_WRONLY
+     );
+
+# Other items we are prepared to export if requested
+@EXPORT_OK = qw(
+	DN_ACCESS
+	DN_ATTRIB
+	DN_CREATE
+	DN_DELETE
+	DN_MODIFY
+	DN_MULTISHOT
+	DN_RENAME
+	FAPPEND
+	FASYNC
+	FCREAT
+	FDEFER
+	FDSYNC
+	FEXCL
+	FLARGEFILE
+	FNDELAY
+	FNONBLOCK
+	FRSYNC
+	FSYNC
+	FTRUNC
+	F_GETLEASE
+	F_GETSIG
+	F_NOTIFY
+	F_SETLEASE
+	F_SETSIG
+	LOCK_EX
+	LOCK_MAND
+	LOCK_NB
+	LOCK_READ
+	LOCK_RW
+	LOCK_SH
+	LOCK_UN
+	LOCK_WRITE
+	O_IGNORE_CTTY
+	O_NOATIME
+	O_NOLINK
+	O_NOTRANS
+	SEEK_CUR
+	SEEK_END
+	SEEK_SET
+	S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
+	S_IREAD S_IWRITE S_IEXEC
+	S_IRGRP S_IWGRP S_IXGRP S_IRWXG
+	S_IROTH S_IWOTH S_IXOTH S_IRWXO
+	S_IRUSR S_IWUSR S_IXUSR S_IRWXU
+	S_ISUID S_ISGID S_ISVTX S_ISTXT
+	_S_IFMT S_IFREG S_IFDIR S_IFLNK
+	&S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK &S_ISBLK &S_ISCHR &S_ISFIFO
+	&S_ISWHT &S_ISENFMT &S_IFMT &S_IMODE
+);
+# Named groups of exports
+%EXPORT_TAGS = (
+    'flock'   => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)],
+    'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE
+		     FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)],
+    'seek'    => [qw(SEEK_SET SEEK_CUR SEEK_END)],
+    'mode'    => [qw(S_ISUID S_ISGID S_ISVTX S_ISTXT
+		     _S_IFMT S_IFREG S_IFDIR S_IFLNK
+		     S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
+		     S_IRUSR S_IWUSR S_IXUSR S_IRWXU
+		     S_IRGRP S_IWGRP S_IXGRP S_IRWXG
+		     S_IROTH S_IWOTH S_IXOTH S_IRWXO
+		     S_IREAD S_IWRITE S_IEXEC
+		     S_ISREG S_ISDIR S_ISLNK S_ISSOCK
+		     S_ISBLK S_ISCHR S_ISFIFO
+		     S_ISWHT S_ISENFMT		
+		     S_IFMT S_IMODE
+                  )],
+);
+
+sub S_IFMT  { @_ ? ( $_[0] & _S_IFMT() ) : _S_IFMT()  }
+sub S_IMODE { $_[0] & 07777 }
+
+sub S_ISREG    { ( $_[0] & _S_IFMT() ) == S_IFREG()   }
+sub S_ISDIR    { ( $_[0] & _S_IFMT() ) == S_IFDIR()   }
+sub S_ISLNK    { ( $_[0] & _S_IFMT() ) == S_IFLNK()   }
+sub S_ISSOCK   { ( $_[0] & _S_IFMT() ) == S_IFSOCK()  }
+sub S_ISBLK    { ( $_[0] & _S_IFMT() ) == S_IFBLK()   }
+sub S_ISCHR    { ( $_[0] & _S_IFMT() ) == S_IFCHR()   }
+sub S_ISFIFO   { ( $_[0] & _S_IFMT() ) == S_IFIFO()   }
+sub S_ISWHT    { ( $_[0] & _S_IFMT() ) == S_IFWHT()   }
+sub S_ISENFMT  { ( $_[0] & _S_IFMT() ) == S_IFENFMT() }
+
+sub AUTOLOAD {
+    (my $constname = $AUTOLOAD) =~ s/.*:://;
+    die "&Fcntl::constant not defined" if $constname eq 'constant';
+    my ($error, $val) = constant($constname);
+    if ($error) {
+        my (undef,$file,$line) = caller;
+        die "$error at $file line $line.\n";
+    }
+    *$AUTOLOAD = sub { $val };
+    goto &$AUTOLOAD;
+}
+
+XSLoader::load 'Fcntl', $VERSION;
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Basename.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Basename.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Basename.pm	(revision 14489)
@@ -0,0 +1,398 @@
+=head1 NAME
+
+File::Basename - Parse file paths into directory, filename and suffix.
+
+=head1 SYNOPSIS
+
+    use File::Basename;
+
+    ($name,$path,$suffix) = fileparse($fullname,@suffixlist);
+    $name = fileparse($fullname,@suffixlist);
+
+    $basename = basename($fullname,@suffixlist);
+    $dirname  = dirname($fullname);
+
+
+=head1 DESCRIPTION
+
+These routines allow you to parse file paths into their directory, filename
+and suffix.
+
+B<NOTE>: C<dirname()> and C<basename()> emulate the behaviours, and
+quirks, of the shell and C functions of the same name.  See each
+function's documentation for details.  If your concern is just parsing
+paths it is safer to use L<File::Spec>'s C<splitpath()> and
+C<splitdir()> methods.
+
+It is guaranteed that
+
+    # Where $path_separator is / for Unix, \ for Windows, etc...
+    dirname($path) . $path_separator . basename($path);
+
+is equivalent to the original path for all systems but VMS.
+
+
+=cut
+
+
+package File::Basename;
+
+# A bit of juggling to insure that C<use re 'taint';> always works, since
+# File::Basename is used during the Perl build, when the re extension may
+# not be available.
+BEGIN {
+  unless (eval { require re; })
+    { eval ' sub re::import { $^H |= 0x00100000; } ' } # HINT_RE_TAINT
+  import re 'taint';
+}
+
+
+use strict;
+use 5.006;
+use warnings;
+our(@ISA, @EXPORT, $VERSION, $Fileparse_fstype, $Fileparse_igncase);
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(fileparse fileparse_set_fstype basename dirname);
+$VERSION = "2.74";
+
+fileparse_set_fstype($^O);
+
+
+=over 4
+
+=item C<fileparse>
+
+    my($filename, $directories, $suffix) = fileparse($path);
+    my($filename, $directories, $suffix) = fileparse($path, @suffixes);
+    my $filename                         = fileparse($path, @suffixes);
+
+The C<fileparse()> routine divides a file path into its $directories, $filename
+and (optionally) the filename $suffix.
+
+$directories contains everything up to and including the last
+directory separator in the $path including the volume (if applicable).
+The remainder of the $path is the $filename.
+
+     # On Unix returns ("baz", "/foo/bar/", "")
+     fileparse("/foo/bar/baz");
+
+     # On Windows returns ("baz", "C:\foo\bar\", "")
+     fileparse("C:\foo\bar\baz");
+
+     # On Unix returns ("", "/foo/bar/baz/", "")
+     fileparse("/foo/bar/baz/");
+
+If @suffixes are given each element is a pattern (either a string or a
+C<qr//>) matched against the end of the $filename.  The matching
+portion is removed and becomes the $suffix.
+
+     # On Unix returns ("baz", "/foo/bar", ".txt")
+     fileparse("/foo/bar/baz", qr/\.[^.]*/);
+
+If type is non-Unix (see C<fileparse_set_fstype()>) then the pattern
+matching for suffix removal is performed case-insensitively, since
+those systems are not case-sensitive when opening existing files.
+
+You are guaranteed that C<$directories . $filename . $suffix> will
+denote the same location as the original $path.
+
+=cut
+
+
+sub fileparse {
+  my($fullname,@suffices) = @_;
+
+  unless (defined $fullname) {
+      require Carp;
+      Carp::croak("fileparse(): need a valid pathname");
+  }
+
+  my $orig_type = '';
+  my($type,$igncase) = ($Fileparse_fstype, $Fileparse_igncase);
+
+  my($taint) = substr($fullname,0,0);  # Is $fullname tainted?
+
+  if ($type eq "VMS" and $fullname =~ m{/} ) {
+    # We're doing Unix emulation
+    $orig_type = $type;
+    $type = 'Unix';
+  }
+
+  my($dirpath, $basename);
+
+  if (grep { $type eq $_ } qw(MSDOS DOS MSWin32 Epoc)) {
+    ($dirpath,$basename) = ($fullname =~ /^((?:.*[:\\\/])?)(.*)/s);
+    $dirpath .= '.\\' unless $dirpath =~ /[\\\/]\z/;
+  }
+  elsif ($type eq "OS2") {
+    ($dirpath,$basename) = ($fullname =~ m#^((?:.*[:\\/])?)(.*)#s);
+    $dirpath = './' unless $dirpath;	# Can't be 0
+    $dirpath .= '/' unless $dirpath =~ m#[\\/]\z#;
+  }
+  elsif ($type eq "MacOS") {
+    ($dirpath,$basename) = ($fullname =~ /^(.*:)?(.*)/s);
+    $dirpath = ':' unless $dirpath;
+  }
+  elsif ($type eq "AmigaOS") {
+    ($dirpath,$basename) = ($fullname =~ /(.*[:\/])?(.*)/s);
+    $dirpath = './' unless $dirpath;
+  }
+  elsif ($type eq 'VMS' ) {
+    ($dirpath,$basename) = ($fullname =~ /^(.*[:>\]])?(.*)/s);
+    $dirpath ||= '';  # should always be defined
+  }
+  else { # Default to Unix semantics.
+    ($dirpath,$basename) = ($fullname =~ m#^(.*/)?(.*)#s);
+    if ($orig_type eq 'VMS' and $fullname =~ m:^(/[^/]+/000000(/|$))(.*):) {
+      # dev:[000000] is top of VMS tree, similar to Unix '/'
+      # so strip it off and treat the rest as "normal"
+      my $devspec  = $1;
+      my $remainder = $3;
+      ($dirpath,$basename) = ($remainder =~ m#^(.*/)?(.*)#s);
+      $dirpath ||= '';  # should always be defined
+      $dirpath = $devspec.$dirpath;
+    }
+    $dirpath = './' unless $dirpath;
+  }
+      
+
+  my $tail   = '';
+  my $suffix = '';
+  if (@suffices) {
+    foreach $suffix (@suffices) {
+      my $pat = ($igncase ? '(?i)' : '') . "($suffix)\$";
+      if ($basename =~ s/$pat//s) {
+        $taint .= substr($suffix,0,0);
+        $tail = $1 . $tail;
+      }
+    }
+  }
+
+  # Ensure taint is propgated from the path to its pieces.
+  $tail .= $taint;
+  wantarray ? ($basename .= $taint, $dirpath .= $taint, $tail)
+            : ($basename .= $taint);
+}
+
+
+
+=item C<basename>
+
+    my $filename = basename($path);
+    my $filename = basename($path, @suffixes);
+
+This function is provided for compatibility with the Unix shell command 
+C<basename(1)>.  It does B<NOT> always return the file name portion of a
+path as you might expect.  To be safe, if you want the file name portion of
+a path use C<fileparse()>.
+
+C<basename()> returns the last level of a filepath even if the last
+level is clearly directory.  In effect, it is acting like C<pop()> for
+paths.  This differs from C<fileparse()>'s behaviour.
+
+    # Both return "bar"
+    basename("/foo/bar");
+    basename("/foo/bar/");
+
+@suffixes work as in C<fileparse()> except all regex metacharacters are
+quoted.
+
+    # These two function calls are equivalent.
+    my $filename = basename("/foo/bar/baz.txt",  ".txt");
+    my $filename = fileparse("/foo/bar/baz.txt", qr/\Q.txt\E/);
+
+Also note that in order to be compatible with the shell command,
+C<basename()> does not strip off a suffix if it is identical to the
+remaining characters in the filename.
+
+=cut
+
+
+sub basename {
+  my($path) = shift;
+
+  # From BSD basename(1)
+  # The basename utility deletes any prefix ending with the last slash `/'
+  # character present in string (after first stripping trailing slashes)
+  _strip_trailing_sep($path);
+
+  my($basename, $dirname, $suffix) = fileparse( $path, map("\Q$_\E",@_) );
+
+  # From BSD basename(1)
+  # The suffix is not stripped if it is identical to the remaining 
+  # characters in string.
+  if( length $suffix and !length $basename ) {
+      $basename = $suffix;
+  }
+  
+  # Ensure that basename '/' == '/'
+  if( !length $basename ) {
+      $basename = $dirname;
+  }
+
+  return $basename;
+}
+
+
+
+=item C<dirname>
+
+This function is provided for compatibility with the Unix shell
+command C<dirname(1)> and has inherited some of its quirks.  In spite of
+its name it does B<NOT> always return the directory name as you might
+expect.  To be safe, if you want the directory name of a path use
+C<fileparse()>.
+
+Only on VMS (where there is no ambiguity between the file and directory
+portions of a path) and AmigaOS (possibly due to an implementation quirk in
+this module) does C<dirname()> work like C<fileparse($path)>, returning just the
+$directories.
+
+    # On VMS and AmigaOS
+    my $directories = dirname($path);
+
+When using Unix or MSDOS syntax this emulates the C<dirname(1)> shell function
+which is subtly different from how C<fileparse()> works.  It returns all but
+the last level of a file path even if the last level is clearly a directory.
+In effect, it is not returning the directory portion but simply the path one
+level up acting like C<chop()> for file paths.
+
+Also unlike C<fileparse()>, C<dirname()> does not include a trailing slash on
+its returned path.
+
+    # returns /foo/bar.  fileparse() would return /foo/bar/
+    dirname("/foo/bar/baz");
+
+    # also returns /foo/bar despite the fact that baz is clearly a 
+    # directory.  fileparse() would return /foo/bar/baz/
+    dirname("/foo/bar/baz/");
+
+    # returns '.'.  fileparse() would return 'foo/'
+    dirname("foo/");
+
+Under VMS, if there is no directory information in the $path, then the
+current default device and directory is used.
+
+=cut
+
+
+sub dirname {
+    my $path = shift;
+
+    my($type) = $Fileparse_fstype;
+
+    if( $type eq 'VMS' and $path =~ m{/} ) {
+        # Parse as Unix
+        local($File::Basename::Fileparse_fstype) = '';
+        return dirname($path);
+    }
+
+    my($basename, $dirname) = fileparse($path);
+
+    if ($type eq 'VMS') { 
+        $dirname ||= $ENV{DEFAULT};
+    }
+    elsif ($type eq 'MacOS') {
+	if( !length($basename) && $dirname !~ /^[^:]+:\z/) {
+            _strip_trailing_sep($dirname);
+	    ($basename,$dirname) = fileparse $dirname;
+	}
+	$dirname .= ":" unless $dirname =~ /:\z/;
+    }
+    elsif (grep { $type eq $_ } qw(MSDOS DOS MSWin32 OS2)) { 
+        _strip_trailing_sep($dirname);
+        unless( length($basename) ) {
+	    ($basename,$dirname) = fileparse $dirname;
+	    _strip_trailing_sep($dirname);
+	}
+    }
+    elsif ($type eq 'AmigaOS') {
+        if ( $dirname =~ /:\z/) { return $dirname }
+        chop $dirname;
+        $dirname =~ s#[^:/]+\z## unless length($basename);
+    }
+    else {
+        _strip_trailing_sep($dirname);
+        unless( length($basename) ) {
+	    ($basename,$dirname) = fileparse $dirname;
+	    _strip_trailing_sep($dirname);
+	}
+    }
+
+    $dirname;
+}
+
+
+# Strip the trailing path separator.
+sub _strip_trailing_sep  {
+    my $type = $Fileparse_fstype;
+
+    if ($type eq 'MacOS') {
+        $_[0] =~ s/([^:]):\z/$1/s;
+    }
+    elsif (grep { $type eq $_ } qw(MSDOS DOS MSWin32 OS2)) { 
+        $_[0] =~ s/([^:])[\\\/]*\z/$1/;
+    }
+    else {
+        $_[0] =~ s{(.)/*\z}{$1}s;
+    }
+}
+
+
+=item C<fileparse_set_fstype>
+
+  my $type = fileparse_set_fstype();
+  my $previous_type = fileparse_set_fstype($type);
+
+Normally File::Basename will assume a file path type native to your current
+operating system (ie. /foo/bar style on Unix, \foo\bar on Windows, etc...).
+With this function you can override that assumption.
+
+Valid $types are "MacOS", "VMS", "AmigaOS", "OS2", "RISCOS",
+"MSWin32", "DOS" (also "MSDOS" for backwards bug compatibility),
+"Epoc" and "Unix" (all case-insensitive).  If an unrecognized $type is
+given "Unix" will be assumed.
+
+If you've selected VMS syntax, and the file specification you pass to
+one of these routines contains a "/", they assume you are using Unix
+emulation and apply the Unix syntax rules instead, for that function
+call only.
+
+=back
+
+=cut
+
+
+BEGIN {
+
+my @Ignore_Case = qw(MacOS VMS AmigaOS OS2 RISCOS MSWin32 MSDOS DOS Epoc);
+my @Types = (@Ignore_Case, qw(Unix));
+
+sub fileparse_set_fstype {
+    my $old = $Fileparse_fstype;
+
+    if (@_) {
+        my $new_type = shift;
+
+        $Fileparse_fstype = 'Unix';  # default
+        foreach my $type (@Types) {
+            $Fileparse_fstype = $type if $new_type =~ /^$type/i;
+        }
+
+        $Fileparse_igncase = 
+          (grep $Fileparse_fstype eq $_, @Ignore_Case) ? 1 : 0;
+    }
+
+    return $old;
+}
+
+}
+
+
+1;
+
+
+=head1 SEE ALSO
+
+L<dirname(1)>, L<basename(1)>, L<File::Spec>
Index: /for-distributions/trunk/bin/windows/perl/lib/File/CheckTree.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/CheckTree.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/CheckTree.pm	(revision 14489)
@@ -0,0 +1,229 @@
+package File::CheckTree;
+
+use 5.006;
+use Cwd;
+use Exporter;
+use File::Spec;
+use warnings;
+use strict;
+
+our $VERSION = '4.3';
+our @ISA     = qw(Exporter);
+our @EXPORT  = qw(validate);
+
+=head1 NAME
+
+validate - run many filetest checks on a tree
+
+=head1 SYNOPSIS
+
+    use File::CheckTree;
+
+    $num_warnings = validate( q{
+        /vmunix                 -e || die
+        /boot                   -e || die
+        /bin                    cd
+            csh                 -ex
+            csh                 !-ug
+            sh                  -ex
+            sh                  !-ug
+        /usr                    -d || warn "What happened to $file?\n"
+    });
+
+=head1 DESCRIPTION
+
+The validate() routine takes a single multiline string consisting of
+directives, each containing a filename plus a file test to try on it.
+(The file test may also be a "cd", causing subsequent relative filenames
+to be interpreted relative to that directory.)  After the file test
+you may put C<|| die> to make it a fatal error if the file test fails.
+The default is C<|| warn>.  The file test may optionally have a "!' prepended
+to test for the opposite condition.  If you do a cd and then list some
+relative filenames, you may want to indent them slightly for readability.
+If you supply your own die() or warn() message, you can use $file to
+interpolate the filename.
+
+Filetests may be bunched:  "-rwx" tests for all of C<-r>, C<-w>, and C<-x>.
+Only the first failed test of the bunch will produce a warning.
+
+The routine returns the number of warnings issued.
+
+=head1 AUTHOR
+
+File::CheckTree was derived from lib/validate.pl which was
+written by Larry Wall.
+Revised by Paul Grassie <F<grassie@perl.com>> in 2002.
+
+=head1 HISTORY
+
+File::CheckTree used to not display fatal error messages.
+It used to count only those warnings produced by a generic C<|| warn>
+(and not those in which the user supplied the message).  In addition,
+the validate() routine would leave the user program in whatever
+directory was last entered through the use of "cd" directives.
+These bugs were fixed during the development of perl 5.8.
+The first fixed version of File::CheckTree was 4.2.
+
+=cut
+
+my $Warnings;
+
+sub validate {
+    my ($starting_dir, $file, $test, $cwd, $oldwarnings);
+
+    $starting_dir = cwd;
+
+    $cwd = "";
+    $Warnings = 0;
+
+    foreach my $check (split /\n/, $_[0]) {
+        my ($testlist, @testlist);
+
+        # skip blanks/comments
+        next if $check =~ /^\s*#/ || $check =~ /^\s*$/;
+
+        # Todo:
+        # should probably check for invalid directives and die
+        # but earlier versions of File::CheckTree did not do this either
+
+        # split a line like "/foo -r || die"
+        # so that $file is "/foo", $test is "-rwx || die"
+        ($file, $test) = split(' ', $check, 2);   # special whitespace split
+
+        # change a $test like "!-ug || die" to "!-Z || die",
+        # capturing the bundled tests (e.g. "ug") in $2
+        if ($test =~ s/ ^ (!?-) (\w{2,}) \b /$1Z/x) {
+            $testlist = $2;
+            # split bundled tests, e.g. "ug" to 'u', 'g'
+            @testlist = split(//, $testlist);
+        }
+        else {
+            # put in placeholder Z for stand-alone test
+            @testlist = ('Z');
+        }
+
+        # will compare these two later to stop on 1st warning w/in a bundle
+        $oldwarnings = $Warnings;
+
+        foreach my $one (@testlist) {
+            # examples of $test: "!-Z || die" or "-w || warn"
+            my $this = $test;
+
+            # expand relative $file to full pathname if preceded by cd directive
+            $file = File::Spec->catfile($cwd, $file) 
+                    if $cwd && !File::Spec->file_name_is_absolute($file);
+
+            # put filename in after the test operator
+            $this =~ s/(-\w\b)/$1 "\$file"/g;
+
+            # change the "-Z" representing a bundle with the $one test
+            $this =~ s/-Z/-$one/;
+
+            # if it's a "cd" directive...
+            if ($this =~ /^cd\b/) {
+                # add "|| die ..."
+                $this .= ' || die "cannot cd to $file\n"';
+                # expand "cd" directive with directory name
+                $this =~ s/\bcd\b/chdir(\$cwd = '$file')/;
+            }
+            else {
+                # add "|| warn" as a default disposition
+                $this .= ' || warn' unless $this =~ /\|\|/; 
+
+                # change a generic ".. || die" or ".. || warn"
+                # to call valmess instead of die/warn directly
+                # valmess will look up the error message from %Val_Message
+                $this =~ s/ ^ ( (\S+) \s+ \S+ ) \s* \|\| \s* (die|warn) \s* $
+                          /$1 || valmess('$3', '$2', \$file)/x;
+            }
+
+            {
+                # count warnings, either from valmess or '-r || warn "my msg"'
+                # also, call any pre-existing signal handler for __WARN__
+                my $orig_sigwarn = $SIG{__WARN__};
+                local $SIG{__WARN__} = sub {
+                    ++$Warnings;
+                    if ( $orig_sigwarn ) {
+                        $orig_sigwarn->(@_);
+                    }
+                    else {
+                        warn "@_";
+                    }
+                };
+
+                # do the test
+                eval $this;
+
+                # re-raise an exception caused by a "... || die" test 
+                if ($@) {
+                    # in case of any cd directives, return from whence we came
+                    if ($starting_dir ne cwd) {
+                        chdir($starting_dir) || die "$starting_dir: $!";
+                    }
+                    die $@ if $@;
+                }
+            }
+
+            # stop on 1st warning within a bundle of tests
+            last if $Warnings > $oldwarnings;
+        }
+    }
+
+    # in case of any cd directives, return from whence we came
+    if ($starting_dir ne cwd) {
+        chdir($starting_dir) || die "chdir $starting_dir: $!";
+    }
+
+    return $Warnings;
+}
+
+my %Val_Message = (
+    'r' => "is not readable by uid $>.",
+    'w' => "is not writable by uid $>.",
+    'x' => "is not executable by uid $>.",
+    'o' => "is not owned by uid $>.",
+    'R' => "is not readable by you.",
+    'W' => "is not writable by you.",
+    'X' => "is not executable by you.",
+    'O' => "is not owned by you.",
+    'e' => "does not exist.",
+    'z' => "does not have zero size.",
+    's' => "does not have non-zero size.",
+    'f' => "is not a plain file.",
+    'd' => "is not a directory.",
+    'l' => "is not a symbolic link.",
+    'p' => "is not a named pipe (FIFO).",
+    'S' => "is not a socket.",
+    'b' => "is not a block special file.",
+    'c' => "is not a character special file.",
+    'u' => "does not have the setuid bit set.",
+    'g' => "does not have the setgid bit set.",
+    'k' => "does not have the sticky bit set.",
+    'T' => "is not a text file.",
+    'B' => "is not a binary file."
+);
+
+sub valmess {
+    my ($disposition, $test, $file) = @_;
+    my $ferror;
+
+    if ($test =~ / ^ (!?) -(\w) \s* $ /x) {
+        my ($neg, $ftype) = ($1, $2);
+
+        $ferror = "$file $Val_Message{$ftype}";
+
+        if ($neg eq '!') {
+            $ferror =~ s/ is not / should not be / ||
+            $ferror =~ s/ does not / should not / ||
+            $ferror =~ s/ not / /;
+        }
+    }
+    else {
+        $ferror = "Can't do $test $file.\n";
+    }
+
+    die "$ferror\n" if $disposition eq 'die';
+    warn "$ferror\n";
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Compare.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Compare.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Compare.pm	(revision 14489)
@@ -0,0 +1,178 @@
+package File::Compare;
+
+use 5.006;
+use strict;
+use warnings;
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $Too_Big);
+
+require Exporter;
+use Carp;
+
+$VERSION = '1.1003';
+@ISA = qw(Exporter);
+@EXPORT = qw(compare);
+@EXPORT_OK = qw(cmp compare_text);
+
+$Too_Big = 1024 * 1024 * 2;
+
+sub compare {
+    croak("Usage: compare( file1, file2 [, buffersize]) ")
+      unless(@_ == 2 || @_ == 3);
+
+    my ($from,$to,$size) = @_;
+    my $text_mode = defined($size) && (ref($size) eq 'CODE' || $size < 0);
+
+    my ($fromsize,$closefrom,$closeto);
+    local (*FROM, *TO);
+
+    croak("from undefined") unless (defined $from);
+    croak("to undefined") unless (defined $to);
+
+    if (ref($from) && 
+        (UNIVERSAL::isa($from,'GLOB') || UNIVERSAL::isa($from,'IO::Handle'))) {
+	*FROM = *$from;
+    } elsif (ref(\$from) eq 'GLOB') {
+	*FROM = $from;
+    } else {
+	open(FROM,"<$from") or goto fail_open1;
+	unless ($text_mode) {
+	    binmode FROM;
+	    $fromsize = -s FROM;
+	}
+	$closefrom = 1;
+    }
+
+    if (ref($to) &&
+        (UNIVERSAL::isa($to,'GLOB') || UNIVERSAL::isa($to,'IO::Handle'))) {
+	*TO = *$to;
+    } elsif (ref(\$to) eq 'GLOB') {
+	*TO = $to;
+    } else {
+	open(TO,"<$to") or goto fail_open2;
+	binmode TO unless $text_mode;
+	$closeto = 1;
+    }
+
+    if (!$text_mode && $closefrom && $closeto) {
+	# If both are opened files we know they differ if their size differ
+	goto fail_inner if $fromsize != -s TO;
+    }
+
+    if ($text_mode) {
+	local $/ = "\n";
+	my ($fline,$tline);
+	while (defined($fline = <FROM>)) {
+	    goto fail_inner unless defined($tline = <TO>);
+	    if (ref $size) {
+		# $size contains ref to comparison function
+		goto fail_inner if &$size($fline, $tline);
+	    } else {
+		goto fail_inner if $fline ne $tline;
+	    }
+	}
+	goto fail_inner if defined($tline = <TO>);
+    }
+    else {
+	unless (defined($size) && $size > 0) {
+	    $size = $fromsize || -s TO || 0;
+	    $size = 1024 if $size < 512;
+	    $size = $Too_Big if $size > $Too_Big;
+	}
+
+	my ($fr,$tr,$fbuf,$tbuf);
+	$fbuf = $tbuf = '';
+	while(defined($fr = read(FROM,$fbuf,$size)) && $fr > 0) {
+	    unless (defined($tr = read(TO,$tbuf,$fr)) && $tbuf eq $fbuf) {
+		goto fail_inner;
+	    }
+	}
+	goto fail_inner if defined($tr = read(TO,$tbuf,$size)) && $tr > 0;
+    }
+
+    close(TO) || goto fail_open2 if $closeto;
+    close(FROM) || goto fail_open1 if $closefrom;
+
+    return 0;
+    
+  # All of these contortions try to preserve error messages...
+  fail_inner:
+    close(TO) || goto fail_open2 if $closeto;
+    close(FROM) || goto fail_open1 if $closefrom;
+
+    return 1;
+
+  fail_open2:
+    if ($closefrom) {
+	my $status = $!;
+	$! = 0;
+	close FROM;
+	$! = $status unless $!;
+    }
+  fail_open1:
+    return -1;
+}
+
+sub cmp;
+*cmp = \&compare;
+
+sub compare_text {
+    my ($from,$to,$cmp) = @_;
+    croak("Usage: compare_text( file1, file2 [, cmp-function])")
+	unless @_ == 2 || @_ == 3;
+    croak("Third arg to compare_text() function must be a code reference")
+	if @_ == 3 && ref($cmp) ne 'CODE';
+
+    # Using a negative buffer size puts compare into text_mode too
+    $cmp = -1 unless defined $cmp;
+    compare($from, $to, $cmp);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+File::Compare - Compare files or filehandles
+
+=head1 SYNOPSIS
+
+  	use File::Compare;
+
+	if (compare("file1","file2") == 0) {
+	    print "They're equal\n";
+	}
+
+=head1 DESCRIPTION
+
+The File::Compare::compare function compares the contents of two
+sources, each of which can be a file or a file handle.  It is exported
+from File::Compare by default.
+
+File::Compare::cmp is a synonym for File::Compare::compare.  It is
+exported from File::Compare only by request.
+
+File::Compare::compare_text does a line by line comparison of the two
+files. It stops as soon as a difference is detected. compare_text()
+accepts an optional third argument: This must be a CODE reference to
+a line comparison function, which returns 0 when both lines are considered
+equal. For example:
+
+    compare_text($file1, $file2)
+
+is basically equivalent to
+
+    compare_text($file1, $file2, sub {$_[0] ne $_[1]} )
+
+=head1 RETURN
+
+File::Compare::compare and its sibling functions return 0 if the files
+are equal, 1 if the files are unequal, or -1 if an error was encountered.
+
+=head1 AUTHOR
+
+File::Compare was written by Nick Ing-Simmons.
+Its original documentation was written by Chip Salzenberg.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Copy.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Copy.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Copy.pm	(revision 14489)
@@ -0,0 +1,459 @@
+# File/Copy.pm. Written in 1994 by Aaron Sherman <ajs@ajs.com>. This
+# source code has been placed in the public domain by the author.
+# Please be kind and preserve the documentation.
+#
+# Additions copyright 1996 by Charles Bailey.  Permission is granted
+# to distribute the revised code under the same terms as Perl itself.
+
+package File::Copy;
+
+use 5.006;
+use strict;
+use warnings;
+use Carp;
+use File::Spec;
+use Config;
+our(@ISA, @EXPORT, @EXPORT_OK, $VERSION, $Too_Big, $Syscopy_is_copy);
+sub copy;
+sub syscopy;
+sub cp;
+sub mv;
+
+# Note that this module implements only *part* of the API defined by
+# the File/Copy.pm module of the File-Tools-2.0 package.  However, that
+# package has not yet been updated to work with Perl 5.004, and so it
+# would be a Bad Thing for the CPAN module to grab it and replace this
+# module.  Therefore, we set this module's version higher than 2.0.
+$VERSION = '2.09';
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(copy move);
+@EXPORT_OK = qw(cp mv);
+
+$Too_Big = 1024 * 1024 * 2;
+
+my $macfiles;
+if ($^O eq 'MacOS') {
+	$macfiles = eval { require Mac::MoreFiles };
+	warn 'Mac::MoreFiles could not be loaded; using non-native syscopy'
+		if $@ && $^W;
+}
+
+sub _catname {
+    my($from, $to) = @_;
+    if (not defined &basename) {
+	require File::Basename;
+	import  File::Basename 'basename';
+    }
+
+    if ($^O eq 'MacOS') {
+	# a partial dir name that's valid only in the cwd (e.g. 'tmp')
+	$to = ':' . $to if $to !~ /:/;
+    }
+
+    return File::Spec->catfile($to, basename($from));
+}
+
+sub copy {
+    croak("Usage: copy(FROM, TO [, BUFFERSIZE]) ")
+      unless(@_ == 2 || @_ == 3);
+
+    my $from = shift;
+    my $to = shift;
+
+    my $from_a_handle = (ref($from)
+			 ? (ref($from) eq 'GLOB'
+			    || UNIVERSAL::isa($from, 'GLOB')
+                            || UNIVERSAL::isa($from, 'IO::Handle'))
+			 : (ref(\$from) eq 'GLOB'));
+    my $to_a_handle =   (ref($to)
+			 ? (ref($to) eq 'GLOB'
+			    || UNIVERSAL::isa($to, 'GLOB')
+                            || UNIVERSAL::isa($to, 'IO::Handle'))
+			 : (ref(\$to) eq 'GLOB'));
+
+    if ($from eq $to) { # works for references, too
+	carp("'$from' and '$to' are identical (not copied)");
+        # The "copy" was a success as the source and destination contain
+        # the same data.
+        return 1;
+    }
+
+    if ((($Config{d_symlink} && $Config{d_readlink}) || $Config{d_link}) &&
+	!($^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'vms')) {
+	my @fs = stat($from);
+	if (@fs) {
+	    my @ts = stat($to);
+	    if (@ts && $fs[0] == $ts[0] && $fs[1] == $ts[1]) {
+		carp("'$from' and '$to' are identical (not copied)");
+                return 0;
+	    }
+	}
+    }
+
+    if (!$from_a_handle && !$to_a_handle && -d $to && ! -d $from) {
+	$to = _catname($from, $to);
+    }
+
+    if (defined &syscopy && !$Syscopy_is_copy
+	&& !$to_a_handle
+	&& !($from_a_handle && $^O eq 'os2' )	# OS/2 cannot handle handles
+	&& !($from_a_handle && $^O eq 'mpeix')	# and neither can MPE/iX.
+	&& !($from_a_handle && $^O eq 'MSWin32')
+	&& !($from_a_handle && $^O eq 'MacOS')
+	&& !($from_a_handle && $^O eq 'NetWare')
+       )
+    {
+	return syscopy($from, $to);
+    }
+
+    my $closefrom = 0;
+    my $closeto = 0;
+    my ($size, $status, $r, $buf);
+    local($\) = '';
+
+    my $from_h;
+    if ($from_a_handle) {
+       $from_h = $from;
+    } else {
+	$from = _protect($from) if $from =~ /^\s/s;
+       $from_h = \do { local *FH };
+       open($from_h, "< $from\0") or goto fail_open1;
+       binmode $from_h or die "($!,$^E)";
+	$closefrom = 1;
+    }
+
+    my $to_h;
+    if ($to_a_handle) {
+       $to_h = $to;
+    } else {
+	$to = _protect($to) if $to =~ /^\s/s;
+       $to_h = \do { local *FH };
+       open($to_h,"> $to\0") or goto fail_open2;
+       binmode $to_h or die "($!,$^E)";
+	$closeto = 1;
+    }
+
+    if (@_) {
+	$size = shift(@_) + 0;
+	croak("Bad buffer size for copy: $size\n") unless ($size > 0);
+    } else {
+	$size = tied(*$from_h) ? 0 : -s $from_h || 0;
+	$size = 1024 if ($size < 512);
+	$size = $Too_Big if ($size > $Too_Big);
+    }
+
+    $! = 0;
+    for (;;) {
+	my ($r, $w, $t);
+       defined($r = sysread($from_h, $buf, $size))
+	    or goto fail_inner;
+	last unless $r;
+	for ($w = 0; $w < $r; $w += $t) {
+           $t = syswrite($to_h, $buf, $r - $w, $w)
+		or goto fail_inner;
+	}
+    }
+
+    close($to_h) || goto fail_open2 if $closeto;
+    close($from_h) || goto fail_open1 if $closefrom;
+
+    # Use this idiom to avoid uninitialized value warning.
+    return 1;
+
+    # All of these contortions try to preserve error messages...
+  fail_inner:
+    if ($closeto) {
+	$status = $!;
+	$! = 0;
+       close $to_h;
+	$! = $status unless $!;
+    }
+  fail_open2:
+    if ($closefrom) {
+	$status = $!;
+	$! = 0;
+       close $from_h;
+	$! = $status unless $!;
+    }
+  fail_open1:
+    return 0;
+}
+
+sub move {
+    croak("Usage: move(FROM, TO) ") unless @_ == 2;
+
+    my($from,$to) = @_;
+
+    my($fromsz,$tosz1,$tomt1,$tosz2,$tomt2,$sts,$ossts);
+
+    if (-d $to && ! -d $from) {
+	$to = _catname($from, $to);
+    }
+
+    ($tosz1,$tomt1) = (stat($to))[7,9];
+    $fromsz = -s $from;
+    if ($^O eq 'os2' and defined $tosz1 and defined $fromsz) {
+      # will not rename with overwrite
+      unlink $to;
+    }
+    return 1 if rename $from, $to;
+
+    # Did rename return an error even though it succeeded, because $to
+    # is on a remote NFS file system, and NFS lost the server's ack?
+    return 1 if defined($fromsz) && !-e $from &&           # $from disappeared
+                (($tosz2,$tomt2) = (stat($to))[7,9]) &&    # $to's there
+                ($tosz1 != $tosz2 or $tomt1 != $tomt2) &&  #   and changed
+                $tosz2 == $fromsz;                         # it's all there
+
+    ($tosz1,$tomt1) = (stat($to))[7,9];  # just in case rename did something
+
+    {
+        local $@;
+        eval {
+            local $SIG{__DIE__};
+            copy($from,$to) or die;
+            my($atime, $mtime) = (stat($from))[8,9];
+            utime($atime, $mtime, $to);
+            unlink($from)   or die;
+        };
+        return 1 unless $@;
+    }
+    ($sts,$ossts) = ($! + 0, $^E + 0);
+
+    ($tosz2,$tomt2) = ((stat($to))[7,9],0,0) if defined $tomt1;
+    unlink($to) if !defined($tomt1) or $tomt1 != $tomt2 or $tosz1 != $tosz2;
+    ($!,$^E) = ($sts,$ossts);
+    return 0;
+}
+
+*cp = \&copy;
+*mv = \&move;
+
+
+if ($^O eq 'MacOS') {
+    *_protect = sub { MacPerl::MakeFSSpec($_[0]) };
+} else {
+    *_protect = sub { "./$_[0]" };
+}
+
+# &syscopy is an XSUB under OS/2
+unless (defined &syscopy) {
+    if ($^O eq 'VMS') {
+	*syscopy = \&rmscopy;
+    } elsif ($^O eq 'mpeix') {
+	*syscopy = sub {
+	    return 0 unless @_ == 2;
+	    # Use the MPE cp program in order to
+	    # preserve MPE file attributes.
+	    return system('/bin/cp', '-f', $_[0], $_[1]) == 0;
+	};
+    } elsif ($^O eq 'MSWin32') {
+	*syscopy = sub {
+	    return 0 unless @_ == 2;
+	    return Win32::CopyFile(@_, 1);
+	};
+    } elsif ($macfiles) {
+	*syscopy = sub {
+	    my($from, $to) = @_;
+	    my($dir, $toname);
+
+	    return 0 unless -e $from;
+
+	    if ($to =~ /(.*:)([^:]+):?$/) {
+		($dir, $toname) = ($1, $2);
+	    } else {
+		($dir, $toname) = (":", $to);
+	    }
+
+	    unlink($to);
+	    Mac::MoreFiles::FSpFileCopy($from, $dir, $toname, 1);
+	};
+    } else {
+	$Syscopy_is_copy = 1;
+	*syscopy = \&copy;
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+File::Copy - Copy files or filehandles
+
+=head1 SYNOPSIS
+
+	use File::Copy;
+
+	copy("file1","file2") or die "Copy failed: $!";
+	copy("Copy.pm",\*STDOUT);
+	move("/dev1/fileA","/dev2/fileB");
+
+	use File::Copy "cp";
+
+	$n = FileHandle->new("/a/file","r");
+	cp($n,"x");
+
+=head1 DESCRIPTION
+
+The File::Copy module provides two basic functions, C<copy> and
+C<move>, which are useful for getting the contents of a file from
+one place to another.
+
+=over 4
+
+=item *
+
+The C<copy> function takes two
+parameters: a file to copy from and a file to copy to. Either
+argument may be a string, a FileHandle reference or a FileHandle
+glob. Obviously, if the first argument is a filehandle of some
+sort, it will be read from, and if it is a file I<name> it will
+be opened for reading. Likewise, the second argument will be
+written to (and created if need be).  Trying to copy a file on top
+of itself is a fatal error.
+
+B<Note that passing in
+files as handles instead of names may lead to loss of information
+on some operating systems; it is recommended that you use file
+names whenever possible.>  Files are opened in binary mode where
+applicable.  To get a consistent behaviour when copying from a
+filehandle to a file, use C<binmode> on the filehandle.
+
+An optional third parameter can be used to specify the buffer
+size used for copying. This is the number of bytes from the
+first file, that wil be held in memory at any given time, before
+being written to the second file. The default buffer size depends
+upon the file, but will generally be the whole file (up to 2Mb), or
+1k for filehandles that do not reference files (eg. sockets).
+
+You may use the syntax C<use File::Copy "cp"> to get at the
+"cp" alias for this function. The syntax is I<exactly> the same.
+
+=item *
+
+The C<move> function also takes two parameters: the current name
+and the intended name of the file to be moved.  If the destination
+already exists and is a directory, and the source is not a
+directory, then the source file will be renamed into the directory
+specified by the destination.
+
+If possible, move() will simply rename the file.  Otherwise, it copies
+the file to the new location and deletes the original.  If an error occurs
+during this copy-and-delete process, you may be left with a (possibly partial)
+copy of the file under the destination name.
+
+You may use the "mv" alias for this function in the same way that
+you may use the "cp" alias for C<copy>.
+
+=back
+
+File::Copy also provides the C<syscopy> routine, which copies the
+file specified in the first parameter to the file specified in the
+second parameter, preserving OS-specific attributes and file
+structure.  For Unix systems, this is equivalent to the simple
+C<copy> routine, which doesn't preserve OS-specific attributes.  For
+VMS systems, this calls the C<rmscopy> routine (see below).  For OS/2
+systems, this calls the C<syscopy> XSUB directly. For Win32 systems,
+this calls C<Win32::CopyFile>.
+
+On Mac OS (Classic), C<syscopy> calls C<Mac::MoreFiles::FSpFileCopy>,
+if available.
+
+=head2 Special behaviour if C<syscopy> is defined (OS/2, VMS and Win32)
+
+If both arguments to C<copy> are not file handles,
+then C<copy> will perform a "system copy" of
+the input file to a new output file, in order to preserve file
+attributes, indexed file structure, I<etc.>  The buffer size
+parameter is ignored.  If either argument to C<copy> is a
+handle to an opened file, then data is copied using Perl
+operators, and no effort is made to preserve file attributes
+or record structure.
+
+The system copy routine may also be called directly under VMS and OS/2
+as C<File::Copy::syscopy> (or under VMS as C<File::Copy::rmscopy>, which
+is the routine that does the actual work for syscopy).
+
+=over 4
+
+=item rmscopy($from,$to[,$date_flag])
+
+The first and second arguments may be strings, typeglobs, typeglob
+references, or objects inheriting from IO::Handle;
+they are used in all cases to obtain the
+I<filespec> of the input and output files, respectively.  The
+name and type of the input file are used as defaults for the
+output file, if necessary.
+
+A new version of the output file is always created, which
+inherits the structure and RMS attributes of the input file,
+except for owner and protections (and possibly timestamps;
+see below).  All data from the input file is copied to the
+output file; if either of the first two parameters to C<rmscopy>
+is a file handle, its position is unchanged.  (Note that this
+means a file handle pointing to the output file will be
+associated with an old version of that file after C<rmscopy>
+returns, not the newly created version.)
+
+The third parameter is an integer flag, which tells C<rmscopy>
+how to handle timestamps.  If it is E<lt> 0, none of the input file's
+timestamps are propagated to the output file.  If it is E<gt> 0, then
+it is interpreted as a bitmask: if bit 0 (the LSB) is set, then
+timestamps other than the revision date are propagated; if bit 1
+is set, the revision date is propagated.  If the third parameter
+to C<rmscopy> is 0, then it behaves much like the DCL COPY command:
+if the name or type of the output file was explicitly specified,
+then no timestamps are propagated, but if they were taken implicitly
+from the input filespec, then all timestamps other than the
+revision date are propagated.  If this parameter is not supplied,
+it defaults to 0.
+
+Like C<copy>, C<rmscopy> returns 1 on success.  If an error occurs,
+it sets C<$!>, deletes the output file, and returns 0.
+
+=back
+
+=head1 RETURN
+
+All functions return 1 on success, 0 on failure.
+$! will be set if an error was encountered.
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+On Mac OS (Classic), the path separator is ':', not '/', and the 
+current directory is denoted as ':', not '.'. You should be careful 
+about specifying relative pathnames. While a full path always begins 
+with a volume name, a relative pathname should always begin with a 
+':'.  If specifying a volume name only, a trailing ':' is required.
+
+E.g.
+
+  copy("file1", "tmp");        # creates the file 'tmp' in the current directory
+  copy("file1", ":tmp:");      # creates :tmp:file1
+  copy("file1", ":tmp");       # same as above
+  copy("file1", "tmp");        # same as above, if 'tmp' is a directory (but don't do   
+                               # that, since it may cause confusion, see example #1)
+  copy("file1", "tmp:file1");  # error, since 'tmp:' is not a volume
+  copy("file1", ":tmp:file1"); # ok, partial path
+  copy("file1", "DataHD:");    # creates DataHD:file1
+  
+  move("MacintoshHD:fileA", "DataHD:fileB"); # moves (don't copies) files from one 
+                                             # volume to another
+
+=back
+
+=head1 AUTHOR
+
+File::Copy was written by Aaron Sherman I<E<lt>ajs@ajs.comE<gt>> in 1995,
+and updated by Charles Bailey I<E<lt>bailey@newman.upenn.eduE<gt>> in 1996.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/File/DosGlob.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/DosGlob.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/DosGlob.pm	(revision 14489)
@@ -0,0 +1,571 @@
+#!perl -w
+
+# use strict fails
+#Can't use string ("main::glob") as a symbol ref while "strict refs" in use at /usr/lib/perl5/5.005/File/DosGlob.pm line 191.
+
+#
+# Documentation at the __END__
+#
+
+package File::DosGlob;
+
+our $VERSION = '1.00';
+use strict;
+use warnings;
+
+sub doglob {
+    my $cond = shift;
+    my @retval = ();
+    #print "doglob: ", join('|', @_), "\n";
+  OUTER:
+    for my $pat (@_) {
+	my @matched = ();
+	my @globdirs = ();
+	my $head = '.';
+	my $sepchr = '/';
+        my $tail;
+	next OUTER unless defined $pat and $pat ne '';
+	# if arg is within quotes strip em and do no globbing
+	if ($pat =~ /^"(.*)"\z/s) {
+	    $pat = $1;
+	    if ($cond eq 'd') { push(@retval, $pat) if -d $pat }
+	    else              { push(@retval, $pat) if -e $pat }
+	    next OUTER;
+	}
+	# wildcards with a drive prefix such as h:*.pm must be changed
+	# to h:./*.pm to expand correctly
+	if ($pat =~ m|^([A-Za-z]:)[^/\\]|s) {
+	    substr($_,0,2) = $1 . "./";
+	}
+	if ($pat =~ m|^(.*)([\\/])([^\\/]*)\z|s) {
+	    ($head, $sepchr, $tail) = ($1,$2,$3);
+	    #print "div: |$head|$sepchr|$tail|\n";
+	    push (@retval, $pat), next OUTER if $tail eq '';
+	    if ($head =~ /[*?]/) {
+		@globdirs = doglob('d', $head);
+		push(@retval, doglob($cond, map {"$_$sepchr$tail"} @globdirs)),
+		    next OUTER if @globdirs;
+	    }
+	    $head .= $sepchr if $head eq '' or $head =~ /^[A-Za-z]:\z/s;
+	    $pat = $tail;
+	}
+	#
+	# If file component has no wildcards, we can avoid opendir
+	unless ($pat =~ /[*?]/) {
+	    $head = '' if $head eq '.';
+	    $head .= $sepchr unless $head eq '' or substr($head,-1) eq $sepchr;
+	    $head .= $pat;
+	    if ($cond eq 'd') { push(@retval,$head) if -d $head }
+	    else              { push(@retval,$head) if -e $head }
+	    next OUTER;
+	}
+	opendir(D, $head) or next OUTER;
+	my @leaves = readdir D;
+	closedir D;
+	$head = '' if $head eq '.';
+	$head .= $sepchr unless $head eq '' or substr($head,-1) eq $sepchr;
+
+	# escape regex metachars but not glob chars
+        $pat =~ s:([].+^\-\${}[|]):\\$1:g;
+	# and convert DOS-style wildcards to regex
+	$pat =~ s/\*/.*/g;
+	$pat =~ s/\?/.?/g;
+
+	#print "regex: '$pat', head: '$head'\n";
+	my $matchsub = sub { $_[0] =~ m|^$pat\z|is };
+      INNER:
+	for my $e (@leaves) {
+	    next INNER if $e eq '.' or $e eq '..';
+	    next INNER if $cond eq 'd' and ! -d "$head$e";
+	    push(@matched, "$head$e"), next INNER if &$matchsub($e);
+	    #
+	    # [DOS compatibility special case]
+	    # Failed, add a trailing dot and try again, but only
+	    # if name does not have a dot in it *and* pattern
+	    # has a dot *and* name is shorter than 9 chars.
+	    #
+	    if (index($e,'.') == -1 and length($e) < 9
+	        and index($pat,'\\.') != -1) {
+		push(@matched, "$head$e"), next INNER if &$matchsub("$e.");
+	    }
+	}
+	push @retval, @matched if @matched;
+    }
+    return @retval;
+}
+
+
+#
+# Do DOS-like globbing on Mac OS 
+#
+sub doglob_Mac {
+    my $cond = shift;
+    my @retval = ();
+
+	#print "doglob_Mac: ", join('|', @_), "\n";
+  OUTER:
+    for my $arg (@_) {
+        local $_ = $arg;
+	my @matched = ();
+	my @globdirs = ();
+	my $head = ':';
+	my $not_esc_head = $head;
+	my $sepchr = ':';	
+	next OUTER unless defined $_ and $_ ne '';
+	# if arg is within quotes strip em and do no globbing
+	if (/^"(.*)"\z/s) {
+	    $_ = $1;
+		# $_ may contain escaped metachars '\*', '\?' and '\'
+	        my $not_esc_arg = $_;
+		$not_esc_arg =~ s/\\([*?\\])/$1/g;
+	    if ($cond eq 'd') { push(@retval, $not_esc_arg) if -d $not_esc_arg }
+	    else              { push(@retval, $not_esc_arg) if -e $not_esc_arg }
+	    next OUTER;
+	}
+
+	if (m|^(.*?)(:+)([^:]*)\z|s) { # note: $1 is not greedy
+	    my $tail;
+	    ($head, $sepchr, $tail) = ($1,$2,$3);
+	    #print "div: |$head|$sepchr|$tail|\n";
+	    push (@retval, $_), next OUTER if $tail eq '';		
+		#
+		# $head may contain escaped metachars '\*' and '\?'
+		
+		my $tmp_head = $head;
+		# if a '*' or '?' is preceded by an odd count of '\', temporary delete 
+		# it (and its preceding backslashes), i.e. don't treat '\*' and '\?' as 
+		# wildcards
+		$tmp_head =~ s/(\\*)([*?])/$2 x ((length($1) + 1) % 2)/eg;
+	
+		if ($tmp_head =~ /[*?]/) { # if there are wildcards ...	
+		@globdirs = doglob_Mac('d', $head);
+		push(@retval, doglob_Mac($cond, map {"$_$sepchr$tail"} @globdirs)),
+		    next OUTER if @globdirs;
+	    }
+		
+		$head .= $sepchr; 
+		$not_esc_head = $head;
+		# unescape $head for file operations
+		$not_esc_head =~ s/\\([*?\\])/$1/g;
+	    $_ = $tail;
+	}
+	#
+	# If file component has no wildcards, we can avoid opendir
+	
+	my $tmp_tail = $_;
+	# if a '*' or '?' is preceded by an odd count of '\', temporary delete 
+	# it (and its preceding backslashes), i.e. don't treat '\*' and '\?' as 
+	# wildcards
+	$tmp_tail =~ s/(\\*)([*?])/$2 x ((length($1) + 1) % 2)/eg;
+	
+	unless ($tmp_tail =~ /[*?]/) { # if there are wildcards ...
+	    $not_esc_head = $head = '' if $head eq ':';
+	    my $not_esc_tail = $_;
+	    # unescape $head and $tail for file operations
+	    $not_esc_tail =~ s/\\([*?\\])/$1/g;
+	    $head .= $_;
+		$not_esc_head .= $not_esc_tail;
+	    if ($cond eq 'd') { push(@retval,$head) if -d $not_esc_head }
+	    else              { push(@retval,$head) if -e $not_esc_head }
+	    next OUTER;
+	}
+	#print "opendir($not_esc_head)\n";
+	opendir(D, $not_esc_head) or next OUTER;
+	my @leaves = readdir D;
+	closedir D;
+
+	# escape regex metachars but not '\' and glob chars '*', '?'
+	$_ =~ s:([].+^\-\${}[|]):\\$1:g;
+	# and convert DOS-style wildcards to regex,
+	# but only if they are not escaped
+	$_ =~ s/(\\*)([*?])/$1 . ('.' x ((length($1) + 1) % 2)) . $2/eg;
+
+	#print "regex: '$_', head: '$head', unescaped head: '$not_esc_head'\n";
+	my $matchsub = eval 'sub { $_[0] =~ m|^' . $_ . '\\z|ios }';
+	warn($@), next OUTER if $@;
+      INNER:
+	for my $e (@leaves) {
+	    next INNER if $e eq '.' or $e eq '..';
+	    next INNER if $cond eq 'd' and ! -d "$not_esc_head$e";
+		
+		if (&$matchsub($e)) {
+			my $leave = (($not_esc_head eq ':') && (-f "$not_esc_head$e")) ? 
+		            	"$e" : "$not_esc_head$e";
+			#
+			# On Mac OS, the two glob metachars '*' and '?' and the escape 
+			# char '\' are valid characters for file and directory names. 
+			# We have to escape and treat them specially.
+			$leave =~ s|([*?\\])|\\$1|g;		
+			push(@matched, $leave);
+			next INNER;
+		}
+	}
+	push @retval, @matched if @matched;
+    }
+    return @retval;
+}
+
+#
+# _expand_volume() will only be used on Mac OS (Classic): 
+# Takes an array of original patterns as argument and returns an array of  
+# possibly modified patterns. Each original pattern is processed like 
+# that:
+# + If there's a volume name in the pattern, we push a separate pattern 
+#   for each mounted volume that matches (with '*', '?' and '\' escaped).  
+# + If there's no volume name in the original pattern, it is pushed 
+#   unchanged. 
+# Note that the returned array of patterns may be empty.
+#  
+sub _expand_volume {
+	
+	require MacPerl; # to be verbose
+	
+	my @pat = @_;
+	my @new_pat = ();
+	my @FSSpec_Vols = MacPerl::Volumes();
+	my @mounted_volumes = ();
+
+	foreach my $spec_vol (@FSSpec_Vols) {		
+		# push all mounted volumes into array
+     	push @mounted_volumes, MacPerl::MakePath($spec_vol);
+	}
+	#print "mounted volumes: |@mounted_volumes|\n";
+	
+	while (@pat) {
+		my $pat = shift @pat;	
+		if ($pat =~ /^([^:]+:)(.*)\z/) { # match a volume name?
+			my $vol_pat = $1;
+			my $tail = $2;
+			#
+			# escape regex metachars but not '\' and glob chars '*', '?'
+			$vol_pat =~ s:([].+^\-\${}[|]):\\$1:g;
+			# and convert DOS-style wildcards to regex,
+			# but only if they are not escaped
+			$vol_pat =~ s/(\\*)([*?])/$1 . ('.' x ((length($1) + 1) % 2)) . $2/eg;
+			#print "volume regex: '$vol_pat' \n";
+				
+			foreach my $volume (@mounted_volumes) {
+				if ($volume =~ m|^$vol_pat\z|ios) {
+					#
+					# On Mac OS, the two glob metachars '*' and '?' and the  
+					# escape char '\' are valid characters for volume names. 
+					# We have to escape and treat them specially.
+					$volume =~ s|([*?\\])|\\$1|g;
+					push @new_pat, $volume . $tail;
+				}
+			}			
+		} else { # no volume name in pattern, push original pattern
+			push @new_pat, $pat;
+		}
+	}
+	return @new_pat;
+}
+
+
+#
+# _preprocess_pattern() will only be used on Mac OS (Classic): 
+# Resolves any updirs in the pattern. Removes a single trailing colon 
+# from the pattern, unless it's a volume name pattern like "*HD:"
+#
+sub _preprocess_pattern {
+	my @pat = @_;
+	
+	foreach my $p (@pat) {
+		my $proceed;
+		# resolve any updirs, e.g. "*HD:t?p::a*" -> "*HD:a*"
+		do {
+			$proceed = ($p =~ s/^(.*):[^:]+::(.*?)\z/$1:$2/);  
+		} while ($proceed);
+		# remove a single trailing colon, e.g. ":*:" -> ":*"
+		$p =~ s/:([^:]+):\z/:$1/;
+	}
+	return @pat;
+}
+		
+		
+#
+# _un_escape() will only be used on Mac OS (Classic):
+# Unescapes a list of arguments which may contain escaped 
+# metachars '*', '?' and '\'.
+#
+sub _un_escape {
+	foreach (@_) {
+		s/\\([*?\\])/$1/g;
+	}
+	return @_;
+}
+
+#
+# this can be used to override CORE::glob in a specific
+# package by saying C<use File::DosGlob 'glob';> in that
+# namespace.
+#
+
+# context (keyed by second cxix arg provided by core)
+my %iter;
+my %entries;
+
+sub glob {
+    my($pat,$cxix) = @_;
+    my @pat;
+
+    # glob without args defaults to $_
+    $pat = $_ unless defined $pat;
+
+    # extract patterns
+    if ($pat =~ /\s/) {
+	require Text::ParseWords;
+	@pat = Text::ParseWords::parse_line('\s+',0,$pat);
+    }
+    else {
+	push @pat, $pat;
+    }
+
+    # Mike Mestnik: made to do abc{1,2,3} == abc1 abc2 abc3.
+    #   abc3 will be the original {3} (and drop the {}).
+    #   abc1 abc2 will be put in @appendpat.
+    # This was just the esiest way, not nearly the best.
+    REHASH: {
+	my @appendpat = ();
+	for (@pat) {
+	    # There must be a "," I.E. abc{efg} is not what we want.
+	    while ( /^(.*)(?<!\\)\{(.*?)(?<!\\)\,.*?(?<!\\)\}(.*)$/ ) {
+		my ($start, $match, $end) = ($1, $2, $3);
+		#print "Got: \n\t$start\n\t$match\n\t$end\n";
+		my $tmp = "$start$match$end";
+		while ( $tmp =~ s/^(.*?)(?<!\\)\{(?:.*(?<!\\)\,)?(.*\Q$match\E.*?)(?:(?<!\\)\,.*)?(?<!\\)\}(.*)$/$1$2$3/ ) {
+		    #print "Striped: $tmp\n";
+		    #  these expanshions will be preformed by the original,
+		    #  when we call REHASH.
+		}
+		push @appendpat, ("$tmp");
+		s/^\Q$start\E(?<!\\)\{\Q$match\E(?<!\\)\,/$start\{/;
+		if ( /^\Q$start\E(?<!\\)\{(?!.*?(?<!\\)\,.*?\Q$end\E$)(.*)(?<!\\)\}\Q$end\E$/ ) {
+		    $match = $1;
+		    #print "GOT: \n\t$start\n\t$match\n\t$end\n\n";
+		    $_ = "$start$match$end";
+		}
+	    }
+	    #print "Sould have "GOT" vs "Got"!\n";
+		#FIXME: There should be checking for this.
+		#  How or what should be done about failure is beond me.
+	}
+	if ( $#appendpat != -1
+		) {
+	    #print "LOOP\n";
+	    #FIXME: Max loop, no way! :")
+	    for ( @appendpat ) {
+	        push @pat, $_;
+	    }
+	    goto REHASH;
+	}
+    }
+    for ( @pat ) {
+	s/\\{/{/g;
+	s/\\}/}/g;
+	s/\\,/,/g;
+    }
+    #print join ("\n", @pat). "\n";
+ 
+    # assume global context if not provided one
+    $cxix = '_G_' unless defined $cxix;
+    $iter{$cxix} = 0 unless exists $iter{$cxix};
+
+    # if we're just beginning, do it all first
+    if ($iter{$cxix} == 0) {
+	if ($^O eq 'MacOS') {
+		# first, take care of updirs and trailing colons
+		@pat = _preprocess_pattern(@pat);
+		# expand volume names
+		@pat = _expand_volume(@pat);
+		$entries{$cxix} = (@pat) ? [_un_escape( doglob_Mac(1,@pat) )] : [()];
+	} else {
+		$entries{$cxix} = [doglob(1,@pat)];
+    }
+	}
+
+    # chuck it all out, quick or slow
+    if (wantarray) {
+	delete $iter{$cxix};
+	return @{delete $entries{$cxix}};
+    }
+    else {
+	if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
+	    return shift @{$entries{$cxix}};
+	}
+	else {
+	    # return undef for EOL
+	    delete $iter{$cxix};
+	    delete $entries{$cxix};
+	    return undef;
+	}
+    }
+}
+
+{
+    no strict 'refs';
+
+    sub import {
+    my $pkg = shift;
+    return unless @_;
+    my $sym = shift;
+    my $callpkg = ($sym =~ s/^GLOBAL_//s ? 'CORE::GLOBAL' : caller(0));
+    *{$callpkg.'::'.$sym} = \&{$pkg.'::'.$sym} if $sym eq 'glob';
+    }
+}
+1;
+
+__END__
+
+=head1 NAME
+
+File::DosGlob - DOS like globbing and then some
+
+=head1 SYNOPSIS
+
+    require 5.004;
+
+    # override CORE::glob in current package
+    use File::DosGlob 'glob';
+
+    # override CORE::glob in ALL packages (use with extreme caution!)
+    use File::DosGlob 'GLOBAL_glob';
+
+    @perlfiles = glob  "..\\pe?l/*.p?";
+    print <..\\pe?l/*.p?>;
+
+    # from the command line (overrides only in main::)
+    > perl -MFile::DosGlob=glob -e "print <../pe*/*p?>"
+
+=head1 DESCRIPTION
+
+A module that implements DOS-like globbing with a few enhancements.
+It is largely compatible with perlglob.exe (the M$ setargv.obj
+version) in all but one respect--it understands wildcards in
+directory components.
+
+For example, C<<..\\l*b\\file/*glob.p?>> will work as expected (in
+that it will find something like '..\lib\File/DosGlob.pm' alright).
+Note that all path components are case-insensitive, and that
+backslashes and forward slashes are both accepted, and preserved.
+You may have to double the backslashes if you are putting them in
+literally, due to double-quotish parsing of the pattern by perl.
+
+Spaces in the argument delimit distinct patterns, so
+C<glob('*.exe *.dll')> globs all filenames that end in C<.exe>
+or C<.dll>.  If you want to put in literal spaces in the glob
+pattern, you can escape them with either double quotes, or backslashes.
+e.g. C<glob('c:/"Program Files"/*/*.dll')>, or
+C<glob('c:/Program\ Files/*/*.dll')>.  The argument is tokenized using
+C<Text::ParseWords::parse_line()>, so see L<Text::ParseWords> for details
+of the quoting rules used.
+
+Extending it to csh patterns is left as an exercise to the reader.
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+Mac OS (Classic) users should note a few differences. The specification 
+of pathnames in glob patterns adheres to the usual Mac OS conventions: 
+The path separator is a colon ':', not a slash '/' or backslash '\'. A 
+full path always begins with a volume name. A relative pathname on Mac 
+OS must always begin with a ':', except when specifying a file or 
+directory name in the current working directory, where the leading colon 
+is optional. If specifying a volume name only, a trailing ':' is 
+required. Due to these rules, a glob like E<lt>*:E<gt> will find all 
+mounted volumes, while a glob like E<lt>*E<gt> or E<lt>:*E<gt> will find 
+all files and directories in the current directory.
+
+Note that updirs in the glob pattern are resolved before the matching begins,
+i.e. a pattern like "*HD:t?p::a*" will be matched as "*HD:a*". Note also,
+that a single trailing ':' in the pattern is ignored (unless it's a volume
+name pattern like "*HD:"), i.e. a glob like <:*:> will find both directories 
+I<and> files (and not, as one might expect, only directories). 
+
+The metachars '*', '?' and the escape char '\' are valid characters in 
+volume, directory and file names on Mac OS. Hence, if you want to match
+a '*', '?' or '\' literally, you have to escape these characters. Due to 
+perl's quoting rules, things may get a bit complicated, when you want to 
+match a string like '\*' literally, or when you want to match '\' literally, 
+but treat the immediately following character '*' as metachar. So, here's a 
+rule of thumb (applies to both single- and double-quoted strings): escape 
+each '*' or '?' or '\' with a backslash, if you want to treat them literally, 
+and then double each backslash and your are done. E.g. 
+
+- Match '\*' literally
+
+   escape both '\' and '*'  : '\\\*'
+   double the backslashes   : '\\\\\\*'
+
+(Internally, the glob routine sees a '\\\*', which means that both '\' and 
+'*' are escaped.)
+
+
+- Match '\' literally, treat '*' as metachar
+
+   escape '\' but not '*'   : '\\*'
+   double the backslashes   : '\\\\*'
+
+(Internally, the glob routine sees a '\\*', which means that '\' is escaped and 
+'*' is not.)
+
+Note that you also have to quote literal spaces in the glob pattern, as described
+above.
+
+=back
+
+=head1 EXPORTS (by request only)
+
+glob()
+
+=head1 BUGS
+
+Should probably be built into the core, and needs to stop
+pandering to DOS habits.  Needs a dose of optimizium too.
+
+=head1 AUTHOR
+
+Gurusamy Sarathy <gsar@activestate.com>
+
+=head1 HISTORY
+
+=over 4
+
+=item *
+
+Support for globally overriding glob() (GSAR 3-JUN-98)
+
+=item *
+
+Scalar context, independent iterator context fixes (GSAR 15-SEP-97)
+
+=item *
+
+A few dir-vs-file optimizations result in glob importation being
+10 times faster than using perlglob.exe, and using perlglob.bat is
+only twice as slow as perlglob.exe (GSAR 28-MAY-97)
+
+=item *
+
+Several cleanups prompted by lack of compatible perlglob.exe
+under Borland (GSAR 27-MAY-97)
+
+=item *
+
+Initial version (GSAR 20-FEB-97)
+
+=back
+
+=head1 SEE ALSO
+
+perl
+
+perlglob.bat
+
+Text::ParseWords
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Find.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Find.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Find.pm	(revision 14489)
@@ -0,0 +1,1275 @@
+package File::Find;
+use 5.006;
+use strict;
+use warnings;
+use warnings::register;
+our $VERSION = '1.10';
+require Exporter;
+require Cwd;
+
+#
+# Modified to ensure sub-directory traversal order is not inverded by stack
+# push and pops.  That is remains in the same order as in the directory file,
+# or user pre-processing (EG:sorted).
+#
+
+=head1 NAME
+
+File::Find - Traverse a directory tree.
+
+=head1 SYNOPSIS
+
+    use File::Find;
+    find(\&wanted, @directories_to_search);
+    sub wanted { ... }
+
+    use File::Find;
+    finddepth(\&wanted, @directories_to_search);
+    sub wanted { ... }
+
+    use File::Find;
+    find({ wanted => \&process, follow => 1 }, '.');
+
+=head1 DESCRIPTION
+
+These are functions for searching through directory trees doing work
+on each file found similar to the Unix I<find> command.  File::Find
+exports two functions, C<find> and C<finddepth>.  They work similarly
+but have subtle differences.
+
+=over 4
+
+=item B<find>
+
+  find(\&wanted,  @directories);
+  find(\%options, @directories);
+
+C<find()> does a depth-first search over the given C<@directories> in
+the order they are given.  For each file or directory found, it calls
+the C<&wanted> subroutine.  (See below for details on how to use the
+C<&wanted> function).  Additionally, for each directory found, it will
+C<chdir()> into that directory and continue the search, invoking the
+C<&wanted> function on each file or subdirectory in the directory.
+
+=item B<finddepth>
+
+  finddepth(\&wanted,  @directories);
+  finddepth(\%options, @directories);
+
+C<finddepth()> works just like C<find()> except that is invokes the
+C<&wanted> function for a directory I<after> invoking it for the
+directory's contents.  It does a postorder traversal instead of a
+preorder traversal, working from the bottom of the directory tree up
+where C<find()> works from the top of the tree down.
+
+=back
+
+=head2 %options
+
+The first argument to C<find()> is either a code reference to your
+C<&wanted> function, or a hash reference describing the operations
+to be performed for each file.  The
+code reference is described in L<The wanted function> below.
+
+Here are the possible keys for the hash:
+
+=over 3
+
+=item C<wanted>
+
+The value should be a code reference.  This code reference is
+described in L<The wanted function> below.
+
+=item C<bydepth>
+
+Reports the name of a directory only AFTER all its entries
+have been reported.  Entry point C<finddepth()> is a shortcut for
+specifying C<<{ bydepth => 1 }>> in the first argument of C<find()>.
+
+=item C<preprocess>
+
+The value should be a code reference. This code reference is used to
+preprocess the current directory. The name of the currently processed
+directory is in C<$File::Find::dir>. Your preprocessing function is
+called after C<readdir()>, but before the loop that calls the C<wanted()>
+function. It is called with a list of strings (actually file/directory
+names) and is expected to return a list of strings. The code can be
+used to sort the file/directory names alphabetically, numerically,
+or to filter out directory entries based on their name alone. When
+I<follow> or I<follow_fast> are in effect, C<preprocess> is a no-op.
+
+=item C<postprocess>
+
+The value should be a code reference. It is invoked just before leaving
+the currently processed directory. It is called in void context with no
+arguments. The name of the current directory is in C<$File::Find::dir>. This
+hook is handy for summarizing a directory, such as calculating its disk
+usage. When I<follow> or I<follow_fast> are in effect, C<postprocess> is a
+no-op.
+
+=item C<follow>
+
+Causes symbolic links to be followed. Since directory trees with symbolic
+links (followed) may contain files more than once and may even have
+cycles, a hash has to be built up with an entry for each file.
+This might be expensive both in space and time for a large
+directory tree. See I<follow_fast> and I<follow_skip> below.
+If either I<follow> or I<follow_fast> is in effect:
+
+=over 6
+
+=item *
+
+It is guaranteed that an I<lstat> has been called before the user's
+C<wanted()> function is called. This enables fast file checks involving S<_>.
+Note that this guarantee no longer holds if I<follow> or I<follow_fast>
+are not set.
+
+=item *
+
+There is a variable C<$File::Find::fullname> which holds the absolute
+pathname of the file with all symbolic links resolved.  If the link is
+a dangling symbolic link, then fullname will be set to C<undef>.
+
+=back
+
+This is a no-op on Win32.
+
+=item C<follow_fast>
+
+This is similar to I<follow> except that it may report some files more
+than once.  It does detect cycles, however.  Since only symbolic links
+have to be hashed, this is much cheaper both in space and time.  If
+processing a file more than once (by the user's C<wanted()> function)
+is worse than just taking time, the option I<follow> should be used.
+
+This is also a no-op on Win32.
+
+=item C<follow_skip>
+
+C<follow_skip==1>, which is the default, causes all files which are
+neither directories nor symbolic links to be ignored if they are about
+to be processed a second time. If a directory or a symbolic link
+are about to be processed a second time, File::Find dies.
+
+C<follow_skip==0> causes File::Find to die if any file is about to be
+processed a second time.
+
+C<follow_skip==2> causes File::Find to ignore any duplicate files and
+directories but to proceed normally otherwise.
+
+=item C<dangling_symlinks>
+
+If true and a code reference, will be called with the symbolic link
+name and the directory it lives in as arguments.  Otherwise, if true
+and warnings are on, warning "symbolic_link_name is a dangling
+symbolic link\n" will be issued.  If false, the dangling symbolic link
+will be silently ignored.
+
+=item C<no_chdir>
+
+Does not C<chdir()> to each directory as it recurses. The C<wanted()>
+function will need to be aware of this, of course. In this case,
+C<$_> will be the same as C<$File::Find::name>.
+
+=item C<untaint>
+
+If find is used in taint-mode (-T command line switch or if EUID != UID
+or if EGID != GID) then internally directory names have to be untainted
+before they can be chdir'ed to. Therefore they are checked against a regular
+expression I<untaint_pattern>.  Note that all names passed to the user's
+I<wanted()> function are still tainted. If this option is used while
+not in taint-mode, C<untaint> is a no-op.
+
+=item C<untaint_pattern>
+
+See above. This should be set using the C<qr> quoting operator.
+The default is set to  C<qr|^([-+@\w./]+)$|>.
+Note that the parentheses are vital.
+
+=item C<untaint_skip>
+
+If set, a directory which fails the I<untaint_pattern> is skipped,
+including all its sub-directories. The default is to 'die' in such a case.
+
+=back
+
+=head2 The wanted function
+
+The C<wanted()> function does whatever verifications you want on
+each file and directory.  Note that despite its name, the C<wanted()>
+function is a generic callback function, and does B<not> tell
+File::Find if a file is "wanted" or not.  In fact, its return value
+is ignored.
+
+The wanted function takes no arguments but rather does its work
+through a collection of variables.
+
+=over 4
+
+=item C<$File::Find::dir> is the current directory name,
+
+=item C<$_> is the current filename within that directory
+
+=item C<$File::Find::name> is the complete pathname to the file.
+
+=back
+
+Don't modify these variables.
+
+For example, when examining the file F</some/path/foo.ext> you will have:
+
+    $File::Find::dir  = /some/path/
+    $_                = foo.ext
+    $File::Find::name = /some/path/foo.ext
+
+You are chdir()'d to C<$File::Find::dir> when the function is called,
+unless C<no_chdir> was specified. Note that when changing to
+directories is in effect the root directory (F</>) is a somewhat
+special case inasmuch as the concatenation of C<$File::Find::dir>,
+C<'/'> and C<$_> is not literally equal to C<$File::Find::name>. The
+table below summarizes all variants:
+
+              $File::Find::name  $File::Find::dir  $_
+ default      /                  /                 .
+ no_chdir=>0  /etc               /                 etc
+              /etc/x             /etc              x
+
+ no_chdir=>1  /                  /                 /
+              /etc               /                 /etc
+              /etc/x             /etc              /etc/x
+
+
+When <follow> or <follow_fast> are in effect, there is
+also a C<$File::Find::fullname>.  The function may set
+C<$File::Find::prune> to prune the tree unless C<bydepth> was
+specified.  Unless C<follow> or C<follow_fast> is specified, for
+compatibility reasons (find.pl, find2perl) there are in addition the
+following globals available: C<$File::Find::topdir>,
+C<$File::Find::topdev>, C<$File::Find::topino>,
+C<$File::Find::topmode> and C<$File::Find::topnlink>.
+
+This library is useful for the C<find2perl> tool, which when fed,
+
+    find2perl / -name .nfs\* -mtime +7 \
+        -exec rm -f {} \; -o -fstype nfs -prune
+
+produces something like:
+
+    sub wanted {
+        /^\.nfs.*\z/s &&
+        (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_)) &&
+        int(-M _) > 7 &&
+        unlink($_)
+        ||
+        ($nlink || (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_))) &&
+        $dev < 0 &&
+        ($File::Find::prune = 1);
+    }
+
+Notice the C<_> in the above C<int(-M _)>: the C<_> is a magical
+filehandle that caches the information from the preceding
+C<stat()>, C<lstat()>, or filetest.
+
+Here's another interesting wanted function.  It will find all symbolic
+links that don't resolve:
+
+    sub wanted {
+         -l && !-e && print "bogus link: $File::Find::name\n";
+    }
+
+See also the script C<pfind> on CPAN for a nice application of this
+module.
+
+=head1 WARNINGS
+
+If you run your program with the C<-w> switch, or if you use the
+C<warnings> pragma, File::Find will report warnings for several weird
+situations. You can disable these warnings by putting the statement
+
+    no warnings 'File::Find';
+
+in the appropriate scope. See L<perllexwarn> for more info about lexical
+warnings.
+
+=head1 CAVEAT
+
+=over 2
+
+=item $dont_use_nlink
+
+You can set the variable C<$File::Find::dont_use_nlink> to 1, if you want to
+force File::Find to always stat directories. This was used for file systems
+that do not have an C<nlink> count matching the number of sub-directories.
+Examples are ISO-9660 (CD-ROM), AFS, HPFS (OS/2 file system), FAT (DOS file
+system) and a couple of others.
+
+You shouldn't need to set this variable, since File::Find should now detect
+such file systems on-the-fly and switch itself to using stat. This works even
+for parts of your file system, like a mounted CD-ROM.
+
+If you do set C<$File::Find::dont_use_nlink> to 1, you will notice slow-downs.
+
+=item symlinks
+
+Be aware that the option to follow symbolic links can be dangerous.
+Depending on the structure of the directory tree (including symbolic
+links to directories) you might traverse a given (physical) directory
+more than once (only if C<follow_fast> is in effect).
+Furthermore, deleting or changing files in a symbolically linked directory
+might cause very unpleasant surprises, since you delete or change files
+in an unknown directory.
+
+=back
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+Mac OS (Classic) users should note a few differences:
+
+=over 4
+
+=item *
+
+The path separator is ':', not '/', and the current directory is denoted
+as ':', not '.'. You should be careful about specifying relative pathnames.
+While a full path always begins with a volume name, a relative pathname
+should always begin with a ':'.  If specifying a volume name only, a
+trailing ':' is required.
+
+=item *
+
+C<$File::Find::dir> is guaranteed to end with a ':'. If C<$_>
+contains the name of a directory, that name may or may not end with a
+':'. Likewise, C<$File::Find::name>, which contains the complete
+pathname to that directory, and C<$File::Find::fullname>, which holds
+the absolute pathname of that directory with all symbolic links resolved,
+may or may not end with a ':'.
+
+=item *
+
+The default C<untaint_pattern> (see above) on Mac OS is set to
+C<qr|^(.+)$|>. Note that the parentheses are vital.
+
+=item *
+
+The invisible system file "Icon\015" is ignored. While this file may
+appear in every directory, there are some more invisible system files
+on every volume, which are all located at the volume root level (i.e.
+"MacintoshHD:"). These system files are B<not> excluded automatically.
+Your filter may use the following code to recognize invisible files or
+directories (requires Mac::Files):
+
+ use Mac::Files;
+
+ # invisible() --  returns 1 if file/directory is invisible,
+ # 0 if it's visible or undef if an error occurred
+
+ sub invisible($) {
+   my $file = shift;
+   my ($fileCat, $fileInfo);
+   my $invisible_flag =  1 << 14;
+
+   if ( $fileCat = FSpGetCatInfo($file) ) {
+     if ($fileInfo = $fileCat->ioFlFndrInfo() ) {
+       return (($fileInfo->fdFlags & $invisible_flag) && 1);
+     }
+   }
+   return undef;
+ }
+
+Generally, invisible files are system files, unless an odd application
+decides to use invisible files for its own purposes. To distinguish
+such files from system files, you have to look at the B<type> and B<creator>
+file attributes. The MacPerl built-in functions C<GetFileInfo(FILE)> and
+C<SetFileInfo(CREATOR, TYPE, FILES)> offer access to these attributes
+(see MacPerl.pm for details).
+
+Files that appear on the desktop actually reside in an (hidden) directory
+named "Desktop Folder" on the particular disk volume. Note that, although
+all desktop files appear to be on the same "virtual" desktop, each disk
+volume actually maintains its own "Desktop Folder" directory.
+
+=back
+
+=back
+
+=head1 BUGS AND CAVEATS
+
+Despite the name of the C<finddepth()> function, both C<find()> and
+C<finddepth()> perform a depth-first search of the directory
+hierarchy.
+
+=head1 HISTORY
+
+File::Find used to produce incorrect results if called recursively.
+During the development of perl 5.8 this bug was fixed.
+The first fixed version of File::Find was 1.01.
+
+=cut
+
+our @ISA = qw(Exporter);
+our @EXPORT = qw(find finddepth);
+
+
+use strict;
+my $Is_VMS;
+my $Is_MacOS;
+
+require File::Basename;
+require File::Spec;
+
+# Should ideally be my() not our() but local() currently
+# refuses to operate on lexicals
+
+our %SLnkSeen;
+our ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow,
+    $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat,
+    $pre_process, $post_process, $dangling_symlinks);
+
+sub contract_name {
+    my ($cdir,$fn) = @_;
+
+    return substr($cdir,0,rindex($cdir,'/')) if $fn eq $File::Find::current_dir;
+
+    $cdir = substr($cdir,0,rindex($cdir,'/')+1);
+
+    $fn =~ s|^\./||;
+
+    my $abs_name= $cdir . $fn;
+
+    if (substr($fn,0,3) eq '../') {
+       1 while $abs_name =~ s!/[^/]*/\.\./!/!;
+    }
+
+    return $abs_name;
+}
+
+# return the absolute name of a directory or file
+sub contract_name_Mac {
+    my ($cdir,$fn) = @_;
+    my $abs_name;
+
+    if ($fn =~ /^(:+)(.*)$/) { # valid pathname starting with a ':'
+
+	my $colon_count = length ($1);
+	if ($colon_count == 1) {
+	    $abs_name = $cdir . $2;
+	    return $abs_name;
+	}
+	else {
+	    # need to move up the tree, but
+	    # only if it's not a volume name
+	    for (my $i=1; $i<$colon_count; $i++) {
+		unless ($cdir =~ /^[^:]+:$/) { # volume name
+		    $cdir =~ s/[^:]+:$//;
+		}
+		else {
+		    return undef;
+		}
+	    }
+	    $abs_name = $cdir . $2;
+	    return $abs_name;
+	}
+
+    }
+    else {
+
+	# $fn may be a valid path to a directory or file or (dangling)
+	# symlink, without a leading ':'
+	if ( (-e $fn) || (-l $fn) ) {
+	    if ($fn =~ /^[^:]+:/) { # a volume name like DataHD:*
+		return $fn; # $fn is already an absolute path
+	    }
+	    else {
+		$abs_name = $cdir . $fn;
+		return $abs_name;
+	    }
+	}
+	else { # argh!, $fn is not a valid directory/file
+	     return undef;
+	}
+    }
+}
+
+sub PathCombine($$) {
+    my ($Base,$Name) = @_;
+    my $AbsName;
+
+    if ($Is_MacOS) {
+	# $Name is the resolved symlink (always a full path on MacOS),
+	# i.e. there's no need to call contract_name_Mac()
+	$AbsName = $Name;
+
+	# (simple) check for recursion
+	if ( ( $Base =~ /^$AbsName/) && (-d $AbsName) ) { # recursion
+	    return undef;
+	}
+    }
+    else {
+	if (substr($Name,0,1) eq '/') {
+	    $AbsName= $Name;
+	}
+	else {
+	    $AbsName= contract_name($Base,$Name);
+	}
+
+	# (simple) check for recursion
+	my $newlen= length($AbsName);
+	if ($newlen <= length($Base)) {
+	    if (($newlen == length($Base) || substr($Base,$newlen,1) eq '/')
+		&& $AbsName eq substr($Base,0,$newlen))
+	    {
+		return undef;
+	    }
+	}
+    }
+    return $AbsName;
+}
+
+sub Follow_SymLink($) {
+    my ($AbsName) = @_;
+
+    my ($NewName,$DEV, $INO);
+    ($DEV, $INO)= lstat $AbsName;
+
+    while (-l _) {
+	if ($SLnkSeen{$DEV, $INO}++) {
+	    if ($follow_skip < 2) {
+		die "$AbsName is encountered a second time";
+	    }
+	    else {
+		return undef;
+	    }
+	}
+	$NewName= PathCombine($AbsName, readlink($AbsName));
+	unless(defined $NewName) {
+	    if ($follow_skip < 2) {
+		die "$AbsName is a recursive symbolic link";
+	    }
+	    else {
+		return undef;
+	    }
+	}
+	else {
+	    $AbsName= $NewName;
+	}
+	($DEV, $INO) = lstat($AbsName);
+	return undef unless defined $DEV;  #  dangling symbolic link
+    }
+
+    if ($full_check && defined $DEV && $SLnkSeen{$DEV, $INO}++) {
+	if ( ($follow_skip < 1) || ((-d _) && ($follow_skip < 2)) ) {
+	    die "$AbsName encountered a second time";
+	}
+	else {
+	    return undef;
+	}
+    }
+
+    return $AbsName;
+}
+
+our($dir, $name, $fullname, $prune);
+sub _find_dir_symlnk($$$);
+sub _find_dir($$$);
+
+# check whether or not a scalar variable is tainted
+# (code straight from the Camel, 3rd ed., page 561)
+sub is_tainted_pp {
+    my $arg = shift;
+    my $nada = substr($arg, 0, 0); # zero-length
+    local $@;
+    eval { eval "# $nada" };
+    return length($@) != 0;
+}
+
+sub _find_opt {
+    my $wanted = shift;
+    die "invalid top directory" unless defined $_[0];
+
+    # This function must local()ize everything because callbacks may
+    # call find() or finddepth()
+
+    local %SLnkSeen;
+    local ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow,
+	$follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat,
+	$pre_process, $post_process, $dangling_symlinks);
+    local($dir, $name, $fullname, $prune);
+    local *_ = \my $a;
+
+    my $cwd            = $wanted->{bydepth} ? Cwd::fastcwd() : Cwd::getcwd();
+    my $cwd_untainted  = $cwd;
+    my $check_t_cwd    = 1;
+    $wanted_callback   = $wanted->{wanted};
+    $bydepth           = $wanted->{bydepth};
+    $pre_process       = $wanted->{preprocess};
+    $post_process      = $wanted->{postprocess};
+    $no_chdir          = $wanted->{no_chdir};
+    $full_check        = $^O eq 'MSWin32' ? 0 : $wanted->{follow};
+    $follow            = $^O eq 'MSWin32' ? 0 :
+                             $full_check || $wanted->{follow_fast};
+    $follow_skip       = $wanted->{follow_skip};
+    $untaint           = $wanted->{untaint};
+    $untaint_pat       = $wanted->{untaint_pattern};
+    $untaint_skip      = $wanted->{untaint_skip};
+    $dangling_symlinks = $wanted->{dangling_symlinks};
+
+    # for compatibility reasons (find.pl, find2perl)
+    local our ($topdir, $topdev, $topino, $topmode, $topnlink);
+
+    # a symbolic link to a directory doesn't increase the link count
+    $avoid_nlink      = $follow || $File::Find::dont_use_nlink;
+
+    my ($abs_dir, $Is_Dir);
+
+    Proc_Top_Item:
+    foreach my $TOP (@_) {
+	my $top_item = $TOP;
+
+	($topdev,$topino,$topmode,$topnlink) = $follow ? stat $top_item : lstat $top_item;
+
+	if ($Is_MacOS) {
+	    $top_item = ":$top_item"
+		if ( (-d _) && ( $top_item !~ /:/ ) );
+	} elsif ($^O eq 'MSWin32') {
+	    $top_item =~ s|/\z|| unless $top_item =~ m|\w:/$|;
+	}
+	else {
+	    $top_item =~ s|/\z|| unless $top_item eq '/';
+	}
+
+	$Is_Dir= 0;
+
+	if ($follow) {
+
+	    if ($Is_MacOS) {
+		$cwd = "$cwd:" unless ($cwd =~ /:$/); # for safety
+
+		if ($top_item eq $File::Find::current_dir) {
+		    $abs_dir = $cwd;
+		}
+		else {
+		    $abs_dir = contract_name_Mac($cwd, $top_item);
+		    unless (defined $abs_dir) {
+			warnings::warnif "Can't determine absolute path for $top_item (No such file or directory)\n";
+			next Proc_Top_Item;
+		    }
+		}
+
+	    }
+	    else {
+		if (substr($top_item,0,1) eq '/') {
+		    $abs_dir = $top_item;
+		}
+		elsif ($top_item eq $File::Find::current_dir) {
+		    $abs_dir = $cwd;
+		}
+		else {  # care about any  ../
+		    $abs_dir = contract_name("$cwd/",$top_item);
+		}
+	    }
+	    $abs_dir= Follow_SymLink($abs_dir);
+	    unless (defined $abs_dir) {
+		if ($dangling_symlinks) {
+		    if (ref $dangling_symlinks eq 'CODE') {
+			$dangling_symlinks->($top_item, $cwd);
+		    } else {
+			warnings::warnif "$top_item is a dangling symbolic link\n";
+		    }
+		}
+		next Proc_Top_Item;
+	    }
+
+	    if (-d _) {
+		_find_dir_symlnk($wanted, $abs_dir, $top_item);
+		$Is_Dir= 1;
+	    }
+	}
+	else { # no follow
+	    $topdir = $top_item;
+	    unless (defined $topnlink) {
+		warnings::warnif "Can't stat $top_item: $!\n";
+		next Proc_Top_Item;
+	    }
+	    if (-d _) {
+		$top_item =~ s/\.dir\z//i if $Is_VMS;
+		_find_dir($wanted, $top_item, $topnlink);
+		$Is_Dir= 1;
+	    }
+	    else {
+		$abs_dir= $top_item;
+	    }
+	}
+
+	unless ($Is_Dir) {
+	    unless (($_,$dir) = File::Basename::fileparse($abs_dir)) {
+		if ($Is_MacOS) {
+		    ($dir,$_) = (':', $top_item); # $File::Find::dir, $_
+		}
+		else {
+		    ($dir,$_) = ('./', $top_item);
+		}
+	    }
+
+	    $abs_dir = $dir;
+	    if (( $untaint ) && (is_tainted($dir) )) {
+		( $abs_dir ) = $dir =~ m|$untaint_pat|;
+		unless (defined $abs_dir) {
+		    if ($untaint_skip == 0) {
+			die "directory $dir is still tainted";
+		    }
+		    else {
+			next Proc_Top_Item;
+		    }
+		}
+	    }
+
+	    unless ($no_chdir || chdir $abs_dir) {
+		warnings::warnif "Couldn't chdir $abs_dir: $!\n";
+		next Proc_Top_Item;
+	    }
+
+	    $name = $abs_dir . $_; # $File::Find::name
+	    $_ = $name if $no_chdir;
+
+	    { $wanted_callback->() }; # protect against wild "next"
+
+	}
+
+	unless ( $no_chdir ) {
+	    if ( ($check_t_cwd) && (($untaint) && (is_tainted($cwd) )) ) {
+		( $cwd_untainted ) = $cwd =~ m|$untaint_pat|;
+		unless (defined $cwd_untainted) {
+		    die "insecure cwd in find(depth)";
+		}
+		$check_t_cwd = 0;
+	    }
+	    unless (chdir $cwd_untainted) {
+		die "Can't cd to $cwd: $!\n";
+	    }
+	}
+    }
+}
+
+# API:
+#  $wanted
+#  $p_dir :  "parent directory"
+#  $nlink :  what came back from the stat
+# preconditions:
+#  chdir (if not no_chdir) to dir
+
+sub _find_dir($$$) {
+    my ($wanted, $p_dir, $nlink) = @_;
+    my ($CdLvl,$Level) = (0,0);
+    my @Stack;
+    my @filenames;
+    my ($subcount,$sub_nlink);
+    my $SE= [];
+    my $dir_name= $p_dir;
+    my $dir_pref;
+    my $dir_rel = $File::Find::current_dir;
+    my $tainted = 0;
+    my $no_nlink;
+
+    if ($Is_MacOS) {
+	$dir_pref= ($p_dir =~ /:$/) ? $p_dir : "$p_dir:"; # preface
+    } elsif ($^O eq 'MSWin32') {
+	$dir_pref = ($p_dir =~ m|\w:/$| ? $p_dir : "$p_dir/" );
+    }
+    else {
+	$dir_pref= ( $p_dir eq '/' ? '/' : "$p_dir/" );
+    }
+
+    local ($dir, $name, $prune, *DIR);
+
+    unless ( $no_chdir || ($p_dir eq $File::Find::current_dir)) {
+	my $udir = $p_dir;
+	if (( $untaint ) && (is_tainted($p_dir) )) {
+	    ( $udir ) = $p_dir =~ m|$untaint_pat|;
+	    unless (defined $udir) {
+		if ($untaint_skip == 0) {
+		    die "directory $p_dir is still tainted";
+		}
+		else {
+		    return;
+		}
+	    }
+	}
+	unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) {
+	    warnings::warnif "Can't cd to $udir: $!\n";
+	    return;
+	}
+    }
+
+    # push the starting directory
+    push @Stack,[$CdLvl,$p_dir,$dir_rel,-1]  if  $bydepth;
+
+    if ($Is_MacOS) {
+	$p_dir = $dir_pref;  # ensure trailing ':'
+    }
+
+    while (defined $SE) {
+	unless ($bydepth) {
+	    $dir= $p_dir; # $File::Find::dir
+	    $name= $dir_name; # $File::Find::name
+	    $_= ($no_chdir ? $dir_name : $dir_rel ); # $_
+	    # prune may happen here
+	    $prune= 0;
+	    { $wanted_callback->() };	# protect against wild "next"
+	    next if $prune;
+	}
+
+	# change to that directory
+	unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
+	    my $udir= $dir_rel;
+	    if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_rel) )) ) {
+		( $udir ) = $dir_rel =~ m|$untaint_pat|;
+		unless (defined $udir) {
+		    if ($untaint_skip == 0) {
+			if ($Is_MacOS) {
+			    die "directory ($p_dir) $dir_rel is still tainted";
+			}
+			else {
+			    die "directory (" . ($p_dir ne '/' ? $p_dir : '') . "/) $dir_rel is still tainted";
+			}
+		    } else { # $untaint_skip == 1
+			next;
+		    }
+		}
+	    }
+	    unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) {
+		if ($Is_MacOS) {
+		    warnings::warnif "Can't cd to ($p_dir) $udir: $!\n";
+		}
+		else {
+		    warnings::warnif "Can't cd to (" .
+			($p_dir ne '/' ? $p_dir : '') . "/) $udir: $!\n";
+		}
+		next;
+	    }
+	    $CdLvl++;
+	}
+
+	if ($Is_MacOS) {
+	    $dir_name = "$dir_name:" unless ($dir_name =~ /:$/);
+	}
+
+	$dir= $dir_name; # $File::Find::dir
+
+	# Get the list of files in the current directory.
+	unless (opendir DIR, ($no_chdir ? $dir_name : $File::Find::current_dir)) {
+	    warnings::warnif "Can't opendir($dir_name): $!\n";
+	    next;
+	}
+	@filenames = readdir DIR;
+	closedir(DIR);
+	@filenames = $pre_process->(@filenames) if $pre_process;
+	push @Stack,[$CdLvl,$dir_name,"",-2]   if $post_process;
+
+	# default: use whatever was specifid
+        # (if $nlink >= 2, and $avoid_nlink == 0, this will switch back)
+        $no_nlink = $avoid_nlink;
+        # if dir has wrong nlink count, force switch to slower stat method
+        $no_nlink = 1 if ($nlink < 2);
+
+	if ($nlink == 2 && !$no_nlink) {
+	    # This dir has no subdirectories.
+	    for my $FN (@filenames) {
+		next if $FN =~ $File::Find::skip_pattern;
+		
+		$name = $dir_pref . $FN; # $File::Find::name
+		$_ = ($no_chdir ? $name : $FN); # $_
+		{ $wanted_callback->() }; # protect against wild "next"
+	    }
+
+	}
+	else {
+	    # This dir has subdirectories.
+	    $subcount = $nlink - 2;
+
+	    # HACK: insert directories at this position. so as to preserve
+	    # the user pre-processed ordering of files.
+	    # EG: directory traversal is in user sorted order, not at random.
+            my $stack_top = @Stack;
+
+	    for my $FN (@filenames) {
+		next if $FN =~ $File::Find::skip_pattern;
+		if ($subcount > 0 || $no_nlink) {
+		    # Seen all the subdirs?
+		    # check for directoriness.
+		    # stat is faster for a file in the current directory
+		    $sub_nlink = (lstat ($no_chdir ? $dir_pref . $FN : $FN))[3];
+
+		    if (-d _) {
+			--$subcount;
+			$FN =~ s/\.dir\z//i if $Is_VMS;
+			# HACK: replace push to preserve dir traversal order
+			#push @Stack,[$CdLvl,$dir_name,$FN,$sub_nlink];
+			splice @Stack, $stack_top, 0,
+			         [$CdLvl,$dir_name,$FN,$sub_nlink];
+		    }
+		    else {
+			$name = $dir_pref . $FN; # $File::Find::name
+			$_= ($no_chdir ? $name : $FN); # $_
+			{ $wanted_callback->() }; # protect against wild "next"
+		    }
+		}
+		else {
+		    $name = $dir_pref . $FN; # $File::Find::name
+		    $_= ($no_chdir ? $name : $FN); # $_
+		    { $wanted_callback->() }; # protect against wild "next"
+		}
+	    }
+	}
+    }
+    continue {
+	while ( defined ($SE = pop @Stack) ) {
+	    ($Level, $p_dir, $dir_rel, $nlink) = @$SE;
+	    if ($CdLvl > $Level && !$no_chdir) {
+		my $tmp;
+		if ($Is_MacOS) {
+		    $tmp = (':' x ($CdLvl-$Level)) . ':';
+		}
+		else {
+		    $tmp = join('/',('..') x ($CdLvl-$Level));
+		}
+		die "Can't cd to $dir_name" . $tmp
+		    unless chdir ($tmp);
+		$CdLvl = $Level;
+	    }
+
+	    if ($Is_MacOS) {
+		# $pdir always has a trailing ':', except for the starting dir,
+		# where $dir_rel eq ':'
+		$dir_name = "$p_dir$dir_rel";
+		$dir_pref = "$dir_name:";
+	    }
+	    elsif ($^O eq 'MSWin32') {
+		$dir_name = ($p_dir =~ m|\w:/$| ? "$p_dir$dir_rel" : "$p_dir/$dir_rel");
+		$dir_pref = "$dir_name/";
+	    }
+	    else {
+		$dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel");
+		$dir_pref = "$dir_name/";
+	    }
+
+	    if ( $nlink == -2 ) {
+		$name = $dir = $p_dir; # $File::Find::name / dir
+                $_ = $File::Find::current_dir;
+		$post_process->();		# End-of-directory processing
+	    }
+	    elsif ( $nlink < 0 ) {  # must be finddepth, report dirname now
+		$name = $dir_name;
+		if ($Is_MacOS) {
+		    if ($dir_rel eq ':') { # must be the top dir, where we started
+			$name =~ s|:$||; # $File::Find::name
+			$p_dir = "$p_dir:" unless ($p_dir =~ /:$/);
+		    }
+		    $dir = $p_dir; # $File::Find::dir
+		    $_ = ($no_chdir ? $name : $dir_rel); # $_
+		}
+		else {
+		    if ( substr($name,-2) eq '/.' ) {
+			substr($name, length($name) == 2 ? -1 : -2) = '';
+		    }
+		    $dir = $p_dir;
+		    $_ = ($no_chdir ? $dir_name : $dir_rel );
+		    if ( substr($_,-2) eq '/.' ) {
+			substr($_, length($_) == 2 ? -1 : -2) = '';
+		    }
+		}
+		{ $wanted_callback->() }; # protect against wild "next"
+	     }
+	     else {
+		push @Stack,[$CdLvl,$p_dir,$dir_rel,-1]  if  $bydepth;
+		last;
+	    }
+	}
+    }
+}
+
+
+# API:
+#  $wanted
+#  $dir_loc : absolute location of a dir
+#  $p_dir   : "parent directory"
+# preconditions:
+#  chdir (if not no_chdir) to dir
+
+sub _find_dir_symlnk($$$) {
+    my ($wanted, $dir_loc, $p_dir) = @_; # $dir_loc is the absolute directory
+    my @Stack;
+    my @filenames;
+    my $new_loc;
+    my $updir_loc = $dir_loc; # untainted parent directory
+    my $SE = [];
+    my $dir_name = $p_dir;
+    my $dir_pref;
+    my $loc_pref;
+    my $dir_rel = $File::Find::current_dir;
+    my $byd_flag; # flag for pending stack entry if $bydepth
+    my $tainted = 0;
+    my $ok = 1;
+
+    if ($Is_MacOS) {
+	$dir_pref = ($p_dir =~ /:$/) ? "$p_dir" : "$p_dir:";
+	$loc_pref = ($dir_loc =~ /:$/) ? "$dir_loc" : "$dir_loc:";
+    } else {
+	$dir_pref = ( $p_dir   eq '/' ? '/' : "$p_dir/" );
+	$loc_pref = ( $dir_loc eq '/' ? '/' : "$dir_loc/" );
+    }
+
+    local ($dir, $name, $fullname, $prune, *DIR);
+
+    unless ($no_chdir) {
+	# untaint the topdir
+	if (( $untaint ) && (is_tainted($dir_loc) )) {
+	    ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; # parent dir, now untainted
+	     # once untainted, $updir_loc is pushed on the stack (as parent directory);
+	    # hence, we don't need to untaint the parent directory every time we chdir
+	    # to it later
+	    unless (defined $updir_loc) {
+		if ($untaint_skip == 0) {
+		    die "directory $dir_loc is still tainted";
+		}
+		else {
+		    return;
+		}
+	    }
+	}
+	$ok = chdir($updir_loc) unless ($p_dir eq $File::Find::current_dir);
+	unless ($ok) {
+	    warnings::warnif "Can't cd to $updir_loc: $!\n";
+	    return;
+	}
+    }
+
+    push @Stack,[$dir_loc,$updir_loc,$p_dir,$dir_rel,-1]  if  $bydepth;
+
+    if ($Is_MacOS) {
+	$p_dir = $dir_pref; # ensure trailing ':'
+    }
+
+    while (defined $SE) {
+
+	unless ($bydepth) {
+	    # change (back) to parent directory (always untainted)
+	    unless ($no_chdir) {
+		unless (chdir $updir_loc) {
+		    warnings::warnif "Can't cd to $updir_loc: $!\n";
+		    next;
+		}
+	    }
+	    $dir= $p_dir; # $File::Find::dir
+	    $name= $dir_name; # $File::Find::name
+	    $_= ($no_chdir ? $dir_name : $dir_rel ); # $_
+	    $fullname= $dir_loc; # $File::Find::fullname
+	    # prune may happen here
+	    $prune= 0;
+	    lstat($_); # make sure  file tests with '_' work
+	    { $wanted_callback->() }; # protect against wild "next"
+	    next if $prune;
+	}
+
+	# change to that directory
+	unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
+	    $updir_loc = $dir_loc;
+	    if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_loc) )) ) {
+		# untaint $dir_loc, what will be pushed on the stack as (untainted) parent dir
+		( $updir_loc ) = $dir_loc =~ m|$untaint_pat|;
+		unless (defined $updir_loc) {
+		    if ($untaint_skip == 0) {
+			die "directory $dir_loc is still tainted";
+		    }
+		    else {
+			next;
+		    }
+		}
+	    }
+	    unless (chdir $updir_loc) {
+		warnings::warnif "Can't cd to $updir_loc: $!\n";
+		next;
+	    }
+	}
+
+	if ($Is_MacOS) {
+	    $dir_name = "$dir_name:" unless ($dir_name =~ /:$/);
+	}
+
+	$dir = $dir_name; # $File::Find::dir
+
+	# Get the list of files in the current directory.
+	unless (opendir DIR, ($no_chdir ? $dir_loc : $File::Find::current_dir)) {
+	    warnings::warnif "Can't opendir($dir_loc): $!\n";
+	    next;
+	}
+	@filenames = readdir DIR;
+	closedir(DIR);
+
+	for my $FN (@filenames) {
+	    next if $FN =~ $File::Find::skip_pattern;
+
+	    # follow symbolic links / do an lstat
+	    $new_loc = Follow_SymLink($loc_pref.$FN);
+
+	    # ignore if invalid symlink
+	    unless (defined $new_loc) {
+	        if ($dangling_symlinks) {
+	            if (ref $dangling_symlinks eq 'CODE') {
+	                $dangling_symlinks->($FN, $dir_pref);
+	            } else {
+	                warnings::warnif "$dir_pref$FN is a dangling symbolic link\n";
+	            }
+	        }
+
+	        $fullname = undef;
+	        $name = $dir_pref . $FN;
+	        $_ = ($no_chdir ? $name : $FN);
+	        { $wanted_callback->() };
+	        next;
+	    }
+
+	    if (-d _) {
+		push @Stack,[$new_loc,$updir_loc,$dir_name,$FN,1];
+	    }
+	    else {
+		$fullname = $new_loc; # $File::Find::fullname
+		$name = $dir_pref . $FN; # $File::Find::name
+		$_ = ($no_chdir ? $name : $FN); # $_
+		{ $wanted_callback->() }; # protect against wild "next"
+	    }
+	}
+
+    }
+    continue {
+	while (defined($SE = pop @Stack)) {
+	    ($dir_loc, $updir_loc, $p_dir, $dir_rel, $byd_flag) = @$SE;
+	    if ($Is_MacOS) {
+		# $p_dir always has a trailing ':', except for the starting dir,
+		# where $dir_rel eq ':'
+		$dir_name = "$p_dir$dir_rel";
+		$dir_pref = "$dir_name:";
+		$loc_pref = ($dir_loc =~ /:$/) ? $dir_loc : "$dir_loc:";
+	    }
+	    else {
+		$dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel");
+		$dir_pref = "$dir_name/";
+		$loc_pref = "$dir_loc/";
+	    }
+	    if ( $byd_flag < 0 ) {  # must be finddepth, report dirname now
+		unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) {
+		    unless (chdir $updir_loc) { # $updir_loc (parent dir) is always untainted
+			warnings::warnif "Can't cd to $updir_loc: $!\n";
+			next;
+		    }
+		}
+		$fullname = $dir_loc; # $File::Find::fullname
+		$name = $dir_name; # $File::Find::name
+		if ($Is_MacOS) {
+		    if ($dir_rel eq ':') { # must be the top dir, where we started
+			$name =~ s|:$||; # $File::Find::name
+			$p_dir = "$p_dir:" unless ($p_dir =~ /:$/);
+		    }
+		    $dir = $p_dir; # $File::Find::dir
+		     $_ = ($no_chdir ? $name : $dir_rel); # $_
+		}
+		else {
+		    if ( substr($name,-2) eq '/.' ) {
+			substr($name, length($name) == 2 ? -1 : -2) = ''; # $File::Find::name
+		    }
+		    $dir = $p_dir; # $File::Find::dir
+		    $_ = ($no_chdir ? $dir_name : $dir_rel); # $_
+		    if ( substr($_,-2) eq '/.' ) {
+			substr($_, length($_) == 2 ? -1 : -2) = '';
+		    }
+		}
+
+		lstat($_); # make sure file tests with '_' work
+		{ $wanted_callback->() }; # protect against wild "next"
+	    }
+	    else {
+		push @Stack,[$dir_loc, $updir_loc, $p_dir, $dir_rel,-1]  if  $bydepth;
+		last;
+	    }
+	}
+    }
+}
+
+
+sub wrap_wanted {
+    my $wanted = shift;
+    if ( ref($wanted) eq 'HASH' ) {
+	if ( $wanted->{follow} || $wanted->{follow_fast}) {
+	    $wanted->{follow_skip} = 1 unless defined $wanted->{follow_skip};
+	}
+	if ( $wanted->{untaint} ) {
+	    $wanted->{untaint_pattern} = $File::Find::untaint_pattern
+		unless defined $wanted->{untaint_pattern};
+	    $wanted->{untaint_skip} = 0 unless defined $wanted->{untaint_skip};
+	}
+	return $wanted;
+    }
+    else {
+	return { wanted => $wanted };
+    }
+}
+
+sub find {
+    my $wanted = shift;
+    _find_opt(wrap_wanted($wanted), @_);
+}
+
+sub finddepth {
+    my $wanted = wrap_wanted(shift);
+    $wanted->{bydepth} = 1;
+    _find_opt($wanted, @_);
+}
+
+# default
+$File::Find::skip_pattern    = qr/^\.{1,2}\z/;
+$File::Find::untaint_pattern = qr|^([-+@\w./]+)$|;
+
+# These are hard-coded for now, but may move to hint files.
+if ($^O eq 'VMS') {
+    $Is_VMS = 1;
+    $File::Find::dont_use_nlink  = 1;
+}
+elsif ($^O eq 'MacOS') {
+    $Is_MacOS = 1;
+    $File::Find::dont_use_nlink  = 1;
+    $File::Find::skip_pattern    = qr/^Icon\015\z/;
+    $File::Find::untaint_pattern = qr|^(.+)$|;
+}
+
+# this _should_ work properly on all platforms
+# where File::Find can be expected to work
+$File::Find::current_dir = File::Spec->curdir || '.';
+
+$File::Find::dont_use_nlink = 1
+    if $^O eq 'os2' || $^O eq 'dos' || $^O eq 'amigaos' || $^O eq 'MSWin32' ||
+       $^O eq 'interix' || $^O eq 'cygwin' || $^O eq 'epoc' || $^O eq 'qnx' ||
+	   $^O eq 'nto';
+
+# Set dont_use_nlink in your hint file if your system's stat doesn't
+# report the number of links in a directory as an indication
+# of the number of files.
+# See, e.g. hints/machten.sh for MachTen 2.2.
+unless ($File::Find::dont_use_nlink) {
+    require Config;
+    $File::Find::dont_use_nlink = 1 if ($Config::Config{'dont_use_nlink'});
+}
+
+# We need a function that checks if a scalar is tainted. Either use the
+# Scalar::Util module's tainted() function or our (slower) pure Perl
+# fallback is_tainted_pp()
+{
+    local $@;
+    eval { require Scalar::Util };
+    *is_tainted = $@ ? \&is_tainted_pp : \&Scalar::Util::tainted;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Glob.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Glob.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Glob.pm	(revision 14489)
@@ -0,0 +1,496 @@
+package File::Glob;
+
+use strict;
+our($VERSION, @ISA, @EXPORT_OK, @EXPORT_FAIL, %EXPORT_TAGS,
+    $AUTOLOAD, $DEFAULT_FLAGS);
+
+use XSLoader ();
+
+@ISA = qw(Exporter);
+
+# NOTE: The glob() export is only here for compatibility with 5.6.0.
+# csh_glob() should not be used directly, unless you know what you're doing.
+
+@EXPORT_OK   = qw(
+    csh_glob
+    bsd_glob
+    glob
+    GLOB_ABEND
+    GLOB_ALPHASORT
+    GLOB_ALTDIRFUNC
+    GLOB_BRACE
+    GLOB_CSH
+    GLOB_ERR
+    GLOB_ERROR
+    GLOB_LIMIT
+    GLOB_MARK
+    GLOB_NOCASE
+    GLOB_NOCHECK
+    GLOB_NOMAGIC
+    GLOB_NOSORT
+    GLOB_NOSPACE
+    GLOB_QUOTE
+    GLOB_TILDE
+);
+
+%EXPORT_TAGS = (
+    'glob' => [ qw(
+        GLOB_ABEND
+	GLOB_ALPHASORT
+        GLOB_ALTDIRFUNC
+        GLOB_BRACE
+        GLOB_CSH
+        GLOB_ERR
+        GLOB_ERROR
+        GLOB_LIMIT
+        GLOB_MARK
+        GLOB_NOCASE
+        GLOB_NOCHECK
+        GLOB_NOMAGIC
+        GLOB_NOSORT
+        GLOB_NOSPACE
+        GLOB_QUOTE
+        GLOB_TILDE
+        glob
+        bsd_glob
+    ) ],
+);
+
+$VERSION = '1.05';
+
+sub import {
+    require Exporter;
+    my $i = 1;
+    while ($i < @_) {
+	if ($_[$i] =~ /^:(case|nocase|globally)$/) {
+	    splice(@_, $i, 1);
+	    $DEFAULT_FLAGS &= ~GLOB_NOCASE() if $1 eq 'case';
+	    $DEFAULT_FLAGS |= GLOB_NOCASE() if $1 eq 'nocase';
+	    if ($1 eq 'globally') {
+		local $^W;
+		*CORE::GLOBAL::glob = \&File::Glob::csh_glob;
+	    }
+	    next;
+	}
+	++$i;
+    }
+    goto &Exporter::import;
+}
+
+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/.*:://;
+    my ($error, $val) = constant($constname);
+    if ($error) {
+	require Carp;
+	Carp::croak($error);
+    }
+    eval "sub $AUTOLOAD { $val }";
+    goto &$AUTOLOAD;
+}
+
+XSLoader::load 'File::Glob', $VERSION;
+
+# Preloaded methods go here.
+
+sub GLOB_ERROR {
+    return (constant('GLOB_ERROR'))[1];
+}
+
+sub GLOB_CSH () {
+    GLOB_BRACE()
+	| GLOB_NOMAGIC()
+	| GLOB_QUOTE()
+	| GLOB_TILDE()
+	| GLOB_ALPHASORT()
+}
+
+$DEFAULT_FLAGS = GLOB_CSH();
+if ($^O =~ /^(?:MSWin32|VMS|os2|dos|riscos|MacOS)$/) {
+    $DEFAULT_FLAGS |= GLOB_NOCASE();
+}
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+sub bsd_glob {
+    my ($pat,$flags) = @_;
+    $flags = $DEFAULT_FLAGS if @_ < 2;
+    return doglob($pat,$flags);
+}
+
+# File::Glob::glob() is deprecated because its prototype is different from
+# CORE::glob() (use bsd_glob() instead)
+sub glob {
+    splice @_, 1; # don't pass PL_glob_index as flags!
+    goto &bsd_glob;
+}
+
+## borrowed heavily from gsar's File::DosGlob
+my %iter;
+my %entries;
+
+sub csh_glob {
+    my $pat = shift;
+    my $cxix = shift;
+    my @pat;
+
+    # glob without args defaults to $_
+    $pat = $_ unless defined $pat;
+
+    # extract patterns
+    $pat =~ s/^\s+//;	# Protect against empty elements in
+    $pat =~ s/\s+$//;	# things like < *.c> and <*.c >.
+			# These alone shouldn't trigger ParseWords.
+    if ($pat =~ /\s/) {
+        # XXX this is needed for compatibility with the csh
+	# implementation in Perl.  Need to support a flag
+	# to disable this behavior.
+	require Text::ParseWords;
+	@pat = Text::ParseWords::parse_line('\s+',0,$pat);
+    }
+
+    # assume global context if not provided one
+    $cxix = '_G_' unless defined $cxix;
+    $iter{$cxix} = 0 unless exists $iter{$cxix};
+
+    # if we're just beginning, do it all first
+    if ($iter{$cxix} == 0) {
+	if (@pat) {
+	    $entries{$cxix} = [ map { doglob($_, $DEFAULT_FLAGS) } @pat ];
+	}
+	else {
+	    $entries{$cxix} = [ doglob($pat, $DEFAULT_FLAGS) ];
+	}
+    }
+
+    # chuck it all out, quick or slow
+    if (wantarray) {
+        delete $iter{$cxix};
+        return @{delete $entries{$cxix}};
+    }
+    else {
+        if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
+            return shift @{$entries{$cxix}};
+        }
+        else {
+            # return undef for EOL
+            delete $iter{$cxix};
+            delete $entries{$cxix};
+            return undef;
+        }
+    }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+File::Glob - Perl extension for BSD glob routine
+
+=head1 SYNOPSIS
+
+  use File::Glob ':glob';
+
+  @list = bsd_glob('*.[ch]');
+  $homedir = bsd_glob('~gnat', GLOB_TILDE | GLOB_ERR);
+
+  if (GLOB_ERROR) {
+    # an error occurred reading $homedir
+  }
+
+  ## override the core glob (CORE::glob() does this automatically
+  ## by default anyway, since v5.6.0)
+  use File::Glob ':globally';
+  my @sources = <*.{c,h,y}>;
+
+  ## override the core glob, forcing case sensitivity
+  use File::Glob qw(:globally :case);
+  my @sources = <*.{c,h,y}>;
+
+  ## override the core glob forcing case insensitivity
+  use File::Glob qw(:globally :nocase);
+  my @sources = <*.{c,h,y}>;
+
+  ## glob on all files in home directory
+  use File::Glob ':globally';
+  my @sources = <~gnat/*>;
+
+=head1 DESCRIPTION
+
+The glob angle-bracket operator C<< <> >> is a pathname generator that
+implements the rules for file name pattern matching used by Unix-like shells
+such as the Bourne shell or C shell.
+
+File::Glob::bsd_glob() implements the FreeBSD glob(3) routine, which is
+a superset of the POSIX glob() (described in IEEE Std 1003.2 "POSIX.2").
+bsd_glob() takes a mandatory C<pattern> argument, and an optional
+C<flags> argument, and returns a list of filenames matching the
+pattern, with interpretation of the pattern modified by the C<flags>
+variable.
+
+Since v5.6.0, Perl's CORE::glob() is implemented in terms of bsd_glob().
+Note that they don't share the same prototype--CORE::glob() only accepts
+a single argument.  Due to historical reasons, CORE::glob() will also
+split its argument on whitespace, treating it as multiple patterns,
+whereas bsd_glob() considers them as one pattern.
+
+=head2 META CHARACTERS
+
+  \       Quote the next metacharacter
+  []      Character class
+  {}      Multiple pattern
+  *       Match any string of characters
+  ?       Match any single character
+  ~       User name home directory
+
+The metanotation C<a{b,c,d}e> is a shorthand for C<abe ace ade>.  Left to
+right order is preserved, with results of matches being sorted separately
+at a low level to preserve this order. As a special case C<{>, C<}>, and
+C<{}> are passed undisturbed.
+
+=head2 POSIX FLAGS
+
+The POSIX defined flags for bsd_glob() are:
+
+=over 4
+
+=item C<GLOB_ERR>
+
+Force bsd_glob() to return an error when it encounters a directory it
+cannot open or read.  Ordinarily bsd_glob() continues to find matches.
+
+=item C<GLOB_LIMIT>
+
+Make bsd_glob() return an error (GLOB_NOSPACE) when the pattern expands
+to a size bigger than the system constant C<ARG_MAX> (usually found in
+limits.h).  If your system does not define this constant, bsd_glob() uses
+C<sysconf(_SC_ARG_MAX)> or C<_POSIX_ARG_MAX> where available (in that
+order).  You can inspect these values using the standard C<POSIX>
+extension.
+
+=item C<GLOB_MARK>
+
+Each pathname that is a directory that matches the pattern has a slash
+appended.
+
+=item C<GLOB_NOCASE>
+
+By default, file names are assumed to be case sensitive; this flag
+makes bsd_glob() treat case differences as not significant.
+
+=item C<GLOB_NOCHECK>
+
+If the pattern does not match any pathname, then bsd_glob() returns a list
+consisting of only the pattern.  If C<GLOB_QUOTE> is set, its effect
+is present in the pattern returned.
+
+=item C<GLOB_NOSORT>
+
+By default, the pathnames are sorted in ascending ASCII order; this
+flag prevents that sorting (speeding up bsd_glob()).
+
+=back
+
+The FreeBSD extensions to the POSIX standard are the following flags:
+
+=over 4
+
+=item C<GLOB_BRACE>
+
+Pre-process the string to expand C<{pat,pat,...}> strings like csh(1).
+The pattern '{}' is left unexpanded for historical reasons (and csh(1)
+does the same thing to ease typing of find(1) patterns).
+
+=item C<GLOB_NOMAGIC>
+
+Same as C<GLOB_NOCHECK> but it only returns the pattern if it does not
+contain any of the special characters "*", "?" or "[".  C<NOMAGIC> is
+provided to simplify implementing the historic csh(1) globbing
+behaviour and should probably not be used anywhere else.
+
+=item C<GLOB_QUOTE>
+
+Use the backslash ('\') character for quoting: every occurrence of a
+backslash followed by a character in the pattern is replaced by that
+character, avoiding any special interpretation of the character.
+(But see below for exceptions on DOSISH systems).
+
+=item C<GLOB_TILDE>
+
+Expand patterns that start with '~' to user name home directories.
+
+=item C<GLOB_CSH>
+
+For convenience, C<GLOB_CSH> is a synonym for
+C<GLOB_BRACE | GLOB_NOMAGIC | GLOB_QUOTE | GLOB_TILDE | GLOB_ALPHASORT>.
+
+=back
+
+The POSIX provided C<GLOB_APPEND>, C<GLOB_DOOFFS>, and the FreeBSD
+extensions C<GLOB_ALTDIRFUNC>, and C<GLOB_MAGCHAR> flags have not been
+implemented in the Perl version because they involve more complex
+interaction with the underlying C structures.
+
+The following flag has been added in the Perl implementation for
+csh compatibility:
+
+=over 4
+
+=item C<GLOB_ALPHASORT>
+
+If C<GLOB_NOSORT> is not in effect, sort filenames is alphabetical
+order (case does not matter) rather than in ASCII order.
+
+=back
+
+=head1 DIAGNOSTICS
+
+bsd_glob() returns a list of matching paths, possibly zero length.  If an
+error occurred, &File::Glob::GLOB_ERROR will be non-zero and C<$!> will be
+set.  &File::Glob::GLOB_ERROR is guaranteed to be zero if no error occurred,
+or one of the following values otherwise:
+
+=over 4
+
+=item C<GLOB_NOSPACE>
+
+An attempt to allocate memory failed.
+
+=item C<GLOB_ABEND>
+
+The glob was stopped because an error was encountered.
+
+=back
+
+In the case where bsd_glob() has found some matching paths, but is
+interrupted by an error, it will return a list of filenames B<and>
+set &File::Glob::ERROR.
+
+Note that bsd_glob() deviates from POSIX and FreeBSD glob(3) behaviour
+by not considering C<ENOENT> and C<ENOTDIR> as errors - bsd_glob() will
+continue processing despite those errors, unless the C<GLOB_ERR> flag is
+set.
+
+Be aware that all filenames returned from File::Glob are tainted.
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+If you want to use multiple patterns, e.g. C<bsd_glob("a* b*")>, you should
+probably throw them in a set as in C<bsd_glob("{a*,b*}")>.  This is because
+the argument to bsd_glob() isn't subjected to parsing by the C shell.
+Remember that you can use a backslash to escape things.
+
+=item *
+
+On DOSISH systems, backslash is a valid directory separator character.
+In this case, use of backslash as a quoting character (via GLOB_QUOTE)
+interferes with the use of backslash as a directory separator. The
+best (simplest, most portable) solution is to use forward slashes for
+directory separators, and backslashes for quoting. However, this does
+not match "normal practice" on these systems. As a concession to user
+expectation, therefore, backslashes (under GLOB_QUOTE) only quote the
+glob metacharacters '[', ']', '{', '}', '-', '~', and backslash itself.
+All other backslashes are passed through unchanged.
+
+=item *
+
+Win32 users should use the real slash.  If you really want to use
+backslashes, consider using Sarathy's File::DosGlob, which comes with
+the standard Perl distribution.
+
+=item *
+
+Mac OS (Classic) users should note a few differences. Since
+Mac OS is not Unix, when the glob code encounters a tilde glob (e.g.
+~user) and the C<GLOB_TILDE> flag is used, it simply returns that
+pattern without doing any expansion.
+
+Glob on Mac OS is case-insensitive by default (if you don't use any
+flags). If you specify any flags at all and still want glob
+to be case-insensitive, you must include C<GLOB_NOCASE> in the flags.
+
+The path separator is ':' (aka colon), not '/' (aka slash). Mac OS users
+should be careful about specifying relative pathnames. While a full path
+always begins with a volume name, a relative pathname should always
+begin with a ':'.  If specifying a volume name only, a trailing ':' is
+required.
+
+The specification of pathnames in glob patterns adheres to the usual Mac
+OS conventions: The path separator is a colon ':', not a slash '/'. A
+full path always begins with a volume name. A relative pathname on Mac
+OS must always begin with a ':', except when specifying a file or
+directory name in the current working directory, where the leading colon
+is optional. If specifying a volume name only, a trailing ':' is
+required. Due to these rules, a glob like E<lt>*:E<gt> will find all
+mounted volumes, while a glob like E<lt>*E<gt> or E<lt>:*E<gt> will find
+all files and directories in the current directory.
+
+Note that updirs in the glob pattern are resolved before the matching begins,
+i.e. a pattern like "*HD:t?p::a*" will be matched as "*HD:a*". Note also,
+that a single trailing ':' in the pattern is ignored (unless it's a volume
+name pattern like "*HD:"), i.e. a glob like E<lt>:*:E<gt> will find both
+directories I<and> files (and not, as one might expect, only directories).
+You can, however, use the C<GLOB_MARK> flag to distinguish (without a file
+test) directory names from file names.
+
+If the C<GLOB_MARK> flag is set, all directory paths will have a ':' appended.
+Since a directory like 'lib:' is I<not> a valid I<relative> path on Mac OS,
+both a leading and a trailing colon will be added, when the directory name in
+question doesn't contain any colons (e.g. 'lib' becomes ':lib:').
+
+=back
+
+=head1 SEE ALSO
+
+L<perlfunc/glob>, glob(3)
+
+=head1 AUTHOR
+
+The Perl interface was written by Nathan Torkington E<lt>gnat@frii.comE<gt>,
+and is released under the artistic license.  Further modifications were
+made by Greg Bacon E<lt>gbacon@cs.uah.eduE<gt>, Gurusamy Sarathy
+E<lt>gsar@activestate.comE<gt>, and Thomas Wegner
+E<lt>wegner_thomas@yahoo.comE<gt>.  The C glob code has the
+following copyright:
+
+    Copyright (c) 1989, 1993 The Regents of the University of California.
+    All rights reserved.
+
+    This code is derived from software contributed to Berkeley by
+    Guido van Rossum.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions
+    are met:
+
+    1. Redistributions of source code must retain the above copyright
+       notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the distribution.
+    3. Neither the name of the University nor the names of its contributors
+       may be used to endorse or promote products derived from this software
+       without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+    SUCH DAMAGE.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Path.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Path.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Path.pm	(revision 14489)
@@ -0,0 +1,285 @@
+package File::Path;
+
+=head1 NAME
+
+File::Path - create or remove directory trees
+
+=head1 SYNOPSIS
+
+    use File::Path;
+
+    mkpath(['/foo/bar/baz', 'blurfl/quux'], 1, 0711);
+    rmtree(['foo/bar/baz', 'blurfl/quux'], 1, 1);
+
+=head1 DESCRIPTION
+
+The C<mkpath> function provides a convenient way to create directories, even
+if your C<mkdir> kernel call won't create more than one level of directory at
+a time.  C<mkpath> takes three arguments:
+
+=over 4
+
+=item *
+
+the name of the path to create, or a reference
+to a list of paths to create,
+
+=item *
+
+a boolean value, which if TRUE will cause C<mkpath>
+to print the name of each directory as it is created
+(defaults to FALSE), and
+
+=item *
+
+the numeric mode to use when creating the directories
+(defaults to 0777), to be modified by the current umask.
+
+=back
+
+It returns a list of all directories (including intermediates, determined
+using the Unix '/' separator) created.
+
+If a system error prevents a directory from being created, then the
+C<mkpath> function throws a fatal error with C<Carp::croak>. This error
+can be trapped with an C<eval> block:
+
+  eval { mkpath($dir) };
+  if ($@) {
+    print "Couldn't create $dir: $@";
+  }
+
+Similarly, the C<rmtree> function provides a convenient way to delete a
+subtree from the directory structure, much like the Unix command C<rm -r>.
+C<rmtree> takes three arguments:
+
+=over 4
+
+=item *
+
+the root of the subtree to delete, or a reference to
+a list of roots.  All of the files and directories
+below each root, as well as the roots themselves,
+will be deleted.
+
+=item *
+
+a boolean value, which if TRUE will cause C<rmtree> to
+print a message each time it examines a file, giving the
+name of the file, and indicating whether it's using C<rmdir>
+or C<unlink> to remove it, or that it's skipping it.
+(defaults to FALSE)
+
+=item *
+
+a boolean value, which if TRUE will cause C<rmtree> to
+skip any files to which you do not have delete access
+(if running under VMS) or write access (if running
+under another OS).  This will change in the future when
+a criterion for 'delete permission' under OSs other
+than VMS is settled.  (defaults to FALSE)
+
+=back
+
+It returns the number of files successfully deleted.  Symlinks are
+simply deleted and not followed.
+
+B<NOTE:> There are race conditions internal to the implementation of
+C<rmtree> making it unsafe to use on directory trees which may be
+altered or moved while C<rmtree> is running, and in particular on any
+directory trees with any path components or subdirectories potentially
+writable by untrusted users.
+
+Additionally, if the third parameter is not TRUE and C<rmtree> is
+interrupted, it may leave files and directories with permissions altered
+to allow deletion (and older versions of this module would even set
+files and directories to world-read/writable!)
+
+Note also that the occurrence of errors in C<rmtree> can be determined I<only>
+by trapping diagnostic messages using C<$SIG{__WARN__}>; it is not apparent
+from the return value.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item *
+
+On Windows, if C<mkpath> gives you the warning: B<No such file or
+directory>, this may mean that you've exceeded your filesystem's
+maximum path length.
+
+=back
+
+=head1 AUTHORS
+
+Tim Bunce <F<Tim.Bunce@ig.co.uk>> and
+Charles Bailey <F<bailey@newman.upenn.edu>>
+
+=cut
+
+use 5.006;
+use Carp;
+use File::Basename ();
+use Exporter ();
+use strict;
+use warnings;
+
+our $VERSION = "1.08";
+our @ISA = qw( Exporter );
+our @EXPORT = qw( mkpath rmtree );
+
+my $Is_VMS = $^O eq 'VMS';
+my $Is_MacOS = $^O eq 'MacOS';
+
+# These OSes complain if you want to remove a file that you have no
+# write permission to:
+my $force_writeable = ($^O eq 'os2' || $^O eq 'dos' || $^O eq 'MSWin32' ||
+		       $^O eq 'amigaos' || $^O eq 'MacOS' || $^O eq 'epoc');
+
+sub mkpath {
+    my($paths, $verbose, $mode) = @_;
+    # $paths   -- either a path string or ref to list of paths
+    # $verbose -- optional print "mkdir $path" for each directory created
+    # $mode    -- optional permissions, defaults to 0777
+    local($")=$Is_MacOS ? ":" : "/";
+    $mode = 0777 unless defined($mode);
+    $paths = [$paths] unless ref $paths;
+    my(@created,$path);
+    foreach $path (@$paths) {
+	$path .= '/' if $^O eq 'os2' and $path =~ /^\w:\z/s; # feature of CRT 
+	# Logic wants Unix paths, so go with the flow.
+	if ($Is_VMS) {
+	    next if $path eq '/';
+	    $path = VMS::Filespec::unixify($path);
+	    if ($path =~ m:^(/[^/]+)/?\z:) {
+	        $path = $1.'/000000';
+	    }
+	}
+	next if -d $path;
+	my $parent = File::Basename::dirname($path);
+	unless (-d $parent or $path eq $parent) {
+	    push(@created,mkpath($parent, $verbose, $mode));
+ 	}
+	print "mkdir $path\n" if $verbose;
+	unless (mkdir($path,$mode)) {
+	    my $e = $!;
+	    # allow for another process to have created it meanwhile
+	    $! = $e, croak ("mkdir $path: $e") unless -d $path;
+	}
+	push(@created, $path);
+    }
+    @created;
+}
+
+sub rmtree {
+    my($roots, $verbose, $safe) = @_;
+    my(@files);
+    my($count) = 0;
+    $verbose ||= 0;
+    $safe ||= 0;
+
+    if ( defined($roots) && length($roots) ) {
+      $roots = [$roots] unless ref $roots;
+    }
+    else {
+      carp "No root path(s) specified\n";
+      return 0;
+    }
+
+    my($root);
+    foreach $root (@{$roots}) {
+    	if ($Is_MacOS) {
+	    $root = ":$root" if $root !~ /:/;
+	    $root =~ s#([^:])\z#$1:#;
+	} else {
+	    $root =~ s#/\z##;
+	}
+	(undef, undef, my $rp) = lstat $root or next;
+	$rp &= 07777;	# don't forget setuid, setgid, sticky bits
+	if ( -d _ ) {
+	    # notabene: 0700 is for making readable in the first place,
+	    # it's also intended to change it to writable in case we have
+	    # to recurse in which case we are better than rm -rf for 
+	    # subtrees with strange permissions
+	    chmod($rp | 0700, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
+	      or carp "Can't make directory $root read+writeable: $!"
+		unless $safe;
+
+	    if (opendir my $d, $root) {
+		no strict 'refs';
+		if (!defined ${"\cTAINT"} or ${"\cTAINT"}) {
+		    # Blindly untaint dir names
+		    @files = map { /^(.*)$/s ; $1 } readdir $d;
+		} else {
+		    @files = readdir $d;
+		}
+		closedir $d;
+	    }
+	    else {
+	        carp "Can't read $root: $!";
+		@files = ();
+	    }
+
+	    # Deleting large numbers of files from VMS Files-11 filesystems
+	    # is faster if done in reverse ASCIIbetical order 
+	    @files = reverse @files if $Is_VMS;
+	    ($root = VMS::Filespec::unixify($root)) =~ s#\.dir\z## if $Is_VMS;
+	    if ($Is_MacOS) {
+		@files = map("$root$_", @files);
+	    } else {
+		@files = map("$root/$_", grep $_!~/^\.{1,2}\z/s,@files);
+	    }
+	    $count += rmtree(\@files,$verbose,$safe);
+	    if ($safe &&
+		($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) {
+		print "skipped $root\n" if $verbose;
+		next;
+	    }
+	    chmod $rp | 0700, $root
+	      or carp "Can't make directory $root writeable: $!"
+		if $force_writeable;
+	    print "rmdir $root\n" if $verbose;
+	    if (rmdir $root) {
+		++$count;
+	    }
+	    else {
+		carp "Can't remove directory $root: $!";
+		chmod($rp, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
+		    or carp("and can't restore permissions to "
+		            . sprintf("0%o",$rp) . "\n");
+	    }
+	}
+	else { 
+	    if ($safe &&
+		($Is_VMS ? !&VMS::Filespec::candelete($root)
+		         : !(-l $root || -w $root)))
+	    {
+		print "skipped $root\n" if $verbose;
+		next;
+	    }
+	    chmod $rp | 0600, $root
+	      or carp "Can't make file $root writeable: $!"
+		if $force_writeable;
+	    print "unlink $root\n" if $verbose;
+	    # delete all versions under VMS
+	    for (;;) {
+		unless (unlink $root) {
+		    carp "Can't unlink file $root: $!";
+		    if ($force_writeable) {
+			chmod $rp, $root
+			    or carp("and can't restore permissions to "
+			            . sprintf("0%o",$rp) . "\n");
+		    }
+		    last;
+		}
+		++$count;
+		last unless $Is_VMS && lstat $root;
+	    }
+	}
+    }
+
+    $count;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Spec.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Spec.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Spec.pm	(revision 14489)
@@ -0,0 +1,322 @@
+package File::Spec;
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+$VERSION = '3.12';
+$VERSION = eval $VERSION;
+
+my %module = (MacOS   => 'Mac',
+	      MSWin32 => 'Win32',
+	      os2     => 'OS2',
+	      VMS     => 'VMS',
+	      epoc    => 'Epoc',
+	      NetWare => 'Win32', # Yes, File::Spec::Win32 works on NetWare.
+	      symbian => 'Win32', # Yes, File::Spec::Win32 works on symbian.
+	      dos     => 'OS2',   # Yes, File::Spec::OS2 works on DJGPP.
+	      cygwin  => 'Cygwin');
+
+
+my $module = $module{$^O} || 'Unix';
+
+require "File/Spec/$module.pm";
+@ISA = ("File::Spec::$module");
+
+1;
+
+__END__
+
+=head1 NAME
+
+File::Spec - portably perform operations on file names
+
+=head1 SYNOPSIS
+
+	use File::Spec;
+
+	$x=File::Spec->catfile('a', 'b', 'c');
+
+which returns 'a/b/c' under Unix. Or:
+
+	use File::Spec::Functions;
+
+	$x = catfile('a', 'b', 'c');
+
+=head1 DESCRIPTION
+
+This module is designed to support operations commonly performed on file
+specifications (usually called "file names", but not to be confused with the
+contents of a file, or Perl's file handles), such as concatenating several
+directory and file names into a single path, or determining whether a path
+is rooted. It is based on code directly taken from MakeMaker 5.17, code
+written by Andreas KE<ouml>nig, Andy Dougherty, Charles Bailey, Ilya
+Zakharevich, Paul Schinder, and others.
+
+Since these functions are different for most operating systems, each set of
+OS specific routines is available in a separate module, including:
+
+	File::Spec::Unix
+	File::Spec::Mac
+	File::Spec::OS2
+	File::Spec::Win32
+	File::Spec::VMS
+
+The module appropriate for the current OS is automatically loaded by
+File::Spec. Since some modules (like VMS) make use of facilities available
+only under that OS, it may not be possible to load all modules under all
+operating systems.
+
+Since File::Spec is object oriented, subroutines should not be called directly,
+as in:
+
+	File::Spec::catfile('a','b');
+
+but rather as class methods:
+
+	File::Spec->catfile('a','b');
+
+For simple uses, L<File::Spec::Functions> provides convenient functional
+forms of these methods.
+
+=head1 METHODS
+
+=over 2
+
+=item canonpath
+
+No physical check on the filesystem, but a logical cleanup of a
+path.
+
+    $cpath = File::Spec->canonpath( $path ) ;
+
+Note that this does *not* collapse F<x/../y> sections into F<y>.  This
+is by design.  If F</foo> on your system is a symlink to F</bar/baz>,
+then F</foo/../quux> is actually F</bar/quux>, not F</quux> as a naive
+F<../>-removal would give you.  If you want to do this kind of
+processing, you probably want C<Cwd>'s C<realpath()> function to
+actually traverse the filesystem cleaning up paths like this.
+
+=item catdir
+
+Concatenate two or more directory names to form a complete path ending
+with a directory. But remove the trailing slash from the resulting
+string, because it doesn't look good, isn't necessary and confuses
+OS/2. Of course, if this is the root directory, don't cut off the
+trailing slash :-)
+
+    $path = File::Spec->catdir( @directories );
+
+=item catfile
+
+Concatenate one or more directory names and a filename to form a
+complete path ending with a filename
+
+    $path = File::Spec->catfile( @directories, $filename );
+
+=item curdir
+
+Returns a string representation of the current directory.
+
+    $curdir = File::Spec->curdir();
+
+=item devnull
+
+Returns a string representation of the null device.
+
+    $devnull = File::Spec->devnull();
+
+=item rootdir
+
+Returns a string representation of the root directory.
+
+    $rootdir = File::Spec->rootdir();
+
+=item tmpdir
+
+Returns a string representation of the first writable directory from a
+list of possible temporary directories.  Returns the current directory
+if no writable temporary directories are found.  The list of directories
+checked depends on the platform; e.g. File::Spec::Unix checks C<$ENV{TMPDIR}>
+(unless taint is on) and F</tmp>.
+
+    $tmpdir = File::Spec->tmpdir();
+
+=item updir
+
+Returns a string representation of the parent directory.
+
+    $updir = File::Spec->updir();
+
+=item no_upwards
+
+Given a list of file names, strip out those that refer to a parent
+directory. (Does not strip symlinks, only '.', '..', and equivalents.)
+
+    @paths = File::Spec->no_upwards( @paths );
+
+=item case_tolerant
+
+Returns a true or false value indicating, respectively, that alphabetic
+case is not or is significant when comparing file specifications.
+
+    $is_case_tolerant = File::Spec->case_tolerant();
+
+=item file_name_is_absolute
+
+Takes as its argument a path, and returns true if it is an absolute path.
+
+    $is_absolute = File::Spec->file_name_is_absolute( $path );
+
+This does not consult the local filesystem on Unix, Win32, OS/2, or
+Mac OS (Classic).  It does consult the working environment for VMS
+(see L<File::Spec::VMS/file_name_is_absolute>).
+
+=item path
+
+Takes no argument.  Returns the environment variable C<PATH> (or the local
+platform's equivalent) as a list.
+
+    @PATH = File::Spec->path();
+
+=item join
+
+join is the same as catfile.
+
+=item splitpath
+
+Splits a path in to volume, directory, and filename portions. On systems
+with no concept of volume, returns '' for volume. 
+
+    ($volume,$directories,$file) = File::Spec->splitpath( $path );
+    ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+For systems with no syntax differentiating filenames from directories, 
+assumes that the last file is a path unless C<$no_file> is true or a
+trailing separator or F</.> or F</..> is present. On Unix, this means that C<$no_file>
+true makes this return ( '', $path, '' ).
+
+The directory portion may or may not be returned with a trailing '/'.
+
+The results can be passed to L</catpath()> to get back a path equivalent to
+(usually identical to) the original path.
+
+=item splitdir
+
+The opposite of L</catdir()>.
+
+    @dirs = File::Spec->splitdir( $directories );
+
+C<$directories> must be only the directory portion of the path on systems 
+that have the concept of a volume or that have path syntax that differentiates
+files from directories.
+
+Unlike just splitting the directories on the separator, empty
+directory names (C<''>) can be returned, because these are significant
+on some OSes.
+
+=item catpath()
+
+Takes volume, directory and file portions and returns an entire path. Under
+Unix, C<$volume> is ignored, and directory and file are concatenated.  A '/' is
+inserted if need be.  On other OSes, C<$volume> is significant.
+
+    $full_path = File::Spec->catpath( $volume, $directory, $file );
+
+=item abs2rel
+
+Takes a destination path and an optional base path returns a relative path
+from the base path to the destination path:
+
+    $rel_path = File::Spec->abs2rel( $path ) ;
+    $rel_path = File::Spec->abs2rel( $path, $base ) ;
+
+If C<$base> is not present or '', then L<cwd()|Cwd> is used. If C<$base> is
+relative, then it is converted to absolute form using
+L</rel2abs()>. This means that it is taken to be relative to
+L<cwd()|Cwd>.
+
+On systems with the concept of volume, if C<$path> and C<$base> appear to be
+on two different volumes, we will not attempt to resolve the two
+paths, and we will instead simply return C<$path>.  Note that previous
+versions of this module ignored the volume of C<$base>, which resulted in
+garbage results part of the time.
+
+On systems that have a grammar that indicates filenames, this ignores the 
+C<$base> filename as well. Otherwise all path components are assumed to be
+directories.
+
+If C<$path> is relative, it is converted to absolute form using L</rel2abs()>.
+This means that it is taken to be relative to L<cwd()|Cwd>.
+
+No checks against the filesystem are made.  On VMS, there is
+interaction with the working environment, as logicals and
+macros are expanded.
+
+Based on code written by Shigio Yamaguchi.
+
+=item rel2abs()
+
+Converts a relative path to an absolute path. 
+
+    $abs_path = File::Spec->rel2abs( $path ) ;
+    $abs_path = File::Spec->rel2abs( $path, $base ) ;
+
+If C<$base> is not present or '', then L<cwd()|Cwd> is used. If C<$base> is relative,
+then it is converted to absolute form using L</rel2abs()>. This means that it
+is taken to be relative to L<cwd()|Cwd>.
+
+On systems with the concept of volume, if C<$path> and C<$base> appear to be
+on two different volumes, we will not attempt to resolve the two
+paths, and we will instead simply return C<$path>.  Note that previous
+versions of this module ignored the volume of C<$base>, which resulted in
+garbage results part of the time.
+
+On systems that have a grammar that indicates filenames, this ignores the 
+C<$base> filename as well. Otherwise all path components are assumed to be
+directories.
+
+If C<$path> is absolute, it is cleaned up and returned using L</canonpath()>.
+
+No checks against the filesystem are made.  On VMS, there is
+interaction with the working environment, as logicals and
+macros are expanded.
+
+Based on code written by Shigio Yamaguchi.
+
+=back
+
+For further information, please see L<File::Spec::Unix>,
+L<File::Spec::Mac>, L<File::Spec::OS2>, L<File::Spec::Win32>, or
+L<File::Spec::VMS>.
+
+=head1 SEE ALSO
+
+L<File::Spec::Unix>, L<File::Spec::Mac>, L<File::Spec::OS2>,
+L<File::Spec::Win32>, L<File::Spec::VMS>, L<File::Spec::Functions>,
+L<ExtUtils::MakeMaker>
+
+=head1 AUTHOR
+
+Currently maintained by Ken Williams C<< <KWILLIAMS@cpan.org> >>.
+
+The vast majority of the code was written by
+Kenneth Albanowski C<< <kjahds@kjahds.com> >>,
+Andy Dougherty C<< <doughera@lafayette.edu> >>,
+Andreas KE<ouml>nig C<< <A.Koenig@franz.ww.TU-Berlin.DE> >>,
+Tim Bunce C<< <Tim.Bunce@ig.co.uk> >>.
+VMS support by Charles Bailey C<< <bailey@newman.upenn.edu> >>.
+OS/2 support by Ilya Zakharevich C<< <ilya@math.ohio-state.edu> >>.
+Mac support by Paul Schinder C<< <schinder@pobox.com> >>, and
+Thomas Wegner C<< <wegner_thomas@yahoo.com> >>.
+abs2rel() and rel2abs() written by Shigio Yamaguchi C<< <shigio@tamacom.com> >>,
+modified by Barrie Slaymaker C<< <barries@slaysys.com> >>.
+splitpath(), splitdir(), catpath() and catdir() by Barrie Slaymaker.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters.  All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Cygwin.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Cygwin.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Cygwin.pm	(revision 14489)
@@ -0,0 +1,93 @@
+package File::Spec::Cygwin;
+
+use strict;
+use vars qw(@ISA $VERSION);
+require File::Spec::Unix;
+
+$VERSION = '1.1';
+
+@ISA = qw(File::Spec::Unix);
+
+=head1 NAME
+
+File::Spec::Cygwin - methods for Cygwin file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::Cygwin; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See L<File::Spec> and L<File::Spec::Unix>.  This package overrides the
+implementation of these methods, not the semantics.
+
+This module is still in beta.  Cygwin-knowledgeable folks are invited
+to offer patches and suggestions.
+
+=cut
+
+=pod
+
+=over 4
+
+=item canonpath
+
+Any C<\> (backslashes) are converted to C</> (forward slashes),
+and then File::Spec::Unix canonpath() is called on the result.
+
+=cut
+
+sub canonpath {
+    my($self,$path) = @_;
+    $path =~ s|\\|/|g;
+    return $self->SUPER::canonpath($path);
+}
+
+=pod
+
+=item file_name_is_absolute
+
+True is returned if the file name begins with C<drive_letter:>,
+and if not, File::Spec::Unix file_name_is_absolute() is called.
+
+=cut
+
+
+sub file_name_is_absolute {
+    my ($self,$file) = @_;
+    return 1 if $file =~ m{^([a-z]:)?[\\/]}is; # C:/test
+    return $self->SUPER::file_name_is_absolute($file);
+}
+
+=item tmpdir (override)
+
+Returns a string representation of the first existing directory
+from the following list:
+
+    $ENV{TMPDIR}
+    /tmp
+    C:/temp
+
+Since Perl 5.8.0, if running under taint mode, and if the environment
+variables are tainted, they are not used.
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+    return $tmpdir if defined $tmpdir;
+    $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR}, "/tmp", 'C:/temp' );
+}
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters.  All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Epoc.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Epoc.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Epoc.pm	(revision 14489)
@@ -0,0 +1,77 @@
+package File::Spec::Epoc;
+
+use strict;
+use vars qw($VERSION @ISA);
+
+$VERSION = '1.1';
+
+require File::Spec::Unix;
+@ISA = qw(File::Spec::Unix);
+
+=head1 NAME
+
+File::Spec::Epoc - methods for Epoc file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::Epoc; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See File::Spec::Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+This package is still work in progress ;-)
+
+=cut
+
+sub case_tolerant {
+    return 1;
+}
+
+=pod
+
+=over 4
+
+=item canonpath()
+
+No physical check on the filesystem, but a logical cleanup of a
+path. On UNIX eliminated successive slashes and successive "/.".
+
+=back
+
+=cut
+
+sub canonpath {
+    my ($self,$path) = @_;
+
+    $path =~ s|/+|/|g;                             # xx////xx  -> xx/xx
+    $path =~ s|(/\.)+/|/|g;                        # xx/././xx -> xx/xx
+    $path =~ s|^(\./)+||s unless $path eq "./";    # ./xx      -> xx
+    $path =~ s|^/(\.\./)+|/|s;                     # /../../xx -> xx
+    $path =~  s|/\Z(?!\n)|| unless $path eq "/";          # xx/       -> xx
+    return $path;
+}
+
+=pod
+
+=head1 AUTHOR
+
+o.flebbe@gmx.de
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters.  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
+
+See L<File::Spec> and L<File::Spec::Unix>.  This package overrides the
+implementation of these methods, not the semantics.
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Functions.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Functions.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Functions.pm	(revision 14489)
@@ -0,0 +1,109 @@
+package File::Spec::Functions;
+
+use File::Spec;
+use strict;
+
+use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
+
+$VERSION = '1.3';
+
+require Exporter;
+
+@ISA = qw(Exporter);
+
+@EXPORT = qw(
+	canonpath
+	catdir
+	catfile
+	curdir
+	rootdir
+	updir
+	no_upwards
+	file_name_is_absolute
+	path
+);
+
+@EXPORT_OK = qw(
+	devnull
+	tmpdir
+	splitpath
+	splitdir
+	catpath
+	abs2rel
+	rel2abs
+	case_tolerant
+);
+
+%EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] );
+
+foreach my $meth (@EXPORT, @EXPORT_OK) {
+    my $sub = File::Spec->can($meth);
+    no strict 'refs';
+    *{$meth} = sub {&$sub('File::Spec', @_)};
+}
+
+
+1;
+__END__
+
+=head1 NAME
+
+File::Spec::Functions - portably perform operations on file names
+
+=head1 SYNOPSIS
+
+	use File::Spec::Functions;
+	$x = catfile('a','b');
+
+=head1 DESCRIPTION
+
+This module exports convenience functions for all of the class methods
+provided by File::Spec.
+
+For a reference of available functions, please consult L<File::Spec::Unix>,
+which contains the entire set, and which is inherited by the modules for
+other platforms. For further information, please see L<File::Spec::Mac>,
+L<File::Spec::OS2>, L<File::Spec::Win32>, or L<File::Spec::VMS>.
+
+=head2 Exports
+
+The following functions are exported by default.
+
+	canonpath
+	catdir
+	catfile
+	curdir
+	rootdir
+	updir
+	no_upwards
+	file_name_is_absolute
+	path
+
+
+The following functions are exported only by request.
+
+	devnull
+	tmpdir
+	splitpath
+	splitdir
+	catpath
+	abs2rel
+	rel2abs
+	case_tolerant
+
+All the functions may be imported using the C<:ALL> tag.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters.  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
+
+File::Spec, File::Spec::Unix, File::Spec::Mac, File::Spec::OS2,
+File::Spec::Win32, File::Spec::VMS, ExtUtils::MakeMaker
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Mac.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Mac.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Mac.pm	(revision 14489)
@@ -0,0 +1,780 @@
+package File::Spec::Mac;
+
+use strict;
+use vars qw(@ISA $VERSION);
+require File::Spec::Unix;
+
+$VERSION = '1.4';
+
+@ISA = qw(File::Spec::Unix);
+
+my $macfiles;
+if ($^O eq 'MacOS') {
+	$macfiles = eval { require Mac::Files };
+}
+
+sub case_tolerant { 1 }
+
+
+=head1 NAME
+
+File::Spec::Mac - File::Spec for Mac OS (Classic)
+
+=head1 SYNOPSIS
+
+ require File::Spec::Mac; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+Methods for manipulating file specifications.
+
+=head1 METHODS
+
+=over 2
+
+=item canonpath
+
+On Mac OS, there's nothing to be done. Returns what it's given.
+
+=cut
+
+sub canonpath {
+    my ($self,$path) = @_;
+    return $path;
+}
+
+=item catdir()
+
+Concatenate two or more directory names to form a path separated by colons
+(":") ending with a directory. Resulting paths are B<relative> by default,
+but can be forced to be absolute (but avoid this, see below). Automatically
+puts a trailing ":" on the end of the complete path, because that's what's
+done in MacPerl's environment and helps to distinguish a file path from a
+directory path.
+
+B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the resulting
+path is relative by default and I<not> absolute. This decision was made due
+to portability reasons. Since C<File::Spec-E<gt>catdir()> returns relative paths
+on all other operating systems, it will now also follow this convention on Mac
+OS. Note that this may break some existing scripts.
+
+The intended purpose of this routine is to concatenate I<directory names>.
+But because of the nature of Macintosh paths, some additional possibilities
+are allowed to make using this routine give reasonable results for some
+common situations. In other words, you are also allowed to concatenate
+I<paths> instead of directory names (strictly speaking, a string like ":a"
+is a path, but not a name, since it contains a punctuation character ":").
+
+So, beside calls like
+
+    catdir("a") = ":a:"
+    catdir("a","b") = ":a:b:"
+    catdir() = ""                    (special case)
+
+calls like the following
+
+    catdir(":a:") = ":a:"
+    catdir(":a","b") = ":a:b:"
+    catdir(":a:","b") = ":a:b:"
+    catdir(":a:",":b:") = ":a:b:"
+    catdir(":") = ":"
+
+are allowed.
+
+Here are the rules that are used in C<catdir()>; note that we try to be as
+compatible as possible to Unix:
+
+=over 2
+
+=item 1.
+
+The resulting path is relative by default, i.e. the resulting path will have a
+leading colon.
+
+=item 2.
+
+A trailing colon is added automatically to the resulting path, to denote a
+directory.
+
+=item 3.
+
+Generally, each argument has one leading ":" and one trailing ":"
+removed (if any). They are then joined together by a ":". Special
+treatment applies for arguments denoting updir paths like "::lib:",
+see (4), or arguments consisting solely of colons ("colon paths"),
+see (5).
+
+=item 4.
+
+When an updir path like ":::lib::" is passed as argument, the number
+of directories to climb up is handled correctly, not removing leading
+or trailing colons when necessary. E.g.
+
+    catdir(":::a","::b","c")    = ":::a::b:c:"
+    catdir(":::a::","::b","c")  = ":::a:::b:c:"
+
+=item 5.
+
+Adding a colon ":" or empty string "" to a path at I<any> position
+doesn't alter the path, i.e. these arguments are ignored. (When a ""
+is passed as the first argument, it has a special meaning, see
+(6)). This way, a colon ":" is handled like a "." (curdir) on Unix,
+while an empty string "" is generally ignored (see
+C<Unix-E<gt>canonpath()> ). Likewise, a "::" is handled like a ".."
+(updir), and a ":::" is handled like a "../.." etc.  E.g.
+
+    catdir("a",":",":","b")   = ":a:b:"
+    catdir("a",":","::",":b") = ":a::b:"
+
+=item 6.
+
+If the first argument is an empty string "" or is a volume name, i.e. matches
+the pattern /^[^:]+:/, the resulting path is B<absolute>.
+
+=item 7.
+
+Passing an empty string "" as the first argument to C<catdir()> is
+like passingC<File::Spec-E<gt>rootdir()> as the first argument, i.e.
+
+    catdir("","a","b")          is the same as
+
+    catdir(rootdir(),"a","b").
+
+This is true on Unix, where C<catdir("","a","b")> yields "/a/b" and
+C<rootdir()> is "/". Note that C<rootdir()> on Mac OS is the startup
+volume, which is the closest in concept to Unix' "/". This should help
+to run existing scripts originally written for Unix.
+
+=item 8.
+
+For absolute paths, some cleanup is done, to ensure that the volume
+name isn't immediately followed by updirs. This is invalid, because
+this would go beyond "root". Generally, these cases are handled like
+their Unix counterparts:
+
+ Unix:
+    Unix->catdir("","")                 =  "/"
+    Unix->catdir("",".")                =  "/"
+    Unix->catdir("","..")               =  "/"              # can't go beyond root
+    Unix->catdir("",".","..","..","a")  =  "/a"
+ Mac:
+    Mac->catdir("","")                  =  rootdir()         # (e.g. "HD:")
+    Mac->catdir("",":")                 =  rootdir()
+    Mac->catdir("","::")                =  rootdir()         # can't go beyond root
+    Mac->catdir("",":","::","::","a")   =  rootdir() . "a:"  # (e.g. "HD:a:")
+
+However, this approach is limited to the first arguments following
+"root" (again, see C<Unix-E<gt>canonpath()> ). If there are more
+arguments that move up the directory tree, an invalid path going
+beyond root can be created.
+
+=back
+
+As you've seen, you can force C<catdir()> to create an absolute path
+by passing either an empty string or a path that begins with a volume
+name as the first argument. However, you are strongly encouraged not
+to do so, since this is done only for backward compatibility. Newer
+versions of File::Spec come with a method called C<catpath()> (see
+below), that is designed to offer a portable solution for the creation
+of absolute paths.  It takes volume, directory and file portions and
+returns an entire path. While C<catdir()> is still suitable for the
+concatenation of I<directory names>, you are encouraged to use
+C<catpath()> to concatenate I<volume names> and I<directory
+paths>. E.g.
+
+    $dir      = File::Spec->catdir("tmp","sources");
+    $abs_path = File::Spec->catpath("MacintoshHD:", $dir,"");
+
+yields
+
+    "MacintoshHD:tmp:sources:" .
+
+=cut
+
+sub catdir {
+	my $self = shift;
+	return '' unless @_;
+	my @args = @_;
+	my $first_arg;
+	my $relative;
+
+	# take care of the first argument
+
+	if ($args[0] eq '')  { # absolute path, rootdir
+		shift @args;
+		$relative = 0;
+		$first_arg = $self->rootdir;
+
+	} elsif ($args[0] =~ /^[^:]+:/) { # absolute path, volume name
+		$relative = 0;
+		$first_arg = shift @args;
+		# add a trailing ':' if need be (may be it's a path like HD:dir)
+		$first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/);
+
+	} else { # relative path
+		$relative = 1;
+		if ( $args[0] =~ /^::+\Z(?!\n)/ ) {
+			# updir colon path ('::', ':::' etc.), don't shift
+			$first_arg = ':';
+		} elsif ($args[0] eq ':') {
+			$first_arg = shift @args;
+		} else {
+			# add a trailing ':' if need be
+			$first_arg = shift @args;
+			$first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/);
+		}
+	}
+
+	# For all other arguments,
+	# (a) ignore arguments that equal ':' or '',
+	# (b) handle updir paths specially:
+	#     '::' 			-> concatenate '::'
+	#     '::' . '::' 	-> concatenate ':::' etc.
+	# (c) add a trailing ':' if need be
+
+	my $result = $first_arg;
+	while (@args) {
+		my $arg = shift @args;
+		unless (($arg eq '') || ($arg eq ':')) {
+			if ($arg =~ /^::+\Z(?!\n)/ ) { # updir colon path like ':::'
+				my $updir_count = length($arg) - 1;
+				while ((@args) && ($args[0] =~ /^::+\Z(?!\n)/) ) { # while updir colon path
+					$arg = shift @args;
+					$updir_count += (length($arg) - 1);
+				}
+				$arg = (':' x $updir_count);
+			} else {
+				$arg =~ s/^://s; # remove a leading ':' if any
+				$arg = "$arg:" unless ($arg =~ /:\Z(?!\n)/); # ensure trailing ':'
+			}
+			$result .= $arg;
+		}#unless
+	}
+
+	if ( ($relative) && ($result !~ /^:/) ) {
+		# add a leading colon if need be
+		$result = ":$result";
+	}
+
+	unless ($relative) {
+		# remove updirs immediately following the volume name
+		$result =~ s/([^:]+:)(:*)(.*)\Z(?!\n)/$1$3/;
+	}
+
+	return $result;
+}
+
+=item catfile
+
+Concatenate one or more directory names and a filename to form a
+complete path ending with a filename. Resulting paths are B<relative>
+by default, but can be forced to be absolute (but avoid this).
+
+B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the
+resulting path is relative by default and I<not> absolute. This
+decision was made due to portability reasons. Since
+C<File::Spec-E<gt>catfile()> returns relative paths on all other
+operating systems, it will now also follow this convention on Mac OS.
+Note that this may break some existing scripts.
+
+The last argument is always considered to be the file portion. Since
+C<catfile()> uses C<catdir()> (see above) for the concatenation of the
+directory portions (if any), the following with regard to relative and
+absolute paths is true:
+
+    catfile("")     = ""
+    catfile("file") = "file"
+
+but
+
+    catfile("","")        = rootdir()         # (e.g. "HD:")
+    catfile("","file")    = rootdir() . file  # (e.g. "HD:file")
+    catfile("HD:","file") = "HD:file"
+
+This means that C<catdir()> is called only when there are two or more
+arguments, as one might expect.
+
+Note that the leading ":" is removed from the filename, so that
+
+    catfile("a","b","file")  = ":a:b:file"    and
+
+    catfile("a","b",":file") = ":a:b:file"
+
+give the same answer.
+
+To concatenate I<volume names>, I<directory paths> and I<filenames>,
+you are encouraged to use C<catpath()> (see below).
+
+=cut
+
+sub catfile {
+    my $self = shift;
+    return '' unless @_;
+    my $file = pop @_;
+    return $file unless @_;
+    my $dir = $self->catdir(@_);
+    $file =~ s/^://s;
+    return $dir.$file;
+}
+
+=item curdir
+
+Returns a string representing the current directory. On Mac OS, this is ":".
+
+=cut
+
+sub curdir {
+    return ":";
+}
+
+=item devnull
+
+Returns a string representing the null device. On Mac OS, this is "Dev:Null".
+
+=cut
+
+sub devnull {
+    return "Dev:Null";
+}
+
+=item rootdir
+
+Returns a string representing the root directory.  Under MacPerl,
+returns the name of the startup volume, since that's the closest in
+concept, although other volumes aren't rooted there. The name has a
+trailing ":", because that's the correct specification for a volume
+name on Mac OS.
+
+If Mac::Files could not be loaded, the empty string is returned.
+
+=cut
+
+sub rootdir {
+#
+#  There's no real root directory on Mac OS. The name of the startup
+#  volume is returned, since that's the closest in concept.
+#
+    return '' unless $macfiles;
+    my $system = Mac::Files::FindFolder(&Mac::Files::kOnSystemDisk,
+	&Mac::Files::kSystemFolderType);
+    $system =~ s/:.*\Z(?!\n)/:/s;
+    return $system;
+}
+
+=item tmpdir
+
+Returns the contents of $ENV{TMPDIR}, if that directory exits or the
+current working directory otherwise. Under MacPerl, $ENV{TMPDIR} will
+contain a path like "MacintoshHD:Temporary Items:", which is a hidden
+directory on your startup volume.
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+    return $tmpdir if defined $tmpdir;
+    $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR} );
+}
+
+=item updir
+
+Returns a string representing the parent directory. On Mac OS, this is "::".
+
+=cut
+
+sub updir {
+    return "::";
+}
+
+=item file_name_is_absolute
+
+Takes as argument a path and returns true, if it is an absolute path.
+If the path has a leading ":", it's a relative path. Otherwise, it's an
+absolute path, unless the path doesn't contain any colons, i.e. it's a name
+like "a". In this particular case, the path is considered to be relative
+(i.e. it is considered to be a filename). Use ":" in the appropriate place
+in the path if you want to distinguish unambiguously. As a special case,
+the filename '' is always considered to be absolute. Note that with version
+1.2 of File::Spec::Mac, this does no longer consult the local filesystem.
+
+E.g.
+
+    File::Spec->file_name_is_absolute("a");             # false (relative)
+    File::Spec->file_name_is_absolute(":a:b:");         # false (relative)
+    File::Spec->file_name_is_absolute("MacintoshHD:");  # true (absolute)
+    File::Spec->file_name_is_absolute("");              # true (absolute)
+
+
+=cut
+
+sub file_name_is_absolute {
+    my ($self,$file) = @_;
+    if ($file =~ /:/) {
+	return (! ($file =~ m/^:/s) );
+    } elsif ( $file eq '' ) {
+        return 1 ;
+    } else {
+	return 0; # i.e. a file like "a"
+    }
+}
+
+=item path
+
+Returns the null list for the MacPerl application, since the concept is
+usually meaningless under Mac OS. But if you're using the MacPerl tool under
+MPW, it gives back $ENV{Commands} suitably split, as is done in
+:lib:ExtUtils:MM_Mac.pm.
+
+=cut
+
+sub path {
+#
+#  The concept is meaningless under the MacPerl application.
+#  Under MPW, it has a meaning.
+#
+    return unless exists $ENV{Commands};
+    return split(/,/, $ENV{Commands});
+}
+
+=item splitpath
+
+    ($volume,$directories,$file) = File::Spec->splitpath( $path );
+    ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+Splits a path into volume, directory, and filename portions.
+
+On Mac OS, assumes that the last part of the path is a filename unless
+$no_file is true or a trailing separator ":" is present.
+
+The volume portion is always returned with a trailing ":". The directory portion
+is always returned with a leading (to denote a relative path) and a trailing ":"
+(to denote a directory). The file portion is always returned I<without> a leading ":".
+Empty portions are returned as empty string ''.
+
+The results can be passed to C<catpath()> to get back a path equivalent to
+(usually identical to) the original path.
+
+
+=cut
+
+sub splitpath {
+    my ($self,$path, $nofile) = @_;
+    my ($volume,$directory,$file);
+
+    if ( $nofile ) {
+        ( $volume, $directory ) = $path =~ m|^((?:[^:]+:)?)(.*)|s;
+    }
+    else {
+        $path =~
+            m|^( (?: [^:]+: )? )
+               ( (?: .*: )? )
+               ( .* )
+             |xs;
+        $volume    = $1;
+        $directory = $2;
+        $file      = $3;
+    }
+
+    $volume = '' unless defined($volume);
+	$directory = ":$directory" if ( $volume && $directory ); # take care of "HD::dir"
+    if ($directory) {
+        # Make sure non-empty directories begin and end in ':'
+        $directory .= ':' unless (substr($directory,-1) eq ':');
+        $directory = ":$directory" unless (substr($directory,0,1) eq ':');
+    } else {
+	$directory = '';
+    }
+    $file = '' unless defined($file);
+
+    return ($volume,$directory,$file);
+}
+
+
+=item splitdir
+
+The opposite of C<catdir()>.
+
+    @dirs = File::Spec->splitdir( $directories );
+
+$directories should be only the directory portion of the path on systems
+that have the concept of a volume or that have path syntax that differentiates
+files from directories. Consider using C<splitpath()> otherwise.
+
+Unlike just splitting the directories on the separator, empty directory names
+(C<"">) can be returned. Since C<catdir()> on Mac OS always appends a trailing
+colon to distinguish a directory path from a file path, a single trailing colon
+will be ignored, i.e. there's no empty directory name after it.
+
+Hence, on Mac OS, both
+
+    File::Spec->splitdir( ":a:b::c:" );    and
+    File::Spec->splitdir( ":a:b::c" );
+
+yield:
+
+    ( "a", "b", "::", "c")
+
+while
+
+    File::Spec->splitdir( ":a:b::c::" );
+
+yields:
+
+    ( "a", "b", "::", "c", "::")
+
+
+=cut
+
+sub splitdir {
+	my ($self, $path) = @_;
+	my @result = ();
+	my ($head, $sep, $tail, $volume, $directories);
+
+	return ('') if ( (!defined($path)) || ($path eq '') );
+	return (':') if ($path eq ':');
+
+	( $volume, $sep, $directories ) = $path =~ m|^((?:[^:]+:)?)(:*)(.*)|s;
+
+	# deprecated, but handle it correctly
+	if ($volume) {
+		push (@result, $volume);
+		$sep .= ':';
+	}
+
+	while ($sep || $directories) {
+		if (length($sep) > 1) {
+			my $updir_count = length($sep) - 1;
+			for (my $i=0; $i<$updir_count; $i++) {
+				# push '::' updir_count times;
+				# simulate Unix '..' updirs
+				push (@result, '::');
+			}
+		}
+		$sep = '';
+		if ($directories) {
+			( $head, $sep, $tail ) = $directories =~ m|^((?:[^:]+)?)(:*)(.*)|s;
+			push (@result, $head);
+			$directories = $tail;
+		}
+	}
+	return @result;
+}
+
+
+=item catpath
+
+    $path = File::Spec->catpath($volume,$directory,$file);
+
+Takes volume, directory and file portions and returns an entire path. On Mac OS,
+$volume, $directory and $file are concatenated.  A ':' is inserted if need be. You
+may pass an empty string for each portion. If all portions are empty, the empty
+string is returned. If $volume is empty, the result will be a relative path,
+beginning with a ':'. If $volume and $directory are empty, a leading ":" (if any)
+is removed form $file and the remainder is returned. If $file is empty, the
+resulting path will have a trailing ':'.
+
+
+=cut
+
+sub catpath {
+    my ($self,$volume,$directory,$file) = @_;
+
+    if ( (! $volume) && (! $directory) ) {
+	$file =~ s/^:// if $file;
+	return $file ;
+    }
+
+    # We look for a volume in $volume, then in $directory, but not both
+
+    my ($dir_volume, $dir_dirs) = $self->splitpath($directory, 1);
+
+    $volume = $dir_volume unless length $volume;
+    my $path = $volume; # may be ''
+    $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':'
+
+    if ($directory) {
+	$directory = $dir_dirs if $volume;
+	$directory =~ s/^://; # remove leading ':' if any
+	$path .= $directory;
+	$path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':'
+    }
+
+    if ($file) {
+	$file =~ s/^://; # remove leading ':' if any
+	$path .= $file;
+    }
+
+    return $path;
+}
+
+=item abs2rel
+
+Takes a destination path and an optional base path and returns a relative path
+from the base path to the destination path:
+
+    $rel_path = File::Spec->abs2rel( $path ) ;
+    $rel_path = File::Spec->abs2rel( $path, $base ) ;
+
+Note that both paths are assumed to have a notation that distinguishes a
+directory path (with trailing ':') from a file path (without trailing ':').
+
+If $base is not present or '', then the current working directory is used.
+If $base is relative, then it is converted to absolute form using C<rel2abs()>.
+This means that it is taken to be relative to the current working directory.
+
+If $path and $base appear to be on two different volumes, we will not
+attempt to resolve the two paths, and we will instead simply return
+$path.  Note that previous versions of this module ignored the volume
+of $base, which resulted in garbage results part of the time.
+
+If $base doesn't have a trailing colon, the last element of $base is
+assumed to be a filename.  This filename is ignored.  Otherwise all path
+components are assumed to be directories.
+
+If $path is relative, it is converted to absolute form using C<rel2abs()>.
+This means that it is taken to be relative to the current working directory.
+
+Based on code written by Shigio Yamaguchi.
+
+
+=cut
+
+# maybe this should be done in canonpath() ?
+sub _resolve_updirs {
+	my $path = shift @_;
+	my $proceed;
+
+	# resolve any updirs, e.g. "HD:tmp::file" -> "HD:file"
+	do {
+		$proceed = ($path =~ s/^(.*):[^:]+::(.*?)\z/$1:$2/);
+	} while ($proceed);
+
+	return $path;
+}
+
+
+sub abs2rel {
+    my($self,$path,$base) = @_;
+
+    # Clean up $path
+    if ( ! $self->file_name_is_absolute( $path ) ) {
+        $path = $self->rel2abs( $path ) ;
+    }
+
+    # Figure out the effective $base and clean it up.
+    if ( !defined( $base ) || $base eq '' ) {
+	$base = $self->_cwd();
+    }
+    elsif ( ! $self->file_name_is_absolute( $base ) ) {
+        $base = $self->rel2abs( $base ) ;
+	$base = _resolve_updirs( $base ); # resolve updirs in $base
+    }
+    else {
+	$base = _resolve_updirs( $base );
+    }
+
+    # Split up paths - ignore $base's file
+    my ( $path_vol, $path_dirs, $path_file ) =  $self->splitpath( $path );
+    my ( $base_vol, $base_dirs )             =  $self->splitpath( $base );
+
+    return $path unless lc( $path_vol ) eq lc( $base_vol );
+
+    # Now, remove all leading components that are the same
+    my @pathchunks = $self->splitdir( $path_dirs );
+    my @basechunks = $self->splitdir( $base_dirs );
+	
+    while ( @pathchunks &&
+	    @basechunks &&
+	    lc( $pathchunks[0] ) eq lc( $basechunks[0] ) ) {
+        shift @pathchunks ;
+        shift @basechunks ;
+    }
+
+    # @pathchunks now has the directories to descend in to.
+    # ensure relative path, even if @pathchunks is empty
+    $path_dirs = $self->catdir( ':', @pathchunks );
+
+    # @basechunks now contains the number of directories to climb out of.
+    $base_dirs = (':' x @basechunks) . ':' ;
+
+    return $self->catpath( '', $self->catdir( $base_dirs, $path_dirs ), $path_file ) ;
+}
+
+=item rel2abs
+
+Converts a relative path to an absolute path:
+
+    $abs_path = File::Spec->rel2abs( $path ) ;
+    $abs_path = File::Spec->rel2abs( $path, $base ) ;
+
+Note that both paths are assumed to have a notation that distinguishes a
+directory path (with trailing ':') from a file path (without trailing ':').
+
+If $base is not present or '', then $base is set to the current working
+directory. If $base is relative, then it is converted to absolute form
+using C<rel2abs()>. This means that it is taken to be relative to the
+current working directory.
+
+If $base doesn't have a trailing colon, the last element of $base is
+assumed to be a filename.  This filename is ignored.  Otherwise all path
+components are assumed to be directories.
+
+If $path is already absolute, it is returned and $base is ignored.
+
+Based on code written by Shigio Yamaguchi.
+
+=cut
+
+sub rel2abs {
+    my ($self,$path,$base) = @_;
+
+    if ( ! $self->file_name_is_absolute($path) ) {
+        # Figure out the effective $base and clean it up.
+        if ( !defined( $base ) || $base eq '' ) {
+	    $base = $self->_cwd();
+        }
+        elsif ( ! $self->file_name_is_absolute($base) ) {
+            $base = $self->rel2abs($base) ;
+        }
+
+	# Split up paths
+
+	# igonore $path's volume
+        my ( $path_dirs, $path_file ) = ($self->splitpath($path))[1,2] ;
+
+        # ignore $base's file part
+	my ( $base_vol, $base_dirs ) = $self->splitpath($base) ;
+
+	# Glom them together
+	$path_dirs = ':' if ($path_dirs eq '');
+	$base_dirs =~ s/:$//; # remove trailing ':', if any
+	$base_dirs = $base_dirs . $path_dirs;
+
+        $path = $self->catpath( $base_vol, $base_dirs, $path_file );
+    }
+    return $path;
+}
+
+
+=back
+
+=head1 AUTHORS
+
+See the authors list in I<File::Spec>. Mac OS support by Paul Schinder
+<schinder@pobox.com> and Thomas Wegner <wegner_thomas@yahoo.com>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters.  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
+
+See L<File::Spec> and L<File::Spec::Unix>.  This package overrides the
+implementation of these methods, not the semantics.
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Spec/OS2.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Spec/OS2.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Spec/OS2.pm	(revision 14489)
@@ -0,0 +1,272 @@
+package File::Spec::OS2;
+
+use strict;
+use vars qw(@ISA $VERSION);
+require File::Spec::Unix;
+
+$VERSION = '1.2';
+
+@ISA = qw(File::Spec::Unix);
+
+sub devnull {
+    return "/dev/nul";
+}
+
+sub case_tolerant {
+    return 1;
+}
+
+sub file_name_is_absolute {
+    my ($self,$file) = @_;
+    return scalar($file =~ m{^([a-z]:)?[\\/]}is);
+}
+
+sub path {
+    my $path = $ENV{PATH};
+    $path =~ s:\\:/:g;
+    my @path = split(';',$path);
+    foreach (@path) { $_ = '.' if $_ eq '' }
+    return @path;
+}
+
+sub _cwd {
+    # In OS/2 the "require Cwd" is unnecessary bloat.
+    return Cwd::sys_cwd();
+}
+
+my $tmpdir;
+sub tmpdir {
+    return $tmpdir if defined $tmpdir;
+    $tmpdir = $_[0]->_tmpdir( @ENV{qw(TMPDIR TEMP TMP)},
+			      '/tmp',
+			      '/'  );
+}
+
+sub catdir {
+    my $self = shift;
+    my @args = @_;
+    foreach (@args) {
+	tr[\\][/];
+        # append a backslash to each argument unless it has one there
+        $_ .= "/" unless m{/$};
+    }
+    return $self->canonpath(join('', @args));
+}
+
+sub canonpath {
+    my ($self,$path) = @_;
+    $path =~ s/^([a-z]:)/\l$1/s;
+    $path =~ s|\\|/|g;
+    $path =~ s|([^/])/+|$1/|g;                  # xx////xx  -> xx/xx
+    $path =~ s|(/\.)+/|/|g;                     # xx/././xx -> xx/xx
+    $path =~ s|^(\./)+(?=[^/])||s;		# ./xx      -> xx
+    $path =~ s|/\Z(?!\n)||
+             unless $path =~ m#^([a-z]:)?/\Z(?!\n)#si;# xx/       -> xx
+    $path =~ s{^/\.\.$}{/};                     # /..    -> /
+    1 while $path =~ s{^/\.\.}{};               # /../xx -> /xx
+    return $path;
+}
+
+
+sub splitpath {
+    my ($self,$path, $nofile) = @_;
+    my ($volume,$directory,$file) = ('','','');
+    if ( $nofile ) {
+        $path =~ 
+            m{^( (?:[a-zA-Z]:|(?:\\\\|//)[^\\/]+[\\/][^\\/]+)? ) 
+                 (.*)
+             }xs;
+        $volume    = $1;
+        $directory = $2;
+    }
+    else {
+        $path =~ 
+            m{^ ( (?: [a-zA-Z]: |
+                      (?:\\\\|//)[^\\/]+[\\/][^\\/]+
+                  )?
+                )
+                ( (?:.*[\\\\/](?:\.\.?\Z(?!\n))?)? )
+                (.*)
+             }xs;
+        $volume    = $1;
+        $directory = $2;
+        $file      = $3;
+    }
+
+    return ($volume,$directory,$file);
+}
+
+
+sub splitdir {
+    my ($self,$directories) = @_ ;
+    split m|[\\/]|, $directories, -1;
+}
+
+
+sub catpath {
+    my ($self,$volume,$directory,$file) = @_;
+
+    # If it's UNC, make sure the glue separator is there, reusing
+    # whatever separator is first in the $volume
+    $volume .= $1
+        if ( $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s &&
+             $directory =~ m@^[^\\/]@s
+           ) ;
+
+    $volume .= $directory ;
+
+    # If the volume is not just A:, make sure the glue separator is 
+    # there, reusing whatever separator is first in the $volume if possible.
+    if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s &&
+         $volume =~ m@[^\\/]\Z(?!\n)@      &&
+         $file   =~ m@[^\\/]@
+       ) {
+        $volume =~ m@([\\/])@ ;
+        my $sep = $1 ? $1 : '/' ;
+        $volume .= $sep ;
+    }
+
+    $volume .= $file ;
+
+    return $volume ;
+}
+
+
+sub abs2rel {
+    my($self,$path,$base) = @_;
+
+    # Clean up $path
+    if ( ! $self->file_name_is_absolute( $path ) ) {
+        $path = $self->rel2abs( $path ) ;
+    } else {
+        $path = $self->canonpath( $path ) ;
+    }
+
+    # Figure out the effective $base and clean it up.
+    if ( !defined( $base ) || $base eq '' ) {
+	$base = $self->_cwd();
+    } elsif ( ! $self->file_name_is_absolute( $base ) ) {
+        $base = $self->rel2abs( $base ) ;
+    } else {
+        $base = $self->canonpath( $base ) ;
+    }
+
+    # Split up paths
+    my ( $path_volume, $path_directories, $path_file ) = $self->splitpath( $path, 1 ) ;
+    my ( $base_volume, $base_directories ) = $self->splitpath( $base, 1 ) ;
+    return $path unless $path_volume eq $base_volume;
+
+    # Now, remove all leading components that are the same
+    my @pathchunks = $self->splitdir( $path_directories );
+    my @basechunks = $self->splitdir( $base_directories );
+
+    while ( @pathchunks && 
+            @basechunks && 
+            lc( $pathchunks[0] ) eq lc( $basechunks[0] ) 
+          ) {
+        shift @pathchunks ;
+        shift @basechunks ;
+    }
+
+    # No need to catdir, we know these are well formed.
+    $path_directories = CORE::join( '/', @pathchunks );
+    $base_directories = CORE::join( '/', @basechunks );
+
+    # $base_directories now contains the directories the resulting relative
+    # path must ascend out of before it can descend to $path_directory.  So, 
+    # replace all names with $parentDir
+
+    #FA Need to replace between backslashes...
+    $base_directories =~ s|[^\\/]+|..|g ;
+
+    # Glue the two together, using a separator if necessary, and preventing an
+    # empty result.
+
+    #FA Must check that new directories are not empty.
+    if ( $path_directories ne '' && $base_directories ne '' ) {
+        $path_directories = "$base_directories/$path_directories" ;
+    } else {
+        $path_directories = "$base_directories$path_directories" ;
+    }
+
+    return $self->canonpath( 
+        $self->catpath( "", $path_directories, $path_file ) 
+    ) ;
+}
+
+
+sub rel2abs {
+    my ($self,$path,$base ) = @_;
+
+    if ( ! $self->file_name_is_absolute( $path ) ) {
+
+        if ( !defined( $base ) || $base eq '' ) {
+	    $base = $self->_cwd();
+        }
+        elsif ( ! $self->file_name_is_absolute( $base ) ) {
+            $base = $self->rel2abs( $base ) ;
+        }
+        else {
+            $base = $self->canonpath( $base ) ;
+        }
+
+        my ( $path_directories, $path_file ) =
+            ($self->splitpath( $path, 1 ))[1,2] ;
+
+        my ( $base_volume, $base_directories ) =
+            $self->splitpath( $base, 1 ) ;
+
+        $path = $self->catpath( 
+            $base_volume, 
+            $self->catdir( $base_directories, $path_directories ), 
+            $path_file
+        ) ;
+    }
+
+    return $self->canonpath( $path ) ;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+File::Spec::OS2 - methods for OS/2 file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::OS2; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See L<File::Spec> and L<File::Spec::Unix>.  This package overrides the
+implementation of these methods, not the semantics.
+
+Amongst the changes made for OS/2 are...
+
+=over 4
+
+=item tmpdir
+
+Modifies the list of places temp directory information is looked for.
+
+    $ENV{TMPDIR}
+    $ENV{TEMP}
+    $ENV{TMP}
+    /tmp
+    /
+
+=item splitpath
+
+Volumes can be drive letters or UNC sharenames (\\server\share).
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters.  All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Unix.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Unix.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Unix.pm	(revision 14489)
@@ -0,0 +1,510 @@
+package File::Spec::Unix;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.5';
+
+=head1 NAME
+
+File::Spec::Unix - File::Spec for Unix, base for other File::Spec modules
+
+=head1 SYNOPSIS
+
+ require File::Spec::Unix; # Done automatically by File::Spec
+
+=head1 DESCRIPTION
+
+Methods for manipulating file specifications.  Other File::Spec
+modules, such as File::Spec::Mac, inherit from File::Spec::Unix and
+override specific methods.
+
+=head1 METHODS
+
+=over 2
+
+=item canonpath()
+
+No physical check on the filesystem, but a logical cleanup of a
+path. On UNIX eliminates successive slashes and successive "/.".
+
+    $cpath = File::Spec->canonpath( $path ) ;
+
+Note that this does *not* collapse F<x/../y> sections into F<y>.  This
+is by design.  If F</foo> on your system is a symlink to F</bar/baz>,
+then F</foo/../quux> is actually F</bar/quux>, not F</quux> as a naive
+F<../>-removal would give you.  If you want to do this kind of
+processing, you probably want C<Cwd>'s C<realpath()> function to
+actually traverse the filesystem cleaning up paths like this.
+
+=cut
+
+sub canonpath {
+    my ($self,$path) = @_;
+    
+    # Handle POSIX-style node names beginning with double slash (qnx, nto)
+    # Handle network path names beginning with double slash (cygwin)
+    # (POSIX says: "a pathname that begins with two successive slashes
+    # may be interpreted in an implementation-defined manner, although
+    # more than two leading slashes shall be treated as a single slash.")
+    my $node = '';
+    if ( $^O =~ m/^(?:qnx|nto|cygwin)$/ && $path =~ s:^(//[^/]+)(/|\z):/:s ) {
+      $node = $1;
+    }
+    # This used to be
+    # $path =~ s|/+|/|g unless($^O eq 'cygwin');
+    # but that made tests 29, 30, 35, 46, and 213 (as of #13272) to fail
+    # (Mainly because trailing "" directories didn't get stripped).
+    # Why would cygwin avoid collapsing multiple slashes into one? --jhi
+    $path =~ s|/+|/|g;                             # xx////xx  -> xx/xx
+    $path =~ s@(/\.)+(/|\Z(?!\n))@/@g;             # xx/././xx -> xx/xx
+    $path =~ s|^(\./)+||s unless $path eq "./";    # ./xx      -> xx
+    $path =~ s|^/(\.\./)+|/|;                      # /../../xx -> xx
+    $path =~ s|^/\.\.$|/|;                         # /..       -> /
+    $path =~ s|/\Z(?!\n)|| unless $path eq "/";          # xx/       -> xx
+    return "$node$path";
+}
+
+=item catdir()
+
+Concatenate two or more directory names to form a complete path ending
+with a directory. But remove the trailing slash from the resulting
+string, because it doesn't look good, isn't necessary and confuses
+OS2. Of course, if this is the root directory, don't cut off the
+trailing slash :-)
+
+=cut
+
+sub catdir {
+    my $self = shift;
+
+    $self->canonpath(join('/', @_, '')); # '' because need a trailing '/'
+}
+
+=item catfile
+
+Concatenate one or more directory names and a filename to form a
+complete path ending with a filename
+
+=cut
+
+sub catfile {
+    my $self = shift;
+    my $file = $self->canonpath(pop @_);
+    return $file unless @_;
+    my $dir = $self->catdir(@_);
+    $dir .= "/" unless substr($dir,-1) eq "/";
+    return $dir.$file;
+}
+
+=item curdir
+
+Returns a string representation of the current directory.  "." on UNIX.
+
+=cut
+
+sub curdir () { '.' }
+
+=item devnull
+
+Returns a string representation of the null device. "/dev/null" on UNIX.
+
+=cut
+
+sub devnull () { '/dev/null' }
+
+=item rootdir
+
+Returns a string representation of the root directory.  "/" on UNIX.
+
+=cut
+
+sub rootdir () { '/' }
+
+=item tmpdir
+
+Returns a string representation of the first writable directory from
+the following list or the current directory if none from the list are
+writable:
+
+    $ENV{TMPDIR}
+    /tmp
+
+Since perl 5.8.0, if running under taint mode, and if $ENV{TMPDIR}
+is tainted, it is not used.
+
+=cut
+
+my $tmpdir;
+sub _tmpdir {
+    return $tmpdir if defined $tmpdir;
+    my $self = shift;
+    my @dirlist = @_;
+    {
+	no strict 'refs';
+	if (${"\cTAINT"}) { # Check for taint mode on perl >= 5.8.0
+            require Scalar::Util;
+	    @dirlist = grep { ! Scalar::Util::tainted($_) } @dirlist;
+	}
+    }
+    foreach (@dirlist) {
+	next unless defined && -d && -w _;
+	$tmpdir = $_;
+	last;
+    }
+    $tmpdir = $self->curdir unless defined $tmpdir;
+    $tmpdir = defined $tmpdir && $self->canonpath($tmpdir);
+    return $tmpdir;
+}
+
+sub tmpdir {
+    return $tmpdir if defined $tmpdir;
+    $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR}, "/tmp" );
+}
+
+=item updir
+
+Returns a string representation of the parent directory.  ".." on UNIX.
+
+=cut
+
+sub updir () { '..' }
+
+=item no_upwards
+
+Given a list of file names, strip out those that refer to a parent
+directory. (Does not strip symlinks, only '.', '..', and equivalents.)
+
+=cut
+
+sub no_upwards {
+    my $self = shift;
+    return grep(!/^\.{1,2}\Z(?!\n)/s, @_);
+}
+
+=item case_tolerant
+
+Returns a true or false value indicating, respectively, that alphabetic
+is not or is significant when comparing file specifications.
+
+=cut
+
+sub case_tolerant () { 0 }
+
+=item file_name_is_absolute
+
+Takes as argument a path and returns true if it is an absolute path.
+
+This does not consult the local filesystem on Unix, Win32, OS/2 or Mac 
+OS (Classic).  It does consult the working environment for VMS (see
+L<File::Spec::VMS/file_name_is_absolute>).
+
+=cut
+
+sub file_name_is_absolute {
+    my ($self,$file) = @_;
+    return scalar($file =~ m:^/:s);
+}
+
+=item path
+
+Takes no argument, returns the environment variable PATH as an array.
+
+=cut
+
+sub path {
+    return () unless exists $ENV{PATH};
+    my @path = split(':', $ENV{PATH});
+    foreach (@path) { $_ = '.' if $_ eq '' }
+    return @path;
+}
+
+=item join
+
+join is the same as catfile.
+
+=cut
+
+sub join {
+    my $self = shift;
+    return $self->catfile(@_);
+}
+
+=item splitpath
+
+    ($volume,$directories,$file) = File::Spec->splitpath( $path );
+    ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+Splits a path into volume, directory, and filename portions. On systems
+with no concept of volume, returns '' for volume. 
+
+For systems with no syntax differentiating filenames from directories, 
+assumes that the last file is a path unless $no_file is true or a 
+trailing separator or /. or /.. is present. On Unix this means that $no_file
+true makes this return ( '', $path, '' ).
+
+The directory portion may or may not be returned with a trailing '/'.
+
+The results can be passed to L</catpath()> to get back a path equivalent to
+(usually identical to) the original path.
+
+=cut
+
+sub splitpath {
+    my ($self,$path, $nofile) = @_;
+
+    my ($volume,$directory,$file) = ('','','');
+
+    if ( $nofile ) {
+        $directory = $path;
+    }
+    else {
+        $path =~ m|^ ( (?: .* / (?: \.\.?\Z(?!\n) )? )? ) ([^/]*) |xs;
+        $directory = $1;
+        $file      = $2;
+    }
+
+    return ($volume,$directory,$file);
+}
+
+
+=item splitdir
+
+The opposite of L</catdir()>.
+
+    @dirs = File::Spec->splitdir( $directories );
+
+$directories must be only the directory portion of the path on systems 
+that have the concept of a volume or that have path syntax that differentiates
+files from directories.
+
+Unlike just splitting the directories on the separator, empty
+directory names (C<''>) can be returned, because these are significant
+on some OSs.
+
+On Unix,
+
+    File::Spec->splitdir( "/a/b//c/" );
+
+Yields:
+
+    ( '', 'a', 'b', '', 'c', '' )
+
+=cut
+
+sub splitdir {
+    return split m|/|, $_[1], -1;  # Preserve trailing fields
+}
+
+
+=item catpath()
+
+Takes volume, directory and file portions and returns an entire path. Under
+Unix, $volume is ignored, and directory and file are concatenated.  A '/' is
+inserted if needed (though if the directory portion doesn't start with
+'/' it is not added).  On other OSs, $volume is significant.
+
+=cut
+
+sub catpath {
+    my ($self,$volume,$directory,$file) = @_;
+
+    if ( $directory ne ''                && 
+         $file ne ''                     && 
+         substr( $directory, -1 ) ne '/' && 
+         substr( $file, 0, 1 ) ne '/' 
+    ) {
+        $directory .= "/$file" ;
+    }
+    else {
+        $directory .= $file ;
+    }
+
+    return $directory ;
+}
+
+=item abs2rel
+
+Takes a destination path and an optional base path returns a relative path
+from the base path to the destination path:
+
+    $rel_path = File::Spec->abs2rel( $path ) ;
+    $rel_path = File::Spec->abs2rel( $path, $base ) ;
+
+If $base is not present or '', then L<cwd()|Cwd> is used. If $base is
+relative, then it is converted to absolute form using
+L</rel2abs()>. This means that it is taken to be relative to
+L<cwd()|Cwd>.
+
+On systems that have a grammar that indicates filenames, this ignores the 
+$base filename. Otherwise all path components are assumed to be
+directories.
+
+If $path is relative, it is converted to absolute form using L</rel2abs()>.
+This means that it is taken to be relative to L<cwd()|Cwd>.
+
+No checks against the filesystem are made.  On VMS, there is
+interaction with the working environment, as logicals and
+macros are expanded.
+
+Based on code written by Shigio Yamaguchi.
+
+=cut
+
+sub abs2rel {
+    my($self,$path,$base) = @_;
+
+    # Clean up $path
+    if ( ! $self->file_name_is_absolute( $path ) ) {
+        $path = $self->rel2abs( $path ) ;
+    }
+    else {
+        $path = $self->canonpath( $path ) ;
+    }
+
+    # Figure out the effective $base and clean it up.
+    if ( !defined( $base ) || $base eq '' ) {
+        $base = $self->_cwd();
+    }
+    elsif ( ! $self->file_name_is_absolute( $base ) ) {
+        $base = $self->rel2abs( $base ) ;
+    }
+    else {
+        $base = $self->canonpath( $base ) ;
+    }
+
+    # Now, remove all leading components that are the same
+    my @pathchunks = $self->splitdir( $path);
+    my @basechunks = $self->splitdir( $base);
+
+    while (@pathchunks && @basechunks && $pathchunks[0] eq $basechunks[0]) {
+        shift @pathchunks ;
+        shift @basechunks ;
+    }
+
+    $path = CORE::join( '/', @pathchunks );
+    $base = CORE::join( '/', @basechunks );
+
+    # $base now contains the directories the resulting relative path 
+    # must ascend out of before it can descend to $path_directory.  So, 
+    # replace all names with $parentDir
+    $base =~ s|[^/]+|..|g ;
+
+    # Glue the two together, using a separator if necessary, and preventing an
+    # empty result.
+    if ( $path ne '' && $base ne '' ) {
+        $path = "$base/$path" ;
+    } else {
+        $path = "$base$path" ;
+    }
+
+    return $self->canonpath( $path ) ;
+}
+
+=item rel2abs()
+
+Converts a relative path to an absolute path. 
+
+    $abs_path = File::Spec->rel2abs( $path ) ;
+    $abs_path = File::Spec->rel2abs( $path, $base ) ;
+
+If $base is not present or '', then L<cwd()|Cwd> is used. If $base is
+relative, then it is converted to absolute form using
+L</rel2abs()>. This means that it is taken to be relative to
+L<cwd()|Cwd>.
+
+On systems that have a grammar that indicates filenames, this ignores
+the $base filename. Otherwise all path components are assumed to be
+directories.
+
+If $path is absolute, it is cleaned up and returned using L</canonpath()>.
+
+No checks against the filesystem are made.  On VMS, there is
+interaction with the working environment, as logicals and
+macros are expanded.
+
+Based on code written by Shigio Yamaguchi.
+
+=cut
+
+sub rel2abs {
+    my ($self,$path,$base ) = @_;
+
+    # Clean up $path
+    if ( ! $self->file_name_is_absolute( $path ) ) {
+        # Figure out the effective $base and clean it up.
+        if ( !defined( $base ) || $base eq '' ) {
+	    $base = $self->_cwd();
+        }
+        elsif ( ! $self->file_name_is_absolute( $base ) ) {
+            $base = $self->rel2abs( $base ) ;
+        }
+        else {
+            $base = $self->canonpath( $base ) ;
+        }
+
+        # Glom them together
+        $path = $self->catdir( $base, $path ) ;
+    }
+
+    return $self->canonpath( $path ) ;
+}
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters.  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<File::Spec>
+
+=cut
+
+# Internal routine to File::Spec, no point in making this public since
+# it is the standard Cwd interface.  Most of the platform-specific
+# File::Spec subclasses use this.
+sub _cwd {
+    require Cwd;
+    Cwd::cwd();
+}
+
+
+# Internal method to reduce xx\..\yy -> yy
+sub _collapse {
+    my($fs, $path) = @_;
+
+    my $updir  = $fs->updir;
+    my $curdir = $fs->curdir;
+
+    my($vol, $dirs, $file) = $fs->splitpath($path);
+    my @dirs = $fs->splitdir($dirs);
+
+    my @collapsed;
+    foreach my $dir (@dirs) {
+        if( $dir eq $updir              and   # if we have an updir
+            @collapsed                  and   # and something to collapse
+            length $collapsed[-1]       and   # and its not the rootdir
+            $collapsed[-1] ne $updir    and   # nor another updir
+            $collapsed[-1] ne $curdir         # nor the curdir
+          ) 
+        {                                     # then
+            pop @collapsed;                   # collapse
+        }
+        else {                                # else
+            push @collapsed, $dir;            # just hang onto it
+        }
+    }
+
+    return $fs->catpath($vol,
+                        $fs->catdir(@collapsed),
+                        $file
+                       );
+}
+
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Spec/VMS.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Spec/VMS.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Spec/VMS.pm	(revision 14489)
@@ -0,0 +1,521 @@
+package File::Spec::VMS;
+
+use strict;
+use vars qw(@ISA $VERSION);
+require File::Spec::Unix;
+
+$VERSION = '1.4';
+
+@ISA = qw(File::Spec::Unix);
+
+use File::Basename;
+use VMS::Filespec;
+
+=head1 NAME
+
+File::Spec::VMS - methods for VMS file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::VMS; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See File::Spec::Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=over 4
+
+=item canonpath (override)
+
+Removes redundant portions of file specifications according to VMS syntax.
+
+=cut
+
+sub canonpath {
+    my($self,$path) = @_;
+
+    if ($path =~ m|/|) { # Fake Unix
+      my $pathify = $path =~ m|/\Z(?!\n)|;
+      $path = $self->SUPER::canonpath($path);
+      if ($pathify) { return vmspath($path); }
+      else          { return vmsify($path);  }
+    }
+    else {
+	$path =~ tr/<>/[]/;			# < and >       ==> [ and ]
+	$path =~ s/\]\[\./\.\]\[/g;		# ][.		==> .][
+	$path =~ s/\[000000\.\]\[/\[/g;		# [000000.][	==> [
+	$path =~ s/\[000000\./\[/g;		# [000000.	==> [
+	$path =~ s/\.\]\[000000\]/\]/g;		# .][000000]	==> ]
+	$path =~ s/\.\]\[/\./g;			# foo.][bar     ==> foo.bar
+	1 while ($path =~ s/([\[\.])(-+)\.(-+)([\.\]])/$1$2$3$4/);
+						# That loop does the following
+						# with any amount of dashes:
+						# .-.-.		==> .--.
+						# [-.-.		==> [--.
+						# .-.-]		==> .--]
+						# [-.-]		==> [--]
+	1 while ($path =~ s/([\[\.])[^\]\.]+\.-(-+)([\]\.])/$1$2$3/);
+						# That loop does the following
+						# with any amount (minimum 2)
+						# of dashes:
+						# .foo.--.	==> .-.
+						# .foo.--]	==> .-]
+						# [foo.--.	==> [-.
+						# [foo.--]	==> [-]
+						#
+						# And then, the remaining cases
+	$path =~ s/\[\.-/[-/;			# [.-		==> [-
+	$path =~ s/\.[^\]\.]+\.-\./\./g;	# .foo.-.	==> .
+	$path =~ s/\[[^\]\.]+\.-\./\[/g;	# [foo.-.	==> [
+	$path =~ s/\.[^\]\.]+\.-\]/\]/g;	# .foo.-]	==> ]
+	$path =~ s/\[[^\]\.]+\.-\]/\[000000\]/g;# [foo.-]       ==> [000000]
+	$path =~ s/\[\]//;			# []		==>
+	return $path;
+    }
+}
+
+=item catdir (override)
+
+Concatenates a list of file specifications, and returns the result as a
+VMS-syntax directory specification.  No check is made for "impossible"
+cases (e.g. elements other than the first being absolute filespecs).
+
+=cut
+
+sub catdir {
+    my ($self,@dirs) = @_;
+    my $dir = pop @dirs;
+    @dirs = grep($_,@dirs);
+    my $rslt;
+    if (@dirs) {
+	my $path = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs));
+	my ($spath,$sdir) = ($path,$dir);
+	$spath =~ s/\.dir\Z(?!\n)//; $sdir =~ s/\.dir\Z(?!\n)//; 
+	$sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+\Z(?!\n)/s;
+	$rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1);
+
+	# Special case for VMS absolute directory specs: these will have had device
+	# prepended during trip through Unix syntax in eliminate_macros(), since
+	# Unix syntax has no way to express "absolute from the top of this device's
+	# directory tree".
+	if ($spath =~ /^[\[<][^.\-]/s) { $rslt =~ s/^[^\[<]+//s; }
+    }
+    else {
+	if    (not defined $dir or not length $dir) { $rslt = ''; }
+	elsif ($dir =~ /^\$\([^\)]+\)\Z(?!\n)/s)          { $rslt = $dir; }
+	else                                        { $rslt = vmspath($dir); }
+    }
+    return $self->canonpath($rslt);
+}
+
+=item catfile (override)
+
+Concatenates a list of file specifications, and returns the result as a
+VMS-syntax file specification.
+
+=cut
+
+sub catfile {
+    my ($self,@files) = @_;
+    my $file = $self->canonpath(pop @files);
+    @files = grep($_,@files);
+    my $rslt;
+    if (@files) {
+	my $path = (@files == 1 ? $files[0] : $self->catdir(@files));
+	my $spath = $path;
+	$spath =~ s/\.dir\Z(?!\n)//;
+	if ($spath =~ /^[^\)\]\/:>]+\)\Z(?!\n)/s && basename($file) eq $file) {
+	    $rslt = "$spath$file";
+	}
+	else {
+	    $rslt = $self->eliminate_macros($spath);
+	    $rslt = vmsify($rslt.($rslt ? '/' : '').unixify($file));
+	}
+    }
+    else { $rslt = (defined($file) && length($file)) ? vmsify($file) : ''; }
+    return $self->canonpath($rslt);
+}
+
+
+=item curdir (override)
+
+Returns a string representation of the current directory: '[]'
+
+=cut
+
+sub curdir {
+    return '[]';
+}
+
+=item devnull (override)
+
+Returns a string representation of the null device: '_NLA0:'
+
+=cut
+
+sub devnull {
+    return "_NLA0:";
+}
+
+=item rootdir (override)
+
+Returns a string representation of the root directory: 'SYS$DISK:[000000]'
+
+=cut
+
+sub rootdir {
+    return 'SYS$DISK:[000000]';
+}
+
+=item tmpdir (override)
+
+Returns a string representation of the first writable directory
+from the following list or '' if none are writable:
+
+    sys$scratch:
+    $ENV{TMPDIR}
+
+Since perl 5.8.0, if running under taint mode, and if $ENV{TMPDIR}
+is tainted, it is not used.
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+    return $tmpdir if defined $tmpdir;
+    $tmpdir = $_[0]->_tmpdir( 'sys$scratch:', $ENV{TMPDIR} );
+}
+
+=item updir (override)
+
+Returns a string representation of the parent directory: '[-]'
+
+=cut
+
+sub updir {
+    return '[-]';
+}
+
+=item case_tolerant (override)
+
+VMS file specification syntax is case-tolerant.
+
+=cut
+
+sub case_tolerant {
+    return 1;
+}
+
+=item path (override)
+
+Translate logical name DCL$PATH as a searchlist, rather than trying
+to C<split> string value of C<$ENV{'PATH'}>.
+
+=cut
+
+sub path {
+    my (@dirs,$dir,$i);
+    while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); }
+    return @dirs;
+}
+
+=item file_name_is_absolute (override)
+
+Checks for VMS directory spec as well as Unix separators.
+
+=cut
+
+sub file_name_is_absolute {
+    my ($self,$file) = @_;
+    # If it's a logical name, expand it.
+    $file = $ENV{$file} while $file =~ /^[\w\$\-]+\Z(?!\n)/s && $ENV{$file};
+    return scalar($file =~ m!^/!s             ||
+		  $file =~ m![<\[][^.\-\]>]!  ||
+		  $file =~ /:[^<\[]/);
+}
+
+=item splitpath (override)
+
+Splits using VMS syntax.
+
+=cut
+
+sub splitpath {
+    my($self,$path) = @_;
+    my($dev,$dir,$file) = ('','','');
+
+    vmsify($path) =~ /(.+:)?([\[<].*[\]>])?(.*)/s;
+    return ($1 || '',$2 || '',$3);
+}
+
+=item splitdir (override)
+
+Split dirspec using VMS syntax.
+
+=cut
+
+sub splitdir {
+    my($self,$dirspec) = @_;
+    $dirspec =~ tr/<>/[]/;			# < and >	==> [ and ]
+    $dirspec =~ s/\]\[\./\.\]\[/g;		# ][.		==> .][
+    $dirspec =~ s/\[000000\.\]\[/\[/g;		# [000000.][	==> [
+    $dirspec =~ s/\[000000\./\[/g;		# [000000.	==> [
+    $dirspec =~ s/\.\]\[000000\]/\]/g;		# .][000000]	==> ]
+    $dirspec =~ s/\.\]\[/\./g;			# foo.][bar	==> foo.bar
+    while ($dirspec =~ s/(^|[\[\<\.])\-(\-+)($|[\]\>\.])/$1-.$2$3/g) {}
+						# That loop does the following
+						# with any amount of dashes:
+						# .--.		==> .-.-.
+						# [--.		==> [-.-.
+						# .--]		==> .-.-]
+						# [--]		==> [-.-]
+    $dirspec = "[$dirspec]" unless $dirspec =~ /[\[<]/; # make legal
+    my(@dirs) = split('\.', vmspath($dirspec));
+    $dirs[0] =~ s/^[\[<]//s;  $dirs[-1] =~ s/[\]>]\Z(?!\n)//s;
+    @dirs;
+}
+
+
+=item catpath (override)
+
+Construct a complete filespec using VMS syntax
+
+=cut
+
+sub catpath {
+    my($self,$dev,$dir,$file) = @_;
+    
+    # We look for a volume in $dev, then in $dir, but not both
+    my ($dir_volume, $dir_dir, $dir_file) = $self->splitpath($dir);
+    $dev = $dir_volume unless length $dev;
+    $dir = length $dir_file ? $self->catfile($dir_dir, $dir_file) : $dir_dir;
+    
+    if ($dev =~ m|^/+([^/]+)|) { $dev = "$1:"; }
+    else { $dev .= ':' unless $dev eq '' or $dev =~ /:\Z(?!\n)/; }
+    if (length($dev) or length($dir)) {
+      $dir = "[$dir]" unless $dir =~ /[\[<\/]/;
+      $dir = vmspath($dir);
+    }
+    "$dev$dir$file";
+}
+
+=item abs2rel (override)
+
+Use VMS syntax when converting filespecs.
+
+=cut
+
+sub abs2rel {
+    my $self = shift;
+    return vmspath(File::Spec::Unix::abs2rel( $self, @_ ))
+        if grep m{/}, @_;
+
+    my($path,$base) = @_;
+    $base = $self->_cwd() unless defined $base and length $base;
+
+    for ($path, $base) { $_ = $self->canonpath($_) }
+
+    # Are we even starting $path on the same (node::)device as $base?  Note that
+    # logical paths or nodename differences may be on the "same device" 
+    # but the comparison that ignores device differences so as to concatenate 
+    # [---] up directory specs is not even a good idea in cases where there is 
+    # a logical path difference between $path and $base nodename and/or device.
+    # Hence we fall back to returning the absolute $path spec
+    # if there is a case blind device (or node) difference of any sort
+    # and we do not even try to call $parse() or consult %ENV for $trnlnm()
+    # (this module needs to run on non VMS platforms after all).
+    
+    my ($path_volume, $path_directories, $path_file) = $self->splitpath($path);
+    my ($base_volume, $base_directories, $base_file) = $self->splitpath($base);
+    return $path unless lc($path_volume) eq lc($base_volume);
+
+    for ($path, $base) { $_ = $self->rel2abs($_) }
+
+    # Now, remove all leading components that are the same
+    my @pathchunks = $self->splitdir( $path_directories );
+    unshift(@pathchunks,'000000') unless $pathchunks[0] eq '000000';
+    my @basechunks = $self->splitdir( $base_directories );
+    unshift(@basechunks,'000000') unless $basechunks[0] eq '000000';
+
+    while ( @pathchunks && 
+            @basechunks && 
+            lc( $pathchunks[0] ) eq lc( $basechunks[0] ) 
+          ) {
+        shift @pathchunks ;
+        shift @basechunks ;
+    }
+
+    # @basechunks now contains the directories to climb out of,
+    # @pathchunks now has the directories to descend in to.
+    $path_directories = join '.', ('-' x @basechunks, @pathchunks) ;
+    return $self->canonpath( $self->catpath( '', $path_directories, $path_file ) ) ;
+}
+
+
+=item rel2abs (override)
+
+Use VMS syntax when converting filespecs.
+
+=cut
+
+sub rel2abs {
+    my $self = shift ;
+    my ($path,$base ) = @_;
+    return undef unless defined $path;
+    if ($path =~ m/\//) {
+	$path = ( -d $path || $path =~ m/\/\z/  # educated guessing about
+		   ? vmspath($path)             # whether it's a directory
+		   : vmsify($path) );
+    }
+    $base = vmspath($base) if defined $base && $base =~ m/\//;
+    # Clean up and split up $path
+    if ( ! $self->file_name_is_absolute( $path ) ) {
+        # Figure out the effective $base and clean it up.
+        if ( !defined( $base ) || $base eq '' ) {
+            $base = $self->_cwd;
+        }
+        elsif ( ! $self->file_name_is_absolute( $base ) ) {
+            $base = $self->rel2abs( $base ) ;
+        }
+        else {
+            $base = $self->canonpath( $base ) ;
+        }
+
+        # Split up paths
+        my ( $path_directories, $path_file ) =
+            ($self->splitpath( $path ))[1,2] ;
+
+        my ( $base_volume, $base_directories ) =
+            $self->splitpath( $base ) ;
+
+        $path_directories = '' if $path_directories eq '[]' ||
+                                  $path_directories eq '<>';
+        my $sep = '' ;
+        $sep = '.'
+            if ( $base_directories =~ m{[^.\]>]\Z(?!\n)} &&
+                 $path_directories =~ m{^[^.\[<]}s
+            ) ;
+        $base_directories = "$base_directories$sep$path_directories";
+        $base_directories =~ s{\.?[\]>][\[<]\.?}{.};
+
+        $path = $self->catpath( $base_volume, $base_directories, $path_file );
+   }
+
+    return $self->canonpath( $path ) ;
+}
+
+
+# eliminate_macros() and fixpath() are MakeMaker-specific methods
+# which are used inside catfile() and catdir().  MakeMaker has its own
+# copies as of 6.06_03 which are the canonical ones.  We leave these
+# here, in peace, so that File::Spec continues to work with MakeMakers
+# prior to 6.06_03.
+# 
+# Please consider these two methods deprecated.  Do not patch them,
+# patch the ones in ExtUtils::MM_VMS instead.
+sub eliminate_macros {
+    my($self,$path) = @_;
+    return '' unless $path;
+    $self = {} unless ref $self;
+
+    if ($path =~ /\s/) {
+      return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
+    }
+
+    my($npath) = unixify($path);
+    my($complex) = 0;
+    my($head,$macro,$tail);
+
+    # perform m##g in scalar context so it acts as an iterator
+    while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) { 
+        if ($self->{$2}) {
+            ($head,$macro,$tail) = ($1,$2,$3);
+            if (ref $self->{$macro}) {
+                if (ref $self->{$macro} eq 'ARRAY') {
+                    $macro = join ' ', @{$self->{$macro}};
+                }
+                else {
+                    print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
+                          "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
+                    $macro = "\cB$macro\cB";
+                    $complex = 1;
+                }
+            }
+            else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
+            $npath = "$head$macro$tail";
+        }
+    }
+    if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
+    $npath;
+}
+
+# Deprecated.  See the note above for eliminate_macros().
+sub fixpath {
+    my($self,$path,$force_path) = @_;
+    return '' unless $path;
+    $self = bless {} unless ref $self;
+    my($fixedpath,$prefix,$name);
+
+    if ($path =~ /\s/) {
+      return join ' ',
+             map { $self->fixpath($_,$force_path) }
+	     split /\s+/, $path;
+    }
+
+    if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) { 
+        if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
+            $fixedpath = vmspath($self->eliminate_macros($path));
+        }
+        else {
+            $fixedpath = vmsify($self->eliminate_macros($path));
+        }
+    }
+    elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
+        my($vmspre) = $self->eliminate_macros("\$($prefix)");
+        # is it a dir or just a name?
+        $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
+        $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
+        $fixedpath = vmspath($fixedpath) if $force_path;
+    }
+    else {
+        $fixedpath = $path;
+        $fixedpath = vmspath($fixedpath) if $force_path;
+    }
+    # No hints, so we try to guess
+    if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
+        $fixedpath = vmspath($fixedpath) if -d $fixedpath;
+    }
+
+    # Trim off root dirname if it's had other dirs inserted in front of it.
+    $fixedpath =~ s/\.000000([\]>])/$1/;
+    # Special case for VMS absolute directory specs: these will have had device
+    # prepended during trip through Unix syntax in eliminate_macros(), since
+    # Unix syntax has no way to express "absolute from the top of this device's
+    # directory tree".
+    if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
+    $fixedpath;
+}
+
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters.  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
+
+See L<File::Spec> and L<File::Spec::Unix>.  This package overrides the
+implementation of these methods, not the semantics.
+
+An explanation of VMS file specs can be found at
+L<"http://h71000.www7.hp.com/doc/731FINAL/4506/4506pro_014.html#apps_locating_naming_files">.
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Win32.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Win32.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Spec/Win32.pm	(revision 14489)
@@ -0,0 +1,369 @@
+package File::Spec::Win32;
+
+use strict;
+
+use vars qw(@ISA $VERSION);
+require File::Spec::Unix;
+
+$VERSION = '1.6';
+
+@ISA = qw(File::Spec::Unix);
+
+=head1 NAME
+
+File::Spec::Win32 - methods for Win32 file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::Win32; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See File::Spec::Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=over 4
+
+=item devnull
+
+Returns a string representation of the null device.
+
+=cut
+
+sub devnull {
+    return "nul";
+}
+
+sub rootdir () { '\\' }
+
+
+=item tmpdir
+
+Returns a string representation of the first existing directory
+from the following list:
+
+    $ENV{TMPDIR}
+    $ENV{TEMP}
+    $ENV{TMP}
+    SYS:/temp
+    C:\system\temp
+    C:/temp
+    /tmp
+    /
+
+The SYS:/temp is preferred in Novell NetWare and the C:\system\temp
+for Symbian (the File::Spec::Win32 is used also for those platforms).
+
+Since Perl 5.8.0, if running under taint mode, and if the environment
+variables are tainted, they are not used.
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+    return $tmpdir if defined $tmpdir;
+    $tmpdir = $_[0]->_tmpdir( @ENV{qw(TMPDIR TEMP TMP)},
+			      'SYS:/temp',
+			      'C:\system\temp',
+			      'C:/temp',
+			      '/tmp',
+			      '/'  );
+}
+
+sub case_tolerant {
+    return 1;
+}
+
+sub file_name_is_absolute {
+    my ($self,$file) = @_;
+    return scalar($file =~ m{^([a-z]:)?[\\/]}is);
+}
+
+=item catfile
+
+Concatenate one or more directory names and a filename to form a
+complete path ending with a filename
+
+=cut
+
+sub catfile {
+    my $self = shift;
+    my $file = $self->canonpath(pop @_);
+    return $file unless @_;
+    my $dir = $self->catdir(@_);
+    $dir .= "\\" unless substr($dir,-1) eq "\\";
+    return $dir.$file;
+}
+
+sub catdir {
+    my $self = shift;
+    my @args = @_;
+    foreach (@args) {
+	tr[/][\\];
+        # append a backslash to each argument unless it has one there
+        $_ .= "\\" unless m{\\$};
+    }
+    return $self->canonpath(join('', @args));
+}
+
+sub path {
+    my @path = split(';', $ENV{PATH});
+    s/"//g for @path;
+    @path = grep length, @path;
+    unshift(@path, ".");
+    return @path;
+}
+
+=item canonpath
+
+No physical check on the filesystem, but a logical cleanup of a
+path. On UNIX eliminated successive slashes and successive "/.".
+On Win32 makes 
+
+	dir1\dir2\dir3\..\..\dir4 -> \dir\dir4 and even
+	dir1\dir2\dir3\...\dir4   -> \dir\dir4
+
+=cut
+
+sub canonpath {
+    my ($self,$path) = @_;
+    
+    $path =~ s/^([a-z]:)/\u$1/s;
+    $path =~ s|/|\\|g;
+    $path =~ s|([^\\])\\+|$1\\|g;                  # xx\\\\xx  -> xx\xx
+    $path =~ s|(\\\.)+\\|\\|g;                     # xx\.\.\xx -> xx\xx
+    $path =~ s|^(\.\\)+||s unless $path eq ".\\";  # .\xx      -> xx
+    $path =~ s|\\\Z(?!\n)||
+	unless $path =~ m{^([A-Z]:)?\\\Z(?!\n)}s;  # xx\       -> xx
+    # xx1/xx2/xx3/../../xx -> xx1/xx
+    $path =~ s|\\\.\.\.\\|\\\.\.\\\.\.\\|g; # \...\ is 2 levels up
+    $path =~ s|^\.\.\.\\|\.\.\\\.\.\\|g;    # ...\ is 2 levels up
+    return $path if $path =~ m|^\.\.|;      # skip relative paths
+    return $path unless $path =~ /\.\./;    # too few .'s to cleanup
+    return $path if $path =~ /\.\.\.\./;    # too many .'s to cleanup
+    $path =~ s{^\\\.\.$}{\\};                      # \..    -> \
+    1 while $path =~ s{^\\\.\.}{};                 # \..\xx -> \xx
+
+    return $self->_collapse($path);
+}
+
+=item splitpath
+
+    ($volume,$directories,$file) = File::Spec->splitpath( $path );
+    ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+Splits a path into volume, directory, and filename portions. Assumes that 
+the last file is a path unless the path ends in '\\', '\\.', '\\..'
+or $no_file is true.  On Win32 this means that $no_file true makes this return 
+( $volume, $path, '' ).
+
+Separators accepted are \ and /.
+
+Volumes can be drive letters or UNC sharenames (\\server\share).
+
+The results can be passed to L</catpath> to get back a path equivalent to
+(usually identical to) the original path.
+
+=cut
+
+sub splitpath {
+    my ($self,$path, $nofile) = @_;
+    my ($volume,$directory,$file) = ('','','');
+    if ( $nofile ) {
+        $path =~ 
+            m{^( (?:[a-zA-Z]:|(?:\\\\|//)[^\\/]+[\\/][^\\/]+)? ) 
+                 (.*)
+             }xs;
+        $volume    = $1;
+        $directory = $2;
+    }
+    else {
+        $path =~ 
+            m{^ ( (?: [a-zA-Z]: |
+                      (?:\\\\|//)[^\\/]+[\\/][^\\/]+
+                  )?
+                )
+                ( (?:.*[\\/](?:\.\.?\Z(?!\n))?)? )
+                (.*)
+             }xs;
+        $volume    = $1;
+        $directory = $2;
+        $file      = $3;
+    }
+
+    return ($volume,$directory,$file);
+}
+
+
+=item splitdir
+
+The opposite of L<catdir()|File::Spec/catdir()>.
+
+    @dirs = File::Spec->splitdir( $directories );
+
+$directories must be only the directory portion of the path on systems 
+that have the concept of a volume or that have path syntax that differentiates
+files from directories.
+
+Unlike just splitting the directories on the separator, leading empty and 
+trailing directory entries can be returned, because these are significant
+on some OSs. So,
+
+    File::Spec->splitdir( "/a/b/c" );
+
+Yields:
+
+    ( '', 'a', 'b', '', 'c', '' )
+
+=cut
+
+sub splitdir {
+    my ($self,$directories) = @_ ;
+    #
+    # split() likes to forget about trailing null fields, so here we
+    # check to be sure that there will not be any before handling the
+    # simple case.
+    #
+    if ( $directories !~ m|[\\/]\Z(?!\n)| ) {
+        return split( m|[\\/]|, $directories );
+    }
+    else {
+        #
+        # since there was a trailing separator, add a file name to the end, 
+        # then do the split, then replace it with ''.
+        #
+        my( @directories )= split( m|[\\/]|, "${directories}dummy" ) ;
+        $directories[ $#directories ]= '' ;
+        return @directories ;
+    }
+}
+
+
+=item catpath
+
+Takes volume, directory and file portions and returns an entire path. Under
+Unix, $volume is ignored, and this is just like catfile(). On other OSs,
+the $volume become significant.
+
+=cut
+
+sub catpath {
+    my ($self,$volume,$directory,$file) = @_;
+
+    # If it's UNC, make sure the glue separator is there, reusing
+    # whatever separator is first in the $volume
+    my $v;
+    $volume .= $v
+        if ( (($v) = $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s) &&
+             $directory =~ m@^[^\\/]@s
+           ) ;
+
+    $volume .= $directory ;
+
+    # If the volume is not just A:, make sure the glue separator is 
+    # there, reusing whatever separator is first in the $volume if possible.
+    if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s &&
+         $volume =~ m@[^\\/]\Z(?!\n)@      &&
+         $file   =~ m@[^\\/]@
+       ) {
+        $volume =~ m@([\\/])@ ;
+        my $sep = $1 ? $1 : '\\' ;
+        $volume .= $sep ;
+    }
+
+    $volume .= $file ;
+
+    return $volume ;
+}
+
+
+sub abs2rel {
+    my($self,$path,$base) = @_;
+    $base = $self->_cwd() unless defined $base and length $base;
+
+    for ($path, $base) { $_ = $self->canonpath($_) }
+
+    my ($path_volume) = $self->splitpath($path, 1);
+    my ($base_volume) = $self->splitpath($base, 1);
+
+    # Can't relativize across volumes
+    return $path unless $path_volume eq $base_volume;
+
+    for ($path, $base) { $_ = $self->rel2abs($_) }
+
+    my $path_directories = ($self->splitpath($path, 1))[1];
+    my $base_directories = ($self->splitpath($base, 1))[1];
+
+    # Now, remove all leading components that are the same
+    my @pathchunks = $self->splitdir( $path_directories );
+    my @basechunks = $self->splitdir( $base_directories );
+
+    while ( @pathchunks && 
+            @basechunks && 
+            lc( $pathchunks[0] ) eq lc( $basechunks[0] ) 
+          ) {
+        shift @pathchunks ;
+        shift @basechunks ;
+    }
+
+    my $result_dirs = $self->catdir( ($self->updir) x @basechunks, @pathchunks );
+
+    return $self->canonpath( $self->catpath('', $result_dirs, '') );
+}
+
+
+sub rel2abs {
+    my ($self,$path,$base ) = @_;
+
+    if ( ! $self->file_name_is_absolute( $path ) ) {
+
+        if ( !defined( $base ) || $base eq '' ) {
+	    require Cwd ;
+	    $base = Cwd::getdcwd( ($self->splitpath( $path ))[0] ) if defined &Cwd::getdcwd ;
+	    $base = $self->_cwd() unless defined $base ;
+        }
+        elsif ( ! $self->file_name_is_absolute( $base ) ) {
+            $base = $self->rel2abs( $base ) ;
+        }
+        else {
+            $base = $self->canonpath( $base ) ;
+        }
+
+        my ( $path_directories, $path_file ) =
+            ($self->splitpath( $path, 1 ))[1,2] ;
+
+        my ( $base_volume, $base_directories ) =
+            $self->splitpath( $base, 1 ) ;
+
+        $path = $self->catpath( 
+            $base_volume, 
+            $self->catdir( $base_directories, $path_directories ), 
+            $path_file
+        ) ;
+    }
+
+    return $self->canonpath( $path ) ;
+}
+
+=back
+
+=head2 Note For File::Spec::Win32 Maintainers
+
+Novell NetWare inherits its File::Spec behaviour from File::Spec::Win32.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by the Perl 5 Porters.  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
+
+See L<File::Spec> and L<File::Spec::Unix>.  This package overrides the
+implementation of these methods, not the semantics.
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/Temp.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/Temp.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/Temp.pm	(revision 14489)
@@ -0,0 +1,2244 @@
+package File::Temp;
+
+=head1 NAME
+
+File::Temp - return name and handle of a temporary file safely
+
+=begin __INTERNALS
+
+=head1 PORTABILITY
+
+This section is at the top in order to provide easier access to
+porters.  It is not expected to be rendered by a standard pod
+formatting tool. Please skip straight to the SYNOPSIS section if you
+are not trying to port this module to a new platform.
+
+This module is designed to be portable across operating systems and it
+currently supports Unix, VMS, DOS, OS/2, Windows and Mac OS
+(Classic). When porting to a new OS there are generally three main
+issues that have to be solved:
+
+=over 4
+
+=item *
+
+Can the OS unlink an open file? If it can not then the
+C<_can_unlink_opened_file> method should be modified.
+
+=item *
+
+Are the return values from C<stat> reliable? By default all the
+return values from C<stat> are compared when unlinking a temporary
+file using the filename and the handle. Operating systems other than
+unix do not always have valid entries in all fields. If C<unlink0> fails
+then the C<stat> comparison should be modified accordingly.
+
+=item *
+
+Security. Systems that can not support a test for the sticky bit
+on a directory can not use the MEDIUM and HIGH security tests.
+The C<_can_do_level> method should be modified accordingly.
+
+=back
+
+=end __INTERNALS
+
+=head1 SYNOPSIS
+
+  use File::Temp qw/ tempfile tempdir /;
+
+  $fh = tempfile();
+  ($fh, $filename) = tempfile();
+
+  ($fh, $filename) = tempfile( $template, DIR => $dir);
+  ($fh, $filename) = tempfile( $template, SUFFIX => '.dat');
+
+
+  $dir = tempdir( CLEANUP => 1 );
+  ($fh, $filename) = tempfile( DIR => $dir );
+
+Object interface:
+
+  require File::Temp;
+  use File::Temp ();
+
+  $fh = new File::Temp($template);
+  $fname = $fh->filename;
+
+  $tmp = new File::Temp( UNLINK => 0, SUFFIX => '.dat' );
+  print $tmp "Some data\n";
+  print "Filename is $tmp\n";
+
+The following interfaces are provided for compatibility with
+existing APIs. They should not be used in new code.
+
+MkTemp family:
+
+  use File::Temp qw/ :mktemp  /;
+
+  ($fh, $file) = mkstemp( "tmpfileXXXXX" );
+  ($fh, $file) = mkstemps( "tmpfileXXXXXX", $suffix);
+
+  $tmpdir = mkdtemp( $template );
+
+  $unopened_file = mktemp( $template );
+
+POSIX functions:
+
+  use File::Temp qw/ :POSIX /;
+
+  $file = tmpnam();
+  $fh = tmpfile();
+
+  ($fh, $file) = tmpnam();
+
+Compatibility functions:
+
+  $unopened_file = File::Temp::tempnam( $dir, $pfx );
+
+=head1 DESCRIPTION
+
+C<File::Temp> can be used to create and open temporary files in a safe
+way.  There is both a function interface and an object-oriented
+interface.  The File::Temp constructor or the tempfile() function can
+be used to return the name and the open filehandle of a temporary
+file.  The tempdir() function can be used to create a temporary
+directory.
+
+The security aspect of temporary file creation is emphasized such that
+a filehandle and filename are returned together.  This helps guarantee
+that a race condition can not occur where the temporary file is
+created by another process between checking for the existence of the
+file and its opening.  Additional security levels are provided to
+check, for example, that the sticky bit is set on world writable
+directories.  See L<"safe_level"> for more information.
+
+For compatibility with popular C library functions, Perl implementations of
+the mkstemp() family of functions are provided. These are, mkstemp(),
+mkstemps(), mkdtemp() and mktemp().
+
+Additionally, implementations of the standard L<POSIX|POSIX>
+tmpnam() and tmpfile() functions are provided if required.
+
+Implementations of mktemp(), tmpnam(), and tempnam() are provided,
+but should be used with caution since they return only a filename
+that was valid when function was called, so cannot guarantee
+that the file will not exist by the time the caller opens the filename.
+
+=cut
+
+# 5.6.0 gives us S_IWOTH, S_IWGRP, our and auto-vivifying filehandls
+# People would like a version on 5.005 so give them what they want :-)
+use 5.005;
+use strict;
+use Carp;
+use File::Spec 0.8;
+use File::Path qw/ rmtree /;
+use Fcntl 1.03;
+use Errno;
+require VMS::Stdio if $^O eq 'VMS';
+
+# Need the Symbol package if we are running older perl
+require Symbol if $] < 5.006;
+
+### For the OO interface
+use base qw/ IO::Handle /;
+use overload '""' => "STRINGIFY";
+
+
+# use 'our' on v5.6.0
+use vars qw($VERSION @EXPORT_OK %EXPORT_TAGS $DEBUG $KEEP_ALL);
+
+$DEBUG = 0;
+$KEEP_ALL = 0;
+
+# We are exporting functions
+
+use base qw/Exporter/;
+
+# Export list - to allow fine tuning of export table
+
+@EXPORT_OK = qw{
+	      tempfile
+	      tempdir
+	      tmpnam
+	      tmpfile
+	      mktemp
+	      mkstemp
+	      mkstemps
+	      mkdtemp
+	      unlink0
+	      cleanup
+		};
+
+# Groups of functions for export
+
+%EXPORT_TAGS = (
+		'POSIX' => [qw/ tmpnam tmpfile /],
+		'mktemp' => [qw/ mktemp mkstemp mkstemps mkdtemp/],
+	       );
+
+# add contents of these tags to @EXPORT
+Exporter::export_tags('POSIX','mktemp');
+
+# Version number
+
+$VERSION = '0.16';
+
+# This is a list of characters that can be used in random filenames
+
+my @CHARS = (qw/ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
+	         a b c d e f g h i j k l m n o p q r s t u v w x y z
+	         0 1 2 3 4 5 6 7 8 9 _
+	     /);
+
+# Maximum number of tries to make a temp file before failing
+
+use constant MAX_TRIES => 1000;
+
+# Minimum number of X characters that should be in a template
+use constant MINX => 4;
+
+# Default template when no template supplied
+
+use constant TEMPXXX => 'X' x 10;
+
+# Constants for the security level
+
+use constant STANDARD => 0;
+use constant MEDIUM   => 1;
+use constant HIGH     => 2;
+
+# OPENFLAGS. If we defined the flag to use with Sysopen here this gives
+# us an optimisation when many temporary files are requested
+
+my $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR;
+
+unless ($^O eq 'MacOS') {
+  for my $oflag (qw/ NOFOLLOW BINARY LARGEFILE EXLOCK NOINHERIT /) {
+    my ($bit, $func) = (0, "Fcntl::O_" . $oflag);
+    no strict 'refs';
+    $OPENFLAGS |= $bit if eval {
+      # Make sure that redefined die handlers do not cause problems
+      # eg CGI::Carp
+      local $SIG{__DIE__} = sub {};
+      local $SIG{__WARN__} = sub {};
+      $bit = &$func();
+      1;
+    };
+  }
+}
+
+# On some systems the O_TEMPORARY flag can be used to tell the OS
+# to automatically remove the file when it is closed. This is fine
+# in most cases but not if tempfile is called with UNLINK=>0 and
+# the filename is requested -- in the case where the filename is to
+# be passed to another routine. This happens on windows. We overcome
+# this by using a second open flags variable
+
+my $OPENTEMPFLAGS = $OPENFLAGS;
+unless ($^O eq 'MacOS') {
+  for my $oflag (qw/ TEMPORARY /) {
+    my ($bit, $func) = (0, "Fcntl::O_" . $oflag);
+    no strict 'refs';
+    $OPENTEMPFLAGS |= $bit if eval {
+      # Make sure that redefined die handlers do not cause problems
+      # eg CGI::Carp
+      local $SIG{__DIE__} = sub {};
+      local $SIG{__WARN__} = sub {};
+      $bit = &$func();
+      1;
+    };
+  }
+}
+
+# INTERNAL ROUTINES - not to be used outside of package
+
+# Generic routine for getting a temporary filename
+# modelled on OpenBSD _gettemp() in mktemp.c
+
+# The template must contain X's that are to be replaced
+# with the random values
+
+#  Arguments:
+
+#  TEMPLATE   - string containing the XXXXX's that is converted
+#           to a random filename and opened if required
+
+# Optionally, a hash can also be supplied containing specific options
+#   "open" => if true open the temp file, else just return the name
+#             default is 0
+#   "mkdir"=> if true, we are creating a temp directory rather than tempfile
+#             default is 0
+#   "suffixlen" => number of characters at end of PATH to be ignored.
+#                  default is 0.
+#   "unlink_on_close" => indicates that, if possible,  the OS should remove
+#                        the file as soon as it is closed. Usually indicates
+#                        use of the O_TEMPORARY flag to sysopen.
+#                        Usually irrelevant on unix
+
+# Optionally a reference to a scalar can be passed into the function
+# On error this will be used to store the reason for the error
+#   "ErrStr"  => \$errstr
+
+# "open" and "mkdir" can not both be true
+# "unlink_on_close" is not used when "mkdir" is true.
+
+# The default options are equivalent to mktemp().
+
+# Returns:
+#   filehandle - open file handle (if called with doopen=1, else undef)
+#   temp name  - name of the temp file or directory
+
+# For example:
+#   ($fh, $name) = _gettemp($template, "open" => 1);
+
+# for the current version, failures are associated with
+# stored in an error string and returned to give the reason whilst debugging
+# This routine is not called by any external function
+sub _gettemp {
+
+  croak 'Usage: ($fh, $name) = _gettemp($template, OPTIONS);'
+    unless scalar(@_) >= 1;
+
+  # the internal error string - expect it to be overridden
+  # Need this in case the caller decides not to supply us a value
+  # need an anonymous scalar
+  my $tempErrStr;
+
+  # Default options
+  my %options = (
+		 "open" => 0,
+		 "mkdir" => 0,
+		 "suffixlen" => 0,
+		 "unlink_on_close" => 0,
+		 "ErrStr" => \$tempErrStr,
+		);
+
+  # Read the template
+  my $template = shift;
+  if (ref($template)) {
+    # Use a warning here since we have not yet merged ErrStr
+    carp "File::Temp::_gettemp: template must not be a reference";
+    return ();
+  }
+
+  # Check that the number of entries on stack are even
+  if (scalar(@_) % 2 != 0) {
+    # Use a warning here since we have not yet merged ErrStr
+    carp "File::Temp::_gettemp: Must have even number of options";
+    return ();
+  }
+
+  # Read the options and merge with defaults
+  %options = (%options, @_)  if @_;
+
+  # Make sure the error string is set to undef
+  ${$options{ErrStr}} = undef;
+
+  # Can not open the file and make a directory in a single call
+  if ($options{"open"} && $options{"mkdir"}) {
+    ${$options{ErrStr}} = "doopen and domkdir can not both be true\n";
+    return ();
+  }
+
+  # Find the start of the end of the  Xs (position of last X)
+  # Substr starts from 0
+  my $start = length($template) - 1 - $options{"suffixlen"};
+
+  # Check that we have at least MINX x X (eg 'XXXX") at the end of the string
+  # (taking suffixlen into account). Any fewer is insecure.
+
+  # Do it using substr - no reason to use a pattern match since
+  # we know where we are looking and what we are looking for
+
+  if (substr($template, $start - MINX + 1, MINX) ne 'X' x MINX) {
+    ${$options{ErrStr}} = "The template must end with at least ".
+      MINX . " 'X' characters\n";
+    return ();
+  }
+
+  # Replace all the X at the end of the substring with a
+  # random character or just all the XX at the end of a full string.
+  # Do it as an if, since the suffix adjusts which section to replace
+  # and suffixlen=0 returns nothing if used in the substr directly
+  # and generate a full path from the template
+
+  my $path = _replace_XX($template, $options{"suffixlen"});
+
+
+  # Split the path into constituent parts - eventually we need to check
+  # whether the directory exists
+  # We need to know whether we are making a temp directory
+  # or a tempfile
+
+  my ($volume, $directories, $file);
+  my $parent; # parent directory
+  if ($options{"mkdir"}) {
+    # There is no filename at the end
+    ($volume, $directories, $file) = File::Spec->splitpath( $path, 1);
+
+    # The parent is then $directories without the last directory
+    # Split the directory and put it back together again
+    my @dirs = File::Spec->splitdir($directories);
+
+    # If @dirs only has one entry (i.e. the directory template) that means
+    # we are in the current directory
+    if ($#dirs == 0) {
+      $parent = File::Spec->curdir;
+    } else {
+
+      if ($^O eq 'VMS') {  # need volume to avoid relative dir spec
+        $parent = File::Spec->catdir($volume, @dirs[0..$#dirs-1]);
+        $parent = 'sys$disk:[]' if $parent eq '';
+      } else {
+
+	# Put it back together without the last one
+	$parent = File::Spec->catdir(@dirs[0..$#dirs-1]);
+
+	# ...and attach the volume (no filename)
+	$parent = File::Spec->catpath($volume, $parent, '');
+      }
+
+    }
+
+  } else {
+
+    # Get rid of the last filename (use File::Basename for this?)
+    ($volume, $directories, $file) = File::Spec->splitpath( $path );
+
+    # Join up without the file part
+    $parent = File::Spec->catpath($volume,$directories,'');
+
+    # If $parent is empty replace with curdir
+    $parent = File::Spec->curdir
+      unless $directories ne '';
+
+  }
+
+  # Check that the parent directories exist
+  # Do this even for the case where we are simply returning a name
+  # not a file -- no point returning a name that includes a directory
+  # that does not exist or is not writable
+
+  unless (-d $parent) {
+    ${$options{ErrStr}} = "Parent directory ($parent) is not a directory";
+    return ();
+  }
+  unless (-w $parent) {
+    ${$options{ErrStr}} = "Parent directory ($parent) is not writable\n";
+      return ();
+  }
+
+
+  # Check the stickiness of the directory and chown giveaway if required
+  # If the directory is world writable the sticky bit
+  # must be set
+
+  if (File::Temp->safe_level == MEDIUM) {
+    my $safeerr;
+    unless (_is_safe($parent,\$safeerr)) {
+      ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)";
+      return ();
+    }
+  } elsif (File::Temp->safe_level == HIGH) {
+    my $safeerr;
+    unless (_is_verysafe($parent, \$safeerr)) {
+      ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)";
+      return ();
+    }
+  }
+
+
+  # Now try MAX_TRIES time to open the file
+  for (my $i = 0; $i < MAX_TRIES; $i++) {
+
+    # Try to open the file if requested
+    if ($options{"open"}) {
+      my $fh;
+
+      # If we are running before perl5.6.0 we can not auto-vivify
+      if ($] < 5.006) {
+	$fh = &Symbol::gensym;
+      }
+
+      # Try to make sure this will be marked close-on-exec
+      # XXX: Win32 doesn't respect this, nor the proper fcntl,
+      #      but may have O_NOINHERIT. This may or may not be in Fcntl.
+      local $^F = 2;
+
+      # Store callers umask
+      my $umask = umask();
+
+      # Set a known umask
+      umask(066);
+
+      # Attempt to open the file
+      my $open_success = undef;
+      if ( $^O eq 'VMS' and $options{"unlink_on_close"} && !$KEEP_ALL) {
+        # make it auto delete on close by setting FAB$V_DLT bit
+	$fh = VMS::Stdio::vmssysopen($path, $OPENFLAGS, 0600, 'fop=dlt');
+	$open_success = $fh;
+      } else {
+	my $flags = ( ($options{"unlink_on_close"} && !$KEEP_ALL) ?
+		      $OPENTEMPFLAGS :
+		      $OPENFLAGS );
+	$open_success = sysopen($fh, $path, $flags, 0600);
+      }
+      if ( $open_success ) {
+
+	# Reset umask
+	umask($umask) if defined $umask;
+
+	# Opened successfully - return file handle and name
+	return ($fh, $path);
+
+      } else {
+	# Reset umask
+	umask($umask) if defined $umask;
+
+	# Error opening file - abort with error
+	# if the reason was anything but EEXIST
+	unless ($!{EEXIST}) {
+	  ${$options{ErrStr}} = "Could not create temp file $path: $!";
+	  return ();
+	}
+
+	# Loop round for another try
+
+      }
+    } elsif ($options{"mkdir"}) {
+
+      # Store callers umask
+      my $umask = umask();
+
+      # Set a known umask
+      umask(066);
+
+      # Open the temp directory
+      if (mkdir( $path, 0700)) {
+	# created okay
+	# Reset umask
+	umask($umask) if defined $umask;
+
+	return undef, $path;
+      } else {
+
+	# Reset umask
+	umask($umask) if defined $umask;
+
+	# Abort with error if the reason for failure was anything
+	# except EEXIST
+	unless ($!{EEXIST}) {
+	  ${$options{ErrStr}} = "Could not create directory $path: $!";
+	  return ();
+	}
+
+	# Loop round for another try
+
+      }
+
+    } else {
+
+      # Return true if the file can not be found
+      # Directory has been checked previously
+
+      return (undef, $path) unless -e $path;
+
+      # Try again until MAX_TRIES
+
+    }
+
+    # Did not successfully open the tempfile/dir
+    # so try again with a different set of random letters
+    # No point in trying to increment unless we have only
+    # 1 X say and the randomness could come up with the same
+    # file MAX_TRIES in a row.
+
+    # Store current attempt - in principal this implies that the
+    # 3rd time around the open attempt that the first temp file
+    # name could be generated again. Probably should store each
+    # attempt and make sure that none are repeated
+
+    my $original = $path;
+    my $counter = 0;  # Stop infinite loop
+    my $MAX_GUESS = 50;
+
+    do {
+
+      # Generate new name from original template
+      $path = _replace_XX($template, $options{"suffixlen"});
+
+      $counter++;
+
+    } until ($path ne $original || $counter > $MAX_GUESS);
+
+    # Check for out of control looping
+    if ($counter > $MAX_GUESS) {
+      ${$options{ErrStr}} = "Tried to get a new temp name different to the previous value $MAX_GUESS times.\nSomething wrong with template?? ($template)";
+      return ();
+    }
+
+  }
+
+  # If we get here, we have run out of tries
+  ${ $options{ErrStr} } = "Have exceeded the maximum number of attempts ("
+    . MAX_TRIES . ") to open temp file/dir";
+
+  return ();
+
+}
+
+# Internal routine to return a random character from the
+# character list. Does not do an srand() since rand()
+# will do one automatically
+
+# No arguments. Return value is the random character
+
+# No longer called since _replace_XX runs a few percent faster if
+# I inline the code. This is important if we are creating thousands of
+# temporary files.
+
+sub _randchar {
+
+  $CHARS[ int( rand( $#CHARS ) ) ];
+
+}
+
+# Internal routine to replace the XXXX... with random characters
+# This has to be done by _gettemp() every time it fails to
+# open a temp file/dir
+
+# Arguments:  $template (the template with XXX),
+#             $ignore   (number of characters at end to ignore)
+
+# Returns:    modified template
+
+sub _replace_XX {
+
+  croak 'Usage: _replace_XX($template, $ignore)'
+    unless scalar(@_) == 2;
+
+  my ($path, $ignore) = @_;
+
+  # Do it as an if, since the suffix adjusts which section to replace
+  # and suffixlen=0 returns nothing if used in the substr directly
+  # Alternatively, could simply set $ignore to length($path)-1
+  # Don't want to always use substr when not required though.
+
+  if ($ignore) {
+    substr($path, 0, - $ignore) =~ s/X(?=X*\z)/$CHARS[ int( rand( $#CHARS ) ) ]/ge;
+  } else {
+    $path =~ s/X(?=X*\z)/$CHARS[ int( rand( $#CHARS ) ) ]/ge;
+  }
+  return $path;
+}
+
+# Internal routine to force a temp file to be writable after
+# it is created so that we can unlink it. Windows seems to occassionally
+# force a file to be readonly when written to certain temp locations
+sub _force_writable {
+  my $file = shift;
+  my $umask = umask();
+  umask(066);
+  chmod 0600, $file;
+  umask($umask) if defined $umask;
+}
+
+
+# internal routine to check to see if the directory is safe
+# First checks to see if the directory is not owned by the
+# current user or root. Then checks to see if anyone else
+# can write to the directory and if so, checks to see if
+# it has the sticky bit set
+
+# Will not work on systems that do not support sticky bit
+
+#Args:  directory path to check
+#       Optionally: reference to scalar to contain error message
+# Returns true if the path is safe and false otherwise.
+# Returns undef if can not even run stat() on the path
+
+# This routine based on version written by Tom Christiansen
+
+# Presumably, by the time we actually attempt to create the
+# file or directory in this directory, it may not be safe
+# anymore... Have to run _is_safe directly after the open.
+
+sub _is_safe {
+
+  my $path = shift;
+  my $err_ref = shift;
+
+  # Stat path
+  my @info = stat($path);
+  unless (scalar(@info)) {
+    $$err_ref = "stat(path) returned no values";
+    return 0;
+  };
+  return 1 if $^O eq 'VMS';  # owner delete control at file level
+
+  # Check to see whether owner is neither superuser (or a system uid) nor me
+  # Use the real uid from the $< variable
+  # UID is in [4]
+  if ($info[4] > File::Temp->top_system_uid() && $info[4] != $<) {
+
+    Carp::cluck(sprintf "uid=$info[4] topuid=%s \$<=$< path='$path'",
+		File::Temp->top_system_uid());
+
+    $$err_ref = "Directory owned neither by root nor the current user"
+      if ref($err_ref);
+    return 0;
+  }
+
+  # check whether group or other can write file
+  # use 066 to detect either reading or writing
+  # use 022 to check writability
+  # Do it with S_IWOTH and S_IWGRP for portability (maybe)
+  # mode is in info[2]
+  if (($info[2] & &Fcntl::S_IWGRP) ||   # Is group writable?
+      ($info[2] & &Fcntl::S_IWOTH) ) {  # Is world writable?
+    # Must be a directory
+    unless (-d $path) {
+      $$err_ref = "Path ($path) is not a directory"
+      if ref($err_ref);
+      return 0;
+    }
+    # Must have sticky bit set
+    unless (-k $path) {
+      $$err_ref = "Sticky bit not set on $path when dir is group|world writable"
+	if ref($err_ref);
+      return 0;
+    }
+  }
+
+  return 1;
+}
+
+# Internal routine to check whether a directory is safe
+# for temp files. Safer than _is_safe since it checks for
+# the possibility of chown giveaway and if that is a possibility
+# checks each directory in the path to see if it is safe (with _is_safe)
+
+# If _PC_CHOWN_RESTRICTED is not set, does the full test of each
+# directory anyway.
+
+# Takes optional second arg as scalar ref to error reason
+
+sub _is_verysafe {
+
+  # Need POSIX - but only want to bother if really necessary due to overhead
+  require POSIX;
+
+  my $path = shift;
+  print "_is_verysafe testing $path\n" if $DEBUG;
+  return 1 if $^O eq 'VMS';  # owner delete control at file level
+
+  my $err_ref = shift;
+
+  # Should Get the value of _PC_CHOWN_RESTRICTED if it is defined
+  # and If it is not there do the extensive test
+  my $chown_restricted;
+  $chown_restricted = &POSIX::_PC_CHOWN_RESTRICTED()
+    if eval { &POSIX::_PC_CHOWN_RESTRICTED(); 1};
+
+  # If chown_resticted is set to some value we should test it
+  if (defined $chown_restricted) {
+
+    # Return if the current directory is safe
+    return _is_safe($path,$err_ref) if POSIX::sysconf( $chown_restricted );
+
+  }
+
+  # To reach this point either, the _PC_CHOWN_RESTRICTED symbol
+  # was not avialable or the symbol was there but chown giveaway
+  # is allowed. Either way, we now have to test the entire tree for
+  # safety.
+
+  # Convert path to an absolute directory if required
+  unless (File::Spec->file_name_is_absolute($path)) {
+    $path = File::Spec->rel2abs($path);
+  }
+
+  # Split directory into components - assume no file
+  my ($volume, $directories, undef) = File::Spec->splitpath( $path, 1);
+
+  # Slightly less efficient than having a function in File::Spec
+  # to chop off the end of a directory or even a function that
+  # can handle ../ in a directory tree
+  # Sometimes splitdir() returns a blank at the end
+  # so we will probably check the bottom directory twice in some cases
+  my @dirs = File::Spec->splitdir($directories);
+
+  # Concatenate one less directory each time around
+  foreach my $pos (0.. $#dirs) {
+    # Get a directory name
+    my $dir = File::Spec->catpath($volume,
+				  File::Spec->catdir(@dirs[0.. $#dirs - $pos]),
+				  ''
+				  );
+
+    print "TESTING DIR $dir\n" if $DEBUG;
+
+    # Check the directory
+    return 0 unless _is_safe($dir,$err_ref);
+
+  }
+
+  return 1;
+}
+
+
+
+# internal routine to determine whether unlink works on this
+# platform for files that are currently open.
+# Returns true if we can, false otherwise.
+
+# Currently WinNT, OS/2 and VMS can not unlink an opened file
+# On VMS this is because the O_EXCL flag is used to open the
+# temporary file. Currently I do not know enough about the issues
+# on VMS to decide whether O_EXCL is a requirement.
+
+sub _can_unlink_opened_file {
+
+  if ($^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'VMS' || $^O eq 'dos' || $^O eq 'MacOS') {
+    return 0;
+  } else {
+    return 1;
+  }
+
+}
+
+# internal routine to decide which security levels are allowed
+# see safe_level() for more information on this
+
+# Controls whether the supplied security level is allowed
+
+#   $cando = _can_do_level( $level )
+
+sub _can_do_level {
+
+  # Get security level
+  my $level = shift;
+
+  # Always have to be able to do STANDARD
+  return 1 if $level == STANDARD;
+
+  # Currently, the systems that can do HIGH or MEDIUM are identical
+  if ( $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'cygwin' || $^O eq 'dos' || $^O eq 'MacOS' || $^O eq 'mpeix') {
+    return 0;
+  } else {
+    return 1;
+  }
+
+}
+
+# This routine sets up a deferred unlinking of a specified
+# filename and filehandle. It is used in the following cases:
+#  - Called by unlink0 if an opened file can not be unlinked
+#  - Called by tempfile() if files are to be removed on shutdown
+#  - Called by tempdir() if directories are to be removed on shutdown
+
+# Arguments:
+#   _deferred_unlink( $fh, $fname, $isdir );
+#
+#   - filehandle (so that it can be expclicitly closed if open
+#   - filename   (the thing we want to remove)
+#   - isdir      (flag to indicate that we are being given a directory)
+#                 [and hence no filehandle]
+
+# Status is not referred to since all the magic is done with an END block
+
+{
+  # Will set up two lexical variables to contain all the files to be
+  # removed. One array for files, another for directories They will
+  # only exist in this block.
+
+  #  This means we only have to set up a single END block to remove
+  #  all files. 
+
+  # in order to prevent child processes inadvertently deleting the parent
+  # temp files we use a hash to store the temp files and directories
+  # created by a particular process id.
+
+  # %files_to_unlink contains values that are references to an array of
+  # array references containing the filehandle and filename associated with
+  # the temp file.
+  my (%files_to_unlink, %dirs_to_unlink);
+
+  # Set up an end block to use these arrays
+  END {
+    cleanup();
+  }
+
+  # Cleanup function. Always triggered on END but can be invoked
+  # manually.
+  sub cleanup {
+    if (!$KEEP_ALL) {
+      # Files
+      my @files = (exists $files_to_unlink{$$} ?
+		   @{ $files_to_unlink{$$} } : () );
+      foreach my $file (@files) {
+	# close the filehandle without checking its state
+	# in order to make real sure that this is closed
+	# if its already closed then I dont care about the answer
+	# probably a better way to do this
+	close($file->[0]);  # file handle is [0]
+
+	if (-f $file->[1]) {  # file name is [1]
+	  _force_writable( $file->[1] ); # for windows
+	  unlink $file->[1] or warn "Error removing ".$file->[1];
+	}
+      }
+      # Dirs
+      my @dirs = (exists $dirs_to_unlink{$$} ?
+		  @{ $dirs_to_unlink{$$} } : () );
+      foreach my $dir (@dirs) {
+	if (-d $dir) {
+	  rmtree($dir, $DEBUG, 0);
+	}
+      }
+
+      # clear the arrays
+      @{ $files_to_unlink{$$} } = ()
+	if exists $files_to_unlink{$$};
+      @{ $dirs_to_unlink{$$} } = ()
+	if exists $dirs_to_unlink{$$};
+    }
+  }
+
+
+  # This is the sub called to register a file for deferred unlinking
+  # This could simply store the input parameters and defer everything
+  # until the END block. For now we do a bit of checking at this
+  # point in order to make sure that (1) we have a file/dir to delete
+  # and (2) we have been called with the correct arguments.
+  sub _deferred_unlink {
+
+    croak 'Usage:  _deferred_unlink($fh, $fname, $isdir)'
+      unless scalar(@_) == 3;
+
+    my ($fh, $fname, $isdir) = @_;
+
+    warn "Setting up deferred removal of $fname\n"
+      if $DEBUG;
+
+    # If we have a directory, check that it is a directory
+    if ($isdir) {
+
+      if (-d $fname) {
+
+	# Directory exists so store it
+	# first on VMS turn []foo into [.foo] for rmtree
+	$fname = VMS::Filespec::vmspath($fname) if $^O eq 'VMS';
+	$dirs_to_unlink{$$} = [] 
+	  unless exists $dirs_to_unlink{$$};
+	push (@{ $dirs_to_unlink{$$} }, $fname);
+
+      } else {
+	carp "Request to remove directory $fname could not be completed since it does not exist!\n" if $^W;
+      }
+
+    } else {
+
+      if (-f $fname) {
+
+	# file exists so store handle and name for later removal
+	$files_to_unlink{$$} = []
+	  unless exists $files_to_unlink{$$};
+	push(@{ $files_to_unlink{$$} }, [$fh, $fname]);
+
+      } else {
+	carp "Request to remove file $fname could not be completed since it is not there!\n" if $^W;
+      }
+
+    }
+
+  }
+
+
+}
+
+=head1 OBJECT-ORIENTED INTERFACE
+
+This is the primary interface for interacting with
+C<File::Temp>. Using the OO interface a temporary file can be created
+when the object is constructed and the file can be removed when the
+object is no longer required.
+
+Note that there is no method to obtain the filehandle from the
+C<File::Temp> object. The object itself acts as a filehandle. Also,
+the object is configured such that it stringifies to the name of the
+temporary file.
+
+=over 4
+
+=item B<new>
+
+Create a temporary file object.
+
+  my $tmp = new File::Temp();
+
+by default the object is constructed as if C<tempfile>
+was called without options, but with the additional behaviour
+that the temporary file is removed by the object destructor
+if UNLINK is set to true (the default).
+
+Supported arguments are the same as for C<tempfile>: UNLINK
+(defaulting to true), DIR and SUFFIX. Additionally, the filename
+template is specified using the TEMPLATE option. The OPEN option
+is not supported (the file is always opened).
+
+ $tmp = new File::Temp( TEMPLATE => 'tempXXXXX',
+                        DIR => 'mydir',
+                        SUFFIX => '.dat');
+
+Arguments are case insensitive.
+
+=cut
+
+sub new {
+  my $proto = shift;
+  my $class = ref($proto) || $proto;
+
+  # read arguments and convert keys to upper case
+  my %args = @_;
+  %args = map { uc($_), $args{$_} } keys %args;
+
+  # see if they are unlinking (defaulting to yes)
+  my $unlink = (exists $args{UNLINK} ? $args{UNLINK} : 1 );
+  delete $args{UNLINK};
+
+  # template (store it in an error so that it will
+  # disappear from the arg list of tempfile
+  my @template = ( exists $args{TEMPLATE} ? $args{TEMPLATE} : () );
+  delete $args{TEMPLATE};
+
+  # Protect OPEN
+  delete $args{OPEN};
+
+  # Open the file and retain file handle and file name
+  my ($fh, $path) = tempfile( @template, %args );
+
+  print "Tmp: $fh - $path\n" if $DEBUG;
+
+  # Store the filename in the scalar slot
+  ${*$fh} = $path;
+
+  # Store unlink information in hash slot (plus other constructor info)
+  %{*$fh} = %args;
+
+  # create the object
+  bless $fh, $class;
+
+  # final method-based configuration
+  $fh->unlink_on_destroy( $unlink );
+
+  return $fh;
+}
+
+=item B<filename>
+
+Return the name of the temporary file associated with this object.
+
+  $filename = $tmp->filename;
+
+This method is called automatically when the object is used as
+a string.
+
+=cut
+
+sub filename {
+  my $self = shift;
+  return ${*$self};
+}
+
+sub STRINGIFY {
+  my $self = shift;
+  return $self->filename;
+}
+
+=item B<unlink_on_destroy>
+
+Control whether the file is unlinked when the object goes out of scope.
+The file is removed if this value is true and $KEEP_ALL is not.
+
+ $fh->unlink_on_destroy( 1 );
+
+Default is for the file to be removed.
+
+=cut
+
+sub unlink_on_destroy {
+  my $self = shift;
+  if (@_) {
+    ${*$self}{UNLINK} = shift;
+  }
+  return ${*$self}{UNLINK};
+}
+
+=item B<DESTROY>
+
+When the object goes out of scope, the destructor is called. This
+destructor will attempt to unlink the file (using C<unlink1>)
+if the constructor was called with UNLINK set to 1 (the default state
+if UNLINK is not specified).
+
+No error is given if the unlink fails.
+
+If the global variable $KEEP_ALL is true, the file will not be removed.
+
+=cut
+
+sub DESTROY {
+  my $self = shift;
+  if (${*$self}{UNLINK} && !$KEEP_ALL) {
+    print "# --------->   Unlinking $self\n" if $DEBUG;
+
+    # The unlink1 may fail if the file has been closed
+    # by the caller. This leaves us with the decision
+    # of whether to refuse to remove the file or simply
+    # do an unlink without test. Seems to be silly
+    # to do this when we are trying to be careful
+    # about security
+    _force_writable( $self->filename ); # for windows
+    unlink1( $self, $self->filename )
+      or unlink($self->filename);
+  }
+}
+
+=back
+
+=head1 FUNCTIONS
+
+This section describes the recommended interface for generating
+temporary files and directories.
+
+=over 4
+
+=item B<tempfile>
+
+This is the basic function to generate temporary files.
+The behaviour of the file can be changed using various options:
+
+  $fh = tempfile();
+  ($fh, $filename) = tempfile();
+
+Create a temporary file in  the directory specified for temporary
+files, as specified by the tmpdir() function in L<File::Spec>.
+
+  ($fh, $filename) = tempfile($template);
+
+Create a temporary file in the current directory using the supplied
+template.  Trailing `X' characters are replaced with random letters to
+generate the filename.  At least four `X' characters must be present
+at the end of the template.
+
+  ($fh, $filename) = tempfile($template, SUFFIX => $suffix)
+
+Same as previously, except that a suffix is added to the template
+after the `X' translation.  Useful for ensuring that a temporary
+filename has a particular extension when needed by other applications.
+But see the WARNING at the end.
+
+  ($fh, $filename) = tempfile($template, DIR => $dir);
+
+Translates the template as before except that a directory name
+is specified.
+
+  ($fh, $filename) = tempfile($template, UNLINK => 1);
+
+Return the filename and filehandle as before except that the file is
+automatically removed when the program exits (dependent on
+$KEEP_ALL). Default is for the file to be removed if a file handle is
+requested and to be kept if the filename is requested. In a scalar
+context (where no filename is returned) the file is always deleted
+either (depending on the operating system) on exit or when it is
+closed (unless $KEEP_ALL is true when the temp file is created).
+
+Use the object-oriented interface if fine-grained control of when
+a file is removed is required.
+
+If the template is not specified, a template is always
+automatically generated. This temporary file is placed in tmpdir()
+(L<File::Spec>) unless a directory is specified explicitly with the
+DIR option.
+
+  $fh = tempfile( $template, DIR => $dir );
+
+If called in scalar context, only the filehandle is returned and the
+file will automatically be deleted when closed on operating systems
+that support this (see the description of tmpfile() elsewhere in this
+document).  This is the preferred mode of operation, as if you only
+have a filehandle, you can never create a race condition by fumbling
+with the filename. On systems that can not unlink an open file or can
+not mark a file as temporary when it is opened (for example, Windows
+NT uses the C<O_TEMPORARY> flag) the file is marked for deletion when
+the program ends (equivalent to setting UNLINK to 1). The C<UNLINK>
+flag is ignored if present.
+
+  (undef, $filename) = tempfile($template, OPEN => 0);
+
+This will return the filename based on the template but
+will not open this file.  Cannot be used in conjunction with
+UNLINK set to true. Default is to always open the file
+to protect from possible race conditions. A warning is issued
+if warnings are turned on. Consider using the tmpnam()
+and mktemp() functions described elsewhere in this document
+if opening the file is not required.
+
+Options can be combined as required.
+
+=cut
+
+sub tempfile {
+
+  # Can not check for argument count since we can have any
+  # number of args
+
+  # Default options
+  my %options = (
+		 "DIR"    => undef,  # Directory prefix
+                "SUFFIX" => '',     # Template suffix
+                "UNLINK" => 0,      # Do not unlink file on exit
+                "OPEN"   => 1,      # Open file
+		);
+
+  # Check to see whether we have an odd or even number of arguments
+  my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef);
+
+  # Read the options and merge with defaults
+  %options = (%options, @_)  if @_;
+
+  # First decision is whether or not to open the file
+  if (! $options{"OPEN"}) {
+
+    warn "tempfile(): temporary filename requested but not opened.\nPossibly unsafe, consider using tempfile() with OPEN set to true\n"
+      if $^W;
+
+  }
+
+  if ($options{"DIR"} and $^O eq 'VMS') {
+
+      # on VMS turn []foo into [.foo] for concatenation
+      $options{"DIR"} = VMS::Filespec::vmspath($options{"DIR"});
+  }
+
+  # Construct the template
+
+  # Have a choice of trying to work around the mkstemp/mktemp/tmpnam etc
+  # functions or simply constructing a template and using _gettemp()
+  # explicitly. Go for the latter
+
+  # First generate a template if not defined and prefix the directory
+  # If no template must prefix the temp directory
+  if (defined $template) {
+    if ($options{"DIR"}) {
+
+      $template = File::Spec->catfile($options{"DIR"}, $template);
+
+    }
+
+  } else {
+
+    if ($options{"DIR"}) {
+
+      $template = File::Spec->catfile($options{"DIR"}, TEMPXXX);
+
+    } else {
+
+      $template = File::Spec->catfile(File::Spec->tmpdir, TEMPXXX);
+
+    }
+
+  }
+
+  # Now add a suffix
+  $template .= $options{"SUFFIX"};
+
+  # Determine whether we should tell _gettemp to unlink the file
+  # On unix this is irrelevant and can be worked out after the file is
+  # opened (simply by unlinking the open filehandle). On Windows or VMS
+  # we have to indicate temporary-ness when we open the file. In general
+  # we only want a true temporary file if we are returning just the
+  # filehandle - if the user wants the filename they probably do not
+  # want the file to disappear as soon as they close it (which may be
+  # important if they want a child process to use the file)
+  # For this reason, tie unlink_on_close to the return context regardless
+  # of OS.
+  my $unlink_on_close = ( wantarray ? 0 : 1);
+
+  # Create the file
+  my ($fh, $path, $errstr);
+  croak "Error in tempfile() using $template: $errstr"
+    unless (($fh, $path) = _gettemp($template,
+				    "open" => $options{'OPEN'},
+				    "mkdir"=> 0 ,
+                                    "unlink_on_close" => $unlink_on_close,
+				    "suffixlen" => length($options{'SUFFIX'}),
+				    "ErrStr" => \$errstr,
+				   ) );
+
+  # Set up an exit handler that can do whatever is right for the
+  # system. This removes files at exit when requested explicitly or when
+  # system is asked to unlink_on_close but is unable to do so because
+  # of OS limitations.
+  # The latter should be achieved by using a tied filehandle.
+  # Do not check return status since this is all done with END blocks.
+  _deferred_unlink($fh, $path, 0) if $options{"UNLINK"};
+
+  # Return
+  if (wantarray()) {
+
+    if ($options{'OPEN'}) {
+      return ($fh, $path);
+    } else {
+      return (undef, $path);
+    }
+
+  } else {
+
+    # Unlink the file. It is up to unlink0 to decide what to do with
+    # this (whether to unlink now or to defer until later)
+    unlink0($fh, $path) or croak "Error unlinking file $path using unlink0";
+
+    # Return just the filehandle.
+    return $fh;
+  }
+
+
+}
+
+=item B<tempdir>
+
+This is the recommended interface for creation of temporary directories.
+The behaviour of the function depends on the arguments:
+
+  $tempdir = tempdir();
+
+Create a directory in tmpdir() (see L<File::Spec|File::Spec>).
+
+  $tempdir = tempdir( $template );
+
+Create a directory from the supplied template. This template is
+similar to that described for tempfile(). `X' characters at the end
+of the template are replaced with random letters to construct the
+directory name. At least four `X' characters must be in the template.
+
+  $tempdir = tempdir ( DIR => $dir );
+
+Specifies the directory to use for the temporary directory.
+The temporary directory name is derived from an internal template.
+
+  $tempdir = tempdir ( $template, DIR => $dir );
+
+Prepend the supplied directory name to the template. The template
+should not include parent directory specifications itself. Any parent
+directory specifications are removed from the template before
+prepending the supplied directory.
+
+  $tempdir = tempdir ( $template, TMPDIR => 1 );
+
+Using the supplied template, create the temporary directory in
+a standard location for temporary files. Equivalent to doing
+
+  $tempdir = tempdir ( $template, DIR => File::Spec->tmpdir);
+
+but shorter. Parent directory specifications are stripped from the
+template itself. The C<TMPDIR> option is ignored if C<DIR> is set
+explicitly.  Additionally, C<TMPDIR> is implied if neither a template
+nor a directory are supplied.
+
+  $tempdir = tempdir( $template, CLEANUP => 1);
+
+Create a temporary directory using the supplied template, but
+attempt to remove it (and all files inside it) when the program
+exits. Note that an attempt will be made to remove all files from
+the directory even if they were not created by this module (otherwise
+why ask to clean it up?). The directory removal is made with
+the rmtree() function from the L<File::Path|File::Path> module.
+Of course, if the template is not specified, the temporary directory
+will be created in tmpdir() and will also be removed at program exit.
+
+=cut
+
+# '
+
+sub tempdir  {
+
+  # Can not check for argument count since we can have any
+  # number of args
+
+  # Default options
+  my %options = (
+		 "CLEANUP"    => 0,  # Remove directory on exit
+		 "DIR"        => '', # Root directory
+		 "TMPDIR"     => 0,  # Use tempdir with template
+		);
+
+  # Check to see whether we have an odd or even number of arguments
+  my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef );
+
+  # Read the options and merge with defaults
+  %options = (%options, @_)  if @_;
+
+  # Modify or generate the template
+
+  # Deal with the DIR and TMPDIR options
+  if (defined $template) {
+
+    # Need to strip directory path if using DIR or TMPDIR
+    if ($options{'TMPDIR'} || $options{'DIR'}) {
+
+      # Strip parent directory from the filename
+      #
+      # There is no filename at the end
+      $template = VMS::Filespec::vmspath($template) if $^O eq 'VMS';
+      my ($volume, $directories, undef) = File::Spec->splitpath( $template, 1);
+
+      # Last directory is then our template
+      $template = (File::Spec->splitdir($directories))[-1];
+
+      # Prepend the supplied directory or temp dir
+      if ($options{"DIR"}) {
+
+        $template = File::Spec->catdir($options{"DIR"}, $template);
+
+      } elsif ($options{TMPDIR}) {
+
+	# Prepend tmpdir
+	$template = File::Spec->catdir(File::Spec->tmpdir, $template);
+
+      }
+
+    }
+
+  } else {
+
+    if ($options{"DIR"}) {
+
+      $template = File::Spec->catdir($options{"DIR"}, TEMPXXX);
+
+    } else {
+
+      $template = File::Spec->catdir(File::Spec->tmpdir, TEMPXXX);
+
+    }
+
+  }
+
+  # Create the directory
+  my $tempdir;
+  my $suffixlen = 0;
+  if ($^O eq 'VMS') {  # dir names can end in delimiters
+    $template =~ m/([\.\]:>]+)$/;
+    $suffixlen = length($1);
+  }
+  if ( ($^O eq 'MacOS') && (substr($template, -1) eq ':') ) {
+    # dir name has a trailing ':'
+    ++$suffixlen;
+  }
+
+  my $errstr;
+  croak "Error in tempdir() using $template: $errstr"
+    unless ((undef, $tempdir) = _gettemp($template,
+				    "open" => 0,
+				    "mkdir"=> 1 ,
+				    "suffixlen" => $suffixlen,
+				    "ErrStr" => \$errstr,
+				   ) );
+
+  # Install exit handler; must be dynamic to get lexical
+  if ( $options{'CLEANUP'} && -d $tempdir) {
+    _deferred_unlink(undef, $tempdir, 1);
+  }
+
+  # Return the dir name
+  return $tempdir;
+
+}
+
+=back
+
+=head1 MKTEMP FUNCTIONS
+
+The following functions are Perl implementations of the
+mktemp() family of temp file generation system calls.
+
+=over 4
+
+=item B<mkstemp>
+
+Given a template, returns a filehandle to the temporary file and the name
+of the file.
+
+  ($fh, $name) = mkstemp( $template );
+
+In scalar context, just the filehandle is returned.
+
+The template may be any filename with some number of X's appended
+to it, for example F</tmp/temp.XXXX>. The trailing X's are replaced
+with unique alphanumeric combinations.
+
+=cut
+
+
+
+sub mkstemp {
+
+  croak "Usage: mkstemp(template)"
+    if scalar(@_) != 1;
+
+  my $template = shift;
+
+  my ($fh, $path, $errstr);
+  croak "Error in mkstemp using $template: $errstr"
+    unless (($fh, $path) = _gettemp($template,
+				    "open" => 1,
+				    "mkdir"=> 0 ,
+				    "suffixlen" => 0,
+				    "ErrStr" => \$errstr,
+				   ) );
+
+  if (wantarray()) {
+    return ($fh, $path);
+  } else {
+    return $fh;
+  }
+
+}
+
+
+=item B<mkstemps>
+
+Similar to mkstemp(), except that an extra argument can be supplied
+with a suffix to be appended to the template.
+
+  ($fh, $name) = mkstemps( $template, $suffix );
+
+For example a template of C<testXXXXXX> and suffix of C<.dat>
+would generate a file similar to F<testhGji_w.dat>.
+
+Returns just the filehandle alone when called in scalar context.
+
+=cut
+
+sub mkstemps {
+
+  croak "Usage: mkstemps(template, suffix)"
+    if scalar(@_) != 2;
+
+
+  my $template = shift;
+  my $suffix   = shift;
+
+  $template .= $suffix;
+
+  my ($fh, $path, $errstr);
+  croak "Error in mkstemps using $template: $errstr"
+    unless (($fh, $path) = _gettemp($template,
+				    "open" => 1,
+				    "mkdir"=> 0 ,
+				    "suffixlen" => length($suffix),
+				    "ErrStr" => \$errstr,
+				   ) );
+
+  if (wantarray()) {
+    return ($fh, $path);
+  } else {
+    return $fh;
+  }
+
+}
+
+=item B<mkdtemp>
+
+Create a directory from a template. The template must end in
+X's that are replaced by the routine.
+
+  $tmpdir_name = mkdtemp($template);
+
+Returns the name of the temporary directory created.
+Returns undef on failure.
+
+Directory must be removed by the caller.
+
+=cut
+
+#' # for emacs
+
+sub mkdtemp {
+
+  croak "Usage: mkdtemp(template)"
+    if scalar(@_) != 1;
+
+  my $template = shift;
+  my $suffixlen = 0;
+  if ($^O eq 'VMS') {  # dir names can end in delimiters
+    $template =~ m/([\.\]:>]+)$/;
+    $suffixlen = length($1);
+  }
+  if ( ($^O eq 'MacOS') && (substr($template, -1) eq ':') ) {
+    # dir name has a trailing ':'
+    ++$suffixlen;
+  }
+  my ($junk, $tmpdir, $errstr);
+  croak "Error creating temp directory from template $template\: $errstr"
+    unless (($junk, $tmpdir) = _gettemp($template,
+					"open" => 0,
+					"mkdir"=> 1 ,
+					"suffixlen" => $suffixlen,
+					"ErrStr" => \$errstr,
+				       ) );
+
+  return $tmpdir;
+
+}
+
+=item B<mktemp>
+
+Returns a valid temporary filename but does not guarantee
+that the file will not be opened by someone else.
+
+  $unopened_file = mktemp($template);
+
+Template is the same as that required by mkstemp().
+
+=cut
+
+sub mktemp {
+
+  croak "Usage: mktemp(template)"
+    if scalar(@_) != 1;
+
+  my $template = shift;
+
+  my ($tmpname, $junk, $errstr);
+  croak "Error getting name to temp file from template $template: $errstr"
+    unless (($junk, $tmpname) = _gettemp($template,
+					 "open" => 0,
+					 "mkdir"=> 0 ,
+					 "suffixlen" => 0,
+					 "ErrStr" => \$errstr,
+					 ) );
+
+  return $tmpname;
+}
+
+=back
+
+=head1 POSIX FUNCTIONS
+
+This section describes the re-implementation of the tmpnam()
+and tmpfile() functions described in L<POSIX>
+using the mkstemp() from this module.
+
+Unlike the L<POSIX|POSIX> implementations, the directory used
+for the temporary file is not specified in a system include
+file (C<P_tmpdir>) but simply depends on the choice of tmpdir()
+returned by L<File::Spec|File::Spec>. On some implementations this
+location can be set using the C<TMPDIR> environment variable, which
+may not be secure.
+If this is a problem, simply use mkstemp() and specify a template.
+
+=over 4
+
+=item B<tmpnam>
+
+When called in scalar context, returns the full name (including path)
+of a temporary file (uses mktemp()). The only check is that the file does
+not already exist, but there is no guarantee that that condition will
+continue to apply.
+
+  $file = tmpnam();
+
+When called in list context, a filehandle to the open file and
+a filename are returned. This is achieved by calling mkstemp()
+after constructing a suitable template.
+
+  ($fh, $file) = tmpnam();
+
+If possible, this form should be used to prevent possible
+race conditions.
+
+See L<File::Spec/tmpdir> for information on the choice of temporary
+directory for a particular operating system.
+
+=cut
+
+sub tmpnam {
+
+   # Retrieve the temporary directory name
+   my $tmpdir = File::Spec->tmpdir;
+
+   croak "Error temporary directory is not writable"
+     if $tmpdir eq '';
+
+   # Use a ten character template and append to tmpdir
+   my $template = File::Spec->catfile($tmpdir, TEMPXXX);
+
+   if (wantarray() ) {
+       return mkstemp($template);
+   } else {
+       return mktemp($template);
+   }
+
+}
+
+=item B<tmpfile>
+
+Returns the filehandle of a temporary file.
+
+  $fh = tmpfile();
+
+The file is removed when the filehandle is closed or when the program
+exits. No access to the filename is provided.
+
+If the temporary file can not be created undef is returned.
+Currently this command will probably not work when the temporary
+directory is on an NFS file system.
+
+=cut
+
+sub tmpfile {
+
+  # Simply call tmpnam() in a list context
+  my ($fh, $file) = tmpnam();
+
+  # Make sure file is removed when filehandle is closed
+  # This will fail on NFS
+  unlink0($fh, $file)
+    or return undef;
+
+  return $fh;
+
+}
+
+=back
+
+=head1 ADDITIONAL FUNCTIONS
+
+These functions are provided for backwards compatibility
+with common tempfile generation C library functions.
+
+They are not exported and must be addressed using the full package
+name.
+
+=over 4
+
+=item B<tempnam>
+
+Return the name of a temporary file in the specified directory
+using a prefix. The file is guaranteed not to exist at the time
+the function was called, but such guarantees are good for one
+clock tick only.  Always use the proper form of C<sysopen>
+with C<O_CREAT | O_EXCL> if you must open such a filename.
+
+  $filename = File::Temp::tempnam( $dir, $prefix );
+
+Equivalent to running mktemp() with $dir/$prefixXXXXXXXX
+(using unix file convention as an example)
+
+Because this function uses mktemp(), it can suffer from race conditions.
+
+=cut
+
+sub tempnam {
+
+  croak 'Usage tempnam($dir, $prefix)' unless scalar(@_) == 2;
+
+  my ($dir, $prefix) = @_;
+
+  # Add a string to the prefix
+  $prefix .= 'XXXXXXXX';
+
+  # Concatenate the directory to the file
+  my $template = File::Spec->catfile($dir, $prefix);
+
+  return mktemp($template);
+
+}
+
+=back
+
+=head1 UTILITY FUNCTIONS
+
+Useful functions for dealing with the filehandle and filename.
+
+=over 4
+
+=item B<unlink0>
+
+Given an open filehandle and the associated filename, make a safe
+unlink. This is achieved by first checking that the filename and
+filehandle initially point to the same file and that the number of
+links to the file is 1 (all fields returned by stat() are compared).
+Then the filename is unlinked and the filehandle checked once again to
+verify that the number of links on that file is now 0.  This is the
+closest you can come to making sure that the filename unlinked was the
+same as the file whose descriptor you hold.
+
+  unlink0($fh, $path)
+     or die "Error unlinking file $path safely";
+
+Returns false on error. The filehandle is not closed since on some
+occasions this is not required.
+
+On some platforms, for example Windows NT, it is not possible to
+unlink an open file (the file must be closed first). On those
+platforms, the actual unlinking is deferred until the program ends and
+good status is returned. A check is still performed to make sure that
+the filehandle and filename are pointing to the same thing (but not at
+the time the end block is executed since the deferred removal may not
+have access to the filehandle).
+
+Additionally, on Windows NT not all the fields returned by stat() can
+be compared. For example, the C<dev> and C<rdev> fields seem to be
+different.  Also, it seems that the size of the file returned by stat()
+does not always agree, with C<stat(FH)> being more accurate than
+C<stat(filename)>, presumably because of caching issues even when
+using autoflush (this is usually overcome by waiting a while after
+writing to the tempfile before attempting to C<unlink0> it).
+
+Finally, on NFS file systems the link count of the file handle does
+not always go to zero immediately after unlinking. Currently, this
+command is expected to fail on NFS disks.
+
+This function is disabled if the global variable $KEEP_ALL is true
+and an unlink on open file is supported. If the unlink is to be deferred
+to the END block, the file is still registered for removal.
+
+=cut
+
+sub unlink0 {
+
+  croak 'Usage: unlink0(filehandle, filename)'
+    unless scalar(@_) == 2;
+
+  # Read args
+  my ($fh, $path) = @_;
+
+  cmpstat($fh, $path) or return 0;
+
+  # attempt remove the file (does not work on some platforms)
+  if (_can_unlink_opened_file()) {
+
+    # return early (Without unlink) if we have been instructed to retain files.
+    return 1 if $KEEP_ALL;
+
+    # XXX: do *not* call this on a directory; possible race
+    #      resulting in recursive removal
+    croak "unlink0: $path has become a directory!" if -d $path;
+    unlink($path) or return 0;
+
+    # Stat the filehandle
+    my @fh = stat $fh;
+
+    print "Link count = $fh[3] \n" if $DEBUG;
+
+    # Make sure that the link count is zero
+    # - Cygwin provides deferred unlinking, however,
+    #   on Win9x the link count remains 1
+    # On NFS the link count may still be 1 but we cant know that
+    # we are on NFS
+    return ( $fh[3] == 0 or $^O eq 'cygwin' ? 1 : 0);
+
+  } else {
+    _deferred_unlink($fh, $path, 0);
+    return 1;
+  }
+
+}
+
+=item B<cmpstat>
+
+Compare C<stat> of filehandle with C<stat> of provided filename.  This
+can be used to check that the filename and filehandle initially point
+to the same file and that the number of links to the file is 1 (all
+fields returned by stat() are compared).
+
+  cmpstat($fh, $path)
+     or die "Error comparing handle with file";
+
+Returns false if the stat information differs or if the link count is
+greater than 1.
+
+On certain platofms, eg Windows, not all the fields returned by stat()
+can be compared. For example, the C<dev> and C<rdev> fields seem to be
+different in Windows.  Also, it seems that the size of the file
+returned by stat() does not always agree, with C<stat(FH)> being more
+accurate than C<stat(filename)>, presumably because of caching issues
+even when using autoflush (this is usually overcome by waiting a while
+after writing to the tempfile before attempting to C<unlink0> it).
+
+Not exported by default.
+
+=cut
+
+sub cmpstat {
+
+  croak 'Usage: cmpstat(filehandle, filename)'
+    unless scalar(@_) == 2;
+
+  # Read args
+  my ($fh, $path) = @_;
+
+  warn "Comparing stat\n"
+    if $DEBUG;
+
+  # Stat the filehandle - which may be closed if someone has manually
+  # closed the file. Can not turn off warnings without using $^W
+  # unless we upgrade to 5.006 minimum requirement
+  my @fh;
+  {
+    local ($^W) = 0;
+    @fh = stat $fh;
+  }
+  return unless @fh;
+
+  if ($fh[3] > 1 && $^W) {
+    carp "unlink0: fstat found too many links; SB=@fh" if $^W;
+  }
+
+  # Stat the path
+  my @path = stat $path;
+
+  unless (@path) {
+    carp "unlink0: $path is gone already" if $^W;
+    return;
+  }
+
+  # this is no longer a file, but may be a directory, or worse
+  unless (-f $path) {
+    confess "panic: $path is no longer a file: SB=@fh";
+  }
+
+  # Do comparison of each member of the array
+  # On WinNT dev and rdev seem to be different
+  # depending on whether it is a file or a handle.
+  # Cannot simply compare all members of the stat return
+  # Select the ones we can use
+  my @okstat = (0..$#fh);  # Use all by default
+  if ($^O eq 'MSWin32') {
+    @okstat = (1,2,3,4,5,7,8,9,10);
+  } elsif ($^O eq 'os2') {
+    @okstat = (0, 2..$#fh);
+  } elsif ($^O eq 'VMS') { # device and file ID are sufficient
+    @okstat = (0, 1);
+  } elsif ($^O eq 'dos') {
+    @okstat = (0,2..7,11..$#fh);
+  } elsif ($^O eq 'mpeix') {
+    @okstat = (0..4,8..10);
+  }
+
+  # Now compare each entry explicitly by number
+  for (@okstat) {
+    print "Comparing: $_ : $fh[$_] and $path[$_]\n" if $DEBUG;
+    # Use eq rather than == since rdev, blksize, and blocks (6, 11,
+    # and 12) will be '' on platforms that do not support them.  This
+    # is fine since we are only comparing integers.
+    unless ($fh[$_] eq $path[$_]) {
+      warn "Did not match $_ element of stat\n" if $DEBUG;
+      return 0;
+    }
+  }
+
+  return 1;
+}
+
+=item B<unlink1>
+
+Similar to C<unlink0> except after file comparison using cmpstat, the
+filehandle is closed prior to attempting to unlink the file. This
+allows the file to be removed without using an END block, but does
+mean that the post-unlink comparison of the filehandle state provided
+by C<unlink0> is not available.
+
+  unlink1($fh, $path)
+     or die "Error closing and unlinking file";
+
+Usually called from the object destructor when using the OO interface.
+
+Not exported by default.
+
+This function is disabled if the global variable $KEEP_ALL is true.
+
+=cut
+
+sub unlink1 {
+  croak 'Usage: unlink1(filehandle, filename)'
+    unless scalar(@_) == 2;
+
+  # Read args
+  my ($fh, $path) = @_;
+
+  cmpstat($fh, $path) or return 0;
+
+  # Close the file
+  close( $fh ) or return 0;
+
+  # Make sure the file is writable (for windows)
+  _force_writable( $path );
+
+  # return early (without unlink) if we have been instructed to retain files.
+  return 1 if $KEEP_ALL;
+
+  # remove the file
+  return unlink($path);
+}
+
+=item B<cleanup>
+
+Calling this function will cause any temp files or temp directories
+that are registered for removal to be removed. This happens automatically
+when the process exits but can be triggered manually if the caller is sure
+that none of the temp files are required. This method can be registered as
+an Apache callback.
+
+On OSes where temp files are automatically removed when the temp file
+is closed, calling this function will have no effect other than to remove
+temporary directories (which may include temporary files).
+
+  File::Temp::cleanup();
+
+Not exported by default.
+
+=back
+
+=head1 PACKAGE VARIABLES
+
+These functions control the global state of the package.
+
+=over 4
+
+=item B<safe_level>
+
+Controls the lengths to which the module will go to check the safety of the
+temporary file or directory before proceeding.
+Options are:
+
+=over 8
+
+=item STANDARD
+
+Do the basic security measures to ensure the directory exists and
+is writable, that the umask() is fixed before opening of the file,
+that temporary files are opened only if they do not already exist, and
+that possible race conditions are avoided.  Finally the L<unlink0|"unlink0">
+function is used to remove files safely.
+
+=item MEDIUM
+
+In addition to the STANDARD security, the output directory is checked
+to make sure that it is owned either by root or the user running the
+program. If the directory is writable by group or by other, it is then
+checked to make sure that the sticky bit is set.
+
+Will not work on platforms that do not support the C<-k> test
+for sticky bit.
+
+=item HIGH
+
+In addition to the MEDIUM security checks, also check for the
+possibility of ``chown() giveaway'' using the L<POSIX|POSIX>
+sysconf() function. If this is a possibility, each directory in the
+path is checked in turn for safeness, recursively walking back to the
+root directory.
+
+For platforms that do not support the L<POSIX|POSIX>
+C<_PC_CHOWN_RESTRICTED> symbol (for example, Windows NT) it is
+assumed that ``chown() giveaway'' is possible and the recursive test
+is performed.
+
+=back
+
+The level can be changed as follows:
+
+  File::Temp->safe_level( File::Temp::HIGH );
+
+The level constants are not exported by the module.
+
+Currently, you must be running at least perl v5.6.0 in order to
+run with MEDIUM or HIGH security. This is simply because the
+safety tests use functions from L<Fcntl|Fcntl> that are not
+available in older versions of perl. The problem is that the version
+number for Fcntl is the same in perl 5.6.0 and in 5.005_03 even though
+they are different versions.
+
+On systems that do not support the HIGH or MEDIUM safety levels
+(for example Win NT or OS/2) any attempt to change the level will
+be ignored. The decision to ignore rather than raise an exception
+allows portable programs to be written with high security in mind
+for the systems that can support this without those programs failing
+on systems where the extra tests are irrelevant.
+
+If you really need to see whether the change has been accepted
+simply examine the return value of C<safe_level>.
+
+  $newlevel = File::Temp->safe_level( File::Temp::HIGH );
+  die "Could not change to high security"
+      if $newlevel != File::Temp::HIGH;
+
+=cut
+
+{
+  # protect from using the variable itself
+  my $LEVEL = STANDARD;
+  sub safe_level {
+    my $self = shift;
+    if (@_) {
+      my $level = shift;
+      if (($level != STANDARD) && ($level != MEDIUM) && ($level != HIGH)) {
+	carp "safe_level: Specified level ($level) not STANDARD, MEDIUM or HIGH - ignoring\n" if $^W;
+      } else {
+	# Dont allow this on perl 5.005 or earlier
+	if ($] < 5.006 && $level != STANDARD) {
+	  # Cant do MEDIUM or HIGH checks
+	  croak "Currently requires perl 5.006 or newer to do the safe checks";
+	}
+	# Check that we are allowed to change level
+	# Silently ignore if we can not.
+        $LEVEL = $level if _can_do_level($level);
+      }
+    }
+    return $LEVEL;
+  }
+}
+
+=item TopSystemUID
+
+This is the highest UID on the current system that refers to a root
+UID. This is used to make sure that the temporary directory is
+owned by a system UID (C<root>, C<bin>, C<sys> etc) rather than
+simply by root.
+
+This is required since on many unix systems C</tmp> is not owned
+by root.
+
+Default is to assume that any UID less than or equal to 10 is a root
+UID.
+
+  File::Temp->top_system_uid(10);
+  my $topid = File::Temp->top_system_uid;
+
+This value can be adjusted to reduce security checking if required.
+The value is only relevant when C<safe_level> is set to MEDIUM or higher.
+
+=cut
+
+{
+  my $TopSystemUID = 10;
+  sub top_system_uid {
+    my $self = shift;
+    if (@_) {
+      my $newuid = shift;
+      croak "top_system_uid: UIDs should be numeric"
+        unless $newuid =~ /^\d+$/s;
+      $TopSystemUID = $newuid;
+    }
+    return $TopSystemUID;
+  }
+}
+
+=item B<$KEEP_ALL>
+
+Controls whether temporary files and directories should be retained
+regardless of any instructions in the program to remove them
+automatically.  This is useful for debugging but should not be used in
+production code.
+
+  $File::Temp::KEEP_ALL = 1;
+
+Default is for files to be removed as requested by the caller.
+
+In some cases, files will only be retained if this variable is true
+when the file is created. This means that you can not create a temporary
+file, set this variable and expect the temp file to still be around
+when the program exits.
+
+=item B<$DEBUG>
+
+Controls whether debugging messages should be enabled.
+
+  $File::Temp::DEBUG = 1;
+
+Default is for debugging mode to be disabled.
+
+=back
+
+=head1 WARNING
+
+For maximum security, endeavour always to avoid ever looking at,
+touching, or even imputing the existence of the filename.  You do not
+know that that filename is connected to the same file as the handle
+you have, and attempts to check this can only trigger more race
+conditions.  It's far more secure to use the filehandle alone and
+dispense with the filename altogether.
+
+If you need to pass the handle to something that expects a filename
+then, on a unix system, use C<"/dev/fd/" . fileno($fh)> for arbitrary
+programs, or more generally C<< "+<=&" . fileno($fh) >> for Perl
+programs.  You will have to clear the close-on-exec bit on that file
+descriptor before passing it to another process.
+
+    use Fcntl qw/F_SETFD F_GETFD/;
+    fcntl($tmpfh, F_SETFD, 0)
+        or die "Can't clear close-on-exec flag on temp fh: $!\n";
+
+=head2 Temporary files and NFS
+
+Some problems are associated with using temporary files that reside
+on NFS file systems and it is recommended that a local filesystem
+is used whenever possible. Some of the security tests will most probably
+fail when the temp file is not local. Additionally, be aware that
+the performance of I/O operations over NFS will not be as good as for
+a local disk.
+
+=head2 Forking
+
+In some cases files created by File::Temp are removed from within an
+END block. Since END blocks are triggered when a child process exits
+(unless C<POSIX::_exit()> is used by the child) File::Temp takes care
+to only remove those temp files created by a particular process ID. This
+means that a child will not attempt to remove temp files created by the
+parent process.
+
+=head2 BINMODE
+
+The file returned by File::Temp will have been opened in binary mode
+if such a mode is available. If that is not correct, use the binmode()
+function to change the mode of the filehandle.
+
+=head1 HISTORY
+
+Originally began life in May 1999 as an XS interface to the system
+mkstemp() function. In March 2000, the OpenBSD mkstemp() code was
+translated to Perl for total control of the code's
+security checking, to ensure the presence of the function regardless of
+operating system and to help with portability. The module was shipped
+as a standard part of perl from v5.6.1.
+
+=head1 SEE ALSO
+
+L<POSIX/tmpnam>, L<POSIX/tmpfile>, L<File::Spec>, L<File::Path>
+
+See L<IO::File> and L<File::MkTemp>, L<Apachae::TempFile> for
+different implementations of temporary file handling.
+
+=head1 AUTHOR
+
+Tim Jenness E<lt>tjenness@cpan.orgE<gt>
+
+Copyright (C) 1999-2005 Tim Jenness and the UK Particle Physics and
+Astronomy Research Council. All Rights Reserved.  This program is free
+software; you can redistribute it and/or modify it under the same
+terms as Perl itself.
+
+Original Perl implementation loosely based on the OpenBSD C code for
+mkstemp(). Thanks to Tom Christiansen for suggesting that this module
+should be written and providing ideas for code improvements and
+security enhancements.
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/File/stat.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/File/stat.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/File/stat.pm	(revision 14489)
@@ -0,0 +1,139 @@
+package File::stat;
+use 5.006;
+
+use strict;
+use warnings;
+
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+our $VERSION = '1.00';
+
+BEGIN { 
+    use Exporter   ();
+    @EXPORT      = qw(stat lstat);
+    @EXPORT_OK   = qw( $st_dev	   $st_ino    $st_mode 
+		       $st_nlink   $st_uid    $st_gid 
+		       $st_rdev    $st_size 
+		       $st_atime   $st_mtime  $st_ctime 
+		       $st_blksize $st_blocks
+		    );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'File::stat' => [
+     map { $_ => '$' } qw{
+	 dev ino mode nlink uid gid rdev size
+	 atime mtime ctime blksize blocks
+     }
+];
+
+sub populate (@) {
+    return unless @_;
+    my $stob = new();
+    @$stob = (
+	$st_dev, $st_ino, $st_mode, $st_nlink, $st_uid, $st_gid, $st_rdev,
+        $st_size, $st_atime, $st_mtime, $st_ctime, $st_blksize, $st_blocks ) 
+	    = @_;
+    return $stob;
+} 
+
+sub lstat ($)  { populate(CORE::lstat(shift)) }
+
+sub stat ($) {
+    my $arg = shift;
+    my $st = populate(CORE::stat $arg);
+    return $st if $st;
+	my $fh;
+    {
+		local $!;
+		no strict 'refs';
+		require Symbol;
+		$fh = \*{ Symbol::qualify( $arg, caller() )};
+		return unless defined fileno $fh;
+	}
+    return populate(CORE::stat $fh);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+File::stat - by-name interface to Perl's built-in stat() functions
+
+=head1 SYNOPSIS
+
+ use File::stat;
+ $st = stat($file) or die "No $file: $!";
+ if ( ($st->mode & 0111) && $st->nlink > 1) ) {
+     print "$file is executable with lotsa links\n";
+ } 
+
+ use File::stat qw(:FIELDS);
+ stat($file) or die "No $file: $!";
+ if ( ($st_mode & 0111) && $st_nlink > 1) ) {
+     print "$file is executable with lotsa links\n";
+ } 
+
+=head1 DESCRIPTION
+
+This module's default exports override the core stat() 
+and lstat() functions, replacing them with versions that return 
+"File::stat" objects.  This object has methods that
+return the similarly named structure field name from the
+stat(2) function; namely,
+dev,
+ino,
+mode,
+nlink,
+uid,
+gid,
+rdev,
+size,
+atime,
+mtime,
+ctime,
+blksize,
+and
+blocks.  
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your stat() and lstat() functions.)  Access these fields as
+variables named with a preceding C<st_> in front their method names.
+Thus, C<$stat_obj-E<gt>dev()> corresponds to $st_dev if you import
+the fields.
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 BUGS
+
+As of Perl 5.8.0 after using this module you cannot use the implicit
+C<$_> or the special filehandle C<_> with stat() or lstat(), trying
+to do so leads into strange errors.  The workaround is for C<$_> to
+be explicit
+
+    my $stat_obj = stat $_;
+
+and for C<_> to explicitly populate the object using the unexported
+and undocumented populate() function with CORE::stat():
+
+    my $stat_obj = File::stat::populate(CORE::stat(_));
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
Index: /for-distributions/trunk/bin/windows/perl/lib/FileCache.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/FileCache.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/FileCache.pm	(revision 14489)
@@ -0,0 +1,184 @@
+package FileCache;
+
+our $VERSION = '1.06';
+
+=head1 NAME
+
+FileCache - keep more files open than the system permits
+
+=head1 SYNOPSIS
+
+    use FileCache;
+    # or
+    use FileCache maxopen => 16;
+
+    cacheout $mode, $path;
+    # or
+    cacheout $path;
+    print $path @data;
+
+    $fh = cacheout $mode, $path;
+    # or
+    $fh = cacheout $path;
+    print $fh @data;
+
+=head1 DESCRIPTION
+
+The C<cacheout> function will make sure that there's a filehandle open
+for reading or writing available as the pathname you give it. It
+automatically closes and re-opens files if you exceed your system's
+maximum number of file descriptors, or the suggested maximum I<maxopen>.
+
+=over
+
+=item cacheout EXPR
+
+The 1-argument form of cacheout will open a file for writing (C<< '>' >>)
+on it's first use, and appending (C<<< '>>' >>>) thereafter.
+
+Returns EXPR on success for convenience. You may neglect the
+return value and manipulate EXPR as the filehandle directly if you prefer.
+
+=item cacheout MODE, EXPR
+
+The 2-argument form of cacheout will use the supplied mode for the initial
+and subsequent openings. Most valid modes for 3-argument C<open> are supported
+namely; C<< '>' >>, C<< '+>' >>, C<< '<' >>, C<< '<+' >>, C<<< '>>' >>>,
+C< '|-' > and C< '-|' >
+
+To pass supplemental arguments to a program opened with C< '|-' > or C< '-|' >
+append them to the command string as you would system EXPR.
+
+Returns EXPR on success for convenience. You may neglect the
+return value and manipulate EXPR as the filehandle directly if you prefer.
+
+=back
+
+=head1 CAVEATS
+
+While it is permissible to C<close> a FileCache managed file,
+do not do so if you are calling C<FileCache::cacheout> from a package other
+than which it was imported, or with another module which overrides C<close>.
+If you must, use C<FileCache::cacheout_close>.
+
+Although FileCache can be used with piped opens ('-|' or '|-') doing so is
+strongly discouraged.  If FileCache finds it necessary to close and then reopen
+a pipe, the command at the far end of the pipe will be reexecuted - the results
+of performing IO on FileCache'd pipes is unlikely to be what you expect.  The
+ability to use FileCache on pipes may be removed in a future release.
+
+FileCache does not store the current file offset if it finds it necessary to
+close a file.  When the file is reopened, the offset will be as specified by the
+original C<open> file mode.  This could be construed to be a bug.
+
+=head1 BUGS
+
+F<sys/param.h> lies with its C<NOFILE> define on some systems,
+so you may have to set I<maxopen> yourself.
+
+=cut
+
+require 5.006;
+use Carp;
+use Config;
+use strict;
+no strict 'refs';
+
+# These are not C<my> for legacy reasons.
+# Previous versions requested the user set $cacheout_maxopen by hand.
+# Some authors fiddled with %saw to overcome the clobber on initial open.
+use vars qw(%saw $cacheout_maxopen);
+$cacheout_maxopen = 16;
+
+use base 'Exporter';
+our @EXPORT = qw[cacheout cacheout_close];
+
+
+my %isopen;
+my $cacheout_seq = 0;
+
+sub import {
+    my ($pkg,%args) = @_;
+
+    # Use Exporter. %args are for us, not Exporter.
+    # Make sure to up export_to_level, or we will import into ourselves,
+    # rather than our calling package;
+
+    __PACKAGE__->export_to_level(1);
+    Exporter::import( $pkg );
+
+    # Truth is okay here because setting maxopen to 0 would be bad
+    return $cacheout_maxopen = $args{maxopen} if $args{maxopen};
+
+    # XXX This code is crazy.  Why is it a one element foreach loop?
+    # Why is it using $param both as a filename and filehandle?
+    foreach my $param ( '/usr/include/sys/param.h' ){
+      if (open($param, '<', $param)) {
+	local ($_, $.);
+	while (<$param>) {
+	  if( /^\s*#\s*define\s+NOFILE\s+(\d+)/ ){
+	    $cacheout_maxopen = $1 - 4;
+	    close($param);
+	    last;
+	  }
+	}
+	close $param;
+      }
+    }
+    $cacheout_maxopen ||= 16;
+}
+
+# Open in their package.
+sub cacheout_open {
+  return open(*{caller(1) . '::' . $_[1]}, $_[0], $_[1]) && $_[1];
+}
+
+# Close in their package.
+sub cacheout_close {
+  # Short-circuit in case the filehandle disappeared
+  my $pkg = caller($_[1]||0);
+  fileno(*{$pkg . '::' . $_[0]}) &&
+    CORE::close(*{$pkg . '::' . $_[0]});
+  delete $isopen{$_[0]};
+}
+
+# But only this sub name is visible to them.
+sub cacheout {
+    my($mode, $file, $class, $ret, $ref, $narg);
+    croak "Not enough arguments for cacheout"  unless $narg = scalar @_;
+    croak "Too many arguments for cacheout"    if $narg > 2;
+
+    ($mode, $file) = @_;
+    ($file, $mode) = ($mode, $file) if $narg == 1;
+    croak "Invalid mode for cacheout" if $mode &&
+      ( $mode !~ /^\s*(?:>>|\+?>|\+?<|\|\-|)|\-\|\s*$/ );
+
+    # Mode changed?
+    if( $isopen{$file} && ($mode||'>') ne $isopen{$file}->[1] ){
+      &cacheout_close($file, 1);
+    }
+
+    if( $isopen{$file}) {
+      $ret = $file;
+      $isopen{$file}->[0]++;
+    }
+    else{
+      if( scalar keys(%isopen) > $cacheout_maxopen -1 ) {
+	my @lru = sort{ $isopen{$a}->[0] <=> $isopen{$b}->[0] } keys(%isopen);
+	$cacheout_seq = 0;
+	$isopen{$_}->[0] = $cacheout_seq++ for
+	  splice(@lru, int($cacheout_maxopen / 3)||$cacheout_maxopen);
+	&cacheout_close($_, 1) for @lru;
+      }
+
+      unless( $ref ){
+	$mode ||= $saw{$file} ? '>>' : ($saw{$file}=1, '>');
+      }
+      #XXX should we just return the value from cacheout_open, no croak?
+      $ret = cacheout_open($mode, $file) or croak("Can't create $file: $!");
+
+      $isopen{$file} = [++$cacheout_seq, $mode];
+    }
+    return $ret;
+}
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/FileHandle.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/FileHandle.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/FileHandle.pm	(revision 14489)
@@ -0,0 +1,262 @@
+package FileHandle;
+
+use 5.006;
+use strict;
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK);
+
+$VERSION = "2.01";
+
+require IO::File;
+@ISA = qw(IO::File);
+
+@EXPORT = qw(_IOFBF _IOLBF _IONBF);
+
+@EXPORT_OK = qw(
+    pipe
+
+    autoflush
+    output_field_separator
+    output_record_separator
+    input_record_separator
+    input_line_number
+    format_page_number
+    format_lines_per_page
+    format_lines_left
+    format_name
+    format_top_name
+    format_line_break_characters
+    format_formfeed
+
+    print
+    printf
+    getline
+    getlines
+);
+
+#
+# Everything we're willing to export, we must first import.
+#
+import IO::Handle grep { !defined(&$_) } @EXPORT, @EXPORT_OK;
+
+#
+# Some people call "FileHandle::function", so all the functions
+# that were in the old FileHandle class must be imported, too.
+#
+{
+    no strict 'refs';
+
+    my %import = (
+	'IO::Handle' =>
+	    [qw(DESTROY new_from_fd fdopen close fileno getc ungetc gets
+		eof flush error clearerr setbuf setvbuf _open_mode_string)],
+	'IO::Seekable' =>
+	    [qw(seek tell getpos setpos)],
+	'IO::File' =>
+	    [qw(new new_tmpfile open)]
+    );
+    for my $pkg (keys %import) {
+	for my $func (@{$import{$pkg}}) {
+	    my $c = *{"${pkg}::$func"}{CODE}
+		or die "${pkg}::$func missing";
+	    *$func = $c;
+	}
+    }
+}
+
+#
+# Specialized importer for Fcntl magic.
+#
+sub import {
+    my $pkg = shift;
+    my $callpkg = caller;
+    require Exporter;
+    Exporter::export($pkg, $callpkg, @_);
+
+    #
+    # If the Fcntl extension is available,
+    #  export its constants.
+    #
+    eval {
+	require Fcntl;
+	Exporter::export('Fcntl', $callpkg);
+    };
+}
+
+################################################
+# This is the only exported function we define;
+# the rest come from other classes.
+#
+
+sub pipe {
+    my $r = new IO::Handle;
+    my $w = new IO::Handle;
+    CORE::pipe($r, $w) or return undef;
+    ($r, $w);
+}
+
+# Rebless standard file handles
+bless *STDIN{IO},  "FileHandle" if ref *STDIN{IO}  eq "IO::Handle";
+bless *STDOUT{IO}, "FileHandle" if ref *STDOUT{IO} eq "IO::Handle";
+bless *STDERR{IO}, "FileHandle" if ref *STDERR{IO} eq "IO::Handle";
+
+1;
+
+__END__
+
+=head1 NAME
+
+FileHandle - supply object methods for filehandles
+
+=head1 SYNOPSIS
+
+    use FileHandle;
+
+    $fh = new FileHandle;
+    if ($fh->open("< file")) {
+        print <$fh>;
+        $fh->close;
+    }
+
+    $fh = new FileHandle "> FOO";
+    if (defined $fh) {
+        print $fh "bar\n";
+        $fh->close;
+    }
+
+    $fh = new FileHandle "file", "r";
+    if (defined $fh) {
+        print <$fh>;
+        undef $fh;       # automatically closes the file
+    }
+
+    $fh = new FileHandle "file", O_WRONLY|O_APPEND;
+    if (defined $fh) {
+        print $fh "corge\n";
+        undef $fh;       # automatically closes the file
+    }
+
+    $pos = $fh->getpos;
+    $fh->setpos($pos);
+
+    $fh->setvbuf($buffer_var, _IOLBF, 1024);
+
+    ($readfh, $writefh) = FileHandle::pipe;
+
+    autoflush STDOUT 1;
+
+=head1 DESCRIPTION
+
+NOTE: This class is now a front-end to the IO::* classes.
+
+C<FileHandle::new> creates a C<FileHandle>, which is a reference to a
+newly created symbol (see the C<Symbol> package).  If it receives any
+parameters, they are passed to C<FileHandle::open>; if the open fails,
+the C<FileHandle> object is destroyed.  Otherwise, it is returned to
+the caller.
+
+C<FileHandle::new_from_fd> creates a C<FileHandle> like C<new> does.
+It requires two parameters, which are passed to C<FileHandle::fdopen>;
+if the fdopen fails, the C<FileHandle> object is destroyed.
+Otherwise, it is returned to the caller.
+
+C<FileHandle::open> accepts one parameter or two.  With one parameter,
+it is just a front end for the built-in C<open> function.  With two
+parameters, the first parameter is a filename that may include
+whitespace or other special characters, and the second parameter is
+the open mode, optionally followed by a file permission value.
+
+If C<FileHandle::open> receives a Perl mode string (">", "+<", etc.)
+or a POSIX fopen() mode string ("w", "r+", etc.), it uses the basic
+Perl C<open> operator.
+
+If C<FileHandle::open> is given a numeric mode, it passes that mode
+and the optional permissions value to the Perl C<sysopen> operator.
+For convenience, C<FileHandle::import> tries to import the O_XXX
+constants from the Fcntl module.  If dynamic loading is not available,
+this may fail, but the rest of FileHandle will still work.
+
+C<FileHandle::fdopen> is like C<open> except that its first parameter
+is not a filename but rather a file handle name, a FileHandle object,
+or a file descriptor number.
+
+If the C functions fgetpos() and fsetpos() are available, then
+C<FileHandle::getpos> returns an opaque value that represents the
+current position of the FileHandle, and C<FileHandle::setpos> uses
+that value to return to a previously visited position.
+
+If the C function setvbuf() is available, then C<FileHandle::setvbuf>
+sets the buffering policy for the FileHandle.  The calling sequence
+for the Perl function is the same as its C counterpart, including the
+macros C<_IOFBF>, C<_IOLBF>, and C<_IONBF>, except that the buffer
+parameter specifies a scalar variable to use as a buffer.  WARNING: A
+variable used as a buffer by C<FileHandle::setvbuf> must not be
+modified in any way until the FileHandle is closed or until
+C<FileHandle::setvbuf> is called again, or memory corruption may
+result!
+
+See L<perlfunc> for complete descriptions of each of the following
+supported C<FileHandle> methods, which are just front ends for the
+corresponding built-in functions:
+
+    close
+    fileno
+    getc
+    gets
+    eof
+    clearerr
+    seek
+    tell
+
+See L<perlvar> for complete descriptions of each of the following
+supported C<FileHandle> methods:
+
+    autoflush
+    output_field_separator
+    output_record_separator
+    input_record_separator
+    input_line_number
+    format_page_number
+    format_lines_per_page
+    format_lines_left
+    format_name
+    format_top_name
+    format_line_break_characters
+    format_formfeed
+
+Furthermore, for doing normal I/O you might need these:
+
+=over 4
+
+=item $fh->print
+
+See L<perlfunc/print>.
+
+=item $fh->printf
+
+See L<perlfunc/printf>.
+
+=item $fh->getline
+
+This works like <$fh> described in L<perlop/"I/O Operators">
+except that it's more readable and can be safely called in a
+list context but still returns just one line.
+
+=item $fh->getlines
+
+This works like <$fh> when called in a list context to
+read all the remaining lines in a file, except that it's more readable.
+It will also croak() if accidentally called in a scalar context.
+
+=back
+
+There are many other functions available since FileHandle is descended
+from IO::File, IO::Seekable, and IO::Handle.  Please see those
+respective pages for documentation on more functions.
+
+=head1 SEE ALSO
+
+The B<IO> extension,
+L<perlfunc>, 
+L<perlop/"I/O Operators">.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Filter/Simple.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Filter/Simple.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Filter/Simple.pm	(revision 14489)
@@ -0,0 +1,783 @@
+package Filter::Simple;
+
+use Text::Balanced ':ALL';
+
+use vars qw{ $VERSION @EXPORT };
+
+$VERSION = '0.82';
+
+use Filter::Util::Call;
+use Carp;
+
+@EXPORT = qw( FILTER FILTER_ONLY );
+
+
+sub import {
+    if (@_>1) { shift; goto &FILTER }
+    else      { *{caller()."::$_"} = \&$_ foreach @EXPORT }
+}
+
+sub fail {
+    croak "FILTER_ONLY: ", @_;
+}
+
+my $exql = sub {
+    my @bits = extract_quotelike $_[0], qr//;
+    return unless $bits[0];
+    return \@bits;
+};
+
+my $ncws = qr/\s+/;
+my $comment = qr/(?<![\$\@%])#.*/;
+my $ws = qr/(?:$ncws|$comment)+/;
+my $id = qr/\b(?!([ysm]|q[rqxw]?|tr)\b)\w+/;
+my $EOP = qr/\n\n|\Z/;
+my $CUT = qr/\n=cut.*$EOP/;
+my $pod_or_DATA = qr/
+              ^=(?:head[1-4]|item) .*? $CUT
+            | ^=pod .*? $CUT
+            | ^=for .*? $EOP
+            | ^=begin \s* (\S+) .*? \n=end \s* \1 .*? $EOP
+            | ^__(DATA|END)__\r?\n.*
+            /smx;
+
+my %extractor_for = (
+    quotelike  => [ $ws,  \&extract_variable, $id, { MATCH  => \&extract_quotelike } ],
+    regex      => [ $ws,  $pod_or_DATA, $id, $exql           ],
+    string     => [ $ws,  $pod_or_DATA, $id, $exql           ],
+    code       => [ $ws, { DONT_MATCH => $pod_or_DATA },
+    		        \&extract_variable,
+                    $id, { DONT_MATCH => \&extract_quotelike }   ],
+    code_no_comments
+               => [ { DONT_MATCH => $comment },
+                    $ncws, { DONT_MATCH => $pod_or_DATA },
+    		        \&extract_variable,
+                    $id, { DONT_MATCH => \&extract_quotelike }   ],
+    executable => [ $ws, { DONT_MATCH => $pod_or_DATA }      ],
+    executable_no_comments
+               => [ { DONT_MATCH => $comment },
+                    $ncws, { DONT_MATCH => $pod_or_DATA }      ],
+    all        => [        { MATCH  => qr/(?s:.*)/         } ],
+);
+
+my %selector_for = (
+    all   => sub { my ($t)=@_; sub{ $_=$$_; $t->(@_); $_} },
+    executable=> sub { my ($t)=@_; sub{ref() ? $_=$$_ : $t->(@_); $_} }, 
+    quotelike => sub { my ($t)=@_; sub{ref() && do{$_=$$_; $t->(@_)}; $_} },
+    regex     => sub { my ($t)=@_;
+               sub{ref() or return $_;
+                   my ($ql,undef,$pre,$op,$ld,$pat) = @$_;
+                   return $_->[0] unless $op =~ /^(qr|m|s)/
+                         || !$op && ($ld eq '/' || $ld eq '?');
+                   $_ = $pat;
+                   $t->(@_);
+                   $ql =~ s/^(\s*\Q$op\E\s*\Q$ld\E)\Q$pat\E/$1$_/;
+                   return "$pre$ql";
+                  };
+            },
+    string     => sub { my ($t)=@_;
+               sub{ref() or return $_;
+                   local *args = \@_;
+                   my ($pre,$op,$ld1,$str1,$rd1,$ld2,$str2,$rd2,$flg) = @{$_}[2..10];
+                   return $_->[0] if $op =~ /^(qr|m)/
+                         || !$op && ($ld1 eq '/' || $ld1 eq '?');
+                   if (!$op || $op eq 'tr' || $op eq 'y') {
+                       local *_ = \$str1;
+                       $t->(@args);
+                   }
+                   if ($op =~ /^(tr|y|s)/) {
+                       local *_ = \$str2;
+                       $t->(@args);
+                   }
+                   my $result = "$pre$op$ld1$str1$rd1";
+                   $result .= $ld2 if $ld1 =~ m/[[({<]/; #])}>
+                   $result .= "$str2$rd2$flg";
+                   return $result;
+                  };
+              },
+);
+
+
+sub gen_std_filter_for {
+    my ($type, $transform) = @_;
+    return sub {
+        my $instr;
+        local @components;
+		for (extract_multiple($_,$extractor_for{$type})) {
+            if (ref())     { push @components, $_; $instr=0 }
+            elsif ($instr) { $components[-1] .= $_ }
+            else           { push @components, $_; $instr=1 }
+        }
+        if ($type =~ /^code/) {
+            my $count = 0;
+            local $placeholder = qr/\Q$;\E(\C{4})\Q$;\E/;
+            my $extractor =      qr/\Q$;\E(\C{4})\Q$;\E/;
+            $_ = join "",
+                  map { ref $_ ? $;.pack('N',$count++).$; : $_ }
+                      @components;
+            @components = grep { ref $_ } @components;
+            $transform->(@_);
+            s/$extractor/${$components[unpack('N',$1)]}/g;
+        }
+        else {
+            my $selector = $selector_for{$type}->($transform);
+            $_ = join "", map $selector->(@_), @components;
+        }
+    }
+};
+
+sub FILTER (&;$) {
+    my $caller = caller;
+    my ($filter, $terminator) = @_;
+    no warnings 'redefine';
+    *{"${caller}::import"} = gen_filter_import($caller,$filter,$terminator);
+    *{"${caller}::unimport"} = gen_filter_unimport($caller);
+}
+
+sub FILTER_ONLY {
+    my $caller = caller;
+    while (@_ > 1) {
+        my ($what, $how) = splice(@_, 0, 2);
+        fail "Unknown selector: $what"
+            unless exists $extractor_for{$what};
+        fail "Filter for $what is not a subroutine reference"
+            unless ref $how eq 'CODE';
+        push @transforms, gen_std_filter_for($what,$how);
+    }
+    my $terminator = shift;
+
+    my $multitransform = sub {
+        foreach my $transform ( @transforms ) {
+            $transform->(@_);
+        }
+    };
+    no warnings 'redefine';
+    *{"${caller}::import"} =
+        gen_filter_import($caller,$multitransform,$terminator);
+    *{"${caller}::unimport"} = gen_filter_unimport($caller);
+}
+
+my $ows    = qr/(?:[ \t]+|#[^\n]*)*/;
+
+sub gen_filter_import {
+    my ($class, $filter, $terminator) = @_;
+    my %terminator;
+    my $prev_import = *{$class."::import"}{CODE};
+    return sub {
+        my ($imported_class, @args) = @_;
+        my $def_terminator =
+            qr/^(?:\s*no\s+$imported_class\s*;$ows|__(?:END|DATA)__)\r?$/;
+        if (!defined $terminator) {
+            $terminator{terminator} = $def_terminator;
+        }
+        elsif (!ref $terminator || ref $terminator eq 'Regexp') {
+            $terminator{terminator} = $terminator;
+        }
+        elsif (ref $terminator ne 'HASH') {
+            croak "Terminator must be specified as scalar or hash ref"
+        }
+        elsif (!exists $terminator->{terminator}) {
+            $terminator{terminator} = $def_terminator;
+        }
+        filter_add(
+            sub {
+                my ($status, $lastline);
+                my $count = 0;
+                my $data = "";
+                while ($status = filter_read()) {
+                    return $status if $status < 0;
+                    if ($terminator{terminator} &&
+                        m/$terminator{terminator}/) {
+                        $lastline = $_;
+                        last;
+                    }
+                    $data .= $_;
+                    $count++;
+                    $_ = "";
+                }
+                return $count if not $count;
+                $_ = $data;
+                $filter->($imported_class, @args) unless $status < 0;
+                if (defined $lastline) {
+                    if (defined $terminator{becomes}) {
+                        $_ .= $terminator{becomes};
+                    }
+                    elsif ($lastline =~ $def_terminator) {
+                        $_ .= $lastline;
+                    }
+                }
+                return $count;
+            }
+        );
+        if ($prev_import) {
+            goto &$prev_import;
+        }
+        elsif ($class->isa('Exporter')) {
+            $class->export_to_level(1,@_);
+        }
+    }
+}
+
+sub gen_filter_unimport {
+    my ($class) = @_;
+    return sub {
+        filter_del();
+        goto &$prev_unimport if $prev_unimport;
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Filter::Simple - Simplified source filtering
+
+
+=head1 SYNOPSIS
+
+ # in MyFilter.pm:
+
+     package MyFilter;
+
+     use Filter::Simple;
+     
+     FILTER { ... };
+
+     # or just:
+     #
+     # use Filter::Simple sub { ... };
+
+ # in user's code:
+
+     use MyFilter;
+
+     # this code is filtered
+
+     no MyFilter;
+
+     # this code is not
+
+
+=head1 DESCRIPTION
+
+=head2 The Problem
+
+Source filtering is an immensely powerful feature of recent versions of Perl.
+It allows one to extend the language itself (e.g. the Switch module), to 
+simplify the language (e.g. Language::Pythonesque), or to completely recast the
+language (e.g. Lingua::Romana::Perligata). Effectively, it allows one to use
+the full power of Perl as its own, recursively applied, macro language.
+
+The excellent Filter::Util::Call module (by Paul Marquess) provides a
+usable Perl interface to source filtering, but it is often too powerful
+and not nearly as simple as it could be.
+
+To use the module it is necessary to do the following:
+
+=over 4
+
+=item 1.
+
+Download, build, and install the Filter::Util::Call module.
+(If you have Perl 5.7.1 or later, this is already done for you.)
+
+=item 2.
+
+Set up a module that does a C<use Filter::Util::Call>.
+
+=item 3.
+
+Within that module, create an C<import> subroutine.
+
+=item 4.
+
+Within the C<import> subroutine do a call to C<filter_add>, passing
+it either a subroutine reference.
+
+=item 5.
+
+Within the subroutine reference, call C<filter_read> or C<filter_read_exact>
+to "prime" $_ with source code data from the source file that will
+C<use> your module. Check the status value returned to see if any
+source code was actually read in.
+
+=item 6.
+
+Process the contents of $_ to change the source code in the desired manner.
+
+=item 7.
+
+Return the status value.
+
+=item 8.
+
+If the act of unimporting your module (via a C<no>) should cause source
+code filtering to cease, create an C<unimport> subroutine, and have it call
+C<filter_del>. Make sure that the call to C<filter_read> or
+C<filter_read_exact> in step 5 will not accidentally read past the
+C<no>. Effectively this limits source code filters to line-by-line
+operation, unless the C<import> subroutine does some fancy
+pre-pre-parsing of the source code it's filtering.
+
+=back
+
+For example, here is a minimal source code filter in a module named
+BANG.pm. It simply converts every occurrence of the sequence C<BANG\s+BANG>
+to the sequence C<die 'BANG' if $BANG> in any piece of code following a
+C<use BANG;> statement (until the next C<no BANG;> statement, if any):
+
+    package BANG;
+ 
+    use Filter::Util::Call ;
+
+    sub import {
+        filter_add( sub {
+        my $caller = caller;
+        my ($status, $no_seen, $data);
+        while ($status = filter_read()) {
+            if (/^\s*no\s+$caller\s*;\s*?$/) {
+                $no_seen=1;
+                last;
+            }
+            $data .= $_;
+            $_ = "";
+        }
+        $_ = $data;
+        s/BANG\s+BANG/die 'BANG' if \$BANG/g
+            unless $status < 0;
+        $_ .= "no $class;\n" if $no_seen;
+        return 1;
+        })
+    }
+
+    sub unimport {
+        filter_del();
+    }
+
+    1 ;
+
+This level of sophistication puts filtering out of the reach of
+many programmers.
+
+
+=head2 A Solution
+
+The Filter::Simple module provides a simplified interface to
+Filter::Util::Call; one that is sufficient for most common cases.
+
+Instead of the above process, with Filter::Simple the task of setting up
+a source code filter is reduced to:
+
+=over 4
+
+=item 1.
+
+Download and install the Filter::Simple module.
+(If you have Perl 5.7.1 or later, this is already done for you.)
+
+=item 2.
+
+Set up a module that does a C<use Filter::Simple> and then
+calls C<FILTER { ... }>.
+
+=item 3.
+
+Within the anonymous subroutine or block that is passed to
+C<FILTER>, process the contents of $_ to change the source code in
+the desired manner.
+
+=back
+
+In other words, the previous example, would become:
+
+    package BANG;
+    use Filter::Simple;
+    
+    FILTER {
+        s/BANG\s+BANG/die 'BANG' if \$BANG/g;
+    };
+
+    1 ;
+
+Note that the source code is passed as a single string, so any regex that
+uses C<^> or C<$> to detect line boundaries will need the C</m> flag.
+
+=head2 Disabling or changing <no> behaviour
+
+By default, the installed filter only filters up to a line consisting of one of
+the three standard source "terminators":
+
+    no ModuleName;  # optional comment
+
+or:
+
+    __END__
+
+or:
+
+    __DATA__
+
+but this can be altered by passing a second argument to C<use Filter::Simple>
+or C<FILTER> (just remember: there's I<no> comma after the initial block when
+you use C<FILTER>).
+
+That second argument may be either a C<qr>'d regular expression (which is then
+used to match the terminator line), or a defined false value (which indicates
+that no terminator line should be looked for), or a reference to a hash
+(in which case the terminator is the value associated with the key
+C<'terminator'>.
+
+For example, to cause the previous filter to filter only up to a line of the
+form:
+
+    GNAB esu;
+
+you would write:
+
+    package BANG;
+    use Filter::Simple;
+    
+    FILTER {
+        s/BANG\s+BANG/die 'BANG' if \$BANG/g;
+    }
+    qr/^\s*GNAB\s+esu\s*;\s*?$/;
+
+or:
+
+    FILTER {
+        s/BANG\s+BANG/die 'BANG' if \$BANG/g;
+    }
+    { terminator => qr/^\s*GNAB\s+esu\s*;\s*?$/ };
+
+and to prevent the filter's being turned off in any way:
+
+    package BANG;
+    use Filter::Simple;
+    
+    FILTER {
+        s/BANG\s+BANG/die 'BANG' if \$BANG/g;
+    }
+    "";    # or: 0
+
+or:
+
+    FILTER {
+        s/BANG\s+BANG/die 'BANG' if \$BANG/g;
+    }
+    { terminator => "" };
+
+B<Note that, no matter what you set the terminator pattern to,
+the actual terminator itself I<must> be contained on a single source line.>
+
+
+=head2 All-in-one interface
+
+Separating the loading of Filter::Simple:
+
+    use Filter::Simple;
+
+from the setting up of the filtering:
+
+    FILTER { ... };
+
+is useful because it allows other code (typically parser support code
+or caching variables) to be defined before the filter is invoked.
+However, there is often no need for such a separation.
+
+In those cases, it is easier to just append the filtering subroutine and
+any terminator specification directly to the C<use> statement that loads
+Filter::Simple, like so:
+
+    use Filter::Simple sub {
+        s/BANG\s+BANG/die 'BANG' if \$BANG/g;
+    };
+
+This is exactly the same as:
+
+    use Filter::Simple;
+    BEGIN {
+        Filter::Simple::FILTER {
+            s/BANG\s+BANG/die 'BANG' if \$BANG/g;
+        };
+    }
+
+except that the C<FILTER> subroutine is not exported by Filter::Simple.
+
+
+=head2 Filtering only specific components of source code
+
+One of the problems with a filter like:
+
+    use Filter::Simple;
+
+    FILTER { s/BANG\s+BANG/die 'BANG' if \$BANG/g };
+
+is that it indiscriminately applies the specified transformation to
+the entire text of your source program. So something like:
+
+    warn 'BANG BANG, YOU'RE DEAD';
+    BANG BANG;
+
+will become:
+
+    warn 'die 'BANG' if $BANG, YOU'RE DEAD';
+    die 'BANG' if $BANG;
+
+It is very common when filtering source to only want to apply the filter
+to the non-character-string parts of the code, or alternatively to I<only>
+the character strings.
+
+Filter::Simple supports this type of filtering by automatically
+exporting the C<FILTER_ONLY> subroutine.
+
+C<FILTER_ONLY> takes a sequence of specifiers that install separate
+(and possibly multiple) filters that act on only parts of the source code.
+For example:
+
+    use Filter::Simple;
+
+    FILTER_ONLY
+        code      => sub { s/BANG\s+BANG/die 'BANG' if \$BANG/g },
+        quotelike => sub { s/BANG\s+BANG/CHITTY CHITTY/g };
+
+The C<"code"> subroutine will only be used to filter parts of the source
+code that are not quotelikes, POD, or C<__DATA__>. The C<quotelike>
+subroutine only filters Perl quotelikes (including here documents).
+
+The full list of alternatives is:
+
+=over
+
+=item C<"code">
+
+Filters only those sections of the source code that are not quotelikes, POD, or
+C<__DATA__>.
+
+=item C<"code_no_comments">
+
+Filters only those sections of the source code that are not quotelikes, POD,
+comments, or C<__DATA__>.
+
+=item C<"executable">
+
+Filters only those sections of the source code that are not POD or C<__DATA__>.
+
+=item C<"executable_no_comments">
+
+Filters only those sections of the source code that are not POD, comments, or C<__DATA__>.
+
+=item C<"quotelike">
+
+Filters only Perl quotelikes (as interpreted by
+C<&Text::Balanced::extract_quotelike>).
+
+=item C<"string">
+
+Filters only the string literal parts of a Perl quotelike (i.e. the 
+contents of a string literal, either half of a C<tr///>, the second
+half of an C<s///>).
+
+=item C<"regex">
+
+Filters only the pattern literal parts of a Perl quotelike (i.e. the 
+contents of a C<qr//> or an C<m//>, the first half of an C<s///>).
+
+=item C<"all">
+
+Filters everything. Identical in effect to C<FILTER>.
+
+=back
+
+Except for C<< FILTER_ONLY code => sub {...} >>, each of
+the component filters is called repeatedly, once for each component
+found in the source code.
+
+Note that you can also apply two or more of the same type of filter in
+a single C<FILTER_ONLY>. For example, here's a simple 
+macro-preprocessor that is only applied within regexes,
+with a final debugging pass that prints the resulting source code:
+
+    use Regexp::Common;
+    FILTER_ONLY
+        regex => sub { s/!\[/[^/g },
+        regex => sub { s/%d/$RE{num}{int}/g },
+        regex => sub { s/%f/$RE{num}{real}/g },
+        all   => sub { print if $::DEBUG };
+
+
+
+=head2 Filtering only the code parts of source code
+ 
+Most source code ceases to be grammatically correct when it is broken up
+into the pieces between string literals and regexes. So the C<'code'>
+and C<'code_no_comments'> component filter behave slightly differently
+from the other partial filters described in the previous section.
+
+Rather than calling the specified processor on each individual piece of
+code (i.e. on the bits between quotelikes), the C<'code...'> partial
+filters operate on the entire source code, but with the quotelike bits
+(and, in the case of C<'code_no_comments'>, the comments) "blanked out".
+
+That is, a C<'code...'> filter I<replaces> each quoted string, quotelike,
+regex, POD, and __DATA__ section with a placeholder. The
+delimiters of this placeholder are the contents of the C<$;> variable
+at the time the filter is applied (normally C<"\034">). The remaining
+four bytes are a unique identifier for the component being replaced.
+
+This approach makes it comparatively easy to write code preprocessors
+without worrying about the form or contents of strings, regexes, etc.
+
+For convenience, during a C<'code...'> filtering operation, Filter::Simple
+provides a package variable (C<$Filter::Simple::placeholder>) that
+contains a pre-compiled regex that matches any placeholder...and
+captures the identifier within the placeholder. Placeholders can be
+moved and re-ordered within the source code as needed.
+
+In addition, a second package variable (C<@Filter::Simple::components>)
+contains a list of the various pieces of C<$_>, as they were originally split
+up to allow placeholders to be inserted.
+
+Once the filtering has been applied, the original strings, regexes, POD,
+etc. are re-inserted into the code, by replacing each placeholder with
+the corresponding original component (from C<@components>). Note that
+this means that the C<@components> variable must be treated with extreme
+care within the filter. The C<@components> array stores the "back-
+translations" of each placeholder inserted into C<$_>, as well as the
+interstitial source code between placeholders. If the placeholder
+backtranslations are altered in C<@components>, they will be similarly
+changed when the placeholders are removed from C<$_> after the filter
+is complete.
+
+For example, the following filter detects concatentated pairs of
+strings/quotelikes and reverses the order in which they are
+concatenated:
+
+    package DemoRevCat;
+    use Filter::Simple;
+
+    FILTER_ONLY code => sub {
+        my $ph = $Filter::Simple::placeholder;
+        s{ ($ph) \s* [.] \s* ($ph) }{ $2.$1 }gx
+    };
+
+Thus, the following code:
+
+    use DemoRevCat;
+
+    my $str = "abc" . q(def);
+
+    print "$str\n";
+
+would become:
+
+    my $str = q(def)."abc";
+
+    print "$str\n";
+
+and hence print:
+
+    defabc
+
+
+=head2 Using Filter::Simple with an explicit C<import> subroutine
+
+Filter::Simple generates a special C<import> subroutine for
+your module (see L<"How it works">) which would normally replace any
+C<import> subroutine you might have explicitly declared.
+
+However, Filter::Simple is smart enough to notice your existing
+C<import> and Do The Right Thing with it.
+That is, if you explicitly define an C<import> subroutine in a package
+that's using Filter::Simple, that C<import> subroutine will still
+be invoked immediately after any filter you install.
+
+The only thing you have to remember is that the C<import> subroutine
+I<must> be declared I<before> the filter is installed. If you use C<FILTER>
+to install the filter:
+
+    package Filter::TurnItUpTo11;
+
+    use Filter::Simple;
+
+    FILTER { s/(\w+)/\U$1/ };
+    
+that will almost never be a problem, but if you install a filtering
+subroutine by passing it directly to the C<use Filter::Simple>
+statement:
+
+    package Filter::TurnItUpTo11;
+
+    use Filter::Simple sub{ s/(\w+)/\U$1/ };
+
+then you must make sure that your C<import> subroutine appears before
+that C<use> statement.
+
+
+=head2 Using Filter::Simple and Exporter together
+
+Likewise, Filter::Simple is also smart enough
+to Do The Right Thing if you use Exporter:
+
+    package Switch;
+    use base Exporter;
+    use Filter::Simple;
+
+    @EXPORT    = qw(switch case);
+    @EXPORT_OK = qw(given  when);
+
+    FILTER { $_ = magic_Perl_filter($_) }
+
+Immediately after the filter has been applied to the source,
+Filter::Simple will pass control to Exporter, so it can do its magic too.
+
+Of course, here too, Filter::Simple has to know you're using Exporter
+before it applies the filter. That's almost never a problem, but if you're
+nervous about it, you can guarantee that things will work correctly by
+ensuring that your C<use base Exporter> always precedes your
+C<use Filter::Simple>.
+
+
+=head2 How it works
+
+The Filter::Simple module exports into the package that calls C<FILTER>
+(or C<use>s it directly) -- such as package "BANG" in the above example --
+two automagically constructed
+subroutines -- C<import> and C<unimport> -- which take care of all the
+nasty details.
+
+In addition, the generated C<import> subroutine passes its own argument
+list to the filtering subroutine, so the BANG.pm filter could easily 
+be made parametric:
+
+    package BANG;
+ 
+    use Filter::Simple;
+    
+    FILTER {
+        my ($die_msg, $var_name) = @_;
+        s/BANG\s+BANG/die '$die_msg' if \${$var_name}/g;
+    };
+
+    # and in some user code:
+
+    use BANG "BOOM", "BAM";  # "BANG BANG" becomes: die 'BOOM' if $BAM
+
+
+The specified filtering subroutine is called every time a C<use BANG> is
+encountered, and passed all the source code following that call, up to
+either the next C<no BANG;> (or whatever terminator you've set) or the
+end of the source file, whichever occurs first. By default, any C<no
+BANG;> call must appear by itself on a separate line, or it is ignored.
+
+
+=head1 AUTHOR
+
+Damian Conway (damian@conway.org)
+
+=head1 COPYRIGHT
+
+    Copyright (c) 2000-2001, Damian Conway. All Rights Reserved.
+    This module is free software. It may be used, redistributed
+    and/or modified under the same terms as Perl itself.
Index: /for-distributions/trunk/bin/windows/perl/lib/Filter/Util/Call.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Filter/Util/Call.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Filter/Util/Call.pm	(revision 14489)
@@ -0,0 +1,498 @@
+
+# Call.pm
+#
+# Copyright (c) 1995-2001 Paul Marquess. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+ 
+package Filter::Util::Call ;
+
+require 5.002 ;
+require DynaLoader;
+require Exporter;
+use Carp ;
+use strict;
+use warnings;
+use vars qw($VERSION @ISA @EXPORT) ;
+
+@ISA = qw(Exporter DynaLoader);
+@EXPORT = qw( filter_add filter_del filter_read filter_read_exact) ;
+$VERSION = "1.0601" ;
+
+sub filter_read_exact($)
+{
+    my ($size)   = @_ ;
+    my ($left)   = $size ;
+    my ($status) ;
+
+    croak ("filter_read_exact: size parameter must be > 0")
+	unless $size > 0 ;
+
+    # try to read a block which is exactly $size bytes long
+    while ($left and ($status = filter_read($left)) > 0) {
+        $left = $size - length $_ ;
+    }
+
+    # EOF with pending data is a special case
+    return 1 if $status == 0 and length $_ ;
+
+    return $status ;
+}
+
+sub filter_add($)
+{
+    my($obj) = @_ ;
+
+    # Did we get a code reference?
+    my $coderef = (ref $obj eq 'CODE') ;
+
+    # If the parameter isn't already a reference, make it one.
+    $obj = \$obj unless ref $obj ;
+
+    $obj = bless ($obj, (caller)[0]) unless $coderef ;
+
+    # finish off the installation of the filter in C.
+    Filter::Util::Call::real_import($obj, (caller)[0], $coderef) ;
+}
+
+bootstrap Filter::Util::Call ;
+
+1;
+__END__
+
+=head1 NAME
+
+Filter::Util::Call - Perl Source Filter Utility Module
+
+=head1 SYNOPSIS
+
+    use Filter::Util::Call ;
+
+=head1 DESCRIPTION
+
+This module provides you with the framework to write I<Source Filters>
+in Perl. 
+
+An alternate interface to Filter::Util::Call is now available. See
+L<Filter::Simple> for more details.
+
+A I<Perl Source Filter> is implemented as a Perl module. The structure
+of the module can take one of two broadly similar formats. To
+distinguish between them, the first will be referred to as I<method
+filter> and the second as I<closure filter>.
+
+Here is a skeleton for the I<method filter>:
+
+    package MyFilter ;
+
+    use Filter::Util::Call ;
+
+    sub import
+    {
+        my($type, @arguments) = @_ ;
+        filter_add([]) ;
+    }
+
+    sub filter
+    {
+        my($self) = @_ ;
+        my($status) ;
+
+        $status = filter_read() ;
+        $status ;
+    }
+
+    1 ;
+
+and this is the equivalent skeleton for the I<closure filter>:
+
+    package MyFilter ;
+
+    use Filter::Util::Call ;
+
+    sub import
+    {
+        my($type, @arguments) = @_ ;
+
+        filter_add(
+            sub 
+            {
+                my($status) ;
+                $status = filter_read() ;
+                $status ;
+            } )
+    }
+
+    1 ;
+
+To make use of either of the two filter modules above, place the line
+below in a Perl source file.
+
+    use MyFilter; 
+
+In fact, the skeleton modules shown above are fully functional I<Source
+Filters>, albeit fairly useless ones. All they does is filter the
+source stream without modifying it at all.
+
+As you can see both modules have a broadly similar structure. They both
+make use of the C<Filter::Util::Call> module and both have an C<import>
+method. The difference between them is that the I<method filter>
+requires a I<filter> method, whereas the I<closure filter> gets the
+equivalent of a I<filter> method with the anonymous sub passed to
+I<filter_add>.
+
+To make proper use of the I<closure filter> shown above you need to
+have a good understanding of the concept of a I<closure>. See
+L<perlref> for more details on the mechanics of I<closures>.
+
+=head2 B<use Filter::Util::Call>
+
+The following functions are exported by C<Filter::Util::Call>:
+
+    filter_add()
+    filter_read()
+    filter_read_exact()
+    filter_del()
+
+=head2 B<import()>
+
+The C<import> method is used to create an instance of the filter. It is
+called indirectly by Perl when it encounters the C<use MyFilter> line
+in a source file (See L<perlfunc/import> for more details on
+C<import>).
+
+It will always have at least one parameter automatically passed by Perl
+- this corresponds to the name of the package. In the example above it
+will be C<"MyFilter">.
+
+Apart from the first parameter, import can accept an optional list of
+parameters. These can be used to pass parameters to the filter. For
+example:
+
+    use MyFilter qw(a b c) ;
+
+will result in the C<@_> array having the following values:
+
+    @_ [0] => "MyFilter"
+    @_ [1] => "a"
+    @_ [2] => "b"
+    @_ [3] => "c"
+
+Before terminating, the C<import> function must explicitly install the
+filter by calling C<filter_add>.
+
+B<filter_add()>
+
+The function, C<filter_add>, actually installs the filter. It takes one
+parameter which should be a reference. The kind of reference used will
+dictate which of the two filter types will be used.
+
+If a CODE reference is used then a I<closure filter> will be assumed.
+
+If a CODE reference is not used, a I<method filter> will be assumed.
+In a I<method filter>, the reference can be used to store context
+information. The reference will be I<blessed> into the package by
+C<filter_add>.
+
+See the filters at the end of this documents for examples of using
+context information using both I<method filters> and I<closure
+filters>.
+
+=head2 B<filter() and anonymous sub>
+
+Both the C<filter> method used with a I<method filter> and the
+anonymous sub used with a I<closure filter> is where the main
+processing for the filter is done.
+
+The big difference between the two types of filter is that the I<method
+filter> uses the object passed to the method to store any context data,
+whereas the I<closure filter> uses the lexical variables that are
+maintained by the closure.
+
+Note that the single parameter passed to the I<method filter>,
+C<$self>, is the same reference that was passed to C<filter_add>
+blessed into the filter's package. See the example filters later on for
+details of using C<$self>.
+
+Here is a list of the common features of the anonymous sub and the
+C<filter()> method.
+
+=over 5
+
+=item B<$_>
+
+Although C<$_> doesn't actually appear explicitly in the sample filters
+above, it is implicitly used in a number of places.
+
+Firstly, when either C<filter> or the anonymous sub are called, a local
+copy of C<$_> will automatically be created. It will always contain the
+empty string at this point.
+
+Next, both C<filter_read> and C<filter_read_exact> will append any
+source data that is read to the end of C<$_>.
+
+Finally, when C<filter> or the anonymous sub are finished processing,
+they are expected to return the filtered source using C<$_>.
+
+This implicit use of C<$_> greatly simplifies the filter.
+
+=item B<$status>
+
+The status value that is returned by the user's C<filter> method or
+anonymous sub and the C<filter_read> and C<read_exact> functions take
+the same set of values, namely:
+
+    < 0  Error
+    = 0  EOF
+    > 0  OK
+
+=item B<filter_read> and B<filter_read_exact>
+
+These functions are used by the filter to obtain either a line or block
+from the next filter in the chain or the actual source file if there
+aren't any other filters.
+
+The function C<filter_read> takes two forms:
+
+    $status = filter_read() ;
+    $status = filter_read($size) ;
+
+The first form is used to request a I<line>, the second requests a
+I<block>.
+
+In line mode, C<filter_read> will append the next source line to the
+end of the C<$_> scalar.
+
+In block mode, C<filter_read> will append a block of data which is <=
+C<$size> to the end of the C<$_> scalar. It is important to emphasise
+the that C<filter_read> will not necessarily read a block which is
+I<precisely> C<$size> bytes.
+
+If you need to be able to read a block which has an exact size, you can
+use the function C<filter_read_exact>. It works identically to
+C<filter_read> in block mode, except it will try to read a block which
+is exactly C<$size> bytes in length. The only circumstances when it
+will not return a block which is C<$size> bytes long is on EOF or
+error.
+
+It is I<very> important to check the value of C<$status> after I<every>
+call to C<filter_read> or C<filter_read_exact>.
+
+=item B<filter_del>
+
+The function, C<filter_del>, is used to disable the current filter. It
+does not affect the running of the filter. All it does is tell Perl not
+to call filter any more.
+
+See L<Example 4: Using filter_del> for details.
+
+=back
+
+=head1 EXAMPLES
+
+Here are a few examples which illustrate the key concepts - as such
+most of them are of little practical use.
+
+The C<examples> sub-directory has copies of all these filters
+implemented both as I<method filters> and as I<closure filters>.
+
+=head2 Example 1: A simple filter.
+
+Below is a I<method filter> which is hard-wired to replace all
+occurrences of the string C<"Joe"> to C<"Jim">. Not particularly
+Useful, but it is the first example and I wanted to keep it simple.
+
+    package Joe2Jim ;
+
+    use Filter::Util::Call ;
+
+    sub import
+    {
+        my($type) = @_ ;
+
+        filter_add(bless []) ;
+    }
+
+    sub filter
+    {
+        my($self) = @_ ;
+        my($status) ;
+
+        s/Joe/Jim/g
+            if ($status = filter_read()) > 0 ;
+        $status ;
+    }
+
+    1 ;
+
+Here is an example of using the filter:
+
+    use Joe2Jim ;
+    print "Where is Joe?\n" ;
+
+And this is what the script above will print:
+
+    Where is Jim?
+
+=head2 Example 2: Using the context
+
+The previous example was not particularly useful. To make it more
+general purpose we will make use of the context data and allow any
+arbitrary I<from> and I<to> strings to be used. This time we will use a
+I<closure filter>. To reflect its enhanced role, the filter is called
+C<Subst>.
+
+    package Subst ;
+
+    use Filter::Util::Call ;
+    use Carp ;
+
+    sub import
+    {
+        croak("usage: use Subst qw(from to)")
+            unless @_ == 3 ;
+        my ($self, $from, $to) = @_ ;
+        filter_add(
+            sub 
+            {
+                my ($status) ;
+                s/$from/$to/
+                    if ($status = filter_read()) > 0 ;
+                $status ;
+            })
+    }
+    1 ;
+
+and is used like this:
+
+    use Subst qw(Joe Jim) ;
+    print "Where is Joe?\n" ;
+
+
+=head2 Example 3: Using the context within the filter
+
+Here is a filter which a variation of the C<Joe2Jim> filter. As well as
+substituting all occurrences of C<"Joe"> to C<"Jim"> it keeps a count
+of the number of substitutions made in the context object.
+
+Once EOF is detected (C<$status> is zero) the filter will insert an
+extra line into the source stream. When this extra line is executed it
+will print a count of the number of substitutions actually made.
+Note that C<$status> is set to C<1> in this case.
+
+    package Count ;
+
+    use Filter::Util::Call ;
+
+    sub filter
+    {
+        my ($self) = @_ ;
+        my ($status) ;
+
+        if (($status = filter_read()) > 0 ) {
+            s/Joe/Jim/g ;
+	    ++ $$self ;
+        }
+	elsif ($$self >= 0) { # EOF
+            $_ = "print q[Made ${$self} substitutions\n]" ;
+            $status = 1 ;
+	    $$self = -1 ;
+        }
+
+        $status ;
+    }
+
+    sub import
+    {
+        my ($self) = @_ ;
+        my ($count) = 0 ;
+        filter_add(\$count) ;
+    }
+
+    1 ;
+
+Here is a script which uses it:
+
+    use Count ;
+    print "Hello Joe\n" ;
+    print "Where is Joe\n" ;
+
+Outputs:
+
+    Hello Jim
+    Where is Jim
+    Made 2 substitutions
+
+=head2 Example 4: Using filter_del
+
+Another variation on a theme. This time we will modify the C<Subst>
+filter to allow a starting and stopping pattern to be specified as well
+as the I<from> and I<to> patterns. If you know the I<vi> editor, it is
+the equivalent of this command:
+
+    :/start/,/stop/s/from/to/
+
+When used as a filter we want to invoke it like this:
+
+    use NewSubst qw(start stop from to) ;
+
+Here is the module.
+
+    package NewSubst ;
+
+    use Filter::Util::Call ;
+    use Carp ;
+
+    sub import
+    {
+        my ($self, $start, $stop, $from, $to) = @_ ;
+        my ($found) = 0 ;
+        croak("usage: use Subst qw(start stop from to)")
+            unless @_ == 5 ;
+
+        filter_add( 
+            sub 
+            {
+                my ($status) ;
+
+                if (($status = filter_read()) > 0) {
+
+                    $found = 1
+                        if $found == 0 and /$start/ ;
+
+                    if ($found) {
+                        s/$from/$to/ ;
+                        filter_del() if /$stop/ ;
+                    }
+
+                }
+                $status ;
+            } )
+
+    }
+
+    1 ;
+
+=head1 Filter::Simple
+
+If you intend using the Filter::Call functionality, I would strongly
+recommend that you check out Damian Conway's excellent Filter::Simple
+module. Damian's module provides a much cleaner interface than
+Filter::Util::Call. Although it doesn't allow the fine control that
+Filter::Util::Call does, it should be adequate for the majority of
+applications. It's available at
+
+   http://www.cpan.org/modules/by-author/Damian_Conway/Filter-Simple.tar.gz
+   http://www.csse.monash.edu.au/~damian/CPAN/Filter-Simple.tar.gz
+
+=head1 AUTHOR
+
+Paul Marquess 
+
+=head1 DATE
+
+26th January 1996
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/FindBin.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/FindBin.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/FindBin.pm	(revision 14489)
@@ -0,0 +1,205 @@
+# FindBin.pm
+#
+# Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. 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
+
+FindBin - Locate directory of original perl script
+
+=head1 SYNOPSIS
+
+ use FindBin;
+ use lib "$FindBin::Bin/../lib";
+
+ or
+
+ use FindBin qw($Bin);
+ use lib "$Bin/../lib";
+
+=head1 DESCRIPTION
+
+Locates the full path to the script bin directory to allow the use
+of paths relative to the bin directory.
+
+This allows a user to setup a directory tree for some software with
+directories C<< <root>/bin >> and C<< <root>/lib >>, and then the above
+example will allow the use of modules in the lib directory without knowing
+where the software tree is installed.
+
+If perl is invoked using the B<-e> option or the perl script is read from
+C<STDIN> then FindBin sets both C<$Bin> and C<$RealBin> to the current
+directory.
+
+=head1 EXPORTABLE VARIABLES
+
+ $Bin         - path to bin directory from where script was invoked
+ $Script      - basename of script from which perl was invoked
+ $RealBin     - $Bin with all links resolved
+ $RealScript  - $Script with all links resolved
+
+=head1 KNOWN ISSUES
+
+If there are two modules using C<FindBin> from different directories
+under the same interpreter, this won't work. Since C<FindBin> uses a
+C<BEGIN> block, it'll be executed only once, and only the first caller
+will get it right. This is a problem under mod_perl and other persistent
+Perl environments, where you shouldn't use this module. Which also means
+that you should avoid using C<FindBin> in modules that you plan to put
+on CPAN. To make sure that C<FindBin> will work is to call the C<again>
+function:
+
+  use FindBin;
+  FindBin::again(); # or FindBin->again;
+
+In former versions of FindBin there was no C<again> function. The
+workaround was to force the C<BEGIN> block to be executed again:
+
+  delete $INC{'FindBin.pm'};
+  require FindBin;
+
+=head1 KNOWN BUGS
+
+If perl is invoked as
+
+   perl filename
+
+and I<filename> does not have executable rights and a program called
+I<filename> exists in the users C<$ENV{PATH}> which satisfies both B<-x>
+and B<-T> then FindBin assumes that it was invoked via the
+C<$ENV{PATH}>.
+
+Workaround is to invoke perl as
+
+ perl ./filename
+
+=head1 AUTHORS
+
+FindBin is supported as part of the core perl distribution. Please send bug
+reports to E<lt>F<perlbug@perl.org>E<gt> using the perlbug program
+included with perl.
+
+Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+Nick Ing-Simmons E<lt>F<nik@tiuk.ti.com>E<gt>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. All rights reserved.
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+package FindBin;
+use Carp;
+require 5.000;
+require Exporter;
+use Cwd qw(getcwd cwd abs_path);
+use Config;
+use File::Basename;
+use File::Spec;
+
+@EXPORT_OK = qw($Bin $Script $RealBin $RealScript $Dir $RealDir);
+%EXPORT_TAGS = (ALL => [qw($Bin $Script $RealBin $RealScript $Dir $RealDir)]);
+@ISA = qw(Exporter);
+
+$VERSION = "1.47";
+
+sub cwd2 {
+   my $cwd = getcwd();
+   # getcwd might fail if it hasn't access to the current directory.
+   # try harder.
+   defined $cwd or $cwd = cwd();
+   $cwd;
+}
+
+sub init
+{
+ *Dir = \$Bin;
+ *RealDir = \$RealBin;
+
+ if($0 eq '-e' || $0 eq '-')
+  {
+   # perl invoked with -e or script is on C<STDIN>
+   $Script = $RealScript = $0;
+   $Bin    = $RealBin    = cwd2();
+  }
+ else
+  {
+   my $script = $0;
+
+   if ($^O eq 'VMS')
+    {
+     ($Bin,$Script) = VMS::Filespec::rmsexpand($0) =~ /(.*\])(.*)/s;
+     ($RealBin,$RealScript) = ($Bin,$Script);
+    }
+   else
+    {
+     my $dosish = ($^O eq 'MSWin32' or $^O eq 'os2');
+     unless(($script =~ m#/# || ($dosish && $script =~ m#\\#))
+            && -f $script)
+      {
+       my $dir;
+       foreach $dir (File::Spec->path)
+	{
+        my $scr = File::Spec->catfile($dir, $script);
+	if(-r $scr && (!$dosish || -x _))
+         {
+          $script = $scr;
+
+	  if (-f $0)
+           {
+	    # $script has been found via PATH but perl could have
+	    # been invoked as 'perl file'. Do a dumb check to see
+	    # if $script is a perl program, if not then $script = $0
+            #
+            # well we actually only check that it is an ASCII file
+            # we know its executable so it is probably a script
+            # of some sort.
+
+            $script = $0 unless(-T $script);
+           }
+          last;
+         }
+       }
+     }
+
+     croak("Cannot find current script '$0'") unless(-f $script);
+
+     # Ensure $script contains the complete path in case we C<chdir>
+
+     $script = File::Spec->catfile(cwd2(), $script)
+       unless File::Spec->file_name_is_absolute($script);
+
+     ($Script,$Bin) = fileparse($script);
+
+     # Resolve $script if it is a link
+     while(1)
+      {
+       my $linktext = readlink($script);
+
+       ($RealScript,$RealBin) = fileparse($script);
+       last unless defined $linktext;
+
+       $script = (File::Spec->file_name_is_absolute($linktext))
+                  ? $linktext
+                  : File::Spec->catfile($RealBin, $linktext);
+      }
+
+     # Get absolute paths to directories
+     if ($Bin) {
+      my $BinOld = $Bin;
+      $Bin = abs_path($Bin);
+      defined $Bin or $Bin = File::Spec->canonpath($BinOld);
+     }
+     $RealBin = abs_path($RealBin) if($RealBin);
+    }
+  }
+}
+
+BEGIN { init }
+
+*again = \&init;
+
+1; # Keep require happy
Index: /for-distributions/trunk/bin/windows/perl/lib/Getopt/Long.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Getopt/Long.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Getopt/Long.pm	(revision 14489)
@@ -0,0 +1,2504 @@
+# Getopt::Long.pm -- Universal options parsing
+
+package Getopt::Long;
+
+# RCS Status      : $Id: GetoptLong.pm,v 2.72 2005-04-28 21:18:33+02 jv Exp $
+# Author          : Johan Vromans
+# Created On      : Tue Sep 11 15:00:12 1990
+# Last Modified By: Johan Vromans
+# Last Modified On: Wed Dec 14 21:17:21 2005
+# Update Count    : 1458
+# Status          : Released
+
+################ Copyright ################
+
+# This program is Copyright 1990,2005 by Johan Vromans.
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the Perl Artistic License or 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.
+#
+# If you do not have a copy of the GNU General Public License write to
+# the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+# MA 02139, USA.
+
+################ Module Preamble ################
+
+use 5.004;
+
+use strict;
+
+use vars qw($VERSION);
+$VERSION        =  2.35;
+# For testing versions only.
+#use vars qw($VERSION_STRING);
+#$VERSION_STRING = "2.35";
+
+use Exporter;
+use vars qw(@ISA @EXPORT @EXPORT_OK);
+@ISA = qw(Exporter);
+
+# Exported subroutines.
+sub GetOptions(@);		# always
+sub Configure(@);		# on demand
+sub HelpMessage(@);		# on demand
+sub VersionMessage(@);		# in demand
+
+BEGIN {
+    # Init immediately so their contents can be used in the 'use vars' below.
+    @EXPORT    = qw(&GetOptions $REQUIRE_ORDER $PERMUTE $RETURN_IN_ORDER);
+    @EXPORT_OK = qw(&HelpMessage &VersionMessage &Configure);
+}
+
+# User visible variables.
+use vars @EXPORT, @EXPORT_OK;
+use vars qw($error $debug $major_version $minor_version);
+# Deprecated visible variables.
+use vars qw($autoabbrev $getopt_compat $ignorecase $bundling $order
+	    $passthrough);
+# Official invisible variables.
+use vars qw($genprefix $caller $gnu_compat $auto_help $auto_version $longprefix);
+
+# Public subroutines.
+sub config(@);			# deprecated name
+
+# Private subroutines.
+sub ConfigDefaults();
+sub ParseOptionSpec($$);
+sub OptCtl($);
+sub FindOption($$$$);
+sub ValidValue ($$$$$);
+
+################ Local Variables ################
+
+# $requested_version holds the version that was mentioned in the 'use'
+# or 'require', if any. It can be used to enable or disable specific
+# features.
+my $requested_version = 0;
+
+################ Resident subroutines ################
+
+sub ConfigDefaults() {
+    # Handle POSIX compliancy.
+    if ( defined $ENV{"POSIXLY_CORRECT"} ) {
+	$genprefix = "(--|-)";
+	$autoabbrev = 0;		# no automatic abbrev of options
+	$bundling = 0;			# no bundling of single letter switches
+	$getopt_compat = 0;		# disallow '+' to start options
+	$order = $REQUIRE_ORDER;
+    }
+    else {
+	$genprefix = "(--|-|\\+)";
+	$autoabbrev = 1;		# automatic abbrev of options
+	$bundling = 0;			# bundling off by default
+	$getopt_compat = 1;		# allow '+' to start options
+	$order = $PERMUTE;
+    }
+    # Other configurable settings.
+    $debug = 0;			# for debugging
+    $error = 0;			# error tally
+    $ignorecase = 1;		# ignore case when matching options
+    $passthrough = 0;		# leave unrecognized options alone
+    $gnu_compat = 0;		# require --opt=val if value is optional
+    $longprefix = "(--)";       # what does a long prefix look like
+}
+
+# Override import.
+sub import {
+    my $pkg = shift;		# package
+    my @syms = ();		# symbols to import
+    my @config = ();		# configuration
+    my $dest = \@syms;		# symbols first
+    for ( @_ ) {
+	if ( $_ eq ':config' ) {
+	    $dest = \@config;	# config next
+	    next;
+	}
+	push(@$dest, $_);	# push
+    }
+    # Hide one level and call super.
+    local $Exporter::ExportLevel = 1;
+    push(@syms, qw(&GetOptions)) if @syms; # always export GetOptions
+    $pkg->SUPER::import(@syms);
+    # And configure.
+    Configure(@config) if @config;
+}
+
+################ Initialization ################
+
+# Values for $order. See GNU getopt.c for details.
+($REQUIRE_ORDER, $PERMUTE, $RETURN_IN_ORDER) = (0..2);
+# Version major/minor numbers.
+($major_version, $minor_version) = $VERSION =~ /^(\d+)\.(\d+)/;
+
+ConfigDefaults();
+
+################ OO Interface ################
+
+package Getopt::Long::Parser;
+
+# Store a copy of the default configuration. Since ConfigDefaults has
+# just been called, what we get from Configure is the default.
+my $default_config = do {
+    Getopt::Long::Configure ()
+};
+
+sub new {
+    my $that = shift;
+    my $class = ref($that) || $that;
+    my %atts = @_;
+
+    # Register the callers package.
+    my $self = { caller_pkg => (caller)[0] };
+
+    bless ($self, $class);
+
+    # Process config attributes.
+    if ( defined $atts{config} ) {
+	my $save = Getopt::Long::Configure ($default_config, @{$atts{config}});
+	$self->{settings} = Getopt::Long::Configure ($save);
+	delete ($atts{config});
+    }
+    # Else use default config.
+    else {
+	$self->{settings} = $default_config;
+    }
+
+    if ( %atts ) {		# Oops
+	die(__PACKAGE__.": unhandled attributes: ".
+	    join(" ", sort(keys(%atts)))."\n");
+    }
+
+    $self;
+}
+
+sub configure {
+    my ($self) = shift;
+
+    # Restore settings, merge new settings in.
+    my $save = Getopt::Long::Configure ($self->{settings}, @_);
+
+    # Restore orig config and save the new config.
+    $self->{settings} = Getopt::Long::Configure ($save);
+}
+
+sub getoptions {
+    my ($self) = shift;
+
+    # Restore config settings.
+    my $save = Getopt::Long::Configure ($self->{settings});
+
+    # Call main routine.
+    my $ret = 0;
+    $Getopt::Long::caller = $self->{caller_pkg};
+
+    eval {
+	# Locally set exception handler to default, otherwise it will
+	# be called implicitly here, and again explicitly when we try
+	# to deliver the messages.
+	local ($SIG{__DIE__}) = '__DEFAULT__';
+	$ret = Getopt::Long::GetOptions (@_);
+    };
+
+    # Restore saved settings.
+    Getopt::Long::Configure ($save);
+
+    # Handle errors and return value.
+    die ($@) if $@;
+    return $ret;
+}
+
+package Getopt::Long;
+
+################ Back to Normal ################
+
+# Indices in option control info.
+# Note that ParseOptions uses the fields directly. Search for 'hard-wired'.
+use constant CTL_TYPE    => 0;
+#use constant   CTL_TYPE_FLAG   => '';
+#use constant   CTL_TYPE_NEG    => '!';
+#use constant   CTL_TYPE_INCR   => '+';
+#use constant   CTL_TYPE_INT    => 'i';
+#use constant   CTL_TYPE_INTINC => 'I';
+#use constant   CTL_TYPE_XINT   => 'o';
+#use constant   CTL_TYPE_FLOAT  => 'f';
+#use constant   CTL_TYPE_STRING => 's';
+
+use constant CTL_CNAME   => 1;
+
+use constant CTL_DEFAULT => 2;
+
+use constant CTL_DEST    => 3;
+ use constant   CTL_DEST_SCALAR => 0;
+ use constant   CTL_DEST_ARRAY  => 1;
+ use constant   CTL_DEST_HASH   => 2;
+ use constant   CTL_DEST_CODE   => 3;
+
+use constant CTL_AMIN    => 4;
+use constant CTL_AMAX    => 5;
+
+# FFU.
+#use constant CTL_RANGE   => ;
+#use constant CTL_REPEAT  => ;
+
+sub GetOptions(@) {
+
+    my @optionlist = @_;	# local copy of the option descriptions
+    my $argend = '--';		# option list terminator
+    my %opctl = ();		# table of option specs
+    my $pkg = $caller || (caller)[0];	# current context
+				# Needed if linkage is omitted.
+    my @ret = ();		# accum for non-options
+    my %linkage;		# linkage
+    my $userlinkage;		# user supplied HASH
+    my $opt;			# current option
+    my $prefix = $genprefix;	# current prefix
+
+    $error = '';
+
+    if ( $debug ) {
+	# Avoid some warnings if debugging.
+	local ($^W) = 0;
+	print STDERR
+	  ("Getopt::Long $Getopt::Long::VERSION (",
+	   '$Revision: 2.72 $', ") ",
+	   "called from package \"$pkg\".",
+	   "\n  ",
+	   "ARGV: (@ARGV)",
+	   "\n  ",
+	   "autoabbrev=$autoabbrev,".
+	   "bundling=$bundling,",
+	   "getopt_compat=$getopt_compat,",
+	   "gnu_compat=$gnu_compat,",
+	   "order=$order,",
+	   "\n  ",
+	   "ignorecase=$ignorecase,",
+	   "requested_version=$requested_version,",
+	   "passthrough=$passthrough,",
+	   "genprefix=\"$genprefix\",",
+	   "longprefix=\"$longprefix\".",
+	   "\n");
+    }
+
+    # Check for ref HASH as first argument.
+    # First argument may be an object. It's OK to use this as long
+    # as it is really a hash underneath.
+    $userlinkage = undef;
+    if ( @optionlist && ref($optionlist[0]) and
+	 UNIVERSAL::isa($optionlist[0],'HASH') ) {
+	$userlinkage = shift (@optionlist);
+	print STDERR ("=> user linkage: $userlinkage\n") if $debug;
+    }
+
+    # See if the first element of the optionlist contains option
+    # starter characters.
+    # Be careful not to interpret '<>' as option starters.
+    if ( @optionlist && $optionlist[0] =~ /^\W+$/
+	 && !($optionlist[0] eq '<>'
+	      && @optionlist > 0
+	      && ref($optionlist[1])) ) {
+	$prefix = shift (@optionlist);
+	# Turn into regexp. Needs to be parenthesized!
+	$prefix =~ s/(\W)/\\$1/g;
+	$prefix = "([" . $prefix . "])";
+	print STDERR ("=> prefix=\"$prefix\"\n") if $debug;
+    }
+
+    # Verify correctness of optionlist.
+    %opctl = ();
+    while ( @optionlist ) {
+	my $opt = shift (@optionlist);
+
+	unless ( defined($opt) ) {
+	    $error .= "Undefined argument in option spec\n";
+	    next;
+	}
+
+	# Strip leading prefix so people can specify "--foo=i" if they like.
+	$opt = $+ if $opt =~ /^$prefix+(.*)$/s;
+
+	if ( $opt eq '<>' ) {
+	    if ( (defined $userlinkage)
+		&& !(@optionlist > 0 && ref($optionlist[0]))
+		&& (exists $userlinkage->{$opt})
+		&& ref($userlinkage->{$opt}) ) {
+		unshift (@optionlist, $userlinkage->{$opt});
+	    }
+	    unless ( @optionlist > 0
+		    && ref($optionlist[0]) && ref($optionlist[0]) eq 'CODE' ) {
+		$error .= "Option spec <> requires a reference to a subroutine\n";
+		# Kill the linkage (to avoid another error).
+		shift (@optionlist)
+		  if @optionlist && ref($optionlist[0]);
+		next;
+	    }
+	    $linkage{'<>'} = shift (@optionlist);
+	    next;
+	}
+
+	# Parse option spec.
+	my ($name, $orig) = ParseOptionSpec ($opt, \%opctl);
+	unless ( defined $name ) {
+	    # Failed. $orig contains the error message. Sorry for the abuse.
+	    $error .= $orig;
+	    # Kill the linkage (to avoid another error).
+	    shift (@optionlist)
+	      if @optionlist && ref($optionlist[0]);
+	    next;
+	}
+
+	# If no linkage is supplied in the @optionlist, copy it from
+	# the userlinkage if available.
+	if ( defined $userlinkage ) {
+	    unless ( @optionlist > 0 && ref($optionlist[0]) ) {
+		if ( exists $userlinkage->{$orig} &&
+		     ref($userlinkage->{$orig}) ) {
+		    print STDERR ("=> found userlinkage for \"$orig\": ",
+				  "$userlinkage->{$orig}\n")
+			if $debug;
+		    unshift (@optionlist, $userlinkage->{$orig});
+		}
+		else {
+		    # Do nothing. Being undefined will be handled later.
+		    next;
+		}
+	    }
+	}
+
+	# Copy the linkage. If omitted, link to global variable.
+	if ( @optionlist > 0 && ref($optionlist[0]) ) {
+	    print STDERR ("=> link \"$orig\" to $optionlist[0]\n")
+		if $debug;
+	    my $rl = ref($linkage{$orig} = shift (@optionlist));
+
+	    if ( $rl eq "ARRAY" ) {
+		$opctl{$name}[CTL_DEST] = CTL_DEST_ARRAY;
+	    }
+	    elsif ( $rl eq "HASH" ) {
+		$opctl{$name}[CTL_DEST] = CTL_DEST_HASH;
+	    }
+	    elsif ( $rl eq "SCALAR" ) {
+#		if ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY ) {
+#		    my $t = $linkage{$orig};
+#		    $$t = $linkage{$orig} = [];
+#		}
+#		elsif ( $opctl{$name}[CTL_DEST] == CTL_DEST_HASH ) {
+#		}
+#		else {
+		    # Ok.
+#		}
+	    }
+	    elsif ( $rl eq "CODE" ) {
+		# Ok.
+	    }
+	    else {
+		$error .= "Invalid option linkage for \"$opt\"\n";
+	    }
+	}
+	else {
+	    # Link to global $opt_XXX variable.
+	    # Make sure a valid perl identifier results.
+	    my $ov = $orig;
+	    $ov =~ s/\W/_/g;
+	    if ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY ) {
+		print STDERR ("=> link \"$orig\" to \@$pkg","::opt_$ov\n")
+		    if $debug;
+		eval ("\$linkage{\$orig} = \\\@".$pkg."::opt_$ov;");
+	    }
+	    elsif ( $opctl{$name}[CTL_DEST] == CTL_DEST_HASH ) {
+		print STDERR ("=> link \"$orig\" to \%$pkg","::opt_$ov\n")
+		    if $debug;
+		eval ("\$linkage{\$orig} = \\\%".$pkg."::opt_$ov;");
+	    }
+	    else {
+		print STDERR ("=> link \"$orig\" to \$$pkg","::opt_$ov\n")
+		    if $debug;
+		eval ("\$linkage{\$orig} = \\\$".$pkg."::opt_$ov;");
+	    }
+	}
+    }
+
+    # Bail out if errors found.
+    die ($error) if $error;
+    $error = 0;
+
+    # Supply --version and --help support, if needed and allowed.
+    if ( defined($auto_version) ? $auto_version : ($requested_version >= 2.3203) ) {
+	if ( !defined($opctl{version}) ) {
+	    $opctl{version} = ['','version',0,CTL_DEST_CODE,undef];
+	    $linkage{version} = \&VersionMessage;
+	}
+	$auto_version = 1;
+    }
+    if ( defined($auto_help) ? $auto_help : ($requested_version >= 2.3203) ) {
+	if ( !defined($opctl{help}) && !defined($opctl{'?'}) ) {
+	    $opctl{help} = $opctl{'?'} = ['','help',0,CTL_DEST_CODE,undef];
+	    $linkage{help} = \&HelpMessage;
+	}
+	$auto_help = 1;
+    }
+
+    # Show the options tables if debugging.
+    if ( $debug ) {
+	my ($arrow, $k, $v);
+	$arrow = "=> ";
+	while ( ($k,$v) = each(%opctl) ) {
+	    print STDERR ($arrow, "\$opctl{$k} = $v ", OptCtl($v), "\n");
+	    $arrow = "   ";
+	}
+    }
+
+    # Process argument list
+    my $goon = 1;
+    while ( $goon && @ARGV > 0 ) {
+
+	# Get next argument.
+	$opt = shift (@ARGV);
+	print STDERR ("=> arg \"", $opt, "\"\n") if $debug;
+
+	# Double dash is option list terminator.
+	if ( $opt eq $argend ) {
+	  push (@ret, $argend) if $passthrough;
+	  last;
+	}
+
+	# Look it up.
+	my $tryopt = $opt;
+	my $found;		# success status
+	my $key;		# key (if hash type)
+	my $arg;		# option argument
+	my $ctl;		# the opctl entry
+
+	($found, $opt, $ctl, $arg, $key) =
+	  FindOption ($prefix, $argend, $opt, \%opctl);
+
+	if ( $found ) {
+
+	    # FindOption undefines $opt in case of errors.
+	    next unless defined $opt;
+
+	    my $argcnt = 0;
+	    while ( defined $arg ) {
+
+		# Get the canonical name.
+		print STDERR ("=> cname for \"$opt\" is ") if $debug;
+		$opt = $ctl->[CTL_CNAME];
+		print STDERR ("\"$ctl->[CTL_CNAME]\"\n") if $debug;
+
+		if ( defined $linkage{$opt} ) {
+		    print STDERR ("=> ref(\$L{$opt}) -> ",
+				  ref($linkage{$opt}), "\n") if $debug;
+
+		    if ( ref($linkage{$opt}) eq 'SCALAR' ) {
+			if ( $ctl->[CTL_TYPE] eq '+' ) {
+			    print STDERR ("=> \$\$L{$opt} += \"$arg\"\n")
+			      if $debug;
+			    if ( defined ${$linkage{$opt}} ) {
+			        ${$linkage{$opt}} += $arg;
+			    }
+		            else {
+			        ${$linkage{$opt}} = $arg;
+			    }
+			}
+			elsif ( $ctl->[CTL_DEST] == CTL_DEST_ARRAY ) {
+			    print STDERR ("=> ref(\$L{$opt}) auto-vivified",
+					  " to ARRAY\n")
+			      if $debug;
+			    my $t = $linkage{$opt};
+			    $$t = $linkage{$opt} = [];
+			    print STDERR ("=> push(\@{\$L{$opt}, \"$arg\")\n")
+			      if $debug;
+			    push (@{$linkage{$opt}}, $arg);
+			}
+			elsif ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) {
+			    print STDERR ("=> ref(\$L{$opt}) auto-vivified",
+					  " to HASH\n")
+			      if $debug;
+			    my $t = $linkage{$opt};
+			    $$t = $linkage{$opt} = {};
+			    print STDERR ("=> \$\$L{$opt}->{$key} = \"$arg\"\n")
+			      if $debug;
+			    $linkage{$opt}->{$key} = $arg;
+			}
+			else {
+			    print STDERR ("=> \$\$L{$opt} = \"$arg\"\n")
+			      if $debug;
+			    ${$linkage{$opt}} = $arg;
+		        }
+		    }
+		    elsif ( ref($linkage{$opt}) eq 'ARRAY' ) {
+			print STDERR ("=> push(\@{\$L{$opt}, \"$arg\")\n")
+			    if $debug;
+			push (@{$linkage{$opt}}, $arg);
+		    }
+		    elsif ( ref($linkage{$opt}) eq 'HASH' ) {
+			print STDERR ("=> \$\$L{$opt}->{$key} = \"$arg\"\n")
+			    if $debug;
+			$linkage{$opt}->{$key} = $arg;
+		    }
+		    elsif ( ref($linkage{$opt}) eq 'CODE' ) {
+			print STDERR ("=> &L{$opt}(\"$opt\"",
+				      $ctl->[CTL_DEST] == CTL_DEST_HASH ? ", \"$key\"" : "",
+				      ", \"$arg\")\n")
+			    if $debug;
+			my $eval_error = do {
+			    local $@;
+			    local $SIG{__DIE__}  = '__DEFAULT__';
+			    eval {
+				&{$linkage{$opt}}($opt,
+						  $ctl->[CTL_DEST] == CTL_DEST_HASH ? ($key) : (),
+						  $arg);
+			    };
+			    $@;
+			};
+			print STDERR ("=> die($eval_error)\n")
+			  if $debug && $eval_error ne '';
+			if ( $eval_error =~ /^!/ ) {
+			    if ( $eval_error =~ /^!FINISH\b/ ) {
+				$goon = 0;
+			    }
+			}
+			elsif ( $eval_error ne '' ) {
+			    warn ($eval_error);
+			    $error++;
+			}
+		    }
+		    else {
+			print STDERR ("Invalid REF type \"", ref($linkage{$opt}),
+				      "\" in linkage\n");
+			die("Getopt::Long -- internal error!\n");
+		    }
+		}
+		# No entry in linkage means entry in userlinkage.
+		elsif ( $ctl->[CTL_DEST] == CTL_DEST_ARRAY ) {
+		    if ( defined $userlinkage->{$opt} ) {
+			print STDERR ("=> push(\@{\$L{$opt}}, \"$arg\")\n")
+			    if $debug;
+			push (@{$userlinkage->{$opt}}, $arg);
+		    }
+		    else {
+			print STDERR ("=>\$L{$opt} = [\"$arg\"]\n")
+			    if $debug;
+			$userlinkage->{$opt} = [$arg];
+		    }
+		}
+		elsif ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) {
+		    if ( defined $userlinkage->{$opt} ) {
+			print STDERR ("=> \$L{$opt}->{$key} = \"$arg\"\n")
+			    if $debug;
+			$userlinkage->{$opt}->{$key} = $arg;
+		    }
+		    else {
+			print STDERR ("=>\$L{$opt} = {$key => \"$arg\"}\n")
+			    if $debug;
+			$userlinkage->{$opt} = {$key => $arg};
+		    }
+		}
+		else {
+		    if ( $ctl->[CTL_TYPE] eq '+' ) {
+			print STDERR ("=> \$L{$opt} += \"$arg\"\n")
+			  if $debug;
+			if ( defined $userlinkage->{$opt} ) {
+			    $userlinkage->{$opt} += $arg;
+			}
+			else {
+			    $userlinkage->{$opt} = $arg;
+			}
+		    }
+		    else {
+			print STDERR ("=>\$L{$opt} = \"$arg\"\n") if $debug;
+			$userlinkage->{$opt} = $arg;
+		    }
+		}
+
+		$argcnt++;
+		last if $argcnt >= $ctl->[CTL_AMAX] && $ctl->[CTL_AMAX] != -1;
+		undef($arg);
+
+		# Need more args?
+		if ( $argcnt < $ctl->[CTL_AMIN] ) {
+		    if ( @ARGV ) {
+			if ( ValidValue($ctl, $ARGV[0], 1, $argend, $prefix) ) {
+			    $arg = shift(@ARGV);
+			    ($key,$arg) = $arg =~ /^([^=]+)=(.*)/
+			      if $ctl->[CTL_DEST] == CTL_DEST_HASH;
+			    next;
+			}
+			warn("Value \"$ARGV[0]\" invalid for option $opt\n");
+			$error++;
+		    }
+		    else {
+			warn("Insufficient arguments for option $opt\n");
+			$error++;
+		    }
+		}
+
+		# Any more args?
+		if ( @ARGV && ValidValue($ctl, $ARGV[0], 0, $argend, $prefix) ) {
+		    $arg = shift(@ARGV);
+		    ($key,$arg) = $arg =~ /^([^=]+)=(.*)/
+		      if $ctl->[CTL_DEST] == CTL_DEST_HASH;
+		    next;
+		}
+	    }
+	}
+
+	# Not an option. Save it if we $PERMUTE and don't have a <>.
+	elsif ( $order == $PERMUTE ) {
+	    # Try non-options call-back.
+	    my $cb;
+	    if ( (defined ($cb = $linkage{'<>'})) ) {
+		print STDERR ("=> &L{$tryopt}(\"$tryopt\")\n")
+		  if $debug;
+		my $eval_error = do {
+		    local $@;
+		    local $SIG{__DIE__}  = '__DEFAULT__';
+		    eval { &$cb ($tryopt) };
+		    $@;
+		};
+		print STDERR ("=> die($eval_error)\n")
+		  if $debug && $eval_error ne '';
+		if ( $eval_error =~ /^!/ ) {
+		    if ( $eval_error =~ /^!FINISH\b/ ) {
+			$goon = 0;
+		    }
+		}
+		elsif ( $eval_error ne '' ) {
+		    warn ($eval_error);
+		    $error++;
+		}
+	    }
+	    else {
+		print STDERR ("=> saving \"$tryopt\" ",
+			      "(not an option, may permute)\n") if $debug;
+		push (@ret, $tryopt);
+	    }
+	    next;
+	}
+
+	# ...otherwise, terminate.
+	else {
+	    # Push this one back and exit.
+	    unshift (@ARGV, $tryopt);
+	    return ($error == 0);
+	}
+
+    }
+
+    # Finish.
+    if ( @ret && $order == $PERMUTE ) {
+	#  Push back accumulated arguments
+	print STDERR ("=> restoring \"", join('" "', @ret), "\"\n")
+	    if $debug;
+	unshift (@ARGV, @ret);
+    }
+
+    return ($error == 0);
+}
+
+# A readable representation of what's in an optbl.
+sub OptCtl ($) {
+    my ($v) = @_;
+    my @v = map { defined($_) ? ($_) : ("<undef>") } @$v;
+    "[".
+      join(",",
+	   "\"$v[CTL_TYPE]\"",
+	   "\"$v[CTL_CNAME]\"",
+	   "\"$v[CTL_DEFAULT]\"",
+	   ("\$","\@","\%","\&")[$v[CTL_DEST] || 0],
+	   $v[CTL_AMIN] || '',
+	   $v[CTL_AMAX] || '',
+#	   $v[CTL_RANGE] || '',
+#	   $v[CTL_REPEAT] || '',
+	  ). "]";
+}
+
+# Parse an option specification and fill the tables.
+sub ParseOptionSpec ($$) {
+    my ($opt, $opctl) = @_;
+
+    # Match option spec.
+    if ( $opt !~ m;^
+		   (
+		     # Option name
+		     (?: \w+[-\w]* )
+		     # Alias names, or "?"
+		     (?: \| (?: \? | \w[-\w]* )? )*
+		   )?
+		   (
+		     # Either modifiers ...
+		     [!+]
+		     |
+		     # ... or a value/dest/repeat specification
+		     [=:] [ionfs] [@%]? (?: \{\d*,?\d*\} )?
+		     |
+		     # ... or an optional-with-default spec
+		     : (?: -?\d+ | \+ ) [@%]?
+		   )?
+		   $;x ) {
+	return (undef, "Error in option spec: \"$opt\"\n");
+    }
+
+    my ($names, $spec) = ($1, $2);
+    $spec = '' unless defined $spec;
+
+    # $orig keeps track of the primary name the user specified.
+    # This name will be used for the internal or external linkage.
+    # In other words, if the user specifies "FoO|BaR", it will
+    # match any case combinations of 'foo' and 'bar', but if a global
+    # variable needs to be set, it will be $opt_FoO in the exact case
+    # as specified.
+    my $orig;
+
+    my @names;
+    if ( defined $names ) {
+	@names =  split (/\|/, $names);
+	$orig = $names[0];
+    }
+    else {
+	@names = ('');
+	$orig = '';
+    }
+
+    # Construct the opctl entries.
+    my $entry;
+    if ( $spec eq '' || $spec eq '+' || $spec eq '!' ) {
+	# Fields are hard-wired here.
+	$entry = [$spec,$orig,undef,CTL_DEST_SCALAR,0,0];
+    }
+    elsif ( $spec =~ /^:(-?\d+|\+)([@%])?$/ ) {
+	my $def = $1;
+	my $dest = $2;
+	my $type = $def eq '+' ? 'I' : 'i';
+	$dest ||= '$';
+	$dest = $dest eq '@' ? CTL_DEST_ARRAY
+	  : $dest eq '%' ? CTL_DEST_HASH : CTL_DEST_SCALAR;
+	# Fields are hard-wired here.
+	$entry = [$type,$orig,$def eq '+' ? undef : $def,
+		  $dest,0,1];
+    }
+    else {
+	my ($mand, $type, $dest) =
+	  $spec =~ /^([=:])([ionfs])([@%])?(\{(\d+)?(,)?(\d+)?\})?$/;
+	return (undef, "Cannot repeat while bundling: \"$opt\"\n")
+	  if $bundling && defined($4);
+	my ($mi, $cm, $ma) = ($5, $6, $7);
+	return (undef, "{0} is useless in option spec: \"$opt\"\n")
+	  if defined($mi) && !$mi && !defined($ma) && !defined($cm);
+
+	$type = 'i' if $type eq 'n';
+	$dest ||= '$';
+	$dest = $dest eq '@' ? CTL_DEST_ARRAY
+	  : $dest eq '%' ? CTL_DEST_HASH : CTL_DEST_SCALAR;
+	# Default minargs to 1/0 depending on mand status.
+	$mi = $mand eq '=' ? 1 : 0 unless defined $mi;
+	# Adjust mand status according to minargs.
+	$mand = $mi ? '=' : ':';
+	# Adjust maxargs.
+	$ma = $mi ? $mi : 1 unless defined $ma || defined $cm;
+	return (undef, "Max must be greater than zero in option spec: \"$opt\"\n")
+	  if defined($ma) && !$ma;
+	return (undef, "Max less than min in option spec: \"$opt\"\n")
+	  if defined($ma) && $ma < $mi;
+
+	# Fields are hard-wired here.
+	$entry = [$type,$orig,undef,$dest,$mi,$ma||-1];
+    }
+
+    # Process all names. First is canonical, the rest are aliases.
+    my $dups = '';
+    foreach ( @names ) {
+
+	$_ = lc ($_)
+	  if $ignorecase > (($bundling && length($_) == 1) ? 1 : 0);
+
+	if ( exists $opctl->{$_} ) {
+	    $dups .= "Duplicate specification \"$opt\" for option \"$_\"\n";
+	}
+
+	if ( $spec eq '!' ) {
+	    $opctl->{"no$_"} = $entry;
+	    $opctl->{"no-$_"} = $entry;
+	    $opctl->{$_} = [@$entry];
+	    $opctl->{$_}->[CTL_TYPE] = '';
+	}
+	else {
+	    $opctl->{$_} = $entry;
+	}
+    }
+
+    if ( $dups && $^W ) {
+	foreach ( split(/\n+/, $dups) ) {
+	    warn($_."\n");
+	}
+    }
+    ($names[0], $orig);
+}
+
+# Option lookup.
+sub FindOption ($$$$) {
+
+    # returns (1, $opt, $ctl, $arg, $key) if okay,
+    # returns (1, undef) if option in error,
+    # returns (0) otherwise.
+
+    my ($prefix, $argend, $opt, $opctl) = @_;
+
+    print STDERR ("=> find \"$opt\"\n") if $debug;
+
+    return (0) unless $opt =~ /^$prefix(.*)$/s;
+    return (0) if $opt eq "-" && !defined $opctl->{''};
+
+    $opt = $+;
+    my $starter = $1;
+
+    print STDERR ("=> split \"$starter\"+\"$opt\"\n") if $debug;
+
+    my $optarg;			# value supplied with --opt=value
+    my $rest;			# remainder from unbundling
+
+    # If it is a long option, it may include the value.
+    # With getopt_compat, only if not bundling.
+    if ( ($starter=~/^$longprefix$/
+          || ($getopt_compat && ($bundling == 0 || $bundling == 2)))
+	  && $opt =~ /^([^=]+)=(.*)$/s ) {
+	$opt = $1;
+	$optarg = $2;
+	print STDERR ("=> option \"", $opt,
+		      "\", optarg = \"$optarg\"\n") if $debug;
+    }
+
+    #### Look it up ###
+
+    my $tryopt = $opt;		# option to try
+
+    if ( $bundling && $starter eq '-' ) {
+
+	# To try overrides, obey case ignore.
+	$tryopt = $ignorecase ? lc($opt) : $opt;
+
+	# If bundling == 2, long options can override bundles.
+	if ( $bundling == 2 && length($tryopt) > 1
+	     && defined ($opctl->{$tryopt}) ) {
+	    print STDERR ("=> $starter$tryopt overrides unbundling\n")
+	      if $debug;
+	}
+	else {
+	    $tryopt = $opt;
+	    # Unbundle single letter option.
+	    $rest = length ($tryopt) > 0 ? substr ($tryopt, 1) : '';
+	    $tryopt = substr ($tryopt, 0, 1);
+	    $tryopt = lc ($tryopt) if $ignorecase > 1;
+	    print STDERR ("=> $starter$tryopt unbundled from ",
+			  "$starter$tryopt$rest\n") if $debug;
+	    $rest = undef unless $rest ne '';
+	}
+    }
+
+    # Try auto-abbreviation.
+    elsif ( $autoabbrev ) {
+	# Sort the possible long option names.
+	my @names = sort(keys (%$opctl));
+	# Downcase if allowed.
+	$opt = lc ($opt) if $ignorecase;
+	$tryopt = $opt;
+	# Turn option name into pattern.
+	my $pat = quotemeta ($opt);
+	# Look up in option names.
+	my @hits = grep (/^$pat/, @names);
+	print STDERR ("=> ", scalar(@hits), " hits (@hits) with \"$pat\" ",
+		      "out of ", scalar(@names), "\n") if $debug;
+
+	# Check for ambiguous results.
+	unless ( (@hits <= 1) || (grep ($_ eq $opt, @hits) == 1) ) {
+	    # See if all matches are for the same option.
+	    my %hit;
+	    foreach ( @hits ) {
+		my $hit = $_;
+		$hit = $opctl->{$hit}->[CTL_CNAME]
+		  if defined $opctl->{$hit}->[CTL_CNAME];
+		$hit{$hit} = 1;
+	    }
+	    # Remove auto-supplied options (version, help).
+	    if ( keys(%hit) == 2 ) {
+		if ( $auto_version && exists($hit{version}) ) {
+		    delete $hit{version};
+		}
+		elsif ( $auto_help && exists($hit{help}) ) {
+		    delete $hit{help};
+		}
+	    }
+	    # Now see if it really is ambiguous.
+	    unless ( keys(%hit) == 1 ) {
+		return (0) if $passthrough;
+		warn ("Option ", $opt, " is ambiguous (",
+		      join(", ", @hits), ")\n");
+		$error++;
+		return (1, undef);
+	    }
+	    @hits = keys(%hit);
+	}
+
+	# Complete the option name, if appropriate.
+	if ( @hits == 1 && $hits[0] ne $opt ) {
+	    $tryopt = $hits[0];
+	    $tryopt = lc ($tryopt) if $ignorecase;
+	    print STDERR ("=> option \"$opt\" -> \"$tryopt\"\n")
+		if $debug;
+	}
+    }
+
+    # Map to all lowercase if ignoring case.
+    elsif ( $ignorecase ) {
+	$tryopt = lc ($opt);
+    }
+
+    # Check validity by fetching the info.
+    my $ctl = $opctl->{$tryopt};
+    unless  ( defined $ctl ) {
+	return (0) if $passthrough;
+	# Pretend one char when bundling.
+	if ( $bundling == 1 && length($starter) == 1 ) {
+	    $opt = substr($opt,0,1);
+            unshift (@ARGV, $starter.$rest) if defined $rest;
+	}
+	warn ("Unknown option: ", $opt, "\n");
+	$error++;
+	return (1, undef);
+    }
+    # Apparently valid.
+    $opt = $tryopt;
+    print STDERR ("=> found ", OptCtl($ctl),
+		  " for \"", $opt, "\"\n") if $debug;
+
+    #### Determine argument status ####
+
+    # If it is an option w/o argument, we're almost finished with it.
+    my $type = $ctl->[CTL_TYPE];
+    my $arg;
+
+    if ( $type eq '' || $type eq '!' || $type eq '+' ) {
+	if ( defined $optarg ) {
+	    return (0) if $passthrough;
+	    warn ("Option ", $opt, " does not take an argument\n");
+	    $error++;
+	    undef $opt;
+	}
+	elsif ( $type eq '' || $type eq '+' ) {
+	    # Supply explicit value.
+	    $arg = 1;
+	}
+	else {
+	    $opt =~ s/^no-?//i;	# strip NO prefix
+	    $arg = 0;		# supply explicit value
+	}
+	unshift (@ARGV, $starter.$rest) if defined $rest;
+	return (1, $opt, $ctl, $arg);
+    }
+
+    # Get mandatory status and type info.
+    my $mand = $ctl->[CTL_AMIN];
+
+    # Check if there is an option argument available.
+    if ( $gnu_compat && defined $optarg && $optarg eq '' ) {
+	return (1, $opt, $ctl, $type eq 's' ? '' : 0) unless $mand;
+	$optarg = 0 unless $type eq 's';
+    }
+
+    # Check if there is an option argument available.
+    if ( defined $optarg
+	 ? ($optarg eq '')
+	 : !(defined $rest || @ARGV > 0) ) {
+	# Complain if this option needs an argument.
+	if ( $mand ) {
+	    return (0) if $passthrough;
+	    warn ("Option ", $opt, " requires an argument\n");
+	    $error++;
+	    return (1, undef);
+	}
+	if ( $type eq 'I' ) {
+	    # Fake incremental type.
+	    my @c = @$ctl;
+	    $c[CTL_TYPE] = '+';
+	    return (1, $opt, \@c, 1);
+	}
+	return (1, $opt, $ctl,
+		defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] :
+		$type eq 's' ? '' : 0);
+    }
+
+    # Get (possibly optional) argument.
+    $arg = (defined $rest ? $rest
+	    : (defined $optarg ? $optarg : shift (@ARGV)));
+
+    # Get key if this is a "name=value" pair for a hash option.
+    my $key;
+    if ($ctl->[CTL_DEST] == CTL_DEST_HASH && defined $arg) {
+	($key, $arg) = ($arg =~ /^([^=]*)=(.*)$/s) ? ($1, $2)
+	  : ($arg, defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] :
+	     ($mand ? undef : ($type eq 's' ? "" : 1)));
+	if (! defined $arg) {
+	    warn ("Option $opt, key \"$key\", requires a value\n");
+	    $error++;
+	    # Push back.
+	    unshift (@ARGV, $starter.$rest) if defined $rest;
+	    return (1, undef);
+	}
+    }
+
+    #### Check if the argument is valid for this option ####
+
+    my $key_valid = $ctl->[CTL_DEST] == CTL_DEST_HASH ? "[^=]+=" : "";
+
+    if ( $type eq 's' ) {	# string
+	# A mandatory string takes anything.
+	return (1, $opt, $ctl, $arg, $key) if $mand;
+
+	# An optional string takes almost anything.
+	return (1, $opt, $ctl, $arg, $key)
+	  if defined $optarg || defined $rest;
+	return (1, $opt, $ctl, $arg, $key) if $arg eq "-"; # ??
+
+	# Check for option or option list terminator.
+	if ($arg eq $argend ||
+	    $arg =~ /^$prefix.+/) {
+	    # Push back.
+	    unshift (@ARGV, $arg);
+	    # Supply empty value.
+	    $arg = '';
+	}
+    }
+
+    elsif ( $type eq 'i'	# numeric/integer
+            || $type eq 'I'	# numeric/integer w/ incr default
+	    || $type eq 'o' ) { # dec/oct/hex/bin value
+
+	my $o_valid =
+	  $type eq 'o' ? "[-+]?[1-9][0-9]*|0x[0-9a-f]+|0b[01]+|0[0-7]*"
+	    : "[-+]?[0-9]+";
+
+	if ( $bundling && defined $rest
+	     && $rest =~ /^($key_valid)($o_valid)(.*)$/si ) {
+	    ($key, $arg, $rest) = ($1, $2, $+);
+	    chop($key) if $key;
+	    $arg = ($type eq 'o' && $arg =~ /^0/) ? oct($arg) : 0+$arg;
+	    unshift (@ARGV, $starter.$rest) if defined $rest && $rest ne '';
+	}
+	elsif ( $arg =~ /^($o_valid)$/si ) {
+	    $arg = ($type eq 'o' && $arg =~ /^0/) ? oct($arg) : 0+$arg;
+	}
+	else {
+	    if ( defined $optarg || $mand ) {
+		if ( $passthrough ) {
+		    unshift (@ARGV, defined $rest ? $starter.$rest : $arg)
+		      unless defined $optarg;
+		    return (0);
+		}
+		warn ("Value \"", $arg, "\" invalid for option ",
+		      $opt, " (",
+		      $type eq 'o' ? "extended " : '',
+		      "number expected)\n");
+		$error++;
+		# Push back.
+		unshift (@ARGV, $starter.$rest) if defined $rest;
+		return (1, undef);
+	    }
+	    else {
+		# Push back.
+		unshift (@ARGV, defined $rest ? $starter.$rest : $arg);
+		if ( $type eq 'I' ) {
+		    # Fake incremental type.
+		    my @c = @$ctl;
+		    $c[CTL_TYPE] = '+';
+		    return (1, $opt, \@c, 1);
+		}
+		# Supply default value.
+		$arg = defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : 0;
+	    }
+	}
+    }
+
+    elsif ( $type eq 'f' ) { # real number, int is also ok
+	# We require at least one digit before a point or 'e',
+	# and at least one digit following the point and 'e'.
+	# [-]NN[.NN][eNN]
+	if ( $bundling && defined $rest &&
+	     $rest =~ /^($key_valid)([-+]?[0-9]+(\.[0-9]+)?([eE][-+]?[0-9]+)?)(.*)$/s ) {
+	    ($key, $arg, $rest) = ($1, $2, $+);
+	    chop($key) if $key;
+	    unshift (@ARGV, $starter.$rest) if defined $rest && $rest ne '';
+	}
+	elsif ( $arg !~ /^[-+]?[0-9.]+(\.[0-9]+)?([eE][-+]?[0-9]+)?$/ ) {
+	    if ( defined $optarg || $mand ) {
+		if ( $passthrough ) {
+		    unshift (@ARGV, defined $rest ? $starter.$rest : $arg)
+		      unless defined $optarg;
+		    return (0);
+		}
+		warn ("Value \"", $arg, "\" invalid for option ",
+		      $opt, " (real number expected)\n");
+		$error++;
+		# Push back.
+		unshift (@ARGV, $starter.$rest) if defined $rest;
+		return (1, undef);
+	    }
+	    else {
+		# Push back.
+		unshift (@ARGV, defined $rest ? $starter.$rest : $arg);
+		# Supply default value.
+		$arg = 0.0;
+	    }
+	}
+    }
+    else {
+	die("Getopt::Long internal error (Can't happen)\n");
+    }
+    return (1, $opt, $ctl, $arg, $key);
+}
+
+sub ValidValue ($$$$$) {
+    my ($ctl, $arg, $mand, $argend, $prefix) = @_;
+
+    if ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) {
+	return 0 unless $arg =~ /[^=]+=(.*)/;
+	$arg = $1;
+    }
+
+    my $type = $ctl->[CTL_TYPE];
+
+    if ( $type eq 's' ) {	# string
+	# A mandatory string takes anything.
+	return (1) if $mand;
+
+	return (1) if $arg eq "-";
+
+	# Check for option or option list terminator.
+	return 0 if $arg eq $argend || $arg =~ /^$prefix.+/;
+	return 1;
+    }
+
+    elsif ( $type eq 'i'	# numeric/integer
+            || $type eq 'I'	# numeric/integer w/ incr default
+	    || $type eq 'o' ) { # dec/oct/hex/bin value
+
+	my $o_valid =
+	  $type eq 'o' ? "[-+]?[1-9][0-9]*|0x[0-9a-f]+|0b[01]+|0[0-7]*"
+	    : "[-+]?[0-9]+";
+
+	return $arg =~ /^$o_valid$/si;
+    }
+
+    elsif ( $type eq 'f' ) { # real number, int is also ok
+	# We require at least one digit before a point or 'e',
+	# and at least one digit following the point and 'e'.
+	# [-]NN[.NN][eNN]
+	return $arg =~ /^[-+]?[0-9.]+(\.[0-9]+)?([eE][-+]?[0-9]+)?$/;
+    }
+    die("ValidValue: Cannot happen\n");
+}
+
+# Getopt::Long Configuration.
+sub Configure (@) {
+    my (@options) = @_;
+
+    my $prevconfig =
+      [ $error, $debug, $major_version, $minor_version,
+	$autoabbrev, $getopt_compat, $ignorecase, $bundling, $order,
+	$gnu_compat, $passthrough, $genprefix, $auto_version, $auto_help,
+	$longprefix ];
+
+    if ( ref($options[0]) eq 'ARRAY' ) {
+	( $error, $debug, $major_version, $minor_version,
+	  $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order,
+	  $gnu_compat, $passthrough, $genprefix, $auto_version, $auto_help,
+	  $longprefix ) = @{shift(@options)};
+    }
+
+    my $opt;
+    foreach $opt ( @options ) {
+	my $try = lc ($opt);
+	my $action = 1;
+	if ( $try =~ /^no_?(.*)$/s ) {
+	    $action = 0;
+	    $try = $+;
+	}
+	if ( ($try eq 'default' or $try eq 'defaults') && $action ) {
+	    ConfigDefaults ();
+	}
+	elsif ( ($try eq 'posix_default' or $try eq 'posix_defaults') ) {
+	    local $ENV{POSIXLY_CORRECT};
+	    $ENV{POSIXLY_CORRECT} = 1 if $action;
+	    ConfigDefaults ();
+	}
+	elsif ( $try eq 'auto_abbrev' or $try eq 'autoabbrev' ) {
+	    $autoabbrev = $action;
+	}
+	elsif ( $try eq 'getopt_compat' ) {
+	    $getopt_compat = $action;
+	}
+	elsif ( $try eq 'gnu_getopt' ) {
+	    if ( $action ) {
+		$gnu_compat = 1;
+		$bundling = 1;
+		$getopt_compat = 0;
+		$order = $PERMUTE;
+	    }
+	}
+	elsif ( $try eq 'gnu_compat' ) {
+	    $gnu_compat = $action;
+	}
+	elsif ( $try =~ /^(auto_?)?version$/ ) {
+	    $auto_version = $action;
+	}
+	elsif ( $try =~ /^(auto_?)?help$/ ) {
+	    $auto_help = $action;
+	}
+	elsif ( $try eq 'ignorecase' or $try eq 'ignore_case' ) {
+	    $ignorecase = $action;
+	}
+	elsif ( $try eq 'ignore_case_always' ) {
+	    $ignorecase = $action ? 2 : 0;
+	}
+	elsif ( $try eq 'bundling' ) {
+	    $bundling = $action;
+	}
+	elsif ( $try eq 'bundling_override' ) {
+	    $bundling = $action ? 2 : 0;
+	}
+	elsif ( $try eq 'require_order' ) {
+	    $order = $action ? $REQUIRE_ORDER : $PERMUTE;
+	}
+	elsif ( $try eq 'permute' ) {
+	    $order = $action ? $PERMUTE : $REQUIRE_ORDER;
+	}
+	elsif ( $try eq 'pass_through' or $try eq 'passthrough' ) {
+	    $passthrough = $action;
+	}
+	elsif ( $try =~ /^prefix=(.+)$/ && $action ) {
+	    $genprefix = $1;
+	    # Turn into regexp. Needs to be parenthesized!
+	    $genprefix = "(" . quotemeta($genprefix) . ")";
+	    eval { '' =~ /$genprefix/; };
+	    die("Getopt::Long: invalid pattern \"$genprefix\"") if $@;
+	}
+	elsif ( $try =~ /^prefix_pattern=(.+)$/ && $action ) {
+	    $genprefix = $1;
+	    # Parenthesize if needed.
+	    $genprefix = "(" . $genprefix . ")"
+	      unless $genprefix =~ /^\(.*\)$/;
+	    eval { '' =~ m"$genprefix"; };
+	    die("Getopt::Long: invalid pattern \"$genprefix\"") if $@;
+	}
+	elsif ( $try =~ /^long_prefix_pattern=(.+)$/ && $action ) {
+	    $longprefix = $1;
+	    # Parenthesize if needed.
+	    $longprefix = "(" . $longprefix . ")"
+	      unless $longprefix =~ /^\(.*\)$/;
+	    eval { '' =~ m"$longprefix"; };
+	    die("Getopt::Long: invalid long prefix pattern \"$longprefix\"") if $@;
+	}
+	elsif ( $try eq 'debug' ) {
+	    $debug = $action;
+	}
+	else {
+	    die("Getopt::Long: unknown config parameter \"$opt\"")
+	}
+    }
+    $prevconfig;
+}
+
+# Deprecated name.
+sub config (@) {
+    Configure (@_);
+}
+
+# Issue a standard message for --version.
+#
+# The arguments are mostly the same as for Pod::Usage::pod2usage:
+#
+#  - a number (exit value)
+#  - a string (lead in message)
+#  - a hash with options. See Pod::Usage for details.
+#
+sub VersionMessage(@) {
+    # Massage args.
+    my $pa = setup_pa_args("version", @_);
+
+    my $v = $main::VERSION;
+    my $fh = $pa->{-output} ||
+      ($pa->{-exitval} eq "NOEXIT" || $pa->{-exitval} < 2) ? \*STDOUT : \*STDERR;
+
+    print $fh (defined($pa->{-message}) ? $pa->{-message} : (),
+	       $0, defined $v ? " version $v" : (),
+	       "\n",
+	       "(", __PACKAGE__, "::", "GetOptions",
+	       " version ",
+	       defined($Getopt::Long::VERSION_STRING)
+	         ? $Getopt::Long::VERSION_STRING : $VERSION, ";",
+	       " Perl version ",
+	       $] >= 5.006 ? sprintf("%vd", $^V) : $],
+	       ")\n");
+    exit($pa->{-exitval}) unless $pa->{-exitval} eq "NOEXIT";
+}
+
+# Issue a standard message for --help.
+#
+# The arguments are the same as for Pod::Usage::pod2usage:
+#
+#  - a number (exit value)
+#  - a string (lead in message)
+#  - a hash with options. See Pod::Usage for details.
+#
+sub HelpMessage(@) {
+    eval {
+	require Pod::Usage;
+	import Pod::Usage;
+	1;
+    } || die("Cannot provide help: cannot load Pod::Usage\n");
+
+    # Note that pod2usage will issue a warning if -exitval => NOEXIT.
+    pod2usage(setup_pa_args("help", @_));
+
+}
+
+# Helper routine to set up a normalized hash ref to be used as
+# argument to pod2usage.
+sub setup_pa_args($@) {
+    my $tag = shift;		# who's calling
+
+    # If called by direct binding to an option, it will get the option
+    # name and value as arguments. Remove these, if so.
+    @_ = () if @_ == 2 && $_[0] eq $tag;
+
+    my $pa;
+    if ( @_ > 1 ) {
+	$pa = { @_ };
+    }
+    else {
+	$pa = shift || {};
+    }
+
+    # At this point, $pa can be a number (exit value), string
+    # (message) or hash with options.
+
+    if ( UNIVERSAL::isa($pa, 'HASH') ) {
+	# Get rid of -msg vs. -message ambiguity.
+	$pa->{-message} = $pa->{-msg};
+	delete($pa->{-msg});
+    }
+    elsif ( $pa =~ /^-?\d+$/ ) {
+	$pa = { -exitval => $pa };
+    }
+    else {
+	$pa = { -message => $pa };
+    }
+
+    # These are _our_ defaults.
+    $pa->{-verbose} = 0 unless exists($pa->{-verbose});
+    $pa->{-exitval} = 0 unless exists($pa->{-exitval});
+    $pa;
+}
+
+# Sneak way to know what version the user requested.
+sub VERSION {
+    $requested_version = $_[1];
+    shift->SUPER::VERSION(@_);
+}
+
+1;
+
+################ Documentation ################
+
+=head1 NAME
+
+Getopt::Long - Extended processing of command line options
+
+=head1 SYNOPSIS
+
+  use Getopt::Long;
+  my $data   = "file.dat";
+  my $length = 24;
+  my $verbose;
+  $result = GetOptions ("length=i" => \$length,    # numeric
+                        "file=s"   => \$data,      # string
+			"verbose"  => \$verbose);  # flag
+
+=head1 DESCRIPTION
+
+The Getopt::Long module implements an extended getopt function called
+GetOptions(). This function adheres to the POSIX syntax for command
+line options, with GNU extensions. In general, this means that options
+have long names instead of single letters, and are introduced with a
+double dash "--". Support for bundling of command line options, as was
+the case with the more traditional single-letter approach, is provided
+but not enabled by default.
+
+=head1 Command Line Options, an Introduction
+
+Command line operated programs traditionally take their arguments from
+the command line, for example filenames or other information that the
+program needs to know. Besides arguments, these programs often take
+command line I<options> as well. Options are not necessary for the
+program to work, hence the name 'option', but are used to modify its
+default behaviour. For example, a program could do its job quietly,
+but with a suitable option it could provide verbose information about
+what it did.
+
+Command line options come in several flavours. Historically, they are
+preceded by a single dash C<->, and consist of a single letter.
+
+    -l -a -c
+
+Usually, these single-character options can be bundled:
+
+    -lac
+
+Options can have values, the value is placed after the option
+character. Sometimes with whitespace in between, sometimes not:
+
+    -s 24 -s24
+
+Due to the very cryptic nature of these options, another style was
+developed that used long names. So instead of a cryptic C<-l> one
+could use the more descriptive C<--long>. To distinguish between a
+bundle of single-character options and a long one, two dashes are used
+to precede the option name. Early implementations of long options used
+a plus C<+> instead. Also, option values could be specified either
+like
+
+    --size=24
+
+or
+
+    --size 24
+
+The C<+> form is now obsolete and strongly deprecated.
+
+=head1 Getting Started with Getopt::Long
+
+Getopt::Long is the Perl5 successor of C<newgetopt.pl>. This was the
+first Perl module that provided support for handling the new style of
+command line options, hence the name Getopt::Long. This module also
+supports single-character options and bundling. Single character
+options may be any alphabetic character, a question mark, and a dash.
+Long options may consist of a series of letters, digits, and dashes.
+Although this is currently not enforced by Getopt::Long, multiple
+consecutive dashes are not allowed, and the option name must not end
+with a dash.
+
+To use Getopt::Long from a Perl program, you must include the
+following line in your Perl program:
+
+    use Getopt::Long;
+
+This will load the core of the Getopt::Long module and prepare your
+program for using it. Most of the actual Getopt::Long code is not
+loaded until you really call one of its functions.
+
+In the default configuration, options names may be abbreviated to
+uniqueness, case does not matter, and a single dash is sufficient,
+even for long option names. Also, options may be placed between
+non-option arguments. See L<Configuring Getopt::Long> for more
+details on how to configure Getopt::Long.
+
+=head2 Simple options
+
+The most simple options are the ones that take no values. Their mere
+presence on the command line enables the option. Popular examples are:
+
+    --all --verbose --quiet --debug
+
+Handling simple options is straightforward:
+
+    my $verbose = '';	# option variable with default value (false)
+    my $all = '';	# option variable with default value (false)
+    GetOptions ('verbose' => \$verbose, 'all' => \$all);
+
+The call to GetOptions() parses the command line arguments that are
+present in C<@ARGV> and sets the option variable to the value C<1> if
+the option did occur on the command line. Otherwise, the option
+variable is not touched. Setting the option value to true is often
+called I<enabling> the option.
+
+The option name as specified to the GetOptions() function is called
+the option I<specification>. Later we'll see that this specification
+can contain more than just the option name. The reference to the
+variable is called the option I<destination>.
+
+GetOptions() will return a true value if the command line could be
+processed successfully. Otherwise, it will write error messages to
+STDERR, and return a false result.
+
+=head2 A little bit less simple options
+
+Getopt::Long supports two useful variants of simple options:
+I<negatable> options and I<incremental> options.
+
+A negatable option is specified with an exclamation mark C<!> after the
+option name:
+
+    my $verbose = '';	# option variable with default value (false)
+    GetOptions ('verbose!' => \$verbose);
+
+Now, using C<--verbose> on the command line will enable C<$verbose>,
+as expected. But it is also allowed to use C<--noverbose>, which will
+disable C<$verbose> by setting its value to C<0>. Using a suitable
+default value, the program can find out whether C<$verbose> is false
+by default, or disabled by using C<--noverbose>.
+
+An incremental option is specified with a plus C<+> after the
+option name:
+
+    my $verbose = '';	# option variable with default value (false)
+    GetOptions ('verbose+' => \$verbose);
+
+Using C<--verbose> on the command line will increment the value of
+C<$verbose>. This way the program can keep track of how many times the
+option occurred on the command line. For example, each occurrence of
+C<--verbose> could increase the verbosity level of the program.
+
+=head2 Mixing command line option with other arguments
+
+Usually programs take command line options as well as other arguments,
+for example, file names. It is good practice to always specify the
+options first, and the other arguments last. Getopt::Long will,
+however, allow the options and arguments to be mixed and 'filter out'
+all the options before passing the rest of the arguments to the
+program. To stop Getopt::Long from processing further arguments,
+insert a double dash C<--> on the command line:
+
+    --size 24 -- --all
+
+In this example, C<--all> will I<not> be treated as an option, but
+passed to the program unharmed, in C<@ARGV>.
+
+=head2 Options with values
+
+For options that take values it must be specified whether the option
+value is required or not, and what kind of value the option expects.
+
+Three kinds of values are supported: integer numbers, floating point
+numbers, and strings.
+
+If the option value is required, Getopt::Long will take the
+command line argument that follows the option and assign this to the
+option variable. If, however, the option value is specified as
+optional, this will only be done if that value does not look like a
+valid command line option itself.
+
+    my $tag = '';	# option variable with default value
+    GetOptions ('tag=s' => \$tag);
+
+In the option specification, the option name is followed by an equals
+sign C<=> and the letter C<s>. The equals sign indicates that this
+option requires a value. The letter C<s> indicates that this value is
+an arbitrary string. Other possible value types are C<i> for integer
+values, and C<f> for floating point values. Using a colon C<:> instead
+of the equals sign indicates that the option value is optional. In
+this case, if no suitable value is supplied, string valued options get
+an empty string C<''> assigned, while numeric options are set to C<0>.
+
+=head2 Options with multiple values
+
+Options sometimes take several values. For example, a program could
+use multiple directories to search for library files:
+
+    --library lib/stdlib --library lib/extlib
+
+To accomplish this behaviour, simply specify an array reference as the
+destination for the option:
+
+    GetOptions ("library=s" => \@libfiles);
+
+Alternatively, you can specify that the option can have multiple
+values by adding a "@", and pass a scalar reference as the
+destination:
+
+    GetOptions ("library=s@" => \$libfiles);
+
+Used with the example above, C<@libfiles> (or C<@$libfiles>) would
+contain two strings upon completion: C<"lib/srdlib"> and
+C<"lib/extlib">, in that order. It is also possible to specify that
+only integer or floating point numbers are acceptable values.
+
+Often it is useful to allow comma-separated lists of values as well as
+multiple occurrences of the options. This is easy using Perl's split()
+and join() operators:
+
+    GetOptions ("library=s" => \@libfiles);
+    @libfiles = split(/,/,join(',',@libfiles));
+
+Of course, it is important to choose the right separator string for
+each purpose.
+
+Warning: What follows is an experimental feature.
+
+Options can take multiple values at once, for example
+
+    --coordinates 52.2 16.4 --rgbcolor 255 255 149
+
+This can be accomplished by adding a repeat specifier to the option
+specification. Repeat specifiers are very similar to the C<{...}>
+repeat specifiers that can be used with regular expression patterns.
+For example, the above command line would be handled as follows:
+
+    GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color);
+
+The destination for the option must be an array or array reference.
+
+It is also possible to specify the minimal and maximal number of
+arguments an option takes. C<foo=s{2,4}> indicates an option that
+takes at least two and at most 4 arguments. C<foo=s{,}> indicates one
+or more values; C<foo:s{,}> indicates zero or more option values.
+
+=head2 Options with hash values
+
+If the option destination is a reference to a hash, the option will
+take, as value, strings of the form I<key>C<=>I<value>. The value will
+be stored with the specified key in the hash.
+
+    GetOptions ("define=s" => \%defines);
+
+Alternatively you can use:
+
+    GetOptions ("define=s%" => \$defines);
+
+When used with command line options:
+
+    --define os=linux --define vendor=redhat
+
+the hash C<%defines> (or C<%$defines>) will contain two keys, C<"os">
+with value C<"linux> and C<"vendor"> with value C<"redhat">. It is
+also possible to specify that only integer or floating point numbers
+are acceptable values. The keys are always taken to be strings.
+
+=head2 User-defined subroutines to handle options
+
+Ultimate control over what should be done when (actually: each time)
+an option is encountered on the command line can be achieved by
+designating a reference to a subroutine (or an anonymous subroutine)
+as the option destination. When GetOptions() encounters the option, it
+will call the subroutine with two or three arguments. The first
+argument is the name of the option. For a scalar or array destination,
+the second argument is the value to be stored. For a hash destination,
+the second arguments is the key to the hash, and the third argument
+the value to be stored. It is up to the subroutine to store the value,
+or do whatever it thinks is appropriate.
+
+A trivial application of this mechanism is to implement options that
+are related to each other. For example:
+
+    my $verbose = '';	# option variable with default value (false)
+    GetOptions ('verbose' => \$verbose,
+	        'quiet'   => sub { $verbose = 0 });
+
+Here C<--verbose> and C<--quiet> control the same variable
+C<$verbose>, but with opposite values.
+
+If the subroutine needs to signal an error, it should call die() with
+the desired error message as its argument. GetOptions() will catch the
+die(), issue the error message, and record that an error result must
+be returned upon completion.
+
+If the text of the error message starts with an exclamation mark C<!>
+it is interpreted specially by GetOptions(). There is currently one
+special command implemented: C<die("!FINISH")> will cause GetOptions()
+to stop processing options, as if it encountered a double dash C<-->.
+
+=head2 Options with multiple names
+
+Often it is user friendly to supply alternate mnemonic names for
+options. For example C<--height> could be an alternate name for
+C<--length>. Alternate names can be included in the option
+specification, separated by vertical bar C<|> characters. To implement
+the above example:
+
+    GetOptions ('length|height=f' => \$length);
+
+The first name is called the I<primary> name, the other names are
+called I<aliases>. When using a hash to store options, the key will
+always be the primary name.
+
+Multiple alternate names are possible.
+
+=head2 Case and abbreviations
+
+Without additional configuration, GetOptions() will ignore the case of
+option names, and allow the options to be abbreviated to uniqueness.
+
+    GetOptions ('length|height=f' => \$length, "head" => \$head);
+
+This call will allow C<--l> and C<--L> for the length option, but
+requires a least C<--hea> and C<--hei> for the head and height options.
+
+=head2 Summary of Option Specifications
+
+Each option specifier consists of two parts: the name specification
+and the argument specification.
+
+The name specification contains the name of the option, optionally
+followed by a list of alternative names separated by vertical bar
+characters.
+
+    length	      option name is "length"
+    length|size|l     name is "length", aliases are "size" and "l"
+
+The argument specification is optional. If omitted, the option is
+considered boolean, a value of 1 will be assigned when the option is
+used on the command line.
+
+The argument specification can be
+
+=over 4
+
+=item !
+
+The option does not take an argument and may be negated by prefixing
+it with "no" or "no-". E.g. C<"foo!"> will allow C<--foo> (a value of
+1 will be assigned) as well as C<--nofoo> and C<--no-foo> (a value of
+0 will be assigned). If the option has aliases, this applies to the
+aliases as well.
+
+Using negation on a single letter option when bundling is in effect is
+pointless and will result in a warning.
+
+=item +
+
+The option does not take an argument and will be incremented by 1
+every time it appears on the command line. E.g. C<"more+">, when used
+with C<--more --more --more>, will increment the value three times,
+resulting in a value of 3 (provided it was 0 or undefined at first).
+
+The C<+> specifier is ignored if the option destination is not a scalar.
+
+=item = I<type> [ I<desttype> ] [ I<repeat> ]
+
+The option requires an argument of the given type. Supported types
+are:
+
+=over 4
+
+=item s
+
+String. An arbitrary sequence of characters. It is valid for the
+argument to start with C<-> or C<-->.
+
+=item i
+
+Integer. An optional leading plus or minus sign, followed by a
+sequence of digits.
+
+=item o
+
+Extended integer, Perl style. This can be either an optional leading
+plus or minus sign, followed by a sequence of digits, or an octal
+string (a zero, optionally followed by '0', '1', .. '7'), or a
+hexadecimal string (C<0x> followed by '0' .. '9', 'a' .. 'f', case
+insensitive), or a binary string (C<0b> followed by a series of '0'
+and '1').
+
+=item f
+
+Real number. For example C<3.14>, C<-6.23E24> and so on.
+
+=back
+
+The I<desttype> can be C<@> or C<%> to specify that the option is
+list or a hash valued. This is only needed when the destination for
+the option value is not otherwise specified. It should be omitted when
+not needed.
+
+The I<repeat> specifies the number of values this option takes per
+occurrence on the command line. It has the format C<{> [ I<min> ] [ C<,> [ I<max> ] ] C<}>.
+
+I<min> denotes the minimal number of arguments. It defaults to 1 for
+options with C<=> and to 0 for options with C<:>, see below. Note that
+I<min> overrules the C<=> / C<:> semantics.
+
+I<max> denotes the maximum number of arguments. It must be at least
+I<min>. If I<max> is omitted, I<but the comma is not>, there is no
+upper bound to the number of argument values taken.
+
+=item : I<type> [ I<desttype> ]
+
+Like C<=>, but designates the argument as optional.
+If omitted, an empty string will be assigned to string values options,
+and the value zero to numeric options.
+
+Note that if a string argument starts with C<-> or C<-->, it will be
+considered an option on itself.
+
+=item : I<number> [ I<desttype> ]
+
+Like C<:i>, but if the value is omitted, the I<number> will be assigned.
+
+=item : + [ I<desttype> ]
+
+Like C<:i>, but if the value is omitted, the current value for the
+option will be incremented.
+
+=back
+
+=head1 Advanced Possibilities
+
+=head2 Object oriented interface
+
+Getopt::Long can be used in an object oriented way as well:
+
+    use Getopt::Long;
+    $p = new Getopt::Long::Parser;
+    $p->configure(...configuration options...);
+    if ($p->getoptions(...options descriptions...)) ...
+
+Configuration options can be passed to the constructor:
+
+    $p = new Getopt::Long::Parser
+             config => [...configuration options...];
+
+=head2 Thread Safety
+
+Getopt::Long is thread safe when using ithreads as of Perl 5.8.  It is
+I<not> thread safe when using the older (experimental and now
+obsolete) threads implementation that was added to Perl 5.005.
+
+=head2 Documentation and help texts
+
+Getopt::Long encourages the use of Pod::Usage to produce help
+messages. For example:
+
+    use Getopt::Long;
+    use Pod::Usage;
+
+    my $man = 0;
+    my $help = 0;
+
+    GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+    pod2usage(1) if $help;
+    pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+    __END__
+
+    =head1 NAME
+
+    sample - Using Getopt::Long and Pod::Usage
+
+    =head1 SYNOPSIS
+
+    sample [options] [file ...]
+
+     Options:
+       -help            brief help message
+       -man             full documentation
+
+    =head1 OPTIONS
+
+    =over 8
+
+    =item B<-help>
+
+    Print a brief help message and exits.
+
+    =item B<-man>
+
+    Prints the manual page and exits.
+
+    =back
+
+    =head1 DESCRIPTION
+
+    B<This program> will read the given input file(s) and do something
+    useful with the contents thereof.
+
+    =cut
+
+See L<Pod::Usage> for details.
+
+=head2 Storing option values in a hash
+
+Sometimes, for example when there are a lot of options, having a
+separate variable for each of them can be cumbersome. GetOptions()
+supports, as an alternative mechanism, storing options in a hash.
+
+To obtain this, a reference to a hash must be passed I<as the first
+argument> to GetOptions(). For each option that is specified on the
+command line, the option value will be stored in the hash with the
+option name as key. Options that are not actually used on the command
+line will not be put in the hash, on other words,
+C<exists($h{option})> (or defined()) can be used to test if an option
+was used. The drawback is that warnings will be issued if the program
+runs under C<use strict> and uses C<$h{option}> without testing with
+exists() or defined() first.
+
+    my %h = ();
+    GetOptions (\%h, 'length=i');	# will store in $h{length}
+
+For options that take list or hash values, it is necessary to indicate
+this by appending an C<@> or C<%> sign after the type:
+
+    GetOptions (\%h, 'colours=s@');	# will push to @{$h{colours}}
+
+To make things more complicated, the hash may contain references to
+the actual destinations, for example:
+
+    my $len = 0;
+    my %h = ('length' => \$len);
+    GetOptions (\%h, 'length=i');	# will store in $len
+
+This example is fully equivalent with:
+
+    my $len = 0;
+    GetOptions ('length=i' => \$len);	# will store in $len
+
+Any mixture is possible. For example, the most frequently used options
+could be stored in variables while all other options get stored in the
+hash:
+
+    my $verbose = 0;			# frequently referred
+    my $debug = 0;			# frequently referred
+    my %h = ('verbose' => \$verbose, 'debug' => \$debug);
+    GetOptions (\%h, 'verbose', 'debug', 'filter', 'size=i');
+    if ( $verbose ) { ... }
+    if ( exists $h{filter} ) { ... option 'filter' was specified ... }
+
+=head2 Bundling
+
+With bundling it is possible to set several single-character options
+at once. For example if C<a>, C<v> and C<x> are all valid options,
+
+    -vax
+
+would set all three.
+
+Getopt::Long supports two levels of bundling. To enable bundling, a
+call to Getopt::Long::Configure is required.
+
+The first level of bundling can be enabled with:
+
+    Getopt::Long::Configure ("bundling");
+
+Configured this way, single-character options can be bundled but long
+options B<must> always start with a double dash C<--> to avoid
+ambiguity. For example, when C<vax>, C<a>, C<v> and C<x> are all valid
+options,
+
+    -vax
+
+would set C<a>, C<v> and C<x>, but
+
+    --vax
+
+would set C<vax>.
+
+The second level of bundling lifts this restriction. It can be enabled
+with:
+
+    Getopt::Long::Configure ("bundling_override");
+
+Now, C<-vax> would set the option C<vax>.
+
+When any level of bundling is enabled, option values may be inserted
+in the bundle. For example:
+
+    -h24w80
+
+is equivalent to
+
+    -h 24 -w 80
+
+When configured for bundling, single-character options are matched
+case sensitive while long options are matched case insensitive. To
+have the single-character options matched case insensitive as well,
+use:
+
+    Getopt::Long::Configure ("bundling", "ignorecase_always");
+
+It goes without saying that bundling can be quite confusing.
+
+=head2 The lonesome dash
+
+Normally, a lone dash C<-> on the command line will not be considered
+an option. Option processing will terminate (unless "permute" is
+configured) and the dash will be left in C<@ARGV>.
+
+It is possible to get special treatment for a lone dash. This can be
+achieved by adding an option specification with an empty name, for
+example:
+
+    GetOptions ('' => \$stdio);
+
+A lone dash on the command line will now be a legal option, and using
+it will set variable C<$stdio>.
+
+=head2 Argument callback
+
+A special option 'name' C<< <> >> can be used to designate a subroutine
+to handle non-option arguments. When GetOptions() encounters an
+argument that does not look like an option, it will immediately call this
+subroutine and passes it one parameter: the argument name.
+
+For example:
+
+    my $width = 80;
+    sub process { ... }
+    GetOptions ('width=i' => \$width, '<>' => \&process);
+
+When applied to the following command line:
+
+    arg1 --width=72 arg2 --width=60 arg3
+
+This will call
+C<process("arg1")> while C<$width> is C<80>,
+C<process("arg2")> while C<$width> is C<72>, and
+C<process("arg3")> while C<$width> is C<60>.
+
+This feature requires configuration option B<permute>, see section
+L<Configuring Getopt::Long>.
+
+=head1 Configuring Getopt::Long
+
+Getopt::Long can be configured by calling subroutine
+Getopt::Long::Configure(). This subroutine takes a list of quoted
+strings, each specifying a configuration option to be enabled, e.g.
+C<ignore_case>, or disabled, e.g. C<no_ignore_case>. Case does not
+matter. Multiple calls to Configure() are possible.
+
+Alternatively, as of version 2.24, the configuration options may be
+passed together with the C<use> statement:
+
+    use Getopt::Long qw(:config no_ignore_case bundling);
+
+The following options are available:
+
+=over 12
+
+=item default
+
+This option causes all configuration options to be reset to their
+default values.
+
+=item posix_default
+
+This option causes all configuration options to be reset to their
+default values as if the environment variable POSIXLY_CORRECT had
+been set.
+
+=item auto_abbrev
+
+Allow option names to be abbreviated to uniqueness.
+Default is enabled unless environment variable
+POSIXLY_CORRECT has been set, in which case C<auto_abbrev> is disabled.
+
+=item getopt_compat
+
+Allow C<+> to start options.
+Default is enabled unless environment variable
+POSIXLY_CORRECT has been set, in which case C<getopt_compat> is disabled.
+
+=item gnu_compat
+
+C<gnu_compat> controls whether C<--opt=> is allowed, and what it should
+do. Without C<gnu_compat>, C<--opt=> gives an error. With C<gnu_compat>,
+C<--opt=> will give option C<opt> and empty value.
+This is the way GNU getopt_long() does it.
+
+=item gnu_getopt
+
+This is a short way of setting C<gnu_compat> C<bundling> C<permute>
+C<no_getopt_compat>. With C<gnu_getopt>, command line handling should be
+fully compatible with GNU getopt_long().
+
+=item require_order
+
+Whether command line arguments are allowed to be mixed with options.
+Default is disabled unless environment variable
+POSIXLY_CORRECT has been set, in which case C<require_order> is enabled.
+
+See also C<permute>, which is the opposite of C<require_order>.
+
+=item permute
+
+Whether command line arguments are allowed to be mixed with options.
+Default is enabled unless environment variable
+POSIXLY_CORRECT has been set, in which case C<permute> is disabled.
+Note that C<permute> is the opposite of C<require_order>.
+
+If C<permute> is enabled, this means that
+
+    --foo arg1 --bar arg2 arg3
+
+is equivalent to
+
+    --foo --bar arg1 arg2 arg3
+
+If an argument callback routine is specified, C<@ARGV> will always be
+empty upon successful return of GetOptions() since all options have been
+processed. The only exception is when C<--> is used:
+
+    --foo arg1 --bar arg2 -- arg3
+
+This will call the callback routine for arg1 and arg2, and then
+terminate GetOptions() leaving C<"arg2"> in C<@ARGV>.
+
+If C<require_order> is enabled, options processing
+terminates when the first non-option is encountered.
+
+    --foo arg1 --bar arg2 arg3
+
+is equivalent to
+
+    --foo -- arg1 --bar arg2 arg3
+
+If C<pass_through> is also enabled, options processing will terminate
+at the first unrecognized option, or non-option, whichever comes
+first.
+
+=item bundling (default: disabled)
+
+Enabling this option will allow single-character options to be
+bundled. To distinguish bundles from long option names, long options
+I<must> be introduced with C<--> and bundles with C<->.
+
+Note that, if you have options C<a>, C<l> and C<all>, and
+auto_abbrev enabled, possible arguments and option settings are:
+
+    using argument               sets option(s)
+    ------------------------------------------
+    -a, --a                      a
+    -l, --l                      l
+    -al, -la, -ala, -all,...     a, l
+    --al, --all                  all
+
+The surprising part is that C<--a> sets option C<a> (due to auto
+completion), not C<all>.
+
+Note: disabling C<bundling> also disables C<bundling_override>.
+
+=item bundling_override (default: disabled)
+
+If C<bundling_override> is enabled, bundling is enabled as with
+C<bundling> but now long option names override option bundles.
+
+Note: disabling C<bundling_override> also disables C<bundling>.
+
+B<Note:> Using option bundling can easily lead to unexpected results,
+especially when mixing long options and bundles. Caveat emptor.
+
+=item ignore_case  (default: enabled)
+
+If enabled, case is ignored when matching long option names. If,
+however, bundling is enabled as well, single character options will be
+treated case-sensitive.
+
+With C<ignore_case>, option specifications for options that only
+differ in case, e.g., C<"foo"> and C<"Foo">, will be flagged as
+duplicates.
+
+Note: disabling C<ignore_case> also disables C<ignore_case_always>.
+
+=item ignore_case_always (default: disabled)
+
+When bundling is in effect, case is ignored on single-character
+options also.
+
+Note: disabling C<ignore_case_always> also disables C<ignore_case>.
+
+=item auto_version (default:disabled)
+
+Automatically provide support for the B<--version> option if
+the application did not specify a handler for this option itself.
+
+Getopt::Long will provide a standard version message that includes the
+program name, its version (if $main::VERSION is defined), and the
+versions of Getopt::Long and Perl. The message will be written to
+standard output and processing will terminate.
+
+C<auto_version> will be enabled if the calling program explicitly
+specified a version number higher than 2.32 in the C<use> or
+C<require> statement.
+
+=item auto_help (default:disabled)
+
+Automatically provide support for the B<--help> and B<-?> options if
+the application did not specify a handler for this option itself.
+
+Getopt::Long will provide a help message using module L<Pod::Usage>. The
+message, derived from the SYNOPSIS POD section, will be written to
+standard output and processing will terminate.
+
+C<auto_help> will be enabled if the calling program explicitly
+specified a version number higher than 2.32 in the C<use> or
+C<require> statement.
+
+=item pass_through (default: disabled)
+
+Options that are unknown, ambiguous or supplied with an invalid option
+value are passed through in C<@ARGV> instead of being flagged as
+errors. This makes it possible to write wrapper scripts that process
+only part of the user supplied command line arguments, and pass the
+remaining options to some other program.
+
+If C<require_order> is enabled, options processing will terminate at
+the first unrecognized option, or non-option, whichever comes first.
+However, if C<permute> is enabled instead, results can become confusing.
+
+Note that the options terminator (default C<-->), if present, will
+also be passed through in C<@ARGV>.
+
+=item prefix
+
+The string that starts options. If a constant string is not
+sufficient, see C<prefix_pattern>.
+
+=item prefix_pattern
+
+A Perl pattern that identifies the strings that introduce options.
+Default is C<--|-|\+> unless environment variable
+POSIXLY_CORRECT has been set, in which case it is C<--|->.
+
+=item long_prefix_pattern
+
+A Perl pattern that allows the disambiguation of long and short
+prefixes. Default is C<-->.
+
+Typically you only need to set this if you are using nonstandard
+prefixes and want some or all of them to have the same semantics as
+'--' does under normal circumstances.
+
+For example, setting prefix_pattern to C<--|-|\+|\/> and
+long_prefix_pattern to C<--|\/> would add Win32 style argument
+handling.
+
+=item debug (default: disabled)
+
+Enable debugging output.
+
+=back
+
+=head1 Exportable Methods
+
+=over
+
+=item VersionMessage
+
+This subroutine provides a standard version message. Its argument can be:
+
+=over 4
+
+=item *
+
+A string containing the text of a message to print I<before> printing
+the standard message.
+
+=item *
+
+A numeric value corresponding to the desired exit status.
+
+=item *
+
+A reference to a hash.
+
+=back
+
+If more than one argument is given then the entire argument list is
+assumed to be a hash.  If a hash is supplied (either as a reference or
+as a list) it should contain one or more elements with the following
+keys:
+
+=over 4
+
+=item C<-message>
+
+=item C<-msg>
+
+The text of a message to print immediately prior to printing the
+program's usage message.
+
+=item C<-exitval>
+
+The desired exit status to pass to the B<exit()> function.
+This should be an integer, or else the string "NOEXIT" to
+indicate that control should simply be returned without
+terminating the invoking process.
+
+=item C<-output>
+
+A reference to a filehandle, or the pathname of a file to which the
+usage message should be written. The default is C<\*STDERR> unless the
+exit value is less than 2 (in which case the default is C<\*STDOUT>).
+
+=back
+
+You cannot tie this routine directly to an option, e.g.:
+
+    GetOptions("version" => \&VersionMessage);
+
+Use this instead:
+
+    GetOptions("version" => sub { VersionMessage() });
+
+=item HelpMessage
+
+This subroutine produces a standard help message, derived from the
+program's POD section SYNOPSIS using L<Pod::Usage>. It takes the same
+arguments as VersionMessage(). In particular, you cannot tie it
+directly to an option, e.g.:
+
+    GetOptions("help" => \&HelpMessage);
+
+Use this instead:
+
+    GetOptions("help" => sub { HelpMessage() });
+
+=back
+
+=head1 Return values and Errors
+
+Configuration errors and errors in the option definitions are
+signalled using die() and will terminate the calling program unless
+the call to Getopt::Long::GetOptions() was embedded in C<eval { ...
+}>, or die() was trapped using C<$SIG{__DIE__}>.
+
+GetOptions returns true to indicate success.
+It returns false when the function detected one or more errors during
+option parsing. These errors are signalled using warn() and can be
+trapped with C<$SIG{__WARN__}>.
+
+=head1 Legacy
+
+The earliest development of C<newgetopt.pl> started in 1990, with Perl
+version 4. As a result, its development, and the development of
+Getopt::Long, has gone through several stages. Since backward
+compatibility has always been extremely important, the current version
+of Getopt::Long still supports a lot of constructs that nowadays are
+no longer necessary or otherwise unwanted. This section describes
+briefly some of these 'features'.
+
+=head2 Default destinations
+
+When no destination is specified for an option, GetOptions will store
+the resultant value in a global variable named C<opt_>I<XXX>, where
+I<XXX> is the primary name of this option. When a progam executes
+under C<use strict> (recommended), these variables must be
+pre-declared with our() or C<use vars>.
+
+    our $opt_length = 0;
+    GetOptions ('length=i');	# will store in $opt_length
+
+To yield a usable Perl variable, characters that are not part of the
+syntax for variables are translated to underscores. For example,
+C<--fpp-struct-return> will set the variable
+C<$opt_fpp_struct_return>. Note that this variable resides in the
+namespace of the calling program, not necessarily C<main>. For
+example:
+
+    GetOptions ("size=i", "sizes=i@");
+
+with command line "-size 10 -sizes 24 -sizes 48" will perform the
+equivalent of the assignments
+
+    $opt_size = 10;
+    @opt_sizes = (24, 48);
+
+=head2 Alternative option starters
+
+A string of alternative option starter characters may be passed as the
+first argument (or the first argument after a leading hash reference
+argument).
+
+    my $len = 0;
+    GetOptions ('/', 'length=i' => $len);
+
+Now the command line may look like:
+
+    /length 24 -- arg
+
+Note that to terminate options processing still requires a double dash
+C<-->.
+
+GetOptions() will not interpret a leading C<< "<>" >> as option starters
+if the next argument is a reference. To force C<< "<" >> and C<< ">" >> as
+option starters, use C<< "><" >>. Confusing? Well, B<using a starter
+argument is strongly deprecated> anyway.
+
+=head2 Configuration variables
+
+Previous versions of Getopt::Long used variables for the purpose of
+configuring. Although manipulating these variables still work, it is
+strongly encouraged to use the C<Configure> routine that was introduced
+in version 2.17. Besides, it is much easier.
+
+=head1 Trouble Shooting
+
+=head2 GetOptions does not return a false result when an option is not supplied
+
+That's why they're called 'options'.
+
+=head2 GetOptions does not split the command line correctly
+
+The command line is not split by GetOptions, but by the command line
+interpreter (CLI). On Unix, this is the shell. On Windows, it is
+COMMAND.COM or CMD.EXE. Other operating systems have other CLIs.
+
+It is important to know that these CLIs may behave different when the
+command line contains special characters, in particular quotes or
+backslashes. For example, with Unix shells you can use single quotes
+(C<'>) and double quotes (C<">) to group words together. The following
+alternatives are equivalent on Unix:
+
+    "two words"
+    'two words'
+    two\ words
+
+In case of doubt, insert the following statement in front of your Perl
+program:
+
+    print STDERR (join("|",@ARGV),"\n");
+
+to verify how your CLI passes the arguments to the program.
+
+=head2 Undefined subroutine &main::GetOptions called
+
+Are you running Windows, and did you write
+
+    use GetOpt::Long;
+
+(note the capital 'O')?
+
+=head2 How do I put a "-?" option into a Getopt::Long?
+
+You can only obtain this using an alias, and Getopt::Long of at least
+version 2.13.
+
+    use Getopt::Long;
+    GetOptions ("help|?");    # -help and -? will both set $opt_help
+
+=head1 AUTHOR
+
+Johan Vromans <jvromans@squirrel.nl>
+
+=head1 COPYRIGHT AND DISCLAIMER
+
+This program is Copyright 1990,2005 by Johan Vromans.
+This program is free software; you can redistribute it and/or
+modify it under the terms of the Perl Artistic License or 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.
+
+If you do not have a copy of the GNU General Public License write to
+the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+MA 02139, USA.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Getopt/Std.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Getopt/Std.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Getopt/Std.pm	(revision 14489)
@@ -0,0 +1,294 @@
+package Getopt::Std;
+require 5.000;
+require Exporter;
+
+=head1 NAME
+
+getopt, getopts - Process single-character switches with switch clustering
+
+=head1 SYNOPSIS
+
+    use Getopt::Std;
+
+    getopt('oDI');    # -o, -D & -I take arg.  Sets $opt_* as a side effect.
+    getopt('oDI', \%opts);    # -o, -D & -I take arg.  Values in %opts
+    getopts('oif:');  # -o & -i are boolean flags, -f takes an argument
+		      # Sets $opt_* as a side effect.
+    getopts('oif:', \%opts);  # options as above. Values in %opts
+
+=head1 DESCRIPTION
+
+The getopt() function processes single-character switches with switch
+clustering.  Pass one argument which is a string containing all switches
+that take an argument.  For each switch found, sets $opt_x (where x is the
+switch name) to the value of the argument if an argument is expected,
+or 1 otherwise.  Switches which take an argument don't care whether
+there is a space between the switch and the argument.
+
+The getopts() function is similar, but you should pass to it the list of all
+switches to be recognized.  If unspecified switches are found on the
+command-line, the user will be warned that an unknown option was given.
+
+Note that, if your code is running under the recommended C<use strict
+'vars'> pragma, you will need to declare these package variables
+with "our":
+
+    our($opt_x, $opt_y);
+
+For those of you who don't like additional global variables being created, getopt()
+and getopts() will also accept a hash reference as an optional second argument. 
+Hash keys will be x (where x is the switch name) with key values the value of
+the argument or 1 if no argument is specified.
+
+To allow programs to process arguments that look like switches, but aren't,
+both functions will stop processing switches when they see the argument
+C<-->.  The C<--> will be removed from @ARGV.
+
+=head1 C<--help> and C<--version>
+
+If C<-> is not a recognized switch letter, getopts() supports arguments
+C<--help> and C<--version>.  If C<main::HELP_MESSAGE()> and/or
+C<main::VERSION_MESSAGE()> are defined, they are called; the arguments are
+the output file handle, the name of option-processing package, its version,
+and the switches string.  If the subroutines are not defined, an attempt is
+made to generate intelligent messages; for best results, define $main::VERSION.
+
+If embedded documentation (in pod format, see L<perlpod>) is detected
+in the script, C<--help> will also show how to access the documentation.
+
+Note that due to excessive paranoia, if $Getopt::Std::STANDARD_HELP_VERSION
+isn't true (the default is false), then the messages are printed on STDERR,
+and the processing continues after the messages are printed.  This being
+the opposite of the standard-conforming behaviour, it is strongly recommended
+to set $Getopt::Std::STANDARD_HELP_VERSION to true.
+
+One can change the output file handle of the messages by setting
+$Getopt::Std::OUTPUT_HELP_VERSION.  One can print the messages of C<--help>
+(without the C<Usage:> line) and C<--version> by calling functions help_mess()
+and version_mess() with the switches string as an argument.
+
+=cut
+
+@ISA = qw(Exporter);
+@EXPORT = qw(getopt getopts);
+$VERSION = '1.05';
+# uncomment the next line to disable 1.03-backward compatibility paranoia
+# $STANDARD_HELP_VERSION = 1;
+
+# Process single-character switches with switch clustering.  Pass one argument
+# which is a string containing all switches that take an argument.  For each
+# switch found, sets $opt_x (where x is the switch name) to the value of the
+# argument, or 1 if no argument.  Switches which take an argument don't care
+# whether there is a space between the switch and the argument.
+
+# Usage:
+#	getopt('oDI');  # -o, -D & -I take arg.  Sets opt_* as a side effect.
+
+sub getopt (;$$) {
+    my ($argumentative, $hash) = @_;
+    $argumentative = '' if !defined $argumentative;
+    my ($first,$rest);
+    local $_;
+    local @EXPORT;
+
+    while (@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) {
+	($first,$rest) = ($1,$2);
+	if (/^--$/) {	# early exit if --
+	    shift @ARGV;
+	    last;
+	}
+	if (index($argumentative,$first) >= 0) {
+	    if ($rest ne '') {
+		shift(@ARGV);
+	    }
+	    else {
+		shift(@ARGV);
+		$rest = shift(@ARGV);
+	    }
+	    if (ref $hash) {
+	        $$hash{$first} = $rest;
+	    }
+	    else {
+	        ${"opt_$first"} = $rest;
+	        push( @EXPORT, "\$opt_$first" );
+	    }
+	}
+	else {
+	    if (ref $hash) {
+	        $$hash{$first} = 1;
+	    }
+	    else {
+	        ${"opt_$first"} = 1;
+	        push( @EXPORT, "\$opt_$first" );
+	    }
+	    if ($rest ne '') {
+		$ARGV[0] = "-$rest";
+	    }
+	    else {
+		shift(@ARGV);
+	    }
+	}
+    }
+    unless (ref $hash) { 
+	local $Exporter::ExportLevel = 1;
+	import Getopt::Std;
+    }
+}
+
+sub output_h () {
+  return $OUTPUT_HELP_VERSION if defined $OUTPUT_HELP_VERSION;
+  return \*STDOUT if $STANDARD_HELP_VERSION;
+  return \*STDERR;
+}
+
+sub try_exit () {
+    exit 0 if $STANDARD_HELP_VERSION;
+    my $p = __PACKAGE__;
+    print {output_h()} <<EOM;
+  [Now continuing due to backward compatibility and excessive paranoia.
+   See ``perldoc $p'' about \$$p\::STANDARD_HELP_VERSION.]
+EOM
+}
+
+sub version_mess ($;$) {
+    my $args = shift;
+    my $h = output_h;
+    if (@_ and defined &main::VERSION_MESSAGE) {
+	main::VERSION_MESSAGE($h, __PACKAGE__, $VERSION, $args);
+    } else {
+	my $v = $main::VERSION;
+	$v = '[unknown]' unless defined $v;
+	my $myv = $VERSION;
+	$myv .= ' [paranoid]' unless $STANDARD_HELP_VERSION;
+	my $perlv = $];
+	$perlv = sprintf "%vd", $^V if $] >= 5.006;
+	print $h <<EOH;
+$0 version $v calling Getopt::Std::getopts (version $myv),
+running under Perl version $perlv.
+EOH
+    }
+}
+
+sub help_mess ($;$) {
+    my $args = shift;
+    my $h = output_h;
+    if (@_ and defined &main::HELP_MESSAGE) {
+	main::HELP_MESSAGE($h, __PACKAGE__, $VERSION, $args);
+    } else {
+	my (@witharg) = ($args =~ /(\S)\s*:/g);
+	my (@rest) = ($args =~ /([^\s:])(?!\s*:)/g);
+	my ($help, $arg) = ('', '');
+	if (@witharg) {
+	    $help .= "\n\tWith arguments: -" . join " -", @witharg;
+	    $arg = "\nSpace is not required between options and their arguments.";
+	}
+	if (@rest) {
+	    $help .= "\n\tBoolean (without arguments): -" . join " -", @rest;
+	}
+	my ($scr) = ($0 =~ m,([^/\\]+)$,);
+	print $h <<EOH if @_;			# Let the script override this
+
+Usage: $scr [-OPTIONS [-MORE_OPTIONS]] [--] [PROGRAM_ARG1 ...]
+EOH
+	print $h <<EOH;
+
+The following single-character options are accepted:$help
+
+Options may be merged together.  -- stops processing of options.$arg
+EOH
+	my $has_pod;
+	if ( defined $0 and $0 ne '-e' and -f $0 and -r $0
+	     and open my $script, '<', $0 ) {
+	    while (<$script>) {
+		$has_pod = 1, last if /^=(pod|head1)/;
+	    }
+	}
+	print $h <<EOH if $has_pod;
+
+For more details run
+	perldoc -F $0
+EOH
+    }
+}
+
+# Usage:
+#   getopts('a:bc');	# -a takes arg. -b & -c not. Sets opt_* as a
+#			#  side effect.
+
+sub getopts ($;$) {
+    my ($argumentative, $hash) = @_;
+    my (@args,$first,$rest,$exit);
+    my $errs = 0;
+    local $_;
+    local @EXPORT;
+
+    @args = split( / */, $argumentative );
+    while(@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/s) {
+	($first,$rest) = ($1,$2);
+	if (/^--$/) {	# early exit if --
+	    shift @ARGV;
+	    last;
+	}
+	my $pos = index($argumentative,$first);
+	if ($pos >= 0) {
+	    if (defined($args[$pos+1]) and ($args[$pos+1] eq ':')) {
+		shift(@ARGV);
+		if ($rest eq '') {
+		    ++$errs unless @ARGV;
+		    $rest = shift(@ARGV);
+		}
+		if (ref $hash) {
+		    $$hash{$first} = $rest;
+		}
+		else {
+		    ${"opt_$first"} = $rest;
+		    push( @EXPORT, "\$opt_$first" );
+		}
+	    }
+	    else {
+		if (ref $hash) {
+		    $$hash{$first} = 1;
+		}
+		else {
+		    ${"opt_$first"} = 1;
+		    push( @EXPORT, "\$opt_$first" );
+		}
+		if ($rest eq '') {
+		    shift(@ARGV);
+		}
+		else {
+		    $ARGV[0] = "-$rest";
+		}
+	    }
+	}
+	else {
+	    if ($first eq '-' and $rest eq 'help') {
+		version_mess($argumentative, 'main');
+		help_mess($argumentative, 'main');
+		try_exit();
+		shift(@ARGV);
+		next;
+	    } elsif ($first eq '-' and $rest eq 'version') {
+		version_mess($argumentative, 'main');
+		try_exit();
+		shift(@ARGV);
+		next;
+	    }
+	    warn "Unknown option: $first\n";
+	    ++$errs;
+	    if ($rest ne '') {
+		$ARGV[0] = "-$rest";
+	    }
+	    else {
+		shift(@ARGV);
+	    }
+	}
+    }
+    unless (ref $hash) { 
+	local $Exporter::ExportLevel = 1;
+	import Getopt::Std;
+    }
+    $errs == 0;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Hash/Util.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Hash/Util.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Hash/Util.pm	(revision 14489)
@@ -0,0 +1,225 @@
+package Hash::Util;
+
+require 5.007003;
+use strict;
+use Carp;
+
+require Exporter;
+our @ISA        = qw(Exporter);
+our @EXPORT_OK  = qw(lock_keys unlock_keys lock_value unlock_value
+                     lock_hash unlock_hash hash_seed
+                    );
+our $VERSION    = 0.05;
+
+=head1 NAME
+
+Hash::Util - A selection of general-utility hash subroutines
+
+=head1 SYNOPSIS
+
+  use Hash::Util qw(lock_keys   unlock_keys
+                    lock_value  unlock_value
+                    lock_hash   unlock_hash
+                    hash_seed);
+
+  %hash = (foo => 42, bar => 23);
+  lock_keys(%hash);
+  lock_keys(%hash, @keyset);
+  unlock_keys(%hash);
+
+  lock_value  (%hash, 'foo');
+  unlock_value(%hash, 'foo');
+
+  lock_hash  (%hash);
+  unlock_hash(%hash);
+
+  my $hashes_are_randomised = hash_seed() != 0;
+
+=head1 DESCRIPTION
+
+C<Hash::Util> contains special functions for manipulating hashes that
+don't really warrant a keyword.
+
+By default C<Hash::Util> does not export anything.
+
+=head2 Restricted hashes
+
+5.8.0 introduces the ability to restrict a hash to a certain set of
+keys.  No keys outside of this set can be added.  It also introduces
+the ability to lock an individual key so it cannot be deleted and the
+value cannot be changed.
+
+This is intended to largely replace the deprecated pseudo-hashes.
+
+=over 4
+
+=item lock_keys
+
+=item unlock_keys
+
+  lock_keys(%hash);
+  lock_keys(%hash, @keys);
+
+Restricts the given %hash's set of keys to @keys.  If @keys is not
+given it restricts it to its current keyset.  No more keys can be
+added. delete() and exists() will still work, but will not alter
+the set of allowed keys. B<Note>: the current implementation prevents
+the hash from being bless()ed while it is in a locked state. Any attempt
+to do so will raise an exception. Of course you can still bless()
+the hash before you call lock_keys() so this shouldn't be a problem.
+
+  unlock_keys(%hash);
+
+Removes the restriction on the %hash's keyset.
+
+=cut
+
+sub lock_keys (\%;@) {
+    my($hash, @keys) = @_;
+
+    Internals::hv_clear_placeholders %$hash;
+    if( @keys ) {
+        my %keys = map { ($_ => 1) } @keys;
+        my %original_keys = map { ($_ => 1) } keys %$hash;
+        foreach my $k (keys %original_keys) {
+            die sprintf "Hash has key '$k' which is not in the new key ".
+                        "set at %s line %d\n", (caller)[1,2]
+              unless $keys{$k};
+        }
+    
+        foreach my $k (@keys) {
+            $hash->{$k} = undef unless exists $hash->{$k};
+        }
+        Internals::SvREADONLY %$hash, 1;
+
+        foreach my $k (@keys) {
+            delete $hash->{$k} unless $original_keys{$k};
+        }
+    }
+    else {
+        Internals::SvREADONLY %$hash, 1;
+    }
+
+    return;
+}
+
+sub unlock_keys (\%) {
+    my($hash) = shift;
+
+    Internals::SvREADONLY %$hash, 0;
+    return;
+}
+
+=item lock_value
+
+=item unlock_value
+
+  lock_value  (%hash, $key);
+  unlock_value(%hash, $key);
+
+Locks and unlocks an individual key of a hash.  The value of a locked
+key cannot be changed.
+
+%hash must have already been locked for this to have useful effect.
+
+=cut
+
+sub lock_value (\%$) {
+    my($hash, $key) = @_;
+    carp "Cannot usefully lock values in an unlocked hash" 
+      unless Internals::SvREADONLY %$hash;
+    Internals::SvREADONLY $hash->{$key}, 1;
+}
+
+sub unlock_value (\%$) {
+    my($hash, $key) = @_;
+    Internals::SvREADONLY $hash->{$key}, 0;
+}
+
+
+=item B<lock_hash>
+
+=item B<unlock_hash>
+
+    lock_hash(%hash);
+
+lock_hash() locks an entire hash, making all keys and values readonly.
+No value can be changed, no keys can be added or deleted.
+
+    unlock_hash(%hash);
+
+unlock_hash() does the opposite of lock_hash().  All keys and values
+are made read/write.  All values can be changed and keys can be added
+and deleted.
+
+=cut
+
+sub lock_hash (\%) {
+    my($hash) = shift;
+
+    lock_keys(%$hash);
+
+    foreach my $key (keys %$hash) {
+        lock_value(%$hash, $key);
+    }
+
+    return 1;
+}
+
+sub unlock_hash (\%) {
+    my($hash) = shift;
+
+    foreach my $key (keys %$hash) {
+        unlock_value(%$hash, $key);
+    }
+
+    unlock_keys(%$hash);
+
+    return 1;
+}
+
+
+=item B<hash_seed>
+
+    my $hash_seed = hash_seed();
+
+hash_seed() returns the seed number used to randomise hash ordering.
+Zero means the "traditional" random hash ordering, non-zero means the
+new even more random hash ordering introduced in Perl 5.8.1.
+
+B<Note that the hash seed is sensitive information>: by knowing it one
+can craft a denial-of-service attack against Perl code, even remotely,
+see L<perlsec/"Algorithmic Complexity Attacks"> for more information.
+B<Do not disclose the hash seed> to people who don't need to know it.
+See also L<perlrun/PERL_HASH_SEED_DEBUG>.
+
+=cut
+
+sub hash_seed () {
+    Internals::rehash_seed();
+}
+
+=back
+
+=head1 CAVEATS
+
+Note that the trapping of the restricted operations is not atomic:
+for example
+
+    eval { %hash = (illegal_key => 1) }
+
+leaves the C<%hash> empty rather than with its original contents.
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> on top of code by Nick
+Ing-Simmons and Jeffrey Friedl.
+
+=head1 SEE ALSO
+
+L<Scalar::Util>, L<List::Util>, L<Hash::Util>,
+and L<perlsec/"Algorithmic Complexity Attacks">.
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/I18N/Collate.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/I18N/Collate.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/I18N/Collate.pm	(revision 14489)
@@ -0,0 +1,196 @@
+package I18N::Collate;
+
+use strict;
+our $VERSION = '1.00';
+
+=head1 NAME
+
+I18N::Collate - compare 8-bit scalar data according to the current locale
+
+=head1 SYNOPSIS
+
+    use I18N::Collate;
+    setlocale(LC_COLLATE, 'locale-of-your-choice'); 
+    $s1 = new I18N::Collate "scalar_data_1";
+    $s2 = new I18N::Collate "scalar_data_2";
+
+=head1 DESCRIPTION
+
+  ***
+
+  WARNING: starting from the Perl version 5.003_06
+  the I18N::Collate interface for comparing 8-bit scalar data
+  according to the current locale
+
+	HAS BEEN DEPRECATED
+
+  That is, please do not use it anymore for any new applications
+  and please migrate the old applications away from it because its
+  functionality was integrated into the Perl core language in the
+  release 5.003_06.
+
+  See the perllocale manual page for further information.
+
+  ***
+
+This module provides you with objects that will collate 
+according to your national character set, provided that the 
+POSIX setlocale() function is supported on your system.
+
+You can compare $s1 and $s2 above with
+
+    $s1 le $s2
+
+to extract the data itself, you'll need a dereference: $$s1
+
+This module uses POSIX::setlocale(). The basic collation conversion is
+done by strxfrm() which terminates at NUL characters being a decent C
+routine.  collate_xfrm() handles embedded NUL characters gracefully.
+
+The available locales depend on your operating system; try whether
+C<locale -a> shows them or man pages for "locale" or "nlsinfo" or the
+direct approach C<ls /usr/lib/nls/loc> or C<ls /usr/lib/nls> or
+C<ls /usr/lib/locale>.  Not all the locales that your vendor supports
+are necessarily installed: please consult your operating system's
+documentation and possibly your local system administration.  The
+locale names are probably something like C<xx_XX.(ISO)?8859-N> or
+C<xx_XX.(ISO)?8859N>, for example C<fr_CH.ISO8859-1> is the Swiss (CH)
+variant of French (fr), ISO Latin (8859) 1 (-1) which is the Western
+European character set.
+
+=cut
+
+# I18N::Collate.pm
+#
+# Author:	Jarkko Hietaniemi <F<jhi@iki.fi>>
+#		Helsinki University of Technology, Finland
+#
+# Acks:		Guy Decoux <F<decoux@moulon.inra.fr>> understood
+#		overloading magic much deeper than I and told
+#		how to cut the size of this code by more than half.
+#		(my first version did overload all of lt gt eq le ge cmp)
+#
+# Purpose:      compare 8-bit scalar data according to the current locale
+#
+# Requirements:	Perl5 POSIX::setlocale() and POSIX::strxfrm()
+#
+# Exports:	setlocale 1)
+#		collate_xfrm 2)
+#
+# Overloads:	cmp # 3)
+#
+# Usage:	use I18N::Collate;
+#	        setlocale(LC_COLLATE, 'locale-of-your-choice'); # 4)
+#		$s1 = new I18N::Collate "scalar_data_1";
+#		$s2 = new I18N::Collate "scalar_data_2";
+#		
+#		now you can compare $s1 and $s2: $s1 le $s2
+#		to extract the data itself, you need to deref: $$s1
+#		
+# Notes:	
+#		1) this uses POSIX::setlocale
+#		2) the basic collation conversion is done by strxfrm() which
+#		   terminates at NUL characters being a decent C routine.
+#		   collate_xfrm handles embedded NUL characters gracefully.
+#		3) due to cmp and overload magic, lt le eq ge gt work also
+#		4) the available locales depend on your operating system;
+#		   try whether "locale -a" shows them or man pages for
+#		   "locale" or "nlsinfo" work or the more direct
+#		   approach "ls /usr/lib/nls/loc" or "ls /usr/lib/nls".
+#		   Not all the locales that your vendor supports
+#		   are necessarily installed: please consult your
+#		   operating system's documentation.
+#		   The locale names are probably something like
+#		   'xx_XX.(ISO)?8859-N' or 'xx_XX.(ISO)?8859N',
+#		   for example 'fr_CH.ISO8859-1' is the Swiss (CH)
+#		   variant of French (fr), ISO Latin (8859) 1 (-1)
+#		   which is the Western European character set.
+#
+# Updated:	19961005
+#
+# ---
+
+use POSIX qw(strxfrm LC_COLLATE);
+use warnings::register;
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+our @EXPORT = qw(collate_xfrm setlocale LC_COLLATE);
+our @EXPORT_OK = qw();
+
+use overload qw(
+fallback	1
+cmp		collate_cmp
+);
+
+our($LOCALE, $C);
+
+our $please_use_I18N_Collate_even_if_deprecated = 0;
+sub new {
+  my $new = $_[1];
+
+  if (warnings::enabled() && $] >= 5.003_06) {
+    unless ($please_use_I18N_Collate_even_if_deprecated) {
+      warnings::warn <<___EOD___;
+***
+
+  WARNING: starting from the Perl version 5.003_06
+  the I18N::Collate interface for comparing 8-bit scalar data
+  according to the current locale
+
+	HAS BEEN DEPRECATED
+
+  That is, please do not use it anymore for any new applications
+  and please migrate the old applications away from it because its
+  functionality was integrated into the Perl core language in the
+  release 5.003_06.
+
+  See the perllocale manual page for further information.
+
+***
+___EOD___
+      $please_use_I18N_Collate_even_if_deprecated++;
+    }
+  }
+
+  bless \$new;
+}
+
+sub setlocale {
+ my ($category, $locale) = @_[0,1];
+
+ POSIX::setlocale($category, $locale) if (defined $category);
+ # the current $LOCALE 
+ $LOCALE = $locale || $ENV{'LC_COLLATE'} || $ENV{'LC_ALL'} || '';
+}
+
+sub C {
+  my $s = ${$_[0]};
+
+  $C->{$LOCALE}->{$s} = collate_xfrm($s)
+    unless (defined $C->{$LOCALE}->{$s}); # cache when met
+
+  $C->{$LOCALE}->{$s};
+}
+
+sub collate_xfrm {
+  my $s = $_[0];
+  my $x = '';
+  
+  for (split(/(\000+)/, $s)) {
+    $x .= (/^\000/) ? $_ : strxfrm("$_\000");
+  }
+
+  $x;
+}
+
+sub collate_cmp {
+  &C($_[0]) cmp &C($_[1]);
+}
+
+# init $LOCALE
+
+&I18N::Collate::setlocale();
+
+1; # keep require happy
Index: /for-distributions/trunk/bin/windows/perl/lib/I18N/LangTags.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/I18N/LangTags.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/I18N/LangTags.pm	(revision 14489)
@@ -0,0 +1,887 @@
+
+# Time-stamp: "2004-10-06 23:26:33 ADT"
+# Sean M. Burke <sburke@cpan.org>
+
+require 5.000;
+package I18N::LangTags;
+use strict;
+use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION %Panic);
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw();
+@EXPORT_OK = qw(is_language_tag same_language_tag
+                extract_language_tags super_languages
+                similarity_language_tag is_dialect_of
+                locale2language_tag alternate_language_tags
+                encode_language_tag panic_languages
+                implicate_supers
+                implicate_supers_strictly
+               );
+%EXPORT_TAGS = ('ALL' => \@EXPORT_OK);
+
+$VERSION = "0.35";
+
+sub uniq { my %seen; return grep(!($seen{$_}++), @_); } # a util function
+
+
+=head1 NAME
+
+I18N::LangTags - functions for dealing with RFC3066-style language tags
+
+=head1 SYNOPSIS
+
+  use I18N::LangTags();
+
+...or specify whichever of those functions you want to import, like so:
+
+  use I18N::LangTags qw(implicate_supers similarity_language_tag);
+
+All the exportable functions are listed below -- you're free to import
+only some, or none at all.  By default, none are imported.  If you
+say:
+
+    use I18N::LangTags qw(:ALL)
+
+...then all are exported.  (This saves you from having to use
+something less obvious like C<use I18N::LangTags qw(/./)>.)
+
+If you don't import any of these functions, assume a C<&I18N::LangTags::>
+in front of all the function names in the following examples.
+
+=head1 DESCRIPTION
+
+Language tags are a formalism, described in RFC 3066 (obsoleting
+1766), for declaring what language form (language and possibly
+dialect) a given chunk of information is in.
+
+This library provides functions for common tasks involving language
+tags as they are needed in a variety of protocols and applications.
+
+Please see the "See Also" references for a thorough explanation
+of how to correctly use language tags.
+
+=over
+
+=cut
+
+###########################################################################
+
+=item * the function is_language_tag($lang1)
+
+Returns true iff $lang1 is a formally valid language tag.
+
+   is_language_tag("fr")            is TRUE
+   is_language_tag("x-jicarilla")   is FALSE
+       (Subtags can be 8 chars long at most -- 'jicarilla' is 9)
+
+   is_language_tag("sgn-US")    is TRUE
+       (That's American Sign Language)
+
+   is_language_tag("i-Klikitat")    is TRUE
+       (True without regard to the fact noone has actually
+        registered Klikitat -- it's a formally valid tag)
+
+   is_language_tag("fr-patois")     is TRUE
+       (Formally valid -- altho descriptively weak!)
+
+   is_language_tag("Spanish")       is FALSE
+   is_language_tag("french-patois") is FALSE
+       (No good -- first subtag has to match
+        /^([xXiI]|[a-zA-Z]{2,3})$/ -- see RFC3066)
+
+   is_language_tag("x-borg-prot2532") is TRUE
+       (Yes, subtags can contain digits, as of RFC3066)
+
+=cut
+
+sub is_language_tag {
+
+  ## Changes in the language tagging standards may have to be reflected here.
+
+  my($tag) = lc($_[0]);
+
+  return 0 if $tag eq "i" or $tag eq "x";
+  # Bad degenerate cases that the following
+  #  regexp would erroneously let pass
+
+  return $tag =~ 
+    /^(?:  # First subtag
+         [xi] | [a-z]{2,3}
+      )
+      (?:  # Subtags thereafter
+         -           # separator
+         [a-z0-9]{1,8}  # subtag  
+      )*
+    $/xs ? 1 : 0;
+}
+
+###########################################################################
+
+=item * the function extract_language_tags($whatever)
+
+Returns a list of whatever looks like formally valid language tags
+in $whatever.  Not very smart, so don't get too creative with
+what you want to feed it.
+
+  extract_language_tags("fr, fr-ca, i-mingo")
+    returns:   ('fr', 'fr-ca', 'i-mingo')
+
+  extract_language_tags("It's like this: I'm in fr -- French!")
+    returns:   ('It', 'in', 'fr')
+  (So don't just feed it any old thing.)
+
+The output is untainted.  If you don't know what tainting is,
+don't worry about it.
+
+=cut
+
+sub extract_language_tags {
+
+  ## Changes in the language tagging standards may have to be reflected here.
+
+  my($text) =
+    $_[0] =~ m/(.+)/  # to make for an untainted result
+    ? $1 : ''
+  ;
+  
+  return grep(!m/^[ixIX]$/s, # 'i' and 'x' aren't good tags
+    $text =~ 
+    m/
+      \b
+      (?:  # First subtag
+         [iIxX] | [a-zA-Z]{2,3}
+      )
+      (?:  # Subtags thereafter
+         -           # separator
+         [a-zA-Z0-9]{1,8}  # subtag  
+      )*
+      \b
+    /xsg
+  );
+}
+
+###########################################################################
+
+=item * the function same_language_tag($lang1, $lang2)
+
+Returns true iff $lang1 and $lang2 are acceptable variant tags
+representing the same language-form.
+
+   same_language_tag('x-kadara', 'i-kadara')  is TRUE
+      (The x/i- alternation doesn't matter)
+   same_language_tag('X-KADARA', 'i-kadara')  is TRUE
+      (...and neither does case)
+   same_language_tag('en',       'en-US')     is FALSE
+      (all-English is not the SAME as US English)
+   same_language_tag('x-kadara', 'x-kadar')   is FALSE
+      (these are totally unrelated tags)
+   same_language_tag('no-bok',    'nb')       is TRUE
+      (no-bok is a legacy tag for nb (Norwegian Bokmal))
+
+C<same_language_tag> works by just seeing whether
+C<encode_language_tag($lang1)> is the same as
+C<encode_language_tag($lang2)>.
+
+(Yes, I know this function is named a bit oddly.  Call it historic
+reasons.)
+
+=cut
+
+sub same_language_tag {
+  my $el1 = &encode_language_tag($_[0]);
+  return 0 unless defined $el1;
+   # this avoids the problem of
+   # encode_language_tag($lang1) eq and encode_language_tag($lang2)
+   # being true if $lang1 and $lang2 are both undef
+
+  return $el1 eq &encode_language_tag($_[1]) ? 1 : 0;
+}
+
+###########################################################################
+
+=item * the function similarity_language_tag($lang1, $lang2)
+
+Returns an integer representing the degree of similarity between
+tags $lang1 and $lang2 (the order of which does not matter), where
+similarity is the number of common elements on the left,
+without regard to case and to x/i- alternation.
+
+   similarity_language_tag('fr', 'fr-ca')           is 1
+      (one element in common)
+   similarity_language_tag('fr-ca', 'fr-FR')        is 1
+      (one element in common)
+
+   similarity_language_tag('fr-CA-joual',
+                           'fr-CA-PEI')             is 2
+   similarity_language_tag('fr-CA-joual', 'fr-CA')  is 2
+      (two elements in common)
+
+   similarity_language_tag('x-kadara', 'i-kadara')  is 1
+      (x/i- doesn't matter)
+
+   similarity_language_tag('en',       'x-kadar')   is 0
+   similarity_language_tag('x-kadara', 'x-kadar')   is 0
+      (unrelated tags -- no similarity)
+
+   similarity_language_tag('i-cree-syllabic',
+                           'i-cherokee-syllabic')   is 0
+      (no B<leftmost> elements in common!)
+
+=cut
+
+sub similarity_language_tag {
+  my $lang1 = &encode_language_tag($_[0]);
+  my $lang2 = &encode_language_tag($_[1]);
+   # And encode_language_tag takes care of the whole
+   #  no-nyn==nn, i-hakka==zh-hakka, etc, things
+   
+  # NB: (i-sil-...)?  (i-sgn-...)?
+
+  return undef if !defined($lang1) and !defined($lang2);
+  return 0 if !defined($lang1) or !defined($lang2);
+
+  my @l1_subtags = split('-', $lang1);
+  my @l2_subtags = split('-', $lang2);
+  my $similarity = 0;
+
+  while(@l1_subtags and @l2_subtags) {
+    if(shift(@l1_subtags) eq shift(@l2_subtags)) {
+      ++$similarity;
+    } else {
+      last;
+    } 
+  }
+  return $similarity;
+}
+
+###########################################################################
+
+=item * the function is_dialect_of($lang1, $lang2)
+
+Returns true iff language tag $lang1 represents a subform of
+language tag $lang2.
+
+B<Get the order right!  It doesn't work the other way around!>
+
+   is_dialect_of('en-US', 'en')            is TRUE
+     (American English IS a dialect of all-English)
+
+   is_dialect_of('fr-CA-joual', 'fr-CA')   is TRUE
+   is_dialect_of('fr-CA-joual', 'fr')      is TRUE
+     (Joual is a dialect of (a dialect of) French)
+
+   is_dialect_of('en', 'en-US')            is FALSE
+     (all-English is a NOT dialect of American English)
+
+   is_dialect_of('fr', 'en-CA')            is FALSE
+
+   is_dialect_of('en',    'en'   )         is TRUE
+   is_dialect_of('en-US', 'en-US')         is TRUE
+     (B<Note:> these are degenerate cases)
+
+   is_dialect_of('i-mingo-tom', 'x-Mingo') is TRUE
+     (the x/i thing doesn't matter, nor does case)
+
+   is_dialect_of('nn', 'no')               is TRUE
+     (because 'nn' (New Norse) is aliased to 'no-nyn',
+      as a special legacy case, and 'no-nyn' is a
+      subform of 'no' (Norwegian))
+
+=cut
+
+sub is_dialect_of {
+
+  my $lang1 = &encode_language_tag($_[0]);
+  my $lang2 = &encode_language_tag($_[1]);
+
+  return undef if !defined($lang1) and !defined($lang2);
+  return 0 if !defined($lang1) or !defined($lang2);
+
+  return 1 if $lang1 eq $lang2;
+  return 0 if length($lang1) < length($lang2);
+
+  $lang1 .= '-';
+  $lang2 .= '-';
+  return
+    (substr($lang1, 0, length($lang2)) eq $lang2) ? 1 : 0;
+}
+
+###########################################################################
+
+=item * the function super_languages($lang1)
+
+Returns a list of language tags that are superordinate tags to $lang1
+-- it gets this by removing subtags from the end of $lang1 until
+nothing (or just "i" or "x") is left.
+
+   super_languages("fr-CA-joual")  is  ("fr-CA", "fr")
+
+   super_languages("en-AU")  is  ("en")
+
+   super_languages("en")  is  empty-list, ()
+
+   super_languages("i-cherokee")  is  empty-list, ()
+    ...not ("i"), which would be illegal as well as pointless.
+
+If $lang1 is not a valid language tag, returns empty-list in
+a list context, undef in a scalar context.
+
+A notable and rather unavoidable problem with this method:
+"x-mingo-tom" has an "x" because the whole tag isn't an
+IANA-registered tag -- but super_languages('x-mingo-tom') is
+('x-mingo') -- which isn't really right, since 'i-mingo' is
+registered.  But this module has no way of knowing that.  (But note
+that same_language_tag('x-mingo', 'i-mingo') is TRUE.)
+
+More importantly, you assume I<at your peril> that superordinates of
+$lang1 are mutually intelligible with $lang1.  Consider this
+carefully.
+
+=cut 
+
+sub super_languages {
+  my $lang1 = $_[0];
+  return() unless defined($lang1) && &is_language_tag($lang1);
+
+  # a hack for those annoying new (2001) tags:
+  $lang1 =~ s/^nb\b/no-bok/i; # yes, backwards
+  $lang1 =~ s/^nn\b/no-nyn/i; # yes, backwards
+  $lang1 =~ s/^[ix](-hakka\b)/zh$1/i; # goes the right way
+   # i-hakka-bork-bjork-bjark => zh-hakka-bork-bjork-bjark
+
+  my @l1_subtags = split('-', $lang1);
+
+  ## Changes in the language tagging standards may have to be reflected here.
+
+  # NB: (i-sil-...)?
+
+  my @supers = ();
+  foreach my $bit (@l1_subtags) {
+    push @supers, 
+      scalar(@supers) ? ($supers[-1] . '-' . $bit) : $bit;
+  }
+  pop @supers if @supers;
+  shift @supers if @supers && $supers[0] =~ m<^[iIxX]$>s;
+  return reverse @supers;
+}
+
+###########################################################################
+
+=item * the function locale2language_tag($locale_identifier)
+
+This takes a locale name (like "en", "en_US", or "en_US.ISO8859-1")
+and maps it to a language tag.  If it's not mappable (as with,
+notably, "C" and "POSIX"), this returns empty-list in a list context,
+or undef in a scalar context.
+
+   locale2language_tag("en") is "en"
+
+   locale2language_tag("en_US") is "en-US"
+
+   locale2language_tag("en_US.ISO8859-1") is "en-US"
+
+   locale2language_tag("C") is undef or ()
+
+   locale2language_tag("POSIX") is undef or ()
+
+   locale2language_tag("POSIX") is undef or ()
+
+I'm not totally sure that locale names map satisfactorily to language
+tags.  Think REAL hard about how you use this.  YOU HAVE BEEN WARNED.
+
+The output is untainted.  If you don't know what tainting is,
+don't worry about it.
+
+=cut 
+
+sub locale2language_tag {
+  my $lang =
+    $_[0] =~ m/(.+)/  # to make for an untainted result
+    ? $1 : ''
+  ;
+
+  return $lang if &is_language_tag($lang); # like "en"
+
+  $lang =~ tr<_><->;  # "en_US" -> en-US
+  $lang =~ s<(?:[\.\@][-_a-zA-Z0-9]+)+$><>s;  # "en_US.ISO8859-1" -> en-US
+   # it_IT.utf8@euro => it-IT
+
+  return $lang if &is_language_tag($lang);
+
+  return;
+}
+
+###########################################################################
+
+=item * the function encode_language_tag($lang1)
+
+This function, if given a language tag, returns an encoding of it such
+that:
+
+* tags representing different languages never get the same encoding.
+
+* tags representing the same language always get the same encoding.
+
+* an encoding of a formally valid language tag always is a string
+value that is defined, has length, and is true if considered as a
+boolean.
+
+Note that the encoding itself is B<not> a formally valid language tag.
+Note also that you cannot, currently, go from an encoding back to a
+language tag that it's an encoding of.
+
+Note also that you B<must> consider the encoded value as atomic; i.e.,
+you should not consider it as anything but an opaque, unanalysable
+string value.  (The internals of the encoding method may change in
+future versions, as the language tagging standard changes over time.)
+
+C<encode_language_tag> returns undef if given anything other than a
+formally valid language tag.
+
+The reason C<encode_language_tag> exists is because different language
+tags may represent the same language; this is normally treatable with
+C<same_language_tag>, but consider this situation:
+
+You have a data file that expresses greetings in different languages.
+Its format is "[language tag]=[how to say 'Hello']", like:
+
+          en-US=Hiho
+          fr=Bonjour
+          i-mingo=Hau'
+
+And suppose you write a program that reads that file and then runs as
+a daemon, answering client requests that specify a language tag and
+then expect the string that says how to greet in that language.  So an
+interaction looks like:
+
+          greeting-client asks:    fr
+          greeting-server answers: Bonjour
+
+So far so good.  But suppose the way you're implementing this is:
+
+          my %greetings;
+          die unless open(IN, "<in.dat");
+          while(<IN>) {
+            chomp;
+            next unless /^([^=]+)=(.+)/s;
+            my($lang, $expr) = ($1, $2);
+            $greetings{$lang} = $expr;
+          }
+          close(IN);
+
+at which point %greetings has the contents:
+
+          "en-US"   => "Hiho"
+          "fr"      => "Bonjour"
+          "i-mingo" => "Hau'"
+
+And suppose then that you answer client requests for language $wanted
+by just looking up $greetings{$wanted}.
+
+If the client asks for "fr", that will look up successfully in
+%greetings, to the value "Bonjour".  And if the client asks for
+"i-mingo", that will look up successfully in %greetings, to the value
+"Hau'".
+
+But if the client asks for "i-Mingo" or "x-mingo", or "Fr", then the
+lookup in %greetings fails.  That's the Wrong Thing.
+
+You could instead do lookups on $wanted with:
+
+          use I18N::LangTags qw(same_language_tag);
+          my $repsonse = '';
+          foreach my $l2 (keys %greetings) {
+            if(same_language_tag($wanted, $l2)) {
+              $response = $greetings{$l2};
+              last;
+            }
+          }
+
+But that's rather inefficient.  A better way to do it is to start your
+program with:
+
+          use I18N::LangTags qw(encode_language_tag);
+          my %greetings;
+          die unless open(IN, "<in.dat");
+          while(<IN>) {
+            chomp;
+            next unless /^([^=]+)=(.+)/s;
+            my($lang, $expr) = ($1, $2);
+            $greetings{
+                        encode_language_tag($lang)
+                      } = $expr;
+          }
+          close(IN);
+
+and then just answer client requests for language $wanted by just
+looking up
+
+          $greetings{encode_language_tag($wanted)}
+
+And that does the Right Thing.
+
+=cut
+
+sub encode_language_tag {
+  # Only similarity_language_tag() is allowed to analyse encodings!
+
+  ## Changes in the language tagging standards may have to be reflected here.
+
+  my($tag) = $_[0] || return undef;
+  return undef unless &is_language_tag($tag);
+
+  # For the moment, these legacy variances are few enough that
+  #  we can just handle them here with regexps.
+  $tag =~ s/^iw\b/he/i; # Hebrew
+  $tag =~ s/^in\b/id/i; # Indonesian
+  $tag =~ s/^cre\b/cr/i; # Cree
+  $tag =~ s/^jw\b/jv/i; # Javanese
+  $tag =~ s/^[ix]-lux\b/lb/i;  # Luxemburger
+  $tag =~ s/^[ix]-navajo\b/nv/i;  # Navajo
+  $tag =~ s/^ji\b/yi/i;  # Yiddish
+  # SMB 2003 -- Hm.  There's a bunch of new XXX->YY variances now,
+  #  but maybe they're all so obscure I can ignore them.   "Obscure"
+  #  meaning either that the language is obscure, and/or that the
+  #  XXX form was extant so briefly that it's unlikely it was ever
+  #  used.  I hope.
+  #
+  # These go FROM the simplex to complex form, to get
+  #  similarity-comparison right.  And that's okay, since
+  #  similarity_language_tag is the only thing that
+  #  analyzes our output.
+  $tag =~ s/^[ix]-hakka\b/zh-hakka/i;  # Hakka
+  $tag =~ s/^nb\b/no-bok/i;  # BACKWARDS for Bokmal
+  $tag =~ s/^nn\b/no-nyn/i;  # BACKWARDS for Nynorsk
+
+  $tag =~ s/^[xiXI]-//s;
+   # Just lop off any leading "x/i-"
+
+  return "~" . uc($tag);
+}
+
+#--------------------------------------------------------------------------
+
+=item * the function alternate_language_tags($lang1)
+
+This function, if given a language tag, returns all language tags that
+are alternate forms of this language tag.  (I.e., tags which refer to
+the same language.)  This is meant to handle legacy tags caused by
+the minor changes in language tag standards over the years; and
+the x-/i- alternation is also dealt with.
+
+Note that this function does I<not> try to equate new (and never-used,
+and unusable)
+ISO639-2 three-letter tags to old (and still in use) ISO639-1
+two-letter equivalents -- like "ara" -> "ar" -- because
+"ara" has I<never> been in use as an Internet language tag,
+and RFC 3066 stipulates that it never should be, since a shorter
+tag ("ar") exists.
+
+Examples:
+
+          alternate_language_tags('no-bok')       is ('nb')
+          alternate_language_tags('nb')           is ('no-bok')
+          alternate_language_tags('he')           is ('iw')
+          alternate_language_tags('iw')           is ('he')
+          alternate_language_tags('i-hakka')      is ('zh-hakka', 'x-hakka')
+          alternate_language_tags('zh-hakka')     is ('i-hakka', 'x-hakka')
+          alternate_language_tags('en')           is ()
+          alternate_language_tags('x-mingo-tom')  is ('i-mingo-tom')
+          alternate_language_tags('x-klikitat')   is ('i-klikitat')
+          alternate_language_tags('i-klikitat')   is ('x-klikitat')
+
+This function returns empty-list if given anything other than a formally
+valid language tag.
+
+=cut
+
+my %alt = qw( i x   x i   I X   X I );
+sub alternate_language_tags {
+  my $tag = $_[0];
+  return() unless &is_language_tag($tag);
+
+  my @em; # push 'em real goood!
+
+  # For the moment, these legacy variances are few enough that
+  #  we can just handle them here with regexps.
+  
+  if(     $tag =~ m/^[ix]-hakka\b(.*)/i) {push @em, "zh-hakka$1";
+  } elsif($tag =~ m/^zh-hakka\b(.*)/i) {  push @em, "x-hakka$1", "i-hakka$1";
+
+  } elsif($tag =~ m/^he\b(.*)/i) { push @em, "iw$1";
+  } elsif($tag =~ m/^iw\b(.*)/i) { push @em, "he$1";
+
+  } elsif($tag =~ m/^in\b(.*)/i) { push @em, "id$1";
+  } elsif($tag =~ m/^id\b(.*)/i) { push @em, "in$1";
+
+  } elsif($tag =~ m/^[ix]-lux\b(.*)/i) { push @em, "lb$1";
+  } elsif($tag =~ m/^lb\b(.*)/i) {       push @em, "i-lux$1", "x-lux$1";
+
+  } elsif($tag =~ m/^[ix]-navajo\b(.*)/i) { push @em, "nv$1";
+  } elsif($tag =~ m/^nv\b(.*)/i) {          push @em, "i-navajo$1", "x-navajo$1";
+
+  } elsif($tag =~ m/^yi\b(.*)/i) { push @em, "ji$1";
+  } elsif($tag =~ m/^ji\b(.*)/i) { push @em, "yi$1";
+
+  } elsif($tag =~ m/^nb\b(.*)/i) {     push @em, "no-bok$1";
+  } elsif($tag =~ m/^no-bok\b(.*)/i) { push @em, "nb$1";
+  
+  } elsif($tag =~ m/^nn\b(.*)/i) {     push @em, "no-nyn$1";
+  } elsif($tag =~ m/^no-nyn\b(.*)/i) { push @em, "nn$1";
+  }
+
+  push @em, $alt{$1} . $2 if $tag =~ /^([XIxi])(-.+)/;
+  return @em;
+}
+
+###########################################################################
+
+{
+  # Init %Panic...
+  
+  my @panic = (  # MUST all be lowercase!
+   # Only large ("national") languages make it in this list.
+   #  If you, as a user, are so bizarre that the /only/ language
+   #  you claim to accept is Galician, then no, we won't do you
+   #  the favor of providing Catalan as a panic-fallback for
+   #  you.  Because if I start trying to add "little languages" in
+   #  here, I'll just go crazy.
+
+   # Scandinavian lgs.  All based on opinion and hearsay.
+   'sv' => [qw(nb no da nn)],
+   'da' => [qw(nb no sv nn)], # I guess
+   [qw(no nn nb)], [qw(no nn nb sv da)],
+   'is' => [qw(da sv no nb nn)],
+   'fo' => [qw(da is no nb nn sv)], # I guess
+   
+   # I think this is about the extent of tolerable intelligibility
+   #  among large modern Romance languages.
+   'pt' => [qw(es ca it fr)], # Portuguese, Spanish, Catalan, Italian, French
+   'ca' => [qw(es pt it fr)],
+   'es' => [qw(ca it fr pt)],
+   'it' => [qw(es fr ca pt)],
+   'fr' => [qw(es it ca pt)],
+   
+   # Also assume that speakers of the main Indian languages prefer
+   #  to read/hear Hindi over English
+   [qw(
+     as bn gu kn ks kok ml mni mr ne or pa sa sd te ta ur
+   )] => 'hi',
+    # Assamese, Bengali, Gujarati, [Hindi,] Kannada (Kanarese), Kashmiri,
+    # Konkani, Malayalam, Meithei (Manipuri), Marathi, Nepali, Oriya,
+    # Punjabi, Sanskrit, Sindhi, Telugu, Tamil, and Urdu.
+   'hi' => [qw(bn pa as or)],
+   # I welcome finer data for the other Indian languages.
+   #  E.g., what should Oriya's list be, besides just Hindi?
+   
+   # And the panic languages for English is, of course, nil!
+
+   # My guesses at Slavic intelligibility:
+   ([qw(ru be uk)]) x 2,  # Russian, Belarusian, Ukranian
+   'sr' => 'hr', 'hr' => 'sr', # Serb + Croat
+   'cs' => 'sk', 'sk' => 'cs', # Czech + Slovak
+
+   'ms' => 'id', 'id' => 'ms', # Malay + Indonesian
+
+   'et' => 'fi', 'fi' => 'et', # Estonian + Finnish
+
+   #?? 'lo' => 'th', 'th' => 'lo', # Lao + Thai
+
+  );
+  my($k,$v);
+  while(@panic) {
+    ($k,$v) = splice(@panic,0,2);
+    foreach my $k (ref($k) ? @$k : $k) {
+      foreach my $v (ref($v) ? @$v : $v) {
+        push @{$Panic{$k} ||= []}, $v unless $k eq $v;
+      }
+    }
+  }
+}
+
+=item * the function @langs = panic_languages(@accept_languages)
+
+This function takes a list of 0 or more language
+tags that constitute a given user's Accept-Language list, and
+returns a list of tags for I<other> (non-super)
+languages that are probably acceptable to the user, to be
+used I<if all else fails>.
+
+For example, if a user accepts only 'ca' (Catalan) and
+'es' (Spanish), and the documents/interfaces you have
+available are just in German, Italian, and Chinese, then
+the user will most likely want the Italian one (and not
+the Chinese or German one!), instead of getting
+nothing.  So C<panic_languages('ca', 'es')> returns
+a list containing 'it' (Italian).
+
+English ('en') is I<always> in the return list, but
+whether it's at the very end or not depends
+on the input languages.  This function works by consulting
+an internal table that stipulates what common
+languages are "close" to each other.
+
+A useful construct you might consider using is:
+
+  @fallbacks = super_languages(@accept_languages);
+  push @fallbacks, panic_languages(
+    @accept_languages, @fallbacks,
+  );
+
+=cut
+
+sub panic_languages {
+  # When in panic or in doubt, run in circles, scream, and shout!
+  my(@out, %seen);
+  foreach my $t (@_) {
+    next unless $t;
+    next if $seen{$t}++; # so we don't return it or hit it again
+    # push @out, super_languages($t); # nah, keep that separate
+    push @out, @{ $Panic{lc $t} || next };
+  }
+  return grep !$seen{$_}++,  @out, 'en';
+}
+
+#---------------------------------------------------------------------------
+#---------------------------------------------------------------------------
+
+=item * the function implicate_supers( ...languages... )
+
+This takes a list of strings (which are presumed to be language-tags;
+strings that aren't, are ignored); and after each one, this function
+inserts super-ordinate forms that don't already appear in the list.
+The original list, plus these insertions, is returned.
+
+In other words, it takes this:
+
+  pt-br de-DE en-US fr pt-br-janeiro
+
+and returns this:
+
+  pt-br pt de-DE de en-US en fr pt-br-janeiro
+
+This function is most useful in the idiom
+
+  implicate_supers( I18N::LangTags::Detect::detect() );
+
+(See L<I18N::LangTags::Detect>.)
+
+
+=item * the function implicate_supers_strictly( ...languages... )
+
+This works like C<implicate_supers> except that the implicated
+forms are added to the end of the return list.
+
+In other words, implicate_supers_strictly takes a list of strings
+(which are presumed to be language-tags; strings that aren't, are
+ignored) and after the whole given list, it inserts the super-ordinate forms 
+of all given tags, minus any tags that already appear in the input list.
+
+In other words, it takes this:
+
+  pt-br de-DE en-US fr pt-br-janeiro
+
+and returns this:
+
+  pt-br de-DE en-US fr pt-br-janeiro pt de en
+
+The reason this function has "_strictly" in its name is that when
+you're processing an Accept-Language list according to the RFCs, if
+you interpret the RFCs quite strictly, then you would use
+implicate_supers_strictly, but for normal use (i.e., common-sense use,
+as far as I'm concerned) you'd use implicate_supers.
+
+=cut
+
+sub implicate_supers {
+  my @languages = grep is_language_tag($_), @_;
+  my %seen_encoded;
+  foreach my $lang (@languages) {
+    $seen_encoded{ I18N::LangTags::encode_language_tag($lang) } = 1
+  }
+
+  my(@output_languages);
+  foreach my $lang (@languages) {
+    push @output_languages, $lang;
+    foreach my $s ( I18N::LangTags::super_languages($lang) ) {
+      # Note that super_languages returns the longest first.
+      last if $seen_encoded{ I18N::LangTags::encode_language_tag($s) };
+      push @output_languages, $s;
+    }
+  }
+  return uniq( @output_languages );
+
+}
+
+sub implicate_supers_strictly {
+  my @tags = grep is_language_tag($_), @_;
+  return uniq( @_,   map super_languages($_), @_ );
+}
+
+
+
+###########################################################################
+1;
+__END__
+
+=back
+
+=head1 ABOUT LOWERCASING
+
+I've considered making all the above functions that output language
+tags return all those tags strictly in lowercase.  Having all your
+language tags in lowercase does make some things easier.  But you
+might as well just lowercase as you like, or call
+C<encode_language_tag($lang1)> where appropriate.
+
+=head1 ABOUT UNICODE PLAINTEXT LANGUAGE TAGS
+
+In some future version of I18N::LangTags, I plan to include support
+for RFC2482-style language tags -- which are basically just normal
+language tags with their ASCII characters shifted into Plane 14.
+
+=head1 SEE ALSO
+
+* L<I18N::LangTags::List|I18N::LangTags::List>
+
+* RFC 3066, C<ftp://ftp.isi.edu/in-notes/rfc3066.txt>, "Tags for the
+Identification of Languages".  (Obsoletes RFC 1766)
+
+* RFC 2277, C<ftp://ftp.isi.edu/in-notes/rfc2277.txt>, "IETF Policy on
+Character Sets and Languages".
+
+* RFC 2231, C<ftp://ftp.isi.edu/in-notes/rfc2231.txt>, "MIME Parameter
+Value and Encoded Word Extensions: Character Sets, Languages, and
+Continuations".
+
+* RFC 2482, C<ftp://ftp.isi.edu/in-notes/rfc2482.txt>, 
+"Language Tagging in Unicode Plain Text".
+
+* Locale::Codes, in
+C<http://www.perl.com/CPAN/modules/by-module/Locale/>
+
+* ISO 639-2, "Codes for the representation of names of languages",
+including two-letter and three-letter codes,
+C<http://www.loc.gov/standards/iso639-2/langcodes.html>
+
+* The IANA list of registered languages (hopefully up-to-date),
+C<http://www.iana.org/assignments/language-tags>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1998+ Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+The programs and documentation in this dist are distributed in
+the hope that they will be useful, but without any warranty; without
+even the implied warranty of merchantability or fitness for a
+particular purpose.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/I18N/LangTags/Detect.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/I18N/LangTags/Detect.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/I18N/LangTags/Detect.pm	(revision 14489)
@@ -0,0 +1,237 @@
+
+# Time-stamp: "2004-06-20 21:47:55 ADT"
+
+require 5;
+package I18N::LangTags::Detect;
+use strict;
+
+use vars qw( @ISA $VERSION $MATCH_SUPERS $USING_LANGUAGE_TAGS
+             $USE_LITERALS $MATCH_SUPERS_TIGHTLY);
+
+BEGIN { unless(defined &DEBUG) { *DEBUG = sub () {0} } }
+ # define the constant 'DEBUG' at compile-time
+
+$VERSION = "1.03";
+@ISA = ();
+use I18N::LangTags qw(alternate_language_tags locale2language_tag);
+
+sub _uniq { my %seen; return grep(!($seen{$_}++), @_); }
+sub _normalize {
+  my(@languages) =
+    map lc($_),
+    grep $_,
+    map {; $_, alternate_language_tags($_) } @_;
+  return _uniq(@languages) if wantarray;
+  return $languages[0];
+}
+
+#---------------------------------------------------------------------------
+# The extent of our functional interface:
+
+sub detect () { return __PACKAGE__->ambient_langprefs; }
+
+#===========================================================================
+
+sub ambient_langprefs { # always returns things untainted
+  my $base_class = $_[0];
+  
+  return $base_class->http_accept_langs
+   if length( $ENV{'REQUEST_METHOD'} || '' ); # I'm a CGI
+       # it's off in its own routine because it's complicated
+
+  # Not running as a CGI: try to puzzle out from the environment
+  my @languages;
+
+  foreach my $envname (qw( LANGUAGE LC_ALL LC_MESSAGES LANG )) {
+    next unless $ENV{$envname};
+    DEBUG and print "Noting \$$envname: $ENV{$envname}\n";
+    push @languages,
+      map locale2language_tag($_),
+        # if it's a lg tag, fine, pass thru (untainted)
+        # if it's a locale ID, try converting to a lg tag (untainted),
+        # otherwise nix it.
+
+      split m/[,:]/,
+      $ENV{$envname}
+    ;
+    last; # first one wins
+  }
+  
+  if($ENV{'IGNORE_WIN32_LOCALE'}) {
+    # no-op
+  } elsif(&_try_use('Win32::Locale')) {
+    # If we have that module installed...
+    push @languages, Win32::Locale::get_language() || ''
+     if defined &Win32::Locale::get_language;
+  }
+  return _normalize @languages;
+}
+
+#---------------------------------------------------------------------------
+
+sub http_accept_langs {
+  # Deal with HTTP "Accept-Language:" stuff.  Hassle.
+  # This code is more lenient than RFC 3282, which you must read.
+  # Hm.  Should I just move this into I18N::LangTags at some point?
+  no integer;
+
+  my $in = (@_ > 1) ? $_[1] : $ENV{'HTTP_ACCEPT_LANGUAGE'};
+  # (always ends up untainting)
+
+  return() unless defined $in and length $in;
+
+  $in =~ s/\([^\)]*\)//g; # nix just about any comment
+  
+  if( $in =~ m/^\s*([a-zA-Z][-a-zA-Z]+)\s*$/s ) {
+    # Very common case: just one language tag
+    return _normalize $1;
+  } elsif( $in =~ m/^\s*[a-zA-Z][-a-zA-Z]+(?:\s*,\s*[a-zA-Z][-a-zA-Z]+)*\s*$/s ) {
+    # Common case these days: just "foo, bar, baz"
+    return _normalize( $in =~ m/([a-zA-Z][-a-zA-Z]+)/g );
+  }
+
+  # Else it's complicated...
+
+  $in =~ s/\s+//g;  # Yes, we can just do without the WS!
+  my @in = $in =~ m/([^,]+)/g;
+  my %pref;
+  
+  my $q;
+  foreach my $tag (@in) {
+    next unless $tag =~
+     m/^([a-zA-Z][-a-zA-Z]+)
+        (?:
+         ;q=
+         (
+          \d*   # a bit too broad of a RE, but so what.
+          (?:
+            \.\d+
+          )?
+         )
+        )?
+       $
+      /sx
+    ;
+    $q = (defined $2 and length $2) ? $2 : 1;
+    #print "$1 with q=$q\n";
+    push @{ $pref{$q} }, lc $1;
+  }
+
+  return _normalize(
+    # Read off %pref, in descending key order...
+    map @{$pref{$_}},
+    sort {$b <=> $a}
+    keys %pref
+  );
+}
+
+#===========================================================================
+
+my %tried = ();
+  # memoization of whether we've used this module, or found it unusable.
+
+sub _try_use {   # Basically a wrapper around "require Modulename"
+  # "Many men have tried..."  "They tried and failed?"  "They tried and died."
+  return $tried{$_[0]} if exists $tried{$_[0]};  # memoization
+
+  my $module = $_[0];   # ASSUME sane module name!
+  { no strict 'refs';
+    return($tried{$module} = 1)
+     if defined(%{$module . "::Lexicon"}) or defined(@{$module . "::ISA"});
+    # weird case: we never use'd it, but there it is!
+  }
+
+  print " About to use $module ...\n" if DEBUG;
+  {
+    local $SIG{'__DIE__'};
+    eval "require $module"; # used to be "use $module", but no point in that.
+  }
+  if($@) {
+    print "Error using $module \: $@\n" if DEBUG > 1;
+    return $tried{$module} = 0;
+  } else {
+    print " OK, $module is used\n" if DEBUG;
+    return $tried{$module} = 1;
+  }
+}
+
+#---------------------------------------------------------------------------
+1;
+__END__
+
+
+=head1 NAME
+
+I18N::LangTags::Detect - detect the user's language preferences
+
+=head1 SYNOPSIS
+
+  use I18N::LangTags::Detect;
+  my @user_wants = I18N::LangTags::Detect::detect();
+
+=head1 DESCRIPTION
+
+It is a common problem to want to detect what language(s) the user would
+prefer output in.
+
+=head1 FUNCTIONS
+
+This module defines one public function,
+C<I18N::LangTags::Detect::detect()>.  This function is not exported
+(nor is even exportable), and it takes no parameters.
+
+In scalar context, the function returns the most preferred language
+tag (or undef if no preference was seen).
+
+In list context (which is usually what you want),
+the function returns a
+(possibly empty) list of language tags representing (best first) what
+languages the user apparently would accept output in.  You will
+probably want to pass the output of this through
+C<I18N::LangTags::implicate_supers_tightly(...)>
+or
+C<I18N::LangTags::implicate_supers(...)>, like so:
+
+  my @languages =
+    I18N::LangTags::implicate_supers_tightly(
+      I18N::LangTags::Detect::detect()
+    );
+
+
+=head1 ENVIRONMENT
+
+This module looks for several environment variables, including
+REQUEST_METHOD, HTTP_ACCEPT_LANGUAGE,
+LANGUAGE, LC_ALL, LC_MESSAGES, and LANG.
+
+It will also use the L<Win32::Locale> module, if it's installed.
+
+
+=head1 SEE ALSO
+
+L<I18N::LangTags>, L<Win32::Locale>, L<Locale::Maketext>.
+
+(This module's core code started out as a routine in Locale::Maketext;
+but I moved it here once I realized it was more generally useful.)
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 1998-2004 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+The programs and documentation in this dist are distributed in
+the hope that they will be useful, but without any warranty; without
+even the implied warranty of merchantability or fitness for a
+particular purpose.
+
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
+# a tip: Put a bit of chopped up pickled ginger in your salad. It's tasty!
Index: /for-distributions/trunk/bin/windows/perl/lib/I18N/LangTags/List.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/I18N/LangTags/List.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/I18N/LangTags/List.pm	(revision 14489)
@@ -0,0 +1,1779 @@
+
+require 5;
+package I18N::LangTags::List;
+#  Time-stamp: "2004-10-06 23:26:21 ADT"
+use strict;
+use vars qw(%Name %Is_Disrec $Debug $VERSION);
+$VERSION = '0.35';
+# POD at the end.
+
+#----------------------------------------------------------------------
+{
+# read the table out of our own POD!
+  my $seeking = 1;
+  my $count = 0;
+  my($disrec,$tag,$name);
+  my $last_name = '';
+  while(<I18N::LangTags::List::DATA>) {
+    if($seeking) {
+      $seeking = 0 if m/=for woohah/;
+    } elsif( ($disrec, $tag, $name) =
+          m/(\[?)\{([-0-9a-zA-Z]+)\}(?:\s*:)?\s*([^\[\]]+)/
+    ) {
+      $name =~ s/\s*[;\.]*\s*$//g;
+      next unless $name;
+      ++$count;
+      print "<$tag> <$name>\n" if $Debug;
+      $last_name = $Name{$tag} = $name;
+      $Is_Disrec{$tag} = 1 if $disrec;
+    } elsif (m/[Ff]ormerly \"([-a-z0-9]+)\"/) {
+      $Name{$1} = "$last_name (old tag)" if $last_name;
+      $Is_Disrec{$1} = 1;
+    }
+  }
+  die "No tags read??" unless $count;
+}
+#----------------------------------------------------------------------
+
+sub name {
+  my $tag = lc($_[0] || return);
+  $tag =~ s/^\s+//s;
+  $tag =~ s/\s+$//s;
+  
+  my $alt;
+  if($tag =~ m/^x-(.+)/) {
+    $alt = "i-$1";
+  } elsif($tag =~ m/^i-(.+)/) {
+    $alt = "x-$1";
+  } else {
+    $alt = '';
+  }
+  
+  my $subform = '';
+  my $name = '';
+  print "Input: {$tag}\n" if $Debug;
+  while(length $tag) {
+    last if $name = $Name{$tag};
+    last if $name = $Name{$alt};
+    if($tag =~ s/(-[a-z0-9]+)$//s) {
+      print "Shaving off: $1 leaving $tag\n" if $Debug;
+      $subform = "$1$subform";
+       # and loop around again
+       
+      $alt =~ s/(-[a-z0-9]+)$//s && $Debug && print " alt -> $alt\n";
+    } else {
+      # we're trying to pull a subform off a primary tag. TILT!
+      print "Aborting on: {$name}{$subform}\n" if $Debug;
+      last;
+    }
+  }
+  print "Output: {$name}{$subform}\n" if $Debug;
+  
+  return unless $name;   # Failure
+  return $name unless $subform;   # Exact match
+  $subform =~ s/^-//s;
+  $subform =~ s/-$//s;
+  return "$name (Subform \"$subform\")";
+}
+
+#--------------------------------------------------------------------------
+
+sub is_decent {
+  my $tag = lc($_[0] || return 0);
+  #require I18N::LangTags;
+
+  return 0 unless
+    $tag =~ 
+    /^(?:  # First subtag
+         [xi] | [a-z]{2,3}
+      )
+      (?:  # Subtags thereafter
+         -           # separator
+         [a-z0-9]{1,8}  # subtag  
+      )*
+    $/xs;
+
+  my @supers = ();
+  foreach my $bit (split('-', $tag)) {
+    push @supers, 
+      scalar(@supers) ? ($supers[-1] . '-' . $bit) : $bit;
+  }
+  return 0 unless @supers;
+  shift @supers if $supers[0] =~ m<^(i|x|sgn)$>s;
+  return 0 unless @supers;
+
+  foreach my $f ($tag, @supers) {
+    return 0 if $Is_Disrec{$f};
+    return 2 if $Name{$f};
+     # so that decent subforms of indecent tags are decent
+  }
+  return 2 if $Name{$tag}; # not only is it decent, it's known!
+  return 1;
+}
+
+#--------------------------------------------------------------------------
+1;
+
+__DATA__
+
+=head1 NAME
+
+I18N::LangTags::List -- tags and names for human languages
+
+=head1 SYNOPSIS
+
+  use I18N::LangTags::List;
+  print "Parlez-vous... ", join(', ',
+      I18N::LangTags::List::name('elx') || 'unknown_language',
+      I18N::LangTags::List::name('ar-Kw') || 'unknown_language',
+      I18N::LangTags::List::name('en') || 'unknown_language',
+      I18N::LangTags::List::name('en-CA') || 'unknown_language',
+    ), "?\n";
+
+prints:
+
+  Parlez-vous... Elamite, Kuwait Arabic, English, Canadian English?
+
+=head1 DESCRIPTION
+
+This module provides a function 
+C<I18N::LangTags::List::name( I<langtag> ) > that takes
+a language tag (see L<I18N::LangTags|I18N::LangTags>)
+and returns the best attempt at an English name for it, or
+undef if it can't make sense of the tag.
+
+The function I18N::LangTags::List::name(...) is not exported.
+
+This module also provides a function
+C<I18N::LangTags::List::is_decent( I<langtag> )> that returns true iff
+the language tag is syntactically valid and is for general use (like
+"fr" or "fr-ca", below).  That is, it returns false for tags that are
+syntactically invalid and for tags, like "aus", that are listed in
+brackets below.  This function is not exported.
+
+The map of tags-to-names that it uses is accessable as
+%I18N::LangTags::List::Name, and it's the same as the list
+that follows in this documentation, which should be useful
+to you even if you don't use this module.
+
+=head1 ABOUT LANGUAGE TAGS
+
+Internet language tags, as defined in RFC 3066, are a formalism
+for denoting human languages.  The two-letter ISO 639-1 language
+codes are well known (as "en" for English), as are their forms
+when qualified by a country code ("en-US").  Less well-known are the
+arbitrary-length non-ISO codes (like "i-mingo"), and the 
+recently (in 2001) introduced three-letter ISO-639-2 codes.
+
+Remember these important facts:
+
+=over
+
+=item *
+
+Language tags are not locale IDs.  A locale ID is written with a "_"
+instead of a "-", (almost?) always matches C<m/^\w\w_\w\w\b/>, and
+I<means> something different than a language tag.  A language tag
+denotes a language.  A locale ID denotes a language I<as used in>
+a particular place, in combination with non-linguistic
+location-specific information such as what currency is used
+there.  Locales I<also> often denote character set information,
+as in "en_US.ISO8859-1".
+
+=item *
+
+Language tags are not for computer languages.
+
+=item *
+
+"Dialect" is not a useful term, since there is no objective
+criterion for establishing when two language-forms are
+dialects of eachother, or are separate languages.
+
+=item *
+
+Language tags are not case-sensitive.  en-US, en-us, En-Us, etc.,
+are all the same tag, and denote the same language.
+
+=item *
+
+Not every language tag really refers to a single language.  Some
+language tags refer to conditions: i-default (system-message text
+in English plus maybe other languages), und (undetermined
+language).  Others (notably lots of the three-letter codes) are
+bibliographic tags that classify whole groups of languages, as
+with cus "Cushitic (Other)" (i.e., a
+language that has been classed as Cushtic, but which has no more
+specific code) or the even less linguistically coherent
+sai for "South American Indian (Other)".  Though useful in
+bibliography, B<SUCH TAGS ARE NOT
+FOR GENERAL USE>.  For further guidance, email me.
+
+=item *
+
+Language tags are not country codes.  In fact, they are often
+distinct codes, as with language tag ja for Japanese, and
+ISO 3166 country code C<.jp> for Japan.
+
+=back
+
+=head1 LIST OF LANGUAGES
+
+The first part of each item is the language tag, between
+{...}.  It
+is followed by an English name for the language or language-group.
+Language tags that I judge to be not for general use, are bracketed.
+
+This list is in alphabetical order by English name of the language.
+
+=for reminder
+ The name in the =item line MUST NOT have E<...>'s in it!!
+
+=for woohah START
+
+=over
+
+=item {ab} : Abkhazian
+
+eq Abkhaz
+
+=item {ace} : Achinese
+
+=item {ach} : Acoli
+
+=item {ada} : Adangme
+
+=item {ady} : Adyghe
+
+eq Adygei
+
+=item {aa} : Afar
+
+=item {afh} : Afrihili
+
+(Artificial)
+
+=item {af} : Afrikaans
+
+=item [{afa} : Afro-Asiatic (Other)]
+
+=item {ak} : Akan
+
+(Formerly "aka".)
+
+=item {akk} : Akkadian
+
+(Historical)
+
+=item {sq} : Albanian
+
+=item {ale} : Aleut
+
+=item [{alg} : Algonquian languages]
+
+NOT Algonquin!
+
+=item [{tut} : Altaic (Other)]
+
+=item {am} : Amharic
+
+NOT Aramaic!
+
+=item {i-ami} : Ami
+
+eq Amis.  eq 'Amis.  eq Pangca.
+
+=item [{apa} : Apache languages]
+
+=item {ar} : Arabic
+
+Many forms are mutually un-intelligible in spoken media.
+Notable forms:
+{ar-ae} UAE Arabic;
+{ar-bh} Bahrain Arabic;
+{ar-dz} Algerian Arabic;
+{ar-eg} Egyptian Arabic;
+{ar-iq} Iraqi Arabic;
+{ar-jo} Jordanian Arabic;
+{ar-kw} Kuwait Arabic;
+{ar-lb} Lebanese Arabic;
+{ar-ly} Libyan Arabic;
+{ar-ma} Moroccan Arabic;
+{ar-om} Omani Arabic;
+{ar-qa} Qatari Arabic;
+{ar-sa} Sauda Arabic;
+{ar-sy} Syrian Arabic;
+{ar-tn} Tunisian Arabic;
+{ar-ye} Yemen Arabic.
+
+=item {arc} : Aramaic
+
+NOT Amharic!  NOT Samaritan Aramaic!
+
+=item {arp} : Arapaho
+
+=item {arn} : Araucanian
+
+=item {arw} : Arawak
+
+=item {hy} : Armenian
+
+=item {an} : Aragonese
+
+=item [{art} : Artificial (Other)]
+
+=item {ast} : Asturian
+
+eq Bable.
+
+=item {as} : Assamese
+
+=item [{ath} : Athapascan languages]
+
+eq Athabaskan.  eq Athapaskan.  eq Athabascan.
+
+=item [{aus} : Australian languages]
+
+=item [{map} : Austronesian (Other)]
+
+=item {av} : Avaric
+
+(Formerly "ava".)
+
+=item {ae} : Avestan
+
+eq Zend
+
+=item {awa} : Awadhi
+
+=item {ay} : Aymara
+
+=item {az} : Azerbaijani
+
+eq Azeri
+
+Notable forms:
+{az-Arab} Azerbaijani in Arabic script;
+{az-Cyrl} Azerbaijani in Cyrillic script;
+{az-Latn} Azerbaijani in Latin script.
+
+=item {ban} : Balinese
+
+=item [{bat} : Baltic (Other)]
+
+=item {bal} : Baluchi
+
+=item {bm} : Bambara
+
+(Formerly "bam".)
+
+=item [{bai} : Bamileke languages]
+
+=item {bad} : Banda
+
+=item [{bnt} : Bantu (Other)]
+
+=item {bas} : Basa
+
+=item {ba} : Bashkir
+
+=item {eu} : Basque
+
+=item {btk} : Batak (Indonesia)
+
+=item {bej} : Beja
+
+=item {be} : Belarusian
+
+eq Belarussian.  eq Byelarussian.
+eq Belorussian.  eq Byelorussian.
+eq White Russian.  eq White Ruthenian.
+NOT Ruthenian!
+
+=item {bem} : Bemba
+
+=item {bn} : Bengali
+
+eq Bangla.
+
+=item [{ber} : Berber (Other)]
+
+=item {bho} : Bhojpuri
+
+=item {bh} : Bihari
+
+=item {bik} : Bikol
+
+=item {bin} : Bini
+
+=item {bi} : Bislama
+
+eq Bichelamar.
+
+=item {bs} : Bosnian
+
+=item {bra} : Braj
+
+=item {br} : Breton
+
+=item {bug} : Buginese
+
+=item {bg} : Bulgarian
+
+=item {i-bnn} : Bunun
+
+=item {bua} : Buriat
+
+=item {my} : Burmese
+
+=item {cad} : Caddo
+
+=item {car} : Carib
+
+=item {ca} : Catalan
+
+eq CatalE<aacute>n.  eq Catalonian.
+
+=item [{cau} : Caucasian (Other)]
+
+=item {ceb} : Cebuano
+
+=item [{cel} : Celtic (Other)]
+
+Notable forms:
+{cel-gaulish} Gaulish (Historical)
+
+=item [{cai} : Central American Indian (Other)]
+
+=item {chg} : Chagatai
+
+(Historical?)
+
+=item [{cmc} : Chamic languages]
+
+=item {ch} : Chamorro
+
+=item {ce} : Chechen
+
+=item {chr} : Cherokee
+
+eq Tsalagi
+
+=item {chy} : Cheyenne
+
+=item {chb} : Chibcha
+
+(Historical)  NOT Chibchan (which is a language family).
+
+=item {ny} : Chichewa
+
+eq Nyanja.  eq Chinyanja.
+
+=item {zh} : Chinese
+
+Many forms are mutually un-intelligible in spoken media.
+Notable forms:
+{zh-Hans} Chinese, in simplified script;
+{zh-Hant} Chinese, in traditional script;
+{zh-tw} Taiwan Chinese;
+{zh-cn} PRC Chinese;
+{zh-sg} Singapore Chinese;
+{zh-mo} Macau Chinese;
+{zh-hk} Hong Kong Chinese;
+{zh-guoyu} Mandarin [Putonghua/Guoyu];
+{zh-hakka} Hakka [formerly "i-hakka"];
+{zh-min} Hokkien;
+{zh-min-nan} Southern Hokkien;
+{zh-wuu} Shanghaiese;
+{zh-xiang} Hunanese;
+{zh-gan} Gan;
+{zh-yue} Cantonese.
+
+=for etc
+{i-hakka} Hakka (old tag)
+
+=item {chn} : Chinook Jargon
+
+eq Chinook Wawa.
+
+=item {chp} : Chipewyan
+
+=item {cho} : Choctaw
+
+=item {cu} : Church Slavic
+
+eq Old Church Slavonic.
+
+=item {chk} : Chuukese
+
+eq Trukese.  eq Chuuk.  eq Truk.  eq Ruk.
+
+=item {cv} : Chuvash
+
+=item {cop} : Coptic
+
+=item {kw} : Cornish
+
+=item {co} : Corsican
+
+eq Corse.
+
+=item {cr} : Cree
+
+NOT Creek!  (Formerly "cre".)
+
+=item {mus} : Creek
+
+NOT Cree!
+
+=item [{cpe} : English-based Creoles and pidgins (Other)]
+
+=item [{cpf} : French-based Creoles and pidgins (Other)]
+
+=item [{cpp} : Portuguese-based Creoles and pidgins (Other)]
+
+=item [{crp} : Creoles and pidgins (Other)]
+
+=item {hr} : Croatian
+
+eq Croat.
+
+=item [{cus} : Cushitic (Other)]
+
+=item {cs} : Czech
+
+=item {dak} : Dakota
+
+eq Nakota.  eq Latoka.
+
+=item {da} : Danish
+
+=item {dar} : Dargwa
+
+=item {day} : Dayak
+
+=item {i-default} : Default (Fallthru) Language
+
+Defined in RFC 2277, this is for tagging text
+(which must include English text, and might/should include text
+in other appropriate languages) that is emitted in a context
+where language-negotiation wasn't possible -- in SMTP mail failure
+messages, for example.
+
+=item {del} : Delaware
+
+=item {din} : Dinka
+
+=item {dv} : Divehi
+
+eq Maldivian.  (Formerly "div".)
+
+=item {doi} : Dogri
+
+NOT Dogrib!
+
+=item {dgr} : Dogrib
+
+NOT Dogri!
+
+=item [{dra} : Dravidian (Other)]
+
+=item {dua} : Duala
+
+=item {nl} : Dutch
+
+eq Netherlander.  Notable forms:
+{nl-nl} Netherlands Dutch;
+{nl-be} Belgian Dutch.
+
+=item {dum} : Middle Dutch (ca.1050-1350)
+
+(Historical)
+
+=item {dyu} : Dyula
+
+=item {dz} : Dzongkha
+
+=item {efi} : Efik
+
+=item {egy} : Ancient Egyptian
+
+(Historical)
+
+=item {eka} : Ekajuk
+
+=item {elx} : Elamite
+
+(Historical)
+
+=item {en} : English
+
+Notable forms:
+{en-au} Australian English;
+{en-bz} Belize English;
+{en-ca} Canadian English;
+{en-gb} UK English;
+{en-ie} Irish English;
+{en-jm} Jamaican English;
+{en-nz} New Zealand English;
+{en-ph} Philippine English;
+{en-tt} Trinidad English;
+{en-us} US English;
+{en-za} South African English;
+{en-zw} Zimbabwe English.
+
+=item {enm} : Old English (1100-1500)
+
+(Historical)
+
+=item {ang} : Old English (ca.450-1100)
+
+eq Anglo-Saxon.  (Historical)
+
+=item {i-enochian} : Enochian (Artificial)
+
+=item {myv} : Erzya
+
+=item {eo} : Esperanto
+
+(Artificial)
+
+=item {et} : Estonian
+
+=item {ee} : Ewe
+
+(Formerly "ewe".)
+
+=item {ewo} : Ewondo
+
+=item {fan} : Fang
+
+=item {fat} : Fanti
+
+=item {fo} : Faroese
+
+=item {fj} : Fijian
+
+=item {fi} : Finnish
+
+=item [{fiu} : Finno-Ugrian (Other)]
+
+eq Finno-Ugric.  NOT Ugaritic!
+
+=item {fon} : Fon
+
+=item {fr} : French
+
+Notable forms:
+{fr-fr} France French;
+{fr-be} Belgian French;
+{fr-ca} Canadian French;
+{fr-ch} Swiss French;
+{fr-lu} Luxembourg French;
+{fr-mc} Monaco French.
+
+=item {frm} : Middle French (ca.1400-1600)
+
+(Historical)
+
+=item {fro} : Old French (842-ca.1400)
+
+(Historical)
+
+=item {fy} : Frisian
+
+=item {fur} : Friulian
+
+=item {ff} : Fulah
+
+(Formerly "ful".)
+
+=item {gaa} : Ga
+
+=item {gd} : Scots Gaelic
+
+NOT Scots!
+
+=item {gl} : Gallegan
+
+eq Galician
+
+=item {lg} : Ganda
+
+(Formerly "lug".)
+
+=item {gay} : Gayo
+
+=item {gba} : Gbaya
+
+=item {gez} : Geez
+
+eq Ge'ez
+
+=item {ka} : Georgian
+
+=item {de} : German
+
+Notable forms:
+{de-at} Austrian German;
+{de-be} Belgian German;
+{de-ch} Swiss German;
+{de-de} Germany German;
+{de-li} Liechtenstein German;
+{de-lu} Luxembourg German.
+
+=item {gmh} : Middle High German (ca.1050-1500)
+
+(Historical)
+
+=item {goh} : Old High German (ca.750-1050)
+
+(Historical)
+
+=item [{gem} : Germanic (Other)]
+
+=item {gil} : Gilbertese
+
+=item {gon} : Gondi
+
+=item {gor} : Gorontalo
+
+=item {got} : Gothic
+
+(Historical)
+
+=item {grb} : Grebo
+
+=item {grc} : Ancient Greek
+
+(Historical)  (Until 15th century or so.)
+
+=item {el} : Modern Greek
+
+(Since 15th century or so.)
+
+=item {gn} : Guarani
+
+GuaranE<iacute>
+
+=item {gu} : Gujarati
+
+=item {gwi} : Gwich'in
+
+eq Gwichin
+
+=item {hai} : Haida
+
+=item {ht} : Haitian
+
+eq Haitian Creole
+
+=item {ha} : Hausa
+
+=item {haw} : Hawaiian
+
+Hawai'ian
+
+=item {he} : Hebrew
+
+(Formerly "iw".)
+
+=for etc
+{iw} Hebrew (old tag)
+
+=item {hz} : Herero
+
+=item {hil} : Hiligaynon
+
+=item {him} : Himachali
+
+=item {hi} : Hindi
+
+=item {ho} : Hiri Motu
+
+=item {hit} : Hittite
+
+(Historical)
+
+=item {hmn} : Hmong
+
+=item {hu} : Hungarian
+
+=item {hup} : Hupa
+
+=item {iba} : Iban
+
+=item {is} : Icelandic
+
+=item {io} : Ido
+
+(Artificial)
+
+=item {ig} : Igbo
+
+(Formerly "ibo".)
+
+=item {ijo} : Ijo
+
+=item {ilo} : Iloko
+
+=item [{inc} : Indic (Other)]
+
+=item [{ine} : Indo-European (Other)]
+
+=item {id} : Indonesian
+
+(Formerly "in".)
+
+=for etc
+{in} Indonesian (old tag)
+
+=item {inh} : Ingush
+
+=item {ia} : Interlingua (International Auxiliary Language Association)
+
+(Artificial)  NOT Interlingue!
+
+=item {ie} : Interlingue
+
+(Artificial)  NOT Interlingua!
+
+=item {iu} : Inuktitut
+
+A subform of "Eskimo".
+
+=item {ik} : Inupiaq
+
+A subform of "Eskimo".
+
+=item [{ira} : Iranian (Other)]
+
+=item {ga} : Irish
+
+=item {mga} : Middle Irish (900-1200)
+
+(Historical)
+
+=item {sga} : Old Irish (to 900)
+
+(Historical)
+
+=item [{iro} : Iroquoian languages]
+
+=item {it} : Italian
+
+Notable forms:
+{it-it} Italy Italian;
+{it-ch} Swiss Italian.
+
+=item {ja} : Japanese
+
+(NOT "jp"!)
+
+=item {jv} : Javanese
+
+(Formerly "jw" because of a typo.)
+
+=item {jrb} : Judeo-Arabic
+
+=item {jpr} : Judeo-Persian
+
+=item {kbd} : Kabardian
+
+=item {kab} : Kabyle
+
+=item {kac} : Kachin
+
+=item {kl} : Kalaallisut
+
+eq Greenlandic "Eskimo"
+
+=item {xal} : Kalmyk
+
+=item {kam} : Kamba
+
+=item {kn} : Kannada
+
+eq Kanarese.  NOT Canadian!
+
+=item {kr} : Kanuri
+
+(Formerly "kau".)
+
+=item {krc} : Karachay-Balkar
+
+=item {kaa} : Kara-Kalpak
+
+=item {kar} : Karen
+
+=item {ks} : Kashmiri
+
+=item {csb} : Kashubian
+
+eq Kashub
+
+=item {kaw} : Kawi
+
+=item {kk} : Kazakh
+
+=item {kha} : Khasi
+
+=item {km} : Khmer
+
+eq Cambodian.  eq Kampuchean.
+
+=item [{khi} : Khoisan (Other)]
+
+=item {kho} : Khotanese
+
+=item {ki} : Kikuyu
+
+eq Gikuyu.
+
+=item {kmb} : Kimbundu
+
+=item {rw} : Kinyarwanda
+
+=item {ky} : Kirghiz
+
+=item {i-klingon} : Klingon
+
+=item {kv} : Komi
+
+=item {kg} : Kongo
+
+(Formerly "kon".)
+
+=item {kok} : Konkani
+
+=item {ko} : Korean
+
+=item {kos} : Kosraean
+
+=item {kpe} : Kpelle
+
+=item {kro} : Kru
+
+=item {kj} : Kuanyama
+
+=item {kum} : Kumyk
+
+=item {ku} : Kurdish
+
+=item {kru} : Kurukh
+
+=item {kut} : Kutenai
+
+=item {lad} : Ladino
+
+eq Judeo-Spanish.  NOT Ladin (a minority language in Italy).
+
+=item {lah} : Lahnda
+
+NOT Lamba!
+
+=item {lam} : Lamba
+
+NOT Lahnda!
+
+=item {lo} : Lao
+
+eq Laotian.
+
+=item {la} : Latin
+
+(Historical)  NOT Ladin!  NOT Ladino!
+
+=item {lv} : Latvian
+
+eq Lettish.
+
+=item {lb} : Letzeburgesch
+
+eq Luxemburgian, eq Luxemburger.  (Formerly "i-lux".)
+
+=for etc
+{i-lux} Letzeburgesch (old tag)
+
+=item {lez} : Lezghian
+
+=item {li} : Limburgish
+
+eq Limburger, eq Limburgan.  NOT Letzeburgesch!
+
+=item {ln} : Lingala
+
+=item {lt} : Lithuanian
+
+=item {nds} : Low German
+
+eq Low Saxon.  eq Low German.  eq Low Saxon.
+
+=item {art-lojban} : Lojban (Artificial)
+
+=item {loz} : Lozi
+
+=item {lu} : Luba-Katanga
+
+(Formerly "lub".)
+
+=item {lua} : Luba-Lulua
+
+=item {lui} : Luiseno
+
+eq LuiseE<ntilde>o.
+
+=item {lun} : Lunda
+
+=item {luo} : Luo (Kenya and Tanzania)
+
+=item {lus} : Lushai
+
+=item {mk} : Macedonian
+
+eq the modern Slavic language spoken in what was Yugoslavia.
+NOT the form of Greek spoken in Greek Macedonia!
+
+=item {mad} : Madurese
+
+=item {mag} : Magahi
+
+=item {mai} : Maithili
+
+=item {mak} : Makasar
+
+=item {mg} : Malagasy
+
+=item {ms} : Malay
+
+NOT Malayalam!
+
+=item {ml} : Malayalam
+
+NOT Malay!
+
+=item {mt} : Maltese
+
+=item {mnc} : Manchu
+
+=item {mdr} : Mandar
+
+NOT Mandarin!
+
+=item {man} : Mandingo
+
+=item {mni} : Manipuri
+
+eq Meithei.
+
+=item [{mno} : Manobo languages]
+
+=item {gv} : Manx
+
+=item {mi} : Maori
+
+NOT Mari!
+
+=item {mr} : Marathi
+
+=item {chm} : Mari
+
+NOT Maori!
+
+=item {mh} : Marshall
+
+eq Marshallese.
+
+=item {mwr} : Marwari
+
+=item {mas} : Masai
+
+=item [{myn} : Mayan languages]
+
+=item {men} : Mende
+
+=item {mic} : Micmac
+
+=item {min} : Minangkabau
+
+=item {i-mingo} : Mingo
+
+eq the Irquoian language West Virginia Seneca.  NOT New York Seneca!
+
+=item [{mis} : Miscellaneous languages]
+
+Don't use this.
+
+=item {moh} : Mohawk
+
+=item {mdf} : Moksha
+
+=item {mo} : Moldavian
+
+eq Moldovan.
+
+=item [{mkh} : Mon-Khmer (Other)]
+
+=item {lol} : Mongo
+
+=item {mn} : Mongolian
+
+eq Mongol.
+
+=item {mos} : Mossi
+
+=item [{mul} : Multiple languages]
+
+Not for normal use.
+
+=item [{mun} : Munda languages]
+
+=item {nah} : Nahuatl
+
+=item {nap} : Neapolitan
+
+=item {na} : Nauru
+
+=item {nv} : Navajo
+
+eq Navaho.  (Formerly "i-navajo".)
+
+=for etc
+{i-navajo} Navajo (old tag)
+
+=item {nd} : North Ndebele
+
+=item {nr} : South Ndebele
+
+=item {ng} : Ndonga
+
+=item {ne} : Nepali
+
+eq Nepalese.  Notable forms:
+{ne-np} Nepal Nepali;
+{ne-in} India Nepali.
+
+=item {new} : Newari
+
+=item {nia} : Nias
+
+=item [{nic} : Niger-Kordofanian (Other)]
+
+=item [{ssa} : Nilo-Saharan (Other)]
+
+=item {niu} : Niuean
+
+=item {nog} : Nogai
+
+=item {non} : Old Norse
+
+(Historical)
+
+=item [{nai} : North American Indian]
+
+Do not use this.
+
+=item {no} : Norwegian
+
+Note the two following forms:
+
+=item {nb} : Norwegian Bokmal
+
+eq BokmE<aring>l, (A form of Norwegian.)  (Formerly "no-bok".)
+
+=for etc
+{no-bok} Norwegian Bokmal (old tag)
+
+=item {nn} : Norwegian Nynorsk
+
+(A form of Norwegian.)  (Formerly "no-nyn".)
+
+=for etc
+{no-nyn} Norwegian Nynorsk (old tag)
+
+=item [{nub} : Nubian languages]
+
+=item {nym} : Nyamwezi
+
+=item {nyn} : Nyankole
+
+=item {nyo} : Nyoro
+
+=item {nzi} : Nzima
+
+=item {oc} : Occitan (post 1500)
+
+eq ProvenE<ccedil>al, eq Provencal
+
+=item {oj} : Ojibwa
+
+eq Ojibwe.  (Formerly "oji".)
+
+=item {or} : Oriya
+
+=item {om} : Oromo
+
+=item {osa} : Osage
+
+=item {os} : Ossetian; Ossetic
+
+=item [{oto} : Otomian languages]
+
+Group of languages collectively called "OtomE<iacute>".
+
+=item {pal} : Pahlavi
+
+eq Pahlevi
+
+=item {i-pwn} : Paiwan
+
+eq Pariwan
+
+=item {pau} : Palauan
+
+=item {pi} : Pali
+
+(Historical?)
+
+=item {pam} : Pampanga
+
+=item {pag} : Pangasinan
+
+=item {pa} : Panjabi
+
+eq Punjabi
+
+=item {pap} : Papiamento
+
+eq Papiamentu.
+
+=item [{paa} : Papuan (Other)]
+
+=item {fa} : Persian
+
+eq Farsi.  eq Iranian.
+
+=item {peo} : Old Persian (ca.600-400 B.C.)
+
+=item [{phi} : Philippine (Other)]
+
+=item {phn} : Phoenician
+
+(Historical)
+
+=item {pon} : Pohnpeian
+
+NOT Pompeiian!
+
+=item {pl} : Polish
+
+=item {pt} : Portuguese
+
+eq Portugese.  Notable forms:
+{pt-pt} Portugal Portuguese;
+{pt-br} Brazilian Portuguese.
+
+=item [{pra} : Prakrit languages]
+
+=item {pro} : Old Provencal (to 1500)
+
+eq Old ProvenE<ccedil>al.  (Historical.)
+
+=item {ps} : Pushto
+
+eq Pashto.  eq Pushtu.
+
+=item {qu} : Quechua
+
+eq Quecha.
+
+=item {rm} : Raeto-Romance
+
+eq Romansh.
+
+=item {raj} : Rajasthani
+
+=item {rap} : Rapanui
+
+=item {rar} : Rarotongan
+
+=item [{qaa - qtz} : Reserved for local use.]
+
+=item [{roa} : Romance (Other)]
+
+NOT Romanian!  NOT Romany!  NOT Romansh!
+
+=item {ro} : Romanian
+
+eq Rumanian.  NOT Romany!
+
+=item {rom} : Romany
+
+eq Rom.  NOT Romanian!
+
+=item {rn} : Rundi
+
+=item {ru} : Russian
+
+NOT White Russian!  NOT Rusyn!
+
+=item [{sal} : Salishan languages]
+
+Large language group.
+
+=item {sam} : Samaritan Aramaic
+
+NOT Aramaic!
+
+=item {se} : Northern Sami
+
+eq Lappish.  eq Lapp.  eq (Northern) Saami.
+
+=item {sma} : Southern Sami
+
+=item {smn} : Inari Sami
+
+=item {smj} : Lule Sami
+
+=item {sms} : Skolt Sami
+
+=item [{smi} : Sami languages (Other)]
+
+=item {sm} : Samoan
+
+=item {sad} : Sandawe
+
+=item {sg} : Sango
+
+=item {sa} : Sanskrit
+
+(Historical)
+
+=item {sat} : Santali
+
+=item {sc} : Sardinian
+
+eq Sard.
+
+=item {sas} : Sasak
+
+=item {sco} : Scots
+
+NOT Scots Gaelic!
+
+=item {sel} : Selkup
+
+=item [{sem} : Semitic (Other)]
+
+=item {sr} : Serbian
+
+eq Serb.  NOT Sorbian.
+
+Notable forms:
+{sr-Cyrl} : Serbian in Cyrillic script;
+{sr-Latn} : Serbian in Latin script.
+
+=item {srr} : Serer
+
+=item {shn} : Shan
+
+=item {sn} : Shona
+
+=item {sid} : Sidamo
+
+=item {sgn-...} : Sign Languages
+
+Always use with a subtag.  Notable forms:
+{sgn-gb} British Sign Language (BSL);
+{sgn-ie} Irish Sign Language (ESL);
+{sgn-ni} Nicaraguan Sign Language (ISN);
+{sgn-us} American Sign Language (ASL).
+
+(And so on with other country codes as the subtag.)
+
+=item {bla} : Siksika
+
+eq Blackfoot.  eq Pikanii.
+
+=item {sd} : Sindhi
+
+=item {si} : Sinhalese
+
+eq Sinhala.
+
+=item [{sit} : Sino-Tibetan (Other)]
+
+=item [{sio} : Siouan languages]
+
+=item {den} : Slave (Athapascan)
+
+("Slavey" is a subform.)
+
+=item [{sla} : Slavic (Other)]
+
+=item {sk} : Slovak
+
+eq Slovakian.
+
+=item {sl} : Slovenian
+
+eq Slovene.
+
+=item {sog} : Sogdian
+
+=item {so} : Somali
+
+=item {son} : Songhai
+
+=item {snk} : Soninke
+
+=item {wen} : Sorbian languages
+
+eq Wendish.  eq Sorb.  eq Lusatian.  eq Wend.  NOT Venda!  NOT Serbian!
+
+=item {nso} : Northern Sotho
+
+=item {st} : Southern Sotho
+
+eq Sutu.  eq Sesotho.
+
+=item [{sai} : South American Indian (Other)]
+
+=item {es} : Spanish
+
+Notable forms:
+{es-ar} Argentine Spanish;
+{es-bo} Bolivian Spanish;
+{es-cl} Chilean Spanish;
+{es-co} Colombian Spanish;
+{es-do} Dominican Spanish;
+{es-ec} Ecuadorian Spanish;
+{es-es} Spain Spanish;
+{es-gt} Guatemalan Spanish;
+{es-hn} Honduran Spanish;
+{es-mx} Mexican Spanish;
+{es-pa} Panamanian Spanish;
+{es-pe} Peruvian Spanish;
+{es-pr} Puerto Rican Spanish;
+{es-py} Paraguay Spanish;
+{es-sv} Salvadoran Spanish;
+{es-us} US Spanish;
+{es-uy} Uruguayan Spanish;
+{es-ve} Venezuelan Spanish.
+
+=item {suk} : Sukuma
+
+=item {sux} : Sumerian
+
+(Historical)
+
+=item {su} : Sundanese
+
+=item {sus} : Susu
+
+=item {sw} : Swahili
+
+eq Kiswahili
+
+=item {ss} : Swati
+
+=item {sv} : Swedish
+
+Notable forms:
+{sv-se} Sweden Swedish;
+{sv-fi} Finland Swedish.
+
+=item {syr} : Syriac
+
+=item {tl} : Tagalog
+
+=item {ty} : Tahitian
+
+=item [{tai} : Tai (Other)]
+
+NOT Thai!
+
+=item {tg} : Tajik
+
+=item {tmh} : Tamashek
+
+=item {ta} : Tamil
+
+=item {i-tao} : Tao
+
+eq Yami.
+
+=item {tt} : Tatar
+
+=item {i-tay} : Tayal
+
+eq Atayal.  eq Atayan.
+
+=item {te} : Telugu
+
+=item {ter} : Tereno
+
+=item {tet} : Tetum
+
+=item {th} : Thai
+
+NOT Tai!
+
+=item {bo} : Tibetan
+
+=item {tig} : Tigre
+
+=item {ti} : Tigrinya
+
+=item {tem} : Timne
+
+eq Themne.  eq Timene.
+
+=item {tiv} : Tiv
+
+=item {tli} : Tlingit
+
+=item {tpi} : Tok Pisin
+
+=item {tkl} : Tokelau
+
+=item {tog} : Tonga (Nyasa)
+
+NOT Tsonga!
+
+=item {to} : Tonga (Tonga Islands)
+
+(Pronounced "Tong-a", not "Tong-ga")
+
+NOT Tsonga!
+
+=item {tsi} : Tsimshian
+
+eq Sm'algyax
+
+=item {ts} : Tsonga
+
+NOT Tonga!
+
+=item {i-tsu} : Tsou
+
+=item {tn} : Tswana
+
+Same as Setswana.
+
+=item {tum} : Tumbuka
+
+=item [{tup} : Tupi languages]
+
+=item {tr} : Turkish
+
+(Typically in Roman script)
+
+=item {ota} : Ottoman Turkish (1500-1928)
+
+(Typically in Arabic script)  (Historical)
+
+=item {crh} : Crimean Turkish
+
+eq Crimean Tatar
+
+=item {tk} : Turkmen
+
+eq Turkmeni.
+
+=item {tvl} : Tuvalu
+
+=item {tyv} : Tuvinian
+
+eq Tuvan.  eq Tuvin.
+
+=item {tw} : Twi
+
+=item {udm} : Udmurt
+
+=item {uga} : Ugaritic
+
+NOT Ugric!
+
+=item {ug} : Uighur
+
+=item {uk} : Ukrainian
+
+=item {umb} : Umbundu
+
+=item {und} : Undetermined
+
+Not a tag for normal use.
+
+=item {ur} : Urdu
+
+=item {uz} : Uzbek
+
+eq E<Ouml>zbek
+
+Notable forms:
+{uz-Cyrl} Uzbek in Cyrillic script;
+{uz-Latn} Uzbek in Latin script.
+
+=item {vai} : Vai
+
+=item {ve} : Venda
+
+NOT Wendish!  NOT Wend!  NOT Avestan!  (Formerly "ven".)
+
+=item {vi} : Vietnamese
+
+eq Viet.
+
+=item {vo} : Volapuk
+
+eq VolapE<uuml>k.  (Artificial)
+
+=item {vot} : Votic
+
+eq Votian.  eq Vod.
+
+=item [{wak} : Wakashan languages]
+
+=item {wa} : Walloon
+
+=item {wal} : Walamo
+
+eq Wolaytta.
+
+=item {war} : Waray
+
+Presumably the Philippine language Waray-Waray (SamareE<ntilde>o),
+not the smaller Philippine language Waray Sorsogon, nor the extinct
+Australian language Waray.
+
+=item {was} : Washo
+
+eq Washoe
+
+=item {cy} : Welsh
+
+=item {wo} : Wolof
+
+=item {x-...} : Unregistered (Semi-Private Use)
+
+"x-" is a prefix for language tags that are not registered with ISO
+or IANA.  Example, x-double-dutch
+
+=item {xh} : Xhosa
+
+=item {sah} : Yakut
+
+=item {yao} : Yao
+
+(The Yao in Malawi?)
+
+=item {yap} : Yapese
+
+eq Yap
+
+=item {ii} : Sichuan Yi
+
+=item {yi} : Yiddish
+
+Formerly "ji".  Usually in Hebrew script.
+
+Notable forms:
+{yi-latn} Yiddish in Latin script
+
+=item {yo} : Yoruba
+
+=item [{ypk} : Yupik languages]
+
+Several "Eskimo" languages.
+
+=item {znd} : Zande
+
+=item [{zap} : Zapotec]
+
+(A group of languages.)
+
+=item {zen} : Zenaga
+
+NOT Zend.
+
+=item {za} : Zhuang
+
+=item {zu} : Zulu
+
+=item {zun} : Zuni
+
+eq ZuE<ntilde>i
+
+=back
+
+=for woohah END
+
+=head1 SEE ALSO
+
+L<I18N::LangTags|I18N::LangTags> and its "See Also" section.
+
+=head1 COPYRIGHT AND DISCLAIMER
+
+Copyright (c) 2001+ Sean M. Burke. All rights reserved.
+
+You can redistribute and/or
+modify this document under the same terms as Perl itself.
+
+This document is provided in the hope that it will be
+useful, but without any warranty;
+without even the implied warranty of accuracy, authoritativeness,
+completeness, merchantability, or fitness for a particular purpose.
+
+Email any corrections or questions to me.
+
+=head1 AUTHOR
+
+Sean M. Burke, sburkeE<64>cpan.org
+
+=cut
+
+
+# To generate a list of just the two and three-letter codes:
+
+#!/usr/local/bin/perl -w
+
+require 5; # Time-stamp: "2001-03-13 21:53:39 MST"
+ # Sean M. Burke, sburke@cpan.org
+ # This program is for generating the language_codes.txt file
+use strict;
+use LWP::Simple;
+use HTML::TreeBuilder 3.10;
+my $root = HTML::TreeBuilder->new();
+my $url = 'http://lcweb.loc.gov/standards/iso639-2/bibcodes.html';
+$root->parse(get($url) || die "Can't get $url");
+$root->eof();
+
+my @codes;
+
+foreach my $tr ($root->find_by_tag_name('tr')) {
+  my @f = map $_->as_text(), $tr->content_list();
+  #print map("<$_> ", @f), "\n";
+  next unless @f == 5;
+  pop @f; # nix the French name
+  next if $f[-1] eq 'Language Name (English)'; # it's a header line
+  my $xx = splice(@f, 2,1); # pull out the two-letter code
+  $f[-1] =~ s/^\s+//;
+  $f[-1] =~ s/\s+$//;
+  if($xx =~ m/[a-zA-Z]/) {   # there's a two-letter code for it
+    push   @codes, [ lc($f[-1]),   "$xx\t$f[-1]\n" ];
+  } else { # print the three-letter codes.
+    if($f[0] eq $f[1]) {
+      push @codes, [ lc($f[-1]), "$f[1]\t$f[2]\n" ];
+    } else { # shouldn't happen
+      push @codes, [ lc($f[-1]), "@f !!!!!!!!!!\n" ]; 
+    }
+  }
+}
+
+print map $_->[1], sort {; $a->[0] cmp $b->[0] } @codes;
+print "[ based on $url\n at ", scalar(localtime), "]\n",
+  "[Note: doesn't include IANA-registered codes.]\n";
+exit;
+__END__
+
Index: /for-distributions/trunk/bin/windows/perl/lib/IO.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO.pm	(revision 14489)
@@ -0,0 +1,68 @@
+#
+
+package IO;
+
+use XSLoader ();
+use Carp;
+use strict;
+use warnings;
+
+our $VERSION = "1.22";
+XSLoader::load 'IO', $VERSION;
+
+sub import {
+    shift;
+
+    warnings::warnif('deprecated', qq{Parameterless "use IO" deprecated})
+        if @_ == 0 ;
+    
+    my @l = @_ ? @_ : qw(Handle Seekable File Pipe Socket Dir);
+
+    eval join("", map { "require IO::" . (/(\w+)/)[0] . ";\n" } @l)
+	or croak $@;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO - load various IO modules
+
+=head1 SYNOPSIS
+
+    use IO qw(Handle File);  # loads IO modules, here IO::Handle, IO::File
+    use IO;                  # DEPRECATED
+
+=head1 DESCRIPTION
+
+C<IO> provides a simple mechanism to load several of the IO modules
+in one go.  The IO modules belonging to the core are:
+
+      IO::Handle
+      IO::Seekable
+      IO::File
+      IO::Pipe
+      IO::Socket
+      IO::Dir
+      IO::Select
+      IO::Poll
+
+Some other IO modules don't belong to the perl core but can be loaded
+as well if they have been installed from CPAN.  You can discover which
+ones exist by searching for "^IO::" on http://search.cpan.org.
+
+For more information on any of these modules, please see its respective
+documentation.
+
+=head1 DEPRECATED
+
+    use IO;                # loads all the modules listed below
+
+The loaded modules are IO::Handle, IO::Seekable, IO::File, IO::Pipe,
+IO::Socket, IO::Dir.  You should instead explicitly import the IO
+modules you want.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/IO/Dir.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO/Dir.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO/Dir.pm	(revision 14489)
@@ -0,0 +1,246 @@
+# IO::Dir.pm
+#
+# Copyright (c) 1997-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.
+
+package IO::Dir;
+
+use 5.006;
+
+use strict;
+use Carp;
+use Symbol;
+use Exporter;
+use IO::File;
+our(@ISA, $VERSION, @EXPORT_OK);
+use Tie::Hash;
+use File::stat;
+use File::Spec;
+
+@ISA = qw(Tie::Hash Exporter);
+$VERSION = "1.05";
+$VERSION = eval $VERSION;
+@EXPORT_OK = qw(DIR_UNLINK);
+
+sub DIR_UNLINK () { 1 }
+
+sub new {
+    @_ >= 1 && @_ <= 2 or croak 'usage: new IO::Dir [DIRNAME]';
+    my $class = shift;
+    my $dh = gensym;
+    if (@_) {
+	IO::Dir::open($dh, $_[0])
+	    or return undef;
+    }
+    bless $dh, $class;
+}
+
+sub DESTROY {
+    my ($dh) = @_;
+    closedir($dh);
+}
+
+sub open {
+    @_ == 2 or croak 'usage: $dh->open(DIRNAME)';
+    my ($dh, $dirname) = @_;
+    return undef
+	unless opendir($dh, $dirname);
+    # a dir name should always have a ":" in it; assume dirname is
+    # in current directory
+    $dirname = ':' .  $dirname if ( ($^O eq 'MacOS') && ($dirname !~ /:/) );
+    ${*$dh}{io_dir_path} = $dirname;
+    1;
+}
+
+sub close {
+    @_ == 1 or croak 'usage: $dh->close()';
+    my ($dh) = @_;
+    closedir($dh);
+}
+
+sub read {
+    @_ == 1 or croak 'usage: $dh->read()';
+    my ($dh) = @_;
+    readdir($dh);
+}
+
+sub seek {
+    @_ == 2 or croak 'usage: $dh->seek(POS)';
+    my ($dh,$pos) = @_;
+    seekdir($dh,$pos);
+}
+
+sub tell {
+    @_ == 1 or croak 'usage: $dh->tell()';
+    my ($dh) = @_;
+    telldir($dh);
+}
+
+sub rewind {
+    @_ == 1 or croak 'usage: $dh->rewind()';
+    my ($dh) = @_;
+    rewinddir($dh);
+}
+
+sub TIEHASH {
+    my($class,$dir,$options) = @_;
+
+    my $dh = $class->new($dir)
+	or return undef;
+
+    $options ||= 0;
+
+    ${*$dh}{io_dir_unlink} = $options & DIR_UNLINK;
+    $dh;
+}
+
+sub FIRSTKEY {
+    my($dh) = @_;
+    $dh->rewind;
+    scalar $dh->read;
+}
+
+sub NEXTKEY {
+    my($dh) = @_;
+    scalar $dh->read;
+}
+
+sub EXISTS {
+    my($dh,$key) = @_;
+    -e File::Spec->catfile(${*$dh}{io_dir_path}, $key);
+}
+
+sub FETCH {
+    my($dh,$key) = @_;
+    &lstat(File::Spec->catfile(${*$dh}{io_dir_path}, $key));
+}
+
+sub STORE {
+    my($dh,$key,$data) = @_;
+    my($atime,$mtime) = ref($data) ? @$data : ($data,$data);
+    my $file = File::Spec->catfile(${*$dh}{io_dir_path}, $key);
+    unless(-e $file) {
+	my $io = IO::File->new($file,O_CREAT | O_RDWR);
+	$io->close if $io;
+    }
+    utime($atime,$mtime, $file);
+}
+
+sub DELETE {
+    my($dh,$key) = @_;
+
+    # Only unlink if unlink-ing is enabled
+    return 0
+	unless ${*$dh}{io_dir_unlink};
+
+    my $file = File::Spec->catfile(${*$dh}{io_dir_path}, $key);
+
+    -d $file
+	? rmdir($file)
+	: unlink($file);
+}
+
+1;
+
+__END__
+
+=head1 NAME 
+
+IO::Dir - supply object methods for directory handles
+
+=head1 SYNOPSIS
+
+    use IO::Dir;
+    $d = IO::Dir->new(".");
+    if (defined $d) {
+        while (defined($_ = $d->read)) { something($_); }
+        $d->rewind;
+        while (defined($_ = $d->read)) { something_else($_); }
+        undef $d;
+    }
+
+    tie %dir, 'IO::Dir', ".";
+    foreach (keys %dir) {
+	print $_, " " , $dir{$_}->size,"\n";
+    }
+
+=head1 DESCRIPTION
+
+The C<IO::Dir> package provides two interfaces to perl's directory reading
+routines.
+
+The first interface is an object approach. C<IO::Dir> provides an object
+constructor and methods, which are just wrappers around perl's built in
+directory reading routines.
+
+=over 4
+
+=item new ( [ DIRNAME ] )
+
+C<new> is the constructor for C<IO::Dir> objects. It accepts one optional
+argument which,  if given, C<new> will pass to C<open>
+
+=back
+
+The following methods are wrappers for the directory related functions built
+into perl (the trailing `dir' has been removed from the names). See L<perlfunc>
+for details of these functions.
+
+=over 4
+
+=item open ( DIRNAME )
+
+=item read ()
+
+=item seek ( POS )
+
+=item tell ()
+
+=item rewind ()
+
+=item close ()
+
+=back
+
+C<IO::Dir> also provides an interface to reading directories via a tied
+hash. The tied hash extends the interface beyond just the directory
+reading routines by the use of C<lstat>, from the C<File::stat> package,
+C<unlink>, C<rmdir> and C<utime>.
+
+=over 4
+
+=item tie %hash, 'IO::Dir', DIRNAME [, OPTIONS ]
+
+=back
+
+The keys of the hash will be the names of the entries in the directory. 
+Reading a value from the hash will be the result of calling
+C<File::stat::lstat>.  Deleting an element from the hash will 
+delete the corresponding file or subdirectory,
+provided that C<DIR_UNLINK> is included in the C<OPTIONS>.
+
+Assigning to an entry in the hash will cause the time stamps of the file
+to be modified. If the file does not exist then it will be created. Assigning
+a single integer to a hash element will cause both the access and 
+modification times to be changed to that value. Alternatively a reference to
+an array of two values can be passed. The first array element will be used to
+set the access time and the second element will be used to set the modification
+time.
+
+=head1 SEE ALSO
+
+L<File::stat>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters.  Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-2003 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
Index: /for-distributions/trunk/bin/windows/perl/lib/IO/File.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO/File.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO/File.pm	(revision 14489)
@@ -0,0 +1,208 @@
+#
+
+package IO::File;
+
+=head1 NAME
+
+IO::File - supply object methods for filehandles
+
+=head1 SYNOPSIS
+
+    use IO::File;
+
+    $fh = new IO::File;
+    if ($fh->open("< file")) {
+        print <$fh>;
+        $fh->close;
+    }
+
+    $fh = new IO::File "> file";
+    if (defined $fh) {
+        print $fh "bar\n";
+        $fh->close;
+    }
+
+    $fh = new IO::File "file", "r";
+    if (defined $fh) {
+        print <$fh>;
+        undef $fh;       # automatically closes the file
+    }
+
+    $fh = new IO::File "file", O_WRONLY|O_APPEND;
+    if (defined $fh) {
+        print $fh "corge\n";
+
+        $pos = $fh->getpos;
+        $fh->setpos($pos);
+
+        undef $fh;       # automatically closes the file
+    }
+
+    autoflush STDOUT 1;
+
+=head1 DESCRIPTION
+
+C<IO::File> inherits from C<IO::Handle> and C<IO::Seekable>. It extends
+these classes with methods that are specific to file handles.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( FILENAME [,MODE [,PERMS]] )
+
+Creates an C<IO::File>.  If it receives any parameters, they are passed to
+the method C<open>; if the open fails, the object is destroyed.  Otherwise,
+it is returned to the caller.
+
+=item new_tmpfile
+
+Creates an C<IO::File> opened for read/write on a newly created temporary
+file.  On systems where this is possible, the temporary file is anonymous
+(i.e. it is unlinked after creation, but held open).  If the temporary
+file cannot be created or opened, the C<IO::File> object is destroyed.
+Otherwise, it is returned to the caller.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item open( FILENAME [,MODE [,PERMS]] )
+
+=item open( FILENAME, IOLAYERS )
+
+C<open> accepts one, two or three parameters.  With one parameter,
+it is just a front end for the built-in C<open> function.  With two or three
+parameters, the first parameter is a filename that may include
+whitespace or other special characters, and the second parameter is
+the open mode, optionally followed by a file permission value.
+
+If C<IO::File::open> receives a Perl mode string ("E<gt>", "+E<lt>", etc.)
+or an ANSI C fopen() mode string ("w", "r+", etc.), it uses the basic
+Perl C<open> operator (but protects any special characters).
+
+If C<IO::File::open> is given a numeric mode, it passes that mode
+and the optional permissions value to the Perl C<sysopen> operator.
+The permissions default to 0666.
+
+If C<IO::File::open> is given a mode that includes the C<:> character,
+it passes all the three arguments to the three-argument C<open> operator.
+
+For convenience, C<IO::File> exports the O_XXX constants from the
+Fcntl module, if this module is available.
+
+=item binmode( [LAYER] )
+
+C<binmode> sets C<binmode> on the underlying C<IO> object, as documented
+in C<perldoc -f binmode>.
+
+C<binmode> accepts one optional parameter, which is the layer to be
+passed on to the C<binmode> call.
+
+=back
+
+=head1 NOTE
+
+Some operating systems may perform  C<IO::File::new()> or C<IO::File::open()>
+on a directory without errors.  This behavior is not portable and not
+suggested for use.  Using C<opendir()> and C<readdir()> or C<IO::Dir> are
+suggested instead.
+
+=head1 SEE ALSO
+
+L<perlfunc>, 
+L<perlop/"I/O Operators">,
+L<IO::Handle>,
+L<IO::Seekable>,
+L<IO::Dir>
+
+=head1 HISTORY
+
+Derived from FileHandle.pm by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
+
+=cut
+
+use 5.006_001;
+use strict;
+our($VERSION, @EXPORT, @EXPORT_OK, @ISA);
+use Carp;
+use Symbol;
+use SelectSaver;
+use IO::Seekable;
+use File::Spec;
+
+require Exporter;
+
+@ISA = qw(IO::Handle IO::Seekable Exporter);
+
+$VERSION = "1.13";
+
+@EXPORT = @IO::Seekable::EXPORT;
+
+eval {
+    # Make all Fcntl O_XXX constants available for importing
+    require Fcntl;
+    my @O = grep /^O_/, @Fcntl::EXPORT;
+    Fcntl->import(@O);  # first we import what we want to export
+    push(@EXPORT, @O);
+};
+
+################################################
+## Constructor
+##
+
+sub new {
+    my $type = shift;
+    my $class = ref($type) || $type || "IO::File";
+    @_ >= 0 && @_ <= 3
+	or croak "usage: new $class [FILENAME [,MODE [,PERMS]]]";
+    my $fh = $class->SUPER::new();
+    if (@_) {
+	$fh->open(@_)
+	    or return undef;
+    }
+    $fh;
+}
+
+################################################
+## Open
+##
+
+sub open {
+    @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])';
+    my ($fh, $file) = @_;
+    if (@_ > 2) {
+	my ($mode, $perms) = @_[2, 3];
+	if ($mode =~ /^\d+$/) {
+	    defined $perms or $perms = 0666;
+	    return sysopen($fh, $file, $mode, $perms);
+	} elsif ($mode =~ /:/) {
+	    return open($fh, $mode, $file) if @_ == 3;
+	    croak 'usage: $fh->open(FILENAME, IOLAYERS)';
+	}
+	if (defined($file) && length($file)
+	    && ! File::Spec->file_name_is_absolute($file))
+	{
+	    $file = File::Spec->rel2abs($file);
+	}
+	$file = IO::Handle::_open_mode_string($mode) . " $file\0";
+    }
+    open($fh, $file);
+}
+
+################################################
+## Binmode
+##
+
+sub binmode {
+    ( @_ == 1 or @_ == 2 ) or croak 'usage $fh->binmode([LAYER])';
+
+    my($fh, $layer) = @_;
+
+    return binmode $$fh unless $layer;
+    return binmode $$fh, $layer;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/IO/Handle.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO/Handle.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO/Handle.pm	(revision 14489)
@@ -0,0 +1,625 @@
+package IO::Handle;
+
+=head1 NAME
+
+IO::Handle - supply object methods for I/O handles
+
+=head1 SYNOPSIS
+
+    use IO::Handle;
+
+    $io = new IO::Handle;
+    if ($io->fdopen(fileno(STDIN),"r")) {
+        print $io->getline;
+        $io->close;
+    }
+
+    $io = new IO::Handle;
+    if ($io->fdopen(fileno(STDOUT),"w")) {
+        $io->print("Some text\n");
+    }
+
+    # setvbuf is not available by default on Perls 5.8.0 and later.
+    use IO::Handle '_IOLBF';
+    $io->setvbuf($buffer_var, _IOLBF, 1024);
+
+    undef $io;       # automatically closes the file if it's open
+
+    autoflush STDOUT 1;
+
+=head1 DESCRIPTION
+
+C<IO::Handle> is the base class for all other IO handle classes. It is
+not intended that objects of C<IO::Handle> would be created directly,
+but instead C<IO::Handle> is inherited from by several other classes
+in the IO hierarchy.
+
+If you are reading this documentation, looking for a replacement for
+the C<FileHandle> package, then I suggest you read the documentation
+for C<IO::File> too.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ()
+
+Creates a new C<IO::Handle> object.
+
+=item new_from_fd ( FD, MODE )
+
+Creates an C<IO::Handle> like C<new> does.
+It requires two parameters, which are passed to the method C<fdopen>;
+if the fdopen fails, the object is destroyed. Otherwise, it is returned
+to the caller.
+
+=back
+
+=head1 METHODS
+
+See L<perlfunc> for complete descriptions of each of the following
+supported C<IO::Handle> methods, which are just front ends for the
+corresponding built-in functions:
+
+    $io->close
+    $io->eof
+    $io->fileno
+    $io->format_write( [FORMAT_NAME] )
+    $io->getc
+    $io->read ( BUF, LEN, [OFFSET] )
+    $io->print ( ARGS )
+    $io->printf ( FMT, [ARGS] )
+    $io->stat
+    $io->sysread ( BUF, LEN, [OFFSET] )
+    $io->syswrite ( BUF, [LEN, [OFFSET]] )
+    $io->truncate ( LEN )
+
+See L<perlvar> for complete descriptions of each of the following
+supported C<IO::Handle> methods.  All of them return the previous
+value of the attribute and takes an optional single argument that when
+given will set the value.  If no argument is given the previous value
+is unchanged (except for $io->autoflush will actually turn ON
+autoflush by default).
+
+    $io->autoflush ( [BOOL] )                         $|
+    $io->format_page_number( [NUM] )                  $%
+    $io->format_lines_per_page( [NUM] )               $=
+    $io->format_lines_left( [NUM] )                   $-
+    $io->format_name( [STR] )                         $~
+    $io->format_top_name( [STR] )                     $^
+    $io->input_line_number( [NUM])                    $.
+
+The following methods are not supported on a per-filehandle basis.
+
+    IO::Handle->format_line_break_characters( [STR] ) $:
+    IO::Handle->format_formfeed( [STR])               $^L
+    IO::Handle->output_field_separator( [STR] )       $,
+    IO::Handle->output_record_separator( [STR] )      $\
+
+    IO::Handle->input_record_separator( [STR] )       $/
+
+Furthermore, for doing normal I/O you might need these:
+
+=over 4
+
+=item $io->fdopen ( FD, MODE )
+
+C<fdopen> is like an ordinary C<open> except that its first parameter
+is not a filename but rather a file handle name, an IO::Handle object,
+or a file descriptor number.
+
+=item $io->opened
+
+Returns true if the object is currently a valid file descriptor, false
+otherwise.
+
+=item $io->getline
+
+This works like <$io> described in L<perlop/"I/O Operators">
+except that it's more readable and can be safely called in a
+list context but still returns just one line.  If used as the conditional
++within a C<while> or C-style C<for> loop, however, you will need to
++emulate the functionality of <$io> with C<< defined($_ = $io->getline) >>.
+
+=item $io->getlines
+
+This works like <$io> when called in a list context to read all
+the remaining lines in a file, except that it's more readable.
+It will also croak() if accidentally called in a scalar context.
+
+=item $io->ungetc ( ORD )
+
+Pushes a character with the given ordinal value back onto the given
+handle's input stream.  Only one character of pushback per handle is
+guaranteed.
+
+=item $io->write ( BUF, LEN [, OFFSET ] )
+
+This C<write> is like C<write> found in C, that is it is the
+opposite of read. The wrapper for the perl C<write> function is
+called C<format_write>.
+
+=item $io->error
+
+Returns a true value if the given handle has experienced any errors
+since it was opened or since the last call to C<clearerr>, or if the
+handle is invalid. It only returns false for a valid handle with no
+outstanding errors.
+
+=item $io->clearerr
+
+Clear the given handle's error indicator. Returns -1 if the handle is
+invalid, 0 otherwise.
+
+=item $io->sync
+
+C<sync> synchronizes a file's in-memory state  with  that  on the
+physical medium. C<sync> does not operate at the perlio api level, but
+operates on the file descriptor (similar to sysread, sysseek and
+systell). This means that any data held at the perlio api level will not
+be synchronized. To synchronize data that is buffered at the perlio api
+level you must use the flush method. C<sync> is not implemented on all
+platforms. Returns "0 but true" on success, C<undef> on error, C<undef>
+for an invalid handle. See L<fsync(3c)>.
+
+=item $io->flush
+
+C<flush> causes perl to flush any buffered data at the perlio api level.
+Any unread data in the buffer will be discarded, and any unwritten data
+will be written to the underlying file descriptor. Returns "0 but true"
+on success, C<undef> on error.
+
+=item $io->printflush ( ARGS )
+
+Turns on autoflush, print ARGS and then restores the autoflush status of the
+C<IO::Handle> object. Returns the return value from print.
+
+=item $io->blocking ( [ BOOL ] )
+
+If called with an argument C<blocking> will turn on non-blocking IO if
+C<BOOL> is false, and turn it off if C<BOOL> is true.
+
+C<blocking> will return the value of the previous setting, or the
+current setting if C<BOOL> is not given. 
+
+If an error occurs C<blocking> will return undef and C<$!> will be set.
+
+=back
+
+
+If the C functions setbuf() and/or setvbuf() are available, then
+C<IO::Handle::setbuf> and C<IO::Handle::setvbuf> set the buffering
+policy for an IO::Handle.  The calling sequences for the Perl functions
+are the same as their C counterparts--including the constants C<_IOFBF>,
+C<_IOLBF>, and C<_IONBF> for setvbuf()--except that the buffer parameter
+specifies a scalar variable to use as a buffer. You should only
+change the buffer before any I/O, or immediately after calling flush.
+
+WARNING: The IO::Handle::setvbuf() is not available by default on
+Perls 5.8.0 and later because setvbuf() is rather specific to using
+the stdio library, while Perl prefers the new perlio subsystem instead.
+
+WARNING: A variable used as a buffer by C<setbuf> or C<setvbuf> B<must not
+be modified> in any way until the IO::Handle is closed or C<setbuf> or
+C<setvbuf> is called again, or memory corruption may result! Remember that
+the order of global destruction is undefined, so even if your buffer
+variable remains in scope until program termination, it may be undefined
+before the file IO::Handle is closed. Note that you need to import the
+constants C<_IOFBF>, C<_IOLBF>, and C<_IONBF> explicitly. Like C, setbuf
+returns nothing. setvbuf returns "0 but true", on success, C<undef> on
+failure.
+
+Lastly, there is a special method for working under B<-T> and setuid/gid
+scripts:
+
+=over 4
+
+=item $io->untaint
+
+Marks the object as taint-clean, and as such data read from it will also
+be considered taint-clean. Note that this is a very trusting action to
+take, and appropriate consideration for the data source and potential
+vulnerability should be kept in mind. Returns 0 on success, -1 if setting
+the taint-clean flag failed. (eg invalid handle)
+
+=back
+
+=head1 NOTE
+
+An C<IO::Handle> object is a reference to a symbol/GLOB reference (see
+the C<Symbol> package).  Some modules that
+inherit from C<IO::Handle> may want to keep object related variables
+in the hash table part of the GLOB. In an attempt to prevent modules
+trampling on each other I propose the that any such module should prefix
+its variables with its own name separated by _'s. For example the IO::Socket
+module keeps a C<timeout> variable in 'io_socket_timeout'.
+
+=head1 SEE ALSO
+
+L<perlfunc>, 
+L<perlop/"I/O Operators">,
+L<IO::File>
+
+=head1 BUGS
+
+Due to backwards compatibility, all filehandles resemble objects
+of class C<IO::Handle>, or actually classes derived from that class.
+They actually aren't.  Which means you can't derive your own 
+class from C<IO::Handle> and inherit those methods.
+
+=head1 HISTORY
+
+Derived from FileHandle.pm by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
+
+=cut
+
+use 5.006_001;
+use strict;
+our($VERSION, @EXPORT_OK, @ISA);
+use Carp;
+use Symbol;
+use SelectSaver;
+use IO ();	# Load the XS module
+
+require Exporter;
+@ISA = qw(Exporter);
+
+$VERSION = "1.25";
+$VERSION = eval $VERSION;
+
+@EXPORT_OK = qw(
+    autoflush
+    output_field_separator
+    output_record_separator
+    input_record_separator
+    input_line_number
+    format_page_number
+    format_lines_per_page
+    format_lines_left
+    format_name
+    format_top_name
+    format_line_break_characters
+    format_formfeed
+    format_write
+
+    print
+    printf
+    getline
+    getlines
+
+    printflush
+    flush
+
+    SEEK_SET
+    SEEK_CUR
+    SEEK_END
+    _IOFBF
+    _IOLBF
+    _IONBF
+);
+
+################################################
+## Constructors, destructors.
+##
+
+sub new {
+    my $class = ref($_[0]) || $_[0] || "IO::Handle";
+    @_ == 1 or croak "usage: new $class";
+    my $io = gensym;
+    bless $io, $class;
+}
+
+sub new_from_fd {
+    my $class = ref($_[0]) || $_[0] || "IO::Handle";
+    @_ == 3 or croak "usage: new_from_fd $class FD, MODE";
+    my $io = gensym;
+    shift;
+    IO::Handle::fdopen($io, @_)
+	or return undef;
+    bless $io, $class;
+}
+
+#
+# There is no need for DESTROY to do anything, because when the
+# last reference to an IO object is gone, Perl automatically
+# closes its associated files (if any).  However, to avoid any
+# attempts to autoload DESTROY, we here define it to do nothing.
+#
+sub DESTROY {}
+
+
+################################################
+## Open and close.
+##
+
+sub _open_mode_string {
+    my ($mode) = @_;
+    $mode =~ /^\+?(<|>>?)$/
+      or $mode =~ s/^r(\+?)$/$1</
+      or $mode =~ s/^w(\+?)$/$1>/
+      or $mode =~ s/^a(\+?)$/$1>>/
+      or croak "IO::Handle: bad open mode: $mode";
+    $mode;
+}
+
+sub fdopen {
+    @_ == 3 or croak 'usage: $io->fdopen(FD, MODE)';
+    my ($io, $fd, $mode) = @_;
+    local(*GLOB);
+
+    if (ref($fd) && "".$fd =~ /GLOB\(/o) {
+	# It's a glob reference; Alias it as we cannot get name of anon GLOBs
+	my $n = qualify(*GLOB);
+	*GLOB = *{*$fd};
+	$fd =  $n;
+    } elsif ($fd =~ m#^\d+$#) {
+	# It's an FD number; prefix with "=".
+	$fd = "=$fd";
+    }
+
+    open($io, _open_mode_string($mode) . '&' . $fd)
+	? $io : undef;
+}
+
+sub close {
+    @_ == 1 or croak 'usage: $io->close()';
+    my($io) = @_;
+
+    close($io);
+}
+
+################################################
+## Normal I/O functions.
+##
+
+# flock
+# select
+
+sub opened {
+    @_ == 1 or croak 'usage: $io->opened()';
+    defined fileno($_[0]);
+}
+
+sub fileno {
+    @_ == 1 or croak 'usage: $io->fileno()';
+    fileno($_[0]);
+}
+
+sub getc {
+    @_ == 1 or croak 'usage: $io->getc()';
+    getc($_[0]);
+}
+
+sub eof {
+    @_ == 1 or croak 'usage: $io->eof()';
+    eof($_[0]);
+}
+
+sub print {
+    @_ or croak 'usage: $io->print(ARGS)';
+    my $this = shift;
+    print $this @_;
+}
+
+sub printf {
+    @_ >= 2 or croak 'usage: $io->printf(FMT,[ARGS])';
+    my $this = shift;
+    printf $this @_;
+}
+
+sub getline {
+    @_ == 1 or croak 'usage: $io->getline()';
+    my $this = shift;
+    return scalar <$this>;
+} 
+
+*gets = \&getline;  # deprecated
+
+sub getlines {
+    @_ == 1 or croak 'usage: $io->getlines()';
+    wantarray or
+	croak 'Can\'t call $io->getlines in a scalar context, use $io->getline';
+    my $this = shift;
+    return <$this>;
+}
+
+sub truncate {
+    @_ == 2 or croak 'usage: $io->truncate(LEN)';
+    truncate($_[0], $_[1]);
+}
+
+sub read {
+    @_ == 3 || @_ == 4 or croak 'usage: $io->read(BUF, LEN [, OFFSET])';
+    read($_[0], $_[1], $_[2], $_[3] || 0);
+}
+
+sub sysread {
+    @_ == 3 || @_ == 4 or croak 'usage: $io->sysread(BUF, LEN [, OFFSET])';
+    sysread($_[0], $_[1], $_[2], $_[3] || 0);
+}
+
+sub write {
+    @_ >= 2 && @_ <= 4 or croak 'usage: $io->write(BUF [, LEN [, OFFSET]])';
+    local($\) = "";
+    $_[2] = length($_[1]) unless defined $_[2];
+    print { $_[0] } substr($_[1], $_[3] || 0, $_[2]);
+}
+
+sub syswrite {
+    @_ >= 2 && @_ <= 4 or croak 'usage: $io->syswrite(BUF [, LEN [, OFFSET]])';
+    if (defined($_[2])) {
+	syswrite($_[0], $_[1], $_[2], $_[3] || 0);
+    } else {
+	syswrite($_[0], $_[1]);
+    }
+}
+
+sub stat {
+    @_ == 1 or croak 'usage: $io->stat()';
+    stat($_[0]);
+}
+
+################################################
+## State modification functions.
+##
+
+sub autoflush {
+    my $old = new SelectSaver qualify($_[0], caller);
+    my $prev = $|;
+    $| = @_ > 1 ? $_[1] : 1;
+    $prev;
+}
+
+sub output_field_separator {
+    carp "output_field_separator is not supported on a per-handle basis"
+	if ref($_[0]);
+    my $prev = $,;
+    $, = $_[1] if @_ > 1;
+    $prev;
+}
+
+sub output_record_separator {
+    carp "output_record_separator is not supported on a per-handle basis"
+	if ref($_[0]);
+    my $prev = $\;
+    $\ = $_[1] if @_ > 1;
+    $prev;
+}
+
+sub input_record_separator {
+    carp "input_record_separator is not supported on a per-handle basis"
+	if ref($_[0]);
+    my $prev = $/;
+    $/ = $_[1] if @_ > 1;
+    $prev;
+}
+
+sub input_line_number {
+    local $.;
+    () = tell qualify($_[0], caller) if ref($_[0]);
+    my $prev = $.;
+    $. = $_[1] if @_ > 1;
+    $prev;
+}
+
+sub format_page_number {
+    my $old;
+    $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+    my $prev = $%;
+    $% = $_[1] if @_ > 1;
+    $prev;
+}
+
+sub format_lines_per_page {
+    my $old;
+    $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+    my $prev = $=;
+    $= = $_[1] if @_ > 1;
+    $prev;
+}
+
+sub format_lines_left {
+    my $old;
+    $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+    my $prev = $-;
+    $- = $_[1] if @_ > 1;
+    $prev;
+}
+
+sub format_name {
+    my $old;
+    $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+    my $prev = $~;
+    $~ = qualify($_[1], caller) if @_ > 1;
+    $prev;
+}
+
+sub format_top_name {
+    my $old;
+    $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+    my $prev = $^;
+    $^ = qualify($_[1], caller) if @_ > 1;
+    $prev;
+}
+
+sub format_line_break_characters {
+    carp "format_line_break_characters is not supported on a per-handle basis"
+	if ref($_[0]);
+    my $prev = $:;
+    $: = $_[1] if @_ > 1;
+    $prev;
+}
+
+sub format_formfeed {
+    carp "format_formfeed is not supported on a per-handle basis"
+	if ref($_[0]);
+    my $prev = $^L;
+    $^L = $_[1] if @_ > 1;
+    $prev;
+}
+
+sub formline {
+    my $io = shift;
+    my $picture = shift;
+    local($^A) = $^A;
+    local($\) = "";
+    formline($picture, @_);
+    print $io $^A;
+}
+
+sub format_write {
+    @_ < 3 || croak 'usage: $io->write( [FORMAT_NAME] )';
+    if (@_ == 2) {
+	my ($io, $fmt) = @_;
+	my $oldfmt = $io->format_name($fmt);
+	CORE::write($io);
+	$io->format_name($oldfmt);
+    } else {
+	CORE::write($_[0]);
+    }
+}
+
+# XXX undocumented
+sub fcntl {
+    @_ == 3 || croak 'usage: $io->fcntl( OP, VALUE );';
+    my ($io, $op) = @_;
+    return fcntl($io, $op, $_[2]);
+}
+
+# XXX undocumented
+sub ioctl {
+    @_ == 3 || croak 'usage: $io->ioctl( OP, VALUE );';
+    my ($io, $op) = @_;
+    return ioctl($io, $op, $_[2]);
+}
+
+# this sub is for compatability with older releases of IO that used
+# a sub called constant to detemine if a constant existed -- GMB
+#
+# The SEEK_* and _IO?BF constants were the only constants at that time
+# any new code should just chech defined(&CONSTANT_NAME)
+
+sub constant {
+    no strict 'refs';
+    my $name = shift;
+    (($name =~ /^(SEEK_(SET|CUR|END)|_IO[FLN]BF)$/) && defined &{$name})
+	? &{$name}() : undef;
+}
+
+
+# so that flush.pl can be deprecated
+
+sub printflush {
+    my $io = shift;
+    my $old;
+    $old = new SelectSaver qualify($io, caller) if ref($io);
+    local $| = 1;
+    if(ref($io)) {
+        print $io @_;
+    }
+    else {
+	print @_;
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/IO/Pipe.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO/Pipe.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO/Pipe.pm	(revision 14489)
@@ -0,0 +1,257 @@
+# IO::Pipe.pm
+#
+# Copyright (c) 1996-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.
+
+package IO::Pipe;
+
+use 5.006_001;
+
+use IO::Handle;
+use strict;
+our($VERSION);
+use Carp;
+use Symbol;
+
+$VERSION = "1.13";
+
+sub new {
+    my $type = shift;
+    my $class = ref($type) || $type || "IO::Pipe";
+    @_ == 0 || @_ == 2 or croak "usage: new $class [READFH, WRITEFH]";
+
+    my $me = bless gensym(), $class;
+
+    my($readfh,$writefh) = @_ ? @_ : $me->handles;
+
+    pipe($readfh, $writefh)
+	or return undef;
+
+    @{*$me} = ($readfh, $writefh);
+
+    $me;
+}
+
+sub handles {
+    @_ == 1 or croak 'usage: $pipe->handles()';
+    (IO::Pipe::End->new(), IO::Pipe::End->new());
+}
+
+my $do_spawn = $^O eq 'os2' || $^O eq 'MSWin32';
+
+sub _doit {
+    my $me = shift;
+    my $rw = shift;
+
+    my $pid = $do_spawn ? 0 : fork();
+
+    if($pid) { # Parent
+        return $pid;
+    }
+    elsif(defined $pid) { # Child or spawn
+        my $fh;
+        my $io = $rw ? \*STDIN : \*STDOUT;
+        my ($mode, $save) = $rw ? "r" : "w";
+        if ($do_spawn) {
+          require Fcntl;
+          $save = IO::Handle->new_from_fd($io, $mode);
+	  my $handle = shift;
+          # Close in child:
+	  unless ($^O eq 'MSWin32') {
+            fcntl($handle, Fcntl::F_SETFD(), 1) or croak "fcntl: $!";
+	  }
+          $fh = $rw ? ${*$me}[0] : ${*$me}[1];
+        } else {
+          shift;
+          $fh = $rw ? $me->reader() : $me->writer(); # close the other end
+        }
+        bless $io, "IO::Handle";
+        $io->fdopen($fh, $mode);
+	$fh->close;
+
+        if ($do_spawn) {
+          $pid = eval { system 1, @_ }; # 1 == P_NOWAIT
+          my $err = $!;
+    
+          $io->fdopen($save, $mode);
+          $save->close or croak "Cannot close $!";
+          croak "IO::Pipe: Cannot spawn-NOWAIT: $err" if not $pid or $pid < 0;
+          return $pid;
+        } else {
+          exec @_ or
+            croak "IO::Pipe: Cannot exec: $!";
+        }
+    }
+    else {
+        croak "IO::Pipe: Cannot fork: $!";
+    }
+
+    # NOT Reached
+}
+
+sub reader {
+    @_ >= 1 or croak 'usage: $pipe->reader( [SUB_COMMAND_ARGS] )';
+    my $me = shift;
+
+    return undef
+	unless(ref($me) || ref($me = $me->new));
+
+    my $fh  = ${*$me}[0];
+    my $pid;
+    $pid = $me->_doit(0, $fh, @_)
+        if(@_);
+
+    close ${*$me}[1];
+    bless $me, ref($fh);
+    *$me = *$fh;          # Alias self to handle
+    $me->fdopen($fh->fileno,"r")
+	unless defined($me->fileno);
+    bless $fh;                  # Really wan't un-bless here
+    ${*$me}{'io_pipe_pid'} = $pid
+        if defined $pid;
+
+    $me;
+}
+
+sub writer {
+    @_ >= 1 or croak 'usage: $pipe->writer( [SUB_COMMAND_ARGS] )';
+    my $me = shift;
+
+    return undef
+	unless(ref($me) || ref($me = $me->new));
+
+    my $fh  = ${*$me}[1];
+    my $pid;
+    $pid = $me->_doit(1, $fh, @_)
+        if(@_);
+
+    close ${*$me}[0];
+    bless $me, ref($fh);
+    *$me = *$fh;          # Alias self to handle
+    $me->fdopen($fh->fileno,"w")
+	unless defined($me->fileno);
+    bless $fh;                  # Really wan't un-bless here
+    ${*$me}{'io_pipe_pid'} = $pid
+        if defined $pid;
+
+    $me;
+}
+
+package IO::Pipe::End;
+
+our(@ISA);
+
+@ISA = qw(IO::Handle);
+
+sub close {
+    my $fh = shift;
+    my $r = $fh->SUPER::close(@_);
+
+    waitpid(${*$fh}{'io_pipe_pid'},0)
+	if(defined ${*$fh}{'io_pipe_pid'});
+
+    $r;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Pipe - supply object methods for pipes
+
+=head1 SYNOPSIS
+
+	use IO::Pipe;
+
+	$pipe = new IO::Pipe;
+
+	if($pid = fork()) { # Parent
+	    $pipe->reader();
+
+	    while(<$pipe>) {
+		...
+	    }
+
+	}
+	elsif(defined $pid) { # Child
+	    $pipe->writer();
+
+	    print $pipe ...
+	}
+
+	or
+
+	$pipe = new IO::Pipe;
+
+	$pipe->reader(qw(ls -l));
+
+	while(<$pipe>) {
+	    ...
+	}
+
+=head1 DESCRIPTION
+
+C<IO::Pipe> provides an interface to creating pipes between
+processes.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [READER, WRITER] )
+
+Creates an C<IO::Pipe>, which is a reference to a newly created symbol
+(see the C<Symbol> package). C<IO::Pipe::new> optionally takes two
+arguments, which should be objects blessed into C<IO::Handle>, or a
+subclass thereof. These two objects will be used for the system call
+to C<pipe>. If no arguments are given then method C<handles> is called
+on the new C<IO::Pipe> object.
+
+These two handles are held in the array part of the GLOB until either
+C<reader> or C<writer> is called.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item reader ([ARGS])
+
+The object is re-blessed into a sub-class of C<IO::Handle>, and becomes a
+handle at the reading end of the pipe. If C<ARGS> are given then C<fork>
+is called and C<ARGS> are passed to exec.
+
+=item writer ([ARGS])
+
+The object is re-blessed into a sub-class of C<IO::Handle>, and becomes a
+handle at the writing end of the pipe. If C<ARGS> are given then C<fork>
+is called and C<ARGS> are passed to exec.
+
+=item handles ()
+
+This method is called during construction by C<IO::Pipe::new>
+on the newly created C<IO::Pipe> object. It returns an array of two objects
+blessed into C<IO::Pipe::End>, or a subclass thereof.
+
+=back
+
+=head1 SEE ALSO
+
+L<IO::Handle>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters.  Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996-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.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/IO/Poll.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO/Poll.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO/Poll.pm	(revision 14489)
@@ -0,0 +1,209 @@
+
+# IO::Poll.pm
+#
+# Copyright (c) 1997-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.
+
+package IO::Poll;
+
+use strict;
+use IO::Handle;
+use Exporter ();
+our(@ISA, @EXPORT_OK, @EXPORT, $VERSION);
+
+@ISA = qw(Exporter);
+$VERSION = "0.07";
+
+@EXPORT = qw( POLLIN
+	      POLLOUT
+	      POLLERR
+	      POLLHUP
+	      POLLNVAL
+	    );
+
+@EXPORT_OK = qw(
+ POLLPRI   
+ POLLRDNORM
+ POLLWRNORM
+ POLLRDBAND
+ POLLWRBAND
+ POLLNORM  
+	       );
+
+# [0] maps fd's to requested masks
+# [1] maps fd's to returned  masks
+# [2] maps fd's to handles
+sub new {
+    my $class = shift;
+
+    my $self = bless [{},{},{}], $class;
+
+    $self;
+}
+
+sub mask {
+    my $self = shift;
+    my $io = shift;
+    my $fd = fileno($io);
+    return unless defined $fd;
+    if (@_) {
+	my $mask = shift;
+	if($mask) {
+	  $self->[0]{$fd}{$io} = $mask; # the error events are always returned
+	  $self->[1]{$fd}      = 0;     # output mask
+	  $self->[2]{$io}      = $io;   # remember handle
+	} else {
+          delete $self->[0]{$fd}{$io};
+          unless(%{$self->[0]{$fd}}) {
+            # We no longer have any handles for this FD
+            delete $self->[1]{$fd};
+            delete $self->[0]{$fd};
+          }
+          delete $self->[2]{$io};
+	}
+    }
+    
+    return unless exists $self->[0]{$fd} and exists $self->[0]{$fd}{$io};
+	return $self->[0]{$fd}{$io};
+}
+
+
+sub poll {
+    my($self,$timeout) = @_;
+
+    $self->[1] = {};
+
+    my($fd,$mask,$iom);
+    my @poll = ();
+
+    while(($fd,$iom) = each %{$self->[0]}) {
+	$mask   = 0;
+	$mask  |= $_ for values(%$iom);
+	push(@poll,$fd => $mask);
+    }
+
+    my $ret = @poll ? _poll(defined($timeout) ? $timeout * 1000 : -1,@poll) : 0;
+
+    return $ret
+	unless $ret > 0;
+
+    while(@poll) {
+	my($fd,$got) = splice(@poll,0,2);
+	$self->[1]{$fd} = $got if $got;
+    }
+
+    return $ret;  
+}
+
+sub events {
+    my $self = shift;
+    my $io = shift;
+    my $fd = fileno($io);
+    exists $self->[1]{$fd} and exists $self->[0]{$fd}{$io} 
+                ? $self->[1]{$fd} & ($self->[0]{$fd}{$io}|POLLHUP|POLLERR|POLLNVAL)
+	: 0;
+}
+
+sub remove {
+    my $self = shift;
+    my $io = shift;
+    $self->mask($io,0);
+}
+
+sub handles {
+    my $self = shift;
+    return values %{$self->[2]} unless @_;
+
+    my $events = shift || 0;
+    my($fd,$ev,$io,$mask);
+    my @handles = ();
+
+    while(($fd,$ev) = each %{$self->[1]}) {
+	while (($io,$mask) = each %{$self->[0]{$fd}}) {
+	    $mask |= POLLHUP|POLLERR|POLLNVAL;  # must allow these
+	    push @handles,$self->[2]{$io} if ($ev & $mask) & $events;
+	}
+    }
+    return @handles;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Poll - Object interface to system poll call
+
+=head1 SYNOPSIS
+
+    use IO::Poll qw(POLLRDNORM POLLWRNORM POLLIN POLLHUP);
+
+    $poll = new IO::Poll;
+
+    $poll->mask($input_handle => POLLIN);
+    $poll->mask($output_handle => POLLOUT);
+
+    $poll->poll($timeout);
+
+    $ev = $poll->events($input);
+
+=head1 DESCRIPTION
+
+C<IO::Poll> is a simple interface to the system level poll routine.
+
+=head1 METHODS
+
+=over 4
+
+=item mask ( IO [, EVENT_MASK ] )
+
+If EVENT_MASK is given, then, if EVENT_MASK is non-zero, IO is added to the
+list of file descriptors and the next call to poll will check for
+any event specified in EVENT_MASK. If EVENT_MASK is zero then IO will be
+removed from the list of file descriptors.
+
+If EVENT_MASK is not given then the return value will be the current
+event mask value for IO.
+
+=item poll ( [ TIMEOUT ] )
+
+Call the system level poll routine. If TIMEOUT is not specified then the
+call will block. Returns the number of handles which had events
+happen, or -1 on error.
+
+=item events ( IO )
+
+Returns the event mask which represents the events that happened on IO
+during the last call to C<poll>.
+
+=item remove ( IO )
+
+Remove IO from the list of file descriptors for the next poll.
+
+=item handles( [ EVENT_MASK ] )
+
+Returns a list of handles. If EVENT_MASK is not given then a list of all
+handles known will be returned. If EVENT_MASK is given then a list
+of handles will be returned which had one of the events specified by
+EVENT_MASK happen during the last call ti C<poll>
+
+=back
+
+=head1 SEE ALSO
+
+L<poll(2)>, L<IO::Handle>, L<IO::Select>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters.  Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-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.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/IO/Seekable.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO/Seekable.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO/Seekable.pm	(revision 14489)
@@ -0,0 +1,128 @@
+#
+
+package IO::Seekable;
+
+=head1 NAME
+
+IO::Seekable - supply seek based methods for I/O objects
+
+=head1 SYNOPSIS
+
+    use IO::Seekable;
+    package IO::Something;
+    @ISA = qw(IO::Seekable);
+
+=head1 DESCRIPTION
+
+C<IO::Seekable> does not have a constructor of its own as it is intended to
+be inherited by other C<IO::Handle> based objects. It provides methods
+which allow seeking of the file descriptors.
+
+=over 4
+
+=item $io->getpos
+
+Returns an opaque value that represents the current position of the
+IO::File, or C<undef> if this is not possible (eg an unseekable stream such
+as a terminal, pipe or socket). If the fgetpos() function is available in
+your C library it is used to implements getpos, else perl emulates getpos
+using C's ftell() function.
+
+=item $io->setpos
+
+Uses the value of a previous getpos call to return to a previously visited
+position. Returns "0 but true" on success, C<undef> on failure.
+
+=back
+
+See L<perlfunc> for complete descriptions of each of the following
+supported C<IO::Seekable> methods, which are just front ends for the
+corresponding built-in functions:
+
+=over 4
+
+=item $io->seek ( POS, WHENCE )
+
+Seek the IO::File to position POS, relative to WHENCE:
+
+=over 8
+
+=item WHENCE=0 (SEEK_SET)
+
+POS is absolute position. (Seek relative to the start of the file)
+
+=item WHENCE=1 (SEEK_CUR)
+
+POS is an offset from the current position. (Seek relative to current)
+
+=item WHENCE=2 (SEEK_END)
+
+POS is an offset from the end of the file. (Seek relative to end)
+
+=back
+
+The SEEK_* constants can be imported from the C<Fcntl> module if you
+don't wish to use the numbers C<0> C<1> or C<2> in your code.
+
+Returns C<1> upon success, C<0> otherwise.
+
+=item $io->sysseek( POS, WHENCE )
+
+Similar to $io->seek, but sets the IO::File's position using the system
+call lseek(2) directly, so will confuse most perl IO operators except
+sysread and syswrite (see L<perlfunc> for full details)
+
+Returns the new position, or C<undef> on failure.  A position
+of zero is returned as the string C<"0 but true">
+
+=item $io->tell
+
+Returns the IO::File's current position, or -1 on error.
+
+=back
+
+=head1 SEE ALSO
+
+L<perlfunc>, 
+L<perlop/"I/O Operators">,
+L<IO::Handle>
+L<IO::File>
+
+=head1 HISTORY
+
+Derived from FileHandle.pm by Graham Barr E<lt>gbarr@pobox.comE<gt>
+
+=cut
+
+use 5.006_001;
+use Carp;
+use strict;
+our($VERSION, @EXPORT, @ISA);
+use IO::Handle ();
+# XXX we can't get these from IO::Handle or we'll get prototype
+# mismatch warnings on C<use POSIX; use IO::File;> :-(
+use Fcntl qw(SEEK_SET SEEK_CUR SEEK_END);
+require Exporter;
+
+@EXPORT = qw(SEEK_SET SEEK_CUR SEEK_END);
+@ISA = qw(Exporter);
+
+$VERSION = "1.10";
+$VERSION = eval $VERSION;
+
+sub seek {
+    @_ == 3 or croak 'usage: $io->seek(POS, WHENCE)';
+    seek($_[0], $_[1], $_[2]);
+}
+
+sub sysseek {
+    @_ == 3 or croak 'usage: $io->sysseek(POS, WHENCE)';
+    sysseek($_[0], $_[1], $_[2]);
+}
+
+sub tell {
+    @_ == 1 or croak 'usage: $io->tell()';
+    tell($_[0]);
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/IO/Select.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO/Select.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO/Select.pm	(revision 14489)
@@ -0,0 +1,381 @@
+# IO::Select.pm
+#
+# Copyright (c) 1997-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.
+
+package IO::Select;
+
+use     strict;
+use warnings::register;
+use     vars qw($VERSION @ISA);
+require Exporter;
+
+$VERSION = "1.17";
+
+@ISA = qw(Exporter); # This is only so we can do version checking
+
+sub VEC_BITS () {0}
+sub FD_COUNT () {1}
+sub FIRST_FD () {2}
+
+sub new
+{
+ my $self = shift;
+ my $type = ref($self) || $self;
+
+ my $vec = bless [undef,0], $type;
+
+ $vec->add(@_)
+    if @_;
+
+ $vec;
+}
+
+sub add
+{
+ shift->_update('add', @_);
+}
+
+
+sub remove
+{
+ shift->_update('remove', @_);
+}
+
+
+sub exists
+{
+ my $vec = shift;
+ my $fno = $vec->_fileno(shift);
+ return undef unless defined $fno;
+ $vec->[$fno + FIRST_FD];
+}
+
+
+sub _fileno
+{
+ my($self, $f) = @_;
+ return unless defined $f;
+ $f = $f->[0] if ref($f) eq 'ARRAY';
+ ($f =~ /^\d+$/) ? $f : fileno($f);
+}
+
+sub _update
+{
+ my $vec = shift;
+ my $add = shift eq 'add';
+
+ my $bits = $vec->[VEC_BITS];
+ $bits = '' unless defined $bits;
+
+ my $count = 0;
+ my $f;
+ foreach $f (@_)
+  {
+   my $fn = $vec->_fileno($f);
+   next unless defined $fn;
+   my $i = $fn + FIRST_FD;
+   if ($add) {
+     if (defined $vec->[$i]) {
+	 $vec->[$i] = $f;  # if array rest might be different, so we update
+	 next;
+     }
+     $vec->[FD_COUNT]++;
+     vec($bits, $fn, 1) = 1;
+     $vec->[$i] = $f;
+   } else {      # remove
+     next unless defined $vec->[$i];
+     $vec->[FD_COUNT]--;
+     vec($bits, $fn, 1) = 0;
+     $vec->[$i] = undef;
+   }
+   $count++;
+  }
+ $vec->[VEC_BITS] = $vec->[FD_COUNT] ? $bits : undef;
+ $count;
+}
+
+sub can_read
+{
+ my $vec = shift;
+ my $timeout = shift;
+ my $r = $vec->[VEC_BITS];
+
+ defined($r) && (select($r,undef,undef,$timeout) > 0)
+    ? handles($vec, $r)
+    : ();
+}
+
+sub can_write
+{
+ my $vec = shift;
+ my $timeout = shift;
+ my $w = $vec->[VEC_BITS];
+
+ defined($w) && (select(undef,$w,undef,$timeout) > 0)
+    ? handles($vec, $w)
+    : ();
+}
+
+sub has_exception
+{
+ my $vec = shift;
+ my $timeout = shift;
+ my $e = $vec->[VEC_BITS];
+
+ defined($e) && (select(undef,undef,$e,$timeout) > 0)
+    ? handles($vec, $e)
+    : ();
+}
+
+sub has_error
+{
+ warnings::warn("Call to deprecated method 'has_error', use 'has_exception'")
+	if warnings::enabled();
+ goto &has_exception;
+}
+
+sub count
+{
+ my $vec = shift;
+ $vec->[FD_COUNT];
+}
+
+sub bits
+{
+ my $vec = shift;
+ $vec->[VEC_BITS];
+}
+
+sub as_string  # for debugging
+{
+ my $vec = shift;
+ my $str = ref($vec) . ": ";
+ my $bits = $vec->bits;
+ my $count = $vec->count;
+ $str .= defined($bits) ? unpack("b*", $bits) : "undef";
+ $str .= " $count";
+ my @handles = @$vec;
+ splice(@handles, 0, FIRST_FD);
+ for (@handles) {
+     $str .= " " . (defined($_) ? "$_" : "-");
+ }
+ $str;
+}
+
+sub _max
+{
+ my($a,$b,$c) = @_;
+ $a > $b
+    ? $a > $c
+        ? $a
+        : $c
+    : $b > $c
+        ? $b
+        : $c;
+}
+
+sub select
+{
+ shift
+   if defined $_[0] && !ref($_[0]);
+
+ my($r,$w,$e,$t) = @_;
+ my @result = ();
+
+ my $rb = defined $r ? $r->[VEC_BITS] : undef;
+ my $wb = defined $w ? $w->[VEC_BITS] : undef;
+ my $eb = defined $e ? $e->[VEC_BITS] : undef;
+
+ if(select($rb,$wb,$eb,$t) > 0)
+  {
+   my @r = ();
+   my @w = ();
+   my @e = ();
+   my $i = _max(defined $r ? scalar(@$r)-1 : 0,
+                defined $w ? scalar(@$w)-1 : 0,
+                defined $e ? scalar(@$e)-1 : 0);
+
+   for( ; $i >= FIRST_FD ; $i--)
+    {
+     my $j = $i - FIRST_FD;
+     push(@r, $r->[$i])
+        if defined $rb && defined $r->[$i] && vec($rb, $j, 1);
+     push(@w, $w->[$i])
+        if defined $wb && defined $w->[$i] && vec($wb, $j, 1);
+     push(@e, $e->[$i])
+        if defined $eb && defined $e->[$i] && vec($eb, $j, 1);
+    }
+
+   @result = (\@r, \@w, \@e);
+  }
+ @result;
+}
+
+
+sub handles
+{
+ my $vec = shift;
+ my $bits = shift;
+ my @h = ();
+ my $i;
+ my $max = scalar(@$vec) - 1;
+
+ for ($i = FIRST_FD; $i <= $max; $i++)
+  {
+   next unless defined $vec->[$i];
+   push(@h, $vec->[$i])
+      if !defined($bits) || vec($bits, $i - FIRST_FD, 1);
+  }
+ 
+ @h;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+IO::Select - OO interface to the select system call
+
+=head1 SYNOPSIS
+
+    use IO::Select;
+
+    $s = IO::Select->new();
+
+    $s->add(\*STDIN);
+    $s->add($some_handle);
+
+    @ready = $s->can_read($timeout);
+
+    @ready = IO::Select->new(@handles)->can_read(0);
+
+=head1 DESCRIPTION
+
+The C<IO::Select> package implements an object approach to the system C<select>
+function call. It allows the user to see what IO handles, see L<IO::Handle>,
+are ready for reading, writing or have an exception pending.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ HANDLES ] )
+
+The constructor creates a new object and optionally initialises it with a set
+of handles.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item add ( HANDLES )
+
+Add the list of handles to the C<IO::Select> object. It is these values that
+will be returned when an event occurs. C<IO::Select> keeps these values in a
+cache which is indexed by the C<fileno> of the handle, so if more than one
+handle with the same C<fileno> is specified then only the last one is cached.
+
+Each handle can be an C<IO::Handle> object, an integer or an array
+reference where the first element is an C<IO::Handle> or an integer.
+
+=item remove ( HANDLES )
+
+Remove all the given handles from the object. This method also works
+by the C<fileno> of the handles. So the exact handles that were added
+need not be passed, just handles that have an equivalent C<fileno>
+
+=item exists ( HANDLE )
+
+Returns a true value (actually the handle itself) if it is present.
+Returns undef otherwise.
+
+=item handles
+
+Return an array of all registered handles.
+
+=item can_read ( [ TIMEOUT ] )
+
+Return an array of handles that are ready for reading. C<TIMEOUT> is
+the maximum amount of time to wait before returning an empty list, in
+seconds, possibly fractional. If C<TIMEOUT> is not given and any
+handles are registered then the call will block.
+
+=item can_write ( [ TIMEOUT ] )
+
+Same as C<can_read> except check for handles that can be written to.
+
+=item has_exception ( [ TIMEOUT ] )
+
+Same as C<can_read> except check for handles that have an exception
+condition, for example pending out-of-band data.
+
+=item count ()
+
+Returns the number of handles that the object will check for when
+one of the C<can_> methods is called or the object is passed to
+the C<select> static method.
+
+=item bits()
+
+Return the bit string suitable as argument to the core select() call.
+
+=item select ( READ, WRITE, EXCEPTION [, TIMEOUT ] )
+
+C<select> is a static method, that is you call it with the package name
+like C<new>. C<READ>, C<WRITE> and C<EXCEPTION> are either C<undef> or
+C<IO::Select> objects. C<TIMEOUT> is optional and has the same effect as
+for the core select call.
+
+The result will be an array of 3 elements, each a reference to an array
+which will hold the handles that are ready for reading, writing and have
+exceptions respectively. Upon error an empty list is returned.
+
+=back
+
+=head1 EXAMPLE
+
+Here is a short example which shows how C<IO::Select> could be used
+to write a server which communicates with several sockets while also
+listening for more connections on a listen socket
+
+    use IO::Select;
+    use IO::Socket;
+
+    $lsn = new IO::Socket::INET(Listen => 1, LocalPort => 8080);
+    $sel = new IO::Select( $lsn );
+
+    while(@ready = $sel->can_read) {
+        foreach $fh (@ready) {
+            if($fh == $lsn) {
+                # Create a new socket
+                $new = $lsn->accept;
+                $sel->add($new);
+            }
+            else {
+                # Process socket
+
+                # Maybe we have finished with the socket
+                $sel->remove($fh);
+                $fh->close;
+            }
+        }
+    }
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters.  Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-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.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/IO/Socket.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO/Socket.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO/Socket.pm	(revision 14489)
@@ -0,0 +1,476 @@
+# IO::Socket.pm
+#
+# Copyright (c) 1997-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.
+
+package IO::Socket;
+
+require 5.006;
+
+use IO::Handle;
+use Socket 1.3;
+use Carp;
+use strict;
+our(@ISA, $VERSION, @EXPORT_OK);
+use Exporter;
+use Errno;
+
+# legacy
+
+require IO::Socket::INET;
+require IO::Socket::UNIX if ($^O ne 'epoc' && $^O ne 'symbian');
+
+@ISA = qw(IO::Handle);
+
+$VERSION = "1.29";
+
+@EXPORT_OK = qw(sockatmark);
+
+sub import {
+    my $pkg = shift;
+    if (@_ && $_[0] eq 'sockatmark') { # not very extensible but for now, fast
+	Exporter::export_to_level('IO::Socket', 1, $pkg, 'sockatmark');
+    } else {
+	my $callpkg = caller;
+	Exporter::export 'Socket', $callpkg, @_;
+    }
+}
+
+sub new {
+    my($class,%arg) = @_;
+    my $sock = $class->SUPER::new();
+
+    $sock->autoflush(1);
+
+    ${*$sock}{'io_socket_timeout'} = delete $arg{Timeout};
+
+    return scalar(%arg) ? $sock->configure(\%arg)
+			: $sock;
+}
+
+my @domain2pkg;
+
+sub register_domain {
+    my($p,$d) = @_;
+    $domain2pkg[$d] = $p;
+}
+
+sub configure {
+    my($sock,$arg) = @_;
+    my $domain = delete $arg->{Domain};
+
+    croak 'IO::Socket: Cannot configure a generic socket'
+	unless defined $domain;
+
+    croak "IO::Socket: Unsupported socket domain"
+	unless defined $domain2pkg[$domain];
+
+    croak "IO::Socket: Cannot configure socket in domain '$domain'"
+	unless ref($sock) eq "IO::Socket";
+
+    bless($sock, $domain2pkg[$domain]);
+    $sock->configure($arg);
+}
+
+sub socket {
+    @_ == 4 or croak 'usage: $sock->socket(DOMAIN, TYPE, PROTOCOL)';
+    my($sock,$domain,$type,$protocol) = @_;
+
+    socket($sock,$domain,$type,$protocol) or
+    	return undef;
+
+    ${*$sock}{'io_socket_domain'} = $domain;
+    ${*$sock}{'io_socket_type'}   = $type;
+    ${*$sock}{'io_socket_proto'}  = $protocol;
+
+    $sock;
+}
+
+sub socketpair {
+    @_ == 4 || croak 'usage: IO::Socket->socketpair(DOMAIN, TYPE, PROTOCOL)';
+    my($class,$domain,$type,$protocol) = @_;
+    my $sock1 = $class->new();
+    my $sock2 = $class->new();
+
+    socketpair($sock1,$sock2,$domain,$type,$protocol) or
+    	return ();
+
+    ${*$sock1}{'io_socket_type'}  = ${*$sock2}{'io_socket_type'}  = $type;
+    ${*$sock1}{'io_socket_proto'} = ${*$sock2}{'io_socket_proto'} = $protocol;
+
+    ($sock1,$sock2);
+}
+
+sub connect {
+    @_ == 2 or croak 'usage: $sock->connect(NAME)';
+    my $sock = shift;
+    my $addr = shift;
+    my $timeout = ${*$sock}{'io_socket_timeout'};
+    my $err;
+    my $blocking;
+
+    $blocking = $sock->blocking(0) if $timeout;
+    if (!connect($sock, $addr)) {
+	if (defined $timeout && $!{EINPROGRESS}) {
+	    require IO::Select;
+
+	    my $sel = new IO::Select $sock;
+
+	    if (!$sel->can_write($timeout)) {
+		$err = $! || (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
+		$@ = "connect: timeout";
+	    }
+	    elsif (!connect($sock,$addr) && not $!{EISCONN}) {
+		# Some systems refuse to re-connect() to
+		# an already open socket and set errno to EISCONN.
+		$err = $!;
+		$@ = "connect: $!";
+	    }
+	}
+        elsif ($blocking || !$!{EINPROGRESS})  {
+	    $err = $!;
+	    $@ = "connect: $!";
+	}
+    }
+
+    $sock->blocking(1) if $blocking;
+
+    $! = $err if $err;
+
+    $err ? undef : $sock;
+}
+
+sub bind {
+    @_ == 2 or croak 'usage: $sock->bind(NAME)';
+    my $sock = shift;
+    my $addr = shift;
+
+    return bind($sock, $addr) ? $sock
+			      : undef;
+}
+
+sub listen {
+    @_ >= 1 && @_ <= 2 or croak 'usage: $sock->listen([QUEUE])';
+    my($sock,$queue) = @_;
+    $queue = 5
+	unless $queue && $queue > 0;
+
+    return listen($sock, $queue) ? $sock
+				 : undef;
+}
+
+sub accept {
+    @_ == 1 || @_ == 2 or croak 'usage $sock->accept([PKG])';
+    my $sock = shift;
+    my $pkg = shift || $sock;
+    my $timeout = ${*$sock}{'io_socket_timeout'};
+    my $new = $pkg->new(Timeout => $timeout);
+    my $peer = undef;
+
+    if(defined $timeout) {
+	require IO::Select;
+
+	my $sel = new IO::Select $sock;
+
+	unless ($sel->can_read($timeout)) {
+	    $@ = 'accept: timeout';
+	    $! = (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
+	    return;
+	}
+    }
+
+    $peer = accept($new,$sock)
+	or return;
+
+    return wantarray ? ($new, $peer)
+    	      	     : $new;
+}
+
+sub sockname {
+    @_ == 1 or croak 'usage: $sock->sockname()';
+    getsockname($_[0]);
+}
+
+sub peername {
+    @_ == 1 or croak 'usage: $sock->peername()';
+    my($sock) = @_;
+    getpeername($sock)
+      || ${*$sock}{'io_socket_peername'}
+      || undef;
+}
+
+sub connected {
+    @_ == 1 or croak 'usage: $sock->connected()';
+    my($sock) = @_;
+    getpeername($sock);
+}
+
+sub send {
+    @_ >= 2 && @_ <= 4 or croak 'usage: $sock->send(BUF, [FLAGS, [TO]])';
+    my $sock  = $_[0];
+    my $flags = $_[2] || 0;
+    my $peer  = $_[3] || $sock->peername;
+
+    croak 'send: Cannot determine peer address'
+	 unless($peer);
+
+    my $r = defined(getpeername($sock))
+	? send($sock, $_[1], $flags)
+	: send($sock, $_[1], $flags, $peer);
+
+    # remember who we send to, if it was successful
+    ${*$sock}{'io_socket_peername'} = $peer
+	if(@_ == 4 && defined $r);
+
+    $r;
+}
+
+sub recv {
+    @_ == 3 || @_ == 4 or croak 'usage: $sock->recv(BUF, LEN [, FLAGS])';
+    my $sock  = $_[0];
+    my $len   = $_[2];
+    my $flags = $_[3] || 0;
+
+    # remember who we recv'd from
+    ${*$sock}{'io_socket_peername'} = recv($sock, $_[1]='', $len, $flags);
+}
+
+sub shutdown {
+    @_ == 2 or croak 'usage: $sock->shutdown(HOW)';
+    my($sock, $how) = @_;
+    shutdown($sock, $how);
+}
+
+sub setsockopt {
+    @_ == 4 or croak '$sock->setsockopt(LEVEL, OPTNAME)';
+    setsockopt($_[0],$_[1],$_[2],$_[3]);
+}
+
+my $intsize = length(pack("i",0));
+
+sub getsockopt {
+    @_ == 3 or croak '$sock->getsockopt(LEVEL, OPTNAME)';
+    my $r = getsockopt($_[0],$_[1],$_[2]);
+    # Just a guess
+    $r = unpack("i", $r)
+	if(defined $r && length($r) == $intsize);
+    $r;
+}
+
+sub sockopt {
+    my $sock = shift;
+    @_ == 1 ? $sock->getsockopt(SOL_SOCKET,@_)
+	    : $sock->setsockopt(SOL_SOCKET,@_);
+}
+
+sub atmark {
+    @_ == 1 or croak 'usage: $sock->atmark()';
+    my($sock) = @_;
+    sockatmark($sock);
+}
+
+sub timeout {
+    @_ == 1 || @_ == 2 or croak 'usage: $sock->timeout([VALUE])';
+    my($sock,$val) = @_;
+    my $r = ${*$sock}{'io_socket_timeout'};
+
+    ${*$sock}{'io_socket_timeout'} = defined $val ? 0 + $val : $val
+	if(@_ == 2);
+
+    $r;
+}
+
+sub sockdomain {
+    @_ == 1 or croak 'usage: $sock->sockdomain()';
+    my $sock = shift;
+    ${*$sock}{'io_socket_domain'};
+}
+
+sub socktype {
+    @_ == 1 or croak 'usage: $sock->socktype()';
+    my $sock = shift;
+    ${*$sock}{'io_socket_type'}
+}
+
+sub protocol {
+    @_ == 1 or croak 'usage: $sock->protocol()';
+    my($sock) = @_;
+    ${*$sock}{'io_socket_proto'};
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Socket - Object interface to socket communications
+
+=head1 SYNOPSIS
+
+    use IO::Socket;
+
+=head1 DESCRIPTION
+
+C<IO::Socket> provides an object interface to creating and using sockets. It
+is built upon the L<IO::Handle> interface and inherits all the methods defined
+by L<IO::Handle>.
+
+C<IO::Socket> only defines methods for those operations which are common to all
+types of socket. Operations which are specified to a socket in a particular 
+domain have methods defined in sub classes of C<IO::Socket>
+
+C<IO::Socket> will export all functions (and constants) defined by L<Socket>.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ARGS] )
+
+Creates an C<IO::Socket>, which is a reference to a
+newly created symbol (see the C<Symbol> package). C<new>
+optionally takes arguments, these arguments are in key-value pairs.
+C<new> only looks for one key C<Domain> which tells new which domain
+the socket will be in. All other arguments will be passed to the
+configuration method of the package for that domain, See below.
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+As of VERSION 1.18 all IO::Socket objects have autoflush turned on
+by default. This was not the case with earlier releases.
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+=back
+
+=head1 METHODS
+
+See L<perlfunc> for complete descriptions of each of the following
+supported C<IO::Socket> methods, which are just front ends for the
+corresponding built-in functions:
+
+    socket
+    socketpair
+    bind
+    listen
+    accept
+    send
+    recv
+    peername (getpeername)
+    sockname (getsockname)
+    shutdown
+
+Some methods take slightly different arguments to those defined in L<perlfunc>
+in attempt to make the interface more flexible. These are
+
+=over 4
+
+=item accept([PKG])
+
+perform the system call C<accept> on the socket and return a new
+object. The new object will be created in the same class as the listen
+socket, unless C<PKG> is specified. This object can be used to
+communicate with the client that was trying to connect.
+
+In a scalar context the new socket is returned, or undef upon
+failure. In a list context a two-element array is returned containing
+the new socket and the peer address; the list will be empty upon
+failure.
+
+The timeout in the [PKG] can be specified as zero to effect a "poll",
+but you shouldn't do that because a new IO::Select object will be
+created behind the scenes just to do the single poll.  This is
+horrendously inefficient.  Use rather true select() with a zero
+timeout on the handle, or non-blocking IO.
+
+=item socketpair(DOMAIN, TYPE, PROTOCOL)
+
+Call C<socketpair> and return a list of two sockets created, or an
+empty list on failure.
+
+=back
+
+Additional methods that are provided are:
+
+=over 4
+
+=item atmark
+
+True if the socket is currently positioned at the urgent data mark,
+false otherwise.
+
+    use IO::Socket;
+
+    my $sock = IO::Socket::INET->new('some_server');
+    $sock->read($data, 1024) until $sock->atmark;
+
+Note: this is a reasonably new addition to the family of socket
+functions, so all systems may not support this yet.  If it is
+unsupported by the system, an attempt to use this method will
+abort the program.
+
+The atmark() functionality is also exportable as sockatmark() function:
+
+	use IO::Socket 'sockatmark';
+
+This allows for a more traditional use of sockatmark() as a procedural
+socket function.  If your system does not support sockatmark(), the
+C<use> declaration will fail at compile time.
+
+=item connected
+
+If the socket is in a connected state the peer address is returned.
+If the socket is not in a connected state then undef will be returned.
+
+=item protocol
+
+Returns the numerical number for the protocol being used on the socket, if
+known. If the protocol is unknown, as with an AF_UNIX socket, zero
+is returned.
+
+=item sockdomain
+
+Returns the numerical number for the socket domain type. For example, for
+an AF_INET socket the value of &AF_INET will be returned.
+
+=item sockopt(OPT [, VAL])
+
+Unified method to both set and get options in the SOL_SOCKET level. If called
+with one argument then getsockopt is called, otherwise setsockopt is called.
+
+=item socktype
+
+Returns the numerical number for the socket type. For example, for
+a SOCK_STREAM socket the value of &SOCK_STREAM will be returned.
+
+=item timeout([VAL])
+
+Set or get the timeout value associated with this socket. If called without
+any arguments then the current setting is returned. If called with an argument
+the current setting is changed and the previous value returned.
+
+=back
+
+=head1 SEE ALSO
+
+L<Socket>, L<IO::Handle>, L<IO::Socket::INET>, L<IO::Socket::UNIX>
+
+=head1 AUTHOR
+
+Graham Barr.  atmark() by Lincoln Stein.  Currently maintained by the
+Perl Porters.  Please report all bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-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.
+
+The atmark() implementation: Copyright 2001, Lincoln Stein <lstein@cshl.org>.
+This module is distributed under the same terms as Perl itself.
+Feel free to use, modify and redistribute it as long as you retain
+the correct attribution.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/IO/Socket/INET.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO/Socket/INET.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO/Socket/INET.pm	(revision 14489)
@@ -0,0 +1,431 @@
+# IO::Socket::INET.pm
+#
+# Copyright (c) 1997-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.
+
+package IO::Socket::INET;
+
+use strict;
+our(@ISA, $VERSION);
+use IO::Socket;
+use Socket;
+use Carp;
+use Exporter;
+use Errno;
+
+@ISA = qw(IO::Socket);
+$VERSION = "1.29";
+
+my $EINVAL = exists(&Errno::EINVAL) ? Errno::EINVAL() : 1;
+
+IO::Socket::INET->register_domain( AF_INET );
+
+my %socket_type = ( tcp  => SOCK_STREAM,
+		    udp  => SOCK_DGRAM,
+		    icmp => SOCK_RAW
+		  );
+
+sub new {
+    my $class = shift;
+    unshift(@_, "PeerAddr") if @_ == 1;
+    return $class->SUPER::new(@_);
+}
+
+sub _sock_info {
+  my($addr,$port,$proto) = @_;
+  my $origport = $port;
+  my @proto = ();
+  my @serv = ();
+
+  $port = $1
+	if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,);
+
+  if(defined $proto  && $proto =~ /\D/) {
+    if(@proto = getprotobyname($proto)) {
+      $proto = $proto[2] || undef;
+    }
+    else {
+      $@ = "Bad protocol '$proto'";
+      return;
+    }
+  }
+
+  if(defined $port) {
+    my $defport = ($port =~ s,\((\d+)\)$,,) ? $1 : undef;
+    my $pnum = ($port =~ m,^(\d+)$,)[0];
+
+    @serv = getservbyname($port, $proto[0] || "")
+	if ($port =~ m,\D,);
+
+    $port = $serv[2] || $defport || $pnum;
+    unless (defined $port) {
+	$@ = "Bad service '$origport'";
+	return;
+    }
+
+    $proto = (getprotobyname($serv[3]))[2] || undef
+	if @serv && !$proto;
+  }
+
+ return ($addr || undef,
+	 $port || undef,
+	 $proto || undef
+	);
+}
+
+sub _error {
+    my $sock = shift;
+    my $err = shift;
+    {
+      local($!);
+      my $title = ref($sock).": ";
+      $@ = join("", $_[0] =~ /^$title/ ? "" : $title, @_);
+      close($sock)
+	if(defined fileno($sock));
+    }
+    $! = $err;
+    return undef;
+}
+
+sub _get_addr {
+    my($sock,$addr_str, $multi) = @_;
+    my @addr;
+    if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) {
+	(undef, undef, undef, undef, @addr) = gethostbyname($addr_str);
+    } else {
+	my $h = inet_aton($addr_str);
+	push(@addr, $h) if defined $h;
+    }
+    @addr;
+}
+
+sub configure {
+    my($sock,$arg) = @_;
+    my($lport,$rport,$laddr,$raddr,$proto,$type);
+
+
+    $arg->{LocalAddr} = $arg->{LocalHost}
+	if exists $arg->{LocalHost} && !exists $arg->{LocalAddr};
+
+    ($laddr,$lport,$proto) = _sock_info($arg->{LocalAddr},
+					$arg->{LocalPort},
+					$arg->{Proto})
+			or return _error($sock, $!, $@);
+
+    $laddr = defined $laddr ? inet_aton($laddr)
+			    : INADDR_ANY;
+
+    return _error($sock, $EINVAL, "Bad hostname '",$arg->{LocalAddr},"'")
+	unless(defined $laddr);
+
+    $arg->{PeerAddr} = $arg->{PeerHost}
+	if exists $arg->{PeerHost} && !exists $arg->{PeerAddr};
+
+    unless(exists $arg->{Listen}) {
+	($raddr,$rport,$proto) = _sock_info($arg->{PeerAddr},
+					    $arg->{PeerPort},
+					    $proto)
+			or return _error($sock, $!, $@);
+    }
+
+    $proto ||= (getprotobyname('tcp'))[2];
+
+    my $pname = (getprotobynumber($proto))[0];
+    $type = $arg->{Type} || $socket_type{lc $pname};
+
+    my @raddr = ();
+
+    if(defined $raddr) {
+	@raddr = $sock->_get_addr($raddr, $arg->{MultiHomed});
+	return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
+	    unless @raddr;
+    }
+
+    while(1) {
+
+	$sock->socket(AF_INET, $type, $proto) or
+	    return _error($sock, $!, "$!");
+
+        if (defined $arg->{Blocking}) {
+	    defined $sock->blocking($arg->{Blocking})
+		or return _error($sock, $!, "$!");
+	}
+
+	if ($arg->{Reuse} || $arg->{ReuseAddr}) {
+	    $sock->sockopt(SO_REUSEADDR,1) or
+		    return _error($sock, $!, "$!");
+	}
+
+	if ($arg->{ReusePort}) {
+	    $sock->sockopt(SO_REUSEPORT,1) or
+		    return _error($sock, $!, "$!");
+	}
+
+	if ($arg->{Broadcast}) {
+		$sock->sockopt(SO_BROADCAST,1) or
+		    return _error($sock, $!, "$!");
+	}
+
+	if($lport || ($laddr ne INADDR_ANY) || exists $arg->{Listen}) {
+	    $sock->bind($lport || 0, $laddr) or
+		    return _error($sock, $!, "$!");
+	}
+
+	if(exists $arg->{Listen}) {
+	    $sock->listen($arg->{Listen} || 5) or
+		return _error($sock, $!, "$!");
+	    last;
+	}
+
+ 	# don't try to connect unless we're given a PeerAddr
+ 	last unless exists($arg->{PeerAddr});
+ 
+        $raddr = shift @raddr;
+
+	return _error($sock, $EINVAL, 'Cannot determine remote port')
+		unless($rport || $type == SOCK_DGRAM || $type == SOCK_RAW);
+
+	last
+	    unless($type == SOCK_STREAM || defined $raddr);
+
+	return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
+	    unless defined $raddr;
+
+#        my $timeout = ${*$sock}{'io_socket_timeout'};
+#        my $before = time() if $timeout;
+
+	undef $@;
+        if ($sock->connect(pack_sockaddr_in($rport, $raddr))) {
+#            ${*$sock}{'io_socket_timeout'} = $timeout;
+            return $sock;
+        }
+
+	return _error($sock, $!, $@ || "Timeout")
+	    unless @raddr;
+
+#	if ($timeout) {
+#	    my $new_timeout = $timeout - (time() - $before);
+#	    return _error($sock,
+#                         (exists(&Errno::ETIMEDOUT) ? Errno::ETIMEDOUT() : $EINVAL),
+#                         "Timeout") if $new_timeout <= 0;
+#	    ${*$sock}{'io_socket_timeout'} = $new_timeout;
+#        }
+
+    }
+
+    $sock;
+}
+
+sub connect {
+    @_ == 2 || @_ == 3 or
+       croak 'usage: $sock->connect(NAME) or $sock->connect(PORT, ADDR)';
+    my $sock = shift;
+    return $sock->SUPER::connect(@_ == 1 ? shift : pack_sockaddr_in(@_));
+}
+
+sub bind {
+    @_ == 2 || @_ == 3 or
+       croak 'usage: $sock->bind(NAME) or $sock->bind(PORT, ADDR)';
+    my $sock = shift;
+    return $sock->SUPER::bind(@_ == 1 ? shift : pack_sockaddr_in(@_))
+}
+
+sub sockaddr {
+    @_ == 1 or croak 'usage: $sock->sockaddr()';
+    my($sock) = @_;
+    my $name = $sock->sockname;
+    $name ? (sockaddr_in($name))[1] : undef;
+}
+
+sub sockport {
+    @_ == 1 or croak 'usage: $sock->sockport()';
+    my($sock) = @_;
+    my $name = $sock->sockname;
+    $name ? (sockaddr_in($name))[0] : undef;
+}
+
+sub sockhost {
+    @_ == 1 or croak 'usage: $sock->sockhost()';
+    my($sock) = @_;
+    my $addr = $sock->sockaddr;
+    $addr ? inet_ntoa($addr) : undef;
+}
+
+sub peeraddr {
+    @_ == 1 or croak 'usage: $sock->peeraddr()';
+    my($sock) = @_;
+    my $name = $sock->peername;
+    $name ? (sockaddr_in($name))[1] : undef;
+}
+
+sub peerport {
+    @_ == 1 or croak 'usage: $sock->peerport()';
+    my($sock) = @_;
+    my $name = $sock->peername;
+    $name ? (sockaddr_in($name))[0] : undef;
+}
+
+sub peerhost {
+    @_ == 1 or croak 'usage: $sock->peerhost()';
+    my($sock) = @_;
+    my $addr = $sock->peeraddr;
+    $addr ? inet_ntoa($addr) : undef;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Socket::INET - Object interface for AF_INET domain sockets
+
+=head1 SYNOPSIS
+
+    use IO::Socket::INET;
+
+=head1 DESCRIPTION
+
+C<IO::Socket::INET> provides an object interface to creating and using sockets
+in the AF_INET domain. It is built upon the L<IO::Socket> interface and
+inherits all the methods defined by L<IO::Socket>.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ARGS] )
+
+Creates an C<IO::Socket::INET> object, which is a reference to a
+newly created symbol (see the C<Symbol> package). C<new>
+optionally takes arguments, these arguments are in key-value pairs.
+
+In addition to the key-value pairs accepted by L<IO::Socket>,
+C<IO::Socket::INET> provides.
+
+
+    PeerAddr	Remote host address          <hostname>[:<port>]
+    PeerHost	Synonym for PeerAddr
+    PeerPort	Remote port or service       <service>[(<no>)] | <no>
+    LocalAddr	Local host bind	address      hostname[:port]
+    LocalHost	Synonym for LocalAddr
+    LocalPort	Local host bind	port         <service>[(<no>)] | <no>
+    Proto	Protocol name (or number)    "tcp" | "udp" | ...
+    Type	Socket type                  SOCK_STREAM | SOCK_DGRAM | ...
+    Listen	Queue size for listen
+    ReuseAddr	Set SO_REUSEADDR before binding
+    Reuse	Set SO_REUSEADDR before binding (deprecated, prefer ReuseAddr)
+    ReusePort	Set SO_REUSEPORT before binding
+    Broadcast	Set SO_BROADCAST before binding
+    Timeout	Timeout	value for various operations
+    MultiHomed  Try all addresses for multi-homed hosts
+    Blocking    Determine if connection will be blocking mode
+
+If C<Listen> is defined then a listen socket is created, else if the
+socket type, which is derived from the protocol, is SOCK_STREAM then
+connect() is called.
+
+Although it is not illegal, the use of C<MultiHomed> on a socket
+which is in non-blocking mode is of little use. This is because the
+first connect will never fail with a timeout as the connect call
+will not block.
+
+The C<PeerAddr> can be a hostname or the IP-address on the
+"xx.xx.xx.xx" form.  The C<PeerPort> can be a number or a symbolic
+service name.  The service name might be followed by a number in
+parenthesis which is used if the service is not known by the system.
+The C<PeerPort> specification can also be embedded in the C<PeerAddr>
+by preceding it with a ":".
+
+If C<Proto> is not given and you specify a symbolic C<PeerPort> port,
+then the constructor will try to derive C<Proto> from the service
+name.  As a last resort C<Proto> "tcp" is assumed.  The C<Type>
+parameter will be deduced from C<Proto> if not specified.
+
+If the constructor is only passed a single argument, it is assumed to
+be a C<PeerAddr> specification.
+
+If C<Blocking> is set to 0, the connection will be in nonblocking mode.
+If not specified it defaults to 1 (blocking mode).
+
+Examples:
+
+   $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org',
+                                 PeerPort => 'http(80)',
+                                 Proto    => 'tcp');
+
+   $sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)');
+
+   $sock = IO::Socket::INET->new(Listen    => 5,
+                                 LocalAddr => 'localhost',
+                                 LocalPort => 9000,
+                                 Proto     => 'tcp');
+
+   $sock = IO::Socket::INET->new('127.0.0.1:25');
+
+   $sock = IO::Socket::INET->new(PeerPort  => 9999,
+                                 PeerAddr  => inet_ntoa(INADDR_BROADCAST),
+                                 Proto     => udp,    
+                                 LocalAddr => 'localhost',
+                                 Broadcast => 1 ) 
+                             or die "Can't bind : $@\n";
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+As of VERSION 1.18 all IO::Socket objects have autoflush turned on
+by default. This was not the case with earlier releases.
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+=back
+
+=head2 METHODS
+
+=over 4
+
+=item sockaddr ()
+
+Return the address part of the sockaddr structure for the socket
+
+=item sockport ()
+
+Return the port number that the socket is using on the local host
+
+=item sockhost ()
+
+Return the address part of the sockaddr structure for the socket in a
+text form xx.xx.xx.xx
+
+=item peeraddr ()
+
+Return the address part of the sockaddr structure for the socket on
+the peer host
+
+=item peerport ()
+
+Return the port number for the socket on the peer host.
+
+=item peerhost ()
+
+Return the address part of the sockaddr structure for the socket on the
+peer host in a text form xx.xx.xx.xx
+
+=back
+
+=head1 SEE ALSO
+
+L<Socket>, L<IO::Socket>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters.  Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996-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.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/IO/Socket/UNIX.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IO/Socket/UNIX.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IO/Socket/UNIX.pm	(revision 14489)
@@ -0,0 +1,144 @@
+# IO::Socket::UNIX.pm
+#
+# Copyright (c) 1997-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.
+
+package IO::Socket::UNIX;
+
+use strict;
+our(@ISA, $VERSION);
+use IO::Socket;
+use Socket;
+use Carp;
+
+@ISA = qw(IO::Socket);
+$VERSION = "1.22";
+$VERSION = eval $VERSION;
+
+IO::Socket::UNIX->register_domain( AF_UNIX );
+
+sub new {
+    my $class = shift;
+    unshift(@_, "Peer") if @_ == 1;
+    return $class->SUPER::new(@_);
+}
+
+sub configure {
+    my($sock,$arg) = @_;
+    my($bport,$cport);
+
+    my $type = $arg->{Type} || SOCK_STREAM;
+
+    $sock->socket(AF_UNIX, $type, 0) or
+	return undef;
+
+    if(exists $arg->{Local}) {
+	my $addr = sockaddr_un($arg->{Local});
+	$sock->bind($addr) or
+	    return undef;
+    }
+    if(exists $arg->{Listen} && $type != SOCK_DGRAM) {
+	$sock->listen($arg->{Listen} || 5) or
+	    return undef;
+    }
+    elsif(exists $arg->{Peer}) {
+	my $addr = sockaddr_un($arg->{Peer});
+	$sock->connect($addr) or
+	    return undef;
+    }
+
+    $sock;
+}
+
+sub hostpath {
+    @_ == 1 or croak 'usage: $sock->hostpath()';
+    my $n = $_[0]->sockname || return undef;
+    (sockaddr_un($n))[0];
+}
+
+sub peerpath {
+    @_ == 1 or croak 'usage: $sock->peerpath()';
+    my $n = $_[0]->peername || return undef;
+    (sockaddr_un($n))[0];
+}
+
+1; # Keep require happy
+
+__END__
+
+=head1 NAME
+
+IO::Socket::UNIX - Object interface for AF_UNIX domain sockets
+
+=head1 SYNOPSIS
+
+    use IO::Socket::UNIX;
+
+=head1 DESCRIPTION
+
+C<IO::Socket::UNIX> provides an object interface to creating and using sockets
+in the AF_UNIX domain. It is built upon the L<IO::Socket> interface and
+inherits all the methods defined by L<IO::Socket>.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ARGS] )
+
+Creates an C<IO::Socket::UNIX> object, which is a reference to a
+newly created symbol (see the C<Symbol> package). C<new>
+optionally takes arguments, these arguments are in key-value pairs.
+
+In addition to the key-value pairs accepted by L<IO::Socket>,
+C<IO::Socket::UNIX> provides.
+
+    Type    	Type of socket (eg SOCK_STREAM or SOCK_DGRAM)
+    Local   	Path to local fifo
+    Peer    	Path to peer fifo
+    Listen  	Create a listen socket
+
+If the constructor is only passed a single argument, it is assumed to
+be a C<Peer> specification.
+
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+As of VERSION 1.18 all IO::Socket objects have autoflush turned on
+by default. This was not the case with earlier releases.
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item hostpath()
+
+Returns the pathname to the fifo at the local end
+
+=item peerpath()
+
+Returns the pathanme to the fifo at the peer end
+
+=back
+
+=head1 SEE ALSO
+
+L<Socket>, L<IO::Socket>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters.  Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996-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.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/IPC/Open2.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IPC/Open2.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IPC/Open2.pm	(revision 14489)
@@ -0,0 +1,118 @@
+package IPC::Open2;
+
+use strict;
+our ($VERSION, @ISA, @EXPORT);
+
+require 5.000;
+require Exporter;
+
+$VERSION	= 1.02;
+@ISA		= qw(Exporter);
+@EXPORT		= qw(open2);
+
+=head1 NAME
+
+IPC::Open2, open2 - open a process for both reading and writing
+
+=head1 SYNOPSIS
+
+    use IPC::Open2;
+
+    $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some cmd and args');
+      # or without using the shell
+    $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some', 'cmd', 'and', 'args');
+
+    # or with handle autovivification
+    my($chld_out, $chld_in);
+    $pid = open2($chld_out, $chld_in, 'some cmd and args');
+      # or without using the shell
+    $pid = open2($chld_out, $chld_in, 'some', 'cmd', 'and', 'args');
+
+=head1 DESCRIPTION
+
+The open2() function runs the given $cmd and connects $chld_out for
+reading and $chld_in for writing.  It's what you think should work 
+when you try
+
+    $pid = open(HANDLE, "|cmd args|");
+
+The write filehandle will have autoflush turned on.
+
+If $chld_out is a string (that is, a bareword filehandle rather than a glob
+or a reference) and it begins with C<< >& >>, then the child will send output
+directly to that file handle.  If $chld_in is a string that begins with
+C<< <& >>, then $chld_in will be closed in the parent, and the child will
+read from it directly.  In both cases, there will be a dup(2) instead of a
+pipe(2) made.
+
+If either reader or writer is the null string, this will be replaced
+by an autogenerated filehandle.  If so, you must pass a valid lvalue
+in the parameter slot so it can be overwritten in the caller, or
+an exception will be raised.
+
+open2() returns the process ID of the child process.  It doesn't return on
+failure: it just raises an exception matching C</^open2:/>.  However,
+C<exec> failures in the child are not detected.  You'll have to
+trap SIGPIPE yourself.
+
+open2() does not wait for and reap the child process after it exits.
+Except for short programs where it's acceptable to let the operating system
+take care of this, you need to do this yourself.  This is normally as
+simple as calling C<waitpid $pid, 0> when you're done with the process.
+Failing to do this can result in an accumulation of defunct or "zombie"
+processes.  See L<perlfunc/waitpid> for more information.
+
+This whole affair is quite dangerous, as you may block forever.  It
+assumes it's going to talk to something like B<bc>, both writing
+to it and reading from it.  This is presumably safe because you
+"know" that commands like B<bc> will read a line at a time and
+output a line at a time.  Programs like B<sort> that read their
+entire input stream first, however, are quite apt to cause deadlock.
+
+The big problem with this approach is that if you don't have control 
+over source code being run in the child process, you can't control
+what it does with pipe buffering.  Thus you can't just open a pipe to
+C<cat -v> and continually read and write a line from it.
+
+The IO::Pty and Expect modules from CPAN can help with this, as they
+provide a real tty (well, a pseudo-tty, actually), which gets you
+back to line buffering in the invoked command again.
+
+=head1 WARNING 
+
+The order of arguments differs from that of open3().
+
+=head1 SEE ALSO
+
+See L<IPC::Open3> for an alternative that handles STDERR as well.  This
+function is really just a wrapper around open3().
+
+=cut
+
+# &open2: tom christiansen, <tchrist@convex.com>
+#
+# usage: $pid = open2('rdr', 'wtr', 'some cmd and args');
+#    or  $pid = open2('rdr', 'wtr', 'some', 'cmd', 'and', 'args');
+#
+# spawn the given $cmd and connect $rdr for
+# reading and $wtr for writing.  return pid
+# of child, or 0 on failure.  
+# 
+# WARNING: this is dangerous, as you may block forever
+# unless you are very careful.  
+# 
+# $wtr is left unbuffered.
+# 
+# abort program if
+#	rdr or wtr are null
+# 	a system call fails
+
+require IPC::Open3;
+
+sub open2 {
+    local $Carp::CarpLevel = $Carp::CarpLevel + 1;
+    return IPC::Open3::_open3('open2', scalar caller,
+				$_[1], $_[0], '>&STDERR', @_[2 .. $#_]);
+}
+
+1
Index: /for-distributions/trunk/bin/windows/perl/lib/IPC/Open3.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/IPC/Open3.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/IPC/Open3.pm	(revision 14489)
@@ -0,0 +1,349 @@
+package IPC::Open3;
+
+use strict;
+no strict 'refs'; # because users pass me bareword filehandles
+our ($VERSION, @ISA, @EXPORT);
+
+require Exporter;
+
+use Carp;
+use Symbol qw(gensym qualify);
+
+$VERSION	= 1.02;
+@ISA		= qw(Exporter);
+@EXPORT		= qw(open3);
+
+=head1 NAME
+
+IPC::Open3, open3 - open a process for reading, writing, and error handling
+
+=head1 SYNOPSIS
+
+    $pid = open3(\*CHLD_IN, \*CHLD_OUT, \*CHLD_ERR,
+		    'some cmd and args', 'optarg', ...);
+
+    my($wtr, $rdr, $err);
+    $pid = open3($wtr, $rdr, $err,
+		    'some cmd and args', 'optarg', ...);
+
+=head1 DESCRIPTION
+
+Extremely similar to open2(), open3() spawns the given $cmd and
+connects CHLD_OUT for reading from the child, CHLD_IN for writing to
+the child, and CHLD_ERR for errors.  If CHLD_ERR is false, or the
+same file descriptor as CHLD_OUT, then STDOUT and STDERR of the child
+are on the same filehandle.  The CHLD_IN will have autoflush turned
+on.
+
+If CHLD_IN begins with C<< <& >>, then CHLD_IN will be closed in the
+parent, and the child will read from it directly.  If CHLD_OUT or
+CHLD_ERR begins with C<< >& >>, then the child will send output
+directly to that filehandle.  In both cases, there will be a dup(2)
+instead of a pipe(2) made.
+
+If either reader or writer is the null string, this will be replaced
+by an autogenerated filehandle.  If so, you must pass a valid lvalue
+in the parameter slot so it can be overwritten in the caller, or 
+an exception will be raised.
+
+The filehandles may also be integers, in which case they are understood
+as file descriptors.
+
+open3() returns the process ID of the child process.  It doesn't return on
+failure: it just raises an exception matching C</^open3:/>.  However,
+C<exec> failures in the child are not detected.  You'll have to 
+trap SIGPIPE yourself.
+
+Note if you specify C<-> as the command, in an analogous fashion to
+C<open(FOO, "-|")> the child process will just be the forked Perl
+process rather than an external command.  This feature isn't yet
+supported on Win32 platforms.
+
+open3() does not wait for and reap the child process after it exits.  
+Except for short programs where it's acceptable to let the operating system
+take care of this, you need to do this yourself.  This is normally as 
+simple as calling C<waitpid $pid, 0> when you're done with the process.
+Failing to do this can result in an accumulation of defunct or "zombie"
+processes.  See L<perlfunc/waitpid> for more information.
+
+If you try to read from the child's stdout writer and their stderr
+writer, you'll have problems with blocking, which means you'll want
+to use select() or the IO::Select, which means you'd best use
+sysread() instead of readline() for normal stuff.
+
+This is very dangerous, as you may block forever.  It assumes it's
+going to talk to something like B<bc>, both writing to it and reading
+from it.  This is presumably safe because you "know" that commands
+like B<bc> will read a line at a time and output a line at a time.
+Programs like B<sort> that read their entire input stream first,
+however, are quite apt to cause deadlock.
+
+The big problem with this approach is that if you don't have control
+over source code being run in the child process, you can't control
+what it does with pipe buffering.  Thus you can't just open a pipe to
+C<cat -v> and continually read and write a line from it.
+
+=head1 WARNING
+
+The order of arguments differs from that of open2().
+
+=cut
+
+# &open3: Marc Horowitz <marc@mit.edu>
+# derived mostly from &open2 by tom christiansen, <tchrist@convex.com>
+# fixed for 5.001 by Ulrich Kunitz <kunitz@mai-koeln.com>
+# ported to Win32 by Ron Schmidt, Merrill Lynch almost ended my career
+# fixed for autovivving FHs, tchrist again
+# allow fd numbers to be used, by Frank Tobin
+# allow '-' as command (c.f. open "-|"), by Adam Spiers <perl@adamspiers.org>
+#
+# $Id: open3.pl,v 1.1 1993/11/23 06:26:15 marc Exp $
+#
+# usage: $pid = open3('wtr', 'rdr', 'err' 'some cmd and args', 'optarg', ...);
+#
+# spawn the given $cmd and connect rdr for
+# reading, wtr for writing, and err for errors.
+# if err is '', or the same as rdr, then stdout and
+# stderr of the child are on the same fh.  returns pid
+# of child (or dies on failure).
+
+
+# if wtr begins with '<&', then wtr will be closed in the parent, and
+# the child will read from it directly.  if rdr or err begins with
+# '>&', then the child will send output directly to that fd.  In both
+# cases, there will be a dup() instead of a pipe() made.
+
+
+# WARNING: this is dangerous, as you may block forever
+# unless you are very careful.
+#
+# $wtr is left unbuffered.
+#
+# abort program if
+#   rdr or wtr are null
+#   a system call fails
+
+our $Me = 'open3 (bug)';	# you should never see this, it's always localized
+
+# Fatal.pm needs to be fixed WRT prototypes.
+
+sub xfork {
+    my $pid = fork;
+    defined $pid or croak "$Me: fork failed: $!";
+    return $pid;
+}
+
+sub xpipe {
+    pipe $_[0], $_[1] or croak "$Me: pipe($_[0], $_[1]) failed: $!";
+}
+
+# I tried using a * prototype character for the filehandle but it still
+# disallows a bearword while compiling under strict subs.
+
+sub xopen {
+    open $_[0], $_[1] or croak "$Me: open($_[0], $_[1]) failed: $!";
+}
+
+sub xclose {
+    close $_[0] or croak "$Me: close($_[0]) failed: $!";
+}
+
+sub fh_is_fd {
+    return $_[0] =~ /\A=?(\d+)\z/;
+}
+
+sub xfileno {
+    return $1 if $_[0] =~ /\A=?(\d+)\z/;  # deal with fh just being an fd
+    return fileno $_[0];
+}
+
+my $do_spawn = $^O eq 'os2' || $^O eq 'MSWin32';
+
+sub _open3 {
+    local $Me = shift;
+    my($package, $dad_wtr, $dad_rdr, $dad_err, @cmd) = @_;
+    my($dup_wtr, $dup_rdr, $dup_err, $kidpid);
+
+    # simulate autovivification of filehandles because
+    # it's too ugly to use @_ throughout to make perl do it for us
+    # tchrist 5-Mar-00
+
+    unless (eval  {
+	$dad_wtr = $_[1] = gensym unless defined $dad_wtr && length $dad_wtr;
+	$dad_rdr = $_[2] = gensym unless defined $dad_rdr && length $dad_rdr;
+	1; }) 
+    {
+	# must strip crud for croak to add back, or looks ugly
+	$@ =~ s/(?<=value attempted) at .*//s;
+	croak "$Me: $@";
+    } 
+
+    $dad_err ||= $dad_rdr;
+
+    $dup_wtr = ($dad_wtr =~ s/^[<>]&//);
+    $dup_rdr = ($dad_rdr =~ s/^[<>]&//);
+    $dup_err = ($dad_err =~ s/^[<>]&//);
+
+    # force unqualified filehandles into caller's package
+    $dad_wtr = qualify $dad_wtr, $package unless fh_is_fd($dad_wtr);
+    $dad_rdr = qualify $dad_rdr, $package unless fh_is_fd($dad_rdr);
+    $dad_err = qualify $dad_err, $package unless fh_is_fd($dad_err);
+
+    my $kid_rdr = gensym;
+    my $kid_wtr = gensym;
+    my $kid_err = gensym;
+
+    xpipe $kid_rdr, $dad_wtr if !$dup_wtr;
+    xpipe $dad_rdr, $kid_wtr if !$dup_rdr;
+    xpipe $dad_err, $kid_err if !$dup_err && $dad_err ne $dad_rdr;
+
+    $kidpid = $do_spawn ? -1 : xfork;
+    if ($kidpid == 0) {		# Kid
+	# A tie in the parent should not be allowed to cause problems.
+	untie *STDIN;
+	untie *STDOUT;
+	# If she wants to dup the kid's stderr onto her stdout I need to
+	# save a copy of her stdout before I put something else there.
+	if ($dad_rdr ne $dad_err && $dup_err
+		&& xfileno($dad_err) == fileno(STDOUT)) {
+	    my $tmp = gensym;
+	    xopen($tmp, ">&$dad_err");
+	    $dad_err = $tmp;
+	}
+
+	if ($dup_wtr) {
+	    xopen \*STDIN,  "<&$dad_wtr" if fileno(STDIN) != xfileno($dad_wtr);
+	} else {
+	    xclose $dad_wtr;
+	    xopen \*STDIN,  "<&=" . fileno $kid_rdr;
+	}
+	if ($dup_rdr) {
+	    xopen \*STDOUT, ">&$dad_rdr" if fileno(STDOUT) != xfileno($dad_rdr);
+	} else {
+	    xclose $dad_rdr;
+	    xopen \*STDOUT, ">&=" . fileno $kid_wtr;
+	}
+	if ($dad_rdr ne $dad_err) {
+	    if ($dup_err) {
+		# I have to use a fileno here because in this one case
+		# I'm doing a dup but the filehandle might be a reference
+		# (from the special case above).
+		xopen \*STDERR, ">&" . xfileno($dad_err)
+		    if fileno(STDERR) != xfileno($dad_err);
+	    } else {
+		xclose $dad_err;
+		xopen \*STDERR, ">&=" . fileno $kid_err;
+	    }
+	} else {
+	    xopen \*STDERR, ">&STDOUT" if fileno(STDERR) != fileno(STDOUT);
+	}
+	if ($cmd[0] eq '-') {
+	    croak "Arguments don't make sense when the command is '-'"
+	      if @cmd > 1;
+	    return 0;
+	}
+	local($")=(" ");
+	exec @cmd # XXX: wrong process to croak from
+	    or croak "$Me: exec of @cmd failed";
+    } elsif ($do_spawn) {
+	# All the bookkeeping of coincidence between handles is
+	# handled in spawn_with_handles.
+
+	my @close;
+	if ($dup_wtr) {
+	  $kid_rdr = \*{$dad_wtr};
+	  push @close, $kid_rdr;
+	} else {
+	  push @close, \*{$dad_wtr}, $kid_rdr;
+	}
+	if ($dup_rdr) {
+	  $kid_wtr = \*{$dad_rdr};
+	  push @close, $kid_wtr;
+	} else {
+	  push @close, \*{$dad_rdr}, $kid_wtr;
+	}
+	if ($dad_rdr ne $dad_err) {
+	    if ($dup_err) {
+	      $kid_err = \*{$dad_err};
+	      push @close, $kid_err;
+	    } else {
+	      push @close, \*{$dad_err}, $kid_err;
+	    }
+	} else {
+	  $kid_err = $kid_wtr;
+	}
+	require IO::Pipe;
+	$kidpid = eval {
+	    spawn_with_handles( [ { mode => 'r',
+				    open_as => $kid_rdr,
+				    handle => \*STDIN },
+				  { mode => 'w',
+				    open_as => $kid_wtr,
+				    handle => \*STDOUT },
+				  { mode => 'w',
+				    open_as => $kid_err,
+				    handle => \*STDERR },
+				], \@close, @cmd);
+	};
+	die "$Me: $@" if $@;
+    }
+
+    xclose $kid_rdr if !$dup_wtr;
+    xclose $kid_wtr if !$dup_rdr;
+    xclose $kid_err if !$dup_err && $dad_rdr ne $dad_err;
+    # If the write handle is a dup give it away entirely, close my copy
+    # of it.
+    xclose $dad_wtr if $dup_wtr;
+
+    select((select($dad_wtr), $| = 1)[0]); # unbuffer pipe
+    $kidpid;
+}
+
+sub open3 {
+    if (@_ < 4) {
+	local $" = ', ';
+	croak "open3(@_): not enough arguments";
+    }
+    return _open3 'open3', scalar caller, @_
+}
+
+sub spawn_with_handles {
+    my $fds = shift;		# Fields: handle, mode, open_as
+    my $close_in_child = shift;
+    my ($fd, $pid, @saved_fh, $saved, %saved, @errs);
+    require Fcntl;
+
+    foreach $fd (@$fds) {
+	$fd->{tmp_copy} = IO::Handle->new_from_fd($fd->{handle}, $fd->{mode});
+	$saved{fileno $fd->{handle}} = $fd->{tmp_copy};
+    }
+    foreach $fd (@$fds) {
+	bless $fd->{handle}, 'IO::Handle'
+	    unless eval { $fd->{handle}->isa('IO::Handle') } ;
+	# If some of handles to redirect-to coincide with handles to
+	# redirect, we need to use saved variants:
+	$fd->{handle}->fdopen($saved{fileno $fd->{open_as}} || $fd->{open_as},
+			      $fd->{mode});
+    }
+    unless ($^O eq 'MSWin32') {
+	# Stderr may be redirected below, so we save the err text:
+	foreach $fd (@$close_in_child) {
+	    fcntl($fd, Fcntl::F_SETFD(), 1) or push @errs, "fcntl $fd: $!"
+		unless $saved{fileno $fd}; # Do not close what we redirect!
+	}
+    }
+
+    unless (@errs) {
+	$pid = eval { system 1, @_ }; # 1 == P_NOWAIT
+	push @errs, "IO::Pipe: Can't spawn-NOWAIT: $!" if !$pid || $pid < 0;
+    }
+
+    foreach $fd (@$fds) {
+	$fd->{handle}->fdopen($fd->{tmp_copy}, $fd->{mode});
+	$fd->{tmp_copy}->close or croak "Can't close: $!";
+    }
+    croak join "\n", @errs if @errs;
+    return $pid;
+}
+
+1; # so require is happy
Index: /for-distributions/trunk/bin/windows/perl/lib/List/Util.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/List/Util.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/List/Util.pm	(revision 14489)
@@ -0,0 +1,277 @@
+# List::Util.pm
+#
+# Copyright (c) 1997-2005 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 List::Util;
+
+use strict;
+use vars qw(@ISA @EXPORT_OK $VERSION $XS_VERSION $TESTING_PERL_ONLY);
+require Exporter;
+
+@ISA        = qw(Exporter);
+@EXPORT_OK  = qw(first min max minstr maxstr reduce sum shuffle);
+$VERSION    = "1.18";
+$XS_VERSION = $VERSION;
+$VERSION    = eval $VERSION;
+
+eval {
+  # PERL_DL_NONLAZY must be false, or any errors in loading will just
+  # cause the perl code to be tested
+  local $ENV{PERL_DL_NONLAZY} = 0 if $ENV{PERL_DL_NONLAZY};
+  eval {
+    require XSLoader;
+    XSLoader::load('List::Util', $XS_VERSION);
+    1;
+  } or do {
+    require DynaLoader;
+    local @ISA = qw(DynaLoader);
+    bootstrap List::Util $XS_VERSION;
+  };
+} unless $TESTING_PERL_ONLY;
+
+
+# This code is only compiled if the XS did not load
+# of for perl < 5.6.0
+
+if (!defined &reduce) {
+eval <<'ESQ' 
+
+sub reduce (&@) {
+  my $code = shift;
+  no strict 'refs';
+
+  return shift unless @_ > 1;
+
+  use vars qw($a $b);
+
+  my $caller = caller;
+  local(*{$caller."::a"}) = \my $a;
+  local(*{$caller."::b"}) = \my $b;
+
+  $a = shift;
+  foreach (@_) {
+    $b = $_;
+    $a = &{$code}();
+  }
+
+  $a;
+}
+
+sub first (&@) {
+  my $code = shift;
+
+  foreach (@_) {
+    return $_ if &{$code}();
+  }
+
+  undef;
+}
+
+ESQ
+}
+
+# This code is only compiled if the XS did not load
+eval <<'ESQ' if !defined &sum;
+
+use vars qw($a $b);
+
+sub sum (@) { reduce { $a + $b } @_ }
+
+sub min (@) { reduce { $a < $b ? $a : $b } @_ }
+
+sub max (@) { reduce { $a > $b ? $a : $b } @_ }
+
+sub minstr (@) { reduce { $a lt $b ? $a : $b } @_ }
+
+sub maxstr (@) { reduce { $a gt $b ? $a : $b } @_ }
+
+sub shuffle (@) {
+  my @a=\(@_);
+  my $n;
+  my $i=@_;
+  map {
+    $n = rand($i--);
+    (${$a[$n]}, $a[$n] = $a[$i])[0];
+  } @_;
+}
+
+ESQ
+
+1;
+
+__END__
+
+=head1 NAME
+
+List::Util - A selection of general-utility list subroutines
+
+=head1 SYNOPSIS
+
+    use List::Util qw(first max maxstr min minstr reduce shuffle sum);
+
+=head1 DESCRIPTION
+
+C<List::Util> contains a selection of subroutines that people have
+expressed would be nice to have in the perl core, but the usage would
+not really be high enough to warrant the use of a keyword, and the size
+so small such that being individual extensions would be wasteful.
+
+By default C<List::Util> does not export any subroutines. The
+subroutines defined are
+
+=over 4
+
+=item first BLOCK LIST
+
+Similar to C<grep> in that it evaluates BLOCK setting C<$_> to each element
+of LIST in turn. C<first> returns the first element where the result from
+BLOCK is a true value. If BLOCK never returns true or LIST was empty then
+C<undef> is returned.
+
+    $foo = first { defined($_) } @list    # first defined value in @list
+    $foo = first { $_ > $value } @list    # first value in @list which
+                                          # is greater than $value
+
+This function could be implemented using C<reduce> like this
+
+    $foo = reduce { defined($a) ? $a : wanted($b) ? $b : undef } undef, @list
+
+for example wanted() could be defined() which would return the first
+defined value in @list
+
+=item max LIST
+
+Returns the entry in the list with the highest numerical value. If the
+list is empty then C<undef> is returned.
+
+    $foo = max 1..10                # 10
+    $foo = max 3,9,12               # 12
+    $foo = max @bar, @baz           # whatever
+
+This function could be implemented using C<reduce> like this
+
+    $foo = reduce { $a > $b ? $a : $b } 1..10
+
+=item maxstr LIST
+
+Similar to C<max>, but treats all the entries in the list as strings
+and returns the highest string as defined by the C<gt> operator.
+If the list is empty then C<undef> is returned.
+
+    $foo = maxstr 'A'..'Z'          # 'Z'
+    $foo = maxstr "hello","world"   # "world"
+    $foo = maxstr @bar, @baz        # whatever
+
+This function could be implemented using C<reduce> like this
+
+    $foo = reduce { $a gt $b ? $a : $b } 'A'..'Z'
+
+=item min LIST
+
+Similar to C<max> but returns the entry in the list with the lowest
+numerical value. If the list is empty then C<undef> is returned.
+
+    $foo = min 1..10                # 1
+    $foo = min 3,9,12               # 3
+    $foo = min @bar, @baz           # whatever
+
+This function could be implemented using C<reduce> like this
+
+    $foo = reduce { $a < $b ? $a : $b } 1..10
+
+=item minstr LIST
+
+Similar to C<min>, but treats all the entries in the list as strings
+and returns the lowest string as defined by the C<lt> operator.
+If the list is empty then C<undef> is returned.
+
+    $foo = minstr 'A'..'Z'          # 'A'
+    $foo = minstr "hello","world"   # "hello"
+    $foo = minstr @bar, @baz        # whatever
+
+This function could be implemented using C<reduce> like this
+
+    $foo = reduce { $a lt $b ? $a : $b } 'A'..'Z'
+
+=item reduce BLOCK LIST
+
+Reduces LIST by calling BLOCK multiple times, setting C<$a> and C<$b>
+each time. The first call will be with C<$a> and C<$b> set to the first
+two elements of the list, subsequent calls will be done by
+setting C<$a> to the result of the previous call and C<$b> to the next
+element in the list.
+
+Returns the result of the last call to BLOCK. If LIST is empty then
+C<undef> is returned. If LIST only contains one element then that
+element is returned and BLOCK is not executed.
+
+    $foo = reduce { $a < $b ? $a : $b } 1..10       # min
+    $foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr
+    $foo = reduce { $a + $b } 1 .. 10               # sum
+    $foo = reduce { $a . $b } @bar                  # concat
+
+=item shuffle LIST
+
+Returns the elements of LIST in a random order
+
+    @cards = shuffle 0..51      # 0..51 in a random order
+
+=item sum LIST
+
+Returns the sum of all the elements in LIST. If LIST is empty then
+C<undef> is returned.
+
+    $foo = sum 1..10                # 55
+    $foo = sum 3,9,12               # 24
+    $foo = sum @bar, @baz           # whatever
+
+This function could be implemented using C<reduce> like this
+
+    $foo = reduce { $a + $b } 1..10
+
+=back
+
+=head1 KNOWN BUGS
+
+With perl versions prior to 5.005 there are some cases where reduce
+will return an incorrect result. This will show up as test 7 of
+reduce.t failing.
+
+=head1 SUGGESTED ADDITIONS
+
+The following are additions that have been requested, but I have been reluctant
+to add due to them being very simple to implement in perl
+
+  # One argument is true
+
+  sub any { $_ && return 1 for @_; 0 }
+
+  # All arguments are true
+
+  sub all { $_ || return 0 for @_; 1 }
+
+  # All arguments are false
+
+  sub none { $_ && return 0 for @_; 1 }
+
+  # One argument is false
+
+  sub notall { $_ || return 1 for @_; 0 }
+
+  # How many elements are true
+
+  sub true { scalar grep { $_ } @_ }
+
+  # How many elements are false
+
+  sub false { scalar grep { !$_ } @_ }
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-2005 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
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Constants.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Constants.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Constants.pm	(revision 14489)
@@ -0,0 +1,31 @@
+#
+# Locale::Constants - defined constants for identifying codesets
+#
+# $Id: Constants.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
+#
+
+package Locale::Constants;
+use strict;
+
+require Exporter;
+
+#-----------------------------------------------------------------------
+#	Public Global Variables
+#-----------------------------------------------------------------------
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION   = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
+@ISA	= qw(Exporter);
+@EXPORT = qw(LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC
+		LOCALE_CODE_DEFAULT);
+
+#-----------------------------------------------------------------------
+#	Constants
+#-----------------------------------------------------------------------
+use constant LOCALE_CODE_ALPHA_2 => 1;
+use constant LOCALE_CODE_ALPHA_3 => 2;
+use constant LOCALE_CODE_NUMERIC => 3;
+
+use constant LOCALE_CODE_DEFAULT => LOCALE_CODE_ALPHA_2;
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Constants.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Constants.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Constants.pod	(revision 14489)
@@ -0,0 +1,76 @@
+
+=head1 NAME
+
+Locale::Constants - constants for Locale codes
+
+=head1 SYNOPSIS
+
+    use Locale::Constants;
+    
+    $codeset = LOCALE_CODE_ALPHA_2;
+
+=head1 DESCRIPTION
+
+B<Locale::Constants> defines symbols which are used in
+the four modules from the Locale-Codes distribution:
+
+	Locale::Language
+	Locale::Country
+	Locale::Currency
+	Locale::Script
+
+B<Note:> at the moment only Locale::Country and Locale::Script
+support more than one code set.
+
+The symbols defined are used to specify which codes you
+want to be used:
+
+	LOCALE_CODE_ALPHA_2
+	LOCALE_CODE_ALPHA_3
+	LOCALE_CODE_NUMERIC
+
+You shouldn't have to C<use> this module directly yourself -
+it is used by the three Locale modules, which in turn export
+the symbols.
+
+=head1 KNOWN BUGS AND LIMITATIONS
+
+None at the moment.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Locale::Language
+
+Codes for identification of languages.
+
+=item Locale::Country
+
+Codes for identification of countries.
+
+=item Locale::Script
+
+Codes for identification of scripts.
+
+=item Locale::Currency
+
+Codes for identification of currencies and funds.
+
+=back
+
+=head1 AUTHOR
+
+Neil Bowers E<lt>neil@bowers.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002-2004, Neil Bowers.
+
+Copyright (C) 2001, Canon Research Centre Europe (CRE).
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Country.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Country.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Country.pm	(revision 14489)
@@ -0,0 +1,550 @@
+#
+# Locale::Country - ISO codes for country identification (ISO 3166)
+#
+# $Id: Country.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
+#
+
+package Locale::Country;
+use strict;
+require 5.002;
+
+require Exporter;
+use Carp;
+use Locale::Constants;
+
+
+#-----------------------------------------------------------------------
+#	Public Global Variables
+#-----------------------------------------------------------------------
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+$VERSION   = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
+@ISA       = qw(Exporter);
+@EXPORT    = qw(code2country country2code
+                all_country_codes all_country_names
+		country_code2code
+		LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC);
+
+#-----------------------------------------------------------------------
+#	Private Global Variables
+#-----------------------------------------------------------------------
+my $CODES     = [];
+my $COUNTRIES = [];
+
+
+#=======================================================================
+#
+# code2country ( CODE [, CODESET ] )
+#
+#=======================================================================
+sub code2country
+{
+    my $code = shift;
+    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+
+    return undef unless defined $code;
+
+    #-------------------------------------------------------------------
+    # Make sure the code is in the right form before we use it
+    # to look up the corresponding country.
+    # We have to sprintf because the codes are given as 3-digits,
+    # with leading 0's. Eg 052 for Barbados.
+    #-------------------------------------------------------------------
+    if ($codeset == LOCALE_CODE_NUMERIC)
+    {
+	return undef if ($code =~ /\D/);
+	$code = sprintf("%.3d", $code);
+    }
+    else
+    {
+	$code = lc($code);
+    }
+
+    if (exists $CODES->[$codeset]->{$code})
+    {
+        return $CODES->[$codeset]->{$code};
+    }
+    else
+    {
+        #---------------------------------------------------------------
+        # no such country code!
+        #---------------------------------------------------------------
+        return undef;
+    }
+}
+
+
+#=======================================================================
+#
+# country2code ( NAME [, CODESET ] )
+#
+#=======================================================================
+sub country2code
+{
+    my $country = shift;
+    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+
+    return undef unless defined $country;
+    $country = lc($country);
+    if (exists $COUNTRIES->[$codeset]->{$country})
+    {
+        return $COUNTRIES->[$codeset]->{$country};
+    }
+    else
+    {
+        #---------------------------------------------------------------
+        # no such country!
+        #---------------------------------------------------------------
+        return undef;
+    }
+}
+
+
+#=======================================================================
+#
+# country_code2code ( NAME [, CODESET ] )
+#
+#=======================================================================
+sub country_code2code
+{
+    (@_ == 3) or croak "country_code2code() takes 3 arguments!";
+
+    my $code = shift;
+    my $inset = shift;
+    my $outset = shift;
+    my $outcode;
+    my $country;
+
+
+    return undef if $inset == $outset;
+    $country = code2country($code, $inset);
+    return undef if not defined $country;
+    $outcode = country2code($country, $outset);
+    return $outcode;
+}
+
+
+#=======================================================================
+#
+# all_country_codes ( [ CODESET ] )
+#
+#=======================================================================
+sub all_country_codes
+{
+    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+    return keys %{ $CODES->[$codeset] };
+}
+
+
+#=======================================================================
+#
+# all_country_names ( [ CODESET ] )
+#
+#=======================================================================
+sub all_country_names
+{
+    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+    return values %{ $CODES->[$codeset] };
+}
+
+
+#=======================================================================
+#
+# alias_code ( ALIAS => CODE [ , CODESET ] )
+#
+# Add an alias for an existing code. If the CODESET isn't specified,
+# then we use the default (currently the alpha-2 codeset).
+#
+#   Locale::Country::alias_code('uk' => 'gb');
+#
+#=======================================================================
+sub alias_code
+{
+    my $alias = shift;
+    my $real  = shift;
+    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+    my $country;
+
+
+    if (not exists $CODES->[$codeset]->{$real})
+    {
+        carp "attempt to alias \"$alias\" to unknown country code \"$real\"\n";
+        return undef;
+    }
+    $country = $CODES->[$codeset]->{$real};
+    $CODES->[$codeset]->{$alias} = $country;
+    $COUNTRIES->[$codeset]->{"\L$country"} = $alias;
+
+    return $alias;
+}
+
+# old name of function for backwards compatibility
+*_alias_code = *alias_code;
+
+
+#=======================================================================
+#
+# rename_country
+#
+# change the official name for a country, eg:
+#	gb => 'Great Britain'
+# rather than the standard 'United Kingdom'. The original is retained
+# as an alias, but the new name will be returned if you lookup the
+# name from code.
+#
+#=======================================================================
+sub rename_country
+{
+    my $code     = shift;
+    my $new_name = shift;
+    my $codeset = @_ > 0 ? shift : _code2codeset($code);
+    my $country;
+    my $c;
+
+
+    if (not defined $codeset)
+    {
+        carp "rename_country(): unknown country code \"$code\"\n";
+        return 0;
+    }
+
+    $country = $CODES->[$codeset]->{$code};
+
+    foreach my $cset (LOCALE_CODE_ALPHA_2,
+			LOCALE_CODE_ALPHA_3,
+			LOCALE_CODE_NUMERIC)
+    {
+	if ($cset == $codeset)
+	{
+	    $c = $code;
+	}
+	else
+	{
+	    $c = country_code2code($code, $codeset, $cset);
+	}
+
+	$CODES->[$cset]->{$c} = $new_name;
+	$COUNTRIES->[$cset]->{"\L$new_name"} = $c;
+    }
+
+    return 1;
+}
+
+
+#=======================================================================
+#
+# _code2codeset
+#
+# given a country code in an unknown codeset, return the codeset
+# it is from, or undef.
+#
+#=======================================================================
+sub _code2codeset
+{
+    my $code = shift;
+
+
+    foreach my $codeset (LOCALE_CODE_ALPHA_2, LOCALE_CODE_ALPHA_3,
+			LOCALE_CODE_NUMERIC)
+    {
+	return $codeset if (exists $CODES->[$codeset]->{$code})
+    }
+
+    return undef;
+}
+
+
+#=======================================================================
+#
+# initialisation code - stuff the DATA into the ALPHA2 hash
+#
+#=======================================================================
+{
+    my   ($alpha2, $alpha3, $numeric);
+    my   ($country, @countries);
+    local $_;
+
+
+    while (<DATA>)
+    {
+        next unless /\S/;
+        chop;
+        ($alpha2, $alpha3, $numeric, @countries) = split(/:/, $_);
+
+        $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $countries[0];
+	foreach $country (@countries)
+	{
+	    $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$country"} = $alpha2;
+	}
+
+	if ($alpha3)
+	{
+            $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $countries[0];
+	    foreach $country (@countries)
+	    {
+		$COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$country"} = $alpha3;
+	    }
+	}
+
+	if ($numeric)
+	{
+            $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $countries[0];
+	    foreach $country (@countries)
+	    {
+		$COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$country"} = $numeric;
+	    }
+	}
+
+    }
+
+    close(DATA);
+}
+
+1;
+
+__DATA__
+ad:and:020:Andorra
+ae:are:784:United Arab Emirates
+af:afg:004:Afghanistan
+ag:atg:028:Antigua and Barbuda
+ai:aia:660:Anguilla
+al:alb:008:Albania
+am:arm:051:Armenia
+an:ant:530:Netherlands Antilles
+ao:ago:024:Angola
+aq:ata:010:Antarctica
+ar:arg:032:Argentina
+as:asm:016:American Samoa
+at:aut:040:Austria
+au:aus:036:Australia
+aw:abw:533:Aruba
+ax:ala:248:Aland Islands
+az:aze:031:Azerbaijan
+ba:bih:070:Bosnia and Herzegovina
+bb:brb:052:Barbados
+bd:bgd:050:Bangladesh
+be:bel:056:Belgium
+bf:bfa:854:Burkina Faso
+bg:bgr:100:Bulgaria
+bh:bhr:048:Bahrain
+bi:bdi:108:Burundi
+bj:ben:204:Benin
+bm:bmu:060:Bermuda
+bn:brn:096:Brunei Darussalam
+bo:bol:068:Bolivia
+br:bra:076:Brazil
+bs:bhs:044:Bahamas
+bt:btn:064:Bhutan
+bv:bvt:074:Bouvet Island
+bw:bwa:072:Botswana
+by:blr:112:Belarus
+bz:blz:084:Belize
+ca:can:124:Canada
+cc:cck:166:Cocos (Keeling) Islands
+cd:cod:180:Congo, The Democratic Republic of the:Zaire:Congo, Democratic Republic of the
+cf:caf:140:Central African Republic
+cg:cog:178:Congo:Congo, Republic of the
+ch:che:756:Switzerland
+ci:civ:384:Cote D'Ivoire
+ck:cok:184:Cook Islands
+cl:chl:152:Chile
+cm:cmr:120:Cameroon
+cn:chn:156:China
+co:col:170:Colombia
+cr:cri:188:Costa Rica
+cs:scg:891:Serbia and Montenegro:Yugoslavia
+cu:cub:192:Cuba
+cv:cpv:132:Cape Verde
+cx:cxr:162:Christmas Island
+cy:cyp:196:Cyprus
+cz:cze:203:Czech Republic
+de:deu:276:Germany
+dj:dji:262:Djibouti
+dk:dnk:208:Denmark
+dm:dma:212:Dominica
+do:dom:214:Dominican Republic
+dz:dza:012:Algeria
+ec:ecu:218:Ecuador
+ee:est:233:Estonia
+eg:egy:818:Egypt
+eh:esh:732:Western Sahara
+er:eri:232:Eritrea
+es:esp:724:Spain
+et:eth:231:Ethiopia
+fi:fin:246:Finland
+fj:fji:242:Fiji
+fk:flk:238:Falkland Islands (Malvinas):Falkland Islands (Islas Malvinas)
+fm:fsm:583:Micronesia, Federated States of
+fo:fro:234:Faroe Islands
+fr:fra:250:France
+fx:fxx:249:France, Metropolitan
+ga:gab:266:Gabon
+gb:gbr:826:United Kingdom:Great Britain
+gd:grd:308:Grenada
+ge:geo:268:Georgia
+gf:guf:254:French Guiana
+gh:gha:288:Ghana
+gi:gib:292:Gibraltar
+gl:grl:304:Greenland
+gm:gmb:270:Gambia
+gn:gin:324:Guinea
+gp:glp:312:Guadeloupe
+gq:gnq:226:Equatorial Guinea
+gr:grc:300:Greece
+gs:sgs:239:South Georgia and the South Sandwich Islands
+gt:gtm:320:Guatemala
+gu:gum:316:Guam
+gw:gnb:624:Guinea-Bissau
+gy:guy:328:Guyana
+hk:hkg:344:Hong Kong
+hm:hmd:334:Heard Island and McDonald Islands
+hn:hnd:340:Honduras
+hr:hrv:191:Croatia
+ht:hti:332:Haiti
+hu:hun:348:Hungary
+id:idn:360:Indonesia
+ie:irl:372:Ireland
+il:isr:376:Israel
+in:ind:356:India
+io:iot:086:British Indian Ocean Territory
+iq:irq:368:Iraq
+ir:irn:364:Iran, Islamic Republic of:Iran
+is:isl:352:Iceland
+it:ita:380:Italy
+jm:jam:388:Jamaica
+jo:jor:400:Jordan
+jp:jpn:392:Japan
+ke:ken:404:Kenya
+kg:kgz:417:Kyrgyzstan
+kh:khm:116:Cambodia
+ki:kir:296:Kiribati
+km:com:174:Comoros
+kn:kna:659:Saint Kitts and Nevis
+kp:prk:408:Korea, Democratic People's Republic of:Korea, North:North Korea
+kr:kor:410:Korea, Republic of:Korea, South:South Korea
+kw:kwt:414:Kuwait
+ky:cym:136:Cayman Islands
+kz:kaz:398:Kazakhstan:Kazakstan
+la:lao:418:Lao People's Democratic Republic
+lb:lbn:422:Lebanon
+lc:lca:662:Saint Lucia
+li:lie:438:Liechtenstein
+lk:lka:144:Sri Lanka
+lr:lbr:430:Liberia
+ls:lso:426:Lesotho
+lt:ltu:440:Lithuania
+lu:lux:442:Luxembourg
+lv:lva:428:Latvia
+ly:lby:434:Libyan Arab Jamahiriya:Libya
+ma:mar:504:Morocco
+mc:mco:492:Monaco
+md:mda:498:Moldova, Republic of:Moldova
+mg:mdg:450:Madagascar
+mh:mhl:584:Marshall Islands
+mk:mkd:807:Macedonia, the Former Yugoslav Republic of:Macedonia, Former Yugoslav Republic of:Macedonia
+ml:mli:466:Mali
+mm:mmr:104:Myanmar:Burma
+mn:mng:496:Mongolia
+mo:mac:446:Macao:Macau
+mp:mnp:580:Northern Mariana Islands
+mq:mtq:474:Martinique
+mr:mrt:478:Mauritania
+ms:msr:500:Montserrat
+mt:mlt:470:Malta
+mu:mus:480:Mauritius
+mv:mdv:462:Maldives
+mw:mwi:454:Malawi
+mx:mex:484:Mexico
+my:mys:458:Malaysia
+mz:moz:508:Mozambique
+na:nam:516:Namibia
+nc:ncl:540:New Caledonia
+ne:ner:562:Niger
+nf:nfk:574:Norfolk Island
+ng:nga:566:Nigeria
+ni:nic:558:Nicaragua
+nl:nld:528:Netherlands
+no:nor:578:Norway
+np:npl:524:Nepal
+nr:nru:520:Nauru
+nu:niu:570:Niue
+nz:nzl:554:New Zealand
+om:omn:512:Oman
+pa:pan:591:Panama
+pe:per:604:Peru
+pf:pyf:258:French Polynesia
+pg:png:598:Papua New Guinea
+ph:phl:608:Philippines
+pk:pak:586:Pakistan
+pl:pol:616:Poland
+pm:spm:666:Saint Pierre and Miquelon
+pn:pcn:612:Pitcairn:Pitcairn Island
+pr:pri:630:Puerto Rico
+ps:pse:275:Palestinian Territory, Occupied
+pt:prt:620:Portugal
+pw:plw:585:Palau
+py:pry:600:Paraguay
+qa:qat:634:Qatar
+re:reu:638:Reunion
+ro:rou:642:Romania
+ru:rus:643:Russian Federation:Russia
+rw:rwa:646:Rwanda
+sa:sau:682:Saudi Arabia
+sb:slb:090:Solomon Islands
+sc:syc:690:Seychelles
+sd:sdn:736:Sudan
+se:swe:752:Sweden
+sg:sgp:702:Singapore
+sh:shn:654:Saint Helena
+si:svn:705:Slovenia
+sj:sjm:744:Svalbard and Jan Mayen:Jan Mayen:Svalbard
+sk:svk:703:Slovakia
+sl:sle:694:Sierra Leone
+sm:smr:674:San Marino
+sn:sen:686:Senegal
+so:som:706:Somalia
+sr:sur:740:Suriname
+st:stp:678:Sao Tome and Principe
+sv:slv:222:El Salvador
+sy:syr:760:Syrian Arab Republic:Syria
+sz:swz:748:Swaziland
+tc:tca:796:Turks and Caicos Islands
+td:tcd:148:Chad
+tf:atf:260:French Southern Territories:French Southern and Antarctic Lands
+tg:tgo:768:Togo
+th:tha:764:Thailand
+tj:tjk:762:Tajikistan
+tk:tkl:772:Tokelau
+tm:tkm:795:Turkmenistan
+tn:tun:788:Tunisia
+to:ton:776:Tonga
+tl:tls:626:Timor-Leste:East Timor
+tr:tur:792:Turkey
+tt:tto:780:Trinidad and Tobago
+tv:tuv:798:Tuvalu
+tw:twn:158:Taiwan, Province of China:Taiwan
+tz:tza:834:Tanzania, United Republic of:Tanzania
+ua:ukr:804:Ukraine
+ug:uga:800:Uganda
+um:umi:581:United States Minor Outlying Islands
+us:usa:840:United States:USA:United States of America
+uy:ury:858:Uruguay
+uz:uzb:860:Uzbekistan
+va:vat:336:Holy See (Vatican City State):Holy See (Vatican City)
+vc:vct:670:Saint Vincent and the Grenadines
+ve:ven:862:Venezuela
+vg:vgb:092:Virgin Islands, British:British Virgin Islands
+vi:vir:850:Virgin Islands, U.S.
+vn:vnm:704:Vietnam
+vu:vut:548:Vanuatu
+wf:wlf:876:Wallis and Futuna
+ws:wsm:882:Samoa
+ye:yem:887:Yemen
+yt:myt:175:Mayotte
+za:zaf:710:South Africa
+zm:zmb:894:Zambia
+zw:zwe:716:Zimbabwe
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Country.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Country.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Country.pod	(revision 14489)
@@ -0,0 +1,306 @@
+
+=head1 NAME
+
+Locale::Country - ISO codes for country identification (ISO 3166)
+
+=head1 SYNOPSIS
+
+    use Locale::Country;
+    
+    $country = code2country('jp');        # $country gets 'Japan'
+    $code    = country2code('Norway');    # $code gets 'no'
+    
+    @codes   = all_country_codes();
+    @names   = all_country_names();
+    
+    # semi-private routines
+    Locale::Country::alias_code('uk' => 'gb');
+    Locale::Country::rename_country('gb' => 'Great Britain');
+
+
+=head1 DESCRIPTION
+
+The C<Locale::Country> module provides access to the ISO
+codes for identifying countries, as defined in ISO 3166-1.
+You can either access the codes via the L<conversion routines>
+(described below), or with the two functions which return lists
+of all country codes or all country names.
+
+There are three different code sets you can use for identifying
+countries:
+
+=over 4
+
+=item B<alpha-2>
+
+Two letter codes, such as 'tv' for Tuvalu.
+This code set is identified with the symbol C<LOCALE_CODE_ALPHA_2>.
+
+=item B<alpha-3>
+
+Three letter codes, such as 'brb' for Barbados.
+This code set is identified with the symbol C<LOCALE_CODE_ALPHA_3>.
+
+=item B<numeric>
+
+Numeric codes, such as 064 for Bhutan.
+This code set is identified with the symbol C<LOCALE_CODE_NUMERIC>.
+
+=back
+
+All of the routines take an optional additional argument
+which specifies the code set to use.
+If not specified, it defaults to the two-letter codes.
+This is partly for backwards compatibility (previous versions
+of this module only supported the alpha-2 codes), and
+partly because they are the most widely used codes.
+
+The alpha-2 and alpha-3 codes are not case-dependent,
+so you can use 'BO', 'Bo', 'bO' or 'bo' for Bolivia.
+When a code is returned by one of the functions in
+this module, it will always be lower-case.
+
+As of version 2.00, Locale::Country supports variant
+names for countries. So, for example, the country code for "United States"
+is "us", so country2code('United States') returns 'us'.
+Now the following will also return 'us':
+
+    country2code('United States of America') 
+    country2code('USA') 
+
+
+=head1 CONVERSION ROUTINES
+
+There are three conversion routines: C<code2country()>, C<country2code()>,
+and C<country_code2code()>.
+
+=over 4
+
+=item code2country( CODE, [ CODESET ] )
+
+This function takes a country code and returns a string
+which contains the name of the country identified.
+If the code is not a valid country code, as defined by ISO 3166,
+then C<undef> will be returned:
+
+    $country = code2country('fi');
+
+=item country2code( STRING, [ CODESET ] )
+
+This function takes a country name and returns the corresponding
+country code, if such exists.
+If the argument could not be identified as a country name,
+then C<undef> will be returned:
+
+    $code = country2code('Norway', LOCALE_CODE_ALPHA_3);
+    # $code will now be 'nor'
+
+The case of the country name is not important.
+See the section L<KNOWN BUGS AND LIMITATIONS> below.
+
+=item country_code2code( CODE, CODESET, CODESET )
+
+This function takes a country code from one code set,
+and returns the corresponding code from another code set.
+
+    $alpha2 = country_code2code('fin',
+		 LOCALE_CODE_ALPHA_3, LOCALE_CODE_ALPHA_2);
+    # $alpha2 will now be 'fi'
+
+If the code passed is not a valid country code in
+the first code set, or if there isn't a code for the
+corresponding country in the second code set,
+then C<undef> will be returned.
+
+=back
+
+
+=head1 QUERY ROUTINES
+
+There are two function which can be used to obtain a list of all codes,
+or all country names:
+
+=over 4
+
+=item C<all_country_codes( [ CODESET ] )>
+
+Returns a list of all two-letter country codes.
+The codes are guaranteed to be all lower-case,
+and not in any particular order.
+
+=item C<all_country_names( [ CODESET ] )>
+
+Returns a list of all country names for which there is a corresponding
+country code in the specified code set.
+The names are capitalised, and not returned in any particular order.
+
+Not all countries have alpha-3 and numeric codes -
+some just have an alpha-2 code,
+so you'll get a different number of countries
+depending on which code set you specify.
+
+=back
+
+
+=head1 SEMI-PRIVATE ROUTINES
+
+Locale::Country provides two semi-private routines for modifying
+the internal data.
+Given their status, they aren't exported by default,
+and so need to be called by prefixing the function name with the
+package name.
+
+=head2 alias_code
+
+Define a new code as an alias for an existing code:
+
+    Locale::Country::alias_code( ALIAS => CODE [, CODESET ] )
+
+This feature was added as a mechanism for handling
+a "uk" code. The ISO standard says that the two-letter code for
+"United Kingdom" is "gb", whereas domain names are all .uk.
+
+By default the module does not understand "uk", since it is implementing
+an ISO standard. If you would like 'uk' to work as the two-letter
+code for United Kingdom, use the following:
+
+    Locale::Country::alias_code('uk' => 'gb');
+
+With this code, both "uk" and "gb" are valid codes for United Kingdom,
+with the reverse lookup returning "uk" rather than the usual "gb".
+
+B<Note:> this function was previously called _alias_code,
+but the leading underscore has been dropped.
+The old name will be supported for all 2.X releases for
+backwards compatibility.
+
+=head2 rename_country
+
+If the official country name just isn't good enough for you,
+you can rename a country. For example, the official country
+name for code 'gb' is 'United Kingdom'.
+If you want to change that, you might call:
+
+    Locale::Country::rename_country('gb' => 'Great Britain');
+
+This means that calling code2country('gb') will now return
+'Great Britain' instead of 'United Kingdom'.
+The original country name is retained as an alias,
+so for the above example, country2code('United Kingdom')
+will still return 'gb'.
+
+
+=head1 EXAMPLES
+
+The following example illustrates use of the C<code2country()> function.
+The user is prompted for a country code, and then told the corresponding
+country name:
+
+    $| = 1;   # turn off buffering
+    
+    print "Enter country code: ";
+    chop($code = <STDIN>);
+    $country = code2country($code, LOCALE_CODE_ALPHA_2);
+    if (defined $country)
+    {
+        print "$code = $country\n";
+    }
+    else
+    {
+        print "'$code' is not a valid country code!\n";
+    }
+
+=head1 DOMAIN NAMES
+
+Most top-level domain names are based on these codes,
+but there are certain codes which aren't.
+If you are using this module to identify country from hostname,
+your best bet is to preprocess the country code.
+
+For example, B<edu>, B<com>, B<gov> and friends would map to B<us>;
+B<uk> would map to B<gb>. Any others?
+
+=head1 KNOWN BUGS AND LIMITATIONS
+
+=over 4
+
+=item *
+
+When using C<country2code()>, the country name must currently appear
+exactly as it does in the source of the module. The module now supports
+a small number of variants.
+
+Possible extensions to this are: an interface for getting at the
+list of variant names, and regular expression matches.
+
+=item *
+
+In the current implementation, all data is read in when the
+module is loaded, and then held in memory.
+A lazy implementation would be more memory friendly.
+
+=item *
+
+Support for country names in different languages.
+
+=back
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Locale::Language
+
+ISO two letter codes for identification of language (ISO 639).
+
+=item Locale::Script
+
+ISO codes for identification of scripts (ISO 15924).
+
+=item Locale::Currency
+
+ISO three letter codes for identification of currencies
+and funds (ISO 4217).
+
+=item Locale::SubCountry
+
+ISO codes for country sub-divisions (states, counties, provinces, etc),
+as defined in ISO 3166-2.
+This module is not part of the Locale-Codes distribution,
+but is available from CPAN in CPAN/modules/by-module/Locale/
+
+=item ISO 3166-1
+
+The ISO standard which defines these codes.
+
+=item http://www.iso.org/iso/en/prods-services/iso3166ma/index.html
+
+Official home page for the ISO 3166 maintenance agency.
+
+=item http://www.egt.ie/standards/iso3166/iso3166-1-en.html
+
+Another useful, but not official, home page.
+
+=item http://www.cia.gov/cia/publications/factbook/docs/app-d-1.html
+
+An appendix in the CIA world fact book which lists country codes
+as defined by ISO 3166, FIPS 10-4, and internet domain names.
+
+=back
+
+
+=head1 AUTHOR
+
+Neil Bowers E<lt>neil@bowers.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002-2004, Neil Bowers.
+
+Copyright (c) 1997-2001 Canon Research Centre Europe (CRE).
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Currency.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Currency.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Currency.pm	(revision 14489)
@@ -0,0 +1,356 @@
+#
+# Locale::Currency - ISO three letter codes for currency identification
+#                    (ISO 4217)
+#
+# $Id: Currency.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
+#
+
+package Locale::Currency;
+use strict;
+require 5.002;
+
+require Exporter;
+
+#-----------------------------------------------------------------------
+#	Public Global Variables
+#-----------------------------------------------------------------------
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION      = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
+@ISA          = qw(Exporter);
+@EXPORT       = qw(&code2currency &currency2code
+                   &all_currency_codes &all_currency_names );
+
+#-----------------------------------------------------------------------
+#	Private Global Variables
+#-----------------------------------------------------------------------
+my %CODES      = ();
+my %CURRENCIES = ();
+
+
+#=======================================================================
+#
+# code2currency( CODE )
+#
+#=======================================================================
+sub code2currency
+{
+    my $code = shift;
+
+
+    return undef unless defined $code;
+    $code = lc($code);
+    if (exists $CODES{$code})
+    {
+        return $CODES{$code};
+    }
+    else
+    {
+        #---------------------------------------------------------------
+        # no such currency code!
+        #---------------------------------------------------------------
+        return undef;
+    }
+}
+
+
+#=======================================================================
+#
+# currency2code ( CURRENCY )
+#
+#=======================================================================
+sub currency2code
+{
+    my $curr = shift;
+
+
+    return undef unless defined $curr;
+    $curr = lc($curr);
+    if (exists $CURRENCIES{$curr})
+    {
+        return $CURRENCIES{$curr};
+    }
+    else
+    {
+        #---------------------------------------------------------------
+        # no such currency!
+        #---------------------------------------------------------------
+        return undef;
+    }
+}
+
+
+#=======================================================================
+#
+# all_currency_codes()
+#
+#=======================================================================
+sub all_currency_codes
+{
+    return keys %CODES;
+}
+
+
+#=======================================================================
+#
+# all_currency_names()
+#
+#=======================================================================
+sub all_currency_names
+{
+    return values %CODES;
+}
+
+
+#=======================================================================
+# initialisation code - stuff the DATA into the CODES hash
+#=======================================================================
+{
+    my    $code;
+    my    $currency;
+    local $_;
+
+
+    while (<DATA>)
+    {
+        next unless /\S/;
+        chop;
+        ($code, $currency) = split(/:/, $_, 2);
+        $CODES{$code} = $currency;
+        $CURRENCIES{"\L$currency"} = $code;
+    }
+
+    close(DATA);
+}
+
+1;
+
+__DATA__
+adp:Andorran Peseta
+aed:UAE Dirham
+afa:Afghani
+all:Lek
+amd:Armenian Dram
+ang:Netherlands Antillean Guilder
+aoa:Kwanza
+aon:New Kwanza
+aor:Kwanza Reajustado
+ars:Argentine Peso
+ats:Schilling
+aud:Australian Dollar
+awg:Aruban Guilder
+azm:Azerbaijanian Manat
+
+bam:Convertible Marks
+bbd:Barbados Dollar
+bdt:Taka
+bef:Belgian Franc
+bgl:Lev
+bgn:Bulgarian Lev
+bhd:Bahraini Dinar
+bhd:Dinar
+bif:Burundi Franc
+bmd:Bermudian Dollar
+bnd:Brunei Dollar
+bob:Boliviano
+bov:MVDol
+brl:Brazilian Real
+bsd:Bahamian Dollar
+btn:Ngultrum
+bwp:Pula
+byb:Belarussian Ruble
+byr:Belarussian Ruble
+bzd:Belize Dollar
+
+cad:Canadian Dollar
+cdf:Franc Congolais
+chf:Swiss Franc
+clf:Unidades de Formento
+clp:Chilean Peso
+cny:Yuan Renminbi
+cop:Colombian Peso
+crc:Costa Rican Colon
+cup:Cuban Peso
+cve:Cape Verde Escudo
+cyp:Cyprus Pound
+czk:Czech Koruna
+
+dem:German Mark
+djf:Djibouti Franc
+dkk:Danish Krone
+dop:Dominican Peso
+dzd:Algerian Dinar
+
+ecs:Sucre
+ecv:Unidad de Valor Constante (UVC)
+eek:Kroon
+egp:Egyptian Pound
+ern:Nakfa
+esp:Spanish Peseta
+etb:Ethiopian Birr
+eur:Euro
+
+fim:Markka
+fjd:Fiji Dollar
+fkp:Falkland Islands Pound
+frf:French Franc
+
+gbp:Pound Sterling
+gel:Lari
+ghc:Cedi
+gip:Gibraltar Pound
+gmd:Dalasi
+gnf:Guinea Franc
+grd:Drachma
+gtq:Quetzal
+gwp:Guinea-Bissau Peso
+gyd:Guyana Dollar
+
+hkd:Hong Kong Dollar
+hnl:Lempira
+hrk:Kuna
+htg:Gourde
+huf:Forint
+
+idr:Rupiah
+iep:Irish Pound
+ils:Shekel
+inr:Indian Rupee
+iqd:Iraqi Dinar
+irr:Iranian Rial
+isk:Iceland Krona
+itl:Italian Lira
+
+jmd:Jamaican Dollar
+jod:Jordanian Dinar
+jpy:Yen
+
+kes:Kenyan Shilling
+kgs:Som
+khr:Riel
+kmf:Comoro Franc
+kpw:North Korean Won
+krw:Won
+kwd:Kuwaiti Dinar
+kyd:Cayman Islands Dollar
+kzt:Tenge
+
+lak:Kip
+lbp:Lebanese Pound
+lkr:Sri Lanka Rupee
+lrd:Liberian Dollar
+lsl:Loti
+ltl:Lithuanian Litas
+luf:Luxembourg Franc
+lvl:Latvian Lats
+lyd:Libyan Dinar
+
+mad:Moroccan Dirham
+mdl:Moldovan Leu
+mgf:Malagasy Franc
+mkd:Denar
+mmk:Kyat
+mnt:Tugrik
+mop:Pataca
+mro:Ouguiya
+mtl:Maltese Lira
+mur:Mauritius Rupee
+mvr:Rufiyaa
+mwk:Kwacha
+mxn:Mexican Nuevo Peso
+myr:Malaysian Ringgit
+mzm:Metical
+
+nad:Namibia Dollar
+ngn:Naira
+nio:Cordoba Oro
+nlg:Netherlands Guilder
+nok:Norwegian Krone
+npr:Nepalese Rupee
+nzd:New Zealand Dollar
+
+omr:Rial Omani
+
+pab:Balboa
+pen:Nuevo Sol
+pgk:Kina
+php:Philippine Peso
+pkr:Pakistan Rupee
+pln:Zloty
+pte:Portuguese Escudo
+pyg:Guarani
+
+qar:Qatari Rial
+
+rol:Leu
+rub:Russian Ruble
+rur:Russian Ruble
+rwf:Rwanda Franc
+
+sar:Saudi Riyal
+sbd:Solomon Islands Dollar
+scr:Seychelles Rupee
+sdd:Sudanese Dinar
+sek:Swedish Krona
+sgd:Singapore Dollar
+shp:St. Helena Pound
+sit:Tolar
+skk:Slovak Koruna
+sll:Leone
+sos:Somali Shilling
+srg:Surinam Guilder
+std:Dobra
+svc:El Salvador Colon
+syp:Syrian Pound
+szl:Lilangeni
+
+thb:Baht
+tjr:Tajik Ruble
+tmm:Manat
+tnd:Tunisian Dollar
+top:Pa'anga
+tpe:Timor Escudo
+trl:Turkish Lira
+ttd:Trinidad and Tobago Dollar
+twd:New Taiwan Dollar
+tzs:Tanzanian Shilling
+
+uah:Hryvnia
+uak:Karbovanets
+ugx:Uganda Shilling
+usd:US Dollar
+usn:US Dollar (Next day)
+uss:US Dollar (Same day)
+uyu:Peso Uruguayo
+uzs:Uzbekistan Sum
+
+veb:Bolivar
+vnd:Dong
+vuv:Vatu
+
+wst:Tala
+
+xaf:CFA Franc BEAC
+xag:Silver
+xau:Gold
+xba:European Composite Unit
+xbb:European Monetary Unit
+xbc:European Unit of Account 9
+xb5:European Unit of Account 17
+xcd:East Caribbean Dollar
+xdr:SDR
+xeu:ECU (until 1998-12-31)
+xfu:UIC-Franc
+xfo:Gold-Franc
+xof:CFA Franc BCEAO
+xpd:Palladium
+xpf:CFP Franc
+xpt:Platinum
+
+yer:Yemeni Rial
+yum:New Dinar
+
+zal:Financial Rand
+zar:Rand
+zmk:Kwacha
+zrn:New Zaire
+zwd:Zimbabwe Dollar
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Currency.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Currency.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Currency.pod	(revision 14489)
@@ -0,0 +1,191 @@
+
+=head1 NAME
+
+Locale::Currency - ISO three letter codes for currency identification (ISO 4217)
+
+=head1 SYNOPSIS
+
+    use Locale::Currency;
+
+    $curr = code2currency('usd');     # $curr gets 'US Dollar'
+    $code = currency2code('Euro');    # $code gets 'eur'
+
+    @codes   = all_currency_codes();
+    @names   = all_currency_names();
+
+
+=head1 DESCRIPTION
+
+The C<Locale::Currency> module provides access to the ISO three-letter
+codes for identifying currencies and funds, as defined in ISO 4217.
+You can either access the codes via the L<conversion routines>
+(described below),
+or with the two functions which return lists of all currency codes or
+all currency names.
+
+There are two special codes defined by the standard which aren't
+understood by this module:
+
+=over 4
+
+=item XTS
+
+Specifically reserved for testing purposes.
+
+=item XXX
+
+For transactions where no currency is involved.
+
+=back
+
+
+=head1 CONVERSION ROUTINES
+
+There are two conversion routines: C<code2currency()> and C<currency2code()>.
+
+=over 4
+
+=item code2currency()
+
+This function takes a three letter currency code and returns a string
+which contains the name of the currency identified. If the code is
+not a valid currency code, as defined by ISO 4217, then C<undef>
+will be returned.
+
+    $curr = code2currency($code);
+
+=item currency2code()
+
+This function takes a currency name and returns the corresponding
+three letter currency code, if such exists.
+If the argument could not be identified as a currency name,
+then C<undef> will be returned.
+
+    $code = currency2code('French Franc');
+
+The case of the currency name is not important.
+See the section L<KNOWN BUGS AND LIMITATIONS> below.
+
+=back
+
+
+=head1 QUERY ROUTINES
+
+There are two function which can be used to obtain a list of all
+currency codes, or all currency names:
+
+=over 4
+
+=item C<all_currency_codes()>
+
+Returns a list of all three-letter currency codes.
+The codes are guaranteed to be all lower-case,
+and not in any particular order.
+
+=item C<all_currency_names()>
+
+Returns a list of all currency names for which there is a corresponding
+three-letter currency code. The names are capitalised, and not returned
+in any particular order.
+
+=back
+
+
+=head1 EXAMPLES
+
+The following example illustrates use of the C<code2currency()> function.
+The user is prompted for a currency code, and then told the corresponding
+currency name:
+
+    $| = 1;    # turn off buffering
+
+    print "Enter currency code: ";
+    chop($code = <STDIN>);
+    $curr = code2currency($code);
+    if (defined $curr)
+    {
+        print "$code = $curr\n";
+    }
+    else
+    {
+        print "'$code' is not a valid currency code!\n";
+    }
+
+=head1 KNOWN BUGS AND LIMITATIONS
+
+=over 4
+
+=item *
+
+In the current implementation, all data is read in when the
+module is loaded, and then held in memory.
+A lazy implementation would be more memory friendly.
+
+=item *
+
+This module also includes the special codes which are
+not for a currency, such as Gold, Platinum, etc.
+This might cause a problem if you're using this module
+to display a list of currencies.
+Let Neil know if this does cause a problem, and we can
+do something about it.
+
+=item *
+
+ISO 4217 also defines a numeric code for each currency.
+Currency codes are not currently supported by this module,
+in the same way Locale::Country supports multiple codesets.
+
+=item *
+
+There are three cases where there is more than one
+code for the same currency name.
+Kwacha has two codes: mwk for Malawi, and zmk for Zambia.
+The Russian Ruble has two codes: rub and rur.
+The Belarussian Ruble has two codes: byr and byb.
+The currency2code() function only returns one code, so
+you might not get back the code you expected.
+
+=back
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Locale::Country
+
+ISO codes for identification of country (ISO 3166).
+
+=item Locale::Script
+
+ISO codes for identification of written scripts (ISO 15924).
+
+=item ISO 4217:1995
+
+Code for the representation of currencies and funds.
+
+=item http://www.bsi-global.com/iso4217currency
+
+Official web page for the ISO 4217 maintenance agency.
+This has the latest list of codes, in MS Word format. Boo.
+
+=back
+
+=head1 AUTHOR
+
+Michael Hennecke E<lt>hennecke@rz.uni-karlsruhe.deE<gt>
+and
+Neil Bowers E<lt>neil@bowers.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002-2004, Neil Bowers.
+
+Copyright (c) 2001 Michael Hennecke and
+Canon Research Centre Europe (CRE).
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Language.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Language.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Language.pm	(revision 14489)
@@ -0,0 +1,315 @@
+#
+# Locale::Language - ISO two letter codes for language identification (ISO 639)
+#
+# $Id: Language.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
+#
+
+package Locale::Language;
+use strict;
+require 5.002;
+
+require Exporter;
+
+#-----------------------------------------------------------------------
+#	Public Global Variables
+#-----------------------------------------------------------------------
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION      = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
+@ISA          = qw(Exporter);
+@EXPORT       = qw(&code2language &language2code
+                   &all_language_codes &all_language_names );
+
+#-----------------------------------------------------------------------
+#	Private Global Variables
+#-----------------------------------------------------------------------
+my %CODES     = ();
+my %LANGUAGES = ();
+
+
+#=======================================================================
+#
+# code2language ( CODE )
+#
+#=======================================================================
+sub code2language
+{
+    my $code = shift;
+
+
+    return undef unless defined $code;
+    $code = lc($code);
+    if (exists $CODES{$code})
+    {
+        return $CODES{$code};
+    }
+    else
+    {
+        #---------------------------------------------------------------
+        # no such language code!
+        #---------------------------------------------------------------
+        return undef;
+    }
+}
+
+
+#=======================================================================
+#
+# language2code ( LANGUAGE )
+#
+#=======================================================================
+sub language2code
+{
+    my $lang = shift;
+
+
+    return undef unless defined $lang;
+    $lang = lc($lang);
+    if (exists $LANGUAGES{$lang})
+    {
+        return $LANGUAGES{$lang};
+    }
+    else
+    {
+        #---------------------------------------------------------------
+        # no such language!
+        #---------------------------------------------------------------
+        return undef;
+    }
+}
+
+
+#=======================================================================
+#
+# all_language_codes()
+#
+#=======================================================================
+sub all_language_codes
+{
+    return keys %CODES;
+}
+
+
+#=======================================================================
+#
+# all_language_names()
+#
+#=======================================================================
+sub all_language_names
+{
+    return values %CODES;
+}
+
+
+#=======================================================================
+# initialisation code - stuff the DATA into the CODES hash
+#=======================================================================
+{
+    my    $code;
+    my    $language;
+    local $_;
+
+
+    while (<DATA>)
+    {
+        next unless /\S/;
+        chop;
+        ($code, $language) = split(/:/, $_, 2);
+        $CODES{$code} = $language;
+        $LANGUAGES{"\L$language"} = $code;
+    }
+
+    close(DATA);
+}
+
+1;
+
+__DATA__
+aa:Afar
+ab:Abkhazian
+ae:Avestan
+af:Afrikaans
+am:Amharic
+ar:Arabic
+as:Assamese
+ay:Aymara
+az:Azerbaijani
+
+ba:Bashkir
+be:Belarusian
+bg:Bulgarian
+bh:Bihari
+bi:Bislama
+bn:Bengali
+bo:Tibetan
+br:Breton
+bs:Bosnian
+
+ca:Catalan
+ce:Chechen
+ch:Chamorro
+co:Corsican
+cs:Czech
+cu:Church Slavic
+cv:Chuvash
+cy:Welsh
+
+da:Danish
+de:German
+dz:Dzongkha
+
+el:Greek
+en:English
+eo:Esperanto
+es:Spanish
+et:Estonian
+eu:Basque
+
+fa:Persian
+fi:Finnish
+fj:Fijian
+fo:Faeroese
+fr:French
+fy:Frisian
+
+ga:Irish
+gd:Gaelic (Scots)
+gl:Gallegan
+gn:Guarani
+gu:Gujarati
+gv:Manx
+
+ha:Hausa
+he:Hebrew
+hi:Hindi
+ho:Hiri Motu
+hr:Croatian
+hu:Hungarian
+hy:Armenian
+hz:Herero
+
+ia:Interlingua
+id:Indonesian
+ie:Interlingue
+ik:Inupiaq
+is:Icelandic
+it:Italian
+iu:Inuktitut
+
+ja:Japanese
+jw:Javanese
+
+ka:Georgian
+ki:Kikuyu
+kj:Kuanyama
+kk:Kazakh
+kl:Kalaallisut
+km:Khmer
+kn:Kannada
+ko:Korean
+ks:Kashmiri
+ku:Kurdish
+kv:Komi
+kw:Cornish
+ky:Kirghiz
+
+la:Latin
+lb:Letzeburgesch
+ln:Lingala
+lo:Lao
+lt:Lithuanian
+lv:Latvian
+
+mg:Malagasy
+mh:Marshall
+mi:Maori
+mk:Macedonian
+ml:Malayalam
+mn:Mongolian
+mo:Moldavian
+mr:Marathi
+ms:Malay
+mt:Maltese
+my:Burmese
+
+na:Nauru
+nb:Norwegian Bokmal
+nd:Ndebele, North
+ne:Nepali
+ng:Ndonga
+nl:Dutch
+nn:Norwegian Nynorsk
+no:Norwegian
+nr:Ndebele, South
+nv:Navajo
+ny:Chichewa; Nyanja
+
+oc:Occitan (post 1500)
+om:Oromo
+or:Oriya
+os:Ossetian; Ossetic
+
+pa:Panjabi
+pi:Pali
+pl:Polish
+ps:Pushto
+pt:Portuguese
+
+qu:Quechua
+
+rm:Rhaeto-Romance
+rn:Rundi
+ro:Romanian
+ru:Russian
+rw:Kinyarwanda
+
+sa:Sanskrit
+sc:Sardinian
+sd:Sindhi
+se:Sami
+sg:Sango
+si:Sinhalese
+sk:Slovak
+sl:Slovenian
+sm:Samoan
+sn:Shona
+so:Somali
+sq:Albanian
+sr:Serbian
+ss:Swati
+st:Sotho
+su:Sundanese
+sv:Swedish
+sw:Swahili
+
+ta:Tamil
+te:Telugu
+tg:Tajik
+th:Thai
+ti:Tigrinya
+tk:Turkmen
+tl:Tagalog
+tn:Tswana
+to:Tonga
+tr:Turkish
+ts:Tsonga
+tt:Tatar
+tw:Twi
+
+ug:Uighur
+uk:Ukrainian
+ur:Urdu
+uz:Uzbek
+
+vi:Vietnamese
+vo:Volapuk
+
+wo:Wolof
+
+xh:Xhosa
+
+yi:Yiddish
+yo:Yoruba
+
+za:Zhuang
+zh:Chinese
+zu:Zulu
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Language.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Language.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Language.pod	(revision 14489)
@@ -0,0 +1,158 @@
+
+=head1 NAME
+
+Locale::Language - ISO two letter codes for language identification (ISO 639)
+
+=head1 SYNOPSIS
+
+    use Locale::Language;
+    
+    $lang = code2language('en');        # $lang gets 'English'
+    $code = language2code('French');    # $code gets 'fr'
+    
+    @codes   = all_language_codes();
+    @names   = all_language_names();
+
+
+=head1 DESCRIPTION
+
+The C<Locale::Language> module provides access to the ISO two-letter
+codes for identifying languages, as defined in ISO 639. You can either
+access the codes via the L<conversion routines> (described below),
+or via the two functions which return lists of all language codes or
+all language names.
+
+
+=head1 CONVERSION ROUTINES
+
+There are two conversion routines: C<code2language()> and C<language2code()>.
+
+=over 4
+
+=item code2language()
+
+This function takes a two letter language code and returns a string
+which contains the name of the language identified. If the code is
+not a valid language code, as defined by ISO 639, then C<undef>
+will be returned.
+
+    $lang = code2language($code);
+
+=item language2code()
+
+This function takes a language name and returns the corresponding
+two letter language code, if such exists.
+If the argument could not be identified as a language name,
+then C<undef> will be returned.
+
+    $code = language2code('French');
+
+The case of the language name is not important.
+See the section L<KNOWN BUGS AND LIMITATIONS> below.
+
+=back
+
+
+=head1 QUERY ROUTINES
+
+There are two function which can be used to obtain a list of all
+language codes, or all language names:
+
+=over 4
+
+=item C<all_language_codes()>
+
+Returns a list of all two-letter language codes.
+The codes are guaranteed to be all lower-case,
+and not in any particular order.
+
+=item C<all_language_names()>
+
+Returns a list of all language names for which there is a corresponding
+two-letter language code. The names are capitalised, and not returned
+in any particular order.
+
+=back
+
+
+=head1 EXAMPLES
+
+The following example illustrates use of the C<code2language()> function.
+The user is prompted for a language code, and then told the corresponding
+language name:
+
+    $| = 1;    # turn off buffering
+    
+    print "Enter language code: ";
+    chop($code = <STDIN>);
+    $lang = code2language($code);
+    if (defined $lang)
+    {
+        print "$code = $lang\n";
+    }
+    else
+    {
+        print "'$code' is not a valid language code!\n";
+    }
+
+=head1 KNOWN BUGS AND LIMITATIONS
+
+=over 4
+
+=item *
+
+In the current implementation, all data is read in when the
+module is loaded, and then held in memory.
+A lazy implementation would be more memory friendly.
+
+=item *
+
+Currently just supports the two letter language codes -
+there are also three-letter codes, and numbers.
+Would these be of any use to anyone?
+
+=back
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Locale::Country
+
+ISO codes for identification of country (ISO 3166).
+Supports 2-letter, 3-letter, and numeric country codes.
+
+=item Locale::Script
+
+ISO codes for identification of written scripts (ISO 15924).
+
+=item Locale::Currency
+
+ISO three letter codes for identification of currencies and funds (ISO 4217).
+
+=item ISO 639:1988 (E/F)
+
+Code for the representation of names of languages.
+
+=item http://lcweb.loc.gov/standards/iso639-2/langhome.html
+
+Home page for ISO 639-2.
+
+=back
+
+
+=head1 AUTHOR
+
+Neil Bowers E<lt>neil@bowers.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002-2004, Neil Bowers.
+
+Copyright (c) 1997-2001 Canon Research Centre Europe (CRE).
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext.pm	(revision 14489)
@@ -0,0 +1,476 @@
+
+# Time-stamp: "2004-03-30 16:33:31 AST"
+
+require 5;
+package Locale::Maketext;
+use strict;
+use vars qw( @ISA $VERSION $MATCH_SUPERS $USING_LANGUAGE_TAGS
+             $USE_LITERALS $MATCH_SUPERS_TIGHTLY);
+use Carp ();
+use I18N::LangTags 0.30 ();
+
+#--------------------------------------------------------------------------
+
+BEGIN { unless(defined &DEBUG) { *DEBUG = sub () {0} } }
+ # define the constant 'DEBUG' at compile-time
+
+$VERSION = "1.09";
+@ISA = ();
+
+$MATCH_SUPERS = 1;
+$MATCH_SUPERS_TIGHTLY = 1;
+$USING_LANGUAGE_TAGS  = 1;
+ # Turning this off is somewhat of a security risk in that little or no
+ # checking will be done on the legality of tokens passed to the
+ # eval("use $module_name") in _try_use.  If you turn this off, you have
+ # to do your own taint checking.
+
+$USE_LITERALS = 1 unless defined $USE_LITERALS;
+ # a hint for compiling bracket-notation things.
+
+my %isa_scan = ();
+
+###########################################################################
+
+sub quant {
+  my($handle, $num, @forms) = @_;
+
+  return $num if @forms == 0; # what should this mean?
+  return $forms[2] if @forms > 2 and $num == 0; # special zeroth case
+
+  # Normal case:
+  # Note that the formatting of $num is preserved.
+  return( $handle->numf($num) . ' ' . $handle->numerate($num, @forms) );
+   # Most human languages put the number phrase before the qualified phrase.
+}
+
+
+sub numerate {
+ # return this lexical item in a form appropriate to this number
+  my($handle, $num, @forms) = @_;
+  my $s = ($num == 1);
+
+  return '' unless @forms;
+  if(@forms == 1) { # only the headword form specified
+    return $s ? $forms[0] : ($forms[0] . 's'); # very cheap hack.
+  } else { # sing and plural were specified
+    return $s ? $forms[0] : $forms[1];
+  }
+}
+
+#--------------------------------------------------------------------------
+
+sub numf {
+  my($handle, $num) = @_[0,1];
+  if($num < 10_000_000_000 and $num > -10_000_000_000 and $num == int($num)) {
+    $num += 0;  # Just use normal integer stringification.
+         # Specifically, don't let %G turn ten million into 1E+007
+  } else {
+    $num = CORE::sprintf("%G", $num);
+     # "CORE::" is there to avoid confusion with the above sub sprintf.
+  }
+  while( $num =~ s/^([-+]?\d+)(\d{3})/$1,$2/s ) {1}  # right from perlfaq5
+   # The initial \d+ gobbles as many digits as it can, and then we
+   #  backtrack so it un-eats the rightmost three, and then we
+   #  insert the comma there.
+
+  $num =~ tr<.,><,.> if ref($handle) and $handle->{'numf_comma'};
+   # This is just a lame hack instead of using Number::Format
+  return $num;
+}
+
+sub sprintf {
+  no integer;
+  my($handle, $format, @params) = @_;
+  return CORE::sprintf($format, @params);
+    # "CORE::" is there to avoid confusion with myself!
+}
+
+#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
+
+use integer; # vroom vroom... applies to the whole rest of the module
+
+sub language_tag {
+  my $it = ref($_[0]) || $_[0];
+  return undef unless $it =~ m/([^':]+)(?:::)?$/s;
+  $it = lc($1);
+  $it =~ tr<_><->;
+  return $it;
+}
+
+sub encoding {
+  my $it = $_[0];
+  return(
+   (ref($it) && $it->{'encoding'})
+   || "iso-8859-1"   # Latin-1
+  );
+} 
+
+#--------------------------------------------------------------------------
+
+sub fallback_languages { return('i-default', 'en', 'en-US') }
+
+sub fallback_language_classes { return () }
+
+#--------------------------------------------------------------------------
+
+sub fail_with { # an actual attribute method!
+  my($handle, @params) = @_;
+  return unless ref($handle);
+  $handle->{'fail'} = $params[0] if @params;
+  return $handle->{'fail'};
+}
+
+#--------------------------------------------------------------------------
+
+sub failure_handler_auto {
+  # Meant to be used like:
+  #  $handle->fail_with('failure_handler_auto')
+
+  my($handle, $phrase, @params) = @_;
+  $handle->{'failure_lex'} ||= {};
+  my $lex = $handle->{'failure_lex'};
+
+  my $value;
+  $lex->{$phrase} ||= ($value = $handle->_compile($phrase));
+
+  # Dumbly copied from sub maketext:
+  {
+    local $SIG{'__DIE__'};
+    eval { $value = &$value($handle, @_) };
+  }
+  # If we make it here, there was an exception thrown in the
+  #  call to $value, and so scream:
+  if($@) {
+    my $err = $@;
+    # pretty up the error message
+    $err =~ s<\s+at\s+\(eval\s+\d+\)\s+line\s+(\d+)\.?\n?>
+             <\n in bracket code [compiled line $1],>s;
+    #$err =~ s/\n?$/\n/s;
+    Carp::croak "Error in maketexting \"$phrase\":\n$err as used";
+    # Rather unexpected, but suppose that the sub tried calling
+    # a method that didn't exist.
+  } else {
+    return $value;
+  }
+}
+
+#==========================================================================
+
+sub new {
+  # Nothing fancy!
+  my $class = ref($_[0]) || $_[0];
+  my $handle = bless {}, $class;
+  $handle->init;
+  return $handle;
+}
+
+sub init { return } # no-op
+
+###########################################################################
+
+sub maketext {
+  # Remember, this can fail.  Failure is controllable many ways.
+  Carp::croak "maketext requires at least one parameter" unless @_ > 1;
+
+  my($handle, $phrase) = splice(@_,0,2);
+
+  # Look up the value:
+
+  my $value;
+  foreach my $h_r (
+    @{  $isa_scan{ref($handle) || $handle} || $handle->_lex_refs  }
+  ) {
+    print "* Looking up \"$phrase\" in $h_r\n" if DEBUG;
+    if(exists $h_r->{$phrase}) {
+      print "  Found \"$phrase\" in $h_r\n" if DEBUG;
+      unless(ref($value = $h_r->{$phrase})) {
+        # Nonref means it's not yet compiled.  Compile and replace.
+        $value = $h_r->{$phrase} = $handle->_compile($value);
+      }
+      last;
+    } elsif($phrase !~ m/^_/s and $h_r->{'_AUTO'}) {
+      # it's an auto lex, and this is an autoable key!
+      print "  Automaking \"$phrase\" into $h_r\n" if DEBUG;
+      
+      $value = $h_r->{$phrase} = $handle->_compile($phrase);
+      last;
+    }
+    print "  Not found in $h_r, nor automakable\n" if DEBUG > 1;
+    # else keep looking
+  }
+
+  unless(defined($value)) {
+    print "! Lookup of \"$phrase\" in/under ", ref($handle) || $handle,
+      " fails.\n" if DEBUG;
+    if(ref($handle) and $handle->{'fail'}) {
+      print "WARNING0: maketext fails looking for <$phrase>\n" if DEBUG;
+      my $fail;
+      if(ref($fail = $handle->{'fail'}) eq 'CODE') { # it's a sub reference
+        return &{$fail}($handle, $phrase, @_);
+         # If it ever returns, it should return a good value.
+      } else { # It's a method name
+        return $handle->$fail($phrase, @_);
+         # If it ever returns, it should return a good value.
+      }
+    } else {
+      # All we know how to do is this;
+      Carp::croak("maketext doesn't know how to say:\n$phrase\nas needed");
+    }
+  }
+
+  return $$value if ref($value) eq 'SCALAR';
+  return $value unless ref($value) eq 'CODE';
+  
+  {
+    local $SIG{'__DIE__'};
+    eval { $value = &$value($handle, @_) };
+  }
+  # If we make it here, there was an exception thrown in the
+  #  call to $value, and so scream:
+  if($@) {
+    my $err = $@;
+    # pretty up the error message
+    $err =~ s<\s+at\s+\(eval\s+\d+\)\s+line\s+(\d+)\.?\n?>
+             <\n in bracket code [compiled line $1],>s;
+    #$err =~ s/\n?$/\n/s;
+    Carp::croak "Error in maketexting \"$phrase\":\n$err as used";
+    # Rather unexpected, but suppose that the sub tried calling
+    # a method that didn't exist.
+  } else {
+    return $value;
+  }
+}
+
+###########################################################################
+
+sub get_handle {  # This is a constructor and, yes, it CAN FAIL.
+  # Its class argument has to be the base class for the current
+  # application's l10n files.
+
+  my($base_class, @languages) = @_;
+  $base_class = ref($base_class) || $base_class;
+   # Complain if they use __PACKAGE__ as a project base class?
+  
+  if( @languages ) {
+    DEBUG and print "Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+    if($USING_LANGUAGE_TAGS) {   # An explicit language-list was given!
+      @languages =
+       map {; $_, I18N::LangTags::alternate_language_tags($_) }
+        # Catch alternation
+       map I18N::LangTags::locale2language_tag($_),
+        # If it's a lg tag, fine, pass thru (untainted)
+        # If it's a locale ID, try converting to a lg tag (untainted),
+        # otherwise nix it.
+       @languages;
+      DEBUG and print "Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+    }
+  } else {
+    @languages = $base_class->_ambient_langprefs;
+  }
+ 
+  @languages = $base_class->_langtag_munging(@languages);
+
+  my %seen;
+  foreach my $module_name ( map { $base_class . "::" . $_ }  @languages ) {
+    next unless length $module_name; # sanity
+    next if $seen{$module_name}++        # Already been here, and it was no-go
+            || !&_try_use($module_name); # Try to use() it, but can't it.
+    return($module_name->new); # Make it!
+  }
+
+  return undef; # Fail!
+}
+
+###########################################################################
+
+sub _langtag_munging {
+  my($base_class, @languages) = @_;
+
+  # We have all these DEBUG statements because otherwise it's hard as hell
+  # to diagnose ifwhen something goes wrong.
+
+  DEBUG and print "Lgs1: ", map("<$_>", @languages), "\n";
+
+  if($USING_LANGUAGE_TAGS) {
+    DEBUG and print "Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+    @languages     = $base_class->_add_supers( @languages );
+
+    push @languages, I18N::LangTags::panic_languages(@languages);
+    DEBUG and print "After adding panic languages:\n", 
+      " Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+
+    push @languages, $base_class->fallback_languages;
+     # You are free to override fallback_languages to return empty-list!
+    DEBUG and print "Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+
+    @languages =  # final bit of processing to turn them into classname things
+      map {
+        my $it = $_;  # copy
+        $it =~ tr<-A-Z><_a-z>; # lc, and turn - to _
+        $it =~ tr<_a-z0-9><>cd;  # remove all but a-z0-9_
+        $it;
+      } @languages
+    ;
+    DEBUG and print "Nearing end of munging:\n", 
+      " Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+  } else {
+    DEBUG and print "Bypassing language-tags.\n", 
+      " Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+  }
+
+  DEBUG and print "Before adding fallback classes:\n", 
+    " Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+
+  push @languages, $base_class->fallback_language_classes;
+   # You are free to override that to return whatever.
+
+  DEBUG and print "Finally:\n", 
+    " Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+
+  return @languages;
+}
+
+###########################################################################
+
+sub _ambient_langprefs {
+  require I18N::LangTags::Detect;
+  return  I18N::LangTags::Detect::detect();
+}
+
+###########################################################################
+
+sub _add_supers {
+  my($base_class, @languages) = @_;
+
+  if(!$MATCH_SUPERS) {
+    # Nothing
+    DEBUG and print "Bypassing any super-matching.\n", 
+      " Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+
+  } elsif( $MATCH_SUPERS_TIGHTLY ) {
+    DEBUG and print "Before adding new supers tightly:\n", 
+      " Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+    @languages = I18N::LangTags::implicate_supers( @languages );
+    DEBUG and print "After adding new supers tightly:\n", 
+      " Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+
+  } else {
+    DEBUG and print "Before adding supers to end:\n", 
+      " Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+    @languages = I18N::LangTags::implicate_supers_strictly( @languages );
+    DEBUG and print "After adding supers to end:\n", 
+      " Lgs\@", __LINE__, ": ", map("<$_>", @languages), "\n";
+  }
+  
+  return @languages;
+}
+
+###########################################################################
+#
+# This is where most people should stop reading.
+#
+###########################################################################
+
+use Locale::Maketext::GutsLoader;
+
+###########################################################################
+
+my %tried = ();
+  # memoization of whether we've used this module, or found it unusable.
+
+sub _try_use {   # Basically a wrapper around "require Modulename"
+  # "Many men have tried..."  "They tried and failed?"  "They tried and died."
+  return $tried{$_[0]} if exists $tried{$_[0]};  # memoization
+
+  my $module = $_[0];   # ASSUME sane module name!
+  { no strict 'refs';
+    return($tried{$module} = 1)
+     if defined(%{$module . "::Lexicon"}) or defined(@{$module . "::ISA"});
+    # weird case: we never use'd it, but there it is!
+  }
+
+  print " About to use $module ...\n" if DEBUG;
+  {
+    local $SIG{'__DIE__'};
+    eval "require $module"; # used to be "use $module", but no point in that.
+  }
+  if($@) {
+    print "Error using $module \: $@\n" if DEBUG > 1;
+    return $tried{$module} = 0;
+  } else {
+    print " OK, $module is used\n" if DEBUG;
+    return $tried{$module} = 1;
+  }
+}
+
+#--------------------------------------------------------------------------
+
+sub _lex_refs {  # report the lexicon references for this handle's class
+  # returns an arrayREF!
+  no strict 'refs';
+  my $class = ref($_[0]) || $_[0];
+  print "Lex refs lookup on $class\n" if DEBUG > 1;
+  return $isa_scan{$class} if exists $isa_scan{$class};  # memoization!
+
+  my @lex_refs;
+  my $seen_r = ref($_[1]) ? $_[1] : {};
+
+  if( defined( *{$class . '::Lexicon'}{'HASH'} )) {
+    push @lex_refs, *{$class . '::Lexicon'}{'HASH'};
+    print "%" . $class . "::Lexicon contains ",
+         scalar(keys %{$class . '::Lexicon'}), " entries\n" if DEBUG;
+  }
+
+  # Implements depth(height?)-first recursive searching of superclasses.
+  # In hindsight, I suppose I could have just used Class::ISA!
+  foreach my $superclass (@{$class . "::ISA"}) {
+    print " Super-class search into $superclass\n" if DEBUG;
+    next if $seen_r->{$superclass}++;
+    push @lex_refs, @{&_lex_refs($superclass, $seen_r)};  # call myself
+  }
+
+  $isa_scan{$class} = \@lex_refs; # save for next time
+  return \@lex_refs;
+}
+
+sub clear_isa_scan { %isa_scan = (); return; } # end on a note of simplicity!
+
+###########################################################################
+1;
+
+__END__
+
+HEY YOU!  You need some FOOD!
+
+
+  ~~ Tangy Moroccan Carrot Salad ~~
+
+* 6 to 8 medium carrots, peeled and then sliced in 1/4-inch rounds
+* 1/4 teaspoon chile powder (cayenne, chipotle, ancho, or the like)
+* 1 tablespoon ground cumin
+* 1 tablespoon honey
+* The juice of about a half a big lemon, or of a whole smaller one
+* 1/3 cup olive oil
+* 1 tablespoon of fresh dill, washed and chopped fine
+* Pinch of salt, maybe a pinch of pepper
+
+Cook the carrots in a pot of boiling water until just tender -- roughly
+six minutes.  (Just don't let them get mushy!)  Drain the carrots.
+
+In a largish bowl, combine the lemon juice, the cumin, the chile
+powder, and the honey.  Mix well.
+Add the olive oil and whisk it together well.  Add the dill and stir.
+
+Add the warm carrots to the bowl and toss it all to coat the carrots
+well.  Season with salt and pepper, to taste.
+
+Serve warm or at room temperature.
+
+The measurements here are very approximate, and you should feel free to
+improvise and experiment.  It's a very forgiving recipe.  For example,
+you could easily halve or double the amount of cumin, or use chopped mint
+leaves instead of dill, or lime juice instead of lemon, et cetera.
+
+[end]
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext.pod	(revision 14489)
@@ -0,0 +1,1320 @@
+
+# Time-stamp: "2004-01-11 18:35:34 AST"
+
+=head1 NAME
+
+Locale::Maketext - framework for localization
+
+=head1 SYNOPSIS
+
+  package MyProgram;
+  use strict;
+  use MyProgram::L10N;
+   # ...which inherits from Locale::Maketext
+  my $lh = MyProgram::L10N->get_handle() || die "What language?";
+  ...
+  # And then any messages your program emits, like:
+  warn $lh->maketext( "Can't open file [_1]: [_2]\n", $f, $! );
+  ...
+
+=head1 DESCRIPTION
+
+It is a common feature of applications (whether run directly,
+or via the Web) for them to be "localized" -- i.e., for them
+to a present an English interface to an English-speaker, a German
+interface to a German-speaker, and so on for all languages it's
+programmed with.  Locale::Maketext
+is a framework for software localization; it provides you with the
+tools for organizing and accessing the bits of text and text-processing
+code that you need for producing localized applications.
+
+In order to make sense of Maketext and how all its
+components fit together, you should probably
+go read L<Locale::Maketext::TPJ13|Locale::Maketext::TPJ13>, and
+I<then> read the following documentation.
+
+You may also want to read over the source for C<File::Findgrep>
+and its constituent modules -- they are a complete (if small)
+example application that uses Maketext.
+
+=head1 QUICK OVERVIEW
+
+The basic design of Locale::Maketext is object-oriented, and
+Locale::Maketext is an abstract base class, from which you
+derive a "project class".
+The project class (with a name like "TkBocciBall::Localize",
+which you then use in your module) is in turn the base class
+for all the "language classes" for your project
+(with names "TkBocciBall::Localize::it", 
+"TkBocciBall::Localize::en",
+"TkBocciBall::Localize::fr", etc.).
+
+A language class is
+a class containing a lexicon of phrases as class data,
+and possibly also some methods that are of use in interpreting
+phrases in the lexicon, or otherwise dealing with text in that
+language.
+
+An object belonging to a language class is called a "language
+handle"; it's typically a flyweight object.
+
+The normal course of action is to call:
+
+  use TkBocciBall::Localize;  # the localization project class
+  $lh = TkBocciBall::Localize->get_handle();
+   # Depending on the user's locale, etc., this will
+   # make a language handle from among the classes available,
+   # and any defaults that you declare.
+  die "Couldn't make a language handle??" unless $lh;
+
+From then on, you use the C<maketext> function to access
+entries in whatever lexicon(s) belong to the language handle
+you got.  So, this:
+
+  print $lh->maketext("You won!"), "\n";
+
+...emits the right text for this language.  If the object
+in C<$lh> belongs to class "TkBocciBall::Localize::fr" and
+%TkBocciBall::Localize::fr::Lexicon contains C<("You won!"
+=E<gt> "Tu as gagnE<eacute>!")>, then the above
+code happily tells the user "Tu as gagnE<eacute>!".
+
+=head1 METHODS
+
+Locale::Maketext offers a variety of methods, which fall
+into three categories:
+
+=over
+
+=item *
+
+Methods to do with constructing language handles.
+
+=item *
+
+C<maketext> and other methods to do with accessing %Lexicon data
+for a given language handle.
+
+=item *
+
+Methods that you may find it handy to use, from routines of
+yours that you put in %Lexicon entries.
+
+=back
+
+These are covered in the following section.
+
+=head2 Construction Methods
+
+These are to do with constructing a language handle:
+
+=over
+
+=item *
+
+$lh = YourProjClass->get_handle( ...langtags... ) || die "lg-handle?";
+
+This tries loading classes based on the language-tags you give (like
+C<("en-US", "sk", "kon", "es-MX", "ja", "i-klingon")>, and for the first class
+that succeeds, returns YourProjClass::I<language>->new().
+
+It runs thru the entire given list of language-tags, and finds no classes
+for those exact terms, it then tries "superordinate" language classes.
+So if no "en-US" class (i.e., YourProjClass::en_us)
+was found, nor classes for anything else in that list, we then try
+its superordinate, "en" (i.e., YourProjClass::en), and so on thru 
+the other language-tags in the given list: "es".
+(The other language-tags in our example list: 
+happen to have no superordinates.)
+
+If none of those language-tags leads to loadable classes, we then
+try classes derived from YourProjClass->fallback_languages() and
+then if nothing comes of that, we use classes named by
+YourProjClass->fallback_language_classes().  Then in the (probably
+quite unlikely) event that that fails, we just return undef.
+
+=item *
+
+$lh = YourProjClass->get_handleB<()> || die "lg-handle?";
+
+When C<get_handle> is called with an empty parameter list, magic happens:
+
+If C<get_handle> senses that it's running in program that was
+invoked as a CGI, then it tries to get language-tags out of the
+environment variable "HTTP_ACCEPT_LANGUAGE", and it pretends that
+those were the languages passed as parameters to C<get_handle>.
+
+Otherwise (i.e., if not a CGI), this tries various OS-specific ways
+to get the language-tags for the current locale/language, and then
+pretends that those were the value(s) passed to C<get_handle>.
+
+Currently this OS-specific stuff consists of looking in the environment
+variables "LANG" and "LANGUAGE"; and on MSWin machines (where those
+variables are typically unused), this also tries using
+the module Win32::Locale to get a language-tag for whatever language/locale
+is currently selected in the "Regional Settings" (or "International"?)
+Control Panel.  I welcome further
+suggestions for making this do the Right Thing under other operating
+systems that support localization.
+
+If you're using localization in an application that keeps a configuration
+file, you might consider something like this in your project class:
+
+  sub get_handle_via_config {
+    my $class = $_[0];
+    my $preferred_language = $Config_settings{'language'};
+    my $lh;
+    if($preferred_language) {
+      $lh = $class->get_handle($chosen_language)
+       || die "No language handle for \"$chosen_language\" or the like";
+    } else {
+      # Config file missing, maybe?
+      $lh = $class->get_handle()
+       || die "Can't get a language handle";
+    }
+    return $lh;
+  }
+
+=item *
+
+$lh = YourProjClass::langname->new();
+
+This constructs a language handle.  You usually B<don't> call this
+directly, but instead let C<get_handle> find a language class to C<use>
+and to then call ->new on.
+
+=item *
+
+$lh->init();
+
+This is called by ->new to initialize newly-constructed language handles.
+If you define an init method in your class, remember that it's usually
+considered a good idea to call $lh->SUPER::init in it (presumably at the
+beginning), so that all classes get a chance to initialize a new object
+however they see fit.
+
+=item *
+
+YourProjClass->fallback_languages()
+
+C<get_handle> appends the return value of this to the end of
+whatever list of languages you pass C<get_handle>.  Unless
+you override this method, your project class
+will inherit Locale::Maketext's C<fallback_languages>, which
+currently returns C<('i-default', 'en', 'en-US')>.
+("i-default" is defined in RFC 2277).
+
+This method (by having it return the name
+of a language-tag that has an existing language class)
+can be used for making sure that
+C<get_handle> will always manage to construct a language
+handle (assuming your language classes are in an appropriate
+@INC directory).  Or you can use the next method:
+
+=item *
+
+YourProjClass->fallback_language_classes()
+
+C<get_handle> appends the return value of this to the end
+of the list of classes it will try using.  Unless
+you override this method, your project class
+will inherit Locale::Maketext's C<fallback_language_classes>,
+which currently returns an empty list, C<()>.
+By setting this to some value (namely, the name of a loadable
+language class), you can be sure that
+C<get_handle> will always manage to construct a language
+handle.
+
+=back
+
+=head2 The "maketext" Method
+
+This is the most important method in Locale::Maketext:
+
+$text = $lh->maketext(I<key>, ...parameters for this phrase...);
+
+This looks in the %Lexicon of the language handle
+$lh and all its superclasses, looking
+for an entry whose key is the string I<key>.  Assuming such
+an entry is found, various things then happen, depending on the
+value found:
+
+If the value is a scalarref, the scalar is dereferenced and returned
+(and any parameters are ignored).
+If the value is a coderef, we return &$value($lh, ...parameters...).
+If the value is a string that I<doesn't> look like it's in Bracket Notation,
+we return it (after replacing it with a scalarref, in its %Lexicon).
+If the value I<does> look like it's in Bracket Notation, then we compile
+it into a sub, replace the string in the %Lexicon with the new coderef,
+and then we return &$new_sub($lh, ...parameters...).
+
+Bracket Notation is discussed in a later section.  Note
+that trying to compile a string into Bracket Notation can throw
+an exception if the string is not syntactically valid (say, by not
+balancing brackets right.)
+
+Also, calling &$coderef($lh, ...parameters...) can throw any sort of
+exception (if, say, code in that sub tries to divide by zero).  But
+a very common exception occurs when you have Bracket
+Notation text that says to call a method "foo", but there is no such
+method.  (E.g., "You have [quaB<tn>,_1,ball]." will throw an exception
+on trying to call $lh->quaB<tn>($_[1],'ball') -- you presumably meant
+"quant".)  C<maketext> catches these exceptions, but only to make the
+error message more readable, at which point it rethrows the exception.
+
+An exception I<may> be thrown if I<key> is not found in any
+of $lh's %Lexicon hashes.  What happens if a key is not found,
+is discussed in a later section, "Controlling Lookup Failure".
+
+Note that you might find it useful in some cases to override
+the C<maketext> method with an "after method", if you want to
+translate encodings, or even scripts:
+
+    package YrProj::zh_cn; # Chinese with PRC-style glyphs
+    use base ('YrProj::zh_tw');  # Taiwan-style
+    sub maketext {
+      my $self = shift(@_);
+      my $value = $self->maketext(@_);
+      return Chineeze::taiwan2mainland($value);
+    }
+
+Or you may want to override it with something that traps
+any exceptions, if that's critical to your program:
+
+  sub maketext {
+    my($lh, @stuff) = @_;
+    my $out;
+    eval { $out = $lh->SUPER::maketext(@stuff) };
+    return $out unless $@;
+    ...otherwise deal with the exception...
+  }
+
+Other than those two situations, I don't imagine that
+it's useful to override the C<maketext> method.  (If
+you run into a situation where it is useful, I'd be
+interested in hearing about it.)
+
+=over
+
+=item $lh->fail_with I<or> $lh->fail_with(I<PARAM>)
+
+=item $lh->failure_handler_auto
+
+These two methods are discussed in the section "Controlling
+Lookup Failure".
+
+=back
+
+=head2 Utility Methods
+
+These are methods that you may find it handy to use, generally
+from %Lexicon routines of yours (whether expressed as
+Bracket Notation or not).
+
+=over
+
+=item $language->quant($number, $singular)
+
+=item $language->quant($number, $singular, $plural)
+
+=item $language->quant($number, $singular, $plural, $negative)
+
+This is generally meant to be called from inside Bracket Notation
+(which is discussed later), as in 
+
+     "Your search matched [quant,_1,document]!"
+
+It's for I<quantifying> a noun (i.e., saying how much of it there is,
+while giving the correct form of it).  The behavior of this method is
+handy for English and a few other Western European languages, and you
+should override it for languages where it's not suitable.  You can feel
+free to read the source, but the current implementation is basically
+as this pseudocode describes:
+
+     if $number is 0 and there's a $negative,
+        return $negative;
+     elsif $number is 1,
+        return "1 $singular";
+     elsif there's a $plural,
+        return "$number $plural";
+     else
+        return "$number " . $singular . "s";
+     #
+     # ...except that we actually call numf to
+     #  stringify $number before returning it.
+
+So for English (with Bracket Notation)
+C<"...[quant,_1,file]..."> is fine (for 0 it returns "0 files",
+for 1 it returns "1 file", and for more it returns "2 files", etc.)
+
+But for "directory", you'd want C<"[quant,_1,directory,directories]">
+so that our elementary C<quant> method doesn't think that the
+plural of "directory" is "directorys".  And you might find that the
+output may sound better if you specify a negative form, as in:
+
+     "[quant,_1,file,files,No files] matched your query.\n"
+
+Remember to keep in mind verb agreement (or adjectives too, in
+other languages), as in:
+
+     "[quant,_1,document] were matched.\n"
+
+Because if _1 is one, you get "1 document B<were> matched".
+An acceptable hack here is to do something like this:
+
+     "[quant,_1,document was, documents were] matched.\n"
+
+=item $language->numf($number)
+
+This returns the given number formatted nicely according to
+this language's conventions.  Maketext's default method is
+mostly to just take the normal string form of the number
+(applying sprintf "%G" for only very large numbers), and then
+to add commas as necessary.  (Except that
+we apply C<tr/,./.,/> if $language->{'numf_comma'} is true;
+that's a bit of a hack that's useful for languages that express
+two million as "2.000.000" and not as "2,000,000").
+
+If you want anything fancier, consider overriding this with something
+that uses L<Number::Format|Number::Format>, or does something else
+entirely.
+
+Note that numf is called by quant for stringifying all quantifying
+numbers.
+
+=item $language->sprintf($format, @items)
+
+This is just a wrapper around Perl's normal C<sprintf> function.
+It's provided so that you can use "sprintf" in Bracket Notation:
+
+     "Couldn't access datanode [sprintf,%10x=~[%s~],_1,_2]!\n"
+
+returning...
+
+     Couldn't access datanode      Stuff=[thangamabob]!
+
+=item $language->language_tag()
+
+Currently this just takes the last bit of C<ref($language)>, turns
+underscores to dashes, and returns it.  So if $language is
+an object of class Hee::HOO::Haw::en_us, $language->language_tag()
+returns "en-us".  (Yes, the usual representation for that language
+tag is "en-US", but case is I<never> considered meaningful in
+language-tag comparison.)
+
+You may override this as you like; Maketext doesn't use it for
+anything.
+
+=item $language->encoding()
+
+Currently this isn't used for anything, but it's provided
+(with default value of
+C<(ref($language) && $language-E<gt>{'encoding'})) or "iso-8859-1">
+) as a sort of suggestion that it may be useful/necessary to
+associate encodings with your language handles (whether on a
+per-class or even per-handle basis.)
+
+=back
+
+=head2 Language Handle Attributes and Internals
+
+A language handle is a flyweight object -- i.e., it doesn't (necessarily)
+carry any data of interest, other than just being a member of
+whatever class it belongs to.
+
+A language handle is implemented as a blessed hash.  Subclasses of yours
+can store whatever data you want in the hash.  Currently the only hash
+entry used by any crucial Maketext method is "fail", so feel free to
+use anything else as you like.
+
+B<Remember: Don't be afraid to read the Maketext source if there's
+any point on which this documentation is unclear.>  This documentation
+is vastly longer than the module source itself.
+
+=over
+
+=back
+
+=head1 LANGUAGE CLASS HIERARCHIES
+
+These are Locale::Maketext's assumptions about the class
+hierarchy formed by all your language classes:
+
+=over
+
+=item *
+
+You must have a project base class, which you load, and
+which you then use as the first argument in
+the call to YourProjClass->get_handle(...).  It should derive
+(whether directly or indirectly) from Locale::Maketext.
+It B<doesn't matter> how you name this class, altho assuming this
+is the localization component of your Super Mega Program,
+good names for your project class might be
+SuperMegaProgram::Localization, SuperMegaProgram::L10N,
+SuperMegaProgram::I18N, SuperMegaProgram::International,
+or even SuperMegaProgram::Languages or SuperMegaProgram::Messages.
+
+=item *
+
+Language classes are what YourProjClass->get_handle will try to load.
+It will look for them by taking each language-tag (B<skipping> it
+if it doesn't look like a language-tag or locale-tag!), turning it to
+all lowercase, turning and dashes to underscores, and appending it
+to YourProjClass . "::".  So this:
+
+  $lh = YourProjClass->get_handle(
+    'en-US', 'fr', 'kon', 'i-klingon', 'i-klingon-romanized'
+  );
+
+will try loading the classes 
+YourProjClass::en_us (note lowercase!), YourProjClass::fr, 
+YourProjClass::kon,
+YourProjClass::i_klingon
+and YourProjClass::i_klingon_romanized.  (And it'll stop at the
+first one that actually loads.)
+
+=item *
+
+I assume that each language class derives (directly or indirectly)
+from your project class, and also defines its @ISA, its %Lexicon,
+or both.  But I anticipate no dire consequences if these assumptions
+do not hold.
+
+=item *
+
+Language classes may derive from other language classes (altho they
+should have "use I<Thatclassname>" or "use base qw(I<...classes...>)").
+They may derive from the project
+class.  They may derive from some other class altogether.  Or via
+multiple inheritance, it may derive from any mixture of these.
+
+=item *
+
+I foresee no problems with having multiple inheritance in
+your hierarchy of language classes.  (As usual, however, Perl will
+complain bitterly if you have a cycle in the hierarchy: i.e., if
+any class is its own ancestor.)
+
+=back
+
+=head1 ENTRIES IN EACH LEXICON
+
+A typical %Lexicon entry is meant to signify a phrase,
+taking some number (0 or more) of parameters.  An entry
+is meant to be accessed by via
+a string I<key> in $lh->maketext(I<key>, ...parameters...),
+which should return a string that is generally meant for
+be used for "output" to the user -- regardless of whether
+this actually means printing to STDOUT, writing to a file,
+or putting into a GUI widget.
+
+While the key must be a string value (since that's a basic
+restriction that Perl places on hash keys), the value in
+the lexicon can currently be of several types:
+a defined scalar, scalarref, or coderef.  The use of these is
+explained above, in the section 'The "maketext" Method', and
+Bracket Notation for strings is discussed in the next section.
+
+While you can use arbitrary unique IDs for lexicon keys
+(like "_min_larger_max_error"), it is often
+useful for if an entry's key is itself a valid value, like
+this example error message:
+
+  "Minimum ([_1]) is larger than maximum ([_2])!\n",
+
+Compare this code that uses an arbitrary ID...
+
+  die $lh->maketext( "_min_larger_max_error", $min, $max )
+   if $min > $max;
+
+...to this code that uses a key-as-value:
+
+  die $lh->maketext(
+   "Minimum ([_1]) is larger than maximum ([_2])!\n",
+   $min, $max
+  ) if $min > $max;
+
+The second is, in short, more readable.  In particular, it's obvious
+that the number of parameters you're feeding to that phrase (two) is
+the number of parameters that it I<wants> to be fed.  (Since you see
+_1 and a _2 being used in the key there.)
+
+Also, once a project is otherwise
+complete and you start to localize it, you can scrape together
+all the various keys you use, and pass it to a translator; and then
+the translator's work will go faster if what he's presented is this:
+
+ "Minimum ([_1]) is larger than maximum ([_2])!\n",
+  => "",   # fill in something here, Jacques!
+
+rather than this more cryptic mess:
+
+ "_min_larger_max_error"
+  => "",   # fill in something here, Jacques
+
+I think that keys as lexicon values makes the completed lexicon
+entries more readable:
+
+ "Minimum ([_1]) is larger than maximum ([_2])!\n",
+  => "Le minimum ([_1]) est plus grand que le maximum ([_2])!\n",
+
+Also, having valid values as keys becomes very useful if you set
+up an _AUTO lexicon.  _AUTO lexicons are discussed in a later
+section.
+
+I almost always use keys that are themselves
+valid lexicon values.  One notable exception is when the value is
+quite long.  For example, to get the screenful of data that
+a command-line program might returns when given an unknown switch,
+I often just use a key "_USAGE_MESSAGE".  At that point I then go
+and immediately to define that lexicon entry in the
+ProjectClass::L10N::en lexicon (since English is always my "project
+language"):
+
+  '_USAGE_MESSAGE' => <<'EOSTUFF',
+  ...long long message...
+  EOSTUFF
+
+and then I can use it as:
+
+  getopt('oDI', \%opts) or die $lh->maketext('_USAGE_MESSAGE');
+
+Incidentally,
+note that each class's C<%Lexicon> inherits-and-extends
+the lexicons in its superclasses.  This is not because these are
+special hashes I<per se>, but because you access them via the
+C<maketext> method, which looks for entries across all the
+C<%Lexicon>'s in a language class I<and> all its ancestor classes.
+(This is because the idea of "class data" isn't directly implemented
+in Perl, but is instead left to individual class-systems to implement
+as they see fit..)
+
+Note that you may have things stored in a lexicon
+besides just phrases for output:  for example, if your program
+takes input from the keyboard, asking a "(Y/N)" question,
+you probably need to know what equivalent of "Y[es]/N[o]" is
+in whatever language.  You probably also need to know what
+the equivalents of the answers "y" and "n" are.  You can
+store that information in the lexicon (say, under the keys
+"~answer_y" and "~answer_n", and the long forms as
+"~answer_yes" and "~answer_no", where "~" is just an ad-hoc
+character meant to indicate to programmers/translators that
+these are not phrases for output).
+
+Or instead of storing this in the language class's lexicon,
+you can (and, in some cases, really should) represent the same bit
+of knowledge as code is a method in the language class.  (That
+leaves a tidy distinction between the lexicon as the things we
+know how to I<say>, and the rest of the things in the lexicon class
+as things that we know how to I<do>.)  Consider
+this example of a processor for responses to French "oui/non"
+questions:
+
+  sub y_or_n {
+    return undef unless defined $_[1] and length $_[1];
+    my $answer = lc $_[1];  # smash case
+    return 1 if $answer eq 'o' or $answer eq 'oui';
+    return 0 if $answer eq 'n' or $answer eq 'non';
+    return undef;
+  }
+
+...which you'd then call in a construct like this:
+
+  my $response;
+  until(defined $response) {
+    print $lh->maketext("Open the pod bay door (y/n)? ");
+    $response = $lh->y_or_n( get_input_from_keyboard_somehow() );
+  }
+  if($response) { $pod_bay_door->open()         }
+  else          { $pod_bay_door->leave_closed() }
+
+Other data worth storing in a lexicon might be things like
+filenames for language-targetted resources:
+
+  ...
+  "_main_splash_png"
+    => "/styles/en_us/main_splash.png",
+  "_main_splash_imagemap"
+    => "/styles/en_us/main_splash.incl",
+  "_general_graphics_path"
+    => "/styles/en_us/",
+  "_alert_sound"
+    => "/styles/en_us/hey_there.wav",
+  "_forward_icon"
+   => "left_arrow.png",
+  "_backward_icon"
+   => "right_arrow.png",
+  # In some other languages, left equals
+  #  BACKwards, and right is FOREwards.
+  ...
+
+You might want to do the same thing for expressing key bindings
+or the like (since hardwiring "q" as the binding for the function
+that quits a screen/menu/program is useful only if your language
+happens to associate "q" with "quit"!)
+
+=head1 BRACKET NOTATION
+
+Bracket Notation is a crucial feature of Locale::Maketext.  I mean
+Bracket Notation to provide a replacement for sprintf formatting.
+Everything you do with Bracket Notation could be done with a sub block,
+but bracket notation is meant to be much more concise.
+
+Bracket Notation is a like a miniature "template" system (in the sense
+of L<Text::Template|Text::Template>, not in the sense of C++ templates),
+where normal text is passed thru basically as is, but text is special
+regions is specially interpreted.  In Bracket Notation, you use brackets
+("[...]" -- not "{...}"!) to note sections that are specially interpreted.
+
+For example, here all the areas that are taken literally are underlined with
+a "^", and all the in-bracket special regions are underlined with an X:
+
+  "Minimum ([_1]) is larger than maximum ([_2])!\n",
+   ^^^^^^^^^ XX ^^^^^^^^^^^^^^^^^^^^^^^^^^ XX ^^^^
+
+When that string is compiled from bracket notation into a real Perl sub,
+it's basically turned into:
+
+  sub {
+    my $lh = $_[0];
+    my @params = @_;
+    return join '',
+      "Minimum (",
+      ...some code here...
+      ") is larger than maximum (",
+      ...some code here...
+      ")!\n",
+  }
+  # to be called by $lh->maketext(KEY, params...)
+   
+In other words, text outside bracket groups is turned into string
+literals.  Text in brackets is rather more complex, and currently follows
+these rules:
+
+=over
+
+=item *
+
+Bracket groups that are empty, or which consist only of whitespace,
+are ignored.  (Examples: "[]", "[    ]", or a [ and a ] with returns
+and/or tabs and/or spaces between them.
+
+Otherwise, each group is taken to be a comma-separated group of items,
+and each item is interpreted as follows:
+
+=item *
+
+An item that is "_I<digits>" or "_-I<digits>" is interpreted as
+$_[I<value>].  I.e., "_1" is becomes with $_[1], and "_-3" is interpreted
+as $_[-3] (in which case @_ should have at least three elements in it).
+Note that $_[0] is the language handle, and is typically not named
+directly.
+
+=item *
+
+An item "_*" is interpreted to mean "all of @_ except $_[0]".
+I.e., C<@_[1..$#_]>.  Note that this is an empty list in the case
+of calls like $lh->maketext(I<key>) where there are no
+parameters (except $_[0], the language handle).
+
+=item *
+
+Otherwise, each item is interpreted as a string literal.
+
+=back
+
+The group as a whole is interpreted as follows:
+
+=over
+
+=item *
+
+If the first item in a bracket group looks like a method name,
+then that group is interpreted like this:
+
+  $lh->that_method_name(
+    ...rest of items in this group...
+  ),
+
+=item *
+
+If the first item in a bracket group is "*", it's taken as shorthand
+for the so commonly called "quant" method.  Similarly, if the first
+item in a bracket group is "#", it's taken to be shorthand for
+"numf".
+
+=item *
+
+If the first item in a bracket group is empty-string, or "_*"
+or "_I<digits>" or "_-I<digits>", then that group is interpreted
+as just the interpolation of all its items:
+
+  join('',
+    ...rest of items in this group...
+  ),
+
+Examples:  "[_1]" and "[,_1]", which are synonymous; and
+"C<[,ID-(,_4,-,_2,)]>", which compiles as
+C<join "", "ID-(", $_[4], "-", $_[2], ")">.
+
+=item *
+
+Otherwise this bracket group is invalid.  For example, in the group
+"[!@#,whatever]", the first item C<"!@#"> is neither empty-string,
+"_I<number>", "_-I<number>", "_*", nor a valid method name; and so
+Locale::Maketext will throw an exception of you try compiling an
+expression containing this bracket group.
+
+=back
+
+Note, incidentally, that items in each group are comma-separated,
+not C</\s*,\s*/>-separated.  That is, you might expect that this
+bracket group:
+
+  "Hoohah [foo, _1 , bar ,baz]!"
+
+would compile to this:
+
+  sub {
+    my $lh = $_[0];
+    return join '',
+      "Hoohah ",
+      $lh->foo( $_[1], "bar", "baz"),
+      "!",
+  }
+
+But it actually compiles as this:
+
+  sub {
+    my $lh = $_[0];
+    return join '',
+      "Hoohah ",
+      $lh->foo(" _1 ", " bar ", "baz"),  #!!!
+      "!",
+  }
+
+In the notation discussed so far, the characters "[" and "]" are given
+special meaning, for opening and closing bracket groups, and "," has
+a special meaning inside bracket groups, where it separates items in the
+group.  This begs the question of how you'd express a literal "[" or
+"]" in a Bracket Notation string, and how you'd express a literal
+comma inside a bracket group.  For this purpose I've adopted "~" (tilde)
+as an escape character:  "~[" means a literal '[' character anywhere
+in Bracket Notation (i.e., regardless of whether you're in a bracket
+group or not), and ditto for "~]" meaning a literal ']', and "~," meaning
+a literal comma.  (Altho "," means a literal comma outside of
+bracket groups -- it's only inside bracket groups that commas are special.)
+
+And on the off chance you need a literal tilde in a bracket expression,
+you get it with "~~".
+
+Currently, an unescaped "~" before a character
+other than a bracket or a comma is taken to mean just a "~" and that
+character.  I.e., "~X" means the same as "~~X" -- i.e., one literal tilde,
+and then one literal "X".  However, by using "~X", you are assuming that
+no future version of Maketext will use "~X" as a magic escape sequence.
+In practice this is not a great problem, since first off you can just
+write "~~X" and not worry about it; second off, I doubt I'll add lots
+of new magic characters to bracket notation; and third off, you
+aren't likely to want literal "~" characters in your messages anyway,
+since it's not a character with wide use in natural language text.
+
+Brackets must be balanced -- every openbracket must have
+one matching closebracket, and vice versa.  So these are all B<invalid>:
+
+  "I ate [quant,_1,rhubarb pie."
+  "I ate [quant,_1,rhubarb pie[."
+  "I ate quant,_1,rhubarb pie]."
+  "I ate quant,_1,rhubarb pie[."
+
+Currently, bracket groups do not nest.  That is, you B<cannot> say:
+
+  "Foo [bar,baz,[quux,quuux]]\n";
+
+If you need a notation that's that powerful, use normal Perl:
+
+  %Lexicon = (
+    ...
+    "some_key" => sub {
+      my $lh = $_[0];
+      join '',
+        "Foo ",
+        $lh->bar('baz', $lh->quux('quuux')),
+        "\n",
+    },
+    ...
+  );
+
+Or write the "bar" method so you don't need to pass it the
+output from calling quux.
+
+I do not anticipate that you will need (or particularly want)
+to nest bracket groups, but you are welcome to email me with
+convincing (real-life) arguments to the contrary.
+
+=head1 AUTO LEXICONS
+
+If maketext goes to look in an individual %Lexicon for an entry
+for I<key> (where I<key> does not start with an underscore), and
+sees none, B<but does see> an entry of "_AUTO" => I<some_true_value>,
+then we actually define $Lexicon{I<key>} = I<key> right then and there,
+and then use that value as if it had been there all
+along.  This happens before we even look in any superclass %Lexicons!
+
+(This is meant to be somewhat like the AUTOLOAD mechanism in
+Perl's function call system -- or, looked at another way,
+like the L<AutoLoader|AutoLoader> module.)
+
+I can picture all sorts of circumstances where you just
+do not want lookup to be able to fail (since failing
+normally means that maketext throws a C<die>, altho
+see the next section for greater control over that).  But
+here's one circumstance where _AUTO lexicons are meant to
+be I<especially> useful:
+
+As you're writing an application, you decide as you go what messages
+you need to emit.  Normally you'd go to write this:
+
+  if(-e $filename) {
+    go_process_file($filename)
+  } else {
+    print "Couldn't find file \"$filename\"!\n";
+  }
+
+but since you anticipate localizing this, you write:
+
+  use ThisProject::I18N;
+  my $lh = ThisProject::I18N->get_handle();
+   # For the moment, assume that things are set up so
+   # that we load class ThisProject::I18N::en
+   # and that that's the class that $lh belongs to.
+  ...
+  if(-e $filename) {
+    go_process_file($filename)
+  } else {
+    print $lh->maketext(
+      "Couldn't find file \"[_1]\"!\n", $filename
+    );
+  }
+
+Now, right after you've just written the above lines, you'd
+normally have to go open the file 
+ThisProject/I18N/en.pm, and immediately add an entry:
+
+  "Couldn't find file \"[_1]\"!\n"
+  => "Couldn't find file \"[_1]\"!\n",
+
+But I consider that somewhat of a distraction from the work
+of getting the main code working -- to say nothing of the fact
+that I often have to play with the program a few times before
+I can decide exactly what wording I want in the messages (which
+in this case would require me to go changing three lines of code:
+the call to maketext with that key, and then the two lines in
+ThisProject/I18N/en.pm).
+
+However, if you set "_AUTO => 1" in the %Lexicon in,
+ThisProject/I18N/en.pm (assuming that English (en) is
+the language that all your programmers will be using for this
+project's internal message keys), then you don't ever have to
+go adding lines like this
+
+  "Couldn't find file \"[_1]\"!\n"
+  => "Couldn't find file \"[_1]\"!\n",
+
+to ThisProject/I18N/en.pm, because if _AUTO is true there,
+then just looking for an entry with the key "Couldn't find
+file \"[_1]\"!\n" in that lexicon will cause it to be added,
+with that value!
+
+Note that the reason that keys that start with "_"
+are immune to _AUTO isn't anything generally magical about
+the underscore character -- I just wanted a way to have most
+lexicon keys be autoable, except for possibly a few, and I
+arbitrarily decided to use a leading underscore as a signal
+to distinguish those few.
+
+=head1 CONTROLLING LOOKUP FAILURE
+
+If you call $lh->maketext(I<key>, ...parameters...),
+and there's no entry I<key> in $lh's class's %Lexicon, nor
+in the superclass %Lexicon hash, I<and> if we can't auto-make
+I<key> (because either it starts with a "_", or because none
+of its lexicons have C<_AUTO =E<gt> 1,>), then we have
+failed to find a normal way to maketext I<key>.  What then
+happens in these failure conditions, depends on the $lh object
+"fail" attribute.
+
+If the language handle has no "fail" attribute, maketext
+will simply throw an exception (i.e., it calls C<die>, mentioning
+the I<key> whose lookup failed, and naming the line number where
+the calling $lh->maketext(I<key>,...) was.
+
+If the language handle has a "fail" attribute whose value is a
+coderef, then $lh->maketext(I<key>,...params...) gives up and calls:
+
+  return &{$that_subref}($lh, $key, @params);
+
+Otherwise, the "fail" attribute's value should be a string denoting
+a method name, so that $lh->maketext(I<key>,...params...) can
+give up with:
+
+  return $lh->$that_method_name($phrase, @params);
+
+The "fail" attribute can be accessed with the C<fail_with> method:
+
+  # Set to a coderef:
+  $lh->fail_with( \&failure_handler );
+
+  # Set to a method name:
+  $lh->fail_with( 'failure_method' );
+  
+  # Set to nothing (i.e., so failure throws a plain exception)
+  $lh->fail_with( undef );
+  
+  # Simply read:
+  $handler = $lh->fail_with();
+
+Now, as to what you may want to do with these handlers:  Maybe you'd
+want to log what key failed for what class, and then die.  Maybe
+you don't like C<die> and instead you want to send the error message
+to STDOUT (or wherever) and then merely C<exit()>.
+
+Or maybe you don't want to C<die> at all!  Maybe you could use a
+handler like this:
+
+  # Make all lookups fall back onto an English value,
+  #  but after we log it for later fingerpointing.
+  my $lh_backup = ThisProject->get_handle('en');
+  open(LEX_FAIL_LOG, ">>wherever/lex.log") || die "GNAARGH $!";
+  sub lex_fail {
+    my($failing_lh, $key, $params) = @_;
+    print LEX_FAIL_LOG scalar(localtime), "\t",
+       ref($failing_lh), "\t", $key, "\n";
+    return $lh_backup->maketext($key,@params);
+  }
+
+Some users have expressed that they think this whole mechanism of
+having a "fail" attribute at all, seems a rather pointless complication.
+But I want Locale::Maketext to be usable for software projects of I<any>
+scale and type; and different software projects have different ideas
+of what the right thing is to do in failure conditions.  I could simply
+say that failure always throws an exception, and that if you want to be
+careful, you'll just have to wrap every call to $lh->maketext in an
+S<eval { }>.  However, I want programmers to reserve the right (via
+the "fail" attribute) to treat lookup failure as something other than
+an exception of the same level of severity as a config file being
+unreadable, or some essential resource being inaccessible.
+
+One possibly useful value for the "fail" attribute is the method name
+"failure_handler_auto".  This is a method defined in class
+Locale::Maketext itself.  You set it with:
+
+  $lh->fail_with('failure_handler_auto');
+
+Then when you call $lh->maketext(I<key>, ...parameters...) and
+there's no I<key> in any of those lexicons, maketext gives up with
+
+  return $lh->failure_handler_auto($key, @params);
+
+But failure_handler_auto, instead of dying or anything, compiles
+$key, caching it in $lh->{'failure_lex'}{$key} = $complied,
+and then calls the compiled value, and returns that.  (I.e., if
+$key looks like bracket notation, $compiled is a sub, and we return
+&{$compiled}(@params); but if $key is just a plain string, we just
+return that.)
+
+The effect of using "failure_auto_handler"
+is like an AUTO lexicon, except that it 1) compiles $key even if
+it starts with "_", and 2) you have a record in the new hashref
+$lh->{'failure_lex'} of all the keys that have failed for
+this object.  This should avoid your program dying -- as long
+as your keys aren't actually invalid as bracket code, and as
+long as they don't try calling methods that don't exist.
+
+"failure_auto_handler" may not be exactly what you want, but I
+hope it at least shows you that maketext failure can be mitigated
+in any number of very flexible ways.  If you can formalize exactly
+what you want, you should be able to express that as a failure
+handler.  You can even make it default for every object of a given
+class, by setting it in that class's init:
+
+  sub init {
+    my $lh = $_[0];  # a newborn handle
+    $lh->SUPER::init();
+    $lh->fail_with('my_clever_failure_handler');
+    return;
+  }
+  sub my_clever_failure_handler {
+    ...you clever things here...
+  }
+
+=head1 HOW TO USE MAKETEXT
+
+Here is a brief checklist on how to use Maketext to localize
+applications:
+
+=over
+
+=item *
+
+Decide what system you'll use for lexicon keys.  If you insist,
+you can use opaque IDs (if you're nostalgic for C<catgets>),
+but I have better suggestions in the
+section "Entries in Each Lexicon", above.  Assuming you opt for
+meaningful keys that double as values (like "Minimum ([_1]) is
+larger than maximum ([_2])!\n"), you'll have to settle on what
+language those should be in.  For the sake of argument, I'll
+call this English, specifically American English, "en-US".
+
+=item *
+
+Create a class for your localization project.  This is
+the name of the class that you'll use in the idiom:
+
+  use Projname::L10N;
+  my $lh = Projname::L10N->get_handle(...) || die "Language?";
+
+Assuming your call your class Projname::L10N, create a class
+consisting minimally of:
+
+  package Projname::L10N;
+  use base qw(Locale::Maketext);
+  ...any methods you might want all your languages to share...
+  
+  # And, assuming you want the base class to be an _AUTO lexicon,
+  # as is discussed a few sections up:
+  
+  1;
+
+=item *
+
+Create a class for the language your internal keys are in.  Name
+the class after the language-tag for that language, in lowercase,
+with dashes changed to underscores.  Assuming your project's first
+language is US English, you should call this Projname::L10N::en_us.
+It should consist minimally of:
+
+  package Projname::L10N::en_us;
+  use base qw(Projname::L10N);
+  %Lexicon = (
+    '_AUTO' => 1,
+  );
+  1;
+
+(For the rest of this section, I'll assume that this "first
+language class" of Projname::L10N::en_us has
+_AUTO lexicon.)
+
+=item *
+
+Go and write your program.  Everywhere in your program where 
+you would say:
+
+  print "Foobar $thing stuff\n";
+
+instead do it thru maketext, using no variable interpolation in
+the key:
+
+  print $lh->maketext("Foobar [_1] stuff\n", $thing);
+
+If you get tired of constantly saying C<print $lh-E<gt>maketext>,
+consider making a functional wrapper for it, like so:
+
+  use Projname::L10N;
+  use vars qw($lh);
+  $lh = Projname::L10N->get_handle(...) || die "Language?";
+  sub pmt (@) { print( $lh->maketext(@_)) }
+   # "pmt" is short for "Print MakeText"
+  $Carp::Verbose = 1;
+   # so if maketext fails, we see made the call to pmt
+
+Besides whole phrases meant for output, anything language-dependent
+should be put into the class Projname::L10N::en_us,
+whether as methods, or as lexicon entries -- this is discussed
+in the section "Entries in Each Lexicon", above.
+
+=item *
+
+Once the program is otherwise done, and once its localization for
+the first language works right (via the data and methods in
+Projname::L10N::en_us), you can get together the data for translation.
+If your first language lexicon isn't an _AUTO lexicon, then you already
+have all the messages explicitly in the lexicon (or else you'd be
+getting exceptions thrown when you call $lh->maketext to get
+messages that aren't in there).  But if you were (advisedly) lazy and are
+using an _AUTO lexicon, then you've got to make a list of all the phrases
+that you've so far been letting _AUTO generate for you.  There are very
+many ways to assemble such a list.  The most straightforward is to simply
+grep the source for every occurrence of "maketext" (or calls
+to wrappers around it, like the above C<pmt> function), and to log the
+following phrase.
+
+=item *
+
+You may at this point want to consider whether the your base class 
+(Projname::L10N) that all lexicons inherit from (Projname::L10N::en,
+Projname::L10N::es, etc.) should be an _AUTO lexicon.  It may be true
+that in theory, all needed messages will be in each language class;
+but in the presumably unlikely or "impossible" case of lookup failure,
+you should consider whether your program should throw an exception,
+emit text in English (or whatever your project's first language is),
+or some more complex solution as described in the section
+"Controlling Lookup Failure", above.
+
+=item *
+
+Submit all messages/phrases/etc. to translators.
+
+(You may, in fact, want to start with localizing to I<one> other language
+at first, if you're not sure that you've property abstracted the
+language-dependent parts of your code.)
+
+Translators may request clarification of the situation in which a
+particular phrase is found.  For example, in English we are entirely happy
+saying "I<n> files found", regardless of whether we mean "I looked for files,
+and found I<n> of them" or the rather distinct situation of "I looked for
+something else (like lines in files), and along the way I saw I<n>
+files."  This may involve rethinking things that you thought quite clear:
+should "Edit" on a toolbar be a noun ("editing") or a verb ("to edit")?  Is
+there already a conventionalized way to express that menu option, separate
+from the target language's normal word for "to edit"?
+
+In all cases where the very common phenomenon of quantification
+(saying "I<N> files", for B<any> value of N)
+is involved, each translator should make clear what dependencies the
+number causes in the sentence.  In many cases, dependency is
+limited to words adjacent to the number, in places where you might
+expect them ("I found the-?PLURAL I<N>
+empty-?PLURAL directory-?PLURAL"), but in some cases there are
+unexpected dependencies ("I found-?PLURAL ..."!) as well as long-distance
+dependencies "The I<N> directory-?PLURAL could not be deleted-?PLURAL"!).
+
+Remind the translators to consider the case where N is 0:
+"0 files found" isn't exactly natural-sounding in any language, but it
+may be unacceptable in many -- or it may condition special
+kinds of agreement (similar to English "I didN'T find ANY files").
+
+Remember to ask your translators about numeral formatting in their
+language, so that you can override the C<numf> method as
+appropriate.  Typical variables in number formatting are:  what to
+use as a decimal point (comma? period?); what to use as a thousands
+separator (space? nonbreaking space? comma? period? small
+middot? prime? apostrophe?); and even whether the so-called "thousands
+separator" is actually for every third digit -- I've heard reports of
+two hundred thousand being expressible as "2,00,000" for some Indian
+(Subcontinental) languages, besides the less surprising "S<200 000>",
+"200.000", "200,000", and "200'000".  Also, using a set of numeral
+glyphs other than the usual ASCII "0"-"9" might be appreciated, as via
+C<tr/0-9/\x{0966}-\x{096F}/> for getting digits in Devanagari script
+(for Hindi, Konkani, others).
+
+The basic C<quant> method that Locale::Maketext provides should be
+good for many languages.  For some languages, it might be useful
+to modify it (or its constituent C<numerate> method)
+to take a plural form in the two-argument call to C<quant>
+(as in "[quant,_1,files]") if
+it's all-around easier to infer the singular form from the plural, than
+to infer the plural form from the singular.
+
+But for other languages (as is discussed at length
+in L<Locale::Maketext::TPJ13|Locale::Maketext::TPJ13>), simple
+C<quant>/C<numerify> is not enough.  For the particularly problematic
+Slavic languages, what you may need is a method which you provide
+with the number, the citation form of the noun to quantify, and
+the case and gender that the sentence's syntax projects onto that
+noun slot.  The method would then be responsible for determining
+what grammatical number that numeral projects onto its noun phrase,
+and what case and gender it may override the normal case and gender
+with; and then it would look up the noun in a lexicon providing
+all needed inflected forms.
+
+=item *
+
+You may also wish to discuss with the translators the question of
+how to relate different subforms of the same language tag,
+considering how this reacts with C<get_handle>'s treatment of
+these.  For example, if a user accepts interfaces in "en, fr", and
+you have interfaces available in "en-US" and "fr", what should
+they get?  You may wish to resolve this by establishing that "en"
+and "en-US" are effectively synonymous, by having one class
+zero-derive from the other.
+
+For some languages this issue may never come up (Danish is rarely
+expressed as "da-DK", but instead is just "da").  And for other
+languages, the whole concept of a "generic" form may verge on
+being uselessly vague, particularly for interfaces involving voice
+media in forms of Arabic or Chinese.
+
+=item *
+
+Once you've localized your program/site/etc. for all desired
+languages, be sure to show the result (whether live, or via
+screenshots) to the translators.  Once they approve, make every
+effort to have it then checked by at least one other speaker of
+that language.  This holds true even when (or especially when) the
+translation is done by one of your own programmers.  Some
+kinds of systems may be harder to find testers for than others,
+depending on the amount of domain-specific jargon and concepts
+involved -- it's easier to find people who can tell you whether
+they approve of your translation for "delete this message" in an
+email-via-Web interface, than to find people who can give you
+an informed opinion on your translation for "attribute value"
+in an XML query tool's interface.
+
+=back
+
+=head1 SEE ALSO
+
+I recommend reading all of these:
+
+L<Locale::Maketext::TPJ13|Locale::Maketext::TPJ13> -- my I<The Perl
+Journal> article about Maketext.  It explains many important concepts
+underlying Locale::Maketext's design, and some insight into why
+Maketext is better than the plain old approach of just having 
+message catalogs that are just databases of sprintf formats.
+
+L<File::Findgrep|File::Findgrep> is a sample application/module
+that uses Locale::Maketext to localize its messages.  For a larger
+internationalized system, see also L<Apache::MP3>.
+
+L<I18N::LangTags|I18N::LangTags>.
+
+L<Win32::Locale|Win32::Locale>.
+
+RFC 3066, I<Tags for the Identification of Languages>,
+as at http://sunsite.dk/RFC/rfc/rfc3066.html
+
+RFC 2277, I<IETF Policy on Character Sets and Languages>
+is at http://sunsite.dk/RFC/rfc/rfc2277.html -- much of it is
+just things of interest to protocol designers, but it explains
+some basic concepts, like the distinction between locales and
+language-tags.
+
+The manual for GNU C<gettext>.  The gettext dist is available in
+C<ftp://prep.ai.mit.edu/pub/gnu/> -- get
+a recent gettext tarball and look in its "doc/" directory, there's
+an easily browsable HTML version in there.  The
+gettext documentation asks lots of questions worth thinking
+about, even if some of their answers are sometimes wonky,
+particularly where they start talking about pluralization.
+
+The Locale/Maketext.pm source.  Obverse that the module is much
+shorter than its documentation!
+
+=head1 COPYRIGHT AND DISCLAIMER
+
+Copyright (c) 1999-2004 Sean M. Burke.  All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+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.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext/Guts.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext/Guts.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext/Guts.pm	(revision 14489)
@@ -0,0 +1,295 @@
+
+package Locale::Maketext::Guts;
+BEGIN { *zorp = sub { return scalar @_ } unless defined &zorp; }
+ # Just so we're nice and define SOMETHING in "our" package.
+
+package Locale::Maketext;
+use strict;
+use vars qw($USE_LITERALS $GUTSPATH);
+
+BEGIN {
+  $GUTSPATH = __FILE__;
+  *DEBUG = sub () {0} unless defined &DEBUG;
+}
+
+use utf8;
+
+sub _compile {
+  # This big scary routine compiles an entry.
+  # It returns either a coderef if there's brackety bits in this, or
+  #  otherwise a ref to a scalar.
+  
+  my $target = ref($_[0]) || $_[0];
+  
+  my(@code);
+  my(@c) = (''); # "chunks" -- scratch.
+  my $call_count = 0;
+  my $big_pile = '';
+  {
+    my $in_group = 0; # start out outside a group
+    my($m, @params); # scratch
+    
+    while($_[1] =~  # Iterate over chunks.
+     m<\G(
+       [^\~\[\]]+  # non-~[] stuff
+       |
+       ~.       # ~[, ~], ~~, ~other
+       |
+       \[          # [ presumably opening a group
+       |
+       \]          # ] presumably closing a group
+       |
+       ~           # terminal ~ ?
+       |
+       $
+     )>xgs
+    ) {
+      print "  \"$1\"\n" if DEBUG > 2;
+
+      if($1 eq '[' or $1 eq '') {       # "[" or end
+        # Whether this is "[" or end, force processing of any
+        #  preceding literal.
+        if($in_group) {
+          if($1 eq '') {
+            $target->_die_pointing($_[1], "Unterminated bracket group");
+          } else {
+            $target->_die_pointing($_[1], "You can't nest bracket groups");
+          }
+        } else {
+          if($1 eq '') {
+            print "   [end-string]\n" if DEBUG > 2;
+          } else {
+            $in_group = 1;
+          }
+          die "How come \@c is empty?? in <$_[1]>" unless @c; # sanity
+          if(length $c[-1]) {
+            # Now actually processing the preceding literal
+            $big_pile .= $c[-1];
+            if($USE_LITERALS and (
+              (ord('A') == 65)
+               ? $c[-1] !~ m<[^\x20-\x7E]>s
+                  # ASCII very safe chars
+               : $c[-1] !~ m/[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~\x07]/s
+                  # EBCDIC very safe chars
+            )) {
+              # normal case -- all very safe chars
+              $c[-1] =~ s/'/\\'/g;
+              push @code, q{ '} . $c[-1] . "',\n";
+              $c[-1] = ''; # reuse this slot
+            } else {
+              push @code, ' $c[' . $#c . "],\n";
+              push @c, ''; # new chunk
+            }
+          }
+           # else just ignore the empty string.
+        }
+
+      } elsif($1 eq ']') {  # "]"
+        # close group -- go back in-band
+        if($in_group) {
+          $in_group = 0;
+          
+          print "   --Closing group [$c[-1]]\n" if DEBUG > 2;
+          
+          # And now process the group...
+          
+          if(!length($c[-1]) or $c[-1] =~ m/^\s+$/s) {
+            DEBUG > 2 and print "   -- (Ignoring)\n";
+            $c[-1] = ''; # reset out chink
+            next;
+          }
+          
+           #$c[-1] =~ s/^\s+//s;
+           #$c[-1] =~ s/\s+$//s;
+          ($m,@params) = split(",", $c[-1], -1);  # was /\s*,\s*/
+          
+          # A bit of a hack -- we've turned "~,"'s into DELs, so turn
+          #  'em into real commas here.
+          if (ord('A') == 65) { # ASCII, etc
+            foreach($m, @params) { tr/\x7F/,/ } 
+          } else {              # EBCDIC (1047, 0037, POSIX-BC)
+            # Thanks to Peter Prymmer for the EBCDIC handling
+            foreach($m, @params) { tr/\x07/,/ } 
+          }
+          
+          # Special-case handling of some method names:
+          if($m eq '_*' or $m =~ m<^_(-?\d+)$>s) {
+            # Treat [_1,...] as [,_1,...], etc.
+            unshift @params, $m;
+            $m = '';
+          } elsif($m eq '*') {
+            $m = 'quant'; # "*" for "times": "4 cars" is 4 times "cars"
+          } elsif($m eq '#') {
+            $m = 'numf';  # "#" for "number": [#,_1] for "the number _1"
+          }
+
+          # Most common case: a simple, legal-looking method name
+          if($m eq '') {
+            # 0-length method name means to just interpolate:
+            push @code, ' (';
+          } elsif($m =~ m<^\w+(?:\:\:\w+)*$>s
+            and $m !~ m<(?:^|\:)\d>s
+             # exclude starting a (sub)package or symbol with a digit 
+          ) {
+            # Yes, it even supports the demented (and undocumented?)
+            #  $obj->Foo::bar(...) syntax.
+            $target->_die_pointing(
+              $_[1], "Can't (yet?) use \"SUPER::\" in a bracket-group method",
+              2 + length($c[-1])
+            )
+             if $m =~ m/^SUPER::/s;
+              # Because for SUPER:: to work, we'd have to compile this into
+              #  the right package, and that seems just not worth the bother,
+              #  unless someone convinces me otherwise.
+            
+            push @code, ' $_[0]->' . $m . '(';
+          } else {
+            # TODO: implement something?  or just too icky to consider?
+            $target->_die_pointing(
+             $_[1],
+             "Can't use \"$m\" as a method name in bracket group",
+             2 + length($c[-1])
+            );
+          }
+          
+          pop @c; # we don't need that chunk anymore
+          ++$call_count;
+          
+          foreach my $p (@params) {
+            if($p eq '_*') {
+              # Meaning: all parameters except $_[0]
+              $code[-1] .= ' @_[1 .. $#_], ';
+               # and yes, that does the right thing for all @_ < 3
+            } elsif($p =~ m<^_(-?\d+)$>s) {
+              # _3 meaning $_[3]
+              $code[-1] .= '$_[' . (0 + $1) . '], ';
+            } elsif($USE_LITERALS and (
+              (ord('A') == 65)
+               ? $p !~ m<[^\x20-\x7E]>s
+                  # ASCII very safe chars
+               : $p !~ m/[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~\x07]/s
+                  # EBCDIC very safe chars            
+            )) {
+              # Normal case: a literal containing only safe characters
+              $p =~ s/'/\\'/g;
+              $code[-1] .= q{'} . $p . q{', };
+            } else {
+              # Stow it on the chunk-stack, and just refer to that.
+              push @c, $p;
+              push @code, ' $c[' . $#c . "], ";
+            }
+          }
+          $code[-1] .= "),\n";
+
+          push @c, '';
+        } else {
+          $target->_die_pointing($_[1], "Unbalanced ']'");
+        }
+        
+      } elsif(substr($1,0,1) ne '~') {
+        # it's stuff not containing "~" or "[" or "]"
+        # i.e., a literal blob
+        $c[-1] .= $1;
+        
+      } elsif($1 eq '~~') { # "~~"
+        $c[-1] .= '~';
+        
+      } elsif($1 eq '~[') { # "~["
+        $c[-1] .= '[';
+        
+      } elsif($1 eq '~]') { # "~]"
+        $c[-1] .= ']';
+
+      } elsif($1 eq '~,') { # "~,"
+        if($in_group) {
+          # This is a hack, based on the assumption that no-one will actually
+          # want a DEL inside a bracket group.  Let's hope that's it's true.
+          if (ord('A') == 65) { # ASCII etc
+            $c[-1] .= "\x7F";
+          } else {              # EBCDIC (cp 1047, 0037, POSIX-BC)
+            $c[-1] .= "\x07";
+          }
+        } else {
+          $c[-1] .= '~,';
+        }
+        
+      } elsif($1 eq '~') { # possible only at string-end, it seems.
+        $c[-1] .= '~';
+        
+      } else {
+        # It's a "~X" where X is not a special character.
+        # Consider it a literal ~ and X.
+        $c[-1] .= $1;
+      }
+    }
+  }
+
+  if($call_count) {
+    undef $big_pile; # Well, nevermind that.
+  } else {
+    # It's all literals!  Ahwell, that can happen.
+    # So don't bother with the eval.  Return a SCALAR reference.
+    return \$big_pile;
+  }
+
+  die "Last chunk isn't null??" if @c and length $c[-1]; # sanity
+  print scalar(@c), " chunks under closure\n" if DEBUG;
+  if(@code == 0) { # not possible?
+    print "Empty code\n" if DEBUG;
+    return \'';
+  } elsif(@code > 1) { # most cases, presumably!
+    unshift @code, "join '',\n";
+  }
+  unshift @code, "use strict; sub {\n";
+  push @code, "}\n";
+
+  print @code if DEBUG;
+  my $sub = eval(join '', @code);
+  die "$@ while evalling" . join('', @code) if $@; # Should be impossible.
+  return $sub;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _die_pointing {
+  # This is used by _compile to throw a fatal error
+  my $target = shift; # class name
+  # ...leaving $_[0] the error-causing text, and $_[1] the error message
+  
+  my $i = index($_[0], "\n");
+
+  my $pointy;
+  my $pos = pos($_[0]) - (defined($_[2]) ? $_[2] : 0) - 1;
+  if($pos < 1) {
+    $pointy = "^=== near there\n";
+  } else { # we need to space over
+    my $first_tab = index($_[0], "\t");
+    if($pos > 2 and ( -1 == $first_tab  or  $first_tab > pos($_[0]))) {
+      # No tabs, or the first tab is harmlessly after where we will point to,
+      # AND we're far enough from the margin that we can draw a proper arrow.
+      $pointy = ('=' x $pos) . "^ near there\n";
+    } else {
+      # tabs screw everything up!
+      $pointy = substr($_[0],0,$pos);
+      $pointy =~ tr/\t //cd;
+       # make everything into whitespace, but preseving tabs
+      $pointy .= "^=== near there\n";
+    }
+  }
+  
+  my $errmsg = "$_[1], in\:\n$_[0]";
+  
+  if($i == -1) {
+    # No newline.
+    $errmsg .= "\n" . $pointy;
+  } elsif($i == (length($_[0]) - 1)  ) {
+    # Already has a newline at end.
+    $errmsg .= $pointy;
+  } else {
+    # don't bother with the pointy bit, I guess.
+  }
+  Carp::croak( "$errmsg via $target, as used" );
+}
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext/GutsLoader.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext/GutsLoader.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext/GutsLoader.pm	(revision 14489)
@@ -0,0 +1,47 @@
+
+package Locale::Maketext::GutsLoader;
+use strict;
+sub zorp { return scalar @_ }
+
+BEGIN {
+  $Locale::Maketext::GutsLoader::GUTSPATH = __FILE__;
+  *Locale::Maketext::DEBUG = sub () {0}
+   unless defined &Locale::Maketext::DEBUG;
+}
+
+#
+# This whole drama is so that we can load the utf8'd code
+# in Locale::Maketext::Guts, but if that fails, snip the
+# utf8 and then try THAT.
+#
+
+$Locale::Maketext::GUTSPATH = '';
+Locale::Maketext::DEBUG and print "Requiring Locale::Maketext::Guts...\n";
+eval 'require Locale::Maketext::Guts';
+
+if($@) {
+  my $path = $Locale::Maketext::GUTSPATH;
+
+  die "Can't load Locale::Maketext::Guts\nAborting" unless $path;
+  
+  die "No readable file $Locale::Maketext::GutsLoader::GUTSPATH\nAborting"
+   unless -e $path and -f _ and -r _;
+
+  open(IN, $path) or die "Can't read-open $path\nAborting";
+  
+  my $source;
+  { local $/;  $source = <IN>; }
+  close(IN);
+  unless( $source =~ s/\b(use utf8)/# $1/ ) {
+    Locale::Maketext::DEBUG and
+     print "I didn't see 'use utf8' in $path\n";
+  }
+  eval $source;
+  die "Can't compile $path\n...The error I got was:\n$@\nAborting" if $@;
+  Locale::Maketext::DEBUG and print "Non-utf8'd Locale::Maketext::Guts fine\n";
+} else {
+  Locale::Maketext::DEBUG and print "Loaded Locale::Maketext::Guts fine\n";
+}
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext/TPJ13.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext/TPJ13.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Maketext/TPJ13.pod	(revision 14489)
@@ -0,0 +1,778 @@
+
+# This document contains text in Perl "POD" format.
+# Use a POD viewer like perldoc or perlman to render it.
+
+# This corrects some typoes in the previous release.
+
+=head1 NAME
+
+Locale::Maketext::TPJ13 -- article about software localization
+
+=head1 SYNOPSIS
+
+  # This an article, not a module.
+
+=head1 DESCRIPTION
+
+The following article by Sean M. Burke and Jordan Lachler
+first appeared in I<The Perl
+Journal> #13 and is copyright 1999 The Perl Journal. It appears
+courtesy of Jon Orwant and The Perl Journal.  This document may be
+distributed under the same terms as Perl itself.
+
+=head1 Localization and Perl: gettext breaks, Maketext fixes
+
+by Sean M. Burke and Jordan Lachler
+
+This article points out cases where gettext (a common system for
+localizing software interfaces -- i.e., making them work in the user's
+language of choice) fails because of basic differences between human
+languages.  This article then describes Maketext, a new system capable
+of correctly treating these differences.
+
+=head2 A Localization Horror Story: It Could Happen To You
+
+=over
+
+"There are a number of languages spoken by human beings in this
+world."
+
+-- Harald Tveit Alvestrand, in RFC 1766, "Tags for the
+Identification of Languages"
+
+=back
+
+Imagine that your task for the day is to localize a piece of software
+-- and luckily for you, the only output the program emits is two
+messages, like this:
+
+  I scanned 12 directories.
+
+  Your query matched 10 files in 4 directories.
+
+So how hard could that be?  You look at the code that
+produces the first item, and it reads:
+
+  printf("I scanned %g directories.",
+         $directory_count);
+
+You think about that, and realize that it doesn't even work right for
+English, as it can produce this output:
+
+  I scanned 1 directories.
+
+So you rewrite it to read:
+
+  printf("I scanned %g %s.",
+         $directory_count,
+         $directory_count == 1 ?
+           "directory" : "directories",
+  );
+
+...which does the Right Thing.  (In case you don't recall, "%g" is for
+locale-specific number interpolation, and "%s" is for string
+interpolation.)
+
+But you still have to localize it for all the languages you're
+producing this software for, so you pull Locale::gettext off of CPAN
+so you can access the C<gettext> C functions you've heard are standard
+for localization tasks.
+
+And you write:
+
+  printf(gettext("I scanned %g %s."),
+         $dir_scan_count,
+         $dir_scan_count == 1 ?
+           gettext("directory") : gettext("directories"),
+  );
+
+But you then read in the gettext manual (Drepper, Miller, and Pinard 1995)
+that this is not a good idea, since how a single word like "directory"
+or "directories" is translated may depend on context -- and this is
+true, since in a case language like German or Russian, you'd may need
+these words with a different case ending in the first instance (where the
+word is the object of a verb) than in the second instance, which you haven't even
+gotten to yet (where the word is the object of a preposition, "in %g
+directories") -- assuming these keep the same syntax when translated
+into those languages.
+
+So, on the advice of the gettext manual, you rewrite:
+
+  printf( $dir_scan_count == 1 ?
+           gettext("I scanned %g directory.") :
+           gettext("I scanned %g directories."),
+         $dir_scan_count );
+
+So, you email your various translators (the boss decides that the
+languages du jour are Chinese, Arabic, Russian, and Italian, so you
+have one translator for each), asking for translations for "I scanned
+%g directory." and "I scanned %g directories.".  When they reply,
+you'll put that in the lexicons for gettext to use when it localizes
+your software, so that when the user is running under the "zh"
+(Chinese) locale, gettext("I scanned %g directory.") will return the
+appropriate Chinese text, with a "%g" in there where printf can then
+interpolate $dir_scan.
+
+Your Chinese translator emails right back -- he says both of these
+phrases translate to the same thing in Chinese, because, in linguistic
+jargon, Chinese "doesn't have number as a grammatical category" --
+whereas English does.  That is, English has grammatical rules that
+refer to "number", i.e., whether something is grammatically singular
+or plural; and one of these rules is the one that forces nouns to take
+a plural suffix (generally "s") when in a plural context, as they are when
+they follow a number other than "one" (including, oddly enough, "zero").
+Chinese has no such rules, and so has just the one phrase where English
+has two.  But, no problem, you can have this one Chinese phrase appear
+as the translation for the two English phrases in the "zh" gettext
+lexicon for your program.
+
+Emboldened by this, you dive into the second phrase that your software
+needs to output: "Your query matched 10 files in 4 directories.".  You notice
+that if you want to treat phrases as indivisible, as the gettext
+manual wisely advises, you need four cases now, instead of two, to
+cover the permutations of singular and plural on the two items,
+$dir_count and $file_count.  So you try this:
+
+  printf( $file_count == 1 ?
+    ( $directory_count == 1 ?
+     gettext("Your query matched %g file in %g directory.") :
+     gettext("Your query matched %g file in %g directories.") ) :
+    ( $directory_count == 1 ?
+     gettext("Your query matched %g files in %g directory.") :
+     gettext("Your query matched %g files in %g directories.") ),
+   $file_count, $directory_count,
+  );
+
+(The case of "1 file in 2 [or more] directories" could, I suppose,
+occur in the case of symlinking or something of the sort.)
+
+It occurs to you that this is not the prettiest code you've ever
+written, but this seems the way to go.  You mail off to the
+translators asking for translations for these four cases.  The
+Chinese guy replies with the one phrase that these all translate to in
+Chinese, and that phrase has two "%g"s in it, as it should -- but
+there's a problem.  He translates it word-for-word back: "In %g
+directories contains %g files match your query."  The %g
+slots are in an order reverse to what they are in English.  You wonder
+how you'll get gettext to handle that.
+
+But you put it aside for the moment, and optimistically hope that the
+other translators won't have this problem, and that their languages
+will be better behaved -- i.e., that they will be just like English.
+
+But the Arabic translator is the next to write back.  First off, your
+code for "I scanned %g directory." or "I scanned %g directories."
+assumes there's only singular or plural.  But, to use linguistic
+jargon again, Arabic has grammatical number, like English (but unlike
+Chinese), but it's a three-term category: singular, dual, and plural.
+In other words, the way you say "directory" depends on whether there's
+one directory, or I<two> of them, or I<more than two> of them.  Your
+test of C<($directory == 1)> no longer does the job.  And it means
+that where English's grammatical category of number necessitates
+only the two permutations of the first sentence based on "directory
+[singular]" and "directories [plural]", Arabic has three -- and,
+worse, in the second sentence ("Your query matched %g file in %g
+directory."), where English has four, Arabic has nine.  You sense
+an unwelcome, exponential trend taking shape.
+
+Your Italian translator emails you back and says that "I searched 0
+directories" (a possible English output of your program) is stilted,
+and if you think that's fine English, that's your problem, but that
+I<just will not do> in the language of Dante.  He insists that where
+$directory_count is 0, your program should produce the Italian text
+for "I I<didn't> scan I<any> directories.".  And ditto for "I didn't
+match any files in any directories", although he says the last part
+about "in any directories" should probably just be left off.
+
+You wonder how you'll get gettext to handle this; to accomodate the
+ways Arabic, Chinese, and Italian deal with numbers in just these few
+very simple phrases, you need to write code that will ask gettext for
+different queries depending on whether the numerical values in
+question are 1, 2, more than 2, or in some cases 0, and you still haven't
+figured out the problem with the different word order in Chinese.
+
+Then your Russian translator calls on the phone, to I<personally> tell
+you the bad news about how really unpleasant your life is about to
+become:
+
+Russian, like German or Latin, is an inflectional language; that is, nouns
+and adjectives have to take endings that depend on their case
+(i.e., nominative, accusative, genitive, etc...) -- which is roughly a matter of
+what role they have in syntax of the sentence --
+as well as on the grammatical gender (i.e., masculine, feminine, neuter)
+and number (i.e., singular or plural) of the noun, as well as on the
+declension class of the noun.  But unlike with most other inflected languages,
+putting a number-phrase (like "ten" or "forty-three", or their Arabic
+numeral equivalents) in front of noun in Russian can change the case and
+number that noun is, and therefore the endings you have to put on it.
+
+He elaborates:  In "I scanned %g directories", you'd I<expect>
+"directories" to be in the accusative case (since it is the direct
+object in the sentnce) and the plural number,
+except where $directory_count is 1, then you'd expect the singular, of
+course.  Just like Latin or German.  I<But!>  Where $directory_count %
+10 is 1 ("%" for modulo, remember), assuming $directory count is an
+integer, and except where $directory_count % 100 is 11, "directories"
+is forced to become grammatically singular, which means it gets the
+ending for the accusative singular...  You begin to visualize the code
+it'd take to test for the problem so far, I<and still work for Chinese
+and Arabic and Italian>, and how many gettext items that'd take, but
+he keeps going...  But where $directory_count % 10 is 2, 3, or 4
+(except where $directory_count % 100 is 12, 13, or 14), the word for
+"directories" is forced to be genitive singular -- which means another
+ending... The room begins to spin around you, slowly at first...  But
+with I<all other> integer values, since "directory" is an inanimate
+noun, when preceded by a number and in the nominative or accusative
+cases (as it is here, just your luck!), it does stay plural, but it is
+forced into the genitive case -- yet another ending...  And
+you never hear him get to the part about how you're going to run into
+similar (but maybe subtly different) problems with other Slavic
+languages like Polish, because the floor comes up to meet you, and you
+fade into unconsciousness.
+
+
+The above cautionary tale relates how an attempt at localization can
+lead from programmer consternation, to program obfuscation, to a need
+for sedation.  But careful evaluation shows that your choice of tools
+merely needed further consideration.
+
+=head2 The Linguistic View
+
+=over
+
+"It is more complicated than you think." 
+
+-- The Eighth Networking Truth, from RFC 1925
+
+=back
+
+The field of Linguistics has expended a great deal of effort over the
+past century trying to find grammatical patterns which hold across
+languages; it's been a constant process
+of people making generalizations that should apply to all languages,
+only to find out that, all too often, these generalizations fail --
+sometimes failing for just a few languages, sometimes whole classes of
+languages, and sometimes nearly every language in the world except
+English.  Broad statistical trends are evident in what the "average
+language" is like as far as what its rules can look like, must look
+like, and cannot look like.  But the "average language" is just as
+unreal a concept as the "average person" -- it runs up against the
+fact no language (or person) is, in fact, average.  The wisdom of past
+experience leads us to believe that any given language can do whatever
+it wants, in any order, with appeal to any kind of grammatical
+categories wants -- case, number, tense, real or metaphoric
+characteristics of the things that words refer to, arbitrary or
+predictable classifications of words based on what endings or prefixes
+they can take, degree or means of certainty about the truth of
+statements expressed, and so on, ad infinitum.
+
+Mercifully, most localization tasks are a matter of finding ways to
+translate whole phrases, generally sentences, where the context is
+relatively set, and where the only variation in content is I<usually>
+in a number being expressed -- as in the example sentences above.
+Translating specific, fully-formed sentences is, in practice, fairly
+foolproof -- which is good, because that's what's in the phrasebooks
+that so many tourists rely on.  Now, a given phrase (whether in a
+phrasebook or in a gettext lexicon) in one language I<might> have a
+greater or lesser applicability than that phrase's translation into
+another language -- for example, strictly speaking, in Arabic, the
+"your" in "Your query matched..." would take a different form
+depending on whether the user is male or female; so the Arabic
+translation "your[feminine] query" is applicable in fewer cases than
+the corresponding English phrase, which doesn't distinguish the user's
+gender.  (In practice, it's not feasable to have a program know the
+user's gender, so the masculine "you" in Arabic is usually used, by
+default.)
+
+But in general, such surprises are rare when entire sentences are
+being translated, especially when the functional context is restricted
+to that of a computer interacting with a user either to convey a fact
+or to prompt for a piece of information.  So, for purposes of
+localization, translation by phrase (generally by sentence) is both the
+simplest and the least problematic.
+
+=head2 Breaking gettext
+
+=over
+
+"It Has To Work."
+
+-- First Networking Truth, RFC 1925
+
+=back
+
+Consider that sentences in a tourist phrasebook are of two types: ones
+like "How do I get to the marketplace?" that don't have any blanks to
+fill in, and ones like "How much do these ___ cost?", where there's
+one or more blanks to fill in (and these are usually linked to a
+list of words that you can put in that blank: "fish", "potatoes",
+"tomatoes", etc.)  The ones with no blanks are no problem, but the
+fill-in-the-blank ones may not be really straightforward. If it's a
+Swahili phrasebook, for example, the authors probably didn't bother to
+tell you the complicated ways that the verb "cost" changes its
+inflectional prefix depending on the noun you're putting in the blank.
+The trader in the marketplace will still understand what you're saying if
+you say "how much do these potatoes cost?" with the wrong
+inflectional prefix on "cost".  After all, I<you> can't speak proper Swahili,
+I<you're> just a tourist.  But while tourists can be stupid, computers
+are supposed to be smart; the computer should be able to fill in the
+blank, and still have the results be grammatical.
+
+In other words, a phrasebook entry takes some values as parameters
+(the things that you fill in the blank or blanks), and provides a value
+based on these parameters, where the way you get that final value from
+the given values can, properly speaking, involve an arbitrarily
+complex series of operations.  (In the case of Chinese, it'd be not at
+all complex, at least in cases like the examples at the beginning of
+this article; whereas in the case of Russian it'd be a rather complex
+series of operations.  And in some languages, the
+complexity could be spread around differently: while the act of
+putting a number-expression in front of a noun phrase might not be
+complex by itself, it may change how you have to, for example, inflect
+a verb elsewhere in the sentence.  This is what in syntax is called
+"long-distance dependencies".)
+
+This talk of parameters and arbitrary complexity is just another way
+to say that an entry in a phrasebook is what in a programming language
+would be called a "function".  Just so you don't miss it, this is the
+crux of this article: I<A phrase is a function; a phrasebook is a
+bunch of functions.>
+
+The reason that using gettext runs into walls (as in the above
+second-person horror story) is that you're trying to use a string (or
+worse, a choice among a bunch of strings) to do what you really need a
+function for -- which is futile.  Preforming (s)printf interpolation
+on the strings which you get back from gettext does allow you to do I<some>
+common things passably well... sometimes... sort of; but, to paraphrase
+what some people say about C<csh> script programming, "it fools you
+into thinking you can use it for real things, but you can't, and you
+don't discover this until you've already spent too much time trying,
+and by then it's too late."
+
+=head2 Replacing gettext
+
+So, what needs to replace gettext is a system that supports lexicons
+of functions instead of lexicons of strings.  An entry in a lexicon
+from such a system should I<not> look like this:
+
+  "J'ai trouv\xE9 %g fichiers dans %g r\xE9pertoires"
+
+[\xE9 is e-acute in Latin-1.  Some pod renderers would
+scream if I used the actual character here. -- SB]
+
+but instead like this, bearing in mind that this is just a first stab:
+
+  sub I_found_X1_files_in_X2_directories {
+    my( $files, $dirs ) = @_[0,1];
+    $files = sprintf("%g %s", $files,
+      $files == 1 ? 'fichier' : 'fichiers');
+    $dirs = sprintf("%g %s", $dirs,
+      $dirs == 1 ? "r\xE9pertoire" : "r\xE9pertoires");
+    return "J'ai trouv\xE9 $files dans $dirs.";
+  }
+
+Now, there's no particularly obvious way to store anything but strings
+in a gettext lexicon; so it looks like we just have to start over and
+make something better, from scratch.  I call my shot at a
+gettext-replacement system "Maketext", or, in CPAN terms,
+Locale::Maketext.
+
+When designing Maketext, I chose to plan its main features in terms of
+"buzzword compliance".  And here are the buzzwords:
+
+=head2 Buzzwords: Abstraction and Encapsulation
+
+The complexity of the language you're trying to output a phrase in is
+entirely abstracted inside (and encapsulated within) the Maketext module
+for that interface.  When you call:
+
+  print $lang->maketext("You have [quant,_1,piece] of new mail.",
+                       scalar(@messages));
+
+you don't know (and in fact can't easily find out) whether this will
+involve lots of figuring, as in Russian (if $lang is a handle to the
+Russian module), or relatively little, as in Chinese.  That kind of
+abstraction and encapsulation may encourage other pleasant buzzwords
+like modularization and stratification, depending on what design
+decisions you make.
+
+=head2 Buzzword: Isomorphism
+
+"Isomorphism" means "having the same structure or form"; in discussions
+of program design, the word takes on the special, specific meaning that
+your implementation of a solution to a problem I<has the same
+structure> as, say, an informal verbal description of the solution, or
+maybe of the problem itself.  Isomorphism is, all things considered,
+a good thing -- it's what problem-solving (and solution-implementing)
+should look like.
+
+What's wrong the with gettext-using code like this...
+
+  printf( $file_count == 1 ?
+    ( $directory_count == 1 ?
+     "Your query matched %g file in %g directory." :
+     "Your query matched %g file in %g directories." ) :
+    ( $directory_count == 1 ?
+     "Your query matched %g files in %g directory." :
+     "Your query matched %g files in %g directories." ),
+   $file_count, $directory_count,
+  );
+
+is first off that it's not well abstracted -- these ways of testing
+for grammatical number (as in the expressions like C<foo == 1 ?
+singular_form : plural_form>) should be abstracted to each language
+module, since how you get grammatical number is language-specific.
+
+But second off, it's not isomorphic -- the "solution" (i.e., the
+phrasebook entries) for Chinese maps from these four English phrases to
+the one Chinese phrase that fits for all of them.  In other words, the
+informal solution would be "The way to say what you want in Chinese is
+with the one phrase 'For your question, in Y directories you would
+find X files'" -- and so the implemented solution should be,
+isomorphically, just a straightforward way to spit out that one
+phrase, with numerals properly interpolated.  It shouldn't have to map
+from the complexity of other languages to the simplicity of this one.
+
+=head2 Buzzword: Inheritance
+
+There's a great deal of reuse possible for sharing of phrases between
+modules for related dialects, or for sharing of auxiliary functions
+between related languages.  (By "auxiliary functions", I mean
+functions that don't produce phrase-text, but which, say, return an
+answer to "does this number require a plural noun after it?".  Such
+auxiliary functions would be used in the internal logic of functions
+that actually do produce phrase-text.)
+
+In the case of sharing phrases, consider that you have an interface
+already localized for American English (probably by having been
+written with that as the native locale, but that's incidental).
+Localizing it for UK English should, in practical terms, be just a
+matter of running it past a British person with the instructions to
+indicate what few phrases would benefit from a change in spelling or
+possibly minor rewording.  In that case, you should be able to put in
+the UK English localization module I<only> those phrases that are
+UK-specific, and for all the rest, I<inherit> from the American
+English module.  (And I expect this same situation would apply with
+Brazilian and Continental Portugese, possbily with some I<very>
+closely related languages like Czech and Slovak, and possibly with the
+slightly different "versions" of written Mandarin Chinese, as I hear exist in
+Taiwan and mainland China.)
+
+As to sharing of auxiliary functions, consider the problem of Russian
+numbers from the beginning of this article; obviously, you'd want to
+write only once the hairy code that, given a numeric value, would
+return some specification of which case and number a given quanitified
+noun should use.  But suppose that you discover, while localizing an
+interface for, say, Ukranian (a Slavic language related to Russian,
+spoken by several million people, many of whom would be relieved to
+find that your Web site's or software's interface is available in
+their language), that the rules in Ukranian are the same as in Russian
+for quantification, and probably for many other grammatical functions.
+While there may well be no phrases in common between Russian and
+Ukranian, you could still choose to have the Ukranian module inherit
+from the Russian module, just for the sake of inheriting all the
+various grammatical methods.  Or, probably better organizationally,
+you could move those functions to a module called C<_E_Slavic> or
+something, which Russian and Ukranian could inherit useful functions
+from, but which would (presumably) provide no lexicon.
+
+=head2 Buzzword: Concision
+
+Okay, concision isn't a buzzword.  But it should be, so I decree that
+as a new buzzword, "concision" means that simple common things should
+be expressible in very few lines (or maybe even just a few characters)
+of code -- call it a special case of "making simple things easy and
+hard things possible", and see also the role it played in the
+MIDI::Simple language, discussed elsewhere in this issue [TPJ#13].
+
+Consider our first stab at an entry in our "phrasebook of functions":
+
+  sub I_found_X1_files_in_X2_directories {
+    my( $files, $dirs ) = @_[0,1];
+    $files = sprintf("%g %s", $files,
+      $files == 1 ? 'fichier' : 'fichiers');
+    $dirs = sprintf("%g %s", $dirs,
+      $dirs == 1 ? "r\xE9pertoire" : "r\xE9pertoires");
+    return "J'ai trouv\xE9 $files dans $dirs.";
+  }
+
+You may sense that a lexicon (to use a non-committal catch-all term for a
+collection of things you know how to say, regardless of whether they're
+phrases or words) consisting of functions I<expressed> as above would
+make for rather long-winded and repetitive code -- even if you wisely
+rewrote this to have quantification (as we call adding a number
+expression to a noun phrase) be a function called like:
+
+  sub I_found_X1_files_in_X2_directories {
+    my( $files, $dirs ) = @_[0,1];
+    $files = quant($files, "fichier");
+    $dirs =  quant($dirs,  "r\xE9pertoire");
+    return "J'ai trouv\xE9 $files dans $dirs.";
+  }
+
+And you may also sense that you do not want to bother your translators
+with having to write Perl code -- you'd much rather that they spend
+their I<very costly time> on just translation.  And this is to say
+nothing of the near impossibility of finding a commercial translator
+who would know even simple Perl.
+
+In a first-hack implementation of Maketext, each language-module's
+lexicon looked like this:
+
+ %Lexicon = (
+   "I found %g files in %g directories"
+   => sub {
+      my( $files, $dirs ) = @_[0,1];
+      $files = quant($files, "fichier");
+      $dirs =  quant($dirs,  "r\xE9pertoire");
+      return "J'ai trouv\xE9 $files dans $dirs.";
+    },
+  ... and so on with other phrase => sub mappings ...
+ );
+
+but I immediately went looking for some more concise way to basically
+denote the same phrase-function -- a way that would also serve to
+concisely denote I<most> phrase-functions in the lexicon for I<most>
+languages.  After much time and even some actual thought, I decided on
+this system:
+
+* Where a value in a %Lexicon hash is a contentful string instead of
+an anonymous sub (or, conceivably, a coderef), it would be interpreted
+as a sort of shorthand expression of what the sub does.  When accessed
+for the first time in a session, it is parsed, turned into Perl code,
+and then eval'd into an anonymous sub; then that sub replaces the
+original string in that lexicon.  (That way, the work of parsing and
+evaling the shorthand form for a given phrase is done no more than
+once per session.)
+
+* Calls to C<maketext> (as Maketext's main function is called) happen
+thru a "language session handle", notionally very much like an IO
+handle, in that you open one at the start of the session, and use it
+for "sending signals" to an object in order to have it return the text
+you want.
+
+So, this:
+
+  $lang->maketext("You have [quant,_1,piece] of new mail.",
+                 scalar(@messages));
+
+basically means this: look in the lexicon for $lang (which may inherit
+from any number of other lexicons), and find the function that we
+happen to associate with the string "You have [quant,_1,piece] of new
+mail" (which is, and should be, a functioning "shorthand" for this
+function in the native locale -- English in this case).  If you find
+such a function, call it with $lang as its first parameter (as if it
+were a method), and then a copy of scalar(@messages) as its second,
+and then return that value.  If that function was found, but was in
+string shorthand instead of being a fully specified function, parse it
+and make it into a function before calling it the first time.
+
+* The shorthand uses code in brackets to indicate method calls that
+should be performed.  A full explanation is not in order here, but a
+few examples will suffice:
+
+  "You have [quant,_1,piece] of new mail."
+
+The above code is shorthand for, and will be interpreted as,
+this:
+
+  sub {
+    my $handle = $_[0];
+    my(@params) = @_;
+    return join '',
+      "You have ",
+      $handle->quant($params[1], 'piece'),
+      "of new mail.";
+  }
+
+where "quant" is the name of a method you're using to quantify the
+noun "piece" with the number $params[0].
+
+A string with no brackety calls, like this:
+
+  "Your search expression was malformed."
+
+is somewhat of a degerate case, and just gets turned into:
+
+  sub { return "Your search expression was malformed." }
+
+However, not everything you can write in Perl code can be written in
+the above shorthand system -- not by a long shot.  For example, consider
+the Italian translator from the beginning of this article, who wanted
+the Italian for "I didn't find any files" as a special case, instead
+of "I found 0 files".  That couldn't be specified (at least not easily
+or simply) in our shorthand system, and it would have to be written
+out in full, like this:
+
+  sub {  # pretend the English strings are in Italian
+    my($handle, $files, $dirs) = @_[0,1,2];
+    return "I didn't find any files" unless $files;
+    return join '',
+      "I found ",
+      $handle->quant($files, 'file'),
+      " in ",
+      $handle->quant($dirs,  'directory'),
+      ".";
+  }
+
+Next to a lexicon full of shorthand code, that sort of sticks out like a
+sore thumb -- but this I<is> a special case, after all; and at least
+it's possible, if not as concise as usual.
+
+As to how you'd implement the Russian example from the beginning of
+the article, well, There's More Than One Way To Do It, but it could be
+something like this (using English words for Russian, just so you know
+what's going on):
+
+  "I [quant,_1,directory,accusative] scanned."
+
+This shifts the burden of complexity off to the quant method.  That
+method's parameters are: the numeric value it's going to use to
+quantify something; the Russian word it's going to quantify; and the
+parameter "accusative", which you're using to mean that this
+sentence's syntax wants a noun in the accusative case there, although
+that quantification method may have to overrule, for grammatical
+reasons you may recall from the beginning of this article.
+
+Now, the Russian quant method here is responsible not only for
+implementing the strange logic necessary for figuring out how Russian
+number-phrases impose case and number on their noun-phrases, but also
+for inflecting the Russian word for "directory".  How that inflection
+is to be carried out is no small issue, and among the solutions I've
+seen, some (like variations on a simple lookup in a hash where all
+possible forms are provided for all necessary words) are
+straightforward but I<can> become cumbersome when you need to inflect
+more than a few dozen words; and other solutions (like using
+algorithms to model the inflections, storing only root forms and
+irregularities) I<can> involve more overhead than is justifiable for
+all but the largest lexicons.
+
+Mercifully, this design decision becomes crucial only in the hairiest
+of inflected languages, of which Russian is by no means the I<worst> case
+scenario, but is worse than most.  Most languages have simpler
+inflection systems; for example, in English or Swahili, there are
+generally no more than two possible inflected forms for a given noun
+("error/errors"; "kosa/makosa"), and the
+rules for producing these forms are fairly simple -- or at least,
+simple rules can be formulated that work for most words, and you can
+then treat the exceptions as just "irregular", at least relative to
+your ad hoc rules.  A simpler inflection system (simpler rules, fewer
+forms) means that design decisions are less crucial to maintaining
+sanity, whereas the same decisions could incur
+overhead-versus-scalability problems in languages like Russian.  It
+may I<also> be likely that code (possibly in Perl, as with
+Lingua::EN::Inflect, for English nouns) has already
+been written for the language in question, whether simple or complex.
+
+Moreover, a third possibility may even be simpler than anything
+discussed above: "Just require that all possible (or at least
+applicable) forms be provided in the call to the given language's quant
+method, as in:"
+
+  "I found [quant,_1,file,files]."
+
+That way, quant just has to chose which form it needs, without having
+to look up or generate anything.  While possibly not optimal for
+Russian, this should work well for most other languages, where
+quantification is not as complicated an operation.
+
+=head2 The Devil in the Details
+
+There's plenty more to Maketext than described above -- for example,
+there's the details of how language tags ("en-US", "i-pwn", "fi",
+etc.) or locale IDs ("en_US") interact with actual module naming
+("BogoQuery/Locale/en_us.pm"), and what magic can ensue; there's the
+details of how to record (and possibly negotiate) what character
+encoding Maketext will return text in (UTF8? Latin-1? KOI8?).  There's
+the interesting fact that Maketext is for localization, but nowhere
+actually has a "C<use locale;>" anywhere in it.  For the curious,
+there's the somewhat frightening details of how I actually
+implement something like data inheritance so that searches across
+modules' %Lexicon hashes can parallel how Perl implements method
+inheritance.
+
+And, most importantly, there's all the practical details of how to
+actually go about deriving from Maketext so you can use it for your
+interfaces, and the various tools and conventions for starting out and
+maintaining individual language modules.
+
+That is all covered in the documentation for Locale::Maketext and the
+modules that come with it, available in CPAN.  After having read this
+article, which covers the why's of Maketext, the documentation,
+which covers the how's of it, should be quite straightfoward.
+
+=head2 The Proof in the Pudding: Localizing Web Sites
+
+Maketext and gettext have a notable difference: gettext is in C,
+accessible thru C library calls, whereas Maketext is in Perl, and
+really can't work without a Perl interpreter (although I suppose
+something like it could be written for C).  Accidents of history (and
+not necessarily lucky ones) have made C++ the most common language for
+the implementation of applications like word processors, Web browsers,
+and even many in-house applications like custom query systems.  Current
+conditions make it somewhat unlikely that the next one of any of these
+kinds of applications will be written in Perl, albeit clearly more for
+reasons of custom and inertia than out of consideration of what is the
+right tool for the job.
+
+However, other accidents of history have made Perl a well-accepted
+language for design of server-side programs (generally in CGI form)
+for Web site interfaces.  Localization of static pages in Web sites is
+trivial, feasable either with simple language-negotiation features in
+servers like Apache, or with some kind of server-side inclusions of
+language-appropriate text into layout templates.  However, I think
+that the localization of Perl-based search systems (or other kinds of
+dynamic content) in Web sites, be they public or access-restricted,
+is where Maketext will see the greatest use.
+
+I presume that it would be only the exceptional Web site that gets
+localized for English I<and> Chinese I<and> Italian I<and> Arabic
+I<and> Russian, to recall the languages from the beginning of this
+article -- to say nothing of German, Spanish, French, Japanese,
+Finnish, and Hindi, to name a few languages that benefit from large
+numbers of programmers or Web viewers or both.
+
+However, the ever-increasing internationalization of the Web (whether
+measured in terms of amount of content, of numbers of content writers
+or programmers, or of size of content audiences) makes it increasingly
+likely that the interface to the average Web-based dynamic content
+service will be localized for two or maybe three languages.  It is my
+hope that Maketext will make that task as simple as possible, and will
+remove previous barriers to localization for languages dissimilar to
+English.
+
+ __END__
+
+Sean M. Burke (sburkeE<64>cpan.org) has a Master's in linguistics
+from Northwestern University; he specializes in language technology.
+Jordan Lachler (lachlerE<64>unm.edu) is a PhD student in the Department of
+Linguistics at the University of New Mexico; he specializes in
+morphology and pedagogy of North American native languages.
+
+=head2 References
+
+Alvestrand, Harald Tveit.  1995.  I<RFC 1766: Tags for the
+Identification of Languages.>
+C<ftp://ftp.isi.edu/in-notes/rfc1766.txt>
+[Now see RFC 3066.]
+
+Callon, Ross, editor.  1996.  I<RFC 1925: The Twelve
+Networking Truths.>
+C<ftp://ftp.isi.edu/in-notes/rfc1925.txt>
+
+Drepper, Ulrich, Peter Miller,
+and FranE<ccedil>ois Pinard.  1995-2001.  GNU
+C<gettext>.  Available in C<ftp://prep.ai.mit.edu/pub/gnu/>, with
+extensive docs in the distribution tarball.  [Since
+I wrote this article in 1998, I now see that the
+gettext docs are now trying more to come to terms with
+plurality.  Whether useful conclusions have come from it
+is another question altogether. -- SMB, May 2001]
+
+Forbes, Nevill.  1964.  I<Russian Grammar.>  Third Edition, revised
+by J. C. Dumbreck.  Oxford University Press.
+
+=cut
+
+#End
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Script.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Script.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Script.pm	(revision 14489)
@@ -0,0 +1,294 @@
+#
+# Locale::Script - ISO codes for script identification (ISO 15924)
+#
+# $Id: Script.pm,v 2.7 2004/06/10 21:19:34 neilb Exp $
+#
+
+package Locale::Script;
+use strict;
+require 5.002;
+
+require Exporter;
+use Carp;
+use Locale::Constants;
+
+
+#-----------------------------------------------------------------------
+#	Public Global Variables
+#-----------------------------------------------------------------------
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+$VERSION   = sprintf("%d.%02d", q$Revision: 2.7 $ =~ /(\d+)\.(\d+)/);
+@ISA       = qw(Exporter);
+@EXPORT    = qw(code2script script2code
+                all_script_codes all_script_names
+		script_code2code
+		LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC);
+
+#-----------------------------------------------------------------------
+#	Private Global Variables
+#-----------------------------------------------------------------------
+my $CODES     = [];
+my $COUNTRIES = [];
+
+
+#=======================================================================
+#
+# code2script ( CODE [, CODESET ] )
+#
+#=======================================================================
+sub code2script
+{
+    my $code = shift;
+    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+
+    return undef unless defined $code;
+
+    #-------------------------------------------------------------------
+    # Make sure the code is in the right form before we use it
+    # to look up the corresponding script.
+    # We have to sprintf because the codes are given as 3-digits,
+    # with leading 0's. Eg 070 for Egyptian demotic.
+    #-------------------------------------------------------------------
+    if ($codeset == LOCALE_CODE_NUMERIC)
+    {
+	return undef if ($code =~ /\D/);
+	$code = sprintf("%.3d", $code);
+    }
+    else
+    {
+	$code = lc($code);
+    }
+
+    if (exists $CODES->[$codeset]->{$code})
+    {
+        return $CODES->[$codeset]->{$code};
+    }
+    else
+    {
+        #---------------------------------------------------------------
+        # no such script code!
+        #---------------------------------------------------------------
+        return undef;
+    }
+}
+
+
+#=======================================================================
+#
+# script2code ( SCRIPT [, CODESET ] )
+#
+#=======================================================================
+sub script2code
+{
+    my $script = shift;
+    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+
+    return undef unless defined $script;
+    $script = lc($script);
+    if (exists $COUNTRIES->[$codeset]->{$script})
+    {
+        return $COUNTRIES->[$codeset]->{$script};
+    }
+    else
+    {
+        #---------------------------------------------------------------
+        # no such script!
+        #---------------------------------------------------------------
+        return undef;
+    }
+}
+
+
+#=======================================================================
+#
+# script_code2code ( CODE, IN-CODESET, OUT-CODESET )
+#
+#=======================================================================
+sub script_code2code
+{
+    (@_ == 3) or croak "script_code2code() takes 3 arguments!";
+
+    my $code = shift;
+    my $inset = shift;
+    my $outset = shift;
+    my $outcode;
+    my $script;
+
+
+    return undef if $inset == $outset;
+    $script = code2script($code, $inset);
+    return undef if not defined $script;
+    $outcode = script2code($script, $outset);
+    return $outcode;
+}
+
+
+#=======================================================================
+#
+# all_script_codes()
+#
+#=======================================================================
+sub all_script_codes
+{
+    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+    return keys %{ $CODES->[$codeset] };
+}
+
+
+#=======================================================================
+#
+# all_script_names()
+#
+#=======================================================================
+sub all_script_names
+{
+    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
+
+    return values %{ $CODES->[$codeset] };
+}
+
+
+#=======================================================================
+#
+# initialisation code - stuff the DATA into the ALPHA2 hash
+#
+#=======================================================================
+{
+    my   ($alpha2, $alpha3, $numeric);
+    my    $script;
+    local $_;
+
+
+    while (<DATA>)
+    {
+        next unless /\S/;
+        chop;
+        ($alpha2, $alpha3, $numeric, $script) = split(/:/, $_, 4);
+
+        $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $script;
+        $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$script"} = $alpha2;
+
+	if ($alpha3)
+	{
+            $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $script;
+            $COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$script"} = $alpha3;
+	}
+
+	if ($numeric)
+	{
+            $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $script;
+            $COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$script"} = $numeric;
+	}
+
+    }
+
+    close(DATA);
+}
+
+1;
+
+__DATA__
+am:ama:130:Aramaic
+ar:ara:160:Arabic
+av:ave:151:Avestan
+bh:bhm:300:Brahmi (Ashoka)
+bi:bid:372:Buhid
+bn:ben:325:Bengali
+bo:bod:330:Tibetan
+bp:bpm:285:Bopomofo
+br:brl:570:Braille
+bt:btk:365:Batak
+bu:bug:367:Buginese (Makassar)
+by:bys:550:Blissymbols
+ca:cam:358:Cham
+ch:chu:221:Old Church Slavonic
+ci:cir:291:Cirth
+cm:cmn:402:Cypro-Minoan
+co:cop:205:Coptic
+cp:cpr:403:Cypriote syllabary
+cy:cyr:220:Cyrillic
+ds:dsr:250:Deserel (Mormon)
+dv:dvn:315:Devanagari (Nagari)
+ed:egd:070:Egyptian demotic
+eg:egy:050:Egyptian hieroglyphs
+eh:egh:060:Egyptian hieratic
+el:ell:200:Greek
+eo:eos:210:Etruscan and Oscan
+et:eth:430:Ethiopic
+gl:glg:225:Glagolitic
+gm:gmu:310:Gurmukhi
+gt:gth:206:Gothic
+gu:guj:320:Gujarati
+ha:han:500:Han ideographs
+he:heb:125:Hebrew
+hg:hgl:420:Hangul
+hm:hmo:450:Pahawh Hmong
+ho:hoo:371:Hanunoo
+hr:hrg:410:Hiragana
+hu:hun:176:Old Hungarian runic
+hv:hvn:175:Kok Turki runic
+hy:hye:230:Armenian
+iv:ivl:610:Indus Valley
+ja:jap:930:(alias for Han + Hiragana + Katakana)
+jl:jlg:445:Cherokee syllabary
+jw:jwi:360:Javanese
+ka:kam:241:Georgian (Mxedruli)
+kh:khn:931:(alias for Hangul + Han)
+kk:kkn:411:Katakana
+km:khm:354:Khmer
+kn:kan:345:Kannada
+kr:krn:357:Karenni (Kayah Li)
+ks:kst:305:Kharoshthi
+kx:kax:240:Georgian (Xucuri)
+la:lat:217:Latin
+lf:laf:215:Latin (Fraktur variant)
+lg:lag:216:Latin (Gaelic variant)
+lo:lao:356:Lao
+lp:lpc:335:Lepcha (Rong)
+md:mda:140:Mandaean
+me:mer:100:Meroitic
+mh:may:090:Mayan hieroglyphs
+ml:mlm:347:Malayalam
+mn:mon:145:Mongolian
+my:mya:350:Burmese
+na:naa:400:Linear A
+nb:nbb:401:Linear B
+og:ogm:212:Ogham
+or:ory:327:Oriya
+os:osm:260:Osmanya
+ph:phx:115:Phoenician
+ph:pah:150:Pahlavi
+pl:pld:282:Pollard Phonetic
+pq:pqd:295:Klingon plQaD
+pr:prm:227:Old Permic
+ps:pst:600:Phaistos Disk
+rn:rnr:211:Runic (Germanic)
+rr:rro:620:Rongo-rongo
+sa:sar:110:South Arabian
+si:sin:348:Sinhala
+sj:syj:137:Syriac (Jacobite variant)
+sl:slb:440:Unified Canadian Aboriginal Syllabics
+sn:syn:136:Syriac (Nestorian variant)
+sw:sww:281:Shavian (Shaw)
+sy:syr:135:Syriac (Estrangelo)
+ta:tam:346:Tamil
+tb:tbw:373:Tagbanwa
+te:tel:340:Telugu
+tf:tfn:120:Tifnagh
+tg:tag:370:Tagalog
+th:tha:352:Thai
+tn:tna:170:Thaana
+tw:twr:290:Tengwar
+va:vai:470:Vai
+vs:vsp:280:Visible Speech
+xa:xas:000:Cuneiform, Sumero-Akkadian
+xf:xfa:105:Cuneiform, Old Persian
+xk:xkn:412:(alias for Hiragana + Katakana)
+xu:xug:106:Cuneiform, Ugaritic
+yi:yii:460:Yi
+zx:zxx:997:Unwritten language
+zy:zyy:998:Undetermined script
+zz:zzz:999:Uncoded script
Index: /for-distributions/trunk/bin/windows/perl/lib/Locale/Script.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Locale/Script.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Locale/Script.pod	(revision 14489)
@@ -0,0 +1,253 @@
+
+=head1 NAME
+
+Locale::Script - ISO codes for script identification (ISO 15924)
+
+=head1 SYNOPSIS
+
+    use Locale::Script;
+    use Locale::Constants;
+    
+    $script  = code2script('ph');                       # 'Phoenician'
+    $code    = script2code('Tibetan');                  # 'bo'
+    $code3   = script2code('Tibetan',
+                           LOCALE_CODE_ALPHA_3);        # 'bod'
+    $codeN   = script2code('Tibetan',
+                           LOCALE_CODE_ALPHA_NUMERIC);  # 330
+    
+    @codes   = all_script_codes();
+    @scripts = all_script_names();
+    
+
+=head1 DESCRIPTION
+
+The C<Locale::Script> module provides access to the ISO
+codes for identifying scripts, as defined in ISO 15924.
+For example, Egyptian hieroglyphs are denoted by the two-letter
+code 'eg', the three-letter code 'egy', and the numeric code 050.
+
+You can either access the codes via the conversion routines
+(described below), or with the two functions which return lists
+of all script codes or all script names.
+
+There are three different code sets you can use for identifying
+scripts:
+
+=over 4
+
+=item B<alpha-2>
+
+Two letter codes, such as 'bo' for Tibetan.
+This code set is identified with the symbol C<LOCALE_CODE_ALPHA_2>.
+
+=item B<alpha-3>
+
+Three letter codes, such as 'ell' for Greek.
+This code set is identified with the symbol C<LOCALE_CODE_ALPHA_3>.
+
+=item B<numeric>
+
+Numeric codes, such as 410 for Hiragana.
+This code set is identified with the symbol C<LOCALE_CODE_NUMERIC>.
+
+=back
+
+All of the routines take an optional additional argument
+which specifies the code set to use.
+If not specified, it defaults to the two-letter codes.
+This is partly for backwards compatibility (previous versions
+of Locale modules only supported the alpha-2 codes), and
+partly because they are the most widely used codes.
+
+The alpha-2 and alpha-3 codes are not case-dependent,
+so you can use 'BO', 'Bo', 'bO' or 'bo' for Tibetan.
+When a code is returned by one of the functions in
+this module, it will always be lower-case.
+
+=head2 SPECIAL CODES
+
+The standard defines various special codes.
+
+=over 4
+
+=item *
+
+The standard reserves codes in the ranges B<qa> - B<qt>,
+B<qaa> - B<qat>, and B<900> - B<919>, for private use.
+
+=item *
+
+B<zx>, B<zxx>, and B<997>, are the codes for unwritten languages.
+
+=item *
+
+B<zy>, B<zyy>, and B<998>, are the codes for an undetermined script.
+
+=item *
+
+B<zz>, B<zzz>, and B<999>, are the codes for an uncoded script.
+
+=back
+
+The private codes are not recognised by Locale::Script,
+but the others are.
+
+
+=head1 CONVERSION ROUTINES
+
+There are three conversion routines: C<code2script()>, C<script2code()>,
+and C<script_code2code()>.
+
+=over 4
+
+=item code2script( CODE, [ CODESET ] )
+
+This function takes a script code and returns a string
+which contains the name of the script identified.
+If the code is not a valid script code, as defined by ISO 15924,
+then C<undef> will be returned:
+
+    $script = code2script('cy');   # Cyrillic
+
+=item script2code( STRING, [ CODESET ] )
+
+This function takes a script name and returns the corresponding
+script code, if such exists.
+If the argument could not be identified as a script name,
+then C<undef> will be returned:
+
+    $code = script2code('Gothic', LOCALE_CODE_ALPHA_3);
+    # $code will now be 'gth'
+
+The case of the script name is not important.
+See the section L<KNOWN BUGS AND LIMITATIONS> below.
+
+=item script_code2code( CODE, CODESET, CODESET )
+
+This function takes a script code from one code set,
+and returns the corresponding code from another code set.
+
+    $alpha2 = script_code2code('jwi',
+		 LOCALE_CODE_ALPHA_3 => LOCALE_CODE_ALPHA_2);
+    # $alpha2 will now be 'jw' (Javanese)
+
+If the code passed is not a valid script code in
+the first code set, or if there isn't a code for the
+corresponding script in the second code set,
+then C<undef> will be returned.
+
+=back
+
+
+=head1 QUERY ROUTINES
+
+There are two function which can be used to obtain a list of all codes,
+or all script names:
+
+=over 4
+
+=item C<all_script_codes ( [ CODESET ] )>
+
+Returns a list of all two-letter script codes.
+The codes are guaranteed to be all lower-case,
+and not in any particular order.
+
+=item C<all_script_names ( [ CODESET ] )>
+
+Returns a list of all script names for which there is a corresponding
+script code in the specified code set.
+The names are capitalised, and not returned in any particular order.
+
+=back
+
+
+=head1 EXAMPLES
+
+The following example illustrates use of the C<code2script()> function.
+The user is prompted for a script code, and then told the corresponding
+script name:
+
+    $| = 1;   # turn off buffering
+    
+    print "Enter script code: ";
+    chop($code = <STDIN>);
+    $script = code2script($code, LOCALE_CODE_ALPHA_2);
+    if (defined $script)
+    {
+        print "$code = $script\n";
+    }
+    else
+    {
+        print "'$code' is not a valid script code!\n";
+    }
+
+
+=head1 KNOWN BUGS AND LIMITATIONS
+
+=over 4
+
+=item *
+
+When using C<script2code()>, the script name must currently appear
+exactly as it does in the source of the module. For example,
+
+    script2code('Egyptian hieroglyphs')
+
+will return B<eg>, as expected. But the following will all return C<undef>:
+
+    script2code('hieroglyphs')
+    script2code('Egyptian Hieroglypics')
+
+If there's need for it, a future version could have variants
+for script names.
+
+=item *
+
+In the current implementation, all data is read in when the
+module is loaded, and then held in memory.
+A lazy implementation would be more memory friendly.
+
+=back
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Locale::Language
+
+ISO two letter codes for identification of language (ISO 639).
+
+=item Locale::Currency
+
+ISO three letter codes for identification of currencies
+and funds (ISO 4217).
+
+=item Locale::Country
+
+ISO three letter codes for identification of countries (ISO 3166)
+
+=item ISO 15924
+
+The ISO standard which defines these codes.
+
+=item http://www.evertype.com/standards/iso15924/
+
+Home page for ISO 15924.
+
+
+=back
+
+
+=head1 AUTHOR
+
+Neil Bowers E<lt>neil@bowers.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2002-2004 Neil Bowers.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/MIME/Base64.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/MIME/Base64.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/MIME/Base64.pm	(revision 14489)
@@ -0,0 +1,177 @@
+package MIME::Base64;
+
+# $Id: Base64.pm,v 3.11 2005/11/29 20:59:55 gisle Exp $
+
+use strict;
+use vars qw(@ISA @EXPORT $VERSION);
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(encode_base64 decode_base64);
+
+$VERSION = '3.07';
+
+require XSLoader;
+XSLoader::load('MIME::Base64', $VERSION);
+
+*encode = \&encode_base64;
+*decode = \&decode_base64;
+
+1;
+
+__END__
+
+=head1 NAME
+
+MIME::Base64 - Encoding and decoding of base64 strings
+
+=head1 SYNOPSIS
+
+ use MIME::Base64;
+
+ $encoded = encode_base64('Aladdin:open sesame');
+ $decoded = decode_base64($encoded);
+
+=head1 DESCRIPTION
+
+This module provides functions to encode and decode strings into and from the
+base64 encoding specified in RFC 2045 - I<MIME (Multipurpose Internet
+Mail Extensions)>. The base64 encoding is designed to represent
+arbitrary sequences of octets in a form that need not be humanly
+readable. A 65-character subset ([A-Za-z0-9+/=]) of US-ASCII is used,
+enabling 6 bits to be represented per printable character.
+
+The following functions are provided:
+
+=over 4
+
+=item encode_base64($str)
+
+=item encode_base64($str, $eol);
+
+Encode data by calling the encode_base64() function.  The first
+argument is the string to encode.  The second argument is the
+line-ending sequence to use.  It is optional and defaults to "\n".  The
+returned encoded string is broken into lines of no more than 76
+characters each and it will end with $eol unless it is empty.  Pass an
+empty string as second argument if you do not want the encoded string
+to be broken into lines.
+
+=item decode_base64($str)
+
+Decode a base64 string by calling the decode_base64() function.  This
+function takes a single argument which is the string to decode and
+returns the decoded data.
+
+Any character not part of the 65-character base64 subset is
+silently ignored.  Characters occurring after a '=' padding character
+are never decoded.
+
+If the length of the string to decode, after ignoring
+non-base64 chars, is not a multiple of 4 or if padding occurs too early,
+then a warning is generated if perl is running under C<-w>.
+
+=back
+
+If you prefer not to import these routines into your namespace, you can
+call them as:
+
+    use MIME::Base64 ();
+    $encoded = MIME::Base64::encode($decoded);
+    $decoded = MIME::Base64::decode($encoded);
+
+=head1 DIAGNOSTICS
+
+The following warnings can be generated if perl is invoked with the
+C<-w> switch:
+
+=over 4
+
+=item Premature end of base64 data
+
+The number of characters to decode is not a multiple of 4.  Legal
+base64 data should be padded with one or two "=" characters to make
+its length a multiple of 4.  The decoded result will be the same
+whether the padding is present or not.
+
+=item Premature padding of base64 data
+
+The '=' padding character occurs as the first or second character
+in a base64 quartet.
+
+=back
+
+The following exception can be raised:
+
+=over 4
+
+=item Wide character in subroutine entry
+
+The string passed to encode_base64() contains characters with code
+above 255.  The base64 encoding is only defined for single-byte
+characters.  Use the Encode module to select the byte encoding you
+want.
+
+=back
+
+=head1 EXAMPLES
+
+If you want to encode a large file, you should encode it in chunks
+that are a multiple of 57 bytes.  This ensures that the base64 lines
+line up and that you do not end up with padding in the middle. 57
+bytes of data fills one complete base64 line (76 == 57*4/3):
+
+   use MIME::Base64 qw(encode_base64);
+
+   open(FILE, "/var/log/wtmp") or die "$!";
+   while (read(FILE, $buf, 60*57)) {
+       print encode_base64($buf);
+   }
+
+or if you know you have enough memory
+
+   use MIME::Base64 qw(encode_base64);
+   local($/) = undef;  # slurp
+   print encode_base64(<STDIN>);
+
+The same approach as a command line:
+
+   perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)' <file
+
+Decoding does not need slurp mode if every line contains a multiple
+of four base64 chars:
+
+   perl -MMIME::Base64 -ne 'print decode_base64($_)' <file
+
+Perl v5.8 and better allow extended Unicode characters in strings.
+Such strings cannot be encoded directly, as the base64
+encoding is only defined for single-byte characters.  The solution is
+to use the Encode module to select the byte encoding you want.  For
+example:
+
+    use MIME::Base64 qw(encode_base64);
+    use Encode qw(encode);
+
+    $encoded = encode_base64(encode("UTF-8", "\x{FFFF}\n"));
+    print $encoded;
+
+=head1 COPYRIGHT
+
+Copyright 1995-1999, 2001-2004 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+Distantly based on LWP::Base64 written by Martijn Koster
+<m.koster@nexor.co.uk> and Joerg Reichelt <j.reichelt@nexor.co.uk> and
+code posted to comp.lang.perl <3pd2lp$6gf@wsinti07.win.tue.nl> by Hans
+Mulder <hansm@wsinti07.win.tue.nl>
+
+The XS implementation uses code from metamail.  Copyright 1991 Bell
+Communications Research, Inc. (Bellcore)
+
+=head1 SEE ALSO
+
+L<MIME::QuotedPrint>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/MIME/QuotedPrint.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/MIME/QuotedPrint.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/MIME/QuotedPrint.pm	(revision 14489)
@@ -0,0 +1,116 @@
+package MIME::QuotedPrint;
+
+# $Id: QuotedPrint.pm,v 3.7 2005/11/29 20:49:46 gisle Exp $
+
+use strict;
+use vars qw(@ISA @EXPORT $VERSION);
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(encode_qp decode_qp);
+
+$VERSION = "3.07";
+
+use MIME::Base64;  # will load XS version of {en,de}code_qp()
+
+*encode = \&encode_qp;
+*decode = \&decode_qp;
+
+1;
+
+__END__
+
+=head1 NAME
+
+MIME::QuotedPrint - Encoding and decoding of quoted-printable strings
+
+=head1 SYNOPSIS
+
+ use MIME::QuotedPrint;
+
+ $encoded = encode_qp($decoded);
+ $decoded = decode_qp($encoded);
+
+=head1 DESCRIPTION
+
+This module provides functions to encode and decode strings into and from the
+quoted-printable encoding specified in RFC 2045 - I<MIME (Multipurpose
+Internet Mail Extensions)>.  The quoted-printable encoding is intended
+to represent data that largely consists of bytes that correspond to
+printable characters in the ASCII character set.  Each non-printable
+character (as defined by English Americans) is represented by a
+triplet consisting of the character "=" followed by two hexadecimal
+digits.
+
+The following functions are provided:
+
+=over 4
+
+=item encode_qp($str)
+
+=item encode_qp($str, $eol)
+
+=item encode_qp($str, $eol, $binmode)
+
+This function returns an encoded version of the string ($str) given as
+argument.
+
+The second argument ($eol) is the line-ending sequence to use.  It is
+optional and defaults to "\n".  Every occurrence of "\n" is replaced
+with this string, and it is also used for additional "soft line
+breaks" to ensure that no line end up longer than 76 characters.  Pass
+it as "\015\012" to produce data suitable for external consumption.
+The string "\r\n" produces the same result on many platforms, but not
+all.
+
+The third argument ($binmode) will select binary mode if passed as a
+TRUE value.  In binary mode "\n" will be encoded in the same way as
+any other non-printable character.  This ensures that a decoder will
+end up with exactly the same string whatever line ending sequence it
+uses.  In general it is preferable to use the base64 encoding for
+binary data; see L<MIME::Base64>.
+
+An $eol of "" (the empty string) is special.  In this case, no "soft
+line breaks" are introduced and binary mode is effectively enabled so
+that any "\n" in the original data is encoded as well.
+
+=item decode_qp($str);
+
+This function returns the plain text version of the string given
+as argument.  The lines of the result are "\n" terminated, even if
+the $str argument contains "\r\n" terminated lines.
+
+=back
+
+
+If you prefer not to import these routines into your namespace, you can
+call them as:
+
+  use MIME::QuotedPrint ();
+  $encoded = MIME::QuotedPrint::encode($decoded);
+  $decoded = MIME::QuotedPrint::decode($encoded);
+
+Perl v5.8 and better allow extended Unicode characters in strings.
+Such strings cannot be encoded directly, as the quoted-printable
+encoding is only defined for single-byte characters.  The solution is
+to use the Encode module to select the byte encoding you want.  For
+example:
+
+    use MIME::QuotedPrint qw(encode_qp);
+    use Encode qw(encode);
+
+    $encoded = encode_qp(encode("UTF-8", "\x{FFFF}\n"));
+    print $encoded;
+
+=head1 COPYRIGHT
+
+Copyright 1995-1997,2002-2004 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<MIME::Base64>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Math/BigFloat.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Math/BigFloat.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Math/BigFloat.pm	(revision 14489)
@@ -0,0 +1,3147 @@
+package Math::BigFloat;
+
+# 
+# Mike grinned. 'Two down, infinity to go' - Mike Nostrus in 'Before and After'
+#
+
+# The following hash values are internally used:
+#   _e	: exponent (ref to $CALC object)
+#   _m	: mantissa (ref to $CALC object)
+#   _es	: sign of _e
+# sign	: +,-,+inf,-inf, or "NaN" if not a number
+#   _a	: accuracy
+#   _p	: precision
+
+$VERSION = '1.51';
+require 5.005;
+
+require Exporter;
+@ISA =       qw(Exporter Math::BigInt);
+
+use strict;
+# $_trap_inf/$_trap_nan are internal and should never be accessed from outside
+use vars qw/$AUTOLOAD $accuracy $precision $div_scale $round_mode $rnd_mode
+	    $upgrade $downgrade $_trap_nan $_trap_inf/;
+my $class = "Math::BigFloat";
+
+use overload
+'<=>'	=>	sub { $_[2] ?
+                      ref($_[0])->bcmp($_[1],$_[0]) : 
+                      ref($_[0])->bcmp($_[0],$_[1])},
+'int'	=>	sub { $_[0]->as_number() },		# 'trunc' to bigint
+;
+
+##############################################################################
+# global constants, flags and assorted stuff
+
+# the following are public, but their usage is not recommended. Use the
+# accessor methods instead.
+
+# class constants, use Class->constant_name() to access
+$round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
+$accuracy   = undef;
+$precision  = undef;
+$div_scale  = 40;
+
+$upgrade = undef;
+$downgrade = undef;
+# the package we are using for our private parts, defaults to:
+# Math::BigInt->config()->{lib}
+my $MBI = 'Math::BigInt::FastCalc';
+
+# are NaNs ok? (otherwise it dies when encountering an NaN) set w/ config()
+$_trap_nan = 0;
+# the same for infinity
+$_trap_inf = 0;
+
+# constant for easier life
+my $nan = 'NaN'; 
+
+my $IMPORT = 0;	# was import() called yet? used to make require work
+
+# some digits of accuracy for blog(undef,10); which we use in blog() for speed
+my $LOG_10 = 
+ '2.3025850929940456840179914546843642076011014886287729760333279009675726097';
+my $LOG_10_A = length($LOG_10)-1;
+# ditto for log(2)
+my $LOG_2 = 
+ '0.6931471805599453094172321214581765680755001343602552541206800094933936220';
+my $LOG_2_A = length($LOG_2)-1;
+my $HALF = '0.5';			# made into an object if necc.
+
+##############################################################################
+# the old code had $rnd_mode, so we need to support it, too
+
+sub TIESCALAR   { my ($class) = @_; bless \$round_mode, $class; }
+sub FETCH       { return $round_mode; }
+sub STORE       { $rnd_mode = $_[0]->round_mode($_[1]); }
+
+BEGIN
+  {
+  # when someone set's $rnd_mode, we catch this and check the value to see
+  # whether it is valid or not. 
+  $rnd_mode   = 'even'; tie $rnd_mode, 'Math::BigFloat'; 
+  }
+ 
+##############################################################################
+
+{
+  # valid method aliases for AUTOLOAD
+  my %methods = map { $_ => 1 }  
+   qw / fadd fsub fmul fdiv fround ffround fsqrt fmod fstr fsstr fpow fnorm
+        fint facmp fcmp fzero fnan finf finc fdec flog ffac fneg
+	fceil ffloor frsft flsft fone flog froot
+      /;
+  # valid method's that can be hand-ed up (for AUTOLOAD)
+  my %hand_ups = map { $_ => 1 }  
+   qw / is_nan is_inf is_negative is_positive is_pos is_neg
+        accuracy precision div_scale round_mode fabs fnot
+        objectify upgrade downgrade
+	bone binf bnan bzero
+      /;
+
+  sub method_alias { exists $methods{$_[0]||''}; } 
+  sub method_hand_up { exists $hand_ups{$_[0]||''}; } 
+}
+
+##############################################################################
+# constructors
+
+sub new 
+  {
+  # create a new BigFloat object from a string or another bigfloat object. 
+  # _e: exponent
+  # _m: mantissa
+  # sign  => sign (+/-), or "NaN"
+
+  my ($class,$wanted,@r) = @_;
+
+  # avoid numify-calls by not using || on $wanted!
+  return $class->bzero() if !defined $wanted;	# default to 0
+  return $wanted->copy() if UNIVERSAL::isa($wanted,'Math::BigFloat');
+
+  $class->import() if $IMPORT == 0;             # make require work
+
+  my $self = {}; bless $self, $class;
+  # shortcut for bigints and its subclasses
+  if ((ref($wanted)) && (ref($wanted) ne $class))
+    {
+    $self->{_m} = $wanted->as_number()->{value}; # get us a bigint copy
+    $self->{_e} = $MBI->_zero();
+    $self->{_es} = '+';
+    $self->{sign} = $wanted->sign();
+    return $self->bnorm();
+    }
+  # else: got a string
+
+  # handle '+inf', '-inf' first
+  if ($wanted =~ /^[+-]?inf\z/)
+    {
+    return $downgrade->new($wanted) if $downgrade;
+
+    $self->{sign} = $wanted;		# set a default sign for bstr()
+    return $self->binf($wanted);
+    }
+
+  # shortcut for simple forms like '12' that neither have trailing nor leading
+  # zeros
+  if ($wanted =~ /^([+-]?)([1-9][0-9]*[1-9])$/)
+    {
+    $self->{_e} = $MBI->_zero();
+    $self->{_es} = '+';
+    $self->{sign} = $1 || '+';
+    $self->{_m} = $MBI->_new($2);
+    return $self->round(@r) if !$downgrade;
+    }
+
+  my ($mis,$miv,$mfv,$es,$ev) = Math::BigInt::_split($wanted);
+  if (!ref $mis)
+    {
+    if ($_trap_nan)
+      {
+      require Carp;
+      Carp::croak ("$wanted is not a number initialized to $class");
+      }
+    
+    return $downgrade->bnan() if $downgrade;
+    
+    $self->{_e} = $MBI->_zero();
+    $self->{_es} = '+';
+    $self->{_m} = $MBI->_zero();
+    $self->{sign} = $nan;
+    }
+  else
+    {
+    # make integer from mantissa by adjusting exp, then convert to int
+    $self->{_e} = $MBI->_new($$ev);		# exponent
+    $self->{_es} = $$es || '+';
+    my $mantissa = "$$miv$$mfv"; 		# create mant.
+    $mantissa =~ s/^0+(\d)/$1/;			# strip leading zeros
+    $self->{_m} = $MBI->_new($mantissa); 	# create mant.
+
+    # 3.123E0 = 3123E-3, and 3.123E-2 => 3123E-5
+    if (CORE::length($$mfv) != 0)
+      {
+      my $len = $MBI->_new( CORE::length($$mfv));
+      ($self->{_e}, $self->{_es}) =
+	_e_sub ($self->{_e}, $len, $self->{_es}, '+');
+      }
+    # we can only have trailing zeros on the mantissa if $$mfv eq ''
+    else
+      {
+      # Use a regexp to count the trailing zeros in $$miv instead of _zeros()
+      # because that is faster, especially when _m is not stored in base 10.
+      my $zeros = 0; $zeros = CORE::length($1) if $$miv =~ /[1-9](0*)$/; 
+      if ($zeros != 0)
+        {
+        my $z = $MBI->_new($zeros);
+        # turn '120e2' into '12e3'
+        $MBI->_rsft ( $self->{_m}, $z, 10);
+        ($self->{_e}, $self->{_es}) =
+	  _e_add ( $self->{_e}, $z, $self->{_es}, '+');
+        }
+      }
+    $self->{sign} = $$mis;
+
+    # for something like 0Ey, set y to 1, and -0 => +0
+    # Check $$miv for beeing '0' and $$mfv eq '', because otherwise _m could not
+    # have become 0. That's faster than to call $MBI->_is_zero().
+    $self->{sign} = '+', $self->{_e} = $MBI->_one()
+     if $$miv eq '0' and $$mfv eq '';
+
+    return $self->round(@r) if !$downgrade;
+    }
+  # if downgrade, inf, NaN or integers go down
+
+  if ($downgrade && $self->{_es} eq '+')
+    {
+    if ($MBI->_is_zero( $self->{_e} ))
+      {
+      return $downgrade->new($$mis . $MBI->_str( $self->{_m} ));
+      }
+    return $downgrade->new($self->bsstr()); 
+    }
+  $self->bnorm()->round(@r);			# first normalize, then round
+  }
+
+sub copy
+  {
+  my ($c,$x);
+  if (@_ > 1)
+    {
+    # if two arguments, the first one is the class to "swallow" subclasses
+    ($c,$x) = @_;
+    }
+  else
+    {
+    $x = shift;
+    $c = ref($x);
+    }
+  return unless ref($x); # only for objects
+
+  my $self = {}; bless $self,$c;
+
+  $self->{sign} = $x->{sign};
+  $self->{_es} = $x->{_es};
+  $self->{_m} = $MBI->_copy($x->{_m});
+  $self->{_e} = $MBI->_copy($x->{_e});
+  $self->{_a} = $x->{_a} if defined $x->{_a};
+  $self->{_p} = $x->{_p} if defined $x->{_p};
+  $self;
+  }
+
+sub _bnan
+  {
+  # used by parent class bone() to initialize number to NaN
+  my $self = shift;
+  
+  if ($_trap_nan)
+    {
+    require Carp;
+    my $class = ref($self);
+    Carp::croak ("Tried to set $self to NaN in $class\::_bnan()");
+    }
+
+  $IMPORT=1;					# call our import only once
+  $self->{_m} = $MBI->_zero();
+  $self->{_e} = $MBI->_zero();
+  $self->{_es} = '+';
+  }
+
+sub _binf
+  {
+  # used by parent class bone() to initialize number to +-inf
+  my $self = shift;
+  
+  if ($_trap_inf)
+    {
+    require Carp;
+    my $class = ref($self);
+    Carp::croak ("Tried to set $self to +-inf in $class\::_binf()");
+    }
+
+  $IMPORT=1;					# call our import only once
+  $self->{_m} = $MBI->_zero();
+  $self->{_e} = $MBI->_zero();
+  $self->{_es} = '+';
+  }
+
+sub _bone
+  {
+  # used by parent class bone() to initialize number to 1
+  my $self = shift;
+  $IMPORT=1;					# call our import only once
+  $self->{_m} = $MBI->_one();
+  $self->{_e} = $MBI->_zero();
+  $self->{_es} = '+';
+  }
+
+sub _bzero
+  {
+  # used by parent class bone() to initialize number to 0
+  my $self = shift;
+  $IMPORT=1;					# call our import only once
+  $self->{_m} = $MBI->_zero();
+  $self->{_e} = $MBI->_one();
+  $self->{_es} = '+';
+  }
+
+sub isa
+  {
+  my ($self,$class) = @_;
+  return if $class =~ /^Math::BigInt/;		# we aren't one of these
+  UNIVERSAL::isa($self,$class);
+  }
+
+sub config
+  {
+  # return (later set?) configuration data as hash ref
+  my $class = shift || 'Math::BigFloat';
+
+  my $cfg = $class->SUPER::config(@_);
+
+  # now we need only to override the ones that are different from our parent
+  $cfg->{class} = $class;
+  $cfg->{with} = $MBI;
+  $cfg;
+  }
+
+##############################################################################
+# string conversation
+
+sub bstr 
+  {
+  # (ref to BFLOAT or num_str ) return num_str
+  # Convert number from internal format to (non-scientific) string format.
+  # internal format is always normalized (no leading zeros, "-0" => "+0")
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  if ($x->{sign} !~ /^[+-]$/)
+    {
+    return $x->{sign} unless $x->{sign} eq '+inf';      # -inf, NaN
+    return 'inf';                                       # +inf
+    }
+
+  my $es = '0'; my $len = 1; my $cad = 0; my $dot = '.';
+
+  # $x is zero?
+  my $not_zero = !($x->{sign} eq '+' && $MBI->_is_zero($x->{_m}));
+  if ($not_zero)
+    {
+    $es = $MBI->_str($x->{_m});
+    $len = CORE::length($es);
+    my $e = $MBI->_num($x->{_e});	
+    $e = -$e if $x->{_es} eq '-';
+    if ($e < 0)
+      {
+      $dot = '';
+      # if _e is bigger than a scalar, the following will blow your memory
+      if ($e <= -$len)
+        {
+        my $r = abs($e) - $len;
+        $es = '0.'. ('0' x $r) . $es; $cad = -($len+$r);
+        }
+      else
+        {
+        substr($es,$e,0) = '.'; $cad = $MBI->_num($x->{_e});
+        $cad = -$cad if $x->{_es} eq '-';
+        }
+      }
+    elsif ($e > 0)
+      {
+      # expand with zeros
+      $es .= '0' x $e; $len += $e; $cad = 0;
+      }
+    } # if not zero
+
+  $es = '-'.$es if $x->{sign} eq '-';
+  # if set accuracy or precision, pad with zeros on the right side
+  if ((defined $x->{_a}) && ($not_zero))
+    {
+    # 123400 => 6, 0.1234 => 4, 0.001234 => 4
+    my $zeros = $x->{_a} - $cad;		# cad == 0 => 12340
+    $zeros = $x->{_a} - $len if $cad != $len;
+    $es .= $dot.'0' x $zeros if $zeros > 0;
+    }
+  elsif ((($x->{_p} || 0) < 0))
+    {
+    # 123400 => 6, 0.1234 => 4, 0.001234 => 6
+    my $zeros = -$x->{_p} + $cad;
+    $es .= $dot.'0' x $zeros if $zeros > 0;
+    }
+  $es;
+  }
+
+sub bsstr
+  {
+  # (ref to BFLOAT or num_str ) return num_str
+  # Convert number from internal format to scientific string format.
+  # internal format is always normalized (no leading zeros, "-0E0" => "+0E0")
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  if ($x->{sign} !~ /^[+-]$/)
+    {
+    return $x->{sign} unless $x->{sign} eq '+inf';      # -inf, NaN
+    return 'inf';                                       # +inf
+    }
+  my $sep = 'e'.$x->{_es};
+  my $sign = $x->{sign}; $sign = '' if $sign eq '+';
+  $sign . $MBI->_str($x->{_m}) . $sep . $MBI->_str($x->{_e});
+  }
+    
+sub numify 
+  {
+  # Make a number from a BigFloat object
+  # simple return a string and let Perl's atoi()/atof() handle the rest
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+  $x->bsstr(); 
+  }
+
+##############################################################################
+# public stuff (usually prefixed with "b")
+
+sub bneg
+  {
+  # (BINT or num_str) return BINT
+  # negate number or make a negated number from string
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return $x if $x->modify('bneg');
+
+  # for +0 dont negate (to have always normalized +0). Does nothing for 'NaN'
+  $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $MBI->_is_zero($x->{_m}));
+  $x;
+  }
+
+# tels 2001-08-04 
+# XXX TODO this must be overwritten and return NaN for non-integer values
+# band(), bior(), bxor(), too
+#sub bnot
+#  {
+#  $class->SUPER::bnot($class,@_);
+#  }
+
+sub bcmp 
+  {
+  # Compares 2 values.  Returns one of undef, <0, =0, >0. (suitable for sort)
+
+  # set up parameters
+  my ($self,$x,$y) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y) = objectify(2,@_);
+    }
+
+  return $upgrade->bcmp($x,$y) if defined $upgrade &&
+    ((!$x->isa($self)) || (!$y->isa($self)));
+
+  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
+    {
+    # handle +-inf and NaN
+    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+    return 0 if ($x->{sign} eq $y->{sign}) && ($x->{sign} =~ /^[+-]inf$/);
+    return +1 if $x->{sign} eq '+inf';
+    return -1 if $x->{sign} eq '-inf';
+    return -1 if $y->{sign} eq '+inf';
+    return +1;
+    }
+
+  # check sign for speed first
+  return 1 if $x->{sign} eq '+' && $y->{sign} eq '-';	# does also 0 <=> -y
+  return -1 if $x->{sign} eq '-' && $y->{sign} eq '+';	# does also -x <=> 0
+
+  # shortcut 
+  my $xz = $x->is_zero();
+  my $yz = $y->is_zero();
+  return 0 if $xz && $yz;				# 0 <=> 0
+  return -1 if $xz && $y->{sign} eq '+';		# 0 <=> +y
+  return 1 if $yz && $x->{sign} eq '+';			# +x <=> 0
+
+  # adjust so that exponents are equal
+  my $lxm = $MBI->_len($x->{_m});
+  my $lym = $MBI->_len($y->{_m});
+  # the numify somewhat limits our length, but makes it much faster
+  my ($xes,$yes) = (1,1);
+  $xes = -1 if $x->{_es} ne '+';
+  $yes = -1 if $y->{_es} ne '+';
+  my $lx = $lxm + $xes * $MBI->_num($x->{_e});
+  my $ly = $lym + $yes * $MBI->_num($y->{_e});
+  my $l = $lx - $ly; $l = -$l if $x->{sign} eq '-';
+  return $l <=> 0 if $l != 0;
+  
+  # lengths (corrected by exponent) are equal
+  # so make mantissa equal length by padding with zero (shift left)
+  my $diff = $lxm - $lym;
+  my $xm = $x->{_m};		# not yet copy it
+  my $ym = $y->{_m};
+  if ($diff > 0)
+    {
+    $ym = $MBI->_copy($y->{_m});
+    $ym = $MBI->_lsft($ym, $MBI->_new($diff), 10);
+    }
+  elsif ($diff < 0)
+    {
+    $xm = $MBI->_copy($x->{_m});
+    $xm = $MBI->_lsft($xm, $MBI->_new(-$diff), 10);
+    }
+  my $rc = $MBI->_acmp($xm,$ym);
+  $rc = -$rc if $x->{sign} eq '-';		# -124 < -123
+  $rc <=> 0;
+  }
+
+sub bacmp 
+  {
+  # Compares 2 values, ignoring their signs. 
+  # Returns one of undef, <0, =0, >0. (suitable for sort)
+  
+  # set up parameters
+  my ($self,$x,$y) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y) = objectify(2,@_);
+    }
+
+  return $upgrade->bacmp($x,$y) if defined $upgrade &&
+    ((!$x->isa($self)) || (!$y->isa($self)));
+
+  # handle +-inf and NaN's
+  if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/)
+    {
+    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+    return 0 if ($x->is_inf() && $y->is_inf());
+    return 1 if ($x->is_inf() && !$y->is_inf());
+    return -1;
+    }
+
+  # shortcut 
+  my $xz = $x->is_zero();
+  my $yz = $y->is_zero();
+  return 0 if $xz && $yz;				# 0 <=> 0
+  return -1 if $xz && !$yz;				# 0 <=> +y
+  return 1 if $yz && !$xz;				# +x <=> 0
+
+  # adjust so that exponents are equal
+  my $lxm = $MBI->_len($x->{_m});
+  my $lym = $MBI->_len($y->{_m});
+  my ($xes,$yes) = (1,1);
+  $xes = -1 if $x->{_es} ne '+';
+  $yes = -1 if $y->{_es} ne '+';
+  # the numify somewhat limits our length, but makes it much faster
+  my $lx = $lxm + $xes * $MBI->_num($x->{_e});
+  my $ly = $lym + $yes * $MBI->_num($y->{_e});
+  my $l = $lx - $ly;
+  return $l <=> 0 if $l != 0;
+  
+  # lengths (corrected by exponent) are equal
+  # so make mantissa equal-length by padding with zero (shift left)
+  my $diff = $lxm - $lym;
+  my $xm = $x->{_m};		# not yet copy it
+  my $ym = $y->{_m};
+  if ($diff > 0)
+    {
+    $ym = $MBI->_copy($y->{_m});
+    $ym = $MBI->_lsft($ym, $MBI->_new($diff), 10);
+    }
+  elsif ($diff < 0)
+    {
+    $xm = $MBI->_copy($x->{_m});
+    $xm = $MBI->_lsft($xm, $MBI->_new(-$diff), 10);
+    }
+  $MBI->_acmp($xm,$ym);
+  }
+
+sub badd 
+  {
+  # add second arg (BFLOAT or string) to first (BFLOAT) (modifies first)
+  # return result as BFLOAT
+
+  # set up parameters
+  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
+    }
+
+  # inf and NaN handling
+  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
+    {
+    # NaN first
+    return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+    # inf handling
+    if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
+      {
+      # +inf++inf or -inf+-inf => same, rest is NaN
+      return $x if $x->{sign} eq $y->{sign};
+      return $x->bnan();
+      }
+    # +-inf + something => +inf; something +-inf => +-inf
+    $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
+    return $x;
+    }
+
+  return $upgrade->badd($x,$y,$a,$p,$r) if defined $upgrade &&
+   ((!$x->isa($self)) || (!$y->isa($self)));
+
+  # speed: no add for 0+y or x+0
+  return $x->bround($a,$p,$r) if $y->is_zero();		# x+0
+  if ($x->is_zero())					# 0+y
+    {
+    # make copy, clobbering up x (modify in place!)
+    $x->{_e} = $MBI->_copy($y->{_e});
+    $x->{_es} = $y->{_es};
+    $x->{_m} = $MBI->_copy($y->{_m});
+    $x->{sign} = $y->{sign} || $nan;
+    return $x->round($a,$p,$r,$y);
+    }
+ 
+  # take lower of the two e's and adapt m1 to it to match m2
+  my $e = $y->{_e};
+  $e = $MBI->_zero() if !defined $e;		# if no BFLOAT?
+  $e = $MBI->_copy($e);				# make copy (didn't do it yet)
+
+  my $es;
+
+  ($e,$es) = _e_sub($e, $x->{_e}, $y->{_es} || '+', $x->{_es});
+
+  my $add = $MBI->_copy($y->{_m});
+
+  if ($es eq '-')				# < 0
+    {
+    $MBI->_lsft( $x->{_m}, $e, 10);
+    ($x->{_e},$x->{_es}) = _e_add($x->{_e}, $e, $x->{_es}, $es);
+    }
+  elsif (!$MBI->_is_zero($e))			# > 0
+    {
+    $MBI->_lsft($add, $e, 10);
+    }
+  # else: both e are the same, so just leave them
+
+  if ($x->{sign} eq $y->{sign})
+    {
+    # add
+    $x->{_m} = $MBI->_add($x->{_m}, $add);
+    }
+  else
+    {
+    ($x->{_m}, $x->{sign}) = 
+     _e_add($x->{_m}, $add, $x->{sign}, $y->{sign});
+    }
+
+  # delete trailing zeros, then round
+  $x->bnorm()->round($a,$p,$r,$y);
+  }
+
+# sub bsub is inherited from Math::BigInt!
+
+sub binc
+  {
+  # increment arg by one
+  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+
+  if ($x->{_es} eq '-')
+    {
+    return $x->badd($self->bone(),@r);	#  digits after dot
+    }
+
+  if (!$MBI->_is_zero($x->{_e}))		# _e == 0 for NaN, inf, -inf
+    {
+    # 1e2 => 100, so after the shift below _m has a '0' as last digit
+    $x->{_m} = $MBI->_lsft($x->{_m}, $x->{_e},10);	# 1e2 => 100
+    $x->{_e} = $MBI->_zero();				# normalize
+    $x->{_es} = '+';
+    # we know that the last digit of $x will be '1' or '9', depending on the
+    # sign
+    }
+  # now $x->{_e} == 0
+  if ($x->{sign} eq '+')
+    {
+    $MBI->_inc($x->{_m});
+    return $x->bnorm()->bround(@r);
+    }
+  elsif ($x->{sign} eq '-')
+    {
+    $MBI->_dec($x->{_m});
+    $x->{sign} = '+' if $MBI->_is_zero($x->{_m}); # -1 +1 => -0 => +0
+    return $x->bnorm()->bround(@r);
+    }
+  # inf, nan handling etc
+  $x->badd($self->bone(),@r);			# badd() does round 
+  }
+
+sub bdec
+  {
+  # decrement arg by one
+  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+
+  if ($x->{_es} eq '-')
+    {
+    return $x->badd($self->bone('-'),@r);	#  digits after dot
+    }
+
+  if (!$MBI->_is_zero($x->{_e}))
+    {
+    $x->{_m} = $MBI->_lsft($x->{_m}, $x->{_e},10);	# 1e2 => 100
+    $x->{_e} = $MBI->_zero();				# normalize
+    $x->{_es} = '+';
+    }
+  # now $x->{_e} == 0
+  my $zero = $x->is_zero();
+  # <= 0
+  if (($x->{sign} eq '-') || $zero)
+    {
+    $MBI->_inc($x->{_m});
+    $x->{sign} = '-' if $zero;				# 0 => 1 => -1
+    $x->{sign} = '+' if $MBI->_is_zero($x->{_m});	# -1 +1 => -0 => +0
+    return $x->bnorm()->round(@r);
+    }
+  # > 0
+  elsif ($x->{sign} eq '+')
+    {
+    $MBI->_dec($x->{_m});
+    return $x->bnorm()->round(@r);
+    }
+  # inf, nan handling etc
+  $x->badd($self->bone('-'),@r);		# does round
+  } 
+
+sub DEBUG () { 0; }
+
+sub blog
+  {
+  my ($self,$x,$base,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+
+  # $base > 0, $base != 1; if $base == undef default to $base == e
+  # $x >= 0
+
+  # we need to limit the accuracy to protect against overflow
+  my $fallback = 0;
+  my ($scale,@params);
+  ($x,@params) = $x->_find_round_parameters($a,$p,$r);
+
+  # also takes care of the "error in _find_round_parameters?" case
+  return $x->bnan() if $x->{sign} ne '+' || $x->is_zero();
+
+
+  # no rounding at all, so must use fallback
+  if (scalar @params == 0)
+    {
+    # simulate old behaviour
+    $params[0] = $self->div_scale();	# and round to it as accuracy
+    $params[1] = undef;			# P = undef
+    $scale = $params[0]+4; 		# at least four more for proper round
+    $params[2] = $r;			# round mode by caller or undef
+    $fallback = 1;			# to clear a/p afterwards
+    }
+  else
+    {
+    # the 4 below is empirical, and there might be cases where it is not
+    # enough...
+    $scale = abs($params[0] || $params[1]) + 4;	# take whatever is defined
+    }
+
+  return $x->bzero(@params) if $x->is_one();
+  # base not defined => base == Euler's constant e
+  if (defined $base)
+    {
+    # make object, since we don't feed it through objectify() to still get the
+    # case of $base == undef
+    $base = $self->new($base) unless ref($base);
+    # $base > 0; $base != 1
+    return $x->bnan() if $base->is_zero() || $base->is_one() ||
+      $base->{sign} ne '+';
+    # if $x == $base, we know the result must be 1.0
+    if ($x->bcmp($base) == 0)
+      {
+      $x->bone('+',@params);
+      if ($fallback)
+        {
+        # clear a/p after round, since user did not request it
+        delete $x->{_a}; delete $x->{_p};
+        }
+      return $x;
+      }
+    }
+
+  # when user set globals, they would interfere with our calculation, so
+  # disable them and later re-enable them
+  no strict 'refs';
+  my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
+  my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
+  # we also need to disable any set A or P on $x (_find_round_parameters took
+  # them already into account), since these would interfere, too
+  delete $x->{_a}; delete $x->{_p};
+  # need to disable $upgrade in BigInt, to avoid deep recursion
+  local $Math::BigInt::upgrade = undef;
+  local $Math::BigFloat::downgrade = undef;
+
+  # upgrade $x if $x is not a BigFloat (handle BigInt input)
+  if (!$x->isa('Math::BigFloat'))
+    {
+    $x = Math::BigFloat->new($x);
+    $self = ref($x);
+    }
+  
+  my $done = 0;
+
+  # If the base is defined and an integer, try to calculate integer result
+  # first. This is very fast, and in case the real result was found, we can
+  # stop right here.
+  if (defined $base && $base->is_int() && $x->is_int())
+    {
+    my $i = $MBI->_copy( $x->{_m} );
+    $MBI->_lsft( $i, $x->{_e}, 10 ) unless $MBI->_is_zero($x->{_e});
+    my $int = Math::BigInt->bzero();
+    $int->{value} = $i;
+    $int->blog($base->as_number());
+    # if ($exact)
+    if ($base->as_number()->bpow($int) == $x)
+      {
+      # found result, return it
+      $x->{_m} = $int->{value};
+      $x->{_e} = $MBI->_zero();
+      $x->{_es} = '+';
+      $x->bnorm();
+      $done = 1;
+      }
+    }
+
+  if ($done == 0)
+    {
+    # first calculate the log to base e (using reduction by 10 (and probably 2))
+    $self->_log_10($x,$scale);
+
+    # and if a different base was requested, convert it
+    if (defined $base)
+      {
+      $base = Math::BigFloat->new($base) unless $base->isa('Math::BigFloat');
+      # not ln, but some other base (don't modify $base)
+      $x->bdiv( $base->copy()->blog(undef,$scale), $scale );
+      }
+    }
+ 
+  # shortcut to not run through _find_round_parameters again
+  if (defined $params[0])
+    {
+    $x->bround($params[0],$params[2]);		# then round accordingly
+    }
+  else
+    {
+    $x->bfround($params[1],$params[2]);		# then round accordingly
+    }
+  if ($fallback)
+    {
+    # clear a/p after round, since user did not request it
+    delete $x->{_a}; delete $x->{_p};
+    }
+  # restore globals
+  $$abr = $ab; $$pbr = $pb;
+
+  $x;
+  }
+
+sub _log
+  {
+  # internal log function to calculate ln() based on Taylor series.
+  # Modifies $x in place.
+  my ($self,$x,$scale) = @_;
+
+  # in case of $x == 1, result is 0
+  return $x->bzero() if $x->is_one();
+
+  # http://www.efunda.com/math/taylor_series/logarithmic.cfm?search_string=log
+
+  # u = x-1, v = x+1
+  #              _                               _
+  # Taylor:     |    u    1   u^3   1   u^5       |
+  # ln (x)  = 2 |   --- + - * --- + - * --- + ... |  x > 0
+  #             |_   v    3   v^3   5   v^5      _|
+
+  # This takes much more steps to calculate the result and is thus not used
+  # u = x-1
+  #              _                               _
+  # Taylor:     |    u    1   u^2   1   u^3       |
+  # ln (x)  = 2 |   --- + - * --- + - * --- + ... |  x > 1/2
+  #             |_   x    2   x^2   3   x^3      _|
+
+  my ($limit,$v,$u,$below,$factor,$two,$next,$over,$f);
+
+  $v = $x->copy(); $v->binc();		# v = x+1
+  $x->bdec(); $u = $x->copy();		# u = x-1; x = x-1
+  $x->bdiv($v,$scale);			# first term: u/v
+  $below = $v->copy();
+  $over = $u->copy();
+  $u *= $u; $v *= $v;				# u^2, v^2
+  $below->bmul($v);				# u^3, v^3
+  $over->bmul($u);
+  $factor = $self->new(3); $f = $self->new(2);
+
+  my $steps = 0 if DEBUG;  
+  $limit = $self->new("1E-". ($scale-1));
+  while (3 < 5)
+    {
+    # we calculate the next term, and add it to the last
+    # when the next term is below our limit, it won't affect the outcome
+    # anymore, so we stop
+
+    # calculating the next term simple from over/below will result in quite
+    # a time hog if the input has many digits, since over and below will
+    # accumulate more and more digits, and the result will also have many
+    # digits, but in the end it is rounded to $scale digits anyway. So if we
+    # round $over and $below first, we save a lot of time for the division
+    # (not with log(1.2345), but try log (123**123) to see what I mean. This
+    # can introduce a rounding error if the division result would be f.i.
+    # 0.1234500000001 and we round it to 5 digits it would become 0.12346, but
+    # if we truncated $over and $below we might get 0.12345. Does this matter
+    # for the end result? So we give $over and $below 4 more digits to be
+    # on the safe side (unscientific error handling as usual... :+D
+    
+    $next = $over->copy->bround($scale+4)->bdiv(
+      $below->copy->bmul($factor)->bround($scale+4), 
+      $scale);
+
+## old version:    
+##    $next = $over->copy()->bdiv($below->copy()->bmul($factor),$scale);
+
+    last if $next->bacmp($limit) <= 0;
+
+    delete $next->{_a}; delete $next->{_p};
+    $x->badd($next);
+    # calculate things for the next term
+    $over *= $u; $below *= $v; $factor->badd($f);
+    if (DEBUG)
+      {
+      $steps++; print "step $steps = $x\n" if $steps % 10 == 0;
+      }
+    }
+  $x->bmul($f);					# $x *= 2
+  print "took $steps steps\n" if DEBUG;
+  }
+
+sub _log_10
+  {
+  # Internal log function based on reducing input to the range of 0.1 .. 9.99
+  # and then "correcting" the result to the proper one. Modifies $x in place.
+  my ($self,$x,$scale) = @_;
+
+  # taking blog() from numbers greater than 10 takes a *very long* time, so we
+  # break the computation down into parts based on the observation that:
+  #  blog(x*y) = blog(x) + blog(y)
+  # We set $y here to multiples of 10 so that $x is below 1 (the smaller $x is
+  # the faster it get's, especially because 2*$x takes about 10 times as long,
+  # so by dividing $x by 10 we make it at least factor 100 faster...)
+
+  # The same observation is valid for numbers smaller than 0.1 (e.g. computing
+  # log(1) is fastest, and the farther away we get from 1, the longer it takes)
+  # so we also 'break' this down by multiplying $x with 10 and subtract the
+  # log(10) afterwards to get the correct result.
+
+  # calculate nr of digits before dot
+  my $dbd = $MBI->_num($x->{_e});
+  $dbd = -$dbd if $x->{_es} eq '-';
+  $dbd += $MBI->_len($x->{_m});
+
+  # more than one digit (e.g. at least 10), but *not* exactly 10 to avoid
+  # infinite recursion
+
+  my $calc = 1;					# do some calculation?
+
+  # disable the shortcut for 10, since we need log(10) and this would recurse
+  # infinitely deep
+  if ($x->{_es} eq '+' && $MBI->_is_one($x->{_e}) && $MBI->_is_one($x->{_m}))
+    {
+    $dbd = 0;					# disable shortcut
+    # we can use the cached value in these cases
+    if ($scale <= $LOG_10_A)
+      {
+      $x->bzero(); $x->badd($LOG_10);
+      $calc = 0; 				# no need to calc, but round
+      }
+    }
+  else
+    {
+    # disable the shortcut for 2, since we maybe have it cached
+    if (($MBI->_is_zero($x->{_e}) && $MBI->_is_two($x->{_m})))
+      {
+      $dbd = 0;					# disable shortcut
+      # we can use the cached value in these cases
+      if ($scale <= $LOG_2_A)
+        {
+        $x->bzero(); $x->badd($LOG_2);
+        $calc = 0; 				# no need to calc, but round
+        }
+      }
+    }
+
+  # if $x = 0.1, we know the result must be 0-log(10)
+  if ($calc != 0 && $x->{_es} eq '-' && $MBI->_is_one($x->{_e}) &&
+      $MBI->_is_one($x->{_m}))
+    {
+    $dbd = 0;					# disable shortcut
+    # we can use the cached value in these cases
+    if ($scale <= $LOG_10_A)
+      {
+      $x->bzero(); $x->bsub($LOG_10);
+      $calc = 0; 				# no need to calc, but round
+      }
+    }
+
+  return if $calc == 0;				# already have the result
+
+  # default: these correction factors are undef and thus not used
+  my $l_10;				# value of ln(10) to A of $scale
+  my $l_2;				# value of ln(2) to A of $scale
+
+  # $x == 2 => 1, $x == 13 => 2, $x == 0.1 => 0, $x == 0.01 => -1
+  # so don't do this shortcut for 1 or 0
+  if (($dbd > 1) || ($dbd < 0))
+    {
+    # convert our cached value to an object if not already (avoid doing this
+    # at import() time, since not everybody needs this)
+    $LOG_10 = $self->new($LOG_10,undef,undef) unless ref $LOG_10;
+
+    #print "x = $x, dbd = $dbd, calc = $calc\n";
+    # got more than one digit before the dot, or more than one zero after the
+    # dot, so do:
+    #  log(123)    == log(1.23) + log(10) * 2
+    #  log(0.0123) == log(1.23) - log(10) * 2
+  
+    if ($scale <= $LOG_10_A)
+      {
+      # use cached value
+      $l_10 = $LOG_10->copy();		# copy for mul
+      }
+    else
+      {
+      # else: slower, compute it (but don't cache it, because it could be big)
+      # also disable downgrade for this code path
+      local $Math::BigFloat::downgrade = undef;
+      $l_10 = $self->new(10)->blog(undef,$scale);	# scale+4, actually
+      }
+    $dbd-- if ($dbd > 1); 		# 20 => dbd=2, so make it dbd=1	
+    $l_10->bmul( $self->new($dbd));	# log(10) * (digits_before_dot-1)
+    my $dbd_sign = '+';
+    if ($dbd < 0)
+      {
+      $dbd = -$dbd;
+      $dbd_sign = '-';
+      }
+    ($x->{_e}, $x->{_es}) = 
+	_e_sub( $x->{_e}, $MBI->_new($dbd), $x->{_es}, $dbd_sign); # 123 => 1.23
+ 
+    }
+
+  # Now: 0.1 <= $x < 10 (and possible correction in l_10)
+
+  ### Since $x in the range 0.5 .. 1.5 is MUCH faster, we do a repeated div
+  ### or mul by 2 (maximum times 3, since x < 10 and x > 0.1)
+
+  $HALF = $self->new($HALF) unless ref($HALF);
+
+  my $twos = 0;				# default: none (0 times)	
+  my $two = $self->new(2);
+  while ($x->bacmp($HALF) <= 0)
+    {
+    $twos--; $x->bmul($two);
+    }
+  while ($x->bacmp($two) >= 0)
+    {
+    $twos++; $x->bdiv($two,$scale+4);		# keep all digits
+    }
+  # $twos > 0 => did mul 2, < 0 => did div 2 (never both)
+  # calculate correction factor based on ln(2)
+  if ($twos != 0)
+    {
+    $LOG_2 = $self->new($LOG_2,undef,undef) unless ref $LOG_2;
+    if ($scale <= $LOG_2_A)
+      {
+      # use cached value
+      $l_2 = $LOG_2->copy();			# copy for mul
+      }
+    else
+      {
+      # else: slower, compute it (but don't cache it, because it could be big)
+      # also disable downgrade for this code path
+      local $Math::BigFloat::downgrade = undef;
+      $l_2 = $two->blog(undef,$scale);	# scale+4, actually
+      }
+    $l_2->bmul($twos);		# * -2 => subtract, * 2 => add
+    }
+  
+  $self->_log($x,$scale);			# need to do the "normal" way
+  $x->badd($l_10) if defined $l_10; 		# correct it by ln(10)
+  $x->badd($l_2) if defined $l_2;		# and maybe by ln(2)
+  # all done, $x contains now the result
+  }
+
+sub blcm 
+  { 
+  # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
+  # does not modify arguments, but returns new object
+  # Lowest Common Multiplicator
+
+  my ($self,@arg) = objectify(0,@_);
+  my $x = $self->new(shift @arg);
+  while (@arg) { $x = Math::BigInt::__lcm($x,shift @arg); } 
+  $x;
+  }
+
+sub bgcd
+  {
+  # (BINT or num_str, BINT or num_str) return BINT
+  # does not modify arguments, but returns new object
+
+  my $y = shift;
+  $y = __PACKAGE__->new($y) if !ref($y);
+  my $self = ref($y);
+  my $x = $y->copy()->babs();			# keep arguments
+
+  return $x->bnan() if $x->{sign} !~ /^[+-]$/	# x NaN?
+	|| !$x->is_int();			# only for integers now
+
+  while (@_)
+    {
+    my $t = shift; $t = $self->new($t) if !ref($t);
+    $y = $t->copy()->babs();
+    
+    return $x->bnan() if $y->{sign} !~ /^[+-]$/	# y NaN?
+     	|| !$y->is_int();			# only for integers now
+
+    # greatest common divisor
+    while (! $y->is_zero())
+      {
+      ($x,$y) = ($y->copy(), $x->copy()->bmod($y));
+      }
+
+    last if $x->is_one();
+    }
+  $x;
+  }
+
+##############################################################################
+
+sub _e_add
+  {
+  # Internal helper sub to take two positive integers and their signs and
+  # then add them. Input ($CALC,$CALC,('+'|'-'),('+'|'-')), 
+  # output ($CALC,('+'|'-'))
+  my ($x,$y,$xs,$ys) = @_;
+
+  # if the signs are equal we can add them (-5 + -3 => -(5 + 3) => -8)
+  if ($xs eq $ys)
+    {
+    $x = $MBI->_add ($x, $y );		# a+b
+    # the sign follows $xs
+    return ($x, $xs);
+    }
+
+  my $a = $MBI->_acmp($x,$y);
+  if ($a > 0)
+    {
+    $x = $MBI->_sub ($x , $y);				# abs sub
+    }
+  elsif ($a == 0)
+    {
+    $x = $MBI->_zero();					# result is 0
+    $xs = '+';
+    }
+  else # a < 0
+    {
+    $x = $MBI->_sub ( $y, $x, 1 );			# abs sub
+    $xs = $ys;
+    }
+  ($x,$xs);
+  }
+
+sub _e_sub
+  {
+  # Internal helper sub to take two positive integers and their signs and
+  # then subtract them. Input ($CALC,$CALC,('+'|'-'),('+'|'-')), 
+  # output ($CALC,('+'|'-'))
+  my ($x,$y,$xs,$ys) = @_;
+
+  # flip sign
+  $ys =~ tr/+-/-+/;
+  _e_add($x,$y,$xs,$ys);		# call add (does subtract now)
+  }
+
+###############################################################################
+# is_foo methods (is_negative, is_positive are inherited from BigInt)
+
+sub is_int
+  {
+  # return true if arg (BFLOAT or num_str) is an integer
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return 1 if ($x->{sign} =~ /^[+-]$/) &&	# NaN and +-inf aren't
+    $x->{_es} eq '+';				# 1e-1 => no integer
+  0;
+  }
+
+sub is_zero
+  {
+  # return true if arg (BFLOAT or num_str) is zero
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return 1 if $x->{sign} eq '+' && $MBI->_is_zero($x->{_m});
+  0;
+  }
+
+sub is_one
+  {
+  # return true if arg (BFLOAT or num_str) is +1 or -1 if signis given
+  my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
+
+  $sign = '+' if !defined $sign || $sign ne '-';
+  return 1
+   if ($x->{sign} eq $sign && 
+    $MBI->_is_zero($x->{_e}) && $MBI->_is_one($x->{_m})); 
+  0;
+  }
+
+sub is_odd
+  {
+  # return true if arg (BFLOAT or num_str) is odd or false if even
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+  
+  return 1 if ($x->{sign} =~ /^[+-]$/) &&		# NaN & +-inf aren't
+    ($MBI->_is_zero($x->{_e}) && $MBI->_is_odd($x->{_m})); 
+  0;
+  }
+
+sub is_even
+  {
+  # return true if arg (BINT or num_str) is even or false if odd
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return 0 if $x->{sign} !~ /^[+-]$/;			# NaN & +-inf aren't
+  return 1 if ($x->{_es} eq '+'	 			# 123.45 is never
+     && $MBI->_is_even($x->{_m}));			# but 1200 is
+  0;
+  }
+
+sub bmul 
+  { 
+  # multiply two numbers -- stolen from Knuth Vol 2 pg 233
+  # (BINT or num_str, BINT or num_str) return BINT
+  
+  # set up parameters
+  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
+    }
+
+  return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+
+  # inf handling
+  if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
+    {
+    return $x->bnan() if $x->is_zero() || $y->is_zero(); 
+    # result will always be +-inf:
+    # +inf * +/+inf => +inf, -inf * -/-inf => +inf
+    # +inf * -/-inf => -inf, -inf * +/+inf => -inf
+    return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
+    return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
+    return $x->binf('-');
+    }
+  # handle result = 0
+  return $x->bzero() if $x->is_zero() || $y->is_zero();
+  
+  return $upgrade->bmul($x,$y,$a,$p,$r) if defined $upgrade &&
+   ((!$x->isa($self)) || (!$y->isa($self)));
+
+  # aEb * cEd = (a*c)E(b+d)
+  $MBI->_mul($x->{_m},$y->{_m});
+  ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es});
+
+  # adjust sign:
+  $x->{sign} = $x->{sign} ne $y->{sign} ? '-' : '+';
+  return $x->bnorm()->round($a,$p,$r,$y);
+  }
+
+sub bdiv 
+  {
+  # (dividend: BFLOAT or num_str, divisor: BFLOAT or num_str) return 
+  # (BFLOAT,BFLOAT) (quo,rem) or BFLOAT (only rem)
+
+  # set up parameters
+  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
+    }
+
+  return $self->_div_inf($x,$y)
+   if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
+
+  # x== 0 # also: or y == 1 or y == -1
+  return wantarray ? ($x,$self->bzero()) : $x if $x->is_zero();
+
+  # upgrade ?
+  return $upgrade->bdiv($upgrade->new($x),$y,$a,$p,$r) if defined $upgrade;
+
+  # we need to limit the accuracy to protect against overflow
+  my $fallback = 0;
+  my (@params,$scale);
+  ($x,@params) = $x->_find_round_parameters($a,$p,$r,$y);
+
+  return $x if $x->is_nan();		# error in _find_round_parameters?
+
+  # no rounding at all, so must use fallback
+  if (scalar @params == 0)
+    {
+    # simulate old behaviour
+    $params[0] = $self->div_scale();	# and round to it as accuracy
+    $scale = $params[0]+4; 		# at least four more for proper round
+    $params[2] = $r;			# round mode by caller or undef
+    $fallback = 1;			# to clear a/p afterwards
+    }
+  else
+    {
+    # the 4 below is empirical, and there might be cases where it is not
+    # enough...
+    $scale = abs($params[0] || $params[1]) + 4;	# take whatever is defined
+    }
+
+  my $rem; $rem = $self->bzero() if wantarray;
+
+  $y = $self->new($y) unless $y->isa('Math::BigFloat');
+
+  my $lx = $MBI->_len($x->{_m}); my $ly = $MBI->_len($y->{_m});
+  $scale = $lx if $lx > $scale;
+  $scale = $ly if $ly > $scale;
+  my $diff = $ly - $lx;
+  $scale += $diff if $diff > 0;		# if lx << ly, but not if ly << lx!
+
+  # already handled inf/NaN/-inf above:
+
+  # check that $y is not 1 nor -1 and cache the result:
+  my $y_not_one = !($MBI->_is_zero($y->{_e}) && $MBI->_is_one($y->{_m}));
+
+  # flipping the sign of $y will also flip the sign of $x for the special
+  # case of $x->bsub($x); so we can catch it below:
+  my $xsign = $x->{sign};
+  $y->{sign} =~ tr/+-/-+/;
+
+  if ($xsign ne $x->{sign})
+    {
+    # special case of $x /= $x results in 1
+    $x->bone();			# "fixes" also sign of $y, since $x is $y
+    }
+  else
+    {
+    # correct $y's sign again
+    $y->{sign} =~ tr/+-/-+/;
+    # continue with normal div code:
+
+    # make copy of $x in case of list context for later reminder calculation
+    if (wantarray && $y_not_one)
+      {
+      $rem = $x->copy();
+      }
+
+    $x->{sign} = $x->{sign} ne $y->sign() ? '-' : '+'; 
+
+    # check for / +-1 ( +/- 1E0)
+    if ($y_not_one)
+      {
+      # promote BigInts and it's subclasses (except when already a BigFloat)
+      $y = $self->new($y) unless $y->isa('Math::BigFloat'); 
+
+      # calculate the result to $scale digits and then round it
+      # a * 10 ** b / c * 10 ** d => a/c * 10 ** (b-d)
+      $MBI->_lsft($x->{_m},$MBI->_new($scale),10);
+      $MBI->_div ($x->{_m},$y->{_m});	# a/c
+
+      # correct exponent of $x
+      ($x->{_e},$x->{_es}) = _e_sub($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es});
+      # correct for 10**scale
+      ($x->{_e},$x->{_es}) = _e_sub($x->{_e}, $MBI->_new($scale), $x->{_es}, '+');
+      $x->bnorm();		# remove trailing 0's
+      }
+    } # ende else $x != $y
+
+  # shortcut to not run through _find_round_parameters again
+  if (defined $params[0])
+    {
+    delete $x->{_a}; 				# clear before round
+    $x->bround($params[0],$params[2]);		# then round accordingly
+    }
+  else
+    {
+    delete $x->{_p}; 				# clear before round
+    $x->bfround($params[1],$params[2]);		# then round accordingly
+    }
+  if ($fallback)
+    {
+    # clear a/p after round, since user did not request it
+    delete $x->{_a}; delete $x->{_p};
+    }
+
+  if (wantarray)
+    {
+    if ($y_not_one)
+      {
+      $rem->bmod($y,@params);			# copy already done
+      }
+    if ($fallback)
+      {
+      # clear a/p after round, since user did not request it
+      delete $rem->{_a}; delete $rem->{_p};
+      }
+    return ($x,$rem);
+    }
+  $x;
+  }
+
+sub bmod 
+  {
+  # (dividend: BFLOAT or num_str, divisor: BFLOAT or num_str) return reminder 
+
+  # set up parameters
+  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
+    }
+
+  # handle NaN, inf, -inf
+  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
+    {
+    my ($d,$re) = $self->SUPER::_div_inf($x,$y);
+    $x->{sign} = $re->{sign};
+    $x->{_e} = $re->{_e};
+    $x->{_m} = $re->{_m};
+    return $x->round($a,$p,$r,$y);
+    } 
+  if ($y->is_zero())
+    {
+    return $x->bnan() if $x->is_zero();
+    return $x;
+    }
+
+  return $x->bzero() if $x->is_zero()
+ || ($x->is_int() &&
+  # check that $y == +1 or $y == -1:
+    ($MBI->_is_zero($y->{_e}) && $MBI->_is_one($y->{_m})));
+
+  my $cmp = $x->bacmp($y);			# equal or $x < $y?
+  return $x->bzero($a,$p) if $cmp == 0;		# $x == $y => result 0
+
+  # only $y of the operands negative? 
+  my $neg = 0; $neg = 1 if $x->{sign} ne $y->{sign};
+
+  $x->{sign} = $y->{sign};				# calc sign first
+  return $x->round($a,$p,$r) if $cmp < 0 && $neg == 0;	# $x < $y => result $x
+  
+  my $ym = $MBI->_copy($y->{_m});
+  
+  # 2e1 => 20
+  $MBI->_lsft( $ym, $y->{_e}, 10) 
+   if $y->{_es} eq '+' && !$MBI->_is_zero($y->{_e});
+ 
+  # if $y has digits after dot
+  my $shifty = 0;			# correct _e of $x by this
+  if ($y->{_es} eq '-')			# has digits after dot
+    {
+    # 123 % 2.5 => 1230 % 25 => 5 => 0.5
+    $shifty = $MBI->_num($y->{_e}); 	# no more digits after dot
+    $MBI->_lsft($x->{_m}, $y->{_e}, 10);# 123 => 1230, $y->{_m} is already 25
+    }
+  # $ym is now mantissa of $y based on exponent 0
+
+  my $shiftx = 0;			# correct _e of $x by this
+  if ($x->{_es} eq '-')			# has digits after dot
+    {
+    # 123.4 % 20 => 1234 % 200
+    $shiftx = $MBI->_num($x->{_e});	# no more digits after dot
+    $MBI->_lsft($ym, $x->{_e}, 10);	# 123 => 1230
+    }
+  # 123e1 % 20 => 1230 % 20
+  if ($x->{_es} eq '+' && !$MBI->_is_zero($x->{_e}))
+    {
+    $MBI->_lsft( $x->{_m}, $x->{_e},10);	# es => '+' here
+    }
+
+  $x->{_e} = $MBI->_new($shiftx);
+  $x->{_es} = '+'; 
+  $x->{_es} = '-' if $shiftx != 0 || $shifty != 0;
+  $MBI->_add( $x->{_e}, $MBI->_new($shifty)) if $shifty != 0;
+  
+  # now mantissas are equalized, exponent of $x is adjusted, so calc result
+
+  $x->{_m} = $MBI->_mod( $x->{_m}, $ym);
+
+  $x->{sign} = '+' if $MBI->_is_zero($x->{_m});		# fix sign for -0
+  $x->bnorm();
+
+  if ($neg != 0)	# one of them negative => correct in place
+    {
+    my $r = $y - $x;
+    $x->{_m} = $r->{_m};
+    $x->{_e} = $r->{_e};
+    $x->{_es} = $r->{_es};
+    $x->{sign} = '+' if $MBI->_is_zero($x->{_m});	# fix sign for -0
+    $x->bnorm();
+    }
+
+  $x->round($a,$p,$r,$y);	# round and return
+  }
+
+sub broot
+  {
+  # calculate $y'th root of $x
+  
+  # set up parameters
+  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
+    }
+
+  # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
+  return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
+         $y->{sign} !~ /^\+$/;
+
+  return $x if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one();
+  
+  # we need to limit the accuracy to protect against overflow
+  my $fallback = 0;
+  my (@params,$scale);
+  ($x,@params) = $x->_find_round_parameters($a,$p,$r);
+
+  return $x if $x->is_nan();		# error in _find_round_parameters?
+
+  # no rounding at all, so must use fallback
+  if (scalar @params == 0) 
+    {
+    # simulate old behaviour
+    $params[0] = $self->div_scale();	# and round to it as accuracy
+    $scale = $params[0]+4; 		# at least four more for proper round
+    $params[2] = $r;			# iound mode by caller or undef
+    $fallback = 1;			# to clear a/p afterwards
+    }
+  else
+    {
+    # the 4 below is empirical, and there might be cases where it is not
+    # enough...
+    $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
+    }
+
+  # when user set globals, they would interfere with our calculation, so
+  # disable them and later re-enable them
+  no strict 'refs';
+  my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
+  my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
+  # we also need to disable any set A or P on $x (_find_round_parameters took
+  # them already into account), since these would interfere, too
+  delete $x->{_a}; delete $x->{_p};
+  # need to disable $upgrade in BigInt, to avoid deep recursion
+  local $Math::BigInt::upgrade = undef;	# should be really parent class vs MBI
+
+  # remember sign and make $x positive, since -4 ** (1/2) => -2
+  my $sign = 0; $sign = 1 if $x->{sign} eq '-'; $x->{sign} = '+';
+
+  my $is_two = 0;
+  if ($y->isa('Math::BigFloat'))
+    {
+    $is_two = ($y->{sign} eq '+' && $MBI->_is_two($y->{_m}) && $MBI->_is_zero($y->{_e}));
+    }
+  else
+    {
+    $is_two = ($y == 2);
+    }
+
+  # normal square root if $y == 2:
+  if ($is_two)
+    {
+    $x->bsqrt($scale+4);
+    }
+  elsif ($y->is_one('-'))
+    {
+    # $x ** -1 => 1/$x
+    my $u = $self->bone()->bdiv($x,$scale);
+    # copy private parts over
+    $x->{_m} = $u->{_m};
+    $x->{_e} = $u->{_e};
+    $x->{_es} = $u->{_es};
+    }
+  else
+    {
+    # calculate the broot() as integer result first, and if it fits, return
+    # it rightaway (but only if $x and $y are integer):
+
+    my $done = 0;				# not yet
+    if ($y->is_int() && $x->is_int())
+      {
+      my $i = $MBI->_copy( $x->{_m} );
+      $MBI->_lsft( $i, $x->{_e}, 10 ) unless $MBI->_is_zero($x->{_e});
+      my $int = Math::BigInt->bzero();
+      $int->{value} = $i;
+      $int->broot($y->as_number());
+      # if ($exact)
+      if ($int->copy()->bpow($y) == $x)
+        {
+        # found result, return it
+        $x->{_m} = $int->{value};
+        $x->{_e} = $MBI->_zero();
+        $x->{_es} = '+';
+        $x->bnorm();
+        $done = 1;
+        }
+      }
+    if ($done == 0)
+      {
+      my $u = $self->bone()->bdiv($y,$scale+4);
+      delete $u->{_a}; delete $u->{_p};         # otherwise it conflicts
+      $x->bpow($u,$scale+4);                    # el cheapo
+      }
+    }
+  $x->bneg() if $sign == 1;
+  
+  # shortcut to not run through _find_round_parameters again
+  if (defined $params[0])
+    {
+    $x->bround($params[0],$params[2]);		# then round accordingly
+    }
+  else
+    {
+    $x->bfround($params[1],$params[2]);		# then round accordingly
+    }
+  if ($fallback)
+    {
+    # clear a/p after round, since user did not request it
+    delete $x->{_a}; delete $x->{_p};
+    }
+  # restore globals
+  $$abr = $ab; $$pbr = $pb;
+  $x;
+  }
+
+sub bsqrt
+  { 
+  # calculate square root
+  my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+
+  return $x->bnan() if $x->{sign} !~ /^[+]/;	# NaN, -inf or < 0
+  return $x if $x->{sign} eq '+inf';		# sqrt(inf) == inf
+  return $x->round($a,$p,$r) if $x->is_zero() || $x->is_one();
+
+  # we need to limit the accuracy to protect against overflow
+  my $fallback = 0;
+  my (@params,$scale);
+  ($x,@params) = $x->_find_round_parameters($a,$p,$r);
+
+  return $x if $x->is_nan();		# error in _find_round_parameters?
+
+  # no rounding at all, so must use fallback
+  if (scalar @params == 0) 
+    {
+    # simulate old behaviour
+    $params[0] = $self->div_scale();	# and round to it as accuracy
+    $scale = $params[0]+4; 		# at least four more for proper round
+    $params[2] = $r;			# round mode by caller or undef
+    $fallback = 1;			# to clear a/p afterwards
+    }
+  else
+    {
+    # the 4 below is empirical, and there might be cases where it is not
+    # enough...
+    $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
+    }
+
+  # when user set globals, they would interfere with our calculation, so
+  # disable them and later re-enable them
+  no strict 'refs';
+  my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
+  my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
+  # we also need to disable any set A or P on $x (_find_round_parameters took
+  # them already into account), since these would interfere, too
+  delete $x->{_a}; delete $x->{_p};
+  # need to disable $upgrade in BigInt, to avoid deep recursion
+  local $Math::BigInt::upgrade = undef;	# should be really parent class vs MBI
+
+  my $i = $MBI->_copy( $x->{_m} );
+  $MBI->_lsft( $i, $x->{_e}, 10 ) unless $MBI->_is_zero($x->{_e});
+  my $xas = Math::BigInt->bzero();
+  $xas->{value} = $i;
+
+  my $gs = $xas->copy()->bsqrt();	# some guess
+
+  if (($x->{_es} ne '-')		# guess can't be accurate if there are
+					# digits after the dot
+   && ($xas->bacmp($gs * $gs) == 0))	# guess hit the nail on the head?
+    {
+    # exact result, copy result over to keep $x
+    $x->{_m} = $gs->{value}; $x->{_e} = $MBI->_zero(); $x->{_es} = '+';
+    $x->bnorm();
+    # shortcut to not run through _find_round_parameters again
+    if (defined $params[0])
+      {
+      $x->bround($params[0],$params[2]);	# then round accordingly
+      }
+    else
+      {
+      $x->bfround($params[1],$params[2]);	# then round accordingly
+      }
+    if ($fallback)
+      {
+      # clear a/p after round, since user did not request it
+      delete $x->{_a}; delete $x->{_p};
+      }
+    # re-enable A and P, upgrade is taken care of by "local"
+    ${"$self\::accuracy"} = $ab; ${"$self\::precision"} = $pb;
+    return $x;
+    }
+ 
+  # sqrt(2) = 1.4 because sqrt(2*100) = 1.4*10; so we can increase the accuracy
+  # of the result by multipyling the input by 100 and then divide the integer
+  # result of sqrt(input) by 10. Rounding afterwards returns the real result.
+
+  # The following steps will transform 123.456 (in $x) into 123456 (in $y1)
+  my $y1 = $MBI->_copy($x->{_m});
+
+  my $length = $MBI->_len($y1);
+  
+  # Now calculate how many digits the result of sqrt(y1) would have
+  my $digits = int($length / 2);
+
+  # But we need at least $scale digits, so calculate how many are missing
+  my $shift = $scale - $digits;
+
+  # That should never happen (we take care of integer guesses above)
+  # $shift = 0 if $shift < 0; 
+
+  # Multiply in steps of 100, by shifting left two times the "missing" digits
+  my $s2 = $shift * 2;
+
+  # We now make sure that $y1 has the same odd or even number of digits than
+  # $x had. So when _e of $x is odd, we must shift $y1 by one digit left,
+  # because we always must multiply by steps of 100 (sqrt(100) is 10) and not
+  # steps of 10. The length of $x does not count, since an even or odd number
+  # of digits before the dot is not changed by adding an even number of digits
+  # after the dot (the result is still odd or even digits long).
+  $s2++ if $MBI->_is_odd($x->{_e});
+
+  $MBI->_lsft( $y1, $MBI->_new($s2), 10);
+
+  # now take the square root and truncate to integer
+  $y1 = $MBI->_sqrt($y1);
+
+  # By "shifting" $y1 right (by creating a negative _e) we calculate the final
+  # result, which is than later rounded to the desired scale.
+
+  # calculate how many zeros $x had after the '.' (or before it, depending
+  # on sign of $dat, the result should have half as many:
+  my $dat = $MBI->_num($x->{_e});
+  $dat = -$dat if $x->{_es} eq '-';
+  $dat += $length;
+
+  if ($dat > 0)
+    {
+    # no zeros after the dot (e.g. 1.23, 0.49 etc)
+    # preserve half as many digits before the dot than the input had 
+    # (but round this "up")
+    $dat = int(($dat+1)/2);
+    }
+  else
+    {
+    $dat = int(($dat)/2);
+    }
+  $dat -= $MBI->_len($y1);
+  if ($dat < 0)
+    {
+    $dat = abs($dat);
+    $x->{_e} = $MBI->_new( $dat );
+    $x->{_es} = '-';
+    }
+  else
+    {    
+    $x->{_e} = $MBI->_new( $dat );
+    $x->{_es} = '+';
+    }
+  $x->{_m} = $y1;
+  $x->bnorm();
+
+  # shortcut to not run through _find_round_parameters again
+  if (defined $params[0])
+    {
+    $x->bround($params[0],$params[2]);		# then round accordingly
+    }
+  else
+    {
+    $x->bfround($params[1],$params[2]);		# then round accordingly
+    }
+  if ($fallback)
+    {
+    # clear a/p after round, since user did not request it
+    delete $x->{_a}; delete $x->{_p};
+    }
+  # restore globals
+  $$abr = $ab; $$pbr = $pb;
+  $x;
+  }
+
+sub bfac
+  {
+  # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
+  # compute factorial number, modifies first argument
+
+  # set up parameters
+  my ($self,$x,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  ($self,$x,@r) = objectify(1,@_) if !ref($x);
+
+ return $x if $x->{sign} eq '+inf';	# inf => inf
+  return $x->bnan() 
+    if (($x->{sign} ne '+') ||		# inf, NaN, <0 etc => NaN
+     ($x->{_es} ne '+'));		# digits after dot?
+
+  # use BigInt's bfac() for faster calc
+  if (! $MBI->_is_zero($x->{_e}))
+    {
+    $MBI->_lsft($x->{_m}, $x->{_e},10);	# change 12e1 to 120e0
+    $x->{_e} = $MBI->_zero();		# normalize
+    $x->{_es} = '+';
+    }
+  $MBI->_fac($x->{_m});			# calculate factorial
+  $x->bnorm()->round(@r); 		# norm again and round result
+  }
+
+sub _pow
+  {
+  # Calculate a power where $y is a non-integer, like 2 ** 0.5
+  my ($x,$y,$a,$p,$r) = @_;
+  my $self = ref($x);
+
+  # if $y == 0.5, it is sqrt($x)
+  $HALF = $self->new($HALF) unless ref($HALF);
+  return $x->bsqrt($a,$p,$r,$y) if $y->bcmp($HALF) == 0;
+
+  # Using:
+  # a ** x == e ** (x * ln a)
+
+  # u = y * ln x
+  #                _                         _
+  # Taylor:       |   u    u^2    u^3         |
+  # x ** y  = 1 + |  --- + --- + ----- + ...  |
+  #               |_  1    1*2   1*2*3       _|
+
+  # we need to limit the accuracy to protect against overflow
+  my $fallback = 0;
+  my ($scale,@params);
+  ($x,@params) = $x->_find_round_parameters($a,$p,$r);
+    
+  return $x if $x->is_nan();		# error in _find_round_parameters?
+
+  # no rounding at all, so must use fallback
+  if (scalar @params == 0)
+    {
+    # simulate old behaviour
+    $params[0] = $self->div_scale();	# and round to it as accuracy
+    $params[1] = undef;			# disable P
+    $scale = $params[0]+4; 		# at least four more for proper round
+    $params[2] = $r;			# round mode by caller or undef
+    $fallback = 1;			# to clear a/p afterwards
+    }
+  else
+    {
+    # the 4 below is empirical, and there might be cases where it is not
+    # enough...
+    $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
+    }
+
+  # when user set globals, they would interfere with our calculation, so
+  # disable them and later re-enable them
+  no strict 'refs';
+  my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
+  my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
+  # we also need to disable any set A or P on $x (_find_round_parameters took
+  # them already into account), since these would interfere, too
+  delete $x->{_a}; delete $x->{_p};
+  # need to disable $upgrade in BigInt, to avoid deep recursion
+  local $Math::BigInt::upgrade = undef;
+ 
+  my ($limit,$v,$u,$below,$factor,$next,$over);
+
+  $u = $x->copy()->blog(undef,$scale)->bmul($y);
+  $v = $self->bone();				# 1
+  $factor = $self->new(2);			# 2
+  $x->bone();					# first term: 1
+
+  $below = $v->copy();
+  $over = $u->copy();
+
+  $limit = $self->new("1E-". ($scale-1));
+  #my $steps = 0;
+  while (3 < 5)
+    {
+    # we calculate the next term, and add it to the last
+    # when the next term is below our limit, it won't affect the outcome
+    # anymore, so we stop
+    $next = $over->copy()->bdiv($below,$scale);
+    last if $next->bacmp($limit) <= 0;
+    $x->badd($next);
+    # calculate things for the next term
+    $over *= $u; $below *= $factor; $factor->binc();
+
+    last if $x->{sign} !~ /^[-+]$/;
+
+    #$steps++;
+    }
+  
+  # shortcut to not run through _find_round_parameters again
+  if (defined $params[0])
+    {
+    $x->bround($params[0],$params[2]);		# then round accordingly
+    }
+  else
+    {
+    $x->bfround($params[1],$params[2]);		# then round accordingly
+    }
+  if ($fallback)
+    {
+    # clear a/p after round, since user did not request it
+    delete $x->{_a}; delete $x->{_p};
+    }
+  # restore globals
+  $$abr = $ab; $$pbr = $pb;
+  $x;
+  }
+
+sub bpow 
+  {
+  # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
+  # compute power of two numbers, second arg is used as integer
+  # modifies first argument
+
+  # set up parameters
+  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
+    }
+
+  return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
+  return $x if $x->{sign} =~ /^[+-]inf$/;
+  
+  # -2 ** -2 => NaN
+  return $x->bnan() if $x->{sign} eq '-' && $y->{sign} eq '-';
+
+  # cache the result of is_zero
+  my $y_is_zero = $y->is_zero();
+  return $x->bone() if $y_is_zero;
+  return $x         if $x->is_one() || $y->is_one();
+
+  my $x_is_zero = $x->is_zero();
+  return $x->_pow($y,$a,$p,$r) if !$x_is_zero && !$y->is_int();		# non-integer power
+
+  my $y1 = $y->as_number()->{value};			# make MBI part
+
+  # if ($x == -1)
+  if ($x->{sign} eq '-' && $MBI->_is_one($x->{_m}) && $MBI->_is_zero($x->{_e}))
+    {
+    # if $x == -1 and odd/even y => +1/-1  because +-1 ^ (+-1) => +-1
+    return $MBI->_is_odd($y1) ? $x : $x->babs(1);
+    }
+  if ($x_is_zero)
+    {
+    return $x->bone() if $y_is_zero;
+    return $x if $y->{sign} eq '+'; 	# 0**y => 0 (if not y <= 0)
+    # 0 ** -y => 1 / (0 ** y) => 1 / 0! (1 / 0 => +inf)
+    return $x->binf();
+    }
+
+  my $new_sign = '+';
+  $new_sign = $MBI->_is_odd($y1) ? '-' : '+' if $x->{sign} ne '+';
+
+  # calculate $x->{_m} ** $y and $x->{_e} * $y separately (faster)
+  $x->{_m} = $MBI->_pow( $x->{_m}, $y1);
+  $x->{_e} = $MBI->_mul ($x->{_e}, $y1);
+
+  $x->{sign} = $new_sign;
+  $x->bnorm();
+  if ($y->{sign} eq '-')
+    {
+    # modify $x in place!
+    my $z = $x->copy(); $x->bone();
+    return $x->bdiv($z,$a,$p,$r);	# round in one go (might ignore y's A!)
+    }
+  $x->round($a,$p,$r,$y);
+  }
+
+###############################################################################
+# rounding functions
+
+sub bfround
+  {
+  # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
+  # $n == 0 means round to integer
+  # expects and returns normalized numbers!
+  my $x = shift; my $self = ref($x) || $x; $x = $self->new(shift) if !ref($x);
+
+  my ($scale,$mode) = $x->_scale_p(@_);
+  return $x if !defined $scale || $x->modify('bfround'); # no-op
+
+  # never round a 0, +-inf, NaN
+  if ($x->is_zero())
+    {
+    $x->{_p} = $scale if !defined $x->{_p} || $x->{_p} < $scale; # -3 < -2
+    return $x; 
+    }
+  return $x if $x->{sign} !~ /^[+-]$/;
+
+  # don't round if x already has lower precision
+  return $x if (defined $x->{_p} && $x->{_p} < 0 && $scale < $x->{_p});
+
+  $x->{_p} = $scale;			# remember round in any case
+  delete $x->{_a};			# and clear A
+  if ($scale < 0)
+    {
+    # round right from the '.'
+
+    return $x if $x->{_es} eq '+';		# e >= 0 => nothing to round
+
+    $scale = -$scale;				# positive for simplicity
+    my $len = $MBI->_len($x->{_m});		# length of mantissa
+
+    # the following poses a restriction on _e, but if _e is bigger than a
+    # scalar, you got other problems (memory etc) anyway
+    my $dad = -(0+ ($x->{_es}.$MBI->_num($x->{_e})));	# digits after dot
+    my $zad = 0;				# zeros after dot
+    $zad = $dad - $len if (-$dad < -$len);	# for 0.00..00xxx style
+   
+    # p rint "scale $scale dad $dad zad $zad len $len\n";
+    # number  bsstr   len zad dad	
+    # 0.123   123e-3	3   0 3
+    # 0.0123  123e-4	3   1 4
+    # 0.001   1e-3      1   2 3
+    # 1.23    123e-2	3   0 2
+    # 1.2345  12345e-4	5   0 4
+
+    # do not round after/right of the $dad
+    return $x if $scale > $dad;			# 0.123, scale >= 3 => exit
+
+    # round to zero if rounding inside the $zad, but not for last zero like:
+    # 0.0065, scale -2, round last '0' with following '65' (scale == zad case)
+    return $x->bzero() if $scale < $zad;
+    if ($scale == $zad)			# for 0.006, scale -3 and trunc
+      {
+      $scale = -$len;
+      }
+    else
+      {
+      # adjust round-point to be inside mantissa
+      if ($zad != 0)
+        {
+	$scale = $scale-$zad;
+        }
+      else
+        {
+        my $dbd = $len - $dad; $dbd = 0 if $dbd < 0;	# digits before dot
+	$scale = $dbd+$scale;
+        }
+      }
+    }
+  else
+    {
+    # round left from the '.'
+
+    # 123 => 100 means length(123) = 3 - $scale (2) => 1
+
+    my $dbt = $MBI->_len($x->{_m}); 
+    # digits before dot 
+    my $dbd = $dbt + ($x->{_es} . $MBI->_num($x->{_e}));
+    # should be the same, so treat it as this 
+    $scale = 1 if $scale == 0; 
+    # shortcut if already integer 
+    return $x if $scale == 1 && $dbt <= $dbd; 
+    # maximum digits before dot 
+    ++$dbd;
+
+    if ($scale > $dbd) 
+       { 
+       # not enough digits before dot, so round to zero 
+       return $x->bzero; 
+       }
+    elsif ( $scale == $dbd )
+       { 
+       # maximum 
+       $scale = -$dbt; 
+       } 
+    else
+       { 
+       $scale = $dbd - $scale; 
+       }
+    }
+  # pass sign to bround for rounding modes '+inf' and '-inf'
+  my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt';
+  $m->bround($scale,$mode);
+  $x->{_m} = $m->{value};			# get our mantissa back
+  $x->bnorm();
+  }
+
+sub bround
+  {
+  # accuracy: preserve $N digits, and overwrite the rest with 0's
+  my $x = shift; my $self = ref($x) || $x; $x = $self->new(shift) if !ref($x);
+
+  if (($_[0] || 0) < 0)
+    {
+    require Carp; Carp::croak ('bround() needs positive accuracy');
+    }
+
+  my ($scale,$mode) = $x->_scale_a(@_);
+  return $x if !defined $scale || $x->modify('bround');	# no-op
+
+  # scale is now either $x->{_a}, $accuracy, or the user parameter
+  # test whether $x already has lower accuracy, do nothing in this case 
+  # but do round if the accuracy is the same, since a math operation might
+  # want to round a number with A=5 to 5 digits afterwards again
+  return $x if defined $x->{_a} && $x->{_a} < $scale;
+
+  # scale < 0 makes no sense
+  # scale == 0 => keep all digits
+  # never round a +-inf, NaN
+  return $x if ($scale <= 0) || $x->{sign} !~ /^[+-]$/;
+
+  # 1: never round a 0
+  # 2: if we should keep more digits than the mantissa has, do nothing
+  if ($x->is_zero() || $MBI->_len($x->{_m}) <= $scale)
+    {
+    $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale;
+    return $x; 
+    }
+
+  # pass sign to bround for '+inf' and '-inf' rounding modes
+  my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt';
+
+  $m->bround($scale,$mode);		# round mantissa
+  $x->{_m} = $m->{value};		# get our mantissa back
+  $x->{_a} = $scale;			# remember rounding
+  delete $x->{_p};			# and clear P
+  $x->bnorm();				# del trailing zeros gen. by bround()
+  }
+
+sub bfloor
+  {
+  # return integer less or equal then $x
+  my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+
+  return $x if $x->modify('bfloor');
+   
+  return $x if $x->{sign} !~ /^[+-]$/;	# nan, +inf, -inf
+
+  # if $x has digits after dot
+  if ($x->{_es} eq '-')
+    {
+    $x->{_m} = $MBI->_rsft($x->{_m},$x->{_e},10); # cut off digits after dot
+    $x->{_e} = $MBI->_zero();			# trunc/norm	
+    $x->{_es} = '+';				# abs e
+    $MBI->_inc($x->{_m}) if $x->{sign} eq '-';	# increment if negative
+    }
+  $x->round($a,$p,$r);
+  }
+
+sub bceil
+  {
+  # return integer greater or equal then $x
+  my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+
+  return $x if $x->modify('bceil');
+  return $x if $x->{sign} !~ /^[+-]$/;	# nan, +inf, -inf
+
+  # if $x has digits after dot
+  if ($x->{_es} eq '-')
+    {
+    $x->{_m} = $MBI->_rsft($x->{_m},$x->{_e},10); # cut off digits after dot
+    $x->{_e} = $MBI->_zero();			# trunc/norm	
+    $x->{_es} = '+';				# abs e
+    $MBI->_inc($x->{_m}) if $x->{sign} eq '+';	# increment if positive
+    }
+  $x->round($a,$p,$r);
+  }
+
+sub brsft
+  {
+  # shift right by $y (divide by power of $n)
+  
+  # set up parameters
+  my ($self,$x,$y,$n,$a,$p,$r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$n,$a,$p,$r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('brsft');
+  return $x if $x->{sign} !~ /^[+-]$/;	# nan, +inf, -inf
+
+  $n = 2 if !defined $n; $n = $self->new($n);
+  $x->bdiv($n->bpow($y),$a,$p,$r,$y);
+  }
+
+sub blsft
+  {
+  # shift left by $y (multiply by power of $n)
+  
+  # set up parameters
+  my ($self,$x,$y,$n,$a,$p,$r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$n,$a,$p,$r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('blsft');
+  return $x if $x->{sign} !~ /^[+-]$/;	# nan, +inf, -inf
+
+  $n = 2 if !defined $n; $n = $self->new($n);
+  $x->bmul($n->bpow($y),$a,$p,$r,$y);
+  }
+
+###############################################################################
+
+sub DESTROY
+  {
+  # going through AUTOLOAD for every DESTROY is costly, avoid it by empty sub
+  }
+
+sub AUTOLOAD
+  {
+  # make fxxx and bxxx both work by selectively mapping fxxx() to MBF::bxxx()
+  # or falling back to MBI::bxxx()
+  my $name = $AUTOLOAD;
+
+  $name =~ s/(.*):://;	# split package
+  my $c = $1 || $class;
+  no strict 'refs';
+  $c->import() if $IMPORT == 0;
+  if (!method_alias($name))
+    {
+    if (!defined $name)
+      {
+      # delayed load of Carp and avoid recursion	
+      require Carp;
+      Carp::croak ("$c: Can't call a method without name");
+      }
+    if (!method_hand_up($name))
+      {
+      # delayed load of Carp and avoid recursion	
+      require Carp;
+      Carp::croak ("Can't call $c\-\>$name, not a valid method");
+      }
+    # try one level up, but subst. bxxx() for fxxx() since MBI only got bxxx()
+    $name =~ s/^f/b/;
+    return &{"Math::BigInt"."::$name"}(@_);
+    }
+  my $bname = $name; $bname =~ s/^f/b/;
+  $c .= "::$name";
+  *{$c} = \&{$bname};
+  &{$c};	# uses @_
+  }
+
+sub exponent
+  {
+  # return a copy of the exponent
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  if ($x->{sign} !~ /^[+-]$/)
+    {
+    my $s = $x->{sign}; $s =~ s/^[+-]//;
+    return Math::BigInt->new($s); 		# -inf, +inf => +inf
+    }
+  Math::BigInt->new( $x->{_es} . $MBI->_str($x->{_e}));
+  }
+
+sub mantissa
+  {
+  # return a copy of the mantissa
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+ 
+  if ($x->{sign} !~ /^[+-]$/)
+    {
+    my $s = $x->{sign}; $s =~ s/^[+]//;
+    return Math::BigInt->new($s);		# -inf, +inf => +inf
+    }
+  my $m = Math::BigInt->new( $MBI->_str($x->{_m}));
+  $m->bneg() if $x->{sign} eq '-';
+
+  $m;
+  }
+
+sub parts
+  {
+  # return a copy of both the exponent and the mantissa
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  if ($x->{sign} !~ /^[+-]$/)
+    {
+    my $s = $x->{sign}; $s =~ s/^[+]//; my $se = $s; $se =~ s/^[-]//;
+    return ($self->new($s),$self->new($se)); # +inf => inf and -inf,+inf => inf
+    }
+  my $m = Math::BigInt->bzero();
+  $m->{value} = $MBI->_copy($x->{_m});
+  $m->bneg() if $x->{sign} eq '-';
+  ($m, Math::BigInt->new( $x->{_es} . $MBI->_num($x->{_e}) ));
+  }
+
+##############################################################################
+# private stuff (internal use only)
+
+sub import
+  {
+  my $self = shift;
+  my $l = scalar @_;
+  my $lib = ''; my @a;
+  $IMPORT=1;
+  for ( my $i = 0; $i < $l ; $i++)
+    {
+    if ( $_[$i] eq ':constant' )
+      {
+      # This causes overlord er load to step in. 'binary' and 'integer'
+      # are handled by BigInt.
+      overload::constant float => sub { $self->new(shift); }; 
+      }
+    elsif ($_[$i] eq 'upgrade')
+      {
+      # this causes upgrading
+      $upgrade = $_[$i+1];		# or undef to disable
+      $i++;
+      }
+    elsif ($_[$i] eq 'downgrade')
+      {
+      # this causes downgrading
+      $downgrade = $_[$i+1];		# or undef to disable
+      $i++;
+      }
+    elsif ($_[$i] eq 'lib')
+      {
+      # alternative library
+      $lib = $_[$i+1] || '';		# default Calc
+      $i++;
+      }
+    elsif ($_[$i] eq 'with')
+      {
+      # alternative class for our private parts()
+      # XXX: no longer supported
+      # $MBI = $_[$i+1] || 'Math::BigInt';
+      $i++;
+      }
+    else
+      {
+      push @a, $_[$i];
+      }
+    }
+
+  $lib =~ tr/a-zA-Z0-9,://cd;		# restrict to sane characters
+  # let use Math::BigInt lib => 'GMP'; use Math::BigFloat; still work
+  my $mbilib = eval { Math::BigInt->config()->{lib} };
+  if ((defined $mbilib) && ($MBI eq 'Math::BigInt::Calc'))
+    {
+    # MBI already loaded
+    Math::BigInt->import('lib',"$lib,$mbilib", 'objectify');
+    }
+  else
+    {
+    # MBI not loaded, or with ne "Math::BigInt::Calc"
+    $lib .= ",$mbilib" if defined $mbilib;
+    $lib =~ s/^,//;				# don't leave empty 
+    
+    # replacement library can handle lib statement, but also could ignore it
+    
+    # Perl < 5.6.0 dies with "out of memory!" when eval() and ':constant' is
+    # used in the same script, or eval inside import(). So we require MBI:
+    require Math::BigInt;
+    Math::BigInt->import( lib => $lib, 'objectify' );
+    }
+  if ($@)
+    {
+    require Carp; Carp::croak ("Couldn't load $lib: $! $@");
+    }
+  # find out which one was actually loaded
+  $MBI = Math::BigInt->config()->{lib};
+
+  # register us with MBI to get notified of future lib changes
+  Math::BigInt::_register_callback( $self, sub { $MBI = $_[0]; } );
+   
+  # any non :constant stuff is handled by our parent, Exporter
+  # even if @_ is empty, to give it a chance
+  $self->SUPER::import(@a);      	# for subclasses
+  $self->export_to_level(1,$self,@a);	# need this, too
+  }
+
+sub bnorm
+  {
+  # adjust m and e so that m is smallest possible
+  # round number according to accuracy and precision settings
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return $x if $x->{sign} !~ /^[+-]$/;		# inf, nan etc
+
+  my $zeros = $MBI->_zeros($x->{_m});		# correct for trailing zeros
+  if ($zeros != 0)
+    {
+    my $z = $MBI->_new($zeros);
+    $x->{_m} = $MBI->_rsft ($x->{_m}, $z, 10);
+    if ($x->{_es} eq '-')
+      {
+      if ($MBI->_acmp($x->{_e},$z) >= 0)
+        {
+        $x->{_e} = $MBI->_sub  ($x->{_e}, $z);
+        $x->{_es} = '+' if $MBI->_is_zero($x->{_e});
+        }
+      else
+        {
+        $x->{_e} = $MBI->_sub  ( $MBI->_copy($z), $x->{_e});
+        $x->{_es} = '+';
+        }
+      }
+    else
+      {
+      $x->{_e} = $MBI->_add  ($x->{_e}, $z);
+      }
+    }
+  else
+    {
+    # $x can only be 0Ey if there are no trailing zeros ('0' has 0 trailing
+    # zeros). So, for something like 0Ey, set y to 1, and -0 => +0
+    $x->{sign} = '+', $x->{_es} = '+', $x->{_e} = $MBI->_one()
+     if $MBI->_is_zero($x->{_m});
+    }
+
+  $x;					# MBI bnorm is no-op, so dont call it
+  } 
+ 
+##############################################################################
+
+sub as_hex
+  {
+  # return number as hexadecimal string (only for integers defined)
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  return $x->bstr() if $x->{sign} !~ /^[+-]$/;  # inf, nan etc
+  return '0x0' if $x->is_zero();
+
+  return $nan if $x->{_es} ne '+';		# how to do 1e-1 in hex!?
+
+  my $z = $MBI->_copy($x->{_m});
+  if (! $MBI->_is_zero($x->{_e}))		# > 0 
+    {
+    $MBI->_lsft( $z, $x->{_e},10);
+    }
+  $z = Math::BigInt->new( $x->{sign} . $MBI->_num($z));
+  $z->as_hex();
+  }
+
+sub as_bin
+  {
+  # return number as binary digit string (only for integers defined)
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  return $x->bstr() if $x->{sign} !~ /^[+-]$/;  # inf, nan etc
+  return '0b0' if $x->is_zero();
+
+  return $nan if $x->{_es} ne '+';		# how to do 1e-1 in hex!?
+
+  my $z = $MBI->_copy($x->{_m});
+  if (! $MBI->_is_zero($x->{_e}))		# > 0 
+    {
+    $MBI->_lsft( $z, $x->{_e},10);
+    }
+  $z = Math::BigInt->new( $x->{sign} . $MBI->_num($z));
+  $z->as_bin();
+  }
+
+sub as_number
+  {
+  # return copy as a bigint representation of this BigFloat number
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  my $z = $MBI->_copy($x->{_m});
+  if ($x->{_es} eq '-')			# < 0
+    {
+    $MBI->_rsft( $z, $x->{_e},10);
+    } 
+  elsif (! $MBI->_is_zero($x->{_e}))	# > 0 
+    {
+    $MBI->_lsft( $z, $x->{_e},10);
+    }
+  $z = Math::BigInt->new( $x->{sign} . $MBI->_num($z));
+  $z;
+  }
+
+sub length
+  {
+  my $x = shift;
+  my $class = ref($x) || $x;
+  $x = $class->new(shift) unless ref($x);
+
+  return 1 if $MBI->_is_zero($x->{_m});
+
+  my $len = $MBI->_len($x->{_m});
+  $len += $MBI->_num($x->{_e}) if $x->{_es} eq '+';
+  if (wantarray())
+    {
+    my $t = 0;
+    $t = $MBI->_num($x->{_e}) if $x->{_es} eq '-';
+    return ($len, $t);
+    }
+  $len;
+  }
+
+1;
+__END__
+
+=head1 NAME
+
+Math::BigFloat - Arbitrary size floating point math package
+
+=head1 SYNOPSIS
+
+  use Math::BigFloat;
+
+  # Number creation
+  $x = Math::BigFloat->new($str);	# defaults to 0
+  $nan  = Math::BigFloat->bnan();	# create a NotANumber
+  $zero = Math::BigFloat->bzero();	# create a +0
+  $inf = Math::BigFloat->binf();	# create a +inf
+  $inf = Math::BigFloat->binf('-');	# create a -inf
+  $one = Math::BigFloat->bone();	# create a +1
+  $one = Math::BigFloat->bone('-');	# create a -1
+
+  # Testing
+  $x->is_zero();		# true if arg is +0
+  $x->is_nan();			# true if arg is NaN
+  $x->is_one();			# true if arg is +1
+  $x->is_one('-');		# true if arg is -1
+  $x->is_odd();			# true if odd, false for even
+  $x->is_even();		# true if even, false for odd
+  $x->is_pos();			# true if >= 0
+  $x->is_neg();			# true if <  0
+  $x->is_inf(sign);		# true if +inf, or -inf (default is '+')
+
+  $x->bcmp($y);			# compare numbers (undef,<0,=0,>0)
+  $x->bacmp($y);		# compare absolutely (undef,<0,=0,>0)
+  $x->sign();			# return the sign, either +,- or NaN
+  $x->digit($n);		# return the nth digit, counting from right
+  $x->digit(-$n);		# return the nth digit, counting from left 
+
+  # The following all modify their first argument. If you want to preserve
+  # $x, use $z = $x->copy()->bXXX($y); See under L<CAVEATS> for why this is
+  # neccessary when mixing $a = $b assigments with non-overloaded math.
+ 
+  # set 
+  $x->bzero();			# set $i to 0
+  $x->bnan();			# set $i to NaN
+  $x->bone();                   # set $x to +1
+  $x->bone('-');                # set $x to -1
+  $x->binf();                   # set $x to inf
+  $x->binf('-');                # set $x to -inf
+
+  $x->bneg();			# negation
+  $x->babs();			# absolute value
+  $x->bnorm();			# normalize (no-op)
+  $x->bnot();			# two's complement (bit wise not)
+  $x->binc();			# increment x by 1
+  $x->bdec();			# decrement x by 1
+  
+  $x->badd($y);			# addition (add $y to $x)
+  $x->bsub($y);			# subtraction (subtract $y from $x)
+  $x->bmul($y);			# multiplication (multiply $x by $y)
+  $x->bdiv($y);			# divide, set $x to quotient
+				# return (quo,rem) or quo if scalar
+
+  $x->bmod($y);			# modulus ($x % $y)
+  $x->bpow($y);			# power of arguments ($x ** $y)
+  $x->blsft($y);		# left shift
+  $x->brsft($y);		# right shift 
+				# return (quo,rem) or quo if scalar
+  
+  $x->blog();			# logarithm of $x to base e (Euler's number)
+  $x->blog($base);		# logarithm of $x to base $base (f.i. 2)
+  
+  $x->band($y);			# bit-wise and
+  $x->bior($y);			# bit-wise inclusive or
+  $x->bxor($y);			# bit-wise exclusive or
+  $x->bnot();			# bit-wise not (two's complement)
+ 
+  $x->bsqrt();			# calculate square-root
+  $x->broot($y);		# $y'th root of $x (e.g. $y == 3 => cubic root)
+  $x->bfac();			# factorial of $x (1*2*3*4*..$x)
+ 
+  $x->bround($N); 		# accuracy: preserve $N digits
+  $x->bfround($N);		# precision: round to the $Nth digit
+
+  $x->bfloor();			# return integer less or equal than $x
+  $x->bceil();			# return integer greater or equal than $x
+
+  # The following do not modify their arguments:
+
+  bgcd(@values);		# greatest common divisor
+  blcm(@values);		# lowest common multiplicator
+  
+  $x->bstr();			# return string
+  $x->bsstr();			# return string in scientific notation
+
+  $x->as_int();			# return $x as BigInt 
+  $x->exponent();		# return exponent as BigInt
+  $x->mantissa();		# return mantissa as BigInt
+  $x->parts();			# return (mantissa,exponent) as BigInt
+
+  $x->length();			# number of digits (w/o sign and '.')
+  ($l,$f) = $x->length();	# number of digits, and length of fraction	
+
+  $x->precision();		# return P of $x (or global, if P of $x undef)
+  $x->precision($n);		# set P of $x to $n
+  $x->accuracy();		# return A of $x (or global, if A of $x undef)
+  $x->accuracy($n);		# set A $x to $n
+
+  # these get/set the appropriate global value for all BigFloat objects
+  Math::BigFloat->precision();	# Precision
+  Math::BigFloat->accuracy();	# Accuracy
+  Math::BigFloat->round_mode();	# rounding mode
+
+=head1 DESCRIPTION
+
+All operators (inlcuding basic math operations) are overloaded if you
+declare your big floating point numbers as
+
+  $i = new Math::BigFloat '12_3.456_789_123_456_789E-2';
+
+Operations with overloaded operators preserve the arguments, which is
+exactly what you expect.
+
+=head2 Canonical notation
+
+Input to these routines are either BigFloat objects, or strings of the
+following four forms:
+
+=over 2
+
+=item *
+
+C</^[+-]\d+$/>
+
+=item *
+
+C</^[+-]\d+\.\d*$/>
+
+=item *
+
+C</^[+-]\d+E[+-]?\d+$/>
+
+=item *
+
+C</^[+-]\d*\.\d+E[+-]?\d+$/>
+
+=back
+
+all with optional leading and trailing zeros and/or spaces. Additonally,
+numbers are allowed to have an underscore between any two digits.
+
+Empty strings as well as other illegal numbers results in 'NaN'.
+
+bnorm() on a BigFloat object is now effectively a no-op, since the numbers 
+are always stored in normalized form. On a string, it creates a BigFloat 
+object.
+
+=head2 Output
+
+Output values are BigFloat objects (normalized), except for bstr() and bsstr().
+
+The string output will always have leading and trailing zeros stripped and drop
+a plus sign. C<bstr()> will give you always the form with a decimal point,
+while C<bsstr()> (s for scientific) gives you the scientific notation.
+
+	Input			bstr()		bsstr()
+	'-0'			'0'		'0E1'
+   	'  -123 123 123'	'-123123123'	'-123123123E0'
+	'00.0123'		'0.0123'	'123E-4'
+	'123.45E-2'		'1.2345'	'12345E-4'
+	'10E+3'			'10000'		'1E4'
+
+Some routines (C<is_odd()>, C<is_even()>, C<is_zero()>, C<is_one()>,
+C<is_nan()>) return true or false, while others (C<bcmp()>, C<bacmp()>)
+return either undef, <0, 0 or >0 and are suited for sort.
+
+Actual math is done by using the class defined with C<with => Class;> (which
+defaults to BigInts) to represent the mantissa and exponent.
+
+The sign C</^[+-]$/> is stored separately. The string 'NaN' is used to 
+represent the result when input arguments are not numbers, as well as 
+the result of dividing by zero.
+
+=head2 C<mantissa()>, C<exponent()> and C<parts()>
+
+C<mantissa()> and C<exponent()> return the said parts of the BigFloat 
+as BigInts such that:
+
+	$m = $x->mantissa();
+	$e = $x->exponent();
+	$y = $m * ( 10 ** $e );
+	print "ok\n" if $x == $y;
+
+C<< ($m,$e) = $x->parts(); >> is just a shortcut giving you both of them.
+
+A zero is represented and returned as C<0E1>, B<not> C<0E0> (after Knuth).
+
+Currently the mantissa is reduced as much as possible, favouring higher
+exponents over lower ones (e.g. returning 1e7 instead of 10e6 or 10000000e0).
+This might change in the future, so do not depend on it.
+
+=head2 Accuracy vs. Precision
+
+See also: L<Rounding|Rounding>.
+
+Math::BigFloat supports both precision (rounding to a certain place before or
+after the dot) and accuracy (rounding to a certain number of digits). For a
+full documentation, examples and tips on these topics please see the large
+section about rounding in L<Math::BigInt>.
+
+Since things like C<sqrt(2)> or C<1 / 3> must presented with a limited
+accuracy lest a operation consumes all resources, each operation produces
+no more than the requested number of digits.
+
+If there is no gloabl precision or accuracy set, B<and> the operation in
+question was not called with a requested precision or accuracy, B<and> the
+input $x has no accuracy or precision set, then a fallback parameter will
+be used. For historical reasons, it is called C<div_scale> and can be accessed
+via:
+
+	$d = Math::BigFloat->div_scale();		# query
+	Math::BigFloat->div_scale($n);			# set to $n digits
+
+The default value for C<div_scale> is 40.
+
+In case the result of one operation has more digits than specified,
+it is rounded. The rounding mode taken is either the default mode, or the one
+supplied to the operation after the I<scale>:
+
+	$x = Math::BigFloat->new(2);
+	Math::BigFloat->accuracy(5);		# 5 digits max
+	$y = $x->copy()->bdiv(3);		# will give 0.66667
+	$y = $x->copy()->bdiv(3,6);		# will give 0.666667
+	$y = $x->copy()->bdiv(3,6,undef,'odd');	# will give 0.666667
+	Math::BigFloat->round_mode('zero');
+	$y = $x->copy()->bdiv(3,6);		# will also give 0.666667
+
+Note that C<< Math::BigFloat->accuracy() >> and C<< Math::BigFloat->precision() >>
+set the global variables, and thus B<any> newly created number will be subject
+to the global rounding B<immidiately>. This means that in the examples above, the
+C<3> as argument to C<bdiv()> will also get an accuracy of B<5>.
+
+It is less confusing to either calculate the result fully, and afterwards
+round it explicitely, or use the additional parameters to the math
+functions like so:
+
+	use Math::BigFloat;	
+	$x = Math::BigFloat->new(2);
+	$y = $x->copy()->bdiv(3);
+	print $y->bround(5),"\n";		# will give 0.66667
+
+	or
+
+	use Math::BigFloat;	
+	$x = Math::BigFloat->new(2);
+	$y = $x->copy()->bdiv(3,5);		# will give 0.66667
+	print "$y\n";
+
+=head2 Rounding
+
+=over 2
+
+=item ffround ( +$scale )
+
+Rounds to the $scale'th place left from the '.', counting from the dot.
+The first digit is numbered 1. 
+
+=item ffround ( -$scale )
+
+Rounds to the $scale'th place right from the '.', counting from the dot.
+
+=item ffround ( 0 )
+
+Rounds to an integer.
+
+=item fround  ( +$scale )
+
+Preserves accuracy to $scale digits from the left (aka significant digits)
+and pads the rest with zeros. If the number is between 1 and -1, the
+significant digits count from the first non-zero after the '.'
+
+=item fround  ( -$scale ) and fround ( 0 )
+
+These are effectively no-ops.
+
+=back
+
+All rounding functions take as a second parameter a rounding mode from one of
+the following: 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'.
+
+The default rounding mode is 'even'. By using
+C<< Math::BigFloat->round_mode($round_mode); >> you can get and set the default
+mode for subsequent rounding. The usage of C<$Math::BigFloat::$round_mode> is
+no longer supported.
+The second parameter to the round functions then overrides the default
+temporarily. 
+
+The C<as_number()> function returns a BigInt from a Math::BigFloat. It uses
+'trunc' as rounding mode to make it equivalent to:
+
+	$x = 2.5;
+	$y = int($x) + 2;
+
+You can override this by passing the desired rounding mode as parameter to
+C<as_number()>:
+
+	$x = Math::BigFloat->new(2.5);
+	$y = $x->as_number('odd');	# $y = 3
+
+=head1 METHODS
+
+=head2 accuracy
+
+        $x->accuracy(5);                # local for $x
+        CLASS->accuracy(5);             # global for all members of CLASS
+                                        # Note: This also applies to new()!
+
+        $A = $x->accuracy();            # read out accuracy that affects $x
+        $A = CLASS->accuracy();         # read out global accuracy
+
+Set or get the global or local accuracy, aka how many significant digits the
+results have. If you set a global accuracy, then this also applies to new()!
+
+Warning! The accuracy I<sticks>, e.g. once you created a number under the
+influence of C<< CLASS->accuracy($A) >>, all results from math operations with
+that number will also be rounded.
+
+In most cases, you should probably round the results explicitely using one of
+L<round()>, L<bround()> or L<bfround()> or by passing the desired accuracy
+to the math operation as additional parameter:
+
+        my $x = Math::BigInt->new(30000);
+        my $y = Math::BigInt->new(7);
+        print scalar $x->copy()->bdiv($y, 2);           # print 4300
+        print scalar $x->copy()->bdiv($y)->bround(2);   # print 4300
+
+=head2 precision()
+
+        $x->precision(-2);      # local for $x, round at the second digit right of the dot
+        $x->precision(2);       # ditto, round at the second digit left of the dot
+
+        CLASS->precision(5);    # Global for all members of CLASS
+                                # This also applies to new()!
+        CLASS->precision(-5);   # ditto
+
+        $P = CLASS->precision();        # read out global precision
+        $P = $x->precision();           # read out precision that affects $x
+
+Note: You probably want to use L<accuracy()> instead. With L<accuracy> you
+set the number of digits each result should have, with L<precision> you
+set the place where to round!
+
+=head1 Autocreating constants
+
+After C<use Math::BigFloat ':constant'> all the floating point constants
+in the given scope are converted to C<Math::BigFloat>. This conversion
+happens at compile time.
+
+In particular
+
+  perl -MMath::BigFloat=:constant -e 'print 2E-100,"\n"'
+
+prints the value of C<2E-100>. Note that without conversion of 
+constants the expression 2E-100 will be calculated as normal floating point 
+number.
+
+Please note that ':constant' does not affect integer constants, nor binary 
+nor hexadecimal constants. Use L<bignum> or L<Math::BigInt> to get this to
+work.
+
+=head2 Math library
+
+Math with the numbers is done (by default) by a module called
+Math::BigInt::Calc. This is equivalent to saying:
+
+	use Math::BigFloat lib => 'Calc';
+
+You can change this by using:
+
+	use Math::BigFloat lib => 'BitVect';
+
+The following would first try to find Math::BigInt::Foo, then
+Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
+
+	use Math::BigFloat lib => 'Foo,Math::BigInt::Bar';
+
+Calc.pm uses as internal format an array of elements of some decimal base
+(usually 1e7, but this might be differen for some systems) with the least
+significant digit first, while BitVect.pm uses a bit vector of base 2, most
+significant bit first. Other modules might use even different means of
+representing the numbers. See the respective module documentation for further
+details.
+
+Please note that Math::BigFloat does B<not> use the denoted library itself,
+but it merely passes the lib argument to Math::BigInt. So, instead of the need
+to do:
+
+	use Math::BigInt lib => 'GMP';
+	use Math::BigFloat;
+
+you can roll it all into one line:
+
+	use Math::BigFloat lib => 'GMP';
+
+It is also possible to just require Math::BigFloat:
+
+	require Math::BigFloat;
+
+This will load the neccessary things (like BigInt) when they are needed, and
+automatically.
+
+Use the lib, Luke! And see L<Using Math::BigInt::Lite> for more details than
+you ever wanted to know about loading a different library.
+
+=head2 Using Math::BigInt::Lite
+
+It is possible to use L<Math::BigInt::Lite> with Math::BigFloat:
+
+        # 1
+        use Math::BigFloat with => 'Math::BigInt::Lite';
+
+There is no need to "use Math::BigInt" or "use Math::BigInt::Lite", but you
+can combine these if you want. For instance, you may want to use
+Math::BigInt objects in your main script, too.
+
+        # 2
+        use Math::BigInt;
+        use Math::BigFloat with => 'Math::BigInt::Lite';
+
+Of course, you can combine this with the C<lib> parameter.
+
+        # 3
+        use Math::BigFloat with => 'Math::BigInt::Lite', lib => 'GMP,Pari';
+
+There is no need for a "use Math::BigInt;" statement, even if you want to
+use Math::BigInt's, since Math::BigFloat will needs Math::BigInt and thus
+always loads it. But if you add it, add it B<before>:
+
+        # 4
+        use Math::BigInt;
+        use Math::BigFloat with => 'Math::BigInt::Lite', lib => 'GMP,Pari';
+
+Notice that the module with the last C<lib> will "win" and thus
+it's lib will be used if the lib is available:
+
+        # 5
+        use Math::BigInt lib => 'Bar,Baz';
+        use Math::BigFloat with => 'Math::BigInt::Lite', lib => 'Foo';
+
+That would try to load Foo, Bar, Baz and Calc (in that order). Or in other
+words, Math::BigFloat will try to retain previously loaded libs when you
+don't specify it onem but if you specify one, it will try to load them.
+
+Actually, the lib loading order would be "Bar,Baz,Calc", and then
+"Foo,Bar,Baz,Calc", but independend of which lib exists, the result is the
+same as trying the latter load alone, except for the fact that one of Bar or
+Baz might be loaded needlessly in an intermidiate step (and thus hang around
+and waste memory). If neither Bar nor Baz exist (or don't work/compile), they
+will still be tried to be loaded, but this is not as time/memory consuming as
+actually loading one of them. Still, this type of usage is not recommended due
+to these issues.
+
+The old way (loading the lib only in BigInt) still works though:
+
+        # 6
+        use Math::BigInt lib => 'Bar,Baz';
+        use Math::BigFloat;
+
+You can even load Math::BigInt afterwards:
+
+        # 7
+        use Math::BigFloat;
+        use Math::BigInt lib => 'Bar,Baz';
+
+But this has the same problems like #5, it will first load Calc
+(Math::BigFloat needs Math::BigInt and thus loads it) and then later Bar or
+Baz, depending on which of them works and is usable/loadable. Since this
+loads Calc unnecc., it is not recommended.
+
+Since it also possible to just require Math::BigFloat, this poses the question
+about what libary this will use:
+
+	require Math::BigFloat;
+	my $x = Math::BigFloat->new(123); $x += 123;
+
+It will use Calc. Please note that the call to import() is still done, but
+only when you use for the first time some Math::BigFloat math (it is triggered
+via any constructor, so the first time you create a Math::BigFloat, the load
+will happen in the background). This means:
+
+	require Math::BigFloat;
+	Math::BigFloat->import ( lib => 'Foo,Bar' );
+
+would be the same as:
+
+	use Math::BigFloat lib => 'Foo, Bar';
+
+But don't try to be clever to insert some operations in between:
+
+	require Math::BigFloat;
+	my $x = Math::BigFloat->bone() + 4;		# load BigInt and Calc
+	Math::BigFloat->import( lib => 'Pari' );	# load Pari, too
+	$x = Math::BigFloat->bone()+4;			# now use Pari
+
+While this works, it loads Calc needlessly. But maybe you just wanted that?
+
+B<Examples #3 is highly recommended> for daily usage.
+
+=head1 BUGS
+
+Please see the file BUGS in the CPAN distribution Math::BigInt for known bugs.
+
+=head1 CAVEATS
+
+=over 1
+
+=item stringify, bstr()
+
+Both stringify and bstr() now drop the leading '+'. The old code would return
+'+1.23', the new returns '1.23'. See the documentation in L<Math::BigInt> for
+reasoning and details.
+
+=item bdiv
+
+The following will probably not do what you expect:
+
+	print $c->bdiv(123.456),"\n";
+
+It prints both quotient and reminder since print works in list context. Also,
+bdiv() will modify $c, so be carefull. You probably want to use
+	
+	print $c / 123.456,"\n";
+	print scalar $c->bdiv(123.456),"\n";  # or if you want to modify $c
+
+instead.
+
+=item Modifying and =
+
+Beware of:
+
+	$x = Math::BigFloat->new(5);
+	$y = $x;
+
+It will not do what you think, e.g. making a copy of $x. Instead it just makes
+a second reference to the B<same> object and stores it in $y. Thus anything
+that modifies $x will modify $y (except overloaded math operators), and vice
+versa. See L<Math::BigInt> for details and how to avoid that.
+
+=item bpow
+
+C<bpow()> now modifies the first argument, unlike the old code which left
+it alone and only returned the result. This is to be consistent with
+C<badd()> etc. The first will modify $x, the second one won't:
+
+	print bpow($x,$i),"\n"; 	# modify $x
+	print $x->bpow($i),"\n"; 	# ditto
+	print $x ** $i,"\n";		# leave $x alone 
+
+=item precision() vs. accuracy()
+
+A common pitfall is to use L<precision()> when you want to round a result to
+a certain number of digits:
+
+	use Math::BigFloat;
+
+	Math::BigFloat->precision(4);		# does not do what you think it does
+	my $x = Math::BigFloat->new(12345);	# rounds $x to "12000"!
+	print "$x\n";				# print "12000"
+	my $y = Math::BigFloat->new(3);		# rounds $y to "0"!
+	print "$y\n";				# print "0"
+	$z = $x / $y;				# 12000 / 0 => NaN!
+	print "$z\n";
+	print $z->precision(),"\n";		# 4
+
+Replacing L<precision> with L<accuracy> is probably not what you want, either:
+
+	use Math::BigFloat;
+
+	Math::BigFloat->accuracy(4);		# enables global rounding:
+	my $x = Math::BigFloat->new(123456);	# rounded immidiately to "12350"
+	print "$x\n";				# print "123500"
+	my $y = Math::BigFloat->new(3);		# rounded to "3
+	print "$y\n";				# print "3"
+	print $z = $x->copy()->bdiv($y),"\n";	# 41170
+	print $z->accuracy(),"\n";		# 4
+
+What you want to use instead is:
+
+	use Math::BigFloat;
+
+	my $x = Math::BigFloat->new(123456);	# no rounding
+	print "$x\n";				# print "123456"
+	my $y = Math::BigFloat->new(3);		# no rounding
+	print "$y\n";				# print "3"
+	print $z = $x->copy()->bdiv($y,4),"\n";	# 41150
+	print $z->accuracy(),"\n";		# undef
+
+In addition to computing what you expected, the last example also does B<not>
+"taint" the result with an accuracy or precision setting, which would
+influence any further operation.
+
+=back
+
+=head1 SEE ALSO
+
+L<Math::BigInt>, L<Math::BigRat> and L<Math::Big> as well as
+L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and  L<Math::BigInt::GMP>.
+
+The pragmas L<bignum>, L<bigint> and L<bigrat> might also be of interest
+because they solve the autoupgrading/downgrading issue, at least partly.
+
+The package at
+L<http://search.cpan.org/search?mode=module&query=Math%3A%3ABigInt> contains
+more documentation including a full version history, testcases, empty
+subclass files and benchmarks.
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 AUTHORS
+
+Mark Biggar, overloaded interface by Ilya Zakharevich.
+Completely rewritten by Tels L<http://bloodgate.com> in 2001 - 2004, and still
+at it in 2005.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Math/BigFloat/Trace.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Math/BigFloat/Trace.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Math/BigFloat/Trace.pm	(revision 14489)
@@ -0,0 +1,58 @@
+#!/usr/bin/perl -w
+
+package Math::BigFloat::Trace;
+
+require 5.005_02;
+use strict;
+
+use Exporter;
+use Math::BigFloat;
+use vars qw($VERSION @ISA $PACKAGE @EXPORT_OK
+            $accuracy $precision $round_mode $div_scale);
+
+@ISA = qw(Exporter Math::BigFloat);
+
+$VERSION = 0.01;
+
+use overload;	# inherit overload from BigFloat
+
+# Globals
+$accuracy = $precision = undef;
+$round_mode = 'even';
+$div_scale = 40;
+
+sub new
+{
+        my $proto  = shift;
+        my $class  = ref($proto) || $proto;
+
+        my $value       = shift;
+	my $a = $accuracy; $a = $_[0] if defined $_[0];
+	my $p = $precision; $p = $_[1] if defined $_[1];
+        my $self = Math::BigFloat->new($value,$a,$p,$round_mode);
+
+#	remember, downgrading may return a BigInt, so don't meddle with class	
+#	bless $self,$class;
+
+	print "MBF new '$value' => '$self' (",ref($self),")";
+        return $self;
+}
+
+sub import
+  {
+  print "MBF import ",join(' ',@_);
+  my $self = shift;
+
+  # we catch the constants, the rest goes go BigFloat
+  my @a = ();
+  foreach (@_)
+    {
+    push @a, $_ if $_ ne ':constant';
+    }
+  overload::constant float => sub { $self->new(shift); }; 
+
+  Math::BigFloat->import(@a);		# need it for subclasses
+#  $self->export_to_level(1,$self,@_);		# need this ?
+  }
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt.pm	(revision 14489)
@@ -0,0 +1,4450 @@
+package Math::BigInt;
+
+#
+# "Mike had an infinite amount to do and a negative amount of time in which
+# to do it." - Before and After
+#
+
+# The following hash values are used:
+#   value: unsigned int with actual value (as a Math::BigInt::Calc or similiar)
+#   sign : +,-,NaN,+inf,-inf
+#   _a   : accuracy
+#   _p   : precision
+#   _f   : flags, used by MBF to flag parts of a float as untouchable
+
+# Remember not to take shortcuts ala $xs = $x->{value}; $CALC->foo($xs); since
+# underlying lib might change the reference!
+
+my $class = "Math::BigInt";
+require 5.005;
+
+$VERSION = '1.77';
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(objectify bgcd blcm); 
+
+# _trap_inf and _trap_nan are internal and should never be accessed from the
+# outside
+use vars qw/$round_mode $accuracy $precision $div_scale $rnd_mode 
+	    $upgrade $downgrade $_trap_nan $_trap_inf/;
+use strict;
+
+# Inside overload, the first arg is always an object. If the original code had
+# it reversed (like $x = 2 * $y), then the third paramater is true.
+# In some cases (like add, $x = $x + 2 is the same as $x = 2 + $x) this makes
+# no difference, but in some cases it does.
+
+# For overloaded ops with only one argument we simple use $_[0]->copy() to
+# preserve the argument.
+
+# Thus inheritance of overload operators becomes possible and transparent for
+# our subclasses without the need to repeat the entire overload section there.
+
+use overload
+'='     =>      sub { $_[0]->copy(); },
+
+# some shortcuts for speed (assumes that reversed order of arguments is routed
+# to normal '+' and we thus can always modify first arg. If this is changed,
+# this breaks and must be adjusted.)
+'+='	=>	sub { $_[0]->badd($_[1]); },
+'-='	=>	sub { $_[0]->bsub($_[1]); },
+'*='	=>	sub { $_[0]->bmul($_[1]); },
+'/='	=>	sub { scalar $_[0]->bdiv($_[1]); },
+'%='	=>	sub { $_[0]->bmod($_[1]); },
+'^='	=>	sub { $_[0]->bxor($_[1]); },
+'&='	=>	sub { $_[0]->band($_[1]); },
+'|='	=>	sub { $_[0]->bior($_[1]); },
+
+'**='	=>	sub { $_[0]->bpow($_[1]); },
+'<<='	=>	sub { $_[0]->blsft($_[1]); },
+'>>='	=>	sub { $_[0]->brsft($_[1]); },
+
+# not supported by Perl yet
+'..'	=>	\&_pointpoint,
+
+# we might need '==' and '!=' to get things like "NaN == NaN" right
+'<=>'	=>	sub { $_[2] ?
+                      ref($_[0])->bcmp($_[1],$_[0]) : 
+                      $_[0]->bcmp($_[1]); },
+'cmp'	=>	sub {
+         $_[2] ? 
+               "$_[1]" cmp $_[0]->bstr() :
+               $_[0]->bstr() cmp "$_[1]" },
+
+# make cos()/sin()/exp() "work" with BigInt's or subclasses
+'cos'	=>	sub { cos($_[0]->numify()) }, 
+'sin'	=>	sub { sin($_[0]->numify()) }, 
+'exp'	=>	sub { exp($_[0]->numify()) }, 
+'atan2'	=>	sub { $_[2] ?
+			atan2($_[1],$_[0]->numify()) :
+			atan2($_[0]->numify(),$_[1]) },
+
+# are not yet overloadable
+#'hex'	=>	sub { print "hex"; $_[0]; }, 
+#'oct'	=>	sub { print "oct"; $_[0]; }, 
+
+'log'	=>	sub { $_[0]->copy()->blog($_[1]); }, 
+'int'	=>	sub { $_[0]->copy(); }, 
+'neg'	=>	sub { $_[0]->copy()->bneg(); }, 
+'abs'	=>	sub { $_[0]->copy()->babs(); },
+'sqrt'  =>	sub { $_[0]->copy()->bsqrt(); },
+'~'	=>	sub { $_[0]->copy()->bnot(); },
+
+# for subtract it's a bit tricky to not modify b: b-a => -a+b
+'-'	=>	sub { my $c = $_[0]->copy; $_[2] ?
+			$c->bneg()->badd( $_[1]) :
+			$c->bsub( $_[1]) },
+'+'	=>	sub { $_[0]->copy()->badd($_[1]); },
+'*'	=>	sub { $_[0]->copy()->bmul($_[1]); },
+
+'/'	=>	sub { 
+   $_[2] ? ref($_[0])->new($_[1])->bdiv($_[0]) : $_[0]->copy->bdiv($_[1]);
+  }, 
+'%'	=>	sub { 
+   $_[2] ? ref($_[0])->new($_[1])->bmod($_[0]) : $_[0]->copy->bmod($_[1]);
+  }, 
+'**'	=>	sub { 
+   $_[2] ? ref($_[0])->new($_[1])->bpow($_[0]) : $_[0]->copy->bpow($_[1]);
+  }, 
+'<<'	=>	sub { 
+   $_[2] ? ref($_[0])->new($_[1])->blsft($_[0]) : $_[0]->copy->blsft($_[1]);
+  }, 
+'>>'	=>	sub { 
+   $_[2] ? ref($_[0])->new($_[1])->brsft($_[0]) : $_[0]->copy->brsft($_[1]);
+  }, 
+'&'	=>	sub { 
+   $_[2] ? ref($_[0])->new($_[1])->band($_[0]) : $_[0]->copy->band($_[1]);
+  }, 
+'|'	=>	sub { 
+   $_[2] ? ref($_[0])->new($_[1])->bior($_[0]) : $_[0]->copy->bior($_[1]);
+  }, 
+'^'	=>	sub { 
+   $_[2] ? ref($_[0])->new($_[1])->bxor($_[0]) : $_[0]->copy->bxor($_[1]);
+  }, 
+
+# can modify arg of ++ and --, so avoid a copy() for speed, but don't
+# use $_[0]->bone(), it would modify $_[0] to be 1!
+'++'	=>	sub { $_[0]->binc() },
+'--'	=>	sub { $_[0]->bdec() },
+
+# if overloaded, O(1) instead of O(N) and twice as fast for small numbers
+'bool'  =>	sub {
+  # this kludge is needed for perl prior 5.6.0 since returning 0 here fails :-/
+  # v5.6.1 dumps on this: return !$_[0]->is_zero() || undef;		    :-(
+  my $t = undef;
+  $t = 1 if !$_[0]->is_zero();
+  $t;
+  },
+
+# the original qw() does not work with the TIESCALAR below, why?
+# Order of arguments unsignificant
+'""' => sub { $_[0]->bstr(); },
+'0+' => sub { $_[0]->numify(); }
+;
+
+##############################################################################
+# global constants, flags and accessory
+
+# These vars are public, but their direct usage is not recommended, use the
+# accessor methods instead
+
+$round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
+$accuracy   = undef;
+$precision  = undef;
+$div_scale  = 40;
+
+$upgrade = undef;			# default is no upgrade
+$downgrade = undef;			# default is no downgrade
+
+# These are internally, and not to be used from the outside at all
+
+$_trap_nan = 0;				# are NaNs ok? set w/ config()
+$_trap_inf = 0;				# are infs ok? set w/ config()
+my $nan = 'NaN'; 			# constants for easier life
+
+my $CALC = 'Math::BigInt::FastCalc';	# module to do the low level math
+					# default is FastCalc.pm
+my $IMPORT = 0;				# was import() called yet?
+					# used to make require work
+my %WARN;				# warn only once for low-level libs
+my %CAN;				# cache for $CALC->can(...)
+my %CALLBACKS;				# callbacks to notify on lib loads
+my $EMU_LIB = 'Math/BigInt/CalcEmu.pm';	# emulate low-level math
+
+##############################################################################
+# the old code had $rnd_mode, so we need to support it, too
+
+$rnd_mode   = 'even';
+sub TIESCALAR  { my ($class) = @_; bless \$round_mode, $class; }
+sub FETCH      { return $round_mode; }
+sub STORE      { $rnd_mode = $_[0]->round_mode($_[1]); }
+
+BEGIN
+  { 
+  # tie to enable $rnd_mode to work transparently
+  tie $rnd_mode, 'Math::BigInt'; 
+
+  # set up some handy alias names
+  *as_int = \&as_number;
+  *is_pos = \&is_positive;
+  *is_neg = \&is_negative;
+  }
+
+############################################################################## 
+
+sub round_mode
+  {
+  no strict 'refs';
+  # make Class->round_mode() work
+  my $self = shift;
+  my $class = ref($self) || $self || __PACKAGE__;
+  if (defined $_[0])
+    {
+    my $m = shift;
+    if ($m !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/)
+      {
+      require Carp; Carp::croak ("Unknown round mode '$m'");
+      }
+    return ${"${class}::round_mode"} = $m;
+    }
+  ${"${class}::round_mode"};
+  }
+
+sub upgrade
+  {
+  no strict 'refs';
+  # make Class->upgrade() work
+  my $self = shift;
+  my $class = ref($self) || $self || __PACKAGE__;
+  # need to set new value?
+  if (@_ > 0)
+    {
+    return ${"${class}::upgrade"} = $_[0];
+    }
+  ${"${class}::upgrade"};
+  }
+
+sub downgrade
+  {
+  no strict 'refs';
+  # make Class->downgrade() work
+  my $self = shift;
+  my $class = ref($self) || $self || __PACKAGE__;
+  # need to set new value?
+  if (@_ > 0)
+    {
+    return ${"${class}::downgrade"} = $_[0];
+    }
+  ${"${class}::downgrade"};
+  }
+
+sub div_scale
+  {
+  no strict 'refs';
+  # make Class->div_scale() work
+  my $self = shift;
+  my $class = ref($self) || $self || __PACKAGE__;
+  if (defined $_[0])
+    {
+    if ($_[0] < 0)
+      {
+      require Carp; Carp::croak ('div_scale must be greater than zero');
+      }
+    ${"${class}::div_scale"} = $_[0];
+    }
+  ${"${class}::div_scale"};
+  }
+
+sub accuracy
+  {
+  # $x->accuracy($a);		ref($x)	$a
+  # $x->accuracy();		ref($x)
+  # Class->accuracy();		class
+  # Class->accuracy($a);	class $a
+
+  my $x = shift;
+  my $class = ref($x) || $x || __PACKAGE__;
+
+  no strict 'refs';
+  # need to set new value?
+  if (@_ > 0)
+    {
+    my $a = shift;
+    # convert objects to scalars to avoid deep recursion. If object doesn't
+    # have numify(), then hopefully it will have overloading for int() and
+    # boolean test without wandering into a deep recursion path...
+    $a = $a->numify() if ref($a) && $a->can('numify');
+
+    if (defined $a)
+      {
+      # also croak on non-numerical
+      if (!$a || $a <= 0)
+        {
+        require Carp;
+        Carp::croak ('Argument to accuracy must be greater than zero');
+        }
+      if (int($a) != $a)
+        {
+        require Carp; Carp::croak ('Argument to accuracy must be an integer');
+        }
+      }
+    if (ref($x))
+      {
+      # $object->accuracy() or fallback to global
+      $x->bround($a) if $a;		# not for undef, 0
+      $x->{_a} = $a;			# set/overwrite, even if not rounded
+      delete $x->{_p};			# clear P
+      $a = ${"${class}::accuracy"} unless defined $a;   # proper return value
+      }
+    else
+      {
+      ${"${class}::accuracy"} = $a;	# set global A
+      ${"${class}::precision"} = undef;	# clear global P
+      }
+    return $a;				# shortcut
+    }
+
+  my $a;
+  # $object->accuracy() or fallback to global
+  $a = $x->{_a} if ref($x);
+  # but don't return global undef, when $x's accuracy is 0!
+  $a = ${"${class}::accuracy"} if !defined $a;
+  $a;
+  }
+
+sub precision
+  {
+  # $x->precision($p);		ref($x)	$p
+  # $x->precision();		ref($x)
+  # Class->precision();		class
+  # Class->precision($p);	class $p
+
+  my $x = shift;
+  my $class = ref($x) || $x || __PACKAGE__;
+
+  no strict 'refs';
+  if (@_ > 0)
+    {
+    my $p = shift;
+    # convert objects to scalars to avoid deep recursion. If object doesn't
+    # have numify(), then hopefully it will have overloading for int() and
+    # boolean test without wandering into a deep recursion path...
+    $p = $p->numify() if ref($p) && $p->can('numify');
+    if ((defined $p) && (int($p) != $p))
+      {
+      require Carp; Carp::croak ('Argument to precision must be an integer');
+      }
+    if (ref($x))
+      {
+      # $object->precision() or fallback to global
+      $x->bfround($p) if $p;		# not for undef, 0
+      $x->{_p} = $p;			# set/overwrite, even if not rounded
+      delete $x->{_a};			# clear A
+      $p = ${"${class}::precision"} unless defined $p;  # proper return value
+      }
+    else
+      {
+      ${"${class}::precision"} = $p;	# set global P
+      ${"${class}::accuracy"} = undef;	# clear global A
+      }
+    return $p;				# shortcut
+    }
+
+  my $p;
+  # $object->precision() or fallback to global
+  $p = $x->{_p} if ref($x);
+  # but don't return global undef, when $x's precision is 0!
+  $p = ${"${class}::precision"} if !defined $p;
+  $p;
+  }
+
+sub config
+  {
+  # return (or set) configuration data as hash ref
+  my $class = shift || 'Math::BigInt';
+
+  no strict 'refs';
+  if (@_ > 0)
+    {
+    # try to set given options as arguments from hash
+
+    my $args = $_[0];
+    if (ref($args) ne 'HASH')
+      {
+      $args = { @_ };
+      }
+    # these values can be "set"
+    my $set_args = {};
+    foreach my $key (
+     qw/trap_inf trap_nan
+        upgrade downgrade precision accuracy round_mode div_scale/
+     )
+      {
+      $set_args->{$key} = $args->{$key} if exists $args->{$key};
+      delete $args->{$key};
+      }
+    if (keys %$args > 0)
+      {
+      require Carp;
+      Carp::croak ("Illegal key(s) '",
+       join("','",keys %$args),"' passed to $class\->config()");
+      }
+    foreach my $key (keys %$set_args)
+      {
+      if ($key =~ /^trap_(inf|nan)\z/)
+        {
+        ${"${class}::_trap_$1"} = ($set_args->{"trap_$1"} ? 1 : 0);
+        next;
+        }
+      # use a call instead of just setting the $variable to check argument
+      $class->$key($set_args->{$key});
+      }
+    }
+
+  # now return actual configuration
+
+  my $cfg = {
+    lib => $CALC,
+    lib_version => ${"${CALC}::VERSION"},
+    class => $class,
+    trap_nan => ${"${class}::_trap_nan"},
+    trap_inf => ${"${class}::_trap_inf"},
+    version => ${"${class}::VERSION"},
+    };
+  foreach my $key (qw/
+     upgrade downgrade precision accuracy round_mode div_scale
+     /)
+    {
+    $cfg->{$key} = ${"${class}::$key"};
+    };
+  $cfg;
+  }
+
+sub _scale_a
+  { 
+  # select accuracy parameter based on precedence,
+  # used by bround() and bfround(), may return undef for scale (means no op)
+  my ($x,$scale,$mode) = @_;
+
+  $scale = $x->{_a} unless defined $scale;
+
+  no strict 'refs';
+  my $class = ref($x);
+
+  $scale = ${ $class . '::accuracy' } unless defined $scale;
+  $mode = ${ $class . '::round_mode' } unless defined $mode;
+
+  ($scale,$mode);
+  }
+
+sub _scale_p
+  { 
+  # select precision parameter based on precedence,
+  # used by bround() and bfround(), may return undef for scale (means no op)
+  my ($x,$scale,$mode) = @_;
+  
+  $scale = $x->{_p} unless defined $scale;
+
+  no strict 'refs';
+  my $class = ref($x);
+
+  $scale = ${ $class . '::precision' } unless defined $scale;
+  $mode = ${ $class . '::round_mode' } unless defined $mode;
+
+  ($scale,$mode);
+  }
+
+##############################################################################
+# constructors
+
+sub copy
+  {
+  my ($c,$x);
+  if (@_ > 1)
+    {
+    # if two arguments, the first one is the class to "swallow" subclasses
+    ($c,$x) = @_;
+    }
+  else
+    {
+    $x = shift;
+    $c = ref($x);
+    }
+  return unless ref($x); # only for objects
+
+  my $self = bless {}, $c;
+
+  $self->{sign} = $x->{sign};
+  $self->{value} = $CALC->_copy($x->{value});
+  $self->{_a} = $x->{_a} if defined $x->{_a};
+  $self->{_p} = $x->{_p} if defined $x->{_p};
+  $self;
+  }
+
+sub new 
+  {
+  # create a new BigInt object from a string or another BigInt object. 
+  # see hash keys documented at top
+
+  # the argument could be an object, so avoid ||, && etc on it, this would
+  # cause costly overloaded code to be called. The only allowed ops are
+  # ref() and defined.
+
+  my ($class,$wanted,$a,$p,$r) = @_;
+ 
+  # avoid numify-calls by not using || on $wanted!
+  return $class->bzero($a,$p) if !defined $wanted;	# default to 0
+  return $class->copy($wanted,$a,$p,$r)
+   if ref($wanted) && $wanted->isa($class);		# MBI or subclass
+
+  $class->import() if $IMPORT == 0;		# make require work
+  
+  my $self = bless {}, $class;
+
+  # shortcut for "normal" numbers
+  if ((!ref $wanted) && ($wanted =~ /^([+-]?)[1-9][0-9]*\z/))
+    {
+    $self->{sign} = $1 || '+';
+
+    if ($wanted =~ /^[+-]/)
+     {
+      # remove sign without touching wanted to make it work with constants
+      my $t = $wanted; $t =~ s/^[+-]//;
+      $self->{value} = $CALC->_new($t);
+      }
+    else
+      {
+      $self->{value} = $CALC->_new($wanted);
+      }
+    no strict 'refs';
+    if ( (defined $a) || (defined $p) 
+        || (defined ${"${class}::precision"})
+        || (defined ${"${class}::accuracy"}) 
+       )
+      {
+      $self->round($a,$p,$r) unless (@_ == 4 && !defined $a && !defined $p);
+      }
+    return $self;
+    }
+
+  # handle '+inf', '-inf' first
+  if ($wanted =~ /^[+-]?inf\z/)
+    {
+    $self->{sign} = $wanted;		# set a default sign for bstr()
+    return $self->binf($wanted);
+    }
+  # split str in m mantissa, e exponent, i integer, f fraction, v value, s sign
+  my ($mis,$miv,$mfv,$es,$ev) = _split($wanted);
+  if (!ref $mis)
+    {
+    if ($_trap_nan)
+      {
+      require Carp; Carp::croak("$wanted is not a number in $class");
+      }
+    $self->{value} = $CALC->_zero();
+    $self->{sign} = $nan;
+    return $self;
+    }
+  if (!ref $miv)
+    {
+    # _from_hex or _from_bin
+    $self->{value} = $mis->{value};
+    $self->{sign} = $mis->{sign};
+    return $self;	# throw away $mis
+    }
+  # make integer from mantissa by adjusting exp, then convert to bigint
+  $self->{sign} = $$mis;			# store sign
+  $self->{value} = $CALC->_zero();		# for all the NaN cases
+  my $e = int("$$es$$ev");			# exponent (avoid recursion)
+  if ($e > 0)
+    {
+    my $diff = $e - CORE::length($$mfv);
+    if ($diff < 0)				# Not integer
+      {
+      if ($_trap_nan)
+        {
+        require Carp; Carp::croak("$wanted not an integer in $class");
+        }
+      #print "NOI 1\n";
+      return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
+      $self->{sign} = $nan;
+      }
+    else					# diff >= 0
+      {
+      # adjust fraction and add it to value
+      #print "diff > 0 $$miv\n";
+      $$miv = $$miv . ($$mfv . '0' x $diff);
+      }
+    }
+  else
+    {
+    if ($$mfv ne '')				# e <= 0
+      {
+      # fraction and negative/zero E => NOI
+      if ($_trap_nan)
+        {
+        require Carp; Carp::croak("$wanted not an integer in $class");
+        }
+      #print "NOI 2 \$\$mfv '$$mfv'\n";
+      return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
+      $self->{sign} = $nan;
+      }
+    elsif ($e < 0)
+      {
+      # xE-y, and empty mfv
+      #print "xE-y\n";
+      $e = abs($e);
+      if ($$miv !~ s/0{$e}$//)		# can strip so many zero's?
+        {
+        if ($_trap_nan)
+          {
+          require Carp; Carp::croak("$wanted not an integer in $class");
+          }
+        #print "NOI 3\n";
+        return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
+        $self->{sign} = $nan;
+        }
+      }
+    }
+  $self->{sign} = '+' if $$miv eq '0';			# normalize -0 => +0
+  $self->{value} = $CALC->_new($$miv) if $self->{sign} =~ /^[+-]$/;
+  # if any of the globals is set, use them to round and store them inside $self
+  # do not round for new($x,undef,undef) since that is used by MBF to signal
+  # no rounding
+  $self->round($a,$p,$r) unless @_ == 4 && !defined $a && !defined $p;
+  $self;
+  }
+
+sub bnan
+  {
+  # create a bigint 'NaN', if given a BigInt, set it to 'NaN'
+  my $self = shift;
+  $self = $class if !defined $self;
+  if (!ref($self))
+    {
+    my $c = $self; $self = {}; bless $self, $c;
+    }
+  no strict 'refs';
+  if (${"${class}::_trap_nan"})
+    {
+    require Carp;
+    Carp::croak ("Tried to set $self to NaN in $class\::bnan()");
+    }
+  $self->import() if $IMPORT == 0;		# make require work
+  return if $self->modify('bnan');
+  if ($self->can('_bnan'))
+    {
+    # use subclass to initialize
+    $self->_bnan();
+    }
+  else
+    {
+    # otherwise do our own thing
+    $self->{value} = $CALC->_zero();
+    }
+  $self->{sign} = $nan;
+  delete $self->{_a}; delete $self->{_p};	# rounding NaN is silly
+  $self;
+  }
+
+sub binf
+  {
+  # create a bigint '+-inf', if given a BigInt, set it to '+-inf'
+  # the sign is either '+', or if given, used from there
+  my $self = shift;
+  my $sign = shift; $sign = '+' if !defined $sign || $sign !~ /^-(inf)?$/;
+  $self = $class if !defined $self;
+  if (!ref($self))
+    {
+    my $c = $self; $self = {}; bless $self, $c;
+    }
+  no strict 'refs';
+  if (${"${class}::_trap_inf"})
+    {
+    require Carp;
+    Carp::croak ("Tried to set $self to +-inf in $class\::binf()");
+    }
+  $self->import() if $IMPORT == 0;		# make require work
+  return if $self->modify('binf');
+  if ($self->can('_binf'))
+    {
+    # use subclass to initialize
+    $self->_binf();
+    }
+  else
+    {
+    # otherwise do our own thing
+    $self->{value} = $CALC->_zero();
+    }
+  $sign = $sign . 'inf' if $sign !~ /inf$/;	# - => -inf
+  $self->{sign} = $sign;
+  ($self->{_a},$self->{_p}) = @_;		# take over requested rounding
+  $self;
+  }
+
+sub bzero
+  {
+  # create a bigint '+0', if given a BigInt, set it to 0
+  my $self = shift;
+  $self = __PACKAGE__ if !defined $self;
+ 
+  if (!ref($self))
+    {
+    my $c = $self; $self = {}; bless $self, $c;
+    }
+  $self->import() if $IMPORT == 0;		# make require work
+  return if $self->modify('bzero');
+  
+  if ($self->can('_bzero'))
+    {
+    # use subclass to initialize
+    $self->_bzero();
+    }
+  else
+    {
+    # otherwise do our own thing
+    $self->{value} = $CALC->_zero();
+    }
+  $self->{sign} = '+';
+  if (@_ > 0)
+    {
+    if (@_ > 3)
+      {
+      # call like: $x->bzero($a,$p,$r,$y);
+      ($self,$self->{_a},$self->{_p}) = $self->_find_round_parameters(@_);
+      }
+    else
+      {
+      $self->{_a} = $_[0]
+       if ( (!defined $self->{_a}) || (defined $_[0] && $_[0] > $self->{_a}));
+      $self->{_p} = $_[1]
+       if ( (!defined $self->{_p}) || (defined $_[1] && $_[1] > $self->{_p}));
+      }
+    }
+  $self;
+  }
+
+sub bone
+  {
+  # create a bigint '+1' (or -1 if given sign '-'),
+  # if given a BigInt, set it to +1 or -1, respecively
+  my $self = shift;
+  my $sign = shift; $sign = '+' if !defined $sign || $sign ne '-';
+  $self = $class if !defined $self;
+
+  if (!ref($self))
+    {
+    my $c = $self; $self = {}; bless $self, $c;
+    }
+  $self->import() if $IMPORT == 0;		# make require work
+  return if $self->modify('bone');
+
+  if ($self->can('_bone'))
+    {
+    # use subclass to initialize
+    $self->_bone();
+    }
+  else
+    {
+    # otherwise do our own thing
+    $self->{value} = $CALC->_one();
+    }
+  $self->{sign} = $sign;
+  if (@_ > 0)
+    {
+    if (@_ > 3)
+      {
+      # call like: $x->bone($sign,$a,$p,$r,$y);
+      ($self,$self->{_a},$self->{_p}) = $self->_find_round_parameters(@_);
+      }
+    else
+      {
+      # call like: $x->bone($sign,$a,$p,$r);
+      $self->{_a} = $_[0]
+       if ( (!defined $self->{_a}) || (defined $_[0] && $_[0] > $self->{_a}));
+      $self->{_p} = $_[1]
+       if ( (!defined $self->{_p}) || (defined $_[1] && $_[1] > $self->{_p}));
+      }
+    }
+  $self;
+  }
+
+##############################################################################
+# string conversation
+
+sub bsstr
+  {
+  # (ref to BFLOAT or num_str ) return num_str
+  # Convert number from internal format to scientific string format.
+  # internal format is always normalized (no leading zeros, "-0E0" => "+0E0")
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_); 
+
+  if ($x->{sign} !~ /^[+-]$/)
+    {
+    return $x->{sign} unless $x->{sign} eq '+inf';	# -inf, NaN
+    return 'inf';					# +inf
+    }
+  my ($m,$e) = $x->parts();
+  #$m->bstr() . 'e+' . $e->bstr(); 	# e can only be positive in BigInt
+  # 'e+' because E can only be positive in BigInt
+  $m->bstr() . 'e+' . $CALC->_str($e->{value}); 
+  }
+
+sub bstr 
+  {
+  # make a string from bigint object
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_); 
+
+  if ($x->{sign} !~ /^[+-]$/)
+    {
+    return $x->{sign} unless $x->{sign} eq '+inf';	# -inf, NaN
+    return 'inf';					# +inf
+    }
+  my $es = ''; $es = $x->{sign} if $x->{sign} eq '-';
+  $es.$CALC->_str($x->{value});
+  }
+
+sub numify 
+  {
+  # Make a "normal" scalar from a BigInt object
+  my $x = shift; $x = $class->new($x) unless ref $x;
+
+  return $x->bstr() if $x->{sign} !~ /^[+-]$/;
+  my $num = $CALC->_num($x->{value});
+  return -$num if $x->{sign} eq '-';
+  $num;
+  }
+
+##############################################################################
+# public stuff (usually prefixed with "b")
+
+sub sign
+  {
+  # return the sign of the number: +/-/-inf/+inf/NaN
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_); 
+  
+  $x->{sign};
+  }
+
+sub _find_round_parameters
+  {
+  # After any operation or when calling round(), the result is rounded by
+  # regarding the A & P from arguments, local parameters, or globals.
+
+  # !!!!!!! If you change this, remember to change round(), too! !!!!!!!!!!
+
+  # This procedure finds the round parameters, but it is for speed reasons
+  # duplicated in round. Otherwise, it is tested by the testsuite and used
+  # by fdiv().
+ 
+  # returns ($self) or ($self,$a,$p,$r) - sets $self to NaN of both A and P
+  # were requested/defined (locally or globally or both)
+  
+  my ($self,$a,$p,$r,@args) = @_;
+  # $a accuracy, if given by caller
+  # $p precision, if given by caller
+  # $r round_mode, if given by caller
+  # @args all 'other' arguments (0 for unary, 1 for binary ops)
+
+  my $c = ref($self);				# find out class of argument(s)
+  no strict 'refs';
+
+  # now pick $a or $p, but only if we have got "arguments"
+  if (!defined $a)
+    {
+    foreach ($self,@args)
+      {
+      # take the defined one, or if both defined, the one that is smaller
+      $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
+      }
+    }
+  if (!defined $p)
+    {
+    # even if $a is defined, take $p, to signal error for both defined
+    foreach ($self,@args)
+      {
+      # take the defined one, or if both defined, the one that is bigger
+      # -2 > -3, and 3 > 2
+      $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
+      }
+    }
+  # if still none defined, use globals (#2)
+  $a = ${"$c\::accuracy"} unless defined $a;
+  $p = ${"$c\::precision"} unless defined $p;
+
+  # A == 0 is useless, so undef it to signal no rounding
+  $a = undef if defined $a && $a == 0;
+ 
+  # no rounding today? 
+  return ($self) unless defined $a || defined $p;		# early out
+
+  # set A and set P is an fatal error
+  return ($self->bnan()) if defined $a && defined $p;		# error
+
+  $r = ${"$c\::round_mode"} unless defined $r;
+  if ($r !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/)
+    {
+    require Carp; Carp::croak ("Unknown round mode '$r'");
+    }
+
+  ($self,$a,$p,$r);
+  }
+
+sub round
+  {
+  # Round $self according to given parameters, or given second argument's
+  # parameters or global defaults 
+
+  # for speed reasons, _find_round_parameters is embeded here:
+
+  my ($self,$a,$p,$r,@args) = @_;
+  # $a accuracy, if given by caller
+  # $p precision, if given by caller
+  # $r round_mode, if given by caller
+  # @args all 'other' arguments (0 for unary, 1 for binary ops)
+
+  my $c = ref($self);				# find out class of argument(s)
+  no strict 'refs';
+
+  # now pick $a or $p, but only if we have got "arguments"
+  if (!defined $a)
+    {
+    foreach ($self,@args)
+      {
+      # take the defined one, or if both defined, the one that is smaller
+      $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
+      }
+    }
+  if (!defined $p)
+    {
+    # even if $a is defined, take $p, to signal error for both defined
+    foreach ($self,@args)
+      {
+      # take the defined one, or if both defined, the one that is bigger
+      # -2 > -3, and 3 > 2
+      $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
+      }
+    }
+  # if still none defined, use globals (#2)
+  $a = ${"$c\::accuracy"} unless defined $a;
+  $p = ${"$c\::precision"} unless defined $p;
+ 
+  # A == 0 is useless, so undef it to signal no rounding
+  $a = undef if defined $a && $a == 0;
+  
+  # no rounding today? 
+  return $self unless defined $a || defined $p;		# early out
+
+  # set A and set P is an fatal error
+  return $self->bnan() if defined $a && defined $p;
+
+  $r = ${"$c\::round_mode"} unless defined $r;
+  if ($r !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/)
+    {
+    require Carp; Carp::croak ("Unknown round mode '$r'");
+    }
+
+  # now round, by calling either fround or ffround:
+  if (defined $a)
+    {
+    $self->bround($a,$r) if !defined $self->{_a} || $self->{_a} >= $a;
+    }
+  else # both can't be undefined due to early out
+    {
+    $self->bfround($p,$r) if !defined $self->{_p} || $self->{_p} <= $p;
+    }
+  # bround() or bfround() already callled bnorm() if necc.
+  $self;
+  }
+
+sub bnorm
+  { 
+  # (numstr or BINT) return BINT
+  # Normalize number -- no-op here
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+  $x;
+  }
+
+sub babs 
+  {
+  # (BINT or num_str) return BINT
+  # make number absolute, or return absolute BINT from string
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return $x if $x->modify('babs');
+  # post-normalized abs for internal use (does nothing for NaN)
+  $x->{sign} =~ s/^-/+/;
+  $x;
+  }
+
+sub bneg 
+  { 
+  # (BINT or num_str) return BINT
+  # negate number or make a negated number from string
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+  
+  return $x if $x->modify('bneg');
+
+  # for +0 dont negate (to have always normalized +0). Does nothing for 'NaN'
+  $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $CALC->_is_zero($x->{value}));
+  $x;
+  }
+
+sub bcmp 
+  {
+  # Compares 2 values.  Returns one of undef, <0, =0, >0. (suitable for sort)
+  # (BINT or num_str, BINT or num_str) return cond_code
+  
+  # set up parameters
+  my ($self,$x,$y) = (ref($_[0]),@_);
+
+  # objectify is costly, so avoid it 
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y) = objectify(2,@_);
+    }
+
+  return $upgrade->bcmp($x,$y) if defined $upgrade &&
+    ((!$x->isa($self)) || (!$y->isa($self)));
+
+  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
+    {
+    # handle +-inf and NaN
+    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+    return 0 if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/;
+    return +1 if $x->{sign} eq '+inf';
+    return -1 if $x->{sign} eq '-inf';
+    return -1 if $y->{sign} eq '+inf';
+    return +1;
+    }
+  # check sign for speed first
+  return 1 if $x->{sign} eq '+' && $y->{sign} eq '-';	# does also 0 <=> -y
+  return -1 if $x->{sign} eq '-' && $y->{sign} eq '+';  # does also -x <=> 0 
+
+  # have same sign, so compare absolute values. Don't make tests for zero here
+  # because it's actually slower than testin in Calc (especially w/ Pari et al)
+
+  # post-normalized compare for internal use (honors signs)
+  if ($x->{sign} eq '+') 
+    {
+    # $x and $y both > 0
+    return $CALC->_acmp($x->{value},$y->{value});
+    }
+
+  # $x && $y both < 0
+  $CALC->_acmp($y->{value},$x->{value});	# swaped acmp (lib returns 0,1,-1)
+  }
+
+sub bacmp 
+  {
+  # Compares 2 values, ignoring their signs. 
+  # Returns one of undef, <0, =0, >0. (suitable for sort)
+  # (BINT, BINT) return cond_code
+  
+  # set up parameters
+  my ($self,$x,$y) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it 
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y) = objectify(2,@_);
+    }
+
+  return $upgrade->bacmp($x,$y) if defined $upgrade &&
+    ((!$x->isa($self)) || (!$y->isa($self)));
+
+  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
+    {
+    # handle +-inf and NaN
+    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+    return 0 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/;
+    return 1 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} !~ /^[+-]inf$/;
+    return -1;
+    }
+  $CALC->_acmp($x->{value},$y->{value});	# lib does only 0,1,-1
+  }
+
+sub badd 
+  {
+  # add second arg (BINT or string) to first (BINT) (modifies first)
+  # return result as BINT
+
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it 
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('badd');
+  return $upgrade->badd($upgrade->new($x),$upgrade->new($y),@r) if defined $upgrade &&
+    ((!$x->isa($self)) || (!$y->isa($self)));
+
+  $r[3] = $y;				# no push!
+  # inf and NaN handling
+  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
+    {
+    # NaN first
+    return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+    # inf handling
+    if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
+      {
+      # +inf++inf or -inf+-inf => same, rest is NaN
+      return $x if $x->{sign} eq $y->{sign};
+      return $x->bnan();
+      }
+    # +-inf + something => +inf
+    # something +-inf => +-inf
+    $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
+    return $x;
+    }
+    
+  my ($sx, $sy) = ( $x->{sign}, $y->{sign} ); 		# get signs
+
+  if ($sx eq $sy)  
+    {
+    $x->{value} = $CALC->_add($x->{value},$y->{value});	# same sign, abs add
+    }
+  else 
+    {
+    my $a = $CALC->_acmp ($y->{value},$x->{value});	# absolute compare
+    if ($a > 0)                           
+      {
+      $x->{value} = $CALC->_sub($y->{value},$x->{value},1); # abs sub w/ swap
+      $x->{sign} = $sy;
+      } 
+    elsif ($a == 0)
+      {
+      # speedup, if equal, set result to 0
+      $x->{value} = $CALC->_zero();
+      $x->{sign} = '+';
+      }
+    else # a < 0
+      {
+      $x->{value} = $CALC->_sub($x->{value}, $y->{value}); # abs sub
+      }
+    }
+  $x->round(@r);
+  }
+
+sub bsub 
+  {
+  # (BINT or num_str, BINT or num_str) return BINT
+  # subtract second arg from first, modify first
+  
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('bsub');
+
+  return $upgrade->new($x)->bsub($upgrade->new($y),@r) if defined $upgrade &&
+   ((!$x->isa($self)) || (!$y->isa($self)));
+
+  return $x->round(@r) if $y->is_zero();
+
+  # To correctly handle the lone special case $x->bsub($x), we note the sign
+  # of $x, then flip the sign from $y, and if the sign of $x did change, too,
+  # then we caught the special case:
+  my $xsign = $x->{sign};
+  $y->{sign} =~ tr/+\-/-+/; 	# does nothing for NaN
+  if ($xsign ne $x->{sign})
+    {
+    # special case of $x->bsub($x) results in 0
+    return $x->bzero(@r) if $xsign =~ /^[+-]$/;
+    return $x->bnan();          # NaN, -inf, +inf
+    }
+  $x->badd($y,@r); 		# badd does not leave internal zeros
+  $y->{sign} =~ tr/+\-/-+/; 	# refix $y (does nothing for NaN)
+  $x;				# already rounded by badd() or no round necc.
+  }
+
+sub binc
+  {
+  # increment arg by one
+  my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+  return $x if $x->modify('binc');
+
+  if ($x->{sign} eq '+')
+    {
+    $x->{value} = $CALC->_inc($x->{value});
+    return $x->round($a,$p,$r);
+    }
+  elsif ($x->{sign} eq '-')
+    {
+    $x->{value} = $CALC->_dec($x->{value});
+    $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # -1 +1 => -0 => +0
+    return $x->round($a,$p,$r);
+    }
+  # inf, nan handling etc
+  $x->badd($self->bone(),$a,$p,$r);		# badd does round
+  }
+
+sub bdec
+  {
+  # decrement arg by one
+  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+  return $x if $x->modify('bdec');
+  
+  if ($x->{sign} eq '-')
+    {
+    # x already < 0
+    $x->{value} = $CALC->_inc($x->{value});
+    } 
+  else
+    {
+    return $x->badd($self->bone('-'),@r) unless $x->{sign} eq '+'; 	# inf or NaN
+    # >= 0
+    if ($CALC->_is_zero($x->{value}))
+      {
+      # == 0
+      $x->{value} = $CALC->_one(); $x->{sign} = '-';		# 0 => -1
+      }
+    else
+      {
+      # > 0
+      $x->{value} = $CALC->_dec($x->{value});
+      }
+    }
+  $x->round(@r);
+  }
+
+sub blog
+  {
+  # calculate $x = $a ** $base + $b and return $a (e.g. the log() to base
+  # $base of $x)
+
+  # set up parameters
+  my ($self,$x,$base,@r) = (undef,@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$base,@r) = objectify(1,ref($x),@_);
+    }
+  
+  return $x if $x->modify('blog');
+
+  # inf, -inf, NaN, <0 => NaN
+  return $x->bnan()
+   if $x->{sign} ne '+' || (defined $base && $base->{sign} ne '+');
+
+  return $upgrade->blog($upgrade->new($x),$base,@r) if 
+    defined $upgrade;
+
+  my ($rc,$exact) = $CALC->_log_int($x->{value},$base->{value});
+  return $x->bnan() unless defined $rc;		# not possible to take log?
+  $x->{value} = $rc;
+  $x->round(@r);
+  }
+
+sub blcm 
+  { 
+  # (BINT or num_str, BINT or num_str) return BINT
+  # does not modify arguments, but returns new object
+  # Lowest Common Multiplicator
+
+  my $y = shift; my ($x);
+  if (ref($y))
+    {
+    $x = $y->copy();
+    }
+  else
+    {
+    $x = $class->new($y);
+    }
+  my $self = ref($x);
+  while (@_) 
+    {
+    my $y = shift; $y = $self->new($y) if !ref ($y);
+    $x = __lcm($x,$y);
+    } 
+  $x;
+  }
+
+sub bgcd 
+  { 
+  # (BINT or num_str, BINT or num_str) return BINT
+  # does not modify arguments, but returns new object
+  # GCD -- Euclids algorithm, variant C (Knuth Vol 3, pg 341 ff)
+
+  my $y = shift;
+  $y = $class->new($y) if !ref($y);
+  my $self = ref($y);
+  my $x = $y->copy()->babs();			# keep arguments
+  return $x->bnan() if $x->{sign} !~ /^[+-]$/;	# x NaN?
+
+  while (@_)
+    {
+    $y = shift; $y = $self->new($y) if !ref($y);
+    return $x->bnan() if $y->{sign} !~ /^[+-]$/;	# y NaN?
+    $x->{value} = $CALC->_gcd($x->{value},$y->{value});
+    last if $CALC->_is_one($x->{value});
+    }
+  $x;
+  }
+
+sub bnot 
+  {
+  # (num_str or BINT) return BINT
+  # represent ~x as twos-complement number
+  # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
+  my ($self,$x,$a,$p,$r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
+ 
+  return $x if $x->modify('bnot');
+  $x->binc()->bneg();			# binc already does round
+  }
+
+##############################################################################
+# is_foo test routines
+# we don't need $self, so undef instead of ref($_[0]) make it slightly faster
+
+sub is_zero
+  {
+  # return true if arg (BINT or num_str) is zero (array '+', '0')
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+  
+  return 0 if $x->{sign} !~ /^\+$/;			# -, NaN & +-inf aren't
+  $CALC->_is_zero($x->{value});
+  }
+
+sub is_nan
+  {
+  # return true if arg (BINT or num_str) is NaN
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  $x->{sign} eq $nan ? 1 : 0;
+  }
+
+sub is_inf
+  {
+  # return true if arg (BINT or num_str) is +-inf
+  my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
+
+  if (defined $sign)
+    {
+    $sign = '[+-]inf' if $sign eq '';	# +- doesn't matter, only that's inf
+    $sign = "[$1]inf" if $sign =~ /^([+-])(inf)?$/;	# extract '+' or '-'
+    return $x->{sign} =~ /^$sign$/ ? 1 : 0;
+    }
+  $x->{sign} =~ /^[+-]inf$/ ? 1 : 0;		# only +-inf is infinity
+  }
+
+sub is_one
+  {
+  # return true if arg (BINT or num_str) is +1, or -1 if sign is given
+  my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
+    
+  $sign = '+' if !defined $sign || $sign ne '-';
+ 
+  return 0 if $x->{sign} ne $sign; 	# -1 != +1, NaN, +-inf aren't either
+  $CALC->_is_one($x->{value});
+  }
+
+sub is_odd
+  {
+  # return true when arg (BINT or num_str) is odd, false for even
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return 0 if $x->{sign} !~ /^[+-]$/;			# NaN & +-inf aren't
+  $CALC->_is_odd($x->{value});
+  }
+
+sub is_even
+  {
+  # return true when arg (BINT or num_str) is even, false for odd
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return 0 if $x->{sign} !~ /^[+-]$/;			# NaN & +-inf aren't
+  $CALC->_is_even($x->{value});
+  }
+
+sub is_positive
+  {
+  # return true when arg (BINT or num_str) is positive (>= 0)
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return 1 if $x->{sign} eq '+inf';			# +inf is positive
+ 
+  # 0+ is neither positive nor negative
+  ($x->{sign} eq '+' && !$x->is_zero()) ? 1 : 0;	
+  }
+
+sub is_negative
+  {
+  # return true when arg (BINT or num_str) is negative (< 0)
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+  
+  $x->{sign} =~ /^-/ ? 1 : 0; 		# -inf is negative, but NaN is not
+  }
+
+sub is_int
+  {
+  # return true when arg (BINT or num_str) is an integer
+  # always true for BigInt, but different for BigFloats
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+  
+  $x->{sign} =~ /^[+-]$/ ? 1 : 0;		# inf/-inf/NaN aren't
+  }
+
+###############################################################################
+
+sub bmul 
+  { 
+  # multiply two numbers -- stolen from Knuth Vol 2 pg 233
+  # (BINT or num_str, BINT or num_str) return BINT
+
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+  
+  return $x if $x->modify('bmul');
+
+  return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+
+  # inf handling
+  if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
+    {
+    return $x->bnan() if $x->is_zero() || $y->is_zero();
+    # result will always be +-inf:
+    # +inf * +/+inf => +inf, -inf * -/-inf => +inf
+    # +inf * -/-inf => -inf, -inf * +/+inf => -inf
+    return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/); 
+    return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/); 
+    return $x->binf('-');
+    }
+
+  return $upgrade->bmul($x,$upgrade->new($y),@r)
+   if defined $upgrade && !$y->isa($self);
+  
+  $r[3] = $y;				# no push here
+
+  $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => +
+
+  $x->{value} = $CALC->_mul($x->{value},$y->{value});	# do actual math
+  $x->{sign} = '+' if $CALC->_is_zero($x->{value}); 	# no -0
+
+  $x->round(@r);
+  }
+
+sub _div_inf
+  {
+  # helper function that handles +-inf cases for bdiv()/bmod() to reuse code
+  my ($self,$x,$y) = @_;
+
+  # NaN if x == NaN or y == NaN or x==y==0
+  return wantarray ? ($x->bnan(),$self->bnan()) : $x->bnan()
+   if (($x->is_nan() || $y->is_nan())   ||
+       ($x->is_zero() && $y->is_zero()));
+ 
+  # +-inf / +-inf == NaN, reminder also NaN
+  if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
+    {
+    return wantarray ? ($x->bnan(),$self->bnan()) : $x->bnan();
+    }
+  # x / +-inf => 0, remainder x (works even if x == 0)
+  if ($y->{sign} =~ /^[+-]inf$/)
+    {
+    my $t = $x->copy();		# bzero clobbers up $x
+    return wantarray ? ($x->bzero(),$t) : $x->bzero()
+    }
+  
+  # 5 / 0 => +inf, -6 / 0 => -inf
+  # +inf / 0 = inf, inf,  and -inf / 0 => -inf, -inf 
+  # exception:   -8 / 0 has remainder -8, not 8
+  # exception: -inf / 0 has remainder -inf, not inf
+  if ($y->is_zero())
+    {
+    # +-inf / 0 => special case for -inf
+    return wantarray ?  ($x,$x->copy()) : $x if $x->is_inf();
+    if (!$x->is_zero() && !$x->is_inf())
+      {
+      my $t = $x->copy();		# binf clobbers up $x
+      return wantarray ?
+       ($x->binf($x->{sign}),$t) : $x->binf($x->{sign})
+      }
+    }
+  
+  # last case: +-inf / ordinary number
+  my $sign = '+inf';
+  $sign = '-inf' if substr($x->{sign},0,1) ne $y->{sign};
+  $x->{sign} = $sign;
+  return wantarray ? ($x,$self->bzero()) : $x;
+  }
+
+sub bdiv 
+  {
+  # (dividend: BINT or num_str, divisor: BINT or num_str) return 
+  # (BINT,BINT) (quo,rem) or BINT (only rem)
+  
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it 
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    } 
+
+  return $x if $x->modify('bdiv');
+
+  return $self->_div_inf($x,$y)
+   if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
+
+  return $upgrade->bdiv($upgrade->new($x),$upgrade->new($y),@r)
+   if defined $upgrade;
+   
+  $r[3] = $y;					# no push!
+
+  # calc new sign and in case $y == +/- 1, return $x
+  my $xsign = $x->{sign};				# keep
+  $x->{sign} = ($x->{sign} ne $y->{sign} ? '-' : '+'); 
+
+  if (wantarray)
+    {
+    my $rem = $self->bzero(); 
+    ($x->{value},$rem->{value}) = $CALC->_div($x->{value},$y->{value});
+    $x->{sign} = '+' if $CALC->_is_zero($x->{value});
+    $rem->{_a} = $x->{_a};
+    $rem->{_p} = $x->{_p};
+    $x->round(@r);
+    if (! $CALC->_is_zero($rem->{value}))
+      {
+      $rem->{sign} = $y->{sign};
+      $rem = $y->copy()->bsub($rem) if $xsign ne $y->{sign}; # one of them '-'
+      }
+    else
+      {
+      $rem->{sign} = '+';			# dont leave -0
+      }
+    $rem->round(@r);
+    return ($x,$rem);
+    }
+
+  $x->{value} = $CALC->_div($x->{value},$y->{value});
+  $x->{sign} = '+' if $CALC->_is_zero($x->{value});
+
+  $x->round(@r);
+  }
+
+###############################################################################
+# modulus functions
+
+sub bmod 
+  {
+  # modulus (or remainder)
+  # (BINT or num_str, BINT or num_str) return BINT
+  
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('bmod');
+  $r[3] = $y;					# no push!
+  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero())
+    {
+    my ($d,$r) = $self->_div_inf($x,$y);
+    $x->{sign} = $r->{sign};
+    $x->{value} = $r->{value};
+    return $x->round(@r);
+    }
+
+  # calc new sign and in case $y == +/- 1, return $x
+  $x->{value} = $CALC->_mod($x->{value},$y->{value});
+  if (!$CALC->_is_zero($x->{value}))
+    {
+    $x->{value} = $CALC->_sub($y->{value},$x->{value},1) 	# $y-$x
+      if ($x->{sign} ne $y->{sign});
+    $x->{sign} = $y->{sign};
+    }
+   else
+    {
+    $x->{sign} = '+';				# dont leave -0
+    }
+  $x->round(@r);
+  }
+
+sub bmodinv
+  {
+  # Modular inverse.  given a number which is (hopefully) relatively
+  # prime to the modulus, calculate its inverse using Euclid's
+  # alogrithm.  If the number is not relatively prime to the modulus
+  # (i.e. their gcd is not one) then NaN is returned.
+
+  # set up parameters
+  my ($self,$x,$y,@r) = (undef,@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('bmodinv');
+
+  return $x->bnan()
+        if ($y->{sign} ne '+'                           # -, NaN, +inf, -inf
+         || $x->is_zero()                               # or num == 0
+         || $x->{sign} !~ /^[+-]$/                      # or num NaN, inf, -inf
+        );
+
+  # put least residue into $x if $x was negative, and thus make it positive
+  $x->bmod($y) if $x->{sign} eq '-';
+
+  my $sign;
+  ($x->{value},$sign) = $CALC->_modinv($x->{value},$y->{value});
+  return $x->bnan() if !defined $x->{value};		# in case no GCD found
+  return $x if !defined $sign;			# already real result
+  $x->{sign} = $sign;				# flip/flop see below
+  $x->bmod($y);					# calc real result
+  $x;
+  }
+
+sub bmodpow
+  {
+  # takes a very large number to a very large exponent in a given very
+  # large modulus, quickly, thanks to binary exponentation.  supports
+  # negative exponents.
+  my ($self,$num,$exp,$mod,@r) = objectify(3,@_);
+
+  return $num if $num->modify('bmodpow');
+
+  # check modulus for valid values
+  return $num->bnan() if ($mod->{sign} ne '+'		# NaN, - , -inf, +inf
+                       || $mod->is_zero());
+
+  # check exponent for valid values
+  if ($exp->{sign} =~ /\w/) 
+    {
+    # i.e., if it's NaN, +inf, or -inf...
+    return $num->bnan();
+    }
+
+  $num->bmodinv ($mod) if ($exp->{sign} eq '-');
+
+  # check num for valid values (also NaN if there was no inverse but $exp < 0)
+  return $num->bnan() if $num->{sign} !~ /^[+-]$/;
+
+  # $mod is positive, sign on $exp is ignored, result also positive
+  $num->{value} = $CALC->_modpow($num->{value},$exp->{value},$mod->{value});
+  $num;
+  }
+
+###############################################################################
+
+sub bfac
+  {
+  # (BINT or num_str, BINT or num_str) return BINT
+  # compute factorial number from $x, modify $x in place
+  my ($self,$x,@r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
+
+  return $x if $x->modify('bfac') || $x->{sign} eq '+inf';	# inf => inf
+  return $x->bnan() if $x->{sign} ne '+';			# NaN, <0 etc => NaN
+
+  $x->{value} = $CALC->_fac($x->{value});
+  $x->round(@r);
+  }
+ 
+sub bpow 
+  {
+  # (BINT or num_str, BINT or num_str) return BINT
+  # compute power of two numbers -- stolen from Knuth Vol 2 pg 233
+  # modifies first argument
+
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('bpow');
+
+  return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
+
+  # inf handling
+  if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
+    {
+    if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
+      {
+      # +-inf ** +-inf
+      return $x->bnan();
+      }
+    # +-inf ** Y
+    if ($x->{sign} =~ /^[+-]inf/)
+      {
+      # +inf ** 0 => NaN
+      return $x->bnan() if $y->is_zero();
+      # -inf ** -1 => 1/inf => 0
+      return $x->bzero() if $y->is_one('-') && $x->is_negative();
+
+      # +inf ** Y => inf
+      return $x if $x->{sign} eq '+inf';
+
+      # -inf ** Y => -inf if Y is odd
+      return $x if $y->is_odd();
+      return $x->babs();
+      }
+    # X ** +-inf
+
+    # 1 ** +inf => 1
+    return $x if $x->is_one();
+    
+    # 0 ** inf => 0
+    return $x if $x->is_zero() && $y->{sign} =~ /^[+]/;
+
+    # 0 ** -inf => inf
+    return $x->binf() if $x->is_zero();
+
+    # -1 ** -inf => NaN
+    return $x->bnan() if $x->is_one('-') && $y->{sign} =~ /^[-]/;
+
+    # -X ** -inf => 0
+    return $x->bzero() if $x->{sign} eq '-' && $y->{sign} =~ /^[-]/;
+
+    # -1 ** inf => NaN
+    return $x->bnan() if $x->{sign} eq '-';
+
+    # X ** inf => inf
+    return $x->binf() if $y->{sign} =~ /^[+]/;
+    # X ** -inf => 0
+    return $x->bzero();
+    }
+
+  return $upgrade->bpow($upgrade->new($x),$y,@r)
+   if defined $upgrade && !$y->isa($self);
+
+  $r[3] = $y;					# no push!
+
+  # cases 0 ** Y, X ** 0, X ** 1, 1 ** Y are handled by Calc or Emu
+
+  my $new_sign = '+';
+  $new_sign = $y->is_odd() ? '-' : '+' if ($x->{sign} ne '+'); 
+
+  # 0 ** -7 => ( 1 / (0 ** 7)) => 1 / 0 => +inf 
+  return $x->binf() 
+    if $y->{sign} eq '-' && $x->{sign} eq '+' && $CALC->_is_zero($x->{value});
+  # 1 ** -y => 1 / (1 ** |y|)
+  # so do test for negative $y after above's clause
+  return $x->bnan() if $y->{sign} eq '-' && !$CALC->_is_one($x->{value});
+
+  $x->{value} = $CALC->_pow($x->{value},$y->{value});
+  $x->{sign} = $new_sign;
+  $x->{sign} = '+' if $CALC->_is_zero($y->{value});
+  $x->round(@r);
+  }
+
+sub blsft 
+  {
+  # (BINT or num_str, BINT or num_str) return BINT
+  # compute x << y, base n, y >= 0
+ 
+  # set up parameters
+  my ($self,$x,$y,$n,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$n,@r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('blsft');
+  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
+  return $x->round(@r) if $y->is_zero();
+
+  $n = 2 if !defined $n; return $x->bnan() if $n <= 0 || $y->{sign} eq '-';
+
+  $x->{value} = $CALC->_lsft($x->{value},$y->{value},$n);
+  $x->round(@r);
+  }
+
+sub brsft 
+  {
+  # (BINT or num_str, BINT or num_str) return BINT
+  # compute x >> y, base n, y >= 0
+  
+  # set up parameters
+  my ($self,$x,$y,$n,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$n,@r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('brsft');
+  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
+  return $x->round(@r) if $y->is_zero();
+  return $x->bzero(@r) if $x->is_zero();		# 0 => 0
+
+  $n = 2 if !defined $n; return $x->bnan() if $n <= 0 || $y->{sign} eq '-';
+
+   # this only works for negative numbers when shifting in base 2
+  if (($x->{sign} eq '-') && ($n == 2))
+    {
+    return $x->round(@r) if $x->is_one('-');	# -1 => -1
+    if (!$y->is_one())
+      {
+      # although this is O(N*N) in calc (as_bin!) it is O(N) in Pari et al
+      # but perhaps there is a better emulation for two's complement shift...
+      # if $y != 1, we must simulate it by doing:
+      # convert to bin, flip all bits, shift, and be done
+      $x->binc();			# -3 => -2
+      my $bin = $x->as_bin();
+      $bin =~ s/^-0b//;			# strip '-0b' prefix
+      $bin =~ tr/10/01/;		# flip bits
+      # now shift
+      if (CORE::length($bin) <= $y)
+        {
+	$bin = '0'; 			# shifting to far right creates -1
+					# 0, because later increment makes 
+					# that 1, attached '-' makes it '-1'
+					# because -1 >> x == -1 !
+        } 
+      else
+	{
+	$bin =~ s/.{$y}$//;		# cut off at the right side
+        $bin = '1' . $bin;		# extend left side by one dummy '1'
+        $bin =~ tr/10/01/;		# flip bits back
+	}
+      my $res = $self->new('0b'.$bin);	# add prefix and convert back
+      $res->binc();			# remember to increment
+      $x->{value} = $res->{value};	# take over value
+      return $x->round(@r);		# we are done now, magic, isn't?
+      }
+    # x < 0, n == 2, y == 1
+    $x->bdec();				# n == 2, but $y == 1: this fixes it
+    }
+
+  $x->{value} = $CALC->_rsft($x->{value},$y->{value},$n);
+  $x->round(@r);
+  }
+
+sub band 
+  {
+  #(BINT or num_str, BINT or num_str) return BINT
+  # compute x & y
+ 
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+  
+  return $x if $x->modify('band');
+
+  $r[3] = $y;				# no push!
+
+  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
+
+  my $sx = $x->{sign} eq '+' ? 1 : -1;
+  my $sy = $y->{sign} eq '+' ? 1 : -1;
+  
+  if ($sx == 1 && $sy == 1)
+    {
+    $x->{value} = $CALC->_and($x->{value},$y->{value});
+    return $x->round(@r);
+    }
+  
+  if ($CAN{signed_and})
+    {
+    $x->{value} = $CALC->_signed_and($x->{value},$y->{value},$sx,$sy);
+    return $x->round(@r);
+    }
+ 
+  require $EMU_LIB;
+  __emu_band($self,$x,$y,$sx,$sy,@r);
+  }
+
+sub bior 
+  {
+  #(BINT or num_str, BINT or num_str) return BINT
+  # compute x | y
+  
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('bior');
+  $r[3] = $y;				# no push!
+
+  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
+
+  my $sx = $x->{sign} eq '+' ? 1 : -1;
+  my $sy = $y->{sign} eq '+' ? 1 : -1;
+
+  # the sign of X follows the sign of X, e.g. sign of Y irrelevant for bior()
+  
+  # don't use lib for negative values
+  if ($sx == 1 && $sy == 1)
+    {
+    $x->{value} = $CALC->_or($x->{value},$y->{value});
+    return $x->round(@r);
+    }
+
+  # if lib can do negative values, let it handle this
+  if ($CAN{signed_or})
+    {
+    $x->{value} = $CALC->_signed_or($x->{value},$y->{value},$sx,$sy);
+    return $x->round(@r);
+    }
+
+  require $EMU_LIB;
+  __emu_bior($self,$x,$y,$sx,$sy,@r);
+  }
+
+sub bxor 
+  {
+  #(BINT or num_str, BINT or num_str) return BINT
+  # compute x ^ y
+  
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $x if $x->modify('bxor');
+  $r[3] = $y;				# no push!
+
+  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
+  
+  my $sx = $x->{sign} eq '+' ? 1 : -1;
+  my $sy = $y->{sign} eq '+' ? 1 : -1;
+
+  # don't use lib for negative values
+  if ($sx == 1 && $sy == 1)
+    {
+    $x->{value} = $CALC->_xor($x->{value},$y->{value});
+    return $x->round(@r);
+    }
+  
+  # if lib can do negative values, let it handle this
+  if ($CAN{signed_xor})
+    {
+    $x->{value} = $CALC->_signed_xor($x->{value},$y->{value},$sx,$sy);
+    return $x->round(@r);
+    }
+
+  require $EMU_LIB;
+  __emu_bxor($self,$x,$y,$sx,$sy,@r);
+  }
+
+sub length
+  {
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  my $e = $CALC->_len($x->{value}); 
+  wantarray ? ($e,0) : $e;
+  }
+
+sub digit
+  {
+  # return the nth decimal digit, negative values count backward, 0 is right
+  my ($self,$x,$n) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
+
+  $n = $n->numify() if ref($n);
+  $CALC->_digit($x->{value},$n||0);
+  }
+
+sub _trailing_zeros
+  {
+  # return the amount of trailing zeros in $x (as scalar)
+  my $x = shift;
+  $x = $class->new($x) unless ref $x;
+
+  return 0 if $x->{sign} !~ /^[+-]$/;	# NaN, inf, -inf etc
+
+  $CALC->_zeros($x->{value});		# must handle odd values, 0 etc
+  }
+
+sub bsqrt
+  {
+  # calculate square root of $x
+  my ($self,$x,@r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
+
+  return $x if $x->modify('bsqrt');
+
+  return $x->bnan() if $x->{sign} !~ /^\+/;	# -x or -inf or NaN => NaN
+  return $x if $x->{sign} eq '+inf';		# sqrt(+inf) == inf
+
+  return $upgrade->bsqrt($x,@r) if defined $upgrade;
+
+  $x->{value} = $CALC->_sqrt($x->{value});
+  $x->round(@r);
+  }
+
+sub broot
+  {
+  # calculate $y'th root of $x
+ 
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+
+  $y = $self->new(2) unless defined $y;
+
+  # objectify is costly, so avoid it
+  if ((!ref($x)) || (ref($x) ne ref($y)))
+    {
+    ($self,$x,$y,@r) = objectify(2,$self || $class,@_);
+    }
+
+  return $x if $x->modify('broot');
+
+  # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
+  return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
+         $y->{sign} !~ /^\+$/;
+
+  return $x->round(@r)
+    if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one();
+
+  return $upgrade->new($x)->broot($upgrade->new($y),@r) if defined $upgrade;
+
+  $x->{value} = $CALC->_root($x->{value},$y->{value});
+  $x->round(@r);
+  }
+
+sub exponent
+  {
+  # return a copy of the exponent (here always 0, NaN or 1 for $m == 0)
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+ 
+  if ($x->{sign} !~ /^[+-]$/)
+    {
+    my $s = $x->{sign}; $s =~ s/^[+-]//;  # NaN, -inf,+inf => NaN or inf
+    return $self->new($s);
+    }
+  return $self->bone() if $x->is_zero();
+
+  $self->new($x->_trailing_zeros());
+  }
+
+sub mantissa
+  {
+  # return the mantissa (compatible to Math::BigFloat, e.g. reduced)
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  if ($x->{sign} !~ /^[+-]$/)
+    {
+    # for NaN, +inf, -inf: keep the sign
+    return $self->new($x->{sign});
+    }
+  my $m = $x->copy(); delete $m->{_p}; delete $m->{_a};
+  # that's a bit inefficient:
+  my $zeros = $m->_trailing_zeros();
+  $m->brsft($zeros,10) if $zeros != 0;
+  $m;
+  }
+
+sub parts
+  {
+  # return a copy of both the exponent and the mantissa
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  ($x->mantissa(),$x->exponent());
+  }
+   
+##############################################################################
+# rounding functions
+
+sub bfround
+  {
+  # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
+  # $n == 0 || $n == 1 => round to integer
+  my $x = shift; my $self = ref($x) || $x; $x = $self->new($x) unless ref $x;
+
+  my ($scale,$mode) = $x->_scale_p(@_);
+
+  return $x if !defined $scale || $x->modify('bfround');	# no-op
+
+  # no-op for BigInts if $n <= 0
+  $x->bround( $x->length()-$scale, $mode) if $scale > 0;
+
+  delete $x->{_a};	# delete to save memory
+  $x->{_p} = $scale;	# store new _p
+  $x;
+  }
+
+sub _scan_for_nonzero
+  {
+  # internal, used by bround() to scan for non-zeros after a '5'
+  my ($x,$pad,$xs,$len) = @_;
+ 
+  return 0 if $len == 1;		# "5" is trailed by invisible zeros
+  my $follow = $pad - 1;
+  return 0 if $follow > $len || $follow < 1;
+
+  # use the string form to check whether only '0's follow or not
+  substr ($xs,-$follow) =~ /[^0]/ ? 1 : 0;
+  }
+
+sub fround
+  {
+  # Exists to make life easier for switch between MBF and MBI (should we
+  # autoload fxxx() like MBF does for bxxx()?)
+  my $x = shift; $x = $class->new($x) unless ref $x;
+  $x->bround(@_);
+  }
+
+sub bround
+  {
+  # accuracy: +$n preserve $n digits from left,
+  #           -$n preserve $n digits from right (f.i. for 0.1234 style in MBF)
+  # no-op for $n == 0
+  # and overwrite the rest with 0's, return normalized number
+  # do not return $x->bnorm(), but $x
+
+  my $x = shift; $x = $class->new($x) unless ref $x;
+  my ($scale,$mode) = $x->_scale_a(@_);
+  return $x if !defined $scale || $x->modify('bround');	# no-op
+  
+  if ($x->is_zero() || $scale == 0)
+    {
+    $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2
+    return $x;
+    }
+  return $x if $x->{sign} !~ /^[+-]$/;		# inf, NaN
+
+  # we have fewer digits than we want to scale to
+  my $len = $x->length();
+  # convert $scale to a scalar in case it is an object (put's a limit on the
+  # number length, but this would already limited by memory constraints), makes
+  # it faster
+  $scale = $scale->numify() if ref ($scale);
+
+  # scale < 0, but > -len (not >=!)
+  if (($scale < 0 && $scale < -$len-1) || ($scale >= $len))
+    {
+    $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2
+    return $x; 
+    }
+   
+  # count of 0's to pad, from left (+) or right (-): 9 - +6 => 3, or |-6| => 6
+  my ($pad,$digit_round,$digit_after);
+  $pad = $len - $scale;
+  $pad = abs($scale-1) if $scale < 0;
+
+  # do not use digit(), it is very costly for binary => decimal
+  # getting the entire string is also costly, but we need to do it only once
+  my $xs = $CALC->_str($x->{value});
+  my $pl = -$pad-1;
+
+  # pad:   123: 0 => -1, at 1 => -2, at 2 => -3, at 3 => -4
+  # pad+1: 123: 0 => 0,  at 1 => -1, at 2 => -2, at 3 => -3
+  $digit_round = '0'; $digit_round = substr($xs,$pl,1) if $pad <= $len;
+  $pl++; $pl ++ if $pad >= $len;
+  $digit_after = '0'; $digit_after = substr($xs,$pl,1) if $pad > 0;
+
+  # in case of 01234 we round down, for 6789 up, and only in case 5 we look
+  # closer at the remaining digits of the original $x, remember decision
+  my $round_up = 1;					# default round up
+  $round_up -- if
+    ($mode eq 'trunc')				||	# trunc by round down
+    ($digit_after =~ /[01234]/)			|| 	# round down anyway,
+							# 6789 => round up
+    ($digit_after eq '5')			&&	# not 5000...0000
+    ($x->_scan_for_nonzero($pad,$xs,$len) == 0)		&&
+    (
+     ($mode eq 'even') && ($digit_round =~ /[24680]/) ||
+     ($mode eq 'odd')  && ($digit_round =~ /[13579]/) ||
+     ($mode eq '+inf') && ($x->{sign} eq '-')   ||
+     ($mode eq '-inf') && ($x->{sign} eq '+')   ||
+     ($mode eq 'zero')		# round down if zero, sign adjusted below
+    );
+  my $put_back = 0;					# not yet modified
+	
+  if (($pad > 0) && ($pad <= $len))
+    {
+    substr($xs,-$pad,$pad) = '0' x $pad;		# replace with '00...'
+    $put_back = 1;					# need to put back
+    }
+  elsif ($pad > $len)
+    {
+    $x->bzero();					# round to '0'
+    }
+
+  if ($round_up)					# what gave test above?
+    {
+    $put_back = 1;					# need to put back
+    $pad = $len, $xs = '0' x $pad if $scale < 0;	# tlr: whack 0.51=>1.0	
+
+    # we modify directly the string variant instead of creating a number and
+    # adding it, since that is faster (we already have the string)
+    my $c = 0; $pad ++;				# for $pad == $len case
+    while ($pad <= $len)
+      {
+      $c = substr($xs,-$pad,1) + 1; $c = '0' if $c eq '10';
+      substr($xs,-$pad,1) = $c; $pad++;
+      last if $c != 0;				# no overflow => early out
+      }
+    $xs = '1'.$xs if $c == 0;
+
+    }
+  $x->{value} = $CALC->_new($xs) if $put_back == 1;	# put back, if needed
+
+  $x->{_a} = $scale if $scale >= 0;
+  if ($scale < 0)
+    {
+    $x->{_a} = $len+$scale;
+    $x->{_a} = 0 if $scale < -$len;
+    }
+  $x;
+  }
+
+sub bfloor
+  {
+  # return integer less or equal then number; no-op since it's already integer
+  my ($self,$x,@r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
+
+  $x->round(@r);
+  }
+
+sub bceil
+  {
+  # return integer greater or equal then number; no-op since it's already int
+  my ($self,$x,@r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
+
+  $x->round(@r);
+  }
+
+sub as_number
+  {
+  # An object might be asked to return itself as bigint on certain overloaded
+  # operations, this does exactly this, so that sub classes can simple inherit
+  # it or override with their own integer conversion routine.
+  $_[0]->copy();
+  }
+
+sub as_hex
+  {
+  # return as hex string, with prefixed 0x
+  my $x = shift; $x = $class->new($x) if !ref($x);
+
+  return $x->bstr() if $x->{sign} !~ /^[+-]$/;	# inf, nan etc
+
+  my $s = '';
+  $s = $x->{sign} if $x->{sign} eq '-';
+  $s . $CALC->_as_hex($x->{value});
+  }
+
+sub as_bin
+  {
+  # return as binary string, with prefixed 0b
+  my $x = shift; $x = $class->new($x) if !ref($x);
+
+  return $x->bstr() if $x->{sign} !~ /^[+-]$/;	# inf, nan etc
+
+  my $s = ''; $s = $x->{sign} if $x->{sign} eq '-';
+  return $s . $CALC->_as_bin($x->{value});
+  }
+
+##############################################################################
+# private stuff (internal use only)
+
+sub objectify
+  {
+  # check for strings, if yes, return objects instead
+ 
+  # the first argument is number of args objectify() should look at it will
+  # return $count+1 elements, the first will be a classname. This is because
+  # overloaded '""' calls bstr($object,undef,undef) and this would result in
+  # useless objects beeing created and thrown away. So we cannot simple loop
+  # over @_. If the given count is 0, all arguments will be used.
+ 
+  # If the second arg is a ref, use it as class.
+  # If not, try to use it as classname, unless undef, then use $class 
+  # (aka Math::BigInt). The latter shouldn't happen,though.
+
+  # caller:			   gives us:
+  # $x->badd(1);                => ref x, scalar y
+  # Class->badd(1,2);           => classname x (scalar), scalar x, scalar y
+  # Class->badd( Class->(1),2); => classname x (scalar), ref x, scalar y
+  # Math::BigInt::badd(1,2);    => scalar x, scalar y
+  # In the last case we check number of arguments to turn it silently into
+  # $class,1,2. (We can not take '1' as class ;o)
+  # badd($class,1) is not supported (it should, eventually, try to add undef)
+  # currently it tries 'Math::BigInt' + 1, which will not work.
+
+  # some shortcut for the common cases
+  # $x->unary_op();
+  return (ref($_[1]),$_[1]) if (@_ == 2) && ($_[0]||0 == 1) && ref($_[1]);
+
+  my $count = abs(shift || 0);
+  
+  my (@a,$k,$d);		# resulting array, temp, and downgrade 
+  if (ref $_[0])
+    {
+    # okay, got object as first
+    $a[0] = ref $_[0];
+    }
+  else
+    {
+    # nope, got 1,2 (Class->xxx(1) => Class,1 and not supported)
+    $a[0] = $class;
+    $a[0] = shift if $_[0] =~ /^[A-Z].*::/;	# classname as first?
+    }
+
+  no strict 'refs';
+  # disable downgrading, because Math::BigFLoat->foo('1.0','2.0') needs floats
+  if (defined ${"$a[0]::downgrade"})
+    {
+    $d = ${"$a[0]::downgrade"};
+    ${"$a[0]::downgrade"} = undef;
+    }
+
+  my $up = ${"$a[0]::upgrade"};
+  #print "Now in objectify, my class is today $a[0], count = $count\n";
+  if ($count == 0)
+    {
+    while (@_)
+      {
+      $k = shift;
+      if (!ref($k))
+        {
+        $k = $a[0]->new($k);
+        }
+      elsif (!defined $up && ref($k) ne $a[0])
+	{
+	# foreign object, try to convert to integer
+        $k->can('as_number') ?  $k = $k->as_number() : $k = $a[0]->new($k);
+	}
+      push @a,$k;
+      }
+    }
+  else
+    {
+    while ($count > 0)
+      {
+      $count--; 
+      $k = shift; 
+      if (!ref($k))
+        {
+        $k = $a[0]->new($k);
+        }
+      elsif (!defined $up && ref($k) ne $a[0])
+	{
+	# foreign object, try to convert to integer
+        $k->can('as_number') ?  $k = $k->as_number() : $k = $a[0]->new($k);
+	}
+      push @a,$k;
+      }
+    push @a,@_;		# return other params, too
+    }
+  if (! wantarray)
+    {
+    require Carp; Carp::croak ("$class objectify needs list context");
+    }
+  ${"$a[0]::downgrade"} = $d;
+  @a;
+  }
+
+sub _register_callback
+  {
+  my ($class,$callback) = @_;
+
+  if (ref($callback) ne 'CODE')
+    { 
+    require Carp;
+    Carp::croak ("$callback is not a coderef");
+    }
+  $CALLBACKS{$class} = $callback;
+  }
+
+sub import 
+  {
+  my $self = shift;
+
+  $IMPORT++;				# remember we did import()
+  my @a; my $l = scalar @_;
+  for ( my $i = 0; $i < $l ; $i++ )
+    {
+    if ($_[$i] eq ':constant')
+      {
+      # this causes overlord er load to step in
+      overload::constant 
+	integer => sub { $self->new(shift) },
+      	binary => sub { $self->new(shift) };
+      }
+    elsif ($_[$i] eq 'upgrade')
+      {
+      # this causes upgrading
+      $upgrade = $_[$i+1];		# or undef to disable
+      $i++;
+      }
+    elsif ($_[$i] =~ /^lib$/i)
+      {
+      # this causes a different low lib to take care...
+      $CALC = $_[$i+1] || '';
+      $i++;
+      }
+    else
+      {
+      push @a, $_[$i];
+      }
+    }
+  # any non :constant stuff is handled by our parent, Exporter
+  if (@a > 0)
+    {
+    require Exporter;
+ 
+    $self->SUPER::import(@a);			# need it for subclasses
+    $self->export_to_level(1,$self,@a);		# need it for MBF
+    }
+
+  # try to load core math lib
+  my @c = split /\s*,\s*/,$CALC;
+  foreach (@c)
+    {
+    $_ =~ tr/a-zA-Z0-9://cd;			# limit to sane characters
+    }
+  push @c, 'FastCalc', 'Calc';			# if all fail, try these
+  $CALC = '';					# signal error
+  foreach my $lib (@c)
+    {
+    next if ($lib || '') eq '';
+    $lib = 'Math::BigInt::'.$lib if $lib !~ /^Math::BigInt/i;
+    $lib =~ s/\.pm$//;
+    if ($] < 5.006)
+      {
+      # Perl < 5.6.0 dies with "out of memory!" when eval("") and ':constant' is
+      # used in the same script, or eval("") inside import().
+      my @parts = split /::/, $lib;             # Math::BigInt => Math BigInt
+      my $file = pop @parts; $file .= '.pm';    # BigInt => BigInt.pm
+      require File::Spec;
+      $file = File::Spec->catfile (@parts, $file);
+      eval { require "$file"; $lib->import( @c ); }
+      }
+    else
+      {
+      eval "use $lib qw/@c/;";
+      }
+    if ($@ eq '')
+      {
+      my $ok = 1;
+      # loaded it ok, see if the api_version() is high enough
+      if ($lib->can('api_version') && $lib->api_version() >= 1.0)
+	{
+	$ok = 0;
+	# api_version matches, check if it really provides anything we need
+        for my $method (qw/
+		one two ten
+		str num
+		add mul div sub dec inc
+		acmp len digit is_one is_zero is_even is_odd
+		is_two is_ten
+		new copy check from_hex from_bin as_hex as_bin zeros
+		rsft lsft xor and or
+		mod sqrt root fac pow modinv modpow log_int gcd
+	 /)
+          {
+	  if (!$lib->can("_$method"))
+	    {
+	    if (($WARN{$lib}||0) < 2)
+	      {
+	      require Carp;
+	      Carp::carp ("$lib is missing method '_$method'");
+	      $WARN{$lib} = 1;		# still warn about the lib
+	      }
+            $ok++; last; 
+	    }
+          }
+	}
+      if ($ok == 0)
+	{
+	$CALC = $lib;
+        last;			# found a usable one, break
+	}
+      else
+	{
+	if (($WARN{$lib}||0) < 2)
+	  {
+	  my $ver = eval "\$$lib\::VERSION" || 'unknown';
+	  require Carp;
+	  Carp::carp ("Cannot load outdated $lib v$ver, please upgrade");
+	  $WARN{$lib} = 2;		# never warn again
+	  }
+        }
+      }
+    }
+  if ($CALC eq '')
+    {
+    require Carp;
+    Carp::croak ("Couldn't load any math lib, not even 'Calc.pm'");
+    }
+
+  # notify callbacks
+  foreach my $class (keys %CALLBACKS)
+    {
+    &{$CALLBACKS{$class}}($CALC);
+    }
+
+  # Fill $CAN with the results of $CALC->can(...) for emulating lower math lib
+  # functions
+
+  %CAN = ();
+  for my $method (qw/ signed_and signed_or signed_xor /)
+    {
+    $CAN{$method} = $CALC->can("_$method") ? 1 : 0;
+    }
+
+  # import done
+  }
+
+sub __from_hex
+  {
+  # internal
+  # convert a (ref to) big hex string to BigInt, return undef for error
+  my $hs = shift;
+
+  my $x = Math::BigInt->bzero();
+  
+  # strip underscores
+  $hs =~ s/([0-9a-fA-F])_([0-9a-fA-F])/$1$2/g;	
+  $hs =~ s/([0-9a-fA-F])_([0-9a-fA-F])/$1$2/g;	
+  
+  return $x->bnan() if $hs !~ /^[\-\+]?0x[0-9A-Fa-f]+$/;
+
+  my $sign = '+'; $sign = '-' if $hs =~ /^-/;
+
+  $hs =~ s/^[+-]//;						# strip sign
+  $x->{value} = $CALC->_from_hex($hs);
+  $x->{sign} = $sign unless $CALC->_is_zero($x->{value}); 	# no '-0'
+  $x;
+  }
+
+sub __from_bin
+  {
+  # internal
+  # convert a (ref to) big binary string to BigInt, return undef for error
+  my $bs = shift;
+
+  my $x = Math::BigInt->bzero();
+  # strip underscores
+  $bs =~ s/([01])_([01])/$1$2/g;	
+  $bs =~ s/([01])_([01])/$1$2/g;	
+  return $x->bnan() if $bs !~ /^[+-]?0b[01]+$/;
+
+  my $sign = '+'; $sign = '-' if $bs =~ /^\-/;
+  $bs =~ s/^[+-]//;						# strip sign
+
+  $x->{value} = $CALC->_from_bin($bs);
+  $x->{sign} = $sign unless $CALC->_is_zero($x->{value}); 	# no '-0'
+  $x;
+  }
+
+sub _split
+  {
+  # input: num_str; output: undef for invalid or
+  # (\$mantissa_sign,\$mantissa_value,\$mantissa_fraction,\$exp_sign,\$exp_value)
+  # Internal, take apart a string and return the pieces.
+  # Strip leading/trailing whitespace, leading zeros, underscore and reject
+  # invalid input.
+  my $x = shift;
+
+  # strip white space at front, also extranous leading zeros
+  $x =~ s/^\s*([-]?)0*([0-9])/$1$2/g;	# will not strip '  .2'
+  $x =~ s/^\s+//;			# but this will			
+  $x =~ s/\s+$//g;			# strip white space at end
+
+  # shortcut, if nothing to split, return early
+  if ($x =~ /^[+-]?\d+\z/)
+    {
+    $x =~ s/^([+-])0*([0-9])/$2/; my $sign = $1 || '+';
+    return (\$sign, \$x, \'', \'', \0);
+    }
+
+  # invalid starting char?
+  return if $x !~ /^[+-]?(\.?[0-9]|0b[0-1]|0x[0-9a-fA-F])/;
+
+  return __from_hex($x) if $x =~ /^[\-\+]?0x/;	# hex string
+  return __from_bin($x) if $x =~ /^[\-\+]?0b/;	# binary string
+  
+  # strip underscores between digits
+  $x =~ s/(\d)_(\d)/$1$2/g;
+  $x =~ s/(\d)_(\d)/$1$2/g;		# do twice for 1_2_3
+
+  # some possible inputs: 
+  # 2.1234 # 0.12        # 1 	      # 1E1 # 2.134E1 # 434E-10 # 1.02009E-2 
+  # .2 	   # 1_2_3.4_5_6 # 1.4E1_2_3  # 1e3 # +.2     # 0e999	
+
+  my ($m,$e,$last) = split /[Ee]/,$x;
+  return if defined $last;		# last defined => 1e2E3 or others
+  $e = '0' if !defined $e || $e eq "";
+
+  # sign,value for exponent,mantint,mantfrac
+  my ($es,$ev,$mis,$miv,$mfv);
+  # valid exponent?
+  if ($e =~ /^([+-]?)0*(\d+)$/) # strip leading zeros
+    {
+    $es = $1; $ev = $2;
+    # valid mantissa?
+    return if $m eq '.' || $m eq '';
+    my ($mi,$mf,$lastf) = split /\./,$m;
+    return if defined $lastf;		# lastf defined => 1.2.3 or others
+    $mi = '0' if !defined $mi;
+    $mi .= '0' if $mi =~ /^[\-\+]?$/;
+    $mf = '0' if !defined $mf || $mf eq '';
+    if ($mi =~ /^([+-]?)0*(\d+)$/) # strip leading zeros
+      {
+      $mis = $1||'+'; $miv = $2;
+      return unless ($mf =~ /^(\d*?)0*$/);	# strip trailing zeros
+      $mfv = $1;
+      # handle the 0e999 case here
+      $ev = 0 if $miv eq '0' && $mfv eq '';
+      return (\$mis,\$miv,\$mfv,\$es,\$ev);
+      }
+    }
+  return; # NaN, not a number
+  }
+
+##############################################################################
+# internal calculation routines (others are in Math::BigInt::Calc etc)
+
+sub __lcm 
+  { 
+  # (BINT or num_str, BINT or num_str) return BINT
+  # does modify first argument
+  # LCM
+ 
+  my ($x,$ty) = @_;
+  return $x->bnan() if ($x->{sign} eq $nan) || ($ty->{sign} eq $nan);
+  my $method = ref($x) . '::bgcd';
+  no strict 'refs';
+  $x * $ty / &$method($x,$ty);
+  }
+
+###############################################################################
+# this method returns 0 if the object can be modified, or 1 if not.
+# We use a fast constant sub() here, to avoid costly calls. Subclasses
+# may override it with special code (f.i. Math::BigInt::Constant does so)
+
+sub modify () { 0; }
+
+1;
+__END__
+
+=pod
+
+=head1 NAME
+
+Math::BigInt - Arbitrary size integer/float math package
+
+=head1 SYNOPSIS
+
+  use Math::BigInt;
+
+  # or make it faster: install (optional) Math::BigInt::GMP
+  # and always use (it will fall back to pure Perl if the
+  # GMP library is not installed):
+
+  use Math::BigInt lib => 'GMP';
+
+  my $str = '1234567890';
+  my @values = (64,74,18);
+  my $n = 1; my $sign = '-';
+
+  # Number creation	
+  $x = Math::BigInt->new($str);		# defaults to 0
+  $y = $x->copy();			# make a true copy
+  $nan  = Math::BigInt->bnan(); 	# create a NotANumber
+  $zero = Math::BigInt->bzero();	# create a +0
+  $inf = Math::BigInt->binf();		# create a +inf
+  $inf = Math::BigInt->binf('-');	# create a -inf
+  $one = Math::BigInt->bone();		# create a +1
+  $one = Math::BigInt->bone('-');	# create a -1
+
+  # Testing (don't modify their arguments)
+  # (return true if the condition is met, otherwise false)
+
+  $x->is_zero();	# if $x is +0
+  $x->is_nan();		# if $x is NaN
+  $x->is_one();		# if $x is +1
+  $x->is_one('-');	# if $x is -1
+  $x->is_odd();		# if $x is odd
+  $x->is_even();	# if $x is even
+  $x->is_pos();		# if $x >= 0
+  $x->is_neg();		# if $x <  0
+  $x->is_inf($sign);	# if $x is +inf, or -inf (sign is default '+')
+  $x->is_int();		# if $x is an integer (not a float)
+
+  # comparing and digit/sign extration
+  $x->bcmp($y);		# compare numbers (undef,<0,=0,>0)
+  $x->bacmp($y);	# compare absolutely (undef,<0,=0,>0)
+  $x->sign();		# return the sign, either +,- or NaN
+  $x->digit($n);	# return the nth digit, counting from right
+  $x->digit(-$n);	# return the nth digit, counting from left
+
+  # The following all modify their first argument. If you want to preserve
+  # $x, use $z = $x->copy()->bXXX($y); See under L<CAVEATS> for why this is
+  # neccessary when mixing $a = $b assigments with non-overloaded math.
+
+  $x->bzero();		# set $x to 0
+  $x->bnan();		# set $x to NaN
+  $x->bone();		# set $x to +1
+  $x->bone('-');	# set $x to -1
+  $x->binf();		# set $x to inf
+  $x->binf('-');	# set $x to -inf
+
+  $x->bneg();		# negation
+  $x->babs();		# absolute value
+  $x->bnorm();		# normalize (no-op in BigInt)
+  $x->bnot();		# two's complement (bit wise not)
+  $x->binc();		# increment $x by 1
+  $x->bdec();		# decrement $x by 1
+  
+  $x->badd($y);		# addition (add $y to $x)
+  $x->bsub($y);		# subtraction (subtract $y from $x)
+  $x->bmul($y);		# multiplication (multiply $x by $y)
+  $x->bdiv($y);		# divide, set $x to quotient
+			# return (quo,rem) or quo if scalar
+
+  $x->bmod($y);		   # modulus (x % y)
+  $x->bmodpow($exp,$mod);  # modular exponentation (($num**$exp) % $mod))
+  $x->bmodinv($mod);	   # the inverse of $x in the given modulus $mod
+
+  $x->bpow($y);		   # power of arguments (x ** y)
+  $x->blsft($y);	   # left shift
+  $x->brsft($y);	   # right shift 
+  $x->blsft($y,$n);	   # left shift, by base $n (like 10)
+  $x->brsft($y,$n);	   # right shift, by base $n (like 10)
+  
+  $x->band($y);		   # bitwise and
+  $x->bior($y);		   # bitwise inclusive or
+  $x->bxor($y);		   # bitwise exclusive or
+  $x->bnot();		   # bitwise not (two's complement)
+
+  $x->bsqrt();		   # calculate square-root
+  $x->broot($y);	   # $y'th root of $x (e.g. $y == 3 => cubic root)
+  $x->bfac();		   # factorial of $x (1*2*3*4*..$x)
+
+  $x->round($A,$P,$mode);  # round to accuracy or precision using mode $mode
+  $x->bround($n);	   # accuracy: preserve $n digits
+  $x->bfround($n);	   # round to $nth digit, no-op for BigInts
+
+  # The following do not modify their arguments in BigInt (are no-ops),
+  # but do so in BigFloat:
+
+  $x->bfloor();		   # return integer less or equal than $x
+  $x->bceil();		   # return integer greater or equal than $x
+  
+  # The following do not modify their arguments:
+
+  # greatest common divisor (no OO style)
+  my $gcd = Math::BigInt::bgcd(@values);
+  # lowest common multiplicator (no OO style)
+  my $lcm = Math::BigInt::blcm(@values);	
+ 
+  $x->length();		   # return number of digits in number
+  ($xl,$f) = $x->length(); # length of number and length of fraction part,
+			   # latter is always 0 digits long for BigInts
+
+  $x->exponent();	   # return exponent as BigInt
+  $x->mantissa();	   # return (signed) mantissa as BigInt
+  $x->parts();		   # return (mantissa,exponent) as BigInt
+  $x->copy();		   # make a true copy of $x (unlike $y = $x;)
+  $x->as_int();		   # return as BigInt (in BigInt: same as copy())
+  $x->numify();		   # return as scalar (might overflow!)
+  
+  # conversation to string (do not modify their argument)
+  $x->bstr();		   # normalized string (e.g. '3')
+  $x->bsstr();		   # norm. string in scientific notation (e.g. '3E0')
+  $x->as_hex();		   # as signed hexadecimal string with prefixed 0x
+  $x->as_bin();		   # as signed binary string with prefixed 0b
+
+
+  # precision and accuracy (see section about rounding for more)
+  $x->precision();	   # return P of $x (or global, if P of $x undef)
+  $x->precision($n);	   # set P of $x to $n
+  $x->accuracy();	   # return A of $x (or global, if A of $x undef)
+  $x->accuracy($n);	   # set A $x to $n
+
+  # Global methods
+  Math::BigInt->precision();	# get/set global P for all BigInt objects
+  Math::BigInt->accuracy(); 	# get/set global A for all BigInt objects
+  Math::BigInt->round_mode();	# get/set global round mode, one of
+				# 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
+  Math::BigInt->config();	# return hash containing configuration
+
+=head1 DESCRIPTION
+
+All operators (inlcuding basic math operations) are overloaded if you
+declare your big integers as
+
+  $i = new Math::BigInt '123_456_789_123_456_789';
+
+Operations with overloaded operators preserve the arguments which is
+exactly what you expect.
+
+=over 2
+
+=item Input
+
+Input values to these routines may be any string, that looks like a number
+and results in an integer, including hexadecimal and binary numbers.
+
+Scalars holding numbers may also be passed, but note that non-integer numbers
+may already have lost precision due to the conversation to float. Quote
+your input if you want BigInt to see all the digits:
+
+	$x = Math::BigInt->new(12345678890123456789);	# bad
+	$x = Math::BigInt->new('12345678901234567890');	# good
+
+You can include one underscore between any two digits.
+
+This means integer values like 1.01E2 or even 1000E-2 are also accepted.
+Non-integer values result in NaN.
+
+Currently, Math::BigInt::new() defaults to 0, while Math::BigInt::new('')
+results in 'NaN'. This might change in the future, so use always the following
+explicit forms to get a zero or NaN:
+
+	$zero = Math::BigInt->bzero(); 
+	$nan = Math::BigInt->bnan(); 
+
+C<bnorm()> on a BigInt object is now effectively a no-op, since the numbers 
+are always stored in normalized form. If passed a string, creates a BigInt 
+object from the input.
+
+=item Output
+
+Output values are BigInt objects (normalized), except for the methods which
+return a string (see L<SYNOPSIS>).
+
+Some routines (C<is_odd()>, C<is_even()>, C<is_zero()>, C<is_one()>,
+C<is_nan()>, etc.) return true or false, while others (C<bcmp()>, C<bacmp()>)
+return either undef (if NaN is involved), <0, 0 or >0 and are suited for sort.
+
+=back
+
+=head1 METHODS
+
+Each of the methods below (except config(), accuracy() and precision())
+accepts three additional parameters. These arguments C<$A>, C<$P> and C<$R>
+are C<accuracy>, C<precision> and C<round_mode>. Please see the section about
+L<ACCURACY and PRECISION> for more information.
+
+=head2 config
+
+	use Data::Dumper;
+
+	print Dumper ( Math::BigInt->config() );
+	print Math::BigInt->config()->{lib},"\n";
+
+Returns a hash containing the configuration, e.g. the version number, lib
+loaded etc. The following hash keys are currently filled in with the
+appropriate information.
+
+	key		Description
+			Example
+	============================================================
+	lib		Name of the low-level math library
+			Math::BigInt::Calc
+	lib_version 	Version of low-level math library (see 'lib')
+			0.30
+	class		The class name of config() you just called
+			Math::BigInt
+	upgrade		To which class math operations might be upgraded
+			Math::BigFloat
+	downgrade	To which class math operations might be downgraded
+			undef
+	precision	Global precision
+			undef
+	accuracy	Global accuracy
+			undef
+	round_mode	Global round mode
+			even
+	version		version number of the class you used
+			1.61
+	div_scale	Fallback acccuracy for div
+			40
+	trap_nan	If true, traps creation of NaN via croak()
+			1
+	trap_inf	If true, traps creation of +inf/-inf via croak()
+			1
+
+The following values can be set by passing C<config()> a reference to a hash:
+
+	trap_inf trap_nan
+        upgrade downgrade precision accuracy round_mode div_scale
+
+Example:
+	
+	$new_cfg = Math::BigInt->config( { trap_inf => 1, precision => 5 } );
+
+=head2 accuracy
+
+	$x->accuracy(5);		# local for $x
+	CLASS->accuracy(5);		# global for all members of CLASS
+					# Note: This also applies to new()!
+
+	$A = $x->accuracy();		# read out accuracy that affects $x
+	$A = CLASS->accuracy();		# read out global accuracy
+
+Set or get the global or local accuracy, aka how many significant digits the
+results have. If you set a global accuracy, then this also applies to new()!
+
+Warning! The accuracy I<sticks>, e.g. once you created a number under the
+influence of C<< CLASS->accuracy($A) >>, all results from math operations with
+that number will also be rounded. 
+
+In most cases, you should probably round the results explicitely using one of
+L<round()>, L<bround()> or L<bfround()> or by passing the desired accuracy
+to the math operation as additional parameter:
+
+        my $x = Math::BigInt->new(30000);
+        my $y = Math::BigInt->new(7);
+        print scalar $x->copy()->bdiv($y, 2);		# print 4300
+        print scalar $x->copy()->bdiv($y)->bround(2);	# print 4300
+
+Please see the section about L<ACCURACY AND PRECISION> for further details.
+
+Value must be greater than zero. Pass an undef value to disable it:
+
+	$x->accuracy(undef);
+	Math::BigInt->accuracy(undef);
+
+Returns the current accuracy. For C<$x->accuracy()> it will return either the
+local accuracy, or if not defined, the global. This means the return value
+represents the accuracy that will be in effect for $x:
+
+	$y = Math::BigInt->new(1234567);	# unrounded
+	print Math::BigInt->accuracy(4),"\n";	# set 4, print 4
+	$x = Math::BigInt->new(123456);		# $x will be automatically rounded!
+	print "$x $y\n";			# '123500 1234567'
+	print $x->accuracy(),"\n";		# will be 4
+	print $y->accuracy(),"\n";		# also 4, since global is 4
+	print Math::BigInt->accuracy(5),"\n";	# set to 5, print 5
+	print $x->accuracy(),"\n";		# still 4
+	print $y->accuracy(),"\n";		# 5, since global is 5
+
+Note: Works also for subclasses like Math::BigFloat. Each class has it's own
+globals separated from Math::BigInt, but it is possible to subclass
+Math::BigInt and make the globals of the subclass aliases to the ones from
+Math::BigInt.
+
+=head2 precision
+
+	$x->precision(-2);	# local for $x, round at the second digit right of the dot
+	$x->precision(2);	# ditto, round at the second digit left of the dot
+
+	CLASS->precision(5);	# Global for all members of CLASS
+				# This also applies to new()!
+	CLASS->precision(-5);	# ditto
+
+	$P = CLASS->precision();	# read out global precision 
+	$P = $x->precision();		# read out precision that affects $x
+
+Note: You probably want to use L<accuracy()> instead. With L<accuracy> you
+set the number of digits each result should have, with L<precision> you
+set the place where to round!
+
+C<precision()> sets or gets the global or local precision, aka at which digit
+before or after the dot to round all results. A set global precision also
+applies to all newly created numbers!
+
+In Math::BigInt, passing a negative number precision has no effect since no
+numbers have digits after the dot. In L<Math::BigFloat>, it will round all
+results to P digits after the dot.
+
+Please see the section about L<ACCURACY AND PRECISION> for further details.
+
+Pass an undef value to disable it:
+
+	$x->precision(undef);
+	Math::BigInt->precision(undef);
+
+Returns the current precision. For C<$x->precision()> it will return either the
+local precision of $x, or if not defined, the global. This means the return
+value represents the prevision that will be in effect for $x:
+
+	$y = Math::BigInt->new(1234567);	# unrounded
+	print Math::BigInt->precision(4),"\n";	# set 4, print 4
+	$x = Math::BigInt->new(123456);		# will be automatically rounded
+	print $x;				# print "120000"!
+
+Note: Works also for subclasses like L<Math::BigFloat>. Each class has its
+own globals separated from Math::BigInt, but it is possible to subclass
+Math::BigInt and make the globals of the subclass aliases to the ones from
+Math::BigInt.
+
+=head2 brsft
+
+	$x->brsft($y,$n);		
+
+Shifts $x right by $y in base $n. Default is base 2, used are usually 10 and
+2, but others work, too.
+
+Right shifting usually amounts to dividing $x by $n ** $y and truncating the
+result:
+
+
+	$x = Math::BigInt->new(10);
+	$x->brsft(1);			# same as $x >> 1: 5
+	$x = Math::BigInt->new(1234);
+	$x->brsft(2,10);		# result 12
+
+There is one exception, and that is base 2 with negative $x:
+
+
+	$x = Math::BigInt->new(-5);
+	print $x->brsft(1);
+
+This will print -3, not -2 (as it would if you divide -5 by 2 and truncate the
+result).
+
+=head2 new
+
+  	$x = Math::BigInt->new($str,$A,$P,$R);
+
+Creates a new BigInt object from a scalar or another BigInt object. The
+input is accepted as decimal, hex (with leading '0x') or binary (with leading
+'0b').
+
+See L<Input> for more info on accepted input formats.
+
+=head2 bnan
+
+  	$x = Math::BigInt->bnan();
+
+Creates a new BigInt object representing NaN (Not A Number).
+If used on an object, it will set it to NaN:
+
+	$x->bnan();
+
+=head2 bzero
+
+  	$x = Math::BigInt->bzero();
+
+Creates a new BigInt object representing zero.
+If used on an object, it will set it to zero:
+
+	$x->bzero();
+
+=head2 binf
+
+  	$x = Math::BigInt->binf($sign);
+
+Creates a new BigInt object representing infinity. The optional argument is
+either '-' or '+', indicating whether you want infinity or minus infinity.
+If used on an object, it will set it to infinity:
+
+	$x->binf();
+	$x->binf('-');
+
+=head2 bone
+
+  	$x = Math::BigInt->binf($sign);
+
+Creates a new BigInt object representing one. The optional argument is
+either '-' or '+', indicating whether you want one or minus one.
+If used on an object, it will set it to one:
+
+	$x->bone();		# +1
+	$x->bone('-');		# -1
+
+=head2 is_one()/is_zero()/is_nan()/is_inf()
+
+  
+	$x->is_zero();			# true if arg is +0
+	$x->is_nan();			# true if arg is NaN
+	$x->is_one();			# true if arg is +1
+	$x->is_one('-');		# true if arg is -1
+	$x->is_inf();			# true if +inf
+	$x->is_inf('-');		# true if -inf (sign is default '+')
+
+These methods all test the BigInt for beeing one specific value and return
+true or false depending on the input. These are faster than doing something
+like:
+
+	if ($x == 0)
+
+=head2 is_pos()/is_neg()
+	
+	$x->is_pos();			# true if > 0
+	$x->is_neg();			# true if < 0
+
+The methods return true if the argument is positive or negative, respectively.
+C<NaN> is neither positive nor negative, while C<+inf> counts as positive, and
+C<-inf> is negative. A C<zero> is neither positive nor negative.
+
+These methods are only testing the sign, and not the value.
+
+C<is_positive()> and C<is_negative()> are aliase to C<is_pos()> and
+C<is_neg()>, respectively. C<is_positive()> and C<is_negative()> were
+introduced in v1.36, while C<is_pos()> and C<is_neg()> were only introduced
+in v1.68.
+
+=head2 is_odd()/is_even()/is_int()
+
+	$x->is_odd();			# true if odd, false for even
+	$x->is_even();			# true if even, false for odd
+	$x->is_int();			# true if $x is an integer
+
+The return true when the argument satisfies the condition. C<NaN>, C<+inf>,
+C<-inf> are not integers and are neither odd nor even.
+
+In BigInt, all numbers except C<NaN>, C<+inf> and C<-inf> are integers.
+
+=head2 bcmp
+
+	$x->bcmp($y);
+
+Compares $x with $y and takes the sign into account.
+Returns -1, 0, 1 or undef.
+
+=head2 bacmp
+
+	$x->bacmp($y);
+
+Compares $x with $y while ignoring their. Returns -1, 0, 1 or undef.
+
+=head2 sign
+
+	$x->sign();
+
+Return the sign, of $x, meaning either C<+>, C<->, C<-inf>, C<+inf> or NaN.
+
+If you want $x to have a certain sign, use one of the following methods:
+
+	$x->babs();		# '+'
+	$x->babs()->bneg();	# '-'
+	$x->bnan();		# 'NaN'
+	$x->binf();		# '+inf'
+	$x->binf('-');		# '-inf'
+
+=head2 digit
+
+	$x->digit($n);		# return the nth digit, counting from right
+
+If C<$n> is negative, returns the digit counting from left.
+
+=head2 bneg
+
+	$x->bneg();
+
+Negate the number, e.g. change the sign between '+' and '-', or between '+inf'
+and '-inf', respectively. Does nothing for NaN or zero.
+
+=head2 babs
+
+	$x->babs();
+
+Set the number to it's absolute value, e.g. change the sign from '-' to '+'
+and from '-inf' to '+inf', respectively. Does nothing for NaN or positive
+numbers.
+
+=head2 bnorm
+
+	$x->bnorm();			# normalize (no-op)
+
+=head2 bnot
+
+	$x->bnot();			
+
+Two's complement (bit wise not). This is equivalent to
+
+	$x->binc()->bneg();
+
+but faster.
+
+=head2 binc
+
+	$x->binc();			# increment x by 1
+
+=head2 bdec
+
+	$x->bdec();			# decrement x by 1
+
+=head2 badd
+
+	$x->badd($y);			# addition (add $y to $x)
+
+=head2 bsub
+
+	$x->bsub($y);			# subtraction (subtract $y from $x)
+
+=head2 bmul
+
+	$x->bmul($y);			# multiplication (multiply $x by $y)
+
+=head2 bdiv
+
+	$x->bdiv($y);			# divide, set $x to quotient
+					# return (quo,rem) or quo if scalar
+
+=head2 bmod
+
+	$x->bmod($y);			# modulus (x % y)
+
+=head2 bmodinv
+
+	num->bmodinv($mod);		# modular inverse
+
+Returns the inverse of C<$num> in the given modulus C<$mod>.  'C<NaN>' is
+returned unless C<$num> is relatively prime to C<$mod>, i.e. unless
+C<bgcd($num, $mod)==1>.
+
+=head2 bmodpow
+
+	$num->bmodpow($exp,$mod);	# modular exponentation
+					# ($num**$exp % $mod)
+
+Returns the value of C<$num> taken to the power C<$exp> in the modulus
+C<$mod> using binary exponentation.  C<bmodpow> is far superior to
+writing
+
+	$num ** $exp % $mod
+
+because it is much faster - it reduces internal variables into
+the modulus whenever possible, so it operates on smaller numbers.
+
+C<bmodpow> also supports negative exponents.
+
+	bmodpow($num, -1, $mod)
+
+is exactly equivalent to
+
+	bmodinv($num, $mod)
+
+=head2 bpow
+
+	$x->bpow($y);			# power of arguments (x ** y)
+
+=head2 blsft
+
+	$x->blsft($y);		# left shift
+	$x->blsft($y,$n);	# left shift, in base $n (like 10)
+
+=head2 brsft
+
+	$x->brsft($y);		# right shift 
+	$x->brsft($y,$n);	# right shift, in base $n (like 10)
+
+=head2 band
+
+	$x->band($y);			# bitwise and
+
+=head2 bior
+
+	$x->bior($y);			# bitwise inclusive or
+
+=head2 bxor
+
+	$x->bxor($y);			# bitwise exclusive or
+
+=head2 bnot
+
+	$x->bnot();			# bitwise not (two's complement)
+
+=head2 bsqrt
+
+	$x->bsqrt();			# calculate square-root
+
+=head2 bfac
+
+	$x->bfac();			# factorial of $x (1*2*3*4*..$x)
+
+=head2 round
+
+	$x->round($A,$P,$round_mode);
+	
+Round $x to accuracy C<$A> or precision C<$P> using the round mode
+C<$round_mode>.
+
+=head2 bround
+
+	$x->bround($N);               # accuracy: preserve $N digits
+
+=head2 bfround
+
+	$x->bfround($N);              # round to $Nth digit, no-op for BigInts
+
+=head2 bfloor
+
+	$x->bfloor();			
+
+Set $x to the integer less or equal than $x. This is a no-op in BigInt, but
+does change $x in BigFloat.
+
+=head2 bceil
+
+	$x->bceil();
+
+Set $x to the integer greater or equal than $x. This is a no-op in BigInt, but
+does change $x in BigFloat.
+
+=head2 bgcd
+
+	bgcd(@values);		# greatest common divisor (no OO style)
+
+=head2 blcm
+
+	blcm(@values);		# lowest common multiplicator (no OO style)
+ 
+head2 length
+
+	$x->length();
+        ($xl,$fl) = $x->length();
+
+Returns the number of digits in the decimal representation of the number.
+In list context, returns the length of the integer and fraction part. For
+BigInt's, the length of the fraction part will always be 0.
+
+=head2 exponent
+
+	$x->exponent();
+
+Return the exponent of $x as BigInt.
+
+=head2 mantissa
+
+	$x->mantissa();
+
+Return the signed mantissa of $x as BigInt.
+
+=head2 parts
+
+	$x->parts();		# return (mantissa,exponent) as BigInt
+
+=head2 copy
+
+	$x->copy();		# make a true copy of $x (unlike $y = $x;)
+
+=head2 as_int
+
+	$x->as_int();	
+
+Returns $x as a BigInt (truncated towards zero). In BigInt this is the same as
+C<copy()>. 
+
+C<as_number()> is an alias to this method. C<as_number> was introduced in
+v1.22, while C<as_int()> was only introduced in v1.68.
+  
+=head2 bstr
+
+	$x->bstr();
+
+Returns a normalized string represantation of C<$x>.
+
+=head2 bsstr
+
+	$x->bsstr();		# normalized string in scientific notation
+
+=head2 as_hex
+
+	$x->as_hex();		# as signed hexadecimal string with prefixed 0x
+
+=head2 as_bin
+
+	$x->as_bin();		# as signed binary string with prefixed 0b
+
+=head1 ACCURACY and PRECISION
+
+Since version v1.33, Math::BigInt and Math::BigFloat have full support for
+accuracy and precision based rounding, both automatically after every
+operation, as well as manually.
+
+This section describes the accuracy/precision handling in Math::Big* as it
+used to be and as it is now, complete with an explanation of all terms and
+abbreviations.
+
+Not yet implemented things (but with correct description) are marked with '!',
+things that need to be answered are marked with '?'.
+
+In the next paragraph follows a short description of terms used here (because
+these may differ from terms used by others people or documentation).
+
+During the rest of this document, the shortcuts A (for accuracy), P (for
+precision), F (fallback) and R (rounding mode) will be used.
+
+=head2 Precision P
+
+A fixed number of digits before (positive) or after (negative)
+the decimal point. For example, 123.45 has a precision of -2. 0 means an
+integer like 123 (or 120). A precision of 2 means two digits to the left
+of the decimal point are zero, so 123 with P = 1 becomes 120. Note that
+numbers with zeros before the decimal point may have different precisions,
+because 1200 can have p = 0, 1 or 2 (depending on what the inital value
+was). It could also have p < 0, when the digits after the decimal point
+are zero.
+
+The string output (of floating point numbers) will be padded with zeros:
+ 
+	Initial value   P       A	Result          String
+	------------------------------------------------------------
+	1234.01         -3      	1000            1000
+	1234            -2      	1200            1200
+	1234.5          -1      	1230            1230
+	1234.001        1       	1234            1234.0
+	1234.01         0       	1234            1234
+	1234.01         2       	1234.01		1234.01
+	1234.01         5       	1234.01		1234.01000
+
+For BigInts, no padding occurs.
+
+=head2 Accuracy A
+
+Number of significant digits. Leading zeros are not counted. A
+number may have an accuracy greater than the non-zero digits
+when there are zeros in it or trailing zeros. For example, 123.456 has
+A of 6, 10203 has 5, 123.0506 has 7, 123.450000 has 8 and 0.000123 has 3.
+
+The string output (of floating point numbers) will be padded with zeros:
+
+	Initial value   P       A	Result          String
+	------------------------------------------------------------
+	1234.01			3	1230		1230
+	1234.01			6	1234.01		1234.01
+	1234.1			8	1234.1		1234.1000
+
+For BigInts, no padding occurs.
+
+=head2 Fallback F
+
+When both A and P are undefined, this is used as a fallback accuracy when
+dividing numbers.
+
+=head2 Rounding mode R
+
+When rounding a number, different 'styles' or 'kinds'
+of rounding are possible. (Note that random rounding, as in
+Math::Round, is not implemented.)
+
+=over 2
+
+=item 'trunc'
+
+truncation invariably removes all digits following the
+rounding place, replacing them with zeros. Thus, 987.65 rounded
+to tens (P=1) becomes 980, and rounded to the fourth sigdig
+becomes 987.6 (A=4). 123.456 rounded to the second place after the
+decimal point (P=-2) becomes 123.46.
+
+All other implemented styles of rounding attempt to round to the
+"nearest digit." If the digit D immediately to the right of the
+rounding place (skipping the decimal point) is greater than 5, the
+number is incremented at the rounding place (possibly causing a
+cascade of incrementation): e.g. when rounding to units, 0.9 rounds
+to 1, and -19.9 rounds to -20. If D < 5, the number is similarly
+truncated at the rounding place: e.g. when rounding to units, 0.4
+rounds to 0, and -19.4 rounds to -19.
+
+However the results of other styles of rounding differ if the
+digit immediately to the right of the rounding place (skipping the
+decimal point) is 5 and if there are no digits, or no digits other
+than 0, after that 5. In such cases:
+
+=item 'even'
+
+rounds the digit at the rounding place to 0, 2, 4, 6, or 8
+if it is not already. E.g., when rounding to the first sigdig, 0.45
+becomes 0.4, -0.55 becomes -0.6, but 0.4501 becomes 0.5.
+
+=item 'odd'
+
+rounds the digit at the rounding place to 1, 3, 5, 7, or 9 if
+it is not already. E.g., when rounding to the first sigdig, 0.45
+becomes 0.5, -0.55 becomes -0.5, but 0.5501 becomes 0.6.
+
+=item '+inf'
+
+round to plus infinity, i.e. always round up. E.g., when
+rounding to the first sigdig, 0.45 becomes 0.5, -0.55 becomes -0.5,
+and 0.4501 also becomes 0.5.
+
+=item '-inf'
+
+round to minus infinity, i.e. always round down. E.g., when
+rounding to the first sigdig, 0.45 becomes 0.4, -0.55 becomes -0.6,
+but 0.4501 becomes 0.5.
+
+=item 'zero'
+
+round to zero, i.e. positive numbers down, negative ones up.
+E.g., when rounding to the first sigdig, 0.45 becomes 0.4, -0.55
+becomes -0.5, but 0.4501 becomes 0.5.
+
+=back
+
+The handling of A & P in MBI/MBF (the old core code shipped with Perl
+versions <= 5.7.2) is like this:
+
+=over 2
+
+=item Precision
+
+  * ffround($p) is able to round to $p number of digits after the decimal
+    point
+  * otherwise P is unused
+
+=item Accuracy (significant digits)
+
+  * fround($a) rounds to $a significant digits
+  * only fdiv() and fsqrt() take A as (optional) paramater
+    + other operations simply create the same number (fneg etc), or more (fmul)
+      of digits
+    + rounding/truncating is only done when explicitly calling one of fround
+      or ffround, and never for BigInt (not implemented)
+  * fsqrt() simply hands its accuracy argument over to fdiv.
+  * the documentation and the comment in the code indicate two different ways
+    on how fdiv() determines the maximum number of digits it should calculate,
+    and the actual code does yet another thing
+    POD:
+      max($Math::BigFloat::div_scale,length(dividend)+length(divisor))
+    Comment:
+      result has at most max(scale, length(dividend), length(divisor)) digits
+    Actual code:
+      scale = max(scale, length(dividend)-1,length(divisor)-1);
+      scale += length(divisior) - length(dividend);
+    So for lx = 3, ly = 9, scale = 10, scale will actually be 16 (10+9-3).
+    Actually, the 'difference' added to the scale is calculated from the
+    number of "significant digits" in dividend and divisor, which is derived
+    by looking at the length of the mantissa. Which is wrong, since it includes
+    the + sign (oops) and actually gets 2 for '+100' and 4 for '+101'. Oops
+    again. Thus 124/3 with div_scale=1 will get you '41.3' based on the strange
+    assumption that 124 has 3 significant digits, while 120/7 will get you
+    '17', not '17.1' since 120 is thought to have 2 significant digits.
+    The rounding after the division then uses the remainder and $y to determine
+    wether it must round up or down.
+ ?  I have no idea which is the right way. That's why I used a slightly more
+ ?  simple scheme and tweaked the few failing testcases to match it.
+
+=back
+
+This is how it works now:
+
+=over 2
+
+=item Setting/Accessing
+
+  * You can set the A global via C<< Math::BigInt->accuracy() >> or
+    C<< Math::BigFloat->accuracy() >> or whatever class you are using.
+  * You can also set P globally by using C<< Math::SomeClass->precision() >>
+    likewise.
+  * Globals are classwide, and not inherited by subclasses.
+  * to undefine A, use C<< Math::SomeCLass->accuracy(undef); >>
+  * to undefine P, use C<< Math::SomeClass->precision(undef); >>
+  * Setting C<< Math::SomeClass->accuracy() >> clears automatically
+    C<< Math::SomeClass->precision() >>, and vice versa.
+  * To be valid, A must be > 0, P can have any value.
+  * If P is negative, this means round to the P'th place to the right of the
+    decimal point; positive values mean to the left of the decimal point.
+    P of 0 means round to integer.
+  * to find out the current global A, use C<< Math::SomeClass->accuracy() >>
+  * to find out the current global P, use C<< Math::SomeClass->precision() >>
+  * use C<< $x->accuracy() >> respective C<< $x->precision() >> for the local
+    setting of C<< $x >>.
+  * Please note that C<< $x->accuracy() >> respecive C<< $x->precision() >>
+    return eventually defined global A or P, when C<< $x >>'s A or P is not
+    set.
+
+=item Creating numbers
+
+  * When you create a number, you can give it's desired A or P via:
+    $x = Math::BigInt->new($number,$A,$P);
+  * Only one of A or P can be defined, otherwise the result is NaN
+  * If no A or P is give ($x = Math::BigInt->new($number) form), then the
+    globals (if set) will be used. Thus changing the global defaults later on
+    will not change the A or P of previously created numbers (i.e., A and P of
+    $x will be what was in effect when $x was created)
+  * If given undef for A and P, B<no> rounding will occur, and the globals will
+    B<not> be used. This is used by subclasses to create numbers without
+    suffering rounding in the parent. Thus a subclass is able to have it's own
+    globals enforced upon creation of a number by using
+    C<< $x = Math::BigInt->new($number,undef,undef) >>:
+
+	use Math::BigInt::SomeSubclass;
+	use Math::BigInt;
+
+	Math::BigInt->accuracy(2);
+	Math::BigInt::SomeSubClass->accuracy(3);
+	$x = Math::BigInt::SomeSubClass->new(1234);	
+
+    $x is now 1230, and not 1200. A subclass might choose to implement
+    this otherwise, e.g. falling back to the parent's A and P.
+
+=item Usage
+
+  * If A or P are enabled/defined, they are used to round the result of each
+    operation according to the rules below
+  * Negative P is ignored in Math::BigInt, since BigInts never have digits
+    after the decimal point
+  * Math::BigFloat uses Math::BigInt internally, but setting A or P inside
+    Math::BigInt as globals does not tamper with the parts of a BigFloat.
+    A flag is used to mark all Math::BigFloat numbers as 'never round'.
+
+=item Precedence
+
+  * It only makes sense that a number has only one of A or P at a time.
+    If you set either A or P on one object, or globally, the other one will
+    be automatically cleared.
+  * If two objects are involved in an operation, and one of them has A in
+    effect, and the other P, this results in an error (NaN).
+  * A takes precendence over P (Hint: A comes before P).
+    If neither of them is defined, nothing is used, i.e. the result will have
+    as many digits as it can (with an exception for fdiv/fsqrt) and will not
+    be rounded.
+  * There is another setting for fdiv() (and thus for fsqrt()). If neither of
+    A or P is defined, fdiv() will use a fallback (F) of $div_scale digits.
+    If either the dividend's or the divisor's mantissa has more digits than
+    the value of F, the higher value will be used instead of F.
+    This is to limit the digits (A) of the result (just consider what would
+    happen with unlimited A and P in the case of 1/3 :-)
+  * fdiv will calculate (at least) 4 more digits than required (determined by
+    A, P or F), and, if F is not used, round the result
+    (this will still fail in the case of a result like 0.12345000000001 with A
+    or P of 5, but this can not be helped - or can it?)
+  * Thus you can have the math done by on Math::Big* class in two modi:
+    + never round (this is the default):
+      This is done by setting A and P to undef. No math operation
+      will round the result, with fdiv() and fsqrt() as exceptions to guard
+      against overflows. You must explicitely call bround(), bfround() or
+      round() (the latter with parameters).
+      Note: Once you have rounded a number, the settings will 'stick' on it
+      and 'infect' all other numbers engaged in math operations with it, since
+      local settings have the highest precedence. So, to get SaferRound[tm],
+      use a copy() before rounding like this:
+
+        $x = Math::BigFloat->new(12.34);
+        $y = Math::BigFloat->new(98.76);
+        $z = $x * $y;                           # 1218.6984
+        print $x->copy()->fround(3);            # 12.3 (but A is now 3!)
+        $z = $x * $y;                           # still 1218.6984, without
+                                                # copy would have been 1210!
+
+    + round after each op:
+      After each single operation (except for testing like is_zero()), the
+      method round() is called and the result is rounded appropriately. By
+      setting proper values for A and P, you can have all-the-same-A or
+      all-the-same-P modes. For example, Math::Currency might set A to undef,
+      and P to -2, globally.
+
+ ?Maybe an extra option that forbids local A & P settings would be in order,
+ ?so that intermediate rounding does not 'poison' further math? 
+
+=item Overriding globals
+
+  * you will be able to give A, P and R as an argument to all the calculation
+    routines; the second parameter is A, the third one is P, and the fourth is
+    R (shift right by one for binary operations like badd). P is used only if
+    the first parameter (A) is undefined. These three parameters override the
+    globals in the order detailed as follows, i.e. the first defined value
+    wins:
+    (local: per object, global: global default, parameter: argument to sub)
+      + parameter A
+      + parameter P
+      + local A (if defined on both of the operands: smaller one is taken)
+      + local P (if defined on both of the operands: bigger one is taken)
+      + global A
+      + global P
+      + global F
+  * fsqrt() will hand its arguments to fdiv(), as it used to, only now for two
+    arguments (A and P) instead of one
+
+=item Local settings
+
+  * You can set A or P locally by using C<< $x->accuracy() >> or
+    C<< $x->precision() >>
+    and thus force different A and P for different objects/numbers.
+  * Setting A or P this way immediately rounds $x to the new value.
+  * C<< $x->accuracy() >> clears C<< $x->precision() >>, and vice versa.
+
+=item Rounding
+
+  * the rounding routines will use the respective global or local settings.
+    fround()/bround() is for accuracy rounding, while ffround()/bfround()
+    is for precision
+  * the two rounding functions take as the second parameter one of the
+    following rounding modes (R):
+    'even', 'odd', '+inf', '-inf', 'zero', 'trunc'
+  * you can set/get the global R by using C<< Math::SomeClass->round_mode() >>
+    or by setting C<< $Math::SomeClass::round_mode >>
+  * after each operation, C<< $result->round() >> is called, and the result may
+    eventually be rounded (that is, if A or P were set either locally,
+    globally or as parameter to the operation)
+  * to manually round a number, call C<< $x->round($A,$P,$round_mode); >>
+    this will round the number by using the appropriate rounding function
+    and then normalize it.
+  * rounding modifies the local settings of the number:
+
+        $x = Math::BigFloat->new(123.456);
+        $x->accuracy(5);
+        $x->bround(4);
+
+    Here 4 takes precedence over 5, so 123.5 is the result and $x->accuracy()
+    will be 4 from now on.
+
+=item Default values
+
+  * R: 'even'
+  * F: 40
+  * A: undef
+  * P: undef
+
+=item Remarks
+
+  * The defaults are set up so that the new code gives the same results as
+    the old code (except in a few cases on fdiv):
+    + Both A and P are undefined and thus will not be used for rounding
+      after each operation.
+    + round() is thus a no-op, unless given extra parameters A and P
+
+=back
+
+=head1 Infinity and Not a Number
+
+While BigInt has extensive handling of inf and NaN, certain quirks remain.
+
+=over 2
+
+=item oct()/hex()
+
+These perl routines currently (as of Perl v.5.8.6) cannot handle passed
+inf.
+
+	te@linux:~> perl -wle 'print 2 ** 3333'
+	inf
+	te@linux:~> perl -wle 'print 2 ** 3333 == 2 ** 3333'
+	1
+	te@linux:~> perl -wle 'print oct(2 ** 3333)'
+	0
+	te@linux:~> perl -wle 'print hex(2 ** 3333)'
+	Illegal hexadecimal digit 'i' ignored at -e line 1.
+	0
+
+The same problems occur if you pass them Math::BigInt->binf() objects. Since
+overloading these routines is not possible, this cannot be fixed from BigInt.
+
+=item ==, !=, <, >, <=, >= with NaNs
+
+BigInt's bcmp() routine currently returns undef to signal that a NaN was
+involved in a comparisation. However, the overload code turns that into
+either 1 or '' and thus operations like C<< NaN != NaN >> might return
+wrong values.
+
+=item log(-inf)
+
+C<< log(-inf) >> is highly weird. Since log(-x)=pi*i+log(x), then
+log(-inf)=pi*i+inf. However, since the imaginary part is finite, the real
+infinity "overshadows" it, so the number might as well just be infinity.
+However, the result is a complex number, and since BigInt/BigFloat can only
+have real numbers as results, the result is NaN.
+
+=item exp(), cos(), sin(), atan2()
+
+These all might have problems handling infinity right.
+ 
+=back
+
+=head1 INTERNALS
+
+The actual numbers are stored as unsigned big integers (with seperate sign).
+
+You should neither care about nor depend on the internal representation; it
+might change without notice. Use B<ONLY> method calls like C<< $x->sign(); >>
+instead relying on the internal representation.
+
+=head2 MATH LIBRARY
+
+Math with the numbers is done (by default) by a module called
+C<Math::BigInt::Calc>. This is equivalent to saying:
+
+	use Math::BigInt lib => 'Calc';
+
+You can change this by using:
+
+	use Math::BigInt lib => 'BitVect';
+
+The following would first try to find Math::BigInt::Foo, then
+Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
+
+	use Math::BigInt lib => 'Foo,Math::BigInt::Bar';
+
+Since Math::BigInt::GMP is in almost all cases faster than Calc (especially in
+math involving really big numbers, where it is B<much> faster), and there is
+no penalty if Math::BigInt::GMP is not installed, it is a good idea to always
+use the following:
+
+	use Math::BigInt lib => 'GMP';
+
+Different low-level libraries use different formats to store the
+numbers. You should B<NOT> depend on the number having a specific format
+internally.
+
+See the respective math library module documentation for further details.
+
+=head2 SIGN
+
+The sign is either '+', '-', 'NaN', '+inf' or '-inf'.
+
+A sign of 'NaN' is used to represent the result when input arguments are not
+numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
+minus infinity. You will get '+inf' when dividing a positive number by 0, and
+'-inf' when dividing any negative number by 0.
+
+=head2 mantissa(), exponent() and parts()
+
+C<mantissa()> and C<exponent()> return the said parts of the BigInt such
+that:
+
+        $m = $x->mantissa();
+        $e = $x->exponent();
+        $y = $m * ( 10 ** $e );
+        print "ok\n" if $x == $y;
+
+C<< ($m,$e) = $x->parts() >> is just a shortcut that gives you both of them
+in one go. Both the returned mantissa and exponent have a sign.
+
+Currently, for BigInts C<$e> is always 0, except for NaN, +inf and -inf,
+where it is C<NaN>; and for C<$x == 0>, where it is C<1> (to be compatible
+with Math::BigFloat's internal representation of a zero as C<0E1>).
+
+C<$m> is currently just a copy of the original number. The relation between
+C<$e> and C<$m> will stay always the same, though their real values might
+change.
+
+=head1 EXAMPLES
+ 
+  use Math::BigInt;
+
+  sub bint { Math::BigInt->new(shift); }
+
+  $x = Math::BigInt->bstr("1234")      	# string "1234"
+  $x = "$x";                         	# same as bstr()
+  $x = Math::BigInt->bneg("1234");   	# BigInt "-1234"
+  $x = Math::BigInt->babs("-12345"); 	# BigInt "12345"
+  $x = Math::BigInt->bnorm("-0 00"); 	# BigInt "0"
+  $x = bint(1) + bint(2);            	# BigInt "3"
+  $x = bint(1) + "2";                	# ditto (auto-BigIntify of "2")
+  $x = bint(1);                      	# BigInt "1"
+  $x = $x + 5 / 2;                   	# BigInt "3"
+  $x = $x ** 3;                      	# BigInt "27"
+  $x *= 2;                           	# BigInt "54"
+  $x = Math::BigInt->new(0);       	# BigInt "0"
+  $x--;                              	# BigInt "-1"
+  $x = Math::BigInt->badd(4,5)		# BigInt "9"
+  print $x->bsstr();			# 9e+0
+
+Examples for rounding:
+
+  use Math::BigFloat;
+  use Test;
+
+  $x = Math::BigFloat->new(123.4567);
+  $y = Math::BigFloat->new(123.456789);
+  Math::BigFloat->accuracy(4);		# no more A than 4
+
+  ok ($x->copy()->fround(),123.4);	# even rounding
+  print $x->copy()->fround(),"\n";	# 123.4
+  Math::BigFloat->round_mode('odd');	# round to odd
+  print $x->copy()->fround(),"\n";	# 123.5
+  Math::BigFloat->accuracy(5);		# no more A than 5
+  Math::BigFloat->round_mode('odd');	# round to odd
+  print $x->copy()->fround(),"\n";	# 123.46
+  $y = $x->copy()->fround(4),"\n";	# A = 4: 123.4
+  print "$y, ",$y->accuracy(),"\n";	# 123.4, 4
+
+  Math::BigFloat->accuracy(undef);	# A not important now
+  Math::BigFloat->precision(2); 	# P important
+  print $x->copy()->bnorm(),"\n";	# 123.46
+  print $x->copy()->fround(),"\n";	# 123.46
+
+Examples for converting:
+
+  my $x = Math::BigInt->new('0b1'.'01' x 123);
+  print "bin: ",$x->as_bin()," hex:",$x->as_hex()," dec: ",$x,"\n";
+
+=head1 Autocreating constants
+
+After C<use Math::BigInt ':constant'> all the B<integer> decimal, hexadecimal
+and binary constants in the given scope are converted to C<Math::BigInt>.
+This conversion happens at compile time. 
+
+In particular,
+
+  perl -MMath::BigInt=:constant -e 'print 2**100,"\n"'
+
+prints the integer value of C<2**100>. Note that without conversion of 
+constants the expression 2**100 will be calculated as perl scalar.
+
+Please note that strings and floating point constants are not affected,
+so that
+
+  	use Math::BigInt qw/:constant/;
+
+	$x = 1234567890123456789012345678901234567890
+		+ 123456789123456789;
+	$y = '1234567890123456789012345678901234567890'
+		+ '123456789123456789';
+
+do not work. You need an explicit Math::BigInt->new() around one of the
+operands. You should also quote large constants to protect loss of precision:
+
+	use Math::BigInt;
+
+	$x = Math::BigInt->new('1234567889123456789123456789123456789');
+
+Without the quotes Perl would convert the large number to a floating point
+constant at compile time and then hand the result to BigInt, which results in
+an truncated result or a NaN.
+
+This also applies to integers that look like floating point constants:
+
+	use Math::BigInt ':constant';
+
+	print ref(123e2),"\n";
+	print ref(123.2e2),"\n";
+
+will print nothing but newlines. Use either L<bignum> or L<Math::BigFloat>
+to get this to work.
+
+=head1 PERFORMANCE
+
+Using the form $x += $y; etc over $x = $x + $y is faster, since a copy of $x
+must be made in the second case. For long numbers, the copy can eat up to 20%
+of the work (in the case of addition/subtraction, less for
+multiplication/division). If $y is very small compared to $x, the form
+$x += $y is MUCH faster than $x = $x + $y since making the copy of $x takes
+more time then the actual addition.
+
+With a technique called copy-on-write, the cost of copying with overload could
+be minimized or even completely avoided. A test implementation of COW did show
+performance gains for overloaded math, but introduced a performance loss due
+to a constant overhead for all other operatons. So Math::BigInt does currently
+not COW.
+
+The rewritten version of this module (vs. v0.01) is slower on certain
+operations, like C<new()>, C<bstr()> and C<numify()>. The reason are that it
+does now more work and handles much more cases. The time spent in these
+operations is usually gained in the other math operations so that code on
+the average should get (much) faster. If they don't, please contact the author.
+
+Some operations may be slower for small numbers, but are significantly faster
+for big numbers. Other operations are now constant (O(1), like C<bneg()>,
+C<babs()> etc), instead of O(N) and thus nearly always take much less time.
+These optimizations were done on purpose.
+
+If you find the Calc module to slow, try to install any of the replacement
+modules and see if they help you. 
+
+=head2 Alternative math libraries
+
+You can use an alternative library to drive Math::BigInt via:
+
+	use Math::BigInt lib => 'Module';
+
+See L<MATH LIBRARY> for more information.
+
+For more benchmark results see L<http://bloodgate.com/perl/benchmarks.html>.
+
+=head2 SUBCLASSING
+
+=head1 Subclassing Math::BigInt
+
+The basic design of Math::BigInt allows simple subclasses with very little
+work, as long as a few simple rules are followed:
+
+=over 2
+
+=item *
+
+The public API must remain consistent, i.e. if a sub-class is overloading
+addition, the sub-class must use the same name, in this case badd(). The
+reason for this is that Math::BigInt is optimized to call the object methods
+directly.
+
+=item *
+
+The private object hash keys like C<$x->{sign}> may not be changed, but
+additional keys can be added, like C<$x->{_custom}>.
+
+=item *
+
+Accessor functions are available for all existing object hash keys and should
+be used instead of directly accessing the internal hash keys. The reason for
+this is that Math::BigInt itself has a pluggable interface which permits it
+to support different storage methods.
+
+=back
+
+More complex sub-classes may have to replicate more of the logic internal of
+Math::BigInt if they need to change more basic behaviors. A subclass that
+needs to merely change the output only needs to overload C<bstr()>. 
+
+All other object methods and overloaded functions can be directly inherited
+from the parent class.
+
+At the very minimum, any subclass will need to provide it's own C<new()> and can
+store additional hash keys in the object. There are also some package globals
+that must be defined, e.g.:
+
+  # Globals
+  $accuracy = undef;
+  $precision = -2;       # round to 2 decimal places
+  $round_mode = 'even';
+  $div_scale = 40;
+
+Additionally, you might want to provide the following two globals to allow
+auto-upgrading and auto-downgrading to work correctly:
+
+  $upgrade = undef;
+  $downgrade = undef;
+
+This allows Math::BigInt to correctly retrieve package globals from the 
+subclass, like C<$SubClass::precision>.  See t/Math/BigInt/Subclass.pm or
+t/Math/BigFloat/SubClass.pm completely functional subclass examples.
+
+Don't forget to 
+
+	use overload;
+
+in your subclass to automatically inherit the overloading from the parent. If
+you like, you can change part of the overloading, look at Math::String for an
+example.
+
+=head1 UPGRADING
+
+When used like this:
+
+	use Math::BigInt upgrade => 'Foo::Bar';
+
+certain operations will 'upgrade' their calculation and thus the result to
+the class Foo::Bar. Usually this is used in conjunction with Math::BigFloat:
+
+	use Math::BigInt upgrade => 'Math::BigFloat';
+
+As a shortcut, you can use the module C<bignum>:
+
+	use bignum;
+
+Also good for oneliners:
+
+	perl -Mbignum -le 'print 2 ** 255'
+
+This makes it possible to mix arguments of different classes (as in 2.5 + 2)
+as well es preserve accuracy (as in sqrt(3)).
+
+Beware: This feature is not fully implemented yet.
+
+=head2 Auto-upgrade
+
+The following methods upgrade themselves unconditionally; that is if upgrade
+is in effect, they will always hand up their work:
+
+=over 2
+
+=item bsqrt()
+
+=item div()
+
+=item blog()
+
+=back
+
+Beware: This list is not complete.
+
+All other methods upgrade themselves only when one (or all) of their
+arguments are of the class mentioned in $upgrade (This might change in later
+versions to a more sophisticated scheme):
+
+=head1 BUGS
+
+=over 2
+
+=item broot() does not work
+
+The broot() function in BigInt may only work for small values. This will be
+fixed in a later version.
+
+=item Out of Memory!
+
+Under Perl prior to 5.6.0 having an C<use Math::BigInt ':constant';> and 
+C<eval()> in your code will crash with "Out of memory". This is probably an
+overload/exporter bug. You can workaround by not having C<eval()> 
+and ':constant' at the same time or upgrade your Perl to a newer version.
+
+=item Fails to load Calc on Perl prior 5.6.0
+
+Since eval(' use ...') can not be used in conjunction with ':constant', BigInt
+will fall back to eval { require ... } when loading the math lib on Perls
+prior to 5.6.0. This simple replaces '::' with '/' and thus might fail on
+filesystems using a different seperator.  
+
+=back
+
+=head1 CAVEATS
+
+Some things might not work as you expect them. Below is documented what is
+known to be troublesome:
+
+=over 1
+
+=item bstr(), bsstr() and 'cmp'
+
+Both C<bstr()> and C<bsstr()> as well as automated stringify via overload now
+drop the leading '+'. The old code would return '+3', the new returns '3'.
+This is to be consistent with Perl and to make C<cmp> (especially with
+overloading) to work as you expect. It also solves problems with C<Test.pm>,
+because it's C<ok()> uses 'eq' internally. 
+
+Mark Biggar said, when asked about to drop the '+' altogether, or make only
+C<cmp> work:
+
+	I agree (with the first alternative), don't add the '+' on positive
+	numbers.  It's not as important anymore with the new internal 
+	form for numbers.  It made doing things like abs and neg easier,
+	but those have to be done differently now anyway.
+
+So, the following examples will now work all as expected:
+
+	use Test;
+        BEGIN { plan tests => 1 }
+	use Math::BigInt;
+
+	my $x = new Math::BigInt 3*3;
+	my $y = new Math::BigInt 3*3;
+
+	ok ($x,3*3);
+	print "$x eq 9" if $x eq $y;
+	print "$x eq 9" if $x eq '9';
+	print "$x eq 9" if $x eq 3*3;
+
+Additionally, the following still works:
+	
+	print "$x == 9" if $x == $y;
+	print "$x == 9" if $x == 9;
+	print "$x == 9" if $x == 3*3;
+
+There is now a C<bsstr()> method to get the string in scientific notation aka
+C<1e+2> instead of C<100>. Be advised that overloaded 'eq' always uses bstr()
+for comparisation, but Perl will represent some numbers as 100 and others
+as 1e+308. If in doubt, convert both arguments to Math::BigInt before 
+comparing them as strings:
+
+	use Test;
+        BEGIN { plan tests => 3 }
+	use Math::BigInt;
+
+	$x = Math::BigInt->new('1e56'); $y = 1e56;
+	ok ($x,$y);			# will fail
+	ok ($x->bsstr(),$y);		# okay
+	$y = Math::BigInt->new($y);
+	ok ($x,$y);			# okay
+
+Alternatively, simple use C<< <=> >> for comparisations, this will get it
+always right. There is not yet a way to get a number automatically represented
+as a string that matches exactly the way Perl represents it.
+
+See also the section about L<Infinity and Not a Number> for problems in
+comparing NaNs.
+
+=item int()
+
+C<int()> will return (at least for Perl v5.7.1 and up) another BigInt, not a 
+Perl scalar:
+
+	$x = Math::BigInt->new(123);
+	$y = int($x);				# BigInt 123
+	$x = Math::BigFloat->new(123.45);
+	$y = int($x);				# BigInt 123
+
+In all Perl versions you can use C<as_number()> or C<as_int> for the same
+effect:
+
+	$x = Math::BigFloat->new(123.45);
+	$y = $x->as_number();			# BigInt 123
+	$y = $x->as_int();			# ditto
+
+This also works for other subclasses, like Math::String.
+
+It is yet unlcear whether overloaded int() should return a scalar or a BigInt.
+
+If you want a real Perl scalar, use C<numify()>:
+
+	$y = $x->numify();			# 123 as scalar
+
+This is seldom necessary, though, because this is done automatically, like
+when you access an array:
+
+	$z = $array[$x];			# does work automatically
+
+=item length
+
+The following will probably not do what you expect:
+
+	$c = Math::BigInt->new(123);
+	print $c->length(),"\n";		# prints 30
+
+It prints both the number of digits in the number and in the fraction part
+since print calls C<length()> in list context. Use something like: 
+	
+	print scalar $c->length(),"\n";		# prints 3 
+
+=item bdiv
+
+The following will probably not do what you expect:
+
+	print $c->bdiv(10000),"\n";
+
+It prints both quotient and remainder since print calls C<bdiv()> in list
+context. Also, C<bdiv()> will modify $c, so be carefull. You probably want
+to use
+	
+	print $c / 10000,"\n";
+	print scalar $c->bdiv(10000),"\n";  # or if you want to modify $c
+
+instead.
+
+The quotient is always the greatest integer less than or equal to the
+real-valued quotient of the two operands, and the remainder (when it is
+nonzero) always has the same sign as the second operand; so, for
+example,
+
+	  1 / 4  => ( 0, 1)
+	  1 / -4 => (-1,-3)
+	 -3 / 4  => (-1, 1)
+	 -3 / -4 => ( 0,-3)
+	-11 / 2  => (-5,1)
+	 11 /-2  => (-5,-1)
+
+As a consequence, the behavior of the operator % agrees with the
+behavior of Perl's built-in % operator (as documented in the perlop
+manpage), and the equation
+
+	$x == ($x / $y) * $y + ($x % $y)
+
+holds true for any $x and $y, which justifies calling the two return
+values of bdiv() the quotient and remainder. The only exception to this rule
+are when $y == 0 and $x is negative, then the remainder will also be
+negative. See below under "infinity handling" for the reasoning behing this.
+
+Perl's 'use integer;' changes the behaviour of % and / for scalars, but will
+not change BigInt's way to do things. This is because under 'use integer' Perl
+will do what the underlying C thinks is right and this is different for each
+system. If you need BigInt's behaving exactly like Perl's 'use integer', bug
+the author to implement it ;)
+
+=item infinity handling
+
+Here are some examples that explain the reasons why certain results occur while
+handling infinity:
+
+The following table shows the result of the division and the remainder, so that
+the equation above holds true. Some "ordinary" cases are strewn in to show more
+clearly the reasoning:
+
+	A /  B  =   C,     R so that C *    B +    R =    A
+     =========================================================
+	5 /   8 =   0,     5 	     0 *    8 +    5 =    5
+	0 /   8 =   0,     0	     0 *    8 +    0 =    0
+	0 / inf =   0,     0	     0 *  inf +    0 =    0
+	0 /-inf =   0,     0	     0 * -inf +    0 =    0
+	5 / inf =   0,     5	     0 *  inf +    5 =    5
+	5 /-inf =   0,     5	     0 * -inf +    5 =    5
+	-5/ inf =   0,    -5	     0 *  inf +   -5 =   -5
+	-5/-inf =   0,    -5	     0 * -inf +   -5 =   -5
+       inf/   5 =  inf,    0	   inf *    5 +    0 =  inf
+      -inf/   5 = -inf,    0      -inf *    5 +    0 = -inf
+       inf/  -5 = -inf,    0	  -inf *   -5 +    0 =  inf
+      -inf/  -5 =  inf,    0       inf *   -5 +    0 = -inf
+	 5/   5 =    1,    0         1 *    5 +    0 =    5
+	-5/  -5 =    1,    0         1 *   -5 +    0 =   -5
+       inf/ inf =    1,    0         1 *  inf +    0 =  inf
+      -inf/-inf =    1,    0         1 * -inf +    0 = -inf
+       inf/-inf =   -1,    0        -1 * -inf +    0 =  inf
+      -inf/ inf =   -1,    0         1 * -inf +    0 = -inf
+	 8/   0 =  inf,    8       inf *    0 +    8 =    8 
+       inf/   0 =  inf,  inf       inf *    0 +  inf =  inf 
+         0/   0 =  NaN
+
+These cases below violate the "remainder has the sign of the second of the two
+arguments", since they wouldn't match up otherwise.
+
+	A /  B  =   C,     R so that C *    B +    R =    A
+     ========================================================
+      -inf/   0 = -inf, -inf      -inf *    0 +  inf = -inf 
+	-8/   0 = -inf,   -8      -inf *    0 +    8 = -8 
+
+=item Modifying and =
+
+Beware of:
+
+        $x = Math::BigFloat->new(5);
+        $y = $x;
+
+It will not do what you think, e.g. making a copy of $x. Instead it just makes
+a second reference to the B<same> object and stores it in $y. Thus anything
+that modifies $x (except overloaded operators) will modify $y, and vice versa.
+Or in other words, C<=> is only safe if you modify your BigInts only via
+overloaded math. As soon as you use a method call it breaks:
+
+        $x->bmul(2);
+        print "$x, $y\n";       # prints '10, 10'
+
+If you want a true copy of $x, use:
+
+        $y = $x->copy();
+
+You can also chain the calls like this, this will make first a copy and then
+multiply it by 2:
+
+        $y = $x->copy()->bmul(2);
+
+See also the documentation for overload.pm regarding C<=>.
+
+=item bpow
+
+C<bpow()> (and the rounding functions) now modifies the first argument and
+returns it, unlike the old code which left it alone and only returned the
+result. This is to be consistent with C<badd()> etc. The first three will
+modify $x, the last one won't:
+
+	print bpow($x,$i),"\n"; 	# modify $x
+	print $x->bpow($i),"\n"; 	# ditto
+	print $x **= $i,"\n";		# the same
+	print $x ** $i,"\n";		# leave $x alone 
+
+The form C<$x **= $y> is faster than C<$x = $x ** $y;>, though.
+
+=item Overloading -$x
+
+The following:
+
+	$x = -$x;
+
+is slower than
+
+	$x->bneg();
+
+since overload calls C<sub($x,0,1);> instead of C<neg($x)>. The first variant
+needs to preserve $x since it does not know that it later will get overwritten.
+This makes a copy of $x and takes O(N), but $x->bneg() is O(1).
+
+=item Mixing different object types
+
+In Perl you will get a floating point value if you do one of the following:
+
+	$float = 5.0 + 2;
+	$float = 2 + 5.0;
+	$float = 5 / 2;
+
+With overloaded math, only the first two variants will result in a BigFloat:
+
+	use Math::BigInt;
+	use Math::BigFloat;
+	
+	$mbf = Math::BigFloat->new(5);
+	$mbi2 = Math::BigInteger->new(5);
+	$mbi = Math::BigInteger->new(2);
+
+					# what actually gets called:
+	$float = $mbf + $mbi;		# $mbf->badd()
+	$float = $mbf / $mbi;		# $mbf->bdiv()
+	$integer = $mbi + $mbf;		# $mbi->badd()
+	$integer = $mbi2 / $mbi;	# $mbi2->bdiv()
+	$integer = $mbi2 / $mbf;	# $mbi2->bdiv()
+
+This is because math with overloaded operators follows the first (dominating)
+operand, and the operation of that is called and returns thus the result. So,
+Math::BigInt::bdiv() will always return a Math::BigInt, regardless whether
+the result should be a Math::BigFloat or the second operant is one.
+
+To get a Math::BigFloat you either need to call the operation manually,
+make sure the operands are already of the proper type or casted to that type
+via Math::BigFloat->new():
+	
+	$float = Math::BigFloat->new($mbi2) / $mbi;	# = 2.5
+
+Beware of simple "casting" the entire expression, this would only convert
+the already computed result:
+
+	$float = Math::BigFloat->new($mbi2 / $mbi);	# = 2.0 thus wrong!
+
+Beware also of the order of more complicated expressions like:
+
+	$integer = ($mbi2 + $mbi) / $mbf;		# int / float => int
+	$integer = $mbi2 / Math::BigFloat->new($mbi);	# ditto
+
+If in doubt, break the expression into simpler terms, or cast all operands
+to the desired resulting type.
+
+Scalar values are a bit different, since:
+	
+	$float = 2 + $mbf;
+	$float = $mbf + 2;
+
+will both result in the proper type due to the way the overloaded math works.
+
+This section also applies to other overloaded math packages, like Math::String.
+
+One solution to you problem might be autoupgrading|upgrading. See the
+pragmas L<bignum>, L<bigint> and L<bigrat> for an easy way to do this.
+
+=item bsqrt()
+
+C<bsqrt()> works only good if the result is a big integer, e.g. the square
+root of 144 is 12, but from 12 the square root is 3, regardless of rounding
+mode. The reason is that the result is always truncated to an integer.
+
+If you want a better approximation of the square root, then use:
+
+	$x = Math::BigFloat->new(12);
+	Math::BigFloat->precision(0);
+	Math::BigFloat->round_mode('even');
+	print $x->copy->bsqrt(),"\n";		# 4
+
+	Math::BigFloat->precision(2);
+	print $x->bsqrt(),"\n";			# 3.46
+	print $x->bsqrt(3),"\n";		# 3.464
+
+=item brsft()
+
+For negative numbers in base see also L<brsft|brsft>.
+
+=back
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Math::BigFloat>, L<Math::BigRat> and L<Math::Big> as well as
+L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and  L<Math::BigInt::GMP>.
+
+The pragmas L<bignum>, L<bigint> and L<bigrat> also might be of interest
+because they solve the autoupgrading/downgrading issue, at least partly.
+
+The package at
+L<http://search.cpan.org/search?mode=module&query=Math%3A%3ABigInt> contains
+more documentation including a full version history, testcases, empty
+subclass files and benchmarks.
+
+=head1 AUTHORS
+
+Original code by Mark Biggar, overloaded interface by Ilya Zakharevich.
+Completely rewritten by Tels http://bloodgate.com in late 2000, 2001 - 2004
+and still at it in 2005.
+
+Many people contributed in one or more ways to the final beast, see the file
+CREDITS for an (uncomplete) list. If you miss your name, please drop me a
+mail. Thank you!
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt/Calc.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt/Calc.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt/Calc.pm	(revision 14489)
@@ -0,0 +1,2102 @@
+package Math::BigInt::Calc;
+
+use 5.005;
+use strict;
+# use warnings;	# dont use warnings for older Perls
+
+use vars qw/$VERSION/;
+
+$VERSION = '0.47';
+
+# Package to store unsigned big integers in decimal and do math with them
+
+# Internally the numbers are stored in an array with at least 1 element, no
+# leading zero parts (except the first) and in base 1eX where X is determined
+# automatically at loading time to be the maximum possible value
+
+# todo:
+# - fully remove funky $# stuff in div() (maybe - that code scares me...)
+
+# USE_MUL: due to problems on certain os (os390, posix-bc) "* 1e-5" is used
+# instead of "/ 1e5" at some places, (marked with USE_MUL). Other platforms
+# BS2000, some Crays need USE_DIV instead.
+# The BEGIN block is used to determine which of the two variants gives the
+# correct result.
+
+# Beware of things like:
+# $i = $i * $y + $car; $car = int($i / $MBASE); $i = $i % $MBASE;
+# This works on x86, but fails on ARM (SA1100, iPAQ) due to whoknows what
+# reasons. So, use this instead (slower, but correct):
+# $i = $i * $y + $car; $car = int($i / $MBASE); $i -= $MBASE * $car;
+
+##############################################################################
+# global constants, flags and accessory
+
+# announce that we are compatible with MBI v1.70 and up
+sub api_version () { 1; }
+ 
+# constants for easier life
+my ($BASE,$BASE_LEN,$MBASE,$RBASE,$MAX_VAL,$BASE_LEN_SMALL);
+my ($AND_BITS,$XOR_BITS,$OR_BITS);
+my ($AND_MASK,$XOR_MASK,$OR_MASK);
+
+sub _base_len 
+  {
+  # set/get the BASE_LEN and assorted other, connected values
+  # used only be the testsuite, set is used only by the BEGIN block below
+  shift;
+
+  my $b = shift;
+  if (defined $b)
+    {
+    # find whether we can use mul or div or none in mul()/div()
+    # (in last case reduce BASE_LEN_SMALL)
+    $BASE_LEN_SMALL = $b+1;
+    my $caught = 0;
+    while (--$BASE_LEN_SMALL > 5)
+      {
+      $MBASE = int("1e".$BASE_LEN_SMALL);
+      $RBASE = abs('1e-'.$BASE_LEN_SMALL);		# see USE_MUL
+      $caught = 0;
+      $caught += 1 if (int($MBASE * $RBASE) != 1);	# should be 1
+      $caught += 2 if (int($MBASE / $MBASE) != 1);	# should be 1
+      last if $caught != 3;
+      }
+    # BASE_LEN is used for anything else than mul()/div()
+    $BASE_LEN = $BASE_LEN_SMALL;
+    $BASE_LEN = shift if (defined $_[0]);		# one more arg?
+    $BASE = int("1e".$BASE_LEN);
+
+    $MBASE = int("1e".$BASE_LEN_SMALL);
+    $RBASE = abs('1e-'.$BASE_LEN_SMALL);		# see USE_MUL
+    $MAX_VAL = $MBASE-1;
+   
+    # avoid redefinitions
+ 
+    undef &_mul;
+    undef &_div;
+
+    # $caught & 1 != 0 => cannot use MUL
+    # $caught & 2 != 0 => cannot use DIV
+    # The parens around ($caught & 1) were important, indeed, if we would use
+    # & here.
+    if ($caught == 2)				# 2
+      {
+      # must USE_MUL since we cannot use DIV
+      *{_mul} = \&_mul_use_mul;
+      *{_div} = \&_div_use_mul;
+      }
+    else					# 0 or 1
+      {
+      # can USE_DIV instead
+      *{_mul} = \&_mul_use_div;
+      *{_div} = \&_div_use_div;
+      }
+    }
+  return $BASE_LEN unless wantarray;
+  return ($BASE_LEN, $AND_BITS, $XOR_BITS, $OR_BITS, $BASE_LEN_SMALL, $MAX_VAL, $BASE);
+  }
+
+sub _new
+  {
+  # (ref to string) return ref to num_array
+  # Convert a number from string format (without sign) to internal base
+  # 1ex format. Assumes normalized value as input.
+  my $il = length($_[1])-1;
+
+  # < BASE_LEN due len-1 above
+  return [ int($_[1]) ] if $il < $BASE_LEN;	# shortcut for short numbers
+
+  # this leaves '00000' instead of int 0 and will be corrected after any op
+  [ reverse(unpack("a" . ($il % $BASE_LEN+1) 
+    . ("a$BASE_LEN" x ($il / $BASE_LEN)), $_[1])) ];
+  }                                                                             
+
+BEGIN
+  {
+  # from Daniel Pfeiffer: determine largest group of digits that is precisely
+  # multipliable with itself plus carry
+  # Test now changed to expect the proper pattern, not a result off by 1 or 2
+  my ($e, $num) = 3;	# lowest value we will use is 3+1-1 = 3
+  do 
+    {
+    $num = ('9' x ++$e) + 0;
+    $num *= $num + 1.0;
+    } while ("$num" =~ /9{$e}0{$e}/);	# must be a certain pattern
+  $e--; 				# last test failed, so retract one step
+  # the limits below brush the problems with the test above under the rug:
+  # the test should be able to find the proper $e automatically
+  $e = 5 if $^O =~ /^uts/;	# UTS get's some special treatment
+  $e = 5 if $^O =~ /^unicos/;	# unicos is also problematic (6 seems to work
+				# there, but we play safe)
+  $e = 5 if $] < 5.006;		# cap, for older Perls
+  $e = 7 if $e > 7;		# cap, for VMS, OS/390 and other 64 bit systems
+				# 8 fails inside random testsuite, so take 7
+
+  __PACKAGE__->_base_len($e);	# set and store
+
+  use integer;
+  # find out how many bits _and, _or and _xor can take (old default = 16)
+  # I don't think anybody has yet 128 bit scalars, so let's play safe.
+  local $^W = 0;	# don't warn about 'nonportable number'
+  $AND_BITS = 15; $XOR_BITS = 15; $OR_BITS = 15;
+
+  # find max bits, we will not go higher than numberofbits that fit into $BASE
+  # to make _and etc simpler (and faster for smaller, slower for large numbers)
+  my $max = 16;
+  while (2 ** $max < $BASE) { $max++; }
+  {
+    no integer;
+    $max = 16 if $] < 5.006;	# older Perls might not take >16 too well
+  }
+  my ($x,$y,$z);
+  do {
+    $AND_BITS++;
+    $x = oct('0b' . '1' x $AND_BITS); $y = $x & $x;
+    $z = (2 ** $AND_BITS) - 1;
+    } while ($AND_BITS < $max && $x == $z && $y == $x);
+  $AND_BITS --;						# retreat one step
+  do {
+    $XOR_BITS++;
+    $x = oct('0b' . '1' x $XOR_BITS); $y = $x ^ 0;
+    $z = (2 ** $XOR_BITS) - 1;
+    } while ($XOR_BITS < $max && $x == $z && $y == $x);
+  $XOR_BITS --;						# retreat one step
+  do {
+    $OR_BITS++;
+    $x = oct('0b' . '1' x $OR_BITS); $y = $x | $x;
+    $z = (2 ** $OR_BITS) - 1;
+    } while ($OR_BITS < $max && $x == $z && $y == $x);
+  $OR_BITS --;						# retreat one step
+  
+  $AND_MASK = __PACKAGE__->_new( ( 2 ** $AND_BITS ));
+  $XOR_MASK = __PACKAGE__->_new( ( 2 ** $XOR_BITS ));
+  $OR_MASK = __PACKAGE__->_new( ( 2 ** $OR_BITS ));
+  }
+
+###############################################################################
+
+sub _zero
+  {
+  # create a zero
+  [ 0 ];
+  }
+
+sub _one
+  {
+  # create a one
+  [ 1 ];
+  }
+
+sub _two
+  {
+  # create a two (used internally for shifting)
+  [ 2 ];
+  }
+
+sub _ten
+  {
+  # create a 10 (used internally for shifting)
+  [ 10 ];
+  }
+
+sub _copy
+  {
+  # make a true copy
+  [ @{$_[1]} ];
+  }
+
+# catch and throw away
+sub import { }
+
+##############################################################################
+# convert back to string and number
+
+sub _str
+  {
+  # (ref to BINT) return num_str
+  # Convert number from internal base 100000 format to string format.
+  # internal format is always normalized (no leading zeros, "-0" => "+0")
+  my $ar = $_[1];
+
+  my $l = scalar @$ar;				# number of parts
+  if ($l < 1)					# should not happen
+    {
+    require Carp;
+    Carp::croak("$_[1] has no elements");
+    }
+
+  my $ret = "";
+  # handle first one different to strip leading zeros from it (there are no
+  # leading zero parts in internal representation)
+  $l --; $ret .= int($ar->[$l]); $l--;
+  # Interestingly, the pre-padd method uses more time
+  # the old grep variant takes longer (14 vs. 10 sec)
+  my $z = '0' x ($BASE_LEN-1);                            
+  while ($l >= 0)
+    {
+    $ret .= substr($z.$ar->[$l],-$BASE_LEN); # fastest way I could think of
+    $l--;
+    }
+  $ret;
+  }                                                                             
+
+sub _num
+  {
+  # Make a number (scalar int/float) from a BigInt object 
+  my $x = $_[1];
+
+  return 0+$x->[0] if scalar @$x == 1;  # below $BASE
+  my $fac = 1;
+  my $num = 0;
+  foreach (@$x)
+    {
+    $num += $fac*$_; $fac *= $BASE;
+    }
+  $num; 
+  }
+
+##############################################################################
+# actual math code
+
+sub _add
+  {
+  # (ref to int_num_array, ref to int_num_array)
+  # routine to add two base 1eX numbers
+  # stolen from Knuth Vol 2 Algorithm A pg 231
+  # there are separate routines to add and sub as per Knuth pg 233
+  # This routine clobbers up array x, but not y.
+ 
+  my ($c,$x,$y) = @_;
+
+  return $x if (@$y == 1) && $y->[0] == 0;		# $x + 0 => $x
+  if ((@$x == 1) && $x->[0] == 0)			# 0 + $y => $y->copy
+    {
+    # twice as slow as $x = [ @$y ], but necc. to retain $x as ref :(
+    @$x = @$y; return $x;		
+    }
+ 
+  # for each in Y, add Y to X and carry. If after that, something is left in
+  # X, foreach in X add carry to X and then return X, carry
+  # Trades one "$j++" for having to shift arrays
+  my $i; my $car = 0; my $j = 0;
+  for $i (@$y)
+    {
+    $x->[$j] -= $BASE if $car = (($x->[$j] += $i + $car) >= $BASE) ? 1 : 0;
+    $j++;
+    }
+  while ($car != 0)
+    {
+    $x->[$j] -= $BASE if $car = (($x->[$j] += $car) >= $BASE) ? 1 : 0; $j++;
+    }
+  $x;
+  }                                                                             
+
+sub _inc
+  {
+  # (ref to int_num_array, ref to int_num_array)
+  # Add 1 to $x, modify $x in place
+  my ($c,$x) = @_;
+
+  for my $i (@$x)
+    {
+    return $x if (($i += 1) < $BASE);		# early out
+    $i = 0;					# overflow, next
+    }
+  push @$x,1 if (($x->[-1] || 0) == 0);		# last overflowed, so extend
+  $x;
+  }                                                                             
+
+sub _dec
+  {
+  # (ref to int_num_array, ref to int_num_array)
+  # Sub 1 from $x, modify $x in place
+  my ($c,$x) = @_;
+
+  my $MAX = $BASE-1;				# since MAX_VAL based on MBASE
+  for my $i (@$x)
+    {
+    last if (($i -= 1) >= 0);			# early out
+    $i = $MAX;					# underflow, next
+    }
+  pop @$x if $x->[-1] == 0 && @$x > 1;		# last underflowed (but leave 0)
+  $x;
+  }                                                                             
+
+sub _sub
+  {
+  # (ref to int_num_array, ref to int_num_array, swap)
+  # subtract base 1eX numbers -- stolen from Knuth Vol 2 pg 232, $x > $y
+  # subtract Y from X by modifying x in place
+  my ($c,$sx,$sy,$s) = @_;
+ 
+  my $car = 0; my $i; my $j = 0;
+  if (!$s)
+    {
+    for $i (@$sx)
+      {
+      last unless defined $sy->[$j] || $car;
+      $i += $BASE if $car = (($i -= ($sy->[$j] || 0) + $car) < 0); $j++;
+      }
+    # might leave leading zeros, so fix that
+    return __strip_zeros($sx);
+    }
+  for $i (@$sx)
+    {
+    # we can't do an early out if $x is < than $y, since we
+    # need to copy the high chunks from $y. Found by Bob Mathews.
+    #last unless defined $sy->[$j] || $car;
+    $sy->[$j] += $BASE
+     if $car = (($sy->[$j] = $i-($sy->[$j]||0) - $car) < 0);
+    $j++;
+    }
+  # might leave leading zeros, so fix that
+  __strip_zeros($sy);
+  }                                                                             
+
+sub _mul_use_mul
+  {
+  # (ref to int_num_array, ref to int_num_array)
+  # multiply two numbers in internal representation
+  # modifies first arg, second need not be different from first
+  my ($c,$xv,$yv) = @_;
+
+  if (@$yv == 1)
+    {
+    # shortcut for two very short numbers (improved by Nathan Zook)
+    # works also if xv and yv are the same reference, and handles also $x == 0
+    if (@$xv == 1)
+      {
+      if (($xv->[0] *= $yv->[0]) >= $MBASE)
+         {
+         $xv->[0] = $xv->[0] - ($xv->[1] = int($xv->[0] * $RBASE)) * $MBASE;
+         };
+      return $xv;
+      }
+    # $x * 0 => 0
+    if ($yv->[0] == 0)
+      {
+      @$xv = (0);
+      return $xv;
+      }
+    # multiply a large number a by a single element one, so speed up
+    my $y = $yv->[0]; my $car = 0;
+    foreach my $i (@$xv)
+      {
+      $i = $i * $y + $car; $car = int($i * $RBASE); $i -= $car * $MBASE;
+      }
+    push @$xv, $car if $car != 0;
+    return $xv;
+    }
+  # shortcut for result $x == 0 => result = 0
+  return $xv if ( ((@$xv == 1) && ($xv->[0] == 0)) ); 
+
+  # since multiplying $x with $x fails, make copy in this case
+  $yv = [@$xv] if $xv == $yv;	# same references?
+
+  my @prod = (); my ($prod,$car,$cty,$xi,$yi);
+
+  for $xi (@$xv)
+    {
+    $car = 0; $cty = 0;
+
+    # slow variant
+#    for $yi (@$yv)
+#      {
+#      $prod = $xi * $yi + ($prod[$cty] || 0) + $car;
+#      $prod[$cty++] =
+#       $prod - ($car = int($prod * RBASE)) * $MBASE;  # see USE_MUL
+#      }
+#    $prod[$cty] += $car if $car; # need really to check for 0?
+#    $xi = shift @prod;
+
+    # faster variant
+    # looping through this if $xi == 0 is silly - so optimize it away!
+    $xi = (shift @prod || 0), next if $xi == 0;
+    for $yi (@$yv)
+      {
+      $prod = $xi * $yi + ($prod[$cty] || 0) + $car;
+##     this is actually a tad slower
+##        $prod = $prod[$cty]; $prod += ($car + $xi * $yi);	# no ||0 here
+      $prod[$cty++] =
+       $prod - ($car = int($prod * $RBASE)) * $MBASE;  # see USE_MUL
+      }
+    $prod[$cty] += $car if $car; # need really to check for 0?
+    $xi = shift @prod || 0;	# || 0 makes v5.005_3 happy
+    }
+  push @$xv, @prod;
+  __strip_zeros($xv);
+  $xv;
+  }                                                                             
+
+sub _mul_use_div
+  {
+  # (ref to int_num_array, ref to int_num_array)
+  # multiply two numbers in internal representation
+  # modifies first arg, second need not be different from first
+  my ($c,$xv,$yv) = @_;
+ 
+  if (@$yv == 1)
+    {
+    # shortcut for two small numbers, also handles $x == 0
+    if (@$xv == 1)
+      {
+      # shortcut for two very short numbers (improved by Nathan Zook)
+      # works also if xv and yv are the same reference, and handles also $x == 0
+      if (($xv->[0] *= $yv->[0]) >= $MBASE)
+          {
+          $xv->[0] =
+              $xv->[0] - ($xv->[1] = int($xv->[0] / $MBASE)) * $MBASE;
+          };
+      return $xv;
+      }
+    # $x * 0 => 0
+    if ($yv->[0] == 0)
+      {
+      @$xv = (0);
+      return $xv;
+      }
+    # multiply a large number a by a single element one, so speed up
+    my $y = $yv->[0]; my $car = 0;
+    foreach my $i (@$xv)
+      {
+      $i = $i * $y + $car; $car = int($i / $MBASE); $i -= $car * $MBASE;
+      }
+    push @$xv, $car if $car != 0;
+    return $xv;
+    }
+  # shortcut for result $x == 0 => result = 0
+  return $xv if ( ((@$xv == 1) && ($xv->[0] == 0)) ); 
+
+  # since multiplying $x with $x fails, make copy in this case
+  $yv = [@$xv] if $xv == $yv;	# same references?
+
+  my @prod = (); my ($prod,$car,$cty,$xi,$yi);
+  for $xi (@$xv)
+    {
+    $car = 0; $cty = 0;
+    # looping through this if $xi == 0 is silly - so optimize it away!
+    $xi = (shift @prod || 0), next if $xi == 0;
+    for $yi (@$yv)
+      {
+      $prod = $xi * $yi + ($prod[$cty] || 0) + $car;
+      $prod[$cty++] =
+       $prod - ($car = int($prod / $MBASE)) * $MBASE;
+      }
+    $prod[$cty] += $car if $car; # need really to check for 0?
+    $xi = shift @prod || 0;	# || 0 makes v5.005_3 happy
+    }
+  push @$xv, @prod;
+  __strip_zeros($xv);
+  $xv;
+  }                                                                             
+
+sub _div_use_mul
+  {
+  # ref to array, ref to array, modify first array and return remainder if 
+  # in list context
+
+  # see comments in _div_use_div() for more explanations
+
+  my ($c,$x,$yorg) = @_;
+  
+  # the general div algorithmn here is about O(N*N) and thus quite slow, so
+  # we first check for some special cases and use shortcuts to handle them.
+
+  # This works, because we store the numbers in a chunked format where each
+  # element contains 5..7 digits (depending on system).
+
+  # if both numbers have only one element:
+  if (@$x == 1 && @$yorg == 1)
+    {
+    # shortcut, $yorg and $x are two small numbers
+    if (wantarray)
+      {
+      my $r = [ $x->[0] % $yorg->[0] ];
+      $x->[0] = int($x->[0] / $yorg->[0]);
+      return ($x,$r); 
+      }
+    else
+      {
+      $x->[0] = int($x->[0] / $yorg->[0]);
+      return $x; 
+      }
+    }
+
+  # if x has more than one, but y has only one element:
+  if (@$yorg == 1)
+    {
+    my $rem;
+    $rem = _mod($c,[ @$x ],$yorg) if wantarray;
+
+    # shortcut, $y is < $BASE
+    my $j = scalar @$x; my $r = 0; 
+    my $y = $yorg->[0]; my $b;
+    while ($j-- > 0)
+      {
+      $b = $r * $MBASE + $x->[$j];
+      $x->[$j] = int($b/$y);
+      $r = $b % $y;
+      }
+    pop @$x if @$x > 1 && $x->[-1] == 0;	# splice up a leading zero 
+    return ($x,$rem) if wantarray;
+    return $x;
+    }
+
+  # now x and y have more than one element
+
+  # check whether y has more elements than x, if yet, the result will be 0
+  if (@$yorg > @$x)
+    {
+    my $rem;
+    $rem = [@$x] if wantarray;                  # make copy
+    splice (@$x,1);                             # keep ref to original array
+    $x->[0] = 0;                                # set to 0
+    return ($x,$rem) if wantarray;              # including remainder?
+    return $x;					# only x, which is [0] now
+    }
+  # check whether the numbers have the same number of elements, in that case
+  # the result will fit into one element and can be computed efficiently
+  if (@$yorg == @$x)
+    {
+    my $rem;
+    # if $yorg has more digits than $x (it's leading element is longer than
+    # the one from $x), the result will also be 0:
+    if (length(int($yorg->[-1])) > length(int($x->[-1])))
+      {
+      $rem = [@$x] if wantarray;		# make copy
+      splice (@$x,1);				# keep ref to org array
+      $x->[0] = 0;				# set to 0
+      return ($x,$rem) if wantarray;		# including remainder?
+      return $x;
+      }
+    # now calculate $x / $yorg
+    if (length(int($yorg->[-1])) == length(int($x->[-1])))
+      {
+      # same length, so make full compare
+
+      my $a = 0; my $j = scalar @$x - 1;
+      # manual way (abort if unequal, good for early ne)
+      while ($j >= 0)
+        {
+        last if ($a = $x->[$j] - $yorg->[$j]); $j--;
+        }
+      # $a contains the result of the compare between X and Y
+      # a < 0: x < y, a == 0: x == y, a > 0: x > y
+      if ($a <= 0)
+        {
+        $rem = [ 0 ];                   # a = 0 => x == y => rem 0
+        $rem = [@$x] if $a != 0;        # a < 0 => x < y => rem = x
+        splice(@$x,1);                  # keep single element
+        $x->[0] = 0;                    # if $a < 0
+        $x->[0] = 1 if $a == 0;         # $x == $y
+        return ($x,$rem) if wantarray;
+        return $x;
+        }
+      # $x >= $y, so proceed normally
+      }
+    }
+
+  # all other cases:
+
+  my $y = [ @$yorg ];				# always make copy to preserve
+
+  my ($car,$bar,$prd,$dd,$xi,$yi,@q,$v2,$v1,@d,$tmp,$q,$u2,$u1,$u0);
+
+  $car = $bar = $prd = 0;
+  if (($dd = int($MBASE/($y->[-1]+1))) != 1) 
+    {
+    for $xi (@$x) 
+      {
+      $xi = $xi * $dd + $car;
+      $xi -= ($car = int($xi * $RBASE)) * $MBASE;	# see USE_MUL
+      }
+    push(@$x, $car); $car = 0;
+    for $yi (@$y) 
+      {
+      $yi = $yi * $dd + $car;
+      $yi -= ($car = int($yi * $RBASE)) * $MBASE;	# see USE_MUL
+      }
+    }
+  else 
+    {
+    push(@$x, 0);
+    }
+  @q = (); ($v2,$v1) = @$y[-2,-1];
+  $v2 = 0 unless $v2;
+  while ($#$x > $#$y) 
+    {
+    ($u2,$u1,$u0) = @$x[-3..-1];
+    $u2 = 0 unless $u2;
+    #warn "oups v1 is 0, u0: $u0 $y->[-2] $y->[-1] l ",scalar @$y,"\n"
+    # if $v1 == 0;
+    $q = (($u0 == $v1) ? $MAX_VAL : int(($u0*$MBASE+$u1)/$v1));
+    --$q while ($v2*$q > ($u0*$MBASE+$u1-$q*$v1)*$MBASE+$u2);
+    if ($q)
+      {
+      ($car, $bar) = (0,0);
+      for ($yi = 0, $xi = $#$x-$#$y-1; $yi <= $#$y; ++$yi,++$xi) 
+        {
+        $prd = $q * $y->[$yi] + $car;
+        $prd -= ($car = int($prd * $RBASE)) * $MBASE;	# see USE_MUL
+	$x->[$xi] += $MBASE if ($bar = (($x->[$xi] -= $prd + $bar) < 0));
+	}
+      if ($x->[-1] < $car + $bar) 
+        {
+        $car = 0; --$q;
+	for ($yi = 0, $xi = $#$x-$#$y-1; $yi <= $#$y; ++$yi,++$xi) 
+          {
+	  $x->[$xi] -= $MBASE
+	   if ($car = (($x->[$xi] += $y->[$yi] + $car) >= $MBASE));
+	  }
+	}   
+      }
+    pop(@$x);
+    unshift(@q, $q);
+    }
+  if (wantarray) 
+    {
+    @d = ();
+    if ($dd != 1)  
+      {
+      $car = 0; 
+      for $xi (reverse @$x) 
+        {
+        $prd = $car * $MBASE + $xi;
+        $car = $prd - ($tmp = int($prd / $dd)) * $dd; # see USE_MUL
+        unshift(@d, $tmp);
+        }
+      }
+    else 
+      {
+      @d = @$x;
+      }
+    @$x = @q;
+    my $d = \@d; 
+    __strip_zeros($x);
+    __strip_zeros($d);
+    return ($x,$d);
+    }
+  @$x = @q;
+  __strip_zeros($x);
+  $x;
+  }
+
+sub _div_use_div
+  {
+  # ref to array, ref to array, modify first array and return remainder if 
+  # in list context
+  my ($c,$x,$yorg) = @_;
+
+  # the general div algorithmn here is about O(N*N) and thus quite slow, so
+  # we first check for some special cases and use shortcuts to handle them.
+
+  # This works, because we store the numbers in a chunked format where each
+  # element contains 5..7 digits (depending on system).
+
+  # if both numbers have only one element:
+  if (@$x == 1 && @$yorg == 1)
+    {
+    # shortcut, $yorg and $x are two small numbers
+    if (wantarray)
+      {
+      my $r = [ $x->[0] % $yorg->[0] ];
+      $x->[0] = int($x->[0] / $yorg->[0]);
+      return ($x,$r); 
+      }
+    else
+      {
+      $x->[0] = int($x->[0] / $yorg->[0]);
+      return $x; 
+      }
+    }
+  # if x has more than one, but y has only one element:
+  if (@$yorg == 1)
+    {
+    my $rem;
+    $rem = _mod($c,[ @$x ],$yorg) if wantarray;
+
+    # shortcut, $y is < $BASE
+    my $j = scalar @$x; my $r = 0; 
+    my $y = $yorg->[0]; my $b;
+    while ($j-- > 0)
+      {
+      $b = $r * $MBASE + $x->[$j];
+      $x->[$j] = int($b/$y);
+      $r = $b % $y;
+      }
+    pop @$x if @$x > 1 && $x->[-1] == 0;	# splice up a leading zero 
+    return ($x,$rem) if wantarray;
+    return $x;
+    }
+  # now x and y have more than one element
+
+  # check whether y has more elements than x, if yet, the result will be 0
+  if (@$yorg > @$x)
+    {
+    my $rem;
+    $rem = [@$x] if wantarray;			# make copy
+    splice (@$x,1);				# keep ref to original array
+    $x->[0] = 0;				# set to 0
+    return ($x,$rem) if wantarray;		# including remainder?
+    return $x;					# only x, which is [0] now
+    }
+  # check whether the numbers have the same number of elements, in that case
+  # the result will fit into one element and can be computed efficiently
+  if (@$yorg == @$x)
+    {
+    my $rem;
+    # if $yorg has more digits than $x (it's leading element is longer than
+    # the one from $x), the result will also be 0:
+    if (length(int($yorg->[-1])) > length(int($x->[-1])))
+      {
+      $rem = [@$x] if wantarray;		# make copy
+      splice (@$x,1);				# keep ref to org array
+      $x->[0] = 0;				# set to 0
+      return ($x,$rem) if wantarray;		# including remainder?
+      return $x;
+      }
+    # now calculate $x / $yorg
+
+    if (length(int($yorg->[-1])) == length(int($x->[-1])))
+      {
+      # same length, so make full compare
+
+      my $a = 0; my $j = scalar @$x - 1;
+      # manual way (abort if unequal, good for early ne)
+      while ($j >= 0)
+        {
+        last if ($a = $x->[$j] - $yorg->[$j]); $j--;
+        }
+      # $a contains the result of the compare between X and Y
+      # a < 0: x < y, a == 0: x == y, a > 0: x > y
+      if ($a <= 0)
+        {
+        $rem = [ 0 ];			# a = 0 => x == y => rem 0
+        $rem = [@$x] if $a != 0;	# a < 0 => x < y => rem = x
+        splice(@$x,1);			# keep single element
+        $x->[0] = 0;			# if $a < 0
+        $x->[0] = 1 if $a == 0; 	# $x == $y
+        return ($x,$rem) if wantarray;	# including remainder?
+        return $x;
+        }
+      # $x >= $y, so proceed normally
+
+      }
+    }
+
+  # all other cases:
+
+  my $y = [ @$yorg ];				# always make copy to preserve
+ 
+  my ($car,$bar,$prd,$dd,$xi,$yi,@q,$v2,$v1,@d,$tmp,$q,$u2,$u1,$u0);
+
+  $car = $bar = $prd = 0;
+  if (($dd = int($MBASE/($y->[-1]+1))) != 1) 
+    {
+    for $xi (@$x) 
+      {
+      $xi = $xi * $dd + $car;
+      $xi -= ($car = int($xi / $MBASE)) * $MBASE;
+      }
+    push(@$x, $car); $car = 0;
+    for $yi (@$y) 
+      {
+      $yi = $yi * $dd + $car;
+      $yi -= ($car = int($yi / $MBASE)) * $MBASE;
+      }
+    }
+  else 
+    {
+    push(@$x, 0);
+    }
+
+  # @q will accumulate the final result, $q contains the current computed
+  # part of the final result
+
+  @q = (); ($v2,$v1) = @$y[-2,-1];
+  $v2 = 0 unless $v2;
+  while ($#$x > $#$y) 
+    {
+    ($u2,$u1,$u0) = @$x[-3..-1];
+    $u2 = 0 unless $u2;
+    #warn "oups v1 is 0, u0: $u0 $y->[-2] $y->[-1] l ",scalar @$y,"\n"
+    # if $v1 == 0;
+    $q = (($u0 == $v1) ? $MAX_VAL : int(($u0*$MBASE+$u1)/$v1));
+    --$q while ($v2*$q > ($u0*$MBASE+$u1-$q*$v1)*$MBASE+$u2);
+    if ($q)
+      {
+      ($car, $bar) = (0,0);
+      for ($yi = 0, $xi = $#$x-$#$y-1; $yi <= $#$y; ++$yi,++$xi) 
+        {
+        $prd = $q * $y->[$yi] + $car;
+        $prd -= ($car = int($prd / $MBASE)) * $MBASE;
+	$x->[$xi] += $MBASE if ($bar = (($x->[$xi] -= $prd + $bar) < 0));
+	}
+      if ($x->[-1] < $car + $bar) 
+        {
+        $car = 0; --$q;
+	for ($yi = 0, $xi = $#$x-$#$y-1; $yi <= $#$y; ++$yi,++$xi) 
+          {
+	  $x->[$xi] -= $MBASE
+	   if ($car = (($x->[$xi] += $y->[$yi] + $car) >= $MBASE));
+	  }
+	}   
+      }
+    pop(@$x); unshift(@q, $q);
+    }
+  if (wantarray) 
+    {
+    @d = ();
+    if ($dd != 1)  
+      {
+      $car = 0; 
+      for $xi (reverse @$x) 
+        {
+        $prd = $car * $MBASE + $xi;
+        $car = $prd - ($tmp = int($prd / $dd)) * $dd;
+        unshift(@d, $tmp);
+        }
+      }
+    else 
+      {
+      @d = @$x;
+      }
+    @$x = @q;
+    my $d = \@d; 
+    __strip_zeros($x);
+    __strip_zeros($d);
+    return ($x,$d);
+    }
+  @$x = @q;
+  __strip_zeros($x);
+  $x;
+  }
+
+##############################################################################
+# testing
+
+sub _acmp
+  {
+  # internal absolute post-normalized compare (ignore signs)
+  # ref to array, ref to array, return <0, 0, >0
+  # arrays must have at least one entry; this is not checked for
+  my ($c,$cx,$cy) = @_;
+ 
+  # shortcut for short numbers 
+  return (($cx->[0] <=> $cy->[0]) <=> 0) 
+   if scalar @$cx == scalar @$cy && scalar @$cx == 1;
+
+  # fast comp based on number of array elements (aka pseudo-length)
+  my $lxy = (scalar @$cx - scalar @$cy)
+  # or length of first element if same number of elements (aka difference 0)
+    ||
+  # need int() here because sometimes the last element is '00018' vs '18'
+   (length(int($cx->[-1])) - length(int($cy->[-1])));
+  return -1 if $lxy < 0;				# already differs, ret
+  return 1 if $lxy > 0;					# ditto
+
+  # manual way (abort if unequal, good for early ne)
+  my $a; my $j = scalar @$cx;
+  while (--$j >= 0)
+    {
+    last if ($a = $cx->[$j] - $cy->[$j]);
+    }
+  $a <=> 0;
+  }
+
+sub _len
+  {
+  # compute number of digits
+
+  # int() because add/sub sometimes leaves strings (like '00005') instead of
+  # '5' in this place, thus causing length() to report wrong length
+  my $cx = $_[1];
+
+  (@$cx-1)*$BASE_LEN+length(int($cx->[-1]));
+  }
+
+sub _digit
+  {
+  # return the nth digit, negative values count backward
+  # zero is rightmost, so _digit(123,0) will give 3
+  my ($c,$x,$n) = @_;
+
+  my $len = _len('',$x);
+
+  $n = $len+$n if $n < 0;		# -1 last, -2 second-to-last
+  $n = abs($n);				# if negative was too big
+  $len--; $n = $len if $n > $len;	# n to big?
+  
+  my $elem = int($n / $BASE_LEN);	# which array element
+  my $digit = $n % $BASE_LEN;		# which digit in this element
+  $elem = '0' x $BASE_LEN . @$x[$elem];	# get element padded with 0's
+  substr($elem,-$digit-1,1);
+  }
+
+sub _zeros
+  {
+  # return amount of trailing zeros in decimal
+  # check each array elem in _m for having 0 at end as long as elem == 0
+  # Upon finding a elem != 0, stop
+  my $x = $_[1];
+
+  return 0 if scalar @$x == 1 && $x->[0] == 0;
+
+  my $zeros = 0; my $elem;
+  foreach my $e (@$x)
+    {
+    if ($e != 0)
+      {
+      $elem = "$e";				# preserve x
+      $elem =~ s/.*?(0*$)/$1/;			# strip anything not zero
+      $zeros *= $BASE_LEN;			# elems * 5
+      $zeros += length($elem);			# count trailing zeros
+      last;					# early out
+      }
+    $zeros ++;					# real else branch: 50% slower!
+    }
+  $zeros;
+  }
+
+##############################################################################
+# _is_* routines
+
+sub _is_zero
+  {
+  # return true if arg is zero 
+  (((scalar @{$_[1]} == 1) && ($_[1]->[0] == 0))) <=> 0;
+  }
+
+sub _is_even
+  {
+  # return true if arg is even
+  (!($_[1]->[0] & 1)) <=> 0; 
+  }
+
+sub _is_odd
+  {
+  # return true if arg is even
+  (($_[1]->[0] & 1)) <=> 0; 
+  }
+
+sub _is_one
+  {
+  # return true if arg is one
+  (scalar @{$_[1]} == 1) && ($_[1]->[0] == 1) <=> 0; 
+  }
+
+sub _is_two
+  {
+  # return true if arg is two 
+  (scalar @{$_[1]} == 1) && ($_[1]->[0] == 2) <=> 0; 
+  }
+
+sub _is_ten
+  {
+  # return true if arg is ten 
+  (scalar @{$_[1]} == 1) && ($_[1]->[0] == 10) <=> 0; 
+  }
+
+sub __strip_zeros
+  {
+  # internal normalization function that strips leading zeros from the array
+  # args: ref to array
+  my $s = shift;
+ 
+  my $cnt = scalar @$s; # get count of parts
+  my $i = $cnt-1;
+  push @$s,0 if $i < 0;		# div might return empty results, so fix it
+
+  return $s if @$s == 1;		# early out
+
+  #print "strip: cnt $cnt i $i\n";
+  # '0', '3', '4', '0', '0',
+  #  0    1    2    3    4
+  # cnt = 5, i = 4
+  # i = 4
+  # i = 3
+  # => fcnt = cnt - i (5-2 => 3, cnt => 5-1 = 4, throw away from 4th pos)
+  # >= 1: skip first part (this can be zero)
+  while ($i > 0) { last if $s->[$i] != 0; $i--; }
+  $i++; splice @$s,$i if ($i < $cnt); # $i cant be 0
+  $s;                                                                    
+  }                                                                             
+
+###############################################################################
+# check routine to test internal state for corruptions
+
+sub _check
+  {
+  # used by the test suite
+  my $x = $_[1];
+
+  return "$x is not a reference" if !ref($x);
+
+  # are all parts are valid?
+  my $i = 0; my $j = scalar @$x; my ($e,$try);
+  while ($i < $j)
+    {
+    $e = $x->[$i]; $e = 'undef' unless defined $e;
+    $try = '=~ /^[\+]?[0-9]+\$/; '."($x, $e)";
+    last if $e !~ /^[+]?[0-9]+$/;
+    $try = '=~ /^[\+]?[0-9]+\$/; '."($x, $e) (stringify)";
+    last if "$e" !~ /^[+]?[0-9]+$/;
+    $try = '=~ /^[\+]?[0-9]+\$/; '."($x, $e) (cat-stringify)";
+    last if '' . "$e" !~ /^[+]?[0-9]+$/;
+    $try = ' < 0 || >= $BASE; '."($x, $e)";
+    last if $e <0 || $e >= $BASE;
+    # this test is disabled, since new/bnorm and certain ops (like early out
+    # in add/sub) are allowed/expected to leave '00000' in some elements
+    #$try = '=~ /^00+/; '."($x, $e)";
+    #last if $e =~ /^00+/;
+    $i++;
+    }
+  return "Illegal part '$e' at pos $i (tested: $try)" if $i < $j;
+  0;
+  }
+
+
+###############################################################################
+
+sub _mod
+  {
+  # if possible, use mod shortcut
+  my ($c,$x,$yo) = @_;
+
+  # slow way since $y to big
+  if (scalar @$yo > 1)
+    {
+    my ($xo,$rem) = _div($c,$x,$yo);
+    return $rem;
+    }
+
+  my $y = $yo->[0];
+  # both are single element arrays
+  if (scalar @$x == 1)
+    {
+    $x->[0] %= $y;
+    return $x;
+    }
+
+  # @y is a single element, but @x has more than one element
+  my $b = $BASE % $y;
+  if ($b == 0)
+    {
+    # when BASE % Y == 0 then (B * BASE) % Y == 0
+    # (B * BASE) % $y + A % Y => A % Y
+    # so need to consider only last element: O(1)
+    $x->[0] %= $y;
+    }
+  elsif ($b == 1)
+    {
+    # else need to go through all elements: O(N), but loop is a bit simplified
+    my $r = 0;
+    foreach (@$x)
+      {
+      $r = ($r + $_) % $y;		# not much faster, but heh...
+      #$r += $_ % $y; $r %= $y;
+      }
+    $r = 0 if $r == $y;
+    $x->[0] = $r;
+    }
+  else
+    {
+    # else need to go through all elements: O(N)
+    my $r = 0; my $bm = 1;
+    foreach (@$x)
+      {
+      $r = ($_ * $bm + $r) % $y;
+      $bm = ($bm * $b) % $y;
+
+      #$r += ($_ % $y) * $bm;
+      #$bm *= $b;
+      #$bm %= $y;
+      #$r %= $y;
+      }
+    $r = 0 if $r == $y;
+    $x->[0] = $r;
+    }
+  splice (@$x,1);		# keep one element of $x
+  $x;
+  }
+
+##############################################################################
+# shifts
+
+sub _rsft
+  {
+  my ($c,$x,$y,$n) = @_;
+
+  if ($n != 10)
+    {
+    $n = _new($c,$n); return _div($c,$x, _pow($c,$n,$y));
+    }
+
+  # shortcut (faster) for shifting by 10)
+  # multiples of $BASE_LEN
+  my $dst = 0;				# destination
+  my $src = _num($c,$y);		# as normal int
+  my $xlen = (@$x-1)*$BASE_LEN+length(int($x->[-1]));  # len of x in digits
+  if ($src >= $xlen or ($src == $xlen and ! defined $x->[1]))
+    {
+    # 12345 67890 shifted right by more than 10 digits => 0
+    splice (@$x,1);                    # leave only one element
+    $x->[0] = 0;                       # set to zero
+    return $x;
+    }
+  my $rem = $src % $BASE_LEN;		# remainder to shift
+  $src = int($src / $BASE_LEN);		# source
+  if ($rem == 0)
+    {
+    splice (@$x,0,$src);		# even faster, 38.4 => 39.3
+    }
+  else
+    {
+    my $len = scalar @$x - $src;	# elems to go
+    my $vd; my $z = '0'x $BASE_LEN;
+    $x->[scalar @$x] = 0;		# avoid || 0 test inside loop
+    while ($dst < $len)
+      {
+      $vd = $z.$x->[$src];
+      $vd = substr($vd,-$BASE_LEN,$BASE_LEN-$rem);
+      $src++;
+      $vd = substr($z.$x->[$src],-$rem,$rem) . $vd;
+      $vd = substr($vd,-$BASE_LEN,$BASE_LEN) if length($vd) > $BASE_LEN;
+      $x->[$dst] = int($vd);
+      $dst++;
+      }
+    splice (@$x,$dst) if $dst > 0;		# kill left-over array elems
+    pop @$x if $x->[-1] == 0 && @$x > 1;	# kill last element if 0
+    } # else rem == 0
+  $x;
+  }
+
+sub _lsft
+  {
+  my ($c,$x,$y,$n) = @_;
+
+  if ($n != 10)
+    {
+    $n = _new($c,$n); return _mul($c,$x, _pow($c,$n,$y));
+    }
+
+  # shortcut (faster) for shifting by 10) since we are in base 10eX
+  # multiples of $BASE_LEN:
+  my $src = scalar @$x;			# source
+  my $len = _num($c,$y);		# shift-len as normal int
+  my $rem = $len % $BASE_LEN;		# remainder to shift
+  my $dst = $src + int($len/$BASE_LEN);	# destination
+  my $vd;				# further speedup
+  $x->[$src] = 0;			# avoid first ||0 for speed
+  my $z = '0' x $BASE_LEN;
+  while ($src >= 0)
+    {
+    $vd = $x->[$src]; $vd = $z.$vd;
+    $vd = substr($vd,-$BASE_LEN+$rem,$BASE_LEN-$rem);
+    $vd .= $src > 0 ? substr($z.$x->[$src-1],-$BASE_LEN,$rem) : '0' x $rem;
+    $vd = substr($vd,-$BASE_LEN,$BASE_LEN) if length($vd) > $BASE_LEN;
+    $x->[$dst] = int($vd);
+    $dst--; $src--;
+    }
+  # set lowest parts to 0
+  while ($dst >= 0) { $x->[$dst--] = 0; }
+  # fix spurios last zero element
+  splice @$x,-1 if $x->[-1] == 0;
+  $x;
+  }
+
+sub _pow
+  {
+  # power of $x to $y
+  # ref to array, ref to array, return ref to array
+  my ($c,$cx,$cy) = @_;
+
+  if (scalar @$cy == 1 && $cy->[0] == 0)
+    {
+    splice (@$cx,1); $cx->[0] = 1;		# y == 0 => x => 1
+    return $cx;
+    }
+  if ((scalar @$cx == 1 && $cx->[0] == 1) ||	#    x == 1
+      (scalar @$cy == 1 && $cy->[0] == 1))	# or y == 1
+    {
+    return $cx;
+    }
+  if (scalar @$cx == 1 && $cx->[0] == 0)
+    {
+    splice (@$cx,1); $cx->[0] = 0;		# 0 ** y => 0 (if not y <= 0)
+    return $cx;
+    }
+
+  my $pow2 = _one();
+
+  my $y_bin = _as_bin($c,$cy); $y_bin =~ s/^0b//;
+  my $len = length($y_bin);
+  while (--$len > 0)
+    {
+    _mul($c,$pow2,$cx) if substr($y_bin,$len,1) eq '1';		# is odd?
+    _mul($c,$cx,$cx);
+    }
+
+  _mul($c,$cx,$pow2);
+  $cx;
+  }
+
+sub _fac
+  {
+  # factorial of $x
+  # ref to array, return ref to array
+  my ($c,$cx) = @_;
+
+  if ((@$cx == 1) && ($cx->[0] <= 2))
+    {
+    $cx->[0] ||= 1;		# 0 => 1, 1 => 1, 2 => 2
+    return $cx;
+    }
+
+  # go forward until $base is exceeded
+  # limit is either $x steps (steps == 100 means a result always too high) or
+  # $base.
+  my $steps = 100; $steps = $cx->[0] if @$cx == 1;
+  my $r = 2; my $cf = 3; my $step = 2; my $last = $r;
+  while ($r*$cf < $BASE && $step < $steps)
+    {
+    $last = $r; $r *= $cf++; $step++;
+    }
+  if ((@$cx == 1) && $step == $cx->[0])
+    {
+    # completely done, so keep reference to $x and return
+    $cx->[0] = $r;
+    return $cx;
+    }
+  
+  # now we must do the left over steps
+  my $n;					# steps still to do
+  if (scalar @$cx == 1)
+    {
+    $n = $cx->[0];
+    }
+  else
+    {
+    $n = _copy($c,$cx);
+    }
+
+  $cx->[0] = $last; splice (@$cx,1);		# keep ref to $x
+  my $zero_elements = 0;
+
+  # do left-over steps fit into a scalar?
+  if (ref $n eq 'ARRAY')
+    {
+    # No, so use slower inc() & cmp()
+    $step = [$step];
+    while (_acmp($step,$n) <= 0)
+      {
+      # as soon as the last element of $cx is 0, we split it up and remember
+      # how many zeors we got so far. The reason is that n! will accumulate
+      # zeros at the end rather fast.
+      if ($cx->[0] == 0)
+        {
+        $zero_elements ++; shift @$cx;
+        }
+      _mul($c,$cx,$step); _inc($c,$step);
+      }
+    }
+  else
+    {
+    # Yes, so we can speed it up slightly
+    while ($step <= $n)
+      {
+      # When the last element of $cx is 0, we split it up and remember
+      # how many we got so far. The reason is that n! will accumulate
+      # zeros at the end rather fast.
+      if ($cx->[0] == 0)
+        {
+        $zero_elements ++; shift @$cx;
+        }
+      _mul($c,$cx,[$step]); $step++;
+      }
+    }
+  # multiply in the zeros again
+  while ($zero_elements-- > 0)
+    {
+    unshift @$cx, 0; 
+    }
+  $cx;			# return result
+  }
+
+#############################################################################
+
+sub _log_int
+  {
+  # calculate integer log of $x to base $base
+  # ref to array, ref to array - return ref to array
+  my ($c,$x,$base) = @_;
+
+  # X == 0 => NaN
+  return if (scalar @$x == 1 && $x->[0] == 0);
+  # BASE 0 or 1 => NaN
+  return if (scalar @$base == 1 && $base->[0] < 2);
+  my $cmp = _acmp($c,$x,$base); # X == BASE => 1
+  if ($cmp == 0)
+    {
+    splice (@$x,1); $x->[0] = 1;
+    return ($x,1)
+    }
+  # X < BASE
+  if ($cmp < 0)
+    {
+    splice (@$x,1); $x->[0] = 0;
+    return ($x,undef);
+    }
+
+  # this trial multiplication is very fast, even for large counts (like for
+  # 2 ** 1024, since this still requires only 1024 very fast steps
+  # (multiplication of a large number by a very small number is very fast))
+  my $x_org = _copy($c,$x);		# preserve x
+  splice(@$x,1); $x->[0] = 1;		# keep ref to $x
+
+  my $trial = _copy($c,$base);
+
+  # XXX TODO this only works if $base has only one element
+  if (scalar @$base == 1)
+    {
+    # compute int ( length_in_base_10(X) / ( log(base) / log(10) ) )
+    my $len = _len($c,$x_org);
+    my $res = int($len / (log($base->[0]) / log(10))) || 1; # avoid $res == 0
+
+    $x->[0] = $res;
+    $trial = _pow ($c, _copy($c, $base), $x);
+    my $a = _acmp($x,$trial,$x_org);
+    return ($x,1) if $a == 0;
+    # we now know that $res is too small
+    if ($res < 0)
+      {
+      _mul($c,$trial,$base); _add($c, $x, [1]);
+      }
+    else
+      {
+      # or too big
+      _div($c,$trial,$base); _sub($c, $x, [1]);
+      }
+    # did we now get the right result?
+    $a = _acmp($x,$trial,$x_org);
+    return ($x,1) if $a == 0;		# yes, exactly
+    # still too big
+    if ($a > 0)
+      {
+      _div($c,$trial,$base); _sub($c, $x, [1]);
+      }
+    } 
+  
+  # simple loop that increments $x by two in each step, possible overstepping
+  # the real result by one
+
+  my $a;
+  my $base_mul = _mul($c, _copy($c,$base), $base);
+
+  while (($a = _acmp($c,$trial,$x_org)) < 0)
+    {
+    _mul($c,$trial,$base_mul); _add($c, $x, [2]);
+    }
+
+  my $exact = 1;
+  if ($a > 0)
+    {
+    # overstepped the result
+    _dec($c, $x);
+    _div($c,$trial,$base);
+    $a = _acmp($c,$trial,$x_org);
+    if ($a > 0)
+      {
+      _dec($c, $x);
+      }
+    $exact = 0 if $a != 0;
+    }
+  
+  ($x,$exact);				# return result
+  }
+
+# for debugging:
+  use constant DEBUG => 0;
+  my $steps = 0;
+  sub steps { $steps };
+
+sub _sqrt
+  {
+  # square-root of $x in place
+  # Compute a guess of the result (by rule of thumb), then improve it via
+  # Newton's method.
+  my ($c,$x) = @_;
+
+  if (scalar @$x == 1)
+    {
+    # fit's into one Perl scalar, so result can be computed directly
+    $x->[0] = int(sqrt($x->[0]));
+    return $x;
+    } 
+  my $y = _copy($c,$x);
+  # hopefully _len/2 is < $BASE, the -1 is to always undershot the guess
+  # since our guess will "grow"
+  my $l = int((_len($c,$x)-1) / 2);	
+
+  my $lastelem = $x->[-1];					# for guess
+  my $elems = scalar @$x - 1;
+  # not enough digits, but could have more?
+  if ((length($lastelem) <= 3) && ($elems > 1))
+    {
+    # right-align with zero pad
+    my $len = length($lastelem) & 1;
+    print "$lastelem => " if DEBUG;
+    $lastelem .= substr($x->[-2] . '0' x $BASE_LEN,0,$BASE_LEN);
+    # former odd => make odd again, or former even to even again
+    $lastelem = $lastelem / 10 if (length($lastelem) & 1) != $len;
+    print "$lastelem\n" if DEBUG;
+    }
+
+  # construct $x (instead of _lsft($c,$x,$l,10)
+  my $r = $l % $BASE_LEN;	# 10000 00000 00000 00000 ($BASE_LEN=5)
+  $l = int($l / $BASE_LEN);
+  print "l =  $l " if DEBUG;
+
+  splice @$x,$l;		# keep ref($x), but modify it
+
+  # we make the first part of the guess not '1000...0' but int(sqrt($lastelem))
+  # that gives us:
+  # 14400 00000 => sqrt(14400) => guess first digits to be 120
+  # 144000 000000 => sqrt(144000) => guess 379
+
+  print "$lastelem (elems $elems) => " if DEBUG;
+  $lastelem = $lastelem / 10 if ($elems & 1 == 1);		# odd or even?
+  my $g = sqrt($lastelem); $g =~ s/\.//;			# 2.345 => 2345
+  $r -= 1 if $elems & 1 == 0;					# 70 => 7
+
+  # padd with zeros if result is too short
+  $x->[$l--] = int(substr($g . '0' x $r,0,$r+1));
+  print "now ",$x->[-1] if DEBUG;
+  print " would have been ", int('1' . '0' x $r),"\n" if DEBUG;
+
+  # If @$x > 1, we could compute the second elem of the guess, too, to create
+  # an even better guess. Not implemented yet. Does it improve performance?
+  $x->[$l--] = 0 while ($l >= 0);	# all other digits of guess are zero
+
+  print "start x= ",_str($c,$x),"\n" if DEBUG;
+  my $two = _two();
+  my $last = _zero();
+  my $lastlast = _zero();
+  $steps = 0 if DEBUG;
+  while (_acmp($c,$last,$x) != 0 && _acmp($c,$lastlast,$x) != 0)
+    {
+    $steps++ if DEBUG;
+    $lastlast = _copy($c,$last);
+    $last = _copy($c,$x);
+    _add($c,$x, _div($c,_copy($c,$y),$x));
+    _div($c,$x, $two );
+    print " x= ",_str($c,$x),"\n" if DEBUG;
+    }
+  print "\nsteps in sqrt: $steps, " if DEBUG;
+  _dec($c,$x) if _acmp($c,$y,_mul($c,_copy($c,$x),$x)) < 0;	# overshot? 
+  print " final ",$x->[-1],"\n" if DEBUG;
+  $x;
+  }
+
+sub _root
+  {
+  # take n'th root of $x in place (n >= 3)
+  my ($c,$x,$n) = @_;
+ 
+  if (scalar @$x == 1)
+    {
+    if (scalar @$n > 1)
+      {
+      # result will always be smaller than 2 so trunc to 1 at once
+      $x->[0] = 1;
+      }
+    else
+      {
+      # fit's into one Perl scalar, so result can be computed directly
+      # cannot use int() here, because it rounds wrongly (try 
+      # (81 ** 3) ** (1/3) to see what I mean)
+      #$x->[0] = int( $x->[0] ** (1 / $n->[0]) );
+      # round to 8 digits, then truncate result to integer
+      $x->[0] = int ( sprintf ("%.8f", $x->[0] ** (1 / $n->[0]) ) );
+      }
+    return $x;
+    } 
+
+  # we know now that X is more than one element long
+
+  # if $n is a power of two, we can repeatedly take sqrt($X) and find the
+  # proper result, because sqrt(sqrt($x)) == root($x,4)
+  my $b = _as_bin($c,$n);
+  if ($b =~ /0b1(0+)$/)
+    {
+    my $count = CORE::length($1);	# 0b100 => len('00') => 2
+    my $cnt = $count;			# counter for loop
+    unshift (@$x, 0);			# add one element, together with one
+					# more below in the loop this makes 2
+    while ($cnt-- > 0)
+      {
+      # 'inflate' $X by adding one element, basically computing
+      # $x * $BASE * $BASE. This gives us more $BASE_LEN digits for result
+      # since len(sqrt($X)) approx == len($x) / 2.
+      unshift (@$x, 0);
+      # calculate sqrt($x), $x is now one element to big, again. In the next
+      # round we make that two, again.
+      _sqrt($c,$x);
+      }
+    # $x is now one element to big, so truncate result by removing it
+    splice (@$x,0,1);
+    } 
+  else
+    {
+    # trial computation by starting with 2,4,8,16 etc until we overstep
+    my $step;
+    my $trial = _two();
+
+    # while still to do more than X steps
+    do
+      {
+      $step = _two();
+      while (_acmp($c, _pow($c, _copy($c, $trial), $n), $x) < 0)
+        {
+        _mul ($c, $step, [2]);
+        _add ($c, $trial, $step);
+        }
+
+      # hit exactly?
+      if (_acmp($c, _pow($c, _copy($c, $trial), $n), $x) == 0)
+        {
+        @$x = @$trial;			# make copy while preserving ref to $x
+        return $x;
+        }
+      # overstepped, so go back on step
+      _sub($c, $trial, $step);
+      } while (scalar @$step > 1 || $step->[0] > 128);
+
+    # reset step to 2
+    $step = _two();
+    # add two, because $trial cannot be exactly the result (otherwise we would
+    # alrady have found it)
+    _add($c, $trial, $step);
+ 
+    # and now add more and more (2,4,6,8,10 etc)
+    while (_acmp($c, _pow($c, _copy($c, $trial), $n), $x) < 0)
+      {
+      _add ($c, $trial, $step);
+      }
+
+    # hit not exactly? (overstepped)
+    if (_acmp($c, _pow($c, _copy($c, $trial), $n), $x) > 0)
+      {
+      _dec($c,$trial);
+      }
+
+    # hit not exactly? (overstepped)
+    # 80 too small, 81 slightly too big, 82 too big
+    if (_acmp($c, _pow($c, _copy($c, $trial), $n), $x) > 0)
+      {
+      _dec ($c, $trial); 
+      }
+
+    @$x = @$trial;			# make copy while preserving ref to $x
+    return $x;
+    }
+  $x; 
+  }
+
+##############################################################################
+# binary stuff
+
+sub _and
+  {
+  my ($c,$x,$y) = @_;
+
+  # the shortcut makes equal, large numbers _really_ fast, and makes only a
+  # very small performance drop for small numbers (e.g. something with less
+  # than 32 bit) Since we optimize for large numbers, this is enabled.
+  return $x if _acmp($c,$x,$y) == 0;		# shortcut
+  
+  my $m = _one(); my ($xr,$yr);
+  my $mask = $AND_MASK;
+
+  my $x1 = $x;
+  my $y1 = _copy($c,$y);			# make copy
+  $x = _zero();
+  my ($b,$xrr,$yrr);
+  use integer;
+  while (!_is_zero($c,$x1) && !_is_zero($c,$y1))
+    {
+    ($x1, $xr) = _div($c,$x1,$mask);
+    ($y1, $yr) = _div($c,$y1,$mask);
+
+    # make ints() from $xr, $yr
+    # this is when the AND_BITS are greater than $BASE and is slower for
+    # small (<256 bits) numbers, but faster for large numbers. Disabled
+    # due to KISS principle
+
+#    $b = 1; $xrr = 0; foreach (@$xr) { $xrr += $_ * $b; $b *= $BASE; }
+#    $b = 1; $yrr = 0; foreach (@$yr) { $yrr += $_ * $b; $b *= $BASE; }
+#    _add($c,$x, _mul($c, _new( $c, ($xrr & $yrr) ), $m) );
+    
+    # 0+ due to '&' doesn't work in strings
+    _add($c,$x, _mul($c, [ 0+$xr->[0] & 0+$yr->[0] ], $m) );
+    _mul($c,$m,$mask);
+    }
+  $x;
+  }
+
+sub _xor
+  {
+  my ($c,$x,$y) = @_;
+
+  return _zero() if _acmp($c,$x,$y) == 0;	# shortcut (see -and)
+
+  my $m = _one(); my ($xr,$yr);
+  my $mask = $XOR_MASK;
+
+  my $x1 = $x;
+  my $y1 = _copy($c,$y);			# make copy
+  $x = _zero();
+  my ($b,$xrr,$yrr);
+  use integer;
+  while (!_is_zero($c,$x1) && !_is_zero($c,$y1))
+    {
+    ($x1, $xr) = _div($c,$x1,$mask);
+    ($y1, $yr) = _div($c,$y1,$mask);
+    # make ints() from $xr, $yr (see _and())
+    #$b = 1; $xrr = 0; foreach (@$xr) { $xrr += $_ * $b; $b *= $BASE; }
+    #$b = 1; $yrr = 0; foreach (@$yr) { $yrr += $_ * $b; $b *= $BASE; }
+    #_add($c,$x, _mul($c, _new( $c, ($xrr ^ $yrr) ), $m) );
+
+    # 0+ due to '^' doesn't work in strings
+    _add($c,$x, _mul($c, [ 0+$xr->[0] ^ 0+$yr->[0] ], $m) );
+    _mul($c,$m,$mask);
+    }
+  # the loop stops when the shorter of the two numbers is exhausted
+  # the remainder of the longer one will survive bit-by-bit, so we simple
+  # multiply-add it in
+  _add($c,$x, _mul($c, $x1, $m) ) if !_is_zero($c,$x1);
+  _add($c,$x, _mul($c, $y1, $m) ) if !_is_zero($c,$y1);
+  
+  $x;
+  }
+
+sub _or
+  {
+  my ($c,$x,$y) = @_;
+
+  return $x if _acmp($c,$x,$y) == 0;		# shortcut (see _and)
+
+  my $m = _one(); my ($xr,$yr);
+  my $mask = $OR_MASK;
+
+  my $x1 = $x;
+  my $y1 = _copy($c,$y);			# make copy
+  $x = _zero();
+  my ($b,$xrr,$yrr);
+  use integer;
+  while (!_is_zero($c,$x1) && !_is_zero($c,$y1))
+    {
+    ($x1, $xr) = _div($c,$x1,$mask);
+    ($y1, $yr) = _div($c,$y1,$mask);
+    # make ints() from $xr, $yr (see _and())
+#    $b = 1; $xrr = 0; foreach (@$xr) { $xrr += $_ * $b; $b *= $BASE; }
+#    $b = 1; $yrr = 0; foreach (@$yr) { $yrr += $_ * $b; $b *= $BASE; }
+#    _add($c,$x, _mul($c, _new( $c, ($xrr | $yrr) ), $m) );
+    
+    # 0+ due to '|' doesn't work in strings
+    _add($c,$x, _mul($c, [ 0+$xr->[0] | 0+$yr->[0] ], $m) );
+    _mul($c,$m,$mask);
+    }
+  # the loop stops when the shorter of the two numbers is exhausted
+  # the remainder of the longer one will survive bit-by-bit, so we simple
+  # multiply-add it in
+  _add($c,$x, _mul($c, $x1, $m) ) if !_is_zero($c,$x1);
+  _add($c,$x, _mul($c, $y1, $m) ) if !_is_zero($c,$y1);
+  
+  $x;
+  }
+
+sub _as_hex
+  {
+  # convert a decimal number to hex (ref to array, return ref to string)
+  my ($c,$x) = @_;
+
+  # fit's into one element (handle also 0x0 case)
+  return sprintf("0x%x",$x->[0]) if @$x == 1;
+
+  my $x1 = _copy($c,$x);
+
+  my $es = '';
+  my ($xr, $h, $x10000);
+  if ($] >= 5.006)
+    {
+    $x10000 = [ 0x10000 ]; $h = 'h4';
+    }
+  else
+    {
+    $x10000 = [ 0x1000 ]; $h = 'h3';
+    }
+  while (@$x1 != 1 || $x1->[0] != 0)		# _is_zero()
+    {
+    ($x1, $xr) = _div($c,$x1,$x10000);
+    $es .= unpack($h,pack('v',$xr->[0]));	# XXX TODO: why pack('v',...)?
+    }
+  $es = reverse $es;
+  $es =~ s/^[0]+//;   # strip leading zeros
+  '0x' . $es;					# return result prepended with 0x
+  }
+
+sub _as_bin
+  {
+  # convert a decimal number to bin (ref to array, return ref to string)
+  my ($c,$x) = @_;
+
+  # fit's into one element (and Perl recent enough), handle also 0b0 case
+  # handle zero case for older Perls
+  if ($] <= 5.005 && @$x == 1 && $x->[0] == 0)
+    {
+    my $t = '0b0'; return $t;
+    }
+  if (@$x == 1 && $] >= 5.006)
+    {
+    my $t = sprintf("0b%b",$x->[0]);
+    return $t;
+    }
+  my $x1 = _copy($c,$x);
+
+  my $es = '';
+  my ($xr, $b, $x10000);
+  if ($] >= 5.006)
+    {
+    $x10000 = [ 0x10000 ]; $b = 'b16';
+    }
+  else
+    {
+    $x10000 = [ 0x1000 ]; $b = 'b12';
+    }
+  while (!(@$x1 == 1 && $x1->[0] == 0))		# _is_zero()
+    {
+    ($x1, $xr) = _div($c,$x1,$x10000);
+    $es .= unpack($b,pack('v',$xr->[0]));	# XXX TODO: why pack('v',...)?
+    # $es .= unpack($b,$xr->[0]);
+    }
+  $es = reverse $es;
+  $es =~ s/^[0]+//;   # strip leading zeros
+  '0b' . $es;					# return result prepended with 0b
+  }
+
+sub _from_hex
+  {
+  # convert a hex number to decimal (ref to string, return ref to array)
+  my ($c,$hs) = @_;
+
+  my $m = _new($c, 0x10000000);			# 28 bit at a time (<32 bit!)
+  my $d = 7;					# 7 digits at a time
+  if ($] <= 5.006)
+    {
+    # for older Perls, play safe
+    $m = [ 0x10000 ];				# 16 bit at a time (<32 bit!)
+    $d = 4;					# 4 digits at a time
+    }
+
+  my $mul = _one();
+  my $x = _zero();
+
+  my $len = int( (length($hs)-2)/$d );		# $d digit parts, w/o the '0x'
+  my $val; my $i = -$d;
+  while ($len >= 0)
+    {
+    $val = substr($hs,$i,$d);			# get hex digits
+    $val =~ s/^[+-]?0x// if $len == 0;		# for last part only because
+    $val = hex($val);				# hex does not like wrong chars
+    $i -= $d; $len --;
+    my $adder = [ $val ];
+    # if the resulting number was to big to fit into one element, create a
+    # two-element version (bug found by Mark Lakata - Thanx!)
+    if (CORE::length($val) > $BASE_LEN)
+      {
+      $adder = _new($c,$val);
+      }
+    _add ($c, $x, _mul ($c, $adder, $mul ) ) if $val != 0;
+    _mul ($c, $mul, $m ) if $len >= 0; 		# skip last mul
+    }
+  $x;
+  }
+
+sub _from_bin
+  {
+  # convert a hex number to decimal (ref to string, return ref to array)
+  my ($c,$bs) = @_;
+
+  # instead of converting X (8) bit at a time, it is faster to "convert" the
+  # number to hex, and then call _from_hex.
+
+  my $hs = $bs;
+  $hs =~ s/^[+-]?0b//;					# remove sign and 0b
+  my $l = length($hs);					# bits
+  $hs = '0' x (8-($l % 8)) . $hs if ($l % 8) != 0;	# padd left side w/ 0
+  my $h = '0x' . unpack('H*', pack ('B*', $hs));	# repack as hex
+  
+  $c->_from_hex($h);
+  }
+
+##############################################################################
+# special modulus functions
+
+sub _modinv
+  {
+  # modular inverse
+  my ($c,$x,$y) = @_;
+
+  my $u = _zero($c); my $u1 = _one($c);
+  my $a = _copy($c,$y); my $b = _copy($c,$x);
+
+  # Euclid's Algorithm for bgcd(), only that we calc bgcd() ($a) and the
+  # result ($u) at the same time. See comments in BigInt for why this works.
+  my $q;
+  ($a, $q, $b) = ($b, _div($c,$a,$b));		# step 1
+  my $sign = 1;
+  while (!_is_zero($c,$b))
+    {
+    my $t = _add($c, 				# step 2:
+       _mul($c,_copy($c,$u1), $q) ,		#  t =  u1 * q
+       $u );					#     + u
+    $u = $u1;					#  u = u1, u1 = t
+    $u1 = $t;
+    $sign = -$sign;
+    ($a, $q, $b) = ($b, _div($c,$a,$b));	# step 1
+    }
+
+  # if the gcd is not 1, then return NaN
+  return (undef,undef) unless _is_one($c,$a);
+ 
+  ($u1, $sign == 1 ? '+' : '-');
+  }
+
+sub _modpow
+  {
+  # modulus of power ($x ** $y) % $z
+  my ($c,$num,$exp,$mod) = @_;
+
+  # in the trivial case,
+  if (_is_one($c,$mod))
+    {
+    splice @$num,0,1; $num->[0] = 0;
+    return $num;
+    }
+  if ((scalar @$num == 1) && (($num->[0] == 0) || ($num->[0] == 1)))
+    {
+    $num->[0] = 1;
+    return $num;
+    }
+
+#  $num = _mod($c,$num,$mod);	# this does not make it faster
+
+  my $acc = _copy($c,$num); my $t = _one();
+
+  my $expbin = _as_bin($c,$exp); $expbin =~ s/^0b//;
+  my $len = length($expbin);
+  while (--$len >= 0)
+    {
+    if ( substr($expbin,$len,1) eq '1')			# is_odd
+      {
+      _mul($c,$t,$acc);
+      $t = _mod($c,$t,$mod);
+      }
+    _mul($c,$acc,$acc);
+    $acc = _mod($c,$acc,$mod);
+    }
+  @$num = @$t;
+  $num;
+  }
+
+sub _gcd
+  {
+  # greatest common divisor
+  my ($c,$x,$y) = @_;
+
+  while ( (scalar @$y != 1) || ($y->[0] != 0) )		# while ($y != 0)
+    {
+    my $t = _copy($c,$y);
+    $y = _mod($c, $x, $y);
+    $x = $t;
+    }
+  $x;
+  }
+
+##############################################################################
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Math::BigInt::Calc - Pure Perl module to support Math::BigInt
+
+=head1 SYNOPSIS
+
+Provides support for big integer calculations. Not intended to be used by other
+modules. Other modules which sport the same functions can also be used to support
+Math::BigInt, like Math::BigInt::GMP or Math::BigInt::Pari.
+
+=head1 DESCRIPTION
+
+In order to allow for multiple big integer libraries, Math::BigInt was
+rewritten to use library modules for core math routines. Any module which
+follows the same API as this can be used instead by using the following:
+
+	use Math::BigInt lib => 'libname';
+
+'libname' is either the long name ('Math::BigInt::Pari'), or only the short
+version like 'Pari'.
+
+=head1 STORAGE
+
+=head1 METHODS
+
+The following functions MUST be defined in order to support the use by
+Math::BigInt v1.70 or later:
+
+	api_version()	return API version, minimum 1 for v1.70
+	_new(string)	return ref to new object from ref to decimal string
+	_zero()		return a new object with value 0
+	_one()		return a new object with value 1
+	_two()		return a new object with value 2
+	_ten()		return a new object with value 10
+
+	_str(obj)	return ref to a string representing the object
+	_num(obj)	returns a Perl integer/floating point number
+			NOTE: because of Perl numeric notation defaults,
+			the _num'ified obj may lose accuracy due to 
+			machine-dependend floating point size limitations
+                    
+	_add(obj,obj)	Simple addition of two objects
+	_mul(obj,obj)	Multiplication of two objects
+	_div(obj,obj)	Division of the 1st object by the 2nd
+			In list context, returns (result,remainder).
+			NOTE: this is integer math, so no
+			fractional part will be returned.
+			The second operand will be not be 0, so no need to
+			check for that.
+	_sub(obj,obj)	Simple subtraction of 1 object from another
+			a third, optional parameter indicates that the params
+			are swapped. In this case, the first param needs to
+			be preserved, while you can destroy the second.
+			sub (x,y,1) => return x - y and keep x intact!
+	_dec(obj)	decrement object by one (input is garant. to be > 0)
+	_inc(obj)	increment object by one
+
+
+	_acmp(obj,obj)	<=> operator for objects (return -1, 0 or 1)
+
+	_len(obj)	returns count of the decimal digits of the object
+	_digit(obj,n)	returns the n'th decimal digit of object
+
+	_is_one(obj)	return true if argument is 1
+	_is_two(obj)	return true if argument is 2
+	_is_ten(obj)	return true if argument is 10
+	_is_zero(obj)	return true if argument is 0
+	_is_even(obj)	return true if argument is even (0,2,4,6..)
+	_is_odd(obj)	return true if argument is odd (1,3,5,7..)
+
+	_copy		return a ref to a true copy of the object
+
+	_check(obj)	check whether internal representation is still intact
+			return 0 for ok, otherwise error message as string
+
+	_from_hex(str)	return ref to new object from ref to hexadecimal string
+	_from_bin(str)	return ref to new object from ref to binary string
+	
+	_as_hex(str)	return string containing the value as
+			unsigned hex string, with the '0x' prepended.
+			Leading zeros must be stripped.
+	_as_bin(str)	Like as_hex, only as binary string containing only
+			zeros and ones. Leading zeros must be stripped and a
+			'0b' must be prepended.
+	
+	_rsft(obj,N,B)	shift object in base B by N 'digits' right
+	_lsft(obj,N,B)	shift object in base B by N 'digits' left
+	
+	_xor(obj1,obj2)	XOR (bit-wise) object 1 with object 2
+			Note: XOR, AND and OR pad with zeros if size mismatches
+	_and(obj1,obj2)	AND (bit-wise) object 1 with object 2
+	_or(obj1,obj2)	OR (bit-wise) object 1 with object 2
+
+	_mod(obj,obj)	Return remainder of div of the 1st by the 2nd object
+	_sqrt(obj)	return the square root of object (truncated to int)
+	_root(obj)	return the n'th (n >= 3) root of obj (truncated to int)
+	_fac(obj)	return factorial of object 1 (1*2*3*4..)
+	_pow(obj,obj)	return object 1 to the power of object 2
+			return undef for NaN
+	_zeros(obj)	return number of trailing decimal zeros
+	_modinv		return inverse modulus
+	_modpow		return modulus of power ($x ** $y) % $z
+	_log_int(X,N)	calculate integer log() of X in base N
+			X >= 0, N >= 0 (return undef for NaN)
+			returns (RESULT, EXACT) where EXACT is:
+			 1     : result is exactly RESULT
+			 0     : result was truncated to RESULT
+			 undef : unknown whether result is exactly RESULT
+        _gcd(obj,obj)	return Greatest Common Divisor of two objects
+
+The following functions are optional, and can be defined if the underlying lib
+has a fast way to do them. If undefined, Math::BigInt will use pure Perl (hence
+slow) fallback routines to emulate these:
+	
+	_signed_or
+	_signed_and
+	_signed_xor
+
+
+Input strings come in as unsigned but with prefix (i.e. as '123', '0xabc'
+or '0b1101').
+
+So the library needs only to deal with unsigned big integers. Testing of input
+parameter validity is done by the caller, so you need not worry about
+underflow (f.i. in C<_sub()>, C<_dec()>) nor about division by zero or similar
+cases.
+
+The first parameter can be modified, that includes the possibility that you
+return a reference to a completely different object instead. Although keeping
+the reference and just changing it's contents is prefered over creating and
+returning a different reference.
+
+Return values are always references to objects, strings, or true/false for
+comparisation routines.
+
+=head1 WRAP YOUR OWN
+
+If you want to port your own favourite c-lib for big numbers to the
+Math::BigInt interface, you can take any of the already existing modules as
+a rough guideline. You should really wrap up the latest BigInt and BigFloat
+testsuites with your module, and replace in them any of the following:
+
+	use Math::BigInt;
+
+by this:
+
+	use Math::BigInt lib => 'yourlib';
+
+This way you ensure that your library really works 100% within Math::BigInt.
+
+=head1 LICENSE
+ 
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself. 
+
+=head1 AUTHORS
+
+Original math code by Mark Biggar, rewritten by Tels L<http://bloodgate.com/>
+in late 2000.
+Seperated from BigInt and shaped API with the help of John Peacock.
+
+Fixed, speed-up, streamlined and enhanced by Tels 2001 - 2005.
+
+=head1 SEE ALSO
+
+L<Math::BigInt>, L<Math::BigFloat>, L<Math::BigInt::BitVect>,
+L<Math::BigInt::GMP>, L<Math::BigInt::FastCalc> and L<Math::BigInt::Pari>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt/CalcEmu.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt/CalcEmu.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt/CalcEmu.pm	(revision 14489)
@@ -0,0 +1,329 @@
+package Math::BigInt::CalcEmu;
+
+use 5.005;
+use strict;
+# use warnings;	# dont use warnings for older Perls
+use vars qw/$VERSION/;
+
+$VERSION = '0.05';
+
+package Math::BigInt;
+
+# See SYNOPSIS below.
+
+my $CALC_EMU;
+
+BEGIN
+  {
+  $CALC_EMU = Math::BigInt->config()->{'lib'};
+  # register us with MBI to get notified of future lib changes
+  Math::BigInt::_register_callback( __PACKAGE__, sub { $CALC_EMU = $_[0]; } );
+  }
+
+sub __emu_band
+  {
+  my ($self,$x,$y,$sx,$sy,@r) = @_;
+
+  return $x->bzero(@r) if $y->is_zero() || $x->is_zero();
+  
+  my $sign = 0;					# sign of result
+  $sign = 1 if $sx == -1 && $sy == -1;
+
+  my ($bx,$by);
+
+  if ($sx == -1)				# if x is negative
+    {
+    # two's complement: inc and flip all "bits" in $bx
+    $bx = $x->binc()->as_hex();			# -1 => 0, -2 => 1, -3 => 2 etc
+    $bx =~ s/-?0x//;
+    $bx =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  else
+    {
+    $bx = $x->as_hex();				# get binary representation
+    $bx =~ s/-?0x//;
+    $bx =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  if ($sy == -1)				# if y is negative
+    {
+    # two's complement: inc and flip all "bits" in $by
+    $by = $y->copy()->binc()->as_hex();		# -1 => 0, -2 => 1, -3 => 2 etc
+    $by =~ s/-?0x//;
+    $by =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  else
+    {
+    $by = $y->as_hex();				# get binary representation
+    $by =~ s/-?0x//;
+    $by =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  # now we have bit-strings from X and Y, reverse them for padding
+  $bx = reverse $bx;
+  $by = reverse $by;
+
+  # padd the shorter string
+  my $xx = "\x00"; $xx = "\x0f" if $sx == -1;
+  my $yy = "\x00"; $yy = "\x0f" if $sy == -1;
+  my $diff = CORE::length($bx) - CORE::length($by);
+  if ($diff > 0)
+    {
+    # if $yy eq "\x00", we can cut $bx, otherwise we need to padd $by
+    $by .= $yy x $diff;
+    }
+  elsif ($diff < 0)
+    {
+    # if $xx eq "\x00", we can cut $by, otherwise we need to padd $bx
+    $bx .= $xx x abs($diff);
+    }
+  
+  # and the strings together
+  my $r = $bx & $by;
+
+  # and reverse the result again
+  $bx = reverse $r;
+
+  # One of $x or $y was negative, so need to flip bits in the result.
+  # In both cases (one or two of them negative, or both positive) we need
+  # to get the characters back.
+  if ($sign == 1)
+    {
+    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/0123456789abcdef/;
+    }
+  else
+    {
+    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/fedcba9876543210/;
+    }
+
+  # leading zeros will be stripped by _from_hex()
+  $bx = '0x' . $bx;
+  $x->{value} = $CALC_EMU->_from_hex( $bx );
+
+  # calculate sign of result
+  $x->{sign} = '+';
+  $x->{sign} = '-' if $sign == 1 && !$x->is_zero();
+
+  $x->bdec() if $sign == 1;
+
+  $x->round(@r);
+  }
+
+sub __emu_bior
+  {
+  my ($self,$x,$y,$sx,$sy,@r) = @_;
+
+  return $x->round(@r) if $y->is_zero();
+
+  my $sign = 0;					# sign of result
+  $sign = 1 if ($sx == -1) || ($sy == -1);
+
+  my ($bx,$by);
+
+  if ($sx == -1)				# if x is negative
+    {
+    # two's complement: inc and flip all "bits" in $bx
+    $bx = $x->binc()->as_hex();			# -1 => 0, -2 => 1, -3 => 2 etc
+    $bx =~ s/-?0x//;
+    $bx =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  else
+    {
+    $bx = $x->as_hex();				# get binary representation
+    $bx =~ s/-?0x//;
+    $bx =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  if ($sy == -1)				# if y is negative
+    {
+    # two's complement: inc and flip all "bits" in $by
+    $by = $y->copy()->binc()->as_hex();		# -1 => 0, -2 => 1, -3 => 2 etc
+    $by =~ s/-?0x//;
+    $by =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  else
+    {
+    $by = $y->as_hex();				# get binary representation
+    $by =~ s/-?0x//;
+    $by =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  # now we have bit-strings from X and Y, reverse them for padding
+  $bx = reverse $bx;
+  $by = reverse $by;
+
+  # padd the shorter string
+  my $xx = "\x00"; $xx = "\x0f" if $sx == -1;
+  my $yy = "\x00"; $yy = "\x0f" if $sy == -1;
+  my $diff = CORE::length($bx) - CORE::length($by);
+  if ($diff > 0)
+    {
+    $by .= $yy x $diff;
+    }
+  elsif ($diff < 0)
+    {
+    $bx .= $xx x abs($diff);
+    }
+
+  # or the strings together
+  my $r = $bx | $by;
+
+  # and reverse the result again
+  $bx = reverse $r;
+
+  # one of $x or $y was negative, so need to flip bits in the result
+  # in both cases (one or two of them negative, or both positive) we need
+  # to get the characters back.
+  if ($sign == 1)
+    {
+    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/0123456789abcdef/;
+    }
+  else
+    {
+    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/fedcba9876543210/;
+    }
+
+  # leading zeros will be stripped by _from_hex()
+  $bx = '0x' . $bx;
+  $x->{value} = $CALC_EMU->_from_hex( $bx );
+
+  # calculate sign of result
+  $x->{sign} = '+';
+  $x->{sign} = '-' if $sign == 1 && !$x->is_zero();
+
+  # if one of X or Y was negative, we need to decrement result
+  $x->bdec() if $sign == 1;
+
+  $x->round(@r);
+  }
+
+sub __emu_bxor
+  {
+  my ($self,$x,$y,$sx,$sy,@r) = @_;
+
+  return $x->round(@r) if $y->is_zero();
+
+  my $sign = 0;					# sign of result
+  $sign = 1 if $x->{sign} ne $y->{sign};
+
+  my ($bx,$by);
+
+  if ($sx == -1)				# if x is negative
+    {
+    # two's complement: inc and flip all "bits" in $bx
+    $bx = $x->binc()->as_hex();			# -1 => 0, -2 => 1, -3 => 2 etc
+    $bx =~ s/-?0x//;
+    $bx =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  else
+    {
+    $bx = $x->as_hex();				# get binary representation
+    $bx =~ s/-?0x//;
+    $bx =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  if ($sy == -1)				# if y is negative
+    {
+    # two's complement: inc and flip all "bits" in $by
+    $by = $y->copy()->binc()->as_hex();		# -1 => 0, -2 => 1, -3 => 2 etc
+    $by =~ s/-?0x//;
+    $by =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  else
+    {
+    $by = $y->as_hex();				# get binary representation
+    $by =~ s/-?0x//;
+    $by =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
+    }
+  # now we have bit-strings from X and Y, reverse them for padding
+  $bx = reverse $bx;
+  $by = reverse $by;
+
+  # padd the shorter string
+  my $xx = "\x00"; $xx = "\x0f" if $sx == -1;
+  my $yy = "\x00"; $yy = "\x0f" if $sy == -1;
+  my $diff = CORE::length($bx) - CORE::length($by);
+  if ($diff > 0)
+    {
+    $by .= $yy x $diff;
+    }
+  elsif ($diff < 0)
+    {
+    $bx .= $xx x abs($diff);
+    }
+
+  # xor the strings together
+  my $r = $bx ^ $by;
+
+  # and reverse the result again
+  $bx = reverse $r;
+
+  # one of $x or $y was negative, so need to flip bits in the result
+  # in both cases (one or two of them negative, or both positive) we need
+  # to get the characters back.
+  if ($sign == 1)
+    {
+    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/0123456789abcdef/;
+    }
+  else
+    {
+    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/fedcba9876543210/;
+    }
+
+  # leading zeros will be stripped by _from_hex()
+  $bx = '0x' . $bx;
+  $x->{value} = $CALC_EMU->_from_hex( $bx );
+
+  # calculate sign of result
+  $x->{sign} = '+';
+  $x->{sign} = '-' if $sx != $sy && !$x->is_zero();
+
+  $x->bdec() if $sign == 1;
+
+  $x->round(@r);
+  }
+
+##############################################################################
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Math::BigInt::CalcEmu - Emulate low-level math with BigInt code
+
+=head1 SYNOPSIS
+
+	use Math::BigInt::CalcEmu;
+
+=head1 DESCRIPTION
+
+Contains routines that emulate low-level math functions in BigInt, e.g.
+optional routines the low-level math package does not provide on it's own.
+
+Will be loaded on demand and called automatically by BigInt.
+
+Stuff here is really low-priority to optimize, since it is far better to
+implement the operation in the low-level math libary directly, possible even
+using a call to the native lib.
+
+=head1 METHODS
+
+=head2 __emu_bxor
+
+=head2 __emu_band
+
+=head2 __emu_bior
+
+=head1 LICENSE
+ 
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself. 
+
+=head1 AUTHORS
+
+(c) Tels http://bloodgate.com 2003, 2004 - based on BigInt code by
+Tels from 2001-2003.
+
+=head1 SEE ALSO
+
+L<Math::BigInt>, L<Math::BigFloat>, L<Math::BigInt::BitVect>,
+L<Math::BigInt::GMP> and L<Math::BigInt::Pari>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt/Trace.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt/Trace.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Math/BigInt/Trace.pm	(revision 14489)
@@ -0,0 +1,47 @@
+#!/usr/bin/perl -w
+
+package Math::BigInt::Trace;
+
+require 5.005_02;
+use strict;
+
+use Exporter;
+use Math::BigInt;
+use vars qw($VERSION @ISA $PACKAGE @EXPORT_OK
+            $accuracy $precision $round_mode $div_scale);
+
+@ISA = qw(Exporter Math::BigInt);
+
+$VERSION = 0.01;
+
+use overload;	# inherit overload from BigInt
+
+# Globals
+$accuracy = $precision = undef;
+$round_mode = 'even';
+$div_scale = 40;
+
+sub new
+{
+        my $proto  = shift;
+        my $class  = ref($proto) || $proto;
+
+        my $value       = shift;
+	my $a = $accuracy; $a = $_[0] if defined $_[0];
+	my $p = $precision; $p = $_[1] if defined $_[1];
+        my $self = Math::BigInt->new($value,$a,$p,$round_mode);
+	bless $self,$class;
+	print "MBI new '$value' => '$self' (",ref($self),")";
+        return $self;
+}
+
+sub import
+  {
+  print "MBI import ",join(' ',@_);
+  my $self = shift;
+  Math::BigInt::import($self,@_);		# need it for subclasses
+#  $self->export_to_level(1,$self,@_);		# need this ?
+  @_ = ();
+  }
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Math/BigRat.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Math/BigRat.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Math/BigRat.pm	(revision 14489)
@@ -0,0 +1,1688 @@
+
+#
+# "Tax the rat farms." - Lord Vetinari
+#
+
+# The following hash values are used:
+#   sign : +,-,NaN,+inf,-inf
+#   _d   : denominator
+#   _n   : numeraotr (value = _n/_d)
+#   _a   : accuracy
+#   _p   : precision
+# You should not look at the innards of a BigRat - use the methods for this.
+
+package Math::BigRat;
+
+require 5.005_03;
+use strict;
+
+use Math::BigFloat;
+use vars qw($VERSION @ISA $upgrade $downgrade
+            $accuracy $precision $round_mode $div_scale $_trap_nan $_trap_inf);
+
+@ISA = qw(Math::BigFloat);
+
+$VERSION = '0.15';
+
+use overload;			# inherit overload from Math::BigFloat
+
+BEGIN
+  { 
+  *objectify = \&Math::BigInt::objectify; 	# inherit this from BigInt
+  *AUTOLOAD = \&Math::BigFloat::AUTOLOAD;	# can't inherit AUTOLOAD
+  # we inherit these from BigFloat because currently it is not possible
+  # that MBF has a different $MBI variable than we, because MBF also uses
+  # Math::BigInt::config->('lib'); (there is always only one library loaded)
+  *_e_add = \&Math::BigFloat::_e_add;
+  *_e_sub = \&Math::BigFloat::_e_sub;
+  *as_int = \&as_number;
+  *is_pos = \&is_positive;
+  *is_neg = \&is_negative;
+  }
+
+##############################################################################
+# Global constants and flags. Access these only via the accessor methods!
+
+$accuracy = $precision = undef;
+$round_mode = 'even';
+$div_scale = 40;
+$upgrade = undef;
+$downgrade = undef;
+
+# These are internally, and not to be used from the outside at all!
+
+$_trap_nan = 0;                         # are NaNs ok? set w/ config()
+$_trap_inf = 0;                         # are infs ok? set w/ config()
+
+# the package we are using for our private parts, defaults to:
+# Math::BigInt->config()->{lib}
+my $MBI = 'Math::BigInt::Calc';
+
+my $nan = 'NaN';
+my $class = 'Math::BigRat';
+
+sub isa
+  {
+  return 0 if $_[1] =~ /^Math::Big(Int|Float)/;		# we aren't
+  UNIVERSAL::isa(@_);
+  }
+
+##############################################################################
+
+sub _new_from_float
+  {
+  # turn a single float input into a rational number (like '0.1')
+  my ($self,$f) = @_;
+
+  return $self->bnan() if $f->is_nan();
+  return $self->binf($f->{sign}) if $f->{sign} =~ /^[+-]inf$/;
+
+  $self->{_n} = $MBI->_copy( $f->{_m} );	# mantissa
+  $self->{_d} = $MBI->_one();
+  $self->{sign} = $f->{sign} || '+';
+  if ($f->{_es} eq '-')
+    {
+    # something like Math::BigRat->new('0.1');
+    # 1 / 1 => 1/10
+    $MBI->_lsft ( $self->{_d}, $f->{_e} ,10);	
+    }
+  else
+    {
+    # something like Math::BigRat->new('10');
+    # 1 / 1 => 10/1
+    $MBI->_lsft ( $self->{_n}, $f->{_e} ,10) unless 
+      $MBI->_is_zero($f->{_e});	
+    }
+  $self;
+  }
+
+sub new
+  {
+  # create a Math::BigRat
+  my $class = shift;
+
+  my ($n,$d) = @_;
+
+  my $self = { }; bless $self,$class;
+ 
+  # input like (BigInt) or (BigFloat):
+  if ((!defined $d) && (ref $n) && (!$n->isa('Math::BigRat')))
+    {
+    if ($n->isa('Math::BigFloat'))
+      {
+      $self->_new_from_float($n);
+      }
+    if ($n->isa('Math::BigInt'))
+      {
+      # TODO: trap NaN, inf
+      $self->{_n} = $MBI->_copy($n->{value});		# "mantissa" = N
+      $self->{_d} = $MBI->_one();			# d => 1
+      $self->{sign} = $n->{sign};
+      }
+    if ($n->isa('Math::BigInt::Lite'))
+      {
+      # TODO: trap NaN, inf
+      $self->{sign} = '+'; $self->{sign} = '-' if $$n < 0;
+      $self->{_n} = $MBI->_new(abs($$n));		# "mantissa" = N
+      $self->{_d} = $MBI->_one();			# d => 1
+      }
+    return $self->bnorm();				# normalize (120/1 => 12/10)
+    }
+
+  # input like (BigInt,BigInt) or (BigLite,BigLite):
+  if (ref($d) && ref($n))
+    {
+    # do N first (for $self->{sign}):
+    if ($n->isa('Math::BigInt'))
+      {
+      # TODO: trap NaN, inf
+      $self->{_n} = $MBI->_copy($n->{value});		# "mantissa" = N
+      $self->{sign} = $n->{sign};
+      }
+    elsif ($n->isa('Math::BigInt::Lite'))
+      {
+      # TODO: trap NaN, inf
+      $self->{sign} = '+'; $self->{sign} = '-' if $$n < 0;
+      $self->{_n} = $MBI->_new(abs($$n));		# "mantissa" = $n
+      }
+    else
+      {
+      require Carp;
+      Carp::croak(ref($n) . " is not a recognized object format for Math::BigRat->new");
+      }
+    # now D:
+    if ($d->isa('Math::BigInt'))
+      {
+      # TODO: trap NaN, inf
+      $self->{_d} = $MBI->_copy($d->{value});		# "mantissa" = D
+      # +/+ or -/- => +, +/- or -/+ => -
+      $self->{sign} = $d->{sign} ne $self->{sign} ? '-' : '+';
+      }
+    elsif ($d->isa('Math::BigInt::Lite'))
+      {
+      # TODO: trap NaN, inf
+      $self->{_d} = $MBI->_new(abs($$d));		# "mantissa" = D
+      my $ds = '+'; $ds = '-' if $$d < 0;
+      # +/+ or -/- => +, +/- or -/+ => -
+      $self->{sign} = $ds ne $self->{sign} ? '-' : '+';
+      }
+    else
+      {
+      require Carp;
+      Carp::croak(ref($d) . " is not a recognized object format for Math::BigRat->new");
+      }
+    return $self->bnorm();				# normalize (120/1 => 12/10)
+    }
+  return $n->copy() if ref $n;				# already a BigRat
+
+  if (!defined $n)
+    {
+    $self->{_n} = $MBI->_zero();			# undef => 0
+    $self->{_d} = $MBI->_one();
+    $self->{sign} = '+';
+    return $self;
+    }
+
+  # string input with / delimiter
+  if ($n =~ /\s*\/\s*/)
+    {
+    return $class->bnan() if $n =~ /\/.*\//;	# 1/2/3 isn't valid
+    return $class->bnan() if $n =~ /\/\s*$/;	# 1/ isn't valid
+    ($n,$d) = split (/\//,$n);
+    # try as BigFloats first
+    if (($n =~ /[\.eE]/) || ($d =~ /[\.eE]/))
+      {
+      local $Math::BigFloat::accuracy = undef;
+      local $Math::BigFloat::precision = undef;
+
+      # one of them looks like a float 
+      my $nf = Math::BigFloat->new($n,undef,undef);
+      $self->{sign} = '+';
+      return $self->bnan() if $nf->is_nan();
+
+      $self->{_n} = $MBI->_copy( $nf->{_m} );	# get mantissa
+
+      # now correct $self->{_n} due to $n
+      my $f = Math::BigFloat->new($d,undef,undef);
+      return $self->bnan() if $f->is_nan();
+      $self->{_d} = $MBI->_copy( $f->{_m} );
+
+      # calculate the difference between nE and dE
+      # XXX TODO: check that exponent() makes a copy to avoid copy()
+      my $diff_e = $nf->exponent()->copy()->bsub( $f->exponent);
+      if ($diff_e->is_negative())
+	{
+        # < 0: mul d with it
+        $MBI->_lsft( $self->{_d}, $MBI->_new( $diff_e->babs()), 10);
+	}
+      elsif (!$diff_e->is_zero())
+        {
+        # > 0: mul n with it
+        $MBI->_lsft( $self->{_n}, $MBI->_new( $diff_e), 10);
+        }
+      }
+    else
+      {
+      # both d and n look like (big)ints
+
+      $self->{sign} = '+';					# no sign => '+'
+      $self->{_n} = undef;
+      $self->{_d} = undef;
+      if ($n =~ /^([+-]?)0*(\d+)\z/)				# first part ok?
+	{
+	$self->{sign} = $1 || '+';				# no sign => '+'
+	$self->{_n} = $MBI->_new($2 || 0);
+        }
+
+      if ($d =~ /^([+-]?)0*(\d+)\z/)				# second part ok?
+	{
+	$self->{sign} =~ tr/+-/-+/ if ($1 || '') eq '-';	# negate if second part neg.
+	$self->{_d} = $MBI->_new($2 || 0);
+        }
+
+      if (!defined $self->{_n} || !defined $self->{_d})
+	{
+        $d = Math::BigInt->new($d,undef,undef) unless ref $d;
+        $n = Math::BigInt->new($n,undef,undef) unless ref $n;
+
+        if ($n->{sign} =~ /^[+-]$/ && $d->{sign} =~ /^[+-]$/)
+	  { 
+	  # both parts are ok as integers (wierd things like ' 1e0'
+          $self->{_n} = $MBI->_copy($n->{value});
+          $self->{_d} = $MBI->_copy($d->{value});
+          $self->{sign} = $n->{sign};
+          $self->{sign} =~ tr/+-/-+/ if $d->{sign} eq '-';	# -1/-2 => 1/2
+          return $self->bnorm();
+	  }
+
+        $self->{sign} = '+';					# a default sign
+        return $self->bnan() if $n->is_nan() || $d->is_nan();
+
+	# handle inf cases:
+        if ($n->is_inf() || $d->is_inf())
+	  {
+	  if ($n->is_inf())
+	    {
+	    return $self->bnan() if $d->is_inf();		# both are inf => NaN
+	    my $s = '+'; 		# '+inf/+123' or '-inf/-123'
+	    $s = '-' if substr($n->{sign},0,1) ne $d->{sign};
+	    # +-inf/123 => +-inf
+	    return $self->binf($s);
+	    }
+          # 123/inf => 0
+          return $self->bzero();
+	  }
+	}
+      }
+
+    return $self->bnorm();
+    }
+
+  # simple string input
+  if (($n =~ /[\.eE]/))
+    {
+    # looks like a float, quacks like a float, so probably is a float
+    $self->{sign} = 'NaN';
+    local $Math::BigFloat::accuracy = undef;
+    local $Math::BigFloat::precision = undef;
+    $self->_new_from_float(Math::BigFloat->new($n,undef,undef));
+    }
+  else
+    {
+    # for simple forms, use $MBI directly
+    if ($n =~ /^([+-]?)0*(\d+)\z/)
+      {
+      $self->{sign} = $1 || '+';
+      $self->{_n} = $MBI->_new($2 || 0);
+      $self->{_d} = $MBI->_one();
+      }
+    else
+      {
+      my $n = Math::BigInt->new($n,undef,undef);
+      $self->{_n} = $MBI->_copy($n->{value});
+      $self->{_d} = $MBI->_one();
+      $self->{sign} = $n->{sign};
+      return $self->bnan() if $self->{sign} eq 'NaN';
+      return $self->binf($self->{sign}) if $self->{sign} =~ /^[+-]inf$/;
+      }
+    }
+  $self->bnorm();
+  }
+
+sub copy
+  {
+  # if two arguments, the first one is the class to "swallow" subclasses
+  my ($c,$x) = @_;
+
+  if (scalar @_ == 1)
+    {
+    $x = $_[0];
+    $c = ref($x);
+    }
+  return unless ref($x); # only for objects
+
+  my $self = bless {}, $c;
+
+  $self->{sign} = $x->{sign};
+  $self->{_d} = $MBI->_copy($x->{_d});
+  $self->{_n} = $MBI->_copy($x->{_n});
+  $self->{_a} = $x->{_a} if defined $x->{_a};
+  $self->{_p} = $x->{_p} if defined $x->{_p};
+  $self;
+  }
+
+##############################################################################
+
+sub config
+  {
+  # return (later set?) configuration data as hash ref
+  my $class = shift || 'Math::BigRat';
+
+  my $cfg = $class->SUPER::config(@_);
+
+  # now we need only to override the ones that are different from our parent
+  $cfg->{class} = $class;
+  $cfg->{with} = $MBI;
+  $cfg;
+  }
+
+##############################################################################
+
+sub bstr
+  {
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  if ($x->{sign} !~ /^[+-]$/)		# inf, NaN etc
+    {
+    my $s = $x->{sign}; $s =~ s/^\+//; 	# +inf => inf
+    return $s;
+    }
+
+  my $s = ''; $s = $x->{sign} if $x->{sign} ne '+';	# '+3/2' => '3/2'
+
+  return $s . $MBI->_str($x->{_n}) if $MBI->_is_one($x->{_d});
+  $s . $MBI->_str($x->{_n}) . '/' . $MBI->_str($x->{_d});
+  }
+
+sub bsstr
+  {
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  if ($x->{sign} !~ /^[+-]$/)		# inf, NaN etc
+    {
+    my $s = $x->{sign}; $s =~ s/^\+//; 	# +inf => inf
+    return $s;
+    }
+  
+  my $s = ''; $s = $x->{sign} if $x->{sign} ne '+';	# +3 vs 3
+  $s . $MBI->_str($x->{_n}) . '/' . $MBI->_str($x->{_d});
+  }
+
+sub bnorm
+  {
+  # reduce the number to the shortest form
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  # Both parts must be objects of whatever we are using today.
+  # Second check because Calc.pm has ARRAY res as unblessed objects.
+  if (ref($x->{_n}) ne $MBI && ref($x->{_n}) ne 'ARRAY')
+    {
+    require Carp; Carp::croak ("n is not $MBI but (".ref($x->{_n}).') in bnorm()');
+    }
+  if (ref($x->{_d}) ne $MBI && ref($x->{_d}) ne 'ARRAY')
+    {
+    require Carp; Carp::croak ("d is not $MBI but (".ref($x->{_d}).') in bnorm()');
+    }
+
+  # no normalize for NaN, inf etc.
+  return $x if $x->{sign} !~ /^[+-]$/;
+
+  # normalize zeros to 0/1
+  if ($MBI->_is_zero($x->{_n}))
+    {
+    $x->{sign} = '+';					# never leave a -0
+    $x->{_d} = $MBI->_one() unless $MBI->_is_one($x->{_d});
+    return $x;
+    }
+
+  return $x if $MBI->_is_one($x->{_d});			# no need to reduce
+
+  # reduce other numbers
+  my $gcd = $MBI->_copy($x->{_n});
+  $gcd = $MBI->_gcd($gcd,$x->{_d});
+  
+  if (!$MBI->_is_one($gcd))
+    {
+    $x->{_n} = $MBI->_div($x->{_n},$gcd);
+    $x->{_d} = $MBI->_div($x->{_d},$gcd);
+    }
+  $x;
+  }
+
+##############################################################################
+# sign manipulation
+
+sub bneg
+  {
+  # (BRAT or num_str) return BRAT
+  # negate number or make a negated number from string
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return $x if $x->modify('bneg');
+
+  # for +0 dont negate (to have always normalized +0). Does nothing for 'NaN'
+  $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $MBI->_is_zero($x->{_n}));
+  $x;
+  }
+
+##############################################################################
+# special values
+
+sub _bnan
+  {
+  # used by parent class bnan() to initialize number to NaN
+  my $self = shift;
+
+  if ($_trap_nan)
+    {
+    require Carp;
+    my $class = ref($self);
+    # "$self" below will stringify the object, this blows up if $self is a
+    # partial object (happens under trap_nan), so fix it beforehand
+    $self->{_d} = $MBI->_zero() unless defined $self->{_d};
+    $self->{_n} = $MBI->_zero() unless defined $self->{_n};
+    Carp::croak ("Tried to set $self to NaN in $class\::_bnan()");
+    }
+  $self->{_n} = $MBI->_zero();
+  $self->{_d} = $MBI->_zero();
+  }
+
+sub _binf
+  {
+  # used by parent class bone() to initialize number to +inf/-inf
+  my $self = shift;
+
+  if ($_trap_inf)
+    {
+    require Carp;
+    my $class = ref($self);
+    # "$self" below will stringify the object, this blows up if $self is a
+    # partial object (happens under trap_nan), so fix it beforehand
+    $self->{_d} = $MBI->_zero() unless defined $self->{_d};
+    $self->{_n} = $MBI->_zero() unless defined $self->{_n};
+    Carp::croak ("Tried to set $self to inf in $class\::_binf()");
+    }
+  $self->{_n} = $MBI->_zero();
+  $self->{_d} = $MBI->_zero();
+  }
+
+sub _bone
+  {
+  # used by parent class bone() to initialize number to +1/-1
+  my $self = shift;
+  $self->{_n} = $MBI->_one();
+  $self->{_d} = $MBI->_one();
+  }
+
+sub _bzero
+  {
+  # used by parent class bzero() to initialize number to 0
+  my $self = shift;
+  $self->{_n} = $MBI->_zero();
+  $self->{_d} = $MBI->_one();
+  }
+
+##############################################################################
+# mul/add/div etc
+
+sub badd
+  {
+  # add two rational numbers
+
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  # +inf + +inf => +inf,  -inf + -inf => -inf
+  return $x->binf(substr($x->{sign},0,1))
+    if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/;
+
+  # +inf + -inf or -inf + +inf => NaN
+  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
+
+  #  1   1    gcd(3,4) = 1    1*3 + 1*4    7
+  #  - + -                  = --------- = --                 
+  #  4   3                      4*3       12
+
+  # we do not compute the gcd() here, but simple do:
+  #  5   7    5*3 + 7*4   43
+  #  - + -  = --------- = --                 
+  #  4   3       4*3      12
+ 
+  # and bnorm() will then take care of the rest
+
+  # 5 * 3
+  $x->{_n} = $MBI->_mul( $x->{_n}, $y->{_d});
+
+  # 7 * 4
+  my $m = $MBI->_mul( $MBI->_copy( $y->{_n} ), $x->{_d} );
+
+  # 5 * 3 + 7 * 4
+  ($x->{_n}, $x->{sign}) = _e_add( $x->{_n}, $m, $x->{sign}, $y->{sign});
+
+  # 4 * 3
+  $x->{_d} = $MBI->_mul( $x->{_d}, $y->{_d});
+
+  # normalize result, and possible round
+  $x->bnorm()->round(@r);
+  }
+
+sub bsub
+  {
+  # subtract two rational numbers
+
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  # flip sign of $x, call badd(), then flip sign of result
+  $x->{sign} =~ tr/+-/-+/
+    unless $x->{sign} eq '+' && $MBI->_is_zero($x->{_n});	# not -0
+  $x->badd($y,@r);				# does norm and round
+  $x->{sign} =~ tr/+-/-+/ 
+    unless $x->{sign} eq '+' && $MBI->_is_zero($x->{_n});	# not -0
+  $x;
+  }
+
+sub bmul
+  {
+  # multiply two rational numbers
+  
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $x->bnan() if ($x->{sign} eq 'NaN' || $y->{sign} eq 'NaN');
+
+  # inf handling
+  if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
+    {
+    return $x->bnan() if $x->is_zero() || $y->is_zero();
+    # result will always be +-inf:
+    # +inf * +/+inf => +inf, -inf * -/-inf => +inf
+    # +inf * -/-inf => -inf, -inf * +/+inf => -inf
+    return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
+    return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
+    return $x->binf('-');
+    }
+
+  # x== 0 # also: or y == 1 or y == -1
+  return wantarray ? ($x,$self->bzero()) : $x if $x->is_zero();
+
+  # XXX TODO:
+  # According to Knuth, this can be optimized by doing gcd twice (for d and n)
+  # and reducing in one step. This would save us the bnorm() at the end.
+
+  #  1   2    1 * 2    2    1
+  #  - * - =  -----  = -  = -
+  #  4   3    4 * 3    12   6
+  
+  $x->{_n} = $MBI->_mul( $x->{_n}, $y->{_n});
+  $x->{_d} = $MBI->_mul( $x->{_d}, $y->{_d});
+
+  # compute new sign
+  $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-';
+
+  $x->bnorm()->round(@r);
+  }
+
+sub bdiv
+  {
+  # (dividend: BRAT or num_str, divisor: BRAT or num_str) return
+  # (BRAT,BRAT) (quo,rem) or BRAT (only rem)
+
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $self->_div_inf($x,$y)
+   if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
+
+  # x== 0 # also: or y == 1 or y == -1
+  return wantarray ? ($x,$self->bzero()) : $x if $x->is_zero();
+
+  # XXX TODO: list context, upgrade
+  # According to Knuth, this can be optimized by doing gcd twice (for d and n)
+  # and reducing in one step. This would save us the bnorm() at the end.
+
+  # 1     1    1   3
+  # -  /  - == - * -
+  # 4     3    4   1
+  
+  $x->{_n} = $MBI->_mul( $x->{_n}, $y->{_d});
+  $x->{_d} = $MBI->_mul( $x->{_d}, $y->{_n});
+
+  # compute new sign 
+  $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-';
+
+  $x->bnorm()->round(@r);
+  $x;
+  }
+
+sub bmod
+  {
+  # compute "remainder" (in Perl way) of $x / $y
+
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $self->_div_inf($x,$y)
+   if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
+
+  return $x if $x->is_zero();           # 0 / 7 = 0, mod 0
+
+  # compute $x - $y * floor($x/$y), keeping the sign of $x
+
+  # copy x to u, make it positive and then do a normal division ($u/$y)
+  my $u = bless { sign => '+' }, $self;
+  $u->{_n} = $MBI->_mul( $MBI->_copy($x->{_n}), $y->{_d} );
+  $u->{_d} = $MBI->_mul( $MBI->_copy($x->{_d}), $y->{_n} );
+  
+  # compute floor(u)
+  if (! $MBI->_is_one($u->{_d}))
+    {
+    $u->{_n} = $MBI->_div($u->{_n},$u->{_d});	# 22/7 => 3/1 w/ truncate
+    # no need to set $u->{_d} to 1, since below we set it to $y->{_d} anyway
+    }
+  
+  # now compute $y * $u
+  $u->{_d} = $MBI->_copy($y->{_d});		# 1 * $y->{_d}, see floor above
+  $u->{_n} = $MBI->_mul($u->{_n},$y->{_n});
+
+  my $xsign = $x->{sign}; $x->{sign} = '+';	# remember sign and make x positive
+  # compute $x - $u
+  $x->bsub($u);
+  $x->{sign} = $xsign;				# put sign back
+
+  $x->bnorm()->round(@r);
+  }
+
+##############################################################################
+# bdec/binc
+
+sub bdec
+  {
+  # decrement value (subtract 1)
+  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+
+  return $x if $x->{sign} !~ /^[+-]$/;	# NaN, inf, -inf
+
+  if ($x->{sign} eq '-')
+    {
+    $x->{_n} = $MBI->_add( $x->{_n}, $x->{_d});		# -5/2 => -7/2
+    }
+  else
+    {
+    if ($MBI->_acmp($x->{_n},$x->{_d}) < 0)		# n < d?
+      {
+      # 1/3 -- => -2/3
+      $x->{_n} = $MBI->_sub( $MBI->_copy($x->{_d}), $x->{_n});
+      $x->{sign} = '-';
+      }
+    else
+      {
+      $x->{_n} = $MBI->_sub($x->{_n}, $x->{_d}); 	# 5/2 => 3/2
+      }
+    }
+  $x->bnorm()->round(@r);
+  }
+
+sub binc
+  {
+  # increment value (add 1)
+  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+  
+  return $x if $x->{sign} !~ /^[+-]$/;	# NaN, inf, -inf
+
+  if ($x->{sign} eq '-')
+    {
+    if ($MBI->_acmp($x->{_n},$x->{_d}) < 0)
+      {
+      # -1/3 ++ => 2/3 (overflow at 0)
+      $x->{_n} = $MBI->_sub( $MBI->_copy($x->{_d}), $x->{_n});
+      $x->{sign} = '+';
+      }
+    else
+      {
+      $x->{_n} = $MBI->_sub($x->{_n}, $x->{_d}); 	# -5/2 => -3/2
+      }
+    }
+  else
+    {
+    $x->{_n} = $MBI->_add($x->{_n},$x->{_d});		# 5/2 => 7/2
+    }
+  $x->bnorm()->round(@r);
+  }
+
+##############################################################################
+# is_foo methods (the rest is inherited)
+
+sub is_int
+  {
+  # return true if arg (BRAT or num_str) is an integer
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return 1 if ($x->{sign} =~ /^[+-]$/) &&	# NaN and +-inf aren't
+    $MBI->_is_one($x->{_d});			# x/y && y != 1 => no integer
+  0;
+  }
+
+sub is_zero
+  {
+  # return true if arg (BRAT or num_str) is zero
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return 1 if $x->{sign} eq '+' && $MBI->_is_zero($x->{_n});
+  0;
+  }
+
+sub is_one
+  {
+  # return true if arg (BRAT or num_str) is +1 or -1 if signis given
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  my $sign = $_[2] || ''; $sign = '+' if $sign ne '-';
+  return 1
+   if ($x->{sign} eq $sign && $MBI->_is_one($x->{_n}) && $MBI->_is_one($x->{_d}));
+  0;
+  }
+
+sub is_odd
+  {
+  # return true if arg (BFLOAT or num_str) is odd or false if even
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return 1 if ($x->{sign} =~ /^[+-]$/) &&		# NaN & +-inf aren't
+    ($MBI->_is_one($x->{_d}) && $MBI->_is_odd($x->{_n})); # x/2 is not, but 3/1
+  0;
+  }
+
+sub is_even
+  {
+  # return true if arg (BINT or num_str) is even or false if odd
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return 0 if $x->{sign} !~ /^[+-]$/;			# NaN & +-inf aren't
+  return 1 if ($MBI->_is_one($x->{_d})			# x/3 is never
+     && $MBI->_is_even($x->{_n}));			# but 4/1 is
+  0;
+  }
+
+##############################################################################
+# parts() and friends
+
+sub numerator
+  {
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  # NaN, inf, -inf
+  return Math::BigInt->new($x->{sign}) if ($x->{sign} !~ /^[+-]$/);
+
+  my $n = Math::BigInt->new($MBI->_str($x->{_n})); $n->{sign} = $x->{sign};
+  $n;
+  }
+
+sub denominator
+  {
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  # NaN
+  return Math::BigInt->new($x->{sign}) if $x->{sign} eq 'NaN';
+  # inf, -inf
+  return Math::BigInt->bone() if $x->{sign} !~ /^[+-]$/;
+  
+  Math::BigInt->new($MBI->_str($x->{_d}));
+  }
+
+sub parts
+  {
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  my $c = 'Math::BigInt';
+
+  return ($c->bnan(),$c->bnan()) if $x->{sign} eq 'NaN';
+  return ($c->binf(),$c->binf()) if $x->{sign} eq '+inf';
+  return ($c->binf('-'),$c->binf()) if $x->{sign} eq '-inf';
+
+  my $n = $c->new( $MBI->_str($x->{_n}));
+  $n->{sign} = $x->{sign};
+  my $d = $c->new( $MBI->_str($x->{_d}));
+  ($n,$d);
+  }
+
+sub length
+  {
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return $nan unless $x->is_int();
+  $MBI->_len($x->{_n});				# length(-123/1) => length(123)
+  }
+
+sub digit
+  {
+  my ($self,$x,$n) = ref($_[0]) ? (undef,$_[0],$_[1]) : objectify(1,@_);
+
+  return $nan unless $x->is_int();
+  $MBI->_digit($x->{_n},$n || 0);		# digit(-123/1,2) => digit(123,2)
+  }
+
+##############################################################################
+# special calc routines
+
+sub bceil
+  {
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  return $x if $x->{sign} !~ /^[+-]$/ ||	# not for NaN, inf
+            $MBI->_is_one($x->{_d});		# 22/1 => 22, 0/1 => 0
+
+  $x->{_n} = $MBI->_div($x->{_n},$x->{_d});	# 22/7 => 3/1 w/ truncate
+  $x->{_d} = $MBI->_one();			# d => 1
+  $x->{_n} = $MBI->_inc($x->{_n})
+    if $x->{sign} eq '+';			# +22/7 => 4/1
+  $x->{sign} = '+' if $MBI->_is_zero($x->{_n});	# -0 => 0
+  $x;
+  }
+
+sub bfloor
+  {
+  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+  return $x if $x->{sign} !~ /^[+-]$/ ||	# not for NaN, inf
+            $MBI->_is_one($x->{_d});		# 22/1 => 22, 0/1 => 0
+
+  $x->{_n} = $MBI->_div($x->{_n},$x->{_d});	# 22/7 => 3/1 w/ truncate
+  $x->{_d} = $MBI->_one();			# d => 1
+  $x->{_n} = $MBI->_inc($x->{_n})
+    if $x->{sign} eq '-';			# -22/7 => -4/1
+  $x;
+  }
+
+sub bfac
+  {
+  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+
+  # if $x is not an integer
+  if (($x->{sign} ne '+') || (!$MBI->_is_one($x->{_d})))
+    {
+    return $x->bnan();
+    }
+
+  $x->{_n} = $MBI->_fac($x->{_n});
+  # since _d is 1, we don't need to reduce/norm the result
+  $x->round(@r);
+  }
+
+sub bpow
+  {
+  # power ($x ** $y)
+
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  return $x if $x->{sign} =~ /^[+-]inf$/;       # -inf/+inf ** x
+  return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
+  return $x->bone(@r) if $y->is_zero();
+  return $x->round(@r) if $x->is_one() || $y->is_one();
+
+  if ($x->{sign} eq '-' && $MBI->_is_one($x->{_n}) && $MBI->_is_one($x->{_d}))
+    {
+    # if $x == -1 and odd/even y => +1/-1
+    return $y->is_odd() ? $x->round(@r) : $x->babs()->round(@r);
+    # my Casio FX-5500L has a bug here: -1 ** 2 is -1, but -1 * -1 is 1;
+    }
+  # 1 ** -y => 1 / (1 ** |y|)
+  # so do test for negative $y after above's clause
+
+  return $x->round(@r) if $x->is_zero();  # 0**y => 0 (if not y <= 0)
+
+  # shortcut y/1 (and/or x/1)
+  if ($MBI->_is_one($y->{_d}))
+    {
+    # shortcut for x/1 and y/1
+    if ($MBI->_is_one($x->{_d}))
+      {
+      $x->{_n} = $MBI->_pow($x->{_n},$y->{_n});		# x/1 ** y/1 => (x ** y)/1
+      if ($y->{sign} eq '-')
+        {
+        # 0.2 ** -3 => 1/(0.2 ** 3)
+        ($x->{_n},$x->{_d}) = ($x->{_d},$x->{_n});	# swap
+        }
+      # correct sign; + ** + => +
+      if ($x->{sign} eq '-')
+        {
+        # - * - => +, - * - * - => -
+        $x->{sign} = '+' if $MBI->_is_even($y->{_n});	
+        }
+      return $x->round(@r);
+      }
+    # x/z ** y/1
+    $x->{_n} = $MBI->_pow($x->{_n},$y->{_n});		# 5/2 ** y/1 => 5 ** y / 2 ** y
+    $x->{_d} = $MBI->_pow($x->{_d},$y->{_n});
+    if ($y->{sign} eq '-')
+      {
+      # 0.2 ** -3 => 1/(0.2 ** 3)
+      ($x->{_n},$x->{_d}) = ($x->{_d},$x->{_n});	# swap
+      }
+    # correct sign; + ** + => +
+    if ($x->{sign} eq '-')
+      {
+      # - * - => +, - * - * - => -
+      $x->{sign} = '+' if $MBI->_is_even($y->{_n});	
+      }
+    return $x->round(@r);
+    }
+
+  # regular calculation (this is wrong for d/e ** f/g)
+  my $pow2 = $self->bone();
+  my $y1 = $MBI->_div ( $MBI->_copy($y->{_n}), $y->{_d});
+  my $two = $MBI->_two();
+
+  while (!$MBI->_is_one($y1))
+    {
+    $pow2->bmul($x) if $MBI->_is_odd($y1);
+    $MBI->_div($y1, $two);
+    $x->bmul($x);
+    }
+  $x->bmul($pow2) unless $pow2->is_one();
+  # n ** -x => 1/n ** x
+  ($x->{_d},$x->{_n}) = ($x->{_n},$x->{_d}) if $y->{sign} eq '-'; 
+  $x->bnorm()->round(@r);
+  }
+
+sub blog
+  {
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,$class,@_);
+    }
+
+  # blog(1,Y) => 0
+  return $x->bzero() if $x->is_one() && $y->{sign} eq '+';
+
+  # $x <= 0 => NaN
+  return $x->bnan() if $x->is_zero() || $x->{sign} ne '+' || $y->{sign} ne '+';
+
+  if ($x->is_int() && $y->is_int())
+    {
+    return $self->new($x->as_number()->blog($y->as_number(),@r));
+    }
+
+  # do it with floats
+  $x->_new_from_float( $x->_as_float()->blog(Math::BigFloat->new("$y"),@r) );
+  }
+
+sub _float_from_part
+  {
+  my $x = shift;
+
+  my $f = Math::BigFloat->bzero();
+  $f->{_m} = $MBI->_copy($x);
+  $f->{_e} = $MBI->_zero();
+
+  $f;
+  }
+
+sub _as_float
+  {
+  my $x = shift;
+
+  local $Math::BigFloat::upgrade = undef;
+  local $Math::BigFloat::accuracy = undef;
+  local $Math::BigFloat::precision = undef;
+  # 22/7 => 3.142857143..
+
+  my $a = $x->accuracy() || 0;
+  if ($a != 0 || !$MBI->_is_one($x->{_d}))
+    {
+    # n/d
+    return Math::BigFloat->new($x->{sign} . $MBI->_str($x->{_n}))->bdiv( $MBI->_str($x->{_d}), $x->accuracy());
+    }
+  # just n
+  Math::BigFloat->new($x->{sign} . $MBI->_str($x->{_n}));
+  }
+
+sub broot
+  {
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  if ($x->is_int() && $y->is_int())
+    {
+    return $self->new($x->as_number()->broot($y->as_number(),@r));
+    }
+
+  # do it with floats
+  $x->_new_from_float( $x->_as_float()->broot($y,@r) );
+  }
+
+sub bmodpow
+  {
+  # set up parameters
+  my ($self,$x,$y,$m,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,$m,@r) = objectify(3,@_);
+    }
+
+  # $x or $y or $m are NaN or +-inf => NaN
+  return $x->bnan()
+   if $x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/ ||
+   $m->{sign} !~ /^[+-]$/;
+
+  if ($x->is_int() && $y->is_int() && $m->is_int())
+    {
+    return $self->new($x->as_number()->bmodpow($y->as_number(),$m,@r));
+    }
+
+  warn ("bmodpow() not fully implemented");
+  $x->bnan();
+  }
+
+sub bmodinv
+  {
+  # set up parameters
+  my ($self,$x,$y,@r) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y,@r) = objectify(2,@_);
+    }
+
+  # $x or $y are NaN or +-inf => NaN
+  return $x->bnan() 
+   if $x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/;
+
+  if ($x->is_int() && $y->is_int())
+    {
+    return $self->new($x->as_number()->bmodinv($y->as_number(),@r));
+    }
+
+  warn ("bmodinv() not fully implemented");
+  $x->bnan();
+  }
+
+sub bsqrt
+  {
+  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+
+  return $x->bnan() if $x->{sign} !~ /^[+]/;    # NaN, -inf or < 0
+  return $x if $x->{sign} eq '+inf';            # sqrt(inf) == inf
+  return $x->round(@r) if $x->is_zero() || $x->is_one();
+
+  local $Math::BigFloat::upgrade = undef;
+  local $Math::BigFloat::downgrade = undef;
+  local $Math::BigFloat::precision = undef;
+  local $Math::BigFloat::accuracy = undef;
+  local $Math::BigInt::upgrade = undef;
+  local $Math::BigInt::precision = undef;
+  local $Math::BigInt::accuracy = undef;
+
+  $x->{_n} = _float_from_part( $x->{_n} )->bsqrt();
+  $x->{_d} = _float_from_part( $x->{_d} )->bsqrt();
+
+  # XXX TODO: we probably can optimze this:
+
+  # if sqrt(D) was not integer
+  if ($x->{_d}->{_es} ne '+')
+    {
+    $x->{_n}->blsft($x->{_d}->exponent()->babs(),10);	# 7.1/4.51 => 7.1/45.1
+    $x->{_d} = $MBI->_copy( $x->{_d}->{_m} );		# 7.1/45.1 => 71/45.1
+    }
+  # if sqrt(N) was not integer
+  if ($x->{_n}->{_es} ne '+')
+    {
+    $x->{_d}->blsft($x->{_n}->exponent()->babs(),10);	# 71/45.1 => 710/45.1
+    $x->{_n} = $MBI->_copy( $x->{_n}->{_m} );		# 710/45.1 => 710/451
+    }
+
+  # convert parts to $MBI again 
+  $x->{_n} = $MBI->_lsft( $MBI->_copy( $x->{_n}->{_m} ), $x->{_n}->{_e}, 10)
+    if ref($x->{_n}) ne $MBI && ref($x->{_n}) ne 'ARRAY';
+  $x->{_d} = $MBI->_lsft( $MBI->_copy( $x->{_d}->{_m} ), $x->{_d}->{_e}, 10)
+    if ref($x->{_d}) ne $MBI && ref($x->{_d}) ne 'ARRAY';
+
+  $x->bnorm()->round(@r);
+  }
+
+sub blsft
+  {
+  my ($self,$x,$y,$b,@r) = objectify(3,@_);
+ 
+  $b = 2 unless defined $b;
+  $b = $self->new($b) unless ref ($b);
+  $x->bmul( $b->copy()->bpow($y), @r);
+  $x;
+  }
+
+sub brsft
+  {
+  my ($self,$x,$y,$b,@r) = objectify(3,@_);
+
+  $b = 2 unless defined $b;
+  $b = $self->new($b) unless ref ($b);
+  $x->bdiv( $b->copy()->bpow($y), @r);
+  $x;
+  }
+
+##############################################################################
+# round
+
+sub round
+  {
+  $_[0];
+  }
+
+sub bround
+  {
+  $_[0];
+  }
+
+sub bfround
+  {
+  $_[0];
+  }
+
+##############################################################################
+# comparing
+
+sub bcmp
+  {
+  # compare two signed numbers 
+  
+  # set up parameters
+  my ($self,$x,$y) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y) = objectify(2,@_);
+    }
+
+  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
+    {
+    # handle +-inf and NaN
+    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+    return 0 if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/;
+    return +1 if $x->{sign} eq '+inf';
+    return -1 if $x->{sign} eq '-inf';
+    return -1 if $y->{sign} eq '+inf';
+    return +1;
+    }
+  # check sign for speed first
+  return 1 if $x->{sign} eq '+' && $y->{sign} eq '-';   # does also 0 <=> -y
+  return -1 if $x->{sign} eq '-' && $y->{sign} eq '+';  # does also -x <=> 0
+
+  # shortcut
+  my $xz = $MBI->_is_zero($x->{_n});
+  my $yz = $MBI->_is_zero($y->{_n});
+  return 0 if $xz && $yz;                               # 0 <=> 0
+  return -1 if $xz && $y->{sign} eq '+';                # 0 <=> +y
+  return 1 if $yz && $x->{sign} eq '+';                 # +x <=> 0
+ 
+  my $t = $MBI->_mul( $MBI->_copy($x->{_n}), $y->{_d});
+  my $u = $MBI->_mul( $MBI->_copy($y->{_n}), $x->{_d});
+
+  my $cmp = $MBI->_acmp($t,$u);				# signs are equal
+  $cmp = -$cmp if $x->{sign} eq '-';			# both are '-' => reverse
+  $cmp;
+  }
+
+sub bacmp
+  {
+  # compare two numbers (as unsigned)
+ 
+  # set up parameters
+  my ($self,$x,$y) = (ref($_[0]),@_);
+  # objectify is costly, so avoid it
+  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+    {
+    ($self,$x,$y) = objectify(2,$class,@_);
+    }
+
+  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
+    {
+    # handle +-inf and NaN
+    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+    return 0 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/;
+    return 1 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} !~ /^[+-]inf$/;
+    return -1;
+    }
+
+  my $t = $MBI->_mul( $MBI->_copy($x->{_n}), $y->{_d});
+  my $u = $MBI->_mul( $MBI->_copy($y->{_n}), $x->{_d});
+  $MBI->_acmp($t,$u);					# ignore signs
+  }
+
+##############################################################################
+# output conversation
+
+sub numify
+  {
+  # convert 17/8 => float (aka 2.125)
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+ 
+  return $x->bstr() if $x->{sign} !~ /^[+-]$/;	# inf, NaN, etc
+
+  # N/1 => N
+  my $neg = ''; $neg = '-' if $x->{sign} eq '-';
+  return $neg . $MBI->_num($x->{_n}) if $MBI->_is_one($x->{_d});
+
+  $x->_as_float()->numify() + 0.0;
+  }
+
+sub as_number
+  {
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return Math::BigInt->new($x) if $x->{sign} !~ /^[+-]$/;	# NaN, inf etc
+ 
+  my $u = Math::BigInt->bzero();
+  $u->{sign} = $x->{sign};
+  $u->{value} = $MBI->_div( $MBI->_copy($x->{_n}), $x->{_d});	# 22/7 => 3
+  $u;
+  }
+
+sub as_bin
+  {
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return $x unless $x->is_int();
+
+  my $s = $x->{sign}; $s = '' if $s eq '+';
+  $s . $MBI->_as_bin($x->{_n});
+  }
+
+sub as_hex
+  {
+  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+
+  return $x unless $x->is_int();
+
+  my $s = $x->{sign}; $s = '' if $s eq '+';
+  $s . $MBI->_as_hex($x->{_n});
+  }
+
+##############################################################################
+# import
+
+sub import
+  {
+  my $self = shift;
+  my $l = scalar @_;
+  my $lib = ''; my @a;
+
+  for ( my $i = 0; $i < $l ; $i++)
+    {
+    if ( $_[$i] eq ':constant' )
+      {
+      # this rest causes overlord er load to step in
+      overload::constant float => sub { $self->new(shift); };
+      }
+#    elsif ($_[$i] eq 'upgrade')
+#      {
+#     # this causes upgrading
+#      $upgrade = $_[$i+1];		# or undef to disable
+#      $i++;
+#      }
+    elsif ($_[$i] eq 'downgrade')
+      {
+      # this causes downgrading
+      $downgrade = $_[$i+1];		# or undef to disable
+      $i++;
+      }
+    elsif ($_[$i] eq 'lib')
+      {
+      $lib = $_[$i+1] || '';		# default Calc
+      $i++;
+      }
+    elsif ($_[$i] eq 'with')
+      {
+      # this argument is no longer used
+      #$MBI = $_[$i+1] || 'Math::BigInt::Calc';	# default Math::BigInt::Calc
+      $i++;
+      }
+    else
+      {
+      push @a, $_[$i];
+      }
+    }
+  require Math::BigInt;
+
+  # let use Math::BigInt lib => 'GMP'; use Math::BigRat; still have GMP
+  if ($lib ne '')
+    {
+    my @c = split /\s*,\s*/, $lib;
+    foreach (@c)
+      {
+      $_ =~ tr/a-zA-Z0-9://cd;                    # limit to sane characters
+      }
+    $lib = join(",", @c);
+    }
+  my @import = ('objectify');
+  push @import, lib => $lib if $lib ne '';
+
+  # MBI already loaded, so feed it our lib arguments
+  Math::BigInt->import( @import );
+
+  $MBI = Math::BigFloat->config()->{lib};
+
+  # register us with MBI to get notified of future lib changes
+  Math::BigInt::_register_callback( $self, sub { $MBI = $_[0]; } );
+  
+  # any non :constant stuff is handled by our parent, Exporter (loaded
+  # by Math::BigFloat, even if @_ is empty, to give it a chance
+  $self->SUPER::import(@a);             # for subclasses
+  $self->export_to_level(1,$self,@a);   # need this, too
+  }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Math::BigRat - Arbitrary big rational numbers
+
+=head1 SYNOPSIS
+
+	use Math::BigRat;
+
+	my $x = Math::BigRat->new('3/7'); $x += '5/9';
+
+	print $x->bstr(),"\n";
+  	print $x ** 2,"\n";
+
+	my $y = Math::BigRat->new('inf');
+	print "$y ", ($y->is_inf ? 'is' : 'is not') , " infinity\n";
+
+	my $z = Math::BigRat->new(144); $z->bsqrt();
+
+=head1 DESCRIPTION
+
+Math::BigRat complements Math::BigInt and Math::BigFloat by providing support
+for arbitrary big rational numbers.
+
+=head2 MATH LIBRARY
+
+Math with the numbers is done (by default) by a module called
+Math::BigInt::Calc. This is equivalent to saying:
+
+	use Math::BigRat lib => 'Calc';
+
+You can change this by using:
+
+	use Math::BigRat lib => 'BitVect';
+
+The following would first try to find Math::BigInt::Foo, then
+Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
+
+	use Math::BigRat lib => 'Foo,Math::BigInt::Bar';
+
+Calc.pm uses as internal format an array of elements of some decimal base
+(usually 1e7, but this might be different for some systems) with the least
+significant digit first, while BitVect.pm uses a bit vector of base 2, most
+significant bit first. Other modules might use even different means of
+representing the numbers. See the respective module documentation for further
+details.
+
+Currently the following replacement libraries exist, search for them at CPAN:
+
+	Math::BigInt::BitVect
+	Math::BigInt::GMP
+	Math::BigInt::Pari
+	Math::BigInt::FastCalc
+
+=head1 METHODS
+
+Any methods not listed here are dervied from Math::BigFloat (or
+Math::BigInt), so make sure you check these two modules for further
+information.
+
+=head2 new()
+
+	$x = Math::BigRat->new('1/3');
+
+Create a new Math::BigRat object. Input can come in various forms:
+
+	$x = Math::BigRat->new(123);				# scalars
+	$x = Math::BigRat->new('inf');				# infinity
+	$x = Math::BigRat->new('123.3');			# float
+	$x = Math::BigRat->new('1/3');				# simple string
+	$x = Math::BigRat->new('1 / 3');			# spaced
+	$x = Math::BigRat->new('1 / 0.1');			# w/ floats
+	$x = Math::BigRat->new(Math::BigInt->new(3));		# BigInt
+	$x = Math::BigRat->new(Math::BigFloat->new('3.1'));	# BigFloat
+	$x = Math::BigRat->new(Math::BigInt::Lite->new('2'));	# BigLite
+
+	# You can also give D and N as different objects:
+	$x = Math::BigRat->new(
+		Math::BigInt->new(-123),
+		Math::BigInt->new(7),
+		);			# => -123/7
+
+=head2 numerator()
+
+	$n = $x->numerator();
+
+Returns a copy of the numerator (the part above the line) as signed BigInt.
+
+=head2 denominator()
+	
+	$d = $x->denominator();
+
+Returns a copy of the denominator (the part under the line) as positive BigInt.
+
+=head2 parts()
+
+	($n,$d) = $x->parts();
+
+Return a list consisting of (signed) numerator and (unsigned) denominator as
+BigInts.
+
+=head2 as_int()
+
+	$x = Math::BigRat->new('13/7');
+	print $x->as_int(),"\n";		# '1'
+
+Returns a copy of the object as BigInt, truncated to an integer.
+
+C<as_number()> is an alias for C<as_int()>.
+
+=head2 as_hex()
+
+	$x = Math::BigRat->new('13');
+	print $x->as_hex(),"\n";		# '0xd'
+
+Returns the BigRat as hexadecimal string. Works only for integers. 
+
+=head2 as_bin()
+
+	$x = Math::BigRat->new('13');
+	print $x->as_bin(),"\n";		# '0x1101'
+
+Returns the BigRat as binary string. Works only for integers. 
+
+=head2 bfac()
+
+	$x->bfac();
+
+Calculates the factorial of $x. For instance:
+
+	print Math::BigRat->new('3/1')->bfac(),"\n";	# 1*2*3
+	print Math::BigRat->new('5/1')->bfac(),"\n";	# 1*2*3*4*5
+
+Works currently only for integers.
+
+=head2 blog()
+
+Is not yet implemented.
+
+=head2 bround()/round()/bfround()
+
+Are not yet implemented.
+
+=head2 bmod()
+
+	use Math::BigRat;
+	my $x = Math::BigRat->new('7/4');
+	my $y = Math::BigRat->new('4/3');
+	print $x->bmod($y);
+
+Set $x to the remainder of the division of $x by $y.
+
+=head2 is_one()
+
+	print "$x is 1\n" if $x->is_one();
+
+Return true if $x is exactly one, otherwise false.
+
+=head2 is_zero()
+
+	print "$x is 0\n" if $x->is_zero();
+
+Return true if $x is exactly zero, otherwise false.
+
+=head2 is_pos()
+
+	print "$x is >= 0\n" if $x->is_positive();
+
+Return true if $x is positive (greater than or equal to zero), otherwise
+false. Please note that '+inf' is also positive, while 'NaN' and '-inf' aren't.
+
+C<is_positive()> is an alias for C<is_pos()>.
+
+=head2 is_neg()
+
+	print "$x is < 0\n" if $x->is_negative();
+
+Return true if $x is negative (smaller than zero), otherwise false. Please
+note that '-inf' is also negative, while 'NaN' and '+inf' aren't.
+
+C<is_negative()> is an alias for C<is_neg()>.
+
+=head2 is_int()
+
+	print "$x is an integer\n" if $x->is_int();
+
+Return true if $x has a denominator of 1 (e.g. no fraction parts), otherwise
+false. Please note that '-inf', 'inf' and 'NaN' aren't integer.
+
+=head2 is_odd()
+
+	print "$x is odd\n" if $x->is_odd();
+
+Return true if $x is odd, otherwise false.
+
+=head2 is_even()
+
+	print "$x is even\n" if $x->is_even();
+
+Return true if $x is even, otherwise false.
+
+=head2 bceil()
+
+	$x->bceil();
+
+Set $x to the next bigger integer value (e.g. truncate the number to integer
+and then increment it by one).
+
+=head2 bfloor()
+	
+	$x->bfloor();
+
+Truncate $x to an integer value.
+
+=head2 bsqrt()
+	
+	$x->bsqrt();
+
+Calculate the square root of $x.
+
+=head2 config
+
+        use Data::Dumper;
+
+        print Dumper ( Math::BigRat->config() );
+        print Math::BigRat->config()->{lib},"\n";
+
+Returns a hash containing the configuration, e.g. the version number, lib
+loaded etc. The following hash keys are currently filled in with the
+appropriate information.
+
+        key             RO/RW   Description
+                                Example
+        ============================================================
+        lib             RO      Name of the Math library
+                                Math::BigInt::Calc
+        lib_version     RO      Version of 'lib'
+                                0.30
+        class           RO      The class of config you just called
+                                Math::BigRat
+        version         RO      version number of the class you used
+                                0.10
+        upgrade         RW      To which class numbers are upgraded
+                                undef
+        downgrade       RW      To which class numbers are downgraded
+                                undef
+        precision       RW      Global precision
+                                undef
+        accuracy        RW      Global accuracy
+                                undef
+        round_mode      RW      Global round mode
+                                even
+        div_scale       RW      Fallback acccuracy for div
+                                40
+        trap_nan        RW      Trap creation of NaN (undef = no)
+                                undef
+        trap_inf        RW      Trap creation of +inf/-inf (undef = no)
+                                undef
+
+By passing a reference to a hash you may set the configuration values. This
+works only for values that a marked with a C<RW> above, anything else is
+read-only.
+
+=head1 BUGS
+
+Some things are not yet implemented, or only implemented half-way:
+
+=over 2
+
+=item inf handling (partial)
+
+=item NaN handling (partial)
+
+=item rounding (not implemented except for bceil/bfloor)
+
+=item $x ** $y where $y is not an integer
+
+=item bmod(), blog(), bmodinv() and bmodpow() (partial)
+
+=back
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Math::BigFloat> and L<Math::Big> as well as L<Math::BigInt::BitVect>,
+L<Math::BigInt::Pari> and  L<Math::BigInt::GMP>.
+
+See L<http://search.cpan.org/search?dist=bignum> for a way to use
+Math::BigRat.
+
+The package at L<http://search.cpan.org/search?dist=Math%3A%3ABigRat>
+may contain more documentation and examples as well as testcases.
+
+=head1 AUTHORS
+
+(C) by Tels L<http://bloodgate.com/> 2001 - 2005.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Math/Complex.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Math/Complex.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Math/Complex.pm	(revision 14489)
@@ -0,0 +1,1973 @@
+#
+# Complex numbers and associated mathematical functions
+# -- Raphael Manfredi	Since Sep 1996
+# -- Jarkko Hietaniemi	Since Mar 1997
+# -- Daniel S. Lewart	Since Sep 1997
+#
+
+package Math::Complex;
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $Inf);
+
+$VERSION = 1.35;
+
+BEGIN {
+    unless ($^O eq 'unicosmk') {
+        my $e = $!;
+	# We do want an arithmetic overflow, Inf INF inf Infinity:.
+        undef $Inf unless eval <<'EOE' and $Inf =~ /^inf(?:inity)?$/i;
+	  local $SIG{FPE} = sub {die};
+	  my $t = CORE::exp 30;
+	  $Inf = CORE::exp $t;
+EOE
+	if (!defined $Inf) {		# Try a different method
+	  undef $Inf unless eval <<'EOE' and $Inf =~ /^inf(?:inity)?$/i;
+	    local $SIG{FPE} = sub {die};
+	    my $t = 1;
+	    $Inf = $t + "1e99999999999999999999999999999999";
+EOE
+	}
+        $! = $e; # Clear ERANGE.
+    }
+    $Inf = "Inf" if !defined $Inf || !($Inf > 0); # Desperation.
+}
+
+use strict;
+
+my $i;
+my %LOGN;
+
+# Regular expression for floating point numbers.
+# These days we could use Scalar::Util::lln(), I guess.
+my $gre = qr'\s*([\+\-]?(?:(?:(?:\d+(?:_\d+)*(?:\.\d*(?:_\d+)*)?|\.\d+(?:_\d+)*)(?:[eE][\+\-]?\d+(?:_\d+)*)?))|inf)'i;
+
+require Exporter;
+
+@ISA = qw(Exporter);
+
+my @trig = qw(
+	      pi
+	      tan
+	      csc cosec sec cot cotan
+	      asin acos atan
+	      acsc acosec asec acot acotan
+	      sinh cosh tanh
+	      csch cosech sech coth cotanh
+	      asinh acosh atanh
+	      acsch acosech asech acoth acotanh
+	     );
+
+@EXPORT = (qw(
+	     i Re Im rho theta arg
+	     sqrt log ln
+	     log10 logn cbrt root
+	     cplx cplxe
+	     atan2
+	     ),
+	   @trig);
+
+@EXPORT_OK = qw(decplx);
+
+%EXPORT_TAGS = (
+    'trig' => [@trig],
+);
+
+use overload
+	'+'	=> \&plus,
+	'-'	=> \&minus,
+	'*'	=> \&multiply,
+	'/'	=> \&divide,
+	'**'	=> \&power,
+	'=='	=> \&numeq,
+	'<=>'	=> \&spaceship,
+	'neg'	=> \&negate,
+	'~'	=> \&conjugate,
+	'abs'	=> \&abs,
+	'sqrt'	=> \&sqrt,
+	'exp'	=> \&exp,
+	'log'	=> \&log,
+	'sin'	=> \&sin,
+	'cos'	=> \&cos,
+	'tan'	=> \&tan,
+	'atan2'	=> \&atan2,
+	qw("" stringify);
+
+#
+# Package "privates"
+#
+
+my %DISPLAY_FORMAT = ('style' => 'cartesian',
+		      'polar_pretty_print' => 1);
+my $eps            = 1e-14;		# Epsilon
+
+#
+# Object attributes (internal):
+#	cartesian	[real, imaginary] -- cartesian form
+#	polar		[rho, theta] -- polar form
+#	c_dirty		cartesian form not up-to-date
+#	p_dirty		polar form not up-to-date
+#	display		display format (package's global when not set)
+#
+
+# Die on bad *make() arguments.
+
+sub _cannot_make {
+    die "@{[(caller(1))[3]]}: Cannot take $_[0] of '$_[1]'.\n";
+}
+
+sub _make {
+    my $arg = shift;
+    my ($p, $q);
+
+    if ($arg =~ /^$gre$/) {
+	($p, $q) = ($1, 0);
+    } elsif ($arg =~ /^(?:$gre)?$gre\s*i\s*$/) {
+	($p, $q) = ($1 || 0, $2);
+    } elsif ($arg =~ /^\s*\(\s*$gre\s*(?:,\s*$gre\s*)?\)\s*$/) {
+	($p, $q) = ($1, $2 || 0);
+    }
+
+    if (defined $p) {
+	$p =~ s/^\+//;
+	$p =~ s/^(-?)inf$/"${1}9**9**9"/e;
+	$q =~ s/^\+//;
+	$q =~ s/^(-?)inf$/"${1}9**9**9"/e;
+    }
+
+    return ($p, $q);
+}
+
+sub _emake {
+    my $arg = shift;
+    my ($p, $q);
+
+    if ($arg =~ /^\s*\[\s*$gre\s*(?:,\s*$gre\s*)?\]\s*$/) {
+	($p, $q) = ($1, $2 || 0);
+    } elsif ($arg =~ m!^\s*\[\s*$gre\s*(?:,\s*([-+]?\d*\s*)?pi(?:/\s*(\d+))?\s*)?\]\s*$!) {
+	($p, $q) = ($1, ($2 eq '-' ? -1 : ($2 || 1)) * pi() / ($3 || 1));
+    } elsif ($arg =~ /^\s*\[\s*$gre\s*\]\s*$/) {
+	($p, $q) = ($1, 0);
+    } elsif ($arg =~ /^\s*$gre\s*$/) {
+	($p, $q) = ($1, 0);
+    }
+
+    if (defined $p) {
+	$p =~ s/^\+//;
+	$q =~ s/^\+//;
+	$p =~ s/^(-?)inf$/"${1}9**9**9"/e;
+	$q =~ s/^(-?)inf$/"${1}9**9**9"/e;
+    }
+
+    return ($p, $q);
+}
+
+#
+# ->make
+#
+# Create a new complex number (cartesian form)
+#
+sub make {
+    my $self = bless {}, shift;
+    my ($re, $im);
+    if (@_ == 0) {
+	($re, $im) = (0, 0);
+    } elsif (@_ == 1) {
+	return (ref $self)->emake($_[0])
+	    if ($_[0] =~ /^\s*\[/);
+	($re, $im) = _make($_[0]);
+    } elsif (@_ == 2) {
+	($re, $im) = @_;
+    }
+    if (defined $re) {
+	_cannot_make("real part",      $re) unless $re =~ /^$gre$/;
+    }
+    $im ||= 0;
+    _cannot_make("imaginary part", $im) unless $im =~ /^$gre$/;
+    $self->set_cartesian([$re, $im ]);
+    $self->display_format('cartesian');
+
+    return $self;
+}
+
+#
+# ->emake
+#
+# Create a new complex number (exponential form)
+#
+sub emake {
+    my $self = bless {}, shift;
+    my ($rho, $theta);
+    if (@_ == 0) {
+	($rho, $theta) = (0, 0);
+    } elsif (@_ == 1) {
+	return (ref $self)->make($_[0])
+	    if ($_[0] =~ /^\s*\(/ || $_[0] =~ /i\s*$/);
+	($rho, $theta) = _emake($_[0]);
+    } elsif (@_ == 2) {
+	($rho, $theta) = @_;
+    }
+    if (defined $rho && defined $theta) {
+	if ($rho < 0) {
+	    $rho   = -$rho;
+	    $theta = ($theta <= 0) ? $theta + pi() : $theta - pi();
+	}
+    }
+    if (defined $rho) {
+	_cannot_make("rho",   $rho)   unless $rho   =~ /^$gre$/;
+    }
+    $theta ||= 0;
+    _cannot_make("theta", $theta) unless $theta =~ /^$gre$/;
+    $self->set_polar([$rho, $theta]);
+    $self->display_format('polar');
+
+    return $self;
+}
+
+sub new { &make }		# For backward compatibility only.
+
+#
+# cplx
+#
+# Creates a complex number from a (re, im) tuple.
+# This avoids the burden of writing Math::Complex->make(re, im).
+#
+sub cplx {
+	return __PACKAGE__->make(@_);
+}
+
+#
+# cplxe
+#
+# Creates a complex number from a (rho, theta) tuple.
+# This avoids the burden of writing Math::Complex->emake(rho, theta).
+#
+sub cplxe {
+	return __PACKAGE__->emake(@_);
+}
+
+#
+# pi
+#
+# The number defined as pi = 180 degrees
+#
+sub pi () { 4 * CORE::atan2(1, 1) }
+
+#
+# pit2
+#
+# The full circle
+#
+sub pit2 () { 2 * pi }
+
+#
+# pip2
+#
+# The quarter circle
+#
+sub pip2 () { pi / 2 }
+
+#
+# deg1
+#
+# One degree in radians, used in stringify_polar.
+#
+
+sub deg1 () { pi / 180 }
+
+#
+# uplog10
+#
+# Used in log10().
+#
+sub uplog10 () { 1 / CORE::log(10) }
+
+#
+# i
+#
+# The number defined as i*i = -1;
+#
+sub i () {
+        return $i if ($i);
+	$i = bless {};
+	$i->{'cartesian'} = [0, 1];
+	$i->{'polar'}     = [1, pip2];
+	$i->{c_dirty} = 0;
+	$i->{p_dirty} = 0;
+	return $i;
+}
+
+#
+# ip2
+#
+# Half of i.
+#
+sub ip2 () { i / 2 }
+
+#
+# Attribute access/set routines
+#
+
+sub cartesian {$_[0]->{c_dirty} ?
+		   $_[0]->update_cartesian : $_[0]->{'cartesian'}}
+sub polar     {$_[0]->{p_dirty} ?
+		   $_[0]->update_polar : $_[0]->{'polar'}}
+
+sub set_cartesian { $_[0]->{p_dirty}++; $_[0]->{c_dirty} = 0;
+		    $_[0]->{'cartesian'} = $_[1] }
+sub set_polar     { $_[0]->{c_dirty}++; $_[0]->{p_dirty} = 0;
+		    $_[0]->{'polar'} = $_[1] }
+
+#
+# ->update_cartesian
+#
+# Recompute and return the cartesian form, given accurate polar form.
+#
+sub update_cartesian {
+	my $self = shift;
+	my ($r, $t) = @{$self->{'polar'}};
+	$self->{c_dirty} = 0;
+	return $self->{'cartesian'} = [$r * CORE::cos($t), $r * CORE::sin($t)];
+}
+
+#
+#
+# ->update_polar
+#
+# Recompute and return the polar form, given accurate cartesian form.
+#
+sub update_polar {
+	my $self = shift;
+	my ($x, $y) = @{$self->{'cartesian'}};
+	$self->{p_dirty} = 0;
+	return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0;
+	return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y),
+				   CORE::atan2($y, $x)];
+}
+
+#
+# (plus)
+#
+# Computes z1+z2.
+#
+sub plus {
+	my ($z1, $z2, $regular) = @_;
+	my ($re1, $im1) = @{$z1->cartesian};
+	$z2 = cplx($z2) unless ref $z2;
+	my ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
+	unless (defined $regular) {
+		$z1->set_cartesian([$re1 + $re2, $im1 + $im2]);
+		return $z1;
+	}
+	return (ref $z1)->make($re1 + $re2, $im1 + $im2);
+}
+
+#
+# (minus)
+#
+# Computes z1-z2.
+#
+sub minus {
+	my ($z1, $z2, $inverted) = @_;
+	my ($re1, $im1) = @{$z1->cartesian};
+	$z2 = cplx($z2) unless ref $z2;
+	my ($re2, $im2) = @{$z2->cartesian};
+	unless (defined $inverted) {
+		$z1->set_cartesian([$re1 - $re2, $im1 - $im2]);
+		return $z1;
+	}
+	return $inverted ?
+		(ref $z1)->make($re2 - $re1, $im2 - $im1) :
+		(ref $z1)->make($re1 - $re2, $im1 - $im2);
+
+}
+
+#
+# (multiply)
+#
+# Computes z1*z2.
+#
+sub multiply {
+        my ($z1, $z2, $regular) = @_;
+	if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
+	    # if both polar better use polar to avoid rounding errors
+	    my ($r1, $t1) = @{$z1->polar};
+	    my ($r2, $t2) = @{$z2->polar};
+	    my $t = $t1 + $t2;
+	    if    ($t >   pi()) { $t -= pit2 }
+	    elsif ($t <= -pi()) { $t += pit2 }
+	    unless (defined $regular) {
+		$z1->set_polar([$r1 * $r2, $t]);
+		return $z1;
+	    }
+	    return (ref $z1)->emake($r1 * $r2, $t);
+	} else {
+	    my ($x1, $y1) = @{$z1->cartesian};
+	    if (ref $z2) {
+		my ($x2, $y2) = @{$z2->cartesian};
+		return (ref $z1)->make($x1*$x2-$y1*$y2, $x1*$y2+$y1*$x2);
+	    } else {
+		return (ref $z1)->make($x1*$z2, $y1*$z2);
+	    }
+	}
+}
+
+#
+# _divbyzero
+#
+# Die on division by zero.
+#
+sub _divbyzero {
+    my $mess = "$_[0]: Division by zero.\n";
+
+    if (defined $_[1]) {
+	$mess .= "(Because in the definition of $_[0], the divisor ";
+	$mess .= "$_[1] " unless ("$_[1]" eq '0');
+	$mess .= "is 0)\n";
+    }
+
+    my @up = caller(1);
+
+    $mess .= "Died at $up[1] line $up[2].\n";
+
+    die $mess;
+}
+
+#
+# (divide)
+#
+# Computes z1/z2.
+#
+sub divide {
+	my ($z1, $z2, $inverted) = @_;
+	if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
+	    # if both polar better use polar to avoid rounding errors
+	    my ($r1, $t1) = @{$z1->polar};
+	    my ($r2, $t2) = @{$z2->polar};
+	    my $t;
+	    if ($inverted) {
+		_divbyzero "$z2/0" if ($r1 == 0);
+		$t = $t2 - $t1;
+		if    ($t >   pi()) { $t -= pit2 }
+		elsif ($t <= -pi()) { $t += pit2 }
+		return (ref $z1)->emake($r2 / $r1, $t);
+	    } else {
+		_divbyzero "$z1/0" if ($r2 == 0);
+		$t = $t1 - $t2;
+		if    ($t >   pi()) { $t -= pit2 }
+		elsif ($t <= -pi()) { $t += pit2 }
+		return (ref $z1)->emake($r1 / $r2, $t);
+	    }
+	} else {
+	    my ($d, $x2, $y2);
+	    if ($inverted) {
+		($x2, $y2) = @{$z1->cartesian};
+		$d = $x2*$x2 + $y2*$y2;
+		_divbyzero "$z2/0" if $d == 0;
+		return (ref $z1)->make(($x2*$z2)/$d, -($y2*$z2)/$d);
+	    } else {
+		my ($x1, $y1) = @{$z1->cartesian};
+		if (ref $z2) {
+		    ($x2, $y2) = @{$z2->cartesian};
+		    $d = $x2*$x2 + $y2*$y2;
+		    _divbyzero "$z1/0" if $d == 0;
+		    my $u = ($x1*$x2 + $y1*$y2)/$d;
+		    my $v = ($y1*$x2 - $x1*$y2)/$d;
+		    return (ref $z1)->make($u, $v);
+		} else {
+		    _divbyzero "$z1/0" if $z2 == 0;
+		    return (ref $z1)->make($x1/$z2, $y1/$z2);
+		}
+	    }
+	}
+}
+
+#
+# (power)
+#
+# Computes z1**z2 = exp(z2 * log z1)).
+#
+sub power {
+	my ($z1, $z2, $inverted) = @_;
+	if ($inverted) {
+	    return 1 if $z1 == 0 || $z2 == 1;
+	    return 0 if $z2 == 0 && Re($z1) > 0;
+	} else {
+	    return 1 if $z2 == 0 || $z1 == 1;
+	    return 0 if $z1 == 0 && Re($z2) > 0;
+	}
+	my $w = $inverted ? &exp($z1 * &log($z2))
+	                  : &exp($z2 * &log($z1));
+	# If both arguments cartesian, return cartesian, else polar.
+	return $z1->{c_dirty} == 0 &&
+	       (not ref $z2 or $z2->{c_dirty} == 0) ?
+	       cplx(@{$w->cartesian}) : $w;
+}
+
+#
+# (spaceship)
+#
+# Computes z1 <=> z2.
+# Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i.
+#
+sub spaceship {
+	my ($z1, $z2, $inverted) = @_;
+	my ($re1, $im1) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
+	my ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
+	my $sgn = $inverted ? -1 : 1;
+	return $sgn * ($re1 <=> $re2) if $re1 != $re2;
+	return $sgn * ($im1 <=> $im2);
+}
+
+#
+# (numeq)
+#
+# Computes z1 == z2.
+#
+# (Required in addition to spaceship() because of NaNs.)
+sub numeq {
+	my ($z1, $z2, $inverted) = @_;
+	my ($re1, $im1) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
+	my ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
+	return $re1 == $re2 && $im1 == $im2 ? 1 : 0;
+}
+
+#
+# (negate)
+#
+# Computes -z.
+#
+sub negate {
+	my ($z) = @_;
+	if ($z->{c_dirty}) {
+		my ($r, $t) = @{$z->polar};
+		$t = ($t <= 0) ? $t + pi : $t - pi;
+		return (ref $z)->emake($r, $t);
+	}
+	my ($re, $im) = @{$z->cartesian};
+	return (ref $z)->make(-$re, -$im);
+}
+
+#
+# (conjugate)
+#
+# Compute complex's conjugate.
+#
+sub conjugate {
+	my ($z) = @_;
+	if ($z->{c_dirty}) {
+		my ($r, $t) = @{$z->polar};
+		return (ref $z)->emake($r, -$t);
+	}
+	my ($re, $im) = @{$z->cartesian};
+	return (ref $z)->make($re, -$im);
+}
+
+#
+# (abs)
+#
+# Compute or set complex's norm (rho).
+#
+sub abs {
+	my ($z, $rho) = @_;
+	unless (ref $z) {
+	    if (@_ == 2) {
+		$_[0] = $_[1];
+	    } else {
+		return CORE::abs($z);
+	    }
+	}
+	if (defined $rho) {
+	    $z->{'polar'} = [ $rho, ${$z->polar}[1] ];
+	    $z->{p_dirty} = 0;
+	    $z->{c_dirty} = 1;
+	    return $rho;
+	} else {
+	    return ${$z->polar}[0];
+	}
+}
+
+sub _theta {
+    my $theta = $_[0];
+
+    if    ($$theta >   pi()) { $$theta -= pit2 }
+    elsif ($$theta <= -pi()) { $$theta += pit2 }
+}
+
+#
+# arg
+#
+# Compute or set complex's argument (theta).
+#
+sub arg {
+	my ($z, $theta) = @_;
+	return $z unless ref $z;
+	if (defined $theta) {
+	    _theta(\$theta);
+	    $z->{'polar'} = [ ${$z->polar}[0], $theta ];
+	    $z->{p_dirty} = 0;
+	    $z->{c_dirty} = 1;
+	} else {
+	    $theta = ${$z->polar}[1];
+	    _theta(\$theta);
+	}
+	return $theta;
+}
+
+#
+# (sqrt)
+#
+# Compute sqrt(z).
+#
+# It is quite tempting to use wantarray here so that in list context
+# sqrt() would return the two solutions.  This, however, would
+# break things like
+#
+#	print "sqrt(z) = ", sqrt($z), "\n";
+#
+# The two values would be printed side by side without no intervening
+# whitespace, quite confusing.
+# Therefore if you want the two solutions use the root().
+#
+sub sqrt {
+	my ($z) = @_;
+	my ($re, $im) = ref $z ? @{$z->cartesian} : ($z, 0);
+	return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re)
+	    if $im == 0;
+	my ($r, $t) = @{$z->polar};
+	return (ref $z)->emake(CORE::sqrt($r), $t/2);
+}
+
+#
+# cbrt
+#
+# Compute cbrt(z) (cubic root).
+#
+# Why are we not returning three values?  The same answer as for sqrt().
+#
+sub cbrt {
+	my ($z) = @_;
+	return $z < 0 ?
+	    -CORE::exp(CORE::log(-$z)/3) :
+		($z > 0 ? CORE::exp(CORE::log($z)/3): 0)
+	    unless ref $z;
+	my ($r, $t) = @{$z->polar};
+	return 0 if $r == 0;
+	return (ref $z)->emake(CORE::exp(CORE::log($r)/3), $t/3);
+}
+
+#
+# _rootbad
+#
+# Die on bad root.
+#
+sub _rootbad {
+    my $mess = "Root '$_[0]' illegal, root rank must be positive integer.\n";
+
+    my @up = caller(1);
+
+    $mess .= "Died at $up[1] line $up[2].\n";
+
+    die $mess;
+}
+
+#
+# root
+#
+# Computes all nth root for z, returning an array whose size is n.
+# `n' must be a positive integer.
+#
+# The roots are given by (for k = 0..n-1):
+#
+# z^(1/n) = r^(1/n) (cos ((t+2 k pi)/n) + i sin ((t+2 k pi)/n))
+#
+sub root {
+	my ($z, $n, $k) = @_;
+	_rootbad($n) if ($n < 1 or int($n) != $n);
+	my ($r, $t) = ref $z ?
+	    @{$z->polar} : (CORE::abs($z), $z >= 0 ? 0 : pi);
+	my $theta_inc = pit2 / $n;
+	my $rho = $r ** (1/$n);
+	my $cartesian = ref $z && $z->{c_dirty} == 0;
+	if (@_ == 2) {
+	    my @root;
+	    for (my $i = 0, my $theta = $t / $n;
+		 $i < $n;
+		 $i++, $theta += $theta_inc) {
+		my $w = cplxe($rho, $theta);
+		# Yes, $cartesian is loop invariant.
+		push @root, $cartesian ? cplx(@{$w->cartesian}) : $w;
+	    }
+	    return @root;
+	} elsif (@_ == 3) {
+	    my $w = cplxe($rho, $t / $n + $k * $theta_inc);
+	    return $cartesian ? cplx(@{$w->cartesian}) : $w;
+	}
+}
+
+#
+# Re
+#
+# Return or set Re(z).
+#
+sub Re {
+	my ($z, $Re) = @_;
+	return $z unless ref $z;
+	if (defined $Re) {
+	    $z->{'cartesian'} = [ $Re, ${$z->cartesian}[1] ];
+	    $z->{c_dirty} = 0;
+	    $z->{p_dirty} = 1;
+	} else {
+	    return ${$z->cartesian}[0];
+	}
+}
+
+#
+# Im
+#
+# Return or set Im(z).
+#
+sub Im {
+	my ($z, $Im) = @_;
+	return 0 unless ref $z;
+	if (defined $Im) {
+	    $z->{'cartesian'} = [ ${$z->cartesian}[0], $Im ];
+	    $z->{c_dirty} = 0;
+	    $z->{p_dirty} = 1;
+	} else {
+	    return ${$z->cartesian}[1];
+	}
+}
+
+#
+# rho
+#
+# Return or set rho(w).
+#
+sub rho {
+    Math::Complex::abs(@_);
+}
+
+#
+# theta
+#
+# Return or set theta(w).
+#
+sub theta {
+    Math::Complex::arg(@_);
+}
+
+#
+# (exp)
+#
+# Computes exp(z).
+#
+sub exp {
+	my ($z) = @_;
+	my ($x, $y) = @{$z->cartesian};
+	return (ref $z)->emake(CORE::exp($x), $y);
+}
+
+#
+# _logofzero
+#
+# Die on logarithm of zero.
+#
+sub _logofzero {
+    my $mess = "$_[0]: Logarithm of zero.\n";
+
+    if (defined $_[1]) {
+	$mess .= "(Because in the definition of $_[0], the argument ";
+	$mess .= "$_[1] " unless ($_[1] eq '0');
+	$mess .= "is 0)\n";
+    }
+
+    my @up = caller(1);
+
+    $mess .= "Died at $up[1] line $up[2].\n";
+
+    die $mess;
+}
+
+#
+# (log)
+#
+# Compute log(z).
+#
+sub log {
+	my ($z) = @_;
+	unless (ref $z) {
+	    _logofzero("log") if $z == 0;
+	    return $z > 0 ? CORE::log($z) : cplx(CORE::log(-$z), pi);
+	}
+	my ($r, $t) = @{$z->polar};
+	_logofzero("log") if $r == 0;
+	if    ($t >   pi()) { $t -= pit2 }
+	elsif ($t <= -pi()) { $t += pit2 }
+	return (ref $z)->make(CORE::log($r), $t);
+}
+
+#
+# ln
+#
+# Alias for log().
+#
+sub ln { Math::Complex::log(@_) }
+
+#
+# log10
+#
+# Compute log10(z).
+#
+
+sub log10 {
+	return Math::Complex::log($_[0]) * uplog10;
+}
+
+#
+# logn
+#
+# Compute logn(z,n) = log(z) / log(n)
+#
+sub logn {
+	my ($z, $n) = @_;
+	$z = cplx($z, 0) unless ref $z;
+	my $logn = $LOGN{$n};
+	$logn = $LOGN{$n} = CORE::log($n) unless defined $logn;	# Cache log(n)
+	return &log($z) / $logn;
+}
+
+#
+# (cos)
+#
+# Compute cos(z) = (exp(iz) + exp(-iz))/2.
+#
+sub cos {
+	my ($z) = @_;
+	return CORE::cos($z) unless ref $z;
+	my ($x, $y) = @{$z->cartesian};
+	my $ey = CORE::exp($y);
+	my $sx = CORE::sin($x);
+	my $cx = CORE::cos($x);
+	my $ey_1 = $ey ? 1 / $ey : $Inf;
+	return (ref $z)->make($cx * ($ey + $ey_1)/2,
+			      $sx * ($ey_1 - $ey)/2);
+}
+
+#
+# (sin)
+#
+# Compute sin(z) = (exp(iz) - exp(-iz))/2.
+#
+sub sin {
+	my ($z) = @_;
+	return CORE::sin($z) unless ref $z;
+	my ($x, $y) = @{$z->cartesian};
+	my $ey = CORE::exp($y);
+	my $sx = CORE::sin($x);
+	my $cx = CORE::cos($x);
+	my $ey_1 = $ey ? 1 / $ey : $Inf;
+	return (ref $z)->make($sx * ($ey + $ey_1)/2,
+			      $cx * ($ey - $ey_1)/2);
+}
+
+#
+# tan
+#
+# Compute tan(z) = sin(z) / cos(z).
+#
+sub tan {
+	my ($z) = @_;
+	my $cz = &cos($z);
+	_divbyzero "tan($z)", "cos($z)" if $cz == 0;
+	return &sin($z) / $cz;
+}
+
+#
+# sec
+#
+# Computes the secant sec(z) = 1 / cos(z).
+#
+sub sec {
+	my ($z) = @_;
+	my $cz = &cos($z);
+	_divbyzero "sec($z)", "cos($z)" if ($cz == 0);
+	return 1 / $cz;
+}
+
+#
+# csc
+#
+# Computes the cosecant csc(z) = 1 / sin(z).
+#
+sub csc {
+	my ($z) = @_;
+	my $sz = &sin($z);
+	_divbyzero "csc($z)", "sin($z)" if ($sz == 0);
+	return 1 / $sz;
+}
+
+#
+# cosec
+#
+# Alias for csc().
+#
+sub cosec { Math::Complex::csc(@_) }
+
+#
+# cot
+#
+# Computes cot(z) = cos(z) / sin(z).
+#
+sub cot {
+	my ($z) = @_;
+	my $sz = &sin($z);
+	_divbyzero "cot($z)", "sin($z)" if ($sz == 0);
+	return &cos($z) / $sz;
+}
+
+#
+# cotan
+#
+# Alias for cot().
+#
+sub cotan { Math::Complex::cot(@_) }
+
+#
+# acos
+#
+# Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)).
+#
+sub acos {
+	my $z = $_[0];
+	return CORE::atan2(CORE::sqrt(1-$z*$z), $z)
+	    if (! ref $z) && CORE::abs($z) <= 1;
+	$z = cplx($z, 0) unless ref $z;
+	my ($x, $y) = @{$z->cartesian};
+	return 0 if $x == 1 && $y == 0;
+	my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
+	my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
+	my $alpha = ($t1 + $t2)/2;
+	my $beta  = ($t1 - $t2)/2;
+	$alpha = 1 if $alpha < 1;
+	if    ($beta >  1) { $beta =  1 }
+	elsif ($beta < -1) { $beta = -1 }
+	my $u = CORE::atan2(CORE::sqrt(1-$beta*$beta), $beta);
+	my $v = CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
+	$v = -$v if $y > 0 || ($y == 0 && $x < -1);
+	return (ref $z)->make($u, $v);
+}
+
+#
+# asin
+#
+# Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)).
+#
+sub asin {
+	my $z = $_[0];
+	return CORE::atan2($z, CORE::sqrt(1-$z*$z))
+	    if (! ref $z) && CORE::abs($z) <= 1;
+	$z = cplx($z, 0) unless ref $z;
+	my ($x, $y) = @{$z->cartesian};
+	return 0 if $x == 0 && $y == 0;
+	my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
+	my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
+	my $alpha = ($t1 + $t2)/2;
+	my $beta  = ($t1 - $t2)/2;
+	$alpha = 1 if $alpha < 1;
+	if    ($beta >  1) { $beta =  1 }
+	elsif ($beta < -1) { $beta = -1 }
+	my $u =  CORE::atan2($beta, CORE::sqrt(1-$beta*$beta));
+	my $v = -CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
+	$v = -$v if $y > 0 || ($y == 0 && $x < -1);
+	return (ref $z)->make($u, $v);
+}
+
+#
+# atan
+#
+# Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)).
+#
+sub atan {
+	my ($z) = @_;
+	return CORE::atan2($z, 1) unless ref $z;
+	my ($x, $y) = ref $z ? @{$z->cartesian} : ($z, 0);
+	return 0 if $x == 0 && $y == 0;
+	_divbyzero "atan(i)"  if ( $z == i);
+	_logofzero "atan(-i)" if (-$z == i); # -i is a bad file test...
+	my $log = &log((i + $z) / (i - $z));
+	return ip2 * $log;
+}
+
+#
+# asec
+#
+# Computes the arc secant asec(z) = acos(1 / z).
+#
+sub asec {
+	my ($z) = @_;
+	_divbyzero "asec($z)", $z if ($z == 0);
+	return acos(1 / $z);
+}
+
+#
+# acsc
+#
+# Computes the arc cosecant acsc(z) = asin(1 / z).
+#
+sub acsc {
+	my ($z) = @_;
+	_divbyzero "acsc($z)", $z if ($z == 0);
+	return asin(1 / $z);
+}
+
+#
+# acosec
+#
+# Alias for acsc().
+#
+sub acosec { Math::Complex::acsc(@_) }
+
+#
+# acot
+#
+# Computes the arc cotangent acot(z) = atan(1 / z)
+#
+sub acot {
+	my ($z) = @_;
+	_divbyzero "acot(0)"  if $z == 0;
+	return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z)
+	    unless ref $z;
+	_divbyzero "acot(i)"  if ($z - i == 0);
+	_logofzero "acot(-i)" if ($z + i == 0);
+	return atan(1 / $z);
+}
+
+#
+# acotan
+#
+# Alias for acot().
+#
+sub acotan { Math::Complex::acot(@_) }
+
+#
+# cosh
+#
+# Computes the hyperbolic cosine cosh(z) = (exp(z) + exp(-z))/2.
+#
+sub cosh {
+	my ($z) = @_;
+	my $ex;
+	unless (ref $z) {
+	    $ex = CORE::exp($z);
+	    return $ex ? ($ex + 1/$ex)/2 : $Inf;
+	}
+	my ($x, $y) = @{$z->cartesian};
+	$ex = CORE::exp($x);
+	my $ex_1 = $ex ? 1 / $ex : $Inf;
+	return (ref $z)->make(CORE::cos($y) * ($ex + $ex_1)/2,
+			      CORE::sin($y) * ($ex - $ex_1)/2);
+}
+
+#
+# sinh
+#
+# Computes the hyperbolic sine sinh(z) = (exp(z) - exp(-z))/2.
+#
+sub sinh {
+	my ($z) = @_;
+	my $ex;
+	unless (ref $z) {
+	    return 0 if $z == 0;
+	    $ex = CORE::exp($z);
+	    return $ex ? ($ex - 1/$ex)/2 : "-$Inf";
+	}
+	my ($x, $y) = @{$z->cartesian};
+	my $cy = CORE::cos($y);
+	my $sy = CORE::sin($y);
+	$ex = CORE::exp($x);
+	my $ex_1 = $ex ? 1 / $ex : $Inf;
+	return (ref $z)->make(CORE::cos($y) * ($ex - $ex_1)/2,
+			      CORE::sin($y) * ($ex + $ex_1)/2);
+}
+
+#
+# tanh
+#
+# Computes the hyperbolic tangent tanh(z) = sinh(z) / cosh(z).
+#
+sub tanh {
+	my ($z) = @_;
+	my $cz = cosh($z);
+	_divbyzero "tanh($z)", "cosh($z)" if ($cz == 0);
+	return sinh($z) / $cz;
+}
+
+#
+# sech
+#
+# Computes the hyperbolic secant sech(z) = 1 / cosh(z).
+#
+sub sech {
+	my ($z) = @_;
+	my $cz = cosh($z);
+	_divbyzero "sech($z)", "cosh($z)" if ($cz == 0);
+	return 1 / $cz;
+}
+
+#
+# csch
+#
+# Computes the hyperbolic cosecant csch(z) = 1 / sinh(z).
+#
+sub csch {
+	my ($z) = @_;
+	my $sz = sinh($z);
+	_divbyzero "csch($z)", "sinh($z)" if ($sz == 0);
+	return 1 / $sz;
+}
+
+#
+# cosech
+#
+# Alias for csch().
+#
+sub cosech { Math::Complex::csch(@_) }
+
+#
+# coth
+#
+# Computes the hyperbolic cotangent coth(z) = cosh(z) / sinh(z).
+#
+sub coth {
+	my ($z) = @_;
+	my $sz = sinh($z);
+	_divbyzero "coth($z)", "sinh($z)" if $sz == 0;
+	return cosh($z) / $sz;
+}
+
+#
+# cotanh
+#
+# Alias for coth().
+#
+sub cotanh { Math::Complex::coth(@_) }
+
+#
+# acosh
+#
+# Computes the arc hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)).
+#
+sub acosh {
+	my ($z) = @_;
+	unless (ref $z) {
+	    $z = cplx($z, 0);
+	}
+	my ($re, $im) = @{$z->cartesian};
+	if ($im == 0) {
+	    return CORE::log($re + CORE::sqrt($re*$re - 1))
+		if $re >= 1;
+	    return cplx(0, CORE::atan2(CORE::sqrt(1 - $re*$re), $re))
+		if CORE::abs($re) < 1;
+	}
+	my $t = &sqrt($z * $z - 1) + $z;
+	# Try Taylor if looking bad (this usually means that
+	# $z was large negative, therefore the sqrt is really
+	# close to abs(z), summing that with z...)
+	$t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
+	    if $t == 0;
+	my $u = &log($t);
+	$u->Im(-$u->Im) if $re < 0 && $im == 0;
+	return $re < 0 ? -$u : $u;
+}
+
+#
+# asinh
+#
+# Computes the arc hyperbolic sine asinh(z) = log(z + sqrt(z*z+1))
+#
+sub asinh {
+	my ($z) = @_;
+	unless (ref $z) {
+	    my $t = $z + CORE::sqrt($z*$z + 1);
+	    return CORE::log($t) if $t;
+	}
+	my $t = &sqrt($z * $z + 1) + $z;
+	# Try Taylor if looking bad (this usually means that
+	# $z was large negative, therefore the sqrt is really
+	# close to abs(z), summing that with z...)
+	$t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
+	    if $t == 0;
+	return &log($t);
+}
+
+#
+# atanh
+#
+# Computes the arc hyperbolic tangent atanh(z) = 1/2 log((1+z) / (1-z)).
+#
+sub atanh {
+	my ($z) = @_;
+	unless (ref $z) {
+	    return CORE::log((1 + $z)/(1 - $z))/2 if CORE::abs($z) < 1;
+	    $z = cplx($z, 0);
+	}
+	_divbyzero 'atanh(1)',  "1 - $z" if (1 - $z == 0);
+	_logofzero 'atanh(-1)'           if (1 + $z == 0);
+	return 0.5 * &log((1 + $z) / (1 - $z));
+}
+
+#
+# asech
+#
+# Computes the hyperbolic arc secant asech(z) = acosh(1 / z).
+#
+sub asech {
+	my ($z) = @_;
+	_divbyzero 'asech(0)', "$z" if ($z == 0);
+	return acosh(1 / $z);
+}
+
+#
+# acsch
+#
+# Computes the hyperbolic arc cosecant acsch(z) = asinh(1 / z).
+#
+sub acsch {
+	my ($z) = @_;
+	_divbyzero 'acsch(0)', $z if ($z == 0);
+	return asinh(1 / $z);
+}
+
+#
+# acosech
+#
+# Alias for acosh().
+#
+sub acosech { Math::Complex::acsch(@_) }
+
+#
+# acoth
+#
+# Computes the arc hyperbolic cotangent acoth(z) = 1/2 log((1+z) / (z-1)).
+#
+sub acoth {
+	my ($z) = @_;
+	_divbyzero 'acoth(0)'            if ($z == 0);
+	unless (ref $z) {
+	    return CORE::log(($z + 1)/($z - 1))/2 if CORE::abs($z) > 1;
+	    $z = cplx($z, 0);
+	}
+	_divbyzero 'acoth(1)',  "$z - 1" if ($z - 1 == 0);
+	_logofzero 'acoth(-1)', "1 + $z" if (1 + $z == 0);
+	return &log((1 + $z) / ($z - 1)) / 2;
+}
+
+#
+# acotanh
+#
+# Alias for acot().
+#
+sub acotanh { Math::Complex::acoth(@_) }
+
+#
+# (atan2)
+#
+# Compute atan(z1/z2), minding the right quadrant.
+#
+sub atan2 {
+	my ($z1, $z2, $inverted) = @_;
+	my ($re1, $im1, $re2, $im2);
+	if ($inverted) {
+	    ($re1, $im1) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
+	    ($re2, $im2) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
+	} else {
+	    ($re1, $im1) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
+	    ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
+	}
+	if ($im1 || $im2) {
+	    # In MATLAB the imaginary parts are ignored.
+	    # warn "atan2: Imaginary parts ignored";
+	    # http://documents.wolfram.com/mathematica/functions/ArcTan
+	    # NOTE: Mathematica ArcTan[x,y] while atan2(y,x)
+	    my $s = $z1 * $z1 + $z2 * $z2;
+	    _divbyzero("atan2") if $s == 0;
+	    my $i = &i;
+	    my $r = $z2 + $z1 * $i;
+	    return -$i * &log($r / &sqrt( $s ));
+	}
+	return CORE::atan2($re1, $re2);
+}
+
+#
+# display_format
+# ->display_format
+#
+# Set (get if no argument) the display format for all complex numbers that
+# don't happen to have overridden it via ->display_format
+#
+# When called as an object method, this actually sets the display format for
+# the current object.
+#
+# Valid object formats are 'c' and 'p' for cartesian and polar. The first
+# letter is used actually, so the type can be fully spelled out for clarity.
+#
+sub display_format {
+	my $self  = shift;
+	my %display_format = %DISPLAY_FORMAT;
+
+	if (ref $self) {			# Called as an object method
+	    if (exists $self->{display_format}) {
+		my %obj = %{$self->{display_format}};
+		@display_format{keys %obj} = values %obj;
+	    }
+	}
+	if (@_ == 1) {
+	    $display_format{style} = shift;
+	} else {
+	    my %new = @_;
+	    @display_format{keys %new} = values %new;
+	}
+
+	if (ref $self) { # Called as an object method
+	    $self->{display_format} = { %display_format };
+	    return
+		wantarray ?
+		    %{$self->{display_format}} :
+		    $self->{display_format}->{style};
+	}
+
+        # Called as a class method
+	%DISPLAY_FORMAT = %display_format;
+	return
+	    wantarray ?
+		%DISPLAY_FORMAT :
+		    $DISPLAY_FORMAT{style};
+}
+
+#
+# (stringify)
+#
+# Show nicely formatted complex number under its cartesian or polar form,
+# depending on the current display format:
+#
+# . If a specific display format has been recorded for this object, use it.
+# . Otherwise, use the generic current default for all complex numbers,
+#   which is a package global variable.
+#
+sub stringify {
+	my ($z) = shift;
+
+	my $style = $z->display_format;
+
+	$style = $DISPLAY_FORMAT{style} unless defined $style;
+
+	return $z->stringify_polar if $style =~ /^p/i;
+	return $z->stringify_cartesian;
+}
+
+#
+# ->stringify_cartesian
+#
+# Stringify as a cartesian representation 'a+bi'.
+#
+sub stringify_cartesian {
+	my $z  = shift;
+	my ($x, $y) = @{$z->cartesian};
+	my ($re, $im);
+
+	my %format = $z->display_format;
+	my $format = $format{format};
+
+	if ($x) {
+	    if ($x =~ /^NaN[QS]?$/i) {
+		$re = $x;
+	    } else {
+		if ($x =~ /^-?$Inf$/oi) {
+		    $re = $x;
+		} else {
+		    $re = defined $format ? sprintf($format, $x) : $x;
+		}
+	    }
+	} else {
+	    undef $re;
+	}
+
+	if ($y) {
+	    if ($y =~ /^(NaN[QS]?)$/i) {
+		$im = $y;
+	    } else {
+		if ($y =~ /^-?$Inf$/oi) {
+		    $im = $y;
+		} else {
+		    $im =
+			defined $format ?
+			    sprintf($format, $y) :
+			    ($y == 1 ? "" : ($y == -1 ? "-" : $y));
+		}
+	    }
+	    $im .= "i";
+	} else {
+	    undef $im;
+	}
+
+	my $str = $re;
+
+	if (defined $im) {
+	    if ($y < 0) {
+		$str .= $im;
+	    } elsif ($y > 0 || $im =~ /^NaN[QS]?i$/i)  {
+		$str .= "+" if defined $re;
+		$str .= $im;
+	    }
+	} elsif (!defined $re) {
+	    $str = "0";
+	}
+
+	return $str;
+}
+
+
+#
+# ->stringify_polar
+#
+# Stringify as a polar representation '[r,t]'.
+#
+sub stringify_polar {
+	my $z  = shift;
+	my ($r, $t) = @{$z->polar};
+	my $theta;
+
+	my %format = $z->display_format;
+	my $format = $format{format};
+
+	if ($t =~ /^NaN[QS]?$/i || $t =~ /^-?$Inf$/oi) {
+	    $theta = $t; 
+	} elsif ($t == pi) {
+	    $theta = "pi";
+	} elsif ($r == 0 || $t == 0) {
+	    $theta = defined $format ? sprintf($format, $t) : $t;
+	}
+
+	return "[$r,$theta]" if defined $theta;
+
+	#
+	# Try to identify pi/n and friends.
+	#
+
+	$t -= int(CORE::abs($t) / pit2) * pit2;
+
+	if ($format{polar_pretty_print} && $t) {
+	    my ($a, $b);
+	    for $a (2..9) {
+		$b = $t * $a / pi;
+		if ($b =~ /^-?\d+$/) {
+		    $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1;
+		    $theta = "${b}pi/$a";
+		    last;
+		}
+	    }
+	}
+
+        if (defined $format) {
+	    $r     = sprintf($format, $r);
+	    $theta = sprintf($format, $theta) unless defined $theta;
+	} else {
+	    $theta = $t unless defined $theta;
+	}
+
+	return "[$r,$theta]";
+}
+
+1;
+__END__
+
+=pod
+
+=head1 NAME
+
+Math::Complex - complex numbers and associated mathematical functions
+
+=head1 SYNOPSIS
+
+	use Math::Complex;
+
+	$z = Math::Complex->make(5, 6);
+	$t = 4 - 3*i + $z;
+	$j = cplxe(1, 2*pi/3);
+
+=head1 DESCRIPTION
+
+This package lets you create and manipulate complex numbers. By default,
+I<Perl> limits itself to real numbers, but an extra C<use> statement brings
+full complex support, along with a full set of mathematical functions
+typically associated with and/or extended to complex numbers.
+
+If you wonder what complex numbers are, they were invented to be able to solve
+the following equation:
+
+	x*x = -1
+
+and by definition, the solution is noted I<i> (engineers use I<j> instead since
+I<i> usually denotes an intensity, but the name does not matter). The number
+I<i> is a pure I<imaginary> number.
+
+The arithmetics with pure imaginary numbers works just like you would expect
+it with real numbers... you just have to remember that
+
+	i*i = -1
+
+so you have:
+
+	5i + 7i = i * (5 + 7) = 12i
+	4i - 3i = i * (4 - 3) = i
+	4i * 2i = -8
+	6i / 2i = 3
+	1 / i = -i
+
+Complex numbers are numbers that have both a real part and an imaginary
+part, and are usually noted:
+
+	a + bi
+
+where C<a> is the I<real> part and C<b> is the I<imaginary> part. The
+arithmetic with complex numbers is straightforward. You have to
+keep track of the real and the imaginary parts, but otherwise the
+rules used for real numbers just apply:
+
+	(4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i
+	(2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i
+
+A graphical representation of complex numbers is possible in a plane
+(also called the I<complex plane>, but it's really a 2D plane).
+The number
+
+	z = a + bi
+
+is the point whose coordinates are (a, b). Actually, it would
+be the vector originating from (0, 0) to (a, b). It follows that the addition
+of two complex numbers is a vectorial addition.
+
+Since there is a bijection between a point in the 2D plane and a complex
+number (i.e. the mapping is unique and reciprocal), a complex number
+can also be uniquely identified with polar coordinates:
+
+	[rho, theta]
+
+where C<rho> is the distance to the origin, and C<theta> the angle between
+the vector and the I<x> axis. There is a notation for this using the
+exponential form, which is:
+
+	rho * exp(i * theta)
+
+where I<i> is the famous imaginary number introduced above. Conversion
+between this form and the cartesian form C<a + bi> is immediate:
+
+	a = rho * cos(theta)
+	b = rho * sin(theta)
+
+which is also expressed by this formula:
+
+	z = rho * exp(i * theta) = rho * (cos theta + i * sin theta)
+
+In other words, it's the projection of the vector onto the I<x> and I<y>
+axes. Mathematicians call I<rho> the I<norm> or I<modulus> and I<theta>
+the I<argument> of the complex number. The I<norm> of C<z> will be
+noted C<abs(z)>.
+
+The polar notation (also known as the trigonometric
+representation) is much more handy for performing multiplications and
+divisions of complex numbers, whilst the cartesian notation is better
+suited for additions and subtractions. Real numbers are on the I<x>
+axis, and therefore I<theta> is zero or I<pi>.
+
+All the common operations that can be performed on a real number have
+been defined to work on complex numbers as well, and are merely
+I<extensions> of the operations defined on real numbers. This means
+they keep their natural meaning when there is no imaginary part, provided
+the number is within their definition set.
+
+For instance, the C<sqrt> routine which computes the square root of
+its argument is only defined for non-negative real numbers and yields a
+non-negative real number (it is an application from B<R+> to B<R+>).
+If we allow it to return a complex number, then it can be extended to
+negative real numbers to become an application from B<R> to B<C> (the
+set of complex numbers):
+
+	sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i
+
+It can also be extended to be an application from B<C> to B<C>,
+whilst its restriction to B<R> behaves as defined above by using
+the following definition:
+
+	sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2)
+
+Indeed, a negative real number can be noted C<[x,pi]> (the modulus
+I<x> is always non-negative, so C<[x,pi]> is really C<-x>, a negative
+number) and the above definition states that
+
+	sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i
+
+which is exactly what we had defined for negative real numbers above.
+The C<sqrt> returns only one of the solutions: if you want the both,
+use the C<root> function.
+
+All the common mathematical functions defined on real numbers that
+are extended to complex numbers share that same property of working
+I<as usual> when the imaginary part is zero (otherwise, it would not
+be called an extension, would it?).
+
+A I<new> operation possible on a complex number that is
+the identity for real numbers is called the I<conjugate>, and is noted
+with a horizontal bar above the number, or C<~z> here.
+
+	 z = a + bi
+	~z = a - bi
+
+Simple... Now look:
+
+	z * ~z = (a + bi) * (a - bi) = a*a + b*b
+
+We saw that the norm of C<z> was noted C<abs(z)> and was defined as the
+distance to the origin, also known as:
+
+	rho = abs(z) = sqrt(a*a + b*b)
+
+so
+
+	z * ~z = abs(z) ** 2
+
+If z is a pure real number (i.e. C<b == 0>), then the above yields:
+
+	a * a = abs(a) ** 2
+
+which is true (C<abs> has the regular meaning for real number, i.e. stands
+for the absolute value). This example explains why the norm of C<z> is
+noted C<abs(z)>: it extends the C<abs> function to complex numbers, yet
+is the regular C<abs> we know when the complex number actually has no
+imaginary part... This justifies I<a posteriori> our use of the C<abs>
+notation for the norm.
+
+=head1 OPERATIONS
+
+Given the following notations:
+
+	z1 = a + bi = r1 * exp(i * t1)
+	z2 = c + di = r2 * exp(i * t2)
+	z = <any complex or real number>
+
+the following (overloaded) operations are supported on complex numbers:
+
+	z1 + z2 = (a + c) + i(b + d)
+	z1 - z2 = (a - c) + i(b - d)
+	z1 * z2 = (r1 * r2) * exp(i * (t1 + t2))
+	z1 / z2 = (r1 / r2) * exp(i * (t1 - t2))
+	z1 ** z2 = exp(z2 * log z1)
+	~z = a - bi
+	abs(z) = r1 = sqrt(a*a + b*b)
+	sqrt(z) = sqrt(r1) * exp(i * t/2)
+	exp(z) = exp(a) * exp(i * b)
+	log(z) = log(r1) + i*t
+	sin(z) = 1/2i (exp(i * z1) - exp(-i * z))
+	cos(z) = 1/2 (exp(i * z1) + exp(-i * z))
+	atan2(y, x) = atan(y / x) # Minding the right quadrant, note the order.
+
+The definition used for complex arguments of atan2() is
+
+       -i log((x + iy)/sqrt(x*x+y*y))
+
+The following extra operations are supported on both real and complex
+numbers:
+
+	Re(z) = a
+	Im(z) = b
+	arg(z) = t
+	abs(z) = r
+
+	cbrt(z) = z ** (1/3)
+	log10(z) = log(z) / log(10)
+	logn(z, n) = log(z) / log(n)
+
+	tan(z) = sin(z) / cos(z)
+
+	csc(z) = 1 / sin(z)
+	sec(z) = 1 / cos(z)
+	cot(z) = 1 / tan(z)
+
+	asin(z) = -i * log(i*z + sqrt(1-z*z))
+	acos(z) = -i * log(z + i*sqrt(1-z*z))
+	atan(z) = i/2 * log((i+z) / (i-z))
+
+	acsc(z) = asin(1 / z)
+	asec(z) = acos(1 / z)
+	acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i))
+
+	sinh(z) = 1/2 (exp(z) - exp(-z))
+	cosh(z) = 1/2 (exp(z) + exp(-z))
+	tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z))
+
+	csch(z) = 1 / sinh(z)
+	sech(z) = 1 / cosh(z)
+	coth(z) = 1 / tanh(z)
+
+	asinh(z) = log(z + sqrt(z*z+1))
+	acosh(z) = log(z + sqrt(z*z-1))
+	atanh(z) = 1/2 * log((1+z) / (1-z))
+
+	acsch(z) = asinh(1 / z)
+	asech(z) = acosh(1 / z)
+	acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1))
+
+I<arg>, I<abs>, I<log>, I<csc>, I<cot>, I<acsc>, I<acot>, I<csch>,
+I<coth>, I<acosech>, I<acotanh>, have aliases I<rho>, I<theta>, I<ln>,
+I<cosec>, I<cotan>, I<acosec>, I<acotan>, I<cosech>, I<cotanh>,
+I<acosech>, I<acotanh>, respectively.  C<Re>, C<Im>, C<arg>, C<abs>,
+C<rho>, and C<theta> can be used also as mutators.  The C<cbrt>
+returns only one of the solutions: if you want all three, use the
+C<root> function.
+
+The I<root> function is available to compute all the I<n>
+roots of some complex, where I<n> is a strictly positive integer.
+There are exactly I<n> such roots, returned as a list. Getting the
+number mathematicians call C<j> such that:
+
+	1 + j + j*j = 0;
+
+is a simple matter of writing:
+
+	$j = ((root(1, 3))[1];
+
+The I<k>th root for C<z = [r,t]> is given by:
+
+	(root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n)
+
+You can return the I<k>th root directly by C<root(z, n, k)>,
+indexing starting from I<zero> and ending at I<n - 1>.
+
+The I<spaceship> comparison operator, E<lt>=E<gt>, is also defined. In
+order to ensure its restriction to real numbers is conform to what you
+would expect, the comparison is run on the real part of the complex
+number first, and imaginary parts are compared only when the real
+parts match.
+
+=head1 CREATION
+
+To create a complex number, use either:
+
+	$z = Math::Complex->make(3, 4);
+	$z = cplx(3, 4);
+
+if you know the cartesian form of the number, or
+
+	$z = 3 + 4*i;
+
+if you like. To create a number using the polar form, use either:
+
+	$z = Math::Complex->emake(5, pi/3);
+	$x = cplxe(5, pi/3);
+
+instead. The first argument is the modulus, the second is the angle
+(in radians, the full circle is 2*pi).  (Mnemonic: C<e> is used as a
+notation for complex numbers in the polar form).
+
+It is possible to write:
+
+	$x = cplxe(-3, pi/4);
+
+but that will be silently converted into C<[3,-3pi/4]>, since the
+modulus must be non-negative (it represents the distance to the origin
+in the complex plane).
+
+It is also possible to have a complex number as either argument of the
+C<make>, C<emake>, C<cplx>, and C<cplxe>: the appropriate component of
+the argument will be used.
+
+	$z1 = cplx(-2,  1);
+	$z2 = cplx($z1, 4);
+
+The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
+understand a single (string) argument of the forms
+
+    	2-3i
+    	-3i
+	[2,3]
+	[2,-3pi/4]
+	[2]
+
+in which case the appropriate cartesian and exponential components
+will be parsed from the string and used to create new complex numbers.
+The imaginary component and the theta, respectively, will default to zero.
+
+The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
+understand the case of no arguments: this means plain zero or (0, 0).
+
+=head1 DISPLAYING
+
+When printed, a complex number is usually shown under its cartesian
+style I<a+bi>, but there are legitimate cases where the polar style
+I<[r,t]> is more appropriate.  The process of converting the complex
+number into a string that can be displayed is known as I<stringification>.
+
+By calling the class method C<Math::Complex::display_format> and
+supplying either C<"polar"> or C<"cartesian"> as an argument, you
+override the default display style, which is C<"cartesian">. Not
+supplying any argument returns the current settings.
+
+This default can be overridden on a per-number basis by calling the
+C<display_format> method instead. As before, not supplying any argument
+returns the current display style for this number. Otherwise whatever you
+specify will be the new display style for I<this> particular number.
+
+For instance:
+
+	use Math::Complex;
+
+	Math::Complex::display_format('polar');
+	$j = (root(1, 3))[1];
+	print "j = $j\n";		# Prints "j = [1,2pi/3]"
+	$j->display_format('cartesian');
+	print "j = $j\n";		# Prints "j = -0.5+0.866025403784439i"
+
+The polar style attempts to emphasize arguments like I<k*pi/n>
+(where I<n> is a positive integer and I<k> an integer within [-9, +9]),
+this is called I<polar pretty-printing>.
+
+For the reverse of stringifying, see the C<make> and C<emake>.
+
+=head2 CHANGED IN PERL 5.6
+
+The C<display_format> class method and the corresponding
+C<display_format> object method can now be called using
+a parameter hash instead of just a one parameter.
+
+The old display format style, which can have values C<"cartesian"> or
+C<"polar">, can be changed using the C<"style"> parameter.
+
+	$j->display_format(style => "polar");
+
+The one parameter calling convention also still works.
+
+	$j->display_format("polar");
+
+There are two new display parameters.
+
+The first one is C<"format">, which is a sprintf()-style format string
+to be used for both numeric parts of the complex number(s).  The is
+somewhat system-dependent but most often it corresponds to C<"%.15g">.
+You can revert to the default by setting the C<format> to C<undef>.
+
+	# the $j from the above example
+
+	$j->display_format('format' => '%.5f');
+	print "j = $j\n";		# Prints "j = -0.50000+0.86603i"
+	$j->display_format('format' => undef);
+	print "j = $j\n";		# Prints "j = -0.5+0.86603i"
+
+Notice that this affects also the return values of the
+C<display_format> methods: in list context the whole parameter hash
+will be returned, as opposed to only the style parameter value.
+This is a potential incompatibility with earlier versions if you
+have been calling the C<display_format> method in list context.
+
+The second new display parameter is C<"polar_pretty_print">, which can
+be set to true or false, the default being true.  See the previous
+section for what this means.
+
+=head1 USAGE
+
+Thanks to overloading, the handling of arithmetics with complex numbers
+is simple and almost transparent.
+
+Here are some examples:
+
+	use Math::Complex;
+
+	$j = cplxe(1, 2*pi/3);	# $j ** 3 == 1
+	print "j = $j, j**3 = ", $j ** 3, "\n";
+	print "1 + j + j**2 = ", 1 + $j + $j**2, "\n";
+
+	$z = -16 + 0*i;			# Force it to be a complex
+	print "sqrt($z) = ", sqrt($z), "\n";
+
+	$k = exp(i * 2*pi/3);
+	print "$j - $k = ", $j - $k, "\n";
+
+	$z->Re(3);			# Re, Im, arg, abs,
+	$j->arg(2);			# (the last two aka rho, theta)
+					# can be used also as mutators.
+
+=head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
+
+The division (/) and the following functions
+
+	log	ln	log10	logn
+	tan	sec	csc	cot
+	atan	asec	acsc	acot
+	tanh	sech	csch	coth
+	atanh	asech	acsch	acoth
+
+cannot be computed for all arguments because that would mean dividing
+by zero or taking logarithm of zero. These situations cause fatal
+runtime errors looking like this
+
+	cot(0): Division by zero.
+	(Because in the definition of cot(0), the divisor sin(0) is 0)
+	Died at ...
+
+or
+
+	atanh(-1): Logarithm of zero.
+	Died at...
+
+For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
+C<asech>, C<acsch>, the argument cannot be C<0> (zero).  For the
+logarithmic functions and the C<atanh>, C<acoth>, the argument cannot
+be C<1> (one).  For the C<atanh>, C<acoth>, the argument cannot be
+C<-1> (minus one).  For the C<atan>, C<acot>, the argument cannot be
+C<i> (the imaginary unit).  For the C<atan>, C<acoth>, the argument
+cannot be C<-i> (the negative imaginary unit).  For the C<tan>,
+C<sec>, C<tanh>, the argument cannot be I<pi/2 + k * pi>, where I<k>
+is any integer.  atan2(0, 0) is undefined, and if the complex arguments
+are used for atan2(), a division by zero will happen if z1**2+z2**2 == 0.
+
+Note that because we are operating on approximations of real numbers,
+these errors can happen when merely `too close' to the singularities
+listed above.
+
+=head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS
+
+The C<make> and C<emake> accept both real and complex arguments.
+When they cannot recognize the arguments they will die with error
+messages like the following
+
+    Math::Complex::make: Cannot take real part of ...
+    Math::Complex::make: Cannot take real part of ...
+    Math::Complex::emake: Cannot take rho of ...
+    Math::Complex::emake: Cannot take theta of ...
+
+=head1 BUGS
+
+Saying C<use Math::Complex;> exports many mathematical routines in the
+caller environment and even overrides some (C<sqrt>, C<log>, C<atan2>).
+This is construed as a feature by the Authors, actually... ;-)
+
+All routines expect to be given real or complex numbers. Don't attempt to
+use BigFloat, since Perl has currently no rule to disambiguate a '+'
+operation (for instance) between two overloaded entities.
+
+In Cray UNICOS there is some strange numerical instability that results
+in root(), cos(), sin(), cosh(), sinh(), losing accuracy fast.  Beware.
+The bug may be in UNICOS math libs, in UNICOS C compiler, in Math::Complex.
+Whatever it is, it does not manifest itself anywhere else where Perl runs.
+
+=head1 AUTHORS
+
+Daniel S. Lewart <F<d-lewart@uiuc.edu>>
+
+Original authors Raphael Manfredi <F<Raphael_Manfredi@pobox.com>> and
+Jarkko Hietaniemi <F<jhi@iki.fi>>
+
+=cut
+
+1;
+
+# eof
Index: /for-distributions/trunk/bin/windows/perl/lib/Math/Trig.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Math/Trig.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Math/Trig.pm	(revision 14489)
@@ -0,0 +1,622 @@
+#
+# Trigonometric functions, mostly inherited from Math::Complex.
+# -- Jarkko Hietaniemi, since April 1997
+# -- Raphael Manfredi, September 1996 (indirectly: because of Math::Complex)
+#
+
+require Exporter;
+package Math::Trig;
+
+use 5.006;
+use strict;
+
+use Math::Complex 1.35;
+use Math::Complex qw(:trig);
+
+our($VERSION, $PACKAGE, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+@ISA = qw(Exporter);
+
+$VERSION = 1.03;
+
+my @angcnv = qw(rad2deg rad2grad
+		deg2rad deg2grad
+		grad2rad grad2deg);
+
+@EXPORT = (@{$Math::Complex::EXPORT_TAGS{'trig'}},
+	   @angcnv);
+
+my @rdlcnv = qw(cartesian_to_cylindrical
+		cartesian_to_spherical
+		cylindrical_to_cartesian
+		cylindrical_to_spherical
+		spherical_to_cartesian
+		spherical_to_cylindrical);
+
+my @greatcircle = qw(
+		     great_circle_distance
+		     great_circle_direction
+		     great_circle_bearing
+		     great_circle_waypoint
+		     great_circle_midpoint
+		     great_circle_destination
+		    );
+
+my @pi = qw(pi2 pip2 pip4);
+
+@EXPORT_OK = (@rdlcnv, @greatcircle, @pi);
+
+# See e.g. the following pages:
+# http://www.movable-type.co.uk/scripts/LatLong.html
+# http://williams.best.vwh.net/avform.htm
+
+%EXPORT_TAGS = ('radial' => [ @rdlcnv ],
+	        'great_circle' => [ @greatcircle ],
+	        'pi'     => [ @pi ]);
+
+sub pi2  () { 2 * pi }
+sub pip2 () { pi / 2 }
+sub pip4 () { pi / 4 }
+
+sub DR  () { pi2/360 }
+sub RD  () { 360/pi2 }
+sub DG  () { 400/360 }
+sub GD  () { 360/400 }
+sub RG  () { 400/pi2 }
+sub GR  () { pi2/400 }
+
+#
+# Truncating remainder.
+#
+
+sub remt ($$) {
+    # Oh yes, POSIX::fmod() would be faster. Possibly. If it is available.
+    $_[0] - $_[1] * int($_[0] / $_[1]);
+}
+
+#
+# Angle conversions.
+#
+
+sub rad2rad($)     { remt($_[0], pi2) }
+
+sub deg2deg($)     { remt($_[0], 360) }
+
+sub grad2grad($)   { remt($_[0], 400) }
+
+sub rad2deg ($;$)  { my $d = RD * $_[0]; $_[1] ? $d : deg2deg($d) }
+
+sub deg2rad ($;$)  { my $d = DR * $_[0]; $_[1] ? $d : rad2rad($d) }
+
+sub grad2deg ($;$) { my $d = GD * $_[0]; $_[1] ? $d : deg2deg($d) }
+
+sub deg2grad ($;$) { my $d = DG * $_[0]; $_[1] ? $d : grad2grad($d) }
+
+sub rad2grad ($;$) { my $d = RG * $_[0]; $_[1] ? $d : grad2grad($d) }
+
+sub grad2rad ($;$) { my $d = GR * $_[0]; $_[1] ? $d : rad2rad($d) }
+
+sub cartesian_to_spherical {
+    my ( $x, $y, $z ) = @_;
+
+    my $rho = sqrt( $x * $x + $y * $y + $z * $z );
+
+    return ( $rho,
+             atan2( $y, $x ),
+             $rho ? acos( $z / $rho ) : 0 );
+}
+
+sub spherical_to_cartesian {
+    my ( $rho, $theta, $phi ) = @_;
+
+    return ( $rho * cos( $theta ) * sin( $phi ),
+             $rho * sin( $theta ) * sin( $phi ),
+             $rho * cos( $phi   ) );
+}
+
+sub spherical_to_cylindrical {
+    my ( $x, $y, $z ) = spherical_to_cartesian( @_ );
+
+    return ( sqrt( $x * $x + $y * $y ), $_[1], $z );
+}
+
+sub cartesian_to_cylindrical {
+    my ( $x, $y, $z ) = @_;
+
+    return ( sqrt( $x * $x + $y * $y ), atan2( $y, $x ), $z );
+}
+
+sub cylindrical_to_cartesian {
+    my ( $rho, $theta, $z ) = @_;
+
+    return ( $rho * cos( $theta ), $rho * sin( $theta ), $z );
+}
+
+sub cylindrical_to_spherical {
+    return ( cartesian_to_spherical( cylindrical_to_cartesian( @_ ) ) );
+}
+
+sub great_circle_distance {
+    my ( $theta0, $phi0, $theta1, $phi1, $rho ) = @_;
+
+    $rho = 1 unless defined $rho; # Default to the unit sphere.
+
+    my $lat0 = pip2 - $phi0;
+    my $lat1 = pip2 - $phi1;
+
+    return $rho *
+        acos(cos( $lat0 ) * cos( $lat1 ) * cos( $theta0 - $theta1 ) +
+             sin( $lat0 ) * sin( $lat1 ) );
+}
+
+sub great_circle_direction {
+    my ( $theta0, $phi0, $theta1, $phi1 ) = @_;
+
+    my $distance = &great_circle_distance;
+
+    my $lat0 = pip2 - $phi0;
+    my $lat1 = pip2 - $phi1;
+
+    my $direction =
+	acos((sin($lat1) - sin($lat0) * cos($distance)) /
+	     (cos($lat0) * sin($distance)));
+
+    $direction = pi2 - $direction
+	if sin($theta1 - $theta0) < 0;
+
+    return rad2rad($direction);
+}
+
+*great_circle_bearing = \&great_circle_direction;
+
+sub great_circle_waypoint {
+    my ( $theta0, $phi0, $theta1, $phi1, $point ) = @_;
+
+    $point = 0.5 unless defined $point;
+
+    my $d = great_circle_distance( $theta0, $phi0, $theta1, $phi1 );
+
+    return undef if $d == pi;
+
+    my $sd = sin($d);
+
+    return ($theta0, $phi0) if $sd == 0;
+
+    my $A = sin((1 - $point) * $d) / $sd;
+    my $B = sin(     $point  * $d) / $sd;
+
+    my $lat0 = pip2 - $phi0;
+    my $lat1 = pip2 - $phi1;
+
+    my $x = $A * cos($lat0) * cos($theta0) + $B * cos($lat1) * cos($theta1);
+    my $y = $A * cos($lat0) * sin($theta0) + $B * cos($lat1) * sin($theta1);
+    my $z = $A * sin($lat0)                + $B * sin($lat1);
+
+    my $theta = atan2($y, $x);
+    my $phi   = atan2($z, sqrt($x*$x + $y*$y));
+    
+    return ($theta, $phi);
+}
+
+sub great_circle_midpoint {
+    great_circle_waypoint(@_[0..3], 0.5);
+}
+
+sub great_circle_destination {
+    my ( $theta0, $phi0, $dir0, $dst ) = @_;
+
+    my $lat0 = pip2 - $phi0;
+
+    my $phi1   = asin(sin($lat0)*cos($dst)+cos($lat0)*sin($dst)*cos($dir0));
+    my $theta1 = $theta0 + atan2(sin($dir0)*sin($dst)*cos($lat0),
+				 cos($dst)-sin($lat0)*sin($phi1));
+
+    my $dir1 = great_circle_bearing($theta1, $phi1, $theta0, $phi0) + pi;
+
+    $dir1 -= pi2 if $dir1 > pi2;
+
+    return ($theta1, $phi1, $dir1);
+}
+
+1;
+
+__END__
+=pod
+
+=head1 NAME
+
+Math::Trig - trigonometric functions
+
+=head1 SYNOPSIS
+
+	use Math::Trig;
+
+	$x = tan(0.9);
+	$y = acos(3.7);
+	$z = asin(2.4);
+
+	$halfpi = pi/2;
+
+	$rad = deg2rad(120);
+
+        # Import constants pi2, pip2, pip4 (2*pi, pi/2, pi/4).
+	use Math::Trig ':pi';
+
+        # Import the conversions between cartesian/spherical/cylindrical.
+	use Math::Trig ':radial';
+
+        # Import the great circle formulas.
+	use Math::Trig ':great_circle';
+
+=head1 DESCRIPTION
+
+C<Math::Trig> defines many trigonometric functions not defined by the
+core Perl which defines only the C<sin()> and C<cos()>.  The constant
+B<pi> is also defined as are a few convenience functions for angle
+conversions, and I<great circle formulas> for spherical movement.
+
+=head1 TRIGONOMETRIC FUNCTIONS
+
+The tangent
+
+=over 4
+
+=item B<tan>
+
+=back
+
+The cofunctions of the sine, cosine, and tangent (cosec/csc and cotan/cot
+are aliases)
+
+B<csc>, B<cosec>, B<sec>, B<sec>, B<cot>, B<cotan>
+
+The arcus (also known as the inverse) functions of the sine, cosine,
+and tangent
+
+B<asin>, B<acos>, B<atan>
+
+The principal value of the arc tangent of y/x
+
+B<atan2>(y, x)
+
+The arcus cofunctions of the sine, cosine, and tangent (acosec/acsc
+and acotan/acot are aliases)
+
+B<acsc>, B<acosec>, B<asec>, B<acot>, B<acotan>
+
+The hyperbolic sine, cosine, and tangent
+
+B<sinh>, B<cosh>, B<tanh>
+
+The cofunctions of the hyperbolic sine, cosine, and tangent (cosech/csch
+and cotanh/coth are aliases)
+
+B<csch>, B<cosech>, B<sech>, B<coth>, B<cotanh>
+
+The arcus (also known as the inverse) functions of the hyperbolic
+sine, cosine, and tangent
+
+B<asinh>, B<acosh>, B<atanh>
+
+The arcus cofunctions of the hyperbolic sine, cosine, and tangent
+(acsch/acosech and acoth/acotanh are aliases)
+
+B<acsch>, B<acosech>, B<asech>, B<acoth>, B<acotanh>
+
+The trigonometric constant B<pi> is also defined.
+
+$pi2 = 2 * B<pi>;
+
+=head2 ERRORS DUE TO DIVISION BY ZERO
+
+The following functions
+
+	acoth
+	acsc
+	acsch
+	asec
+	asech
+	atanh
+	cot
+	coth
+	csc
+	csch
+	sec
+	sech
+	tan
+	tanh
+
+cannot be computed for all arguments because that would mean dividing
+by zero or taking logarithm of zero. These situations cause fatal
+runtime errors looking like this
+
+	cot(0): Division by zero.
+	(Because in the definition of cot(0), the divisor sin(0) is 0)
+	Died at ...
+
+or
+
+	atanh(-1): Logarithm of zero.
+	Died at...
+
+For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
+C<asech>, C<acsch>, the argument cannot be C<0> (zero).  For the
+C<atanh>, C<acoth>, the argument cannot be C<1> (one).  For the
+C<atanh>, C<acoth>, the argument cannot be C<-1> (minus one).  For the
+C<tan>, C<sec>, C<tanh>, C<sech>, the argument cannot be I<pi/2 + k *
+pi>, where I<k> is any integer.  atan2(0, 0) is undefined.
+
+=head2 SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS
+
+Please note that some of the trigonometric functions can break out
+from the B<real axis> into the B<complex plane>. For example
+C<asin(2)> has no definition for plain real numbers but it has
+definition for complex numbers.
+
+In Perl terms this means that supplying the usual Perl numbers (also
+known as scalars, please see L<perldata>) as input for the
+trigonometric functions might produce as output results that no more
+are simple real numbers: instead they are complex numbers.
+
+The C<Math::Trig> handles this by using the C<Math::Complex> package
+which knows how to handle complex numbers, please see L<Math::Complex>
+for more information. In practice you need not to worry about getting
+complex numbers as results because the C<Math::Complex> takes care of
+details like for example how to display complex numbers. For example:
+
+	print asin(2), "\n";
+
+should produce something like this (take or leave few last decimals):
+
+	1.5707963267949-1.31695789692482i
+
+That is, a complex number with the real part of approximately C<1.571>
+and the imaginary part of approximately C<-1.317>.
+
+=head1 PLANE ANGLE CONVERSIONS
+
+(Plane, 2-dimensional) angles may be converted with the following functions.
+
+	$radians  = deg2rad($degrees);
+	$radians  = grad2rad($gradians);
+
+	$degrees  = rad2deg($radians);
+	$degrees  = grad2deg($gradians);
+
+	$gradians = deg2grad($degrees);
+	$gradians = rad2grad($radians);
+
+The full circle is 2 I<pi> radians or I<360> degrees or I<400> gradians.
+The result is by default wrapped to be inside the [0, {2pi,360,400}[ circle.
+If you don't want this, supply a true second argument:
+
+	$zillions_of_radians  = deg2rad($zillions_of_degrees, 1);
+	$negative_degrees     = rad2deg($negative_radians, 1);
+
+You can also do the wrapping explicitly by rad2rad(), deg2deg(), and
+grad2grad().
+
+=head1 RADIAL COORDINATE CONVERSIONS
+
+B<Radial coordinate systems> are the B<spherical> and the B<cylindrical>
+systems, explained shortly in more detail.
+
+You can import radial coordinate conversion functions by using the
+C<:radial> tag:
+
+    use Math::Trig ':radial';
+
+    ($rho, $theta, $z)     = cartesian_to_cylindrical($x, $y, $z);
+    ($rho, $theta, $phi)   = cartesian_to_spherical($x, $y, $z);
+    ($x, $y, $z)           = cylindrical_to_cartesian($rho, $theta, $z);
+    ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z);
+    ($x, $y, $z)           = spherical_to_cartesian($rho, $theta, $phi);
+    ($rho_c, $theta, $z)   = spherical_to_cylindrical($rho_s, $theta, $phi);
+
+B<All angles are in radians>.
+
+=head2 COORDINATE SYSTEMS
+
+B<Cartesian> coordinates are the usual rectangular I<(x, y, z)>-coordinates.
+
+Spherical coordinates, I<(rho, theta, pi)>, are three-dimensional
+coordinates which define a point in three-dimensional space.  They are
+based on a sphere surface.  The radius of the sphere is B<rho>, also
+known as the I<radial> coordinate.  The angle in the I<xy>-plane
+(around the I<z>-axis) is B<theta>, also known as the I<azimuthal>
+coordinate.  The angle from the I<z>-axis is B<phi>, also known as the
+I<polar> coordinate.  The North Pole is therefore I<0, 0, rho>, and
+the Gulf of Guinea (think of the missing big chunk of Africa) I<0,
+pi/2, rho>.  In geographical terms I<phi> is latitude (northward
+positive, southward negative) and I<theta> is longitude (eastward
+positive, westward negative).
+
+B<BEWARE>: some texts define I<theta> and I<phi> the other way round,
+some texts define the I<phi> to start from the horizontal plane, some
+texts use I<r> in place of I<rho>.
+
+Cylindrical coordinates, I<(rho, theta, z)>, are three-dimensional
+coordinates which define a point in three-dimensional space.  They are
+based on a cylinder surface.  The radius of the cylinder is B<rho>,
+also known as the I<radial> coordinate.  The angle in the I<xy>-plane
+(around the I<z>-axis) is B<theta>, also known as the I<azimuthal>
+coordinate.  The third coordinate is the I<z>, pointing up from the
+B<theta>-plane.
+
+=head2 3-D ANGLE CONVERSIONS
+
+Conversions to and from spherical and cylindrical coordinates are
+available.  Please notice that the conversions are not necessarily
+reversible because of the equalities like I<pi> angles being equal to
+I<-pi> angles.
+
+=over 4
+
+=item cartesian_to_cylindrical
+
+        ($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z);
+
+=item cartesian_to_spherical
+
+        ($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z);
+
+=item cylindrical_to_cartesian
+
+        ($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z);
+
+=item cylindrical_to_spherical
+
+        ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z);
+
+Notice that when C<$z> is not 0 C<$rho_s> is not equal to C<$rho_c>.
+
+=item spherical_to_cartesian
+
+        ($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi);
+
+=item spherical_to_cylindrical
+
+        ($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi);
+
+Notice that when C<$z> is not 0 C<$rho_c> is not equal to C<$rho_s>.
+
+=back
+
+=head1 GREAT CIRCLE DISTANCES AND DIRECTIONS
+
+You can compute spherical distances, called B<great circle distances>,
+by importing the great_circle_distance() function:
+
+  use Math::Trig 'great_circle_distance';
+
+  $distance = great_circle_distance($theta0, $phi0, $theta1, $phi1, [, $rho]);
+
+The I<great circle distance> is the shortest distance between two
+points on a sphere.  The distance is in C<$rho> units.  The C<$rho> is
+optional, it defaults to 1 (the unit sphere), therefore the distance
+defaults to radians.
+
+If you think geographically the I<theta> are longitudes: zero at the
+Greenwhich meridian, eastward positive, westward negative--and the
+I<phi> are latitudes: zero at the North Pole, northward positive,
+southward negative.  B<NOTE>: this formula thinks in mathematics, not
+geographically: the I<phi> zero is at the North Pole, not at the
+Equator on the west coast of Africa (Bay of Guinea).  You need to
+subtract your geographical coordinates from I<pi/2> (also known as 90
+degrees).
+
+  $distance = great_circle_distance($lon0, pi/2 - $lat0,
+                                    $lon1, pi/2 - $lat1, $rho);
+
+The direction you must follow the great circle (also known as I<bearing>)
+can be computed by the great_circle_direction() function:
+
+  use Math::Trig 'great_circle_direction';
+
+  $direction = great_circle_direction($theta0, $phi0, $theta1, $phi1);
+
+(Alias 'great_circle_bearing' is also available.)
+The result is in radians, zero indicating straight north, pi or -pi
+straight south, pi/2 straight west, and -pi/2 straight east.
+
+You can inversely compute the destination if you know the
+starting point, direction, and distance:
+
+  use Math::Trig 'great_circle_destination';
+
+  # thetad and phid are the destination coordinates,
+  # dird is the final direction at the destination.
+
+  ($thetad, $phid, $dird) =
+    great_circle_destination($theta, $phi, $direction, $distance);
+
+or the midpoint if you know the end points:
+
+  use Math::Trig 'great_circle_midpoint';
+
+  ($thetam, $phim) =
+    great_circle_midpoint($theta0, $phi0, $theta1, $phi1);
+
+The great_circle_midpoint() is just a special case of
+
+  use Math::Trig 'great_circle_waypoint';
+
+  ($thetai, $phii) =
+    great_circle_waypoint($theta0, $phi0, $theta1, $phi1, $way);
+
+Where the $way is a value from zero ($theta0, $phi0) to one ($theta1,
+$phi1).  Note that antipodal points (where their distance is I<pi>
+radians) do not have waypoints between them (they would have an an
+"equator" between them), and therefore C<undef> is returned for
+antipodal points.  If the points are the same and the distance
+therefore zero and all waypoints therefore identical, the first point
+(either point) is returned.
+
+The thetas, phis, direction, and distance in the above are all in radians.
+
+You can import all the great circle formulas by
+
+  use Math::Trig ':great_circle';
+
+Notice that the resulting directions might be somewhat surprising if
+you are looking at a flat worldmap: in such map projections the great
+circles quite often do not look like the shortest routes-- but for
+example the shortest possible routes from Europe or North America to
+Asia do often cross the polar regions.
+
+=head1 EXAMPLES
+
+To calculate the distance between London (51.3N 0.5W) and Tokyo
+(35.7N 139.8E) in kilometers:
+
+        use Math::Trig qw(great_circle_distance deg2rad);
+
+        # Notice the 90 - latitude: phi zero is at the North Pole.
+	sub NESW { deg2rad($_[0]), deg2rad(90 - $_[1]) }
+	my @L = NESW( -0.5, 51.3);
+        my @T = NESW(139.8, 35.7);
+        my $km = great_circle_distance(@L, @T, 6378); # About 9600 km.
+
+The direction you would have to go from London to Tokyo (in radians,
+straight north being zero, straight east being pi/2).
+
+        use Math::Trig qw(great_circle_direction);
+
+        my $rad = great_circle_direction(@L, @T); # About 0.547 or 0.174 pi.
+
+The midpoint between London and Tokyo being
+
+        use Math::Trig qw(great_circle_midpoint);
+
+        my @M = great_circle_midpoint(@L, @T);
+
+or about 68.11N 24.74E, in the Finnish Lapland.
+
+=head2 CAVEAT FOR GREAT CIRCLE FORMULAS
+
+The answers may be off by few percentages because of the irregular
+(slightly aspherical) form of the Earth.  The errors are at worst
+about 0.55%, but generally below 0.3%.
+
+=head1 BUGS
+
+Saying C<use Math::Trig;> exports many mathematical routines in the
+caller environment and even overrides some (C<sin>, C<cos>).  This is
+construed as a feature by the Authors, actually... ;-)
+
+The code is not optimized for speed, especially because we use
+C<Math::Complex> and thus go quite near complex numbers while doing
+the computations even when the arguments are not. This, however,
+cannot be completely avoided if we want things like C<asin(2)> to give
+an answer instead of giving a fatal runtime error.
+
+Do not attempt navigation using these formulas.
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi <F<jhi@iki.fi>> and 
+Raphael Manfredi <F<Raphael_Manfredi@pobox.com>>.
+
+=cut
+
+# eof
Index: /for-distributions/trunk/bin/windows/perl/lib/Memoize.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Memoize.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Memoize.pm	(revision 14489)
@@ -0,0 +1,1047 @@
+# -*- mode: perl; perl-indent-level: 2; -*-
+# Memoize.pm
+#
+# Transparent memoization of idempotent functions
+#
+# Copyright 1998, 1999, 2000, 2001 M-J. Dominus.
+# You may copy and distribute this program under the
+# same terms as Perl itself.  If in doubt, 
+# write to mjd-perl-memoize+@plover.com for a license.
+#
+# Version 1.01 $Revision: 1.18 $ $Date: 2001/06/24 17:16:47 $
+
+package Memoize;
+$VERSION = '1.01';
+
+# Compile-time constants
+sub SCALAR () { 0 } 
+sub LIST () { 1 } 
+
+
+#
+# Usage memoize(functionname/ref,
+#               { NORMALIZER => coderef, INSTALL => name,
+#                 LIST_CACHE => descriptor, SCALAR_CACHE => descriptor }
+#
+
+use Carp;
+use Exporter;
+use vars qw($DEBUG);
+use Config;                     # Dammit.
+@ISA = qw(Exporter);
+@EXPORT = qw(memoize);
+@EXPORT_OK = qw(unmemoize flush_cache);
+use strict;
+
+my %memotable;
+my %revmemotable;
+my @CONTEXT_TAGS = qw(MERGE TIE MEMORY FAULT HASH);
+my %IS_CACHE_TAG = map {($_ => 1)} @CONTEXT_TAGS;
+
+# Raise an error if the user tries to specify one of thesepackage as a
+# tie for LIST_CACHE
+
+my %scalar_only = map {($_ => 1)} qw(DB_File GDBM_File SDBM_File ODBM_File NDBM_File);
+
+sub memoize {
+  my $fn = shift;
+  my %options = @_;
+  my $options = \%options;
+  
+  unless (defined($fn) && 
+	  (ref $fn eq 'CODE' || ref $fn eq '')) {
+    croak "Usage: memoize 'functionname'|coderef {OPTIONS}";
+  }
+
+  my $uppack = caller;		# TCL me Elmo!
+  my $cref;			# Code reference to original function
+  my $name = (ref $fn ? undef : $fn);
+
+  # Convert function names to code references
+  $cref = &_make_cref($fn, $uppack);
+
+  # Locate function prototype, if any
+  my $proto = prototype $cref;
+  if (defined $proto) { $proto = "($proto)" }
+  else { $proto = "" }
+
+  # I would like to get rid of the eval, but there seems not to be any
+  # other way to set the prototype properly.  The switch here for
+  # 'usethreads' works around a bug in threadperl having to do with
+  # magic goto.  It would be better to fix the bug and use the magic
+  # goto version everywhere.
+  my $wrapper = 
+      $Config{usethreads} 
+        ? eval "sub $proto { &_memoizer(\$cref, \@_); }" 
+        : eval "sub $proto { unshift \@_, \$cref; goto &_memoizer; }";
+
+  my $normalizer = $options{NORMALIZER};
+  if (defined $normalizer  && ! ref $normalizer) {
+    $normalizer = _make_cref($normalizer, $uppack);
+  }
+  
+  my $install_name;
+  if (defined $options->{INSTALL}) {
+    # INSTALL => name
+    $install_name = $options->{INSTALL};
+  } elsif (! exists $options->{INSTALL}) {
+    # No INSTALL option provided; use original name if possible
+    $install_name = $name;
+  } else {
+    # INSTALL => undef  means don't install
+  }
+
+  if (defined $install_name) {
+    $install_name = $uppack . '::' . $install_name
+	unless $install_name =~ /::/;
+    no strict;
+    local($^W) = 0;	       # ``Subroutine $install_name redefined at ...''
+    *{$install_name} = $wrapper; # Install memoized version
+  }
+
+  $revmemotable{$wrapper} = "" . $cref; # Turn code ref into hash key
+
+  # These will be the caches
+  my %caches;
+  for my $context (qw(SCALAR LIST)) {
+    # suppress subsequent 'uninitialized value' warnings
+    $options{"${context}_CACHE"} ||= ''; 
+
+    my $cache_opt = $options{"${context}_CACHE"};
+    my @cache_opt_args;
+    if (ref $cache_opt) {
+      @cache_opt_args = @$cache_opt;
+      $cache_opt = shift @cache_opt_args;
+    }
+    if ($cache_opt eq 'FAULT') { # no cache
+      $caches{$context} = undef;
+    } elsif ($cache_opt eq 'HASH') { # user-supplied hash
+      my $cache = $cache_opt_args[0];
+      my $package = ref(tied %$cache);
+      if ($context eq 'LIST' && $scalar_only{$package}) {
+        croak("You can't use $package for LIST_CACHE because it can only store scalars");
+      }
+      $caches{$context} = $cache;
+    } elsif ($cache_opt eq '' ||  $IS_CACHE_TAG{$cache_opt}) {
+      # default is that we make up an in-memory hash
+      $caches{$context} = {};
+      # (this might get tied later, or MERGEd away)
+    } else {
+      croak "Unrecognized option to `${context}_CACHE': `$cache_opt' should be one of (@CONTEXT_TAGS); aborting";
+    }
+  }
+
+  # Perhaps I should check here that you didn't supply *both* merge
+  # options.  But if you did, it does do something reasonable: They
+  # both get merged to the same in-memory hash.
+  if ($options{SCALAR_CACHE} eq 'MERGE') {
+    $caches{SCALAR} = $caches{LIST};
+  } elsif ($options{LIST_CACHE} eq 'MERGE') {
+    $caches{LIST} = $caches{SCALAR};
+  }
+
+  # Now deal with the TIE options
+  {
+    my $context;
+    foreach $context (qw(SCALAR LIST)) {
+      # If the relevant option wasn't `TIE', this call does nothing.
+      _my_tie($context, $caches{$context}, $options);  # Croaks on failure
+    }
+  }
+  
+  # We should put some more stuff in here eventually.
+  # We've been saying that for serveral versions now.
+  # And you know what?  More stuff keeps going in!
+  $memotable{$cref} = 
+  {
+    O => $options,  # Short keys here for things we need to access frequently
+    N => $normalizer,
+    U => $cref,
+    MEMOIZED => $wrapper,
+    PACKAGE => $uppack,
+    NAME => $install_name,
+    S => $caches{SCALAR},
+    L => $caches{LIST},
+  };
+
+  $wrapper			# Return just memoized version
+}
+
+# This function tries to load a tied hash class and tie the hash to it.
+sub _my_tie {
+  my ($context, $hash, $options) = @_;
+  my $fullopt = $options->{"${context}_CACHE"};
+
+  # We already checked to make sure that this works.
+  my $shortopt = (ref $fullopt) ? $fullopt->[0] : $fullopt;
+  
+  return unless defined $shortopt && $shortopt eq 'TIE';
+  carp("TIE option to memoize() is deprecated; use HASH instead")
+      if $^W;
+
+  my @args = ref $fullopt ? @$fullopt : ();
+  shift @args;
+  my $module = shift @args;
+  if ($context eq 'LIST' && $scalar_only{$module}) {
+    croak("You can't use $module for LIST_CACHE because it can only store scalars");
+  }
+  my $modulefile = $module . '.pm';
+  $modulefile =~ s{::}{/}g;
+  eval { require $modulefile };
+  if ($@) {
+    croak "Memoize: Couldn't load hash tie module `$module': $@; aborting";
+  }
+  my $rc = (tie %$hash => $module, @args);
+  unless ($rc) {
+    croak "Memoize: Couldn't tie hash to `$module': $!; aborting";
+  }
+  1;
+}
+
+sub flush_cache {
+  my $func = _make_cref($_[0], scalar caller);
+  my $info = $memotable{$revmemotable{$func}};
+  die "$func not memoized" unless defined $info;
+  for my $context (qw(S L)) {
+    my $cache = $info->{$context};
+    if (tied %$cache && ! (tied %$cache)->can('CLEAR')) {
+      my $funcname = defined($info->{NAME}) ? 
+          "function $info->{NAME}" : "anonymous function $func";
+      my $context = {S => 'scalar', L => 'list'}->{$context};
+      croak "Tied cache hash for $context-context $funcname does not support flushing";
+    } else {
+      %$cache = ();
+    }
+  }
+}
+
+# This is the function that manages the memo tables.
+sub _memoizer {
+  my $orig = shift;		# stringized version of ref to original func.
+  my $info = $memotable{$orig};
+  my $normalizer = $info->{N};
+  
+  my $argstr;
+  my $context = (wantarray() ? LIST : SCALAR);
+
+  if (defined $normalizer) { 
+    no strict;
+    if ($context == SCALAR) {
+      $argstr = &{$normalizer}(@_);
+    } elsif ($context == LIST) {
+      ($argstr) = &{$normalizer}(@_);
+    } else {
+      croak "Internal error \#41; context was neither LIST nor SCALAR\n";
+    }
+  } else {                      # Default normalizer
+    local $^W = 0;
+    $argstr = join chr(28),@_;  
+  }
+
+  if ($context == SCALAR) {
+    my $cache = $info->{S};
+    _crap_out($info->{NAME}, 'scalar') unless $cache;
+    if (exists $cache->{$argstr}) { 
+      return $cache->{$argstr};
+    } else {
+      my $val = &{$info->{U}}(@_);
+      # Scalars are considered to be lists; store appropriately
+      if ($info->{O}{SCALAR_CACHE} eq 'MERGE') {
+	$cache->{$argstr} = [$val];
+      } else {
+	$cache->{$argstr} = $val;
+      }
+      $val;
+    }
+  } elsif ($context == LIST) {
+    my $cache = $info->{L};
+    _crap_out($info->{NAME}, 'list') unless $cache;
+    if (exists $cache->{$argstr}) {
+      my $val = $cache->{$argstr};
+      # If LISTCONTEXT=>MERGE, then the function never returns lists,
+      # so we have a scalar value cached, so just return it straightaway:
+      return ($val) if $info->{O}{LIST_CACHE} eq 'MERGE';
+      # Maybe in a later version we can use a faster test.
+
+      # Otherwise, we cached an array containing the returned list:
+      return @$val;
+    } else {
+      my $q = $cache->{$argstr} = [&{$info->{U}}(@_)];
+      @$q;
+    }
+  } else {
+    croak "Internal error \#42; context was neither LIST nor SCALAR\n";
+  }
+}
+
+sub unmemoize {
+  my $f = shift;
+  my $uppack = caller;
+  my $cref = _make_cref($f, $uppack);
+
+  unless (exists $revmemotable{$cref}) {
+    croak "Could not unmemoize function `$f', because it was not memoized to begin with";
+  }
+  
+  my $tabent = $memotable{$revmemotable{$cref}};
+  unless (defined $tabent) {
+    croak "Could not figure out how to unmemoize function `$f'";
+  }
+  my $name = $tabent->{NAME};
+  if (defined $name) {
+    no strict;
+    local($^W) = 0;	       # ``Subroutine $install_name redefined at ...''
+    *{$name} = $tabent->{U}; # Replace with original function
+  }
+  undef $memotable{$revmemotable{$cref}};
+  undef $revmemotable{$cref};
+
+  # This removes the last reference to the (possibly tied) memo tables
+  # my ($old_function, $memotabs) = @{$tabent}{'U','S','L'};
+  # undef $tabent; 
+
+#  # Untie the memo tables if they were tied.
+#  my $i;
+#  for $i (0,1) {
+#    if (tied %{$memotabs->[$i]}) {
+#      warn "Untying hash #$i\n";
+#      untie %{$memotabs->[$i]};
+#    }
+#  }
+
+  $tabent->{U};
+}
+
+sub _make_cref {
+  my $fn = shift;
+  my $uppack = shift;
+  my $cref;
+  my $name;
+
+  if (ref $fn eq 'CODE') {
+    $cref = $fn;
+  } elsif (! ref $fn) {
+    if ($fn =~ /::/) {
+      $name = $fn;
+    } else {
+      $name = $uppack . '::' . $fn;
+    }
+    no strict;
+    if (defined $name and !defined(&$name)) {
+      croak "Cannot operate on nonexistent function `$fn'";
+    }
+#    $cref = \&$name;
+    $cref = *{$name}{CODE};
+  } else {
+    my $parent = (caller(1))[3]; # Function that called _make_cref
+    croak "Usage: argument 1 to `$parent' must be a function name or reference.\n";
+  }
+  $DEBUG and warn "${name}($fn) => $cref in _make_cref\n";
+  $cref;
+}
+
+sub _crap_out {
+  my ($funcname, $context) = @_;
+  if (defined $funcname) {
+    croak "Function `$funcname' called in forbidden $context context; faulting";
+  } else {
+    croak "Anonymous function called in forbidden $context context; faulting";
+  }
+}
+
+1;
+
+
+
+
+
+=head1 NAME
+
+Memoize - Make functions faster by trading space for time
+
+=head1 SYNOPSIS
+
+        # This is the documentation for Memoize 1.01
+	use Memoize;
+	memoize('slow_function');
+	slow_function(arguments);    # Is faster than it was before
+
+
+This is normally all you need to know.  However, many options are available:
+
+	memoize(function, options...);
+
+Options include:
+
+	NORMALIZER => function
+	INSTALL => new_name
+
+	SCALAR_CACHE => 'MEMORY'
+        SCALAR_CACHE => ['HASH', \%cache_hash ]
+	SCALAR_CACHE => 'FAULT'
+	SCALAR_CACHE => 'MERGE'
+
+	LIST_CACHE => 'MEMORY'
+        LIST_CACHE => ['HASH', \%cache_hash ]
+	LIST_CACHE => 'FAULT'
+	LIST_CACHE => 'MERGE'
+
+=head1 DESCRIPTION
+
+`Memoizing' a function makes it faster by trading space for time.  It
+does this by caching the return values of the function in a table.
+If you call the function again with the same arguments, C<memoize>
+jumps in and gives you the value out of the table, instead of letting
+the function compute the value all over again.
+
+Here is an extreme example.  Consider the Fibonacci sequence, defined
+by the following function:
+
+	# Compute Fibonacci numbers
+	sub fib {
+	  my $n = shift;
+	  return $n if $n < 2;
+	  fib($n-1) + fib($n-2);
+	}
+
+This function is very slow.  Why?  To compute fib(14), it first wants
+to compute fib(13) and fib(12), and add the results.  But to compute
+fib(13), it first has to compute fib(12) and fib(11), and then it
+comes back and computes fib(12) all over again even though the answer
+is the same.  And both of the times that it wants to compute fib(12),
+it has to compute fib(11) from scratch, and then it has to do it
+again each time it wants to compute fib(13).  This function does so
+much recomputing of old results that it takes a really long time to
+run---fib(14) makes 1,200 extra recursive calls to itself, to compute
+and recompute things that it already computed.
+
+This function is a good candidate for memoization.  If you memoize the
+`fib' function above, it will compute fib(14) exactly once, the first
+time it needs to, and then save the result in a table.  Then if you
+ask for fib(14) again, it gives you the result out of the table.
+While computing fib(14), instead of computing fib(12) twice, it does
+it once; the second time it needs the value it gets it from the table.
+It doesn't compute fib(11) four times; it computes it once, getting it
+from the table the next three times.  Instead of making 1,200
+recursive calls to `fib', it makes 15.  This makes the function about
+150 times faster.
+
+You could do the memoization yourself, by rewriting the function, like
+this:
+
+	# Compute Fibonacci numbers, memoized version
+	{ my @fib;
+  	  sub fib {
+	    my $n = shift;
+	    return $fib[$n] if defined $fib[$n];
+	    return $fib[$n] = $n if $n < 2;
+	    $fib[$n] = fib($n-1) + fib($n-2);
+	  }
+        }
+
+Or you could use this module, like this:
+
+	use Memoize;
+	memoize('fib');
+
+	# Rest of the fib function just like the original version.
+
+This makes it easy to turn memoizing on and off.
+
+Here's an even simpler example: I wrote a simple ray tracer; the
+program would look in a certain direction, figure out what it was
+looking at, and then convert the `color' value (typically a string
+like `red') of that object to a red, green, and blue pixel value, like
+this:
+
+    for ($direction = 0; $direction < 300; $direction++) {
+      # Figure out which object is in direction $direction
+      $color = $object->{color};
+      ($r, $g, $b) = @{&ColorToRGB($color)};
+      ...
+    }
+
+Since there are relatively few objects in a picture, there are only a
+few colors, which get looked up over and over again.  Memoizing
+C<ColorToRGB> sped up the program by several percent.
+
+=head1 DETAILS
+
+This module exports exactly one function, C<memoize>.  The rest of the
+functions in this package are None of Your Business.
+
+You should say
+
+	memoize(function)
+
+where C<function> is the name of the function you want to memoize, or
+a reference to it.  C<memoize> returns a reference to the new,
+memoized version of the function, or C<undef> on a non-fatal error.
+At present, there are no non-fatal errors, but there might be some in
+the future.
+
+If C<function> was the name of a function, then C<memoize> hides the
+old version and installs the new memoized version under the old name,
+so that C<&function(...)> actually invokes the memoized version.
+
+=head1 OPTIONS
+
+There are some optional options you can pass to C<memoize> to change
+the way it behaves a little.  To supply options, invoke C<memoize>
+like this:
+
+	memoize(function, NORMALIZER => function,
+			  INSTALL => newname,
+                          SCALAR_CACHE => option,
+	                  LIST_CACHE => option
+			 );
+
+Each of these options is optional; you can include some, all, or none
+of them.
+
+=head2 INSTALL
+
+If you supply a function name with C<INSTALL>, memoize will install
+the new, memoized version of the function under the name you give.
+For example, 
+
+	memoize('fib', INSTALL => 'fastfib')
+
+installs the memoized version of C<fib> as C<fastfib>; without the
+C<INSTALL> option it would have replaced the old C<fib> with the
+memoized version.  
+
+To prevent C<memoize> from installing the memoized version anywhere, use
+C<INSTALL =E<gt> undef>.
+
+=head2 NORMALIZER
+
+Suppose your function looks like this:
+
+	# Typical call: f('aha!', A => 11, B => 12);
+	sub f {
+	  my $a = shift;
+	  my %hash = @_;
+	  $hash{B} ||= 2;  # B defaults to 2
+	  $hash{C} ||= 7;  # C defaults to 7
+
+	  # Do something with $a, %hash
+	}
+
+Now, the following calls to your function are all completely equivalent:
+
+	f(OUCH);
+	f(OUCH, B => 2);
+	f(OUCH, C => 7);
+	f(OUCH, B => 2, C => 7);
+	f(OUCH, C => 7, B => 2);
+	(etc.)
+
+However, unless you tell C<Memoize> that these calls are equivalent,
+it will not know that, and it will compute the values for these
+invocations of your function separately, and store them separately.
+
+To prevent this, supply a C<NORMALIZER> function that turns the
+program arguments into a string in a way that equivalent arguments
+turn into the same string.  A C<NORMALIZER> function for C<f> above
+might look like this:
+
+	sub normalize_f {
+	  my $a = shift;
+	  my %hash = @_;
+	  $hash{B} ||= 2;
+	  $hash{C} ||= 7;
+
+	  join(',', $a, map ($_ => $hash{$_}) sort keys %hash);
+	}
+
+Each of the argument lists above comes out of the C<normalize_f>
+function looking exactly the same, like this:
+
+	OUCH,B,2,C,7
+
+You would tell C<Memoize> to use this normalizer this way:
+
+	memoize('f', NORMALIZER => 'normalize_f');
+
+C<memoize> knows that if the normalized version of the arguments is
+the same for two argument lists, then it can safely look up the value
+that it computed for one argument list and return it as the result of
+calling the function with the other argument list, even if the
+argument lists look different.
+
+The default normalizer just concatenates the arguments with character
+28 in between.  (In ASCII, this is called FS or control-\.)  This
+always works correctly for functions with only one string argument,
+and also when the arguments never contain character 28.  However, it
+can confuse certain argument lists:
+
+	normalizer("a\034", "b")
+	normalizer("a", "\034b")
+	normalizer("a\034\034b")
+
+for example.
+
+Since hash keys are strings, the default normalizer will not
+distinguish between C<undef> and the empty string.  It also won't work
+when the function's arguments are references.  For example, consider a
+function C<g> which gets two arguments: A number, and a reference to
+an array of numbers:
+
+	g(13, [1,2,3,4,5,6,7]);
+
+The default normalizer will turn this into something like
+C<"13\034ARRAY(0x436c1f)">.  That would be all right, except that a
+subsequent array of numbers might be stored at a different location
+even though it contains the same data.  If this happens, C<Memoize>
+will think that the arguments are different, even though they are
+equivalent.  In this case, a normalizer like this is appropriate:
+
+	sub normalize { join ' ', $_[0], @{$_[1]} }
+
+For the example above, this produces the key "13 1 2 3 4 5 6 7".
+
+Another use for normalizers is when the function depends on data other
+than those in its arguments.  Suppose you have a function which
+returns a value which depends on the current hour of the day:
+
+	sub on_duty {
+          my ($problem_type) = @_;
+	  my $hour = (localtime)[2];
+          open my $fh, "$DIR/$problem_type" or die...;
+          my $line;
+          while ($hour-- > 0)
+            $line = <$fh>;
+          } 
+	  return $line;
+	}
+
+At 10:23, this function generates the 10th line of a data file; at
+3:45 PM it generates the 15th line instead.  By default, C<Memoize>
+will only see the $problem_type argument.  To fix this, include the
+current hour in the normalizer:
+
+        sub normalize { join ' ', (localtime)[2], @_ }
+
+The calling context of the function (scalar or list context) is
+propagated to the normalizer.  This means that if the memoized
+function will treat its arguments differently in list context than it
+would in scalar context, you can have the normalizer function select
+its behavior based on the results of C<wantarray>.  Even if called in
+a list context, a normalizer should still return a single string.
+
+=head2 C<SCALAR_CACHE>, C<LIST_CACHE>
+
+Normally, C<Memoize> caches your function's return values into an
+ordinary Perl hash variable.  However, you might like to have the
+values cached on the disk, so that they persist from one run of your
+program to the next, or you might like to associate some other
+interesting semantics with the cached values.
+
+There's a slight complication under the hood of C<Memoize>: There are
+actually I<two> caches, one for scalar values and one for list values.
+When your function is called in scalar context, its return value is
+cached in one hash, and when your function is called in list context,
+its value is cached in the other hash.  You can control the caching
+behavior of both contexts independently with these options.
+
+The argument to C<LIST_CACHE> or C<SCALAR_CACHE> must either be one of
+the following four strings:
+
+	MEMORY
+	FAULT
+	MERGE
+        HASH
+
+or else it must be a reference to a list whose first element is one of
+these four strings, such as C<[HASH, arguments...]>.
+
+=over 4
+
+=item C<MEMORY>
+
+C<MEMORY> means that return values from the function will be cached in
+an ordinary Perl hash variable.  The hash variable will not persist
+after the program exits.  This is the default.
+
+=item C<HASH>
+
+C<HASH> allows you to specify that a particular hash that you supply
+will be used as the cache.  You can tie this hash beforehand to give
+it any behavior you want.
+
+A tied hash can have any semantics at all.  It is typically tied to an
+on-disk database, so that cached values are stored in the database and
+retrieved from it again when needed, and the disk file typically
+persists after your program has exited.  See C<perltie> for more
+complete details about C<tie>.
+
+A typical example is:
+
+        use DB_File;
+        tie my %cache => 'DB_File', $filename, O_RDWR|O_CREAT, 0666;
+        memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+This has the effect of storing the cache in a C<DB_File> database
+whose name is in C<$filename>.  The cache will persist after the
+program has exited.  Next time the program runs, it will find the
+cache already populated from the previous run of the program.  Or you
+can forcibly populate the cache by constructing a batch program that
+runs in the background and populates the cache file.  Then when you
+come to run your real program the memoized function will be fast
+because all its results have been precomputed.
+
+=item C<TIE>
+
+This option is no longer supported.  It is still documented only to
+aid in the debugging of old programs that use it.  Old programs should
+be converted to use the C<HASH> option instead.
+
+        memoize ... [TIE, PACKAGE, ARGS...]
+
+is merely a shortcut for
+
+        require PACKAGE;
+	{ my %cache;
+          tie %cache, PACKAGE, ARGS...;
+	}
+        memoize ... [HASH => \%cache];
+
+=item C<FAULT>
+
+C<FAULT> means that you never expect to call the function in scalar
+(or list) context, and that if C<Memoize> detects such a call, it
+should abort the program.  The error message is one of
+
+	`foo' function called in forbidden list context at line ...
+	`foo' function called in forbidden scalar context at line ...
+
+=item C<MERGE>
+
+C<MERGE> normally means the function does not distinguish between list
+and sclar context, and that return values in both contexts should be
+stored together.  C<LIST_CACHE =E<gt> MERGE> means that list context
+return values should be stored in the same hash that is used for
+scalar context returns, and C<SCALAR_CACHE =E<gt> MERGE> means the
+same, mutatis mutandis.  It is an error to specify C<MERGE> for both,
+but it probably does something useful.
+
+Consider this function:
+
+	sub pi { 3; }
+
+Normally, the following code will result in two calls to C<pi>:
+
+    $x = pi();
+    ($y) = pi();
+    $z = pi();
+
+The first call caches the value C<3> in the scalar cache; the second
+caches the list C<(3)> in the list cache.  The third call doesn't call
+the real C<pi> function; it gets the value from the scalar cache.
+
+Obviously, the second call to C<pi> is a waste of time, and storing
+its return value is a waste of space.  Specifying C<LIST_CACHE =E<gt>
+MERGE> will make C<memoize> use the same cache for scalar and list
+context return values, so that the second call uses the scalar cache
+that was populated by the first call.  C<pi> ends up being called only
+once, and both subsequent calls return C<3> from the cache, regardless
+of the calling context.
+
+Another use for C<MERGE> is when you want both kinds of return values
+stored in the same disk file; this saves you from having to deal with
+two disk files instead of one.  You can use a normalizer function to
+keep the two sets of return values separate.  For example:
+
+        tie my %cache => 'MLDBM', 'DB_File', $filename, ...;
+
+	memoize 'myfunc',
+	  NORMALIZER => 'n',
+	  SCALAR_CACHE => [HASH => \%cache],
+	  LIST_CACHE => MERGE,
+	;
+
+	sub n {
+	  my $context = wantarray() ? 'L' : 'S';
+	  # ... now compute the hash key from the arguments ...
+	  $hashkey = "$context:$hashkey";
+	}
+
+This normalizer function will store scalar context return values in
+the disk file under keys that begin with C<S:>, and list context
+return values under keys that begin with C<L:>.
+
+=back
+
+=head1 OTHER FACILITIES
+
+=head2 C<unmemoize>
+
+There's an C<unmemoize> function that you can import if you want to.
+Why would you want to?  Here's an example: Suppose you have your cache
+tied to a DBM file, and you want to make sure that the cache is
+written out to disk if someone interrupts the program.  If the program
+exits normally, this will happen anyway, but if someone types
+control-C or something then the program will terminate immediately
+without synchronizing the database.  So what you can do instead is
+
+    $SIG{INT} = sub { unmemoize 'function' };
+
+C<unmemoize> accepts a reference to, or the name of a previously
+memoized function, and undoes whatever it did to provide the memoized
+version in the first place, including making the name refer to the
+unmemoized version if appropriate.  It returns a reference to the
+unmemoized version of the function.
+
+If you ask it to unmemoize a function that was never memoized, it
+croaks.
+
+=head2 C<flush_cache>
+
+C<flush_cache(function)> will flush out the caches, discarding I<all>
+the cached data.  The argument may be a function name or a reference
+to a function.  For finer control over when data is discarded or
+expired, see the documentation for C<Memoize::Expire>, included in
+this package.
+
+Note that if the cache is a tied hash, C<flush_cache> will attempt to
+invoke the C<CLEAR> method on the hash.  If there is no C<CLEAR>
+method, this will cause a run-time error.
+
+An alternative approach to cache flushing is to use the C<HASH> option
+(see above) to request that C<Memoize> use a particular hash variable
+as its cache.  Then you can examine or modify the hash at any time in
+any way you desire.  You may flush the cache by using C<%hash = ()>. 
+
+=head1 CAVEATS
+
+Memoization is not a cure-all:
+
+=over 4
+
+=item *
+
+Do not memoize a function whose behavior depends on program
+state other than its own arguments, such as global variables, the time
+of day, or file input.  These functions will not produce correct
+results when memoized.  For a particularly easy example:
+
+	sub f {
+	  time;
+	}
+
+This function takes no arguments, and as far as C<Memoize> is
+concerned, it always returns the same result.  C<Memoize> is wrong, of
+course, and the memoized version of this function will call C<time> once
+to get the current time, and it will return that same time
+every time you call it after that.
+
+=item *
+
+Do not memoize a function with side effects.
+
+	sub f {
+	  my ($a, $b) = @_;
+          my $s = $a + $b;
+	  print "$a + $b = $s.\n";
+	}
+
+This function accepts two arguments, adds them, and prints their sum.
+Its return value is the numuber of characters it printed, but you
+probably didn't care about that.  But C<Memoize> doesn't understand
+that.  If you memoize this function, you will get the result you
+expect the first time you ask it to print the sum of 2 and 3, but
+subsequent calls will return 1 (the return value of
+C<print>) without actually printing anything.
+
+=item *
+
+Do not memoize a function that returns a data structure that is
+modified by its caller.
+
+Consider these functions:  C<getusers> returns a list of users somehow,
+and then C<main> throws away the first user on the list and prints the
+rest:
+
+	sub main {
+	  my $userlist = getusers();
+	  shift @$userlist;
+	  foreach $u (@$userlist) {
+	    print "User $u\n";
+	  }
+	}
+
+	sub getusers {
+	  my @users;
+	  # Do something to get a list of users;
+	  \@users;  # Return reference to list.
+	}
+
+If you memoize C<getusers> here, it will work right exactly once.  The
+reference to the users list will be stored in the memo table.  C<main>
+will discard the first element from the referenced list.  The next
+time you invoke C<main>, C<Memoize> will not call C<getusers>; it will
+just return the same reference to the same list it got last time.  But
+this time the list has already had its head removed; C<main> will
+erroneously remove another element from it.  The list will get shorter
+and shorter every time you call C<main>.
+
+Similarly, this:
+
+	$u1 = getusers();    
+	$u2 = getusers();    
+	pop @$u1;
+
+will modify $u2 as well as $u1, because both variables are references
+to the same array.  Had C<getusers> not been memoized, $u1 and $u2
+would have referred to different arrays.
+
+=item * 
+
+Do not memoize a very simple function.
+
+Recently someone mentioned to me that the Memoize module made his
+program run slower instead of faster.  It turned out that he was
+memoizing the following function:
+
+    sub square {
+      $_[0] * $_[0];
+    }
+
+I pointed out that C<Memoize> uses a hash, and that looking up a
+number in the hash is necessarily going to take a lot longer than a
+single multiplication.  There really is no way to speed up the
+C<square> function.
+
+Memoization is not magical.
+
+=back
+
+=head1 PERSISTENT CACHE SUPPORT
+
+You can tie the cache tables to any sort of tied hash that you want
+to, as long as it supports C<TIEHASH>, C<FETCH>, C<STORE>, and
+C<EXISTS>.  For example,
+
+        tie my %cache => 'GDBM_File', $filename, O_RDWR|O_CREAT, 0666;
+        memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+works just fine.  For some storage methods, you need a little glue.
+
+C<SDBM_File> doesn't supply an C<EXISTS> method, so included in this
+package is a glue module called C<Memoize::SDBM_File> which does
+provide one.  Use this instead of plain C<SDBM_File> to store your
+cache table on disk in an C<SDBM_File> database:
+
+        tie my %cache => 'Memoize::SDBM_File', $filename, O_RDWR|O_CREAT, 0666;
+        memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+C<NDBM_File> has the same problem and the same solution.  (Use
+C<Memoize::NDBM_File instead of plain NDBM_File.>)
+
+C<Storable> isn't a tied hash class at all.  You can use it to store a
+hash to disk and retrieve it again, but you can't modify the hash while
+it's on the disk.  So if you want to store your cache table in a
+C<Storable> database, use C<Memoize::Storable>, which puts a hashlike
+front-end onto C<Storable>.  The hash table is actually kept in
+memory, and is loaded from your C<Storable> file at the time you
+memoize the function, and stored back at the time you unmemoize the
+function (or when your program exits):
+
+        tie my %cache => 'Memoize::Storable', $filename;
+	memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+        tie my %cache => 'Memoize::Storable', $filename, 'nstore';
+	memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+Include the `nstore' option to have the C<Storable> database written
+in `network order'.  (See L<Storable> for more details about this.)
+
+The C<flush_cache()> function will raise a run-time error unless the
+tied package provides a C<CLEAR> method.
+
+=head1 EXPIRATION SUPPORT
+
+See Memoize::Expire, which is a plug-in module that adds expiration
+functionality to Memoize.  If you don't like the kinds of policies
+that Memoize::Expire implements, it is easy to write your own plug-in
+module to implement whatever policy you desire.  Memoize comes with
+several examples.  An expiration manager that implements a LRU policy
+is available on CPAN as Memoize::ExpireLRU.
+
+=head1 BUGS
+
+The test suite is much better, but always needs improvement.
+
+There is some problem with the way C<goto &f> works under threaded
+Perl, perhaps because of the lexical scoping of C<@_>.  This is a bug
+in Perl, and until it is resolved, memoized functions will see a
+slightly different C<caller()> and will perform a little more slowly
+on threaded perls than unthreaded perls.
+
+Some versions of C<DB_File> won't let you store data under a key of
+length 0.  That means that if you have a function C<f> which you
+memoized and the cache is in a C<DB_File> database, then the value of
+C<f()> (C<f> called with no arguments) will not be memoized.  If this
+is a big problem, you can supply a normalizer function that prepends
+C<"x"> to every key.
+
+=head1 MAILING LIST
+
+To join a very low-traffic mailing list for announcements about
+C<Memoize>, send an empty note to C<mjd-perl-memoize-request@plover.com>.
+
+=head1 AUTHOR
+
+Mark-Jason Dominus (C<mjd-perl-memoize+@plover.com>), Plover Systems co.
+
+See the C<Memoize.pm> Page at http://www.plover.com/~mjd/perl/Memoize/
+for news and upgrades.  Near this page, at
+http://www.plover.com/~mjd/perl/MiniMemoize/ there is an article about
+memoization and about the internals of Memoize that appeared in The
+Perl Journal, issue #13.  (This article is also included in the
+Memoize distribution as `article.html'.)
+
+My upcoming book will discuss memoization (and many other fascinating
+topics) in tremendous detail.  It will be published by Morgan Kaufmann
+in 2002, possibly under the title I<Perl Advanced Techniques
+Handbook>.  It will also be available on-line for free.  For more
+information, visit http://perl.plover.com/book/ .
+
+To join a mailing list for announcements about C<Memoize>, send an
+empty message to C<mjd-perl-memoize-request@plover.com>.  This mailing
+list is for announcements only and has extremely low traffic---about
+two messages per year.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1998, 1999, 2000, 2001  by Mark Jason Dominus
+
+This library is free software; you may redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 THANK YOU
+
+Many thanks to Jonathan Roy for bug reports and suggestions, to
+Michael Schwern for other bug reports and patches, to Mike Cariaso for
+helping me to figure out the Right Thing to Do About Expiration, to
+Joshua Gerth, Joshua Chamas, Jonathan Roy (again), Mark D. Anderson,
+and Andrew Johnson for more suggestions about expiration, to Brent
+Powers for the Memoize::ExpireLRU module, to Ariel Scolnicov for
+delightful messages about the Fibonacci function, to Dion Almaer for
+thought-provoking suggestions about the default normalizer, to Walt
+Mankowski and Kurt Starsinic for much help investigating problems
+under threaded Perl, to Alex Dudkevich for reporting the bug in
+prototyped functions and for checking my patch, to Tony Bass for many
+helpful suggestions, to Jonathan Roy (again) for finding a use for
+C<unmemoize()>, to Philippe Verdret for enlightening discussion of
+C<Hook::PrePostCall>, to Nat Torkington for advice I ignored, to Chris
+Nandor for portability advice, to Randal Schwartz for suggesting the
+'C<flush_cache> function, and to Jenda Krynicky for being a light in
+the world.
+
+Special thanks to Jarkko Hietaniemi, the 5.8.0 pumpking, for including
+this module in the core and for his patient and helpful guidance
+during the integration process.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Memoize/AnyDBM_File.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Memoize/AnyDBM_File.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Memoize/AnyDBM_File.pm	(revision 14489)
@@ -0,0 +1,31 @@
+package Memoize::AnyDBM_File;
+
+=head1 NAME
+
+Memoize::AnyDBM_File - glue to provide EXISTS for AnyDBM_File for Storable use
+
+=head1 DESCRIPTION
+
+See L<Memoize>.
+
+=cut
+
+use vars qw(@ISA $VERSION);
+$VERSION = 0.65;
+@ISA = qw(DB_File GDBM_File Memoize::NDBM_File Memoize::SDBM_File ODBM_File) unless @ISA;
+
+my $verbose = 1;
+
+my $mod;
+for $mod (@ISA) {
+#  (my $truemod = $mod) =~ s/^Memoize:://;
+#  my $file = "$mod.pm";
+#  $file =~ s{::}{/}g;
+  if (eval "require $mod") {
+    print STDERR "AnyDBM_File => Selected $mod.\n" if $Verbose;
+    @ISA = ($mod);	# if we leave @ISA alone, warnings abound
+    return 1;
+  }
+}
+
+die "No DBM package was successfully found or installed";
Index: /for-distributions/trunk/bin/windows/perl/lib/Memoize/Expire.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Memoize/Expire.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Memoize/Expire.pm	(revision 14489)
@@ -0,0 +1,365 @@
+
+package Memoize::Expire;
+# require 5.00556;
+use Carp;
+$DEBUG = 0;
+$VERSION = '1.00';
+
+# This package will implement expiration by prepending a fixed-length header
+# to the font of the cached data.  The format of the header will be:
+# (4-byte number of last-access-time)  (For LRU when I implement it)
+# (4-byte expiration time: unsigned seconds-since-unix-epoch)
+# (2-byte number-of-uses-before-expire)
+
+sub _header_fmt () { "N N n" }
+sub _header_size () { length(_header_fmt) }
+
+# Usage:  memoize func 
+#         TIE => [Memoize::Expire, LIFETIME => sec, NUM_USES => n,
+#                 TIE => [...] ]
+
+BEGIN {
+  eval {require Time::HiRes};
+  unless ($@) {
+    Time::HiRes->import('time');
+  }
+}
+
+sub TIEHASH {
+  my ($package, %args) = @_;
+  my %cache;
+  if ($args{TIE}) {
+    my ($module, @opts) = @{$args{TIE}};
+    my $modulefile = $module . '.pm';
+    $modulefile =~ s{::}{/}g;
+    eval { require $modulefile };
+    if ($@) {
+      croak "Memoize::Expire: Couldn't load hash tie module `$module': $@; aborting";
+    }
+    my $rc = (tie %cache => $module, @opts);
+    unless ($rc) {
+      croak "Memoize::Expire: Couldn't tie hash to `$module': $@; aborting";
+    }
+  }
+  $args{LIFETIME} ||= 0;
+  $args{NUM_USES} ||= 0;
+  $args{C} = \%cache;
+  bless \%args => $package;
+}
+
+sub STORE {
+  $DEBUG and print STDERR " >> Store $_[1] $_[2]\n";
+  my ($self, $key, $value) = @_;
+  my $expire_time = $self->{LIFETIME} > 0 ? $self->{LIFETIME} + time : 0;
+  # The call that results in a value to store into the cache is the
+  # first of the NUM_USES allowed calls.
+  my $header = _make_header(time, $expire_time, $self->{NUM_USES}-1);
+  $self->{C}{$key} = $header . $value;
+  $value;
+}
+
+sub FETCH {
+  $DEBUG and print STDERR " >> Fetch cached value for $_[1]\n";
+  my ($data, $last_access, $expire_time, $num_uses_left) = _get_item($_[0]{C}{$_[1]});
+  $DEBUG and print STDERR " >>   (ttl: ", ($expire_time-time()), ", nuses: $num_uses_left)\n";
+  $num_uses_left--;
+  $last_access = time;
+  _set_header(@_, $data, $last_access, $expire_time, $num_uses_left);
+  $data;
+}
+
+sub EXISTS {
+  $DEBUG and print STDERR " >> Exists $_[1]\n";
+  unless (exists $_[0]{C}{$_[1]}) {
+    $DEBUG and print STDERR "    Not in underlying hash at all.\n";
+    return 0;
+  }
+  my $item = $_[0]{C}{$_[1]};
+  my ($last_access, $expire_time, $num_uses_left) = _get_header($item);
+  my $ttl = $expire_time - time;
+  if ($DEBUG) {
+    $_[0]{LIFETIME} and print STDERR "    Time to live for this item: $ttl\n";
+    $_[0]{NUM_USES} and print STDERR "    Uses remaining: $num_uses_left\n";
+  }
+  if (   (! $_[0]{LIFETIME} || $expire_time > time)
+      && (! $_[0]{NUM_USES} || $num_uses_left > 0 )) {
+	    $DEBUG and print STDERR "    (Still good)\n";
+    return 1;
+  } else {
+    $DEBUG and print STDERR "    (Expired)\n";
+    return 0;
+  }
+}
+
+# Arguments: last access time, expire time, number of uses remaining
+sub _make_header {
+  pack "N N n", @_;
+}
+
+sub _strip_header {
+  substr($_[0], 10);
+}
+
+# Arguments: last access time, expire time, number of uses remaining
+sub _set_header {
+  my ($self, $key, $data, @header) = @_;
+  $self->{C}{$key} = _make_header(@header) . $data;
+}
+
+sub _get_item {
+  my $data = substr($_[0], 10);
+  my @header = unpack "N N n", substr($_[0], 0, 10);
+#  print STDERR " >> _get_item: $data => $data @header\n";
+  ($data, @header);
+}
+
+# Return last access time, expire time, number of uses remaining
+sub _get_header  {
+  unpack "N N n", substr($_[0], 0, 10);
+}
+
+1;
+
+=head1 NAME 
+
+Memoize::Expire - Plug-in module for automatic expiration of memoized values
+
+=head1 SYNOPSIS
+
+  use Memoize;
+  use Memoize::Expire;
+  tie my %cache => 'Memoize::Expire',
+	  	     LIFETIME => $lifetime,    # In seconds
+		     NUM_USES => $n_uses;
+
+  memoize 'function', SCALAR_CACHE => [HASH => \%cache ];
+
+=head1 DESCRIPTION
+
+Memoize::Expire is a plug-in module for Memoize.  It allows the cached
+values for memoized functions to expire automatically.  This manual
+assumes you are already familiar with the Memoize module.  If not, you
+should study that manual carefully first, paying particular attention
+to the HASH feature.
+
+Memoize::Expire is a layer of software that you can insert in between
+Memoize itself and whatever underlying package implements the cache.
+The layer presents a hash variable whose values expire whenever they
+get too old, have been used too often, or both. You tell C<Memoize> to
+use this forgetful hash as its cache instead of the default, which is
+an ordinary hash.
+
+To specify a real-time timeout, supply the C<LIFETIME> option with a
+numeric value.  Cached data will expire after this many seconds, and
+will be looked up afresh when it expires.  When a data item is looked
+up afresh, its lifetime is reset.
+
+If you specify C<NUM_USES> with an argument of I<n>, then each cached
+data item will be discarded and looked up afresh after the I<n>th time
+you access it.  When a data item is looked up afresh, its number of
+uses is reset.
+
+If you specify both arguments, data will be discarded from the cache
+when either expiration condition holds.
+
+Memoize::Expire uses a real hash internally to store the cached data.
+You can use the C<HASH> option to Memoize::Expire to supply a tied
+hash in place of the ordinary hash that Memoize::Expire will normally
+use.  You can use this feature to add Memoize::Expire as a layer in
+between a persistent disk hash and Memoize.  If you do this, you get a
+persistent disk cache whose entries expire automatically.  For
+example:
+
+  #   Memoize
+  #      |
+  #   Memoize::Expire  enforces data expiration policy
+  #      |
+  #   DB_File  implements persistence of data in a disk file
+  #      |
+  #   Disk file
+
+  use Memoize;
+  use Memoize::Expire;
+  use DB_File;
+
+  # Set up persistence
+  tie my %disk_cache => 'DB_File', $filename, O_CREAT|O_RDWR, 0666];
+
+  # Set up expiration policy, supplying persistent hash as a target
+  tie my %cache => 'Memoize::Expire', 
+	  	     LIFETIME => $lifetime,    # In seconds
+		     NUM_USES => $n_uses,
+                     HASH => \%disk_cache; 
+
+  # Set up memoization, supplying expiring persistent hash for cache
+  memoize 'function', SCALAR_CACHE => [ HASH => \%cache ];
+
+=head1 INTERFACE
+
+There is nothing special about Memoize::Expire.  It is just an
+example.  If you don't like the policy that it implements, you are
+free to write your own expiration policy module that implements
+whatever policy you desire.  Here is how to do that.  Let us suppose
+that your module will be named MyExpirePolicy.
+
+Short summary: You need to create a package that defines four methods:
+
+=over 4
+
+=item 
+TIEHASH
+
+Construct and return cache object.
+
+=item 
+EXISTS
+
+Given a function argument, is the corresponding function value in the
+cache, and if so, is it fresh enough to use?
+
+=item
+FETCH
+
+Given a function argument, look up the corresponding function value in
+the cache and return it.
+
+=item 
+STORE
+
+Given a function argument and the corresponding function value, store
+them into the cache.
+
+=item
+CLEAR
+
+(Optional.)  Flush the cache completely.
+
+=back
+
+The user who wants the memoization cache to be expired according to
+your policy will say so by writing
+
+  tie my %cache => 'MyExpirePolicy', args...;
+  memoize 'function', SCALAR_CACHE => [HASH => \%cache];
+
+This will invoke C<< MyExpirePolicy->TIEHASH(args) >>.
+MyExpirePolicy::TIEHASH should do whatever is appropriate to set up
+the cache, and it should return the cache object to the caller.
+
+For example, MyExpirePolicy::TIEHASH might create an object that
+contains a regular Perl hash (which it will to store the cached
+values) and some extra information about the arguments and how old the
+data is and things like that.  Let us call this object `C'.
+
+When Memoize needs to check to see if an entry is in the cache
+already, it will invoke C<< C->EXISTS(key) >>.  C<key> is the normalized
+function argument.  MyExpirePolicy::EXISTS should return 0 if the key
+is not in the cache, or if it has expired, and 1 if an unexpired value
+is in the cache.  It should I<not> return C<undef>, because there is a
+bug in some versions of Perl that will cause a spurious FETCH if the
+EXISTS method returns C<undef>.
+
+If your EXISTS function returns true, Memoize will try to fetch the
+cached value by invoking C<< C->FETCH(key) >>.  MyExpirePolicy::FETCH should
+return the cached value.  Otherwise, Memoize will call the memoized
+function to compute the appropriate value, and will store it into the
+cache by calling C<< C->STORE(key, value) >>.
+
+Here is a very brief example of a policy module that expires each
+cache item after ten seconds.
+
+	package Memoize::TenSecondExpire;
+
+	sub TIEHASH {
+	  my ($package, %args) = @_;
+          my $cache = $args{HASH} || {};
+	  bless $cache => $package;
+	}
+
+	sub EXISTS {
+	  my ($cache, $key) = @_;
+	  if (exists $cache->{$key} && 
+              $cache->{$key}{EXPIRE_TIME} > time) {
+	    return 1
+	  } else {
+	    return 0;  # Do NOT return `undef' here.
+	  }
+	}
+
+	sub FETCH {
+	  my ($cache, $key) = @_;
+	  return $cache->{$key}{VALUE};
+	}
+
+	sub STORE {
+	  my ($cache, $key, $newvalue) = @_;
+	  $cache->{$key}{VALUE} = $newvalue;
+	  $cache->{$key}{EXPIRE_TIME} = time + 10;
+	}
+
+To use this expiration policy, the user would say
+
+	use Memoize;
+        tie my %cache10sec => 'Memoize::TenSecondExpire';
+	memoize 'function', SCALAR_CACHE => [HASH => \%cache10sec];
+
+Memoize would then call C<function> whenever a cached value was
+entirely absent or was older than ten seconds.
+
+You should always support a C<HASH> argument to C<TIEHASH> that ties
+the underlying cache so that the user can specify that the cache is
+also persistent or that it has some other interesting semantics.  The
+example above demonstrates how to do this, as does C<Memoize::Expire>.
+
+=head1 ALTERNATIVES
+
+Brent Powers has a C<Memoize::ExpireLRU> module that was designed to
+work with Memoize and provides expiration of least-recently-used data.
+The cache is held at a fixed number of entries, and when new data
+comes in, the least-recently used data is expired.  See
+L<http://search.cpan.org/search?mode=module&query=ExpireLRU>.
+
+Joshua Chamas's Tie::Cache module may be useful as an expiration
+manager.  (If you try this, let me know how it works out.)
+
+If you develop any useful expiration managers that you think should be
+distributed with Memoize, please let me know.
+
+=head1 CAVEATS
+
+This module is experimental, and may contain bugs.  Please report bugs
+to the address below.
+
+Number-of-uses is stored as a 16-bit unsigned integer, so can't exceed
+65535.
+
+Because of clock granularity, expiration times may occur up to one
+second sooner than you expect.  For example, suppose you store a value
+with a lifetime of ten seconds, and you store it at 12:00:00.998 on a
+certain day.  Memoize will look at the clock and see 12:00:00.  Then
+9.01 seconds later, at 12:00:10.008 you try to read it back.  Memoize
+will look at the clock and see 12:00:10 and conclude that the value
+has expired.  This will probably not occur if you have
+C<Time::HiRes> installed.
+
+=head1 AUTHOR
+
+Mark-Jason Dominus (mjd-perl-memoize+@plover.com)
+
+Mike Cariaso provided valuable insight into the best way to solve this
+problem.
+
+=head1 SEE ALSO
+
+perl(1)
+
+The Memoize man page.
+
+http://www.plover.com/~mjd/perl/Memoize/  (for news and updates)
+
+I maintain a mailing list on which I occasionally announce new
+versions of Memoize.  The list is for announcements only, not
+discussion.  To join, send an empty message to
+mjd-perl-memoize-request@Plover.com.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Memoize/ExpireFile.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Memoize/ExpireFile.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Memoize/ExpireFile.pm	(revision 14489)
@@ -0,0 +1,52 @@
+package Memoize::ExpireFile;
+
+=head1 NAME
+
+Memoize::ExpireFile - test for Memoize expiration semantics
+
+=head1 DESCRIPTION
+
+See L<Memoize::Expire>.
+
+=cut
+
+$VERSION = 1.01;
+use Carp;
+
+my $Zero = pack("N", 0);
+
+sub TIEHASH {
+  my ($package, %args) = @_;
+  my $cache = $args{HASH} || {};
+  bless {ARGS => \%args, C => $cache} => $package;
+}
+
+
+sub STORE {
+#  print "Expiry manager STORE handler\n";
+  my ($self, $key, $data) = @_;
+  my $cache = $self->{C};
+  my $cur_date = pack("N", (stat($key))[9]);
+  $cache->{"C$key"} = $data;
+  $cache->{"T$key"} = $cur_date;
+}
+
+sub FETCH {
+  my ($self, $key) = @_;
+  $self->{C}{"C$key"};
+}
+
+sub EXISTS {
+#  print "Expiry manager EXISTS handler\n";
+  my ($self, $key) = @_;
+  my $cache_date = $self->{C}{"T$key"} || $Zero;
+  my $file_date = pack("N", (stat($key))[9]);#
+#  if ($self->{ARGS}{CHECK_DATE} && $old_date gt $cur_date) {
+#    return $self->{ARGS}{CHECK_DATE}->($key, $old_date, $cur_date);
+#  } 
+  my $res = $cache_date ge $file_date;
+#  print $res ? "... still good\n" : "... expired\n";
+  $res;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Memoize/ExpireTest.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Memoize/ExpireTest.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Memoize/ExpireTest.pm	(revision 14489)
@@ -0,0 +1,49 @@
+package Memoize::ExpireTest;
+
+=head1 NAME
+
+Memoize::ExpireTest - test for Memoize expiration semantics
+
+=head1 DESCRIPTION
+
+This module is just for testing expiration semantics.  It's not a very
+good example of how to write an expiration module.
+
+If you are looking for an example, I recommend that you look at the
+simple example in the Memoize::Expire documentation, or at the code
+for Memoize::Expire itself.
+
+If you have questions, I will be happy to answer them if you send them
+to mjd-perl-memoize+@plover.com.
+
+=cut
+
+$VERSION = 0.65;
+my %cache;
+
+sub TIEHASH {	
+  my ($pack) = @_;
+  bless \%cache => $pack;
+}
+
+sub EXISTS {
+  my ($cache, $key) = @_;
+  exists $cache->{$key} ? 1 : 0;
+}
+
+sub FETCH {
+  my ($cache, $key) = @_;
+  $cache->{$key};
+}
+
+sub STORE {
+  my ($cache, $key, $val) = @_;
+  $cache->{$key} = $val;
+}
+
+sub expire {
+  my ($key) = @_;
+  delete $cache{$key};
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Memoize/NDBM_File.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Memoize/NDBM_File.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Memoize/NDBM_File.pm	(revision 14489)
@@ -0,0 +1,77 @@
+package Memoize::NDBM_File;
+
+=head1 NAME
+
+Memoize::NDBM_File - glue to provide EXISTS for NDBM_File for Storable use
+
+=head1 DESCRIPTION
+
+See L<Memoize>.
+
+=cut
+
+use NDBM_File;
+@ISA = qw(NDBM_File);
+$VERSION = 0.65;
+
+$Verbose = 0;
+
+sub AUTOLOAD {
+  warn "Nonexistent function $AUTOLOAD invoked in Memoize::NDBM_File\n";
+}
+
+sub import {
+  warn "Importing Memoize::NDBM_File\n" if $Verbose;
+}
+
+
+my %keylist;
+
+# This is so ridiculous...
+sub _backhash {
+  my $self = shift;
+  my %fakehash;
+  my $k; 
+  for ($k = $self->FIRSTKEY(); defined $k; $k = $self->NEXTKEY($k)) {
+    $fakehash{$k} = undef;
+  }
+  $keylist{$self} = \%fakehash;
+}
+
+sub EXISTS {
+  warn "Memoize::NDBM_File EXISTS (@_)\n" if $Verbose;
+  my $self = shift;
+  _backhash($self)  unless exists $keylist{$self};
+  my $r = exists $keylist{$self}{$_[0]};
+  warn "Memoize::NDBM_File EXISTS (@_) ==> $r\n" if $Verbose;
+  $r;
+}
+
+sub DEFINED {
+  warn "Memoize::NDBM_File DEFINED (@_)\n" if $Verbose;
+  my $self = shift;
+  _backhash($self)  unless exists $keylist{$self};
+  defined $keylist{$self}{$_[0]};
+}
+
+sub DESTROY {
+  warn "Memoize::NDBM_File DESTROY (@_)\n" if $Verbose;
+  my $self = shift;
+  delete $keylist{$self};   # So much for reference counting...
+  $self->SUPER::DESTROY(@_);
+}
+
+# Maybe establish the keylist at TIEHASH time instead?
+
+sub STORE {
+  warn "Memoize::NDBM_File STORE (@_)\n" if $VERBOSE;
+  my $self = shift;
+  $keylist{$self}{$_[0]} = undef;
+  $self->SUPER::STORE(@_);
+}
+
+
+
+# Inherit FETCH and TIEHASH
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Memoize/SDBM_File.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Memoize/SDBM_File.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Memoize/SDBM_File.pm	(revision 14489)
@@ -0,0 +1,75 @@
+package Memoize::SDBM_File;
+
+=head1 NAME
+
+Memoize::SDBM_File - glue to provide EXISTS for SDBM_File for Storable use
+
+=head1 DESCRIPTION
+
+See L<Memoize>.
+
+=cut
+
+use SDBM_File;
+@ISA = qw(SDBM_File);
+$VERSION = 0.65;
+
+$Verbose = 0;
+
+sub AUTOLOAD {
+  warn "Nonexistent function $AUTOLOAD invoked in Memoize::SDBM_File\n";
+}
+
+sub import {
+  warn "Importing Memoize::SDBM_File\n" if $Verbose;
+}
+
+
+my %keylist;
+
+# This is so ridiculous...
+sub _backhash {
+  my $self = shift;
+  my %fakehash;
+  my $k; 
+  for ($k = $self->FIRSTKEY(); defined $k; $k = $self->NEXTKEY($k)) {
+    $fakehash{$k} = undef;
+  }
+  $keylist{$self} = \%fakehash;
+}
+
+sub EXISTS {
+  warn "Memoize::SDBM_File EXISTS (@_)\n" if $Verbose;
+  my $self = shift;
+  _backhash($self)  unless exists $keylist{$self};
+  my $r = exists $keylist{$self}{$_[0]};
+  warn "Memoize::SDBM_File EXISTS (@_) ==> $r\n" if $Verbose;
+  $r;
+}
+
+sub DEFINED {
+  warn "Memoize::SDBM_File DEFINED (@_)\n" if $Verbose;
+  my $self = shift;
+  _backhash($self)  unless exists $keylist{$self};
+  defined $keylist{$self}{$_[0]};
+}
+
+sub DESTROY {
+  warn "Memoize::SDBM_File DESTROY (@_)\n" if $Verbose;
+  my $self = shift;
+  delete $keylist{$self};   # So much for reference counting...
+  $self->SUPER::DESTROY(@_);
+}
+
+# Maybe establish the keylist at TIEHASH time instead?
+
+sub STORE {
+  warn "Memoize::SDBM_File STORE (@_)\n" if $VERBOSE;
+  my $self = shift;
+  $keylist{$self}{$_[0]} = undef;
+  $self->SUPER::STORE(@_);
+}
+
+# Inherit FETCH and TIEHASH
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Memoize/Storable.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Memoize/Storable.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Memoize/Storable.pm	(revision 14489)
@@ -0,0 +1,72 @@
+package Memoize::Storable;
+
+=head1 NAME
+
+Memoize::Storable - store Memoized data in Storable database
+
+=head1 DESCRIPTION
+
+See L<Memoize>.
+
+=cut
+
+use Storable ();
+$VERSION = 0.65;
+$Verbose = 0;
+
+sub TIEHASH {
+  require Carp if $Verbose;
+  my $package = shift;
+  my $filename = shift;
+  my $truehash = (-e $filename) ? Storable::retrieve($filename) : {};
+  my %options;
+  print STDERR "Memoize::Storable::TIEHASH($filename, @_)\n" if $Verbose;
+  @options{@_} = ();
+  my $self = 
+    {FILENAME => $filename, 
+     H => $truehash, 
+     OPTIONS => \%options
+    };
+  bless $self => $package;
+}
+
+sub STORE {
+  require Carp if $Verbose;
+  my $self = shift;
+  print STDERR "Memoize::Storable::STORE(@_)\n" if $Verbose;
+  $self->{H}{$_[0]} = $_[1];
+}
+
+sub FETCH {
+  require Carp if $Verbose;
+  my $self = shift;
+  print STDERR "Memoize::Storable::FETCH(@_)\n" if $Verbose;
+  $self->{H}{$_[0]};
+}
+
+sub EXISTS {
+  require Carp if $Verbose;
+  my $self = shift;
+  print STDERR "Memoize::Storable::EXISTS(@_)\n" if $Verbose;
+  exists $self->{H}{$_[0]};
+}
+
+sub DESTROY {
+  require Carp if $Verbose;
+  my $self= shift;
+  print STDERR "Memoize::Storable::DESTROY(@_)\n" if $Verbose;
+  if ($self->{OPTIONS}{'nstore'}) {
+    Storable::nstore($self->{H}, $self->{FILENAME});
+  } else {
+    Storable::store($self->{H}, $self->{FILENAME});
+  }
+}
+
+sub FIRSTKEY {
+  'Fake hash from Memoize::Storable';
+}
+
+sub NEXTKEY {
+  undef;
+}
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/NEXT.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/NEXT.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/NEXT.pm	(revision 14489)
@@ -0,0 +1,533 @@
+package NEXT;
+$VERSION = '0.60';
+use Carp;
+use strict;
+
+sub NEXT::ELSEWHERE::ancestors
+{
+	my @inlist = shift;
+	my @outlist = ();
+	while (my $next = shift @inlist) {
+		push @outlist, $next;
+		no strict 'refs';
+		unshift @inlist, @{"$outlist[-1]::ISA"};
+	}
+	return @outlist;
+}
+
+sub NEXT::ELSEWHERE::ordered_ancestors
+{
+	my @inlist = shift;
+	my @outlist = ();
+	while (my $next = shift @inlist) {
+		push @outlist, $next;
+		no strict 'refs';
+		push @inlist, @{"$outlist[-1]::ISA"};
+	}
+	return sort { $a->isa($b) ? -1
+	            : $b->isa($a) ? +1
+	            :                0 } @outlist;
+}
+
+sub AUTOLOAD
+{
+	my ($self) = @_;
+	my $caller = (caller(1))[3]; 
+	my $wanted = $NEXT::AUTOLOAD || 'NEXT::AUTOLOAD';
+	undef $NEXT::AUTOLOAD;
+	my ($caller_class, $caller_method) = $caller =~ m{(.*)::(.*)}g;
+	my ($wanted_class, $wanted_method) = $wanted =~ m{(.*)::(.*)}g;
+	croak "Can't call $wanted from $caller"
+		unless $caller_method eq $wanted_method;
+
+	local ($NEXT::NEXT{$self,$wanted_method}, $NEXT::SEEN) =
+	      ($NEXT::NEXT{$self,$wanted_method}, $NEXT::SEEN);
+
+
+	unless ($NEXT::NEXT{$self,$wanted_method}) {
+		my @forebears =
+			NEXT::ELSEWHERE::ancestors ref $self || $self,
+						   $wanted_class;
+		while (@forebears) {
+			last if shift @forebears eq $caller_class
+		}
+		no strict 'refs';
+		@{$NEXT::NEXT{$self,$wanted_method}} = 
+			map { *{"${_}::$caller_method"}{CODE}||() } @forebears
+				unless $wanted_method eq 'AUTOLOAD';
+		@{$NEXT::NEXT{$self,$wanted_method}} = 
+			map { (*{"${_}::AUTOLOAD"}{CODE}) ? "${_}::AUTOLOAD" : ()} @forebears
+				unless @{$NEXT::NEXT{$self,$wanted_method}||[]};
+		$NEXT::SEEN->{$self,*{$caller}{CODE}}++;
+	}
+	my $call_method = shift @{$NEXT::NEXT{$self,$wanted_method}};
+	while ($wanted_class =~ /^NEXT\b.*\b(UNSEEN|DISTINCT)\b/
+	       && defined $call_method
+	       && $NEXT::SEEN->{$self,$call_method}++) {
+		$call_method = shift @{$NEXT::NEXT{$self,$wanted_method}};
+	}
+	unless (defined $call_method) {
+		return unless $wanted_class =~ /^NEXT:.*:ACTUAL/;
+		(local $Carp::CarpLevel)++;
+		croak qq(Can't locate object method "$wanted_method" ),
+		      qq(via package "$caller_class");
+	};
+	return $self->$call_method(@_[1..$#_]) if ref $call_method eq 'CODE';
+	no strict 'refs';
+	($wanted_method=${$caller_class."::AUTOLOAD"}) =~ s/.*:://
+		if $wanted_method eq 'AUTOLOAD';
+	$$call_method = $caller_class."::NEXT::".$wanted_method;
+	return $call_method->(@_);
+}
+
+no strict 'vars';
+package NEXT::UNSEEN;		@ISA = 'NEXT';
+package NEXT::DISTINCT;		@ISA = 'NEXT';
+package NEXT::ACTUAL;		@ISA = 'NEXT';
+package NEXT::ACTUAL::UNSEEN;	@ISA = 'NEXT';
+package NEXT::ACTUAL::DISTINCT;	@ISA = 'NEXT';
+package NEXT::UNSEEN::ACTUAL;	@ISA = 'NEXT';
+package NEXT::DISTINCT::ACTUAL;	@ISA = 'NEXT';
+
+package EVERY::LAST;		@ISA = 'EVERY';
+package EVERY;			@ISA = 'NEXT';
+sub AUTOLOAD
+{
+	my ($self) = @_;
+	my $caller = (caller(1))[3]; 
+	my $wanted = $EVERY::AUTOLOAD || 'EVERY::AUTOLOAD';
+	undef $EVERY::AUTOLOAD;
+	my ($wanted_class, $wanted_method) = $wanted =~ m{(.*)::(.*)}g;
+
+	local $NEXT::ALREADY_IN_EVERY{$self,$wanted_method} =
+	      $NEXT::ALREADY_IN_EVERY{$self,$wanted_method};
+
+	return if $NEXT::ALREADY_IN_EVERY{$self,$wanted_method}++;
+	
+	my @forebears = NEXT::ELSEWHERE::ordered_ancestors ref $self || $self,
+					                   $wanted_class;
+	@forebears = reverse @forebears if $wanted_class =~ /\bLAST\b/;
+	no strict 'refs';
+	my %seen;
+	my @every = map { my $sub = "${_}::$wanted_method";
+		          !*{$sub}{CODE} || $seen{$sub}++ ? () : $sub
+		        } @forebears
+				unless $wanted_method eq 'AUTOLOAD';
+
+	my $want = wantarray;
+	if (@every) {
+		if ($want) {
+			return map {($_, [$self->$_(@_[1..$#_])])} @every;
+		}
+		elsif (defined $want) {
+			return { map {($_, scalar($self->$_(@_[1..$#_])))}
+				     @every
+			       };
+		}
+		else {
+			$self->$_(@_[1..$#_]) for @every;
+			return;
+		}
+	}
+
+	@every = map { my $sub = "${_}::AUTOLOAD";
+		       !*{$sub}{CODE} || $seen{$sub}++ ? () : "${_}::AUTOLOAD"
+		     } @forebears;
+	if ($want) {
+		return map { $$_ = ref($self)."::EVERY::".$wanted_method;
+			     ($_, [$self->$_(@_[1..$#_])]);
+			   } @every;
+	}
+	elsif (defined $want) {
+		return { map { $$_ = ref($self)."::EVERY::".$wanted_method;
+			       ($_, scalar($self->$_(@_[1..$#_])))
+			     } @every
+		       };
+	}
+	else {
+		for (@every) {
+			$$_ = ref($self)."::EVERY::".$wanted_method;
+			$self->$_(@_[1..$#_]);
+		}
+		return;
+	}
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+NEXT.pm - Provide a pseudo-class NEXT (et al) that allows method redispatch
+
+
+=head1 SYNOPSIS
+
+    use NEXT;
+
+    package A;
+    sub A::method   { print "$_[0]: A method\n";   $_[0]->NEXT::method() }
+    sub A::DESTROY  { print "$_[0]: A dtor\n";     $_[0]->NEXT::DESTROY() }
+
+    package B;
+    use base qw( A );
+    sub B::AUTOLOAD { print "$_[0]: B AUTOLOAD\n"; $_[0]->NEXT::AUTOLOAD() }
+    sub B::DESTROY  { print "$_[0]: B dtor\n";     $_[0]->NEXT::DESTROY() }
+
+    package C;
+    sub C::method   { print "$_[0]: C method\n";   $_[0]->NEXT::method() }
+    sub C::AUTOLOAD { print "$_[0]: C AUTOLOAD\n"; $_[0]->NEXT::AUTOLOAD() }
+    sub C::DESTROY  { print "$_[0]: C dtor\n";     $_[0]->NEXT::DESTROY() }
+
+    package D;
+    use base qw( B C );
+    sub D::method   { print "$_[0]: D method\n";   $_[0]->NEXT::method() }
+    sub D::AUTOLOAD { print "$_[0]: D AUTOLOAD\n"; $_[0]->NEXT::AUTOLOAD() }
+    sub D::DESTROY  { print "$_[0]: D dtor\n";     $_[0]->NEXT::DESTROY() }
+
+    package main;
+
+    my $obj = bless {}, "D";
+
+    $obj->method();		# Calls D::method, A::method, C::method
+    $obj->missing_method(); # Calls D::AUTOLOAD, B::AUTOLOAD, C::AUTOLOAD
+
+    # Clean-up calls D::DESTROY, B::DESTROY, A::DESTROY, C::DESTROY
+
+
+
+=head1 DESCRIPTION
+
+NEXT.pm adds a pseudoclass named C<NEXT> to any program
+that uses it. If a method C<m> calls C<$self-E<gt>NEXT::m()>, the call to
+C<m> is redispatched as if the calling method had not originally been found.
+
+In other words, a call to C<$self-E<gt>NEXT::m()> resumes the depth-first,
+left-to-right search of C<$self>'s class hierarchy that resulted in the
+original call to C<m>.
+
+Note that this is not the same thing as C<$self-E<gt>SUPER::m()>, which
+begins a new dispatch that is restricted to searching the ancestors
+of the current class. C<$self-E<gt>NEXT::m()> can backtrack
+past the current class -- to look for a suitable method in other
+ancestors of C<$self> -- whereas C<$self-E<gt>SUPER::m()> cannot.
+
+A typical use would be in the destructors of a class hierarchy,
+as illustrated in the synopsis above. Each class in the hierarchy
+has a DESTROY method that performs some class-specific action
+and then redispatches the call up the hierarchy. As a result,
+when an object of class D is destroyed, the destructors of I<all>
+its parent classes are called (in depth-first, left-to-right order).
+
+Another typical use of redispatch would be in C<AUTOLOAD>'ed methods.
+If such a method determined that it was not able to handle a
+particular call, it might choose to redispatch that call, in the
+hope that some other C<AUTOLOAD> (above it, or to its left) might
+do better.
+
+By default, if a redispatch attempt fails to find another method
+elsewhere in the objects class hierarchy, it quietly gives up and does
+nothing (but see L<"Enforcing redispatch">). This gracious acquiesence
+is also unlike the (generally annoying) behaviour of C<SUPER>, which
+throws an exception if it cannot redispatch.
+
+Note that it is a fatal error for any method (including C<AUTOLOAD>)
+to attempt to redispatch any method that does not have the
+same name. For example:
+
+        sub D::oops { print "oops!\n"; $_[0]->NEXT::other_method() }
+
+
+=head2 Enforcing redispatch
+
+It is possible to make C<NEXT> redispatch more demandingly (i.e. like
+C<SUPER> does), so that the redispatch throws an exception if it cannot
+find a "next" method to call.
+
+To do this, simple invoke the redispatch as:
+
+	$self->NEXT::ACTUAL::method();
+
+rather than:
+
+	$self->NEXT::method();
+
+The C<ACTUAL> tells C<NEXT> that there must actually be a next method to call,
+or it should throw an exception.
+
+C<NEXT::ACTUAL> is most commonly used in C<AUTOLOAD> methods, as a means to
+decline an C<AUTOLOAD> request, but preserve the normal exception-on-failure 
+semantics:
+
+	sub AUTOLOAD {
+		if ($AUTOLOAD =~ /foo|bar/) {
+			# handle here
+		}
+		else {  # try elsewhere
+			shift()->NEXT::ACTUAL::AUTOLOAD(@_);
+		}
+	}
+
+By using C<NEXT::ACTUAL>, if there is no other C<AUTOLOAD> to handle the
+method call, an exception will be thrown (as usually happens in the absence of
+a suitable C<AUTOLOAD>).
+
+
+=head2 Avoiding repetitions
+
+If C<NEXT> redispatching is used in the methods of a "diamond" class hierarchy:
+
+	#     A   B
+	#    / \ /
+	#   C   D
+	#    \ /
+	#     E
+
+	use NEXT;
+
+	package A;                 
+	sub foo { print "called A::foo\n"; shift->NEXT::foo() }
+
+	package B;                 
+	sub foo { print "called B::foo\n"; shift->NEXT::foo() }
+
+	package C; @ISA = qw( A );
+	sub foo { print "called C::foo\n"; shift->NEXT::foo() }
+
+	package D; @ISA = qw(A B);
+	sub foo { print "called D::foo\n"; shift->NEXT::foo() }
+
+	package E; @ISA = qw(C D);
+	sub foo { print "called E::foo\n"; shift->NEXT::foo() }
+
+	E->foo();
+
+then derived classes may (re-)inherit base-class methods through two or
+more distinct paths (e.g. in the way C<E> inherits C<A::foo> twice --
+through C<C> and C<D>). In such cases, a sequence of C<NEXT> redispatches
+will invoke the multiply inherited method as many times as it is
+inherited. For example, the above code prints:
+
+        called E::foo
+        called C::foo
+        called A::foo
+        called D::foo
+        called A::foo
+        called B::foo
+
+(i.e. C<A::foo> is called twice).
+
+In some cases this I<may> be the desired effect within a diamond hierarchy,
+but in others (e.g. for destructors) it may be more appropriate to 
+call each method only once during a sequence of redispatches.
+
+To cover such cases, you can redispatch methods via:
+
+        $self->NEXT::DISTINCT::method();
+
+rather than:
+
+        $self->NEXT::method();
+
+This causes the redispatcher to only visit each distinct C<method> method
+once. That is, to skip any classes in the hierarchy that it has
+already visited during redispatch. So, for example, if the
+previous example were rewritten:
+
+        package A;                 
+        sub foo { print "called A::foo\n"; shift->NEXT::DISTINCT::foo() }
+
+        package B;                 
+        sub foo { print "called B::foo\n"; shift->NEXT::DISTINCT::foo() }
+
+        package C; @ISA = qw( A );
+        sub foo { print "called C::foo\n"; shift->NEXT::DISTINCT::foo() }
+
+        package D; @ISA = qw(A B);
+        sub foo { print "called D::foo\n"; shift->NEXT::DISTINCT::foo() }
+
+        package E; @ISA = qw(C D);
+        sub foo { print "called E::foo\n"; shift->NEXT::DISTINCT::foo() }
+
+        E->foo();
+
+then it would print:
+        
+        called E::foo
+        called C::foo
+        called A::foo
+        called D::foo
+        called B::foo
+
+and omit the second call to C<A::foo> (since it would not be distinct
+from the first call to C<A::foo>).
+
+Note that you can also use:
+
+        $self->NEXT::DISTINCT::ACTUAL::method();
+
+or:
+
+        $self->NEXT::ACTUAL::DISTINCT::method();
+
+to get both unique invocation I<and> exception-on-failure.
+
+Note that, for historical compatibility, you can also use
+C<NEXT::UNSEEN> instead of C<NEXT::DISTINCT>.
+
+
+=head2 Invoking all versions of a method with a single call
+
+Yet another pseudo-class that NEXT.pm provides is C<EVERY>.
+Its behaviour is considerably simpler than that of the C<NEXT> family.
+A call to:
+
+	$obj->EVERY::foo();
+
+calls I<every> method named C<foo> that the object in C<$obj> has inherited.
+That is:
+
+	use NEXT;
+
+	package A; @ISA = qw(B D X);
+	sub foo { print "A::foo " }
+
+	package B; @ISA = qw(D X);
+	sub foo { print "B::foo " }
+
+	package X; @ISA = qw(D);
+	sub foo { print "X::foo " }
+
+	package D;
+	sub foo { print "D::foo " }
+
+	package main;
+
+	my $obj = bless {}, 'A';
+	$obj->EVERY::foo();        # prints" A::foo B::foo X::foo D::foo
+
+Prefixing a method call with C<EVERY::> causes every method in the
+object's hierarchy with that name to be invoked. As the above example
+illustrates, they are not called in Perl's usual "left-most-depth-first"
+order. Instead, they are called "breadth-first-dependency-wise".
+
+That means that the inheritance tree of the object is traversed breadth-first
+and the resulting order of classes is used as the sequence in which methods
+are called. However, that sequence is modified by imposing a rule that the
+appropritae method of a derived class must be called before the same method of
+any ancestral class. That's why, in the above example, C<X::foo> is called
+before C<D::foo>, even though C<D> comes before C<X> in C<@B::ISA>.
+
+In general, there's no need to worry about the order of calls. They will be
+left-to-right, breadth-first, most-derived-first. This works perfectly for
+most inherited methods (including destructors), but is inappropriate for
+some kinds of methods (such as constructors, cloners, debuggers, and
+initializers) where it's more appropriate that the least-derived methods be
+called first (as more-derived methods may rely on the behaviour of their
+"ancestors"). In that case, instead of using the C<EVERY> pseudo-class:
+
+	$obj->EVERY::foo();        # prints" A::foo B::foo X::foo D::foo      
+
+you can use the C<EVERY::LAST> pseudo-class:
+
+	$obj->EVERY::LAST::foo();  # prints" D::foo X::foo B::foo A::foo      
+
+which reverses the order of method call.
+
+Whichever version is used, the actual methods are called in the same
+context (list, scalar, or void) as the original call via C<EVERY>, and return:
+
+=over
+
+=item *
+
+A hash of array references in list context. Each entry of the hash has the
+fully qualified method name as its key and a reference to an array containing
+the method's list-context return values as its value.
+
+=item *
+
+A reference to a hash of scalar values in scalar context. Each entry of the hash has the
+fully qualified method name as its key and the method's scalar-context return values as its value.
+
+=item *
+
+Nothing in void context (obviously).
+
+=back
+
+=head2 Using C<EVERY> methods
+
+The typical way to use an C<EVERY> call is to wrap it in another base
+method, that all classes inherit. For example, to ensure that every
+destructor an object inherits is actually called (as opposed to just the
+left-most-depth-first-est one):
+
+        package Base;
+        sub DESTROY { $_[0]->EVERY::Destroy }
+
+        package Derived1; 
+        use base 'Base';
+        sub Destroy {...}
+
+        package Derived2; 
+        use base 'Base', 'Derived1';
+        sub Destroy {...}
+
+et cetera. Every derived class than needs its own clean-up
+behaviour simply adds its own C<Destroy> method (I<not> a C<DESTROY> method),
+which the call to C<EVERY::LAST::Destroy> in the inherited destructor
+then correctly picks up.
+
+Likewise, to create a class hierarchy in which every initializer inherited by
+a new object is invoked:
+
+        package Base;
+        sub new {
+		my ($class, %args) = @_;
+		my $obj = bless {}, $class;
+		$obj->EVERY::LAST::Init(\%args);
+	}
+
+        package Derived1; 
+        use base 'Base';
+        sub Init {
+		my ($argsref) = @_;
+		...
+	}
+
+        package Derived2; 
+        use base 'Base', 'Derived1';
+        sub Init {
+		my ($argsref) = @_;
+		...
+	}
+
+et cetera. Every derived class than needs some additional initialization
+behaviour simply adds its own C<Init> method (I<not> a C<new> method),
+which the call to C<EVERY::LAST::Init> in the inherited constructor
+then correctly picks up.
+
+
+=head1 AUTHOR
+
+Damian Conway (damian@conway.org)
+
+=head1 BUGS AND IRRITATIONS
+
+Because it's a module, not an integral part of the interpreter, NEXT.pm
+has to guess where the surrounding call was found in the method
+look-up sequence. In the presence of diamond inheritance patterns
+it occasionally guesses wrong.
+
+It's also too slow (despite caching).
+
+Comment, suggestions, and patches welcome.
+
+=head1 COPYRIGHT
+
+ Copyright (c) 2000-2001, Damian Conway. All Rights Reserved.
+ This module is free software. It may be used, redistributed
+    and/or modified under the same terms as Perl itself.
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/Cmd.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/Cmd.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/Cmd.pm	(revision 14489)
@@ -0,0 +1,777 @@
+# Net::Cmd.pm $Id: //depot/libnet/Net/Cmd.pm#34 $
+#
+# 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;
+#    Convert::EBCDIC->import;
+  }
+}
+
+$VERSION = "2.26";
+@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_last_ch'});
+
+ 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));
+
+ my $last_ch = ${*$cmd}{'net_cmd_last_ch'};
+ $last_ch = ${*$cmd}{'net_cmd_last_ch'} = "\012" unless defined $last_ch;
+
+ return 1 unless length $line;
+
+ if($cmd->debug) {
+   foreach my $b (split(/\n/,$line)) {
+     $cmd->debug_print(1, "$b\n");
+   }
+  }
+
+ $line =~ tr/\r\n/\015\012/ unless "\r" eq "\015";
+
+  my $first_ch = '';
+
+  if ($last_ch eq "\015") {
+    $first_ch = "\012" if $line =~ s/^\012//;
+  }
+  elsif ($last_ch eq "\012") {
+    $first_ch = "." if $line =~ /^\./;
+  }
+
+ $line =~ s/\015?\012(\.?)/\015\012$1$1/sg;
+
+ substr($line,0,0) = $first_ch;
+
+ ${*$cmd}{'net_cmd_last_ch'} = substr($line,-1,1);
+
+ 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 or -f $cmd) # -f for testing on win32
+    {
+     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));
+
+ my $ch = ${*$cmd}{'net_cmd_last_ch'};
+ my $tosend;
+
+ if (!defined $ch) {
+   return 1;
+ }
+ elsif ($ch ne "\012") {
+   $tosend = "\015\012";
+ }
+
+ $tosend .= ".\015\012";
+
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+
+ $cmd->debug_print(1, ".\n")
+    if($cmd->debug);
+
+ syswrite($cmd,$tosend, length $tosend);
+
+ delete ${*$cmd}{'net_cmd_last_ch'};
+
+ $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#34 $>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/Config.eg
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/Config.eg	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/Config.eg	(revision 14489)
@@ -0,0 +1,49 @@
+package Net::Config;
+
+require Exporter;
+use vars qw(@ISA @EXPORT %NetConfig);
+use strict;
+
+@EXPORT = qw(%NetConfig);
+@ISA = qw(Exporter);
+
+# WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING
+# WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING
+#
+# Below this line is auto-generated, *ANY* changes will be lost
+
+%NetConfig = (
+	# the followinf parameters are all lists of hosts for the
+	# respective protocols.
+	nntp_hosts => [],
+	snpp_hosts => [],
+	pop3_hosts => [],
+	smtp_hosts => [],
+	ph_hosts => [],
+	daytime_hosts => [],
+	time_hosts => [],
+
+	# your internet domain
+	inet_domain => undef,
+
+	# If you have an ftp proxy firewall (not an http firewall)
+	# then set this to the name of the firewall
+	ftp_firewall => undef,
+
+	# set if all connections done via the firewall should use
+	# passive data connections
+	ftp_ext_passive => 0,
+
+	# set if all connections not done via the firewall should use
+	# passive data connections
+	ftp_int_passive => 0,
+
+	# If set the make test will attempt to connect to the hosts above
+	test_hosts => 0,
+
+	# Used during Configure (which you are not using) to do
+	# DNS lookups to ensure hosts exist
+	test_exist => 0,
+
+);
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/Config.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/Config.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/Config.pm	(revision 14489)
@@ -0,0 +1,314 @@
+# 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 $>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/Domain.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/Domain.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/Domain.pm	(revision 14489)
@@ -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
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/FTP.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/FTP.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/FTP.pm	(revision 14489)
@@ -0,0 +1,1790 @@
+# Net::FTP.pm
+#
+# Copyright (c) 1995-2004 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);
+# use AutoLoader qw(AUTOLOAD);
+
+$VERSION = "2.75";
+@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,%arg);
+ if (@_ % 2) {
+   $peer = shift ;
+   %arg  = @_;
+ } else {
+   %arg = @_;
+   $peer=delete $arg{Host};
+ }
+
+ 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 host {
+ my $me = shift;
+ ${*$me}{'net_ftp_host'};
+}
+
+
+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 bug 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*(bytes?\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 defined $where;
+  my $rest = ${*$ftp}{'net_ftp_rest'};
+
+ 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 | ($rest ? 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 = grep { !/^\.{1,2}$/ } $ftp->ls($dir);
+
+    return undef
+	unless @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 = do { local $^W; -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 = map { 0+$_ } 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;
+
+ # Darn MS FTP server is a load of CRAP !!!!
+ 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<HOST> is optional. If C<HOST> is not given then it may instead be
+passed as the C<Host> option described below. 
+
+C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
+Possible options are:
+
+B<Host> - FTP host to connect to. It may be a single scalar, as defined for
+the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to
+an array with hosts to try in turn. The L</host> method will return the value
+which was used to connect to the host.
+
+
+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 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.
+
+=item ls ( [ DIR ] )
+
+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 bug 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-2004 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
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/A.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/A.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/A.pm	(revision 14489)
@@ -0,0 +1,101 @@
+## $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;
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/E.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/E.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/E.pm	(revision 14489)
@@ -0,0 +1,8 @@
+package Net::FTP::E;
+
+require Net::FTP::I;
+
+@ISA = qw(Net::FTP::I);
+$VERSION = "0.01";
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/I.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/I.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/I.pm	(revision 14489)
@@ -0,0 +1,74 @@
+## $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;
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/L.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/L.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/L.pm	(revision 14489)
@@ -0,0 +1,8 @@
+package Net::FTP::L;
+
+require Net::FTP::I;
+
+@ISA = qw(Net::FTP::I);
+$VERSION = "0.01";
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/dataconn.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/dataconn.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/FTP/dataconn.pm	(revision 14489)
@@ -0,0 +1,121 @@
+##
+## 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;
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/Hostname.eg
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/Hostname.eg	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/Hostname.eg	(revision 14489)
@@ -0,0 +1,14 @@
+# This is an example Hostname.pm.
+
+package Sys::Hostname;
+
+use Net::Domain qw(hostname);
+use Carp;
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(hostname);
+
+carp "deprecated package 'Sys::Hostname', use Net::Domain" if $^W;
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/NNTP.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/NNTP.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/NNTP.pm	(revision 14489)
@@ -0,0 +1,1145 @@
+# 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.23";
+@ISA     = qw(Net::Cmd IO::Socket::INET);
+
+sub new
+{
+ my $self = shift;
+ my $type = ref($self) || $self;
+ my ($host,%arg);
+ if (@_ % 2) {
+   $host = shift ;
+   %arg  = @_;
+ } else {
+   %arg = @_;
+   $host=delete $arg{Host};
+ }
+ 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 host {
+ my $me = shift;
+ ${*$me}{'net_nntp_host'};
+}
+
+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 then it may be passed as the C<Host> option described below. If no host is passed
+then 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<Host> - NNTP host to connect to. It may be a single scalar, as defined for
+the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to
+an array with hosts to try in turn. The L</host> method will return the value
+which was used to connect to the host.
+
+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 )
+
+Authenticates to the server (using AUTHINFO USER / AUTHINFO PASS)
+using the supplied username and password.  Please note that the
+password is sent in clear text to the server.  This command should not
+be used with valuable passwords unless the connection to the server is
+somehow protected.
+
+=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
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/Netrc.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/Netrc.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/Netrc.pm	(revision 14489)
@@ -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
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/POP3.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/POP3.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/POP3.pm	(revision 14489)
@@ -0,0 +1,673 @@
+# Net::POP3.pm
+#
+# Copyright (c) 1995-2004 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.28";
+
+@ISA = qw(Net::Cmd IO::Socket::INET);
+
+sub new
+{
+ my $self = shift;
+ my $type = ref($self) || $self;
+ my ($host,%arg);
+ if (@_ % 2) {
+   $host = shift ;
+   %arg  = @_;
+ } else {
+   %arg = @_;
+   $host=delete $arg{Host};
+ }
+ 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;
+}
+
+sub host {
+ my $me = shift;
+ ${*$me}{'net_pop3_host'};
+}
+
+##
+## 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 )';
+ my $me = shift;
+ return  0 unless $me->_DELE(@_);
+ ${*$me}{'net_pop3_deleted'} = 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 _CAPA { shift->command('CAPA')->response() == CMD_OK }
+
+sub quit
+{
+ my $me = shift;
+
+ $me->_QUIT;
+ $me->close;
+}
+
+sub DESTROY
+{
+ my $me = shift;
+
+ if(defined fileno($me) and ${*$me}{'net_pop3_deleted'})
+  {
+   $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() or return undef;
+  my $code = "500";
+
+  $cmd->debug_print(0, $str)
+    if ($cmd->debug);
+
+  if ($str =~ s/^\+OK\s*//io) {
+    $code = "200";
+  }
+  elsif ($str =~ s/^\+\s*//io) {
+    $code = "300";
+  }
+  else {
+    $str =~ s/^-ERR\s*//io;
+  }
+
+  ${*$cmd}{'net_cmd_resp'} = [$str];
+  ${*$cmd}{'net_cmd_code'} = $code;
+
+  substr($code, 0, 1);
+}
+
+
+sub capa {
+    my $this = shift;
+    my ($capa, %capabilities);
+
+    # Fake a capability here
+    $capabilities{APOP} = '' if ($this->banner() =~ /<.*>/);
+
+    return \%capabilities unless $this->_CAPA();
+
+    $capa = $this->read_until_dot();
+    %capabilities = map { /^\s*(\S+)\s*(.*)/ } @$capa;
+    $capabilities{APOP} = '' if ($this->banner() =~ /<.*>/);
+
+    return ${*$this}{'net_pop3e_capabilities'} = \%capabilities;
+}
+
+sub capabilities {
+    my $this = shift;
+
+    ${*$this}{'net_pop3e_capabilities'} || $this->capa;
+}
+    
+sub auth {
+    my ($self, $username, $password) = @_;
+
+    eval {
+	require MIME::Base64;
+	require Authen::SASL;
+    } or $self->set_status(500,["Need MIME::Base64 and Authen::SASL todo auth"]), return 0;
+
+    my $capa = $self->capa;
+    my $mechanisms = $capa->{SASL} || 'CRAM-MD5';
+
+    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('pop3',${*$self}{'net_pop3_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 banner {
+    my $this = shift;
+
+    return ${*$this}{'net_pop3_banner'};
+}
+
+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 ] 0
+
+This is the constructor for a new Net::POP3 object. C<HOST> is the
+name of the remote host to which an POP3 connection is required.
+
+C<HOST> is optional. If C<HOST> is not given then it may instead be
+passed as the C<Host> option described below. If neither is given then
+the C<POP3_Hosts> 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<Host> - POP3 host to connect to. It may be a single scalar, as defined for
+the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to
+an array with hosts to try in turn. The L</host> method will return the value
+which was used to connect to the host.
+
+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 auth ( USERNAME, PASSWORD )
+
+Attempt SASL authentication.
+
+=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 banner ()
+
+Return the sever's connection banner
+
+=item capa ()
+
+Return a reference to a hash of the capabilties of the server.  APOP
+is added as a pseudo capability.  Note that I've been unable to
+find a list of the standard capability values, and some appear to
+be multi-word and some are not.  We make an attempt at intelligently
+parsing them, but it may not be correct.
+
+=item  capabilities ()
+
+Just like capa, but only uses a cache from the last time we asked
+the server, so as to avoid asking more than once.
+
+=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-2003 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
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/Ping.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/Ping.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/Ping.pm	(revision 14489)
@@ -0,0 +1,1744 @@
+package Net::Ping;
+
+require 5.002;
+require Exporter;
+
+use strict;
+use vars qw(@ISA @EXPORT $VERSION
+            $def_timeout $def_proto $def_factor
+            $max_datasize $pingstring $hires $source_verify $syn_forking);
+use Fcntl qw( F_GETFL F_SETFL O_NONBLOCK );
+use Socket qw( SOCK_DGRAM SOCK_STREAM SOCK_RAW PF_INET SOL_SOCKET SO_ERROR
+               inet_aton inet_ntoa sockaddr_in );
+use POSIX qw( ENOTCONN ECONNREFUSED ECONNRESET EINPROGRESS EWOULDBLOCK EAGAIN WNOHANG );
+use FileHandle;
+use Carp;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(pingecho);
+$VERSION = "2.31";
+
+sub SOL_IP { 0; };
+sub IP_TOS { 1; };
+
+# Constants
+
+$def_timeout = 5;           # Default timeout to wait for a reply
+$def_proto = "tcp";         # Default protocol to use for pinging
+$def_factor = 1.2;          # Default exponential backoff rate.
+$max_datasize = 1024;       # Maximum data bytes in a packet
+# The data we exchange with the server for the stream protocol
+$pingstring = "pingschwingping!\n";
+$source_verify = 1;         # Default is to verify source endpoint
+$syn_forking = 0;
+
+if ($^O =~ /Win32/i) {
+  # Hack to avoid this Win32 spewage:
+  # Your vendor has not defined POSIX macro ECONNREFUSED
+  *ECONNREFUSED = sub {10061;}; # "Unknown Error" Special Win32 Response?
+  *ENOTCONN     = sub {10057;};
+  *ECONNRESET   = sub {10054;};
+  *EINPROGRESS  = sub {10036;};
+  *EWOULDBLOCK  = sub {10035;};
+#  $syn_forking = 1;    # XXX possibly useful in < Win2K ?
+};
+
+# h2ph "asm/socket.h"
+# require "asm/socket.ph";
+sub SO_BINDTODEVICE {25;}
+
+# Description:  The pingecho() subroutine is provided for backward
+# compatibility with the original Net::Ping.  It accepts a host
+# name/IP and an optional timeout in seconds.  Create a tcp ping
+# object and try pinging the host.  The result of the ping is returned.
+
+sub pingecho
+{
+  my ($host,              # Name or IP number of host to ping
+      $timeout            # Optional timeout in seconds
+      ) = @_;
+  my ($p);                # A ping object
+
+  $p = Net::Ping->new("tcp", $timeout);
+  $p->ping($host);        # Going out of scope closes the connection
+}
+
+# Description:  The new() method creates a new ping object.  Optional
+# parameters may be specified for the protocol to use, the timeout in
+# seconds and the size in bytes of additional data which should be
+# included in the packet.
+#   After the optional parameters are checked, the data is constructed
+# and a socket is opened if appropriate.  The object is returned.
+
+sub new
+{
+  my ($this,
+      $proto,             # Optional protocol to use for pinging
+      $timeout,           # Optional timeout in seconds
+      $data_size,         # Optional additional bytes of data
+      $device,            # Optional device to use
+      $tos,               # Optional ToS to set
+      ) = @_;
+  my  $class = ref($this) || $this;
+  my  $self = {};
+  my ($cnt,               # Count through data bytes
+      $min_datasize       # Minimum data bytes required
+      );
+
+  bless($self, $class);
+
+  $proto = $def_proto unless $proto;          # Determine the protocol
+  croak('Protocol for ping must be "icmp", "udp", "tcp", "syn", "stream", or "external"')
+    unless $proto =~ m/^(icmp|udp|tcp|syn|stream|external)$/;
+  $self->{"proto"} = $proto;
+
+  $timeout = $def_timeout unless $timeout;    # Determine the timeout
+  croak("Default timeout for ping must be greater than 0 seconds")
+    if $timeout <= 0;
+  $self->{"timeout"} = $timeout;
+
+  $self->{"device"} = $device;
+
+  $self->{"tos"} = $tos;
+
+  $min_datasize = ($proto eq "udp") ? 1 : 0;  # Determine data size
+  $data_size = $min_datasize unless defined($data_size) && $proto ne "tcp";
+  croak("Data for ping must be from $min_datasize to $max_datasize bytes")
+    if ($data_size < $min_datasize) || ($data_size > $max_datasize);
+  $data_size-- if $self->{"proto"} eq "udp";  # We provide the first byte
+  $self->{"data_size"} = $data_size;
+
+  $self->{"data"} = "";                       # Construct data bytes
+  for ($cnt = 0; $cnt < $self->{"data_size"}; $cnt++)
+  {
+    $self->{"data"} .= chr($cnt % 256);
+  }
+
+  $self->{"local_addr"} = undef;              # Don't bind by default
+  $self->{"retrans"} = $def_factor;           # Default exponential backoff rate
+  $self->{"econnrefused"} = undef;            # Default Connection refused behavior
+
+  $self->{"seq"} = 0;                         # For counting packets
+  if ($self->{"proto"} eq "udp")              # Open a socket
+  {
+    $self->{"proto_num"} = (getprotobyname('udp'))[2] ||
+      croak("Can't udp protocol by name");
+    $self->{"port_num"} = (getservbyname('echo', 'udp'))[2] ||
+      croak("Can't get udp echo port by name");
+    $self->{"fh"} = FileHandle->new();
+    socket($self->{"fh"}, PF_INET, SOCK_DGRAM,
+           $self->{"proto_num"}) ||
+             croak("udp socket error - $!");
+    if ($self->{'device'}) {
+      setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'}))
+        or croak "error binding to device $self->{'device'} $!";
+    }
+    if ($self->{'tos'}) {
+      setsockopt($self->{"fh"}, SOL_IP, IP_TOS(), pack("I*", $self->{'tos'}))
+        or croak "error configuring tos to $self->{'tos'} $!";
+    }
+  }
+  elsif ($self->{"proto"} eq "icmp")
+  {
+    croak("icmp ping requires root privilege") if ($> and $^O ne 'VMS' and $^O ne 'cygwin');
+    $self->{"proto_num"} = (getprotobyname('icmp'))[2] ||
+      croak("Can't get icmp protocol by name");
+    $self->{"pid"} = $$ & 0xffff;           # Save lower 16 bits of pid
+    $self->{"fh"} = FileHandle->new();
+    socket($self->{"fh"}, PF_INET, SOCK_RAW, $self->{"proto_num"}) ||
+      croak("icmp socket error - $!");
+    if ($self->{'device'}) {
+      setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'}))
+        or croak "error binding to device $self->{'device'} $!";
+    }
+    if ($self->{'tos'}) {
+      setsockopt($self->{"fh"}, SOL_IP, IP_TOS(), pack("I*", $self->{'tos'}))
+        or croak "error configuring tos to $self->{'tos'} $!";
+    }
+  }
+  elsif ($self->{"proto"} eq "tcp" || $self->{"proto"} eq "stream")
+  {
+    $self->{"proto_num"} = (getprotobyname('tcp'))[2] ||
+      croak("Can't get tcp protocol by name");
+    $self->{"port_num"} = (getservbyname('echo', 'tcp'))[2] ||
+      croak("Can't get tcp echo port by name");
+    $self->{"fh"} = FileHandle->new();
+  }
+  elsif ($self->{"proto"} eq "syn")
+  {
+    $self->{"proto_num"} = (getprotobyname('tcp'))[2] ||
+      croak("Can't get tcp protocol by name");
+    $self->{"port_num"} = (getservbyname('echo', 'tcp'))[2] ||
+      croak("Can't get tcp echo port by name");
+    if ($syn_forking) {
+      $self->{"fork_rd"} = FileHandle->new();
+      $self->{"fork_wr"} = FileHandle->new();
+      pipe($self->{"fork_rd"}, $self->{"fork_wr"});
+      $self->{"fh"} = FileHandle->new();
+      $self->{"good"} = {};
+      $self->{"bad"} = {};
+    } else {
+      $self->{"wbits"} = "";
+      $self->{"bad"} = {};
+    }
+    $self->{"syn"} = {};
+    $self->{"stop_time"} = 0;
+  }
+  elsif ($self->{"proto"} eq "external")
+  {
+    # No preliminary work needs to be done.
+  }
+
+  return($self);
+}
+
+# Description: Set the local IP address from which pings will be sent.
+# For ICMP and UDP pings, this calls bind() on the already-opened socket;
+# for TCP pings, just saves the address to be used when the socket is
+# opened.  Returns non-zero if successful; croaks on error.
+sub bind
+{
+  my ($self,
+      $local_addr         # Name or IP number of local interface
+      ) = @_;
+  my ($ip                 # Packed IP number of $local_addr
+      );
+
+  croak("Usage: \$p->bind(\$local_addr)") unless @_ == 2;
+  croak("already bound") if defined($self->{"local_addr"}) &&
+    ($self->{"proto"} eq "udp" || $self->{"proto"} eq "icmp");
+
+  $ip = inet_aton($local_addr);
+  croak("nonexistent local address $local_addr") unless defined($ip);
+  $self->{"local_addr"} = $ip; # Only used if proto is tcp
+
+  if ($self->{"proto"} eq "udp" || $self->{"proto"} eq "icmp")
+  {
+  CORE::bind($self->{"fh"}, sockaddr_in(0, $ip)) ||
+    croak("$self->{'proto'} bind error - $!");
+  }
+  elsif (($self->{"proto"} ne "tcp") && ($self->{"proto"} ne "syn"))
+  {
+    croak("Unknown protocol \"$self->{proto}\" in bind()");
+  }
+
+  return 1;
+}
+
+# Description: A select() wrapper that compensates for platform
+# peculiarities.
+sub mselect
+{
+    if ($_[3] > 0 and $^O eq 'MSWin32') {
+	# On windows, select() doesn't process the message loop,
+	# but sleep() will, allowing alarm() to interrupt the latter.
+	# So we chop up the timeout into smaller pieces and interleave
+	# select() and sleep() calls.
+	my $t = $_[3];
+	my $gran = 0.5;  # polling granularity in seconds
+	my @args = @_;
+	while (1) {
+	    $gran = $t if $gran > $t;
+	    my $nfound = select($_[0], $_[1], $_[2], $gran);
+	    $t -= $gran;
+	    return $nfound if $nfound or !defined($nfound) or $t <= 0;
+
+	    sleep(0);
+	    ($_[0], $_[1], $_[2]) = @args;
+	}
+    }
+    else {
+	return select($_[0], $_[1], $_[2], $_[3]);
+    }
+}
+
+# Description: Allow UDP source endpoint comparision to be
+#              skipped for those remote interfaces that do
+#              not response from the same endpoint.
+
+sub source_verify
+{
+  my $self = shift;
+  $source_verify = 1 unless defined
+    ($source_verify = ((defined $self) && (ref $self)) ? shift() : $self);
+}
+
+# Description: Set whether or not the connect
+# behavior should enforce remote service
+# availability as well as reachability.
+
+sub service_check
+{
+  my $self = shift;
+  $self->{"econnrefused"} = 1 unless defined
+    ($self->{"econnrefused"} = shift());
+}
+
+sub tcp_service_check
+{
+  service_check(@_);
+}
+
+# Description: Set exponential backoff for retransmission.
+# Should be > 1 to retain exponential properties.
+# If set to 0, retransmissions are disabled.
+
+sub retrans
+{
+  my $self = shift;
+  $self->{"retrans"} = shift;
+}
+
+# Description: allows the module to use milliseconds as returned by
+# the Time::HiRes module
+
+$hires = 0;
+sub hires
+{
+  my $self = shift;
+  $hires = 1 unless defined
+    ($hires = ((defined $self) && (ref $self)) ? shift() : $self);
+  require Time::HiRes if $hires;
+}
+
+sub time
+{
+  return $hires ? Time::HiRes::time() : CORE::time();
+}
+
+# Description: Sets or clears the O_NONBLOCK flag on a file handle.
+sub socket_blocking_mode
+{
+  my ($self,
+      $fh,              # the file handle whose flags are to be modified
+      $block) = @_;     # if true then set the blocking
+                        # mode (clear O_NONBLOCK), otherwise
+                        # set the non-blocking mode (set O_NONBLOCK)
+
+  my $flags;
+  if ($^O eq 'MSWin32' || $^O eq 'VMS') {
+      # FIONBIO enables non-blocking sockets on windows and vms.
+      # FIONBIO is (0x80000000|(4<<16)|(ord('f')<<8)|126), as per winsock.h, ioctl.h
+      my $f = 0x8004667e;
+      my $v = pack("L", $block ? 0 : 1);
+      ioctl($fh, $f, $v) or croak("ioctl failed: $!");
+      return;
+  }
+  if ($flags = fcntl($fh, F_GETFL, 0)) {
+    $flags = $block ? ($flags & ~O_NONBLOCK) : ($flags | O_NONBLOCK);
+    if (!fcntl($fh, F_SETFL, $flags)) {
+      croak("fcntl F_SETFL: $!");
+    }
+  } else {
+    croak("fcntl F_GETFL: $!");
+  }
+}
+
+# Description: Ping a host name or IP number with an optional timeout.
+# First lookup the host, and return undef if it is not found.  Otherwise
+# perform the specific ping method based on the protocol.  Return the
+# result of the ping.
+
+sub ping
+{
+  my ($self,
+      $host,              # Name or IP number of host to ping
+      $timeout,           # Seconds after which ping times out
+      ) = @_;
+  my ($ip,                # Packed IP number of $host
+      $ret,               # The return value
+      $ping_time,         # When ping began
+      );
+
+  croak("Usage: \$p->ping(\$host [, \$timeout])") unless @_ == 2 || @_ == 3;
+  $timeout = $self->{"timeout"} unless $timeout;
+  croak("Timeout must be greater than 0 seconds") if $timeout <= 0;
+
+  $ip = inet_aton($host);
+  return () unless defined($ip);      # Does host exist?
+
+  # Dispatch to the appropriate routine.
+  $ping_time = &time();
+  if ($self->{"proto"} eq "external") {
+    $ret = $self->ping_external($ip, $timeout);
+  }
+  elsif ($self->{"proto"} eq "udp") {
+    $ret = $self->ping_udp($ip, $timeout);
+  }
+  elsif ($self->{"proto"} eq "icmp") {
+    $ret = $self->ping_icmp($ip, $timeout);
+  }
+  elsif ($self->{"proto"} eq "tcp") {
+    $ret = $self->ping_tcp($ip, $timeout);
+  }
+  elsif ($self->{"proto"} eq "stream") {
+    $ret = $self->ping_stream($ip, $timeout);
+  }
+  elsif ($self->{"proto"} eq "syn") {
+    $ret = $self->ping_syn($host, $ip, $ping_time, $ping_time+$timeout);
+  } else {
+    croak("Unknown protocol \"$self->{proto}\" in ping()");
+  }
+
+  return wantarray ? ($ret, &time() - $ping_time, inet_ntoa($ip)) : $ret;
+}
+
+# Uses Net::Ping::External to do an external ping.
+sub ping_external {
+  my ($self,
+      $ip,                # Packed IP number of the host
+      $timeout            # Seconds after which ping times out
+     ) = @_;
+
+  eval { require Net::Ping::External; }
+    or croak('Protocol "external" not supported on your system: Net::Ping::External not found');
+  return Net::Ping::External::ping(ip => $ip, timeout => $timeout);
+}
+
+use constant ICMP_ECHOREPLY => 0; # ICMP packet types
+use constant ICMP_ECHO      => 8;
+use constant ICMP_STRUCT    => "C2 n3 A";  # Structure of a minimal ICMP packet
+use constant SUBCODE        => 0; # No ICMP subcode for ECHO and ECHOREPLY
+use constant ICMP_FLAGS     => 0; # No special flags for send or recv
+use constant ICMP_PORT      => 0; # No port with ICMP
+
+sub ping_icmp
+{
+  my ($self,
+      $ip,                # Packed IP number of the host
+      $timeout            # Seconds after which ping times out
+      ) = @_;
+
+  my ($saddr,             # sockaddr_in with port and ip
+      $checksum,          # Checksum of ICMP packet
+      $msg,               # ICMP packet to send
+      $len_msg,           # Length of $msg
+      $rbits,             # Read bits, filehandles for reading
+      $nfound,            # Number of ready filehandles found
+      $finish_time,       # Time ping should be finished
+      $done,              # set to 1 when we are done
+      $ret,               # Return value
+      $recv_msg,          # Received message including IP header
+      $from_saddr,        # sockaddr_in of sender
+      $from_port,         # Port packet was sent from
+      $from_ip,           # Packed IP of sender
+      $from_type,         # ICMP type
+      $from_subcode,      # ICMP subcode
+      $from_chk,          # ICMP packet checksum
+      $from_pid,          # ICMP packet id
+      $from_seq,          # ICMP packet sequence
+      $from_msg           # ICMP message
+      );
+
+  $self->{"seq"} = ($self->{"seq"} + 1) % 65536; # Increment sequence
+  $checksum = 0;                          # No checksum for starters
+  $msg = pack(ICMP_STRUCT . $self->{"data_size"}, ICMP_ECHO, SUBCODE,
+              $checksum, $self->{"pid"}, $self->{"seq"}, $self->{"data"});
+  $checksum = Net::Ping->checksum($msg);
+  $msg = pack(ICMP_STRUCT . $self->{"data_size"}, ICMP_ECHO, SUBCODE,
+              $checksum, $self->{"pid"}, $self->{"seq"}, $self->{"data"});
+  $len_msg = length($msg);
+  $saddr = sockaddr_in(ICMP_PORT, $ip);
+  $self->{"from_ip"} = undef;
+  $self->{"from_type"} = undef;
+  $self->{"from_subcode"} = undef;
+  send($self->{"fh"}, $msg, ICMP_FLAGS, $saddr); # Send the message
+
+  $rbits = "";
+  vec($rbits, $self->{"fh"}->fileno(), 1) = 1;
+  $ret = 0;
+  $done = 0;
+  $finish_time = &time() + $timeout;      # Must be done by this time
+  while (!$done && $timeout > 0)          # Keep trying if we have time
+  {
+    $nfound = mselect((my $rout=$rbits), undef, undef, $timeout); # Wait for packet
+    $timeout = $finish_time - &time();    # Get remaining time
+    if (!defined($nfound))                # Hmm, a strange error
+    {
+      $ret = undef;
+      $done = 1;
+    }
+    elsif ($nfound)                     # Got a packet from somewhere
+    {
+      $recv_msg = "";
+      $from_pid = -1;
+      $from_seq = -1;
+      $from_saddr = recv($self->{"fh"}, $recv_msg, 1500, ICMP_FLAGS);
+      ($from_port, $from_ip) = sockaddr_in($from_saddr);
+      ($from_type, $from_subcode) = unpack("C2", substr($recv_msg, 20, 2));
+      if ($from_type == ICMP_ECHOREPLY) {
+        ($from_pid, $from_seq) = unpack("n3", substr($recv_msg, 24, 4))
+          if length $recv_msg >= 28;
+      } else {
+        ($from_pid, $from_seq) = unpack("n3", substr($recv_msg, 52, 4))
+          if length $recv_msg >= 56;
+      }
+      $self->{"from_ip"} = $from_ip;
+      $self->{"from_type"} = $from_type;
+      $self->{"from_subcode"} = $from_subcode;
+      if (($from_pid == $self->{"pid"}) && # Does the packet check out?
+          ($from_seq == $self->{"seq"})) {
+        if ($from_type == ICMP_ECHOREPLY){
+          $ret = 1;
+        }
+        $done = 1;
+      }
+    } else {     # Oops, timed out
+      $done = 1;
+    }
+  }
+  return $ret;
+}
+
+sub icmp_result {
+  my ($self) = @_;
+  my $ip = $self->{"from_ip"} || "";
+  $ip = "\0\0\0\0" unless 4 == length $ip;
+  return (inet_ntoa($ip),($self->{"from_type"} || 0), ($self->{"from_subcode"} || 0));
+}
+
+# Description:  Do a checksum on the message.  Basically sum all of
+# the short words and fold the high order bits into the low order bits.
+
+sub checksum
+{
+  my ($class,
+      $msg            # The message to checksum
+      ) = @_;
+  my ($len_msg,       # Length of the message
+      $num_short,     # The number of short words in the message
+      $short,         # One short word
+      $chk            # The checksum
+      );
+
+  $len_msg = length($msg);
+  $num_short = int($len_msg / 2);
+  $chk = 0;
+  foreach $short (unpack("n$num_short", $msg))
+  {
+    $chk += $short;
+  }                                           # Add the odd byte in
+  $chk += (unpack("C", substr($msg, $len_msg - 1, 1)) << 8) if $len_msg % 2;
+  $chk = ($chk >> 16) + ($chk & 0xffff);      # Fold high into low
+  return(~(($chk >> 16) + $chk) & 0xffff);    # Again and complement
+}
+
+
+# Description:  Perform a tcp echo ping.  Since a tcp connection is
+# host specific, we have to open and close each connection here.  We
+# can't just leave a socket open.  Because of the robust nature of
+# tcp, it will take a while before it gives up trying to establish a
+# connection.  Therefore, we use select() on a non-blocking socket to
+# check against our timeout.  No data bytes are actually
+# sent since the successful establishment of a connection is proof
+# enough of the reachability of the remote host.  Also, tcp is
+# expensive and doesn't need our help to add to the overhead.
+
+sub ping_tcp
+{
+  my ($self,
+      $ip,                # Packed IP number of the host
+      $timeout            # Seconds after which ping times out
+      ) = @_;
+  my ($ret                # The return value
+      );
+
+  $! = 0;
+  $ret = $self -> tcp_connect( $ip, $timeout);
+  if (!$self->{"econnrefused"} &&
+      $! == ECONNREFUSED) {
+    $ret = 1;  # "Connection refused" means reachable
+  }
+  $self->{"fh"}->close();
+  return $ret;
+}
+
+sub tcp_connect
+{
+  my ($self,
+      $ip,                # Packed IP number of the host
+      $timeout            # Seconds after which connect times out
+      ) = @_;
+  my ($saddr);            # Packed IP and Port
+
+  $saddr = sockaddr_in($self->{"port_num"}, $ip);
+
+  my $ret = 0;            # Default to unreachable
+
+  my $do_socket = sub {
+    socket($self->{"fh"}, PF_INET, SOCK_STREAM, $self->{"proto_num"}) ||
+      croak("tcp socket error - $!");
+    if (defined $self->{"local_addr"} &&
+        !CORE::bind($self->{"fh"}, sockaddr_in(0, $self->{"local_addr"}))) {
+      croak("tcp bind error - $!");
+    }
+    if ($self->{'device'}) {
+      setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'}))
+        or croak("error binding to device $self->{'device'} $!");
+    }
+    if ($self->{'tos'}) {
+      setsockopt($self->{"fh"}, SOL_IP, IP_TOS(), pack("I*", $self->{'tos'}))
+        or croak "error configuring tos to $self->{'tos'} $!";
+    }
+  };
+  my $do_connect = sub {
+    $self->{"ip"} = $ip;
+    # ECONNREFUSED is 10061 on MSWin32. If we pass it as child error through $?,
+    # we'll get (10061 & 255) = 77, so we cannot check it in the parent process.
+    return ($ret = connect($self->{"fh"}, $saddr) || ($! == ECONNREFUSED && !$self->{"econnrefused"}));
+  };
+  my $do_connect_nb = sub {
+    # Set O_NONBLOCK property on filehandle
+    $self->socket_blocking_mode($self->{"fh"}, 0);
+
+    # start the connection attempt
+    if (!connect($self->{"fh"}, $saddr)) {
+      if ($! == ECONNREFUSED) {
+        $ret = 1 unless $self->{"econnrefused"};
+      } elsif ($! != EINPROGRESS && ($^O ne 'MSWin32' || $! != EWOULDBLOCK)) {
+        # EINPROGRESS is the expected error code after a connect()
+        # on a non-blocking socket.  But if the kernel immediately
+        # determined that this connect() will never work,
+        # Simply respond with "unreachable" status.
+        # (This can occur on some platforms with errno
+        # EHOSTUNREACH or ENETUNREACH.)
+        return 0;
+      } else {
+        # Got the expected EINPROGRESS.
+        # Just wait for connection completion...
+        my ($wbits, $wout, $wexc);
+        $wout = $wexc = $wbits = "";
+        vec($wbits, $self->{"fh"}->fileno, 1) = 1;
+
+        my $nfound = mselect(undef,
+			    ($wout = $wbits),
+			    ($^O eq 'MSWin32' ? ($wexc = $wbits) : undef),
+			    $timeout);
+        warn("select: $!") unless defined $nfound;
+
+        if ($nfound && vec($wout, $self->{"fh"}->fileno, 1)) {
+          # the socket is ready for writing so the connection
+          # attempt completed. test whether the connection
+          # attempt was successful or not
+
+          if (getpeername($self->{"fh"})) {
+            # Connection established to remote host
+            $ret = 1;
+          } else {
+            # TCP ACK will never come from this host
+            # because there was an error connecting.
+
+            # This should set $! to the correct error.
+            my $char;
+            sysread($self->{"fh"},$char,1);
+            $! = ECONNREFUSED if ($! == EAGAIN && $^O =~ /cygwin/i);
+
+            $ret = 1 if (!$self->{"econnrefused"}
+                         && $! == ECONNREFUSED);
+          }
+        } else {
+          # the connection attempt timed out (or there were connect
+	  # errors on Windows)
+	  if ($^O =~ 'MSWin32') {
+	      # If the connect will fail on a non-blocking socket,
+	      # winsock reports ECONNREFUSED as an exception, and we
+	      # need to fetch the socket-level error code via getsockopt()
+	      # instead of using the thread-level error code that is in $!.
+	      if ($nfound && vec($wexc, $self->{"fh"}->fileno, 1)) {
+		  $! = unpack("i", getsockopt($self->{"fh"}, SOL_SOCKET,
+			                      SO_ERROR));
+	      }
+	  }
+        }
+      }
+    } else {
+      # Connection established to remote host
+      $ret = 1;
+    }
+
+    # Unset O_NONBLOCK property on filehandle
+    $self->socket_blocking_mode($self->{"fh"}, 1);
+    $self->{"ip"} = $ip;
+    return $ret;
+  };
+
+  if ($syn_forking) {
+    # Buggy Winsock API doesn't allow nonblocking connect.
+    # Hence, if our OS is Windows, we need to create a separate
+    # process to do the blocking connect attempt.
+    # XXX Above comments are not true at least for Win2K, where
+    # nonblocking connect works.
+
+    $| = 1; # Clear buffer prior to fork to prevent duplicate flushing.
+    $self->{'tcp_chld'} = fork;
+    if (!$self->{'tcp_chld'}) {
+      if (!defined $self->{'tcp_chld'}) {
+        # Fork did not work
+        warn "Fork error: $!";
+        return 0;
+      }
+      &{ $do_socket }();
+
+      # Try a slow blocking connect() call
+      # and report the status to the parent.
+      if ( &{ $do_connect }() ) {
+        $self->{"fh"}->close();
+        # No error
+        exit 0;
+      } else {
+        # Pass the error status to the parent
+        # Make sure that $! <= 255
+        exit($! <= 255 ? $! : 255);
+      }
+    }
+
+    &{ $do_socket }();
+
+    my $patience = &time() + $timeout;
+
+    my ($child, $child_errno);
+    $? = 0; $child_errno = 0;
+    # Wait up to the timeout
+    # And clean off the zombie
+    do {
+      $child = waitpid($self->{'tcp_chld'}, &WNOHANG());
+      $child_errno = $? >> 8;
+      select(undef, undef, undef, 0.1);
+    } while &time() < $patience && $child != $self->{'tcp_chld'};
+
+    if ($child == $self->{'tcp_chld'}) {
+      if ($self->{"proto"} eq "stream") {
+        # We need the socket connected here, in parent
+        # Should be safe to connect because the child finished
+        # within the timeout
+        &{ $do_connect }();
+      }
+      # $ret cannot be set by the child process
+      $ret = !$child_errno;
+    } else {
+      # Time must have run out.
+      # Put that choking client out of its misery
+      kill "KILL", $self->{'tcp_chld'};
+      # Clean off the zombie
+      waitpid($self->{'tcp_chld'}, 0);
+      $ret = 0;
+    }
+    delete $self->{'tcp_chld'};
+    $! = $child_errno;
+  } else {
+    # Otherwise don't waste the resources to fork
+
+    &{ $do_socket }();
+
+    &{ $do_connect_nb }();
+  }
+
+  return $ret;
+}
+
+sub DESTROY {
+  my $self = shift;
+  if ($self->{'proto'} eq 'tcp' &&
+      $self->{'tcp_chld'}) {
+    # Put that choking client out of its misery
+    kill "KILL", $self->{'tcp_chld'};
+    # Clean off the zombie
+    waitpid($self->{'tcp_chld'}, 0);
+  }
+}
+
+# This writes the given string to the socket and then reads it
+# back.  It returns 1 on success, 0 on failure.
+sub tcp_echo
+{
+  my $self = shift;
+  my $timeout = shift;
+  my $pingstring = shift;
+
+  my $ret = undef;
+  my $time = &time();
+  my $wrstr = $pingstring;
+  my $rdstr = "";
+
+  eval <<'EOM';
+    do {
+      my $rin = "";
+      vec($rin, $self->{"fh"}->fileno(), 1) = 1;
+
+      my $rout = undef;
+      if($wrstr) {
+        $rout = "";
+        vec($rout, $self->{"fh"}->fileno(), 1) = 1;
+      }
+
+      if(mselect($rin, $rout, undef, ($time + $timeout) - &time())) {
+
+        if($rout && vec($rout,$self->{"fh"}->fileno(),1)) {
+          my $num = syswrite($self->{"fh"}, $wrstr, length $wrstr);
+          if($num) {
+            # If it was a partial write, update and try again.
+            $wrstr = substr($wrstr,$num);
+          } else {
+            # There was an error.
+            $ret = 0;
+          }
+        }
+
+        if(vec($rin,$self->{"fh"}->fileno(),1)) {
+          my $reply;
+          if(sysread($self->{"fh"},$reply,length($pingstring)-length($rdstr))) {
+            $rdstr .= $reply;
+            $ret = 1 if $rdstr eq $pingstring;
+          } else {
+            # There was an error.
+            $ret = 0;
+          }
+        }
+
+      }
+    } until &time() > ($time + $timeout) || defined($ret);
+EOM
+
+  return $ret;
+}
+
+
+
+
+# Description: Perform a stream ping.  If the tcp connection isn't
+# already open, it opens it.  It then sends some data and waits for
+# a reply.  It leaves the stream open on exit.
+
+sub ping_stream
+{
+  my ($self,
+      $ip,                # Packed IP number of the host
+      $timeout            # Seconds after which ping times out
+      ) = @_;
+
+  # Open the stream if it's not already open
+  if(!defined $self->{"fh"}->fileno()) {
+    $self->tcp_connect($ip, $timeout) or return 0;
+  }
+
+  croak "tried to switch servers while stream pinging"
+    if $self->{"ip"} ne $ip;
+
+  return $self->tcp_echo($timeout, $pingstring);
+}
+
+# Description: opens the stream.  You would do this if you want to
+# separate the overhead of opening the stream from the first ping.
+
+sub open
+{
+  my ($self,
+      $host,              # Host or IP address
+      $timeout            # Seconds after which open times out
+      ) = @_;
+
+  my ($ip);               # Packed IP number of the host
+  $ip = inet_aton($host);
+  $timeout = $self->{"timeout"} unless $timeout;
+
+  if($self->{"proto"} eq "stream") {
+    if(defined($self->{"fh"}->fileno())) {
+      croak("socket is already open");
+    } else {
+      $self->tcp_connect($ip, $timeout);
+    }
+  }
+}
+
+
+# Description:  Perform a udp echo ping.  Construct a message of
+# at least the one-byte sequence number and any additional data bytes.
+# Send the message out and wait for a message to come back.  If we
+# get a message, make sure all of its parts match.  If they do, we are
+# done.  Otherwise go back and wait for the message until we run out
+# of time.  Return the result of our efforts.
+
+use constant UDP_FLAGS => 0; # Nothing special on send or recv
+sub ping_udp
+{
+  my ($self,
+      $ip,                # Packed IP number of the host
+      $timeout            # Seconds after which ping times out
+      ) = @_;
+
+  my ($saddr,             # sockaddr_in with port and ip
+      $ret,               # The return value
+      $msg,               # Message to be echoed
+      $finish_time,       # Time ping should be finished
+      $flush,             # Whether socket needs to be disconnected
+      $connect,           # Whether socket needs to be connected
+      $done,              # Set to 1 when we are done pinging
+      $rbits,             # Read bits, filehandles for reading
+      $nfound,            # Number of ready filehandles found
+      $from_saddr,        # sockaddr_in of sender
+      $from_msg,          # Characters echoed by $host
+      $from_port,         # Port message was echoed from
+      $from_ip            # Packed IP number of sender
+      );
+
+  $saddr = sockaddr_in($self->{"port_num"}, $ip);
+  $self->{"seq"} = ($self->{"seq"} + 1) % 256;    # Increment sequence
+  $msg = chr($self->{"seq"}) . $self->{"data"};   # Add data if any
+
+  if ($self->{"connected"}) {
+    if ($self->{"connected"} ne $saddr) {
+      # Still connected to wrong destination.
+      # Need to flush out the old one.
+      $flush = 1;
+    }
+  } else {
+    # Not connected yet.
+    # Need to connect() before send()
+    $connect = 1;
+  }
+
+  # Have to connect() and send() instead of sendto()
+  # in order to pick up on the ECONNREFUSED setting
+  # from recv() or double send() errno as utilized in
+  # the concept by rdw @ perlmonks.  See:
+  # http://perlmonks.thepen.com/42898.html
+  if ($flush) {
+    # Need to socket() again to flush the descriptor
+    # This will disconnect from the old saddr.
+    socket($self->{"fh"}, PF_INET, SOCK_DGRAM,
+           $self->{"proto_num"});
+  }
+  # Connect the socket if it isn't already connected
+  # to the right destination.
+  if ($flush || $connect) {
+    connect($self->{"fh"}, $saddr);               # Tie destination to socket
+    $self->{"connected"} = $saddr;
+  }
+  send($self->{"fh"}, $msg, UDP_FLAGS);           # Send it
+
+  $rbits = "";
+  vec($rbits, $self->{"fh"}->fileno(), 1) = 1;
+  $ret = 0;                   # Default to unreachable
+  $done = 0;
+  my $retrans = 0.01;
+  my $factor = $self->{"retrans"};
+  $finish_time = &time() + $timeout;       # Ping needs to be done by then
+  while (!$done && $timeout > 0)
+  {
+    if ($factor > 1)
+    {
+      $timeout = $retrans if $timeout > $retrans;
+      $retrans*= $factor; # Exponential backoff
+    }
+    $nfound  = mselect((my $rout=$rbits), undef, undef, $timeout); # Wait for response
+    my $why = $!;
+    $timeout = $finish_time - &time();   # Get remaining time
+
+    if (!defined($nfound))  # Hmm, a strange error
+    {
+      $ret = undef;
+      $done = 1;
+    }
+    elsif ($nfound)         # A packet is waiting
+    {
+      $from_msg = "";
+      $from_saddr = recv($self->{"fh"}, $from_msg, 1500, UDP_FLAGS);
+      if (!$from_saddr) {
+        # For example an unreachable host will make recv() fail.
+        if (!$self->{"econnrefused"} &&
+            ($! == ECONNREFUSED ||
+             $! == ECONNRESET)) {
+          # "Connection refused" means reachable
+          # Good, continue
+          $ret = 1;
+        }
+        $done = 1;
+      } else {
+        ($from_port, $from_ip) = sockaddr_in($from_saddr);
+        if (!$source_verify ||
+            (($from_ip eq $ip) &&        # Does the packet check out?
+             ($from_port == $self->{"port_num"}) &&
+             ($from_msg eq $msg)))
+        {
+          $ret = 1;       # It's a winner
+          $done = 1;
+        }
+      }
+    }
+    elsif ($timeout <= 0)              # Oops, timed out
+    {
+      $done = 1;
+    }
+    else
+    {
+      # Send another in case the last one dropped
+      if (send($self->{"fh"}, $msg, UDP_FLAGS)) {
+        # Another send worked?  The previous udp packet
+        # must have gotten lost or is still in transit.
+        # Hopefully this new packet will arrive safely.
+      } else {
+        if (!$self->{"econnrefused"} &&
+            $! == ECONNREFUSED) {
+          # "Connection refused" means reachable
+          # Good, continue
+          $ret = 1;
+        }
+        $done = 1;
+      }
+    }
+  }
+  return $ret;
+}
+
+# Description: Send a TCP SYN packet to host specified.
+sub ping_syn
+{
+  my $self = shift;
+  my $host = shift;
+  my $ip = shift;
+  my $start_time = shift;
+  my $stop_time = shift;
+
+  if ($syn_forking) {
+    return $self->ping_syn_fork($host, $ip, $start_time, $stop_time);
+  }
+
+  my $fh = FileHandle->new();
+  my $saddr = sockaddr_in($self->{"port_num"}, $ip);
+
+  # Create TCP socket
+  if (!socket ($fh, PF_INET, SOCK_STREAM, $self->{"proto_num"})) {
+    croak("tcp socket error - $!");
+  }
+
+  if (defined $self->{"local_addr"} &&
+      !CORE::bind($fh, sockaddr_in(0, $self->{"local_addr"}))) {
+    croak("tcp bind error - $!");
+  }
+
+  if ($self->{'device'}) {
+    setsockopt($fh, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'}))
+      or croak("error binding to device $self->{'device'} $!");
+  }
+  if ($self->{'tos'}) {
+    setsockopt($fh, SOL_IP, IP_TOS(), pack("I*", $self->{'tos'}))
+      or croak "error configuring tos to $self->{'tos'} $!";
+  }
+  # Set O_NONBLOCK property on filehandle
+  $self->socket_blocking_mode($fh, 0);
+
+  # Attempt the non-blocking connect
+  # by just sending the TCP SYN packet
+  if (connect($fh, $saddr)) {
+    # Non-blocking, yet still connected?
+    # Must have connected very quickly,
+    # or else it wasn't very non-blocking.
+    #warn "WARNING: Nonblocking connect connected anyway? ($^O)";
+  } else {
+    # Error occurred connecting.
+    if ($! == EINPROGRESS || ($^O eq 'MSWin32' && $! == EWOULDBLOCK)) {
+      # The connection is just still in progress.
+      # This is the expected condition.
+    } else {
+      # Just save the error and continue on.
+      # The ack() can check the status later.
+      $self->{"bad"}->{$host} = $!;
+    }
+  }
+
+  my $entry = [ $host, $ip, $fh, $start_time, $stop_time ];
+  $self->{"syn"}->{$fh->fileno} = $entry;
+  if ($self->{"stop_time"} < $stop_time) {
+    $self->{"stop_time"} = $stop_time;
+  }
+  vec($self->{"wbits"}, $fh->fileno, 1) = 1;
+
+  return 1;
+}
+
+sub ping_syn_fork {
+  my ($self, $host, $ip, $start_time, $stop_time) = @_;
+
+  # Buggy Winsock API doesn't allow nonblocking connect.
+  # Hence, if our OS is Windows, we need to create a separate
+  # process to do the blocking connect attempt.
+  my $pid = fork();
+  if (defined $pid) {
+    if ($pid) {
+      # Parent process
+      my $entry = [ $host, $ip, $pid, $start_time, $stop_time ];
+      $self->{"syn"}->{$pid} = $entry;
+      if ($self->{"stop_time"} < $stop_time) {
+        $self->{"stop_time"} = $stop_time;
+      }
+    } else {
+      # Child process
+      my $saddr = sockaddr_in($self->{"port_num"}, $ip);
+
+      # Create TCP socket
+      if (!socket ($self->{"fh"}, PF_INET, SOCK_STREAM, $self->{"proto_num"})) {
+        croak("tcp socket error - $!");
+      }
+
+      if (defined $self->{"local_addr"} &&
+          !CORE::bind($self->{"fh"}, sockaddr_in(0, $self->{"local_addr"}))) {
+        croak("tcp bind error - $!");
+      }
+
+      if ($self->{'device'}) {
+        setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'}))
+          or croak("error binding to device $self->{'device'} $!");
+      }
+      if ($self->{'tos'}) {
+        setsockopt($self->{"fh"}, SOL_IP, IP_TOS(), pack("I*", $self->{'tos'}))
+          or croak "error configuring tos to $self->{'tos'} $!";
+      }
+
+      $!=0;
+      # Try to connect (could take a long time)
+      connect($self->{"fh"}, $saddr);
+      # Notify parent of connect error status
+      my $err = $!+0;
+      my $wrstr = "$$ $err";
+      # Force to 16 chars including \n
+      $wrstr .= " "x(15 - length $wrstr). "\n";
+      syswrite($self->{"fork_wr"}, $wrstr, length $wrstr);
+      exit;
+    }
+  } else {
+    # fork() failed?
+    die "fork: $!";
+  }
+  return 1;
+}
+
+# Description: Wait for TCP ACK from host specified
+# from ping_syn above.  If no host is specified, wait
+# for TCP ACK from any of the hosts in the SYN queue.
+sub ack
+{
+  my $self = shift;
+
+  if ($self->{"proto"} eq "syn") {
+    if ($syn_forking) {
+      my @answer = $self->ack_unfork(shift);
+      return wantarray ? @answer : $answer[0];
+    }
+    my $wbits = "";
+    my $stop_time = 0;
+    if (my $host = shift) {
+      # Host passed as arg
+      if (exists $self->{"bad"}->{$host}) {
+        if (!$self->{"econnrefused"} &&
+            $self->{"bad"}->{ $host } &&
+            (($! = ECONNREFUSED)>0) &&
+            $self->{"bad"}->{ $host } eq "$!") {
+          # "Connection refused" means reachable
+          # Good, continue
+        } else {
+          # ECONNREFUSED means no good
+          return ();
+        }
+      }
+      my $host_fd = undef;
+      foreach my $fd (keys %{ $self->{"syn"} }) {
+        my $entry = $self->{"syn"}->{$fd};
+        if ($entry->[0] eq $host) {
+          $host_fd = $fd;
+          $stop_time = $entry->[4]
+            || croak("Corrupted SYN entry for [$host]");
+          last;
+        }
+      }
+      croak("ack called on [$host] without calling ping first!")
+        unless defined $host_fd;
+      vec($wbits, $host_fd, 1) = 1;
+    } else {
+      # No $host passed so scan all hosts
+      # Use the latest stop_time
+      $stop_time = $self->{"stop_time"};
+      # Use all the bits
+      $wbits = $self->{"wbits"};
+    }
+
+    while ($wbits !~ /^\0*\z/) {
+      my $timeout = $stop_time - &time();
+      # Force a minimum of 10 ms timeout.
+      $timeout = 0.01 if $timeout <= 0.01;
+
+      my $winner_fd = undef;
+      my $wout = $wbits;
+      my $fd = 0;
+      # Do "bad" fds from $wbits first
+      while ($wout !~ /^\0*\z/) {
+        if (vec($wout, $fd, 1)) {
+          # Wipe it from future scanning.
+          vec($wout, $fd, 1) = 0;
+          if (my $entry = $self->{"syn"}->{$fd}) {
+            if ($self->{"bad"}->{ $entry->[0] }) {
+              $winner_fd = $fd;
+              last;
+            }
+          }
+        }
+        $fd++;
+      }
+
+      if (defined($winner_fd) or my $nfound = mselect(undef, ($wout=$wbits), undef, $timeout)) {
+        if (defined $winner_fd) {
+          $fd = $winner_fd;
+        } else {
+          # Done waiting for one of the ACKs
+          $fd = 0;
+          # Determine which one
+          while ($wout !~ /^\0*\z/ &&
+                 !vec($wout, $fd, 1)) {
+            $fd++;
+          }
+        }
+        if (my $entry = $self->{"syn"}->{$fd}) {
+          # Wipe it from future scanning.
+          delete $self->{"syn"}->{$fd};
+          vec($self->{"wbits"}, $fd, 1) = 0;
+          vec($wbits, $fd, 1) = 0;
+          if (!$self->{"econnrefused"} &&
+              $self->{"bad"}->{ $entry->[0] } &&
+              (($! = ECONNREFUSED)>0) &&
+              $self->{"bad"}->{ $entry->[0] } eq "$!") {
+            # "Connection refused" means reachable
+            # Good, continue
+          } elsif (getpeername($entry->[2])) {
+            # Connection established to remote host
+            # Good, continue
+          } else {
+            # TCP ACK will never come from this host
+            # because there was an error connecting.
+
+            # This should set $! to the correct error.
+            my $char;
+            sysread($entry->[2],$char,1);
+            # Store the excuse why the connection failed.
+            $self->{"bad"}->{$entry->[0]} = $!;
+            if (!$self->{"econnrefused"} &&
+                (($! == ECONNREFUSED) ||
+                 ($! == EAGAIN && $^O =~ /cygwin/i))) {
+              # "Connection refused" means reachable
+              # Good, continue
+            } else {
+              # No good, try the next socket...
+              next;
+            }
+          }
+          # Everything passed okay, return the answer
+          return wantarray ?
+            ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]))
+            : $entry->[0];
+        } else {
+          warn "Corrupted SYN entry: unknown fd [$fd] ready!";
+          vec($wbits, $fd, 1) = 0;
+          vec($self->{"wbits"}, $fd, 1) = 0;
+        }
+      } elsif (defined $nfound) {
+        # Timed out waiting for ACK
+        foreach my $fd (keys %{ $self->{"syn"} }) {
+          if (vec($wbits, $fd, 1)) {
+            my $entry = $self->{"syn"}->{$fd};
+            $self->{"bad"}->{$entry->[0]} = "Timed out";
+            vec($wbits, $fd, 1) = 0;
+            vec($self->{"wbits"}, $fd, 1) = 0;
+            delete $self->{"syn"}->{$fd};
+          }
+        }
+      } else {
+        # Weird error occurred with select()
+        warn("select: $!");
+        $self->{"syn"} = {};
+        $wbits = "";
+      }
+    }
+  }
+  return ();
+}
+
+sub ack_unfork {
+  my ($self,$host) = @_;
+  my $stop_time = $self->{"stop_time"};
+  if ($host) {
+    # Host passed as arg
+    if (my $entry = $self->{"good"}->{$host}) {
+      delete $self->{"good"}->{$host};
+      return ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]));
+    }
+  }
+
+  my $rbits = "";
+  my $timeout;
+
+  if (keys %{ $self->{"syn"} }) {
+    # Scan all hosts that are left
+    vec($rbits, fileno($self->{"fork_rd"}), 1) = 1;
+    $timeout = $stop_time - &time();
+    # Force a minimum of 10 ms timeout.
+    $timeout = 0.01 if $timeout < 0.01;
+  } else {
+    # No hosts left to wait for
+    $timeout = 0;
+  }
+
+  if ($timeout > 0) {
+    my $nfound;
+    while ( keys %{ $self->{"syn"} } and
+           $nfound = mselect((my $rout=$rbits), undef, undef, $timeout)) {
+      # Done waiting for one of the ACKs
+      if (!sysread($self->{"fork_rd"}, $_, 16)) {
+        # Socket closed, which means all children are done.
+        return ();
+      }
+      my ($pid, $how) = split;
+      if ($pid) {
+        # Flush the zombie
+        waitpid($pid, 0);
+        if (my $entry = $self->{"syn"}->{$pid}) {
+          # Connection attempt to remote host is done
+          delete $self->{"syn"}->{$pid};
+          if (!$how || # If there was no error connecting
+              (!$self->{"econnrefused"} &&
+               $how == ECONNREFUSED)) {  # "Connection refused" means reachable
+            if ($host && $entry->[0] ne $host) {
+              # A good connection, but not the host we need.
+              # Move it from the "syn" hash to the "good" hash.
+              $self->{"good"}->{$entry->[0]} = $entry;
+              # And wait for the next winner
+              next;
+            }
+            return ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]));
+          }
+        } else {
+          # Should never happen
+          die "Unknown ping from pid [$pid]";
+        }
+      } else {
+        die "Empty response from status socket?";
+      }
+    }
+    if (defined $nfound) {
+      # Timed out waiting for ACK status
+    } else {
+      # Weird error occurred with select()
+      warn("select: $!");
+    }
+  }
+  if (my @synners = keys %{ $self->{"syn"} }) {
+    # Kill all the synners
+    kill 9, @synners;
+    foreach my $pid (@synners) {
+      # Wait for the deaths to finish
+      # Then flush off the zombie
+      waitpid($pid, 0);
+    }
+  }
+  $self->{"syn"} = {};
+  return ();
+}
+
+# Description:  Tell why the ack() failed
+sub nack {
+  my $self = shift;
+  my $host = shift || croak('Usage> nack($failed_ack_host)');
+  return $self->{"bad"}->{$host} || undef;
+}
+
+# Description:  Close the connection.
+
+sub close
+{
+  my ($self) = @_;
+
+  if ($self->{"proto"} eq "syn") {
+    delete $self->{"syn"};
+  } elsif ($self->{"proto"} eq "tcp") {
+    # The connection will already be closed
+  } else {
+    $self->{"fh"}->close();
+  }
+}
+
+
+1;
+__END__
+
+=head1 NAME
+
+Net::Ping - check a remote host for reachability
+
+=head1 SYNOPSIS
+
+    use Net::Ping;
+
+    $p = Net::Ping->new();
+    print "$host is alive.\n" if $p->ping($host);
+    $p->close();
+
+    $p = Net::Ping->new("icmp");
+    $p->bind($my_addr); # Specify source interface of pings
+    foreach $host (@host_array)
+    {
+        print "$host is ";
+        print "NOT " unless $p->ping($host, 2);
+        print "reachable.\n";
+        sleep(1);
+    }
+    $p->close();
+
+    $p = Net::Ping->new("tcp", 2);
+    # Try connecting to the www port instead of the echo port
+    $p->{port_num} = getservbyname("http", "tcp");
+    while ($stop_time > time())
+    {
+        print "$host not reachable ", scalar(localtime()), "\n"
+            unless $p->ping($host);
+        sleep(300);
+    }
+    undef($p);
+
+    # Like tcp protocol, but with many hosts
+    $p = Net::Ping->new("syn");
+    $p->{port_num} = getservbyname("http", "tcp");
+    foreach $host (@host_array) {
+      $p->ping($host);
+    }
+    while (($host,$rtt,$ip) = $p->ack) {
+      print "HOST: $host [$ip] ACKed in $rtt seconds.\n";
+    }
+
+    # High precision syntax (requires Time::HiRes)
+    $p = Net::Ping->new();
+    $p->hires();
+    ($ret, $duration, $ip) = $p->ping($host, 5.5);
+    printf("$host [ip: $ip] is alive (packet return time: %.2f ms)\n", 1000 * $duration)
+      if $ret;
+    $p->close();
+
+    # For backward compatibility
+    print "$host is alive.\n" if pingecho($host);
+
+=head1 DESCRIPTION
+
+This module contains methods to test the reachability of remote
+hosts on a network.  A ping object is first created with optional
+parameters, a variable number of hosts may be pinged multiple
+times and then the connection is closed.
+
+You may choose one of six different protocols to use for the
+ping. The "tcp" protocol is the default. Note that a live remote host
+may still fail to be pingable by one or more of these protocols. For
+example, www.microsoft.com is generally alive but not "icmp" pingable.
+
+With the "tcp" protocol the ping() method attempts to establish a
+connection to the remote host's echo port.  If the connection is
+successfully established, the remote host is considered reachable.  No
+data is actually echoed.  This protocol does not require any special
+privileges but has higher overhead than the "udp" and "icmp" protocols.
+
+Specifying the "udp" protocol causes the ping() method to send a udp
+packet to the remote host's echo port.  If the echoed packet is
+received from the remote host and the received packet contains the
+same data as the packet that was sent, the remote host is considered
+reachable.  This protocol does not require any special privileges.
+It should be borne in mind that, for a udp ping, a host
+will be reported as unreachable if it is not running the
+appropriate echo service.  For Unix-like systems see L<inetd(8)>
+for more information.
+
+If the "icmp" protocol is specified, the ping() method sends an icmp
+echo message to the remote host, which is what the UNIX ping program
+does.  If the echoed message is received from the remote host and
+the echoed information is correct, the remote host is considered
+reachable.  Specifying the "icmp" protocol requires that the program
+be run as root or that the program be setuid to root.
+
+If the "external" protocol is specified, the ping() method attempts to
+use the C<Net::Ping::External> module to ping the remote host.
+C<Net::Ping::External> interfaces with your system's default C<ping>
+utility to perform the ping, and generally produces relatively
+accurate results. If C<Net::Ping::External> if not installed on your
+system, specifying the "external" protocol will result in an error.
+
+If the "syn" protocol is specified, the ping() method will only
+send a TCP SYN packet to the remote host then immediately return.
+If the syn packet was sent successfully, it will return a true value,
+otherwise it will return false.  NOTE: Unlike the other protocols,
+the return value does NOT determine if the remote host is alive or
+not since the full TCP three-way handshake may not have completed
+yet.  The remote host is only considered reachable if it receives
+a TCP ACK within the timeout specifed.  To begin waiting for the
+ACK packets, use the ack() method as explained below.  Use the
+"syn" protocol instead the "tcp" protocol to determine reachability
+of multiple destinations simultaneously by sending parallel TCP
+SYN packets.  It will not block while testing each remote host.
+demo/fping is provided in this distribution to demonstrate the
+"syn" protocol as an example.
+This protocol does not require any special privileges.
+
+=head2 Functions
+
+=over 4
+
+=item Net::Ping->new([$proto [, $def_timeout [, $bytes [, $device [, $tos ]]]]]);
+
+Create a new ping object.  All of the parameters are optional.  $proto
+specifies the protocol to use when doing a ping.  The current choices
+are "tcp", "udp", "icmp", "stream", "syn", or "external".
+The default is "tcp".
+
+If a default timeout ($def_timeout) in seconds is provided, it is used
+when a timeout is not given to the ping() method (below).  The timeout
+must be greater than 0 and the default, if not specified, is 5 seconds.
+
+If the number of data bytes ($bytes) is given, that many data bytes
+are included in the ping packet sent to the remote host. The number of
+data bytes is ignored if the protocol is "tcp".  The minimum (and
+default) number of data bytes is 1 if the protocol is "udp" and 0
+otherwise.  The maximum number of data bytes that can be specified is
+1024.
+
+If $device is given, this device is used to bind the source endpoint
+before sending the ping packet.  I beleive this only works with
+superuser privileges and with udp and icmp protocols at this time.
+
+If $tos is given, this ToS is configured into the soscket.
+
+=item $p->ping($host [, $timeout]);
+
+Ping the remote host and wait for a response.  $host can be either the
+hostname or the IP number of the remote host.  The optional timeout
+must be greater than 0 seconds and defaults to whatever was specified
+when the ping object was created.  Returns a success flag.  If the
+hostname cannot be found or there is a problem with the IP number, the
+success flag returned will be undef.  Otherwise, the success flag will
+be 1 if the host is reachable and 0 if it is not.  For most practical
+purposes, undef and 0 and can be treated as the same case.  In array
+context, the elapsed time as well as the string form of the ip the
+host resolved to are also returned.  The elapsed time value will
+be a float, as retuned by the Time::HiRes::time() function, if hires()
+has been previously called, otherwise it is returned as an integer.
+
+=item $p->source_verify( { 0 | 1 } );
+
+Allows source endpoint verification to be enabled or disabled.
+This is useful for those remote destinations with multiples
+interfaces where the response may not originate from the same
+endpoint that the original destination endpoint was sent to.
+This only affects udp and icmp protocol pings.
+
+This is enabled by default.
+
+=item $p->service_check( { 0 | 1 } );
+
+Set whether or not the connect behavior should enforce
+remote service availability as well as reachability.  Normally,
+if the remote server reported ECONNREFUSED, it must have been
+reachable because of the status packet that it reported.
+With this option enabled, the full three-way tcp handshake
+must have been established successfully before it will
+claim it is reachable.  NOTE:  It still does nothing more
+than connect and disconnect.  It does not speak any protocol
+(i.e., HTTP or FTP) to ensure the remote server is sane in
+any way.  The remote server CPU could be grinding to a halt
+and unresponsive to any clients connecting, but if the kernel
+throws the ACK packet, it is considered alive anyway.  To
+really determine if the server is responding well would be
+application specific and is beyond the scope of Net::Ping.
+For udp protocol, enabling this option demands that the
+remote server replies with the same udp data that it was sent
+as defined by the udp echo service.
+
+This affects the "udp", "tcp", and "syn" protocols.
+
+This is disabled by default.
+
+=item $p->tcp_service_check( { 0 | 1 } );
+
+Depricated method, but does the same as service_check() method.
+
+=item $p->hires( { 0 | 1 } );
+
+Causes this module to use Time::HiRes module, allowing milliseconds
+to be returned by subsequent calls to ping().
+
+This is disabled by default.
+
+=item $p->bind($local_addr);
+
+Sets the source address from which pings will be sent.  This must be
+the address of one of the interfaces on the local host.  $local_addr
+may be specified as a hostname or as a text IP address such as
+"192.168.1.1".
+
+If the protocol is set to "tcp", this method may be called any
+number of times, and each call to the ping() method (below) will use
+the most recent $local_addr.  If the protocol is "icmp" or "udp",
+then bind() must be called at most once per object, and (if it is
+called at all) must be called before the first call to ping() for that
+object.
+
+=item $p->open($host);
+
+When you are using the "stream" protocol, this call pre-opens the
+tcp socket.  It's only necessary to do this if you want to
+provide a different timeout when creating the connection, or
+remove the overhead of establishing the connection from the
+first ping.  If you don't call C<open()>, the connection is
+automatically opened the first time C<ping()> is called.
+This call simply does nothing if you are using any protocol other
+than stream.
+
+=item $p->ack( [ $host ] );
+
+When using the "syn" protocol, use this method to determine
+the reachability of the remote host.  This method is meant
+to be called up to as many times as ping() was called.  Each
+call returns the host (as passed to ping()) that came back
+with the TCP ACK.  The order in which the hosts are returned
+may not necessarily be the same order in which they were
+SYN queued using the ping() method.  If the timeout is
+reached before the TCP ACK is received, or if the remote
+host is not listening on the port attempted, then the TCP
+connection will not be established and ack() will return
+undef.  In list context, the host, the ack time, and the
+dotted ip string will be returned instead of just the host.
+If the optional $host argument is specified, the return
+value will be partaining to that host only.
+This call simply does nothing if you are using any protocol
+other than syn.
+
+=item $p->nack( $failed_ack_host );
+
+The reason that host $failed_ack_host did not receive a
+valid ACK.  Useful to find out why when ack( $fail_ack_host )
+returns a false value.
+
+=item $p->close();
+
+Close the network connection for this ping object.  The network
+connection is also closed by "undef $p".  The network connection is
+automatically closed if the ping object goes out of scope (e.g. $p is
+local to a subroutine and you leave the subroutine).
+
+=item pingecho($host [, $timeout]);
+
+To provide backward compatibility with the previous version of
+Net::Ping, a pingecho() subroutine is available with the same
+functionality as before.  pingecho() uses the tcp protocol.  The
+return values and parameters are the same as described for the ping()
+method.  This subroutine is obsolete and may be removed in a future
+version of Net::Ping.
+
+=back
+
+=head1 NOTES
+
+There will be less network overhead (and some efficiency in your
+program) if you specify either the udp or the icmp protocol.  The tcp
+protocol will generate 2.5 times or more traffic for each ping than
+either udp or icmp.  If many hosts are pinged frequently, you may wish
+to implement a small wait (e.g. 25ms or more) between each ping to
+avoid flooding your network with packets.
+
+The icmp protocol requires that the program be run as root or that it
+be setuid to root.  The other protocols do not require special
+privileges, but not all network devices implement tcp or udp echo.
+
+Local hosts should normally respond to pings within milliseconds.
+However, on a very congested network it may take up to 3 seconds or
+longer to receive an echo packet from the remote host.  If the timeout
+is set too low under these conditions, it will appear that the remote
+host is not reachable (which is almost the truth).
+
+Reachability doesn't necessarily mean that the remote host is actually
+functioning beyond its ability to echo packets.  tcp is slightly better
+at indicating the health of a system than icmp because it uses more
+of the networking stack to respond.
+
+Because of a lack of anything better, this module uses its own
+routines to pack and unpack ICMP packets.  It would be better for a
+separate module to be written which understands all of the different
+kinds of ICMP packets.
+
+=head1 INSTALL
+
+The latest source tree is available via cvs:
+
+  cvs -z3 -q -d :pserver:anonymous@cvs.roobik.com.:/usr/local/cvsroot/freeware checkout Net-Ping
+  cd Net-Ping
+
+The tarball can be created as follows:
+
+  perl Makefile.PL ; make ; make dist
+
+The latest Net::Ping release can be found at CPAN:
+
+  $CPAN/modules/by-module/Net/
+
+1) Extract the tarball
+
+  gtar -zxvf Net-Ping-xxxx.tar.gz
+  cd Net-Ping-xxxx
+
+2) Build:
+
+  make realclean
+  perl Makefile.PL
+  make
+  make test
+
+3) Install
+
+  make install
+
+Or install it RPM Style:
+
+  rpm -ta SOURCES/Net-Ping-xxxx.tar.gz
+
+  rpm -ih RPMS/noarch/perl-Net-Ping-xxxx.rpm
+
+=head1 BUGS
+
+For a list of known issues, visit:
+
+https://rt.cpan.org/NoAuth/Bugs.html?Dist=Net-Ping
+
+To report a new bug, visit:
+
+https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Net-Ping
+
+=head1 AUTHORS
+
+  Current maintainer:
+    bbb@cpan.org (Rob Brown)
+
+  External protocol:
+    colinm@cpan.org (Colin McMillen)
+
+  Stream protocol:
+    bronson@trestle.com (Scott Bronson)
+
+  Original pingecho():
+    karrer@bernina.ethz.ch (Andreas Karrer)
+    pmarquess@bfsec.bt.co.uk (Paul Marquess)
+
+  Original Net::Ping author:
+    mose@ns.ccsn.edu (Russell Mosemann)
+
+=head1 COPYRIGHT
+
+Copyright (c) 2002-2003, Rob Brown.  All rights reserved.
+
+Copyright (c) 2001, Colin McMillen.  All rights reserved.
+
+This program is free software; you may redistribute it and/or
+modify it under the same terms as Perl itself.
+
+$Id: Ping.pm,v 1.86 2003/06/27 21:31:07 rob Exp $
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/SMTP.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/SMTP.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/SMTP.pm	(revision 14489)
@@ -0,0 +1,853 @@
+# Net::SMTP.pm
+#
+# Copyright (c) 1995-2004 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.29";
+
+@ISA = qw(Net::Cmd IO::Socket::INET);
+
+sub new
+{
+ my $self = shift;
+ my $type = ref($self) || $self;
+ my ($host,%arg);
+ if (@_ % 2) {
+   $host = shift ;
+   %arg  = @_;
+ } else {
+   %arg = @_;
+   $host=delete $arg{Host};
+ }
+ 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;
+}
+
+sub host {
+ my $me = shift;
+ ${*$me}{'net_smtp_host'};
+}
+
+##
+## 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) = @_;
+
+    eval {
+	require MIME::Base64;
+	require Authen::SASL;
+    } or $self->set_status(500,["Need MIME::Base64 and Authen::SASL todo auth"]), return 0;
+
+    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';
+        }
+      }
+
+     if(defined($v = delete $opt{XVERP}))
+      {
+       if(exists $esmtp->{'XVERP'})
+        {
+	 $opts .= " XVERP"
+        }
+       else
+        {
+	 carp 'Net::SMTP::mail: XVERP 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 ( [ 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.
+
+C<HOST> is optional. If C<HOST> is not given then it may instead be
+passed as the C<Host> option described below. If neither is given then
+the C<SMTP_Hosts> 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 localhost.localdomain
+will be used.
+
+B<Host> - SMTP host to connect to. It may be a single scalar, as defined for
+the C<PeerAddr> option in L<IO::Socket::INET>, or a reference to
+an array with hosts to try in turn. The L</host> method will return the value
+which was used to connect to the host.
+
+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,
+			  );
+
+    # the same
+    $smtp = Net::SMTP->new(
+			   Host => 'mailhost',
+			   Hello => 'my.mail.domain'
+			   Timeout => 30,
+                           Debug   => 1,
+			  );
+
+    # Connect to the default server from Net::config
+    $smtp = Net::SMTP->new(
+			   Hello => 'my.mail.domain'
+			   Timeout => 30,
+			  );
+
+=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 host ()
+
+Returns the value used by the constructor, and passed to IO::Socket::INET,
+to connect to the host.
+
+=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>
+ XVERP       => 1
+
+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 also pass additional case-sensitive OPTIONS as an
+anonymous hash using key and value pairs.  Possible options are:
+
+  Notify  => ['NEVER'] or ['SUCCESS','FAILURE','DELAY']  (see below)
+  SkipBad => 1        (to 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($recipient1,$recipient2, { Notify => ['FAILURE','DELAY'], SkipBad => 1 });  # Good
+  @goodrecips=$smtp->recipient(@recipients, { Notify => ['FAILURE'], SkipBad => 1 });  # Good
+  $smtp->recipient("$recipient,$recipient2"); # BAD
+
+Notify is used to request Delivery Status Notifications (DSNs), but your
+SMTP/ESMTP service may not respect this request depending upon its version and
+your site's SMTP configuration.
+
+Leaving out the Notify option usually defaults an SMTP service to its default
+behavior equivalent to ['FAILURE'] notifications only, but again this may be
+dependent upon your site's SMTP configuration.
+
+The NEVER keyword must appear by itself if used within the Notify option and "requests
+that a DSN not be returned to the sender under any conditions."
+
+  {Notify => ['NEVER']}
+
+  $smtp->recipient(@recipients, { Notify => ['NEVER'], SkipBad => 1 });  # Good
+
+You may use any combination of these three values 'SUCCESS','FAILURE','DELAY' in
+the anonymous array reference as defined by RFC3461 (see http://rfc.net/rfc3461.html
+for more information.  Note: quotations in this topic from same.).
+
+A Notify parameter of 'SUCCESS' or 'FAILURE' "requests that a DSN be issued on
+successful delivery or delivery failure, respectively."
+
+A Notify parameter of 'DELAY' "indicates the sender's willingness to receive
+delayed DSNs.  Delayed DSNs may be issued if delivery of a message has been
+delayed for an unusual amount of time (as determined by the Message Transfer
+Agent (MTA) at which the message is delayed), but the final delivery status
+(whether successful or failure) cannot be determined.  The absence of the DELAY
+keyword in a NOTIFY parameter requests that a "delayed" DSN NOT be issued under
+any conditions."
+
+  {Notify => ['SUCCESS','FAILURE','DELAY']}
+
+  $smtp->recipient(@recipients, { Notify => ['FAILURE','DELAY'], SkipBad => 1 });  # Good
+
+=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.
+
+Most sites usually disable this feature in their SMTP service configuration.
+Use "Debug => 1" option under new() to see if disabled.
+
+=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-2004 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
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/Time.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/Time.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/Time.pm	(revision 14489)
@@ -0,0 +1,147 @@
+# Net::Time.pm
+#
+# Copyright (c) 1995-2004 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.10";
+
+$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 defined $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 = '';
+
+ defined($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-2004 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
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/hostent.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/hostent.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/hostent.pm	(revision 14489)
@@ -0,0 +1,151 @@
+package Net::hostent;
+use strict;
+
+use 5.006_001;
+our $VERSION = '1.01';
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN { 
+    use Exporter   ();
+    @EXPORT      = qw(gethostbyname gethostbyaddr gethost);
+    @EXPORT_OK   = qw(
+			$h_name	    	@h_aliases
+			$h_addrtype 	$h_length
+			@h_addr_list 	$h_addr
+		   );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'Net::hostent' => [
+   name		=> '$',
+   aliases	=> '@',
+   addrtype	=> '$',
+   'length'	=> '$',
+   addr_list	=> '@',
+];
+
+sub addr { shift->addr_list->[0] }
+
+sub populate (@) {
+    return unless @_;
+    my $hob = new();
+    $h_name 	 =    $hob->[0]     	     = $_[0];
+    @h_aliases	 = @{ $hob->[1] } = split ' ', $_[1];
+    $h_addrtype  =    $hob->[2] 	     = $_[2];
+    $h_length	 =    $hob->[3] 	     = $_[3];
+    $h_addr 	 =                             $_[4];
+    @h_addr_list = @{ $hob->[4] } =          @_[ (4 .. $#_) ];
+    return $hob;
+} 
+
+sub gethostbyname ($)  { populate(CORE::gethostbyname(shift)) } 
+
+sub gethostbyaddr ($;$) { 
+    my ($addr, $addrtype);
+    $addr = shift;
+    require Socket unless @_;
+    $addrtype = @_ ? shift : Socket::AF_INET();
+    populate(CORE::gethostbyaddr($addr, $addrtype)) 
+} 
+
+sub gethost($) {
+    if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) {
+	require Socket;
+	&gethostbyaddr(Socket::inet_aton(shift));
+    } else {
+	&gethostbyname;
+    } 
+} 
+
+1;
+__END__
+
+=head1 NAME
+
+Net::hostent - by-name interface to Perl's built-in gethost*() functions
+
+=head1 SYNOPSIS
+
+ use Net::hostent;
+
+=head1 DESCRIPTION
+
+This module's default exports override the core gethostbyname() and
+gethostbyaddr() functions, replacing them with versions that return
+"Net::hostent" objects.  This object has methods that return the similarly
+named structure field name from the C's hostent structure from F<netdb.h>;
+namely name, aliases, addrtype, length, and addr_list.  The aliases and
+addr_list methods return array reference, the rest scalars.  The addr
+method is equivalent to the zeroth element in the addr_list array
+reference.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as variables named
+with a preceding C<h_>.  Thus, C<$host_obj-E<gt>name()> corresponds to
+$h_name if you import the fields.  Array references are available as
+regular array variables, so for example C<@{ $host_obj-E<gt>aliases()
+}> would be simply @h_aliases.
+
+The gethost() function is a simple front-end that forwards a numeric
+argument to gethostbyaddr() by way of Socket::inet_aton, and the rest
+to gethostbyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 EXAMPLES
+
+ use Net::hostent;
+ use Socket;
+
+ @ARGV = ('netscape.com') unless @ARGV;
+
+ for $host ( @ARGV ) {
+
+    unless ($h = gethost($host)) {
+	warn "$0: no such host: $host\n";
+	next;
+    }
+
+    printf "\n%s is %s%s\n", 
+	    $host, 
+	    lc($h->name) eq lc($host) ? "" : "*really* ",
+	    $h->name;
+
+    print "\taliases are ", join(", ", @{$h->aliases}), "\n"
+		if @{$h->aliases};     
+
+    if ( @{$h->addr_list} > 1 ) { 
+	my $i;
+	for $addr ( @{$h->addr_list} ) {
+	    printf "\taddr #%d is [%s]\n", $i++, inet_ntoa($addr);
+	} 
+    } else {
+	printf "\taddress is [%s]\n", inet_ntoa($h->addr);
+    } 
+
+    if ($h = gethostbyaddr($h->addr)) {
+	if (lc($h->name) ne lc($host)) {
+	    printf "\tThat addr reverses to host %s!\n", $h->name;
+	    $host = $h->name;
+	    redo;
+	} 
+    }
+ }
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/libnetFAQ.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/libnetFAQ.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/libnetFAQ.pod	(revision 14489)
@@ -0,0 +1,307 @@
+=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 bug. 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 $>
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/netent.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/netent.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/netent.pm	(revision 14489)
@@ -0,0 +1,169 @@
+package Net::netent;
+use strict;
+
+use 5.006_001;
+our $VERSION = '1.00';
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN { 
+    use Exporter   ();
+    @EXPORT      = qw(getnetbyname getnetbyaddr getnet);
+    @EXPORT_OK   = qw(
+			$n_name	    	@n_aliases
+			$n_addrtype 	$n_net
+		   );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'Net::netent' => [
+   name		=> '$',
+   aliases	=> '@',
+   addrtype	=> '$',
+   net		=> '$',
+];
+
+sub populate (@) {
+    return unless @_;
+    my $nob = new();
+    $n_name 	 =    $nob->[0]     	     = $_[0];
+    @n_aliases	 = @{ $nob->[1] } = split ' ', $_[1];
+    $n_addrtype  =    $nob->[2] 	     = $_[2];
+    $n_net	 =    $nob->[3] 	     = $_[3];
+    return $nob;
+} 
+
+sub getnetbyname ($)  { populate(CORE::getnetbyname(shift)) } 
+
+sub getnetbyaddr ($;$) { 
+    my ($net, $addrtype);
+    $net = shift;
+    require Socket if @_;
+    $addrtype = @_ ? shift : Socket::AF_INET();
+    populate(CORE::getnetbyaddr($net, $addrtype)) 
+} 
+
+sub getnet($) {
+    if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) {
+	require Socket;
+	&getnetbyaddr(Socket::inet_aton(shift));
+    } else {
+	&getnetbyname;
+    } 
+} 
+
+1;
+__END__
+
+=head1 NAME
+
+Net::netent - by-name interface to Perl's built-in getnet*() functions
+
+=head1 SYNOPSIS
+
+ use Net::netent qw(:FIELDS);
+ getnetbyname("loopback") 		or die "bad net";
+ printf "%s is %08X\n", $n_name, $n_net;
+
+ use Net::netent;
+
+ $n = getnetbyname("loopback") 		or die "bad net";
+ { # there's gotta be a better way, eh?
+     @bytes = unpack("C4", pack("N", $n->net));
+     shift @bytes while @bytes && $bytes[0] == 0;
+ }
+ printf "%s is %08X [%d.%d.%d.%d]\n", $n->name, $n->net, @bytes;
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getnetbyname() and
+getnetbyaddr() functions, replacing them with versions that return
+"Net::netent" objects.  This object has methods that return the similarly
+named structure field name from the C's netent structure from F<netdb.h>;
+namely name, aliases, addrtype, and net.  The aliases 
+method returns an array reference, the rest scalars.  
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as variables named
+with a preceding C<n_>.  Thus, C<$net_obj-E<gt>name()> corresponds to
+$n_name if you import the fields.  Array references are available as
+regular array variables, so for example C<@{ $net_obj-E<gt>aliases()
+}> would be simply @n_aliases.
+
+The getnet() function is a simple front-end that forwards a numeric
+argument to getnetbyaddr(), and the rest
+to getnetbyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 EXAMPLES
+
+The getnet() functions do this in the Perl core:
+
+    sv_setiv(sv, (I32)nent->n_net);
+
+The gethost() functions do this in the Perl core:
+
+    sv_setpvn(sv, hent->h_addr, len);
+
+That means that the address comes back in binary for the
+host functions, and as a regular perl integer for the net ones.
+This seems a bug, but here's how to deal with it:
+
+ use strict;
+ use Socket;
+ use Net::netent;
+
+ @ARGV = ('loopback') unless @ARGV;
+
+ my($n, $net);
+
+ for $net ( @ARGV ) {
+
+     unless ($n = getnetbyname($net)) {
+ 	warn "$0: no such net: $net\n";
+ 	next;
+     }
+
+     printf "\n%s is %s%s\n", 
+ 	    $net, 
+ 	    lc($n->name) eq lc($net) ? "" : "*really* ",
+ 	    $n->name;
+
+     print "\taliases are ", join(", ", @{$n->aliases}), "\n"
+ 		if @{$n->aliases};     
+
+     # this is stupid; first, why is this not in binary?
+     # second, why am i going through these convolutions
+     # to make it looks right
+     {
+ 	my @a = unpack("C4", pack("N", $n->net));
+ 	shift @a while @a && $a[0] == 0;
+ 	printf "\taddr is %s [%d.%d.%d.%d]\n", $n->net, @a;
+     }
+
+     if ($n = getnetbyaddr($n->net)) {
+ 	if (lc($n->name) ne lc($net)) {
+ 	    printf "\tThat addr reverses to net %s!\n", $n->name;
+ 	    $net = $n->name;
+ 	    redo;
+ 	} 
+     }
+ }
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/protoent.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/protoent.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/protoent.pm	(revision 14489)
@@ -0,0 +1,96 @@
+package Net::protoent;
+use strict;
+
+use 5.006_001;
+our $VERSION = '1.00';
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN { 
+    use Exporter   ();
+    @EXPORT      = qw(getprotobyname getprotobynumber getprotoent getproto);
+    @EXPORT_OK   = qw( $p_name @p_aliases $p_proto );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'Net::protoent' => [
+   name		=> '$',
+   aliases	=> '@',
+   proto	=> '$',
+];
+
+sub populate (@) {
+    return unless @_;
+    my $pob = new();
+    $p_name 	 =    $pob->[0]     	     = $_[0];
+    @p_aliases	 = @{ $pob->[1] } = split ' ', $_[1];
+    $p_proto	 =    $pob->[2] 	     = $_[2];
+    return $pob;
+} 
+
+sub getprotoent      ( )  { populate(CORE::getprotoent()) } 
+sub getprotobyname   ($)  { populate(CORE::getprotobyname(shift)) } 
+sub getprotobynumber ($)  { populate(CORE::getprotobynumber(shift)) } 
+
+sub getproto ($;$) {
+    no strict 'refs';
+    return &{'getprotoby' . ($_[0]=~/^\d+$/ ? 'number' : 'name')}(@_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::protoent - by-name interface to Perl's built-in getproto*() functions
+
+=head1 SYNOPSIS
+
+ use Net::protoent;
+ $p = getprotobyname(shift || 'tcp') || die "no proto";
+ printf "proto for %s is %d, aliases are %s\n",
+    $p->name, $p->proto, "@{$p->aliases}";
+
+ use Net::protoent qw(:FIELDS);
+ getprotobyname(shift || 'tcp') || die "no proto";
+ print "proto for $p_name is $p_proto, aliases are @p_aliases\n";
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getprotoent(),
+getprotobyname(), and getnetbyport() functions, replacing them with
+versions that return "Net::protoent" objects.  They take default
+second arguments of "tcp".  This object has methods that return the
+similarly named structure field name from the C's protoent structure
+from F<netdb.h>; namely name, aliases, and proto.  The aliases method
+returns an array reference, the rest scalars.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as variables named
+with a preceding C<p_>.  Thus, C<$proto_obj-E<gt>name()> corresponds to
+$p_name if you import the fields.  Array references are available as
+regular array variables, so for example C<@{ $proto_obj-E<gt>aliases()
+}> would be simply @p_aliases.
+
+The getproto() function is a simple front-end that forwards a numeric
+argument to getprotobyport(), and the rest to getprotobyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
Index: /for-distributions/trunk/bin/windows/perl/lib/Net/servent.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Net/servent.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Net/servent.pm	(revision 14489)
@@ -0,0 +1,113 @@
+package Net::servent;
+use strict;
+
+use 5.006_001;
+our $VERSION = '1.01';
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN {
+    use Exporter   ();
+    @EXPORT      = qw(getservbyname getservbyport getservent getserv);
+    @EXPORT_OK   = qw( $s_name @s_aliases $s_port $s_proto );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'Net::servent' => [
+   name		=> '$',
+   aliases	=> '@',
+   port		=> '$',
+   proto	=> '$',
+];
+
+sub populate (@) {
+    return unless @_;
+    my $sob = new();
+    $s_name 	 =    $sob->[0]     	     = $_[0];
+    @s_aliases	 = @{ $sob->[1] } = split ' ', $_[1];
+    $s_port	 =    $sob->[2] 	     = $_[2];
+    $s_proto	 =    $sob->[3] 	     = $_[3];
+    return $sob;
+}
+
+sub getservent    (   ) { populate(CORE::getservent()) }
+sub getservbyname ($;$) { populate(CORE::getservbyname(shift,shift||'tcp')) }
+sub getservbyport ($;$) { populate(CORE::getservbyport(shift,shift||'tcp')) }
+
+sub getserv ($;$) {
+    no strict 'refs';
+    return &{'getservby' . ($_[0]=~/^\d+$/ ? 'port' : 'name')}(@_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::servent - by-name interface to Perl's built-in getserv*() functions
+
+=head1 SYNOPSIS
+
+ use Net::servent;
+ $s = getservbyname(shift || 'ftp') || die "no service";
+ printf "port for %s is %s, aliases are %s\n",
+    $s->name, $s->port, "@{$s->aliases}";
+
+ use Net::servent qw(:FIELDS);
+ getservbyname(shift || 'ftp') || die "no service";
+ print "port for $s_name is $s_port, aliases are @s_aliases\n";
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getservent(),
+getservbyname(), and
+getnetbyport() functions, replacing them with versions that return
+"Net::servent" objects.  They take default second arguments of "tcp".  This object has methods that return the similarly
+named structure field name from the C's servent structure from F<netdb.h>;
+namely name, aliases, port, and proto.  The aliases
+method returns an array reference, the rest scalars.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as variables named
+with a preceding C<s_>.  Thus, C<$serv_obj-E<gt>name()> corresponds to
+$s_name if you import the fields.  Array references are available as
+regular array variables, so for example C<@{ $serv_obj-E<gt>aliases()}>
+would be simply @s_aliases.
+
+The getserv() function is a simple front-end that forwards a numeric
+argument to getservbyport(), and the rest to getservbyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 EXAMPLES
+
+ use Net::servent qw(:FIELDS);
+
+ while (@ARGV) {
+     my ($service, $proto) = ((split m!/!, shift), 'tcp');
+     my $valet = getserv($service, $proto);
+     unless ($valet) {
+         warn "$0: No service: $service/$proto\n"
+         next;
+     }
+     printf "service $service/$proto is port %d\n", $valet->port;
+     print "alias are @s_aliases\n" if @s_aliases;
+ }
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
Index: /for-distributions/trunk/bin/windows/perl/lib/O.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/O.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/O.pm	(revision 14489)
@@ -0,0 +1,144 @@
+package O;
+
+our $VERSION = '1.00';
+
+use B qw(minus_c save_BEGINs);
+use Carp;
+
+sub import {
+    my ($class, @options) = @_;
+    my ($quiet, $veryquiet) = (0, 0);
+    if ($options[0] eq '-q' || $options[0] eq '-qq') {
+	$quiet = 1;
+	open (SAVEOUT, ">&STDOUT");
+	close STDOUT;
+	open (STDOUT, ">", \$O::BEGIN_output);
+	if ($options[0] eq '-qq') {
+	    $veryquiet = 1;
+	}
+	shift @options;
+    }
+    my $backend = shift (@options);
+    eval q[
+	BEGIN {
+	    minus_c;
+	    save_BEGINs;
+	}
+
+	CHECK {
+	    if ($quiet) {
+		close STDOUT;
+		open (STDOUT, ">&SAVEOUT");
+		close SAVEOUT;
+	    }
+
+	    # Note: if you change the code after this 'use', please
+	    # change the fudge factors in B::Concise (grep for
+	    # "fragile kludge") so that its output still looks
+	    # nice. Thanks. --smcc
+	    use B::].$backend.q[ ();
+	    if ($@) {
+		croak "use of backend $backend failed: $@";
+	    }
+
+
+	    my $compilesub = &{"B::${backend}::compile"}(@options);
+	    if (ref($compilesub) ne "CODE") {
+		die $compilesub;
+	    }
+
+	    local $savebackslash = $\;
+	    local ($\,$",$,) = (undef,' ','');
+	    &$compilesub();
+
+	    close STDERR if $veryquiet;
+	}
+    ];
+    die $@ if $@;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+O - Generic interface to Perl Compiler backends
+
+=head1 SYNOPSIS
+
+	perl -MO=[-q,]Backend[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+This is the module that is used as a frontend to the Perl Compiler.
+
+If you pass the C<-q> option to the module, then the STDOUT
+filehandle will be redirected into the variable C<$O::BEGIN_output>
+during compilation.  This has the effect that any output printed
+to STDOUT by BEGIN blocks or use'd modules will be stored in this
+variable rather than printed. It's useful with those backends which
+produce output themselves (C<Deparse>, C<Concise> etc), so that
+their output is not confused with that generated by the code
+being compiled.
+
+The C<-qq> option behaves like C<-q>, except that it also closes
+STDERR after deparsing has finished. This suppresses the "Syntax OK"
+message normally produced by perl.
+
+=head1 CONVENTIONS
+
+Most compiler backends use the following conventions: OPTIONS
+consists of a comma-separated list of words (no white-space).
+The C<-v> option usually puts the backend into verbose mode.
+The C<-ofile> option generates output to B<file> instead of
+stdout. The C<-D> option followed by various letters turns on
+various internal debugging flags. See the documentation for the
+desired backend (named C<B::Backend> for the example above) to
+find out about that backend.
+
+=head1 IMPLEMENTATION
+
+This section is only necessary for those who want to write a
+compiler backend module that can be used via this module.
+
+The command-line mentioned in the SYNOPSIS section corresponds to
+the Perl code
+
+    use O ("Backend", OPTIONS);
+
+The C<import> function which that calls loads in the appropriate
+C<B::Backend> module and calls the C<compile> function in that
+package, passing it OPTIONS. That function is expected to return
+a sub reference which we'll call CALLBACK. Next, the "compile-only"
+flag is switched on (equivalent to the command-line option C<-c>)
+and a CHECK block is registered which calls CALLBACK. Thus the main
+Perl program mentioned on the command-line is read in, parsed and
+compiled into internal syntax tree form. Since the C<-c> flag is
+set, the program does not start running (excepting BEGIN blocks of
+course) but the CALLBACK function registered by the compiler
+backend is called.
+
+In summary, a compiler backend module should be called "B::Foo"
+for some foo and live in the appropriate directory for that name.
+It should define a function called C<compile>. When the user types
+
+    perl -MO=Foo,OPTIONS foo.pl
+
+that function is called and is passed those OPTIONS (split on
+commas). It should return a sub ref to the main compilation function.
+After the user's program is loaded and parsed, that returned sub ref
+is invoked which can then go ahead and do the compilation, usually by
+making use of the C<B> module's functionality.
+
+=head1 BUGS
+
+The C<-q> and C<-qq> options don't work correctly if perl isn't
+compiled with PerlIO support : STDOUT will be closed instead of being
+redirected to C<$O::BEGIN_output>.
+
+=head1 AUTHOR
+
+Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Opcode.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Opcode.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Opcode.pm	(revision 14489)
@@ -0,0 +1,578 @@
+package Opcode;
+
+use 5.006_001;
+
+use strict;
+
+our($VERSION, $XS_VERSION, @ISA, @EXPORT_OK);
+
+$VERSION = "1.06";
+$XS_VERSION = "1.03";
+
+use Carp;
+use Exporter ();
+use XSLoader ();
+
+BEGIN {
+    @ISA = qw(Exporter);
+    @EXPORT_OK = qw(
+	opset ops_to_opset
+	opset_to_ops opset_to_hex invert_opset
+	empty_opset full_opset
+	opdesc opcodes opmask define_optag
+	opmask_add verify_opset opdump
+    );
+}
+
+sub opset (;@);
+sub opset_to_hex ($);
+sub opdump (;$);
+use subs @EXPORT_OK;
+
+XSLoader::load 'Opcode', $XS_VERSION;
+
+_init_optags();
+
+sub ops_to_opset { opset @_ }	# alias for old name
+
+sub opset_to_hex ($) {
+    return "(invalid opset)" unless verify_opset($_[0]);
+    unpack("h*",$_[0]);
+}
+
+sub opdump (;$) {
+	my $pat = shift;
+    # handy utility: perl -MOpcode=opdump -e 'opdump File'
+    foreach(opset_to_ops(full_opset)) {
+        my $op = sprintf "  %12s  %s\n", $_, opdesc($_);
+		next if defined $pat and $op !~ m/$pat/i;
+		print $op;
+    }
+}
+
+
+
+sub _init_optags {
+    my(%all, %seen);
+    @all{opset_to_ops(full_opset)} = (); # keys only
+
+    local($_);
+    local($/) = "\n=cut"; # skip to optags definition section
+    <DATA>;
+    $/ = "\n=";		# now read in 'pod section' chunks
+    while(<DATA>) {
+	next unless m/^item\s+(:\w+)/;
+	my $tag = $1;
+
+	# Split into lines, keep only indented lines
+	my @lines = grep { m/^\s/    } split(/\n/);
+	foreach (@lines) { s/--.*//  } # delete comments
+	my @ops   = map  { split ' ' } @lines; # get op words
+
+	foreach(@ops) {
+	    warn "$tag - $_ already tagged in $seen{$_}\n" if $seen{$_};
+	    $seen{$_} = $tag;
+	    delete $all{$_};
+	}
+	# opset will croak on invalid names
+	define_optag($tag, opset(@ops));
+    }
+    close(DATA);
+    warn "Untagged opnames: ".join(' ',keys %all)."\n" if %all;
+}
+
+
+1;
+
+__DATA__
+
+=head1 NAME
+
+Opcode - Disable named opcodes when compiling perl code
+
+=head1 SYNOPSIS
+
+  use Opcode;
+
+
+=head1 DESCRIPTION
+
+Perl code is always compiled into an internal format before execution.
+
+Evaluating perl code (e.g. via "eval" or "do 'file'") causes
+the code to be compiled into an internal format and then,
+provided there was no error in the compilation, executed.
+The internal format is based on many distinct I<opcodes>.
+
+By default no opmask is in effect and any code can be compiled.
+
+The Opcode module allow you to define an I<operator mask> to be in
+effect when perl I<next> compiles any code.  Attempting to compile code
+which contains a masked opcode will cause the compilation to fail
+with an error. The code will not be executed.
+
+=head1 NOTE
+
+The Opcode module is not usually used directly. See the ops pragma and
+Safe modules for more typical uses.
+
+=head1 WARNING
+
+The authors make B<no warranty>, implied or otherwise, about the
+suitability of this software for safety or security purposes.
+
+The authors shall not in any case be liable for special, incidental,
+consequential, indirect or other similar damages arising from the use
+of this software.
+
+Your mileage will vary. If in any doubt B<do not use it>.
+
+
+=head1 Operator Names and Operator Lists
+
+The canonical list of operator names is the contents of the array
+PL_op_name defined and initialised in file F<opcode.h> of the Perl
+source distribution (and installed into the perl library).
+
+Each operator has both a terse name (its opname) and a more verbose or
+recognisable descriptive name. The opdesc function can be used to
+return a list of descriptions for a list of operators.
+
+Many of the functions and methods listed below take a list of
+operators as parameters. Most operator lists can be made up of several
+types of element. Each element can be one of
+
+=over 8
+
+=item an operator name (opname)
+
+Operator names are typically small lowercase words like enterloop,
+leaveloop, last, next, redo etc. Sometimes they are rather cryptic
+like gv2cv, i_ncmp and ftsvtx.
+
+=item an operator tag name (optag)
+
+Operator tags can be used to refer to groups (or sets) of operators.
+Tag names always begin with a colon. The Opcode module defines several
+optags and the user can define others using the define_optag function.
+
+=item a negated opname or optag
+
+An opname or optag can be prefixed with an exclamation mark, e.g., !mkdir.
+Negating an opname or optag means remove the corresponding ops from the
+accumulated set of ops at that point.
+
+=item an operator set (opset)
+
+An I<opset> as a binary string of approximately 44 bytes which holds a
+set or zero or more operators.
+
+The opset and opset_to_ops functions can be used to convert from
+a list of operators to an opset and I<vice versa>.
+
+Wherever a list of operators can be given you can use one or more opsets.
+See also Manipulating Opsets below.
+
+=back
+
+
+=head1 Opcode Functions
+
+The Opcode package contains functions for manipulating operator names
+tags and sets. All are available for export by the package.
+
+=over 8
+
+=item opcodes
+
+In a scalar context opcodes returns the number of opcodes in this
+version of perl (around 350 for perl-5.7.0).
+
+In a list context it returns a list of all the operator names.
+(Not yet implemented, use @names = opset_to_ops(full_opset).)
+
+=item opset (OP, ...)
+
+Returns an opset containing the listed operators.
+
+=item opset_to_ops (OPSET)
+
+Returns a list of operator names corresponding to those operators in
+the set.
+
+=item opset_to_hex (OPSET)
+
+Returns a string representation of an opset. Can be handy for debugging.
+
+=item full_opset
+
+Returns an opset which includes all operators.
+
+=item empty_opset
+
+Returns an opset which contains no operators.
+
+=item invert_opset (OPSET)
+
+Returns an opset which is the inverse set of the one supplied.
+
+=item verify_opset (OPSET, ...)
+
+Returns true if the supplied opset looks like a valid opset (is the
+right length etc) otherwise it returns false. If an optional second
+parameter is true then verify_opset will croak on an invalid opset
+instead of returning false.
+
+Most of the other Opcode functions call verify_opset automatically
+and will croak if given an invalid opset.
+
+=item define_optag (OPTAG, OPSET)
+
+Define OPTAG as a symbolic name for OPSET. Optag names always start
+with a colon C<:>.
+
+The optag name used must not be defined already (define_optag will
+croak if it is already defined). Optag names are global to the perl
+process and optag definitions cannot be altered or deleted once
+defined.
+
+It is strongly recommended that applications using Opcode should use a
+leading capital letter on their tag names since lowercase names are
+reserved for use by the Opcode module. If using Opcode within a module
+you should prefix your tags names with the name of your module to
+ensure uniqueness and thus avoid clashes with other modules.
+
+=item opmask_add (OPSET)
+
+Adds the supplied opset to the current opmask. Note that there is
+currently I<no> mechanism for unmasking ops once they have been masked.
+This is intentional.
+
+=item opmask
+
+Returns an opset corresponding to the current opmask.
+
+=item opdesc (OP, ...)
+
+This takes a list of operator names and returns the corresponding list
+of operator descriptions.
+
+=item opdump (PAT)
+
+Dumps to STDOUT a two column list of op names and op descriptions.
+If an optional pattern is given then only lines which match the
+(case insensitive) pattern will be output.
+
+It's designed to be used as a handy command line utility:
+
+	perl -MOpcode=opdump -e opdump
+	perl -MOpcode=opdump -e 'opdump Eval'
+
+=back
+
+=head1 Manipulating Opsets
+
+Opsets may be manipulated using the perl bit vector operators & (and), | (or),
+^ (xor) and ~ (negate/invert).
+
+However you should never rely on the numerical position of any opcode
+within the opset. In other words both sides of a bit vector operator
+should be opsets returned from Opcode functions.
+
+Also, since the number of opcodes in your current version of perl might
+not be an exact multiple of eight, there may be unused bits in the last
+byte of an upset. This should not cause any problems (Opcode functions
+ignore those extra bits) but it does mean that using the ~ operator
+will typically not produce the same 'physical' opset 'string' as the
+invert_opset function.
+
+
+=head1 TO DO (maybe)
+
+    $bool = opset_eq($opset1, $opset2)	true if opsets are logically eqiv
+
+    $yes = opset_can($opset, @ops)	true if $opset has all @ops set
+
+    @diff = opset_diff($opset1, $opset2) => ('foo', '!bar', ...)
+
+=cut
+
+# the =cut above is used by _init_optags() to get here quickly
+
+=head1 Predefined Opcode Tags
+
+=over 5
+
+=item :base_core
+
+    null stub scalar pushmark wantarray const defined undef
+
+    rv2sv sassign
+
+    rv2av aassign aelem aelemfast aslice av2arylen
+
+    rv2hv helem hslice each values keys exists delete
+
+    preinc i_preinc predec i_predec postinc i_postinc postdec i_postdec
+    int hex oct abs pow multiply i_multiply divide i_divide
+    modulo i_modulo add i_add subtract i_subtract
+
+    left_shift right_shift bit_and bit_xor bit_or negate i_negate
+    not complement
+
+    lt i_lt gt i_gt le i_le ge i_ge eq i_eq ne i_ne ncmp i_ncmp
+    slt sgt sle sge seq sne scmp
+
+    substr vec stringify study pos length index rindex ord chr
+
+    ucfirst lcfirst uc lc quotemeta trans chop schop chomp schomp
+
+    match split qr
+
+    list lslice splice push pop shift unshift reverse
+
+    cond_expr flip flop andassign orassign and or xor
+
+    warn die lineseq nextstate scope enter leave setstate
+
+    rv2cv anoncode prototype
+
+    entersub leavesub leavesublv return method method_named -- XXX loops via recursion?
+
+    leaveeval -- needed for Safe to operate, is safe without entereval
+
+=item :base_mem
+
+These memory related ops are not included in :base_core because they
+can easily be used to implement a resource attack (e.g., consume all
+available memory).
+
+    concat repeat join range
+
+    anonlist anonhash
+
+Note that despite the existence of this optag a memory resource attack
+may still be possible using only :base_core ops.
+
+Disabling these ops is a I<very> heavy handed way to attempt to prevent
+a memory resource attack. It's probable that a specific memory limit
+mechanism will be added to perl in the near future.
+
+=item :base_loop
+
+These loop ops are not included in :base_core because they can easily be
+used to implement a resource attack (e.g., consume all available CPU time).
+
+    grepstart grepwhile
+    mapstart mapwhile
+    enteriter iter
+    enterloop leaveloop unstack
+    last next redo
+    goto
+
+=item :base_io
+
+These ops enable I<filehandle> (rather than filename) based input and
+output. These are safe on the assumption that only pre-existing
+filehandles are available for use.  To create new filehandles other ops
+such as open would need to be enabled.
+
+    readline rcatline getc read
+
+    formline enterwrite leavewrite
+
+    print sysread syswrite send recv
+
+    eof tell seek sysseek
+
+    readdir telldir seekdir rewinddir
+
+=item :base_orig
+
+These are a hotchpotch of opcodes still waiting to be considered
+
+    gvsv gv gelem
+
+    padsv padav padhv padany
+
+    rv2gv refgen srefgen ref
+
+    bless -- could be used to change ownership of objects (reblessing)
+
+    pushre regcmaybe regcreset regcomp subst substcont
+
+    sprintf prtf -- can core dump
+
+    crypt
+
+    tie untie
+
+    dbmopen dbmclose
+    sselect select
+    pipe_op sockpair
+
+    getppid getpgrp setpgrp getpriority setpriority localtime gmtime
+
+    entertry leavetry -- can be used to 'hide' fatal errors
+
+    custom -- where should this go
+
+=item :base_math
+
+These ops are not included in :base_core because of the risk of them being
+used to generate floating point exceptions (which would have to be caught
+using a $SIG{FPE} handler).
+
+    atan2 sin cos exp log sqrt
+
+These ops are not included in :base_core because they have an effect
+beyond the scope of the compartment.
+
+    rand srand
+
+=item :base_thread
+
+These ops are related to multi-threading.
+
+    lock threadsv
+
+=item :default
+
+A handy tag name for a I<reasonable> default set of ops.  (The current ops
+allowed are unstable while development continues. It will change.)
+
+    :base_core :base_mem :base_loop :base_io :base_orig :base_thread
+
+If safety matters to you (and why else would you be using the Opcode module?)
+then you should not rely on the definition of this, or indeed any other, optag!
+
+
+=item :filesys_read
+
+    stat lstat readlink
+
+    ftatime ftblk ftchr ftctime ftdir fteexec fteowned fteread
+    ftewrite ftfile ftis ftlink ftmtime ftpipe ftrexec ftrowned
+    ftrread ftsgid ftsize ftsock ftsuid fttty ftzero ftrwrite ftsvtx
+
+    fttext ftbinary
+
+    fileno
+
+=item :sys_db
+
+    ghbyname ghbyaddr ghostent shostent ehostent      -- hosts
+    gnbyname gnbyaddr gnetent snetent enetent         -- networks
+    gpbyname gpbynumber gprotoent sprotoent eprotoent -- protocols
+    gsbyname gsbyport gservent sservent eservent      -- services
+
+    gpwnam gpwuid gpwent spwent epwent getlogin       -- users
+    ggrnam ggrgid ggrent sgrent egrent                -- groups
+
+=item :browse
+
+A handy tag name for a I<reasonable> default set of ops beyond the
+:default optag.  Like :default (and indeed all the other optags) its
+current definition is unstable while development continues. It will change.
+
+The :browse tag represents the next step beyond :default. It it a
+superset of the :default ops and adds :filesys_read the :sys_db.
+The intent being that scripts can access more (possibly sensitive)
+information about your system but not be able to change it.
+
+    :default :filesys_read :sys_db
+
+=item :filesys_open
+
+    sysopen open close
+    umask binmode
+
+    open_dir closedir -- other dir ops are in :base_io
+
+=item :filesys_write
+
+    link unlink rename symlink truncate
+
+    mkdir rmdir
+
+    utime chmod chown
+
+    fcntl -- not strictly filesys related, but possibly as dangerous?
+
+=item :subprocess
+
+    backtick system
+
+    fork
+
+    wait waitpid
+
+    glob -- access to Cshell via <`rm *`>
+
+=item :ownprocess
+
+    exec exit kill
+
+    time tms -- could be used for timing attacks (paranoid?)
+
+=item :others
+
+This tag holds groups of assorted specialist opcodes that don't warrant
+having optags defined for them.
+
+SystemV Interprocess Communications:
+
+    msgctl msgget msgrcv msgsnd
+
+    semctl semget semop
+
+    shmctl shmget shmread shmwrite
+
+=item :still_to_be_decided
+
+    chdir
+    flock ioctl
+
+    socket getpeername ssockopt
+    bind connect listen accept shutdown gsockopt getsockname
+
+    sleep alarm -- changes global timer state and signal handling
+    sort -- assorted problems including core dumps
+    tied -- can be used to access object implementing a tie
+    pack unpack -- can be used to create/use memory pointers
+
+    entereval -- can be used to hide code from initial compile
+    require dofile 
+
+    caller -- get info about calling environment and args
+
+    reset
+
+    dbstate -- perl -d version of nextstate(ment) opcode
+
+=item :dangerous
+
+This tag is simply a bucket for opcodes that are unlikely to be used via
+a tag name but need to be tagged for completeness and documentation.
+
+    syscall dump chroot
+
+
+=back
+
+=head1 SEE ALSO
+
+ops(3) -- perl pragma interface to Opcode module.
+
+Safe(3) -- Opcode and namespace limited execution compartments
+
+=head1 AUTHORS
+
+Originally designed and implemented by Malcolm Beattie,
+mbeattie@sable.ox.ac.uk as part of Safe version 1.
+
+Split out from Safe module version 1, named opcode tags and other
+changes added by Tim Bunce.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/POSIX.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/POSIX.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/POSIX.pm	(revision 14489)
@@ -0,0 +1,965 @@
+package POSIX;
+
+our(@ISA, %EXPORT_TAGS, @EXPORT_OK, $AUTOLOAD) = ();
+
+our $VERSION = "1.09";
+
+use AutoLoader;
+
+use XSLoader ();
+
+# Grandfather old foo_h form to new :foo_h form
+my $loaded;
+
+sub import {
+    load_imports() unless $loaded++;
+    my $this = shift;
+    my @list = map { m/^\w+_h$/ ? ":$_" : $_ } @_;
+    local $Exporter::ExportLevel = 1;
+    Exporter::import($this,@list);
+}
+
+sub croak { require Carp;  goto &Carp::croak }
+# declare usage to assist AutoLoad
+sub usage;
+
+XSLoader::load 'POSIX', $VERSION;
+
+my %NON_CONSTS = (map {($_,1)}
+                  qw(S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISREG WEXITSTATUS
+                     WIFEXITED WIFSIGNALED WIFSTOPPED WSTOPSIG WTERMSIG));
+
+sub AUTOLOAD {
+    if ($AUTOLOAD =~ /::(_?[a-z])/) {
+	# require AutoLoader;
+	$AutoLoader::AUTOLOAD = $AUTOLOAD;
+	goto &AutoLoader::AUTOLOAD
+    }
+    local $! = 0;
+    my $constname = $AUTOLOAD;
+    $constname =~ s/.*:://;
+    if ($NON_CONSTS{$constname}) {
+        my ($val, $error) = &int_macro_int($constname, $_[0]);
+        croak $error if $error;
+        *$AUTOLOAD = sub { &int_macro_int($constname, $_[0]) };
+    } else {
+        my ($error, $val) = constant($constname);
+        croak $error if $error;
+	*$AUTOLOAD = sub { $val };
+    }
+
+    goto &$AUTOLOAD;
+}
+
+package POSIX::SigAction;
+
+use AutoLoader 'AUTOLOAD';
+sub new { bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3] || 0, SAFE => 0}, $_[0] }
+
+package POSIX;
+
+1;
+__END__
+
+sub usage {
+    my ($mess) = @_;
+    croak "Usage: POSIX::$mess";
+}
+
+sub redef {
+    my ($mess) = @_;
+    croak "Use method $mess instead";
+}
+
+sub unimpl {
+    my ($mess) = @_;
+    $mess =~ s/xxx//;
+    croak "Unimplemented: POSIX::$mess";
+}
+
+sub assert {
+    usage "assert(expr)" if @_ != 1;
+    if (!$_[0]) {
+	croak "Assertion failed";
+    }
+}
+
+sub tolower {
+    usage "tolower(string)" if @_ != 1;
+    lc($_[0]);
+}
+
+sub toupper {
+    usage "toupper(string)" if @_ != 1;
+    uc($_[0]);
+}
+
+sub closedir {
+    usage "closedir(dirhandle)" if @_ != 1;
+    CORE::closedir($_[0]);
+}
+
+sub opendir {
+    usage "opendir(directory)" if @_ != 1;
+    my $dirhandle;
+    CORE::opendir($dirhandle, $_[0])
+	? $dirhandle
+	: undef;
+}
+
+sub readdir {
+    usage "readdir(dirhandle)" if @_ != 1;
+    CORE::readdir($_[0]);
+}
+
+sub rewinddir {
+    usage "rewinddir(dirhandle)" if @_ != 1;
+    CORE::rewinddir($_[0]);
+}
+
+sub errno {
+    usage "errno()" if @_ != 0;
+    $! + 0;
+}
+
+sub creat {
+    usage "creat(filename, mode)" if @_ != 2;
+    &open($_[0], &O_WRONLY | &O_CREAT | &O_TRUNC, $_[1]);
+}
+
+sub fcntl {
+    usage "fcntl(filehandle, cmd, arg)" if @_ != 3;
+    CORE::fcntl($_[0], $_[1], $_[2]);
+}
+
+sub getgrgid {
+    usage "getgrgid(gid)" if @_ != 1;
+    CORE::getgrgid($_[0]);
+}
+
+sub getgrnam {
+    usage "getgrnam(name)" if @_ != 1;
+    CORE::getgrnam($_[0]);
+}
+
+sub atan2 {
+    usage "atan2(x,y)" if @_ != 2;
+    CORE::atan2($_[0], $_[1]);
+}
+
+sub cos {
+    usage "cos(x)" if @_ != 1;
+    CORE::cos($_[0]);
+}
+
+sub exp {
+    usage "exp(x)" if @_ != 1;
+    CORE::exp($_[0]);
+}
+
+sub fabs {
+    usage "fabs(x)" if @_ != 1;
+    CORE::abs($_[0]);
+}
+
+sub log {
+    usage "log(x)" if @_ != 1;
+    CORE::log($_[0]);
+}
+
+sub pow {
+    usage "pow(x,exponent)" if @_ != 2;
+    $_[0] ** $_[1];
+}
+
+sub sin {
+    usage "sin(x)" if @_ != 1;
+    CORE::sin($_[0]);
+}
+
+sub sqrt {
+    usage "sqrt(x)" if @_ != 1;
+    CORE::sqrt($_[0]);
+}
+
+sub getpwnam {
+    usage "getpwnam(name)" if @_ != 1;
+    CORE::getpwnam($_[0]);
+}
+
+sub getpwuid {
+    usage "getpwuid(uid)" if @_ != 1;
+    CORE::getpwuid($_[0]);
+}
+
+sub longjmp {
+    unimpl "longjmp() is C-specific: use die instead";
+}
+
+sub setjmp {
+    unimpl "setjmp() is C-specific: use eval {} instead";
+}
+
+sub siglongjmp {
+    unimpl "siglongjmp() is C-specific: use die instead";
+}
+
+sub sigsetjmp {
+    unimpl "sigsetjmp() is C-specific: use eval {} instead";
+}
+
+sub kill {
+    usage "kill(pid, sig)" if @_ != 2;
+    CORE::kill $_[1], $_[0];
+}
+
+sub raise {
+    usage "raise(sig)" if @_ != 1;
+    CORE::kill $_[0], $$;	# Is this good enough?
+}
+
+sub offsetof {
+    unimpl "offsetof() is C-specific, stopped";
+}
+
+sub clearerr {
+    redef "IO::Handle::clearerr()";
+}
+
+sub fclose {
+    redef "IO::Handle::close()";
+}
+
+sub fdopen {
+    redef "IO::Handle::new_from_fd()";
+}
+
+sub feof {
+    redef "IO::Handle::eof()";
+}
+
+sub fgetc {
+    redef "IO::Handle::getc()";
+}
+
+sub fgets {
+    redef "IO::Handle::gets()";
+}
+
+sub fileno {
+    redef "IO::Handle::fileno()";
+}
+
+sub fopen {
+    redef "IO::File::open()";
+}
+
+sub fprintf {
+    unimpl "fprintf() is C-specific--use printf instead";
+}
+
+sub fputc {
+    unimpl "fputc() is C-specific--use print instead";
+}
+
+sub fputs {
+    unimpl "fputs() is C-specific--use print instead";
+}
+
+sub fread {
+    unimpl "fread() is C-specific--use read instead";
+}
+
+sub freopen {
+    unimpl "freopen() is C-specific--use open instead";
+}
+
+sub fscanf {
+    unimpl "fscanf() is C-specific--use <> and regular expressions instead";
+}
+
+sub fseek {
+    redef "IO::Seekable::seek()";
+}
+
+sub fsync {
+    redef "IO::Handle::sync()";
+}
+
+sub ferror {
+    redef "IO::Handle::error()";
+}
+
+sub fflush {
+    redef "IO::Handle::flush()";
+}
+
+sub fgetpos {
+    redef "IO::Seekable::getpos()";
+}
+
+sub fsetpos {
+    redef "IO::Seekable::setpos()";
+}
+
+sub ftell {
+    redef "IO::Seekable::tell()";
+}
+
+sub fwrite {
+    unimpl "fwrite() is C-specific--use print instead";
+}
+
+sub getc {
+    usage "getc(handle)" if @_ != 1;
+    CORE::getc($_[0]);
+}
+
+sub getchar {
+    usage "getchar()" if @_ != 0;
+    CORE::getc(STDIN);
+}
+
+sub gets {
+    usage "gets()" if @_ != 0;
+    scalar <STDIN>;
+}
+
+sub perror {
+    print STDERR "@_: " if @_;
+    print STDERR $!,"\n";
+}
+
+sub printf {
+    usage "printf(pattern, args...)" if @_ < 1;
+    CORE::printf STDOUT @_;
+}
+
+sub putc {
+    unimpl "putc() is C-specific--use print instead";
+}
+
+sub putchar {
+    unimpl "putchar() is C-specific--use print instead";
+}
+
+sub puts {
+    unimpl "puts() is C-specific--use print instead";
+}
+
+sub remove {
+    usage "remove(filename)" if @_ != 1;
+    CORE::unlink($_[0]);
+}
+
+sub rename {
+    usage "rename(oldfilename, newfilename)" if @_ != 2;
+    CORE::rename($_[0], $_[1]);
+}
+
+sub rewind {
+    usage "rewind(filehandle)" if @_ != 1;
+    CORE::seek($_[0],0,0);
+}
+
+sub scanf {
+    unimpl "scanf() is C-specific--use <> and regular expressions instead";
+}
+
+sub sprintf {
+    usage "sprintf(pattern,args)" if @_ == 0;
+    CORE::sprintf(shift,@_);
+}
+
+sub sscanf {
+    unimpl "sscanf() is C-specific--use regular expressions instead";
+}
+
+sub tmpfile {
+    redef "IO::File::new_tmpfile()";
+}
+
+sub ungetc {
+    redef "IO::Handle::ungetc()";
+}
+
+sub vfprintf {
+    unimpl "vfprintf() is C-specific";
+}
+
+sub vprintf {
+    unimpl "vprintf() is C-specific";
+}
+
+sub vsprintf {
+    unimpl "vsprintf() is C-specific";
+}
+
+sub abs {
+    usage "abs(x)" if @_ != 1;
+    CORE::abs($_[0]);
+}
+
+sub atexit {
+    unimpl "atexit() is C-specific: use END {} instead";
+}
+
+sub atof {
+    unimpl "atof() is C-specific, stopped";
+}
+
+sub atoi {
+    unimpl "atoi() is C-specific, stopped";
+}
+
+sub atol {
+    unimpl "atol() is C-specific, stopped";
+}
+
+sub bsearch {
+    unimpl "bsearch() not supplied";
+}
+
+sub calloc {
+    unimpl "calloc() is C-specific, stopped";
+}
+
+sub div {
+    unimpl "div() is C-specific, use /, % and int instead";
+}
+
+sub exit {
+    usage "exit(status)" if @_ != 1;
+    CORE::exit($_[0]);
+}
+
+sub free {
+    unimpl "free() is C-specific, stopped";
+}
+
+sub getenv {
+    usage "getenv(name)" if @_ != 1;
+    $ENV{$_[0]};
+}
+
+sub labs {
+    unimpl "labs() is C-specific, use abs instead";
+}
+
+sub ldiv {
+    unimpl "ldiv() is C-specific, use /, % and int instead";
+}
+
+sub malloc {
+    unimpl "malloc() is C-specific, stopped";
+}
+
+sub qsort {
+    unimpl "qsort() is C-specific, use sort instead";
+}
+
+sub rand {
+    unimpl "rand() is non-portable, use Perl's rand instead";
+}
+
+sub realloc {
+    unimpl "realloc() is C-specific, stopped";
+}
+
+sub srand {
+    unimpl "srand()";
+}
+
+sub system {
+    usage "system(command)" if @_ != 1;
+    CORE::system($_[0]);
+}
+
+sub memchr {
+    unimpl "memchr() is C-specific, use index() instead";
+}
+
+sub memcmp {
+    unimpl "memcmp() is C-specific, use eq instead";
+}
+
+sub memcpy {
+    unimpl "memcpy() is C-specific, use = instead";
+}
+
+sub memmove {
+    unimpl "memmove() is C-specific, use = instead";
+}
+
+sub memset {
+    unimpl "memset() is C-specific, use x instead";
+}
+
+sub strcat {
+    unimpl "strcat() is C-specific, use .= instead";
+}
+
+sub strchr {
+    unimpl "strchr() is C-specific, use index() instead";
+}
+
+sub strcmp {
+    unimpl "strcmp() is C-specific, use eq instead";
+}
+
+sub strcpy {
+    unimpl "strcpy() is C-specific, use = instead";
+}
+
+sub strcspn {
+    unimpl "strcspn() is C-specific, use regular expressions instead";
+}
+
+sub strerror {
+    usage "strerror(errno)" if @_ != 1;
+    local $! = $_[0];
+    $! . "";
+}
+
+sub strlen {
+    unimpl "strlen() is C-specific, use length instead";
+}
+
+sub strncat {
+    unimpl "strncat() is C-specific, use .= instead";
+}
+
+sub strncmp {
+    unimpl "strncmp() is C-specific, use eq instead";
+}
+
+sub strncpy {
+    unimpl "strncpy() is C-specific, use = instead";
+}
+
+sub strpbrk {
+    unimpl "strpbrk() is C-specific, stopped";
+}
+
+sub strrchr {
+    unimpl "strrchr() is C-specific, use rindex() instead";
+}
+
+sub strspn {
+    unimpl "strspn() is C-specific, stopped";
+}
+
+sub strstr {
+    usage "strstr(big, little)" if @_ != 2;
+    CORE::index($_[0], $_[1]);
+}
+
+sub strtok {
+    unimpl "strtok() is C-specific, stopped";
+}
+
+sub chmod {
+    usage "chmod(mode, filename)" if @_ != 2;
+    CORE::chmod($_[0], $_[1]);
+}
+
+sub fstat {
+    usage "fstat(fd)" if @_ != 1;
+    local *TMP;
+    CORE::open(TMP, "<&$_[0]");		# Gross.
+    my @l = CORE::stat(TMP);
+    CORE::close(TMP);
+    @l;
+}
+
+sub mkdir {
+    usage "mkdir(directoryname, mode)" if @_ != 2;
+    CORE::mkdir($_[0], $_[1]);
+}
+
+sub stat {
+    usage "stat(filename)" if @_ != 1;
+    CORE::stat($_[0]);
+}
+
+sub umask {
+    usage "umask(mask)" if @_ != 1;
+    CORE::umask($_[0]);
+}
+
+sub wait {
+    usage "wait()" if @_ != 0;
+    CORE::wait();
+}
+
+sub waitpid {
+    usage "waitpid(pid, options)" if @_ != 2;
+    CORE::waitpid($_[0], $_[1]);
+}
+
+sub gmtime {
+    usage "gmtime(time)" if @_ != 1;
+    CORE::gmtime($_[0]);
+}
+
+sub localtime {
+    usage "localtime(time)" if @_ != 1;
+    CORE::localtime($_[0]);
+}
+
+sub time {
+    usage "time()" if @_ != 0;
+    CORE::time;
+}
+
+sub alarm {
+    usage "alarm(seconds)" if @_ != 1;
+    CORE::alarm($_[0]);
+}
+
+sub chdir {
+    usage "chdir(directory)" if @_ != 1;
+    CORE::chdir($_[0]);
+}
+
+sub chown {
+    usage "chown(uid, gid, filename)" if @_ != 3;
+    CORE::chown($_[0], $_[1], $_[2]);
+}
+
+sub execl {
+    unimpl "execl() is C-specific, stopped";
+}
+
+sub execle {
+    unimpl "execle() is C-specific, stopped";
+}
+
+sub execlp {
+    unimpl "execlp() is C-specific, stopped";
+}
+
+sub execv {
+    unimpl "execv() is C-specific, stopped";
+}
+
+sub execve {
+    unimpl "execve() is C-specific, stopped";
+}
+
+sub execvp {
+    unimpl "execvp() is C-specific, stopped";
+}
+
+sub fork {
+    usage "fork()" if @_ != 0;
+    CORE::fork;
+}
+
+sub getegid {
+    usage "getegid()" if @_ != 0;
+    $) + 0;
+}
+
+sub geteuid {
+    usage "geteuid()" if @_ != 0;
+    $> + 0;
+}
+
+sub getgid {
+    usage "getgid()" if @_ != 0;
+    $( + 0;
+}
+
+sub getgroups {
+    usage "getgroups()" if @_ != 0;
+    my %seen;
+    grep(!$seen{$_}++, split(' ', $) ));
+}
+
+sub getlogin {
+    usage "getlogin()" if @_ != 0;
+    CORE::getlogin();
+}
+
+sub getpgrp {
+    usage "getpgrp()" if @_ != 0;
+    CORE::getpgrp;
+}
+
+sub getpid {
+    usage "getpid()" if @_ != 0;
+    $$;
+}
+
+sub getppid {
+    usage "getppid()" if @_ != 0;
+    CORE::getppid;
+}
+
+sub getuid {
+    usage "getuid()" if @_ != 0;
+    $<;
+}
+
+sub isatty {
+    usage "isatty(filehandle)" if @_ != 1;
+    -t $_[0];
+}
+
+sub link {
+    usage "link(oldfilename, newfilename)" if @_ != 2;
+    CORE::link($_[0], $_[1]);
+}
+
+sub rmdir {
+    usage "rmdir(directoryname)" if @_ != 1;
+    CORE::rmdir($_[0]);
+}
+
+sub setbuf {
+    redef "IO::Handle::setbuf()";
+}
+
+sub setvbuf {
+    redef "IO::Handle::setvbuf()";
+}
+
+sub sleep {
+    usage "sleep(seconds)" if @_ != 1;
+    $_[0] - CORE::sleep($_[0]);
+}
+
+sub unlink {
+    usage "unlink(filename)" if @_ != 1;
+    CORE::unlink($_[0]);
+}
+
+sub utime {
+    usage "utime(filename, atime, mtime)" if @_ != 3;
+    CORE::utime($_[1], $_[2], $_[0]);
+}
+
+sub load_imports {
+%EXPORT_TAGS = (
+
+    assert_h =>	[qw(assert NDEBUG)],
+
+    ctype_h =>	[qw(isalnum isalpha iscntrl isdigit isgraph islower
+		isprint ispunct isspace isupper isxdigit tolower toupper)],
+
+    dirent_h =>	[],
+
+    errno_h =>	[qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
+		EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
+		ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
+		EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
+		EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
+		EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
+		ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
+		ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
+		ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
+		EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
+		ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
+		ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
+		EUSERS EWOULDBLOCK EXDEV errno)],
+
+    fcntl_h =>	[qw(FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_RDLCK
+		F_SETFD F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK
+		O_ACCMODE O_APPEND O_CREAT O_EXCL O_NOCTTY O_NONBLOCK
+		O_RDONLY O_RDWR O_TRUNC O_WRONLY
+		creat
+		SEEK_CUR SEEK_END SEEK_SET
+		S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
+		S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG S_ISUID
+		S_IWGRP S_IWOTH S_IWUSR)],
+
+    float_h =>	[qw(DBL_DIG DBL_EPSILON DBL_MANT_DIG
+		DBL_MAX DBL_MAX_10_EXP DBL_MAX_EXP
+		DBL_MIN DBL_MIN_10_EXP DBL_MIN_EXP
+		FLT_DIG FLT_EPSILON FLT_MANT_DIG
+		FLT_MAX FLT_MAX_10_EXP FLT_MAX_EXP
+		FLT_MIN FLT_MIN_10_EXP FLT_MIN_EXP
+		FLT_RADIX FLT_ROUNDS
+		LDBL_DIG LDBL_EPSILON LDBL_MANT_DIG
+		LDBL_MAX LDBL_MAX_10_EXP LDBL_MAX_EXP
+		LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP)],
+
+    grp_h =>	[],
+
+    limits_h =>	[qw( ARG_MAX CHAR_BIT CHAR_MAX CHAR_MIN CHILD_MAX
+		INT_MAX INT_MIN LINK_MAX LONG_MAX LONG_MIN MAX_CANON
+		MAX_INPUT MB_LEN_MAX NAME_MAX NGROUPS_MAX OPEN_MAX
+		PATH_MAX PIPE_BUF SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN
+		SSIZE_MAX STREAM_MAX TZNAME_MAX UCHAR_MAX UINT_MAX
+		ULONG_MAX USHRT_MAX _POSIX_ARG_MAX _POSIX_CHILD_MAX
+		_POSIX_LINK_MAX _POSIX_MAX_CANON _POSIX_MAX_INPUT
+		_POSIX_NAME_MAX _POSIX_NGROUPS_MAX _POSIX_OPEN_MAX
+		_POSIX_PATH_MAX _POSIX_PIPE_BUF _POSIX_SSIZE_MAX
+		_POSIX_STREAM_MAX _POSIX_TZNAME_MAX)],
+
+    locale_h =>	[qw(LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES
+		    LC_MONETARY LC_NUMERIC LC_TIME NULL
+		    localeconv setlocale)],
+
+    math_h =>	[qw(HUGE_VAL acos asin atan ceil cosh fabs floor fmod
+		frexp ldexp log10 modf pow sinh tan tanh)],
+
+    pwd_h =>	[],
+
+    setjmp_h =>	[qw(longjmp setjmp siglongjmp sigsetjmp)],
+
+    signal_h =>	[qw(SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK
+		SA_RESETHAND SA_RESTART SA_SIGINFO SIGABRT SIGALRM
+		SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL
+		SIGPIPE SIGQUIT SIGSEGV SIGSTOP SIGTERM SIGTSTP SIGTTIN
+		SIGTTOU SIGUSR1 SIGUSR2 SIG_BLOCK SIG_DFL SIG_ERR
+		SIG_IGN SIG_SETMASK SIG_UNBLOCK raise sigaction signal
+		sigpending sigprocmask sigsuspend)],
+
+    stdarg_h =>	[],
+
+    stddef_h =>	[qw(NULL offsetof)],
+
+    stdio_h =>	[qw(BUFSIZ EOF FILENAME_MAX L_ctermid L_cuserid
+		L_tmpname NULL SEEK_CUR SEEK_END SEEK_SET
+		STREAM_MAX TMP_MAX stderr stdin stdout
+		clearerr fclose fdopen feof ferror fflush fgetc fgetpos
+		fgets fopen fprintf fputc fputs fread freopen
+		fscanf fseek fsetpos ftell fwrite getchar gets
+		perror putc putchar puts remove rewind
+		scanf setbuf setvbuf sscanf tmpfile tmpnam
+		ungetc vfprintf vprintf vsprintf)],
+
+    stdlib_h =>	[qw(EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX NULL RAND_MAX
+		abort atexit atof atoi atol bsearch calloc div
+		free getenv labs ldiv malloc mblen mbstowcs mbtowc
+		qsort realloc strtod strtol strtoul wcstombs wctomb)],
+
+    string_h =>	[qw(NULL memchr memcmp memcpy memmove memset strcat
+		strchr strcmp strcoll strcpy strcspn strerror strlen
+		strncat strncmp strncpy strpbrk strrchr strspn strstr
+		strtok strxfrm)],
+
+    sys_stat_h => [qw(S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
+		S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG
+		S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR
+		fstat mkfifo)],
+
+    sys_times_h => [],
+
+    sys_types_h => [],
+
+    sys_utsname_h => [qw(uname)],
+
+    sys_wait_h => [qw(WEXITSTATUS WIFEXITED WIFSIGNALED WIFSTOPPED
+		WNOHANG WSTOPSIG WTERMSIG WUNTRACED)],
+
+    termios_h => [qw( B0 B110 B1200 B134 B150 B1800 B19200 B200 B2400
+		B300 B38400 B4800 B50 B600 B75 B9600 BRKINT CLOCAL
+		CREAD CS5 CS6 CS7 CS8 CSIZE CSTOPB ECHO ECHOE ECHOK
+		ECHONL HUPCL ICANON ICRNL IEXTEN IGNBRK IGNCR IGNPAR
+		INLCR INPCK ISIG ISTRIP IXOFF IXON NCCS NOFLSH OPOST
+		PARENB PARMRK PARODD TCIFLUSH TCIOFF TCIOFLUSH TCION
+		TCOFLUSH TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW
+		TOSTOP VEOF VEOL VERASE VINTR VKILL VMIN VQUIT VSTART
+		VSTOP VSUSP VTIME
+		cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcdrain
+		tcflow tcflush tcgetattr tcsendbreak tcsetattr )],
+
+    time_h =>	[qw(CLK_TCK CLOCKS_PER_SEC NULL asctime clock ctime
+		difftime mktime strftime tzset tzname)],
+
+    unistd_h =>	[qw(F_OK NULL R_OK SEEK_CUR SEEK_END SEEK_SET
+		STDERR_FILENO STDIN_FILENO STDOUT_FILENO W_OK X_OK
+		_PC_CHOWN_RESTRICTED _PC_LINK_MAX _PC_MAX_CANON
+		_PC_MAX_INPUT _PC_NAME_MAX _PC_NO_TRUNC _PC_PATH_MAX
+		_PC_PIPE_BUF _PC_VDISABLE _POSIX_CHOWN_RESTRICTED
+		_POSIX_JOB_CONTROL _POSIX_NO_TRUNC _POSIX_SAVED_IDS
+		_POSIX_VDISABLE _POSIX_VERSION _SC_ARG_MAX
+		_SC_CHILD_MAX _SC_CLK_TCK _SC_JOB_CONTROL
+		_SC_NGROUPS_MAX _SC_OPEN_MAX _SC_PAGESIZE _SC_SAVED_IDS
+		_SC_STREAM_MAX _SC_TZNAME_MAX _SC_VERSION
+		_exit access ctermid cuserid
+		dup2 dup execl execle execlp execv execve execvp
+		fpathconf fsync getcwd getegid geteuid getgid getgroups
+		getpid getuid isatty lseek pathconf pause setgid setpgid
+		setsid setuid sysconf tcgetpgrp tcsetpgrp ttyname)],
+
+    utime_h =>	[],
+
+);
+
+# Exporter::export_tags();
+for (values %EXPORT_TAGS) {
+  push @EXPORT, @$_;
+}
+
+@EXPORT_OK = qw(
+		abs
+		alarm
+		atan2
+		chdir
+		chmod
+		chown
+		close
+		closedir
+		cos
+		exit
+		exp
+		fcntl
+		fileno
+		fork
+		getc
+		getgrgid
+		getgrnam
+		getlogin
+		getpgrp
+		getppid
+		getpwnam
+		getpwuid
+		gmtime
+		isatty
+		kill
+		lchown
+		link
+		localtime
+		log
+		mkdir
+		nice
+		open
+		opendir
+		pipe
+		printf
+		rand
+		read
+		readdir
+		rename
+		rewinddir
+		rmdir
+		sin
+		sleep
+		sprintf
+		sqrt
+		srand
+		stat
+		system
+		time
+		times
+		umask
+		unlink
+		utime
+		wait
+		waitpid
+		write
+);
+
+require Exporter;
+}
+
+package POSIX::SigAction;
+
+sub handler { $_[0]->{HANDLER} = $_[1] if @_ > 1; $_[0]->{HANDLER} };
+sub mask    { $_[0]->{MASK}    = $_[1] if @_ > 1; $_[0]->{MASK} };
+sub flags   { $_[0]->{FLAGS}   = $_[1] if @_ > 1; $_[0]->{FLAGS} };
+sub safe    { $_[0]->{SAFE}    = $_[1] if @_ > 1; $_[0]->{SAFE} };
Index: /for-distributions/trunk/bin/windows/perl/lib/POSIX.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/POSIX.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/POSIX.pod	(revision 14489)
@@ -0,0 +1,2127 @@
+=head1 NAME
+
+POSIX - Perl interface to IEEE Std 1003.1
+
+=head1 SYNOPSIS
+
+    use POSIX;
+    use POSIX qw(setsid);
+    use POSIX qw(:errno_h :fcntl_h);
+
+    printf "EINTR is %d\n", EINTR;
+
+    $sess_id = POSIX::setsid();
+
+    $fd = POSIX::open($path, O_CREAT|O_EXCL|O_WRONLY, 0644);
+	# note: that's a filedescriptor, *NOT* a filehandle
+
+=head1 DESCRIPTION
+
+The POSIX module permits you to access all (or nearly all) the standard
+POSIX 1003.1 identifiers.  Many of these identifiers have been given Perl-ish
+interfaces.
+
+I<Everything is exported by default> with the exception of any POSIX
+functions with the same name as a built-in Perl function, such as
+C<abs>, C<alarm>, C<rmdir>, C<write>, etc.., which will be exported
+only if you ask for them explicitly.  This is an unfortunate backwards
+compatibility feature.  You can stop the exporting by saying C<use
+POSIX ()> and then use the fully qualified names (ie. C<POSIX::SEEK_END>).
+
+This document gives a condensed list of the features available in the POSIX
+module.  Consult your operating system's manpages for general information on
+most features.  Consult L<perlfunc> for functions which are noted as being
+identical to Perl's builtin functions.
+
+The first section describes POSIX functions from the 1003.1 specification.
+The second section describes some classes for signal objects, TTY objects,
+and other miscellaneous objects.  The remaining sections list various
+constants and macros in an organization which roughly follows IEEE Std
+1003.1b-1993.
+
+=head1 NOTE
+
+The POSIX module is probably the most complex Perl module supplied with
+the standard distribution.  It incorporates autoloading, namespace games,
+and dynamic loading of code that's in Perl, C, or both.  It's a great
+source of wisdom.
+
+=head1 CAVEATS 
+
+A few functions are not implemented because they are C specific.  If you
+attempt to call these, they will print a message telling you that they
+aren't implemented, and suggest using the Perl equivalent should one
+exist.  For example, trying to access the setjmp() call will elicit the
+message "setjmp() is C-specific: use eval {} instead".
+
+Furthermore, some evil vendors will claim 1003.1 compliance, but in fact
+are not so: they will not pass the PCTS (POSIX Compliance Test Suites).
+For example, one vendor may not define EDEADLK, or the semantics of the
+errno values set by open(2) might not be quite right.  Perl does not
+attempt to verify POSIX compliance.  That means you can currently
+successfully say "use POSIX",  and then later in your program you find
+that your vendor has been lax and there's no usable ICANON macro after
+all.  This could be construed to be a bug.
+
+=head1 FUNCTIONS
+
+=over 8
+
+=item _exit
+
+This is identical to the C function C<_exit()>.  It exits the program
+immediately which means among other things buffered I/O is B<not> flushed.
+
+Note that when using threads and in Linux this is B<not> a good way to
+exit a thread because in Linux processes and threads are kind of the
+same thing (Note: while this is the situation in early 2003 there are
+projects under way to have threads with more POSIXly semantics in Linux).
+If you want not to return from a thread, detach the thread.
+
+=item abort
+
+This is identical to the C function C<abort()>.  It terminates the
+process with a C<SIGABRT> signal unless caught by a signal handler or
+if the handler does not return normally (it e.g.  does a C<longjmp>).
+
+=item abs
+
+This is identical to Perl's builtin C<abs()> function, returning
+the absolute value of its numerical argument.
+
+=item access
+
+Determines the accessibility of a file.
+
+	if( POSIX::access( "/", &POSIX::R_OK ) ){
+		print "have read permission\n";
+	}
+
+Returns C<undef> on failure.  Note: do not use C<access()> for
+security purposes.  Between the C<access()> call and the operation
+you are preparing for the permissions might change: a classic
+I<race condition>.
+
+=item acos
+
+This is identical to the C function C<acos()>, returning
+the arcus cosine of its numerical argument.  See also L<Math::Trig>.
+
+=item alarm
+
+This is identical to Perl's builtin C<alarm()> function,
+either for arming or disarming the C<SIGARLM> timer.
+
+=item asctime
+
+This is identical to the C function C<asctime()>.  It returns
+a string of the form
+
+	"Fri Jun  2 18:22:13 2000\n\0"
+
+and it is called thusly
+
+	$asctime = asctime($sec, $min, $hour, $mday, $mon, $year,
+			   $wday, $yday, $isdst);
+
+The C<$mon> is zero-based: January equals C<0>.  The C<$year> is
+1900-based: 2001 equals C<101>.  The C<$wday>, C<$yday>, and C<$isdst>
+default to zero (and the first two are usually ignored anyway).
+
+=item asin
+
+This is identical to the C function C<asin()>, returning
+the arcus sine of its numerical argument.  See also L<Math::Trig>.
+
+=item assert
+
+Unimplemented, but you can use L<perlfunc/die> and the L<Carp> module
+to achieve similar things.
+
+=item atan
+
+This is identical to the C function C<atan()>, returning the
+arcus tangent of its numerical argument.  See also L<Math::Trig>.
+
+=item atan2
+
+This is identical to Perl's builtin C<atan2()> function, returning
+the arcus tangent defined by its two numerical arguments, the I<y>
+coordinate and the I<x> coordinate.  See also L<Math::Trig>.
+
+=item atexit
+
+atexit() is C-specific: use C<END {}> instead, see L<perlsub>.
+
+=item atof
+
+atof() is C-specific.  Perl converts strings to numbers transparently.
+If you need to force a scalar to a number, add a zero to it.
+
+=item atoi
+
+atoi() is C-specific.  Perl converts strings to numbers transparently.
+If you need to force a scalar to a number, add a zero to it.
+If you need to have just the integer part, see L<perlfunc/int>.
+
+=item atol
+
+atol() is C-specific.  Perl converts strings to numbers transparently.
+If you need to force a scalar to a number, add a zero to it.
+If you need to have just the integer part, see L<perlfunc/int>.
+
+=item bsearch
+
+bsearch() not supplied.  For doing binary search on wordlists,
+see L<Search::Dict>.
+
+=item calloc
+
+calloc() is C-specific.  Perl does memory management transparently.
+
+=item ceil
+
+This is identical to the C function C<ceil()>, returning the smallest
+integer value greater than or equal to the given numerical argument.
+
+=item chdir
+
+This is identical to Perl's builtin C<chdir()> function, allowing
+one to change the working (default) directory, see L<perlfunc/chdir>.
+
+=item chmod
+
+This is identical to Perl's builtin C<chmod()> function, allowing
+one to change file and directory permissions, see L<perlfunc/chmod>.
+
+=item chown
+
+This is identical to Perl's builtin C<chown()> function, allowing one
+to change file and directory owners and groups, see L<perlfunc/chown>.
+
+=item clearerr
+
+Use the method C<IO::Handle::clearerr()> instead, to reset the error
+state (if any) and EOF state (if any) of the given stream.
+
+=item clock
+
+This is identical to the C function C<clock()>, returning the
+amount of spent processor time in microseconds.
+
+=item close
+
+Close the file.  This uses file descriptors such as those obtained by calling
+C<POSIX::open>.
+
+	$fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+	POSIX::close( $fd );
+
+Returns C<undef> on failure.
+
+See also L<perlfunc/close>.
+
+=item closedir
+
+This is identical to Perl's builtin C<closedir()> function for closing
+a directory handle, see L<perlfunc/closedir>.
+
+=item cos
+
+This is identical to Perl's builtin C<cos()> function, for returning
+the cosine of its numerical argument, see L<perlfunc/cos>.
+See also L<Math::Trig>.
+
+=item cosh
+
+This is identical to the C function C<cosh()>, for returning
+the hyperbolic cosine of its numeric argument.  See also L<Math::Trig>.
+
+=item creat
+
+Create a new file.  This returns a file descriptor like the ones returned by
+C<POSIX::open>.  Use C<POSIX::close> to close the file.
+
+	$fd = POSIX::creat( "foo", 0611 );
+	POSIX::close( $fd );
+
+See also L<perlfunc/sysopen> and its C<O_CREAT> flag.
+
+=item ctermid
+
+Generates the path name for the controlling terminal.
+
+	$path = POSIX::ctermid();
+
+=item ctime
+
+This is identical to the C function C<ctime()> and equivalent
+to C<asctime(localtime(...))>, see L</asctime> and L</localtime>.
+
+=item cuserid
+
+Get the login name of the owner of the current process.
+
+	$name = POSIX::cuserid();
+
+=item difftime
+
+This is identical to the C function C<difftime()>, for returning
+the time difference (in seconds) between two times (as returned
+by C<time()>), see L</time>.
+
+=item div
+
+div() is C-specific, use L<perlfunc/int> on the usual C</> division and
+the modulus C<%>.
+
+=item dup
+
+This is similar to the C function C<dup()>, for duplicating a file
+descriptor.
+
+This uses file descriptors such as those obtained by calling
+C<POSIX::open>.
+
+Returns C<undef> on failure.
+
+=item dup2
+
+This is similar to the C function C<dup2()>, for duplicating a file
+descriptor to an another known file descriptor.
+
+This uses file descriptors such as those obtained by calling
+C<POSIX::open>.
+
+Returns C<undef> on failure.
+
+=item errno
+
+Returns the value of errno.
+
+	$errno = POSIX::errno();
+
+This identical to the numerical values of the C<$!>, see L<perlvar/$ERRNO>.
+
+=item execl
+
+execl() is C-specific, see L<perlfunc/exec>.
+
+=item execle
+
+execle() is C-specific, see L<perlfunc/exec>.
+
+=item execlp
+
+execlp() is C-specific, see L<perlfunc/exec>.
+
+=item execv
+
+execv() is C-specific, see L<perlfunc/exec>.
+
+=item execve
+
+execve() is C-specific, see L<perlfunc/exec>.
+
+=item execvp
+
+execvp() is C-specific, see L<perlfunc/exec>.
+
+=item exit
+
+This is identical to Perl's builtin C<exit()> function for exiting the
+program, see L<perlfunc/exit>.
+
+=item exp
+
+This is identical to Perl's builtin C<exp()> function for
+returning the exponent (I<e>-based) of the numerical argument,
+see L<perlfunc/exp>.
+
+=item fabs
+
+This is identical to Perl's builtin C<abs()> function for returning
+the absolute value of the numerical argument, see L<perlfunc/abs>.
+
+=item fclose
+
+Use method C<IO::Handle::close()> instead, or see L<perlfunc/close>.
+
+=item fcntl
+
+This is identical to Perl's builtin C<fcntl()> function,
+see L<perlfunc/fcntl>.
+
+=item fdopen
+
+Use method C<IO::Handle::new_from_fd()> instead, or see L<perlfunc/open>.
+
+=item feof
+
+Use method C<IO::Handle::eof()> instead, or see L<perlfunc/eof>.
+
+=item ferror
+
+Use method C<IO::Handle::error()> instead.
+
+=item fflush
+
+Use method C<IO::Handle::flush()> instead.
+See also L<perlvar/$OUTPUT_AUTOFLUSH>.
+
+=item fgetc
+
+Use method C<IO::Handle::getc()> instead, or see L<perlfunc/read>.
+
+=item fgetpos
+
+Use method C<IO::Seekable::getpos()> instead, or see L<L/seek>.
+
+=item fgets
+
+Use method C<IO::Handle::gets()> instead.  Similar to E<lt>E<gt>, also known
+as L<perlfunc/readline>.
+
+=item fileno
+
+Use method C<IO::Handle::fileno()> instead, or see L<perlfunc/fileno>.
+
+=item floor
+
+This is identical to the C function C<floor()>, returning the largest
+integer value less than or equal to the numerical argument.
+
+=item fmod
+
+This is identical to the C function C<fmod()>.
+
+	$r = fmod($x, $y);
+
+It returns the remainder C<$r = $x - $n*$y>, where C<$n = trunc($x/$y)>.
+The C<$r> has the same sign as C<$x> and magnitude (absolute value)
+less than the magnitude of C<$y>.
+
+=item fopen
+
+Use method C<IO::File::open()> instead, or see L<perlfunc/open>.
+
+=item fork
+
+This is identical to Perl's builtin C<fork()> function
+for duplicating the current process, see L<perlfunc/fork>
+and L<perlfork> if you are in Windows.
+
+=item fpathconf
+
+Retrieves the value of a configurable limit on a file or directory.  This
+uses file descriptors such as those obtained by calling C<POSIX::open>.
+
+The following will determine the maximum length of the longest allowable
+pathname on the filesystem which holds C</var/foo>.
+
+	$fd = POSIX::open( "/var/foo", &POSIX::O_RDONLY );
+	$path_max = POSIX::fpathconf( $fd, &POSIX::_PC_PATH_MAX );
+
+Returns C<undef> on failure.
+
+=item fprintf
+
+fprintf() is C-specific, see L<perlfunc/printf> instead.
+
+=item fputc
+
+fputc() is C-specific, see L<perlfunc/print> instead.
+
+=item fputs
+
+fputs() is C-specific, see L<perlfunc/print> instead.
+
+=item fread
+
+fread() is C-specific, see L<perlfunc/read> instead.
+
+=item free
+
+free() is C-specific.  Perl does memory management transparently.
+
+=item freopen
+
+freopen() is C-specific, see L<perlfunc/open> instead.
+
+=item frexp
+
+Return the mantissa and exponent of a floating-point number.
+
+	($mantissa, $exponent) = POSIX::frexp( 1.234e56 );
+
+=item fscanf
+
+fscanf() is C-specific, use E<lt>E<gt> and regular expressions instead.
+
+=item fseek
+
+Use method C<IO::Seekable::seek()> instead, or see L<perlfunc/seek>.
+
+=item fsetpos
+
+Use method C<IO::Seekable::setpos()> instead, or seek L<perlfunc/seek>.
+
+=item fstat
+
+Get file status.  This uses file descriptors such as those obtained by
+calling C<POSIX::open>.  The data returned is identical to the data from
+Perl's builtin C<stat> function.
+
+	$fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+	@stats = POSIX::fstat( $fd );
+
+=item fsync
+
+Use method C<IO::Handle::sync()> instead.
+
+=item ftell
+
+Use method C<IO::Seekable::tell()> instead, or see L<perlfunc/tell>.
+
+=item fwrite
+
+fwrite() is C-specific, see L<perlfunc/print> instead.
+
+=item getc
+
+This is identical to Perl's builtin C<getc()> function,
+see L<perlfunc/getc>.
+
+=item getchar
+
+Returns one character from STDIN.  Identical to Perl's C<getc()>,
+see L<perlfunc/getc>.
+
+=item getcwd
+
+Returns the name of the current working directory.
+See also L<Cwd>.
+
+=item getegid
+
+Returns the effective group identifier.  Similar to Perl' s builtin
+variable C<$(>, see L<perlvar/$EGID>.
+
+=item getenv
+
+Returns the value of the specified environment variable.
+The same information is available through the C<%ENV> array.
+
+=item geteuid
+
+Returns the effective user identifier.  Identical to Perl's builtin C<$E<gt>>
+variable, see L<perlvar/$EUID>.
+
+=item getgid
+
+Returns the user's real group identifier.  Similar to Perl's builtin
+variable C<$)>, see L<perlvar/$GID>.
+
+=item getgrgid
+
+This is identical to Perl's builtin C<getgrgid()> function for
+returning group entries by group identifiers, see
+L<perlfunc/getgrgid>.
+
+=item getgrnam
+
+This is identical to Perl's builtin C<getgrnam()> function for
+returning group entries by group names, see L<perlfunc/getgrnam>.
+
+=item getgroups
+
+Returns the ids of the user's supplementary groups.  Similar to Perl's
+builtin variable C<$)>, see L<perlvar/$GID>.
+
+=item getlogin
+
+This is identical to Perl's builtin C<getlogin()> function for
+returning the user name associated with the current session, see
+L<perlfunc/getlogin>.
+
+=item getpgrp
+
+This is identical to Perl's builtin C<getpgrp()> function for
+returning the process group identifier of the current process, see
+L<perlfunc/getpgrp>.
+
+=item getpid
+
+Returns the process identifier.  Identical to Perl's builtin
+variable C<$$>, see L<perlvar/$PID>.
+
+=item getppid
+
+This is identical to Perl's builtin C<getppid()> function for
+returning the process identifier of the parent process of the current
+process , see L<perlfunc/getppid>.
+
+=item getpwnam
+
+This is identical to Perl's builtin C<getpwnam()> function for
+returning user entries by user names, see L<perlfunc/getpwnam>.
+
+=item getpwuid
+
+This is identical to Perl's builtin C<getpwuid()> function for
+returning user entries by user identifiers, see L<perlfunc/getpwuid>.
+
+=item gets
+
+Returns one line from C<STDIN>, similar to E<lt>E<gt>, also known
+as the C<readline()> function, see L<perlfunc/readline>.
+
+B<NOTE>: if you have C programs that still use C<gets()>, be very
+afraid.  The C<gets()> function is a source of endless grief because
+it has no buffer overrun checks.  It should B<never> be used.  The
+C<fgets()> function should be preferred instead.
+
+=item getuid
+
+Returns the user's identifier.  Identical to Perl's builtin C<$E<lt>> variable,
+see L<perlvar/$UID>.
+
+=item gmtime
+
+This is identical to Perl's builtin C<gmtime()> function for
+converting seconds since the epoch to a date in Greenwich Mean Time,
+see L<perlfunc/gmtime>.
+
+=item isalnum
+
+This is identical to the C function, except that it can apply to a
+single character or to a whole string.  Note that locale settings may
+affect what characters are considered C<isalnum>.  Does not work on
+Unicode characters code point 256 or higher.  Consider using regular
+expressions and the C</[[:alnum:]]/> construct instead, or possibly
+the C</\w/> construct.
+
+=item isalpha
+
+This is identical to the C function, except that it can apply to
+a single character or to a whole string.  Note that locale settings
+may affect what characters are considered C<isalpha>.  Does not work
+on Unicode characters code point 256 or higher.  Consider using regular
+expressions and the C</[[:alpha:]]/> construct instead.
+
+=item isatty
+
+Returns a boolean indicating whether the specified filehandle is connected
+to a tty.  Similar to the C<-t> operator, see L<perlfunc/-X>.
+
+=item iscntrl
+
+This is identical to the C function, except that it can apply to
+a single character or to a whole string.  Note that locale settings
+may affect what characters are considered C<iscntrl>.  Does not work
+on Unicode characters code point 256 or higher.  Consider using regular
+expressions and the C</[[:cntrl:]]/> construct instead.
+
+=item isdigit
+
+This is identical to the C function, except that it can apply to
+a single character or to a whole string.  Note that locale settings
+may affect what characters are considered C<isdigit> (unlikely, but
+still possible). Does not work on Unicode characters code point 256
+or higher.  Consider using regular expressions and the C</[[:digit:]]/>
+construct instead, or the C</\d/> construct.
+
+=item isgraph
+
+This is identical to the C function, except that it can apply to
+a single character or to a whole string.  Note that locale settings
+may affect what characters are considered C<isgraph>.  Does not work
+on Unicode characters code point 256 or higher.  Consider using regular
+expressions and the C</[[:graph:]]/> construct instead.
+
+=item islower
+
+This is identical to the C function, except that it can apply to
+a single character or to a whole string.  Note that locale settings
+may affect what characters are considered C<islower>.  Does not work
+on Unicode characters code point 256 or higher.  Consider using regular
+expressions and the C</[[:lower:]]/> construct instead.  Do B<not> use
+C</[a-z]/>.
+
+=item isprint
+
+This is identical to the C function, except that it can apply to
+a single character or to a whole string.  Note that locale settings
+may affect what characters are considered C<isprint>.  Does not work
+on Unicode characters code point 256 or higher.  Consider using regular
+expressions and the C</[[:print:]]/> construct instead.
+
+=item ispunct
+
+This is identical to the C function, except that it can apply to
+a single character or to a whole string.  Note that locale settings
+may affect what characters are considered C<ispunct>.  Does not work
+on Unicode characters code point 256 or higher.  Consider using regular
+expressions and the C</[[:punct:]]/> construct instead.
+
+=item isspace
+
+This is identical to the C function, except that it can apply to
+a single character or to a whole string.  Note that locale settings
+may affect what characters are considered C<isspace>.  Does not work
+on Unicode characters code point 256 or higher.  Consider using regular
+expressions and the C</[[:space:]]/> construct instead, or the C</\s/>
+construct.  (Note that C</\s/> and C</[[:space:]]/> are slightly
+different in that C</[[:space:]]/> can normally match a vertical tab,
+while C</\s/> does not.)
+
+=item isupper
+
+This is identical to the C function, except that it can apply to
+a single character or to a whole string.  Note that locale settings
+may affect what characters are considered C<isupper>.  Does not work
+on Unicode characters code point 256 or higher.  Consider using regular
+expressions and the C</[[:upper:]]/> construct instead.  Do B<not> use
+C</[A-Z]/>.
+
+=item isxdigit
+
+This is identical to the C function, except that it can apply to a single
+character or to a whole string.  Note that locale settings may affect what
+characters are considered C<isxdigit> (unlikely, but still possible).
+Does not work on Unicode characters code point 256 or higher.
+Consider using regular expressions and the C</[[:xdigit:]]/>
+construct instead, or simply C</[0-9a-f]/i>.
+
+=item kill
+
+This is identical to Perl's builtin C<kill()> function for sending
+signals to processes (often to terminate them), see L<perlfunc/kill>.
+
+=item labs
+
+(For returning absolute values of long integers.)
+labs() is C-specific, see L<perlfunc/abs> instead.
+
+=item ldexp
+
+This is identical to the C function C<ldexp()>
+for multiplying floating point numbers with powers of two.
+
+	$x_quadrupled = POSIX::ldexp($x, 2);
+
+=item ldiv
+
+(For computing dividends of long integers.)
+ldiv() is C-specific, use C</> and C<int()> instead.
+
+=item link
+
+This is identical to Perl's builtin C<link()> function
+for creating hard links into files, see L<perlfunc/link>.
+
+=item localeconv
+
+Get numeric formatting information.  Returns a reference to a hash
+containing the current locale formatting values.
+
+Here is how to query the database for the B<de> (Deutsch or German) locale.
+
+	$loc = POSIX::setlocale( &POSIX::LC_ALL, "de" );
+	print "Locale = $loc\n";
+	$lconv = POSIX::localeconv();
+	print "decimal_point	= ", $lconv->{decimal_point},	"\n";
+	print "thousands_sep	= ", $lconv->{thousands_sep},	"\n";
+	print "grouping	= ", $lconv->{grouping},	"\n";
+	print "int_curr_symbol	= ", $lconv->{int_curr_symbol},	"\n";
+	print "currency_symbol	= ", $lconv->{currency_symbol},	"\n";
+	print "mon_decimal_point = ", $lconv->{mon_decimal_point}, "\n";
+	print "mon_thousands_sep = ", $lconv->{mon_thousands_sep}, "\n";
+	print "mon_grouping	= ", $lconv->{mon_grouping},	"\n";
+	print "positive_sign	= ", $lconv->{positive_sign},	"\n";
+	print "negative_sign	= ", $lconv->{negative_sign},	"\n";
+	print "int_frac_digits	= ", $lconv->{int_frac_digits},	"\n";
+	print "frac_digits	= ", $lconv->{frac_digits},	"\n";
+	print "p_cs_precedes	= ", $lconv->{p_cs_precedes},	"\n";
+	print "p_sep_by_space	= ", $lconv->{p_sep_by_space},	"\n";
+	print "n_cs_precedes	= ", $lconv->{n_cs_precedes},	"\n";
+	print "n_sep_by_space	= ", $lconv->{n_sep_by_space},	"\n";
+	print "p_sign_posn	= ", $lconv->{p_sign_posn},	"\n";
+	print "n_sign_posn	= ", $lconv->{n_sign_posn},	"\n";
+
+=item localtime
+
+This is identical to Perl's builtin C<localtime()> function for
+converting seconds since the epoch to a date see L<perlfunc/localtime>.
+
+=item log
+
+This is identical to Perl's builtin C<log()> function,
+returning the natural (I<e>-based) logarithm of the numerical argument,
+see L<perlfunc/log>.
+
+=item log10
+
+This is identical to the C function C<log10()>,
+returning the 10-base logarithm of the numerical argument.
+You can also use
+
+    sub log10 { log($_[0]) / log(10) }
+
+or
+
+    sub log10 { log($_[0]) / 2.30258509299405 }  
+
+or
+
+    sub log10 { log($_[0]) * 0.434294481903252 }
+
+=item longjmp
+
+longjmp() is C-specific: use L<perlfunc/die> instead.
+
+=item lseek
+
+Move the file's read/write position.  This uses file descriptors such as
+those obtained by calling C<POSIX::open>.
+
+	$fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+	$off_t = POSIX::lseek( $fd, 0, &POSIX::SEEK_SET );
+
+Returns C<undef> on failure.
+
+=item malloc
+
+malloc() is C-specific.  Perl does memory management transparently.
+
+=item mblen
+
+This is identical to the C function C<mblen()>.
+Perl does not have any support for the wide and multibyte
+characters of the C standards, so this might be a rather 
+useless function.
+
+=item mbstowcs
+
+This is identical to the C function C<mbstowcs()>.
+Perl does not have any support for the wide and multibyte
+characters of the C standards, so this might be a rather 
+useless function.
+
+=item mbtowc
+
+This is identical to the C function C<mbtowc()>.
+Perl does not have any support for the wide and multibyte
+characters of the C standards, so this might be a rather 
+useless function.
+
+=item memchr
+
+memchr() is C-specific, see L<perlfunc/index> instead.
+
+=item memcmp
+
+memcmp() is C-specific, use C<eq> instead, see L<perlop>.
+
+=item memcpy
+
+memcpy() is C-specific, use C<=>, see L<perlop>, or see L<perlfunc/substr>.
+
+=item memmove
+
+memmove() is C-specific, use C<=>, see L<perlop>, or see L<perlfunc/substr>.
+
+=item memset
+
+memset() is C-specific, use C<x> instead, see L<perlop>.
+
+=item mkdir
+
+This is identical to Perl's builtin C<mkdir()> function
+for creating directories, see L<perlfunc/mkdir>.
+
+=item mkfifo
+
+This is similar to the C function C<mkfifo()> for creating
+FIFO special files.
+
+	if (mkfifo($path, $mode)) { ....
+
+Returns C<undef> on failure.  The C<$mode> is similar to the
+mode of C<mkdir()>, see L<perlfunc/mkdir>.
+
+=item mktime
+
+Convert date/time info to a calendar time.
+
+Synopsis:
+
+	mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
+
+The month (C<mon>), weekday (C<wday>), and yearday (C<yday>) begin at zero.
+I.e. January is 0, not 1; Sunday is 0, not 1; January 1st is 0, not 1.  The
+year (C<year>) is given in years since 1900.  I.e. The year 1995 is 95; the
+year 2001 is 101.  Consult your system's C<mktime()> manpage for details
+about these and the other arguments.
+
+Calendar time for December 12, 1995, at 10:30 am.
+
+	$time_t = POSIX::mktime( 0, 30, 10, 12, 11, 95 );
+	print "Date = ", POSIX::ctime($time_t);
+
+Returns C<undef> on failure.
+
+=item modf
+
+Return the integral and fractional parts of a floating-point number.
+
+	($fractional, $integral) = POSIX::modf( 3.14 );
+
+=item nice
+
+This is similar to the C function C<nice()>, for changing
+the scheduling preference of the current process.  Positive
+arguments mean more polite process, negative values more
+needy process.  Normal user processes can only be more polite.
+
+Returns C<undef> on failure.
+
+=item offsetof
+
+offsetof() is C-specific, you probably want to see L<perlfunc/pack> instead.
+
+=item open
+
+Open a file for reading for writing.  This returns file descriptors, not
+Perl filehandles.  Use C<POSIX::close> to close the file.
+
+Open a file read-only with mode 0666.
+
+	$fd = POSIX::open( "foo" );
+
+Open a file for read and write.
+
+	$fd = POSIX::open( "foo", &POSIX::O_RDWR );
+
+Open a file for write, with truncation.
+
+	$fd = POSIX::open( "foo", &POSIX::O_WRONLY | &POSIX::O_TRUNC );
+
+Create a new file with mode 0640.  Set up the file for writing.
+
+	$fd = POSIX::open( "foo", &POSIX::O_CREAT | &POSIX::O_WRONLY, 0640 );
+
+Returns C<undef> on failure.
+
+See also L<perlfunc/sysopen>.
+
+=item opendir
+
+Open a directory for reading.
+
+	$dir = POSIX::opendir( "/var" );
+	@files = POSIX::readdir( $dir );
+	POSIX::closedir( $dir );
+
+Returns C<undef> on failure.
+
+=item pathconf
+
+Retrieves the value of a configurable limit on a file or directory.
+
+The following will determine the maximum length of the longest allowable
+pathname on the filesystem which holds C</var>.
+
+	$path_max = POSIX::pathconf( "/var", &POSIX::_PC_PATH_MAX );
+
+Returns C<undef> on failure.
+
+=item pause
+
+This is similar to the C function C<pause()>, which suspends
+the execution of the current process until a signal is received.
+
+Returns C<undef> on failure.
+
+=item perror
+
+This is identical to the C function C<perror()>, which outputs to the
+standard error stream the specified message followed by ": " and the
+current error string.  Use the C<warn()> function and the C<$!>
+variable instead, see L<perlfunc/warn> and L<perlvar/$ERRNO>.
+
+=item pipe
+
+Create an interprocess channel.  This returns file descriptors like those
+returned by C<POSIX::open>.
+
+	my ($read, $write) = POSIX::pipe();
+	POSIX::write( $write, "hello", 5 );
+	POSIX::read( $read, $buf, 5 );
+
+See also L<perlfunc/pipe>.
+
+=item pow
+
+Computes C<$x> raised to the power C<$exponent>.
+
+	$ret = POSIX::pow( $x, $exponent );
+
+You can also use the C<**> operator, see L<perlop>.
+
+=item printf
+
+Formats and prints the specified arguments to STDOUT.
+See also L<perlfunc/printf>.
+
+=item putc
+
+putc() is C-specific, see L<perlfunc/print> instead.
+
+=item putchar
+
+putchar() is C-specific, see L<perlfunc/print> instead.
+
+=item puts
+
+puts() is C-specific, see L<perlfunc/print> instead.
+
+=item qsort
+
+qsort() is C-specific, see L<perlfunc/sort> instead.
+
+=item raise
+
+Sends the specified signal to the current process.
+See also L<perlfunc/kill> and the C<$$> in L<perlvar/$PID>.
+
+=item rand
+
+C<rand()> is non-portable, see L<perlfunc/rand> instead.
+
+=item read
+
+Read from a file.  This uses file descriptors such as those obtained by
+calling C<POSIX::open>.  If the buffer C<$buf> is not large enough for the
+read then Perl will extend it to make room for the request.
+
+	$fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+	$bytes = POSIX::read( $fd, $buf, 3 );
+
+Returns C<undef> on failure.
+
+See also L<perlfunc/sysread>.
+
+=item readdir
+
+This is identical to Perl's builtin C<readdir()> function
+for reading directory entries, see L<perlfunc/readdir>.
+
+=item realloc
+
+realloc() is C-specific.  Perl does memory management transparently.
+
+=item remove
+
+This is identical to Perl's builtin C<unlink()> function
+for removing files, see L<perlfunc/unlink>.
+
+=item rename
+
+This is identical to Perl's builtin C<rename()> function
+for renaming files, see L<perlfunc/rename>.
+
+=item rewind
+
+Seeks to the beginning of the file.
+
+=item rewinddir
+
+This is identical to Perl's builtin C<rewinddir()> function for
+rewinding directory entry streams, see L<perlfunc/rewinddir>.
+
+=item rmdir
+
+This is identical to Perl's builtin C<rmdir()> function
+for removing (empty) directories, see L<perlfunc/rmdir>.
+
+=item scanf
+
+scanf() is C-specific, use E<lt>E<gt> and regular expressions instead,
+see L<perlre>.
+
+=item setgid
+
+Sets the real group identifier and the effective group identifier for
+this process.  Similar to assigning a value to the Perl's builtin
+C<$)> variable, see L<perlvar/$GID>, except that the latter
+will change only the real user identifier, and that the setgid()
+uses only a single numeric argument, as opposed to a space-separated
+list of numbers.
+
+=item setjmp
+
+C<setjmp()> is C-specific: use C<eval {}> instead,
+see L<perlfunc/eval>.
+
+=item setlocale
+
+Modifies and queries program's locale.  The following examples assume
+
+	use POSIX qw(setlocale LC_ALL LC_CTYPE);
+
+has been issued.
+
+The following will set the traditional UNIX system locale behavior
+(the second argument C<"C">).
+
+	$loc = setlocale( LC_ALL, "C" );
+
+The following will query the current LC_CTYPE category.  (No second
+argument means 'query'.)
+
+	$loc = setlocale( LC_CTYPE );
+
+The following will set the LC_CTYPE behaviour according to the locale
+environment variables (the second argument C<"">).
+Please see your systems C<setlocale(3)> documentation for the locale
+environment variables' meaning or consult L<perllocale>.
+
+	$loc = setlocale( LC_CTYPE, "" );
+
+The following will set the LC_COLLATE behaviour to Argentinian
+Spanish. B<NOTE>: The naming and availability of locales depends on
+your operating system. Please consult L<perllocale> for how to find
+out which locales are available in your system.
+
+	$loc = setlocale( LC_ALL, "es_AR.ISO8859-1" );
+
+=item setpgid
+
+This is similar to the C function C<setpgid()> for
+setting the process group identifier of the current process.
+
+Returns C<undef> on failure.
+
+=item setsid
+
+This is identical to the C function C<setsid()> for
+setting the session identifier of the current process.
+
+=item setuid
+
+Sets the real user identifier and the effective user identifier for
+this process.  Similar to assigning a value to the Perl's builtin
+C<$E<lt>> variable, see L<perlvar/$UID>, except that the latter
+will change only the real user identifier.
+
+=item sigaction
+
+Detailed signal management.  This uses C<POSIX::SigAction> objects for the
+C<action> and C<oldaction> arguments.  Consult your system's C<sigaction>
+manpage for details.
+
+Synopsis:
+
+	sigaction(signal, action, oldaction = 0)
+
+Returns C<undef> on failure.  The C<signal> must be a number (like
+SIGHUP), not a string (like "SIGHUP"), though Perl does try hard
+to understand you.
+
+=item siglongjmp
+
+siglongjmp() is C-specific: use L<perlfunc/die> instead.
+
+=item sigpending
+
+Examine signals that are blocked and pending.  This uses C<POSIX::SigSet>
+objects for the C<sigset> argument.  Consult your system's C<sigpending>
+manpage for details.
+
+Synopsis:
+
+	sigpending(sigset)
+
+Returns C<undef> on failure.
+
+=item sigprocmask
+
+Change and/or examine calling process's signal mask.  This uses
+C<POSIX::SigSet> objects for the C<sigset> and C<oldsigset> arguments.
+Consult your system's C<sigprocmask> manpage for details.
+
+Synopsis:
+
+	sigprocmask(how, sigset, oldsigset = 0)
+
+Returns C<undef> on failure.
+
+=item sigsetjmp
+
+C<sigsetjmp()> is C-specific: use C<eval {}> instead,
+see L<perlfunc/eval>.
+
+=item sigsuspend
+
+Install a signal mask and suspend process until signal arrives.  This uses
+C<POSIX::SigSet> objects for the C<signal_mask> argument.  Consult your
+system's C<sigsuspend> manpage for details.
+
+Synopsis:
+
+	sigsuspend(signal_mask)
+
+Returns C<undef> on failure.
+
+=item sin
+
+This is identical to Perl's builtin C<sin()> function
+for returning the sine of the numerical argument,
+see L<perlfunc/sin>.  See also L<Math::Trig>.
+
+=item sinh
+
+This is identical to the C function C<sinh()>
+for returning the hyperbolic sine of the numerical argument.
+See also L<Math::Trig>.
+
+=item sleep
+
+This is functionally identical to Perl's builtin C<sleep()> function
+for suspending the execution of the current for process for certain
+number of seconds, see L<perlfunc/sleep>.  There is one significant 
+difference, however: C<POSIX::sleep()> returns the number of
+B<unslept> seconds, while the C<CORE::sleep()> returns the
+number of slept seconds.
+
+=item sprintf
+
+This is similar to Perl's builtin C<sprintf()> function
+for returning a string that has the arguments formatted as requested,
+see L<perlfunc/sprintf>.
+
+=item sqrt
+
+This is identical to Perl's builtin C<sqrt()> function.
+for returning the square root of the numerical argument,
+see L<perlfunc/sqrt>.
+
+=item srand
+
+Give a seed the pseudorandom number generator, see L<perlfunc/srand>.
+
+=item sscanf
+
+sscanf() is C-specific, use regular expressions instead,
+see L<perlre>.
+
+=item stat
+
+This is identical to Perl's builtin C<stat()> function
+for returning information about files and directories.
+
+=item strcat
+
+strcat() is C-specific, use C<.=> instead, see L<perlop>.
+
+=item strchr
+
+strchr() is C-specific, see L<perlfunc/index> instead.
+
+=item strcmp
+
+strcmp() is C-specific, use C<eq> or C<cmp> instead, see L<perlop>.
+
+=item strcoll
+
+This is identical to the C function C<strcoll()>
+for collating (comparing) strings transformed using
+the C<strxfrm()> function.  Not really needed since
+Perl can do this transparently, see L<perllocale>.
+
+=item strcpy
+
+strcpy() is C-specific, use C<=> instead, see L<perlop>.
+
+=item strcspn
+
+strcspn() is C-specific, use regular expressions instead,
+see L<perlre>.
+
+=item strerror
+
+Returns the error string for the specified errno.
+Identical to the string form of the C<$!>, see L<perlvar/$ERRNO>.
+
+=item strftime
+
+Convert date and time information to string.  Returns the string.
+
+Synopsis:
+
+	strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
+
+The month (C<mon>), weekday (C<wday>), and yearday (C<yday>) begin at zero.
+I.e. January is 0, not 1; Sunday is 0, not 1; January 1st is 0, not 1.  The
+year (C<year>) is given in years since 1900.  I.e., the year 1995 is 95; the
+year 2001 is 101.  Consult your system's C<strftime()> manpage for details
+about these and the other arguments.
+
+If you want your code to be portable, your format (C<fmt>) argument
+should use only the conversion specifiers defined by the ANSI C
+standard (C89, to play safe).  These are C<aAbBcdHIjmMpSUwWxXyYZ%>.
+But even then, the B<results> of some of the conversion specifiers are
+non-portable.  For example, the specifiers C<aAbBcpZ> change according
+to the locale settings of the user, and both how to set locales (the
+locale names) and what output to expect are non-standard.
+The specifier C<c> changes according to the timezone settings of the
+user and the timezone computation rules of the operating system.
+The C<Z> specifier is notoriously unportable since the names of
+timezones are non-standard. Sticking to the numeric specifiers is the
+safest route.
+
+The given arguments are made consistent as though by calling
+C<mktime()> before calling your system's C<strftime()> function,
+except that the C<isdst> value is not affected.
+
+The string for Tuesday, December 12, 1995.
+
+	$str = POSIX::strftime( "%A, %B %d, %Y", 0, 0, 0, 12, 11, 95, 2 );
+	print "$str\n";
+
+=item strlen
+
+strlen() is C-specific, use C<length()> instead, see L<perlfunc/length>.
+
+=item strncat
+
+strncat() is C-specific, use C<.=> instead, see L<perlop>.
+
+=item strncmp
+
+strncmp() is C-specific, use C<eq> instead, see L<perlop>.
+
+=item strncpy
+
+strncpy() is C-specific, use C<=> instead, see L<perlop>.
+
+=item strpbrk
+
+strpbrk() is C-specific, use regular expressions instead,
+see L<perlre>.
+
+=item strrchr
+
+strrchr() is C-specific, see L<perlfunc/rindex> instead.
+
+=item strspn
+
+strspn() is C-specific, use regular expressions instead,
+see L<perlre>.
+
+=item strstr
+
+This is identical to Perl's builtin C<index()> function,
+see L<perlfunc/index>.
+
+=item strtod
+
+String to double translation. Returns the parsed number and the number
+of characters in the unparsed portion of the string.  Truly
+POSIX-compliant systems set $! ($ERRNO) to indicate a translation
+error, so clear $! before calling strtod.  However, non-POSIX systems
+may not check for overflow, and therefore will never set $!.
+
+strtod should respect any POSIX I<setlocale()> settings.
+
+To parse a string $str as a floating point number use
+
+    $! = 0;
+    ($num, $n_unparsed) = POSIX::strtod($str);
+
+The second returned item and $! can be used to check for valid input:
+
+    if (($str eq '') || ($n_unparsed != 0) || $!) {
+        die "Non-numeric input $str" . ($! ? ": $!\n" : "\n");
+    }
+
+When called in a scalar context strtod returns the parsed number.
+
+=item strtok
+
+strtok() is C-specific, use regular expressions instead, see
+L<perlre>, or L<perlfunc/split>.
+
+=item strtol
+
+String to (long) integer translation.  Returns the parsed number and
+the number of characters in the unparsed portion of the string.  Truly
+POSIX-compliant systems set $! ($ERRNO) to indicate a translation
+error, so clear $! before calling strtol.  However, non-POSIX systems
+may not check for overflow, and therefore will never set $!.
+
+strtol should respect any POSIX I<setlocale()> settings.
+
+To parse a string $str as a number in some base $base use
+
+    $! = 0;
+    ($num, $n_unparsed) = POSIX::strtol($str, $base);
+
+The base should be zero or between 2 and 36, inclusive.  When the base
+is zero or omitted strtol will use the string itself to determine the
+base: a leading "0x" or "0X" means hexadecimal; a leading "0" means
+octal; any other leading characters mean decimal.  Thus, "1234" is
+parsed as a decimal number, "01234" as an octal number, and "0x1234"
+as a hexadecimal number.
+
+The second returned item and $! can be used to check for valid input:
+
+    if (($str eq '') || ($n_unparsed != 0) || !$!) {
+        die "Non-numeric input $str" . $! ? ": $!\n" : "\n";
+    }
+
+When called in a scalar context strtol returns the parsed number.
+
+=item strtoul
+
+String to unsigned (long) integer translation.  strtoul() is identical
+to strtol() except that strtoul() only parses unsigned integers.  See
+L</strtol> for details.
+
+Note: Some vendors supply strtod() and strtol() but not strtoul().
+Other vendors that do supply strtoul() parse "-1" as a valid value.
+
+=item strxfrm
+
+String transformation.  Returns the transformed string.
+
+	$dst = POSIX::strxfrm( $src );
+
+Used in conjunction with the C<strcoll()> function, see L</strcoll>.
+
+Not really needed since Perl can do this transparently, see
+L<perllocale>.
+
+=item sysconf
+
+Retrieves values of system configurable variables.
+
+The following will get the machine's clock speed.
+
+	$clock_ticks = POSIX::sysconf( &POSIX::_SC_CLK_TCK );
+
+Returns C<undef> on failure.
+
+=item system
+
+This is identical to Perl's builtin C<system()> function, see
+L<perlfunc/system>.
+
+=item tan
+
+This is identical to the C function C<tan()>, returning the
+tangent of the numerical argument.  See also L<Math::Trig>.
+
+=item tanh
+
+This is identical to the C function C<tanh()>, returning the
+hyperbolic tangent of the numerical argument.   See also L<Math::Trig>.
+
+=item tcdrain
+
+This is similar to the C function C<tcdrain()> for draining
+the output queue of its argument stream.
+
+Returns C<undef> on failure.
+
+=item tcflow
+
+This is similar to the C function C<tcflow()> for controlling
+the flow of its argument stream.
+
+Returns C<undef> on failure.
+
+=item tcflush
+
+This is similar to the C function C<tcflush()> for flushing
+the I/O buffers of its argument stream.
+
+Returns C<undef> on failure.
+
+=item tcgetpgrp
+
+This is identical to the C function C<tcgetpgrp()> for returning the
+process group identifier of the foreground process group of the controlling
+terminal.
+
+=item tcsendbreak
+
+This is similar to the C function C<tcsendbreak()> for sending
+a break on its argument stream.
+
+Returns C<undef> on failure.
+
+=item tcsetpgrp
+
+This is similar to the C function C<tcsetpgrp()> for setting the
+process group identifier of the foreground process group of the controlling
+terminal.
+
+Returns C<undef> on failure.
+
+=item time
+
+This is identical to Perl's builtin C<time()> function
+for returning the number of seconds since the epoch
+(whatever it is for the system), see L<perlfunc/time>.
+
+=item times
+
+The times() function returns elapsed realtime since some point in the past
+(such as system startup), user and system times for this process, and user
+and system times used by child processes.  All times are returned in clock
+ticks.
+
+    ($realtime, $user, $system, $cuser, $csystem) = POSIX::times();
+
+Note: Perl's builtin C<times()> function returns four values, measured in
+seconds.
+
+=item tmpfile
+
+Use method C<IO::File::new_tmpfile()> instead, or see L<File::Temp>.
+
+=item tmpnam
+
+Returns a name for a temporary file.
+
+	$tmpfile = POSIX::tmpnam();
+
+For security reasons, which are probably detailed in your system's
+documentation for the C library tmpnam() function, this interface
+should not be used; instead see L<File::Temp>.
+
+=item tolower
+
+This is identical to the C function, except that it can apply to a single
+character or to a whole string.  Consider using the C<lc()> function,
+see L<perlfunc/lc>, or the equivalent C<\L> operator inside doublequotish
+strings.
+
+=item toupper
+
+This is identical to the C function, except that it can apply to a single
+character or to a whole string.  Consider using the C<uc()> function,
+see L<perlfunc/uc>, or the equivalent C<\U> operator inside doublequotish
+strings.
+
+=item ttyname
+
+This is identical to the C function C<ttyname()> for returning the
+name of the current terminal.
+
+=item tzname
+
+Retrieves the time conversion information from the C<tzname> variable.
+
+	POSIX::tzset();
+	($std, $dst) = POSIX::tzname();
+
+=item tzset
+
+This is identical to the C function C<tzset()> for setting
+the current timezone based on the environment variable C<TZ>,
+to be used by C<ctime()>, C<localtime()>, C<mktime()>, and C<strftime()>
+functions.
+
+=item umask
+
+This is identical to Perl's builtin C<umask()> function
+for setting (and querying) the file creation permission mask,
+see L<perlfunc/umask>.
+
+=item uname
+
+Get name of current operating system.
+
+	($sysname, $nodename, $release, $version, $machine) = POSIX::uname();
+
+Note that the actual meanings of the various fields are not
+that well standardized, do not expect any great portability.
+The C<$sysname> might be the name of the operating system,
+the C<$nodename> might be the name of the host, the C<$release>
+might be the (major) release number of the operating system,
+the C<$version> might be the (minor) release number of the
+operating system, and the C<$machine> might be a hardware identifier.
+Maybe.
+
+=item ungetc
+
+Use method C<IO::Handle::ungetc()> instead.
+
+=item unlink
+
+This is identical to Perl's builtin C<unlink()> function
+for removing files, see L<perlfunc/unlink>.
+
+=item utime
+
+This is identical to Perl's builtin C<utime()> function
+for changing the time stamps of files and directories,
+see L<perlfunc/utime>.
+
+=item vfprintf
+
+vfprintf() is C-specific, see L<perlfunc/printf> instead.
+
+=item vprintf
+
+vprintf() is C-specific, see L<perlfunc/printf> instead.
+
+=item vsprintf
+
+vsprintf() is C-specific, see L<perlfunc/sprintf> instead.
+
+=item wait
+
+This is identical to Perl's builtin C<wait()> function,
+see L<perlfunc/wait>.
+
+=item waitpid
+
+Wait for a child process to change state.  This is identical to Perl's
+builtin C<waitpid()> function, see L<perlfunc/waitpid>.
+
+	$pid = POSIX::waitpid( -1, POSIX::WNOHANG );
+	print "status = ", ($? / 256), "\n";
+
+=item wcstombs
+
+This is identical to the C function C<wcstombs()>.
+Perl does not have any support for the wide and multibyte
+characters of the C standards, so this might be a rather 
+useless function.
+
+=item wctomb
+
+This is identical to the C function C<wctomb()>.
+Perl does not have any support for the wide and multibyte
+characters of the C standards, so this might be a rather 
+useless function.
+
+=item write
+
+Write to a file.  This uses file descriptors such as those obtained by
+calling C<POSIX::open>.
+
+	$fd = POSIX::open( "foo", &POSIX::O_WRONLY );
+	$buf = "hello";
+	$bytes = POSIX::write( $b, $buf, 5 );
+
+Returns C<undef> on failure.
+
+See also L<perlfunc/syswrite>.
+
+=back
+
+=head1 CLASSES
+
+=head2 POSIX::SigAction
+
+=over 8
+
+=item new
+
+Creates a new C<POSIX::SigAction> object which corresponds to the C
+C<struct sigaction>.  This object will be destroyed automatically when it is
+no longer needed.  The first parameter is the fully-qualified name of a sub
+which is a signal-handler.  The second parameter is a C<POSIX::SigSet>
+object, it defaults to the empty set.  The third parameter contains the
+C<sa_flags>, it defaults to 0.
+
+	$sigset = POSIX::SigSet->new(SIGINT, SIGQUIT);
+	$sigaction = POSIX::SigAction->new( \&main::handler, $sigset, &POSIX::SA_NOCLDSTOP );
+
+This C<POSIX::SigAction> object is intended for use with the C<POSIX::sigaction()>
+function.
+
+=back
+
+=over 8
+
+=item handler
+
+=item mask
+
+=item flags
+
+accessor functions to get/set the values of a SigAction object.
+
+	$sigset = $sigaction->mask;
+	$sigaction->flags(&POSIX::SA_RESTART);
+
+=item safe
+
+accessor function for the "safe signals" flag of a SigAction object; see
+L<perlipc> for general information on safe (a.k.a. "deferred") signals.  If
+you wish to handle a signal safely, use this accessor to set the "safe" flag
+in the C<POSIX::SigAction> object:
+
+	$sigaction->safe(1);
+
+You may also examine the "safe" flag on the output action object which is
+filled in when given as the third parameter to C<POSIX::sigaction()>:
+
+	sigaction(SIGINT, $new_action, $old_action);
+	if ($old_action->safe) {
+	    # previous SIGINT handler used safe signals
+	}
+
+=back
+
+=head2 POSIX::SigSet
+
+=over 8
+
+=item new
+
+Create a new SigSet object.  This object will be destroyed automatically
+when it is no longer needed.  Arguments may be supplied to initialize the
+set.
+
+Create an empty set.
+
+	$sigset = POSIX::SigSet->new;
+
+Create a set with SIGUSR1.
+
+	$sigset = POSIX::SigSet->new( &POSIX::SIGUSR1 );
+
+=item addset
+
+Add a signal to a SigSet object.
+
+	$sigset->addset( &POSIX::SIGUSR2 );
+
+Returns C<undef> on failure.
+
+=item delset
+
+Remove a signal from the SigSet object.
+
+	$sigset->delset( &POSIX::SIGUSR2 );
+
+Returns C<undef> on failure.
+
+=item emptyset
+
+Initialize the SigSet object to be empty.
+
+	$sigset->emptyset();
+
+Returns C<undef> on failure.
+
+=item fillset
+
+Initialize the SigSet object to include all signals.
+
+	$sigset->fillset();
+
+Returns C<undef> on failure.
+
+=item ismember
+
+Tests the SigSet object to see if it contains a specific signal.
+
+	if( $sigset->ismember( &POSIX::SIGUSR1 ) ){
+		print "contains SIGUSR1\n";
+	}
+
+=back
+
+=head2 POSIX::Termios
+
+=over 8
+
+=item new
+
+Create a new Termios object.  This object will be destroyed automatically
+when it is no longer needed.  A Termios object corresponds to the termios
+C struct.  new() mallocs a new one, getattr() fills it from a file descriptor,
+and setattr() sets a file descriptor's parameters to match Termios' contents.
+
+	$termios = POSIX::Termios->new;
+
+=item getattr
+
+Get terminal control attributes.
+
+Obtain the attributes for stdin.
+
+	$termios->getattr()
+
+Obtain the attributes for stdout.
+
+	$termios->getattr( 1 )
+
+Returns C<undef> on failure.
+
+=item getcc
+
+Retrieve a value from the c_cc field of a termios object.  The c_cc field is
+an array so an index must be specified.
+
+	$c_cc[1] = $termios->getcc(1);
+
+=item getcflag
+
+Retrieve the c_cflag field of a termios object.
+
+	$c_cflag = $termios->getcflag;
+
+=item getiflag
+
+Retrieve the c_iflag field of a termios object.
+
+	$c_iflag = $termios->getiflag;
+
+=item getispeed
+
+Retrieve the input baud rate.
+
+	$ispeed = $termios->getispeed;
+
+=item getlflag
+
+Retrieve the c_lflag field of a termios object.
+
+	$c_lflag = $termios->getlflag;
+
+=item getoflag
+
+Retrieve the c_oflag field of a termios object.
+
+	$c_oflag = $termios->getoflag;
+
+=item getospeed
+
+Retrieve the output baud rate.
+
+	$ospeed = $termios->getospeed;
+
+=item setattr
+
+Set terminal control attributes.
+
+Set attributes immediately for stdout.
+
+	$termios->setattr( 1, &POSIX::TCSANOW );
+
+Returns C<undef> on failure.
+
+=item setcc
+
+Set a value in the c_cc field of a termios object.  The c_cc field is an
+array so an index must be specified.
+
+	$termios->setcc( &POSIX::VEOF, 1 );
+
+=item setcflag
+
+Set the c_cflag field of a termios object.
+
+	$termios->setcflag( $c_cflag | &POSIX::CLOCAL );
+
+=item setiflag
+
+Set the c_iflag field of a termios object.
+
+	$termios->setiflag( $c_iflag | &POSIX::BRKINT );
+
+=item setispeed
+
+Set the input baud rate.
+
+	$termios->setispeed( &POSIX::B9600 );
+
+Returns C<undef> on failure.
+
+=item setlflag
+
+Set the c_lflag field of a termios object.
+
+	$termios->setlflag( $c_lflag | &POSIX::ECHO );
+
+=item setoflag
+
+Set the c_oflag field of a termios object.
+
+	$termios->setoflag( $c_oflag | &POSIX::OPOST );
+
+=item setospeed
+
+Set the output baud rate.
+
+	$termios->setospeed( &POSIX::B9600 );
+
+Returns C<undef> on failure.
+
+=item Baud rate values
+
+B38400 B75 B200 B134 B300 B1800 B150 B0 B19200 B1200 B9600 B600 B4800 B50 B2400 B110
+
+=item Terminal interface values
+
+TCSADRAIN TCSANOW TCOON TCIOFLUSH TCOFLUSH TCION TCIFLUSH TCSAFLUSH TCIOFF TCOOFF
+
+=item c_cc field values
+
+VEOF VEOL VERASE VINTR VKILL VQUIT VSUSP VSTART VSTOP VMIN VTIME NCCS
+
+=item c_cflag field values
+
+CLOCAL CREAD CSIZE CS5 CS6 CS7 CS8 CSTOPB HUPCL PARENB PARODD
+
+=item c_iflag field values
+
+BRKINT ICRNL IGNBRK IGNCR IGNPAR INLCR INPCK ISTRIP IXOFF IXON PARMRK
+
+=item c_lflag field values
+
+ECHO ECHOE ECHOK ECHONL ICANON IEXTEN ISIG NOFLSH TOSTOP
+
+=item c_oflag field values
+
+OPOST
+
+=back
+
+=head1 PATHNAME CONSTANTS
+
+=over 8
+
+=item Constants
+
+_PC_CHOWN_RESTRICTED _PC_LINK_MAX _PC_MAX_CANON _PC_MAX_INPUT _PC_NAME_MAX _PC_NO_TRUNC _PC_PATH_MAX _PC_PIPE_BUF _PC_VDISABLE
+
+=back
+
+=head1 POSIX CONSTANTS
+
+=over 8
+
+=item Constants
+
+_POSIX_ARG_MAX _POSIX_CHILD_MAX _POSIX_CHOWN_RESTRICTED _POSIX_JOB_CONTROL _POSIX_LINK_MAX _POSIX_MAX_CANON _POSIX_MAX_INPUT _POSIX_NAME_MAX _POSIX_NGROUPS_MAX _POSIX_NO_TRUNC _POSIX_OPEN_MAX _POSIX_PATH_MAX _POSIX_PIPE_BUF _POSIX_SAVED_IDS _POSIX_SSIZE_MAX _POSIX_STREAM_MAX _POSIX_TZNAME_MAX _POSIX_VDISABLE _POSIX_VERSION
+
+=back
+
+=head1 SYSTEM CONFIGURATION
+
+=over 8
+
+=item Constants
+
+_SC_ARG_MAX _SC_CHILD_MAX _SC_CLK_TCK _SC_JOB_CONTROL _SC_NGROUPS_MAX _SC_OPEN_MAX _SC_PAGESIZE _SC_SAVED_IDS _SC_STREAM_MAX _SC_TZNAME_MAX _SC_VERSION
+
+=back
+
+=head1 ERRNO
+
+=over 8
+
+=item Constants
+
+E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY EBADF
+EBUSY ECHILD ECONNABORTED ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ
+EDOM EDQUOT EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS EINTR
+EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK EMSGSIZE ENAMETOOLONG
+ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS ENODEV ENOENT ENOEXEC
+ENOLCK ENOMEM ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
+ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM EPFNOSUPPORT EPIPE
+EPROCLIM EPROTONOSUPPORT EPROTOTYPE ERANGE EREMOTE ERESTART EROFS
+ESHUTDOWN ESOCKTNOSUPPORT ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS
+ETXTBSY EUSERS EWOULDBLOCK EXDEV
+
+=back
+
+=head1 FCNTL
+
+=over 8
+
+=item Constants
+
+FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_OK F_RDLCK F_SETFD F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK O_ACCMODE O_APPEND O_CREAT O_EXCL O_NOCTTY O_NONBLOCK O_RDONLY O_RDWR O_TRUNC O_WRONLY
+
+=back
+
+=head1 FLOAT
+
+=over 8
+
+=item Constants
+
+DBL_DIG DBL_EPSILON DBL_MANT_DIG DBL_MAX DBL_MAX_10_EXP DBL_MAX_EXP DBL_MIN DBL_MIN_10_EXP DBL_MIN_EXP FLT_DIG FLT_EPSILON FLT_MANT_DIG FLT_MAX FLT_MAX_10_EXP FLT_MAX_EXP FLT_MIN FLT_MIN_10_EXP FLT_MIN_EXP FLT_RADIX FLT_ROUNDS LDBL_DIG LDBL_EPSILON LDBL_MANT_DIG LDBL_MAX LDBL_MAX_10_EXP LDBL_MAX_EXP LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP
+
+=back
+
+=head1 LIMITS
+
+=over 8
+
+=item Constants
+
+ARG_MAX CHAR_BIT CHAR_MAX CHAR_MIN CHILD_MAX INT_MAX INT_MIN LINK_MAX LONG_MAX LONG_MIN MAX_CANON MAX_INPUT MB_LEN_MAX NAME_MAX NGROUPS_MAX OPEN_MAX PATH_MAX PIPE_BUF SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN SSIZE_MAX STREAM_MAX TZNAME_MAX UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX
+
+=back
+
+=head1 LOCALE
+
+=over 8
+
+=item Constants
+
+LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME
+
+=back
+
+=head1 MATH
+
+=over 8
+
+=item Constants
+
+HUGE_VAL
+
+=back
+
+=head1 SIGNAL
+
+=over 8
+
+=item Constants
+
+SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK SA_RESETHAND SA_RESTART
+SA_SIGINFO SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT
+SIGKILL SIGPIPE SIGQUIT SIGSEGV SIGSTOP SIGTERM SIGTSTP SIGTTIN SIGTTOU
+SIGUSR1 SIGUSR2 SIG_BLOCK SIG_DFL SIG_ERR SIG_IGN SIG_SETMASK
+SIG_UNBLOCK
+
+=back
+
+=head1 STAT
+
+=over 8
+
+=item Constants
+
+S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU S_ISGID S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR
+
+=item Macros
+
+S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISREG
+
+=back
+
+=head1 STDLIB
+
+=over 8
+
+=item Constants
+
+EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX RAND_MAX
+
+=back
+
+=head1 STDIO
+
+=over 8
+
+=item Constants
+
+BUFSIZ EOF FILENAME_MAX L_ctermid L_cuserid L_tmpname TMP_MAX
+
+=back
+
+=head1 TIME
+
+=over 8
+
+=item Constants
+
+CLK_TCK CLOCKS_PER_SEC
+
+=back
+
+=head1 UNISTD
+
+=over 8
+
+=item Constants
+
+R_OK SEEK_CUR SEEK_END SEEK_SET STDIN_FILENO STDOUT_FILENO STDERR_FILENO W_OK X_OK
+
+=back
+
+=head1 WAIT
+
+=over 8
+
+=item Constants
+
+WNOHANG WUNTRACED
+
+=over 16
+
+=item WNOHANG
+
+Do not suspend the calling process until a child process
+changes state but instead return immediately.
+
+=item WUNTRACED
+
+Catch stopped child processes.
+
+=back
+
+=item Macros
+
+WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG WIFSTOPPED WSTOPSIG
+
+=over 16
+
+=item WIFEXITED
+
+WIFEXITED($?) returns true if the child process exited normally
+(C<exit()> or by falling off the end of C<main()>)
+
+=item WEXITSTATUS
+
+WEXITSTATUS($?) returns the normal exit status of the child process
+(only meaningful if WIFEXITED($?) is true)
+
+=item WIFSIGNALED
+
+WIFSIGNALED($?) returns true if the child process terminated because
+of a signal
+
+=item WTERMSIG
+
+WTERMSIG($?) returns the signal the child process terminated for
+(only meaningful if WIFSIGNALED($?) is true)
+
+=item WIFSTOPPED
+
+WIFSTOPPED($?) returns true if the child process is currently stopped
+(can happen only if you specified the WUNTRACED flag to waitpid())
+
+=item WSTOPSIG
+
+WSTOPSIG($?) returns the signal the child process was stopped for
+(only meaningful if WIFSTOPPED($?) is true)
+
+=back
+
+=back
+
Index: /for-distributions/trunk/bin/windows/perl/lib/PerlIO.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/PerlIO.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/PerlIO.pm	(revision 14489)
@@ -0,0 +1,340 @@
+package PerlIO;
+
+our $VERSION = '1.04';
+
+# Map layer name to package that defines it
+our %alias;
+
+sub import
+{
+ my $class = shift;
+ while (@_)
+  {
+   my $layer = shift;
+   if (exists $alias{$layer})
+    {
+     $layer = $alias{$layer}
+    }
+   else
+    {
+     $layer = "${class}::$layer";
+    }
+   eval "require $layer";
+   warn $@ if $@;
+  }
+}
+
+sub F_UTF8 () { 0x8000 }
+
+1;
+__END__
+
+=head1 NAME
+
+PerlIO - On demand loader for PerlIO layers and root of PerlIO::* name space
+
+=head1 SYNOPSIS
+
+  open($fh,"<:crlf", "my.txt"); # support platform-native and CRLF text files
+
+  open($fh,"<","his.jpg");      # portably open a binary file for reading
+  binmode($fh);
+
+  Shell:
+    PERLIO=perlio perl ....
+
+=head1 DESCRIPTION
+
+When an undefined layer 'foo' is encountered in an C<open> or
+C<binmode> layer specification then C code performs the equivalent of:
+
+  use PerlIO 'foo';
+
+The perl code in PerlIO.pm then attempts to locate a layer by doing
+
+  require PerlIO::foo;
+
+Otherwise the C<PerlIO> package is a place holder for additional
+PerlIO related functions.
+
+The following layers are currently defined:
+
+=over 4
+
+=item :unix
+
+Lowest level layer which provides basic PerlIO operations in terms of
+UNIX/POSIX numeric file descriptor calls
+(open(), read(), write(), lseek(), close()).
+
+=item :stdio
+
+Layer which calls C<fread>, C<fwrite> and C<fseek>/C<ftell> etc.  Note
+that as this is "real" stdio it will ignore any layers beneath it and
+got straight to the operating system via the C library as usual.
+
+=item :perlio
+
+A from scratch implementation of buffering for PerlIO. Provides fast
+access to the buffer for C<sv_gets> which implements perl's readline/E<lt>E<gt>
+and in general attempts to minimize data copying.
+
+C<:perlio> will insert a C<:unix> layer below itself to do low level IO.
+
+=item :crlf
+
+A layer that implements DOS/Windows like CRLF line endings.  On read
+converts pairs of CR,LF to a single "\n" newline character.  On write
+converts each "\n" to a CR,LF pair.  Note that this layer likes to be
+one of its kind: it silently ignores attempts to be pushed into the
+layer stack more than once.
+
+It currently does I<not> mimic MS-DOS as far as treating of Control-Z
+as being an end-of-file marker.
+
+(Gory details follow) To be more exact what happens is this: after
+pushing itself to the stack, the C<:crlf> layer checks all the layers
+below itself to find the first layer that is capable of being a CRLF
+layer but is not yet enabled to be a CRLF layer.  If it finds such a
+layer, it enables the CRLFness of that other deeper layer, and then
+pops itself off the stack.  If not, fine, use the one we just pushed.
+
+The end result is that a C<:crlf> means "please enable the first CRLF
+layer you can find, and if you can't find one, here would be a good
+spot to place a new one."
+
+Based on the C<:perlio> layer.
+
+=item :mmap
+
+A layer which implements "reading" of files by using C<mmap()> to
+make (whole) file appear in the process's address space, and then
+using that as PerlIO's "buffer". This I<may> be faster in certain
+circumstances for large files, and may result in less physical memory
+use when multiple processes are reading the same file.
+
+Files which are not C<mmap()>-able revert to behaving like the C<:perlio>
+layer. Writes also behave like C<:perlio> layer as C<mmap()> for write
+needs extra house-keeping (to extend the file) which negates any advantage.
+
+The C<:mmap> layer will not exist if platform does not support C<mmap()>.
+
+=item :utf8
+
+Declares that the stream accepts perl's internal encoding of
+characters.  (Which really is UTF-8 on ASCII machines, but is
+UTF-EBCDIC on EBCDIC machines.)  This allows any character perl can
+represent to be read from or written to the stream. The UTF-X encoding
+is chosen to render simple text parts (i.e.  non-accented letters,
+digits and common punctuation) human readable in the encoded file.
+
+Here is how to write your native data out using UTF-8 (or UTF-EBCDIC)
+and then read it back in.
+
+	open(F, ">:utf8", "data.utf");
+	print F $out;
+	close(F);
+
+	open(F, "<:utf8", "data.utf");
+	$in = <F>;
+	close(F);
+
+=item :bytes
+
+This is the inverse of C<:utf8> layer. It turns off the flag
+on the layer below so that data read from it is considered to
+be "octets" i.e. characters in range 0..255 only. Likewise
+on output perl will warn if a "wide" character is written
+to a such a stream.
+
+=item :raw
+
+The C<:raw> layer is I<defined> as being identical to calling
+C<binmode($fh)> - the stream is made suitable for passing binary data
+i.e. each byte is passed as-is. The stream will still be
+buffered.
+
+In Perl 5.6 and some books the C<:raw> layer (previously sometimes also
+referred to as a "discipline") is documented as the inverse of the
+C<:crlf> layer. That is no longer the case - other layers which would
+alter binary nature of the stream are also disabled.  If you want UNIX
+line endings on a platform that normally does CRLF translation, but still
+want UTF-8 or encoding defaults the appropriate thing to do is to add
+C<:perlio> to PERLIO environment variable.
+
+The implementation of C<:raw> is as a pseudo-layer which when "pushed"
+pops itself and then any layers which do not declare themselves as suitable
+for binary data. (Undoing :utf8 and :crlf are implemented by clearing
+flags rather than popping layers but that is an implementation detail.)
+
+As a consequence of the fact that C<:raw> normally pops layers
+it usually only makes sense to have it as the only or first element in
+a layer specification.  When used as the first element it provides
+a known base on which to build e.g.
+
+    open($fh,":raw:utf8",...)
+
+will construct a "binary" stream, but then enable UTF-8 translation.
+
+=item :pop
+
+A pseudo layer that removes the top-most layer. Gives perl code
+a way to manipulate the layer stack. Should be considered
+as experimental. Note that C<:pop> only works on real layers
+and will not undo the effects of pseudo layers like C<:utf8>.
+An example of a possible use might be:
+
+    open($fh,...)
+    ...
+    binmode($fh,":encoding(...)");  # next chunk is encoded
+    ...
+    binmode($fh,":pop");            # back to un-encoded
+
+A more elegant (and safer) interface is needed.
+
+=item :win32
+
+On Win32 platforms this I<experimental> layer uses native "handle" IO
+rather than unix-like numeric file descriptor layer. Known to be
+buggy as of perl 5.8.2.
+
+=back
+
+=head2 Custom Layers
+
+It is possible to write custom layers in addition to the above builtin
+ones, both in C/XS and Perl.  Two such layers (and one example written
+in Perl using the latter) come with the Perl distribution.
+
+=over 4
+
+=item :encoding
+
+Use C<:encoding(ENCODING)> either in open() or binmode() to install
+a layer that does transparently character set and encoding transformations,
+for example from Shift-JIS to Unicode.  Note that under C<stdio>
+an C<:encoding> also enables C<:utf8>.  See L<PerlIO::encoding>
+for more information.
+
+=item :via
+
+Use C<:via(MODULE)> either in open() or binmode() to install a layer
+that does whatever transformation (for example compression /
+decompression, encryption / decryption) to the filehandle.
+See L<PerlIO::via> for more information.
+
+=back
+
+=head2 Alternatives to raw
+
+To get a binary stream an alternate method is to use:
+
+    open($fh,"whatever")
+    binmode($fh);
+
+this has advantage of being backward compatible with how such things have
+had to be coded on some platforms for years.
+
+To get an un-buffered stream specify an unbuffered layer (e.g. C<:unix>)
+in the open call:
+
+    open($fh,"<:unix",$path)
+
+=head2 Defaults and how to override them
+
+If the platform is MS-DOS like and normally does CRLF to "\n"
+translation for text files then the default layers are :
+
+  unix crlf
+
+(The low level "unix" layer may be replaced by a platform specific low
+level layer.)
+
+Otherwise if C<Configure> found out how to do "fast" IO using system's
+stdio, then the default layers are:
+
+  unix stdio
+
+Otherwise the default layers are
+
+  unix perlio
+
+These defaults may change once perlio has been better tested and tuned.
+
+The default can be overridden by setting the environment variable
+PERLIO to a space separated list of layers (C<unix> or platform low
+level layer is always pushed first).
+
+This can be used to see the effect of/bugs in the various layers e.g.
+
+  cd .../perl/t
+  PERLIO=stdio  ./perl harness
+  PERLIO=perlio ./perl harness
+
+For the various value of PERLIO see L<perlrun/PERLIO>.
+
+=head2 Querying the layers of filehandles
+
+The following returns the B<names> of the PerlIO layers on a filehandle.
+
+   my @layers = PerlIO::get_layers($fh); # Or FH, *FH, "FH".
+
+The layers are returned in the order an open() or binmode() call would
+use them.  Note that the "default stack" depends on the operating
+system and on the Perl version, and both the compile-time and
+runtime configurations of Perl.
+
+The following table summarizes the default layers on UNIX-like and
+DOS-like platforms and depending on the setting of the C<$ENV{PERLIO}>:
+
+ PERLIO     UNIX-like                   DOS-like
+ ------     ---------                   --------
+ unset / "" unix perlio / stdio [1]     unix crlf
+ stdio      unix perlio / stdio [1]     stdio
+ perlio     unix perlio                 unix perlio
+ mmap       unix mmap                   unix mmap
+
+ # [1] "stdio" if Configure found out how to do "fast stdio" (depends
+ # on the stdio implementation) and in Perl 5.8, otherwise "unix perlio"
+
+By default the layers from the input side of the filehandle is
+returned, to get the output side use the optional C<output> argument:
+
+   my @layers = PerlIO::get_layers($fh, output => 1);
+
+(Usually the layers are identical on either side of a filehandle but
+for example with sockets there may be differences, or if you have
+been using the C<open> pragma.)
+
+There is no set_layers(), nor does get_layers() return a tied array
+mirroring the stack, or anything fancy like that.  This is not
+accidental or unintentional.  The PerlIO layer stack is a bit more
+complicated than just a stack (see for example the behaviour of C<:raw>).
+You are supposed to use open() and binmode() to manipulate the stack.
+
+B<Implementation details follow, please close your eyes.>
+
+The arguments to layers are by default returned in parenthesis after
+the name of the layer, and certain layers (like C<utf8>) are not real
+layers but instead flags on real layers: to get all of these returned
+separately use the optional C<details> argument:
+
+   my @layer_and_args_and_flags = PerlIO::get_layers($fh, details => 1);
+
+The result will be up to be three times the number of layers:
+the first element will be a name, the second element the arguments
+(unspecified arguments will be C<undef>), the third element the flags,
+the fourth element a name again, and so forth.
+
+B<You may open your eyes now.>
+
+=head1 AUTHOR
+
+Nick Ing-Simmons E<lt>nick@ing-simmons.netE<gt>
+
+=head1 SEE ALSO
+
+L<perlfunc/"binmode">, L<perlfunc/"open">, L<perlunicode>, L<perliol>,
+L<Encode>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/PerlIO/encoding.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/PerlIO/encoding.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/PerlIO/encoding.pm	(revision 14489)
@@ -0,0 +1,51 @@
+package PerlIO::encoding;
+
+use strict;
+our $VERSION = '0.09';
+our $DEBUG = 0;
+$DEBUG and warn __PACKAGE__, " called by ", join(", ", caller), "\n";
+
+#
+# Equivalent of this is done in encoding.xs - do not uncomment.
+#
+# use Encode ();
+
+use XSLoader ();
+XSLoader::load(__PACKAGE__, $VERSION);
+
+our $fallback =
+    Encode::PERLQQ()|Encode::WARN_ON_ERR()|Encode::STOP_AT_PARTIAL();
+
+1;
+__END__
+
+=head1 NAME
+
+PerlIO::encoding - encoding layer
+
+=head1 SYNOPSIS
+
+  open($f, "<:encoding(foo)", "infoo");
+  open($f, ">:encoding(bar)", "outbar");
+
+  use Encode qw(:fallbacks);
+  $PerlIO::encoding::fallback = FB_PERLQQ;
+
+=head1 DESCRIPTION
+
+Open a filehandle with a transparent encoding filter.
+
+On input, convert the bytes expected to be in the specified
+character set and encoding to Perl string data (Unicode and
+Perl's internal Unicode encoding, UTF-8).  On output, convert
+Perl string data into the specified character set and encoding.
+
+When the layer is pushed the current value of C<$PerlIO::encoding::fallback>
+is saved and used as the CHECK argument when calling the Encode methods encode()
+and decode().
+
+=head1 SEE ALSO
+
+L<open>, L<Encode>, L<perlfunc/binmode>, L<perluniintro>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/PerlIO/scalar.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/PerlIO/scalar.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/PerlIO/scalar.pm	(revision 14489)
@@ -0,0 +1,41 @@
+package PerlIO::scalar;
+our $VERSION = '0.04';
+use XSLoader ();
+XSLoader::load 'PerlIO::scalar';
+1;
+__END__
+
+=head1 NAME
+
+PerlIO::scalar - in-memory IO, scalar IO
+
+=head1 SYNOPSIS
+
+   my $scalar = '';
+   ...
+   open my $fh, "<",  \$scalar or die;
+   open my $fh, ">",  \$scalar or die;
+   open my $fh, ">>", \$scalar or die;
+
+or
+
+   my $scalar = '';
+   ...
+   open my $fh, "<:scalar",  \$scalar or die;
+   open my $fh, ">:scalar",  \$scalar or die;
+   open my $fh, ">>:scalar", \$scalar or die;
+
+=head1 DESCRIPTION
+
+A filehandle is opened but the file operations are performed "in-memory"
+on a scalar variable.  All the normal file operations can be performed
+on the handle. The scalar is considered a stream of bytes.  Currently
+fileno($fh) returns C<undef>.
+
+=head1 IMPLEMENTATION NOTE
+
+C<PerlIO::scalar> only exists to use XSLoader to load C code that
+provides support for treating a scalar as an "in memory" file.
+One does not need to explicitly C<use PerlIO::scalar>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/PerlIO/via.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/PerlIO/via.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/PerlIO/via.pm	(revision 14489)
@@ -0,0 +1,244 @@
+package PerlIO::via;
+our $VERSION = '0.03';
+use XSLoader ();
+XSLoader::load 'PerlIO::via';
+1;
+__END__
+
+=head1 NAME
+
+PerlIO::via - Helper class for PerlIO layers implemented in perl
+
+=head1 SYNOPSIS
+
+   use PerlIO::via::Layer;
+   open($fh,"<:via(Layer)",...);
+
+   use Some::Other::Package;
+   open($fh,">:via(Some::Other::Package)",...);
+
+=head1 DESCRIPTION
+
+The PerlIO::via module allows you to develop PerlIO layers in Perl, without
+having to go into the nitty gritty of programming C with XS as the interface
+to Perl.
+
+One example module, L<PerlIO::via::QuotedPrint>, is included with Perl
+5.8.0, and more example modules are available from CPAN, such as
+L<PerlIO::via::StripHTML> and L<PerlIO::via::Base64>.  The
+PerlIO::via::StripHTML module for instance, allows you to say:
+
+	use PerlIO::via::StripHTML;
+	open( my $fh, "<:via(StripHTML)", "index.html" );
+        my @line = <$fh>;
+
+to obtain the text of an HTML-file in an array with all the HTML-tags
+automagically removed.
+
+Please note that if the layer is created in the PerlIO::via:: namespace, it
+does B<not> have to be fully qualified.  The PerlIO::via module will prefix
+the PerlIO::via:: namespace if the specified modulename does not exist as a
+fully qualified module name.
+
+=head1 EXPECTED METHODS
+
+To create a Perl module that implements a PerlIO layer in Perl (as opposed to
+in C using XS as the interface to Perl), you need to supply some of the
+following subroutines.  It is recommended to create these Perl modules in the
+PerlIO::via:: namespace, so that they can easily be located on CPAN and use
+the default namespace feature of the PerlIO::via module itself.
+
+Please note that this is an area of recent development in Perl and that the
+interface described here is therefore still subject to change (and hopefully
+will have better documentation and more examples).
+
+In the method descriptions below I<$fh> will be
+a reference to a glob which can be treated as a perl file handle.
+It refers to the layer below. I<$fh> is not passed if the layer
+is at the bottom of the stack, for this reason and to maintain
+some level of "compatibility" with TIEHANDLE classes it is passed last.
+
+=over 4
+
+=item $class->PUSHED([$mode[,$fh]])
+
+Should return an object or the class, or -1 on failure.  (Compare
+TIEHANDLE.)  The arguments are an optional mode string ("r", "w",
+"w+", ...) and a filehandle for the PerlIO layer below.  Mandatory.
+
+When layer is pushed as part of an C<open> call, C<PUSHED> will be called
+I<before> the actual open occurs whether than be via C<OPEN>, C<SYSOPEN>,
+C<FDOPEN> or by letting lower layer do the open.
+
+=item $obj->POPPED([$fh])
+
+Optional - layer is about to be removed.
+
+=item $obj->UTF8($bellowFlag,[$fh])
+
+Optional - if present it will be called immediately after PUSHED has
+returned. It should return true value if the layer expects data to be
+UTF-8 encoded. If it returns true result is as if caller had done
+
+   ":via(YourClass):utf8"
+
+If not present of it it returns false, then stream is left with
+flag clear.
+The I<$bellowFlag> argument will be true if there is a layer below
+and that layer was expecting UTF-8.
+
+
+=item $obj->OPEN($path,$mode[,$fh])
+
+Optional - if not present lower layer does open.
+If present called for normal opens after layer is pushed.
+This function is subject to change as there is no easy way
+to get lower layer to do open and then regain control.
+
+=item $obj->BINMODE([,$fh])
+
+Optional - if not available layer is popped on binmode($fh) or when C<:raw>
+is pushed. If present it should return 0 on success -1 on error and undef
+to pop the layer.
+
+=item $obj->FDOPEN($fd[,$fh])
+
+Optional - if not present lower layer does open.
+If present called for opens which pass a numeric file
+descriptor after layer is pushed.
+This function is subject to change as there is no easy way
+to get lower layer to do open and then regain control.
+
+=item $obj->SYSOPEN($path,$imode,$perm,[,$fh])
+
+Optional - if not present lower layer does open.
+If present called for sysopen style opens which pass a numeric mode
+and permissions after layer is pushed.
+This function is subject to change as there is no easy way
+to get lower layer to do open and then regain control.
+
+=item $obj->FILENO($fh)
+
+Returns a numeric value for Unix-like file descriptor. Return -1 if
+there isn't one.  Optional.  Default is fileno($fh).
+
+=item $obj->READ($buffer,$len,$fh)
+
+Returns the number of octets placed in $buffer (must be less than or
+equal to $len).  Optional.  Default is to use FILL instead.
+
+=item $obj->WRITE($buffer,$fh)
+
+Returns the number of octets from buffer that have been successfully written.
+
+=item $obj->FILL($fh)
+
+Should return a string to be placed in the buffer.  Optional. If not
+provided must provide READ or reject handles open for reading in
+PUSHED.
+
+=item $obj->CLOSE($fh)
+
+Should return 0 on success, -1 on error.
+Optional.
+
+=item $obj->SEEK($posn,$whence,$fh)
+
+Should return 0 on success, -1 on error.
+Optional.  Default is to fail, but that is likely to be changed
+in future.
+
+=item $obj->TELL($fh)
+
+Returns file postion.
+Optional.  Default to be determined.
+
+=item $obj->UNREAD($buffer,$fh)
+
+Returns the number of octets from buffer that have been successfully
+saved to be returned on future FILL/READ calls.  Optional.  Default is
+to push data into a temporary layer above this one.
+
+=item $obj->FLUSH($fh)
+
+Flush any buffered write data.  May possibly be called on readable
+handles too.  Should return 0 on success, -1 on error.
+
+=item $obj->SETLINEBUF($fh)
+
+Optional. No return.
+
+=item $obj->CLEARERR($fh)
+
+Optional. No return.
+
+=item $obj->ERROR($fh)
+
+Optional. Returns error state. Default is no error until a mechanism
+to signal error (die?) is worked out.
+
+=item $obj->EOF($fh)
+
+Optional. Returns end-of-file state. Default is function of return
+value of FILL or READ.
+
+=back
+
+=head1 EXAMPLES
+
+Check the PerlIO::via:: namespace on CPAN for examples of PerlIO layers
+implemented in Perl.  To give you an idea how simple the implementation of
+a PerlIO layer can look, as simple example is included here.
+
+=head2 Example - a Hexadecimal Handle
+
+Given the following module, PerlIO::via::Hex :
+
+    package PerlIO::via::Hex;
+
+    sub PUSHED
+    {
+     my ($class,$mode,$fh) = @_;
+     # When writing we buffer the data
+     my $buf = '';
+     return bless \$buf,$class;
+    }
+
+    sub FILL
+    {
+     my ($obj,$fh) = @_;
+     my $line = <$fh>;
+     return (defined $line) ? pack("H*", $line) : undef;
+    }
+
+    sub WRITE
+    {
+     my ($obj,$buf,$fh) = @_;
+     $$obj .= unpack("H*", $buf);
+     return length($buf);
+    }
+
+    sub FLUSH
+    {
+     my ($obj,$fh) = @_;
+     print $fh $$obj or return -1;
+     $$obj = '';
+     return 0;
+    }
+
+    1;
+
+the following code opens up an output handle that will convert any
+output to hexadecimal dump of the output bytes: for example "A" will
+be converted to "41" (on ASCII-based machines, on EBCDIC platforms
+the "A" will become "c1")
+
+    use PerlIO::via::Hex;
+    open(my $fh, ">:via(Hex)", "foo.hex");
+
+and the following code will read the hexdump in and convert it
+on the fly back into bytes:
+
+    open(my $fh, "<:via(Hex)", "foo.hex");
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/PerlIO/via/QuotedPrint.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/PerlIO/via/QuotedPrint.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/PerlIO/via/QuotedPrint.pm	(revision 14489)
@@ -0,0 +1,94 @@
+package PerlIO::via::QuotedPrint;
+
+# Set the version info
+# Make sure we do things by the book from now on
+
+$VERSION = '0.06';
+use strict;
+
+# Make sure the encoding/decoding stuff is available
+
+use MIME::QuotedPrint (); # no need to pollute this namespace
+
+# Satisfy -require-
+
+1;
+
+#-----------------------------------------------------------------------
+#  IN: 1 class to bless with
+#      2 mode string (ignored)
+#      3 file handle of PerlIO layer below (ignored)
+# OUT: 1 blessed object
+
+sub PUSHED { bless \*PUSHED,$_[0] } #PUSHED
+
+#-----------------------------------------------------------------------
+#  IN: 1 instantiated object (ignored)
+#      2 handle to read from
+# OUT: 1 decoded string
+
+sub FILL {
+
+# Read the line from the handle
+# Decode if there is something decode and return result or signal eof
+
+    my $line = readline( $_[1] );
+    (defined $line) ? MIME::QuotedPrint::decode_qp( $line ) : undef;
+} #FILL
+
+#-----------------------------------------------------------------------
+#  IN: 1 instantiated object (ignored)
+#      2 buffer to be written
+#      3 handle to write to
+# OUT: 1 number of bytes written
+
+sub WRITE {
+
+# Encode whatever needs to be encoded and write to handle: indicate result
+
+    (print {$_[2]} MIME::QuotedPrint::encode_qp($_[1])) ? length($_[1]) : -1;
+} #WRITE
+
+__END__
+
+=head1 NAME
+
+PerlIO::via::QuotedPrint - PerlIO layer for quoted-printable strings
+
+=head1 SYNOPSIS
+
+ use PerlIO::via::QuotedPrint;
+
+ open( my $in,'<:via(QuotedPrint)','file.qp' )
+  or die "Can't open file.qp for reading: $!\n";
+ 
+ open( my $out,'>:via(QuotedPrint)','file.qp' )
+  or die "Can't open file.qp for writing: $!\n";
+
+=head1 DESCRIPTION
+
+This module implements a PerlIO layer that works on files encoded in the
+quoted-printable format.  It will decode from quoted-printable while reading
+from a handle, and it will encode as quoted-printable while writing to a handle.
+
+=head1 REQUIRED MODULES
+
+ MIME::QuotedPrint (any)
+
+=head1 SEE ALSO
+
+L<PerlIO::via>, L<MIME::QuotedPrint>, L<PerlIO::via::Base64>,
+L<PerlIO::via::MD5>, L<PerlIO::via::StripHTML>, L<PerlIO::via::Rotate>.
+
+=head1 ACKNOWLEDGEMENTS
+
+Based on example that was initially added to MIME::QuotedPrint.pm for the
+5.8.0 distribution of Perl.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2002-2003 Elizabeth Mattijsen.  All rights reserved.  This
+library is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Checker.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Checker.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Checker.pm	(revision 14489)
@@ -0,0 +1,1270 @@
+#############################################################################
+# Pod/Checker.pm -- check pod documents for syntax errors
+#
+# Copyright (C) 1994-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Checker;
+
+use vars qw($VERSION);
+$VERSION = 1.43;  ## Current version of this package
+require  5.005;    ## requires this Perl version or later
+
+use Pod::ParseUtils; ## for hyperlinks and lists
+
+=head1 NAME
+
+Pod::Checker, podchecker() - check pod documents for syntax errors
+
+=head1 SYNOPSIS
+
+  use Pod::Checker;
+
+  $syntax_okay = podchecker($filepath, $outputpath, %options);
+
+  my $checker = new Pod::Checker %options;
+  $checker->parse_from_file($filepath, \*STDERR);
+
+=head1 OPTIONS/ARGUMENTS
+
+C<$filepath> is the input POD to read and C<$outputpath> is
+where to write POD syntax error messages. Either argument may be a scalar
+indicating a file-path, or else a reference to an open filehandle.
+If unspecified, the input-file it defaults to C<\*STDIN>, and
+the output-file defaults to C<\*STDERR>.
+
+=head2 podchecker()
+
+This function can take a hash of options:
+
+=over 4
+
+=item B<-warnings> =E<gt> I<val>
+
+Turn warnings on/off. I<val> is usually 1 for on, but higher values
+trigger additional warnings. See L<"Warnings">.
+
+=back
+
+=head1 DESCRIPTION
+
+B<podchecker> will perform syntax checking of Perl5 POD format documentation.
+
+Curious/ambitious users are welcome to propose additional features they wish
+to see in B<Pod::Checker> and B<podchecker> and verify that the checks are
+consistent with L<perlpod>.
+
+The following checks are currently performed:
+
+=over 4
+
+=item *
+
+Unknown '=xxxx' commands, unknown 'XE<lt>...E<gt>' interior-sequences,
+and unterminated interior sequences.
+
+=item *
+
+Check for proper balancing of C<=begin> and C<=end>. The contents of such
+a block are generally ignored, i.e. no syntax checks are performed.
+
+=item *
+
+Check for proper nesting and balancing of C<=over>, C<=item> and C<=back>.
+
+=item *
+
+Check for same nested interior-sequences (e.g. 
+C<LE<lt>...LE<lt>...E<gt>...E<gt>>).
+
+=item *
+
+Check for malformed or nonexisting entities C<EE<lt>...E<gt>>.
+
+=item *
+
+Check for correct syntax of hyperlinks C<LE<lt>...E<gt>>. See L<perlpod>
+for details.
+
+=item *
+
+Check for unresolved document-internal links. This check may also reveal
+misspelled links that seem to be internal links but should be links
+to something else.
+
+=back
+
+=head1 DIAGNOSTICS
+
+=head2 Errors
+
+=over 4
+
+=item * empty =headn
+
+A heading (C<=head1> or C<=head2>) without any text? That ain't no
+heading!
+
+=item * =over on line I<N> without closing =back
+
+The C<=over> command does not have a corresponding C<=back> before the
+next heading (C<=head1> or C<=head2>) or the end of the file.
+
+=item * =item without previous =over
+
+=item * =back without previous =over
+
+An C<=item> or C<=back> command has been found outside a
+C<=over>/C<=back> block.
+
+=item * No argument for =begin
+
+A C<=begin> command was found that is not followed by the formatter
+specification.
+
+=item * =end without =begin
+
+A standalone C<=end> command was found.
+
+=item * Nested =begin's
+
+There were at least two consecutive C<=begin> commands without
+the corresponding C<=end>. Only one C<=begin> may be active at
+a time.
+
+=item * =for without formatter specification
+
+There is no specification of the formatter after the C<=for> command.
+
+=item * unresolved internal link I<NAME>
+
+The given link to I<NAME> does not have a matching node in the current
+POD. This also happend when a single word node name is not enclosed in
+C<"">.
+
+=item * Unknown command "I<CMD>"
+
+An invalid POD command has been found. Valid are C<=head1>, C<=head2>,
+C<=head3>, C<=head4>, C<=over>, C<=item>, C<=back>, C<=begin>, C<=end>,
+C<=for>, C<=pod>, C<=cut>
+
+=item * Unknown interior-sequence "I<SEQ>"
+
+An invalid markup command has been encountered. Valid are:
+C<BE<lt>E<gt>>, C<CE<lt>E<gt>>, C<EE<lt>E<gt>>, C<FE<lt>E<gt>>, 
+C<IE<lt>E<gt>>, C<LE<lt>E<gt>>, C<SE<lt>E<gt>>, C<XE<lt>E<gt>>, 
+C<ZE<lt>E<gt>>
+
+=item * nested commands I<CMD>E<lt>...I<CMD>E<lt>...E<gt>...E<gt>
+
+Two nested identical markup commands have been found. Generally this
+does not make sense.
+
+=item * garbled entity I<STRING>
+
+The I<STRING> found cannot be interpreted as a character entity.
+
+=item * Entity number out of range
+
+An entity specified by number (dec, hex, oct) is out of range (1-255).
+
+=item * malformed link LE<lt>E<gt>
+
+The link found cannot be parsed because it does not conform to the
+syntax described in L<perlpod>.
+
+=item * nonempty ZE<lt>E<gt>
+
+The C<ZE<lt>E<gt>> sequence is supposed to be empty.
+
+=item * empty XE<lt>E<gt>
+
+The index entry specified contains nothing but whitespace.
+
+=item * Spurious text after =pod / =cut
+
+The commands C<=pod> and C<=cut> do not take any arguments.
+
+=item * Spurious character(s) after =back
+
+The C<=back> command does not take any arguments.
+
+=back
+
+=head2 Warnings
+
+These may not necessarily cause trouble, but indicate mediocre style.
+
+=over 4
+
+=item * multiple occurrence of link target I<name>
+
+The POD file has some C<=item> and/or C<=head> commands that have
+the same text. Potential hyperlinks to such a text cannot be unique then.
+This warning is printed only with warning level greater than one.
+
+=item * line containing nothing but whitespace in paragraph
+
+There is some whitespace on a seemingly empty line. POD is very sensitive
+to such things, so this is flagged. B<vi> users switch on the B<list>
+option to avoid this problem.
+
+=begin _disabled_
+
+=item * file does not start with =head
+
+The file starts with a different POD directive than head.
+This is most probably something you do not want.
+
+=end _disabled_
+
+=item * previous =item has no contents
+
+There is a list C<=item> right above the flagged line that has no
+text contents. You probably want to delete empty items.
+
+=item * preceding non-item paragraph(s)
+
+A list introduced by C<=over> starts with a text or verbatim paragraph,
+but continues with C<=item>s. Move the non-item paragraph out of the
+C<=over>/C<=back> block.
+
+=item * =item type mismatch (I<one> vs. I<two>)
+
+A list started with e.g. a bulletted C<=item> and continued with a
+numbered one. This is obviously inconsistent. For most translators the
+type of the I<first> C<=item> determines the type of the list.
+
+=item * I<N> unescaped C<E<lt>E<gt>> in paragraph
+
+Angle brackets not written as C<E<lt>ltE<gt>> and C<E<lt>gtE<gt>>
+can potentially cause errors as they could be misinterpreted as
+markup commands. This is only printed when the -warnings level is
+greater than 1.
+
+=item * Unknown entity
+
+A character entity was found that does not belong to the standard
+ISO set or the POD specials C<verbar> and C<sol>.
+
+=item * No items in =over
+
+The list opened with C<=over> does not contain any items.
+
+=item * No argument for =item
+
+C<=item> without any parameters is deprecated. It should either be followed
+by C<*> to indicate an unordered list, by a number (optionally followed
+by a dot) to indicate an ordered (numbered) list or simple text for a
+definition list.
+
+=item * empty section in previous paragraph
+
+The previous section (introduced by a C<=head> command) does not contain
+any text. This usually indicates that something is missing. Note: A 
+C<=head1> followed immediately by C<=head2> does not trigger this warning.
+
+=item * Verbatim paragraph in NAME section
+
+The NAME section (C<=head1 NAME>) should consist of a single paragraph
+with the script/module name, followed by a dash `-' and a very short
+description of what the thing is good for.
+
+=item * =headI<n> without preceding higher level
+
+For example if there is a C<=head2> in the POD file prior to a
+C<=head1>.
+
+=back
+
+=head2 Hyperlinks
+
+There are some warnings wrt. malformed hyperlinks.
+
+=over 4
+
+=item * ignoring leading/trailing whitespace in link
+
+There is whitespace at the beginning or the end of the contents of 
+LE<lt>...E<gt>.
+
+=item * (section) in '$page' deprecated
+
+There is a section detected in the page name of LE<lt>...E<gt>, e.g.
+C<LE<lt>passwd(2)E<gt>>. POD hyperlinks may point to POD documents only.
+Please write C<CE<lt>passwd(2)E<gt>> instead. Some formatters are able
+to expand this to appropriate code. For links to (builtin) functions,
+please say C<LE<lt>perlfunc/mkdirE<gt>>, without ().
+
+=item * alternative text/node '%s' contains non-escaped | or /
+
+The characters C<|> and C</> are special in the LE<lt>...E<gt> context.
+Although the hyperlink parser does its best to determine which "/" is
+text and which is a delimiter in case of doubt, one ought to escape
+these literal characters like this:
+
+  /     E<sol>
+  |     E<verbar>
+
+=back
+
+=head1 RETURN VALUE
+
+B<podchecker> returns the number of POD syntax errors found or -1 if
+there were no POD commands at all found in the file.
+
+=head1 EXAMPLES
+
+See L</SYNOPSIS>
+
+=head1 INTERFACE
+
+While checking, this module collects document properties, e.g. the nodes
+for hyperlinks (C<=headX>, C<=item>) and index entries (C<XE<lt>E<gt>>).
+POD translators can use this feature to syntax-check and get the nodes in
+a first pass before actually starting to convert. This is expensive in terms
+of execution time, but allows for very robust conversions.
+
+Since PodParser-1.24 the B<Pod::Checker> module uses only the B<poderror>
+method to print errors and warnings. The summary output (e.g. 
+"Pod syntax OK") has been dropped from the module and has been included in
+B<podchecker> (the script). This allows users of B<Pod::Checker> to
+control completely the output behaviour. Users of B<podchecker> (the script)
+get the well-known behaviour.
+
+=cut
+
+#############################################################################
+
+use strict;
+#use diagnostics;
+use Carp;
+use Exporter;
+use Pod::Parser;
+
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Pod::Parser);
+@EXPORT = qw(&podchecker);
+
+use vars qw(%VALID_COMMANDS %VALID_SEQUENCES);
+
+my %VALID_COMMANDS = (
+    'pod'    =>  1,
+    'cut'    =>  1,
+    'head1'  =>  1,
+    'head2'  =>  1,
+    'head3'  =>  1,
+    'head4'  =>  1,
+    'over'   =>  1,
+    'back'   =>  1,
+    'item'   =>  1,
+    'for'    =>  1,
+    'begin'  =>  1,
+    'end'    =>  1,
+);
+
+my %VALID_SEQUENCES = (
+    'I'  =>  1,
+    'B'  =>  1,
+    'S'  =>  1,
+    'C'  =>  1,
+    'L'  =>  1,
+    'F'  =>  1,
+    'X'  =>  1,
+    'Z'  =>  1,
+    'E'  =>  1,
+);
+
+# stolen from HTML::Entities
+my %ENTITIES = (
+ # Some normal chars that have special meaning in SGML context
+ amp    => '&',  # ampersand 
+'gt'    => '>',  # greater than
+'lt'    => '<',  # less than
+ quot   => '"',  # double quote
+
+ # PUBLIC ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML
+ AElig	=> 'Æ',  # capital AE diphthong (ligature)
+ Aacute	=> 'Á',  # capital A, acute accent
+ Acirc	=> 'Â',  # capital A, circumflex accent
+ Agrave	=> 'À',  # capital A, grave accent
+ Aring	=> 'Å',  # capital A, ring
+ Atilde	=> 'Ã',  # capital A, tilde
+ Auml	=> 'Ä',  # capital A, dieresis or umlaut mark
+ Ccedil	=> 'Ç',  # capital C, cedilla
+ ETH	=> 'Ð',  # capital Eth, Icelandic
+ Eacute	=> 'É',  # capital E, acute accent
+ Ecirc	=> 'Ê',  # capital E, circumflex accent
+ Egrave	=> 'È',  # capital E, grave accent
+ Euml	=> 'Ë',  # capital E, dieresis or umlaut mark
+ Iacute	=> 'Í',  # capital I, acute accent
+ Icirc	=> 'Î',  # capital I, circumflex accent
+ Igrave	=> 'Ì',  # capital I, grave accent
+ Iuml	=> 'Ï',  # capital I, dieresis or umlaut mark
+ Ntilde	=> 'Ñ',  # capital N, tilde
+ Oacute	=> 'Ó',  # capital O, acute accent
+ Ocirc	=> 'Ô',  # capital O, circumflex accent
+ Ograve	=> 'Ò',  # capital O, grave accent
+ Oslash	=> 'Ø',  # capital O, slash
+ Otilde	=> 'Õ',  # capital O, tilde
+ Ouml	=> 'Ö',  # capital O, dieresis or umlaut mark
+ THORN	=> 'Þ',  # capital THORN, Icelandic
+ Uacute	=> 'Ú',  # capital U, acute accent
+ Ucirc	=> 'Û',  # capital U, circumflex accent
+ Ugrave	=> 'Ù',  # capital U, grave accent
+ Uuml	=> 'Ü',  # capital U, dieresis or umlaut mark
+ Yacute	=> 'Ý',  # capital Y, acute accent
+ aacute	=> 'á',  # small a, acute accent
+ acirc	=> 'â',  # small a, circumflex accent
+ aelig	=> 'æ',  # small ae diphthong (ligature)
+ agrave	=> 'à',  # small a, grave accent
+ aring	=> 'å',  # small a, ring
+ atilde	=> 'ã',  # small a, tilde
+ auml	=> 'ä',  # small a, dieresis or umlaut mark
+ ccedil	=> 'ç',  # small c, cedilla
+ eacute	=> 'é',  # small e, acute accent
+ ecirc	=> 'ê',  # small e, circumflex accent
+ egrave	=> 'è',  # small e, grave accent
+ eth	=> 'ð',  # small eth, Icelandic
+ euml	=> 'ë',  # small e, dieresis or umlaut mark
+ iacute	=> 'í',  # small i, acute accent
+ icirc	=> 'î',  # small i, circumflex accent
+ igrave	=> 'ì',  # small i, grave accent
+ iuml	=> 'ï',  # small i, dieresis or umlaut mark
+ ntilde	=> 'ñ',  # small n, tilde
+ oacute	=> 'ó',  # small o, acute accent
+ ocirc	=> 'ô',  # small o, circumflex accent
+ ograve	=> 'ò',  # small o, grave accent
+ oslash	=> 'ø',  # small o, slash
+ otilde	=> 'õ',  # small o, tilde
+ ouml	=> 'ö',  # small o, dieresis or umlaut mark
+ szlig	=> 'ß',  # small sharp s, German (sz ligature)
+ thorn	=> 'þ',  # small thorn, Icelandic
+ uacute	=> 'ú',  # small u, acute accent
+ ucirc	=> 'û',  # small u, circumflex accent
+ ugrave	=> 'ù',  # small u, grave accent
+ uuml	=> 'ü',  # small u, dieresis or umlaut mark
+ yacute	=> 'ý',  # small y, acute accent
+ yuml	=> 'ÿ',  # small y, dieresis or umlaut mark
+
+ # Some extra Latin 1 chars that are listed in the HTML3.2 draft (21-May-96)
+ copy   => '©',  # copyright sign
+ reg    => '®',  # registered sign
+ nbsp   => "\240", # non breaking space
+
+ # Additional ISO-8859/1 entities listed in rfc1866 (section 14)
+ iexcl  => '¡',
+ cent   => '¢',
+ pound  => '£',
+ curren => '€',
+ yen    => '¥',
+ brvbar => 'Š',
+ sect   => '§',
+ uml    => 'š',
+ ordf   => 'ª',
+ laquo  => '«',
+'not'   => '¬',    # not is a keyword in perl
+ shy    => '­',
+ macr   => '¯',
+ deg    => '°',
+ plusmn => '±',
+ sup1   => '¹',
+ sup2   => '²',
+ sup3   => '³',
+ acute  => 'Ž',
+ micro  => 'µ',
+ para   => '¶',
+ middot => '·',
+ cedil  => 'ž',
+ ordm   => 'º',
+ raquo  => '»',
+ frac14 => 'Œ',
+ frac12 => 'œ',
+ frac34 => 'Ÿ',
+ iquest => '¿',
+'times' => '×',    # times is a keyword in perl
+ divide => '÷',
+
+# some POD special entities
+ verbar => '|',
+ sol => '/'
+);
+
+##---------------------------------------------------------------------------
+
+##---------------------------------
+## Function definitions begin here
+##---------------------------------
+
+sub podchecker( $ ; $ % ) {
+    my ($infile, $outfile, %options) = @_;
+    local $_;
+
+    ## Set defaults
+    $infile  ||= \*STDIN;
+    $outfile ||= \*STDERR;
+
+    ## Now create a pod checker
+    my $checker = new Pod::Checker(%options);
+
+    ## Now check the pod document for errors
+    $checker->parse_from_file($infile, $outfile);
+
+    ## Return the number of errors found
+    return $checker->num_errors();
+}
+
+##---------------------------------------------------------------------------
+
+##-------------------------------
+## Method definitions begin here
+##-------------------------------
+
+##################################
+
+=over 4
+
+=item C<Pod::Checker-E<gt>new( %options )>
+
+Return a reference to a new Pod::Checker object that inherits from
+Pod::Parser and is used for calling the required methods later. The
+following options are recognized:
+
+C<-warnings =E<gt> num>
+  Print warnings if C<num> is true. The higher the value of C<num>,
+the more warnings are printed. Currently there are only levels 1 and 2.
+
+C<-quiet =E<gt> num>
+  If C<num> is true, do not print any errors/warnings. This is useful
+when Pod::Checker is used to munge POD code into plain text from within
+POD formatters.
+
+=cut
+
+## sub new {
+##     my $this = shift;
+##     my $class = ref($this) || $this;
+##     my %params = @_;
+##     my $self = {%params};
+##     bless $self, $class;
+##     $self->initialize();
+##     return $self;
+## }
+
+sub initialize {
+    my $self = shift;
+    ## Initialize number of errors, and setup an error function to
+    ## increment this number and then print to the designated output.
+    $self->{_NUM_ERRORS} = 0;
+    $self->{_NUM_WARNINGS} = 0;
+    $self->{-quiet} ||= 0;
+    # set the error handling subroutine
+    $self->errorsub($self->{-quiet} ? sub { 1; } : 'poderror');
+    $self->{_commands} = 0; # total number of POD commands encountered
+    $self->{_list_stack} = []; # stack for nested lists
+    $self->{_have_begin} = ''; # stores =begin
+    $self->{_links} = []; # stack for internal hyperlinks
+    $self->{_nodes} = []; # stack for =head/=item nodes
+    $self->{_index} = []; # text in X<>
+    # print warnings?
+    $self->{-warnings} = 1 unless(defined $self->{-warnings});
+    $self->{_current_head1} = ''; # the current =head1 block
+    $self->parseopts(-process_cut_cmd => 1, -warnings => $self->{-warnings});
+}
+
+##################################
+
+=item C<$checker-E<gt>poderror( @args )>
+
+=item C<$checker-E<gt>poderror( {%opts}, @args )>
+
+Internal method for printing errors and warnings. If no options are
+given, simply prints "@_". The following options are recognized and used
+to form the output:
+
+  -msg
+
+A message to print prior to C<@args>.
+
+  -line
+
+The line number the error occurred in.
+
+  -file
+
+The file (name) the error occurred in.
+
+  -severity
+
+The error level, should be 'WARNING' or 'ERROR'.
+
+=cut
+
+# Invoked as $self->poderror( @args ), or $self->poderror( {%opts}, @args )
+sub poderror {
+    my $self = shift;
+    my %opts = (ref $_[0]) ? %{shift()} : ();
+
+    ## Retrieve options
+    chomp( my $msg  = ($opts{-msg} || "")."@_" );
+    my $line = (exists $opts{-line}) ? " at line $opts{-line}" : "";
+    my $file = (exists $opts{-file}) ? " in file $opts{-file}" : "";
+    unless (exists $opts{-severity}) {
+       ## See if can find severity in message prefix
+       $opts{-severity} = $1  if ( $msg =~ s/^\**\s*([A-Z]{3,}):\s+// );
+    }
+    my $severity = (exists $opts{-severity}) ? "*** $opts{-severity}: " : "";
+
+    ## Increment error count and print message "
+    ++($self->{_NUM_ERRORS}) 
+        if(!%opts || ($opts{-severity} && $opts{-severity} eq 'ERROR'));
+    ++($self->{_NUM_WARNINGS})
+        if(!%opts || ($opts{-severity} && $opts{-severity} eq 'WARNING'));
+    unless($self->{-quiet}) {
+      my $out_fh = $self->output_handle() || \*STDERR;
+      print $out_fh ($severity, $msg, $line, $file, "\n")
+        if($self->{-warnings} || !%opts || $opts{-severity} ne 'WARNING');
+    }
+}
+
+##################################
+
+=item C<$checker-E<gt>num_errors()>
+
+Set (if argument specified) and retrieve the number of errors found.
+
+=cut
+
+sub num_errors {
+   return (@_ > 1) ? ($_[0]->{_NUM_ERRORS} = $_[1]) : $_[0]->{_NUM_ERRORS};
+}
+
+##################################
+
+=item C<$checker-E<gt>num_warnings()>
+
+Set (if argument specified) and retrieve the number of warnings found.
+
+=cut
+
+sub num_warnings {
+   return (@_ > 1) ? ($_[0]->{_NUM_WARNINGS} = $_[1]) : $_[0]->{_NUM_WARNINGS};
+}
+
+##################################
+
+=item C<$checker-E<gt>name()>
+
+Set (if argument specified) and retrieve the canonical name of POD as
+found in the C<=head1 NAME> section.
+
+=cut
+
+sub name {
+    return (@_ > 1 && $_[1]) ?
+        ($_[0]->{-name} = $_[1]) : $_[0]->{-name};  
+}
+
+##################################
+
+=item C<$checker-E<gt>node()>
+
+Add (if argument specified) and retrieve the nodes (as defined by C<=headX>
+and C<=item>) of the current POD. The nodes are returned in the order of
+their occurrence. They consist of plain text, each piece of whitespace is
+collapsed to a single blank.
+
+=cut
+
+sub node {
+    my ($self,$text) = @_;
+    if(defined $text) {
+        $text =~ s/\s+$//s; # strip trailing whitespace
+        $text =~ s/\s+/ /gs; # collapse whitespace
+        # add node, order important!
+        push(@{$self->{_nodes}}, $text);
+        # keep also a uniqueness counter
+        $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s);
+        return $text;
+    }
+    @{$self->{_nodes}};
+}
+
+##################################
+
+=item C<$checker-E<gt>idx()>
+
+Add (if argument specified) and retrieve the index entries (as defined by
+C<XE<lt>E<gt>>) of the current POD. They consist of plain text, each piece
+of whitespace is collapsed to a single blank.
+
+=cut
+
+# set/return index entries of current POD
+sub idx {
+    my ($self,$text) = @_;
+    if(defined $text) {
+        $text =~ s/\s+$//s; # strip trailing whitespace
+        $text =~ s/\s+/ /gs; # collapse whitespace
+        # add node, order important!
+        push(@{$self->{_index}}, $text);
+        # keep also a uniqueness counter
+        $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s);
+        return $text;
+    }
+    @{$self->{_index}};
+}
+
+##################################
+
+=item C<$checker-E<gt>hyperlink()>
+
+Add (if argument specified) and retrieve the hyperlinks (as defined by
+C<LE<lt>E<gt>>) of the current POD. They consist of a 2-item array: line
+number and C<Pod::Hyperlink> object.
+
+=back
+
+=cut
+
+# set/return hyperlinks of the current POD
+sub hyperlink {
+    my $self = shift;
+    if($_[0]) {
+        push(@{$self->{_links}}, $_[0]);
+        return $_[0];
+    }
+    @{$self->{_links}};
+}
+
+## overrides for Pod::Parser
+
+sub end_pod {
+    ## Do some final checks and
+    ## print the number of errors found
+    my $self   = shift;
+    my $infile = $self->input_file();
+
+    if(@{$self->{_list_stack}}) {
+        my $list;
+        while(($list = $self->_close_list('EOF',$infile)) &&
+          $list->indent() ne 'auto') {
+            $self->poderror({ -line => 'EOF', -file => $infile,
+                -severity => 'ERROR', -msg => "=over on line " .
+                $list->start() . " without closing =back" }); #"
+        }
+    }
+
+    # check validity of document internal hyperlinks
+    # first build the node names from the paragraph text
+    my %nodes;
+    foreach($self->node()) {
+        $nodes{$_} = 1;
+        if(/^(\S+)\s+\S/) {
+            # we have more than one word. Use the first as a node, too.
+            # This is used heavily in perlfunc.pod
+            $nodes{$1} ||= 2; # derived node
+        }
+    }
+    foreach($self->idx()) {
+        $nodes{$_} = 3; # index node
+    }
+    foreach($self->hyperlink()) {
+        my ($line,$link) = @$_;
+        # _TODO_ what if there is a link to the page itself by the name,
+        # e.g. in Tk::Pod : L<Tk::Pod/"DESCRIPTION">
+        if($link->node() && !$link->page() && $link->type() ne 'hyperlink') {
+            my $node = $self->_check_ptree($self->parse_text($link->node(),
+                $line), $line, $infile, 'L');
+            if($node && !$nodes{$node}) {
+                $self->poderror({ -line => $line || '', -file => $infile,
+                    -severity => 'ERROR',
+                    -msg => "unresolved internal link '$node'"});
+            }
+        }
+    }
+
+    # check the internal nodes for uniqueness. This pertains to
+    # =headX, =item and X<...>
+    if($self->{-warnings} && $self->{-warnings}>1) {
+      foreach(grep($self->{_unique_nodes}->{$_} > 1,
+        keys %{$self->{_unique_nodes}})) {
+          $self->poderror({ -line => '-', -file => $infile,
+            -severity => 'WARNING',
+            -msg => "multiple occurrence of link target '$_'"});
+      }
+    }
+
+    # no POD found here
+    $self->num_errors(-1) if($self->{_commands} == 0);
+}
+
+# check a POD command directive
+sub command { 
+    my ($self, $cmd, $paragraph, $line_num, $pod_para) = @_;
+    my ($file, $line) = $pod_para->file_line;
+    ## Check the command syntax
+    my $arg; # this will hold the command argument
+    if (! $VALID_COMMANDS{$cmd}) {
+       $self->poderror({ -line => $line, -file => $file, -severity => 'ERROR',
+                         -msg => "Unknown command '$cmd'" });
+    }
+    else { # found a valid command
+        $self->{_commands}++; # delete this line if below is enabled again
+
+        ##### following check disabled due to strong request
+        #if(!$self->{_commands}++ && $cmd !~ /^head/) {
+        #    $self->poderror({ -line => $line, -file => $file,
+        #         -severity => 'WARNING', 
+        #         -msg => "file does not start with =head" });
+        #}
+
+        # check syntax of particular command
+        if($cmd eq 'over') {
+            # check for argument
+            $arg = $self->interpolate_and_check($paragraph, $line,$file);
+            my $indent = 4; # default
+            if($arg && $arg =~ /^\s*(\d+)\s*$/) {
+                $indent = $1;
+            }
+            # start a new list
+            $self->_open_list($indent,$line,$file);
+        }
+        elsif($cmd eq 'item') {
+            # are we in a list?
+            unless(@{$self->{_list_stack}}) {
+                $self->poderror({ -line => $line, -file => $file,
+                     -severity => 'ERROR', 
+                     -msg => "=item without previous =over" });
+                # auto-open in case we encounter many more
+                $self->_open_list('auto',$line,$file);
+            }
+            my $list = $self->{_list_stack}->[0];
+            # check whether the previous item had some contents
+            if(defined $self->{_list_item_contents} &&
+              $self->{_list_item_contents} == 0) {
+                $self->poderror({ -line => $line, -file => $file,
+                     -severity => 'WARNING', 
+                     -msg => "previous =item has no contents" });
+            }
+            if($list->{_has_par}) {
+                $self->poderror({ -line => $line, -file => $file,
+                     -severity => 'WARNING', 
+                     -msg => "preceding non-item paragraph(s)" });
+                delete $list->{_has_par};
+            }
+            # check for argument
+            $arg = $self->interpolate_and_check($paragraph, $line, $file);
+            if($arg && $arg =~ /(\S+)/) {
+                $arg =~ s/[\s\n]+$//;
+                my $type;
+                if($arg =~ /^[*]\s*(\S*.*)/) {
+                  $type = 'bullet';
+                  $self->{_list_item_contents} = $1 ? 1 : 0;
+                  $arg = $1;
+                }
+                elsif($arg =~ /^\d+\.?\s*(\S*)/) {
+                  $type = 'number';
+                  $self->{_list_item_contents} = $1 ? 1 : 0;
+                  $arg = $1;
+                }
+                else {
+                  $type = 'definition';
+                  $self->{_list_item_contents} = 1;
+                }
+                my $first = $list->type();
+                if($first && $first ne $type) {
+                    $self->poderror({ -line => $line, -file => $file,
+                       -severity => 'WARNING', 
+                       -msg => "=item type mismatch ('$first' vs. '$type')"});
+                }
+                else { # first item
+                    $list->type($type);
+                }
+            }
+            else {
+                $self->poderror({ -line => $line, -file => $file,
+                     -severity => 'WARNING', 
+                     -msg => "No argument for =item" });
+		$arg = ' '; # empty
+                $self->{_list_item_contents} = 0;
+            }
+            # add this item
+            $list->item($arg);
+            # remember this node
+            $self->node($arg);
+        }
+        elsif($cmd eq 'back') {
+            # check if we have an open list
+            unless(@{$self->{_list_stack}}) {
+                $self->poderror({ -line => $line, -file => $file,
+                         -severity => 'ERROR', 
+                         -msg => "=back without previous =over" });
+            }
+            else {
+                # check for spurious characters
+                $arg = $self->interpolate_and_check($paragraph, $line,$file);
+                if($arg && $arg =~ /\S/) {
+                    $self->poderror({ -line => $line, -file => $file,
+                         -severity => 'ERROR', 
+                         -msg => "Spurious character(s) after =back" });
+                }
+                # close list
+                my $list = $self->_close_list($line,$file);
+                # check for empty lists
+                if(!$list->item() && $self->{-warnings}) {
+                    $self->poderror({ -line => $line, -file => $file,
+                         -severity => 'WARNING', 
+                         -msg => "No items in =over (at line " .
+                         $list->start() . ") / =back list"}); #"
+                }
+            }
+        }
+        elsif($cmd =~ /^head(\d+)/) {
+            my $hnum = $1;
+            $self->{"_have_head_$hnum"}++; # count head types
+            if($hnum > 1 && !$self->{"_have_head_".($hnum -1)}) {
+              $self->poderror({ -line => $line, -file => $file,
+                   -severity => 'WARNING', 
+                   -msg => "=head$hnum without preceding higher level"});
+            }
+            # check whether the previous =head section had some contents
+            if(defined $self->{_commands_in_head} &&
+              $self->{_commands_in_head} == 0 &&
+              defined $self->{_last_head} &&
+              $self->{_last_head} >= $hnum) {
+                $self->poderror({ -line => $line, -file => $file,
+                     -severity => 'WARNING', 
+                     -msg => "empty section in previous paragraph"});
+            }
+            $self->{_commands_in_head} = -1;
+            $self->{_last_head} = $hnum;
+            # check if there is an open list
+            if(@{$self->{_list_stack}}) {
+                my $list;
+                while(($list = $self->_close_list($line,$file)) &&
+                  $list->indent() ne 'auto') {
+                    $self->poderror({ -line => $line, -file => $file,
+                         -severity => 'ERROR', 
+                         -msg => "=over on line ". $list->start() .
+                         " without closing =back (at $cmd)" });
+                }
+            }
+            # remember this node
+            $arg = $self->interpolate_and_check($paragraph, $line,$file);
+            $arg =~ s/[\s\n]+$//s;
+            $self->node($arg);
+            unless(length($arg)) {
+                $self->poderror({ -line => $line, -file => $file,
+                     -severity => 'ERROR', 
+                     -msg => "empty =$cmd"});
+            }
+            if($cmd eq 'head1') {
+                $self->{_current_head1} = $arg;
+            } else {
+                $self->{_current_head1} = '';
+            }
+        }
+        elsif($cmd eq 'begin') {
+            if($self->{_have_begin}) {
+                # already have a begin
+                $self->poderror({ -line => $line, -file => $file,
+                     -severity => 'ERROR', 
+                     -msg => "Nested =begin's (first at line " .
+                     $self->{_have_begin} . ")"});
+            }
+            else {
+                # check for argument
+                $arg = $self->interpolate_and_check($paragraph, $line,$file);
+                unless($arg && $arg =~ /(\S+)/) {
+                    $self->poderror({ -line => $line, -file => $file,
+                         -severity => 'ERROR', 
+                         -msg => "No argument for =begin"});
+                }
+                # remember the =begin
+                $self->{_have_begin} = "$line:$1";
+            }
+        }
+        elsif($cmd eq 'end') {
+            if($self->{_have_begin}) {
+                # close the existing =begin
+                $self->{_have_begin} = '';
+                # check for spurious characters
+                $arg = $self->interpolate_and_check($paragraph, $line,$file);
+                # the closing argument is optional
+                #if($arg && $arg =~ /\S/) {
+                #    $self->poderror({ -line => $line, -file => $file,
+                #         -severity => 'WARNING', 
+                #         -msg => "Spurious character(s) after =end" });
+                #}
+            }
+            else {
+                # don't have a matching =begin
+                $self->poderror({ -line => $line, -file => $file,
+                     -severity => 'ERROR', 
+                     -msg => "=end without =begin" });
+            }
+        }
+        elsif($cmd eq 'for') {
+            unless($paragraph =~ /\s*(\S+)\s*/) {
+                $self->poderror({ -line => $line, -file => $file,
+                     -severity => 'ERROR', 
+                     -msg => "=for without formatter specification" });
+            }
+            $arg = ''; # do not expand paragraph below
+        }
+        elsif($cmd =~ /^(pod|cut)$/) {
+            # check for argument
+            $arg = $self->interpolate_and_check($paragraph, $line,$file);
+            if($arg && $arg =~ /(\S+)/) {
+                $self->poderror({ -line => $line, -file => $file,
+                      -severity => 'ERROR', 
+                      -msg => "Spurious text after =$cmd"});
+            }
+        }
+    $self->{_commands_in_head}++;
+    ## Check the interior sequences in the command-text
+    $self->interpolate_and_check($paragraph, $line,$file)
+        unless(defined $arg);
+    }
+}
+
+sub _open_list
+{
+    my ($self,$indent,$line,$file) = @_;
+    my $list = Pod::List->new(
+           -indent => $indent,
+           -start => $line,
+           -file => $file);
+    unshift(@{$self->{_list_stack}}, $list);
+    undef $self->{_list_item_contents};
+    $list;
+}
+
+sub _close_list
+{
+    my ($self,$line,$file) = @_;
+    my $list = shift(@{$self->{_list_stack}});
+    if(defined $self->{_list_item_contents} &&
+      $self->{_list_item_contents} == 0) {
+        $self->poderror({ -line => $line, -file => $file,
+            -severity => 'WARNING', 
+            -msg => "previous =item has no contents" });
+    }
+    undef $self->{_list_item_contents};
+    $list;
+}
+
+# process a block of some text
+sub interpolate_and_check {
+    my ($self, $paragraph, $line, $file) = @_;
+    ## Check the interior sequences in the command-text
+    # and return the text
+    $self->_check_ptree(
+        $self->parse_text($paragraph,$line), $line, $file, '');
+}
+
+sub _check_ptree {
+    my ($self,$ptree,$line,$file,$nestlist) = @_;
+    local($_);
+    my $text = '';
+    # process each node in the parse tree
+    foreach(@$ptree) {
+        # regular text chunk
+        unless(ref) {
+            # count the unescaped angle brackets
+            # complain only when warning level is greater than 1
+            if($self->{-warnings} && $self->{-warnings}>1) {
+              my $count;
+              if($count = tr/<>/<>/) {
+                $self->poderror({ -line => $line, -file => $file,
+                     -severity => 'WARNING', 
+                     -msg => "$count unescaped <> in paragraph" });
+                }
+            }
+            $text .= $_;
+            next;
+        }
+        # have an interior sequence
+        my $cmd = $_->cmd_name();
+        my $contents = $_->parse_tree();
+        ($file,$line) = $_->file_line();
+        # check for valid tag
+        if (! $VALID_SEQUENCES{$cmd}) {
+            $self->poderror({ -line => $line, -file => $file,
+                 -severity => 'ERROR', 
+                 -msg => qq(Unknown interior-sequence '$cmd')});
+            # expand it anyway
+            $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
+            next;
+        }
+        if($nestlist =~ /$cmd/) {
+            $self->poderror({ -line => $line, -file => $file,
+                 -severity => 'WARNING', 
+                 -msg => "nested commands $cmd<...$cmd<...>...>"});
+            # _TODO_ should we add the contents anyway?
+            # expand it anyway, see below
+        }
+        if($cmd eq 'E') {
+            # preserve entities
+            if(@$contents > 1 || ref $$contents[0] || $$contents[0] !~ /^\w+$/) {
+                $self->poderror({ -line => $line, -file => $file,
+                    -severity => 'ERROR', 
+                    -msg => "garbled entity " . $_->raw_text()});
+                next;
+            }
+            my $ent = $$contents[0];
+            my $val;
+            if($ent =~ /^0x[0-9a-f]+$/i) {
+                # hexadec entity
+                $val = hex($ent);
+            }
+            elsif($ent =~ /^0\d+$/) {
+                # octal
+                $val = oct($ent);
+            }
+            elsif($ent =~ /^\d+$/) {
+                # numeric entity
+                $val = $ent;
+            }
+            if(defined $val) {
+                if($val>0 && $val<256) {
+                    $text .= chr($val);
+                }
+                else {
+                    $self->poderror({ -line => $line, -file => $file,
+                        -severity => 'ERROR', 
+                        -msg => "Entity number out of range " . $_->raw_text()});
+                }
+            }
+            elsif($ENTITIES{$ent}) {
+                # known ISO entity
+                $text .= $ENTITIES{$ent};
+            }
+            else {
+                $self->poderror({ -line => $line, -file => $file,
+                    -severity => 'WARNING', 
+                    -msg => "Unknown entity " . $_->raw_text()});
+                $text .= "E<$ent>";
+            }
+        }
+        elsif($cmd eq 'L') {
+            # try to parse the hyperlink
+            my $link = Pod::Hyperlink->new($contents->raw_text());
+            unless(defined $link) {
+                $self->poderror({ -line => $line, -file => $file,
+                    -severity => 'ERROR', 
+                    -msg => "malformed link " . $_->raw_text() ." : $@"});
+                next;
+            }
+            $link->line($line); # remember line
+            if($self->{-warnings}) {
+                foreach my $w ($link->warning()) {
+                    $self->poderror({ -line => $line, -file => $file,
+                        -severity => 'WARNING', 
+                        -msg => $w });
+                }
+            }
+            # check the link text
+            $text .= $self->_check_ptree($self->parse_text($link->text(),
+                $line), $line, $file, "$nestlist$cmd");
+            # remember link
+            $self->hyperlink([$line,$link]);
+        }
+        elsif($cmd =~ /[BCFIS]/) {
+            # add the guts
+            $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
+        }
+        elsif($cmd eq 'Z') {
+            if(length($contents->raw_text())) {
+                $self->poderror({ -line => $line, -file => $file,
+                    -severity => 'ERROR', 
+                    -msg => "Nonempty Z<>"});
+            }
+        }
+        elsif($cmd eq 'X') {
+            my $idx = $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
+            if($idx =~ /^\s*$/s) {
+                $self->poderror({ -line => $line, -file => $file,
+                    -severity => 'ERROR', 
+                    -msg => "Empty X<>"});
+            }
+            else {
+                # remember this node
+                $self->idx($idx);
+            }
+        }
+        else {
+            # not reached
+            die "internal error";
+        }
+    }
+    $text;
+}
+
+# process a block of verbatim text
+sub verbatim { 
+    ## Nothing particular to check
+    my ($self, $paragraph, $line_num, $pod_para) = @_;
+
+    $self->_preproc_par($paragraph);
+
+    if($self->{_current_head1} eq 'NAME') {
+        my ($file, $line) = $pod_para->file_line;
+        $self->poderror({ -line => $line, -file => $file,
+            -severity => 'WARNING',
+            -msg => 'Verbatim paragraph in NAME section' });
+    }
+}
+
+# process a block of regular text
+sub textblock { 
+    my ($self, $paragraph, $line_num, $pod_para) = @_;
+    my ($file, $line) = $pod_para->file_line;
+
+    $self->_preproc_par($paragraph);
+
+    # skip this paragraph if in a =begin block
+    unless($self->{_have_begin}) {
+        my $block = $self->interpolate_and_check($paragraph, $line,$file);
+        if($self->{_current_head1} eq 'NAME') {
+            if($block =~ /^\s*(\S+?)\s*[,-]/) {
+                # this is the canonical name
+                $self->{-name} = $1 unless(defined $self->{-name});
+            }
+        }
+    }
+}
+
+sub _preproc_par
+{
+    my $self = shift;
+    $_[0] =~ s/[\s\n]+$//;
+    if($_[0]) {
+        $self->{_commands_in_head}++;
+        $self->{_list_item_contents}++ if(defined $self->{_list_item_contents});
+        if(@{$self->{_list_stack}} && !$self->{_list_stack}->[0]->item()) {
+            $self->{_list_stack}->[0]->{_has_par} = 1;
+        }
+    }
+}
+
+1;
+
+__END__
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt> (initial version),
+Marek Rouchal E<lt>marekr@cpan.orgE<gt>
+
+Based on code for B<Pod::Text::pod2text()> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Find.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Find.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Find.pm	(revision 14489)
@@ -0,0 +1,523 @@
+#############################################################################  
+# Pod/Find.pm -- finds files containing POD documentation
+#
+# Author: Marek Rouchal <marekr@cpan.org>
+# 
+# Copyright (C) 1999-2000 by Marek Rouchal (and borrowing code
+# from Nick Ing-Simmon's PodToHtml). All rights reserved.
+# This file is part of "PodParser". Pod::Find is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Find;
+
+use vars qw($VERSION);
+$VERSION = 1.34;   ## Current version of this package
+require  5.005;   ## requires this Perl version or later
+use Carp;
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Find - find POD documents in directory trees
+
+=head1 SYNOPSIS
+
+  use Pod::Find qw(pod_find simplify_name);
+  my %pods = pod_find({ -verbose => 1, -inc => 1 });
+  foreach(keys %pods) {
+     print "found library POD `$pods{$_}' in $_\n";
+  }
+
+  print "podname=",simplify_name('a/b/c/mymodule.pod'),"\n";
+
+  $location = pod_where( { -inc => 1 }, "Pod::Find" );
+
+=head1 DESCRIPTION
+
+B<Pod::Find> provides a set of functions to locate POD files.  Note that
+no function is exported by default to avoid pollution of your namespace,
+so be sure to specify them in the B<use> statement if you need them:
+
+  use Pod::Find qw(pod_find);
+
+From this version on the typical SCM (software configuration management)
+files/directories like RCS, CVS, SCCS, .svn are ignored.
+
+=cut
+
+use strict;
+#use diagnostics;
+use Exporter;
+use File::Spec;
+use File::Find;
+use Cwd;
+
+use vars qw(@ISA @EXPORT_OK $VERSION);
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(&pod_find &simplify_name &pod_where &contains_pod);
+
+# package global variables
+my $SIMPLIFY_RX;
+
+=head2 C<pod_find( { %opts } , @directories )>
+
+The function B<pod_find> searches for POD documents in a given set of
+files and/or directories. It returns a hash with the file names as keys
+and the POD name as value. The POD name is derived from the file name
+and its position in the directory tree.
+
+E.g. when searching in F<$HOME/perl5lib>, the file
+F<$HOME/perl5lib/MyModule.pm> would get the POD name I<MyModule>,
+whereas F<$HOME/perl5lib/Myclass/Subclass.pm> would be
+I<Myclass::Subclass>. The name information can be used for POD
+translators.
+
+Only text files containing at least one valid POD command are found.
+
+A warning is printed if more than one POD file with the same POD name
+is found, e.g. F<CPAN.pm> in different directories. This usually
+indicates duplicate occurrences of modules in the I<@INC> search path.
+
+B<OPTIONS> The first argument for B<pod_find> may be a hash reference
+with options. The rest are either directories that are searched
+recursively or files.  The POD names of files are the plain basenames
+with any Perl-like extension (.pm, .pl, .pod) stripped.
+
+=over 4
+
+=item C<-verbose =E<gt> 1>
+
+Print progress information while scanning.
+
+=item C<-perl =E<gt> 1>
+
+Apply Perl-specific heuristics to find the correct PODs. This includes
+stripping Perl-like extensions, omitting subdirectories that are numeric
+but do I<not> match the current Perl interpreter's version id, suppressing
+F<site_perl> as a module hierarchy name etc.
+
+=item C<-script =E<gt> 1>
+
+Search for PODs in the current Perl interpreter's installation 
+B<scriptdir>. This is taken from the local L<Config|Config> module.
+
+=item C<-inc =E<gt> 1>
+
+Search for PODs in the current Perl interpreter's I<@INC> paths. This
+automatically considers paths specified in the C<PERL5LIB> environment
+as this is prepended to I<@INC> by the Perl interpreter itself.
+
+=back
+
+=cut
+
+# return a hash of the POD files found
+# first argument may be a hashref (options),
+# rest is a list of directories to search recursively
+sub pod_find
+{
+    my %opts;
+    if(ref $_[0]) {
+        %opts = %{shift()};
+    }
+
+    $opts{-verbose} ||= 0;
+    $opts{-perl}    ||= 0;
+
+    my (@search) = @_;
+
+    if($opts{-script}) {
+        require Config;
+        push(@search, $Config::Config{scriptdir})
+            if -d $Config::Config{scriptdir};
+        $opts{-perl} = 1;
+    }
+
+    if($opts{-inc}) {
+        if ($^O eq 'MacOS') {
+            # tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS
+            my @new_INC = @INC;
+            for (@new_INC) {
+                if ( $_ eq '.' ) {
+                    $_ = ':';
+                } elsif ( $_ =~ s|^((?:\.\./)+)|':' x (length($1)/3)|e ) {
+                    $_ = ':'. $_;
+                } else {
+                    $_ =~ s|^\./|:|;
+                }
+            }
+            push(@search, grep($_ ne File::Spec->curdir, @new_INC));
+        } else {
+            push(@search, grep($_ ne File::Spec->curdir, @INC));
+        }
+
+        $opts{-perl} = 1;
+    }
+
+    if($opts{-perl}) {
+        require Config;
+        # this code simplifies the POD name for Perl modules:
+        # * remove "site_perl"
+        # * remove e.g. "i586-linux" (from 'archname')
+        # * remove e.g. 5.00503
+        # * remove pod/ if followed by *.pod (e.g. in pod/perlfunc.pod)
+
+        # Mac OS:
+        # * remove ":?site_perl:"
+        # * remove :?pod: if followed by *.pod (e.g. in :pod:perlfunc.pod)
+
+        if ($^O eq 'MacOS') {
+            $SIMPLIFY_RX =
+              qq!^(?i:\:?site_perl\:|\:?pod\:(?=.*?\\.pod\\z))*!;
+        } else {
+            $SIMPLIFY_RX =
+              qq!^(?i:site(_perl)?/|\Q$Config::Config{archname}\E/|\\d+\\.\\d+([_.]?\\d+)?/|pod/(?=.*?\\.pod\\z))*!;
+        }
+    }
+
+    my %dirs_visited;
+    my %pods;
+    my %names;
+    my $pwd = cwd();
+
+    foreach my $try (@search) {
+        unless(File::Spec->file_name_is_absolute($try)) {
+            # make path absolute
+            $try = File::Spec->catfile($pwd,$try);
+        }
+        # simplify path
+        # on VMS canonpath will vmsify:[the.path], but File::Find::find
+        # wants /unixy/paths
+        $try = File::Spec->canonpath($try) if ($^O ne 'VMS');
+        $try = VMS::Filespec::unixify($try) if ($^O eq 'VMS');
+        my $name;
+        if(-f $try) {
+            if($name = _check_and_extract_name($try, $opts{-verbose})) {
+                _check_for_duplicates($try, $name, \%names, \%pods);
+            }
+            next;
+        }
+        my $root_rx = $^O eq 'MacOS' ? qq!^\Q$try\E! : qq!^\Q$try\E/!;
+        File::Find::find( sub {
+            my $item = $File::Find::name;
+            if(-d) {
+                if($item =~ m{/(?:RCS|CVS|SCCS|\.svn)$}) {
+                    $File::Find::prune = 1;
+                    return;
+                }
+                elsif($dirs_visited{$item}) {
+                    warn "Directory '$item' already seen, skipping.\n"
+                        if($opts{-verbose});
+                    $File::Find::prune = 1;
+                    return;
+                }
+                else {
+                    $dirs_visited{$item} = 1;
+                }
+                if($opts{-perl} && /^(\d+\.[\d_]+)\z/s && eval "$1" != $]) {
+                    $File::Find::prune = 1;
+                    warn "Perl $] version mismatch on $_, skipping.\n"
+                        if($opts{-verbose});
+                }
+                return;
+            }
+            if($name = _check_and_extract_name($item, $opts{-verbose}, $root_rx)) {
+                _check_for_duplicates($item, $name, \%names, \%pods);
+            }
+        }, $try); # end of File::Find::find
+    }
+    chdir $pwd;
+    %pods;
+}
+
+sub _check_for_duplicates {
+    my ($file, $name, $names_ref, $pods_ref) = @_;
+    if($$names_ref{$name}) {
+        warn "Duplicate POD found (shadowing?): $name ($file)\n";
+        warn "    Already seen in ",
+            join(' ', grep($$pods_ref{$_} eq $name, keys %$pods_ref)),"\n";
+    }
+    else {
+        $$names_ref{$name} = 1;
+    }
+    $$pods_ref{$file} = $name;
+}
+
+sub _check_and_extract_name {
+    my ($file, $verbose, $root_rx) = @_;
+
+    # check extension or executable flag
+    # this involves testing the .bat extension on Win32!
+    unless(-f $file && -T $file && ($file =~ /\.(pod|pm|plx?)\z/i || -x $file )) {
+      return undef;
+    }
+
+    return undef unless contains_pod($file,$verbose);
+
+    # strip non-significant path components
+    # TODO what happens on e.g. Win32?
+    my $name = $file;
+    if(defined $root_rx) {
+        $name =~ s!$root_rx!!s;
+        $name =~ s!$SIMPLIFY_RX!!os if(defined $SIMPLIFY_RX);
+    }
+    else {
+        if ($^O eq 'MacOS') {
+            $name =~ s/^.*://s;
+        } else {
+            $name =~ s:^.*/::s;
+        }
+    }
+    _simplify($name);
+    $name =~ s!/+!::!g; #/
+    if ($^O eq 'MacOS') {
+        $name =~ s!:+!::!g; # : -> ::
+    } else {
+        $name =~ s!/+!::!g; # / -> ::
+    }
+    $name;
+}
+
+=head2 C<simplify_name( $str )>
+
+The function B<simplify_name> is equivalent to B<basename>, but also
+strips Perl-like extensions (.pm, .pl, .pod) and extensions like
+F<.bat>, F<.cmd> on Win32 and OS/2, or F<.com> on VMS, respectively.
+
+=cut
+
+# basic simplification of the POD name:
+# basename & strip extension
+sub simplify_name {
+    my ($str) = @_;
+    # remove all path components
+    if ($^O eq 'MacOS') {
+        $str =~ s/^.*://s;
+    } else {
+        $str =~ s:^.*/::s;
+    }
+    _simplify($str);
+    $str;
+}
+
+# internal sub only
+sub _simplify {
+    # strip Perl's own extensions
+    $_[0] =~ s/\.(pod|pm|plx?)\z//i;
+    # strip meaningless extensions on Win32 and OS/2
+    $_[0] =~ s/\.(bat|exe|cmd)\z//i if($^O =~ /mswin|os2/i);
+    # strip meaningless extensions on VMS
+    $_[0] =~ s/\.(com)\z//i if($^O eq 'VMS');
+}
+
+# contribution from Tim Jenness <t.jenness@jach.hawaii.edu>
+
+=head2 C<pod_where( { %opts }, $pod )>
+
+Returns the location of a pod document given a search directory
+and a module (e.g. C<File::Find>) or script (e.g. C<perldoc>) name.
+
+Options:
+
+=over 4
+
+=item C<-inc =E<gt> 1>
+
+Search @INC for the pod and also the C<scriptdir> defined in the
+L<Config|Config> module.
+
+=item C<-dirs =E<gt> [ $dir1, $dir2, ... ]>
+
+Reference to an array of search directories. These are searched in order
+before looking in C<@INC> (if B<-inc>). Current directory is used if
+none are specified.
+
+=item C<-verbose =E<gt> 1>
+
+List directories as they are searched
+
+=back
+
+Returns the full path of the first occurrence to the file.
+Package names (eg 'A::B') are automatically converted to directory
+names in the selected directory. (eg on unix 'A::B' is converted to
+'A/B'). Additionally, '.pm', '.pl' and '.pod' are appended to the
+search automatically if required.
+
+A subdirectory F<pod/> is also checked if it exists in any of the given
+search directories. This ensures that e.g. L<perlfunc|perlfunc> is
+found.
+
+It is assumed that if a module name is supplied, that that name
+matches the file name. Pods are not opened to check for the 'NAME'
+entry.
+
+A check is made to make sure that the file that is found does 
+contain some pod documentation.
+
+=cut
+
+sub pod_where {
+
+  # default options
+  my %options = (
+         '-inc' => 0,
+         '-verbose' => 0,
+         '-dirs' => [ File::Spec->curdir ],
+        );
+
+  # Check for an options hash as first argument
+  if (defined $_[0] && ref($_[0]) eq 'HASH') {
+    my $opt = shift;
+
+    # Merge default options with supplied options
+    %options = (%options, %$opt);
+  }
+
+  # Check usage
+  carp 'Usage: pod_where({options}, $pod)' unless (scalar(@_));
+
+  # Read argument
+  my $pod = shift;
+
+  # Split on :: and then join the name together using File::Spec
+  my @parts = split (/::/, $pod);
+
+  # Get full directory list
+  my @search_dirs = @{ $options{'-dirs'} };
+
+  if ($options{'-inc'}) {
+
+    require Config;
+
+    # Add @INC
+    if ($^O eq 'MacOS' && $options{'-inc'}) {
+        # tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS
+        my @new_INC = @INC;
+        for (@new_INC) {
+            if ( $_ eq '.' ) {
+                $_ = ':';
+            } elsif ( $_ =~ s|^((?:\.\./)+)|':' x (length($1)/3)|e ) {
+                $_ = ':'. $_;
+            } else {
+                $_ =~ s|^\./|:|;
+            }
+        }
+        push (@search_dirs, @new_INC);
+    } elsif ($options{'-inc'}) {
+        push (@search_dirs, @INC);
+    }
+
+    # Add location of pod documentation for perl man pages (eg perlfunc)
+    # This is a pod directory in the private install tree
+    #my $perlpoddir = File::Spec->catdir($Config::Config{'installprivlib'},
+    #					'pod');
+    #push (@search_dirs, $perlpoddir)
+    #  if -d $perlpoddir;
+
+    # Add location of binaries such as pod2text
+    push (@search_dirs, $Config::Config{'scriptdir'})
+      if -d $Config::Config{'scriptdir'};
+  }
+
+  warn "Search path is: ".join(' ', @search_dirs)."\n"
+        if $options{'-verbose'};
+
+  # Loop over directories
+  Dir: foreach my $dir ( @search_dirs ) {
+
+    # Don't bother if can't find the directory
+    if (-d $dir) {
+      warn "Looking in directory $dir\n" 
+        if $options{'-verbose'};
+
+      # Now concatenate this directory with the pod we are searching for
+      my $fullname = File::Spec->catfile($dir, @parts);
+      warn "Filename is now $fullname\n"
+        if $options{'-verbose'};
+
+      # Loop over possible extensions
+      foreach my $ext ('', '.pod', '.pm', '.pl') {
+        my $fullext = $fullname . $ext;
+        if (-f $fullext && 
+         contains_pod($fullext, $options{'-verbose'}) ) {
+          warn "FOUND: $fullext\n" if $options{'-verbose'};
+          return $fullext;
+        }
+      }
+    } else {
+      warn "Directory $dir does not exist\n"
+        if $options{'-verbose'};
+      next Dir;
+    }
+    # for some strange reason the path on MacOS/darwin/cygwin is
+    # 'pods' not 'pod'
+    # this could be the case also for other systems that
+    # have a case-tolerant file system, but File::Spec
+    # does not recognize 'darwin' yet. And cygwin also has "pods",
+    # but is not case tolerant. Oh well...
+    if((File::Spec->case_tolerant || $^O =~ /macos|darwin|cygwin/i)
+     && -d File::Spec->catdir($dir,'pods')) {
+      $dir = File::Spec->catdir($dir,'pods');
+      redo Dir;
+    }
+    if(-d File::Spec->catdir($dir,'pod')) {
+      $dir = File::Spec->catdir($dir,'pod');
+      redo Dir;
+    }
+  }
+  # No match;
+  return undef;
+}
+
+=head2 C<contains_pod( $file , $verbose )>
+
+Returns true if the supplied filename (not POD module) contains some pod
+information.
+
+=cut
+
+sub contains_pod {
+  my $file = shift;
+  my $verbose = 0;
+  $verbose = shift if @_;
+
+  # check for one line of POD
+  unless(open(POD,"<$file")) {
+    warn "Error: $file is unreadable: $!\n";
+    return undef;
+  }
+  
+  local $/ = undef;
+  my $pod = <POD>;
+  close(POD) || die "Error closing $file: $!\n";
+  unless($pod =~ /^=(head\d|pod|over|item)\b/m) {
+    warn "No POD in $file, skipping.\n"
+      if($verbose);
+    return 0;
+  }
+
+  return 1;
+}
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Marek Rouchal E<lt>marekr@cpan.orgE<gt>,
+heavily borrowing code from Nick Ing-Simmons' PodToHtml.
+
+Tim Jenness E<lt>t.jenness@jach.hawaii.eduE<gt> provided
+C<pod_where> and C<contains_pod>.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<Pod::Checker>, L<perldoc>
+
+=cut
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Functions.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Functions.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Functions.pm	(revision 14489)
@@ -0,0 +1,376 @@
+package Pod::Functions;
+use strict;
+
+=head1 NAME
+
+Pod::Functions - Group Perl's functions a la perlfunc.pod
+
+=head1 SYNOPSIS
+
+    use Pod::Functions;
+    
+    my @misc_ops = @{ $Kinds{ 'Misc' } };
+    my $misc_dsc = $Type_Description{ 'Misc' };
+
+or
+
+    perl /path/to/lib/Pod/Functions.pm
+
+This will print a grouped list of Perl's functions, like the 
+L<perlfunc/"Perl Functions by Category"> section.
+
+=head1 DESCRIPTION
+
+It exports the following variables:
+
+=over 4
+
+=item %Kinds
+
+This holds a hash-of-lists. Each list contains the functions in the category
+the key denotes.
+
+=item %Type
+
+In this hash each key represents a function and the value is the category.
+The category can be a comma separated list.
+
+=item %Flavor
+
+In this hash each key represents a function and the value is a short 
+description of that function.
+
+=item %Type_Description
+
+In this hash each key represents a category of functions and the value is 
+a short description of that category.
+
+=item @Type_Order
+
+This list of categories is used to produce the same order as the
+L<perlfunc/"Perl Functions by Category"> section.
+
+=back
+
+=head1 CHANGES
+
+1.02 20020813 <abe@ztreet.demon.nl>
+    de-typo in the SYNOPSIS section (thanks Mike Castle for noticing)
+
+1.01 20011229 <abe@ztreet.demon.nl>
+    fixed some bugs that slipped in after 5.6.1
+    added the pod
+    finished making it strict safe
+
+1.00 ??
+    first numbered version
+
+=cut
+
+our $VERSION = '1.03';
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+our @EXPORT = qw(%Kinds %Type %Flavor %Type_Description @Type_Order);
+
+our(%Kinds, %Type, %Flavor);
+
+our %Type_Description = (
+    'ARRAY'	=> 'Functions for real @ARRAYs',
+    'Binary'	=> 'Functions for fixed length data or records',
+    'File'	=> 'Functions for filehandles, files, or directories',
+    'Flow'	=> 'Keywords related to control flow of your perl program',
+    'HASH'	=> 'Functions for real %HASHes',
+    'I/O'	=> 'Input and output functions',
+    'LIST'	=> 'Functions for list data',
+    'Math'	=> 'Numeric functions',
+    'Misc'	=> 'Miscellaneous functions',
+    'Modules'	=> 'Keywords related to perl modules',
+    'Network'	=> 'Fetching network info',
+    'Objects'	=> 'Keywords related to classes and object-orientedness',
+    'Process'	=> 'Functions for processes and process groups',
+    'Regexp'	=> 'Regular expressions and pattern matching',
+    'Socket'	=> 'Low-level socket functions',
+    'String'	=> 'Functions for SCALARs or strings',
+    'SysV'	=> 'System V interprocess communication functions',
+    'Time'	=> 'Time-related functions',
+    'User'	=> 'Fetching user and group info',
+    'Namespace'	=> 'Keywords altering or affecting scoping of identifiers',
+);
+
+our @Type_Order = qw{
+    String
+    Regexp
+    Math
+    ARRAY
+    LIST
+    HASH
+    I/O
+    Binary
+    File
+    Flow
+    Namespace
+    Misc
+    Process
+    Modules
+    Objects
+    Socket
+    SysV
+    User
+    Network
+    Time
+};
+
+while (<DATA>) {
+    chomp;
+    s/#.*//;
+    next unless $_;
+    my($name, $type, $text) = split " ", $_, 3;
+    $Type{$name} = $type;
+    $Flavor{$name} = $text;
+    for my $t ( split /[,\s]+/, $type ) {
+        push @{$Kinds{$t}}, $name;
+    }
+}
+
+close DATA;
+
+my( $typedesc, $list );
+unless (caller) { 
+    foreach my $type ( @Type_Order ) {
+	$list = join(", ", sort @{$Kinds{$type}});
+	$typedesc = $Type_Description{$type} . ":";
+	write;
+    } 
+}
+
+format = 
+
+^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+    $typedesc 
+~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+    $typedesc 
+ ~~  ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+	$list
+.
+
+1;
+
+__DATA__
+-X	File	a file test (-r, -x, etc)
+abs	Math	absolute value function
+accept	Socket	accept an incoming socket connect
+alarm	Process	schedule a SIGALRM 
+atan2	Math	arctangent of Y/X in the range -PI to PI
+bind	Socket	binds an address to a socket
+binmode	I/O	prepare binary files for I/O
+bless	Objects	create an object 
+caller	Flow,Namespace	get context of the current subroutine call
+chdir	File	change your current working directory
+chmod	File	changes the permissions on a list of files
+chomp	String 	remove a trailing record separator from a string
+chop	String 	remove the last character from a string
+chown	File	change the owership on a list of files
+chr	String 	get character this number represents
+chroot	File	make directory new root for path lookups
+close	I/O	close file (or pipe or socket) handle
+closedir	I/O	close directory handle
+connect	Socket	connect to a remote socket
+continue	Flow	optional trailing block in a while or foreach 
+cos	Math	cosine function
+crypt	String	one-way passwd-style encryption
+dbmclose	Objects,I/O	breaks binding on a tied dbm file
+dbmopen	Objects,I/O	create binding on a tied dbm file
+defined	Misc	test whether a value, variable, or function is defined
+delete	HASH	deletes a value from a hash
+die	I/O,Flow	raise an exception or bail out
+do	Flow,Modules	turn a BLOCK into a TERM
+dump	Misc,Flow	create an immediate core dump
+each	HASH	retrieve the next key/value pair from a hash
+endgrent	User	be done using group file
+endhostent	User	be done using hosts file
+endnetent	User	be done using networks file
+endprotoent	Network	be done using protocols file
+endpwent	User	be done using passwd file
+endservent	Network	be done using services file
+eof	I/O	test a filehandle for its end
+eval	Flow,Misc	catch exceptions or compile and run code
+exec	Process	abandon this program to run another
+exists	HASH	test whether a hash key is present
+exit	Flow	terminate this program
+exp	Math	raise I<e> to a power
+fcntl	File	file control system call
+fileno	I/O	return file descriptor from filehandle
+flock	I/O	lock an entire file with an advisory lock
+fork	Process	create a new process just like this one
+format	I/O	declare a picture format with use by the write() function
+formline	Misc	internal function used for formats
+getc	I/O	get	the next character from the filehandle
+getgrent	User	get next group record 
+getgrgid	User	get group record given group user ID
+getgrnam	User	get group record given group name
+gethostbyaddr	Network	get host record given its address
+gethostbyname	Network	get host record given name
+gethostent	Network	get next hosts record 
+getlogin	User	return who logged in at this tty
+getnetbyaddr	Network	get network record given its address
+getnetbyname	Network	get networks record given name
+getnetent	Network	get next networks record 
+getpeername	Socket	find the other end of a socket connection
+getpgrp	Process	get process group
+getppid	Process	get parent process ID
+getpriority	Process	get current nice value
+getprotobyname	Network	get protocol record given name
+getprotobynumber	Network	get protocol record numeric protocol
+getprotoent	Network	get next protocols record
+getpwent	User	get next passwd record
+getpwnam	User	get passwd record given user login name
+getpwuid	User	get passwd record given user ID
+getservbyname	Network	get services record given its name
+getservbyport	Network	get services record given numeric port
+getservent	Network	get next services record 
+getsockname	Socket	retrieve the sockaddr for a given socket
+getsockopt	Socket	get socket options on a given socket
+glob	File		expand filenames using wildcards
+gmtime	Time	convert UNIX time into record or string using Greenwich time
+goto	Flow	create spaghetti code
+grep	LIST	locate elements in a list test true against a given criterion
+hex	Math,String	convert a string to a hexadecimal number
+import	Modules,Namespace	patch a module's namespace into your own
+index	String	find a substring within a string
+int	Math	get the integer portion of a number
+ioctl	File	system-dependent device control system call
+join	LIST	join a list into a string using a separator
+keys	HASH	retrieve list of indices from a hash
+kill	Process	send a signal to a process or process group
+last	Flow	exit a block prematurely
+lc	String	return lower-case version of a string
+lcfirst	String	return a string with just the next letter in lower case
+length	String	return the number of bytes in a string
+link	File	create a hard link in the filesytem
+listen	Socket	register your socket as a server 
+local	Misc,Namespace	create a temporary value for a global variable (dynamic scoping)
+localtime	Time	convert UNIX time into record or string using local time
+lock	Threads	get a thread lock on a variable, subroutine, or method
+log	Math	retrieve the natural logarithm for a number
+lstat	File	stat a symbolic link
+m//	Regexp	match a string with a regular expression pattern
+map	LIST	apply a change to a list to get back a new list with the changes
+mkdir	File	create a directory
+msgctl	SysV	SysV IPC message control operations
+msgget	SysV	get SysV IPC message queue
+msgrcv	SysV	receive a SysV IPC message from a message queue
+msgsnd	SysV	send a SysV IPC message to a message queue
+my	Misc,Namespace	declare and assign a local variable (lexical scoping)
+next	Flow	iterate a block prematurely
+no	Modules	unimport some module symbols or semantics at compile time
+package	Modules,Objects,Namespace	declare a separate global namespace
+prototype	Flow,Misc	get the prototype (if any) of a subroutine
+oct	String,Math	convert a string to an octal number
+open	File	open a file, pipe, or descriptor
+opendir	File	open a directory
+ord	String	find a character's numeric representation
+our	Misc,Namespace	declare and assign a package variable (lexical scoping)
+pack	Binary,String	convert a list into a binary representation
+pipe	Process	open a pair of connected filehandles
+pop	ARRAY	remove the last element from an array and return it
+pos	Regexp	find or set the offset for the last/next m//g search
+print	I/O	output a list to a filehandle
+printf	I/O  	output a formatted list to a filehandle
+push	ARRAY	append one or more elements to an array
+q/STRING/	String	singly quote a string
+qq/STRING/	String	doubly quote a string
+quotemeta	Regexp	quote regular expression magic characters
+qw/STRING/	LIST	quote a list of words
+qx/STRING/	Process	backquote quote a string
+qr/STRING/	Regexp	Compile pattern 
+rand	Math	retrieve the next pseudorandom number 
+read	I/O,Binary	fixed-length buffered input from a filehandle
+readdir	I/O	get a directory from a directory handle
+readline	I/O	fetch a record from a file
+readlink	File	determine where a symbolic link is pointing
+readpipe	Process	execute a system command and collect standard output
+recv	Socket	receive a message over a Socket
+redo	Flow	start this loop iteration over again
+ref	Objects	find out the type of thing being referenced
+rename	File	change a filename
+require	Modules	load in external functions from a library at runtime
+reset	Misc	clear all variables of a given name
+return	Flow	get out of a function early
+reverse	String,LIST	flip a string or a list
+rewinddir	I/O	reset directory handle
+rindex	String	right-to-left substring search
+rmdir	File	remove a directory
+s///	Regexp	replace a pattern with a string
+scalar	Misc	force a scalar context
+seek	I/O	reposition file pointer for random-access I/O
+seekdir	I/O	reposition directory pointer 
+select	I/O	reset default output or do I/O multiplexing
+semctl	SysV	SysV semaphore control operations
+semget	SysV	get set of SysV semaphores
+semop	SysV	SysV semaphore operations
+send	Socket	send a message over a socket
+setgrent	User	prepare group file for use
+sethostent	Network	prepare hosts file for use
+setnetent	Network	prepare networks file for use
+setpgrp	Process	set the process group of a process
+setpriority	Process	set a process's nice value
+setprotoent	Network	prepare protocols file for use
+setpwent	User	prepare passwd file for use
+setservent	Network	prepare services file for use
+setsockopt	Socket	set some socket options
+shift	ARRAY	remove the first element of an array, and return it
+shmctl	SysV	SysV shared memory operations
+shmget	SysV	get SysV shared memory segment identifier
+shmread	SysV	read SysV shared memory 
+shmwrite	SysV	write SysV shared memory 
+shutdown	Socket	close down just half of a socket connection
+sin	Math	return the sine of a number
+sleep	Process	block for some number of seconds
+socket	Socket	create a socket
+socketpair	Socket	create a pair of sockets
+sort	LIST	sort a list of values 
+splice	ARRAY	add or remove elements anywhere in an array
+split	Regexp	split up a string using a regexp delimiter
+sprintf	String	formatted print into a string	
+sqrt	Math	square root function
+srand	Math	seed the random number generator
+stat	File	get a file's status information
+study	Regexp	optimize input data for repeated searches
+sub	Flow	declare a subroutine, possibly anonymously
+substr	String	get or alter a portion of a stirng
+symlink	File	create a symbolic link to a file
+syscall	I/O,Binary	execute an arbitrary system call
+sysopen	File	open a file, pipe, or descriptor
+sysread	I/O,Binary	fixed-length unbuffered input from a filehandle
+sysseek	I/O,Binary	position I/O pointer on handle used with sysread and syswrite
+system	Process	run a separate program 
+syswrite	I/O,Binary	fixed-length unbuffered output to a filehandle
+tell	I/O	get current seekpointer on a filehandle
+telldir	I/O	get current seekpointer on a directory handle
+tie	Objects	bind a variable to an object class 
+tied	Objects	get a reference to the object underlying a tied variable
+time	Time	return number of seconds since 1970
+times	Process,Time	return elapsed time for self and child processes
+tr///	String	transliterate a string
+truncate	I/O	shorten a file
+uc	String	return upper-case version of a string
+ucfirst	String	return a string with just the next letter in upper case
+umask	File	set file creation mode mask
+undef	Misc	remove a variable or function definition
+unlink	File	remove one link to a file
+unpack	Binary,LIST	convert binary structure into normal perl variables
+unshift	ARRAY	prepend more elements to the beginning of a list
+untie	Objects	break a tie binding to a variable
+use	Modules,Namespace	load a module and import its namespace
+use 	Objects	load in a module at compile time
+utime	File	set a file's last access and modify times
+values	HASH	return a list of the values in a hash
+vec	Binary	test or set particular bits in a string
+wait	Process	wait for any child process to die
+waitpid	Process	wait for  a particular child process to die
+wantarray	Misc,Flow	get void vs scalar vs list context of current subroutine call
+warn	I/O	print debugging info
+write	I/O	print a picture record
+y///	String	transliterate a string
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Html.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Html.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Html.pm	(revision 14489)
@@ -0,0 +1,2112 @@
+package Pod::Html;
+use strict;
+require Exporter;
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+$VERSION = 1.0504;
+@ISA = qw(Exporter);
+@EXPORT = qw(pod2html htmlify);
+@EXPORT_OK = qw(anchorify);
+
+use Carp;
+use Config;
+use Cwd;
+use File::Spec;
+use File::Spec::Unix;
+use Getopt::Long;
+
+use locale;	# make \w work right in non-ASCII lands
+
+=head1 NAME
+
+Pod::Html - module to convert pod files to HTML
+
+=head1 SYNOPSIS
+
+    use Pod::Html;
+    pod2html([options]);
+
+=head1 DESCRIPTION
+
+Converts files from pod format (see L<perlpod>) to HTML format.  It
+can automatically generate indexes and cross-references, and it keeps
+a cache of things it knows how to cross-reference.
+
+=head1 ARGUMENTS
+
+Pod::Html takes the following arguments:
+
+=over 4
+
+=item backlink
+
+    --backlink="Back to Top"
+
+Adds "Back to Top" links in front of every C<head1> heading (except for
+the first).  By default, no backlinks are generated.
+
+=item cachedir
+
+    --cachedir=name
+
+Creates the item and directory caches in the given directory.
+
+=item css
+
+    --css=stylesheet
+
+Specify the URL of a cascading style sheet.  Also disables all HTML/CSS
+C<style> attributes that are output by default (to avoid conflicts).
+
+=item flush
+
+    --flush
+
+Flushes the item and directory caches.
+
+=item header
+
+    --header
+    --noheader
+
+Creates header and footer blocks containing the text of the C<NAME>
+section.  By default, no headers are generated.
+
+=item help
+
+    --help
+
+Displays the usage message.
+
+=item hiddendirs
+
+    --hiddendirs
+    --nohiddendirs
+
+Include hidden directories in the search for POD's in podpath if recurse
+is set.
+The default is not to traverse any directory whose name begins with C<.>.
+See L</"podpath"> and L</"recurse">.
+
+[This option is for backward compatibility only.
+It's hard to imagine that one would usefully create a module with a
+name component beginning with C<.>.]
+
+=item htmldir
+
+    --htmldir=name
+
+Sets the directory in which the resulting HTML file is placed.  This
+is used to generate relative links to other files. Not passing this
+causes all links to be absolute, since this is the value that tells
+Pod::Html the root of the documentation tree.
+
+=item htmlroot
+
+    --htmlroot=name
+
+Sets the base URL for the HTML files.  When cross-references are made,
+the HTML root is prepended to the URL.
+
+=item index
+
+    --index
+    --noindex
+
+Generate an index at the top of the HTML file.  This is the default
+behaviour.
+
+=item infile
+
+    --infile=name
+
+Specify the pod file to convert.  Input is taken from STDIN if no
+infile is specified.
+
+=item libpods
+
+    --libpods=name:...:name
+
+List of page names (eg, "perlfunc") which contain linkable C<=item>s.
+
+=item netscape
+
+    --netscape
+    --nonetscape
+
+B<Deprecated>, has no effect. For backwards compatibility only.
+
+=item outfile
+
+    --outfile=name
+
+Specify the HTML file to create.  Output goes to STDOUT if no outfile
+is specified.
+
+=item podpath
+
+    --podpath=name:...:name
+
+Specify which subdirectories of the podroot contain pod files whose
+HTML converted forms can be linked to in cross references.
+
+=item podroot
+
+    --podroot=name
+
+Specify the base directory for finding library pods.
+
+=item quiet
+
+    --quiet
+    --noquiet
+
+Don't display I<mostly harmless> warning messages.  These messages
+will be displayed by default.  But this is not the same as C<verbose>
+mode.
+
+=item recurse
+
+    --recurse
+    --norecurse
+
+Recurse into subdirectories specified in podpath (default behaviour).
+
+=item title
+
+    --title=title
+
+Specify the title of the resulting HTML file.
+
+=item verbose
+
+    --verbose
+    --noverbose
+
+Display progress messages.  By default, they won't be displayed.
+
+=back
+
+=head1 EXAMPLE
+
+    pod2html("pod2html",
+	     "--podpath=lib:ext:pod:vms",
+	     "--podroot=/usr/src/perl",
+	     "--htmlroot=/perl/nmanual",
+	     "--libpods=perlfunc:perlguts:perlvar:perlrun:perlop",
+	     "--recurse",
+	     "--infile=foo.pod",
+	     "--outfile=/perl/nmanual/foo.html");
+
+=head1 ENVIRONMENT
+
+Uses C<$Config{pod2html}> to setup default options.
+
+=head1 AUTHOR
+
+Tom Christiansen, E<lt>tchrist@perl.comE<gt>.
+
+=head1 SEE ALSO
+
+L<perlpod>
+
+=head1 COPYRIGHT
+
+This program is distributed under the Artistic License.
+
+=cut
+
+
+my($Cachedir);
+my($Dircache, $Itemcache);
+my @Begin_Stack;
+my @Libpods;
+my($Htmlroot, $Htmldir, $Htmlfile, $Htmlfileurl);
+my($Podfile, @Podpath, $Podroot);
+my $Css;
+
+my $Recurse;
+my $Quiet;
+my $HiddenDirs;
+my $Verbose;
+my $Doindex;
+
+my $Backlink;
+my($Listlevel, @Listend);
+my $After_Lpar;
+use vars qw($Ignore);  # need to localize it later.
+
+my(%Items_Named, @Items_Seen);
+my($Title, $Header);
+
+my $Top;
+my $Paragraph;
+
+my %Sections;
+
+# Caches
+my %Pages = ();			# associative array used to find the location
+				#   of pages referenced by L<> links.
+my %Items = ();			# associative array used to find the location
+				#   of =item directives referenced by C<> links
+
+my %Local_Items;
+my $Is83;
+my $PTQuote;
+
+my $Curdir = File::Spec->curdir;
+
+init_globals();
+
+sub init_globals {
+    $Cachedir = ".";		# The directory to which item and directory
+				# caches will be written.
+
+    $Dircache = "pod2htmd.tmp";
+    $Itemcache = "pod2htmi.tmp";
+
+    @Begin_Stack = ();		# begin/end stack
+
+    @Libpods = ();	    	# files to search for links from C<> directives
+    $Htmlroot = "/";	    	# http-server base directory from which all
+				#   relative paths in $podpath stem.
+    $Htmldir = "";	    	# The directory to which the html pages
+				# will (eventually) be written.
+    $Htmlfile = "";		# write to stdout by default
+    $Htmlfileurl = "" ;		# The url that other files would use to
+				# refer to this file.  This is only used
+				# to make relative urls that point to
+				# other files.
+
+    $Podfile = "";		# read from stdin by default
+    @Podpath = ();		# list of directories containing library pods.
+    $Podroot = $Curdir;	        # filesystem base directory from which all
+				#   relative paths in $podpath stem.
+    $Css = '';                  # Cascading style sheet
+    $Recurse = 1;		# recurse on subdirectories in $podpath.
+    $Quiet = 0;		        # not quiet by default
+    $Verbose = 0;		# not verbose by default
+    $Doindex = 1;   	    	# non-zero if we should generate an index
+    $Backlink = '';		# text for "back to top" links
+    $Listlevel = 0;		# current list depth
+    @Listend = ();		# the text to use to end the list.
+    $After_Lpar = 0;            # set to true after a par in an =item
+    $Ignore = 1;		# whether or not to format text.  we don't
+				#   format text until we hit our first pod
+				#   directive.
+
+    @Items_Seen = ();	        # for multiples of the same item in perlfunc
+    %Items_Named = ();
+    $Header = 0;		# produce block header/footer
+    $Title = '';		# title to give the pod(s)
+    $Top = 1;			# true if we are at the top of the doc.  used
+				#   to prevent the first <hr /> directive.
+    $Paragraph = '';		# which paragraph we're processing (used
+				#   for error messages)
+    $PTQuote = 0;               # status of double-quote conversion
+    %Sections = ();		# sections within this page
+
+    %Local_Items = ();
+    $Is83 = $^O eq 'dos';       # Is it an 8.3 filesystem?
+}
+
+#
+# clean_data: global clean-up of pod data
+#
+sub clean_data($){
+    my( $dataref ) = @_;
+    for my $i ( 0..$#{$dataref} ) {
+	${$dataref}[$i] =~ s/\s+\Z//;
+
+        # have a look for all-space lines
+      if( ${$dataref}[$i] =~ /^\s+$/m and $dataref->[$i] !~ /^\s/ ){
+	    my @chunks = split( /^\s+$/m, ${$dataref}[$i] );
+	    splice( @$dataref, $i, 1, @chunks );
+	}
+    }
+}
+
+
+sub pod2html {
+    local(@ARGV) = @_;
+    local($/);
+    local $_;
+
+    init_globals();
+
+    $Is83 = 0 if (defined (&Dos::UseLFN) && Dos::UseLFN());
+
+    # cache of %Pages and %Items from last time we ran pod2html
+
+    #undef $opt_help if defined $opt_help;
+
+    # parse the command-line parameters
+    parse_command_line();
+
+    # escape the backlink argument (same goes for title but is done later...)
+    $Backlink = html_escape($Backlink) if defined $Backlink;
+
+    # set some variables to their default values if necessary
+    local *POD;
+    unless (@ARGV && $ARGV[0]) {
+	$Podfile  = "-" unless $Podfile;	# stdin
+	open(POD, "<$Podfile")
+		|| die "$0: cannot open $Podfile file for input: $!\n";
+    } else {
+	$Podfile = $ARGV[0];  # XXX: might be more filenames
+	*POD = *ARGV;
+    }
+    $Htmlfile = "-" unless $Htmlfile;	# stdout
+    $Htmlroot = "" if $Htmlroot eq "/";	# so we don't get a //
+    $Htmldir =~ s#/\z## ;               # so we don't get a //
+    if (  $Htmlroot eq ''
+       && defined( $Htmldir )
+       && $Htmldir ne ''
+       && substr( $Htmlfile, 0, length( $Htmldir ) ) eq $Htmldir
+       )
+    {
+	# Set the 'base' url for this file, so that we can use it
+	# as the location from which to calculate relative links
+	# to other files. If this is '', then absolute links will
+	# be used throughout.
+        $Htmlfileurl= "$Htmldir/" . substr( $Htmlfile, length( $Htmldir ) + 1);
+    }
+
+    # read the pod a paragraph at a time
+    warn "Scanning for sections in input file(s)\n" if $Verbose;
+    $/ = "";
+    my @poddata  = <POD>;
+    close(POD);
+
+    # be eol agnostic
+    for (@poddata) {
+	if (/\r/) {
+	    if (/\r\n/) {
+		@poddata = map { s/\r\n/\n/g;
+				 /\n\n/ ?
+				     map { "$_\n\n" } split /\n\n/ :
+				     $_ } @poddata;
+	    } else {
+		@poddata = map { s/\r/\n/g;
+				 /\n\n/ ?
+				     map { "$_\n\n" } split /\n\n/ :
+				     $_ } @poddata;
+	    }
+	    last;
+	}
+    }
+
+    clean_data( \@poddata );
+
+    # scan the pod for =head[1-6] directives and build an index
+    my $index = scan_headings(\%Sections, @poddata);
+
+    unless($index) {
+	warn "No headings in $Podfile\n" if $Verbose;
+    }
+
+    # open the output file
+    open(HTML, ">$Htmlfile")
+	    || die "$0: cannot open $Htmlfile file for output: $!\n";
+
+    # put a title in the HTML file if one wasn't specified
+    if ($Title eq '') {
+	TITLE_SEARCH: {
+ 	    for (my $i = 0; $i < @poddata; $i++) {
+		if ($poddata[$i] =~ /^=head1\s*NAME\b/m) {
+ 		    for my $para ( @poddata[$i, $i+1] ) {
+			last TITLE_SEARCH
+			    if ($Title) = $para =~ /(\S+\s+-+.*\S)/s;
+		    }
+		}
+
+	    }
+	}
+    }
+    if (!$Title and $Podfile =~ /\.pod\z/) {
+	# probably a split pod so take first =head[12] as title
+ 	for (my $i = 0; $i < @poddata; $i++) {
+	    last if ($Title) = $poddata[$i] =~ /^=head[12]\s*(.*)/;
+	}
+	warn "adopted '$Title' as title for $Podfile\n"
+	    if $Verbose and $Title;
+    }
+    if ($Title) {
+	$Title =~ s/\s*\(.*\)//;
+    } else {
+	warn "$0: no title for $Podfile.\n" unless $Quiet;
+	$Podfile =~ /^(.*)(\.[^.\/]+)?\z/s;
+	$Title = ($Podfile eq "-" ? 'No Title' : $1);
+	warn "using $Title" if $Verbose;
+    }
+    $Title = html_escape($Title);
+
+    my $csslink = '';
+    my $bodystyle = ' style="background-color: white"';
+    my $tdstyle = ' style="background-color: #cccccc"';
+
+    if ($Css) {
+      $csslink = qq(\n<link rel="stylesheet" href="$Css" type="text/css" />);
+      $csslink =~ s,\\,/,g;
+      $csslink =~ s,(/.):,$1|,;
+      $bodystyle = '';
+      $tdstyle = '';
+    }
+
+      my $block = $Header ? <<END_OF_BLOCK : '';
+<table border="0" width="100%" cellspacing="0" cellpadding="3">
+<tr><td class="block"$tdstyle valign="middle">
+<big><strong><span class="block">&nbsp;$Title</span></strong></big>
+</td></tr>
+</table>
+END_OF_BLOCK
+
+    print HTML <<END_OF_HEAD;
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>$Title</title>$csslink
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:$Config{perladmin}" />
+</head>
+
+<body$bodystyle>
+$block
+END_OF_HEAD
+
+    # load/reload/validate/cache %Pages and %Items
+    get_cache($Dircache, $Itemcache, \@Podpath, $Podroot, $Recurse);
+
+    # scan the pod for =item directives
+    scan_items( \%Local_Items, "", @poddata);
+
+    # put an index at the top of the file.  note, if $Doindex is 0 we
+    # still generate an index, but surround it with an html comment.
+    # that way some other program can extract it if desired.
+    $index =~ s/--+/-/g;
+    print HTML "<p><a name=\"__index__\"></a></p>\n";
+    print HTML "<!-- INDEX BEGIN -->\n";
+    print HTML "<!--\n" unless $Doindex;
+    print HTML $index;
+    print HTML "-->\n" unless $Doindex;
+    print HTML "<!-- INDEX END -->\n\n";
+    print HTML "<hr />\n" if $Doindex and $index;
+
+    # now convert this file
+    my $after_item;             # set to true after an =item
+    my $need_dd = 0;
+    warn "Converting input file $Podfile\n" if $Verbose;
+    foreach my $i (0..$#poddata){
+        $PTQuote = 0; # status of quote conversion
+
+	$_ = $poddata[$i];
+	$Paragraph = $i+1;
+	if (/^(=.*)/s) {	# is it a pod directive?
+	    $Ignore = 0;
+	    $after_item = 0;
+	    $need_dd = 0;
+	    $_ = $1;
+	    if (/^=begin\s+(\S+)\s*(.*)/si) {# =begin
+		process_begin($1, $2);
+	    } elsif (/^=end\s+(\S+)\s*(.*)/si) {# =end
+		process_end($1, $2);
+	    } elsif (/^=cut/) {			# =cut
+		process_cut();
+	    } elsif (/^=pod/) {			# =pod
+		process_pod();
+	    } else {
+		next if @Begin_Stack && $Begin_Stack[-1] ne 'html';
+
+		if (/^=(head[1-6])\s+(.*\S)/s) {	# =head[1-6] heading
+		    process_head( $1, $2, $Doindex && $index );
+		} elsif (/^=item\s*(.*\S)?/sm) {	# =item text
+		    $need_dd = process_item( $1 );
+		    $after_item = 1;
+		} elsif (/^=over\s*(.*)/) {		# =over N
+		    process_over();
+		} elsif (/^=back/) {		# =back
+		    process_back($need_dd);
+		} elsif (/^=for\s+(\S+)\s*(.*)/si) {# =for
+		    process_for($1,$2);
+		} else {
+		    /^=(\S*)\s*/;
+		    warn "$0: $Podfile: unknown pod directive '$1' in "
+		       . "paragraph $Paragraph.  ignoring.\n" unless $Quiet;
+		}
+	    }
+	    $Top = 0;
+	}
+	else {
+	    next if $Ignore;
+	    next if @Begin_Stack && $Begin_Stack[-1] ne 'html';
+	    print HTML and next if @Begin_Stack && $Begin_Stack[-1] eq 'html';
+	    print HTML "<dd>\n" if $need_dd;
+	    my $text = $_;
+	    if( $text =~ /\A\s+/ ){
+		process_pre( \$text );
+	        print HTML "<pre>\n$text</pre>\n";
+
+	    } else {
+		process_text( \$text );
+
+		# experimental: check for a paragraph where all lines
+		# have some ...\t...\t...\n pattern
+		if( $text =~ /\t/ ){
+		    my @lines = split( "\n", $text );
+		    if( @lines > 1 ){
+			my $all = 2;
+			foreach my $line ( @lines ){
+			    if( $line =~ /\S/ && $line !~ /\t/ ){
+				$all--;
+				last if $all == 0;
+			    }
+			}
+			if( $all > 0 ){
+			    $text =~ s/\t+/<td>/g;
+			    $text =~ s/^/<tr><td>/gm;
+			    $text = '<table cellspacing="0" cellpadding="0">' .
+                                    $text . '</table>';
+			}
+		    }
+		}
+		## end of experimental
+
+		if( $after_item ){
+		    $After_Lpar = 1;
+		}
+		print HTML "<p>$text</p>\n";
+	    }
+	    print HTML "</dd>\n" if $need_dd;
+	    $after_item = 0;
+	}
+    }
+
+    # finish off any pending directives
+    finish_list();
+
+    # link to page index
+    print HTML "<p><a href=\"#__index__\"><small>$Backlink</small></a></p>\n"
+	if $Doindex and $index and $Backlink;
+
+    print HTML <<END_OF_TAIL;
+$block
+</body>
+
+</html>
+END_OF_TAIL
+
+    # close the html file
+    close(HTML);
+
+    warn "Finished\n" if $Verbose;
+}
+
+##############################################################################
+
+sub usage {
+    my $podfile = shift;
+    warn "$0: $podfile: @_\n" if @_;
+    die <<END_OF_USAGE;
+Usage:  $0 --help --htmlroot=<name> --infile=<name> --outfile=<name>
+           --podpath=<name>:...:<name> --podroot=<name>
+           --libpods=<name>:...:<name> --recurse --verbose --index
+           --netscape --norecurse --noindex --cachedir=<name>
+
+  --backlink     - set text for "back to top" links (default: none).
+  --cachedir     - directory for the item and directory cache files.
+  --css          - stylesheet URL
+  --flush        - flushes the item and directory caches.
+  --[no]header   - produce block header/footer (default is no headers).
+  --help         - prints this message.
+  --hiddendirs   - search hidden directories in podpath
+  --htmldir      - directory for resulting HTML files.
+  --htmlroot     - http-server base directory from which all relative paths
+                   in podpath stem (default is /).
+  --[no]index    - generate an index at the top of the resulting html
+                   (default behaviour).
+  --infile       - filename for the pod to convert (input taken from stdin
+                   by default).
+  --libpods      - colon-separated list of pages to search for =item pod
+                   directives in as targets of C<> and implicit links (empty
+                   by default).  note, these are not filenames, but rather
+                   page names like those that appear in L<> links.
+  --outfile      - filename for the resulting html file (output sent to
+                   stdout by default).
+  --podpath      - colon-separated list of directories containing library
+                   pods (empty by default).
+  --podroot      - filesystem base directory from which all relative paths
+                   in podpath stem (default is .).
+  --[no]quiet    - suppress some benign warning messages (default is off).
+  --[no]recurse  - recurse on those subdirectories listed in podpath
+                   (default behaviour).
+  --title        - title that will appear in resulting html file.
+  --[no]verbose  - self-explanatory (off by default).
+  --[no]netscape - deprecated, has no effect. for backwards compatibility only.
+
+END_OF_USAGE
+
+}
+
+sub parse_command_line {
+    my ($opt_backlink,$opt_cachedir,$opt_css,$opt_flush,$opt_header,$opt_help,
+	$opt_htmldir,$opt_htmlroot,$opt_index,$opt_infile,$opt_libpods,
+	$opt_netscape,$opt_outfile,$opt_podpath,$opt_podroot,$opt_quiet,
+	$opt_recurse,$opt_title,$opt_verbose,$opt_hiddendirs);
+
+    unshift @ARGV, split ' ', $Config{pod2html} if $Config{pod2html};
+    my $result = GetOptions(
+			    'backlink=s' => \$opt_backlink,
+			    'cachedir=s' => \$opt_cachedir,
+			    'css=s'      => \$opt_css,
+			    'flush'      => \$opt_flush,
+			    'header!'    => \$opt_header,
+			    'help'       => \$opt_help,
+			    'hiddendirs!'=> \$opt_hiddendirs,
+			    'htmldir=s'  => \$opt_htmldir,
+			    'htmlroot=s' => \$opt_htmlroot,
+			    'index!'     => \$opt_index,
+			    'infile=s'   => \$opt_infile,
+			    'libpods=s'  => \$opt_libpods,
+			    'netscape!'  => \$opt_netscape,
+			    'outfile=s'  => \$opt_outfile,
+			    'podpath=s'  => \$opt_podpath,
+			    'podroot=s'  => \$opt_podroot,
+			    'quiet!'     => \$opt_quiet,
+			    'recurse!'   => \$opt_recurse,
+			    'title=s'    => \$opt_title,
+			    'verbose!'   => \$opt_verbose,
+			   );
+    usage("-", "invalid parameters") if not $result;
+
+    usage("-") if defined $opt_help;	# see if the user asked for help
+    $opt_help = "";			# just to make -w shut-up.
+
+    @Podpath  = split(":", $opt_podpath) if defined $opt_podpath;
+    @Libpods  = split(":", $opt_libpods) if defined $opt_libpods;
+
+    $Backlink = $opt_backlink if defined $opt_backlink;
+    $Cachedir = $opt_cachedir if defined $opt_cachedir;
+    $Css      = $opt_css      if defined $opt_css;
+    $Header   = $opt_header   if defined $opt_header;
+    $Htmldir  = $opt_htmldir  if defined $opt_htmldir;
+    $Htmlroot = $opt_htmlroot if defined $opt_htmlroot;
+    $Doindex  = $opt_index    if defined $opt_index;
+    $Podfile  = $opt_infile   if defined $opt_infile;
+    $HiddenDirs = $opt_hiddendirs if defined $opt_hiddendirs;
+    $Htmlfile = $opt_outfile  if defined $opt_outfile;
+    $Podroot  = $opt_podroot  if defined $opt_podroot;
+    $Quiet    = $opt_quiet    if defined $opt_quiet;
+    $Recurse  = $opt_recurse  if defined $opt_recurse;
+    $Title    = $opt_title    if defined $opt_title;
+    $Verbose  = $opt_verbose  if defined $opt_verbose;
+
+    warn "Flushing item and directory caches\n"
+	if $opt_verbose && defined $opt_flush;
+    $Dircache = "$Cachedir/pod2htmd.tmp";
+    $Itemcache = "$Cachedir/pod2htmi.tmp";
+    if (defined $opt_flush) {
+	1 while unlink($Dircache, $Itemcache);
+    }
+}
+
+
+my $Saved_Cache_Key;
+
+sub get_cache {
+    my($dircache, $itemcache, $podpath, $podroot, $recurse) = @_;
+    my @cache_key_args = @_;
+
+    # A first-level cache:
+    # Don't bother reading the cache files if they still apply
+    # and haven't changed since we last read them.
+
+    my $this_cache_key = cache_key(@cache_key_args);
+
+    return if $Saved_Cache_Key and $this_cache_key eq $Saved_Cache_Key;
+
+    # load the cache of %Pages and %Items if possible.  $tests will be
+    # non-zero if successful.
+    my $tests = 0;
+    if (-f $dircache && -f $itemcache) {
+	warn "scanning for item cache\n" if $Verbose;
+	$tests = load_cache($dircache, $itemcache, $podpath, $podroot);
+    }
+
+    # if we didn't succeed in loading the cache then we must (re)build
+    #  %Pages and %Items.
+    if (!$tests) {
+	warn "scanning directories in pod-path\n" if $Verbose;
+	scan_podpath($podroot, $recurse, 0);
+    }
+    $Saved_Cache_Key = cache_key(@cache_key_args);
+}
+
+sub cache_key {
+    my($dircache, $itemcache, $podpath, $podroot, $recurse) = @_;
+    return join('!', $dircache, $itemcache, $recurse,
+	@$podpath, $podroot, stat($dircache), stat($itemcache));
+}
+
+#
+# load_cache - tries to find if the caches stored in $dircache and $itemcache
+#  are valid caches of %Pages and %Items.  if they are valid then it loads
+#  them and returns a non-zero value.
+#
+sub load_cache {
+    my($dircache, $itemcache, $podpath, $podroot) = @_;
+    my($tests);
+    local $_;
+
+    $tests = 0;
+
+    open(CACHE, "<$itemcache") ||
+	die "$0: error opening $itemcache for reading: $!\n";
+    $/ = "\n";
+
+    # is it the same podpath?
+    $_ = <CACHE>;
+    chomp($_);
+    $tests++ if (join(":", @$podpath) eq $_);
+
+    # is it the same podroot?
+    $_ = <CACHE>;
+    chomp($_);
+    $tests++ if ($podroot eq $_);
+
+    # load the cache if its good
+    if ($tests != 2) {
+	close(CACHE);
+	return 0;
+    }
+
+    warn "loading item cache\n" if $Verbose;
+    while (<CACHE>) {
+	/(.*?) (.*)$/;
+	$Items{$1} = $2;
+    }
+    close(CACHE);
+
+    warn "scanning for directory cache\n" if $Verbose;
+    open(CACHE, "<$dircache") ||
+	die "$0: error opening $dircache for reading: $!\n";
+    $/ = "\n";
+    $tests = 0;
+
+    # is it the same podpath?
+    $_ = <CACHE>;
+    chomp($_);
+    $tests++ if (join(":", @$podpath) eq $_);
+
+    # is it the same podroot?
+    $_ = <CACHE>;
+    chomp($_);
+    $tests++ if ($podroot eq $_);
+
+    # load the cache if its good
+    if ($tests != 2) {
+	close(CACHE);
+	return 0;
+    }
+
+    warn "loading directory cache\n" if $Verbose;
+    while (<CACHE>) {
+	/(.*?) (.*)$/;
+	$Pages{$1} = $2;
+    }
+
+    close(CACHE);
+
+    return 1;
+}
+
+#
+# scan_podpath - scans the directories specified in @podpath for directories,
+#  .pod files, and .pm files.  it also scans the pod files specified in
+#  @Libpods for =item directives.
+#
+sub scan_podpath {
+    my($podroot, $recurse, $append) = @_;
+    my($pwd, $dir);
+    my($libpod, $dirname, $pod, @files, @poddata);
+
+    unless($append) {
+	%Items = ();
+	%Pages = ();
+    }
+
+    # scan each directory listed in @Podpath
+    $pwd = getcwd();
+    chdir($podroot)
+	|| die "$0: error changing to directory $podroot: $!\n";
+    foreach $dir (@Podpath) {
+	scan_dir($dir, $recurse);
+    }
+
+    # scan the pods listed in @Libpods for =item directives
+    foreach $libpod (@Libpods) {
+	# if the page isn't defined then we won't know where to find it
+	# on the system.
+	next unless defined $Pages{$libpod} && $Pages{$libpod};
+
+	# if there is a directory then use the .pod and .pm files within it.
+	# NOTE: Only finds the first so-named directory in the tree.
+#	if ($Pages{$libpod} =~ /([^:]*[^(\.pod|\.pm)]):/) {
+	if ($Pages{$libpod} =~ /([^:]*(?<!\.pod)(?<!\.pm)):/) {
+	    #  find all the .pod and .pm files within the directory
+	    $dirname = $1;
+	    opendir(DIR, $dirname) ||
+		die "$0: error opening directory $dirname: $!\n";
+	    @files = grep(/(\.pod|\.pm)\z/ && ! -d $_, readdir(DIR));
+	    closedir(DIR);
+
+	    # scan each .pod and .pm file for =item directives
+	    foreach $pod (@files) {
+		open(POD, "<$dirname/$pod") ||
+		    die "$0: error opening $dirname/$pod for input: $!\n";
+		@poddata = <POD>;
+		close(POD);
+		clean_data( \@poddata );
+
+		scan_items( \%Items, "$dirname/$pod", @poddata);
+	    }
+
+	    # use the names of files as =item directives too.
+### Don't think this should be done this way - confuses issues.(WL)
+###	    foreach $pod (@files) {
+###		$pod =~ /^(.*)(\.pod|\.pm)$/;
+###		$Items{$1} = "$dirname/$1.html" if $1;
+###	    }
+	} elsif ($Pages{$libpod} =~ /([^:]*\.pod):/ ||
+		 $Pages{$libpod} =~ /([^:]*\.pm):/) {
+	    # scan the .pod or .pm file for =item directives
+	    $pod = $1;
+	    open(POD, "<$pod") ||
+		die "$0: error opening $pod for input: $!\n";
+	    @poddata = <POD>;
+	    close(POD);
+	    clean_data( \@poddata );
+
+	    scan_items( \%Items, "$pod", @poddata);
+	} else {
+	    warn "$0: shouldn't be here (line ".__LINE__."\n" unless $Quiet;
+	}
+    }
+    @poddata = ();	# clean-up a bit
+
+    chdir($pwd)
+	|| die "$0: error changing to directory $pwd: $!\n";
+
+    # cache the item list for later use
+    warn "caching items for later use\n" if $Verbose;
+    open(CACHE, ">$Itemcache") ||
+	die "$0: error open $Itemcache for writing: $!\n";
+
+    print CACHE join(":", @Podpath) . "\n$podroot\n";
+    foreach my $key (keys %Items) {
+	print CACHE "$key $Items{$key}\n";
+    }
+
+    close(CACHE);
+
+    # cache the directory list for later use
+    warn "caching directories for later use\n" if $Verbose;
+    open(CACHE, ">$Dircache") ||
+	die "$0: error open $Dircache for writing: $!\n";
+
+    print CACHE join(":", @Podpath) . "\n$podroot\n";
+    foreach my $key (keys %Pages) {
+	print CACHE "$key $Pages{$key}\n";
+    }
+
+    close(CACHE);
+}
+
+#
+# scan_dir - scans the directory specified in $dir for subdirectories, .pod
+#  files, and .pm files.  notes those that it finds.  this information will
+#  be used later in order to figure out where the pages specified in L<>
+#  links are on the filesystem.
+#
+sub scan_dir {
+    my($dir, $recurse) = @_;
+    my($t, @subdirs, @pods, $pod, $dirname, @dirs);
+    local $_;
+
+    @subdirs = ();
+    @pods = ();
+
+    opendir(DIR, $dir) ||
+	die "$0: error opening directory $dir: $!\n";
+    while (defined($_ = readdir(DIR))) {
+	if (-d "$dir/$_" && $_ ne "." && $_ ne ".."
+	    && ($HiddenDirs || !/^\./)
+	) {         # directory
+	    $Pages{$_}  = "" unless defined $Pages{$_};
+	    $Pages{$_} .= "$dir/$_:";
+	    push(@subdirs, $_);
+	} elsif (/\.pod\z/) {	    	    	    	    # .pod
+	    s/\.pod\z//;
+	    $Pages{$_}  = "" unless defined $Pages{$_};
+	    $Pages{$_} .= "$dir/$_.pod:";
+	    push(@pods, "$dir/$_.pod");
+	} elsif (/\.html\z/) { 	    	    	    	    # .html
+	    s/\.html\z//;
+	    $Pages{$_}  = "" unless defined $Pages{$_};
+	    $Pages{$_} .= "$dir/$_.pod:";
+	} elsif (/\.pm\z/) { 	    	    	    	    # .pm
+	    s/\.pm\z//;
+	    $Pages{$_}  = "" unless defined $Pages{$_};
+	    $Pages{$_} .= "$dir/$_.pm:";
+	    push(@pods, "$dir/$_.pm");
+	} elsif (-T "$dir/$_") {			    # script(?)
+	    local *F;
+	    if (open(F, "$dir/$_")) {
+		my $line;
+		while (defined($line = <F>)) {
+		    if ($line =~ /^=(?:pod|head1)/) {
+			$Pages{$_}  = "" unless defined $Pages{$_};
+			$Pages{$_} .= "$dir/$_.pod:";
+			last;
+		    }
+		}
+		close(F);
+	    }
+	}
+    }
+    closedir(DIR);
+
+    # recurse on the subdirectories if necessary
+    if ($recurse) {
+	foreach my $subdir (@subdirs) {
+	    scan_dir("$dir/$subdir", $recurse);
+	}
+    }
+}
+
+#
+# scan_headings - scan a pod file for head[1-6] tags, note the tags, and
+#  build an index.
+#
+sub scan_headings {
+    my($sections, @data) = @_;
+    my($tag, $which_head, $otitle, $listdepth, $index);
+
+    local $Ignore = 0;
+
+    $listdepth = 0;
+    $index = "";
+
+    # scan for =head directives, note their name, and build an index
+    #  pointing to each of them.
+    foreach my $line (@data) {
+      if ($line =~ /^=(head)([1-6])\s+(.*)/) {
+        ($tag, $which_head, $otitle) = ($1,$2,$3);
+
+        my $title = depod( $otitle );
+        my $name = anchorify( $title );
+        $$sections{$name} = 1;
+        $title = process_text( \$otitle );
+
+	    while ($which_head != $listdepth) {
+		if ($which_head > $listdepth) {
+		    $index .= "\n" . ("\t" x $listdepth) . "<ul>\n";
+		    $listdepth++;
+		} elsif ($which_head < $listdepth) {
+		    $listdepth--;
+		    $index .= "\n" . ("\t" x $listdepth) . "</ul>\n";
+		}
+	    }
+
+	    $index .= "\n" . ("\t" x $listdepth) . "<li>" .
+	              "<a href=\"#" . $name . "\">" .
+		      $title . "</a></li>";
+	}
+    }
+
+    # finish off the lists
+    while ($listdepth--) {
+	$index .= "\n" . ("\t" x $listdepth) . "</ul>\n";
+    }
+
+    # get rid of bogus lists
+    $index =~ s,\t*<ul>\s*</ul>\n,,g;
+
+    return $index;
+}
+
+#
+# scan_items - scans the pod specified by $pod for =item directives.  we
+#  will use this information later on in resolving C<> links.
+#
+sub scan_items {
+    my( $itemref, $pod, @poddata ) = @_;
+    my($i, $item);
+    local $_;
+
+    $pod =~ s/\.pod\z//;
+    $pod .= ".html" if $pod;
+
+    foreach $i (0..$#poddata) {
+	my $txt = depod( $poddata[$i] );
+
+	# figure out what kind of item it is.
+	# Build string for referencing this item.
+	if ( $txt =~ /\A=item\s+\*\s*(.*)\Z/s ) { # bullet
+	    next unless $1;
+	    $item = $1;
+        } elsif( $txt =~ /\A=item\s+(?>\d+\.?)\s*(.*)\Z/s ) { # numbered list
+	    $item = $1;
+	} elsif( $txt =~ /\A=item\s+(.*)\Z/s ) { # plain item
+	    $item = $1;
+	} else {
+	    next;
+	}
+	my $fid = fragment_id( $item );
+	$$itemref{$fid} = "$pod" if $fid;
+    }
+}
+
+#
+# process_head - convert a pod head[1-6] tag and convert it to HTML format.
+#
+sub process_head {
+    my($tag, $heading, $hasindex) = @_;
+
+    # figure out the level of the =head
+    $tag =~ /head([1-6])/;
+    my $level = $1;
+
+    if( $Listlevel ){
+	warn "$0: $Podfile: unterminated list at =head in paragraph $Paragraph.  ignoring.\n" unless $Quiet;
+        while( $Listlevel ){
+            process_back();
+        }
+    }
+
+    print HTML "<p>\n";
+    if( $level == 1 && ! $Top ){
+      print HTML "<a href=\"#__index__\"><small>$Backlink</small></a>\n"
+        if $hasindex and $Backlink;
+      print HTML "</p>\n<hr />\n"
+    } else {
+      print HTML "</p>\n";
+    }
+
+    my $name = anchorify( depod( $heading ) );
+    my $convert = process_text( \$heading );
+    print HTML "<h$level><a name=\"$name\">$convert</a></h$level>\n";
+}
+
+
+#
+# emit_item_tag - print an =item's text
+# Note: The global $EmittedItem is used for inhibiting self-references.
+#
+my $EmittedItem;
+
+sub emit_item_tag($$$){
+    my( $otext, $text, $compact ) = @_;
+    my $item = fragment_id( $text );
+
+    $EmittedItem = $item;
+    ### print STDERR "emit_item_tag=$item ($text)\n";
+
+    print HTML '<strong>';
+    if ($Items_Named{$item}++) {
+	print HTML process_text( \$otext );
+    } else {
+        my $name = 'item_' . $item;
+        $name = anchorify($name);
+	print HTML qq{<a name="$name">}, process_text( \$otext ), '</a>';
+    }
+    print HTML "</strong>\n";
+    undef( $EmittedItem );
+}
+
+sub emit_li {
+    my( $tag ) = @_;
+    if( $Items_Seen[$Listlevel]++ == 0 ){
+	push( @Listend, "</$tag>" );
+	print HTML "<$tag>\n";
+    }
+    my $emitted = $tag eq 'dl' ? 'dt' : 'li';
+    print HTML "<$emitted>";
+    return $emitted;
+}
+
+#
+# process_item - convert a pod item tag and convert it to HTML format.
+#
+sub process_item {
+    my( $otext ) = @_;
+    my $need_dd = 0; # set to 1 if we need a <dd></dd> after an item
+
+    # lots of documents start a list without doing an =over.  this is
+    # bad!  but, the proper thing to do seems to be to just assume
+    # they did do an =over.  so warn them once and then continue.
+    if( $Listlevel == 0 ){
+	warn "$0: $Podfile: unexpected =item directive in paragraph $Paragraph.  ignoring.\n" unless $Quiet;
+	process_over();
+    }
+
+    # formatting: insert a paragraph if preceding item has >1 paragraph
+    if( $After_Lpar ){
+	print HTML $need_dd ? "</dd>\n" : "</li>\n" if $After_Lpar;
+	$After_Lpar = 0;
+    }
+
+    # remove formatting instructions from the text
+    my $text = depod( $otext );
+
+    my $emitted; # the tag actually emitted, used for closing
+
+    # all the list variants:
+    if( $text =~ /\A\*/ ){ # bullet
+        $emitted = emit_li( 'ul' );
+        if ($text =~ /\A\*\s+(.+)\Z/s ) { # with additional text
+            my $tag = $1;
+            $otext =~ s/\A\*\s+//;
+            emit_item_tag( $otext, $tag, 1 );
+        }
+
+    } elsif( $text =~ /\A\d+/ ){ # numbered list
+        $emitted = emit_li( 'ol' );
+        if ($text =~ /\A(?>\d+\.?)\s*(.+)\Z/s ) { # with additional text
+            my $tag = $1;
+            $otext =~ s/\A\d+\.?\s*//;
+            emit_item_tag( $otext, $tag, 1 );
+        }
+
+    } else {			# definition list
+        $emitted = emit_li( 'dl' );
+        if ($text =~ /\A(.+)\Z/s ){ # should have text
+            emit_item_tag( $otext, $text, 1 );
+        }
+        $need_dd = 1;
+    }
+    print HTML "\n";
+    return $need_dd;
+}
+
+#
+# process_over - process a pod over tag and start a corresponding HTML list.
+#
+sub process_over {
+    # start a new list
+    $Listlevel++;
+    push( @Items_Seen, 0 );
+    $After_Lpar = 0;
+}
+
+#
+# process_back - process a pod back tag and convert it to HTML format.
+#
+sub process_back {
+    my $need_dd = shift;
+    if( $Listlevel == 0 ){
+	warn "$0: $Podfile: unexpected =back directive in paragraph $Paragraph.  ignoring.\n" unless $Quiet;
+	return;
+    }
+
+    # close off the list.  note, I check to see if $Listend[$Listlevel] is
+    # defined because an =item directive may have never appeared and thus
+    # $Listend[$Listlevel] may have never been initialized.
+    $Listlevel--;
+    if( defined $Listend[$Listlevel] ){
+	print HTML $need_dd ? "</dd>\n" : "</li>\n" if $After_Lpar;
+	print HTML $Listend[$Listlevel];
+        print HTML "\n";
+        pop( @Listend );
+    }
+    $After_Lpar = 0;
+
+    # clean up item count
+    pop( @Items_Seen );
+}
+
+#
+# process_cut - process a pod cut tag, thus start ignoring pod directives.
+#
+sub process_cut {
+    $Ignore = 1;
+}
+
+#
+# process_pod - process a pod tag, thus stop ignoring pod directives
+# until we see a corresponding cut.
+#
+sub process_pod {
+    # no need to set $Ignore to 0 cause the main loop did it
+}
+
+#
+# process_for - process a =for pod tag.  if it's for html, spit
+# it out verbatim, if illustration, center it, otherwise ignore it.
+#
+sub process_for {
+    my($whom, $text) = @_;
+    if ( $whom =~ /^(pod2)?html$/i) {
+	print HTML $text;
+    } elsif ($whom =~ /^illustration$/i) {
+        1 while chomp $text;
+	for my $ext (qw[.png .gif .jpeg .jpg .tga .pcl .bmp]) {
+	  $text .= $ext, last if -r "$text$ext";
+	}
+        print HTML qq{<p align="center"><img src="$text" alt="$text illustration" /></p>};
+    }
+}
+
+#
+# process_begin - process a =begin pod tag.  this pushes
+# whom we're beginning on the begin stack.  if there's a
+# begin stack, we only print if it us.
+#
+sub process_begin {
+    my($whom, $text) = @_;
+    $whom = lc($whom);
+    push (@Begin_Stack, $whom);
+    if ( $whom =~ /^(pod2)?html$/) {
+	print HTML $text if $text;
+    }
+}
+
+#
+# process_end - process a =end pod tag.  pop the
+# begin stack.  die if we're mismatched.
+#
+sub process_end {
+    my($whom, $text) = @_;
+    $whom = lc($whom);
+    if ($Begin_Stack[-1] ne $whom ) {
+	die "Unmatched begin/end at chunk $Paragraph\n"
+    }
+    pop( @Begin_Stack );
+}
+
+#
+# process_pre - indented paragraph, made into <pre></pre>
+#
+sub process_pre {
+    my( $text ) = @_;
+    my( $rest );
+    return if $Ignore;
+
+    $rest = $$text;
+
+    # insert spaces in place of tabs
+    $rest =~ s#(.+)#
+	    my $line = $1;
+            1 while $line =~ s/(\t+)/' ' x ((length($1) * 8) - $-[0] % 8)/e;
+	    $line;
+	#eg;
+
+    # convert some special chars to HTML escapes
+    $rest = html_escape($rest);
+
+    # try and create links for all occurrences of perl.* within
+    # the preformatted text.
+    $rest =~ s{
+	         (\s*)(perl\w+)
+	      }{
+		 if ( defined $Pages{$2} ){	# is a link
+		     qq($1<a href="$Htmlroot/$Pages{$2}">$2</a>);
+		 } elsif (defined $Pages{dosify($2)}) {	# is a link
+		     qq($1<a href="$Htmlroot/$Pages{dosify($2)}">$2</a>);
+		 } else {
+		     "$1$2";
+		 }
+	      }xeg;
+     $rest =~ s{
+		 (<a\ href="?) ([^>:]*:)? ([^>:]*) \.pod: ([^>:]*:)?
+               }{
+                  my $url ;
+                  if ( $Htmlfileurl ne '' ){
+		     # Here, we take advantage of the knowledge
+		     # that $Htmlfileurl ne '' implies $Htmlroot eq ''.
+		     # Since $Htmlroot eq '', we need to prepend $Htmldir
+		     # on the fron of the link to get the absolute path
+		     # of the link's target. We check for a leading '/'
+		     # to avoid corrupting links that are #, file:, etc.
+		     my $old_url = $3 ;
+		     $old_url = "$Htmldir$old_url" if $old_url =~ m{^\/};
+ 		     $url = relativize_url( "$old_url.html", $Htmlfileurl );
+	          } else {
+		     $url = "$3.html" ;
+		  }
+		  "$1$url" ;
+	       }xeg;
+
+    # Look for embedded URLs and make them into links.  We don't
+    # relativize them since they are best left as the author intended.
+
+    my $urls = '(' . join ('|', qw{
+                http
+                telnet
+		mailto
+		news
+                gopher
+                file
+                wais
+                ftp
+            } )
+        . ')';
+
+    my $ltrs = '\w';
+    my $gunk = '/#~:.?+=&%@!\-';
+    my $punc = '.:!?\-;';
+    my $any  = "${ltrs}${gunk}${punc}";
+
+    $rest =~ s{
+	\b			# start at word boundary
+	(			# begin $1  {
+	    $urls :		# need resource and a colon
+	    (?!:)		# Ignore File::, among others.
+	    [$any] +?		# followed by one or more of any valid
+				#   character, but be conservative and
+				#   take only what you need to....
+	)			# end   $1  }
+	(?=
+	    &quot; &gt;		# maybe pre-quoted '<a href="...">'
+	|			# or:
+	    [$punc]*		# 0 or more punctuation
+	    (?:			#   followed
+		[^$any]		#   by a non-url char
+	    |			#   or
+		$		#   end of the string
+	    )			#
+	|			# or else
+	    $			#   then end of the string
+        )
+      }{<a href="$1">$1</a>}igox;
+
+    # text should be as it is (verbatim)
+    $$text = $rest;
+}
+
+
+#
+# pure text processing
+#
+# pure_text/inIS_text: differ with respect to automatic C<> recognition.
+# we don't want this to happen within IS
+#
+sub pure_text($){
+    my $text = shift();
+    process_puretext( $text, \$PTQuote, 1 );
+}
+
+sub inIS_text($){
+    my $text = shift();
+    process_puretext( $text, \$PTQuote, 0 );
+}
+
+#
+# process_puretext - process pure text (without pod-escapes) converting
+#  double-quotes and handling implicit C<> links.
+#
+sub process_puretext {
+    my($text, $quote, $notinIS) = @_;
+
+    ## Guessing at func() or [\$\@%&]*var references in plain text is destined
+    ## to produce some strange looking ref's. uncomment to disable:
+    ## $notinIS = 0;
+
+    my(@words, $lead, $trail);
+
+    # convert double-quotes to single-quotes
+    if( $$quote && $text =~ s/"/''/s ){
+        $$quote = 0;
+    }
+    while ($text =~ s/"([^"]*)"/``$1''/sg) {};
+    $$quote = 1 if $text =~ s/"/``/s;
+
+    # keep track of leading and trailing white-space
+    $lead  = ($text =~ s/\A(\s+)//s ? $1 : "");
+    $trail = ($text =~ s/(\s+)\Z//s ? $1 : "");
+
+    # split at space/non-space boundaries
+    @words = split( /(?<=\s)(?=\S)|(?<=\S)(?=\s)/, $text );
+
+    # process each word individually
+    foreach my $word (@words) {
+	# skip space runs
+ 	next if $word =~ /^\s*$/;
+	# see if we can infer a link
+	if( $notinIS && $word =~ /^(\w+)\((.*)\)$/ ) {
+	    # has parenthesis so should have been a C<> ref
+            ## try for a pagename (perlXXX(1))?
+            my( $func, $args ) = ( $1, $2 );
+            if( $args =~ /^\d+$/ ){
+                my $url = page_sect( $word, '' );
+                if( defined $url ){
+                    $word = "<a href=\"$url\">the $word manpage</a>";
+                    next;
+                }
+            }
+            ## try function name for a link, append tt'ed argument list
+            $word = emit_C( $func, '', "($args)");
+
+#### disabled. either all (including $\W, $\w+{.*} etc.) or nothing.
+##      } elsif( $notinIS && $word =~ /^[\$\@%&*]+\w+$/) {
+##	    # perl variables, should be a C<> ref
+##	    $word = emit_C( $word );
+
+	} elsif ($word =~ m,^\w+://\w,) {
+	    # looks like a URL
+            # Don't relativize it: leave it as the author intended
+	    $word = qq(<a href="$word">$word</a>);
+	} elsif ($word =~ /[\w.-]+\@[\w-]+\.\w/) {
+	    # looks like an e-mail address
+	    my ($w1, $w2, $w3) = ("", $word, "");
+	    ($w1, $w2, $w3) = ("(", $1, ")$2") if $word =~ /^\((.*?)\)(,?)/;
+	    ($w1, $w2, $w3) = ("&lt;", $1, "&gt;$2") if $word =~ /^<(.*?)>(,?)/;
+	    $word = qq($w1<a href="mailto:$w2">$w2</a>$w3);
+	} else {
+	    $word = html_escape($word) if $word =~ /["&<>]/;
+	}
+    }
+
+    # put everything back together
+    return $lead . join( '', @words ) . $trail;
+}
+
+
+#
+# process_text - handles plaintext that appears in the input pod file.
+# there may be pod commands embedded within the text so those must be
+# converted to html commands.
+#
+
+sub process_text1($$;$$);
+sub pattern ($) { $_[0] ? '[^\S\n]+'.('>' x ($_[0] + 1)) : '>' }
+sub closing ($) { local($_) = shift; (defined && s/\s+$//) ? length : 0 }
+
+sub process_text {
+    return if $Ignore;
+    my( $tref ) = @_;
+    my $res = process_text1( 0, $tref );
+    $$tref = $res;
+}
+
+sub process_text1($$;$$){
+    my( $lev, $rstr, $func, $closing ) = @_;
+    my $res = '';
+
+    unless (defined $func) {
+	$func = '';
+	$lev++;
+    }
+
+    if( $func eq 'B' ){
+	# B<text> - boldface
+	$res = '<strong>' . process_text1( $lev, $rstr ) . '</strong>';
+
+    } elsif( $func eq 'C' ){
+	# C<code> - can be a ref or <code></code>
+	# need to extract text
+	my $par = go_ahead( $rstr, 'C', $closing );
+
+	## clean-up of the link target
+        my $text = depod( $par );
+
+	### my $x = $par =~ /[BI]</ ? 'yes' : 'no' ;
+        ### print STDERR "-->call emit_C($par) lev=$lev, par with BI=$x\n";
+
+	$res = emit_C( $text, $lev > 1 || ($par =~ /[BI]</) );
+
+    } elsif( $func eq 'E' ){
+	# E<x> - convert to character
+	$$rstr =~ s/^([^>]*)>//;
+	my $escape = $1;
+	$escape =~ s/^(\d+|X[\dA-F]+)$/#$1/i;
+	$res = "&$escape;";
+
+    } elsif( $func eq 'F' ){
+	# F<filename> - italizice
+	$res = '<em>' . process_text1( $lev, $rstr ) . '</em>';
+
+    } elsif( $func eq 'I' ){
+	# I<text> - italizice
+	$res = '<em>' . process_text1( $lev, $rstr ) . '</em>';
+
+    } elsif( $func eq 'L' ){
+	# L<link> - link
+	## L<text|cross-ref> => produce text, use cross-ref for linking
+	## L<cross-ref> => make text from cross-ref
+	## need to extract text
+	my $par = go_ahead( $rstr, 'L', $closing );
+
+        # some L<>'s that shouldn't be:
+	# a) full-blown URL's are emitted as-is
+        if( $par =~ m{^\w+://}s ){
+	    return make_URL_href( $par );
+	}
+        # b) C<...> is stripped and treated as C<>
+        if( $par =~ /^C<(.*)>$/ ){
+	    my $text = depod( $1 );
+ 	    return emit_C( $text, $lev > 1 || ($par =~ /[BI]</) );
+	}
+
+	# analyze the contents
+	$par =~ s/\n/ /g;   # undo word-wrapped tags
+        my $opar = $par;
+	my $linktext;
+	if( $par =~ s{^([^|]+)\|}{} ){
+	    $linktext = $1;
+	}
+
+	# make sure sections start with a /
+	$par =~ s{^"}{/"};
+
+	my( $page, $section, $ident );
+
+	# check for link patterns
+	if( $par =~ m{^([^/]+?)/(?!")(.*?)$} ){     # name/ident
+            # we've got a name/ident (no quotes)
+            ( $page, $ident ) = ( $1, $2 );
+            ### print STDERR "--> L<$par> to page $page, ident $ident\n";
+
+	} elsif( $par =~ m{^(.*?)/"?(.*?)"?$} ){ # [name]/"section"
+            # even though this should be a "section", we go for ident first
+	    ( $page, $ident ) = ( $1, $2 );
+            ### print STDERR "--> L<$par> to page $page, section $section\n";
+
+	} elsif( $par =~ /\s/ ){  # this must be a section with missing quotes
+	    ( $page, $section ) = ( '', $par );
+            ### print STDERR "--> L<$par> to void page, section $section\n";
+
+        } else {
+	    ( $page, $section ) = ( $par, '' );
+            ### print STDERR "--> L<$par> to page $par, void section\n";
+	}
+
+        # now, either $section or $ident is defined. the convoluted logic
+        # below tries to resolve L<> according to what the user specified.
+        # failing this, we try to find the next best thing...
+        my( $url, $ltext, $fid );
+
+        RESOLVE: {
+            if( defined $ident ){
+                ## try to resolve $ident as an item
+	        ( $url, $fid ) = coderef( $page, $ident );
+                if( $url ){
+                    if( ! defined( $linktext ) ){
+                        $linktext = $ident;
+                        $linktext .= " in " if $ident && $page;
+                        $linktext .= "the $page manpage" if $page;
+                    }
+                    ###  print STDERR "got coderef url=$url\n";
+                    last RESOLVE;
+                }
+                ## no luck: go for a section (auto-quoting!)
+                $section = $ident;
+            }
+            ## now go for a section
+            my $htmlsection = htmlify( $section );
+ 	    $url = page_sect( $page, $htmlsection );
+            if( $url ){
+                if( ! defined( $linktext ) ){
+                    $linktext = $section;
+                    $linktext .= " in " if $section && $page;
+                    $linktext .= "the $page manpage" if $page;
+                }
+                ### print STDERR "got page/section url=$url\n";
+                last RESOLVE;
+            }
+            ## no luck: go for an ident
+            if( $section ){
+                $ident = $section;
+            } else {
+                $ident = $page;
+                $page  = undef();
+            }
+            ( $url, $fid ) = coderef( $page, $ident );
+            if( $url ){
+                if( ! defined( $linktext ) ){
+                    $linktext = $ident;
+                    $linktext .= " in " if $ident && $page;
+                    $linktext .= "the $page manpage" if $page;
+                }
+                ### print STDERR "got section=>coderef url=$url\n";
+                last RESOLVE;
+            }
+
+            # warning; show some text.
+            $linktext = $opar unless defined $linktext;
+            warn "$0: $Podfile: cannot resolve L<$opar> in paragraph $Paragraph.\n" unless $Quiet;
+        }
+
+        # now we have a URL or just plain code
+        $$rstr = $linktext . '>' . $$rstr;
+        if( defined( $url ) ){
+            $res = "<a href=\"$url\">" . process_text1( $lev, $rstr ) . '</a>';
+        } else {
+	    $res = '<em>' . process_text1( $lev, $rstr ) . '</em>';
+        }
+
+    } elsif( $func eq 'S' ){
+	# S<text> - non-breaking spaces
+	$res = process_text1( $lev, $rstr );
+	$res =~ s/ /&nbsp;/g;
+
+    } elsif( $func eq 'X' ){
+	# X<> - ignore
+	$$rstr =~ s/^[^>]*>//;
+
+    } elsif( $func eq 'Z' ){
+	# Z<> - empty
+	warn "$0: $Podfile: invalid X<> in paragraph $Paragraph.\n"
+	    unless $$rstr =~ s/^>// or $Quiet;
+
+    } else {
+        my $term = pattern $closing;
+	while( $$rstr =~ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|$term)//s ){
+	    # all others: either recurse into new function or
+	    # terminate at closing angle bracket(s)
+	    my $pt = $1;
+            $pt .= $2 if !$3 &&  $lev == 1;
+	    $res .= $lev == 1 ? pure_text( $pt ) : inIS_text( $pt );
+	    return $res if !$3 && $lev > 1;
+            if( $3 ){
+		$res .= process_text1( $lev, $rstr, $3, closing $4 );
+ 	    }
+	}
+	if( $lev == 1 ){
+	    $res .= pure_text( $$rstr );
+	} else {
+	    warn "$0: $Podfile: undelimited $func<> in paragraph $Paragraph.\n" unless $Quiet;
+	}
+    }
+    return $res;
+}
+
+#
+# go_ahead: extract text of an IS (can be nested)
+#
+sub go_ahead($$$){
+    my( $rstr, $func, $closing ) = @_;
+    my $res = '';
+    my @closing = ($closing);
+    while( $$rstr =~
+      s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|@{[pattern $closing[0]]})//s ){
+	$res .= $1;
+	unless( $3 ){
+	    shift @closing;
+	    return $res unless @closing;
+	} else {
+	    unshift @closing, closing $4;
+	}
+	$res .= $2;
+    }
+    warn "$0: $Podfile: undelimited $func<> in paragraph $Paragraph.\n" unless $Quiet;
+    return $res;
+}
+
+#
+# emit_C - output result of C<text>
+#    $text is the depod-ed text
+#
+sub emit_C($;$$){
+    my( $text, $nocode, $args ) = @_;
+    $args = '' unless defined $args;
+    my $res;
+    my( $url, $fid ) = coderef( undef(), $text );
+
+    # need HTML-safe text
+    my $linktext = html_escape( "$text$args" );
+
+    if( defined( $url ) &&
+        (!defined( $EmittedItem ) || $EmittedItem ne $fid ) ){
+	$res = "<a href=\"$url\"><code>$linktext</code></a>";
+    } elsif( 0 && $nocode ){
+	$res = $linktext;
+    } else {
+	$res = "<code>$linktext</code>";
+    }
+    return $res;
+}
+
+#
+# html_escape: make text safe for HTML
+#
+sub html_escape {
+    my $rest = $_[0];
+    $rest   =~ s/&/&amp;/g;
+    $rest   =~ s/</&lt;/g;
+    $rest   =~ s/>/&gt;/g;
+    $rest   =~ s/"/&quot;/g;
+    # &apos; is only in XHTML, not HTML4.  Be conservative
+    #$rest   =~ s/'/&apos;/g;
+    return $rest;
+}
+
+
+#
+# dosify - convert filenames to 8.3
+#
+sub dosify {
+    my($str) = @_;
+    return lc($str) if $^O eq 'VMS';     # VMS just needs casing
+    if ($Is83) {
+        $str = lc $str;
+        $str =~ s/(\.\w+)/substr ($1,0,4)/ge;
+        $str =~ s/(\w+)/substr ($1,0,8)/ge;
+    }
+    return $str;
+}
+
+#
+# page_sect - make a URL from the text of a L<>
+#
+sub page_sect($$) {
+    my( $page, $section ) = @_;
+    my( $linktext, $page83, $link);	# work strings
+
+    # check if we know that this is a section in this page
+    if (!defined $Pages{$page} && defined $Sections{$page}) {
+	$section = $page;
+	$page = "";
+        ### print STDERR "reset page='', section=$section\n";
+    }
+
+    $page83=dosify($page);
+    $page=$page83 if (defined $Pages{$page83});
+    if ($page eq "") {
+        $link = "#" . anchorify( $section );
+    } elsif ( $page =~ /::/ ) {
+	$page =~ s,::,/,g;
+	# Search page cache for an entry keyed under the html page name,
+	# then look to see what directory that page might be in.  NOTE:
+	# this will only find one page. A better solution might be to produce
+	# an intermediate page that is an index to all such pages.
+	my $page_name = $page ;
+	$page_name =~ s,^.*/,,s ;
+	if ( defined( $Pages{ $page_name } ) &&
+	     $Pages{ $page_name } =~ /([^:]*$page)\.(?:pod|pm):/
+	   ) {
+	    $page = $1 ;
+	}
+	else {
+	    # NOTE: This branch assumes that all A::B pages are located in
+	    # $Htmlroot/A/B.html . This is often incorrect, since they are
+	    # often in $Htmlroot/lib/A/B.html or such like. Perhaps we could
+	    # analyze the contents of %Pages and figure out where any
+	    # cousins of A::B are, then assume that.  So, if A::B isn't found,
+	    # but A::C is found in lib/A/C.pm, then A::B is assumed to be in
+	    # lib/A/B.pm. This is also limited, but it's an improvement.
+	    # Maybe a hints file so that the links point to the correct places
+	    # nonetheless?
+
+	}
+	$link = "$Htmlroot/$page.html";
+	$link .= "#" . anchorify( $section ) if ($section);
+    } elsif (!defined $Pages{$page}) {
+	$link = "";
+    } else {
+	$section = anchorify( $section ) if $section ne "";
+        ### print STDERR "...section=$section\n";
+
+	# if there is a directory by the name of the page, then assume that an
+	# appropriate section will exist in the subdirectory
+#	if ($section ne "" && $Pages{$page} =~ /([^:]*[^(\.pod|\.pm)]):/) {
+	if ($section ne "" && $Pages{$page} =~ /([^:]*(?<!\.pod)(?<!\.pm)):/) {
+	    $link = "$Htmlroot/$1/$section.html";
+            ### print STDERR "...link=$link\n";
+
+	# since there is no directory by the name of the page, the section will
+	# have to exist within a .html of the same name.  thus, make sure there
+	# is a .pod or .pm that might become that .html
+	} else {
+	    $section = "#$section" if $section;
+            ### print STDERR "...section=$section\n";
+
+	    # check if there is a .pod with the page name
+	    if ($Pages{$page} =~ /([^:]*)\.pod:/) {
+		$link = "$Htmlroot/$1.html$section";
+	    } elsif ($Pages{$page} =~ /([^:]*)\.pm:/) {
+		$link = "$Htmlroot/$1.html$section";
+	    } else {
+		$link = "";
+	    }
+	}
+    }
+
+    if ($link) {
+	# Here, we take advantage of the knowledge that $Htmlfileurl ne ''
+	# implies $Htmlroot eq ''. This means that the link in question
+	# needs a prefix of $Htmldir if it begins with '/'. The test for
+	# the initial '/' is done to avoid '#'-only links, and to allow
+	# for other kinds of links, like file:, ftp:, etc.
+        my $url ;
+        if (  $Htmlfileurl ne '' ) {
+            $link = "$Htmldir$link" if $link =~ m{^/}s;
+            $url = relativize_url( $link, $Htmlfileurl );
+# print( "  b: [$link,$Htmlfileurl,$url]\n" );
+	}
+	else {
+            $url = $link ;
+	}
+	return $url;
+
+    } else {
+	return undef();
+    }
+}
+
+#
+# relativize_url - convert an absolute URL to one relative to a base URL.
+# Assumes both end in a filename.
+#
+sub relativize_url {
+    my ($dest,$source) = @_ ;
+
+    my ($dest_volume,$dest_directory,$dest_file) =
+        File::Spec::Unix->splitpath( $dest ) ;
+    $dest = File::Spec::Unix->catpath( $dest_volume, $dest_directory, '' ) ;
+
+    my ($source_volume,$source_directory,$source_file) =
+        File::Spec::Unix->splitpath( $source ) ;
+    $source = File::Spec::Unix->catpath( $source_volume, $source_directory, '' ) ;
+
+    my $rel_path = '' ;
+    if ( $dest ne '' ) {
+       $rel_path = File::Spec::Unix->abs2rel( $dest, $source ) ;
+    }
+
+    if ( $rel_path ne ''                &&
+         substr( $rel_path, -1 ) ne '/' &&
+         substr( $dest_file, 0, 1 ) ne '#'
+        ) {
+        $rel_path .= "/$dest_file" ;
+    }
+    else {
+        $rel_path .= "$dest_file" ;
+    }
+
+    return $rel_path ;
+}
+
+
+#
+# coderef - make URL from the text of a C<>
+#
+sub coderef($$){
+    my( $page, $item ) = @_;
+    my( $url );
+
+    my $fid = fragment_id( $item );
+    if( defined( $page ) && $page ne "" ){
+	# we have been given a $page...
+	$page =~ s{::}{/}g;
+
+	# Do we take it? Item could be a section!
+	my $base = $Items{$fid} || "";
+	$base =~ s{[^/]*/}{};
+	if( $base ne "$page.html" ){
+            ###   print STDERR "coderef( $page, $item ): items{$fid} = $Items{$fid} = $base => discard page!\n";
+	    $page = undef();
+	}
+
+    } else {
+        # no page - local items precede cached items
+	if( defined( $fid ) ){
+	    if(  exists $Local_Items{$fid} ){
+		$page = $Local_Items{$fid};
+	    } else {
+		$page = $Items{$fid};
+	    }
+	}
+    }
+
+    # if there was a pod file that we found earlier with an appropriate
+    # =item directive, then create a link to that page.
+    if( defined $page ){
+	if( $page ){
+            if( exists $Pages{$page} and $Pages{$page} =~ /([^:.]*)\.[^:]*:/){
+		$page = $1 . '.html';
+	    }
+	    my $link = "$Htmlroot/$page#item_" . anchorify($fid);
+
+	    # Here, we take advantage of the knowledge that $Htmlfileurl
+	    # ne '' implies $Htmlroot eq ''.
+	    if (  $Htmlfileurl ne '' ) {
+		$link = "$Htmldir$link" ;
+		$url = relativize_url( $link, $Htmlfileurl ) ;
+	    } else {
+		$url = $link ;
+	    }
+	} else {
+	    $url = "#item_" . anchorify($fid);
+	}
+
+	confess "url has space: $url" if $url =~ /"[^"]*\s[^"]*"/;
+    }
+    return( $url, $fid );
+}
+
+
+
+#
+# Adapted from Nick Ing-Simmons' PodToHtml package.
+sub relative_url {
+    my $source_file = shift ;
+    my $destination_file = shift;
+
+    my $source = URI::file->new_abs($source_file);
+    my $uo = URI::file->new($destination_file,$source)->abs;
+    return $uo->rel->as_string;
+}
+
+
+#
+# finish_list - finish off any pending HTML lists.  this should be called
+# after the entire pod file has been read and converted.
+#
+sub finish_list {
+    while ($Listlevel > 0) {
+	print HTML "</dl>\n";
+	$Listlevel--;
+    }
+}
+
+#
+# htmlify - converts a pod section specification to a suitable section
+# specification for HTML. Note that we keep spaces and special characters
+# except ", ? (Netscape problem) and the hyphen (writer's problem...).
+#
+sub htmlify {
+    my( $heading) = @_;
+    $heading =~ s/(\s+)/ /g;
+    $heading =~ s/\s+\Z//;
+    $heading =~ s/\A\s+//;
+    # The hyphen is a disgrace to the English language.
+    $heading =~ s/[-"?]//g;
+    $heading = lc( $heading );
+    return $heading;
+}
+
+#
+# similar to htmlify, but turns non-alphanumerics into underscores
+#
+sub anchorify {
+    my ($anchor) = @_;
+    $anchor = htmlify($anchor);
+    $anchor =~ s/\W/_/g;
+    return $anchor;
+}
+
+#
+# depod - convert text by eliminating all interior sequences
+# Note: can be called with copy or modify semantics
+#
+my %E2c;
+$E2c{lt}     = '<';
+$E2c{gt}     = '>';
+$E2c{sol}    = '/';
+$E2c{verbar} = '|';
+$E2c{amp}    = '&'; # in Tk's pods
+
+sub depod1($;$$);
+
+sub depod($){
+    my $string;
+    if( ref( $_[0] ) ){
+	$string =  ${$_[0]};
+        ${$_[0]} = depod1( \$string );
+    } else {
+	$string =  $_[0];
+        depod1( \$string );
+    }
+}
+
+sub depod1($;$$){
+  my( $rstr, $func, $closing ) = @_;
+  my $res = '';
+  return $res unless defined $$rstr;
+  if( ! defined( $func ) ){
+      # skip to next begin of an interior sequence
+      while( $$rstr =~ s/\A(.*?)([BCEFILSXZ])<(<+[^\S\n]+)?// ){
+         # recurse into its text
+	  $res .= $1 . depod1( $rstr, $2, closing $3);
+      }
+      $res .= $$rstr;
+  } elsif( $func eq 'E' ){
+      # E<x> - convert to character
+      $$rstr =~ s/^([^>]*)>//;
+      $res .= $E2c{$1} || "";
+  } elsif( $func eq 'X' ){
+      # X<> - ignore
+      $$rstr =~ s/^[^>]*>//;
+  } elsif( $func eq 'Z' ){
+      # Z<> - empty
+      $$rstr =~ s/^>//;
+  } else {
+      # all others: either recurse into new function or
+      # terminate at closing angle bracket
+      my $term = pattern $closing;
+      while( $$rstr =~ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|$term)// ){
+	  $res .= $1;
+	  last unless $3;
+          $res .= depod1( $rstr, $3, closing $4 );
+      }
+      ## If we're here and $2 ne '>': undelimited interior sequence.
+      ## Ignored, as this is called without proper indication of where we are.
+      ## Rely on process_text to produce diagnostics.
+  }
+  return $res;
+}
+
+#
+# fragment_id - construct a fragment identifier from:
+#   a) =item text
+#   b) contents of C<...>
+#
+my @HC;
+sub fragment_id {
+    my $text = shift();
+    $text =~ s/\s+\Z//s;
+    if( $text ){
+	# a method or function?
+	return $1 if $text =~ /(\w+)\s*\(/;
+	return $1 if $text =~ /->\s*(\w+)\s*\(?/;
+
+	# a variable name?
+	return $1 if $text =~ /^([\$\@%*]\S+)/;
+
+	# some pattern matching operator?
+	return $1 if $text =~ m|^(\w+/).*/\w*$|;
+
+	# fancy stuff... like "do { }"
+	return $1 if $text =~ m|^(\w+)\s*{.*}$|;
+
+	# honour the perlfunc manpage: func [PAR[,[ ]PAR]...]
+	# and some funnies with ... Module ...
+	return $1 if $text =~ m{^([a-z\d_]+)(\s+[A-Z\d,/& ]+)?$};
+	return $1 if $text =~ m{^([a-z\d]+)\s+Module(\s+[A-Z\d,/& ]+)?$};
+
+	# text? normalize!
+	$text =~ s/\s+/_/sg;
+	$text =~ s{(\W)}{
+         defined( $HC[ord($1)] ) ? $HC[ord($1)]
+                 : ( $HC[ord($1)] = sprintf( "%%%02X", ord($1) ) ) }gxe;
+        $text = substr( $text, 0, 50 );
+    } else {
+	return undef();
+    }
+}
+
+#
+# make_URL_href - generate HTML href from URL
+# Special treatment for CGI queries.
+#
+sub make_URL_href($){
+    my( $url ) = @_;
+    if( $url !~
+        s{^(http:[-\w/#~:.+=&%@!]+)(\?.*)$}{<a href="$1$2">$1</a>}i ){
+        $url = "<a href=\"$url\">$url</a>";
+    }
+    return $url;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/InputObjects.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/InputObjects.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/InputObjects.pm	(revision 14489)
@@ -0,0 +1,941 @@
+#############################################################################
+# Pod/InputObjects.pm -- package which defines objects for input streams
+# and paragraphs and commands when parsing POD docs.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::InputObjects;
+
+use vars qw($VERSION);
+$VERSION = 1.30;  ## Current version of this package
+require  5.005;    ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::InputObjects - objects representing POD input paragraphs, commands, etc.
+
+=head1 SYNOPSIS
+
+    use Pod::InputObjects;
+
+=head1 REQUIRES
+
+perl5.004, Carp
+
+=head1 EXPORTS
+
+Nothing.
+
+=head1 DESCRIPTION
+
+This module defines some basic input objects used by B<Pod::Parser> when
+reading and parsing POD text from an input source. The following objects
+are defined:
+
+=over 4
+
+=begin __PRIVATE__
+
+=item package B<Pod::InputSource>
+
+An object corresponding to a source of POD input text. It is mostly a
+wrapper around a filehandle or C<IO::Handle>-type object (or anything
+that implements the C<getline()> method) which keeps track of some
+additional information relevant to the parsing of PODs.
+
+=end __PRIVATE__
+
+=item package B<Pod::Paragraph>
+
+An object corresponding to a paragraph of POD input text. It may be a
+plain paragraph, a verbatim paragraph, or a command paragraph (see
+L<perlpod>).
+
+=item package B<Pod::InteriorSequence>
+
+An object corresponding to an interior sequence command from the POD
+input text (see L<perlpod>).
+
+=item package B<Pod::ParseTree>
+
+An object corresponding to a tree of parsed POD text. Each "node" in
+a parse-tree (or I<ptree>) is either a text-string or a reference to
+a B<Pod::InteriorSequence> object. The nodes appear in the parse-tree
+in the order in which they were parsed from left-to-right.
+
+=back
+
+Each of these input objects are described in further detail in the
+sections which follow.
+
+=cut
+
+#############################################################################
+
+use strict;
+#use diagnostics;
+#use Carp;
+
+#############################################################################
+
+package Pod::InputSource;
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<Pod::InputSource>
+
+This object corresponds to an input source or stream of POD
+documentation. When parsing PODs, it is necessary to associate and store
+certain context information with each input source. All of this
+information is kept together with the stream itself in one of these
+C<Pod::InputSource> objects. Each such object is merely a wrapper around
+an C<IO::Handle> object of some kind (or at least something that
+implements the C<getline()> method). They have the following
+methods/attributes:
+
+=end __PRIVATE__
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<new()>
+
+        my $pod_input1 = Pod::InputSource->new(-handle => $filehandle);
+        my $pod_input2 = new Pod::InputSource(-handle => $filehandle,
+                                              -name   => $name);
+        my $pod_input3 = new Pod::InputSource(-handle => \*STDIN);
+        my $pod_input4 = Pod::InputSource->new(-handle => \*STDIN,
+                                               -name => "(STDIN)");
+
+This is a class method that constructs a C<Pod::InputSource> object and
+returns a reference to the new input source object. It takes one or more
+keyword arguments in the form of a hash. The keyword C<-handle> is
+required and designates the corresponding input handle. The keyword
+C<-name> is optional and specifies the name associated with the input
+handle (typically a file name).
+
+=end __PRIVATE__
+
+=cut
+
+sub new {
+    ## Determine if we were called via an object-ref or a classname
+    my $this = shift;
+    my $class = ref($this) || $this;
+
+    ## Any remaining arguments are treated as initial values for the
+    ## hash that is used to represent this object. Note that we default
+    ## certain values by specifying them *before* the arguments passed.
+    ## If they are in the argument list, they will override the defaults.
+    my $self = { -name        => '(unknown)',
+                 -handle      => undef,
+                 -was_cutting => 0,
+                 @_ };
+
+    ## Bless ourselves into the desired class and perform any initialization
+    bless $self, $class;
+    return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<name()>
+
+        my $filename = $pod_input->name();
+        $pod_input->name($new_filename_to_use);
+
+This method gets/sets the name of the input source (usually a filename).
+If no argument is given, it returns a string containing the name of
+the input source; otherwise it sets the name of the input source to the
+contents of the given argument.
+
+=end __PRIVATE__
+
+=cut
+
+sub name {
+   (@_ > 1)  and  $_[0]->{'-name'} = $_[1];
+   return $_[0]->{'-name'};
+}
+
+## allow 'filename' as an alias for 'name'
+*filename = \&name;
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<handle()>
+
+        my $handle = $pod_input->handle();
+
+Returns a reference to the handle object from which input is read (the
+one used to contructed this input source object).
+
+=end __PRIVATE__
+
+=cut
+
+sub handle {
+   return $_[0]->{'-handle'};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<was_cutting()>
+
+        print "Yes.\n" if ($pod_input->was_cutting());
+
+The value of the C<cutting> state (that the B<cutting()> method would
+have returned) immediately before any input was read from this input
+stream. After all input from this stream has been read, the C<cutting>
+state is restored to this value.
+
+=end __PRIVATE__
+
+=cut
+
+sub was_cutting {
+   (@_ > 1)  and  $_[0]->{-was_cutting} = $_[1];
+   return $_[0]->{-was_cutting};
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::Paragraph;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::Paragraph>
+
+An object representing a paragraph of POD input text.
+It has the following methods/attributes:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::Paragraph-E<gt>B<new()>
+
+        my $pod_para1 = Pod::Paragraph->new(-text => $text);
+        my $pod_para2 = Pod::Paragraph->new(-name => $cmd,
+                                            -text => $text);
+        my $pod_para3 = new Pod::Paragraph(-text => $text);
+        my $pod_para4 = new Pod::Paragraph(-name => $cmd,
+                                           -text => $text);
+        my $pod_para5 = Pod::Paragraph->new(-name => $cmd,
+                                            -text => $text,
+                                            -file => $filename,
+                                            -line => $line_number);
+
+This is a class method that constructs a C<Pod::Paragraph> object and
+returns a reference to the new paragraph object. It may be given one or
+two keyword arguments. The C<-text> keyword indicates the corresponding
+text of the POD paragraph. The C<-name> keyword indicates the name of
+the corresponding POD command, such as C<head1> or C<item> (it should
+I<not> contain the C<=> prefix); this is needed only if the POD
+paragraph corresponds to a command paragraph. The C<-file> and C<-line>
+keywords indicate the filename and line number corresponding to the
+beginning of the paragraph 
+
+=cut
+
+sub new {
+    ## Determine if we were called via an object-ref or a classname
+    my $this = shift;
+    my $class = ref($this) || $this;
+
+    ## Any remaining arguments are treated as initial values for the
+    ## hash that is used to represent this object. Note that we default
+    ## certain values by specifying them *before* the arguments passed.
+    ## If they are in the argument list, they will override the defaults.
+    my $self = {
+          -name       => undef,
+          -text       => (@_ == 1) ? shift : undef,
+          -file       => '<unknown-file>',
+          -line       => 0,
+          -prefix     => '=',
+          -separator  => ' ',
+          -ptree => [],
+          @_
+    };
+
+    ## Bless ourselves into the desired class and perform any initialization
+    bless $self, $class;
+    return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<cmd_name()>
+
+        my $para_cmd = $pod_para->cmd_name();
+
+If this paragraph is a command paragraph, then this method will return 
+the name of the command (I<without> any leading C<=> prefix).
+
+=cut
+
+sub cmd_name {
+   (@_ > 1)  and  $_[0]->{'-name'} = $_[1];
+   return $_[0]->{'-name'};
+}
+
+## let name() be an alias for cmd_name()
+*name = \&cmd_name;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<text()>
+
+        my $para_text = $pod_para->text();
+
+This method will return the corresponding text of the paragraph.
+
+=cut
+
+sub text {
+   (@_ > 1)  and  $_[0]->{'-text'} = $_[1];
+   return $_[0]->{'-text'};
+}       
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<raw_text()>
+
+        my $raw_pod_para = $pod_para->raw_text();
+
+This method will return the I<raw> text of the POD paragraph, exactly
+as it appeared in the input.
+
+=cut
+
+sub raw_text {
+   return $_[0]->{'-text'}  unless (defined $_[0]->{'-name'});
+   return $_[0]->{'-prefix'} . $_[0]->{'-name'} . 
+          $_[0]->{'-separator'} . $_[0]->{'-text'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<cmd_prefix()>
+
+        my $prefix = $pod_para->cmd_prefix();
+
+If this paragraph is a command paragraph, then this method will return 
+the prefix used to denote the command (which should be the string "="
+or "==").
+
+=cut
+
+sub cmd_prefix {
+   return $_[0]->{'-prefix'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<cmd_separator()>
+
+        my $separator = $pod_para->cmd_separator();
+
+If this paragraph is a command paragraph, then this method will return
+the text used to separate the command name from the rest of the
+paragraph (if any).
+
+=cut
+
+sub cmd_separator {
+   return $_[0]->{'-separator'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<parse_tree()>
+
+        my $ptree = $pod_parser->parse_text( $pod_para->text() );
+        $pod_para->parse_tree( $ptree );
+        $ptree = $pod_para->parse_tree();
+
+This method will get/set the corresponding parse-tree of the paragraph's text.
+
+=cut
+
+sub parse_tree {
+   (@_ > 1)  and  $_[0]->{'-ptree'} = $_[1];
+   return $_[0]->{'-ptree'};
+}       
+
+## let ptree() be an alias for parse_tree()
+*ptree = \&parse_tree;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<file_line()>
+
+        my ($filename, $line_number) = $pod_para->file_line();
+        my $position = $pod_para->file_line();
+
+Returns the current filename and line number for the paragraph
+object.  If called in a list context, it returns a list of two
+elements: first the filename, then the line number. If called in
+a scalar context, it returns a string containing the filename, followed
+by a colon (':'), followed by the line number.
+
+=cut
+
+sub file_line {
+   my @loc = ($_[0]->{'-file'} || '<unknown-file>',
+              $_[0]->{'-line'} || 0);
+   return (wantarray) ? @loc : join(':', @loc);
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::InteriorSequence;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::InteriorSequence>
+
+An object representing a POD interior sequence command.
+It has the following methods/attributes:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::InteriorSequence-E<gt>B<new()>
+
+        my $pod_seq1 = Pod::InteriorSequence->new(-name => $cmd
+                                                  -ldelim => $delimiter);
+        my $pod_seq2 = new Pod::InteriorSequence(-name => $cmd,
+                                                 -ldelim => $delimiter);
+        my $pod_seq3 = new Pod::InteriorSequence(-name => $cmd,
+                                                 -ldelim => $delimiter,
+                                                 -file => $filename,
+                                                 -line => $line_number);
+
+        my $pod_seq4 = new Pod::InteriorSequence(-name => $cmd, $ptree);
+        my $pod_seq5 = new Pod::InteriorSequence($cmd, $ptree);
+
+This is a class method that constructs a C<Pod::InteriorSequence> object
+and returns a reference to the new interior sequence object. It should
+be given two keyword arguments.  The C<-ldelim> keyword indicates the
+corresponding left-delimiter of the interior sequence (e.g. 'E<lt>').
+The C<-name> keyword indicates the name of the corresponding interior
+sequence command, such as C<I> or C<B> or C<C>. The C<-file> and
+C<-line> keywords indicate the filename and line number corresponding
+to the beginning of the interior sequence. If the C<$ptree> argument is
+given, it must be the last argument, and it must be either string, or
+else an array-ref suitable for passing to B<Pod::ParseTree::new> (or
+it may be a reference to a Pod::ParseTree object).
+
+=cut
+
+sub new {
+    ## Determine if we were called via an object-ref or a classname
+    my $this = shift;
+    my $class = ref($this) || $this;
+
+    ## See if first argument has no keyword
+    if (((@_ <= 2) or (@_ % 2)) and $_[0] !~ /^-\w/) {
+       ## Yup - need an implicit '-name' before first parameter
+       unshift @_, '-name';
+    }
+
+    ## See if odd number of args
+    if ((@_ % 2) != 0) {
+       ## Yup - need an implicit '-ptree' before the last parameter
+       splice @_, $#_, 0, '-ptree';
+    }
+
+    ## Any remaining arguments are treated as initial values for the
+    ## hash that is used to represent this object. Note that we default
+    ## certain values by specifying them *before* the arguments passed.
+    ## If they are in the argument list, they will override the defaults.
+    my $self = {
+          -name       => (@_ == 1) ? $_[0] : undef,
+          -file       => '<unknown-file>',
+          -line       => 0,
+          -ldelim     => '<',
+          -rdelim     => '>',
+          @_
+    };
+
+    ## Initialize contents if they havent been already
+    my $ptree = $self->{'-ptree'} || new Pod::ParseTree();
+    if ( ref $ptree =~ /^(ARRAY)?$/ ) {
+        ## We have an array-ref, or a normal scalar. Pass it as an
+        ## an argument to the ptree-constructor
+        $ptree = new Pod::ParseTree($1 ? [$ptree] : $ptree);
+    }
+    $self->{'-ptree'} = $ptree;
+
+    ## Bless ourselves into the desired class and perform any initialization
+    bless $self, $class;
+    return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<cmd_name()>
+
+        my $seq_cmd = $pod_seq->cmd_name();
+
+The name of the interior sequence command.
+
+=cut
+
+sub cmd_name {
+   (@_ > 1)  and  $_[0]->{'-name'} = $_[1];
+   return $_[0]->{'-name'};
+}
+
+## let name() be an alias for cmd_name()
+*name = \&cmd_name;
+
+##---------------------------------------------------------------------------
+
+## Private subroutine to set the parent pointer of all the given
+## children that are interior-sequences to be $self
+
+sub _set_child2parent_links {
+   my ($self, @children) = @_;
+   ## Make sure any sequences know who their parent is
+   for (@children) {
+      next  unless (length  and  ref  and  ref ne 'SCALAR');
+      if (UNIVERSAL::isa($_, 'Pod::InteriorSequence') or
+          UNIVERSAL::can($_, 'nested'))
+      {
+          $_->nested($self);
+      }
+   }
+}
+
+## Private subroutine to unset child->parent links
+
+sub _unset_child2parent_links {
+   my $self = shift;
+   $self->{'-parent_sequence'} = undef;
+   my $ptree = $self->{'-ptree'};
+   for (@$ptree) {
+      next  unless (length  and  ref  and  ref ne 'SCALAR');
+      $_->_unset_child2parent_links()
+          if UNIVERSAL::isa($_, 'Pod::InteriorSequence');
+   }
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<prepend()>
+
+        $pod_seq->prepend($text);
+        $pod_seq1->prepend($pod_seq2);
+
+Prepends the given string or parse-tree or sequence object to the parse-tree
+of this interior sequence.
+
+=cut
+
+sub prepend {
+   my $self  = shift;
+   $self->{'-ptree'}->prepend(@_);
+   _set_child2parent_links($self, @_);
+   return $self;
+}       
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<append()>
+
+        $pod_seq->append($text);
+        $pod_seq1->append($pod_seq2);
+
+Appends the given string or parse-tree or sequence object to the parse-tree
+of this interior sequence.
+
+=cut
+
+sub append {
+   my $self = shift;
+   $self->{'-ptree'}->append(@_);
+   _set_child2parent_links($self, @_);
+   return $self;
+}       
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<nested()>
+
+        $outer_seq = $pod_seq->nested || print "not nested";
+
+If this interior sequence is nested inside of another interior
+sequence, then the outer/parent sequence that contains it is
+returned. Otherwise C<undef> is returned.
+
+=cut
+
+sub nested {
+   my $self = shift;
+  (@_ == 1)  and  $self->{'-parent_sequence'} = shift;
+   return  $self->{'-parent_sequence'} || undef;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<raw_text()>
+
+        my $seq_raw_text = $pod_seq->raw_text();
+
+This method will return the I<raw> text of the POD interior sequence,
+exactly as it appeared in the input.
+
+=cut
+
+sub raw_text {
+   my $self = shift;
+   my $text = $self->{'-name'} . $self->{'-ldelim'};
+   for ( $self->{'-ptree'}->children ) {
+      $text .= (ref $_) ? $_->raw_text : $_;
+   }
+   $text .= $self->{'-rdelim'};
+   return $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<left_delimiter()>
+
+        my $ldelim = $pod_seq->left_delimiter();
+
+The leftmost delimiter beginning the argument text to the interior
+sequence (should be "<").
+
+=cut
+
+sub left_delimiter {
+   (@_ > 1)  and  $_[0]->{'-ldelim'} = $_[1];
+   return $_[0]->{'-ldelim'};
+}
+
+## let ldelim() be an alias for left_delimiter()
+*ldelim = \&left_delimiter;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<right_delimiter()>
+
+The rightmost delimiter beginning the argument text to the interior
+sequence (should be ">").
+
+=cut
+
+sub right_delimiter {
+   (@_ > 1)  and  $_[0]->{'-rdelim'} = $_[1];
+   return $_[0]->{'-rdelim'};
+}
+
+## let rdelim() be an alias for right_delimiter()
+*rdelim = \&right_delimiter;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<parse_tree()>
+
+        my $ptree = $pod_parser->parse_text($paragraph_text);
+        $pod_seq->parse_tree( $ptree );
+        $ptree = $pod_seq->parse_tree();
+
+This method will get/set the corresponding parse-tree of the interior
+sequence's text.
+
+=cut
+
+sub parse_tree {
+   (@_ > 1)  and  $_[0]->{'-ptree'} = $_[1];
+   return $_[0]->{'-ptree'};
+}       
+
+## let ptree() be an alias for parse_tree()
+*ptree = \&parse_tree;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<file_line()>
+
+        my ($filename, $line_number) = $pod_seq->file_line();
+        my $position = $pod_seq->file_line();
+
+Returns the current filename and line number for the interior sequence
+object.  If called in a list context, it returns a list of two
+elements: first the filename, then the line number. If called in
+a scalar context, it returns a string containing the filename, followed
+by a colon (':'), followed by the line number.
+
+=cut
+
+sub file_line {
+   my @loc = ($_[0]->{'-file'}  || '<unknown-file>',
+              $_[0]->{'-line'}  || 0);
+   return (wantarray) ? @loc : join(':', @loc);
+}
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::InteriorSequence::B<DESTROY()>
+
+This method performs any necessary cleanup for the interior-sequence.
+If you override this method then it is B<imperative> that you invoke
+the parent method from within your own method, otherwise
+I<interior-sequence storage will not be reclaimed upon destruction!>
+
+=cut
+
+sub DESTROY {
+   ## We need to get rid of all child->parent pointers throughout the
+   ## tree so their reference counts will go to zero and they can be
+   ## garbage-collected
+   _unset_child2parent_links(@_);
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::ParseTree;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::ParseTree>
+
+This object corresponds to a tree of parsed POD text. As POD text is
+scanned from left to right, it is parsed into an ordered list of
+text-strings and B<Pod::InteriorSequence> objects (in order of
+appearance). A B<Pod::ParseTree> object corresponds to this list of
+strings and sequences. Each interior sequence in the parse-tree may
+itself contain a parse-tree (since interior sequences may be nested).
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::ParseTree-E<gt>B<new()>
+
+        my $ptree1 = Pod::ParseTree->new;
+        my $ptree2 = new Pod::ParseTree;
+        my $ptree4 = Pod::ParseTree->new($array_ref);
+        my $ptree3 = new Pod::ParseTree($array_ref);
+
+This is a class method that constructs a C<Pod::Parse_tree> object and
+returns a reference to the new parse-tree. If a single-argument is given,
+it must be a reference to an array, and is used to initialize the root
+(top) of the parse tree.
+
+=cut
+
+sub new {
+    ## Determine if we were called via an object-ref or a classname
+    my $this = shift;
+    my $class = ref($this) || $this;
+
+    my $self = (@_ == 1  and  ref $_[0]) ? $_[0] : [];
+
+    ## Bless ourselves into the desired class and perform any initialization
+    bless $self, $class;
+    return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<top()>
+
+        my $top_node = $ptree->top();
+        $ptree->top( $top_node );
+        $ptree->top( @children );
+
+This method gets/sets the top node of the parse-tree. If no arguments are
+given, it returns the topmost node in the tree (the root), which is also
+a B<Pod::ParseTree>. If it is given a single argument that is a reference,
+then the reference is assumed to a parse-tree and becomes the new top node.
+Otherwise, if arguments are given, they are treated as the new list of
+children for the top node.
+
+=cut
+
+sub top {
+   my $self = shift;
+   if (@_ > 0) {
+      @{ $self } = (@_ == 1  and  ref $_[0]) ? ${ @_ } : @_;
+   }
+   return $self;
+}
+
+## let parse_tree() & ptree() be aliases for the 'top' method
+*parse_tree = *ptree = \&top;
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<children()>
+
+This method gets/sets the children of the top node in the parse-tree.
+If no arguments are given, it returns the list (array) of children
+(each of which should be either a string or a B<Pod::InteriorSequence>.
+Otherwise, if arguments are given, they are treated as the new list of
+children for the top node.
+
+=cut
+
+sub children {
+   my $self = shift;
+   if (@_ > 0) {
+      @{ $self } = (@_ == 1  and  ref $_[0]) ? ${ @_ } : @_;
+   }
+   return @{ $self };
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<prepend()>
+
+This method prepends the given text or parse-tree to the current parse-tree.
+If the first item on the parse-tree is text and the argument is also text,
+then the text is prepended to the first item (not added as a separate string).
+Otherwise the argument is added as a new string or parse-tree I<before>
+the current one.
+
+=cut
+
+use vars qw(@ptree);  ## an alias used for performance reasons
+
+sub prepend {
+   my $self = shift;
+   local *ptree = $self;
+   for (@_) {
+      next  unless length;
+      if (@ptree  and  !(ref $ptree[0])  and  !(ref $_)) {
+         $ptree[0] = $_ . $ptree[0];
+      }
+      else {
+         unshift @ptree, $_;
+      }
+   }
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<append()>
+
+This method appends the given text or parse-tree to the current parse-tree.
+If the last item on the parse-tree is text and the argument is also text,
+then the text is appended to the last item (not added as a separate string).
+Otherwise the argument is added as a new string or parse-tree I<after>
+the current one.
+
+=cut
+
+sub append {
+   my $self = shift;
+   local *ptree = $self;
+   my $can_append = @ptree && !(ref $ptree[-1]);
+   for (@_) {
+      if (ref) {
+         push @ptree, $_;
+      }
+      elsif(!length) {
+         next;
+      }
+      elsif ($can_append) {
+         $ptree[-1] .= $_;
+      }
+      else {
+         push @ptree, $_;
+      }
+   }
+}
+
+=head2 $ptree-E<gt>B<raw_text()>
+
+        my $ptree_raw_text = $ptree->raw_text();
+
+This method will return the I<raw> text of the POD parse-tree
+exactly as it appeared in the input.
+
+=cut
+
+sub raw_text {
+   my $self = shift;
+   my $text = "";
+   for ( @$self ) {
+      $text .= (ref $_) ? $_->raw_text : $_;
+   }
+   return $text;
+}
+
+##---------------------------------------------------------------------------
+
+## Private routines to set/unset child->parent links
+
+sub _unset_child2parent_links {
+   my $self = shift;
+   local *ptree = $self;
+   for (@ptree) {
+       next  unless (defined and length  and  ref  and  ref ne 'SCALAR');
+       $_->_unset_child2parent_links()
+           if UNIVERSAL::isa($_, 'Pod::InteriorSequence');
+   }
+}
+
+sub _set_child2parent_links {
+    ## nothing to do, Pod::ParseTrees cant have parent pointers
+}
+
+=head2 Pod::ParseTree::B<DESTROY()>
+
+This method performs any necessary cleanup for the parse-tree.
+If you override this method then it is B<imperative>
+that you invoke the parent method from within your own method,
+otherwise I<parse-tree storage will not be reclaimed upon destruction!>
+
+=cut
+
+sub DESTROY {
+   ## We need to get rid of all child->parent pointers throughout the
+   ## tree so their reference counts will go to zero and they can be
+   ## garbage-collected
+   _unset_child2parent_links(@_);
+}
+
+#############################################################################
+
+=head1 SEE ALSO
+
+See L<Pod::Parser>, L<Pod::Select>
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/LaTeX.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/LaTeX.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/LaTeX.pm	(revision 14489)
@@ -0,0 +1,1876 @@
+package Pod::LaTeX;
+
+=head1 NAME
+
+Pod::LaTeX - Convert Pod data to formatted Latex
+
+=head1 SYNOPSIS
+
+  use Pod::LaTeX;
+  my $parser = Pod::LaTeX->new ( );
+
+  $parser->parse_from_filehandle;
+
+  $parser->parse_from_file ('file.pod', 'file.tex');
+
+=head1 DESCRIPTION
+
+C<Pod::LaTeX> is a module to convert documentation in the Pod format
+into Latex. The L<B<pod2latex>|pod2latex> X<pod2latex> command uses
+this module for translation.
+
+C<Pod::LaTeX> is a derived class from L<Pod::Select|Pod::Select>.
+
+=cut
+
+
+use strict;
+require Pod::ParseUtils;
+use base qw/ Pod::Select /;
+
+# use Data::Dumper; # for debugging
+use Carp;
+
+use vars qw/ $VERSION %HTML_Escapes @LatexSections /;
+
+$VERSION = '0.58';
+
+# Definitions of =headN -> latex mapping
+@LatexSections = (qw/
+		  chapter
+		  section
+		  subsection
+		  subsubsection
+		  paragraph
+		  subparagraph
+		  /);
+
+# Standard escape sequences converted to Latex.
+# The Unicode name of each character is given in the comments.
+# Complete LaTeX set added by Peter Acklam.
+
+%HTML_Escapes = (
+     'sol'    => '\textfractionsolidus{}',  # xxx - or should it be just '/'
+     'verbar' => '|',
+
+     # The stuff below is based on the information available at
+     # http://www.w3.org/TR/html401/sgml/entities.html
+
+     # All characters in the range 0xA0-0xFF of the ISO 8859-1 character set.
+     # Several of these characters require the `textcomp' LaTeX package.
+     'nbsp'   => q|~|,                     # 0xA0 - no-break space = non-breaking space
+     'iexcl'  => q|\textexclamdown{}|,     # 0xA1 - inverted exclamation mark
+     'cent'   => q|\textcent{}|,           # 0xA2 - cent sign
+     'pound'  => q|\textsterling{}|,       # 0xA3 - pound sign
+     'curren' => q|\textcurrency{}|,       # 0xA4 - currency sign
+     'yen'    => q|\textyen{}|,            # 0xA5 - yen sign = yuan sign
+     'brvbar' => q|\textbrokenbar{}|,      # 0xA6 - broken bar = broken vertical bar
+     'sect'   => q|\textsection{}|,        # 0xA7 - section sign
+     'uml'    => q|\textasciidieresis{}|,  # 0xA8 - diaeresis = spacing diaeresis
+     'copy'   => q|\textcopyright{}|,      # 0xA9 - copyright sign
+     'ordf'   => q|\textordfeminine{}|,    # 0xAA - feminine ordinal indicator
+     'laquo'  => q|\guillemotleft{}|,      # 0xAB - left-pointing double angle quotation mark = left pointing guillemet
+     'not'    => q|\textlnot{}|,           # 0xAC - not sign
+     'shy'    => q|\-|,                    # 0xAD - soft hyphen = discretionary hyphen
+     'reg'    => q|\textregistered{}|,     # 0xAE - registered sign = registered trade mark sign
+     'macr'   => q|\textasciimacron{}|,    # 0xAF - macron = spacing macron = overline = APL overbar
+     'deg'    => q|\textdegree{}|,         # 0xB0 - degree sign
+     'plusmn' => q|\textpm{}|,             # 0xB1 - plus-minus sign = plus-or-minus sign
+     'sup2'   => q|\texttwosuperior{}|,    # 0xB2 - superscript two = superscript digit two = squared
+     'sup3'   => q|\textthreesuperior{}|,  # 0xB3 - superscript three = superscript digit three = cubed
+     'acute'  => q|\textasciiacute{}|,     # 0xB4 - acute accent = spacing acute
+     'micro'  => q|\textmu{}|,             # 0xB5 - micro sign
+     'para'   => q|\textparagraph{}|,      # 0xB6 - pilcrow sign = paragraph sign
+     'middot' => q|\textperiodcentered{}|, # 0xB7 - middle dot = Georgian comma = Greek middle dot
+     'cedil'  => q|\c{}|,                  # 0xB8 - cedilla = spacing cedilla
+     'sup1'   => q|\textonesuperior{}|,    # 0xB9 - superscript one = superscript digit one
+     'ordm'   => q|\textordmasculine{}|,   # 0xBA - masculine ordinal indicator
+     'raquo'  => q|\guillemotright{}|,     # 0xBB - right-pointing double angle quotation mark = right pointing guillemet
+     'frac14' => q|\textonequarter{}|,     # 0xBC - vulgar fraction one quarter = fraction one quarter
+     'frac12' => q|\textonehalf{}|,        # 0xBD - vulgar fraction one half = fraction one half
+     'frac34' => q|\textthreequarters{}|,  # 0xBE - vulgar fraction three quarters = fraction three quarters
+     'iquest' => q|\textquestiondown{}|,   # 0xBF - inverted question mark = turned question mark
+     'Agrave' => q|\`A|,                   # 0xC0 - latin capital letter A with grave = latin capital letter A grave
+     'Aacute' => q|\'A|,             # 0xC1 - latin capital letter A with acute
+     'Acirc'  => q|\^A|,             # 0xC2 - latin capital letter A with circumflex
+     'Atilde' => q|\~A|,             # 0xC3 - latin capital letter A with tilde
+     'Auml'   => q|\"A|,             # 0xC4 - latin capital letter A with diaeresis
+     'Aring'  => q|\AA{}|,           # 0xC5 - latin capital letter A with ring above = latin capital letter A ring
+     'AElig'  => q|\AE{}|,           # 0xC6 - latin capital letter AE = latin capital ligature AE
+     'Ccedil' => q|\c{C}|,           # 0xC7 - latin capital letter C with cedilla
+     'Egrave' => q|\`E|,             # 0xC8 - latin capital letter E with grave
+     'Eacute' => q|\'E|,             # 0xC9 - latin capital letter E with acute
+     'Ecirc'  => q|\^E|,             # 0xCA - latin capital letter E with circumflex
+     'Euml'   => q|\"E|,             # 0xCB - latin capital letter E with diaeresis
+     'Igrave' => q|\`I|,             # 0xCC - latin capital letter I with grave
+     'Iacute' => q|\'I|,             # 0xCD - latin capital letter I with acute
+     'Icirc'  => q|\^I|,             # 0xCE - latin capital letter I with circumflex
+     'Iuml'   => q|\"I|,             # 0xCF - latin capital letter I with diaeresis
+     'ETH'    => q|\DH{}|,           # 0xD0 - latin capital letter ETH
+     'Ntilde' => q|\~N|,             # 0xD1 - latin capital letter N with tilde
+     'Ograve' => q|\`O|,             # 0xD2 - latin capital letter O with grave
+     'Oacute' => q|\'O|,             # 0xD3 - latin capital letter O with acute
+     'Ocirc'  => q|\^O|,             # 0xD4 - latin capital letter O with circumflex
+     'Otilde' => q|\~O|,             # 0xD5 - latin capital letter O with tilde
+     'Ouml'   => q|\"O|,             # 0xD6 - latin capital letter O with diaeresis
+     'times'  => q|\texttimes{}|,    # 0xD7 - multiplication sign
+     'Oslash' => q|\O{}|,            # 0xD8 - latin capital letter O with stroke = latin capital letter O slash
+     'Ugrave' => q|\`U|,             # 0xD9 - latin capital letter U with grave
+     'Uacute' => q|\'U|,             # 0xDA - latin capital letter U with acute
+     'Ucirc'  => q|\^U|,             # 0xDB - latin capital letter U with circumflex
+     'Uuml'   => q|\"U|,             # 0xDC - latin capital letter U with diaeresis
+     'Yacute' => q|\'Y|,             # 0xDD - latin capital letter Y with acute
+     'THORN'  => q|\TH{}|,           # 0xDE - latin capital letter THORN
+     'szlig'  => q|\ss{}|,           # 0xDF - latin small letter sharp s = ess-zed
+     'agrave' => q|\`a|,             # 0xE0 - latin small letter a with grave = latin small letter a grave
+     'aacute' => q|\'a|,             # 0xE1 - latin small letter a with acute
+     'acirc'  => q|\^a|,             # 0xE2 - latin small letter a with circumflex
+     'atilde' => q|\~a|,             # 0xE3 - latin small letter a with tilde
+     'auml'   => q|\"a|,             # 0xE4 - latin small letter a with diaeresis
+     'aring'  => q|\aa{}|,           # 0xE5 - latin small letter a with ring above = latin small letter a ring
+     'aelig'  => q|\ae{}|,           # 0xE6 - latin small letter ae = latin small ligature ae
+     'ccedil' => q|\c{c}|,           # 0xE7 - latin small letter c with cedilla
+     'egrave' => q|\`e|,             # 0xE8 - latin small letter e with grave
+     'eacute' => q|\'e|,             # 0xE9 - latin small letter e with acute
+     'ecirc'  => q|\^e|,             # 0xEA - latin small letter e with circumflex
+     'euml'   => q|\"e|,             # 0xEB - latin small letter e with diaeresis
+     'igrave' => q|\`i|,             # 0xEC - latin small letter i with grave
+     'iacute' => q|\'i|,             # 0xED - latin small letter i with acute
+     'icirc'  => q|\^i|,             # 0xEE - latin small letter i with circumflex
+     'iuml'   => q|\"i|,             # 0xEF - latin small letter i with diaeresis
+     'eth'    => q|\dh{}|,           # 0xF0 - latin small letter eth
+     'ntilde' => q|\~n|,             # 0xF1 - latin small letter n with tilde
+     'ograve' => q|\`o|,             # 0xF2 - latin small letter o with grave
+     'oacute' => q|\'o|,             # 0xF3 - latin small letter o with acute
+     'ocirc'  => q|\^o|,             # 0xF4 - latin small letter o with circumflex
+     'otilde' => q|\~o|,             # 0xF5 - latin small letter o with tilde
+     'ouml'   => q|\"o|,             # 0xF6 - latin small letter o with diaeresis
+     'divide' => q|\textdiv{}|,      # 0xF7 - division sign
+     'oslash' => q|\o{}|,            # 0xF8 - latin small letter o with stroke, = latin small letter o slash
+     'ugrave' => q|\`u|,             # 0xF9 - latin small letter u with grave
+     'uacute' => q|\'u|,             # 0xFA - latin small letter u with acute
+     'ucirc'  => q|\^u|,             # 0xFB - latin small letter u with circumflex
+     'uuml'   => q|\"u|,             # 0xFC - latin small letter u with diaeresis
+     'yacute' => q|\'y|,             # 0xFD - latin small letter y with acute
+     'thorn'  => q|\th{}|,           # 0xFE - latin small letter thorn
+     'yuml'   => q|\"y|,             # 0xFF - latin small letter y with diaeresis
+
+     # Latin Extended-B
+     'fnof'   => q|\textflorin{}|,   # latin small f with hook = function = florin
+
+     # Greek
+     'Alpha'    => q|$\mathrm{A}$|,      # greek capital letter alpha
+     'Beta'     => q|$\mathrm{B}$|,      # greek capital letter beta
+     'Gamma'    => q|$\Gamma$|,          # greek capital letter gamma
+     'Delta'    => q|$\Delta$|,          # greek capital letter delta
+     'Epsilon'  => q|$\mathrm{E}$|,      # greek capital letter epsilon
+     'Zeta'     => q|$\mathrm{Z}$|,      # greek capital letter zeta
+     'Eta'      => q|$\mathrm{H}$|,      # greek capital letter eta
+     'Theta'    => q|$\Theta$|,          # greek capital letter theta
+     'Iota'     => q|$\mathrm{I}$|,      # greek capital letter iota
+     'Kappa'    => q|$\mathrm{K}$|,      # greek capital letter kappa
+     'Lambda'   => q|$\Lambda$|,         # greek capital letter lambda
+     'Mu'       => q|$\mathrm{M}$|,      # greek capital letter mu
+     'Nu'       => q|$\mathrm{N}$|,      # greek capital letter nu
+     'Xi'       => q|$\Xi$|,             # greek capital letter xi
+     'Omicron'  => q|$\mathrm{O}$|,      # greek capital letter omicron
+     'Pi'       => q|$\Pi$|,             # greek capital letter pi
+     'Rho'      => q|$\mathrm{R}$|,      # greek capital letter rho
+     'Sigma'    => q|$\Sigma$|,          # greek capital letter sigma
+     'Tau'      => q|$\mathrm{T}$|,      # greek capital letter tau
+     'Upsilon'  => q|$\Upsilon$|,        # greek capital letter upsilon
+     'Phi'      => q|$\Phi$|,            # greek capital letter phi
+     'Chi'      => q|$\mathrm{X}$|,      # greek capital letter chi
+     'Psi'      => q|$\Psi$|,            # greek capital letter psi
+     'Omega'    => q|$\Omega$|,          # greek capital letter omega
+
+     'alpha'    => q|$\alpha$|,          # greek small letter alpha
+     'beta'     => q|$\beta$|,           # greek small letter beta
+     'gamma'    => q|$\gamma$|,          # greek small letter gamma
+     'delta'    => q|$\delta$|,          # greek small letter delta
+     'epsilon'  => q|$\epsilon$|,        # greek small letter epsilon
+     'zeta'     => q|$\zeta$|,           # greek small letter zeta
+     'eta'      => q|$\eta$|,            # greek small letter eta
+     'theta'    => q|$\theta$|,          # greek small letter theta
+     'iota'     => q|$\iota$|,           # greek small letter iota
+     'kappa'    => q|$\kappa$|,          # greek small letter kappa
+     'lambda'   => q|$\lambda$|,         # greek small letter lambda
+     'mu'       => q|$\mu$|,             # greek small letter mu
+     'nu'       => q|$\nu$|,             # greek small letter nu
+     'xi'       => q|$\xi$|,             # greek small letter xi
+     'omicron'  => q|$o$|,               # greek small letter omicron
+     'pi'       => q|$\pi$|,             # greek small letter pi
+     'rho'      => q|$\rho$|,            # greek small letter rho
+#    'sigmaf'   => q||,                  # greek small letter final sigma
+     'sigma'    => q|$\sigma$|,          # greek small letter sigma
+     'tau'      => q|$\tau$|,            # greek small letter tau
+     'upsilon'  => q|$\upsilon$|,        # greek small letter upsilon
+     'phi'      => q|$\phi$|,            # greek small letter phi
+     'chi'      => q|$\chi$|,            # greek small letter chi
+     'psi'      => q|$\psi$|,            # greek small letter psi
+     'omega'    => q|$\omega$|,          # greek small letter omega
+#    'thetasym' => q||,                  # greek small letter theta symbol
+#    'upsih'    => q||,                  # greek upsilon with hook symbol
+#    'piv'      => q||,                  # greek pi symbol
+
+     # General Punctuation
+     'bull'     => q|\textbullet{}|,     # bullet = black small circle
+     # bullet is NOT the same as bullet operator
+     'hellip'   => q|\textellipsis{}|,           # horizontal ellipsis = three dot leader
+     'prime'    => q|\textquotesingle{}|,        # prime = minutes = feet
+     'Prime'    => q|\textquotedbl{}|,           # double prime = seconds = inches
+     'oline'    => q|\textasciimacron{}|,        # overline = spacing overscore
+     'frasl'    => q|\textfractionsolidus{}|,    # fraction slash
+
+     # Letterlike Symbols
+     'weierp'   => q|$\wp$|,                     # script capital P = power set = Weierstrass p
+     'image'    => q|$\Re$|,                     # blackletter capital I = imaginary part
+     'real'     => q|$\Im$|,                     # blackletter capital R = real part symbol
+     'trade'    => q|\texttrademark{}|,          # trade mark sign
+#    'alefsym'  => q||,                          # alef symbol = first transfinite cardinal
+     # alef symbol is NOT the same as hebrew letter alef, although the same
+     # glyph could be used to depict both characters
+
+     # Arrows
+     'larr'     => q|\textleftarrow{}|,          # leftwards arrow
+     'uarr'     => q|\textuparrow{}|,            # upwards arrow
+     'rarr'     => q|\textrightarrow{}|,         # rightwards arrow
+     'darr'     => q|\textdownarrow{}|,          # downwards arrow
+     'harr'     => q|$\leftrightarrow$|,         # left right arrow
+#    'crarr'    => q||,                          # downwards arrow with corner leftwards = carriage return
+     'lArr'     => q|$\Leftarrow$|,              # leftwards double arrow
+     # ISO 10646 does not say that lArr is the same as the 'is implied by'
+     # arrow but also does not have any other character for that function. So
+     # lArr can be used for 'is implied by' as ISOtech suggests
+     'uArr'     => q|$\Uparrow$|,                # upwards double arrow
+     'rArr'     => q|$\Rightarrow$|,             # rightwards double arrow
+     # ISO 10646 does not say this is the 'implies' character but does not
+     # have another character with this function so ? rArr can be used for
+     # 'implies' as ISOtech suggests
+     'dArr'     => q|$\Downarrow$|,              # downwards double arrow
+     'hArr'     => q|$\Leftrightarrow$|,         # left right double arrow
+
+     # Mathematical Operators.
+     # Some of these require the `amssymb' package.
+     'forall'   => q|$\forall$|,                 # for all
+     'part'     => q|$\partial$|,                # partial differential
+     'exist'    => q|$\exists$|,                 # there exists
+     'empty'    => q|$\emptyset$|,               # empty set = null set = diameter
+     'nabla'    => q|$\nabla$|,                  # nabla = backward difference
+     'isin'     => q|$\in$|,                     # element of
+     'notin'    => q|$\notin$|,                  # not an element of
+     'ni'       => q|$\ni$|,                     # contains as member
+     'prod'     => q|$\prod$|,                   # n-ary product = product sign
+     # prod is NOT the same character as 'greek capital letter pi' though the
+     # same glyph might be used for both
+     'sum'      => q|$\sum$|,                    # n-ary sumation
+     # sum is NOT the same character as 'greek capital letter sigma' though
+     # the same glyph might be used for both
+     'minus'    => q|$-$|,                       # minus sign
+     'lowast'   => q|$\ast$|,                    # asterisk operator
+     'radic'    => q|$\surd$|,                   # square root = radical sign
+     'prop'     => q|$\propto$|,                 # proportional to
+     'infin'    => q|$\infty$|,                  # infinity
+     'ang'      => q|$\angle$|,                  # angle
+     'and'      => q|$\wedge$|,                  # logical and = wedge
+     'or'       => q|$\vee$|,                    # logical or = vee
+     'cap'      => q|$\cap$|,                    # intersection = cap
+     'cup'      => q|$\cup$|,                    # union = cup
+     'int'      => q|$\int$|,                    # integral
+     'there4'   => q|$\therefore$|,              # therefore
+     'sim'      => q|$\sim$|,                    # tilde operator = varies with = similar to
+     # tilde operator is NOT the same character as the tilde
+     'cong'     => q|$\cong$|,                   # approximately equal to
+     'asymp'    => q|$\asymp$|,                  # almost equal to = asymptotic to
+     'ne'       => q|$\neq$|,                    # not equal to
+     'equiv'    => q|$\equiv$|,                  # identical to
+     'le'       => q|$\leq$|,                    # less-than or equal to
+     'ge'       => q|$\geq$|,                    # greater-than or equal to
+     'sub'      => q|$\subset$|,                 # subset of
+     'sup'      => q|$\supset$|,                 # superset of
+     # note that nsup, 'not a superset of' is not covered by the Symbol font
+     # encoding and is not included.
+     'nsub'     => q|$\not\subset$|,             # not a subset of
+     'sube'     => q|$\subseteq$|,               # subset of or equal to
+     'supe'     => q|$\supseteq$|,               # superset of or equal to
+     'oplus'    => q|$\oplus$|,                  # circled plus = direct sum
+     'otimes'   => q|$\otimes$|,                 # circled times = vector product
+     'perp'     => q|$\perp$|,                   # up tack = orthogonal to = perpendicular
+     'sdot'     => q|$\cdot$|,                   # dot operator
+     # dot operator is NOT the same character as middle dot
+
+     # Miscellaneous Technical
+     'lceil'    => q|$\lceil$|,                  # left ceiling = apl upstile
+     'rceil'    => q|$\rceil$|,                  # right ceiling
+     'lfloor'   => q|$\lfloor$|,                 # left floor = apl downstile
+     'rfloor'   => q|$\rfloor$|,                 # right floor
+     'lang'     => q|$\langle$|,                 # left-pointing angle bracket = bra
+     # lang is NOT the same character as 'less than' or 'single left-pointing
+     # angle quotation mark'
+     'rang'     => q|$\rangle$|,                 # right-pointing angle bracket = ket
+     # rang is NOT the same character as 'greater than' or 'single
+     # right-pointing angle quotation mark'
+
+     # Geometric Shapes
+     'loz'      => q|$\lozenge$|,                # lozenge
+
+     # Miscellaneous Symbols
+     'spades'   => q|$\spadesuit$|,              # black spade suit
+     'clubs'    => q|$\clubsuit$|,               # black club suit = shamrock
+     'hearts'   => q|$\heartsuit$|,              # black heart suit = valentine
+     'diams'    => q|$\diamondsuit$|,            # black diamond suit
+
+     # C0 Controls and Basic Latin
+     'quot'     => q|"|,                         # quotation mark = APL quote ["]
+     'amp'      => q|\&|,                        # ampersand
+     'lt'       => q|<|,                         # less-than sign
+     'gt'       => q|>|,                         # greater-than sign
+     'OElig'    => q|\OE{}|,                     # latin capital ligature OE
+     'oelig'    => q|\oe{}|,                     # latin small ligature oe
+     'Scaron'   => q|\v{S}|,                     # latin capital letter S with caron
+     'scaron'   => q|\v{s}|,                     # latin small letter s with caron
+     'Yuml'     => q|\"Y|,                       # latin capital letter Y with diaeresis
+     'circ'     => q|\textasciicircum{}|,        # modifier letter circumflex accent
+     'tilde'    => q|\textasciitilde{}|,         # small tilde
+     'ensp'     => q|\phantom{n}|,               # en space
+     'emsp'     => q|\hspace{1em}|,              # em space
+     'thinsp'   => q|\,|,                        # thin space
+     'zwnj'     => q|{}|,                        # zero width non-joiner
+#    'zwj'      => q||,                          # zero width joiner
+#    'lrm'      => q||,                          # left-to-right mark
+#    'rlm'      => q||,                          # right-to-left mark
+     'ndash'    => q|--|,                        # en dash
+     'mdash'    => q|---|,                       # em dash
+     'lsquo'    => q|\textquoteleft{}|,          # left single quotation mark
+     'rsquo'    => q|\textquoteright{}|,         # right single quotation mark
+     'sbquo'    => q|\quotesinglbase{}|,         # single low-9 quotation mark
+     'ldquo'    => q|\textquotedblleft{}|,       # left double quotation mark
+     'rdquo'    => q|\textquotedblright{}|,      # right double quotation mark
+     'bdquo'    => q|\quotedblbase{}|,           # double low-9 quotation mark
+     'dagger'   => q|\textdagger{}|,             # dagger
+     'Dagger'   => q|\textdaggerdbl{}|,          # double dagger
+     'permil'   => q|\textperthousand{}|,        # per mille sign
+     'lsaquo'   => q|\guilsinglleft{}|,          # single left-pointing angle quotation mark
+     'rsaquo'   => q|\guilsinglright{}|,         # single right-pointing angle quotation mark
+     'euro'     => q|\texteuro{}|,               # euro sign
+);
+
+=head1 OBJECT METHODS
+
+The following methods are provided in this module. Methods inherited
+from C<Pod::Select> are not described in the public interface.
+
+=over 4
+
+=begin __PRIVATE__
+
+=item C<initialize>
+
+Initialise the object. This method is subclassed from C<Pod::Parser>.
+The base class method is invoked. This method defines the default
+behaviour of the object unless overridden by supplying arguments to
+the constructor. 
+
+Internal settings are defaulted as well as the public instance data.
+Internal hash values are accessed directly (rather than through
+a method) and start with an underscore.
+
+This method should not be invoked by the user directly.
+
+=end __PRIVATE__
+
+=cut
+
+
+
+#   - An array for nested lists
+
+# Arguments have already been read by this point
+
+sub initialize {
+  my $self = shift;
+
+  # print Dumper($self);
+
+  # Internals
+  $self->{_Lists} = [];             # For nested lists
+  $self->{_suppress_all_para}  = 0; # For =begin blocks
+  $self->{_dont_modify_any_para}=0; # For =begin blocks
+  $self->{_CURRENT_HEAD1}   = '';   # Name of current HEAD1 section
+
+  # Options - only initialise if not already set
+
+  # Cause the '=head1 NAME' field to be treated specially
+  # The contents of the NAME paragraph will be converted
+  # to a section title. All subsequent =head1 will be converted
+  # to =head2 and down. Will not affect =head1's prior to NAME 
+  # Assumes:  'Module - purpose' format
+  # Also creates a purpose field
+  # The name is used for Labeling of the subsequent subsections
+  $self->{ReplaceNAMEwithSection} = 0
+    unless exists $self->{ReplaceNAMEwithSection};
+  $self->{AddPreamble}      = 1    # make full latex document
+    unless exists $self->{AddPreamble};
+  $self->{StartWithNewPage} = 0    # Start new page for pod section
+    unless exists $self->{StartWithNewPage};
+  $self->{TableOfContents}  = 0    # Add table of contents
+    unless exists $self->{TableOfContents};  # only relevent if AddPreamble=1
+   $self->{AddPostamble}     = 1          # Add closing latex code at end
+    unless exists $self->{AddPostamble}; #  effectively end{document} and index
+  $self->{MakeIndex}        = 1         # Add index (only relevant AddPostamble
+    unless exists $self->{MakeIndex};   # and AddPreamble)
+
+  $self->{UniqueLabels}     = 1          # Use label unique for each pod
+    unless exists $self->{UniqueLabels}; # either based on the filename
+                                         # or supplied
+
+  # Control the level of =head1. default is \section
+  # 
+  $self->{Head1Level}     = 1   # Offset in latex sections
+    unless exists $self->{Head1Level}; # 0 is chapter, 2 is subsection
+
+  # Control at which level numbering of sections is turned off
+  # ie subsection becomes subsection*
+  # The numbering is relative to the latex sectioning commands
+  # and is independent of Pod heading level
+  # default is to number \section but not \subsection
+  $self->{LevelNoNum} = 2
+    unless exists $self->{LevelNoNum};
+
+  # Label to be used as prefix to all internal section names
+  # If not defined will attempt to derive it from the filename
+  # This can not happen when running parse_from_filehandle though
+  # hence the ability to set the label externally
+  # The label could then be Pod::Parser_DESCRIPTION or somesuch
+
+  $self->{Label}            = undef # label to be used as prefix
+    unless exists $self->{Label};   # to all internal section names
+
+  # These allow the caller to add arbritrary latex code to
+  # start and end of document. AddPreamble and AddPostamble are ignored
+  # if these are set.
+  # Also MakeIndex and TableOfContents are also ignored.
+  $self->{UserPreamble}     = undef # User supplied start (AddPreamble =1)
+    unless exists $self->{Label};
+  $self->{UserPostamble}    = undef # Use supplied end    (AddPostamble=1)
+    unless exists $self->{Label};
+
+  # Run base initialize
+  $self->SUPER::initialize;
+
+}
+
+=back
+
+=head2 Data Accessors
+
+The following methods are provided for accessing instance data. These
+methods should be used for accessing configuration parameters rather
+than assuming the object is a hash.
+
+Default values can be supplied by using these names as keys to a hash
+of arguments when using the C<new()> constructor.
+
+=over 4
+
+=item B<AddPreamble>
+
+Logical to control whether a C<latex> preamble is to be written.
+If true, a valid C<latex> preamble is written before the pod data is written.
+This is similar to:
+
+  \documentclass{article}
+  \usepackage[T1]{fontenc}
+  \usepackage{textcomp}
+  \begin{document}
+
+but will be more complicated if table of contents and indexing are required.
+Can be used to set or retrieve the current value.
+
+  $add = $parser->AddPreamble();
+  $parser->AddPreamble(1);
+
+If used in conjunction with C<AddPostamble> a full latex document will
+be written that could be immediately processed by C<latex>.
+
+For some pod escapes it may be necessary to include the amsmath
+package. This is not yet added to the preamble automaatically.
+
+=cut
+
+sub AddPreamble {
+   my $self = shift;
+   if (@_) {
+     $self->{AddPreamble} = shift;
+   }
+   return $self->{AddPreamble};
+}
+
+=item B<AddPostamble>
+
+Logical to control whether a standard C<latex> ending is written to the output
+file after the document has been processed.
+In its simplest form this is simply:
+
+  \end{document}
+
+but can be more complicated if a index is required.
+Can be used to set or retrieve the current value.
+
+  $add = $parser->AddPostamble();
+  $parser->AddPostamble(1);
+
+If used in conjunction with C<AddPreaamble> a full latex document will
+be written that could be immediately processed by C<latex>.
+
+=cut
+
+sub AddPostamble {
+   my $self = shift;
+   if (@_) {
+     $self->{AddPostamble} = shift;
+   }
+   return $self->{AddPostamble};
+}
+
+=item B<Head1Level>
+
+The C<latex> sectioning level that should be used to correspond to
+a pod C<=head1> directive. This can be used, for example, to turn
+a C<=head1> into a C<latex> C<subsection>. This should hold a number
+corresponding to the required position in an array containing the
+following elements:
+
+ [0] chapter
+ [1] section
+ [2] subsection
+ [3] subsubsection
+ [4] paragraph
+ [5] subparagraph
+
+Can be used to set or retrieve the current value:
+
+  $parser->Head1Level(2);
+  $sect = $parser->Head1Level;
+
+Setting this number too high can result in sections that may not be reproducible
+in the expected way. For example, setting this to 4 would imply that C<=head3>
+do not have a corresponding C<latex> section (C<=head1> would correspond to
+a C<paragraph>).
+
+A check is made to ensure that the supplied value is an integer in the
+range 0 to 5.
+
+Default is for a value of 1 (i.e. a C<section>).
+
+=cut
+
+sub Head1Level {
+   my $self = shift;
+   if (@_) {
+     my $arg = shift;
+     if ($arg =~ /^\d$/ && $arg <= $#LatexSections) {
+       $self->{Head1Level} = $arg;
+     } else {
+       carp "Head1Level supplied ($arg) must be integer in range 0 to ".$#LatexSections . "- Ignoring\n";
+     }
+   }
+   return $self->{Head1Level};
+}
+
+=item B<Label>
+
+This is the label that is prefixed to all C<latex> label and index
+entries to make them unique. In general, pods have similarly titled
+sections (NAME, DESCRIPTION etc) and a C<latex> label will be multiply
+defined if more than one pod document is to be included in a single
+C<latex> file. To overcome this, this label is prefixed to a label
+whenever a label is required (joined with an underscore) or to an
+index entry (joined by an exclamation mark which is the normal index
+separator). For example, C<\label{text}> becomes C<\label{Label_text}>.
+
+Can be used to set or retrieve the current value:
+
+  $label = $parser->Label;
+  $parser->Label($label);
+
+This label is only used if C<UniqueLabels> is true.
+Its value is set automatically from the C<NAME> field
+if C<ReplaceNAMEwithSection> is true. If this is not the case
+it must be set manually before starting the parse.
+
+Default value is C<undef>.
+
+=cut
+
+sub Label {
+   my $self = shift;
+   if (@_) {
+     $self->{Label} = shift;
+   }
+   return $self->{Label};
+}
+
+=item B<LevelNoNum>
+
+Control the point at which C<latex> section numbering is turned off.
+For example, this can be used to make sure that C<latex> sections
+are numbered but subsections are not.
+
+Can be used to set or retrieve the current value:
+
+  $lev = $parser->LevelNoNum;
+  $parser->LevelNoNum(2);
+
+The argument must be an integer between 0 and 5 and is the same as the
+number described in C<Head1Level> method description. The number has
+nothing to do with the pod heading number, only the C<latex> sectioning.
+
+Default is 2. (i.e. C<latex> subsections are written as C<subsection*>
+but sections are numbered).
+
+=cut
+
+sub LevelNoNum {
+   my $self = shift;
+   if (@_) {
+     $self->{LevelNoNum} = shift;
+   }
+   return $self->{LevelNoNum};
+}
+
+=item B<MakeIndex>
+
+Controls whether C<latex> commands for creating an index are to be inserted
+into the preamble and postamble
+
+  $makeindex = $parser->MakeIndex;
+  $parser->MakeIndex(0);
+
+Irrelevant if both C<AddPreamble> and C<AddPostamble> are false (or equivalently,
+C<UserPreamble> and C<UserPostamble> are set).
+
+Default is for an index to be created.
+
+=cut
+
+sub MakeIndex {
+   my $self = shift;
+   if (@_) {
+     $self->{MakeIndex} = shift;
+   }
+   return $self->{MakeIndex};
+}
+
+=item B<ReplaceNAMEwithSection>
+
+This controls whether the C<NAME> section in the pod is to be translated
+literally or converted to a slightly modified output where the section
+name is the pod name rather than "NAME".
+
+If true, the pod segment
+
+  =head1 NAME
+
+  pod::name - purpose
+
+  =head1 SYNOPSIS
+
+is converted to the C<latex>
+
+  \section{pod::name\label{pod_name}\index{pod::name}}
+
+  Purpose
+
+  \subsection*{SYNOPSIS\label{pod_name_SYNOPSIS}%
+               \index{pod::name!SYNOPSIS}}
+
+(dependent on the value of C<Head1Level> and C<LevelNoNum>). Note that
+subsequent C<head1> directives translate to subsections rather than
+sections and that the labels and index now include the pod name (dependent
+on the value of C<UniqueLabels>).
+
+The C<Label> is set from the pod name regardless of any current value
+of C<Label>.
+
+  $mod = $parser->ReplaceNAMEwithSection;
+  $parser->ReplaceNAMEwithSection(0);
+
+Default is to translate the pod literally.
+
+=cut
+
+sub ReplaceNAMEwithSection {
+   my $self = shift;
+   if (@_) {
+     $self->{ReplaceNAMEwithSection} = shift;
+   }
+   return $self->{ReplaceNAMEwithSection};
+}
+
+=item B<StartWithNewPage>
+
+If true, each pod translation will begin with a C<latex>
+C<\clearpage>.
+
+  $parser->StartWithNewPage(1);
+  $newpage = $parser->StartWithNewPage;
+
+Default is false.
+
+=cut
+
+sub StartWithNewPage {
+   my $self = shift;
+   if (@_) {
+     $self->{StartWithNewPage} = shift;
+   }
+   return $self->{StartWithNewPage};
+}
+
+=item B<TableOfContents>
+
+If true, a table of contents will be created.
+Irrelevant if C<AddPreamble> is false or C<UserPreamble>
+is set.
+
+  $toc = $parser->TableOfContents;
+  $parser->TableOfContents(1);
+
+Default is false.
+
+=cut
+
+sub TableOfContents {
+   my $self = shift;
+   if (@_) {
+     $self->{TableOfContents} = shift;
+   }
+   return $self->{TableOfContents};
+}
+
+=item B<UniqueLabels>
+
+If true, the translator will attempt to make sure that
+each C<latex> label or index entry will be uniquely identified
+by prefixing the contents of C<Label>. This allows
+multiple documents to be combined without clashing 
+common labels such as C<DESCRIPTION> and C<SYNOPSIS>
+
+  $parser->UniqueLabels(1);
+  $unq = $parser->UniqueLabels;
+
+Default is true.
+
+=cut
+
+sub UniqueLabels {
+   my $self = shift;
+   if (@_) {
+     $self->{UniqueLabels} = shift;
+   }
+   return $self->{UniqueLabels};
+}
+
+=item B<UserPreamble>
+
+User supplied C<latex> preamble. Added before the pod translation
+data. 
+
+If set, the contents will be prepended to the output file before the translated 
+data regardless of the value of C<AddPreamble>.
+C<MakeIndex> and C<TableOfContents> will also be ignored.
+
+=cut
+
+sub UserPreamble {
+   my $self = shift;
+   if (@_) {
+     $self->{UserPreamble} = shift;
+   }
+   return $self->{UserPreamble};
+}
+
+=item B<UserPostamble>
+
+User supplied C<latex> postamble. Added after the pod translation
+data. 
+
+If set, the contents will be prepended to the output file after the translated 
+data regardless of the value of C<AddPostamble>.
+C<MakeIndex> will also be ignored.
+
+=cut
+
+sub UserPostamble {
+   my $self = shift;
+   if (@_) {
+     $self->{UserPostamble} = shift;
+   }
+   return $self->{UserPostamble};
+}
+
+=begin __PRIVATE__
+
+=item B<Lists>
+
+Contains details of the currently active lists.
+  The array contains C<Pod::List> objects. A new C<Pod::List>
+object is created each time a list is encountered and it is
+pushed onto this stack. When the list context ends, it 
+is popped from the stack. The array will be empty if no
+lists are active.
+
+Returns array of list information in list context
+Returns array ref in scalar context
+
+=cut
+
+
+
+sub lists {
+  my $self = shift;
+  return @{ $self->{_Lists} } if wantarray();
+  return $self->{_Lists};
+}
+
+=end __PRIVATE__
+
+=back
+
+=begin __PRIVATE__
+
+=head2 Subclassed methods
+
+The following methods override methods provided in the C<Pod::Select>
+base class. See C<Pod::Parser> and C<Pod::Select> for more information
+on what these methods require.
+
+=over 4
+
+=cut
+
+######### END ACCESSORS ###################
+
+# Opening pod
+
+=item B<begin_pod>
+
+Writes the C<latex> preamble if requested. Only writes something
+if AddPreamble is true. Writes a standard header unless a UserPreamble
+is defined.
+
+=cut
+
+sub begin_pod {
+  my $self = shift;
+
+  # Get the pod identification
+  # This should really come from the '=head1 NAME' paragraph
+
+  my $infile = $self->input_file;
+  my $class = ref($self);
+  my $date = gmtime(time);
+
+  # Comment message to say where this came from
+  my $comment = << "__TEX_COMMENT__";
+%%  Latex generated from POD in document $infile
+%%  Using the perl module $class
+%%  Converted on $date
+__TEX_COMMENT__
+
+  # Write the preamble
+  # If the caller has supplied one then we just use that
+
+  my $preamble = '';
+
+  if ($self->AddPreamble) {
+
+    if (defined $self->UserPreamble) {
+
+      $preamble = $self->UserPreamble;
+
+      # Add the description of where this came from
+      $preamble .=  "\n$comment\n%%  Preamble supplied by user.\n\n";
+
+    } else {
+
+      # Write our own preamble
+
+      # Code to initialise index making
+      # Use an array so that we can prepend comment if required
+      my @makeidx = (
+		     '\usepackage{makeidx}',
+		     '\makeindex',
+		    );
+
+      unless ($self->MakeIndex) {
+	foreach (@makeidx) {
+	  $_ = '%% ' . $_;
+	}
+      }
+      my $makeindex = join("\n",@makeidx) . "\n";
+
+      # Table of contents
+      my $tableofcontents = '\tableofcontents';
+
+      $tableofcontents = '%% ' . $tableofcontents
+	unless $self->TableOfContents;
+
+      # Roll our own
+      $preamble = << "__TEX_HEADER__";
+\\documentclass{article}
+\\usepackage[T1]{fontenc}
+\\usepackage{textcomp}
+
+$comment
+
+$makeindex
+
+\\begin{document}
+
+$tableofcontents
+
+__TEX_HEADER__
+
+    }
+  }
+
+  # Write the header (blank if none)
+  $self->_output($preamble);
+
+  # Start on new page if requested
+  $self->_output("\\clearpage\n") if $self->StartWithNewPage;
+
+}
+
+
+=item B<end_pod>
+
+Write the closing C<latex> code. Only writes something if AddPostamble
+is true. Writes a standard header unless a UserPostamble is defined.
+
+=cut
+
+sub end_pod {
+  my $self = shift;
+
+  # End string
+  my $end = '';
+
+  # Use the user version of the postamble if defined
+  if ($self->AddPostamble) {
+
+    if (defined $self->UserPostamble) {
+      $end = $self->UserPostamble;
+
+    } else {
+
+      # Check for index
+      my $makeindex = '\printindex';
+
+      $makeindex = '%% '. $makeindex  unless $self->MakeIndex;
+
+      $end = "$makeindex\n\n\\end{document}\n";
+    }
+  }
+
+  $self->_output($end);
+
+}
+
+=item B<command>
+
+Process basic pod commands.
+
+=cut
+
+sub command {
+  my $self = shift;
+  my ($command, $paragraph, $line_num, $parobj) = @_;
+
+  # return if we dont care
+  return if $command eq 'pod';
+
+  # Store a copy of the raw text in case we are in a =for
+  # block and need to preserve the existing latex
+  my $rawpara = $paragraph;
+
+  # Do the latex escapes
+  $paragraph = $self->_replace_special_chars($paragraph);
+
+  # Interpolate pod sequences in paragraph
+  $paragraph = $self->interpolate($paragraph, $line_num);
+  $paragraph =~ s/\s+$//;
+
+  # Replace characters that can only be done after 
+  # interpolation of interior sequences
+  $paragraph = $self->_replace_special_chars_late($paragraph);
+
+  # Now run the command
+  if ($command eq 'over') {
+
+    $self->begin_list($paragraph, $line_num);
+
+  } elsif ($command eq 'item') {
+
+    $self->add_item($paragraph, $line_num);
+
+  } elsif ($command eq 'back') {
+
+    $self->end_list($line_num);
+
+  } elsif ($command eq 'head1') {
+
+    # Store the name of the section
+    $self->{_CURRENT_HEAD1} = $paragraph;
+
+    # Print it
+    $self->head(1, $paragraph, $parobj);
+
+  } elsif ($command eq 'head2') {
+
+    $self->head(2, $paragraph, $parobj);
+
+  } elsif ($command eq 'head3') {
+
+    $self->head(3, $paragraph, $parobj);
+
+  } elsif ($command eq 'head4') {
+
+    $self->head(4, $paragraph, $parobj);
+
+  } elsif ($command eq 'head5') {
+
+    $self->head(5, $paragraph, $parobj);
+
+  } elsif ($command eq 'head6') {
+
+    $self->head(6, $paragraph, $parobj);
+
+  } elsif ($command eq 'begin') {
+
+    # pass through if latex
+    if ($paragraph =~ /^latex/i) {
+      # Make sure that subsequent paragraphs are not modfied before printing
+      $self->{_dont_modify_any_para} = 1;
+
+    } else {
+      # Suppress all subsequent paragraphs unless 
+      # it is explcitly intended for latex
+      $self->{_suppress_all_para} = 1;
+    }
+
+  } elsif ($command eq 'for') {
+
+    # =for latex
+    #   some latex
+
+    # With =for we will get the text for the full paragraph
+    # as well as the format name.
+    # We do not get an additional paragraph later on. The next
+    # paragraph is not governed by the =for
+
+    # The first line contains the format and the rest is the
+    # raw code.
+    my ($format, $chunk) = split(/\n/, $rawpara, 2);
+
+    # If we have got some latex code print it out immediately
+    # unmodified. Else do nothing.
+    if ($format =~ /^latex/i) {
+      # Make sure that next paragraph is not modfied before printing
+      $self->_output( $chunk );
+
+    }
+
+  } elsif ($command eq 'end') {
+
+    # Reset suppression
+    $self->{_suppress_all_para} = 0;
+    $self->{_dont_modify_any_para} = 0;
+
+  } elsif ($command eq 'pod') {
+
+    # Do nothing
+
+  } else {
+    carp "Command $command not recognised at line $line_num\n";
+  }
+
+}
+
+=item B<verbatim>
+
+Verbatim text
+
+=cut
+
+sub verbatim {
+  my $self = shift;
+  my ($paragraph, $line_num, $parobj) = @_;
+
+  # Expand paragraph unless in =begin block
+  if ($self->{_dont_modify_any_para}) {
+    # Just print as is
+    $self->_output($paragraph);
+
+  } else {
+
+    return if $paragraph =~ /^\s+$/;
+
+    # Clean trailing space
+    $paragraph =~ s/\s+$//;
+
+    # Clean tabs. Routine taken from Tabs.pm
+    # by David Muir Sharnoff muir@idiom.com,
+    # slightly modified by hsmyers@sdragons.com 10/22/01
+    my @l = split("\n",$paragraph);
+    foreach (@l) {
+      1 while s/(^|\n)([^\t\n]*)(\t+)/
+	$1. $2 . (" " x 
+		  (8 * length($3)
+		   - (length($2) % 8)))
+	  /sex;
+    }
+    $paragraph = join("\n",@l);
+    # End of change.
+
+
+
+    $self->_output('\begin{verbatim}' . "\n$paragraph\n". '\end{verbatim}'."\n");
+  }
+}
+
+=item B<textblock>
+
+Plain text paragraph.
+
+=cut
+
+sub textblock {
+  my $self = shift;
+  my ($paragraph, $line_num, $parobj) = @_;
+
+  # print Dumper($self);
+
+  # Expand paragraph unless in =begin block
+  if ($self->{_dont_modify_any_para}) {
+    # Just print as is
+    $self->_output($paragraph);
+
+    return;
+  }
+
+
+  # Escape latex special characters
+  $paragraph = $self->_replace_special_chars($paragraph);
+
+  # Interpolate interior sequences
+  my $expansion = $self->interpolate($paragraph, $line_num);
+  $expansion =~ s/\s+$//;
+
+  # Escape special characters that can not be done earlier
+  $expansion = $self->_replace_special_chars_late($expansion);
+
+  # If we are replacing 'head1 NAME' with a section
+  # we need to look in the paragraph and rewrite things
+  # Need to make sure this is called only on the first paragraph
+  # following 'head1 NAME' and not on subsequent paragraphs that may be
+  # present.
+  if ($self->{_CURRENT_HEAD1} =~ /^NAME/i && $self->ReplaceNAMEwithSection()) {
+
+    # Strip white space from start and end
+    $paragraph =~ s/^\s+//;
+    $paragraph =~ s/\s$//;
+
+    # Split the string into 2 parts
+    my ($name, $purpose) = split(/\s+-\s+/, $expansion,2);
+
+    # Now prevent this from triggering until a new head1 NAME is set
+    $self->{_CURRENT_HEAD1} = '_NAME';
+
+    # Might want to clear the Label() before doing this (CHECK)
+
+    # Print the heading
+    $self->head(1, $name, $parobj);
+
+    # Set the labeling in case we want unique names later
+    $self->Label( $self->_create_label( $name, 1 ) );
+
+    # Raise the Head1Level by one so that subsequent =head1 appear
+    # as subsections of the main name section unless we are already
+    # at maximum [Head1Level() could check this itself - CHECK]
+    $self->Head1Level( $self->Head1Level() + 1)
+      unless $self->Head1Level == $#LatexSections;
+
+    # Now write out the new latex paragraph
+    $purpose = ucfirst($purpose);
+    $self->_output("\n\n$purpose\n\n");
+
+  } else {
+    # Just write the output
+    $self->_output("\n\n$expansion\n\n");
+  }
+
+}
+
+=item B<interior_sequence>
+
+Interior sequence expansion
+
+=cut
+
+sub interior_sequence {
+  my $self = shift;
+
+  my ($seq_command, $seq_argument, $pod_seq) = @_;
+
+  if ($seq_command eq 'B') {
+    return "\\textbf{$seq_argument}";
+
+  } elsif ($seq_command eq 'I') {
+    return "\\textit{$seq_argument}";
+
+  } elsif ($seq_command eq 'E') {
+
+    # If it is simply a number
+    if ($seq_argument =~ /^\d+$/) {
+      return chr($seq_argument);
+    # Look up escape in hash table
+    } elsif (exists $HTML_Escapes{$seq_argument}) {
+      return $HTML_Escapes{$seq_argument};
+
+    } else {
+      my ($file, $line) = $pod_seq->file_line();
+      warn "Escape sequence $seq_argument not recognised at line $line of file $file\n";
+      return;
+    }
+
+  } elsif ($seq_command eq 'Z') {
+
+    # Zero width space
+    return '{}';
+
+  } elsif ($seq_command eq 'C') {
+    return "\\texttt{$seq_argument}";
+
+  } elsif ($seq_command eq 'F') {
+    return "\\emph{$seq_argument}";
+
+  } elsif ($seq_command eq 'S') {
+    # non breakable spaces
+    my $nbsp = '~';
+
+    $seq_argument =~ s/\s/$nbsp/g;
+    return $seq_argument;
+
+  } elsif ($seq_command eq 'L') {
+    my $link = new Pod::Hyperlink($seq_argument);
+
+    # undef on failure
+    unless (defined $link) {
+      carp $@;
+      return;
+    }
+
+    # Handle internal links differently
+    my $type = $link->type;
+    my $page = $link->page;
+
+    if ($type eq 'section' && $page eq '') {
+      # Use internal latex reference 
+      my $node = $link->node;
+
+      # Convert to a label
+      $node = $self->_create_label($node);
+
+      return "\\S\\ref{$node}";
+
+    } else {
+      # Use default markup for external references
+      # (although Starlink would use \xlabel)
+      my $markup = $link->markup;
+      my ($file, $line) = $pod_seq->file_line();
+
+      return $self->interpolate($link->markup, $line);
+    }
+
+
+
+  } elsif ($seq_command eq 'P') {
+    # Special markup for Pod::Hyperlink
+    # Replace :: with / - but not sure if I want to do this
+    # any more.
+    my $link = $seq_argument;
+    $link =~ s|::|/|g;
+
+    my $ref = "\\emph{$seq_argument}";
+    return $ref;
+
+  } elsif ($seq_command eq 'Q') {
+    # Special markup for Pod::Hyperlink
+    return "\\textsf{$seq_argument}";
+
+  } elsif ($seq_command eq 'X') {
+    # Index entries
+
+    # use \index command
+    # I will let '!' go through for now
+    # not sure how sub categories are handled in X<>
+    my $index = $self->_create_index($seq_argument);
+    return "\\index{$index}\n";
+
+  } else {
+    carp "Unknown sequence $seq_command<$seq_argument>";
+  }
+
+}
+
+=back
+
+=head2 List Methods
+
+Methods used to handle lists.
+
+=over 4
+
+=item B<begin_list>
+
+Called when a new list is found (via the C<over> directive).
+Creates a new C<Pod::List> object and stores it on the 
+list stack.
+
+  $parser->begin_list($indent, $line_num);
+
+=cut
+
+sub begin_list {
+  my $self = shift;
+  my $indent = shift;
+  my $line_num = shift;
+
+  # Indicate that a list should be started for the next item
+  # need to do this to work out the type of list
+  push ( @{$self->lists}, new Pod::List(-indent => $indent, 
+					-start => $line_num,
+					-file => $self->input_file,
+				       )	 
+       );
+
+}
+
+=item B<end_list>
+
+Called when the end of a list is found (the C<back> directive).
+Pops the C<Pod::List> object off the stack of lists and writes
+the C<latex> code required to close a list.
+
+  $parser->end_list($line_num);
+
+=cut
+
+sub end_list {
+  my $self = shift;
+  my $line_num = shift;
+
+  unless (defined $self->lists->[-1]) {
+    my $file = $self->input_file;
+    warn "No list is active at line $line_num (file=$file). Missing =over?\n";
+    return;
+  }
+
+  # What to write depends on list type
+  my $type = $self->lists->[-1]->type;
+
+  # Dont write anything if the list type is not set
+  # iomplying that a list was created but no entries were
+  # placed in it (eg because of a =begin/=end combination)
+  $self->_output("\\end{$type}\n")
+    if (defined $type && length($type) > 0);
+  
+  # Clear list
+  pop(@{ $self->lists});
+
+}
+
+=item B<add_item>
+
+Add items to the list. The first time an item is encountered 
+(determined from the state of the current C<Pod::List> object)
+the type of list is determined (ordered, unnumbered or description)
+and the relevant latex code issued.
+
+  $parser->add_item($paragraph, $line_num);
+
+=cut
+
+sub add_item {
+  my $self = shift;
+  my $paragraph = shift;
+  my $line_num = shift;
+
+  unless (defined $self->lists->[-1]) {
+    my $file = $self->input_file;
+    warn "List has already ended by line $line_num of file $file. Missing =over?\n";
+    # Replace special chars
+#    $paragraph = $self->_replace_special_chars($paragraph);
+    $self->_output("$paragraph\n\n");
+    return;
+  }
+
+  # If paragraphs printing is turned off via =begin/=end or whatver
+  # simply return immediately
+  return if $self->{_suppress_all_para};
+
+  # Check to see whether we are starting a new lists
+  if (scalar($self->lists->[-1]->item) == 0) {
+
+    # Examine the paragraph to determine what type of list
+    # we have
+    $paragraph =~ s/\s+$//;
+    $paragraph =~ s/^\s+//;
+
+    my $type;
+    if (substr($paragraph, 0,1) eq '*') {
+      $type = 'itemize';
+    } elsif ($paragraph =~ /^\d/) {
+      $type = 'enumerate';
+    } else {
+      $type = 'description';
+    }
+    $self->lists->[-1]->type($type);
+
+    $self->_output("\\begin{$type}\n");
+
+  }
+
+  my $type = $self->lists->[-1]->type;
+
+  if ($type eq 'description') {
+    # Handle long items - long items do not wrap
+    # If the string is longer than 40 characters we split
+    # it into a real item header and some bold text.
+    my $maxlen = 40;
+    my ($hunk1, $hunk2) = $self->_split_delimited( $paragraph, $maxlen );
+
+    # Print the first hunk
+    $self->_output("\n\\item[{$hunk1}] ");
+
+    # and the second hunk if it is defined
+    if ($hunk2) {
+      $self->_output("\\textbf{$hunk2}");
+    } else {
+      # Not there so make sure we have a new line
+      $self->_output("\\mbox{}");
+    }
+
+  } else {
+    # If the item was '* Something' or '\d+ something' we still need to write
+    # out the something. Also allow 1) and 1.
+    my $extra_info = $paragraph;
+    $extra_info =~ s/^(\*|\d+[\.\)]?)\s*//;
+    $self->_output("\n\\item $extra_info");
+  }
+
+  # Store the item name in the object. Required so that 
+  # we can tell if the list is new or not
+  $self->lists->[-1]->item($paragraph);
+
+}
+
+=back
+
+=head2 Methods for headings
+
+=over 4
+
+=item B<head>
+
+Print a heading of the required level.
+
+  $parser->head($level, $paragraph, $parobj);
+
+The first argument is the pod heading level. The second argument
+is the contents of the heading. The 3rd argument is a Pod::Paragraph
+object so that the line number can be extracted.
+
+=cut
+
+sub head {
+  my $self = shift;
+  my $num = shift;
+  my $paragraph = shift;
+  my $parobj = shift;
+
+  # If we are replace 'head1 NAME' with a section
+  # we return immediately if we get it
+  return 
+    if ($self->{_CURRENT_HEAD1} =~ /^NAME/i && $self->ReplaceNAMEwithSection());
+
+  # Create a label
+  my $label = $self->_create_label($paragraph);
+
+  # Create an index entry
+  my $index = $self->_create_index($paragraph);
+
+  # Work out position in the above array taking into account
+  # that =head1 is equivalent to $self->Head1Level
+
+  my $level = $self->Head1Level() - 1 + $num;
+
+  # Warn if heading to large
+  if ($num > $#LatexSections) {
+    my $line = $parobj->file_line;
+    my $file = $self->input_file;
+    warn "Heading level too large ($level) for LaTeX at line $line of file $file\n";
+    $level = $#LatexSections;
+  }
+
+  # Check to see whether section should be unnumbered
+  my $star = ($level >= $self->LevelNoNum ? '*' : '');
+
+  # Section
+  $self->_output("\\" .$LatexSections[$level] .$star ."{$paragraph\\label{".$label ."}\\index{".$index."}}\n");
+
+}
+
+
+=back
+
+=end __PRIVATE__
+
+=begin __PRIVATE__
+
+=head2 Internal methods
+
+Internal routines are described in this section. They do not form part of the
+public interface. All private methods start with an underscore.
+
+=over 4
+
+=item B<_output>
+
+Output text to the output filehandle. This method must be always be called
+to output parsed text.
+
+   $parser->_output($text);
+
+Does not write anything if a =begin is active that should be
+ignored.
+
+=cut
+
+sub _output { 
+  my $self = shift;
+  my $text = shift;
+
+  print { $self->output_handle } $text
+    unless $self->{_suppress_all_para};
+
+}
+
+
+=item B<_replace_special_chars>
+
+Subroutine to replace characters that are special in C<latex>
+with the escaped forms
+
+  $escaped = $parser->_replace_special_chars($paragraph);
+
+Need to call this routine before interior_sequences are munged but not
+if verbatim. It must be called before interpolation of interior
+sequences so that curly brackets and special latex characters inserted
+during interpolation are not themselves escaped. This means that < and
+> can not be modified here since the text still contains interior
+sequences.
+
+Special characters and the C<latex> equivalents are:
+
+  }     \}
+  {     \{
+  _     \_
+  $     \$
+  %     \%
+  &     \&
+  \     $\backslash$
+  ^     \^{}
+  ~     \~{}
+  #     \#
+
+=cut
+
+sub _replace_special_chars {
+  my $self = shift;
+  my $paragraph = shift;
+
+  # Replace a \ with $\backslash$
+  # This is made more complicated because the dollars will be escaped
+  # by the subsequent replacement. Easiest to add \backslash 
+  # now and then add the dollars
+  $paragraph =~ s/\\/\\backslash/g;
+
+  # Must be done after escape of \ since this command adds latex escapes
+  # Replace characters that can be escaped
+  $paragraph =~ s/([\$\#&%_{}])/\\$1/g;
+
+  # Replace ^ characters with \^{} so that $^F works okay
+  $paragraph =~ s/(\^)/\\$1\{\}/g;
+
+  # Replace tilde (~) with \texttt{\~{}}
+  $paragraph =~ s/~/\\texttt\{\\~\{\}\}/g;
+
+  # Now add the dollars around each \backslash
+  $paragraph =~ s/(\\backslash)/\$$1\$/g;
+  return $paragraph;
+}
+
+=item B<_replace_special_chars_late>
+
+Replace special characters that can not be replaced before interior
+sequence interpolation. See C<_replace_special_chars> for a routine
+to replace special characters prior to interpolation of interior
+sequences.
+
+Does the following transformation:
+
+  <   $<$
+  >   $>$
+  |   $|$
+
+
+=cut
+
+sub _replace_special_chars_late {
+  my $self = shift;
+  my $paragraph = shift;
+
+  # < and >
+  $paragraph =~ s/(<|>)/\$$1\$/g;
+
+  # Replace | with $|$
+  $paragraph =~ s'\|'$|$'g;
+
+
+  return $paragraph;
+}
+
+
+=item B<_create_label>
+
+Return a string that can be used as an internal reference
+in a C<latex> document (i.e. accepted by the C<\label> command)
+
+ $label = $parser->_create_label($string)
+
+If UniqueLabels is true returns a label prefixed by Label()
+This can be suppressed with an optional second argument.
+
+ $label = $parser->_create_label($string, $suppress);
+
+If a second argument is supplied (of any value including undef)
+the Label() is never prefixed. This means that this routine can
+be called to create a Label() without prefixing a previous setting.
+
+=cut
+
+sub _create_label {
+  my $self = shift;
+  my $paragraph = shift;
+  my $suppress = (@_ ? 1 : 0 );
+
+  # Remove latex commands
+  $paragraph = $self->_clean_latex_commands($paragraph);
+
+  # Remove non alphanumerics from the label and replace with underscores
+  # want to protect '-' though so use negated character classes 
+  $paragraph =~ s/[^-:\w]/_/g;
+
+  # Multiple underscores will look unsightly so remove repeats
+  # This will also have the advantage of tidying up the end and
+  # start of string
+  $paragraph =~ s/_+/_/g;
+
+  # If required need to make sure that the label is unique
+  # since it is possible to have multiple pods in a single
+  # document
+  if (!$suppress && $self->UniqueLabels() && defined $self->Label) {
+    $paragraph = $self->Label() .'_'. $paragraph;
+  }
+
+  return $paragraph;
+}
+
+
+=item B<_create_index>
+
+Similar to C<_create_label> except an index entry is created.
+If C<UniqueLabels> is true, the index entry is prefixed by 
+the current C<Label> and an exclamation mark.
+
+  $ind = $parser->_create_index($paragraph);
+
+An exclamation mark is used by C<makeindex> to generate 
+sub-entries in an index.
+
+=cut
+
+sub _create_index {
+  my $self = shift;
+  my $paragraph = shift;
+  my $suppress = (@_ ? 1 : 0 );
+
+  # Remove latex commands
+  $paragraph = $self->_clean_latex_commands($paragraph);
+
+  # If required need to make sure that the index entry is unique
+  # since it is possible to have multiple pods in a single
+  # document
+  if (!$suppress && $self->UniqueLabels() && defined $self->Label) {
+    $paragraph = $self->Label() .'!'. $paragraph;
+  }
+
+  # Need to replace _ with space
+  $paragraph =~ s/_/ /g;
+
+  return $paragraph;
+
+}
+
+=item B<_clean_latex_commands>
+
+Removes latex commands from text. The latex command is assumed to be of the
+form C<\command{ text }>. "C<text>" is retained
+
+  $clean = $parser->_clean_latex_commands($text);
+
+=cut
+
+sub _clean_latex_commands {
+  my $self = shift;
+  my $paragraph = shift;
+
+  # Remove latex commands of the form \text{ }
+  # and replace with the contents of the { }
+  # need to make this non-greedy so that it can handle
+  #  "\text{a} and \text2{b}"
+  # without converting it to
+  #  "a} and \text2{b"
+  # This match will still get into trouble if \} is present 
+  # This is not vital since the subsequent replacement of non-alphanumeric
+  # characters will tidy it up anyway
+  $paragraph =~ s/\\\w+{(.*?)}/$1/g;
+
+  return $paragraph
+}
+
+=item B<_split_delimited>
+
+Split the supplied string into two parts at approximately the
+specified word boundary. Special care is made to make sure that it
+does not split in the middle of some curly brackets.
+
+e.g. "this text is \textbf{very bold}" would not be split into
+"this text is \textbf{very" and " bold".
+
+  ($hunk1, $hunk2) = $self->_split_delimited( $para, $length);
+
+The length indicates the maximum length of hunk1.
+
+=cut
+
+# initially Supplied by hsmyers@sdragons.com
+# 10/25/01, utility to split \hbox
+# busting lines. Reformatted by TimJ to match module style.
+sub _split_delimited {
+  my $self = shift;
+  my $input = shift;
+  my $limit = shift;
+
+  # Return immediately if already small
+  return ($input, '') if length($input) < $limit;
+
+  my @output;
+  my $s = '';
+  my $t = '';
+  my $depth = 0;
+  my $token;
+
+  $input =~ s/\n/ /gm;
+  $input .= ' ';
+  foreach ( split ( //, $input ) ) {
+    $token .= $_;
+    if (/\{/) {
+      $depth++;
+    } elsif ( /}/ ) {
+      $depth--;
+    } elsif ( / / and $depth == 0) {
+      push @output, $token if ( $token and $token ne ' ' );
+      $token = '';
+    }
+  }
+
+  foreach  (@output) {
+    if (length($s) < $limit) {
+      $s .= $_;
+    } else {
+      $t .= $_;
+    }
+  }
+
+  # Tidy up
+  $s =~ s/\s+$//;
+  $t =~ s/\s+$//;
+  return ($s,$t);
+}
+
+=back
+
+=end __PRIVATE__
+
+=head1 NOTES
+
+Compatible with C<latex2e> only. Can not be used with C<latex> v2.09
+or earlier.
+
+A subclass of C<Pod::Select> so that specific pod sections can be
+converted to C<latex> by using the C<select> method.
+
+Some HTML escapes are missing and many have not been tested.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<Pod::Select>, L<pod2latex>
+
+=head1 AUTHORS
+
+Tim Jenness E<lt>tjenness@cpan.orgE<gt>
+
+Bug fixes and improvements have been received from: Simon Cozens
+E<lt>simon@cozens.netE<gt>, Mark A. Hershberger
+E<lt>mah@everybody.orgE<gt>, Marcel Grunauer
+E<lt>marcel@codewerk.comE<gt>, Hugh S Myers
+E<lt>hsmyers@sdragons.comE<gt>, Peter J Acklam
+E<lt>jacklam@math.uio.noE<gt>, Sudhi Herle E<lt>sudhi@herle.netE<gt>,
+Ariel Scolnicov E<lt>ariels@compugen.co.ilE<gt>,
+Adriano Rodrigues Ferreira E<lt>ferreira@triang.com.brE<gt> and
+R. de Vries E<lt>r.de.vries@dutchspace.nlE<gt>.
+
+
+=head1 COPYRIGHT
+
+Copyright (C) 2000-2004 Tim Jenness. All Rights Reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=begin __PRIVATE__
+
+=head1 REVISION
+
+$Id: LaTeX.pm,v 1.19 2004/12/30 01:40:44 timj Exp $
+
+=end __PRIVATE__
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Man.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Man.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Man.pm	(revision 14489)
@@ -0,0 +1,1410 @@
+# Pod::Man -- Convert POD data to formatted *roff input.
+# $Id: Man.pm,v 1.37 2003/03/30 22:34:11 eagle Exp $
+#
+# Copyright 1999, 2000, 2001, 2002, 2003 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module translates POD documentation into *roff markup using the man
+# macro set, and is intended for converting POD documents written as Unix
+# manual pages to manual pages that can be read by the man(1) command.  It is
+# a replacement for the pod2man command distributed with versions of Perl
+# prior to 5.6.
+#
+# Perl core hackers, please note that this module is also separately
+# maintained outside of the Perl core as part of the podlators.  Please send
+# me any patches at the address above in addition to sending them to the
+# standard Perl mailing lists.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::Man;
+
+require 5.005;
+
+use Carp qw(carp croak);
+use Pod::ParseLink qw(parselink);
+use Pod::Parser ();
+
+use strict;
+use subs qw(makespace);
+use vars qw(@ISA %ESCAPES $PREAMBLE $VERSION);
+
+@ISA = qw(Pod::Parser);
+
+# Don't use the CVS revision as the version, since this module is also in Perl
+# core and too many things could munge CVS magic revision strings.  This
+# number should ideally be the same as the CVS revision in podlators, however.
+$VERSION = 1.37;
+
+
+##############################################################################
+# Preamble and *roff output tables
+##############################################################################
+
+# The following is the static preamble which starts all *roff output we
+# generate.  It's completely static except for the font to use as a
+# fixed-width font, which is designed by @CFONT@, and the left and right
+# quotes to use for C<> text, designated by @LQOUTE@ and @RQUOTE@.  $PREAMBLE
+# should therefore be run through s/\@CFONT\@/<font>/g before output.
+$PREAMBLE = <<'----END OF PREAMBLE----';
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft @CFONT@
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  | will give a
+.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
+.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
+.\" expand to `' in nroff, nothing in troff, for use with C<>.
+.tr \(*W-|\(bv\*(Tr
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` @LQUOTE@
+.    ds C' @RQUOTE@
+'br\}
+.el\{\
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
+'br\}
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD.  Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.if \nF \{\
+.    de IX
+.    tm Index:\\$1\t\\n%\t"\\$2"
+..
+.    nr % 0
+.    rr F
+.\}
+.\"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.hy 0
+.if n .na
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.    \" fudge factors for nroff and troff
+.if n \{\
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
+.\}
+.if t \{\
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
+.\}
+.    \" simple accents for nroff and troff
+.if n \{\
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
+.\}
+.if t \{\
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+.    \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.    \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.    \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+----END OF PREAMBLE----
+#`# for cperl-mode
+
+# This table is taken nearly verbatim from Tom Christiansen's pod2man.  It
+# assumes that the standard preamble has already been printed, since that's
+# what defines all of the accent marks.  Note that some of these are quoted
+# with double quotes since they contain embedded single quotes, so use \\
+# uniformly for backslash for readability.
+%ESCAPES = (
+    'amp'       =>    '&',      # ampersand
+    'apos'      =>    "'",      # apostrophe
+    'lt'        =>    '<',      # left chevron, less-than
+    'gt'        =>    '>',      # right chevron, greater-than
+    'quot'      =>    '"',      # double quote
+    'sol'       =>    '/',      # solidus (forward slash)
+    'verbar'    =>    '|',      # vertical bar
+
+    'Aacute'    =>    "A\\*'",  # capital A, acute accent
+    'aacute'    =>    "a\\*'",  # small a, acute accent
+    'Acirc'     =>    'A\\*^',  # capital A, circumflex accent
+    'acirc'     =>    'a\\*^',  # small a, circumflex accent
+    'AElig'     =>    '\*(AE',  # capital AE diphthong (ligature)
+    'aelig'     =>    '\*(ae',  # small ae diphthong (ligature)
+    'Agrave'    =>    "A\\*`",  # capital A, grave accent
+    'agrave'    =>    "A\\*`",  # small a, grave accent
+    'Aring'     =>    'A\\*o',  # capital A, ring
+    'aring'     =>    'a\\*o',  # small a, ring
+    'Atilde'    =>    'A\\*~',  # capital A, tilde
+    'atilde'    =>    'a\\*~',  # small a, tilde
+    'Auml'      =>    'A\\*:',  # capital A, dieresis or umlaut mark
+    'auml'      =>    'a\\*:',  # small a, dieresis or umlaut mark
+    'Ccedil'    =>    'C\\*,',  # capital C, cedilla
+    'ccedil'    =>    'c\\*,',  # small c, cedilla
+    'Eacute'    =>    "E\\*'",  # capital E, acute accent
+    'eacute'    =>    "e\\*'",  # small e, acute accent
+    'Ecirc'     =>    'E\\*^',  # capital E, circumflex accent
+    'ecirc'     =>    'e\\*^',  # small e, circumflex accent
+    'Egrave'    =>    'E\\*`',  # capital E, grave accent
+    'egrave'    =>    'e\\*`',  # small e, grave accent
+    'ETH'       =>    '\\*(D-', # capital Eth, Icelandic
+    'eth'       =>    '\\*(d-', # small eth, Icelandic
+    'Euml'      =>    'E\\*:',  # capital E, dieresis or umlaut mark
+    'euml'      =>    'e\\*:',  # small e, dieresis or umlaut mark
+    'Iacute'    =>    "I\\*'",  # capital I, acute accent
+    'iacute'    =>    "i\\*'",  # small i, acute accent
+    'Icirc'     =>    'I\\*^',  # capital I, circumflex accent
+    'icirc'     =>    'i\\*^',  # small i, circumflex accent
+    'Igrave'    =>    'I\\*`',  # capital I, grave accent
+    'igrave'    =>    'i\\*`',  # small i, grave accent
+    'Iuml'      =>    'I\\*:',  # capital I, dieresis or umlaut mark
+    'iuml'      =>    'i\\*:',  # small i, dieresis or umlaut mark
+    'Ntilde'    =>    'N\*~',   # capital N, tilde
+    'ntilde'    =>    'n\*~',   # small n, tilde
+    'Oacute'    =>    "O\\*'",  # capital O, acute accent
+    'oacute'    =>    "o\\*'",  # small o, acute accent
+    'Ocirc'     =>    'O\\*^',  # capital O, circumflex accent
+    'ocirc'     =>    'o\\*^',  # small o, circumflex accent
+    'Ograve'    =>    'O\\*`',  # capital O, grave accent
+    'ograve'    =>    'o\\*`',  # small o, grave accent
+    'Oslash'    =>    'O\\*/',  # capital O, slash
+    'oslash'    =>    'o\\*/',  # small o, slash
+    'Otilde'    =>    'O\\*~',  # capital O, tilde
+    'otilde'    =>    'o\\*~',  # small o, tilde
+    'Ouml'      =>    'O\\*:',  # capital O, dieresis or umlaut mark
+    'ouml'      =>    'o\\*:',  # small o, dieresis or umlaut mark
+    'szlig'     =>    '\*8',    # small sharp s, German (sz ligature)
+    'THORN'     =>    '\\*(Th', # capital THORN, Icelandic
+    'thorn'     =>    '\\*(th', # small thorn, Icelandic
+    'Uacute'    =>    "U\\*'",  # capital U, acute accent
+    'uacute'    =>    "u\\*'",  # small u, acute accent
+    'Ucirc'     =>    'U\\*^',  # capital U, circumflex accent
+    'ucirc'     =>    'u\\*^',  # small u, circumflex accent
+    'Ugrave'    =>    'U\\*`',  # capital U, grave accent
+    'ugrave'    =>    'u\\*`',  # small u, grave accent
+    'Uuml'      =>    'U\\*:',  # capital U, dieresis or umlaut mark
+    'uuml'      =>    'u\\*:',  # small u, dieresis or umlaut mark
+    'Yacute'    =>    "Y\\*'",  # capital Y, acute accent
+    'yacute'    =>    "y\\*'",  # small y, acute accent
+    'yuml'      =>    'y\\*:',  # small y, dieresis or umlaut mark
+
+    'nbsp'      =>    '\\ ',    # non-breaking space
+    'shy'       =>    '',       # soft (discretionary) hyphen
+);
+
+
+##############################################################################
+# Static helper functions
+##############################################################################
+
+# Protect leading quotes and periods against interpretation as commands.  Also
+# protect anything starting with a backslash, since it could expand or hide
+# something that *roff would interpret as a command.  This is overkill, but
+# it's much simpler than trying to parse *roff here.
+sub protect {
+    local $_ = shift;
+    s/^([.\'\\])/\\&$1/mg;
+    $_;
+}
+
+# Translate a font string into an escape.
+sub toescape { (length ($_[0]) > 1 ? '\f(' : '\f') . $_[0] }
+
+
+##############################################################################
+# Initialization
+##############################################################################
+
+# Initialize the object.  Here, we also process any additional options passed
+# to the constructor or set up defaults if none were given.  center is the
+# centered title, release is the version number, and date is the date for the
+# documentation.  Note that we can't know what file name we're processing due
+# to the architecture of Pod::Parser, so that *has* to either be passed to the
+# constructor or set separately with Pod::Man::name().
+sub initialize {
+    my $self = shift;
+
+    # Figure out the fixed-width font.  If user-supplied, make sure that they
+    # are the right length.
+    for (qw/fixed fixedbold fixeditalic fixedbolditalic/) {
+        if (defined $$self{$_}) {
+            if (length ($$self{$_}) < 1 || length ($$self{$_}) > 2) {
+                croak qq(roff font should be 1 or 2 chars,)
+                    . qq( not "$$self{$_}");
+            }
+        } else {
+            $$self{$_} = '';
+        }
+    }
+
+    # Set the default fonts.  We can't be sure what fixed bold-italic is going
+    # to be called, so default to just bold.
+    $$self{fixed}           ||= 'CW';
+    $$self{fixedbold}       ||= 'CB';
+    $$self{fixeditalic}     ||= 'CI';
+    $$self{fixedbolditalic} ||= 'CB';
+
+    # Set up a table of font escapes.  First number is fixed-width, second is
+    # bold, third is italic.
+    $$self{FONTS} = { '000' => '\fR', '001' => '\fI',
+                      '010' => '\fB', '011' => '\f(BI',
+                      '100' => toescape ($$self{fixed}),
+                      '101' => toescape ($$self{fixeditalic}),
+                      '110' => toescape ($$self{fixedbold}),
+                      '111' => toescape ($$self{fixedbolditalic})};
+
+    # Extra stuff for page titles.
+    $$self{center} = 'User Contributed Perl Documentation'
+        unless defined $$self{center};
+    $$self{indent} = 4 unless defined $$self{indent};
+
+    # We used to try first to get the version number from a local binary, but
+    # we shouldn't need that any more.  Get the version from the running Perl.
+    # Work a little magic to handle subversions correctly under both the
+    # pre-5.6 and the post-5.6 version numbering schemes.
+    if (!defined $$self{release}) {
+        my @version = ($] =~ /^(\d+)\.(\d{3})(\d{0,3})$/);
+        $version[2] ||= 0;
+        $version[2] *= 10 ** (3 - length $version[2]);
+        for (@version) { $_ += 0 }
+        $$self{release} = 'perl v' . join ('.', @version);
+    }
+
+    # Double quotes in things that will be quoted.
+    for (qw/center date release/) {
+        $$self{$_} =~ s/\"/\"\"/g if $$self{$_};
+    }
+
+    # Figure out what quotes we'll be using for C<> text.
+    $$self{quotes} ||= '"';
+    if ($$self{quotes} eq 'none') {
+        $$self{LQUOTE} = $$self{RQUOTE} = '';
+    } elsif (length ($$self{quotes}) == 1) {
+        $$self{LQUOTE} = $$self{RQUOTE} = $$self{quotes};
+    } elsif ($$self{quotes} =~ /^(.)(.)$/
+             || $$self{quotes} =~ /^(..)(..)$/) {
+        $$self{LQUOTE} = $1;
+        $$self{RQUOTE} = $2;
+    } else {
+        croak qq(Invalid quote specification "$$self{quotes}");
+    }
+
+    # Double the first quote; note that this should not be s///g as two double
+    # quotes is represented in *roff as three double quotes, not four.  Weird,
+    # I know.
+    $$self{LQUOTE} =~ s/\"/\"\"/;
+    $$self{RQUOTE} =~ s/\"/\"\"/;
+
+    $self->SUPER::initialize;
+}
+
+# For each document we process, output the preamble first.
+sub begin_pod {
+    my $self = shift;
+
+    # Try to figure out the name and section from the file name.
+    my $section = $$self{section} || 1;
+    my $name = $$self{name};
+    if (!defined $name) {
+        $name = $self->input_file;
+        $section = 3 if (!$$self{section} && $name =~ /\.pm\z/i);
+        $name =~ s/\.p(od|[lm])\z//i;
+        if ($section !~ /^3/) {
+            require File::Basename;
+            $name = uc File::Basename::basename ($name);
+        } else {
+            # Assume that we're dealing with a module.  We want to figure out
+            # the full module name from the path to the file, but we don't
+            # want to include too much of the path into the module name.  Lose
+            # everything up to the first of:
+            #
+            #     */lib/*perl*/         standard or site_perl module
+            #     */*perl*/lib/         from -Dprefix=/opt/perl
+            #     */*perl*/             random module hierarchy
+            #
+            # which works.  Also strip off a leading site or site_perl
+            # component, any OS-specific component, and any version number
+            # component, and strip off an initial component of "lib" or
+            # "blib/lib" since that's what ExtUtils::MakeMaker creates.
+            # splitdir requires at least File::Spec 0.8.
+            require File::Spec;
+            my ($volume, $dirs, $file) = File::Spec->splitpath ($name);
+            my @dirs = File::Spec->splitdir ($dirs);
+            my $cut = 0;
+            my $i;
+            for ($i = 0; $i < scalar @dirs; $i++) {
+                if ($dirs[$i] eq 'lib' && $dirs[$i + 1] =~ /perl/) {
+                    $cut = $i + 2;
+                    last;
+                } elsif ($dirs[$i] =~ /perl/) {
+                    $cut = $i + 1;
+                    $cut++ if $dirs[$i + 1] eq 'lib';
+                    last;
+                }
+            }
+            if ($cut > 0) {
+                splice (@dirs, 0, $cut);
+                shift @dirs if ($dirs[0] =~ /^site(_perl)?$/);
+                shift @dirs if ($dirs[0] =~ /^[\d.]+$/);
+                shift @dirs if ($dirs[0] =~ /^(.*-$^O|$^O-.*|$^O)$/);
+            }
+            shift @dirs if $dirs[0] eq 'lib';
+            splice (@dirs, 0, 2) if ($dirs[0] eq 'blib' && $dirs[1] eq 'lib');
+
+            # Remove empty directories when building the module name; they
+            # occur too easily on Unix by doubling slashes.
+            $name = join ('::', (grep { $_ ? $_ : () } @dirs), $file);
+        }
+    }
+
+    # If $name contains spaces, quote it; this mostly comes up in the case of
+    # input from stdin.
+    $name = '"' . $name . '"' if ($name =~ /\s/);
+
+    # Modification date header.  Try to use the modification time of our
+    # input.
+    if (!defined $$self{date}) {
+        my $time = (stat $self->input_file)[9] || time;
+        my ($day, $month, $year) = (localtime $time)[3,4,5];
+        $month++;
+        $year += 1900;
+        $$self{date} = sprintf ('%4d-%02d-%02d', $year, $month, $day);
+    }
+
+    # Now, print out the preamble and the title.  The meaning of the arguments
+    # to .TH unfortunately vary by system; some systems consider the fourth
+    # argument to be a "source" and others use it as a version number.
+    # Generally it's just presented as the left-side footer, though, so it
+    # doesn't matter too much if a particular system gives it another
+    # interpretation.
+    #
+    # The order of date and release used to be reversed in older versions of
+    # this module, but this order is correct for both Solaris and Linux.
+    local $_ = $PREAMBLE;
+    s/\@CFONT\@/$$self{fixed}/;
+    s/\@LQUOTE\@/$$self{LQUOTE}/;
+    s/\@RQUOTE\@/$$self{RQUOTE}/;
+    chomp $_;
+    my $pversion = $Pod::Parser::VERSION;
+    print { $self->output_handle } <<"----END OF HEADER----";
+.\\" Automatically generated by Pod::Man v$VERSION, Pod::Parser v$pversion
+.\\"
+.\\" Standard preamble:
+.\\" ========================================================================
+$_
+.\\" ========================================================================
+.\\"
+.IX Title "$name $section"
+.TH $name $section "$$self{date}" "$$self{release}" "$$self{center}"
+----END OF HEADER----
+
+    # Initialize a few per-file variables.
+    $$self{INDENT}    = 0;      # Current indentation level.
+    $$self{INDENTS}   = [];     # Stack of indentations.
+    $$self{INDEX}     = [];     # Index keys waiting to be printed.
+    $$self{IN_NAME}   = 0;      # Whether processing the NAME section.
+    $$self{ITEMS}     = 0;      # The number of consecutive =items.
+    $$self{ITEMTYPES} = [];     # Stack of =item types, one per list.
+    $$self{SHIFTWAIT} = 0;      # Whether there is a shift waiting.
+    $$self{SHIFTS}    = [];     # Stack of .RS shifts.
+}
+
+
+##############################################################################
+# Core overrides
+##############################################################################
+
+# Called for each command paragraph.  Gets the command, the associated
+# paragraph, the line number, and a Pod::Paragraph object.  Just dispatches
+# the command to a method named the same as the command.  =cut is handled
+# internally by Pod::Parser.
+sub command {
+    my $self = shift;
+    my $command = shift;
+    return if $command eq 'pod';
+    return if ($$self{EXCLUDE} && $command ne 'end');
+    if ($self->can ('cmd_' . $command)) {
+        $command = 'cmd_' . $command;
+        $self->$command (@_);
+    } else {
+        my ($text, $line, $paragraph) = @_;
+        my $file;
+        ($file, $line) = $paragraph->file_line;
+        $text =~ s/\n+\z//;
+        $text = " $text" if ($text =~ /^\S/);
+        warn qq($file:$line: Unknown command paragraph "=$command$text"\n);
+        return;
+    }
+}
+
+# Called for a verbatim paragraph.  Gets the paragraph, the line number, and a
+# Pod::Paragraph object.  Rofficate backslashes, untabify, put a zero-width
+# character at the beginning of each line to protect against commands, and
+# wrap in .Vb/.Ve.
+sub verbatim {
+    my $self = shift;
+    return if $$self{EXCLUDE};
+    local $_ = shift;
+    return if /^\s+$/;
+    s/\s+$/\n/;
+    my $lines = tr/\n/\n/;
+    1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me;
+    s/\\/\\e/g;
+    s/^(\s*\S)/'\&' . $1/gme;
+    $self->makespace;
+    $self->output (".Vb $lines\n$_.Ve\n");
+    $$self{NEEDSPACE} = 1;
+}
+
+# Called for a regular text block.  Gets the paragraph, the line number, and a
+# Pod::Paragraph object.  Perform interpolation and output the results.
+sub textblock {
+    my $self = shift;
+    return if $$self{EXCLUDE};
+    $self->output ($_[0]), return if $$self{VERBATIM};
+
+    # Parse the tree.  collapse knows about references to scalars as well as
+    # scalars and does the right thing with them.  Tidy up any trailing
+    # whitespace.
+    my $text = shift;
+    $text = $self->parse ($text, @_);
+    $text =~ s/\n\s*$/\n/;
+
+    # Output the paragraph.  We also have to handle =over without =item.  If
+    # there's an =over without =item, SHIFTWAIT will be set, and we need to
+    # handle creation of the indent here.  Add the shift to SHIFTS so that it
+    # will be cleaned up on =back.
+    $self->makespace;
+    if ($$self{SHIFTWAIT}) {
+        $self->output (".RS $$self{INDENT}\n");
+        push (@{ $$self{SHIFTS} }, $$self{INDENT});
+        $$self{SHIFTWAIT} = 0;
+    }
+    $self->output (protect $self->textmapfonts ($text));
+    $self->outindex;
+    $$self{NEEDSPACE} = 1;
+}
+
+# Called for a formatting code.  Takes a Pod::InteriorSequence object and
+# returns a reference to a scalar.  This scalar is the final formatted text.
+# It's returned as a reference to an array so that other formatting codes
+# above us know that the text has already been processed.
+sub sequence {
+    my ($self, $seq) = @_;
+    my $command = $seq->cmd_name;
+
+    # We have to defer processing of the inside of an L<> formatting code.  If
+    # this code is nested inside an L<> code, return the literal raw text of
+    # it.
+    my $parent = $seq->nested;
+    while (defined $parent) {
+        return $seq->raw_text if ($parent->cmd_name eq 'L');
+        $parent = $parent->nested;
+    }
+
+    # Zero-width characters.
+    return [ '\&' ] if ($command eq 'Z');
+
+    # C<>, L<>, X<>, and E<> don't apply guesswork to their contents.  C<>
+    # needs some additional special handling.
+    my $literal = ($command =~ /^[CELX]$/);
+    local $_ = $self->collapse ($seq->parse_tree, $literal, $command eq 'C');
+
+    # Handle E<> escapes.  Numeric escapes that match one of the supported ISO
+    # 8859-1 characters don't work at present.
+    if ($command eq 'E') {
+        if (/^\d+$/) {
+            return [ chr ($_) ];
+        } elsif (exists $ESCAPES{$_}) {
+            return [ $ESCAPES{$_} ];
+        } else {
+            my ($file, $line) = $seq->file_line;
+            warn "$file:$line: Unknown escape E<$_>\n";
+            return [ "E<$_>" ];
+        }
+    }
+
+    # For all the other codes, empty content produces no output.
+    return '' if $_ eq '';
+
+    # Handle simple formatting codes.
+    if ($command eq 'B') {
+        return [ '\f(BS' . $_ . '\f(BE' ];
+    } elsif ($command eq 'F' || $command eq 'I') {
+        return [ '\f(IS' . $_ . '\f(IE' ];
+    } elsif ($command eq 'C') {
+        return [ $self->quote_literal ($_) ];
+    }
+
+    # Handle links.
+    if ($command eq 'L') {
+        my ($text, $type) = (parselink ($_))[1,4];
+        return '' unless $text;
+        my ($file, $line) = $seq->file_line;
+        $text = $self->parse ($text, $line);
+        $text = '<' . $text . '>' if $type eq 'url';
+        return [ $text ];
+    }
+
+    # Whitespace protection replaces whitespace with "\ ".
+    if ($command eq 'S') {
+        s/\s+/\\ /g;
+        return [ $_ ];
+    }
+
+    # Add an index entry to the list of ones waiting to be output.
+    if ($command eq 'X') {
+        push (@{ $$self{INDEX} }, $_);
+        return '';
+    }
+
+    # Anything else is unknown.
+    my ($file, $line) = $seq->file_line;
+    warn "$file:$line: Unknown formatting code $command<$_>\n";
+}
+
+
+##############################################################################
+# Command paragraphs
+##############################################################################
+
+# All command paragraphs take the paragraph and the line number.
+
+# First level heading.  We can't output .IX in the NAME section due to a bug
+# in some versions of catman, so don't output a .IX for that section.  .SH
+# already uses small caps, so remove \s1 and \s-1.  Maintain IN_NAME as
+# appropriate, but don't leave it set while calling parse() so as to not
+# override guesswork on section headings after NAME.
+sub cmd_head1 {
+    my $self = shift;
+    $$self{IN_NAME} = 0;
+    local $_ = $self->parse (@_);
+    s/\s+$//;
+    s/\\s-?\d//g;
+    s/\s*\n\s*/ /g;
+    if ($$self{ITEMS} > 1) {
+        $$self{ITEMS} = 0;
+        $self->output (".PD\n");
+    }
+    $self->output ($self->switchquotes ('.SH', $self->mapfonts ($_)));
+    $self->outindex (($_ eq 'NAME') ? () : ('Header', $_));
+    $$self{NEEDSPACE} = 0;
+    $$self{IN_NAME} = ($_ eq 'NAME');
+}
+
+# Second level heading.
+sub cmd_head2 {
+    my $self = shift;
+    local $_ = $self->parse (@_);
+    s/\s+$//;
+    s/\s*\n\s*/ /g;
+    if ($$self{ITEMS} > 1) {
+        $$self{ITEMS} = 0;
+        $self->output (".PD\n");
+    }
+    $self->output ($self->switchquotes ('.Sh', $self->mapfonts ($_)));
+    $self->outindex ('Subsection', $_);
+    $$self{NEEDSPACE} = 0;
+}
+
+# Third level heading.
+sub cmd_head3 {
+    my $self = shift;
+    local $_ = $self->parse (@_);
+    s/\s+$//;
+    s/\s*\n\s*/ /g;
+    if ($$self{ITEMS} > 1) {
+        $$self{ITEMS} = 0;
+        $self->output (".PD\n");
+    }
+    $self->makespace;
+    $self->output ($self->textmapfonts ('\f(IS' . $_ . '\f(IE') . "\n");
+    $self->outindex ('Subsection', $_);
+    $$self{NEEDSPACE} = 1;
+}
+
+# Fourth level heading.
+sub cmd_head4 {
+    my $self = shift;
+    local $_ = $self->parse (@_);
+    s/\s+$//;
+    s/\s*\n\s*/ /g;
+    if ($$self{ITEMS} > 1) {
+        $$self{ITEMS} = 0;
+        $self->output (".PD\n");
+    }
+    $self->makespace;
+    $self->output ($self->textmapfonts ($_) . "\n");
+    $self->outindex ('Subsection', $_);
+    $$self{NEEDSPACE} = 1;
+}
+
+# Start a list.  For indents after the first, wrap the outside indent in .RS
+# so that hanging paragraph tags will be correct.
+sub cmd_over {
+    my $self = shift;
+    local $_ = shift;
+    unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} }
+    if (@{ $$self{SHIFTS} } < @{ $$self{INDENTS} }) {
+        $self->output (".RS $$self{INDENT}\n");
+        push (@{ $$self{SHIFTS} }, $$self{INDENT});
+    }
+    push (@{ $$self{INDENTS} }, $$self{INDENT});
+    push (@{ $$self{ITEMTYPES} }, 'unknown');
+    $$self{INDENT} = ($_ + 0);
+    $$self{SHIFTWAIT} = 1;
+}
+
+# End a list.  If we've closed an embedded indent, we've mangled the hanging
+# paragraph indent, so temporarily replace it with .RS and set WEIRDINDENT.
+# We'll close that .RS at the next =back or =item.
+sub cmd_back {
+    my $self = shift;
+    $$self{INDENT} = pop @{ $$self{INDENTS} };
+    if (defined $$self{INDENT}) {
+        pop @{ $$self{ITEMTYPES} };
+    } else {
+        my ($file, $line, $paragraph) = @_;
+        ($file, $line) = $paragraph->file_line;
+        warn "$file:$line: Unmatched =back\n";
+        $$self{INDENT} = 0;
+    }
+    if (@{ $$self{SHIFTS} } > @{ $$self{INDENTS} }) {
+        $self->output (".RE\n");
+        pop @{ $$self{SHIFTS} };
+    }
+    if (@{ $$self{INDENTS} } > 0) {
+        $self->output (".RE\n");
+        $self->output (".RS $$self{INDENT}\n");
+    }
+    $$self{NEEDSPACE} = 1;
+    $$self{SHIFTWAIT} = 0;
+}
+
+# An individual list item.  Emit an index entry for anything that's
+# interesting, but don't emit index entries for things like bullets and
+# numbers.  rofficate bullets too while we're at it (so for nice output, use *
+# for your lists rather than o or . or - or some other thing).  Newlines in an
+# item title are turned into spaces since *roff can't handle them embedded.
+sub cmd_item {
+    my $self = shift;
+    local $_ = $self->parse (@_);
+    s/\s+$//;
+    s/\s*\n\s*/ /g;
+    my $index;
+    if (/\w/ && !/^\w[.\)]\s*$/) {
+        $index = $_;
+        $index =~ s/^\s*[-*+o.]?(?:\s+|\Z)//;
+    }
+    $_ = '*' unless length ($_) > 0;
+    my $type = $$self{ITEMTYPES}[0];
+    unless (defined $type) {
+        my ($file, $line, $paragraph) = @_;
+        ($file, $line) = $paragraph->file_line;
+        $type = 'unknown';
+    }
+    if ($type eq 'unknown') {
+        $type = /^\*\s*\Z/ ? 'bullet' : 'text';
+        $$self{ITEMTYPES}[0] = $type if $$self{ITEMTYPES}[0];
+    }
+    s/^\*\s*\Z/\\\(bu/ if $type eq 'bullet';
+    if (@{ $$self{SHIFTS} } == @{ $$self{INDENTS} }) {
+        $self->output (".RE\n");
+        pop @{ $$self{SHIFTS} };
+    }
+    $_ = $self->textmapfonts ($_);
+    $self->output (".PD 0\n") if ($$self{ITEMS} == 1);
+    $self->output ($self->switchquotes ('.IP', $_, $$self{INDENT}));
+    $self->outindex ($index ? ('Item', $index) : ());
+    $$self{NEEDSPACE} = 0;
+    $$self{ITEMS}++;
+    $$self{SHIFTWAIT} = 0;
+}
+
+# Begin a block for a particular translator.  Setting VERBATIM triggers
+# special handling in textblock().
+sub cmd_begin {
+    my $self = shift;
+    local $_ = shift;
+    my ($kind) = /^(\S+)/ or return;
+    if ($kind eq 'man' || $kind eq 'roff') {
+        $$self{VERBATIM} = 1;
+    } else {
+        $$self{EXCLUDE} = 1;
+    }
+}
+
+# End a block for a particular translator.  We assume that all =begin/=end
+# pairs are properly closed.
+sub cmd_end {
+    my $self = shift;
+    $$self{EXCLUDE} = 0;
+    $$self{VERBATIM} = 0;
+}
+
+# One paragraph for a particular translator.  Ignore it unless it's intended
+# for man or roff, in which case we output it verbatim.
+sub cmd_for {
+    my $self = shift;
+    local $_ = shift;
+    return unless s/^(?:man|roff)\b[ \t]*\n?//;
+    $self->output ($_);
+}
+
+
+##############################################################################
+# Escaping and fontification
+##############################################################################
+
+# At this point, we'll have embedded font codes of the form \f(<font>[SE]
+# where <font> is one of B, I, or F.  Turn those into the right font start or
+# end codes.  The old pod2man didn't get B<someI<thing> else> right; after I<>
+# it switched back to normal text rather than bold.  We take care of this by
+# using variables as a combined pointer to our current font sequence, and set
+# each to the number of current nestings of start tags for that font.  Use
+# them as a vector to look up what font sequence to use.
+#
+# \fP changes to the previous font, but only one previous font is kept.  We
+# don't know what the outside level font is; normally it's R, but if we're
+# inside a heading it could be something else.  So arrange things so that the
+# outside font is always the "previous" font and end with \fP instead of \fR.
+# Idea from Zack Weinberg.
+sub mapfonts {
+    my $self = shift;
+    local $_ = shift;
+
+    my ($fixed, $bold, $italic) = (0, 0, 0);
+    my %magic = (F => \$fixed, B => \$bold, I => \$italic);
+    my $last = '\fR';
+    s { \\f\((.)(.) } {
+        my $sequence = '';
+        my $f;
+        if ($last ne '\fR') { $sequence = '\fP' }
+        ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1;
+        $f = $$self{FONTS}{($fixed && 1) . ($bold && 1) . ($italic && 1)};
+        if ($f eq $last) {
+            '';
+        } else {
+            if ($f ne '\fR') { $sequence .= $f }
+            $last = $f;
+            $sequence;
+        }
+    }gxe;
+    $_;
+}
+
+# Unfortunately, there is a bug in Solaris 2.6 nroff (not present in GNU
+# groff) where the sequence \fB\fP\f(CW\fP leaves the font set to B rather
+# than R, presumably because \f(CW doesn't actually do a font change.  To work
+# around this, use a separate textmapfonts for text blocks where the default
+# font is always R and only use the smart mapfonts for headings.
+sub textmapfonts {
+    my $self = shift;
+    local $_ = shift;
+
+    my ($fixed, $bold, $italic) = (0, 0, 0);
+    my %magic = (F => \$fixed, B => \$bold, I => \$italic);
+    s { \\f\((.)(.) } {
+        ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1;
+        $$self{FONTS}{($fixed && 1) . ($bold && 1) . ($italic && 1)};
+    }gxe;
+    $_;
+}
+
+
+##############################################################################
+# *roff-specific parsing and magic
+##############################################################################
+
+# Called instead of parse_text, calls parse_text with the right flags.
+sub parse {
+    my $self = shift;
+    $self->parse_text ({ -expand_seq   => 'sequence',
+                         -expand_ptree => 'collapse' }, @_);
+}
+
+# Takes a parse tree, a flag saying whether or not to treat it as literal text
+# (not call guesswork on it), and a flag saying whether or not to clean some
+# things up for *roff, and returns the concatenation of all of the text
+# strings in that parse tree.  If the literal flag isn't true, guesswork()
+# will be called on all plain scalars in the parse tree.  Otherwise, if
+# collapse is being called on a C<> code, $cleanup should be set to true and
+# some additional cleanup will be done.  Assumes that everything in the parse
+# tree is either a scalar or a reference to a scalar.
+sub collapse {
+    my ($self, $ptree, $literal, $cleanup) = @_;
+
+    # If we're processing the NAME section, don't do normal guesswork.  This
+    # is because NAME lines are often extracted by utilities like catman that
+    # require plain text and don't understand *roff markup.  We still need to
+    # escape backslashes and hyphens for *roff (and catman expects \- instead
+    # of -).
+    if ($$self{IN_NAME}) {
+        $literal = 1;
+        $cleanup = 1;
+    }
+
+    # Do the collapse of the parse tree as described above.
+    return join ('', map {
+        if (ref $_) {
+            join ('', @$_);
+        } elsif ($literal) {
+            if ($cleanup) {
+                s/\\/\\e/g;
+                s/-/\\-/g;
+                s/__/_\\|_/g;
+            }
+            $_;
+        } else {
+            $self->guesswork ($_);
+        }
+    } $ptree->children);
+}
+
+# Takes a text block to perform guesswork on; this is guaranteed not to
+# contain any formatting codes.  Returns the text block with remapping done.
+sub guesswork {
+    my $self = shift;
+    local $_ = shift;
+
+    # rofficate backslashes.
+    s/\\/\\e/g;
+
+    # Ensure double underbars have a tiny space between them.
+    s/__/_\\|_/g;
+
+    # Leave hyphens only if they're part of regular words and there is only
+    # one dash at a time.  Leave a dash after the first character as a regular
+    # non-breaking dash, but don't let it mark the rest of the word invalid
+    # for hyphenation.
+    s/-/\\-/g;
+    s{
+      ( (?:\G|^|\s) [a-zA-Z] ) ( \\- )?
+      ( (?: [a-zA-Z]+ \\-)+ )
+      ( [a-zA-Z]+ ) (?=\s|\Z)
+      \b
+     } {
+         my ($prefix, $hyphen, $main, $suffix) = ($1, $2, $3, $4);
+         $hyphen ||= '';
+         $main =~ s/\\-/-/g;
+         $prefix . $hyphen . $main . $suffix;
+    }egx;
+
+    # Translate -- into a real em dash if it's used like one.
+    s{ (\s) \\-\\- (\s) }                         { $1 . '\*(--' . $2 }egx;
+    s{ (\b[a-zA-Z]+) \\-\\- (\s|\Z|[a-zA-Z]+\b) } { $1 . '\*(--' . $2 }egx;
+
+    # Make all caps a little smaller.  Be careful here, since we don't want to
+    # make @ARGV into small caps, nor do we want to fix the MIME in
+    # MIME-Version, since it looks weird with the full-height V.
+    s{
+        ( ^ | [\s\(\"\'\`\[\{<>] )
+        ( [A-Z] [A-Z] (?: [/A-Z+:\d_\$&] | \\- )* )
+        (?= [\s>\}\]\(\)\'\".?!,;] | \\*\(-- | $ )
+    } { $1 . '\s-1' . $2 . '\s0' }egx;
+
+    # Italize functions in the form func().
+    s{
+        ( \b | \\s-1 )
+        (
+            [A-Za-z_] ([:\w]|\\s-?[01])+ \(\)
+        )
+    } { $1 . '\f(IS' . $2 . '\f(IE' }egx;
+
+    # func(n) is a reference to a manual page.  Make it \fIfunc\fR\|(n).
+    s{
+        ( \b | \\s-1 )
+        ( [A-Za-z_] (?:[.:\w]|\\-|\\s-?[01])+ )
+        (
+            \( \d [a-z]* \)
+        )
+    } { $1 . '\f(IS' . $2 . '\f(IE\|' . $3 }egx;
+
+    # Convert simple Perl variable references to a fixed-width font.
+    s{
+        ( \s+ )
+        ( [\$\@%] [\w:]+ )
+        (?! \( )
+    } { $1 . '\f(FS' . $2 . '\f(FE'}egx;
+
+    # Fix up double quotes.
+    s{ \" ([^\"]+) \" } { '\*(L"' . $1 . '\*(R"' }egx;
+
+    # Make C++ into \*(C+, which is a squinched version.
+    s{ \b C\+\+ } {\\*\(C+}gx;
+
+    # All done.
+    $_;
+}
+
+# Handles C<> text, deciding whether to put \*C` around it or not.  This is a
+# whole bunch of messy heuristics to try to avoid overquoting, originally from
+# Barrie Slaymaker.  This largely duplicates similar code in Pod::Text.
+sub quote_literal {
+    my $self = shift;
+    local $_ = shift;
+
+    # A regex that matches the portion of a variable reference that's the
+    # array or hash index, separated out just because we want to use it in
+    # several places in the following regex.
+    my $index = '(?: \[.*\] | \{.*\} )?';
+
+    # Check for things that we don't want to quote, and if we find any of
+    # them, return the string with just a font change and no quoting.
+    m{
+      ^\s*
+      (?:
+         ( [\'\`\"] ) .* \1                             # already quoted
+       | \` .* \'                                       # `quoted'
+       | \$+ [\#^]? \S $index                           # special ($^Foo, $")
+       | [\$\@%&*]+ \#? [:\'\w]+ $index                 # plain var or func
+       | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call
+       | [+-]? ( \d[\d.]* | \.\d+ ) (?: [eE][+-]?\d+ )? # a number
+       | 0x [a-fA-F\d]+                                 # a hex constant
+      )
+      \s*\z
+     }xo && return '\f(FS' . $_ . '\f(FE';
+
+    # If we didn't return, go ahead and quote the text.
+    return '\f(FS\*(C`' . $_ . "\\*(C'\\f(FE";
+}
+
+
+##############################################################################
+# Output formatting
+##############################################################################
+
+# Make vertical whitespace.
+sub makespace {
+    my $self = shift;
+    $self->output (".PD\n") if ($$self{ITEMS} > 1);
+    $$self{ITEMS} = 0;
+    $self->output ($$self{INDENT} > 0 ? ".Sp\n" : ".PP\n")
+        if $$self{NEEDSPACE};
+}
+
+# Output any pending index entries, and optionally an index entry given as an
+# argument.  Support multiple index entries in X<> separated by slashes, and
+# strip special escapes from index entries.
+sub outindex {
+    my ($self, $section, $index) = @_;
+    my @entries = map { split m%\s*/\s*% } @{ $$self{INDEX} };
+    return unless ($section || @entries);
+    $$self{INDEX} = [];
+    my @output;
+    if (@entries) {
+        push (@output, [ 'Xref', join (' ', @entries) ]);
+    }
+    if ($section) {
+        $index =~ s/\\-/-/g;
+        $index =~ s/\\(?:s-?\d|.\(..|.)//g;
+        push (@output, [ $section, $index ]);
+    }
+    for (@output) {
+        my ($type, $entry) = @$_;
+        $entry =~ s/\"/\"\"/g;
+        $self->output (".IX $type " . '"' . $entry . '"' . "\n");
+    }
+}
+
+# Output text to the output device.
+sub output { print { $_[0]->output_handle } $_[1] }
+
+# Given a command and a single argument that may or may not contain double
+# quotes, handle double-quote formatting for it.  If there are no double
+# quotes, just return the command followed by the argument in double quotes.
+# If there are double quotes, use an if statement to test for nroff, and for
+# nroff output the command followed by the argument in double quotes with
+# embedded double quotes doubled.  For other formatters, remap paired double
+# quotes to LQUOTE and RQUOTE.
+sub switchquotes {
+    my $self = shift;
+    my $command = shift;
+    local $_ = shift;
+    my $extra = shift;
+    s/\\\*\([LR]\"/\"/g;
+
+    # We also have to deal with \*C` and \*C', which are used to add the
+    # quotes around C<> text, since they may expand to " and if they do this
+    # confuses the .SH macros and the like no end.  Expand them ourselves.
+    # Also separate troff from nroff if there are any fixed-width fonts in use
+    # to work around problems with Solaris nroff.
+    my $c_is_quote = ($$self{LQUOTE} =~ /\"/) || ($$self{RQUOTE} =~ /\"/);
+    my $fixedpat = join ('|', @{ $$self{FONTS} }{'100', '101', '110', '111'});
+    $fixedpat =~ s/\\/\\\\/g;
+    $fixedpat =~ s/\(/\\\(/g;
+    if (/\"/ || /$fixedpat/) {
+        s/\"/\"\"/g;
+        my $nroff = $_;
+        my $troff = $_;
+        $troff =~ s/\"\"([^\"]*)\"\"/\`\`$1\'\'/g;
+        if ($c_is_quote && /\\\*\(C[\'\`]/) {
+            $nroff =~ s/\\\*\(C\`/$$self{LQUOTE}/g;
+            $nroff =~ s/\\\*\(C\'/$$self{RQUOTE}/g;
+            $troff =~ s/\\\*\(C[\'\`]//g;
+        }
+        $nroff = qq("$nroff") . ($extra ? " $extra" : '');
+        $troff = qq("$troff") . ($extra ? " $extra" : '');
+
+        # Work around the Solaris nroff bug where \f(CW\fP leaves the font set
+        # to Roman rather than the actual previous font when used in headings.
+        # troff output may still be broken, but at least we can fix nroff by
+        # just switching the font changes to the non-fixed versions.
+        $nroff =~ s/\Q$$self{FONTS}{100}\E(.*)\\f[PR]/$1/g;
+        $nroff =~ s/\Q$$self{FONTS}{101}\E(.*)\\f([PR])/\\fI$1\\f$2/g;
+        $nroff =~ s/\Q$$self{FONTS}{110}\E(.*)\\f([PR])/\\fB$1\\f$2/g;
+        $nroff =~ s/\Q$$self{FONTS}{111}\E(.*)\\f([PR])/\\f\(BI$1\\f$2/g;
+
+        # Now finally output the command.  Only bother with .ie if the nroff
+        # and troff output isn't the same.
+        if ($nroff ne $troff) {
+            return ".ie n $command $nroff\n.el $command $troff\n";
+        } else {
+            return "$command $nroff\n";
+        }
+    } else {
+        $_ = qq("$_") . ($extra ? " $extra" : '');
+        return "$command $_\n";
+    }
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Man - Convert POD data to formatted *roff input
+
+=head1 SYNOPSIS
+
+    use Pod::Man;
+    my $parser = Pod::Man->new (release => $VERSION, section => 8);
+
+    # Read POD from STDIN and write to STDOUT.
+    $parser->parse_from_filehandle;
+
+    # Read POD from file.pod and write to file.1.
+    $parser->parse_from_file ('file.pod', 'file.1');
+
+=head1 DESCRIPTION
+
+Pod::Man is a module to convert documentation in the POD format (the
+preferred language for documenting Perl) into *roff input using the man
+macro set.  The resulting *roff code is suitable for display on a terminal
+using L<nroff(1)>, normally via L<man(1)>, or printing using L<troff(1)>.
+It is conventionally invoked using the driver script B<pod2man>, but it can
+also be used directly.
+
+As a derived class from Pod::Parser, Pod::Man supports the same methods and
+interfaces.  See L<Pod::Parser> for all the details; briefly, one creates a
+new parser with C<< Pod::Man->new() >> and then calls either
+parse_from_filehandle() or parse_from_file().
+
+new() can take options, in the form of key/value pairs that control the
+behavior of the parser.  See below for details.
+
+If no options are given, Pod::Man uses the name of the input file with any
+trailing C<.pod>, C<.pm>, or C<.pl> stripped as the man page title, to
+section 1 unless the file ended in C<.pm> in which case it defaults to
+section 3, to a centered title of "User Contributed Perl Documentation", to
+a centered footer of the Perl version it is run with, and to a left-hand
+footer of the modification date of its input (or the current date if given
+STDIN for input).
+
+Pod::Man assumes that your *roff formatters have a fixed-width font named
+CW.  If yours is called something else (like CR), use the C<fixed> option to
+specify it.  This generally only matters for troff output for printing.
+Similarly, you can set the fonts used for bold, italic, and bold italic
+fixed-width output.
+
+Besides the obvious pod conversions, Pod::Man also takes care of formatting
+func(), func(3), and simple variable references like $foo or @bar so you
+don't have to use code escapes for them; complex expressions like
+C<$fred{'stuff'}> will still need to be escaped, though.  It also translates
+dashes that aren't used as hyphens into en dashes, makes long dashes--like
+this--into proper em dashes, fixes "paired quotes," makes C++ look right,
+puts a little space between double underbars, makes ALLCAPS a teeny bit
+smaller in B<troff>, and escapes stuff that *roff treats as special so that
+you don't have to.
+
+The recognized options to new() are as follows.  All options take a single
+argument.
+
+=over 4
+
+=item center
+
+Sets the centered page header to use instead of "User Contributed Perl
+Documentation".
+
+=item date
+
+Sets the left-hand footer.  By default, the modification date of the input
+file will be used, or the current date if stat() can't find that file (the
+case if the input is from STDIN), and the date will be formatted as
+YYYY-MM-DD.
+
+=item fixed
+
+The fixed-width font to use for vertabim text and code.  Defaults to CW.
+Some systems may want CR instead.  Only matters for B<troff> output.
+
+=item fixedbold
+
+Bold version of the fixed-width font.  Defaults to CB.  Only matters for
+B<troff> output.
+
+=item fixeditalic
+
+Italic version of the fixed-width font (actually, something of a misnomer,
+since most fixed-width fonts only have an oblique version, not an italic
+version).  Defaults to CI.  Only matters for B<troff> output.
+
+=item fixedbolditalic
+
+Bold italic (probably actually oblique) version of the fixed-width font.
+Pod::Man doesn't assume you have this, and defaults to CB.  Some systems
+(such as Solaris) have this font available as CX.  Only matters for B<troff>
+output.
+
+=item name
+
+Set the name of the manual page.  Without this option, the manual name is
+set to the uppercased base name of the file being converted unless the
+manual section is 3, in which case the path is parsed to see if it is a Perl
+module path.  If it is, a path like C<.../lib/Pod/Man.pm> is converted into
+a name like C<Pod::Man>.  This option, if given, overrides any automatic
+determination of the name.
+
+=item quotes
+
+Sets the quote marks used to surround CE<lt>> text.  If the value is a
+single character, it is used as both the left and right quote; if it is two
+characters, the first character is used as the left quote and the second as
+the right quoted; and if it is four characters, the first two are used as
+the left quote and the second two as the right quote.
+
+This may also be set to the special value C<none>, in which case no quote
+marks are added around CE<lt>> text (but the font is still changed for troff
+output).
+
+=item release
+
+Set the centered footer.  By default, this is the version of Perl you run
+Pod::Man under.  Note that some system an macro sets assume that the
+centered footer will be a modification date and will prepend something like
+"Last modified: "; if this is the case, you may want to set C<release> to
+the last modified date and C<date> to the version number.
+
+=item section
+
+Set the section for the C<.TH> macro.  The standard section numbering
+convention is to use 1 for user commands, 2 for system calls, 3 for
+functions, 4 for devices, 5 for file formats, 6 for games, 7 for
+miscellaneous information, and 8 for administrator commands.  There is a lot
+of variation here, however; some systems (like Solaris) use 4 for file
+formats, 5 for miscellaneous information, and 7 for devices.  Still others
+use 1m instead of 8, or some mix of both.  About the only section numbers
+that are reliably consistent are 1, 2, and 3.
+
+By default, section 1 will be used unless the file ends in .pm in which case
+section 3 will be selected.
+
+=back
+
+The standard Pod::Parser method parse_from_filehandle() takes up to two
+arguments, the first being the file handle to read POD from and the second
+being the file handle to write the formatted output to.  The first defaults
+to STDIN if not given, and the second defaults to STDOUT.  The method
+parse_from_file() is almost identical, except that its two arguments are the
+input and output disk files instead.  See L<Pod::Parser> for the specific
+details.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item roff font should be 1 or 2 chars, not "%s"
+
+(F) You specified a *roff font (using C<fixed>, C<fixedbold>, etc.) that
+wasn't either one or two characters.  Pod::Man doesn't support *roff fonts
+longer than two characters, although some *roff extensions do (the canonical
+versions of B<nroff> and B<troff> don't either).
+
+=item Invalid link %s
+
+(W) The POD source contained a C<LE<lt>E<gt>> formatting code that
+Pod::Man was unable to parse.  You should never see this error message; it
+probably indicates a bug in Pod::Man.
+
+=item Invalid quote specification "%s"
+
+(F) The quote specification given (the quotes option to the constructor) was
+invalid.  A quote specification must be one, two, or four characters long.
+
+=item %s:%d: Unknown command paragraph "%s".
+
+(W) The POD source contained a non-standard command paragraph (something of
+the form C<=command args>) that Pod::Man didn't know about.  It was ignored.
+
+=item %s:%d: Unknown escape EE<lt>%sE<gt>
+
+(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::Man didn't
+know about.  C<EE<lt>%sE<gt>> was printed verbatim in the output.
+
+=item %s:%d: Unknown formatting code %s
+
+(W) The POD source contained a non-standard formatting code (something of
+the form C<XE<lt>E<gt>>) that Pod::Man didn't know about.  It was ignored.
+
+=item %s:%d: Unmatched =back
+
+(W) Pod::Man encountered a C<=back> command that didn't correspond to an
+C<=over> command.
+
+=back
+
+=head1 BUGS
+
+Eight-bit input data isn't handled at all well at present.  The correct
+approach would be to map EE<lt>E<gt> escapes to the appropriate UTF-8
+characters and then do a translation pass on the output according to the
+user-specified output character set.  Unfortunately, we can't send eight-bit
+data directly to the output unless the user says this is okay, since some
+vendor *roff implementations can't handle eight-bit data.  If the *roff
+implementation can, however, that's far superior to the current hacked
+characters that only work under troff.
+
+There is currently no way to turn off the guesswork that tries to format
+unmarked text appropriately, and sometimes it isn't wanted (particularly
+when using POD to document something other than Perl).
+
+The NAME section should be recognized specially and index entries emitted
+for everything in that section.  This would have to be deferred until the
+next section, since extraneous things in NAME tends to confuse various man
+page processors.
+
+Pod::Man doesn't handle font names longer than two characters.  Neither do
+most B<troff> implementations, but GNU troff does as an extension.  It would
+be nice to support as an option for those who want to use it.
+
+The preamble added to each output file is rather verbose, and most of it is
+only necessary in the presence of EE<lt>E<gt> escapes for non-ASCII
+characters.  It would ideally be nice if all of those definitions were only
+output if needed, perhaps on the fly as the characters are used.
+
+Pod::Man is excessively slow.
+
+=head1 CAVEATS
+
+The handling of hyphens and em dashes is somewhat fragile, and one may get
+the wrong one under some circumstances.  This should only matter for
+B<troff> output.
+
+When and whether to use small caps is somewhat tricky, and Pod::Man doesn't
+necessarily get it right.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<perlpod(1)>, L<pod2man(1)>, L<nroff(1)>, L<troff(1)>,
+L<man(1)>, L<man(7)>
+
+Ossanna, Joseph F., and Brian W. Kernighan.  "Troff User's Manual,"
+Computing Science Technical Report No. 54, AT&T Bell Laboratories.  This is
+the best documentation of standard B<nroff> and B<troff>.  At the time of
+this writing, it's available at
+L<http://www.cs.bell-labs.com/cm/cs/cstr.html>.
+
+The man page documenting the man macro set may be L<man(5)> instead of
+L<man(7)> on your system.  Also, please see L<pod2man(1)> for extensive
+documentation on writing manual pages if you've not done it before and
+aren't familiar with the conventions.
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>, based I<very> heavily on the original
+B<pod2man> by Tom Christiansen <tchrist@mox.perl.com>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1999, 2000, 2001, 2002, 2003 by Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/ParseLink.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/ParseLink.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/ParseLink.pm	(revision 14489)
@@ -0,0 +1,184 @@
+# Pod::ParseLink -- Parse an L<> formatting code in POD text.
+# $Id: ParseLink.pm,v 1.6 2002/07/15 05:46:00 eagle Exp $
+#
+# Copyright 2001 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module implements parsing of the text of an L<> formatting code as
+# defined in perlpodspec.  It should be suitable for any POD formatter.  It
+# exports only one function, parselink(), which returns the five-item parse
+# defined in perlpodspec.
+#
+# Perl core hackers, please note that this module is also separately
+# maintained outside of the Perl core as part of the podlators.  Please send
+# me any patches at the address above in addition to sending them to the
+# standard Perl mailing lists.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::ParseLink;
+
+require 5.004;
+
+use strict;
+use vars qw(@EXPORT @ISA $VERSION);
+
+use Exporter;
+@ISA    = qw(Exporter);
+@EXPORT = qw(parselink);
+
+# Don't use the CVS revision as the version, since this module is also in Perl
+# core and too many things could munge CVS magic revision strings.  This
+# number should ideally be the same as the CVS revision in podlators, however.
+$VERSION = 1.06;
+
+
+##############################################################################
+# Implementation
+##############################################################################
+
+# Parse the name and section portion of a link into a name and section.
+sub _parse_section {
+    my ($link) = @_;
+    $link =~ s/^\s+//;
+    $link =~ s/\s+$//;
+
+    # If the whole link is enclosed in quotes, interpret it all as a section
+    # even if it contains a slash.
+    return (undef, $1) if ($link =~ /^"\s*(.*?)\s*"$/);
+
+    # Split into page and section on slash, and then clean up quoting in the
+    # section.  If there is no section and the name contains spaces, also
+    # guess that it's an old section link.
+    my ($page, $section) = split (/\s*\/\s*/, $link, 2);
+    $section =~ s/^"\s*(.*?)\s*"$/$1/ if $section;
+    if ($page && $page =~ / / && !defined ($section)) {
+        $section = $page;
+        $page = undef;
+    } else {
+        $page = undef unless $page;
+        $section = undef unless $section;
+    }
+    return ($page, $section);
+}
+
+# Infer link text from the page and section.
+sub _infer_text {
+    my ($page, $section) = @_;
+    my $inferred;
+    if ($page && !$section) {
+        $inferred = $page;
+    } elsif (!$page && $section) {
+        $inferred = '"' . $section . '"';
+    } elsif ($page && $section) {
+        $inferred = '"' . $section . '" in ' . $page;
+    }
+    return $inferred;
+}
+
+# Given the contents of an L<> formatting code, parse it into the link text,
+# the possibly inferred link text, the name or URL, the section, and the type
+# of link (pod, man, or url).
+sub parselink {
+    my ($link) = @_;
+    $link =~ s/\s+/ /g;
+    if ($link =~ /\A\w+:[^:\s]\S*\Z/) {
+        return (undef, $link, $link, undef, 'url');
+    } else {
+        my $text;
+        if ($link =~ /\|/) {
+            ($text, $link) = split (/\|/, $link, 2);
+        }
+        my ($name, $section) = _parse_section ($link);
+        my $inferred = $text || _infer_text ($name, $section);
+        my $type = ($name && $name =~ /\(\S*\)/) ? 'man' : 'pod';
+        return ($text, $inferred, $name, $section, $type);
+    }
+}
+
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+# Ensure we evaluate to true.
+1;
+__END__
+
+=head1 NAME
+
+Pod::ParseLink - Parse an LE<lt>E<gt> formatting code in POD text
+
+=head1 SYNOPSIS
+
+    use Pod::ParseLink;
+    my ($text, $inferred, $name, $section, $type) = parselink ($link);
+
+=head1 DESCRIPTION
+
+This module only provides a single function, parselink(), which takes the
+text of an LE<lt>E<gt> formatting code and parses it.  It returns the anchor
+text for the link (if any was given), the anchor text possibly inferred from
+the name and section, the name or URL, the section if any, and the type of
+link.  The type will be one of 'url', 'pod', or 'man', indicating a URL, a
+link to a POD page, or a link to a Unix manual page.
+
+Parsing is implemented per L<perlpodspec>.  For backward compatibility,
+links where there is no section and name contains spaces, or links where the
+entirety of the link (except for the anchor text if given) is enclosed in
+double-quotes are interpreted as links to a section (LE<lt>/sectionE<gt>).
+
+The inferred anchor text is implemented per L<perlpodspec>:
+
+    L<name>         =>  L<name|name>
+    L</section>     =>  L<"section"|/section>
+    L<name/section> =>  L<"section" in name|name/section>
+
+The name may contain embedded EE<lt>E<gt> and ZE<lt>E<gt> formatting codes,
+and the section, anchor text, and inferred anchor text may contain any
+formatting codes.  Any double quotes around the section are removed as part
+of the parsing, as is any leading or trailing whitespace.
+
+If the text of the LE<lt>E<gt> escape is entirely enclosed in double quotes,
+it's interpreted as a link to a section for backwards compatibility.
+
+No attempt is made to resolve formatting codes.  This must be done after
+calling parselink (since EE<lt>E<gt> formatting codes can be used to escape
+characters that would otherwise be significant to the parser and resolving
+them before parsing would result in an incorrect parse of a formatting code
+like:
+
+    L<verticalE<verbar>barE<sol>slash>
+
+which should be interpreted as a link to the C<vertical|bar/slash> POD page
+and not as a link to the C<slash> section of the C<bar> POD page with an
+anchor text of C<vertical>.  Note that not only the anchor text will need to
+have formatting codes expanded, but so will the target of the link (to deal
+with EE<lt>E<gt> and ZE<lt>E<gt> formatting codes), and special handling of
+the section may be necessary depending on whether the translator wants to
+consider markup in sections to be significant when resolving links.  See
+L<perlpodspec> for more information.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2001 by Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/ParseUtils.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/ParseUtils.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/ParseUtils.pm	(revision 14489)
@@ -0,0 +1,852 @@
+#############################################################################
+# Pod/ParseUtils.pm -- helpers for POD parsing and conversion
+#
+# Copyright (C) 1999-2000 by Marek Rouchal. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::ParseUtils;
+
+use vars qw($VERSION);
+$VERSION = 1.33;   ## Current version of this package
+require  5.005;    ## requires this Perl version or later
+
+=head1 NAME
+
+Pod::ParseUtils - helpers for POD parsing and conversion
+
+=head1 SYNOPSIS
+
+  use Pod::ParseUtils;
+
+  my $list = new Pod::List;
+  my $link = Pod::Hyperlink->new('Pod::Parser');
+
+=head1 DESCRIPTION
+
+B<Pod::ParseUtils> contains a few object-oriented helper packages for
+POD parsing and processing (i.e. in POD formatters and translators).
+
+=cut
+
+#-----------------------------------------------------------------------------
+# Pod::List
+#
+# class to hold POD list info (=over, =item, =back)
+#-----------------------------------------------------------------------------
+
+package Pod::List;
+
+use Carp;
+
+=head2 Pod::List
+
+B<Pod::List> can be used to hold information about POD lists
+(written as =over ... =item ... =back) for further processing.
+The following methods are available:
+
+=over 4
+
+=item Pod::List-E<gt>new()
+
+Create a new list object. Properties may be specified through a hash
+reference like this:
+
+  my $list = Pod::List->new({ -start => $., -indent => 4 });
+
+See the individual methods/properties for details.
+
+=cut
+
+sub new {
+    my $this = shift;
+    my $class = ref($this) || $this;
+    my %params = @_;
+    my $self = {%params};
+    bless $self, $class;
+    $self->initialize();
+    return $self;
+}
+
+sub initialize {
+    my $self = shift;
+    $self->{-file} ||= 'unknown';
+    $self->{-start} ||= 'unknown';
+    $self->{-indent} ||= 4; # perlpod: "should be the default"
+    $self->{_items} = [];
+    $self->{-type} ||= '';
+}
+
+=item $list-E<gt>file()
+
+Without argument, retrieves the file name the list is in. This must
+have been set before by either specifying B<-file> in the B<new()>
+method or by calling the B<file()> method with a scalar argument.
+
+=cut
+
+# The POD file name the list appears in
+sub file {
+   return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
+}
+
+=item $list-E<gt>start()
+
+Without argument, retrieves the line number where the list started.
+This must have been set before by either specifying B<-start> in the
+B<new()> method or by calling the B<start()> method with a scalar
+argument.
+
+=cut
+
+# The line in the file the node appears
+sub start {
+   return (@_ > 1) ? ($_[0]->{-start} = $_[1]) : $_[0]->{-start};
+}
+
+=item $list-E<gt>indent()
+
+Without argument, retrieves the indent level of the list as specified
+in C<=over n>. This must have been set before by either specifying
+B<-indent> in the B<new()> method or by calling the B<indent()> method
+with a scalar argument.
+
+=cut
+
+# indent level
+sub indent {
+   return (@_ > 1) ? ($_[0]->{-indent} = $_[1]) : $_[0]->{-indent};
+}
+
+=item $list-E<gt>type()
+
+Without argument, retrieves the list type, which can be an arbitrary value,
+e.g. C<OL>, C<UL>, ... when thinking the HTML way.
+This must have been set before by either specifying
+B<-type> in the B<new()> method or by calling the B<type()> method
+with a scalar argument.
+
+=cut
+
+# The type of the list (UL, OL, ...)
+sub type {
+   return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};
+}
+
+=item $list-E<gt>rx()
+
+Without argument, retrieves a regular expression for simplifying the 
+individual item strings once the list type has been determined. Usage:
+E.g. when converting to HTML, one might strip the leading number in
+an ordered list as C<E<lt>OLE<gt>> already prints numbers itself.
+This must have been set before by either specifying
+B<-rx> in the B<new()> method or by calling the B<rx()> method
+with a scalar argument.
+
+=cut
+
+# The regular expression to simplify the items
+sub rx {
+   return (@_ > 1) ? ($_[0]->{-rx} = $_[1]) : $_[0]->{-rx};
+}
+
+=item $list-E<gt>item()
+
+Without argument, retrieves the array of the items in this list.
+The items may be represented by any scalar.
+If an argument has been given, it is pushed on the list of items.
+
+=cut
+
+# The individual =items of this list
+sub item {
+    my ($self,$item) = @_;
+    if(defined $item) {
+        push(@{$self->{_items}}, $item);
+        return $item;
+    }
+    else {
+        return @{$self->{_items}};
+    }
+}
+
+=item $list-E<gt>parent()
+
+Without argument, retrieves information about the parent holding this
+list, which is represented as an arbitrary scalar.
+This must have been set before by either specifying
+B<-parent> in the B<new()> method or by calling the B<parent()> method
+with a scalar argument.
+
+=cut
+
+# possibility for parsers/translators to store information about the
+# lists's parent object
+sub parent {
+   return (@_ > 1) ? ($_[0]->{-parent} = $_[1]) : $_[0]->{-parent};
+}
+
+=item $list-E<gt>tag()
+
+Without argument, retrieves information about the list tag, which can be
+any scalar.
+This must have been set before by either specifying
+B<-tag> in the B<new()> method or by calling the B<tag()> method
+with a scalar argument.
+
+=back
+
+=cut
+
+# possibility for parsers/translators to store information about the
+# list's object
+sub tag {
+   return (@_ > 1) ? ($_[0]->{-tag} = $_[1]) : $_[0]->{-tag};
+}
+
+#-----------------------------------------------------------------------------
+# Pod::Hyperlink
+#
+# class to manipulate POD hyperlinks (L<>)
+#-----------------------------------------------------------------------------
+
+package Pod::Hyperlink;
+
+=head2 Pod::Hyperlink
+
+B<Pod::Hyperlink> is a class for manipulation of POD hyperlinks. Usage:
+
+  my $link = Pod::Hyperlink->new('alternative text|page/"section in page"');
+
+The B<Pod::Hyperlink> class is mainly designed to parse the contents of the
+C<LE<lt>...E<gt>> sequence, providing a simple interface for accessing the
+different parts of a POD hyperlink for further processing. It can also be
+used to construct hyperlinks.
+
+=over 4
+
+=item Pod::Hyperlink-E<gt>new()
+
+The B<new()> method can either be passed a set of key/value pairs or a single
+scalar value, namely the contents of a C<LE<lt>...E<gt>> sequence. An object
+of the class C<Pod::Hyperlink> is returned. The value C<undef> indicates a
+failure, the error message is stored in C<$@>.
+
+=cut
+
+use Carp;
+
+sub new {
+    my $this = shift;
+    my $class = ref($this) || $this;
+    my $self = +{};
+    bless $self, $class;
+    $self->initialize();
+    if(defined $_[0]) {
+        if(ref($_[0])) {
+            # called with a list of parameters
+            %$self = %{$_[0]};
+            $self->_construct_text();
+        }
+        else {
+            # called with L<> contents
+            return undef unless($self->parse($_[0]));
+        }
+    }
+    return $self;
+}
+
+sub initialize {
+    my $self = shift;
+    $self->{-line} ||= 'undef';
+    $self->{-file} ||= 'undef';
+    $self->{-page} ||= '';
+    $self->{-node} ||= '';
+    $self->{-alttext} ||= '';
+    $self->{-type} ||= 'undef';
+    $self->{_warnings} = [];
+}
+
+=item $link-E<gt>parse($string)
+
+This method can be used to (re)parse a (new) hyperlink, i.e. the contents
+of a C<LE<lt>...E<gt>> sequence. The result is stored in the current object.
+Warnings are stored in the B<warnings> property.
+E.g. sections like C<LE<lt>open(2)E<gt>> are deprecated, as they do not point
+to Perl documents. C<LE<lt>DBI::foo(3p)E<gt>> is wrong as well, the manpage
+section can simply be dropped.
+
+=cut
+
+sub parse {
+    my $self = shift;
+    local($_) = $_[0];
+    # syntax check the link and extract destination
+    my ($alttext,$page,$node,$type,$quoted) = (undef,'','','',0);
+
+    $self->{_warnings} = [];
+
+    # collapse newlines with whitespace
+    s/\s*\n+\s*/ /g;
+
+    # strip leading/trailing whitespace
+    if(s/^[\s\n]+//) {
+        $self->warning("ignoring leading whitespace in link");
+    }
+    if(s/[\s\n]+$//) {
+        $self->warning("ignoring trailing whitespace in link");
+    }
+    unless(length($_)) {
+        _invalid_link("empty link");
+        return undef;
+    }
+
+    ## Check for different possibilities. This is tedious and error-prone
+    # we match all possibilities (alttext, page, section/item)
+    #warn "DEBUG: link=$_\n";
+
+    # only page
+    # problem: a lot of people use (), or (1) or the like to indicate
+    # man page sections. But this collides with L<func()> that is supposed
+    # to point to an internal funtion...
+    my $page_rx = '[\w.-]+(?:::[\w.-]+)*(?:[(](?:\d\w*|)[)]|)';
+    # page name only
+    if(m!^($page_rx)$!o) {
+        $page = $1;
+        $type = 'page';
+    }
+    # alttext, page and "section"
+    elsif(m!^(.*?)\s*[|]\s*($page_rx)\s*/\s*"(.+)"$!o) {
+        ($alttext, $page, $node) = ($1, $2, $3);
+        $type = 'section';
+        $quoted = 1; #... therefore | and / are allowed
+    }
+    # alttext and page
+    elsif(m!^(.*?)\s*[|]\s*($page_rx)$!o) {
+        ($alttext, $page) = ($1, $2);
+        $type = 'page';
+    }
+    # alttext and "section"
+    elsif(m!^(.*?)\s*[|]\s*(?:/\s*|)"(.+)"$!) {
+        ($alttext, $node) = ($1,$2);
+        $type = 'section';
+        $quoted = 1;
+    }
+    # page and "section"
+    elsif(m!^($page_rx)\s*/\s*"(.+)"$!o) {
+        ($page, $node) = ($1, $2);
+        $type = 'section';
+        $quoted = 1;
+    }
+    # page and item
+    elsif(m!^($page_rx)\s*/\s*(.+)$!o) {
+        ($page, $node) = ($1, $2);
+        $type = 'item';
+    }
+    # only "section"
+    elsif(m!^/?"(.+)"$!) {
+        $node = $1;
+        $type = 'section';
+        $quoted = 1;
+    }
+    # only item
+    elsif(m!^\s*/(.+)$!) {
+        $node = $1;
+        $type = 'item';
+    }
+    # non-standard: Hyperlink
+    elsif(m!^(\w+:[^:\s]\S*)$!i) {
+        $node = $1;
+        $type = 'hyperlink';
+    }
+    # alttext, page and item
+    elsif(m!^(.*?)\s*[|]\s*($page_rx)\s*/\s*(.+)$!o) {
+        ($alttext, $page, $node) = ($1, $2, $3);
+        $type = 'item';
+    }
+    # alttext and item
+    elsif(m!^(.*?)\s*[|]\s*/(.+)$!) {
+        ($alttext, $node) = ($1,$2);
+    }
+    # nonstandard: alttext and hyperlink
+    elsif(m!^(.*?)\s*[|]\s*(\w+:[^:\s]\S*)$!) {
+        ($alttext, $node) = ($1,$2);
+        $type = 'hyperlink';
+    }
+    # must be an item or a "malformed" section (without "")
+    else {
+        $node = $_;
+        $type = 'item';
+    }
+    # collapse whitespace in nodes
+    $node =~ s/\s+/ /gs;
+
+    # empty alternative text expands to node name
+    if(defined $alttext) {
+        if(!length($alttext)) {
+          $alttext = $node | $page;
+        }
+    }
+    else {
+        $alttext = '';
+    }
+
+    if($page =~ /[(]\w*[)]$/) {
+        $self->warning("(section) in '$page' deprecated");
+    }
+    if(!$quoted && $node =~ m:[|/]: && $type ne 'hyperlink') {
+        $self->warning("node '$node' contains non-escaped | or /");
+    }
+    if($alttext =~ m:[|/]:) {
+        $self->warning("alternative text '$node' contains non-escaped | or /");
+    }
+    $self->{-page} = $page;
+    $self->{-node} = $node;
+    $self->{-alttext} = $alttext;
+    #warn "DEBUG: page=$page section=$section item=$item alttext=$alttext\n";
+    $self->{-type} = $type;
+    $self->_construct_text();
+    1;
+}
+
+sub _construct_text {
+    my $self = shift;
+    my $alttext = $self->alttext();
+    my $type = $self->type();
+    my $section = $self->node();
+    my $page = $self->page();
+    my $page_ext = '';
+    $page =~ s/([(]\w*[)])$// && ($page_ext = $1);
+    if($alttext) {
+        $self->{_text} = $alttext;
+    }
+    elsif($type eq 'hyperlink') {
+        $self->{_text} = $section;
+    }
+    else {
+        $self->{_text} = ($section || '') .
+            (($page && $section) ? ' in ' : '') .
+            "$page$page_ext";
+    }
+    # for being marked up later
+    # use the non-standard markers P<> and Q<>, so that the resulting
+    # text can be parsed by the translators. It's their job to put
+    # the correct hypertext around the linktext
+    if($alttext) {
+        $self->{_markup} = "Q<$alttext>";
+    }
+    elsif($type eq 'hyperlink') {
+        $self->{_markup} = "Q<$section>";
+    }
+    else {
+        $self->{_markup} = (!$section ? '' : "Q<$section>") .
+            ($page ? ($section ? ' in ':'') . "P<$page>$page_ext" : '');
+    }
+}
+
+=item $link-E<gt>markup($string)
+
+Set/retrieve the textual value of the link. This string contains special
+markers C<PE<lt>E<gt>> and C<QE<lt>E<gt>> that should be expanded by the
+translator's interior sequence expansion engine to the
+formatter-specific code to highlight/activate the hyperlink. The details
+have to be implemented in the translator.
+
+=cut
+
+#' retrieve/set markuped text
+sub markup {
+    return (@_ > 1) ? ($_[0]->{_markup} = $_[1]) : $_[0]->{_markup};
+}
+
+=item $link-E<gt>text()
+
+This method returns the textual representation of the hyperlink as above,
+but without markers (read only). Depending on the link type this is one of
+the following alternatives (the + and * denote the portions of the text
+that are marked up):
+
+  +perl+                    L<perl>
+  *$|* in +perlvar+         L<perlvar/$|>
+  *OPTIONS* in +perldoc+    L<perldoc/"OPTIONS">
+  *DESCRIPTION*             L<"DESCRIPTION">
+
+=cut
+
+# The complete link's text
+sub text {
+    $_[0]->{_text};
+}
+
+=item $link-E<gt>warning()
+
+After parsing, this method returns any warnings encountered during the
+parsing process.
+
+=cut
+
+# Set/retrieve warnings
+sub warning {
+    my $self = shift;
+    if(@_) {
+        push(@{$self->{_warnings}}, @_);
+        return @_;
+    }
+    return @{$self->{_warnings}};
+}
+
+=item $link-E<gt>file()
+
+=item $link-E<gt>line()
+
+Just simple slots for storing information about the line and the file
+the link was encountered in. Has to be filled in manually.
+
+=cut
+
+# The line in the file the link appears
+sub line {
+    return (@_ > 1) ? ($_[0]->{-line} = $_[1]) : $_[0]->{-line};
+}
+
+# The POD file name the link appears in
+sub file {
+    return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
+}
+
+=item $link-E<gt>page()
+
+This method sets or returns the POD page this link points to.
+
+=cut
+
+# The POD page the link appears on
+sub page {
+    if (@_ > 1) {
+        $_[0]->{-page} = $_[1];
+        $_[0]->_construct_text();
+    }
+    $_[0]->{-page};
+}
+
+=item $link-E<gt>node()
+
+As above, but the destination node text of the link.
+
+=cut
+
+# The link destination
+sub node {
+    if (@_ > 1) {
+        $_[0]->{-node} = $_[1];
+        $_[0]->_construct_text();
+    }
+    $_[0]->{-node};
+}
+
+=item $link-E<gt>alttext()
+
+Sets or returns an alternative text specified in the link.
+
+=cut
+
+# Potential alternative text
+sub alttext {
+    if (@_ > 1) {
+        $_[0]->{-alttext} = $_[1];
+        $_[0]->_construct_text();
+    }
+    $_[0]->{-alttext};
+}
+
+=item $link-E<gt>type()
+
+The node type, either C<section> or C<item>. As an unofficial type,
+there is also C<hyperlink>, derived from e.g. C<LE<lt>http://perl.comE<gt>>
+
+=cut
+
+# The type: item or headn
+sub type {
+    return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};
+}
+
+=item $link-E<gt>link()
+
+Returns the link as contents of C<LE<lt>E<gt>>. Reciprocal to B<parse()>.
+
+=back
+
+=cut
+
+# The link itself
+sub link {
+    my $self = shift;
+    my $link = $self->page() || '';
+    if($self->node()) {
+        my $node = $self->node();
+        $text =~ s/\|/E<verbar>/g;
+        $text =~ s:/:E<sol>:g;
+        if($self->type() eq 'section') {
+            $link .= ($link ? '/' : '') . '"' . $node . '"';
+        }
+        elsif($self->type() eq 'hyperlink') {
+            $link = $self->node();
+        }
+        else { # item
+            $link .= '/' . $node;
+        }
+    }
+    if($self->alttext()) {
+        my $text = $self->alttext();
+        $text =~ s/\|/E<verbar>/g;
+        $text =~ s:/:E<sol>:g;
+        $link = "$text|$link";
+    }
+    $link;
+}
+
+sub _invalid_link {
+    my ($msg) = @_;
+    # this sets @_
+    #eval { die "$msg\n" };
+    #chomp $@;
+    $@ = $msg; # this seems to work, too!
+    undef;
+}
+
+#-----------------------------------------------------------------------------
+# Pod::Cache
+#
+# class to hold POD page details
+#-----------------------------------------------------------------------------
+
+package Pod::Cache;
+
+=head2 Pod::Cache
+
+B<Pod::Cache> holds information about a set of POD documents,
+especially the nodes for hyperlinks.
+The following methods are available:
+
+=over 4
+
+=item Pod::Cache-E<gt>new()
+
+Create a new cache object. This object can hold an arbitrary number of
+POD documents of class Pod::Cache::Item.
+
+=cut
+
+sub new {
+    my $this = shift;
+    my $class = ref($this) || $this;
+    my $self = [];
+    bless $self, $class;
+    return $self;
+}
+
+=item $cache-E<gt>item()
+
+Add a new item to the cache. Without arguments, this method returns a
+list of all cache elements.
+
+=cut
+
+sub item {
+    my ($self,%param) = @_;
+    if(%param) {
+        my $item = Pod::Cache::Item->new(%param);
+        push(@$self, $item);
+        return $item;
+    }
+    else {
+        return @{$self};
+    }
+}
+
+=item $cache-E<gt>find_page($name)
+
+Look for a POD document named C<$name> in the cache. Returns the
+reference to the corresponding Pod::Cache::Item object or undef if
+not found.
+
+=back
+
+=cut
+
+sub find_page {
+    my ($self,$page) = @_;
+    foreach(@$self) {
+        if($_->page() eq $page) {
+            return $_;
+        }
+    }
+    undef;
+}
+
+package Pod::Cache::Item;
+
+=head2 Pod::Cache::Item
+
+B<Pod::Cache::Item> holds information about individual POD documents,
+that can be grouped in a Pod::Cache object.
+It is intended to hold information about the hyperlink nodes of POD
+documents.
+The following methods are available:
+
+=over 4
+
+=item Pod::Cache::Item-E<gt>new()
+
+Create a new object.
+
+=cut
+
+sub new {
+    my $this = shift;
+    my $class = ref($this) || $this;
+    my %params = @_;
+    my $self = {%params};
+    bless $self, $class;
+    $self->initialize();
+    return $self;
+}
+
+sub initialize {
+    my $self = shift;
+    $self->{-nodes} = [] unless(defined $self->{-nodes});
+}
+
+=item $cacheitem-E<gt>page()
+
+Set/retrieve the POD document name (e.g. "Pod::Parser").
+
+=cut
+
+# The POD page
+sub page {
+   return (@_ > 1) ? ($_[0]->{-page} = $_[1]) : $_[0]->{-page};
+}
+
+=item $cacheitem-E<gt>description()
+
+Set/retrieve the POD short description as found in the C<=head1 NAME>
+section.
+
+=cut
+
+# The POD description, taken out of NAME if present
+sub description {
+   return (@_ > 1) ? ($_[0]->{-description} = $_[1]) : $_[0]->{-description};
+}
+
+=item $cacheitem-E<gt>path()
+
+Set/retrieve the POD file storage path.
+
+=cut
+
+# The file path
+sub path {
+   return (@_ > 1) ? ($_[0]->{-path} = $_[1]) : $_[0]->{-path};
+}
+
+=item $cacheitem-E<gt>file()
+
+Set/retrieve the POD file name.
+
+=cut
+
+# The POD file name
+sub file {
+   return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
+}
+
+=item $cacheitem-E<gt>nodes()
+
+Add a node (or a list of nodes) to the document's node list. Note that
+the order is kept, i.e. start with the first node and end with the last.
+If no argument is given, the current list of nodes is returned in the
+same order the nodes have been added.
+A node can be any scalar, but usually is a pair of node string and
+unique id for the C<find_node> method to work correctly.
+
+=cut
+
+# The POD nodes
+sub nodes {
+    my ($self,@nodes) = @_;
+    if(@nodes) {
+        push(@{$self->{-nodes}}, @nodes);
+        return @nodes;
+    }
+    else {
+        return @{$self->{-nodes}};
+    }
+}
+
+=item $cacheitem-E<gt>find_node($name)
+
+Look for a node or index entry named C<$name> in the object.
+Returns the unique id of the node (i.e. the second element of the array
+stored in the node arry) or undef if not found.
+
+=cut
+
+sub find_node {
+    my ($self,$node) = @_;
+    my @search;
+    push(@search, @{$self->{-nodes}}) if($self->{-nodes});
+    push(@search, @{$self->{-idx}}) if($self->{-idx});
+    foreach(@search) {
+        if($_->[0] eq $node) {
+            return $_->[1]; # id
+        }
+    }
+    undef;
+}
+
+=item $cacheitem-E<gt>idx()
+
+Add an index entry (or a list of them) to the document's index list. Note that
+the order is kept, i.e. start with the first node and end with the last.
+If no argument is given, the current list of index entries is returned in the
+same order the entries have been added.
+An index entry can be any scalar, but usually is a pair of string and
+unique id.
+
+=back
+
+=cut
+
+# The POD index entries
+sub idx {
+    my ($self,@idx) = @_;
+    if(@idx) {
+        push(@{$self->{-idx}}, @idx);
+        return @idx;
+    }
+    else {
+        return @{$self->{-idx}};
+    }
+}
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Marek Rouchal E<lt>marekr@cpan.orgE<gt>, borrowing
+a lot of things from L<pod2man> and L<pod2roff> as well as other POD
+processing tools by Tom Christiansen, Brad Appleton and Russ Allbery.
+
+=head1 SEE ALSO
+
+L<pod2man>, L<pod2roff>, L<Pod::Parser>, L<Pod::Checker>,
+L<pod2html>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Parser.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Parser.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Parser.pm	(revision 14489)
@@ -0,0 +1,1799 @@
+#############################################################################
+# Pod/Parser.pm -- package which defines a base class for parsing POD docs.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Parser;
+
+use vars qw($VERSION);
+$VERSION = 1.32;  ## Current version of this package
+require  5.005;    ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Parser - base class for creating POD filters and translators
+
+=head1 SYNOPSIS
+
+    use Pod::Parser;
+
+    package MyParser;
+    @ISA = qw(Pod::Parser);
+
+    sub command { 
+        my ($parser, $command, $paragraph, $line_num) = @_;
+        ## Interpret the command and its text; sample actions might be:
+        if ($command eq 'head1') { ... }
+        elsif ($command eq 'head2') { ... }
+        ## ... other commands and their actions
+        my $out_fh = $parser->output_handle();
+        my $expansion = $parser->interpolate($paragraph, $line_num);
+        print $out_fh $expansion;
+    }
+
+    sub verbatim { 
+        my ($parser, $paragraph, $line_num) = @_;
+        ## Format verbatim paragraph; sample actions might be:
+        my $out_fh = $parser->output_handle();
+        print $out_fh $paragraph;
+    }
+
+    sub textblock { 
+        my ($parser, $paragraph, $line_num) = @_;
+        ## Translate/Format this block of text; sample actions might be:
+        my $out_fh = $parser->output_handle();
+        my $expansion = $parser->interpolate($paragraph, $line_num);
+        print $out_fh $expansion;
+    }
+
+    sub interior_sequence { 
+        my ($parser, $seq_command, $seq_argument) = @_;
+        ## Expand an interior sequence; sample actions might be:
+        return "*$seq_argument*"     if ($seq_command eq 'B');
+        return "`$seq_argument'"     if ($seq_command eq 'C');
+        return "_${seq_argument}_'"  if ($seq_command eq 'I');
+        ## ... other sequence commands and their resulting text
+    }
+
+    package main;
+
+    ## Create a parser object and have it parse file whose name was
+    ## given on the command-line (use STDIN if no files were given).
+    $parser = new MyParser();
+    $parser->parse_from_filehandle(\*STDIN)  if (@ARGV == 0);
+    for (@ARGV) { $parser->parse_from_file($_); }
+
+=head1 REQUIRES
+
+perl5.005, Pod::InputObjects, Exporter, Symbol, Carp
+
+=head1 EXPORTS
+
+Nothing.
+
+=head1 DESCRIPTION
+
+B<Pod::Parser> is a base class for creating POD filters and translators.
+It handles most of the effort involved with parsing the POD sections
+from an input stream, leaving subclasses free to be concerned only with
+performing the actual translation of text.
+
+B<Pod::Parser> parses PODs, and makes method calls to handle the various
+components of the POD. Subclasses of B<Pod::Parser> override these methods
+to translate the POD into whatever output format they desire.
+
+=head1 QUICK OVERVIEW
+
+To create a POD filter for translating POD documentation into some other
+format, you create a subclass of B<Pod::Parser> which typically overrides
+just the base class implementation for the following methods:
+
+=over 2
+
+=item *
+
+B<command()>
+
+=item *
+
+B<verbatim()>
+
+=item *
+
+B<textblock()>
+
+=item *
+
+B<interior_sequence()>
+
+=back
+
+You may also want to override the B<begin_input()> and B<end_input()>
+methods for your subclass (to perform any needed per-file and/or
+per-document initialization or cleanup).
+
+If you need to perform any preprocesssing of input before it is parsed
+you may want to override one or more of B<preprocess_line()> and/or
+B<preprocess_paragraph()>.
+
+Sometimes it may be necessary to make more than one pass over the input
+files. If this is the case you have several options. You can make the
+first pass using B<Pod::Parser> and override your methods to store the
+intermediate results in memory somewhere for the B<end_pod()> method to
+process. You could use B<Pod::Parser> for several passes with an
+appropriate state variable to control the operation for each pass. If
+your input source can't be reset to start at the beginning, you can
+store it in some other structure as a string or an array and have that
+structure implement a B<getline()> method (which is all that
+B<parse_from_filehandle()> uses to read input).
+
+Feel free to add any member data fields you need to keep track of things
+like current font, indentation, horizontal or vertical position, or
+whatever else you like. Be sure to read L<"PRIVATE METHODS AND DATA">
+to avoid name collisions.
+
+For the most part, the B<Pod::Parser> base class should be able to
+do most of the input parsing for you and leave you free to worry about
+how to intepret the commands and translate the result.
+
+Note that all we have described here in this quick overview is the
+simplest most straightforward use of B<Pod::Parser> to do stream-based
+parsing. It is also possible to use the B<Pod::Parser::parse_text> function
+to do more sophisticated tree-based parsing. See L<"TREE-BASED PARSING">.
+
+=head1 PARSING OPTIONS
+
+A I<parse-option> is simply a named option of B<Pod::Parser> with a
+value that corresponds to a certain specified behavior. These various
+behaviors of B<Pod::Parser> may be enabled/disabled by setting
+or unsetting one or more I<parse-options> using the B<parseopts()> method.
+The set of currently accepted parse-options is as follows:
+
+=over 3
+
+=item B<-want_nonPODs> (default: unset)
+
+Normally (by default) B<Pod::Parser> will only provide access to
+the POD sections of the input. Input paragraphs that are not part
+of the POD-format documentation are not made available to the caller
+(not even using B<preprocess_paragraph()>). Setting this option to a
+non-empty, non-zero value will allow B<preprocess_paragraph()> to see
+non-POD sections of the input as well as POD sections. The B<cutting()>
+method can be used to determine if the corresponding paragraph is a POD
+paragraph, or some other input paragraph.
+
+=item B<-process_cut_cmd> (default: unset)
+
+Normally (by default) B<Pod::Parser> handles the C<=cut> POD directive
+by itself and does not pass it on to the caller for processing. Setting
+this option to a non-empty, non-zero value will cause B<Pod::Parser> to
+pass the C<=cut> directive to the caller just like any other POD command
+(and hence it may be processed by the B<command()> method).
+
+B<Pod::Parser> will still interpret the C<=cut> directive to mean that
+"cutting mode" has been (re)entered, but the caller will get a chance
+to capture the actual C<=cut> paragraph itself for whatever purpose
+it desires.
+
+=item B<-warnings> (default: unset)
+
+Normally (by default) B<Pod::Parser> recognizes a bare minimum of
+pod syntax errors and warnings and issues diagnostic messages
+for errors, but not for warnings. (Use B<Pod::Checker> to do more
+thorough checking of POD syntax.) Setting this option to a non-empty,
+non-zero value will cause B<Pod::Parser> to issue diagnostics for
+the few warnings it recognizes as well as the errors.
+
+=back
+
+Please see L<"parseopts()"> for a complete description of the interface
+for the setting and unsetting of parse-options.
+
+=cut
+
+#############################################################################
+
+use vars qw(@ISA);
+use strict;
+#use diagnostics;
+use Pod::InputObjects;
+use Carp;
+use Exporter;
+BEGIN {
+   if ($] < 5.6) {
+      require Symbol;
+      import Symbol;
+   }
+}
+@ISA = qw(Exporter);
+
+## These "variables" are used as local "glob aliases" for performance
+use vars qw(%myData %myOpts @input_stack);
+
+#############################################################################
+
+=head1 RECOMMENDED SUBROUTINE/METHOD OVERRIDES
+
+B<Pod::Parser> provides several methods which most subclasses will probably
+want to override. These methods are as follows:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<command()>
+
+            $parser->command($cmd,$text,$line_num,$pod_para);
+
+This method should be overridden by subclasses to take the appropriate
+action when a POD command paragraph (denoted by a line beginning with
+"=") is encountered. When such a POD directive is seen in the input,
+this method is called and is passed:
+
+=over 3
+
+=item C<$cmd>
+
+the name of the command for this POD paragraph
+
+=item C<$text>
+
+the paragraph text for the given POD paragraph command.
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph command (see L<Pod::InputObjects>
+for details).
+
+=back
+
+B<Note> that this method I<is> called for C<=pod> paragraphs.
+
+The base class implementation of this method simply treats the raw POD
+command as normal block of paragraph text (invoking the B<textblock()>
+method with the command paragraph).
+
+=cut
+
+sub command {
+    my ($self, $cmd, $text, $line_num, $pod_para)  = @_;
+    ## Just treat this like a textblock
+    $self->textblock($pod_para->raw_text(), $line_num, $pod_para);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<verbatim()>
+
+            $parser->verbatim($text,$line_num,$pod_para);
+
+This method may be overridden by subclasses to take the appropriate
+action when a block of verbatim text is encountered. It is passed the
+following parameters:
+
+=over 3
+
+=item C<$text>
+
+the block of text for the verbatim paragraph
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph (see L<Pod::InputObjects>
+for details).
+
+=back
+
+The base class implementation of this method simply prints the textblock
+(unmodified) to the output filehandle.
+
+=cut
+
+sub verbatim {
+    my ($self, $text, $line_num, $pod_para) = @_;
+    my $out_fh = $self->{_OUTPUT};
+    print $out_fh $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<textblock()>
+
+            $parser->textblock($text,$line_num,$pod_para);
+
+This method may be overridden by subclasses to take the appropriate
+action when a normal block of POD text is encountered (although the base
+class method will usually do what you want). It is passed the following
+parameters:
+
+=over 3
+
+=item C<$text>
+
+the block of text for the a POD paragraph
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph (see L<Pod::InputObjects>
+for details).
+
+=back
+
+In order to process interior sequences, subclasses implementations of
+this method will probably want to invoke either B<interpolate()> or
+B<parse_text()>, passing it the text block C<$text>, and the corresponding
+line number in C<$line_num>, and then perform any desired processing upon
+the returned result.
+
+The base class implementation of this method simply prints the text block
+as it occurred in the input stream).
+
+=cut
+
+sub textblock {
+    my ($self, $text, $line_num, $pod_para) = @_;
+    my $out_fh = $self->{_OUTPUT};
+    print $out_fh $self->interpolate($text, $line_num);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<interior_sequence()>
+
+            $parser->interior_sequence($seq_cmd,$seq_arg,$pod_seq);
+
+This method should be overridden by subclasses to take the appropriate
+action when an interior sequence is encountered. An interior sequence is
+an embedded command within a block of text which appears as a command
+name (usually a single uppercase character) followed immediately by a
+string of text which is enclosed in angle brackets. This method is
+passed the sequence command C<$seq_cmd> and the corresponding text
+C<$seq_arg>. It is invoked by the B<interpolate()> method for each interior
+sequence that occurs in the string that it is passed. It should return
+the desired text string to be used in place of the interior sequence.
+The C<$pod_seq> argument is a reference to a C<Pod::InteriorSequence>
+object which contains further information about the interior sequence.
+Please see L<Pod::InputObjects> for details if you need to access this
+additional information.
+
+Subclass implementations of this method may wish to invoke the 
+B<nested()> method of C<$pod_seq> to see if it is nested inside
+some other interior-sequence (and if so, which kind).
+
+The base class implementation of the B<interior_sequence()> method
+simply returns the raw text of the interior sequence (as it occurred
+in the input) to the caller.
+
+=cut
+
+sub interior_sequence {
+    my ($self, $seq_cmd, $seq_arg, $pod_seq) = @_;
+    ## Just return the raw text of the interior sequence
+    return  $pod_seq->raw_text();
+}
+
+#############################################################################
+
+=head1 OPTIONAL SUBROUTINE/METHOD OVERRIDES
+
+B<Pod::Parser> provides several methods which subclasses may want to override
+to perform any special pre/post-processing. These methods do I<not> have to
+be overridden, but it may be useful for subclasses to take advantage of them.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<new()>
+
+            my $parser = Pod::Parser->new();
+
+This is the constructor for B<Pod::Parser> and its subclasses. You
+I<do not> need to override this method! It is capable of constructing
+subclass objects as well as base class objects, provided you use
+any of the following constructor invocation styles:
+
+    my $parser1 = MyParser->new();
+    my $parser2 = new MyParser();
+    my $parser3 = $parser2->new();
+
+where C<MyParser> is some subclass of B<Pod::Parser>.
+
+Using the syntax C<MyParser::new()> to invoke the constructor is I<not>
+recommended, but if you insist on being able to do this, then the
+subclass I<will> need to override the B<new()> constructor method. If
+you do override the constructor, you I<must> be sure to invoke the
+B<initialize()> method of the newly blessed object.
+
+Using any of the above invocations, the first argument to the
+constructor is always the corresponding package name (or object
+reference). No other arguments are required, but if desired, an
+associative array (or hash-table) my be passed to the B<new()>
+constructor, as in:
+
+    my $parser1 = MyParser->new( MYDATA => $value1, MOREDATA => $value2 );
+    my $parser2 = new MyParser( -myflag => 1 );
+
+All arguments passed to the B<new()> constructor will be treated as
+key/value pairs in a hash-table. The newly constructed object will be
+initialized by copying the contents of the given hash-table (which may
+have been empty). The B<new()> constructor for this class and all of its
+subclasses returns a blessed reference to the initialized object (hash-table).
+
+=cut
+
+sub new {
+    ## Determine if we were called via an object-ref or a classname
+    my $this = shift;
+    my $class = ref($this) || $this;
+    ## Any remaining arguments are treated as initial values for the
+    ## hash that is used to represent this object.
+    my %params = @_;
+    my $self = { %params };
+    ## Bless ourselves into the desired class and perform any initialization
+    bless $self, $class;
+    $self->initialize();
+    return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<initialize()>
+
+            $parser->initialize();
+
+This method performs any necessary object initialization. It takes no
+arguments (other than the object instance of course, which is typically
+copied to a local variable named C<$self>). If subclasses override this
+method then they I<must> be sure to invoke C<$self-E<gt>SUPER::initialize()>.
+
+=cut
+
+sub initialize {
+    #my $self = shift;
+    #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<begin_pod()>
+
+            $parser->begin_pod();
+
+This method is invoked at the beginning of processing for each POD
+document that is encountered in the input. Subclasses should override
+this method to perform any per-document initialization.
+
+=cut
+
+sub begin_pod {
+    #my $self = shift;
+    #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<begin_input()>
+
+            $parser->begin_input();
+
+This method is invoked by B<parse_from_filehandle()> immediately I<before>
+processing input from a filehandle. The base class implementation does
+nothing, however, subclasses may override it to perform any per-file
+initializations.
+
+Note that if multiple files are parsed for a single POD document
+(perhaps the result of some future C<=include> directive) this method
+is invoked for every file that is parsed. If you wish to perform certain
+initializations once per document, then you should use B<begin_pod()>.
+
+=cut
+
+sub begin_input {
+    #my $self = shift;
+    #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<end_input()>
+
+            $parser->end_input();
+
+This method is invoked by B<parse_from_filehandle()> immediately I<after>
+processing input from a filehandle. The base class implementation does
+nothing, however, subclasses may override it to perform any per-file
+cleanup actions.
+
+Please note that if multiple files are parsed for a single POD document
+(perhaps the result of some kind of C<=include> directive) this method
+is invoked for every file that is parsed. If you wish to perform certain
+cleanup actions once per document, then you should use B<end_pod()>.
+
+=cut
+
+sub end_input {
+    #my $self = shift;
+    #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<end_pod()>
+
+            $parser->end_pod();
+
+This method is invoked at the end of processing for each POD document
+that is encountered in the input. Subclasses should override this method
+to perform any per-document finalization.
+
+=cut
+
+sub end_pod {
+    #my $self = shift;
+    #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<preprocess_line()>
+
+          $textline = $parser->preprocess_line($text, $line_num);
+
+This method should be overridden by subclasses that wish to perform
+any kind of preprocessing for each I<line> of input (I<before> it has
+been determined whether or not it is part of a POD paragraph). The
+parameter C<$text> is the input line; and the parameter C<$line_num> is
+the line number of the corresponding text line.
+
+The value returned should correspond to the new text to use in its
+place.  If the empty string or an undefined value is returned then no
+further processing will be performed for this line.
+
+Please note that the B<preprocess_line()> method is invoked I<before>
+the B<preprocess_paragraph()> method. After all (possibly preprocessed)
+lines in a paragraph have been assembled together and it has been
+determined that the paragraph is part of the POD documentation from one
+of the selected sections, then B<preprocess_paragraph()> is invoked.
+
+The base class implementation of this method returns the given text.
+
+=cut
+
+sub preprocess_line {
+    my ($self, $text, $line_num) = @_;
+    return  $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<preprocess_paragraph()>
+
+            $textblock = $parser->preprocess_paragraph($text, $line_num);
+
+This method should be overridden by subclasses that wish to perform any
+kind of preprocessing for each block (paragraph) of POD documentation
+that appears in the input stream. The parameter C<$text> is the POD
+paragraph from the input file; and the parameter C<$line_num> is the
+line number for the beginning of the corresponding paragraph.
+
+The value returned should correspond to the new text to use in its
+place If the empty string is returned or an undefined value is
+returned, then the given C<$text> is ignored (not processed).
+
+This method is invoked after gathering up all the lines in a paragraph
+and after determining the cutting state of the paragraph,
+but before trying to further parse or interpret them. After
+B<preprocess_paragraph()> returns, the current cutting state (which
+is returned by C<$self-E<gt>cutting()>) is examined. If it evaluates
+to true then input text (including the given C<$text>) is cut (not
+processed) until the next POD directive is encountered.
+
+Please note that the B<preprocess_line()> method is invoked I<before>
+the B<preprocess_paragraph()> method. After all (possibly preprocessed)
+lines in a paragraph have been assembled together and either it has been
+determined that the paragraph is part of the POD documentation from one
+of the selected sections or the C<-want_nonPODs> option is true,
+then B<preprocess_paragraph()> is invoked.
+
+The base class implementation of this method returns the given text.
+
+=cut
+
+sub preprocess_paragraph {
+    my ($self, $text, $line_num) = @_;
+    return  $text;
+}
+
+#############################################################################
+
+=head1 METHODS FOR PARSING AND PROCESSING
+
+B<Pod::Parser> provides several methods to process input text. These
+methods typically won't need to be overridden (and in some cases they
+can't be overridden), but subclasses may want to invoke them to exploit
+their functionality.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_text()>
+
+            $ptree1 = $parser->parse_text($text, $line_num);
+            $ptree2 = $parser->parse_text({%opts}, $text, $line_num);
+            $ptree3 = $parser->parse_text(\%opts, $text, $line_num);
+
+This method is useful if you need to perform your own interpolation 
+of interior sequences and can't rely upon B<interpolate> to expand
+them in simple bottom-up order.
+
+The parameter C<$text> is a string or block of text to be parsed
+for interior sequences; and the parameter C<$line_num> is the
+line number curresponding to the beginning of C<$text>.
+
+B<parse_text()> will parse the given text into a parse-tree of "nodes."
+and interior-sequences.  Each "node" in the parse tree is either a
+text-string, or a B<Pod::InteriorSequence>.  The result returned is a
+parse-tree of type B<Pod::ParseTree>. Please see L<Pod::InputObjects>
+for more information about B<Pod::InteriorSequence> and B<Pod::ParseTree>.
+
+If desired, an optional hash-ref may be specified as the first argument
+to customize certain aspects of the parse-tree that is created and
+returned. The set of recognized option keywords are:
+
+=over 3
+
+=item B<-expand_seq> =E<gt> I<code-ref>|I<method-name>
+
+Normally, the parse-tree returned by B<parse_text()> will contain an
+unexpanded C<Pod::InteriorSequence> object for each interior-sequence
+encountered. Specifying B<-expand_seq> tells B<parse_text()> to "expand"
+every interior-sequence it sees by invoking the referenced function
+(or named method of the parser object) and using the return value as the
+expanded result.
+
+If a subroutine reference was given, it is invoked as:
+
+  &$code_ref( $parser, $sequence )
+
+and if a method-name was given, it is invoked as:
+
+  $parser->method_name( $sequence )
+
+where C<$parser> is a reference to the parser object, and C<$sequence>
+is a reference to the interior-sequence object.
+[I<NOTE>: If the B<interior_sequence()> method is specified, then it is
+invoked according to the interface specified in L<"interior_sequence()">].
+
+=item B<-expand_text> =E<gt> I<code-ref>|I<method-name>
+
+Normally, the parse-tree returned by B<parse_text()> will contain a
+text-string for each contiguous sequence of characters outside of an
+interior-sequence. Specifying B<-expand_text> tells B<parse_text()> to
+"preprocess" every such text-string it sees by invoking the referenced
+function (or named method of the parser object) and using the return value
+as the preprocessed (or "expanded") result. [Note that if the result is
+an interior-sequence, then it will I<not> be expanded as specified by the
+B<-expand_seq> option; Any such recursive expansion needs to be handled by
+the specified callback routine.]
+
+If a subroutine reference was given, it is invoked as:
+
+  &$code_ref( $parser, $text, $ptree_node )
+
+and if a method-name was given, it is invoked as:
+
+  $parser->method_name( $text, $ptree_node )
+
+where C<$parser> is a reference to the parser object, C<$text> is the
+text-string encountered, and C<$ptree_node> is a reference to the current
+node in the parse-tree (usually an interior-sequence object or else the
+top-level node of the parse-tree).
+
+=item B<-expand_ptree> =E<gt> I<code-ref>|I<method-name>
+
+Rather than returning a C<Pod::ParseTree>, pass the parse-tree as an
+argument to the referenced subroutine (or named method of the parser
+object) and return the result instead of the parse-tree object.
+
+If a subroutine reference was given, it is invoked as:
+
+  &$code_ref( $parser, $ptree )
+
+and if a method-name was given, it is invoked as:
+
+  $parser->method_name( $ptree )
+
+where C<$parser> is a reference to the parser object, and C<$ptree>
+is a reference to the parse-tree object.
+
+=back
+
+=cut
+
+sub parse_text {
+    my $self = shift;
+    local $_ = '';
+
+    ## Get options and set any defaults
+    my %opts = (ref $_[0]) ? %{ shift() } : ();
+    my $expand_seq   = $opts{'-expand_seq'}   || undef;
+    my $expand_text  = $opts{'-expand_text'}  || undef;
+    my $expand_ptree = $opts{'-expand_ptree'} || undef;
+
+    my $text = shift;
+    my $line = shift;
+    my $file = $self->input_file();
+    my $cmd  = "";
+
+    ## Convert method calls into closures, for our convenience
+    my $xseq_sub   = $expand_seq;
+    my $xtext_sub  = $expand_text;
+    my $xptree_sub = $expand_ptree;
+    if (defined $expand_seq  and  $expand_seq eq 'interior_sequence') {
+        ## If 'interior_sequence' is the method to use, we have to pass
+        ## more than just the sequence object, we also need to pass the
+        ## sequence name and text.
+        $xseq_sub = sub {
+            my ($self, $iseq) = @_;
+            my $args = join("", $iseq->parse_tree->children);
+            return  $self->interior_sequence($iseq->name, $args, $iseq);
+        };
+    }
+    ref $xseq_sub    or  $xseq_sub   = sub { shift()->$expand_seq(@_) };
+    ref $xtext_sub   or  $xtext_sub  = sub { shift()->$expand_text(@_) };
+    ref $xptree_sub  or  $xptree_sub = sub { shift()->$expand_ptree(@_) };
+
+    ## Keep track of the "current" interior sequence, and maintain a stack
+    ## of "in progress" sequences.
+    ##
+    ## NOTE that we push our own "accumulator" at the very beginning of the
+    ## stack. It's really a parse-tree, not a sequence; but it implements
+    ## the methods we need so we can use it to gather-up all the sequences
+    ## and strings we parse. Thus, by the end of our parsing, it should be
+    ## the only thing left on our stack and all we have to do is return it!
+    ##
+    my $seq       = Pod::ParseTree->new();
+    my @seq_stack = ($seq);
+    my ($ldelim, $rdelim) = ('', '');
+
+    ## Iterate over all sequence starts text (NOTE: split with
+    ## capturing parens keeps the delimiters)
+    $_ = $text;
+    my @tokens = split /([A-Z]<(?:<+\s)?)/;
+    while ( @tokens ) {
+        $_ = shift @tokens;
+        ## Look for the beginning of a sequence
+        if ( /^([A-Z])(<(?:<+\s)?)$/ ) {
+            ## Push a new sequence onto the stack of those "in-progress"
+            my $ldelim_orig;
+            ($cmd, $ldelim_orig) = ($1, $2);
+            ($ldelim = $ldelim_orig) =~ s/\s+$//;
+            ($rdelim = $ldelim) =~ tr/</>/;
+            $seq = Pod::InteriorSequence->new(
+                       -name   => $cmd,
+                       -ldelim => $ldelim_orig,  -rdelim => $rdelim,
+                       -file   => $file,    -line   => $line
+                   );
+            (@seq_stack > 1)  and  $seq->nested($seq_stack[-1]);
+            push @seq_stack, $seq;
+        }
+        ## Look for sequence ending
+        elsif ( @seq_stack > 1 ) {
+            ## Make sure we match the right kind of closing delimiter
+            my ($seq_end, $post_seq) = ("", "");
+            if ( ($ldelim eq '<'   and  /\A(.*?)(>)/s)
+                 or  /\A(.*?)(\s+$rdelim)/s )
+            {
+                ## Found end-of-sequence, capture the interior and the
+                ## closing the delimiter, and put the rest back on the
+                ## token-list
+                $post_seq = substr($_, length($1) + length($2));
+                ($_, $seq_end) = ($1, $2);
+                (length $post_seq)  and  unshift @tokens, $post_seq;
+            }
+            if (length) {
+                ## In the middle of a sequence, append this text to it, and
+                ## dont forget to "expand" it if that's what the caller wanted
+                $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_);
+                $_ .= $seq_end;
+            }
+            if (length $seq_end) {
+                ## End of current sequence, record terminating delimiter
+                $seq->rdelim($seq_end);
+                ## Pop it off the stack of "in progress" sequences
+                pop @seq_stack;
+                ## Append result to its parent in current parse tree
+                $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq)
+                                                   : $seq);
+                ## Remember the current cmd-name and left-delimiter
+                if(@seq_stack > 1) {
+                    $cmd = $seq_stack[-1]->name;
+                    $ldelim = $seq_stack[-1]->ldelim;
+                    $rdelim = $seq_stack[-1]->rdelim;
+                } else {
+                    $cmd = $ldelim = $rdelim = '';
+                }
+            }
+        }
+        elsif (length) {
+            ## In the middle of a sequence, append this text to it, and
+            ## dont forget to "expand" it if that's what the caller wanted
+            $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_);
+        }
+        ## Keep track of line count
+        $line += tr/\n//;
+        ## Remember the "current" sequence
+        $seq = $seq_stack[-1];
+    }
+
+    ## Handle unterminated sequences
+    my $errorsub = (@seq_stack > 1) ? $self->errorsub() : undef;
+    while (@seq_stack > 1) {
+       ($cmd, $file, $line) = ($seq->name, $seq->file_line);
+       $ldelim  = $seq->ldelim;
+       ($rdelim = $ldelim) =~ tr/</>/;
+       $rdelim  =~ s/^(\S+)(\s*)$/$2$1/;
+       pop @seq_stack;
+       my $errmsg = "*** ERROR: unterminated ${cmd}${ldelim}...${rdelim}".
+                    " at line $line in file $file\n";
+       (ref $errorsub) and &{$errorsub}($errmsg)
+           or (defined $errorsub) and $self->$errorsub($errmsg)
+               or  warn($errmsg);
+       $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq) : $seq);
+       $seq = $seq_stack[-1];
+    }
+
+    ## Return the resulting parse-tree
+    my $ptree = (pop @seq_stack)->parse_tree;
+    return  $expand_ptree ? &$xptree_sub($self, $ptree) : $ptree;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<interpolate()>
+
+            $textblock = $parser->interpolate($text, $line_num);
+
+This method translates all text (including any embedded interior sequences)
+in the given text string C<$text> and returns the interpolated result. The
+parameter C<$line_num> is the line number corresponding to the beginning
+of C<$text>.
+
+B<interpolate()> merely invokes a private method to recursively expand
+nested interior sequences in bottom-up order (innermost sequences are
+expanded first). If there is a need to expand nested sequences in
+some alternate order, use B<parse_text> instead.
+
+=cut
+
+sub interpolate {
+    my($self, $text, $line_num) = @_;
+    my %parse_opts = ( -expand_seq => 'interior_sequence' );
+    my $ptree = $self->parse_text( \%parse_opts, $text, $line_num );
+    return  join "", $ptree->children();
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<parse_paragraph()>
+
+            $parser->parse_paragraph($text, $line_num);
+
+This method takes the text of a POD paragraph to be processed, along
+with its corresponding line number, and invokes the appropriate method
+(one of B<command()>, B<verbatim()>, or B<textblock()>).
+
+For performance reasons, this method is invoked directly without any
+dynamic lookup; Hence subclasses may I<not> override it!
+
+=end __PRIVATE__
+
+=cut
+
+sub parse_paragraph {
+    my ($self, $text, $line_num) = @_;
+    local *myData = $self;  ## alias to avoid deref-ing overhead
+    local *myOpts = ($myData{_PARSEOPTS} ||= {});  ## get parse-options
+    local $_;
+
+    ## See if we want to preprocess nonPOD paragraphs as well as POD ones.
+    my $wantNonPods = $myOpts{'-want_nonPODs'};
+
+    ## Update cutting status
+    $myData{_CUTTING} = 0 if $text =~ /^={1,2}\S/;
+
+    ## Perform any desired preprocessing if we wanted it this early
+    $wantNonPods  and  $text = $self->preprocess_paragraph($text, $line_num);
+
+    ## Ignore up until next POD directive if we are cutting
+    return if $myData{_CUTTING};
+
+    ## Now we know this is block of text in a POD section!
+
+    ##-----------------------------------------------------------------
+    ## This is a hook (hack ;-) for Pod::Select to do its thing without
+    ## having to override methods, but also without Pod::Parser assuming
+    ## $self is an instance of Pod::Select (if the _SELECTED_SECTIONS
+    ## field exists then we assume there is an is_selected() method for
+    ## us to invoke (calling $self->can('is_selected') could verify this
+    ## but that is more overhead than I want to incur)
+    ##-----------------------------------------------------------------
+
+    ## Ignore this block if it isnt in one of the selected sections
+    if (exists $myData{_SELECTED_SECTIONS}) {
+        $self->is_selected($text)  or  return ($myData{_CUTTING} = 1);
+    }
+
+    ## If we havent already, perform any desired preprocessing and
+    ## then re-check the "cutting" state
+    unless ($wantNonPods) {
+       $text = $self->preprocess_paragraph($text, $line_num);
+       return 1  unless ((defined $text) and (length $text));
+       return 1  if ($myData{_CUTTING});
+    }
+
+    ## Look for one of the three types of paragraphs
+    my ($pfx, $cmd, $arg, $sep) = ('', '', '', '');
+    my $pod_para = undef;
+    if ($text =~ /^(={1,2})(?=\S)/) {
+        ## Looks like a command paragraph. Capture the command prefix used
+        ## ("=" or "=="), as well as the command-name, its paragraph text,
+        ## and whatever sequence of characters was used to separate them
+        $pfx = $1;
+        $_ = substr($text, length $pfx);
+        ($cmd, $sep, $text) = split /(\s+)/, $_, 2; 
+        ## If this is a "cut" directive then we dont need to do anything
+        ## except return to "cutting" mode.
+        if ($cmd eq 'cut') {
+           $myData{_CUTTING} = 1;
+           return  unless $myOpts{'-process_cut_cmd'};
+        }
+    }
+    ## Save the attributes indicating how the command was specified.
+    $pod_para = new Pod::Paragraph(
+          -name      => $cmd,
+          -text      => $text,
+          -prefix    => $pfx,
+          -separator => $sep,
+          -file      => $myData{_INFILE},
+          -line      => $line_num
+    );
+    # ## Invoke appropriate callbacks
+    # if (exists $myData{_CALLBACKS}) {
+    #    ## Look through the callback list, invoke callbacks,
+    #    ## then see if we need to do the default actions
+    #    ## (invoke_callbacks will return true if we do).
+    #    return  1  unless $self->invoke_callbacks($cmd, $text, $line_num, $pod_para);
+    # }
+    if (length $cmd) {
+        ## A command paragraph
+        $self->command($cmd, $text, $line_num, $pod_para);
+    }
+    elsif ($text =~ /^\s+/) {
+        ## Indented text - must be a verbatim paragraph
+        $self->verbatim($text, $line_num, $pod_para);
+    }
+    else {
+        ## Looks like an ordinary block of text
+        $self->textblock($text, $line_num, $pod_para);
+    }
+    return  1;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_from_filehandle()>
+
+            $parser->parse_from_filehandle($in_fh,$out_fh);
+
+This method takes an input filehandle (which is assumed to already be
+opened for reading) and reads the entire input stream looking for blocks
+(paragraphs) of POD documentation to be processed. If no first argument
+is given the default input filehandle C<STDIN> is used.
+
+The C<$in_fh> parameter may be any object that provides a B<getline()>
+method to retrieve a single line of input text (hence, an appropriate
+wrapper object could be used to parse PODs from a single string or an
+array of strings).
+
+Using C<$in_fh-E<gt>getline()>, input is read line-by-line and assembled
+into paragraphs or "blocks" (which are separated by lines containing
+nothing but whitespace). For each block of POD documentation
+encountered it will invoke a method to parse the given paragraph.
+
+If a second argument is given then it should correspond to a filehandle where
+output should be sent (otherwise the default output filehandle is
+C<STDOUT> if no output filehandle is currently in use).
+
+B<NOTE:> For performance reasons, this method caches the input stream at
+the top of the stack in a local variable. Any attempts by clients to
+change the stack contents during processing when in the midst executing
+of this method I<will not affect> the input stream used by the current
+invocation of this method.
+
+This method does I<not> usually need to be overridden by subclasses.
+
+=cut
+
+sub parse_from_filehandle {
+    my $self = shift;
+    my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : ();
+    my ($in_fh, $out_fh) = @_;
+    $in_fh = \*STDIN  unless ($in_fh);
+    local *myData = $self;  ## alias to avoid deref-ing overhead
+    local *myOpts = ($myData{_PARSEOPTS} ||= {});  ## get parse-options
+    local $_;
+
+    ## Put this stream at the top of the stack and do beginning-of-input
+    ## processing. NOTE that $in_fh might be reset during this process.
+    my $topstream = $self->_push_input_stream($in_fh, $out_fh);
+    (exists $opts{-cutting})  and  $self->cutting( $opts{-cutting} );
+
+    ## Initialize line/paragraph
+    my ($textline, $paragraph) = ('', '');
+    my ($nlines, $plines) = (0, 0);
+
+    ## Use <$fh> instead of $fh->getline where possible (for speed)
+    $_ = ref $in_fh;
+    my $tied_fh = (/^(?:GLOB|FileHandle|IO::\w+)$/  or  tied $in_fh);
+
+    ## Read paragraphs line-by-line
+    while (defined ($textline = $tied_fh ? <$in_fh> : $in_fh->getline)) {
+        $textline = $self->preprocess_line($textline, ++$nlines);
+        next  unless ((defined $textline)  &&  (length $textline));
+
+        if ((! length $paragraph) && ($textline =~ /^==/)) {
+            ## '==' denotes a one-line command paragraph
+            $paragraph = $textline;
+            $plines    = 1;
+            $textline  = '';
+        } else {
+            ## Append this line to the current paragraph
+            $paragraph .= $textline;
+            ++$plines;
+        }
+
+        ## See if this line is blank and ends the current paragraph.
+        ## If it isnt, then keep iterating until it is.
+        next unless (($textline =~ /^([^\S\r\n]*)[\r\n]*$/)
+                                     && (length $paragraph));
+
+        ## Issue a warning about any non-empty blank lines
+        if (length($1) > 0 and $myOpts{'-warnings'} and ! $myData{_CUTTING}) {
+            my $errorsub = $self->errorsub();
+            my $file = $self->input_file();
+            my $errmsg = "*** WARNING: line containing nothing but whitespace".
+                         " in paragraph at line $nlines in file $file\n";
+            (ref $errorsub) and &{$errorsub}($errmsg)
+                or (defined $errorsub) and $self->$errorsub($errmsg)
+                    or  warn($errmsg);
+        }
+
+        ## Now process the paragraph
+        parse_paragraph($self, $paragraph, ($nlines - $plines) + 1);
+        $paragraph = '';
+        $plines = 0;
+    }
+    ## Dont forget about the last paragraph in the file
+    if (length $paragraph) {
+       parse_paragraph($self, $paragraph, ($nlines - $plines) + 1)
+    }
+
+    ## Now pop the input stream off the top of the input stack.
+    $self->_pop_input_stream();
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_from_file()>
+
+            $parser->parse_from_file($filename,$outfile);
+
+This method takes a filename and does the following:
+
+=over 2
+
+=item *
+
+opens the input and output files for reading
+(creating the appropriate filehandles)
+
+=item *
+
+invokes the B<parse_from_filehandle()> method passing it the
+corresponding input and output filehandles.
+
+=item *
+
+closes the input and output files.
+
+=back
+
+If the special input filename "-" or "<&STDIN" is given then the STDIN
+filehandle is used for input (and no open or close is performed). If no
+input filename is specified then "-" is implied.
+
+If a second argument is given then it should be the name of the desired
+output file. If the special output filename "-" or ">&STDOUT" is given
+then the STDOUT filehandle is used for output (and no open or close is
+performed). If the special output filename ">&STDERR" is given then the
+STDERR filehandle is used for output (and no open or close is
+performed). If no output filehandle is currently in use and no output
+filename is specified, then "-" is implied.
+Alternatively, an L<IO::String> object is also accepted as an output
+file handle.
+
+This method does I<not> usually need to be overridden by subclasses.
+
+=cut
+
+sub parse_from_file {
+    my $self = shift;
+    my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : ();
+    my ($infile, $outfile) = @_;
+    my ($in_fh,  $out_fh) = (gensym(), gensym())  if ($] < 5.006);
+    my ($close_input, $close_output) = (0, 0);
+    local *myData = $self;
+    local *_;
+
+    ## Is $infile a filename or a (possibly implied) filehandle
+    if (defined $infile && ref $infile) {
+        if (ref($infile) =~ /^(SCALAR|ARRAY|HASH|CODE|REF)$/) {
+            croak "Input from $1 reference not supported!\n";
+        }
+        ## Must be a filehandle-ref (or else assume its a ref to an object
+        ## that supports the common IO read operations).
+        $myData{_INFILE} = ${$infile};
+        $in_fh = $infile;
+    }
+    elsif (!defined($infile) || !length($infile) || ($infile eq '-')
+        || ($infile =~ /^<&(?:STDIN|0)$/i))
+    {
+        ## Not a filename, just a string implying STDIN
+        $infile ||= '-';
+        $myData{_INFILE} = "<standard input>";
+        $in_fh = \*STDIN;
+    }
+    else {
+        ## We have a filename, open it for reading
+        $myData{_INFILE} = $infile;
+        open($in_fh, "< $infile")  or
+             croak "Can't open $infile for reading: $!\n";
+        $close_input = 1;
+    }
+
+    ## NOTE: we need to be *very* careful when "defaulting" the output
+    ## file. We only want to use a default if this is the beginning of
+    ## the entire document (but *not* if this is an included file). We
+    ## determine this by seeing if the input stream stack has been set-up
+    ## already
+
+    ## Is $outfile a filename, a (possibly implied) filehandle, maybe a ref?
+    if (ref $outfile) {
+        ## we need to check for ref() first, as other checks involve reading
+        if (ref($outfile) =~ /^(ARRAY|HASH|CODE)$/) {
+            croak "Output to $1 reference not supported!\n";
+        }
+        elsif (ref($outfile) eq 'SCALAR') {
+#           # NOTE: IO::String isn't a part of the perl distribution,
+#           #       so probably we shouldn't support this case...
+#           require IO::String;
+#           $myData{_OUTFILE} = "$outfile";
+#           $out_fh = IO::String->new($outfile);
+            croak "Output to SCALAR reference not supported!\n";
+        }
+        else {
+            ## Must be a filehandle-ref (or else assume its a ref to an
+            ## object that supports the common IO write operations).
+            $myData{_OUTFILE} = ${$outfile};
+            $out_fh = $outfile;
+        }
+    }
+    elsif (!defined($outfile) || !length($outfile) || ($outfile eq '-')
+        || ($outfile =~ /^>&?(?:STDOUT|1)$/i))
+    {
+        if (defined $myData{_TOP_STREAM}) {
+            $out_fh = $myData{_OUTPUT};
+        }
+        else {
+            ## Not a filename, just a string implying STDOUT
+            $outfile ||= '-';
+            $myData{_OUTFILE} = "<standard output>";
+            $out_fh  = \*STDOUT;
+        }
+    }
+    elsif ($outfile =~ /^>&(STDERR|2)$/i) {
+        ## Not a filename, just a string implying STDERR
+        $myData{_OUTFILE} = "<standard error>";
+        $out_fh  = \*STDERR;
+    }
+    else {
+        ## We have a filename, open it for writing
+        $myData{_OUTFILE} = $outfile;
+        (-d $outfile) and croak "$outfile is a directory, not POD input!\n";
+        open($out_fh, "> $outfile")  or
+             croak "Can't open $outfile for writing: $!\n";
+        $close_output = 1;
+    }
+
+    ## Whew! That was a lot of work to set up reasonably/robust behavior
+    ## in the case of a non-filename for reading and writing. Now we just
+    ## have to parse the input and close the handles when we're finished.
+    $self->parse_from_filehandle(\%opts, $in_fh, $out_fh);
+
+    $close_input  and 
+        close($in_fh) || croak "Can't close $infile after reading: $!\n";
+    $close_output  and
+        close($out_fh) || croak "Can't close $outfile after writing: $!\n";
+}
+
+#############################################################################
+
+=head1 ACCESSOR METHODS
+
+Clients of B<Pod::Parser> should use the following methods to access
+instance data fields:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<errorsub()>
+
+            $parser->errorsub("method_name");
+            $parser->errorsub(\&warn_user);
+            $parser->errorsub(sub { print STDERR, @_ });
+
+Specifies the method or subroutine to use when printing error messages
+about POD syntax. The supplied method/subroutine I<must> return TRUE upon
+successful printing of the message. If C<undef> is given, then the B<warn>
+builtin is used to issue error messages (this is the default behavior).
+
+            my $errorsub = $parser->errorsub()
+            my $errmsg = "This is an error message!\n"
+            (ref $errorsub) and &{$errorsub}($errmsg)
+                or (defined $errorsub) and $parser->$errorsub($errmsg)
+                    or  warn($errmsg);
+
+Returns a method name, or else a reference to the user-supplied subroutine
+used to print error messages. Returns C<undef> if the B<warn> builtin
+is used to issue error messages (this is the default behavior).
+
+=cut
+
+sub errorsub {
+   return (@_ > 1) ? ($_[0]->{_ERRORSUB} = $_[1]) : $_[0]->{_ERRORSUB};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<cutting()>
+
+            $boolean = $parser->cutting();
+
+Returns the current C<cutting> state: a boolean-valued scalar which
+evaluates to true if text from the input file is currently being "cut"
+(meaning it is I<not> considered part of the POD document).
+
+            $parser->cutting($boolean);
+
+Sets the current C<cutting> state to the given value and returns the
+result.
+
+=cut
+
+sub cutting {
+   return (@_ > 1) ? ($_[0]->{_CUTTING} = $_[1]) : $_[0]->{_CUTTING};
+}
+
+##---------------------------------------------------------------------------
+
+##---------------------------------------------------------------------------
+
+=head1 B<parseopts()>
+
+When invoked with no additional arguments, B<parseopts> returns a hashtable
+of all the current parsing options.
+
+            ## See if we are parsing non-POD sections as well as POD ones
+            my %opts = $parser->parseopts();
+            $opts{'-want_nonPODs}' and print "-want_nonPODs\n";
+
+When invoked using a single string, B<parseopts> treats the string as the
+name of a parse-option and returns its corresponding value if it exists
+(returns C<undef> if it doesn't).
+
+            ## Did we ask to see '=cut' paragraphs?
+            my $want_cut = $parser->parseopts('-process_cut_cmd');
+            $want_cut and print "-process_cut_cmd\n";
+
+When invoked with multiple arguments, B<parseopts> treats them as
+key/value pairs and the specified parse-option names are set to the
+given values. Any unspecified parse-options are unaffected.
+
+            ## Set them back to the default
+            $parser->parseopts(-warnings => 0);
+
+When passed a single hash-ref, B<parseopts> uses that hash to completely
+reset the existing parse-options, all previous parse-option values
+are lost.
+
+            ## Reset all options to default 
+            $parser->parseopts( { } );
+
+See L<"PARSING OPTIONS"> for more information on the name and meaning of each
+parse-option currently recognized.
+
+=cut
+
+sub parseopts {
+   local *myData = shift;
+   local *myOpts = ($myData{_PARSEOPTS} ||= {});
+   return %myOpts  if (@_ == 0);
+   if (@_ == 1) {
+      local $_ = shift;
+      return  ref($_)  ?  $myData{_PARSEOPTS} = $_  :  $myOpts{$_};
+   }
+   my @newOpts = (%myOpts, @_);
+   $myData{_PARSEOPTS} = { @newOpts };
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<output_file()>
+
+            $fname = $parser->output_file();
+
+Returns the name of the output file being written.
+
+=cut
+
+sub output_file {
+   return $_[0]->{_OUTFILE};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<output_handle()>
+
+            $fhandle = $parser->output_handle();
+
+Returns the output filehandle object.
+
+=cut
+
+sub output_handle {
+   return $_[0]->{_OUTPUT};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<input_file()>
+
+            $fname = $parser->input_file();
+
+Returns the name of the input file being read.
+
+=cut
+
+sub input_file {
+   return $_[0]->{_INFILE};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<input_handle()>
+
+            $fhandle = $parser->input_handle();
+
+Returns the current input filehandle object.
+
+=cut
+
+sub input_handle {
+   return $_[0]->{_INPUT};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<input_streams()>
+
+            $listref = $parser->input_streams();
+
+Returns a reference to an array which corresponds to the stack of all
+the input streams that are currently in the middle of being parsed.
+
+While parsing an input stream, it is possible to invoke
+B<parse_from_file()> or B<parse_from_filehandle()> to parse a new input
+stream and then return to parsing the previous input stream. Each input
+stream to be parsed is pushed onto the end of this input stack
+before any of its input is read. The input stream that is currently
+being parsed is always at the end (or top) of the input stack. When an
+input stream has been exhausted, it is popped off the end of the
+input stack.
+
+Each element on this input stack is a reference to C<Pod::InputSource>
+object. Please see L<Pod::InputObjects> for more details.
+
+This method might be invoked when printing diagnostic messages, for example,
+to obtain the name and line number of the all input files that are currently
+being processed.
+
+=end __PRIVATE__
+
+=cut
+
+sub input_streams {
+   return $_[0]->{_INPUT_STREAMS};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<top_stream()>
+
+            $hashref = $parser->top_stream();
+
+Returns a reference to the hash-table that represents the element
+that is currently at the top (end) of the input stream stack
+(see L<"input_streams()">). The return value will be the C<undef>
+if the input stack is empty.
+
+This method might be used when printing diagnostic messages, for example,
+to obtain the name and line number of the current input file.
+
+=end __PRIVATE__
+
+=cut
+
+sub top_stream {
+   return $_[0]->{_TOP_STREAM} || undef;
+}
+
+#############################################################################
+
+=head1 PRIVATE METHODS AND DATA
+
+B<Pod::Parser> makes use of several internal methods and data fields
+which clients should not need to see or use. For the sake of avoiding
+name collisions for client data and methods, these methods and fields
+are briefly discussed here. Determined hackers may obtain further
+information about them by reading the B<Pod::Parser> source code.
+
+Private data fields are stored in the hash-object whose reference is
+returned by the B<new()> constructor for this class. The names of all
+private methods and data-fields used by B<Pod::Parser> begin with a
+prefix of "_" and match the regular expression C</^_\w+$/>.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_push_input_stream()>
+
+            $hashref = $parser->_push_input_stream($in_fh,$out_fh);
+
+This method will push the given input stream on the input stack and
+perform any necessary beginning-of-document or beginning-of-file
+processing. The argument C<$in_fh> is the input stream filehandle to
+push, and C<$out_fh> is the corresponding output filehandle to use (if
+it is not given or is undefined, then the current output stream is used,
+which defaults to standard output if it doesnt exist yet).
+
+The value returned will be reference to the hash-table that represents
+the new top of the input stream stack. I<Please Note> that it is
+possible for this method to use default values for the input and output
+file handles. If this happens, you will need to look at the C<INPUT>
+and C<OUTPUT> instance data members to determine their new values.
+
+=end _PRIVATE_
+
+=cut
+
+sub _push_input_stream {
+    my ($self, $in_fh, $out_fh) = @_;
+    local *myData = $self;
+
+    ## Initialize stuff for the entire document if this is *not*
+    ## an included file.
+    ##
+    ## NOTE: we need to be *very* careful when "defaulting" the output
+    ## filehandle. We only want to use a default value if this is the
+    ## beginning of the entire document (but *not* if this is an included
+    ## file).
+    unless (defined  $myData{_TOP_STREAM}) {
+        $out_fh  = \*STDOUT  unless (defined $out_fh);
+        $myData{_CUTTING}       = 1;   ## current "cutting" state
+        $myData{_INPUT_STREAMS} = [];  ## stack of all input streams
+    }
+
+    ## Initialize input indicators
+    $myData{_OUTFILE} = '(unknown)'  unless (defined  $myData{_OUTFILE});
+    $myData{_OUTPUT}  = $out_fh      if (defined  $out_fh);
+    $in_fh            = \*STDIN      unless (defined  $in_fh);
+    $myData{_INFILE}  = '(unknown)'  unless (defined  $myData{_INFILE});
+    $myData{_INPUT}   = $in_fh;
+    my $input_top     = $myData{_TOP_STREAM}
+                      = new Pod::InputSource(
+                            -name        => $myData{_INFILE},
+                            -handle      => $in_fh,
+                            -was_cutting => $myData{_CUTTING}
+                        );
+    local *input_stack = $myData{_INPUT_STREAMS};
+    push(@input_stack, $input_top);
+
+    ## Perform beginning-of-document and/or beginning-of-input processing
+    $self->begin_pod()  if (@input_stack == 1);
+    $self->begin_input();
+
+    return  $input_top;
+}
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_pop_input_stream()>
+
+            $hashref = $parser->_pop_input_stream();
+
+This takes no arguments. It will perform any necessary end-of-file or
+end-of-document processing and then pop the current input stream from
+the top of the input stack.
+
+The value returned will be reference to the hash-table that represents
+the new top of the input stream stack.
+
+=end _PRIVATE_
+
+=cut
+
+sub _pop_input_stream {
+    my ($self) = @_;
+    local *myData = $self;
+    local *input_stack = $myData{_INPUT_STREAMS};
+
+    ## Perform end-of-input and/or end-of-document processing
+    $self->end_input()  if (@input_stack > 0);
+    $self->end_pod()    if (@input_stack == 1);
+
+    ## Restore cutting state to whatever it was before we started
+    ## parsing this file.
+    my $old_top = pop(@input_stack);
+    $myData{_CUTTING} = $old_top->was_cutting();
+
+    ## Dont forget to reset the input indicators
+    my $input_top = undef;
+    if (@input_stack > 0) {
+       $input_top = $myData{_TOP_STREAM} = $input_stack[-1];
+       $myData{_INFILE}  = $input_top->name();
+       $myData{_INPUT}   = $input_top->handle();
+    } else {
+       delete $myData{_TOP_STREAM};
+       delete $myData{_INPUT_STREAMS};
+    }
+
+    return  $input_top;
+}
+
+#############################################################################
+
+=head1 TREE-BASED PARSING
+
+If straightforward stream-based parsing wont meet your needs (as is
+likely the case for tasks such as translating PODs into structured
+markup languages like HTML and XML) then you may need to take the
+tree-based approach. Rather than doing everything in one pass and
+calling the B<interpolate()> method to expand sequences into text, it
+may be desirable to instead create a parse-tree using the B<parse_text()>
+method to return a tree-like structure which may contain an ordered
+list of children (each of which may be a text-string, or a similar
+tree-like structure).
+
+Pay special attention to L<"METHODS FOR PARSING AND PROCESSING"> and
+to the objects described in L<Pod::InputObjects>. The former describes
+the gory details and parameters for how to customize and extend the
+parsing behavior of B<Pod::Parser>. B<Pod::InputObjects> provides
+several objects that may all be used interchangeably as parse-trees. The
+most obvious one is the B<Pod::ParseTree> object. It defines the basic
+interface and functionality that all things trying to be a POD parse-tree
+should do. A B<Pod::ParseTree> is defined such that each "node" may be a
+text-string, or a reference to another parse-tree.  Each B<Pod::Paragraph>
+object and each B<Pod::InteriorSequence> object also supports the basic
+parse-tree interface.
+
+The B<parse_text()> method takes a given paragraph of text, and
+returns a parse-tree that contains one or more children, each of which
+may be a text-string, or an InteriorSequence object. There are also
+callback-options that may be passed to B<parse_text()> to customize
+the way it expands or transforms interior-sequences, as well as the
+returned result. These callbacks can be used to create a parse-tree
+with custom-made objects (which may or may not support the parse-tree
+interface, depending on how you choose to do it).
+
+If you wish to turn an entire POD document into a parse-tree, that process
+is fairly straightforward. The B<parse_text()> method is the key to doing
+this successfully. Every paragraph-callback (i.e. the polymorphic methods
+for B<command()>, B<verbatim()>, and B<textblock()> paragraphs) takes
+a B<Pod::Paragraph> object as an argument. Each paragraph object has a
+B<parse_tree()> method that can be used to get or set a corresponding
+parse-tree. So for each of those paragraph-callback methods, simply call
+B<parse_text()> with the options you desire, and then use the returned
+parse-tree to assign to the given paragraph object.
+
+That gives you a parse-tree for each paragraph - so now all you need is
+an ordered list of paragraphs. You can maintain that yourself as a data
+element in the object/hash. The most straightforward way would be simply
+to use an array-ref, with the desired set of custom "options" for each
+invocation of B<parse_text>. Let's assume the desired option-set is
+given by the hash C<%options>. Then we might do something like the
+following:
+
+    package MyPodParserTree;
+
+    @ISA = qw( Pod::Parser );
+
+    ...
+
+    sub begin_pod {
+        my $self = shift;
+        $self->{'-paragraphs'} = [];  ## initialize paragraph list
+    }
+
+    sub command { 
+        my ($parser, $command, $paragraph, $line_num, $pod_para) = @_;
+        my $ptree = $parser->parse_text({%options}, $paragraph, ...);
+        $pod_para->parse_tree( $ptree );
+        push @{ $self->{'-paragraphs'} }, $pod_para;
+    }
+
+    sub verbatim { 
+        my ($parser, $paragraph, $line_num, $pod_para) = @_;
+        push @{ $self->{'-paragraphs'} }, $pod_para;
+    }
+
+    sub textblock { 
+        my ($parser, $paragraph, $line_num, $pod_para) = @_;
+        my $ptree = $parser->parse_text({%options}, $paragraph, ...);
+        $pod_para->parse_tree( $ptree );
+        push @{ $self->{'-paragraphs'} }, $pod_para;
+    }
+
+    ...
+
+    package main;
+    ...
+    my $parser = new MyPodParserTree(...);
+    $parser->parse_from_file(...);
+    my $paragraphs_ref = $parser->{'-paragraphs'};
+
+Of course, in this module-author's humble opinion, I'd be more inclined to
+use the existing B<Pod::ParseTree> object than a simple array. That way
+everything in it, paragraphs and sequences, all respond to the same core
+interface for all parse-tree nodes. The result would look something like:
+
+    package MyPodParserTree2;
+
+    ...
+
+    sub begin_pod {
+        my $self = shift;
+        $self->{'-ptree'} = new Pod::ParseTree;  ## initialize parse-tree
+    }
+
+    sub parse_tree {
+        ## convenience method to get/set the parse-tree for the entire POD
+        (@_ > 1)  and  $_[0]->{'-ptree'} = $_[1];
+        return $_[0]->{'-ptree'};
+    }
+
+    sub command { 
+        my ($parser, $command, $paragraph, $line_num, $pod_para) = @_;
+        my $ptree = $parser->parse_text({<<options>>}, $paragraph, ...);
+        $pod_para->parse_tree( $ptree );
+        $parser->parse_tree()->append( $pod_para );
+    }
+
+    sub verbatim { 
+        my ($parser, $paragraph, $line_num, $pod_para) = @_;
+        $parser->parse_tree()->append( $pod_para );
+    }
+
+    sub textblock { 
+        my ($parser, $paragraph, $line_num, $pod_para) = @_;
+        my $ptree = $parser->parse_text({<<options>>}, $paragraph, ...);
+        $pod_para->parse_tree( $ptree );
+        $parser->parse_tree()->append( $pod_para );
+    }
+
+    ...
+
+    package main;
+    ...
+    my $parser = new MyPodParserTree2(...);
+    $parser->parse_from_file(...);
+    my $ptree = $parser->parse_tree;
+    ...
+
+Now you have the entire POD document as one great big parse-tree. You
+can even use the B<-expand_seq> option to B<parse_text> to insert
+whole different kinds of objects. Just don't expect B<Pod::Parser>
+to know what to do with them after that. That will need to be in your
+code. Or, alternatively, you can insert any object you like so long as
+it conforms to the B<Pod::ParseTree> interface.
+
+One could use this to create subclasses of B<Pod::Paragraphs> and
+B<Pod::InteriorSequences> for specific commands (or to create your own
+custom node-types in the parse-tree) and add some kind of B<emit()>
+method to each custom node/subclass object in the tree. Then all you'd
+need to do is recursively walk the tree in the desired order, processing
+the children (most likely from left to right) by formatting them if
+they are text-strings, or by calling their B<emit()> method if they
+are objects/references.
+
+=head1 SEE ALSO
+
+L<Pod::InputObjects>, L<Pod::Select>
+
+B<Pod::InputObjects> defines POD input objects corresponding to
+command paragraphs, parse-trees, and interior-sequences.
+
+B<Pod::Select> is a subclass of B<Pod::Parser> which provides the ability
+to selectively include and/or exclude sections of a POD document from being
+translated based upon the current heading, subheading, subsubheading, etc.
+
+=for __PRIVATE__
+B<Pod::Callbacks> is a subclass of B<Pod::Parser> which gives its users
+the ability the employ I<callback functions> instead of, or in addition
+to, overriding methods of the base class.
+
+=for __PRIVATE__
+B<Pod::Select> and B<Pod::Callbacks> do not override any
+methods nor do they define any new methods with the same name. Because
+of this, they may I<both> be used (in combination) as a base class of
+the same subclass in order to combine their functionality without
+causing any namespace clashes due to multiple inheritance.
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<Pod::Text> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+1;
+# vim: ts=4 sw=4 et
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc.pm	(revision 14489)
@@ -0,0 +1,1761 @@
+
+require 5;
+use 5.006;  # we use some open(X, "<", $y) syntax 
+package Pod::Perldoc;
+use strict;
+use warnings;
+use Config '%Config';
+
+use Fcntl;    # for sysopen
+use File::Spec::Functions qw(catfile catdir splitdir);
+
+use vars qw($VERSION @Pagers $Bindir $Pod2man
+  $Temp_Files_Created $Temp_File_Lifetime
+);
+$VERSION = '3.14';
+#..........................................................................
+
+BEGIN {  # Make a DEBUG constant very first thing...
+  unless(defined &DEBUG) {
+    if(($ENV{'PERLDOCDEBUG'} || '') =~ m/^(\d+)/) { # untaint
+      eval("sub DEBUG () {$1}");
+      die "WHAT? Couldn't eval-up a DEBUG constant!? $@" if $@;
+    } else {
+      *DEBUG = sub () {0};
+    }
+  }
+}
+
+use Pod::Perldoc::GetOptsOO; # uses the DEBUG.
+
+#..........................................................................
+
+sub TRUE  () {1}
+sub FALSE () {return}
+
+BEGIN {
+ *IS_VMS     = $^O eq 'VMS'     ? \&TRUE : \&FALSE unless defined &IS_VMS;
+ *IS_MSWin32 = $^O eq 'MSWin32' ? \&TRUE : \&FALSE unless defined &IS_MSWin32;
+ *IS_Dos     = $^O eq 'dos'     ? \&TRUE : \&FALSE unless defined &IS_Dos;
+ *IS_OS2     = $^O eq 'os2'     ? \&TRUE : \&FALSE unless defined &IS_OS2;
+ *IS_Cygwin  = $^O eq 'cygwin'  ? \&TRUE : \&FALSE unless defined &IS_Cygwin;
+ *IS_Linux   = $^O eq 'linux'   ? \&TRUE : \&FALSE unless defined &IS_Linux;
+ *IS_HPUX    = $^O =~ m/hpux/   ? \&TRUE : \&FALSE unless defined &IS_HPUX;
+}
+
+$Temp_File_Lifetime ||= 60 * 60 * 24 * 5;
+  # If it's older than five days, it's quite unlikely
+  #  that anyone's still looking at it!!
+  # (Currently used only by the MSWin cleanup routine)
+
+
+#..........................................................................
+{ my $pager = $Config{'pager'};
+  push @Pagers, $pager if -x (split /\s+/, $pager)[0] or IS_VMS;
+}
+$Bindir  = $Config{'scriptdirexp'};
+$Pod2man = "pod2man" . ( $Config{'versiononly'} ? $Config{'version'} : '' );
+
+# End of class-init stuff
+#
+###########################################################################
+#
+# Option accessors...
+
+foreach my $subname (map "opt_$_", split '', q{mhlvriFfXqnTdU}) {
+  no strict 'refs';
+  *$subname = do{ use strict 'refs';  sub () { shift->_elem($subname, @_) } };
+}
+
+# And these are so that GetOptsOO knows they take options:
+sub opt_f_with { shift->_elem('opt_f', @_) }
+sub opt_q_with { shift->_elem('opt_q', @_) }
+sub opt_d_with { shift->_elem('opt_d', @_) }
+
+sub opt_w_with { # Specify an option for the formatter subclass
+  my($self, $value) = @_;
+  if($value =~ m/^([-_a-zA-Z][-_a-zA-Z0-9]*)(?:[=\:](.*?))?$/s) {
+    my $option = $1;
+    my $option_value = defined($2) ? $2 : "TRUE";
+    $option =~ tr/\-/_/s;  # tolerate "foo-bar" for "foo_bar"
+    $self->add_formatter_option( $option, $option_value );
+  } else {
+    warn "\"$value\" isn't a good formatter option name.  I'm ignoring it!\n";
+  }
+  return;
+}
+
+sub opt_M_with { # specify formatter class name(s)
+  my($self, $classes) = @_;
+  return unless defined $classes and length $classes;
+  DEBUG > 4 and print "Considering new formatter classes -M$classes\n";
+  my @classes_to_add;
+  foreach my $classname (split m/[,;]+/s, $classes) {
+    next unless $classname =~ m/\S/;
+    if( $classname =~ m/^(\w+(::\w+)+)$/s ) {
+      # A mildly restrictive concept of what modulenames are valid.
+      push @classes_to_add, $1; # untaint
+    } else {
+      warn "\"$classname\" isn't a valid classname.  Ignoring.\n";
+    }
+  }
+  
+  unshift @{ $self->{'formatter_classes'} }, @classes_to_add;
+  
+  DEBUG > 3 and print(
+    "Adding @classes_to_add to the list of formatter classes, "
+    . "making them @{ $self->{'formatter_classes'} }.\n"
+  );
+  
+  return;
+}
+
+sub opt_V { # report version and exit
+  print join '',
+    "Perldoc v$VERSION, under perl v$] for $^O",
+
+    (defined(&Win32::BuildNumber) and defined &Win32::BuildNumber())
+     ? (" (win32 build ", &Win32::BuildNumber(), ")") : (),
+    
+    (chr(65) eq 'A') ? () : " (non-ASCII)",
+    
+    "\n",
+  ;
+  exit;
+}
+
+sub opt_t { # choose plaintext as output format
+  my $self = shift;
+  $self->opt_o_with('text')  if @_ and $_[0];
+  return $self->_elem('opt_t', @_);
+}
+
+sub opt_u { # choose raw pod as output format
+  my $self = shift;
+  $self->opt_o_with('pod')  if @_ and $_[0];
+  return $self->_elem('opt_u', @_);
+}
+
+sub opt_n_with {
+  # choose man as the output format, and specify the proggy to run
+  my $self = shift;
+  $self->opt_o_with('man')  if @_ and $_[0];
+  $self->_elem('opt_n', @_);
+}
+
+sub opt_o_with { # "o" for output format
+  my($self, $rest) = @_;
+  return unless defined $rest and length $rest;
+  if($rest =~ m/^(\w+)$/s) {
+    $rest = $1; #untaint
+  } else {
+    warn "\"$rest\" isn't a valid output format.  Skipping.\n";
+    return;
+  }
+  
+  $self->aside("Noting \"$rest\" as desired output format...\n");
+  
+  # Figure out what class(es) that could actually mean...
+  
+  my @classes;
+  foreach my $prefix ("Pod::Perldoc::To", "Pod::Simple::", "Pod::") {
+    # Messy but smart:
+    foreach my $stem (
+      $rest,  # Yes, try it first with the given capitalization
+      "\L$rest", "\L\u$rest", "\U$rest" # And then try variations
+
+    ) {
+      push @classes, $prefix . $stem;
+      #print "Considering $prefix$stem\n";
+    }
+    
+    # Tidier, but misses too much:
+    #push @classes, $prefix . ucfirst(lc($rest));
+  }
+  $self->opt_M_with( join ";", @classes );
+  return;
+}
+
+###########################################################################
+# % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+
+sub run {  # to be called by the "perldoc" executable
+  my $class = shift;
+  if(DEBUG > 3) {
+    print "Parameters to $class\->run:\n";
+    my @x = @_;
+    while(@x) {
+      $x[1] = '<undef>'  unless defined $x[1];
+      $x[1] = "@{$x[1]}" if ref( $x[1] ) eq 'ARRAY';
+      print "  [$x[0]] => [$x[1]]\n";
+      splice @x,0,2;
+    }
+    print "\n";
+  }
+  return $class -> new(@_) -> process() || 0;
+}
+
+# % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+###########################################################################
+
+sub new {  # yeah, nothing fancy
+  my $class = shift;
+  my $new = bless {@_}, (ref($class) || $class);
+  DEBUG > 1 and print "New $class object $new\n";
+  $new->init();
+  $new;
+}
+
+#..........................................................................
+
+sub aside {  # If we're in -v or DEBUG mode, say this.
+  my $self = shift;
+  if( DEBUG or $self->opt_v ) {
+    my $out = join( '',
+      DEBUG ? do {
+        my $callsub = (caller(1))[3];
+        my $package = quotemeta(__PACKAGE__ . '::');
+        $callsub =~ s/^$package/'/os;
+         # the o is justified, as $package really won't change.
+        $callsub . ": ";
+      } : '',
+      @_,
+    );
+    if(DEBUG) { print $out } else { print STDERR $out }
+  }
+  return;
+}
+
+#..........................................................................
+
+sub usage {
+  my $self = shift;
+  warn "@_\n" if @_;
+  
+  # Erase evidence of previous errors (if any), so exit status is simple.
+  $! = 0;
+  
+  die <<EOF;
+perldoc [options] PageName|ModuleName|ProgramName...
+perldoc [options] -f BuiltinFunction
+perldoc [options] -q FAQRegex
+
+Options:
+    -h   Display this help message
+    -V   report version
+    -r   Recursive search (slow)
+    -i   Ignore case
+    -t   Display pod using pod2text instead of pod2man and nroff
+             (-t is the default on win32 unless -n is specified)
+    -u	 Display unformatted pod text
+    -m   Display module's file in its entirety
+    -n   Specify replacement for nroff
+    -l   Display the module's file name
+    -F   Arguments are file names, not modules
+    -v	 Verbosely describe what's going on
+    -T   Send output to STDOUT without any pager
+    -d output_filename_to_send_to
+    -o output_format_name
+    -M FormatterModuleNameToUse
+    -w formatter_option:option_value
+    -X	 use index if present (looks for pod.idx at $Config{archlib})
+    -q   Search the text of questions (not answers) in perlfaq[1-9]
+
+PageName|ModuleName...
+         is the name of a piece of documentation that you want to look at. You
+         may either give a descriptive name of the page (as in the case of
+         `perlfunc') the name of a module, either like `Term::Info' or like
+         `Term/Info', or the name of a program, like `perldoc'.
+
+BuiltinFunction
+         is the name of a perl function.  Will extract documentation from
+         `perlfunc'.
+
+FAQRegex
+         is a regex. Will search perlfaq[1-9] for and extract any
+         questions that match.
+
+Any switches in the PERLDOC environment variable will be used before the
+command line arguments.  The optional pod index file contains a list of
+filenames, one per line.
+                                                       [Perldoc v$VERSION]
+EOF
+
+}
+
+#..........................................................................
+
+sub usage_brief {
+  my $me = $0;		# Editing $0 is unportable
+
+  $me =~ s,.*[/\\],,; # get basename
+  
+  die <<"EOUSAGE";
+Usage: $me [-h] [-V] [-r] [-i] [-v] [-t] [-u] [-m] [-n nroffer_program] [-l] [-T] [-d output_filename] [-o output_format] [-M FormatterModuleNameToUse] [-w formatter_option:option_value] [-F] [-X] PageName|ModuleName|ProgramName
+       $me -f PerlFunc
+       $me -q FAQKeywords
+
+The -h option prints more help.  Also try "perldoc perldoc" to get
+acquainted with the system.                        [Perldoc v$VERSION]
+EOUSAGE
+
+}
+
+#..........................................................................
+
+sub pagers { @{ shift->{'pagers'} } } 
+
+#..........................................................................
+
+sub _elem {  # handy scalar meta-accessor: shift->_elem("foo", @_)
+  if(@_ > 2) { return  $_[0]{ $_[1] } = $_[2]  }
+  else       { return  $_[0]{ $_[1] }          }
+}
+#..........................................................................
+###########################################################################
+#
+# Init formatter switches, and start it off with __bindir and all that
+# other stuff that ToMan.pm needs.
+#
+
+sub init {
+  my $self = shift;
+
+  # Make sure creat()s are neither too much nor too little
+  eval { umask(0077) };   # doubtless someone has no mask
+
+  $self->{'args'}              ||= \@ARGV;
+  $self->{'found'}             ||= [];
+  $self->{'temp_file_list'}    ||= [];
+  
+  
+  $self->{'target'} = undef;
+
+  $self->init_formatter_class_list;
+
+  $self->{'pagers' } = [@Pagers] unless exists $self->{'pagers'};
+  $self->{'bindir' } = $Bindir   unless exists $self->{'bindir'};
+  $self->{'pod2man'} = $Pod2man  unless exists $self->{'pod2man'};
+
+  push @{ $self->{'formatter_switches'} = [] }, (
+   # Yeah, we could use a hashref, but maybe there's some class where options
+   # have to be ordered; so we'll use an arrayref.
+
+     [ '__bindir'  => $self->{'bindir' } ],
+     [ '__pod2man' => $self->{'pod2man'} ],
+  );
+
+  DEBUG > 3 and printf "Formatter switches now: [%s]\n",
+   join ' ', map "[@$_]", @{ $self->{'formatter_switches'} };
+
+  return;
+}
+
+#..........................................................................
+
+sub init_formatter_class_list {
+  my $self = shift;
+  $self->{'formatter_classes'} ||= [];
+
+  # Remember, no switches have been read yet, when
+  # we've started this routine.
+
+  $self->opt_M_with('Pod::Perldoc::ToPod');   # the always-there fallthru
+  $self->opt_o_with('text');
+  $self->opt_o_with('man') unless IS_MSWin32 || IS_Dos
+       || !($ENV{TERM} && (
+              ($ENV{TERM} || '') !~ /dumb|emacs|none|unknown/i
+           ));
+
+  return;
+}
+
+#..........................................................................
+
+sub process {
+    # if this ever returns, its retval will be used for exit(RETVAL)
+
+    my $self = shift;
+    DEBUG > 1 and print "  Beginning process.\n";
+    DEBUG > 1 and print "  Args: @{$self->{'args'}}\n\n";
+    if(DEBUG > 3) {
+        print "Object contents:\n";
+        my @x = %$self;
+        while(@x) {
+            $x[1] = '<undef>'  unless defined $x[1];
+            $x[1] = "@{$x[1]}" if ref( $x[1] ) eq 'ARRAY';
+            print "  [$x[0]] => [$x[1]]\n";
+            splice @x,0,2;
+        }
+        print "\n";
+    }
+
+    # TODO: make it deal with being invoked as various different things
+    #  such as perlfaq".
+  
+    return $self->usage_brief  unless  @{ $self->{'args'} };
+    $self->pagers_guessing;
+    $self->options_reading;
+    $self->aside(sprintf "$0 => %s v%s\n", ref($self), $self->VERSION);
+    $self->drop_privs_maybe;
+    $self->options_processing;
+    
+    # Hm, we have @pages and @found, but we only really act on one
+    # file per call, with the exception of the opt_q hack, and with
+    # -l things
+
+    $self->aside("\n");
+
+    my @pages;
+    $self->{'pages'} = \@pages;
+    if(    $self->opt_f) { @pages = ("perlfunc")               }
+    elsif( $self->opt_q) { @pages = ("perlfaq1" .. "perlfaq9") }
+    else                 { @pages = @{$self->{'args'}};
+                           # @pages = __FILE__
+                           #  if @pages == 1 and $pages[0] eq 'perldoc';
+                         }
+
+    return $self->usage_brief  unless  @pages;
+
+    $self->find_good_formatter_class();
+    $self->formatter_sanity_check();
+
+    $self->maybe_diddle_INC();
+      # for when we're apparently in a module or extension directory
+    
+    my @found = $self->grand_search_init(\@pages);
+    exit (IS_VMS ? 98962 : 1) unless @found;
+    
+    if ($self->opt_l) {
+        DEBUG and print "We're in -l mode, so byebye after this:\n";
+        print join("\n", @found), "\n";
+        return;
+    }
+
+    $self->tweak_found_pathnames(\@found);
+    $self->assert_closing_stdout;
+    return $self->page_module_file(@found)  if  $self->opt_m;
+    DEBUG > 2 and print "Found: [@found]\n";
+
+    return $self->render_and_page(\@found);
+}
+
+#..........................................................................
+{
+
+my( %class_seen, %class_loaded );
+sub find_good_formatter_class {
+  my $self = $_[0];
+  my @class_list = @{ $self->{'formatter_classes'} || [] };
+  die "WHAT?  Nothing in the formatter class list!?" unless @class_list;
+  
+  my $good_class_found;
+  foreach my $c (@class_list) {
+    DEBUG > 4 and print "Trying to load $c...\n";
+    if($class_loaded{$c}) {
+      DEBUG > 4 and print "OK, the already-loaded $c it is!\n";
+      $good_class_found = $c;
+      last;
+    }
+    
+    if($class_seen{$c}) {
+      DEBUG > 4 and print
+       "I've tried $c before, and it's no good.  Skipping.\n";
+      next;
+    }
+    
+    $class_seen{$c} = 1;
+    
+    if( $c->can('parse_from_file') ) {
+      DEBUG > 4 and print
+       "Interesting, the formatter class $c is already loaded!\n";
+      
+    } elsif(
+      (IS_VMS or IS_MSWin32 or IS_Dos or IS_OS2)
+       # the alway case-insensitive fs's
+      and $class_seen{lc("~$c")}++
+    ) {
+      DEBUG > 4 and print
+       "We already used something quite like \"\L$c\E\", so no point using $c\n";
+      # This avoids redefining the package.
+    } else {
+      DEBUG > 4 and print "Trying to eval 'require $c'...\n";
+
+      local $^W = $^W;
+      if(DEBUG() or $self->opt_v) {
+        # feh, let 'em see it
+      } else {
+        $^W = 0;
+        # The average user just has no reason to be seeing
+        #  $^W-suppressable warnings from the the require!
+      }
+
+      eval "require $c";
+      if($@) {
+        DEBUG > 4 and print "Couldn't load $c: $!\n";
+        next;
+      }
+    }
+    
+    if( $c->can('parse_from_file') ) {
+      DEBUG > 4 and print "Settling on $c\n";
+      my $v = $c->VERSION;
+      $v = ( defined $v and length $v ) ? " version $v" : '';
+      $self->aside("Formatter class $c$v successfully loaded!\n");
+      $good_class_found = $c;
+      last;
+    } else {
+      DEBUG > 4 and print "Class $c isn't a formatter?!  Skipping.\n";
+    }
+  }
+  
+  die "Can't find any loadable formatter class in @class_list?!\nAborting"
+    unless $good_class_found;
+  
+  $self->{'formatter_class'} = $good_class_found;
+  $self->aside("Will format with the class $good_class_found\n");
+  
+  return;
+}
+
+}
+#..........................................................................
+
+sub formatter_sanity_check {
+  my $self = shift;
+  my $formatter_class = $self->{'formatter_class'}
+   || die "NO FORMATTER CLASS YET!?";
+  
+  if(!$self->opt_T # so -T can FORCE sending to STDOUT
+    and $formatter_class->can('is_pageable')
+    and !$formatter_class->is_pageable
+    and !$formatter_class->can('page_for_perldoc')
+  ) {
+    my $ext =
+     ($formatter_class->can('output_extension')
+       && $formatter_class->output_extension
+     ) || '';
+    $ext = ".$ext" if length $ext;
+    
+    die
+       "When using Perldoc to format with $formatter_class, you have to\n"
+     . "specify -T or -dsomefile$ext\n"
+     . "See `perldoc perldoc' for more information on those switches.\n"
+    ;
+  }
+}
+
+#..........................................................................
+
+sub render_and_page {
+    my($self, $found_list) = @_;
+    
+    $self->maybe_generate_dynamic_pod($found_list);
+
+    my($out, $formatter) = $self->render_findings($found_list);
+    
+    if($self->opt_d) {
+      printf "Perldoc (%s) output saved to %s\n",
+        $self->{'formatter_class'} || ref($self),
+        $out;
+      print "But notice that it's 0 bytes long!\n" unless -s $out;
+      
+      
+    } elsif(  # Allow the formatter to "page" itself, if it wants.
+      $formatter->can('page_for_perldoc')
+      and do {
+        $self->aside("Going to call $formatter\->page_for_perldoc(\"$out\")\n");
+        if( $formatter->page_for_perldoc($out, $self) ) {
+          $self->aside("page_for_perldoc returned true, so NOT paging with $self.\n");
+          1;
+        } else {
+          $self->aside("page_for_perldoc returned false, so paging with $self instead.\n");
+          '';
+        }
+      }
+    ) {
+      # Do nothing, since the formatter has "paged" it for itself.
+    
+    } else {
+      # Page it normally (internally)
+      
+      if( -s $out ) {  # Usual case:
+        $self->page($out, $self->{'output_to_stdout'}, $self->pagers);
+        
+      } else {
+        # Odd case:
+        $self->aside("Skipping $out (from $$found_list[0] "
+         . "via $$self{'formatter_class'}) as it is 0-length.\n");
+         
+        push @{ $self->{'temp_file_list'} }, $out;
+        $self->unlink_if_temp_file($out);
+      }
+    }
+    
+    $self->after_rendering();  # any extra cleanup or whatever
+    
+    return;
+}
+
+#..........................................................................
+
+sub options_reading {
+    my $self = shift;
+    
+    if( defined $ENV{"PERLDOC"} and length $ENV{"PERLDOC"} ) {
+      require Text::ParseWords;
+      $self->aside("Noting env PERLDOC setting of $ENV{'PERLDOC'}\n");
+      # Yes, appends to the beginning
+      unshift @{ $self->{'args'} },
+        Text::ParseWords::shellwords( $ENV{"PERLDOC"} )
+      ;
+      DEBUG > 1 and print "  Args now: @{$self->{'args'}}\n\n";
+    } else {
+      DEBUG > 1 and print "  Okay, no PERLDOC setting in ENV.\n";
+    }
+
+    DEBUG > 1
+     and print "  Args right before switch processing: @{$self->{'args'}}\n";
+
+    Pod::Perldoc::GetOptsOO::getopts( $self, $self->{'args'}, 'YES' )
+     or return $self->usage;
+
+    DEBUG > 1
+     and print "  Args after switch processing: @{$self->{'args'}}\n";
+
+    return $self->usage if $self->opt_h;
+  
+    return;
+}
+
+#..........................................................................
+
+sub options_processing {
+    my $self = shift;
+    
+    if ($self->opt_X) {
+        my $podidx = "$Config{'archlib'}/pod.idx";
+        $podidx = "" unless -f $podidx && -r _ && -M _ <= 7;
+        $self->{'podidx'} = $podidx;
+    }
+
+    $self->{'output_to_stdout'} = 1  if  $self->opt_T or ! -t STDOUT;
+
+    $self->options_sanity;
+
+    $self->opt_n("nroff") unless $self->opt_n;
+    $self->add_formatter_option( '__nroffer' => $self->opt_n );
+
+    return;
+}
+
+#..........................................................................
+
+sub options_sanity {
+    my $self = shift;
+
+    # The opts-counting stuff interacts quite badly with
+    # the $ENV{"PERLDOC"} stuff.  I.e., if I have $ENV{"PERLDOC"}
+    # set to -t, and I specify -u on the command line, I don't want
+    # to be hectored at that -u and -t don't make sense together.
+
+    #my $opts = grep $_ && 1, # yes, the count of the set ones
+    #  $self->opt_t, $self->opt_u, $self->opt_m, $self->opt_l
+    #;
+    #
+    #$self->usage("only one of -t, -u, -m or -l") if $opts > 1;
+    
+    
+    # Any sanity-checking need doing here?
+    
+    return;
+}
+
+#..........................................................................
+
+sub grand_search_init {
+    my($self, $pages, @found) = @_;
+
+    foreach (@$pages) {
+        if ($self->{'podidx'} && open(PODIDX, $self->{'podidx'})) {
+            my $searchfor = catfile split '::', $_;
+            $self->aside( "Searching for '$searchfor' in $self->{'podidx'}\n" );
+            local $_;
+            while (<PODIDX>) {
+                chomp;
+                push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?\z,i;
+            }
+            close(PODIDX)            or die "Can't close $$self{'podidx'}: $!";
+            next;
+        }
+
+        $self->aside( "Searching for $_\n" );
+
+        if ($self->opt_F) {
+            next unless -r;
+            push @found, $_ if $self->opt_m or $self->containspod($_);
+            next;
+        }
+
+        # We must look both in @INC for library modules and in $bindir
+        # for executables, like h2xs or perldoc itself.
+
+        my @searchdirs = ($self->{'bindir'}, @INC);
+        unless ($self->opt_m) {
+            if (IS_VMS) {
+                my($i,$trn);
+                for ($i = 0; $trn = $ENV{'DCL$PATH;'.$i}; $i++) {
+                    push(@searchdirs,$trn);
+                }
+                push(@searchdirs,'perl_root:[lib.pod]')  # installed pods
+            }
+            else {
+                push(@searchdirs, grep(-d, split($Config{path_sep},
+                                                 $ENV{'PATH'})));
+            }
+        }
+        my @files = $self->searchfor(0,$_,@searchdirs);
+        if (@files) {
+            $self->aside( "Found as @files\n" );
+        }
+        else {
+            # no match, try recursive search
+            @searchdirs = grep(!/^\.\z/s,@INC);
+            @files= $self->searchfor(1,$_,@searchdirs) if $self->opt_r;
+            if (@files) {
+                $self->aside( "Loosely found as @files\n" );
+            }
+            else {
+                print STDERR "No " .
+                    ($self->opt_m ? "module" : "documentation") . " found for \"$_\".\n";
+                if ( @{ $self->{'found'} } ) {
+                    print STDERR "However, try\n";
+                    for my $dir (@{ $self->{'found'} }) {
+                        opendir(DIR, $dir) or die "opendir $dir: $!";
+                        while (my $file = readdir(DIR)) {
+                            next if ($file =~ /^\./s);
+                            $file =~ s/\.(pm|pod)\z//;  # XXX: badfs
+                            print STDERR "\tperldoc $_\::$file\n";
+                        }
+                        closedir(DIR)    or die "closedir $dir: $!";
+                    }
+                }
+            }
+        }
+        push(@found,@files);
+    }
+    return @found;
+}
+
+#..........................................................................
+
+sub maybe_generate_dynamic_pod {
+    my($self, $found_things) = @_;
+    my @dynamic_pod;
+    
+    $self->search_perlfunc($found_things, \@dynamic_pod)  if  $self->opt_f;
+    
+    $self->search_perlfaqs($found_things, \@dynamic_pod)  if  $self->opt_q;
+
+    if( ! $self->opt_f and ! $self->opt_q ) {
+        DEBUG > 4 and print "That's a non-dynamic pod search.\n";
+    } elsif ( @dynamic_pod ) {
+        $self->aside("Hm, I found some Pod from that search!\n");
+        my ($buffd, $buffer) = $self->new_tempfile('pod', 'dyn');
+        
+        push @{ $self->{'temp_file_list'} }, $buffer;
+         # I.e., it MIGHT be deleted at the end.
+        
+	my $in_list = $self->opt_f;
+
+        print $buffd "=over 8\n\n" if $in_list;
+        print $buffd @dynamic_pod  or die "Can't print $buffer: $!";
+        print $buffd "=back\n"     if $in_list;
+
+        close $buffd        or die "Can't close $buffer: $!";
+        
+        @$found_things = $buffer;
+          # Yes, so found_things never has more than one thing in
+          #  it, by time we leave here
+        
+        $self->add_formatter_option('__filter_nroff' => 1);
+
+    } else {
+        @$found_things = ();
+        $self->aside("I found no Pod from that search!\n");
+    }
+
+    return;
+}
+
+#..........................................................................
+
+sub add_formatter_option { # $self->add_formatter_option('key' => 'value');
+  my $self = shift;
+  push @{ $self->{'formatter_switches'} }, [ @_ ] if @_;
+
+  DEBUG > 3 and printf "Formatter switches now: [%s]\n",
+   join ' ', map "[@$_]", @{ $self->{'formatter_switches'} };
+  
+  return;
+}
+
+#..........................................................................
+
+sub search_perlfunc {
+    my($self, $found_things, $pod) = @_;
+
+    DEBUG > 2 and print "Search: @$found_things\n";
+
+    my $perlfunc = shift @$found_things;
+    open(PFUNC, "<", $perlfunc)               # "Funk is its own reward"
+        or die("Can't open $perlfunc: $!");
+
+    # Functions like -r, -e, etc. are listed under `-X'.
+    my $search_re = ($self->opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/)
+                        ? '(?:I<)?-X' : quotemeta($self->opt_f) ;
+
+    DEBUG > 2 and
+     print "Going to perlfunc-scan for $search_re in $perlfunc\n";
+    
+    # Skip introduction
+    local $_;
+    while (<PFUNC>) {
+        last if /^=head2 Alphabetical Listing of Perl Functions/;
+    }
+
+    # Look for our function
+    my $found = 0;
+    my $inlist = 0;
+    while (<PFUNC>) {  # "The Mothership Connection is here!"
+        if ( m/^=item\s+$search_re\b/ )  {
+            $found = 1;
+        }
+        elsif (/^=item/) {
+            last if $found > 1 and not $inlist;
+        }
+        next unless $found;
+        if (/^=over/) {
+            ++$inlist;
+        }
+        elsif (/^=back/) {
+            --$inlist;
+        }
+        push @$pod, $_;
+        ++$found if /^\w/;        # found descriptive text
+    }
+    if (!@$pod) {
+        die sprintf
+          "No documentation for perl function `%s' found\n",
+          $self->opt_f
+        ;
+    }
+    close PFUNC                or die "Can't open $perlfunc: $!";
+
+    return;
+}
+
+#..........................................................................
+
+sub search_perlfaqs {
+    my( $self, $found_things, $pod) = @_;
+
+    my $found = 0;
+    my %found_in;
+    my $search_key = $self->opt_q;
+    
+    my $rx = eval { qr/$search_key/ }
+     or die <<EOD;
+Invalid regular expression '$search_key' given as -q pattern:
+$@
+Did you mean \\Q$search_key ?
+
+EOD
+
+    local $_;
+    foreach my $file (@$found_things) {
+        die "invalid file spec: $!" if $file =~ /[<>|]/;
+        open(INFAQ, "<", $file)  # XXX 5.6ism
+         or die "Can't read-open $file: $!\nAborting";
+        while (<INFAQ>) {
+            if ( m/^=head2\s+.*(?:$search_key)/i ) {
+                $found = 1;
+                push @$pod, "=head1 Found in $file\n\n" unless $found_in{$file}++;
+            }
+            elsif (/^=head[12]/) {
+                $found = 0;
+            }
+            next unless $found;
+            push @$pod, $_;
+        }
+        close(INFAQ);
+    }
+    die("No documentation for perl FAQ keyword `$search_key' found\n")
+     unless @$pod;
+
+    return;
+}
+
+
+#..........................................................................
+
+sub render_findings {
+  # Return the filename to open
+
+  my($self, $found_things) = @_;
+
+  my $formatter_class = $self->{'formatter_class'}
+   || die "No formatter class set!?";
+  my $formatter = $formatter_class->can('new')
+    ? $formatter_class->new
+    : $formatter_class
+  ;
+
+  if(! @$found_things) {
+    die "Nothing found?!";
+    # should have been caught before here
+  } elsif(@$found_things > 1) {
+    warn join '',
+     "Perldoc is only really meant for reading one document at a time.\n",
+     "So these parameters are being ignored: ",
+     join(' ', @$found_things[1 .. $#$found_things] ),
+     "\n"
+  }
+
+  my $file = $found_things->[0];
+  
+  DEBUG > 3 and printf "Formatter switches now: [%s]\n",
+   join ' ', map "[@$_]", @{ $self->{'formatter_switches'} };
+
+  # Set formatter options:
+  if( ref $formatter ) {
+    foreach my $f (@{ $self->{'formatter_switches'} || [] }) {
+      my($switch, $value, $silent_fail) = @$f;
+      if( $formatter->can($switch) ) {
+        eval { $formatter->$switch( defined($value) ? $value : () ) };
+        warn "Got an error when setting $formatter_class\->$switch:\n$@\n"
+         if $@;
+      } else {
+        if( $silent_fail or $switch =~ m/^__/s ) {
+          DEBUG > 2 and print "Formatter $formatter_class doesn't support $switch\n";
+        } else {
+          warn "$formatter_class doesn't recognize the $switch switch.\n";
+        }
+      }
+    }
+  }
+  
+  $self->{'output_is_binary'} =
+    $formatter->can('write_with_binmode') && $formatter->write_with_binmode;
+
+  my ($out_fh, $out) = $self->new_output_file(
+    ( $formatter->can('output_extension') && $formatter->output_extension )
+     || undef,
+    $self->useful_filename_bit,
+  );
+
+  # Now, finally, do the formatting!
+  {
+    local $^W = $^W;
+    if(DEBUG() or $self->opt_v) {
+      # feh, let 'em see it
+    } else {
+      $^W = 0;
+      # The average user just has no reason to be seeing
+      #  $^W-suppressable warnings from the formatting!
+    }
+          
+    eval {  $formatter->parse_from_file( $file, $out_fh )  };
+  }
+  
+  warn "Error while formatting with $formatter_class:\n $@\n" if $@;
+  DEBUG > 2 and print "Back from formatting with $formatter_class\n";
+
+  close $out_fh 
+   or warn "Can't close $out: $!\n(Did $formatter already close it?)";
+  sleep 0; sleep 0; sleep 0;
+   # Give the system a few timeslices to meditate on the fact
+   # that the output file does in fact exist and is closed.
+  
+  $self->unlink_if_temp_file($file);
+
+  unless( -s $out ) {
+    if( $formatter->can( 'if_zero_length' ) ) {
+      # Basically this is just a hook for Pod::Simple::Checker; since
+      # what other class could /happily/ format an input file with Pod
+      # as a 0-length output file?
+      $formatter->if_zero_length( $file, $out, $out_fh );
+    } else {
+      warn "Got a 0-length file from $$found_things[0] via $formatter_class!?\n"
+    }
+  }
+
+  DEBUG and print "Finished writing to $out.\n";
+  return($out, $formatter) if wantarray;
+  return $out;
+}
+
+#..........................................................................
+
+sub unlink_if_temp_file {
+  # Unlink the specified file IFF it's in the list of temp files.
+  # Really only used in the case of -f / -q things when we can
+  #  throw away the dynamically generated source pod file once
+  #  we've formatted it.
+  #
+  my($self, $file) = @_;
+  return unless defined $file and length $file;
+  
+  my $temp_file_list = $self->{'temp_file_list'} || return;
+  if(grep $_ eq $file, @$temp_file_list) {
+    $self->aside("Unlinking $file\n");
+    unlink($file) or warn "Odd, couldn't unlink $file: $!";
+  } else {
+    DEBUG > 1 and print "$file isn't a temp file, so not unlinking.\n";
+  }
+  return;
+}
+
+#..........................................................................
+
+sub MSWin_temp_cleanup {
+
+  # Nothing particularly MSWin-specific in here, but I don't know if any
+  # other OS needs its temp dir policed like MSWin does!
+ 
+  my $self = shift;
+
+  my $tempdir = $ENV{'TEMP'};
+  return unless defined $tempdir and length $tempdir
+   and -e $tempdir and -d _ and -w _;
+
+  $self->aside(
+   "Considering whether any old files of mine in $tempdir need unlinking.\n"
+  );
+
+  opendir(TMPDIR, $tempdir) || return;
+  my @to_unlink;
+  
+  my $limit = time() - $Temp_File_Lifetime;
+  
+  DEBUG > 5 and printf "Looking for things pre-dating %s (%x)\n",
+   ($limit) x 2;
+  
+  my $filespec;
+  
+  while(defined($filespec = readdir(TMPDIR))) {
+    if(
+     $filespec =~ m{^perldoc_[a-zA-Z0-9]+_T([a-fA-F0-9]{7,})_[a-fA-F0-9]{3,}}s
+    ) {
+      if( hex($1) < $limit ) {
+        push @to_unlink, "$tempdir/$filespec";
+        $self->aside( "Will unlink my old temp file $to_unlink[-1]\n" );
+      } else {
+        DEBUG > 5 and
+         printf "  $tempdir/$filespec is too recent (after %x)\n", $limit;
+      }
+    } else {
+      DEBUG > 5 and
+       print "  $tempdir/$filespec doesn't look like a perldoc temp file.\n";
+    }
+  }
+  closedir(TMPDIR);
+  $self->aside(sprintf "Unlinked %s items of mine in %s\n",
+    scalar(unlink(@to_unlink)),
+    $tempdir
+  );
+  return;
+}
+
+#  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
+
+sub MSWin_perldoc_tempfile {
+  my($self, $suffix, $infix) = @_;
+
+  my $tempdir = $ENV{'TEMP'};
+  return unless defined $tempdir and length $tempdir
+   and -e $tempdir and -d _ and -w _;
+
+  my $spec;
+  
+  do {
+    $spec = sprintf "%s\\perldoc_%s_T%x_%x%02x.%s", # used also in MSWin_temp_cleanup
+      # Yes, we embed the create-time in the filename!
+      $tempdir,
+      $infix || 'x',
+      time(),
+      $$,
+      defined( &Win32::GetTickCount )
+        ? (Win32::GetTickCount() & 0xff)
+        : int(rand 256)
+       # Under MSWin, $$ values get reused quickly!  So if we ran
+       # perldoc foo and then perldoc bar before there was time for
+       # time() to increment time."_$$" would likely be the same
+       # for each process!  So we tack on the tick count's lower
+       # bits (or, in a pinch, rand)
+      ,
+      $suffix || 'txt';
+    ;
+  } while( -e $spec );
+
+  my $counter = 0;
+  
+  while($counter < 50) {
+    my $fh;
+    # If we are running before perl5.6.0, we can't autovivify
+    if ($] < 5.006) {
+      require Symbol;
+      $fh = Symbol::gensym();
+    }
+    DEBUG > 3 and print "About to try making temp file $spec\n";
+    return($fh, $spec) if open($fh, ">", $spec);    # XXX 5.6ism
+    $self->aside("Can't create temp file $spec: $!\n");
+  }
+
+  $self->aside("Giving up on making a temp file!\n");
+  die "Can't make a tempfile!?";
+}
+
+#..........................................................................
+
+
+sub after_rendering {
+  my $self = $_[0];
+  $self->after_rendering_VMS     if IS_VMS;
+  $self->after_rendering_MSWin32 if IS_MSWin32;
+  $self->after_rendering_Dos     if IS_Dos;
+  $self->after_rendering_OS2     if IS_OS2;
+  return;
+}
+
+sub after_rendering_VMS      { return }
+sub after_rendering_Dos      { return }
+sub after_rendering_OS2      { return }
+
+sub after_rendering_MSWin32  {
+  shift->MSWin_temp_cleanup() if $Temp_Files_Created;
+}
+
+#..........................................................................
+#	:	:	:	:	:	:	:	:	:
+#..........................................................................
+
+
+sub minus_f_nocase {   # i.e., do like -f, but without regard to case
+
+     my($self, $dir, $file) = @_;
+     my $path = catfile($dir,$file);
+     return $path if -f $path and -r _;
+
+     if(!$self->opt_i
+        or IS_VMS or IS_MSWin32
+        or IS_Dos or IS_OS2
+     ) {
+        # On a case-forgiving file system, or if case is important,
+	#  that is it, all we can do.
+	warn "Ignored $path: unreadable\n" if -f _;
+	return '';
+     }
+     
+     local *DIR;
+     my @p = ($dir);
+     my($p,$cip);
+     foreach $p (splitdir $file){
+	my $try = catfile @p, $p;
+        $self->aside("Scrutinizing $try...\n");
+	stat $try;
+ 	if (-d _) {
+ 	    push @p, $p;
+	    if ( $p eq $self->{'target'} ) {
+		my $tmp_path = catfile @p;
+		my $path_f = 0;
+		for (@{ $self->{'found'} }) {
+		    $path_f = 1 if $_ eq $tmp_path;
+		}
+		push (@{ $self->{'found'} }, $tmp_path) unless $path_f;
+		$self->aside( "Found as $tmp_path but directory\n" );
+	    }
+ 	}
+	elsif (-f _ && -r _) {
+ 	    return $try;
+ 	}
+	elsif (-f _) {
+	    warn "Ignored $try: unreadable\n";
+ 	}
+	elsif (-d catdir(@p)) {  # at least we see the containing directory!
+ 	    my $found = 0;
+ 	    my $lcp = lc $p;
+ 	    my $p_dirspec = catdir(@p);
+ 	    opendir DIR, $p_dirspec  or die "opendir $p_dirspec: $!";
+ 	    while(defined( $cip = readdir(DIR) )) {
+ 		if (lc $cip eq $lcp){
+ 		    $found++;
+ 		    last; # XXX stop at the first? what if there's others?
+ 		}
+ 	    }
+ 	    closedir DIR  or die "closedir $p_dirspec: $!";
+ 	    return "" unless $found;
+
+ 	    push @p, $cip;
+ 	    my $p_filespec = catfile(@p);
+ 	    return $p_filespec if -f $p_filespec and -r _;
+	    warn "Ignored $p_filespec: unreadable\n" if -f _;
+ 	}
+     }
+     return "";
+}
+
+#..........................................................................
+
+sub pagers_guessing {
+    my $self = shift;
+
+    my @pagers;
+    push @pagers, $self->pagers;
+    $self->{'pagers'} = \@pagers;
+
+    if (IS_MSWin32) {
+        push @pagers, qw( more< less notepad );
+        unshift @pagers, $ENV{PAGER}  if $ENV{PAGER};
+    }
+    elsif (IS_VMS) {
+        push @pagers, qw( most more less type/page );
+    }
+    elsif (IS_Dos) {
+        push @pagers, qw( less.exe more.com< );
+        unshift @pagers, $ENV{PAGER}  if $ENV{PAGER};
+    }
+    else {
+        if (IS_OS2) {
+          unshift @pagers, 'less', 'cmd /c more <';
+        }
+        push @pagers, qw( more less pg view cat );
+        unshift @pagers, $ENV{PAGER}  if $ENV{PAGER};
+    }
+
+    if (IS_Cygwin) {
+        if (($pagers[0] eq 'less') || ($pagers[0] eq '/usr/bin/less')) {
+            unshift @pagers, '/usr/bin/less -isrR';
+        }
+    }
+
+    unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER};
+    
+    return;   
+}
+
+#..........................................................................
+
+sub page_module_file {
+    my($self, @found) = @_;
+
+    # Security note:
+    # Don't ever just pass this off to anything like MSWin's "start.exe",
+    # since we might be calling on a .pl file, and we wouldn't want that
+    # to actually /execute/ the file that we just want to page thru!
+    # Also a consideration if one were to use a web browser as a pager;
+    # doing so could trigger the browser's MIME mapping for whatever
+    # it thinks .pm/.pl/whatever is.  Probably just a (useless and
+    # annoying) "Save as..." dialog, but potentially executing the file
+    # in question -- particularly in the case of MSIE and it's, ahem,
+    # occasionally hazy distinction between OS-local extension
+    # associations, and browser-specific MIME mappings.
+
+    if ($self->{'output_to_stdout'}) {
+        $self->aside("Sending unpaged output to STDOUT.\n");
+	local $_;
+	my $any_error = 0;
+        foreach my $output (@found) {
+	    unless( open(TMP, "<", $output) ) {    # XXX 5.6ism
+	      warn("Can't open $output: $!");
+	      $any_error = 1;
+	      next;
+	    }
+	    while (<TMP>) {
+	        print or die "Can't print to stdout: $!";
+	    } 
+	    close TMP  or die "Can't close while $output: $!";
+	    $self->unlink_if_temp_file($output);
+	}
+	return $any_error; # successful
+    }
+
+    foreach my $pager ( $self->pagers ) {
+        $self->aside("About to try calling $pager @found\n");
+        if (system($pager, @found) == 0) {
+            $self->aside("Yay, it worked.\n");
+            return 0;
+        }
+        $self->aside("That didn't work.\n");
+        
+        # Odd -- when it fails, under Win32, this seems to neither
+        #  return with a fail nor return with a success!!
+        #  That's discouraging!
+    }
+
+    $self->aside(
+      sprintf "Can't manage to find a way to page [%s] via pagers [%s]\n",
+      join(' ', @found),
+      join(' ', $self->pagers),
+    );
+    
+    if (IS_VMS) { 
+        DEBUG > 1 and print "Bailing out in a VMSish way.\n";
+        eval q{
+            use vmsish qw(status exit); 
+            exit $?;
+            1;
+        } or die;
+    }
+    
+    return 1;
+      # i.e., an UNSUCCESSFUL return value!
+}
+
+#..........................................................................
+
+sub check_file {
+    my($self, $dir, $file) = @_;
+    
+    unless( ref $self ) {
+      # Should never get called:
+      $Carp::Verbose = 1;
+      require Carp;
+      Carp::croak( join '',
+        "Crazy ", __PACKAGE__, " error:\n",
+        "check_file must be an object_method!\n",
+        "Aborting"
+      );
+    }
+    
+    if(length $dir and not -d $dir) {
+      DEBUG > 3 and print "  No dir $dir -- skipping.\n";
+      return "";
+    }
+    
+    if ($self->opt_m) {
+	return $self->minus_f_nocase($dir,$file);
+    }
+    
+    else {
+	my $path = $self->minus_f_nocase($dir,$file);
+        if( length $path and $self->containspod($path) ) {
+            DEBUG > 3 and print
+              "  The file $path indeed looks promising!\n";
+            return $path;
+        }
+    }
+    DEBUG > 3 and print "  No good: $file in $dir\n";
+    
+    return "";
+}
+
+#..........................................................................
+
+sub containspod {
+    my($self, $file, $readit) = @_;
+    return 1 if !$readit && $file =~ /\.pod\z/i;
+
+
+    #  Under cygwin the /usr/bin/perl is legal executable, but
+    #  you cannot open a file with that name. It must be spelled
+    #  out as "/usr/bin/perl.exe".
+    #
+    #  The following if-case under cygwin prevents error
+    #
+    #     $ perldoc perl
+    #     Cannot open /usr/bin/perl: no such file or directory
+    #
+    #  This would work though
+    #
+    #     $ perldoc perl.pod
+
+    if ( IS_Cygwin  and  -x $file  and  -f "$file.exe" )
+    {
+        warn "Cygwin $file.exe search skipped\n"  if DEBUG or $self->opt_v;
+        return 0;
+    }
+
+    local($_);
+    open(TEST,"<", $file) 	or die "Can't open $file: $!";   # XXX 5.6ism
+    while (<TEST>) {
+	if (/^=head/) {
+	    close(TEST) 	or die "Can't close $file: $!";
+	    return 1;
+	}
+    }
+    close(TEST) 		or die "Can't close $file: $!";
+    return 0;
+}
+
+#..........................................................................
+
+sub maybe_diddle_INC {
+  my $self = shift;
+  
+  # Does this look like a module or extension directory?
+  
+  if (-f "Makefile.PL") {
+
+    # Add "." and "lib" to @INC (if they exist)
+    eval q{ use lib qw(. lib); 1; } or die;
+
+    # don't add if superuser
+    if ($< && $> && -f "blib") {   # don't be looking too hard now!
+      eval q{ use blib; 1 };
+      warn $@ if $@ && $self->opt_v;
+    }
+  }
+  
+  return;
+}
+
+#..........................................................................
+
+sub new_output_file {
+  my $self = shift;
+  my $outspec = $self->opt_d;  # Yes, -d overrides all else!
+                               # So don't call this twice per format-job!
+  
+  return $self->new_tempfile(@_) unless defined $outspec and length $outspec;
+
+  # Otherwise open a write-handle on opt_d!f
+
+  my $fh;
+  # If we are running before perl5.6.0, we can't autovivify
+  if ($] < 5.006) {
+    require Symbol;
+    $fh = Symbol::gensym();
+  }
+  DEBUG > 3 and print "About to try writing to specified output file $outspec\n";
+  die "Can't write-open $outspec: $!"
+   unless open($fh, ">", $outspec); # XXX 5.6ism
+  
+  DEBUG > 3 and print "Successfully opened $outspec\n";
+  binmode($fh) if $self->{'output_is_binary'};
+  return($fh, $outspec);
+}
+
+#..........................................................................
+
+sub useful_filename_bit {
+  # This tries to provide a meaningful bit of text to do with the query,
+  # such as can be used in naming the file -- since if we're going to be
+  # opening windows on temp files (as a "pager" may well do!) then it's
+  # better if the temp file's name (which may well be used as the window
+  # title) isn't ALL just random garbage!
+  # In other words "perldoc_LWPSimple_2371981429" is a better temp file
+  # name than "perldoc_2371981429".  So this routine is what tries to
+  # provide the "LWPSimple" bit.
+  #
+  my $self = shift;
+  my $pages = $self->{'pages'} || return undef;
+  return undef unless @$pages;
+  
+  my $chunk = $pages->[0];
+  return undef unless defined $chunk;
+  $chunk =~ s/:://g;
+  $chunk =~ s/\.\w+$//g; # strip any extension
+  if( $chunk =~ m/([^\#\\:\/\$]+)$/s ) { # get basename, if it's a file
+    $chunk = $1;
+  } else {
+    return undef;
+  }
+  $chunk =~ s/[^a-zA-Z0-9]+//g; # leave ONLY a-zA-Z0-9 things!
+  $chunk = substr($chunk, -10) if length($chunk) > 10;
+  return $chunk;
+}
+
+#..........................................................................
+
+sub new_tempfile {    # $self->new_tempfile( [$suffix, [$infix] ] )
+  my $self = shift;
+
+  ++$Temp_Files_Created;
+
+  if( IS_MSWin32 ) {
+    my @out = $self->MSWin_perldoc_tempfile(@_);
+    return @out if @out;
+    # otherwise fall thru to the normal stuff below...
+  }
+  
+  require File::Temp;
+  return File::Temp::tempfile(UNLINK => 1);
+}
+
+#..........................................................................
+
+sub page {  # apply a pager to the output file
+    my ($self, $output, $output_to_stdout, @pagers) = @_;
+    if ($output_to_stdout) {
+        $self->aside("Sending unpaged output to STDOUT.\n");
+	open(TMP, "<", $output)  or  die "Can't open $output: $!"; # XXX 5.6ism
+	local $_;
+	while (<TMP>) {
+	    print or die "Can't print to stdout: $!";
+	} 
+	close TMP  or die "Can't close while $output: $!";
+	$self->unlink_if_temp_file($output);
+    } else {
+        # On VMS, quoting prevents logical expansion, and temp files with no
+        # extension get the wrong default extension (such as .LIS for TYPE)
+
+        $output = VMS::Filespec::rmsexpand($output, '.') if IS_VMS;
+
+        $output =~ s{/}{\\}g if IS_MSWin32 || IS_Dos;
+          # Altho "/" under MSWin is in theory good as a pathsep,
+          #  many many corners of the OS don't like it.  So we
+          #  have to force it to be "\" to make everyone happy.
+
+        foreach my $pager (@pagers) {
+            $self->aside("About to try calling $pager $output\n");
+            if (IS_VMS) {
+                last if system("$pager $output") == 0;
+            } else {
+	        last if system("$pager \"$output\"") == 0;
+            }
+	}
+    }
+    return;
+}
+
+#..........................................................................
+
+sub searchfor {
+    my($self, $recurse,$s,@dirs) = @_;
+    $s =~ s!::!/!g;
+    $s = VMS::Filespec::unixify($s) if IS_VMS;
+    return $s if -f $s && $self->containspod($s);
+    $self->aside( "Looking for $s in @dirs\n" );
+    my $ret;
+    my $i;
+    my $dir;
+    $self->{'target'} = (splitdir $s)[-1];  # XXX: why not use File::Basename?
+    for ($i=0; $i<@dirs; $i++) {
+	$dir = $dirs[$i];
+	($dir = VMS::Filespec::unixpath($dir)) =~ s!/\z!! if IS_VMS;
+	if (       (! $self->opt_m && ( $ret = $self->check_file($dir,"$s.pod")))
+		or ( $ret = $self->check_file($dir,"$s.pm"))
+		or ( $ret = $self->check_file($dir,$s))
+		or ( IS_VMS and
+		     $ret = $self->check_file($dir,"$s.com"))
+		or ( IS_OS2 and
+		     $ret = $self->check_file($dir,"$s.cmd"))
+		or ( (IS_MSWin32 or IS_Dos or IS_OS2) and
+		     $ret = $self->check_file($dir,"$s.bat"))
+		or ( $ret = $self->check_file("$dir/pod","$s.pod"))
+		or ( $ret = $self->check_file("$dir/pod",$s))
+		or ( $ret = $self->check_file("$dir/pods","$s.pod"))
+		or ( $ret = $self->check_file("$dir/pods",$s))
+	) {
+	    DEBUG > 1 and print "  Found $ret\n";
+	    return $ret;
+	}
+
+	if ($recurse) {
+	    opendir(D,$dir)	or die "Can't opendir $dir: $!";
+	    my @newdirs = map catfile($dir, $_), grep {
+		not /^\.\.?\z/s and
+		not /^auto\z/s  and   # save time! don't search auto dirs
+		-d  catfile($dir, $_)
+	    } readdir D;
+	    closedir(D)		or die "Can't closedir $dir: $!";
+	    next unless @newdirs;
+	    # what a wicked map!
+	    @newdirs = map((s/\.dir\z//,$_)[1],@newdirs) if IS_VMS;
+	    $self->aside( "Also looking in @newdirs\n" );
+	    push(@dirs,@newdirs);
+	}
+    }
+    return ();
+}
+
+#..........................................................................
+{
+  my $already_asserted;
+  sub assert_closing_stdout {
+    my $self = shift;
+
+    return if $already_asserted;
+
+    eval  q~ END { close(STDOUT) || die "Can't close STDOUT: $!" } ~;
+     # What for? to let the pager know that nothing more will come?
+  
+    die $@ if $@;
+    $already_asserted = 1;
+    return;
+  }
+}
+
+#..........................................................................
+
+sub tweak_found_pathnames {
+  my($self, $found) = @_;
+  if (IS_MSWin32) {
+    foreach (@$found) { s,/,\\,g }
+  }
+  return;
+}
+
+#..........................................................................
+#	:	:	:	:	:	:	:	:	:
+#..........................................................................
+
+sub am_taint_checking {
+    my $self = shift;
+    die "NO ENVIRONMENT?!?!" unless keys %ENV; # reset iterator along the way
+    my($k,$v) = each %ENV;
+    return is_tainted($v);  
+}
+
+#..........................................................................
+
+sub is_tainted { # just a function
+    my $arg  = shift;
+    my $nada = substr($arg, 0, 0);  # zero-length!
+    local $@;  # preserve the caller's version of $@
+    eval { eval "# $nada" };
+    return length($@) != 0;
+}
+
+#..........................................................................
+
+sub drop_privs_maybe {
+    my $self = shift;
+    
+    # Attempt to drop privs if we should be tainting and aren't
+    if (!(IS_VMS || IS_MSWin32 || IS_Dos
+          || IS_OS2
+         )
+        && ($> == 0 || $< == 0)
+        && !$self->am_taint_checking()
+    ) {
+        my $id = eval { getpwnam("nobody") };
+        $id = eval { getpwnam("nouser") } unless defined $id;
+        $id = -2 unless defined $id;
+            #
+            # According to Stevens' APUE and various
+            # (BSD, Solaris, HP-UX) man pages, setting
+            # the real uid first and effective uid second
+            # is the way to go if one wants to drop privileges,
+            # because if one changes into an effective uid of
+            # non-zero, one cannot change the real uid any more.
+            #
+            # Actually, it gets even messier.  There is
+            # a third uid, called the saved uid, and as
+            # long as that is zero, one can get back to
+            # uid of zero.  Setting the real-effective *twice*
+            # helps in *most* systems (FreeBSD and Solaris)
+            # but apparently in HP-UX even this doesn't help:
+            # the saved uid stays zero (apparently the only way
+            # in HP-UX to change saved uid is to call setuid()
+            # when the effective uid is zero).
+            #
+        eval {
+            $< = $id; # real uid
+            $> = $id; # effective uid
+            $< = $id; # real uid
+            $> = $id; # effective uid
+        };
+        if( !$@ && $< && $> ) {
+          DEBUG and print "OK, I dropped privileges.\n";
+        } elsif( $self->opt_U ) {
+          DEBUG and print "Couldn't drop privileges, but in -U mode, so feh."
+        } else {
+          DEBUG and print "Hm, couldn't drop privileges.  Ah well.\n";
+          # We used to die here; but that seemed pointless.
+        }
+    }
+    return;
+}
+
+#..........................................................................
+
+1;
+
+__END__
+
+# See "perldoc perldoc" for basic details.
+#
+# Perldoc -- look up a piece of documentation in .pod format that
+# is embedded in the perl installation tree.
+# 
+#~~~~~~
+#
+# See ChangeLog in CPAN dist for Pod::Perldoc for later notes.
+#
+# Version 3.01: Sun Nov 10 21:38:09 MST 2002
+#       Sean M. Burke <sburke@cpan.org>
+#       Massive refactoring and code-tidying.
+#       Now it's a module(-family)!
+#       Formatter-specific stuff pulled out into Pod::Perldoc::To(Whatever).pm
+#       Added -T, -d, -o, -M, -w.
+#       Added some improved MSWin funk.
+#
+#~~~~~~
+#
+# Version 2.05: Sat Oct 12 16:09:00 CEST 2002
+#	Hugo van der Sanden <hv@crypt.org>
+#	Made -U the default, based on patch from Simon Cozens
+# Version 2.04: Sun Aug 18 13:27:12 BST 2002
+#	Randy W. Sims <RandyS@ThePierianSpring.org>
+#	allow -n to enable nroff under Win32
+# Version 2.03: Sun Apr 23 16:56:34 BST 2000
+#	Hugo van der Sanden <hv@crypt.org>
+#	don't die when 'use blib' fails
+# Version 2.02: Mon Mar 13 18:03:04 MST 2000
+#       Tom Christiansen <tchrist@perl.com>
+#	Added -U insecurity option
+# Version 2.01: Sat Mar 11 15:22:33 MST 2000 
+#       Tom Christiansen <tchrist@perl.com>, querulously.
+#       Security and correctness patches.
+#       What a twisted bit of distasteful spaghetti code.
+# Version 2.0: ????
+#
+#~~~~~~
+#
+# Version 1.15: Tue Aug 24 01:50:20 EST 1999
+#       Charles Wilson <cwilson@ece.gatech.edu>
+#	changed /pod/ directory to /pods/ for cygwin
+#         to support cygwin/win32
+# Version 1.14: Wed Jul 15 01:50:20 EST 1998
+#       Robin Barker <rmb1@cise.npl.co.uk>
+#	-strict, -w cleanups
+# Version 1.13: Fri Feb 27 16:20:50 EST 1997
+#       Gurusamy Sarathy <gsar@activestate.com>
+#	-doc tweaks for -F and -X options
+# Version 1.12: Sat Apr 12 22:41:09 EST 1997
+#       Gurusamy Sarathy <gsar@activestate.com>
+#	-various fixes for win32
+# Version 1.11: Tue Dec 26 09:54:33 EST 1995
+#       Kenneth Albanowski <kjahds@kjahds.com>
+#   -added Charles Bailey's further VMS patches, and -u switch
+#   -added -t switch, with pod2text support
+#
+# Version 1.10: Thu Nov  9 07:23:47 EST 1995
+#		Kenneth Albanowski <kjahds@kjahds.com>
+#	-added VMS support
+#	-added better error recognition (on no found pages, just exit. On
+#	 missing nroff/pod2man, just display raw pod.)
+#	-added recursive/case-insensitive matching (thanks, Andreas). This
+#	 slows things down a bit, unfortunately. Give a precise name, and
+#	 it'll run faster.
+#
+# Version 1.01:	Tue May 30 14:47:34 EDT 1995
+#		Andy Dougherty  <doughera@lafcol.lafayette.edu>
+#   -added pod documentation.
+#   -added PATH searching.
+#   -added searching pod/ subdirectory (mainly to pick up perlfunc.pod
+#    and friends.
+#
+#~~~~~~~
+#
+# TODO:
+#
+#	Cache the directories read during sloppy match
+#       (To disk, or just in-memory?)
+#
+#       Backport this to perl 5.005?
+#
+#       Implement at least part of the "perlman" interface described
+#       in Programming Perl 3e?
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/BaseTo.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/BaseTo.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/BaseTo.pm	(revision 14489)
@@ -0,0 +1,28 @@
+
+require 5;
+package Pod::Perldoc::BaseTo;
+use strict;
+use warnings;
+
+sub is_pageable        { '' }
+sub write_with_binmode {  1 }
+
+sub output_extension   { 'txt' }  # override in subclass!
+
+# sub new { my $self = shift; ...  }
+# sub parse_from_file( my($class, $in, $out) = ...; ... }
+
+#sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub _perldoc_elem {
+  my($self, $name) = splice @_,0,2;
+  if(@_) {
+    $self->{$name} = $_[0];
+  } else {
+    $self->{$name};
+  }
+}
+
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/GetOptsOO.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/GetOptsOO.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/GetOptsOO.pm	(revision 14489)
@@ -0,0 +1,106 @@
+
+require 5;
+package Pod::Perldoc::GetOptsOO;
+use strict;
+
+# Rather like Getopt::Std's getopts
+#  Call Pod::Perldoc::GetOptsOO::getopts($object, \@ARGV, $truth)
+#  Given -n, if there's a opt_n_with, it'll call $object->opt_n_with( ARGUMENT )
+#    (e.g., "-n foo" => $object->opt_n_with('foo').  Ditto "-nfoo")
+#  Otherwise (given -n) if there's an opt_n, we'll call it $object->opt_n($truth)
+#    (Truth defaults to 1)
+#  Otherwise we try calling $object->handle_unknown_option('n')
+#    (and we increment the error count by the return value of it)
+#  If there's no handle_unknown_option, then we just warn, and then increment
+#    the error counter
+# 
+#  The return value of Pod::Perldoc::GetOptsOO::getopts is true if no errors,
+#   otherwise it's false.
+#
+## sburke@cpan.org 2002-10-31
+
+BEGIN { # Make a DEBUG constant ASAP
+  *DEBUG = defined( &Pod::Perldoc::DEBUG )
+   ? \&Pod::Perldoc::DEBUG
+   : sub(){10};
+}
+
+
+sub getopts {
+  my($target, $args, $truth) = @_;
+  
+  $args ||= \@ARGV;
+
+  $target->aside(
+    "Starting switch processing.  Scanning arguments [@$args]\n"
+  ) if $target->can('aside');
+
+  return unless @$args;
+
+  $truth = 1 unless @_ > 2;
+
+  DEBUG > 3 and print "   Truth is $truth\n";
+
+
+  my $error_count = 0;
+
+  while( @$args  and  ($_ = $args->[0]) =~ m/^-(.)(.*)/s ) {
+    my($first,$rest) = ($1,$2);
+    if ($_ eq '--') {	# early exit if "--"
+      shift @$args;
+      last;
+    }
+    my $method = "opt_${first}_with";
+    if( $target->can($method) ) {  # it's argumental
+      if($rest eq '') {   # like -f bar
+        shift @$args;
+        warn "Option $first needs a following argument!\n" unless @$args;
+        $rest = shift @$args;
+      } else {            # like -fbar  (== -f bar)
+        shift @$args;
+      }
+
+      DEBUG > 3 and print " $method => $rest\n";
+      $target->$method( $rest );
+
+    # Otherwise, it's not argumental...
+    } else {
+
+      if( $target->can( $method = "opt_$first" ) ) {
+        DEBUG > 3 and print " $method is true ($truth)\n";
+        $target->$method( $truth );
+
+      # Otherwise it's an unknown option...
+
+      } elsif( $target->can('handle_unknown_option') ) {
+        DEBUG > 3
+         and print " calling handle_unknown_option('$first')\n";
+         
+        $error_count += (
+          $target->handle_unknown_option( $first ) || 0
+        );
+
+      } else {
+        ++$error_count;
+        warn "Unknown option: $first\n";
+      }
+
+      if($rest eq '') {   # like -f
+        shift @$args
+      } else {            # like -fbar  (== -f -bar )
+        DEBUG > 2 and print "   Setting args->[0] to \"-$rest\"\n";
+        $args->[0] = "-$rest";
+      }
+    }
+  }
+  
+
+  $target->aside(
+    "Ending switch processing.  Args are [@$args] with $error_count errors.\n"
+  ) if $target->can('aside');
+
+  $error_count == 0;
+}
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToChecker.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToChecker.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToChecker.pm	(revision 14489)
@@ -0,0 +1,72 @@
+
+require 5;
+package Pod::Perldoc::ToChecker;
+use strict;
+use warnings;
+use vars qw(@ISA);
+
+# Pick our superclass...
+#
+eval 'require Pod::Simple::Checker';
+if($@) {
+  require Pod::Checker;
+  @ISA = ('Pod::Checker');
+} else {
+  @ISA = ('Pod::Simple::Checker');
+}
+
+sub is_pageable        { 1 }
+sub write_with_binmode { 0 }
+sub output_extension   { 'txt' }
+
+sub if_zero_length {
+  my( $self, $file, $tmp, $tmpfd ) = @_;
+  print "No Pod errors in $file\n";
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToChecker - let Perldoc check Pod for errors
+
+=head1 SYNOPSIS
+
+  % perldoc -o checker SomeFile.pod
+  No Pod errors in SomeFile.pod
+  (or an error report)
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Simple::Checker as a "formatter" class (or if that is
+not available, then Pod::Checker), to check for errors in a given
+Pod file.
+
+This is actually a Pod::Simple::Checker (or Pod::Checker) subclass, and
+inherits all its options.
+
+=head1 SEE ALSO
+
+L<Pod::Simple::Checker>, L<Pod::Simple>, L<Pod::Checker>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.  All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+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.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToMan.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToMan.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToMan.pm	(revision 14489)
@@ -0,0 +1,187 @@
+
+require 5;
+package Pod::Perldoc::ToMan;
+use strict;
+use warnings;
+
+# This class is unlike ToText.pm et al, because we're NOT paging thru
+# the output in our particular format -- we make the output and
+# then we run nroff (or whatever) on it, and then page thru the
+# (plaintext) output of THAT!
+
+use base qw(Pod::Perldoc::BaseTo);
+sub is_pageable        { 1 }
+sub write_with_binmode { 0 }
+sub output_extension   { 'txt' }
+
+sub __filter_nroff  { shift->_perldoc_elem('__filter_nroff'  , @_) }
+sub __nroffer       { shift->_perldoc_elem('__nroffer'       , @_) }
+sub __bindir        { shift->_perldoc_elem('__bindir'        , @_) }
+sub __pod2man       { shift->_perldoc_elem('__pod2man'       , @_) }
+sub __output_file   { shift->_perldoc_elem('__output_file'   , @_) }
+
+sub center          { shift->_perldoc_elem('center'         , @_) }
+sub date            { shift->_perldoc_elem('date'           , @_) }
+sub fixed           { shift->_perldoc_elem('fixed'          , @_) }
+sub fixedbold       { shift->_perldoc_elem('fixedbold'      , @_) }
+sub fixeditalic     { shift->_perldoc_elem('fixeditalic'    , @_) }
+sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) }
+sub quotes          { shift->_perldoc_elem('quotes'         , @_) }
+sub release         { shift->_perldoc_elem('release'        , @_) }
+sub section         { shift->_perldoc_elem('section'        , @_) }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+use File::Spec::Functions qw(catfile);
+
+sub parse_from_file {
+  my $self = shift;
+  my($file, $outfh) = @_;
+
+  my $render = $self->{'__nroffer'} || die "no nroffer set!?";
+  
+  # turn the switches into CLIs
+  my $switches = join ' ',
+    map qq{"--$_=$self->{$_}"},
+      grep !m/^_/s,
+        keys %$self
+  ;
+
+  my $pod2man =
+    catfile(
+      ($self->{'__bindir'}  || die "no bindir set?!"  ),
+      ($self->{'__pod2man'} || die "no pod2man set?!" ),
+    )
+  ;
+  unless(-e $pod2man) {
+    # This is rarely needed, I think.
+    $pod2man = $self->{'__pod2man'} || die "no pod2man set?!";
+    die "Can't find a pod2man?! (". $self->{'__pod2man'} .")\nAborting"
+      unless -e $pod2man;
+  }
+
+  my $command = "$pod2man $switches --lax $file | $render -man";
+         # no temp file, just a pipe!
+
+  # Thanks to Brendan O'Dea for contributing the following block
+  if(Pod::Perldoc::IS_Linux and -t STDOUT
+    and my ($cols) = `stty -a` =~ m/\bcolumns\s+(\d+)/
+  ) {
+    my $c = $cols * 39 / 40;
+    $cols = $c > $cols - 2 ? $c : $cols -2;
+    $command .= ' -rLL=' . (int $c) . 'n' if $cols > 80;
+  }
+
+  if(Pod::Perldoc::IS_Cygwin) {
+    $command .= ' -c';
+  }
+
+  # I hear persistent reports that adding a -c switch to $render
+  # solves many people's problems.  But I also hear that some mans
+  # don't have a -c switch, so that unconditionally adding it here
+  # would presumably be a Bad Thing   -- sburke@cpan.org
+
+  $command .= " | col -x" if Pod::Perldoc::IS_HPUX;
+  
+  defined(&Pod::Perldoc::DEBUG)
+   and Pod::Perldoc::DEBUG()
+   and print "About to run $command\n";
+  ;
+  
+  my $rslt = `$command`;
+
+  my $err;
+
+  if( $self->{'__filter_nroff'} ) {
+    defined(&Pod::Perldoc::DEBUG)
+     and &Pod::Perldoc::DEBUG()
+     and print "filter_nroff is set, so filtering...\n";
+    $rslt = $self->___Do_filter_nroff($rslt);
+  } else {
+    defined(&Pod::Perldoc::DEBUG)
+     and Pod::Perldoc::DEBUG()
+     and print "filter_nroff isn't set, so not filtering.\n";
+  }
+
+  if (($err = $?)) {
+    defined(&Pod::Perldoc::DEBUG)
+     and Pod::Perldoc::DEBUG()
+     and print "Nonzero exit ($?) while running $command.\n",
+               "Falling back to Pod::Perldoc::ToPod\n ",
+    ;
+    # A desperate fallthru:
+    require Pod::Perldoc::ToPod;
+    return  Pod::Perldoc::ToPod->new->parse_from_file(@_);
+    
+  } else {
+    print $outfh $rslt
+     or die "Can't print to $$self{__output_file}: $!";
+  }
+  
+  return;
+}
+
+
+sub ___Do_filter_nroff {
+  my $self = shift;
+  my @data = split /\n{2,}/, shift;
+  
+  shift @data while @data and $data[0] !~ /\S/; # Go to header
+  shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header
+  pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like
+				# 28/Jan/99 perl 5.005, patch 53 1
+  join "\n\n", @data;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToMan - let Perldoc render Pod as man pages
+
+=head1 SYNOPSIS
+
+  perldoc -o man Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Man and C<nroff> for reading Pod pages.
+
+The following options are supported:  center, date, fixed, fixedbold,
+fixeditalic, fixedbolditalic, quotes, release, section
+
+(Those options are explained in L<Pod::Man>.)
+
+For example:
+
+  perldoc -o man -w center:Pod Some::Modulename
+
+=head1 CAVEAT
+
+This module may change to use a different pod-to-nroff formatter class
+in the future, and this may change what options are supported.
+
+=head1 SEE ALSO
+
+L<Pod::Man>, L<Pod::Perldoc>, L<Pod::Perldoc::ToNroff>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002,3,4 Sean M. Burke.  All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+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.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToNroff.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToNroff.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToNroff.pm	(revision 14489)
@@ -0,0 +1,100 @@
+
+require 5;
+package Pod::Perldoc::ToNroff;
+use strict;
+use warnings;
+
+# This is unlike ToMan.pm in that it emits the raw nroff source!
+
+use base qw(Pod::Perldoc::BaseTo);
+
+sub is_pageable        { 1 }  # well, if you ask for it...
+sub write_with_binmode { 0 }
+sub output_extension   { 'man' }
+
+use Pod::Man ();
+
+sub center          { shift->_perldoc_elem('center'         , @_) }
+sub date            { shift->_perldoc_elem('date'           , @_) }
+sub fixed           { shift->_perldoc_elem('fixed'          , @_) }
+sub fixedbold       { shift->_perldoc_elem('fixedbold'      , @_) }
+sub fixeditalic     { shift->_perldoc_elem('fixeditalic'    , @_) }
+sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) }
+sub quotes          { shift->_perldoc_elem('quotes'         , @_) }
+sub release         { shift->_perldoc_elem('release'        , @_) }
+sub section         { shift->_perldoc_elem('section'        , @_) }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub parse_from_file {
+  my $self = shift;
+  my $file = $_[0];
+  
+  my @options =
+    map {; $_, $self->{$_} }
+      grep !m/^_/s,
+        keys %$self
+  ;
+  
+  defined(&Pod::Perldoc::DEBUG)
+   and Pod::Perldoc::DEBUG()
+   and print "About to call new Pod::Man ",
+    $Pod::Man::VERSION ? "(v$Pod::Man::VERSION) " : '',
+    "with options: ",
+    @options ? "[@options]" : "(nil)", "\n";
+  ;
+
+  Pod::Man->new(@options)->parse_from_file(@_);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToNroff - let Perldoc convert Pod to nroff
+
+=head1 SYNOPSIS
+
+  perldoc -o nroff -d something.3 Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Man as a formatter class.
+
+The following options are supported:  center, date, fixed, fixedbold,
+fixeditalic, fixedbolditalic, quotes, release, section
+
+Those options are explained in L<Pod::Man>.
+
+For example:
+
+  perldoc -o nroff -w center:Pod -d something.3 Some::Modulename
+
+=head1 CAVEAT
+
+This module may change to use a different pod-to-nroff formatter class
+in the future, and this may change what options are supported.
+
+=head1 SEE ALSO
+
+L<Pod::Man>, L<Pod::Perldoc>, L<Pod::Perldoc::ToMan>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.  All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+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.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToPod.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToPod.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToPod.pm	(revision 14489)
@@ -0,0 +1,90 @@
+
+# This class is just a hack to act as a "formatter" for
+# actually unformatted Pod.
+# 
+# Note that this isn't the same as just passing thru whatever
+# we're given -- we pass thru only the pod source, and suppress
+# the Perl code (or whatever non-pod stuff is in the source file).
+
+
+require 5;
+package Pod::Perldoc::ToPod;
+use strict;
+use warnings;
+
+use base qw(Pod::Perldoc::BaseTo);
+sub is_pageable        { 1 }
+sub write_with_binmode { 0 }
+sub output_extension   { 'pod' }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub parse_from_file {
+  my( $self, $in, $outfh ) = @_;
+
+  open(IN, "<", $in) or die "Can't read-open $in: $!\nAborting";
+
+  my $cut_mode = 1;
+  
+  # A hack for finding things between =foo and =cut, inclusive
+  local $_;
+  while (<IN>) {
+    if(  m/^=(\w+)/s ) {
+      if($cut_mode = ($1 eq 'cut')) {
+        print $outfh "\n=cut\n\n";
+         # Pass thru the =cut line with some harmless
+         #  (and occasionally helpful) padding
+      }
+    }
+    next if $cut_mode;
+    print $outfh $_ or die "Can't print to $outfh: $!";
+  }
+  
+  close IN or die "Can't close $in: $!";
+  return;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToPod - let Perldoc render Pod as ... Pod!
+
+=head1 SYNOPSIS
+
+  perldoc -opod Some::Modulename
+
+(That's currently the same as the following:)
+
+  perldoc -u Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to display Pod source as
+itself!  Pretty Zen, huh?
+
+Currently this class works by just filtering out the non-Pod stuff from
+a given input file.
+
+=head1 SEE ALSO
+
+L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.  All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+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.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToRtf.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToRtf.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToRtf.pm	(revision 14489)
@@ -0,0 +1,85 @@
+
+require 5;
+package Pod::Perldoc::ToRtf;
+use strict;
+use warnings;
+use vars qw($VERSION);
+
+use base qw( Pod::Simple::RTF );
+
+$VERSION   # so that ->VERSION is happy
+# stop CPAN from seeing this
+ =
+$Pod::Simple::RTF::VERSION;
+
+
+sub is_pageable        { 0 }
+sub write_with_binmode { 0 }
+sub output_extension   { 'rtf' }
+
+sub page_for_perldoc {
+  my($self, $tempfile, $perldoc) = @_;
+  return unless $perldoc->IS_MSWin32;
+  
+  my $rtf_pager = $ENV{'RTFREADER'} || 'write.exe';
+  
+  $perldoc->aside( "About to launch <\"$rtf_pager\" \"$tempfile\">\n" );
+  
+  return 1 if system( qq{"$rtf_pager"}, qq{"$tempfile"} ) == 0;
+  return 0;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToRtf - let Perldoc render Pod as RTF
+
+=head1 SYNOPSIS
+
+  perldoc -o rtf Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Simple::RTF as a formatter class.
+
+This is actually a Pod::Simple::RTF subclass, and inherits
+all its options.
+
+You have to have Pod::Simple::RTF installed (from the Pod::Simple dist),
+or this module won't work.
+
+If Perldoc is running under MSWin and uses this class as a formatter,
+the output will be opened with F<write.exe> or whatever program is
+specified in the environment variable C<RTFREADER>. For example, to
+specify that RTF files should be opened the same as they are when you
+double-click them, you would do C<set RTFREADER=start.exe> in your
+F<autoexec.bat>.
+
+Handy tip: put C<set PERLDOC=-ortf> in your F<autoexec.bat>
+and that will set this class as the default formatter to run when
+you do C<perldoc whatever>.
+
+=head1 SEE ALSO
+
+L<Pod::Simple::RTF>, L<Pod::Simple>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.  All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+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.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToText.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToText.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToText.pm	(revision 14489)
@@ -0,0 +1,91 @@
+
+require 5;
+package Pod::Perldoc::ToText;
+use strict;
+use warnings;
+
+use base qw(Pod::Perldoc::BaseTo);
+
+sub is_pageable        { 1 }
+sub write_with_binmode { 0 }
+sub output_extension   { 'txt' }
+
+use Pod::Text ();
+
+sub alt       { shift->_perldoc_elem('alt'     , @_) }
+sub indent    { shift->_perldoc_elem('indent'  , @_) }
+sub loose     { shift->_perldoc_elem('loose'   , @_) }
+sub quotes    { shift->_perldoc_elem('quotes'  , @_) }
+sub sentence  { shift->_perldoc_elem('sentence', @_) }
+sub width     { shift->_perldoc_elem('width'   , @_) }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub parse_from_file {
+  my $self = shift;
+  
+  my @options =
+    map {; $_, $self->{$_} }
+      grep !m/^_/s,
+        keys %$self
+  ;
+  
+  defined(&Pod::Perldoc::DEBUG)
+   and Pod::Perldoc::DEBUG()
+   and print "About to call new Pod::Text ",
+    $Pod::Text::VERSION ? "(v$Pod::Text::VERSION) " : '',
+    "with options: ",
+    @options ? "[@options]" : "(nil)", "\n";
+  ;
+
+  Pod::Text->new(@options)->parse_from_file(@_);
+}
+
+1;
+
+=head1 NAME
+
+Pod::Perldoc::ToText - let Perldoc render Pod as plaintext
+
+=head1 SYNOPSIS
+
+  perldoc -o text Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Text as a formatter class.
+
+It supports the following options, which are explained in
+L<Pod::Text>: alt, indent, loose, quotes, sentence, width
+
+For example:
+
+  perldoc -o text -w indent:5 Some::Modulename
+
+=head1 CAVEAT
+
+This module may change to use a different text formatter class in the
+future, and this may change what options are supported.
+
+=head1 SEE ALSO
+
+L<Pod::Text>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.  All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+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.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToTk.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToTk.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToTk.pm	(revision 14489)
@@ -0,0 +1,129 @@
+
+require 5;
+package Pod::Perldoc::ToTk;
+use strict;
+use warnings;
+
+use base qw(Pod::Perldoc::BaseTo);
+
+sub is_pageable        { 1 }
+sub write_with_binmode { 0 }
+sub output_extension   { 'txt' } # doesn't matter
+sub if_zero_length { }  # because it will be 0-length!
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+# TODO: document these and their meanings...
+sub tree      { shift->_perldoc_elem('tree'    , @_) }
+sub tk_opt    { shift->_perldoc_elem('tk_opt'  , @_) }
+sub forky     { shift->_perldoc_elem('forky'   , @_) }
+
+use Pod::Perldoc ();
+use File::Spec::Functions qw(catfile);
+
+use Tk;
+die join '', __PACKAGE__, " doesn't work nice with Tk.pm verison $Tk::VERSION"
+ if $Tk::VERSION eq '800.003';
+
+BEGIN { eval { require Tk::FcyEntry; }; };
+use Tk::Pod;
+
+# The following was adapted from "tkpod" in the Tk-Pod dist.
+
+sub parse_from_file {
+
+    my($self, $Input_File) = @_;
+    if($self->{'forky'}) {
+      return if fork;  # i.e., parent process returns
+    }
+    
+    $Input_File =~ s{\\}{/}g
+     if Pod::Perldoc::IS_MSWin32 or Pod::Perldoc::IS_Dos
+     # and maybe OS/2
+    ;
+    
+    my($tk_opt, $tree);
+    $tree   = $self->{'tree'  };
+    $tk_opt = $self->{'tk_opt'};
+    
+    #require Tk::ErrorDialog;
+    
+    # Add 'Tk' subdirectories to search path so, e.g.,
+    # 'Scrolled' will find doc in 'Tk/Scrolled'
+    
+    if( $tk_opt ) {
+      push @INC, grep -d $_, map catfile($_,'Tk'), @INC;
+    }
+    
+    my $mw = MainWindow->new();
+    #eval 'use blib "/home/e/eserte/src/perl/Tk-App";require Tk::App::Debug';
+    $mw->withdraw;
+    
+    # CDE use Font Settings if available
+    my $ufont = $mw->optionGet('userFont','UserFont');     # fixed width
+    my $sfont = $mw->optionGet('systemFont','SystemFont'); # proportional
+    if (defined($ufont) and defined($sfont)) {
+        foreach ($ufont, $sfont) { s/:$//; };
+        $mw->optionAdd('*Font',       $sfont);
+        $mw->optionAdd('*Entry.Font', $ufont);
+        $mw->optionAdd('*Text.Font',  $ufont);
+    }
+    
+    $mw->optionAdd('*Menu.tearOff', $Tk::platform ne 'MSWin32' ? 1 : 0);
+    
+    $mw->Pod(
+      '-file' => $Input_File,
+      (($Tk::Pod::VERSION >= 4) ? ('-tree' => $tree) : ())
+    )->focusNext;
+    
+    # xxx dirty but it works. A simple $mw->destroy if $mw->children
+    # does not work because Tk::ErrorDialogs could be created.
+    # (they are withdrawn after Ok instead of destory'ed I guess)
+    
+    if ($mw->children) {
+        $mw->repeat(1000, sub {
+                    # ErrorDialog is withdrawn not deleted :-(
+                    foreach ($mw->children) {
+                            return if "$_" =~ /^Tk::Pod/  # ->isa('Tk::Pod')
+                    }
+                    $mw->destroy;
+                });
+    } else {
+        $mw->destroy;
+    }
+    #$mw->WidgetDump;
+    MainLoop();
+
+    exit if $self->{'forky'}; # we were the child!  so exit now!
+    return;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Pod::Perldoc::ToTk - let Perldoc use Tk::Pod to render Pod
+
+=head1 SYNOPSIS
+
+  perldoc -o tk Some::Modulename &
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Tk::Pod as a formatter class.
+
+You have to have installed Tk::Pod first, or this class won't load.
+
+=head1 SEE ALSO
+
+L<Tk::Pod>, L<Pod::Perldoc>
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>, with significant portions copied from
+F<tkpod> in the Tk::Pod dist, by Nick Ing-Simmons, Slaven Rezic, et al.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToXml.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToXml.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Perldoc/ToXml.pm	(revision 14489)
@@ -0,0 +1,63 @@
+
+require 5;
+package Pod::Perldoc::ToXml;
+use strict;
+use warnings;
+use vars qw($VERSION);
+
+use base qw( Pod::Simple::XMLOutStream );
+
+$VERSION   # so that ->VERSION is happy
+# stop CPAN from seeing this
+ =
+$Pod::Simple::XMLOutStream::VERSION;
+
+
+sub is_pageable        { 0 }
+sub write_with_binmode { 0 }
+sub output_extension   { 'xml' }
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToXml - let Perldoc render Pod as XML
+
+=head1 SYNOPSIS
+
+  perldoc -o xml -d out.xml Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Simple::XMLOutStream as a formatter class.
+
+This is actually a Pod::Simple::XMLOutStream subclass, and inherits
+all its options.
+
+You have to have installed Pod::Simple::XMLOutStream (from the Pod::Simple
+dist), or this class won't work.
+
+
+=head1 SEE ALSO
+
+L<Pod::Simple::XMLOutStream>, L<Pod::Simple>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.  All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+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.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/PlainText.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/PlainText.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/PlainText.pm	(revision 14489)
@@ -0,0 +1,705 @@
+# Pod::PlainText -- Convert POD data to formatted ASCII text.
+# $Id: Text.pm,v 2.1 1999/09/20 11:53:33 eagle Exp $
+#
+# Copyright 1999-2000 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module is intended to be a replacement for Pod::Text, and attempts to
+# match its output except for some specific circumstances where other
+# decisions seemed to produce better output.  It uses Pod::Parser and is
+# designed to be very easy to subclass.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+package Pod::PlainText;
+
+require 5.005;
+
+use Carp qw(carp croak);
+use Pod::Select ();
+
+use strict;
+use vars qw(@ISA %ESCAPES $VERSION);
+
+# We inherit from Pod::Select instead of Pod::Parser so that we can be used
+# by Pod::Usage.
+@ISA = qw(Pod::Select);
+
+$VERSION = '2.02';
+
+
+############################################################################
+# Table of supported E<> escapes
+############################################################################
+
+# This table is taken near verbatim from Pod::PlainText in Pod::Parser,
+# which got it near verbatim from the original Pod::Text.  It is therefore
+# credited to Tom Christiansen, and I'm glad I didn't have to write it.  :)
+%ESCAPES = (
+    'amp'       =>    '&',      # ampersand
+    'lt'        =>    '<',      # left chevron, less-than
+    'gt'        =>    '>',      # right chevron, greater-than
+    'quot'      =>    '"',      # double quote
+
+    "Aacute"    =>    "\xC1",   # capital A, acute accent
+    "aacute"    =>    "\xE1",   # small a, acute accent
+    "Acirc"     =>    "\xC2",   # capital A, circumflex accent
+    "acirc"     =>    "\xE2",   # small a, circumflex accent
+    "AElig"     =>    "\xC6",   # capital AE diphthong (ligature)
+    "aelig"     =>    "\xE6",   # small ae diphthong (ligature)
+    "Agrave"    =>    "\xC0",   # capital A, grave accent
+    "agrave"    =>    "\xE0",   # small a, grave accent
+    "Aring"     =>    "\xC5",   # capital A, ring
+    "aring"     =>    "\xE5",   # small a, ring
+    "Atilde"    =>    "\xC3",   # capital A, tilde
+    "atilde"    =>    "\xE3",   # small a, tilde
+    "Auml"      =>    "\xC4",   # capital A, dieresis or umlaut mark
+    "auml"      =>    "\xE4",   # small a, dieresis or umlaut mark
+    "Ccedil"    =>    "\xC7",   # capital C, cedilla
+    "ccedil"    =>    "\xE7",   # small c, cedilla
+    "Eacute"    =>    "\xC9",   # capital E, acute accent
+    "eacute"    =>    "\xE9",   # small e, acute accent
+    "Ecirc"     =>    "\xCA",   # capital E, circumflex accent
+    "ecirc"     =>    "\xEA",   # small e, circumflex accent
+    "Egrave"    =>    "\xC8",   # capital E, grave accent
+    "egrave"    =>    "\xE8",   # small e, grave accent
+    "ETH"       =>    "\xD0",   # capital Eth, Icelandic
+    "eth"       =>    "\xF0",   # small eth, Icelandic
+    "Euml"      =>    "\xCB",   # capital E, dieresis or umlaut mark
+    "euml"      =>    "\xEB",   # small e, dieresis or umlaut mark
+    "Iacute"    =>    "\xCD",   # capital I, acute accent
+    "iacute"    =>    "\xED",   # small i, acute accent
+    "Icirc"     =>    "\xCE",   # capital I, circumflex accent
+    "icirc"     =>    "\xEE",   # small i, circumflex accent
+    "Igrave"    =>    "\xCD",   # capital I, grave accent
+    "igrave"    =>    "\xED",   # small i, grave accent
+    "Iuml"      =>    "\xCF",   # capital I, dieresis or umlaut mark
+    "iuml"      =>    "\xEF",   # small i, dieresis or umlaut mark
+    "Ntilde"    =>    "\xD1",   # capital N, tilde
+    "ntilde"    =>    "\xF1",   # small n, tilde
+    "Oacute"    =>    "\xD3",   # capital O, acute accent
+    "oacute"    =>    "\xF3",   # small o, acute accent
+    "Ocirc"     =>    "\xD4",   # capital O, circumflex accent
+    "ocirc"     =>    "\xF4",   # small o, circumflex accent
+    "Ograve"    =>    "\xD2",   # capital O, grave accent
+    "ograve"    =>    "\xF2",   # small o, grave accent
+    "Oslash"    =>    "\xD8",   # capital O, slash
+    "oslash"    =>    "\xF8",   # small o, slash
+    "Otilde"    =>    "\xD5",   # capital O, tilde
+    "otilde"    =>    "\xF5",   # small o, tilde
+    "Ouml"      =>    "\xD6",   # capital O, dieresis or umlaut mark
+    "ouml"      =>    "\xF6",   # small o, dieresis or umlaut mark
+    "szlig"     =>    "\xDF",   # small sharp s, German (sz ligature)
+    "THORN"     =>    "\xDE",   # capital THORN, Icelandic
+    "thorn"     =>    "\xFE",   # small thorn, Icelandic
+    "Uacute"    =>    "\xDA",   # capital U, acute accent
+    "uacute"    =>    "\xFA",   # small u, acute accent
+    "Ucirc"     =>    "\xDB",   # capital U, circumflex accent
+    "ucirc"     =>    "\xFB",   # small u, circumflex accent
+    "Ugrave"    =>    "\xD9",   # capital U, grave accent
+    "ugrave"    =>    "\xF9",   # small u, grave accent
+    "Uuml"      =>    "\xDC",   # capital U, dieresis or umlaut mark
+    "uuml"      =>    "\xFC",   # small u, dieresis or umlaut mark
+    "Yacute"    =>    "\xDD",   # capital Y, acute accent
+    "yacute"    =>    "\xFD",   # small y, acute accent
+    "yuml"      =>    "\xFF",   # small y, dieresis or umlaut mark
+
+    "lchevron"  =>    "\xAB",   # left chevron (double less than)
+    "rchevron"  =>    "\xBB",   # right chevron (double greater than)
+);
+
+
+############################################################################
+# Initialization
+############################################################################
+
+# Initialize the object.  Must be sure to call our parent initializer.
+sub initialize {
+    my $self = shift;
+
+    $$self{alt}      = 0  unless defined $$self{alt};
+    $$self{indent}   = 4  unless defined $$self{indent};
+    $$self{loose}    = 0  unless defined $$self{loose};
+    $$self{sentence} = 0  unless defined $$self{sentence};
+    $$self{width}    = 76 unless defined $$self{width};
+
+    $$self{INDENTS}  = [];              # Stack of indentations.
+    $$self{MARGIN}   = $$self{indent};  # Current left margin in spaces.
+
+    $self->SUPER::initialize;
+}
+
+
+############################################################################
+# Core overrides
+############################################################################
+
+# Called for each command paragraph.  Gets the command, the associated
+# paragraph, the line number, and a Pod::Paragraph object.  Just dispatches
+# the command to a method named the same as the command.  =cut is handled
+# internally by Pod::Parser.
+sub command {
+    my $self = shift;
+    my $command = shift;
+    return if $command eq 'pod';
+    return if ($$self{EXCLUDE} && $command ne 'end');
+    $self->item ("\n") if defined $$self{ITEM};
+    $command = 'cmd_' . $command;
+    $self->$command (@_);
+}
+
+# Called for a verbatim paragraph.  Gets the paragraph, the line number, and
+# a Pod::Paragraph object.  Just output it verbatim, but with tabs converted
+# to spaces.
+sub verbatim {
+    my $self = shift;
+    return if $$self{EXCLUDE};
+    $self->item if defined $$self{ITEM};
+    local $_ = shift;
+    return if /^\s*$/;
+    s/^(\s*\S+)/(' ' x $$self{MARGIN}) . $1/gme;
+    $self->output ($_);
+}
+
+# Called for a regular text block.  Gets the paragraph, the line number, and
+# a Pod::Paragraph object.  Perform interpolation and output the results.
+sub textblock {
+    my $self = shift;
+    return if $$self{EXCLUDE};
+    $self->output ($_[0]), return if $$self{VERBATIM};
+    local $_ = shift;
+    my $line = shift;
+
+    # Perform a little magic to collapse multiple L<> references.  This is
+    # here mostly for backwards-compatibility.  We'll just rewrite the whole
+    # thing into actual text at this part, bypassing the whole internal
+    # sequence parsing thing.
+    s{
+        (
+          L<                    # A link of the form L</something>.
+              /
+              (
+                  [:\w]+        # The item has to be a simple word...
+                  (\(\))?       # ...or simple function.
+              )
+          >
+          (
+              ,?\s+(and\s+)?    # Allow lots of them, conjuncted.
+              L<  
+                  /
+                  (
+                      [:\w]+
+                      (\(\))?
+                  )
+              >
+          )+
+        )
+    } {
+        local $_ = $1;
+        s%L</([^>]+)>%$1%g;
+        my @items = split /(?:,?\s+(?:and\s+)?)/;
+        my $string = "the ";
+        my $i;
+        for ($i = 0; $i < @items; $i++) {
+            $string .= $items[$i];
+            $string .= ", " if @items > 2 && $i != $#items;
+            $string .= " and " if ($i == $#items - 1);
+        }
+        $string .= " entries elsewhere in this document";
+        $string;
+    }gex;
+
+    # Now actually interpolate and output the paragraph.
+    $_ = $self->interpolate ($_, $line);
+    s/\s+$/\n/;
+    if (defined $$self{ITEM}) {
+        $self->item ($_ . "\n");
+    } else {
+        $self->output ($self->reformat ($_ . "\n"));
+    }
+}
+
+# Called for an interior sequence.  Gets the command, argument, and a
+# Pod::InteriorSequence object and is expected to return the resulting text.
+# Calls code, bold, italic, file, and link to handle those types of
+# sequences, and handles S<>, E<>, X<>, and Z<> directly.
+sub interior_sequence {
+    my $self = shift;
+    my $command = shift;
+    local $_ = shift;
+    return '' if ($command eq 'X' || $command eq 'Z');
+
+    # Expand escapes into the actual character now, carping if invalid.
+    if ($command eq 'E') {
+        return $ESCAPES{$_} if defined $ESCAPES{$_};
+        carp "Unknown escape: E<$_>";
+        return "E<$_>";
+    }
+
+    # For all the other sequences, empty content produces no output.
+    return if $_ eq '';
+
+    # For S<>, compress all internal whitespace and then map spaces to \01.
+    # When we output the text, we'll map this back.
+    if ($command eq 'S') {
+        s/\s{2,}/ /g;
+        tr/ /\01/;
+        return $_;
+    }
+
+    # Anything else needs to get dispatched to another method.
+    if    ($command eq 'B') { return $self->seq_b ($_) }
+    elsif ($command eq 'C') { return $self->seq_c ($_) }
+    elsif ($command eq 'F') { return $self->seq_f ($_) }
+    elsif ($command eq 'I') { return $self->seq_i ($_) }
+    elsif ($command eq 'L') { return $self->seq_l ($_) }
+    else { carp "Unknown sequence $command<$_>" }
+}
+
+# Called for each paragraph that's actually part of the POD.  We take
+# advantage of this opportunity to untabify the input.
+sub preprocess_paragraph {
+    my $self = shift;
+    local $_ = shift;
+    1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me;
+    $_;
+}
+
+
+############################################################################
+# Command paragraphs
+############################################################################
+
+# All command paragraphs take the paragraph and the line number.
+
+# First level heading.
+sub cmd_head1 {
+    my $self = shift;
+    local $_ = shift;
+    s/\s+$//;
+    $_ = $self->interpolate ($_, shift);
+    if ($$self{alt}) {
+        $self->output ("\n==== $_ ====\n\n");
+    } else {
+        $_ .= "\n" if $$self{loose};
+        $self->output ($_ . "\n");
+    }
+}
+
+# Second level heading.
+sub cmd_head2 {
+    my $self = shift;
+    local $_ = shift;
+    s/\s+$//;
+    $_ = $self->interpolate ($_, shift);
+    if ($$self{alt}) {
+        $self->output ("\n==   $_   ==\n\n");
+    } else {
+        $self->output (' ' x ($$self{indent} / 2) . $_ . "\n\n");
+    }
+}
+
+# Start a list.
+sub cmd_over {
+    my $self = shift;
+    local $_ = shift;
+    unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} }
+    push (@{ $$self{INDENTS} }, $$self{MARGIN});
+    $$self{MARGIN} += ($_ + 0);
+}
+
+# End a list.
+sub cmd_back {
+    my $self = shift;
+    $$self{MARGIN} = pop @{ $$self{INDENTS} };
+    unless (defined $$self{MARGIN}) {
+        carp "Unmatched =back";
+        $$self{MARGIN} = $$self{indent};
+    }
+}
+
+# An individual list item.
+sub cmd_item {
+    my $self = shift;
+    if (defined $$self{ITEM}) { $self->item }
+    local $_ = shift;
+    s/\s+$//;
+    $$self{ITEM} = $self->interpolate ($_);
+}
+
+# Begin a block for a particular translator.  Setting VERBATIM triggers
+# special handling in textblock().
+sub cmd_begin {
+    my $self = shift;
+    local $_ = shift;
+    my ($kind) = /^(\S+)/ or return;
+    if ($kind eq 'text') {
+        $$self{VERBATIM} = 1;
+    } else {
+        $$self{EXCLUDE} = 1;
+    }
+}
+
+# End a block for a particular translator.  We assume that all =begin/=end
+# pairs are properly closed.
+sub cmd_end {
+    my $self = shift;
+    $$self{EXCLUDE} = 0;
+    $$self{VERBATIM} = 0;
+}    
+
+# One paragraph for a particular translator.  Ignore it unless it's intended
+# for text, in which case we treat it as a verbatim text block.
+sub cmd_for {
+    my $self = shift;
+    local $_ = shift;
+    my $line = shift;
+    return unless s/^text\b[ \t]*\n?//;
+    $self->verbatim ($_, $line);
+}
+
+
+############################################################################
+# Interior sequences
+############################################################################
+
+# The simple formatting ones.  These are here mostly so that subclasses can
+# override them and do more complicated things.
+sub seq_b { return $_[0]{alt} ? "``$_[1]''" : $_[1] }
+sub seq_c { return $_[0]{alt} ? "``$_[1]''" : "`$_[1]'" }
+sub seq_f { return $_[0]{alt} ? "\"$_[1]\"" : $_[1] }
+sub seq_i { return '*' . $_[1] . '*' }
+
+# The complicated one.  Handle links.  Since this is plain text, we can't
+# actually make any real links, so this is all to figure out what text we
+# print out.
+sub seq_l {
+    my $self = shift;
+    local $_ = shift;
+
+    # Smash whitespace in case we were split across multiple lines.
+    s/\s+/ /g;
+
+    # If we were given any explicit text, just output it.
+    if (/^([^|]+)\|/) { return $1 }
+
+    # Okay, leading and trailing whitespace isn't important; get rid of it.
+    s/^\s+//;
+    s/\s+$//;
+
+    # Default to using the whole content of the link entry as a section
+    # name.  Note that L<manpage/> forces a manpage interpretation, as does
+    # something looking like L<manpage(section)>.  The latter is an
+    # enhancement over the original Pod::Text.
+    my ($manpage, $section) = ('', $_);
+    if (/^(?:https?|ftp|news):/) {
+        # a URL
+        return $_;
+    } elsif (/^"\s*(.*?)\s*"$/) {
+        $section = '"' . $1 . '"';
+    } elsif (m/^[-:.\w]+(?:\(\S+\))?$/) {
+        ($manpage, $section) = ($_, '');
+    } elsif (m%/%) {
+        ($manpage, $section) = split (/\s*\/\s*/, $_, 2);
+    }
+
+    my $text = '';
+    # Now build the actual output text.
+    if (!length $section) {
+        $text = "the $manpage manpage" if length $manpage;
+    } elsif ($section =~ /^[:\w]+(?:\(\))?/) {
+        $text .= 'the ' . $section . ' entry';
+        $text .= (length $manpage) ? " in the $manpage manpage"
+                                   : " elsewhere in this document";
+    } else {
+        $section =~ s/^\"\s*//;
+        $section =~ s/\s*\"$//;
+        $text .= 'the section on "' . $section . '"';
+        $text .= " in the $manpage manpage" if length $manpage;
+    }
+    $text;
+}
+
+
+############################################################################
+# List handling
+############################################################################
+
+# This method is called whenever an =item command is complete (in other
+# words, we've seen its associated paragraph or know for certain that it
+# doesn't have one).  It gets the paragraph associated with the item as an
+# argument.  If that argument is empty, just output the item tag; if it
+# contains a newline, output the item tag followed by the newline.
+# Otherwise, see if there's enough room for us to output the item tag in the
+# margin of the text or if we have to put it on a separate line.
+sub item {
+    my $self = shift;
+    local $_ = shift;
+    my $tag = $$self{ITEM};
+    unless (defined $tag) {
+        carp "item called without tag";
+        return;
+    }
+    undef $$self{ITEM};
+    my $indent = $$self{INDENTS}[-1];
+    unless (defined $indent) { $indent = $$self{indent} }
+    my $space = ' ' x $indent;
+    $space =~ s/^ /:/ if $$self{alt};
+    if (!$_ || /^\s+$/ || ($$self{MARGIN} - $indent < length ($tag) + 1)) {
+        my $margin = $$self{MARGIN};
+        $$self{MARGIN} = $indent;
+        my $output = $self->reformat ($tag);
+        $output =~ s/\n*$/\n/;
+        $self->output ($output);
+        $$self{MARGIN} = $margin;
+        $self->output ($self->reformat ($_)) if /\S/;
+    } else {
+        $_ = $self->reformat ($_);
+        s/^ /:/ if ($$self{alt} && $indent > 0);
+        my $tagspace = ' ' x length $tag;
+        s/^($space)$tagspace/$1$tag/ or warn "Bizarre space in item";
+        $self->output ($_);
+    }
+}
+
+
+############################################################################
+# Output formatting
+############################################################################
+
+# Wrap a line, indenting by the current left margin.  We can't use
+# Text::Wrap because it plays games with tabs.  We can't use formline, even
+# though we'd really like to, because it screws up non-printing characters.
+# So we have to do the wrapping ourselves.
+sub wrap {
+    my $self = shift;
+    local $_ = shift;
+    my $output = '';
+    my $spaces = ' ' x $$self{MARGIN};
+    my $width = $$self{width} - $$self{MARGIN};
+    while (length > $width) {
+        if (s/^([^\n]{0,$width})\s+// || s/^([^\n]{$width})//) {
+            $output .= $spaces . $1 . "\n";
+        } else {
+            last;
+        }
+    }
+    $output .= $spaces . $_;
+    $output =~ s/\s+$/\n\n/;
+    $output;
+}
+
+# Reformat a paragraph of text for the current margin.  Takes the text to
+# reformat and returns the formatted text.
+sub reformat {
+    my $self = shift;
+    local $_ = shift;
+
+    # If we're trying to preserve two spaces after sentences, do some
+    # munging to support that.  Otherwise, smash all repeated whitespace.
+    if ($$self{sentence}) {
+        s/ +$//mg;
+        s/\.\n/. \n/g;
+        s/\n/ /g;
+        s/   +/  /g;
+    } else {
+        s/\s+/ /g;
+    }
+    $self->wrap ($_);
+}
+
+# Output text to the output device.
+sub output { $_[1] =~ tr/\01/ /; print { $_[0]->output_handle } $_[1] }
+
+
+############################################################################
+# Backwards compatibility
+############################################################################
+
+# The old Pod::Text module did everything in a pod2text() function.  This
+# tries to provide the same interface for legacy applications.
+sub pod2text {
+    my @args;
+
+    # This is really ugly; I hate doing option parsing in the middle of a
+    # module.  But the old Pod::Text module supported passing flags to its
+    # entry function, so handle -a and -<number>.
+    while ($_[0] =~ /^-/) {
+        my $flag = shift;
+        if    ($flag eq '-a')       { push (@args, alt => 1)    }
+        elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) }
+        else {
+            unshift (@_, $flag);
+            last;
+        }
+    }
+
+    # Now that we know what arguments we're using, create the parser.
+    my $parser = Pod::PlainText->new (@args);
+
+    # If two arguments were given, the second argument is going to be a file
+    # handle.  That means we want to call parse_from_filehandle(), which
+    # means we need to turn the first argument into a file handle.  Magic
+    # open will handle the <&STDIN case automagically.
+    if (defined $_[1]) {
+        local *IN;
+        unless (open (IN, $_[0])) {
+            croak ("Can't open $_[0] for reading: $!\n");
+            return;
+        }
+        $_[0] = \*IN;
+        return $parser->parse_from_filehandle (@_);
+    } else {
+        return $parser->parse_from_file (@_);
+    }
+}
+
+
+############################################################################
+# Module return value and documentation
+############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::PlainText - Convert POD data to formatted ASCII text
+
+=head1 SYNOPSIS
+
+    use Pod::PlainText;
+    my $parser = Pod::PlainText->new (sentence => 0, width => 78);
+
+    # Read POD from STDIN and write to STDOUT.
+    $parser->parse_from_filehandle;
+
+    # Read POD from file.pod and write to file.txt.
+    $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::PlainText is a module that can convert documentation in the POD format (the
+preferred language for documenting Perl) into formatted ASCII.  It uses no
+special formatting controls or codes whatsoever, and its output is therefore
+suitable for nearly any device.
+
+As a derived class from Pod::Parser, Pod::PlainText supports the same methods and
+interfaces.  See L<Pod::Parser> for all the details; briefly, one creates a
+new parser with C<Pod::PlainText-E<gt>new()> and then calls either
+parse_from_filehandle() or parse_from_file().
+
+new() can take options, in the form of key/value pairs, that control the
+behavior of the parser.  The currently recognized options are:
+
+=over 4
+
+=item alt
+
+If set to a true value, selects an alternate output format that, among other
+things, uses a different heading style and marks C<=item> entries with a
+colon in the left margin.  Defaults to false.
+
+=item indent
+
+The number of spaces to indent regular text, and the default indentation for
+C<=over> blocks.  Defaults to 4.
+
+=item loose
+
+If set to a true value, a blank line is printed after a C<=head1> heading.
+If set to false (the default), no blank line is printed after C<=head1>,
+although one is still printed after C<=head2>.  This is the default because
+it's the expected formatting for manual pages; if you're formatting
+arbitrary text documents, setting this to true may result in more pleasing
+output.
+
+=item sentence
+
+If set to a true value, Pod::PlainText will assume that each sentence ends in two
+spaces, and will try to preserve that spacing.  If set to false, all
+consecutive whitespace in non-verbatim paragraphs is compressed into a
+single space.  Defaults to true.
+
+=item width
+
+The column at which to wrap text on the right-hand side.  Defaults to 76.
+
+=back
+
+The standard Pod::Parser method parse_from_filehandle() takes up to two
+arguments, the first being the file handle to read POD from and the second
+being the file handle to write the formatted output to.  The first defaults
+to STDIN if not given, and the second defaults to STDOUT.  The method
+parse_from_file() is almost identical, except that its two arguments are the
+input and output disk files instead.  See L<Pod::Parser> for the specific
+details.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Bizarre space in item
+
+(W) Something has gone wrong in internal C<=item> processing.  This message
+indicates a bug in Pod::PlainText; you should never see it.
+
+=item Can't open %s for reading: %s
+
+(F) Pod::PlainText was invoked via the compatibility mode pod2text() interface
+and the input file it was given could not be opened.
+
+=item Unknown escape: %s
+
+(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::PlainText didn't
+know about.
+
+=item Unknown sequence: %s
+
+(W) The POD source contained a non-standard internal sequence (something of
+the form C<XE<lt>E<gt>>) that Pod::PlainText didn't know about.
+
+=item Unmatched =back
+
+(W) Pod::PlainText encountered a C<=back> command that didn't correspond to an
+C<=over> command.
+
+=back
+
+=head1 RESTRICTIONS
+
+Embedded Ctrl-As (octal 001) in the input will be mapped to spaces on
+output, due to an internal implementation detail.
+
+=head1 NOTES
+
+This is a replacement for an earlier Pod::Text module written by Tom
+Christiansen.  It has a revamped interface, since it now uses Pod::Parser,
+but an interface roughly compatible with the old Pod::Text::pod2text()
+function is still available.  Please change to the new calling convention,
+though.
+
+The original Pod::Text contained code to do formatting via termcap
+sequences, although it wasn't turned on by default and it was problematic to
+get it to work at all.  This rewrite doesn't even try to do that, but a
+subclass of it does.  Look for L<Pod::Text::Termcap|Pod::Text::Termcap>.
+
+=head1 SEE ALSO
+
+L<Pod::Parser|Pod::Parser>, L<Pod::Text::Termcap|Pod::Text::Termcap>,
+pod2text(1)
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Russ Allbery E<lt>rra@stanford.eduE<gt>, based I<very> heavily on the
+original Pod::Text by Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> and
+its conversion to Pod::Parser by Brad Appleton
+E<lt>bradapp@enteract.comE<gt>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Plainer.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Plainer.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Plainer.pm	(revision 14489)
@@ -0,0 +1,69 @@
+package Pod::Plainer;
+use strict;
+use Pod::Parser;
+our @ISA = qw(Pod::Parser);
+our $VERSION = '0.01';
+
+our %E = qw( < lt > gt );
+ 
+sub escape_ltgt {
+    (undef, my $text) = @_;
+    $text =~ s/([<>])/E<$E{$1}>/g;
+    $text 
+} 
+
+sub simple_delimiters {
+    (undef, my $seq) = @_;
+    $seq -> left_delimiter( '<' ); 
+    $seq -> right_delimiter( '>' );  
+    $seq;
+}
+
+sub textblock {
+    my($parser,$text,$line) = @_;
+    print {$parser->output_handle()}
+	$parser->parse_text(
+	    { -expand_text => q(escape_ltgt),
+	      -expand_seq => q(simple_delimiters) },
+	    $text, $line ) -> raw_text(); 
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Plainer - Perl extension for converting Pod to old style Pod.
+
+=head1 SYNOPSIS
+
+  use Pod::Plainer;
+
+  my $parser = Pod::Plainer -> new ();
+  $parser -> parse_from_filehandle(\*STDIN);
+
+=head1 DESCRIPTION
+
+Pod::Plainer uses Pod::Parser which takes Pod with the (new)
+'CE<lt>E<lt> .. E<gt>E<gt>' constructs
+and returns the old(er) style with just 'CE<lt>E<gt>';
+'<' and '>' are replaced by 'EE<lt>ltE<gt>' and 'EE<lt>gtE<gt>'.
+
+This can be used to pre-process Pod before using tools which do not
+recognise the new style Pods.
+
+=head2 EXPORT
+
+None by default.
+
+=head1 AUTHOR
+
+Robin Barker, rmb1@cise.npl.co.uk
+
+=head1 SEE ALSO
+
+See L<Pod::Parser>.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Select.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Select.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Select.pm	(revision 14489)
@@ -0,0 +1,754 @@
+#############################################################################
+# Pod/Select.pm -- function to select portions of POD docs
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Select;
+
+use vars qw($VERSION);
+$VERSION = 1.30;  ## Current version of this package
+require  5.005;    ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Select, podselect() - extract selected sections of POD from input
+
+=head1 SYNOPSIS
+
+    use Pod::Select;
+
+    ## Select all the POD sections for each file in @filelist
+    ## and print the result on standard output.
+    podselect(@filelist);
+
+    ## Same as above, but write to tmp.out
+    podselect({-output => "tmp.out"}, @filelist):
+
+    ## Select from the given filelist, only those POD sections that are
+    ## within a 1st level section named any of: NAME, SYNOPSIS, OPTIONS.
+    podselect({-sections => ["NAME|SYNOPSIS", "OPTIONS"]}, @filelist):
+
+    ## Select the "DESCRIPTION" section of the PODs from STDIN and write
+    ## the result to STDERR.
+    podselect({-output => ">&STDERR", -sections => ["DESCRIPTION"]}, \*STDIN);
+
+or
+
+    use Pod::Select;
+
+    ## Create a parser object for selecting POD sections from the input
+    $parser = new Pod::Select();
+
+    ## Select all the POD sections for each file in @filelist
+    ## and print the result to tmp.out.
+    $parser->parse_from_file("<&STDIN", "tmp.out");
+
+    ## Select from the given filelist, only those POD sections that are
+    ## within a 1st level section named any of: NAME, SYNOPSIS, OPTIONS.
+    $parser->select("NAME|SYNOPSIS", "OPTIONS");
+    for (@filelist) { $parser->parse_from_file($_); }
+
+    ## Select the "DESCRIPTION" and "SEE ALSO" sections of the PODs from
+    ## STDIN and write the result to STDERR.
+    $parser->select("DESCRIPTION");
+    $parser->add_selection("SEE ALSO");
+    $parser->parse_from_filehandle(\*STDIN, \*STDERR);
+
+=head1 REQUIRES
+
+perl5.005, Pod::Parser, Exporter, Carp
+
+=head1 EXPORTS
+
+podselect()
+
+=head1 DESCRIPTION
+
+B<podselect()> is a function which will extract specified sections of
+pod documentation from an input stream. This ability is provided by the
+B<Pod::Select> module which is a subclass of B<Pod::Parser>.
+B<Pod::Select> provides a method named B<select()> to specify the set of
+POD sections to select for processing/printing. B<podselect()> merely
+creates a B<Pod::Select> object and then invokes the B<podselect()>
+followed by B<parse_from_file()>.
+
+=head1 SECTION SPECIFICATIONS
+
+B<podselect()> and B<Pod::Select::select()> may be given one or more
+"section specifications" to restrict the text processed to only the
+desired set of sections and their corresponding subsections.  A section
+specification is a string containing one or more Perl-style regular
+expressions separated by forward slashes ("/").  If you need to use a
+forward slash literally within a section title you can escape it with a
+backslash ("\/").
+
+The formal syntax of a section specification is:
+
+=over 4
+
+=item *
+
+I<head1-title-regex>/I<head2-title-regex>/...
+
+=back
+
+Any omitted or empty regular expressions will default to ".*".
+Please note that each regular expression given is implicitly
+anchored by adding "^" and "$" to the beginning and end.  Also, if a
+given regular expression starts with a "!" character, then the
+expression is I<negated> (so C<!foo> would match anything I<except>
+C<foo>).
+
+Some example section specifications follow.
+
+=over 4
+
+=item *
+
+Match the C<NAME> and C<SYNOPSIS> sections and all of their subsections:
+
+C<NAME|SYNOPSIS>
+
+=item *
+
+Match only the C<Question> and C<Answer> subsections of the C<DESCRIPTION>
+section:
+
+C<DESCRIPTION/Question|Answer>
+
+=item *
+
+Match the C<Comments> subsection of I<all> sections:
+
+C</Comments>
+
+=item *
+
+Match all subsections of C<DESCRIPTION> I<except> for C<Comments>:
+
+C<DESCRIPTION/!Comments>
+
+=item *
+
+Match the C<DESCRIPTION> section but do I<not> match any of its subsections:
+
+C<DESCRIPTION/!.+>
+
+=item *
+
+Match all top level sections but none of their subsections:
+
+C</!.+>
+
+=back 
+
+=begin _NOT_IMPLEMENTED_
+
+=head1 RANGE SPECIFICATIONS
+
+B<podselect()> and B<Pod::Select::select()> may be given one or more
+"range specifications" to restrict the text processed to only the
+desired ranges of paragraphs in the desired set of sections. A range
+specification is a string containing a single Perl-style regular
+expression (a regex), or else two Perl-style regular expressions
+(regexs) separated by a ".." (Perl's "range" operator is "..").
+The regexs in a range specification are delimited by forward slashes
+("/").  If you need to use a forward slash literally within a regex you
+can escape it with a backslash ("\/").
+
+The formal syntax of a range specification is:
+
+=over 4
+
+=item *
+
+/I<start-range-regex>/[../I<end-range-regex>/]
+
+=back
+
+Where each the item inside square brackets (the ".." followed by the
+end-range-regex) is optional. Each "range-regex" is of the form:
+
+    =cmd-expr text-expr
+
+Where I<cmd-expr> is intended to match the name of one or more POD
+commands, and I<text-expr> is intended to match the paragraph text for
+the command. If a range-regex is supposed to match a POD command, then
+the first character of the regex (the one after the initial '/')
+absolutely I<must> be a single '=' character; it may not be anything
+else (not even a regex meta-character) if it is supposed to match
+against the name of a POD command.
+
+If no I<=cmd-expr> is given then the text-expr will be matched against
+plain textblocks unless it is preceded by a space, in which case it is
+matched against verbatim text-blocks. If no I<text-expr> is given then
+only the command-portion of the paragraph is matched against.
+
+Note that these two expressions are each implicitly anchored. This
+means that when matching against the command-name, there will be an
+implicit '^' and '$' around the given I<=cmd-expr>; and when matching
+against the paragraph text there will be an implicit '\A' and '\Z'
+around the given I<text-expr>.
+
+Unlike with section-specs, the '!' character does I<not> have any special
+meaning (negation or otherwise) at the beginning of a range-spec!
+
+Some example range specifications follow.
+
+=over 4
+
+=item
+Match all C<=for html> paragraphs:
+
+C</=for html/>
+
+=item
+Match all paragraphs between C<=begin html> and C<=end html>
+(note that this will I<not> work correctly if such sections
+are nested):
+
+C</=begin html/../=end html/>
+
+=item
+Match all paragraphs between the given C<=item> name until the end of the
+current section:
+
+C</=item mine/../=head\d/>
+
+=item
+Match all paragraphs between the given C<=item> until the next item, or
+until the end of the itemized list (note that this will I<not> work as
+desired if the item contains an itemized list nested within it):
+
+C</=item mine/../=(item|back)/>
+
+=back 
+
+=end _NOT_IMPLEMENTED_
+
+=cut
+
+#############################################################################
+
+use strict;
+#use diagnostics;
+use Carp;
+use Pod::Parser 1.04;
+use vars qw(@ISA @EXPORT $MAX_HEADING_LEVEL);
+
+@ISA = qw(Pod::Parser);
+@EXPORT = qw(&podselect);
+
+## Maximum number of heading levels supported for '=headN' directives
+*MAX_HEADING_LEVEL = \3;
+
+#############################################################################
+
+=head1 OBJECT METHODS
+
+The following methods are provided in this module. Each one takes a
+reference to the object itself as an implicit first parameter.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+## =begin _PRIVATE_
+## 
+## =head1 B<_init_headings()>
+## 
+## Initialize the current set of active section headings.
+## 
+## =cut
+## 
+## =end _PRIVATE_
+
+use vars qw(%myData @section_headings);
+
+sub _init_headings {
+    my $self = shift;
+    local *myData = $self;
+
+    ## Initialize current section heading titles if necessary
+    unless (defined $myData{_SECTION_HEADINGS}) {
+        local *section_headings = $myData{_SECTION_HEADINGS} = [];
+        for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+            $section_headings[$i] = '';
+        }
+    }
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<curr_headings()>
+
+            ($head1, $head2, $head3, ...) = $parser->curr_headings();
+            $head1 = $parser->curr_headings(1);
+
+This method returns a list of the currently active section headings and
+subheadings in the document being parsed. The list of headings returned
+corresponds to the most recently parsed paragraph of the input.
+
+If an argument is given, it must correspond to the desired section
+heading number, in which case only the specified section heading is
+returned. If there is no current section heading at the specified
+level, then C<undef> is returned.
+
+=cut
+
+sub curr_headings {
+    my $self = shift;
+    $self->_init_headings()  unless (defined $self->{_SECTION_HEADINGS});
+    my @headings = @{ $self->{_SECTION_HEADINGS} };
+    return (@_ > 0  and  $_[0] =~ /^\d+$/) ? $headings[$_[0] - 1] : @headings;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<select()>
+
+            $parser->select($section_spec1,$section_spec2,...);
+
+This method is used to select the particular sections and subsections of
+POD documentation that are to be printed and/or processed. The existing
+set of selected sections is I<replaced> with the given set of sections.
+See B<add_selection()> for adding to the current set of selected
+sections.
+
+Each of the C<$section_spec> arguments should be a section specification
+as described in L<"SECTION SPECIFICATIONS">.  The section specifications
+are parsed by this method and the resulting regular expressions are
+stored in the invoking object.
+
+If no C<$section_spec> arguments are given, then the existing set of
+selected sections is cleared out (which means C<all> sections will be
+processed).
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+use vars qw(@selected_sections);
+
+sub select {
+    my $self = shift;
+    my @sections = @_;
+    local *myData = $self;
+    local $_;
+
+### NEED TO DISCERN A SECTION-SPEC FROM A RANGE-SPEC (look for m{^/.+/$}?)
+
+    ##---------------------------------------------------------------------
+    ## The following is a blatant hack for backward compatibility, and for
+    ## implementing add_selection(). If the *first* *argument* is the
+    ## string "+", then the remaining section specifications are *added*
+    ## to the current set of selections; otherwise the given section
+    ## specifications will *replace* the current set of selections.
+    ##
+    ## This should probably be fixed someday, but for the present time,
+    ## it seems incredibly unlikely that "+" would ever correspond to
+    ## a legitimate section heading
+    ##---------------------------------------------------------------------
+    my $add = ($sections[0] eq "+") ? shift(@sections) : "";
+
+    ## Reset the set of sections to use
+    unless (@sections > 0) {
+        delete $myData{_SELECTED_SECTIONS}  unless ($add);
+        return;
+    }
+    $myData{_SELECTED_SECTIONS} = []
+        unless ($add  &&  exists $myData{_SELECTED_SECTIONS});
+    local *selected_sections = $myData{_SELECTED_SECTIONS};
+
+    ## Compile each spec
+    my $spec;
+    for $spec (@sections) {
+        if ( defined($_ = &_compile_section_spec($spec)) ) {
+            ## Store them in our sections array
+            push(@selected_sections, $_);
+        }
+        else {
+            carp "Ignoring section spec \"$spec\"!\n";
+        }
+    }
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<add_selection()>
+
+            $parser->add_selection($section_spec1,$section_spec2,...);
+
+This method is used to add to the currently selected sections and
+subsections of POD documentation that are to be printed and/or
+processed. See <select()> for replacing the currently selected sections.
+
+Each of the C<$section_spec> arguments should be a section specification
+as described in L<"SECTION SPECIFICATIONS">. The section specifications
+are parsed by this method and the resulting regular expressions are
+stored in the invoking object.
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+sub add_selection {
+    my $self = shift;
+    $self->select("+", @_);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<clear_selections()>
+
+            $parser->clear_selections();
+
+This method takes no arguments, it has the exact same effect as invoking
+<select()> with no arguments.
+
+=cut
+
+sub clear_selections {
+    my $self = shift;
+    $self->select();
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<match_section()>
+
+            $boolean = $parser->match_section($heading1,$heading2,...);
+
+Returns a value of true if the given section and subsection heading
+titles match any of the currently selected section specifications in
+effect from prior calls to B<select()> and B<add_selection()> (or if
+there are no explictly selected/deselected sections).
+
+The arguments C<$heading1>, C<$heading2>, etc. are the heading titles of
+the corresponding sections, subsections, etc. to try and match.  If
+C<$headingN> is omitted then it defaults to the current corresponding
+section heading title in the input.
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+sub match_section {
+    my $self = shift;
+    my (@headings) = @_;
+    local *myData = $self;
+
+    ## Return true if no restrictions were explicitly specified
+    my $selections = (exists $myData{_SELECTED_SECTIONS})
+                       ?  $myData{_SELECTED_SECTIONS}  :  undef;
+    return  1  unless ((defined $selections) && (@{$selections} > 0));
+
+    ## Default any unspecified sections to the current one
+    my @current_headings = $self->curr_headings();
+    for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+        (defined $headings[$i])  or  $headings[$i] = $current_headings[$i];
+    }
+
+    ## Look for a match against the specified section expressions
+    my ($section_spec, $regex, $negated, $match);
+    for $section_spec ( @{$selections} ) {
+        ##------------------------------------------------------
+        ## Each portion of this spec must match in order for
+        ## the spec to be matched. So we will start with a 
+        ## match-value of 'true' and logically 'and' it with
+        ## the results of matching a given element of the spec.
+        ##------------------------------------------------------
+        $match = 1;
+        for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+            $regex   = $section_spec->[$i];
+            $negated = ($regex =~ s/^\!//);
+            $match  &= ($negated ? ($headings[$i] !~ /${regex}/)
+                                 : ($headings[$i] =~ /${regex}/));
+            last unless ($match);
+        }
+        return  1  if ($match);
+    }
+    return  0;  ## no match
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<is_selected()>
+
+            $boolean = $parser->is_selected($paragraph);
+
+This method is used to determine if the block of text given in
+C<$paragraph> falls within the currently selected set of POD sections
+and subsections to be printed or processed. This method is also
+responsible for keeping track of the current input section and
+subsections. It is assumed that C<$paragraph> is the most recently read
+(but not yet processed) input paragraph.
+
+The value returned will be true if the C<$paragraph> and the rest of the
+text in the same section as C<$paragraph> should be selected (included)
+for processing; otherwise a false value is returned.
+
+=cut
+
+sub is_selected {
+    my ($self, $paragraph) = @_;
+    local $_;
+    local *myData = $self;
+
+    $self->_init_headings()  unless (defined $myData{_SECTION_HEADINGS});
+
+    ## Keep track of current sections levels and headings
+    $_ = $paragraph;
+    if (/^=((?:sub)*)(?:head(?:ing)?|sec(?:tion)?)(\d*)\s+(.*)\s*$/)
+    {
+        ## This is a section heading command
+        my ($level, $heading) = ($2, $3);
+        $level = 1 + (length($1) / 3)  if ((! length $level) || (length $1));
+        ## Reset the current section heading at this level
+        $myData{_SECTION_HEADINGS}->[$level - 1] = $heading;
+        ## Reset subsection headings of this one to empty
+        for (my $i = $level; $i < $MAX_HEADING_LEVEL; ++$i) {
+            $myData{_SECTION_HEADINGS}->[$i] = '';
+        }
+    }
+
+    return  $self->match_section();
+}
+
+#############################################################################
+
+=head1 EXPORTED FUNCTIONS
+
+The following functions are exported by this module. Please note that
+these are functions (not methods) and therefore C<do not> take an
+implicit first argument.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<podselect()>
+
+            podselect(\%options,@filelist);
+
+B<podselect> will print the raw (untranslated) POD paragraphs of all
+POD sections in the given input files specified by C<@filelist>
+according to the given options.
+
+If any argument to B<podselect> is a reference to a hash
+(associative array) then the values with the following keys are
+processed as follows:
+
+=over 4
+
+=item B<-output>
+
+A string corresponding to the desired output file (or ">&STDOUT"
+or ">&STDERR"). The default is to use standard output.
+
+=item B<-sections>
+
+A reference to an array of sections specifications (as described in
+L<"SECTION SPECIFICATIONS">) which indicate the desired set of POD
+sections and subsections to be selected from input. If no section
+specifications are given, then all sections of the PODs are used.
+
+=begin _NOT_IMPLEMENTED_
+
+=item B<-ranges>
+
+A reference to an array of range specifications (as described in
+L<"RANGE SPECIFICATIONS">) which indicate the desired range of POD
+paragraphs to be selected from the desired input sections. If no range
+specifications are given, then all paragraphs of the desired sections
+are used.
+
+=end _NOT_IMPLEMENTED_
+
+=back
+
+All other arguments should correspond to the names of input files
+containing POD sections. A file name of "-" or "<&STDIN" will
+be interpeted to mean standard input (which is the default if no
+filenames are given).
+
+=cut 
+
+sub podselect {
+    my(@argv) = @_;
+    my %defaults = ();
+    my $pod_parser = new Pod::Select(%defaults);
+    my $num_inputs = 0;
+    my $output = ">&STDOUT";
+    my %opts;
+    local $_;
+    for (@argv) {
+        if (ref($_)) {
+        next unless (ref($_) eq 'HASH');
+            %opts = (%defaults, %{$_});
+
+            ##-------------------------------------------------------------
+            ## Need this for backward compatibility since we formerly used
+            ## options that were all uppercase words rather than ones that
+            ## looked like Unix command-line options.
+            ## to be uppercase keywords)
+            ##-------------------------------------------------------------
+            %opts = map {
+                my ($key, $val) = (lc $_, $opts{$_});
+                $key =~ s/^(?=\w)/-/;
+                $key =~ /^-se[cl]/  and  $key  = '-sections';
+                #! $key eq '-range'    and  $key .= 's';
+                ($key => $val);    
+            } (keys %opts);
+
+            ## Process the options
+            (exists $opts{'-output'})  and  $output = $opts{'-output'};
+
+            ## Select the desired sections
+            $pod_parser->select(@{ $opts{'-sections'} })
+                if ( (defined $opts{'-sections'})
+                     && ((ref $opts{'-sections'}) eq 'ARRAY') );
+
+            #! ## Select the desired paragraph ranges
+            #! $pod_parser->select(@{ $opts{'-ranges'} })
+            #!     if ( (defined $opts{'-ranges'})
+            #!          && ((ref $opts{'-ranges'}) eq 'ARRAY') );
+        }
+        else {
+            $pod_parser->parse_from_file($_, $output);
+            ++$num_inputs;
+        }
+    }
+    $pod_parser->parse_from_file("-")  unless ($num_inputs > 0);
+}
+
+#############################################################################
+
+=head1 PRIVATE METHODS AND DATA
+
+B<Pod::Select> makes uses a number of internal methods and data fields
+which clients should not need to see or use. For the sake of avoiding
+name collisions with client data and methods, these methods and fields
+are briefly discussed here. Determined hackers may obtain further
+information about them by reading the B<Pod::Select> source code.
+
+Private data fields are stored in the hash-object whose reference is
+returned by the B<new()> constructor for this class. The names of all
+private methods and data-fields used by B<Pod::Select> begin with a
+prefix of "_" and match the regular expression C</^_\w+$/>.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_compile_section_spec()>
+
+            $listref = $parser->_compile_section_spec($section_spec);
+
+This function (note it is a function and I<not> a method) takes a
+section specification (as described in L<"SECTION SPECIFICATIONS">)
+given in C<$section_sepc>, and compiles it into a list of regular
+expressions. If C<$section_spec> has no syntax errors, then a reference
+to the list (array) of corresponding regular expressions is returned;
+otherwise C<undef> is returned and an error message is printed (using
+B<carp>) for each invalid regex.
+
+=end _PRIVATE_
+
+=cut
+
+sub _compile_section_spec {
+    my ($section_spec) = @_;
+    my (@regexs, $negated);
+
+    ## Compile the spec into a list of regexs
+    local $_ = $section_spec;
+    s|\\\\|\001|g;  ## handle escaped backward slashes
+    s|\\/|\002|g;   ## handle escaped forward slashes
+
+    ## Parse the regexs for the heading titles
+    @regexs = split('/', $_, $MAX_HEADING_LEVEL);
+
+    ## Set default regex for ommitted levels
+    for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+        $regexs[$i]  = '.*'  unless ((defined $regexs[$i])
+                                     && (length $regexs[$i]));
+    }
+    ## Modify the regexs as needed and validate their syntax
+    my $bad_regexs = 0;
+    for (@regexs) {
+        $_ .= '.+'  if ($_ eq '!');
+        s|\001|\\\\|g;       ## restore escaped backward slashes
+        s|\002|\\/|g;        ## restore escaped forward slashes
+        $negated = s/^\!//;  ## check for negation
+        eval "/$_/";         ## check regex syntax
+        if ($@) {
+            ++$bad_regexs;
+            carp "Bad regular expression /$_/ in \"$section_spec\": $@\n";
+        }
+        else {
+            ## Add the forward and rear anchors (and put the negator back)
+            $_ = '^' . $_  unless (/^\^/);
+            $_ = $_ . '$'  unless (/\$$/);
+            $_ = '!' . $_  if ($negated);
+        }
+    }
+    return  (! $bad_regexs) ? [ @regexs ] : undef;
+}
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head2 $self->{_SECTION_HEADINGS}
+
+A reference to an array of the current section heading titles for each
+heading level (note that the first heading level title is at index 0).
+
+=end _PRIVATE_
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head2 $self->{_SELECTED_SECTIONS}
+
+A reference to an array of references to arrays. Each subarray is a list
+of anchored regular expressions (preceded by a "!" if the expression is to
+be negated). The index of the expression in the subarray should correspond
+to the index of the heading title in C<$self-E<gt>{_SECTION_HEADINGS}>
+that it is to be matched against.
+
+=end _PRIVATE_
+
+=cut
+
+#############################################################################
+
+=head1 SEE ALSO
+
+L<Pod::Parser>
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<pod2text> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+1;
+# vim: ts=4 sw=4 et
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Text.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Text.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Text.pm	(revision 14489)
@@ -0,0 +1,848 @@
+# Pod::Text -- Convert POD data to formatted ASCII text.
+# $Id: Text.pm,v 2.21 2002/08/04 03:34:58 eagle Exp $
+#
+# Copyright 1999, 2000, 2001, 2002 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module converts POD to formatted text.  It replaces the old Pod::Text
+# module that came with versions of Perl prior to 5.6.0 and attempts to match
+# its output except for some specific circumstances where other decisions
+# seemed to produce better output.  It uses Pod::Parser and is designed to be
+# very easy to subclass.
+#
+# Perl core hackers, please note that this module is also separately
+# maintained outside of the Perl core as part of the podlators.  Please send
+# me any patches at the address above in addition to sending them to the
+# standard Perl mailing lists.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::Text;
+
+require 5.004;
+
+use Carp qw(carp croak);
+use Exporter ();
+use Pod::ParseLink qw(parselink);
+use Pod::Select ();
+
+use strict;
+use vars qw(@ISA @EXPORT %ESCAPES $VERSION);
+
+# We inherit from Pod::Select instead of Pod::Parser so that we can be used by
+# Pod::Usage.
+@ISA = qw(Pod::Select Exporter);
+
+# We have to export pod2text for backward compatibility.
+@EXPORT = qw(pod2text);
+
+# Don't use the CVS revision as the version, since this module is also in Perl
+# core and too many things could munge CVS magic revision strings.  This
+# number should ideally be the same as the CVS revision in podlators, however.
+$VERSION = 2.21;
+
+
+##############################################################################
+# Table of supported E<> escapes
+##############################################################################
+
+# This table is taken near verbatim from Pod::PlainText in Pod::Parser, which
+# got it near verbatim from the original Pod::Text.  It is therefore credited
+# to Tom Christiansen, and I'm glad I didn't have to write it.  :)  "iexcl" to
+# "divide" added by Tim Jenness.
+%ESCAPES = (
+    'amp'       =>    '&',      # ampersand
+    'apos'      =>    "'",      # apostrophe
+    'lt'        =>    '<',      # left chevron, less-than
+    'gt'        =>    '>',      # right chevron, greater-than
+    'quot'      =>    '"',      # double quote
+    'sol'       =>    '/',      # solidus (forward slash)
+    'verbar'    =>    '|',      # vertical bar
+
+    "Aacute"    =>    "\xC1",   # capital A, acute accent
+    "aacute"    =>    "\xE1",   # small a, acute accent
+    "Acirc"     =>    "\xC2",   # capital A, circumflex accent
+    "acirc"     =>    "\xE2",   # small a, circumflex accent
+    "AElig"     =>    "\xC6",   # capital AE diphthong (ligature)
+    "aelig"     =>    "\xE6",   # small ae diphthong (ligature)
+    "Agrave"    =>    "\xC0",   # capital A, grave accent
+    "agrave"    =>    "\xE0",   # small a, grave accent
+    "Aring"     =>    "\xC5",   # capital A, ring
+    "aring"     =>    "\xE5",   # small a, ring
+    "Atilde"    =>    "\xC3",   # capital A, tilde
+    "atilde"    =>    "\xE3",   # small a, tilde
+    "Auml"      =>    "\xC4",   # capital A, dieresis or umlaut mark
+    "auml"      =>    "\xE4",   # small a, dieresis or umlaut mark
+    "Ccedil"    =>    "\xC7",   # capital C, cedilla
+    "ccedil"    =>    "\xE7",   # small c, cedilla
+    "Eacute"    =>    "\xC9",   # capital E, acute accent
+    "eacute"    =>    "\xE9",   # small e, acute accent
+    "Ecirc"     =>    "\xCA",   # capital E, circumflex accent
+    "ecirc"     =>    "\xEA",   # small e, circumflex accent
+    "Egrave"    =>    "\xC8",   # capital E, grave accent
+    "egrave"    =>    "\xE8",   # small e, grave accent
+    "ETH"       =>    "\xD0",   # capital Eth, Icelandic
+    "eth"       =>    "\xF0",   # small eth, Icelandic
+    "Euml"      =>    "\xCB",   # capital E, dieresis or umlaut mark
+    "euml"      =>    "\xEB",   # small e, dieresis or umlaut mark
+    "Iacute"    =>    "\xCD",   # capital I, acute accent
+    "iacute"    =>    "\xED",   # small i, acute accent
+    "Icirc"     =>    "\xCE",   # capital I, circumflex accent
+    "icirc"     =>    "\xEE",   # small i, circumflex accent
+    "Igrave"    =>    "\xCC",   # capital I, grave accent
+    "igrave"    =>    "\xEC",   # small i, grave accent
+    "Iuml"      =>    "\xCF",   # capital I, dieresis or umlaut mark
+    "iuml"      =>    "\xEF",   # small i, dieresis or umlaut mark
+    "Ntilde"    =>    "\xD1",   # capital N, tilde
+    "ntilde"    =>    "\xF1",   # small n, tilde
+    "Oacute"    =>    "\xD3",   # capital O, acute accent
+    "oacute"    =>    "\xF3",   # small o, acute accent
+    "Ocirc"     =>    "\xD4",   # capital O, circumflex accent
+    "ocirc"     =>    "\xF4",   # small o, circumflex accent
+    "Ograve"    =>    "\xD2",   # capital O, grave accent
+    "ograve"    =>    "\xF2",   # small o, grave accent
+    "Oslash"    =>    "\xD8",   # capital O, slash
+    "oslash"    =>    "\xF8",   # small o, slash
+    "Otilde"    =>    "\xD5",   # capital O, tilde
+    "otilde"    =>    "\xF5",   # small o, tilde
+    "Ouml"      =>    "\xD6",   # capital O, dieresis or umlaut mark
+    "ouml"      =>    "\xF6",   # small o, dieresis or umlaut mark
+    "szlig"     =>    "\xDF",   # small sharp s, German (sz ligature)
+    "THORN"     =>    "\xDE",   # capital THORN, Icelandic
+    "thorn"     =>    "\xFE",   # small thorn, Icelandic
+    "Uacute"    =>    "\xDA",   # capital U, acute accent
+    "uacute"    =>    "\xFA",   # small u, acute accent
+    "Ucirc"     =>    "\xDB",   # capital U, circumflex accent
+    "ucirc"     =>    "\xFB",   # small u, circumflex accent
+    "Ugrave"    =>    "\xD9",   # capital U, grave accent
+    "ugrave"    =>    "\xF9",   # small u, grave accent
+    "Uuml"      =>    "\xDC",   # capital U, dieresis or umlaut mark
+    "uuml"      =>    "\xFC",   # small u, dieresis or umlaut mark
+    "Yacute"    =>    "\xDD",   # capital Y, acute accent
+    "yacute"    =>    "\xFD",   # small y, acute accent
+    "yuml"      =>    "\xFF",   # small y, dieresis or umlaut mark
+
+    "laquo"     =>    "\xAB",   # left pointing double angle quotation mark
+    "lchevron"  =>    "\xAB",   #  synonym (backwards compatibility)
+    "raquo"     =>    "\xBB",   # right pointing double angle quotation mark
+    "rchevron"  =>    "\xBB",   #  synonym (backwards compatibility)
+
+    "iexcl"     =>    "\xA1",   # inverted exclamation mark
+    "cent"      =>    "\xA2",   # cent sign
+    "pound"     =>    "\xA3",   # (UK) pound sign
+    "curren"    =>    "\xA4",   # currency sign
+    "yen"       =>    "\xA5",   # yen sign
+    "brvbar"    =>    "\xA6",   # broken vertical bar
+    "sect"      =>    "\xA7",   # section sign
+    "uml"       =>    "\xA8",   # diaresis
+    "copy"      =>    "\xA9",   # Copyright symbol
+    "ordf"      =>    "\xAA",   # feminine ordinal indicator
+    "not"       =>    "\xAC",   # not sign
+    "shy"       =>    '',       # soft (discretionary) hyphen
+    "reg"       =>    "\xAE",   # registered trademark
+    "macr"      =>    "\xAF",   # macron, overline
+    "deg"       =>    "\xB0",   # degree sign
+    "plusmn"    =>    "\xB1",   # plus-minus sign
+    "sup2"      =>    "\xB2",   # superscript 2
+    "sup3"      =>    "\xB3",   # superscript 3
+    "acute"     =>    "\xB4",   # acute accent
+    "micro"     =>    "\xB5",   # micro sign
+    "para"      =>    "\xB6",   # pilcrow sign = paragraph sign
+    "middot"    =>    "\xB7",   # middle dot = Georgian comma
+    "cedil"     =>    "\xB8",   # cedilla
+    "sup1"      =>    "\xB9",   # superscript 1
+    "ordm"      =>    "\xBA",   # masculine ordinal indicator
+    "frac14"    =>    "\xBC",   # vulgar fraction one quarter
+    "frac12"    =>    "\xBD",   # vulgar fraction one half
+    "frac34"    =>    "\xBE",   # vulgar fraction three quarters
+    "iquest"    =>    "\xBF",   # inverted question mark
+    "times"     =>    "\xD7",   # multiplication sign
+    "divide"    =>    "\xF7",   # division sign
+
+    "nbsp"      =>    "\x01",   # non-breaking space
+);
+
+
+##############################################################################
+# Initialization
+##############################################################################
+
+# Initialize the object.  Must be sure to call our parent initializer.
+sub initialize {
+    my $self = shift;
+
+    $$self{alt}      = 0  unless defined $$self{alt};
+    $$self{indent}   = 4  unless defined $$self{indent};
+    $$self{margin}   = 0  unless defined $$self{margin};
+    $$self{loose}    = 0  unless defined $$self{loose};
+    $$self{sentence} = 0  unless defined $$self{sentence};
+    $$self{width}    = 76 unless defined $$self{width};
+
+    # Figure out what quotes we'll be using for C<> text.
+    $$self{quotes} ||= '"';
+    if ($$self{quotes} eq 'none') {
+        $$self{LQUOTE} = $$self{RQUOTE} = '';
+    } elsif (length ($$self{quotes}) == 1) {
+        $$self{LQUOTE} = $$self{RQUOTE} = $$self{quotes};
+    } elsif ($$self{quotes} =~ /^(.)(.)$/
+             || $$self{quotes} =~ /^(..)(..)$/) {
+        $$self{LQUOTE} = $1;
+        $$self{RQUOTE} = $2;
+    } else {
+        croak qq(Invalid quote specification "$$self{quotes}");
+    }
+
+    # Stack of indentations.
+    $$self{INDENTS}  = [];
+
+    # Current left margin.
+    $$self{MARGIN} = $$self{indent} + $$self{margin};
+
+    $self->SUPER::initialize;
+
+    # Tell Pod::Parser that we want the non-POD stuff too if code was set.
+    $self->parseopts ('-want_nonPODs' => 1) if $$self{code};
+}
+
+
+##############################################################################
+# Core overrides
+##############################################################################
+
+# Called for each command paragraph.  Gets the command, the associated
+# paragraph, the line number, and a Pod::Paragraph object.  Just dispatches
+# the command to a method named the same as the command.  =cut is handled
+# internally by Pod::Parser.
+sub command {
+    my $self = shift;
+    my $command = shift;
+    return if $command eq 'pod';
+    return if ($$self{EXCLUDE} && $command ne 'end');
+    if ($self->can ('cmd_' . $command)) {
+        $command = 'cmd_' . $command;
+        $self->$command (@_);
+    } else {
+        my ($text, $line, $paragraph) = @_;
+        my $file;
+        ($file, $line) = $paragraph->file_line;
+        $text =~ s/\n+\z//;
+        $text = " $text" if ($text =~ /^\S/);
+        warn qq($file:$line: Unknown command paragraph: =$command$text\n);
+        return;
+    }
+}
+
+# Called for a verbatim paragraph.  Gets the paragraph, the line number, and a
+# Pod::Paragraph object.  Just output it verbatim, but with tabs converted to
+# spaces.
+sub verbatim {
+    my $self = shift;
+    return if $$self{EXCLUDE};
+    $self->item if defined $$self{ITEM};
+    local $_ = shift;
+    return if /^\s*$/;
+    s/^(\s*\S+)/(' ' x $$self{MARGIN}) . $1/gme;
+    $self->output ($_);
+}
+
+# Called for a regular text block.  Gets the paragraph, the line number, and a
+# Pod::Paragraph object.  Perform interpolation and output the results.
+sub textblock {
+    my $self = shift;
+    return if $$self{EXCLUDE};
+    $self->output ($_[0]), return if $$self{VERBATIM};
+    local $_ = shift;
+    my $line = shift;
+
+    # Interpolate and output the paragraph.
+    $_ = $self->interpolate ($_, $line);
+    s/\s+$/\n/;
+    if (defined $$self{ITEM}) {
+        $self->item ($_ . "\n");
+    } else {
+        $self->output ($self->reformat ($_ . "\n"));
+    }
+}
+
+# Called for a formatting code.  Gets the command, argument, and a
+# Pod::InteriorSequence object and is expected to return the resulting text.
+# Calls methods for code, bold, italic, file, and link to handle those types
+# of codes, and handles S<>, E<>, X<>, and Z<> directly.
+sub interior_sequence {
+    local $_;
+    my ($self, $command, $seq);
+    ($self, $command, $_, $seq) = @_;
+
+    # We have to defer processing of the inside of an L<> formatting code.  If
+    # this code is nested inside an L<> code, return the literal raw text of
+    # it.
+    my $parent = $seq->nested;
+    while (defined $parent) {
+        return $seq->raw_text if ($parent->cmd_name eq 'L');
+        $parent = $parent->nested;
+    }
+
+    # Index entries are ignored in plain text.
+    return '' if ($command eq 'X' || $command eq 'Z');
+
+    # Expand escapes into the actual character now, warning if invalid.
+    if ($command eq 'E') {
+        if (/^\d+$/) {
+            return chr;
+        } else {
+            return $ESCAPES{$_} if defined $ESCAPES{$_};
+            my ($file, $line) = $seq->file_line;
+            warn "$file:$line: Unknown escape: E<$_>\n";
+            return "E<$_>";
+        }
+    }
+
+    # For all the other formatting codes, empty content produces no output.
+    return if $_ eq '';
+
+    # For S<>, compress all internal whitespace and then map spaces to \01.
+    # When we output the text, we'll map this back.
+    if ($command eq 'S') {
+        s/\s+/ /g;
+        tr/ /\01/;
+        return $_;
+    }
+
+    # Anything else needs to get dispatched to another method.
+    if    ($command eq 'B') { return $self->seq_b ($_) }
+    elsif ($command eq 'C') { return $self->seq_c ($_) }
+    elsif ($command eq 'F') { return $self->seq_f ($_) }
+    elsif ($command eq 'I') { return $self->seq_i ($_) }
+    elsif ($command eq 'L') { return $self->seq_l ($_, $seq) }
+    else {
+        my ($file, $line) = $seq->file_line;
+        warn "$file:$line: Unknown formatting code: $command<$_>\n";
+    }
+}
+
+# Called for each paragraph that's actually part of the POD.  We take
+# advantage of this opportunity to untabify the input.  Also, if given the
+# code option, we may see paragraphs that aren't part of the POD and need to
+# output them directly.
+sub preprocess_paragraph {
+    my $self = shift;
+    local $_ = shift;
+    1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me;
+    $self->output_code ($_) if $self->cutting;
+    $_;
+}
+
+
+##############################################################################
+# Command paragraphs
+##############################################################################
+
+# All command paragraphs take the paragraph and the line number.
+
+# First level heading.
+sub cmd_head1 {
+    my ($self, $text, $line) = @_;
+    $self->heading ($text, $line, 0, '====');
+}
+
+# Second level heading.
+sub cmd_head2 {
+    my ($self, $text, $line) = @_;
+    $self->heading ($text, $line, $$self{indent} / 2, '==  ');
+}
+
+# Third level heading.
+sub cmd_head3 {
+    my ($self, $text, $line) = @_;
+    $self->heading ($text, $line, $$self{indent} * 2 / 3 + 0.5, '=   ');
+}
+
+# Third level heading.
+sub cmd_head4 {
+    my ($self, $text, $line) = @_;
+    $self->heading ($text, $line, $$self{indent} * 3 / 4 + 0.5, '-   ');
+}
+
+# Start a list.
+sub cmd_over {
+    my $self = shift;
+    local $_ = shift;
+    $self->item ("\n\n") if defined $$self{ITEM};
+    unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} }
+    push (@{ $$self{INDENTS} }, $$self{MARGIN});
+    $$self{MARGIN} += ($_ + 0);
+}
+
+# End a list.
+sub cmd_back {
+    my ($self, $text, $line, $paragraph) = @_;
+    $self->item ("\n\n") if defined $$self{ITEM};
+    $$self{MARGIN} = pop @{ $$self{INDENTS} };
+    unless (defined $$self{MARGIN}) {
+        my $file;
+        ($file, $line) = $paragraph->file_line;
+        warn "$file:$line: Unmatched =back\n";
+        $$self{MARGIN} = $$self{indent};
+    }
+}
+
+# An individual list item.
+sub cmd_item {
+    my $self = shift;
+    if (defined $$self{ITEM}) { $self->item }
+    local $_ = shift;
+    s/\s+$//;
+    $$self{ITEM} = $_ ? $self->interpolate ($_) : '*';
+}
+
+# Begin a block for a particular translator.  Setting VERBATIM triggers
+# special handling in textblock().
+sub cmd_begin {
+    my $self = shift;
+    local $_ = shift;
+    my ($kind) = /^(\S+)/ or return;
+    if ($kind eq 'text') {
+        $$self{VERBATIM} = 1;
+    } else {
+        $$self{EXCLUDE} = 1;
+    }
+}
+
+# End a block for a particular translator.  We assume that all =begin/=end
+# pairs are properly closed.
+sub cmd_end {
+    my $self = shift;
+    $$self{EXCLUDE} = 0;
+    $$self{VERBATIM} = 0;
+}
+
+# One paragraph for a particular translator.  Ignore it unless it's intended
+# for text, in which case we treat it as a verbatim text block.
+sub cmd_for {
+    my $self = shift;
+    local $_ = shift;
+    my $line = shift;
+    return unless s/^text\b[ \t]*\n?//;
+    $self->verbatim ($_, $line);
+}
+
+
+##############################################################################
+# Formatting codes
+##############################################################################
+
+# The simple ones.  These are here mostly so that subclasses can override them
+# and do more complicated things.
+sub seq_b { return $_[0]{alt} ? "``$_[1]''" : $_[1] }
+sub seq_f { return $_[0]{alt} ? "\"$_[1]\"" : $_[1] }
+sub seq_i { return '*' . $_[1] . '*' }
+
+# Apply a whole bunch of messy heuristics to not quote things that don't
+# benefit from being quoted.  These originally come from Barrie Slaymaker and
+# largely duplicate code in Pod::Man.
+sub seq_c {
+    my $self = shift;
+    local $_ = shift;
+
+    # A regex that matches the portion of a variable reference that's the
+    # array or hash index, separated out just because we want to use it in
+    # several places in the following regex.
+    my $index = '(?: \[.*\] | \{.*\} )?';
+
+    # Check for things that we don't want to quote, and if we find any of
+    # them, return the string with just a font change and no quoting.
+    m{
+      ^\s*
+      (?:
+         ( [\'\`\"] ) .* \1                             # already quoted
+       | \` .* \'                                       # `quoted'
+       | \$+ [\#^]? \S $index                           # special ($^Foo, $")
+       | [\$\@%&*]+ \#? [:\'\w]+ $index                 # plain var or func
+       | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call
+       | [+-]? ( \d[\d.]* | \.\d+ ) (?: [eE][+-]?\d+ )? # a number
+       | 0x [a-fA-F\d]+                                 # a hex constant
+      )
+      \s*\z
+     }xo && return $_;
+
+    # If we didn't return, go ahead and quote the text.
+    return $$self{alt} ? "``$_''" : "$$self{LQUOTE}$_$$self{RQUOTE}";
+}
+
+# Handle links.  Since this is plain text, we can't actually make any real
+# links, so this is all to figure out what text we print out.  Most of the
+# work is done by Pod::ParseLink.
+sub seq_l {
+    my ($self, $link, $seq) = @_;
+    my ($text, $type) = (parselink ($link))[1,4];
+    my ($file, $line) = $seq->file_line;
+    $text = $self->interpolate ($text, $line);
+    $text = '<' . $text . '>' if $type eq 'url';
+    return $text || '';
+}
+
+
+##############################################################################
+# Header handling
+##############################################################################
+
+# The common code for handling all headers.  Takes the interpolated header
+# text, the line number, the indentation, and the surrounding marker for the
+# alt formatting method.
+sub heading {
+    my ($self, $text, $line, $indent, $marker) = @_;
+    $self->item ("\n\n") if defined $$self{ITEM};
+    $text =~ s/\s+$//;
+    $text = $self->interpolate ($text, $line);
+    if ($$self{alt}) {
+        my $closemark = reverse (split (//, $marker));
+        my $margin = ' ' x $$self{margin};
+        $self->output ("\n" . "$margin$marker $text $closemark" . "\n\n");
+    } else {
+        $text .= "\n" if $$self{loose};
+        my $margin = ' ' x ($$self{margin} + $indent);
+        $self->output ($margin . $text . "\n");
+    }
+}
+
+
+##############################################################################
+# List handling
+##############################################################################
+
+# This method is called whenever an =item command is complete (in other words,
+# we've seen its associated paragraph or know for certain that it doesn't have
+# one).  It gets the paragraph associated with the item as an argument.  If
+# that argument is empty, just output the item tag; if it contains a newline,
+# output the item tag followed by the newline.  Otherwise, see if there's
+# enough room for us to output the item tag in the margin of the text or if we
+# have to put it on a separate line.
+sub item {
+    my $self = shift;
+    local $_ = shift;
+    my $tag = $$self{ITEM};
+    unless (defined $tag) {
+        carp "Item called without tag";
+        return;
+    }
+    undef $$self{ITEM};
+    my $indent = $$self{INDENTS}[-1];
+    unless (defined $indent) { $indent = $$self{indent} }
+    my $margin = ' ' x $$self{margin};
+    if (!$_ || /^\s+$/ || ($$self{MARGIN} - $indent < length ($tag) + 1)) {
+        my $realindent = $$self{MARGIN};
+        $$self{MARGIN} = $indent;
+        my $output = $self->reformat ($tag);
+        $output =~ s/^$margin /$margin:/ if ($$self{alt} && $indent > 0);
+        $output =~ s/\n*$/\n/;
+
+        # If the text is just whitespace, we have an empty item paragraph;
+        # this can result from =over/=item/=back without any intermixed
+        # paragraphs.  Insert some whitespace to keep the =item from merging
+        # into the next paragraph.
+        $output .= "\n" if $_ && $_ =~ /^\s*$/;
+
+        $self->output ($output);
+        $$self{MARGIN} = $realindent;
+        $self->output ($self->reformat ($_)) if $_ && /\S/;
+    } else {
+        my $space = ' ' x $indent;
+        $space =~ s/^$margin /$margin:/ if $$self{alt};
+        $_ = $self->reformat ($_);
+        s/^$margin /$margin:/ if ($$self{alt} && $indent > 0);
+        my $tagspace = ' ' x length $tag;
+        s/^($space)$tagspace/$1$tag/ or warn "Bizarre space in item";
+        $self->output ($_);
+    }
+}
+
+
+##############################################################################
+# Output formatting
+##############################################################################
+
+# Wrap a line, indenting by the current left margin.  We can't use Text::Wrap
+# because it plays games with tabs.  We can't use formline, even though we'd
+# really like to, because it screws up non-printing characters.  So we have to
+# do the wrapping ourselves.
+sub wrap {
+    my $self = shift;
+    local $_ = shift;
+    my $output = '';
+    my $spaces = ' ' x $$self{MARGIN};
+    my $width = $$self{width} - $$self{MARGIN};
+    while (length > $width) {
+        if (s/^([^\n]{0,$width})\s+// || s/^([^\n]{$width})//) {
+            $output .= $spaces . $1 . "\n";
+        } else {
+            last;
+        }
+    }
+    $output .= $spaces . $_;
+    $output =~ s/\s+$/\n\n/;
+    $output;
+}
+
+# Reformat a paragraph of text for the current margin.  Takes the text to
+# reformat and returns the formatted text.
+sub reformat {
+    my $self = shift;
+    local $_ = shift;
+
+    # If we're trying to preserve two spaces after sentences, do some munging
+    # to support that.  Otherwise, smash all repeated whitespace.
+    if ($$self{sentence}) {
+        s/ +$//mg;
+        s/\.\n/. \n/g;
+        s/\n/ /g;
+        s/   +/  /g;
+    } else {
+        s/\s+/ /g;
+    }
+    $self->wrap ($_);
+}
+
+# Output text to the output device.
+sub output { $_[1] =~ tr/\01/ /; print { $_[0]->output_handle } $_[1] }
+
+# Output a block of code (something that isn't part of the POD text).  Called
+# by preprocess_paragraph only if we were given the code option.  Exists here
+# only so that it can be overridden by subclasses.
+sub output_code { $_[0]->output ($_[1]) }
+
+
+##############################################################################
+# Backwards compatibility
+##############################################################################
+
+# The old Pod::Text module did everything in a pod2text() function.  This
+# tries to provide the same interface for legacy applications.
+sub pod2text {
+    my @args;
+
+    # This is really ugly; I hate doing option parsing in the middle of a
+    # module.  But the old Pod::Text module supported passing flags to its
+    # entry function, so handle -a and -<number>.
+    while ($_[0] =~ /^-/) {
+        my $flag = shift;
+        if    ($flag eq '-a')       { push (@args, alt => 1)    }
+        elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) }
+        else {
+            unshift (@_, $flag);
+            last;
+        }
+    }
+
+    # Now that we know what arguments we're using, create the parser.
+    my $parser = Pod::Text->new (@args);
+
+    # If two arguments were given, the second argument is going to be a file
+    # handle.  That means we want to call parse_from_filehandle(), which means
+    # we need to turn the first argument into a file handle.  Magic open will
+    # handle the <&STDIN case automagically.
+    if (defined $_[1]) {
+        my @fhs = @_;
+        local *IN;
+        unless (open (IN, $fhs[0])) {
+            croak ("Can't open $fhs[0] for reading: $!\n");
+            return;
+        }
+        $fhs[0] = \*IN;
+        return $parser->parse_from_filehandle (@fhs);
+    } else {
+        return $parser->parse_from_file (@_);
+    }
+}
+
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Text - Convert POD data to formatted ASCII text
+
+=head1 SYNOPSIS
+
+    use Pod::Text;
+    my $parser = Pod::Text->new (sentence => 0, width => 78);
+
+    # Read POD from STDIN and write to STDOUT.
+    $parser->parse_from_filehandle;
+
+    # Read POD from file.pod and write to file.txt.
+    $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text is a module that can convert documentation in the POD format (the
+preferred language for documenting Perl) into formatted ASCII.  It uses no
+special formatting controls or codes whatsoever, and its output is therefore
+suitable for nearly any device.
+
+As a derived class from Pod::Parser, Pod::Text supports the same methods and
+interfaces.  See L<Pod::Parser> for all the details; briefly, one creates a
+new parser with C<< Pod::Text->new() >> and then calls either
+parse_from_filehandle() or parse_from_file().
+
+new() can take options, in the form of key/value pairs, that control the
+behavior of the parser.  The currently recognized options are:
+
+=over 4
+
+=item alt
+
+If set to a true value, selects an alternate output format that, among other
+things, uses a different heading style and marks C<=item> entries with a
+colon in the left margin.  Defaults to false.
+
+=item code
+
+If set to a true value, the non-POD parts of the input file will be included
+in the output.  Useful for viewing code documented with POD blocks with the
+POD rendered and the code left intact.
+
+=item indent
+
+The number of spaces to indent regular text, and the default indentation for
+C<=over> blocks.  Defaults to 4.
+
+=item loose
+
+If set to a true value, a blank line is printed after a C<=head1> heading.
+If set to false (the default), no blank line is printed after C<=head1>,
+although one is still printed after C<=head2>.  This is the default because
+it's the expected formatting for manual pages; if you're formatting
+arbitrary text documents, setting this to true may result in more pleasing
+output.
+
+=item margin
+
+The width of the left margin in spaces.  Defaults to 0.  This is the margin
+for all text, including headings, not the amount by which regular text is
+indented; for the latter, see the I<indent> option.  To set the right
+margin, see the I<width> option.
+
+=item quotes
+
+Sets the quote marks used to surround CE<lt>> text.  If the value is a
+single character, it is used as both the left and right quote; if it is two
+characters, the first character is used as the left quote and the second as
+the right quoted; and if it is four characters, the first two are used as
+the left quote and the second two as the right quote.
+
+This may also be set to the special value C<none>, in which case no quote
+marks are added around CE<lt>> text.
+
+=item sentence
+
+If set to a true value, Pod::Text will assume that each sentence ends in two
+spaces, and will try to preserve that spacing.  If set to false, all
+consecutive whitespace in non-verbatim paragraphs is compressed into a
+single space.  Defaults to true.
+
+=item width
+
+The column at which to wrap text on the right-hand side.  Defaults to 76.
+
+=back
+
+The standard Pod::Parser method parse_from_filehandle() takes up to two
+arguments, the first being the file handle to read POD from and the second
+being the file handle to write the formatted output to.  The first defaults
+to STDIN if not given, and the second defaults to STDOUT.  The method
+parse_from_file() is almost identical, except that its two arguments are the
+input and output disk files instead.  See L<Pod::Parser> for the specific
+details.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Bizarre space in item
+
+=item Item called without tag
+
+(W) Something has gone wrong in internal C<=item> processing.  These
+messages indicate a bug in Pod::Text; you should never see them.
+
+=item Can't open %s for reading: %s
+
+(F) Pod::Text was invoked via the compatibility mode pod2text() interface
+and the input file it was given could not be opened.
+
+=item Invalid quote specification "%s"
+
+(F) The quote specification given (the quotes option to the constructor) was
+invalid.  A quote specification must be one, two, or four characters long.
+
+=item %s:%d: Unknown command paragraph: %s
+
+(W) The POD source contained a non-standard command paragraph (something of
+the form C<=command args>) that Pod::Man didn't know about.  It was ignored.
+
+=item %s:%d: Unknown escape: %s
+
+(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::Text didn't
+know about.
+
+=item %s:%d: Unknown formatting code: %s
+
+(W) The POD source contained a non-standard formatting code (something of
+the form C<XE<lt>E<gt>>) that Pod::Text didn't know about.
+
+=item %s:%d: Unmatched =back
+
+(W) Pod::Text encountered a C<=back> command that didn't correspond to an
+C<=over> command.
+
+=back
+
+=head1 RESTRICTIONS
+
+Embedded Ctrl-As (octal 001) in the input will be mapped to spaces on
+output, due to an internal implementation detail.
+
+=head1 NOTES
+
+This is a replacement for an earlier Pod::Text module written by Tom
+Christiansen.  It has a revamped interface, since it now uses Pod::Parser,
+but an interface roughly compatible with the old Pod::Text::pod2text()
+function is still available.  Please change to the new calling convention,
+though.
+
+The original Pod::Text contained code to do formatting via termcap
+sequences, although it wasn't turned on by default and it was problematic to
+get it to work at all.  This rewrite doesn't even try to do that, but a
+subclass of it does.  Look for L<Pod::Text::Termcap>.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<Pod::Text::Termcap>, L<pod2text(1)>
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>, based I<very> heavily on the original
+Pod::Text by Tom Christiansen <tchrist@mox.perl.com> and its conversion to
+Pod::Parser by Brad Appleton <bradapp@enteract.com>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1999, 2000, 2001, 2002 by Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Text/Color.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Text/Color.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Text/Color.pm	(revision 14489)
@@ -0,0 +1,145 @@
+# Pod::Text::Color -- Convert POD data to formatted color ASCII text
+# $Id: Color.pm,v 1.4 2002/07/15 05:46:00 eagle Exp $
+#
+# Copyright 1999, 2001 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This is just a basic proof of concept.  It should later be modified to make
+# better use of color, take options changing what colors are used for what
+# text, and the like.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::Text::Color;
+
+require 5.004;
+
+use Pod::Text ();
+use Term::ANSIColor qw(colored);
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+@ISA = qw(Pod::Text);
+
+# Don't use the CVS revision as the version, since this module is also in Perl
+# core and too many things could munge CVS magic revision strings.  This
+# number should ideally be the same as the CVS revision in podlators, however.
+$VERSION = 1.04;
+
+
+##############################################################################
+# Overrides
+##############################################################################
+
+# Make level one headings bold.
+sub cmd_head1 {
+    my $self = shift;
+    local $_ = shift;
+    s/\s+$//;
+    $self->SUPER::cmd_head1 (colored ($_, 'bold'));
+}
+
+# Make level two headings bold.
+sub cmd_head2 {
+    my $self = shift;
+    local $_ = shift;
+    s/\s+$//;
+    $self->SUPER::cmd_head2 (colored ($_, 'bold'));
+}
+
+# Fix the various formatting codes.
+sub seq_b { return colored ($_[1], 'bold')   }
+sub seq_f { return colored ($_[1], 'cyan')   }
+sub seq_i { return colored ($_[1], 'yellow') }
+
+# Output any included code in green.
+sub output_code {
+    my ($self, $code) = @_;
+    $code = colored ($code, 'green');
+    $self->output ($code);
+}
+
+# We unfortunately have to override the wrapping code here, since the normal
+# wrapping code gets really confused by all the escape sequences.
+sub wrap {
+    my $self = shift;
+    local $_ = shift;
+    my $output = '';
+    my $spaces = ' ' x $$self{MARGIN};
+    my $width = $$self{width} - $$self{MARGIN};
+    while (length > $width) {
+        if (s/^((?:(?:\e\[[\d;]+m)?[^\n]){0,$width})\s+//
+            || s/^((?:(?:\e\[[\d;]+m)?[^\n]){$width})//) {
+            $output .= $spaces . $1 . "\n";
+        } else {
+            last;
+        }
+    }
+    $output .= $spaces . $_;
+    $output =~ s/\s+$/\n\n/;
+    $output;
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Text::Color - Convert POD data to formatted color ASCII text
+
+=head1 SYNOPSIS
+
+    use Pod::Text::Color;
+    my $parser = Pod::Text::Color->new (sentence => 0, width => 78);
+
+    # Read POD from STDIN and write to STDOUT.
+    $parser->parse_from_filehandle;
+
+    # Read POD from file.pod and write to file.txt.
+    $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text::Color is a simple subclass of Pod::Text that highlights output
+text using ANSI color escape sequences.  Apart from the color, it in all
+ways functions like Pod::Text.  See L<Pod::Text> for details and available
+options.
+
+Term::ANSIColor is used to get colors and therefore must be installed to use
+this module.
+
+=head1 BUGS
+
+This is just a basic proof of concept.  It should be seriously expanded to
+support configurable coloration via options passed to the constructor, and
+B<pod2text> should be taught about those.
+
+=head1 SEE ALSO
+
+L<Pod::Text>, L<Pod::Parser>
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1999, 2001 by Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Text/Overstrike.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Text/Overstrike.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Text/Overstrike.pm	(revision 14489)
@@ -0,0 +1,208 @@
+# Pod::Text::Overstrike -- Convert POD data to formatted overstrike text
+# $Id: Overstrike.pm,v 1.10 2002/08/04 03:35:01 eagle Exp $
+#
+# Created by Joe Smith <Joe.Smith@inwap.com> 30-Nov-2000
+#   (based on Pod::Text::Color by Russ Allbery <rra@stanford.edu>)
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This was written because the output from:
+#
+#     pod2text Text.pm > plain.txt; less plain.txt
+#
+# is not as rich as the output from
+#
+#     pod2man Text.pm | nroff -man > fancy.txt; less fancy.txt
+#
+# and because both Pod::Text::Color and Pod::Text::Termcap are not device
+# independent.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::Text::Overstrike;
+
+require 5.004;
+
+use Pod::Text ();
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+@ISA = qw(Pod::Text);
+
+# Don't use the CVS revision as the version, since this module is also in Perl
+# core and too many things could munge CVS magic revision strings.  This
+# number should ideally be the same as the CVS revision in podlators, however.
+$VERSION = 1.10;
+
+
+##############################################################################
+# Overrides
+##############################################################################
+
+# Make level one headings bold, overridding any existing formatting.
+sub cmd_head1 {
+    my ($self, $text, $line) = @_;
+    $text =~ s/\s+$//;
+    $text = $self->strip_format ($self->interpolate ($text, $line));
+    $text =~ s/(.)/$1\b$1/g;
+    $self->SUPER::cmd_head1 ($text);
+}
+
+# Make level two headings bold, overriding any existing formatting.
+sub cmd_head2 {
+    my ($self, $text, $line) = @_;
+    $text =~ s/\s+$//;
+    $text = $self->strip_format ($self->interpolate ($text, $line));
+    $text =~ s/(.)/$1\b$1/g;
+    $self->SUPER::cmd_head2 ($text);
+}
+
+# Make level three headings underscored, overriding any existing formatting.
+sub cmd_head3 {
+    my ($self, $text, $line) = @_;
+    $text =~ s/\s+$//;
+    $text = $self->strip_format ($self->interpolate ($text, $line));
+    $text =~ s/(.)/_\b$1/g;
+    $self->SUPER::cmd_head3 ($text);
+}
+
+# Level four headings look like level three headings.
+sub cmd_head4 {
+    my ($self, $text, $line) = @_;
+    $text =~ s/\s+$//;
+    $text = $self->strip_format ($self->interpolate ($text, $line));
+    $text =~ s/(.)/_\b$1/g;
+    $self->SUPER::cmd_head4 ($text);
+}
+
+# The common code for handling all headers.  We have to override to avoid
+# interpolating twice and because we don't want to honor alt.
+sub heading {
+    my ($self, $text, $line, $indent, $marker) = @_;
+    $self->item ("\n\n") if defined $$self{ITEM};
+    $text .= "\n" if $$self{loose};
+    my $margin = ' ' x ($$self{margin} + $indent);
+    $self->output ($margin . $text . "\n");
+}
+
+# Fix the various formatting codes.
+sub seq_b { local $_ = strip_format (@_); s/(.)/$1\b$1/g; $_ }
+sub seq_f { local $_ = strip_format (@_); s/(.)/_\b$1/g; $_ }
+sub seq_i { local $_ = strip_format (@_); s/(.)/_\b$1/g; $_ }
+
+# Output any included code in bold.
+sub output_code {
+    my ($self, $code) = @_;
+    $code =~ s/(.)/$1\b$1/g;
+    $self->output ($code);
+}
+
+# We unfortunately have to override the wrapping code here, since the normal
+# wrapping code gets really confused by all the backspaces.
+sub wrap {
+    my $self = shift;
+    local $_ = shift;
+    my $output = '';
+    my $spaces = ' ' x $$self{MARGIN};
+    my $width = $$self{width} - $$self{MARGIN};
+    while (length > $width) {
+        # This regex represents a single character, that's possibly underlined
+        # or in bold (in which case, it's three characters; the character, a
+        # backspace, and a character).  Use [^\n] rather than . to protect
+        # against odd settings of $*.
+        my $char = '(?:[^\n][\b])?[^\n]';
+        if (s/^((?>$char){0,$width})(?:\Z|\s+)//) {
+            $output .= $spaces . $1 . "\n";
+        } else {
+            last;
+        }
+    }
+    $output .= $spaces . $_;
+    $output =~ s/\s+$/\n\n/;
+    $output;
+}
+
+##############################################################################
+# Utility functions
+##############################################################################
+
+# Strip all of the formatting from a provided string, returning the stripped
+# version.
+sub strip_format {
+    my ($self, $text) = @_;
+    $text =~ s/(.)[\b]\1/$1/g;
+    $text =~ s/_[\b]//g;
+    return $text;
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Text::Overstrike - Convert POD data to formatted overstrike text
+
+=head1 SYNOPSIS
+
+    use Pod::Text::Overstrike;
+    my $parser = Pod::Text::Overstrike->new (sentence => 0, width => 78);
+
+    # Read POD from STDIN and write to STDOUT.
+    $parser->parse_from_filehandle;
+
+    # Read POD from file.pod and write to file.txt.
+    $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text::Overstrike is a simple subclass of Pod::Text that highlights
+output text using overstrike sequences, in a manner similar to nroff.
+Characters in bold text are overstruck (character, backspace, character) and
+characters in underlined text are converted to overstruck underscores
+(underscore, backspace, character).  This format was originally designed for
+hardcopy terminals and/or lineprinters, yet is readable on softcopy (CRT)
+terminals.
+
+Overstruck text is best viewed by page-at-a-time programs that take
+advantage of the terminal's B<stand-out> and I<underline> capabilities, such
+as the less program on Unix.
+
+Apart from the overstrike, it in all ways functions like Pod::Text.  See
+L<Pod::Text> for details and available options.
+
+=head1 BUGS
+
+Currently, the outermost formatting instruction wins, so for example
+underlined text inside a region of bold text is displayed as simply bold.
+There may be some better approach possible.
+
+=head1 SEE ALSO
+
+L<Pod::Text>, L<Pod::Parser>
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Joe Smith <Joe.Smith@inwap.com>, using the framework created by Russ Allbery
+<rra@stanford.edu>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2000 by Joe Smith <Joe.Smith@inwap.com>.
+Copyright 2001 by Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Text/Termcap.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Text/Termcap.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Text/Termcap.pm	(revision 14489)
@@ -0,0 +1,180 @@
+# Pod::Text::Termcap -- Convert POD data to ASCII text with format escapes.
+# $Id: Termcap.pm,v 1.11 2003/07/09 21:52:30 eagle Exp $
+#
+# Copyright 1999, 2001, 2002 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This is a simple subclass of Pod::Text that overrides a few key methods to
+# output the right termcap escape sequences for formatted text on the current
+# terminal type.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::Text::Termcap;
+
+require 5.004;
+
+use Pod::Text ();
+use POSIX ();
+use Term::Cap;
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+@ISA = qw(Pod::Text);
+
+# Don't use the CVS revision as the version, since this module is also in Perl
+# core and too many things could munge CVS magic revision strings.  This
+# number should ideally be the same as the CVS revision in podlators, however.
+$VERSION = 1.11;
+
+
+##############################################################################
+# Overrides
+##############################################################################
+
+# In the initialization method, grab our terminal characteristics as well as
+# do all the stuff we normally do.
+sub initialize {
+    my $self = shift;
+    my ($ospeed, $term, $termios);
+
+    # $ENV{HOME} is usually not set on Windows.  The default Term::Cap path
+    # may not work on Solaris.
+    my $home = exists $ENV{HOME} ? "$ENV{HOME}/.termcap:" : '';
+    $ENV{TERMPATH} = $home . '/etc/termcap:/usr/share/misc/termcap'
+                           . ':/usr/share/lib/termcap';
+
+    # Fall back on a hard-coded terminal speed if POSIX::Termios isn't
+    # available (such as on VMS).
+    eval { $termios = POSIX::Termios->new };
+    if ($@) {
+        $ospeed = 9600;
+    } else {
+        $termios->getattr;
+        $ospeed = $termios->getospeed || 9600;
+    }
+
+    # Fall back on the ANSI escape sequences if Term::Cap doesn't work.
+    eval { $term = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed } };
+    $$self{BOLD} = $$term{_md} || "\e[1m";
+    $$self{UNDL} = $$term{_us} || "\e[4m";
+    $$self{NORM} = $$term{_me} || "\e[m";
+
+    unless (defined $$self{width}) {
+        $$self{width} = $ENV{COLUMNS} || $$term{_co} || 80;
+        $$self{width} -= 2;
+    }
+
+    $self->SUPER::initialize;
+}
+
+# Make level one headings bold.
+sub cmd_head1 {
+    my $self = shift;
+    local $_ = shift;
+    s/\s+$//;
+    $self->SUPER::cmd_head1 ("$$self{BOLD}$_$$self{NORM}");
+}
+
+# Make level two headings bold.
+sub cmd_head2 {
+    my $self = shift;
+    local $_ = shift;
+    s/\s+$//;
+    $self->SUPER::cmd_head2 ("$$self{BOLD}$_$$self{NORM}");
+}
+
+# Fix up B<> and I<>.  Note that we intentionally don't do F<>.
+sub seq_b { my $self = shift; return "$$self{BOLD}$_[0]$$self{NORM}" }
+sub seq_i { my $self = shift; return "$$self{UNDL}$_[0]$$self{NORM}" }
+
+# Output any included code in bold.
+sub output_code {
+    my ($self, $code) = @_;
+    $self->output ($$self{BOLD} . $code . $$self{NORM});
+}
+
+# Override the wrapping code to igore the special sequences.
+sub wrap {
+    my $self = shift;
+    local $_ = shift;
+    my $output = '';
+    my $spaces = ' ' x $$self{MARGIN};
+    my $width = $$self{width} - $$self{MARGIN};
+    my $code = "(?:\Q$$self{BOLD}\E|\Q$$self{UNDL}\E|\Q$$self{NORM}\E)";
+    while (length > $width) {
+        if (s/^((?:$code?[^\n]){0,$width})\s+//
+            || s/^((?:$code?[^\n]){$width})//) {
+            $output .= $spaces . $1 . "\n";
+        } else {
+            last;
+        }
+    }
+    $output .= $spaces . $_;
+    $output =~ s/\s+$/\n\n/;
+    $output;
+}
+
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Text::Termcap - Convert POD data to ASCII text with format escapes
+
+=head1 SYNOPSIS
+
+    use Pod::Text::Termcap;
+    my $parser = Pod::Text::Termcap->new (sentence => 0, width => 78);
+
+    # Read POD from STDIN and write to STDOUT.
+    $parser->parse_from_filehandle;
+
+    # Read POD from file.pod and write to file.txt.
+    $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text::Termcap is a simple subclass of Pod::Text that highlights output
+text using the correct termcap escape sequences for the current terminal.
+Apart from the format codes, it in all ways functions like Pod::Text.  See
+L<Pod::Text> for details and available options.
+
+=head1 NOTES
+
+This module uses Term::Cap to retrieve the formatting escape sequences for
+the current terminal, and falls back on the ECMA-48 (the same in this
+regard as ANSI X3.64 and ISO 6429, the escape codes also used by DEC VT100
+terminals) if the bold, underline, and reset codes aren't set in the
+termcap information.
+
+=head1 SEE ALSO
+
+L<Pod::Text>, L<Pod::Parser>, L<Term::Cap>
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1999, 2001, 2002 by Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/Usage.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/Usage.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/Usage.pm	(revision 14489)
@@ -0,0 +1,659 @@
+#############################################################################
+# Pod/Usage.pm -- print usage messages for the running script.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Usage;
+
+use vars qw($VERSION);
+$VERSION = 1.33;  ## Current version of this package
+require  5.005;    ## requires this Perl version or later
+
+=head1 NAME
+
+Pod::Usage, pod2usage() - print a usage message from embedded pod documentation
+
+=head1 SYNOPSIS
+
+  use Pod::Usage
+
+  my $message_text  = "This text precedes the usage message.";
+  my $exit_status   = 2;          ## The exit status to use
+  my $verbose_level = 0;          ## The verbose level to use
+  my $filehandle    = \*STDERR;   ## The filehandle to write to
+
+  pod2usage($message_text);
+
+  pod2usage($exit_status);
+
+  pod2usage( { -message => $message_text ,
+               -exitval => $exit_status  ,  
+               -verbose => $verbose_level,  
+               -output  => $filehandle } );
+
+  pod2usage(   -msg     => $message_text ,
+               -exitval => $exit_status  ,  
+               -verbose => $verbose_level,  
+               -output  => $filehandle   );
+
+  pod2usage(   -verbose => 2,
+               -noperldoc => 1  )
+
+=head1 ARGUMENTS
+
+B<pod2usage> should be given either a single argument, or a list of
+arguments corresponding to an associative array (a "hash"). When a single
+argument is given, it should correspond to exactly one of the following:
+
+=over 4
+
+=item *
+
+A string containing the text of a message to print I<before> printing
+the usage message
+
+=item *
+
+A numeric value corresponding to the desired exit status
+
+=item *
+
+A reference to a hash
+
+=back
+
+If more than one argument is given then the entire argument list is
+assumed to be a hash.  If a hash is supplied (either as a reference or
+as a list) it should contain one or more elements with the following
+keys:
+
+=over 4
+
+=item C<-message>
+
+=item C<-msg>
+
+The text of a message to print immediately prior to printing the
+program's usage message. 
+
+=item C<-exitval>
+
+The desired exit status to pass to the B<exit()> function.
+This should be an integer, or else the string "NOEXIT" to
+indicate that control should simply be returned without
+terminating the invoking process.
+
+=item C<-verbose>
+
+The desired level of "verboseness" to use when printing the usage
+message. If the corresponding value is 0, then only the "SYNOPSIS"
+section of the pod documentation is printed. If the corresponding value
+is 1, then the "SYNOPSIS" section, along with any section entitled
+"OPTIONS", "ARGUMENTS", or "OPTIONS AND ARGUMENTS" is printed.  If the
+corresponding value is 2 or more then the entire manpage is printed.
+
+The special verbosity level 99 requires to also specify the -section
+parameter; then these sections are extracted (see L<Pod::Select>)
+and printed.
+
+=item C<-section>
+
+A string representing a selection list for sections to be printed
+when -verbose is set to 99, e.g. C<"NAME|SYNOPSIS|DESCRIPTION|VERSION">.
+
+=item C<-output>
+
+A reference to a filehandle, or the pathname of a file to which the
+usage message should be written. The default is C<\*STDERR> unless the
+exit value is less than 2 (in which case the default is C<\*STDOUT>).
+
+=item C<-input>
+
+A reference to a filehandle, or the pathname of a file from which the
+invoking script's pod documentation should be read.  It defaults to the
+file indicated by C<$0> (C<$PROGRAM_NAME> for users of F<English.pm>).
+
+=item C<-pathlist>
+
+A list of directory paths. If the input file does not exist, then it
+will be searched for in the given directory list (in the order the
+directories appear in the list). It defaults to the list of directories
+implied by C<$ENV{PATH}>. The list may be specified either by a reference
+to an array, or by a string of directory paths which use the same path
+separator as C<$ENV{PATH}> on your system (e.g., C<:> for Unix, C<;> for
+MSWin32 and DOS).
+
+=item C<-noperldoc>
+
+By default, Pod::Usage will call L<perldoc> when -verbose >= 2 is
+specified. This does not work well e.g. if the script was packed
+with L<PAR>. The -noperldoc option suppresses the external call to
+L<perldoc> and uses the simple text formatter (L<Pod::Text>) to 
+output the POD.
+
+=back
+
+=head1 DESCRIPTION
+
+B<pod2usage> will print a usage message for the invoking script (using
+its embedded pod documentation) and then exit the script with the
+desired exit status. The usage message printed may have any one of three
+levels of "verboseness": If the verbose level is 0, then only a synopsis
+is printed. If the verbose level is 1, then the synopsis is printed
+along with a description (if present) of the command line options and
+arguments. If the verbose level is 2, then the entire manual page is
+printed.
+
+Unless they are explicitly specified, the default values for the exit
+status, verbose level, and output stream to use are determined as
+follows:
+
+=over 4
+
+=item *
+
+If neither the exit status nor the verbose level is specified, then the
+default is to use an exit status of 2 with a verbose level of 0.
+
+=item *
+
+If an exit status I<is> specified but the verbose level is I<not>, then the
+verbose level will default to 1 if the exit status is less than 2 and
+will default to 0 otherwise.
+
+=item *
+
+If an exit status is I<not> specified but verbose level I<is> given, then
+the exit status will default to 2 if the verbose level is 0 and will
+default to 1 otherwise.
+
+=item *
+
+If the exit status used is less than 2, then output is printed on
+C<STDOUT>.  Otherwise output is printed on C<STDERR>.
+
+=back
+
+Although the above may seem a bit confusing at first, it generally does
+"the right thing" in most situations.  This determination of the default
+values to use is based upon the following typical Unix conventions:
+
+=over 4
+
+=item *
+
+An exit status of 0 implies "success". For example, B<diff(1)> exits
+with a status of 0 if the two files have the same contents.
+
+=item *
+
+An exit status of 1 implies possibly abnormal, but non-defective, program
+termination.  For example, B<grep(1)> exits with a status of 1 if
+it did I<not> find a matching line for the given regular expression.
+
+=item *
+
+An exit status of 2 or more implies a fatal error. For example, B<ls(1)>
+exits with a status of 2 if you specify an illegal (unknown) option on
+the command line.
+
+=item *
+
+Usage messages issued as a result of bad command-line syntax should go
+to C<STDERR>.  However, usage messages issued due to an explicit request
+to print usage (like specifying B<-help> on the command line) should go
+to C<STDOUT>, just in case the user wants to pipe the output to a pager
+(such as B<more(1)>).
+
+=item *
+
+If program usage has been explicitly requested by the user, it is often
+desireable to exit with a status of 1 (as opposed to 0) after issuing
+the user-requested usage message.  It is also desireable to give a
+more verbose description of program usage in this case.
+
+=back
+
+B<pod2usage> doesn't force the above conventions upon you, but it will
+use them by default if you don't expressly tell it to do otherwise.  The
+ability of B<pod2usage()> to accept a single number or a string makes it
+convenient to use as an innocent looking error message handling function:
+
+    use Pod::Usage;
+    use Getopt::Long;
+
+    ## Parse options
+    GetOptions("help", "man", "flag1")  ||  pod2usage(2);
+    pod2usage(1)  if ($opt_help);
+    pod2usage(-verbose => 2)  if ($opt_man);
+
+    ## Check for too many filenames
+    pod2usage("$0: Too many files given.\n")  if (@ARGV > 1);
+
+Some user's however may feel that the above "economy of expression" is
+not particularly readable nor consistent and may instead choose to do
+something more like the following:
+
+    use Pod::Usage;
+    use Getopt::Long;
+
+    ## Parse options
+    GetOptions("help", "man", "flag1")  ||  pod2usage(-verbose => 0);
+    pod2usage(-verbose => 1)  if ($opt_help);
+    pod2usage(-verbose => 2)  if ($opt_man);
+
+    ## Check for too many filenames
+    pod2usage(-verbose => 2, -message => "$0: Too many files given.\n")
+        if (@ARGV > 1);
+
+As with all things in Perl, I<there's more than one way to do it>, and
+B<pod2usage()> adheres to this philosophy.  If you are interested in
+seeing a number of different ways to invoke B<pod2usage> (although by no
+means exhaustive), please refer to L<"EXAMPLES">.
+
+=head1 EXAMPLES
+
+Each of the following invocations of C<pod2usage()> will print just the
+"SYNOPSIS" section to C<STDERR> and will exit with a status of 2:
+
+    pod2usage();
+
+    pod2usage(2);
+
+    pod2usage(-verbose => 0);
+
+    pod2usage(-exitval => 2);
+
+    pod2usage({-exitval => 2, -output => \*STDERR});
+
+    pod2usage({-verbose => 0, -output  => \*STDERR});
+
+    pod2usage(-exitval => 2, -verbose => 0);
+
+    pod2usage(-exitval => 2, -verbose => 0, -output => \*STDERR);
+
+Each of the following invocations of C<pod2usage()> will print a message
+of "Syntax error." (followed by a newline) to C<STDERR>, immediately
+followed by just the "SYNOPSIS" section (also printed to C<STDERR>) and
+will exit with a status of 2:
+
+    pod2usage("Syntax error.");
+
+    pod2usage(-message => "Syntax error.", -verbose => 0);
+
+    pod2usage(-msg  => "Syntax error.", -exitval => 2);
+
+    pod2usage({-msg => "Syntax error.", -exitval => 2, -output => \*STDERR});
+
+    pod2usage({-msg => "Syntax error.", -verbose => 0, -output => \*STDERR});
+
+    pod2usage(-msg  => "Syntax error.", -exitval => 2, -verbose => 0);
+
+    pod2usage(-message => "Syntax error.",
+              -exitval => 2,
+              -verbose => 0,
+              -output  => \*STDERR);
+
+Each of the following invocations of C<pod2usage()> will print the
+"SYNOPSIS" section and any "OPTIONS" and/or "ARGUMENTS" sections to
+C<STDOUT> and will exit with a status of 1:
+
+    pod2usage(1);
+
+    pod2usage(-verbose => 1);
+
+    pod2usage(-exitval => 1);
+
+    pod2usage({-exitval => 1, -output => \*STDOUT});
+
+    pod2usage({-verbose => 1, -output => \*STDOUT});
+
+    pod2usage(-exitval => 1, -verbose => 1);
+
+    pod2usage(-exitval => 1, -verbose => 1, -output => \*STDOUT});
+
+Each of the following invocations of C<pod2usage()> will print the
+entire manual page to C<STDOUT> and will exit with a status of 1:
+
+    pod2usage(-verbose  => 2);
+
+    pod2usage({-verbose => 2, -output => \*STDOUT});
+
+    pod2usage(-exitval  => 1, -verbose => 2);
+
+    pod2usage({-exitval => 1, -verbose => 2, -output => \*STDOUT});
+
+=head2 Recommended Use
+
+Most scripts should print some type of usage message to C<STDERR> when a
+command line syntax error is detected. They should also provide an
+option (usually C<-H> or C<-help>) to print a (possibly more verbose)
+usage message to C<STDOUT>. Some scripts may even wish to go so far as to
+provide a means of printing their complete documentation to C<STDOUT>
+(perhaps by allowing a C<-man> option). The following complete example
+uses B<Pod::Usage> in combination with B<Getopt::Long> to do all of these
+things:
+
+    use Getopt::Long;
+    use Pod::Usage;
+
+    my $man = 0;
+    my $help = 0;
+    ## Parse options and print usage if there is a syntax error,
+    ## or if usage was explicitly requested.
+    GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+    pod2usage(1) if $help;
+    pod2usage(-verbose => 2) if $man;
+
+    ## If no arguments were given, then allow STDIN to be used only
+    ## if it's not connected to a terminal (otherwise print usage)
+    pod2usage("$0: No files given.")  if ((@ARGV == 0) && (-t STDIN));
+    __END__
+
+    =head1 NAME
+
+    sample - Using GetOpt::Long and Pod::Usage
+
+    =head1 SYNOPSIS
+
+    sample [options] [file ...]
+
+     Options:
+       -help            brief help message
+       -man             full documentation
+
+    =head1 OPTIONS
+
+    =over 8
+
+    =item B<-help>
+
+    Print a brief help message and exits.
+
+    =item B<-man>
+
+    Prints the manual page and exits.
+
+    =back
+
+    =head1 DESCRIPTION
+
+    B<This program> will read the given input file(s) and do something
+    useful with the contents thereof.
+
+    =cut
+
+=head1 CAVEATS
+
+By default, B<pod2usage()> will use C<$0> as the path to the pod input
+file.  Unfortunately, not all systems on which Perl runs will set C<$0>
+properly (although if C<$0> isn't found, B<pod2usage()> will search
+C<$ENV{PATH}> or else the list specified by the C<-pathlist> option).
+If this is the case for your system, you may need to explicitly specify
+the path to the pod docs for the invoking script using something
+similar to the following:
+
+    pod2usage(-exitval => 2, -input => "/path/to/your/pod/docs");
+
+In the pathological case that a script is called via a relative path
+I<and> the script itself changes the current working directory
+(see L<perlfunc/chdir>) I<before> calling pod2usage, Pod::Usage will
+fail even on robust platforms. Don't do that.
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<Pod::Text::pod2text()> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=head1 ACKNOWLEDGEMENTS
+
+Steven McDougall E<lt>swmcd@world.std.comE<gt> for his help and patience
+with re-writing this manpage.
+
+=cut
+
+#############################################################################
+
+use strict;
+#use diagnostics;
+use Carp;
+use Config;
+use Exporter;
+use File::Spec;
+
+use vars qw(@ISA @EXPORT);
+@EXPORT = qw(&pod2usage);
+BEGIN {
+    if ( $] >= 5.005_58 ) {
+       require Pod::Text;
+       @ISA = qw( Pod::Text );
+    }
+    else {
+       require Pod::PlainText;
+       @ISA = qw( Pod::PlainText );
+    }
+}
+
+
+##---------------------------------------------------------------------------
+
+##---------------------------------
+## Function definitions begin here
+##---------------------------------
+
+sub pod2usage {
+    local($_) = shift;
+    my %opts;
+    ## Collect arguments
+    if (@_ > 0) {
+        ## Too many arguments - assume that this is a hash and
+        ## the user forgot to pass a reference to it.
+        %opts = ($_, @_);
+    }
+    elsif (!defined $_) {
+      $_ = "";
+    }
+    elsif (ref $_) {
+        ## User passed a ref to a hash
+        %opts = %{$_}  if (ref($_) eq 'HASH');
+    }
+    elsif (/^[-+]?\d+$/) {
+        ## User passed in the exit value to use
+        $opts{"-exitval"} =  $_;
+    }
+    else {
+        ## User passed in a message to print before issuing usage.
+        $_  and  $opts{"-message"} = $_;
+    }
+
+    ## Need this for backward compatibility since we formerly used
+    ## options that were all uppercase words rather than ones that
+    ## looked like Unix command-line options.
+    ## to be uppercase keywords)
+    %opts = map {
+        my $val = $opts{$_};
+        s/^(?=\w)/-/;
+        /^-msg/i   and  $_ = '-message';
+        /^-exit/i  and  $_ = '-exitval';
+        lc($_) => $val;    
+    } (keys %opts);
+
+    ## Now determine default -exitval and -verbose values to use
+    if ((! defined $opts{"-exitval"}) && (! defined $opts{"-verbose"})) {
+        $opts{"-exitval"} = 2;
+        $opts{"-verbose"} = 0;
+    }
+    elsif (! defined $opts{"-exitval"}) {
+        $opts{"-exitval"} = ($opts{"-verbose"} > 0) ? 1 : 2;
+    }
+    elsif (! defined $opts{"-verbose"}) {
+        $opts{"-verbose"} = (lc($opts{"-exitval"}) eq "noexit" ||
+                             $opts{"-exitval"} < 2);
+    }
+
+    ## Default the output file
+    $opts{"-output"} = (lc($opts{"-exitval"}) eq "noexit" ||
+                        $opts{"-exitval"} < 2) ? \*STDOUT : \*STDERR
+            unless (defined $opts{"-output"});
+    ## Default the input file
+    $opts{"-input"} = $0  unless (defined $opts{"-input"});
+
+    ## Look up input file in path if it doesnt exist.
+    unless ((ref $opts{"-input"}) || (-e $opts{"-input"})) {
+        my ($dirname, $basename) = ('', $opts{"-input"});
+        my $pathsep = ($^O =~ /^(?:dos|os2|MSWin32)$/) ? ";"
+                            : (($^O eq 'MacOS' || $^O eq 'VMS') ? ',' :  ":");
+        my $pathspec = $opts{"-pathlist"} || $ENV{PATH} || $ENV{PERL5LIB};
+
+        my @paths = (ref $pathspec) ? @$pathspec : split($pathsep, $pathspec);
+        for $dirname (@paths) {
+            $_ = File::Spec->catfile($dirname, $basename)  if length;
+            last if (-e $_) && ($opts{"-input"} = $_);
+        }
+    }
+
+    ## Now create a pod reader and constrain it to the desired sections.
+    my $parser = new Pod::Usage(USAGE_OPTIONS => \%opts);
+    if ($opts{"-verbose"} == 0) {
+        $parser->select('SYNOPSIS\s*');
+    }
+    elsif ($opts{"-verbose"} == 1) {
+        my $opt_re = '(?i)' .
+                     '(?:OPTIONS|ARGUMENTS)' .
+                     '(?:\s*(?:AND|\/)\s*(?:OPTIONS|ARGUMENTS))?';
+        $parser->select( 'SYNOPSIS', $opt_re, "DESCRIPTION/$opt_re" );
+    }
+    elsif ($opts{"-verbose"} == 99) {
+        $parser->select( $opts{"-sections"} );
+        $opts{"-verbose"} = 1;
+    }
+
+    ## Now translate the pod document and then exit with the desired status
+    if ( !$opts{"-noperldoc"}
+             and  $opts{"-verbose"} >= 2 
+             and  !ref($opts{"-input"})
+             and  $opts{"-output"} == \*STDOUT )
+    {
+       ## spit out the entire PODs. Might as well invoke perldoc
+       my $progpath = File::Spec->catfile($Config{scriptdir}, "perldoc");
+       system($progpath, $opts{"-input"});
+    }
+    else {
+       $parser->parse_from_file($opts{"-input"}, $opts{"-output"});
+    }
+
+    exit($opts{"-exitval"})  unless (lc($opts{"-exitval"}) eq 'noexit');
+}
+
+##---------------------------------------------------------------------------
+
+##-------------------------------
+## Method definitions begin here
+##-------------------------------
+
+sub new {
+    my $this = shift;
+    my $class = ref($this) || $this;
+    my %params = @_;
+    my $self = {%params};
+    bless $self, $class;
+    if ($self->can('initialize')) {
+        $self->initialize();
+    } else {
+        $self = $self->SUPER::new();
+        %$self = (%$self, %params);
+    }
+    return $self;
+}
+
+sub select {
+    my ($self, @res) = @_;
+    if ($ISA[0]->can('select')) {
+        $self->SUPER::select(@_);
+    } else {
+        $self->{USAGE_SELECT} = \@res;
+    }
+}
+
+# Override Pod::Text->seq_i to return just "arg", not "*arg*".
+sub seq_i { return $_[1] }
+
+# This overrides the Pod::Text method to do something very akin to what
+# Pod::Select did as well as the work done below by preprocess_paragraph.
+# Note that the below is very, very specific to Pod::Text.
+sub _handle_element_end {
+    my ($self, $element) = @_;
+    if ($element eq 'head1') {
+        $$self{USAGE_HEAD1} = $$self{PENDING}[-1][1];
+        $$self{PENDING}[-1][1] =~ s/^\s*SYNOPSIS\s*$/USAGE/;
+    } elsif ($element eq 'head2') {
+        $$self{USAGE_HEAD2} = $$self{PENDING}[-1][1];
+    }
+    if ($element eq 'head1' || $element eq 'head2') {
+        $$self{USAGE_SKIPPING} = 1;
+        my $heading = $$self{USAGE_HEAD1};
+        $heading .= '/' . $$self{USAGE_HEAD2} if defined $$self{USAGE_HEAD2};
+        for (@{ $$self{USAGE_SELECT} }) {
+            if ($heading =~ /^$_\s*$/) {
+                $$self{USAGE_SKIPPING} = 0;
+                last;
+            }
+        }
+
+        # Try to do some lowercasing instead of all-caps in headings, and use
+        # a colon to end all headings.
+        local $_ = $$self{PENDING}[-1][1];
+        s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge;
+        s/\s*$/:/  unless (/:\s*$/);
+        $_ .= "\n";
+        $$self{PENDING}[-1][1] = $_;
+    }
+    if ($$self{USAGE_SKIPPING}) {
+        pop @{ $$self{PENDING} };
+    } else {
+        $self->SUPER::_handle_element_end($element);
+    }
+}
+
+sub start_document {
+    my $self = shift;
+    $self->SUPER::start_document();
+    my $msg = $self->{USAGE_OPTIONS}->{-message}  or  return 1;
+    my $out_fh = $self->output_fh();
+    print $out_fh "$msg\n";
+}
+
+sub begin_pod {
+    my $self = shift;
+    $self->SUPER::begin_pod();  ## Have to call superclass
+    my $msg = $self->{USAGE_OPTIONS}->{-message}  or  return 1;
+    my $out_fh = $self->output_handle();
+    print $out_fh "$msg\n";
+}
+
+sub preprocess_paragraph {
+    my $self = shift;
+    local $_ = shift;
+    my $line = shift;
+    ## See if this is a heading and we arent printing the entire manpage.
+    if (($self->{USAGE_OPTIONS}->{-verbose} < 2) && /^=head/) {
+        ## Change the title of the SYNOPSIS section to USAGE
+        s/^=head1\s+SYNOPSIS\s*$/=head1 USAGE/;
+        ## Try to do some lowercasing instead of all-caps in headings
+        s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge;
+        ## Use a colon to end all headings
+        s/\s*$/:/  unless (/:\s*$/);
+        $_ .= "\n";
+    }
+    return  $self->SUPER::preprocess_paragraph($_);
+}
+
+1; # keep require happy
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/a2p.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/a2p.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/a2p.pod	(revision 14489)
@@ -0,0 +1,179 @@
+=head1 NAME
+
+a2p - Awk to Perl translator
+
+=head1 SYNOPSIS
+
+B<a2p> [I<options>] [I<filename>]
+
+=head1 DESCRIPTION
+
+I<A2p> takes an awk script specified on the command line (or from
+standard input) and produces a comparable I<perl> script on the
+standard output.
+
+=head2 OPTIONS
+
+Options include:
+
+=over 5
+
+=item B<-DE<lt>numberE<gt>>
+
+sets debugging flags.
+
+=item B<-FE<lt>characterE<gt>>
+
+tells a2p that this awk script is always invoked with this B<-F>
+switch.
+
+=item B<-nE<lt>fieldlistE<gt>>
+
+specifies the names of the input fields if input does not have to be
+split into an array.  If you were translating an awk script that
+processes the password file, you might say:
+
+	a2p -7 -nlogin.password.uid.gid.gcos.shell.home
+
+Any delimiter can be used to separate the field names.
+
+=item B<-E<lt>numberE<gt>>
+
+causes a2p to assume that input will always have that many fields.
+
+=item B<-o>
+
+tells a2p to use old awk behavior.  The only current differences are:
+
+=over 5
+
+=item *
+
+Old awk always has a line loop, even if there are no line
+actions, whereas new awk does not.
+
+=item *
+
+In old awk, sprintf is extremely greedy about its arguments.
+For example, given the statement
+
+	print sprintf(some_args), extra_args;
+
+old awk considers I<extra_args> to be arguments to C<sprintf>; new awk
+considers them arguments to C<print>.
+
+=back
+
+=back
+
+=head2 "Considerations"
+
+A2p cannot do as good a job translating as a human would, but it
+usually does pretty well.  There are some areas where you may want to
+examine the perl script produced and tweak it some.  Here are some of
+them, in no particular order.
+
+There is an awk idiom of putting int() around a string expression to
+force numeric interpretation, even though the argument is always
+integer anyway.  This is generally unneeded in perl, but a2p can't
+tell if the argument is always going to be integer, so it leaves it
+in.  You may wish to remove it.
+
+Perl differentiates numeric comparison from string comparison.  Awk
+has one operator for both that decides at run time which comparison to
+do.  A2p does not try to do a complete job of awk emulation at this
+point.  Instead it guesses which one you want.  It's almost always
+right, but it can be spoofed.  All such guesses are marked with the
+comment "C<#???>".  You should go through and check them.  You might
+want to run at least once with the B<-w> switch to perl, which will
+warn you if you use == where you should have used eq.
+
+Perl does not attempt to emulate the behavior of awk in which
+nonexistent array elements spring into existence simply by being
+referenced.  If somehow you are relying on this mechanism to create
+null entries for a subsequent for...in, they won't be there in perl.
+
+If a2p makes a split line that assigns to a list of variables that
+looks like (Fld1, Fld2, Fld3...) you may want to rerun a2p using the
+B<-n> option mentioned above.  This will let you name the fields
+throughout the script.  If it splits to an array instead, the script
+is probably referring to the number of fields somewhere.
+
+The exit statement in awk doesn't necessarily exit; it goes to the END
+block if there is one.  Awk scripts that do contortions within the END
+block to bypass the block under such circumstances can be simplified
+by removing the conditional in the END block and just exiting directly
+from the perl script.
+
+Perl has two kinds of array, numerically-indexed and associative.
+Perl associative arrays are called "hashes".  Awk arrays are usually
+translated to hashes, but if you happen to know that the index is
+always going to be numeric you could change the {...} to [...].
+Iteration over a hash is done using the keys() function, but iteration
+over an array is NOT.  You might need to modify any loop that iterates
+over such an array.
+
+Awk starts by assuming OFMT has the value %.6g.  Perl starts by
+assuming its equivalent, $#, to have the value %.20g.  You'll want to
+set $# explicitly if you use the default value of OFMT.
+
+Near the top of the line loop will be the split operation that is
+implicit in the awk script.  There are times when you can move this
+down past some conditionals that test the entire record so that the
+split is not done as often.
+
+For aesthetic reasons you may wish to change the array base $[ from 1
+back to perl's default of 0, but remember to change all array
+subscripts AND all substr() and index() operations to match.
+
+Cute comments that say "# Here is a workaround because awk is dumb"
+are passed through unmodified.
+
+Awk scripts are often embedded in a shell script that pipes stuff into
+and out of awk.  Often the shell script wrapper can be incorporated
+into the perl script, since perl can start up pipes into and out of
+itself, and can do other things that awk can't do by itself.
+
+Scripts that refer to the special variables RSTART and RLENGTH can
+often be simplified by referring to the variables $`, $& and $', as
+long as they are within the scope of the pattern match that sets them.
+
+The produced perl script may have subroutines defined to deal with
+awk's semantics regarding getline and print.  Since a2p usually picks
+correctness over efficiency.  it is almost always possible to rewrite
+such code to be more efficient by discarding the semantic sugar.
+
+For efficiency, you may wish to remove the keyword from any return
+statement that is the last statement executed in a subroutine.  A2p
+catches the most common case, but doesn't analyze embedded blocks for
+subtler cases.
+
+ARGV[0] translates to $ARGV0, but ARGV[n] translates to $ARGV[$n].  A
+loop that tries to iterate over ARGV[0] won't find it.
+
+=head1 ENVIRONMENT
+
+A2p uses no environment variables.
+
+=head1 AUTHOR
+
+Larry Wall E<lt>F<larry@wall.org>E<gt>
+
+=head1 FILES
+
+=head1 SEE ALSO
+
+ perl	The perl compiler/interpreter
+ 
+ s2p	sed to perl translator
+
+=head1 DIAGNOSTICS
+
+=head1 BUGS
+
+It would be possible to emulate awk's behavior in selecting string
+versus numeric operations at run time by inspection of the operands,
+but it would be gross and inefficient.  Besides, a2p almost always
+guesses right.
+
+Storage for the awk syntax tree is currently static, and can run out.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl.pod	(revision 14489)
@@ -0,0 +1,444 @@
+=head1 NAME
+
+perl - Practical Extraction and Report Language
+
+=head1 SYNOPSIS
+
+B<perl>	S<[ B<-sTtuUWX> ]>
+	S<[ B<-hv> ] [ B<-V>[:I<configvar>] ]>
+	S<[ B<-cw> ] [ B<-d>[B<t>][:I<debugger>] ] [ B<-D>[I<number/list>] ]>
+	S<[ B<-pna> ] [ B<-F>I<pattern> ] [ B<-l>[I<octal>] ] [ B<-0>[I<octal/hexadecimal>] ]>
+	S<[ B<-I>I<dir> ] [ B<-m>[B<->]I<module> ] [ B<-M>[B<->]I<'module...'> ] [ B<-f> ]>
+	S<[ B<-C [I<number/list>] >]>
+	S<[ B<-P> ]>
+	S<[ B<-S> ]>
+	S<[ B<-x>[I<dir>] ]>
+	S<[ B<-i>[I<extension>] ]>
+	S<[ B<-e> I<'command'> ] [ B<--> ] [ I<programfile> ] [ I<argument> ]...>
+
+If you're new to Perl, you should start with L<perlintro>, which is a 
+general intro for beginners and provides some background to help you
+navigate the rest of Perl's extensive documentation.
+
+For ease of access, the Perl manual has been split up into several sections.
+
+=head2 Overview
+
+    perl		Perl overview (this section)
+    perlintro		Perl introduction for beginners
+    perltoc		Perl documentation table of contents
+
+=head2 Tutorials
+
+    perlreftut		Perl references short introduction
+    perldsc		Perl data structures intro
+    perllol		Perl data structures: arrays of arrays
+
+    perlrequick 	Perl regular expressions quick start
+    perlretut		Perl regular expressions tutorial
+
+    perlboot		Perl OO tutorial for beginners
+    perltoot		Perl OO tutorial, part 1
+    perltooc		Perl OO tutorial, part 2
+    perlbot		Perl OO tricks and examples
+
+    perlstyle		Perl style guide
+
+    perlcheat		Perl cheat sheet
+    perltrap		Perl traps for the unwary
+    perldebtut		Perl debugging tutorial
+
+    perlfaq		Perl frequently asked questions
+      perlfaq1		General Questions About Perl
+      perlfaq2		Obtaining and Learning about Perl
+      perlfaq3		Programming Tools
+      perlfaq4		Data Manipulation
+      perlfaq5		Files and Formats
+      perlfaq6		Regexes
+      perlfaq7		Perl Language Issues
+      perlfaq8		System Interaction
+      perlfaq9		Networking
+
+=head2 Reference Manual
+
+    perlsyn		Perl syntax
+    perldata		Perl data structures
+    perlop		Perl operators and precedence
+    perlsub		Perl subroutines
+    perlfunc		Perl built-in functions
+      perlopentut	Perl open() tutorial
+      perlpacktut	Perl pack() and unpack() tutorial
+    perlpod		Perl plain old documentation
+    perlpodspec 	Perl plain old documentation format specification
+    perlrun		Perl execution and options
+    perldiag		Perl diagnostic messages
+    perllexwarn 	Perl warnings and their control
+    perldebug		Perl debugging
+    perlvar		Perl predefined variables
+    perlre		Perl regular expressions, the rest of the story
+    perlreref		Perl regular expressions quick reference
+    perlref		Perl references, the rest of the story
+    perlform		Perl formats
+    perlobj		Perl objects
+    perltie		Perl objects hidden behind simple variables
+      perldbmfilter	Perl DBM filters
+
+    perlipc		Perl interprocess communication
+    perlfork		Perl fork() information
+    perlnumber		Perl number semantics
+
+    perlthrtut		Perl threads tutorial
+      perlothrtut	Old Perl threads tutorial
+
+    perlport		Perl portability guide
+    perllocale		Perl locale support
+    perluniintro	Perl Unicode introduction
+    perlunicode 	Perl Unicode support
+    perlebcdic		Considerations for running Perl on EBCDIC platforms
+
+    perlsec		Perl security
+
+    perlmod		Perl modules: how they work
+    perlmodlib		Perl modules: how to write and use
+    perlmodstyle	Perl modules: how to write modules with style
+    perlmodinstall	Perl modules: how to install from CPAN
+    perlnewmod		Perl modules: preparing a new module for distribution
+
+    perlutil		utilities packaged with the Perl distribution
+
+    perlcompile 	Perl compiler suite intro
+
+    perlfilter		Perl source filters
+
+    perlglossary	Perl Glossary
+
+=head2 Internals and C Language Interface
+
+    perlembed		Perl ways to embed perl in your C or C++ application
+    perldebguts 	Perl debugging guts and tips
+    perlxstut		Perl XS tutorial
+    perlxs		Perl XS application programming interface
+    perlclib		Internal replacements for standard C library functions
+    perlguts		Perl internal functions for those doing extensions
+    perlcall		Perl calling conventions from C
+
+    perlapi		Perl API listing (autogenerated)
+    perlintern		Perl internal functions (autogenerated)
+    perliol		C API for Perl's implementation of IO in Layers
+    perlapio		Perl internal IO abstraction interface
+
+    perlhack		Perl hackers guide
+
+=head2 Miscellaneous
+
+    perlbook		Perl book information
+    perltodo		Perl things to do
+
+    perldoc		Look up Perl documentation in Pod format
+
+    perlhist		Perl history records
+    perldelta		Perl changes since previous version
+    perl587delta	Perl changes in version 5.8.7
+    perl586delta	Perl changes in version 5.8.6
+    perl585delta	Perl changes in version 5.8.5
+    perl584delta	Perl changes in version 5.8.4
+    perl583delta	Perl changes in version 5.8.3
+    perl582delta	Perl changes in version 5.8.2
+    perl581delta	Perl changes in version 5.8.1
+    perl58delta 	Perl changes in version 5.8.0
+    perl573delta	Perl changes in version 5.7.3
+    perl572delta	Perl changes in version 5.7.2
+    perl571delta	Perl changes in version 5.7.1
+    perl570delta	Perl changes in version 5.7.0
+    perl561delta	Perl changes in version 5.6.1
+    perl56delta 	Perl changes in version 5.6
+    perl5005delta	Perl changes in version 5.005
+    perl5004delta	Perl changes in version 5.004
+
+    perlartistic	Perl Artistic License
+    perlgpl		GNU General Public License
+
+=head2 Language-Specific
+
+    perlcn		Perl for Simplified Chinese (in EUC-CN)
+    perljp		Perl for Japanese (in EUC-JP)
+    perlko		Perl for Korean (in EUC-KR)
+    perltw		Perl for Traditional Chinese (in Big5)
+
+=head2 Platform-Specific
+
+    perlaix		Perl notes for AIX
+    perlamiga		Perl notes for AmigaOS
+    perlapollo		Perl notes for Apollo DomainOS
+    perlbeos		Perl notes for BeOS
+    perlbs2000		Perl notes for POSIX-BC BS2000
+    perlce		Perl notes for WinCE
+    perlcygwin		Perl notes for Cygwin
+    perldgux		Perl notes for DG/UX
+    perldos		Perl notes for DOS
+    perlepoc		Perl notes for EPOC
+    perlfreebsd 	Perl notes for FreeBSD
+    perlhpux		Perl notes for HP-UX
+    perlhurd		Perl notes for Hurd
+    perlirix		Perl notes for Irix
+    perllinux		Perl notes for Linux
+    perlmachten 	Perl notes for Power MachTen
+    perlmacos		Perl notes for Mac OS (Classic)
+    perlmacosx		Perl notes for Mac OS X
+    perlmint		Perl notes for MiNT
+    perlmpeix		Perl notes for MPE/iX
+    perlnetware 	Perl notes for NetWare
+    perlopenbsd 	Perl notes for OpenBSD
+    perlos2		Perl notes for OS/2
+    perlos390		Perl notes for OS/390
+    perlos400		Perl notes for OS/400
+    perlplan9		Perl notes for Plan 9
+    perlqnx		Perl notes for QNX
+    perlsolaris 	Perl notes for Solaris
+    perltru64		Perl notes for Tru64
+    perluts		Perl notes for UTS
+    perlvmesa		Perl notes for VM/ESA
+    perlvms		Perl notes for VMS
+    perlvos		Perl notes for Stratus VOS
+    perlwin32		Perl notes for Windows
+
+
+By default, the manpages listed above are installed in the 
+F</usr/local/man/> directory.  
+
+Extensive additional documentation for Perl modules is available.  The
+default configuration for perl will place this additional documentation
+in the F</usr/local/lib/perl5/man> directory (or else in the F<man>
+subdirectory of the Perl library directory).  Some of this additional
+documentation is distributed standard with Perl, but you'll also find
+documentation for third-party modules there.
+
+You should be able to view Perl's documentation with your man(1)
+program by including the proper directories in the appropriate start-up
+files, or in the MANPATH environment variable.  To find out where the
+configuration has installed the manpages, type:
+
+    perl -V:man.dir
+
+If the directories have a common stem, such as F</usr/local/man/man1>
+and F</usr/local/man/man3>, you need only to add that stem
+(F</usr/local/man>) to your man(1) configuration files or your MANPATH
+environment variable.  If they do not share a stem, you'll have to add
+both stems.
+
+If that doesn't work for some reason, you can still use the
+supplied F<perldoc> script to view module information.  You might
+also look into getting a replacement man program.
+
+If something strange has gone wrong with your program and you're not
+sure where you should look for help, try the B<-w> switch first.  It
+will often point out exactly where the trouble is.
+
+=head1 DESCRIPTION
+
+Perl is a language optimized for scanning arbitrary
+text files, extracting information from those text files, and printing
+reports based on that information.  It's also a good language for many
+system management tasks.  The language is intended to be practical
+(easy to use, efficient, complete) rather than beautiful (tiny,
+elegant, minimal).
+
+Perl combines (in the author's opinion, anyway) some of the best
+features of C, B<sed>, B<awk>, and B<sh>, so people familiar with
+those languages should have little difficulty with it.  (Language
+historians will also note some vestiges of B<csh>, Pascal, and even
+BASIC-PLUS.)  Expression syntax corresponds closely to C
+expression syntax.  Unlike most Unix utilities, Perl does not
+arbitrarily limit the size of your data--if you've got the memory,
+Perl can slurp in your whole file as a single string.  Recursion is of
+unlimited depth.  And the tables used by hashes (sometimes called
+"associative arrays") grow as necessary to prevent degraded
+performance.  Perl can use sophisticated pattern matching techniques to
+scan large amounts of data quickly.  Although optimized for
+scanning text, Perl can also deal with binary data, and can make dbm
+files look like hashes.  Setuid Perl scripts are safer than C programs
+through a dataflow tracing mechanism that prevents many stupid
+security holes.
+
+If you have a problem that would ordinarily use B<sed> or B<awk> or
+B<sh>, but it exceeds their capabilities or must run a little faster,
+and you don't want to write the silly thing in C, then Perl may be for
+you.  There are also translators to turn your B<sed> and B<awk>
+scripts into Perl scripts.
+
+But wait, there's more...
+
+Begun in 1993 (see L<perlhist>), Perl version 5 is nearly a complete
+rewrite that provides the following additional benefits:
+
+=over 4
+
+=item *
+
+modularity and reusability using innumerable modules 
+
+Described in L<perlmod>, L<perlmodlib>, and L<perlmodinstall>.
+
+=item *
+
+embeddable and extensible 
+
+Described in L<perlembed>, L<perlxstut>, L<perlxs>, L<perlcall>,
+L<perlguts>, and L<xsubpp>.
+
+=item *
+
+roll-your-own magic variables (including multiple simultaneous DBM
+implementations)
+
+Described in L<perltie> and L<AnyDBM_File>.
+
+=item *
+
+subroutines can now be overridden, autoloaded, and prototyped
+
+Described in L<perlsub>.
+
+=item *
+
+arbitrarily nested data structures and anonymous functions
+
+Described in L<perlreftut>, L<perlref>, L<perldsc>, and L<perllol>.
+
+=item *
+
+object-oriented programming
+
+Described in L<perlobj>, L<perlboot>, L<perltoot>, L<perltooc>,
+and L<perlbot>.
+
+=item *
+
+support for light-weight processes (threads)
+
+Described in L<perlthrtut> and L<threads>.
+
+=item *
+
+support for Unicode, internationalization, and localization
+
+Described in L<perluniintro>, L<perllocale> and L<Locale::Maketext>.
+
+=item *
+
+lexical scoping
+
+Described in L<perlsub>.
+
+=item *
+
+regular expression enhancements
+
+Described in L<perlre>, with additional examples in L<perlop>.
+
+=item *
+
+enhanced debugger and interactive Perl environment,
+with integrated editor support
+
+Described in L<perldebtut>, L<perldebug> and L<perldebguts>.
+
+=item *
+
+POSIX 1003.1 compliant library
+
+Described in L<POSIX>.
+
+=back
+
+Okay, that's I<definitely> enough hype.
+
+=head1 AVAILABILITY
+
+Perl is available for most operating systems, including virtually
+all Unix-like platforms.  See L<perlport/"Supported Platforms">
+for a listing.
+
+=head1 ENVIRONMENT
+
+See L<perlrun>.
+
+=head1 AUTHOR
+
+Larry Wall <larry@wall.org>, with the help of oodles of other folks.
+
+If your Perl success stories and testimonials may be of help to others 
+who wish to advocate the use of Perl in their applications, 
+or if you wish to simply express your gratitude to Larry and the 
+Perl developers, please write to perl-thanks@perl.org .
+
+=head1 FILES
+
+ "@INC"			locations of perl libraries
+
+=head1 SEE ALSO
+
+ a2p	awk to perl translator
+ s2p	sed to perl translator
+
+ http://www.perl.org/       the Perl homepage
+ http://www.perl.com/       Perl articles (O'Reilly)
+ http://www.cpan.org/       the Comprehensive Perl Archive
+ http://www.pm.org/         the Perl Mongers
+
+=head1 DIAGNOSTICS
+
+The C<use warnings> pragma (and the B<-w> switch) produces some 
+lovely diagnostics.
+
+See L<perldiag> for explanations of all Perl's diagnostics.  The C<use
+diagnostics> pragma automatically turns Perl's normally terse warnings
+and errors into these longer forms.
+
+Compilation errors will tell you the line number of the error, with an
+indication of the next token or token type that was to be examined.
+(In a script passed to Perl via B<-e> switches, each
+B<-e> is counted as one line.)
+
+Setuid scripts have additional constraints that can produce error
+messages such as "Insecure dependency".  See L<perlsec>.
+
+Did we mention that you should definitely consider using the B<-w>
+switch?
+
+=head1 BUGS
+
+The B<-w> switch is not mandatory.
+
+Perl is at the mercy of your machine's definitions of various
+operations such as type casting, atof(), and floating-point
+output with sprintf().
+
+If your stdio requires a seek or eof between reads and writes on a
+particular stream, so does Perl.  (This doesn't apply to sysread()
+and syswrite().)
+
+While none of the built-in data types have any arbitrary size limits
+(apart from memory size), there are still a few arbitrary limits:  a
+given variable name may not be longer than 251 characters.  Line numbers
+displayed by diagnostics are internally stored as short integers,
+so they are limited to a maximum of 65535 (higher numbers usually being
+affected by wraparound).
+
+You may mail your bug reports (be sure to include full configuration
+information as output by the myconfig program in the perl source
+tree, or by C<perl -V>) to perlbug@perl.org .  If you've succeeded
+in compiling perl, the B<perlbug> script in the F<utils/> subdirectory
+can be used to help mail in a bug report.
+
+Perl actually stands for Pathologically Eclectic Rubbish Lister, but
+don't tell anyone I said that.
+
+=head1 NOTES
+
+The Perl motto is "There's more than one way to do it."  Divining
+how many more is left as an exercise to the reader.
+
+The three principal virtues of a programmer are Laziness,
+Impatience, and Hubris.  See the Camel Book for why.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl5004delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl5004delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl5004delta.pod	(revision 14489)
@@ -0,0 +1,1612 @@
+=head1 NAME
+
+perl5004delta - what's new for perl5.004
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.003 release (as
+documented in I<Programming Perl>, second edition--the Camel Book) and
+this one.
+
+=head1 Supported Environments
+
+Perl5.004 builds out of the box on Unix, Plan 9, LynxOS, VMS, OS/2,
+QNX, AmigaOS, and Windows NT.  Perl runs on Windows 95 as well, but it
+cannot be built there, for lack of a reasonable command interpreter.
+
+=head1 Core Changes
+
+Most importantly, many bugs were fixed, including several security
+problems.  See the F<Changes> file in the distribution for details.
+
+=head2 List assignment to %ENV works
+
+C<%ENV = ()> and C<%ENV = @list> now work as expected (except on VMS
+where it generates a fatal error).
+
+=head2 Change to "Can't locate Foo.pm in @INC" error
+
+The error "Can't locate Foo.pm in @INC" now lists the contents of @INC
+for easier debugging.
+
+=head2 Compilation option: Binary compatibility with 5.003
+
+There is a new Configure question that asks if you want to maintain
+binary compatibility with Perl 5.003.  If you choose binary
+compatibility, you do not have to recompile your extensions, but you
+might have symbol conflicts if you embed Perl in another application,
+just as in the 5.003 release.  By default, binary compatibility
+is preserved at the expense of symbol table pollution.
+
+=head2 $PERL5OPT environment variable
+
+You may now put Perl options in the $PERL5OPT environment variable.
+Unless Perl is running with taint checks, it will interpret this
+variable as if its contents had appeared on a "#!perl" line at the
+beginning of your script, except that hyphens are optional.  PERL5OPT
+may only be used to set the following switches: B<-[DIMUdmw]>.
+
+=head2 Limitations on B<-M>, B<-m>, and B<-T> options
+
+The C<-M> and C<-m> options are no longer allowed on the C<#!> line of
+a script.  If a script needs a module, it should invoke it with the
+C<use> pragma.
+
+The B<-T> option is also forbidden on the C<#!> line of a script,
+unless it was present on the Perl command line.  Due to the way C<#!>
+works, this usually means that B<-T> must be in the first argument.
+Thus:
+
+    #!/usr/bin/perl -T -w
+
+will probably work for an executable script invoked as C<scriptname>,
+while:
+
+    #!/usr/bin/perl -w -T
+
+will probably fail under the same conditions.  (Non-Unix systems will
+probably not follow this rule.)  But C<perl scriptname> is guaranteed
+to fail, since then there is no chance of B<-T> being found on the
+command line before it is found on the C<#!> line.
+
+=head2 More precise warnings
+
+If you removed the B<-w> option from your Perl 5.003 scripts because it
+made Perl too verbose, we recommend that you try putting it back when
+you upgrade to Perl 5.004.  Each new perl version tends to remove some
+undesirable warnings, while adding new warnings that may catch bugs in
+your scripts.
+
+=head2 Deprecated: Inherited C<AUTOLOAD> for non-methods
+
+Before Perl 5.004, C<AUTOLOAD> functions were looked up as methods
+(using the C<@ISA> hierarchy), even when the function to be autoloaded
+was called as a plain function (e.g. C<Foo::bar()>), not a method
+(e.g. C<< Foo->bar() >> or C<< $obj->bar() >>).
+
+Perl 5.005 will use method lookup only for methods' C<AUTOLOAD>s.
+However, there is a significant base of existing code that may be using
+the old behavior.  So, as an interim step, Perl 5.004 issues an optional
+warning when a non-method uses an inherited C<AUTOLOAD>.
+
+The simple rule is:  Inheritance will not work when autoloading
+non-methods.  The simple fix for old code is:  In any module that used to
+depend on inheriting C<AUTOLOAD> for non-methods from a base class named
+C<BaseClass>, execute C<*AUTOLOAD = \&BaseClass::AUTOLOAD> during startup.
+
+=head2 Previously deprecated %OVERLOAD is no longer usable
+
+Using %OVERLOAD to define overloading was deprecated in 5.003.
+Overloading is now defined using the overload pragma. %OVERLOAD is
+still used internally but should not be used by Perl scripts. See
+L<overload> for more details.
+
+=head2 Subroutine arguments created only when they're modified
+
+In Perl 5.004, nonexistent array and hash elements used as subroutine
+parameters are brought into existence only if they are actually
+assigned to (via C<@_>).
+
+Earlier versions of Perl vary in their handling of such arguments.
+Perl versions 5.002 and 5.003 always brought them into existence.
+Perl versions 5.000 and 5.001 brought them into existence only if
+they were not the first argument (which was almost certainly a bug).
+Earlier versions of Perl never brought them into existence.
+
+For example, given this code:
+
+     undef @a; undef %a;
+     sub show { print $_[0] };
+     sub change { $_[0]++ };
+     show($a[2]);
+     change($a{b});
+
+After this code executes in Perl 5.004, $a{b} exists but $a[2] does
+not.  In Perl 5.002 and 5.003, both $a{b} and $a[2] would have existed
+(but $a[2]'s value would have been undefined).
+
+=head2 Group vector changeable with C<$)>
+
+The C<$)> special variable has always (well, in Perl 5, at least)
+reflected not only the current effective group, but also the group list
+as returned by the C<getgroups()> C function (if there is one).
+However, until this release, there has not been a way to call the
+C<setgroups()> C function from Perl.
+
+In Perl 5.004, assigning to C<$)> is exactly symmetrical with examining
+it: The first number in its string value is used as the effective gid;
+if there are any numbers after the first one, they are passed to the
+C<setgroups()> C function (if there is one).
+
+=head2 Fixed parsing of $$<digit>, &$<digit>, etc.
+
+Perl versions before 5.004 misinterpreted any type marker followed by
+"$" and a digit.  For example, "$$0" was incorrectly taken to mean
+"${$}0" instead of "${$0}".  This bug is (mostly) fixed in Perl 5.004.
+
+However, the developers of Perl 5.004 could not fix this bug completely,
+because at least two widely-used modules depend on the old meaning of
+"$$0" in a string.  So Perl 5.004 still interprets "$$<digit>" in the
+old (broken) way inside strings; but it generates this message as a
+warning.  And in Perl 5.005, this special treatment will cease.
+
+=head2 Fixed localization of $<digit>, $&, etc.
+
+Perl versions before 5.004 did not always properly localize the
+regex-related special variables.  Perl 5.004 does localize them, as
+the documentation has always said it should.  This may result in $1,
+$2, etc. no longer being set where existing programs use them.
+
+=head2 No resetting of $. on implicit close
+
+The documentation for Perl 5.0 has always stated that C<$.> is I<not>
+reset when an already-open file handle is reopened with no intervening
+call to C<close>.  Due to a bug, perl versions 5.000 through 5.003
+I<did> reset C<$.> under that circumstance; Perl 5.004 does not.
+
+=head2 C<wantarray> may return undef
+
+The C<wantarray> operator returns true if a subroutine is expected to
+return a list, and false otherwise.  In Perl 5.004, C<wantarray> can
+also return the undefined value if a subroutine's return value will
+not be used at all, which allows subroutines to avoid a time-consuming
+calculation of a return value if it isn't going to be used.
+
+=head2 C<eval EXPR> determines value of EXPR in scalar context
+
+Perl (version 5) used to determine the value of EXPR inconsistently,
+sometimes incorrectly using the surrounding context for the determination.
+Now, the value of EXPR (before being parsed by eval) is always determined in
+a scalar context.  Once parsed, it is executed as before, by providing
+the context that the scope surrounding the eval provided.  This change
+makes the behavior Perl4 compatible, besides fixing bugs resulting from
+the inconsistent behavior.  This program:
+
+    @a = qw(time now is time);
+    print eval @a;
+    print '|', scalar eval @a;
+
+used to print something like "timenowis881399109|4", but now (and in perl4)
+prints "4|4".
+
+=head2 Changes to tainting checks
+
+A bug in previous versions may have failed to detect some insecure
+conditions when taint checks are turned on.  (Taint checks are used
+in setuid or setgid scripts, or when explicitly turned on with the
+C<-T> invocation option.)  Although it's unlikely, this may cause a
+previously-working script to now fail -- which should be construed
+as a blessing, since that indicates a potentially-serious security
+hole was just plugged.
+
+The new restrictions when tainting include:
+
+=over 4
+
+=item No glob() or <*>
+
+These operators may spawn the C shell (csh), which cannot be made
+safe.  This restriction will be lifted in a future version of Perl
+when globbing is implemented without the use of an external program.
+
+=item No spawning if tainted $CDPATH, $ENV, $BASH_ENV
+
+These environment variables may alter the behavior of spawned programs
+(especially shells) in ways that subvert security.  So now they are
+treated as dangerous, in the manner of $IFS and $PATH.
+
+=item No spawning if tainted $TERM doesn't look like a terminal name
+
+Some termcap libraries do unsafe things with $TERM.  However, it would be
+unnecessarily harsh to treat all $TERM values as unsafe, since only shell
+metacharacters can cause trouble in $TERM.  So a tainted $TERM is
+considered to be safe if it contains only alphanumerics, underscores,
+dashes, and colons, and unsafe if it contains other characters (including
+whitespace).
+
+=back
+
+=head2 New Opcode module and revised Safe module
+
+A new Opcode module supports the creation, manipulation and
+application of opcode masks.  The revised Safe module has a new API
+and is implemented using the new Opcode module.  Please read the new
+Opcode and Safe documentation.
+
+=head2 Embedding improvements
+
+In older versions of Perl it was not possible to create more than one
+Perl interpreter instance inside a single process without leaking like a
+sieve and/or crashing.  The bugs that caused this behavior have all been
+fixed.  However, you still must take care when embedding Perl in a C
+program.  See the updated perlembed manpage for tips on how to manage
+your interpreters.
+
+=head2 Internal change: FileHandle class based on IO::* classes
+
+File handles are now stored internally as type IO::Handle.  The
+FileHandle module is still supported for backwards compatibility, but
+it is now merely a front end to the IO::* modules -- specifically,
+IO::Handle, IO::Seekable, and IO::File.  We suggest, but do not
+require, that you use the IO::* modules in new code.
+
+In harmony with this change, C<*GLOB{FILEHANDLE}> is now just a
+backward-compatible synonym for C<*GLOB{IO}>.
+
+=head2 Internal change: PerlIO abstraction interface
+
+It is now possible to build Perl with AT&T's sfio IO package
+instead of stdio.  See L<perlapio> for more details, and
+the F<INSTALL> file for how to use it.
+
+=head2 New and changed syntax
+
+=over 4
+
+=item $coderef->(PARAMS)
+
+A subroutine reference may now be suffixed with an arrow and a
+(possibly empty) parameter list.  This syntax denotes a call of the
+referenced subroutine, with the given parameters (if any).
+
+This new syntax follows the pattern of S<C<< $hashref->{FOO} >>> and
+S<C<< $aryref->[$foo] >>>: You may now write S<C<&$subref($foo)>> as
+S<C<< $subref->($foo) >>>.  All these arrow terms may be chained;
+thus, S<C<< &{$table->{FOO}}($bar) >>> may now be written
+S<C<< $table->{FOO}->($bar) >>>.
+
+=back
+
+=head2 New and changed builtin constants
+
+=over 4
+
+=item __PACKAGE__
+
+The current package name at compile time, or the undefined value if
+there is no current package (due to a C<package;> directive).  Like
+C<__FILE__> and C<__LINE__>, C<__PACKAGE__> does I<not> interpolate
+into strings.
+
+=back
+
+=head2 New and changed builtin variables
+
+=over 4
+
+=item $^E
+
+Extended error message on some platforms.  (Also known as
+$EXTENDED_OS_ERROR if you C<use English>).
+
+=item $^H
+
+The current set of syntax checks enabled by C<use strict>.  See the
+documentation of C<strict> for more details.  Not actually new, but
+newly documented.
+Because it is intended for internal use by Perl core components,
+there is no C<use English> long name for this variable.
+
+=item $^M
+
+By default, running out of memory it is not trappable.  However, if
+compiled for this, Perl may use the contents of C<$^M> as an emergency
+pool after die()ing with this message.  Suppose that your Perl were
+compiled with -DPERL_EMERGENCY_SBRK and used Perl's malloc.  Then
+
+    $^M = 'a' x (1<<16);
+
+would allocate a 64K buffer for use when in emergency.
+See the F<INSTALL> file for information on how to enable this option.
+As a disincentive to casual use of this advanced feature,
+there is no C<use English> long name for this variable.
+
+=back
+
+=head2 New and changed builtin functions
+
+=over 4
+
+=item delete on slices
+
+This now works.  (e.g. C<delete @ENV{'PATH', 'MANPATH'}>)
+
+=item flock
+
+is now supported on more platforms, prefers fcntl to lockf when
+emulating, and always flushes before (un)locking.
+
+=item printf and sprintf
+
+Perl now implements these functions itself; it doesn't use the C
+library function sprintf() any more, except for floating-point
+numbers, and even then only known flags are allowed.  As a result, it
+is now possible to know which conversions and flags will work, and
+what they will do.
+
+The new conversions in Perl's sprintf() are:
+
+   %i	a synonym for %d
+   %p	a pointer (the address of the Perl value, in hexadecimal)
+   %n	special: *stores* the number of characters output so far
+        into the next variable in the parameter list 
+
+The new flags that go between the C<%> and the conversion are:
+
+   #	prefix octal with "0", hex with "0x"
+   h	interpret integer as C type "short" or "unsigned short"
+   V	interpret integer as Perl's standard integer type
+
+Also, where a number would appear in the flags, an asterisk ("*") may
+be used instead, in which case Perl uses the next item in the
+parameter list as the given number (that is, as the field width or
+precision).  If a field width obtained through "*" is negative, it has
+the same effect as the '-' flag: left-justification.
+
+See L<perlfunc/sprintf> for a complete list of conversion and flags.
+
+=item keys as an lvalue
+
+As an lvalue, C<keys> allows you to increase the number of hash buckets
+allocated for the given hash.  This can gain you a measure of efficiency if
+you know the hash is going to get big.  (This is similar to pre-extending
+an array by assigning a larger number to $#array.)  If you say
+
+    keys %hash = 200;
+
+then C<%hash> will have at least 200 buckets allocated for it.  These
+buckets will be retained even if you do C<%hash = ()>; use C<undef
+%hash> if you want to free the storage while C<%hash> is still in scope.
+You can't shrink the number of buckets allocated for the hash using
+C<keys> in this way (but you needn't worry about doing this by accident,
+as trying has no effect).
+
+=item my() in Control Structures
+
+You can now use my() (with or without the parentheses) in the control
+expressions of control structures such as:
+
+    while (defined(my $line = <>)) {
+        $line = lc $line;
+    } continue {
+        print $line;
+    }
+
+    if ((my $answer = <STDIN>) =~ /^y(es)?$/i) {
+        user_agrees();
+    } elsif ($answer =~ /^n(o)?$/i) {
+        user_disagrees();
+    } else {
+        chomp $answer;
+        die "`$answer' is neither `yes' nor `no'";
+    }
+
+Also, you can declare a foreach loop control variable as lexical by
+preceding it with the word "my".  For example, in:
+
+    foreach my $i (1, 2, 3) {
+        some_function();
+    }
+
+$i is a lexical variable, and the scope of $i extends to the end of
+the loop, but not beyond it.
+
+Note that you still cannot use my() on global punctuation variables
+such as $_ and the like.
+
+=item pack() and unpack()
+
+A new format 'w' represents a BER compressed integer (as defined in
+ASN.1).  Its format is a sequence of one or more bytes, each of which
+provides seven bits of the total value, with the most significant
+first.  Bit eight of each byte is set, except for the last byte, in
+which bit eight is clear.
+
+If 'p' or 'P' are given undef as values, they now generate a NULL
+pointer.
+
+Both pack() and unpack() now fail when their templates contain invalid
+types.  (Invalid types used to be ignored.)
+
+=item sysseek()
+
+The new sysseek() operator is a variant of seek() that sets and gets the
+file's system read/write position, using the lseek(2) system call.  It is
+the only reliable way to seek before using sysread() or syswrite().  Its
+return value is the new position, or the undefined value on failure.
+
+=item use VERSION
+
+If the first argument to C<use> is a number, it is treated as a version
+number instead of a module name.  If the version of the Perl interpreter
+is less than VERSION, then an error message is printed and Perl exits
+immediately.  Because C<use> occurs at compile time, this check happens
+immediately during the compilation process, unlike C<require VERSION>,
+which waits until runtime for the check.  This is often useful if you
+need to check the current Perl version before C<use>ing library modules
+which have changed in incompatible ways from older versions of Perl.
+(We try not to do this more than we have to.)
+
+=item use Module VERSION LIST
+
+If the VERSION argument is present between Module and LIST, then the
+C<use> will call the VERSION method in class Module with the given
+version as an argument.  The default VERSION method, inherited from
+the UNIVERSAL class, croaks if the given version is larger than the
+value of the variable $Module::VERSION.  (Note that there is not a
+comma after VERSION!)
+
+This version-checking mechanism is similar to the one currently used
+in the Exporter module, but it is faster and can be used with modules
+that don't use the Exporter.  It is the recommended method for new
+code.
+
+=item prototype(FUNCTION)
+
+Returns the prototype of a function as a string (or C<undef> if the
+function has no prototype).  FUNCTION is a reference to or the name of the
+function whose prototype you want to retrieve.
+(Not actually new; just never documented before.)
+
+=item srand
+
+The default seed for C<srand>, which used to be C<time>, has been changed.
+Now it's a heady mix of difficult-to-predict system-dependent values,
+which should be sufficient for most everyday purposes.
+
+Previous to version 5.004, calling C<rand> without first calling C<srand>
+would yield the same sequence of random numbers on most or all machines.
+Now, when perl sees that you're calling C<rand> and haven't yet called
+C<srand>, it calls C<srand> with the default seed. You should still call
+C<srand> manually if your code might ever be run on a pre-5.004 system,
+of course, or if you want a seed other than the default.
+
+=item $_ as Default
+
+Functions documented in the Camel to default to $_ now in
+fact do, and all those that do are so documented in L<perlfunc>.
+
+=item C<m//gc> does not reset search position on failure
+
+The C<m//g> match iteration construct has always reset its target
+string's search position (which is visible through the C<pos> operator)
+when a match fails; as a result, the next C<m//g> match after a failure
+starts again at the beginning of the string.  With Perl 5.004, this
+reset may be disabled by adding the "c" (for "continue") modifier,
+i.e. C<m//gc>.  This feature, in conjunction with the C<\G> zero-width
+assertion, makes it possible to chain matches together.  See L<perlop>
+and L<perlre>.
+
+=item C<m//x> ignores whitespace before ?*+{}
+
+The C<m//x> construct has always been intended to ignore all unescaped
+whitespace.  However, before Perl 5.004, whitespace had the effect of
+escaping repeat modifiers like "*" or "?"; for example, C</a *b/x> was
+(mis)interpreted as C</a\*b/x>.  This bug has been fixed in 5.004.
+
+=item nested C<sub{}> closures work now
+
+Prior to the 5.004 release, nested anonymous functions didn't work
+right.  They do now.
+
+=item formats work right on changing lexicals
+
+Just like anonymous functions that contain lexical variables
+that change (like a lexical index variable for a C<foreach> loop),
+formats now work properly.  For example, this silently failed
+before (printed only zeros), but is fine now:
+
+    my $i;
+    foreach $i ( 1 .. 10 ) {
+	write;
+    }
+    format =
+	my i is @#
+	$i
+    .
+
+However, it still fails (without a warning) if the foreach is within a
+subroutine:
+
+    my $i;
+    sub foo {
+      foreach $i ( 1 .. 10 ) {
+	write;
+      }
+    }
+    foo;
+    format =
+	my i is @#
+	$i
+    .
+
+=back
+
+=head2 New builtin methods
+
+The C<UNIVERSAL> package automatically contains the following methods that
+are inherited by all other classes:
+
+=over 4
+
+=item isa(CLASS)
+
+C<isa> returns I<true> if its object is blessed into a subclass of C<CLASS>
+
+C<isa> is also exportable and can be called as a sub with two arguments. This
+allows the ability to check what a reference points to. Example:
+
+    use UNIVERSAL qw(isa);
+
+    if(isa($ref, 'ARRAY')) {
+       ...
+    }
+
+=item can(METHOD)
+
+C<can> checks to see if its object has a method called C<METHOD>,
+if it does then a reference to the sub is returned; if it does not then
+I<undef> is returned.
+
+=item VERSION( [NEED] )
+
+C<VERSION> returns the version number of the class (package).  If the
+NEED argument is given then it will check that the current version (as
+defined by the $VERSION variable in the given package) not less than
+NEED; it will die if this is not the case.  This method is normally
+called as a class method.  This method is called automatically by the
+C<VERSION> form of C<use>.
+
+    use A 1.2 qw(some imported subs);
+    # implies:
+    A->VERSION(1.2);
+
+=back
+
+B<NOTE:> C<can> directly uses Perl's internal code for method lookup, and
+C<isa> uses a very similar method and caching strategy. This may cause
+strange effects if the Perl code dynamically changes @ISA in any package.
+
+You may add other methods to the UNIVERSAL class via Perl or XS code.
+You do not need to C<use UNIVERSAL> in order to make these methods
+available to your program.  This is necessary only if you wish to
+have C<isa> available as a plain subroutine in the current package.
+
+=head2 TIEHANDLE now supported
+
+See L<perltie> for other kinds of tie()s.
+
+=over 4
+
+=item TIEHANDLE classname, LIST
+
+This is the constructor for the class.  That means it is expected to
+return an object of some sort. The reference can be used to
+hold some internal information.
+
+    sub TIEHANDLE {
+	print "<shout>\n";
+	my $i;
+	return bless \$i, shift;
+    }
+
+=item PRINT this, LIST
+
+This method will be triggered every time the tied handle is printed to.
+Beyond its self reference it also expects the list that was passed to
+the print function.
+
+    sub PRINT {
+	$r = shift;
+	$$r++;
+	return print join( $, => map {uc} @_), $\;
+    }
+
+=item PRINTF this, LIST
+
+This method will be triggered every time the tied handle is printed to
+with the C<printf()> function.
+Beyond its self reference it also expects the format and list that was
+passed to the printf function.
+
+    sub PRINTF {
+        shift;
+	  my $fmt = shift;
+        print sprintf($fmt, @_)."\n";
+    }
+
+=item READ this LIST
+
+This method will be called when the handle is read from via the C<read>
+or C<sysread> functions.
+
+    sub READ {
+	$r = shift;
+	my($buf,$len,$offset) = @_;
+	print "READ called, \$buf=$buf, \$len=$len, \$offset=$offset";
+    }
+
+=item READLINE this
+
+This method will be called when the handle is read from. The method
+should return undef when there is no more data.
+
+    sub READLINE {
+	$r = shift;
+	return "PRINT called $$r times\n"
+    }
+
+=item GETC this
+
+This method will be called when the C<getc> function is called.
+
+    sub GETC { print "Don't GETC, Get Perl"; return "a"; }
+
+=item DESTROY this
+
+As with the other types of ties, this method will be called when the
+tied handle is about to be destroyed. This is useful for debugging and
+possibly for cleaning up.
+
+    sub DESTROY {
+	print "</shout>\n";
+    }
+
+=back
+
+=head2 Malloc enhancements
+
+If perl is compiled with the malloc included with the perl distribution
+(that is, if C<perl -V:d_mymalloc> is 'define') then you can print
+memory statistics at runtime by running Perl thusly:
+
+  env PERL_DEBUG_MSTATS=2 perl your_script_here
+
+The value of 2 means to print statistics after compilation and on
+exit; with a value of 1, the statistics are printed only on exit.
+(If you want the statistics at an arbitrary time, you'll need to
+install the optional module Devel::Peek.)
+
+Three new compilation flags are recognized by malloc.c.  (They have no
+effect if perl is compiled with system malloc().)
+
+=over 4
+
+=item -DPERL_EMERGENCY_SBRK
+
+If this macro is defined, running out of memory need not be a fatal
+error: a memory pool can allocated by assigning to the special
+variable C<$^M>.  See L<"$^M">.
+
+=item -DPACK_MALLOC
+
+Perl memory allocation is by bucket with sizes close to powers of two.
+Because of these malloc overhead may be big, especially for data of
+size exactly a power of two.  If C<PACK_MALLOC> is defined, perl uses
+a slightly different algorithm for small allocations (up to 64 bytes
+long), which makes it possible to have overhead down to 1 byte for
+allocations which are powers of two (and appear quite often).
+
+Expected memory savings (with 8-byte alignment in C<alignbytes>) is
+about 20% for typical Perl usage.  Expected slowdown due to additional
+malloc overhead is in fractions of a percent (hard to measure, because
+of the effect of saved memory on speed).
+
+=item -DTWO_POT_OPTIMIZE
+
+Similarly to C<PACK_MALLOC>, this macro improves allocations of data
+with size close to a power of two; but this works for big allocations
+(starting with 16K by default).  Such allocations are typical for big
+hashes and special-purpose scripts, especially image processing.
+
+On recent systems, the fact that perl requires 2M from system for 1M
+allocation will not affect speed of execution, since the tail of such
+a chunk is not going to be touched (and thus will not require real
+memory).  However, it may result in a premature out-of-memory error.
+So if you will be manipulating very large blocks with sizes close to
+powers of two, it would be wise to define this macro.
+
+Expected saving of memory is 0-100% (100% in applications which
+require most memory in such 2**n chunks); expected slowdown is
+negligible.
+
+=back
+
+=head2 Miscellaneous efficiency enhancements
+
+Functions that have an empty prototype and that do nothing but return
+a fixed value are now inlined (e.g. C<sub PI () { 3.14159 }>).
+
+Each unique hash key is only allocated once, no matter how many hashes
+have an entry with that key.  So even if you have 100 copies of the
+same hash, the hash keys never have to be reallocated.
+
+=head1 Support for More Operating Systems
+
+Support for the following operating systems is new in Perl 5.004.
+
+=head2 Win32
+
+Perl 5.004 now includes support for building a "native" perl under
+Windows NT, using the Microsoft Visual C++ compiler (versions 2.0
+and above) or the Borland C++ compiler (versions 5.02 and above).
+The resulting perl can be used under Windows 95 (if it
+is installed in the same directory locations as it got installed
+in Windows NT).  This port includes support for perl extension
+building tools like L<MakeMaker> and L<h2xs>, so that many extensions
+available on the Comprehensive Perl Archive Network (CPAN) can now be
+readily built under Windows NT.  See http://www.perl.com/ for more
+information on CPAN and F<README.win32> in the perl distribution for more
+details on how to get started with building this port.
+
+There is also support for building perl under the Cygwin32 environment.
+Cygwin32 is a set of GNU tools that make it possible to compile and run
+many Unix programs under Windows NT by providing a mostly Unix-like 
+interface for compilation and execution.  See F<README.cygwin32> in the
+perl distribution for more details on this port and how to obtain the
+Cygwin32 toolkit.
+
+=head2 Plan 9
+
+See F<README.plan9> in the perl distribution.
+
+=head2 QNX
+
+See F<README.qnx> in the perl distribution.
+
+=head2 AmigaOS
+
+See F<README.amigaos> in the perl distribution.
+
+=head1 Pragmata
+
+Six new pragmatic modules exist:
+
+=over 4
+
+=item use autouse MODULE => qw(sub1 sub2 sub3)
+
+Defers C<require MODULE> until someone calls one of the specified
+subroutines (which must be exported by MODULE).  This pragma should be
+used with caution, and only when necessary.
+
+=item use blib
+
+=item use blib 'dir'
+
+Looks for MakeMaker-like I<'blib'> directory structure starting in
+I<dir> (or current directory) and working back up to five levels of
+parent directories.
+
+Intended for use on command line with B<-M> option as a way of testing
+arbitrary scripts against an uninstalled version of a package.
+
+=item use constant NAME => VALUE
+
+Provides a convenient interface for creating compile-time constants,
+See L<perlsub/"Constant Functions">.
+
+=item use locale
+
+Tells the compiler to enable (or disable) the use of POSIX locales for
+builtin operations.
+
+When C<use locale> is in effect, the current LC_CTYPE locale is used
+for regular expressions and case mapping; LC_COLLATE for string
+ordering; and LC_NUMERIC for numeric formatting in printf and sprintf
+(but B<not> in print).  LC_NUMERIC is always used in write, since
+lexical scoping of formats is problematic at best.
+
+Each C<use locale> or C<no locale> affects statements to the end of
+the enclosing BLOCK or, if not inside a BLOCK, to the end of the
+current file.  Locales can be switched and queried with
+POSIX::setlocale().
+
+See L<perllocale> for more information.
+
+=item use ops
+
+Disable unsafe opcodes, or any named opcodes, when compiling Perl code.
+
+=item use vmsish
+
+Enable VMS-specific language features.  Currently, there are three
+VMS-specific features available: 'status', which makes C<$?> and
+C<system> return genuine VMS status values instead of emulating POSIX;
+'exit', which makes C<exit> take a genuine VMS status value instead of
+assuming that C<exit 1> is an error; and 'time', which makes all times
+relative to the local time zone, in the VMS tradition.
+
+=back
+
+=head1 Modules
+
+=head2 Required Updates
+
+Though Perl 5.004 is compatible with almost all modules that work
+with Perl 5.003, there are a few exceptions:
+
+    Module   Required Version for Perl 5.004
+    ------   -------------------------------
+    Filter   Filter-1.12
+    LWP      libwww-perl-5.08
+    Tk       Tk400.202 (-w makes noise)
+
+Also, the majordomo mailing list program, version 1.94.1, doesn't work
+with Perl 5.004 (nor with perl 4), because it executes an invalid
+regular expression.  This bug is fixed in majordomo version 1.94.2.
+
+=head2 Installation directories
+
+The I<installperl> script now places the Perl source files for
+extensions in the architecture-specific library directory, which is
+where the shared libraries for extensions have always been.  This
+change is intended to allow administrators to keep the Perl 5.004
+library directory unchanged from a previous version, without running
+the risk of binary incompatibility between extensions' Perl source and
+shared libraries.
+
+=head2 Module information summary
+
+Brand new modules, arranged by topic rather than strictly
+alphabetically:
+
+    CGI.pm               Web server interface ("Common Gateway Interface")
+    CGI/Apache.pm        Support for Apache's Perl module
+    CGI/Carp.pm          Log server errors with helpful context
+    CGI/Fast.pm          Support for FastCGI (persistent server process)
+    CGI/Push.pm          Support for server push
+    CGI/Switch.pm        Simple interface for multiple server types
+
+    CPAN                 Interface to Comprehensive Perl Archive Network
+    CPAN::FirstTime      Utility for creating CPAN configuration file
+    CPAN::Nox            Runs CPAN while avoiding compiled extensions
+
+    IO.pm                Top-level interface to IO::* classes
+    IO/File.pm           IO::File extension Perl module
+    IO/Handle.pm         IO::Handle extension Perl module
+    IO/Pipe.pm           IO::Pipe extension Perl module
+    IO/Seekable.pm       IO::Seekable extension Perl module
+    IO/Select.pm         IO::Select extension Perl module
+    IO/Socket.pm         IO::Socket extension Perl module
+
+    Opcode.pm            Disable named opcodes when compiling Perl code
+
+    ExtUtils/Embed.pm    Utilities for embedding Perl in C programs
+    ExtUtils/testlib.pm  Fixes up @INC to use just-built extension
+
+    FindBin.pm           Find path of currently executing program
+
+    Class/Struct.pm      Declare struct-like datatypes as Perl classes
+    File/stat.pm         By-name interface to Perl's builtin stat
+    Net/hostent.pm       By-name interface to Perl's builtin gethost*
+    Net/netent.pm        By-name interface to Perl's builtin getnet*
+    Net/protoent.pm      By-name interface to Perl's builtin getproto*
+    Net/servent.pm       By-name interface to Perl's builtin getserv*
+    Time/gmtime.pm       By-name interface to Perl's builtin gmtime
+    Time/localtime.pm    By-name interface to Perl's builtin localtime
+    Time/tm.pm           Internal object for Time::{gm,local}time
+    User/grent.pm        By-name interface to Perl's builtin getgr*
+    User/pwent.pm        By-name interface to Perl's builtin getpw*
+
+    Tie/RefHash.pm       Base class for tied hashes with references as keys
+
+    UNIVERSAL.pm         Base class for *ALL* classes
+
+=head2 Fcntl
+
+New constants in the existing Fcntl modules are now supported,
+provided that your operating system happens to support them:
+
+    F_GETOWN F_SETOWN
+    O_ASYNC O_DEFER O_DSYNC O_FSYNC O_SYNC
+    O_EXLOCK O_SHLOCK
+
+These constants are intended for use with the Perl operators sysopen()
+and fcntl() and the basic database modules like SDBM_File.  For the
+exact meaning of these and other Fcntl constants please refer to your
+operating system's documentation for fcntl() and open().
+
+In addition, the Fcntl module now provides these constants for use
+with the Perl operator flock():
+
+	LOCK_SH LOCK_EX LOCK_NB LOCK_UN
+
+These constants are defined in all environments (because where there is
+no flock() system call, Perl emulates it).  However, for historical
+reasons, these constants are not exported unless they are explicitly
+requested with the ":flock" tag (e.g. C<use Fcntl ':flock'>).
+
+=head2 IO
+
+The IO module provides a simple mechanism to load all the IO modules at one
+go.  Currently this includes:
+
+     IO::Handle
+     IO::Seekable
+     IO::File
+     IO::Pipe
+     IO::Socket
+
+For more information on any of these modules, please see its
+respective documentation.
+
+=head2 Math::Complex
+
+The Math::Complex module has been totally rewritten, and now supports
+more operations.  These are overloaded:
+
+     + - * / ** <=> neg ~ abs sqrt exp log sin cos atan2 "" (stringify)
+
+And these functions are now exported:
+
+    pi i Re Im arg
+    log10 logn ln cbrt root
+    tan
+    csc sec cot
+    asin acos atan
+    acsc asec acot
+    sinh cosh tanh
+    csch sech coth
+    asinh acosh atanh
+    acsch asech acoth
+    cplx cplxe
+
+=head2 Math::Trig
+
+This new module provides a simpler interface to parts of Math::Complex for
+those who need trigonometric functions only for real numbers.
+
+=head2 DB_File
+
+There have been quite a few changes made to DB_File. Here are a few of
+the highlights:
+
+=over 4
+
+=item *
+
+Fixed a handful of bugs.
+
+=item *
+
+By public demand, added support for the standard hash function exists().
+
+=item *
+
+Made it compatible with Berkeley DB 1.86.
+
+=item *
+
+Made negative subscripts work with RECNO interface.
+
+=item *
+
+Changed the default flags from O_RDWR to O_CREAT|O_RDWR and the default
+mode from 0640 to 0666.
+
+=item *
+
+Made DB_File automatically import the open() constants (O_RDWR,
+O_CREAT etc.) from Fcntl, if available.
+
+=item *
+
+Updated documentation.
+
+=back
+
+Refer to the HISTORY section in DB_File.pm for a complete list of
+changes. Everything after DB_File 1.01 has been added since 5.003.
+
+=head2 Net::Ping
+
+Major rewrite - support added for both udp echo and real icmp pings.
+
+=head2 Object-oriented overrides for builtin operators
+
+Many of the Perl builtins returning lists now have
+object-oriented overrides.  These are:
+
+    File::stat
+    Net::hostent
+    Net::netent
+    Net::protoent
+    Net::servent
+    Time::gmtime
+    Time::localtime
+    User::grent
+    User::pwent
+
+For example, you can now say
+
+    use File::stat;
+    use User::pwent;
+    $his = (stat($filename)->st_uid == pwent($whoever)->pw_uid);
+
+=head1 Utility Changes
+
+=head2 pod2html
+
+=over 4
+
+=item Sends converted HTML to standard output
+
+The I<pod2html> utility included with Perl 5.004 is entirely new.
+By default, it sends the converted HTML to its standard output,
+instead of writing it to a file like Perl 5.003's I<pod2html> did.
+Use the B<--outfile=FILENAME> option to write to a file.
+
+=back
+
+=head2 xsubpp
+
+=over 4
+
+=item C<void> XSUBs now default to returning nothing
+
+Due to a documentation/implementation bug in previous versions of
+Perl, XSUBs with a return type of C<void> have actually been
+returning one value.  Usually that value was the GV for the XSUB,
+but sometimes it was some already freed or reused value, which would
+sometimes lead to program failure.
+
+In Perl 5.004, if an XSUB is declared as returning C<void>, it
+actually returns no value, i.e. an empty list (though there is a
+backward-compatibility exception; see below).  If your XSUB really
+does return an SV, you should give it a return type of C<SV *>.
+
+For backward compatibility, I<xsubpp> tries to guess whether a
+C<void> XSUB is really C<void> or if it wants to return an C<SV *>.
+It does so by examining the text of the XSUB: if I<xsubpp> finds
+what looks like an assignment to C<ST(0)>, it assumes that the
+XSUB's return type is really C<SV *>.
+
+=back
+
+=head1 C Language API Changes
+
+=over 4
+
+=item C<gv_fetchmethod> and C<perl_call_sv>
+
+The C<gv_fetchmethod> function finds a method for an object, just like
+in Perl 5.003.  The GV it returns may be a method cache entry.
+However, in Perl 5.004, method cache entries are not visible to users;
+therefore, they can no longer be passed directly to C<perl_call_sv>.
+Instead, you should use the C<GvCV> macro on the GV to extract its CV,
+and pass the CV to C<perl_call_sv>.
+
+The most likely symptom of passing the result of C<gv_fetchmethod> to
+C<perl_call_sv> is Perl's producing an "Undefined subroutine called"
+error on the I<second> call to a given method (since there is no cache
+on the first call).
+
+=item C<perl_eval_pv>
+
+A new function handy for eval'ing strings of Perl code inside C code.
+This function returns the value from the eval statement, which can
+be used instead of fetching globals from the symbol table.  See
+L<perlguts>, L<perlembed> and L<perlcall> for details and examples.
+
+=item Extended API for manipulating hashes
+
+Internal handling of hash keys has changed.  The old hashtable API is
+still fully supported, and will likely remain so.  The additions to the
+API allow passing keys as C<SV*>s, so that C<tied> hashes can be given
+real scalars as keys rather than plain strings (nontied hashes still
+can only use strings as keys).  New extensions must use the new hash
+access functions and macros if they wish to use C<SV*> keys.  These
+additions also make it feasible to manipulate C<HE*>s (hash entries),
+which can be more efficient.  See L<perlguts> for details.
+
+=back
+
+=head1 Documentation Changes
+
+Many of the base and library pods were updated.  These
+new pods are included in section 1:
+
+=over 4
+
+=item L<perldelta>
+
+This document.
+
+=item L<perlfaq>
+
+Frequently asked questions.
+
+=item L<perllocale>
+
+Locale support (internationalization and localization).
+
+=item L<perltoot>
+
+Tutorial on Perl OO programming.
+
+=item L<perlapio>
+
+Perl internal IO abstraction interface.
+
+=item L<perlmodlib>
+
+Perl module library and recommended practice for module creation.
+Extracted from L<perlmod> (which is much smaller as a result).
+
+=item L<perldebug>
+
+Although not new, this has been massively updated.
+
+=item L<perlsec>
+
+Although not new, this has been massively updated.
+
+=back
+
+=head1 New Diagnostics
+
+Several new conditions will trigger warnings that were
+silent before.  Some only affect certain platforms.
+The following new warnings and errors outline these.
+These messages are classified as follows (listed in
+increasing order of desperation):
+
+   (W) A warning (optional).
+   (D) A deprecation (optional).
+   (S) A severe warning (mandatory).
+   (F) A fatal error (trappable).
+   (P) An internal error you should never see (trappable).
+   (X) A very fatal error (nontrappable).
+   (A) An alien error message (not generated by Perl).
+
+=over 4
+
+=item "my" variable %s masks earlier declaration in same scope
+
+(W) A lexical variable has been redeclared in the same scope, effectively
+eliminating all access to the previous instance.  This is almost always
+a typographical error.  Note that the earlier variable will still exist
+until the end of the scope or until all closure referents to it are
+destroyed.
+
+=item %s argument is not a HASH element or slice
+
+(F) The argument to delete() must be either a hash element, such as
+
+    $foo{$bar}
+    $ref->[12]->{"susie"}
+
+or a hash slice, such as
+
+    @foo{$bar, $baz, $xyzzy}
+    @{$ref->[12]}{"susie", "queue"}
+
+=item Allocation too large: %lx
+
+(X) You can't allocate more than 64K on an MS-DOS machine.
+
+=item Allocation too large
+
+(F) You can't allocate more than 2^31+"small amount" bytes.
+
+=item Applying %s to %s will act on scalar(%s)
+
+(W) The pattern match (//), substitution (s///), and transliteration (tr///)
+operators work on scalar values.  If you apply one of them to an array
+or a hash, it will convert the array or hash to a scalar value -- the
+length of an array, or the population info of a hash -- and then work on
+that scalar value.  This is probably not what you meant to do.  See
+L<perlfunc/grep> and L<perlfunc/map> for alternatives.
+
+=item Attempt to free nonexistent shared string
+
+(P) Perl maintains a reference counted internal table of strings to
+optimize the storage and access of hash keys and other strings.  This
+indicates someone tried to decrement the reference count of a string
+that can no longer be found in the table.
+
+=item Attempt to use reference as lvalue in substr
+
+(W) You supplied a reference as the first argument to substr() used
+as an lvalue, which is pretty strange.  Perhaps you forgot to
+dereference it first.  See L<perlfunc/substr>.
+
+=item Bareword "%s" refers to nonexistent package
+
+(W) You used a qualified bareword of the form C<Foo::>, but
+the compiler saw no other uses of that namespace before that point.
+Perhaps you need to predeclare a package?
+
+=item Can't redefine active sort subroutine %s
+
+(F) Perl optimizes the internal handling of sort subroutines and keeps
+pointers into them.  You tried to redefine one such sort subroutine when it
+was currently active, which is not allowed.  If you really want to do
+this, you should write C<sort { &func } @x> instead of C<sort func @x>.
+
+=item Can't use bareword ("%s") as %s ref while "strict refs" in use
+
+(F) Only hard references are allowed by "strict refs".  Symbolic references
+are disallowed.  See L<perlref>.
+
+=item Cannot resolve method `%s' overloading `%s' in package `%s'
+
+(P) Internal error trying to resolve overloading specified by a method
+name (as opposed to a subroutine reference).
+
+=item Constant subroutine %s redefined
+
+(S) You redefined a subroutine which had previously been eligible for
+inlining.  See L<perlsub/"Constant Functions"> for commentary and
+workarounds.
+
+=item Constant subroutine %s undefined
+
+(S) You undefined a subroutine which had previously been eligible for
+inlining.  See L<perlsub/"Constant Functions"> for commentary and
+workarounds.
+
+=item Copy method did not return a reference
+
+(F) The method which overloads "=" is buggy. See L<overload/Copy Constructor>.
+
+=item Died
+
+(F) You passed die() an empty string (the equivalent of C<die "">) or
+you called it with no args and both C<$@> and C<$_> were empty.
+
+=item Exiting pseudo-block via %s
+
+(W) You are exiting a rather special block construct (like a sort block or
+subroutine) by unconventional means, such as a goto, or a loop control
+statement.  See L<perlfunc/sort>.
+
+=item Identifier too long
+
+(F) Perl limits identifiers (names for variables, functions, etc.) to
+252 characters for simple names, somewhat more for compound names (like
+C<$A::B>).  You've exceeded Perl's limits.  Future versions of Perl are
+likely to eliminate these arbitrary limitations.
+
+=item Illegal character %s (carriage return)
+
+(F) A carriage return character was found in the input.  This is an
+error, and not a warning, because carriage return characters can break
+multi-line strings, including here documents (e.g., C<print <<EOF;>).
+
+=item Illegal switch in PERL5OPT: %s
+
+(X) The PERL5OPT environment variable may only be used to set the
+following switches: B<-[DIMUdmw]>.
+
+=item Integer overflow in hex number
+
+(S) The literal hex number you have specified is too big for your
+architecture. On a 32-bit architecture the largest hex literal is
+0xFFFFFFFF.
+
+=item Integer overflow in octal number
+
+(S) The literal octal number you have specified is too big for your
+architecture. On a 32-bit architecture the largest octal literal is
+037777777777.
+
+=item internal error: glob failed
+
+(P) Something went wrong with the external program(s) used for C<glob>
+and C<< <*.c> >>.  This may mean that your csh (C shell) is
+broken.  If so, you should change all of the csh-related variables in
+config.sh:  If you have tcsh, make the variables refer to it as if it
+were csh (e.g. C<full_csh='/usr/bin/tcsh'>); otherwise, make them all
+empty (except that C<d_csh> should be C<'undef'>) so that Perl will
+think csh is missing.  In either case, after editing config.sh, run
+C<./Configure -S> and rebuild Perl.
+
+=item Invalid conversion in %s: "%s"
+
+(W) Perl does not understand the given format conversion.
+See L<perlfunc/sprintf>.
+
+=item Invalid type in pack: '%s'
+
+(F) The given character is not a valid pack type.  See L<perlfunc/pack>.
+
+=item Invalid type in unpack: '%s'
+
+(F) The given character is not a valid unpack type.  See L<perlfunc/unpack>.
+
+=item Name "%s::%s" used only once: possible typo
+
+(W) Typographical errors often show up as unique variable names.
+If you had a good reason for having a unique name, then just mention
+it again somehow to suppress the message (the C<use vars> pragma is
+provided for just this purpose).
+
+=item Null picture in formline
+
+(F) The first argument to formline must be a valid format picture
+specification.  It was found to be empty, which probably means you
+supplied it an uninitialized value.  See L<perlform>.
+
+=item Offset outside string
+
+(F) You tried to do a read/write/send/recv operation with an offset
+pointing outside the buffer.  This is difficult to imagine.
+The sole exception to this is that C<sysread()>ing past the buffer
+will extend the buffer and zero pad the new area.
+
+=item Out of memory!
+
+(X|F) The malloc() function returned 0, indicating there was insufficient
+remaining memory (or virtual memory) to satisfy the request.
+
+The request was judged to be small, so the possibility to trap it
+depends on the way Perl was compiled.  By default it is not trappable.
+However, if compiled for this, Perl may use the contents of C<$^M> as
+an emergency pool after die()ing with this message.  In this case the
+error is trappable I<once>.
+
+=item Out of memory during request for %s
+
+(F) The malloc() function returned 0, indicating there was insufficient
+remaining memory (or virtual memory) to satisfy the request. However,
+the request was judged large enough (compile-time default is 64K), so
+a possibility to shut down by trapping this error is granted.
+
+=item panic: frexp
+
+(P) The library function frexp() failed, making printf("%f") impossible.
+
+=item Possible attempt to put comments in qw() list
+
+(W) qw() lists contain items separated by whitespace; as with literal
+strings, comment characters are not ignored, but are instead treated
+as literal data.  (You may have used different delimiters than the
+parentheses shown here; braces are also frequently used.)
+
+You probably wrote something like this:
+
+    @list = qw(
+        a # a comment
+        b # another comment
+    );
+
+when you should have written this:
+
+    @list = qw(
+        a
+        b
+    );
+
+If you really want comments, build your list the
+old-fashioned way, with quotes and commas:
+
+    @list = (
+        'a',    # a comment
+        'b',    # another comment
+    );
+
+=item Possible attempt to separate words with commas
+
+(W) qw() lists contain items separated by whitespace; therefore commas
+aren't needed to separate the items. (You may have used different
+delimiters than the parentheses shown here; braces are also frequently
+used.)
+
+You probably wrote something like this:
+
+    qw! a, b, c !;
+
+which puts literal commas into some of the list items.  Write it without
+commas if you don't want them to appear in your data:
+
+    qw! a b c !;
+
+=item Scalar value @%s{%s} better written as $%s{%s}
+
+(W) You've used a hash slice (indicated by @) to select a single element of
+a hash.  Generally it's better to ask for a scalar value (indicated by $).
+The difference is that C<$foo{&bar}> always behaves like a scalar, both when
+assigning to it and when evaluating its argument, while C<@foo{&bar}> behaves
+like a list when you assign to it, and provides a list context to its
+subscript, which can do weird things if you're expecting only one subscript.
+
+=item Stub found while resolving method `%s' overloading `%s' in %s
+
+(P) Overloading resolution over @ISA tree may be broken by importing stubs.
+Stubs should never be implicitly created, but explicit calls to C<can>
+may break this.
+
+=item Too late for "B<-T>" option
+
+(X) The #! line (or local equivalent) in a Perl script contains the
+B<-T> option, but Perl was not invoked with B<-T> in its argument
+list.  This is an error because, by the time Perl discovers a B<-T> in
+a script, it's too late to properly taint everything from the
+environment.  So Perl gives up.
+
+=item untie attempted while %d inner references still exist
+
+(W) A copy of the object returned from C<tie> (or C<tied>) was still
+valid when C<untie> was called.
+
+=item Unrecognized character %s
+
+(F) The Perl parser has no idea what to do with the specified character
+in your Perl script (or eval).  Perhaps you tried to run a compressed
+script, a binary program, or a directory as a Perl program.
+
+=item Unsupported function fork
+
+(F) Your version of executable does not support forking.
+
+Note that under some systems, like OS/2, there may be different flavors of
+Perl executables, some of which may support fork, some not. Try changing
+the name you call Perl by to C<perl_>, C<perl__>, and so on.
+
+=item Use of "$$<digit>" to mean "${$}<digit>" is deprecated
+
+(D) Perl versions before 5.004 misinterpreted any type marker followed
+by "$" and a digit.  For example, "$$0" was incorrectly taken to mean
+"${$}0" instead of "${$0}".  This bug is (mostly) fixed in Perl 5.004.
+
+However, the developers of Perl 5.004 could not fix this bug completely,
+because at least two widely-used modules depend on the old meaning of
+"$$0" in a string.  So Perl 5.004 still interprets "$$<digit>" in the
+old (broken) way inside strings; but it generates this message as a
+warning.  And in Perl 5.005, this special treatment will cease.
+
+=item Value of %s can be "0"; test with defined()
+
+(W) In a conditional expression, you used <HANDLE>, <*> (glob), C<each()>,
+or C<readdir()> as a boolean value.  Each of these constructs can return a
+value of "0"; that would make the conditional expression false, which is
+probably not what you intended.  When using these constructs in conditional
+expressions, test their values with the C<defined> operator.
+
+=item Variable "%s" may be unavailable
+
+(W) An inner (nested) I<anonymous> subroutine is inside a I<named>
+subroutine, and outside that is another subroutine; and the anonymous
+(innermost) subroutine is referencing a lexical variable defined in
+the outermost subroutine.  For example:
+
+   sub outermost { my $a; sub middle { sub { $a } } }
+
+If the anonymous subroutine is called or referenced (directly or
+indirectly) from the outermost subroutine, it will share the variable
+as you would expect.  But if the anonymous subroutine is called or
+referenced when the outermost subroutine is not active, it will see
+the value of the shared variable as it was before and during the
+*first* call to the outermost subroutine, which is probably not what
+you want.
+
+In these circumstances, it is usually best to make the middle
+subroutine anonymous, using the C<sub {}> syntax.  Perl has specific
+support for shared variables in nested anonymous subroutines; a named
+subroutine in between interferes with this feature.
+
+=item Variable "%s" will not stay shared
+
+(W) An inner (nested) I<named> subroutine is referencing a lexical
+variable defined in an outer subroutine.
+
+When the inner subroutine is called, it will probably see the value of
+the outer subroutine's variable as it was before and during the
+*first* call to the outer subroutine; in this case, after the first
+call to the outer subroutine is complete, the inner and outer
+subroutines will no longer share a common value for the variable.  In
+other words, the variable will no longer be shared.
+
+Furthermore, if the outer subroutine is anonymous and references a
+lexical variable outside itself, then the outer and inner subroutines
+will I<never> share the given variable.
+
+This problem can usually be solved by making the inner subroutine
+anonymous, using the C<sub {}> syntax.  When inner anonymous subs that
+reference variables in outer subroutines are called or referenced,
+they are automatically rebound to the current values of such
+variables.
+
+=item Warning: something's wrong
+
+(W) You passed warn() an empty string (the equivalent of C<warn "">) or
+you called it with no args and C<$_> was empty.
+
+=item Ill-formed logical name |%s| in prime_env_iter
+
+(W) A warning peculiar to VMS.  A logical name was encountered when preparing
+to iterate over %ENV which violates the syntactic rules governing logical
+names.  Since it cannot be translated normally, it is skipped, and will not
+appear in %ENV.  This may be a benign occurrence, as some software packages
+might directly modify logical name tables and introduce nonstandard names,
+or it may indicate that a logical name table has been corrupted.
+
+=item Got an error from DosAllocMem
+
+(P) An error peculiar to OS/2.  Most probably you're using an obsolete
+version of Perl, and this should not happen anyway.
+
+=item Malformed PERLLIB_PREFIX
+
+(F) An error peculiar to OS/2.  PERLLIB_PREFIX should be of the form
+
+    prefix1;prefix2
+
+or
+
+    prefix1 prefix2
+
+with nonempty prefix1 and prefix2.  If C<prefix1> is indeed a prefix
+of a builtin library search path, prefix2 is substituted.  The error
+may appear if components are not found, or are too long.  See
+"PERLLIB_PREFIX" in F<README.os2>.
+
+=item PERL_SH_DIR too long
+
+(F) An error peculiar to OS/2. PERL_SH_DIR is the directory to find the
+C<sh>-shell in.  See "PERL_SH_DIR" in F<README.os2>.
+
+=item Process terminated by SIG%s
+
+(W) This is a standard message issued by OS/2 applications, while *nix
+applications die in silence.  It is considered a feature of the OS/2
+port.  One can easily disable this by appropriate sighandlers, see
+L<perlipc/"Signals">.  See also "Process terminated by SIGTERM/SIGINT"
+in F<README.os2>.
+
+=back
+
+=head1 BUGS
+
+If you find what you think is a bug, you might check the headers of
+recently posted articles in the comp.lang.perl.misc newsgroup.
+There may also be information at http://www.perl.com/perl/ , the Perl
+Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Make sure you trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to <F<perlbug@perl.com>> to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.  This file has been
+significantly updated for 5.004, so even veteran users should
+look through it.
+
+The F<README> file for general stuff.
+
+The F<Copying> file for copyright information.
+
+=head1 HISTORY
+
+Constructed by Tom Christiansen, grabbing material with permission
+from innumerable contributors, with kibitzing by more than a few Perl
+porters.
+
+Last update: Wed May 14 11:14:09 EDT 1997
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl5005delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl5005delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl5005delta.pod	(revision 14489)
@@ -0,0 +1,993 @@
+=head1 NAME
+
+perl5005delta - what's new for perl5.005
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.004 release and this one.
+
+=head1 About the new versioning system
+
+Perl is now developed on two tracks: a maintenance track that makes
+small, safe updates to released production versions with emphasis on
+compatibility; and a development track that pursues more aggressive
+evolution.  Maintenance releases (which should be considered production
+quality) have subversion numbers that run from C<1> to C<49>, and
+development releases (which should be considered "alpha" quality) run
+from C<50> to C<99>.
+
+Perl 5.005 is the combined product of the new dual-track development
+scheme.
+
+=head1 Incompatible Changes
+
+=head2 WARNING:  This version is not binary compatible with Perl 5.004.
+
+Starting with Perl 5.004_50 there were many deep and far-reaching changes
+to the language internals.  If you have dynamically loaded extensions
+that you built under perl 5.003 or 5.004, you can continue to use them
+with 5.004, but you will need to rebuild and reinstall those extensions
+to use them 5.005.  See F<INSTALL> for detailed instructions on how to
+upgrade.
+
+=head2 Default installation structure has changed
+
+The new Configure defaults are designed to allow a smooth upgrade from
+5.004 to 5.005, but you should read F<INSTALL> for a detailed
+discussion of the changes in order to adapt them to your system.
+
+=head2 Perl Source Compatibility
+
+When none of the experimental features are enabled, there should be
+very few user-visible Perl source compatibility issues.
+
+If threads are enabled, then some caveats apply. C<@_> and C<$_> become
+lexical variables.  The effect of this should be largely transparent to
+the user, but there are some boundary conditions under which user will
+need to be aware of the issues.  For example, C<local(@_)> results in
+a "Can't localize lexical variable @_ ..." message.  This may be enabled
+in a future version.
+
+Some new keywords have been introduced.  These are generally expected to
+have very little impact on compatibility.  See L<New C<INIT> keyword>,
+L<New C<lock> keyword>, and L<New C<qrE<sol>E<sol>> operator>.
+
+Certain barewords are now reserved.  Use of these will provoke a warning
+if you have asked for them with the C<-w> switch.
+See L<C<our> is now a reserved word>.
+
+=head2 C Source Compatibility
+
+There have been a large number of changes in the internals to support
+the new features in this release.
+
+=over 4
+
+=item *
+
+Core sources now require ANSI C compiler
+
+An ANSI C compiler is now B<required> to build perl.  See F<INSTALL>.
+
+=item *
+
+All Perl global variables must now be referenced with an explicit prefix
+
+All Perl global variables that are visible for use by extensions now
+have a C<PL_> prefix.  New extensions should C<not> refer to perl globals
+by their unqualified names.  To preserve sanity, we provide limited
+backward compatibility for globals that are being widely used like
+C<sv_undef> and C<na> (which should now be written as C<PL_sv_undef>,
+C<PL_na> etc.)
+
+If you find that your XS extension does not compile anymore because a
+perl global is not visible, try adding a C<PL_> prefix to the global
+and rebuild.
+
+It is strongly recommended that all functions in the Perl API that don't
+begin with C<perl> be referenced with a C<Perl_> prefix.  The bare function
+names without the C<Perl_> prefix are supported with macros, but this
+support may cease in a future release.
+
+See L<perlapi>.
+
+=item *
+
+Enabling threads has source compatibility issues
+
+Perl built with threading enabled requires extensions to use the new
+C<dTHR> macro to initialize the handle to access per-thread data.
+If you see a compiler error that talks about the variable C<thr> not
+being declared (when building a module that has XS code),  you need
+to add C<dTHR;> at the beginning of the block that elicited the error.
+
+The API function C<perl_get_sv("@",FALSE)> should be used instead of
+directly accessing perl globals as C<GvSV(errgv)>.  The API call is
+backward compatible with existing perls and provides source compatibility
+with threading is enabled.
+
+See L<"C Source Compatibility"> for more information.
+
+=back
+
+=head2 Binary Compatibility
+
+This version is NOT binary compatible with older versions.  All extensions
+will need to be recompiled.  Further binaries built with threads enabled
+are incompatible with binaries built without.  This should largely be
+transparent to the user, as all binary incompatible configurations have
+their own unique architecture name, and extension binaries get installed at
+unique locations.  This allows coexistence of several configurations in
+the same directory hierarchy.  See F<INSTALL>.
+
+=head2 Security fixes may affect compatibility
+
+A few taint leaks and taint omissions have been corrected.  This may lead
+to "failure" of scripts that used to work with older versions.  Compiling
+with -DINCOMPLETE_TAINTS provides a perl with minimal amounts of changes
+to the tainting behavior.  But note that the resulting perl will have
+known insecurities.
+
+Oneliners with the C<-e> switch do not create temporary files anymore.
+
+=head2 Relaxed new mandatory warnings introduced in 5.004
+
+Many new warnings that were introduced in 5.004 have been made
+optional.  Some of these warnings are still present, but perl's new
+features make them less often a problem.  See L<New Diagnostics>.
+
+=head2 Licensing
+
+Perl has a new Social Contract for contributors.  See F<Porting/Contract>.
+
+The license included in much of the Perl documentation has changed.
+Most of the Perl documentation was previously under the implicit GNU
+General Public License or the Artistic License (at the user's choice).
+Now much of the documentation unambiguously states the terms under which
+it may be distributed.  Those terms are in general much less restrictive
+than the GNU GPL.  See L<perl> and the individual perl manpages listed
+therein.
+
+=head1 Core Changes
+
+
+=head2 Threads
+
+WARNING: Threading is considered an B<experimental> feature.  Details of the
+implementation may change without notice.  There are known limitations
+and some bugs.  These are expected to be fixed in future versions.
+
+See F<README.threads>.
+
+=head2 Compiler
+
+WARNING: The Compiler and related tools are considered B<experimental>.
+Features may change without notice, and there are known limitations
+and bugs.  Since the compiler is fully external to perl, the default
+configuration will build and install it.
+
+The Compiler produces three different types of transformations of a
+perl program.  The C backend generates C code that captures perl's state
+just before execution begins.  It eliminates the compile-time overheads
+of the regular perl interpreter, but the run-time performance remains
+comparatively the same.  The CC backend generates optimized C code
+equivalent to the code path at run-time.  The CC backend has greater
+potential for big optimizations, but only a few optimizations are
+implemented currently.  The Bytecode backend generates a platform
+independent bytecode representation of the interpreter's state
+just before execution.  Thus, the Bytecode back end also eliminates
+much of the compilation overhead of the interpreter.
+
+The compiler comes with several valuable utilities.
+
+C<B::Lint> is an experimental module to detect and warn about suspicious
+code, especially the cases that the C<-w> switch does not detect.
+
+C<B::Deparse> can be used to demystify perl code, and understand
+how perl optimizes certain constructs.
+
+C<B::Xref> generates cross reference reports of all definition and use
+of variables, subroutines and formats in a program.
+
+C<B::Showlex> show the lexical variables used by a subroutine or file
+at a glance.
+
+C<perlcc> is a simple frontend for compiling perl.
+
+See C<ext/B/README>, L<B>, and the respective compiler modules.
+
+=head2 Regular Expressions
+
+Perl's regular expression engine has been seriously overhauled, and
+many new constructs are supported.  Several bugs have been fixed.
+
+Here is an itemized summary:
+
+=over 4
+
+=item Many new and improved optimizations
+
+Changes in the RE engine:
+
+	Unneeded nodes removed;
+	Substrings merged together;
+	New types of nodes to process (SUBEXPR)* and similar expressions
+	    quickly, used if the SUBEXPR has no side effects and matches
+	    strings of the same length;
+	Better optimizations by lookup for constant substrings;
+	Better search for constants substrings anchored by $ ;
+
+Changes in Perl code using RE engine:
+
+	More optimizations to s/longer/short/;
+	study() was not working;
+	/blah/ may be optimized to an analogue of index() if $& $` $' not seen;
+	Unneeded copying of matched-against string removed;
+	Only matched part of the string is copying if $` $' were not seen;
+
+=item Many bug fixes
+
+Note that only the major bug fixes are listed here.  See F<Changes> for others.
+
+	Backtracking might not restore start of $3.
+	No feedback if max count for * or + on "complex" subexpression
+	    was reached, similarly (but at compile time) for {3,34567}
+	Primitive restrictions on max count introduced to decrease a 
+	    possibility of a segfault;
+	(ZERO-LENGTH)* could segfault;
+	(ZERO-LENGTH)* was prohibited;
+	Long REs were not allowed;
+	/RE/g could skip matches at the same position after a 
+	  zero-length match;
+
+=item New regular expression constructs
+
+The following new syntax elements are supported:
+
+	(?<=RE)
+	(?<!RE)
+	(?{ CODE })
+	(?i-x)
+	(?i:RE)
+	(?(COND)YES_RE|NO_RE)
+	(?>RE)
+	\z
+
+=item New operator for precompiled regular expressions
+
+See L<New C<qrE<sol>E<sol>> operator>.
+
+=item Other improvements
+
+	Better debugging output (possibly with colors),
+            even from non-debugging Perl;
+	RE engine code now looks like C, not like assembler;
+	Behaviour of RE modifiable by `use re' directive;
+	Improved documentation;
+	Test suite significantly extended;
+	Syntax [:^upper:] etc., reserved inside character classes;
+
+=item Incompatible changes
+
+	(?i) localized inside enclosing group;
+	$( is not interpolated into RE any more;
+	/RE/g may match at the same position (with non-zero length)
+	    after a zero-length match (bug fix).
+
+=back
+
+See L<perlre> and L<perlop>.
+
+=head2   Improved malloc()
+
+See banner at the beginning of C<malloc.c> for details.
+
+=head2 Quicksort is internally implemented
+
+Perl now contains its own highly optimized qsort() routine.  The new qsort()
+is resistant to inconsistent comparison functions, so Perl's C<sort()> will
+not provoke coredumps any more when given poorly written sort subroutines.
+(Some C library C<qsort()>s that were being used before used to have this
+problem.)  In our testing, the new C<qsort()> required the minimal number
+of pair-wise compares on average, among all known C<qsort()> implementations.
+
+See C<perlfunc/sort>.
+
+=head2 Reliable signals
+
+Perl's signal handling is susceptible to random crashes, because signals
+arrive asynchronously, and the Perl runtime is not reentrant at arbitrary
+times.
+
+However, one experimental implementation of reliable signals is available
+when threads are enabled.  See C<Thread::Signal>.  Also see F<INSTALL> for
+how to build a Perl capable of threads.
+
+=head2 Reliable stack pointers
+
+The internals now reallocate the perl stack only at predictable times.
+In particular, magic calls never trigger reallocations of the stack,
+because all reentrancy of the runtime is handled using a "stack of stacks".
+This should improve reliability of cached stack pointers in the internals
+and in XSUBs.
+
+=head2 More generous treatment of carriage returns
+
+Perl used to complain if it encountered literal carriage returns in
+scripts.  Now they are mostly treated like whitespace within program text.
+Inside string literals and here documents, literal carriage returns are
+ignored if they occur paired with linefeeds, or get interpreted as whitespace
+if they stand alone.  This behavior means that literal carriage returns
+in files should be avoided.  You can get the older, more compatible (but
+less generous) behavior by defining the preprocessor symbol
+C<PERL_STRICT_CR> when building perl.  Of course, all this has nothing
+whatever to do with how escapes like C<\r> are handled within strings.
+
+Note that this doesn't somehow magically allow you to keep all text files
+in DOS format.  The generous treatment only applies to files that perl
+itself parses.  If your C compiler doesn't allow carriage returns in
+files, you may still be unable to build modules that need a C compiler.
+
+=head2 Memory leaks
+
+C<substr>, C<pos> and C<vec> don't leak memory anymore when used in lvalue
+context.  Many small leaks that impacted applications that embed multiple
+interpreters have been fixed.
+
+=head2 Better support for multiple interpreters
+
+The build-time option C<-DMULTIPLICITY> has had many of the details
+reworked.  Some previously global variables that should have been
+per-interpreter now are.  With care, this allows interpreters to call
+each other.  See the C<PerlInterp> extension on CPAN.
+
+=head2 Behavior of local() on array and hash elements is now well-defined
+
+See L<perlsub/"Temporary Values via local()">.
+
+=head2 C<%!> is transparently tied to the L<Errno> module
+
+See L<perlvar>, and L<Errno>.
+
+=head2 Pseudo-hashes are supported
+
+See L<perlref>.
+
+=head2 C<EXPR foreach EXPR> is supported
+
+See L<perlsyn>.
+
+=head2 Keywords can be globally overridden
+
+See L<perlsub>.
+
+=head2 C<$^E> is meaningful on Win32
+
+See L<perlvar>.
+
+=head2 C<foreach (1..1000000)> optimized
+
+C<foreach (1..1000000)> is now optimized into a counting loop.  It does
+not try to allocate a 1000000-size list anymore.
+
+=head2 C<Foo::> can be used as implicitly quoted package name
+
+Barewords caused unintuitive behavior when a subroutine with the same
+name as a package happened to be defined.  Thus, C<new Foo @args>,
+use the result of the call to C<Foo()> instead of C<Foo> being treated
+as a literal.  The recommended way to write barewords in the indirect
+object slot is C<new Foo:: @args>.  Note that the method C<new()> is
+called with a first argument of C<Foo>, not C<Foo::> when you do that.
+
+=head2 C<exists $Foo::{Bar::}> tests existence of a package
+
+It was impossible to test for the existence of a package without
+actually creating it before.  Now C<exists $Foo::{Bar::}> can be
+used to test if the C<Foo::Bar> namespace has been created.
+
+=head2 Better locale support
+
+See L<perllocale>.
+
+=head2 Experimental support for 64-bit platforms
+
+Perl5 has always had 64-bit support on systems with 64-bit longs.
+Starting with 5.005, the beginnings of experimental support for systems
+with 32-bit long and 64-bit 'long long' integers has been added.
+If you add -DUSE_LONG_LONG to your ccflags in config.sh (or manually
+define it in perl.h) then perl will be built with 'long long' support.
+There will be many compiler warnings, and the resultant perl may not
+work on all systems.  There are many other issues related to
+third-party extensions and libraries.  This option exists to allow
+people to work on those issues.
+
+=head2 prototype() returns useful results on builtins
+
+See L<perlfunc/prototype>.
+
+=head2 Extended support for exception handling
+
+C<die()> now accepts a reference value, and C<$@> gets set to that
+value in exception traps.  This makes it possible to propagate
+exception objects.  This is an undocumented B<experimental> feature.
+
+=head2 Re-blessing in DESTROY() supported for chaining DESTROY() methods
+
+See L<perlobj/Destructors>.
+
+=head2 All C<printf> format conversions are handled internally
+
+See L<perlfunc/printf>.
+
+=head2 New C<INIT> keyword
+
+C<INIT> subs are like C<BEGIN> and C<END>, but they get run just before
+the perl runtime begins execution.  e.g., the Perl Compiler makes use of
+C<INIT> blocks to initialize and resolve pointers to XSUBs.
+
+=head2 New C<lock> keyword
+
+The C<lock> keyword is the fundamental synchronization primitive
+in threaded perl.  When threads are not enabled, it is currently a noop.
+
+To minimize impact on source compatibility this keyword is "weak", i.e., any
+user-defined subroutine of the same name overrides it, unless a C<use Thread>
+has been seen.
+
+=head2 New C<qr//> operator
+
+The C<qr//> operator, which is syntactically similar to the other quote-like
+operators, is used to create precompiled regular expressions.  This compiled
+form can now be explicitly passed around in variables, and interpolated in
+other regular expressions.  See L<perlop>.
+
+=head2 C<our> is now a reserved word
+
+Calling a subroutine with the name C<our> will now provoke a warning when
+using the C<-w> switch.
+
+=head2 Tied arrays are now fully supported
+
+See L<Tie::Array>.
+
+=head2 Tied handles support is better
+
+Several missing hooks have been added.  There is also a new base class for
+TIEARRAY implementations.  See L<Tie::Array>.
+
+=head2 4th argument to substr
+
+substr() can now both return and replace in one operation.  The optional
+4th argument is the replacement string.  See L<perlfunc/substr>.
+
+=head2 Negative LENGTH argument to splice
+
+splice() with a negative LENGTH argument now work similar to what the
+LENGTH did for substr().  Previously a negative LENGTH was treated as
+0.  See L<perlfunc/splice>.
+
+=head2 Magic lvalues are now more magical
+
+When you say something like C<substr($x, 5) = "hi">, the scalar returned
+by substr() is special, in that any modifications to it affect $x.
+(This is called a 'magic lvalue' because an 'lvalue' is something on
+the left side of an assignment.)  Normally, this is exactly what you
+would expect to happen, but Perl uses the same magic if you use substr(),
+pos(), or vec() in a context where they might be modified, like taking
+a reference with C<\> or as an argument to a sub that modifies C<@_>.
+In previous versions, this 'magic' only went one way, but now changes
+to the scalar the magic refers to ($x in the above example) affect the
+magic lvalue too. For instance, this code now acts differently:
+
+    $x = "hello";
+    sub printit {
+	$x = "g'bye";
+	print $_[0], "\n";
+    }
+    printit(substr($x, 0, 5));
+
+In previous versions, this would print "hello", but it now prints "g'bye".
+
+=head2 <> now reads in records
+
+If C<$/> is a reference to an integer, or a scalar that holds an integer,
+<> will read in records instead of lines. For more info, see
+L<perlvar/$E<sol>>.
+
+=head1 Supported Platforms
+
+Configure has many incremental improvements.  Site-wide policy for building
+perl can now be made persistent, via Policy.sh.  Configure also records
+the command-line arguments used in F<config.sh>.
+
+=head2 New Platforms
+
+BeOS is now supported.  See F<README.beos>.
+
+DOS is now supported under the DJGPP tools.  See F<README.dos> (installed 
+as L<perldos> on some systems).
+
+MiNT is now supported.  See F<README.mint>.
+
+MPE/iX is now supported.  See F<README.mpeix>.
+
+MVS (aka OS390, aka Open Edition) is now supported.  See F<README.os390> 
+(installed as L<perlos390> on some systems).
+
+Stratus VOS is now supported.  See F<README.vos>.
+
+=head2 Changes in existing support
+
+Win32 support has been vastly enhanced.  Support for Perl Object, a C++
+encapsulation of Perl.  GCC and EGCS are now supported on Win32.
+See F<README.win32>, aka L<perlwin32>.
+
+VMS configuration system has been rewritten.  See F<README.vms> (installed 
+as L<README_vms> on some systems).
+
+The hints files for most Unix platforms have seen incremental improvements.
+
+=head1 Modules and Pragmata
+
+=head2 New Modules
+
+=over 4
+
+=item B
+
+Perl compiler and tools.  See L<B>.
+
+=item Data::Dumper
+
+A module to pretty print Perl data.  See L<Data::Dumper>.
+
+=item Dumpvalue
+
+A module to dump perl values to the screen. See L<Dumpvalue>.
+
+=item Errno
+
+A module to look up errors more conveniently.  See L<Errno>.
+
+=item File::Spec
+
+A portable API for file operations.
+
+=item ExtUtils::Installed
+
+Query and manage installed modules.
+
+=item ExtUtils::Packlist
+
+Manipulate .packlist files.
+
+=item Fatal
+
+Make functions/builtins succeed or die.
+
+=item IPC::SysV
+
+Constants and other support infrastructure for System V IPC operations
+in perl.
+
+=item Test
+
+A framework for writing testsuites.
+
+=item Tie::Array
+
+Base class for tied arrays.
+
+=item Tie::Handle
+
+Base class for tied handles.
+
+=item Thread
+
+Perl thread creation, manipulation, and support.
+
+=item attrs
+
+Set subroutine attributes.
+
+=item fields
+
+Compile-time class fields.
+
+=item re
+
+Various pragmata to control behavior of regular expressions.
+
+=back
+
+=head2 Changes in existing modules
+
+=over 4
+
+=item Benchmark
+
+You can now run tests for I<x> seconds instead of guessing the right
+number of tests to run.
+
+Keeps better time.
+
+=item Carp
+
+Carp has a new function cluck(). cluck() warns, like carp(), but also adds
+a stack backtrace to the error message, like confess().
+
+=item CGI
+
+CGI has been updated to version 2.42.
+
+=item Fcntl
+
+More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
+large (more than 4G) file access (the 64-bit support is not yet
+working, though, so no need to get overly excited), Free/Net/OpenBSD
+locking behaviour flags F_FLOCK, F_POSIX, Linux F_SHLCK, and
+O_ACCMODE: the mask of O_RDONLY, O_WRONLY, and O_RDWR.
+
+=item Math::Complex
+
+The accessors methods Re, Im, arg, abs, rho, theta, methods can
+($z->Re()) now also act as mutators ($z->Re(3)).
+
+=item Math::Trig
+
+A little bit of radial trigonometry (cylindrical and spherical) added,
+for example the great circle distance.
+
+=item POSIX
+
+POSIX now has its own platform-specific hints files.
+
+=item DB_File
+
+DB_File supports version 2.x of Berkeley DB.  See C<ext/DB_File/Changes>.
+
+=item MakeMaker
+
+MakeMaker now supports writing empty makefiles, provides a way to
+specify that site umask() policy should be honored.  There is also
+better support for manipulation of .packlist files, and getting
+information about installed modules.
+
+Extensions that have both architecture-dependent and
+architecture-independent files are now always installed completely in
+the architecture-dependent locations.  Previously, the shareable parts
+were shared both across architectures and across perl versions and were
+therefore liable to be overwritten with newer versions that might have
+subtle incompatibilities.
+
+=item CPAN
+
+See L<perlmodinstall> and L<CPAN>.
+
+=item Cwd
+
+Cwd::cwd is faster on most platforms.
+
+=back
+
+=head1 Utility Changes
+
+C<h2ph> and related utilities have been vastly overhauled.
+
+C<perlcc>, a new experimental front end for the compiler is available.
+
+The crude GNU C<configure> emulator is now called C<configure.gnu> to
+avoid trampling on C<Configure> under case-insensitive filesystems.
+
+C<perldoc> used to be rather slow.  The slower features are now optional.
+In particular, case-insensitive searches need the C<-i> switch, and
+recursive searches need C<-r>.  You can set these switches in the
+C<PERLDOC> environment variable to get the old behavior.
+
+=head1 Documentation Changes
+
+Config.pm now has a glossary of variables.
+
+F<Porting/patching.pod> has detailed instructions on how to create and
+submit patches for perl.
+
+L<perlport> specifies guidelines on how to write portably. 
+
+L<perlmodinstall> describes how to fetch and install modules from C<CPAN>
+sites.
+
+Some more Perl traps are documented now.  See L<perltrap>.
+
+L<perlopentut> gives a tutorial on using open().
+
+L<perlreftut> gives a tutorial on references.
+
+L<perlthrtut> gives a tutorial on threads.
+
+=head1 New Diagnostics
+
+=over 4
+
+=item Ambiguous call resolved as CORE::%s(), qualify as such or use &
+
+(W) A subroutine you have declared has the same name as a Perl keyword,
+and you have used the name without qualification for calling one or the
+other.  Perl decided to call the builtin because the subroutine is
+not imported.
+
+To force interpretation as a subroutine call, either put an ampersand
+before the subroutine name, or qualify the name with its package.
+Alternatively, you can import the subroutine (or pretend that it's
+imported with the C<use subs> pragma).
+
+To silently interpret it as the Perl operator, use the C<CORE::> prefix
+on the operator (e.g. C<CORE::log($x)>) or by declaring the subroutine
+to be an object method (see L<attrs>).
+
+=item Bad index while coercing array into hash
+
+(F) The index looked up in the hash found as the 0'th element of a
+pseudo-hash is not legal.  Index values must be at 1 or greater.
+See L<perlref>.
+
+=item Bareword "%s" refers to nonexistent package
+
+(W) You used a qualified bareword of the form C<Foo::>, but
+the compiler saw no other uses of that namespace before that point.
+Perhaps you need to predeclare a package?
+
+=item Can't call method "%s" on an undefined value
+
+(F) You used the syntax of a method call, but the slot filled by the
+object reference or package name contains an undefined value.
+Something like this will reproduce the error:
+
+    $BADREF = 42;
+    process $BADREF 1,2,3;
+    $BADREF->process(1,2,3);
+
+=item Can't check filesystem of script "%s" for nosuid
+
+(P) For some reason you can't check the filesystem of the script for nosuid.
+
+=item Can't coerce array into hash
+
+(F) You used an array where a hash was expected, but the array has no
+information on how to map from keys to array indices.  You can do that
+only with arrays that have a hash reference at index 0.
+
+=item Can't goto subroutine from an eval-string
+
+(F) The "goto subroutine" call can't be used to jump out of an eval "string".
+(You can use it to jump out of an eval {BLOCK}, but you probably don't want to.)
+
+=item Can't localize pseudo-hash element
+
+(F) You said something like C<< local $ar->{'key'} >>, where $ar is
+a reference to a pseudo-hash.  That hasn't been implemented yet, but
+you can get a similar effect by localizing the corresponding array
+element directly -- C<< local $ar->[$ar->[0]{'key'}] >>.
+
+=item Can't use %%! because Errno.pm is not available
+
+(F) The first time the %! hash is used, perl automatically loads the
+Errno.pm module. The Errno module is expected to tie the %! hash to
+provide symbolic names for C<$!> errno values.
+
+=item Cannot find an opnumber for "%s"
+
+(F) A string of a form C<CORE::word> was given to prototype(), but
+there is no builtin with the name C<word>.
+
+=item Character class syntax [. .] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[." and ending with ".]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[." and ".\]".
+
+=item Character class syntax [: :] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[:" and ending with ":]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[:" and ":\]".
+
+=item Character class syntax [= =] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax
+beginning with "[=" and ending with "=]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[=" and "=\]".
+
+=item %s: Eval-group in insecure regular expression
+
+(F) Perl detected tainted data when trying to compile a regular expression
+that contains the C<(?{ ... })> zero-width assertion, which is unsafe.
+See L<perlre/(?{ code })>, and L<perlsec>.
+
+=item %s: Eval-group not allowed, use re 'eval'
+
+(F) A regular expression contained the C<(?{ ... })> zero-width assertion,
+but that construct is only allowed when the C<use re 'eval'> pragma is
+in effect.  See L<perlre/(?{ code })>.
+
+=item %s: Eval-group not allowed at run time
+
+(F) Perl tried to compile a regular expression containing the C<(?{ ... })>
+zero-width assertion at run time, as it would when the pattern contains
+interpolated values.  Since that is a security risk, it is not allowed.
+If you insist, you may still do this by explicitly building the pattern
+from an interpolated string at run time and using that in an eval().
+See L<perlre/(?{ code })>.
+
+=item Explicit blessing to '' (assuming package main)
+
+(W) You are blessing a reference to a zero length string.  This has
+the effect of blessing the reference into the package main.  This is
+usually not what you want.  Consider providing a default target
+package, e.g. bless($ref, $p || 'MyPackage');
+
+=item Illegal hex digit ignored
+
+(W) You may have tried to use a character other than 0 - 9 or A - F in a
+hexadecimal number.  Interpretation of the hexadecimal number stopped
+before the illegal character.
+
+=item No such array field
+
+(F) You tried to access an array as a hash, but the field name used is
+not defined.  The hash at index 0 should map all valid field names to
+array indices for that to work.
+
+=item No such field "%s" in variable %s of type %s
+
+(F) You tried to access a field of a typed variable where the type
+does not know about the field name.  The field names are looked up in
+the %FIELDS hash in the type package at compile time.  The %FIELDS hash
+is usually set up with the 'fields' pragma.
+
+=item Out of memory during ridiculously large request
+
+(F) You can't allocate more than 2^31+"small amount" bytes.  This error
+is most likely to be caused by a typo in the Perl program. e.g., C<$arr[time]>
+instead of C<$arr[$time]>.
+
+=item Range iterator outside integer range
+
+(F) One (or both) of the numeric arguments to the range operator ".."
+are outside the range which can be represented by integers internally.
+One possible workaround is to force Perl to use magical string
+increment by prepending "0" to your numbers.
+
+=item Recursive inheritance detected while looking for method '%s' %s
+
+(F) More than 100 levels of inheritance were encountered while invoking a
+method.  Probably indicates an unintended loop in your inheritance hierarchy.
+
+=item Reference found where even-sized list expected
+
+(W) You gave a single reference where Perl was expecting a list with
+an even number of elements (for assignment to a hash). This
+usually means that you used the anon hash constructor when you meant 
+to use parens. In any case, a hash requires key/value B<pairs>.
+
+    %hash = { one => 1, two => 2, };   # WRONG
+    %hash = [ qw/ an anon array / ];   # WRONG
+    %hash = ( one => 1, two => 2, );   # right
+    %hash = qw( one 1 two 2 );                 # also fine
+
+=item Undefined value assigned to typeglob
+
+(W) An undefined value was assigned to a typeglob, a la C<*foo = undef>.
+This does nothing.  It's possible that you really mean C<undef *foo>.
+
+=item Use of reserved word "%s" is deprecated
+
+(D) The indicated bareword is a reserved word.  Future versions of perl
+may use it as a keyword, so you're better off either explicitly quoting
+the word in a manner appropriate for its context of use, or using a
+different name altogether.  The warning can be suppressed for subroutine
+names by either adding a C<&> prefix, or using a package qualifier,
+e.g. C<&our()>, or C<Foo::our()>.
+
+=item perl: warning: Setting locale failed.
+
+(S) The whole warning message will look something like:
+
+       perl: warning: Setting locale failed.
+       perl: warning: Please check that your locale settings:
+               LC_ALL = "En_US",
+               LANG = (unset)
+           are supported and installed on your system.
+       perl: warning: Falling back to the standard locale ("C").
+
+Exactly what were the failed locale settings varies.  In the above the
+settings were that the LC_ALL was "En_US" and the LANG had no value.
+This error means that Perl detected that you and/or your system
+administrator have set up the so-called variable system but Perl could
+not use those settings.  This was not dead serious, fortunately: there
+is a "default locale" called "C" that Perl can and will use, the
+script will be run.  Before you really fix the problem, however, you
+will get the same error message each time you run Perl.  How to really
+fix the problem can be found in L<perllocale/"LOCALE PROBLEMS">.
+
+=back
+
+
+=head1 Obsolete Diagnostics
+
+=over 4
+
+=item Can't mktemp()
+
+(F) The mktemp() routine failed for some reason while trying to process
+a B<-e> switch.  Maybe your /tmp partition is full, or clobbered.
+
+Removed because B<-e> doesn't use temporary files any more.
+
+=item Can't write to temp file for B<-e>: %s
+
+(F) The write routine failed for some reason while trying to process
+a B<-e> switch.  Maybe your /tmp partition is full, or clobbered.
+
+Removed because B<-e> doesn't use temporary files any more.
+
+=item Cannot open temporary file
+
+(F) The create routine failed for some reason while trying to process
+a B<-e> switch.  Maybe your /tmp partition is full, or clobbered.
+
+Removed because B<-e> doesn't use temporary files any more.
+
+=item regexp too big
+
+(F) The current implementation of regular expressions uses shorts as
+address offsets within a string.  Unfortunately this means that if
+the regular expression compiles to longer than 32767, it'll blow up.
+Usually when you want a regular expression this big, there is a better
+way to do it with multiple statements.  See L<perlre>.
+
+=back
+
+=head1 Configuration Changes
+
+You can use "Configure -Uinstallusrbinperl" which causes installperl
+to skip installing perl also as /usr/bin/perl.  This is useful if you
+prefer not to modify /usr/bin for some reason or another but harmful
+because many scripts assume to find Perl in /usr/bin/perl.
+
+=head1 BUGS
+
+If you find what you think is a bug, you might check the headers of
+recently posted articles in the comp.lang.perl.misc newsgroup.
+There may also be information at http://www.perl.com/perl/ , the Perl
+Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Make sure you trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to <F<perlbug@perl.com>> to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Gurusamy Sarathy <F<gsar@activestate.com>>, with many contributions
+from The Perl Porters.
+
+Send omissions or corrections to <F<perlbug@perl.com>>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl561delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl561delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl561delta.pod	(revision 14489)
@@ -0,0 +1,3661 @@
+=head1 NAME
+
+perl561delta - what's new for perl v5.6.x
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.005 release and the 5.6.1
+release.
+
+=head1 Summary of changes between 5.6.0 and 5.6.1
+
+This section contains a summary of the changes between the 5.6.0 release
+and the 5.6.1 release.  More details about the changes mentioned here
+may be found in the F<Changes> files that accompany the Perl source
+distribution.  See L<perlhack> for pointers to online resources where you
+can inspect the individual patches described by these changes.
+
+=head2 Security Issues
+
+suidperl will not run /bin/mail anymore, because some platforms have
+a /bin/mail that is vulnerable to buffer overflow attacks.
+
+Note that suidperl is neither built nor installed by default in
+any recent version of perl.  Use of suidperl is highly discouraged.
+If you think you need it, try alternatives such as sudo first.
+See http://www.courtesan.com/sudo/ .
+
+=head2 Core bug fixes
+
+This is not an exhaustive list.  It is intended to cover only the
+significant user-visible changes.
+
+=over
+
+=item C<UNIVERSAL::isa()>
+
+A bug in the caching mechanism used by C<UNIVERSAL::isa()> that affected
+base.pm has been fixed.  The bug has existed since the 5.005 releases,
+but wasn't tickled by base.pm in those releases.
+
+=item Memory leaks
+
+Various cases of memory leaks and attempts to access uninitialized memory
+have been cured.  See L</"Known Problems"> below for further issues.
+
+=item Numeric conversions
+
+Numeric conversions did not recognize changes in the string value
+properly in certain circumstances.
+
+In other situations, large unsigned numbers (those above 2**31) could
+sometimes lose their unsignedness, causing bogus results in arithmetic
+operations.
+
+Integer modulus on large unsigned integers sometimes returned
+incorrect values.
+
+Perl 5.6.0 generated "not a number" warnings on certain conversions where
+previous versions didn't.
+
+These problems have all been rectified.
+
+Infinity is now recognized as a number.
+
+=item qw(a\\b)
+
+In Perl 5.6.0, qw(a\\b) produced a string with two backslashes instead
+of one, in a departure from the behavior in previous versions.  The
+older behavior has been reinstated.  
+
+=item caller()
+
+caller() could cause core dumps in certain situations.  Carp was sometimes
+affected by this problem.
+
+=item Bugs in regular expressions
+
+Pattern matches on overloaded values are now handled correctly.
+
+Perl 5.6.0 parsed m/\x{ab}/ incorrectly, leading to spurious warnings.
+This has been corrected.
+
+The RE engine found in Perl 5.6.0 accidentally pessimised certain kinds
+of simple pattern matches.  These are now handled better.
+
+Regular expression debug output (whether through C<use re 'debug'>
+or via C<-Dr>) now looks better.
+
+Multi-line matches like C<"a\nxb\n" =~ /(?!\A)x/m> were flawed.  The
+bug has been fixed.
+
+Use of $& could trigger a core dump under some situations.  This
+is now avoided.
+
+Match variables $1 et al., weren't being unset when a pattern match
+was backtracking, and the anomaly showed up inside C</...(?{ ... }).../>
+etc.  These variables are now tracked correctly.
+
+pos() did not return the correct value within s///ge in earlier
+versions.  This is now handled correctly.
+
+=item "slurp" mode
+
+readline() on files opened in "slurp" mode could return an extra "" at
+the end in certain situations.  This has been corrected.
+
+=item Autovivification of symbolic references to special variables
+
+Autovivification of symbolic references of special variables described
+in L<perlvar> (as in C<${$num}>) was accidentally disabled.  This works
+again now.
+
+=item Lexical warnings 
+
+Lexical warnings now propagate correctly into C<eval "...">.
+
+C<use warnings qw(FATAL all)> did not work as intended.  This has been
+corrected.
+
+Lexical warnings could leak into other scopes in some situations.
+This is now fixed.
+
+warnings::enabled() now reports the state of $^W correctly if the caller
+isn't using lexical warnings.
+
+=item Spurious warnings and errors
+
+Perl 5.6.0 could emit spurious warnings about redefinition of dl_error()
+when statically building extensions into perl.  This has been corrected.
+
+"our" variables could result in bogus "Variable will not stay shared"
+warnings.  This is now fixed.
+
+"our" variables of the same name declared in two sibling blocks
+resulted in bogus warnings about "redeclaration" of the variables.
+The problem has been corrected.
+
+=item glob()
+
+Compatibility of the builtin glob() with old csh-based glob has been
+improved with the addition of GLOB_ALPHASORT option.  See C<File::Glob>.
+
+File::Glob::glob() has been renamed to File::Glob::bsd_glob()
+because the name clashes with the builtin glob().  The older
+name is still available for compatibility, but is deprecated.
+
+Spurious syntax errors generated in certain situations, when glob()
+caused File::Glob to be loaded for the first time, have been fixed.
+
+=item Tainting
+
+Some cases of inconsistent taint propagation (such as within hash
+values) have been fixed.
+
+The tainting behavior of sprintf() has been rationalized.  It does
+not taint the result of floating point formats anymore, making the
+behavior consistent with that of string interpolation.
+
+=item sort()
+
+Arguments to sort() weren't being provided the right wantarray() context.
+The comparison block is now run in scalar context, and the arguments to
+be sorted are always provided list context.
+
+sort() is also fully reentrant, in the sense that the sort function
+can itself call sort().  This did not work reliably in previous releases.
+
+=item #line directives
+
+#line directives now work correctly when they appear at the very
+beginning of C<eval "...">.
+
+=item Subroutine prototypes
+
+The (\&) prototype now works properly.
+
+=item map()
+
+map() could get pathologically slow when the result list it generates
+is larger than the source list.  The performance has been improved for
+common scenarios.
+
+=item Debugger
+
+Debugger exit code now reflects the script exit code.
+
+Condition C<"0"> in breakpoints is now treated correctly.
+
+The C<d> command now checks the line number.
+
+C<$.> is no longer corrupted by the debugger.
+
+All debugger output now correctly goes to the socket if RemotePort
+is set.
+
+=item PERL5OPT
+
+PERL5OPT can be set to more than one switch group.  Previously,
+it used to be limited to one group of options only.
+
+=item chop()
+
+chop(@list) in list context returned the characters chopped in reverse
+order.  This has been reversed to be in the right order.
+
+=item Unicode support
+
+Unicode support has seen a large number of incremental improvements,
+but continues to be highly experimental.  It is not expected to be
+fully supported in the 5.6.x maintenance releases.
+
+substr(), join(), repeat(), reverse(), quotemeta() and string
+concatenation were all handling Unicode strings incorrectly in
+Perl 5.6.0.  This has been corrected.
+
+Support for C<tr///CU> and C<tr///UC> etc., have been removed since
+we realized the interface is broken.  For similar functionality,
+see L<perlfunc/pack>.
+
+The Unicode Character Database has been updated to version 3.0.1
+with additions made available to the public as of August 30, 2000.
+
+The Unicode character classes \p{Blank} and \p{SpacePerl} have been
+added.  "Blank" is like C isblank(), that is, it contains only
+"horizontal whitespace" (the space character is, the newline isn't),
+and the "SpacePerl" is the Unicode equivalent of C<\s> (\p{Space}
+isn't, since that includes the vertical tabulator character, whereas
+C<\s> doesn't.)
+
+If you are experimenting with Unicode support in perl, the development
+versions of Perl may have more to offer.  In particular, I/O layers
+are now available in the development track, but not in the maintenance
+track, primarily to do backward compatibility issues.  Unicode support
+is also evolving rapidly on a daily basis in the development track--the
+maintenance track only reflects the most conservative of these changes.
+
+=item 64-bit support
+
+Support for 64-bit platforms has been improved, but continues to be
+experimental.  The level of support varies greatly among platforms.
+
+=item Compiler
+
+The B Compiler and its various backends have had many incremental
+improvements, but they continue to remain highly experimental.  Use in
+production environments is discouraged.
+
+The perlcc tool has been rewritten so that the user interface is much
+more like that of a C compiler.
+
+The perlbc tools has been removed.  Use C<perlcc -B> instead.
+
+=item Lvalue subroutines
+
+There have been various bugfixes to support lvalue subroutines better.
+However, the feature still remains experimental.
+
+=item IO::Socket
+
+IO::Socket::INET failed to open the specified port if the service
+name was not known.  It now correctly uses the supplied port number
+as is.
+
+=item File::Find
+
+File::Find now chdir()s correctly when chasing symbolic links.
+
+=item xsubpp
+
+xsubpp now tolerates embedded POD sections.
+
+=item C<no Module;>
+
+C<no Module;> does not produce an error even if Module does not have an
+unimport() method.  This parallels the behavior of C<use> vis-a-vis
+C<import>.
+
+=item Tests
+
+A large number of tests have been added.
+
+=back
+
+=head2 Core features
+
+untie() will now call an UNTIE() hook if it exists.  See L<perltie>
+for details.
+
+The C<-DT> command line switch outputs copious tokenizing information.
+See L<perlrun>.
+
+Arrays are now always interpolated in double-quotish strings.  Previously,
+C<"foo@bar.com"> used to be a fatal error at compile time, if an array
+C<@bar> was not used or declared.  This transitional behavior was
+intended to help migrate perl4 code, and is deemed to be no longer useful.
+See L</"Arrays now always interpolate into double-quoted strings">.
+
+keys(), each(), pop(), push(), shift(), splice() and unshift()
+can all be overridden now.
+
+C<my __PACKAGE__ $obj> now does the expected thing.
+
+=head2 Configuration issues
+
+On some systems (IRIX and Solaris among them) the system malloc is demonstrably
+better.  While the defaults haven't been changed in order to retain binary
+compatibility with earlier releases, you may be better off building perl
+with C<Configure -Uusemymalloc ...> as discussed in the F<INSTALL> file.
+
+C<Configure> has been enhanced in various ways:
+
+=over
+
+=item *
+
+Minimizes use of temporary files.
+
+=item *
+
+By default, does not link perl with libraries not used by it, such as
+the various dbm libraries.  SunOS 4.x hints preserve behavior on that
+platform.
+
+=item *
+
+Support for pdp11-style memory models has been removed due to obsolescence.
+
+=item *
+
+Building outside the source tree is supported on systems that have
+symbolic links. This is done by running
+
+    sh /path/to/source/Configure -Dmksymlinks ...
+    make all test install
+
+in a directory other than the perl source directory.  See F<INSTALL>.
+
+=item *
+
+C<Configure -S> can be run non-interactively.
+
+=back
+
+=head2 Documentation
+
+README.aix, README.solaris and README.macos have been added.
+README.posix-bc has been renamed to README.bs2000.  These are
+installed as L<perlaix>, L<perlsolaris>, L<perlmacos>, and
+L<perlbs2000> respectively.
+
+The following pod documents are brand new:
+
+    perlclib	Internal replacements for standard C library functions
+    perldebtut	Perl debugging tutorial
+    perlebcdic	Considerations for running Perl on EBCDIC platforms
+    perlnewmod	Perl modules: preparing a new module for distribution
+    perlrequick	Perl regular expressions quick start
+    perlretut	Perl regular expressions tutorial
+    perlutil	utilities packaged with the Perl distribution
+
+The F<INSTALL> file has been expanded to cover various issues, such as
+64-bit support.
+
+A longer list of contributors has been added to the source distribution.
+See the file C<AUTHORS>.
+
+Numerous other changes have been made to the included documentation and FAQs.
+
+=head2 Bundled modules
+
+The following modules have been added.
+
+=over
+
+=item B::Concise
+
+Walks Perl syntax tree, printing concise info about ops.  See L<B::Concise>.
+
+=item File::Temp
+
+Returns name and handle of a temporary file safely.  See L<File::Temp>.
+
+=item Pod::LaTeX
+
+Converts Pod data to formatted LaTeX.  See L<Pod::LaTeX>.
+
+=item Pod::Text::Overstrike
+
+Converts POD data to formatted overstrike text.  See L<Pod::Text::Overstrike>.
+
+=back
+
+The following modules have been upgraded.
+
+=over
+
+=item CGI
+
+CGI v2.752 is now included.
+
+=item CPAN
+
+CPAN v1.59_54 is now included.
+
+=item Class::Struct
+
+Various bugfixes have been added.
+
+=item DB_File
+
+DB_File v1.75 supports newer Berkeley DB versions, among other
+improvements.
+
+=item Devel::Peek
+
+Devel::Peek has been enhanced to support dumping of memory statistics,
+when perl is built with the included malloc().
+
+=item File::Find
+
+File::Find now supports pre and post-processing of the files in order
+to sort() them, etc.
+
+=item Getopt::Long
+
+Getopt::Long v2.25 is included.
+
+=item IO::Poll
+
+Various bug fixes have been included.
+
+=item IPC::Open3
+
+IPC::Open3 allows use of numeric file descriptors.
+
+=item Math::BigFloat
+
+The fmod() function supports modulus operations.  Various bug fixes
+have also been included.
+
+=item Math::Complex
+
+Math::Complex handles inf, NaN etc., better.
+
+=item Net::Ping
+
+ping() could fail on odd number of data bytes, and when the echo service
+isn't running.  This has been corrected.
+
+=item Opcode
+
+A memory leak has been fixed.
+
+=item Pod::Parser
+
+Version 1.13 of the Pod::Parser suite is included.
+
+=item Pod::Text
+
+Pod::Text and related modules have been upgraded to the versions
+in podlators suite v2.08.
+
+=item SDBM_File
+
+On dosish platforms, some keys went missing because of lack of support for
+files with "holes".  A workaround for the problem has been added.
+
+=item Sys::Syslog
+
+Various bug fixes have been included.
+
+=item Tie::RefHash
+
+Now supports Tie::RefHash::Nestable to automagically tie hashref values.
+
+=item Tie::SubstrHash
+
+Various bug fixes have been included.
+
+=back
+
+=head2 Platform-specific improvements
+
+The following new ports are now available.
+
+=over
+
+=item NCR MP-RAS
+
+=item NonStop-UX
+
+=back
+
+Perl now builds under Amdahl UTS.
+
+Perl has also been verified to build under Amiga OS.
+
+Support for EPOC has been much improved.  See README.epoc.
+
+Building perl with -Duseithreads or -Duse5005threads now works
+under HP-UX 10.20 (previously it only worked under 10.30 or later).
+You will need a thread library package installed.  See README.hpux.
+
+Long doubles should now work under Linux.
+
+Mac OS Classic is now supported in the mainstream source package.
+See README.macos.
+
+Support for MPE/iX has been updated.  See README.mpeix.
+
+Support for OS/2 has been improved.  See C<os2/Changes> and README.os2.
+
+Dynamic loading on z/OS (formerly OS/390) has been improved.  See
+README.os390.
+
+Support for VMS has seen many incremental improvements, including
+better support for operators like backticks and system(), and better
+%ENV handling.  See C<README.vms> and L<perlvms>.
+
+Support for Stratus VOS has been improved.  See C<vos/Changes> and README.vos.
+
+Support for Windows has been improved.
+
+=over
+
+=item *
+
+fork() emulation has been improved in various ways, but still continues
+to be experimental.  See L<perlfork> for known bugs and caveats.
+
+=item *
+
+%SIG has been enabled under USE_ITHREADS, but its use is completely
+unsupported under all configurations.
+
+=item *
+
+Borland C++ v5.5 is now a supported compiler that can build Perl.
+However, the generated binaries continue to be incompatible with those
+generated by the other supported compilers (GCC and Visual C++).
+
+=item *
+
+Non-blocking waits for child processes (or pseudo-processes) are
+supported via C<waitpid($pid, &POSIX::WNOHANG)>.
+
+=item *
+
+A memory leak in accept() has been fixed.
+
+=item *
+
+wait(), waitpid() and backticks now return the correct exit status under
+Windows 9x.
+
+=item *
+
+Trailing new %ENV entries weren't propagated to child processes.  This
+is now fixed.
+
+=item *
+
+Current directory entries in %ENV are now correctly propagated to child
+processes.
+
+=item *
+
+Duping socket handles with open(F, ">&MYSOCK") now works under Windows 9x.
+
+=item *
+
+The makefiles now provide a single switch to bulk-enable all the features
+enabled in ActiveState ActivePerl (a popular binary distribution).
+
+=item *
+
+Win32::GetCwd() correctly returns C:\ instead of C: when at the drive root.
+Other bugs in chdir() and Cwd::cwd() have also been fixed.
+
+=item *
+
+fork() correctly returns undef and sets EAGAIN when it runs out of
+pseudo-process handles.
+
+=item *
+
+ExtUtils::MakeMaker now uses $ENV{LIB} to search for libraries.
+
+=item *
+
+UNC path handling is better when perl is built to support fork().
+
+=item *
+
+A handle leak in socket handling has been fixed.
+
+=item *
+
+send() works from within a pseudo-process.
+
+=back
+
+Unless specifically qualified otherwise, the remainder of this document
+covers changes between the 5.005 and 5.6.0 releases.
+
+=head1 Core Enhancements
+
+=head2 Interpreter cloning, threads, and concurrency
+
+Perl 5.6.0 introduces the beginnings of support for running multiple
+interpreters concurrently in different threads.  In conjunction with
+the perl_clone() API call, which can be used to selectively duplicate
+the state of any given interpreter, it is possible to compile a
+piece of code once in an interpreter, clone that interpreter
+one or more times, and run all the resulting interpreters in distinct
+threads.
+
+On the Windows platform, this feature is used to emulate fork() at the
+interpreter level.  See L<perlfork> for details about that.
+
+This feature is still in evolution.  It is eventually meant to be used
+to selectively clone a subroutine and data reachable from that
+subroutine in a separate interpreter and run the cloned subroutine
+in a separate thread.  Since there is no shared data between the
+interpreters, little or no locking will be needed (unless parts of
+the symbol table are explicitly shared).  This is obviously intended
+to be an easy-to-use replacement for the existing threads support.
+
+Support for cloning interpreters and interpreter concurrency can be
+enabled using the -Dusethreads Configure option (see win32/Makefile for
+how to enable it on Windows.)  The resulting perl executable will be
+functionally identical to one that was built with -Dmultiplicity, but
+the perl_clone() API call will only be available in the former.
+
+-Dusethreads enables the cpp macro USE_ITHREADS by default, which in turn
+enables Perl source code changes that provide a clear separation between
+the op tree and the data it operates with.  The former is immutable, and
+can therefore be shared between an interpreter and all of its clones,
+while the latter is considered local to each interpreter, and is therefore
+copied for each clone.
+
+Note that building Perl with the -Dusemultiplicity Configure option
+is adequate if you wish to run multiple B<independent> interpreters
+concurrently in different threads.  -Dusethreads only provides the
+additional functionality of the perl_clone() API call and other
+support for running B<cloned> interpreters concurrently.
+
+    NOTE: This is an experimental feature.  Implementation details are
+    subject to change.
+
+=head2 Lexically scoped warning categories
+
+You can now control the granularity of warnings emitted by perl at a finer
+level using the C<use warnings> pragma.  L<warnings> and L<perllexwarn>
+have copious documentation on this feature.
+
+=head2 Unicode and UTF-8 support
+
+Perl now uses UTF-8 as its internal representation for character
+strings.  The C<utf8> and C<bytes> pragmas are used to control this support
+in the current lexical scope.  See L<perlunicode>, L<utf8> and L<bytes> for
+more information.
+
+This feature is expected to evolve quickly to support some form of I/O
+disciplines that can be used to specify the kind of input and output data
+(bytes or characters).  Until that happens, additional modules from CPAN
+will be needed to complete the toolkit for dealing with Unicode.
+
+    NOTE: This should be considered an experimental feature.  Implementation
+    details are subject to change.
+
+=head2 Support for interpolating named characters
+
+The new C<\N> escape interpolates named characters within strings.
+For example, C<"Hi! \N{WHITE SMILING FACE}"> evaluates to a string
+with a Unicode smiley face at the end.
+
+=head2 "our" declarations
+
+An "our" declaration introduces a value that can be best understood
+as a lexically scoped symbolic alias to a global variable in the
+package that was current where the variable was declared.  This is
+mostly useful as an alternative to the C<vars> pragma, but also provides
+the opportunity to introduce typing and other attributes for such
+variables.  See L<perlfunc/our>.
+
+=head2 Support for strings represented as a vector of ordinals
+
+Literals of the form C<v1.2.3.4> are now parsed as a string composed
+of characters with the specified ordinals.  This is an alternative, more
+readable way to construct (possibly Unicode) strings instead of
+interpolating characters, as in C<"\x{1}\x{2}\x{3}\x{4}">.  The leading
+C<v> may be omitted if there are more than two ordinals, so C<1.2.3> is
+parsed the same as C<v1.2.3>.
+
+Strings written in this form are also useful to represent version "numbers".
+It is easy to compare such version "numbers" (which are really just plain
+strings) using any of the usual string comparison operators C<eq>, C<ne>,
+C<lt>, C<gt>, etc., or perform bitwise string operations on them using C<|>,
+C<&>, etc.
+
+In conjunction with the new C<$^V> magic variable (which contains
+the perl version as a string), such literals can be used as a readable way
+to check if you're running a particular version of Perl:
+
+    # this will parse in older versions of Perl also
+    if ($^V and $^V gt v5.6.0) {
+        # new features supported
+    }
+
+C<require> and C<use> also have some special magic to support such literals.
+They will be interpreted as a version rather than as a module name:
+
+    require v5.6.0;		# croak if $^V lt v5.6.0
+    use v5.6.0;			# same, but croaks at compile-time
+
+Alternatively, the C<v> may be omitted if there is more than one dot:
+
+    require 5.6.0;
+    use 5.6.0;
+
+Also, C<sprintf> and C<printf> support the Perl-specific format flag C<%v>
+to print ordinals of characters in arbitrary strings:
+
+    printf "v%vd", $^V;		# prints current version, such as "v5.5.650"
+    printf "%*vX", ":", $addr;	# formats IPv6 address
+    printf "%*vb", " ", $bits;	# displays bitstring
+
+See L<perldata/"Scalar value constructors"> for additional information.
+
+=head2 Improved Perl version numbering system
+
+Beginning with Perl version 5.6.0, the version number convention has been
+changed to a "dotted integer" scheme that is more commonly found in open
+source projects.
+
+Maintenance versions of v5.6.0 will be released as v5.6.1, v5.6.2 etc.
+The next development series following v5.6.0 will be numbered v5.7.x,
+beginning with v5.7.0, and the next major production release following
+v5.6.0 will be v5.8.0.
+
+The English module now sets $PERL_VERSION to $^V (a string value) rather
+than C<$]> (a numeric value).  (This is a potential incompatibility.
+Send us a report via perlbug if you are affected by this.)
+
+The v1.2.3 syntax is also now legal in Perl.
+See L<Support for strings represented as a vector of ordinals> for more on that.
+
+To cope with the new versioning system's use of at least three significant
+digits for each version component, the method used for incrementing the
+subversion number has also changed slightly.  We assume that versions older
+than v5.6.0 have been incrementing the subversion component in multiples of
+10.  Versions after v5.6.0 will increment them by 1.  Thus, using the new
+notation, 5.005_03 is the "same" as v5.5.30, and the first maintenance
+version following v5.6.0 will be v5.6.1 (which should be read as being
+equivalent to a floating point value of 5.006_001 in the older format,
+stored in C<$]>).
+
+=head2 New syntax for declaring subroutine attributes
+
+Formerly, if you wanted to mark a subroutine as being a method call or
+as requiring an automatic lock() when it is entered, you had to declare
+that with a C<use attrs> pragma in the body of the subroutine.
+That can now be accomplished with declaration syntax, like this:
+
+    sub mymethod : locked method;
+    ...
+    sub mymethod : locked method {
+	...
+    }
+
+    sub othermethod :locked :method;
+    ...
+    sub othermethod :locked :method {
+	...
+    }
+
+
+(Note how only the first C<:> is mandatory, and whitespace surrounding
+the C<:> is optional.)
+
+F<AutoSplit.pm> and F<SelfLoader.pm> have been updated to keep the attributes
+with the stubs they provide.  See L<attributes>.
+
+=head2 File and directory handles can be autovivified
+
+Similar to how constructs such as C<< $x->[0] >> autovivify a reference,
+handle constructors (open(), opendir(), pipe(), socketpair(), sysopen(),
+socket(), and accept()) now autovivify a file or directory handle
+if the handle passed to them is an uninitialized scalar variable.  This
+allows the constructs such as C<open(my $fh, ...)> and C<open(local $fh,...)>
+to be used to create filehandles that will conveniently be closed
+automatically when the scope ends, provided there are no other references
+to them.  This largely eliminates the need for typeglobs when opening
+filehandles that must be passed around, as in the following example:
+
+    sub myopen {
+        open my $fh, "@_"
+	     or die "Can't open '@_': $!";
+	return $fh;
+    }
+
+    {
+        my $f = myopen("</etc/motd");
+	print <$f>;
+	# $f implicitly closed here
+    }
+
+=head2 open() with more than two arguments
+
+If open() is passed three arguments instead of two, the second argument
+is used as the mode and the third argument is taken to be the file name.
+This is primarily useful for protecting against unintended magic behavior
+of the traditional two-argument form.  See L<perlfunc/open>.
+
+=head2 64-bit support
+
+Any platform that has 64-bit integers either
+
+	(1) natively as longs or ints
+	(2) via special compiler flags
+	(3) using long long or int64_t
+
+is able to use "quads" (64-bit integers) as follows:
+
+=over 4
+
+=item *
+
+constants (decimal, hexadecimal, octal, binary) in the code 
+
+=item *
+
+arguments to oct() and hex()
+
+=item *
+
+arguments to print(), printf() and sprintf() (flag prefixes ll, L, q)
+
+=item *
+
+printed as such
+
+=item *
+
+pack() and unpack() "q" and "Q" formats
+
+=item *
+
+in basic arithmetics: + - * / % (NOTE: operating close to the limits
+of the integer values may produce surprising results)
+
+=item *
+
+in bit arithmetics: & | ^ ~ << >> (NOTE: these used to be forced 
+to be 32 bits wide but now operate on the full native width.)
+
+=item *
+
+vec()
+
+=back
+
+Note that unless you have the case (a) you will have to configure
+and compile Perl using the -Duse64bitint Configure flag.
+
+    NOTE: The Configure flags -Duselonglong and -Duse64bits have been
+    deprecated.  Use -Duse64bitint instead.
+
+There are actually two modes of 64-bitness: the first one is achieved
+using Configure -Duse64bitint and the second one using Configure
+-Duse64bitall.  The difference is that the first one is minimal and
+the second one maximal.  The first works in more places than the second.
+
+The C<use64bitint> does only as much as is required to get 64-bit
+integers into Perl (this may mean, for example, using "long longs")
+while your memory may still be limited to 2 gigabytes (because your
+pointers could still be 32-bit).  Note that the name C<64bitint> does
+not imply that your C compiler will be using 64-bit C<int>s (it might,
+but it doesn't have to): the C<use64bitint> means that you will be
+able to have 64 bits wide scalar values.
+
+The C<use64bitall> goes all the way by attempting to switch also
+integers (if it can), longs (and pointers) to being 64-bit.  This may
+create an even more binary incompatible Perl than -Duse64bitint: the
+resulting executable may not run at all in a 32-bit box, or you may
+have to reboot/reconfigure/rebuild your operating system to be 64-bit
+aware.
+
+Natively 64-bit systems like Alpha and Cray need neither -Duse64bitint
+nor -Duse64bitall.
+
+Last but not least: note that due to Perl's habit of always using
+floating point numbers, the quads are still not true integers.
+When quads overflow their limits (0...18_446_744_073_709_551_615 unsigned,
+-9_223_372_036_854_775_808...9_223_372_036_854_775_807 signed), they
+are silently promoted to floating point numbers, after which they will
+start losing precision (in their lower digits).
+
+    NOTE: 64-bit support is still experimental on most platforms.
+    Existing support only covers the LP64 data model.  In particular, the
+    LLP64 data model is not yet supported.  64-bit libraries and system
+    APIs on many platforms have not stabilized--your mileage may vary.
+
+=head2 Large file support
+
+If you have filesystems that support "large files" (files larger than
+2 gigabytes), you may now also be able to create and access them from
+Perl.
+
+    NOTE: The default action is to enable large file support, if
+    available on the platform.
+
+If the large file support is on, and you have a Fcntl constant
+O_LARGEFILE, the O_LARGEFILE is automatically added to the flags
+of sysopen().
+
+Beware that unless your filesystem also supports "sparse files" seeking
+to umpteen petabytes may be inadvisable.
+
+Note that in addition to requiring a proper file system to do large
+files you may also need to adjust your per-process (or your
+per-system, or per-process-group, or per-user-group) maximum filesize
+limits before running Perl scripts that try to handle large files,
+especially if you intend to write such files.
+
+Finally, in addition to your process/process group maximum filesize
+limits, you may have quota limits on your filesystems that stop you
+(your user id or your user group id) from using large files.
+
+Adjusting your process/user/group/file system/operating system limits
+is outside the scope of Perl core language.  For process limits, you
+may try increasing the limits using your shell's limits/limit/ulimit
+command before running Perl.  The BSD::Resource extension (not
+included with the standard Perl distribution) may also be of use, it
+offers the getrlimit/setrlimit interface that can be used to adjust
+process resource usage limits, including the maximum filesize limit.
+
+=head2 Long doubles
+
+In some systems you may be able to use long doubles to enhance the
+range and precision of your double precision floating point numbers
+(that is, Perl's numbers).  Use Configure -Duselongdouble to enable
+this support (if it is available).
+
+=head2 "more bits"
+
+You can "Configure -Dusemorebits" to turn on both the 64-bit support
+and the long double support.
+
+=head2 Enhanced support for sort() subroutines
+
+Perl subroutines with a prototype of C<($$)>, and XSUBs in general, can
+now be used as sort subroutines.  In either case, the two elements to
+be compared are passed as normal parameters in @_.  See L<perlfunc/sort>.
+
+For unprototyped sort subroutines, the historical behavior of passing 
+the elements to be compared as the global variables $a and $b remains
+unchanged.
+
+=head2 C<sort $coderef @foo> allowed
+
+sort() did not accept a subroutine reference as the comparison
+function in earlier versions.  This is now permitted.
+
+=head2 File globbing implemented internally
+
+Perl now uses the File::Glob implementation of the glob() operator
+automatically.  This avoids using an external csh process and the
+problems associated with it.
+
+    NOTE: This is currently an experimental feature.  Interfaces and
+    implementation are subject to change.
+
+=head2 Support for CHECK blocks
+
+In addition to C<BEGIN>, C<INIT>, C<END>, C<DESTROY> and C<AUTOLOAD>,
+subroutines named C<CHECK> are now special.  These are queued up during
+compilation and behave similar to END blocks, except they are called at
+the end of compilation rather than at the end of execution.  They cannot
+be called directly.
+
+=head2 POSIX character class syntax [: :] supported
+
+For example to match alphabetic characters use /[[:alpha:]]/.
+See L<perlre> for details.
+
+=head2 Better pseudo-random number generator
+
+In 5.005_0x and earlier, perl's rand() function used the C library
+rand(3) function.  As of 5.005_52, Configure tests for drand48(),
+random(), and rand() (in that order) and picks the first one it finds.
+
+These changes should result in better random numbers from rand().
+
+=head2 Improved C<qw//> operator
+
+The C<qw//> operator is now evaluated at compile time into a true list
+instead of being replaced with a run time call to C<split()>.  This
+removes the confusing misbehaviour of C<qw//> in scalar context, which
+had inherited that behaviour from split().
+
+Thus:
+
+    $foo = ($bar) = qw(a b c); print "$foo|$bar\n";
+
+now correctly prints "3|a", instead of "2|a".
+
+=head2 Better worst-case behavior of hashes
+
+Small changes in the hashing algorithm have been implemented in
+order to improve the distribution of lower order bits in the
+hashed value.  This is expected to yield better performance on
+keys that are repeated sequences.
+
+=head2 pack() format 'Z' supported
+
+The new format type 'Z' is useful for packing and unpacking null-terminated
+strings.  See L<perlfunc/"pack">.
+
+=head2 pack() format modifier '!' supported
+
+The new format type modifier '!' is useful for packing and unpacking
+native shorts, ints, and longs.  See L<perlfunc/"pack">.
+
+=head2 pack() and unpack() support counted strings
+
+The template character '/' can be used to specify a counted string
+type to be packed or unpacked.  See L<perlfunc/"pack">.
+
+=head2 Comments in pack() templates
+
+The '#' character in a template introduces a comment up to
+end of the line.  This facilitates documentation of pack()
+templates.
+
+=head2 Weak references
+
+In previous versions of Perl, you couldn't cache objects so as
+to allow them to be deleted if the last reference from outside 
+the cache is deleted.  The reference in the cache would hold a
+reference count on the object and the objects would never be
+destroyed.
+
+Another familiar problem is with circular references.  When an
+object references itself, its reference count would never go
+down to zero, and it would not get destroyed until the program
+is about to exit.
+
+Weak references solve this by allowing you to "weaken" any
+reference, that is, make it not count towards the reference count.
+When the last non-weak reference to an object is deleted, the object
+is destroyed and all the weak references to the object are
+automatically undef-ed.
+
+To use this feature, you need the Devel::WeakRef package from CPAN, which
+contains additional documentation.
+
+    NOTE: This is an experimental feature.  Details are subject to change.  
+
+=head2 Binary numbers supported
+
+Binary numbers are now supported as literals, in s?printf formats, and
+C<oct()>:
+
+    $answer = 0b101010;
+    printf "The answer is: %b\n", oct("0b101010");
+
+=head2 Lvalue subroutines
+
+Subroutines can now return modifiable lvalues.
+See L<perlsub/"Lvalue subroutines">.
+
+    NOTE: This is an experimental feature.  Details are subject to change.
+
+=head2 Some arrows may be omitted in calls through references
+
+Perl now allows the arrow to be omitted in many constructs
+involving subroutine calls through references.  For example,
+C<< $foo[10]->('foo') >> may now be written C<$foo[10]('foo')>.
+This is rather similar to how the arrow may be omitted from
+C<< $foo[10]->{'foo'} >>.  Note however, that the arrow is still
+required for C<< foo(10)->('bar') >>.
+
+=head2 Boolean assignment operators are legal lvalues
+
+Constructs such as C<($a ||= 2) += 1> are now allowed.
+
+=head2 exists() is supported on subroutine names
+
+The exists() builtin now works on subroutine names.  A subroutine
+is considered to exist if it has been declared (even if implicitly).
+See L<perlfunc/exists> for examples.
+
+=head2 exists() and delete() are supported on array elements
+
+The exists() and delete() builtins now work on simple arrays as well.
+The behavior is similar to that on hash elements.
+
+exists() can be used to check whether an array element has been
+initialized.  This avoids autovivifying array elements that don't exist.
+If the array is tied, the EXISTS() method in the corresponding tied
+package will be invoked.
+
+delete() may be used to remove an element from the array and return
+it.  The array element at that position returns to its uninitialized
+state, so that testing for the same element with exists() will return
+false.  If the element happens to be the one at the end, the size of
+the array also shrinks up to the highest element that tests true for
+exists(), or 0 if none such is found.  If the array is tied, the DELETE() 
+method in the corresponding tied package will be invoked.
+
+See L<perlfunc/exists> and L<perlfunc/delete> for examples.
+
+=head2 Pseudo-hashes work better
+
+Dereferencing some types of reference values in a pseudo-hash,
+such as C<< $ph->{foo}[1] >>, was accidentally disallowed.  This has
+been corrected.
+
+When applied to a pseudo-hash element, exists() now reports whether
+the specified value exists, not merely if the key is valid.
+
+delete() now works on pseudo-hashes.  When given a pseudo-hash element
+or slice it deletes the values corresponding to the keys (but not the keys
+themselves).  See L<perlref/"Pseudo-hashes: Using an array as a hash">.
+
+Pseudo-hash slices with constant keys are now optimized to array lookups
+at compile-time.
+
+List assignments to pseudo-hash slices are now supported.
+
+The C<fields> pragma now provides ways to create pseudo-hashes, via
+fields::new() and fields::phash().  See L<fields>.
+
+    NOTE: The pseudo-hash data type continues to be experimental.
+    Limiting oneself to the interface elements provided by the
+    fields pragma will provide protection from any future changes.
+
+=head2 Automatic flushing of output buffers
+
+fork(), exec(), system(), qx//, and pipe open()s now flush buffers
+of all files opened for output when the operation was attempted.  This
+mostly eliminates confusing buffering mishaps suffered by users unaware
+of how Perl internally handles I/O.
+
+This is not supported on some platforms like Solaris where a suitably
+correct implementation of fflush(NULL) isn't available.
+
+=head2 Better diagnostics on meaningless filehandle operations
+
+Constructs such as C<< open(<FH>) >> and C<< close(<FH>) >>
+are compile time errors.  Attempting to read from filehandles that
+were opened only for writing will now produce warnings (just as
+writing to read-only filehandles does).
+
+=head2 Where possible, buffered data discarded from duped input filehandle
+
+C<< open(NEW, "<&OLD") >> now attempts to discard any data that
+was previously read and buffered in C<OLD> before duping the handle.
+On platforms where doing this is allowed, the next read operation
+on C<NEW> will return the same data as the corresponding operation
+on C<OLD>.  Formerly, it would have returned the data from the start
+of the following disk block instead.
+
+=head2 eof() has the same old magic as <>
+
+C<eof()> would return true if no attempt to read from C<< <> >> had
+yet been made.  C<eof()> has been changed to have a little magic of its
+own, it now opens the C<< <> >> files.
+
+=head2 binmode() can be used to set :crlf and :raw modes
+
+binmode() now accepts a second argument that specifies a discipline
+for the handle in question.  The two pseudo-disciplines ":raw" and
+":crlf" are currently supported on DOS-derivative platforms.
+See L<perlfunc/"binmode"> and L<open>.
+
+=head2 C<-T> filetest recognizes UTF-8 encoded files as "text"
+
+The algorithm used for the C<-T> filetest has been enhanced to
+correctly identify UTF-8 content as "text".
+
+=head2 system(), backticks and pipe open now reflect exec() failure
+
+On Unix and similar platforms, system(), qx() and open(FOO, "cmd |")
+etc., are implemented via fork() and exec().  When the underlying
+exec() fails, earlier versions did not report the error properly,
+since the exec() happened to be in a different process.
+
+The child process now communicates with the parent about the
+error in launching the external command, which allows these
+constructs to return with their usual error value and set $!.
+
+=head2 Improved diagnostics
+
+Line numbers are no longer suppressed (under most likely circumstances)
+during the global destruction phase.
+
+Diagnostics emitted from code running in threads other than the main
+thread are now accompanied by the thread ID.
+
+Embedded null characters in diagnostics now actually show up.  They
+used to truncate the message in prior versions.
+
+$foo::a and $foo::b are now exempt from "possible typo" warnings only
+if sort() is encountered in package C<foo>.
+
+Unrecognized alphabetic escapes encountered when parsing quote
+constructs now generate a warning, since they may take on new
+semantics in later versions of Perl.
+
+Many diagnostics now report the internal operation in which the warning
+was provoked, like so:
+
+    Use of uninitialized value in concatenation (.) at (eval 1) line 1.
+    Use of uninitialized value in print at (eval 1) line 1.
+
+Diagnostics  that occur within eval may also report the file and line
+number where the eval is located, in addition to the eval sequence
+number and the line number within the evaluated text itself.  For
+example:
+
+    Not enough arguments for scalar at (eval 4)[newlib/perl5db.pl:1411] line 2, at EOF
+
+=head2 Diagnostics follow STDERR
+
+Diagnostic output now goes to whichever file the C<STDERR> handle
+is pointing at, instead of always going to the underlying C runtime
+library's C<stderr>.
+
+=head2 More consistent close-on-exec behavior
+
+On systems that support a close-on-exec flag on filehandles, the
+flag is now set for any handles created by pipe(), socketpair(),
+socket(), and accept(), if that is warranted by the value of $^F
+that may be in effect.  Earlier versions neglected to set the flag
+for handles created with these operators.  See L<perlfunc/pipe>,
+L<perlfunc/socketpair>, L<perlfunc/socket>, L<perlfunc/accept>,
+and L<perlvar/$^F>.
+
+=head2 syswrite() ease-of-use
+
+The length argument of C<syswrite()> has become optional.
+
+=head2 Better syntax checks on parenthesized unary operators
+
+Expressions such as:
+
+    print defined(&foo,&bar,&baz);
+    print uc("foo","bar","baz");
+    undef($foo,&bar);
+
+used to be accidentally allowed in earlier versions, and produced
+unpredictable behaviour.  Some produced ancillary warnings
+when used in this way; others silently did the wrong thing.
+
+The parenthesized forms of most unary operators that expect a single
+argument now ensure that they are not called with more than one
+argument, making the cases shown above syntax errors.  The usual
+behaviour of:
+
+    print defined &foo, &bar, &baz;
+    print uc "foo", "bar", "baz";
+    undef $foo, &bar;
+
+remains unchanged.  See L<perlop>.
+
+=head2 Bit operators support full native integer width
+
+The bit operators (& | ^ ~ << >>) now operate on the full native
+integral width (the exact size of which is available in $Config{ivsize}).
+For example, if your platform is either natively 64-bit or if Perl
+has been configured to use 64-bit integers, these operations apply
+to 8 bytes (as opposed to 4 bytes on 32-bit platforms).
+For portability, be sure to mask off the excess bits in the result of
+unary C<~>, e.g., C<~$x & 0xffffffff>.
+
+=head2 Improved security features
+
+More potentially unsafe operations taint their results for improved
+security.
+
+The C<passwd> and C<shell> fields returned by the getpwent(), getpwnam(),
+and getpwuid() are now tainted, because the user can affect their own
+encrypted password and login shell.
+
+The variable modified by shmread(), and messages returned by msgrcv()
+(and its object-oriented interface IPC::SysV::Msg::rcv) are also tainted,
+because other untrusted processes can modify messages and shared memory
+segments for their own nefarious purposes.
+
+=head2 More functional bareword prototype (*)
+
+Bareword prototypes have been rationalized to enable them to be used
+to override builtins that accept barewords and interpret them in
+a special way, such as C<require> or C<do>.
+
+Arguments prototyped as C<*> will now be visible within the subroutine
+as either a simple scalar or as a reference to a typeglob.
+See L<perlsub/Prototypes>.
+
+=head2 C<require> and C<do> may be overridden
+
+C<require> and C<do 'file'> operations may be overridden locally
+by importing subroutines of the same name into the current package 
+(or globally by importing them into the CORE::GLOBAL:: namespace).
+Overriding C<require> will also affect C<use>, provided the override
+is visible at compile-time.
+See L<perlsub/"Overriding Built-in Functions">.
+
+=head2 $^X variables may now have names longer than one character
+
+Formerly, $^X was synonymous with ${"\cX"}, but $^XY was a syntax
+error.  Now variable names that begin with a control character may be
+arbitrarily long.  However, for compatibility reasons, these variables
+I<must> be written with explicit braces, as C<${^XY}> for example.
+C<${^XYZ}> is synonymous with ${"\cXYZ"}.  Variable names with more
+than one control character, such as C<${^XY^Z}>, are illegal.
+
+The old syntax has not changed.  As before, `^X' may be either a
+literal control-X character or the two-character sequence `caret' plus
+`X'.  When braces are omitted, the variable name stops after the
+control character.  Thus C<"$^XYZ"> continues to be synonymous with
+C<$^X . "YZ"> as before.
+
+As before, lexical variables may not have names beginning with control
+characters.  As before, variables whose names begin with a control
+character are always forced to be in package `main'.  All such variables
+are reserved for future extensions, except those that begin with
+C<^_>, which may be used by user programs and are guaranteed not to
+acquire special meaning in any future version of Perl.
+
+=head2 New variable $^C reflects C<-c> switch
+
+C<$^C> has a boolean value that reflects whether perl is being run
+in compile-only mode (i.e. via the C<-c> switch).  Since
+BEGIN blocks are executed under such conditions, this variable
+enables perl code to determine whether actions that make sense
+only during normal running are warranted.  See L<perlvar>.
+
+=head2 New variable $^V contains Perl version as a string
+
+C<$^V> contains the Perl version number as a string composed of
+characters whose ordinals match the version numbers, i.e. v5.6.0.
+This may be used in string comparisons.
+
+See C<Support for strings represented as a vector of ordinals> for an
+example.
+
+=head2 Optional Y2K warnings
+
+If Perl is built with the cpp macro C<PERL_Y2KWARN> defined,
+it emits optional warnings when concatenating the number 19
+with another number.
+
+This behavior must be specifically enabled when running Configure.
+See F<INSTALL> and F<README.Y2K>.
+
+=head2 Arrays now always interpolate into double-quoted strings
+
+In double-quoted strings, arrays now interpolate, no matter what.  The
+behavior in earlier versions of perl 5 was that arrays would interpolate
+into strings if the array had been mentioned before the string was
+compiled, and otherwise Perl would raise a fatal compile-time error.
+In versions 5.000 through 5.003, the error was
+
+        Literal @example now requires backslash
+
+In versions 5.004_01 through 5.6.0, the error was
+
+        In string, @example now must be written as \@example
+
+The idea here was to get people into the habit of writing
+C<"fred\@example.com"> when they wanted a literal C<@> sign, just as
+they have always written C<"Give me back my \$5"> when they wanted a
+literal C<$> sign.
+
+Starting with 5.6.1, when Perl now sees an C<@> sign in a
+double-quoted string, it I<always> attempts to interpolate an array,
+regardless of whether or not the array has been used or declared
+already.  The fatal error has been downgraded to an optional warning:
+
+        Possible unintended interpolation of @example in string
+
+This warns you that C<"fred@example.com"> is going to turn into
+C<fred.com> if you don't backslash the C<@>.
+See http://www.plover.com/~mjd/perl/at-error.html for more details
+about the history here.
+
+=head2 @- and @+ provide starting/ending offsets of regex submatches
+
+The new magic variables @- and @+ provide the starting and ending
+offsets, respectively, of $&, $1, $2, etc.  See L<perlvar> for
+details.
+
+=head1 Modules and Pragmata
+
+=head2 Modules
+
+=over 4
+
+=item attributes
+
+While used internally by Perl as a pragma, this module also
+provides a way to fetch subroutine and variable attributes.
+See L<attributes>.
+
+=item B
+
+The Perl Compiler suite has been extensively reworked for this
+release.  More of the standard Perl testsuite passes when run
+under the Compiler, but there is still a significant way to
+go to achieve production quality compiled executables.
+
+    NOTE: The Compiler suite remains highly experimental.  The
+    generated code may not be correct, even when it manages to execute
+    without errors.
+
+=item Benchmark
+
+Overall, Benchmark results exhibit lower average error and better timing
+accuracy.  
+
+You can now run tests for I<n> seconds instead of guessing the right
+number of tests to run: e.g., timethese(-5, ...) will run each 
+code for at least 5 CPU seconds.  Zero as the "number of repetitions"
+means "for at least 3 CPU seconds".  The output format has also
+changed.  For example:
+
+   use Benchmark;$x=3;timethese(-5,{a=>sub{$x*$x},b=>sub{$x**2}})
+
+will now output something like this:
+
+   Benchmark: running a, b, each for at least 5 CPU seconds...
+            a:  5 wallclock secs ( 5.77 usr +  0.00 sys =  5.77 CPU) @ 200551.91/s (n=1156516)
+            b:  4 wallclock secs ( 5.00 usr +  0.02 sys =  5.02 CPU) @ 159605.18/s (n=800686)
+
+New features: "each for at least N CPU seconds...", "wallclock secs",
+and the "@ operations/CPU second (n=operations)".
+
+timethese() now returns a reference to a hash of Benchmark objects containing
+the test results, keyed on the names of the tests.
+
+timethis() now returns the iterations field in the Benchmark result object
+instead of 0.
+
+timethese(), timethis(), and the new cmpthese() (see below) can also take
+a format specifier of 'none' to suppress output.
+
+A new function countit() is just like timeit() except that it takes a
+TIME instead of a COUNT.
+
+A new function cmpthese() prints a chart comparing the results of each test
+returned from a timethese() call.  For each possible pair of tests, the
+percentage speed difference (iters/sec or seconds/iter) is shown.
+
+For other details, see L<Benchmark>.
+
+=item ByteLoader
+
+The ByteLoader is a dedicated extension to generate and run
+Perl bytecode.  See L<ByteLoader>.
+
+=item constant
+
+References can now be used.
+
+The new version also allows a leading underscore in constant names, but
+disallows a double leading underscore (as in "__LINE__").  Some other names
+are disallowed or warned against, including BEGIN, END, etc.  Some names
+which were forced into main:: used to fail silently in some cases; now they're
+fatal (outside of main::) and an optional warning (inside of main::).
+The ability to detect whether a constant had been set with a given name has
+been added.
+
+See L<constant>.
+
+=item charnames
+
+This pragma implements the C<\N> string escape.  See L<charnames>.
+
+=item Data::Dumper
+
+A C<Maxdepth> setting can be specified to avoid venturing
+too deeply into deep data structures.  See L<Data::Dumper>.
+
+The XSUB implementation of Dump() is now automatically called if the
+C<Useqq> setting is not in use.
+
+Dumping C<qr//> objects works correctly.
+
+=item DB
+
+C<DB> is an experimental module that exposes a clean abstraction
+to Perl's debugging API.
+
+=item DB_File
+
+DB_File can now be built with Berkeley DB versions 1, 2 or 3.
+See C<ext/DB_File/Changes>.
+
+=item Devel::DProf
+
+Devel::DProf, a Perl source code profiler has been added.  See
+L<Devel::DProf> and L<dprofpp>.
+
+=item Devel::Peek
+
+The Devel::Peek module provides access to the internal representation
+of Perl variables and data.  It is a data debugging tool for the XS programmer.
+
+=item Dumpvalue
+
+The Dumpvalue module provides screen dumps of Perl data.
+
+=item DynaLoader
+
+DynaLoader now supports a dl_unload_file() function on platforms that
+support unloading shared objects using dlclose().
+
+Perl can also optionally arrange to unload all extension shared objects
+loaded by Perl.  To enable this, build Perl with the Configure option
+C<-Accflags=-DDL_UNLOAD_ALL_AT_EXIT>.  (This maybe useful if you are
+using Apache with mod_perl.)
+
+=item English
+
+$PERL_VERSION now stands for C<$^V> (a string value) rather than for C<$]>
+(a numeric value).
+
+=item Env
+
+Env now supports accessing environment variables like PATH as array
+variables.
+
+=item Fcntl
+
+More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
+large file (more than 4GB) access (NOTE: the O_LARGEFILE is
+automatically added to sysopen() flags if large file support has been
+configured, as is the default), Free/Net/OpenBSD locking behaviour
+flags F_FLOCK, F_POSIX, Linux F_SHLCK, and O_ACCMODE: the combined
+mask of O_RDONLY, O_WRONLY, and O_RDWR.  The seek()/sysseek()
+constants SEEK_SET, SEEK_CUR, and SEEK_END are available via the
+C<:seek> tag.  The chmod()/stat() S_IF* constants and S_IS* functions
+are available via the C<:mode> tag.
+
+=item File::Compare
+
+A compare_text() function has been added, which allows custom
+comparison functions.  See L<File::Compare>.
+
+=item File::Find
+
+File::Find now works correctly when the wanted() function is either
+autoloaded or is a symbolic reference.
+
+A bug that caused File::Find to lose track of the working directory
+when pruning top-level directories has been fixed.
+
+File::Find now also supports several other options to control its
+behavior.  It can follow symbolic links if the C<follow> option is
+specified.  Enabling the C<no_chdir> option will make File::Find skip
+changing the current directory when walking directories.  The C<untaint>
+flag can be useful when running with taint checks enabled.
+
+See L<File::Find>.
+
+=item File::Glob
+
+This extension implements BSD-style file globbing.  By default,
+it will also be used for the internal implementation of the glob()
+operator.  See L<File::Glob>.
+
+=item File::Spec
+
+New methods have been added to the File::Spec module: devnull() returns
+the name of the null device (/dev/null on Unix) and tmpdir() the name of
+the temp directory (normally /tmp on Unix).  There are now also methods
+to convert between absolute and relative filenames: abs2rel() and
+rel2abs().  For compatibility with operating systems that specify volume
+names in file paths, the splitpath(), splitdir(), and catdir() methods
+have been added.
+
+=item File::Spec::Functions
+
+The new File::Spec::Functions modules provides a function interface
+to the File::Spec module.  Allows shorthand
+
+    $fullname = catfile($dir1, $dir2, $file);
+
+instead of
+
+    $fullname = File::Spec->catfile($dir1, $dir2, $file);
+
+=item Getopt::Long
+
+Getopt::Long licensing has changed to allow the Perl Artistic License
+as well as the GPL. It used to be GPL only, which got in the way of
+non-GPL applications that wanted to use Getopt::Long.
+
+Getopt::Long encourages the use of Pod::Usage to produce help
+messages. For example:
+
+    use Getopt::Long;
+    use Pod::Usage;
+    my $man = 0;
+    my $help = 0;
+    GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+    pod2usage(1) if $help;
+    pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+    __END__
+
+    =head1 NAME
+
+    sample - Using Getopt::Long and Pod::Usage
+
+    =head1 SYNOPSIS
+
+    sample [options] [file ...]
+
+     Options:
+       -help            brief help message
+       -man             full documentation
+
+    =head1 OPTIONS
+
+    =over 8
+
+    =item B<-help>
+
+    Print a brief help message and exits.
+
+    =item B<-man>
+
+    Prints the manual page and exits.
+
+    =back
+
+    =head1 DESCRIPTION
+
+    B<This program> will read the given input file(s) and do something
+    useful with the contents thereof.
+
+    =cut
+
+See L<Pod::Usage> for details.
+
+A bug that prevented the non-option call-back <> from being
+specified as the first argument has been fixed.
+
+To specify the characters < and > as option starters, use ><. Note,
+however, that changing option starters is strongly deprecated. 
+
+=item IO
+
+write() and syswrite() will now accept a single-argument
+form of the call, for consistency with Perl's syswrite().
+
+You can now create a TCP-based IO::Socket::INET without forcing
+a connect attempt.  This allows you to configure its options
+(like making it non-blocking) and then call connect() manually.
+
+A bug that prevented the IO::Socket::protocol() accessor
+from ever returning the correct value has been corrected.
+
+IO::Socket::connect now uses non-blocking IO instead of alarm()
+to do connect timeouts.
+
+IO::Socket::accept now uses select() instead of alarm() for doing
+timeouts.
+
+IO::Socket::INET->new now sets $! correctly on failure. $@ is
+still set for backwards compatibility.
+
+=item JPL
+
+Java Perl Lingo is now distributed with Perl.  See jpl/README
+for more information.
+
+=item lib
+
+C<use lib> now weeds out any trailing duplicate entries.
+C<no lib> removes all named entries.
+
+=item Math::BigInt
+
+The bitwise operations C<<< << >>>, C<<< >> >>>, C<&>, C<|>,
+and C<~> are now supported on bigints.
+
+=item Math::Complex
+
+The accessor methods Re, Im, arg, abs, rho, and theta can now also
+act as mutators (accessor $z->Re(), mutator $z->Re(3)).
+
+The class method C<display_format> and the corresponding object method
+C<display_format>, in addition to accepting just one argument, now can
+also accept a parameter hash.  Recognized keys of a parameter hash are
+C<"style">, which corresponds to the old one parameter case, and two
+new parameters: C<"format">, which is a printf()-style format string
+(defaults usually to C<"%.15g">, you can revert to the default by
+setting the format string to C<undef>) used for both parts of a
+complex number, and C<"polar_pretty_print"> (defaults to true),
+which controls whether an attempt is made to try to recognize small
+multiples and rationals of pi (2pi, pi/2) at the argument (angle) of a
+polar complex number.
+
+The potentially disruptive change is that in list context both methods
+now I<return the parameter hash>, instead of only the value of the
+C<"style"> parameter.
+
+=item Math::Trig
+
+A little bit of radial trigonometry (cylindrical and spherical),
+radial coordinate conversions, and the great circle distance were added.
+
+=item Pod::Parser, Pod::InputObjects
+
+Pod::Parser is a base class for parsing and selecting sections of
+pod documentation from an input stream.  This module takes care of
+identifying pod paragraphs and commands in the input and hands off the
+parsed paragraphs and commands to user-defined methods which are free
+to interpret or translate them as they see fit.
+
+Pod::InputObjects defines some input objects needed by Pod::Parser, and
+for advanced users of Pod::Parser that need more about a command besides
+its name and text.
+
+As of release 5.6.0 of Perl, Pod::Parser is now the officially sanctioned
+"base parser code" recommended for use by all pod2xxx translators.
+Pod::Text (pod2text) and Pod::Man (pod2man) have already been converted
+to use Pod::Parser and efforts to convert Pod::HTML (pod2html) are already
+underway.  For any questions or comments about pod parsing and translating
+issues and utilities, please use the pod-people@perl.org mailing list.
+
+For further information, please see L<Pod::Parser> and L<Pod::InputObjects>.
+
+=item Pod::Checker, podchecker
+
+This utility checks pod files for correct syntax, according to
+L<perlpod>.  Obvious errors are flagged as such, while warnings are
+printed for mistakes that can be handled gracefully.  The checklist is
+not complete yet.  See L<Pod::Checker>.
+
+=item Pod::ParseUtils, Pod::Find
+
+These modules provide a set of gizmos that are useful mainly for pod
+translators.  L<Pod::Find|Pod::Find> traverses directory structures and
+returns found pod files, along with their canonical names (like
+C<File::Spec::Unix>).  L<Pod::ParseUtils|Pod::ParseUtils> contains
+B<Pod::List> (useful for storing pod list information), B<Pod::Hyperlink>
+(for parsing the contents of C<LE<lt>E<gt>> sequences) and B<Pod::Cache>
+(for caching information about pod files, e.g., link nodes).
+
+=item Pod::Select, podselect
+
+Pod::Select is a subclass of Pod::Parser which provides a function
+named "podselect()" to filter out user-specified sections of raw pod
+documentation from an input stream. podselect is a script that provides
+access to Pod::Select from other scripts to be used as a filter.
+See L<Pod::Select>.
+
+=item Pod::Usage, pod2usage
+
+Pod::Usage provides the function "pod2usage()" to print usage messages for
+a Perl script based on its embedded pod documentation.  The pod2usage()
+function is generally useful to all script authors since it lets them
+write and maintain a single source (the pods) for documentation, thus
+removing the need to create and maintain redundant usage message text
+consisting of information already in the pods.
+
+There is also a pod2usage script which can be used from other kinds of
+scripts to print usage messages from pods (even for non-Perl scripts
+with pods embedded in comments).
+
+For details and examples, please see L<Pod::Usage>.
+
+=item Pod::Text and Pod::Man
+
+Pod::Text has been rewritten to use Pod::Parser.  While pod2text() is
+still available for backwards compatibility, the module now has a new
+preferred interface.  See L<Pod::Text> for the details.  The new Pod::Text
+module is easily subclassed for tweaks to the output, and two such
+subclasses (Pod::Text::Termcap for man-page-style bold and underlining
+using termcap information, and Pod::Text::Color for markup with ANSI color
+sequences) are now standard.
+
+pod2man has been turned into a module, Pod::Man, which also uses
+Pod::Parser.  In the process, several outstanding bugs related to quotes
+in section headers, quoting of code escapes, and nested lists have been
+fixed.  pod2man is now a wrapper script around this module.
+
+=item SDBM_File
+
+An EXISTS method has been added to this module (and sdbm_exists() has
+been added to the underlying sdbm library), so one can now call exists
+on an SDBM_File tied hash and get the correct result, rather than a
+runtime error.
+
+A bug that may have caused data loss when more than one disk block
+happens to be read from the database in a single FETCH() has been
+fixed.
+
+=item Sys::Syslog
+
+Sys::Syslog now uses XSUBs to access facilities from syslog.h so it
+no longer requires syslog.ph to exist. 
+
+=item Sys::Hostname
+
+Sys::Hostname now uses XSUBs to call the C library's gethostname() or
+uname() if they exist.
+
+=item Term::ANSIColor
+
+Term::ANSIColor is a very simple module to provide easy and readable
+access to the ANSI color and highlighting escape sequences, supported by
+most ANSI terminal emulators.  It is now included standard.
+
+=item Time::Local
+
+The timelocal() and timegm() functions used to silently return bogus
+results when the date fell outside the machine's integer range.  They
+now consistently croak() if the date falls in an unsupported range.
+
+=item Win32
+
+The error return value in list context has been changed for all functions
+that return a list of values.  Previously these functions returned a list
+with a single element C<undef> if an error occurred.  Now these functions
+return the empty list in these situations.  This applies to the following
+functions:
+
+    Win32::FsType
+    Win32::GetOSVersion
+
+The remaining functions are unchanged and continue to return C<undef> on
+error even in list context.
+
+The Win32::SetLastError(ERROR) function has been added as a complement
+to the Win32::GetLastError() function.
+
+The new Win32::GetFullPathName(FILENAME) returns the full absolute
+pathname for FILENAME in scalar context.  In list context it returns
+a two-element list containing the fully qualified directory name and
+the filename.  See L<Win32>.
+
+=item XSLoader
+
+The XSLoader extension is a simpler alternative to DynaLoader.
+See L<XSLoader>.
+
+=item DBM Filters
+
+A new feature called "DBM Filters" has been added to all the
+DBM modules--DB_File, GDBM_File, NDBM_File, ODBM_File, and SDBM_File.
+DBM Filters add four new methods to each DBM module:
+
+    filter_store_key
+    filter_store_value
+    filter_fetch_key
+    filter_fetch_value
+
+These can be used to filter key-value pairs before the pairs are
+written to the database or just after they are read from the database.
+See L<perldbmfilter> for further information.
+
+=back
+
+=head2 Pragmata
+
+C<use attrs> is now obsolete, and is only provided for
+backward-compatibility.  It's been replaced by the C<sub : attributes>
+syntax.  See L<perlsub/"Subroutine Attributes"> and L<attributes>.
+
+Lexical warnings pragma, C<use warnings;>, to control optional warnings.
+See L<perllexwarn>.
+
+C<use filetest> to control the behaviour of filetests (C<-r> C<-w>
+...).  Currently only one subpragma implemented, "use filetest
+'access';", that uses access(2) or equivalent to check permissions
+instead of using stat(2) as usual.  This matters in filesystems
+where there are ACLs (access control lists): the stat(2) might lie,
+but access(2) knows better.
+
+The C<open> pragma can be used to specify default disciplines for
+handle constructors (e.g. open()) and for qx//.  The two
+pseudo-disciplines C<:raw> and C<:crlf> are currently supported on
+DOS-derivative platforms (i.e. where binmode is not a no-op).
+See also L</"binmode() can be used to set :crlf and :raw modes">.
+
+=head1 Utility Changes
+
+=head2 dprofpp
+
+C<dprofpp> is used to display profile data generated using C<Devel::DProf>.
+See L<dprofpp>.
+
+=head2 find2perl
+
+The C<find2perl> utility now uses the enhanced features of the File::Find
+module.  The -depth and -follow options are supported.  Pod documentation
+is also included in the script.
+
+=head2 h2xs
+
+The C<h2xs> tool can now work in conjunction with C<C::Scan> (available
+from CPAN) to automatically parse real-life header files.  The C<-M>,
+C<-a>, C<-k>, and C<-o> options are new.
+
+=head2 perlcc
+
+C<perlcc> now supports the C and Bytecode backends.  By default,
+it generates output from the simple C backend rather than the
+optimized C backend.
+
+Support for non-Unix platforms has been improved.
+
+=head2 perldoc
+
+C<perldoc> has been reworked to avoid possible security holes.
+It will not by default let itself be run as the superuser, but you
+may still use the B<-U> switch to try to make it drop privileges
+first.
+
+=head2 The Perl Debugger
+
+Many bug fixes and enhancements were added to F<perl5db.pl>, the
+Perl debugger.  The help documentation was rearranged.  New commands
+include C<< < ? >>, C<< > ? >>, and C<< { ? >> to list out current
+actions, C<man I<docpage>> to run your doc viewer on some perl
+docset, and support for quoted options.  The help information was
+rearranged, and should be viewable once again if you're using B<less>
+as your pager.  A serious security hole was plugged--you should
+immediately remove all older versions of the Perl debugger as
+installed in previous releases, all the way back to perl3, from
+your system to avoid being bitten by this.
+
+=head1 Improved Documentation
+
+Many of the platform-specific README files are now part of the perl
+installation.  See L<perl> for the complete list.
+
+=over 4
+
+=item perlapi.pod
+
+The official list of public Perl API functions.
+
+=item perlboot.pod
+
+A tutorial for beginners on object-oriented Perl.
+
+=item perlcompile.pod
+
+An introduction to using the Perl Compiler suite.
+
+=item perldbmfilter.pod
+
+A howto document on using the DBM filter facility.
+
+=item perldebug.pod
+
+All material unrelated to running the Perl debugger, plus all
+low-level guts-like details that risked crushing the casual user
+of the debugger, have been relocated from the old manpage to the
+next entry below.
+
+=item perldebguts.pod
+
+This new manpage contains excessively low-level material not related
+to the Perl debugger, but slightly related to debugging Perl itself.
+It also contains some arcane internal details of how the debugging
+process works that may only be of interest to developers of Perl
+debuggers.
+
+=item perlfork.pod
+
+Notes on the fork() emulation currently available for the Windows platform.
+
+=item perlfilter.pod
+
+An introduction to writing Perl source filters.
+
+=item perlhack.pod
+
+Some guidelines for hacking the Perl source code.
+
+=item perlintern.pod
+
+A list of internal functions in the Perl source code.
+(List is currently empty.)
+
+=item perllexwarn.pod
+
+Introduction and reference information about lexically scoped
+warning categories.
+
+=item perlnumber.pod
+
+Detailed information about numbers as they are represented in Perl.
+
+=item perlopentut.pod
+
+A tutorial on using open() effectively.
+
+=item perlreftut.pod
+
+A tutorial that introduces the essentials of references.
+
+=item perltootc.pod
+
+A tutorial on managing class data for object modules.
+
+=item perltodo.pod
+
+Discussion of the most often wanted features that may someday be
+supported in Perl.
+
+=item perlunicode.pod
+
+An introduction to Unicode support features in Perl.
+
+=back
+
+=head1 Performance enhancements
+
+=head2 Simple sort() using { $a <=> $b } and the like are optimized
+
+Many common sort() operations using a simple inlined block are now
+optimized for faster performance.
+
+=head2 Optimized assignments to lexical variables
+
+Certain operations in the RHS of assignment statements have been
+optimized to directly set the lexical variable on the LHS,
+eliminating redundant copying overheads.
+
+=head2 Faster subroutine calls
+
+Minor changes in how subroutine calls are handled internally
+provide marginal improvements in performance.
+
+=head2 delete(), each(), values() and hash iteration are faster
+
+The hash values returned by delete(), each(), values() and hashes in a
+list context are the actual values in the hash, instead of copies.
+This results in significantly better performance, because it eliminates
+needless copying in most situations.
+
+=head1 Installation and Configuration Improvements
+
+=head2 -Dusethreads means something different
+
+The -Dusethreads flag now enables the experimental interpreter-based thread
+support by default.  To get the flavor of experimental threads that was in
+5.005 instead, you need to run Configure with "-Dusethreads -Duse5005threads".
+
+As of v5.6.0, interpreter-threads support is still lacking a way to
+create new threads from Perl (i.e., C<use Thread;> will not work with
+interpreter threads).  C<use Thread;> continues to be available when you
+specify the -Duse5005threads option to Configure, bugs and all.
+
+    NOTE: Support for threads continues to be an experimental feature.
+    Interfaces and implementation are subject to sudden and drastic changes.
+
+=head2 New Configure flags
+
+The following new flags may be enabled on the Configure command line
+by running Configure with C<-Dflag>.
+
+    usemultiplicity
+    usethreads useithreads	(new interpreter threads: no Perl API yet)
+    usethreads use5005threads	(threads as they were in 5.005)
+
+    use64bitint			(equal to now deprecated 'use64bits')
+    use64bitall
+
+    uselongdouble
+    usemorebits
+    uselargefiles
+    usesocks			(only SOCKS v5 supported)
+
+=head2 Threadedness and 64-bitness now more daring
+
+The Configure options enabling the use of threads and the use of
+64-bitness are now more daring in the sense that they no more have an
+explicit list of operating systems of known threads/64-bit
+capabilities.  In other words: if your operating system has the
+necessary APIs and datatypes, you should be able just to go ahead and
+use them, for threads by Configure -Dusethreads, and for 64 bits
+either explicitly by Configure -Duse64bitint or implicitly if your
+system has 64-bit wide datatypes.  See also L<"64-bit support">.
+
+=head2 Long Doubles
+
+Some platforms have "long doubles", floating point numbers of even
+larger range than ordinary "doubles".  To enable using long doubles for
+Perl's scalars, use -Duselongdouble.
+
+=head2 -Dusemorebits
+
+You can enable both -Duse64bitint and -Duselongdouble with -Dusemorebits.
+See also L<"64-bit support">.
+
+=head2 -Duselargefiles
+
+Some platforms support system APIs that are capable of handling large files
+(typically, files larger than two gigabytes).  Perl will try to use these
+APIs if you ask for -Duselargefiles.
+
+See L<"Large file support"> for more information. 
+
+=head2 installusrbinperl
+
+You can use "Configure -Uinstallusrbinperl" which causes installperl
+to skip installing perl also as /usr/bin/perl.  This is useful if you
+prefer not to modify /usr/bin for some reason or another but harmful
+because many scripts assume to find Perl in /usr/bin/perl.
+
+=head2 SOCKS support
+
+You can use "Configure -Dusesocks" which causes Perl to probe
+for the SOCKS proxy protocol library (v5, not v4).  For more information
+on SOCKS, see:
+
+    http://www.socks.nec.com/
+
+=head2 C<-A> flag
+
+You can "post-edit" the Configure variables using the Configure C<-A>
+switch.  The editing happens immediately after the platform specific
+hints files have been processed but before the actual configuration
+process starts.  Run C<Configure -h> to find out the full C<-A> syntax.
+
+=head2 Enhanced Installation Directories
+
+The installation structure has been enriched to improve the support
+for maintaining multiple versions of perl, to provide locations for
+vendor-supplied modules, scripts, and manpages, and to ease maintenance
+of locally-added modules, scripts, and manpages.  See the section on
+Installation Directories in the INSTALL file for complete details.
+For most users building and installing from source, the defaults should
+be fine.
+
+If you previously used C<Configure -Dsitelib> or C<-Dsitearch> to set
+special values for library directories, you might wish to consider using
+the new C<-Dsiteprefix> setting instead.  Also, if you wish to re-use a
+config.sh file from an earlier version of perl, you should be sure to
+check that Configure makes sensible choices for the new directories.
+See INSTALL for complete details.
+
+=head2 gcc automatically tried if 'cc' does not seem to be working
+
+In many platforms the vendor-supplied 'cc' is too stripped-down to
+build Perl (basically, the 'cc' doesn't do ANSI C).  If this seems
+to be the case and the 'cc' does not seem to be the GNU C compiler
+'gcc', an automatic attempt is made to find and use 'gcc' instead.
+
+=head1 Platform specific changes
+
+=head2 Supported platforms
+
+=over 4
+
+=item *
+
+The Mach CThreads (NEXTSTEP, OPENSTEP) are now supported by the Thread
+extension.
+
+=item *
+
+GNU/Hurd is now supported.
+
+=item *
+
+Rhapsody/Darwin is now supported.
+
+=item *
+
+EPOC is now supported (on Psion 5).
+
+=item *
+
+The cygwin port (formerly cygwin32) has been greatly improved.
+
+=back
+
+=head2 DOS
+
+=over 4
+
+=item *
+
+Perl now works with djgpp 2.02 (and 2.03 alpha).
+
+=item *
+
+Environment variable names are not converted to uppercase any more.
+
+=item *
+
+Incorrect exit codes from backticks have been fixed.
+
+=item *
+
+This port continues to use its own builtin globbing (not File::Glob).
+
+=back
+
+=head2 OS390 (OpenEdition MVS)
+
+Support for this EBCDIC platform has not been renewed in this release.
+There are difficulties in reconciling Perl's standardization on UTF-8
+as its internal representation for characters with the EBCDIC character
+set, because the two are incompatible.
+
+It is unclear whether future versions will renew support for this
+platform, but the possibility exists.
+
+=head2 VMS
+
+Numerous revisions and extensions to configuration, build, testing, and
+installation process to accommodate core changes and VMS-specific options.
+
+Expand %ENV-handling code to allow runtime mapping to logical names,
+CLI symbols, and CRTL environ array.
+
+Extension of subprocess invocation code to accept filespecs as command
+"verbs".
+
+Add to Perl command line processing the ability to use default file types and
+to recognize Unix-style C<2E<gt>&1>.
+
+Expansion of File::Spec::VMS routines, and integration into ExtUtils::MM_VMS.
+
+Extension of ExtUtils::MM_VMS to handle complex extensions more flexibly.
+
+Barewords at start of Unix-syntax paths may be treated as text rather than
+only as logical names.
+
+Optional secure translation of several logical names used internally by Perl.
+
+Miscellaneous bugfixing and porting of new core code to VMS.
+
+Thanks are gladly extended to the many people who have contributed VMS
+patches, testing, and ideas.
+
+=head2 Win32
+
+Perl can now emulate fork() internally, using multiple interpreters running
+in different concurrent threads.  This support must be enabled at build
+time.  See L<perlfork> for detailed information.
+
+When given a pathname that consists only of a drivename, such as C<A:>,
+opendir() and stat() now use the current working directory for the drive
+rather than the drive root.
+
+The builtin XSUB functions in the Win32:: namespace are documented.  See
+L<Win32>.
+
+$^X now contains the full path name of the running executable.
+
+A Win32::GetLongPathName() function is provided to complement
+Win32::GetFullPathName() and Win32::GetShortPathName().  See L<Win32>.
+
+POSIX::uname() is supported.
+
+system(1,...) now returns true process IDs rather than process
+handles.  kill() accepts any real process id, rather than strictly
+return values from system(1,...).
+
+For better compatibility with Unix, C<kill(0, $pid)> can now be used to
+test whether a process exists.
+
+The C<Shell> module is supported.
+
+Better support for building Perl under command.com in Windows 95
+has been added.
+
+Scripts are read in binary mode by default to allow ByteLoader (and
+the filter mechanism in general) to work properly.  For compatibility,
+the DATA filehandle will be set to text mode if a carriage return is
+detected at the end of the line containing the __END__ or __DATA__
+token; if not, the DATA filehandle will be left open in binary mode.
+Earlier versions always opened the DATA filehandle in text mode.
+
+The glob() operator is implemented via the C<File::Glob> extension,
+which supports glob syntax of the C shell.  This increases the flexibility
+of the glob() operator, but there may be compatibility issues for
+programs that relied on the older globbing syntax.  If you want to
+preserve compatibility with the older syntax, you might want to run
+perl with C<-MFile::DosGlob>.  For details and compatibility information,
+see L<File::Glob>.
+
+=head1 Significant bug fixes
+
+=head2 <HANDLE> on empty files
+
+With C<$/> set to C<undef>, "slurping" an empty file returns a string of
+zero length (instead of C<undef>, as it used to) the first time the
+HANDLE is read after C<$/> is set to C<undef>.  Further reads yield
+C<undef>.
+
+This means that the following will append "foo" to an empty file (it used
+to do nothing):
+
+    perl -0777 -pi -e 's/^/foo/' empty_file
+
+The behaviour of:
+
+    perl -pi -e 's/^/foo/' empty_file
+
+is unchanged (it continues to leave the file empty).
+
+=head2 C<eval '...'> improvements
+
+Line numbers (as reflected by caller() and most diagnostics) within
+C<eval '...'> were often incorrect where here documents were involved.
+This has been corrected.
+
+Lexical lookups for variables appearing in C<eval '...'> within
+functions that were themselves called within an C<eval '...'> were
+searching the wrong place for lexicals.  The lexical search now
+correctly ends at the subroutine's block boundary.
+
+The use of C<return> within C<eval {...}> caused $@ not to be reset
+correctly when no exception occurred within the eval.  This has
+been fixed.
+
+Parsing of here documents used to be flawed when they appeared as
+the replacement expression in C<eval 's/.../.../e'>.  This has
+been fixed.
+
+=head2 All compilation errors are true errors
+
+Some "errors" encountered at compile time were by necessity 
+generated as warnings followed by eventual termination of the
+program.  This enabled more such errors to be reported in a
+single run, rather than causing a hard stop at the first error
+that was encountered.
+
+The mechanism for reporting such errors has been reimplemented
+to queue compile-time errors and report them at the end of the
+compilation as true errors rather than as warnings.  This fixes
+cases where error messages leaked through in the form of warnings
+when code was compiled at run time using C<eval STRING>, and
+also allows such errors to be reliably trapped using C<eval "...">.
+
+=head2 Implicitly closed filehandles are safer
+
+Sometimes implicitly closed filehandles (as when they are localized,
+and Perl automatically closes them on exiting the scope) could
+inadvertently set $? or $!.  This has been corrected.
+
+
+=head2 Behavior of list slices is more consistent
+
+When taking a slice of a literal list (as opposed to a slice of
+an array or hash), Perl used to return an empty list if the
+result happened to be composed of all undef values.
+
+The new behavior is to produce an empty list if (and only if)
+the original list was empty.  Consider the following example:
+
+    @a = (1,undef,undef,2)[2,1,2];
+
+The old behavior would have resulted in @a having no elements.
+The new behavior ensures it has three undefined elements.
+
+Note in particular that the behavior of slices of the following
+cases remains unchanged:
+
+    @a = ()[1,2];
+    @a = (getpwent)[7,0];
+    @a = (anything_returning_empty_list())[2,1,2];
+    @a = @b[2,1,2];
+    @a = @c{'a','b','c'};
+
+See L<perldata>.
+
+=head2 C<(\$)> prototype and C<$foo{a}>
+
+A scalar reference prototype now correctly allows a hash or
+array element in that slot.
+
+=head2 C<goto &sub> and AUTOLOAD
+
+The C<goto &sub> construct works correctly when C<&sub> happens
+to be autoloaded.
+
+=head2 C<-bareword> allowed under C<use integer>
+
+The autoquoting of barewords preceded by C<-> did not work
+in prior versions when the C<integer> pragma was enabled.
+This has been fixed.
+
+=head2 Failures in DESTROY()
+
+When code in a destructor threw an exception, it went unnoticed
+in earlier versions of Perl, unless someone happened to be
+looking in $@ just after the point the destructor happened to
+run.  Such failures are now visible as warnings when warnings are
+enabled.
+
+=head2 Locale bugs fixed
+
+printf() and sprintf() previously reset the numeric locale
+back to the default "C" locale.  This has been fixed.
+
+Numbers formatted according to the local numeric locale
+(such as using a decimal comma instead of a decimal dot) caused
+"isn't numeric" warnings, even while the operations accessing
+those numbers produced correct results.  These warnings have been
+discontinued.
+
+=head2 Memory leaks
+
+The C<eval 'return sub {...}'> construct could sometimes leak
+memory.  This has been fixed.
+
+Operations that aren't filehandle constructors used to leak memory
+when used on invalid filehandles.  This has been fixed.
+
+Constructs that modified C<@_> could fail to deallocate values
+in C<@_> and thus leak memory.  This has been corrected.
+
+=head2 Spurious subroutine stubs after failed subroutine calls
+
+Perl could sometimes create empty subroutine stubs when a
+subroutine was not found in the package.  Such cases stopped
+later method lookups from progressing into base packages.
+This has been corrected.
+
+=head2 Taint failures under C<-U>
+
+When running in unsafe mode, taint violations could sometimes
+cause silent failures.  This has been fixed.
+
+=head2 END blocks and the C<-c> switch
+
+Prior versions used to run BEGIN B<and> END blocks when Perl was
+run in compile-only mode.  Since this is typically not the expected
+behavior, END blocks are not executed anymore when the C<-c> switch
+is used, or if compilation fails.
+
+See L</"Support for CHECK blocks"> for how to run things when the compile 
+phase ends.
+
+=head2 Potential to leak DATA filehandles
+
+Using the C<__DATA__> token creates an implicit filehandle to
+the file that contains the token.  It is the program's
+responsibility to close it when it is done reading from it.
+
+This caveat is now better explained in the documentation.
+See L<perldata>.
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item "%s" variable %s masks earlier declaration in same %s
+
+(W misc) A "my" or "our" variable has been redeclared in the current scope or statement,
+effectively eliminating all access to the previous instance.  This is almost
+always a typographical error.  Note that the earlier variable will still exist
+until the end of the scope or until all closure referents to it are
+destroyed.
+
+=item "my sub" not yet implemented
+
+(F) Lexically scoped subroutines are not yet implemented.  Don't try that
+yet.
+
+=item "our" variable %s redeclared
+
+(W misc) You seem to have already declared the same global once before in the
+current lexical scope.
+
+=item '!' allowed only after types %s
+
+(F) The '!' is allowed in pack() and unpack() only after certain types.
+See L<perlfunc/pack>.
+
+=item / cannot take a count
+
+(F) You had an unpack template indicating a counted-length string,
+but you have also specified an explicit size for the string.
+See L<perlfunc/pack>.
+
+=item / must be followed by a, A or Z
+
+(F) You had an unpack template indicating a counted-length string,
+which must be followed by one of the letters a, A or Z
+to indicate what sort of string is to be unpacked.
+See L<perlfunc/pack>.
+
+=item / must be followed by a*, A* or Z*
+
+(F) You had a pack template indicating a counted-length string,
+Currently the only things that can have their length counted are a*, A* or Z*.
+See L<perlfunc/pack>.
+
+=item / must follow a numeric type
+
+(F) You had an unpack template that contained a '#',
+but this did not follow some numeric unpack specification.
+See L<perlfunc/pack>.
+
+=item /%s/: Unrecognized escape \\%c passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl.  This combination appears in an interpolated variable or a
+C<'>-delimited regular expression.  The character was understood literally.
+
+=item /%s/: Unrecognized escape \\%c in character class passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl inside character classes.  The character was understood literally.
+
+=item /%s/ should probably be written as "%s"
+
+(W syntax) You have used a pattern where Perl expected to find a string,
+as in the first argument to C<join>.  Perl will treat the true
+or false result of matching the pattern against $_ as the string,
+which is probably not what you had in mind.
+
+=item %s() called too early to check prototype
+
+(W prototype) You've called a function that has a prototype before the parser saw a
+definition or declaration for it, and Perl could not check that the call
+conforms to the prototype.  You need to either add an early prototype
+declaration for the subroutine in question, or move the subroutine
+definition ahead of the call to get proper prototype checking.  Alternatively,
+if you are certain that you're calling the function correctly, you may put
+an ampersand before the name to avoid the warning.  See L<perlsub>.
+
+=item %s argument is not a HASH or ARRAY element
+
+(F) The argument to exists() must be a hash or array element, such as:
+
+    $foo{$bar}
+    $ref->{"susie"}[12]
+
+=item %s argument is not a HASH or ARRAY element or slice
+
+(F) The argument to delete() must be either a hash or array element, such as:
+
+    $foo{$bar}
+    $ref->{"susie"}[12]
+
+or a hash or array slice, such as:
+
+    @foo[$bar, $baz, $xyzzy]
+    @{$ref->[12]}{"susie", "queue"}
+
+=item %s argument is not a subroutine name
+
+(F) The argument to exists() for C<exists &sub> must be a subroutine
+name, and not a subroutine call.  C<exists &sub()> will generate this error.
+
+=item %s package attribute may clash with future reserved word: %s
+
+(W reserved) A lowercase attribute name was used that had a package-specific handler.
+That name might have a meaning to Perl itself some day, even though it
+doesn't yet.  Perhaps you should use a mixed-case attribute name, instead.
+See L<attributes>.
+
+=item (in cleanup) %s
+
+(W misc) This prefix usually indicates that a DESTROY() method raised
+the indicated exception.  Since destructors are usually called by
+the system at arbitrary points during execution, and often a vast
+number of times, the warning is issued only once for any number
+of failures that would otherwise result in the same message being
+repeated.
+
+Failure of user callbacks dispatched using the C<G_KEEPERR> flag
+could also result in this warning.  See L<perlcall/G_KEEPERR>.
+
+=item <> should be quotes
+
+(F) You wrote C<< require <file> >> when you should have written
+C<require 'file'>.
+
+=item Attempt to join self
+
+(F) You tried to join a thread from within itself, which is an
+impossible task.  You may be joining the wrong thread, or you may
+need to move the join() to some other thread.
+
+=item Bad evalled substitution pattern
+
+(F) You've used the /e switch to evaluate the replacement for a
+substitution, but perl found a syntax error in the code to evaluate,
+most likely an unexpected right brace '}'.
+
+=item Bad realloc() ignored
+
+(S) An internal routine called realloc() on something that had never been
+malloc()ed in the first place. Mandatory, but can be disabled by
+setting environment variable C<PERL_BADFREE> to 1.
+
+=item Bareword found in conditional
+
+(W bareword) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+    open FOO || die;
+
+It may also indicate a misspelled constant that has been interpreted
+as a bareword:
+
+    use constant TYPO => 1;
+    if (TYOP) { print "foo" }
+
+The C<strict> pragma is useful in avoiding such errors.
+
+=item Binary number > 0b11111111111111111111111111111111 non-portable
+
+(W portable) The binary number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems.  See
+L<perlport> for more on portability concerns.
+
+=item Bit vector size > 32 non-portable
+
+(W portable) Using bit vector sizes larger than 32 is non-portable.
+
+=item Buffer overflow in prime_env_iter: %s
+
+(W internal) A warning peculiar to VMS.  While Perl was preparing to iterate over
+%ENV, it encountered a logical name or symbol definition which was too long,
+so it was truncated to the string shown.
+
+=item Can't check filesystem of script "%s"
+
+(P) For some reason you can't check the filesystem of the script for nosuid.
+
+=item Can't declare class for non-scalar %s in "%s"
+
+(S) Currently, only scalar variables can declared with a specific class
+qualifier in a "my" or "our" declaration.  The semantics may be extended
+for other types of variables in future.
+
+=item Can't declare %s in "%s"
+
+(F) Only scalar, array, and hash variables may be declared as "my" or
+"our" variables.  They must have ordinary identifiers as names.
+
+=item Can't ignore signal CHLD, forcing to default
+
+(W signal) Perl has detected that it is being run with the SIGCHLD signal
+(sometimes known as SIGCLD) disabled.  Since disabling this signal
+will interfere with proper determination of exit status of child
+processes, Perl has reset the signal to its default value.
+This situation typically indicates that the parent program under
+which Perl may be running (e.g., cron) is being very careless.
+
+=item Can't modify non-lvalue subroutine call
+
+(F) Subroutines meant to be used in lvalue context should be declared as
+such, see L<perlsub/"Lvalue subroutines">.
+
+=item Can't read CRTL environ
+
+(S) A warning peculiar to VMS.  Perl tried to read an element of %ENV
+from the CRTL's internal environment array and discovered the array was
+missing.  You need to figure out where your CRTL misplaced its environ
+or define F<PERL_ENV_TABLES> (see L<perlvms>) so that environ is not searched.
+
+=item Can't remove %s: %s, skipping file 
+
+(S) You requested an inplace edit without creating a backup file.  Perl
+was unable to remove the original file to replace it with the modified
+file.  The file was left unmodified.
+
+=item Can't return %s from lvalue subroutine
+
+(F) Perl detected an attempt to return illegal lvalues (such
+as temporary or readonly values) from a subroutine used as an lvalue.
+This is not allowed.
+
+=item Can't weaken a nonreference
+
+(F) You attempted to weaken something that was not a reference.  Only
+references can be weakened.
+
+=item Character class [:%s:] unknown
+
+(F) The class in the character class [: :] syntax is unknown.
+See L<perlre>.
+
+=item Character class syntax [%s] belongs inside character classes
+
+(W unsafe) The character class constructs [: :], [= =], and [. .]  go
+I<inside> character classes, the [] are part of the construct,
+for example: /[012[:alpha:]345]/.  Note that [= =] and [. .]
+are not currently implemented; they are simply placeholders for
+future extensions.
+
+=item Constant is not %s reference
+
+(F) A constant value (perhaps declared using the C<use constant> pragma)
+is being dereferenced, but it amounts to the wrong type of reference.  The
+message indicates the type of reference that was expected. This usually
+indicates a syntax error in dereferencing the constant value.
+See L<perlsub/"Constant Functions"> and L<constant>.
+
+=item constant(%s): %s
+
+(F) The parser found inconsistencies either while attempting to define an
+overloaded constant, or when trying to find the character name specified
+in the C<\N{...}> escape.  Perhaps you forgot to load the corresponding
+C<overload> or C<charnames> pragma?  See L<charnames> and L<overload>.
+
+=item CORE::%s is not a keyword
+
+(F) The CORE:: namespace is reserved for Perl keywords.
+
+=item defined(@array) is deprecated
+
+(D) defined() is not usually useful on arrays because it checks for an
+undefined I<scalar> value.  If you want to see if the array is empty,
+just use C<if (@array) { # not empty }> for example.  
+
+=item defined(%hash) is deprecated
+
+(D) defined() is not usually useful on hashes because it checks for an
+undefined I<scalar> value.  If you want to see if the hash is empty,
+just use C<if (%hash) { # not empty }> for example.  
+
+=item Did not produce a valid header
+
+See Server error.
+
+=item (Did you mean "local" instead of "our"?)
+
+(W misc) Remember that "our" does not localize the declared global variable.
+You have declared it again in the same lexical scope, which seems superfluous.
+
+=item Document contains no data
+
+See Server error.
+
+=item entering effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item false [] range "%s" in regexp
+
+(W regexp) A character class range must start and end at a literal character, not
+another character class like C<\d> or C<[:alpha:]>.  The "-" in your false
+range is interpreted as a literal "-".  Consider quoting the "-",  "\-".
+See L<perlre>.
+
+=item Filehandle %s opened only for output
+
+(W io) You tried to read from a filehandle opened only for writing.  If you
+intended it to be a read/write filehandle, you needed to open it with
+"+<" or "+>" or "+>>" instead of with "<" or nothing.  If
+you intended only to read from the file, use "<".  See
+L<perlfunc/open>.
+
+=item flock() on closed filehandle %s
+
+(W closed) The filehandle you're attempting to flock() got itself closed some
+time before now.  Check your logic flow.  flock() operates on filehandles.
+Are you attempting to call flock() on a dirhandle by the same name?
+
+=item Global symbol "%s" requires explicit package name
+
+(F) You've said "use strict vars", which indicates that all variables
+must either be lexically scoped (using "my"), declared beforehand using
+"our", or explicitly qualified to say which package the global variable
+is in (using "::").
+
+=item Hexadecimal number > 0xffffffff non-portable
+
+(W portable) The hexadecimal number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems.  See
+L<perlport> for more on portability concerns.
+
+=item Ill-formed CRTL environ value "%s"
+
+(W internal) A warning peculiar to VMS.  Perl tried to read the CRTL's internal
+environ array, and encountered an element without the C<=> delimiter
+used to separate keys from values.  The element is ignored.
+
+=item Ill-formed message in prime_env_iter: |%s|
+
+(W internal) A warning peculiar to VMS.  Perl tried to read a logical name
+or CLI symbol definition when preparing to iterate over %ENV, and
+didn't see the expected delimiter between key and value, so the
+line was ignored.
+
+=item Illegal binary digit %s
+
+(F) You used a digit other than 0 or 1 in a binary number.
+
+=item Illegal binary digit %s ignored
+
+(W digit) You may have tried to use a digit other than 0 or 1 in a binary number.
+Interpretation of the binary number stopped before the offending digit.
+
+=item Illegal number of bits in vec
+
+(F) The number of bits in vec() (the third argument) must be a power of
+two from 1 to 32 (or 64, if your platform supports that).
+
+=item Integer overflow in %s number
+
+(W overflow) The hexadecimal, octal or binary number you have specified either
+as a literal or as an argument to hex() or oct() is too big for your
+architecture, and has been converted to a floating point number.  On a
+32-bit architecture the largest hexadecimal, octal or binary number
+representable without overflow is 0xFFFFFFFF, 037777777777, or
+0b11111111111111111111111111111111 respectively.  Note that Perl
+transparently promotes all numbers to a floating point representation
+internally--subject to loss of precision errors in subsequent
+operations.
+
+=item Invalid %s attribute: %s
+
+The indicated attribute for a subroutine or variable was not recognized
+by Perl or by a user-supplied handler.  See L<attributes>.
+
+=item Invalid %s attributes: %s
+
+The indicated attributes for a subroutine or variable were not recognized
+by Perl or by a user-supplied handler.  See L<attributes>.
+
+=item invalid [] range "%s" in regexp
+
+The offending range is now explicitly displayed.
+
+=item Invalid separator character %s in attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of an attribute list.  If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon.  See L<attributes>.
+
+=item Invalid separator character %s in subroutine attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of a subroutine attribute list.  If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon.
+
+=item leaving effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item Lvalue subs returning %s not implemented yet
+
+(F) Due to limitations in the current implementation, array and hash
+values cannot be returned in subroutines used in lvalue context.
+See L<perlsub/"Lvalue subroutines">.
+
+=item Method %s not permitted
+
+See Server error.
+
+=item Missing %sbrace%s on \N{}
+
+(F) Wrong syntax of character name literal C<\N{charname}> within
+double-quotish context.
+
+=item Missing command in piped open
+
+(W pipe) You used the C<open(FH, "| command")> or C<open(FH, "command |")>
+construction, but the command was missing or blank.
+
+=item Missing name in "my sub"
+
+(F) The reserved syntax for lexically scoped subroutines requires that they
+have a name with which they can be found.
+
+=item No %s specified for -%c
+
+(F) The indicated command line switch needs a mandatory argument, but
+you haven't specified one.
+
+=item No package name allowed for variable %s in "our"
+
+(F) Fully qualified variable names are not allowed in "our" declarations,
+because that doesn't make much sense under existing semantics.  Such
+syntax is reserved for future extensions.
+
+=item No space allowed after -%c
+
+(F) The argument to the indicated command line switch must follow immediately
+after the switch, without intervening spaces.
+
+=item no UTC offset information; assuming local time is UTC
+
+(S) A warning peculiar to VMS.  Perl was unable to find the local
+timezone offset, so it's assuming that local system time is equivalent
+to UTC.  If it's not, define the logical name F<SYS$TIMEZONE_DIFFERENTIAL>
+to translate to the number of seconds which need to be added to UTC to
+get local time.
+
+=item Octal number > 037777777777 non-portable
+
+(W portable) The octal number you specified is larger than 2**32-1 (4294967295)
+and therefore non-portable between systems.  See L<perlport> for more
+on portability concerns.
+
+See also L<perlport> for writing portable code.
+
+=item panic: del_backref
+
+(P) Failed an internal consistency check while trying to reset a weak
+reference.
+
+=item panic: kid popen errno read
+
+(F) forked child returned an incomprehensible message about its errno.
+
+=item panic: magic_killbackrefs
+
+(P) Failed an internal consistency check while trying to reset all weak
+references to an object.
+
+=item Parentheses missing around "%s" list
+
+(W parenthesis) You said something like
+
+    my $foo, $bar = @_;
+
+when you meant
+
+    my ($foo, $bar) = @_;
+
+Remember that "my", "our", and "local" bind tighter than comma.
+
+=item Possible unintended interpolation of %s in string
+
+(W ambiguous) It used to be that Perl would try to guess whether you
+wanted an array interpolated or a literal @.  It no longer does this;
+arrays are now I<always> interpolated into strings.  This means that 
+if you try something like:
+
+        print "fred@example.com";
+
+and the array C<@example> doesn't exist, Perl is going to print
+C<fred.com>, which is probably not what you wanted.  To get a literal
+C<@> sign in a string, put a backslash before it, just as you would
+to get a literal C<$> sign.
+
+=item Possible Y2K bug: %s
+
+(W y2k) You are concatenating the number 19 with another number, which
+could be a potential Year 2000 problem.
+
+=item pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead
+
+(W deprecated) You have written something like this:
+
+    sub doit
+    {
+        use attrs qw(locked);
+    }
+
+You should use the new declaration syntax instead.
+
+    sub doit : locked
+    {
+        ...
+
+The C<use attrs> pragma is now obsolete, and is only provided for
+backward-compatibility. See L<perlsub/"Subroutine Attributes">.
+
+
+=item Premature end of script headers
+
+See Server error.
+
+=item Repeat count in pack overflows
+
+(F) You can't specify a repeat count so large that it overflows
+your signed integers.  See L<perlfunc/pack>.
+
+=item Repeat count in unpack overflows
+
+(F) You can't specify a repeat count so large that it overflows
+your signed integers.  See L<perlfunc/unpack>.
+
+=item realloc() of freed memory ignored
+
+(S) An internal routine called realloc() on something that had already
+been freed.
+
+=item Reference is already weak
+
+(W misc) You have attempted to weaken a reference that is already weak.
+Doing so has no effect.
+
+=item setpgrp can't take arguments
+
+(F) Your system has the setpgrp() from BSD 4.2, which takes no arguments,
+unlike POSIX setpgid(), which takes a process ID and process group ID.
+
+=item Strange *+?{} on zero-length expression
+
+(W regexp) You applied a regular expression quantifier in a place where it
+makes no sense, such as on a zero-width assertion.
+Try putting the quantifier inside the assertion instead.  For example,
+the way to match "abc" provided that it is followed by three
+repetitions of "xyz" is C</abc(?=(?:xyz){3})/>, not C</abc(?=xyz){3}/>.
+
+=item switching effective %s is not implemented
+
+(F) While under the C<use filetest> pragma, we cannot switch the
+real and effective uids or gids.
+
+=item This Perl can't reset CRTL environ elements (%s)
+
+=item This Perl can't set CRTL environ elements (%s=%s)
+
+(W internal) Warnings peculiar to VMS.  You tried to change or delete an element
+of the CRTL's internal environ array, but your copy of Perl wasn't
+built with a CRTL that contained the setenv() function.  You'll need to
+rebuild Perl with a CRTL that does, or redefine F<PERL_ENV_TABLES> (see
+L<perlvms>) so that the environ array isn't the target of the change to
+%ENV which produced the warning.
+
+=item Too late to run %s block
+
+(W void) A CHECK or INIT block is being defined during run time proper,
+when the opportunity to run them has already passed.  Perhaps you are
+loading a file with C<require> or C<do> when you should be using
+C<use> instead.  Or perhaps you should put the C<require> or C<do>
+inside a BEGIN block.
+
+=item Unknown open() mode '%s'
+
+(F) The second argument of 3-argument open() is not among the list
+of valid modes: C<< < >>, C<< > >>, C<<< >> >>>, C<< +< >>,
+C<< +> >>, C<<< +>> >>>, C<-|>, C<|->.
+
+=item Unknown process %x sent message to prime_env_iter: %s
+
+(P) An error peculiar to VMS.  Perl was reading values for %ENV before
+iterating over it, and someone else stuck a message in the stream of
+data Perl expected.  Someone's very confused, or perhaps trying to
+subvert Perl's population of %ENV for nefarious purposes.
+
+=item Unrecognized escape \\%c passed through
+
+(W misc) You used a backslash-character combination which is not recognized
+by Perl.  The character was understood literally.
+
+=item Unterminated attribute parameter in attribute list
+
+(F) The lexer saw an opening (left) parenthesis character while parsing an
+attribute list, but the matching closing (right) parenthesis
+character was not found.  You may need to add (or remove) a backslash
+character to get your parentheses to balance.  See L<attributes>.
+
+=item Unterminated attribute list
+
+(F) The lexer found something other than a simple identifier at the start
+of an attribute, and it wasn't a semicolon or the start of a
+block.  Perhaps you terminated the parameter list of the previous attribute
+too soon.  See L<attributes>.
+
+=item Unterminated attribute parameter in subroutine attribute list
+
+(F) The lexer saw an opening (left) parenthesis character while parsing a
+subroutine attribute list, but the matching closing (right) parenthesis
+character was not found.  You may need to add (or remove) a backslash
+character to get your parentheses to balance.
+
+=item Unterminated subroutine attribute list
+
+(F) The lexer found something other than a simple identifier at the start
+of a subroutine attribute, and it wasn't a semicolon or the start of a
+block.  Perhaps you terminated the parameter list of the previous attribute
+too soon.
+
+=item Value of CLI symbol "%s" too long
+
+(W misc) A warning peculiar to VMS.  Perl tried to read the value of an %ENV
+element from a CLI symbol table, and found a resultant string longer
+than 1024 characters.  The return value has been truncated to 1024
+characters.
+
+=item Version number must be a constant number
+
+(P) The attempt to translate a C<use Module n.n LIST> statement into
+its equivalent C<BEGIN> block found an internal inconsistency with
+the version number.
+
+=back
+
+=head1 New tests
+
+=over 4
+
+=item	lib/attrs
+
+Compatibility tests for C<sub : attrs> vs the older C<use attrs>.
+
+=item	lib/env
+
+Tests for new environment scalar capability (e.g., C<use Env qw($BAR);>).
+
+=item	lib/env-array
+
+Tests for new environment array capability (e.g., C<use Env qw(@PATH);>).
+
+=item	lib/io_const
+
+IO constants (SEEK_*, _IO*).
+
+=item	lib/io_dir
+
+Directory-related IO methods (new, read, close, rewind, tied delete).
+
+=item	lib/io_multihomed
+
+INET sockets with multi-homed hosts.
+
+=item	lib/io_poll
+
+IO poll().
+
+=item	lib/io_unix
+
+UNIX sockets.
+
+=item	op/attrs
+
+Regression tests for C<my ($x,@y,%z) : attrs> and <sub : attrs>.
+
+=item	op/filetest
+
+File test operators.
+
+=item	op/lex_assign
+
+Verify operations that access pad objects (lexicals and temporaries).
+
+=item	op/exists_sub
+
+Verify C<exists &sub> operations.
+
+=back
+
+=head1 Incompatible Changes
+
+=head2 Perl Source Incompatibilities
+
+Beware that any new warnings that have been added or old ones
+that have been enhanced are B<not> considered incompatible changes.
+
+Since all new warnings must be explicitly requested via the C<-w>
+switch or the C<warnings> pragma, it is ultimately the programmer's
+responsibility to ensure that warnings are enabled judiciously.
+
+=over 4
+
+=item CHECK is a new keyword
+
+All subroutine definitions named CHECK are now special.  See
+C</"Support for CHECK blocks"> for more information.
+
+=item Treatment of list slices of undef has changed
+
+There is a potential incompatibility in the behavior of list slices
+that are comprised entirely of undefined values.
+See L</"Behavior of list slices is more consistent">.
+
+=item Format of $English::PERL_VERSION is different
+
+The English module now sets $PERL_VERSION to $^V (a string value) rather
+than C<$]> (a numeric value).  This is a potential incompatibility.
+Send us a report via perlbug if you are affected by this.
+
+See L</"Improved Perl version numbering system"> for the reasons for
+this change.
+
+=item Literals of the form C<1.2.3> parse differently
+
+Previously, numeric literals with more than one dot in them were
+interpreted as a floating point number concatenated with one or more
+numbers.  Such "numbers" are now parsed as strings composed of the
+specified ordinals.
+
+For example, C<print 97.98.99> used to output C<97.9899> in earlier
+versions, but now prints C<abc>.
+
+See L</"Support for strings represented as a vector of ordinals">.
+
+=item Possibly changed pseudo-random number generator
+
+Perl programs that depend on reproducing a specific set of pseudo-random
+numbers may now produce different output due to improvements made to the
+rand() builtin.  You can use C<sh Configure -Drandfunc=rand> to obtain
+the old behavior.
+
+See L</"Better pseudo-random number generator">.
+
+=item Hashing function for hash keys has changed
+
+Even though Perl hashes are not order preserving, the apparently
+random order encountered when iterating on the contents of a hash
+is actually determined by the hashing algorithm used.  Improvements
+in the algorithm may yield a random order that is B<different> from
+that of previous versions, especially when iterating on hashes.
+
+See L</"Better worst-case behavior of hashes"> for additional
+information.
+
+=item C<undef> fails on read only values
+
+Using the C<undef> operator on a readonly value (such as $1) has
+the same effect as assigning C<undef> to the readonly value--it
+throws an exception.
+
+=item Close-on-exec bit may be set on pipe and socket handles
+
+Pipe and socket handles are also now subject to the close-on-exec
+behavior determined by the special variable $^F.
+
+See L</"More consistent close-on-exec behavior">.
+
+=item Writing C<"$$1"> to mean C<"${$}1"> is unsupported
+
+Perl 5.004 deprecated the interpretation of C<$$1> and
+similar within interpolated strings to mean C<$$ . "1">,
+but still allowed it.
+
+In Perl 5.6.0 and later, C<"$$1"> always means C<"${$1}">.
+
+=item delete(), each(), values() and C<\(%h)>
+
+operate on aliases to values, not copies
+
+delete(), each(), values() and hashes (e.g. C<\(%h)>)
+in a list context return the actual
+values in the hash, instead of copies (as they used to in earlier
+versions).  Typical idioms for using these constructs copy the
+returned values, but this can make a significant difference when
+creating references to the returned values.  Keys in the hash are still
+returned as copies when iterating on a hash.
+
+See also L</"delete(), each(), values() and hash iteration are faster">.
+
+=item vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS
+
+vec() generates a run-time error if the BITS argument is not
+a valid power-of-two integer.
+
+=item Text of some diagnostic output has changed
+
+Most references to internal Perl operations in diagnostics
+have been changed to be more descriptive.  This may be an
+issue for programs that may incorrectly rely on the exact
+text of diagnostics for proper functioning.
+
+=item C<%@> has been removed
+
+The undocumented special variable C<%@> that used to accumulate
+"background" errors (such as those that happen in DESTROY())
+has been removed, because it could potentially result in memory
+leaks.
+
+=item Parenthesized not() behaves like a list operator
+
+The C<not> operator now falls under the "if it looks like a function,
+it behaves like a function" rule.
+
+As a result, the parenthesized form can be used with C<grep> and C<map>.
+The following construct used to be a syntax error before, but it works
+as expected now:
+
+    grep not($_), @things;
+
+On the other hand, using C<not> with a literal list slice may not
+work.  The following previously allowed construct:
+
+    print not (1,2,3)[0];
+
+needs to be written with additional parentheses now:
+
+    print not((1,2,3)[0]);
+
+The behavior remains unaffected when C<not> is not followed by parentheses.
+
+=item Semantics of bareword prototype C<(*)> have changed
+
+The semantics of the bareword prototype C<*> have changed.  Perl 5.005
+always coerced simple scalar arguments to a typeglob, which wasn't useful
+in situations where the subroutine must distinguish between a simple
+scalar and a typeglob.  The new behavior is to not coerce bareword
+arguments to a typeglob.  The value will always be visible as either
+a simple scalar or as a reference to a typeglob.
+
+See L</"More functional bareword prototype (*)">.
+
+=item Semantics of bit operators may have changed on 64-bit platforms
+
+If your platform is either natively 64-bit or if Perl has been
+configured to used 64-bit integers, i.e., $Config{ivsize} is 8, 
+there may be a potential incompatibility in the behavior of bitwise
+numeric operators (& | ^ ~ << >>).  These operators used to strictly
+operate on the lower 32 bits of integers in previous versions, but now
+operate over the entire native integral width.  In particular, note
+that unary C<~> will produce different results on platforms that have
+different $Config{ivsize}.  For portability, be sure to mask off
+the excess bits in the result of unary C<~>, e.g., C<~$x & 0xffffffff>.
+
+See L</"Bit operators support full native integer width">.
+
+=item More builtins taint their results
+
+As described in L</"Improved security features">, there may be more
+sources of taint in a Perl program.
+
+To avoid these new tainting behaviors, you can build Perl with the
+Configure option C<-Accflags=-DINCOMPLETE_TAINTS>.  Beware that the
+ensuing perl binary may be insecure.
+
+=back
+
+=head2 C Source Incompatibilities
+
+=over 4
+
+=item C<PERL_POLLUTE>
+
+Release 5.005 grandfathered old global symbol names by providing preprocessor
+macros for extension source compatibility.  As of release 5.6.0, these
+preprocessor definitions are not available by default.  You need to explicitly
+compile perl with C<-DPERL_POLLUTE> to get these definitions.  For
+extensions still using the old symbols, this option can be
+specified via MakeMaker:
+
+    perl Makefile.PL POLLUTE=1
+
+=item C<PERL_IMPLICIT_CONTEXT>
+
+This new build option provides a set of macros for all API functions
+such that an implicit interpreter/thread context argument is passed to
+every API function.  As a result of this, something like C<sv_setsv(foo,bar)>
+amounts to a macro invocation that actually translates to something like
+C<Perl_sv_setsv(my_perl,foo,bar)>.  While this is generally expected
+to not have any significant source compatibility issues, the difference
+between a macro and a real function call will need to be considered.
+
+This means that there B<is> a source compatibility issue as a result of
+this if your extensions attempt to use pointers to any of the Perl API
+functions.
+
+Note that the above issue is not relevant to the default build of
+Perl, whose interfaces continue to match those of prior versions
+(but subject to the other options described here).
+
+See L<perlguts/"The Perl API"> for detailed information on the
+ramifications of building Perl with this option.
+
+    NOTE: PERL_IMPLICIT_CONTEXT is automatically enabled whenever Perl is built
+    with one of -Dusethreads, -Dusemultiplicity, or both.  It is not
+    intended to be enabled by users at this time.
+
+=item C<PERL_POLLUTE_MALLOC>
+
+Enabling Perl's malloc in release 5.005 and earlier caused the namespace of
+the system's malloc family of functions to be usurped by the Perl versions,
+since by default they used the same names.  Besides causing problems on
+platforms that do not allow these functions to be cleanly replaced, this
+also meant that the system versions could not be called in programs that
+used Perl's malloc.  Previous versions of Perl have allowed this behaviour
+to be suppressed with the HIDEMYMALLOC and EMBEDMYMALLOC preprocessor
+definitions.
+
+As of release 5.6.0, Perl's malloc family of functions have default names
+distinct from the system versions.  You need to explicitly compile perl with
+C<-DPERL_POLLUTE_MALLOC> to get the older behaviour.  HIDEMYMALLOC
+and EMBEDMYMALLOC have no effect, since the behaviour they enabled is now
+the default.
+
+Note that these functions do B<not> constitute Perl's memory allocation API.
+See L<perlguts/"Memory Allocation"> for further information about that.
+
+=back
+
+=head2 Compatible C Source API Changes
+
+=over 4
+
+=item C<PATCHLEVEL> is now C<PERL_VERSION>
+
+The cpp macros C<PERL_REVISION>, C<PERL_VERSION>, and C<PERL_SUBVERSION>
+are now available by default from perl.h, and reflect the base revision,
+patchlevel, and subversion respectively.  C<PERL_REVISION> had no
+prior equivalent, while C<PERL_VERSION> and C<PERL_SUBVERSION> were
+previously available as C<PATCHLEVEL> and C<SUBVERSION>.
+
+The new names cause less pollution of the B<cpp> namespace and reflect what
+the numbers have come to stand for in common practice.  For compatibility,
+the old names are still supported when F<patchlevel.h> is explicitly
+included (as required before), so there is no source incompatibility
+from the change.
+
+=back
+
+=head2 Binary Incompatibilities
+
+In general, the default build of this release is expected to be binary
+compatible for extensions built with the 5.005 release or its maintenance
+versions.  However, specific platforms may have broken binary compatibility
+due to changes in the defaults used in hints files.  Therefore, please be
+sure to always check the platform-specific README files for any notes to
+the contrary.
+
+The usethreads or usemultiplicity builds are B<not> binary compatible
+with the corresponding builds in 5.005.
+
+On platforms that require an explicit list of exports (AIX, OS/2 and Windows,
+among others), purely internal symbols such as parser functions and the
+run time opcodes are not exported by default.  Perl 5.005 used to export
+all functions irrespective of whether they were considered part of the
+public API or not.
+
+For the full list of public API functions, see L<perlapi>.
+
+=head1 Known Problems
+
+=head2 Localizing a tied hash element may leak memory
+
+As of the 5.6.1 release, there is a known leak when code such as this
+is executed:
+
+    use Tie::Hash;
+    tie my %tie_hash => 'Tie::StdHash';
+
+    ...
+
+    local($tie_hash{Foo}) = 1; # leaks
+
+=head2 Known test failures
+
+=over
+
+=item *
+
+64-bit builds
+
+Subtest #15 of lib/b.t may fail under 64-bit builds on platforms such
+as HP-UX PA64 and Linux IA64.  The issue is still being investigated.
+
+The lib/io_multihomed test may hang in HP-UX if Perl has been
+configured to be 64-bit.  Because other 64-bit platforms do not
+hang in this test, HP-UX is suspect.  All other tests pass
+in 64-bit HP-UX.  The test attempts to create and connect to
+"multihomed" sockets (sockets which have multiple IP addresses).
+
+Note that 64-bit support is still experimental.
+
+=item *
+
+Failure of Thread tests
+
+The subtests 19 and 20 of lib/thr5005.t test are known to fail due to
+fundamental problems in the 5.005 threading implementation.  These are
+not new failures--Perl 5.005_0x has the same bugs, but didn't have these
+tests.  (Note that support for 5.005-style threading remains experimental.)
+
+=item *
+
+NEXTSTEP 3.3 POSIX test failure
+
+In NEXTSTEP 3.3p2 the implementation of the strftime(3) in the
+operating system libraries is buggy: the %j format numbers the days of
+a month starting from zero, which, while being logical to programmers,
+will cause the subtests 19 to 27 of the lib/posix test may fail.
+
+=item *
+
+Tru64 (aka Digital UNIX, aka DEC OSF/1) lib/sdbm test failure with gcc
+
+If compiled with gcc 2.95 the lib/sdbm test will fail (dump core).
+The cure is to use the vendor cc, it comes with the operating system
+and produces good code.
+
+=back
+
+=head2 EBCDIC platforms not fully supported
+
+In earlier releases of Perl, EBCDIC environments like OS390 (also
+known as Open Edition MVS) and VM-ESA were supported.  Due to changes
+required by the UTF-8 (Unicode) support, the EBCDIC platforms are not
+supported in Perl 5.6.0.
+
+The 5.6.1 release improves support for EBCDIC platforms, but they
+are not fully supported yet.
+
+=head2 UNICOS/mk CC failures during Configure run
+
+In UNICOS/mk the following errors may appear during the Configure run:
+
+	Guessing which symbols your C compiler and preprocessor define...
+	CC-20 cc: ERROR File = try.c, Line = 3
+	...
+	  bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
+	...
+	4 errors detected in the compilation of "try.c".
+
+The culprit is the broken awk of UNICOS/mk.  The effect is fortunately
+rather mild: Perl itself is not adversely affected by the error, only
+the h2ph utility coming with Perl, and that is rather rarely needed
+these days.
+
+=head2 Arrow operator and arrays
+
+When the left argument to the arrow operator C<< -> >> is an array, or
+the C<scalar> operator operating on an array, the result of the
+operation must be considered erroneous. For example:
+
+    @x->[2]
+    scalar(@x)->[2]
+
+These expressions will get run-time errors in some future release of
+Perl.
+
+=head2 Experimental features
+
+As discussed above, many features are still experimental.  Interfaces and
+implementation of these features are subject to change, and in extreme cases,
+even subject to removal in some future release of Perl.  These features
+include the following:
+
+=over 4
+
+=item Threads
+
+=item Unicode
+
+=item 64-bit support
+
+=item Lvalue subroutines
+
+=item Weak references
+
+=item The pseudo-hash data type
+
+=item The Compiler suite
+
+=item Internal implementation of file globbing
+
+=item The DB module
+
+=item The regular expression code constructs: 
+
+C<(?{ code })> and C<(??{ code })>
+
+=back
+
+=head1 Obsolete Diagnostics
+
+=over 4
+
+=item Character class syntax [: :] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[:" and ending with ":]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[:" and ":\]".
+
+=item Ill-formed logical name |%s| in prime_env_iter
+
+(W) A warning peculiar to VMS.  A logical name was encountered when preparing
+to iterate over %ENV which violates the syntactic rules governing logical
+names.  Because it cannot be translated normally, it is skipped, and will not
+appear in %ENV.  This may be a benign occurrence, as some software packages
+might directly modify logical name tables and introduce nonstandard names,
+or it may indicate that a logical name table has been corrupted.
+
+=item In string, @%s now must be written as \@%s
+
+The description of this error used to say:
+
+        (Someday it will simply assume that an unbackslashed @
+         interpolates an array.)
+
+That day has come, and this fatal error has been removed.  It has been
+replaced by a non-fatal warning instead.
+See L</Arrays now always interpolate into double-quoted strings> for
+details.
+
+=item Probable precedence problem on %s
+
+(W) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+    open FOO || die;
+
+=item regexp too big
+
+(F) The current implementation of regular expressions uses shorts as
+address offsets within a string.  Unfortunately this means that if
+the regular expression compiles to longer than 32767, it'll blow up.
+Usually when you want a regular expression this big, there is a better
+way to do it with multiple statements.  See L<perlre>.
+
+=item Use of "$$<digit>" to mean "${$}<digit>" is deprecated
+
+(D) Perl versions before 5.004 misinterpreted any type marker followed
+by "$" and a digit.  For example, "$$0" was incorrectly taken to mean
+"${$}0" instead of "${$0}".  This bug is (mostly) fixed in Perl 5.004.
+
+However, the developers of Perl 5.004 could not fix this bug completely,
+because at least two widely-used modules depend on the old meaning of
+"$$0" in a string.  So Perl 5.004 still interprets "$$<digit>" in the
+old (broken) way inside strings; but it generates this message as a
+warning.  And in Perl 5.005, this special treatment will cease.
+
+=back
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the
+articles recently posted to the comp.lang.perl.misc newsgroup.
+There may also be information at http://www.perl.com/ , the Perl
+Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Gurusamy Sarathy <F<gsar@ActiveState.com>>, with many
+contributions from The Perl Porters.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl56delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl56delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl56delta.pod	(revision 14489)
@@ -0,0 +1,3022 @@
+=head1 NAME
+
+perl56delta - what's new for perl v5.6.0
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.005 release and the 5.6.0
+release.
+
+=head1 Core Enhancements
+
+=head2 Interpreter cloning, threads, and concurrency
+
+Perl 5.6.0 introduces the beginnings of support for running multiple
+interpreters concurrently in different threads.  In conjunction with
+the perl_clone() API call, which can be used to selectively duplicate
+the state of any given interpreter, it is possible to compile a
+piece of code once in an interpreter, clone that interpreter
+one or more times, and run all the resulting interpreters in distinct
+threads.
+
+On the Windows platform, this feature is used to emulate fork() at the
+interpreter level.  See L<perlfork> for details about that.
+
+This feature is still in evolution.  It is eventually meant to be used
+to selectively clone a subroutine and data reachable from that
+subroutine in a separate interpreter and run the cloned subroutine
+in a separate thread.  Since there is no shared data between the
+interpreters, little or no locking will be needed (unless parts of
+the symbol table are explicitly shared).  This is obviously intended
+to be an easy-to-use replacement for the existing threads support.
+
+Support for cloning interpreters and interpreter concurrency can be
+enabled using the -Dusethreads Configure option (see win32/Makefile for
+how to enable it on Windows.)  The resulting perl executable will be
+functionally identical to one that was built with -Dmultiplicity, but
+the perl_clone() API call will only be available in the former.
+
+-Dusethreads enables the cpp macro USE_ITHREADS by default, which in turn
+enables Perl source code changes that provide a clear separation between
+the op tree and the data it operates with.  The former is immutable, and
+can therefore be shared between an interpreter and all of its clones,
+while the latter is considered local to each interpreter, and is therefore
+copied for each clone.
+
+Note that building Perl with the -Dusemultiplicity Configure option
+is adequate if you wish to run multiple B<independent> interpreters
+concurrently in different threads.  -Dusethreads only provides the
+additional functionality of the perl_clone() API call and other
+support for running B<cloned> interpreters concurrently.
+
+    NOTE: This is an experimental feature.  Implementation details are
+    subject to change.
+
+=head2 Lexically scoped warning categories
+
+You can now control the granularity of warnings emitted by perl at a finer
+level using the C<use warnings> pragma.  L<warnings> and L<perllexwarn>
+have copious documentation on this feature.
+
+=head2 Unicode and UTF-8 support
+
+Perl now uses UTF-8 as its internal representation for character
+strings.  The C<utf8> and C<bytes> pragmas are used to control this support
+in the current lexical scope.  See L<perlunicode>, L<utf8> and L<bytes> for
+more information.
+
+This feature is expected to evolve quickly to support some form of I/O
+disciplines that can be used to specify the kind of input and output data
+(bytes or characters).  Until that happens, additional modules from CPAN
+will be needed to complete the toolkit for dealing with Unicode.
+
+    NOTE: This should be considered an experimental feature.  Implementation
+    details are subject to change.
+
+=head2 Support for interpolating named characters
+
+The new C<\N> escape interpolates named characters within strings.
+For example, C<"Hi! \N{WHITE SMILING FACE}"> evaluates to a string
+with a unicode smiley face at the end.
+
+=head2 "our" declarations
+
+An "our" declaration introduces a value that can be best understood
+as a lexically scoped symbolic alias to a global variable in the
+package that was current where the variable was declared.  This is
+mostly useful as an alternative to the C<vars> pragma, but also provides
+the opportunity to introduce typing and other attributes for such
+variables.  See L<perlfunc/our>.
+
+=head2 Support for strings represented as a vector of ordinals
+
+Literals of the form C<v1.2.3.4> are now parsed as a string composed
+of characters with the specified ordinals.  This is an alternative, more
+readable way to construct (possibly unicode) strings instead of
+interpolating characters, as in C<"\x{1}\x{2}\x{3}\x{4}">.  The leading
+C<v> may be omitted if there are more than two ordinals, so C<1.2.3> is
+parsed the same as C<v1.2.3>.
+
+Strings written in this form are also useful to represent version "numbers".
+It is easy to compare such version "numbers" (which are really just plain
+strings) using any of the usual string comparison operators C<eq>, C<ne>,
+C<lt>, C<gt>, etc., or perform bitwise string operations on them using C<|>,
+C<&>, etc.
+
+In conjunction with the new C<$^V> magic variable (which contains
+the perl version as a string), such literals can be used as a readable way
+to check if you're running a particular version of Perl:
+
+    # this will parse in older versions of Perl also
+    if ($^V and $^V gt v5.6.0) {
+        # new features supported
+    }
+
+C<require> and C<use> also have some special magic to support such
+literals, but this particular usage should be avoided because it leads to
+misleading error messages under versions of Perl which don't support vector
+strings.  Using a true version number will ensure correct behavior in all
+versions of Perl:
+
+    require 5.006;    # run time check for v5.6
+    use 5.006_001;    # compile time check for v5.6.1
+
+Also, C<sprintf> and C<printf> support the Perl-specific format flag C<%v>
+to print ordinals of characters in arbitrary strings:
+
+    printf "v%vd", $^V;		# prints current version, such as "v5.5.650"
+    printf "%*vX", ":", $addr;	# formats IPv6 address
+    printf "%*vb", " ", $bits;	# displays bitstring
+
+See L<perldata/"Scalar value constructors"> for additional information.
+
+=head2 Improved Perl version numbering system
+
+Beginning with Perl version 5.6.0, the version number convention has been
+changed to a "dotted integer" scheme that is more commonly found in open
+source projects.
+
+Maintenance versions of v5.6.0 will be released as v5.6.1, v5.6.2 etc.
+The next development series following v5.6.0 will be numbered v5.7.x,
+beginning with v5.7.0, and the next major production release following
+v5.6.0 will be v5.8.0.
+
+The English module now sets $PERL_VERSION to $^V (a string value) rather
+than C<$]> (a numeric value).  (This is a potential incompatibility.
+Send us a report via perlbug if you are affected by this.)
+
+The v1.2.3 syntax is also now legal in Perl.
+See L<Support for strings represented as a vector of ordinals> for more on that.
+
+To cope with the new versioning system's use of at least three significant
+digits for each version component, the method used for incrementing the
+subversion number has also changed slightly.  We assume that versions older
+than v5.6.0 have been incrementing the subversion component in multiples of
+10.  Versions after v5.6.0 will increment them by 1.  Thus, using the new
+notation, 5.005_03 is the "same" as v5.5.30, and the first maintenance
+version following v5.6.0 will be v5.6.1 (which should be read as being
+equivalent to a floating point value of 5.006_001 in the older format,
+stored in C<$]>).
+
+=head2 New syntax for declaring subroutine attributes
+
+Formerly, if you wanted to mark a subroutine as being a method call or
+as requiring an automatic lock() when it is entered, you had to declare
+that with a C<use attrs> pragma in the body of the subroutine.
+That can now be accomplished with declaration syntax, like this:
+
+    sub mymethod : locked method;
+    ...
+    sub mymethod : locked method {
+	...
+    }
+
+    sub othermethod :locked :method;
+    ...
+    sub othermethod :locked :method {
+	...
+    }
+
+
+(Note how only the first C<:> is mandatory, and whitespace surrounding
+the C<:> is optional.)
+
+F<AutoSplit.pm> and F<SelfLoader.pm> have been updated to keep the attributes
+with the stubs they provide.  See L<attributes>.
+
+=head2 File and directory handles can be autovivified
+
+Similar to how constructs such as C<< $x->[0] >> autovivify a reference,
+handle constructors (open(), opendir(), pipe(), socketpair(), sysopen(),
+socket(), and accept()) now autovivify a file or directory handle
+if the handle passed to them is an uninitialized scalar variable.  This
+allows the constructs such as C<open(my $fh, ...)> and C<open(local $fh,...)>
+to be used to create filehandles that will conveniently be closed
+automatically when the scope ends, provided there are no other references
+to them.  This largely eliminates the need for typeglobs when opening
+filehandles that must be passed around, as in the following example:
+
+    sub myopen {
+        open my $fh, "@_"
+	     or die "Can't open '@_': $!";
+	return $fh;
+    }
+
+    {
+        my $f = myopen("</etc/motd");
+	print <$f>;
+	# $f implicitly closed here
+    }
+
+=head2 open() with more than two arguments
+
+If open() is passed three arguments instead of two, the second argument
+is used as the mode and the third argument is taken to be the file name.
+This is primarily useful for protecting against unintended magic behavior
+of the traditional two-argument form.  See L<perlfunc/open>.
+
+=head2 64-bit support
+
+Any platform that has 64-bit integers either
+
+	(1) natively as longs or ints
+	(2) via special compiler flags
+	(3) using long long or int64_t
+
+is able to use "quads" (64-bit integers) as follows:
+
+=over 4
+
+=item *
+
+constants (decimal, hexadecimal, octal, binary) in the code 
+
+=item *
+
+arguments to oct() and hex()
+
+=item *
+
+arguments to print(), printf() and sprintf() (flag prefixes ll, L, q)
+
+=item *
+
+printed as such
+
+=item *
+
+pack() and unpack() "q" and "Q" formats
+
+=item *
+
+in basic arithmetics: + - * / % (NOTE: operating close to the limits
+of the integer values may produce surprising results)
+
+=item *
+
+in bit arithmetics: & | ^ ~ << >> (NOTE: these used to be forced 
+to be 32 bits wide but now operate on the full native width.)
+
+=item *
+
+vec()
+
+=back
+
+Note that unless you have the case (a) you will have to configure
+and compile Perl using the -Duse64bitint Configure flag.
+
+    NOTE: The Configure flags -Duselonglong and -Duse64bits have been
+    deprecated.  Use -Duse64bitint instead.
+
+There are actually two modes of 64-bitness: the first one is achieved
+using Configure -Duse64bitint and the second one using Configure
+-Duse64bitall.  The difference is that the first one is minimal and
+the second one maximal.  The first works in more places than the second.
+
+The C<use64bitint> does only as much as is required to get 64-bit
+integers into Perl (this may mean, for example, using "long longs")
+while your memory may still be limited to 2 gigabytes (because your
+pointers could still be 32-bit).  Note that the name C<64bitint> does
+not imply that your C compiler will be using 64-bit C<int>s (it might,
+but it doesn't have to): the C<use64bitint> means that you will be
+able to have 64 bits wide scalar values.
+
+The C<use64bitall> goes all the way by attempting to switch also
+integers (if it can), longs (and pointers) to being 64-bit.  This may
+create an even more binary incompatible Perl than -Duse64bitint: the
+resulting executable may not run at all in a 32-bit box, or you may
+have to reboot/reconfigure/rebuild your operating system to be 64-bit
+aware.
+
+Natively 64-bit systems like Alpha and Cray need neither -Duse64bitint
+nor -Duse64bitall.
+
+Last but not least: note that due to Perl's habit of always using
+floating point numbers, the quads are still not true integers.
+When quads overflow their limits (0...18_446_744_073_709_551_615 unsigned,
+-9_223_372_036_854_775_808...9_223_372_036_854_775_807 signed), they
+are silently promoted to floating point numbers, after which they will
+start losing precision (in their lower digits).
+
+    NOTE: 64-bit support is still experimental on most platforms.
+    Existing support only covers the LP64 data model.  In particular, the
+    LLP64 data model is not yet supported.  64-bit libraries and system
+    APIs on many platforms have not stabilized--your mileage may vary.
+
+=head2 Large file support
+
+If you have filesystems that support "large files" (files larger than
+2 gigabytes), you may now also be able to create and access them from
+Perl.
+
+    NOTE: The default action is to enable large file support, if
+    available on the platform.
+
+If the large file support is on, and you have a Fcntl constant
+O_LARGEFILE, the O_LARGEFILE is automatically added to the flags
+of sysopen().
+
+Beware that unless your filesystem also supports "sparse files" seeking
+to umpteen petabytes may be inadvisable.
+
+Note that in addition to requiring a proper file system to do large
+files you may also need to adjust your per-process (or your
+per-system, or per-process-group, or per-user-group) maximum filesize
+limits before running Perl scripts that try to handle large files,
+especially if you intend to write such files.
+
+Finally, in addition to your process/process group maximum filesize
+limits, you may have quota limits on your filesystems that stop you
+(your user id or your user group id) from using large files.
+
+Adjusting your process/user/group/file system/operating system limits
+is outside the scope of Perl core language.  For process limits, you
+may try increasing the limits using your shell's limits/limit/ulimit
+command before running Perl.  The BSD::Resource extension (not
+included with the standard Perl distribution) may also be of use, it
+offers the getrlimit/setrlimit interface that can be used to adjust
+process resource usage limits, including the maximum filesize limit.
+
+=head2 Long doubles
+
+In some systems you may be able to use long doubles to enhance the
+range and precision of your double precision floating point numbers
+(that is, Perl's numbers).  Use Configure -Duselongdouble to enable
+this support (if it is available).
+
+=head2 "more bits"
+
+You can "Configure -Dusemorebits" to turn on both the 64-bit support
+and the long double support.
+
+=head2 Enhanced support for sort() subroutines
+
+Perl subroutines with a prototype of C<($$)>, and XSUBs in general, can
+now be used as sort subroutines.  In either case, the two elements to
+be compared are passed as normal parameters in @_.  See L<perlfunc/sort>.
+
+For unprototyped sort subroutines, the historical behavior of passing 
+the elements to be compared as the global variables $a and $b remains
+unchanged.
+
+=head2 C<sort $coderef @foo> allowed
+
+sort() did not accept a subroutine reference as the comparison
+function in earlier versions.  This is now permitted.
+
+=head2 File globbing implemented internally
+
+Perl now uses the File::Glob implementation of the glob() operator
+automatically.  This avoids using an external csh process and the
+problems associated with it.
+
+    NOTE: This is currently an experimental feature.  Interfaces and
+    implementation are subject to change.
+
+=head2 Support for CHECK blocks
+
+In addition to C<BEGIN>, C<INIT>, C<END>, C<DESTROY> and C<AUTOLOAD>,
+subroutines named C<CHECK> are now special.  These are queued up during
+compilation and behave similar to END blocks, except they are called at
+the end of compilation rather than at the end of execution.  They cannot
+be called directly.
+
+=head2 POSIX character class syntax [: :] supported
+
+For example to match alphabetic characters use /[[:alpha:]]/.
+See L<perlre> for details.
+
+=head2 Better pseudo-random number generator
+
+In 5.005_0x and earlier, perl's rand() function used the C library
+rand(3) function.  As of 5.005_52, Configure tests for drand48(),
+random(), and rand() (in that order) and picks the first one it finds.
+
+These changes should result in better random numbers from rand().
+
+=head2 Improved C<qw//> operator
+
+The C<qw//> operator is now evaluated at compile time into a true list
+instead of being replaced with a run time call to C<split()>.  This
+removes the confusing misbehaviour of C<qw//> in scalar context, which
+had inherited that behaviour from split().
+
+Thus:
+
+    $foo = ($bar) = qw(a b c); print "$foo|$bar\n";
+
+now correctly prints "3|a", instead of "2|a".
+
+=head2 Better worst-case behavior of hashes
+
+Small changes in the hashing algorithm have been implemented in
+order to improve the distribution of lower order bits in the
+hashed value.  This is expected to yield better performance on
+keys that are repeated sequences.
+
+=head2 pack() format 'Z' supported
+
+The new format type 'Z' is useful for packing and unpacking null-terminated
+strings.  See L<perlfunc/"pack">.
+
+=head2 pack() format modifier '!' supported
+
+The new format type modifier '!' is useful for packing and unpacking
+native shorts, ints, and longs.  See L<perlfunc/"pack">.
+
+=head2 pack() and unpack() support counted strings
+
+The template character '/' can be used to specify a counted string
+type to be packed or unpacked.  See L<perlfunc/"pack">.
+
+=head2 Comments in pack() templates
+
+The '#' character in a template introduces a comment up to
+end of the line.  This facilitates documentation of pack()
+templates.
+
+=head2 Weak references
+
+In previous versions of Perl, you couldn't cache objects so as
+to allow them to be deleted if the last reference from outside 
+the cache is deleted.  The reference in the cache would hold a
+reference count on the object and the objects would never be
+destroyed.
+
+Another familiar problem is with circular references.  When an
+object references itself, its reference count would never go
+down to zero, and it would not get destroyed until the program
+is about to exit.
+
+Weak references solve this by allowing you to "weaken" any
+reference, that is, make it not count towards the reference count.
+When the last non-weak reference to an object is deleted, the object
+is destroyed and all the weak references to the object are
+automatically undef-ed.
+
+To use this feature, you need the Devel::WeakRef package from CPAN, which
+contains additional documentation.
+
+    NOTE: This is an experimental feature.  Details are subject to change.  
+
+=head2 Binary numbers supported
+
+Binary numbers are now supported as literals, in s?printf formats, and
+C<oct()>:
+
+    $answer = 0b101010;
+    printf "The answer is: %b\n", oct("0b101010");
+
+=head2 Lvalue subroutines
+
+Subroutines can now return modifiable lvalues.
+See L<perlsub/"Lvalue subroutines">.
+
+    NOTE: This is an experimental feature.  Details are subject to change.
+
+=head2 Some arrows may be omitted in calls through references
+
+Perl now allows the arrow to be omitted in many constructs
+involving subroutine calls through references.  For example,
+C<< $foo[10]->('foo') >> may now be written C<$foo[10]('foo')>.
+This is rather similar to how the arrow may be omitted from
+C<< $foo[10]->{'foo'} >>.  Note however, that the arrow is still
+required for C<< foo(10)->('bar') >>.
+
+=head2 Boolean assignment operators are legal lvalues
+
+Constructs such as C<($a ||= 2) += 1> are now allowed.
+
+=head2 exists() is supported on subroutine names
+
+The exists() builtin now works on subroutine names.  A subroutine
+is considered to exist if it has been declared (even if implicitly).
+See L<perlfunc/exists> for examples.
+
+=head2 exists() and delete() are supported on array elements
+
+The exists() and delete() builtins now work on simple arrays as well.
+The behavior is similar to that on hash elements.
+
+exists() can be used to check whether an array element has been
+initialized.  This avoids autovivifying array elements that don't exist.
+If the array is tied, the EXISTS() method in the corresponding tied
+package will be invoked.
+
+delete() may be used to remove an element from the array and return
+it.  The array element at that position returns to its uninitialized
+state, so that testing for the same element with exists() will return
+false.  If the element happens to be the one at the end, the size of
+the array also shrinks up to the highest element that tests true for
+exists(), or 0 if none such is found.  If the array is tied, the DELETE() 
+method in the corresponding tied package will be invoked.
+
+See L<perlfunc/exists> and L<perlfunc/delete> for examples.
+
+=head2 Pseudo-hashes work better
+
+Dereferencing some types of reference values in a pseudo-hash,
+such as C<< $ph->{foo}[1] >>, was accidentally disallowed.  This has
+been corrected.
+
+When applied to a pseudo-hash element, exists() now reports whether
+the specified value exists, not merely if the key is valid.
+
+delete() now works on pseudo-hashes.  When given a pseudo-hash element
+or slice it deletes the values corresponding to the keys (but not the keys
+themselves).  See L<perlref/"Pseudo-hashes: Using an array as a hash">.
+
+Pseudo-hash slices with constant keys are now optimized to array lookups
+at compile-time.
+
+List assignments to pseudo-hash slices are now supported.
+
+The C<fields> pragma now provides ways to create pseudo-hashes, via
+fields::new() and fields::phash().  See L<fields>.
+
+    NOTE: The pseudo-hash data type continues to be experimental.
+    Limiting oneself to the interface elements provided by the
+    fields pragma will provide protection from any future changes.
+
+=head2 Automatic flushing of output buffers
+
+fork(), exec(), system(), qx//, and pipe open()s now flush buffers
+of all files opened for output when the operation was attempted.  This
+mostly eliminates confusing buffering mishaps suffered by users unaware
+of how Perl internally handles I/O.
+
+This is not supported on some platforms like Solaris where a suitably
+correct implementation of fflush(NULL) isn't available.
+
+=head2 Better diagnostics on meaningless filehandle operations
+
+Constructs such as C<< open(<FH>) >> and C<< close(<FH>) >>
+are compile time errors.  Attempting to read from filehandles that
+were opened only for writing will now produce warnings (just as
+writing to read-only filehandles does).
+
+=head2 Where possible, buffered data discarded from duped input filehandle
+
+C<< open(NEW, "<&OLD") >> now attempts to discard any data that
+was previously read and buffered in C<OLD> before duping the handle.
+On platforms where doing this is allowed, the next read operation
+on C<NEW> will return the same data as the corresponding operation
+on C<OLD>.  Formerly, it would have returned the data from the start
+of the following disk block instead.
+
+=head2 eof() has the same old magic as <>
+
+C<eof()> would return true if no attempt to read from C<< <> >> had
+yet been made.  C<eof()> has been changed to have a little magic of its
+own, it now opens the C<< <> >> files.
+
+=head2 binmode() can be used to set :crlf and :raw modes
+
+binmode() now accepts a second argument that specifies a discipline
+for the handle in question.  The two pseudo-disciplines ":raw" and
+":crlf" are currently supported on DOS-derivative platforms.
+See L<perlfunc/"binmode"> and L<open>.
+
+=head2 C<-T> filetest recognizes UTF-8 encoded files as "text"
+
+The algorithm used for the C<-T> filetest has been enhanced to
+correctly identify UTF-8 content as "text".
+
+=head2 system(), backticks and pipe open now reflect exec() failure
+
+On Unix and similar platforms, system(), qx() and open(FOO, "cmd |")
+etc., are implemented via fork() and exec().  When the underlying
+exec() fails, earlier versions did not report the error properly,
+since the exec() happened to be in a different process.
+
+The child process now communicates with the parent about the
+error in launching the external command, which allows these
+constructs to return with their usual error value and set $!.
+
+=head2 Improved diagnostics
+
+Line numbers are no longer suppressed (under most likely circumstances)
+during the global destruction phase.
+
+Diagnostics emitted from code running in threads other than the main
+thread are now accompanied by the thread ID.
+
+Embedded null characters in diagnostics now actually show up.  They
+used to truncate the message in prior versions.
+
+$foo::a and $foo::b are now exempt from "possible typo" warnings only
+if sort() is encountered in package C<foo>.
+
+Unrecognized alphabetic escapes encountered when parsing quote
+constructs now generate a warning, since they may take on new
+semantics in later versions of Perl.
+
+Many diagnostics now report the internal operation in which the warning
+was provoked, like so:
+
+    Use of uninitialized value in concatenation (.) at (eval 1) line 1.
+    Use of uninitialized value in print at (eval 1) line 1.
+
+Diagnostics  that occur within eval may also report the file and line
+number where the eval is located, in addition to the eval sequence
+number and the line number within the evaluated text itself.  For
+example:
+
+    Not enough arguments for scalar at (eval 4)[newlib/perl5db.pl:1411] line 2, at EOF
+
+=head2 Diagnostics follow STDERR
+
+Diagnostic output now goes to whichever file the C<STDERR> handle
+is pointing at, instead of always going to the underlying C runtime
+library's C<stderr>.
+
+=head2 More consistent close-on-exec behavior
+
+On systems that support a close-on-exec flag on filehandles, the
+flag is now set for any handles created by pipe(), socketpair(),
+socket(), and accept(), if that is warranted by the value of $^F
+that may be in effect.  Earlier versions neglected to set the flag
+for handles created with these operators.  See L<perlfunc/pipe>,
+L<perlfunc/socketpair>, L<perlfunc/socket>, L<perlfunc/accept>,
+and L<perlvar/$^F>.
+
+=head2 syswrite() ease-of-use
+
+The length argument of C<syswrite()> has become optional.
+
+=head2 Better syntax checks on parenthesized unary operators
+
+Expressions such as:
+
+    print defined(&foo,&bar,&baz);
+    print uc("foo","bar","baz");
+    undef($foo,&bar);
+
+used to be accidentally allowed in earlier versions, and produced
+unpredictable behaviour.  Some produced ancillary warnings
+when used in this way; others silently did the wrong thing.
+
+The parenthesized forms of most unary operators that expect a single
+argument now ensure that they are not called with more than one
+argument, making the cases shown above syntax errors.  The usual
+behaviour of:
+
+    print defined &foo, &bar, &baz;
+    print uc "foo", "bar", "baz";
+    undef $foo, &bar;
+
+remains unchanged.  See L<perlop>.
+
+=head2 Bit operators support full native integer width
+
+The bit operators (& | ^ ~ << >>) now operate on the full native
+integral width (the exact size of which is available in $Config{ivsize}).
+For example, if your platform is either natively 64-bit or if Perl
+has been configured to use 64-bit integers, these operations apply
+to 8 bytes (as opposed to 4 bytes on 32-bit platforms).
+For portability, be sure to mask off the excess bits in the result of
+unary C<~>, e.g., C<~$x & 0xffffffff>.
+
+=head2 Improved security features
+
+More potentially unsafe operations taint their results for improved
+security.
+
+The C<passwd> and C<shell> fields returned by the getpwent(), getpwnam(),
+and getpwuid() are now tainted, because the user can affect their own
+encrypted password and login shell.
+
+The variable modified by shmread(), and messages returned by msgrcv()
+(and its object-oriented interface IPC::SysV::Msg::rcv) are also tainted,
+because other untrusted processes can modify messages and shared memory
+segments for their own nefarious purposes.
+
+=head2 More functional bareword prototype (*)
+
+Bareword prototypes have been rationalized to enable them to be used
+to override builtins that accept barewords and interpret them in
+a special way, such as C<require> or C<do>.
+
+Arguments prototyped as C<*> will now be visible within the subroutine
+as either a simple scalar or as a reference to a typeglob.
+See L<perlsub/Prototypes>.
+
+=head2 C<require> and C<do> may be overridden
+
+C<require> and C<do 'file'> operations may be overridden locally
+by importing subroutines of the same name into the current package 
+(or globally by importing them into the CORE::GLOBAL:: namespace).
+Overriding C<require> will also affect C<use>, provided the override
+is visible at compile-time.
+See L<perlsub/"Overriding Built-in Functions">.
+
+=head2 $^X variables may now have names longer than one character
+
+Formerly, $^X was synonymous with ${"\cX"}, but $^XY was a syntax
+error.  Now variable names that begin with a control character may be
+arbitrarily long.  However, for compatibility reasons, these variables
+I<must> be written with explicit braces, as C<${^XY}> for example.
+C<${^XYZ}> is synonymous with ${"\cXYZ"}.  Variable names with more
+than one control character, such as C<${^XY^Z}>, are illegal.
+
+The old syntax has not changed.  As before, `^X' may be either a
+literal control-X character or the two-character sequence `caret' plus
+`X'.  When braces are omitted, the variable name stops after the
+control character.  Thus C<"$^XYZ"> continues to be synonymous with
+C<$^X . "YZ"> as before.
+
+As before, lexical variables may not have names beginning with control
+characters.  As before, variables whose names begin with a control
+character are always forced to be in package `main'.  All such variables
+are reserved for future extensions, except those that begin with
+C<^_>, which may be used by user programs and are guaranteed not to
+acquire special meaning in any future version of Perl.
+
+=head2 New variable $^C reflects C<-c> switch
+
+C<$^C> has a boolean value that reflects whether perl is being run
+in compile-only mode (i.e. via the C<-c> switch).  Since
+BEGIN blocks are executed under such conditions, this variable
+enables perl code to determine whether actions that make sense
+only during normal running are warranted.  See L<perlvar>.
+
+=head2 New variable $^V contains Perl version as a string
+
+C<$^V> contains the Perl version number as a string composed of
+characters whose ordinals match the version numbers, i.e. v5.6.0.
+This may be used in string comparisons.
+
+See C<Support for strings represented as a vector of ordinals> for an
+example.
+
+=head2 Optional Y2K warnings
+
+If Perl is built with the cpp macro C<PERL_Y2KWARN> defined,
+it emits optional warnings when concatenating the number 19
+with another number.
+
+This behavior must be specifically enabled when running Configure.
+See F<INSTALL> and F<README.Y2K>.
+
+=head2 Arrays now always interpolate into double-quoted strings
+
+In double-quoted strings, arrays now interpolate, no matter what.  The
+behavior in earlier versions of perl 5 was that arrays would interpolate
+into strings if the array had been mentioned before the string was
+compiled, and otherwise Perl would raise a fatal compile-time error.
+In versions 5.000 through 5.003, the error was
+
+        Literal @example now requires backslash
+
+In versions 5.004_01 through 5.6.0, the error was
+
+        In string, @example now must be written as \@example
+
+The idea here was to get people into the habit of writing
+C<"fred\@example.com"> when they wanted a literal C<@> sign, just as
+they have always written C<"Give me back my \$5"> when they wanted a
+literal C<$> sign.
+
+Starting with 5.6.1, when Perl now sees an C<@> sign in a
+double-quoted string, it I<always> attempts to interpolate an array,
+regardless of whether or not the array has been used or declared
+already.  The fatal error has been downgraded to an optional warning:
+
+        Possible unintended interpolation of @example in string
+
+This warns you that C<"fred@example.com"> is going to turn into
+C<fred.com> if you don't backslash the C<@>.
+See http://www.plover.com/~mjd/perl/at-error.html for more details
+about the history here.
+
+=head2 @- and @+ provide starting/ending offsets of regex matches
+
+The new magic variables @- and @+ provide the starting and ending
+offsets, respectively, of $&, $1, $2, etc.  See L<perlvar> for
+details.
+
+=head1 Modules and Pragmata
+
+=head2 Modules
+
+=over 4
+
+=item attributes
+
+While used internally by Perl as a pragma, this module also
+provides a way to fetch subroutine and variable attributes.
+See L<attributes>.
+
+=item B
+
+The Perl Compiler suite has been extensively reworked for this
+release.  More of the standard Perl testsuite passes when run
+under the Compiler, but there is still a significant way to
+go to achieve production quality compiled executables.
+
+    NOTE: The Compiler suite remains highly experimental.  The
+    generated code may not be correct, even when it manages to execute
+    without errors.
+
+=item Benchmark
+
+Overall, Benchmark results exhibit lower average error and better timing
+accuracy.  
+
+You can now run tests for I<n> seconds instead of guessing the right
+number of tests to run: e.g., timethese(-5, ...) will run each 
+code for at least 5 CPU seconds.  Zero as the "number of repetitions"
+means "for at least 3 CPU seconds".  The output format has also
+changed.  For example:
+
+   use Benchmark;$x=3;timethese(-5,{a=>sub{$x*$x},b=>sub{$x**2}})
+
+will now output something like this:
+
+   Benchmark: running a, b, each for at least 5 CPU seconds...
+            a:  5 wallclock secs ( 5.77 usr +  0.00 sys =  5.77 CPU) @ 200551.91/s (n=1156516)
+            b:  4 wallclock secs ( 5.00 usr +  0.02 sys =  5.02 CPU) @ 159605.18/s (n=800686)
+
+New features: "each for at least N CPU seconds...", "wallclock secs",
+and the "@ operations/CPU second (n=operations)".
+
+timethese() now returns a reference to a hash of Benchmark objects containing
+the test results, keyed on the names of the tests.
+
+timethis() now returns the iterations field in the Benchmark result object
+instead of 0.
+
+timethese(), timethis(), and the new cmpthese() (see below) can also take
+a format specifier of 'none' to suppress output.
+
+A new function countit() is just like timeit() except that it takes a
+TIME instead of a COUNT.
+
+A new function cmpthese() prints a chart comparing the results of each test
+returned from a timethese() call.  For each possible pair of tests, the
+percentage speed difference (iters/sec or seconds/iter) is shown.
+
+For other details, see L<Benchmark>.
+
+=item ByteLoader
+
+The ByteLoader is a dedicated extension to generate and run
+Perl bytecode.  See L<ByteLoader>.
+
+=item constant
+
+References can now be used.
+
+The new version also allows a leading underscore in constant names, but
+disallows a double leading underscore (as in "__LINE__").  Some other names
+are disallowed or warned against, including BEGIN, END, etc.  Some names
+which were forced into main:: used to fail silently in some cases; now they're
+fatal (outside of main::) and an optional warning (inside of main::).
+The ability to detect whether a constant had been set with a given name has
+been added.
+
+See L<constant>.
+
+=item charnames
+
+This pragma implements the C<\N> string escape.  See L<charnames>.
+
+=item Data::Dumper
+
+A C<Maxdepth> setting can be specified to avoid venturing
+too deeply into deep data structures.  See L<Data::Dumper>.
+
+The XSUB implementation of Dump() is now automatically called if the
+C<Useqq> setting is not in use.
+
+Dumping C<qr//> objects works correctly.
+
+=item DB
+
+C<DB> is an experimental module that exposes a clean abstraction
+to Perl's debugging API.
+
+=item DB_File
+
+DB_File can now be built with Berkeley DB versions 1, 2 or 3.
+See C<ext/DB_File/Changes>.
+
+=item Devel::DProf
+
+Devel::DProf, a Perl source code profiler has been added.  See
+L<Devel::DProf> and L<dprofpp>.
+
+=item Devel::Peek
+
+The Devel::Peek module provides access to the internal representation
+of Perl variables and data.  It is a data debugging tool for the XS programmer.
+
+=item Dumpvalue
+
+The Dumpvalue module provides screen dumps of Perl data.
+
+=item DynaLoader
+
+DynaLoader now supports a dl_unload_file() function on platforms that
+support unloading shared objects using dlclose().
+
+Perl can also optionally arrange to unload all extension shared objects
+loaded by Perl.  To enable this, build Perl with the Configure option
+C<-Accflags=-DDL_UNLOAD_ALL_AT_EXIT>.  (This maybe useful if you are
+using Apache with mod_perl.)
+
+=item English
+
+$PERL_VERSION now stands for C<$^V> (a string value) rather than for C<$]>
+(a numeric value).
+
+=item Env
+
+Env now supports accessing environment variables like PATH as array
+variables.
+
+=item Fcntl
+
+More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
+large file (more than 4GB) access (NOTE: the O_LARGEFILE is
+automatically added to sysopen() flags if large file support has been
+configured, as is the default), Free/Net/OpenBSD locking behaviour
+flags F_FLOCK, F_POSIX, Linux F_SHLCK, and O_ACCMODE: the combined
+mask of O_RDONLY, O_WRONLY, and O_RDWR.  The seek()/sysseek()
+constants SEEK_SET, SEEK_CUR, and SEEK_END are available via the
+C<:seek> tag.  The chmod()/stat() S_IF* constants and S_IS* functions
+are available via the C<:mode> tag.
+
+=item File::Compare
+
+A compare_text() function has been added, which allows custom
+comparison functions.  See L<File::Compare>.
+
+=item File::Find
+
+File::Find now works correctly when the wanted() function is either
+autoloaded or is a symbolic reference.
+
+A bug that caused File::Find to lose track of the working directory
+when pruning top-level directories has been fixed.
+
+File::Find now also supports several other options to control its
+behavior.  It can follow symbolic links if the C<follow> option is
+specified.  Enabling the C<no_chdir> option will make File::Find skip
+changing the current directory when walking directories.  The C<untaint>
+flag can be useful when running with taint checks enabled.
+
+See L<File::Find>.
+
+=item File::Glob
+
+This extension implements BSD-style file globbing.  By default,
+it will also be used for the internal implementation of the glob()
+operator.  See L<File::Glob>.
+
+=item File::Spec
+
+New methods have been added to the File::Spec module: devnull() returns
+the name of the null device (/dev/null on Unix) and tmpdir() the name of
+the temp directory (normally /tmp on Unix).  There are now also methods
+to convert between absolute and relative filenames: abs2rel() and
+rel2abs().  For compatibility with operating systems that specify volume
+names in file paths, the splitpath(), splitdir(), and catdir() methods
+have been added.
+
+=item File::Spec::Functions
+
+The new File::Spec::Functions modules provides a function interface
+to the File::Spec module.  Allows shorthand
+
+    $fullname = catfile($dir1, $dir2, $file);
+
+instead of
+
+    $fullname = File::Spec->catfile($dir1, $dir2, $file);
+
+=item Getopt::Long
+
+Getopt::Long licensing has changed to allow the Perl Artistic License
+as well as the GPL. It used to be GPL only, which got in the way of
+non-GPL applications that wanted to use Getopt::Long.
+
+Getopt::Long encourages the use of Pod::Usage to produce help
+messages. For example:
+
+    use Getopt::Long;
+    use Pod::Usage;
+    my $man = 0;
+    my $help = 0;
+    GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+    pod2usage(1) if $help;
+    pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+    __END__
+
+    =head1 NAME
+
+    sample - Using Getopt::Long and Pod::Usage
+
+    =head1 SYNOPSIS
+
+    sample [options] [file ...]
+
+     Options:
+       -help            brief help message
+       -man             full documentation
+
+    =head1 OPTIONS
+
+    =over 8
+
+    =item B<-help>
+
+    Print a brief help message and exits.
+
+    =item B<-man>
+
+    Prints the manual page and exits.
+
+    =back
+
+    =head1 DESCRIPTION
+
+    B<This program> will read the given input file(s) and do something
+    useful with the contents thereof.
+
+    =cut
+
+See L<Pod::Usage> for details.
+
+A bug that prevented the non-option call-back <> from being
+specified as the first argument has been fixed.
+
+To specify the characters < and > as option starters, use ><. Note,
+however, that changing option starters is strongly deprecated. 
+
+=item IO
+
+write() and syswrite() will now accept a single-argument
+form of the call, for consistency with Perl's syswrite().
+
+You can now create a TCP-based IO::Socket::INET without forcing
+a connect attempt.  This allows you to configure its options
+(like making it non-blocking) and then call connect() manually.
+
+A bug that prevented the IO::Socket::protocol() accessor
+from ever returning the correct value has been corrected.
+
+IO::Socket::connect now uses non-blocking IO instead of alarm()
+to do connect timeouts.
+
+IO::Socket::accept now uses select() instead of alarm() for doing
+timeouts.
+
+IO::Socket::INET->new now sets $! correctly on failure. $@ is
+still set for backwards compatibility.
+
+=item JPL
+
+Java Perl Lingo is now distributed with Perl.  See jpl/README
+for more information.
+
+=item lib
+
+C<use lib> now weeds out any trailing duplicate entries.
+C<no lib> removes all named entries.
+
+=item Math::BigInt
+
+The bitwise operations C<<< << >>>, C<<< >> >>>, C<&>, C<|>,
+and C<~> are now supported on bigints.
+
+=item Math::Complex
+
+The accessor methods Re, Im, arg, abs, rho, and theta can now also
+act as mutators (accessor $z->Re(), mutator $z->Re(3)).
+
+The class method C<display_format> and the corresponding object method
+C<display_format>, in addition to accepting just one argument, now can
+also accept a parameter hash.  Recognized keys of a parameter hash are
+C<"style">, which corresponds to the old one parameter case, and two
+new parameters: C<"format">, which is a printf()-style format string
+(defaults usually to C<"%.15g">, you can revert to the default by
+setting the format string to C<undef>) used for both parts of a
+complex number, and C<"polar_pretty_print"> (defaults to true),
+which controls whether an attempt is made to try to recognize small
+multiples and rationals of pi (2pi, pi/2) at the argument (angle) of a
+polar complex number.
+
+The potentially disruptive change is that in list context both methods
+now I<return the parameter hash>, instead of only the value of the
+C<"style"> parameter.
+
+=item Math::Trig
+
+A little bit of radial trigonometry (cylindrical and spherical),
+radial coordinate conversions, and the great circle distance were added.
+
+=item Pod::Parser, Pod::InputObjects
+
+Pod::Parser is a base class for parsing and selecting sections of
+pod documentation from an input stream.  This module takes care of
+identifying pod paragraphs and commands in the input and hands off the
+parsed paragraphs and commands to user-defined methods which are free
+to interpret or translate them as they see fit.
+
+Pod::InputObjects defines some input objects needed by Pod::Parser, and
+for advanced users of Pod::Parser that need more about a command besides
+its name and text.
+
+As of release 5.6.0 of Perl, Pod::Parser is now the officially sanctioned
+"base parser code" recommended for use by all pod2xxx translators.
+Pod::Text (pod2text) and Pod::Man (pod2man) have already been converted
+to use Pod::Parser and efforts to convert Pod::HTML (pod2html) are already
+underway.  For any questions or comments about pod parsing and translating
+issues and utilities, please use the pod-people@perl.org mailing list.
+
+For further information, please see L<Pod::Parser> and L<Pod::InputObjects>.
+
+=item Pod::Checker, podchecker
+
+This utility checks pod files for correct syntax, according to
+L<perlpod>.  Obvious errors are flagged as such, while warnings are
+printed for mistakes that can be handled gracefully.  The checklist is
+not complete yet.  See L<Pod::Checker>.
+
+=item Pod::ParseUtils, Pod::Find
+
+These modules provide a set of gizmos that are useful mainly for pod
+translators.  L<Pod::Find|Pod::Find> traverses directory structures and
+returns found pod files, along with their canonical names (like
+C<File::Spec::Unix>).  L<Pod::ParseUtils|Pod::ParseUtils> contains
+B<Pod::List> (useful for storing pod list information), B<Pod::Hyperlink>
+(for parsing the contents of C<LE<lt>E<gt>> sequences) and B<Pod::Cache>
+(for caching information about pod files, e.g., link nodes).
+
+=item Pod::Select, podselect
+
+Pod::Select is a subclass of Pod::Parser which provides a function
+named "podselect()" to filter out user-specified sections of raw pod
+documentation from an input stream. podselect is a script that provides
+access to Pod::Select from other scripts to be used as a filter.
+See L<Pod::Select>.
+
+=item Pod::Usage, pod2usage
+
+Pod::Usage provides the function "pod2usage()" to print usage messages for
+a Perl script based on its embedded pod documentation.  The pod2usage()
+function is generally useful to all script authors since it lets them
+write and maintain a single source (the pods) for documentation, thus
+removing the need to create and maintain redundant usage message text
+consisting of information already in the pods.
+
+There is also a pod2usage script which can be used from other kinds of
+scripts to print usage messages from pods (even for non-Perl scripts
+with pods embedded in comments).
+
+For details and examples, please see L<Pod::Usage>.
+
+=item Pod::Text and Pod::Man
+
+Pod::Text has been rewritten to use Pod::Parser.  While pod2text() is
+still available for backwards compatibility, the module now has a new
+preferred interface.  See L<Pod::Text> for the details.  The new Pod::Text
+module is easily subclassed for tweaks to the output, and two such
+subclasses (Pod::Text::Termcap for man-page-style bold and underlining
+using termcap information, and Pod::Text::Color for markup with ANSI color
+sequences) are now standard.
+
+pod2man has been turned into a module, Pod::Man, which also uses
+Pod::Parser.  In the process, several outstanding bugs related to quotes
+in section headers, quoting of code escapes, and nested lists have been
+fixed.  pod2man is now a wrapper script around this module.
+
+=item SDBM_File
+
+An EXISTS method has been added to this module (and sdbm_exists() has
+been added to the underlying sdbm library), so one can now call exists
+on an SDBM_File tied hash and get the correct result, rather than a
+runtime error.
+
+A bug that may have caused data loss when more than one disk block
+happens to be read from the database in a single FETCH() has been
+fixed.
+
+=item Sys::Syslog
+
+Sys::Syslog now uses XSUBs to access facilities from syslog.h so it
+no longer requires syslog.ph to exist. 
+
+=item Sys::Hostname
+
+Sys::Hostname now uses XSUBs to call the C library's gethostname() or
+uname() if they exist.
+
+=item Term::ANSIColor
+
+Term::ANSIColor is a very simple module to provide easy and readable
+access to the ANSI color and highlighting escape sequences, supported by
+most ANSI terminal emulators.  It is now included standard.
+
+=item Time::Local
+
+The timelocal() and timegm() functions used to silently return bogus
+results when the date fell outside the machine's integer range.  They
+now consistently croak() if the date falls in an unsupported range.
+
+=item Win32
+
+The error return value in list context has been changed for all functions
+that return a list of values.  Previously these functions returned a list
+with a single element C<undef> if an error occurred.  Now these functions
+return the empty list in these situations.  This applies to the following
+functions:
+
+    Win32::FsType
+    Win32::GetOSVersion
+
+The remaining functions are unchanged and continue to return C<undef> on
+error even in list context.
+
+The Win32::SetLastError(ERROR) function has been added as a complement
+to the Win32::GetLastError() function.
+
+The new Win32::GetFullPathName(FILENAME) returns the full absolute
+pathname for FILENAME in scalar context.  In list context it returns
+a two-element list containing the fully qualified directory name and
+the filename.  See L<Win32>.
+
+=item XSLoader
+
+The XSLoader extension is a simpler alternative to DynaLoader.
+See L<XSLoader>.
+
+=item DBM Filters
+
+A new feature called "DBM Filters" has been added to all the
+DBM modules--DB_File, GDBM_File, NDBM_File, ODBM_File, and SDBM_File.
+DBM Filters add four new methods to each DBM module:
+
+    filter_store_key
+    filter_store_value
+    filter_fetch_key
+    filter_fetch_value
+
+These can be used to filter key-value pairs before the pairs are
+written to the database or just after they are read from the database.
+See L<perldbmfilter> for further information.
+
+=back
+
+=head2 Pragmata
+
+C<use attrs> is now obsolete, and is only provided for
+backward-compatibility.  It's been replaced by the C<sub : attributes>
+syntax.  See L<perlsub/"Subroutine Attributes"> and L<attributes>.
+
+Lexical warnings pragma, C<use warnings;>, to control optional warnings.
+See L<perllexwarn>.
+
+C<use filetest> to control the behaviour of filetests (C<-r> C<-w>
+...).  Currently only one subpragma implemented, "use filetest
+'access';", that uses access(2) or equivalent to check permissions
+instead of using stat(2) as usual.  This matters in filesystems
+where there are ACLs (access control lists): the stat(2) might lie,
+but access(2) knows better.
+
+The C<open> pragma can be used to specify default disciplines for
+handle constructors (e.g. open()) and for qx//.  The two
+pseudo-disciplines C<:raw> and C<:crlf> are currently supported on
+DOS-derivative platforms (i.e. where binmode is not a no-op).
+See also L</"binmode() can be used to set :crlf and :raw modes">.
+
+=head1 Utility Changes
+
+=head2 dprofpp
+
+C<dprofpp> is used to display profile data generated using C<Devel::DProf>.
+See L<dprofpp>.
+
+=head2 find2perl
+
+The C<find2perl> utility now uses the enhanced features of the File::Find
+module.  The -depth and -follow options are supported.  Pod documentation
+is also included in the script.
+
+=head2 h2xs
+
+The C<h2xs> tool can now work in conjunction with C<C::Scan> (available
+from CPAN) to automatically parse real-life header files.  The C<-M>,
+C<-a>, C<-k>, and C<-o> options are new.
+
+=head2 perlcc
+
+C<perlcc> now supports the C and Bytecode backends.  By default,
+it generates output from the simple C backend rather than the
+optimized C backend.
+
+Support for non-Unix platforms has been improved.
+
+=head2 perldoc
+
+C<perldoc> has been reworked to avoid possible security holes.
+It will not by default let itself be run as the superuser, but you
+may still use the B<-U> switch to try to make it drop privileges
+first.
+
+=head2 The Perl Debugger
+
+Many bug fixes and enhancements were added to F<perl5db.pl>, the
+Perl debugger.  The help documentation was rearranged.  New commands
+include C<< < ? >>, C<< > ? >>, and C<< { ? >> to list out current
+actions, C<man I<docpage>> to run your doc viewer on some perl
+docset, and support for quoted options.  The help information was
+rearranged, and should be viewable once again if you're using B<less>
+as your pager.  A serious security hole was plugged--you should
+immediately remove all older versions of the Perl debugger as
+installed in previous releases, all the way back to perl3, from
+your system to avoid being bitten by this.
+
+=head1 Improved Documentation
+
+Many of the platform-specific README files are now part of the perl
+installation.  See L<perl> for the complete list.
+
+=over 4
+
+=item perlapi.pod
+
+The official list of public Perl API functions.
+
+=item perlboot.pod
+
+A tutorial for beginners on object-oriented Perl.
+
+=item perlcompile.pod
+
+An introduction to using the Perl Compiler suite.
+
+=item perldbmfilter.pod
+
+A howto document on using the DBM filter facility.
+
+=item perldebug.pod
+
+All material unrelated to running the Perl debugger, plus all
+low-level guts-like details that risked crushing the casual user
+of the debugger, have been relocated from the old manpage to the
+next entry below.
+
+=item perldebguts.pod
+
+This new manpage contains excessively low-level material not related
+to the Perl debugger, but slightly related to debugging Perl itself.
+It also contains some arcane internal details of how the debugging
+process works that may only be of interest to developers of Perl
+debuggers.
+
+=item perlfork.pod
+
+Notes on the fork() emulation currently available for the Windows platform.
+
+=item perlfilter.pod
+
+An introduction to writing Perl source filters.
+
+=item perlhack.pod
+
+Some guidelines for hacking the Perl source code.
+
+=item perlintern.pod
+
+A list of internal functions in the Perl source code.
+(List is currently empty.)
+
+=item perllexwarn.pod
+
+Introduction and reference information about lexically scoped
+warning categories.
+
+=item perlnumber.pod
+
+Detailed information about numbers as they are represented in Perl.
+
+=item perlopentut.pod
+
+A tutorial on using open() effectively.
+
+=item perlreftut.pod
+
+A tutorial that introduces the essentials of references.
+
+=item perltootc.pod
+
+A tutorial on managing class data for object modules.
+
+=item perltodo.pod
+
+Discussion of the most often wanted features that may someday be
+supported in Perl.
+
+=item perlunicode.pod
+
+An introduction to Unicode support features in Perl.
+
+=back
+
+=head1 Performance enhancements
+
+=head2 Simple sort() using { $a <=> $b } and the like are optimized
+
+Many common sort() operations using a simple inlined block are now
+optimized for faster performance.
+
+=head2 Optimized assignments to lexical variables
+
+Certain operations in the RHS of assignment statements have been
+optimized to directly set the lexical variable on the LHS,
+eliminating redundant copying overheads.
+
+=head2 Faster subroutine calls
+
+Minor changes in how subroutine calls are handled internally
+provide marginal improvements in performance.
+
+=head2 delete(), each(), values() and hash iteration are faster
+
+The hash values returned by delete(), each(), values() and hashes in a
+list context are the actual values in the hash, instead of copies.
+This results in significantly better performance, because it eliminates
+needless copying in most situations.
+
+=head1 Installation and Configuration Improvements
+
+=head2 -Dusethreads means something different
+
+The -Dusethreads flag now enables the experimental interpreter-based thread
+support by default.  To get the flavor of experimental threads that was in
+5.005 instead, you need to run Configure with "-Dusethreads -Duse5005threads".
+
+As of v5.6.0, interpreter-threads support is still lacking a way to
+create new threads from Perl (i.e., C<use Thread;> will not work with
+interpreter threads).  C<use Thread;> continues to be available when you
+specify the -Duse5005threads option to Configure, bugs and all.
+
+    NOTE: Support for threads continues to be an experimental feature.
+    Interfaces and implementation are subject to sudden and drastic changes.
+
+=head2 New Configure flags
+
+The following new flags may be enabled on the Configure command line
+by running Configure with C<-Dflag>.
+
+    usemultiplicity
+    usethreads useithreads	(new interpreter threads: no Perl API yet)
+    usethreads use5005threads	(threads as they were in 5.005)
+
+    use64bitint			(equal to now deprecated 'use64bits')
+    use64bitall
+
+    uselongdouble
+    usemorebits
+    uselargefiles
+    usesocks			(only SOCKS v5 supported)
+
+=head2 Threadedness and 64-bitness now more daring
+
+The Configure options enabling the use of threads and the use of
+64-bitness are now more daring in the sense that they no more have an
+explicit list of operating systems of known threads/64-bit
+capabilities.  In other words: if your operating system has the
+necessary APIs and datatypes, you should be able just to go ahead and
+use them, for threads by Configure -Dusethreads, and for 64 bits
+either explicitly by Configure -Duse64bitint or implicitly if your
+system has 64-bit wide datatypes.  See also L<"64-bit support">.
+
+=head2 Long Doubles
+
+Some platforms have "long doubles", floating point numbers of even
+larger range than ordinary "doubles".  To enable using long doubles for
+Perl's scalars, use -Duselongdouble.
+
+=head2 -Dusemorebits
+
+You can enable both -Duse64bitint and -Duselongdouble with -Dusemorebits.
+See also L<"64-bit support">.
+
+=head2 -Duselargefiles
+
+Some platforms support system APIs that are capable of handling large files
+(typically, files larger than two gigabytes).  Perl will try to use these
+APIs if you ask for -Duselargefiles.
+
+See L<"Large file support"> for more information. 
+
+=head2 installusrbinperl
+
+You can use "Configure -Uinstallusrbinperl" which causes installperl
+to skip installing perl also as /usr/bin/perl.  This is useful if you
+prefer not to modify /usr/bin for some reason or another but harmful
+because many scripts assume to find Perl in /usr/bin/perl.
+
+=head2 SOCKS support
+
+You can use "Configure -Dusesocks" which causes Perl to probe
+for the SOCKS proxy protocol library (v5, not v4).  For more information
+on SOCKS, see:
+
+    http://www.socks.nec.com/
+
+=head2 C<-A> flag
+
+You can "post-edit" the Configure variables using the Configure C<-A>
+switch.  The editing happens immediately after the platform specific
+hints files have been processed but before the actual configuration
+process starts.  Run C<Configure -h> to find out the full C<-A> syntax.
+
+=head2 Enhanced Installation Directories
+
+The installation structure has been enriched to improve the support
+for maintaining multiple versions of perl, to provide locations for
+vendor-supplied modules, scripts, and manpages, and to ease maintenance
+of locally-added modules, scripts, and manpages.  See the section on
+Installation Directories in the INSTALL file for complete details.
+For most users building and installing from source, the defaults should
+be fine.
+
+If you previously used C<Configure -Dsitelib> or C<-Dsitearch> to set
+special values for library directories, you might wish to consider using
+the new C<-Dsiteprefix> setting instead.  Also, if you wish to re-use a
+config.sh file from an earlier version of perl, you should be sure to
+check that Configure makes sensible choices for the new directories.
+See INSTALL for complete details.
+
+=head1 Platform specific changes
+
+=head2 Supported platforms
+
+=over 4
+
+=item *
+
+The Mach CThreads (NEXTSTEP, OPENSTEP) are now supported by the Thread
+extension.
+
+=item *
+
+GNU/Hurd is now supported.
+
+=item *
+
+Rhapsody/Darwin is now supported.
+
+=item *
+
+EPOC is now supported (on Psion 5).
+
+=item *
+
+The cygwin port (formerly cygwin32) has been greatly improved.
+
+=back
+
+=head2 DOS
+
+=over 4
+
+=item *
+
+Perl now works with djgpp 2.02 (and 2.03 alpha).
+
+=item *
+
+Environment variable names are not converted to uppercase any more.
+
+=item *
+
+Incorrect exit codes from backticks have been fixed.
+
+=item *
+
+This port continues to use its own builtin globbing (not File::Glob).
+
+=back
+
+=head2 OS390 (OpenEdition MVS)
+
+Support for this EBCDIC platform has not been renewed in this release.
+There are difficulties in reconciling Perl's standardization on UTF-8
+as its internal representation for characters with the EBCDIC character
+set, because the two are incompatible.
+
+It is unclear whether future versions will renew support for this
+platform, but the possibility exists.
+
+=head2 VMS
+
+Numerous revisions and extensions to configuration, build, testing, and
+installation process to accommodate core changes and VMS-specific options.
+
+Expand %ENV-handling code to allow runtime mapping to logical names,
+CLI symbols, and CRTL environ array.
+
+Extension of subprocess invocation code to accept filespecs as command
+"verbs".
+
+Add to Perl command line processing the ability to use default file types and
+to recognize Unix-style C<2E<gt>&1>.
+
+Expansion of File::Spec::VMS routines, and integration into ExtUtils::MM_VMS.
+
+Extension of ExtUtils::MM_VMS to handle complex extensions more flexibly.
+
+Barewords at start of Unix-syntax paths may be treated as text rather than
+only as logical names.
+
+Optional secure translation of several logical names used internally by Perl.
+
+Miscellaneous bugfixing and porting of new core code to VMS.
+
+Thanks are gladly extended to the many people who have contributed VMS
+patches, testing, and ideas.
+
+=head2 Win32
+
+Perl can now emulate fork() internally, using multiple interpreters running
+in different concurrent threads.  This support must be enabled at build
+time.  See L<perlfork> for detailed information.
+
+When given a pathname that consists only of a drivename, such as C<A:>,
+opendir() and stat() now use the current working directory for the drive
+rather than the drive root.
+
+The builtin XSUB functions in the Win32:: namespace are documented.  See
+L<Win32>.
+
+$^X now contains the full path name of the running executable.
+
+A Win32::GetLongPathName() function is provided to complement
+Win32::GetFullPathName() and Win32::GetShortPathName().  See L<Win32>.
+
+POSIX::uname() is supported.
+
+system(1,...) now returns true process IDs rather than process
+handles.  kill() accepts any real process id, rather than strictly
+return values from system(1,...).
+
+For better compatibility with Unix, C<kill(0, $pid)> can now be used to
+test whether a process exists.
+
+The C<Shell> module is supported.
+
+Better support for building Perl under command.com in Windows 95
+has been added.
+
+Scripts are read in binary mode by default to allow ByteLoader (and
+the filter mechanism in general) to work properly.  For compatibility,
+the DATA filehandle will be set to text mode if a carriage return is
+detected at the end of the line containing the __END__ or __DATA__
+token; if not, the DATA filehandle will be left open in binary mode.
+Earlier versions always opened the DATA filehandle in text mode.
+
+The glob() operator is implemented via the C<File::Glob> extension,
+which supports glob syntax of the C shell.  This increases the flexibility
+of the glob() operator, but there may be compatibility issues for
+programs that relied on the older globbing syntax.  If you want to
+preserve compatibility with the older syntax, you might want to run
+perl with C<-MFile::DosGlob>.  For details and compatibility information,
+see L<File::Glob>.
+
+=head1 Significant bug fixes
+
+=head2 <HANDLE> on empty files
+
+With C<$/> set to C<undef>, "slurping" an empty file returns a string of
+zero length (instead of C<undef>, as it used to) the first time the
+HANDLE is read after C<$/> is set to C<undef>.  Further reads yield
+C<undef>.
+
+This means that the following will append "foo" to an empty file (it used
+to do nothing):
+
+    perl -0777 -pi -e 's/^/foo/' empty_file
+
+The behaviour of:
+
+    perl -pi -e 's/^/foo/' empty_file
+
+is unchanged (it continues to leave the file empty).
+
+=head2 C<eval '...'> improvements
+
+Line numbers (as reflected by caller() and most diagnostics) within
+C<eval '...'> were often incorrect where here documents were involved.
+This has been corrected.
+
+Lexical lookups for variables appearing in C<eval '...'> within
+functions that were themselves called within an C<eval '...'> were
+searching the wrong place for lexicals.  The lexical search now
+correctly ends at the subroutine's block boundary.
+
+The use of C<return> within C<eval {...}> caused $@ not to be reset
+correctly when no exception occurred within the eval.  This has
+been fixed.
+
+Parsing of here documents used to be flawed when they appeared as
+the replacement expression in C<eval 's/.../.../e'>.  This has
+been fixed.
+
+=head2 All compilation errors are true errors
+
+Some "errors" encountered at compile time were by necessity 
+generated as warnings followed by eventual termination of the
+program.  This enabled more such errors to be reported in a
+single run, rather than causing a hard stop at the first error
+that was encountered.
+
+The mechanism for reporting such errors has been reimplemented
+to queue compile-time errors and report them at the end of the
+compilation as true errors rather than as warnings.  This fixes
+cases where error messages leaked through in the form of warnings
+when code was compiled at run time using C<eval STRING>, and
+also allows such errors to be reliably trapped using C<eval "...">.
+
+=head2 Implicitly closed filehandles are safer
+
+Sometimes implicitly closed filehandles (as when they are localized,
+and Perl automatically closes them on exiting the scope) could
+inadvertently set $? or $!.  This has been corrected.
+
+
+=head2 Behavior of list slices is more consistent
+
+When taking a slice of a literal list (as opposed to a slice of
+an array or hash), Perl used to return an empty list if the
+result happened to be composed of all undef values.
+
+The new behavior is to produce an empty list if (and only if)
+the original list was empty.  Consider the following example:
+
+    @a = (1,undef,undef,2)[2,1,2];
+
+The old behavior would have resulted in @a having no elements.
+The new behavior ensures it has three undefined elements.
+
+Note in particular that the behavior of slices of the following
+cases remains unchanged:
+
+    @a = ()[1,2];
+    @a = (getpwent)[7,0];
+    @a = (anything_returning_empty_list())[2,1,2];
+    @a = @b[2,1,2];
+    @a = @c{'a','b','c'};
+
+See L<perldata>.
+
+=head2 C<(\$)> prototype and C<$foo{a}>
+
+A scalar reference prototype now correctly allows a hash or
+array element in that slot.
+
+=head2 C<goto &sub> and AUTOLOAD
+
+The C<goto &sub> construct works correctly when C<&sub> happens
+to be autoloaded.
+
+=head2 C<-bareword> allowed under C<use integer>
+
+The autoquoting of barewords preceded by C<-> did not work
+in prior versions when the C<integer> pragma was enabled.
+This has been fixed.
+
+=head2 Failures in DESTROY()
+
+When code in a destructor threw an exception, it went unnoticed
+in earlier versions of Perl, unless someone happened to be
+looking in $@ just after the point the destructor happened to
+run.  Such failures are now visible as warnings when warnings are
+enabled.
+
+=head2 Locale bugs fixed
+
+printf() and sprintf() previously reset the numeric locale
+back to the default "C" locale.  This has been fixed.
+
+Numbers formatted according to the local numeric locale
+(such as using a decimal comma instead of a decimal dot) caused
+"isn't numeric" warnings, even while the operations accessing
+those numbers produced correct results.  These warnings have been
+discontinued.
+
+=head2 Memory leaks
+
+The C<eval 'return sub {...}'> construct could sometimes leak
+memory.  This has been fixed.
+
+Operations that aren't filehandle constructors used to leak memory
+when used on invalid filehandles.  This has been fixed.
+
+Constructs that modified C<@_> could fail to deallocate values
+in C<@_> and thus leak memory.  This has been corrected.
+
+=head2 Spurious subroutine stubs after failed subroutine calls
+
+Perl could sometimes create empty subroutine stubs when a
+subroutine was not found in the package.  Such cases stopped
+later method lookups from progressing into base packages.
+This has been corrected.
+
+=head2 Taint failures under C<-U>
+
+When running in unsafe mode, taint violations could sometimes
+cause silent failures.  This has been fixed.
+
+=head2 END blocks and the C<-c> switch
+
+Prior versions used to run BEGIN B<and> END blocks when Perl was
+run in compile-only mode.  Since this is typically not the expected
+behavior, END blocks are not executed anymore when the C<-c> switch
+is used, or if compilation fails.
+
+See L</"Support for CHECK blocks"> for how to run things when the compile 
+phase ends.
+
+=head2 Potential to leak DATA filehandles
+
+Using the C<__DATA__> token creates an implicit filehandle to
+the file that contains the token.  It is the program's
+responsibility to close it when it is done reading from it.
+
+This caveat is now better explained in the documentation.
+See L<perldata>.
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item "%s" variable %s masks earlier declaration in same %s
+
+(W misc) A "my" or "our" variable has been redeclared in the current scope or statement,
+effectively eliminating all access to the previous instance.  This is almost
+always a typographical error.  Note that the earlier variable will still exist
+until the end of the scope or until all closure referents to it are
+destroyed.
+
+=item "my sub" not yet implemented
+
+(F) Lexically scoped subroutines are not yet implemented.  Don't try that
+yet.
+
+=item "our" variable %s redeclared
+
+(W misc) You seem to have already declared the same global once before in the
+current lexical scope.
+
+=item '!' allowed only after types %s
+
+(F) The '!' is allowed in pack() and unpack() only after certain types.
+See L<perlfunc/pack>.
+
+=item / cannot take a count
+
+(F) You had an unpack template indicating a counted-length string,
+but you have also specified an explicit size for the string.
+See L<perlfunc/pack>.
+
+=item / must be followed by a, A or Z
+
+(F) You had an unpack template indicating a counted-length string,
+which must be followed by one of the letters a, A or Z
+to indicate what sort of string is to be unpacked.
+See L<perlfunc/pack>.
+
+=item / must be followed by a*, A* or Z*
+
+(F) You had a pack template indicating a counted-length string,
+Currently the only things that can have their length counted are a*, A* or Z*.
+See L<perlfunc/pack>.
+
+=item / must follow a numeric type
+
+(F) You had an unpack template that contained a '#',
+but this did not follow some numeric unpack specification.
+See L<perlfunc/pack>.
+
+=item /%s/: Unrecognized escape \\%c passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl.  This combination appears in an interpolated variable or a
+C<'>-delimited regular expression.  The character was understood literally.
+
+=item /%s/: Unrecognized escape \\%c in character class passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl inside character classes.  The character was understood literally.
+
+=item /%s/ should probably be written as "%s"
+
+(W syntax) You have used a pattern where Perl expected to find a string,
+as in the first argument to C<join>.  Perl will treat the true
+or false result of matching the pattern against $_ as the string,
+which is probably not what you had in mind.
+
+=item %s() called too early to check prototype
+
+(W prototype) You've called a function that has a prototype before the parser saw a
+definition or declaration for it, and Perl could not check that the call
+conforms to the prototype.  You need to either add an early prototype
+declaration for the subroutine in question, or move the subroutine
+definition ahead of the call to get proper prototype checking.  Alternatively,
+if you are certain that you're calling the function correctly, you may put
+an ampersand before the name to avoid the warning.  See L<perlsub>.
+
+=item %s argument is not a HASH or ARRAY element
+
+(F) The argument to exists() must be a hash or array element, such as:
+
+    $foo{$bar}
+    $ref->{"susie"}[12]
+
+=item %s argument is not a HASH or ARRAY element or slice
+
+(F) The argument to delete() must be either a hash or array element, such as:
+
+    $foo{$bar}
+    $ref->{"susie"}[12]
+
+or a hash or array slice, such as:
+
+    @foo[$bar, $baz, $xyzzy]
+    @{$ref->[12]}{"susie", "queue"}
+
+=item %s argument is not a subroutine name
+
+(F) The argument to exists() for C<exists &sub> must be a subroutine
+name, and not a subroutine call.  C<exists &sub()> will generate this error.
+
+=item %s package attribute may clash with future reserved word: %s
+
+(W reserved) A lowercase attribute name was used that had a package-specific handler.
+That name might have a meaning to Perl itself some day, even though it
+doesn't yet.  Perhaps you should use a mixed-case attribute name, instead.
+See L<attributes>.
+
+=item (in cleanup) %s
+
+(W misc) This prefix usually indicates that a DESTROY() method raised
+the indicated exception.  Since destructors are usually called by
+the system at arbitrary points during execution, and often a vast
+number of times, the warning is issued only once for any number
+of failures that would otherwise result in the same message being
+repeated.
+
+Failure of user callbacks dispatched using the C<G_KEEPERR> flag
+could also result in this warning.  See L<perlcall/G_KEEPERR>.
+
+=item <> should be quotes
+
+(F) You wrote C<< require <file> >> when you should have written
+C<require 'file'>.
+
+=item Attempt to join self
+
+(F) You tried to join a thread from within itself, which is an
+impossible task.  You may be joining the wrong thread, or you may
+need to move the join() to some other thread.
+
+=item Bad evalled substitution pattern
+
+(F) You've used the /e switch to evaluate the replacement for a
+substitution, but perl found a syntax error in the code to evaluate,
+most likely an unexpected right brace '}'.
+
+=item Bad realloc() ignored
+
+(S) An internal routine called realloc() on something that had never been
+malloc()ed in the first place. Mandatory, but can be disabled by
+setting environment variable C<PERL_BADFREE> to 1.
+
+=item Bareword found in conditional
+
+(W bareword) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+    open FOO || die;
+
+It may also indicate a misspelled constant that has been interpreted
+as a bareword:
+
+    use constant TYPO => 1;
+    if (TYOP) { print "foo" }
+
+The C<strict> pragma is useful in avoiding such errors.
+
+=item Binary number > 0b11111111111111111111111111111111 non-portable
+
+(W portable) The binary number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems.  See
+L<perlport> for more on portability concerns.
+
+=item Bit vector size > 32 non-portable
+
+(W portable) Using bit vector sizes larger than 32 is non-portable.
+
+=item Buffer overflow in prime_env_iter: %s
+
+(W internal) A warning peculiar to VMS.  While Perl was preparing to iterate over
+%ENV, it encountered a logical name or symbol definition which was too long,
+so it was truncated to the string shown.
+
+=item Can't check filesystem of script "%s"
+
+(P) For some reason you can't check the filesystem of the script for nosuid.
+
+=item Can't declare class for non-scalar %s in "%s"
+
+(S) Currently, only scalar variables can declared with a specific class
+qualifier in a "my" or "our" declaration.  The semantics may be extended
+for other types of variables in future.
+
+=item Can't declare %s in "%s"
+
+(F) Only scalar, array, and hash variables may be declared as "my" or
+"our" variables.  They must have ordinary identifiers as names.
+
+=item Can't ignore signal CHLD, forcing to default
+
+(W signal) Perl has detected that it is being run with the SIGCHLD signal
+(sometimes known as SIGCLD) disabled.  Since disabling this signal
+will interfere with proper determination of exit status of child
+processes, Perl has reset the signal to its default value.
+This situation typically indicates that the parent program under
+which Perl may be running (e.g., cron) is being very careless.
+
+=item Can't modify non-lvalue subroutine call
+
+(F) Subroutines meant to be used in lvalue context should be declared as
+such, see L<perlsub/"Lvalue subroutines">.
+
+=item Can't read CRTL environ
+
+(S) A warning peculiar to VMS.  Perl tried to read an element of %ENV
+from the CRTL's internal environment array and discovered the array was
+missing.  You need to figure out where your CRTL misplaced its environ
+or define F<PERL_ENV_TABLES> (see L<perlvms>) so that environ is not searched.
+
+=item Can't remove %s: %s, skipping file 
+
+(S) You requested an inplace edit without creating a backup file.  Perl
+was unable to remove the original file to replace it with the modified
+file.  The file was left unmodified.
+
+=item Can't return %s from lvalue subroutine
+
+(F) Perl detected an attempt to return illegal lvalues (such
+as temporary or readonly values) from a subroutine used as an lvalue.
+This is not allowed.
+
+=item Can't weaken a nonreference
+
+(F) You attempted to weaken something that was not a reference.  Only
+references can be weakened.
+
+=item Character class [:%s:] unknown
+
+(F) The class in the character class [: :] syntax is unknown.
+See L<perlre>.
+
+=item Character class syntax [%s] belongs inside character classes
+
+(W unsafe) The character class constructs [: :], [= =], and [. .]  go
+I<inside> character classes, the [] are part of the construct,
+for example: /[012[:alpha:]345]/.  Note that [= =] and [. .]
+are not currently implemented; they are simply placeholders for
+future extensions.
+
+=item Constant is not %s reference
+
+(F) A constant value (perhaps declared using the C<use constant> pragma)
+is being dereferenced, but it amounts to the wrong type of reference.  The
+message indicates the type of reference that was expected. This usually
+indicates a syntax error in dereferencing the constant value.
+See L<perlsub/"Constant Functions"> and L<constant>.
+
+=item constant(%s): %s
+
+(F) The parser found inconsistencies either while attempting to define an
+overloaded constant, or when trying to find the character name specified
+in the C<\N{...}> escape.  Perhaps you forgot to load the corresponding
+C<overload> or C<charnames> pragma?  See L<charnames> and L<overload>.
+
+=item CORE::%s is not a keyword
+
+(F) The CORE:: namespace is reserved for Perl keywords.
+
+=item defined(@array) is deprecated
+
+(D) defined() is not usually useful on arrays because it checks for an
+undefined I<scalar> value.  If you want to see if the array is empty,
+just use C<if (@array) { # not empty }> for example.  
+
+=item defined(%hash) is deprecated
+
+(D) defined() is not usually useful on hashes because it checks for an
+undefined I<scalar> value.  If you want to see if the hash is empty,
+just use C<if (%hash) { # not empty }> for example.  
+
+=item Did not produce a valid header
+
+See Server error.
+
+=item (Did you mean "local" instead of "our"?)
+
+(W misc) Remember that "our" does not localize the declared global variable.
+You have declared it again in the same lexical scope, which seems superfluous.
+
+=item Document contains no data
+
+See Server error.
+
+=item entering effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item false [] range "%s" in regexp
+
+(W regexp) A character class range must start and end at a literal character, not
+another character class like C<\d> or C<[:alpha:]>.  The "-" in your false
+range is interpreted as a literal "-".  Consider quoting the "-",  "\-".
+See L<perlre>.
+
+=item Filehandle %s opened only for output
+
+(W io) You tried to read from a filehandle opened only for writing.  If you
+intended it to be a read/write filehandle, you needed to open it with
+"+<" or "+>" or "+>>" instead of with "<" or nothing.  If
+you intended only to read from the file, use "<".  See
+L<perlfunc/open>.
+
+=item flock() on closed filehandle %s
+
+(W closed) The filehandle you're attempting to flock() got itself closed some
+time before now.  Check your logic flow.  flock() operates on filehandles.
+Are you attempting to call flock() on a dirhandle by the same name?
+
+=item Global symbol "%s" requires explicit package name
+
+(F) You've said "use strict vars", which indicates that all variables
+must either be lexically scoped (using "my"), declared beforehand using
+"our", or explicitly qualified to say which package the global variable
+is in (using "::").
+
+=item Hexadecimal number > 0xffffffff non-portable
+
+(W portable) The hexadecimal number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems.  See
+L<perlport> for more on portability concerns.
+
+=item Ill-formed CRTL environ value "%s"
+
+(W internal) A warning peculiar to VMS.  Perl tried to read the CRTL's internal
+environ array, and encountered an element without the C<=> delimiter
+used to separate keys from values.  The element is ignored.
+
+=item Ill-formed message in prime_env_iter: |%s|
+
+(W internal) A warning peculiar to VMS.  Perl tried to read a logical name
+or CLI symbol definition when preparing to iterate over %ENV, and
+didn't see the expected delimiter between key and value, so the
+line was ignored.
+
+=item Illegal binary digit %s
+
+(F) You used a digit other than 0 or 1 in a binary number.
+
+=item Illegal binary digit %s ignored
+
+(W digit) You may have tried to use a digit other than 0 or 1 in a binary number.
+Interpretation of the binary number stopped before the offending digit.
+
+=item Illegal number of bits in vec
+
+(F) The number of bits in vec() (the third argument) must be a power of
+two from 1 to 32 (or 64, if your platform supports that).
+
+=item Integer overflow in %s number
+
+(W overflow) The hexadecimal, octal or binary number you have specified either
+as a literal or as an argument to hex() or oct() is too big for your
+architecture, and has been converted to a floating point number.  On a
+32-bit architecture the largest hexadecimal, octal or binary number
+representable without overflow is 0xFFFFFFFF, 037777777777, or
+0b11111111111111111111111111111111 respectively.  Note that Perl
+transparently promotes all numbers to a floating point representation
+internally--subject to loss of precision errors in subsequent
+operations.
+
+=item Invalid %s attribute: %s
+
+The indicated attribute for a subroutine or variable was not recognized
+by Perl or by a user-supplied handler.  See L<attributes>.
+
+=item Invalid %s attributes: %s
+
+The indicated attributes for a subroutine or variable were not recognized
+by Perl or by a user-supplied handler.  See L<attributes>.
+
+=item invalid [] range "%s" in regexp
+
+The offending range is now explicitly displayed.
+
+=item Invalid separator character %s in attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of an attribute list.  If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon.  See L<attributes>.
+
+=item Invalid separator character %s in subroutine attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of a subroutine attribute list.  If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon.
+
+=item leaving effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item Lvalue subs returning %s not implemented yet
+
+(F) Due to limitations in the current implementation, array and hash
+values cannot be returned in subroutines used in lvalue context.
+See L<perlsub/"Lvalue subroutines">.
+
+=item Method %s not permitted
+
+See Server error.
+
+=item Missing %sbrace%s on \N{}
+
+(F) Wrong syntax of character name literal C<\N{charname}> within
+double-quotish context.
+
+=item Missing command in piped open
+
+(W pipe) You used the C<open(FH, "| command")> or C<open(FH, "command |")>
+construction, but the command was missing or blank.
+
+=item Missing name in "my sub"
+
+(F) The reserved syntax for lexically scoped subroutines requires that they
+have a name with which they can be found.
+
+=item No %s specified for -%c
+
+(F) The indicated command line switch needs a mandatory argument, but
+you haven't specified one.
+
+=item No package name allowed for variable %s in "our"
+
+(F) Fully qualified variable names are not allowed in "our" declarations,
+because that doesn't make much sense under existing semantics.  Such
+syntax is reserved for future extensions.
+
+=item No space allowed after -%c
+
+(F) The argument to the indicated command line switch must follow immediately
+after the switch, without intervening spaces.
+
+=item no UTC offset information; assuming local time is UTC
+
+(S) A warning peculiar to VMS.  Perl was unable to find the local
+timezone offset, so it's assuming that local system time is equivalent
+to UTC.  If it's not, define the logical name F<SYS$TIMEZONE_DIFFERENTIAL>
+to translate to the number of seconds which need to be added to UTC to
+get local time.
+
+=item Octal number > 037777777777 non-portable
+
+(W portable) The octal number you specified is larger than 2**32-1 (4294967295)
+and therefore non-portable between systems.  See L<perlport> for more
+on portability concerns.
+
+See also L<perlport> for writing portable code.
+
+=item panic: del_backref
+
+(P) Failed an internal consistency check while trying to reset a weak
+reference.
+
+=item panic: kid popen errno read
+
+(F) forked child returned an incomprehensible message about its errno.
+
+=item panic: magic_killbackrefs
+
+(P) Failed an internal consistency check while trying to reset all weak
+references to an object.
+
+=item Parentheses missing around "%s" list
+
+(W parenthesis) You said something like
+
+    my $foo, $bar = @_;
+
+when you meant
+
+    my ($foo, $bar) = @_;
+
+Remember that "my", "our", and "local" bind tighter than comma.
+
+=item Possible unintended interpolation of %s in string
+
+(W ambiguous) It used to be that Perl would try to guess whether you
+wanted an array interpolated or a literal @.  It no longer does this;
+arrays are now I<always> interpolated into strings.  This means that 
+if you try something like:
+
+        print "fred@example.com";
+
+and the array C<@example> doesn't exist, Perl is going to print
+C<fred.com>, which is probably not what you wanted.  To get a literal
+C<@> sign in a string, put a backslash before it, just as you would
+to get a literal C<$> sign.
+
+=item Possible Y2K bug: %s
+
+(W y2k) You are concatenating the number 19 with another number, which
+could be a potential Year 2000 problem.
+
+=item pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead
+
+(W deprecated) You have written something like this:
+
+    sub doit
+    {
+        use attrs qw(locked);
+    }
+
+You should use the new declaration syntax instead.
+
+    sub doit : locked
+    {
+        ...
+
+The C<use attrs> pragma is now obsolete, and is only provided for
+backward-compatibility. See L<perlsub/"Subroutine Attributes">.
+
+
+=item Premature end of script headers
+
+See Server error.
+
+=item Repeat count in pack overflows
+
+(F) You can't specify a repeat count so large that it overflows
+your signed integers.  See L<perlfunc/pack>.
+
+=item Repeat count in unpack overflows
+
+(F) You can't specify a repeat count so large that it overflows
+your signed integers.  See L<perlfunc/unpack>.
+
+=item realloc() of freed memory ignored
+
+(S) An internal routine called realloc() on something that had already
+been freed.
+
+=item Reference is already weak
+
+(W misc) You have attempted to weaken a reference that is already weak.
+Doing so has no effect.
+
+=item setpgrp can't take arguments
+
+(F) Your system has the setpgrp() from BSD 4.2, which takes no arguments,
+unlike POSIX setpgid(), which takes a process ID and process group ID.
+
+=item Strange *+?{} on zero-length expression
+
+(W regexp) You applied a regular expression quantifier in a place where it
+makes no sense, such as on a zero-width assertion.
+Try putting the quantifier inside the assertion instead.  For example,
+the way to match "abc" provided that it is followed by three
+repetitions of "xyz" is C</abc(?=(?:xyz){3})/>, not C</abc(?=xyz){3}/>.
+
+=item switching effective %s is not implemented
+
+(F) While under the C<use filetest> pragma, we cannot switch the
+real and effective uids or gids.
+
+=item This Perl can't reset CRTL environ elements (%s)
+
+=item This Perl can't set CRTL environ elements (%s=%s)
+
+(W internal) Warnings peculiar to VMS.  You tried to change or delete an element
+of the CRTL's internal environ array, but your copy of Perl wasn't
+built with a CRTL that contained the setenv() function.  You'll need to
+rebuild Perl with a CRTL that does, or redefine F<PERL_ENV_TABLES> (see
+L<perlvms>) so that the environ array isn't the target of the change to
+%ENV which produced the warning.
+
+=item Too late to run %s block
+
+(W void) A CHECK or INIT block is being defined during run time proper,
+when the opportunity to run them has already passed.  Perhaps you are
+loading a file with C<require> or C<do> when you should be using
+C<use> instead.  Or perhaps you should put the C<require> or C<do>
+inside a BEGIN block.
+
+=item Unknown open() mode '%s'
+
+(F) The second argument of 3-argument open() is not among the list
+of valid modes: C<< < >>, C<< > >>, C<<< >> >>>, C<< +< >>,
+C<< +> >>, C<<< +>> >>>, C<-|>, C<|->.
+
+=item Unknown process %x sent message to prime_env_iter: %s
+
+(P) An error peculiar to VMS.  Perl was reading values for %ENV before
+iterating over it, and someone else stuck a message in the stream of
+data Perl expected.  Someone's very confused, or perhaps trying to
+subvert Perl's population of %ENV for nefarious purposes.
+
+=item Unrecognized escape \\%c passed through
+
+(W misc) You used a backslash-character combination which is not recognized
+by Perl.  The character was understood literally.
+
+=item Unterminated attribute parameter in attribute list
+
+(F) The lexer saw an opening (left) parenthesis character while parsing an
+attribute list, but the matching closing (right) parenthesis
+character was not found.  You may need to add (or remove) a backslash
+character to get your parentheses to balance.  See L<attributes>.
+
+=item Unterminated attribute list
+
+(F) The lexer found something other than a simple identifier at the start
+of an attribute, and it wasn't a semicolon or the start of a
+block.  Perhaps you terminated the parameter list of the previous attribute
+too soon.  See L<attributes>.
+
+=item Unterminated attribute parameter in subroutine attribute list
+
+(F) The lexer saw an opening (left) parenthesis character while parsing a
+subroutine attribute list, but the matching closing (right) parenthesis
+character was not found.  You may need to add (or remove) a backslash
+character to get your parentheses to balance.
+
+=item Unterminated subroutine attribute list
+
+(F) The lexer found something other than a simple identifier at the start
+of a subroutine attribute, and it wasn't a semicolon or the start of a
+block.  Perhaps you terminated the parameter list of the previous attribute
+too soon.
+
+=item Value of CLI symbol "%s" too long
+
+(W misc) A warning peculiar to VMS.  Perl tried to read the value of an %ENV
+element from a CLI symbol table, and found a resultant string longer
+than 1024 characters.  The return value has been truncated to 1024
+characters.
+
+=item Version number must be a constant number
+
+(P) The attempt to translate a C<use Module n.n LIST> statement into
+its equivalent C<BEGIN> block found an internal inconsistency with
+the version number.
+
+=back
+
+=head1 New tests
+
+=over 4
+
+=item	lib/attrs
+
+Compatibility tests for C<sub : attrs> vs the older C<use attrs>.
+
+=item	lib/env
+
+Tests for new environment scalar capability (e.g., C<use Env qw($BAR);>).
+
+=item	lib/env-array
+
+Tests for new environment array capability (e.g., C<use Env qw(@PATH);>).
+
+=item	lib/io_const
+
+IO constants (SEEK_*, _IO*).
+
+=item	lib/io_dir
+
+Directory-related IO methods (new, read, close, rewind, tied delete).
+
+=item	lib/io_multihomed
+
+INET sockets with multi-homed hosts.
+
+=item	lib/io_poll
+
+IO poll().
+
+=item	lib/io_unix
+
+UNIX sockets.
+
+=item	op/attrs
+
+Regression tests for C<my ($x,@y,%z) : attrs> and <sub : attrs>.
+
+=item	op/filetest
+
+File test operators.
+
+=item	op/lex_assign
+
+Verify operations that access pad objects (lexicals and temporaries).
+
+=item	op/exists_sub
+
+Verify C<exists &sub> operations.
+
+=back
+
+=head1 Incompatible Changes
+
+=head2 Perl Source Incompatibilities
+
+Beware that any new warnings that have been added or old ones
+that have been enhanced are B<not> considered incompatible changes.
+
+Since all new warnings must be explicitly requested via the C<-w>
+switch or the C<warnings> pragma, it is ultimately the programmer's
+responsibility to ensure that warnings are enabled judiciously.
+
+=over 4
+
+=item CHECK is a new keyword
+
+All subroutine definitions named CHECK are now special.  See
+C</"Support for CHECK blocks"> for more information.
+
+=item Treatment of list slices of undef has changed
+
+There is a potential incompatibility in the behavior of list slices
+that are comprised entirely of undefined values.
+See L</"Behavior of list slices is more consistent">.
+
+=item Format of $English::PERL_VERSION is different
+
+The English module now sets $PERL_VERSION to $^V (a string value) rather
+than C<$]> (a numeric value).  This is a potential incompatibility.
+Send us a report via perlbug if you are affected by this.
+
+See L</"Improved Perl version numbering system"> for the reasons for
+this change.
+
+=item Literals of the form C<1.2.3> parse differently
+
+Previously, numeric literals with more than one dot in them were
+interpreted as a floating point number concatenated with one or more
+numbers.  Such "numbers" are now parsed as strings composed of the
+specified ordinals.
+
+For example, C<print 97.98.99> used to output C<97.9899> in earlier
+versions, but now prints C<abc>.
+
+See L</"Support for strings represented as a vector of ordinals">.
+
+=item Possibly changed pseudo-random number generator
+
+Perl programs that depend on reproducing a specific set of pseudo-random
+numbers may now produce different output due to improvements made to the
+rand() builtin.  You can use C<sh Configure -Drandfunc=rand> to obtain
+the old behavior.
+
+See L</"Better pseudo-random number generator">.
+
+=item Hashing function for hash keys has changed
+
+Even though Perl hashes are not order preserving, the apparently
+random order encountered when iterating on the contents of a hash
+is actually determined by the hashing algorithm used.  Improvements
+in the algorithm may yield a random order that is B<different> from
+that of previous versions, especially when iterating on hashes.
+
+See L</"Better worst-case behavior of hashes"> for additional
+information.
+
+=item C<undef> fails on read only values
+
+Using the C<undef> operator on a readonly value (such as $1) has
+the same effect as assigning C<undef> to the readonly value--it
+throws an exception.
+
+=item Close-on-exec bit may be set on pipe and socket handles
+
+Pipe and socket handles are also now subject to the close-on-exec
+behavior determined by the special variable $^F.
+
+See L</"More consistent close-on-exec behavior">.
+
+=item Writing C<"$$1"> to mean C<"${$}1"> is unsupported
+
+Perl 5.004 deprecated the interpretation of C<$$1> and
+similar within interpolated strings to mean C<$$ . "1">,
+but still allowed it.
+
+In Perl 5.6.0 and later, C<"$$1"> always means C<"${$1}">.
+
+=item delete(), each(), values() and C<\(%h)>
+
+operate on aliases to values, not copies
+
+delete(), each(), values() and hashes (e.g. C<\(%h)>)
+in a list context return the actual
+values in the hash, instead of copies (as they used to in earlier
+versions).  Typical idioms for using these constructs copy the
+returned values, but this can make a significant difference when
+creating references to the returned values.  Keys in the hash are still
+returned as copies when iterating on a hash.
+
+See also L</"delete(), each(), values() and hash iteration are faster">.
+
+=item vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS
+
+vec() generates a run-time error if the BITS argument is not
+a valid power-of-two integer.
+
+=item Text of some diagnostic output has changed
+
+Most references to internal Perl operations in diagnostics
+have been changed to be more descriptive.  This may be an
+issue for programs that may incorrectly rely on the exact
+text of diagnostics for proper functioning.
+
+=item C<%@> has been removed
+
+The undocumented special variable C<%@> that used to accumulate
+"background" errors (such as those that happen in DESTROY())
+has been removed, because it could potentially result in memory
+leaks.
+
+=item Parenthesized not() behaves like a list operator
+
+The C<not> operator now falls under the "if it looks like a function,
+it behaves like a function" rule.
+
+As a result, the parenthesized form can be used with C<grep> and C<map>.
+The following construct used to be a syntax error before, but it works
+as expected now:
+
+    grep not($_), @things;
+
+On the other hand, using C<not> with a literal list slice may not
+work.  The following previously allowed construct:
+
+    print not (1,2,3)[0];
+
+needs to be written with additional parentheses now:
+
+    print not((1,2,3)[0]);
+
+The behavior remains unaffected when C<not> is not followed by parentheses.
+
+=item Semantics of bareword prototype C<(*)> have changed
+
+The semantics of the bareword prototype C<*> have changed.  Perl 5.005
+always coerced simple scalar arguments to a typeglob, which wasn't useful
+in situations where the subroutine must distinguish between a simple
+scalar and a typeglob.  The new behavior is to not coerce bareword
+arguments to a typeglob.  The value will always be visible as either
+a simple scalar or as a reference to a typeglob.
+
+See L</"More functional bareword prototype (*)">.
+
+=item Semantics of bit operators may have changed on 64-bit platforms
+
+If your platform is either natively 64-bit or if Perl has been
+configured to used 64-bit integers, i.e., $Config{ivsize} is 8, 
+there may be a potential incompatibility in the behavior of bitwise
+numeric operators (& | ^ ~ << >>).  These operators used to strictly
+operate on the lower 32 bits of integers in previous versions, but now
+operate over the entire native integral width.  In particular, note
+that unary C<~> will produce different results on platforms that have
+different $Config{ivsize}.  For portability, be sure to mask off
+the excess bits in the result of unary C<~>, e.g., C<~$x & 0xffffffff>.
+
+See L</"Bit operators support full native integer width">.
+
+=item More builtins taint their results
+
+As described in L</"Improved security features">, there may be more
+sources of taint in a Perl program.
+
+To avoid these new tainting behaviors, you can build Perl with the
+Configure option C<-Accflags=-DINCOMPLETE_TAINTS>.  Beware that the
+ensuing perl binary may be insecure.
+
+=back
+
+=head2 C Source Incompatibilities
+
+=over 4
+
+=item C<PERL_POLLUTE>
+
+Release 5.005 grandfathered old global symbol names by providing preprocessor
+macros for extension source compatibility.  As of release 5.6.0, these
+preprocessor definitions are not available by default.  You need to explicitly
+compile perl with C<-DPERL_POLLUTE> to get these definitions.  For
+extensions still using the old symbols, this option can be
+specified via MakeMaker:
+
+    perl Makefile.PL POLLUTE=1
+
+=item C<PERL_IMPLICIT_CONTEXT>
+
+This new build option provides a set of macros for all API functions
+such that an implicit interpreter/thread context argument is passed to
+every API function.  As a result of this, something like C<sv_setsv(foo,bar)>
+amounts to a macro invocation that actually translates to something like
+C<Perl_sv_setsv(my_perl,foo,bar)>.  While this is generally expected
+to not have any significant source compatibility issues, the difference
+between a macro and a real function call will need to be considered.
+
+This means that there B<is> a source compatibility issue as a result of
+this if your extensions attempt to use pointers to any of the Perl API
+functions.
+
+Note that the above issue is not relevant to the default build of
+Perl, whose interfaces continue to match those of prior versions
+(but subject to the other options described here).
+
+See L<perlguts/"The Perl API"> for detailed information on the
+ramifications of building Perl with this option.
+
+    NOTE: PERL_IMPLICIT_CONTEXT is automatically enabled whenever Perl is built
+    with one of -Dusethreads, -Dusemultiplicity, or both.  It is not
+    intended to be enabled by users at this time.
+
+=item C<PERL_POLLUTE_MALLOC>
+
+Enabling Perl's malloc in release 5.005 and earlier caused the namespace of
+the system's malloc family of functions to be usurped by the Perl versions,
+since by default they used the same names.  Besides causing problems on
+platforms that do not allow these functions to be cleanly replaced, this
+also meant that the system versions could not be called in programs that
+used Perl's malloc.  Previous versions of Perl have allowed this behaviour
+to be suppressed with the HIDEMYMALLOC and EMBEDMYMALLOC preprocessor
+definitions.
+
+As of release 5.6.0, Perl's malloc family of functions have default names
+distinct from the system versions.  You need to explicitly compile perl with
+C<-DPERL_POLLUTE_MALLOC> to get the older behaviour.  HIDEMYMALLOC
+and EMBEDMYMALLOC have no effect, since the behaviour they enabled is now
+the default.
+
+Note that these functions do B<not> constitute Perl's memory allocation API.
+See L<perlguts/"Memory Allocation"> for further information about that.
+
+=back
+
+=head2 Compatible C Source API Changes
+
+=over 4
+
+=item C<PATCHLEVEL> is now C<PERL_VERSION>
+
+The cpp macros C<PERL_REVISION>, C<PERL_VERSION>, and C<PERL_SUBVERSION>
+are now available by default from perl.h, and reflect the base revision,
+patchlevel, and subversion respectively.  C<PERL_REVISION> had no
+prior equivalent, while C<PERL_VERSION> and C<PERL_SUBVERSION> were
+previously available as C<PATCHLEVEL> and C<SUBVERSION>.
+
+The new names cause less pollution of the B<cpp> namespace and reflect what
+the numbers have come to stand for in common practice.  For compatibility,
+the old names are still supported when F<patchlevel.h> is explicitly
+included (as required before), so there is no source incompatibility
+from the change.
+
+=back
+
+=head2 Binary Incompatibilities
+
+In general, the default build of this release is expected to be binary
+compatible for extensions built with the 5.005 release or its maintenance
+versions.  However, specific platforms may have broken binary compatibility
+due to changes in the defaults used in hints files.  Therefore, please be
+sure to always check the platform-specific README files for any notes to
+the contrary.
+
+The usethreads or usemultiplicity builds are B<not> binary compatible
+with the corresponding builds in 5.005.
+
+On platforms that require an explicit list of exports (AIX, OS/2 and Windows,
+among others), purely internal symbols such as parser functions and the
+run time opcodes are not exported by default.  Perl 5.005 used to export
+all functions irrespective of whether they were considered part of the
+public API or not.
+
+For the full list of public API functions, see L<perlapi>.
+
+=head1 Known Problems
+
+=head2 Thread test failures
+
+The subtests 19 and 20 of lib/thr5005.t test are known to fail due to
+fundamental problems in the 5.005 threading implementation.  These are
+not new failures--Perl 5.005_0x has the same bugs, but didn't have these
+tests.
+
+=head2 EBCDIC platforms not supported
+
+In earlier releases of Perl, EBCDIC environments like OS390 (also
+known as Open Edition MVS) and VM-ESA were supported.  Due to changes
+required by the UTF-8 (Unicode) support, the EBCDIC platforms are not
+supported in Perl 5.6.0.
+
+=head2 In 64-bit HP-UX the lib/io_multihomed test may hang
+
+The lib/io_multihomed test may hang in HP-UX if Perl has been
+configured to be 64-bit.  Because other 64-bit platforms do not
+hang in this test, HP-UX is suspect.  All other tests pass
+in 64-bit HP-UX.  The test attempts to create and connect to
+"multihomed" sockets (sockets which have multiple IP addresses).
+
+=head2 NEXTSTEP 3.3 POSIX test failure
+
+In NEXTSTEP 3.3p2 the implementation of the strftime(3) in the
+operating system libraries is buggy: the %j format numbers the days of
+a month starting from zero, which, while being logical to programmers,
+will cause the subtests 19 to 27 of the lib/posix test may fail.
+
+=head2 Tru64 (aka Digital UNIX, aka DEC OSF/1) lib/sdbm test failure with gcc
+
+If compiled with gcc 2.95 the lib/sdbm test will fail (dump core).
+The cure is to use the vendor cc, it comes with the operating system
+and produces good code.
+
+=head2 UNICOS/mk CC failures during Configure run
+
+In UNICOS/mk the following errors may appear during the Configure run:
+
+	Guessing which symbols your C compiler and preprocessor define...
+	CC-20 cc: ERROR File = try.c, Line = 3
+	...
+	  bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
+	...
+	4 errors detected in the compilation of "try.c".
+
+The culprit is the broken awk of UNICOS/mk.  The effect is fortunately
+rather mild: Perl itself is not adversely affected by the error, only
+the h2ph utility coming with Perl, and that is rather rarely needed
+these days.
+
+=head2 Arrow operator and arrays
+
+When the left argument to the arrow operator C<< -> >> is an array, or
+the C<scalar> operator operating on an array, the result of the
+operation must be considered erroneous. For example:
+
+    @x->[2]
+    scalar(@x)->[2]
+
+These expressions will get run-time errors in some future release of
+Perl.
+
+=head2 Experimental features
+
+As discussed above, many features are still experimental.  Interfaces and
+implementation of these features are subject to change, and in extreme cases,
+even subject to removal in some future release of Perl.  These features
+include the following:
+
+=over 4
+
+=item Threads
+
+=item Unicode
+
+=item 64-bit support
+
+=item Lvalue subroutines
+
+=item Weak references
+
+=item The pseudo-hash data type
+
+=item The Compiler suite
+
+=item Internal implementation of file globbing
+
+=item The DB module
+
+=item The regular expression code constructs: 
+
+C<(?{ code })> and C<(??{ code })>
+
+=back
+
+=head1 Obsolete Diagnostics
+
+=over 4
+
+=item Character class syntax [: :] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[:" and ending with ":]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[:" and ":\]".
+
+=item Ill-formed logical name |%s| in prime_env_iter
+
+(W) A warning peculiar to VMS.  A logical name was encountered when preparing
+to iterate over %ENV which violates the syntactic rules governing logical
+names.  Because it cannot be translated normally, it is skipped, and will not
+appear in %ENV.  This may be a benign occurrence, as some software packages
+might directly modify logical name tables and introduce nonstandard names,
+or it may indicate that a logical name table has been corrupted.
+
+=item In string, @%s now must be written as \@%s
+
+The description of this error used to say:
+
+        (Someday it will simply assume that an unbackslashed @
+         interpolates an array.)
+
+That day has come, and this fatal error has been removed.  It has been
+replaced by a non-fatal warning instead.
+See L</Arrays now always interpolate into double-quoted strings> for
+details.
+
+=item Probable precedence problem on %s
+
+(W) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+    open FOO || die;
+
+=item regexp too big
+
+(F) The current implementation of regular expressions uses shorts as
+address offsets within a string.  Unfortunately this means that if
+the regular expression compiles to longer than 32767, it'll blow up.
+Usually when you want a regular expression this big, there is a better
+way to do it with multiple statements.  See L<perlre>.
+
+=item Use of "$$<digit>" to mean "${$}<digit>" is deprecated
+
+(D) Perl versions before 5.004 misinterpreted any type marker followed
+by "$" and a digit.  For example, "$$0" was incorrectly taken to mean
+"${$}0" instead of "${$0}".  This bug is (mostly) fixed in Perl 5.004.
+
+However, the developers of Perl 5.004 could not fix this bug completely,
+because at least two widely-used modules depend on the old meaning of
+"$$0" in a string.  So Perl 5.004 still interprets "$$<digit>" in the
+old (broken) way inside strings; but it generates this message as a
+warning.  And in Perl 5.005, this special treatment will cease.
+
+=back
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the
+articles recently posted to the comp.lang.perl.misc newsgroup.
+There may also be information at http://www.perl.com/perl/ , the Perl
+Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Gurusamy Sarathy <F<gsar@activestate.com>>, with many
+contributions from The Perl Porters.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl570delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl570delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl570delta.pod	(revision 14489)
@@ -0,0 +1,899 @@
+=head1 NAME
+
+perl570delta - what's new for perl v5.7.0
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.6.0 release and
+the 5.7.0 release.
+
+=head1 Security Vulnerability Closed
+
+A potential security vulnerability in the optional suidperl component
+of Perl has been identified.  suidperl is neither built nor installed
+by default.  As of September the 2nd, 2000, the only known vulnerable
+platform is Linux, most likely all Linux distributions.  CERT and
+various vendors have been alerted about the vulnerability.
+
+The problem was caused by Perl trying to report a suspected security
+exploit attempt using an external program, /bin/mail.  On Linux
+platforms the /bin/mail program had an undocumented feature which
+when combined with suidperl gave access to a root shell, resulting in
+a serious compromise instead of reporting the exploit attempt.  If you
+don't have /bin/mail, or if you have 'safe setuid scripts', or if
+suidperl is not installed, you are safe.
+
+The exploit attempt reporting feature has been completely removed from
+the Perl 5.7.0 release, so that particular vulnerability isn't there
+anymore.  However, further security vulnerabilities are,
+unfortunately, always possible.  The suidperl code is being reviewed
+and if deemed too risky to continue to be supported, it may be
+completely removed from future releases.  In any case, suidperl should
+only be used by security experts who know exactly what they are doing
+and why they are using suidperl instead of some other solution such as
+sudo ( see http://www.courtesan.com/sudo/ ).
+
+=head1 Incompatible Changes
+
+=over 4
+
+=item *
+
+Arrays now always interpolate into double-quoted strings:
+constructs like "foo@bar" now always assume C<@bar> is an array,
+whether or not the compiler has seen use of C<@bar>.
+
+=item *
+
+The semantics of bless(REF, REF) were unclear and until someone proves
+it to make some sense, it is forbidden.
+
+=item *
+
+A reference to a reference now stringify as "REF(0x81485ec)" instead
+of "SCALAR(0x81485ec)" in order to be more consistent with the return
+value of ref().
+
+=item *
+
+The very dusty examples in the eg/ directory have been removed.
+Suggestions for new shiny examples welcome but the main issue is that
+the examples need to be documented, tested and (most importantly)
+maintained.
+
+=item *
+
+The obsolete chat2 library that should never have been allowed
+to escape the laboratory has been decommissioned.
+
+=item *
+
+The unimplemented POSIX regex features [[.cc.]] and [[=c=]] are still
+recognised but now cause fatal errors.  The previous behaviour of
+ignoring them by default and warning if requested was unacceptable
+since it, in a way, falsely promised that the features could be used.
+
+=item *
+
+The (bogus) escape sequences \8 and \9 now give an optional warning
+("Unrecognized escape passed through").  There is no need to \-escape
+any C<\w> character.
+
+=item *
+
+lstat(FILEHANDLE) now gives a warning because the operation makes no sense.
+In future releases this may become a fatal error.
+
+=item *
+
+The long deprecated uppercase aliases for the string comparison
+operators (EQ, NE, LT, LE, GE, GT) have now been removed.
+
+=item *
+
+The regular expression captured submatches ($1, $2, ...) are now
+more consistently unset if the match fails, instead of leaving false
+data lying around in them.
+
+=item *
+
+The tr///C and tr///U features have been removed and will not return;
+the interface was a mistake.  Sorry about that.  For similar
+functionality, see pack('U0', ...) and pack('C0', ...).
+
+=back
+
+=head1 Core Enhancements
+
+=over 4
+
+=item *
+
+C<perl -d:Module=arg,arg,arg> now works (previously one couldn't pass
+in multiple arguments.)
+
+=item *
+
+my __PACKAGE__ $obj now works.
+
+=item *
+
+C<no Module;> now works even if there is no "sub unimport" in the Module.
+
+=item *
+
+The numerical comparison operators return C<undef> if either operand
+is a NaN.  Previously the behaviour was unspecified.
+
+=item *
+
+C<pack('U0a*', ...)> can now be used to force a string to UTF-8.
+
+=item *
+
+prototype(\&) is now available.
+
+=item *
+
+There is now an UNTIE method.
+
+=back
+
+=head1 Modules and Pragmata
+
+=head2 New Modules
+
+=over 4
+
+=item *
+
+File::Temp allows one to create temporary files and directories in an
+easy, portable, and secure way.
+
+=item *
+
+Storable gives persistence to Perl data structures by allowing the
+storage and retrieval of Perl data to and from files in a fast and
+compact binary format.
+
+=back
+
+=head2 Updated And Improved Modules and Pragmata
+
+=over 4
+
+=item *
+
+The following independently supported modules have been updated to
+newer versions from CPAN: CGI, CPAN, DB_File, File::Spec, Getopt::Long,
+the podlators bundle, Pod::LaTeX, Pod::Parser, Term::ANSIColor, Test.
+
+=item *
+
+Bug fixes and minor enhancements have been applied to B::Deparse,
+Data::Dumper, IO::Poll, IO::Socket::INET, Math::BigFloat,
+Math::Complex, Math::Trig, Net::protoent, the re pragma, SelfLoader,
+Sys::SysLog, Test::Harness, Text::Wrap, UNIVERSAL, and the warnings
+pragma.
+
+=item *
+
+The attributes::reftype() now works on tied arguments.
+
+=item *
+
+AutoLoader can now be disabled with C<no AutoLoader;>,
+
+=item *
+
+The English module can now be used without the infamous performance
+hit by saying
+
+	use English '-no_performance_hit';
+
+(Assuming, of course, that one doesn't need the troublesome variables
+C<$`>, C<$&>, or C<$'>.)  Also, introduced C<@LAST_MATCH_START> and
+C<@LAST_MATCH_END> English aliases for C<@-> and C<@+>.
+
+=item *
+
+File::Find now has pre- and post-processing callbacks.  It also
+correctly changes directories when chasing symbolic links.  Callbacks
+(naughtily) exiting with "next;" instead of "return;" now work.
+
+=item *
+
+File::Glob::glob() renamed to File::Glob::bsd_glob() to avoid
+prototype mismatch with CORE::glob().
+
+=item *
+
+IPC::Open3 now allows the use of numeric file descriptors.
+
+=item *
+
+use lib now works identically to @INC.  Removing directories
+with 'no lib' now works.
+
+=item *
+
+C<%INC> now localised in a Safe compartment so that use/require work.
+
+=item *
+
+The Shell module now has an OO interface.
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item *
+
+The Emacs perl mode (emacs/cperl-mode.el) has been updated to version
+4.31.
+
+=item *
+
+Perlbug is now much more robust.  It also sends the bug report to
+perl.org, not perl.com.
+
+=item *
+
+The perlcc utility has been rewritten and its user interface (that is,
+command line) is much more like that of the UNIX C compiler, cc.
+
+=item *
+
+The xsubpp utility for extension writers now understands POD
+documentation embedded in the *.xs files.
+
+=back
+
+=head1 New Documentation
+
+=over 4
+
+=item *
+
+perl56delta details the changes between the 5.005 release and the
+5.6.0 release.
+
+=item *
+
+perldebtut is a Perl debugging tutorial.
+
+=item *
+
+perlebcdic contains considerations for running Perl on EBCDIC platforms.
+Note that unfortunately EBCDIC platforms that used to supported back in
+Perl 5.005 are still unsupported by Perl 5.7.0; the plan, however, is to
+bring them back to the fold.  
+
+=item *
+
+perlnewmod tells about writing and submitting a new module.
+
+=item *
+
+perlposix-bc explains using Perl on the POSIX-BC platform
+(an EBCDIC mainframe platform).
+
+=item *
+
+perlretut is a regular expression tutorial.
+
+=item *
+
+perlrequick is a regular expressions quick-start guide.
+Yes, much quicker than perlretut.
+
+=item *
+
+perlutil explains the command line utilities packaged with the Perl
+distribution.
+
+=back
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+map() that changes the size of the list should now work faster.
+
+=item *
+
+sort() has been changed to use mergesort internally as opposed to the
+earlier quicksort.  For very small lists this may result in slightly
+slower sorting times, but in general the speedup should be at least
+20%.  Additional bonuses are that the worst case behaviour of sort()
+is now better (in computer science terms it now runs in time O(N log N),
+as opposed to quicksort's Theta(N**2) worst-case run time behaviour),
+and that sort() is now stable (meaning that elements with identical
+keys will stay ordered as they were before the sort).
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+=head2 Generic Improvements
+
+=over 4
+
+=item *
+
+INSTALL now explains how you can configure Perl to use 64-bit
+integers even on non-64-bit platforms.
+
+=item *
+
+Policy.sh policy change: if you are reusing a Policy.sh file
+(see INSTALL) and you use Configure -Dprefix=/foo/bar and in the old
+Policy $prefix eq $siteprefix and $prefix eq $vendorprefix, all of
+them will now be changed to the new prefix, /foo/bar.  (Previously
+only $prefix changed.)  If you do not like this new behaviour,
+specify prefix, siteprefix, and vendorprefix explicitly.
+
+=item *
+
+A new optional location for Perl libraries, otherlibdirs, is available.
+It can be used for example for vendor add-ons without disturbing Perl's
+own library directories.
+
+=item *
+
+In many platforms the vendor-supplied 'cc' is too stripped-down to
+build Perl (basically, 'cc' doesn't do ANSI C).  If this seems
+to be the case and 'cc' does not seem to be the GNU C compiler
+'gcc', an automatic attempt is made to find and use 'gcc' instead.
+
+=item *
+
+gcc needs to closely track the operating system release to avoid
+build problems. If Configure finds that gcc was built for a different
+operating system release than is running, it now gives a clearly visible
+warning that there may be trouble ahead.
+
+=item *
+
+If binary compatibility with the 5.005 release is not wanted, Configure
+no longer suggests including the 5.005 modules in @INC.
+
+=item *
+
+Configure C<-S> can now run non-interactively.
+
+=item *
+
+configure.gnu now works with options with whitespace in them.
+
+=item *
+
+installperl now outputs everything to STDERR.
+
+=item *
+
+$Config{byteorder} is now computed dynamically (this is more robust
+with "fat binaries" where an executable image contains binaries for
+more than one binary platform.)
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+Several debugger fixes: exit code now reflects the script exit code,
+condition C<"0"> now treated correctly, the C<d> command now checks
+line number, the C<$.> no longer gets corrupted, all debugger output now
+goes correctly to the socket if RemotePort is set.
+
+=item *
+
+C<*foo{FORMAT}> now works.
+
+=item *
+
+Lexical warnings now propagating correctly between scopes.
+
+=item *
+
+Line renumbering with eval and C<#line> now works.
+
+=item *
+
+Fixed numerous memory leaks, especially in eval "".
+
+=item *
+
+Modulus of unsigned numbers now works (4063328477 % 65535 used to
+return 27406, instead of 27047).
+
+=item *
+
+Some "not a number" warnings introduced in 5.6.0 eliminated to be
+more compatible with 5.005.  Infinity is now recognised as a number.
+
+=item *
+
+our() variables will not cause "will not stay shared" warnings.
+
+=item *
+
+pack "Z" now correctly terminates the string with "\0".
+
+=item *
+
+Fix password routines which in some shadow password platforms
+(e.g. HP-UX) caused getpwent() to return every other entry.
+
+=item *
+
+printf() no longer resets the numeric locale to "C".
+
+=item *
+
+C<q(a\\b)> now parses correctly as C<'a\\b'>.
+
+=item *
+
+Printing quads (64-bit integers) with printf/sprintf now works
+without the q L ll prefixes (assuming you are on a quad-capable platform).
+
+=item *
+
+Regular expressions on references and overloaded scalars now work.
+
+=item *
+
+scalar() now forces scalar context even when used in void context.
+
+=item *
+
+sort() arguments are now compiled in the right wantarray context
+(they were accidentally using the context of the sort() itself).
+
+=item *
+
+Changed the POSIX character class C<[[:space:]]> to include the (very
+rare) vertical tab character.  Added a new POSIX-ish character class
+C<[[:blank:]]> which stands for horizontal whitespace (currently,
+the space and the tab).
+
+=item *
+
+$AUTOLOAD, sort(), lock(), and spawning subprocesses
+in multiple threads simultaneously are now thread-safe.
+
+=item *
+
+Allow read-only string on left hand side of non-modifying tr///.
+
+=item *
+
+Several Unicode fixes (but still not perfect).
+
+=over 8
+
+=item *
+
+BOMs (byte order marks) in the beginning of Perl files
+(scripts, modules) should now be transparently skipped.
+UTF-16 (UCS-2) encoded Perl files should now be read correctly.
+
+=item *
+
+The character tables have been updated to Unicode 3.0.1.
+
+=item *
+
+chr() for values greater than 127 now create utf8 when under use
+utf8.
+
+=item *
+
+Comparing with utf8 data does not magically upgrade non-utf8 data into
+utf8.
+
+=item *
+
+C<IsAlnum>, C<IsAlpha>, and C<IsWord> now match titlecase.
+
+=item *
+
+Concatenation with the C<.> operator or via variable interpolation,
+C<eq>, C<substr>, C<reverse>, C<quotemeta>, the C<x> operator,
+substitution with C<s///>, single-quoted UTF-8, should now work--in
+theory.
+
+=item *
+
+The C<tr///> operator now works I<slightly> better but is still rather
+broken.  Note that the C<tr///CU> functionality has been removed (but
+see pack('U0', ...)).
+
+=item *
+
+vec() now refuses to deal with characters >255.
+
+=item *
+
+Zero entries were missing from the Unicode classes like C<IsDigit>.
+
+=back
+
+=item *
+
+UNIVERSAL::isa no longer caches methods incorrectly.  (This broke
+the Tk extension with 5.6.0.)
+
+=back
+
+=head2 Platform Specific Changes and Fixes
+
+=over 4
+
+=item *
+
+BSDI 4.*
+
+Perl now works on post-4.0 BSD/OSes.
+
+=item *
+
+All BSDs
+
+Setting C<$0> now works (as much as possible; see perlvar for details).
+
+=item *
+
+Cygwin
+
+Numerous updates; currently synchronised with Cygwin 1.1.4.
+
+=item *
+
+EPOC
+
+EPOC update after Perl 5.6.0.  See README.epoc.
+
+=item *
+
+FreeBSD 3.*
+
+Perl now works on post-3.0 FreeBSDs.
+
+=item *
+
+HP-UX
+
+README.hpux updated; C<Configure -Duse64bitall> now almost works.
+
+=item *
+
+IRIX
+
+Numerous compilation flag and hint enhancements; accidental mixing
+of 32-bit and 64-bit libraries (a doomed attempt) made much harder.
+
+=item *
+
+Linux
+
+Long doubles should now work (see INSTALL).
+
+=item *
+
+Mac OS Classic
+
+Compilation of the standard Perl distribution in Mac OS Classic should
+now work if you have the Metrowerks development environment and the
+missing Mac-specific toolkit bits.  Contact the macperl mailing list
+for details.
+
+=item *
+
+MPE/iX
+
+MPE/iX update after Perl 5.6.0.  See README.mpeix.
+
+=item *
+
+NetBSD/sparc
+
+Perl now works on NetBSD/sparc.
+
+=item *
+
+OS/2
+
+Now works with usethreads (see INSTALL).
+
+=item *
+
+Solaris
+
+64-bitness using the Sun Workshop compiler now works.
+
+=item *
+
+Tru64 (aka Digital UNIX, aka DEC OSF/1)
+
+The operating system version letter now recorded in $Config{osvers}.
+Allow compiling with gcc (previously explicitly forbidden).  Compiling
+with gcc still not recommended because buggy code results, even with
+gcc 2.95.2.
+
+=item *
+
+Unicos
+
+Fixed various alignment problems that lead into core dumps either
+during build or later; no longer dies on math errors at runtime;
+now using full quad integers (64 bits), previously was using 
+only 46 bit integers for speed.
+
+=item *
+
+VMS
+
+chdir() now works better despite a CRT bug; now works with MULTIPLICITY
+(see INSTALL); now works with Perl's malloc.
+
+=item *
+
+Windows
+
+=over 8
+
+=item *
+
+accept() no longer leaks memory.
+
+=item *
+
+Better chdir() return value for a non-existent directory.
+
+=item *
+
+New %ENV entries now propagate to subprocesses.
+
+=item *
+
+$ENV{LIB} now used to search for libs under Visual C.
+
+=item *
+
+A failed (pseudo)fork now returns undef and sets errno to EAGAIN.
+
+=item *
+
+Allow REG_EXPAND_SZ keys in the registry.
+
+=item *
+
+Can now send() from all threads, not just the first one.
+
+=item *
+
+Fake signal handling reenabled, bugs and all.
+
+=item *
+
+Less stack reserved per thread so that more threads can run
+concurrently. (Still 16M per thread.)
+
+=item *
+
+C<< File::Spec->tmpdir() >> now prefers C:/temp over /tmp
+(works better when perl is running as service).
+
+=item *
+
+Better UNC path handling under ithreads.
+
+=item *
+
+wait() and waitpid() now work much better.
+
+=item *
+
+winsock handle leak fixed.
+
+=back
+
+=back
+
+=head1 New or Changed Diagnostics
+
+All regular expression compilation error messages are now hopefully
+easier to understand both because the error message now comes before
+the failed regex and because the point of failure is now clearly
+marked.
+
+The various "opened only for", "on closed", "never opened" warnings
+drop the C<main::> prefix for filehandles in the C<main> package,
+for example C<STDIN> instead of <main::STDIN>. 
+
+The "Unrecognized escape" warning has been extended to include C<\8>,
+C<\9>, and C<\_>.  There is no need to escape any of the C<\w> characters.
+
+=head1 Changed Internals
+
+=over 4
+
+=item *
+
+perlapi.pod (a companion to perlguts) now attempts to document the
+internal API.
+
+=item *
+
+You can now build a really minimal perl called microperl.
+Building microperl does not require even running Configure;
+C<make -f Makefile.micro> should be enough.  Beware: microperl makes
+many assumptions, some of which may be too bold; the resulting
+executable may crash or otherwise misbehave in wondrous ways.
+For careful hackers only.
+
+=item *
+
+Added rsignal(), whichsig(), do_join() to the publicised API.
+
+=item *
+
+Made possible to propagate customised exceptions via croak()ing.
+
+=item *
+
+Added is_utf8_char(), is_utf8_string(), bytes_to_utf8(), and utf8_to_bytes().
+
+=item *
+
+Now xsubs can have attributes just like subs.
+
+=back
+
+=head1 Known Problems
+
+=head2 Unicode Support Still Far From Perfect
+
+We're working on it.  Stay tuned.
+
+=head2 EBCDIC Still A Lost Platform
+
+The plan is to bring them back.
+
+=head2 Building Extensions Can Fail Because Of Largefiles
+
+Certain extensions like mod_perl and BSD::Resource are known to have
+issues with `largefiles', a change brought by Perl 5.6.0 in which file
+offsets default to 64 bits wide, where supported.  Modules may fail to
+compile at all or compile and work incorrectly.  Currently there is no
+good solution for the problem, but Configure now provides appropriate
+non-largefile ccflags, ldflags, libswanted, and libs in the %Config
+hash (e.g., $Config{ccflags_nolargefiles}) so the extensions that are
+having problems can try configuring themselves without the
+largefileness.  This is admittedly not a clean solution, and the
+solution may not even work at all.  One potential failure is whether
+one can (or, if one can, whether it's a good idea) link together at
+all binaries with different ideas about file offsets, all this is
+platform-dependent.
+
+=head2 ftmp-security tests warn 'system possibly insecure'
+
+Don't panic.  Read INSTALL 'make test' section instead. 
+
+=head2 Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
+
+If perl is configured with -Duse64bitall, the successful result of the
+subtest 10 of lib/posix may arrive before the successful result of the
+subtest 9, which confuses the test harness so much that it thinks the
+subtest 9 failed.
+
+=head2 Long Doubles Still Don't Work In Solaris
+
+The experimental long double support is still very much so in Solaris.
+(Other platforms like Linux and Tru64 are beginning to solidify in
+this area.)
+
+=head2 Linux With Sfio Fails op/misc Test 48
+
+No known fix.
+
+=head2 Storable tests fail in some platforms
+
+If any Storable tests fail the use of Storable is not advisable.
+
+=over 4
+
+=item *
+
+Many Storable tests fail on AIX configured with 64 bit integers.
+
+So far unidentified problems break Storable in AIX if Perl is
+configured to use 64 bit integers.  AIX in 32-bit mode works and
+other 64-bit platforms work with Storable.
+
+=item *
+
+DOS DJGPP may hang when testing Storable.
+
+=item *
+
+st-06compat fails in UNICOS and UNICOS/mk.
+
+This means that you cannot read old (pre-Storable-0.7) Storable images
+made in other platforms.
+
+=item *
+
+st-store.t and st-retrieve may fail with Compaq C 6.2 on OpenVMS Alpha 7.2.
+
+=back
+
+=head2 Threads Are Still Experimental
+
+Multithreading is still an experimental feature.  Some platforms
+emit the following message for lib/thr5005
+
+    #
+    # This is a KNOWN FAILURE, and one of the reasons why threading
+    # is still an experimental feature.  It is here to stop people
+    # from deploying threads in production. ;-)
+    #
+
+and another known thread-related warning is
+
+   pragma/overload......Unbalanced saves: 3 more saves than restores
+   panic: magic_mutexfree during global destruction.
+   ok
+   lib/selfloader.......Unbalanced saves: 3 more saves than restores
+   panic: magic_mutexfree during global destruction.
+   ok
+   lib/st-dclone........Unbalanced saves: 3 more saves than restores
+   panic: magic_mutexfree during global destruction.
+   ok
+
+=head2 The Compiler Suite Is Still Experimental
+
+The compiler suite is slowly getting better but is nowhere near
+working order yet.  The backend part that has seen perhaps the most
+progress is the bytecode compiler.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/  There may also be
+information at http://www.perl.com/perl/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Jarkko Hietaniemi <F<jhi@iki.fi>>, with many contributions
+from The Perl Porters and Perl Users submitting feedback and patches.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl571delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl571delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl571delta.pod	(revision 14489)
@@ -0,0 +1,1075 @@
+=head1 NAME
+
+perl571delta - what's new for perl v5.7.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.7.0 release and the
+5.7.1 release.  
+
+(To view the differences between the 5.6.0 release and the 5.7.0
+release, see L<perl570delta>.)
+
+=head1 Security Vulnerability Closed
+
+(This change was already made in 5.7.0 but bears repeating here.)
+
+A potential security vulnerability in the optional suidperl component
+of Perl was identified in August 2000.  suidperl is neither built nor
+installed by default.  As of April 2001 the only known vulnerable
+platform is Linux, most likely all Linux distributions.  CERT and
+various vendors and distributors have been alerted about the vulnerability.
+See http://www.cpan.org/src/5.0/sperl-2000-08-05/sperl-2000-08-05.txt
+for more information.
+
+The problem was caused by Perl trying to report a suspected security
+exploit attempt using an external program, /bin/mail.  On Linux
+platforms the /bin/mail program had an undocumented feature which
+when combined with suidperl gave access to a root shell, resulting in
+a serious compromise instead of reporting the exploit attempt.  If you
+don't have /bin/mail, or if you have 'safe setuid scripts', or if
+suidperl is not installed, you are safe.
+
+The exploit attempt reporting feature has been completely removed from
+all the Perl 5.7 releases (and will be gone also from the maintenance
+release 5.6.1), so that particular vulnerability isn't there anymore.
+However, further security vulnerabilities are, unfortunately, always
+possible.  The suidperl code is being reviewed and if deemed too risky
+to continue to be supported, it may be completely removed from future
+releases.  In any case, suidperl should only be used by security
+experts who know exactly what they are doing and why they are using
+suidperl instead of some other solution such as sudo
+( see http://www.courtesan.com/sudo/ ).
+
+=head1 Incompatible Changes
+
+=over 4
+
+=item *
+
+Although "you shouldn't do that", it was possible to write code that
+depends on Perl's hashed key order (Data::Dumper does this).  The new
+algorithm "One-at-a-Time" produces a different hashed key order.
+More details are in L</"Performance Enhancements">.
+
+=item *
+
+The list of filenames from glob() (or <...>) is now by default sorted
+alphabetically to be csh-compliant.  (bsd_glob() does still sort platform
+natively, ASCII or EBCDIC, unless GLOB_ALPHASORT is specified.)
+
+=back
+
+=head1 Core Enhancements
+
+=head2 AUTOLOAD Is Now Lvaluable
+
+AUTOLOAD is now lvaluable, meaning that you can add the :lvalue attribute
+to AUTOLOAD subroutines and you can assign to the AUTOLOAD return value.
+
+=head2 PerlIO is Now The Default
+
+=over 4
+
+=item *
+
+IO is now by default done via PerlIO rather than system's "stdio".
+PerlIO allows "layers" to be "pushed" onto a file handle to alter the
+handle's behaviour.  Layers can be specified at open time via 3-arg
+form of open:
+
+   open($fh,'>:crlf :utf8', $path) || ...
+
+or on already opened handles via extended C<binmode>:
+
+   binmode($fh,':encoding(iso-8859-7)');
+
+The built-in layers are: unix (low level read/write), stdio (as in
+previous Perls), perlio (re-implementation of stdio buffering in a
+portable manner), crlf (does CRLF <=> "\n" translation as on Win32,
+but available on any platform).  A mmap layer may be available if
+platform supports it (mostly UNIXes).
+
+Layers to be applied by default may be specified via the 'open' pragma.
+
+See L</"Installation and Configuration Improvements"> for the effects
+of PerlIO on your architecture name.
+
+=item *
+
+File handles can be marked as accepting Perl's internal encoding of Unicode
+(UTF-8 or UTF-EBCDIC depending on platform) by a pseudo layer ":utf8" :
+
+   open($fh,">:utf8","Uni.txt");
+
+Note for EBCDIC users: the pseudo layer ":utf8" is erroneously named
+for you since it's not UTF-8 what you will be getting but instead
+UTF-EBCDIC.  See L<perlunicode>, L<utf8>, and
+http://www.unicode.org/unicode/reports/tr16/ for more information.
+In future releases this naming may change.
+
+=item *
+
+File handles can translate character encodings from/to Perl's internal
+Unicode form on read/write via the ":encoding()" layer.
+
+=item *
+
+File handles can be opened to "in memory" files held in Perl scalars via:
+
+   open($fh,'>', \$variable) || ...
+
+=item *
+
+Anonymous temporary files are available without need to
+'use FileHandle' or other module via
+
+   open($fh,"+>", undef) || ...
+
+That is a literal undef, not an undefined value.
+
+=item *
+
+The list form of C<open> is now implemented for pipes (at least on UNIX):
+
+   open($fh,"-|", 'cat', '/etc/motd')
+
+creates a pipe, and runs the equivalent of exec('cat', '/etc/motd') in
+the child process.
+
+=item *
+
+The following builtin functions are now overridable: chop(), chomp(),
+each(), keys(), pop(), push(), shift(), splice(), unshift().
+
+=item *
+
+Formats now support zero-padded decimal fields.
+
+=item *
+
+Perl now tries internally to use integer values in numeric conversions
+and basic arithmetics (+ - * /) if the arguments are integers, and
+tries also to keep the results stored internally as integers.
+This change leads into often slightly faster and always less lossy
+arithmetics. (Previously Perl always preferred floating point numbers
+in its math.)
+
+=item *
+
+The printf() and sprintf() now support parameter reordering using the
+C<%\d+\$> and C<*\d+\$> syntaxes.  For example
+
+    print "%2\$s %1\$s\n", "foo", "bar";
+
+will print "bar foo\n"; This feature helps in writing
+internationalised software.
+
+=item *
+
+Unicode in general should be now much more usable.  Unicode can be
+used in hash keys, Unicode in regular expressions should work now,
+Unicode in tr/// should work now (though tr/// seems to be a
+particularly tricky to get right, so you have been warned)
+
+=item *
+
+The Unicode Character Database coming with Perl has been upgraded
+to Unicode 3.1.  For more information, see http://www.unicode.org/ ,
+and http://www.unicode.org/unicode/reports/tr27/
+
+For developers interested in enhancing Perl's Unicode capabilities:
+almost all the UCD files are included with the Perl distribution in
+the lib/unicode subdirectory.  The most notable omission, for space
+considerations, is the Unihan database.
+
+=item *
+
+The Unicode character classes \p{Blank} and \p{SpacePerl} have been
+added.  "Blank" is like C isblank(), that is, it contains only
+"horizontal whitespace" (the space character is, the newline isn't),
+and the "SpacePerl" is the Unicode equivalent of C<\s> (\p{Space}
+isn't, since that includes the vertical tabulator character, whereas
+C<\s> doesn't.)
+
+=back
+
+=head2 Signals Are Now Safe
+
+Perl used to be fragile in that signals arriving at inopportune moments
+could corrupt Perl's internal state.
+
+=head1 Modules and Pragmata
+
+=head2 New Modules
+
+=over 4
+
+=item *
+
+B::Concise, by Stephen McCamant, is a new compiler backend for
+walking the Perl syntax tree, printing concise info about ops.
+The output is highly customisable.
+
+See L<B::Concise> for more information.
+
+=item *
+
+Class::ISA, by Sean Burke, for reporting the search path for a
+class's ISA tree, has been added.
+
+See L<Class::ISA> for more information.
+
+=item *
+
+Cwd has now a split personality: if possible, an extension is used,
+(this will hopefully be both faster and more secure and robust) but
+if not possible, the familiar Perl library implementation is used.
+
+=item *
+
+Digest, a frontend module for calculating digests (checksums),
+from Gisle Aas, has been added.
+
+See L<Digest> for more information.
+
+=item *
+
+Digest::MD5 for calculating MD5 digests (checksums), by Gisle Aas,
+has been added.
+
+    use Digest::MD5 'md5_hex';
+
+    $digest = md5_hex("Thirsty Camel");
+
+    print $digest, "\n"; # 01d19d9d2045e005c3f1b80e8b164de1
+
+NOTE: the MD5 backward compatibility module is deliberately not
+included since its use is discouraged.
+
+See L<Digest::MD5> for more information.
+
+=item *
+
+Encode, by Nick Ing-Simmons, provides a mechanism to translate
+between different character encodings.  Support for Unicode,
+ISO-8859-*, ASCII, CP*, KOI8-R, and three variants of EBCDIC are
+compiled in to the module.  Several other encodings (like Japanese,
+Chinese, and MacIntosh encodings) are included and will be loaded at
+runtime.
+
+Any encoding supported by Encode module is also available to the
+":encoding()" layer if PerlIO is used.
+
+See L<Encode> for more information.
+
+=item *
+
+Filter::Simple is an easy-to-use frontend to Filter::Util::Call,
+from Damian Conway.
+
+    # in MyFilter.pm:
+
+    package MyFilter;
+
+    use Filter::Simple sub {
+        while (my ($from, $to) = splice @_, 0, 2) {
+                s/$from/$to/g;
+        }
+    };
+
+    1;
+
+    # in user's code:
+
+    use MyFilter qr/red/ => 'green';
+
+    print "red\n";   # this code is filtered, will print "green\n"
+    print "bored\n"; # this code is filtered, will print "bogreen\n"
+
+    no MyFilter;
+
+    print "red\n";   # this code is not filtered, will print "red\n"
+
+See L<Filter::Simple> for more information.
+
+=item *
+
+Filter::Util::Call, by Paul Marquess, provides you with the
+framework to write I<Source Filters> in Perl.  For most uses
+the frontend Filter::Simple is to be preferred.
+See L<Filter::Util::Call> for more information.
+
+=item *
+
+Locale::Constants, Locale::Country, Locale::Currency, and Locale::Language,
+from Neil Bowers, have been added.  They provide the codes for various
+locale standards, such as "fr" for France, "usd" for US Dollar, and
+"jp" for Japanese.
+
+    use Locale::Country;
+
+    $country = code2country('jp');               # $country gets 'Japan'
+    $code    = country2code('Norway');           # $code gets 'no'
+
+See L<Locale::Constants>, L<Locale::Country>, L<Locale::Currency>,
+and L<Locale::Language> for more information.
+
+=item *
+
+MIME::Base64, by Gisle Aas, allows you to encode data in base64.
+
+    use MIME::Base64;
+
+    $encoded = encode_base64('Aladdin:open sesame');
+    $decoded = decode_base64($encoded);
+
+    print $encoded, "\n"; # "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
+
+See L<MIME::Base64> for more information.
+
+=item *
+
+MIME::QuotedPrint, by Gisle Aas, allows you to encode data in
+quoted-printable encoding.
+
+    use MIME::QuotedPrint;
+
+    $encoded = encode_qp("Smiley in Unicode: \x{263a}");
+    $decoded = decode_qp($encoded);
+
+    print $encoded, "\n"; # "Smiley in Unicode: =263A"
+
+MIME::QuotedPrint has been enhanced to provide the basic methods
+necessary to use it with PerlIO::Via as in :
+
+    use MIME::QuotedPrint;
+    open($fh,">Via(MIME::QuotedPrint)",$path)
+
+See L<MIME::QuotedPrint> for more information.
+
+=item *
+
+PerlIO::Scalar, by Nick Ing-Simmons, provides the implementation of
+IO to "in memory" Perl scalars as discussed above.  It also serves as
+an example of a loadable layer.  Other future possibilities include
+PerlIO::Array and PerlIO::Code.  See L<PerlIO::Scalar> for more
+information.
+
+=item *
+
+PerlIO::Via, by Nick Ing-Simmons, acts as a PerlIO layer and wraps
+PerlIO layer functionality provided by a class (typically implemented
+in perl code).
+
+    use MIME::QuotedPrint;
+    open($fh,">Via(MIME::QuotedPrint)",$path)
+
+This will automatically convert everything output to C<$fh>
+to Quoted-Printable.  See L<PerlIO::Via> for more information.
+
+=item *
+
+Pod::Text::Overstrike, by Joe Smith, has been added.
+It converts POD data to formatted overstrike text.
+See L<Pod::Text::Overstrike> for more information.
+
+=item *
+
+Switch from Damian Conway has been added.  Just by saying
+
+    use Switch;
+
+you have C<switch> and C<case> available in Perl.
+
+    use Switch;
+
+    switch ($val) {
+
+		case 1		{ print "number 1" }
+		case "a"	{ print "string a" }
+		case [1..10,42]	{ print "number in list" }
+		case (@array)	{ print "number in list" }
+		case /\w+/	{ print "pattern" }
+		case qr/\w+/	{ print "pattern" }
+		case (%hash)	{ print "entry in hash" }
+		case (\%hash)	{ print "entry in hash" }
+		case (\&sub)	{ print "arg to subroutine" }
+		else		{ print "previous case not true" }
+    }
+
+See L<Switch> for more information.
+
+=item *
+
+Text::Balanced from Damian Conway has been added, for
+extracting delimited text sequences from strings.
+
+    use Text::Balanced 'extract_delimited';
+
+    ($a, $b) = extract_delimited("'never say never', he never said", "'", '');
+
+$a will be "'never say never'", $b will be ', he never said'.
+
+In addition to extract_delimited() there are also extract_bracketed(),
+extract_quotelike(), extract_codeblock(), extract_variable(),
+extract_tagged(), extract_multiple(), gen_delimited_pat(), and
+gen_extract_tagged().  With these you can implement rather advanced
+parsing algorithms.  See L<Text::Balanced> for more information.
+
+=item *
+
+Tie::RefHash::Nestable, by Edward Avis, allows storing hash references
+(unlike the standard Tie::RefHash)  The module is contained within
+Tie::RefHash.
+
+=item *
+
+XS::Typemap, by Tim Jenness, is a test extension that exercises XS
+typemaps.  Nothing gets installed but for extension writers the code
+is worth studying.
+
+=back
+
+=head2 Updated And Improved Modules and Pragmata
+
+=over 4
+
+=item *
+
+B::Deparse should be now more robust.  It still far from providing a full
+round trip for any random piece of Perl code, though, and is under active
+development: expect more robustness in 5.7.2.
+
+=item *
+
+Class::Struct can now define the classes in compile time.
+
+=item *
+
+Math::BigFloat has undergone much fixing, and in addition the fmod()
+function now supports modulus operations.
+
+( The fixed Math::BigFloat module is also available in CPAN for those
+who can't upgrade their Perl: http://www.cpan.org/authors/id/J/JP/JPEACOCK/ )
+
+=item *
+
+Devel::Peek now has an interface for the Perl memory statistics
+(this works only if you are using perl's malloc, and if you have
+compiled with debugging).
+
+=item *
+
+IO::Socket has now atmark() method, which returns true if the socket
+is positioned at the out-of-band mark.  The method is also exportable
+as a sockatmark() function.
+
+=item *
+
+IO::Socket::INET has support for ReusePort option (if your platform
+supports it).  The Reuse option now has an alias, ReuseAddr.  For clarity
+you may want to prefer ReuseAddr.
+
+=item *
+
+Net::Ping has been enhanced.  There is now "external" protocol which
+uses Net::Ping::External module which runs external ping(1) and parses
+the output.  An alpha version of Net::Ping::External is available in
+CPAN and in 5.7.2 the Net::Ping::External may be integrated to Perl.
+
+=item *
+
+The C<open> pragma allows layers other than ":raw" and ":crlf" when
+using PerlIO.
+
+=item *
+
+POSIX::sigaction() is now much more flexible and robust.
+You can now install coderef handlers, 'DEFAULT', and 'IGNORE'
+handlers, installing new handlers was not atomic.
+
+=item *
+
+The Test module has been significantly enhanced.  Its use is
+greatly recommended for module writers.
+
+=item *
+
+The utf8:: name space (as in the pragma) provides various
+Perl-callable functions to provide low level access to Perl's
+internal Unicode representation.  At the moment only length()
+has been implemented.
+
+=back
+
+The following modules have been upgraded from the versions at CPAN:
+CPAN, CGI, DB_File, File::Temp, Getopt::Long, Pod::Man, Pod::Text,
+Storable, Text-Tabs+Wrap.
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+Hashes now use Bob Jenkins "One-at-a-Time" hashing key algorithm
+( http://burtleburtle.net/bob/hash/doobs.html ).  This algorithm is
+reasonably fast while producing a much better spread of values than
+the old hashing algorithm (originally by Chris Torek, later tweaked by
+Ilya Zakharevich).  Hash values output from the algorithm on a hash of
+all 3-char printable ASCII keys comes much closer to passing the
+DIEHARD random number generation tests.  According to perlbench, this
+change has not affected the overall speed of Perl.
+
+=item *
+
+unshift() should now be noticeably faster.
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item *
+
+h2xs now produces template README.
+
+=item *
+
+s2p has been completely rewritten in Perl.  (It is in fact a full
+implementation of sed in Perl.)
+
+=item *
+
+xsubpp now supports OUT keyword.
+
+=back
+
+=head1 New Documentation
+
+=head2 perlclib
+
+Internal replacements for standard C library functions.
+(Interesting only for extension writers and Perl core hackers.)
+
+=head2 perliol
+
+Internals of PerlIO with layers.
+
+=head2 README.aix
+
+Documentation on compiling Perl on AIX has been added.  AIX has
+several different C compilers and getting the right patch level
+is essential.  On install README.aix will be installed as L<perlaix>.
+
+=head2 README.bs2000
+
+Documentation on compiling Perl on the POSIX-BC platform (an EBCDIC
+mainframe environment) has been added.
+
+This was formerly known as README.posix-bc but the name was considered
+to be too confusing (it has nothing to do with the POSIX module or the
+POSIX standard).  On install README.bs2000 will be installed as L<perlbs2000>.
+
+=head2 README.macos
+
+In perl 5.7.1 (and in the 5.6.1) the MacPerl sources have been
+synchronised with the standard Perl sources.  To compile MacPerl
+some additional steps are required, and this file documents those
+steps.  On install README.macos will be installed as L<perlmacos>.
+
+=head2 README.mpeix
+
+The README.mpeix has been podified, which means that this information
+about compiling and using Perl on the MPE/iX miniframe platform will
+be installed as L<perlmpeix>.
+
+=head2 README.solaris
+
+README.solaris has been created and Solaris wisdom from elsewhere
+in the Perl documentation has been collected there.  On install
+README.solaris will be installed as L<perlsolaris>.
+
+=head2 README.vos
+
+The README.vos has been podified, which means that this information
+about compiling and using Perl on the Stratus VOS miniframe platform
+will be installed as L<perlvos>.
+
+=head2 Porting/repository.pod
+
+Documentation on how to use the Perl source repository has been added.
+
+=head1 Installation and Configuration Improvements
+
+=over 4
+
+=item *
+
+Because PerlIO is now the default on most platforms, "-perlio" doesn't
+get appended to the $Config{archname} (also known as $^O) anymore.
+Instead, if you explicitly choose not to use perlio (Configure command
+line option -Uuseperlio), you will get "-stdio" appended.
+
+=item *
+
+Another change related to the architecture name is that "-64all"
+(-Duse64bitall, or "maximally 64-bit") is appended only if your
+pointers are 64 bits wide.  (To be exact, the use64bitall is ignored.)
+
+=item *
+
+APPLLIB_EXP, a less-know configuration-time definition, has been
+documented.  It can be used to prepend site-specific directories
+to Perl's default search path (@INC), see INSTALL for information.
+
+=item *
+
+Building Berkeley DB3 for compatibility modes for DB, NDBM, and ODBM
+has been documented in INSTALL.
+
+=item *
+
+If you are on IRIX or Tru64 platforms, new profiling/debugging options
+have been added, see L<perlhack> for more information about pixie and
+Third Degree.
+
+=back
+
+=head2 New Or Improved Platforms
+
+For the list of platforms known to support Perl,
+see L<perlport/"Supported Platforms">.
+
+=over 4
+
+=item *
+
+AIX dynamic loading should be now better supported.
+
+=item *
+
+After a long pause, AmigaOS has been verified to be happy with Perl.
+
+=item *
+
+EBCDIC platforms (z/OS, also known as OS/390, POSIX-BC, and VM/ESA)
+have been regained.  Many test suite tests still fail and the
+co-existence of Unicode and EBCDIC isn't quite settled, but the
+situation is much better than with Perl 5.6.  See L<perlos390>,
+L<perlbs2000> (for POSIX-BC), and L<perlvmesa> for more information.
+
+=item *
+
+Building perl with -Duseithreads or -Duse5005threads now works under
+HP-UX 10.20 (previously it only worked under 10.30 or later). You will
+need a thread library package installed. See README.hpux.
+
+=item *
+
+Mac OS Classic (MacPerl has of course been available since
+perl 5.004 but now the source code bases of standard Perl
+and MacPerl have been synchronised)
+
+=item *
+
+NCR MP-RAS is now supported.
+
+=item *
+
+NonStop-UX is now supported.
+
+=item *
+
+Amdahl UTS is now supported.
+
+=item *
+
+z/OS (formerly known as OS/390, formerly known as MVS OE) has now
+support for dynamic loading.  This is not selected by default,
+however, you must specify -Dusedl in the arguments of Configure.
+
+=back
+
+=head2 Generic Improvements
+
+=over 4
+
+=item *
+
+Configure no longer includes the DBM libraries (dbm, gdbm, db, ndbm)
+when building the Perl binary.  The only exception to this is SunOS 4.x,
+which needs them.
+
+=item *
+
+Some new Configure symbols, useful for extension writers:
+
+=over 8
+
+=item d_cmsghdr
+
+For struct cmsghdr.
+
+=item d_fcntl_can_lock
+
+Whether fcntl() can be used for file locking.
+
+=item d_fsync
+
+=item d_getitimer
+
+=item d_getpagsz
+
+For getpagesize(), though you should prefer POSIX::sysconf(_SC_PAGE_SIZE))
+
+=item d_msghdr_s
+
+For struct msghdr.
+
+=item need_va_copy
+
+Whether one needs to use Perl_va_copy() to copy varargs.
+
+=item d_readv
+
+=item d_recvmsg
+
+=item d_sendmsg
+
+=item sig_size
+
+The number of elements in an array needed to hold all the available signals.
+
+=item d_sockatmark
+
+=item d_strtoq
+
+=item d_u32align
+
+Whether one needs to access character data aligned by U32 sized pointers.
+
+=item d_ualarm
+
+=item d_usleep
+
+=back
+
+=item *
+
+Removed Configure symbols: the PDP-11 memory model settings: huge,
+large, medium, models.
+
+=item *
+
+SOCKS support is now much more robust.
+
+=item *
+
+If your file system supports symbolic links you can build Perl outside
+of the source directory by
+
+	mkdir perl/build/directory
+	cd perl/build/directory
+	sh /path/to/perl/source/Configure -Dmksymlinks ...
+
+This will create in perl/build/directory a tree of symbolic links
+pointing to files in /path/to/perl/source.  The original files are left
+unaffected.  After Configure has finished you can just say
+
+	make all test
+
+and Perl will be built and tested, all in perl/build/directory.
+
+=back
+
+=head1 Selected Bug Fixes
+
+Numerous memory leaks and uninitialized memory accesses have been hunted down.
+Most importantly anonymous subs used to leak quite a bit.
+
+=over 4
+
+=item *
+
+chop(@list) in list context returned the characters chopped in
+reverse order.  This has been reversed to be in the right order.
+
+=item *
+
+The order of DESTROYs has been made more predictable.
+
+=item *
+
+mkdir() now ignores trailing slashes in the directory name,
+as mandated by POSIX.
+
+=item *
+
+Attributes (like :shared) didn't work with our().
+
+=item *
+
+The PERL5OPT environment variable (for passing command line arguments
+to Perl) didn't work for more than a single group of options.
+
+=item *
+
+The tainting behaviour of sprintf() has been rationalized.  It does
+not taint the result of floating point formats anymore, making the
+behaviour consistent with that of string interpolation.
+
+=item *
+
+All but the first argument of the IO syswrite() method are now optional.
+
+=item *
+
+Tie::ARRAY SPLICE method was broken.
+
+=item *
+
+vec() now tries to work with characters <= 255 when possible, but it leaves
+higher character values in place.  In that case, if vec() was used to modify
+the string, it is no longer considered to be utf8-encoded.
+
+=back
+
+=head2 Platform Specific Changes and Fixes
+
+=over 4
+
+=item *
+
+Linux previously had problems related to sockaddrlen when using
+accept(), revcfrom() (in Perl: recv()), getpeername(), and getsockname().
+
+=item *
+
+Previously DYNIX/ptx had problems in its Configure probe for non-blocking I/O.
+
+=item *
+
+Windows
+
+=over 8
+
+=item *
+
+Borland C++ v5.5 is now a supported compiler that can build Perl.
+However, the generated binaries continue to be incompatible with those
+generated by the other supported compilers (GCC and Visual C++).
+
+=item *
+
+Win32::GetCwd() correctly returns C:\ instead of C: when at the drive root.
+Other bugs in chdir() and Cwd::cwd() have also been fixed.
+
+=item *
+
+Duping socket handles with open(F, ">&MYSOCK") now works under Windows 9x.
+
+=item *
+
+HTML files will be installed in c:\perl\html instead of c:\perl\lib\pod\html
+
+=item *
+
+The makefiles now provide a single switch to bulk-enable all the features
+enabled in ActiveState ActivePerl (a popular binary distribution).
+
+=back
+
+=back
+
+=head1 New or Changed Diagnostics
+
+Two new debugging options have been added: if you have compiled your
+Perl with debugging, you can use the -DT and -DR options to trace
+tokenising and to add reference counts to displaying variables,
+respectively.
+
+=over 4
+
+=item *
+
+If an attempt to use a (non-blessed) reference as an array index
+is made, a warning is given.
+
+=item *
+
+C<push @a;> and C<unshift @a;> (with no values to push or unshift)
+now give a warning.  This may be a problem for generated and evaled
+code.
+
+=back
+
+=head1 Changed Internals
+
+=over 4
+
+=item *
+
+Some new APIs: ptr_table_clear(), ptr_table_free(), sv_setref_uv().
+For the full list of the available APIs see L<perlapi>.
+
+=item *
+
+dTHR and djSP have been obsoleted; the former removed (because it's
+a no-op) and the latter replaced with dSP.
+
+=item *
+
+Perl now uses system malloc instead of Perl malloc on all 64-bit
+platforms, and even in some not-always-64-bit platforms like AIX,
+IRIX, and Solaris.  This change breaks backward compatibility but
+Perl's malloc has problems with large address spaces and also the
+speed of vendors' malloc is generally better in large address space
+machines (Perl's malloc is mostly tuned for space).
+
+=back
+
+=head1 New Tests
+
+Many new tests have been added.  The most notable is probably the
+lib/1_compile: it is very notable because running it takes quite a
+long time -- it test compiles all the Perl modules in the distribution.
+Please be patient.
+
+=head1 Known Problems
+
+Note that unlike other sections in this document (which describe
+changes since 5.7.0) this section is cumulative containing known
+problems for all the 5.7 releases.
+
+=head2 AIX vac 5.0.0.0 May Produce Buggy Code For Perl
+
+The AIX C compiler vac version 5.0.0.0 may produce buggy code,
+resulting in few random tests failing, but when the failing tests
+are run by hand, they succeed.  We suggest upgrading to at least
+vac version 5.0.1.0, that has been known to compile Perl correctly.
+"lslpp -L|grep vac.C" will tell you the vac version.
+
+=head2 lib/ftmp-security tests warn 'system possibly insecure'
+
+Don't panic.  Read INSTALL 'make test' section instead.
+
+=head2 lib/io_multihomed Fails In LP64-Configured HP-UX
+
+The lib/io_multihomed test may hang in HP-UX if Perl has been
+configured to be 64-bit. Because other 64-bit platforms do not hang in
+this test, HP-UX is suspect. All other tests pass in 64-bit HP-UX. The
+test attempts to create and connect to "multihomed" sockets (sockets
+which have multiple IP addresses).
+
+=head2 Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
+
+If perl is configured with -Duse64bitall, the successful result of the
+subtest 10 of lib/posix may arrive before the successful result of the
+subtest 9, which confuses the test harness so much that it thinks the
+subtest 9 failed.
+
+=head2 lib/b test 19
+
+The test fails on various platforms (PA64 and IA64 are known), but the
+exact cause is still being investigated.
+
+=head2 Linux With Sfio Fails op/misc Test 48
+
+No known fix.
+
+=head2 sigaction test 13 in VMS
+
+The test is known to fail; whether it's because of VMS of because
+of faulty test is not known.
+
+=head2 sprintf tests 129 and 130
+
+The op/sprintf tests 129 and 130 are known to fail on some platforms.
+Examples include any platform using sfio, and Compaq/Tandem's NonStop-UX.
+The failing platforms do not comply with the ANSI C Standard, line
+19ff on page 134 of ANSI X3.159 1989 to be exact.  (They produce
+something else than "1" and "-1" when formatting 0.6 and -0.6 using
+the printf format "%.0f", most often they produce "0" and "-0".)
+
+=head2  Failure of Thread tests
+
+The subtests 19 and 20 of lib/thr5005.t test are known to fail due to
+fundamental problems in the 5.005 threading implementation. These are
+not new failures--Perl 5.005_0x has the same bugs, but didn't have
+these tests. (Note that support for 5.005-style threading remains
+experimental.)
+
+=head2 Localising a Tied Variable Leaks Memory
+
+    use Tie::Hash;
+    tie my %tie_hash => 'Tie::StdHash';
+
+    ...
+
+    local($tie_hash{Foo}) = 1; # leaks
+
+Code like the above is known to leak memory every time the local()
+is executed.
+
+=head2 Self-tying of Arrays and Hashes Is Forbidden
+
+Self-tying of arrays and hashes is broken in rather deep and
+hard-to-fix ways.  As a stop-gap measure to avoid people from getting
+frustrated at the mysterious results (core dumps, most often) it is
+for now forbidden (you will get a fatal error even from an attempt).
+
+=head2 Building Extensions Can Fail Because Of Largefiles
+
+Some extensions like mod_perl are known to have issues with
+`largefiles', a change brought by Perl 5.6.0 in which file offsets
+default to 64 bits wide, where supported.  Modules may fail to compile
+at all or compile and work incorrectly.  Currently there is no good
+solution for the problem, but Configure now provides appropriate
+non-largefile ccflags, ldflags, libswanted, and libs in the %Config
+hash (e.g., $Config{ccflags_nolargefiles}) so the extensions that are
+having problems can try configuring themselves without the
+largefileness.  This is admittedly not a clean solution, and the
+solution may not even work at all.  One potential failure is whether
+one can (or, if one can, whether it's a good idea) link together at
+all binaries with different ideas about file offsets, all this is
+platform-dependent.
+
+=head2 The Compiler Suite Is Still Experimental
+
+The compiler suite is slowly getting better but is nowhere near
+working order yet.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/  There may also be
+information at http://www.perl.com/perl/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Jarkko Hietaniemi <F<jhi@iki.fi>>, with many contributions
+from The Perl Porters and Perl Users submitting feedback and patches.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl572delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl572delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl572delta.pod	(revision 14489)
@@ -0,0 +1,831 @@
+=head1 NAME
+
+perl572delta - what's new for perl v5.7.2
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.7.1 release and the
+5.7.2 release.  
+
+(To view the differences between the 5.6.0 release and the 5.7.0
+release, see L<perl570delta>.  To view the differences between the
+5.7.0 release and the 5.7.1 release, see L<perl571delta>.)
+
+=head1 Security Vulnerability Closed
+
+(This change was already made in 5.7.0 but bears repeating here.)
+
+A security vulnerability affecting all Perl versions prior to 5.6.1
+was found in August 2000.  The vulnerability does not affect default
+installations and as far as is known affects only the Linux platform.
+
+You should upgrade your Perl to 5.6.1 as soon as possible.  Patches
+for earlier releases exist but using the patches require full
+recompilation from the source code anyway, so 5.6.1 is your best
+choice.
+
+See http://www.cpan.org/src/5.0/sperl-2000-08-05/sperl-2000-08-05.txt
+for more information.
+
+=head1 Incompatible Changes
+
+=head2 64-bit platforms and malloc
+
+If your pointers are 64 bits wide, the Perl malloc is no more being
+used because it simply does not work with 8-byte pointers.  Also,
+usually the system malloc on such platforms are much better optimized
+for such large memory models than the Perl malloc.
+
+=head2 AIX Dynaloading
+
+The AIX dynaloading now uses in AIX releases 4.3 and newer the native
+dlopen interface of AIX instead of the old emulated interface.  This
+change will probably break backward compatibility with compiled
+modules.  The change was made to make Perl more compliant with other
+applications like modperl which are using the AIX native interface.
+
+=head2 Socket Extension Dynamic in VMS
+
+The Socket extension is now dynamically loaded instead of being
+statically built in.  This may or may not be a problem with ancient
+TCP/IP stacks of VMS: we do not know since we weren't able to test
+Perl in such configurations.
+
+=head2 Different Definition of the Unicode Character Classes \p{In...}
+
+As suggested by the Unicode consortium, the Unicode character classes
+now prefer I<scripts> as opposed to I<blocks> (as defined by Unicode);
+in Perl, when the C<\p{In....}> and the C<\p{In....}> regular expression
+constructs are used.  This has changed the definition of some of those
+character classes.
+
+The difference between scripts and blocks is that scripts are the
+glyphs used by a language or a group of languages, while the blocks
+are more artificial groupings of 256 characters based on the Unicode
+numbering.
+
+In general this change results in more inclusive Unicode character
+classes, but changes to the other direction also do take place:
+for example while the script C<Latin> includes all the Latin
+characters and their various diacritic-adorned versions, it
+does not include the various punctuation or digits (since they
+are not solely C<Latin>).
+
+Changes in the character class semantics may have happened if a script
+and a block happen to have the same name, for example C<Hebrew>.
+In such cases the script wins and C<\p{InHebrew}> now means the script
+definition of Hebrew.  The block definition in still available,
+though, by appending C<Block> to the name: C<\p{InHebrewBlock}> means
+what C<\p{InHebrew}> meant in perl 5.6.0.  For the full list
+of affected character classes, see L<perlunicode/Blocks>.
+
+=head2 Deprecations
+
+The current user-visible implementation of pseudo-hashes (the weird
+use of the first array element) is deprecated starting from Perl 5.8.0
+and will be removed in Perl 5.10.0, and the feature will be
+implemented differently.  Not only is the current interface rather
+ugly, but the current implementation slows down normal array and hash
+use quite noticeably. The C<fields> pragma interface will remain
+available.
+
+The syntaxes C<< @a->[...] >> and  C<< @h->{...} >> have now been deprecated.
+
+The suidperl is also considered to be too much a risk to continue
+maintaining and the suidperl code is likely to be removed in a future
+release.
+
+The C<package;> syntax (C<package> without an argument has been
+deprecated.  Its semantics were never that clear and its
+implementation even less so.  If you have used that feature to
+disallow all but fully qualified variables, C<use strict;> instead.
+
+The chdir(undef) and chdir('') behaviors to match chdir() has been
+deprecated.  In future versions, chdir(undef) and chdir('') will
+simply fail.
+
+=head1 Core Enhancements
+
+In general a lot of fixing has happened in the area of Perl's
+understanding of numbers, both integer and floating point.  Since in
+many systems the standard number parsing functions like C<strtoul()>
+and C<atof()> seem to have bugs, Perl tries to work around their
+deficiencies.  This results hopefully in more accurate numbers.
+
+=over 4
+
+=item *
+
+The rules for allowing underscores (underbars) in numeric constants
+have been relaxed and simplified: now you can have an underscore
+B<between digits>.
+
+=item *
+
+GMAGIC (right-hand side magic) could in many cases such as string
+concatenation be invoked too many times.
+
+=item *
+
+Lexicals I: lexicals outside an eval "" weren't resolved
+correctly inside a subroutine definition inside the eval "" if they
+were not already referenced in the top level of the eval""ed code.
+
+=item *
+
+Lexicals II: lexicals leaked at file scope into subroutines that
+were declared before the lexicals.
+
+=item *
+
+Lvalue subroutines can now return C<undef> in list context.
+
+=item *
+
+The C<op_clear> and C<op_null> are now exported.
+
+=item *
+
+A new special regular expression variable has been introduced:
+C<$^N>, which contains the most-recently closed group (submatch).
+
+=item *
+
+L<utime> now supports C<utime undef, undef, @files> to change the
+file timestamps to the current time.
+
+=item *
+
+The Perl parser has been stress tested using both random input and
+Markov chain input.
+
+=item *
+
+C<eval "v200"> now works.
+
+=item *
+
+VMS now works under PerlIO.
+
+=item *
+
+END blocks are now run even if you exit/die in a BEGIN block.
+The execution of END blocks is now controlled by 
+PL_exit_flags & PERL_EXIT_DESTRUCT_END. This enables the new
+behaviour for perl embedders. This will default in 5.10. See
+L<perlembed>.
+
+=back
+
+=head1 Modules and Pragmata
+
+=head2 New Modules and Distributions
+
+=over 4
+
+=item *
+
+L<Attribute::Handlers> - Simpler definition of attribute handlers
+
+=item *
+
+L<ExtUtils::Constant> - generate XS code to import C header constants
+
+=item *
+
+L<I18N::Langinfo> - query locale information
+
+=item *
+
+L<I18N::LangTags> - functions for dealing with RFC3066-style language tags
+
+=item *
+
+L<libnet> - a collection of perl5 modules related to network programming
+
+Perl installation leaves libnet unconfigured, use F<libnetcfg> to configure.
+
+=item *
+
+L<List::Util> - selection of general-utility list subroutines
+
+=item *
+
+L<Locale::Maketext> - framework for localization
+
+=item *
+
+L<Memoize> - Make your functions faster by trading space for time
+
+=item *
+
+L<NEXT> - pseudo-class for method redispatch
+
+=item *
+
+L<Scalar::Util> - selection of general-utility scalar subroutines
+
+=item *
+
+L<Test::More> - yet another framework for writing test scripts
+
+=item *
+
+L<Test::Simple> - Basic utilities for writing tests
+
+=item *
+
+L<Time::HiRes> - high resolution ualarm, usleep, and gettimeofday
+
+=item *
+
+L<Time::Piece> - Object Oriented time objects
+
+(Previously known as L<Time::Object>.)
+
+=item *
+
+L<Time::Seconds> - a simple API to convert seconds to other date values
+
+=item *
+
+L<UnicodeCD> - Unicode Character Database
+
+=back
+
+=head2 Updated And Improved Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<B::Deparse> module has been significantly enhanced.  It now
+can deparse almost all of the standard test suite (so that the
+tests still succeed).  There is a make target "test.deparse"
+for trying this out.
+
+=item *
+
+L<Class::Struct> now assigns the array/hash element if the accessor
+is called with an array/hash element as the B<sole> argument.
+
+=item *
+
+L<Cwd> extension is now (even) faster.
+
+=item *
+
+L<DB_File> extension has been updated to version 1.77.
+
+=item *
+
+L<Fcntl>, L<Socket>, and L<Sys::Syslog> have been rewritten to use the
+new-style constant dispatch section (see L<ExtUtils::Constant>).
+
+=item *
+
+L<File::Find> is now (again) reentrant.  It also has been made
+more portable.
+
+=item *
+
+L<File::Glob> now supports C<GLOB_LIMIT> constant to limit the
+size of the returned list of filenames.
+
+=item *
+
+L<IO::Socket::INET> now supports C<LocalPort> of zero (usually meaning
+that the operating system will make one up.)
+
+=item *
+
+The L<vars> pragma now supports declaring fully qualified variables.
+(Something that C<our()> does not and will not support.)
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item *
+
+The F<emacs/e2ctags.pl> is now much faster.
+
+=item *
+
+L<h2ph> now supports C trigraphs.
+
+=item *
+
+L<h2xs> uses the new L<ExtUtils::Constant> module which will affect
+newly created extensions that define constants.  Since the new code is
+more correct (if you have two constants where the first one is a
+prefix of the second one, the first constant B<never> gets defined),
+less lossy (it uses integers for integer constant, as opposed to the
+old code that used floating point numbers even for integer constants),
+and slightly faster, you might want to consider regenerating your
+extension code (the new scheme makes regenerating easy).
+L<h2xs> now also supports C trigraphs.
+
+=item *
+
+L<libnetcfg> has been added to configure the libnet.
+
+=item *
+
+The F<Pod::Html> (and thusly L<pod2html>) now allows specifying
+a cache directory.
+
+=back
+
+=head1 New Documentation
+
+=over 4
+
+=item *
+
+L<Locale::Maketext::TPJ13> is an article about software localization,
+originally published in The Perl Journal #13, republished here with
+kind permission.
+
+=item *
+
+More README.$PLATFORM files have been converted into pod, which also
+means that they also be installed as perl$PLATFORM documentation
+files.  The new files are L<perlapollo>, L<perlbeos>, L<perldgux>,
+L<perlhurd>, L<perlmint>, L<perlnetware>, L<perlplan9>, L<perlqnx>,
+and L<perltru64>.
+
+=item *
+
+The F<Todo> and F<Todo-5.6> files have been merged into L<perltodo>.
+
+=item *
+
+Use of the F<gprof> tool to profile Perl has been documented in
+L<perlhack>.  There is a make target "perl.gprof" for generating a
+gprofiled Perl executable.
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+=head2 New Or Improved Platforms
+
+=over 4
+
+=item *
+
+AIX should now work better with gcc, threads, and 64-bitness.  Also the
+long doubles support in AIX should be better now.  See L<perlaix>.
+
+=item *
+
+AtheOS ( http://www.atheos.cx/ ) is a new platform.
+
+=item *
+
+DG/UX platform now supports the 5.005-style threads.  See L<perldgux>.
+
+=item *
+
+DYNIX/ptx platform (a.k.a. dynixptx) is supported at or near osvers 4.5.2.
+
+=item *
+
+Several Mac OS (Classic) portability patches have been applied.  We
+hope to get a fully working port by 5.8.0.  (The remaining problems
+relate to the changed IO model of Perl.)  See L<perlmacos>.
+
+=item *
+
+Mac OS X (or Darwin) should now be able to build Perl even on HFS+
+filesystems.  (The case-insensitivity confused the Perl build process.)
+
+=item *
+
+NetWare from Novell is now supported.  See L<perlnetware>.
+
+=item *
+
+The Amdahl UTS UNIX mainframe platform is now supported.
+
+=back
+
+=head2 Generic Improvements
+
+=over 4
+
+=item *
+
+In AFS installations one can configure the root of the AFS to be
+somewhere else than the default F</afs> by using the Configure
+parameter C<-Dafsroot=/some/where/else>.
+
+=item *
+
+The version of Berkeley DB used when the Perl (and, presumably, the
+DB_File extension) was built is now available as
+C<@Config{qw(db_version_major db_version_minor db_version_patch)}>
+from Perl and as C<DB_VERSION_MAJOR_CFG DB_VERSION_MINOR_CFG
+DB_VERSION_PATCH_CFG> from C.
+
+=item *
+
+The Thread extension is now not built at all under ithreads
+(C<Configure -Duseithreads>) because it wouldn't work anyway (the
+Thread extension requires being Configured with C<-Duse5005threads>).
+
+=item *
+
+The C<B::Deparse> compiler backend has been so significantly improved
+that almost the whole Perl test suite passes after being deparsed.  A
+make target has been added to help in further testing: C<make test.deparse>.
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 5
+
+=item *
+
+The autouse pragma didn't work for Multi::Part::Function::Names.
+
+=item *
+
+The behaviour of non-decimal but numeric string constants such as
+"0x23" was platform-dependent: in some platforms that was seen as 35,
+in some as 0, in some as a floating point number (don't ask).  This
+was caused by Perl using the operating system libraries in a situation
+where the result of the string to number conversion is undefined: now
+Perl consistently handles such strings as zero in numeric contexts.
+
+=item *
+
+L<dprofpp> -R didn't work.
+
+=item *
+
+PERL5OPT with embedded spaces didn't work.
+
+=item *
+
+L<Sys::Syslog> ignored the C<LOG_AUTH> constant.
+
+=back
+
+=head2 Platform Specific Changes and Fixes
+
+=over 4
+
+=item *
+
+Some versions of glibc have a broken modfl().  This affects builds
+with C<-Duselongdouble>.  This version of Perl detects this brokenness
+and has a workaround for it.  The glibc release 2.2.2 is known to have
+fixed the modfl() bug.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item *
+
+In the regular expression diagnostics the C<E<lt>E<lt> HERE> marker
+introduced in 5.7.0 has been changed to be C<E<lt>-- HERE> since too
+many people found the C<E<lt>E<lt>> to be too similar to here-document
+starters.
+
+=item *
+
+If you try to L<perlfunc/pack> a number less than 0 or larger than 255
+using the C<"C"> format you will get an optional warning.  Similarly
+for the C<"c"> format and a number less than -128 or more than 127.
+
+=item *
+
+Certain regex modifiers such as C<(?o)> make sense only if applied to
+the entire regex.  You will an optional warning if you try to do otherwise.
+
+=item *
+
+Using arrays or hashes as references (e.g. C<< %foo->{bar} >> has been
+deprecated for a while.  Now you will get an optional warning.
+
+=back
+
+=head1 Source Code Enhancements
+
+=head2 MAGIC constants
+
+The MAGIC constants (e.g. C<'P'>) have been macrofied
+(e.g. C<PERL_MAGIC_TIED>) for better source code readability
+and maintainability.
+
+=head2 Better commented code
+
+F<perly.c>, F<sv.c>, and F<sv.h> have now been extensively commented.
+
+=head2 Regex pre-/post-compilation items matched up
+
+The regex compiler now maintains a structure that identifies nodes in
+the compiled bytecode with the corresponding syntactic features of the
+original regex expression.  The information is attached to the new
+C<offsets> member of the C<struct regexp>. See L<perldebguts> for more
+complete information.
+
+=head2 gcc -Wall
+
+The C code has been made much more C<gcc -Wall> clean.  Some warning
+messages still remain, though, so if you are compiling with gcc you
+will see some warnings about dubious practices.  The warnings are
+being worked on.
+
+=head1 New Tests
+
+Several new tests have been added, especially for the F<lib> subsection.
+
+The tests are now reported in a different order than in earlier Perls.
+(This happens because the test scripts from under t/lib have been moved
+to be closer to the library/extension they are testing.)
+
+=head1 Known Problems
+
+Note that unlike other sections in this document (which describe
+changes since 5.7.0) this section is cumulative containing known
+problems for all the 5.7 releases.
+
+=head2 AIX
+
+=over 4
+
+=item *
+
+In AIX 4.2 Perl extensions that use C++ functions that use statics
+may have problems in that the statics are not getting initialized.
+In newer AIX releases this has been solved by linking Perl with
+the libC_r library, but unfortunately in AIX 4.2 the said library
+has an obscure bug where the various functions related to time
+(such as time() and gettimeofday()) return broken values, and
+therefore in AIX 4.2 Perl is not linked against the libC_r.
+
+=item *
+
+vac 5.0.0.0 May Produce Buggy Code For Perl
+
+The AIX C compiler vac version 5.0.0.0 may produce buggy code,
+resulting in few random tests failing, but when the failing tests
+are run by hand, they succeed.  We suggest upgrading to at least
+vac version 5.0.1.0, that has been known to compile Perl correctly.
+"lslpp -L|grep vac.C" will tell you the vac version.
+
+=back
+
+=head2 Amiga Perl Invoking Mystery
+
+One cannot call Perl using the C<volume:> syntax, that is, C<perl -v>
+works, but for example C<bin:perl -v> doesn't.  The exact reason is
+known but the current suspect is the F<ixemul> library.
+
+=head2 lib/ftmp-security tests warn 'system possibly insecure'
+
+Don't panic.  Read INSTALL 'make test' section instead.
+
+=head2 Cygwin intermittent failures of lib/Memoize/t/expire_file 11 and 12
+
+The subtests 11 and 12 sometimes fail and sometimes work.
+
+=head2 HP-UX lib/io_multihomed Fails When LP64-Configured
+
+The lib/io_multihomed test may hang in HP-UX if Perl has been
+configured to be 64-bit. Because other 64-bit platforms do not hang in
+this test, HP-UX is suspect. All other tests pass in 64-bit HP-UX. The
+test attempts to create and connect to "multihomed" sockets (sockets
+which have multiple IP addresses).
+
+=head2  HP-UX lib/posix Subtest 9 Fails When LP64-Configured
+
+If perl is configured with -Duse64bitall, the successful result of the
+subtest 10 of lib/posix may arrive before the successful result of the
+subtest 9, which confuses the test harness so much that it thinks the
+subtest 9 failed.
+
+=head2 Linux With Sfio Fails op/misc Test 48
+
+No known fix.
+
+=head2 OS/390
+
+OS/390 has rather many test failures but the situation is actually
+better than it was in 5.6.0, it's just that so many new modules and
+tests have been added.
+
+ Failed Test                     Stat Wstat Total Fail  Failed  List of Failed
+ -----------------------------------------------------------------------------
+ ../ext/B/Deparse.t                            14    1   7.14%  14
+ ../ext/B/Showlex.t                             1    1 100.00%  1
+ ../ext/Encode/Encode/Tcl.t                   610   13   2.13%  592 594 596 598
+                                                                600 602 604-610
+ ../ext/IO/lib/IO/t/io_unix.t     113 28928     5    3  60.00%  3-5
+ ../ext/POSIX/POSIX.t                          29    1   3.45%  14
+ ../ext/Storable/t/lock.t         255 65280     5    3  60.00%  3-5
+ ../lib/locale.t                  129 33024   117   19  16.24%  99-117
+ ../lib/warnings.t                            434    1   0.23%  75
+ ../lib/ExtUtils.t                             27    1   3.70%  25
+ ../lib/Math/BigInt/t/bigintpm.t             1190    1   0.08%  1145
+ ../lib/Unicode/UCD.t                          81   48  59.26%  1-16 49-64 66-81
+ ../lib/User/pwent.t                            9    1  11.11%  4
+ op/pat.t                                     660    6   0.91%  242-243 424-425
+                                                                626-627
+ op/split.t                         0     9    ??   ??       %  ??
+ op/taint.t                                   174    3   1.72%  156 162 168
+ op/tr.t                                       70    3   4.29%  50 58-59
+ Failed 16/422 test scripts, 96.21% okay. 105/23251 subtests failed, 99.55% okay.
+
+=head2 op/sprintf tests 129 and 130
+
+The op/sprintf tests 129 and 130 are known to fail on some platforms.
+Examples include any platform using sfio, and Compaq/Tandem's NonStop-UX.
+The failing platforms do not comply with the ANSI C Standard, line
+19ff on page 134 of ANSI X3.159 1989 to be exact.  (They produce
+something other than "1" and "-1" when formatting 0.6 and -0.6 using
+the printf format "%.0f", most often they produce "0" and "-0".)
+
+=head2  Failure of Thread tests
+
+B<Note that support for 5.005-style threading remains experimental.>
+
+The following tests are known to fail due to fundamental problems in
+the 5.005 threading implementation. These are not new failures--Perl
+5.005_0x has the same bugs, but didn't have these tests.
+
+  lib/autouse.t                 4
+  t/lib/thr5005.t               19-20
+
+=head2 UNICOS
+
+=over 4
+
+=item *
+
+ext/POSIX/sigaction subtests 6 and 13 may fail.
+
+=item *
+
+lib/ExtUtils may spuriously claim that subtest 28 failed,
+which is interesting since the test only has 27 tests.
+
+=item *
+
+Numerous numerical test failures
+
+  op/numconvert                 209,210,217,218
+  op/override                   7
+  ext/Time/HiRes/HiRes          9
+  lib/Math/BigInt/t/bigintpm    1145
+  lib/Math/Trig                 25
+
+These tests fail because of yet unresolved floating point inaccuracies.
+
+=back
+
+=head2 UTS
+
+There are a few known test failures, see L<perluts>.
+
+=head2 VMS
+
+Rather many tests are failing in VMS but that actually more tests
+succeed in VMS than they used to, it's just that there are many,
+many more tests than there used to be.
+
+Here are the known failures from some compiler/platform combinations.
+
+DEC C V5.3-006 on OpenVMS VAX V6.2
+
+  [-.ext.list.util.t]tainted..............FAILED on test 3
+  [-.ext.posix]sigaction..................FAILED on test 7
+  [-.ext.time.hires]hires.................FAILED on test 14
+  [-.lib.file.find]taint..................FAILED on test 17
+  [-.lib.math.bigint.t]bigintpm...........FAILED on test 1183
+  [-.lib.test.simple.t]exit...............FAILED on test 1
+  [.lib]vmsish............................FAILED on test 13
+  [.op]sprintf............................FAILED on test 12
+  Failed 8/399 tests, 91.23% okay.
+
+DEC C V6.0-001 on OpenVMS Alpha V7.2-1 and
+Compaq C V6.2-008 on OpenVMS Alpha V7.1
+
+  [-.ext.list.util.t]tainted..............FAILED on test 3 
+  [-.lib.file.find]taint..................FAILED on test 17
+  [-.lib.test.simple.t]exit...............FAILED on test 1
+  [.lib]vmsish............................FAILED on test 13
+  Failed 4/399 tests, 92.48% okay.
+
+Compaq C V6.4-005 on OpenVMS Alpha 7.2.1
+
+  [-.ext.b]showlex........................FAILED on test 1
+  [-.ext.list.util.t]tainted..............FAILED on test 3
+  [-.lib.file.find]taint..................FAILED on test 17 
+  [-.lib.test.simple.t]exit...............FAILED on test 1
+  [.lib]vmsish............................FAILED on test 13
+  [.op]misc...............................FAILED on test 49
+  Failed 6/401 tests, 92.77% okay.
+
+=head2 Win32
+
+In multi-CPU boxes there are some problems with the I/O buffering:
+some output may appear twice.
+
+=head2 Localising a Tied Variable Leaks Memory
+
+    use Tie::Hash;
+    tie my %tie_hash => 'Tie::StdHash';
+
+    ...
+
+    local($tie_hash{Foo}) = 1; # leaks
+
+Code like the above is known to leak memory every time the local()
+is executed.
+
+=head2 Self-tying of Arrays and Hashes Is Forbidden
+
+Self-tying of arrays and hashes is broken in rather deep and
+hard-to-fix ways.  As a stop-gap measure to avoid people from getting
+frustrated at the mysterious results (core dumps, most often) it is
+for now forbidden (you will get a fatal error even from an attempt).
+
+=head2 Variable Attributes are not Currently Usable for Tieing
+
+This limitation will hopefully be fixed in future.  (Subroutine
+attributes work fine for tieing, see L<Attribute::Handlers>).
+
+=head2 Building Extensions Can Fail Because Of Largefiles
+
+Some extensions like mod_perl are known to have issues with
+`largefiles', a change brought by Perl 5.6.0 in which file offsets
+default to 64 bits wide, where supported.  Modules may fail to compile
+at all or compile and work incorrectly.  Currently there is no good
+solution for the problem, but Configure now provides appropriate
+non-largefile ccflags, ldflags, libswanted, and libs in the %Config
+hash (e.g., $Config{ccflags_nolargefiles}) so the extensions that are
+having problems can try configuring themselves without the
+largefileness.  This is admittedly not a clean solution, and the
+solution may not even work at all.  One potential failure is whether
+one can (or, if one can, whether it's a good idea) link together at
+all binaries with different ideas about file offsets, all this is
+platform-dependent.
+
+=head2 The Compiler Suite Is Still Experimental
+
+The compiler suite is slowly getting better but is nowhere near
+working order yet.
+
+=head2 The Long Double Support is Still Experimental
+
+The ability to configure Perl's numbers to use "long doubles",
+floating point numbers of hopefully better accuracy, is still
+experimental.  The implementations of long doubles are not yet
+widespread and the existing implementations are not quite mature
+or standardised, therefore trying to support them is a rare
+and moving target.  The gain of more precision may also be offset
+by slowdown in computations (more bits to move around, and the
+operations are more likely to be executed by less optimised
+libraries).
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/  There may also be
+information at http://www.perl.com/perl/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Jarkko Hietaniemi <F<jhi@iki.fi>>, with many contributions
+from The Perl Porters and Perl Users submitting feedback and patches.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl573delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl573delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl573delta.pod	(revision 14489)
@@ -0,0 +1,246 @@
+=head1 NAME
+
+perl573delta - what's new for perl v5.7.3
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.7.2 release and the
+5.7.3 release.  
+
+(To view the differences between the 5.6.0 release and the 5.7.0
+release, see L<perl570delta>.  To view the differences between the
+5.7.0 release and the 5.7.1 release, see L<perl571delta>.  To view
+the differences between the 5.7.1 release and the 5.7.2 release,
+see L<perl572delta>.)
+
+=head1 Changes
+
+This is just a selected list of some of the more notable changes.
+The numbers refer to the Perl repository change numbers; see
+L<Changes58> (or L<Changes> in Perl 5.8.1).  In addition to these
+changes, lots of work took place in integrating threads, PerlIO, and
+Unicode; general code cleanup; and last but not least porting to
+non-UNIX lands such as Win32, VMS, Cygwin, DJGPP, VOS, MacOS Classic,
+and EBCDIC.
+
+=over 4
+
+=item 11362
+
+add LC_MESSAGES to POSIX :locale_h export tag
+
+=item 11371
+
+add DEL to [:cntrl:]
+
+=item 11375
+
+make h2ph understand constants like 1234L and 5678LL
+
+=item 11405
+
+Win32: fix bugs in handling of the virtualized environment
+
+=item 11410
+
+fix a bug in the security taint checking of open()
+
+=item 11423
+
+make perl fork() safe even on platforms that don't have pthread_atfork()
+
+=item 11459
+
+make switching optimization and debugging levels during Perl builds
+easier via the OPTIMIZE environment variable
+
+=item 11475
+
+make split()'s unused captures to be undef, not ''
+
+=item 11485
+
+Search::Dict: allow transforming lines before comparing 
+
+=item 11490
+
+allow installing extra modules or bundles when building Perl
+
+=item 11516
+
+add -Wall in cflags when compiling with gcc to weed out dubious
+C practices
+
+=item 11541
+
+pluggable optimizer
+
+=item 11549
+
+WinCE: integrate the port
+
+=item 11589
+
+Win32: 4-arg select was broken
+
+=item 11594
+
+introduce the perlivp utility for verifying the Perl installation
+(IVP = Installation Verification Procedure)
+
+=item 11623
+
+rename lib/unicode to lib/unicore to avoid case-insensitivity problems
+with lib/Unicode
+
+=item 111631
+
+remove Time::Piece
+
+=item 11643
+
+document that use utf8 is not the right way most of the time
+
+=item 11656
+
+allow building perl with -DUSE_UTF8_SCRIPTS which makes UTF-8
+the default script encoding (not the default since that would
+break all scripts having legacy eight-bit data in them)
+
+=item 11725
+
+division preserving 64-bit integers
+
+=item 11743
+
+document the coderef-in-@INC feature
+
+=item 11794
+
+modulo (%) preserving 64-bit integers
+
+=item 11825
+
+update to Unicode 3.1.1
+
+=item 11865
+
+add the \[$@%&*] prototype support
+
+=item 11874
+
+oct() and hex() in glorious 64 bit
+
+=item 11877
+
+Class::Struct: allow recursive classes
+
+=item 11993
+
+fix unpack U to be the reverse of pack U
+
+=item 12056
+
+VMS: waitpid enhancements
+
+=item 12180
+
+unpack("Z*Z*", pack("Z*Z*", ..)) was broken
+
+=item 12243
+
+Devel::Peek: display UTF-8 SVs also as \x{...}
+
+=item 12288
+
+Data::Dumper: option to sort hashes
+
+=item 12542
+
+add perlpodspec
+
+=item 12652
+
+threadsafe DynaLoader, re, Opcode, File::Glob, and B
+
+=item 12756
+
+support BeOS better
+
+=item 12874
+
+read-only hashes (user-level interface is Hash::Util)
+
+=item 13162
+
+add Devel::PPPort
+
+=item 13179
+
+add the sort pragma
+
+=item 13326
+
+VMS: fix perl -P
+
+=item 13358
+
+add perlpacktut
+
+=item 13452
+
+SUPER-UX: add hints file
+
+=item 13575
+
+Win32: non-blocking waitpid(-1,WNOHANG)
+
+=item 13684
+
+introduce the -t option for gentler taint checking
+
+=item 14694
+
+add the if pragma
+
+=item 14832
+
+implement IV/UV/NV/long double un/packing with j/J/F/D
+
+=item 14854
+
+document the new taint behaviour of exec LIST and system LIST
+
+=back
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org.  There may also be
+information at http://www.perl.com/, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Jarkko Hietaniemi <F<jhi@iki.fi>>, with many contributions
+from The Perl Porters and Perl Users submitting feedback and patches.
+
+Send omissions or corrections to <F<perlbug@perl.org>>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl581delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl581delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl581delta.pod	(revision 14489)
@@ -0,0 +1,1102 @@
+=head1 NAME
+
+perl581delta - what is new for perl v5.8.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.0 release and
+the 5.8.1 release.
+
+If you are upgrading from an earlier release such as 5.6.1, first read
+the L<perl58delta>, which describes differences between 5.6.0 and
+5.8.0.
+
+In case you are wondering about 5.6.1, it was bug-fix-wise rather
+identical to the development release 5.7.1.  Confused?  This timeline
+hopefully helps a bit: it lists the new major releases, their maintenance
+releases, and the development releases.
+
+          New     Maintenance  Development
+
+          5.6.0                             2000-Mar-22
+                               5.7.0        2000-Sep-02
+                  5.6.1                     2001-Apr-08
+                               5.7.1        2001-Apr-09
+                               5.7.2        2001-Jul-13
+                               5.7.3        2002-Mar-05
+          5.8.0                             2002-Jul-18
+                  5.8.1                     2003-Sep-25
+
+=head1 Incompatible Changes
+
+=head2 Hash Randomisation
+
+Mainly due to security reasons, the "random ordering" of hashes
+has been made even more random.  Previously while the order of hash
+elements from keys(), values(), and each() was essentially random,
+it was still repeatable.  Now, however, the order varies between
+different runs of Perl.
+
+B<Perl has never guaranteed any ordering of the hash keys>, and the
+ordering has already changed several times during the lifetime of
+Perl 5.  Also, the ordering of hash keys has always been, and
+continues to be, affected by the insertion order.
+
+The added randomness may affect applications.
+
+One possible scenario is when output of an application has included
+hash data.  For example, if you have used the Data::Dumper module to
+dump data into different files, and then compared the files to see
+whether the data has changed, now you will have false positives since
+the order in which hashes are dumped will vary.  In general the cure
+is to sort the keys (or the values); in particular for Data::Dumper to
+use the C<Sortkeys> option.  If some particular order is really
+important, use tied hashes: for example the Tie::IxHash module
+which by default preserves the order in which the hash elements
+were added.
+
+More subtle problem is reliance on the order of "global destruction".
+That is what happens at the end of execution: Perl destroys all data
+structures, including user data.  If your destructors (the DESTROY
+subroutines) have assumed any particular ordering to the global
+destruction, there might be problems ahead.  For example, in a
+destructor of one object you cannot assume that objects of any other
+class are still available, unless you hold a reference to them.
+If the environment variable PERL_DESTRUCT_LEVEL is set to a non-zero
+value, or if Perl is exiting a spawned thread, it will also destruct
+the ordinary references and the symbol tables that are no longer in use.
+You can't call a class method or an ordinary function on a class that
+has been collected that way.
+
+The hash randomisation is certain to reveal hidden assumptions about
+some particular ordering of hash elements, and outright bugs: it
+revealed a few bugs in the Perl core and core modules.
+
+To disable the hash randomisation in runtime, set the environment
+variable PERL_HASH_SEED to 0 (zero) before running Perl (for more
+information see L<perlrun/PERL_HASH_SEED>), or to disable the feature
+completely in compile time, compile with C<-DNO_HASH_SEED> (see F<INSTALL>).
+
+See L<perlsec/"Algorithmic Complexity Attacks"> for the original
+rationale behind this change.
+
+=head2 UTF-8 On Filehandles No Longer Activated By Locale
+
+In Perl 5.8.0 all filehandles, including the standard filehandles,
+were implicitly set to be in Unicode UTF-8 if the locale settings
+indicated the use of UTF-8.  This feature caused too many problems,
+so the feature was turned off and redesigned: see L</"Core Enhancements">.
+
+=head2 Single-number v-strings are no longer v-strings before "=>"
+
+The version strings or v-strings (see L<perldata/"Version Strings">)
+feature introduced in Perl 5.6.0 has been a source of some confusion--
+especially when the user did not want to use it, but Perl thought it
+knew better.  Especially troublesome has been the feature that before
+a "=>" a version string (a "v" followed by digits) has been interpreted
+as a v-string instead of a string literal.  In other words:
+
+	%h = ( v65 => 42 );
+
+has meant since Perl 5.6.0
+
+	%h = ( 'A' => 42 );
+
+(at least in platforms of ASCII progeny)  Perl 5.8.1 restores the
+more natural interpretation
+
+	%h = ( 'v65' => 42 );
+
+The multi-number v-strings like v65.66 and 65.66.67 still continue to
+be v-strings in Perl 5.8.
+
+=head2 (Win32) The -C Switch Has Been Repurposed
+
+The -C switch has changed in an incompatible way.  The old semantics
+of this switch only made sense in Win32 and only in the "use utf8"
+universe in 5.6.x releases, and do not make sense for the Unicode
+implementation in 5.8.0.  Since this switch could not have been used
+by anyone, it has been repurposed.  The behavior that this switch
+enabled in 5.6.x releases may be supported in a transparent,
+data-dependent fashion in a future release.
+
+For the new life of this switch, see L<"UTF-8 no longer default under
+UTF-8 locales">, and L<perlrun/-C>.
+
+=head2 (Win32) The /d Switch Of cmd.exe
+
+Perl 5.8.1 uses the /d switch when running the cmd.exe shell
+internally for system(), backticks, and when opening pipes to external
+programs.  The extra switch disables the execution of AutoRun commands
+from the registry, which is generally considered undesirable when
+running external programs.  If you wish to retain compatibility with
+the older behavior, set PERL5SHELL in your environment to C<cmd /x/c>.
+
+=head1 Core Enhancements
+
+=head2 UTF-8 no longer default under UTF-8 locales
+
+In Perl 5.8.0 many Unicode features were introduced.   One of them
+was found to be of more nuisance than benefit: the automagic
+(and silent) "UTF-8-ification" of filehandles, including the
+standard filehandles, if the user's locale settings indicated
+use of UTF-8.
+
+For example, if you had C<en_US.UTF-8> as your locale, your STDIN and
+STDOUT were automatically "UTF-8", in other words an implicit
+binmode(..., ":utf8") was made.  This meant that trying to print, say,
+chr(0xff), ended up printing the bytes 0xc3 0xbf.  Hardly what
+you had in mind unless you were aware of this feature of Perl 5.8.0.
+The problem is that the vast majority of people weren't: for example
+in RedHat releases 8 and 9 the B<default> locale setting is UTF-8, so
+all RedHat users got UTF-8 filehandles, whether they wanted it or not.
+The pain was intensified by the Unicode implementation of Perl 5.8.0
+(still) having nasty bugs, especially related to the use of s/// and
+tr///.  (Bugs that have been fixed in 5.8.1)
+
+Therefore a decision was made to backtrack the feature and change it
+from implicit silent default to explicit conscious option.  The new
+Perl command line option C<-C> and its counterpart environment
+variable PERL_UNICODE can now be used to control how Perl and Unicode
+interact at interfaces like I/O and for example the command line
+arguments.  See L<perlrun/-C> and L<perlrun/PERL_UNICODE> for more
+information.
+
+=head2 Unsafe signals again available
+
+In Perl 5.8.0 the so-called "safe signals" were introduced.  This
+means that Perl no longer handles signals immediately but instead
+"between opcodes", when it is safe to do so.  The earlier immediate
+handling easily could corrupt the internal state of Perl, resulting
+in mysterious crashes.
+
+However, the new safer model has its problems too.  Because now an
+opcode, a basic unit of Perl execution, is never interrupted but
+instead let to run to completion, certain operations that can take a
+long time now really do take a long time.  For example, certain
+network operations have their own blocking and timeout mechanisms, and
+being able to interrupt them immediately would be nice.
+
+Therefore perl 5.8.1 introduces a "backdoor" to restore the pre-5.8.0
+(pre-5.7.3, really) signal behaviour.  Just set the environment variable
+PERL_SIGNALS to C<unsafe>, and the old immediate (and unsafe)
+signal handling behaviour returns.  See L<perlrun/PERL_SIGNALS>
+and L<perlipc/"Deferred Signals (Safe Signals)">.
+
+In completely unrelated news, you can now use safe signals with
+POSIX::SigAction.  See L<POSIX/POSIX::SigAction>.
+
+=head2 Tied Arrays with Negative Array Indices
+
+Formerly, the indices passed to C<FETCH>, C<STORE>, C<EXISTS>, and
+C<DELETE> methods in tied array class were always non-negative.  If
+the actual argument was negative, Perl would call FETCHSIZE implicitly
+and add the result to the index before passing the result to the tied
+array method.  This behaviour is now optional.  If the tied array class
+contains a package variable named C<$NEGATIVE_INDICES> which is set to
+a true value, negative values will be passed to C<FETCH>, C<STORE>,
+C<EXISTS>, and C<DELETE> unchanged.
+
+=head2 local ${$x}
+
+The syntaxes
+
+	local ${$x}
+	local @{$x}
+	local %{$x}
+
+now do localise variables, given that the $x is a valid variable name.
+
+=head2 Unicode Character Database 4.0.0
+
+The copy of the Unicode Character Database included in Perl 5.8 has
+been updated to 4.0.0 from 3.2.0.  This means for example that the
+Unicode character properties are as in Unicode 4.0.0.
+
+=head2 Deprecation Warnings
+
+There is one new feature deprecation.  Perl 5.8.0 forgot to add
+some deprecation warnings, these warnings have now been added.
+Finally, a reminder of an impending feature removal.
+
+=head3 (Reminder) Pseudo-hashes are deprecated (really)
+
+Pseudo-hashes were deprecated in Perl 5.8.0 and will be removed in
+Perl 5.10.0, see L<perl58delta> for details.  Each attempt to access
+pseudo-hashes will trigger the warning C<Pseudo-hashes are deprecated>.
+If you really want to continue using pseudo-hashes but not to see the
+deprecation warnings, use:
+
+    no warnings 'deprecated';
+
+Or you can continue to use the L<fields> pragma, but please don't
+expect the data structures to be pseudohashes any more.
+
+=head3 (Reminder) 5.005-style threads are deprecated (really)
+
+5.005-style threads (activated by C<use Thread;>) were deprecated in
+Perl 5.8.0 and will be removed after Perl 5.8, see L<perl58delta> for
+details.  Each 5.005-style thread creation will trigger the warning
+C<5.005 threads are deprecated>.  If you really want to continue
+using the 5.005 threads but not to see the deprecation warnings, use:
+
+    no warnings 'deprecated';
+
+=head3 (Reminder) The $* variable is deprecated (really)
+
+The C<$*> variable controlling multi-line matching has been deprecated
+and will be removed after 5.8.  The variable has been deprecated for a
+long time, and a deprecation warning C<Use of $* is deprecated> is given,
+now the variable will just finally be removed.  The functionality has
+been supplanted by the C</s> and C</m> modifiers on pattern matching.
+If you really want to continue using the C<$*>-variable but not to see
+the deprecation warnings, use:
+
+    no warnings 'deprecated';
+
+=head2 Miscellaneous Enhancements
+
+C<map> in void context is no longer expensive. C<map> is now context
+aware, and will not construct a list if called in void context.
+
+If a socket gets closed by the server while printing to it, the client
+now gets a SIGPIPE.  While this new feature was not planned, it fell
+naturally out of PerlIO changes, and is to be considered an accidental
+feature.
+
+PerlIO::get_layers(FH) returns the names of the PerlIO layers
+active on a filehandle.
+
+PerlIO::via layers can now have an optional UTF8 method to
+indicate whether the layer wants to "auto-:utf8" the stream.
+
+utf8::is_utf8() has been added as a quick way to test whether
+a scalar is encoded internally in UTF-8 (Unicode).
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules And Pragmata
+
+The following modules and pragmata have been updated since Perl 5.8.0:
+
+=over 4
+
+=item base
+
+=item B::Bytecode
+
+In much better shape than it used to be.  Still far from perfect, but
+maybe worth a try.
+
+=item B::Concise
+
+=item B::Deparse
+
+=item Benchmark
+
+An optional feature, C<:hireswallclock>, now allows for high
+resolution wall clock times (uses Time::HiRes).
+
+=item ByteLoader
+
+See B::Bytecode.
+
+=item bytes
+
+Now has bytes::substr.
+
+=item CGI
+
+=item charnames
+
+One can now have custom character name aliases.
+
+=item CPAN
+
+There is now a simple command line frontend to the CPAN.pm
+module called F<cpan>.
+
+=item Data::Dumper
+
+A new option, Pair, allows choosing the separator between hash keys
+and values.
+
+=item DB_File
+
+=item Devel::PPPort
+
+=item Digest::MD5
+
+=item Encode
+
+Significant updates on the encoding pragma functionality
+(tr/// and the DATA filehandle, formats).
+
+If a filehandle has been marked as to have an encoding, unmappable
+characters are detected already during input, not later (when the
+corrupted data is being used).
+
+The ISO 8859-6 conversion table has been corrected (the 0x30..0x39
+erroneously mapped to U+0660..U+0669, instead of U+0030..U+0039).  The
+GSM 03.38 conversion did not handle escape sequences correctly.  The
+UTF-7 encoding has been added (making Encode feature-complete with
+Unicode::String).
+
+=item fields
+
+=item libnet
+
+=item Math::BigInt
+
+A lot of bugs have been fixed since v1.60, the version included in Perl
+v5.8.0. Especially noteworthy are the bug in Calc that caused div and mod to
+fail for some large values, and the fixes to the handling of bad inputs.
+
+Some new features were added, e.g. the broot() method, you can now pass
+parameters to config() to change some settings at runtime, and it is now
+possible to trap the creation of NaN and infinity.
+
+As usual, some optimizations took place and made the math overall a tad
+faster. In some cases, quite a lot faster, actually. Especially alternative
+libraries like Math::BigInt::GMP benefit from this. In addition, a lot of the
+quite clunky routines like fsqrt() and flog() are now much much faster.
+
+=item MIME::Base64
+
+=item NEXT
+
+Diamond inheritance now works.
+
+=item Net::Ping
+
+=item PerlIO::scalar
+
+Reading from non-string scalars (like the special variables, see
+L<perlvar>) now works.
+
+=item podlators
+
+=item Pod::LaTeX
+
+=item PodParsers
+
+=item Pod::Perldoc
+
+Complete rewrite.  As a side-effect, no longer refuses to startup when
+run by root.
+
+=item Scalar::Util
+
+New utilities: refaddr, isvstring, looks_like_number, set_prototype.
+
+=item Storable
+
+Can now store code references (via B::Deparse, so not foolproof).
+
+=item strict
+
+Earlier versions of the strict pragma did not check the parameters
+implicitly passed to its "import" (use) and "unimport" (no) routine.
+This caused the false idiom such as:
+
+        use strict qw(@ISA);
+        @ISA = qw(Foo);
+
+This however (probably) raised the false expectation that the strict
+refs, vars and subs were being enforced (and that @ISA was somehow
+"declared").  But the strict refs, vars, and subs are B<not> enforced
+when using this false idiom.
+
+Starting from Perl 5.8.1, the above B<will> cause an error to be
+raised.  This may cause programs which used to execute seemingly
+correctly without warnings and errors to fail when run under 5.8.1.
+This happens because
+
+        use strict qw(@ISA);
+
+will now fail with the error:
+
+        Unknown 'strict' tag(s) '@ISA'
+
+The remedy to this problem is to replace this code with the correct idiom:
+
+        use strict;
+        use vars qw(@ISA);
+        @ISA = qw(Foo);
+
+=item Term::ANSIcolor
+
+=item Test::Harness
+
+Now much more picky about extra or missing output from test scripts.
+
+=item Test::More
+
+=item Test::Simple
+
+=item Text::Balanced
+
+=item Time::HiRes
+
+Use of nanosleep(), if available, allows mixing subsecond sleeps with
+alarms.
+
+=item threads
+
+Several fixes, for example for join() problems and memory
+leaks.  In some platforms (like Linux) that use glibc the minimum memory
+footprint of one ithread has been reduced by several hundred kilobytes.
+
+=item threads::shared
+
+Many memory leaks have been fixed.
+
+=item Unicode::Collate
+
+=item Unicode::Normalize
+
+=item Win32::GetFolderPath
+
+=item Win32::GetOSVersion
+
+Now returns extra information.
+
+=back
+
+=head1 Utility Changes
+
+The C<h2xs> utility now produces a more modern layout:
+F<Foo-Bar/lib/Foo/Bar.pm> instead of F<Foo/Bar/Bar.pm>.
+Also, the boilerplate test is now called F<t/Foo-Bar.t>
+instead of F<t/1.t>.
+
+The Perl debugger (F<lib/perl5db.pl>) has now been extensively
+documented and bugs found while documenting have been fixed.
+
+C<perldoc> has been rewritten from scratch to be more robust and
+featureful.
+
+C<perlcc -B> works now at least somewhat better, while C<perlcc -c>
+is rather more broken.  (The Perl compiler suite as a whole continues
+to be experimental.)
+
+=head1 New Documentation
+
+perl573delta has been added to list the differences between the
+(now quite obsolete) development releases 5.7.2 and 5.7.3.
+
+perl58delta has been added: it is the perldelta of 5.8.0, detailing
+the differences between 5.6.0 and 5.8.0.
+
+perlartistic has been added: it is the Artistic License in pod format,
+making it easier for modules to refer to it.
+
+perlcheat has been added: it is a Perl cheat sheet.
+
+perlgpl has been added: it is the GNU General Public License in pod
+format, making it easier for modules to refer to it.
+
+perlmacosx has been added to tell about the installation and use
+of Perl in Mac OS X.
+
+perlos400 has been added to tell about the installation and use
+of Perl in OS/400 PASE.
+
+perlreref has been added: it is a regular expressions quick reference.
+
+=head1 Installation and Configuration Improvements
+
+The UNIX standard Perl location, F</usr/bin/perl>, is no longer
+overwritten by default if it exists.  This change was very prudent
+because so many UNIX vendors already provide a F</usr/bin/perl>,
+but simultaneously many system utilities may depend on that
+exact version of Perl, so better not to overwrite it.
+
+One can now specify installation directories for site and vendor man
+and HTML pages, and site and vendor scripts.  See F<INSTALL>.
+
+One can now specify a destination directory for Perl installation
+by specifying the DESTDIR variable for C<make install>.  (This feature
+is slightly different from the previous C<Configure -Dinstallprefix=...>.)
+See F<INSTALL>.
+
+gcc versions 3.x introduced a new warning that caused a lot of noise
+during Perl compilation: C<gcc -Ialreadyknowndirectory (warning:
+changing search order)>.  This warning has now been avoided by
+Configure weeding out such directories before the compilation.
+
+One can now build subsets of Perl core modules by using the
+Configure flags C<-Dnoextensions=...> and C<-Donlyextensions=...>,
+see F<INSTALL>.
+
+=head2 Platform-specific enhancements
+
+In Cygwin Perl can now be built with threads (C<Configure -Duseithreads>).
+This works with both Cygwin 1.3.22 and Cygwin 1.5.3.
+
+In newer FreeBSD releases Perl 5.8.0 compilation failed because of
+trying to use F<malloc.h>, which in FreeBSD is just a dummy file, and
+a fatal error to even try to use.  Now F<malloc.h> is not used.
+
+Perl is now known to build also in Hitachi HI-UXMPP.
+
+Perl is now known to build again in LynxOS.
+
+Mac OS X now installs with Perl version number embedded in
+installation directory names for easier upgrading of user-compiled
+Perl, and the installation directories in general are more standard.
+In other words, the default installation no longer breaks the
+Apple-provided Perl.  On the other hand, with C<Configure -Dprefix=/usr>
+you can now really replace the Apple-supplied Perl (B<please be careful>).
+
+Mac OS X now builds Perl statically by default.  This change was done
+mainly for faster startup times.  The Apple-provided Perl is still
+dynamically linked and shared, and you can enable the sharedness for
+your own Perl builds by C<Configure -Duseshrplib>.
+
+Perl has been ported to IBM's OS/400 PASE environment.  The best way
+to build a Perl for PASE is to use an AIX host as a cross-compilation
+environment.  See README.os400.
+
+Yet another cross-compilation option has been added: now Perl builds
+on OpenZaurus, an Linux distribution based on Mandrake + Embedix for
+the Sharp Zaurus PDA.  See the Cross/README file.
+
+Tru64 when using gcc 3 drops the optimisation for F<toke.c> to C<-O2>
+because of gigantic memory use with the default C<-O3>.
+
+Tru64 can now build Perl with the newer Berkeley DBs.
+
+Building Perl on WinCE has been much enhanced, see F<README.ce>
+and F<README.perlce>.
+
+=head1 Selected Bug Fixes
+
+=head2 Closures, eval and lexicals
+
+There have been many fixes in the area of anonymous subs, lexicals and
+closures.  Although this means that Perl is now more "correct", it is
+possible that some existing code will break that happens to rely on
+the faulty behaviour.  In practice this is unlikely unless your code
+contains a very complex nesting of anonymous subs, evals and lexicals.
+
+=head2 Generic fixes
+
+If an input filehandle is marked C<:utf8> and Perl sees illegal UTF-8
+coming in when doing C<< <FH> >>, if warnings are enabled a warning is
+immediately given - instead of being silent about it and Perl being
+unhappy about the broken data later.  (The C<:encoding(utf8)> layer
+also works the same way.)
+
+binmode(SOCKET, ":utf8") only worked on the input side, not on the
+output side of the socket.  Now it works both ways.
+
+For threaded Perls certain system database functions like getpwent()
+and getgrent() now grow their result buffer dynamically, instead of
+failing.  This means that at sites with lots of users and groups the
+functions no longer fail by returning only partial results.
+
+Perl 5.8.0 had accidentally broken the capability for users
+to define their own uppercase<->lowercase Unicode mappings
+(as advertised by the Camel).  This feature has been fixed and
+is also documented better.
+
+In 5.8.0 this
+
+	$some_unicode .= <FH>;
+
+didn't work correctly but instead corrupted the data.  This has now
+been fixed.
+
+Tied methods like FETCH etc. may now safely access tied values, i.e.
+resulting in a recursive call to FETCH etc.  Remember to break the
+recursion, though.
+
+At startup Perl blocks the SIGFPE signal away since there isn't much
+Perl can do about it.  Previously this blocking was in effect also for
+programs executed from within Perl.  Now Perl restores the original
+SIGFPE handling routine, whatever it was, before running external
+programs.
+
+Linenumbers in Perl scripts may now be greater than 65536, or 2**16.
+(Perl scripts have always been able to be larger than that, it's just
+that the linenumber for reported errors and warnings have "wrapped
+around".)  While scripts that large usually indicate a need to rethink
+your code a bit, such Perl scripts do exist, for example as results
+from generated code.  Now linenumbers can go all the way to
+4294967296, or 2**32.
+
+=head2 Platform-specific fixes
+
+Linux
+
+=over 4
+
+=item *
+
+Setting $0 works again (with certain limitations that
+Perl cannot do much about: see L<perlvar/$0>)
+
+=back
+
+HP-UX
+
+=over 4
+
+=item *
+
+Setting $0 now works.
+
+=back
+
+VMS
+
+=over 4
+
+=item *
+
+Configuration now tests for the presence of C<poll()>, and IO::Poll
+now uses the vendor-supplied function if detected.
+
+=item *
+
+A rare access violation at Perl start-up could occur if the Perl image was
+installed with privileges or if there was an identifier with the
+subsystem attribute set in the process's rightslist.  Either of these
+circumstances triggered tainting code that contained a pointer bug. 
+The faulty pointer arithmetic has been fixed.
+
+=item *
+
+The length limit on values (not keys) in the %ENV hash has been raised
+from 255 bytes to 32640 bytes (except when the PERL_ENV_TABLES setting
+overrides the default use of logical names for %ENV).  If it is
+necessary to access these long values from outside Perl, be aware that
+they are implemented using search list logical names that store the
+value in pieces, each 255-byte piece (up to 128 of them) being an
+element in the search list. When doing a lookup in %ENV from within
+Perl, the elements are combined into a single value.  The existing
+VMS-specific ability to access individual elements of a search list
+logical name via the $ENV{'foo;N'} syntax (where N is the search list
+index) is unimpaired.
+
+=item *
+
+The piping implementation now uses local rather than global DCL
+symbols for inter-process communication.
+
+=item *
+
+File::Find could become confused when navigating to a relative
+directory whose name collided with a logical name.  This problem has
+been corrected by adding directory syntax to relative path names, thus
+preventing logical name translation.
+
+=back
+
+Win32
+
+=over 4
+
+=item *
+
+A memory leak in the fork() emulation has been fixed.
+
+=item *
+
+The return value of the ioctl() built-in function was accidentally
+broken in 5.8.0.  This has been corrected.
+
+=item *
+
+The internal message loop executed by perl during blocking operations
+sometimes interfered with messages that were external to Perl.
+This often resulted in blocking operations terminating prematurely or
+returning incorrect results, when Perl was executing under environments
+that could generate Windows messages.  This has been corrected.
+
+=item *
+
+Pipes and sockets are now automatically in binary mode.
+
+=item *
+
+The four-argument form of select() did not preserve $! (errno) properly
+when there were errors in the underlying call.  This is now fixed.
+
+=item *
+
+The "CR CR LF" problem of has been fixed, binmode(FH, ":crlf")
+is now effectively a no-op.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+All the warnings related to pack() and unpack() were made more
+informative and consistent.
+
+=head2 Changed "A thread exited while %d threads were running"
+
+The old version
+
+    A thread exited while %d other threads were still running
+
+was misleading because the "other" included also the thread giving
+the warning.
+
+=head2 Removed "Attempt to clear a restricted hash"
+
+It is not illegal to clear a restricted hash, so the warning
+was removed.
+
+=head2 New "Illegal declaration of anonymous subroutine"
+
+You must specify the block of code for C<sub>.
+
+=head2 Changed "Invalid range "%s" in transliteration operator"
+
+The old version
+
+    Invalid [] range "%s" in transliteration operator
+
+was simply wrong because there are no "[] ranges" in tr///.
+
+=head2 New "Missing control char name in \c"
+
+Self-explanatory.
+
+=head2 New "Newline in left-justified string for %s"
+
+The padding spaces would appear after the newline, which is
+probably not what you had in mind.
+
+=head2 New "Possible precedence problem on bitwise %c operator"
+
+If you think this
+
+    $x & $y == 0
+
+tests whether the bitwise AND of $x and $y is zero,
+you will like this warning.
+
+=head2 New "Pseudo-hashes are deprecated"
+
+This warning should have been already in 5.8.0, since they are.
+
+=head2 New "read() on %s filehandle %s"
+
+You cannot read() (or sysread()) from a closed or unopened filehandle.
+
+=head2 New "5.005 threads are deprecated"
+
+This warning should have been already in 5.8.0, since they are.
+
+=head2 New "Tied variable freed while still in use"
+
+Something pulled the plug on a live tied variable, Perl plays
+safe by bailing out.
+
+=head2 New "To%s: illegal mapping '%s'"
+
+An illegal user-defined Unicode casemapping was specified.
+
+=head2 New "Use of freed value in iteration"
+
+Something modified the values being iterated over.  This is not good.
+
+=head1 Changed Internals
+
+These news matter to you only if you either write XS code or like to
+know about or hack Perl internals (using Devel::Peek or any of the
+C<B::> modules counts), or like to run Perl with the C<-D> option.
+
+The embedding examples of L<perlembed> have been reviewed to be
+uptodate and consistent: for example, the correct use of
+PERL_SYS_INIT3() and PERL_SYS_TERM().
+
+Extensive reworking of the pad code (the code responsible
+for lexical variables) has been conducted by Dave Mitchell.
+
+Extensive work on the v-strings by John Peacock.
+
+UTF-8 length and position cache: to speed up the handling of Unicode
+(UTF-8) scalars, a cache was introduced.  Potential problems exist if
+an extension bypasses the official APIs and directly modifies the PV
+of an SV: the UTF-8 cache does not get cleared as it should.
+
+APIs obsoleted in Perl 5.8.0, like sv_2pv, sv_catpvn, sv_catsv,
+sv_setsv, are again available.
+
+Certain Perl core C APIs like cxinc and regatom are no longer
+available at all to code outside the Perl core of the Perl core
+extensions.  This is intentional.  They never should have been
+available with the shorter names, and if you application depends on
+them, you should (be ashamed and) contact perl5-porters to discuss
+what are the proper APIs.
+
+Certain Perl core C APIs like C<Perl_list> are no longer available
+without their C<Perl_> prefix.  If your XS module stops working
+because some functions cannot be found, in many cases a simple fix is
+to add the C<Perl_> prefix to the function and the thread context
+C<aTHX_> as the first argument of the function call.  This is also how
+it should always have been done: letting the Perl_-less forms to leak
+from the core was an accident.  For cleaner embedding you can also
+force this for all APIs by defining at compile time the cpp define
+PERL_NO_SHORT_NAMES.
+
+Perl_save_bool() has been added.
+
+Regexp objects (those created with C<qr>) now have S-magic rather than
+R-magic.  This fixed regexps of the form /...(??{...;$x})/ to no
+longer ignore changes made to $x.  The S-magic avoids dropping
+the caching optimization and making (??{...}) constructs obscenely
+slow (and consequently useless).  See also L<perlguts/"Magic Variables">.
+Regexp::Copy was affected by this change.
+
+The Perl internal debugging macros DEBUG() and DEB() have been renamed
+to PERL_DEBUG() and PERL_DEB() to avoid namespace conflicts.
+
+C<-DL> removed (the leaktest had been broken and unsupported for years,
+use alternative debugging mallocs or tools like valgrind and Purify).
+
+Verbose modifier C<v> added for C<-DXv> and C<-Dsv>, see L<perlrun>.
+
+=head1 New Tests
+
+In Perl 5.8.0 there were about 69000 separate tests in about 700 test files,
+in Perl 5.8.1 there are about 77000 separate tests in about 780 test files.
+The exact numbers depend on the Perl configuration and on the operating
+system platform.
+
+=head1 Known Problems
+
+The hash randomisation mentioned in L</Incompatible Changes> is definitely
+problematic: it will wake dormant bugs and shake out bad assumptions.
+
+If you want to use mod_perl 2.x with Perl 5.8.1, you will need
+mod_perl-1.99_10 or higher.  Earlier versions of mod_perl 2.x
+do not work with the randomised hashes.  (mod_perl 1.x works fine.)
+You will also need Apache::Test 1.04 or higher.
+
+Many of the rarer platforms that worked 100% or pretty close to it
+with perl 5.8.0 have been left a little bit untended since their
+maintainers have been otherwise busy lately, and therefore there will
+be more failures on those platforms.  Such platforms include Mac OS
+Classic, IBM z/OS (and other EBCDIC platforms), and NetWare.  The most
+common Perl platforms (Unix and Unix-like, Microsoft platforms, and
+VMS) have large enough testing and expert population that they are
+doing well.
+
+=head2 Tied hashes in scalar context
+
+Tied hashes do not currently return anything useful in scalar context,
+for example when used as boolean tests:
+
+	if (%tied_hash) { ... }
+
+The current nonsensical behaviour is always to return false,
+regardless of whether the hash is empty or has elements.
+
+The root cause is that there is no interface for the implementors of
+tied hashes to implement the behaviour of a hash in scalar context.
+
+=head2 Net::Ping 450_service and 510_ping_udp failures
+
+The subtests 9 and 18 of lib/Net/Ping/t/450_service.t, and the
+subtest 2 of lib/Net/Ping/t/510_ping_udp.t might fail if you have
+an unusual networking setup.  For example in the latter case the
+test is trying to send a UDP ping to the IP address 127.0.0.1.
+
+=head2 B::C
+
+The C-generating compiler backend B::C (the frontend being
+C<perlcc -c>) is even more broken than it used to be because of
+the extensive lexical variable changes.  (The good news is that
+B::Bytecode and ByteLoader are better than they used to be.)
+
+=head1 Platform Specific Problems
+
+=head2 EBCDIC Platforms
+
+IBM z/OS and other EBCDIC platforms continue to be problematic
+regarding Unicode support.  Many Unicode tests are skipped when
+they really should be fixed.
+
+=head2 Cygwin 1.5 problems
+
+In Cygwin 1.5 the F<io/tell> and F<op/sysio> tests have failures for
+some yet unknown reason.  In 1.5.5 the threads tests stress_cv,
+stress_re, and stress_string are failing unless the environment
+variable PERLIO is set to "perlio" (which makes also the io/tell
+failure go away).
+
+Perl 5.8.1 does build and work well with Cygwin 1.3: with (uname -a)
+C<CYGWIN_NT-5.0 ... 1.3.22(0.78/3/2) 2003-03-18 09:20 i686 ...>
+a 100% "make test"  was achieved with C<Configure -des -Duseithreads>.
+
+=head2 HP-UX: HP cc warnings about sendfile and sendpath
+
+With certain HP C compiler releases (e.g. B.11.11.02) you will
+get many warnings like this (lines wrapped for easier reading):
+
+  cc: "/usr/include/sys/socket.h", line 504: warning 562:
+    Redeclaration of "sendfile" with a different storage class specifier:
+      "sendfile" will have internal linkage.
+  cc: "/usr/include/sys/socket.h", line 505: warning 562:
+    Redeclaration of "sendpath" with a different storage class specifier:
+      "sendpath" will have internal linkage.
+
+The warnings show up both during the build of Perl and during certain
+lib/ExtUtils tests that invoke the C compiler.  The warning, however,
+is not serious and can be ignored.
+
+=head2 IRIX: t/uni/tr_7jis.t falsely failing
+
+The test t/uni/tr_7jis.t is known to report failure under 'make test'
+or the test harness with certain releases of IRIX (at least IRIX 6.5
+and MIPSpro Compilers Version 7.3.1.1m), but if run manually the test
+fully passes.
+
+=head2 Mac OS X: no usemymalloc
+
+The Perl malloc (C<-Dusemymalloc>) does not work at all in Mac OS X.
+This is not that serious, though, since the native malloc works just
+fine.
+
+=head2 Tru64: No threaded builds with GNU cc (gcc)
+
+In the latest Tru64 releases (e.g. v5.1B or later) gcc cannot be used
+to compile a threaded Perl (-Duseithreads) because the system
+C<< <pthread.h> >> file doesn't know about gcc.
+
+=head2 Win32: sysopen, sysread, syswrite
+
+As of the 5.8.0 release, sysopen()/sysread()/syswrite() do not behave
+like they used to in 5.6.1 and earlier with respect to "text" mode.
+These built-ins now always operate in "binary" mode (even if sysopen()
+was passed the O_TEXT flag, or if binmode() was used on the file
+handle).  Note that this issue should only make a difference for disk
+files, as sockets and pipes have always been in "binary" mode in the
+Windows port.  As this behavior is currently considered a bug,
+compatible behavior may be re-introduced in a future release.  Until
+then, the use of sysopen(), sysread() and syswrite() is not supported
+for "text" mode operations.
+
+=head1 Future Directions
+
+The following things B<might> happen in future.  The first publicly
+available releases having these characteristics will be the developer
+releases Perl 5.9.x, culminating in the Perl 5.10.0 release.  These
+are our best guesses at the moment: we reserve the right to rethink.
+
+=over 4
+
+=item *
+
+PerlIO will become The Default.  Currently (in Perl 5.8.x) the stdio
+library is still used if Perl thinks it can use certain tricks to
+make stdio go B<really> fast.  For future releases our goal is to
+make PerlIO go even faster.
+
+=item *
+
+A new feature called I<assertions> will be available.  This means that
+one can have code called assertions sprinkled in the code: usually
+they are optimised away, but they can be enabled with the C<-A> option.
+
+=item *
+
+A new operator C<//> (defined-or) will be available.  This means that
+one will be able to say
+
+    $a // $b
+
+instead of
+
+   defined $a ? $a : $b
+
+and
+
+   $c //= $d;
+
+instead of
+
+   $c = $d unless defined $c;
+
+The operator will have the same precedence and associativity as C<||>.
+A source code patch against the Perl 5.8.1 sources will be available
+in CPAN as F<authors/id/H/HM/HMBRAND/dor-5.8.1.diff>.
+
+=item *
+
+C<unpack()> will default to unpacking the C<$_>.
+
+=item *
+
+Various Copy-On-Write techniques will be investigated in hopes
+of speeding up Perl.
+
+=item *
+
+CPANPLUS, Inline, and Module::Build will become core modules.
+
+=item *
+
+The ability to write true lexically scoped pragmas will be introduced.
+
+=item *
+
+Work will continue on the bytecompiler and byteloader.
+
+=item *
+
+v-strings as they currently exist are scheduled to be deprecated.  The
+v-less form (1.2.3) will become a "version object" when used with C<use>,
+C<require>, and C<$VERSION>.  $^V will also be a "version object" so the
+printf("%vd",...) construct will no longer be needed.  The v-ful version
+(v1.2.3) will become obsolete.  The equivalence of strings and v-strings (e.g.
+that currently 5.8.0 is equal to "\5\8\0") will go away.  B<There may be no
+deprecation warning for v-strings>, though: it is quite hard to detect when
+v-strings are being used safely, and when they are not.
+
+=item *
+
+5.005 Threads Will Be Removed
+
+=item *
+
+The C<$*> Variable Will Be Removed
+(it was deprecated a long time ago)
+
+=item *
+
+Pseudohashes Will Be Removed
+
+=back
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/ .  There may also be
+information at http://www.perl.com/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.  You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl582delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl582delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl582delta.pod	(revision 14489)
@@ -0,0 +1,162 @@
+=head1 NAME
+
+perl582delta - what is new for perl v5.8.2
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.1 release and
+the 5.8.2 release.
+
+If you are upgrading from an earlier release such as 5.6.1, first read
+the L<perl58delta>, which describes differences between 5.6.0 and
+5.8.0, and the L<perl581delta>, which describes differences between
+5.8.0 and 5.8.1.
+
+=head1 Incompatible Changes
+
+For threaded builds for modules calling certain re-entrant system calls,
+binary compatibility was accidentally lost between 5.8.0 and 5.8.1.
+Binary compatibility with 5.8.0 has been restored in 5.8.2, which
+necessitates breaking compatibility with 5.8.1. We see this as the
+lesser of two evils.
+
+This will only affect people who have a threaded perl 5.8.1, and compiled
+modules which use these calls, and now attempt to run the compiled modules
+with 5.8.2. The fix is to re-compile and re-install the modules using 5.8.2.
+
+=head1 Core Enhancements
+
+=head2 Hash Randomisation
+
+The hash randomisation introduced with 5.8.1 has been amended. It
+transpired that although the implementation introduced in 5.8.1 was source
+compatible with 5.8.0, it was not binary compatible in certain cases. 5.8.2
+contains an improved implementation which is both source and binary
+compatible with both 5.8.0 and 5.8.1, and remains robust against the form of
+attack which prompted the change for 5.8.1.
+
+We are grateful to the Debian project for their input in this area.
+See L<perlsec/"Algorithmic Complexity Attacks"> for the original
+rationale behind this change.
+
+=head2 Threading
+
+Several memory leaks associated with variables shared between threads
+have been fixed.
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules And Pragmata
+
+The following modules and pragmata have been updated since Perl 5.8.1:
+
+=over 4
+
+=item Devel::PPPort
+
+=item Digest::MD5
+
+=item I18N::LangTags
+
+=item libnet
+
+=item MIME::Base64
+
+=item Pod::Perldoc
+
+=item strict
+
+Documentation improved
+
+=item Tie::Hash
+
+Documentation improved
+
+=item Time::HiRes
+
+=item Unicode::Collate
+
+=item Unicode::Normalize
+
+=item UNIVERSAL
+
+Documentation improved
+
+=back
+
+=head1 Selected Bug Fixes
+
+Some syntax errors involving unrecognized filetest operators are now handled
+correctly by the parser.
+
+=head1 Changed Internals
+
+Interpreter initialization is more complete when -DMULTIPLICITY is off.
+This should resolve problems with initializing and destroying the Perl
+interpreter more than once in a single process.                      
+
+=head1 Platform Specific Problems
+
+Dynamic linker flags have been tweaked for Solaris and OS X, which should
+solve problems seen while building some XS modules.
+
+Bugs in OS/2 sockets and tmpfile have been fixed.
+
+In OS X C<setreuid> and friends are troublesome - perl will now work
+around their problems as best possible.
+
+=head1 Future Directions
+
+Starting with 5.8.3 we intend to make more frequent maintenance releases,
+with a smaller number of changes in each. The intent is to propagate
+bug fixes out to stable releases more rapidly and make upgrading stable
+releases less of an upheaval. This should give end users more
+flexibility in their choice of upgrade timing, and allow them easier
+assessment of the impact of upgrades. The current plan is for code freezes
+as follows
+
+=over 4
+
+=item *
+
+5.8.3 23:59:59 GMT, Wednesday December 31st 2003
+
+=item *
+
+5.8.4 23:59:59 GMT, Wednesday March 31st 2004
+
+=item *
+
+5.8.5 23:59:59 GMT, Wednesday June 30th 2004
+
+=back
+
+with the release following soon after, when testing is complete.
+
+See L<perl581delta/"Future Directions"> for more soothsaying.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/.  There may also be
+information at http://www.perl.com/, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.  You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl583delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl583delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl583delta.pod	(revision 14489)
@@ -0,0 +1,210 @@
+=head1 NAME
+
+perl583delta - what is new for perl v5.8.3
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.2 release and
+the 5.8.3 release.
+
+If you are upgrading from an earlier release such as 5.6.1, first read
+the L<perl58delta>, which describes differences between 5.6.0 and
+5.8.0, and the L<perl581delta> and L<perl582delta>, which describe differences
+between 5.8.0, 5.8.1 and 5.8.2
+
+=head1 Incompatible Changes
+
+There are no changes incompatible with 5.8.2.
+
+=head1 Core Enhancements
+
+A C<SCALAR> method is now available for tied hashes. This is called when
+a tied hash is used in scalar context, such as
+
+    if (%tied_hash) {
+	...
+    }
+
+
+The old behaviour was that %tied_hash would return whatever would have been
+returned for that hash before the hash was tied (so usually 0). The new
+behaviour in the absence of a SCALAR method is to return TRUE if in the
+middle of an C<each> iteration, and otherwise call FIRSTKEY to check if the
+hash is empty (making sure that a subsequent C<each> will also begin by
+calling FIRSTKEY). Please see L<perltie/SCALAR> for the full details and
+caveats.
+
+=head1 Modules and Pragmata
+
+=over 4
+
+=item CGI
+
+=item Cwd
+
+=item Digest
+
+=item Digest::MD5
+
+=item Encode
+
+=item File::Spec
+
+=item FindBin
+
+A function C<again> is provided to resolve problems where modules in different
+directories wish to use FindBin.
+
+=item List::Util
+
+You can now weaken references to read only values.
+
+=item Math::BigInt
+
+=item PodParser
+
+=item Pod::Perldoc
+
+=item POSIX
+
+=item Unicode::Collate
+
+=item Unicode::Normalize
+
+=item Test::Harness
+
+=item threads::shared
+
+C<cond_wait> has a new two argument form. C<cond_timedwait> has been added.
+
+=back
+
+=head1 Utility Changes
+
+C<find2perl> now assumes C<-print> as a default action. Previously, it
+needed to be specified explicitly.
+
+A new utility, C<prove>, makes it easy to run an individual regression test
+at the command line. C<prove> is part of Test::Harness, which users of earlier
+Perl versions can install from CPAN.
+
+=head1 New Documentation
+
+The documentation has been revised in places to produce more standard manpages.
+
+The documentation for the special code blocks (BEGIN, CHECK, INIT, END)
+has been improved.
+
+=head1 Installation and Configuration Improvements
+
+Perl now builds on OpenVMS I64
+
+=head1 Selected Bug Fixes
+
+Using substr() on a UTF8 string could cause subsequent accesses on that
+string to return garbage. This was due to incorrect UTF8 offsets being
+cached, and is now fixed.
+
+join() could return garbage when the same join() statement was used to
+process 8 bit data having earlier processed UTF8 data, due to the flags
+on that statement's temporary workspace not being reset correctly. This
+is now fixed.
+
+C<$a .. $b> will now work as expected when either $a or $b is C<undef>
+
+Using Unicode keys with tied hashes should now work correctly.
+
+Reading $^E now preserves $!. Previously, the C code implementing $^E
+did not preserve C<errno>, so reading $^E could cause C<errno> and therefore
+C<$!> to change unexpectedly.
+
+Reentrant functions will (once more) work with C++. 5.8.2 introduced a bugfix
+which accidentally broke the compilation of Perl extensions written in C++
+
+=head1 New or Changed Diagnostics
+
+The fatal error "DESTROY created new reference to dead object" is now
+documented in L<perldiag>.
+
+=head1 Changed Internals
+
+The hash code has been refactored to reduce source duplication. The
+external interface is unchanged, and aside from the bug fixes described
+above, there should be no change in behaviour.
+
+C<hv_clear_placeholders> is now part of the perl API
+
+Some C macros have been tidied. In particular macros which create temporary
+local variables now name these variables more defensively, which should
+avoid bugs where names clash.
+
+<signal.h> is now always included.
+
+=head1 Configuration and Building
+
+C<Configure> now invokes callbacks regardless of the value of the variable
+they are called for. Previously callbacks were only invoked in the
+C<case $variable $define)> branch. This change should only affect platform
+maintainers writing configuration hints files.
+
+=head1 Platform Specific Problems
+
+The regression test ext/threads/shared/t/wait.t fails on early RedHat 9
+and HP-UX 10.20 due to bugs in their threading implementations.
+RedHat users should see https://rhn.redhat.com/errata/RHBA-2003-136.html
+and consider upgrading their glibc.
+
+=head1 Known Problems
+
+Detached threads aren't supported on Windows yet, as they may lead to 
+memory access violation problems.
+
+There is a known race condition opening scripts in C<suidperl>. C<suidperl>
+is neither built nor installed by default, and has been deprecated since
+perl 5.8.0. You are advised to replace use of suidperl with tools such
+as sudo ( http://www.courtesan.com/sudo/ )
+
+We have a backlog of unresolved bugs. Dealing with bugs and bug reports
+is unglamorous work; not something ideally suited to volunteer labour,
+but that is all that we have.
+
+The perl5 development team are implementing changes to help address this
+problem, which should go live in early 2004.
+
+=head1 Future Directions
+
+Code freeze for the next maintenance release (5.8.4) is on March 31st 2004,
+with release expected by mid April. Similarly 5.8.5's freeze will be at
+the end of June, with release by mid July.
+
+=head1 Obituary
+
+Iain 'Spoon' Truskett, Perl hacker, author of L<perlreref> and
+contributor to CPAN, died suddenly on 29th December 2003, aged 24.
+He will be missed.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org.  There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.  You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl584delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl584delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl584delta.pod	(revision 14489)
@@ -0,0 +1,263 @@
+=head1 NAME
+
+perl584delta - what is new for perl v5.8.4
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.3 release and
+the 5.8.4 release.
+
+=head1 Incompatible Changes
+
+Many minor bugs have been fixed. Scripts which happen to rely on previously
+erroneous behaviour will consider these fixes as incompatible changes :-)
+You are advised to perform sufficient acceptance testing on this release
+to satisfy yourself that this does not affect you, before putting this
+release into production.
+
+The diagnostic output of Carp has been changed slightly, to add a space after
+the comma between arguments. This makes it much easier for tools such as
+web browsers to wrap it, but might confuse any automatic tools which perform
+detailed parsing of Carp output.
+
+The internal dump output has been improved, so that non-printable characters
+such as newline and backspace are output in C<\x> notation, rather than
+octal. This might just confuse non-robust tools which parse the output of
+modules such as Devel::Peek.
+
+=head1 Core Enhancements
+
+=head2 Malloc wrapping
+
+Perl can now be built to detect attempts to assign pathologically large chunks
+of memory.  Previously such assignments would suffer from integer wrap-around
+during size calculations causing a misallocation, which would crash perl, and
+could theoretically be used for "stack smashing" attacks.  The wrapping
+defaults to enabled on platforms where we know it works (most AIX
+configurations, BSDi, Darwin, DEC OSF/1, FreeBSD, HP/UX, GNU Linux, OpenBSD,
+Solaris, VMS and most Win32 compilers) and defaults to disabled on other
+platforms.
+
+=head2 Unicode Character Database 4.0.1
+
+The copy of the Unicode Character Database included in Perl 5.8 has
+been updated to 4.0.1 from 4.0.0.
+
+=head2 suidperl less insecure
+
+Paul Szabo has analysed and patched C<suidperl> to remove existing known
+insecurities. Currently there are no known holes in C<suidperl>, but previous
+experience shows that we cannot be confident that these were the last. You may
+no longer invoke the set uid perl directly, so to preserve backwards
+compatibility with scripts that invoke #!/usr/bin/suidperl the only set uid
+binary is now C<sperl5.8.>I<n> (C<sperl5.8.4> for this release). C<suidperl>
+is installed as a hard link to C<perl>; both C<suidperl> and C<perl> will
+invoke C<sperl5.8.4> automatically the set uid binary, so this change should
+be completely transparent.
+
+For new projects the core perl team would strongly recommend that you use
+dedicated, single purpose security tools such as C<sudo> in preference to
+C<suidperl>.
+
+=head2 format
+
+In addition to bug fixes, C<format>'s features have been enhanced. See
+L<perlform>
+
+=head1 Modules and Pragmata
+
+The (mis)use of C</tmp> in core modules and documentation has been tidied up.
+Some modules available both within the perl core and independently from CPAN
+("dual-life modules") have not yet had these changes applied; the changes
+will be integrated into future stable perl releases as the modules are
+updated on CPAN.
+
+=head2 Updated modules
+
+=over 4
+
+=item Attribute::Handlers
+
+=item B
+
+=item Benchmark
+
+=item CGI
+
+=item Carp
+
+=item Cwd
+
+=item Exporter
+
+=item File::Find
+
+=item IO
+
+=item IPC::Open3
+
+=item Local::Maketext
+
+=item Math::BigFloat
+
+=item Math::BigInt
+
+=item Math::BigRat
+
+=item MIME::Base64
+
+=item ODBM_File
+
+=item POSIX
+
+=item Shell
+
+=item Socket
+
+There is experimental support for Linux abstract Unix domain sockets.
+
+=item Storable
+
+=item Switch
+
+Synced with its CPAN version 2.10
+
+=item Sys::Syslog
+
+C<syslog()> can now use numeric constants for facility names and priorities,
+in addition to strings.
+
+=item Term::ANSIColor
+
+=item Time::HiRes
+
+=item Unicode::UCD
+
+=item Win32
+
+Win32.pm/Win32.xs has moved from the libwin32 module to core Perl
+
+=item base
+
+=item open
+
+=item threads
+
+Detached threads are now also supported on Windows.
+
+=item utf8
+
+=back
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+Accelerated Unicode case mappings (C</i>, C<lc>, C<uc>, etc).
+
+=item *
+
+In place sort optimised (eg C<@a = sort @a>)
+
+=item *
+
+Unnecessary assignment optimised away in
+
+  my $s = undef;
+  my @a = ();
+  my %h = ();
+
+=item *
+
+Optimised C<map> in scalar context
+
+=back
+
+=head1 Utility Changes
+
+The Perl debugger (F<lib/perl5db.pl>) can now save all debugger commands for
+sourcing later, and can display the parent inheritance tree of a given class.
+
+=head1 Installation and Configuration Improvements
+
+The build process on both VMS and Windows has had several minor improvements
+made. On Windows Borland's C compiler can now compile perl with PerlIO and/or
+USE_LARGE_FILES enabled.
+
+C<perl.exe> on Windows now has a "Camel" logo icon. The use of a camel with
+the topic of Perl is a trademark of O'Reilly and Associates Inc., and is used
+with their permission (ie distribution of the source, compiling a Windows
+executable from it, and using that executable locally). Use of the supplied
+camel for anything other than a perl executable's icon is specifically not
+covered, and anyone wishing to redistribute perl binaries I<with> the icon
+should check directly with O'Reilly beforehand.
+
+Perl should build cleanly on Stratus VOS once more.
+
+=head1 Selected Bug Fixes
+
+More utf8 bugs fixed, notably in how C<chomp>, C<chop>, C<send>, and
+C<syswrite> and interact with utf8 data. Concatenation now works correctly
+when C<use bytes;> is in scope.
+
+Pragmata are now correctly propagated into (?{...}) constructions in regexps.
+Code such as
+
+   my $x = qr{ ... (??{ $x }) ... };
+
+will now (correctly) fail under use strict. (As the inner C<$x> is and
+has always referred to C<$::x>)
+
+The "const in void context" warning has been suppressed for a constant in an
+optimised-away boolean expression such as C<5 || print;>
+
+C<perl -i> could C<fchmod(stdin)> by mistake. This is serious if stdin is
+attached to a terminal, and perl is running as root. Now fixed.
+
+=head1 New or Changed Diagnostics
+
+C<Carp> and the internal diagnostic routines used by C<Devel::Peek> have been
+made clearer, as described in L</Incompatible Changes>
+
+=head1 Changed Internals
+
+Some bugs have been fixed in the hash internals. Restricted hashes and
+their place holders are now allocated and deleted at slightly different times,
+but this should not be visible to user code.
+
+=head1 Future Directions
+
+Code freeze for the next maintenance release (5.8.5) will be on 30th June
+2004, with release by mid July.
+
+=head1 Platform Specific Problems
+
+This release is known not to build on Windows 95.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org.  There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.  You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl585delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl585delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl585delta.pod	(revision 14489)
@@ -0,0 +1,257 @@
+=head1 NAME
+
+perl585delta - what is new for perl v5.8.5
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.4 release and
+the 5.8.5 release.
+
+=head1 Incompatible Changes
+
+There are no changes incompatible with 5.8.4.
+
+=head1 Core Enhancements
+
+Perl's regular expression engine now contains support for matching on the
+intersection of two Unicode character classes. You can also now refer to
+user-defined character classes from within other user defined character
+classes.
+
+=head1 Modules and Pragmata
+
+=over 4
+
+=item *
+
+Carp improved to work nicely with Safe. Carp's message reporting should now
+be anomaly free - it will always print out line number information.
+
+=item *
+
+CGI upgraded to version 3.05
+
+=item *
+
+charnames now avoids clobbering $_
+
+=item *
+
+Digest upgraded to version 1.08
+
+=item *
+
+Encode upgraded to version 2.01
+
+=item *
+
+FileCache upgraded to version 1.04
+
+=item *
+
+libnet upgraded to version 1.19
+
+=item *
+
+Pod::Parser upgraded to version 1.28
+
+=item *
+
+Pod::Perldoc upgraded to version 3.13
+
+=item *
+
+Pod::LaTeX upgraded to version 0.57
+
+=item *
+
+Safe now works properly with Carp
+
+=item *
+
+Scalar-List-Utils upgraded to version 1.14
+
+=item *
+
+Shell's documentation has been re-written, and its historical partial
+auto-quoting of command arguments can now be disabled.
+
+=item *
+
+Test upgraded to version 1.25
+
+=item *
+
+Test::Harness upgraded to version 2.42
+
+=item *
+
+Time::Local upgraded to version 1.10
+
+=item *
+
+Unicode::Collate upgraded to version 0.40
+
+=item *
+
+Unicode::Normalize upgraded to version 0.30
+
+=back
+
+=head1 Utility Changes
+
+=head2 Perl's debugger
+
+The debugger can now emulate stepping backwards, by restarting and rerunning
+all bar the last command from a saved command history.
+
+=head2 h2ph
+
+F<h2ph> is now able to understand a very limited set of C inline functions
+-- basically, the inline functions that look like CPP macros. This has
+been introduced to deal with some of the headers of the newest versions of
+the glibc. The standard warning still applies; to quote F<h2ph>'s
+documentation, I<you may need to dicker with the files produced>.
+
+=head1 Installation and Configuration Improvements
+
+Perl 5.8.5 should build cleanly from source on LynxOS.
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+The in-place sort optimisation introduced in 5.8.4 had a bug. For example,
+in code such as
+
+    @a = sort ($b, @a)
+
+the result would omit the value $b. This is now fixed.
+
+=item *
+
+The optimisation for unnecessary assignments introduced in 5.8.4 could give
+spurious warnings. This has been fixed.
+
+=item *
+
+Perl should now correctly detect and read BOM-marked and (BOMless) UTF-16
+scripts of either endianness.
+
+=item *
+
+Creating a new thread when weak references exist was buggy, and would often
+cause warnings at interpreter destruction time. The known bug is now fixed.
+
+=item *
+
+Several obscure bugs involving manipulating Unicode strings with C<substr> have
+been fixed.
+
+=item *
+
+Previously if Perl's file globbing function encountered a directory that it
+did not have permission to open it would return immediately, leading to
+unexpected truncation of the list of results. This has been fixed, to be
+consistent with Unix shells' globbing behaviour.
+
+=item *
+
+Thread creation time could vary wildly between identical runs. This was caused
+by a poor hashing algorithm in the thread cloning routines, which has now
+been fixed.
+
+=item *
+
+The internals of the ithreads implementation were not checking if OS-level
+thread creation had failed. threads->create() now returns C<undef> in if
+thread creation fails instead of crashing perl.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=over 4
+
+=item *
+
+Perl -V has several improvements
+
+=over 4
+
+=item  *
+
+correctly outputs local patch names that contain embedded code snippets
+or other characters that used to confuse it.
+
+=item * 
+
+arguments to -V that look like regexps will give multiple lines of output.
+
+=item *
+
+a trailing colon suppresses the linefeed and ';'  terminator, allowing
+embedding of queries into shell commands.
+
+=item *
+
+a leading colon removes the 'name=' part of the response, allowing mapping to
+any name.
+
+=back
+
+=item *
+
+When perl fails to find the specified script, it now outputs a second line
+suggesting that the user use the C<-S> flag:
+
+    $ perl5.8.5 missing.pl
+    Can't open perl script "missing.pl": No such file or directory.
+    Use -S to search $PATH for it.
+
+=back
+
+=head1 Changed Internals
+
+The Unicode character class files used by the regular expression engine are
+now built at build time from the supplied Unicode consortium data files,
+instead of being shipped prebuilt. This makes the compressed Perl source
+tarball about 200K smaller. A side effect is that the layout of files inside
+lib/unicore has changed.
+
+=head1 Known Problems
+
+The regression test F<t/uni/class.t> is now performing considerably more
+tests, and can take several minutes to run even on a fast machine.
+
+=head1 Platform Specific Problems
+
+This release is known not to build on Windows 95.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org.  There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.  You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl586delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl586delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl586delta.pod	(revision 14489)
@@ -0,0 +1,170 @@
+=head1 NAME
+
+perl586delta - what is new for perl v5.8.6
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.5 release and
+the 5.8.6 release.
+
+=head1 Incompatible Changes
+
+There are no changes incompatible with 5.8.5.
+
+=head1 Core Enhancements
+
+The perl interpreter is now more tolerant of UTF-16-encoded scripts.
+
+On Win32, Perl can now use non-IFS compatible LSPs, which allows Perl to
+work in conjunction with firewalls such as McAfee Guardian. For full details
+see the file F<README.win32>, particularly if you're running Win95.
+
+=head1 Modules and Pragmata
+
+=over 4
+
+=item *
+
+With the C<base> pragma, an intermediate class with no fields used to messes
+up private fields in the base class. This has been fixed.
+
+=item *
+
+Cwd upgraded to version 3.01 (as part of the new PathTools distribution)
+
+=item *
+
+Devel::PPPort upgraded to version 3.03
+
+=item *
+
+File::Spec upgraded to version 3.01 (as part of the new PathTools distribution)
+
+=item *
+
+Encode upgraded to version 2.08
+
+=item *
+
+ExtUtils::MakeMaker remains at version 6.17, as later stable releases currently
+available on CPAN have some issues with core modules on some core platforms.
+
+=item *
+
+I18N::LangTags upgraded to version 0.35
+
+=item *
+
+Math::BigInt upgraded to version 1.73
+
+=item *
+
+Math::BigRat upgraded to version 0.13
+
+=item *
+
+MIME::Base64 upgraded to version 3.05
+
+=item *
+
+POSIX::sigprocmask function can now retrieve the current signal mask without
+also setting it.
+
+=item *
+
+Time::HiRes upgraded to version 1.65
+
+=back
+
+=head1 Utility Changes
+
+Perl has a new -dt command-line flag, which enables threads support in the
+debugger.
+
+=head1 Performance Enhancements
+
+C<reverse sort ...> is now optimized to sort in reverse, avoiding the
+generation of a temporary intermediate list.
+
+C<for (reverse @foo)> now iterates in reverse, avoiding the generation of a
+temporary reversed list.
+
+=head1 Selected Bug Fixes
+
+The regexp engine is now more robust when given invalid utf8 input, as is
+sometimes generated by buggy XS modules.
+
+C<foreach> on threads::shared array used to be able to crash Perl. This bug
+has now been fixed.
+
+A regexp in C<STDOUT>'s destructor used to coredump, because the regexp pad
+was already freed. This has been fixed.
+
+C<goto &> is now more robust - bugs in deep recursion and chained C<goto &>
+have been fixed.
+
+Using C<delete> on an array no longer leaks memory. A C<pop> of an item from a
+shared array reference no longer causes a leak.
+
+C<eval_sv()> failing a taint test could corrupt the stack - this has been
+fixed.
+
+On platforms with 64 bit pointers numeric comparison operators used to
+erroneously compare the addresses of references that are overloaded, rather
+than using the overloaded values. This has been fixed.
+
+C<read> into a UTF8-encoded buffer with an offset off the end of the buffer
+no longer mis-calculates buffer lengths.
+
+Although Perl has promised since version 5.8 that C<sort()> would be
+stable, the two cases C<sort {$b cmp $a}> and C<< sort {$b <=> $a} >> could
+produce non-stable sorts.   This is corrected in perl5.8.6.
+
+Localising C<$^D> no longer generates a diagnostic message about valid -D
+flags.
+
+=head1 New or Changed Diagnostics
+
+For -t and -T,
+   Too late for "-T" option
+has been changed to the more informative
+   "-T" is on the #! line, it must also be used on the command line
+
+=head1 Changed Internals
+
+From now on all applications embedding perl will behave as if perl
+were compiled with -DPERL_USE_SAFE_PUTENV.  See "Environment access" in
+the F<INSTALL> file for details.
+
+Most C<C> source files now have comments at the top explaining their purpose,
+which should help anyone wishing to get an overview of the implementation.
+
+=head1 New Tests
+
+There are significantly more tests for the C<B> suite of modules.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org.  There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.  You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl587delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl587delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl587delta.pod	(revision 14489)
@@ -0,0 +1,379 @@
+=head1 NAME
+
+perldelta - what is new for perl v5.8.7
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.6 release and
+the 5.8.7 release.
+
+=head1 Incompatible Changes
+
+There are no changes incompatible with 5.8.6.
+
+=head1 Core Enhancements
+
+=head2 Unicode Character Database 4.1.0
+
+The copy of the Unicode Character Database included in Perl 5.8 has
+been updated to 4.1.0 from 4.0.1. See
+L<http://www.unicode.org/versions/Unicode4.1.0/#NotableChanges> for the
+notable changes.
+
+=head2 suidperl less insecure
+
+A pair of exploits in C<suidperl> involving debugging code have been closed.
+
+For new projects the core perl team strongly recommends that you use
+dedicated, single purpose security tools such as C<sudo> in preference to
+C<suidperl>.
+
+=head2 Optional site customization script
+
+The perl interpreter can be built to allow the use of a site customization
+script. By default this is not enabled, to be consistent with previous perl
+releases. To use this, add C<-Dusesitecustomize> to the command line flags
+when running the C<Configure> script. See also L<perlrun/-f>.
+
+=head2 C<Config.pm> is now much smaller.
+
+C<Config.pm> is now about 3K rather than 32K, with the infrequently used
+code and C<%Config> values loaded on demand. This is transparent to the
+programmer, but means that most code will save parsing and loading 29K of
+script (for example, code that uses C<File::Find>).
+
+=head1 Modules and Pragmata
+
+=over 4
+
+=item *
+
+B upgraded to version 1.09
+
+=item *
+
+base upgraded to version 2.07
+
+=item *
+
+bignum upgraded to version 0.17
+
+=item *
+
+bytes upgraded to version 1.02
+
+=item *
+
+Carp upgraded to version 1.04
+
+=item *
+
+CGI upgraded to version 3.10
+
+=item *
+
+Class::ISA upgraded to version 0.33
+
+=item *
+
+Data::Dumper upgraded to version 2.121_02
+
+=item *
+
+DB_File upgraded to version 1.811
+
+=item *
+
+Devel::PPPort upgraded to version 3.06
+
+=item *
+
+Digest upgraded to version 1.10
+
+=item *
+
+Encode upgraded to version 2.10
+
+=item *
+
+FileCache upgraded to version 1.05
+
+=item *
+
+File::Path upgraded to version 1.07
+
+=item *
+
+File::Temp upgraded to version 0.16
+
+=item *
+
+IO::File upgraded to version 1.11
+
+=item *
+
+IO::Socket upgraded to version 1.28
+
+=item *
+
+Math::BigInt upgraded to version 1.77
+
+=item *
+
+Math::BigRat upgraded to version 0.15
+
+=item *
+
+overload upgraded to version 1.03
+
+=item *
+
+PathTools upgraded to version 3.05
+
+=item *
+
+Pod::HTML upgraded to version 1.0503
+
+=item *
+
+Pod::Perldoc upgraded to version 3.14
+
+=item *
+
+Pod::LaTeX upgraded to version 0.58
+
+=item *
+
+Pod::Parser upgraded to version 1.30
+
+=item *
+
+Symbol upgraded to version 1.06
+
+=item *
+
+Term::ANSIColor upgraded to version 1.09
+
+=item *
+
+Test::Harness upgraded to version 2.48
+
+=item *
+
+Test::Simple upgraded to version 0.54
+
+=item *
+
+Text::Wrap upgraded to version 2001.09293, to fix a bug when wrap() was
+called with a non-space separator.
+
+=item *
+
+threads::shared upgraded to version 0.93
+
+=item *
+
+Time::HiRes upgraded to version 1.66
+
+=item *
+
+Time::Local upgraded to version 1.11
+
+=item *
+
+Unicode::Normalize upgraded to version 0.32
+
+=item *
+
+utf8 upgraded to version 1.05
+
+=item *
+
+Win32 upgraded to version 0.24, which provides Win32::GetFileVersion
+
+=back
+
+=head1 Utility Changes
+
+=head2 find2perl enhancements
+
+C<find2perl> has new options C<-iname>, C<-path> and C<-ipath>.
+
+=head1 Performance Enhancements
+
+The internal pointer mapping hash used during ithreads cloning now uses an
+arena for memory allocation. In tests this reduced ithreads cloning time by
+about 10%.
+
+=head1 Installation and Configuration Improvements
+
+=over 4
+
+=item *
+
+The Win32 "dmake" makefile.mk has been updated to make it compatible
+with the latest versions of dmake.
+
+=item *
+
+C<PERL_MALLOC>, C<DEBUG_MSTATS>, C<PERL_HASH_SEED_EXPLICIT> and C<NO_HASH_SEED>
+should now work in Win32 makefiles.
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+The socket() function on Win32 has been fixed so that it is able to use
+transport providers which specify a protocol of 0 (meaning any protocol
+is allowed) once more.  (This was broken in 5.8.6, and typically caused
+the use of ICMP sockets to fail.)
+
+=item *
+
+Another obscure bug involving C<substr> and UTF-8 caused by bad internal
+offset caching has been identified and fixed.
+
+=item *
+
+A bug involving the loading of UTF-8 tables by the regexp engine has been
+fixed - code such as C<"\x{100}" =~ /[[:print:]]/> will no longer give
+corrupt results.
+
+=item *
+
+Case conversion operations such as C<uc> on a long Unicode string could
+exhaust memory. This has been fixed.
+
+=item *
+
+C<index>/C<rindex> were buggy for some combinations of Unicode and
+non-Unicode data. This has been fixed.
+
+=item *
+
+C<read> (and presumably C<sysread>) would expose the UTF-8 internals when
+reading from a byte oriented file handle into a UTF-8 scalar. This has
+been fixed.
+
+=item *
+
+Several C<pack>/C<unpack> bug fixes:
+
+=over 4
+
+=item *
+
+Checksums with C<b> or C<B> formats were broken.
+
+=item *
+
+C<unpack> checksums could overflow with the C<C> format.
+
+=item *
+
+C<U0> and C<C0> are now scoped to C<()> C<pack> sub-templates.
+
+=item *
+
+Counted length prefixes now don't change C<C0>/C<U0> mode.
+
+=item *
+
+C<pack> C<Z0> used to destroy the preceding character.
+
+=item *
+
+C<P>/C<p> C<pack> formats used to only recognise literal C<undef> 
+
+=back
+
+=item *
+
+Using closures with ithreads could cause perl to crash. This was due to
+failure to correctly lock internal OP structures, and has been fixed.
+
+=item *
+
+The return value of C<close> now correctly reflects any file errors that
+occur while flushing the handle's data, instead of just giving failure if
+the actual underlying file close operation failed.
+
+=item *
+
+C<not() || 1> used to segfault. C<not()> now behaves like C<not(0)>, which was
+the pre 5.6.0 behaviour.
+
+=item *
+
+C<h2ph> has various enhancements to cope with constructs in header files that
+used to result in incorrect or invalid output.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+There is a new taint error, "%ENV is aliased to %s". This error is thrown
+when taint checks are enabled and when C<*ENV> has been aliased, so that
+C<%ENV> has no env-magic anymore and hence the environment cannot be verified
+as taint-free.
+
+The internals of C<pack> and C<unpack> have been updated. All legitimate
+templates should work as before, but there may be some changes in the error
+reported for complex failure cases. Any behaviour changes for non-error cases
+are bugs, and should be reported.
+
+=head1 Changed Internals
+
+There has been a fair amount of refactoring of the C<C> source code, partly to
+make it tidier and more maintainable. The resulting object code and the
+C<perl> binary may well be smaller than 5.8.6, and hopefully faster in some
+cases, but apart from this there should be no user-detectable changes.
+
+C<${^UTF8LOCALE}> has been added to give perl space access to C<PL_utf8locale>.
+
+The size of the arenas used to allocate SV heads and most SV bodies can now
+be changed at compile time. The old size was 1008 bytes, the new default size
+is 4080 bytes.
+
+=head1 Known Problems
+
+Unicode strings returned from overloaded operators can be buggy. This is a
+long standing bug reported since 5.8.6 was released, but we do not yet have
+a suitable fix for it.
+
+=head1 Platform Specific Problems
+
+On UNICOS, lib/Math/BigInt/t/bigintc.t hangs burning CPU.
+ext/B/t/bytecode.t and ext/Socket/t/socketpair.t both fail tests.
+These are unlikely to be resolved, as our valiant UNICOS porter's last
+Cray is being decommissioned.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org.  There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.  You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl588delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl588delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl588delta.pod	(revision 14489)
@@ -0,0 +1,1632 @@
+=head1 NAME
+
+perldelta - what is new for perl v5.8.8
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.7 release and
+the 5.8.8 release.
+
+=head1 Incompatible Changes
+
+There are no changes intentionally incompatible with 5.8.7. If any exist,
+they are bugs and reports are welcome.
+
+=head1 Core Enhancements
+
+=over
+
+=item *
+
+C<chdir>, C<chmod> and C<chown> can now work on filehandles as well as
+filenames, if the system supports respectively C<fchdir>, C<fchmod> and
+C<fchown>, thanks to a patch provided by Gisle Aas.
+
+=back
+
+=head1 Modules and Pragmata
+
+=over
+
+=item *
+
+C<Attribute::Handlers> upgraded to version 0.78_02
+
+=over
+
+=item *
+
+Documentation typo fix
+
+=back
+
+=item *
+
+C<attrs> upgraded to version 1.02
+
+=over
+
+=item *
+
+Internal cleanup only
+
+=back
+
+=item *
+
+C<autouse> upgraded to version 1.05
+
+=over
+
+=item *
+
+Simplified implementation
+
+=back
+
+=item *
+
+C<B> upgraded to version 1.09_01
+
+=over
+
+=item *
+
+The inheritance hierarchy of the C<B::> modules has been corrected;
+C<B::NV> now inherits from C<B::SV> (instead of C<B::IV>).
+
+=back
+
+=item *
+
+C<blib> upgraded to version 1.03
+
+=over
+
+=item *
+
+Documentation typo fix
+
+=back
+
+=item *
+
+C<ByteLoader> upgraded to version 0.06
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<CGI> upgraded to version 3.15
+
+=over
+
+=item *
+
+Extraneous "?" from C<self_url()> removed
+
+=item *
+
+C<scrolling_list()> select attribute fixed
+
+=item *
+
+C<virtual_port> now works properly with the https protocol
+
+=item *
+
+C<upload_hook()> and C<append()> now works in function-oriented mode
+
+=item *
+
+C<POST_MAX> doesn't cause the client to hang any more
+
+=item *
+
+Automatic tab indexes are now disabled and new C<-tabindex> pragma has
+been added to turn automatic indexes back on
+
+=item *
+
+C<end_form()> doesn't emit empty (and non-validating) C<< <div> >>
+
+=item *
+
+C<CGI::Carp> works better in certain mod_perl configurations
+
+=item *
+
+Setting C<$CGI::TMPDIRECTORY> is now effective
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<charnames> upgraded to version 1.05
+
+=over
+
+=item *
+
+C<viacode()> now accept hex strings and has been optimized.
+
+=back
+
+=item *
+
+C<CPAN> upgraded to version 1.76_02
+
+=over
+
+=item *
+
+1 minor bug fix for Win32
+
+=back
+
+=item *
+
+C<Cwd> upgraded to version 3.12
+
+=over
+
+=item *
+
+C<canonpath()> on Win32 now collapses F<foo\..> sections correctly.
+
+=item *
+
+Improved behaviour on Symbian OS.
+
+=item *
+
+Enhanced documentation and typo fixes
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Data::Dumper> upgraded to version 2.121_08
+
+=over
+
+=item *
+
+A problem where C<Data::Dumper> would sometimes update the iterator state
+of hashes has been fixed
+
+=item *
+
+Numeric labels now work
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<DB> upgraded to version 1.01
+
+=over
+
+=item *
+
+A problem where the state of the regexp engine would sometimes get clobbered when running
+under the debugger has been fixed.
+
+=back
+
+=item *
+
+C<DB_File> upgraded to version 1.814
+
+=over
+
+=item *
+
+Adds support for Berkeley DB 4.4.
+
+=back
+
+=item *
+
+C<Devel::DProf> upgraded to version 20050603.00
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Devel::Peek> upgraded to version 1.03
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Devel::PPPort> upgraded to version 3.06_01
+
+=over
+
+=item *
+
+C<--compat-version> argument checking has been improved
+
+=item *
+
+Files passed on the command line are filtered by default
+
+=item *
+
+C<--nofilter> option to override the filtering has been added
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<diagnostics> upgraded to version 1.15
+
+=over
+
+=item *
+
+Documentation typo fix
+
+=back
+
+=item *
+
+C<Digest> upgraded to version 1.14
+
+=over
+
+=item *
+
+The constructor now knows which module implements SHA-224
+
+=item *
+
+Documentation tweaks and typo fixes
+
+=back
+
+=item *
+
+C<Digest::MD5> upgraded to version 2.36
+
+=over
+
+=item *
+
+C<XSLoader> is now used for faster loading
+
+=item *
+
+Enhanced documentation including MD5 weaknesses discovered lately
+
+=back
+
+=item *
+
+C<Dumpvalue> upgraded to version 1.12
+
+=over
+
+=item *
+
+Documentation fix
+
+=back
+
+=item *
+
+C<DynaLoader> upgraded but unfortunately we're not able to increment its version number :-(
+
+=over
+
+=item *
+
+Implements C<dl_unload_file> on Win32
+
+=item *
+
+Internal cleanup
+
+=item *
+
+C<XSLoader> 0.06 incorporated; small optimisation for calling
+C<bootstrap_inherit()> and documentation enhancements.
+
+=back
+
+=item *
+
+C<Encode> upgraded to version 2.12
+
+=over
+
+=item *
+
+A coderef is now acceptable for C<CHECK>!
+
+=item *
+
+3 new characters added to the ISO-8859-7 encoding
+
+=item *
+
+New encoding C<MIME-Header-ISO_2022_JP> added
+
+=item *
+
+Problem with partial characters and C<< encoding(utf-8-strict) >> fixed.
+
+=item *
+
+Documentation enhancements and typo fixes
+
+=back
+
+=item *
+
+C<English> upgraded to version 1.02
+
+=over
+
+=item *
+
+the C<< $COMPILING >> variable has been added
+
+=back
+
+=item *
+
+C<ExtUtils::Constant> upgraded to version 0.17
+
+=over
+
+=item *
+
+Improved compatibility with older versions of perl
+
+=back
+
+=item *
+
+C<ExtUtils::MakeMaker> upgraded to version 6.30 (was 6.17)
+
+=over
+
+=item *
+
+Too much to list here;  see L<http://search.cpan.org/src/MSCHWERN/ExtUtils-MakeMaker-6.30/Changes>
+
+=back
+
+=item *
+
+C<File::Basename> upgraded to version 2.74, with changes contributed by Michael Schwern.
+
+=over
+
+=item *
+
+Documentation clarified and errors corrected.
+
+=item *
+
+C<basename> now strips trailing path separators before processing the name.
+
+=item *
+
+C<basename> now returns C</> for parameter C</>, to make C<basename>
+consistent with the shell utility of the same name.
+
+=item *
+
+The suffix is no longer stripped if it is identical to the remaining characters
+in the name, again for consistency with the shell utility.
+
+=item *
+
+Some internal code cleanup.
+
+=back
+
+=item *
+
+C<File::Copy> upgraded to version 2.09
+
+=over
+
+=item *
+
+Copying a file onto itself used to fail.
+
+=item *
+
+Moving a file between file systems now preserves the access and
+modification time stamps
+
+=back
+
+=item *
+
+C<File::Find> upgraded to version 1.10
+
+=over
+
+=item *
+
+Win32 portability fixes
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<File::Glob> upgraded to version 1.05
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<File::Path> upgraded to version 1.08
+
+=over
+
+=item *
+
+C<mkpath> now preserves C<errno> when C<mkdir> fails
+
+=back
+
+=item *
+
+C<File::Spec> upgraded to version 3.12
+
+=over
+
+=item *
+
+C<File::Spec->rootdir()> now returns C<\> on Win32, instead of C</>
+
+=item *
+
+C<$^O> could sometimes become tainted. This has been fixed.
+
+=item *
+
+C<canonpath> on Win32 now collapses C<foo/..> (or C<foo\..>) sections
+correctly, rather than doing the "misguided" work it was previously doing.
+Note that C<canonpath> on Unix still does B<not> collapse these sections, as
+doing so would be incorrect.
+
+=item *
+
+Some documentation improvements
+
+=item *
+
+Some internal code cleanup
+
+=back
+
+=item *
+
+C<FileCache> upgraded to version 1.06
+
+=over
+
+=item *
+
+POD formatting errors in the documentation fixed
+
+=back
+
+=item *
+
+C<Filter::Simple> upgraded to version 0.82
+
+=item *
+
+C<FindBin> upgraded to version 1.47
+
+=over
+
+=item *
+
+Now works better with directories where access rights are more
+restrictive than usual.
+
+=back
+
+=item *
+
+C<GDBM_File> upgraded to version 1.08
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Getopt::Long> upgraded to version 2.35
+
+=over
+
+=item *
+
+C<prefix_pattern> has now been complemented by a new configuration
+option C<long_prefix_pattern> that allows the user to specify what
+prefix patterns should have long option style semantics applied.
+
+=item *
+
+Options can now take multiple values at once (experimental)
+
+=item *
+
+Various bug fixes
+
+=back
+
+=item *
+
+C<if> upgraded to version 0.05
+
+=over
+
+=item *
+
+Give more meaningful error messages from C<if> when invoked with a
+condition in list context.
+
+=item *
+
+Restore backwards compatibility with earlier versions of perl
+
+=back
+
+=item *
+
+C<IO> upgraded to version 1.22
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<IPC::Open2> upgraded to version 1.02
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<IPC::Open3> upgraded to version 1.02
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<List::Util> upgraded to version 1.18 (was 1.14)
+
+=over
+
+=item *
+
+Fix pure-perl version of C<refaddr> to avoid blessing an un-blessed reference
+
+=item *
+
+Use C<XSLoader> for faster loading
+
+=item *
+
+Fixed various memory leaks
+
+=item *
+
+Internal cleanup and portability fixes
+
+=back
+
+=item *
+
+C<Math::Complex> upgraded to version 1.35
+
+=over
+
+=item *
+
+C<atan2(0, i)> now works, as do all the (computable) complex argument cases
+
+=item *
+
+Fixes for certain bugs in C<make> and C<emake>
+
+=item *
+
+Support returning the I<k>th root directly
+
+=item *
+
+Support C<[2,-3pi/8]> in C<emake>
+
+=item *
+
+Support C<inf> for C<make>/C<emake>
+
+=item *
+
+Document C<make>/C<emake> more visibly
+
+=back
+
+=item *
+
+C<Math::Trig> upgraded to version 1.03
+
+=over
+
+=item *
+
+Add more great circle routines: C<great_circle_waypoint> and
+C<great_circle_destination>
+
+=back
+
+=item *
+
+C<MIME::Base64> upgraded to version 3.07
+
+=over
+
+=item *
+
+Use C<XSLoader> for faster loading
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<NDBM_File> upgraded to version 1.06
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<ODBM_File> upgraded to version 1.06
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Opcode> upgraded to version 1.06
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<open> upgraded to version 1.05
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<overload> upgraded to version 1.04
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<PerlIO> upgraded to version 1.04
+
+=over
+
+=item *
+
+C<PerlIO::via> iterate over layers properly now
+
+=item *
+
+C<PerlIO::scalar> understands C<< $/ = "" >> now
+
+=item *
+
+C<encoding(utf-8-strict)> with partial characters now works
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Pod::Functions> upgraded to version 1.03
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<Pod::Html> upgraded to version 1.0504
+
+=over
+
+=item *
+
+HTML output will now correctly link
+to C<=item>s on the same page, and should be valid XHTML.
+
+=item *
+
+Variable names are recognized as intended
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<Pod::Parser> upgraded to version 1.32
+
+=over
+
+=item *
+
+Allow files that start with C<=head> on the first line
+
+=item *
+
+Win32 portability fix
+
+=item *
+
+Exit status of C<pod2usage> fixed
+
+=item *
+
+New C<-noperldoc> switch for C<pod2usage>
+
+=item *
+
+Arbitrary URL schemes now allowed
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<POSIX> upgraded to version 1.09
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<re> upgraded to version 0.05
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=back
+
+=item *
+
+C<Safe> upgraded to version 2.12
+
+=over
+
+=item *
+
+Minor documentation enhancement
+
+=back
+
+=item *
+
+C<SDBM_File> upgraded to version 1.05
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Socket> upgraded to version 1.78
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Storable> upgraded to version 2.15
+
+=over
+
+=item *
+
+This includes the C<STORABLE_attach> hook functionality added by
+Adam Kennedy, and more frugal memory requirements when storing under C<ithreads>, by
+using the C<ithreads> cloning tracking code.
+
+=back
+
+=item *
+
+C<Switch> upgraded to version 2.10_01
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<Sys::Syslog> upgraded to version 0.13
+
+=over
+
+=item *
+
+Now provides numeric macros and meaningful C<Exporter> tags.
+
+=item *
+
+No longer uses C<Sys::Hostname> as it may provide useless values in
+unconfigured network environments, so instead uses C<INADDR_LOOPBACK> directly.
+
+=item *
+
+C<syslog()> now uses local timestamp.
+
+=item *
+
+C<setlogmask()> now behaves like its C counterpart.
+
+=item *
+
+C<setlogsock()> will now C<croak()> as documented.
+
+=item *
+
+Improved error and warnings messages.
+
+=item *
+
+Improved documentation.
+
+=back
+
+=item *
+
+C<Term::ANSIColor> upgraded to version 1.10
+
+=over
+
+=item *
+
+Fixes a bug in C<colored> when C<$EACHLINE> is set that caused it to not color
+lines consisting solely of 0 (literal zero).
+
+=item *
+
+Improved tests.
+
+=back
+
+=item *
+
+C<Term::ReadLine> upgraded to version 1.02
+
+=over
+
+=item *
+
+Documentation tweaks
+
+=back
+
+=item *
+
+C<Test::Harness> upgraded to version 2.56 (was 2.48)
+
+=over
+
+=item *
+
+The C<Test::Harness> timer is now off by default.
+
+=item *
+
+Now shows elapsed time in milliseconds.
+
+=item *
+
+Various bug fixes
+
+=back
+
+=item *
+
+C<Test::Simple> upgraded to version 0.62 (was 0.54)
+
+=over
+
+=item *
+
+C<is_deeply()> no longer fails to work for many cases
+
+=item *
+
+Various minor bug fixes
+
+=item *
+
+Documentation enhancements
+
+=back
+
+=item *
+
+C<Text::Tabs> upgraded to version 2005.0824
+
+=over
+
+=item *
+
+Provides a faster implementation of C<expand>
+
+=back
+
+=item *
+
+C<Text::Wrap> upgraded to version 2005.082401
+
+=over
+
+=item *
+
+Adds C<$Text::Wrap::separator2>, which allows you to preserve existing newlines
+but add line-breaks with some other string.
+
+=back
+
+=item *
+
+C<threads> upgraded to version 1.07
+
+=over
+
+=item *
+
+C<threads> will now honour C<no warnings 'threads'>
+
+=item *
+
+A thread's interpreter is now freed after C<< $t->join() >> rather than after
+C<undef $t>, which should fix some C<ithreads> memory leaks. (Fixed by Dave
+Mitchell)
+
+=item *
+
+Some documentation typo fixes.
+
+=back
+
+=item *
+
+C<threads::shared> upgraded to version 0.94
+
+=over
+
+=item *
+
+Documentation changes only
+
+=item *
+
+Note: An improved implementation of C<threads::shared> is available on
+CPAN - this will be merged into 5.8.9 if it proves stable.
+
+=back
+
+=item *
+
+C<Tie::Hash> upgraded to version 1.02
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=back
+
+=item *
+
+C<Time::HiRes> upgraded to version 1.86 (was 1.66)
+
+=over
+
+=item *
+
+C<clock_nanosleep()> and C<clock()> functions added
+
+=item *
+
+Support for the POSIX C<clock_gettime()> and C<clock_getres()> has been added
+
+=item *
+
+Return C<undef> or an empty list if the C C<gettimeofday()> function fails
+
+=item *
+
+Improved C<nanosleep> detection
+
+=item *
+
+Internal cleanup
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<Unicode::Collate> upgraded to version 0.52
+
+=over
+
+=item *
+
+Now implements UCA Revision 14 (based on Unicode 4.1.0).
+
+=item *
+
+C<Unicode::Collate->new> method no longer overwrites user's C<$_>
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<Unicode::UCD> upgraded to version 0.24
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<User::grent> upgraded to version 1.01
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=back
+
+=item *
+
+C<utf8> upgraded to version 1.06
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<vmsish> upgraded to version 1.02
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<warnings> upgraded to version 1.05
+
+=over
+
+=item *
+
+Gentler messing with C<Carp::> internals
+
+=item *
+
+Internal cleanup
+
+=item *
+
+Documentation update
+
+=back
+
+=item *
+
+C<Win32> upgraded to version 0.2601
+
+=for cynics And how many perl 5.8.x versions can I release ahead of Vista?
+
+=over
+
+=item *
+
+Provides Windows Vista support to C<Win32::GetOSName>
+
+=item *
+
+Documentation enhancements
+
+=back
+
+=item *
+
+C<XS::Typemap> upgraded to version 0.02
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=back
+
+=head1 Utility Changes
+
+=head2 C<h2xs> enhancements
+
+C<h2xs> implements new option C<--use-xsloader> to force use of
+C<XSLoader> even in backwards compatible modules.
+
+The handling of authors' names that had apostrophes has been fixed.
+
+Any enums with negative values are now skipped.
+
+=head2 C<perlivp> enhancements
+
+C<perlivp> implements new option C<-a> and will not check for F<*.ph>
+files by default any more.  Use the C<-a> option to run I<all> tests.
+
+=head1 New Documentation
+
+The L<perlglossary> manpage is a glossary of terms used in the Perl
+documentation, technical and otherwise, kindly provided by O'Reilly Media,
+inc.
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+Weak reference creation is now I<O(1)> rather than I<O(n)>, courtesy of
+Nicholas Clark. Weak reference deletion remains I<O(n)>, but if deletion only
+happens at program exit, it may be skipped completely.
+
+=item *
+
+Salvador Fandiño provided improvements to reduce the memory usage of C<sort>
+and to speed up some cases.
+
+=item *
+
+Jarkko Hietaniemi and Andy Lester worked to mark as much data as possible in
+the C source files as C<static>, to increase the proportion of the executable
+file that the operating system can share between process, and thus reduce
+real memory usage on multi-user systems.
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+Parallel makes should work properly now, although there may still be problems
+if C<make test> is instructed to run in parallel.
+
+Building with Borland's compilers on Win32 should work more smoothly. In
+particular Steve Hay has worked to side step many warnings emitted by their
+compilers and at least one C compiler internal error.
+
+C<Configure> will now detect C<clearenv> and C<unsetenv>, thanks to a patch
+from Alan Burlison. It will also probe for C<futimes> and whether C<sprintf>
+correctly returns the length of the formatted string, which will both be used
+in perl 5.8.9.
+
+There are improved hints for next-3.0, vmesa, IX, Darwin, Solaris, Linux,
+DEC/OSF, HP-UX and MPE/iX
+
+Perl extensions on Windows now can be statically built into the Perl DLL,
+thanks to a work by Vadim Konovalov. (This improvement was actually in 5.8.7,
+but was accidentally omitted from L<perl587delta>).
+
+=head1 Selected Bug Fixes
+
+=head2 no warnings 'category' works correctly with -w
+
+Previously when running with warnings enabled globally via C<-w>, selective
+disabling of specific warning categories would actually turn off all warnings.
+This is now fixed; now C<no warnings 'io';> will only turn off warnings in the
+C<io> class. Previously it would erroneously turn off all warnings.
+
+This bug fix may cause some programs to start correctly issuing warnings.
+
+=head2 Remove over-optimisation
+
+Perl 5.8.4 introduced a change so that assignments of C<undef> to a
+scalar, or of an empty list to an array or a hash, were optimised away. As
+this could cause problems when C<goto> jumps were involved, this change
+has been backed out.
+
+=head2 sprintf() fixes
+
+Using the sprintf() function with some formats could lead to a buffer
+overflow in some specific cases. This has been fixed, along with several
+other bugs, notably in bounds checking.
+
+In related fixes, it was possible for badly written code that did not follow
+the documentation of C<Sys::Syslog> to have formatting vulnerabilities.
+C<Sys::Syslog> has been changed to protect people from poor quality third
+party code.
+
+=head2 Debugger and Unicode slowdown
+
+It had been reported that running under perl's debugger when processing
+Unicode data could cause unexpectedly large slowdowns. The most likely cause
+of this was identified and fixed by Nicholas Clark.
+
+=head2 Smaller fixes
+
+=over 4
+
+=item *
+
+C<FindBin> now works better with directories where access rights are more
+restrictive than usual.
+
+=item *
+
+Several memory leaks in ithreads were closed. An improved implementation of
+C<threads::shared> is available on CPAN - this will be merged into 5.8.9 if
+it proves stable.
+
+=item *
+
+Trailing spaces are now trimmed from C<$!> and C<$^E>.
+
+=item *
+
+Operations that require perl to read a process' list of groups, such as reads
+of C<$(> and C<$)>, now dynamically allocate memory rather than using a
+fixed sized array. The fixed size array could cause C stack exhaustion on
+systems configured to use large numbers of groups.
+
+=item *
+
+C<PerlIO::scalar> now works better with non-default C<$/> settings.
+
+=item *
+
+You can now use the C<x> operator to repeat a C<qw//> list. This used
+to raise a syntax error.
+
+=item *
+
+The debugger now traces correctly execution in eval("")uated code that
+contains #line directives.
+
+=item *
+
+The value of the C<open> pragma is no longer ignored for three-argument
+opens.
+
+=item *
+
+The optimisation of C<for (reverse @a)> introduced in perl 5.8.6 could
+misbehave when the array had undefined elements and was used in LVALUE
+context. Dave Mitchell provided a fix.
+
+=item *
+
+Some case insensitive matches between UTF-8 encoded data and 8 bit regexps,
+and vice versa, could give malformed character warnings. These have been
+fixed by Dave Mitchell and Yves Orton.
+
+=item *
+
+C<lcfirst> and C<ucfirst> could corrupt the string for certain cases where
+the length UTF-8 encoding of the string in lower case, upper case or title
+case differed. This was fixed by Nicholas Clark.
+
+=item *
+
+Perl will now use the C library calls C<unsetenv> and C<clearenv> if present
+to delete keys from C<%ENV> and delete C<%ENV> entirely, thanks to a patch
+from Alan Burlison.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=head2 Attempt to set length of freed array
+
+This is a new warning, produced in situations such as this:
+
+    $r = do {my @a; \$#a};
+    $$r = 503;
+
+=head2 Non-string passed as bitmask
+
+This is a new warning, produced when number has been passed as a argument to
+select(), instead of a bitmask.
+
+    # Wrong, will now warn
+    $rin = fileno(STDIN);
+    ($nfound,$timeleft) = select($rout=$rin, undef, undef, $timeout);
+    
+    # Should be
+    $rin = '';
+    vec($rin,fileno(STDIN),1) = 1;
+    ($nfound,$timeleft) = select($rout=$rin, undef, undef, $timeout);
+
+=head2 Search pattern not terminated or ternary operator parsed as search pattern
+
+This syntax error indicates that the lexer couldn't find the final
+delimiter of a C<?PATTERN?> construct. Mentioning the ternary operator in
+this error message makes it easier to diagnose syntax errors.
+
+=head1 Changed Internals
+
+There has been a fair amount of refactoring of the C<C> source code, partly to
+make it tidier and more maintainable. The resulting object code and the
+C<perl> binary may well be smaller than 5.8.7, in particular due to a change
+contributed by Dave Mitchell which reworked the warnings code to be
+significantly smaller. Apart from being smaller and possibly faster, there
+should be no user-detectable changes.
+
+Andy Lester supplied many improvements to determine which function
+parameters and local variables could actually be declared C<const> to the C
+compiler. Steve Peters provided new C<*_set> macros and reworked the core to
+use these rather than assigning to macros in LVALUE context.
+
+Dave Mitchell improved the lexer debugging output under C<-DT>
+
+Nicholas Clark changed the string buffer allocation so that it is now rounded
+up to the next multiple of 4 (or 8 on platforms with 64 bit pointers). This
+should reduce the number of calls to C<realloc> without actually using any
+extra memory.
+
+The C<HV>'s array of C<HE*>s is now allocated at the correct (minimal) size,
+thanks to another change by Nicholas Clark. Compile with
+C<-DPERL_USE_LARGE_HV_ALLOC> to use the old, sloppier, default.
+
+For XS or embedding debugging purposes, if perl is compiled with
+C<-DDEBUG_LEAKING_SCALARS_FORK_DUMP> in addition to
+C<-DDEBUG_LEAKING_SCALARS> then a child process is C<fork>ed just before
+global destruction, which is used to display the values of any scalars
+found to have leaked at the end of global destruction. Without this, the
+scalars have already been freed sufficiently at the point of detection that
+it is impossible to produce any meaningful dump of their contents.  This
+feature was implemented by the indefatigable Nicholas Clark, based on an idea
+by Mike Giroux.
+
+=head1 Platform Specific Problems
+
+The optimiser on HP-UX 11.23 (Itanium 2) is currently partly disabled (scaled
+down to +O1) when using HP C-ANSI-C; the cause of problems at higher
+optimisation levels is still unclear.
+
+There are a handful of remaining test failures on VMS, mostly due to
+test fixes and minor module tweaks with too many dependencies to
+integrate into this release from the development stream, where they have
+all been corrected.  The following is a list of expected failures with
+the patch number of the fix where that is known:
+
+    ext/Devel/PPPort/t/ppphtest.t  #26913
+    ext/List/Util/t/p_tainted.t    #26912
+    lib/ExtUtils/t/PL_FILES.t      #26813
+    lib/ExtUtils/t/basic.t         #26813
+    t/io/fs.t
+    t/op/cmp.t
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org.  There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.  You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perl58delta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perl58delta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perl58delta.pod	(revision 14489)
@@ -0,0 +1,3746 @@
+=head1 NAME
+
+perl58delta - what is new for perl v5.8.0
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.6.0 release and
+the 5.8.0 release.
+
+Many of the bug fixes in 5.8.0 were already seen in the 5.6.1
+maintenance release since the two releases were kept closely
+coordinated (while 5.8.0 was still called 5.7.something).
+
+Changes that were integrated into the 5.6.1 release are marked C<[561]>.
+Many of these changes have been further developed since 5.6.1 was released,
+those are marked C<[561+]>.
+
+You can see the list of changes in the 5.6.1 release (both from the
+5.005_03 release and the 5.6.0 release) by reading L<perl561delta>.
+
+=head1 Highlights In 5.8.0
+
+=over 4
+
+=item *
+
+Better Unicode support
+
+=item *
+
+New IO Implementation
+
+=item *
+
+New Thread Implementation
+
+=item *
+
+Better Numeric Accuracy
+
+=item *
+
+Safe Signals
+
+=item *
+
+Many New Modules
+
+=item *
+
+More Extensive Regression Testing
+
+=back
+
+=head1 Incompatible Changes
+
+=head2 Binary Incompatibility
+
+B<Perl 5.8 is not binary compatible with earlier releases of Perl.>
+
+B<You have to recompile your XS modules.>
+
+(Pure Perl modules should continue to work.)
+
+The major reason for the discontinuity is the new IO architecture
+called PerlIO.  PerlIO is the default configuration because without
+it many new features of Perl 5.8 cannot be used.  In other words:
+you just have to recompile your modules containing XS code, sorry
+about that.
+
+In future releases of Perl, non-PerlIO aware XS modules may become
+completely unsupported.  This shouldn't be too difficult for module
+authors, however: PerlIO has been designed as a drop-in replacement
+(at the source code level) for the stdio interface.
+
+Depending on your platform, there are also other reasons why
+we decided to break binary compatibility, please read on.
+
+=head2 64-bit platforms and malloc
+
+If your pointers are 64 bits wide, the Perl malloc is no longer being
+used because it does not work well with 8-byte pointers.  Also,
+usually the system mallocs on such platforms are much better optimized
+for such large memory models than the Perl malloc.  Some memory-hungry
+Perl applications like the PDL don't work well with Perl's malloc.
+Finally, other applications than Perl (such as mod_perl) tend to prefer
+the system malloc.  Such platforms include Alpha and 64-bit HPPA,
+MIPS, PPC, and Sparc.
+
+=head2 AIX Dynaloading
+
+The AIX dynaloading now uses in AIX releases 4.3 and newer the native
+dlopen interface of AIX instead of the old emulated interface.  This
+change will probably break backward compatibility with compiled
+modules.  The change was made to make Perl more compliant with other
+applications like mod_perl which are using the AIX native interface.
+
+=head2 Attributes for C<my> variables now handled at run-time
+
+The C<my EXPR : ATTRS> syntax now applies variable attributes at
+run-time.  (Subroutine and C<our> variables still get attributes applied
+at compile-time.)  See L<attributes> for additional details.  In particular,
+however, this allows variable attributes to be useful for C<tie> interfaces,
+which was a deficiency of earlier releases.  Note that the new semantics
+doesn't work with the Attribute::Handlers module (as of version 0.76).
+
+=head2 Socket Extension Dynamic in VMS
+
+The Socket extension is now dynamically loaded instead of being
+statically built in.  This may or may not be a problem with ancient
+TCP/IP stacks of VMS: we do not know since we weren't able to test
+Perl in such configurations.
+
+=head2 IEEE-format Floating Point Default on OpenVMS Alpha
+
+Perl now uses IEEE format (T_FLOAT) as the default internal floating
+point format on OpenVMS Alpha, potentially breaking binary compatibility
+with external libraries or existing data.  G_FLOAT is still available as
+a configuration option.  The default on VAX (D_FLOAT) has not changed.
+
+=head2 New Unicode Semantics (no more C<use utf8>, almost)
+
+Previously in Perl 5.6 to use Unicode one would say "use utf8" and
+then the operations (like string concatenation) were Unicode-aware
+in that lexical scope.
+
+This was found to be an inconvenient interface, and in Perl 5.8 the
+Unicode model has completely changed: now the "Unicodeness" is bound
+to the data itself, and for most of the time "use utf8" is not needed
+at all.  The only remaining use of "use utf8" is when the Perl script
+itself has been written in the UTF-8 encoding of Unicode.  (UTF-8 has
+not been made the default since there are many Perl scripts out there
+that are using various national eight-bit character sets, which would
+be illegal in UTF-8.)
+
+See L<perluniintro> for the explanation of the current model,
+and L<utf8> for the current use of the utf8 pragma.
+
+=head2 New Unicode Properties
+
+Unicode I<scripts> are now supported. Scripts are similar to (and superior
+to) Unicode I<blocks>. The difference between scripts and blocks is that
+scripts are the glyphs used by a language or a group of languages, while
+the blocks are more artificial groupings of (mostly) 256 characters based
+on the Unicode numbering.
+
+In general, scripts are more inclusive, but not universally so. For
+example, while the script C<Latin> includes all the Latin characters and
+their various diacritic-adorned versions, it does not include the various
+punctuation or digits (since they are not solely C<Latin>).
+
+A number of other properties are now supported, including C<\p{L&}>,
+C<\p{Any}> C<\p{Assigned}>, C<\p{Unassigned}>, C<\p{Blank}> [561] and
+C<\p{SpacePerl}> [561] (along with their C<\P{...}> versions, of course).
+See L<perlunicode> for details, and more additions.
+
+The C<In> or C<Is> prefix to names used with the C<\p{...}> and C<\P{...}>
+are now almost always optional. The only exception is that a C<In> prefix
+is required to signify a Unicode block when a block name conflicts with a
+script name. For example, C<\p{Tibetan}> refers to the script, while
+C<\p{InTibetan}> refers to the block. When there is no name conflict, you
+can omit the C<In> from the block name (e.g. C<\p{BraillePatterns}>), but
+to be safe, it's probably best to always use the C<In>).
+
+=head2 REF(...) Instead Of SCALAR(...)
+
+A reference to a reference now stringifies as "REF(0x81485ec)" instead
+of "SCALAR(0x81485ec)" in order to be more consistent with the return
+value of ref().
+
+=head2 pack/unpack D/F recycled
+
+The undocumented pack/unpack template letters D/F have been recycled
+for better use: now they stand for long double (if supported by the
+platform) and NV (Perl internal floating point type).  (They used
+to be aliases for d/f, but you never knew that.)
+
+=head2 glob() now returns filenames in alphabetical order
+
+The list of filenames from glob() (or <...>) is now by default sorted
+alphabetically to be csh-compliant (which is what happened before
+in most UNIX platforms).  (bsd_glob() does still sort platform
+natively, ASCII or EBCDIC, unless GLOB_ALPHASORT is specified.) [561]
+
+=head2 Deprecations
+
+=over 4
+
+=item *
+
+The semantics of bless(REF, REF) were unclear and until someone proves
+it to make some sense, it is forbidden.
+
+=item *
+
+The obsolete chat2 library that should never have been allowed
+to escape the laboratory has been decommissioned.
+
+=item *
+
+Using chdir("") or chdir(undef) instead of explicit chdir() is
+doubtful.  A failure (think chdir(some_function()) can lead into
+unintended chdir() to the home directory, therefore this behaviour
+is deprecated.
+
+=item *
+
+The builtin dump() function has probably outlived most of its
+usefulness.  The core-dumping functionality will remain in future
+available as an explicit call to C<CORE::dump()>, but in future
+releases the behaviour of an unqualified C<dump()> call may change.
+
+=item *
+
+The very dusty examples in the eg/ directory have been removed.
+Suggestions for new shiny examples welcome but the main issue is that
+the examples need to be documented, tested and (most importantly)
+maintained.
+
+=item *
+
+The (bogus) escape sequences \8 and \9 now give an optional warning
+("Unrecognized escape passed through").  There is no need to \-escape
+any C<\w> character.
+
+=item *
+
+The *glob{FILEHANDLE} is deprecated, use *glob{IO} instead.
+
+=item *
+
+The C<package;> syntax (C<package> without an argument) has been
+deprecated.  Its semantics were never that clear and its
+implementation even less so.  If you have used that feature to
+disallow all but fully qualified variables, C<use strict;> instead.
+
+=item *
+
+The unimplemented POSIX regex features [[.cc.]] and [[=c=]] are still
+recognised but now cause fatal errors.  The previous behaviour of
+ignoring them by default and warning if requested was unacceptable
+since it, in a way, falsely promised that the features could be used.
+
+=item *
+
+In future releases, non-PerlIO aware XS modules may become completely
+unsupported.  Since PerlIO is a drop-in replacement for stdio at the
+source code level, this shouldn't be that drastic a change.
+
+=item *
+
+Previous versions of perl and some readings of some sections of Camel
+III implied that the C<:raw> "discipline" was the inverse of C<:crlf>.
+Turning off "clrfness" is no longer enough to make a stream truly
+binary. So the PerlIO C<:raw> layer (or "discipline", to use the Camel
+book's older terminology) is now formally defined as being equivalent
+to binmode(FH) - which is in turn defined as doing whatever is
+necessary to pass each byte as-is without any translation.  In
+particular binmode(FH) - and hence C<:raw> - will now turn off both
+CRLF and UTF-8 translation and remove other layers (e.g. :encoding())
+which would modify byte stream.
+
+=item *
+
+The current user-visible implementation of pseudo-hashes (the weird
+use of the first array element) is deprecated starting from Perl 5.8.0
+and will be removed in Perl 5.10.0, and the feature will be
+implemented differently.  Not only is the current interface rather
+ugly, but the current implementation slows down normal array and hash
+use quite noticeably. The C<fields> pragma interface will remain
+available.  The I<restricted hashes> interface is expected to
+be the replacement interface (see L<Hash::Util>).  If your existing
+programs depends on the underlying implementation, consider using
+L<Class::PseudoHash> from CPAN.
+
+=item *
+
+The syntaxes C<< @a->[...] >> and  C<< %h->{...} >> have now been deprecated.
+
+=item *
+
+After years of trying, suidperl is considered to be too complex to
+ever be considered truly secure.  The suidperl functionality is likely
+to be removed in a future release.
+
+=item *
+
+The 5.005 threads model (module C<Thread>) is deprecated and expected
+to be removed in Perl 5.10.  Multithreaded code should be migrated to
+the new ithreads model (see L<threads>, L<threads::shared> and
+L<perlthrtut>).
+
+=item *
+
+The long deprecated uppercase aliases for the string comparison
+operators (EQ, NE, LT, LE, GE, GT) have now been removed.
+
+=item *
+
+The tr///C and tr///U features have been removed and will not return;
+the interface was a mistake.  Sorry about that.  For similar
+functionality, see pack('U0', ...) and pack('C0', ...). [561]
+
+=item *
+
+Earlier Perls treated "sub foo (@bar)" as equivalent to "sub foo (@)".
+The prototypes are now checked better at compile-time for invalid
+syntax.  An optional warning is generated ("Illegal character in
+prototype...")  but this may be upgraded to a fatal error in a future
+release.
+
+=item *
+
+The C<exec LIST> and C<system LIST> operations now produce warnings on
+tainted data and in some future release they will produce fatal errors.
+
+=item *
+
+The existing behaviour when localising tied arrays and hashes is wrong,
+and will be changed in a future release, so do not rely on the existing
+behaviour. See L<"Localising Tied Arrays and Hashes Is Broken">.
+
+=back
+
+=head1 Core Enhancements
+
+=head2 Unicode Overhaul
+
+Unicode in general should be now much more usable than in Perl 5.6.0
+(or even in 5.6.1).  Unicode can be used in hash keys, Unicode in
+regular expressions should work now, Unicode in tr/// should work now,
+Unicode in I/O should work now.  See L<perluniintro> for introduction
+and L<perlunicode> for details.
+
+=over 4
+
+=item *
+
+The Unicode Character Database coming with Perl has been upgraded
+to Unicode 3.2.0.  For more information, see http://www.unicode.org/ .
+[561+] (5.6.1 has UCD 3.0.1.)
+
+=item *
+
+For developers interested in enhancing Perl's Unicode capabilities:
+almost all the UCD files are included with the Perl distribution in
+the F<lib/unicore> subdirectory.  The most notable omission, for space
+considerations, is the Unihan database.
+
+=item *
+
+The properties \p{Blank} and \p{SpacePerl} have been added. "Blank" is like
+C isblank(), that is, it contains only "horizontal whitespace" (the space
+character is, the newline isn't), and the "SpacePerl" is the Unicode
+equivalent of C<\s> (\p{Space} isn't, since that includes the vertical
+tabulator character, whereas C<\s> doesn't.)
+
+See "New Unicode Properties" earlier in this document for additional
+information on changes with Unicode properties.
+
+=back
+
+=head2 PerlIO is Now The Default
+
+=over 4
+
+=item *
+
+IO is now by default done via PerlIO rather than system's "stdio".
+PerlIO allows "layers" to be "pushed" onto a file handle to alter the
+handle's behaviour.  Layers can be specified at open time via 3-arg
+form of open:
+
+   open($fh,'>:crlf :utf8', $path) || ...
+
+or on already opened handles via extended C<binmode>:
+
+   binmode($fh,':encoding(iso-8859-7)');
+
+The built-in layers are: unix (low level read/write), stdio (as in
+previous Perls), perlio (re-implementation of stdio buffering in a
+portable manner), crlf (does CRLF <=> "\n" translation as on Win32,
+but available on any platform).  A mmap layer may be available if
+platform supports it (mostly UNIXes).
+
+Layers to be applied by default may be specified via the 'open' pragma.
+
+See L</"Installation and Configuration Improvements"> for the effects
+of PerlIO on your architecture name.
+
+=item *
+
+If your platform supports fork(), you can use the list form of C<open>
+for pipes.  For example:
+
+    open KID_PS, "-|", "ps", "aux" or die $!;
+
+forks the ps(1) command (without spawning a shell, as there are more
+than three arguments to open()), and reads its standard output via the
+C<KID_PS> filehandle.  See L<perlipc>.
+
+=item *
+
+File handles can be marked as accepting Perl's internal encoding of Unicode
+(UTF-8 or UTF-EBCDIC depending on platform) by a pseudo layer ":utf8" :
+
+   open($fh,">:utf8","Uni.txt");
+
+Note for EBCDIC users: the pseudo layer ":utf8" is erroneously named
+for you since it's not UTF-8 what you will be getting but instead
+UTF-EBCDIC.  See L<perlunicode>, L<utf8>, and
+http://www.unicode.org/unicode/reports/tr16/ for more information.
+In future releases this naming may change.  See L<perluniintro>
+for more information about UTF-8.
+
+=item *
+
+If your environment variables (LC_ALL, LC_CTYPE, LANG) look like you
+want to use UTF-8 (any of the variables match C</utf-?8/i>), your
+STDIN, STDOUT, STDERR handles and the default open layer (see L<open>)
+are marked as UTF-8.  (This feature, like other new features that
+combine Unicode and I/O, work only if you are using PerlIO, but that's
+the default.)
+
+Note that after this Perl really does assume that everything is UTF-8:
+for example if some input handle is not, Perl will probably very soon
+complain about the input data like this "Malformed UTF-8 ..." since
+any old eight-bit data is not legal UTF-8.
+
+Note for code authors: if you want to enable your users to use UTF-8
+as their default encoding  but in your code still have eight-bit I/O streams
+(such as images or zip files), you need to explicitly open() or binmode()
+with C<:bytes> (see L<perlfunc/open> and L<perlfunc/binmode>), or you
+can just use C<binmode(FH)> (nice for pre-5.8.0 backward compatibility).
+
+=item *
+
+File handles can translate character encodings from/to Perl's internal
+Unicode form on read/write via the ":encoding()" layer.
+
+=item *
+
+File handles can be opened to "in memory" files held in Perl scalars via:
+
+   open($fh,'>', \$variable) || ...
+
+=item *
+
+Anonymous temporary files are available without need to
+'use FileHandle' or other module via
+
+   open($fh,"+>", undef) || ...
+
+That is a literal undef, not an undefined value.
+
+=back
+
+=head2 ithreads
+
+The new interpreter threads ("ithreads" for short) implementation of
+multithreading, by Arthur Bergman, replaces the old "5.005 threads"
+implementation.  In the ithreads model any data sharing between
+threads must be explicit, as opposed to the model where data sharing
+was implicit.  See L<threads> and L<threads::shared>, and
+L<perlthrtut>.
+
+As a part of the ithreads implementation Perl will also use
+any necessary and detectable reentrant libc interfaces.
+
+=head2 Restricted Hashes
+
+A restricted hash is restricted to a certain set of keys, no keys
+outside the set can be added.  Also individual keys can be restricted
+so that the key cannot be deleted and the value cannot be changed.
+No new syntax is involved: the Hash::Util module is the interface.
+
+=head2 Safe Signals
+
+Perl used to be fragile in that signals arriving at inopportune moments
+could corrupt Perl's internal state.  Now Perl postpones handling of
+signals until it's safe (between opcodes).
+
+This change may have surprising side effects because signals no longer
+interrupt Perl instantly.  Perl will now first finish whatever it was
+doing, like finishing an internal operation (like sort()) or an
+external operation (like an I/O operation), and only then look at any
+arrived signals (and before starting the next operation).  No more corrupt
+internal state since the current operation is always finished first,
+but the signal may take more time to get heard.  Note that breaking
+out from potentially blocking operations should still work, though.
+
+=head2 Understanding of Numbers
+
+In general a lot of fixing has happened in the area of Perl's
+understanding of numbers, both integer and floating point.  Since in
+many systems the standard number parsing functions like C<strtoul()>
+and C<atof()> seem to have bugs, Perl tries to work around their
+deficiencies.  This results hopefully in more accurate numbers.
+
+Perl now tries internally to use integer values in numeric conversions
+and basic arithmetics (+ - * /) if the arguments are integers, and
+tries also to keep the results stored internally as integers.
+This change leads to often slightly faster and always less lossy
+arithmetics. (Previously Perl always preferred floating point numbers
+in its math.)
+
+=head2 Arrays now always interpolate into double-quoted strings [561]
+
+In double-quoted strings, arrays now interpolate, no matter what.  The
+behavior in earlier versions of perl 5 was that arrays would interpolate
+into strings if the array had been mentioned before the string was
+compiled, and otherwise Perl would raise a fatal compile-time error.
+In versions 5.000 through 5.003, the error was
+
+        Literal @example now requires backslash
+
+In versions 5.004_01 through 5.6.0, the error was
+
+        In string, @example now must be written as \@example
+
+The idea here was to get people into the habit of writing
+C<"fred\@example.com"> when they wanted a literal C<@> sign, just as
+they have always written C<"Give me back my \$5"> when they wanted a
+literal C<$> sign.
+
+Starting with 5.6.1, when Perl now sees an C<@> sign in a
+double-quoted string, it I<always> attempts to interpolate an array,
+regardless of whether or not the array has been used or declared
+already.  The fatal error has been downgraded to an optional warning:
+
+        Possible unintended interpolation of @example in string
+
+This warns you that C<"fred@example.com"> is going to turn into
+C<fred.com> if you don't backslash the C<@>.
+See http://www.plover.com/~mjd/perl/at-error.html for more details
+about the history here.
+
+=head2 Miscellaneous Changes
+
+=over 4
+
+=item *
+
+AUTOLOAD is now lvaluable, meaning that you can add the :lvalue attribute
+to AUTOLOAD subroutines and you can assign to the AUTOLOAD return value.
+
+=item *
+
+The $Config{byteorder} (and corresponding BYTEORDER in config.h) was
+previously wrong in platforms if sizeof(long) was 4, but sizeof(IV)
+was 8.  The byteorder was only sizeof(long) bytes long (1234 or 4321),
+but now it is correctly sizeof(IV) bytes long, (12345678 or 87654321).
+(This problem didn't affect Windows platforms.)
+
+Also, $Config{byteorder} is now computed dynamically--this is more
+robust with "fat binaries" where an executable image contains binaries
+for more than one binary platform, and when cross-compiling.
+
+=item *
+
+C<perl -d:Module=arg,arg,arg> now works (previously one couldn't pass
+in multiple arguments.)
+
+=item *
+
+C<do> followed by a bareword now ensures that this bareword isn't
+a keyword (to avoid a bug where C<do q(foo.pl)> tried to call a
+subroutine called C<q>).  This means that for example instead of
+C<do format()> you must write C<do &format()>.
+
+=item *
+
+The builtin dump() now gives an optional warning
+C<dump() better written as CORE::dump()>,
+meaning that by default C<dump(...)> is resolved as the builtin
+dump() which dumps core and aborts, not as (possibly) user-defined
+C<sub dump>.  To call the latter, qualify the call as C<&dump(...)>.
+(The whole dump() feature is to considered deprecated, and possibly
+removed/changed in future releases.)
+
+=item *
+
+chomp() and chop() are now overridable.  Note, however, that their
+prototype (as given by C<prototype("CORE::chomp")> is undefined,
+because it cannot be expressed and therefore one cannot really write
+replacements to override these builtins.
+
+=item *
+
+END blocks are now run even if you exit/die in a BEGIN block.
+Internally, the execution of END blocks is now controlled by
+PL_exit_flags & PERL_EXIT_DESTRUCT_END. This enables the new
+behaviour for Perl embedders. This will default in 5.10. See
+L<perlembed>.
+
+=item *
+
+Formats now support zero-padded decimal fields.
+
+=item *
+
+Although "you shouldn't do that", it was possible to write code that
+depends on Perl's hashed key order (Data::Dumper does this).  The new
+algorithm "One-at-a-Time" produces a different hashed key order.
+More details are in L</"Performance Enhancements">.
+
+=item *
+
+lstat(FILEHANDLE) now gives a warning because the operation makes no sense.
+In future releases this may become a fatal error.
+
+=item *
+
+Spurious syntax errors generated in certain situations, when glob()
+caused File::Glob to be loaded for the first time, have been fixed. [561]
+
+=item *
+
+Lvalue subroutines can now return C<undef> in list context.  However,
+the lvalue subroutine feature still remains experimental.  [561+]
+
+=item *
+
+A lost warning "Can't declare ... dereference in my" has been
+restored (Perl had it earlier but it became lost in later releases.)
+
+=item *
+
+A new special regular expression variable has been introduced:
+C<$^N>, which contains the most-recently closed group (submatch).
+
+=item *
+
+C<no Module;> does not produce an error even if Module does not have an
+unimport() method.  This parallels the behavior of C<use> vis-a-vis
+C<import>. [561]
+
+=item *
+
+The numerical comparison operators return C<undef> if either operand
+is a NaN.  Previously the behaviour was unspecified.
+
+=item *
+
+C<our> can now have an experimental optional attribute C<unique> that
+affects how global variables are shared among multiple interpreters,
+see L<perlfunc/our>.
+
+=item *
+
+The following builtin functions are now overridable: each(), keys(),
+pop(), push(), shift(), splice(), unshift(). [561]
+
+=item *
+
+C<pack() / unpack()> can now group template letters with C<()> and then
+apply repetition/count modifiers on the groups.
+
+=item *
+
+C<pack() / unpack()> can now process the Perl internal numeric types:
+IVs, UVs, NVs-- and also long doubles, if supported by the platform.
+The template letters are C<j>, C<J>, C<F>, and C<D>.
+
+=item *
+
+C<pack('U0a*', ...)> can now be used to force a string to UTF-8.
+
+=item *
+
+my __PACKAGE__ $obj now works. [561]
+
+=item *
+
+POSIX::sleep() now returns the number of I<unslept> seconds
+(as the POSIX standard says), as opposed to CORE::sleep() which
+returns the number of slept seconds.
+
+=item *
+
+printf() and sprintf() now support parameter reordering using the
+C<%\d+\$> and C<*\d+\$> syntaxes.  For example
+
+    printf "%2\$s %1\$s\n", "foo", "bar";
+
+will print "bar foo\n".  This feature helps in writing
+internationalised software, and in general when the order
+of the parameters can vary.
+
+=item *
+
+The (\&) prototype now works properly. [561]
+
+=item *
+
+prototype(\[$@%&]) is now available to implicitly create references
+(useful for example if you want to emulate the tie() interface).
+
+=item *
+
+A new command-line option, C<-t> is available.  It is the
+little brother of C<-T>: instead of dying on taint violations,
+lexical warnings are given.  B<This is only meant as a temporary
+debugging aid while securing the code of old legacy applications.
+This is not a substitute for -T.>
+
+=item *
+
+In other taint news, the C<exec LIST> and C<system LIST> have now been
+considered too risky (think C<exec @ARGV>: it can start any program
+with any arguments), and now the said forms cause a warning under
+lexical warnings.  You should carefully launder the arguments to
+guarantee their validity.  In future releases of Perl the forms will
+become fatal errors so consider starting laundering now.
+
+=item *
+
+Tied hash interfaces are now required to have the EXISTS and DELETE
+methods (either own or inherited).
+
+=item *
+
+If tr/// is just counting characters, it doesn't attempt to
+modify its target.
+
+=item *
+
+untie() will now call an UNTIE() hook if it exists.  See L<perltie>
+for details. [561]
+
+=item *
+
+L<utime> now supports C<utime undef, undef, @files> to change the
+file timestamps to the current time.
+
+=item *
+
+The rules for allowing underscores (underbars) in numeric constants
+have been relaxed and simplified: now you can have an underscore
+simply B<between digits>.
+
+=item *
+
+Rather than relying on C's argv[0] (which may not contain a full pathname)
+where possible $^X is now set by asking the operating system.
+(eg by reading F</proc/self/exe> on Linux, F</proc/curproc/file> on FreeBSD)
+
+=item *
+
+A new variable, C<${^TAINT}>, indicates whether taint mode is enabled.
+
+=item *
+
+You can now override the readline() builtin, and this overrides also
+the <FILEHANDLE> angle bracket operator.
+
+=item *
+
+The command-line options -s and -F are now recognized on the shebang
+(#!) line.
+
+=item *
+
+Use of the C</c> match modifier without an accompanying C</g> modifier
+elicits a new warning: C<Use of /c modifier is meaningless without /g>.
+
+Use of C</c> in substitutions, even with C</g>, elicits
+C<Use of /c modifier is meaningless in s///>.
+
+Use of C</g> with C<split> elicits C<Use of /g modifier is meaningless
+in split>.
+
+=item *
+
+Support for the C<CLONE> special subroutine had been added.
+With ithreads, when a new thread is created, all Perl data is cloned,
+however non-Perl data cannot be cloned automatically.  In C<CLONE> you
+can do whatever you need to do, like for example handle the cloning of
+non-Perl data, if necessary.  C<CLONE> will be executed once for every
+package that has it defined or inherited.  It will be called in the
+context of the new thread, so all modifications are made in the new area.
+
+See L<perlmod>
+
+=back
+
+=head1 Modules and Pragmata
+
+=head2 New Modules and Pragmata
+
+=over 4
+
+=item *
+
+C<Attribute::Handlers>, originally by Damian Conway and now maintained
+by Arthur Bergman, allows a class to define attribute handlers.
+
+    package MyPack;
+    use Attribute::Handlers;
+    sub Wolf :ATTR(SCALAR) { print "howl!\n" }
+
+    # later, in some package using or inheriting from MyPack...
+
+    my MyPack $Fluffy : Wolf; # the attribute handler Wolf will be called
+
+Both variables and routines can have attribute handlers.  Handlers can
+be specific to type (SCALAR, ARRAY, HASH, or CODE), or specific to the
+exact compilation phase (BEGIN, CHECK, INIT, or END).
+See L<Attribute::Handlers>.
+
+=item *
+
+C<B::Concise>, by Stephen McCamant, is a new compiler backend for
+walking the Perl syntax tree, printing concise info about ops.
+The output is highly customisable.  See L<B::Concise>. [561+]
+
+=item *
+
+The new bignum, bigint, and bigrat pragmas, by Tels, implement
+transparent bignum support (using the Math::BigInt, Math::BigFloat,
+and Math::BigRat backends).
+
+=item *
+
+C<Class::ISA>, by Sean Burke, is a module for reporting the search
+path for a class's ISA tree.  See L<Class::ISA>.
+
+=item *
+
+C<Cwd> now has a split personality: if possible, an XS extension is
+used, (this will hopefully be faster, more secure, and more robust)
+but if not possible, the familiar Perl implementation is used.
+
+=item *
+
+C<Devel::PPPort>, originally by Kenneth Albanowski and now
+maintained by Paul Marquess, has been added.  It is primarily used
+by C<h2xs> to enhance portability of XS modules between different
+versions of Perl.  See L<Devel::PPPort>.
+
+=item *
+
+C<Digest>, frontend module for calculating digests (checksums), from
+Gisle Aas, has been added.  See L<Digest>.
+
+=item *
+
+C<Digest::MD5> for calculating MD5 digests (checksums) as defined in
+RFC 1321, from Gisle Aas, has been added.  See L<Digest::MD5>.
+
+    use Digest::MD5 'md5_hex';
+
+    $digest = md5_hex("Thirsty Camel");
+
+    print $digest, "\n"; # 01d19d9d2045e005c3f1b80e8b164de1
+
+NOTE: the C<MD5> backward compatibility module is deliberately not
+included since its further use is discouraged.
+
+See also L<PerlIO::via::QuotedPrint>.
+
+=item *
+
+C<Encode>, originally by Nick Ing-Simmons and now maintained by Dan
+Kogai, provides a mechanism to translate between different character
+encodings.  Support for Unicode, ISO-8859-1, and ASCII are compiled in
+to the module.  Several other encodings (like the rest of the
+ISO-8859, CP*/Win*, Mac, KOI8-R, three variants EBCDIC, Chinese,
+Japanese, and Korean encodings) are included and can be loaded at
+runtime.  (For space considerations, the largest Chinese encodings
+have been separated into their own CPAN module, Encode::HanExtra,
+which Encode will use if available).  See L<Encode>.
+
+Any encoding supported by Encode module is also available to the
+":encoding()" layer if PerlIO is used.
+
+=item *
+
+C<Hash::Util> is the interface to the new I<restricted hashes>
+feature.  (Implemented by Jeffrey Friedl, Nick Ing-Simmons, and
+Michael Schwern.)  See L<Hash::Util>.
+
+=item *
+
+C<I18N::Langinfo> can be used to query locale information.
+See L<I18N::Langinfo>.
+
+=item *
+
+C<I18N::LangTags>, by Sean Burke, has functions for dealing with
+RFC3066-style language tags.  See L<I18N::LangTags>.
+
+=item *
+
+C<ExtUtils::Constant>, by Nicholas Clark, is a new tool for extension
+writers for generating XS code to import C header constants.
+See L<ExtUtils::Constant>.
+
+=item *
+
+C<Filter::Simple>, by Damian Conway, is an easy-to-use frontend to
+Filter::Util::Call.  See L<Filter::Simple>.
+
+    # in MyFilter.pm:
+
+    package MyFilter;
+
+    use Filter::Simple sub {
+        while (my ($from, $to) = splice @_, 0, 2) {
+                s/$from/$to/g;
+        }
+    };
+
+    1;
+
+    # in user's code:
+
+    use MyFilter qr/red/ => 'green';
+
+    print "red\n";   # this code is filtered, will print "green\n"
+    print "bored\n"; # this code is filtered, will print "bogreen\n"
+
+    no MyFilter;
+
+    print "red\n";   # this code is not filtered, will print "red\n"
+
+=item *
+
+C<File::Temp>, by Tim Jenness, allows one to create temporary files
+and directories in an easy, portable, and secure way.  See L<File::Temp>.
+[561+]
+
+=item *
+
+C<Filter::Util::Call>, by Paul Marquess, provides you with the
+framework to write I<source filters> in Perl.  For most uses, the
+frontend Filter::Simple is to be preferred.  See L<Filter::Util::Call>.
+
+=item *
+
+C<if>, by Ilya Zakharevich, is a new pragma for conditional inclusion
+of modules.
+
+=item *
+
+L<libnet>, by Graham Barr, is a collection of perl5 modules related
+to network programming.  See L<Net::FTP>, L<Net::NNTP>, L<Net::Ping>
+(not part of libnet, but related), L<Net::POP3>, L<Net::SMTP>,
+and L<Net::Time>.
+
+Perl installation leaves libnet unconfigured; use F<libnetcfg>
+to configure it.
+
+=item *
+
+C<List::Util>, by Graham Barr, is a selection of general-utility
+list subroutines, such as sum(), min(), first(), and shuffle().
+See L<List::Util>.
+
+=item *
+
+C<Locale::Constants>, C<Locale::Country>, C<Locale::Currency>
+C<Locale::Language>, and L<Locale::Script>, by Neil Bowers, have
+been added.  They provide the codes for various locale standards, such
+as "fr" for France, "usd" for US Dollar, and "ja" for Japanese.
+
+    use Locale::Country;
+
+    $country = code2country('jp');               # $country gets 'Japan'
+    $code    = country2code('Norway');           # $code gets 'no'
+
+See L<Locale::Constants>, L<Locale::Country>, L<Locale::Currency>,
+and L<Locale::Language>.
+
+=item *
+
+C<Locale::Maketext>, by Sean Burke, is a localization framework.  See
+L<Locale::Maketext>, and L<Locale::Maketext::TPJ13>.  The latter is an
+article about software localization, originally published in The Perl
+Journal #13, and republished here with kind permission.
+
+=item *
+
+C<Math::BigRat> for big rational numbers, to accompany Math::BigInt and
+Math::BigFloat, from Tels.  See L<Math::BigRat>.
+
+=item *
+
+C<Memoize> can make your functions faster by trading space for time,
+from Mark-Jason Dominus.  See L<Memoize>.
+
+=item *
+
+C<MIME::Base64>, by Gisle Aas, allows you to encode data in base64,
+as defined in RFC 2045 - I<MIME (Multipurpose Internet Mail
+Extensions)>.
+
+    use MIME::Base64;
+
+    $encoded = encode_base64('Aladdin:open sesame');
+    $decoded = decode_base64($encoded);
+
+    print $encoded, "\n"; # "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
+
+See L<MIME::Base64>.
+
+=item *
+
+C<MIME::QuotedPrint>, by Gisle Aas, allows you to encode data
+in quoted-printable encoding, as defined in RFC 2045 - I<MIME
+(Multipurpose Internet Mail Extensions)>.
+
+    use MIME::QuotedPrint;
+
+    $encoded = encode_qp("\xDE\xAD\xBE\xEF");
+    $decoded = decode_qp($encoded);
+
+    print $encoded, "\n"; # "=DE=AD=BE=EF\n"
+    print $decoded, "\n"; # "\xDE\xAD\xBE\xEF\n"
+
+See also L<PerlIO::via::QuotedPrint>.
+
+=item *
+
+C<NEXT>, by Damian Conway, is a pseudo-class for method redispatch.
+See L<NEXT>.
+
+=item *
+
+C<open> is a new pragma for setting the default I/O layers
+for open().
+
+=item *
+
+C<PerlIO::scalar>, by Nick Ing-Simmons, provides the implementation
+of IO to "in memory" Perl scalars as discussed above.  It also serves
+as an example of a loadable PerlIO layer.  Other future possibilities
+include PerlIO::Array and PerlIO::Code.  See L<PerlIO::scalar>.
+
+=item *
+
+C<PerlIO::via>, by Nick Ing-Simmons, acts as a PerlIO layer and wraps
+PerlIO layer functionality provided by a class (typically implemented
+in Perl code).
+
+=item *
+
+C<PerlIO::via::QuotedPrint>, by Elizabeth Mattijsen, is an example
+of a C<PerlIO::via> class:
+
+    use PerlIO::via::QuotedPrint;
+    open($fh,">:via(QuotedPrint)",$path);
+
+This will automatically convert everything output to C<$fh> to
+Quoted-Printable.  See L<PerlIO::via> and L<PerlIO::via::QuotedPrint>.
+
+=item *
+
+C<Pod::ParseLink>, by Russ Allbery, has been added,
+to parse LZ<><> links in pods as described in the new
+perlpodspec.
+
+=item *
+
+C<Pod::Text::Overstrike>, by Joe Smith, has been added.
+It converts POD data to formatted overstrike text.
+See L<Pod::Text::Overstrike>. [561+]
+
+=item *
+
+C<Scalar::Util> is a selection of general-utility scalar subroutines,
+such as blessed(), reftype(), and tainted().  See L<Scalar::Util>.
+
+=item *
+
+C<sort> is a new pragma for controlling the behaviour of sort().
+
+=item *
+
+C<Storable> gives persistence to Perl data structures by allowing the
+storage and retrieval of Perl data to and from files in a fast and
+compact binary format.  Because in effect Storable does serialisation
+of Perl data structures, with it you can also clone deep, hierarchical
+datastructures.  Storable was originally created by Raphael Manfredi,
+but it is now maintained by Abhijit Menon-Sen.  Storable has been
+enhanced to understand the two new hash features, Unicode keys and
+restricted hashes.  See L<Storable>.
+
+=item *
+
+C<Switch>, by Damian Conway, has been added.  Just by saying
+
+    use Switch;
+
+you have C<switch> and C<case> available in Perl.
+
+    use Switch;
+
+    switch ($val) {
+
+		case 1		{ print "number 1" }
+		case "a"	{ print "string a" }
+		case [1..10,42]	{ print "number in list" }
+		case (@array)	{ print "number in list" }
+		case /\w+/	{ print "pattern" }
+		case qr/\w+/	{ print "pattern" }
+		case (%hash)	{ print "entry in hash" }
+		case (\%hash)	{ print "entry in hash" }
+		case (\&sub)	{ print "arg to subroutine" }
+		else		{ print "previous case not true" }
+    }
+
+See L<Switch>.
+
+=item *
+
+C<Test::More>, by Michael Schwern, is yet another framework for writing
+test scripts, more extensive than Test::Simple.  See L<Test::More>.
+
+=item *
+
+C<Test::Simple>, by Michael Schwern, has basic utilities for writing
+tests.   See L<Test::Simple>.
+
+=item *
+
+C<Text::Balanced>, by Damian Conway, has been added, for extracting
+delimited text sequences from strings.
+
+    use Text::Balanced 'extract_delimited';
+
+    ($a, $b) = extract_delimited("'never say never', he never said", "'", '');
+
+$a will be "'never say never'", $b will be ', he never said'.
+
+In addition to extract_delimited(), there are also extract_bracketed(),
+extract_quotelike(), extract_codeblock(), extract_variable(),
+extract_tagged(), extract_multiple(), gen_delimited_pat(), and
+gen_extract_tagged().  With these, you can implement rather advanced
+parsing algorithms.  See L<Text::Balanced>.
+
+=item *
+
+C<threads>, by Arthur Bergman, is an interface to interpreter threads.
+Interpreter threads (ithreads) is the new thread model introduced in
+Perl 5.6 but only available as an internal interface for extension
+writers (and for Win32 Perl for C<fork()> emulation).  See L<threads>,
+L<threads::shared>, and L<perlthrtut>.
+
+=item *
+
+C<threads::shared>, by Arthur Bergman, allows data sharing for
+interpreter threads.  See L<threads::shared>.
+
+=item *
+
+C<Tie::File>, by Mark-Jason Dominus, associates a Perl array with the
+lines of a file.  See L<Tie::File>.
+
+=item *
+
+C<Tie::Memoize>, by Ilya Zakharevich, provides on-demand loaded hashes.
+See L<Tie::Memoize>.
+
+=item *
+
+C<Tie::RefHash::Nestable>, by Edward Avis, allows storing hash
+references (unlike the standard Tie::RefHash)  The module is contained
+within Tie::RefHash.  See L<Tie::RefHash>.
+
+=item *
+
+C<Time::HiRes>, by Douglas E. Wegscheid, provides high resolution
+timing (ualarm, usleep, and gettimeofday).  See L<Time::HiRes>.
+
+=item *
+
+C<Unicode::UCD> offers a querying interface to the Unicode Character
+Database.  See L<Unicode::UCD>.
+
+=item *
+
+C<Unicode::Collate>, by SADAHIRO Tomoyuki, implements the UCA
+(Unicode Collation Algorithm) for sorting Unicode strings.
+See L<Unicode::Collate>.
+
+=item *
+
+C<Unicode::Normalize>, by SADAHIRO Tomoyuki, implements the various
+Unicode normalization forms.  See L<Unicode::Normalize>.
+
+=item *
+
+C<XS::APItest>, by Tim Jenness, is a test extension that exercises XS
+APIs.  Currently only C<printf()> is tested: how to output various
+basic data types from XS.
+
+=item *
+
+C<XS::Typemap>, by Tim Jenness, is a test extension that exercises
+XS typemaps.  Nothing gets installed, but the code is worth studying
+for extension writers.
+
+=back
+
+=head2 Updated And Improved Modules and Pragmata
+
+=over 4
+
+=item *
+
+The following independently supported modules have been updated to the
+newest versions from CPAN: CGI, CPAN, DB_File, File::Spec, File::Temp,
+Getopt::Long, Math::BigFloat, Math::BigInt, the podlators bundle
+(Pod::Man, Pod::Text), Pod::LaTeX [561+], Pod::Parser, Storable,
+Term::ANSIColor, Test, Text-Tabs+Wrap.
+
+=item *
+
+attributes::reftype() now works on tied arguments.
+
+=item *
+
+AutoLoader can now be disabled with C<no AutoLoader;>.
+
+=item *
+
+B::Deparse has been significantly enhanced by Robin Houston.  It can
+now deparse almost all of the standard test suite (so that the tests
+still succeed).  There is a make target "test.deparse" for trying this
+out.
+
+=item *
+
+Carp now has better interface documentation, and the @CARP_NOT
+interface has been added to get optional control over where errors
+are reported independently of @ISA, by Ben Tilly.
+
+=item *
+
+Class::Struct can now define the classes in compile time.
+
+=item *
+
+Class::Struct now assigns the array/hash element if the accessor
+is called with an array/hash element as the B<sole> argument.
+
+=item *
+
+The return value of Cwd::fastcwd() is now tainted.
+
+=item *
+
+Data::Dumper now has an option to sort hashes.
+
+=item *
+
+Data::Dumper now has an option to dump code references
+using B::Deparse.
+
+=item *
+
+DB_File now supports newer Berkeley DB versions, among
+other improvements.
+
+=item *
+
+Devel::Peek now has an interface for the Perl memory statistics
+(this works only if you are using perl's malloc, and if you have
+compiled with debugging).
+
+=item *
+
+The English module can now be used without the infamous performance
+hit by saying
+
+	use English '-no_match_vars';
+
+(Assuming, of course, that you don't need the troublesome variables
+C<$`>, C<$&>, or C<$'>.)  Also, introduced C<@LAST_MATCH_START> and
+C<@LAST_MATCH_END> English aliases for C<@-> and C<@+>.
+
+=item *
+
+ExtUtils::MakeMaker has been significantly cleaned up and fixed.
+The enhanced version has also been backported to earlier releases
+of Perl and submitted to CPAN so that the earlier releases can
+enjoy the fixes.
+
+=item *
+
+The arguments of WriteMakefile() in Makefile.PL are now checked
+for sanity much more carefully than before.  This may cause new
+warnings when modules are being installed.  See L<ExtUtils::MakeMaker>
+for more details.
+
+=item *
+
+ExtUtils::MakeMaker now uses File::Spec internally, which hopefully
+leads to better portability.
+
+=item *
+
+Fcntl, Socket, and Sys::Syslog have been rewritten by Nicholas Clark
+to use the new-style constant dispatch section (see L<ExtUtils::Constant>).
+This means that they will be more robust and hopefully faster.
+
+=item *
+
+File::Find now chdir()s correctly when chasing symbolic links. [561]
+
+=item *
+
+File::Find now has pre- and post-processing callbacks.  It also
+correctly changes directories when chasing symbolic links.  Callbacks
+(naughtily) exiting with "next;" instead of "return;" now work.
+
+=item *
+
+File::Find is now (again) reentrant.  It also has been made
+more portable.
+
+=item *
+
+The warnings issued by File::Find now belong to their own category.
+You can enable/disable them with C<use/no warnings 'File::Find';>.
+
+=item *
+
+File::Glob::glob() has been renamed to File::Glob::bsd_glob()
+because the name clashes with the builtin glob().  The older
+name is still available for compatibility, but is deprecated. [561]
+
+=item *
+
+File::Glob now supports C<GLOB_LIMIT> constant to limit the size of
+the returned list of filenames.
+
+=item *
+
+IPC::Open3 now allows the use of numeric file descriptors.
+
+=item *
+
+IO::Socket now has an atmark() method, which returns true if the socket
+is positioned at the out-of-band mark.  The method is also exportable
+as a sockatmark() function.
+
+=item *
+
+IO::Socket::INET failed to open the specified port if the service name
+was not known.  It now correctly uses the supplied port number as is. [561]
+
+=item *
+
+IO::Socket::INET has support for the ReusePort option (if your
+platform supports it).  The Reuse option now has an alias, ReuseAddr.
+For clarity, you may want to prefer ReuseAddr.
+
+=item *
+
+IO::Socket::INET now supports a value of zero for C<LocalPort>
+(usually meaning that the operating system will make one up.)
+
+=item *
+
+'use lib' now works identically to @INC.  Removing directories
+with 'no lib' now works.
+
+=item *
+
+Math::BigFloat and Math::BigInt have undergone a full rewrite by Tels.
+They are now magnitudes faster, and they support various bignum
+libraries such as GMP and PARI as their backends.
+
+=item *
+
+Math::Complex handles inf, NaN etc., better.
+
+=item *
+
+Net::Ping has been considerably enhanced by Rob Brown: multihoming is
+now supported, Win32 functionality is better, there is now time
+measuring functionality (optionally high-resolution using
+Time::HiRes), and there is now "external" protocol which uses
+Net::Ping::External module which runs your external ping utility and
+parses the output.  A version of Net::Ping::External is available in
+CPAN.
+
+Note that some of the Net::Ping tests are disabled when running
+under the Perl distribution since one cannot assume one or more
+of the following: enabled echo port at localhost, full Internet
+connectivity, or sympathetic firewalls.  You can set the environment
+variable PERL_TEST_Net_Ping to "1" (one) before running the Perl test
+suite to enable all the Net::Ping tests.
+
+=item *
+
+POSIX::sigaction() is now much more flexible and robust.
+You can now install coderef handlers, 'DEFAULT', and 'IGNORE'
+handlers, installing new handlers was not atomic.
+
+=item *
+
+In Safe, C<%INC> is now localised in a Safe compartment so that
+use/require work.
+
+=item *
+
+In SDBM_File on dosish platforms, some keys went missing because of
+lack of support for files with "holes".  A workaround for the problem
+has been added.
+
+=item *
+
+In Search::Dict one can now have a pre-processing hook for the
+lines being searched.
+
+=item *
+
+The Shell module now has an OO interface.
+
+=item *
+
+In Sys::Syslog there is now a failover mechanism that will go
+through alternative connection mechanisms until the message
+is successfully logged.
+
+=item *
+
+The Test module has been significantly enhanced.
+
+=item *
+
+Time::Local::timelocal() does not handle fractional seconds anymore.
+The rationale is that neither does localtime(), and timelocal() and
+localtime() are supposed to be inverses of each other.
+
+=item *
+
+The vars pragma now supports declaring fully qualified variables.
+(Something that C<our()> does not and will not support.)
+
+=item *
+
+The C<utf8::> name space (as in the pragma) provides various
+Perl-callable functions to provide low level access to Perl's
+internal Unicode representation.  At the moment only length()
+has been implemented.
+
+=back
+
+=head1 Utility Changes
+
+=over 4
+
+=item *
+
+Emacs perl mode (emacs/cperl-mode.el) has been updated to version
+4.31.
+
+=item *
+
+F<emacs/e2ctags.pl> is now much faster.
+
+=item *
+
+C<enc2xs> is a tool for people adding their own encodings to the
+Encode module.
+
+=item *
+
+C<h2ph> now supports C trigraphs.
+
+=item *
+
+C<h2xs> now produces a template README.
+
+=item *
+
+C<h2xs> now uses C<Devel::PPPort> for better portability between
+different versions of Perl.
+
+=item *
+
+C<h2xs> uses the new L<ExtUtils::Constant|ExtUtils::Constant> module
+which will affect newly created extensions that define constants.
+Since the new code is more correct (if you have two constants where the
+first one is a prefix of the second one, the first constant B<never>
+got defined), less lossy (it uses integers for integer constant,
+as opposed to the old code that used floating point numbers even for
+integer constants), and slightly faster, you might want to consider
+regenerating your extension code (the new scheme makes regenerating
+easy).  L<h2xs> now also supports C trigraphs.
+
+=item *
+
+C<libnetcfg> has been added to configure libnet.
+
+=item *
+
+C<perlbug> is now much more robust.  It also sends the bug report to
+perl.org, not perl.com.
+
+=item *
+
+C<perlcc> has been rewritten and its user interface (that is,
+command line) is much more like that of the UNIX C compiler, cc.
+(The perlbc tools has been removed.  Use C<perlcc -B> instead.)
+B<Note that perlcc is still considered very experimental and
+unsupported.> [561]
+
+=item *
+
+C<perlivp> is a new Installation Verification Procedure utility
+for running any time after installing Perl.
+
+=item *
+
+C<piconv> is an implementation of the character conversion utility
+C<iconv>, demonstrating the new Encode module.
+
+=item *
+
+C<pod2html> now allows specifying a cache directory.
+
+=item *
+
+C<pod2html> now produces XHTML 1.0.
+
+=item *
+
+C<pod2html> now understands POD written using different line endings
+(PC-like CRLF versus UNIX-like LF versus MacClassic-like CR).
+
+=item *
+
+C<s2p> has been completely rewritten in Perl.  (It is in fact a full
+implementation of sed in Perl: you can use the sed functionality by
+using the C<psed> utility.)
+
+=item *
+
+C<xsubpp> now understands POD documentation embedded in the *.xs
+files. [561]
+
+=item *
+
+C<xsubpp> now supports the OUT keyword.
+
+=back
+
+=head1 New Documentation
+
+=over 4
+
+=item *
+
+perl56delta details the changes between the 5.005 release and the
+5.6.0 release.
+
+=item *
+
+perlclib documents the internal replacements for standard C library
+functions.  (Interesting only for extension writers and Perl core
+hackers.) [561+]
+
+=item *
+
+perldebtut is a Perl debugging tutorial. [561+]
+
+=item *
+
+perlebcdic contains considerations for running Perl on EBCDIC
+platforms. [561+]
+
+=item *
+
+perlintro is a gentle introduction to Perl.
+
+=item *
+
+perliol documents the internals of PerlIO with layers.
+
+=item *
+
+perlmodstyle is a style guide for writing modules.
+
+=item *
+
+perlnewmod tells about writing and submitting a new module. [561+]
+
+=item *
+
+perlpacktut is a pack() tutorial.
+
+=item *
+
+perlpod has been rewritten to be clearer and to record the best
+practices gathered over the years.
+
+=item *
+
+perlpodspec is a more formal specification of the pod format,
+mainly of interest for writers of pod applications, not to
+people writing in pod.
+
+=item *
+
+perlretut is a regular expression tutorial. [561+]
+
+=item *
+
+perlrequick is a regular expressions quick-start guide.
+Yes, much quicker than perlretut. [561]
+
+=item *
+
+perltodo has been updated.
+
+=item *
+
+perltootc has been renamed as perltooc (to not to conflict
+with perltoot in filesystems restricted to "8.3" names).
+
+=item *
+
+perluniintro is an introduction to using Unicode in Perl.
+(perlunicode is more of a detailed reference and background
+information)
+
+=item *
+
+perlutil explains the command line utilities packaged with the Perl
+distribution. [561+]
+
+=back
+
+The following platform-specific documents are available before
+the installation as README.I<platform>, and after the installation
+as perlI<platform>:
+
+    perlaix perlamiga perlapollo perlbeos perlbs2000
+    perlce perlcygwin perldgux perldos perlepoc perlfreebsd perlhpux
+    perlhurd perlirix perlmachten perlmacos perlmint perlmpeix
+    perlnetware perlos2 perlos390 perlplan9 perlqnx perlsolaris
+    perltru64 perluts perlvmesa perlvms perlvos perlwin32
+
+These documents usually detail one or more of the following subjects:
+configuring, building, testing, installing, and sometimes also using
+Perl on the said platform.
+
+Eastern Asian Perl users are now welcomed in their own languages:
+README.jp (Japanese), README.ko (Korean), README.cn (simplified
+Chinese) and README.tw (traditional Chinese), which are written in
+normal pod but encoded in EUC-JP, EUC-KR, EUC-CN and Big5.  These
+will get installed as
+
+   perljp perlko perlcn perltw
+
+=over 4
+
+=item *
+
+The documentation for the POSIX-BC platform is called "BS2000", to avoid
+confusion with the Perl POSIX module.
+
+=item *
+
+The documentation for the WinCE platform is called perlce (README.ce
+in the source code kit), to avoid confusion with the perlwin32
+documentation on 8.3-restricted filesystems.
+
+=back
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+map() could get pathologically slow when the result list it generates
+is larger than the source list.  The performance has been improved for
+common scenarios. [561]
+
+=item *
+
+sort() is also fully reentrant, in the sense that the sort function
+can itself call sort().  This did not work reliably in previous
+releases. [561]
+
+=item *
+
+sort() has been changed to use primarily mergesort internally as
+opposed to the earlier quicksort.  For very small lists this may
+result in slightly slower sorting times, but in general the speedup
+should be at least 20%.  Additional bonuses are that the worst case
+behaviour of sort() is now better (in computer science terms it now
+runs in time O(N log N), as opposed to quicksort's Theta(N**2)
+worst-case run time behaviour), and that sort() is now stable
+(meaning that elements with identical keys will stay ordered as they
+were before the sort).  See the C<sort> pragma for information.
+
+The story in more detail: suppose you want to serve yourself a little
+slice of Pi.
+
+    @digits = ( 3,1,4,1,5,9 );
+
+A numerical sort of the digits will yield (1,1,3,4,5,9), as expected.
+Which C<1> comes first is hard to know, since one C<1> looks pretty
+much like any other.  You can regard this as totally trivial,
+or somewhat profound.  However, if you just want to sort the even
+digits ahead of the odd ones, then what will
+
+    sort { ($a % 2) <=> ($b % 2) } @digits;
+
+yield?  The only even digit, C<4>, will come first.  But how about
+the odd numbers, which all compare equal?  With the quicksort algorithm
+used to implement Perl 5.6 and earlier, the order of ties is left up
+to the sort.  So, as you add more and more digits of Pi, the order
+in which the sorted even and odd digits appear will change.
+and, for sufficiently large slices of Pi, the quicksort algorithm
+in Perl 5.8 won't return the same results even if reinvoked with the
+same input.  The justification for this rests with quicksort's
+worst case behavior.  If you run
+
+   sort { $a <=> $b } ( 1 .. $N , 1 .. $N );
+
+(something you might approximate if you wanted to merge two sorted
+arrays using sort), doubling $N doesn't just double the quicksort time,
+it I<quadruples> it.  Quicksort has a worst case run time that can
+grow like N**2, so-called I<quadratic> behaviour, and it can happen
+on patterns that may well arise in normal use.  You won't notice this
+for small arrays, but you I<will> notice it with larger arrays,
+and you may not live long enough for the sort to complete on arrays
+of a million elements.  So the 5.8 quicksort scrambles large arrays
+before sorting them, as a statistical defence against quadratic behaviour.
+But that means if you sort the same large array twice, ties may be
+broken in different ways.
+
+Because of the unpredictability of tie-breaking order, and the quadratic
+worst-case behaviour, quicksort was I<almost> replaced completely with
+a stable mergesort.  I<Stable> means that ties are broken to preserve
+the original order of appearance in the input array.  So
+
+    sort { ($a % 2) <=> ($b % 2) } (3,1,4,1,5,9);
+
+will yield (4,3,1,1,5,9), guaranteed.  The even and odd numbers
+appear in the output in the same order they appeared in the input.
+Mergesort has worst case O(N log N) behaviour, the best value
+attainable.  And, ironically, this mergesort does particularly
+well where quicksort goes quadratic:  mergesort sorts (1..$N, 1..$N)
+in O(N) time.  But quicksort was rescued at the last moment because
+it is faster than mergesort on certain inputs and platforms.
+For example, if you really I<don't> care about the order of even
+and odd digits, quicksort will run in O(N) time; it's very good
+at sorting many repetitions of a small number of distinct elements.
+The quicksort divide and conquer strategy works well on platforms
+with relatively small, very fast, caches.  Eventually, the problem gets
+whittled down to one that fits in the cache, from which point it
+benefits from the increased memory speed.
+
+Quicksort was rescued by implementing a sort pragma to control aspects
+of the sort.  The B<stable> subpragma forces stable behaviour,
+regardless of algorithm.  The B<_quicksort> and B<_mergesort>
+subpragmas are heavy-handed ways to select the underlying implementation.
+The leading C<_> is a reminder that these subpragmas may not survive
+beyond 5.8.  More appropriate mechanisms for selecting the implementation
+exist, but they wouldn't have arrived in time to save quicksort.
+
+=item *
+
+Hashes now use Bob Jenkins "One-at-a-Time" hashing key algorithm
+( http://burtleburtle.net/bob/hash/doobs.html ).  This algorithm is
+reasonably fast while producing a much better spread of values than
+the old hashing algorithm (originally by Chris Torek, later tweaked by
+Ilya Zakharevich).  Hash values output from the algorithm on a hash of
+all 3-char printable ASCII keys comes much closer to passing the
+DIEHARD random number generation tests.  According to perlbench, this
+change has not affected the overall speed of Perl.
+
+=item *
+
+unshift() should now be noticeably faster.
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+=head2 Generic Improvements
+
+=over 4
+
+=item *
+
+INSTALL now explains how you can configure Perl to use 64-bit
+integers even on non-64-bit platforms.
+
+=item *
+
+Policy.sh policy change: if you are reusing a Policy.sh file
+(see INSTALL) and you use Configure -Dprefix=/foo/bar and in the old
+Policy $prefix eq $siteprefix and $prefix eq $vendorprefix, all of
+them will now be changed to the new prefix, /foo/bar.  (Previously
+only $prefix changed.)  If you do not like this new behaviour,
+specify prefix, siteprefix, and vendorprefix explicitly.
+
+=item *
+
+A new optional location for Perl libraries, otherlibdirs, is available.
+It can be used for example for vendor add-ons without disturbing Perl's
+own library directories.
+
+=item *
+
+In many platforms, the vendor-supplied 'cc' is too stripped-down to
+build Perl (basically, 'cc' doesn't do ANSI C).  If this seems
+to be the case and 'cc' does not seem to be the GNU C compiler
+'gcc', an automatic attempt is made to find and use 'gcc' instead.
+
+=item *
+
+gcc needs to closely track the operating system release to avoid
+build problems. If Configure finds that gcc was built for a different
+operating system release than is running, it now gives a clearly visible
+warning that there may be trouble ahead.
+
+=item *
+
+Since Perl 5.8 is not binary-compatible with previous releases
+of Perl, Configure no longer suggests including the 5.005
+modules in @INC.
+
+=item *
+
+Configure C<-S> can now run non-interactively. [561]
+
+=item *
+
+Configure support for pdp11-style memory models has been removed due
+to obsolescence. [561]
+
+=item *
+
+configure.gnu now works with options with whitespace in them.
+
+=item *
+
+installperl now outputs everything to STDERR.
+
+=item *
+
+Because PerlIO is now the default on most platforms, "-perlio" doesn't
+get appended to the $Config{archname} (also known as $^O) anymore.
+Instead, if you explicitly choose not to use perlio (Configure command
+line option -Uuseperlio), you will get "-stdio" appended.
+
+=item *
+
+Another change related to the architecture name is that "-64all"
+(-Duse64bitall, or "maximally 64-bit") is appended only if your
+pointers are 64 bits wide.  (To be exact, the use64bitall is ignored.)
+
+=item *
+
+In AFS installations, one can configure the root of the AFS to be
+somewhere else than the default F</afs> by using the Configure
+parameter C<-Dafsroot=/some/where/else>.
+
+=item *
+
+APPLLIB_EXP, a lesser-known configuration-time definition, has been
+documented.  It can be used to prepend site-specific directories
+to Perl's default search path (@INC); see INSTALL for information.
+
+=item *
+
+The version of Berkeley DB used when the Perl (and, presumably, the
+DB_File extension) was built is now available as
+C<@Config{qw(db_version_major db_version_minor db_version_patch)}>
+from Perl and as C<DB_VERSION_MAJOR_CFG DB_VERSION_MINOR_CFG
+DB_VERSION_PATCH_CFG> from C.
+
+=item *
+
+Building Berkeley DB3 for compatibility modes for DB, NDBM, and ODBM
+has been documented in INSTALL.
+
+=item *
+
+If you have CPAN access (either network or a local copy such as a
+CD-ROM) you can during specify extra modules to Configure to build and
+install with Perl using the -Dextras=...  option.  See INSTALL for
+more details.
+
+=item *
+
+In addition to config.over, a new override file, config.arch, is
+available.  This file is supposed to be used by hints file writers
+for architecture-wide changes (as opposed to config.over which is
+for site-wide changes).
+
+=item *
+
+If your file system supports symbolic links, you can build Perl outside
+of the source directory by
+
+	mkdir perl/build/directory
+	cd perl/build/directory
+	sh /path/to/perl/source/Configure -Dmksymlinks ...
+
+This will create in perl/build/directory a tree of symbolic links
+pointing to files in /path/to/perl/source.  The original files are left
+unaffected.  After Configure has finished, you can just say
+
+	make all test
+
+and Perl will be built and tested, all in perl/build/directory.
+[561]
+
+=item *
+
+For Perl developers, several new make targets for profiling
+and debugging have been added; see L<perlhack>.
+
+=over 8
+
+=item *
+
+Use of the F<gprof> tool to profile Perl has been documented in
+L<perlhack>.  There is a make target called "perl.gprof" for
+generating a gprofiled Perl executable.
+
+=item *
+
+If you have GCC 3, there is a make target called "perl.gcov" for
+creating a gcoved Perl executable for coverage analysis.  See
+L<perlhack>.
+
+=item *
+
+If you are on IRIX or Tru64 platforms, new profiling/debugging options
+have been added; see L<perlhack> for more information about pixie and
+Third Degree.
+
+=back
+
+=item *
+
+Guidelines of how to construct minimal Perl installations have
+been added to INSTALL.
+
+=item *
+
+The Thread extension is now not built at all under ithreads
+(C<Configure -Duseithreads>) because it wouldn't work anyway (the
+Thread extension requires being Configured with C<-Duse5005threads>).
+
+B<Note that the 5.005 threads are unsupported and deprecated: if you
+have code written for the old threads you should migrate it to the
+new ithreads model.>
+
+=item *
+
+The Gconvert macro ($Config{d_Gconvert}) used by perl for stringifying
+floating-point numbers is now more picky about using sprintf %.*g
+rules for the conversion.  Some platforms that used to use gcvt may
+now resort to the slower sprintf.
+
+=item *
+
+The obsolete method of making a special (e.g., debugging) flavor
+of perl by saying
+
+	make LIBPERL=libperld.a
+
+has been removed. Use -DDEBUGGING instead.
+
+=back
+
+=head2 New Or Improved Platforms
+
+For the list of platforms known to support Perl,
+see L<perlport/"Supported Platforms">.
+
+=over 4
+
+=item *
+
+AIX dynamic loading should be now better supported.
+
+=item *
+
+AIX should now work better with gcc, threads, and 64-bitness.  Also the
+long doubles support in AIX should be better now.  See L<perlaix>.
+
+=item *
+
+AtheOS ( http://www.atheos.cx/ ) is a new platform.
+
+=item *
+
+BeOS has been reclaimed.
+
+=item *
+
+The DG/UX platform now supports 5.005-style threads.
+See L<perldgux>.
+
+=item *
+
+The DYNIX/ptx platform (also known as dynixptx) is supported at or
+near osvers 4.5.2.
+
+=item *
+
+EBCDIC platforms (z/OS (also known as OS/390), POSIX-BC, and VM/ESA)
+have been regained.  Many test suite tests still fail and the
+co-existence of Unicode and EBCDIC isn't quite settled, but the
+situation is much better than with Perl 5.6.  See L<perlos390>,
+L<perlbs2000> (for POSIX-BC), and L<perlvmesa> for more information.
+
+=item *
+
+Building perl with -Duseithreads or -Duse5005threads now works under
+HP-UX 10.20 (previously it only worked under 10.30 or later). You will
+need a thread library package installed. See README.hpux. [561]
+
+=item *
+
+Mac OS Classic is now supported in the mainstream source package
+(MacPerl has of course been available since perl 5.004 but now the
+source code bases of standard Perl and MacPerl have been synchronised)
+[561]
+
+=item *
+
+Mac OS X (or Darwin) should now be able to build Perl even on HFS+
+filesystems.  (The case-insensitivity used to confuse the Perl build
+process.)
+
+=item *
+
+NCR MP-RAS is now supported. [561]
+
+=item *
+
+All the NetBSD specific patches (except for the installation
+specific ones) have been merged back to the main distribution.
+
+=item *
+
+NetWare from Novell is now supported.  See L<perlnetware>.
+
+=item *
+
+NonStop-UX is now supported. [561]
+
+=item *
+
+NEC SUPER-UX is now supported.
+
+=item *
+
+All the OpenBSD specific patches (except for the installation
+specific ones) have been merged back to the main distribution.
+
+=item *
+
+Perl has been tested with the GNU pth userlevel thread package
+( http://www.gnu.org/software/pth/pth.html ).  All thread tests
+of Perl now work, but not without adding some yield()s to the tests,
+so while pth (and other userlevel thread implementations) can be
+considered to be "working" with Perl ithreads, keep in mind the
+possible non-preemptability of the underlying thread implementation.
+
+=item *
+
+Stratus VOS is now supported using Perl's native build method
+(Configure).  This is the recommended method to build Perl on
+VOS.  The older methods, which build miniperl, are still
+available.  See L<perlvos>. [561+]
+
+=item *
+
+The Amdahl UTS UNIX mainframe platform is now supported. [561]
+
+=item *
+
+WinCE is now supported.  See L<perlce>.
+
+=item *
+
+z/OS (formerly known as OS/390, formerly known as MVS OE) now has
+support for dynamic loading.  This is not selected by default,
+however, you must specify -Dusedl in the arguments of Configure. [561]
+
+=back
+
+=head1 Selected Bug Fixes
+
+Numerous memory leaks and uninitialized memory accesses have been
+hunted down.  Most importantly, anonymous subs used to leak quite
+a bit. [561]
+
+=over 4
+
+=item *
+
+The autouse pragma didn't work for Multi::Part::Function::Names.
+
+=item *
+
+caller() could cause core dumps in certain situations.  Carp was
+sometimes affected by this problem.  In particular, caller() now
+returns a subroutine name of C<(unknown)> for subroutines that have
+been removed from the symbol table.
+
+=item *
+
+chop(@list) in list context returned the characters chopped in
+reverse order.  This has been reversed to be in the right order. [561]
+
+=item *
+
+Configure no longer includes the DBM libraries (dbm, gdbm, db, ndbm)
+when building the Perl binary.  The only exception to this is SunOS 4.x,
+which needs them. [561]
+
+=item *
+
+The behaviour of non-decimal but numeric string constants such as
+"0x23" was platform-dependent: in some platforms that was seen as 35,
+in some as 0, in some as a floating point number (don't ask).  This
+was caused by Perl's using the operating system libraries in a situation
+where the result of the string to number conversion is undefined: now
+Perl consistently handles such strings as zero in numeric contexts.
+
+=item *
+
+Several debugger fixes: exit code now reflects the script exit code,
+condition C<"0"> now treated correctly, the C<d> command now checks
+line number, C<$.> no longer gets corrupted, and all debugger output
+now goes correctly to the socket if RemotePort is set. [561]
+
+=item *
+
+The debugger (perl5db.pl) has been modified to present a more
+consistent commands interface, via (CommandSet=580).  perl5db.t was
+also added to test the changes, and as a placeholder for further tests.
+
+See L<perldebug>.
+
+=item *
+
+The debugger has a new C<dumpDepth> option to control the maximum
+depth to which nested structures are dumped.  The C<x> command has
+been extended so that C<x N EXPR> dumps out the value of I<EXPR> to a
+depth of at most I<N> levels.
+
+=item *
+
+The debugger can now show lexical variables if you have the CPAN
+module PadWalker installed.
+
+=item *
+
+The order of DESTROYs has been made more predictable.
+
+=item *
+
+Perl 5.6.0 could emit spurious warnings about redefinition of
+dl_error() when statically building extensions into perl.
+This has been corrected. [561]
+
+=item *
+
+L<dprofpp> -R didn't work.
+
+=item *
+
+C<*foo{FORMAT}> now works.
+
+=item *
+
+Infinity is now recognized as a number.
+
+=item *
+
+UNIVERSAL::isa no longer caches methods incorrectly.  (This broke
+the Tk extension with 5.6.0.) [561]
+
+=item *
+
+Lexicals I: lexicals outside an eval "" weren't resolved
+correctly inside a subroutine definition inside the eval "" if they
+were not already referenced in the top level of the eval""ed code.
+
+=item *
+
+Lexicals II: lexicals leaked at file scope into subroutines that
+were declared before the lexicals.
+
+=item *
+
+Lexical warnings now propagating correctly between scopes
+and into C<eval "...">.
+
+=item *
+
+C<use warnings qw(FATAL all)> did not work as intended.  This has been
+corrected. [561]
+
+=item *
+
+warnings::enabled() now reports the state of $^W correctly if the caller
+isn't using lexical warnings. [561]
+
+=item *
+
+Line renumbering with eval and C<#line> now works. [561]
+
+=item *
+
+Fixed numerous memory leaks, especially in eval "".
+
+=item *
+
+Localised tied variables no longer leak memory
+
+    use Tie::Hash;
+    tie my %tied_hash => 'Tie::StdHash';
+
+    ...
+
+    # Used to leak memory every time local() was called;
+    # in a loop, this added up.
+    local($tied_hash{Foo}) = 1;
+
+=item *
+
+Localised hash elements (and %ENV) are correctly unlocalised to not
+exist, if they didn't before they were localised.
+
+
+    use Tie::Hash;
+    tie my %tied_hash => 'Tie::StdHash';
+
+    ...
+
+    # Nothing has set the FOO element so far
+
+    { local $tied_hash{FOO} = 'Bar' }
+
+    # This used to print, but not now.
+    print "exists!\n" if exists $tied_hash{FOO};
+
+As a side effect of this fix, tied hash interfaces B<must> define
+the EXISTS and DELETE methods.
+
+=item *
+
+mkdir() now ignores trailing slashes in the directory name,
+as mandated by POSIX.
+
+=item *
+
+Some versions of glibc have a broken modfl().  This affects builds
+with C<-Duselongdouble>.  This version of Perl detects this brokenness
+and has a workaround for it.  The glibc release 2.2.2 is known to have
+fixed the modfl() bug.
+
+=item *
+
+Modulus of unsigned numbers now works (4063328477 % 65535 used to
+return 27406, instead of 27047). [561]
+
+=item *
+
+Some "not a number" warnings introduced in 5.6.0 eliminated to be
+more compatible with 5.005.  Infinity is now recognised as a number. [561]
+
+=item *
+
+Numeric conversions did not recognize changes in the string value
+properly in certain circumstances. [561]
+
+=item *
+
+Attributes (such as :shared) didn't work with our().
+
+=item *
+
+our() variables will not cause bogus "Variable will not stay shared"
+warnings. [561]
+
+=item *
+
+"our" variables of the same name declared in two sibling blocks
+resulted in bogus warnings about "redeclaration" of the variables.
+The problem has been corrected. [561]
+
+=item *
+
+pack "Z" now correctly terminates the string with "\0".
+
+=item *
+
+Fix password routines which in some shadow password platforms
+(e.g. HP-UX) caused getpwent() to return every other entry.
+
+=item *
+
+The PERL5OPT environment variable (for passing command line arguments
+to Perl) didn't work for more than a single group of options. [561]
+
+=item *
+
+PERL5OPT with embedded spaces didn't work.
+
+=item *
+
+printf() no longer resets the numeric locale to "C".
+
+=item *
+
+C<qw(a\\b)> now parses correctly as C<'a\\b'>: that is, as three
+characters, not four. [561]
+
+=item *
+
+pos() did not return the correct value within s///ge in earlier
+versions.  This is now handled correctly. [561]
+
+=item *
+
+Printing quads (64-bit integers) with printf/sprintf now works
+without the q L ll prefixes (assuming you are on a quad-capable platform).
+
+=item *
+
+Regular expressions on references and overloaded scalars now work. [561+]
+
+=item *
+
+Right-hand side magic (GMAGIC) could in many cases such as string
+concatenation be invoked too many times.
+
+=item *
+
+scalar() now forces scalar context even when used in void context.
+
+=item *
+
+SOCKS support is now much more robust.
+
+=item *
+
+sort() arguments are now compiled in the right wantarray context
+(they were accidentally using the context of the sort() itself).
+The comparison block is now run in scalar context, and the arguments
+to be sorted are always provided list context. [561]
+
+=item *
+
+Changed the POSIX character class C<[[:space:]]> to include the (very
+rarely used) vertical tab character.  Added a new POSIX-ish character
+class C<[[:blank:]]> which stands for horizontal whitespace
+(currently, the space and the tab).
+
+=item *
+
+The tainting behaviour of sprintf() has been rationalized.  It does
+not taint the result of floating point formats anymore, making the
+behaviour consistent with that of string interpolation. [561]
+
+=item *
+
+Some cases of inconsistent taint propagation (such as within hash
+values) have been fixed.
+
+=item *
+
+The RE engine found in Perl 5.6.0 accidentally pessimised certain kinds
+of simple pattern matches.  These are now handled better. [561]
+
+=item *
+
+Regular expression debug output (whether through C<use re 'debug'>
+or via C<-Dr>) now looks better. [561]
+
+=item *
+
+Multi-line matches like C<"a\nxb\n" =~ /(?!\A)x/m> were flawed.  The
+bug has been fixed. [561]
+
+=item *
+
+Use of $& could trigger a core dump under some situations.  This
+is now avoided. [561]
+
+=item *
+
+The regular expression captured submatches ($1, $2, ...) are now
+more consistently unset if the match fails, instead of leaving false
+data lying around in them. [561]
+
+=item *
+
+readline() on files opened in "slurp" mode could return an extra
+"" (blank line) at the end in certain situations.  This has been
+corrected. [561]
+
+=item *
+
+Autovivification of symbolic references of special variables described
+in L<perlvar> (as in C<${$num}>) was accidentally disabled.  This works
+again now. [561]
+
+=item *
+
+Sys::Syslog ignored the C<LOG_AUTH> constant.
+
+=item *
+
+$AUTOLOAD, sort(), lock(), and spawning subprocesses
+in multiple threads simultaneously are now thread-safe.
+
+=item *
+
+Tie::Array's SPLICE method was broken.
+
+=item *
+
+Allow a read-only string on the left-hand side of a non-modifying tr///.
+
+=item *
+
+If C<STDERR> is tied, warnings caused by C<warn> and C<die> now
+correctly pass to it.
+
+=item *
+
+Several Unicode fixes.
+
+=over 8
+
+=item *
+
+BOMs (byte order marks) at the beginning of Perl files
+(scripts, modules) should now be transparently skipped.
+UTF-16 and UCS-2 encoded Perl files should now be read correctly.
+
+=item *
+
+The character tables have been updated to Unicode 3.2.0.
+
+=item *
+
+Comparing with utf8 data does not magically upgrade non-utf8 data
+into utf8.  (This was a problem for example if you were mixing data
+from I/O and Unicode data: your output might have got magically encoded
+as UTF-8.)
+
+=item *
+
+Generating illegal Unicode code points such as U+FFFE, or the UTF-16
+surrogates, now also generates an optional warning.
+
+=item *
+
+C<IsAlnum>, C<IsAlpha>, and C<IsWord> now match titlecase.
+
+=item *
+
+Concatenation with the C<.> operator or via variable interpolation,
+C<eq>, C<substr>, C<reverse>, C<quotemeta>, the C<x> operator,
+substitution with C<s///>, single-quoted UTF-8, should now work.
+
+=item *
+
+The C<tr///> operator now works.  Note that the C<tr///CU>
+functionality has been removed (but see pack('U0', ...)).
+
+=item *
+
+C<eval "v200"> now works.
+
+=item *
+
+Perl 5.6.0 parsed m/\x{ab}/ incorrectly, leading to spurious warnings.
+This has been corrected. [561]
+
+=item *
+
+Zero entries were missing from the Unicode classes such as C<IsDigit>.
+
+=back
+
+=item *
+
+Large unsigned numbers (those above 2**31) could sometimes lose their
+unsignedness, causing bogus results in arithmetic operations. [561]
+
+=item *
+
+The Perl parser has been stress tested using both random input and
+Markov chain input and the few found crashes and lockups have been
+fixed.
+
+=back
+
+=head2 Platform Specific Changes and Fixes
+
+=over 4
+
+=item *
+
+BSDI 4.*
+
+Perl now works on post-4.0 BSD/OSes.
+
+=item *
+
+All BSDs
+
+Setting C<$0> now works (as much as possible; see L<perlvar> for details).
+
+=item *
+
+Cygwin
+
+Numerous updates; currently synchronised with Cygwin 1.3.10.
+
+=item *
+
+Previously DYNIX/ptx had problems in its Configure probe for non-blocking I/O.
+
+=item *
+
+EPOC
+
+EPOC now better supported.  See README.epoc. [561]
+
+=item *
+
+FreeBSD 3.*
+
+Perl now works on post-3.0 FreeBSDs.
+
+=item *
+
+HP-UX
+
+README.hpux updated; C<Configure -Duse64bitall> now works;
+now uses HP-UX malloc instead of Perl malloc.
+
+=item *
+
+IRIX
+
+Numerous compilation flag and hint enhancements; accidental mixing
+of 32-bit and 64-bit libraries (a doomed attempt) made much harder.
+
+=item *
+
+Linux
+
+=over 8
+
+=item *
+
+Long doubles should now work (see INSTALL). [561]
+
+=item *
+
+Linux previously had problems related to sockaddrlen when using
+accept(), recvfrom() (in Perl: recv()), getpeername(), and
+getsockname().
+
+=back
+
+=item *
+
+Mac OS Classic
+
+Compilation of the standard Perl distribution in Mac OS Classic should
+now work if you have the Metrowerks development environment and the
+missing Mac-specific toolkit bits.  Contact the macperl mailing list
+for details.
+
+=item *
+
+MPE/iX
+
+MPE/iX update after Perl 5.6.0.  See README.mpeix. [561]
+
+=item *
+
+NetBSD/threads: try installing the GNU pth (should be in the
+packages collection, or http://www.gnu.org/software/pth/),
+and Configure with -Duseithreads.
+
+=item *
+
+NetBSD/sparc
+
+Perl now works on NetBSD/sparc.
+
+=item *
+
+OS/2
+
+Now works with usethreads (see INSTALL). [561]
+
+=item *
+
+Solaris
+
+64-bitness using the Sun Workshop compiler now works.
+
+=item *
+
+Stratus VOS
+
+The native build method requires at least VOS Release 14.5.0
+and GNU C++/GNU Tools 2.0.1 or later.  The Perl pack function
+now maps overflowed values to +infinity and underflowed values
+to -infinity.
+
+=item *
+
+Tru64 (aka Digital UNIX, aka DEC OSF/1)
+
+The operating system version letter now recorded in $Config{osvers}.
+Allow compiling with gcc (previously explicitly forbidden).  Compiling
+with gcc still not recommended because buggy code results, even with
+gcc 2.95.2.
+
+=item *
+
+Unicos
+
+Fixed various alignment problems that lead into core dumps either
+during build or later; no longer dies on math errors at runtime;
+now using full quad integers (64 bits), previously was using
+only 46 bit integers for speed.
+
+=item *
+
+VMS
+
+See L</"Socket Extension Dynamic in VMS"> and L</"IEEE-format Floating Point
+Default on OpenVMS Alpha"> for important changes not otherwise listed here.
+
+chdir() now works better despite a CRT bug; now works with MULTIPLICITY
+(see INSTALL); now works with Perl's malloc.
+
+The tainting of C<%ENV> elements via C<keys> or C<values> was previously
+unimplemented.  It now works as documented.
+
+The C<waitpid> emulation has been improved.  The worst bug (now fixed)
+was that a pid of -1 would cause a wildcard search of all processes on
+the system.
+
+POSIX-style signals are now emulated much better on VMS versions prior
+to 7.0.
+
+The C<system> function and backticks operator have improved
+functionality and better error handling. [561]
+
+File access tests now use current process privileges rather than the
+user's default privileges, which could sometimes result in a mismatch
+between reported access and actual access.  This improvement is only
+available on VMS v6.0 and later.
+
+There is a new C<kill> implementation based on C<sys$sigprc> that allows
+older VMS systems (pre-7.0) to use C<kill> to send signals rather than
+simply force exit.  This implementation also allows later systems to
+call C<kill> from within a signal handler.
+
+Iterative logical name translations are now limited to 10 iterations in
+imitation of SHOW LOGICAL and other OpenVMS facilities.
+
+=item *
+
+Windows
+
+=over 8
+
+=item *
+
+Signal handling now works better than it used to.  It is now implemented
+using a Windows message loop, and is therefore less prone to random
+crashes.
+
+=item *
+
+fork() emulation is now more robust, but still continues to have a few
+esoteric bugs and caveats.  See L<perlfork> for details. [561+]
+
+=item *
+
+A failed (pseudo)fork now returns undef and sets errno to EAGAIN. [561]
+
+=item *
+
+The following modules now work on Windows:
+
+    ExtUtils::Embed         [561]
+    IO::Pipe
+    IO::Poll
+    Net::Ping
+
+=item *
+
+IO::File::new_tmpfile() is no longer limited to 32767 invocations
+per-process.
+
+=item *
+
+Better chdir() return value for a non-existent directory.
+
+=item *
+
+Compiling perl using the 64-bit Platform SDK tools is now supported.
+
+=item *
+
+The Win32::SetChildShowWindow() builtin can be used to control the
+visibility of windows created by child processes.  See L<Win32> for
+details.
+
+=item *
+
+Non-blocking waits for child processes (or pseudo-processes) are
+supported via C<waitpid($pid, &POSIX::WNOHANG)>.
+
+=item *
+
+The behavior of system() with multiple arguments has been rationalized.
+Each unquoted argument will be automatically quoted to protect whitespace,
+and any existing whitespace in the arguments will be preserved.  This
+improves the portability of system(@args) by avoiding the need for
+Windows C<cmd> shell specific quoting in perl programs.
+
+Note that this means that some scripts that may have relied on earlier
+buggy behavior may no longer work correctly.  For example,
+C<system("nmake /nologo", @args)> will now attempt to run the file
+C<nmake /nologo> and will fail when such a file isn't found.
+On the other hand, perl will now execute code such as
+C<system("c:/Program Files/MyApp/foo.exe", @args)> correctly.
+
+=item *
+
+The perl header files no longer suppress common warnings from the
+Microsoft Visual C++ compiler.  This means that additional warnings may
+now show up when compiling XS code.
+
+=item *
+
+Borland C++ v5.5 is now a supported compiler that can build Perl.
+However, the generated binaries continue to be incompatible with those
+generated by the other supported compilers (GCC and Visual C++). [561]
+
+=item *
+
+Duping socket handles with open(F, ">&MYSOCK") now works under Windows 9x.
+[561]
+
+=item *
+
+Current directory entries in %ENV are now correctly propagated to child
+processes. [561]
+
+=item *
+
+New %ENV entries now propagate to subprocesses. [561]
+
+=item *
+
+Win32::GetCwd() correctly returns C:\ instead of C: when at the drive root.
+Other bugs in chdir() and Cwd::cwd() have also been fixed. [561]
+
+=item *
+
+The makefiles now default to the features enabled in ActiveState ActivePerl
+(a popular Win32 binary distribution). [561]
+
+=item *
+
+HTML files will now be installed in c:\perl\html instead of
+c:\perl\lib\pod\html
+
+=item *
+
+REG_EXPAND_SZ keys are now allowed in registry settings used by perl. [561]
+
+=item *
+
+Can now send() from all threads, not just the first one. [561]
+
+=item *
+
+ExtUtils::MakeMaker now uses $ENV{LIB} to search for libraries. [561]
+
+=item *
+
+Less stack reserved per thread so that more threads can run
+concurrently. (Still 16M per thread.) [561]
+
+=item *
+
+C<< File::Spec->tmpdir() >> now prefers C:/temp over /tmp
+(works better when perl is running as service).
+
+=item *
+
+Better UNC path handling under ithreads. [561]
+
+=item *
+
+wait(), waitpid(), and backticks now return the correct exit status
+under Windows 9x. [561]
+
+=item *
+
+A socket handle leak in accept() has been fixed. [561]
+
+=back
+
+=back
+
+=head1 New or Changed Diagnostics
+
+Please see L<perldiag> for more details.
+
+=over 4
+
+=item *
+
+Ambiguous range in the transliteration operator (like a-z-9) now
+gives a warning.
+
+=item *
+
+chdir("") and chdir(undef) now give a deprecation warning because they
+cause a possible unintentional chdir to the home directory.
+Say chdir() if you really mean that.
+
+=item *
+
+Two new debugging options have been added: if you have compiled your
+Perl with debugging, you can use the -DT [561] and -DR options to trace
+tokenising and to add reference counts to displaying variables,
+respectively.
+
+=item *
+
+The lexical warnings category "deprecated" is no longer a sub-category
+of the "syntax" category. It is now a top-level category in its own
+right.
+
+=item *
+
+Unadorned dump() will now give a warning suggesting to
+use explicit CORE::dump() if that's what really is meant.
+
+=item *
+
+The "Unrecognized escape" warning has been extended to include C<\8>,
+C<\9>, and C<\_>.  There is no need to escape any of the C<\w> characters.
+
+=item *
+
+All regular expression compilation error messages are now hopefully
+easier to understand both because the error message now comes before
+the failed regex and because the point of failure is now clearly
+marked by a C<E<lt>-- HERE> marker.
+
+=item *
+
+Various I/O (and socket) functions like binmode(), close(), and so
+forth now more consistently warn if they are used illogically either
+on a yet unopened or on an already closed filehandle (or socket).
+
+=item *
+
+Using lstat() on a filehandle now gives a warning.  (It's a non-sensical
+thing to do.)
+
+=item *
+
+The C<-M> and C<-m> options now warn if you didn't supply the module name.
+
+=item *
+
+If you in C<use> specify a required minimum version, modules matching
+the name and but not defining a $VERSION will cause a fatal failure.
+
+=item *
+
+Using negative offset for vec() in lvalue context is now a warnable offense.
+
+=item *
+
+Odd number of arguments to overload::constant now elicits a warning.
+
+=item *
+
+Odd number of elements in anonymous hash now elicits a warning.
+
+=item *
+
+The various "opened only for", "on closed", "never opened" warnings
+drop the C<main::> prefix for filehandles in the C<main> package,
+for example C<STDIN> instead of C<main::STDIN>.
+
+=item *
+
+Subroutine prototypes are now checked more carefully, you may
+get warnings for example if you have used non-prototype characters.
+
+=item *
+
+If an attempt to use a (non-blessed) reference as an array index
+is made, a warning is given.
+
+=item *
+
+C<push @a;> and C<unshift @a;> (with no values to push or unshift)
+now give a warning.  This may be a problem for generated and evaled
+code.
+
+=item *
+
+If you try to L<perlfunc/pack> a number less than 0 or larger than 255
+using the C<"C"> format you will get an optional warning.  Similarly
+for the C<"c"> format and a number less than -128 or more than 127.
+
+=item *
+
+pack C<P> format now demands an explicit size.
+
+=item *
+
+unpack C<w> now warns of unterminated compressed integers.
+
+=item *
+
+Warnings relating to the use of PerlIO have been added.
+
+=item *
+
+Certain regex modifiers such as C<(?o)> make sense only if applied to
+the entire regex.  You will get an optional warning if you try to do
+otherwise.
+
+=item *
+
+Variable length lookbehind has not yet been implemented, trying to
+use it will tell that.
+
+=item *
+
+Using arrays or hashes as references (e.g. C<< %foo->{bar} >>
+has been deprecated for a while.  Now you will get an optional warning.
+
+=item *
+
+Warnings relating to the use of the new restricted hashes feature
+have been added.
+
+=item *
+
+Self-ties of arrays and hashes are not supported and fatal errors
+will happen even at an attempt to do so.
+
+=item *
+
+Using C<sort> in scalar context now issues an optional warning.
+This didn't do anything useful, as the sort was not performed.
+
+=item *
+
+Using the /g modifier in split() is meaningless and will cause a warning.
+
+=item *
+
+Using splice() past the end of an array now causes a warning.
+
+=item *
+
+Malformed Unicode encodings (UTF-8 and UTF-16) cause a lot of warnings,
+as does trying to use UTF-16 surrogates (which are unimplemented).
+
+=item *
+
+Trying to use Unicode characters on an I/O stream without marking the
+stream's encoding (using open() or binmode()) will cause "Wide character"
+warnings.
+
+=item *
+
+Use of v-strings in use/require causes a (backward) portability warning.
+
+=item *
+
+Warnings relating to the use interpreter threads and their shared data
+have been added.
+
+=back
+
+=head1 Changed Internals
+
+=over 4
+
+=item *
+
+PerlIO is now the default.
+
+=item *
+
+perlapi.pod (a companion to perlguts) now attempts to document the
+internal API.
+
+=item *
+
+You can now build a really minimal perl called microperl.
+Building microperl does not require even running Configure;
+C<make -f Makefile.micro> should be enough.  Beware: microperl makes
+many assumptions, some of which may be too bold; the resulting
+executable may crash or otherwise misbehave in wondrous ways.
+For careful hackers only.
+
+=item *
+
+Added rsignal(), whichsig(), do_join(), op_clear, op_null,
+ptr_table_clear(), ptr_table_free(), sv_setref_uv(), and several UTF-8
+interfaces to the publicised API.  For the full list of the available
+APIs see L<perlapi>.
+
+=item *
+
+Made possible to propagate customised exceptions via croak()ing.
+
+=item *
+
+Now xsubs can have attributes just like subs.  (Well, at least the
+built-in attributes.)
+
+=item *
+
+dTHR and djSP have been obsoleted; the former removed (because it's
+a no-op) and the latter replaced with dSP.
+
+=item *
+
+PERL_OBJECT has been completely removed.
+
+=item *
+
+The MAGIC constants (e.g. C<'P'>) have been macrofied
+(e.g. C<PERL_MAGIC_TIED>) for better source code readability
+and maintainability.
+
+=item *
+
+The regex compiler now maintains a structure that identifies nodes in
+the compiled bytecode with the corresponding syntactic features of the
+original regex expression.  The information is attached to the new
+C<offsets> member of the C<struct regexp>. See L<perldebguts> for more
+complete information.
+
+=item *
+
+The C code has been made much more C<gcc -Wall> clean.  Some warning
+messages still remain in some platforms, so if you are compiling with
+gcc you may see some warnings about dubious practices.  The warnings
+are being worked on.
+
+=item *
+
+F<perly.c>, F<sv.c>, and F<sv.h> have now been extensively commented.
+
+=item *
+
+Documentation on how to use the Perl source repository has been added
+to F<Porting/repository.pod>.
+
+=item *
+
+There are now several profiling make targets.
+
+=back
+
+=head1 Security Vulnerability Closed [561]
+
+(This change was already made in 5.7.0 but bears repeating here.)
+(5.7.0 came out before 5.6.1: the development branch 5.7 released
+earlier than the maintenance branch 5.6)
+
+A potential security vulnerability in the optional suidperl component
+of Perl was identified in August 2000.  suidperl is neither built nor
+installed by default.  As of November 2001 the only known vulnerable
+platform is Linux, most likely all Linux distributions.  CERT and
+various vendors and distributors have been alerted about the vulnerability.
+See http://www.cpan.org/src/5.0/sperl-2000-08-05/sperl-2000-08-05.txt
+for more information.
+
+The problem was caused by Perl trying to report a suspected security
+exploit attempt using an external program, /bin/mail.  On Linux
+platforms the /bin/mail program had an undocumented feature which
+when combined with suidperl gave access to a root shell, resulting in
+a serious compromise instead of reporting the exploit attempt.  If you
+don't have /bin/mail, or if you have 'safe setuid scripts', or if
+suidperl is not installed, you are safe.
+
+The exploit attempt reporting feature has been completely removed from
+Perl 5.8.0 (and the maintenance release 5.6.1, and it was removed also
+from all the Perl 5.7 releases), so that particular vulnerability
+isn't there anymore.  However, further security vulnerabilities are,
+unfortunately, always possible.  The suidperl functionality is most
+probably going to be removed in Perl 5.10.  In any case, suidperl
+should only be used by security experts who know exactly what they are
+doing and why they are using suidperl instead of some other solution
+such as sudo ( see http://www.courtesan.com/sudo/ ).
+
+=head1 New Tests
+
+Several new tests have been added, especially for the F<lib> and
+F<ext> subsections.  There are now about 69 000 individual tests
+(spread over about 700 test scripts), in the regression suite (5.6.1
+has about 11 700 tests, in 258 test scripts)  The exact numbers depend
+on the platform and Perl configuration used.  Many of the new tests
+are of course introduced by the new modules, but still in general Perl
+is now more thoroughly tested.
+
+Because of the large number of tests, running the regression suite
+will take considerably longer time than it used to: expect the suite
+to take up to 4-5 times longer to run than in perl 5.6.  On a really
+fast machine you can hope to finish the suite in about 6-8 minutes
+(wallclock time).
+
+The tests are now reported in a different order than in earlier Perls.
+(This happens because the test scripts from under t/lib have been moved
+to be closer to the library/extension they are testing.)
+
+=head1 Known Problems
+
+=head2 The Compiler Suite Is Still Very Experimental
+
+The compiler suite is slowly getting better but it continues to be
+highly experimental.  Use in production environments is discouraged.
+
+=head2 Localising Tied Arrays and Hashes Is Broken
+
+    local %tied_array;
+
+doesn't work as one would expect: the old value is restored
+incorrectly.  This will be changed in a future release, but we don't
+know yet what the new semantics will exactly be.  In any case, the
+change will break existing code that relies on the current
+(ill-defined) semantics, so just avoid doing this in general.
+
+=head2 Building Extensions Can Fail Because Of Largefiles
+
+Some extensions like mod_perl are known to have issues with
+`largefiles', a change brought by Perl 5.6.0 in which file offsets
+default to 64 bits wide, where supported.  Modules may fail to compile
+at all, or they may compile and work incorrectly.  Currently, there
+is no good solution for the problem, but Configure now provides
+appropriate non-largefile ccflags, ldflags, libswanted, and libs
+in the %Config hash (e.g., $Config{ccflags_nolargefiles}) so the
+extensions that are having problems can try configuring themselves
+without the largefileness.  This is admittedly not a clean solution,
+and the solution may not even work at all.  One potential failure is
+whether one can (or, if one can, whether it's a good idea to) link
+together at all binaries with different ideas about file offsets;
+all this is platform-dependent.
+
+=head2 Modifying $_ Inside for(..)
+
+   for (1..5) { $_++ }
+
+works without complaint.  It shouldn't.  (You should be able to
+modify only lvalue elements inside the loops.)  You can see the
+correct behaviour by replacing the 1..5 with 1, 2, 3, 4, 5.
+
+=head2 mod_perl 1.26 Doesn't Build With Threaded Perl
+
+Use mod_perl 1.27 or higher.
+
+=head2 lib/ftmp-security tests warn 'system possibly insecure'
+
+Don't panic.  Read the 'make test' section of INSTALL instead.
+
+=head2 libwww-perl (LWP) fails base/date #51
+
+Use libwww-perl 5.65 or later.
+
+=head2 PDL failing some tests
+
+Use PDL 2.3.4 or later.
+
+=head2 Perl_get_sv
+
+You may get errors like 'Undefined symbol "Perl_get_sv"' or "can't
+resolve symbol 'Perl_get_sv'", or the symbol may be "Perl_sv_2pv".
+This probably means that you are trying to use an older shared Perl
+library (or extensions linked with such) with Perl 5.8.0 executable.
+Perl used to have such a subroutine, but that is no more the case.
+Check your shared library path, and any shared Perl libraries in those
+directories.
+
+Sometimes this problem may also indicate a partial Perl 5.8.0
+installation, see L</"Mac OS X dyld undefined symbols"> for an
+example and how to deal with it.
+
+=head2 Self-tying Problems
+
+Self-tying of arrays and hashes is broken in rather deep and
+hard-to-fix ways.  As a stop-gap measure to avoid people from getting
+frustrated at the mysterious results (core dumps, most often), it is
+forbidden for now (you will get a fatal error even from an attempt).
+
+A change to self-tying of globs has caused them to be recursively
+referenced (see: L<perlobj/"Two-Phased Garbage Collection">).  You
+will now need an explicit untie to destroy a self-tied glob.  This
+behaviour may be fixed at a later date.
+
+Self-tying of scalars and IO thingies works.
+
+=head2 ext/threads/t/libc
+
+If this test fails, it indicates that your libc (C library) is not
+threadsafe.  This particular test stress tests the localtime() call to
+find out whether it is threadsafe.  See L<perlthrtut> for more information.
+
+=head2 Failure of Thread (5.005-style) tests
+
+B<Note that support for 5.005-style threading is deprecated,
+experimental and practically unsupported.  In 5.10, it is expected
+to be removed.  You should migrate your code to ithreads.>
+
+The following tests are known to fail due to fundamental problems in
+the 5.005 threading implementation. These are not new failures--Perl
+5.005_0x has the same bugs, but didn't have these tests.
+
+ ../ext/B/t/xref.t                    255 65280    14   12  85.71%  3-14
+ ../ext/List/Util/t/first.t           255 65280     7    4  57.14%  2 5-7
+ ../lib/English.t                       2   512    54    2   3.70%  2-3
+ ../lib/FileCache.t                                 5    1  20.00%  5
+ ../lib/Filter/Simple/t/data.t                      6    3  50.00%  1-3
+ ../lib/Filter/Simple/t/filter_only.                9    3  33.33%  1-2 5
+ ../lib/Math/BigInt/t/bare_mbf.t                 1627    4   0.25%  8 11 1626-1627
+ ../lib/Math/BigInt/t/bigfltpm.t                 1629    4   0.25%  10 13 1628-
+                                                                    1629
+ ../lib/Math/BigInt/t/sub_mbf.t                  1633    4   0.24%  8 11 1632-1633
+ ../lib/Math/BigInt/t/with_sub.t                 1628    4   0.25%  9 12 1627-1628
+ ../lib/Tie/File/t/31_autodefer.t     255 65280    65   32  49.23%  34-65
+ ../lib/autouse.t                                  10    1  10.00%  4
+ op/flip.t                                         15    1   6.67%  15
+
+These failures are unlikely to get fixed as 5.005-style threads
+are considered fundamentally broken.  (Basically what happens is that
+competing threads can corrupt shared global state, one good example
+being regular expression engine's state.)
+
+=head2 Timing problems
+
+The following tests may fail intermittently because of timing
+problems, for example if the system is heavily loaded.
+
+    t/op/alarm.t
+    ext/Time/HiRes/HiRes.t
+    lib/Benchmark.t
+    lib/Memoize/t/expmod_t.t
+    lib/Memoize/t/speed.t
+
+In case of failure please try running them manually, for example
+
+    ./perl -Ilib ext/Time/HiRes/HiRes.t
+
+=head2 Tied/Magical Array/Hash Elements Do Not Autovivify
+
+For normal arrays C<$foo = \$bar[1]> will assign C<undef> to
+C<$bar[1]> (assuming that it didn't exist before), but for
+tied/magical arrays and hashes such autovivification does not happen
+because there is currently no way to catch the reference creation.
+The same problem affects slicing over non-existent indices/keys of
+a tied/magical array/hash.
+
+=head2 Unicode in package/class and subroutine names does not work
+
+One can have Unicode in identifier names, but not in package/class or
+subroutine names.  While some limited functionality towards this does
+exist as of Perl 5.8.0, that is more accidental than designed; use of
+Unicode for the said purposes is unsupported.
+
+One reason of this unfinishedness is its (currently) inherent
+unportability: since both package names and subroutine names may
+need to be mapped to file and directory names, the Unicode capability
+of the filesystem becomes important-- and there unfortunately aren't
+portable answers.
+
+=head1 Platform Specific Problems
+
+=head2 AIX
+
+=over 4
+
+=item *
+
+If using the AIX native make command, instead of just "make" issue
+"make all".  In some setups the former has been known to spuriously
+also try to run "make install".  Alternatively, you may want to use
+GNU make.
+
+=item *
+
+In AIX 4.2, Perl extensions that use C++ functions that use statics
+may have problems in that the statics are not getting initialized.
+In newer AIX releases, this has been solved by linking Perl with
+the libC_r library, but unfortunately in AIX 4.2 the said library
+has an obscure bug where the various functions related to time
+(such as time() and gettimeofday()) return broken values, and
+therefore in AIX 4.2 Perl is not linked against libC_r.
+
+=item *
+
+vac 5.0.0.0 May Produce Buggy Code For Perl
+
+The AIX C compiler vac version 5.0.0.0 may produce buggy code,
+resulting in a few random tests failing when run as part of "make
+test", but when the failing tests are run by hand, they succeed.
+We suggest upgrading to at least vac version 5.0.1.0, that has been
+known to compile Perl correctly.  "lslpp -L|grep vac.C" will tell
+you the vac version.  See README.aix.
+
+=item *
+
+If building threaded Perl, you may get compilation warning from pp_sys.c:
+
+  "pp_sys.c", line 4651.39: 1506-280 (W) Function argument assignment between types "unsigned char*" and "const void*" is not allowed.
+
+This is harmless; it is caused by the getnetbyaddr() and getnetbyaddr_r()
+having slightly different types for their first argument.
+
+=back
+
+=head2 Alpha systems with old gccs fail several tests
+
+If you see op/pack, op/pat, op/regexp, or ext/Storable tests failing
+in a Linux/alpha or *BSD/Alpha, it's probably time to upgrade your gcc.
+gccs prior to 2.95.3 are definitely not good enough, and gcc 3.1 may
+be even better.  (RedHat Linux/alpha with gcc 3.1 reported no problems,
+as did Linux 2.4.18 with gcc 2.95.4.)  (In Tru64, it is preferable to
+use the bundled C compiler.)
+
+=head2 AmigaOS
+
+Perl 5.8.0 doesn't build in AmigaOS.  It broke at some point during
+the ithreads work and we could not find Amiga experts to unbreak the
+problems.  Perl 5.6.1 still works for AmigaOS (as does the 5.7.2
+development release).
+
+=head2 BeOS
+
+The following tests fail on 5.8.0 Perl in BeOS Personal 5.03:
+
+ t/op/lfs............................FAILED at test 17
+ t/op/magic..........................FAILED at test 24
+ ext/Fcntl/t/syslfs..................FAILED at test 17
+ ext/File/Glob/t/basic...............FAILED at test 3
+ ext/POSIX/t/sigaction...............FAILED at test 13
+ ext/POSIX/t/waitpid.................FAILED at test 1
+
+See L<perlbeos> (README.beos) for more details.
+
+=head2 Cygwin "unable to remap"
+
+For example when building the Tk extension for Cygwin,
+you may get an error message saying "unable to remap".
+This is known problem with Cygwin, and a workaround is
+detailed in here: http://sources.redhat.com/ml/cygwin/2001-12/msg00894.html
+
+=head2 Cygwin ndbm tests fail on FAT
+
+One can build but not install (or test the build of) the NDBM_File
+on FAT filesystems.  Installation (or build) on NTFS works fine.
+If one attempts the test on a FAT install (or build) the following
+failures are expected:
+
+ ../ext/NDBM_File/ndbm.t       13  3328    71   59  83.10%  1-2 4 16-71
+ ../ext/ODBM_File/odbm.t      255 65280    ??   ??       %  ??
+ ../lib/AnyDBM_File.t           2   512    12    2  16.67%  1 4
+ ../lib/Memoize/t/errors.t      0   139    11    5  45.45%  7-11
+ ../lib/Memoize/t/tie_ndbm.t   13  3328     4    4 100.00%  1-4
+ run/fresh_perl.t                          97    1   1.03%  91
+
+NDBM_File fails and ODBM_File just coredumps.
+
+If you intend to run only on FAT (or if using AnyDBM_File on FAT),
+run Configure with the -Ui_ndbm and -Ui_dbm options to prevent
+NDBM_File and ODBM_File being built.
+
+=head2 DJGPP Failures
+
+ t/op/stat............................FAILED at test 29
+ lib/File/Find/t/find.................FAILED at test 1
+ lib/File/Find/t/taint................FAILED at test 1
+ lib/h2xs.............................FAILED at test 15
+ lib/Pod/t/eol........................FAILED at test 1
+ lib/Test/Harness/t/strap-analyze.....FAILED at test 8
+ lib/Test/Harness/t/test-harness......FAILED at test 23
+ lib/Test/Simple/t/exit...............FAILED at test 1
+
+The above failures are known as of 5.8.0 with native builds with long
+filenames, but there are a few more if running under dosemu because of
+limitations (and maybe bugs) of dosemu:
+
+ t/comp/cpp...........................FAILED at test 3
+ t/op/inccode.........................(crash)
+
+and a few lib/ExtUtils tests, and several hundred Encode/t/Aliases.t
+failures that work fine with long filenames.  So you really might
+prefer native builds and long filenames.
+
+=head2 FreeBSD built with ithreads coredumps reading large directories
+
+This is a known bug in FreeBSD 4.5's readdir_r(), it has been fixed in
+FreeBSD 4.6 (see L<perlfreebsd> (README.freebsd)).
+
+=head2 FreeBSD Failing locale Test 117 For ISO 8859-15 Locales
+
+The ISO 8859-15 locales may fail the locale test 117 in FreeBSD.
+This is caused by the characters \xFF (y with diaeresis) and \xBE
+(Y with diaeresis) not behaving correctly when being matched
+case-insensitively.  Apparently this problem has been fixed in
+the latest FreeBSD releases.
+( http://www.freebsd.org/cgi/query-pr.cgi?pr=34308 )
+
+=head2 IRIX fails ext/List/Util/t/shuffle.t or Digest::MD5
+
+IRIX with MIPSpro 7.3.1.2m or 7.3.1.3m compiler may fail the List::Util
+test ext/List/Util/t/shuffle.t by dumping core.  This seems to be
+a compiler error since if compiled with gcc no core dump ensues, and
+no failures have been seen on the said test on any other platform.
+
+Similarly, building the Digest::MD5 extension has been
+known to fail with "*** Termination code 139 (bu21)".
+
+The cure is to drop optimization level (Configure -Doptimize=-O2).
+
+=head2 HP-UX lib/posix Subtest 9 Fails When LP64-Configured
+
+If perl is configured with -Duse64bitall, the successful result of the
+subtest 10 of lib/posix may arrive before the successful result of the
+subtest 9, which confuses the test harness so much that it thinks the
+subtest 9 failed.
+
+=head2 Linux with glibc 2.2.5 fails t/op/int subtest #6 with -Duse64bitint
+
+This is a known bug in the glibc 2.2.5 with long long integers.
+( http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=65612 )
+
+=head2 Linux With Sfio Fails op/misc Test 48
+
+No known fix.
+
+=head2 Mac OS X
+
+Please remember to set your environment variable LC_ALL to "C"
+(setenv LC_ALL C) before running "make test" to avoid a lot of
+warnings about the broken locales of Mac OS X.
+
+The following tests are known to fail in Mac OS X 10.1.5 because of
+buggy (old) implementations of Berkeley DB included in Mac OS X:
+
+ Failed Test                 Stat Wstat Total Fail  Failed  List of Failed
+ -------------------------------------------------------------------------
+ ../ext/DB_File/t/db-btree.t    0    11    ??   ??       %  ??
+ ../ext/DB_File/t/db-recno.t              149    3   2.01%  61 63 65
+
+If you are building on a UFS partition, you will also probably see
+t/op/stat.t subtest #9 fail.  This is caused by Darwin's UFS not
+supporting inode change time.
+
+Also the ext/POSIX/t/posix.t subtest #10 fails but it is skipped for
+now because the failure is Apple's fault, not Perl's (blocked signals
+are lost).
+
+If you Configure with ithreads, ext/threads/t/libc.t will fail. Again,
+this is not Perl's fault-- the libc of Mac OS X is not threadsafe
+(in this particular test, the localtime() call is found to be
+threadunsafe.)
+
+=head2 Mac OS X dyld undefined symbols
+
+If after installing Perl 5.8.0 you are getting warnings about missing
+symbols, for example
+
+    dyld: perl Undefined symbols
+    _perl_sv_2pv
+    _perl_get_sv
+
+you probably have an old pre-Perl-5.8.0 installation (or parts of one)
+in /Library/Perl (the undefined symbols used to exist in pre-5.8.0 Perls).
+It seems that for some reason "make install" doesn't always completely
+overwrite the files in /Library/Perl.  You can move the old Perl
+shared library out of the way like this:
+
+    cd /Library/Perl/darwin/CORE
+    mv libperl.dylib libperlold.dylib
+
+and then reissue "make install".  Note that the above of course is
+extremely disruptive for anything using the /usr/local/bin/perl.
+If that doesn't help, you may have to try removing all the .bundle
+files from beneath /Library/Perl, and again "make install"-ing.
+
+=head2 OS/2 Test Failures
+
+The following tests are known to fail on OS/2 (for clarity
+only the failures are shown, not the full error messages):
+
+ ../lib/ExtUtils/t/Mkbootstrap.t    1   256    18    1   5.56%  8
+ ../lib/ExtUtils/t/Packlist.t       1   256    34    1   2.94%  17
+ ../lib/ExtUtils/t/basic.t          1   256    17    1   5.88%  14
+ lib/os2_process.t                  2   512   227    2   0.88%  174 209
+ lib/os2_process_kid.t                        227    2   0.88%  174 209
+ lib/rx_cmprt.t                   255 65280    18    3  16.67%  16-18
+
+=head2 op/sprintf tests 91, 129, and 130
+
+The op/sprintf tests 91, 129, and 130 are known to fail on some platforms.
+Examples include any platform using sfio, and Compaq/Tandem's NonStop-UX.
+
+Test 91 is known to fail on QNX6 (nto), because C<sprintf '%e',0>
+incorrectly produces C<0.000000e+0> instead of C<0.000000e+00>.
+
+For tests 129 and 130, the failing platforms do not comply with
+the ANSI C Standard: lines 19ff on page 134 of ANSI X3.159 1989, to
+be exact.  (They produce something other than "1" and "-1" when
+formatting 0.6 and -0.6 using the printf format "%.0f"; most often,
+they produce "0" and "-0".)
+
+=head2 SCO
+
+The socketpair tests are known to be unhappy in SCO 3.2v5.0.4:
+
+ ext/Socket/socketpair.t...............FAILED tests 15-45
+
+=head2 Solaris 2.5
+
+In case you are still using Solaris 2.5 (aka SunOS 5.5), you may
+experience failures (the test core dumping) in lib/locale.t.
+The suggested cure is to upgrade your Solaris.
+
+=head2 Solaris x86 Fails Tests With -Duse64bitint
+
+The following tests are known to fail in Solaris x86 with Perl
+configured to use 64 bit integers:
+
+ ext/Data/Dumper/t/dumper.............FAILED at test 268
+ ext/Devel/Peek/Peek..................FAILED at test 7
+
+=head2 SUPER-UX (NEC SX)
+
+The following tests are known to fail on SUPER-UX:
+
+ op/64bitint...........................FAILED tests 29-30, 32-33, 35-36
+ op/arith..............................FAILED tests 128-130
+ op/pack...............................FAILED tests 25-5625
+ op/pow................................
+ op/taint..............................# msgsnd failed
+ ../ext/IO/lib/IO/t/io_poll............FAILED tests 3-4
+ ../ext/IPC/SysV/ipcsysv...............FAILED tests 2, 5-6
+ ../ext/IPC/SysV/t/msg.................FAILED tests 2, 4-6
+ ../ext/Socket/socketpair..............FAILED tests 12
+ ../lib/IPC/SysV.......................FAILED tests 2, 5-6
+ ../lib/warnings.......................FAILED tests 115-116, 118-119
+
+The op/pack failure ("Cannot compress negative numbers at op/pack.t line 126")
+is serious but as of yet unsolved.  It points at some problems with the
+signedness handling of the C compiler, as do the 64bitint, arith, and pow
+failures.  Most of the rest point at problems with SysV IPC.
+
+=head2 Term::ReadKey not working on Win32
+
+Use Term::ReadKey 2.20 or later.
+
+=head2 UNICOS/mk
+
+=over 4
+
+=item *
+
+During Configure, the test
+
+    Guessing which symbols your C compiler and preprocessor define...
+
+will probably fail with error messages like
+
+    CC-20 cc: ERROR File = try.c, Line = 3
+      The identifier "bad" is undefined.
+
+      bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
+      ^
+
+    CC-65 cc: ERROR File = try.c, Line = 3
+      A semicolon is expected at this point.
+
+This is caused by a bug in the awk utility of UNICOS/mk.  You can ignore
+the error, but it does cause a slight problem: you cannot fully
+benefit from the h2ph utility (see L<h2ph>) that can be used to
+convert C headers to Perl libraries, mainly used to be able to access
+from Perl the constants defined using C preprocessor, cpp.  Because of
+the above error, parts of the converted headers will be invisible.
+Luckily, these days the need for h2ph is rare.
+
+=item *
+
+If building Perl with interpreter threads (ithreads), the
+getgrent(), getgrnam(), and getgrgid() functions cannot return the
+list of the group members due to a bug in the multithreaded support of
+UNICOS/mk.  What this means is that in list context the functions will
+return only three values, not four.
+
+=back
+
+=head2 UTS
+
+There are a few known test failures, see L<perluts> (README.uts).
+
+=head2 VOS (Stratus)
+
+When Perl is built using the native build process on VOS Release
+14.5.0 and GNU C++/GNU Tools 2.0.1, all attempted tests either
+pass or result in TODO (ignored) failures.
+
+=head2 VMS
+
+There should be no reported test failures with a default configuration,
+though there are a number of tests marked TODO that point to areas
+needing further debugging and/or porting work.
+
+=head2 Win32
+
+In multi-CPU boxes, there are some problems with the I/O buffering:
+some output may appear twice.
+
+=head2 XML::Parser not working
+
+Use XML::Parser 2.31 or later.
+
+=head2 z/OS (OS/390)
+
+z/OS has rather many test failures but the situation is actually much
+better than it was in 5.6.0; it's just that so many new modules and
+tests have been added.
+
+ Failed Test                   Stat Wstat Total Fail  Failed  List of Failed
+ ---------------------------------------------------------------------------
+ ../ext/Data/Dumper/t/dumper.t              357    8   2.24%  311 314 325 327
+                                                              331 333 337 339
+ ../ext/IO/lib/IO/t/io_unix.t                 5    4  80.00%  2-5
+ ../ext/Storable/t/downgrade.t   12  3072   169   12   7.10%  14-15 46-47 78-79
+                                                              110-111 150 161
+ ../lib/ExtUtils/t/Constant.t   121 30976    48   48 100.00%  1-48
+ ../lib/ExtUtils/t/Embed.t                    9    9 100.00%  1-9
+ op/pat.t                                   922    7   0.76%  665 776 785 832-
+                                                              834 845
+ op/sprintf.t                               224    3   1.34%  98 100 136
+ op/tr.t                                     97    5   5.15%  63 71-74
+ uni/fold.t                                 780    6   0.77%  61 169 196 661
+                                                              710-711
+
+The failures in dumper.t and downgrade.t are problems in the tests,
+those in io_unix and sprintf are problems in the USS (UDP sockets and
+printf formats).  The pat, tr, and fold failures are genuine Perl
+problems caused by EBCDIC (and in the pat and fold cases, combining
+that with Unicode).  The Constant and Embed are probably problems in
+the tests (since they test Perl's ability to build extensions, and
+that seems to be working reasonably well.)
+
+=head2 Unicode Support on EBCDIC Still Spotty
+
+Though mostly working, Unicode support still has problem spots on
+EBCDIC platforms.  One such known spot are the C<\p{}> and C<\P{}>
+regular expression constructs for code points less than 256: the
+C<pP> are testing for Unicode code points, not knowing about EBCDIC.
+
+=head2 Seen In Perl 5.7 But Gone Now
+
+C<Time::Piece> (previously known as C<Time::Object>) was removed
+because it was felt that it didn't have enough value in it to be a
+core module.  It is still a useful module, though, and is available
+from the CPAN.
+
+Perl 5.8 unfortunately does not build anymore on AmigaOS; this broke
+accidentally at some point.  Since there are not that many Amiga
+developers available, we could not get this fixed and tested in time
+for 5.8.0.  Perl 5.6.1 still works for AmigaOS (as does the 5.7.2
+development release).
+
+The C<PerlIO::Scalar> and C<PerlIO::Via> (capitalised) were renamed as
+C<PerlIO::scalar> and C<PerlIO::via> (all lowercase) just before 5.8.0.
+The main rationale was to have all core PerlIO layers to have all
+lowercase names.  The "plugins" are named as usual, for example
+C<PerlIO::via::QuotedPrint>.
+
+The C<threads::shared::queue> and C<threads::shared::semaphore> were
+renamed as C<Thread::Queue> and C<Thread::Semaphore> just before 5.8.0.
+The main rationale was to have thread modules to obey normal naming,
+C<Thread::> (the C<threads> and C<threads::shared> themselves are
+more pragma-like, they affect compile-time, so they stay lowercase).
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org/ .  There may also be
+information at http://www.perl.com/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Jarkko Hietaniemi <F<jhi@iki.fi>>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlaix.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlaix.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlaix.pod	(revision 14489)
@@ -0,0 +1,270 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.aix - Perl version 5 on IBM Unix (AIX) systems
+
+=head1 DESCRIPTION
+
+This document describes various features of IBM's Unix operating
+system (AIX) that will affect how Perl version 5 (hereafter just Perl)
+is compiled and/or runs.
+
+=head2 Compiling Perl 5 on AIX
+
+When compiling Perl, you must use an ANSI C compiler. AIX does not ship
+an ANSI compliant C-compiler with AIX by default, but binary builds of
+gcc for AIX are widely available.
+
+At the moment of writing, AIX supports two different native C compilers,
+for which you have to pay: B<xlC> and B<vac>. If you decide to use either
+of these two (which is quite a lot easier than using gcc), be sure to
+upgrade to the latest available patch level. Currently:
+
+    xlC.C     3.1.4.10 or 3.6.6.0 or 4.0.2.2 or 5.0.2.9 or 6.0.0.3
+    vac.C     4.4.0.3  or 5.0.2.6 or 6.0.0.1
+
+note that xlC has the OS version in the name as of version 4.0.2.0, so
+you will find xlC.C for AIX-5.0 as package
+
+    xlC.aix50.rte   5.0.2.0 or 6.0.0.3
+
+subversions are not the same "latest" on all OS versions. For example,
+the latest xlC-5 on aix41 is 5.0.2.9, while on aix43, it is 5.0.2.7.
+
+Perl can be compiled with either IBM's ANSI C compiler or with gcc.
+The former is recommended, as not only can it compile Perl with no
+difficulty, but also can take advantage of features listed later that
+require the use of IBM compiler-specific command-line flags.
+
+The IBM's compiler patch levels 5.0.0.0 and 5.0.1.0 have compiler
+optimization bugs that affect compiling perl.c and regcomp.c,
+respectively.  If Perl's configuration detects those compiler patch
+levels, optimization is turned off for the said source code files.
+Upgrading to at least 5.0.2.0 is recommended.
+
+If you decide to use gcc, make sure your installation is recent and
+complete, and be sure to read the Perl README file for more gcc-specific
+details. Please report any hoops you had to jump through to the development
+team.
+
+=head2 OS level
+
+Before installing the patches to the IBM C-compiler you need to know the
+level of patching for the Operating System. IBM's command 'oslevel' will
+show the base, but is not always complete (in this example oslevel shows
+4.3.NULL, whereas the system might run most of 4.3.THREE):
+
+    # oslevel
+    4.3.0.0
+    # lslpp -l | grep 'bos.rte '
+    bos.rte           4.3.3.75  COMMITTED  Base Operating System Runtime
+    bos.rte            4.3.2.0  COMMITTED  Base Operating System Runtime
+    #
+
+The same might happen to AIX 5.1 or other OS levels. As a side note, perl
+cannot be built without bos.adt.syscalls and bos.adt.libm installed
+
+    # lslpp -l | egrep "syscalls|libm"
+    bos.adt.libm      5.1.0.25  COMMITTED  Base Application Development
+    bos.adt.syscalls  5.1.0.36  COMMITTED  System Calls Application
+    #
+
+=head2 Building Dynamic Extensions on AIX
+
+AIX supports dynamically loadable objects as well as shared libraries.
+Shared libraries by convention end with the suffix .a, which is a bit
+misleading, as an archive can contain static as well as dynamic members.
+For perl dynamically loaded objects we use the .so suffix also used on
+many other platforms.
+
+Note that starting from Perl 5.7.2 (and consequently 5.8.0) and AIX 4.3
+or newer Perl uses the AIX native dynamic loading interface in the so
+called runtime linking mode instead of the emulated interface that was
+used in Perl releases 5.6.1 and earlier or, for AIX releases 4.2 and
+earlier.  This change does break backward compatibility with compiled
+modules from earlier perl releases.  The change was made to make Perl
+more compliant with other applications like Apache/mod_perl which are
+using the AIX native interface. This change also enables the use of C++
+code with static constructors and destructors in perl extensions, which
+was not possible using the emulated interface.
+
+=head2 The IBM ANSI C Compiler
+
+All defaults for Configure can be used.
+
+If you've chosen to use vac 4, be sure to run 4.4.0.3. Older versions
+will turn up nasty later on. For vac 5 be sure to run at least 5.0.1.0,
+but vac 5.0.2.6 or up is highly recommended. Note that since IBM has
+removed vac 5.0.2.1 through 5.0.2.5 from the software depot, these
+versions should be considered obsolete.
+
+Here's a brief lead of how to upgrade the compiler to the latest
+level.  Of course this is subject to changes.  You can only upgrade
+versions from ftp-available updates if the first three digit groups
+are the same (in where you can skip intermediate unlike the patches
+in the developer snapshots of perl), or to one version up where the
+"base" is available.  In other words, the AIX compiler patches are
+cumulative.
+
+ vac.C.4.4.0.1 => vac.C.4.4.0.3  is OK     (vac.C.4.4.0.2 not needed)
+ xlC.C.3.1.3.3 => xlC.C.3.1.4.10 is NOT OK (xlC.C.3.1.4.0 is not available)
+
+ # ftp ftp.software.ibm.com
+ Connected to service.boulder.ibm.com.
+ : welcome message ...
+ Name (ftp.software.ibm.com:merijn): anonymous
+ 331 Guest login ok, send your complete e-mail address as password.
+ Password:
+ ... accepted login stuff
+ ftp> cd /aix/fixes/v4/
+ ftp> dir other other.ll
+ output to local-file: other.ll? y
+ 200 PORT command successful.
+ 150 Opening ASCII mode data connection for /bin/ls.
+ 226 Transfer complete.
+ ftp> dir xlc xlc.ll
+ output to local-file: xlc.ll? y
+ 200 PORT command successful.
+ 150 Opening ASCII mode data connection for /bin/ls.
+ 226 Transfer complete.
+ ftp> bye
+ ... goodbye messages
+ # ls -l *.ll
+ -rw-rw-rw-   1 merijn   system    1169432 Nov  2 17:29 other.ll
+ -rw-rw-rw-   1 merijn   system      29170 Nov  2 17:29 xlc.ll
+
+On AIX 4.2 using xlC, we continue:
+
+ # lslpp -l | fgrep 'xlC.C '
+   xlC.C                     3.1.4.9  COMMITTED  C for AIX Compiler
+   xlC.C                     3.1.4.0  COMMITTED  C for AIX Compiler
+ # grep 'xlC.C.3.1.4.*.bff' xlc.ll
+ -rw-r--r--   1 45776101 1        6286336 Jul 22 1996  xlC.C.3.1.4.1.bff
+ -rw-rw-r--   1 45776101 1        6173696 Aug 24 1998  xlC.C.3.1.4.10.bff
+ -rw-r--r--   1 45776101 1        6319104 Aug 14 1996  xlC.C.3.1.4.2.bff
+ -rw-r--r--   1 45776101 1        6316032 Oct 21 1996  xlC.C.3.1.4.3.bff
+ -rw-r--r--   1 45776101 1        6315008 Dec 20 1996  xlC.C.3.1.4.4.bff
+ -rw-rw-r--   1 45776101 1        6178816 Mar 28 1997  xlC.C.3.1.4.5.bff
+ -rw-rw-r--   1 45776101 1        6188032 May 22 1997  xlC.C.3.1.4.6.bff
+ -rw-rw-r--   1 45776101 1        6191104 Sep  5 1997  xlC.C.3.1.4.7.bff
+ -rw-rw-r--   1 45776101 1        6185984 Jan 13 1998  xlC.C.3.1.4.8.bff
+ -rw-rw-r--   1 45776101 1        6169600 May 27 1998  xlC.C.3.1.4.9.bff
+ # wget ftp://ftp.software.ibm.com/aix/fixes/v4/xlc/xlC.C.3.1.4.10.bff
+ #
+
+On AIX 4.3 using vac, we continue:
+
+ # lslpp -l | grep 'vac.C '
+  vac.C                      5.0.2.2  COMMITTED  C for AIX Compiler
+  vac.C                      5.0.2.0  COMMITTED  C for AIX Compiler
+ # grep 'vac.C.5.0.2.*.bff' other.ll
+ -rw-rw-r--   1 45776101 1        13592576 Apr 16 2001  vac.C.5.0.2.0.bff
+ -rw-rw-r--   1 45776101 1        14133248 Apr  9 2002  vac.C.5.0.2.3.bff
+ -rw-rw-r--   1 45776101 1        14173184 May 20 2002  vac.C.5.0.2.4.bff
+ -rw-rw-r--   1 45776101 1        14192640 Nov 22 2002  vac.C.5.0.2.6.bff
+ # wget ftp://ftp.software.ibm.com/aix/fixes/v4/other/vac.C.5.0.2.6.bff
+ #
+
+Likewise on all other OS levels. Then execute the following command, and
+fill in its choices
+
+ # smit install_update
+  -> Install and Update from LATEST Available Software
+  * INPUT device / directory for software [ vac.C.5.0.2.6.bff    ]
+  [ OK ]
+  [ OK ]
+
+Follow the messages ... and you're done.
+
+If you like a more web-like approach, a good start point can be
+http://www14.software.ibm.com/webapp/download/downloadaz.jsp and click
+"C for AIX", and follow the instructions.
+
+=head2 The usenm option
+
+If linking miniperl
+
+ cc -o miniperl ... miniperlmain.o opmini.o perl.o ... -lm -lc ...
+
+causes error like this
+
+ ld: 0711-317 ERROR: Undefined symbol: .aintl
+ ld: 0711-317 ERROR: Undefined symbol: .copysignl
+ ld: 0711-317 ERROR: Undefined symbol: .syscall
+ ld: 0711-317 ERROR: Undefined symbol: .eaccess
+ ld: 0711-317 ERROR: Undefined symbol: .setresuid
+ ld: 0711-317 ERROR: Undefined symbol: .setresgid
+ ld: 0711-317 ERROR: Undefined symbol: .setproctitle
+ ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
+
+you could retry with
+
+ make realclean
+ rm config.sh
+ ./Configure -Dusenm ...
+
+which makes Configure to use the C<nm> tool when scanning for library
+symbols, which usually is not done in AIX.
+
+Related to this, you probably should not use the C<-r> option of
+Configure in AIX, because that affects of how the C<nm> tool is used.
+
+=head2 Using GNU's gcc for building perl
+
+Using gcc-3.x (tested with 3.0.4, 3.1, and 3.2) now works out of the box,
+as do recent gcc-2.9 builds available directly from IBM as part of their
+Linux compatibility packages, available here:
+
+  http://www.ibm.com/servers/aix/products/aixos/linux/
+
+=head2 Using Large Files with Perl
+
+Should yield no problems.
+
+=head2 Threaded Perl
+
+Threads seem to work OK, though at the moment not all tests pass when
+threads are used in combination with 64-bit configurations.
+
+You may get a warning when doing a threaded build:
+
+  "pp_sys.c", line 4640.39: 1506-280 (W) Function argument assignment between types "unsigned char*" and "const void*" is not allowed.
+
+The exact line number may vary, but if the warning (W) comes from a line
+line this
+
+  hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
+
+in the "pp_ghostent" function, you may ignore it safely.  The warning
+is caused by the reentrant variant of gethostbyaddr() having a slightly
+different prototype than its non-reentrant variant, but the difference
+is not really significant here.
+
+=head2 64-bit Perl
+
+If your AIX is installed with 64-bit support, you can expect 64-bit
+configurations to work. In combination with threads some tests might
+still fail.
+
+=head2 AIX 4.2 and extensions using C++ with statics
+
+In AIX 4.2 Perl extensions that use C++ functions that use statics
+may have problems in that the statics are not getting initialized.
+In newer AIX releases this has been solved by linking Perl with
+the libC_r library, but unfortunately in AIX 4.2 the said library
+has an obscure bug where the various functions related to time
+(such as time() and gettimeofday()) return broken values, and
+therefore in AIX 4.2 Perl is not linked against the libC_r.
+
+=head1 AUTHOR
+
+H.Merijn Brand <h.m.brand@xs4all.nl>
+
+=head1 DATE
+
+Version 0.0.6: 23 Dec 2002
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlamiga.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlamiga.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlamiga.pod	(revision 14489)
@@ -0,0 +1,278 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perlamiga - Perl under Amiga OS
+
+=head1 NOTE
+
+B<Perl 5.8.0 cannot be built in AmigaOS.  You can use either the
+maintenance release Perl 5.6.1 or the development release Perl 5.7.2
+in AmigaOS.  See L</"PERL 5.8.0 BROKEN IN AMIGAOS"> if you want to help
+fixing this problem.>
+
+=head1 SYNOPSIS
+
+One can read this document in the following formats:
+
+	man perlamiga
+	multiview perlamiga.guide
+
+to list some (not all may be available simultaneously), or it may
+be read I<as is>: either as F<README.amiga>, or F<pod/perlamiga.pod>.
+
+A recent version of perl for the Amiga can be found at the Geek Gadgets
+section of the Aminet:
+
+      http://www.aminet.net/~aminet/dev/gg/index.html
+
+=cut
+
+Contents
+ 
+ perlamiga - Perl under Amiga OS
+
+       NAME 
+       SYNOPSIS 
+       DESCRIPTION 
+         -  Prerequisites 
+         -  Starting Perl programs under AmigaOS
+         -  Shortcomings of Perl under AmigaOS
+       INSTALLATION 
+       Accessing documentation 
+         -  Manpages 
+         -  HTML 
+         -  GNU info files 
+         -  LaTeX docs 
+       BUILD 
+         -  Build Prerequisites 
+         -  Getting the perl source 
+         -  Application of the patches 
+         -  Making 
+         -  Testing 
+         -  Installing the built perl 
+       AUTHOR 
+       SEE ALSO 
+
+=head1 DESCRIPTION
+
+=head2 Prerequisites for Compiling Perl on AmigaOS
+
+=over 6
+
+=item B<Unix emulation for AmigaOS: ixemul.library>
+
+You need the Unix emulation for AmigaOS, whose most important part is
+B<ixemul.library>. For a minimum setup, get the latest versions
+of the following packages from the Aminet archives
+( http://www.aminet.net/~aminet/ ):
+
+	ixemul-bin
+	ixemul-env-bin
+	pdksh-bin
+
+Note also that this is a minimum setup; you might want to add other
+packages of B<ADE> (the I<Amiga Developers Environment>).
+
+=item B<Version of Amiga OS>
+
+You need at the very least AmigaOS version 2.0. Recommended is version 3.1.
+
+=back
+
+=head2 Starting Perl programs under AmigaOS
+
+Start your Perl program F<foo> with arguments C<arg1 arg2 arg3> the
+same way as on any other platform, by
+
+	perl foo arg1 arg2 arg3
+
+If you want to specify perl options C<-my_opts> to the perl itself (as
+opposed to your program), use
+
+	perl -my_opts foo arg1 arg2 arg3
+
+Alternately, you can try to get a replacement for the system's B<Execute>
+command that honors the #!/usr/bin/perl syntax in scripts and set the s-Bit
+of your scripts. Then you can invoke your scripts like under UNIX with
+
+	foo arg1 arg2 arg3
+
+(Note that having *nixish full path to perl F</usr/bin/perl> is not
+necessary, F<perl> would be enough, but having full path would make it
+easier to use your script under *nix.)
+
+=head2 Shortcomings of Perl under AmigaOS
+
+Perl under AmigaOS lacks some features of perl under UNIX because of
+deficiencies in the UNIX-emulation, most notably:
+
+=over 6
+
+=item *
+
+fork()
+
+=item * 
+
+some features of the UNIX filesystem regarding link count and file dates
+
+=item *
+
+inplace operation (the -i switch) without backup file
+
+=item *
+
+umask() works, but the correct permissions are only set when the file is
+finally close()d
+
+=back
+
+=head1 INSTALLATION
+
+Change to the installation directory (most probably ADE:), and
+extract the binary distribution:
+
+lha -mraxe x perl-$VERSION-bin.lha
+
+or
+
+tar xvzpf perl-$VERSION-bin.tgz
+
+(Of course you need lha or tar and gunzip for this.)
+
+For installation of the Unix emulation, read the appropriate docs.
+
+=head1 Accessing documentation
+
+=head2 Manpages for Perl on AmigaOS
+
+If you have C<man> installed on your system, and you installed perl
+manpages, use something like this:
+
+	man perlfunc
+	man less
+	man ExtUtils.MakeMaker
+
+to access documentation for different components of Perl. Start with
+
+	man perl
+
+Note: You have to modify your man.conf file to search for manpages
+in the /ade/lib/perl5/man/man3 directory, or the man pages for the
+perl library will not be found. 
+
+Note that dot (F<.>) is used as a package separator for documentation
+for packages, and as usual, sometimes you need to give the section - C<3>
+above - to avoid shadowing by the I<less(1) manpage>.
+
+
+=head2 Perl HTML Documentation on AmigaOS
+
+If you have some WWW browser available, you can build B<HTML> docs.
+Cd to directory with F<.pod> files, and do like this
+
+	cd /ade/lib/perl5/pod
+	pod2html
+
+After this you can direct your browser the file F<perl.html> in this
+directory, and go ahead with reading docs.
+
+Alternatively you may be able to get these docs prebuilt from C<CPAN>.
+
+=head2 Perl GNU Info Files on AmigaOS
+
+Users of C<Emacs> would appreciate it very much, especially with
+C<CPerl> mode loaded. You need to get latest C<pod2info> from C<CPAN>,
+or, alternately, prebuilt info pages.
+
+=head2 Perl LaTeX Documentation on AmigaOS
+
+Can be constructed using C<pod2latex>.
+
+=head1 BUILDING PERL ON AMIGAOS
+
+Here we discuss how to build Perl under AmigaOS.
+
+=head2 Build Prerequisites for Perl on AmigaOS
+
+You need to have the latest B<ixemul> (Unix emulation for Amiga)
+from Aminet.
+
+=head2 Getting the Perl Source for AmigaOS
+
+You can either get the latest perl-for-amiga source from Ninemoons
+and extract it with:
+
+  tar xvzpf perl-$VERSION-src.tgz
+
+or get the official source from CPAN:
+
+  http://www.cpan.org/src/5.0
+
+Extract it like this
+
+  tar xvzpf perl-$VERSION.tar.gz
+
+You will see a message about errors while extracting F<Configure>. This
+is normal and expected. (There is a conflict with a similarly-named file
+F<configure>, but it causes no harm.)
+
+=head2 Making Perl on AmigaOS
+
+Remember to use a hefty wad of stack (I use 2000000)
+
+  sh configure.gnu --prefix=/gg
+
+Now type
+
+  make depend
+
+Now!
+
+  make
+
+=head2 Testing Perl on AmigaOS
+
+Now run
+
+  make test
+
+Some tests will be skipped because they need the fork() function:
+
+F<io/pipe.t>, F<op/fork.t>, F<lib/filehand.t>, F<lib/open2.t>, F<lib/open3.t>, 
+F<lib/io_pipe.t>, F<lib/io_sock.t>
+
+=head2 Installing the built Perl on AmigaOS
+
+Run
+
+  make install
+
+=head1 PERL 5.8.0 BROKEN IN AMIGAOS
+
+As told above, Perl 5.6.1 was still good in AmigaOS, as was 5.7.2.
+After Perl 5.7.2 (change #11423, see the Changes file, and the file
+pod/perlhack.pod for how to get the individual changes) Perl dropped
+its internal support for vfork(), and that was very probably the step
+that broke AmigaOS (since the ixemul library has only vfork).  
+The build finally fails when the ext/DynaLoader is being built, and
+PERL ends up as "0" in the produced Makefile, trying to run "0" does
+not quite work.  Also, executing miniperl in backticks seems to
+generate nothing: very probably related to the (v)fork problems.
+B<Fixing the breakage requires someone quite familiar with the ixemul
+library, and how one is supposed to run external commands in AmigaOS
+without fork().>
+
+=head1 AUTHORS
+
+Norbert Pueschel, pueschel@imsdd.meb.uni-bonn.de
+Jan-Erik Karlsson, trg@privat.utfors.se
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlapi.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlapi.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlapi.pod	(revision 14489)
@@ -0,0 +1,6204 @@
+=head1 NAME
+
+perlapi - autogenerated documentation for the perl public API
+
+=head1 DESCRIPTION
+X<Perl API> X<API> X<api>
+
+This file contains the documentation of the perl public API generated by
+embed.pl, specifically a listing of functions, macros, flags, and variables
+that may be used by extension writers.  The interfaces of any functions that
+are not listed here are subject to change without notice.  For this reason,
+blindly using functions listed in proto.h is to be avoided when writing
+extensions.
+
+Note that all Perl API global variables must be referenced with the C<PL_>
+prefix.  Some macros are provided for compatibility with the older,
+unadorned names, but this support may be disabled in a future release.
+
+The listing is alphabetical, case insensitive.
+
+
+=head1 "Gimme" Values
+
+=over 8
+
+=item GIMME
+X<GIMME>
+
+A backward-compatible version of C<GIMME_V> which can only return
+C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
+Deprecated.  Use C<GIMME_V> instead.
+
+	U32	GIMME
+
+=for hackers
+Found in file op.h
+
+=item GIMME_V
+X<GIMME_V>
+
+The XSUB-writer's equivalent to Perl's C<wantarray>.  Returns C<G_VOID>,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
+respectively.
+
+	U32	GIMME_V
+
+=for hackers
+Found in file op.h
+
+=item G_ARRAY
+X<G_ARRAY>
+
+Used to indicate list context.  See C<GIMME_V>, C<GIMME> and
+L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+=item G_DISCARD
+X<G_DISCARD>
+
+Indicates that arguments returned from a callback should be discarded.  See
+L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+=item G_EVAL
+X<G_EVAL>
+
+Used to force a Perl C<eval> wrapper around a callback.  See
+L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+=item G_NOARGS
+X<G_NOARGS>
+
+Indicates that no arguments are being sent to a callback.  See
+L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+=item G_SCALAR
+X<G_SCALAR>
+
+Used to indicate scalar context.  See C<GIMME_V>, C<GIMME>, and
+L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+=item G_VOID
+X<G_VOID>
+
+Used to indicate void context.  See C<GIMME_V> and L<perlcall>.
+
+=for hackers
+Found in file cop.h
+
+
+=back
+
+=head1 Array Manipulation Functions
+
+=over 8
+
+=item AvFILL
+X<AvFILL>
+
+Same as C<av_len()>.  Deprecated, use C<av_len()> instead.
+
+	int	AvFILL(AV* av)
+
+=for hackers
+Found in file av.h
+
+=item av_clear
+X<av_clear>
+
+Clears an array, making it empty.  Does not free the memory used by the
+array itself.
+
+	void	av_clear(AV* ar)
+
+=for hackers
+Found in file av.c
+
+=item av_delete
+X<av_delete>
+
+Deletes the element indexed by C<key> from the array.  Returns the
+deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
+and null is returned.
+
+	SV*	av_delete(AV* ar, I32 key, I32 flags)
+
+=for hackers
+Found in file av.c
+
+=item av_exists
+X<av_exists>
+
+Returns true if the element indexed by C<key> has been initialized.
+
+This relies on the fact that uninitialized array elements are set to
+C<&PL_sv_undef>.
+
+	bool	av_exists(AV* ar, I32 key)
+
+=for hackers
+Found in file av.c
+
+=item av_extend
+X<av_extend>
+
+Pre-extend an array.  The C<key> is the index to which the array should be
+extended.
+
+	void	av_extend(AV* ar, I32 key)
+
+=for hackers
+Found in file av.c
+
+=item av_fetch
+X<av_fetch>
+
+Returns the SV at the specified index in the array.  The C<key> is the
+index.  If C<lval> is set then the fetch will be part of a store.  Check
+that the return value is non-null before dereferencing it to a C<SV*>.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
+more information on how to use this function on tied arrays. 
+
+	SV**	av_fetch(AV* ar, I32 key, I32 lval)
+
+=for hackers
+Found in file av.c
+
+=item av_fill
+X<av_fill>
+
+Ensure than an array has a given number of elements, equivalent to
+Perl's C<$#array = $fill;>.
+
+	void	av_fill(AV* ar, I32 fill)
+
+=for hackers
+Found in file av.c
+
+=item av_len
+X<av_len>
+
+Returns the highest index in the array.  Returns -1 if the array is
+empty.
+
+	I32	av_len(AV* ar)
+
+=for hackers
+Found in file av.c
+
+=item av_make
+X<av_make>
+
+Creates a new AV and populates it with a list of SVs.  The SVs are copied
+into the array, so they may be freed after the call to av_make.  The new AV
+will have a reference count of 1.
+
+	AV*	av_make(I32 size, SV** svp)
+
+=for hackers
+Found in file av.c
+
+=item av_pop
+X<av_pop>
+
+Pops an SV off the end of the array.  Returns C<&PL_sv_undef> if the array
+is empty.
+
+	SV*	av_pop(AV* ar)
+
+=for hackers
+Found in file av.c
+
+=item av_push
+X<av_push>
+
+Pushes an SV onto the end of the array.  The array will grow automatically
+to accommodate the addition.
+
+	void	av_push(AV* ar, SV* val)
+
+=for hackers
+Found in file av.c
+
+=item av_shift
+X<av_shift>
+
+Shifts an SV off the beginning of the array.
+
+	SV*	av_shift(AV* ar)
+
+=for hackers
+Found in file av.c
+
+=item av_store
+X<av_store>
+
+Stores an SV in an array.  The array index is specified as C<key>.  The
+return value will be NULL if the operation failed or if the value did not
+need to be actually stored within the array (as in the case of tied
+arrays). Otherwise it can be dereferenced to get the original C<SV*>.  Note
+that the caller is responsible for suitably incrementing the reference
+count of C<val> before the call, and decrementing it if the function
+returned NULL.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
+more information on how to use this function on tied arrays.
+
+	SV**	av_store(AV* ar, I32 key, SV* val)
+
+=for hackers
+Found in file av.c
+
+=item av_undef
+X<av_undef>
+
+Undefines the array.  Frees the memory used by the array itself.
+
+	void	av_undef(AV* ar)
+
+=for hackers
+Found in file av.c
+
+=item av_unshift
+X<av_unshift>
+
+Unshift the given number of C<undef> values onto the beginning of the
+array.  The array will grow automatically to accommodate the addition.  You
+must then use C<av_store> to assign values to these new elements.
+
+	void	av_unshift(AV* ar, I32 num)
+
+=for hackers
+Found in file av.c
+
+=item get_av
+X<get_av>
+
+Returns the AV of the specified Perl array.  If C<create> is set and the
+Perl variable does not exist then it will be created.  If C<create> is not
+set and the variable does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	AV*	get_av(const char* name, I32 create)
+
+=for hackers
+Found in file perl.c
+
+=item newAV
+X<newAV>
+
+Creates a new AV.  The reference count is set to 1.
+
+	AV*	newAV()
+
+=for hackers
+Found in file av.c
+
+=item sortsv
+X<sortsv>
+
+Sort an array. Here is an example:
+
+    sortsv(AvARRAY(av), av_len(av)+1, Perl_sv_cmp_locale);
+
+See lib/sort.pm for details about controlling the sorting algorithm.
+
+	void	sortsv(SV** array, size_t num_elts, SVCOMPARE_t cmp)
+
+=for hackers
+Found in file pp_sort.c
+
+
+=back
+
+=head1 Callback Functions
+
+=over 8
+
+=item call_argv
+X<call_argv>
+
+Performs a callback to the specified Perl sub.  See L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	I32	call_argv(const char* sub_name, I32 flags, char** argv)
+
+=for hackers
+Found in file perl.c
+
+=item call_method
+X<call_method>
+
+Performs a callback to the specified Perl method.  The blessed object must
+be on the stack.  See L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	I32	call_method(const char* methname, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item call_pv
+X<call_pv>
+
+Performs a callback to the specified Perl sub.  See L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	I32	call_pv(const char* sub_name, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item call_sv
+X<call_sv>
+
+Performs a callback to the Perl sub whose name is in the SV.  See
+L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	I32	call_sv(SV* sv, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item ENTER
+X<ENTER>
+
+Opening bracket on a callback.  See C<LEAVE> and L<perlcall>.
+
+		ENTER;
+
+=for hackers
+Found in file scope.h
+
+=item eval_pv
+X<eval_pv>
+
+Tells Perl to C<eval> the given string and return an SV* result.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	SV*	eval_pv(const char* p, I32 croak_on_error)
+
+=for hackers
+Found in file perl.c
+
+=item eval_sv
+X<eval_sv>
+
+Tells Perl to C<eval> the string in the SV.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	I32	eval_sv(SV* sv, I32 flags)
+
+=for hackers
+Found in file perl.c
+
+=item FREETMPS
+X<FREETMPS>
+
+Closing bracket for temporaries on a callback.  See C<SAVETMPS> and
+L<perlcall>.
+
+		FREETMPS;
+
+=for hackers
+Found in file scope.h
+
+=item LEAVE
+X<LEAVE>
+
+Closing bracket on a callback.  See C<ENTER> and L<perlcall>.
+
+		LEAVE;
+
+=for hackers
+Found in file scope.h
+
+=item SAVETMPS
+X<SAVETMPS>
+
+Opening bracket for temporaries on a callback.  See C<FREETMPS> and
+L<perlcall>.
+
+		SAVETMPS;
+
+=for hackers
+Found in file scope.h
+
+
+=back
+
+=head1 Character classes
+
+=over 8
+
+=item isALNUM
+X<isALNUM>
+
+Returns a boolean indicating whether the C C<char> is an ASCII alphanumeric
+character (including underscore) or digit.
+
+	bool	isALNUM(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item isALPHA
+X<isALPHA>
+
+Returns a boolean indicating whether the C C<char> is an ASCII alphabetic
+character.
+
+	bool	isALPHA(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item isDIGIT
+X<isDIGIT>
+
+Returns a boolean indicating whether the C C<char> is an ASCII
+digit.
+
+	bool	isDIGIT(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item isLOWER
+X<isLOWER>
+
+Returns a boolean indicating whether the C C<char> is a lowercase
+character.
+
+	bool	isLOWER(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item isSPACE
+X<isSPACE>
+
+Returns a boolean indicating whether the C C<char> is whitespace.
+
+	bool	isSPACE(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item isUPPER
+X<isUPPER>
+
+Returns a boolean indicating whether the C C<char> is an uppercase
+character.
+
+	bool	isUPPER(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item toLOWER
+X<toLOWER>
+
+Converts the specified character to lowercase.
+
+	char	toLOWER(char ch)
+
+=for hackers
+Found in file handy.h
+
+=item toUPPER
+X<toUPPER>
+
+Converts the specified character to uppercase.
+
+	char	toUPPER(char ch)
+
+=for hackers
+Found in file handy.h
+
+
+=back
+
+=head1 Cloning an interpreter
+
+=over 8
+
+=item perl_clone
+X<perl_clone>
+
+Create and return a new interpreter by cloning the current one.
+
+perl_clone takes these flags as parameters:
+
+CLONEf_COPY_STACKS - is used to, well, copy the stacks also, 
+without it we only clone the data and zero the stacks, 
+with it we copy the stacks and the new perl interpreter is 
+ready to run at the exact same point as the previous one. 
+The pseudo-fork code uses COPY_STACKS while the 
+threads->new doesn't.
+
+CLONEf_KEEP_PTR_TABLE
+perl_clone keeps a ptr_table with the pointer of the old 
+variable as a key and the new variable as a value, 
+this allows it to check if something has been cloned and not 
+clone it again but rather just use the value and increase the 
+refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill 
+the ptr_table using the function 
+C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>, 
+reason to keep it around is if you want to dup some of your own 
+variable who are outside the graph perl scans, example of this 
+code is in threads.xs create
+
+CLONEf_CLONE_HOST
+This is a win32 thing, it is ignored on unix, it tells perls 
+win32host code (which is c++) to clone itself, this is needed on 
+win32 if you want to run two threads at the same time, 
+if you just want to do some stuff in a separate perl interpreter 
+and then throw it away and return to the original one, 
+you don't need to do anything.
+
+	PerlInterpreter*	perl_clone(PerlInterpreter* interp, UV flags)
+
+=for hackers
+Found in file sv.c
+
+
+=back
+
+=head1 CV Manipulation Functions
+
+=over 8
+
+=item CvSTASH
+X<CvSTASH>
+
+Returns the stash of the CV.
+
+	HV*	CvSTASH(CV* cv)
+
+=for hackers
+Found in file cv.h
+
+=item get_cv
+X<get_cv>
+
+Returns the CV of the specified Perl subroutine.  If C<create> is set and
+the Perl subroutine does not exist then it will be declared (which has the
+same effect as saying C<sub name;>).  If C<create> is not set and the
+subroutine does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	CV*	get_cv(const char* name, I32 create)
+
+=for hackers
+Found in file perl.c
+
+
+=back
+
+=head1 Embedding Functions
+
+=over 8
+
+=item cv_undef
+X<cv_undef>
+
+Clear out all the active components of a CV. This can happen either
+by an explicit C<undef &foo>, or by the reference count going to zero.
+In the former case, we keep the CvOUTSIDE pointer, so that any anonymous
+children can still follow the full lexical scope chain.
+
+	void	cv_undef(CV* cv)
+
+=for hackers
+Found in file op.c
+
+=item load_module
+X<load_module>
+
+Loads the module whose name is pointed to by the string part of name.
+Note that the actual module name, not its filename, should be given.
+Eg, "Foo::Bar" instead of "Foo/Bar.pm".  flags can be any of
+PERL_LOADMOD_DENY, PERL_LOADMOD_NOIMPORT, or PERL_LOADMOD_IMPORT_OPS
+(or 0 for no flags). ver, if specified, provides version semantics
+similar to C<use Foo::Bar VERSION>.  The optional trailing SV*
+arguments can be used to specify arguments to the module's import()
+method, similar to C<use Foo::Bar VERSION LIST>.
+
+	void	load_module(U32 flags, SV* name, SV* ver, ...)
+
+=for hackers
+Found in file op.c
+
+=item nothreadhook
+X<nothreadhook>
+
+Stub that provides thread hook for perl_destruct when there are
+no threads.
+
+	int	nothreadhook()
+
+=for hackers
+Found in file perl.c
+
+=item perl_alloc
+X<perl_alloc>
+
+Allocates a new Perl interpreter.  See L<perlembed>.
+
+	PerlInterpreter*	perl_alloc()
+
+=for hackers
+Found in file perl.c
+
+=item perl_construct
+X<perl_construct>
+
+Initializes a new Perl interpreter.  See L<perlembed>.
+
+	void	perl_construct(PerlInterpreter* interp)
+
+=for hackers
+Found in file perl.c
+
+=item perl_destruct
+X<perl_destruct>
+
+Shuts down a Perl interpreter.  See L<perlembed>.
+
+	int	perl_destruct(PerlInterpreter* interp)
+
+=for hackers
+Found in file perl.c
+
+=item perl_free
+X<perl_free>
+
+Releases a Perl interpreter.  See L<perlembed>.
+
+	void	perl_free(PerlInterpreter* interp)
+
+=for hackers
+Found in file perl.c
+
+=item perl_parse
+X<perl_parse>
+
+Tells a Perl interpreter to parse a Perl script.  See L<perlembed>.
+
+	int	perl_parse(PerlInterpreter* interp, XSINIT_t xsinit, int argc, char** argv, char** env)
+
+=for hackers
+Found in file perl.c
+
+=item perl_run
+X<perl_run>
+
+Tells a Perl interpreter to run.  See L<perlembed>.
+
+	int	perl_run(PerlInterpreter* interp)
+
+=for hackers
+Found in file perl.c
+
+=item require_pv
+X<require_pv>
+
+Tells Perl to C<require> the file named by the string argument.  It is
+analogous to the Perl code C<eval "require '$file'">.  It's even
+implemented that way; consider using load_module instead.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	void	require_pv(const char* pv)
+
+=for hackers
+Found in file perl.c
+
+
+=back
+
+=head1 Functions in file pp_pack.c
+
+
+=over 8
+
+=item packlist
+X<packlist>
+
+The engine implementing pack() Perl function.
+
+	void	packlist(SV *cat, char *pat, char *patend, SV **beglist, SV **endlist)
+
+=for hackers
+Found in file pp_pack.c
+
+=item pack_cat
+X<pack_cat>
+
+The engine implementing pack() Perl function. Note: parameters next_in_list and
+flags are not used. This call should not be used; use packlist instead.
+
+	void	pack_cat(SV *cat, char *pat, char *patend, SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
+
+=for hackers
+Found in file pp_pack.c
+
+=item unpackstring
+X<unpackstring>
+
+The engine implementing unpack() Perl function. C<unpackstring> puts the
+extracted list items on the stack and returns the number of elements.
+Issue C<PUTBACK> before and C<SPAGAIN> after the call to this function.
+
+	I32	unpackstring(char *pat, char *patend, char *s, char *strend, U32 flags)
+
+=for hackers
+Found in file pp_pack.c
+
+=item unpack_str
+X<unpack_str>
+
+The engine implementing unpack() Perl function. Note: parameters strbeg, new_s
+and ocnt are not used. This call should not be used, use unpackstring instead.
+
+	I32	unpack_str(char *pat, char *patend, char *s, char *strbeg, char *strend, char **new_s, I32 ocnt, U32 flags)
+
+=for hackers
+Found in file pp_pack.c
+
+
+=back
+
+=head1 Global Variables
+
+=over 8
+
+=item PL_modglobal
+X<PL_modglobal>
+
+C<PL_modglobal> is a general purpose, interpreter global HV for use by
+extensions that need to keep information on a per-interpreter basis.
+In a pinch, it can also be used as a symbol table for extensions
+to share data among each other.  It is a good idea to use keys
+prefixed by the package name of the extension that owns the data.
+
+	HV*	PL_modglobal
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_na
+X<PL_na>
+
+A convenience variable which is typically used with C<SvPV> when one
+doesn't care about the length of the string.  It is usually more efficient
+to either declare a local variable and use that instead or to use the
+C<SvPV_nolen> macro.
+
+	STRLEN	PL_na
+
+=for hackers
+Found in file thrdvar.h
+
+=item PL_sv_no
+X<PL_sv_no>
+
+This is the C<false> SV.  See C<PL_sv_yes>.  Always refer to this as
+C<&PL_sv_no>.
+
+	SV	PL_sv_no
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_sv_undef
+X<PL_sv_undef>
+
+This is the C<undef> SV.  Always refer to this as C<&PL_sv_undef>.
+
+	SV	PL_sv_undef
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_sv_yes
+X<PL_sv_yes>
+
+This is the C<true> SV.  See C<PL_sv_no>.  Always refer to this as
+C<&PL_sv_yes>.
+
+	SV	PL_sv_yes
+
+=for hackers
+Found in file intrpvar.h
+
+
+=back
+
+=head1 GV Functions
+
+=over 8
+
+=item GvSV
+X<GvSV>
+
+Return the SV from the GV.
+
+	SV*	GvSV(GV* gv)
+
+=for hackers
+Found in file gv.h
+
+=item gv_fetchmeth
+X<gv_fetchmeth>
+
+Returns the glob with the given C<name> and a defined subroutine or
+C<NULL>.  The glob lives in the given C<stash>, or in the stashes
+accessible via @ISA and UNIVERSAL::.
+
+The argument C<level> should be either 0 or -1.  If C<level==0>, as a
+side-effect creates a glob with the given C<name> in the given C<stash>
+which in the case of success contains an alias for the subroutine, and sets
+up caching info for this glob.  Similarly for all the searched stashes.
+
+This function grants C<"SUPER"> token as a postfix of the stash name. The
+GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
+visible to Perl code.  So when calling C<call_sv>, you should not use
+the GV directly; instead, you should use the method's CV, which can be
+obtained from the GV with the C<GvCV> macro.
+
+	GV*	gv_fetchmeth(HV* stash, const char* name, STRLEN len, I32 level)
+
+=for hackers
+Found in file gv.c
+
+=item gv_fetchmethod
+X<gv_fetchmethod>
+
+See L<gv_fetchmethod_autoload>.
+
+	GV*	gv_fetchmethod(HV* stash, const char* name)
+
+=for hackers
+Found in file gv.c
+
+=item gv_fetchmethod_autoload
+X<gv_fetchmethod_autoload>
+
+Returns the glob which contains the subroutine to call to invoke the method
+on the C<stash>.  In fact in the presence of autoloading this may be the
+glob for "AUTOLOAD".  In this case the corresponding variable $AUTOLOAD is
+already setup.
+
+The third parameter of C<gv_fetchmethod_autoload> determines whether
+AUTOLOAD lookup is performed if the given method is not present: non-zero
+means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD.
+Calling C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload>
+with a non-zero C<autoload> parameter.
+
+These functions grant C<"SUPER"> token as a prefix of the method name. Note
+that if you want to keep the returned glob for a long time, you need to
+check for it being "AUTOLOAD", since at the later time the call may load a
+different subroutine due to $AUTOLOAD changing its value. Use the glob
+created via a side effect to do this.
+
+These functions have the same side-effects and as C<gv_fetchmeth> with
+C<level==0>.  C<name> should be writable if contains C<':'> or C<'
+''>. The warning against passing the GV returned by C<gv_fetchmeth> to
+C<call_sv> apply equally to these functions.
+
+	GV*	gv_fetchmethod_autoload(HV* stash, const char* name, I32 autoload)
+
+=for hackers
+Found in file gv.c
+
+=item gv_fetchmeth_autoload
+X<gv_fetchmeth_autoload>
+
+Same as gv_fetchmeth(), but looks for autoloaded subroutines too.
+Returns a glob for the subroutine.
+
+For an autoloaded subroutine without a GV, will create a GV even
+if C<level < 0>.  For an autoloaded subroutine without a stub, GvCV()
+of the result may be zero.
+
+	GV*	gv_fetchmeth_autoload(HV* stash, const char* name, STRLEN len, I32 level)
+
+=for hackers
+Found in file gv.c
+
+=item gv_stashpv
+X<gv_stashpv>
+
+Returns a pointer to the stash for a specified package.  C<name> should
+be a valid UTF-8 string and must be null-terminated.  If C<create> is set
+then the package will be created if it does not already exist.  If C<create>
+is not set and the package does not exist then NULL is returned.
+
+	HV*	gv_stashpv(const char* name, I32 create)
+
+=for hackers
+Found in file gv.c
+
+=item gv_stashpvn
+X<gv_stashpvn>
+
+Returns a pointer to the stash for a specified package.  C<name> should
+be a valid UTF-8 string.  The C<namelen> parameter indicates the length of
+the C<name>, in bytes.  If C<create> is set then the package will be
+created if it does not already exist.  If C<create> is not set and the
+package does not exist then NULL is returned.
+
+	HV*	gv_stashpvn(const char* name, U32 namelen, I32 create)
+
+=for hackers
+Found in file gv.c
+
+=item gv_stashsv
+X<gv_stashsv>
+
+Returns a pointer to the stash for a specified package, which must be a
+valid UTF-8 string.  See C<gv_stashpv>.
+
+	HV*	gv_stashsv(SV* sv, I32 create)
+
+=for hackers
+Found in file gv.c
+
+
+=back
+
+=head1 Handy Values
+
+=over 8
+
+=item Nullav
+X<Nullav>
+
+Null AV pointer.
+
+=for hackers
+Found in file av.h
+
+=item Nullch
+X<Nullch>
+
+Null character pointer.
+
+=for hackers
+Found in file handy.h
+
+=item Nullcv
+X<Nullcv>
+
+Null CV pointer.
+
+=for hackers
+Found in file cv.h
+
+=item Nullhv
+X<Nullhv>
+
+Null HV pointer.
+
+=for hackers
+Found in file hv.h
+
+=item Nullsv
+X<Nullsv>
+
+Null SV pointer.
+
+=for hackers
+Found in file handy.h
+
+
+=back
+
+=head1 Hash Manipulation Functions
+
+=over 8
+
+=item get_hv
+X<get_hv>
+
+Returns the HV of the specified Perl hash.  If C<create> is set and the
+Perl variable does not exist then it will be created.  If C<create> is not
+set and the variable does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	HV*	get_hv(const char* name, I32 create)
+
+=for hackers
+Found in file perl.c
+
+=item HEf_SVKEY
+X<HEf_SVKEY>
+
+This flag, used in the length slot of hash entries and magic structures,
+specifies the structure contains an C<SV*> pointer where a C<char*> pointer
+is to be expected. (For information only--not to be used).
+
+=for hackers
+Found in file hv.h
+
+=item HeHASH
+X<HeHASH>
+
+Returns the computed hash stored in the hash entry.
+
+	U32	HeHASH(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HeKEY
+X<HeKEY>
+
+Returns the actual pointer stored in the key slot of the hash entry. The
+pointer may be either C<char*> or C<SV*>, depending on the value of
+C<HeKLEN()>.  Can be assigned to.  The C<HePV()> or C<HeSVKEY()> macros are
+usually preferable for finding the value of a key.
+
+	void*	HeKEY(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HeKLEN
+X<HeKLEN>
+
+If this is negative, and amounts to C<HEf_SVKEY>, it indicates the entry
+holds an C<SV*> key.  Otherwise, holds the actual length of the key.  Can
+be assigned to. The C<HePV()> macro is usually preferable for finding key
+lengths.
+
+	STRLEN	HeKLEN(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HePV
+X<HePV>
+
+Returns the key slot of the hash entry as a C<char*> value, doing any
+necessary dereferencing of possibly C<SV*> keys.  The length of the string
+is placed in C<len> (this is a macro, so do I<not> use C<&len>).  If you do
+not care about what the length of the key is, you may use the global
+variable C<PL_na>, though this is rather less efficient than using a local
+variable.  Remember though, that hash keys in perl are free to contain
+embedded nulls, so using C<strlen()> or similar is not a good way to find
+the length of hash keys. This is very similar to the C<SvPV()> macro
+described elsewhere in this document.
+
+	char*	HePV(HE* he, STRLEN len)
+
+=for hackers
+Found in file hv.h
+
+=item HeSVKEY
+X<HeSVKEY>
+
+Returns the key as an C<SV*>, or C<Nullsv> if the hash entry does not
+contain an C<SV*> key.
+
+	SV*	HeSVKEY(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HeSVKEY_force
+X<HeSVKEY_force>
+
+Returns the key as an C<SV*>.  Will create and return a temporary mortal
+C<SV*> if the hash entry contains only a C<char*> key.
+
+	SV*	HeSVKEY_force(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HeSVKEY_set
+X<HeSVKEY_set>
+
+Sets the key to a given C<SV*>, taking care to set the appropriate flags to
+indicate the presence of an C<SV*> key, and returns the same
+C<SV*>.
+
+	SV*	HeSVKEY_set(HE* he, SV* sv)
+
+=for hackers
+Found in file hv.h
+
+=item HeVAL
+X<HeVAL>
+
+Returns the value slot (type C<SV*>) stored in the hash entry.
+
+	SV*	HeVAL(HE* he)
+
+=for hackers
+Found in file hv.h
+
+=item HvNAME
+X<HvNAME>
+
+Returns the package name of a stash.  See C<SvSTASH>, C<CvSTASH>.
+
+	char*	HvNAME(HV* stash)
+
+=for hackers
+Found in file hv.h
+
+=item hv_clear
+X<hv_clear>
+
+Clears a hash, making it empty.
+
+	void	hv_clear(HV* tb)
+
+=for hackers
+Found in file hv.c
+
+=item hv_clear_placeholders
+X<hv_clear_placeholders>
+
+Clears any placeholders from a hash.  If a restricted hash has any of its keys
+marked as readonly and the key is subsequently deleted, the key is not actually
+deleted but is marked by assigning it a value of &PL_sv_placeholder.  This tags
+it so it will be ignored by future operations such as iterating over the hash,
+but will still allow the hash to have a value reassigned to the key at some
+future point.  This function clears any such placeholder keys from the hash.
+See Hash::Util::lock_keys() for an example of its use.
+
+	void	hv_clear_placeholders(HV* hb)
+
+=for hackers
+Found in file hv.c
+
+=item hv_delete
+X<hv_delete>
+
+Deletes a key/value pair in the hash.  The value SV is removed from the
+hash and returned to the caller.  The C<klen> is the length of the key.
+The C<flags> value will normally be zero; if set to G_DISCARD then NULL
+will be returned.
+
+	SV*	hv_delete(HV* tb, const char* key, I32 klen, I32 flags)
+
+=for hackers
+Found in file hv.c
+
+=item hv_delete_ent
+X<hv_delete_ent>
+
+Deletes a key/value pair in the hash.  The value SV is removed from the
+hash and returned to the caller.  The C<flags> value will normally be zero;
+if set to G_DISCARD then NULL will be returned.  C<hash> can be a valid
+precomputed hash value, or 0 to ask for it to be computed.
+
+	SV*	hv_delete_ent(HV* tb, SV* key, I32 flags, U32 hash)
+
+=for hackers
+Found in file hv.c
+
+=item hv_exists
+X<hv_exists>
+
+Returns a boolean indicating whether the specified hash key exists.  The
+C<klen> is the length of the key.
+
+	bool	hv_exists(HV* tb, const char* key, I32 klen)
+
+=for hackers
+Found in file hv.c
+
+=item hv_exists_ent
+X<hv_exists_ent>
+
+Returns a boolean indicating whether the specified hash key exists. C<hash>
+can be a valid precomputed hash value, or 0 to ask for it to be
+computed.
+
+	bool	hv_exists_ent(HV* tb, SV* key, U32 hash)
+
+=for hackers
+Found in file hv.c
+
+=item hv_fetch
+X<hv_fetch>
+
+Returns the SV which corresponds to the specified key in the hash.  The
+C<klen> is the length of the key.  If C<lval> is set then the fetch will be
+part of a store.  Check that the return value is non-null before
+dereferencing it to an C<SV*>.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+	SV**	hv_fetch(HV* tb, const char* key, I32 klen, I32 lval)
+
+=for hackers
+Found in file hv.c
+
+=item hv_fetch_ent
+X<hv_fetch_ent>
+
+Returns the hash entry which corresponds to the specified key in the hash.
+C<hash> must be a valid precomputed hash number for the given C<key>, or 0
+if you want the function to compute it.  IF C<lval> is set then the fetch
+will be part of a store.  Make sure the return value is non-null before
+accessing it.  The return value when C<tb> is a tied hash is a pointer to a
+static location, so be sure to make a copy of the structure if you need to
+store it somewhere.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+	HE*	hv_fetch_ent(HV* tb, SV* key, I32 lval, U32 hash)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iterinit
+X<hv_iterinit>
+
+Prepares a starting point to traverse a hash table.  Returns the number of
+keys in the hash (i.e. the same as C<HvKEYS(tb)>).  The return value is
+currently only meaningful for hashes without tie magic.
+
+NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
+hash buckets that happen to be in use.  If you still need that esoteric
+value, you can get it through the macro C<HvFILL(tb)>.
+
+
+	I32	hv_iterinit(HV* tb)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iterkey
+X<hv_iterkey>
+
+Returns the key from the current position of the hash iterator.  See
+C<hv_iterinit>.
+
+	char*	hv_iterkey(HE* entry, I32* retlen)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iterkeysv
+X<hv_iterkeysv>
+
+Returns the key as an C<SV*> from the current position of the hash
+iterator.  The return value will always be a mortal copy of the key.  Also
+see C<hv_iterinit>.
+
+	SV*	hv_iterkeysv(HE* entry)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iternext
+X<hv_iternext>
+
+Returns entries from a hash iterator.  See C<hv_iterinit>.
+
+You may call C<hv_delete> or C<hv_delete_ent> on the hash entry that the
+iterator currently points to, without losing your place or invalidating your
+iterator.  Note that in this case the current entry is deleted from the hash
+with your iterator holding the last reference to it.  Your iterator is flagged
+to free the entry on the next call to C<hv_iternext>, so you must not discard
+your iterator immediately else the entry will leak - call C<hv_iternext> to
+trigger the resource deallocation.
+
+	HE*	hv_iternext(HV* tb)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iternextsv
+X<hv_iternextsv>
+
+Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
+operation.
+
+	SV*	hv_iternextsv(HV* hv, char** key, I32* retlen)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iternext_flags
+X<hv_iternext_flags>
+
+Returns entries from a hash iterator.  See C<hv_iterinit> and C<hv_iternext>.
+The C<flags> value will normally be zero; if HV_ITERNEXT_WANTPLACEHOLDERS is
+set the placeholders keys (for restricted hashes) will be returned in addition
+to normal keys. By default placeholders are automatically skipped over.
+Currently a placeholder is implemented with a value that is
+C<&Perl_sv_placeholder>. Note that the implementation of placeholders and
+restricted hashes may change, and the implementation currently is
+insufficiently abstracted for any change to be tidy.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+	HE*	hv_iternext_flags(HV* tb, I32 flags)
+
+=for hackers
+Found in file hv.c
+
+=item hv_iterval
+X<hv_iterval>
+
+Returns the value from the current position of the hash iterator.  See
+C<hv_iterkey>.
+
+	SV*	hv_iterval(HV* tb, HE* entry)
+
+=for hackers
+Found in file hv.c
+
+=item hv_magic
+X<hv_magic>
+
+Adds magic to a hash.  See C<sv_magic>.
+
+	void	hv_magic(HV* hv, GV* gv, int how)
+
+=for hackers
+Found in file hv.c
+
+=item hv_scalar
+X<hv_scalar>
+
+Evaluates the hash in scalar context and returns the result. Handles magic when the hash is tied.
+
+	SV*	hv_scalar(HV* hv)
+
+=for hackers
+Found in file hv.c
+
+=item hv_store
+X<hv_store>
+
+Stores an SV in a hash.  The hash key is specified as C<key> and C<klen> is
+the length of the key.  The C<hash> parameter is the precomputed hash
+value; if it is zero then Perl will compute it.  The return value will be
+NULL if the operation failed or if the value did not need to be actually
+stored within the hash (as in the case of tied hashes).  Otherwise it can
+be dereferenced to get the original C<SV*>.  Note that the caller is
+responsible for suitably incrementing the reference count of C<val> before
+the call, and decrementing it if the function returned NULL.  Effectively
+a successful hv_store takes ownership of one reference to C<val>.  This is
+usually what you want; a newly created SV has a reference count of one, so
+if all your code does is create SVs then store them in a hash, hv_store
+will own the only reference to the new SV, and your code doesn't need to do
+anything further to tidy up.  hv_store is not implemented as a call to
+hv_store_ent, and does not create a temporary SV for the key, so if your
+key data is not already in SV form then use hv_store in preference to
+hv_store_ent.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+	SV**	hv_store(HV* tb, const char* key, I32 klen, SV* val, U32 hash)
+
+=for hackers
+Found in file hv.c
+
+=item hv_store_ent
+X<hv_store_ent>
+
+Stores C<val> in a hash.  The hash key is specified as C<key>.  The C<hash>
+parameter is the precomputed hash value; if it is zero then Perl will
+compute it.  The return value is the new hash entry so created.  It will be
+NULL if the operation failed or if the value did not need to be actually
+stored within the hash (as in the case of tied hashes).  Otherwise the
+contents of the return value can be accessed using the C<He?> macros
+described here.  Note that the caller is responsible for suitably
+incrementing the reference count of C<val> before the call, and
+decrementing it if the function returned NULL.  Effectively a successful
+hv_store_ent takes ownership of one reference to C<val>.  This is
+usually what you want; a newly created SV has a reference count of one, so
+if all your code does is create SVs then store them in a hash, hv_store
+will own the only reference to the new SV, and your code doesn't need to do
+anything further to tidy up.  Note that hv_store_ent only reads the C<key>;
+unlike C<val> it does not take ownership of it, so maintaining the correct
+reference count on C<key> is entirely the caller's responsibility.  hv_store
+is not implemented as a call to hv_store_ent, and does not create a temporary
+SV for the key, so if your key data is not already in SV form then use
+hv_store in preference to hv_store_ent.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+	HE*	hv_store_ent(HV* tb, SV* key, SV* val, U32 hash)
+
+=for hackers
+Found in file hv.c
+
+=item hv_undef
+X<hv_undef>
+
+Undefines the hash.
+
+	void	hv_undef(HV* tb)
+
+=for hackers
+Found in file hv.c
+
+=item newHV
+X<newHV>
+
+Creates a new HV.  The reference count is set to 1.
+
+	HV*	newHV()
+
+=for hackers
+Found in file hv.c
+
+
+=back
+
+=head1 Magical Functions
+
+=over 8
+
+=item mg_clear
+X<mg_clear>
+
+Clear something magical that the SV represents.  See C<sv_magic>.
+
+	int	mg_clear(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item mg_copy
+X<mg_copy>
+
+Copies the magic from one SV to another.  See C<sv_magic>.
+
+	int	mg_copy(SV* sv, SV* nsv, const char* key, I32 klen)
+
+=for hackers
+Found in file mg.c
+
+=item mg_find
+X<mg_find>
+
+Finds the magic pointer for type matching the SV.  See C<sv_magic>.
+
+	MAGIC*	mg_find(SV* sv, int type)
+
+=for hackers
+Found in file mg.c
+
+=item mg_free
+X<mg_free>
+
+Free any magic storage used by the SV.  See C<sv_magic>.
+
+	int	mg_free(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item mg_get
+X<mg_get>
+
+Do magic after a value is retrieved from the SV.  See C<sv_magic>.
+
+	int	mg_get(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item mg_length
+X<mg_length>
+
+Report on the SV's length.  See C<sv_magic>.
+
+	U32	mg_length(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item mg_magical
+X<mg_magical>
+
+Turns on the magical status of an SV.  See C<sv_magic>.
+
+	void	mg_magical(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item mg_set
+X<mg_set>
+
+Do magic after a value is assigned to the SV.  See C<sv_magic>.
+
+	int	mg_set(SV* sv)
+
+=for hackers
+Found in file mg.c
+
+=item SvGETMAGIC
+X<SvGETMAGIC>
+
+Invokes C<mg_get> on an SV if it has 'get' magic.  This macro evaluates its
+argument more than once.
+
+	void	SvGETMAGIC(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvLOCK
+X<SvLOCK>
+
+Arranges for a mutual exclusion lock to be obtained on sv if a suitable module
+has been loaded.
+
+	void	SvLOCK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSETMAGIC
+X<SvSETMAGIC>
+
+Invokes C<mg_set> on an SV if it has 'set' magic.  This macro evaluates its
+argument more than once.
+
+	void	SvSETMAGIC(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSetMagicSV
+X<SvSetMagicSV>
+
+Like C<SvSetSV>, but does any set magic required afterwards.
+
+	void	SvSetMagicSV(SV* dsb, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSetMagicSV_nosteal
+X<SvSetMagicSV_nosteal>
+
+Like C<SvSetSV_nosteal>, but does any set magic required afterwards.
+
+	void	SvSetMagicSV_nosteal(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSetSV
+X<SvSetSV>
+
+Calls C<sv_setsv> if dsv is not the same as ssv.  May evaluate arguments
+more than once.
+
+	void	SvSetSV(SV* dsb, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSetSV_nosteal
+X<SvSetSV_nosteal>
+
+Calls a non-destructive version of C<sv_setsv> if dsv is not the same as
+ssv. May evaluate arguments more than once.
+
+	void	SvSetSV_nosteal(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSHARE
+X<SvSHARE>
+
+Arranges for sv to be shared between threads if a suitable module
+has been loaded.
+
+	void	SvSHARE(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUNLOCK
+X<SvUNLOCK>
+
+Releases a mutual exclusion lock on sv if a suitable module
+has been loaded.
+
+	void	SvUNLOCK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+
+=back
+
+=head1 Memory Management
+
+=over 8
+
+=item Copy
+X<Copy>
+
+The XSUB-writer's interface to the C C<memcpy> function.  The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type.  May fail on overlapping copies.  See also C<Move>.
+
+	void	Copy(void* src, void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item CopyD
+X<CopyD>
+
+Like C<Copy> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+	void *	CopyD(void* src, void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Move
+X<Move>
+
+The XSUB-writer's interface to the C C<memmove> function.  The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type.  Can do overlapping moves.  See also C<Copy>.
+
+	void	Move(void* src, void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item MoveD
+X<MoveD>
+
+Like C<Move> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+	void *	MoveD(void* src, void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Newx
+X<Newx>
+
+The XSUB-writer's interface to the C C<malloc> function.
+
+	void	Newx(void* ptr, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Newxc
+X<Newxc>
+
+The XSUB-writer's interface to the C C<malloc> function, with
+cast.
+
+	void	Newxc(void* ptr, int nitems, type, cast)
+
+=for hackers
+Found in file handy.h
+
+=item Newxz
+X<Newxz>
+
+The XSUB-writer's interface to the C C<malloc> function.  The allocated
+memory is zeroed with C<memzero>.
+
+In 5.9.3, we removed the 1st parameter, a debug aid, from the api.  It
+was used to uniquely identify each usage of these allocation
+functions, but was deemed unnecessary with the availability of better
+memory tracking tools, valgrind for example.
+
+	void	Newxz(void* ptr, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Poison
+X<Poison>
+
+Fill up memory with a pattern (byte 0xAB over and over again) that
+hopefully catches attempts to access uninitialized memory.
+
+	void	Poison(void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Renew
+X<Renew>
+
+The XSUB-writer's interface to the C C<realloc> function.
+
+	void	Renew(void* ptr, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item Renewc
+X<Renewc>
+
+The XSUB-writer's interface to the C C<realloc> function, with
+cast.
+
+	void	Renewc(void* ptr, int nitems, type, cast)
+
+=for hackers
+Found in file handy.h
+
+=item Safefree
+X<Safefree>
+
+The XSUB-writer's interface to the C C<free> function.
+
+	void	Safefree(void* ptr)
+
+=for hackers
+Found in file handy.h
+
+=item savepv
+X<savepv>
+
+Perl's version of C<strdup()>. Returns a pointer to a newly allocated
+string which is a duplicate of C<pv>. The size of the string is
+determined by C<strlen()>. The memory allocated for the new string can
+be freed with the C<Safefree()> function.
+
+	char*	savepv(const char* pv)
+
+=for hackers
+Found in file util.c
+
+=item savepvn
+X<savepvn>
+
+Perl's version of what C<strndup()> would be if it existed. Returns a
+pointer to a newly allocated string which is a duplicate of the first
+C<len> bytes from C<pv>. The memory allocated for the new string can be
+freed with the C<Safefree()> function.
+
+	char*	savepvn(const char* pv, I32 len)
+
+=for hackers
+Found in file util.c
+
+=item savesharedpv
+X<savesharedpv>
+
+A version of C<savepv()> which allocates the duplicate string in memory
+which is shared between threads.
+
+	char*	savesharedpv(const char* pv)
+
+=for hackers
+Found in file util.c
+
+=item savesvpv
+X<savesvpv>
+
+A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
+the passed in SV using C<SvPV()>
+
+	char*	savesvpv(SV* sv)
+
+=for hackers
+Found in file util.c
+
+=item StructCopy
+X<StructCopy>
+
+This is an architecture-independent macro to copy one structure to another.
+
+	void	StructCopy(type src, type dest, type)
+
+=for hackers
+Found in file handy.h
+
+=item Zero
+X<Zero>
+
+The XSUB-writer's interface to the C C<memzero> function.  The C<dest> is the
+destination, C<nitems> is the number of items, and C<type> is the type.
+
+	void	Zero(void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+=item ZeroD
+X<ZeroD>
+
+Like C<Zero> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+	void *	ZeroD(void* dest, int nitems, type)
+
+=for hackers
+Found in file handy.h
+
+
+=back
+
+=head1 Miscellaneous Functions
+
+=over 8
+
+=item fbm_compile
+X<fbm_compile>
+
+Analyses the string in order to make fast searches on it using fbm_instr()
+-- the Boyer-Moore algorithm.
+
+	void	fbm_compile(SV* sv, U32 flags)
+
+=for hackers
+Found in file util.c
+
+=item fbm_instr
+X<fbm_instr>
+
+Returns the location of the SV in the string delimited by C<str> and
+C<strend>.  It returns C<Nullch> if the string can't be found.  The C<sv>
+does not have to be fbm_compiled, but the search will not be as fast
+then.
+
+	char*	fbm_instr(unsigned char* big, unsigned char* bigend, SV* littlesv, U32 flags)
+
+=for hackers
+Found in file util.c
+
+=item form
+X<form>
+
+Takes a sprintf-style format pattern and conventional
+(non-SV) arguments and returns the formatted string.
+
+    (char *) Perl_form(pTHX_ const char* pat, ...)
+
+can be used any place a string (char *) is required:
+
+    char * s = Perl_form("%d.%d",major,minor);
+
+Uses a single private buffer so if you want to format several strings you
+must explicitly copy the earlier strings away (and free the copies when you
+are done).
+
+	char*	form(const char* pat, ...)
+
+=for hackers
+Found in file util.c
+
+=item getcwd_sv
+X<getcwd_sv>
+
+Fill the sv with current working directory
+
+	int	getcwd_sv(SV* sv)
+
+=for hackers
+Found in file util.c
+
+=item strEQ
+X<strEQ>
+
+Test two strings to see if they are equal.  Returns true or false.
+
+	bool	strEQ(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strGE
+X<strGE>
+
+Test two strings to see if the first, C<s1>, is greater than or equal to
+the second, C<s2>.  Returns true or false.
+
+	bool	strGE(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strGT
+X<strGT>
+
+Test two strings to see if the first, C<s1>, is greater than the second,
+C<s2>.  Returns true or false.
+
+	bool	strGT(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strLE
+X<strLE>
+
+Test two strings to see if the first, C<s1>, is less than or equal to the
+second, C<s2>.  Returns true or false.
+
+	bool	strLE(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strLT
+X<strLT>
+
+Test two strings to see if the first, C<s1>, is less than the second,
+C<s2>.  Returns true or false.
+
+	bool	strLT(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strNE
+X<strNE>
+
+Test two strings to see if they are different.  Returns true or
+false.
+
+	bool	strNE(char* s1, char* s2)
+
+=for hackers
+Found in file handy.h
+
+=item strnEQ
+X<strnEQ>
+
+Test two strings to see if they are equal.  The C<len> parameter indicates
+the number of bytes to compare.  Returns true or false. (A wrapper for
+C<strncmp>).
+
+	bool	strnEQ(char* s1, char* s2, STRLEN len)
+
+=for hackers
+Found in file handy.h
+
+=item strnNE
+X<strnNE>
+
+Test two strings to see if they are different.  The C<len> parameter
+indicates the number of bytes to compare.  Returns true or false. (A
+wrapper for C<strncmp>).
+
+	bool	strnNE(char* s1, char* s2, STRLEN len)
+
+=for hackers
+Found in file handy.h
+
+=item sv_nolocking
+X<sv_nolocking>
+
+Dummy routine which "locks" an SV when there is no locking module present.
+Exists to avoid test for a NULL function pointer and because it could potentially warn under
+some level of strict-ness.
+
+	void	sv_nolocking(SV *)
+
+=for hackers
+Found in file util.c
+
+=item sv_nosharing
+X<sv_nosharing>
+
+Dummy routine which "shares" an SV when there is no sharing module present.
+Exists to avoid test for a NULL function pointer and because it could potentially warn under
+some level of strict-ness.
+
+	void	sv_nosharing(SV *)
+
+=for hackers
+Found in file util.c
+
+=item sv_nounlocking
+X<sv_nounlocking>
+
+Dummy routine which "unlocks" an SV when there is no locking module present.
+Exists to avoid test for a NULL function pointer and because it could potentially warn under
+some level of strict-ness.
+
+	void	sv_nounlocking(SV *)
+
+=for hackers
+Found in file util.c
+
+
+=back
+
+=head1 Numeric functions
+
+=over 8
+
+=item grok_bin
+X<grok_bin>
+
+converts a string representing a binary number to numeric form.
+
+On entry I<start> and I<*len> give the string to scan, I<*flags> gives
+conversion flags, and I<result> should be NULL or a pointer to an NV.
+The scan stops at the end of the string, or the first invalid character.
+Unless C<PERL_SCAN_SILENT_ILLDIGIT> is set in I<*flags>, encountering an
+invalid character will also trigger a warning.
+On return I<*len> is set to the length of the scanned string,
+and I<*flags> gives output flags.
+
+If the value is <= C<UV_MAX> it is returned as a UV, the output flags are clear,
+and nothing is written to I<*result>. If the value is > UV_MAX C<grok_bin>
+returns UV_MAX, sets C<PERL_SCAN_GREATER_THAN_UV_MAX> in the output flags,
+and writes the value to I<*result> (or the value is discarded if I<result>
+is NULL).
+
+The binary number may optionally be prefixed with "0b" or "b" unless
+C<PERL_SCAN_DISALLOW_PREFIX> is set in I<*flags> on entry. If
+C<PERL_SCAN_ALLOW_UNDERSCORES> is set in I<*flags> then the binary
+number may use '_' characters to separate digits.
+
+	UV	grok_bin(char* start, STRLEN* len, I32* flags, NV *result)
+
+=for hackers
+Found in file numeric.c
+
+=item grok_hex
+X<grok_hex>
+
+converts a string representing a hex number to numeric form.
+
+On entry I<start> and I<*len> give the string to scan, I<*flags> gives
+conversion flags, and I<result> should be NULL or a pointer to an NV.
+The scan stops at the end of the string, or the first invalid character.
+Unless C<PERL_SCAN_SILENT_ILLDIGIT> is set in I<*flags>, encountering an
+invalid character will also trigger a warning.
+On return I<*len> is set to the length of the scanned string,
+and I<*flags> gives output flags.
+
+If the value is <= UV_MAX it is returned as a UV, the output flags are clear,
+and nothing is written to I<*result>. If the value is > UV_MAX C<grok_hex>
+returns UV_MAX, sets C<PERL_SCAN_GREATER_THAN_UV_MAX> in the output flags,
+and writes the value to I<*result> (or the value is discarded if I<result>
+is NULL).
+
+The hex number may optionally be prefixed with "0x" or "x" unless
+C<PERL_SCAN_DISALLOW_PREFIX> is set in I<*flags> on entry. If
+C<PERL_SCAN_ALLOW_UNDERSCORES> is set in I<*flags> then the hex
+number may use '_' characters to separate digits.
+
+	UV	grok_hex(char* start, STRLEN* len, I32* flags, NV *result)
+
+=for hackers
+Found in file numeric.c
+
+=item grok_number
+X<grok_number>
+
+Recognise (or not) a number.  The type of the number is returned
+(0 if unrecognised), otherwise it is a bit-ORed combination of
+IS_NUMBER_IN_UV, IS_NUMBER_GREATER_THAN_UV_MAX, IS_NUMBER_NOT_INT,
+IS_NUMBER_NEG, IS_NUMBER_INFINITY, IS_NUMBER_NAN (defined in perl.h).
+
+If the value of the number can fit an in UV, it is returned in the *valuep
+IS_NUMBER_IN_UV will be set to indicate that *valuep is valid, IS_NUMBER_IN_UV
+will never be set unless *valuep is valid, but *valuep may have been assigned
+to during processing even though IS_NUMBER_IN_UV is not set on return.
+If valuep is NULL, IS_NUMBER_IN_UV will be set for the same cases as when
+valuep is non-NULL, but no actual assignment (or SEGV) will occur.
+
+IS_NUMBER_NOT_INT will be set with IS_NUMBER_IN_UV if trailing decimals were
+seen (in which case *valuep gives the true value truncated to an integer), and
+IS_NUMBER_NEG if the number is negative (in which case *valuep holds the
+absolute value).  IS_NUMBER_IN_UV is not set if e notation was used or the
+number is larger than a UV.
+
+	int	grok_number(const char *pv, STRLEN len, UV *valuep)
+
+=for hackers
+Found in file numeric.c
+
+=item grok_numeric_radix
+X<grok_numeric_radix>
+
+Scan and skip for a numeric decimal separator (radix).
+
+	bool	grok_numeric_radix(const char **sp, const char *send)
+
+=for hackers
+Found in file numeric.c
+
+=item grok_oct
+X<grok_oct>
+
+converts a string representing an octal number to numeric form.
+
+On entry I<start> and I<*len> give the string to scan, I<*flags> gives
+conversion flags, and I<result> should be NULL or a pointer to an NV.
+The scan stops at the end of the string, or the first invalid character.
+Unless C<PERL_SCAN_SILENT_ILLDIGIT> is set in I<*flags>, encountering an
+invalid character will also trigger a warning.
+On return I<*len> is set to the length of the scanned string,
+and I<*flags> gives output flags.
+
+If the value is <= UV_MAX it is returned as a UV, the output flags are clear,
+and nothing is written to I<*result>. If the value is > UV_MAX C<grok_oct>
+returns UV_MAX, sets C<PERL_SCAN_GREATER_THAN_UV_MAX> in the output flags,
+and writes the value to I<*result> (or the value is discarded if I<result>
+is NULL).
+
+If C<PERL_SCAN_ALLOW_UNDERSCORES> is set in I<*flags> then the octal
+number may use '_' characters to separate digits.
+
+	UV	grok_oct(char* start, STRLEN* len_p, I32* flags, NV *result)
+
+=for hackers
+Found in file numeric.c
+
+=item scan_bin
+X<scan_bin>
+
+For backwards compatibility. Use C<grok_bin> instead.
+
+	NV	scan_bin(char* start, STRLEN len, STRLEN* retlen)
+
+=for hackers
+Found in file numeric.c
+
+=item scan_hex
+X<scan_hex>
+
+For backwards compatibility. Use C<grok_hex> instead.
+
+	NV	scan_hex(char* start, STRLEN len, STRLEN* retlen)
+
+=for hackers
+Found in file numeric.c
+
+=item scan_oct
+X<scan_oct>
+
+For backwards compatibility. Use C<grok_oct> instead.
+
+	NV	scan_oct(char* start, STRLEN len, STRLEN* retlen)
+
+=for hackers
+Found in file numeric.c
+
+
+=back
+
+=head1 Optree Manipulation Functions
+
+=over 8
+
+=item cv_const_sv
+X<cv_const_sv>
+
+If C<cv> is a constant sub eligible for inlining. returns the constant
+value returned by the sub.  Otherwise, returns NULL.
+
+Constant subs can be created with C<newCONSTSUB> or as described in
+L<perlsub/"Constant Functions">.
+
+	SV*	cv_const_sv(CV* cv)
+
+=for hackers
+Found in file op.c
+
+=item newCONSTSUB
+X<newCONSTSUB>
+
+Creates a constant sub equivalent to Perl C<sub FOO () { 123 }> which is
+eligible for inlining at compile-time.
+
+	CV*	newCONSTSUB(HV* stash, char* name, SV* sv)
+
+=for hackers
+Found in file op.c
+
+=item newXS
+X<newXS>
+
+Used by C<xsubpp> to hook up XSUBs as Perl subs.
+
+=for hackers
+Found in file op.c
+
+
+=back
+
+=head1 Pad Data Structures
+
+=over 8
+
+=item pad_sv
+X<pad_sv>
+
+Get the value at offset po in the current pad.
+Use macro PAD_SV instead of calling this function directly.
+
+	SV*	pad_sv(PADOFFSET po)
+
+=for hackers
+Found in file pad.c
+
+
+=back
+
+=head1 Stack Manipulation Macros
+
+=over 8
+
+=item dMARK
+X<dMARK>
+
+Declare a stack marker variable, C<mark>, for the XSUB.  See C<MARK> and
+C<dORIGMARK>.
+
+		dMARK;
+
+=for hackers
+Found in file pp.h
+
+=item dORIGMARK
+X<dORIGMARK>
+
+Saves the original stack mark for the XSUB.  See C<ORIGMARK>.
+
+		dORIGMARK;
+
+=for hackers
+Found in file pp.h
+
+=item dSP
+X<dSP>
+
+Declares a local copy of perl's stack pointer for the XSUB, available via
+the C<SP> macro.  See C<SP>.
+
+		dSP;
+
+=for hackers
+Found in file pp.h
+
+=item EXTEND
+X<EXTEND>
+
+Used to extend the argument stack for an XSUB's return values. Once
+used, guarantees that there is room for at least C<nitems> to be pushed
+onto the stack.
+
+	void	EXTEND(SP, int nitems)
+
+=for hackers
+Found in file pp.h
+
+=item MARK
+X<MARK>
+
+Stack marker variable for the XSUB.  See C<dMARK>.
+
+=for hackers
+Found in file pp.h
+
+=item mPUSHi
+X<mPUSHi>
+
+Push an integer onto the stack.  The stack must have room for this element.
+Handles 'set' magic.  Does not use C<TARG>.  See also C<PUSHi>, C<mXPUSHi>
+and C<XPUSHi>.
+
+	void	mPUSHi(IV iv)
+
+=for hackers
+Found in file pp.h
+
+=item mPUSHn
+X<mPUSHn>
+
+Push a double onto the stack.  The stack must have room for this element.
+Handles 'set' magic.  Does not use C<TARG>.  See also C<PUSHn>, C<mXPUSHn>
+and C<XPUSHn>.
+
+	void	mPUSHn(NV nv)
+
+=for hackers
+Found in file pp.h
+
+=item mPUSHp
+X<mPUSHp>
+
+Push a string onto the stack.  The stack must have room for this element.
+The C<len> indicates the length of the string.  Handles 'set' magic.  Does
+not use C<TARG>.  See also C<PUSHp>, C<mXPUSHp> and C<XPUSHp>.
+
+	void	mPUSHp(char* str, STRLEN len)
+
+=for hackers
+Found in file pp.h
+
+=item mPUSHu
+X<mPUSHu>
+
+Push an unsigned integer onto the stack.  The stack must have room for this
+element.  Handles 'set' magic.  Does not use C<TARG>.  See also C<PUSHu>,
+C<mXPUSHu> and C<XPUSHu>.
+
+	void	mPUSHu(UV uv)
+
+=for hackers
+Found in file pp.h
+
+=item mXPUSHi
+X<mXPUSHi>
+
+Push an integer onto the stack, extending the stack if necessary.  Handles
+'set' magic.  Does not use C<TARG>.  See also C<XPUSHi>, C<mPUSHi> and
+C<PUSHi>.
+
+	void	mXPUSHi(IV iv)
+
+=for hackers
+Found in file pp.h
+
+=item mXPUSHn
+X<mXPUSHn>
+
+Push a double onto the stack, extending the stack if necessary.  Handles
+'set' magic.  Does not use C<TARG>.  See also C<XPUSHn>, C<mPUSHn> and
+C<PUSHn>.
+
+	void	mXPUSHn(NV nv)
+
+=for hackers
+Found in file pp.h
+
+=item mXPUSHp
+X<mXPUSHp>
+
+Push a string onto the stack, extending the stack if necessary.  The C<len>
+indicates the length of the string.  Handles 'set' magic.  Does not use
+C<TARG>.  See also C<XPUSHp>, C<mPUSHp> and C<PUSHp>.
+
+	void	mXPUSHp(char* str, STRLEN len)
+
+=for hackers
+Found in file pp.h
+
+=item mXPUSHu
+X<mXPUSHu>
+
+Push an unsigned integer onto the stack, extending the stack if necessary.
+Handles 'set' magic.  Does not use C<TARG>.  See also C<XPUSHu>, C<mPUSHu>
+and C<PUSHu>.
+
+	void	mXPUSHu(UV uv)
+
+=for hackers
+Found in file pp.h
+
+=item ORIGMARK
+X<ORIGMARK>
+
+The original stack mark for the XSUB.  See C<dORIGMARK>.
+
+=for hackers
+Found in file pp.h
+
+=item POPi
+X<POPi>
+
+Pops an integer off the stack.
+
+	IV	POPi
+
+=for hackers
+Found in file pp.h
+
+=item POPl
+X<POPl>
+
+Pops a long off the stack.
+
+	long	POPl
+
+=for hackers
+Found in file pp.h
+
+=item POPn
+X<POPn>
+
+Pops a double off the stack.
+
+	NV	POPn
+
+=for hackers
+Found in file pp.h
+
+=item POPp
+X<POPp>
+
+Pops a string off the stack. Deprecated. New code should use POPpx.
+
+	char*	POPp
+
+=for hackers
+Found in file pp.h
+
+=item POPpbytex
+X<POPpbytex>
+
+Pops a string off the stack which must consist of bytes i.e. characters < 256.
+
+	char*	POPpbytex
+
+=for hackers
+Found in file pp.h
+
+=item POPpx
+X<POPpx>
+
+Pops a string off the stack.
+
+	char*	POPpx
+
+=for hackers
+Found in file pp.h
+
+=item POPs
+X<POPs>
+
+Pops an SV off the stack.
+
+	SV*	POPs
+
+=for hackers
+Found in file pp.h
+
+=item PUSHi
+X<PUSHi>
+
+Push an integer onto the stack.  The stack must have room for this element.
+Handles 'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it.  Do not call multiple C<TARG>-oriented macros to 
+return lists from XSUB's - see C<mPUSHi> instead.  See also C<XPUSHi> and
+C<mXPUSHi>.
+
+	void	PUSHi(IV iv)
+
+=for hackers
+Found in file pp.h
+
+=item PUSHMARK
+X<PUSHMARK>
+
+Opening bracket for arguments on a callback.  See C<PUTBACK> and
+L<perlcall>.
+
+	void	PUSHMARK(SP)
+
+=for hackers
+Found in file pp.h
+
+=item PUSHmortal
+X<PUSHmortal>
+
+Push a new mortal SV onto the stack.  The stack must have room for this
+element.  Does not handle 'set' magic.  Does not use C<TARG>.  See also
+C<PUSHs>, C<XPUSHmortal> and C<XPUSHs>.
+
+	void	PUSHmortal()
+
+=for hackers
+Found in file pp.h
+
+=item PUSHn
+X<PUSHn>
+
+Push a double onto the stack.  The stack must have room for this element.
+Handles 'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it.  Do not call multiple C<TARG>-oriented macros to
+return lists from XSUB's - see C<mPUSHn> instead.  See also C<XPUSHn> and
+C<mXPUSHn>.
+
+	void	PUSHn(NV nv)
+
+=for hackers
+Found in file pp.h
+
+=item PUSHp
+X<PUSHp>
+
+Push a string onto the stack.  The stack must have room for this element.
+The C<len> indicates the length of the string.  Handles 'set' magic.  Uses
+C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to declare it.  Do not
+call multiple C<TARG>-oriented macros to return lists from XSUB's - see
+C<mPUSHp> instead.  See also C<XPUSHp> and C<mXPUSHp>.
+
+	void	PUSHp(char* str, STRLEN len)
+
+=for hackers
+Found in file pp.h
+
+=item PUSHs
+X<PUSHs>
+
+Push an SV onto the stack.  The stack must have room for this element.
+Does not handle 'set' magic.  Does not use C<TARG>.  See also C<PUSHmortal>,
+C<XPUSHs> and C<XPUSHmortal>.
+
+	void	PUSHs(SV* sv)
+
+=for hackers
+Found in file pp.h
+
+=item PUSHu
+X<PUSHu>
+
+Push an unsigned integer onto the stack.  The stack must have room for this
+element.  Handles 'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG>
+should be called to declare it.  Do not call multiple C<TARG>-oriented
+macros to return lists from XSUB's - see C<mPUSHu> instead.  See also
+C<XPUSHu> and C<mXPUSHu>.
+
+	void	PUSHu(UV uv)
+
+=for hackers
+Found in file pp.h
+
+=item PUTBACK
+X<PUTBACK>
+
+Closing bracket for XSUB arguments.  This is usually handled by C<xsubpp>.
+See C<PUSHMARK> and L<perlcall> for other uses.
+
+		PUTBACK;
+
+=for hackers
+Found in file pp.h
+
+=item SP
+X<SP>
+
+Stack pointer.  This is usually handled by C<xsubpp>.  See C<dSP> and
+C<SPAGAIN>.
+
+=for hackers
+Found in file pp.h
+
+=item SPAGAIN
+X<SPAGAIN>
+
+Refetch the stack pointer.  Used after a callback.  See L<perlcall>.
+
+		SPAGAIN;
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHi
+X<XPUSHi>
+
+Push an integer onto the stack, extending the stack if necessary.  Handles
+'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
+declare it.  Do not call multiple C<TARG>-oriented macros to return lists
+from XSUB's - see C<mXPUSHi> instead.  See also C<PUSHi> and C<mPUSHi>.
+
+	void	XPUSHi(IV iv)
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHmortal
+X<XPUSHmortal>
+
+Push a new mortal SV onto the stack, extending the stack if necessary.  Does
+not handle 'set' magic.  Does not use C<TARG>.  See also C<XPUSHs>,
+C<PUSHmortal> and C<PUSHs>.
+
+	void	XPUSHmortal()
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHn
+X<XPUSHn>
+
+Push a double onto the stack, extending the stack if necessary.  Handles
+'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
+declare it.  Do not call multiple C<TARG>-oriented macros to return lists
+from XSUB's - see C<mXPUSHn> instead.  See also C<PUSHn> and C<mPUSHn>.
+
+	void	XPUSHn(NV nv)
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHp
+X<XPUSHp>
+
+Push a string onto the stack, extending the stack if necessary.  The C<len>
+indicates the length of the string.  Handles 'set' magic.  Uses C<TARG>, so
+C<dTARGET> or C<dXSTARG> should be called to declare it.  Do not call
+multiple C<TARG>-oriented macros to return lists from XSUB's - see
+C<mXPUSHp> instead.  See also C<PUSHp> and C<mPUSHp>.
+
+	void	XPUSHp(char* str, STRLEN len)
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHs
+X<XPUSHs>
+
+Push an SV onto the stack, extending the stack if necessary.  Does not
+handle 'set' magic.  Does not use C<TARG>.  See also C<XPUSHmortal>,
+C<PUSHs> and C<PUSHmortal>.
+
+	void	XPUSHs(SV* sv)
+
+=for hackers
+Found in file pp.h
+
+=item XPUSHu
+X<XPUSHu>
+
+Push an unsigned integer onto the stack, extending the stack if necessary.
+Handles 'set' magic.  Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it.  Do not call multiple C<TARG>-oriented macros to
+return lists from XSUB's - see C<mXPUSHu> instead.  See also C<PUSHu> and
+C<mPUSHu>.
+
+	void	XPUSHu(UV uv)
+
+=for hackers
+Found in file pp.h
+
+=item XSRETURN
+X<XSRETURN>
+
+Return from XSUB, indicating number of items on the stack.  This is usually
+handled by C<xsubpp>.
+
+	void	XSRETURN(int nitems)
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_EMPTY
+X<XSRETURN_EMPTY>
+
+Return an empty list from an XSUB immediately.
+
+		XSRETURN_EMPTY;
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_IV
+X<XSRETURN_IV>
+
+Return an integer from an XSUB immediately.  Uses C<XST_mIV>.
+
+	void	XSRETURN_IV(IV iv)
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_NO
+X<XSRETURN_NO>
+
+Return C<&PL_sv_no> from an XSUB immediately.  Uses C<XST_mNO>.
+
+		XSRETURN_NO;
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_NV
+X<XSRETURN_NV>
+
+Return a double from an XSUB immediately.  Uses C<XST_mNV>.
+
+	void	XSRETURN_NV(NV nv)
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_PV
+X<XSRETURN_PV>
+
+Return a copy of a string from an XSUB immediately.  Uses C<XST_mPV>.
+
+	void	XSRETURN_PV(char* str)
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_UNDEF
+X<XSRETURN_UNDEF>
+
+Return C<&PL_sv_undef> from an XSUB immediately.  Uses C<XST_mUNDEF>.
+
+		XSRETURN_UNDEF;
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_UV
+X<XSRETURN_UV>
+
+Return an integer from an XSUB immediately.  Uses C<XST_mUV>.
+
+	void	XSRETURN_UV(IV uv)
+
+=for hackers
+Found in file XSUB.h
+
+=item XSRETURN_YES
+X<XSRETURN_YES>
+
+Return C<&PL_sv_yes> from an XSUB immediately.  Uses C<XST_mYES>.
+
+		XSRETURN_YES;
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mIV
+X<XST_mIV>
+
+Place an integer into the specified position C<pos> on the stack.  The
+value is stored in a new mortal SV.
+
+	void	XST_mIV(int pos, IV iv)
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mNO
+X<XST_mNO>
+
+Place C<&PL_sv_no> into the specified position C<pos> on the
+stack.
+
+	void	XST_mNO(int pos)
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mNV
+X<XST_mNV>
+
+Place a double into the specified position C<pos> on the stack.  The value
+is stored in a new mortal SV.
+
+	void	XST_mNV(int pos, NV nv)
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mPV
+X<XST_mPV>
+
+Place a copy of a string into the specified position C<pos> on the stack. 
+The value is stored in a new mortal SV.
+
+	void	XST_mPV(int pos, char* str)
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mUNDEF
+X<XST_mUNDEF>
+
+Place C<&PL_sv_undef> into the specified position C<pos> on the
+stack.
+
+	void	XST_mUNDEF(int pos)
+
+=for hackers
+Found in file XSUB.h
+
+=item XST_mYES
+X<XST_mYES>
+
+Place C<&PL_sv_yes> into the specified position C<pos> on the
+stack.
+
+	void	XST_mYES(int pos)
+
+=for hackers
+Found in file XSUB.h
+
+
+=back
+
+=head1 SV Flags
+
+=over 8
+
+=item svtype
+X<svtype>
+
+An enum of flags for Perl types.  These are found in the file B<sv.h>
+in the C<svtype> enum.  Test these flags with the C<SvTYPE> macro.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_IV
+X<SVt_IV>
+
+Integer type flag for scalars.  See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_NV
+X<SVt_NV>
+
+Double type flag for scalars.  See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_PV
+X<SVt_PV>
+
+Pointer type flag for scalars.  See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_PVAV
+X<SVt_PVAV>
+
+Type flag for arrays.  See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_PVCV
+X<SVt_PVCV>
+
+Type flag for code refs.  See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_PVHV
+X<SVt_PVHV>
+
+Type flag for hashes.  See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+=item SVt_PVMG
+X<SVt_PVMG>
+
+Type flag for blessed scalars.  See C<svtype>.
+
+=for hackers
+Found in file sv.h
+
+
+=back
+
+=head1 SV Manipulation Functions
+
+=over 8
+
+=item get_sv
+X<get_sv>
+
+Returns the SV of the specified Perl scalar.  If C<create> is set and the
+Perl variable does not exist then it will be created.  If C<create> is not
+set and the variable does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+	SV*	get_sv(const char* name, I32 create)
+
+=for hackers
+Found in file perl.c
+
+=item looks_like_number
+X<looks_like_number>
+
+Test if the content of an SV looks like a number (or is a number).
+C<Inf> and C<Infinity> are treated as numbers (so will not issue a
+non-numeric warning), even if your atof() doesn't grok them.
+
+	I32	looks_like_number(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item newRV_inc
+X<newRV_inc>
+
+Creates an RV wrapper for an SV.  The reference count for the original SV is
+incremented.
+
+	SV*	newRV_inc(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item newRV_noinc
+X<newRV_noinc>
+
+Creates an RV wrapper for an SV.  The reference count for the original
+SV is B<not> incremented.
+
+	SV*	newRV_noinc(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item NEWSV
+X<NEWSV>
+
+Creates a new SV.  A non-zero C<len> parameter indicates the number of
+bytes of preallocated string space the SV should have.  An extra byte for a
+tailing NUL is also reserved.  (SvPOK is not set for the SV even if string
+space is allocated.)  The reference count for the new SV is set to 1.
+C<id> is an integer id between 0 and 1299 (used to identify leaks).
+
+	SV*	NEWSV(int id, STRLEN len)
+
+=for hackers
+Found in file handy.h
+
+=item newSV
+X<newSV>
+
+Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
+with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
+macro.
+
+	SV*	newSV(STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item newSVhek
+X<newSVhek>
+
+Creates a new SV from the hash key structure.  It will generate scalars that
+point to the shared string table where possible. Returns a new (undefined)
+SV if the hek is NULL.
+
+	SV*	newSVhek(const HEK *hek)
+
+=for hackers
+Found in file sv.c
+
+=item newSViv
+X<newSViv>
+
+Creates a new SV and copies an integer into it.  The reference count for the
+SV is set to 1.
+
+	SV*	newSViv(IV i)
+
+=for hackers
+Found in file sv.c
+
+=item newSVnv
+X<newSVnv>
+
+Creates a new SV and copies a floating point value into it.
+The reference count for the SV is set to 1.
+
+	SV*	newSVnv(NV n)
+
+=for hackers
+Found in file sv.c
+
+=item newSVpv
+X<newSVpv>
+
+Creates a new SV and copies a string into it.  The reference count for the
+SV is set to 1.  If C<len> is zero, Perl will compute the length using
+strlen().  For efficiency, consider using C<newSVpvn> instead.
+
+	SV*	newSVpv(const char* s, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item newSVpvf
+X<newSVpvf>
+
+Creates a new SV and initializes it with the string formatted like
+C<sprintf>.
+
+	SV*	newSVpvf(const char* pat, ...)
+
+=for hackers
+Found in file sv.c
+
+=item newSVpvn
+X<newSVpvn>
+
+Creates a new SV and copies a string into it.  The reference count for the
+SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
+string.  You are responsible for ensuring that the source string is at least
+C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
+
+	SV*	newSVpvn(const char* s, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item newSVpvn_share
+X<newSVpvn_share>
+
+Creates a new SV with its SvPVX_const pointing to a shared string in the string
+table. If the string does not already exist in the table, it is created
+first.  Turns on READONLY and FAKE.  The string's hash is stored in the UV
+slot of the SV; if the C<hash> parameter is non-zero, that value is used;
+otherwise the hash is computed.  The idea here is that as the string table
+is used for shared hash keys these strings will have SvPVX_const == HeKEY and
+hash lookup will avoid string compare.
+
+	SV*	newSVpvn_share(const char* s, I32 len, U32 hash)
+
+=for hackers
+Found in file sv.c
+
+=item newSVrv
+X<newSVrv>
+
+Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
+it will be upgraded to one.  If C<classname> is non-null then the new SV will
+be blessed in the specified package.  The new SV is returned and its
+reference count is 1.
+
+	SV*	newSVrv(SV* rv, const char* classname)
+
+=for hackers
+Found in file sv.c
+
+=item newSVsv
+X<newSVsv>
+
+Creates a new SV which is an exact duplicate of the original SV.
+(Uses C<sv_setsv>).
+
+	SV*	newSVsv(SV* old)
+
+=for hackers
+Found in file sv.c
+
+=item newSVuv
+X<newSVuv>
+
+Creates a new SV and copies an unsigned integer into it.
+The reference count for the SV is set to 1.
+
+	SV*	newSVuv(UV u)
+
+=for hackers
+Found in file sv.c
+
+=item SvCUR
+X<SvCUR>
+
+Returns the length of the string which is in the SV.  See C<SvLEN>.
+
+	STRLEN	SvCUR(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvCUR_set
+X<SvCUR_set>
+
+Set the current length of the string which is in the SV.  See C<SvCUR>
+and C<SvIV_set>.
+
+	void	SvCUR_set(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvEND
+X<SvEND>
+
+Returns a pointer to the last character in the string which is in the SV.
+See C<SvCUR>.  Access the character as *(SvEND(sv)).
+
+	char*	SvEND(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvGROW
+X<SvGROW>
+
+Expands the character buffer in the SV so that it has room for the
+indicated number of bytes (remember to reserve space for an extra trailing
+NUL character).  Calls C<sv_grow> to perform the expansion if necessary.
+Returns a pointer to the character buffer.
+
+	char *	SvGROW(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK
+X<SvIOK>
+
+Returns a boolean indicating whether the SV contains an integer.
+
+	bool	SvIOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOKp
+X<SvIOKp>
+
+Returns a boolean indicating whether the SV contains an integer.  Checks
+the B<private> setting.  Use C<SvIOK>.
+
+	bool	SvIOKp(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_notUV
+X<SvIOK_notUV>
+
+Returns a boolean indicating whether the SV contains a signed integer.
+
+	bool	SvIOK_notUV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_off
+X<SvIOK_off>
+
+Unsets the IV status of an SV.
+
+	void	SvIOK_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_on
+X<SvIOK_on>
+
+Tells an SV that it is an integer.
+
+	void	SvIOK_on(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_only
+X<SvIOK_only>
+
+Tells an SV that it is an integer and disables all other OK bits.
+
+	void	SvIOK_only(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_only_UV
+X<SvIOK_only_UV>
+
+Tells and SV that it is an unsigned integer and disables all other OK bits.
+
+	void	SvIOK_only_UV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_UV
+X<SvIOK_UV>
+
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+	bool	SvIOK_UV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIsCOW
+X<SvIsCOW>
+
+Returns a boolean indicating whether the SV is Copy-On-Write. (either shared
+hash key scalars, or full Copy On Write scalars if 5.9.0 is configured for
+COW)
+
+	bool	SvIsCOW(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIsCOW_shared_hash
+X<SvIsCOW_shared_hash>
+
+Returns a boolean indicating whether the SV is Copy-On-Write shared hash key
+scalar.
+
+	bool	SvIsCOW_shared_hash(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIV
+X<SvIV>
+
+Coerces the given SV to an integer and returns it. See  C<SvIVx> for a
+version which guarantees to evaluate sv only once.
+
+	IV	SvIV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIVX
+X<SvIVX>
+
+Returns the raw value in the SV's IV slot, without checks or conversions.
+Only use when you are sure SvIOK is true. See also C<SvIV()>.
+
+	IV	SvIVX(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIVx
+X<SvIVx>
+
+Coerces the given SV to an integer and returns it. Guarantees to evaluate
+sv only once. Use the more efficient C<SvIV> otherwise.
+
+	IV	SvIVx(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIV_set
+X<SvIV_set>
+
+Set the value of the IV pointer in sv to val.  It is possible to perform
+the same function of this macro with an lvalue assignment to C<SvIVX>.
+With future Perls, however, it will be more efficient to use 
+C<SvIV_set> instead of the lvalue assignment to C<SvIVX>.
+
+	void	SvIV_set(SV* sv, IV val)
+
+=for hackers
+Found in file sv.h
+
+=item SvLEN
+X<SvLEN>
+
+Returns the size of the string buffer in the SV, not including any part
+attributable to C<SvOOK>.  See C<SvCUR>.
+
+	STRLEN	SvLEN(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvLEN_set
+X<SvLEN_set>
+
+Set the actual length of the string which is in the SV.  See C<SvIV_set>.
+
+	void	SvLEN_set(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvMAGIC_set
+X<SvMAGIC_set>
+
+Set the value of the MAGIC pointer in sv to val.  See C<SvIV_set>.
+
+	void	SvMAGIC_set(SV* sv, MAGIC* val)
+
+=for hackers
+Found in file sv.h
+
+=item SvNIOK
+X<SvNIOK>
+
+Returns a boolean indicating whether the SV contains a number, integer or
+double.
+
+	bool	SvNIOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNIOKp
+X<SvNIOKp>
+
+Returns a boolean indicating whether the SV contains a number, integer or
+double.  Checks the B<private> setting.  Use C<SvNIOK>.
+
+	bool	SvNIOKp(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNIOK_off
+X<SvNIOK_off>
+
+Unsets the NV/IV status of an SV.
+
+	void	SvNIOK_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNOK
+X<SvNOK>
+
+Returns a boolean indicating whether the SV contains a double.
+
+	bool	SvNOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNOKp
+X<SvNOKp>
+
+Returns a boolean indicating whether the SV contains a double.  Checks the
+B<private> setting.  Use C<SvNOK>.
+
+	bool	SvNOKp(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNOK_off
+X<SvNOK_off>
+
+Unsets the NV status of an SV.
+
+	void	SvNOK_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNOK_on
+X<SvNOK_on>
+
+Tells an SV that it is a double.
+
+	void	SvNOK_on(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNOK_only
+X<SvNOK_only>
+
+Tells an SV that it is a double and disables all other OK bits.
+
+	void	SvNOK_only(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNV
+X<SvNV>
+
+Coerce the given SV to a double and return it. See  C<SvNVx> for a version
+which guarantees to evaluate sv only once.
+
+	NV	SvNV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNVX
+X<SvNVX>
+
+Returns the raw value in the SV's NV slot, without checks or conversions.
+Only use when you are sure SvNOK is true. See also C<SvNV()>.
+
+	NV	SvNVX(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNVx
+X<SvNVx>
+
+Coerces the given SV to a double and returns it. Guarantees to evaluate
+sv only once. Use the more efficient C<SvNV> otherwise.
+
+	NV	SvNVx(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvNV_set
+X<SvNV_set>
+
+Set the value of the NV pointer in sv to val.  See C<SvIV_set>.
+
+	void	SvNV_set(SV* sv, NV val)
+
+=for hackers
+Found in file sv.h
+
+=item SvOK
+X<SvOK>
+
+Returns a boolean indicating whether the value is an SV. It also tells
+whether the value is defined or not.
+
+	bool	SvOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvOOK
+X<SvOOK>
+
+Returns a boolean indicating whether the SvIVX is a valid offset value for
+the SvPVX.  This hack is used internally to speed up removal of characters
+from the beginning of a SvPV.  When SvOOK is true, then the start of the
+allocated string buffer is really (SvPVX - SvIVX).
+
+	bool	SvOOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOK
+X<SvPOK>
+
+Returns a boolean indicating whether the SV contains a character
+string.
+
+	bool	SvPOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOKp
+X<SvPOKp>
+
+Returns a boolean indicating whether the SV contains a character string.
+Checks the B<private> setting.  Use C<SvPOK>.
+
+	bool	SvPOKp(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOK_off
+X<SvPOK_off>
+
+Unsets the PV status of an SV.
+
+	void	SvPOK_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOK_on
+X<SvPOK_on>
+
+Tells an SV that it is a string.
+
+	void	SvPOK_on(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOK_only
+X<SvPOK_only>
+
+Tells an SV that it is a string and disables all other OK bits.
+Will also turn off the UTF-8 status.
+
+	void	SvPOK_only(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPOK_only_UTF8
+X<SvPOK_only_UTF8>
+
+Tells an SV that it is a string and disables all other OK bits,
+and leaves the UTF-8 status as it was.
+
+	void	SvPOK_only_UTF8(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV
+X<SvPV>
+
+Returns a pointer to the string in the SV, or a stringified form of
+the SV if the SV does not contain a string.  The SV may cache the
+stringified version becoming C<SvPOK>.  Handles 'get' magic. See also
+C<SvPVx> for a version which guarantees to evaluate sv only once.
+
+	char*	SvPV(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVbyte
+X<SvPVbyte>
+
+Like C<SvPV>, but converts sv to byte representation first if necessary.
+
+	char*	SvPVbyte(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVbytex
+X<SvPVbytex>
+
+Like C<SvPV>, but converts sv to byte representation first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte>
+otherwise.
+
+	char*	SvPVbytex(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVbytex_force
+X<SvPVbytex_force>
+
+Like C<SvPV_force>, but converts sv to byte representation first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte_force>
+otherwise.
+
+	char*	SvPVbytex_force(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVbyte_force
+X<SvPVbyte_force>
+
+Like C<SvPV_force>, but converts sv to byte representation first if necessary.
+
+	char*	SvPVbyte_force(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVbyte_nolen
+X<SvPVbyte_nolen>
+
+Like C<SvPV_nolen>, but converts sv to byte representation first if necessary.
+
+	char*	SvPVbyte_nolen(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVutf8
+X<SvPVutf8>
+
+Like C<SvPV>, but converts sv to utf8 first if necessary.
+
+	char*	SvPVutf8(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVutf8x
+X<SvPVutf8x>
+
+Like C<SvPV>, but converts sv to utf8 first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVutf8>
+otherwise.
+
+	char*	SvPVutf8x(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVutf8x_force
+X<SvPVutf8x_force>
+
+Like C<SvPV_force>, but converts sv to utf8 first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVutf8_force>
+otherwise.
+
+	char*	SvPVutf8x_force(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVutf8_force
+X<SvPVutf8_force>
+
+Like C<SvPV_force>, but converts sv to utf8 first if necessary.
+
+	char*	SvPVutf8_force(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVutf8_nolen
+X<SvPVutf8_nolen>
+
+Like C<SvPV_nolen>, but converts sv to utf8 first if necessary.
+
+	char*	SvPVutf8_nolen(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVX
+X<SvPVX>
+
+Returns a pointer to the physical string in the SV.  The SV must contain a
+string.
+
+	char*	SvPVX(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPVx
+X<SvPVx>
+
+A version of C<SvPV> which guarantees to evaluate sv only once.
+
+	char*	SvPVx(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV_force
+X<SvPV_force>
+
+Like C<SvPV> but will force the SV into containing just a string
+(C<SvPOK_only>).  You want force if you are going to update the C<SvPVX>
+directly.
+
+	char*	SvPV_force(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV_force_nomg
+X<SvPV_force_nomg>
+
+Like C<SvPV> but will force the SV into containing just a string
+(C<SvPOK_only>).  You want force if you are going to update the C<SvPVX>
+directly. Doesn't process magic.
+
+	char*	SvPV_force_nomg(SV* sv, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV_nolen
+X<SvPV_nolen>
+
+Returns a pointer to the string in the SV, or a stringified form of
+the SV if the SV does not contain a string.  The SV may cache the
+stringified form becoming C<SvPOK>.  Handles 'get' magic.
+
+	char*	SvPV_nolen(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvPV_set
+X<SvPV_set>
+
+Set the value of the PV pointer in sv to val.  See C<SvIV_set>.
+
+	void	SvPV_set(SV* sv, char* val)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT
+X<SvREFCNT>
+
+Returns the value of the object's reference count.
+
+	U32	SvREFCNT(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_dec
+X<SvREFCNT_dec>
+
+Decrements the reference count of the given SV.
+
+	void	SvREFCNT_dec(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvREFCNT_inc
+X<SvREFCNT_inc>
+
+Increments the reference count of the given SV.
+
+	SV*	SvREFCNT_inc(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvROK
+X<SvROK>
+
+Tests if the SV is an RV.
+
+	bool	SvROK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvROK_off
+X<SvROK_off>
+
+Unsets the RV status of an SV.
+
+	void	SvROK_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvROK_on
+X<SvROK_on>
+
+Tells an SV that it is an RV.
+
+	void	SvROK_on(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvRV
+X<SvRV>
+
+Dereferences an RV to return the SV.
+
+	SV*	SvRV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvRV_set
+X<SvRV_set>
+
+Set the value of the RV pointer in sv to val.  See C<SvIV_set>.
+
+	void	SvRV_set(SV* sv, SV* val)
+
+=for hackers
+Found in file sv.h
+
+=item SvSTASH
+X<SvSTASH>
+
+Returns the stash of the SV.
+
+	HV*	SvSTASH(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvSTASH_set
+X<SvSTASH_set>
+
+Set the value of the STASH pointer in sv to val.  See C<SvIV_set>.
+
+	void	SvSTASH_set(SV* sv, STASH* val)
+
+=for hackers
+Found in file sv.h
+
+=item SvTAINT
+X<SvTAINT>
+
+Taints an SV if tainting is enabled.
+
+	void	SvTAINT(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvTAINTED
+X<SvTAINTED>
+
+Checks to see if an SV is tainted. Returns TRUE if it is, FALSE if
+not.
+
+	bool	SvTAINTED(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvTAINTED_off
+X<SvTAINTED_off>
+
+Untaints an SV. Be I<very> careful with this routine, as it short-circuits
+some of Perl's fundamental security features. XS module authors should not
+use this function unless they fully understand all the implications of
+unconditionally untainting the value. Untainting should be done in the
+standard perl fashion, via a carefully crafted regexp, rather than directly
+untainting variables.
+
+	void	SvTAINTED_off(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvTAINTED_on
+X<SvTAINTED_on>
+
+Marks an SV as tainted if tainting is enabled.
+
+	void	SvTAINTED_on(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvTRUE
+X<SvTRUE>
+
+Returns a boolean indicating whether Perl would evaluate the SV as true or
+false, defined or undefined.  Does not handle 'get' magic.
+
+	bool	SvTRUE(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvTYPE
+X<SvTYPE>
+
+Returns the type of the SV.  See C<svtype>.
+
+	svtype	SvTYPE(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUOK
+X<SvUOK>
+
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+	void	SvUOK(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUPGRADE
+X<SvUPGRADE>
+
+Used to upgrade an SV to a more complex form.  Uses C<sv_upgrade> to
+perform the upgrade if necessary.  See C<svtype>.
+
+	void	SvUPGRADE(SV* sv, svtype type)
+
+=for hackers
+Found in file sv.h
+
+=item SvUTF8
+X<SvUTF8>
+
+Returns a boolean indicating whether the SV contains UTF-8 encoded data.
+
+	bool	SvUTF8(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUTF8_off
+X<SvUTF8_off>
+
+Unsets the UTF-8 status of an SV.
+
+	void	SvUTF8_off(SV *sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUTF8_on
+X<SvUTF8_on>
+
+Turn on the UTF-8 status of an SV (the data is not changed, just the flag).
+Do not use frivolously.
+
+	void	SvUTF8_on(SV *sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUV
+X<SvUV>
+
+Coerces the given SV to an unsigned integer and returns it.  See C<SvUVx>
+for a version which guarantees to evaluate sv only once.
+
+	UV	SvUV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUVX
+X<SvUVX>
+
+Returns the raw value in the SV's UV slot, without checks or conversions.
+Only use when you are sure SvIOK is true. See also C<SvUV()>.
+
+	UV	SvUVX(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUVx
+X<SvUVx>
+
+Coerces the given SV to an unsigned integer and returns it. Guarantees to
+evaluate sv only once. Use the more efficient C<SvUV> otherwise.
+
+	UV	SvUVx(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUV_set
+X<SvUV_set>
+
+Set the value of the UV pointer in sv to val.  See C<SvIV_set>.
+
+	void	SvUV_set(SV* sv, UV val)
+
+=for hackers
+Found in file sv.h
+
+=item sv_2bool
+X<sv_2bool>
+
+This function is only called on magical items, and is only used by
+sv_true() or its macro equivalent.
+
+	bool	sv_2bool(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2cv
+X<sv_2cv>
+
+Using various gambits, try to get a CV from an SV; in addition, try if
+possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
+
+	CV*	sv_2cv(SV* sv, HV** st, GV** gvp, I32 lref)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2io
+X<sv_2io>
+
+Using various gambits, try to get an IO from an SV: the IO slot if its a
+GV; or the recursive result if we're an RV; or the IO slot of the symbol
+named after the PV if we're a string.
+
+	IO*	sv_2io(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2iv
+X<sv_2iv>
+
+Return the integer value of an SV, doing any necessary string conversion,
+magic etc. Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
+
+	IV	sv_2iv(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2mortal
+X<sv_2mortal>
+
+Marks an existing SV as mortal.  The SV will be destroyed "soon", either
+by an explicit call to FREETMPS, or by an implicit call at places such as
+statement boundaries.  SvTEMP() is turned on which means that the SV's
+string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
+and C<sv_mortalcopy>.
+
+	SV*	sv_2mortal(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2nv
+X<sv_2nv>
+
+Return the num value of an SV, doing any necessary string or integer
+conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
+macros.
+
+	NV	sv_2nv(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2pvbyte
+X<sv_2pvbyte>
+
+Return a pointer to the byte-encoded representation of the SV, and set *lp
+to its length.  May cause the SV to be downgraded from UTF-8 as a
+side-effect.
+
+Usually accessed via the C<SvPVbyte> macro.
+
+	char*	sv_2pvbyte(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2pvbyte_nolen
+X<sv_2pvbyte_nolen>
+
+Return a pointer to the byte-encoded representation of the SV.
+May cause the SV to be downgraded from UTF-8 as a side-effect.
+
+Usually accessed via the C<SvPVbyte_nolen> macro.
+
+	char*	sv_2pvbyte_nolen(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2pvutf8
+X<sv_2pvutf8>
+
+Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
+to its length.  May cause the SV to be upgraded to UTF-8 as a side-effect.
+
+Usually accessed via the C<SvPVutf8> macro.
+
+	char*	sv_2pvutf8(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2pvutf8_nolen
+X<sv_2pvutf8_nolen>
+
+Return a pointer to the UTF-8-encoded representation of the SV.
+May cause the SV to be upgraded to UTF-8 as a side-effect.
+
+Usually accessed via the C<SvPVutf8_nolen> macro.
+
+	char*	sv_2pvutf8_nolen(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2pv_flags
+X<sv_2pv_flags>
+
+Returns a pointer to the string value of an SV, and sets *lp to its length.
+If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
+if necessary.
+Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
+usually end up here too.
+
+	char*	sv_2pv_flags(SV* sv, STRLEN* lp, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2pv_nolen
+X<sv_2pv_nolen>
+
+Like C<sv_2pv()>, but doesn't return the length too. You should usually
+use the macro wrapper C<SvPV_nolen(sv)> instead.
+	char*	sv_2pv_nolen(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_2uv
+X<sv_2uv>
+
+Return the unsigned integer value of an SV, doing any necessary string
+conversion, magic etc. Normally used via the C<SvUV(sv)> and C<SvUVx(sv)>
+macros.
+
+	UV	sv_2uv(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_backoff
+X<sv_backoff>
+
+Remove any string offset. You should normally use the C<SvOOK_off> macro
+wrapper instead.
+
+	int	sv_backoff(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_bless
+X<sv_bless>
+
+Blesses an SV into a specified package.  The SV must be an RV.  The package
+must be designated by its stash (see C<gv_stashpv()>).  The reference count
+of the SV is unaffected.
+
+	SV*	sv_bless(SV* sv, HV* stash)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpv
+X<sv_catpv>
+
+Concatenates the string onto the end of the string which is in the SV.
+If the SV has the UTF-8 status set, then the bytes appended should be
+valid UTF-8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
+
+	void	sv_catpv(SV* sv, const char* ptr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvf
+X<sv_catpvf>
+
+Processes its arguments like C<sprintf> and appends the formatted
+output to an SV.  If the appended data contains "wide" characters
+(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
+and characters >255 formatted with %c), the original SV might get
+upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.  See
+C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
+valid UTF-8; if the original SV was bytes, the pattern should be too.
+
+	void	sv_catpvf(SV* sv, const char* pat, ...)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvf_mg
+X<sv_catpvf_mg>
+
+Like C<sv_catpvf>, but also handles 'set' magic.
+
+	void	sv_catpvf_mg(SV *sv, const char* pat, ...)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvn
+X<sv_catpvn>
+
+Concatenates the string onto the end of the string which is in the SV.  The
+C<len> indicates number of bytes to copy.  If the SV has the UTF-8
+status set, then the bytes appended should be valid UTF-8.
+Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
+
+	void	sv_catpvn(SV* sv, const char* ptr, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvn_flags
+X<sv_catpvn_flags>
+
+Concatenates the string onto the end of the string which is in the SV.  The
+C<len> indicates number of bytes to copy.  If the SV has the UTF-8
+status set, then the bytes appended should be valid UTF-8.
+If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
+appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
+in terms of this function.
+
+	void	sv_catpvn_flags(SV* sv, const char* ptr, STRLEN len, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvn_mg
+X<sv_catpvn_mg>
+
+Like C<sv_catpvn>, but also handles 'set' magic.
+
+	void	sv_catpvn_mg(SV *sv, const char *ptr, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catpvn_nomg
+X<sv_catpvn_nomg>
+
+Like C<sv_catpvn> but doesn't process magic.
+
+	void	sv_catpvn_nomg(SV* sv, const char* ptr, STRLEN len)
+
+=for hackers
+Found in file sv.h
+
+=item sv_catpv_mg
+X<sv_catpv_mg>
+
+Like C<sv_catpv>, but also handles 'set' magic.
+
+	void	sv_catpv_mg(SV *sv, const char *ptr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catsv
+X<sv_catsv>
+
+Concatenates the string from SV C<ssv> onto the end of the string in
+SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  Handles 'get' magic, but
+not 'set' magic.  See C<sv_catsv_mg>.
+
+	void	sv_catsv(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catsv_flags
+X<sv_catsv_flags>
+
+Concatenates the string from SV C<ssv> onto the end of the string in
+SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  If C<flags> has C<SV_GMAGIC>
+bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
+and C<sv_catsv_nomg> are implemented in terms of this function.
+
+	void	sv_catsv_flags(SV* dsv, SV* ssv, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catsv_mg
+X<sv_catsv_mg>
+
+Like C<sv_catsv>, but also handles 'set' magic.
+
+	void	sv_catsv_mg(SV *dstr, SV *sstr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_catsv_nomg
+X<sv_catsv_nomg>
+
+Like C<sv_catsv> but doesn't process magic.
+
+	void	sv_catsv_nomg(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item sv_chop
+X<sv_chop>
+
+Efficient removal of characters from the beginning of the string buffer.
+SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
+the string buffer.  The C<ptr> becomes the first character of the adjusted
+string. Uses the "OOK hack".
+Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
+refer to the same chunk of data.
+
+	void	sv_chop(SV* sv, char* ptr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_clear
+X<sv_clear>
+
+Clear an SV: call any destructors, free up any memory used by the body,
+and free the body itself. The SV's head is I<not> freed, although
+its type is set to all 1's so that it won't inadvertently be assumed
+to be live during global destruction etc.
+This function should only be called when REFCNT is zero. Most of the time
+you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
+instead.
+
+	void	sv_clear(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_cmp
+X<sv_cmp>
+
+Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
+string in C<sv1> is less than, equal to, or greater than the string in
+C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
+coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
+
+	I32	sv_cmp(SV* sv1, SV* sv2)
+
+=for hackers
+Found in file sv.c
+
+=item sv_cmp_locale
+X<sv_cmp_locale>
+
+Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
+'use bytes' aware, handles get magic, and will coerce its args to strings
+if necessary.  See also C<sv_cmp_locale>.  See also C<sv_cmp>.
+
+	I32	sv_cmp_locale(SV* sv1, SV* sv2)
+
+=for hackers
+Found in file sv.c
+
+=item sv_collxfrm
+X<sv_collxfrm>
+
+Add Collate Transform magic to an SV if it doesn't already have it.
+
+Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
+scalar data of the variable, but transformed to such a format that a normal
+memory comparison can be used to compare the data according to the locale
+settings.
+
+	char*	sv_collxfrm(SV* sv, STRLEN* nxp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_copypv
+X<sv_copypv>
+
+Copies a stringified representation of the source SV into the
+destination SV.  Automatically performs any necessary mg_get and
+coercion of numeric values into strings.  Guaranteed to preserve
+UTF-8 flag even from overloaded objects.  Similar in nature to
+sv_2pv[_flags] but operates directly on an SV instead of just the
+string.  Mostly uses sv_2pv_flags to do its work, except when that
+would lose the UTF-8'ness of the PV.
+
+	void	sv_copypv(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_dec
+X<sv_dec>
+
+Auto-decrement of the value in the SV, doing string to numeric conversion
+if necessary. Handles 'get' magic.
+
+	void	sv_dec(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_derived_from
+X<sv_derived_from>
+
+Returns a boolean indicating whether the SV is derived from the specified
+class.  This is the function that implements C<UNIVERSAL::isa>.  It works
+for class names as well as for objects.
+
+	bool	sv_derived_from(SV* sv, const char* name)
+
+=for hackers
+Found in file universal.c
+
+=item sv_eq
+X<sv_eq>
+
+Returns a boolean indicating whether the strings in the two SVs are
+identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
+coerce its args to strings if necessary.
+
+	I32	sv_eq(SV* sv1, SV* sv2)
+
+=for hackers
+Found in file sv.c
+
+=item sv_force_normal
+X<sv_force_normal>
+
+Undo various types of fakery on an SV: if the PV is a shared string, make
+a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
+an xpvmg. See also C<sv_force_normal_flags>.
+
+	void	sv_force_normal(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_force_normal_flags
+X<sv_force_normal_flags>
+
+Undo various types of fakery on an SV: if the PV is a shared string, make
+a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
+an xpvmg. The C<flags> parameter gets passed to  C<sv_unref_flags()>
+when unrefing. C<sv_force_normal> calls this function with flags set to 0.
+
+	void	sv_force_normal_flags(SV *sv, U32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_free
+X<sv_free>
+
+Decrement an SV's reference count, and if it drops to zero, call
+C<sv_clear> to invoke destructors and free up any memory used by
+the body; finally, deallocate the SV's head itself.
+Normally called via a wrapper macro C<SvREFCNT_dec>.
+
+	void	sv_free(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_gets
+X<sv_gets>
+
+Get a line from the filehandle and store it into the SV, optionally
+appending to the currently-stored string.
+
+	char*	sv_gets(SV* sv, PerlIO* fp, I32 append)
+
+=for hackers
+Found in file sv.c
+
+=item sv_grow
+X<sv_grow>
+
+Expands the character buffer in the SV.  If necessary, uses C<sv_unref> and
+upgrades the SV to C<SVt_PV>.  Returns a pointer to the character buffer.
+Use the C<SvGROW> wrapper instead.
+
+	char*	sv_grow(SV* sv, STRLEN newlen)
+
+=for hackers
+Found in file sv.c
+
+=item sv_inc
+X<sv_inc>
+
+Auto-increment of the value in the SV, doing string to numeric conversion
+if necessary. Handles 'get' magic.
+
+	void	sv_inc(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_insert
+X<sv_insert>
+
+Inserts a string at the specified offset/length within the SV. Similar to
+the Perl substr() function.
+
+	void	sv_insert(SV* bigsv, STRLEN offset, STRLEN len, char* little, STRLEN littlelen)
+
+=for hackers
+Found in file sv.c
+
+=item sv_isa
+X<sv_isa>
+
+Returns a boolean indicating whether the SV is blessed into the specified
+class.  This does not check for subtypes; use C<sv_derived_from> to verify
+an inheritance relationship.
+
+	int	sv_isa(SV* sv, const char* name)
+
+=for hackers
+Found in file sv.c
+
+=item sv_isobject
+X<sv_isobject>
+
+Returns a boolean indicating whether the SV is an RV pointing to a blessed
+object.  If the SV is not an RV, or if the object is not blessed, then this
+will return false.
+
+	int	sv_isobject(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_iv
+X<sv_iv>
+
+A private implementation of the C<SvIVx> macro for compilers which can't
+cope with complex macro expressions. Always use the macro instead.
+
+	IV	sv_iv(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_len
+X<sv_len>
+
+Returns the length of the string in the SV. Handles magic and type
+coercion.  See also C<SvCUR>, which gives raw access to the xpv_cur slot.
+
+	STRLEN	sv_len(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_len_utf8
+X<sv_len_utf8>
+
+Returns the number of characters in the string in an SV, counting wide
+UTF-8 bytes as a single character. Handles magic and type coercion.
+
+	STRLEN	sv_len_utf8(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_magic
+X<sv_magic>
+
+Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
+then adds a new magic item of type C<how> to the head of the magic list.
+
+See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
+handling of the C<name> and C<namlen> arguments.
+
+You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
+to add more than one instance of the same 'how'.
+
+	void	sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen)
+
+=for hackers
+Found in file sv.c
+
+=item sv_magicext
+X<sv_magicext>
+
+Adds magic to an SV, upgrading it if necessary. Applies the
+supplied vtable and returns a pointer to the magic added.
+
+Note that C<sv_magicext> will allow things that C<sv_magic> will not.
+In particular, you can add magic to SvREADONLY SVs, and add more than
+one instance of the same 'how'.
+
+If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
+stored, if C<namlen> is zero then C<name> is stored as-is and - as another
+special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
+to contain an C<SV*> and is stored as-is with its REFCNT incremented.
+
+(This is now used as a subroutine by C<sv_magic>.)
+
+	MAGIC *	sv_magicext(SV* sv, SV* obj, int how, MGVTBL *vtbl, const char* name, I32 namlen)
+
+=for hackers
+Found in file sv.c
+
+=item sv_mortalcopy
+X<sv_mortalcopy>
+
+Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
+The new SV is marked as mortal. It will be destroyed "soon", either by an
+explicit call to FREETMPS, or by an implicit call at places such as
+statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
+
+	SV*	sv_mortalcopy(SV* oldsv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_newmortal
+X<sv_newmortal>
+
+Creates a new null SV which is mortal.  The reference count of the SV is
+set to 1. It will be destroyed "soon", either by an explicit call to
+FREETMPS, or by an implicit call at places such as statement boundaries.
+See also C<sv_mortalcopy> and C<sv_2mortal>.
+
+	SV*	sv_newmortal()
+
+=for hackers
+Found in file sv.c
+
+=item sv_newref
+X<sv_newref>
+
+Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
+instead.
+
+	SV*	sv_newref(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_nv
+X<sv_nv>
+
+A private implementation of the C<SvNVx> macro for compilers which can't
+cope with complex macro expressions. Always use the macro instead.
+
+	NV	sv_nv(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pos_b2u
+X<sv_pos_b2u>
+
+Converts the value pointed to by offsetp from a count of bytes from the
+start of the string, to a count of the equivalent number of UTF-8 chars.
+Handles magic and type coercion.
+
+	void	sv_pos_b2u(SV* sv, I32* offsetp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pos_u2b
+X<sv_pos_u2b>
+
+Converts the value pointed to by offsetp from a count of UTF-8 chars from
+the start of the string, to a count of the equivalent number of bytes; if
+lenp is non-zero, it does the same to lenp, but this time starting from
+the offset, rather than from the start of the string. Handles magic and
+type coercion.
+
+	void	sv_pos_u2b(SV* sv, I32* offsetp, I32* lenp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pv
+X<sv_pv>
+
+Use the C<SvPV_nolen> macro instead
+
+	char*	sv_pv(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvbyte
+X<sv_pvbyte>
+
+Use C<SvPVbyte_nolen> instead.
+
+	char*	sv_pvbyte(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvbyten
+X<sv_pvbyten>
+
+A private implementation of the C<SvPVbyte> macro for compilers
+which can't cope with complex macro expressions. Always use the macro
+instead.
+
+	char*	sv_pvbyten(SV *sv, STRLEN *len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvbyten_force
+X<sv_pvbyten_force>
+
+A private implementation of the C<SvPVbytex_force> macro for compilers
+which can't cope with complex macro expressions. Always use the macro
+instead.
+
+	char*	sv_pvbyten_force(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvn
+X<sv_pvn>
+
+A private implementation of the C<SvPV> macro for compilers which can't
+cope with complex macro expressions. Always use the macro instead.
+
+	char*	sv_pvn(SV *sv, STRLEN *len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvn_force
+X<sv_pvn_force>
+
+Get a sensible string out of the SV somehow.
+A private implementation of the C<SvPV_force> macro for compilers which
+can't cope with complex macro expressions. Always use the macro instead.
+
+	char*	sv_pvn_force(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvn_force_flags
+X<sv_pvn_force_flags>
+
+Get a sensible string out of the SV somehow.
+If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
+appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
+implemented in terms of this function.
+You normally want to use the various wrapper macros instead: see
+C<SvPV_force> and C<SvPV_force_nomg>
+
+	char*	sv_pvn_force_flags(SV* sv, STRLEN* lp, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvutf8
+X<sv_pvutf8>
+
+Use the C<SvPVutf8_nolen> macro instead
+
+	char*	sv_pvutf8(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvutf8n
+X<sv_pvutf8n>
+
+A private implementation of the C<SvPVutf8> macro for compilers
+which can't cope with complex macro expressions. Always use the macro
+instead.
+
+	char*	sv_pvutf8n(SV *sv, STRLEN *len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvutf8n_force
+X<sv_pvutf8n_force>
+
+A private implementation of the C<SvPVutf8_force> macro for compilers
+which can't cope with complex macro expressions. Always use the macro
+instead.
+
+	char*	sv_pvutf8n_force(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_reftype
+X<sv_reftype>
+
+Returns a string describing what the SV is a reference to.
+
+	char*	sv_reftype(SV* sv, int ob)
+
+=for hackers
+Found in file sv.c
+
+=item sv_replace
+X<sv_replace>
+
+Make the first argument a copy of the second, then delete the original.
+The target SV physically takes over ownership of the body of the source SV
+and inherits its flags; however, the target keeps any magic it owns,
+and any magic in the source is discarded.
+Note that this is a rather specialist SV copying operation; most of the
+time you'll want to use C<sv_setsv> or one of its many macro front-ends.
+
+	void	sv_replace(SV* sv, SV* nsv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_report_used
+X<sv_report_used>
+
+Dump the contents of all SVs not yet freed. (Debugging aid).
+
+	void	sv_report_used()
+
+=for hackers
+Found in file sv.c
+
+=item sv_reset
+X<sv_reset>
+
+Underlying implementation for the C<reset> Perl function.
+Note that the perl-level function is vaguely deprecated.
+
+	void	sv_reset(char* s, HV* stash)
+
+=for hackers
+Found in file sv.c
+
+=item sv_rvweaken
+X<sv_rvweaken>
+
+Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
+referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
+push a back-reference to this RV onto the array of backreferences
+associated with that magic.
+
+	SV*	sv_rvweaken(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setiv
+X<sv_setiv>
+
+Copies an integer into the given SV, upgrading first if necessary.
+Does not handle 'set' magic.  See also C<sv_setiv_mg>.
+
+	void	sv_setiv(SV* sv, IV num)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setiv_mg
+X<sv_setiv_mg>
+
+Like C<sv_setiv>, but also handles 'set' magic.
+
+	void	sv_setiv_mg(SV *sv, IV i)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setnv
+X<sv_setnv>
+
+Copies a double into the given SV, upgrading first if necessary.
+Does not handle 'set' magic.  See also C<sv_setnv_mg>.
+
+	void	sv_setnv(SV* sv, NV num)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setnv_mg
+X<sv_setnv_mg>
+
+Like C<sv_setnv>, but also handles 'set' magic.
+
+	void	sv_setnv_mg(SV *sv, NV num)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpv
+X<sv_setpv>
+
+Copies a string into an SV.  The string must be null-terminated.  Does not
+handle 'set' magic.  See C<sv_setpv_mg>.
+
+	void	sv_setpv(SV* sv, const char* ptr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpvf
+X<sv_setpvf>
+
+Works like C<sv_catpvf> but copies the text into the SV instead of
+appending it.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
+
+	void	sv_setpvf(SV* sv, const char* pat, ...)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpvf_mg
+X<sv_setpvf_mg>
+
+Like C<sv_setpvf>, but also handles 'set' magic.
+
+	void	sv_setpvf_mg(SV *sv, const char* pat, ...)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpviv
+X<sv_setpviv>
+
+Copies an integer into the given SV, also updating its string value.
+Does not handle 'set' magic.  See C<sv_setpviv_mg>.
+
+	void	sv_setpviv(SV* sv, IV num)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpviv_mg
+X<sv_setpviv_mg>
+
+Like C<sv_setpviv>, but also handles 'set' magic.
+
+	void	sv_setpviv_mg(SV *sv, IV iv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpvn
+X<sv_setpvn>
+
+Copies a string into an SV.  The C<len> parameter indicates the number of
+bytes to be copied.  If the C<ptr> argument is NULL the SV will become
+undefined.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
+
+	void	sv_setpvn(SV* sv, const char* ptr, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpvn_mg
+X<sv_setpvn_mg>
+
+Like C<sv_setpvn>, but also handles 'set' magic.
+
+	void	sv_setpvn_mg(SV *sv, const char *ptr, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setpv_mg
+X<sv_setpv_mg>
+
+Like C<sv_setpv>, but also handles 'set' magic.
+
+	void	sv_setpv_mg(SV *sv, const char *ptr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setref_iv
+X<sv_setref_iv>
+
+Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
+argument will be upgraded to an RV.  That RV will be modified to point to
+the new SV.  The C<classname> argument indicates the package for the
+blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
+will have a reference count of 1, and the RV will be returned.
+
+	SV*	sv_setref_iv(SV* rv, const char* classname, IV iv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setref_nv
+X<sv_setref_nv>
+
+Copies a double into a new SV, optionally blessing the SV.  The C<rv>
+argument will be upgraded to an RV.  That RV will be modified to point to
+the new SV.  The C<classname> argument indicates the package for the
+blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
+will have a reference count of 1, and the RV will be returned.
+
+	SV*	sv_setref_nv(SV* rv, const char* classname, NV nv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setref_pv
+X<sv_setref_pv>
+
+Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
+argument will be upgraded to an RV.  That RV will be modified to point to
+the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
+into the SV.  The C<classname> argument indicates the package for the
+blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
+will have a reference count of 1, and the RV will be returned.
+
+Do not use with other Perl types such as HV, AV, SV, CV, because those
+objects will become corrupted by the pointer copy process.
+
+Note that C<sv_setref_pvn> copies the string while this copies the pointer.
+
+	SV*	sv_setref_pv(SV* rv, const char* classname, void* pv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setref_pvn
+X<sv_setref_pvn>
+
+Copies a string into a new SV, optionally blessing the SV.  The length of the
+string must be specified with C<n>.  The C<rv> argument will be upgraded to
+an RV.  That RV will be modified to point to the new SV.  The C<classname>
+argument indicates the package for the blessing.  Set C<classname> to
+C<Nullch> to avoid the blessing.  The new SV will have a reference count 
+of 1, and the RV will be returned.
+
+Note that C<sv_setref_pv> copies the pointer while this copies the string.
+
+	SV*	sv_setref_pvn(SV* rv, const char* classname, char* pv, STRLEN n)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setref_uv
+X<sv_setref_uv>
+
+Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
+argument will be upgraded to an RV.  That RV will be modified to point to
+the new SV.  The C<classname> argument indicates the package for the
+blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
+will have a reference count of 1, and the RV will be returned.
+
+	SV*	sv_setref_uv(SV* rv, const char* classname, UV uv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setsv
+X<sv_setsv>
+
+Copies the contents of the source SV C<ssv> into the destination SV
+C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
+function if the source SV needs to be reused. Does not handle 'set' magic.
+Loosely speaking, it performs a copy-by-value, obliterating any previous
+content of the destination.
+
+You probably want to use one of the assortment of wrappers, such as
+C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
+C<SvSetMagicSV_nosteal>.
+
+	void	sv_setsv(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setsv_flags
+X<sv_setsv_flags>
+
+Copies the contents of the source SV C<ssv> into the destination SV
+C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
+function if the source SV needs to be reused. Does not handle 'set' magic.
+Loosely speaking, it performs a copy-by-value, obliterating any previous
+content of the destination.
+If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
+C<ssv> if appropriate, else not. If the C<flags> parameter has the
+C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
+and C<sv_setsv_nomg> are implemented in terms of this function.
+
+You probably want to use one of the assortment of wrappers, such as
+C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
+C<SvSetMagicSV_nosteal>.
+
+This is the primary function for copying scalars, and most other
+copy-ish functions and macros use this underneath.
+
+	void	sv_setsv_flags(SV* dsv, SV* ssv, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setsv_mg
+X<sv_setsv_mg>
+
+Like C<sv_setsv>, but also handles 'set' magic.
+
+	void	sv_setsv_mg(SV *dstr, SV *sstr)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setsv_nomg
+X<sv_setsv_nomg>
+
+Like C<sv_setsv> but doesn't process magic.
+
+	void	sv_setsv_nomg(SV* dsv, SV* ssv)
+
+=for hackers
+Found in file sv.h
+
+=item sv_setuv
+X<sv_setuv>
+
+Copies an unsigned integer into the given SV, upgrading first if necessary.
+Does not handle 'set' magic.  See also C<sv_setuv_mg>.
+
+	void	sv_setuv(SV* sv, UV num)
+
+=for hackers
+Found in file sv.c
+
+=item sv_setuv_mg
+X<sv_setuv_mg>
+
+Like C<sv_setuv>, but also handles 'set' magic.
+
+	void	sv_setuv_mg(SV *sv, UV u)
+
+=for hackers
+Found in file sv.c
+
+=item sv_taint
+X<sv_taint>
+
+Taint an SV. Use C<SvTAINTED_on> instead.
+	void	sv_taint(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_tainted
+X<sv_tainted>
+
+Test an SV for taintedness. Use C<SvTAINTED> instead.
+	bool	sv_tainted(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_true
+X<sv_true>
+
+Returns true if the SV has a true value by Perl's rules.
+Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
+instead use an in-line version.
+
+	I32	sv_true(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_unmagic
+X<sv_unmagic>
+
+Removes all magic of type C<type> from an SV.
+
+	int	sv_unmagic(SV* sv, int type)
+
+=for hackers
+Found in file sv.c
+
+=item sv_unref
+X<sv_unref>
+
+Unsets the RV status of the SV, and decrements the reference count of
+whatever was being referenced by the RV.  This can almost be thought of
+as a reversal of C<newSVrv>.  This is C<sv_unref_flags> with the C<flag>
+being zero.  See C<SvROK_off>.
+
+	void	sv_unref(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_unref_flags
+X<sv_unref_flags>
+
+Unsets the RV status of the SV, and decrements the reference count of
+whatever was being referenced by the RV.  This can almost be thought of
+as a reversal of C<newSVrv>.  The C<cflags> argument can contain
+C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
+(otherwise the decrementing is conditional on the reference count being
+different from one or the reference being a readonly SV).
+See C<SvROK_off>.
+
+	void	sv_unref_flags(SV* sv, U32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_untaint
+X<sv_untaint>
+
+Untaint an SV. Use C<SvTAINTED_off> instead.
+	void	sv_untaint(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_upgrade
+X<sv_upgrade>
+
+Upgrade an SV to a more complex form.  Generally adds a new body type to the
+SV, then copies across as much information as possible from the old body.
+You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
+
+	bool	sv_upgrade(SV* sv, U32 mt)
+
+=for hackers
+Found in file sv.c
+
+=item sv_usepvn
+X<sv_usepvn>
+
+Tells an SV to use C<ptr> to find its string value.  Normally the string is
+stored inside the SV but sv_usepvn allows the SV to use an outside string.
+The C<ptr> should point to memory that was allocated by C<malloc>.  The
+string length, C<len>, must be supplied.  This function will realloc the
+memory pointed to by C<ptr>, so that pointer should not be freed or used by
+the programmer after giving it to sv_usepvn.  Does not handle 'set' magic.
+See C<sv_usepvn_mg>.
+
+	void	sv_usepvn(SV* sv, char* ptr, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_usepvn_mg
+X<sv_usepvn_mg>
+
+Like C<sv_usepvn>, but also handles 'set' magic.
+
+	void	sv_usepvn_mg(SV *sv, char *ptr, STRLEN len)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_decode
+X<sv_utf8_decode>
+
+If the PV of the SV is an octet sequence in UTF-8
+and contains a multiple-byte character, the C<SvUTF8> flag is turned on
+so that it looks like a character. If the PV contains only single-byte
+characters, the C<SvUTF8> flag stays being off.
+Scans PV for validity and returns false if the PV is invalid UTF-8.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+	bool	sv_utf8_decode(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_downgrade
+X<sv_utf8_downgrade>
+
+Attempts to convert the PV of an SV from characters to bytes.
+If the PV contains a character beyond byte, this conversion will fail;
+in this case, either returns false or, if C<fail_ok> is not
+true, croaks.
+
+This is not as a general purpose Unicode to byte encoding interface:
+use the Encode extension for that.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+	bool	sv_utf8_downgrade(SV *sv, bool fail_ok)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_encode
+X<sv_utf8_encode>
+
+Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
+flag off so that it looks like octets again.
+
+	void	sv_utf8_encode(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_upgrade
+X<sv_utf8_upgrade>
+
+Converts the PV of an SV to its UTF-8-encoded form.
+Forces the SV to string form if it is not already.
+Always sets the SvUTF8 flag to avoid future validity checks even
+if all the bytes have hibit clear.
+
+This is not as a general purpose byte encoding to Unicode interface:
+use the Encode extension for that.
+
+	STRLEN	sv_utf8_upgrade(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_upgrade_flags
+X<sv_utf8_upgrade_flags>
+
+Converts the PV of an SV to its UTF-8-encoded form.
+Forces the SV to string form if it is not already.
+Always sets the SvUTF8 flag to avoid future validity checks even
+if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
+will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
+C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
+
+This is not as a general purpose byte encoding to Unicode interface:
+use the Encode extension for that.
+
+	STRLEN	sv_utf8_upgrade_flags(SV *sv, I32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_uv
+X<sv_uv>
+
+A private implementation of the C<SvUVx> macro for compilers which can't
+cope with complex macro expressions. Always use the macro instead.
+
+	UV	sv_uv(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vcatpvf
+X<sv_vcatpvf>
+
+Processes its arguments like C<vsprintf> and appends the formatted output
+to an SV.  Does not handle 'set' magic.  See C<sv_vcatpvf_mg>.
+
+Usually used via its frontend C<sv_catpvf>.
+
+	void	sv_vcatpvf(SV* sv, const char* pat, va_list* args)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vcatpvfn
+X<sv_vcatpvfn>
+
+Processes its arguments like C<vsprintf> and appends the formatted output
+to an SV.  Uses an array of SVs if the C style variable argument list is
+missing (NULL).  When running with taint checks enabled, indicates via
+C<maybe_tainted> if results are untrustworthy (often due to the use of
+locales).
+
+XXX Except that it maybe_tainted is never assigned to.
+
+Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
+
+	void	sv_vcatpvfn(SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vcatpvf_mg
+X<sv_vcatpvf_mg>
+
+Like C<sv_vcatpvf>, but also handles 'set' magic.
+
+Usually used via its frontend C<sv_catpvf_mg>.
+
+	void	sv_vcatpvf_mg(SV* sv, const char* pat, va_list* args)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vsetpvf
+X<sv_vsetpvf>
+
+Works like C<sv_vcatpvf> but copies the text into the SV instead of
+appending it.  Does not handle 'set' magic.  See C<sv_vsetpvf_mg>.
+
+Usually used via its frontend C<sv_setpvf>.
+
+	void	sv_vsetpvf(SV* sv, const char* pat, va_list* args)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vsetpvfn
+X<sv_vsetpvfn>
+
+Works like C<sv_vcatpvfn> but copies the text into the SV instead of
+appending it.
+
+Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
+
+	void	sv_vsetpvfn(SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
+
+=for hackers
+Found in file sv.c
+
+=item sv_vsetpvf_mg
+X<sv_vsetpvf_mg>
+
+Like C<sv_vsetpvf>, but also handles 'set' magic.
+
+Usually used via its frontend C<sv_setpvf_mg>.
+
+	void	sv_vsetpvf_mg(SV* sv, const char* pat, va_list* args)
+
+=for hackers
+Found in file sv.c
+
+
+=back
+
+=head1 Unicode Support
+
+=over 8
+
+=item bytes_from_utf8
+X<bytes_from_utf8>
+
+Converts a string C<s> of length C<len> from UTF-8 into byte encoding.
+Unlike C<utf8_to_bytes> but like C<bytes_to_utf8>, returns a pointer to
+the newly-created string, and updates C<len> to contain the new
+length.  Returns the original string if no conversion occurs, C<len>
+is unchanged. Do nothing if C<is_utf8> points to 0. Sets C<is_utf8> to
+0 if C<s> is converted or contains all 7bit characters.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+	U8*	bytes_from_utf8(U8 *s, STRLEN *len, bool *is_utf8)
+
+=for hackers
+Found in file utf8.c
+
+=item bytes_to_utf8
+X<bytes_to_utf8>
+
+Converts a string C<s> of length C<len> from ASCII into UTF-8 encoding.
+Returns a pointer to the newly-created string, and sets C<len> to
+reflect the new length.
+
+If you want to convert to UTF-8 from other encodings than ASCII,
+see sv_recode_to_utf8().
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+	U8*	bytes_to_utf8(U8 *s, STRLEN *len)
+
+=for hackers
+Found in file utf8.c
+
+=item ibcmp_utf8
+X<ibcmp_utf8>
+
+Return true if the strings s1 and s2 differ case-insensitively, false
+if not (if they are equal case-insensitively).  If u1 is true, the
+string s1 is assumed to be in UTF-8-encoded Unicode.  If u2 is true,
+the string s2 is assumed to be in UTF-8-encoded Unicode.  If u1 or u2
+are false, the respective string is assumed to be in native 8-bit
+encoding.
+
+If the pe1 and pe2 are non-NULL, the scanning pointers will be copied
+in there (they will point at the beginning of the I<next> character).
+If the pointers behind pe1 or pe2 are non-NULL, they are the end
+pointers beyond which scanning will not continue under any
+circumstances.  If the byte lengths l1 and l2 are non-zero, s1+l1 and
+s2+l2 will be used as goal end pointers that will also stop the scan,
+and which qualify towards defining a successful match: all the scans
+that define an explicit length must reach their goal pointers for
+a match to succeed).
+
+For case-insensitiveness, the "casefolding" of Unicode is used
+instead of upper/lowercasing both the characters, see
+http://www.unicode.org/unicode/reports/tr21/ (Case Mappings).
+
+	I32	ibcmp_utf8(const char* a, char **pe1, UV l1, bool u1, const char* b, char **pe2, UV l2, bool u2)
+
+=for hackers
+Found in file utf8.c
+
+=item is_utf8_char
+X<is_utf8_char>
+
+Tests if some arbitrary number of bytes begins in a valid UTF-8
+character.  Note that an INVARIANT (i.e. ASCII) character is a valid
+UTF-8 character.  The actual number of bytes in the UTF-8 character
+will be returned if it is valid, otherwise 0.
+
+	STRLEN	is_utf8_char(U8 *p)
+
+=for hackers
+Found in file utf8.c
+
+=item is_utf8_string
+X<is_utf8_string>
+
+Returns true if first C<len> bytes of the given string form a valid
+UTF-8 string, false otherwise.  Note that 'a valid UTF-8 string' does
+not mean 'a string that contains code points above 0x7F encoded in UTF-8'
+because a valid ASCII string is a valid UTF-8 string.
+
+See also is_utf8_string_loclen() and is_utf8_string_loc().
+
+	bool	is_utf8_string(U8 *s, STRLEN len)
+
+=for hackers
+Found in file utf8.c
+
+=item is_utf8_string_loc
+X<is_utf8_string_loc>
+
+Like is_utf8_string() but stores the location of the failure (in the
+case of "utf8ness failure") or the location s+len (in the case of
+"utf8ness success") in the C<ep>.
+
+See also is_utf8_string_loclen() and is_utf8_string().
+
+	bool	is_utf8_string_loc(U8 *s, STRLEN len, U8 **p)
+
+=for hackers
+Found in file utf8.c
+
+=item is_utf8_string_loclen
+X<is_utf8_string_loclen>
+
+Like is_utf8_string() but stores the location of the failure (in the
+case of "utf8ness failure") or the location s+len (in the case of
+"utf8ness success") in the C<ep>, and the number of UTF-8
+encoded characters in the C<el>.
+
+See also is_utf8_string_loc() and is_utf8_string().
+
+	bool	is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el)
+
+=for hackers
+Found in file utf8.c
+
+=item pv_uni_display
+X<pv_uni_display>
+
+Build to the scalar dsv a displayable version of the string spv,
+length len, the displayable version being at most pvlim bytes long
+(if longer, the rest is truncated and "..." will be appended).
+
+The flags argument can have UNI_DISPLAY_ISPRINT set to display
+isPRINT()able characters as themselves, UNI_DISPLAY_BACKSLASH
+to display the \\[nrfta\\] as the backslashed versions (like '\n')
+(UNI_DISPLAY_BACKSLASH is preferred over UNI_DISPLAY_ISPRINT for \\).
+UNI_DISPLAY_QQ (and its alias UNI_DISPLAY_REGEX) have both
+UNI_DISPLAY_BACKSLASH and UNI_DISPLAY_ISPRINT turned on.
+
+The pointer to the PV of the dsv is returned.
+
+	char*	pv_uni_display(SV *dsv, U8 *spv, STRLEN len, STRLEN pvlim, UV flags)
+
+=for hackers
+Found in file utf8.c
+
+=item sv_cat_decode
+X<sv_cat_decode>
+
+The encoding is assumed to be an Encode object, the PV of the ssv is
+assumed to be octets in that encoding and decoding the input starts
+from the position which (PV + *offset) pointed to.  The dsv will be
+concatenated the decoded UTF-8 string from ssv.  Decoding will terminate
+when the string tstr appears in decoding output or the input ends on
+the PV of the ssv. The value which the offset points will be modified
+to the last input position on the ssv.
+
+Returns TRUE if the terminator was found, else returns FALSE.
+
+	bool	sv_cat_decode(SV* dsv, SV *encoding, SV *ssv, int *offset, char* tstr, int tlen)
+
+=for hackers
+Found in file sv.c
+
+=item sv_recode_to_utf8
+X<sv_recode_to_utf8>
+
+The encoding is assumed to be an Encode object, on entry the PV
+of the sv is assumed to be octets in that encoding, and the sv
+will be converted into Unicode (and UTF-8).
+
+If the sv already is UTF-8 (or if it is not POK), or if the encoding
+is not a reference, nothing is done to the sv.  If the encoding is not
+an C<Encode::XS> Encoding object, bad things will happen.
+(See F<lib/encoding.pm> and L<Encode>).
+
+The PV of the sv is returned.
+
+	char*	sv_recode_to_utf8(SV* sv, SV *encoding)
+
+=for hackers
+Found in file sv.c
+
+=item sv_uni_display
+X<sv_uni_display>
+
+Build to the scalar dsv a displayable version of the scalar sv,
+the displayable version being at most pvlim bytes long
+(if longer, the rest is truncated and "..." will be appended).
+
+The flags argument is as in pv_uni_display().
+
+The pointer to the PV of the dsv is returned.
+
+	char*	sv_uni_display(SV *dsv, SV *ssv, STRLEN pvlim, UV flags)
+
+=for hackers
+Found in file utf8.c
+
+=item to_utf8_case
+X<to_utf8_case>
+
+The "p" contains the pointer to the UTF-8 string encoding
+the character that is being converted.
+
+The "ustrp" is a pointer to the character buffer to put the
+conversion result to.  The "lenp" is a pointer to the length
+of the result.
+
+The "swashp" is a pointer to the swash to use.
+
+Both the special and normal mappings are stored lib/unicore/To/Foo.pl,
+and loaded by SWASHGET, using lib/utf8_heavy.pl.  The special (usually,
+but not always, a multicharacter mapping), is tried first.
+
+The "special" is a string like "utf8::ToSpecLower", which means the
+hash %utf8::ToSpecLower.  The access to the hash is through
+Perl_to_utf8_case().
+
+The "normal" is a string like "ToLower" which means the swash
+%utf8::ToLower.
+
+	UV	to_utf8_case(U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp, char *normal, char *special)
+
+=for hackers
+Found in file utf8.c
+
+=item to_utf8_fold
+X<to_utf8_fold>
+
+Convert the UTF-8 encoded character at p to its foldcase version and
+store that in UTF-8 in ustrp and its length in bytes in lenp.  Note
+that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
+foldcase version may be longer than the original character (up to
+three characters).
+
+The first character of the foldcased version is returned
+(but note, as explained above, that there may be more.)
+
+	UV	to_utf8_fold(U8 *p, U8* ustrp, STRLEN *lenp)
+
+=for hackers
+Found in file utf8.c
+
+=item to_utf8_lower
+X<to_utf8_lower>
+
+Convert the UTF-8 encoded character at p to its lowercase version and
+store that in UTF-8 in ustrp and its length in bytes in lenp.  Note
+that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
+lowercase version may be longer than the original character.
+
+The first character of the lowercased version is returned
+(but note, as explained above, that there may be more.)
+
+	UV	to_utf8_lower(U8 *p, U8* ustrp, STRLEN *lenp)
+
+=for hackers
+Found in file utf8.c
+
+=item to_utf8_title
+X<to_utf8_title>
+
+Convert the UTF-8 encoded character at p to its titlecase version and
+store that in UTF-8 in ustrp and its length in bytes in lenp.  Note
+that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
+titlecase version may be longer than the original character.
+
+The first character of the titlecased version is returned
+(but note, as explained above, that there may be more.)
+
+	UV	to_utf8_title(U8 *p, U8* ustrp, STRLEN *lenp)
+
+=for hackers
+Found in file utf8.c
+
+=item to_utf8_upper
+X<to_utf8_upper>
+
+Convert the UTF-8 encoded character at p to its uppercase version and
+store that in UTF-8 in ustrp and its length in bytes in lenp.  Note
+that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since
+the uppercase version may be longer than the original character.
+
+The first character of the uppercased version is returned
+(but note, as explained above, that there may be more.)
+
+	UV	to_utf8_upper(U8 *p, U8* ustrp, STRLEN *lenp)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8n_to_uvchr
+X<utf8n_to_uvchr>
+
+Returns the native character value of the first character in the string C<s>
+which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
+length, in bytes, of that character.
+
+Allows length and flags to be passed to low level routine.
+
+	UV	utf8n_to_uvchr(U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8n_to_uvuni
+X<utf8n_to_uvuni>
+
+Bottom level UTF-8 decode routine.
+Returns the unicode code point value of the first character in the string C<s>
+which is assumed to be in UTF-8 encoding and no longer than C<curlen>;
+C<retlen> will be set to the length, in bytes, of that character.
+
+If C<s> does not point to a well-formed UTF-8 character, the behaviour
+is dependent on the value of C<flags>: if it contains UTF8_CHECK_ONLY,
+it is assumed that the caller will raise a warning, and this function
+will silently just set C<retlen> to C<-1> and return zero.  If the
+C<flags> does not contain UTF8_CHECK_ONLY, warnings about
+malformations will be given, C<retlen> will be set to the expected
+length of the UTF-8 character in bytes, and zero will be returned.
+
+The C<flags> can also contain various flags to allow deviations from
+the strict UTF-8 encoding (see F<utf8.h>).
+
+Most code should use utf8_to_uvchr() rather than call this directly.
+
+	UV	utf8n_to_uvuni(U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_distance
+X<utf8_distance>
+
+Returns the number of UTF-8 characters between the UTF-8 pointers C<a>
+and C<b>.
+
+WARNING: use only if you *know* that the pointers point inside the
+same UTF-8 buffer.
+
+	IV	utf8_distance(U8 *a, U8 *b)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_hop
+X<utf8_hop>
+
+Return the UTF-8 pointer C<s> displaced by C<off> characters, either
+forward or backward.
+
+WARNING: do not use the following unless you *know* C<off> is within
+the UTF-8 data pointed to by C<s> *and* that on entry C<s> is aligned
+on the first byte of character or just after the last byte of a character.
+
+	U8*	utf8_hop(U8 *s, I32 off)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_length
+X<utf8_length>
+
+Return the length of the UTF-8 char encoded string C<s> in characters.
+Stops at C<e> (inclusive).  If C<e E<lt> s> or if the scan would end
+up past C<e>, croaks.
+
+	STRLEN	utf8_length(U8* s, U8 *e)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_bytes
+X<utf8_to_bytes>
+
+Converts a string C<s> of length C<len> from UTF-8 into byte encoding.
+Unlike C<bytes_to_utf8>, this over-writes the original string, and
+updates len to contain the new length.
+Returns zero on failure, setting C<len> to -1.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+	U8*	utf8_to_bytes(U8 *s, STRLEN *len)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_uvchr
+X<utf8_to_uvchr>
+
+Returns the native character value of the first character in the string C<s>
+which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
+length, in bytes, of that character.
+
+If C<s> does not point to a well-formed UTF-8 character, zero is
+returned and retlen is set, if possible, to -1.
+
+	UV	utf8_to_uvchr(U8 *s, STRLEN *retlen)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_uvuni
+X<utf8_to_uvuni>
+
+Returns the Unicode code point of the first character in the string C<s>
+which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
+length, in bytes, of that character.
+
+This function should only be used when returned UV is considered
+an index into the Unicode semantic tables (e.g. swashes).
+
+If C<s> does not point to a well-formed UTF-8 character, zero is
+returned and retlen is set, if possible, to -1.
+
+	UV	utf8_to_uvuni(U8 *s, STRLEN *retlen)
+
+=for hackers
+Found in file utf8.c
+
+=item uvchr_to_utf8
+X<uvchr_to_utf8>
+
+Adds the UTF-8 representation of the Native codepoint C<uv> to the end
+of the string C<d>; C<d> should be have at least C<UTF8_MAXBYTES+1> free
+bytes available. The return value is the pointer to the byte after the
+end of the new character. In other words,
+
+    d = uvchr_to_utf8(d, uv);
+
+is the recommended wide native character-aware way of saying
+
+    *(d++) = uv;
+
+	U8*	uvchr_to_utf8(U8 *d, UV uv)
+
+=for hackers
+Found in file utf8.c
+
+=item uvuni_to_utf8_flags
+X<uvuni_to_utf8_flags>
+
+Adds the UTF-8 representation of the Unicode codepoint C<uv> to the end
+of the string C<d>; C<d> should be have at least C<UTF8_MAXBYTES+1> free
+bytes available. The return value is the pointer to the byte after the
+end of the new character. In other words,
+
+    d = uvuni_to_utf8_flags(d, uv, flags);
+
+or, in most cases,
+
+    d = uvuni_to_utf8(d, uv);
+
+(which is equivalent to)
+
+    d = uvuni_to_utf8_flags(d, uv, 0);
+
+is the recommended Unicode-aware way of saying
+
+    *(d++) = uv;
+
+	U8*	uvuni_to_utf8_flags(U8 *d, UV uv, UV flags)
+
+=for hackers
+Found in file utf8.c
+
+
+=back
+
+=head1 Variables created by C<xsubpp> and C<xsubpp> internal functions
+
+=over 8
+
+=item ax
+X<ax>
+
+Variable which is setup by C<xsubpp> to indicate the stack base offset,
+used by the C<ST>, C<XSprePUSH> and C<XSRETURN> macros.  The C<dMARK> macro
+must be called prior to setup the C<MARK> variable.
+
+	I32	ax
+
+=for hackers
+Found in file XSUB.h
+
+=item CLASS
+X<CLASS>
+
+Variable which is setup by C<xsubpp> to indicate the 
+class name for a C++ XS constructor.  This is always a C<char*>.  See C<THIS>.
+
+	char*	CLASS
+
+=for hackers
+Found in file XSUB.h
+
+=item dAX
+X<dAX>
+
+Sets up the C<ax> variable.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+		dAX;
+
+=for hackers
+Found in file XSUB.h
+
+=item dAXMARK
+X<dAXMARK>
+
+Sets up the C<ax> variable and stack marker variable C<mark>.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+		dAXMARK;
+
+=for hackers
+Found in file XSUB.h
+
+=item dITEMS
+X<dITEMS>
+
+Sets up the C<items> variable.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+		dITEMS;
+
+=for hackers
+Found in file XSUB.h
+
+=item dXSARGS
+X<dXSARGS>
+
+Sets up stack and mark pointers for an XSUB, calling dSP and dMARK.
+Sets up the C<ax> and C<items> variables by calling C<dAX> and C<dITEMS>.
+This is usually handled automatically by C<xsubpp>.
+
+		dXSARGS;
+
+=for hackers
+Found in file XSUB.h
+
+=item dXSI32
+X<dXSI32>
+
+Sets up the C<ix> variable for an XSUB which has aliases.  This is usually
+handled automatically by C<xsubpp>.
+
+		dXSI32;
+
+=for hackers
+Found in file XSUB.h
+
+=item items
+X<items>
+
+Variable which is setup by C<xsubpp> to indicate the number of 
+items on the stack.  See L<perlxs/"Variable-length Parameter Lists">.
+
+	I32	items
+
+=for hackers
+Found in file XSUB.h
+
+=item ix
+X<ix>
+
+Variable which is setup by C<xsubpp> to indicate which of an 
+XSUB's aliases was used to invoke it.  See L<perlxs/"The ALIAS: Keyword">.
+
+	I32	ix
+
+=for hackers
+Found in file XSUB.h
+
+=item newXSproto
+X<newXSproto>
+
+Used by C<xsubpp> to hook up XSUBs as Perl subs.  Adds Perl prototypes to
+the subs.
+
+=for hackers
+Found in file XSUB.h
+
+=item RETVAL
+X<RETVAL>
+
+Variable which is setup by C<xsubpp> to hold the return value for an 
+XSUB. This is always the proper type for the XSUB. See 
+L<perlxs/"The RETVAL Variable">.
+
+	(whatever)	RETVAL
+
+=for hackers
+Found in file XSUB.h
+
+=item ST
+X<ST>
+
+Used to access elements on the XSUB's stack.
+
+	SV*	ST(int ix)
+
+=for hackers
+Found in file XSUB.h
+
+=item THIS
+X<THIS>
+
+Variable which is setup by C<xsubpp> to designate the object in a C++ 
+XSUB.  This is always the proper type for the C++ object.  See C<CLASS> and 
+L<perlxs/"Using XS With C++">.
+
+	(whatever)	THIS
+
+=for hackers
+Found in file XSUB.h
+
+=item XS
+X<XS>
+
+Macro to declare an XSUB and its C parameter list.  This is handled by
+C<xsubpp>.
+
+=for hackers
+Found in file XSUB.h
+
+=item XS_VERSION
+X<XS_VERSION>
+
+The version identifier for an XS module.  This is usually
+handled automatically by C<ExtUtils::MakeMaker>.  See C<XS_VERSION_BOOTCHECK>.
+
+=for hackers
+Found in file XSUB.h
+
+=item XS_VERSION_BOOTCHECK
+X<XS_VERSION_BOOTCHECK>
+
+Macro to verify that a PM module's $VERSION variable matches the XS
+module's C<XS_VERSION> variable.  This is usually handled automatically by
+C<xsubpp>.  See L<perlxs/"The VERSIONCHECK: Keyword">.
+
+		XS_VERSION_BOOTCHECK;
+
+=for hackers
+Found in file XSUB.h
+
+
+=back
+
+=head1 Warning and Dieing
+
+=over 8
+
+=item croak
+X<croak>
+
+This is the XSUB-writer's interface to Perl's C<die> function.
+Normally call this function the same way you call the C C<printf>
+function.  Calling C<croak> returns control directly to Perl,
+sidestepping the normal C order of execution. See C<warn>.
+
+If you want to throw an exception object, assign the object to
+C<$@> and then pass C<Nullch> to croak():
+
+   errsv = get_sv("@", TRUE);
+   sv_setsv(errsv, exception_object);
+   croak(Nullch);
+
+	void	croak(const char* pat, ...)
+
+=for hackers
+Found in file util.c
+
+=item warn
+X<warn>
+
+This is the XSUB-writer's interface to Perl's C<warn> function.  Call this
+function the same way you call the C C<printf> function.  See C<croak>.
+
+	void	warn(const char* pat, ...)
+
+=for hackers
+Found in file util.c
+
+
+=back
+
+=head1 AUTHORS
+
+Until May 1997, this document was maintained by Jeff Okamoto
+<okamoto@corp.hp.com>.  It is now maintained as part of Perl itself.
+
+With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
+Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
+Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
+Stephen McCamant, and Gurusamy Sarathy.
+
+API Listing originally by Dean Roehrich <roehrich@cray.com>.
+
+Updated to be autogenerated from comments in the source by Benjamin Stuhl.
+
+=head1 SEE ALSO
+
+perlguts(1), perlxs(1), perlxstut(1), perlintern(1)
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlapio.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlapio.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlapio.pod	(revision 14489)
@@ -0,0 +1,526 @@
+=head1 NAME
+
+perlapio - perl's IO abstraction interface.
+
+=head1 SYNOPSIS
+
+    #define PERLIO_NOT_STDIO 0    /* For co-existence with stdio only */
+    #include <perlio.h>           /* Usually via #include <perl.h> */
+
+    PerlIO *PerlIO_stdin(void);
+    PerlIO *PerlIO_stdout(void);
+    PerlIO *PerlIO_stderr(void);
+
+    PerlIO *PerlIO_open(const char *path,const char *mode);
+    PerlIO *PerlIO_fdopen(int fd, const char *mode);
+    PerlIO *PerlIO_reopen(const char *path, const char *mode, PerlIO *old);  /* deprecated */
+    int     PerlIO_close(PerlIO *f);
+
+    int     PerlIO_stdoutf(const char *fmt,...)
+    int     PerlIO_puts(PerlIO *f,const char *string);
+    int     PerlIO_putc(PerlIO *f,int ch);
+    int     PerlIO_write(PerlIO *f,const void *buf,size_t numbytes);
+    int     PerlIO_printf(PerlIO *f, const char *fmt,...);
+    int     PerlIO_vprintf(PerlIO *f, const char *fmt, va_list args);
+    int     PerlIO_flush(PerlIO *f);
+
+    int     PerlIO_eof(PerlIO *f);
+    int     PerlIO_error(PerlIO *f);
+    void    PerlIO_clearerr(PerlIO *f);
+
+    int     PerlIO_getc(PerlIO *d);
+    int     PerlIO_ungetc(PerlIO *f,int ch);
+    int     PerlIO_read(PerlIO *f, void *buf, size_t numbytes);
+
+    int     PerlIO_fileno(PerlIO *f);
+
+    void    PerlIO_setlinebuf(PerlIO *f);
+
+    Off_t   PerlIO_tell(PerlIO *f);
+    int     PerlIO_seek(PerlIO *f, Off_t offset, int whence);
+    void    PerlIO_rewind(PerlIO *f);
+
+    int     PerlIO_getpos(PerlIO *f, SV *save);        /* prototype changed */
+    int     PerlIO_setpos(PerlIO *f, SV *saved);       /* prototype changed */
+
+    int     PerlIO_fast_gets(PerlIO *f);
+    int     PerlIO_has_cntptr(PerlIO *f);
+    int     PerlIO_get_cnt(PerlIO *f);
+    char   *PerlIO_get_ptr(PerlIO *f);
+    void    PerlIO_set_ptrcnt(PerlIO *f, char *ptr, int count);
+
+    int     PerlIO_canset_cnt(PerlIO *f);              /* deprecated */
+    void    PerlIO_set_cnt(PerlIO *f, int count);      /* deprecated */
+
+    int     PerlIO_has_base(PerlIO *f);
+    char   *PerlIO_get_base(PerlIO *f);
+    int     PerlIO_get_bufsiz(PerlIO *f);
+
+    PerlIO *PerlIO_importFILE(FILE *stdio, const char *mode);
+    FILE   *PerlIO_exportFILE(PerlIO *f, int flags);
+    FILE   *PerlIO_findFILE(PerlIO *f);
+    void    PerlIO_releaseFILE(PerlIO *f,FILE *stdio);
+
+    int     PerlIO_apply_layers(PerlIO *f, const char *mode, const char *layers);
+    int     PerlIO_binmode(PerlIO *f, int ptype, int imode, const char *layers);
+    void    PerlIO_debug(const char *fmt,...)
+
+=head1 DESCRIPTION
+
+Perl's source code, and extensions that want maximum portability,
+should use the above functions instead of those defined in ANSI C's
+I<stdio.h>.  The perl headers (in particular "perlio.h") will
+C<#define> them to the I/O mechanism selected at Configure time.
+
+The functions are modeled on those in I<stdio.h>, but parameter order
+has been "tidied up a little".
+
+C<PerlIO *> takes the place of FILE *. Like FILE * it should be
+treated as opaque (it is probably safe to assume it is a pointer to
+something).
+
+There are currently three implementations:
+
+=over 4
+
+=item 1. USE_STDIO
+
+All above are #define'd to stdio functions or are trivial wrapper
+functions which call stdio. In this case I<only> PerlIO * is a FILE *.
+This has been the default implementation since the abstraction was
+introduced in perl5.003_02.
+
+=item 2. USE_SFIO
+
+A "legacy" implementation in terms of the "sfio" library. Used for
+some specialist applications on Unix machines ("sfio" is not widely
+ported away from Unix).  Most of above are #define'd to the sfio
+functions. PerlIO * is in this case Sfio_t *.
+
+=item 3. USE_PERLIO
+
+Introduced just after perl5.7.0, this is a re-implementation of the
+above abstraction which allows perl more control over how IO is done
+as it decouples IO from the way the operating system and C library
+choose to do things. For USE_PERLIO PerlIO * has an extra layer of
+indirection - it is a pointer-to-a-pointer.  This allows the PerlIO *
+to remain with a known value while swapping the implementation around
+underneath I<at run time>. In this case all the above are true (but
+very simple) functions which call the underlying implementation.
+
+This is the only implementation for which C<PerlIO_apply_layers()>
+does anything "interesting".
+
+The USE_PERLIO implementation is described in L<perliol>.
+
+=back
+
+Because "perlio.h" is a thin layer (for efficiency) the semantics of
+these functions are somewhat dependent on the underlying implementation.
+Where these variations are understood they are noted below.
+
+Unless otherwise noted, functions return 0 on success, or a negative
+value (usually C<EOF> which is usually -1) and set C<errno> on error.
+
+=over 4
+
+=item B<PerlIO_stdin()>, B<PerlIO_stdout()>, B<PerlIO_stderr()>
+
+Use these rather than C<stdin>, C<stdout>, C<stderr>. They are written
+to look like "function calls" rather than variables because this makes
+it easier to I<make them> function calls if platform cannot export data
+to loaded modules, or if (say) different "threads" might have different
+values.
+
+=item B<PerlIO_open(path, mode)>, B<PerlIO_fdopen(fd,mode)>
+
+These correspond to fopen()/fdopen() and the arguments are the same.
+Return C<NULL> and set C<errno> if there is an error.  There may be an
+implementation limit on the number of open handles, which may be lower
+than the limit on the number of open files - C<errno> may not be set
+when C<NULL> is returned if this limit is exceeded.
+
+=item B<PerlIO_reopen(path,mode,f)>
+
+While this currently exists in all three implementations perl itself
+does not use it. I<As perl does not use it, it is not well tested.>
+
+Perl prefers to C<dup> the new low-level descriptor to the descriptor
+used by the existing PerlIO. This may become the behaviour of this
+function in the future.
+
+=item B<PerlIO_printf(f,fmt,...)>, B<PerlIO_vprintf(f,fmt,a)>
+
+These are fprintf()/vfprintf() equivalents.
+
+=item B<PerlIO_stdoutf(fmt,...)>
+
+This is printf() equivalent. printf is #defined to this function,
+so it is (currently) legal to use C<printf(fmt,...)> in perl sources.
+
+=item B<PerlIO_read(f,buf,count)>, B<PerlIO_write(f,buf,count)>
+
+These correspond functionally to fread() and fwrite() but the
+arguments and return values are different.  The PerlIO_read() and
+PerlIO_write() signatures have been modeled on the more sane low level
+read() and write() functions instead: The "file" argument is passed
+first, there is only one "count", and the return value can distinguish
+between error and C<EOF>.
+
+Returns a byte count if successful (which may be zero or
+positive), returns negative value and sets C<errno> on error.
+Depending on implementation C<errno> may be C<EINTR> if operation was
+interrupted by a signal.
+
+=item B<PerlIO_close(f)>
+
+Depending on implementation C<errno> may be C<EINTR> if operation was
+interrupted by a signal.
+
+=item B<PerlIO_puts(f,s)>, B<PerlIO_putc(f,c)>
+
+These correspond to fputs() and fputc().
+Note that arguments have been revised to have "file" first.
+
+=item B<PerlIO_ungetc(f,c)>
+
+This corresponds to ungetc().  Note that arguments have been revised
+to have "file" first.  Arranges that next read operation will return
+the byte B<c>.  Despite the implied "character" in the name only
+values in the range 0..0xFF are defined. Returns the byte B<c> on
+success or -1 (C<EOF>) on error.  The number of bytes that can be
+"pushed back" may vary, only 1 character is certain, and then only if
+it is the last character that was read from the handle.
+
+=item B<PerlIO_getc(f)>
+
+This corresponds to getc().
+Despite the c in the name only byte range 0..0xFF is supported.
+Returns the character read or -1 (C<EOF>) on error.
+
+=item B<PerlIO_eof(f)>
+
+This corresponds to feof().  Returns a true/false indication of
+whether the handle is at end of file.  For terminal devices this may
+or may not be "sticky" depending on the implementation.  The flag is
+cleared by PerlIO_seek(), or PerlIO_rewind().
+
+=item B<PerlIO_error(f)>
+
+This corresponds to ferror().  Returns a true/false indication of
+whether there has been an IO error on the handle.
+
+=item B<PerlIO_fileno(f)>
+
+This corresponds to fileno(), note that on some platforms, the meaning
+of "fileno" may not match Unix. Returns -1 if the handle has no open
+descriptor associated with it.
+
+=item B<PerlIO_clearerr(f)>
+
+This corresponds to clearerr(), i.e., clears 'error' and (usually)
+'eof' flags for the "stream". Does not return a value.
+
+=item B<PerlIO_flush(f)>
+
+This corresponds to fflush().  Sends any buffered write data to the
+underlying file.  If called with C<NULL> this may flush all open
+streams (or core dump with some USE_STDIO implementations).  Calling
+on a handle open for read only, or on which last operation was a read
+of some kind may lead to undefined behaviour on some USE_STDIO
+implementations.  The USE_PERLIO (layers) implementation tries to
+behave better: it flushes all open streams when passed C<NULL>, and
+attempts to retain data on read streams either in the buffer or by
+seeking the handle to the current logical position.
+
+=item B<PerlIO_seek(f,offset,whence)>
+
+This corresponds to fseek().  Sends buffered write data to the
+underlying file, or discards any buffered read data, then positions
+the file descriptor as specified by B<offset> and B<whence> (sic).
+This is the correct thing to do when switching between read and write
+on the same handle (see issues with PerlIO_flush() above).  Offset is
+of type C<Off_t> which is a perl Configure value which may not be same
+as stdio's C<off_t>.
+
+=item B<PerlIO_tell(f)>
+
+This corresponds to ftell().  Returns the current file position, or
+(Off_t) -1 on error.  May just return value system "knows" without
+making a system call or checking the underlying file descriptor (so
+use on shared file descriptors is not safe without a
+PerlIO_seek()). Return value is of type C<Off_t> which is a perl
+Configure value which may not be same as stdio's C<off_t>.
+
+=item B<PerlIO_getpos(f,p)>, B<PerlIO_setpos(f,p)>
+
+These correspond (loosely) to fgetpos() and fsetpos(). Rather than
+stdio's Fpos_t they expect a "Perl Scalar Value" to be passed. What is
+stored there should be considered opaque. The layout of the data may
+vary from handle to handle.  When not using stdio or if platform does
+not have the stdio calls then they are implemented in terms of
+PerlIO_tell() and PerlIO_seek().
+
+=item B<PerlIO_rewind(f)>
+
+This corresponds to rewind(). It is usually defined as being
+
+    PerlIO_seek(f,(Off_t)0L, SEEK_SET);
+    PerlIO_clearerr(f);
+
+=item B<PerlIO_tmpfile()>
+
+This corresponds to tmpfile(), i.e., returns an anonymous PerlIO or
+NULL on error.  The system will attempt to automatically delete the
+file when closed.  On Unix the file is usually C<unlink>-ed just after
+it is created so it does not matter how it gets closed. On other
+systems the file may only be deleted if closed via PerlIO_close()
+and/or the program exits via C<exit>.  Depending on the implementation
+there may be "race conditions" which allow other processes access to
+the file, though in general it will be safer in this regard than
+ad. hoc. schemes.
+
+=item B<PerlIO_setlinebuf(f)>
+
+This corresponds to setlinebuf().  Does not return a value. What
+constitutes a "line" is implementation dependent but usually means
+that writing "\n" flushes the buffer.  What happens with things like
+"this\nthat" is uncertain.  (Perl core uses it I<only> when "dumping";
+it has nothing to do with $| auto-flush.)
+
+=back
+
+=head2 Co-existence with stdio
+
+There is outline support for co-existence of PerlIO with stdio.
+Obviously if PerlIO is implemented in terms of stdio there is no
+problem. However in other cases then mechanisms must exist to create a
+FILE * which can be passed to library code which is going to use stdio
+calls.
+
+The first step is to add this line:
+
+   #define PERLIO_NOT_STDIO 0
+
+I<before> including any perl header files. (This will probably become
+the default at some point).  That prevents "perlio.h" from attempting
+to #define stdio functions onto PerlIO functions.
+
+XS code is probably better using "typemap" if it expects FILE *
+arguments.  The standard typemap will be adjusted to comprehend any
+changes in this area.
+
+=over 4
+
+=item B<PerlIO_importFILE(f,mode)>
+
+Used to get a PerlIO * from a FILE *.
+
+The mode argument should be a string as would be passed to
+fopen/PerlIO_open.  If it is NULL then - for legacy support - the code
+will (depending upon the platform and the implementation) either
+attempt to empirically determine the mode in which I<f> is open, or
+use "r+" to indicate a read/write stream.
+
+Once called the FILE * should I<ONLY> be closed by calling
+C<PerlIO_close()> on the returned PerlIO *.
+
+The PerlIO is set to textmode. Use PerlIO_binmode if this is
+not the desired mode.
+
+This is B<not> the reverse of PerlIO_exportFILE().
+
+=item B<PerlIO_exportFILE(f,mode)>
+
+Given a PerlIO * create a 'native' FILE * suitable for passing to code
+expecting to be compiled and linked with ANSI C I<stdio.h>.  The mode
+argument should be a string as would be passed to fopen/PerlIO_open.
+If it is NULL then - for legacy support - the FILE * is opened in same
+mode as the PerlIO *.
+
+The fact that such a FILE * has been 'exported' is recorded, (normally
+by pushing a new :stdio "layer" onto the PerlIO *), which may affect
+future PerlIO operations on the original PerlIO *.  You should not
+call C<fclose()> on the file unless you call C<PerlIO_releaseFILE()>
+to disassociate it from the PerlIO *.  (Do not use PerlIO_importFILE()
+for doing the disassociation.)
+
+Calling this function repeatedly will create a FILE * on each call
+(and will push an :stdio layer each time as well).
+
+=item B<PerlIO_releaseFILE(p,f)>
+
+Calling PerlIO_releaseFILE informs PerlIO that all use of FILE * is
+complete. It is removed from the list of 'exported' FILE *s, and the
+associated PerlIO * should revert to its original behaviour.
+
+Use this to disassociate a file from a PerlIO * that was associated
+using PerlIO_exportFILE().
+
+=item B<PerlIO_findFILE(f)>
+
+Returns a native FILE * used by a stdio layer. If there is none, it
+will create one with PerlIO_exportFILE. In either case the FILE *
+should be considered as belonging to PerlIO subsystem and should
+only be closed by calling C<PerlIO_close()>.
+
+
+=back
+
+=head2 "Fast gets" Functions
+
+In addition to standard-like API defined so far above there is an
+"implementation" interface which allows perl to get at internals of
+PerlIO.  The following calls correspond to the various FILE_xxx macros
+determined by Configure - or their equivalent in other
+implementations. This section is really of interest to only those
+concerned with detailed perl-core behaviour, implementing a PerlIO
+mapping or writing code which can make use of the "read ahead" that
+has been done by the IO system in the same way perl does. Note that
+any code that uses these interfaces must be prepared to do things the
+traditional way if a handle does not support them.
+
+=over 4
+
+=item B<PerlIO_fast_gets(f)>
+
+Returns true if implementation has all the interfaces required to
+allow perl's C<sv_gets> to "bypass" normal IO mechanism.  This can
+vary from handle to handle.
+
+  PerlIO_fast_gets(f) = PerlIO_has_cntptr(f) && \
+                        PerlIO_canset_cnt(f) && \
+                        `Can set pointer into buffer'
+
+
+=item B<PerlIO_has_cntptr(f)>
+
+Implementation can return pointer to current position in the "buffer"
+and a count of bytes available in the buffer.  Do not use this - use
+PerlIO_fast_gets.
+
+=item B<PerlIO_get_cnt(f)>
+
+Return count of readable bytes in the buffer. Zero or negative return
+means no more bytes available.
+
+=item B<PerlIO_get_ptr(f)>
+
+Return pointer to next readable byte in buffer, accessing via the
+pointer (dereferencing) is only safe if PerlIO_get_cnt() has returned
+a positive value.  Only positive offsets up to value returned by
+PerlIO_get_cnt() are allowed.
+
+=item B<PerlIO_set_ptrcnt(f,p,c)>
+
+Set pointer into buffer, and a count of bytes still in the
+buffer. Should be used only to set pointer to within range implied by
+previous calls to C<PerlIO_get_ptr> and C<PerlIO_get_cnt>. The two
+values I<must> be consistent with each other (implementation may only
+use one or the other or may require both).
+
+=item B<PerlIO_canset_cnt(f)>
+
+Implementation can adjust its idea of number of bytes in the buffer.
+Do not use this - use PerlIO_fast_gets.
+
+=item B<PerlIO_set_cnt(f,c)>
+
+Obscure - set count of bytes in the buffer. Deprecated.  Only usable
+if PerlIO_canset_cnt() returns true.  Currently used in only doio.c to
+force count less than -1 to -1.  Perhaps should be PerlIO_set_empty or
+similar.  This call may actually do nothing if "count" is deduced from
+pointer and a "limit".  Do not use this - use PerlIO_set_ptrcnt().
+
+=item B<PerlIO_has_base(f)>
+
+Returns true if implementation has a buffer, and can return pointer
+to whole buffer and its size. Used by perl for B<-T> / B<-B> tests.
+Other uses would be very obscure...
+
+=item B<PerlIO_get_base(f)>
+
+Return I<start> of buffer. Access only positive offsets in the buffer
+up to the value returned by PerlIO_get_bufsiz().
+
+=item B<PerlIO_get_bufsiz(f)>
+
+Return the I<total number of bytes> in the buffer, this is neither the
+number that can be read, nor the amount of memory allocated to the
+buffer. Rather it is what the operating system and/or implementation
+happened to C<read()> (or whatever) last time IO was requested.
+
+=back
+
+=head2 Other Functions
+
+=over 4
+
+=item PerlIO_apply_layers(f,mode,layers)
+
+The new interface to the USE_PERLIO implementation. The layers ":crlf"
+and ":raw" are only ones allowed for other implementations and those
+are silently ignored. (As of perl5.8 ":raw" is deprecated.)  Use
+PerlIO_binmode() below for the portable case.
+
+=item PerlIO_binmode(f,ptype,imode,layers)
+
+The hook used by perl's C<binmode> operator.
+B<ptype> is perl's character for the kind of IO:
+
+=over 8
+
+=item 'E<lt>' read
+
+=item 'E<gt>' write
+
+=item '+' read/write
+
+=back
+
+B<imode> is C<O_BINARY> or C<O_TEXT>.
+
+B<layers> is a string of layers to apply, only ":crlf" makes sense in
+the non USE_PERLIO case. (As of perl5.8 ":raw" is deprecated in favour
+of passing NULL.)
+
+Portable cases are:
+
+    PerlIO_binmode(f,ptype,O_BINARY,Nullch);
+and
+    PerlIO_binmode(f,ptype,O_TEXT,":crlf");
+
+On Unix these calls probably have no effect whatsoever.  Elsewhere
+they alter "\n" to CR,LF translation and possibly cause a special text
+"end of file" indicator to be written or honoured on read. The effect
+of making the call after doing any IO to the handle depends on the
+implementation. (It may be ignored, affect any data which is already
+buffered as well, or only apply to subsequent data.)
+
+=item PerlIO_debug(fmt,...)
+
+PerlIO_debug is a printf()-like function which can be used for
+debugging.  No return value. Its main use is inside PerlIO where using
+real printf, warn() etc. would recursively call PerlIO and be a
+problem.
+
+PerlIO_debug writes to the file named by $ENV{'PERLIO_DEBUG'} typical
+use might be
+
+  Bourne shells (sh, ksh, bash, zsh, ash, ...):
+   PERLIO_DEBUG=/dev/tty ./perl somescript some args
+
+  Csh/Tcsh:
+   setenv PERLIO_DEBUG /dev/tty
+   ./perl somescript some args
+
+  If you have the "env" utility:
+   env PERLIO_DEBUG=/dev/tty ./perl somescript some args
+
+  Win32:
+   set PERLIO_DEBUG=CON
+   perl somescript some args
+
+If $ENV{'PERLIO_DEBUG'} is not set PerlIO_debug() is a no-op.
+
+=back
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlapollo.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlapollo.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlapollo.pod	(revision 14489)
@@ -0,0 +1,23 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.apollo - Perl version 5 on Apollo DomainOS
+
+=head1 DESCRIPTION
+
+The following tests are known to fail as of Perl 5.005_03:
+
+comp/decl..........FAILED at test 0
+op/write...........FAILED at test 0
+lib/filefind.......FAILED at test 2
+lib/io_udp.........FAILED at test 2
+lib/findbin........stat(/ressel/ABT/USER/vta/jk/proj.local/perl/perl5.005_03-MAINT_TRIAL_5/t/lib/): No such file or directory at ../lib/FindBin.pm line 162
+stat(/ressel/ABT/USER/vta/jk/proj.local/perl/perl5.005_03-MAINT_TRIAL_5/t/lib/): No such file or directory at ../lib/FindBin.pm line 163
+FAILED at test 1
+
+=head1 AUTHOR
+
+Johann Klasek <jk@auto.tuwien.ac.at>
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlartistic.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlartistic.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlartistic.pod	(revision 14489)
@@ -0,0 +1,217 @@
+
+=head1 NAME
+
+perlartistic - the Perl Artistic License
+
+=head1 SYNOPSIS
+
+ You can refer to this document in Pod via "L<perlartistic>"
+ Or you can see this document by entering "perldoc perlartistic"
+
+=head1 DESCRIPTION
+
+This is B<"The Artistic License">. It's here so that modules,
+programs, etc., that want to declare this as their distribution
+license, can link to it.
+
+It is also one of the two licenses Perl allows itself to be
+redistributed and/or modified; for the other one, the GNU General
+Public License, see the L<perlgpl>.
+
+=head1 The "Artistic License"
+
+=head2 Preamble
+
+The intent of this document is to state the conditions under which a
+Package may be copied, such that the Copyright Holder maintains some
+semblance of artistic control over the development of the package,
+while giving the users of the package the right to use and distribute
+the Package in a more-or-less customary fashion, plus the right to make
+reasonable modifications.
+
+=head2 Definitions
+
+=over
+
+=item "Package"
+
+refers to the collection of files distributed by the
+Copyright Holder, and derivatives of that collection of files created
+through textual modification.
+
+=item "Standard Version"
+
+refers to such a Package if it has not been
+modified, or has been modified in accordance with the wishes of the
+Copyright Holder as specified below.
+
+=item "Copyright Holder"
+
+is whoever is named in the copyright or
+copyrights for the package.
+
+=item "You"
+
+is you, if you're thinking about copying or distributing this Package.
+
+=item "Reasonable copying fee"
+
+is whatever you can justify on the basis
+of media cost, duplication charges, time of people involved, and so on.
+(You will not be required to justify it to the Copyright Holder, but
+only to the computing community at large as a market that must bear the
+fee.)
+
+=item "Freely Available"
+
+means that no fee is charged for the item
+itself, though there may be fees involved in handling the item. It also
+means that recipients of the item may redistribute it under the same
+conditions they received it.
+
+=back
+
+=head2 Conditions
+
+=over
+
+=item 1.
+
+You may make and give away verbatim copies of the source form of the
+Standard Version of this Package without restriction, provided that you
+duplicate all of the original copyright notices and associated disclaimers.
+
+=item 2.
+
+You may apply bug fixes, portability fixes and other modifications
+derived from the Public Domain or from the Copyright Holder.  A Package
+modified in such a way shall still be considered the Standard Version.
+
+=item 3.
+
+You may otherwise modify your copy of this Package in any way, provided
+that you insert a prominent notice in each changed file stating how and
+when you changed that file, and provided that you do at least ONE of the
+following:
+
+=over
+
+=item a)
+
+place your modifications in the Public Domain or otherwise make them
+Freely Available, such as by posting said modifications to Usenet or an
+equivalent medium, or placing the modifications on a major archive site
+such as uunet.uu.net, or by allowing the Copyright Holder to include
+your modifications in the Standard Version of the Package.
+
+=item b)
+
+use the modified Package only within your corporation or organization.
+
+=item c)
+
+rename any non-standard executables so the names do not conflict with
+standard executables, which must also be provided, and provide a
+separate manual page for each non-standard executable that clearly
+documents how it differs from the Standard Version.
+
+=item d)
+
+make other distribution arrangements with the Copyright Holder.
+
+=back
+
+=item 4.
+
+You may distribute the programs of this Package in object code or
+executable form, provided that you do at least ONE of the following:
+
+=over
+
+=item a)
+
+distribute a Standard Version of the executables and library files,
+together with instructions (in the manual page or equivalent) on where
+to get the Standard Version.
+
+=item b)
+
+accompany the distribution with the machine-readable source of the
+Package with your modifications.
+
+=item c)
+
+give non-standard executables non-standard names, and clearly
+document the differences in manual pages (or equivalent), together with
+instructions on where to get the Standard Version.
+
+=item d)
+
+make other distribution arrangements with the Copyright Holder.
+
+=back
+
+=item 5.
+
+You may charge a reasonable copying fee for any distribution of this
+Package.  You may charge any fee you choose for support of this
+Package.  You may not charge a fee for this Package itself.  However,
+you may distribute this Package in aggregate with other (possibly
+commercial) programs as part of a larger (possibly commercial) software
+distribution provided that you do not advertise this Package as a
+product of your own.  You may embed this Package's interpreter within
+an executable of yours (by linking); this shall be construed as a mere
+form of aggregation, provided that the complete Standard Version of the
+interpreter is so embedded.
+
+=item 6.
+
+The scripts and library files supplied as input to or produced as
+output from the programs of this Package do not automatically fall
+under the copyright of this Package, but belong to whoever generated
+them, and may be sold commercially, and may be aggregated with this
+Package.  If such scripts or library files are aggregated with this
+Package via the so-called "undump" or "unexec" methods of producing a
+binary executable image, then distribution of such an image shall
+neither be construed as a distribution of this Package nor shall it
+fall under the restrictions of Paragraphs 3 and 4, provided that you do
+not represent such an executable image as a Standard Version of this
+Package.
+
+=item 7.
+
+C subroutines (or comparably compiled subroutines in other
+languages) supplied by you and linked into this Package in order to
+emulate subroutines and variables of the language defined by this
+Package shall not be considered part of this Package, but are the
+equivalent of input as in Paragraph 6, provided these subroutines do
+not change the language in any way that would cause it to fail the
+regression tests for the language.
+
+=item 8.
+
+Aggregation of this Package with a commercial distribution is always
+permitted provided that the use of this Package is embedded; that is,
+when no overt attempt is made to make this Package's interfaces visible
+to the end user of the commercial distribution.  Such use shall not be
+construed as a distribution of this Package.
+
+=item 9.
+
+The name of the Copyright Holder may not be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+
+=item 10.
+
+THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+=back
+
+The End
+
+=cut
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbeos.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbeos.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbeos.pod	(revision 14489)
@@ -0,0 +1,109 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.beos - Perl version 5.8+ on BeOS
+
+=head1 DESCRIPTION
+
+This file contains instructions how to build Perl under BeOS and lists
+known problems.
+
+=head1 BUILD AND INSTALL
+
+=head2 Requirements
+
+I have built and tested Perl 5.8.6 and 5.9.1 under BeOS R5 x86 net server.
+I can't say anything with regard to PPC. Since Perl 5.8.0 had been released
+for BeOS BONE, I suspect, there is a good chance, that it still compiles on
+a BONE system. The only change I've made, that affects BONE systems is the
+recognition of whether it is a BONE system or not in C<hints/beos.sh>. Now
+network socket support should remain enabled on BONE systems. This might
+as well break the build, though.
+
+As more recent versions of autoconf require flock() support, I wrote a flock()
+emulation (flock_server) and released it on BeBits:
+
+	http://www.bebits.com/app/4030
+
+If you want to build a Perl with flock() support, you have to install this
+package first.
+
+=head2 Configure
+
+With flock() support:
+
+	CFLAGS=-I/path/to/flock/server/headers ./configure.gnu \
+		--prefix=/boot/home/config
+
+Replace C</path/to/flock/server/headers> with the path to the directory
+containing the C<flock.h> header.
+
+Without flock() support:
+
+	./configure.gnu --prefix=/boot/home/config
+
+=head2 Build
+
+With flock() support:
+
+	make LDLOADLIBS="-lnet -lflock"
+
+Without flock() support:
+
+	make LDLOADLIBS="-lnet"
+
+C<-lnet> is needed on net server systems only and if the compiler doesn't
+add it automatically (Be's R5 gcc does, Oliver Tappe's gcc 2.95.3 does not).
+
+=head2 Install
+
+Install all perl files:
+
+	make install
+
+Create a symlink for libperl:
+
+	cd ~/config/lib; ln -s perl5/5.8.6/BePC-beos/CORE/libperl.so .
+
+Replace C<5.8.6> with your respective version of Perl.
+
+=head1 KNOWN PROBLEMS
+
+=over 4
+
+=item *
+
+Network socket support is disabled for BeOS R5 net server. I didn't dare yet
+to try enabling it and see what problems occur.
+
+=item *
+
+The LFS (large file support) tests (C<t/op/lfs> and C<xt/Fcntl/t/syslfs>) are
+disabled as seeking beyond 2 GB is broken according to jhi@iki.fi who was the
+last one checking the BeOS port and updating this file before me. Haven't
+checked this myself.
+
+=item *
+
+The C<t/io/fflush> test fails at #6. As far as I can tell, this is caused by
+a bug in the BeOS pipes implementation that occurs when starting other child
+processes. In the particular test case a C<system("perl -e 0")> flushes the
+stdout pipe of another child process.
+
+=item *
+
+The C<ext/POSIX/t/waitpid> test fails at #1. After all child processes are
+gone BeOS' waitpid(-1,...) returns 0 instead of -1 (as it should). No idea
+how to fix this.
+
+=back
+
+=head1 CONTACT
+
+For BeOS specifics problems feel free to mail to:
+Ingo Weinhold <bonefish@cs.tu-berlin.de>
+
+Last update: 2004-12-16
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbook.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbook.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbook.pod	(revision 14489)
@@ -0,0 +1,17 @@
+=head1 NAME
+
+perlbook - Perl book information
+
+=head1 DESCRIPTION
+
+The Camel Book, officially known as I<Programming Perl, Third Edition>,
+by Larry Wall et al, is the definitive reference work covering nearly
+all of Perl.  You can order it and other Perl books from O'Reilly &
+Associates, 1-800-998-9938.  Local/overseas is +1 707 829 0515.  If you
+can locate an O'Reilly order form, you can also fax to +1 707 829 0104.
+If you're web-connected, you can even mosey on over to
+L<http://www.oreilly.com/> for an online order form.
+
+Other Perl books from various publishers and authors 
+can be found listed in L<perlfaq2> or on the web at
+L<http://books.perl.org/>.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlboot.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlboot.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlboot.pod	(revision 14489)
@@ -0,0 +1,816 @@
+=head1 NAME
+
+perlboot - Beginner's Object-Oriented Tutorial
+
+=head1 DESCRIPTION
+
+If you're not familiar with objects from other languages, some of the
+other Perl object documentation may be a little daunting, such as
+L<perlobj>, a basic reference in using objects, and L<perltoot>, which
+introduces readers to the peculiarities of Perl's object system in a
+tutorial way.
+
+So, let's take a different approach, presuming no prior object
+experience. It helps if you know about subroutines (L<perlsub>),
+references (L<perlref> et. seq.), and packages (L<perlmod>), so become
+familiar with those first if you haven't already.
+
+=head2 If we could talk to the animals...
+
+Let's let the animals talk for a moment:
+
+    sub Cow::speak {
+      print "a Cow goes moooo!\n";
+    }
+    sub Horse::speak {
+      print "a Horse goes neigh!\n";
+    }
+    sub Sheep::speak {
+      print "a Sheep goes baaaah!\n"
+    }
+
+    Cow::speak;
+    Horse::speak;
+    Sheep::speak;
+
+This results in:
+
+    a Cow goes moooo!
+    a Horse goes neigh!
+    a Sheep goes baaaah!
+
+Nothing spectacular here.  Simple subroutines, albeit from separate
+packages, and called using the full package name.  So let's create
+an entire pasture:
+
+    # Cow::speak, Horse::speak, Sheep::speak as before
+    @pasture = qw(Cow Cow Horse Sheep Sheep);
+    foreach $animal (@pasture) {
+      &{$animal."::speak"};
+    }
+
+This results in:
+
+    a Cow goes moooo!
+    a Cow goes moooo!
+    a Horse goes neigh!
+    a Sheep goes baaaah!
+    a Sheep goes baaaah!
+
+Wow.  That symbolic coderef de-referencing there is pretty nasty.
+We're counting on C<no strict subs> mode, certainly not recommended
+for larger programs.  And why was that necessary?  Because the name of
+the package seems to be inseparable from the name of the subroutine we
+want to invoke within that package.
+
+Or is it?
+
+=head2 Introducing the method invocation arrow
+
+For now, let's say that C<< Class->method >> invokes subroutine
+C<method> in package C<Class>.  (Here, "Class" is used in its
+"category" meaning, not its "scholastic" meaning.) That's not
+completely accurate, but we'll do this one step at a time.  Now let's
+use it like so:
+
+    # Cow::speak, Horse::speak, Sheep::speak as before
+    Cow->speak;
+    Horse->speak;
+    Sheep->speak;
+
+And once again, this results in:
+
+    a Cow goes moooo!
+    a Horse goes neigh!
+    a Sheep goes baaaah!
+
+That's not fun yet.  Same number of characters, all constant, no
+variables.  But yet, the parts are separable now.  Watch:
+
+    $a = "Cow";
+    $a->speak; # invokes Cow->speak
+
+Ahh!  Now that the package name has been parted from the subroutine
+name, we can use a variable package name.  And this time, we've got
+something that works even when C<use strict refs> is enabled.
+
+=head2 Invoking a barnyard
+
+Let's take that new arrow invocation and put it back in the barnyard
+example:
+
+    sub Cow::speak {
+      print "a Cow goes moooo!\n";
+    }
+    sub Horse::speak {
+      print "a Horse goes neigh!\n";
+    }
+    sub Sheep::speak {
+      print "a Sheep goes baaaah!\n"
+    }
+
+    @pasture = qw(Cow Cow Horse Sheep Sheep);
+    foreach $animal (@pasture) {
+      $animal->speak;
+    }
+
+There!  Now we have the animals all talking, and safely at that,
+without the use of symbolic coderefs.
+
+But look at all that common code.  Each of the C<speak> routines has a
+similar structure: a C<print> operator and a string that contains
+common text, except for two of the words.  It'd be nice if we could
+factor out the commonality, in case we decide later to change it all
+to C<says> instead of C<goes>.
+
+And we actually have a way of doing that without much fuss, but we
+have to hear a bit more about what the method invocation arrow is
+actually doing for us.
+
+=head2 The extra parameter of method invocation
+
+The invocation of:
+
+    Class->method(@args)
+
+attempts to invoke subroutine C<Class::method> as:
+
+    Class::method("Class", @args);
+
+(If the subroutine can't be found, "inheritance" kicks in, but we'll
+get to that later.)  This means that we get the class name as the
+first parameter (the only parameter, if no arguments are given).  So
+we can rewrite the C<Sheep> speaking subroutine as:
+
+    sub Sheep::speak {
+      my $class = shift;
+      print "a $class goes baaaah!\n";
+    }
+
+And the other two animals come out similarly:
+
+    sub Cow::speak {
+      my $class = shift;
+      print "a $class goes moooo!\n";
+    }
+    sub Horse::speak {
+      my $class = shift;
+      print "a $class goes neigh!\n";
+    }
+
+In each case, C<$class> will get the value appropriate for that
+subroutine.  But once again, we have a lot of similar structure.  Can
+we factor that out even further?  Yes, by calling another method in
+the same class.
+
+=head2 Calling a second method to simplify things
+
+Let's call out from C<speak> to a helper method called C<sound>.
+This method provides the constant text for the sound itself.
+
+    { package Cow;
+      sub sound { "moooo" }
+      sub speak {
+	my $class = shift;
+	print "a $class goes ", $class->sound, "!\n"
+      }
+    }
+
+Now, when we call C<< Cow->speak >>, we get a C<$class> of C<Cow> in
+C<speak>.  This in turn selects the C<< Cow->sound >> method, which
+returns C<moooo>.  But how different would this be for the C<Horse>?
+
+    { package Horse;
+      sub sound { "neigh" }
+      sub speak {
+	my $class = shift;
+	print "a $class goes ", $class->sound, "!\n"
+      }
+    }
+
+Only the name of the package and the specific sound change.  So can we
+somehow share the definition for C<speak> between the Cow and the
+Horse?  Yes, with inheritance!
+
+=head2 Inheriting the windpipes
+
+We'll define a common subroutine package called C<Animal>, with the
+definition for C<speak>:
+
+    { package Animal;
+      sub speak {
+	my $class = shift;
+	print "a $class goes ", $class->sound, "!\n"
+      }
+    }
+
+Then, for each animal, we say it "inherits" from C<Animal>, along
+with the animal-specific sound:
+
+    { package Cow;
+      @ISA = qw(Animal);
+      sub sound { "moooo" }
+    }
+
+Note the added C<@ISA> array.  We'll get to that in a minute.
+
+But what happens when we invoke C<< Cow->speak >> now?
+
+First, Perl constructs the argument list.  In this case, it's just
+C<Cow>.  Then Perl looks for C<Cow::speak>.  But that's not there, so
+Perl checks for the inheritance array C<@Cow::ISA>.  It's there,
+and contains the single name C<Animal>.
+
+Perl next checks for C<speak> inside C<Animal> instead, as in
+C<Animal::speak>.  And that's found, so Perl invokes that subroutine
+with the already frozen argument list.
+
+Inside the C<Animal::speak> subroutine, C<$class> becomes C<Cow> (the
+first argument).  So when we get to the step of invoking
+C<< $class->sound >>, it'll be looking for C<< Cow->sound >>, which
+gets it on the first try without looking at C<@ISA>.  Success!
+
+=head2 A few notes about @ISA
+
+This magical C<@ISA> variable (pronounced "is a" not "ice-uh"), has
+declared that C<Cow> "is a" C<Animal>.  Note that it's an array,
+not a simple single value, because on rare occasions, it makes sense
+to have more than one parent class searched for the missing methods.
+
+If C<Animal> also had an C<@ISA>, then we'd check there too.  The
+search is recursive, depth-first, left-to-right in each C<@ISA>.
+Typically, each C<@ISA> has only one element (multiple elements means
+multiple inheritance and multiple headaches), so we get a nice tree of
+inheritance.
+
+When we turn on C<use strict>, we'll get complaints on C<@ISA>, since
+it's not a variable containing an explicit package name, nor is it a
+lexical ("my") variable.  We can't make it a lexical variable though
+(it has to belong to the package to be found by the inheritance mechanism),
+so there's a couple of straightforward ways to handle that.
+
+The easiest is to just spell the package name out:
+
+    @Cow::ISA = qw(Animal);
+
+Or allow it as an implicitly named package variable:
+
+    package Cow;
+    use vars qw(@ISA);
+    @ISA = qw(Animal);
+
+If you're bringing in the class from outside, via an object-oriented
+module, you change:
+
+    package Cow;
+    use Animal;
+    use vars qw(@ISA);
+    @ISA = qw(Animal);
+
+into just:
+
+    package Cow;
+    use base qw(Animal);
+
+And that's pretty darn compact.
+
+=head2 Overriding the methods
+
+Let's add a mouse, which can barely be heard:
+
+    # Animal package from before
+    { package Mouse;
+      @ISA = qw(Animal);
+      sub sound { "squeak" }
+      sub speak {
+        my $class = shift;
+	print "a $class goes ", $class->sound, "!\n";
+	print "[but you can barely hear it!]\n";
+      }
+    }
+
+    Mouse->speak;
+
+which results in:
+
+    a Mouse goes squeak!
+    [but you can barely hear it!]
+
+Here, C<Mouse> has its own speaking routine, so C<< Mouse->speak >>
+doesn't immediately invoke C<< Animal->speak >>.  This is known as
+"overriding".  In fact, we didn't even need to say that a C<Mouse> was
+an C<Animal> at all, since all of the methods needed for C<speak> are
+completely defined with C<Mouse>.
+
+But we've now duplicated some of the code from C<< Animal->speak >>,
+and this can once again be a maintenance headache.  So, can we avoid
+that?  Can we say somehow that a C<Mouse> does everything any other
+C<Animal> does, but add in the extra comment?  Sure!
+
+First, we can invoke the C<Animal::speak> method directly:
+
+    # Animal package from before
+    { package Mouse;
+      @ISA = qw(Animal);
+      sub sound { "squeak" }
+      sub speak {
+        my $class = shift;
+        Animal::speak($class);
+	print "[but you can barely hear it!]\n";
+      }
+    }
+
+Note that we have to include the C<$class> parameter (almost surely
+the value of C<"Mouse">) as the first parameter to C<Animal::speak>,
+since we've stopped using the method arrow.  Why did we stop?  Well,
+if we invoke C<< Animal->speak >> there, the first parameter to the
+method will be C<"Animal"> not C<"Mouse">, and when time comes for it
+to call for the C<sound>, it won't have the right class to come back
+to this package.
+
+Invoking C<Animal::speak> directly is a mess, however.  What if
+C<Animal::speak> didn't exist before, and was being inherited from a
+class mentioned in C<@Animal::ISA>?  Because we are no longer using
+the method arrow, we get one and only one chance to hit the right
+subroutine.
+
+Also note that the C<Animal> classname is now hardwired into the
+subroutine selection.  This is a mess if someone maintains the code,
+changing C<@ISA> for <Mouse> and didn't notice C<Animal> there in
+C<speak>.  So, this is probably not the right way to go.
+
+=head2 Starting the search from a different place
+
+A better solution is to tell Perl to search from a higher place
+in the inheritance chain:
+
+    # same Animal as before
+    { package Mouse;
+      # same @ISA, &sound as before
+      sub speak {
+        my $class = shift;
+        $class->Animal::speak;
+        print "[but you can barely hear it!]\n";
+      }
+    }
+
+Ahh.  This works.  Using this syntax, we start with C<Animal> to find
+C<speak>, and use all of C<Animal>'s inheritance chain if not found
+immediately.  And yet the first parameter will be C<$class>, so the
+found C<speak> method will get C<Mouse> as its first entry, and
+eventually work its way back to C<Mouse::sound> for the details.
+
+But this isn't the best solution.  We still have to keep the C<@ISA>
+and the initial search package coordinated.  Worse, if C<Mouse> had
+multiple entries in C<@ISA>, we wouldn't necessarily know which one
+had actually defined C<speak>.  So, is there an even better way?
+
+=head2 The SUPER way of doing things
+
+By changing the C<Animal> class to the C<SUPER> class in that
+invocation, we get a search of all of our super classes (classes
+listed in C<@ISA>) automatically:
+
+    # same Animal as before
+    { package Mouse;
+      # same @ISA, &sound as before
+      sub speak {
+        my $class = shift;
+        $class->SUPER::speak;
+        print "[but you can barely hear it!]\n";
+      }
+    }
+
+So, C<SUPER::speak> means look in the current package's C<@ISA> for
+C<speak>, invoking the first one found. Note that it does I<not> look in
+the C<@ISA> of C<$class>.
+
+=head2 Where we're at so far...
+
+So far, we've seen the method arrow syntax:
+
+  Class->method(@args);
+
+or the equivalent:
+
+  $a = "Class";
+  $a->method(@args);
+
+which constructs an argument list of:
+
+  ("Class", @args)
+
+and attempts to invoke
+
+  Class::method("Class", @Args);
+
+However, if C<Class::method> is not found, then C<@Class::ISA> is examined
+(recursively) to locate a package that does indeed contain C<method>,
+and that subroutine is invoked instead.
+
+Using this simple syntax, we have class methods, (multiple)
+inheritance, overriding, and extending.  Using just what we've seen so
+far, we've been able to factor out common code, and provide a nice way
+to reuse implementations with variations.  This is at the core of what
+objects provide, but objects also provide instance data, which we
+haven't even begun to cover.
+
+=head2 A horse is a horse, of course of course -- or is it?
+
+Let's start with the code for the C<Animal> class
+and the C<Horse> class:
+
+  { package Animal;
+    sub speak {
+      my $class = shift;
+      print "a $class goes ", $class->sound, "!\n"
+    }
+  }
+  { package Horse;
+    @ISA = qw(Animal);
+    sub sound { "neigh" }
+  }
+
+This lets us invoke C<< Horse->speak >> to ripple upward to
+C<Animal::speak>, calling back to C<Horse::sound> to get the specific
+sound, and the output of:
+
+  a Horse goes neigh!
+
+But all of our Horse objects would have to be absolutely identical.
+If I add a subroutine, all horses automatically share it.  That's
+great for making horses the same, but how do we capture the
+distinctions about an individual horse?  For example, suppose I want
+to give my first horse a name.  There's got to be a way to keep its
+name separate from the other horses.
+
+We can do that by drawing a new distinction, called an "instance".
+An "instance" is generally created by a class.  In Perl, any reference
+can be an instance, so let's start with the simplest reference
+that can hold a horse's name: a scalar reference.
+
+  my $name = "Mr. Ed";
+  my $talking = \$name;
+
+So now C<$talking> is a reference to what will be the instance-specific
+data (the name).  The final step in turning this into a real instance
+is with a special operator called C<bless>:
+
+  bless $talking, Horse;
+
+This operator stores information about the package named C<Horse> into
+the thing pointed at by the reference.  At this point, we say
+C<$talking> is an instance of C<Horse>.  That is, it's a specific
+horse.  The reference is otherwise unchanged, and can still be used
+with traditional dereferencing operators.
+
+=head2 Invoking an instance method
+
+The method arrow can be used on instances, as well as names of
+packages (classes).  So, let's get the sound that C<$talking> makes:
+
+  my $noise = $talking->sound;
+
+To invoke C<sound>, Perl first notes that C<$talking> is a blessed
+reference (and thus an instance).  It then constructs an argument
+list, in this case from just C<($talking)>.  (Later we'll see that
+arguments will take their place following the instance variable,
+just like with classes.)
+
+Now for the fun part: Perl takes the class in which the instance was
+blessed, in this case C<Horse>, and uses that to locate the subroutine
+to invoke the method.  In this case, C<Horse::sound> is found directly
+(without using inheritance), yielding the final subroutine invocation:
+
+  Horse::sound($talking)
+
+Note that the first parameter here is still the instance, not the name
+of the class as before.  We'll get C<neigh> as the return value, and
+that'll end up as the C<$noise> variable above.
+
+If Horse::sound had not been found, we'd be wandering up the
+C<@Horse::ISA> list to try to find the method in one of the
+superclasses, just as for a class method.  The only difference between
+a class method and an instance method is whether the first parameter
+is an instance (a blessed reference) or a class name (a string).
+
+=head2 Accessing the instance data
+
+Because we get the instance as the first parameter, we can now access
+the instance-specific data.  In this case, let's add a way to get at
+the name:
+
+  { package Horse;
+    @ISA = qw(Animal);
+    sub sound { "neigh" }
+    sub name {
+      my $self = shift;
+      $$self;
+    }
+  }
+
+Now we call for the name:
+
+  print $talking->name, " says ", $talking->sound, "\n";
+
+Inside C<Horse::name>, the C<@_> array contains just C<$talking>,
+which the C<shift> stores into C<$self>.  (It's traditional to shift
+the first parameter off into a variable named C<$self> for instance
+methods, so stay with that unless you have strong reasons otherwise.)
+Then, C<$self> gets de-referenced as a scalar ref, yielding C<Mr. Ed>,
+and we're done with that.  The result is:
+
+  Mr. Ed says neigh.
+
+=head2 How to build a horse
+
+Of course, if we constructed all of our horses by hand, we'd most
+likely make mistakes from time to time.  We're also violating one of
+the properties of object-oriented programming, in that the "inside
+guts" of a Horse are visible.  That's good if you're a veterinarian,
+but not if you just like to own horses.  So, let's let the Horse class
+build a new horse:
+
+  { package Horse;
+    @ISA = qw(Animal);
+    sub sound { "neigh" }
+    sub name {
+      my $self = shift;
+      $$self;
+    }
+    sub named {
+      my $class = shift;
+      my $name = shift;
+      bless \$name, $class;
+    }
+  }
+
+Now with the new C<named> method, we can build a horse:
+
+  my $talking = Horse->named("Mr. Ed");
+
+Notice we're back to a class method, so the two arguments to
+C<Horse::named> are C<Horse> and C<Mr. Ed>.  The C<bless> operator
+not only blesses C<$name>, it also returns the reference to C<$name>,
+so that's fine as a return value.  And that's how to build a horse.
+
+We've called the constructor C<named> here, so that it quickly denotes
+the constructor's argument as the name for this particular C<Horse>.
+You can use different constructors with different names for different
+ways of "giving birth" to the object (like maybe recording its
+pedigree or date of birth).  However, you'll find that most people
+coming to Perl from more limited languages use a single constructor
+named C<new>, with various ways of interpreting the arguments to
+C<new>.  Either style is fine, as long as you document your particular
+way of giving birth to an object.  (And you I<were> going to do that,
+right?)
+
+=head2 Inheriting the constructor
+
+But was there anything specific to C<Horse> in that method?  No.  Therefore,
+it's also the same recipe for building anything else that inherited from
+C<Animal>, so let's put it there:
+
+  { package Animal;
+    sub speak {
+      my $class = shift;
+      print "a $class goes ", $class->sound, "!\n"
+    }
+    sub name {
+      my $self = shift;
+      $$self;
+    }
+    sub named {
+      my $class = shift;
+      my $name = shift;
+      bless \$name, $class;
+    }
+  }
+  { package Horse;
+    @ISA = qw(Animal);
+    sub sound { "neigh" }
+  }
+
+Ahh, but what happens if we invoke C<speak> on an instance?
+
+  my $talking = Horse->named("Mr. Ed");
+  $talking->speak;
+
+We get a debugging value:
+
+  a Horse=SCALAR(0xaca42ac) goes neigh!
+
+Why?  Because the C<Animal::speak> routine is expecting a classname as
+its first parameter, not an instance.  When the instance is passed in,
+we'll end up using a blessed scalar reference as a string, and that
+shows up as we saw it just now.
+
+=head2 Making a method work with either classes or instances
+
+All we need is for a method to detect if it is being called on a class
+or called on an instance.  The most straightforward way is with the
+C<ref> operator.  This returns a string (the classname) when used on a
+blessed reference, and C<undef> when used on a string (like a
+classname).  Let's modify the C<name> method first to notice the change:
+
+  sub name {
+    my $either = shift;
+    ref $either
+      ? $$either # it's an instance, return name
+      : "an unnamed $either"; # it's a class, return generic
+  }
+
+Here, the C<?:> operator comes in handy to select either the
+dereference or a derived string.  Now we can use this with either an
+instance or a class.  Note that I've changed the first parameter
+holder to C<$either> to show that this is intended:
+
+  my $talking = Horse->named("Mr. Ed");
+  print Horse->name, "\n"; # prints "an unnamed Horse\n"
+  print $talking->name, "\n"; # prints "Mr Ed.\n"
+
+and now we'll fix C<speak> to use this:
+
+  sub speak {
+    my $either = shift;
+    print $either->name, " goes ", $either->sound, "\n";
+  }
+
+And since C<sound> already worked with either a class or an instance,
+we're done!
+
+=head2 Adding parameters to a method
+
+Let's train our animals to eat:
+
+  { package Animal;
+    sub named {
+      my $class = shift;
+      my $name = shift;
+      bless \$name, $class;
+    }
+    sub name {
+      my $either = shift;
+      ref $either
+	? $$either # it's an instance, return name
+	: "an unnamed $either"; # it's a class, return generic
+    }
+    sub speak {
+      my $either = shift;
+      print $either->name, " goes ", $either->sound, "\n";
+    }
+    sub eat {
+      my $either = shift;
+      my $food = shift;
+      print $either->name, " eats $food.\n";
+    }
+  }
+  { package Horse;
+    @ISA = qw(Animal);
+    sub sound { "neigh" }
+  }
+  { package Sheep;
+    @ISA = qw(Animal);
+    sub sound { "baaaah" }
+  }
+
+And now try it out:
+
+  my $talking = Horse->named("Mr. Ed");
+  $talking->eat("hay");
+  Sheep->eat("grass");
+
+which prints:
+
+  Mr. Ed eats hay.
+  an unnamed Sheep eats grass.
+
+An instance method with parameters gets invoked with the instance,
+and then the list of parameters.  So that first invocation is like:
+
+  Animal::eat($talking, "hay");
+
+=head2 More interesting instances
+
+What if an instance needs more data?  Most interesting instances are
+made of many items, each of which can in turn be a reference or even
+another object.  The easiest way to store these is often in a hash.
+The keys of the hash serve as the names of parts of the object (often
+called "instance variables" or "member variables"), and the
+corresponding values are, well, the values.
+
+But how do we turn the horse into a hash?  Recall that an object was
+any blessed reference.  We can just as easily make it a blessed hash
+reference as a blessed scalar reference, as long as everything that
+looks at the reference is changed accordingly.
+
+Let's make a sheep that has a name and a color:
+
+  my $bad = bless { Name => "Evil", Color => "black" }, Sheep;
+
+so C<< $bad->{Name} >> has C<Evil>, and C<< $bad->{Color} >> has
+C<black>.  But we want to make C<< $bad->name >> access the name, and
+that's now messed up because it's expecting a scalar reference.  Not
+to worry, because that's pretty easy to fix up:
+
+  ## in Animal
+  sub name {
+    my $either = shift;
+    ref $either ?
+      $either->{Name} :
+      "an unnamed $either";
+  }
+
+And of course C<named> still builds a scalar sheep, so let's fix that
+as well:
+
+  ## in Animal
+  sub named {
+    my $class = shift;
+    my $name = shift;
+    my $self = { Name => $name, Color => $class->default_color };
+    bless $self, $class;
+  }
+
+What's this C<default_color>?  Well, if C<named> has only the name,
+we still need to set a color, so we'll have a class-specific initial color.
+For a sheep, we might define it as white:
+
+  ## in Sheep
+  sub default_color { "white" }
+
+And then to keep from having to define one for each additional class,
+we'll define a "backstop" method that serves as the "default default",
+directly in C<Animal>:
+
+  ## in Animal
+  sub default_color { "brown" }
+
+Now, because C<name> and C<named> were the only methods that
+referenced the "structure" of the object, the rest of the methods can
+remain the same, so C<speak> still works as before.
+
+=head2 A horse of a different color
+
+But having all our horses be brown would be boring.  So let's add a
+method or two to get and set the color.
+
+  ## in Animal
+  sub color {
+    $_[0]->{Color}
+  }
+  sub set_color {
+    $_[0]->{Color} = $_[1];
+  }
+
+Note the alternate way of accessing the arguments: C<$_[0]> is used
+in-place, rather than with a C<shift>.  (This saves us a bit of time
+for something that may be invoked frequently.)  And now we can fix
+that color for Mr. Ed:
+
+  my $talking = Horse->named("Mr. Ed");
+  $talking->set_color("black-and-white");
+  print $talking->name, " is colored ", $talking->color, "\n";
+
+which results in:
+
+  Mr. Ed is colored black-and-white
+
+=head2 Summary
+
+So, now we have class methods, constructors, instance methods,
+instance data, and even accessors.  But that's still just the
+beginning of what Perl has to offer.  We haven't even begun to talk
+about accessors that double as getters and setters, destructors,
+indirect object notation, subclasses that add instance data, per-class
+data, overloading, "isa" and "can" tests, C<UNIVERSAL> class, and so
+on.  That's for the rest of the Perl documentation to cover.
+Hopefully, this gets you started, though.
+
+=head1 SEE ALSO
+
+For more information, see L<perlobj> (for all the gritty details about
+Perl objects, now that you've seen the basics), L<perltoot> (the
+tutorial for those who already know objects), L<perltooc> (dealing
+with class data), L<perlbot> (for some more tricks), and books such as
+Damian Conway's excellent I<Object Oriented Perl>.
+
+Some modules which might prove interesting are Class::Accessor,
+Class::Class, Class::Contract, Class::Data::Inheritable,
+Class::MethodMaker and Tie::SecureHash
+
+=head1 COPYRIGHT
+
+Copyright (c) 1999, 2000 by Randal L. Schwartz and Stonehenge
+Consulting Services, Inc.  Permission is hereby granted to distribute
+this document intact with the Perl distribution, and in accordance
+with the licenses of the Perl distribution; derived documents must
+include this copyright notice intact.
+
+Portions of this text have been derived from Perl Training materials
+originally appearing in the I<Packages, References, Objects, and
+Modules> course taught by instructors for Stonehenge Consulting
+Services, Inc. and used with permission.
+
+Portions of this text have been derived from materials originally
+appearing in I<Linux Magazine> and used with permission.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbot.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbot.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbot.pod	(revision 14489)
@@ -0,0 +1,535 @@
+=head1 NAME
+
+perlbot - Bag'o Object Tricks (the BOT)
+
+=head1 DESCRIPTION
+
+The following collection of tricks and hints is intended to whet curious
+appetites about such things as the use of instance variables and the
+mechanics of object and class relationships.  The reader is encouraged to
+consult relevant textbooks for discussion of Object Oriented definitions and
+methodology.  This is not intended as a tutorial for object-oriented
+programming or as a comprehensive guide to Perl's object oriented features,
+nor should it be construed as a style guide.  If you're looking for tutorials,
+be sure to read L<perlboot>, L<perltoot>, and L<perltooc>.
+
+The Perl motto still holds:  There's more than one way to do it.
+
+=head1 OO SCALING TIPS
+
+=over 5
+
+=item 1
+
+Do not attempt to verify the type of $self.  That'll break if the class is
+inherited, when the type of $self is valid but its package isn't what you
+expect.  See rule 5.
+
+=item 2
+
+If an object-oriented (OO) or indirect-object (IO) syntax was used, then the
+object is probably the correct type and there's no need to become paranoid
+about it.  Perl isn't a paranoid language anyway.  If people subvert the OO
+or IO syntax then they probably know what they're doing and you should let
+them do it.  See rule 1.
+
+=item 3
+
+Use the two-argument form of bless().  Let a subclass use your constructor.
+See L<INHERITING A CONSTRUCTOR>.
+
+=item 4
+
+The subclass is allowed to know things about its immediate superclass, the
+superclass is allowed to know nothing about a subclass.
+
+=item 5
+
+Don't be trigger happy with inheritance.  A "using", "containing", or
+"delegation" relationship (some sort of aggregation, at least) is often more
+appropriate.  See L<OBJECT RELATIONSHIPS>, L<USING RELATIONSHIP WITH SDBM>,
+and L<"DELEGATION">.
+
+=item 6
+
+The object is the namespace.  Make package globals accessible via the
+object.  This will remove the guess work about the symbol's home package.
+See L<CLASS CONTEXT AND THE OBJECT>.
+
+=item 7
+
+IO syntax is certainly less noisy, but it is also prone to ambiguities that
+can cause difficult-to-find bugs.  Allow people to use the sure-thing OO
+syntax, even if you don't like it.
+
+=item 8
+
+Do not use function-call syntax on a method.  You're going to be bitten
+someday.  Someone might move that method into a superclass and your code
+will be broken.  On top of that you're feeding the paranoia in rule 2.
+
+=item 9
+
+Don't assume you know the home package of a method.  You're making it
+difficult for someone to override that method.  See L<THINKING OF CODE REUSE>.
+
+=back
+
+=head1 INSTANCE VARIABLES
+
+An anonymous array or anonymous hash can be used to hold instance
+variables.  Named parameters are also demonstrated.
+
+	package Foo;
+
+	sub new {
+		my $type = shift;
+		my %params = @_;
+		my $self = {};
+		$self->{'High'} = $params{'High'};
+		$self->{'Low'}  = $params{'Low'};
+		bless $self, $type;
+	}
+
+
+	package Bar;
+
+	sub new {
+		my $type = shift;
+		my %params = @_;
+		my $self = [];
+		$self->[0] = $params{'Left'};
+		$self->[1] = $params{'Right'};
+		bless $self, $type;
+	}
+
+	package main;
+
+	$a = Foo->new( 'High' => 42, 'Low' => 11 );
+	print "High=$a->{'High'}\n";
+	print "Low=$a->{'Low'}\n";
+
+	$b = Bar->new( 'Left' => 78, 'Right' => 40 );
+	print "Left=$b->[0]\n";
+	print "Right=$b->[1]\n";
+
+=head1 SCALAR INSTANCE VARIABLES
+
+An anonymous scalar can be used when only one instance variable is needed.
+
+	package Foo;
+
+	sub new {
+		my $type = shift;
+		my $self;
+		$self = shift;
+		bless \$self, $type;
+	}
+
+	package main;
+
+	$a = Foo->new( 42 );
+	print "a=$$a\n";
+
+
+=head1 INSTANCE VARIABLE INHERITANCE
+
+This example demonstrates how one might inherit instance variables from a
+superclass for inclusion in the new class.  This requires calling the
+superclass's constructor and adding one's own instance variables to the new
+object.
+
+	package Bar;
+
+	sub new {
+		my $type = shift;
+		my $self = {};
+		$self->{'buz'} = 42;
+		bless $self, $type;
+	}
+
+	package Foo;
+	@ISA = qw( Bar );
+
+	sub new {
+		my $type = shift;
+		my $self = Bar->new;
+		$self->{'biz'} = 11;
+		bless $self, $type;
+	}
+
+	package main;
+
+	$a = Foo->new;
+	print "buz = ", $a->{'buz'}, "\n";
+	print "biz = ", $a->{'biz'}, "\n";
+
+
+
+=head1 OBJECT RELATIONSHIPS
+
+The following demonstrates how one might implement "containing" and "using"
+relationships between objects.
+
+	package Bar;
+
+	sub new {
+		my $type = shift;
+		my $self = {};
+		$self->{'buz'} = 42;
+		bless $self, $type;
+	}
+
+	package Foo;
+
+	sub new {
+		my $type = shift;
+		my $self = {};
+		$self->{'Bar'} = Bar->new;
+		$self->{'biz'} = 11;
+		bless $self, $type;
+	}
+
+	package main;
+
+	$a = Foo->new;
+	print "buz = ", $a->{'Bar'}->{'buz'}, "\n";
+	print "biz = ", $a->{'biz'}, "\n";
+
+
+
+=head1 OVERRIDING SUPERCLASS METHODS
+
+The following example demonstrates how to override a superclass method and
+then call the overridden method.  The B<SUPER> pseudo-class allows the
+programmer to call an overridden superclass method without actually knowing
+where that method is defined.
+
+	package Buz;
+	sub goo { print "here's the goo\n" }
+
+	package Bar; @ISA = qw( Buz );
+	sub google { print "google here\n" }
+
+	package Baz;
+	sub mumble { print "mumbling\n" }
+
+	package Foo;
+	@ISA = qw( Bar Baz );
+
+	sub new {
+		my $type = shift;
+		bless [], $type;
+	}
+	sub grr { print "grumble\n" }
+	sub goo {
+		my $self = shift;
+		$self->SUPER::goo();
+	}
+	sub mumble {
+		my $self = shift;
+		$self->SUPER::mumble();
+	}
+	sub google {
+		my $self = shift;
+		$self->SUPER::google();
+	}
+
+	package main;
+
+	$foo = Foo->new;
+	$foo->mumble;
+	$foo->grr;
+	$foo->goo;
+	$foo->google;
+
+Note that C<SUPER> refers to the superclasses of the current package
+(C<Foo>), not to the superclasses of C<$self>.
+
+
+=head1 USING RELATIONSHIP WITH SDBM
+
+This example demonstrates an interface for the SDBM class.  This creates a
+"using" relationship between the SDBM class and the new class Mydbm.
+
+	package Mydbm;
+
+	require SDBM_File;
+	require Tie::Hash;
+	@ISA = qw( Tie::Hash );
+
+	sub TIEHASH {
+	    my $type = shift;
+	    my $ref  = SDBM_File->new(@_);
+	    bless {'dbm' => $ref}, $type;
+	}
+	sub FETCH {
+	    my $self = shift;
+	    my $ref  = $self->{'dbm'};
+	    $ref->FETCH(@_);
+	}
+	sub STORE {
+	    my $self = shift;
+	    if (defined $_[0]){
+		my $ref = $self->{'dbm'};
+		$ref->STORE(@_);
+	    } else {
+		die "Cannot STORE an undefined key in Mydbm\n";
+	    }
+	}
+
+	package main;
+	use Fcntl qw( O_RDWR O_CREAT );
+
+	tie %foo, "Mydbm", "Sdbm", O_RDWR|O_CREAT, 0640;
+	$foo{'bar'} = 123;
+	print "foo-bar = $foo{'bar'}\n";
+
+	tie %bar, "Mydbm", "Sdbm2", O_RDWR|O_CREAT, 0640;
+	$bar{'Cathy'} = 456;
+	print "bar-Cathy = $bar{'Cathy'}\n";
+
+=head1 THINKING OF CODE REUSE
+
+One strength of Object-Oriented languages is the ease with which old code
+can use new code.  The following examples will demonstrate first how one can
+hinder code reuse and then how one can promote code reuse.
+
+This first example illustrates a class which uses a fully-qualified method
+call to access the "private" method BAZ().  The second example will show
+that it is impossible to override the BAZ() method.
+
+	package FOO;
+
+	sub new {
+		my $type = shift;
+		bless {}, $type;
+	}
+	sub bar {
+		my $self = shift;
+		$self->FOO::private::BAZ;
+	}
+
+	package FOO::private;
+
+	sub BAZ {
+		print "in BAZ\n";
+	}
+
+	package main;
+
+	$a = FOO->new;
+	$a->bar;
+
+Now we try to override the BAZ() method.  We would like FOO::bar() to call
+GOOP::BAZ(), but this cannot happen because FOO::bar() explicitly calls
+FOO::private::BAZ().
+
+	package FOO;
+
+	sub new {
+		my $type = shift;
+		bless {}, $type;
+	}
+	sub bar {
+		my $self = shift;
+		$self->FOO::private::BAZ;
+	}
+
+	package FOO::private;
+
+	sub BAZ {
+		print "in BAZ\n";
+	}
+
+	package GOOP;
+	@ISA = qw( FOO );
+	sub new {
+		my $type = shift;
+		bless {}, $type;
+	}
+
+	sub BAZ {
+		print "in GOOP::BAZ\n";
+	}
+
+	package main;
+
+	$a = GOOP->new;
+	$a->bar;
+
+To create reusable code we must modify class FOO, flattening class
+FOO::private.  The next example shows a reusable class FOO which allows the
+method GOOP::BAZ() to be used in place of FOO::BAZ().
+
+	package FOO;
+
+	sub new {
+		my $type = shift;
+		bless {}, $type;
+	}
+	sub bar {
+		my $self = shift;
+		$self->BAZ;
+	}
+
+	sub BAZ {
+		print "in BAZ\n";
+	}
+
+	package GOOP;
+	@ISA = qw( FOO );
+
+	sub new {
+		my $type = shift;
+		bless {}, $type;
+	}
+	sub BAZ {
+		print "in GOOP::BAZ\n";
+	}
+
+	package main;
+
+	$a = GOOP->new;
+	$a->bar;
+
+=head1 CLASS CONTEXT AND THE OBJECT
+
+Use the object to solve package and class context problems.  Everything a
+method needs should be available via the object or should be passed as a
+parameter to the method.
+
+A class will sometimes have static or global data to be used by the
+methods.  A subclass may want to override that data and replace it with new
+data.  When this happens the superclass may not know how to find the new
+copy of the data.
+
+This problem can be solved by using the object to define the context of the
+method.  Let the method look in the object for a reference to the data.  The
+alternative is to force the method to go hunting for the data ("Is it in my
+class, or in a subclass?  Which subclass?"), and this can be inconvenient
+and will lead to hackery.  It is better just to let the object tell the
+method where that data is located.
+
+	package Bar;
+
+	%fizzle = ( 'Password' => 'XYZZY' );
+
+	sub new {
+		my $type = shift;
+		my $self = {};
+		$self->{'fizzle'} = \%fizzle;
+		bless $self, $type;
+	}
+
+	sub enter {
+		my $self = shift;
+
+		# Don't try to guess if we should use %Bar::fizzle
+		# or %Foo::fizzle.  The object already knows which
+		# we should use, so just ask it.
+		#
+		my $fizzle = $self->{'fizzle'};
+
+		print "The word is ", $fizzle->{'Password'}, "\n";
+	}
+
+	package Foo;
+	@ISA = qw( Bar );
+
+	%fizzle = ( 'Password' => 'Rumple' );
+
+	sub new {
+		my $type = shift;
+		my $self = Bar->new;
+		$self->{'fizzle'} = \%fizzle;
+		bless $self, $type;
+	}
+
+	package main;
+
+	$a = Bar->new;
+	$b = Foo->new;
+	$a->enter;
+	$b->enter;
+
+=head1 INHERITING A CONSTRUCTOR
+
+An inheritable constructor should use the second form of bless() which allows
+blessing directly into a specified class.  Notice in this example that the
+object will be a BAR not a FOO, even though the constructor is in class FOO.
+
+	package FOO;
+
+	sub new {
+		my $type = shift;
+		my $self = {};
+		bless $self, $type;
+	}
+
+	sub baz {
+		print "in FOO::baz()\n";
+	}
+
+	package BAR;
+	@ISA = qw(FOO);
+
+	sub baz {
+		print "in BAR::baz()\n";
+	}
+
+	package main;
+
+	$a = BAR->new;
+	$a->baz;
+
+=head1 DELEGATION
+
+Some classes, such as SDBM_File, cannot be effectively subclassed because
+they create foreign objects.  Such a class can be extended with some sort of
+aggregation technique such as the "using" relationship mentioned earlier or
+by delegation.
+
+The following example demonstrates delegation using an AUTOLOAD() function to
+perform message-forwarding.  This will allow the Mydbm object to behave
+exactly like an SDBM_File object.  The Mydbm class could now extend the
+behavior by adding custom FETCH() and STORE() methods, if this is desired.
+
+	package Mydbm;
+
+	require SDBM_File;
+	require Tie::Hash;
+	@ISA = qw(Tie::Hash);
+
+	sub TIEHASH {
+		my $type = shift;
+		my $ref = SDBM_File->new(@_);
+		bless {'delegate' => $ref};
+	}
+
+	sub AUTOLOAD {
+		my $self = shift;
+
+		# The Perl interpreter places the name of the
+		# message in a variable called $AUTOLOAD.
+
+		# DESTROY messages should never be propagated.
+		return if $AUTOLOAD =~ /::DESTROY$/;
+
+		# Remove the package name.
+		$AUTOLOAD =~ s/^Mydbm:://;
+
+		# Pass the message to the delegate.
+		$self->{'delegate'}->$AUTOLOAD(@_);
+	}
+
+	package main;
+	use Fcntl qw( O_RDWR O_CREAT );
+
+	tie %foo, "Mydbm", "adbm", O_RDWR|O_CREAT, 0640;
+	$foo{'bar'} = 123;
+	print "foo-bar = $foo{'bar'}\n";
+
+=head1 SEE ALSO
+
+L<perlboot>, L<perltoot>, L<perltooc>.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbs2000.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbs2000.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlbs2000.pod	(revision 14489)
@@ -0,0 +1,241 @@
+This document is written in pod format hence there are punctuation
+characters in odd places.  Do not worry, you've apparently got the
+ASCII->EBCDIC translation worked out correctly.  You can read more
+about pod in pod/perlpod.pod or the short summary in the INSTALL file.
+
+=head1 NAME
+
+README.BS2000 - building and installing Perl for BS2000.
+
+=head1 SYNOPSIS
+
+This document will help you Configure, build, test and install Perl
+on BS2000 in the POSIX subsystem.
+
+=head1 DESCRIPTION
+
+This is a ported perl for the POSIX subsystem in BS2000 VERSION OSD
+V3.1A or later.  It may work on other versions, but we started porting
+and testing it with 3.1A and are currently using Version V4.0A.
+
+You may need the following GNU programs in order to install perl:
+
+=head2 gzip on BS2000
+
+We used version 1.2.4, which could be installed out of the box with
+one failure during 'make check'.
+
+=head2 bison on BS2000
+
+The yacc coming with BS2000 POSIX didn't work for us.  So we had to
+use bison.  We had to make a few changes to perl in order to use the
+pure (reentrant) parser of bison.  We used version 1.25, but we had to
+add a few changes due to EBCDIC.  See below for more details
+concerning yacc.
+
+=head2 Unpacking Perl Distribution on BS2000
+
+To extract an ASCII tar archive on BS2000 POSIX you need an ASCII
+filesystem (we used the mountpoint /usr/local/ascii for this).  Now
+you extract the archive in the ASCII filesystem without
+I/O-conversion:
+
+cd /usr/local/ascii
+export IO_CONVERSION=NO
+gunzip < /usr/local/src/perl.tar.gz | pax -r
+
+You may ignore the error message for the first element of the archive
+(this doesn't look like a tar archive / skipping to next file...),
+it's only the directory which will be created automatically anyway.
+
+After extracting the archive you copy the whole directory tree to your
+EBCDIC filesystem.  B<This time you use I/O-conversion>:
+
+cd /usr/local/src
+IO_CONVERSION=YES
+cp -r /usr/local/ascii/perl5.005_02 ./
+
+=head2 Compiling Perl on BS2000
+
+There is a "hints" file for BS2000 called hints.posix-bc (because
+posix-bc is the OS name given by `uname`) that specifies the correct
+values for most things.  The major problem is (of course) the EBCDIC
+character set.  We have german EBCDIC version.
+
+Because of our problems with the native yacc we used GNU bison to
+generate a pure (=reentrant) parser for perly.y.  So our yacc is
+really the following script:
+
+-----8<-----/usr/local/bin/yacc-----8<-----
+#! /usr/bin/sh
+
+# Bison as a reentrant yacc:
+
+# save parameters:
+params=""
+while [[ $# -gt 1 ]]; do
+    params="$params $1"
+    shift
+done
+
+# add flag %pure_parser:
+
+tmpfile=/tmp/bison.$$.y
+echo %pure_parser > $tmpfile
+cat $1 >> $tmpfile
+
+# call bison:
+
+echo "/usr/local/bin/bison --yacc $params $1\t\t\t(Pure Parser)"
+/usr/local/bin/bison --yacc $params $tmpfile
+
+# cleanup:
+
+rm -f $tmpfile
+-----8<----------8<-----
+
+We still use the normal yacc for a2p.y though!!!  We made a softlink
+called byacc to distinguish between the two versions:
+
+ln -s /usr/bin/yacc /usr/local/bin/byacc
+
+We build perl using GNU make.  We tried the native make once and it
+worked too.
+
+=head2 Testing Perl on BS2000
+
+We still got a few errors during C<make test>.  Some of them are the
+result of using bison.  Bison prints I<parser error> instead of I<syntax
+error>, so we may ignore them.  The following list shows
+our errors, your results may differ:
+
+op/numconvert.......FAILED tests 1409-1440
+op/regexp...........FAILED tests 483, 496
+op/regexp_noamp.....FAILED tests 483, 496
+pragma/overload.....FAILED tests 152-153, 170-171
+pragma/warnings.....FAILED tests 14, 82, 129, 155, 192, 205, 207
+lib/bigfloat........FAILED tests 351-352, 355
+lib/bigfltpm........FAILED tests 354-355, 358
+lib/complex.........FAILED tests 267, 487
+lib/dumper..........FAILED tests 43, 45
+Failed 11/231 test scripts, 95.24% okay. 57/10595 subtests failed, 99.46% okay.
+
+=head2 Installing Perl on BS2000
+
+We have no nroff on BS2000 POSIX (yet), so we ignored any errors while
+installing the documentation.
+
+
+=head2 Using Perl in the Posix-Shell of BS2000
+
+BS2000 POSIX doesn't support the shebang notation
+(C<#!/usr/local/bin/perl>), so you have to use the following lines
+instead:
+
+: # use perl
+    eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
+        if $running_under_some_shell;
+
+=head2 Using Perl in "native" BS2000
+
+We don't have much experience with this yet, but try the following:
+
+Copy your Perl executable to a BS2000 LLM using bs2cp:
+
+C<bs2cp /usr/local/bin/perl 'bs2:perl(perl,l)'>
+
+Now you can start it with the following (SDF) command:
+
+C</START-PROG FROM-FILE=*MODULE(PERL,PERL),PROG-MODE=*ANY,RUN-MODE=*ADV>
+
+First you get the BS2000 commandline prompt ('*').  Here you may enter
+your parameters, e.g. C<-e 'print "Hello World!\\n";'> (note the
+double backslash!) or C<-w> and the name of your Perl script.
+Filenames starting with C</> are searched in the Posix filesystem,
+others are searched in the BS2000 filesystem.  You may even use
+wildcards if you put a C<%> in front of your filename (e.g. C<-w
+checkfiles.pl %*.c>).  Read your C/C++ manual for additional
+possibilities of the commandline prompt (look for
+PARAMETER-PROMPTING).
+
+=head2 Floating point anomalies on BS2000
+
+There appears to be a bug in the floating point implementation on BS2000 POSIX
+systems such that calling int() on the product of a number and a small
+magnitude number is not the same as calling int() on the quotient of
+that number and a large magnitude number.  For example, in the following
+Perl code:
+
+    my $x = 100000.0;
+    my $y = int($x * 1e-5) * 1e5; # '0'
+    my $z = int($x / 1e+5) * 1e5;  # '100000'
+    print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000
+
+Although one would expect the quantities $y and $z to be the same and equal
+to 100000 they will differ and instead will be 0 and 100000 respectively.
+
+=head2 Using PerlIO and different encodings on ASCII and EBCDIC partitions
+
+Since version 5.8 Perl uses the new PerlIO on BS2000.  This enables
+you using different encodings per IO channel.  For example you may use
+
+    use Encode;
+    open($f, ">:encoding(ascii)", "test.ascii");
+    print $f "Hello World!\n";
+    open($f, ">:encoding(posix-bc)", "test.ebcdic");
+    print $f "Hello World!\n";
+    open($f, ">:encoding(latin1)", "test.latin1");
+    print $f "Hello World!\n";
+    open($f, ">:encoding(utf8)", "test.utf8");
+    print $f "Hello World!\n";
+
+to get two files containing "Hello World!\n" in ASCII, EBCDIC, ISO
+Latin-1 (in this example identical to ASCII) respective UTF-EBCDIC (in
+this example identical to normal EBCDIC).  See the documentation of
+Encode::PerlIO for details.
+
+As the PerlIO layer uses raw IO internally, all this totally ignores
+the type of your filesystem (ASCII or EBCDIC) and the IO_CONVERSION
+environment variable.  If you want to get the old behavior, that the
+BS2000 IO functions determine conversion depending on the filesystem
+PerlIO still is your friend.  You use IO_CONVERSION as usual and tell
+Perl, that it should use the native IO layer:
+
+    export IO_CONVERSION=YES
+    export PERLIO=stdio
+
+Now your IO would be ASCII on ASCII partitions and EBCDIC on EBCDIC
+partitions.  See the documentation of PerlIO (without C<Encode::>!)
+for further posibilities.
+
+=head1 AUTHORS
+
+Thomas Dorner
+
+=head1 SEE ALSO
+
+L<INSTALL>, L<perlport>.
+
+=head2 Mailing list
+
+If you are interested in the VM/ESA, z/OS (formerly known as OS/390)
+and POSIX-BC (BS2000) ports of Perl then see the perl-mvs mailing list.
+To subscribe, send an empty message to perl-mvs-subscribe@perl.org.
+
+See also:
+
+    http://lists.perl.org/showlist.cgi?name=perl-mvs
+
+There are web archives of the mailing list at:
+
+    http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
+    http://archive.develooper.com/perl-mvs@perl.org/
+
+=head1 HISTORY
+
+This document was originally written by Thomas Dorner for the 5.005
+release of Perl.
+
+This document was podified for the 5.6 release of perl 11 July 2000.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcall.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcall.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcall.pod	(revision 14489)
@@ -0,0 +1,1894 @@
+=head1 NAME
+
+perlcall - Perl calling conventions from C
+
+=head1 DESCRIPTION
+
+The purpose of this document is to show you how to call Perl subroutines
+directly from C, i.e., how to write I<callbacks>.
+
+Apart from discussing the C interface provided by Perl for writing
+callbacks the document uses a series of examples to show how the
+interface actually works in practice.  In addition some techniques for
+coding callbacks are covered.
+
+Examples where callbacks are necessary include
+
+=over 5
+
+=item * An Error Handler
+
+You have created an XSUB interface to an application's C API.
+
+A fairly common feature in applications is to allow you to define a C
+function that will be called whenever something nasty occurs. What we
+would like is to be able to specify a Perl subroutine that will be
+called instead.
+
+=item * An Event Driven Program
+
+The classic example of where callbacks are used is when writing an
+event driven program like for an X windows application.  In this case
+you register functions to be called whenever specific events occur,
+e.g., a mouse button is pressed, the cursor moves into a window or a
+menu item is selected.
+
+=back
+
+Although the techniques described here are applicable when embedding
+Perl in a C program, this is not the primary goal of this document.
+There are other details that must be considered and are specific to
+embedding Perl. For details on embedding Perl in C refer to
+L<perlembed>.
+
+Before you launch yourself head first into the rest of this document,
+it would be a good idea to have read the following two documents -
+L<perlxs> and L<perlguts>.
+
+=head1 THE CALL_ FUNCTIONS
+
+Although this stuff is easier to explain using examples, you first need
+be aware of a few important definitions.
+
+Perl has a number of C functions that allow you to call Perl
+subroutines.  They are
+
+    I32 call_sv(SV* sv, I32 flags);
+    I32 call_pv(char *subname, I32 flags);
+    I32 call_method(char *methname, I32 flags);
+    I32 call_argv(char *subname, I32 flags, register char **argv);
+
+The key function is I<call_sv>.  All the other functions are
+fairly simple wrappers which make it easier to call Perl subroutines in
+special cases. At the end of the day they will all call I<call_sv>
+to invoke the Perl subroutine.
+
+All the I<call_*> functions have a C<flags> parameter which is
+used to pass a bit mask of options to Perl.  This bit mask operates
+identically for each of the functions.  The settings available in the
+bit mask are discussed in L<FLAG VALUES>.
+
+Each of the functions will now be discussed in turn.
+
+=over 5
+
+=item call_sv
+
+I<call_sv> takes two parameters, the first, C<sv>, is an SV*.
+This allows you to specify the Perl subroutine to be called either as a
+C string (which has first been converted to an SV) or a reference to a
+subroutine. The section, I<Using call_sv>, shows how you can make
+use of I<call_sv>.
+
+=item call_pv
+
+The function, I<call_pv>, is similar to I<call_sv> except it
+expects its first parameter to be a C char* which identifies the Perl
+subroutine you want to call, e.g., C<call_pv("fred", 0)>.  If the
+subroutine you want to call is in another package, just include the
+package name in the string, e.g., C<"pkg::fred">.
+
+=item call_method
+
+The function I<call_method> is used to call a method from a Perl
+class.  The parameter C<methname> corresponds to the name of the method
+to be called.  Note that the class that the method belongs to is passed
+on the Perl stack rather than in the parameter list. This class can be
+either the name of the class (for a static method) or a reference to an
+object (for a virtual method).  See L<perlobj> for more information on
+static and virtual methods and L<Using call_method> for an example
+of using I<call_method>.
+
+=item call_argv
+
+I<call_argv> calls the Perl subroutine specified by the C string
+stored in the C<subname> parameter. It also takes the usual C<flags>
+parameter.  The final parameter, C<argv>, consists of a NULL terminated
+list of C strings to be passed as parameters to the Perl subroutine.
+See I<Using call_argv>.
+
+=back
+
+All the functions return an integer. This is a count of the number of
+items returned by the Perl subroutine. The actual items returned by the
+subroutine are stored on the Perl stack.
+
+As a general rule you should I<always> check the return value from
+these functions.  Even if you are expecting only a particular number of
+values to be returned from the Perl subroutine, there is nothing to
+stop someone from doing something unexpected--don't say you haven't
+been warned.
+
+=head1 FLAG VALUES
+
+The C<flags> parameter in all the I<call_*> functions is a bit mask
+which can consist of any combination of the symbols defined below,
+OR'ed together.
+
+
+=head2  G_VOID
+
+Calls the Perl subroutine in a void context.
+
+This flag has 2 effects:
+
+=over 5
+
+=item 1.
+
+It indicates to the subroutine being called that it is executing in
+a void context (if it executes I<wantarray> the result will be the
+undefined value).
+
+=item 2.
+
+It ensures that nothing is actually returned from the subroutine.
+
+=back
+
+The value returned by the I<call_*> function indicates how many
+items have been returned by the Perl subroutine - in this case it will
+be 0.
+
+
+=head2  G_SCALAR
+
+Calls the Perl subroutine in a scalar context.  This is the default
+context flag setting for all the I<call_*> functions.
+
+This flag has 2 effects:
+
+=over 5
+
+=item 1.
+
+It indicates to the subroutine being called that it is executing in a
+scalar context (if it executes I<wantarray> the result will be false).
+
+=item 2.
+
+It ensures that only a scalar is actually returned from the subroutine.
+The subroutine can, of course,  ignore the I<wantarray> and return a
+list anyway. If so, then only the last element of the list will be
+returned.
+
+=back
+
+The value returned by the I<call_*> function indicates how many
+items have been returned by the Perl subroutine - in this case it will
+be either 0 or 1.
+
+If 0, then you have specified the G_DISCARD flag.
+
+If 1, then the item actually returned by the Perl subroutine will be
+stored on the Perl stack - the section I<Returning a Scalar> shows how
+to access this value on the stack.  Remember that regardless of how
+many items the Perl subroutine returns, only the last one will be
+accessible from the stack - think of the case where only one value is
+returned as being a list with only one element.  Any other items that
+were returned will not exist by the time control returns from the
+I<call_*> function.  The section I<Returning a list in a scalar
+context> shows an example of this behavior.
+
+
+=head2 G_ARRAY
+
+Calls the Perl subroutine in a list context.
+
+As with G_SCALAR, this flag has 2 effects:
+
+=over 5
+
+=item 1.
+
+It indicates to the subroutine being called that it is executing in a
+list context (if it executes I<wantarray> the result will be true).
+
+
+=item 2.
+
+It ensures that all items returned from the subroutine will be
+accessible when control returns from the I<call_*> function.
+
+=back
+
+The value returned by the I<call_*> function indicates how many
+items have been returned by the Perl subroutine.
+
+If 0, then you have specified the G_DISCARD flag.
+
+If not 0, then it will be a count of the number of items returned by
+the subroutine. These items will be stored on the Perl stack.  The
+section I<Returning a list of values> gives an example of using the
+G_ARRAY flag and the mechanics of accessing the returned items from the
+Perl stack.
+
+=head2 G_DISCARD
+
+By default, the I<call_*> functions place the items returned from
+by the Perl subroutine on the stack.  If you are not interested in
+these items, then setting this flag will make Perl get rid of them
+automatically for you.  Note that it is still possible to indicate a
+context to the Perl subroutine by using either G_SCALAR or G_ARRAY.
+
+If you do not set this flag then it is I<very> important that you make
+sure that any temporaries (i.e., parameters passed to the Perl
+subroutine and values returned from the subroutine) are disposed of
+yourself.  The section I<Returning a Scalar> gives details of how to
+dispose of these temporaries explicitly and the section I<Using Perl to
+dispose of temporaries> discusses the specific circumstances where you
+can ignore the problem and let Perl deal with it for you.
+
+=head2 G_NOARGS
+
+Whenever a Perl subroutine is called using one of the I<call_*>
+functions, it is assumed by default that parameters are to be passed to
+the subroutine.  If you are not passing any parameters to the Perl
+subroutine, you can save a bit of time by setting this flag.  It has
+the effect of not creating the C<@_> array for the Perl subroutine.
+
+Although the functionality provided by this flag may seem
+straightforward, it should be used only if there is a good reason to do
+so.  The reason for being cautious is that even if you have specified
+the G_NOARGS flag, it is still possible for the Perl subroutine that
+has been called to think that you have passed it parameters.
+
+In fact, what can happen is that the Perl subroutine you have called
+can access the C<@_> array from a previous Perl subroutine.  This will
+occur when the code that is executing the I<call_*> function has
+itself been called from another Perl subroutine. The code below
+illustrates this
+
+    sub fred
+      { print "@_\n"  }
+
+    sub joe
+      { &fred }
+
+    &joe(1,2,3);
+
+This will print
+
+    1 2 3
+
+What has happened is that C<fred> accesses the C<@_> array which
+belongs to C<joe>.
+
+
+=head2 G_EVAL
+
+It is possible for the Perl subroutine you are calling to terminate
+abnormally, e.g., by calling I<die> explicitly or by not actually
+existing.  By default, when either of these events occurs, the
+process will terminate immediately.  If you want to trap this
+type of event, specify the G_EVAL flag.  It will put an I<eval { }>
+around the subroutine call.
+
+Whenever control returns from the I<call_*> function you need to
+check the C<$@> variable as you would in a normal Perl script.
+
+The value returned from the I<call_*> function is dependent on
+what other flags have been specified and whether an error has
+occurred.  Here are all the different cases that can occur:
+
+=over 5
+
+=item *
+
+If the I<call_*> function returns normally, then the value
+returned is as specified in the previous sections.
+
+=item *
+
+If G_DISCARD is specified, the return value will always be 0.
+
+=item *
+
+If G_ARRAY is specified I<and> an error has occurred, the return value
+will always be 0.
+
+=item *
+
+If G_SCALAR is specified I<and> an error has occurred, the return value
+will be 1 and the value on the top of the stack will be I<undef>. This
+means that if you have already detected the error by checking C<$@> and
+you want the program to continue, you must remember to pop the I<undef>
+from the stack.
+
+=back
+
+See I<Using G_EVAL> for details on using G_EVAL.
+
+=head2 G_KEEPERR
+
+You may have noticed that using the G_EVAL flag described above will
+B<always> clear the C<$@> variable and set it to a string describing
+the error iff there was an error in the called code.  This unqualified
+resetting of C<$@> can be problematic in the reliable identification of
+errors using the C<eval {}> mechanism, because the possibility exists
+that perl will call other code (end of block processing code, for
+example) between the time the error causes C<$@> to be set within
+C<eval {}>, and the subsequent statement which checks for the value of
+C<$@> gets executed in the user's script.
+
+This scenario will mostly be applicable to code that is meant to be
+called from within destructors, asynchronous callbacks, signal
+handlers, C<__DIE__> or C<__WARN__> hooks, and C<tie> functions.  In
+such situations, you will not want to clear C<$@> at all, but simply to
+append any new errors to any existing value of C<$@>.
+
+The G_KEEPERR flag is meant to be used in conjunction with G_EVAL in
+I<call_*> functions that are used to implement such code.  This flag
+has no effect when G_EVAL is not used.
+
+When G_KEEPERR is used, any errors in the called code will be prefixed
+with the string "\t(in cleanup)", and appended to the current value
+of C<$@>.  an error will not be appended if that same error string is
+already at the end of C<$@>.
+
+In addition, a warning is generated using the appended string. This can be
+disabled using C<no warnings 'misc'>.
+
+The G_KEEPERR flag was introduced in Perl version 5.002.
+
+See I<Using G_KEEPERR> for an example of a situation that warrants the
+use of this flag.
+
+=head2 Determining the Context
+
+As mentioned above, you can determine the context of the currently
+executing subroutine in Perl with I<wantarray>.  The equivalent test
+can be made in C by using the C<GIMME_V> macro, which returns
+C<G_ARRAY> if you have been called in a list context, C<G_SCALAR> if
+in a scalar context, or C<G_VOID> if in a void context (i.e. the
+return value will not be used).  An older version of this macro is
+called C<GIMME>; in a void context it returns C<G_SCALAR> instead of
+C<G_VOID>.  An example of using the C<GIMME_V> macro is shown in
+section I<Using GIMME_V>.
+
+=head1 EXAMPLES
+
+Enough of the definition talk, let's have a few examples.
+
+Perl provides many macros to assist in accessing the Perl stack.
+Wherever possible, these macros should always be used when interfacing
+to Perl internals.  We hope this should make the code less vulnerable
+to any changes made to Perl in the future.
+
+Another point worth noting is that in the first series of examples I
+have made use of only the I<call_pv> function.  This has been done
+to keep the code simpler and ease you into the topic.  Wherever
+possible, if the choice is between using I<call_pv> and
+I<call_sv>, you should always try to use I<call_sv>.  See
+I<Using call_sv> for details.
+
+=head2 No Parameters, Nothing returned
+
+This first trivial example will call a Perl subroutine, I<PrintUID>, to
+print out the UID of the process.
+
+    sub PrintUID
+    {
+        print "UID is $<\n";
+    }
+
+and here is a C function to call it
+
+    static void
+    call_PrintUID()
+    {
+        dSP;
+
+        PUSHMARK(SP);
+        call_pv("PrintUID", G_DISCARD|G_NOARGS);
+    }
+
+Simple, eh.
+
+A few points to note about this example.
+
+=over 5
+
+=item 1.
+
+Ignore C<dSP> and C<PUSHMARK(SP)> for now. They will be discussed in
+the next example.
+
+=item 2.
+
+We aren't passing any parameters to I<PrintUID> so G_NOARGS can be
+specified.
+
+=item 3.
+
+We aren't interested in anything returned from I<PrintUID>, so
+G_DISCARD is specified. Even if I<PrintUID> was changed to
+return some value(s), having specified G_DISCARD will mean that they
+will be wiped by the time control returns from I<call_pv>.
+
+=item 4.
+
+As I<call_pv> is being used, the Perl subroutine is specified as a
+C string. In this case the subroutine name has been 'hard-wired' into the
+code.
+
+=item 5.
+
+Because we specified G_DISCARD, it is not necessary to check the value
+returned from I<call_pv>. It will always be 0.
+
+=back
+
+=head2 Passing Parameters
+
+Now let's make a slightly more complex example. This time we want to
+call a Perl subroutine, C<LeftString>, which will take 2 parameters--a
+string ($s) and an integer ($n).  The subroutine will simply
+print the first $n characters of the string.
+
+So the Perl subroutine would look like this
+
+    sub LeftString
+    {
+        my($s, $n) = @_;
+        print substr($s, 0, $n), "\n";
+    }
+
+The C function required to call I<LeftString> would look like this.
+
+    static void
+    call_LeftString(a, b)
+    char * a;
+    int b;
+    {
+        dSP;
+
+	ENTER;
+        SAVETMPS;
+
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSVpv(a, 0)));
+        XPUSHs(sv_2mortal(newSViv(b)));
+        PUTBACK;
+
+        call_pv("LeftString", G_DISCARD);
+
+        FREETMPS;
+        LEAVE;
+    }
+
+Here are a few notes on the C function I<call_LeftString>.
+
+=over 5
+
+=item 1.
+
+Parameters are passed to the Perl subroutine using the Perl stack.
+This is the purpose of the code beginning with the line C<dSP> and
+ending with the line C<PUTBACK>.  The C<dSP> declares a local copy
+of the stack pointer.  This local copy should B<always> be accessed
+as C<SP>.
+
+=item 2.
+
+If you are going to put something onto the Perl stack, you need to know
+where to put it. This is the purpose of the macro C<dSP>--it declares
+and initializes a I<local> copy of the Perl stack pointer.
+
+All the other macros which will be used in this example require you to
+have used this macro.
+
+The exception to this rule is if you are calling a Perl subroutine
+directly from an XSUB function. In this case it is not necessary to
+use the C<dSP> macro explicitly--it will be declared for you
+automatically.
+
+=item 3.
+
+Any parameters to be pushed onto the stack should be bracketed by the
+C<PUSHMARK> and C<PUTBACK> macros.  The purpose of these two macros, in
+this context, is to count the number of parameters you are
+pushing automatically.  Then whenever Perl is creating the C<@_> array for the
+subroutine, it knows how big to make it.
+
+The C<PUSHMARK> macro tells Perl to make a mental note of the current
+stack pointer. Even if you aren't passing any parameters (like the
+example shown in the section I<No Parameters, Nothing returned>) you
+must still call the C<PUSHMARK> macro before you can call any of the
+I<call_*> functions--Perl still needs to know that there are no
+parameters.
+
+The C<PUTBACK> macro sets the global copy of the stack pointer to be
+the same as our local copy. If we didn't do this I<call_pv>
+wouldn't know where the two parameters we pushed were--remember that
+up to now all the stack pointer manipulation we have done is with our
+local copy, I<not> the global copy.
+
+=item 4.
+
+Next, we come to XPUSHs. This is where the parameters actually get
+pushed onto the stack. In this case we are pushing a string and an
+integer.
+
+See L<perlguts/"XSUBs and the Argument Stack"> for details
+on how the XPUSH macros work.
+
+=item 5.
+
+Because we created temporary values (by means of sv_2mortal() calls)
+we will have to tidy up the Perl stack and dispose of mortal SVs.
+
+This is the purpose of
+
+    ENTER;
+    SAVETMPS;
+
+at the start of the function, and
+
+    FREETMPS;
+    LEAVE;
+
+at the end. The C<ENTER>/C<SAVETMPS> pair creates a boundary for any
+temporaries we create.  This means that the temporaries we get rid of
+will be limited to those which were created after these calls.
+
+The C<FREETMPS>/C<LEAVE> pair will get rid of any values returned by
+the Perl subroutine (see next example), plus it will also dump the
+mortal SVs we have created.  Having C<ENTER>/C<SAVETMPS> at the
+beginning of the code makes sure that no other mortals are destroyed.
+
+Think of these macros as working a bit like using C<{> and C<}> in Perl
+to limit the scope of local variables.
+
+See the section I<Using Perl to dispose of temporaries> for details of
+an alternative to using these macros.
+
+=item 6.
+
+Finally, I<LeftString> can now be called via the I<call_pv> function.
+The only flag specified this time is G_DISCARD. Because we are passing
+2 parameters to the Perl subroutine this time, we have not specified
+G_NOARGS.
+
+=back
+
+=head2 Returning a Scalar
+
+Now for an example of dealing with the items returned from a Perl
+subroutine.
+
+Here is a Perl subroutine, I<Adder>, that takes 2 integer parameters
+and simply returns their sum.
+
+    sub Adder
+    {
+        my($a, $b) = @_;
+        $a + $b;
+    }
+
+Because we are now concerned with the return value from I<Adder>, the C
+function required to call it is now a bit more complex.
+
+    static void
+    call_Adder(a, b)
+    int a;
+    int b;
+    {
+        dSP;
+        int count;
+
+        ENTER;
+        SAVETMPS;
+
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSViv(a)));
+        XPUSHs(sv_2mortal(newSViv(b)));
+        PUTBACK;
+
+        count = call_pv("Adder", G_SCALAR);
+
+        SPAGAIN;
+
+        if (count != 1)
+            croak("Big trouble\n");
+
+        printf ("The sum of %d and %d is %d\n", a, b, POPi);
+
+        PUTBACK;
+        FREETMPS;
+        LEAVE;
+    }
+
+Points to note this time are
+
+=over 5
+
+=item 1.
+
+The only flag specified this time was G_SCALAR. That means the C<@_>
+array will be created and that the value returned by I<Adder> will
+still exist after the call to I<call_pv>.
+
+=item 2.
+
+The purpose of the macro C<SPAGAIN> is to refresh the local copy of the
+stack pointer. This is necessary because it is possible that the memory
+allocated to the Perl stack has been reallocated whilst in the
+I<call_pv> call.
+
+If you are making use of the Perl stack pointer in your code you must
+always refresh the local copy using SPAGAIN whenever you make use
+of the I<call_*> functions or any other Perl internal function.
+
+=item 3.
+
+Although only a single value was expected to be returned from I<Adder>,
+it is still good practice to check the return code from I<call_pv>
+anyway.
+
+Expecting a single value is not quite the same as knowing that there
+will be one. If someone modified I<Adder> to return a list and we
+didn't check for that possibility and take appropriate action the Perl
+stack would end up in an inconsistent state. That is something you
+I<really> don't want to happen ever.
+
+=item 4.
+
+The C<POPi> macro is used here to pop the return value from the stack.
+In this case we wanted an integer, so C<POPi> was used.
+
+
+Here is the complete list of POP macros available, along with the types
+they return.
+
+    POPs	SV
+    POPp	pointer
+    POPn	double
+    POPi	integer
+    POPl	long
+
+=item 5.
+
+The final C<PUTBACK> is used to leave the Perl stack in a consistent
+state before exiting the function.  This is necessary because when we
+popped the return value from the stack with C<POPi> it updated only our
+local copy of the stack pointer.  Remember, C<PUTBACK> sets the global
+stack pointer to be the same as our local copy.
+
+=back
+
+
+=head2 Returning a list of values
+
+Now, let's extend the previous example to return both the sum of the
+parameters and the difference.
+
+Here is the Perl subroutine
+
+    sub AddSubtract
+    {
+       my($a, $b) = @_;
+       ($a+$b, $a-$b);
+    }
+
+and this is the C function
+
+    static void
+    call_AddSubtract(a, b)
+    int a;
+    int b;
+    {
+        dSP;
+        int count;
+
+        ENTER;
+        SAVETMPS;
+
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSViv(a)));
+        XPUSHs(sv_2mortal(newSViv(b)));
+        PUTBACK;
+
+        count = call_pv("AddSubtract", G_ARRAY);
+
+        SPAGAIN;
+
+        if (count != 2)
+            croak("Big trouble\n");
+
+        printf ("%d - %d = %d\n", a, b, POPi);
+        printf ("%d + %d = %d\n", a, b, POPi);
+
+        PUTBACK;
+        FREETMPS;
+        LEAVE;
+    }
+
+If I<call_AddSubtract> is called like this
+
+    call_AddSubtract(7, 4);
+
+then here is the output
+
+    7 - 4 = 3
+    7 + 4 = 11
+
+Notes
+
+=over 5
+
+=item 1.
+
+We wanted list context, so G_ARRAY was used.
+
+=item 2.
+
+Not surprisingly C<POPi> is used twice this time because we were
+retrieving 2 values from the stack. The important thing to note is that
+when using the C<POP*> macros they come off the stack in I<reverse>
+order.
+
+=back
+
+=head2 Returning a list in a scalar context
+
+Say the Perl subroutine in the previous section was called in a scalar
+context, like this
+
+    static void
+    call_AddSubScalar(a, b)
+    int a;
+    int b;
+    {
+        dSP;
+        int count;
+        int i;
+
+        ENTER;
+        SAVETMPS;
+
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSViv(a)));
+        XPUSHs(sv_2mortal(newSViv(b)));
+        PUTBACK;
+
+        count = call_pv("AddSubtract", G_SCALAR);
+
+        SPAGAIN;
+
+        printf ("Items Returned = %d\n", count);
+
+        for (i = 1; i <= count; ++i)
+            printf ("Value %d = %d\n", i, POPi);
+
+        PUTBACK;
+        FREETMPS;
+        LEAVE;
+    }
+
+The other modification made is that I<call_AddSubScalar> will print the
+number of items returned from the Perl subroutine and their value (for
+simplicity it assumes that they are integer).  So if
+I<call_AddSubScalar> is called
+
+    call_AddSubScalar(7, 4);
+
+then the output will be
+
+    Items Returned = 1
+    Value 1 = 3
+
+In this case the main point to note is that only the last item in the
+list is returned from the subroutine, I<AddSubtract> actually made it back to
+I<call_AddSubScalar>.
+
+
+=head2 Returning Data from Perl via the parameter list
+
+It is also possible to return values directly via the parameter list -
+whether it is actually desirable to do it is another matter entirely.
+
+The Perl subroutine, I<Inc>, below takes 2 parameters and increments
+each directly.
+
+    sub Inc
+    {
+        ++ $_[0];
+        ++ $_[1];
+    }
+
+and here is a C function to call it.
+
+    static void
+    call_Inc(a, b)
+    int a;
+    int b;
+    {
+        dSP;
+        int count;
+        SV * sva;
+        SV * svb;
+
+        ENTER;
+        SAVETMPS;
+
+        sva = sv_2mortal(newSViv(a));
+        svb = sv_2mortal(newSViv(b));
+
+        PUSHMARK(SP);
+        XPUSHs(sva);
+        XPUSHs(svb);
+        PUTBACK;
+
+        count = call_pv("Inc", G_DISCARD);
+
+        if (count != 0)
+            croak ("call_Inc: expected 0 values from 'Inc', got %d\n",
+                   count);
+
+        printf ("%d + 1 = %d\n", a, SvIV(sva));
+        printf ("%d + 1 = %d\n", b, SvIV(svb));
+
+	FREETMPS;
+	LEAVE;
+    }
+
+To be able to access the two parameters that were pushed onto the stack
+after they return from I<call_pv> it is necessary to make a note
+of their addresses--thus the two variables C<sva> and C<svb>.
+
+The reason this is necessary is that the area of the Perl stack which
+held them will very likely have been overwritten by something else by
+the time control returns from I<call_pv>.
+
+
+
+
+=head2 Using G_EVAL
+
+Now an example using G_EVAL. Below is a Perl subroutine which computes
+the difference of its 2 parameters. If this would result in a negative
+result, the subroutine calls I<die>.
+
+    sub Subtract
+    {
+        my ($a, $b) = @_;
+
+        die "death can be fatal\n" if $a < $b;
+
+        $a - $b;
+    }
+
+and some C to call it
+
+    static void
+    call_Subtract(a, b)
+    int a;
+    int b;
+    {
+        dSP;
+        int count;
+
+        ENTER;
+        SAVETMPS;
+
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSViv(a)));
+        XPUSHs(sv_2mortal(newSViv(b)));
+        PUTBACK;
+
+        count = call_pv("Subtract", G_EVAL|G_SCALAR);
+
+        SPAGAIN;
+
+        /* Check the eval first */
+        if (SvTRUE(ERRSV))
+        {
+	    STRLEN n_a;
+            printf ("Uh oh - %s\n", SvPV(ERRSV, n_a));
+            POPs;
+        }
+        else
+        {
+            if (count != 1)
+               croak("call_Subtract: wanted 1 value from 'Subtract', got %d\n",
+                        count);
+
+            printf ("%d - %d = %d\n", a, b, POPi);
+        }
+
+        PUTBACK;
+        FREETMPS;
+        LEAVE;
+    }
+
+If I<call_Subtract> is called thus
+
+    call_Subtract(4, 5)
+
+the following will be printed
+
+    Uh oh - death can be fatal
+
+Notes
+
+=over 5
+
+=item 1.
+
+We want to be able to catch the I<die> so we have used the G_EVAL
+flag.  Not specifying this flag would mean that the program would
+terminate immediately at the I<die> statement in the subroutine
+I<Subtract>.
+
+=item 2.
+
+The code
+
+    if (SvTRUE(ERRSV))
+    {
+	STRLEN n_a;
+        printf ("Uh oh - %s\n", SvPV(ERRSV, n_a));
+        POPs;
+    }
+
+is the direct equivalent of this bit of Perl
+
+    print "Uh oh - $@\n" if $@;
+
+C<PL_errgv> is a perl global of type C<GV *> that points to the
+symbol table entry containing the error.  C<ERRSV> therefore
+refers to the C equivalent of C<$@>.
+
+=item 3.
+
+Note that the stack is popped using C<POPs> in the block where
+C<SvTRUE(ERRSV)> is true.  This is necessary because whenever a
+I<call_*> function invoked with G_EVAL|G_SCALAR returns an error,
+the top of the stack holds the value I<undef>. Because we want the
+program to continue after detecting this error, it is essential that
+the stack is tidied up by removing the I<undef>.
+
+=back
+
+
+=head2 Using G_KEEPERR
+
+Consider this rather facetious example, where we have used an XS
+version of the call_Subtract example above inside a destructor:
+
+    package Foo;
+    sub new { bless {}, $_[0] }
+    sub Subtract {
+        my($a,$b) = @_;
+        die "death can be fatal" if $a < $b;
+        $a - $b;
+    }
+    sub DESTROY { call_Subtract(5, 4); }
+    sub foo { die "foo dies"; }
+
+    package main;
+    eval { Foo->new->foo };
+    print "Saw: $@" if $@;             # should be, but isn't
+
+This example will fail to recognize that an error occurred inside the
+C<eval {}>.  Here's why: the call_Subtract code got executed while perl
+was cleaning up temporaries when exiting the eval block, and because
+call_Subtract is implemented with I<call_pv> using the G_EVAL
+flag, it promptly reset C<$@>.  This results in the failure of the
+outermost test for C<$@>, and thereby the failure of the error trap.
+
+Appending the G_KEEPERR flag, so that the I<call_pv> call in
+call_Subtract reads:
+
+        count = call_pv("Subtract", G_EVAL|G_SCALAR|G_KEEPERR);
+
+will preserve the error and restore reliable error handling.
+
+=head2 Using call_sv
+
+In all the previous examples I have 'hard-wired' the name of the Perl
+subroutine to be called from C.  Most of the time though, it is more
+convenient to be able to specify the name of the Perl subroutine from
+within the Perl script.
+
+Consider the Perl code below
+
+    sub fred
+    {
+        print "Hello there\n";
+    }
+
+    CallSubPV("fred");
+
+Here is a snippet of XSUB which defines I<CallSubPV>.
+
+    void
+    CallSubPV(name)
+    	char *	name
+    	CODE:
+	PUSHMARK(SP);
+	call_pv(name, G_DISCARD|G_NOARGS);
+
+That is fine as far as it goes. The thing is, the Perl subroutine
+can be specified as only a string.  For Perl 4 this was adequate,
+but Perl 5 allows references to subroutines and anonymous subroutines.
+This is where I<call_sv> is useful.
+
+The code below for I<CallSubSV> is identical to I<CallSubPV> except
+that the C<name> parameter is now defined as an SV* and we use
+I<call_sv> instead of I<call_pv>.
+
+    void
+    CallSubSV(name)
+    	SV *	name
+    	CODE:
+	PUSHMARK(SP);
+	call_sv(name, G_DISCARD|G_NOARGS);
+
+Because we are using an SV to call I<fred> the following can all be used
+
+    CallSubSV("fred");
+    CallSubSV(\&fred);
+    $ref = \&fred;
+    CallSubSV($ref);
+    CallSubSV( sub { print "Hello there\n" } );
+
+As you can see, I<call_sv> gives you much greater flexibility in
+how you can specify the Perl subroutine.
+
+You should note that if it is necessary to store the SV (C<name> in the
+example above) which corresponds to the Perl subroutine so that it can
+be used later in the program, it not enough just to store a copy of the
+pointer to the SV. Say the code above had been like this
+
+    static SV * rememberSub;
+
+    void
+    SaveSub1(name)
+    	SV *	name
+    	CODE:
+	rememberSub = name;
+
+    void
+    CallSavedSub1()
+    	CODE:
+	PUSHMARK(SP);
+	call_sv(rememberSub, G_DISCARD|G_NOARGS);
+
+The reason this is wrong is that by the time you come to use the
+pointer C<rememberSub> in C<CallSavedSub1>, it may or may not still refer
+to the Perl subroutine that was recorded in C<SaveSub1>.  This is
+particularly true for these cases
+
+    SaveSub1(\&fred);
+    CallSavedSub1();
+
+    SaveSub1( sub { print "Hello there\n" } );
+    CallSavedSub1();
+
+By the time each of the C<SaveSub1> statements above have been executed,
+the SV*s which corresponded to the parameters will no longer exist.
+Expect an error message from Perl of the form
+
+    Can't use an undefined value as a subroutine reference at ...
+
+for each of the C<CallSavedSub1> lines.
+
+Similarly, with this code
+
+    $ref = \&fred;
+    SaveSub1($ref);
+    $ref = 47;
+    CallSavedSub1();
+
+you can expect one of these messages (which you actually get is dependent on
+the version of Perl you are using)
+
+    Not a CODE reference at ...
+    Undefined subroutine &main::47 called ...
+
+The variable $ref may have referred to the subroutine C<fred>
+whenever the call to C<SaveSub1> was made but by the time
+C<CallSavedSub1> gets called it now holds the number C<47>. Because we
+saved only a pointer to the original SV in C<SaveSub1>, any changes to
+$ref will be tracked by the pointer C<rememberSub>. This means that
+whenever C<CallSavedSub1> gets called, it will attempt to execute the
+code which is referenced by the SV* C<rememberSub>.  In this case
+though, it now refers to the integer C<47>, so expect Perl to complain
+loudly.
+
+A similar but more subtle problem is illustrated with this code
+
+    $ref = \&fred;
+    SaveSub1($ref);
+    $ref = \&joe;
+    CallSavedSub1();
+
+This time whenever C<CallSavedSub1> get called it will execute the Perl
+subroutine C<joe> (assuming it exists) rather than C<fred> as was
+originally requested in the call to C<SaveSub1>.
+
+To get around these problems it is necessary to take a full copy of the
+SV.  The code below shows C<SaveSub2> modified to do that
+
+    static SV * keepSub = (SV*)NULL;
+
+    void
+    SaveSub2(name)
+        SV *	name
+    	CODE:
+     	/* Take a copy of the callback */
+    	if (keepSub == (SV*)NULL)
+    	    /* First time, so create a new SV */
+	    keepSub = newSVsv(name);
+    	else
+    	    /* Been here before, so overwrite */
+	    SvSetSV(keepSub, name);
+
+    void
+    CallSavedSub2()
+    	CODE:
+	PUSHMARK(SP);
+	call_sv(keepSub, G_DISCARD|G_NOARGS);
+
+To avoid creating a new SV every time C<SaveSub2> is called,
+the function first checks to see if it has been called before.  If not,
+then space for a new SV is allocated and the reference to the Perl
+subroutine, C<name> is copied to the variable C<keepSub> in one
+operation using C<newSVsv>.  Thereafter, whenever C<SaveSub2> is called
+the existing SV, C<keepSub>, is overwritten with the new value using
+C<SvSetSV>.
+
+=head2 Using call_argv
+
+Here is a Perl subroutine which prints whatever parameters are passed
+to it.
+
+    sub PrintList
+    {
+        my(@list) = @_;
+
+        foreach (@list) { print "$_\n" }
+    }
+
+and here is an example of I<call_argv> which will call
+I<PrintList>.
+
+    static char * words[] = {"alpha", "beta", "gamma", "delta", NULL};
+
+    static void
+    call_PrintList()
+    {
+        dSP;
+
+        call_argv("PrintList", G_DISCARD, words);
+    }
+
+Note that it is not necessary to call C<PUSHMARK> in this instance.
+This is because I<call_argv> will do it for you.
+
+=head2 Using call_method
+
+Consider the following Perl code
+
+    {
+        package Mine;
+
+        sub new
+        {
+            my($type) = shift;
+            bless [@_]
+        }
+
+        sub Display
+        {
+            my ($self, $index) = @_;
+            print "$index: $$self[$index]\n";
+        }
+
+        sub PrintID
+        {
+            my($class) = @_;
+            print "This is Class $class version 1.0\n";
+        }
+    }
+
+It implements just a very simple class to manage an array.  Apart from
+the constructor, C<new>, it declares methods, one static and one
+virtual. The static method, C<PrintID>, prints out simply the class
+name and a version number. The virtual method, C<Display>, prints out a
+single element of the array.  Here is an all Perl example of using it.
+
+    $a = new Mine ('red', 'green', 'blue');
+    $a->Display(1);
+    PrintID Mine;
+
+will print
+
+    1: green
+    This is Class Mine version 1.0
+
+Calling a Perl method from C is fairly straightforward. The following
+things are required
+
+=over 5
+
+=item *
+
+a reference to the object for a virtual method or the name of the class
+for a static method.
+
+=item *
+
+the name of the method.
+
+=item *
+
+any other parameters specific to the method.
+
+=back
+
+Here is a simple XSUB which illustrates the mechanics of calling both
+the C<PrintID> and C<Display> methods from C.
+
+    void
+    call_Method(ref, method, index)
+        SV *	ref
+        char *	method
+        int		index
+        CODE:
+        PUSHMARK(SP);
+        XPUSHs(ref);
+        XPUSHs(sv_2mortal(newSViv(index)));
+        PUTBACK;
+
+        call_method(method, G_DISCARD);
+
+    void
+    call_PrintID(class, method)
+        char *	class
+        char *	method
+        CODE:
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSVpv(class, 0)));
+        PUTBACK;
+
+        call_method(method, G_DISCARD);
+
+
+So the methods C<PrintID> and C<Display> can be invoked like this
+
+    $a = new Mine ('red', 'green', 'blue');
+    call_Method($a, 'Display', 1);
+    call_PrintID('Mine', 'PrintID');
+
+The only thing to note is that in both the static and virtual methods,
+the method name is not passed via the stack--it is used as the first
+parameter to I<call_method>.
+
+=head2 Using GIMME_V
+
+Here is a trivial XSUB which prints the context in which it is
+currently executing.
+
+    void
+    PrintContext()
+        CODE:
+        I32 gimme = GIMME_V;
+        if (gimme == G_VOID)
+            printf ("Context is Void\n");
+        else if (gimme == G_SCALAR)
+            printf ("Context is Scalar\n");
+        else
+            printf ("Context is Array\n");
+
+and here is some Perl to test it
+
+    PrintContext;
+    $a = PrintContext;
+    @a = PrintContext;
+
+The output from that will be
+
+    Context is Void
+    Context is Scalar
+    Context is Array
+
+=head2 Using Perl to dispose of temporaries
+
+In the examples given to date, any temporaries created in the callback
+(i.e., parameters passed on the stack to the I<call_*> function or
+values returned via the stack) have been freed by one of these methods
+
+=over 5
+
+=item *
+
+specifying the G_DISCARD flag with I<call_*>.
+
+=item *
+
+explicitly disposed of using the C<ENTER>/C<SAVETMPS> -
+C<FREETMPS>/C<LEAVE> pairing.
+
+=back
+
+There is another method which can be used, namely letting Perl do it
+for you automatically whenever it regains control after the callback
+has terminated.  This is done by simply not using the
+
+    ENTER;
+    SAVETMPS;
+    ...
+    FREETMPS;
+    LEAVE;
+
+sequence in the callback (and not, of course, specifying the G_DISCARD
+flag).
+
+If you are going to use this method you have to be aware of a possible
+memory leak which can arise under very specific circumstances.  To
+explain these circumstances you need to know a bit about the flow of
+control between Perl and the callback routine.
+
+The examples given at the start of the document (an error handler and
+an event driven program) are typical of the two main sorts of flow
+control that you are likely to encounter with callbacks.  There is a
+very important distinction between them, so pay attention.
+
+In the first example, an error handler, the flow of control could be as
+follows.  You have created an interface to an external library.
+Control can reach the external library like this
+
+    perl --> XSUB --> external library
+
+Whilst control is in the library, an error condition occurs. You have
+previously set up a Perl callback to handle this situation, so it will
+get executed. Once the callback has finished, control will drop back to
+Perl again.  Here is what the flow of control will be like in that
+situation
+
+    perl --> XSUB --> external library
+                      ...
+                      error occurs
+                      ...
+                      external library --> call_* --> perl
+                                                          |
+    perl <-- XSUB <-- external library <-- call_* <----+
+
+After processing of the error using I<call_*> is completed,
+control reverts back to Perl more or less immediately.
+
+In the diagram, the further right you go the more deeply nested the
+scope is.  It is only when control is back with perl on the extreme
+left of the diagram that you will have dropped back to the enclosing
+scope and any temporaries you have left hanging around will be freed.
+
+In the second example, an event driven program, the flow of control
+will be more like this
+
+    perl --> XSUB --> event handler
+                      ...
+                      event handler --> call_* --> perl
+                                                       |
+                      event handler <-- call_* <----+
+                      ...
+                      event handler --> call_* --> perl
+                                                       |
+                      event handler <-- call_* <----+
+                      ...
+                      event handler --> call_* --> perl
+                                                       |
+                      event handler <-- call_* <----+
+
+In this case the flow of control can consist of only the repeated
+sequence
+
+    event handler --> call_* --> perl
+
+for practically the complete duration of the program.  This means that
+control may I<never> drop back to the surrounding scope in Perl at the
+extreme left.
+
+So what is the big problem? Well, if you are expecting Perl to tidy up
+those temporaries for you, you might be in for a long wait.  For Perl
+to dispose of your temporaries, control must drop back to the
+enclosing scope at some stage.  In the event driven scenario that may
+never happen.  This means that as time goes on, your program will
+create more and more temporaries, none of which will ever be freed. As
+each of these temporaries consumes some memory your program will
+eventually consume all the available memory in your system--kapow!
+
+So here is the bottom line--if you are sure that control will revert
+back to the enclosing Perl scope fairly quickly after the end of your
+callback, then it isn't absolutely necessary to dispose explicitly of
+any temporaries you may have created. Mind you, if you are at all
+uncertain about what to do, it doesn't do any harm to tidy up anyway.
+
+
+=head2 Strategies for storing Callback Context Information
+
+
+Potentially one of the trickiest problems to overcome when designing a
+callback interface can be figuring out how to store the mapping between
+the C callback function and the Perl equivalent.
+
+To help understand why this can be a real problem first consider how a
+callback is set up in an all C environment.  Typically a C API will
+provide a function to register a callback.  This will expect a pointer
+to a function as one of its parameters.  Below is a call to a
+hypothetical function C<register_fatal> which registers the C function
+to get called when a fatal error occurs.
+
+    register_fatal(cb1);
+
+The single parameter C<cb1> is a pointer to a function, so you must
+have defined C<cb1> in your code, say something like this
+
+    static void
+    cb1()
+    {
+        printf ("Fatal Error\n");
+        exit(1);
+    }
+
+Now change that to call a Perl subroutine instead
+
+    static SV * callback = (SV*)NULL;
+
+    static void
+    cb1()
+    {
+        dSP;
+
+        PUSHMARK(SP);
+
+        /* Call the Perl sub to process the callback */
+        call_sv(callback, G_DISCARD);
+    }
+
+
+    void
+    register_fatal(fn)
+        SV *	fn
+        CODE:
+        /* Remember the Perl sub */
+        if (callback == (SV*)NULL)
+            callback = newSVsv(fn);
+        else
+            SvSetSV(callback, fn);
+
+        /* register the callback with the external library */
+        register_fatal(cb1);
+
+where the Perl equivalent of C<register_fatal> and the callback it
+registers, C<pcb1>, might look like this
+
+    # Register the sub pcb1
+    register_fatal(\&pcb1);
+
+    sub pcb1
+    {
+        die "I'm dying...\n";
+    }
+
+The mapping between the C callback and the Perl equivalent is stored in
+the global variable C<callback>.
+
+This will be adequate if you ever need to have only one callback
+registered at any time. An example could be an error handler like the
+code sketched out above. Remember though, repeated calls to
+C<register_fatal> will replace the previously registered callback
+function with the new one.
+
+Say for example you want to interface to a library which allows asynchronous
+file i/o.  In this case you may be able to register a callback whenever
+a read operation has completed. To be of any use we want to be able to
+call separate Perl subroutines for each file that is opened.  As it
+stands, the error handler example above would not be adequate as it
+allows only a single callback to be defined at any time. What we
+require is a means of storing the mapping between the opened file and
+the Perl subroutine we want to be called for that file.
+
+Say the i/o library has a function C<asynch_read> which associates a C
+function C<ProcessRead> with a file handle C<fh>--this assumes that it
+has also provided some routine to open the file and so obtain the file
+handle.
+
+    asynch_read(fh, ProcessRead)
+
+This may expect the C I<ProcessRead> function of this form
+
+    void
+    ProcessRead(fh, buffer)
+    int	fh;
+    char *	buffer;
+    {
+         ...
+    }
+
+To provide a Perl interface to this library we need to be able to map
+between the C<fh> parameter and the Perl subroutine we want called.  A
+hash is a convenient mechanism for storing this mapping.  The code
+below shows a possible implementation
+
+    static HV * Mapping = (HV*)NULL;
+
+    void
+    asynch_read(fh, callback)
+        int	fh
+        SV *	callback
+        CODE:
+        /* If the hash doesn't already exist, create it */
+        if (Mapping == (HV*)NULL)
+            Mapping = newHV();
+
+        /* Save the fh -> callback mapping */
+        hv_store(Mapping, (char*)&fh, sizeof(fh), newSVsv(callback), 0);
+
+        /* Register with the C Library */
+        asynch_read(fh, asynch_read_if);
+
+and C<asynch_read_if> could look like this
+
+    static void
+    asynch_read_if(fh, buffer)
+    int	fh;
+    char *	buffer;
+    {
+        dSP;
+        SV ** sv;
+
+        /* Get the callback associated with fh */
+        sv =  hv_fetch(Mapping, (char*)&fh , sizeof(fh), FALSE);
+        if (sv == (SV**)NULL)
+            croak("Internal error...\n");
+
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSViv(fh)));
+        XPUSHs(sv_2mortal(newSVpv(buffer, 0)));
+        PUTBACK;
+
+        /* Call the Perl sub */
+        call_sv(*sv, G_DISCARD);
+    }
+
+For completeness, here is C<asynch_close>.  This shows how to remove
+the entry from the hash C<Mapping>.
+
+    void
+    asynch_close(fh)
+        int	fh
+        CODE:
+        /* Remove the entry from the hash */
+        (void) hv_delete(Mapping, (char*)&fh, sizeof(fh), G_DISCARD);
+
+        /* Now call the real asynch_close */
+        asynch_close(fh);
+
+So the Perl interface would look like this
+
+    sub callback1
+    {
+        my($handle, $buffer) = @_;
+    }
+
+    # Register the Perl callback
+    asynch_read($fh, \&callback1);
+
+    asynch_close($fh);
+
+The mapping between the C callback and Perl is stored in the global
+hash C<Mapping> this time. Using a hash has the distinct advantage that
+it allows an unlimited number of callbacks to be registered.
+
+What if the interface provided by the C callback doesn't contain a
+parameter which allows the file handle to Perl subroutine mapping?  Say
+in the asynchronous i/o package, the callback function gets passed only
+the C<buffer> parameter like this
+
+    void
+    ProcessRead(buffer)
+    char *	buffer;
+    {
+        ...
+    }
+
+Without the file handle there is no straightforward way to map from the
+C callback to the Perl subroutine.
+
+In this case a possible way around this problem is to predefine a
+series of C functions to act as the interface to Perl, thus
+
+    #define MAX_CB		3
+    #define NULL_HANDLE	-1
+    typedef void (*FnMap)();
+
+    struct MapStruct {
+        FnMap    Function;
+        SV *     PerlSub;
+        int      Handle;
+      };
+
+    static void  fn1();
+    static void  fn2();
+    static void  fn3();
+
+    static struct MapStruct Map [MAX_CB] =
+        {
+            { fn1, NULL, NULL_HANDLE },
+            { fn2, NULL, NULL_HANDLE },
+            { fn3, NULL, NULL_HANDLE }
+        };
+
+    static void
+    Pcb(index, buffer)
+    int index;
+    char * buffer;
+    {
+        dSP;
+
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSVpv(buffer, 0)));
+        PUTBACK;
+
+        /* Call the Perl sub */
+        call_sv(Map[index].PerlSub, G_DISCARD);
+    }
+
+    static void
+    fn1(buffer)
+    char * buffer;
+    {
+        Pcb(0, buffer);
+    }
+
+    static void
+    fn2(buffer)
+    char * buffer;
+    {
+        Pcb(1, buffer);
+    }
+
+    static void
+    fn3(buffer)
+    char * buffer;
+    {
+        Pcb(2, buffer);
+    }
+
+    void
+    array_asynch_read(fh, callback)
+        int		fh
+        SV *	callback
+        CODE:
+        int index;
+        int null_index = MAX_CB;
+
+        /* Find the same handle or an empty entry */
+        for (index = 0; index < MAX_CB; ++index)
+        {
+            if (Map[index].Handle == fh)
+                break;
+
+            if (Map[index].Handle == NULL_HANDLE)
+                null_index = index;
+        }
+
+        if (index == MAX_CB && null_index == MAX_CB)
+            croak ("Too many callback functions registered\n");
+
+        if (index == MAX_CB)
+            index = null_index;
+
+        /* Save the file handle */
+        Map[index].Handle = fh;
+
+        /* Remember the Perl sub */
+        if (Map[index].PerlSub == (SV*)NULL)
+            Map[index].PerlSub = newSVsv(callback);
+        else
+            SvSetSV(Map[index].PerlSub, callback);
+
+        asynch_read(fh, Map[index].Function);
+
+    void
+    array_asynch_close(fh)
+        int	fh
+        CODE:
+        int index;
+
+        /* Find the file handle */
+        for (index = 0; index < MAX_CB; ++ index)
+            if (Map[index].Handle == fh)
+                break;
+
+        if (index == MAX_CB)
+            croak ("could not close fh %d\n", fh);
+
+        Map[index].Handle = NULL_HANDLE;
+        SvREFCNT_dec(Map[index].PerlSub);
+        Map[index].PerlSub = (SV*)NULL;
+
+        asynch_close(fh);
+
+In this case the functions C<fn1>, C<fn2>, and C<fn3> are used to
+remember the Perl subroutine to be called. Each of the functions holds
+a separate hard-wired index which is used in the function C<Pcb> to
+access the C<Map> array and actually call the Perl subroutine.
+
+There are some obvious disadvantages with this technique.
+
+Firstly, the code is considerably more complex than with the previous
+example.
+
+Secondly, there is a hard-wired limit (in this case 3) to the number of
+callbacks that can exist simultaneously. The only way to increase the
+limit is by modifying the code to add more functions and then
+recompiling.  None the less, as long as the number of functions is
+chosen with some care, it is still a workable solution and in some
+cases is the only one available.
+
+To summarize, here are a number of possible methods for you to consider
+for storing the mapping between C and the Perl callback
+
+=over 5
+
+=item 1. Ignore the problem - Allow only 1 callback
+
+For a lot of situations, like interfacing to an error handler, this may
+be a perfectly adequate solution.
+
+=item 2. Create a sequence of callbacks - hard wired limit
+
+If it is impossible to tell from the parameters passed back from the C
+callback what the context is, then you may need to create a sequence of C
+callback interface functions, and store pointers to each in an array.
+
+=item 3. Use a parameter to map to the Perl callback
+
+A hash is an ideal mechanism to store the mapping between C and Perl.
+
+=back
+
+
+=head2 Alternate Stack Manipulation
+
+
+Although I have made use of only the C<POP*> macros to access values
+returned from Perl subroutines, it is also possible to bypass these
+macros and read the stack using the C<ST> macro (See L<perlxs> for a
+full description of the C<ST> macro).
+
+Most of the time the C<POP*> macros should be adequate, the main
+problem with them is that they force you to process the returned values
+in sequence. This may not be the most suitable way to process the
+values in some cases. What we want is to be able to access the stack in
+a random order. The C<ST> macro as used when coding an XSUB is ideal
+for this purpose.
+
+The code below is the example given in the section I<Returning a list
+of values> recoded to use C<ST> instead of C<POP*>.
+
+    static void
+    call_AddSubtract2(a, b)
+    int a;
+    int b;
+    {
+        dSP;
+        I32 ax;
+        int count;
+
+        ENTER;
+        SAVETMPS;
+
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSViv(a)));
+        XPUSHs(sv_2mortal(newSViv(b)));
+        PUTBACK;
+
+        count = call_pv("AddSubtract", G_ARRAY);
+
+        SPAGAIN;
+        SP -= count;
+        ax = (SP - PL_stack_base) + 1;
+
+        if (count != 2)
+            croak("Big trouble\n");
+
+        printf ("%d + %d = %d\n", a, b, SvIV(ST(0)));
+        printf ("%d - %d = %d\n", a, b, SvIV(ST(1)));
+
+        PUTBACK;
+        FREETMPS;
+        LEAVE;
+    }
+
+Notes
+
+=over 5
+
+=item 1.
+
+Notice that it was necessary to define the variable C<ax>.  This is
+because the C<ST> macro expects it to exist.  If we were in an XSUB it
+would not be necessary to define C<ax> as it is already defined for
+you.
+
+=item 2.
+
+The code
+
+        SPAGAIN;
+        SP -= count;
+        ax = (SP - PL_stack_base) + 1;
+
+sets the stack up so that we can use the C<ST> macro.
+
+=item 3.
+
+Unlike the original coding of this example, the returned
+values are not accessed in reverse order.  So C<ST(0)> refers to the
+first value returned by the Perl subroutine and C<ST(count-1)>
+refers to the last.
+
+=back
+
+=head2 Creating and calling an anonymous subroutine in C
+
+As we've already shown, C<call_sv> can be used to invoke an
+anonymous subroutine.  However, our example showed a Perl script
+invoking an XSUB to perform this operation.  Let's see how it can be
+done inside our C code:
+
+ ...
+
+ SV *cvrv = eval_pv("sub { print 'You will not find me cluttering any namespace!' }", TRUE);
+
+ ...
+
+ call_sv(cvrv, G_VOID|G_NOARGS);
+
+C<eval_pv> is used to compile the anonymous subroutine, which
+will be the return value as well (read more about C<eval_pv> in
+L<perlapi/eval_pv>).  Once this code reference is in hand, it
+can be mixed in with all the previous examples we've shown.
+
+=head1 SEE ALSO
+
+L<perlxs>, L<perlguts>, L<perlembed>
+
+=head1 AUTHOR
+
+Paul Marquess 
+
+Special thanks to the following people who assisted in the creation of
+the document.
+
+Jeff Okamoto, Tim Bunce, Nick Gianniotis, Steve Kelem, Gurusamy Sarathy
+and Larry Wall.
+
+=head1 DATE
+
+Version 1.3, 14th Apr 1997
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlce.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlce.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlce.pod	(revision 14489)
@@ -0,0 +1,137 @@
+If you read this file _as_is_, just ignore the funny characters you
+see.  It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+perlce - Perl for WinCE
+
+=head1 DESCRIPTION
+
+This file gives the instructions for building Perl5.8 and above for
+WinCE.  Please read and understand the terms under which this
+software is distributed.
+
+=head1 BUILD
+
+This section describes the steps to be performed to build PerlCE.
+You may find additional and newer information about building perl
+for WinCE using following URL:
+
+  http://perlce.sourceforge.net
+
+There should also be pre-built binaries there.
+
+Don't be confused by large size of downloaded distribution or constructed
+binaries: entire distribution could be large for WinCE ideology, but
+you may strip it at your wish and use only required parts.
+
+=head2 Tools & SDK
+
+For compiling, you need following:
+
+=over 4
+
+=item * Microsoft Embedded Visual Tools
+
+=item * Microsoft Visual C++
+
+=item * Rainer Keuchel's celib-sources
+
+=item * Rainer Keuchel's console-sources
+
+=back
+
+Needed source files can be downloaded via:
+www.rainer-keuchel.de/wince/dirlist.html
+
+=head2 Make
+
+Please pay attention that starting from 5.8.0 miniperl *is* built
+and it facilitates in further building process. This means that
+in addition to compiler installation for mobile device you also need
+to have Microsoft Visual C++ installed as well.
+
+On the bright side, you do not need to edit any files from ./win32
+subdirectory. Normally you only need to edit ./wince/compile.bat
+to reflect your system and run it.
+
+File ./wince/compile.bat is actually a wrapper to call
+nmake -f makefile.ce with appropriate parameters and it accepts extra
+parameters and forwards them to "nmake" command as additional
+arguments. You should pass target this way.
+
+To prepare distribution you need to do following:
+
+=over 4
+
+=item * go to ./wince subdirectory
+
+=item * edit file compile.bat
+
+=item * run 
+  compile.bat
+
+=item * run 
+  compile.bat dist
+
+=back
+
+makefile.ce has CROSS_NAME macro, and it is used further to refer to
+your cross-compilation scheme. You could assign a name to it, but this
+is not necessary, because by default it is assigned after your machine
+configuration name, such as "wince-sh3-hpc-wce211", and this is enough
+to distinguish different builds at the same time. This option could be
+handy for several different builds on same platform to perform, say,
+threaded build. In a following example we assume that all required
+environment variables are set properly for C cross-compiler (a special
+*.bat file could fit perfectly to this purpose) and your compile.bat
+has proper "MACHINE" parameter set, to, say, "wince-mips-pocket-wce300".
+
+  compile.bat
+  compile.bat dist
+  compile.bat CROSS_NAME=mips-wce300-thr "USE_ITHREADS=define" "USE_IMP_SYS=define" "USE_MULTI=define"
+  compile.bat CROSS_NAME=mips-wce300-thr "USE_ITHREADS=define" "USE_IMP_SYS=define" "USE_MULTI=define" dist
+
+If all goes okay and no errors during a build, you'll get two independent
+distributions: "wince-mips-pocket-wce300" and "mips-wce300-thr".
+
+Target 'dist' prepares distribution file set. Target 'zipdist' performs
+same as 'dist' but additionally compresses distribution files into zip
+archive.
+
+NOTE: during a build there could be created a number (or one) of Config.pm
+for cross-compilation ("foreign" Config.pm) and those are hidden inside
+../xlib/$(CROSS_NAME) with other auxilary files, but, and this is important to
+note, there should be *no* Config.pm for host miniperl.
+If you'll get an error that perl could not find Config.pm somewhere in building
+process this means something went wrong. Most probably you forgot to
+specify a cross-compilation when invoking miniperl.exe to Makefile.PL
+When building an extension for cross-compilation your command line should
+look like
+
+  ..\miniperl.exe -I..\lib -MCross=mips-wce300-thr Makefile.PL
+
+or just
+
+  ..\miniperl.exe -I..\lib -MCross Makefile.PL
+
+to refer a cross-compilation that was created last time.
+
+
+If you decided to build with fcrypt.c file, please refer to README.win32
+file, as long as all legal considerations and steps to do are exactly same 
+in this case.
+
+All questions related to building for WinCE devices could be asked in
+perlce-users@lists.sourceforge.net mailing list.
+
+=head1 ACKNOWLEDGEMENTS
+
+The port for Win32 was used as a reference.
+
+=head1 AUTHORS
+
+Rainer Keuchel (keuchel@netwave.de)
+Vadim Konovalov (vkonovalov@spb.lucent.com)
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcheat.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcheat.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcheat.pod	(revision 14489)
@@ -0,0 +1,93 @@
+=head1 NAME
+
+perlcheat - Perl 5 Cheat Sheet
+
+=head1 DESCRIPTION
+
+This 'cheat sheet' is a handy reference, meant for beginning Perl
+programmers. Not everything is mentioned, but 194 features may
+already be overwhelming.
+
+=head2 The sheet
+
+  CONTEXTS  SIGILS             ARRAYS        HASHES
+  void      $scalar   whole:   @array        %hash
+  scalar    @array    slice:   @array[0, 2]  @hash{'a', 'b'}
+  list      %hash     element: $array[0]     $hash{'a'}
+            &sub
+            *glob    SCALAR VALUES
+                     number, string, reference, glob, undef
+  REFERENCES
+  \     references      $$foo[1]       aka $foo->[1]
+  $@%&* dereference     $$foo{bar}     aka $foo->{bar}
+  []    anon. arrayref  ${$$foo[1]}[2] aka $foo->[1]->[2]
+  {}    anon. hashref   ${$$foo[1]}[2] aka $foo->[1][2]
+  \()   list of refs
+                          NUMBERS vs STRINGS  LINKS
+  OPERATOR PRECEDENCE     =          =        perl.plover.com
+  ->                      +          .        search.cpan.org
+  ++ --                   == !=      eq ne         cpan.org
+  **                      < > <= >=  lt gt le ge   pm.org
+  ! ~ \ u+ u-             <=>        cmp           tpj.com
+  =~ !~                                            perldoc.com
+  * / % x                 SYNTAX
+  + - .                   for    (LIST) { }, for (a;b;c) { }
+  << >>                   while  ( ) { }, until ( ) { }
+  named uops              if     ( ) { } elsif ( ) { } else { }
+  < > <= >= lt gt le ge   unless ( ) { } elsif ( ) { } else { }
+  == != <=> eq ne cmp     for equals foreach (ALWAYS)
+  &
+  | ^              REGEX METACHARS            REGEX MODIFIERS
+  &&               ^     string begin         /i case insens.
+  ||               $     str. end (before \n) /m line based ^$
+  .. ...           +     one or more          /s . includes \n
+  ?:               *     zero or more         /x ign. wh.space
+  = += -= *= etc.  ?     zero or one          /g global
+  , =>             {3,7} repeat in range
+  list ops         ()    capture          REGEX CHARCLASSES
+  not              (?:)  no capture       .  == [^\n]
+  and              []    character class  \s == [\x20\f\t\r\n]
+  or xor           |     alternation      \w == [A-Za-z0-9_]
+                   \b    word boundary    \d == [0-9]
+                   \z    string end       \S, \W and \D negate
+  DO
+  use strict;        DON'T            LINKS
+  use warnings;      "$foo"           perl.com
+  my $var;           $$variable_name  perlmonks.org
+  open() or die $!;  `$userinput`     use.perl.org
+  use Modules;       /$userinput/     perl.apache.org
+                                      parrotcode.org
+  FUNCTION RETURN LISTS
+  stat      localtime    caller         SPECIAL VARIABLES
+   0 dev    0 second     0 package      $_    default variable
+   1 ino    1 minute     1 filename     $0    program name
+   2 mode   2 hour       2 line         $/    input separator
+   3 nlink  3 day        3 subroutine   $\    output separator
+   4 uid    4 month-1    4 hasargs      $|    autoflush
+   5 gid    5 year-1900  5 wantarray    $!    sys/libcall error
+   6 rdev   6 weekday    6 evaltext     $@    eval error
+   7 size   7 yearday    7 is_require   $$    process ID
+   8 atime  8 is_dst     8 hints        $.    line number
+   9 mtime               9 bitmask      @ARGV command line args
+  10 ctime  just use                    @INC  include paths
+  11 blksz  POSIX::      3..9 only      @_    subroutine args
+  12 blcks  strftime!    with EXPR      %ENV  environment
+
+=head1 ACKNOWLEDGEMENTS
+
+The first version of this document appeared on Perl Monks, where several
+people had useful suggestions. Thank you, Perl Monks.
+
+A special thanks to Damian Conway, who didn't only suggest important changes,
+but also took the time to count the number of listed features and make a
+Perl 6 version to show that Perl will stay Perl.
+
+=head1 AUTHOR
+
+Juerd Waalboer <juerd@cpan.org>, with the help of many Perl Monks.
+
+=head1 SEE ALSO
+
+ http://perlmonks.org/?node_id=216602      the original PM post
+ http://perlmonks.org/?node_id=238031      Damian Conway's Perl 6 version
+ http://juerd.nl/site.plp/perlcheat        home of the Perl Cheat Sheet
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlclib.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlclib.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlclib.pod	(revision 14489)
@@ -0,0 +1,209 @@
+=head1 NAME
+
+perlclib - Internal replacements for standard C library functions
+
+=head1 DESCRIPTION
+
+One thing Perl porters should note is that F<perl> doesn't tend to use that
+much of the C standard library internally; you'll see very little use of, 
+for example, the F<ctype.h> functions in there. This is because Perl
+tends to reimplement or abstract standard library functions, so that we
+know exactly how they're going to operate.
+
+This is a reference card for people who are familiar with the C library
+and who want to do things the Perl way; to tell them which functions
+they ought to use instead of the more normal C functions. 
+
+=head2 Conventions
+
+In the following tables:
+
+=over 3
+
+=item C<t>
+
+is a type.
+
+=item C<p>
+
+is a pointer.
+
+=item C<n>
+
+is a number.
+
+=item C<s>
+
+is a string.
+
+=back
+
+C<sv>, C<av>, C<hv>, etc. represent variables of their respective types.
+
+=head2 File Operations
+
+Instead of the F<stdio.h> functions, you should use the Perl abstraction
+layer. Instead of C<FILE*> types, you need to be handling C<PerlIO*>
+types.  Don't forget that with the new PerlIO layered I/O abstraction 
+C<FILE*> types may not even be available. See also the C<perlapio>
+documentation for more information about the following functions:
+
+    Instead Of:                 Use:
+
+    stdin                       PerlIO_stdin()
+    stdout                      PerlIO_stdout()
+    stderr                      PerlIO_stderr()
+
+    fopen(fn, mode)             PerlIO_open(fn, mode)
+    freopen(fn, mode, stream)   PerlIO_reopen(fn, mode, perlio) (Deprecated)
+    fflush(stream)              PerlIO_flush(perlio)
+    fclose(stream)              PerlIO_close(perlio)
+
+=head2 File Input and Output
+
+    Instead Of:                 Use:
+
+    fprintf(stream, fmt, ...)   PerlIO_printf(perlio, fmt, ...)
+
+    [f]getc(stream)             PerlIO_getc(perlio)
+    [f]putc(stream, n)          PerlIO_putc(perlio, n)
+    ungetc(n, stream)           PerlIO_ungetc(perlio, n)
+
+Note that the PerlIO equivalents of C<fread> and C<fwrite> are slightly
+different from their C library counterparts:
+
+    fread(p, size, n, stream)   PerlIO_read(perlio, buf, numbytes)
+    fwrite(p, size, n, stream)  PerlIO_write(perlio, buf, numbytes)
+
+    fputs(s, stream)            PerlIO_puts(perlio, s)
+
+There is no equivalent to C<fgets>; one should use C<sv_gets> instead:
+
+    fgets(s, n, stream)         sv_gets(sv, perlio, append)
+
+=head2 File Positioning
+
+    Instead Of:                 Use:
+
+    feof(stream)                PerlIO_eof(perlio)
+    fseek(stream, n, whence)    PerlIO_seek(perlio, n, whence)
+    rewind(stream)              PerlIO_rewind(perlio)
+
+    fgetpos(stream, p)          PerlIO_getpos(perlio, sv)
+    fsetpos(stream, p)          PerlIO_setpos(perlio, sv)
+
+    ferror(stream)              PerlIO_error(perlio)
+    clearerr(stream)            PerlIO_clearerr(perlio)
+
+=head2 Memory Management and String Handling
+
+    Instead Of:                 	Use:
+
+    t* p = malloc(n)            	Newx(id, p, n, t)
+    t* p = calloc(n, s)         	Newxz(id, p, n, t)
+    p = realloc(p, n)           	Renew(p, n, t)
+    memcpy(dst, src, n)         	Copy(src, dst, n, t)
+    memmove(dst, src, n)        	Move(src, dst, n, t)
+    memcpy/*(struct foo *)      	StructCopy(src, dst, t)
+    memset(dst, 0, n * sizeof(t))	Zero(dst, n, t)
+    memzero(dst, 0)			Zero(dst, n, char)
+    free(p)             	        Safefree(p)
+
+    strdup(p)                   savepv(p)
+    strndup(p, n)               savepvn(p, n) (Hey, strndup doesn't exist!)
+
+    strstr(big, little)         instr(big, little)
+    strcmp(s1, s2)              strLE(s1, s2) / strEQ(s1, s2) / strGT(s1,s2)
+    strncmp(s1, s2, n)          strnNE(s1, s2, n) / strnEQ(s1, s2, n)
+
+Notice the different order of arguments to C<Copy> and C<Move> than used
+in C<memcpy> and C<memmove>.
+
+Most of the time, though, you'll want to be dealing with SVs internally
+instead of raw C<char *> strings:
+
+    strlen(s)                   sv_len(sv)
+    strcpy(dt, src)             sv_setpv(sv, s)
+    strncpy(dt, src, n)         sv_setpvn(sv, s, n)
+    strcat(dt, src)             sv_catpv(sv, s)
+    strncat(dt, src)            sv_catpvn(sv, s)
+    sprintf(s, fmt, ...)        sv_setpvf(sv, fmt, ...)
+
+Note also the existence of C<sv_catpvf> and C<sv_vcatpvfn>, combining
+concatenation with formatting.
+
+Sometimes instead of zeroing the allocated heap by using Newxz() you
+should consider "poisoning" the data.  This means writing a bit
+pattern into it that should be illegal as pointers (and floating point
+numbers), and also hopefully surprising enough as integers, so that
+any code attempting to use the data without forethought will break
+sooner rather than later.  Poisoning can be done using the Poison()
+macro, which has similar arguments as Zero():
+
+    Poison(dst, n, t)
+
+=head2 Character Class Tests
+
+There are two types of character class tests that Perl implements: one
+type deals in C<char>s and are thus B<not> Unicode aware (and hence
+deprecated unless you B<know> you should use them) and the other type
+deal in C<UV>s and know about Unicode properties. In the following
+table, C<c> is a C<char>, and C<u> is a Unicode codepoint.
+
+    Instead Of:                 Use:            But better use:
+
+    isalnum(c)                  isALNUM(c)      isALNUM_uni(u)
+    isalpha(c)                  isALPHA(c)      isALPHA_uni(u)
+    iscntrl(c)                  isCNTRL(c)      isCNTRL_uni(u)
+    isdigit(c)                  isDIGIT(c)      isDIGIT_uni(u)
+    isgraph(c)                  isGRAPH(c)      isGRAPH_uni(u)
+    islower(c)                  isLOWER(c)      isLOWER_uni(u)
+    isprint(c)                  isPRINT(c)      isPRINT_uni(u)
+    ispunct(c)                  isPUNCT(c)      isPUNCT_uni(u)
+    isspace(c)                  isSPACE(c)      isSPACE_uni(u)
+    isupper(c)                  isUPPER(c)      isUPPER_uni(u)
+    isxdigit(c)                 isXDIGIT(c)     isXDIGIT_uni(u)
+
+    tolower(c)                  toLOWER(c)      toLOWER_uni(u)
+    toupper(c)                  toUPPER(c)      toUPPER_uni(u)
+
+=head2 F<stdlib.h> functions
+
+    Instead Of:                 Use: 
+
+    atof(s)                     Atof(s)
+    atol(s)                     Atol(s)
+    strtod(s, *p)               Nothing.  Just don't use it.
+    strtol(s, *p, n)            Strtol(s, *p, n)
+    strtoul(s, *p, n)           Strtoul(s, *p, n)
+
+Notice also the C<grok_bin>, C<grok_hex>, and C<grok_oct> functions in
+F<numeric.c> for converting strings representing numbers in the respective
+bases into C<NV>s.
+
+In theory C<Strtol> and C<Strtoul> may not be defined if the machine perl is
+built on doesn't actually have strtol and strtoul. But as those 2
+functions are part of the 1989 ANSI C spec we suspect you'll find them
+everywhere by now.
+
+    int rand()                  double Drand01()
+    srand(n)                    { seedDrand01((Rand_seed_t)n); 
+                                  PL_srand_called = TRUE; }
+
+    exit(n)                     my_exit(n)
+    system(s)                   Don't. Look at pp_system or use my_popen
+
+    getenv(s)                   PerlEnv_getenv(s)
+    setenv(s, val)              my_putenv(s, val)
+
+=head2 Miscellaneous functions
+
+You should not even B<want> to use F<setjmp.h> functions, but if you
+think you do, use the C<JMPENV> stack in F<scope.h> instead.
+
+For C<signal>/C<sigaction>, use C<rsignal(signo, handler)>.
+
+=head1 SEE ALSO
+
+C<perlapi>, C<perlapio>, C<perlguts>
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcn.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcn.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcn.pod	(revision 14489)
@@ -0,0 +1,148 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+The following documentation is written in EUC-CN encoding.
+
+Èç¹ûÄãÓÃÒ»°ãµÄÎÄ×Ö±àŒ­Æ÷ÔÄÀÀÕâ·ÝÎÄŒþ, ÇëºöÂÔÎÄÖÐÆæÌØµÄ×¢ŒÇ×Ö·û.
+Õâ·ÝÎÄŒþÊÇÒÔ POD (ŒòÃ÷ÎÄŒþžñÊœ) ÐŽ³É; ÕâÖÖžñÊœÊÇÎªÁËÄÜÈÃÈËÖ±œÓÔÄ¶Á,
+¶øÌØ±ðÉèŒÆµÄ. ¹ØÓÚŽËžñÊœµÄœøÒ»²œÐÅÏ¢, Çë²Î¿Œ perlpod ÏßÉÏÎÄŒþ.
+
+=head1 NAME
+
+perlcn - ŒòÌåÖÐÎÄ Perl ÖžÄÏ
+
+=head1 DESCRIPTION
+
+»¶Ó­ÀŽµœ Perl µÄÌìµØ!
+
+ŽÓ 5.8.0 °æ¿ªÊŒ, Perl Ÿß±žÁËÍêÉÆµÄ Unicode (Í³Ò»Âë) Ö§Ô®,
+Ò²Á¬ŽøÖ§Ô®ÁËÐí¶àÀ­¶¡ÓïÏµÒÔÍâµÄ±àÂë·œÊœ; CJK (ÖÐÈÕº«) ±ãÊÇÆäÖÐµÄÒ»²¿·Ý.
+Unicode ÊÇ¹úŒÊÐÔµÄ±ê×Œ, ÊÔÍŒº­žÇÊÀœçÉÏËùÓÐµÄ×Ö·û: Î÷·œÊÀœç, ¶«·œÊÀœç,
+ÒÔŒ°ÁœÕßŒäµÄÒ»ÇÐ (Ï£À°ÎÄ, ÐðÀûÑÇÎÄ, ÑÇÀ­²®ÎÄ, Ï£²®ÀŽÎÄ, Ó¡¶ÈÎÄ,
+Ó¡µØ°²ÎÄ, µÈµÈ). ËüÒ²ÈÝÄÉÁË¶àÖÖ×÷ÒµÏµÍ³ÓëÆœÌš (Èç PC Œ°ÂóœðËþ).
+
+Perl ±ŸÉíÒÔ Unicode œøÐÐ²Ù×÷. Õâ±íÊŸ Perl ÄÚ²¿µÄ×Ö·ûŽ®ÊýŸÝ¿ÉÓÃ Unicode
+±íÊŸ; Perl µÄº¯ÊœÓëËã·û (ÀýÈçÕý¹æ±íÊŸÊœ±È¶Ô) Ò²ÄÜ¶Ô Unicode œøÐÐ²Ù×÷.
+ÔÚÊäÈëŒ°Êä³öÊ±, ÎªÁËŽŠÀíÒÔ Unicode Ö®Ç°µÄ±àÂë·œÊœŽæ·ÅµÄÊýŸÝ, Perl
+Ìá¹©ÁË Encode ÕâžöÄ£¿é, ¿ÉÒÔÈÃÄãÇáÒ×µØ¶ÁÈ¡Œ°ÐŽÈëŸÉÓÐµÄ±àÂëÊýŸÝ.
+
+Encode ÑÓÉìÄ£¿éÖ§Ô®ÏÂÁÐŒòÌåÖÐÎÄµÄ±àÂë·œÊœ ('gb2312' ±íÊŸ 'euc-cn'):
+
+    euc-cn	Unix ÑÓÉì×Ö·ûŒ¯, Ò²ŸÍÊÇË×³ÆµÄ¹ú±êÂë
+    gb2312-raw	ÎŽŸ­ŽŠÀíµÄ (µÍ±ÈÌØ) GB2312 ×Ö·û±í
+    gb12345	ÎŽŸ­ŽŠÀíµÄÖÐ¹úÓÃ·±ÌåÖÐÎÄ±àÂë
+    iso-ir-165	GB2312 + GB6345 + GB8565 + ÐÂÔö×Ö·û
+    cp936	×ÖÂëÒ³ 936, Ò²¿ÉÒÔÓÃ 'GBK' (À©³ä¹ú±êÂë) ÖžÃ÷
+    hz		7 ±ÈÌØÒÝ³öÊœ GB2312 ±àÂë
+
+ŸÙÀýÀŽËµ, œ« EUC-CN ±àÂëµÄµµ°ž×ª³É Unicode, ìóÐèŒüÈëÏÂÁÐÖžÁî:
+
+    perl -Mencoding=euc-cn,STDOUT,utf8 -pe1 < file.euc-cn > file.utf8
+
+Perl Ò²ÄÚžœÁË "piconv", Ò»Ö§ÍêÈ«ÒÔ Perl ÐŽ³ÉµÄ×Ö·û×ª»»¹€Ÿß³ÌÐò, ÓÃ·šÈçÏÂ:
+
+    piconv -f euc-cn -t utf8 < file.euc-cn > file.utf8
+    piconv -f utf8 -t euc-cn < file.utf8 > file.euc-cn
+
+ÁíÍâ, ÀûÓÃ encoding Ä£¿é, Äã¿ÉÒÔÇáÒ×ÐŽ³öÒÔ×Ö·ûÎªµ¥Î»µÄ³ÌÐòÂë, ÈçÏÂËùÊŸ:
+
+    #!/usr/bin/env perl
+    # Æô¶¯ euc-cn ×ÖŽ®œâÎö; ±ê×ŒÊä³öÈëŒ°±ê×ŒŽíÎó¶ŒÉèÎª euc-cn ±àÂë
+    use encoding 'euc-cn', STDIN => 'euc-cn', STDOUT => 'euc-cn';
+    print length("ÂæÍÕ");	     #  2 (Ë«ÒýºÅ±íÊŸ×Ö·û)
+    print length('ÂæÍÕ');	     #  4 (µ¥ÒýºÅ±íÊŸ×ÖœÚ)
+    print index("×»×»œÌ»å", "»×»œ"); # -1 (²»°üº¬ŽË×Ó×Ö·ûŽ®)
+    print index('×»×»œÌ»å', '»×»œ'); #  1 (ŽÓµÚ¶þžö×ÖœÚ¿ªÊŒ)
+
+ÔÚ×îºóÒ»ÁÐÀý×ÓÀï, "×»" µÄµÚ¶þžö×ÖœÚÓë "×»" µÄµÚÒ»žö×ÖœÚœáºÏ³É EUC-CN
+ÂëµÄ "»×"; "×»" µÄµÚ¶þžö×ÖœÚÔòÓë "œÌ" µÄµÚÒ»žö×ÖœÚœáºÏ³É "»œ".
+ÕâœâŸöÁËÒÔÇ° EUC-CN Âë±È¶ÔŽŠÀíÉÏ³£ŒûµÄÎÊÌâ.
+
+=head2 ¶îÍâµÄÖÐÎÄ±àÂë
+
+Èç¹ûÐèÒªžü¶àµÄÖÐÎÄ±àÂë, ¿ÉÒÔŽÓ CPAN (L<http://www.cpan.org/>) ÏÂÔØ
+Encode::HanExtra Ä£¿é. ËüÄ¿Ç°Ìá¹©ÏÂÁÐ±àÂë·œÊœ:
+
+    gb18030	À©³ä¹ýµÄ¹ú±êÂë, °üº¬·±ÌåÖÐÎÄ
+
+ÁíÍâ, Encode::HanConvert Ä£¿éÔòÌá¹©ÁËŒò·±×ª»»ÓÃµÄÁœÖÖ±àÂë:
+
+    big5-simp	Big5 ·±ÌåÖÐÎÄÓë Unicode ŒòÌåÖÐÎÄ»¥×ª
+    gbk-trad	GBK ŒòÌåÖÐÎÄÓë Unicode ·±ÌåÖÐÎÄ»¥×ª
+
+ÈôÏëÔÚ GBK Óë Big5 Ö®Œä»¥×ª, Çë²Î¿ŒžÃÄ£¿éÄÚžœµÄ b2g.pl Óë g2b.pl ÁœÖ§³ÌÐò,
+»òÔÚ³ÌÐòÄÚÊ¹ÓÃÏÂÁÐÐŽ·š:
+
+    use Encode::HanConvert;
+    $euc_cn = big5_to_gb($big5); # ŽÓ Big5 ×ªÎª GBK
+    $big5 = gb_to_big5($euc_cn); # ŽÓ GBK ×ªÎª Big5
+
+=head2 œøÒ»²œµÄÐÅÏ¢
+
+Çë²Î¿Œ Perl ÄÚžœµÄŽóÁ¿ËµÃ÷ÎÄŒþ (²»ÐÒÈ«ÊÇÓÃÓ¢ÎÄÐŽµÄ), ÀŽÑ§Ï°žü¶à¹ØÓÚ
+Perl µÄÖªÊ¶, ÒÔŒ° Unicode µÄÊ¹ÓÃ·œÊœ. ²»¹ý, Íâ²¿µÄ×ÊÔŽÏàµ±·áž»:
+
+=head2 Ìá¹© Perl ×ÊÔŽµÄÍøÖ·
+
+=over 4
+
+=item L<http://www.perl.com/>
+
+Perl µÄÊ×Ò³ (ÓÉÅ·À³Àñ¹«ËŸÎ¬»€)
+
+=item L<http://www.cpan.org/>
+
+Perl ×ÛºÏµä²ØÍø (Comprehensive Perl Archive Network)
+
+=item L<http://lists.perl.org/>
+
+Perl ÓÊµÝÂÛÌ³Ò»ÀÀ
+
+=back
+
+=head2 Ñ§Ï° Perl µÄÍøÖ·
+
+=over 4
+
+=item L<http://www.oreilly.com.cn/html/perl.html>
+
+ŒòÌåÖÐÎÄ°æµÄÅ·À³Àñ Perl Êéœå
+
+=back
+
+=head2 Perl Ê¹ÓÃÕßŒ¯»á
+
+=over 4
+
+=item L<http://www.pm.org/groups/asia.shtml#China>
+
+ÖÐ¹ú Perl ÍÆ¹ã×éÒ»ÀÀ
+
+=back
+
+=head2 Unicode Ïà¹ØÍøÖ·
+
+=over 4
+
+=item L<http://www.unicode.org/>
+
+Unicode Ñ§ÊõÑ§»á (Unicode ±ê×ŒµÄÖÆ¶šÕß)
+
+=item L<http://www.cl.cam.ac.uk/%7Emgk25/unicode.html>
+
+Unix/Linux ÉÏµÄ UTF-8 Œ° Unicode Žð¿ÍÎÊ
+
+=back
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::CN>, L<encoding>, L<perluniintro>, L<perlunicode>
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi E<lt>jhi@iki.fiE<gt>
+
+Autrijus Tang (ÌÆ×Úºº) E<lt>autrijus@autrijus.orgE<gt>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcompile.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcompile.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcompile.pod	(revision 14489)
@@ -0,0 +1,451 @@
+=head1 NAME
+
+perlcompile - Introduction to the Perl Compiler-Translator 
+
+=head1 DESCRIPTION
+
+Perl has always had a compiler: your source is compiled into an
+internal form (a parse tree) which is then optimized before being
+run.  Since version 5.005, Perl has shipped with a module
+capable of inspecting the optimized parse tree (C<B>), and this has
+been used to write many useful utilities, including a module that lets
+you turn your Perl into C source code that can be compiled into a
+native executable.
+
+The C<B> module provides access to the parse tree, and other modules
+("back ends") do things with the tree.  Some write it out as
+bytecode, C source code, or a semi-human-readable text.  Another
+traverses the parse tree to build a cross-reference of which
+subroutines, formats, and variables are used where.  Another checks
+your code for dubious constructs.  Yet another back end dumps the
+parse tree back out as Perl source, acting as a source code beautifier
+or deobfuscator.
+
+Because its original purpose was to be a way to produce C code
+corresponding to a Perl program, and in turn a native executable, the
+C<B> module and its associated back ends are known as "the
+compiler", even though they don't really compile anything.
+Different parts of the compiler are more accurately a "translator",
+or an "inspector", but people want Perl to have a "compiler
+option" not an "inspector gadget".  What can you do?
+
+This document covers the use of the Perl compiler: which modules
+it comprises, how to use the most important of the back end modules,
+what problems there are, and how to work around them.
+
+=head2 Layout
+
+The compiler back ends are in the C<B::> hierarchy, and the front-end
+(the module that you, the user of the compiler, will sometimes
+interact with) is the O module.  Some back ends (e.g., C<B::C>) have
+programs (e.g., I<perlcc>) to hide the modules' complexity.
+
+Here are the important back ends to know about, with their status
+expressed as a number from 0 (outline for later implementation) to
+10 (if there's a bug in it, we're very surprised):
+
+=over 4
+
+=item B::Bytecode
+
+Stores the parse tree in a machine-independent format, suitable
+for later reloading through the ByteLoader module.  Status: 5 (some
+things work, some things don't, some things are untested).
+
+=item B::C
+
+Creates a C source file containing code to rebuild the parse tree
+and resume the interpreter.  Status: 6 (many things work adequately,
+including programs using Tk).
+
+=item B::CC
+
+Creates a C source file corresponding to the run time code path in
+the parse tree.  This is the closest to a Perl-to-C translator there
+is, but the code it generates is almost incomprehensible because it
+translates the parse tree into a giant switch structure that
+manipulates Perl structures.  Eventual goal is to reduce (given
+sufficient type information in the Perl program) some of the
+Perl data structure manipulations into manipulations of C-level
+ints, floats, etc.  Status: 5 (some things work, including
+uncomplicated Tk examples).
+
+=item B::Lint
+
+Complains if it finds dubious constructs in your source code.  Status:
+6 (it works adequately, but only has a very limited number of areas
+that it checks).
+
+=item B::Deparse
+
+Recreates the Perl source, making an attempt to format it coherently.
+Status: 8 (it works nicely, but a few obscure things are missing).
+
+=item B::Xref
+
+Reports on the declaration and use of subroutines and variables.
+Status: 8 (it works nicely, but still has a few lingering bugs).
+
+=back
+
+=head1 Using The Back Ends
+
+The following sections describe how to use the various compiler back
+ends.  They're presented roughly in order of maturity, so that the
+most stable and proven back ends are described first, and the most
+experimental and incomplete back ends are described last.
+
+The O module automatically enabled the B<-c> flag to Perl, which
+prevents Perl from executing your code once it has been compiled.
+This is why all the back ends print:
+
+  myperlprogram syntax OK
+
+before producing any other output.
+
+=head2 The Cross Referencing Back End
+
+The cross referencing back end (B::Xref) produces a report on your program,
+breaking down declarations and uses of subroutines and variables (and
+formats) by file and subroutine.  For instance, here's part of the
+report from the I<pod2man> program that comes with Perl:
+
+  Subroutine clear_noremap
+    Package (lexical)
+      $ready_to_print   i1069, 1079
+    Package main
+      $&                1086
+      $.                1086
+      $0                1086
+      $1                1087
+      $2                1085, 1085
+      $3                1085, 1085
+      $ARGV             1086
+      %HTML_Escapes     1085, 1085
+
+This shows the variables used in the subroutine C<clear_noremap>.  The
+variable C<$ready_to_print> is a my() (lexical) variable,
+B<i>ntroduced (first declared with my()) on line 1069, and used on
+line 1079.  The variable C<$&> from the main package is used on 1086,
+and so on.
+
+A line number may be prefixed by a single letter:
+
+=over 4
+
+=item i
+
+Lexical variable introduced (declared with my()) for the first time.
+
+=item &
+
+Subroutine or method call.
+
+=item s
+
+Subroutine defined.
+
+=item r
+
+Format defined.
+
+=back
+
+The most useful option the cross referencer has is to save the report
+to a separate file.  For instance, to save the report on
+I<myperlprogram> to the file I<report>:
+
+  $ perl -MO=Xref,-oreport myperlprogram
+
+=head2 The Decompiling Back End
+
+The Deparse back end turns your Perl source back into Perl source.  It
+can reformat along the way, making it useful as a de-obfuscator.  The
+most basic way to use it is:
+
+  $ perl -MO=Deparse myperlprogram
+
+You'll notice immediately that Perl has no idea of how to paragraph
+your code.  You'll have to separate chunks of code from each other
+with newlines by hand.  However, watch what it will do with
+one-liners:
+
+  $ perl -MO=Deparse -e '$op=shift||die "usage: $0
+  code [...]";chomp(@ARGV=<>)unless@ARGV; for(@ARGV){$was=$_;eval$op;
+  die$@ if$@; rename$was,$_ unless$was eq $_}'
+  -e syntax OK
+  $op = shift @ARGV || die("usage: $0 code [...]");
+  chomp(@ARGV = <ARGV>) unless @ARGV;
+  foreach $_ (@ARGV) {
+      $was = $_;
+      eval $op;
+      die $@ if $@;
+      rename $was, $_ unless $was eq $_;
+  }
+
+The decompiler has several options for the code it generates.  For
+instance, you can set the size of each indent from 4 (as above) to
+2 with:
+
+  $ perl -MO=Deparse,-si2 myperlprogram
+
+The B<-p> option adds parentheses where normally they are omitted:
+
+  $ perl -MO=Deparse -e 'print "Hello, world\n"'
+  -e syntax OK
+  print "Hello, world\n";
+  $ perl -MO=Deparse,-p -e 'print "Hello, world\n"'
+  -e syntax OK
+  print("Hello, world\n");
+
+See L<B::Deparse> for more information on the formatting options.
+
+=head2 The Lint Back End
+
+The lint back end (B::Lint) inspects programs for poor style.  One
+programmer's bad style is another programmer's useful tool, so options
+let you select what is complained about.
+
+To run the style checker across your source code:
+
+  $ perl -MO=Lint myperlprogram
+
+To disable context checks and undefined subroutines:
+
+  $ perl -MO=Lint,-context,-undefined-subs myperlprogram
+
+See L<B::Lint> for information on the options.
+
+=head2 The Simple C Back End
+
+This module saves the internal compiled state of your Perl program
+to a C source file, which can be turned into a native executable
+for that particular platform using a C compiler.  The resulting
+program links against the Perl interpreter library, so it
+will not save you disk space (unless you build Perl with a shared
+library) or program size.  It may, however, save you startup time.
+
+The C<perlcc> tool generates such executables by default.
+
+  perlcc myperlprogram.pl
+
+=head2 The Bytecode Back End
+
+This back end is only useful if you also have a way to load and
+execute the bytecode that it produces.  The ByteLoader module provides
+this functionality.
+
+To turn a Perl program into executable byte code, you can use C<perlcc>
+with the C<-B> switch:
+
+  perlcc -B myperlprogram.pl
+
+The byte code is machine independent, so once you have a compiled
+module or program, it is as portable as Perl source (assuming that
+the user of the module or program has a modern-enough Perl interpreter
+to decode the byte code).
+
+See B<B::Bytecode> for information on options to control the
+optimization and nature of the code generated by the Bytecode module.
+
+=head2 The Optimized C Back End
+
+The optimized C back end will turn your Perl program's run time
+code-path into an equivalent (but optimized) C program that manipulates
+the Perl data structures directly.  The program will still link against
+the Perl interpreter library, to allow for eval(), C<s///e>,
+C<require>, etc.
+
+The C<perlcc> tool generates such executables when using the -O
+switch.  To compile a Perl program (ending in C<.pl>
+or C<.p>):
+
+  perlcc -O myperlprogram.pl
+
+To produce a shared library from a Perl module (ending in C<.pm>):
+
+  perlcc -O Myperlmodule.pm
+
+For more information, see L<perlcc> and L<B::CC>.
+
+=head1 Module List for the Compiler Suite
+
+=over 4
+
+=item B
+
+This module is the introspective ("reflective" in Java terms)
+module, which allows a Perl program to inspect its innards.  The
+back end modules all use this module to gain access to the compiled
+parse tree.  You, the user of a back end module, will not need to
+interact with B.
+
+=item O
+
+This module is the front-end to the compiler's back ends.  Normally
+called something like this:
+
+  $ perl -MO=Deparse myperlprogram
+
+This is like saying C<use O 'Deparse'> in your Perl program.
+
+=item B::Asmdata
+
+This module is used by the B::Assembler module, which is in turn used
+by the B::Bytecode module, which stores a parse-tree as
+bytecode for later loading.  It's not a back end itself, but rather a
+component of a back end.
+
+=item B::Assembler
+
+This module turns a parse-tree into data suitable for storing
+and later decoding back into a parse-tree.  It's not a back end
+itself, but rather a component of a back end.  It's used by the
+I<assemble> program that produces bytecode.
+
+=item B::Bblock
+
+This module is used by the B::CC back end.  It walks "basic blocks".
+A basic block is a series of operations which is known to execute from
+start to finish, with no possibility of branching or halting.
+
+=item B::Bytecode
+
+This module is a back end that generates bytecode from a
+program's parse tree.  This bytecode is written to a file, from where
+it can later be reconstructed back into a parse tree.  The goal is to
+do the expensive program compilation once, save the interpreter's
+state into a file, and then restore the state from the file when the
+program is to be executed.  See L</"The Bytecode Back End">
+for details about usage.
+
+=item B::C
+
+This module writes out C code corresponding to the parse tree and
+other interpreter internal structures.  You compile the corresponding
+C file, and get an executable file that will restore the internal
+structures and the Perl interpreter will begin running the
+program.  See L</"The Simple C Back End"> for details about usage.
+
+=item B::CC
+
+This module writes out C code corresponding to your program's
+operations.  Unlike the B::C module, which merely stores the
+interpreter and its state in a C program, the B::CC module makes a
+C program that does not involve the interpreter.  As a consequence,
+programs translated into C by B::CC can execute faster than normal
+interpreted programs.  See L</"The Optimized C Back End"> for
+details about usage.
+
+=item B::Concise
+
+This module prints a concise (but complete) version of the Perl parse
+tree.  Its output is more customizable than the one of B::Terse or
+B::Debug (and it can emulate them). This module useful for people who
+are writing their own back end, or who are learning about the Perl
+internals.  It's not useful to the average programmer.
+
+=item B::Debug
+
+This module dumps the Perl parse tree in verbose detail to STDOUT.
+It's useful for people who are writing their own back end, or who
+are learning about the Perl internals.  It's not useful to the
+average programmer.
+
+=item B::Deparse
+
+This module produces Perl source code from the compiled parse tree.
+It is useful in debugging and deconstructing other people's code,
+also as a pretty-printer for your own source.  See
+L</"The Decompiling Back End"> for details about usage.
+
+=item B::Disassembler
+
+This module turns bytecode back into a parse tree.  It's not a back
+end itself, but rather a component of a back end.  It's used by the
+I<disassemble> program that comes with the bytecode.
+
+=item B::Lint
+
+This module inspects the compiled form of your source code for things
+which, while some people frown on them, aren't necessarily bad enough
+to justify a warning.  For instance, use of an array in scalar context
+without explicitly saying C<scalar(@array)> is something that Lint
+can identify.  See L</"The Lint Back End"> for details about usage.
+
+=item B::Showlex
+
+This module prints out the my() variables used in a function or a
+file.  To get a list of the my() variables used in the subroutine
+mysub() defined in the file myperlprogram:
+
+  $ perl -MO=Showlex,mysub myperlprogram
+
+To get a list of the my() variables used in the file myperlprogram:
+
+  $ perl -MO=Showlex myperlprogram
+
+[BROKEN]
+
+=item B::Stackobj
+
+This module is used by the B::CC module.  It's not a back end itself,
+but rather a component of a back end.
+
+=item B::Stash
+
+This module is used by the L<perlcc> program, which compiles a module
+into an executable.  B::Stash prints the symbol tables in use by a
+program, and is used to prevent B::CC from producing C code for the
+B::* and O modules.  It's not a back end itself, but rather a
+component of a back end.
+
+=item B::Terse
+
+This module prints the contents of the parse tree, but without as much
+information as B::Debug.  For comparison, C<print "Hello, world.">
+produced 96 lines of output from B::Debug, but only 6 from B::Terse.
+
+This module is useful for people who are writing their own back end,
+or who are learning about the Perl internals.  It's not useful to the
+average programmer.
+
+=item B::Xref
+
+This module prints a report on where the variables, subroutines, and
+formats are defined and used within a program and the modules it
+loads.  See L</"The Cross Referencing Back End"> for details about
+usage.
+
+=back
+
+=head1 KNOWN PROBLEMS
+
+The simple C backend currently only saves typeglobs with alphanumeric
+names.
+
+The optimized C backend outputs code for more modules than it should
+(e.g., DirHandle).  It also has little hope of properly handling
+C<goto LABEL> outside the running subroutine (C<goto &sub> is okay).
+C<goto LABEL> currently does not work at all in this backend.
+It also creates a huge initialization function that gives
+C compilers headaches.  Splitting the initialization function gives
+better results.  Other problems include: unsigned math does not
+work correctly; some opcodes are handled incorrectly by default
+opcode handling mechanism.
+
+BEGIN{} blocks are executed while compiling your code.  Any external
+state that is initialized in BEGIN{}, such as opening files, initiating
+database connections etc., do not behave properly.  To work around
+this, Perl has an INIT{} block that corresponds to code being executed
+before your program begins running but after your program has finished
+being compiled.  Execution order: BEGIN{}, (possible save of state
+through compiler back-end), INIT{}, program runs, END{}.
+
+=head1 AUTHOR
+
+This document was originally written by Nathan Torkington, and is now
+maintained by the perl5-porters mailing list
+I<perl5-porters@perl.org>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcygwin.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcygwin.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlcygwin.pod	(revision 14489)
@@ -0,0 +1,617 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.cygwin - Perl for Cygwin
+
+=head1 SYNOPSIS
+
+This document will help you configure, make, test and install Perl
+on Cygwin.  This document also describes features of Cygwin that will
+affect how Perl behaves at runtime.
+
+B<NOTE:> There are pre-built Perl packages available for Cygwin and a
+version of Perl is provided in the normal Cygwin install.  If you do
+not need to customize the configuration, consider using one of those
+packages.
+
+
+=head1 PREREQUISITES FOR COMPILING PERL ON CYGWIN
+
+=head2 Cygwin = GNU+Cygnus+Windows (Don't leave UNIX without it)
+
+The Cygwin tools are ports of the popular GNU development tools for Win32
+platforms.  They run thanks to the Cygwin library which provides the UNIX
+system calls and environment these programs expect.  More information
+about this project can be found at:
+
+  http://www.cygwin.com/
+
+A recent net or commercial release of Cygwin is required.
+
+At the time this document was last updated, Cygwin 1.5.2 was current.
+
+
+=head2 Cygwin Configuration
+
+While building Perl some changes may be necessary to your Cygwin setup so
+that Perl builds cleanly.  These changes are B<not> required for normal
+Perl usage.
+
+B<NOTE:> The binaries that are built will run on all Win32 versions.
+They do not depend on your host system (Win9x/WinME, WinNT/Win2K)
+or your Cygwin configuration (I<ntea>, I<ntsec>, binary/text mounts).
+The only dependencies come from hard-coded pathnames like C</usr/local>.
+However, your host system and Cygwin configuration will affect Perl's
+runtime behavior (see L</"TEST">).
+
+=over 4
+
+=item * C<PATH>
+
+Set the C<PATH> environment variable so that Configure finds the Cygwin
+versions of programs.  Any Windows directories should be removed or
+moved to the end of your C<PATH>.
+
+=item * I<nroff>
+
+If you do not have I<nroff> (which is part of the I<groff> package),
+Configure will B<not> prompt you to install I<man> pages.
+
+=item * Permissions
+
+On WinNT with either the I<ntea> or I<ntsec> C<CYGWIN> settings, directory
+and file permissions may not be set correctly.  Since the build process
+creates directories and files, to be safe you may want to run a
+C<chmod -R +w *> on the entire Perl source tree.
+
+Also, it is a well known WinNT "feature" that files created by a login
+that is a member of the I<Administrators> group will be owned by the
+I<Administrators> group.  Depending on your umask, you may find that you
+can not write to files that you just created (because you are no longer
+the owner).  When using the I<ntsec> C<CYGWIN> setting, this is not an
+issue because it "corrects" the ownership to what you would expect on
+a UNIX system.
+
+=back
+
+=head1 CONFIGURE PERL ON CYGWIN
+
+The default options gathered by Configure with the assistance of
+F<hints/cygwin.sh> will build a Perl that supports dynamic loading
+(which requires a shared F<libperl.dll>).
+
+This will run Configure and keep a record:
+
+  ./Configure 2>&1 | tee log.configure
+
+If you are willing to accept all the defaults run Configure with B<-de>.
+However, several useful customizations are available.
+
+=head2 Stripping Perl Binaries on Cygwin
+
+It is possible to strip the EXEs and DLLs created by the build process.
+The resulting binaries will be significantly smaller.  If you want the
+binaries to be stripped, you can either add a B<-s> option when Configure
+prompts you,
+
+  Any additional ld flags (NOT including libraries)? [none] -s
+  Any special flags to pass to gcc to use dynamic linking? [none] -s
+  Any special flags to pass to ld2 to create a dynamically loaded library?
+  [none] -s
+
+or you can edit F<hints/cygwin.sh> and uncomment the relevant variables
+near the end of the file.
+
+=head2 Optional Libraries for Perl on Cygwin
+
+Several Perl functions and modules depend on the existence of
+some optional libraries.  Configure will find them if they are
+installed in one of the directories listed as being used for library
+searches.  Pre-built packages for most of these are available from
+the Cygwin installer.
+
+=over 4
+
+=item * C<-lcrypt>
+
+The crypt package distributed with Cygwin is a Linux compatible 56-bit
+DES crypt port by Corinna Vinschen.
+
+Alternatively, the crypt libraries in GNU libc have been ported to Cygwin.
+
+The DES based Ultra Fast Crypt port was done by Alexey Truhan:
+
+  ftp://ftp.uni-erlangen.de/pub/pc/gnuwin32/cygwin/porters/Okhapkin_Sergey/cw32crypt-dist-0.tgz
+
+NOTE: There are various export restrictions on DES implementations,
+see the glibc README for more details.
+
+The MD5 port was done by Andy Piper:
+
+  ftp://ftp.uni-erlangen.de/pub/pc/gnuwin32/cygwin/porters/Okhapkin_Sergey/libcrypt.tgz
+
+=item * C<-lgdbm> (C<use GDBM_File>)
+
+GDBM is available for Cygwin.
+
+NOTE: The GDBM library only works on NTFS partitions.
+
+=item * C<-ldb> (C<use DB_File>)
+
+BerkeleyDB is available for Cygwin.
+
+NOTE: The BerkeleyDB library only completely works on NTFS partitions.
+
+=item * C<-lcygipc> (C<use IPC::SysV>)
+
+A port of SysV IPC is available for Cygwin.
+
+NOTE: This has B<not> been extensively tested.  In particular,
+C<d_semctl_semun> is undefined because it fails a Configure test
+and on Win9x the I<shm*()> functions seem to hang.  It also creates
+a compile time dependency because F<perl.h> includes F<<sys/ipc.h>>
+and F<<sys/sem.h>> (which will be required in the future when compiling
+CPAN modules). CURRENTLY NOT SUPPORTED!
+
+=item * C<-lutil>
+
+Included with the standard Cygwin netrelease is the inetutils package 
+which includes libutil.a.
+
+=back
+
+=head2 Configure-time Options for Perl on Cygwin
+
+The F<INSTALL> document describes several Configure-time options.  Some of
+these will work with Cygwin, others are not yet possible.  Also, some of
+these are experimental.  You can either select an option when Configure
+prompts you or you can define (undefine) symbols on the command line.
+
+=over 4
+
+=item * C<-Uusedl>
+
+Undefining this symbol forces Perl to be compiled statically.
+
+=item * C<-Uusemymalloc>
+
+By default Perl uses the C<malloc()> included with the Perl source.  If you
+want to force Perl to build with the system C<malloc()> undefine this symbol.
+
+=item * C<-Uuseperlio>
+
+Undefining this symbol disables the PerlIO abstraction.  PerlIO is now the
+default; it is not recommended to disable PerlIO.
+
+=item * C<-Dusemultiplicity>
+
+Multiplicity is required when embedding Perl in a C program and using
+more than one interpreter instance.  This works with the Cygwin port.
+
+=item * C<-Duse64bitint>
+
+By default Perl uses 32 bit integers.  If you want to use larger 64
+bit integers, define this symbol.
+
+=item * C<-Duselongdouble>
+
+I<gcc> supports long doubles (12 bytes).  However, several additional
+long double math functions are necessary to use them within Perl
+(I<{atan2, cos, exp, floor, fmod, frexp, isnan, log, modf, pow, sin, sqrt}l, 
+strtold>).
+These are B<not> yet available with Cygwin.
+
+=item * C<-Dusethreads>
+
+POSIX threads are implemented in Cygwin, define this symbol if you want
+a threaded perl.
+
+=item * C<-Duselargefiles>
+
+Cygwin uses 64-bit integers for internal size and position calculations, 
+this will be correctly detected and defined by Configure.
+
+=item * C<-Dmksymlinks>
+
+Use this to build perl outside of the source tree.  This works with Cygwin.
+Details can be found in the F<INSTALL> document.  This is the recommended 
+way to build perl from sources.
+
+=back
+
+=head2 Suspicious Warnings on Cygwin
+
+You may see some messages during Configure that seem suspicious.
+
+=over 4
+
+=item * I<dlsym()>
+
+I<ld2> is needed to build dynamic libraries, but it does not exist
+when C<dlsym()> checking occurs (it is not created until C<make> runs).
+You will see the following message:
+
+  Checking whether your C<dlsym()> needs a leading underscore ...
+  ld2: not found
+  I can't compile and run the test program.
+  I'm guessing that dlsym doesn't need a leading underscore.
+
+Since the guess is correct, this is not a problem.
+
+=item * Win9x and C<d_eofnblk>
+
+Win9x does not correctly report C<EOF> with a non-blocking read on a
+closed pipe.  You will see the following messages:
+
+  But it also returns -1 to signal EOF, so be careful!
+  WARNING: you can't distinguish between EOF and no data!
+
+  *** WHOA THERE!!! ***
+      The recommended value for $d_eofnblk on this machine was "define"!
+      Keep the recommended value? [y]
+
+At least for consistency with WinNT, you should keep the recommended
+value.
+
+=item * Compiler/Preprocessor defines
+
+The following error occurs because of the Cygwin C<#define> of
+C<_LONG_DOUBLE>:
+
+  Guessing which symbols your C compiler and preprocessor define...
+  try.c:<line#>: missing binary operator
+
+This failure does not seem to cause any problems.  With older gcc
+versions, "parse error" is reported instead of "missing binary
+operator".
+
+=back
+
+=head1 MAKE ON CYGWIN
+
+Simply run I<make> and wait:
+
+  make 2>&1 | tee log.make
+
+=head2 Errors on Cygwin
+
+Errors like these are normal:
+
+  ...
+  make: [extra.pods] Error 1 (ignored)
+  ...
+  make: [extras.make] Error 1 (ignored)
+
+=head2 ld2 on Cygwin
+
+During C<make>, I<ld2> will be created and installed in your $installbin
+directory (where you said to put public executables).  It does not
+wait until the C<make install> process to install the I<ld2> script,
+this is because the remainder of the C<make> refers to I<ld2> without
+fully specifying its path and does this from multiple subdirectories.
+The assumption is that $installbin is in your current C<PATH>.  If this
+is not the case C<make> will fail at some point.  If this happens,
+just manually copy I<ld2> from the source directory to somewhere in
+your C<PATH>.
+
+=head1 TEST ON CYGWIN
+
+There are two steps to running the test suite:
+
+  make test 2>&1 | tee log.make-test
+
+  cd t;./perl harness 2>&1 | tee ../log.harness
+
+The same tests are run both times, but more information is provided when
+running as C<./perl harness>.
+
+Test results vary depending on your host system and your Cygwin
+configuration.  If a test can pass in some Cygwin setup, it is always
+attempted and explainable test failures are documented.  It is possible
+for Perl to pass all the tests, but it is more likely that some tests
+will fail for one of the reasons listed below.
+
+=head2 File Permissions on Cygwin
+
+UNIX file permissions are based on sets of mode bits for
+{read,write,execute} for each {user,group,other}.  By default Cygwin
+only tracks the Win32 read-only attribute represented as the UNIX file
+user write bit (files are always readable, files are executable if they
+have a F<.{com,bat,exe}> extension or begin with C<#!>, directories are
+always readable and executable).  On WinNT with the I<ntea> C<CYGWIN>
+setting, the additional mode bits are stored as extended file attributes.
+On WinNT with the I<ntsec> C<CYGWIN> setting, permissions use the standard
+WinNT security descriptors and access control lists.  Without one of
+these options, these tests will fail (listing not updated yet):
+
+  Failed Test           List of failed
+  ------------------------------------
+  io/fs.t               5, 7, 9-10
+  lib/anydbm.t          2
+  lib/db-btree.t        20
+  lib/db-hash.t         16
+  lib/db-recno.t        18
+  lib/gdbm.t            2
+  lib/ndbm.t            2
+  lib/odbm.t            2
+  lib/sdbm.t            2
+  op/stat.t             9, 20 (.tmp not an executable extension)
+
+=head2 NDBM_File and ODBM_File do not work on FAT filesystems
+
+Do not use NDBM_File or ODBM_File on FAT filesystem.  They can be
+built on a FAT filesystem, but many tests will fail:
+
+ ../ext/NDBM_File/ndbm.t       13  3328    71   59  83.10%  1-2 4 16-71
+ ../ext/ODBM_File/odbm.t      255 65280    ??   ??       %  ??
+ ../lib/AnyDBM_File.t           2   512    12    2  16.67%  1 4
+ ../lib/Memoize/t/errors.t      0   139    11    5  45.45%  7-11
+ ../lib/Memoize/t/tie_ndbm.t   13  3328     4    4 100.00%  1-4
+ run/fresh_perl.t                          97    1   1.03%  91
+
+If you intend to run only on FAT (or if using AnyDBM_File on FAT),
+run Configure with the -Ui_ndbm and -Ui_dbm options to prevent
+NDBM_File and ODBM_File being built.
+
+With NTFS (and CYGWIN=ntsec), there should be no problems even if
+perl was built on FAT.
+
+=head2 C<fork()> failures in io_* tests
+
+A C<fork()> failure may result in the following tests failing:
+
+  ext/IO/lib/IO/t/io_multihomed.t
+  ext/IO/lib/IO/t/io_sock.t
+  ext/IO/lib/IO/t/io_unix.t
+
+See comment on fork in L<Miscellaneous> below.
+
+=head1 Specific features of the Cygwin port
+
+=head2 Script Portability on Cygwin
+
+Cygwin does an outstanding job of providing UNIX-like semantics on top of
+Win32 systems.  However, in addition to the items noted above, there are
+some differences that you should know about.  This is a very brief guide
+to portability, more information can be found in the Cygwin documentation.
+
+=over 4
+
+=item * Pathnames
+
+Cygwin pathnames can be separated by forward (F</>) or backward (F<\\>)
+slashes.  They may also begin with drive letters (F<C:>) or Universal
+Naming Codes (F<//UNC>).  DOS device names (F<aux>, F<con>, F<prn>,
+F<com*>, F<lpt?>, F<nul>) are invalid as base filenames.  However, they
+can be used in extensions (e.g., F<hello.aux>).  Names may contain all
+printable characters except these:
+
+  : * ? " < > |
+
+File names are case insensitive, but case preserving.  A pathname that
+contains a backslash or drive letter is a Win32 pathname (and not subject
+to the translations applied to POSIX style pathnames).
+
+=item * Text/Binary
+
+When a file is opened it is in either text or binary mode.  In text mode
+a file is subject to CR/LF/Ctrl-Z translations.  With Cygwin, the default
+mode for an C<open()> is determined by the mode of the mount that underlies
+the file.  Perl provides a C<binmode()> function to set binary mode on files
+that otherwise would be treated as text.  C<sysopen()> with the C<O_TEXT>
+flag sets text mode on files that otherwise would be treated as binary:
+
+    sysopen(FOO, "bar", O_WRONLY|O_CREAT|O_TEXT)
+
+C<lseek()>, C<tell()> and C<sysseek()> only work with files opened in binary
+mode.
+
+The text/binary issue is covered at length in the Cygwin documentation.
+
+=item * PerlIO
+
+PerlIO overrides the default Cygwin Text/Binary behaviour.  A file will 
+always treated as binary, regardless which mode of the mount it lives on,
+just like it is in UNIX.  So CR/LF translation needs to be requested in 
+either the C<open()> call like this:
+
+  open(FH, ">:crlf", "out.txt");
+
+which will do conversion from LF to CR/LF on the output, or in the 
+environment settings (add this to your .bashrc):
+
+  export PERLIO=crlf
+
+which will pull in the crlf PerlIO layer which does LF -> CRLF conversion 
+on every output generated by perl.
+
+=item * F<.exe>
+
+The Cygwin C<stat()>, C<lstat()> and C<readlink()> functions make the F<.exe>
+extension transparent by looking for F<foo.exe> when you ask for F<foo>
+(unless a F<foo> also exists).  Cygwin does not require a F<.exe>
+extension, but I<gcc> adds it automatically when building a program.
+However, when accessing an executable as a normal file (e.g., I<cp>
+in a makefile) the F<.exe> is not transparent.  The I<install> included
+with Cygwin automatically appends a F<.exe> when necessary.
+
+=item * cygwin vs. windows process ids
+
+Cygwin processes have their own pid, which is different from the
+underlying windows pid.  Most posix compliant Proc functions expect
+the cygwin pid, but several Win32::Process functions expect the
+winpid. E.g. C<$$> is the cygwin pid of F</usr/bin/perl>, which is not
+the winpid.  Use C<Cygwin::winpid_to_pid()> and C<Cygwin::winpid_to_pid()> 
+to translate between them.
+
+=item * C<chown()>
+
+On WinNT C<chown()> can change a file's user and group IDs.  On Win9x C<chown()>
+is a no-op, although this is appropriate since there is no security model.
+
+=item * Miscellaneous
+
+File locking using the C<F_GETLK> command to C<fcntl()> is a stub that
+returns C<ENOSYS>.
+
+Win9x can not C<rename()> an open file (although WinNT can).
+
+The Cygwin C<chroot()> implementation has holes (it can not restrict file
+access by native Win32 programs).
+
+Inplace editing C<perl -i> of files doesn't work without doing a backup 
+of the file being edited C<perl -i.bak> because of windowish restrictions,
+therefore Perl adds the suffix C<.bak> automatically if you use C<perl -i> 
+without specifying a backup extension.
+
+Using C<fork()> after loading multiple dlls may fail with an internal cygwin
+error like the following:
+
+  C:\CYGWIN\BIN\PERL.EXE: *** couldn't allocate memory 0x10000(4128768) for 'C:\CYGWIN\LIB\PERL5\5.6.1\CYGWIN-MULTI\AUTO\SOCKET\SOCKET.DLL' alignment, Win32 error 8
+
+    200 [main] perl 377147 sync_with_child: child -395691(0xB8) died before initialization with status code 0x1
+   1370 [main] perl 377147 sync_with_child: *** child state child loading dlls
+
+Use the rebase utility to resolve the conflicting dll addresses.  The
+rebase package is included in the Cygwin netrelease.  Use setup.exe from
+F<http://www.cygwin.com/setup.exe> to install it and run rebaseall.
+
+=back
+
+=head2 Prebuilt methods:
+
+=over 4
+
+=item C<Cwd::cwd>
+
+Returns current working directory.
+
+=item C<Cygwin::pid_to_winpid>
+
+Translates a cygwin pid to the corresponding Windows pid (which may or
+may not be the same).
+
+=item C<Cygwin::winpid_to_pid>
+
+Translates a Windows pid to the corresponding cygwin pid (if any).
+
+=back
+
+=head1 INSTALL PERL ON CYGWIN
+
+This will install Perl, including I<man> pages.
+
+  make install 2>&1 | tee log.make-install
+
+NOTE: If C<STDERR> is redirected C<make install> will B<not> prompt
+you to install I<perl> into F</usr/bin>.
+
+You may need to be I<Administrator> to run C<make install>.  If you
+are not, you must have write access to the directories in question.
+
+Information on installing the Perl documentation in HTML format can be
+found in the F<INSTALL> document.
+
+=head1 MANIFEST ON CYGWIN
+
+These are the files in the Perl release that contain references to Cygwin.
+These very brief notes attempt to explain the reason for all conditional
+code.  Hopefully, keeping this up to date will allow the Cygwin port to
+be kept as clean as possible (listing not updated yet).
+
+=over 4
+
+=item Documentation
+
+  INSTALL README.cygwin README.win32 MANIFEST
+  Changes Changes5.005 Changes5.004 Changes5.6
+  pod/perl.pod pod/perlport.pod pod/perlfaq3.pod
+  pod/perldelta.pod pod/perl5004delta.pod pod/perl56delta.pod
+  pod/perlhist.pod pod/perlmodlib.pod perl/buildtoc pod/perltoc.pod
+
+=item Build, Configure, Make, Install
+
+  cygwin/Makefile.SHs
+  cygwin/ld2.in
+  cygwin/perlld.in
+  ext/IPC/SysV/hints/cygwin.pl
+  ext/NDBM_File/hints/cygwin.pl
+  ext/ODBM_File/hints/cygwin.pl
+  hints/cygwin.sh
+  Configure             - help finding hints from uname,
+                          shared libperl required for dynamic loading
+  Makefile.SH           - linklibperl
+  Porting/patchls       - cygwin in port list
+  installman            - man pages with :: translated to .
+  installperl           - install dll/ld2/perlld, install to pods
+  makedepend.SH         - uwinfix
+
+=item Tests
+
+  t/io/tell.t           - binmode
+  t/lib/b.t             - ignore Cwd from os_extras
+  t/lib/glob-basic.t    - Win32 directory list access differs from read mode
+  t/op/magic.t          - $^X/symlink WORKAROUND, s/.exe//
+  t/op/stat.t           - no /dev, skip Win32 ftCreationTime quirk
+                          (cache manager sometimes preserves ctime of file
+                          previously created and deleted), no -u (setuid)
+  t/lib/cygwin.t	- builtin cygwin function tests
+
+=item Compiled Perl Source
+
+  EXTERN.h              - __declspec(dllimport)
+  XSUB.h                - __declspec(dllexport)
+  cygwin/cygwin.c       - os_extras (getcwd, spawn, Cygwin::winpid_to_pid, 
+                          Cygwin::pid_to_winpid)
+  perl.c                - os_extras
+  perl.h                - binmode
+  doio.c                - win9x can not rename a file when it is open
+  pp_sys.c              - do not define h_errno, pp_system with spawn
+  util.c                - use setenv
+
+=item Compiled Module Source
+
+  ext/POSIX/POSIX.xs    - tzname defined externally
+  ext/SDBM_File/sdbm/pair.c
+                        - EXTCONST needs to be redefined from EXTERN.h
+  ext/SDBM_File/sdbm/sdbm.c
+                        - binary open
+
+=item Perl Modules/Scripts
+
+  lib/Cwd.pm            - hook to internal Cwd::cwd
+  lib/ExtUtils/MakeMaker.pm
+                        - require MM_Cygwin.pm
+  lib/ExtUtils/MM_Cygwin.pm
+                        - canonpath, cflags, manifypods, perl_archive
+  lib/File/Find.pm      - on remote drives stat() always sets st_nlink to 1
+  lib/File/Spec/Unix.pm - preserve //unc
+  lib/File/Temp.pm      - no directory sticky bit
+  lib/perl5db.pl        - use stdin not /dev/tty
+  utils/perldoc.PL      - version comment
+
+=back
+
+=head1 BUGS ON CYGWIN
+
+Support for swapping real and effective user and group IDs is incomplete.
+On WinNT Cygwin provides C<setuid()>, C<seteuid()>, C<setgid()> and C<setegid()>.
+However, additional Cygwin calls for manipulating WinNT access tokens
+and security contexts are required.
+
+=head1 AUTHORS
+
+Charles Wilson <cwilson@ece.gatech.edu>,
+Eric Fifer <egf7@columbia.edu>,
+alexander smishlajev <als@turnhere.com>,
+Steven Morlock <newspost@morlock.net>,
+Sebastien Barre <Sebastien.Barre@utc.fr>,
+Teun Burgers <burgers@ecn.nl>,
+Gerrit P. Haase <gp@familiehaase.de>.
+
+=head1 HISTORY
+
+Last updated: 2005-02-11
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldata.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldata.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldata.pod	(revision 14489)
@@ -0,0 +1,861 @@
+=head1 NAME
+
+perldata - Perl data types
+
+=head1 DESCRIPTION
+
+=head2 Variable names
+X<variable, name> X<variable name> X<data type> X<type>
+
+Perl has three built-in data types: scalars, arrays of scalars, and
+associative arrays of scalars, known as "hashes".  A scalar is a 
+single string (of any size, limited only by the available memory),
+number, or a reference to something (which will be discussed
+in L<perlref>).  Normal arrays are ordered lists of scalars indexed
+by number, starting with 0.  Hashes are unordered collections of scalar 
+values indexed by their associated string key.
+
+Values are usually referred to by name, or through a named reference.
+The first character of the name tells you to what sort of data
+structure it refers.  The rest of the name tells you the particular
+value to which it refers.  Usually this name is a single I<identifier>,
+that is, a string beginning with a letter or underscore, and
+containing letters, underscores, and digits.  In some cases, it may
+be a chain of identifiers, separated by C<::> (or by the slightly
+archaic C<'>); all but the last are interpreted as names of packages,
+to locate the namespace in which to look up the final identifier
+(see L<perlmod/Packages> for details).  It's possible to substitute
+for a simple identifier, an expression that produces a reference
+to the value at runtime.   This is described in more detail below
+and in L<perlref>.
+X<identifier>
+
+Perl also has its own built-in variables whose names don't follow
+these rules.  They have strange names so they don't accidentally
+collide with one of your normal variables.  Strings that match
+parenthesized parts of a regular expression are saved under names
+containing only digits after the C<$> (see L<perlop> and L<perlre>).
+In addition, several special variables that provide windows into
+the inner working of Perl have names containing punctuation characters
+and control characters.  These are documented in L<perlvar>.
+X<variable, built-in>
+
+Scalar values are always named with '$', even when referring to a
+scalar that is part of an array or a hash.  The '$' symbol works
+semantically like the English word "the" in that it indicates a
+single value is expected.
+X<scalar>
+
+    $days		# the simple scalar value "days"
+    $days[28]		# the 29th element of array @days
+    $days{'Feb'}	# the 'Feb' value from hash %days
+    $#days		# the last index of array @days
+
+Entire arrays (and slices of arrays and hashes) are denoted by '@',
+which works much like the word "these" or "those" does in English,
+in that it indicates multiple values are expected.
+X<array>
+
+    @days		# ($days[0], $days[1],... $days[n])
+    @days[3,4,5]	# same as ($days[3],$days[4],$days[5])
+    @days{'a','c'}	# same as ($days{'a'},$days{'c'})
+
+Entire hashes are denoted by '%':
+X<hash>
+
+    %days		# (key1, val1, key2, val2 ...)
+
+In addition, subroutines are named with an initial '&', though this
+is optional when unambiguous, just as the word "do" is often redundant
+in English.  Symbol table entries can be named with an initial '*',
+but you don't really care about that yet (if ever :-).
+
+Every variable type has its own namespace, as do several
+non-variable identifiers.  This means that you can, without fear
+of conflict, use the same name for a scalar variable, an array, or
+a hash--or, for that matter, for a filehandle, a directory handle, a
+subroutine name, a format name, or a label.  This means that $foo
+and @foo are two different variables.  It also means that C<$foo[1]>
+is a part of @foo, not a part of $foo.  This may seem a bit weird,
+but that's okay, because it is weird.
+X<namespace>
+
+Because variable references always start with '$', '@', or '%', the
+"reserved" words aren't in fact reserved with respect to variable
+names.  They I<are> reserved with respect to labels and filehandles,
+however, which don't have an initial special character.  You can't
+have a filehandle named "log", for instance.  Hint: you could say
+C<open(LOG,'logfile')> rather than C<open(log,'logfile')>.  Using
+uppercase filehandles also improves readability and protects you
+from conflict with future reserved words.  Case I<is> significant--"FOO",
+"Foo", and "foo" are all different names.  Names that start with a
+letter or underscore may also contain digits and underscores.
+X<identifier, case sensitivity>
+X<case>
+
+It is possible to replace such an alphanumeric name with an expression
+that returns a reference to the appropriate type.  For a description
+of this, see L<perlref>.
+
+Names that start with a digit may contain only more digits.  Names
+that do not start with a letter, underscore, digit or a caret (i.e.
+a control character) are limited to one character, e.g.,  C<$%> or
+C<$$>.  (Most of these one character names have a predefined
+significance to Perl.  For instance, C<$$> is the current process
+id.)
+
+=head2 Context
+X<context> X<scalar context> X<list context>
+
+The interpretation of operations and values in Perl sometimes depends
+on the requirements of the context around the operation or value.
+There are two major contexts: list and scalar.  Certain operations
+return list values in contexts wanting a list, and scalar values
+otherwise.  If this is true of an operation it will be mentioned in
+the documentation for that operation.  In other words, Perl overloads
+certain operations based on whether the expected return value is
+singular or plural.  Some words in English work this way, like "fish"
+and "sheep".
+
+In a reciprocal fashion, an operation provides either a scalar or a
+list context to each of its arguments.  For example, if you say
+
+    int( <STDIN> )
+
+the integer operation provides scalar context for the <>
+operator, which responds by reading one line from STDIN and passing it
+back to the integer operation, which will then find the integer value
+of that line and return that.  If, on the other hand, you say
+
+    sort( <STDIN> )
+
+then the sort operation provides list context for <>, which
+will proceed to read every line available up to the end of file, and
+pass that list of lines back to the sort routine, which will then
+sort those lines and return them as a list to whatever the context
+of the sort was.
+
+Assignment is a little bit special in that it uses its left argument
+to determine the context for the right argument.  Assignment to a
+scalar evaluates the right-hand side in scalar context, while
+assignment to an array or hash evaluates the righthand side in list
+context.  Assignment to a list (or slice, which is just a list
+anyway) also evaluates the righthand side in list context.
+
+When you use the C<use warnings> pragma or Perl's B<-w> command-line 
+option, you may see warnings
+about useless uses of constants or functions in "void context".
+Void context just means the value has been discarded, such as a
+statement containing only C<"fred";> or C<getpwuid(0);>.  It still
+counts as scalar context for functions that care whether or not
+they're being called in list context.
+
+User-defined subroutines may choose to care whether they are being
+called in a void, scalar, or list context.  Most subroutines do not
+need to bother, though.  That's because both scalars and lists are
+automatically interpolated into lists.  See L<perlfunc/wantarray>
+for how you would dynamically discern your function's calling
+context.
+
+=head2 Scalar values
+X<scalar> X<number> X<string> X<reference>
+
+All data in Perl is a scalar, an array of scalars, or a hash of
+scalars.  A scalar may contain one single value in any of three
+different flavors: a number, a string, or a reference.  In general,
+conversion from one form to another is transparent.  Although a
+scalar may not directly hold multiple values, it may contain a
+reference to an array or hash which in turn contains multiple values.
+
+Scalars aren't necessarily one thing or another.  There's no place
+to declare a scalar variable to be of type "string", type "number",
+type "reference", or anything else.  Because of the automatic
+conversion of scalars, operations that return scalars don't need
+to care (and in fact, cannot care) whether their caller is looking
+for a string, a number, or a reference.  Perl is a contextually
+polymorphic language whose scalars can be strings, numbers, or
+references (which includes objects).  Although strings and numbers
+are considered pretty much the same thing for nearly all purposes,
+references are strongly-typed, uncastable pointers with builtin
+reference-counting and destructor invocation.
+
+A scalar value is interpreted as TRUE in the Boolean sense if it is not
+the null string or the number 0 (or its string equivalent, "0").  The
+Boolean context is just a special kind of scalar context where no 
+conversion to a string or a number is ever performed.
+X<boolean> X<bool> X<true> X<false> X<truth>
+
+There are actually two varieties of null strings (sometimes referred
+to as "empty" strings), a defined one and an undefined one.  The
+defined version is just a string of length zero, such as C<"">.
+The undefined version is the value that indicates that there is
+no real value for something, such as when there was an error, or
+at end of file, or when you refer to an uninitialized variable or
+element of an array or hash.  Although in early versions of Perl,
+an undefined scalar could become defined when first used in a
+place expecting a defined value, this no longer happens except for
+rare cases of autovivification as explained in L<perlref>.  You can
+use the defined() operator to determine whether a scalar value is
+defined (this has no meaning on arrays or hashes), and the undef()
+operator to produce an undefined value.
+X<defined> X<undefined> X<undef> X<null> X<string, null>
+
+To find out whether a given string is a valid non-zero number, it's
+sometimes enough to test it against both numeric 0 and also lexical
+"0" (although this will cause noises if warnings are on).  That's 
+because strings that aren't numbers count as 0, just as they do in B<awk>:
+
+    if ($str == 0 && $str ne "0")  {
+	warn "That doesn't look like a number";
+    }
+
+That method may be best because otherwise you won't treat IEEE
+notations like C<NaN> or C<Infinity> properly.  At other times, you
+might prefer to determine whether string data can be used numerically
+by calling the POSIX::strtod() function or by inspecting your string
+with a regular expression (as documented in L<perlre>).
+
+    warn "has nondigits"	if     /\D/;
+    warn "not a natural number" unless /^\d+$/;             # rejects -3
+    warn "not an integer"       unless /^-?\d+$/;           # rejects +3
+    warn "not an integer"       unless /^[+-]?\d+$/;
+    warn "not a decimal number" unless /^-?\d+\.?\d*$/;     # rejects .2
+    warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/;
+    warn "not a C float"
+	unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
+
+The length of an array is a scalar value.  You may find the length
+of array @days by evaluating C<$#days>, as in B<csh>.  However, this
+isn't the length of the array; it's the subscript of the last element,
+which is a different value since there is ordinarily a 0th element.
+Assigning to C<$#days> actually changes the length of the array.
+Shortening an array this way destroys intervening values.  Lengthening
+an array that was previously shortened does not recover values
+that were in those elements.  (It used to do so in Perl 4, but we
+had to break this to make sure destructors were called when expected.)
+X<$#> X<array, length>
+
+You can also gain some minuscule measure of efficiency by pre-extending
+an array that is going to get big.  You can also extend an array
+by assigning to an element that is off the end of the array.  You
+can truncate an array down to nothing by assigning the null list
+() to it.  The following are equivalent:
+
+    @whatever = ();
+    $#whatever = -1;
+
+If you evaluate an array in scalar context, it returns the length
+of the array.  (Note that this is not true of lists, which return
+the last value, like the C comma operator, nor of built-in functions,
+which return whatever they feel like returning.)  The following is
+always true:
+X<array, length>
+
+    scalar(@whatever) == $#whatever - $[ + 1;
+
+Version 5 of Perl changed the semantics of C<$[>: files that don't set
+the value of C<$[> no longer need to worry about whether another
+file changed its value.  (In other words, use of C<$[> is deprecated.)
+So in general you can assume that
+X<$[>
+
+    scalar(@whatever) == $#whatever + 1;
+
+Some programmers choose to use an explicit conversion so as to 
+leave nothing to doubt:
+
+    $element_count = scalar(@whatever);
+
+If you evaluate a hash in scalar context, it returns false if the
+hash is empty.  If there are any key/value pairs, it returns true;
+more precisely, the value returned is a string consisting of the
+number of used buckets and the number of allocated buckets, separated
+by a slash.  This is pretty much useful only to find out whether
+Perl's internal hashing algorithm is performing poorly on your data
+set.  For example, you stick 10,000 things in a hash, but evaluating
+%HASH in scalar context reveals C<"1/16">, which means only one out
+of sixteen buckets has been touched, and presumably contains all
+10,000 of your items.  This isn't supposed to happen.
+X<hash, scalar context> X<hash, bucket> X<bucket>
+
+You can preallocate space for a hash by assigning to the keys() function.
+This rounds up the allocated buckets to the next power of two:
+
+    keys(%users) = 1000;		# allocate 1024 buckets
+
+=head2 Scalar value constructors
+X<scalar, literal> X<scalar, constant>
+
+Numeric literals are specified in any of the following floating point or
+integer formats:
+
+    12345
+    12345.67
+    .23E-10             # a very small number
+    3.14_15_92          # a very important number
+    4_294_967_296       # underscore for legibility
+    0xff                # hex
+    0xdead_beef         # more hex   
+    0377                # octal (only numbers, begins with 0)
+    0b011011            # binary
+
+You are allowed to use underscores (underbars) in numeric literals
+between digits for legibility.  You could, for example, group binary
+digits by threes (as for a Unix-style mode argument such as 0b110_100_100)
+or by fours (to represent nibbles, as in 0b1010_0110) or in other groups.
+X<number, literal>
+
+String literals are usually delimited by either single or double
+quotes.  They work much like quotes in the standard Unix shells:
+double-quoted string literals are subject to backslash and variable
+substitution; single-quoted strings are not (except for C<\'> and
+C<\\>).  The usual C-style backslash rules apply for making
+characters such as newline, tab, etc., as well as some more exotic
+forms.  See L<perlop/"Quote and Quote-like Operators"> for a list.
+X<string, literal>
+
+Hexadecimal, octal, or binary, representations in string literals
+(e.g. '0xff') are not automatically converted to their integer
+representation.  The hex() and oct() functions make these conversions
+for you.  See L<perlfunc/hex> and L<perlfunc/oct> for more details.
+
+You can also embed newlines directly in your strings, i.e., they can end
+on a different line than they begin.  This is nice, but if you forget
+your trailing quote, the error will not be reported until Perl finds
+another line containing the quote character, which may be much further
+on in the script.  Variable substitution inside strings is limited to
+scalar variables, arrays, and array or hash slices.  (In other words,
+names beginning with $ or @, followed by an optional bracketed
+expression as a subscript.)  The following code segment prints out "The
+price is $Z<>100."
+X<interpolation>
+
+    $Price = '$100';	# not interpolated
+    print "The price is $Price.\n";	# interpolated
+
+There is no double interpolation in Perl, so the C<$100> is left as is.
+
+As in some shells, you can enclose the variable name in braces to
+disambiguate it from following alphanumerics (and underscores).
+You must also do
+this when interpolating a variable into a string to separate the
+variable name from a following double-colon or an apostrophe, since
+these would be otherwise treated as a package separator:
+X<interpolation>
+
+    $who = "Larry";
+    print PASSWD "${who}::0:0:Superuser:/:/bin/perl\n";
+    print "We use ${who}speak when ${who}'s here.\n";
+
+Without the braces, Perl would have looked for a $whospeak, a
+C<$who::0>, and a C<$who's> variable.  The last two would be the
+$0 and the $s variables in the (presumably) non-existent package
+C<who>.
+
+In fact, an identifier within such curlies is forced to be a string,
+as is any simple identifier within a hash subscript.  Neither need
+quoting.  Our earlier example, C<$days{'Feb'}> can be written as
+C<$days{Feb}> and the quotes will be assumed automatically.  But
+anything more complicated in the subscript will be interpreted as an
+expression.  This means for example that C<$version{2.0}++> is
+equivalent to C<$version{2}++>, not to C<$version{'2.0'}++>.
+
+=head3 Version Strings
+X<version string> X<vstring> X<v-string>
+
+B<Note:> Version Strings (v-strings) have been deprecated.  They will
+not be available after Perl 5.8.  The marginal benefits of v-strings
+were greatly outweighed by the potential for Surprise and Confusion.
+
+A literal of the form C<v1.20.300.4000> is parsed as a string composed
+of characters with the specified ordinals.  This form, known as
+v-strings, provides an alternative, more readable way to construct
+strings, rather than use the somewhat less readable interpolation form
+C<"\x{1}\x{14}\x{12c}\x{fa0}">.  This is useful for representing
+Unicode strings, and for comparing version "numbers" using the string
+comparison operators, C<cmp>, C<gt>, C<lt> etc.  If there are two or
+more dots in the literal, the leading C<v> may be omitted.
+
+    print v9786;              # prints UTF-8 encoded SMILEY, "\x{263a}"
+    print v102.111.111;       # prints "foo"
+    print 102.111.111;        # same
+
+Such literals are accepted by both C<require> and C<use> for
+doing a version check.  The C<$^V> special variable also contains the
+running Perl interpreter's version in this form.  See L<perlvar/$^V>.
+Note that using the v-strings for IPv4 addresses is not portable unless
+you also use the inet_aton()/inet_ntoa() routines of the Socket package.
+
+Note that since Perl 5.8.1 the single-number v-strings (like C<v65>)
+are not v-strings before the C<< => >> operator (which is usually used
+to separate a hash key from a hash value), instead they are interpreted
+as literal strings ('v65').  They were v-strings from Perl 5.6.0 to
+Perl 5.8.0, but that caused more confusion and breakage than good.
+Multi-number v-strings like C<v65.66> and C<65.66.67> continue to
+be v-strings always.
+
+=head3 Special Literals
+X<special literal> X<__END__> X<__DATA__> X<END> X<DATA>
+X<end> X<data> X<^D> X<^Z>
+
+The special literals __FILE__, __LINE__, and __PACKAGE__
+represent the current filename, line number, and package name at that
+point in your program.  They may be used only as separate tokens; they
+will not be interpolated into strings.  If there is no current package
+(due to an empty C<package;> directive), __PACKAGE__ is the undefined
+value.
+X<__FILE__> X<__LINE__> X<__PACKAGE__> X<line> X<file> X<package>
+
+The two control characters ^D and ^Z, and the tokens __END__ and __DATA__
+may be used to indicate the logical end of the script before the actual
+end of file.  Any following text is ignored.
+
+Text after __DATA__ but may be read via the filehandle C<PACKNAME::DATA>,
+where C<PACKNAME> is the package that was current when the __DATA__
+token was encountered.  The filehandle is left open pointing to the
+contents after __DATA__.  It is the program's responsibility to
+C<close DATA> when it is done reading from it.  For compatibility with
+older scripts written before __DATA__ was introduced, __END__ behaves
+like __DATA__ in the toplevel script (but not in files loaded with
+C<require> or C<do>) and leaves the remaining contents of the
+file accessible via C<main::DATA>.
+
+See L<SelfLoader> for more description of __DATA__, and
+an example of its use.  Note that you cannot read from the DATA
+filehandle in a BEGIN block: the BEGIN block is executed as soon
+as it is seen (during compilation), at which point the corresponding
+__DATA__ (or __END__) token has not yet been seen.
+
+=head3 Barewords
+X<bareword>
+
+A word that has no other interpretation in the grammar will
+be treated as if it were a quoted string.  These are known as
+"barewords".  As with filehandles and labels, a bareword that consists
+entirely of lowercase letters risks conflict with future reserved
+words, and if you use the C<use warnings> pragma or the B<-w> switch, 
+Perl will warn you about any
+such words.  Some people may wish to outlaw barewords entirely.  If you
+say
+
+    use strict 'subs';
+
+then any bareword that would NOT be interpreted as a subroutine call
+produces a compile-time error instead.  The restriction lasts to the
+end of the enclosing block.  An inner block may countermand this
+by saying C<no strict 'subs'>.
+
+=head3 Array Joining Delimiter
+X<array, interpolation> X<interpolation, array> X<$">
+
+Arrays and slices are interpolated into double-quoted strings
+by joining the elements with the delimiter specified in the C<$">
+variable (C<$LIST_SEPARATOR> if "use English;" is specified), 
+space by default.  The following are equivalent:
+
+    $temp = join($", @ARGV);
+    system "echo $temp";
+
+    system "echo @ARGV";
+
+Within search patterns (which also undergo double-quotish substitution)
+there is an unfortunate ambiguity:  Is C</$foo[bar]/> to be interpreted as
+C</${foo}[bar]/> (where C<[bar]> is a character class for the regular
+expression) or as C</${foo[bar]}/> (where C<[bar]> is the subscript to array
+@foo)?  If @foo doesn't otherwise exist, then it's obviously a
+character class.  If @foo exists, Perl takes a good guess about C<[bar]>,
+and is almost always right.  If it does guess wrong, or if you're just
+plain paranoid, you can force the correct interpretation with curly
+braces as above.
+
+If you're looking for the information on how to use here-documents,
+which used to be here, that's been moved to
+L<perlop/Quote and Quote-like Operators>.
+
+=head2 List value constructors
+X<list>
+
+List values are denoted by separating individual values by commas
+(and enclosing the list in parentheses where precedence requires it):
+
+    (LIST)
+
+In a context not requiring a list value, the value of what appears
+to be a list literal is simply the value of the final element, as
+with the C comma operator.  For example,
+
+    @foo = ('cc', '-E', $bar);
+
+assigns the entire list value to array @foo, but
+
+    $foo = ('cc', '-E', $bar);
+
+assigns the value of variable $bar to the scalar variable $foo.
+Note that the value of an actual array in scalar context is the
+length of the array; the following assigns the value 3 to $foo:
+
+    @foo = ('cc', '-E', $bar);
+    $foo = @foo;                # $foo gets 3
+
+You may have an optional comma before the closing parenthesis of a
+list literal, so that you can say:
+
+    @foo = (
+        1,
+        2,
+        3,
+    );
+
+To use a here-document to assign an array, one line per element,
+you might use an approach like this:
+
+    @sauces = <<End_Lines =~ m/(\S.*\S)/g;
+        normal tomato
+        spicy tomato
+        green chile
+        pesto
+        white wine
+    End_Lines
+
+LISTs do automatic interpolation of sublists.  That is, when a LIST is
+evaluated, each element of the list is evaluated in list context, and
+the resulting list value is interpolated into LIST just as if each
+individual element were a member of LIST.  Thus arrays and hashes lose their
+identity in a LIST--the list
+
+    (@foo,@bar,&SomeSub,%glarch)
+
+contains all the elements of @foo followed by all the elements of @bar,
+followed by all the elements returned by the subroutine named SomeSub 
+called in list context, followed by the key/value pairs of %glarch.
+To make a list reference that does I<NOT> interpolate, see L<perlref>.
+
+The null list is represented by ().  Interpolating it in a list
+has no effect.  Thus ((),(),()) is equivalent to ().  Similarly,
+interpolating an array with no elements is the same as if no
+array had been interpolated at that point.
+
+This interpolation combines with the facts that the opening
+and closing parentheses are optional (except when necessary for
+precedence) and lists may end with an optional comma to mean that
+multiple commas within lists are legal syntax. The list C<1,,3> is a
+concatenation of two lists, C<1,> and C<3>, the first of which ends
+with that optional comma.  C<1,,3> is C<(1,),(3)> is C<1,3> (And
+similarly for C<1,,,3> is C<(1,),(,),3> is C<1,3> and so on.)  Not that
+we'd advise you to use this obfuscation.
+
+A list value may also be subscripted like a normal array.  You must
+put the list in parentheses to avoid ambiguity.  For example:
+
+    # Stat returns list value.
+    $time = (stat($file))[8];
+
+    # SYNTAX ERROR HERE.
+    $time = stat($file)[8];  # OOPS, FORGOT PARENTHESES
+
+    # Find a hex digit.
+    $hexdigit = ('a','b','c','d','e','f')[$digit-10];
+
+    # A "reverse comma operator".
+    return (pop(@foo),pop(@foo))[0];
+
+Lists may be assigned to only when each element of the list
+is itself legal to assign to:
+
+    ($a, $b, $c) = (1, 2, 3);
+
+    ($map{'red'}, $map{'blue'}, $map{'green'}) = (0x00f, 0x0f0, 0xf00);
+
+An exception to this is that you may assign to C<undef> in a list.
+This is useful for throwing away some of the return values of a
+function:
+
+    ($dev, $ino, undef, undef, $uid, $gid) = stat($file);
+
+List assignment in scalar context returns the number of elements
+produced by the expression on the right side of the assignment:
+
+    $x = (($foo,$bar) = (3,2,1));       # set $x to 3, not 2
+    $x = (($foo,$bar) = f());           # set $x to f()'s return count
+
+This is handy when you want to do a list assignment in a Boolean
+context, because most list functions return a null list when finished,
+which when assigned produces a 0, which is interpreted as FALSE.
+
+It's also the source of a useful idiom for executing a function or
+performing an operation in list context and then counting the number of
+return values, by assigning to an empty list and then using that
+assignment in scalar context. For example, this code:
+
+    $count = () = $string =~ /\d+/g;
+
+will place into $count the number of digit groups found in $string.
+This happens because the pattern match is in list context (since it
+is being assigned to the empty list), and will therefore return a list
+of all matching parts of the string. The list assignment in scalar
+context will translate that into the number of elements (here, the
+number of times the pattern matched) and assign that to $count. Note
+that simply using
+
+    $count = $string =~ /\d+/g;
+
+would not have worked, since a pattern match in scalar context will
+only return true or false, rather than a count of matches.
+
+The final element of a list assignment may be an array or a hash:
+
+    ($a, $b, @rest) = split;
+    my($a, $b, %rest) = @_;
+
+You can actually put an array or hash anywhere in the list, but the first one
+in the list will soak up all the values, and anything after it will become
+undefined.  This may be useful in a my() or local().
+
+A hash can be initialized using a literal list holding pairs of
+items to be interpreted as a key and a value:
+
+    # same as map assignment above
+    %map = ('red',0x00f,'blue',0x0f0,'green',0xf00);
+
+While literal lists and named arrays are often interchangeable, that's
+not the case for hashes.  Just because you can subscript a list value like
+a normal array does not mean that you can subscript a list value as a
+hash.  Likewise, hashes included as parts of other lists (including
+parameters lists and return lists from functions) always flatten out into
+key/value pairs.  That's why it's good to use references sometimes.
+
+It is often more readable to use the C<< => >> operator between key/value
+pairs.  The C<< => >> operator is mostly just a more visually distinctive
+synonym for a comma, but it also arranges for its left-hand operand to be
+interpreted as a string -- if it's a bareword that would be a legal simple
+identifier (C<< => >> doesn't quote compound identifiers, that contain
+double colons). This makes it nice for initializing hashes:
+
+    %map = (
+                 red   => 0x00f,
+                 blue  => 0x0f0,
+                 green => 0xf00,
+   );
+
+or for initializing hash references to be used as records:
+
+    $rec = {
+                witch => 'Mable the Merciless',
+                cat   => 'Fluffy the Ferocious',
+                date  => '10/31/1776',
+    };
+
+or for using call-by-named-parameter to complicated functions:
+
+   $field = $query->radio_group(
+               name      => 'group_name',
+               values    => ['eenie','meenie','minie'],
+               default   => 'meenie',
+               linebreak => 'true',
+               labels    => \%labels
+   );
+
+Note that just because a hash is initialized in that order doesn't
+mean that it comes out in that order.  See L<perlfunc/sort> for examples
+of how to arrange for an output ordering.
+
+=head2 Subscripts
+
+An array is subscripted by specifying a dollar sign (C<$>), then the
+name of the array (without the leading C<@>), then the subscript inside
+square brackets.  For example:
+
+    @myarray = (5, 50, 500, 5000);
+    print "Element Number 2 is", $myarray[2], "\n";
+
+The array indices start with 0. A negative subscript retrieves its 
+value from the end.  In our example, C<$myarray[-1]> would have been 
+5000, and C<$myarray[-2]> would have been 500.
+
+Hash subscripts are similar, only instead of square brackets curly brackets
+are used. For example:
+
+    %scientists = 
+    (
+        "Newton" => "Isaac",
+        "Einstein" => "Albert",
+        "Darwin" => "Charles",
+        "Feynman" => "Richard",
+    );
+
+    print "Darwin's First Name is ", $scientists{"Darwin"}, "\n";
+
+=head2 Slices
+X<slice> X<array, slice> X<hash, slice>
+
+A common way to access an array or a hash is one scalar element at a
+time.  You can also subscript a list to get a single element from it.
+
+    $whoami = $ENV{"USER"};             # one element from the hash
+    $parent = $ISA[0];                  # one element from the array
+    $dir    = (getpwnam("daemon"))[7];  # likewise, but with list
+
+A slice accesses several elements of a list, an array, or a hash
+simultaneously using a list of subscripts.  It's more convenient
+than writing out the individual elements as a list of separate
+scalar values.
+
+    ($him, $her)   = @folks[0,-1];              # array slice
+    @them          = @folks[0 .. 3];            # array slice
+    ($who, $home)  = @ENV{"USER", "HOME"};      # hash slice
+    ($uid, $dir)   = (getpwnam("daemon"))[2,7]; # list slice
+
+Since you can assign to a list of variables, you can also assign to
+an array or hash slice.
+
+    @days[3..5]    = qw/Wed Thu Fri/;
+    @colors{'red','blue','green'} 
+                   = (0xff0000, 0x0000ff, 0x00ff00);
+    @folks[0, -1]  = @folks[-1, 0];
+
+The previous assignments are exactly equivalent to
+
+    ($days[3], $days[4], $days[5]) = qw/Wed Thu Fri/;
+    ($colors{'red'}, $colors{'blue'}, $colors{'green'})
+                   = (0xff0000, 0x0000ff, 0x00ff00);
+    ($folks[0], $folks[-1]) = ($folks[-1], $folks[0]);
+
+Since changing a slice changes the original array or hash that it's
+slicing, a C<foreach> construct will alter some--or even all--of the
+values of the array or hash.
+
+    foreach (@array[ 4 .. 10 ]) { s/peter/paul/ } 
+
+    foreach (@hash{qw[key1 key2]}) {
+        s/^\s+//;           # trim leading whitespace
+        s/\s+$//;           # trim trailing whitespace
+        s/(\w+)/\u\L$1/g;   # "titlecase" words
+    }
+
+A slice of an empty list is still an empty list.  Thus:
+
+    @a = ()[1,0];           # @a has no elements
+    @b = (@a)[0,1];         # @b has no elements
+    @c = (0,1)[2,3];        # @c has no elements
+
+But:
+
+    @a = (1)[1,0];          # @a has two elements
+    @b = (1,undef)[1,0,2];  # @b has three elements
+
+This makes it easy to write loops that terminate when a null list
+is returned:
+
+    while ( ($home, $user) = (getpwent)[7,0]) {
+        printf "%-8s %s\n", $user, $home;
+    }
+
+As noted earlier in this document, the scalar sense of list assignment
+is the number of elements on the right-hand side of the assignment.
+The null list contains no elements, so when the password file is
+exhausted, the result is 0, not 2.
+
+If you're confused about why you use an '@' there on a hash slice
+instead of a '%', think of it like this.  The type of bracket (square
+or curly) governs whether it's an array or a hash being looked at.
+On the other hand, the leading symbol ('$' or '@') on the array or
+hash indicates whether you are getting back a singular value (a
+scalar) or a plural one (a list).
+
+=head2 Typeglobs and Filehandles
+X<typeglob> X<filehandle> X<*>
+
+Perl uses an internal type called a I<typeglob> to hold an entire
+symbol table entry.  The type prefix of a typeglob is a C<*>, because
+it represents all types.  This used to be the preferred way to
+pass arrays and hashes by reference into a function, but now that
+we have real references, this is seldom needed.  
+
+The main use of typeglobs in modern Perl is create symbol table aliases.
+This assignment:
+
+    *this = *that;
+
+makes $this an alias for $that, @this an alias for @that, %this an alias
+for %that, &this an alias for &that, etc.  Much safer is to use a reference.
+This:
+
+    local *Here::blue = \$There::green;
+
+temporarily makes $Here::blue an alias for $There::green, but doesn't
+make @Here::blue an alias for @There::green, or %Here::blue an alias for
+%There::green, etc.  See L<perlmod/"Symbol Tables"> for more examples
+of this.  Strange though this may seem, this is the basis for the whole
+module import/export system.
+
+Another use for typeglobs is to pass filehandles into a function or
+to create new filehandles.  If you need to use a typeglob to save away
+a filehandle, do it this way:
+
+    $fh = *STDOUT;
+
+or perhaps as a real reference, like this:
+
+    $fh = \*STDOUT;
+
+See L<perlsub> for examples of using these as indirect filehandles
+in functions.
+
+Typeglobs are also a way to create a local filehandle using the local()
+operator.  These last until their block is exited, but may be passed back.
+For example:
+
+    sub newopen {
+        my $path = shift;
+        local  *FH;  # not my!
+        open   (FH, $path)          or  return undef;
+        return *FH;
+    }
+    $fh = newopen('/etc/passwd');
+
+Now that we have the C<*foo{THING}> notation, typeglobs aren't used as much
+for filehandle manipulations, although they're still needed to pass brand
+new file and directory handles into or out of functions. That's because
+C<*HANDLE{IO}> only works if HANDLE has already been used as a handle.
+In other words, C<*FH> must be used to create new symbol table entries;
+C<*foo{THING}> cannot.  When in doubt, use C<*FH>.
+
+All functions that are capable of creating filehandles (open(),
+opendir(), pipe(), socketpair(), sysopen(), socket(), and accept())
+automatically create an anonymous filehandle if the handle passed to
+them is an uninitialized scalar variable. This allows the constructs
+such as C<open(my $fh, ...)> and C<open(local $fh,...)> to be used to
+create filehandles that will conveniently be closed automatically when
+the scope ends, provided there are no other references to them. This
+largely eliminates the need for typeglobs when opening filehandles
+that must be passed around, as in the following example:
+
+    sub myopen {
+        open my $fh, "@_"
+             or die "Can't open '@_': $!";
+        return $fh;
+    }
+
+    {
+        my $f = myopen("</etc/motd");
+        print <$f>;
+        # $f implicitly closed here
+    }
+
+Note that if an initialized scalar variable is used instead the
+result is different: C<my $fh='zzz'; open($fh, ...)> is equivalent
+to C<open( *{'zzz'}, ...)>.
+C<use strict 'refs'> forbids such practice.
+
+Another way to create anonymous filehandles is with the Symbol
+module or with the IO::Handle module and its ilk.  These modules
+have the advantage of not hiding different types of the same name
+during the local().  See the bottom of L<perlfunc/open()> for an
+example.
+
+=head1 SEE ALSO
+
+See L<perlvar> for a description of Perl's built-in variables and
+a discussion of legal variable names.  See L<perlref>, L<perlsub>,
+and L<perlmod/"Symbol Tables"> for more discussion on typeglobs and
+the C<*foo{THING}> syntax.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldbmfilter.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldbmfilter.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldbmfilter.pod	(revision 14489)
@@ -0,0 +1,168 @@
+=head1 NAME
+
+perldbmfilter - Perl DBM Filters
+
+=head1 SYNOPSIS
+
+    $db = tie %hash, 'DBM', ...
+
+    $old_filter = $db->filter_store_key  ( sub { ... } );
+    $old_filter = $db->filter_store_value( sub { ... } );
+    $old_filter = $db->filter_fetch_key  ( sub { ... } );
+    $old_filter = $db->filter_fetch_value( sub { ... } );
+
+=head1 DESCRIPTION
+
+The four C<filter_*> methods shown above are available in all the DBM
+modules that ship with Perl, namely DB_File, GDBM_File, NDBM_File,
+ODBM_File and SDBM_File.
+
+Each of the methods work identically, and are used to install (or
+uninstall) a single DBM Filter. The only difference between them is the
+place that the filter is installed.
+
+To summarise:
+
+=over 5
+
+=item B<filter_store_key>
+
+If a filter has been installed with this method, it will be invoked
+every time you write a key to a DBM database.
+
+=item B<filter_store_value>
+
+If a filter has been installed with this method, it will be invoked
+every time you write a value to a DBM database.
+
+
+=item B<filter_fetch_key>
+
+If a filter has been installed with this method, it will be invoked
+every time you read a key from a DBM database.
+
+=item B<filter_fetch_value>
+
+If a filter has been installed with this method, it will be invoked
+every time you read a value from a DBM database.
+
+=back
+
+You can use any combination of the methods from none to all four.
+
+All filter methods return the existing filter, if present, or C<undef>
+in not.
+
+To delete a filter pass C<undef> to it.
+
+=head2 The Filter
+
+When each filter is called by Perl, a local copy of C<$_> will contain
+the key or value to be filtered. Filtering is achieved by modifying
+the contents of C<$_>. The return code from the filter is ignored.
+
+=head2 An Example -- the NULL termination problem.
+
+DBM Filters are useful for a class of problems where you I<always>
+want to make the same transformation to all keys, all values or both.
+
+For example, consider the following scenario. You have a DBM database
+that you need to share with a third-party C application. The C application
+assumes that I<all> keys and values are NULL terminated. Unfortunately
+when Perl writes to DBM databases it doesn't use NULL termination, so
+your Perl application will have to manage NULL termination itself. When
+you write to the database you will have to use something like this:
+
+    $hash{"$key\0"} = "$value\0";
+
+Similarly the NULL needs to be taken into account when you are considering
+the length of existing keys/values.
+
+It would be much better if you could ignore the NULL terminations issue
+in the main application code and have a mechanism that automatically
+added the terminating NULL to all keys and values whenever you write to
+the database and have them removed when you read from the database. As I'm
+sure you have already guessed, this is a problem that DBM Filters can
+fix very easily.
+
+    use strict;
+    use warnings;
+    use SDBM_File;
+    use Fcntl;
+
+    my %hash;
+    my $filename = "filt";
+    unlink $filename;
+
+    my $db = tie(%hash, 'SDBM_File', $filename, O_RDWR|O_CREAT, 0640)
+      or die "Cannot open $filename: $!\n";
+
+    # Install DBM Filters
+    $db->filter_fetch_key  ( sub { s/\0$//    } );
+    $db->filter_store_key  ( sub { $_ .= "\0" } );
+    $db->filter_fetch_value( 
+        sub { no warnings 'uninitialized'; s/\0$// } );
+    $db->filter_store_value( sub { $_ .= "\0" } );
+
+    $hash{"abc"} = "def";
+    my $a = $hash{"ABC"};
+    # ...
+    undef $db;
+    untie %hash;
+
+The code above uses SDBM_File, but it will work with any of the DBM
+modules.
+
+Hopefully the contents of each of the filters should be
+self-explanatory. Both "fetch" filters remove the terminating NULL,
+and both "store" filters add a terminating NULL.
+
+
+=head2 Another Example -- Key is a C int.
+
+Here is another real-life example. By default, whenever Perl writes to
+a DBM database it always writes the key and value as strings. So when
+you use this:
+
+    $hash{12345} = "something";
+
+the key 12345 will get stored in the DBM database as the 5 byte string
+"12345". If you actually want the key to be stored in the DBM database
+as a C int, you will have to use C<pack> when writing, and C<unpack>
+when reading.
+
+Here is a DBM Filter that does it:
+
+    use strict;
+    use warnings;
+    use DB_File;
+    my %hash;
+    my $filename = "filt";
+    unlink $filename;
+
+
+    my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH 
+      or die "Cannot open $filename: $!\n";
+
+    $db->filter_fetch_key  ( sub { $_ = unpack("i", $_) } );
+    $db->filter_store_key  ( sub { $_ = pack ("i", $_) } );
+    $hash{123} = "def";
+    # ...
+    undef $db;
+    untie %hash;
+
+The code above uses DB_File, but again it will work with any of the
+DBM modules.
+
+This time only two filters have been used -- we only need to manipulate
+the contents of the key, so it wasn't necessary to install any value
+filters.
+
+=head1 SEE ALSO
+
+L<DB_File>, L<GDBM_File>, L<NDBM_File>, L<ODBM_File> and L<SDBM_File>.
+
+=head1 AUTHOR
+
+Paul Marquess
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldebguts.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldebguts.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldebguts.pod	(revision 14489)
@@ -0,0 +1,877 @@
+=head1 NAME
+
+perldebguts - Guts of Perl debugging 
+
+=head1 DESCRIPTION
+
+This is not the perldebug(1) manpage, which tells you how to use
+the debugger.  This manpage describes low-level details concerning
+the debugger's internals, which range from difficult to impossible
+to understand for anyone who isn't incredibly intimate with Perl's guts.
+Caveat lector.
+
+=head1 Debugger Internals
+
+Perl has special debugging hooks at compile-time and run-time used
+to create debugging environments.  These hooks are not to be confused
+with the I<perl -Dxxx> command described in L<perlrun>, which is
+usable only if a special Perl is built per the instructions in the
+F<INSTALL> podpage in the Perl source tree.
+
+For example, whenever you call Perl's built-in C<caller> function
+from the package C<DB>, the arguments that the corresponding stack
+frame was called with are copied to the C<@DB::args> array.  These
+mechanisms are enabled by calling Perl with the B<-d> switch.
+Specifically, the following additional features are enabled
+(cf. L<perlvar/$^P>):
+
+=over 4
+
+=item *
+
+Perl inserts the contents of C<$ENV{PERL5DB}> (or C<BEGIN {require
+'perl5db.pl'}> if not present) before the first line of your program.
+
+=item *
+
+Each array C<@{"_<$filename"}> holds the lines of $filename for a
+file compiled by Perl.  The same is also true for C<eval>ed strings
+that contain subroutines, or which are currently being executed.
+The $filename for C<eval>ed strings looks like C<(eval 34)>.
+Code assertions in regexes look like C<(re_eval 19)>.
+
+Values in this array are magical in numeric context: they compare
+equal to zero only if the line is not breakable.
+
+=item *
+
+Each hash C<%{"_<$filename"}> contains breakpoints and actions keyed
+by line number.  Individual entries (as opposed to the whole hash)
+are settable.  Perl only cares about Boolean true here, although
+the values used by F<perl5db.pl> have the form
+C<"$break_condition\0$action">.  
+
+The same holds for evaluated strings that contain subroutines, or
+which are currently being executed.  The $filename for C<eval>ed strings
+looks like C<(eval 34)> or  C<(re_eval 19)>.
+
+=item *
+
+Each scalar C<${"_<$filename"}> contains C<"_<$filename">.  This is
+also the case for evaluated strings that contain subroutines, or
+which are currently being executed.  The $filename for C<eval>ed
+strings looks like C<(eval 34)> or C<(re_eval 19)>.
+
+=item *
+
+After each C<require>d file is compiled, but before it is executed,
+C<DB::postponed(*{"_<$filename"})> is called if the subroutine
+C<DB::postponed> exists.  Here, the $filename is the expanded name of
+the C<require>d file, as found in the values of %INC.
+
+=item *
+
+After each subroutine C<subname> is compiled, the existence of
+C<$DB::postponed{subname}> is checked.  If this key exists,
+C<DB::postponed(subname)> is called if the C<DB::postponed> subroutine
+also exists.
+
+=item *
+
+A hash C<%DB::sub> is maintained, whose keys are subroutine names
+and whose values have the form C<filename:startline-endline>.
+C<filename> has the form C<(eval 34)> for subroutines defined inside
+C<eval>s, or C<(re_eval 19)> for those within regex code assertions.
+
+=item *
+
+When the execution of your program reaches a point that can hold a
+breakpoint, the C<DB::DB()> subroutine is called if any of the variables
+C<$DB::trace>, C<$DB::single>, or C<$DB::signal> is true.  These variables
+are not C<local>izable.  This feature is disabled when executing
+inside C<DB::DB()>, including functions called from it 
+unless C<< $^D & (1<<30) >> is true.
+
+=item *
+
+When execution of the program reaches a subroutine call, a call to
+C<&DB::sub>(I<args>) is made instead, with C<$DB::sub> holding the
+name of the called subroutine. (This doesn't happen if the subroutine
+was compiled in the C<DB> package.)
+
+=back
+
+Note that if C<&DB::sub> needs external data for it to work, no
+subroutine call is possible without it. As an example, the standard
+debugger's C<&DB::sub> depends on the C<$DB::deep> variable
+(it defines how many levels of recursion deep into the debugger you can go
+before a mandatory break).  If C<$DB::deep> is not defined, subroutine
+calls are not possible, even though C<&DB::sub> exists.
+
+=head2 Writing Your Own Debugger
+
+=head3 Environment Variables
+
+The C<PERL5DB> environment variable can be used to define a debugger.
+For example, the minimal "working" debugger (it actually doesn't do anything)
+consists of one line:
+
+  sub DB::DB {}
+
+It can easily be defined like this:
+
+  $ PERL5DB="sub DB::DB {}" perl -d your-script
+
+Another brief debugger, slightly more useful, can be created
+with only the line:
+
+  sub DB::DB {print ++$i; scalar <STDIN>}
+
+This debugger prints a number which increments for each statement
+encountered and waits for you to hit a newline before continuing
+to the next statement.
+
+The following debugger is actually useful:
+
+  {
+    package DB;
+    sub DB  {}
+    sub sub {print ++$i, " $sub\n"; &$sub}
+  }
+
+It prints the sequence number of each subroutine call and the name of the
+called subroutine.  Note that C<&DB::sub> is being compiled into the
+package C<DB> through the use of the C<package> directive.
+
+When it starts, the debugger reads your rc file (F<./.perldb> or
+F<~/.perldb> under Unix), which can set important options.
+(A subroutine (C<&afterinit>) can be defined here as well; it is executed
+after the debugger completes its own initialization.)
+
+After the rc file is read, the debugger reads the PERLDB_OPTS
+environment variable and uses it to set debugger options. The
+contents of this variable are treated as if they were the argument
+of an C<o ...> debugger command (q.v. in L<perldebug/Options>).
+
+=head3 Debugger internal variables
+In addition to the file and subroutine-related variables mentioned above,
+the debugger also maintains various magical internal variables.
+
+=over 4
+
+=item *
+
+C<@DB::dbline> is an alias for C<@{"::_<current_file"}>, which
+holds the lines of the currently-selected file (compiled by Perl), either
+explicitly chosen with the debugger's C<f> command, or implicitly by flow
+of execution.
+
+Values in this array are magical in numeric context: they compare
+equal to zero only if the line is not breakable.
+
+=item *
+
+C<%DB::dbline>, is an alias for C<%{"::_<current_file"}>, which
+contains breakpoints and actions keyed by line number in
+the currently-selected file, either explicitly chosen with the
+debugger's C<f> command, or implicitly by flow of execution.
+
+As previously noted, individual entries (as opposed to the whole hash)
+are settable.  Perl only cares about Boolean true here, although
+the values used by F<perl5db.pl> have the form
+C<"$break_condition\0$action">.
+
+=back
+
+=head3 Debugger customization functions
+
+Some functions are provided to simplify customization.
+
+=over 4
+
+=item *
+
+See L<perldebug/"Options"> for description of options parsed by
+C<DB::parse_options(string)> parses debugger options; see
+L<pperldebug/Options> for a description of options recognized.
+
+=item *
+
+C<DB::dump_trace(skip[,count])> skips the specified number of frames
+and returns a list containing information about the calling frames (all
+of them, if C<count> is missing).  Each entry is reference to a hash
+with keys C<context> (either C<.>, C<$>, or C<@>), C<sub> (subroutine
+name, or info about C<eval>), C<args> (C<undef> or a reference to
+an array), C<file>, and C<line>.
+
+=item *
+
+C<DB::print_trace(FH, skip[, count[, short]])> prints
+formatted info about caller frames.  The last two functions may be
+convenient as arguments to C<< < >>, C<< << >> commands.
+
+=back
+
+Note that any variables and functions that are not documented in
+this manpages (or in L<perldebug>) are considered for internal   
+use only, and as such are subject to change without notice.
+
+=head1 Frame Listing Output Examples
+
+The C<frame> option can be used to control the output of frame 
+information.  For example, contrast this expression trace:
+
+ $ perl -de 42
+ Stack dump during die enabled outside of evals.
+
+ Loading DB routines from perl5db.pl patch level 0.94
+ Emacs support available.
+
+ Enter h or `h h' for help.
+
+ main::(-e:1):   0
+   DB<1> sub foo { 14 }
+
+   DB<2> sub bar { 3 }
+
+   DB<3> t print foo() * bar()
+ main::((eval 172):3):   print foo() + bar();
+ main::foo((eval 168):2):
+ main::bar((eval 170):2):
+ 42
+
+with this one, once the C<o>ption C<frame=2> has been set:
+
+   DB<4> o f=2
+                frame = '2'
+   DB<5> t print foo() * bar()
+ 3:      foo() * bar()
+ entering main::foo
+  2:     sub foo { 14 };
+ exited main::foo
+ entering main::bar
+  2:     sub bar { 3 };
+ exited main::bar
+ 42
+
+By way of demonstration, we present below a laborious listing
+resulting from setting your C<PERLDB_OPTS> environment variable to
+the value C<f=n N>, and running I<perl -d -V> from the command line.
+Examples use various values of C<n> are shown to give you a feel
+for the difference between settings.  Long those it may be, this
+is not a complete listing, but only excerpts.
+
+=over 4
+
+=item 1
+
+  entering main::BEGIN
+   entering Config::BEGIN
+    Package lib/Exporter.pm.
+    Package lib/Carp.pm.
+   Package lib/Config.pm.
+   entering Config::TIEHASH
+   entering Exporter::import
+    entering Exporter::export
+  entering Config::myconfig
+   entering Config::FETCH
+   entering Config::FETCH
+   entering Config::FETCH
+   entering Config::FETCH
+
+=item 2
+
+  entering main::BEGIN
+   entering Config::BEGIN
+    Package lib/Exporter.pm.
+    Package lib/Carp.pm.
+   exited Config::BEGIN
+   Package lib/Config.pm.
+   entering Config::TIEHASH
+   exited Config::TIEHASH
+   entering Exporter::import
+    entering Exporter::export
+    exited Exporter::export
+   exited Exporter::import
+  exited main::BEGIN
+  entering Config::myconfig
+   entering Config::FETCH
+   exited Config::FETCH
+   entering Config::FETCH
+   exited Config::FETCH
+   entering Config::FETCH
+
+=item 4
+
+  in  $=main::BEGIN() from /dev/null:0
+   in  $=Config::BEGIN() from lib/Config.pm:2
+    Package lib/Exporter.pm.
+    Package lib/Carp.pm.
+   Package lib/Config.pm.
+   in  $=Config::TIEHASH('Config') from lib/Config.pm:644
+   in  $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+    in  $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from li
+  in  @=Config::myconfig() from /dev/null:0
+   in  $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
+   in  $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
+   in  $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
+   in  $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') from lib/Config.pm:574
+   in  $=Config::FETCH(ref(Config), 'osname') from lib/Config.pm:574
+   in  $=Config::FETCH(ref(Config), 'osvers') from lib/Config.pm:574
+
+=item 6
+
+  in  $=main::BEGIN() from /dev/null:0
+   in  $=Config::BEGIN() from lib/Config.pm:2
+    Package lib/Exporter.pm.
+    Package lib/Carp.pm.
+   out $=Config::BEGIN() from lib/Config.pm:0
+   Package lib/Config.pm.
+   in  $=Config::TIEHASH('Config') from lib/Config.pm:644
+   out $=Config::TIEHASH('Config') from lib/Config.pm:644
+   in  $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+    in  $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
+    out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
+   out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+  out $=main::BEGIN() from /dev/null:0
+  in  @=Config::myconfig() from /dev/null:0
+   in  $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
+   out $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
+   in  $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
+   out $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
+   in  $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
+   out $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
+   in  $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') from lib/Config.pm:574
+
+=item 14
+
+  in  $=main::BEGIN() from /dev/null:0
+   in  $=Config::BEGIN() from lib/Config.pm:2
+    Package lib/Exporter.pm.
+    Package lib/Carp.pm.
+   out $=Config::BEGIN() from lib/Config.pm:0
+   Package lib/Config.pm.
+   in  $=Config::TIEHASH('Config') from lib/Config.pm:644
+   out $=Config::TIEHASH('Config') from lib/Config.pm:644
+   in  $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+    in  $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
+    out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
+   out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+  out $=main::BEGIN() from /dev/null:0
+  in  @=Config::myconfig() from /dev/null:0
+   in  $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
+   out $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
+   in  $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
+   out $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
+
+=item 30
+
+  in  $=CODE(0x15eca4)() from /dev/null:0
+   in  $=CODE(0x182528)() from lib/Config.pm:2
+    Package lib/Exporter.pm.
+   out $=CODE(0x182528)() from lib/Config.pm:0
+   scalar context return from CODE(0x182528): undef
+   Package lib/Config.pm.
+   in  $=Config::TIEHASH('Config') from lib/Config.pm:628
+   out $=Config::TIEHASH('Config') from lib/Config.pm:628
+   scalar context return from Config::TIEHASH:   empty hash
+   in  $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+    in  $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
+    out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
+    scalar context return from Exporter::export: ''
+   out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+   scalar context return from Exporter::import: ''
+
+=back
+
+In all cases shown above, the line indentation shows the call tree.
+If bit 2 of C<frame> is set, a line is printed on exit from a
+subroutine as well.  If bit 4 is set, the arguments are printed
+along with the caller info.  If bit 8 is set, the arguments are
+printed even if they are tied or references.  If bit 16 is set, the
+return value is printed, too.
+
+When a package is compiled, a line like this
+
+    Package lib/Carp.pm.
+
+is printed with proper indentation.
+
+=head1 Debugging regular expressions
+
+There are two ways to enable debugging output for regular expressions.
+
+If your perl is compiled with C<-DDEBUGGING>, you may use the
+B<-Dr> flag on the command line.
+
+Otherwise, one can C<use re 'debug'>, which has effects at
+compile time and run time.  It is not lexically scoped.
+
+=head2 Compile-time output
+
+The debugging output at compile time looks like this:
+
+  Compiling REx `[bc]d(ef*g)+h[ij]k$'
+  size 45 Got 364 bytes for offset annotations.
+  first at 1
+  rarest char g at 0
+  rarest char d at 0
+     1: ANYOF[bc](12)
+    12: EXACT <d>(14)
+    14: CURLYX[0] {1,32767}(28)
+    16:   OPEN1(18)
+    18:     EXACT <e>(20)
+    20:     STAR(23)
+    21:       EXACT <f>(0)
+    23:     EXACT <g>(25)
+    25:   CLOSE1(27)
+    27:   WHILEM[1/1](0)
+    28: NOTHING(29)
+    29: EXACT <h>(31)
+    31: ANYOF[ij](42)
+    42: EXACT <k>(44)
+    44: EOL(45)
+    45: END(0)
+  anchored `de' at 1 floating `gh' at 3..2147483647 (checking floating) 
+        stclass `ANYOF[bc]' minlen 7 
+  Offsets: [45]
+  	1[4] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 5[1]
+  	0[0] 12[1] 0[0] 6[1] 0[0] 7[1] 0[0] 9[1] 8[1] 0[0] 10[1] 0[0]
+  	11[1] 0[0] 12[0] 12[0] 13[1] 0[0] 14[4] 0[0] 0[0] 0[0] 0[0]
+  	0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 18[1] 0[0] 19[1] 20[0]  
+  Omitting $` $& $' support.
+
+The first line shows the pre-compiled form of the regex.  The second
+shows the size of the compiled form (in arbitrary units, usually
+4-byte words) and the total number of bytes allocated for the
+offset/length table, usually 4+C<size>*8.  The next line shows the
+label I<id> of the first node that does a match.
+
+The 
+
+  anchored `de' at 1 floating `gh' at 3..2147483647 (checking floating) 
+        stclass `ANYOF[bc]' minlen 7 
+
+line (split into two lines above) contains optimizer
+information.  In the example shown, the optimizer found that the match 
+should contain a substring C<de> at offset 1, plus substring C<gh>
+at some offset between 3 and infinity.  Moreover, when checking for
+these substrings (to abandon impossible matches quickly), Perl will check
+for the substring C<gh> before checking for the substring C<de>.  The
+optimizer may also use the knowledge that the match starts (at the
+C<first> I<id>) with a character class, and no string 
+shorter than 7 characters can possibly match.
+
+The fields of interest which may appear in this line are
+
+=over 4
+
+=item C<anchored> I<STRING> C<at> I<POS>
+
+=item C<floating> I<STRING> C<at> I<POS1..POS2>
+
+See above.
+
+=item C<matching floating/anchored>
+
+Which substring to check first.
+
+=item C<minlen>
+
+The minimal length of the match.
+
+=item C<stclass> I<TYPE>
+
+Type of first matching node.
+
+=item C<noscan>
+
+Don't scan for the found substrings.
+
+=item C<isall>
+
+Means that the optimizer information is all that the regular
+expression contains, and thus one does not need to enter the regex engine at
+all.
+
+=item C<GPOS>
+
+Set if the pattern contains C<\G>.
+
+=item C<plus> 
+
+Set if the pattern starts with a repeated char (as in C<x+y>).
+
+=item C<implicit>
+
+Set if the pattern starts with C<.*>.
+
+=item C<with eval> 
+
+Set if the pattern contain eval-groups, such as C<(?{ code })> and
+C<(??{ code })>.
+
+=item C<anchored(TYPE)>
+
+If the pattern may match only at a handful of places, (with C<TYPE>
+being C<BOL>, C<MBOL>, or C<GPOS>.  See the table below.
+
+=back
+
+If a substring is known to match at end-of-line only, it may be
+followed by C<$>, as in C<floating `k'$>.
+
+The optimizer-specific information is used to avoid entering (a slow) regex
+engine on strings that will not definitely match.  If the C<isall> flag
+is set, a call to the regex engine may be avoided even when the optimizer
+found an appropriate place for the match.
+
+Above the optimizer section is the list of I<nodes> of the compiled
+form of the regex.  Each line has format 
+
+C<   >I<id>: I<TYPE> I<OPTIONAL-INFO> (I<next-id>)
+
+=head2 Types of nodes
+
+Here are the possible types, with short descriptions:
+
+    # TYPE arg-description [num-args] [longjump-len] DESCRIPTION
+
+    # Exit points
+    END		no	End of program.
+    SUCCEED	no	Return from a subroutine, basically.
+
+    # Anchors:
+    BOL		no	Match "" at beginning of line.
+    MBOL	no	Same, assuming multiline.
+    SBOL	no	Same, assuming singleline.
+    EOS		no	Match "" at end of string.
+    EOL		no	Match "" at end of line.
+    MEOL	no	Same, assuming multiline.
+    SEOL	no	Same, assuming singleline.
+    BOUND	no	Match "" at any word boundary
+    BOUNDL	no	Match "" at any word boundary
+    NBOUND	no	Match "" at any word non-boundary
+    NBOUNDL	no	Match "" at any word non-boundary
+    GPOS	no	Matches where last m//g left off.
+
+    # [Special] alternatives
+    ANY		no	Match any one character (except newline).
+    SANY	no	Match any one character.
+    ANYOF	sv	Match character in (or not in) this class.
+    ALNUM	no	Match any alphanumeric character
+    ALNUML	no	Match any alphanumeric char in locale
+    NALNUM	no	Match any non-alphanumeric character
+    NALNUML	no	Match any non-alphanumeric char in locale
+    SPACE	no	Match any whitespace character
+    SPACEL	no	Match any whitespace char in locale
+    NSPACE	no	Match any non-whitespace character
+    NSPACEL	no	Match any non-whitespace char in locale
+    DIGIT	no	Match any numeric character
+    NDIGIT	no	Match any non-numeric character
+
+    # BRANCH	The set of branches constituting a single choice are hooked
+    #		together with their "next" pointers, since precedence prevents
+    #		anything being concatenated to any individual branch.  The
+    #		"next" pointer of the last BRANCH in a choice points to the
+    #		thing following the whole choice.  This is also where the
+    #		final "next" pointer of each individual branch points; each
+    #		branch starts with the operand node of a BRANCH node.
+    #
+    BRANCH	node	Match this alternative, or the next...
+
+    # BACK	Normal "next" pointers all implicitly point forward; BACK
+    #		exists to make loop structures possible.
+    # not used
+    BACK	no	Match "", "next" ptr points backward.
+
+    # Literals
+    EXACT	sv	Match this string (preceded by length).
+    EXACTF	sv	Match this string, folded (prec. by length).
+    EXACTFL	sv	Match this string, folded in locale (w/len).
+
+    # Do nothing
+    NOTHING	no	Match empty string.
+    # A variant of above which delimits a group, thus stops optimizations
+    TAIL	no	Match empty string. Can jump here from outside.
+
+    # STAR,PLUS	'?', and complex '*' and '+', are implemented as circular
+    #		BRANCH structures using BACK.  Simple cases (one character
+    #		per match) are implemented with STAR and PLUS for speed
+    #		and to minimize recursive plunges.
+    #
+    STAR	node	Match this (simple) thing 0 or more times.
+    PLUS	node	Match this (simple) thing 1 or more times.
+
+    CURLY	sv 2	Match this simple thing {n,m} times.
+    CURLYN	no 2	Match next-after-this simple thing 
+    #			{n,m} times, set parens.
+    CURLYM	no 2	Match this medium-complex thing {n,m} times.
+    CURLYX	sv 2	Match this complex thing {n,m} times.
+
+    # This terminator creates a loop structure for CURLYX
+    WHILEM	no	Do curly processing and see if rest matches.
+
+    # OPEN,CLOSE,GROUPP	...are numbered at compile time.
+    OPEN	num 1	Mark this point in input as start of #n.
+    CLOSE	num 1	Analogous to OPEN.
+
+    REF		num 1	Match some already matched string
+    REFF	num 1	Match already matched string, folded
+    REFFL	num 1	Match already matched string, folded in loc.
+
+    # grouping assertions
+    IFMATCH	off 1 2	Succeeds if the following matches.
+    UNLESSM	off 1 2	Fails if the following matches.
+    SUSPEND	off 1 1	"Independent" sub-regex.
+    IFTHEN	off 1 1	Switch, should be preceded by switcher .
+    GROUPP	num 1	Whether the group matched.
+
+    # Support for long regex
+    LONGJMP	off 1 1	Jump far away.
+    BRANCHJ	off 1 1	BRANCH with long offset.
+
+    # The heavy worker
+    EVAL	evl 1	Execute some Perl code.
+
+    # Modifiers
+    MINMOD	no	Next operator is not greedy.
+    LOGICAL	no	Next opcode should set the flag only.
+
+    # This is not used yet
+    RENUM	off 1 1	Group with independently numbered parens.
+
+    # This is not really a node, but an optimized away piece of a "long" node.
+    # To simplify debugging output, we mark it as if it were a node
+    OPTIMIZED	off	Placeholder for dump.
+
+=for unprinted-credits
+Next section M-J. Dominus (mjd-perl-patch+@plover.com) 20010421
+
+Following the optimizer information is a dump of the offset/length
+table, here split across several lines:
+
+  Offsets: [45]
+  	1[4] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 5[1]
+  	0[0] 12[1] 0[0] 6[1] 0[0] 7[1] 0[0] 9[1] 8[1] 0[0] 10[1] 0[0]
+  	11[1] 0[0] 12[0] 12[0] 13[1] 0[0] 14[4] 0[0] 0[0] 0[0] 0[0]
+  	0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 18[1] 0[0] 19[1] 20[0]  
+
+The first line here indicates that the offset/length table contains 45
+entries.  Each entry is a pair of integers, denoted by C<offset[length]>.
+Entries are numbered starting with 1, so entry #1 here is C<1[4]> and
+entry #12 is C<5[1]>.  C<1[4]> indicates that the node labeled C<1:>
+(the C<1: ANYOF[bc]>) begins at character position 1 in the
+pre-compiled form of the regex, and has a length of 4 characters.
+C<5[1]> in position 12 
+indicates that the node labeled C<12:>
+(the C<< 12: EXACT <d> >>) begins at character position 5 in the
+pre-compiled form of the regex, and has a length of 1 character.
+C<12[1]> in position 14 
+indicates that the node labeled C<14:>
+(the C<< 14: CURLYX[0] {1,32767} >>) begins at character position 12 in the
+pre-compiled form of the regex, and has a length of 1 character---that
+is, it corresponds to the C<+> symbol in the precompiled regex.
+
+C<0[0]> items indicate that there is no corresponding node.
+
+=head2 Run-time output
+
+First of all, when doing a match, one may get no run-time output even
+if debugging is enabled.  This means that the regex engine was never
+entered and that all of the job was therefore done by the optimizer.
+
+If the regex engine was entered, the output may look like this:
+
+  Matching `[bc]d(ef*g)+h[ij]k$' against `abcdefg__gh__'
+    Setting an EVAL scope, savestack=3
+     2 <ab> <cdefg__gh_>    |  1: ANYOF
+     3 <abc> <defg__gh_>    | 11: EXACT <d>
+     4 <abcd> <efg__gh_>    | 13: CURLYX {1,32767}
+     4 <abcd> <efg__gh_>    | 26:   WHILEM
+				0 out of 1..32767  cc=effff31c
+     4 <abcd> <efg__gh_>    | 15:     OPEN1
+     4 <abcd> <efg__gh_>    | 17:     EXACT <e>
+     5 <abcde> <fg__gh_>    | 19:     STAR
+			     EXACT <f> can match 1 times out of 32767...
+    Setting an EVAL scope, savestack=3
+     6 <bcdef> <g__gh__>    | 22:       EXACT <g>
+     7 <bcdefg> <__gh__>    | 24:       CLOSE1
+     7 <bcdefg> <__gh__>    | 26:       WHILEM
+				    1 out of 1..32767  cc=effff31c
+    Setting an EVAL scope, savestack=12
+     7 <bcdefg> <__gh__>    | 15:         OPEN1
+     7 <bcdefg> <__gh__>    | 17:         EXACT <e>
+       restoring \1 to 4(4)..7
+				    failed, try continuation...
+     7 <bcdefg> <__gh__>    | 27:         NOTHING
+     7 <bcdefg> <__gh__>    | 28:         EXACT <h>
+				    failed...
+				failed...
+
+The most significant information in the output is about the particular I<node>
+of the compiled regex that is currently being tested against the target string.
+The format of these lines is
+
+C<    >I<STRING-OFFSET> <I<PRE-STRING>> <I<POST-STRING>>   |I<ID>:  I<TYPE>
+
+The I<TYPE> info is indented with respect to the backtracking level.
+Other incidental information appears interspersed within.
+
+=head1 Debugging Perl memory usage
+
+Perl is a profligate wastrel when it comes to memory use.  There
+is a saying that to estimate memory usage of Perl, assume a reasonable
+algorithm for memory allocation, multiply that estimate by 10, and
+while you still may miss the mark, at least you won't be quite so
+astonished.  This is not absolutely true, but may provide a good
+grasp of what happens.
+
+Assume that an integer cannot take less than 20 bytes of memory, a
+float cannot take less than 24 bytes, a string cannot take less
+than 32 bytes (all these examples assume 32-bit architectures, the
+result are quite a bit worse on 64-bit architectures).  If a variable
+is accessed in two of three different ways (which require an integer,
+a float, or a string), the memory footprint may increase yet another
+20 bytes.  A sloppy malloc(3) implementation can inflate these
+numbers dramatically.
+
+On the opposite end of the scale, a declaration like
+
+  sub foo;
+
+may take up to 500 bytes of memory, depending on which release of Perl
+you're running.
+
+Anecdotal estimates of source-to-compiled code bloat suggest an
+eightfold increase.  This means that the compiled form of reasonable
+(normally commented, properly indented etc.) code will take
+about eight times more space in memory than the code took
+on disk.
+
+The B<-DL> command-line switch is obsolete since circa Perl 5.6.0
+(it was available only if Perl was built with C<-DDEBUGGING>).
+The switch was used to track Perl's memory allocations and possible
+memory leaks.  These days the use of malloc debugging tools like
+F<Purify> or F<valgrind> is suggested instead.
+
+One way to find out how much memory is being used by Perl data
+structures is to install the Devel::Size module from CPAN: it gives
+you the minimum number of bytes required to store a particular data
+structure.  Please be mindful of the difference between the size()
+and total_size().
+
+If Perl has been compiled using Perl's malloc you can analyze Perl
+memory usage by setting the $ENV{PERL_DEBUG_MSTATS}.
+
+=head2 Using C<$ENV{PERL_DEBUG_MSTATS}>
+
+If your perl is using Perl's malloc() and was compiled with the
+necessary switches (this is the default), then it will print memory
+usage statistics after compiling your code when C<< $ENV{PERL_DEBUG_MSTATS}
+> 1 >>, and before termination of the program when C<<
+$ENV{PERL_DEBUG_MSTATS} >= 1 >>.  The report format is similar to
+the following example:
+
+  $ PERL_DEBUG_MSTATS=2 perl -e "require Carp"
+  Memory allocation statistics after compilation: (buckets 4(4)..8188(8192)
+     14216 free:   130   117    28     7     9   0   2     2   1 0 0
+		437    61    36     0     5
+     60924 used:   125   137   161    55     7   8   6    16   2 0 1
+		 74   109   304    84    20
+  Total sbrk(): 77824/21:119. Odd ends: pad+heads+chain+tail: 0+636+0+2048.
+  Memory allocation statistics after execution:   (buckets 4(4)..8188(8192)
+     30888 free:   245    78    85    13     6   2   1     3   2 0 1
+		315   162    39    42    11
+    175816 used:   265   176  1112   111    26  22  11    27   2 1 1
+		196   178  1066   798    39
+  Total sbrk(): 215040/47:145. Odd ends: pad+heads+chain+tail: 0+2192+0+6144.
+
+It is possible to ask for such a statistic at arbitrary points in
+your execution using the mstat() function out of the standard
+Devel::Peek module.
+
+Here is some explanation of that format:
+
+=over 4
+
+=item C<buckets SMALLEST(APPROX)..GREATEST(APPROX)>
+
+Perl's malloc() uses bucketed allocations.  Every request is rounded
+up to the closest bucket size available, and a bucket is taken from
+the pool of buckets of that size.
+
+The line above describes the limits of buckets currently in use.
+Each bucket has two sizes: memory footprint and the maximal size
+of user data that can fit into this bucket.  Suppose in the above
+example that the smallest bucket were size 4.  The biggest bucket
+would have usable size 8188, and the memory footprint would be 8192.
+
+In a Perl built for debugging, some buckets may have negative usable
+size.  This means that these buckets cannot (and will not) be used.
+For larger buckets, the memory footprint may be one page greater
+than a power of 2.  If so, case the corresponding power of two is
+printed in the C<APPROX> field above.
+
+=item Free/Used
+
+The 1 or 2 rows of numbers following that correspond to the number
+of buckets of each size between C<SMALLEST> and C<GREATEST>.  In
+the first row, the sizes (memory footprints) of buckets are powers
+of two--or possibly one page greater.  In the second row, if present,
+the memory footprints of the buckets are between the memory footprints
+of two buckets "above".
+
+For example, suppose under the previous example, the memory footprints
+were
+
+     free:    8     16    32    64    128  256 512 1024 2048 4096 8192
+	   4     12    24    48    80
+
+With non-C<DEBUGGING> perl, the buckets starting from C<128> have
+a 4-byte overhead, and thus an 8192-long bucket may take up to
+8188-byte allocations.
+
+=item C<Total sbrk(): SBRKed/SBRKs:CONTINUOUS>
+
+The first two fields give the total amount of memory perl sbrk(2)ed
+(ess-broken? :-) and number of sbrk(2)s used.  The third number is
+what perl thinks about continuity of returned chunks.  So long as
+this number is positive, malloc() will assume that it is probable
+that sbrk(2) will provide continuous memory.
+
+Memory allocated by external libraries is not counted.
+
+=item C<pad: 0>
+
+The amount of sbrk(2)ed memory needed to keep buckets aligned.
+
+=item C<heads: 2192>
+
+Although memory overhead of bigger buckets is kept inside the bucket, for
+smaller buckets, it is kept in separate areas.  This field gives the
+total size of these areas.
+
+=item C<chain: 0>
+
+malloc() may want to subdivide a bigger bucket into smaller buckets.
+If only a part of the deceased bucket is left unsubdivided, the rest
+is kept as an element of a linked list.  This field gives the total
+size of these chunks.
+
+=item C<tail: 6144>
+
+To minimize the number of sbrk(2)s, malloc() asks for more memory.  This
+field gives the size of the yet unused part, which is sbrk(2)ed, but
+never touched.
+
+=back
+
+=head1 SEE ALSO
+
+L<perldebug>,
+L<perlguts>,
+L<perlrun>
+L<re>,
+and
+L<Devel::DProf>.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldebtut.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldebtut.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldebtut.pod	(revision 14489)
@@ -0,0 +1,723 @@
+=head1 NAME
+
+perldebtut - Perl debugging tutorial
+
+=head1 DESCRIPTION
+
+A (very) lightweight introduction in the use of the perl debugger, and a
+pointer to existing, deeper sources of information on the subject of debugging
+perl programs.  
+
+There's an extraordinary number of people out there who don't appear to know
+anything about using the perl debugger, though they use the language every
+day.  
+This is for them.  
+
+
+=head1 use strict
+
+First of all, there's a few things you can do to make your life a lot more
+straightforward when it comes to debugging perl programs, without using the
+debugger at all.  To demonstrate, here's a simple script, named "hello", with
+a problem:
+
+	#!/usr/bin/perl
+
+	$var1 = 'Hello World'; # always wanted to do that :-)
+	$var2 = "$varl\n";
+
+	print $var2; 
+	exit;
+
+While this compiles and runs happily, it probably won't do what's expected,
+namely it doesn't print "Hello World\n" at all;  It will on the other hand do
+exactly what it was told to do, computers being a bit that way inclined.  That
+is, it will print out a newline character, and you'll get what looks like a
+blank line.  It looks like there's 2 variables when (because of the typo)
+there's really 3:
+
+	$var1 = 'Hello World';
+	$varl = undef;
+	$var2 = "\n";
+
+To catch this kind of problem, we can force each variable to be declared
+before use by pulling in the strict module, by putting 'use strict;' after the
+first line of the script.
+
+Now when you run it, perl complains about the 3 undeclared variables and we
+get four error messages because one variable is referenced twice:
+
+ Global symbol "$var1" requires explicit package name at ./t1 line 4.
+ Global symbol "$var2" requires explicit package name at ./t1 line 5.
+ Global symbol "$varl" requires explicit package name at ./t1 line 5.
+ Global symbol "$var2" requires explicit package name at ./t1 line 7.
+ Execution of ./hello aborted due to compilation errors.     
+
+Luvverly! and to fix this we declare all variables explicitly and now our
+script looks like this:	
+
+	#!/usr/bin/perl
+	use strict;
+
+	my $var1 = 'Hello World';
+	my $varl = undef;
+	my $var2 = "$varl\n";
+
+	print $var2; 
+	exit;
+
+We then do (always a good idea) a syntax check before we try to run it again:
+
+	> perl -c hello
+	hello syntax OK 
+
+And now when we run it, we get "\n" still, but at least we know why.  Just
+getting this script to compile has exposed the '$varl' (with the letter 'l')
+variable, and simply changing $varl to $var1 solves the problem.
+
+
+=head1 Looking at data and -w and v
+
+Ok, but how about when you want to really see your data, what's in that
+dynamic variable, just before using it?
+
+	#!/usr/bin/perl 
+	use strict;
+
+	my $key = 'welcome';
+	my %data = (
+		'this' => qw(that), 
+		'tom' => qw(and jerry),
+		'welcome' => q(Hello World),
+		'zip' => q(welcome),
+	);
+	my @data = keys %data;
+
+	print "$data{$key}\n";
+	exit;                               
+
+Looks OK, after it's been through the syntax check (perl -c scriptname), we
+run it and all we get is a blank line again!  Hmmmm.
+
+One common debugging approach here, would be to liberally sprinkle a few print
+statements, to add a check just before we print out our data, and another just
+after:
+
+	print "All OK\n" if grep($key, keys %data);
+	print "$data{$key}\n";
+	print "done: '$data{$key}'\n";
+
+And try again:
+
+	> perl data
+	All OK     
+
+	done: ''
+
+After much staring at the same piece of code and not seeing the wood for the
+trees for some time, we get a cup of coffee and try another approach.  That
+is, we bring in the cavalry by giving perl the 'B<-d>' switch on the command
+line:
+
+	> perl -d data 
+	Default die handler restored.
+
+	Loading DB routines from perl5db.pl version 1.07
+	Editor support available.
+
+	Enter h or `h h' for help, or `man perldebug' for more help.
+
+	main::(./data:4):     my $key = 'welcome';   
+
+Now, what we've done here is to launch the built-in perl debugger on our
+script.  It's stopped at the first line of executable code and is waiting for
+input.
+
+Before we go any further, you'll want to know how to quit the debugger: use
+just the letter 'B<q>', not the words 'quit' or 'exit':
+
+	DB<1> q
+	>
+
+That's it, you're back on home turf again.
+
+
+=head1 help
+
+Fire the debugger up again on your script and we'll look at the help menu. 
+There's a couple of ways of calling help: a simple 'B<h>' will get the summary 
+help list, 'B<|h>' (pipe-h) will pipe the help through your pager (which is 
+(probably 'more' or 'less'), and finally, 'B<h h>' (h-space-h) will give you 
+the entire help screen.  Here is the summary page:
+
+DB<1>h
+
+ List/search source lines:               Control script execution:
+  l [ln|sub]  List source code            T           Stack trace
+  - or .      List previous/current line  s [expr]    Single step [in expr]
+  v [line]    View around line            n [expr]    Next, steps over subs
+  f filename  View source in file         <CR/Enter>  Repeat last n or s
+  /pattern/ ?patt?   Search forw/backw    r           Return from subroutine
+  M           Show module versions        c [ln|sub]  Continue until position
+ Debugger controls:                       L           List break/watch/actions
+  o [...]     Set debugger options        t [expr]    Toggle trace [trace expr]
+  <[<]|{[{]|>[>] [cmd] Do pre/post-prompt b [ln|event|sub] [cnd] Set breakpoint
+  ! [N|pat]   Redo a previous command     B ln|*      Delete a/all breakpoints
+  H [-num]    Display last num commands   a [ln] cmd  Do cmd before line
+  = [a val]   Define/list an alias        A ln|*      Delete a/all actions
+  h [db_cmd]  Get help on command         w expr      Add a watch expression
+  h h         Complete help page          W expr|*    Delete a/all watch exprs
+  |[|]db_cmd  Send output to pager        ![!] syscmd Run cmd in a subprocess
+  q or ^D     Quit                        R           Attempt a restart
+ Data Examination:     expr     Execute perl code, also see: s,n,t expr
+  x|m expr       Evals expr in list context, dumps the result or lists methods.
+  p expr         Print expression (uses script's current package).
+  S [[!]pat]     List subroutine names [not] matching pattern
+  V [Pk [Vars]]  List Variables in Package.  Vars can be ~pattern or !pattern.
+  X [Vars]       Same as "V current_package [Vars]".
+  y [n [Vars]]   List lexicals in higher scope <n>.  Vars same as V.
+ For more help, type h cmd_letter, or run man perldebug for all docs. 
+
+More confusing options than you can shake a big stick at!  It's not as bad as
+it looks and it's very useful to know more about all of it, and fun too!
+
+There's a couple of useful ones to know about straight away.  You wouldn't
+think we're using any libraries at all at the moment, but 'B<M>' will show
+which modules are currently loaded, and their version number, while 'B<m>' 
+will show the methods, and 'B<S>' shows all subroutines (by pattern) as 
+shown below.  'B<V>' and 'B<X>' show variables in the program by package 
+scope and can be constrained by pattern. 
+
+	DB<2>S str 
+	dumpvar::stringify
+	strict::bits
+	strict::import
+	strict::unimport  
+
+Using 'X' and cousins requires you not to use the type identifiers ($@%), just
+the 'name':
+
+	DM<3>X ~err
+	FileHandle(stderr) => fileno(2)    
+
+Remember we're in our tiny program with a problem, we should have a look at
+where we are, and what our data looks like. First of all let's view some code 
+at our present position (the first line of code in this case), via 'B<v>':
+
+	DB<4> v
+	1       #!/usr/bin/perl
+	2:      use strict;
+	3
+	4==>    my $key = 'welcome';
+	5:      my %data = (
+	6               'this' => qw(that),
+	7               'tom' => qw(and jerry),
+	8               'welcome' => q(Hello World),
+	9               'zip' => q(welcome),
+	10      );                                 
+
+At line number 4 is a helpful pointer, that tells you where you are now.  To
+see more code, type 'v' again:
+
+	DB<4> v
+	8               'welcome' => q(Hello World),
+	9               'zip' => q(welcome),
+	10      );
+	11:     my @data = keys %data;
+	12:     print "All OK\n" if grep($key, keys %data);
+	13:     print "$data{$key}\n";
+	14:     print "done: '$data{$key}'\n";
+	15:     exit;      
+
+And if you wanted to list line 5 again, type 'l 5', (note the space):
+
+	DB<4> l 5
+	5:      my %data = (
+
+In this case, there's not much to see, but of course normally there's pages of
+stuff to wade through, and 'l' can be very useful.  To reset your view to the
+line we're about to execute, type a lone period '.':
+
+	DB<5> .
+	main::(./data_a:4):     my $key = 'welcome';  
+
+The line shown is the one that is about to be executed B<next>, it hasn't
+happened yet.  So while we can print a variable with the letter 'B<p>', at
+this point all we'd get is an empty (undefined) value back.  What we need to
+do is to step through the next executable statement with an 'B<s>':
+
+	DB<6> s
+	main::(./data_a:5):     my %data = (
+	main::(./data_a:6):             'this' => qw(that),
+	main::(./data_a:7):             'tom' => qw(and jerry),
+	main::(./data_a:8):             'welcome' => q(Hello World),
+	main::(./data_a:9):             'zip' => q(welcome),
+	main::(./data_a:10):    );   
+
+Now we can have a look at that first ($key) variable:
+
+	DB<7> p $key 
+	welcome 
+
+line 13 is where the action is, so let's continue down to there via the letter
+'B<c>', which by the way, inserts a 'one-time-only' breakpoint at the given
+line or sub routine:
+
+	DB<8> c 13
+	All OK
+	main::(./data_a:13):    print "$data{$key}\n";
+
+We've gone past our check (where 'All OK' was printed) and have stopped just
+before the meat of our task.  We could try to print out a couple of variables
+to see what is happening:
+
+	DB<9> p $data{$key}
+
+Not much in there, lets have a look at our hash:
+
+	DB<10> p %data
+	Hello Worldziptomandwelcomejerrywelcomethisthat 
+
+	DB<11> p keys %data
+	Hello Worldtomwelcomejerrythis  
+
+Well, this isn't very easy to read, and using the helpful manual (B<h h>), the
+'B<x>' command looks promising:
+
+	DB<12> x %data
+	0  'Hello World'
+	1  'zip'
+	2  'tom'
+	3  'and'
+	4  'welcome'
+	5  undef
+	6  'jerry'
+	7  'welcome'
+	8  'this'
+	9  'that'     
+
+That's not much help, a couple of welcomes in there, but no indication of
+which are keys, and which are values, it's just a listed array dump and, in
+this case, not particularly helpful.  The trick here, is to use a B<reference>
+to the data structure:
+
+	DB<13> x \%data
+	0  HASH(0x8194bc4)
+	   'Hello World' => 'zip'
+	   'jerry' => 'welcome'
+	   'this' => 'that'
+	   'tom' => 'and'
+	   'welcome' => undef  
+
+The reference is truly dumped and we can finally see what we're dealing with. 
+Our quoting was perfectly valid but wrong for our purposes, with 'and jerry'
+being treated as 2 separate words rather than a phrase, thus throwing the
+evenly paired hash structure out of alignment.
+
+The 'B<-w>' switch would have told us about this, had we used it at the start,
+and saved us a lot of trouble: 
+
+	> perl -w data
+	Odd number of elements in hash assignment at ./data line 5.    
+
+We fix our quoting: 'tom' => q(and jerry), and run it again, this time we get
+our expected output:
+
+	> perl -w data
+	Hello World
+
+
+While we're here, take a closer look at the 'B<x>' command, it's really useful
+and will merrily dump out nested references, complete objects, partial objects
+- just about whatever you throw at it:
+
+Let's make a quick object and x-plode it, first we'll start the debugger:
+it wants some form of input from STDIN, so we give it something non-committal,
+a zero:
+
+	> perl -de 0
+	Default die handler restored.
+
+	Loading DB routines from perl5db.pl version 1.07
+	Editor support available.
+
+	Enter h or `h h' for help, or `man perldebug' for more help.
+
+	main::(-e:1):   0                       
+
+Now build an on-the-fly object over a couple of lines (note the backslash):
+
+	DB<1> $obj = bless({'unique_id'=>'123', 'attr'=> \
+	cont: 	{'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')
+
+And let's have a look at it:
+
+  	DB<2> x $obj
+	0  MY_class=HASH(0x828ad98)
+   		'attr' => HASH(0x828ad68)
+      	'col' => 'black'
+      	'things' => ARRAY(0x828abb8)
+         	0  'this'
+         	1  'that'
+         	2  'etc'
+   		'unique_id' => 123       
+  	DB<3>
+
+Useful, huh?  You can eval nearly anything in there, and experiment with bits
+of code or regexes until the cows come home:
+
+	DB<3> @data = qw(this that the other atheism leather theory scythe)
+
+	DB<4> p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))
+	atheism
+	leather
+	other
+	scythe
+	the
+	theory  
+	saw -> 6
+
+If you want to see the command History, type an 'B<H>':
+
+	DB<5> H
+	4: p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))
+	3: @data = qw(this that the other atheism leather theory scythe)
+	2: x $obj
+	1: $obj = bless({'unique_id'=>'123', 'attr'=>
+	{'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')
+	DB<5>
+
+And if you want to repeat any previous command, use the exclamation: 'B<!>':
+
+	DB<5> !4
+	p 'saw -> '.($cnt += map { print "$_\n" } grep(/the/, sort @data))
+	atheism
+	leather
+	other
+	scythe
+	the
+	theory  
+	saw -> 12
+
+For more on references see L<perlref> and L<perlreftut>
+
+
+=head1 Stepping through code
+
+Here's a simple program which converts between Celsius and Fahrenheit, it too
+has a problem:
+
+	#!/usr/bin/perl -w
+	use strict;
+
+	my $arg = $ARGV[0] || '-c20';
+
+	if ($arg =~ /^\-(c|f)((\-|\+)*\d+(\.\d+)*)$/) {
+		my ($deg, $num) = ($1, $2);
+		my ($in, $out) = ($num, $num);
+		if ($deg eq 'c') {
+			$deg = 'f';
+			$out = &c2f($num);
+		} else {
+			$deg = 'c';
+			$out = &f2c($num);
+		}
+		$out = sprintf('%0.2f', $out);
+		$out =~ s/^((\-|\+)*\d+)\.0+$/$1/;
+		print "$out $deg\n";
+	} else {
+		print "Usage: $0 -[c|f] num\n";
+	}
+	exit;
+
+	sub f2c {
+		my $f = shift;
+		my $c = 5 * $f - 32 / 9;
+		return $c;
+	}
+
+	sub c2f {
+		my $c = shift;
+		my $f = 9 * $c / 5 + 32;
+		return $f;
+	}
+
+
+For some reason, the Fahrenheit to Celsius conversion fails to return the
+expected output.  This is what it does:
+
+	> temp -c0.72
+	33.30 f
+
+	> temp -f33.3
+	162.94 c
+
+Not very consistent!  We'll set a breakpoint in the code manually and run it
+under the debugger to see what's going on.  A breakpoint is a flag, to which
+the debugger will run without interruption, when it reaches the breakpoint, it
+will stop execution and offer a prompt for further interaction.  In normal
+use, these debugger commands are completely ignored, and they are safe - if a
+little messy, to leave in production code.
+
+	my ($in, $out) = ($num, $num);
+	$DB::single=2; # insert at line 9!
+	if ($deg eq 'c') 
+		...
+
+	> perl -d temp -f33.3
+	Default die handler restored.
+
+	Loading DB routines from perl5db.pl version 1.07
+	Editor support available.
+
+	Enter h or `h h' for help, or `man perldebug' for more help.
+
+	main::(temp:4): my $arg = $ARGV[0] || '-c100';     
+
+We'll simply continue down to our pre-set breakpoint with a 'B<c>':
+
+  	DB<1> c
+	main::(temp:10):                if ($deg eq 'c') {   
+
+Followed by a view command to see where we are:
+
+	DB<1> v
+	7:              my ($deg, $num) = ($1, $2);
+	8:              my ($in, $out) = ($num, $num);
+	9:              $DB::single=2;
+	10==>           if ($deg eq 'c') {
+	11:                     $deg = 'f';
+	12:                     $out = &c2f($num);
+	13              } else {
+	14:                     $deg = 'c';
+	15:                     $out = &f2c($num);
+	16              }                             
+
+And a print to show what values we're currently using:
+
+	DB<1> p $deg, $num
+	f33.3
+
+We can put another break point on any line beginning with a colon, we'll use
+line 17 as that's just as we come out of the subroutine, and we'd like to
+pause there later on:
+
+	DB<2> b 17
+
+There's no feedback from this, but you can see what breakpoints are set by
+using the list 'L' command:
+
+	DB<3> L
+	temp:
+ 		17:            print "$out $deg\n";
+   		break if (1)     
+
+Note that to delete a breakpoint you use 'd' or 'D'.
+
+Now we'll continue down into our subroutine, this time rather than by line
+number, we'll use the subroutine name, followed by the now familiar 'v':
+
+	DB<3> c f2c
+	main::f2c(temp:30):             my $f = shift;  
+
+	DB<4> v
+	24:     exit;
+	25
+	26      sub f2c {
+	27==>           my $f = shift;
+	28:             my $c = 5 * $f - 32 / 9; 
+	29:             return $c;
+	30      }
+	31
+	32      sub c2f {
+	33:             my $c = shift;   
+
+
+Note that if there was a subroutine call between us and line 29, and we wanted
+to B<single-step> through it, we could use the 'B<s>' command, and to step
+over it we would use 'B<n>' which would execute the sub, but not descend into
+it for inspection.  In this case though, we simply continue down to line 29:
+
+	DB<4> c 29  
+	main::f2c(temp:29):             return $c;
+
+And have a look at the return value:
+
+	DB<5> p $c
+	162.944444444444
+
+This is not the right answer at all, but the sum looks correct.  I wonder if
+it's anything to do with operator precedence?  We'll try a couple of other
+possibilities with our sum:
+
+	DB<6> p (5 * $f - 32 / 9)
+	162.944444444444
+
+	DB<7> p 5 * $f - (32 / 9) 
+	162.944444444444
+
+	DB<8> p (5 * $f) - 32 / 9
+	162.944444444444
+
+	DB<9> p 5 * ($f - 32) / 9
+	0.722222222222221
+
+:-) that's more like it!  Ok, now we can set our return variable and we'll
+return out of the sub with an 'r':
+
+	DB<10> $c = 5 * ($f - 32) / 9
+
+	DB<11> r
+	scalar context return from main::f2c: 0.722222222222221
+
+Looks good, let's just continue off the end of the script:
+
+	DB<12> c
+	0.72 c 
+	Debugged program terminated.  Use q to quit or R to restart,
+  	use O inhibit_exit to avoid stopping after program termination,
+  	h q, h R or h O to get additional info.   
+
+A quick fix to the offending line (insert the missing parentheses) in the
+actual program and we're finished.
+
+
+=head1 Placeholder for a, w, t, T
+
+Actions, watch variables, stack traces etc.: on the TODO list.
+
+	a 
+
+	w 
+
+	t 
+
+	T
+
+
+=head1 REGULAR EXPRESSIONS
+
+Ever wanted to know what a regex looked like?  You'll need perl compiled with
+the DEBUGGING flag for this one:
+
+	> perl -Dr -e '/^pe(a)*rl$/i'
+	Compiling REx `^pe(a)*rl$'
+	size 17 first at 2
+	rarest char
+	 at 0
+	   1: BOL(2)
+	   2: EXACTF <pe>(4)
+	   4: CURLYN[1] {0,32767}(14)
+	   6:   NOTHING(8)
+	   8:   EXACTF <a>(0)
+	  12:   WHILEM(0)
+	  13: NOTHING(14)
+	  14: EXACTF <rl>(16)
+	  16: EOL(17)
+	  17: END(0)
+	floating `'$ at 4..2147483647 (checking floating) stclass `EXACTF <pe>'
+anchored(BOL) minlen 4
+	Omitting $` $& $' support.
+
+	EXECUTING...
+
+	Freeing REx: `^pe(a)*rl$'  
+
+Did you really want to know? :-)
+For more gory details on getting regular expressions to work, have a look at
+L<perlre>, L<perlretut>, and to decode the mysterious labels (BOL and CURLYN,
+etc. above), see L<perldebguts>.
+
+
+=head1 OUTPUT TIPS
+
+To get all the output from your error log, and not miss any messages via
+helpful operating system buffering, insert a line like this, at the start of
+your script:
+
+	$|=1;	
+
+To watch the tail of a dynamically growing logfile, (from the command line):
+
+	tail -f $error_log
+
+Wrapping all die calls in a handler routine can be useful to see how, and from
+where, they're being called, L<perlvar> has more information:
+
+	BEGIN { $SIG{__DIE__} = sub { require Carp; Carp::confess(@_) } }
+
+Various useful techniques for the redirection of STDOUT and STDERR filehandles
+are explained in L<perlopentut> and L<perlfaq8>.
+
+
+=head1 CGI
+
+Just a quick hint here for all those CGI programmers who can't figure out how
+on earth to get past that 'waiting for input' prompt, when running their CGI
+script from the command-line, try something like this:
+
+	> perl -d my_cgi.pl -nodebug 
+
+Of course L<CGI> and L<perlfaq9> will tell you more.
+
+
+=head1 GUIs
+
+The command line interface is tightly integrated with an B<emacs> extension
+and there's a B<vi> interface too.  
+
+You don't have to do this all on the command line, though, there are a few GUI
+options out there.  The nice thing about these is you can wave a mouse over a
+variable and a dump of its data will appear in an appropriate window, or in a
+popup balloon, no more tiresome typing of 'x $varname' :-)
+
+In particular have a hunt around for the following:
+
+B<ptkdb> perlTK based wrapper for the built-in debugger
+
+B<ddd> data display debugger
+
+B<PerlDevKit> and B<PerlBuilder> are NT specific
+
+NB. (more info on these and others would be appreciated).
+
+
+=head1 SUMMARY
+
+We've seen how to encourage good coding practices with B<use strict> and
+B<-w>.  We can run the perl debugger B<perl -d scriptname> to inspect your
+data from within the perl debugger with the B<p> and B<x> commands.  You can
+walk through your code, set breakpoints with B<b> and step through that code
+with B<s> or B<n>, continue with B<c> and return from a sub with B<r>.  Fairly
+intuitive stuff when you get down to it.  
+
+There is of course lots more to find out about, this has just scratched the
+surface.  The best way to learn more is to use perldoc to find out more about
+the language, to read the on-line help (L<perldebug> is probably the next
+place to go), and of course, experiment.  
+
+
+=head1 SEE ALSO
+
+L<perldebug>, 
+L<perldebguts>, 
+L<perldiag>,
+L<dprofpp>,
+L<perlrun>
+
+
+=head1 AUTHOR
+
+Richard Foley <richard@rfi.net> Copyright (c) 2000
+
+
+=head1 CONTRIBUTORS
+
+Various people have made helpful suggestions and contributions, in particular:
+
+Ronald J Kimball <rjk@linguist.dartmouth.edu>
+
+Hugo van der Sanden <hv@crypt0.demon.co.uk>
+
+Peter Scott <Peter@PSDT.com>
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldebug.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldebug.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldebug.pod	(revision 14489)
@@ -0,0 +1,1145 @@
+=head1 NAME
+X<debug> X<debugger>
+
+perldebug - Perl debugging
+
+=head1 DESCRIPTION
+
+First of all, have you tried using the B<-w> switch?
+
+
+If you're new to the Perl debugger, you may prefer to read
+L<perldebtut>, which is a tutorial introduction to the debugger .
+
+=head1 The Perl Debugger
+
+If you invoke Perl with the B<-d> switch, your script runs under the
+Perl source debugger.  This works like an interactive Perl
+environment, prompting for debugger commands that let you examine
+source code, set breakpoints, get stack backtraces, change the values of
+variables, etc.  This is so convenient that you often fire up
+the debugger all by itself just to test out Perl constructs
+interactively to see what they do.  For example:
+X<-d>
+
+    $ perl -d -e 42
+
+In Perl, the debugger is not a separate program the way it usually is in the
+typical compiled environment.  Instead, the B<-d> flag tells the compiler
+to insert source information into the parse trees it's about to hand off
+to the interpreter.  That means your code must first compile correctly
+for the debugger to work on it.  Then when the interpreter starts up, it
+preloads a special Perl library file containing the debugger.
+
+The program will halt I<right before> the first run-time executable
+statement (but see below regarding compile-time statements) and ask you
+to enter a debugger command.  Contrary to popular expectations, whenever
+the debugger halts and shows you a line of code, it always displays the
+line it's I<about> to execute, rather than the one it has just executed.
+
+Any command not recognized by the debugger is directly executed
+(C<eval>'d) as Perl code in the current package.  (The debugger
+uses the DB package for keeping its own state information.)
+
+Note that the said C<eval> is bound by an implicit scope. As a
+result any newly introduced lexical variable or any modified
+capture buffer content is lost after the eval. The debugger is a
+nice environment to learn Perl, but if you interactively experiment using
+material which should be in the same scope, stuff it in one line.
+
+For any text entered at the debugger prompt, leading and trailing whitespace
+is first stripped before further processing.  If a debugger command
+coincides with some function in your own program, merely precede the
+function with something that doesn't look like a debugger command, such
+as a leading C<;> or perhaps a C<+>, or by wrapping it with parentheses
+or braces.
+
+=head2 Debugger Commands
+
+The debugger understands the following commands:
+
+=over 12
+
+=item h
+X<debugger command, h>
+
+Prints out a summary help message
+
+=item h [command]
+
+Prints out a help message for the given debugger command.
+
+=item h h
+
+The special argument of C<h h> produces the entire help page, which is quite long.
+
+If the output of the C<h h> command (or any command, for that matter) scrolls
+past your screen, precede the command with a leading pipe symbol so
+that it's run through your pager, as in
+
+    DB> |h h
+
+You may change the pager which is used via C<o pager=...> command.
+
+
+=item p expr
+X<debugger command, p>
+
+Same as C<print {$DB::OUT} expr> in the current package.  In particular,
+because this is just Perl's own C<print> function, this means that nested
+data structures and objects are not dumped, unlike with the C<x> command.
+
+The C<DB::OUT> filehandle is opened to F</dev/tty>, regardless of
+where STDOUT may be redirected to.
+
+=item x [maxdepth] expr
+X<debugger command, x>
+
+Evaluates its expression in list context and dumps out the result in a
+pretty-printed fashion.  Nested data structures are printed out
+recursively, unlike the real C<print> function in Perl.  When dumping
+hashes, you'll probably prefer 'x \%h' rather than 'x %h'.
+See L<Dumpvalue> if you'd like to do this yourself.
+
+The output format is governed by multiple options described under
+L<"Configurable Options">.
+
+If the C<maxdepth> is included, it must be a numeral I<N>; the value is
+dumped only I<N> levels deep, as if the C<dumpDepth> option had been
+temporarily set to I<N>.
+
+=item V [pkg [vars]]
+X<debugger command, V>
+
+Display all (or some) variables in package (defaulting to C<main>)
+using a data pretty-printer (hashes show their keys and values so
+you see what's what, control characters are made printable, etc.).
+Make sure you don't put the type specifier (like C<$>) there, just
+the symbol names, like this:
+
+    V DB filename line
+
+Use C<~pattern> and C<!pattern> for positive and negative regexes.
+
+This is similar to calling the C<x> command on each applicable var.
+
+=item X [vars]
+X<debugger command, X>
+
+Same as C<V currentpackage [vars]>.
+
+=item y [level [vars]]
+X<debugger command, y>
+
+Display all (or some) lexical variables (mnemonic: C<mY> variables)
+in the current scope or I<level> scopes higher.  You can limit the
+variables that you see with I<vars> which works exactly as it does
+for the C<V> and C<X> commands.  Requires the C<PadWalker> module
+version 0.08 or higher; will warn if this isn't installed.  Output
+is pretty-printed in the same style as for C<V> and the format is
+controlled by the same options.
+
+=item T
+X<debugger command, T> X<backtrace> X<stack, backtrace>
+
+Produce a stack backtrace.  See below for details on its output.
+
+=item s [expr]
+X<debugger command, s> X<step>
+
+Single step.  Executes until the beginning of another
+statement, descending into subroutine calls.  If an expression is
+supplied that includes function calls, it too will be single-stepped.
+
+=item n [expr]
+X<debugger command, n>
+
+Next.  Executes over subroutine calls, until the beginning
+of the next statement.  If an expression is supplied that includes
+function calls, those functions will be executed with stops before
+each statement.
+
+=item r
+X<debugger command, r>
+
+Continue until the return from the current subroutine.
+Dump the return value if the C<PrintRet> option is set (default).
+
+=item <CR>
+
+Repeat last C<n> or C<s> command.
+
+=item c [line|sub]
+X<debugger command, c>
+
+Continue, optionally inserting a one-time-only breakpoint
+at the specified line or subroutine.
+
+=item l
+X<debugger command, l>
+
+List next window of lines.
+
+=item l min+incr
+
+List C<incr+1> lines starting at C<min>.
+
+=item l min-max
+
+List lines C<min> through C<max>.  C<l -> is synonymous to C<->.
+
+=item l line
+
+List a single line.
+
+=item l subname
+
+List first window of lines from subroutine.  I<subname> may
+be a variable that contains a code reference.
+
+=item -
+X<debugger command, ->
+
+List previous window of lines.
+
+=item v [line]
+X<debugger command, v>
+
+View a few lines of code around the current line.
+
+=item .
+X<debugger command, .>
+
+Return the internal debugger pointer to the line last
+executed, and print out that line.
+
+=item f filename
+X<debugger command, f>
+
+Switch to viewing a different file or C<eval> statement.  If I<filename>
+is not a full pathname found in the values of %INC, it is considered
+a regex.
+
+C<eval>ed strings (when accessible) are considered to be filenames:
+C<f (eval 7)> and C<f eval 7\b> access the body of the 7th C<eval>ed string
+(in the order of execution).  The bodies of the currently executed C<eval>
+and of C<eval>ed strings that define subroutines are saved and thus
+accessible.
+
+=item /pattern/
+
+Search forwards for pattern (a Perl regex); final / is optional.
+The search is case-insensitive by default.
+
+=item ?pattern?
+
+Search backwards for pattern; final ? is optional.
+The search is case-insensitive by default.
+
+=item L [abw]
+X<debugger command, L>
+
+List (default all) actions, breakpoints and watch expressions
+
+=item S [[!]regex]
+X<debugger command, S>
+
+List subroutine names [not] matching the regex.
+
+=item t
+X<debugger command, t>
+
+Toggle trace mode (see also the C<AutoTrace> option).
+
+=item t expr
+X<debugger command, t>
+
+Trace through execution of C<expr>.
+See L<perldebguts/"Frame Listing Output Examples"> for examples.
+
+=item b
+X<breakpoint>
+X<debugger command, b>
+
+Sets breakpoint on current line
+
+=item b [line] [condition]
+X<breakpoint>
+X<debugger command, b>
+
+Set a breakpoint before the given line.  If a condition
+is specified, it's evaluated each time the statement is reached: a
+breakpoint is taken only if the condition is true.  Breakpoints may
+only be set on lines that begin an executable statement.  Conditions
+don't use C<if>:
+
+    b 237 $x > 30
+    b 237 ++$count237 < 11
+    b 33 /pattern/i
+
+=item b subname [condition]
+X<breakpoint>
+X<debugger command, b>
+
+Set a breakpoint before the first line of the named subroutine.  I<subname> may
+be a variable containing a code reference (in this case I<condition>
+is not supported).
+
+=item b postpone subname [condition]
+X<breakpoint>
+X<debugger command, b>
+
+Set a breakpoint at first line of subroutine after it is compiled.
+
+=item b load filename
+X<breakpoint>
+X<debugger command, b>
+
+Set a breakpoint before the first executed line of the I<filename>,
+which should be a full pathname found amongst the %INC values.
+
+=item b compile subname
+X<breakpoint>
+X<debugger command, b>
+
+Sets a breakpoint before the first statement executed after the specified
+subroutine is compiled.
+
+=item B line
+X<breakpoint>
+X<debugger command, B>
+
+Delete a breakpoint from the specified I<line>.
+
+=item B *
+X<breakpoint>
+X<debugger command, B>
+
+Delete all installed breakpoints.
+
+=item a [line] command
+X<debugger command, a>
+
+Set an action to be done before the line is executed.  If I<line> is
+omitted, set an action on the line about to be executed.
+The sequence of steps taken by the debugger is
+
+  1. check for a breakpoint at this line
+  2. print the line if necessary (tracing)
+  3. do any actions associated with that line
+  4. prompt user if at a breakpoint or in single-step
+  5. evaluate line
+
+For example, this will print out $foo every time line
+53 is passed:
+
+    a 53 print "DB FOUND $foo\n"
+
+=item A line
+X<debugger command, A>
+
+Delete an action from the specified line.
+
+=item A *
+X<debugger command, A>
+
+Delete all installed actions.
+
+=item w expr
+X<debugger command, w>
+
+Add a global watch-expression.  We hope you know what one of these
+is, because they're supposed to be obvious.
+
+=item W expr
+X<debugger command, W>
+
+Delete watch-expression
+
+=item W *
+X<debugger command, W>
+
+Delete all watch-expressions.
+
+=item o
+X<debugger command, o>
+
+Display all options
+
+=item o booloption ...
+X<debugger command, o>
+
+Set each listed Boolean option to the value C<1>.
+
+=item o anyoption? ...
+X<debugger command, o>
+
+Print out the value of one or more options.
+
+=item o option=value ...
+X<debugger command, o>
+
+Set the value of one or more options.  If the value has internal
+whitespace, it should be quoted.  For example, you could set C<o
+pager="less -MQeicsNfr"> to call B<less> with those specific options.
+You may use either single or double quotes, but if you do, you must
+escape any embedded instances of same sort of quote you began with,
+as well as any escaping any escapes that immediately precede that
+quote but which are not meant to escape the quote itself.  In other
+words, you follow single-quoting rules irrespective of the quote;
+eg: C<o option='this isn\'t bad'> or C<o option="She said, \"Isn't
+it?\"">.
+
+For historical reasons, the C<=value> is optional, but defaults to
+1 only where it is safe to do so--that is, mostly for Boolean
+options.  It is always better to assign a specific value using C<=>.
+The C<option> can be abbreviated, but for clarity probably should
+not be.  Several options can be set together.  See L<"Configurable Options">
+for a list of these.
+
+=item < ?
+X<< debugger command, < >>
+
+List out all pre-prompt Perl command actions.
+
+=item < [ command ]
+X<< debugger command, < >>
+
+Set an action (Perl command) to happen before every debugger prompt.
+A multi-line command may be entered by backslashing the newlines.
+
+=item < *
+X<< debugger command, < >>
+
+Delete all pre-prompt Perl command actions.
+
+=item << command
+X<< debugger command, << >>
+
+Add an action (Perl command) to happen before every debugger prompt.
+A multi-line command may be entered by backwhacking the newlines.
+
+=item > ?
+X<< debugger command, > >>
+
+List out post-prompt Perl command actions.
+
+=item > command
+X<< debugger command, > >>
+
+Set an action (Perl command) to happen after the prompt when you've
+just given a command to return to executing the script.  A multi-line
+command may be entered by backslashing the newlines (we bet you
+couldn't've guessed this by now).
+
+=item > *
+X<< debugger command, > >>
+
+Delete all post-prompt Perl command actions.
+
+=item >> command
+X<<< debugger command, >> >>>
+
+Adds an action (Perl command) to happen after the prompt when you've
+just given a command to return to executing the script.  A multi-line
+command may be entered by backslashing the newlines.
+
+=item { ?
+X<debugger command, {>
+
+List out pre-prompt debugger commands.
+
+=item { [ command ]
+
+Set an action (debugger command) to happen before every debugger prompt.
+A multi-line command may be entered in the customary fashion.
+
+Because this command is in some senses new, a warning is issued if
+you appear to have accidentally entered a block instead.  If that's
+what you mean to do, write it as with C<;{ ... }> or even
+C<do { ... }>.
+
+=item { *
+X<debugger command, {>
+
+Delete all pre-prompt debugger commands.
+
+=item {{ command
+X<debugger command, {{>
+
+Add an action (debugger command) to happen before every debugger prompt.
+A multi-line command may be entered, if you can guess how: see above.
+
+=item ! number
+X<debugger command, !>
+
+Redo a previous command (defaults to the previous command).
+
+=item ! -number
+X<debugger command, !>
+
+Redo number'th previous command.
+
+=item ! pattern
+X<debugger command, !>
+
+Redo last command that started with pattern.
+See C<o recallCommand>, too.
+
+=item !! cmd
+X<debugger command, !!>
+
+Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT) See
+C<o shellBang>, also.  Note that the user's current shell (well,
+their C<$ENV{SHELL}> variable) will be used, which can interfere
+with proper interpretation of exit status or signal and coredump
+information.
+
+=item source file
+X<debugger command, source>
+
+Read and execute debugger commands from I<file>.
+I<file> may itself contain C<source> commands.
+
+=item H -number
+X<debugger command, H>
+
+Display last n commands.  Only commands longer than one character are
+listed.  If I<number> is omitted, list them all.
+
+=item q or ^D
+X<debugger command, q>
+X<debugger command, ^D>
+
+Quit.  ("quit" doesn't work for this, unless you've made an alias)
+This is the only supported way to exit the debugger, though typing
+C<exit> twice might work.
+
+Set the C<inhibit_exit> option to 0 if you want to be able to step
+off the end the script.  You may also need to set $finished to 0
+if you want to step through global destruction.
+
+=item R
+X<debugger command, R>
+
+Restart the debugger by C<exec()>ing a new session.  We try to maintain
+your history across this, but internal settings and command-line options
+may be lost.
+
+The following setting are currently preserved: history, breakpoints,
+actions, debugger options, and the Perl command-line
+options B<-w>, B<-I>, and B<-e>.
+
+=item |dbcmd
+X<debugger command, |>
+
+Run the debugger command, piping DB::OUT into your current pager.
+
+=item ||dbcmd
+X<debugger command, ||>
+
+Same as C<|dbcmd> but DB::OUT is temporarily C<select>ed as well.
+
+=item = [alias value]
+X<debugger command, =>
+
+Define a command alias, like
+
+    = quit q
+
+or list current aliases.
+
+=item command
+
+Execute command as a Perl statement.  A trailing semicolon will be
+supplied.  If the Perl statement would otherwise be confused for a
+Perl debugger, use a leading semicolon, too.
+
+=item m expr
+X<debugger command, m>
+
+List which methods may be called on the result of the evaluated
+expression.  The expression may evaluated to a reference to a
+blessed object, or to a package name.
+
+=item M
+X<debugger command, M>
+
+Displays all loaded modules and their versions
+
+
+=item man [manpage]
+X<debugger command, man>
+
+Despite its name, this calls your system's default documentation
+viewer on the given page, or on the viewer itself if I<manpage> is
+omitted.  If that viewer is B<man>, the current C<Config> information
+is used to invoke B<man> using the proper MANPATH or S<B<-M>
+I<manpath>> option.  Failed lookups of the form C<XXX> that match
+known manpages of the form I<perlXXX> will be retried.  This lets
+you type C<man debug> or C<man op> from the debugger.
+
+On systems traditionally bereft of a usable B<man> command, the
+debugger invokes B<perldoc>.  Occasionally this determination is
+incorrect due to recalcitrant vendors or rather more felicitously,
+to enterprising users.  If you fall into either category, just
+manually set the $DB::doccmd variable to whatever viewer to view
+the Perl documentation on your system.  This may be set in an rc
+file, or through direct assignment.  We're still waiting for a
+working example of something along the lines of:
+
+    $DB::doccmd = 'netscape -remote http://something.here/';
+
+=back
+
+=head2 Configurable Options
+
+The debugger has numerous options settable using the C<o> command,
+either interactively or from the environment or an rc file.
+(./.perldb or ~/.perldb under Unix.)
+
+
+=over 12
+
+=item C<recallCommand>, C<ShellBang>
+X<debugger option, recallCommand>
+X<debugger option, ShellBang>
+
+The characters used to recall command or spawn shell.  By
+default, both are set to C<!>, which is unfortunate.
+
+=item C<pager>
+X<debugger option, pager>
+
+Program to use for output of pager-piped commands (those beginning
+with a C<|> character.)  By default, C<$ENV{PAGER}> will be used.
+Because the debugger uses your current terminal characteristics
+for bold and underlining, if the chosen pager does not pass escape
+sequences through unchanged, the output of some debugger commands
+will not be readable when sent through the pager.
+
+=item C<tkRunning>
+X<debugger option, tkRunning>
+
+Run Tk while prompting (with ReadLine).
+
+=item C<signalLevel>, C<warnLevel>, C<dieLevel>
+X<debugger option, signalLevel> X<debugger option, warnLevel>
+X<debugger option, dieLevel>
+
+Level of verbosity.  By default, the debugger leaves your exceptions
+and warnings alone, because altering them can break correctly running
+programs.  It will attempt to print a message when uncaught INT, BUS, or
+SEGV signals arrive.  (But see the mention of signals in L<BUGS> below.)
+
+To disable this default safe mode, set these values to something higher
+than 0.  At a level of 1, you get backtraces upon receiving any kind
+of warning (this is often annoying) or exception (this is
+often valuable).  Unfortunately, the debugger cannot discern fatal
+exceptions from non-fatal ones.  If C<dieLevel> is even 1, then your
+non-fatal exceptions are also traced and unceremoniously altered if they
+came from C<eval'd> strings or from any kind of C<eval> within modules
+you're attempting to load.  If C<dieLevel> is 2, the debugger doesn't
+care where they came from:  It usurps your exception handler and prints
+out a trace, then modifies all exceptions with its own embellishments.
+This may perhaps be useful for some tracing purposes, but tends to hopelessly
+destroy any program that takes its exception handling seriously.
+
+=item C<AutoTrace>
+X<debugger option, AutoTrace>
+
+Trace mode (similar to C<t> command, but can be put into
+C<PERLDB_OPTS>).
+
+=item C<LineInfo>
+X<debugger option, LineInfo>
+
+File or pipe to print line number info to.  If it is a pipe (say,
+C<|visual_perl_db>), then a short message is used.  This is the
+mechanism used to interact with a slave editor or visual debugger,
+such as the special C<vi> or C<emacs> hooks, or the C<ddd> graphical
+debugger.
+
+=item C<inhibit_exit>
+X<debugger option, inhibit_exit>
+
+If 0, allows I<stepping off> the end of the script.
+
+=item C<PrintRet>
+X<debugger option, PrintRet>
+
+Print return value after C<r> command if set (default).
+
+=item C<ornaments>
+X<debugger option, ornaments>
+
+Affects screen appearance of the command line (see L<Term::ReadLine>).
+There is currently no way to disable these, which can render
+some output illegible on some displays, or with some pagers.
+This is considered a bug.
+
+=item C<frame>
+X<debugger option, frame>
+
+Affects the printing of messages upon entry and exit from subroutines.  If
+C<frame & 2> is false, messages are printed on entry only. (Printing
+on exit might be useful if interspersed with other messages.)
+
+If C<frame & 4>, arguments to functions are printed, plus context
+and caller info.  If C<frame & 8>, overloaded C<stringify> and
+C<tie>d C<FETCH> is enabled on the printed arguments.  If C<frame
+& 16>, the return value from the subroutine is printed.
+
+The length at which the argument list is truncated is governed by the
+next option:
+
+=item C<maxTraceLen>
+X<debugger option, maxTraceLen>
+
+Length to truncate the argument list when the C<frame> option's
+bit 4 is set.
+
+=item C<windowSize>
+X<debugger option, windowSize>
+
+Change the size of code list window (default is 10 lines).
+
+=back
+
+The following options affect what happens with C<V>, C<X>, and C<x>
+commands:
+
+=over 12
+
+=item C<arrayDepth>, C<hashDepth>
+X<debugger option, arrayDepth> X<debugger option, hashDepth>
+
+Print only first N elements ('' for all).
+
+=item C<dumpDepth>
+X<debugger option, dumpDepth>
+
+Limit recursion depth to N levels when dumping structures.
+Negative values are interpreted as infinity.  Default: infinity.
+
+=item C<compactDump>, C<veryCompact>
+X<debugger option, compactDump> X<debugger option, veryCompact>
+
+Change the style of array and hash output.  If C<compactDump>, short array
+may be printed on one line.
+
+=item C<globPrint>
+X<debugger option, globPrint>
+
+Whether to print contents of globs.
+
+=item C<DumpDBFiles>
+X<debugger option, DumpDBFiles>
+
+Dump arrays holding debugged files.
+
+=item C<DumpPackages>
+X<debugger option, DumpPackages>
+
+Dump symbol tables of packages.
+
+=item C<DumpReused>
+X<debugger option, DumpReused>
+
+Dump contents of "reused" addresses.
+
+=item C<quote>, C<HighBit>, C<undefPrint>
+X<debugger option, quote> X<debugger option, HighBit>
+X<debugger option, undefPrint>
+
+Change the style of string dump.  The default value for C<quote>
+is C<auto>; one can enable double-quotish or single-quotish format
+by setting it to C<"> or C<'>, respectively.  By default, characters
+with their high bit set are printed verbatim.
+
+=item C<UsageOnly>
+X<debugger option, UsageOnly>
+
+Rudimentary per-package memory usage dump.  Calculates total
+size of strings found in variables in the package.  This does not
+include lexicals in a module's file scope, or lost in closures.
+
+=back
+
+After the rc file is read, the debugger reads the C<$ENV{PERLDB_OPTS}>
+environment variable and parses this as the remainder of a "O ..."
+line as one might enter at the debugger prompt.  You may place the
+initialization options C<TTY>, C<noTTY>, C<ReadLine>, and C<NonStop>
+there.
+
+If your rc file contains:
+
+  parse_options("NonStop=1 LineInfo=db.out AutoTrace");
+
+then your script will run without human intervention, putting trace
+information into the file I<db.out>.  (If you interrupt it, you'd
+better reset C<LineInfo> to F</dev/tty> if you expect to see anything.)
+
+=over 12
+
+=item C<TTY>
+X<debugger option, TTY>
+
+The TTY to use for debugging I/O.
+
+=item C<noTTY>
+X<debugger option, noTTY>
+
+If set, the debugger goes into C<NonStop> mode and will not connect to a TTY.  If
+interrupted (or if control goes to the debugger via explicit setting of
+$DB::signal or $DB::single from the Perl script), it connects to a TTY
+specified in the C<TTY> option at startup, or to a tty found at
+runtime using the C<Term::Rendezvous> module of your choice.
+
+This module should implement a method named C<new> that returns an object
+with two methods: C<IN> and C<OUT>.  These should return filehandles to use
+for debugging input and output correspondingly.  The C<new> method should
+inspect an argument containing the value of C<$ENV{PERLDB_NOTTY}> at
+startup, or C<"$ENV{HOME}/.perldbtty$$"> otherwise.  This file is not
+inspected for proper ownership, so security hazards are theoretically
+possible.
+
+=item C<ReadLine>
+X<debugger option, ReadLine>
+
+If false, readline support in the debugger is disabled in order
+to debug applications that themselves use ReadLine.
+
+=item C<NonStop>
+X<debugger option, NonStop>
+
+If set, the debugger goes into non-interactive mode until interrupted, or
+programmatically by setting $DB::signal or $DB::single.
+
+=back
+
+Here's an example of using the C<$ENV{PERLDB_OPTS}> variable:
+
+    $ PERLDB_OPTS="NonStop frame=2" perl -d myprogram
+
+That will run the script B<myprogram> without human intervention,
+printing out the call tree with entry and exit points.  Note that
+C<NonStop=1 frame=2> is equivalent to C<N f=2>, and that originally,
+options could be uniquely abbreviated by the first letter (modulo
+the C<Dump*> options).  It is nevertheless recommended that you
+always spell them out in full for legibility and future compatibility.
+
+Other examples include
+
+    $ PERLDB_OPTS="NonStop LineInfo=listing frame=2" perl -d myprogram
+
+which runs script non-interactively, printing info on each entry
+into a subroutine and each executed line into the file named F<listing>.
+(If you interrupt it, you would better reset C<LineInfo> to something
+"interactive"!)
+
+Other examples include (using standard shell syntax to show environment
+variable settings):
+
+  $ ( PERLDB_OPTS="NonStop frame=1 AutoTrace LineInfo=tperl.out"
+      perl -d myprogram )
+
+which may be useful for debugging a program that uses C<Term::ReadLine>
+itself.  Do not forget to detach your shell from the TTY in the window that
+corresponds to F</dev/ttyXX>, say, by issuing a command like
+
+  $ sleep 1000000
+
+See L<perldebguts/"Debugger Internals"> for details.
+
+=head2 Debugger input/output
+
+=over 8
+
+=item Prompt
+
+The debugger prompt is something like
+
+    DB<8>
+
+or even
+
+    DB<<17>>
+
+where that number is the command number, and which you'd use to
+access with the built-in B<csh>-like history mechanism.  For example,
+C<!17> would repeat command number 17.  The depth of the angle
+brackets indicates the nesting depth of the debugger.  You could
+get more than one set of brackets, for example, if you'd already
+at a breakpoint and then printed the result of a function call that
+itself has a breakpoint, or you step into an expression via C<s/n/t
+expression> command.
+
+=item Multiline commands
+
+If you want to enter a multi-line command, such as a subroutine
+definition with several statements or a format, escape the newline
+that would normally end the debugger command with a backslash.
+Here's an example:
+
+      DB<1> for (1..4) {         \
+      cont:     print "ok\n";   \
+      cont: }
+      ok
+      ok
+      ok
+      ok
+
+Note that this business of escaping a newline is specific to interactive
+commands typed into the debugger.
+
+=item Stack backtrace
+X<backtrace> X<stack, backtrace>
+
+Here's an example of what a stack backtrace via C<T> command might
+look like:
+
+    $ = main::infested called from file `Ambulation.pm' line 10
+    @ = Ambulation::legs(1, 2, 3, 4) called from file `camel_flea' line 7
+    $ = main::pests('bactrian', 4) called from file `camel_flea' line 4
+
+The left-hand character up there indicates the context in which the
+function was called, with C<$> and C<@> meaning scalar or list
+contexts respectively, and C<.> meaning void context (which is
+actually a sort of scalar context).  The display above says
+that you were in the function C<main::infested> when you ran the
+stack dump, and that it was called in scalar context from line
+10 of the file I<Ambulation.pm>, but without any arguments at all,
+meaning it was called as C<&infested>.  The next stack frame shows
+that the function C<Ambulation::legs> was called in list context
+from the I<camel_flea> file with four arguments.  The last stack
+frame shows that C<main::pests> was called in scalar context,
+also from I<camel_flea>, but from line 4.
+
+If you execute the C<T> command from inside an active C<use>
+statement, the backtrace will contain both a C<require> frame and
+an C<eval>) frame.
+
+=item Line Listing Format
+
+This shows the sorts of output the C<l> command can produce:
+
+    DB<<13>> l
+  101:                @i{@i} = ();
+  102:b               @isa{@i,$pack} = ()
+  103                     if(exists $i{$prevpack} || exists $isa{$pack});
+  104             }
+  105
+  106             next
+  107==>              if(exists $isa{$pack});
+  108
+  109:a           if ($extra-- > 0) {
+  110:                %isa = ($pack,1);
+
+Breakable lines are marked with C<:>.  Lines with breakpoints are
+marked by C<b> and those with actions by C<a>.  The line that's
+about to be executed is marked by C<< ==> >>.
+
+Please be aware that code in debugger listings may not look the same
+as your original source code.  Line directives and external source
+filters can alter the code before Perl sees it, causing code to move
+from its original positions or take on entirely different forms.
+
+=item Frame listing
+
+When the C<frame> option is set, the debugger would print entered (and
+optionally exited) subroutines in different styles.  See L<perldebguts>
+for incredibly long examples of these.
+
+=back
+
+=head2 Debugging compile-time statements
+
+If you have compile-time executable statements (such as code within
+BEGIN and CHECK blocks or C<use> statements), these will I<not> be
+stopped by debugger, although C<require>s and INIT blocks will, and
+compile-time statements can be traced with C<AutoTrace> option set
+in C<PERLDB_OPTS>).  From your own Perl code, however, you can
+transfer control back to the debugger using the following statement,
+which is harmless if the debugger is not running:
+
+    $DB::single = 1;
+
+If you set C<$DB::single> to 2, it's equivalent to having
+just typed the C<n> command, whereas a value of 1 means the C<s>
+command.  The C<$DB::trace>  variable should be set to 1 to simulate
+having typed the C<t> command.
+
+Another way to debug compile-time code is to start the debugger, set a
+breakpoint on the I<load> of some module:
+
+    DB<7> b load f:/perllib/lib/Carp.pm
+  Will stop on load of `f:/perllib/lib/Carp.pm'.
+
+and then restart the debugger using the C<R> command (if possible).  One can use C<b
+compile subname> for the same purpose.
+
+=head2 Debugger Customization
+
+The debugger probably contains enough configuration hooks that you
+won't ever have to modify it yourself.  You may change the behaviour
+of debugger from within the debugger using its C<o> command, from
+the command line via the C<PERLDB_OPTS> environment variable, and
+from customization files.
+
+You can do some customization by setting up a F<.perldb> file, which
+contains initialization code.  For instance, you could make aliases
+like these (the last one is one people expect to be there):
+
+    $DB::alias{'len'}  = 's/^len(.*)/p length($1)/';
+    $DB::alias{'stop'} = 's/^stop (at|in)/b/';
+    $DB::alias{'ps'}   = 's/^ps\b/p scalar /';
+    $DB::alias{'quit'} = 's/^quit(\s*)/exit/';
+
+You can change options from F<.perldb> by using calls like this one;
+
+    parse_options("NonStop=1 LineInfo=db.out AutoTrace=1 frame=2");
+
+The code is executed in the package C<DB>.  Note that F<.perldb> is
+processed before processing C<PERLDB_OPTS>.  If F<.perldb> defines the
+subroutine C<afterinit>, that function is called after debugger
+initialization ends.  F<.perldb> may be contained in the current
+directory, or in the home directory.  Because this file is sourced
+in by Perl and may contain arbitrary commands, for security reasons,
+it must be owned by the superuser or the current user, and writable
+by no one but its owner.
+
+You can mock TTY input to debugger by adding arbitrary commands to
+@DB::typeahead. For example, your F<.perldb> file might contain:
+
+    sub afterinit { push @DB::typeahead, "b 4", "b 6"; }
+
+Which would attempt to set breakpoints on lines 4 and 6 immediately
+after debugger initialization. Note that @DB::typeahead is not a supported
+interface and is subject to change in future releases.
+
+If you want to modify the debugger, copy F<perl5db.pl> from the
+Perl library to another name and hack it to your heart's content.
+You'll then want to set your C<PERL5DB> environment variable to say
+something like this:
+
+    BEGIN { require "myperl5db.pl" }
+
+As a last resort, you could also use C<PERL5DB> to customize the debugger
+by directly setting internal variables or calling debugger functions.
+
+Note that any variables and functions that are not documented in
+this document (or in L<perldebguts>) are considered for internal
+use only, and as such are subject to change without notice.
+
+=head2 Readline Support
+
+As shipped, the only command-line history supplied is a simplistic one
+that checks for leading exclamation points.  However, if you install
+the Term::ReadKey and Term::ReadLine modules from CPAN, you will
+have full editing capabilities much like GNU I<readline>(3) provides.
+Look for these in the F<modules/by-module/Term> directory on CPAN.
+These do not support normal B<vi> command-line editing, however.
+
+A rudimentary command-line completion is also available.
+Unfortunately, the names of lexical variables are not available for
+completion.
+
+=head2 Editor Support for Debugging
+
+If you have the FSF's version of B<emacs> installed on your system,
+it can interact with the Perl debugger to provide an integrated
+software development environment reminiscent of its interactions
+with C debuggers.
+
+Perl comes with a start file for making B<emacs> act like a
+syntax-directed editor that understands (some of) Perl's syntax.
+Look in the I<emacs> directory of the Perl source distribution.
+
+A similar setup by Tom Christiansen for interacting with any
+vendor-shipped B<vi> and the X11 window system is also available.
+This works similarly to the integrated multiwindow support that
+B<emacs> provides, where the debugger drives the editor.  At the
+time of this writing, however, that tool's eventual location in the
+Perl distribution was uncertain.
+
+Users of B<vi> should also look into B<vim> and B<gvim>, the mousey
+and windy version, for coloring of Perl keywords.
+
+Note that only perl can truly parse Perl, so all such CASE tools
+fall somewhat short of the mark, especially if you don't program
+your Perl as a C programmer might.
+
+=head2 The Perl Profiler
+X<profile> X<profiling> X<profiler>
+
+If you wish to supply an alternative debugger for Perl to run, just
+invoke your script with a colon and a package argument given to the
+B<-d> flag.  The most popular alternative debuggers for Perl is the
+Perl profiler.  Devel::DProf is now included with the standard Perl
+distribution.  To profile your Perl program in the file F<mycode.pl>,
+just type:
+
+    $ perl -d:DProf mycode.pl
+
+When the script terminates the profiler will dump the profile
+information to a file called F<tmon.out>.  A tool like B<dprofpp>,
+also supplied with the standard Perl distribution, can be used to
+interpret the information in that profile.
+
+=head1 Debugging regular expressions
+X<regular expression, debugging>
+X<regex, debugging> X<regexp, debugging>
+
+C<use re 'debug'> enables you to see the gory details of how the Perl
+regular expression engine works. In order to understand this typically
+voluminous output, one must not only have some idea about how regular
+expression matching works in general, but also know how Perl's regular
+expressions are internally compiled into an automaton. These matters
+are explored in some detail in
+L<perldebguts/"Debugging regular expressions">.
+
+=head1 Debugging memory usage
+X<memory usage>
+
+Perl contains internal support for reporting its own memory usage,
+but this is a fairly advanced concept that requires some understanding
+of how memory allocation works.
+See L<perldebguts/"Debugging Perl memory usage"> for the details.
+
+=head1 SEE ALSO
+
+You did try the B<-w> switch, didn't you?
+
+L<perldebtut>,
+L<perldebguts>,
+L<re>,
+L<DB>,
+L<Devel::DProf>,
+L<dprofpp>,
+L<Dumpvalue>,
+and
+L<perlrun>.
+
+When debugging a script that uses #! and is thus normally found in
+$PATH, the -S option causes perl to search $PATH for it, so you don't
+have to type the path or C<which $scriptname>.
+
+  $ perl -Sd foo.pl
+
+=head1 BUGS
+
+You cannot get stack frame information or in any fashion debug functions
+that were not compiled by Perl, such as those from C or C++ extensions.
+
+If you alter your @_ arguments in a subroutine (such as with C<shift>
+or C<pop>), the stack backtrace will not show the original values.
+
+The debugger does not currently work in conjunction with the B<-W>
+command-line switch, because it itself is not free of warnings.
+
+If you're in a slow syscall (like C<wait>ing, C<accept>ing, or C<read>ing
+from your keyboard or a socket) and haven't set up your own C<$SIG{INT}>
+handler, then you won't be able to CTRL-C your way back to the debugger,
+because the debugger's own C<$SIG{INT}> handler doesn't understand that
+it needs to raise an exception to longjmp(3) out of slow syscalls.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldelta.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldelta.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldelta.pod	(revision 14489)
@@ -0,0 +1,1632 @@
+=head1 NAME
+
+perldelta - what is new for perl v5.8.8
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.8.7 release and
+the 5.8.8 release.
+
+=head1 Incompatible Changes
+
+There are no changes intentionally incompatible with 5.8.7. If any exist,
+they are bugs and reports are welcome.
+
+=head1 Core Enhancements
+
+=over
+
+=item *
+
+C<chdir>, C<chmod> and C<chown> can now work on filehandles as well as
+filenames, if the system supports respectively C<fchdir>, C<fchmod> and
+C<fchown>, thanks to a patch provided by Gisle Aas.
+
+=back
+
+=head1 Modules and Pragmata
+
+=over
+
+=item *
+
+C<Attribute::Handlers> upgraded to version 0.78_02
+
+=over
+
+=item *
+
+Documentation typo fix
+
+=back
+
+=item *
+
+C<attrs> upgraded to version 1.02
+
+=over
+
+=item *
+
+Internal cleanup only
+
+=back
+
+=item *
+
+C<autouse> upgraded to version 1.05
+
+=over
+
+=item *
+
+Simplified implementation
+
+=back
+
+=item *
+
+C<B> upgraded to version 1.09_01
+
+=over
+
+=item *
+
+The inheritance hierarchy of the C<B::> modules has been corrected;
+C<B::NV> now inherits from C<B::SV> (instead of C<B::IV>).
+
+=back
+
+=item *
+
+C<blib> upgraded to version 1.03
+
+=over
+
+=item *
+
+Documentation typo fix
+
+=back
+
+=item *
+
+C<ByteLoader> upgraded to version 0.06
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<CGI> upgraded to version 3.15
+
+=over
+
+=item *
+
+Extraneous "?" from C<self_url()> removed
+
+=item *
+
+C<scrolling_list()> select attribute fixed
+
+=item *
+
+C<virtual_port> now works properly with the https protocol
+
+=item *
+
+C<upload_hook()> and C<append()> now works in function-oriented mode
+
+=item *
+
+C<POST_MAX> doesn't cause the client to hang any more
+
+=item *
+
+Automatic tab indexes are now disabled and new C<-tabindex> pragma has
+been added to turn automatic indexes back on
+
+=item *
+
+C<end_form()> doesn't emit empty (and non-validating) C<< <div> >>
+
+=item *
+
+C<CGI::Carp> works better in certain mod_perl configurations
+
+=item *
+
+Setting C<$CGI::TMPDIRECTORY> is now effective
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<charnames> upgraded to version 1.05
+
+=over
+
+=item *
+
+C<viacode()> now accept hex strings and has been optimized.
+
+=back
+
+=item *
+
+C<CPAN> upgraded to version 1.76_02
+
+=over
+
+=item *
+
+1 minor bug fix for Win32
+
+=back
+
+=item *
+
+C<Cwd> upgraded to version 3.12
+
+=over
+
+=item *
+
+C<canonpath()> on Win32 now collapses F<foo\..> sections correctly.
+
+=item *
+
+Improved behaviour on Symbian OS.
+
+=item *
+
+Enhanced documentation and typo fixes
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Data::Dumper> upgraded to version 2.121_08
+
+=over
+
+=item *
+
+A problem where C<Data::Dumper> would sometimes update the iterator state
+of hashes has been fixed
+
+=item *
+
+Numeric labels now work
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<DB> upgraded to version 1.01
+
+=over
+
+=item *
+
+A problem where the state of the regexp engine would sometimes get clobbered when running
+under the debugger has been fixed.
+
+=back
+
+=item *
+
+C<DB_File> upgraded to version 1.814
+
+=over
+
+=item *
+
+Adds support for Berkeley DB 4.4.
+
+=back
+
+=item *
+
+C<Devel::DProf> upgraded to version 20050603.00
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Devel::Peek> upgraded to version 1.03
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Devel::PPPort> upgraded to version 3.06_01
+
+=over
+
+=item *
+
+C<--compat-version> argument checking has been improved
+
+=item *
+
+Files passed on the command line are filtered by default
+
+=item *
+
+C<--nofilter> option to override the filtering has been added
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<diagnostics> upgraded to version 1.15
+
+=over
+
+=item *
+
+Documentation typo fix
+
+=back
+
+=item *
+
+C<Digest> upgraded to version 1.14
+
+=over
+
+=item *
+
+The constructor now knows which module implements SHA-224
+
+=item *
+
+Documentation tweaks and typo fixes
+
+=back
+
+=item *
+
+C<Digest::MD5> upgraded to version 2.36
+
+=over
+
+=item *
+
+C<XSLoader> is now used for faster loading
+
+=item *
+
+Enhanced documentation including MD5 weaknesses discovered lately
+
+=back
+
+=item *
+
+C<Dumpvalue> upgraded to version 1.12
+
+=over
+
+=item *
+
+Documentation fix
+
+=back
+
+=item *
+
+C<DynaLoader> upgraded but unfortunately we're not able to increment its version number :-(
+
+=over
+
+=item *
+
+Implements C<dl_unload_file> on Win32
+
+=item *
+
+Internal cleanup
+
+=item *
+
+C<XSLoader> 0.06 incorporated; small optimisation for calling
+C<bootstrap_inherit()> and documentation enhancements.
+
+=back
+
+=item *
+
+C<Encode> upgraded to version 2.12
+
+=over
+
+=item *
+
+A coderef is now acceptable for C<CHECK>!
+
+=item *
+
+3 new characters added to the ISO-8859-7 encoding
+
+=item *
+
+New encoding C<MIME-Header-ISO_2022_JP> added
+
+=item *
+
+Problem with partial characters and C<< encoding(utf-8-strict) >> fixed.
+
+=item *
+
+Documentation enhancements and typo fixes
+
+=back
+
+=item *
+
+C<English> upgraded to version 1.02
+
+=over
+
+=item *
+
+the C<< $COMPILING >> variable has been added
+
+=back
+
+=item *
+
+C<ExtUtils::Constant> upgraded to version 0.17
+
+=over
+
+=item *
+
+Improved compatibility with older versions of perl
+
+=back
+
+=item *
+
+C<ExtUtils::MakeMaker> upgraded to version 6.30 (was 6.17)
+
+=over
+
+=item *
+
+Too much to list here;  see L<http://search.cpan.org/src/MSCHWERN/ExtUtils-MakeMaker-6.30/Changes>
+
+=back
+
+=item *
+
+C<File::Basename> upgraded to version 2.74, with changes contributed by Michael Schwern.
+
+=over
+
+=item *
+
+Documentation clarified and errors corrected.
+
+=item *
+
+C<basename> now strips trailing path separators before processing the name.
+
+=item *
+
+C<basename> now returns C</> for parameter C</>, to make C<basename>
+consistent with the shell utility of the same name.
+
+=item *
+
+The suffix is no longer stripped if it is identical to the remaining characters
+in the name, again for consistency with the shell utility.
+
+=item *
+
+Some internal code cleanup.
+
+=back
+
+=item *
+
+C<File::Copy> upgraded to version 2.09
+
+=over
+
+=item *
+
+Copying a file onto itself used to fail.
+
+=item *
+
+Moving a file between file systems now preserves the access and
+modification time stamps
+
+=back
+
+=item *
+
+C<File::Find> upgraded to version 1.10
+
+=over
+
+=item *
+
+Win32 portability fixes
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<File::Glob> upgraded to version 1.05
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<File::Path> upgraded to version 1.08
+
+=over
+
+=item *
+
+C<mkpath> now preserves C<errno> when C<mkdir> fails
+
+=back
+
+=item *
+
+C<File::Spec> upgraded to version 3.12
+
+=over
+
+=item *
+
+C<File::Spec->rootdir()> now returns C<\> on Win32, instead of C</>
+
+=item *
+
+C<$^O> could sometimes become tainted. This has been fixed.
+
+=item *
+
+C<canonpath> on Win32 now collapses C<foo/..> (or C<foo\..>) sections
+correctly, rather than doing the "misguided" work it was previously doing.
+Note that C<canonpath> on Unix still does B<not> collapse these sections, as
+doing so would be incorrect.
+
+=item *
+
+Some documentation improvements
+
+=item *
+
+Some internal code cleanup
+
+=back
+
+=item *
+
+C<FileCache> upgraded to version 1.06
+
+=over
+
+=item *
+
+POD formatting errors in the documentation fixed
+
+=back
+
+=item *
+
+C<Filter::Simple> upgraded to version 0.82
+
+=item *
+
+C<FindBin> upgraded to version 1.47
+
+=over
+
+=item *
+
+Now works better with directories where access rights are more
+restrictive than usual.
+
+=back
+
+=item *
+
+C<GDBM_File> upgraded to version 1.08
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Getopt::Long> upgraded to version 2.35
+
+=over
+
+=item *
+
+C<prefix_pattern> has now been complemented by a new configuration
+option C<long_prefix_pattern> that allows the user to specify what
+prefix patterns should have long option style semantics applied.
+
+=item *
+
+Options can now take multiple values at once (experimental)
+
+=item *
+
+Various bug fixes
+
+=back
+
+=item *
+
+C<if> upgraded to version 0.05
+
+=over
+
+=item *
+
+Give more meaningful error messages from C<if> when invoked with a
+condition in list context.
+
+=item *
+
+Restore backwards compatibility with earlier versions of perl
+
+=back
+
+=item *
+
+C<IO> upgraded to version 1.22
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<IPC::Open2> upgraded to version 1.02
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<IPC::Open3> upgraded to version 1.02
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<List::Util> upgraded to version 1.18 (was 1.14)
+
+=over
+
+=item *
+
+Fix pure-perl version of C<refaddr> to avoid blessing an un-blessed reference
+
+=item *
+
+Use C<XSLoader> for faster loading
+
+=item *
+
+Fixed various memory leaks
+
+=item *
+
+Internal cleanup and portability fixes
+
+=back
+
+=item *
+
+C<Math::Complex> upgraded to version 1.35
+
+=over
+
+=item *
+
+C<atan2(0, i)> now works, as do all the (computable) complex argument cases
+
+=item *
+
+Fixes for certain bugs in C<make> and C<emake>
+
+=item *
+
+Support returning the I<k>th root directly
+
+=item *
+
+Support C<[2,-3pi/8]> in C<emake>
+
+=item *
+
+Support C<inf> for C<make>/C<emake>
+
+=item *
+
+Document C<make>/C<emake> more visibly
+
+=back
+
+=item *
+
+C<Math::Trig> upgraded to version 1.03
+
+=over
+
+=item *
+
+Add more great circle routines: C<great_circle_waypoint> and
+C<great_circle_destination>
+
+=back
+
+=item *
+
+C<MIME::Base64> upgraded to version 3.07
+
+=over
+
+=item *
+
+Use C<XSLoader> for faster loading
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<NDBM_File> upgraded to version 1.06
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<ODBM_File> upgraded to version 1.06
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Opcode> upgraded to version 1.06
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<open> upgraded to version 1.05
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<overload> upgraded to version 1.04
+
+=over
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<PerlIO> upgraded to version 1.04
+
+=over
+
+=item *
+
+C<PerlIO::via> iterate over layers properly now
+
+=item *
+
+C<PerlIO::scalar> understands C<< $/ = "" >> now
+
+=item *
+
+C<encoding(utf-8-strict)> with partial characters now works
+
+=item *
+
+Enhanced documentation
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Pod::Functions> upgraded to version 1.03
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<Pod::Html> upgraded to version 1.0504
+
+=over
+
+=item *
+
+HTML output will now correctly link
+to C<=item>s on the same page, and should be valid XHTML.
+
+=item *
+
+Variable names are recognized as intended
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<Pod::Parser> upgraded to version 1.32
+
+=over
+
+=item *
+
+Allow files that start with C<=head> on the first line
+
+=item *
+
+Win32 portability fix
+
+=item *
+
+Exit status of C<pod2usage> fixed
+
+=item *
+
+New C<-noperldoc> switch for C<pod2usage>
+
+=item *
+
+Arbitrary URL schemes now allowed
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<POSIX> upgraded to version 1.09
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<re> upgraded to version 0.05
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=back
+
+=item *
+
+C<Safe> upgraded to version 2.12
+
+=over
+
+=item *
+
+Minor documentation enhancement
+
+=back
+
+=item *
+
+C<SDBM_File> upgraded to version 1.05
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Socket> upgraded to version 1.78
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=item *
+
+C<Storable> upgraded to version 2.15
+
+=over
+
+=item *
+
+This includes the C<STORABLE_attach> hook functionality added by
+Adam Kennedy, and more frugal memory requirements when storing under C<ithreads>, by
+using the C<ithreads> cloning tracking code.
+
+=back
+
+=item *
+
+C<Switch> upgraded to version 2.10_01
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<Sys::Syslog> upgraded to version 0.13
+
+=over
+
+=item *
+
+Now provides numeric macros and meaningful C<Exporter> tags.
+
+=item *
+
+No longer uses C<Sys::Hostname> as it may provide useless values in
+unconfigured network environments, so instead uses C<INADDR_LOOPBACK> directly.
+
+=item *
+
+C<syslog()> now uses local timestamp.
+
+=item *
+
+C<setlogmask()> now behaves like its C counterpart.
+
+=item *
+
+C<setlogsock()> will now C<croak()> as documented.
+
+=item *
+
+Improved error and warnings messages.
+
+=item *
+
+Improved documentation.
+
+=back
+
+=item *
+
+C<Term::ANSIColor> upgraded to version 1.10
+
+=over
+
+=item *
+
+Fixes a bug in C<colored> when C<$EACHLINE> is set that caused it to not color
+lines consisting solely of 0 (literal zero).
+
+=item *
+
+Improved tests.
+
+=back
+
+=item *
+
+C<Term::ReadLine> upgraded to version 1.02
+
+=over
+
+=item *
+
+Documentation tweaks
+
+=back
+
+=item *
+
+C<Test::Harness> upgraded to version 2.56 (was 2.48)
+
+=over
+
+=item *
+
+The C<Test::Harness> timer is now off by default.
+
+=item *
+
+Now shows elapsed time in milliseconds.
+
+=item *
+
+Various bug fixes
+
+=back
+
+=item *
+
+C<Test::Simple> upgraded to version 0.62 (was 0.54)
+
+=over
+
+=item *
+
+C<is_deeply()> no longer fails to work for many cases
+
+=item *
+
+Various minor bug fixes
+
+=item *
+
+Documentation enhancements
+
+=back
+
+=item *
+
+C<Text::Tabs> upgraded to version 2005.0824
+
+=over
+
+=item *
+
+Provides a faster implementation of C<expand>
+
+=back
+
+=item *
+
+C<Text::Wrap> upgraded to version 2005.082401
+
+=over
+
+=item *
+
+Adds C<$Text::Wrap::separator2>, which allows you to preserve existing newlines
+but add line-breaks with some other string.
+
+=back
+
+=item *
+
+C<threads> upgraded to version 1.07
+
+=over
+
+=item *
+
+C<threads> will now honour C<no warnings 'threads'>
+
+=item *
+
+A thread's interpreter is now freed after C<< $t->join() >> rather than after
+C<undef $t>, which should fix some C<ithreads> memory leaks. (Fixed by Dave
+Mitchell)
+
+=item *
+
+Some documentation typo fixes.
+
+=back
+
+=item *
+
+C<threads::shared> upgraded to version 0.94
+
+=over
+
+=item *
+
+Documentation changes only
+
+=item *
+
+Note: An improved implementation of C<threads::shared> is available on
+CPAN - this will be merged into 5.8.9 if it proves stable.
+
+=back
+
+=item *
+
+C<Tie::Hash> upgraded to version 1.02
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=back
+
+=item *
+
+C<Time::HiRes> upgraded to version 1.86 (was 1.66)
+
+=over
+
+=item *
+
+C<clock_nanosleep()> and C<clock()> functions added
+
+=item *
+
+Support for the POSIX C<clock_gettime()> and C<clock_getres()> has been added
+
+=item *
+
+Return C<undef> or an empty list if the C C<gettimeofday()> function fails
+
+=item *
+
+Improved C<nanosleep> detection
+
+=item *
+
+Internal cleanup
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<Unicode::Collate> upgraded to version 0.52
+
+=over
+
+=item *
+
+Now implements UCA Revision 14 (based on Unicode 4.1.0).
+
+=item *
+
+C<Unicode::Collate->new> method no longer overwrites user's C<$_>
+
+=item *
+
+Enhanced documentation
+
+=back
+
+=item *
+
+C<Unicode::UCD> upgraded to version 0.24
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<User::grent> upgraded to version 1.01
+
+=over
+
+=item *
+
+Documentation typo fixed
+
+=back
+
+=item *
+
+C<utf8> upgraded to version 1.06
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<vmsish> upgraded to version 1.02
+
+=over
+
+=item *
+
+Documentation typos fixed
+
+=back
+
+=item *
+
+C<warnings> upgraded to version 1.05
+
+=over
+
+=item *
+
+Gentler messing with C<Carp::> internals
+
+=item *
+
+Internal cleanup
+
+=item *
+
+Documentation update
+
+=back
+
+=item *
+
+C<Win32> upgraded to version 0.2601
+
+=for cynics And how many perl 5.8.x versions can I release ahead of Vista?
+
+=over
+
+=item *
+
+Provides Windows Vista support to C<Win32::GetOSName>
+
+=item *
+
+Documentation enhancements
+
+=back
+
+=item *
+
+C<XS::Typemap> upgraded to version 0.02
+
+=over
+
+=item *
+
+Internal cleanup
+
+=back
+
+=back
+
+=head1 Utility Changes
+
+=head2 C<h2xs> enhancements
+
+C<h2xs> implements new option C<--use-xsloader> to force use of
+C<XSLoader> even in backwards compatible modules.
+
+The handling of authors' names that had apostrophes has been fixed.
+
+Any enums with negative values are now skipped.
+
+=head2 C<perlivp> enhancements
+
+C<perlivp> implements new option C<-a> and will not check for F<*.ph>
+files by default any more.  Use the C<-a> option to run I<all> tests.
+
+=head1 New Documentation
+
+The L<perlglossary> manpage is a glossary of terms used in the Perl
+documentation, technical and otherwise, kindly provided by O'Reilly Media,
+inc.
+
+=head1 Performance Enhancements
+
+=over 4
+
+=item *
+
+Weak reference creation is now I<O(1)> rather than I<O(n)>, courtesy of
+Nicholas Clark. Weak reference deletion remains I<O(n)>, but if deletion only
+happens at program exit, it may be skipped completely.
+
+=item *
+
+Salvador Fandiño provided improvements to reduce the memory usage of C<sort>
+and to speed up some cases.
+
+=item *
+
+Jarkko Hietaniemi and Andy Lester worked to mark as much data as possible in
+the C source files as C<static>, to increase the proportion of the executable
+file that the operating system can share between process, and thus reduce
+real memory usage on multi-user systems.
+
+=back
+
+=head1 Installation and Configuration Improvements
+
+Parallel makes should work properly now, although there may still be problems
+if C<make test> is instructed to run in parallel.
+
+Building with Borland's compilers on Win32 should work more smoothly. In
+particular Steve Hay has worked to side step many warnings emitted by their
+compilers and at least one C compiler internal error.
+
+C<Configure> will now detect C<clearenv> and C<unsetenv>, thanks to a patch
+from Alan Burlison. It will also probe for C<futimes> and whether C<sprintf>
+correctly returns the length of the formatted string, which will both be used
+in perl 5.8.9.
+
+There are improved hints for next-3.0, vmesa, IX, Darwin, Solaris, Linux,
+DEC/OSF, HP-UX and MPE/iX
+
+Perl extensions on Windows now can be statically built into the Perl DLL,
+thanks to a work by Vadim Konovalov. (This improvement was actually in 5.8.7,
+but was accidentally omitted from L<perl587delta>).
+
+=head1 Selected Bug Fixes
+
+=head2 no warnings 'category' works correctly with -w
+
+Previously when running with warnings enabled globally via C<-w>, selective
+disabling of specific warning categories would actually turn off all warnings.
+This is now fixed; now C<no warnings 'io';> will only turn off warnings in the
+C<io> class. Previously it would erroneously turn off all warnings.
+
+This bug fix may cause some programs to start correctly issuing warnings.
+
+=head2 Remove over-optimisation
+
+Perl 5.8.4 introduced a change so that assignments of C<undef> to a
+scalar, or of an empty list to an array or a hash, were optimised away. As
+this could cause problems when C<goto> jumps were involved, this change
+has been backed out.
+
+=head2 sprintf() fixes
+
+Using the sprintf() function with some formats could lead to a buffer
+overflow in some specific cases. This has been fixed, along with several
+other bugs, notably in bounds checking.
+
+In related fixes, it was possible for badly written code that did not follow
+the documentation of C<Sys::Syslog> to have formatting vulnerabilities.
+C<Sys::Syslog> has been changed to protect people from poor quality third
+party code.
+
+=head2 Debugger and Unicode slowdown
+
+It had been reported that running under perl's debugger when processing
+Unicode data could cause unexpectedly large slowdowns. The most likely cause
+of this was identified and fixed by Nicholas Clark.
+
+=head2 Smaller fixes
+
+=over 4
+
+=item *
+
+C<FindBin> now works better with directories where access rights are more
+restrictive than usual.
+
+=item *
+
+Several memory leaks in ithreads were closed. An improved implementation of
+C<threads::shared> is available on CPAN - this will be merged into 5.8.9 if
+it proves stable.
+
+=item *
+
+Trailing spaces are now trimmed from C<$!> and C<$^E>.
+
+=item *
+
+Operations that require perl to read a process' list of groups, such as reads
+of C<$(> and C<$)>, now dynamically allocate memory rather than using a
+fixed sized array. The fixed size array could cause C stack exhaustion on
+systems configured to use large numbers of groups.
+
+=item *
+
+C<PerlIO::scalar> now works better with non-default C<$/> settings.
+
+=item *
+
+You can now use the C<x> operator to repeat a C<qw//> list. This used
+to raise a syntax error.
+
+=item *
+
+The debugger now traces correctly execution in eval("")uated code that
+contains #line directives.
+
+=item *
+
+The value of the C<open> pragma is no longer ignored for three-argument
+opens.
+
+=item *
+
+The optimisation of C<for (reverse @a)> introduced in perl 5.8.6 could
+misbehave when the array had undefined elements and was used in LVALUE
+context. Dave Mitchell provided a fix.
+
+=item *
+
+Some case insensitive matches between UTF-8 encoded data and 8 bit regexps,
+and vice versa, could give malformed character warnings. These have been
+fixed by Dave Mitchell and Yves Orton.
+
+=item *
+
+C<lcfirst> and C<ucfirst> could corrupt the string for certain cases where
+the length UTF-8 encoding of the string in lower case, upper case or title
+case differed. This was fixed by Nicholas Clark.
+
+=item *
+
+Perl will now use the C library calls C<unsetenv> and C<clearenv> if present
+to delete keys from C<%ENV> and delete C<%ENV> entirely, thanks to a patch
+from Alan Burlison.
+
+=back
+
+=head1 New or Changed Diagnostics
+
+=head2 Attempt to set length of freed array
+
+This is a new warning, produced in situations such as this:
+
+    $r = do {my @a; \$#a};
+    $$r = 503;
+
+=head2 Non-string passed as bitmask
+
+This is a new warning, produced when number has been passed as a argument to
+select(), instead of a bitmask.
+
+    # Wrong, will now warn
+    $rin = fileno(STDIN);
+    ($nfound,$timeleft) = select($rout=$rin, undef, undef, $timeout);
+    
+    # Should be
+    $rin = '';
+    vec($rin,fileno(STDIN),1) = 1;
+    ($nfound,$timeleft) = select($rout=$rin, undef, undef, $timeout);
+
+=head2 Search pattern not terminated or ternary operator parsed as search pattern
+
+This syntax error indicates that the lexer couldn't find the final
+delimiter of a C<?PATTERN?> construct. Mentioning the ternary operator in
+this error message makes it easier to diagnose syntax errors.
+
+=head1 Changed Internals
+
+There has been a fair amount of refactoring of the C<C> source code, partly to
+make it tidier and more maintainable. The resulting object code and the
+C<perl> binary may well be smaller than 5.8.7, in particular due to a change
+contributed by Dave Mitchell which reworked the warnings code to be
+significantly smaller. Apart from being smaller and possibly faster, there
+should be no user-detectable changes.
+
+Andy Lester supplied many improvements to determine which function
+parameters and local variables could actually be declared C<const> to the C
+compiler. Steve Peters provided new C<*_set> macros and reworked the core to
+use these rather than assigning to macros in LVALUE context.
+
+Dave Mitchell improved the lexer debugging output under C<-DT>
+
+Nicholas Clark changed the string buffer allocation so that it is now rounded
+up to the next multiple of 4 (or 8 on platforms with 64 bit pointers). This
+should reduce the number of calls to C<realloc> without actually using any
+extra memory.
+
+The C<HV>'s array of C<HE*>s is now allocated at the correct (minimal) size,
+thanks to another change by Nicholas Clark. Compile with
+C<-DPERL_USE_LARGE_HV_ALLOC> to use the old, sloppier, default.
+
+For XS or embedding debugging purposes, if perl is compiled with
+C<-DDEBUG_LEAKING_SCALARS_FORK_DUMP> in addition to
+C<-DDEBUG_LEAKING_SCALARS> then a child process is C<fork>ed just before
+global destruction, which is used to display the values of any scalars
+found to have leaked at the end of global destruction. Without this, the
+scalars have already been freed sufficiently at the point of detection that
+it is impossible to produce any meaningful dump of their contents.  This
+feature was implemented by the indefatigable Nicholas Clark, based on an idea
+by Mike Giroux.
+
+=head1 Platform Specific Problems
+
+The optimiser on HP-UX 11.23 (Itanium 2) is currently partly disabled (scaled
+down to +O1) when using HP C-ANSI-C; the cause of problems at higher
+optimisation levels is still unclear.
+
+There are a handful of remaining test failures on VMS, mostly due to
+test fixes and minor module tweaks with too many dependencies to
+integrate into this release from the development stream, where they have
+all been corrected.  The following is a list of expected failures with
+the patch number of the fix where that is known:
+
+    ext/Devel/PPPort/t/ppphtest.t  #26913
+    ext/List/Util/t/p_tainted.t    #26912
+    lib/ExtUtils/t/PL_FILES.t      #26813
+    lib/ExtUtils/t/basic.t         #26813
+    t/io/fs.t
+    t/op/cmp.t
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles
+recently posted to the comp.lang.perl.misc newsgroup and the perl
+bug database at http://bugs.perl.org.  There may also be
+information at http://www.perl.org, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release.  Be sure to trim your bug down
+to a tiny but sufficient test case.  Your bug report, along with the
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
+analysed by the Perl porting team.  You can browse and search
+the Perl 5 bugs at http://bugs.perl.org/
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldgux.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldgux.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldgux.pod	(revision 14489)
@@ -0,0 +1,117 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perldgux - Perl under DG/UX.
+
+=head1 SYNOPSIS
+
+One can read this document in the following formats:
+
+        man perldgux
+        view perl perldgux
+        explorer perldgux.html
+        info perldgux
+
+to list some (not all may be available simultaneously), or it may
+be read I<as is>: as F<README.dgux>.
+
+=cut
+
+Contents
+
+ perldgux - Perl under DG/UX.
+
+      NAME
+      SYNOPSIS
+      DESCRIPTION
+      BUILD
+         -  Non-threaded Case
+         -  Threaded Case
+         -  Testing
+         -  Installing the built perl
+      AUTHOR
+      SEE ALSO
+
+=head1 DESCRIPTION
+
+Perl 5.7/8.x for DG/UX ix86 R4.20MU0x
+
+=head1 BUILDING PERL ON DG/UX
+
+=head2 Non-threaded Perl on DG/UX
+
+Just run ./Configure script from the top directory.
+Then give "make" to compile.
+
+=head2 Threaded Perl on DG/UX
+
+If you are using as compiler GCC-2.95.x rev(DG/UX)
+an easy solution for configuring perl in your DG/UX
+machine is to run the command:
+
+./Configure -Dusethreads -Duseithreads -Dusedevel -des
+
+This will automatically accept all the defaults and
+in particular /usr/local/ as installation directory.
+Note that GCC-2.95.x rev(DG/UX) knows the switch
+-pthread which allows it to link correctly DG/UX's
+-lthread library.
+
+If you want to change the installation directory or
+have a standard DG/UX with C compiler GCC-2.7.2.x
+then you have no choice than to do an interactive
+build by issuing the command:
+
+./Configure -Dusethreads -Duseithreads
+
+In particular with GCC-2.7.2.x accept all the defaults
+and *watch* out for the message:
+
+    Any additional ld flags (NOT including libraries)? [ -pthread]
+
+Instead of -pthread put here -lthread. CGCC-2.7.2.x
+that comes with the DG/UX OS does NOT know the -pthread
+switch. So your build will fail if you choose the defaults.
+After configuration is done correctly give "make" to compile.
+
+=head2 Testing Perl on DG/UX
+
+Issuing a "make test" will run all the tests. 
+If the test lib/ftmp-security gives you as a result
+something like
+
+    lib/ftmp-security....File::Temp::_gettemp:
+    Parent directory (/tmp/) is not safe (sticky bit not set
+    when world writable?) at lib/ftmp-security.t line 100
+
+don't panic and just set the sticky bit in your /tmp
+directory by doing the following as root:
+
+cd /
+chmod +t /tmp (=set the sticky bit to /tmp).
+
+Then rerun the tests. This time all must be OK.
+
+=head2 Installing the built perl on DG/UX
+
+Run the command "make install"
+
+=head1 AUTHOR
+
+Takis Psarogiannakopoulos
+Universirty of Cambridge
+Centre for Mathematical Sciences
+Department of Pure Mathematics
+Wilberforce road
+Cambridge CB3 0WB , UK
+email <takis@XFree86.Org>
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldiag.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldiag.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldiag.pod	(revision 14489)
@@ -0,0 +1,4614 @@
+=head1 NAME
+
+perldiag - various Perl diagnostics
+
+=head1 DESCRIPTION
+
+These messages are classified as follows (listed in increasing order of
+desperation):
+
+    (W) A warning (optional).
+    (D) A deprecation (optional).
+    (S) A severe warning (default).
+    (F) A fatal error (trappable).
+    (P) An internal error you should never see (trappable).
+    (X) A very fatal error (nontrappable).
+    (A) An alien error message (not generated by Perl).
+
+The majority of messages from the first three classifications above
+(W, D & S) can be controlled using the C<warnings> pragma.
+
+If a message can be controlled by the C<warnings> pragma, its warning
+category is included with the classification letter in the description
+below.
+
+Optional warnings are enabled by using the C<warnings> pragma or the B<-w>
+and B<-W> switches. Warnings may be captured by setting C<$SIG{__WARN__}>
+to a reference to a routine that will be called on each warning instead
+of printing it.  See L<perlvar>.
+
+Default warnings are always enabled unless they are explicitly disabled
+with the C<warnings> pragma or the B<-X> switch.
+
+Trappable errors may be trapped using the eval operator.  See
+L<perlfunc/eval>.  In almost all cases, warnings may be selectively
+disabled or promoted to fatal errors using the C<warnings> pragma.
+See L<warnings>.
+
+The messages are in alphabetical order, without regard to upper or
+lower-case.  Some of these messages are generic.  Spots that vary are
+denoted with a %s or other printf-style escape.  These escapes are
+ignored by the alphabetical order, as are all characters other than
+letters.  To look up your message, just ignore anything that is not a
+letter.
+
+=over 4
+
+=item accept() on closed socket %s
+
+(W closed) You tried to do an accept on a closed socket.  Did you forget
+to check the return value of your socket() call?  See
+L<perlfunc/accept>.
+
+=item Allocation too large: %lx
+
+(X) You can't allocate more than 64K on an MS-DOS machine.
+
+=item '!' allowed only after types %s
+
+(F) The '!' is allowed in pack() or unpack() only after certain types.
+See L<perlfunc/pack>.
+
+=item Ambiguous call resolved as CORE::%s(), qualify as such or use &
+
+(W ambiguous) A subroutine you have declared has the same name as a Perl
+keyword, and you have used the name without qualification for calling
+one or the other.  Perl decided to call the builtin because the
+subroutine is not imported.
+
+To force interpretation as a subroutine call, either put an ampersand
+before the subroutine name, or qualify the name with its package.
+Alternatively, you can import the subroutine (or pretend that it's
+imported with the C<use subs> pragma).
+
+To silently interpret it as the Perl operator, use the C<CORE::> prefix
+on the operator (e.g. C<CORE::log($x)>) or declare the subroutine
+to be an object method (see L<perlsub/"Subroutine Attributes"> or
+L<attributes>).
+
+=item Ambiguous range in transliteration operator
+
+(F) You wrote something like C<tr/a-z-0//> which doesn't mean anything at
+all.  To include a C<-> character in a transliteration, put it either
+first or last.  (In the past, C<tr/a-z-0//> was synonymous with
+C<tr/a-y//>, which was probably not what you would have expected.)
+
+=item Ambiguous use of %s resolved as %s
+
+(W ambiguous)(S) You said something that may not be interpreted the way
+you thought.  Normally it's pretty easy to disambiguate it by supplying
+a missing quote, operator, parenthesis pair or declaration.
+
+=item '|' and '<' may not both be specified on command line
+
+(F) An error peculiar to VMS.  Perl does its own command line
+redirection, and found that STDIN was a pipe, and that you also tried to
+redirect STDIN using '<'.  Only one STDIN stream to a customer, please.
+
+=item '|' and '>' may not both be specified on command line
+
+(F) An error peculiar to VMS.  Perl does its own command line
+redirection, and thinks you tried to redirect stdout both to a file and
+into a pipe to another command.  You need to choose one or the other,
+though nothing's stopping you from piping into a program or Perl script
+which 'splits' output into two streams, such as
+
+    open(OUT,">$ARGV[0]") or die "Can't write to $ARGV[0]: $!";
+    while (<STDIN>) {
+        print;
+        print OUT;
+    }
+    close OUT;
+
+=item Applying %s to %s will act on scalar(%s)
+
+(W misc) The pattern match (C<//>), substitution (C<s///>), and
+transliteration (C<tr///>) operators work on scalar values.  If you apply
+one of them to an array or a hash, it will convert the array or hash to
+a scalar value -- the length of an array, or the population info of a
+hash -- and then work on that scalar value.  This is probably not what
+you meant to do.  See L<perlfunc/grep> and L<perlfunc/map> for
+alternatives.
+
+=item Args must match #! line
+
+(F) The setuid emulator requires that the arguments Perl was invoked
+with match the arguments specified on the #! line.  Since some systems
+impose a one-argument limit on the #! line, try combining switches;
+for example, turn C<-w -U> into C<-wU>.
+
+=item Arg too short for msgsnd
+
+(F) msgsnd() requires a string at least as long as sizeof(long).
+
+=item %s argument is not a HASH or ARRAY element
+
+(F) The argument to exists() must be a hash or array element, such as:
+
+    $foo{$bar}
+    $ref->{"susie"}[12]
+
+=item %s argument is not a HASH or ARRAY element or slice
+
+(F) The argument to delete() must be either a hash or array element,
+such as:
+
+    $foo{$bar}
+    $ref->{"susie"}[12]
+
+or a hash or array slice, such as:
+
+    @foo[$bar, $baz, $xyzzy]
+    @{$ref->[12]}{"susie", "queue"}
+
+=item %s argument is not a subroutine name
+
+(F) The argument to exists() for C<exists &sub> must be a subroutine
+name, and not a subroutine call.  C<exists &sub()> will generate this
+error.
+
+=item Argument "%s" isn't numeric%s
+
+(W numeric) The indicated string was fed as an argument to an operator
+that expected a numeric value instead.  If you're fortunate the message
+will identify which operator was so unfortunate.
+
+=item Argument list not closed for PerlIO layer "%s"
+
+(W layer) When pushing a layer with arguments onto the Perl I/O system you
+forgot the ) that closes the argument list.  (Layers take care of transforming
+data between external and internal representations.)  Perl stopped parsing
+the layer list at this point and did not attempt to push this layer.
+If your program didn't explicitly request the failing operation, it may be
+the result of the value of the environment variable PERLIO.
+
+=item Array @%s missing the @ in argument %d of %s()
+
+(D deprecated) Really old Perl let you omit the @ on array names in some
+spots.  This is now heavily deprecated.
+
+=item assertion botched: %s
+
+(P) The malloc package that comes with Perl had an internal failure.
+
+=item Assertion failed: file "%s"
+
+(P) A general assertion failed.  The file in question must be examined.
+
+=item Assignment to both a list and a scalar
+
+(F) If you assign to a conditional operator, the 2nd and 3rd arguments
+must either both be scalars or both be lists.  Otherwise Perl won't
+know which context to supply to the right side.
+
+=item A thread exited while %d threads were running
+
+(W threads)(S) When using threaded Perl, a thread (not necessarily the main
+thread) exited while there were still other threads running.
+Usually it's a good idea to first collect the return values of the
+created threads by joining them, and only then exit from the main
+thread.  See L<threads>.
+
+=item Attempt to access disallowed key '%s' in a restricted hash
+
+(F) The failing code has attempted to get or set a key which is not in
+the current set of allowed keys of a restricted hash.
+
+=item Attempt to bless into a reference
+
+(F) The CLASSNAME argument to the bless() operator is expected to be
+the name of the package to bless the resulting object into. You've
+supplied instead a reference to something: perhaps you wrote
+
+    bless $self, $proto;
+
+when you intended
+
+    bless $self, ref($proto) || $proto;
+
+If you actually want to bless into the stringified version
+of the reference supplied, you need to stringify it yourself, for
+example by:
+
+    bless $self, "$proto";
+
+=item Attempt to delete disallowed key '%s' from a restricted hash
+
+(F) The failing code attempted to delete from a restricted hash a key
+which is not in its key set.
+
+=item Attempt to delete readonly key '%s' from a restricted hash
+
+(F) The failing code attempted to delete a key whose value has been
+declared readonly from a restricted hash.
+
+=item Attempt to free non-arena SV: 0x%lx
+
+(P internal) All SV objects are supposed to be allocated from arenas
+that will be garbage collected on exit.  An SV was discovered to be
+outside any of those arenas.
+
+=item Attempt to free nonexistent shared string
+
+(P internal) Perl maintains a reference counted internal table of
+strings to optimize the storage and access of hash keys and other
+strings.  This indicates someone tried to decrement the reference count
+of a string that can no longer be found in the table.
+
+=item Attempt to free temp prematurely
+
+(W debugging) Mortalized values are supposed to be freed by the
+free_tmps() routine.  This indicates that something else is freeing the
+SV before the free_tmps() routine gets a chance, which means that the
+free_tmps() routine will be freeing an unreferenced scalar when it does
+try to free it.
+
+=item Attempt to free unreferenced glob pointers
+
+(P internal) The reference counts got screwed up on symbol aliases.
+
+=item Attempt to free unreferenced scalar
+
+(W internal) Perl went to decrement the reference count of a scalar to
+see if it would go to 0, and discovered that it had already gone to 0
+earlier, and should have been freed, and in fact, probably was freed.
+This could indicate that SvREFCNT_dec() was called too many times, or
+that SvREFCNT_inc() was called too few times, or that the SV was
+mortalized when it shouldn't have been, or that memory has been
+corrupted.
+
+=item Attempt to join self
+
+(F) You tried to join a thread from within itself, which is an
+impossible task.  You may be joining the wrong thread, or you may need
+to move the join() to some other thread.
+
+=item Attempt to pack pointer to temporary value
+
+(W pack) You tried to pass a temporary value (like the result of a
+function, or a computed expression) to the "p" pack() template.  This
+means the result contains a pointer to a location that could become
+invalid anytime, even before the end of the current statement.  Use
+literals or global values as arguments to the "p" pack() template to
+avoid this warning.
+
+=item Attempt to set length of freed array
+
+(W) You tried to set the length of an array which has been freed.  You
+can do this by storing a reference to the scalar representing the last index
+of an array and later assigning through that reference. For example
+
+    $r = do {my @a; \$#a};
+    $$r = 503
+
+=item Attempt to use reference as lvalue in substr
+
+(W substr) You supplied a reference as the first argument to substr()
+used as an lvalue, which is pretty strange.  Perhaps you forgot to
+dereference it first.  See L<perlfunc/substr>.
+
+=item Bad arg length for %s, is %d, should be %s
+
+(F) You passed a buffer of the wrong size to one of msgctl(), semctl()
+or shmctl().  In C parlance, the correct sizes are, respectively,
+S<sizeof(struct msqid_ds *)>, S<sizeof(struct semid_ds *)>, and
+S<sizeof(struct shmid_ds *)>.
+
+=item Bad evalled substitution pattern
+
+(F) You've used the C</e> switch to evaluate the replacement for a
+substitution, but perl found a syntax error in the code to evaluate,
+most likely an unexpected right brace '}'.
+
+=item Bad filehandle: %s
+
+(F) A symbol was passed to something wanting a filehandle, but the
+symbol has no filehandle associated with it.  Perhaps you didn't do an
+open(), or did it in another package.
+
+=item Bad free() ignored
+
+(S malloc) An internal routine called free() on something that had never
+been malloc()ed in the first place. Mandatory, but can be disabled by
+setting environment variable C<PERL_BADFREE> to 0.
+
+This message can be seen quite often with DB_File on systems with "hard"
+dynamic linking, like C<AIX> and C<OS/2>. It is a bug of C<Berkeley DB>
+which is left unnoticed if C<DB> uses I<forgiving> system malloc().
+
+=item Bad hash
+
+(P) One of the internal hash routines was passed a null HV pointer.
+
+=item Bad index while coercing array into hash
+
+(F) The index looked up in the hash found as the 0'th element of a
+pseudo-hash is not legal.  Index values must be at 1 or greater.
+See L<perlref>.
+
+=item Badly placed ()'s
+
+(A) You've accidentally run your script through B<csh> instead
+of Perl.  Check the #! line, or manually feed your script into
+Perl yourself.
+
+=item Bad name after %s::
+
+(F) You started to name a symbol by using a package prefix, and then
+didn't finish the symbol.  In particular, you can't interpolate outside
+of quotes, so
+
+    $var = 'myvar';
+    $sym = mypack::$var;
+
+is not the same as
+
+    $var = 'myvar';
+    $sym = "mypack::$var";
+
+=item Bad realloc() ignored
+
+(S malloc) An internal routine called realloc() on something that had
+never been malloc()ed in the first place. Mandatory, but can be disabled
+by setting environment variable C<PERL_BADFREE> to 1.
+
+=item Bad symbol for array
+
+(P) An internal request asked to add an array entry to something that
+wasn't a symbol table entry.
+
+=item Bad symbol for filehandle
+
+(P) An internal request asked to add a filehandle entry to something
+that wasn't a symbol table entry.
+
+=item Bad symbol for hash
+
+(P) An internal request asked to add a hash entry to something that
+wasn't a symbol table entry.
+
+=item Bareword found in conditional
+
+(W bareword) The compiler found a bareword where it expected a
+conditional, which often indicates that an || or && was parsed as part
+of the last argument of the previous construct, for example:
+
+    open FOO || die;
+
+It may also indicate a misspelled constant that has been interpreted as
+a bareword:
+
+    use constant TYPO => 1;
+    if (TYOP) { print "foo" }
+
+The C<strict> pragma is useful in avoiding such errors.
+
+=item Bareword "%s" not allowed while "strict subs" in use
+
+(F) With "strict subs" in use, a bareword is only allowed as a
+subroutine identifier, in curly brackets or to the left of the "=>"
+symbol.  Perhaps you need to predeclare a subroutine?
+
+=item Bareword "%s" refers to nonexistent package
+
+(W bareword) You used a qualified bareword of the form C<Foo::>, but the
+compiler saw no other uses of that namespace before that point.  Perhaps
+you need to predeclare a package?
+
+=item BEGIN failed--compilation aborted
+
+(F) An untrapped exception was raised while executing a BEGIN
+subroutine.  Compilation stops immediately and the interpreter is
+exited.
+
+=item BEGIN not safe after errors--compilation aborted
+
+(F) Perl found a C<BEGIN {}> subroutine (or a C<use> directive, which
+implies a C<BEGIN {}>) after one or more compilation errors had already
+occurred.  Since the intended environment for the C<BEGIN {}> could not
+be guaranteed (due to the errors), and since subsequent code likely
+depends on its correct operation, Perl just gave up.
+
+=item \1 better written as $1
+
+(W syntax) Outside of patterns, backreferences live on as variables.
+The use of backslashes is grandfathered on the right-hand side of a
+substitution, but stylistically it's better to use the variable form
+because other Perl programmers will expect it, and it works better if
+there are more than 9 backreferences.
+
+=item Binary number > 0b11111111111111111111111111111111 non-portable
+
+(W portable) The binary number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems.  See
+L<perlport> for more on portability concerns.
+
+=item bind() on closed socket %s
+
+(W closed) You tried to do a bind on a closed socket.  Did you forget to
+check the return value of your socket() call?  See L<perlfunc/bind>.
+
+=item binmode() on closed filehandle %s
+
+(W unopened) You tried binmode() on a filehandle that was never opened.
+Check you control flow and number of arguments.
+
+=item Bit vector size > 32 non-portable
+
+(W portable) Using bit vector sizes larger than 32 is non-portable.
+
+=item Bizarre copy of %s in %s
+
+(P) Perl detected an attempt to copy an internal value that is not
+copyable.
+
+=item Buffer overflow in prime_env_iter: %s
+
+(W internal) A warning peculiar to VMS.  While Perl was preparing to
+iterate over %ENV, it encountered a logical name or symbol definition
+which was too long, so it was truncated to the string shown.
+
+=item Callback called exit
+
+(F) A subroutine invoked from an external package via call_sv()
+exited by calling exit.
+
+=item %s() called too early to check prototype
+
+(W prototype) You've called a function that has a prototype before the
+parser saw a definition or declaration for it, and Perl could not check
+that the call conforms to the prototype.  You need to either add an
+early prototype declaration for the subroutine in question, or move the
+subroutine definition ahead of the call to get proper prototype
+checking.  Alternatively, if you are certain that you're calling the
+function correctly, you may put an ampersand before the name to avoid
+the warning.  See L<perlsub>.
+
+=item Cannot compress integer in pack
+
+(F) An argument to pack("w",...) was too large to compress.  The BER
+compressed integer format can only be used with positive integers, and you
+attempted to compress Infinity or a very large number (> 1e308).
+See L<perlfunc/pack>.
+
+=item Cannot compress negative numbers in pack
+
+(F) An argument to pack("w",...) was negative.  The BER compressed integer
+format can only be used with positive integers.  See L<perlfunc/pack>.
+
+=item Can only compress unsigned integers in pack
+
+(F) An argument to pack("w",...) was not an integer.  The BER compressed
+integer format can only be used with positive integers, and you attempted
+to compress something else.  See L<perlfunc/pack>.
+
+=item Can't bless non-reference value
+
+(F) Only hard references may be blessed.  This is how Perl "enforces"
+encapsulation of objects.  See L<perlobj>.
+
+=item Can't call method "%s" in empty package "%s"
+
+(F) You called a method correctly, and it correctly indicated a package
+functioning as a class, but that package doesn't have ANYTHING defined
+in it, let alone methods.  See L<perlobj>.
+
+=item Can't call method "%s" on an undefined value
+
+(F) You used the syntax of a method call, but the slot filled by the
+object reference or package name contains an undefined value.  Something
+like this will reproduce the error:
+
+    $BADREF = undef;
+    process $BADREF 1,2,3;
+    $BADREF->process(1,2,3);
+
+=item Can't call method "%s" on unblessed reference
+
+(F) A method call must know in what package it's supposed to run.  It
+ordinarily finds this out from the object reference you supply, but you
+didn't supply an object reference in this case.  A reference isn't an
+object reference until it has been blessed.  See L<perlobj>.
+
+=item Can't call method "%s" without a package or object reference
+
+(F) You used the syntax of a method call, but the slot filled by the
+object reference or package name contains an expression that returns a
+defined value which is neither an object reference nor a package name.
+Something like this will reproduce the error:
+
+    $BADREF = 42;
+    process $BADREF 1,2,3;
+    $BADREF->process(1,2,3);
+
+=item Can't chdir to %s
+
+(F) You called C<perl -x/foo/bar>, but C</foo/bar> is not a directory
+that you can chdir to, possibly because it doesn't exist.
+
+=item Can't check filesystem of script "%s" for nosuid
+
+(P) For some reason you can't check the filesystem of the script for
+nosuid.
+
+=item Can't coerce array into hash
+
+(F) You used an array where a hash was expected, but the array has no
+information on how to map from keys to array indices.  You can do that
+only with arrays that have a hash reference at index 0.
+
+=item Can't coerce %s to integer in %s
+
+(F) Certain types of SVs, in particular real symbol table entries
+(typeglobs), can't be forced to stop being what they are.  So you can't
+say things like:
+
+    *foo += 1;
+
+You CAN say
+
+    $foo = *foo;
+    $foo += 1;
+
+but then $foo no longer contains a glob.
+
+=item Can't coerce %s to number in %s
+
+(F) Certain types of SVs, in particular real symbol table entries
+(typeglobs), can't be forced to stop being what they are.
+
+=item Can't coerce %s to string in %s
+
+(F) Certain types of SVs, in particular real symbol table entries
+(typeglobs), can't be forced to stop being what they are.
+
+=item Can't create pipe mailbox
+
+(P) An error peculiar to VMS.  The process is suffering from exhausted
+quotas or other plumbing problems.
+
+=item Can't declare class for non-scalar %s in "%s"
+
+(F) Currently, only scalar variables can be declared with a specific
+class qualifier in a "my" or "our" declaration.  The semantics may be
+extended for other types of variables in future.
+
+=item Can't declare %s in "%s"
+
+(F) Only scalar, array, and hash variables may be declared as "my" or
+"our" variables.  They must have ordinary identifiers as names.
+
+=item Can't do inplace edit: %s is not a regular file
+
+(S inplace) You tried to use the B<-i> switch on a special file, such as
+a file in /dev, or a FIFO.  The file was ignored.
+
+=item Can't do inplace edit on %s: %s
+
+(S inplace) The creation of the new file failed for the indicated
+reason.
+
+=item Can't do inplace edit without backup
+
+(F) You're on a system such as MS-DOS that gets confused if you try
+reading from a deleted (but still opened) file.  You have to say
+C<-i.bak>, or some such.
+
+=item Can't do inplace edit: %s would not be unique
+
+(S inplace) Your filesystem does not support filenames longer than 14
+characters and Perl was unable to create a unique filename during
+inplace editing with the B<-i> switch.  The file was ignored.
+
+=item Can't do {n,m} with n > m in regex; marked by <-- HERE in m/%s/
+
+(F) Minima must be less than or equal to maxima. If you really want your
+regexp to match something 0 times, just put {0}. The <-- HERE shows in the
+regular expression about where the problem was discovered. See L<perlre>.
+
+=item Can't do setegid!
+
+(P) The setegid() call failed for some reason in the setuid emulator of
+suidperl.
+
+=item Can't do seteuid!
+
+(P) The setuid emulator of suidperl failed for some reason.
+
+=item Can't do setuid
+
+(F) This typically means that ordinary perl tried to exec suidperl to do
+setuid emulation, but couldn't exec it.  It looks for a name of the form
+sperl5.000 in the same directory that the perl executable resides under
+the name perl5.000, typically /usr/local/bin on Unix machines.  If the
+file is there, check the execute permissions.  If it isn't, ask your
+sysadmin why he and/or she removed it.
+
+=item Can't do waitpid with flags
+
+(F) This machine doesn't have either waitpid() or wait4(), so only
+waitpid() without flags is emulated.
+
+=item Can't emulate -%s on #! line
+
+(F) The #! line specifies a switch that doesn't make sense at this
+point.  For example, it'd be kind of silly to put a B<-x> on the #!
+line.
+
+=item Can't exec "%s": %s
+
+(W exec) A system(), exec(), or piped open call could not execute the
+named program for the indicated reason.  Typical reasons include: the
+permissions were wrong on the file, the file wasn't found in
+C<$ENV{PATH}>, the executable in question was compiled for another
+architecture, or the #! line in a script points to an interpreter that
+can't be run for similar reasons.  (Or maybe your system doesn't support
+#! at all.)
+
+=item Can't exec %s
+
+(F) Perl was trying to execute the indicated program for you because
+that's what the #! line said.  If that's not what you wanted, you may
+need to mention "perl" on the #! line somewhere.
+
+=item Can't execute %s
+
+(F) You used the B<-S> switch, but the copies of the script to execute
+found in the PATH did not have correct permissions.
+
+=item Can't find an opnumber for "%s"
+
+(F) A string of a form C<CORE::word> was given to prototype(), but there
+is no builtin with the name C<word>.
+
+=item Can't find %s character property "%s"
+
+(F) You used C<\p{}> or C<\P{}> but the character property by that name
+could not be found. Maybe you misspelled the name of the property
+(remember that the names of character properties consist only of
+alphanumeric characters), or maybe you forgot the C<Is> or C<In> prefix?
+
+=item Can't find label %s
+
+(F) You said to goto a label that isn't mentioned anywhere that it's
+possible for us to go to.  See L<perlfunc/goto>.
+
+=item Can't find %s on PATH
+
+(F) You used the B<-S> switch, but the script to execute could not be
+found in the PATH.
+
+=item Can't find %s on PATH, '.' not in PATH
+
+(F) You used the B<-S> switch, but the script to execute could not be
+found in the PATH, or at least not with the correct permissions.  The
+script exists in the current directory, but PATH prohibits running it.
+
+=item Can't find %s property definition %s
+
+(F) You may have tried to use C<\p> which means a Unicode property (for
+example C<\p{Lu}> is all uppercase letters).  If you did mean to use a
+Unicode property, see L<perlunicode> for the list of known properties.
+If you didn't mean to use a Unicode property, escape the C<\p>, either
+by C<\\p> (just the C<\p>) or by C<\Q\p> (the rest of the string, until
+possible C<\E>).
+
+=item Can't find string terminator %s anywhere before EOF
+
+(F) Perl strings can stretch over multiple lines.  This message means
+that the closing delimiter was omitted.  Because bracketed quotes count
+nesting levels, the following is missing its final parenthesis:
+
+    print q(The character '(' starts a side comment.);
+
+If you're getting this error from a here-document, you may have included
+unseen whitespace before or after your closing tag. A good programmer's
+editor will have a way to help you find these characters.
+
+=item Can't fork
+
+(F) A fatal error occurred while trying to fork while opening a
+pipeline.
+
+=item Can't get filespec - stale stat buffer?
+
+(S) A warning peculiar to VMS.  This arises because of the difference
+between access checks under VMS and under the Unix model Perl assumes.
+Under VMS, access checks are done by filename, rather than by bits in
+the stat buffer, so that ACLs and other protections can be taken into
+account.  Unfortunately, Perl assumes that the stat buffer contains all
+the necessary information, and passes it, instead of the filespec, to
+the access checking routine.  It will try to retrieve the filespec using
+the device name and FID present in the stat buffer, but this works only
+if you haven't made a subsequent call to the CRTL stat() routine,
+because the device name is overwritten with each call.  If this warning
+appears, the name lookup failed, and the access checking routine gave up
+and returned FALSE, just to be conservative.  (Note: The access checking
+routine knows about the Perl C<stat> operator and file tests, so you
+shouldn't ever see this warning in response to a Perl command; it arises
+only if some internal code takes stat buffers lightly.)
+
+=item Can't get pipe mailbox device name
+
+(P) An error peculiar to VMS.  After creating a mailbox to act as a
+pipe, Perl can't retrieve its name for later use.
+
+=item Can't get SYSGEN parameter value for MAXBUF
+
+(P) An error peculiar to VMS.  Perl asked $GETSYI how big you want your
+mailbox buffers to be, and didn't get an answer.
+
+=item Can't "goto" into the middle of a foreach loop
+
+(F) A "goto" statement was executed to jump into the middle of a foreach
+loop.  You can't get there from here.  See L<perlfunc/goto>.
+
+=item Can't "goto" out of a pseudo block
+
+(F) A "goto" statement was executed to jump out of what might look like
+a block, except that it isn't a proper block.  This usually occurs if
+you tried to jump out of a sort() block or subroutine, which is a no-no.
+See L<perlfunc/goto>.
+
+=item Can't goto subroutine from an eval-%s
+
+(F) The "goto subroutine" call can't be used to jump out of an eval
+"string" or block.
+
+=item Can't goto subroutine outside a subroutine
+
+(F) The deeply magical "goto subroutine" call can only replace one
+subroutine call for another.  It can't manufacture one out of whole
+cloth.  In general you should be calling it out of only an AUTOLOAD
+routine anyway.  See L<perlfunc/goto>.
+
+=item Can't ignore signal CHLD, forcing to default
+
+(W signal) Perl has detected that it is being run with the SIGCHLD
+signal (sometimes known as SIGCLD) disabled.  Since disabling this
+signal will interfere with proper determination of exit status of child
+processes, Perl has reset the signal to its default value.  This
+situation typically indicates that the parent program under which Perl
+may be running (e.g. cron) is being very careless.
+
+=item Can't "last" outside a loop block
+
+(F) A "last" statement was executed to break out of the current block,
+except that there's this itty bitty problem called there isn't a current
+block.  Note that an "if" or "else" block doesn't count as a "loopish"
+block, as doesn't a block given to sort(), map() or grep().  You can
+usually double the curlies to get the same effect though, because the
+inner curlies will be considered a block that loops once.  See
+L<perlfunc/last>.
+
+=item Can't load '%s' for module %s
+
+(F) The module you tried to load failed to load a dynamic extension. This
+may either mean that you upgraded your version of perl to one that is
+incompatible with your old dynamic extensions (which is known to happen
+between major versions of perl), or (more likely) that your dynamic
+extension was built against an older version of the library that is
+installed on your system. You may need to rebuild your old dynamic
+extensions.
+
+=item Can't localize lexical variable %s
+
+(F) You used local on a variable name that was previously declared as a
+lexical variable using "my".  This is not allowed.  If you want to
+localize a package variable of the same name, qualify it with the
+package name.
+
+=item Can't localize pseudo-hash element
+
+(F) You said something like C<< local $ar->{'key'} >>, where $ar is a
+reference to a pseudo-hash.  That hasn't been implemented yet, but you
+can get a similar effect by localizing the corresponding array element
+directly -- C<< local $ar->[$ar->[0]{'key'}] >>.
+
+=item Can't localize through a reference
+
+(F) You said something like C<local $$ref>, which Perl can't currently
+handle, because when it goes to restore the old value of whatever $ref
+pointed to after the scope of the local() is finished, it can't be sure
+that $ref will still be a reference.
+
+=item Can't locate %s
+
+(F) You said to C<do> (or C<require>, or C<use>) a file that couldn't be
+found. Perl looks for the file in all the locations mentioned in @INC,
+unless the file name included the full path to the file.  Perhaps you
+need to set the PERL5LIB or PERL5OPT environment variable to say where
+the extra library is, or maybe the script needs to add the library name
+to @INC.  Or maybe you just misspelled the name of the file.  See
+L<perlfunc/require> and L<lib>.
+
+=item Can't locate auto/%s.al in @INC
+
+(F) A function (or method) was called in a package which allows
+autoload, but there is no function to autoload.  Most probable causes
+are a misprint in a function/method name or a failure to C<AutoSplit>
+the file, say, by doing C<make install>.
+
+=item Can't locate loadable object for module %s in @INC
+
+(F) The module you loaded is trying to load an external library, like
+for example, C<foo.so> or C<bar.dll>, but the L<DynaLoader> module was
+unable to locate this library.  See L<DynaLoader>.
+
+=item Can't locate object method "%s" via package "%s"
+
+(F) You called a method correctly, and it correctly indicated a package
+functioning as a class, but that package doesn't define that particular
+method, nor does any of its base classes.  See L<perlobj>.
+
+=item Can't locate package %s for @%s::ISA
+
+(W syntax) The @ISA array contained the name of another package that
+doesn't seem to exist.
+
+=item Can't locate PerlIO%s
+
+(F) You tried to use in open() a PerlIO layer that does not exist,
+e.g. open(FH, ">:nosuchlayer", "somefile").
+
+=item Can't make list assignment to \%ENV on this system
+
+(F) List assignment to %ENV is not supported on some systems, notably
+VMS.
+
+=item Can't modify %s in %s
+
+(F) You aren't allowed to assign to the item indicated, or otherwise try
+to change it, such as with an auto-increment.
+
+=item Can't modify nonexistent substring
+
+(P) The internal routine that does assignment to a substr() was handed
+a NULL.
+
+=item Can't modify non-lvalue subroutine call
+
+(F) Subroutines meant to be used in lvalue context should be declared as
+such, see L<perlsub/"Lvalue subroutines">.
+
+=item Can't msgrcv to read-only var
+
+(F) The target of a msgrcv must be modifiable to be used as a receive
+buffer.
+
+=item Can't "next" outside a loop block
+
+(F) A "next" statement was executed to reiterate the current block, but
+there isn't a current block.  Note that an "if" or "else" block doesn't
+count as a "loopish" block, as doesn't a block given to sort(), map() or
+grep().  You can usually double the curlies to get the same effect
+though, because the inner curlies will be considered a block that loops
+once.  See L<perlfunc/next>.
+
+=item Can't open %s: %s
+
+(S inplace) The implicit opening of a file through use of the C<< <> >>
+filehandle, either implicitly under the C<-n> or C<-p> command-line
+switches, or explicitly, failed for the indicated reason.  Usually this
+is because you don't have read permission for a file which you named on
+the command line.
+
+=item Can't open a reference
+
+(W io) You tried to open a scalar reference for reading or writing,
+using the 3-arg open() syntax :
+
+    open FH, '>', $ref;
+
+but your version of perl is compiled without perlio, and this form of
+open is not supported.
+
+=item Can't open bidirectional pipe
+
+(W pipe) You tried to say C<open(CMD, "|cmd|")>, which is not supported.
+You can try any of several modules in the Perl library to do this, such
+as IPC::Open2.  Alternately, direct the pipe's output to a file using
+">", and then read it in under a different file handle.
+
+=item Can't open error file %s as stderr
+
+(F) An error peculiar to VMS.  Perl does its own command line
+redirection, and couldn't open the file specified after '2>' or '2>>' on
+the command line for writing.
+
+=item Can't open input file %s as stdin
+
+(F) An error peculiar to VMS.  Perl does its own command line
+redirection, and couldn't open the file specified after '<' on the
+command line for reading.
+
+=item Can't open output file %s as stdout
+
+(F) An error peculiar to VMS.  Perl does its own command line
+redirection, and couldn't open the file specified after '>' or '>>' on
+the command line for writing.
+
+=item Can't open output pipe (name: %s)
+
+(P) An error peculiar to VMS.  Perl does its own command line
+redirection, and couldn't open the pipe into which to send data destined
+for stdout.
+
+=item Can't open perl script%s
+
+(F) The script you specified can't be opened for the indicated reason.
+
+If you're debugging a script that uses #!, and normally relies on the
+shell's $PATH search, the -S option causes perl to do that search, so
+you don't have to type the path or C<`which $scriptname`>.
+
+=item Can't read CRTL environ
+
+(S) A warning peculiar to VMS.  Perl tried to read an element of %ENV
+from the CRTL's internal environment array and discovered the array was
+missing.  You need to figure out where your CRTL misplaced its environ
+or define F<PERL_ENV_TABLES> (see L<perlvms>) so that environ is not
+searched.
+
+=item Can't redefine active sort subroutine %s
+
+(F) Perl optimizes the internal handling of sort subroutines and keeps
+pointers into them.  You tried to redefine one such sort subroutine when
+it was currently active, which is not allowed.  If you really want to do
+this, you should write C<sort { &func } @x> instead of C<sort func @x>.
+
+=item Can't "redo" outside a loop block
+
+(F) A "redo" statement was executed to restart the current block, but
+there isn't a current block.  Note that an "if" or "else" block doesn't
+count as a "loopish" block, as doesn't a block given to sort(), map()
+or grep().  You can usually double the curlies to get the same effect
+though, because the inner curlies will be considered a block that
+loops once.  See L<perlfunc/redo>.
+
+=item Can't remove %s: %s, skipping file
+
+(S inplace) You requested an inplace edit without creating a backup
+file.  Perl was unable to remove the original file to replace it with
+the modified file.  The file was left unmodified.
+
+=item Can't rename %s to %s: %s, skipping file
+
+(S inplace) The rename done by the B<-i> switch failed for some reason,
+probably because you don't have write permission to the directory.
+
+=item Can't reopen input pipe (name: %s) in binary mode
+
+(P) An error peculiar to VMS.  Perl thought stdin was a pipe, and tried
+to reopen it to accept binary data.  Alas, it failed.
+
+=item Can't resolve method `%s' overloading `%s' in package `%s'
+
+(F|P) Error resolving overloading specified by a method name (as opposed
+to a subroutine reference): no such method callable via the package. If
+method name is C<???>, this is an internal error.
+
+=item Can't reswap uid and euid
+
+(P) The setreuid() call failed for some reason in the setuid emulator of
+suidperl.
+
+=item Can't return %s from lvalue subroutine
+
+(F) Perl detected an attempt to return illegal lvalues (such as
+temporary or readonly values) from a subroutine used as an lvalue.  This
+is not allowed.
+
+=item Can't return outside a subroutine
+
+(F) The return statement was executed in mainline code, that is, where
+there was no subroutine call to return out of.  See L<perlsub>.
+
+=item Can't return %s to lvalue scalar context
+
+(F) You tried to return a complete array or hash from an lvalue subroutine,
+but you called the subroutine in a way that made Perl think you meant
+to return only one value. You probably meant to write parentheses around
+the call to the subroutine, which tell Perl that the call should be in
+list context.
+
+=item Can't stat script "%s"
+
+(P) For some reason you can't fstat() the script even though you have it
+open already.  Bizarre.
+
+=item Can't swap uid and euid
+
+(P) The setreuid() call failed for some reason in the setuid emulator of
+suidperl.
+
+=item Can't take log of %g
+
+(F) For ordinary real numbers, you can't take the logarithm of a
+negative number or zero. There's a Math::Complex package that comes
+standard with Perl, though, if you really want to do that for the
+negative numbers.
+
+=item Can't take sqrt of %g
+
+(F) For ordinary real numbers, you can't take the square root of a
+negative number.  There's a Math::Complex package that comes standard
+with Perl, though, if you really want to do that.
+
+=item Can't undef active subroutine
+
+(F) You can't undefine a routine that's currently running.  You can,
+however, redefine it while it's running, and you can even undef the
+redefined subroutine while the old routine is running.  Go figure.
+
+=item Can't unshift
+
+(F) You tried to unshift an "unreal" array that can't be unshifted, such
+as the main Perl stack.
+
+=item Can't upgrade that kind of scalar
+
+(P) The internal sv_upgrade routine adds "members" to an SV, making it
+into a more specialized kind of SV.  The top several SV types are so
+specialized, however, that they cannot be interconverted.  This message
+indicates that such a conversion was attempted.
+
+=item Can't upgrade to undef
+
+(P) The undefined SV is the bottom of the totem pole, in the scheme of
+upgradability.  Upgrading to undef indicates an error in the code
+calling sv_upgrade.
+
+=item Can't use anonymous symbol table for method lookup
+
+(F) The internal routine that does method lookup was handed a symbol
+table that doesn't have a name.  Symbol tables can become anonymous
+for example by undefining stashes: C<undef %Some::Package::>.
+
+=item Can't use an undefined value as %s reference
+
+(F) A value used as either a hard reference or a symbolic reference must
+be a defined value.  This helps to delurk some insidious errors.
+
+=item Can't use bareword ("%s") as %s ref while "strict refs" in use
+
+(F) Only hard references are allowed by "strict refs".  Symbolic
+references are disallowed.  See L<perlref>.
+
+=item Can't use %! because Errno.pm is not available
+
+(F) The first time the %! hash is used, perl automatically loads the
+Errno.pm module. The Errno module is expected to tie the %! hash to
+provide symbolic names for C<$!> errno values.
+
+=item Can't use %s for loop variable
+
+(F) Only a simple scalar variable may be used as a loop variable on a
+foreach.
+
+=item Can't use global %s in "my"
+
+(F) You tried to declare a magical variable as a lexical variable.  This
+is not allowed, because the magic can be tied to only one location
+(namely the global variable) and it would be incredibly confusing to
+have variables in your program that looked like magical variables but
+weren't.
+
+=item Can't use "my %s" in sort comparison
+
+(F) The global variables $a and $b are reserved for sort comparisons.
+You mentioned $a or $b in the same line as the <=> or cmp operator,
+and the variable had earlier been declared as a lexical variable.
+Either qualify the sort variable with the package name, or rename the
+lexical variable.
+
+=item Can't use %s ref as %s ref
+
+(F) You've mixed up your reference types.  You have to dereference a
+reference of the type needed.  You can use the ref() function to
+test the type of the reference, if need be.
+
+=item Can't use string ("%s") as %s ref while "strict refs" in use
+
+(F) Only hard references are allowed by "strict refs".  Symbolic
+references are disallowed.  See L<perlref>.
+
+=item Can't use subscript on %s
+
+(F) The compiler tried to interpret a bracketed expression as a
+subscript.  But to the left of the brackets was an expression that
+didn't look like a hash or array reference, or anything else subscriptable.
+
+=item Can't use \%c to mean $%c in expression
+
+(W syntax) In an ordinary expression, backslash is a unary operator that
+creates a reference to its argument.  The use of backslash to indicate a
+backreference to a matched substring is valid only as part of a regular
+expression pattern.  Trying to do this in ordinary Perl code produces a
+value that prints out looking like SCALAR(0xdecaf).  Use the $1 form
+instead.
+
+=item Can't weaken a nonreference
+
+(F) You attempted to weaken something that was not a reference.  Only
+references can be weakened.
+
+=item Can't x= to read-only value
+
+(F) You tried to repeat a constant value (often the undefined value)
+with an assignment operator, which implies modifying the value itself.
+Perhaps you need to copy the value to a temporary, and repeat that.
+
+=item Character in "C" format wrapped in pack
+
+(W pack) You said
+
+    pack("C", $x)
+
+where $x is either less than 0 or more than 255; the C<"C"> format is
+only for encoding native operating system characters (ASCII, EBCDIC,
+and so on) and not for Unicode characters, so Perl behaved as if you meant
+
+    pack("C", $x & 255)
+
+If you actually want to pack Unicode codepoints, use the C<"U"> format
+instead.
+
+=item Character in "c" format wrapped in pack
+
+(W pack) You said
+
+    pack("c", $x)
+
+where $x is either less than -128 or more than 127; the C<"c"> format
+is only for encoding native operating system characters (ASCII, EBCDIC,
+and so on) and not for Unicode characters, so Perl behaved as if you meant
+
+    pack("c", $x & 255);
+
+If you actually want to pack Unicode codepoints, use the C<"U"> format
+instead.
+
+=item close() on unopened filehandle %s
+
+(W unopened) You tried to close a filehandle that was never opened.
+
+=item Code missing after '/'
+
+(F) You had a (sub-)template that ends with a '/'. There must be another
+template code following the slash. See L<perlfunc/pack>.
+
+=item %s: Command not found
+
+(A) You've accidentally run your script through B<csh> instead of Perl.
+Check the #! line, or manually feed your script into Perl yourself.
+
+=item Compilation failed in require
+
+(F) Perl could not compile a file specified in a C<require> statement.
+Perl uses this generic message when none of the errors that it
+encountered were severe enough to halt compilation immediately.
+
+=item Complex regular subexpression recursion limit (%d) exceeded
+
+(W regexp) The regular expression engine uses recursion in complex
+situations where back-tracking is required.  Recursion depth is limited
+to 32766, or perhaps less in architectures where the stack cannot grow
+arbitrarily.  ("Simple" and "medium" situations are handled without
+recursion and are not subject to a limit.)  Try shortening the string
+under examination; looping in Perl code (e.g. with C<while>) rather than
+in the regular expression engine; or rewriting the regular expression so
+that it is simpler or backtracks less.  (See L<perlfaq2> for information
+on I<Mastering Regular Expressions>.)
+
+=item cond_broadcast() called on unlocked variable
+
+(W threads) Within a thread-enabled program, you tried to call
+cond_broadcast() on a variable which wasn't locked. The cond_broadcast()
+function  is used to wake up another thread that is waiting in a
+cond_wait(). To ensure that the signal isn't sent before the other thread
+has a chance to enter the wait, it is usual for the signaling thread to
+first wait for a lock on variable. This lock attempt will only succeed
+after the other thread has entered cond_wait() and thus relinquished the
+lock.
+
+=item cond_signal() called on unlocked variable
+
+(W threads) Within a thread-enabled program, you tried to call
+cond_signal() on a variable which wasn't locked. The cond_signal()
+function  is used to wake up another thread that is waiting in a
+cond_wait(). To ensure that the signal isn't sent before the other thread
+has a chance to enter the wait, it is usual for the signaling thread to
+first wait for a lock on variable. This lock attempt will only succeed
+after the other thread has entered cond_wait() and thus relinquished the
+lock.
+
+=item connect() on closed socket %s
+
+(W closed) You tried to do a connect on a closed socket.  Did you forget
+to check the return value of your socket() call?  See
+L<perlfunc/connect>.
+
+=item Constant(%s)%s: %s
+
+(F) The parser found inconsistencies either while attempting to define
+an overloaded constant, or when trying to find the character name
+specified in the C<\N{...}> escape.  Perhaps you forgot to load the
+corresponding C<overload> or C<charnames> pragma?  See L<charnames> and
+L<overload>.
+
+=item Constant is not %s reference
+
+(F) A constant value (perhaps declared using the C<use constant> pragma)
+is being dereferenced, but it amounts to the wrong type of reference.
+The message indicates the type of reference that was expected. This
+usually indicates a syntax error in dereferencing the constant value.
+See L<perlsub/"Constant Functions"> and L<constant>.
+
+=item Constant subroutine %s redefined
+
+(S) You redefined a subroutine which had previously been
+eligible for inlining.  See L<perlsub/"Constant Functions"> for
+commentary and workarounds.
+
+=item Constant subroutine %s undefined
+
+(W misc) You undefined a subroutine which had previously been eligible
+for inlining.  See L<perlsub/"Constant Functions"> for commentary and
+workarounds.
+
+=item Copy method did not return a reference
+
+(F) The method which overloads "=" is buggy. See
+L<overload/Copy Constructor>.
+
+=item CORE::%s is not a keyword
+
+(F) The CORE:: namespace is reserved for Perl keywords.
+
+=item corrupted regexp pointers
+
+(P) The regular expression engine got confused by what the regular
+expression compiler gave it.
+
+=item corrupted regexp program
+
+(P) The regular expression engine got passed a regexp program without a
+valid magic number.
+
+=item Corrupt malloc ptr 0x%lx at 0x%lx
+
+(P) The malloc package that comes with Perl had an internal failure.
+
+=item Count after length/code in unpack
+
+(F) You had an unpack template indicating a counted-length string, but
+you have also specified an explicit size for the string.  See
+L<perlfunc/pack>.
+
+=item Deep recursion on subroutine "%s"
+
+(W recursion) This subroutine has called itself (directly or indirectly)
+100 times more than it has returned.  This probably indicates an
+infinite recursion, unless you're writing strange benchmark programs, in
+which case it indicates something else.
+
+=item defined(@array) is deprecated
+
+(D deprecated) defined() is not usually useful on arrays because it
+checks for an undefined I<scalar> value.  If you want to see if the
+array is empty, just use C<if (@array) { # not empty }> for example.
+
+=item defined(%hash) is deprecated
+
+(D deprecated) defined() is not usually useful on hashes because it
+checks for an undefined I<scalar> value.  If you want to see if the hash
+is empty, just use C<if (%hash) { # not empty }> for example.
+
+=item %s defines neither package nor VERSION--version check failed
+
+(F) You said something like "use Module 42" but in the Module file
+there are neither package declarations nor a C<$VERSION>.
+
+=item Delimiter for here document is too long
+
+(F) In a here document construct like C<<<FOO>, the label C<FOO> is too
+long for Perl to handle.  You have to be seriously twisted to write code
+that triggers this error.
+
+=item DESTROY created new reference to dead object '%s'
+
+(F) A DESTROY() method created a new reference to the object which is
+just being DESTROYed. Perl is confused, and prefers to abort rather than
+to create a dangling reference.
+
+=item Did not produce a valid header
+
+See Server error.
+
+=item %s did not return a true value
+
+(F) A required (or used) file must return a true value to indicate that
+it compiled correctly and ran its initialization code correctly.  It's
+traditional to end such a file with a "1;", though any true value would
+do.  See L<perlfunc/require>.
+
+=item (Did you mean &%s instead?)
+
+(W) You probably referred to an imported subroutine &FOO as $FOO or some
+such.
+
+=item (Did you mean "local" instead of "our"?)
+
+(W misc) Remember that "our" does not localize the declared global
+variable.  You have declared it again in the same lexical scope, which
+seems superfluous.
+
+=item (Did you mean $ or @ instead of %?)
+
+(W) You probably said %hash{$key} when you meant $hash{$key} or
+@hash{@keys}.  On the other hand, maybe you just meant %hash and got
+carried away.
+
+=item Died
+
+(F) You passed die() an empty string (the equivalent of C<die "">) or
+you called it with no args and both C<$@> and C<$_> were empty.
+
+=item Document contains no data
+
+See Server error.
+
+=item %s does not define %s::VERSION--version check failed
+
+(F) You said something like "use Module 42" but the Module did not
+define a C<$VERSION.>
+
+=item '/' does not take a repeat count
+
+(F) You cannot put a repeat count of any kind right after the '/' code.
+See L<perlfunc/pack>.
+
+=item Don't know how to handle magic of type '%s'
+
+(P) The internal handling of magical variables has been cursed.
+
+=item do_study: out of memory
+
+(P) This should have been caught by safemalloc() instead.
+
+=item (Do you need to predeclare %s?)
+
+(S syntax) This is an educated guess made in conjunction with the message
+"%s found where operator expected".  It often means a subroutine or module
+name is being referenced that hasn't been declared yet.  This may be
+because of ordering problems in your file, or because of a missing
+"sub", "package", "require", or "use" statement.  If you're referencing
+something that isn't defined yet, you don't actually have to define the
+subroutine or package before the current location.  You can use an empty
+"sub foo;" or "package FOO;" to enter a "forward" declaration.
+
+=item dump() better written as CORE::dump()
+
+(W misc) You used the obsolescent C<dump()> built-in function, without fully
+qualifying it as C<CORE::dump()>.  Maybe it's a typo.  See L<perlfunc/dump>.
+
+=item Duplicate free() ignored
+
+(S malloc) An internal routine called free() on something that had
+already been freed.
+
+=item Duplicate modifier '%c' after '%c' in %s
+
+(W) You have applied the same modifier more than once after a type
+in a pack template.  See L<perlfunc/pack>.
+
+=item elseif should be elsif
+
+(S syntax) There is no keyword "elseif" in Perl because Larry thinks it's
+ugly. Your code will be interpreted as an attempt to call a method named
+"elseif" for the class returned by the following block.  This is
+unlikely to be what you want.
+
+=item Empty %s
+
+(F) C<\p> and C<\P> are used to introduce a named Unicode property, as
+described in L<perlunicode> and L<perlre>. You used C<\p> or C<\P> in
+a regular expression without specifying the property name.
+
+=item entering effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item %ENV is aliased to %s
+
+(F) You're running under taint mode, and the C<%ENV> variable has been
+aliased to another hash, so it doesn't reflect anymore the state of the
+program's environment. This is potentially insecure.
+
+=item Error converting file specification %s
+
+(F) An error peculiar to VMS.  Because Perl may have to deal with file
+specifications in either VMS or Unix syntax, it converts them to a
+single form when it must operate on them directly.  Either you've passed
+an invalid file specification to Perl, or you've found a case the
+conversion routines don't handle.  Drat.
+
+=item %s: Eval-group in insecure regular expression
+
+(F) Perl detected tainted data when trying to compile a regular
+expression that contains the C<(?{ ... })> zero-width assertion, which
+is unsafe.  See L<perlre/(?{ code })>, and L<perlsec>.
+
+=item %s: Eval-group not allowed at run time
+
+(F) Perl tried to compile a regular expression containing the
+C<(?{ ... })> zero-width assertion at run time, as it would when the
+pattern contains interpolated values.  Since that is a security risk, it
+is not allowed.  If you insist, you may still do this by explicitly
+building the pattern from an interpolated string at run time and using
+that in an eval().  See L<perlre/(?{ code })>.
+
+=item %s: Eval-group not allowed, use re 'eval'
+
+(F) A regular expression contained the C<(?{ ... })> zero-width
+assertion, but that construct is only allowed when the C<use re 'eval'>
+pragma is in effect.  See L<perlre/(?{ code })>.
+
+=item Excessively long <> operator
+
+(F) The contents of a <> operator may not exceed the maximum size of a
+Perl identifier.  If you're just trying to glob a long list of
+filenames, try using the glob() operator, or put the filenames into a
+variable and glob that.
+
+=item exec? I'm not *that* kind of operating system
+
+(F) The C<exec> function is not implemented in MacPerl. See L<perlport>.
+
+=item Execution of %s aborted due to compilation errors
+
+(F) The final summary message when a Perl compilation fails.
+
+=item Exiting eval via %s
+
+(W exiting) You are exiting an eval by unconventional means, such as a
+goto, or a loop control statement.
+
+=item Exiting format via %s
+
+(W exiting) You are exiting a format by unconventional means, such as a
+goto, or a loop control statement.
+
+=item Exiting pseudo-block via %s
+
+(W exiting) You are exiting a rather special block construct (like a
+sort block or subroutine) by unconventional means, such as a goto, or a
+loop control statement.  See L<perlfunc/sort>.
+
+=item Exiting subroutine via %s
+
+(W exiting) You are exiting a subroutine by unconventional means, such
+as a goto, or a loop control statement.
+
+=item Exiting substitution via %s
+
+(W exiting) You are exiting a substitution by unconventional means, such
+as a return, a goto, or a loop control statement.
+
+=item Explicit blessing to '' (assuming package main)
+
+(W misc) You are blessing a reference to a zero length string.  This has
+the effect of blessing the reference into the package main.  This is
+usually not what you want.  Consider providing a default target package,
+e.g. bless($ref, $p || 'MyPackage');
+
+=item %s: Expression syntax
+
+(A) You've accidentally run your script through B<csh> instead of Perl.
+Check the #! line, or manually feed your script into Perl yourself.
+
+=item %s failed--call queue aborted
+
+(F) An untrapped exception was raised while executing a CHECK, INIT, or
+END subroutine.  Processing of the remainder of the queue of such
+routines has been prematurely ended.
+
+=item False [] range "%s" in regex; marked by <-- HERE in m/%s/
+
+(W regexp) A character class range must start and end at a literal
+character, not another character class like C<\d> or C<[:alpha:]>.  The "-"
+in your false range is interpreted as a literal "-".  Consider quoting the
+"-", "\-".  The <-- HERE shows in the regular expression about where the
+problem was discovered.  See L<perlre>.
+
+=item Fatal VMS error at %s, line %d
+
+(P) An error peculiar to VMS.  Something untoward happened in a VMS
+system service or RTL routine; Perl's exit status should provide more
+details.  The filename in "at %s" and the line number in "line %d" tell
+you which section of the Perl source code is distressed.
+
+=item fcntl is not implemented
+
+(F) Your machine apparently doesn't implement fcntl().  What is this, a
+PDP-11 or something?
+
+=item Filehandle %s opened only for input
+
+(W io) You tried to write on a read-only filehandle.  If you intended
+it to be a read-write filehandle, you needed to open it with "+<" or
+"+>" or "+>>" instead of with "<" or nothing.  If you intended only to
+write the file, use ">" or ">>".  See L<perlfunc/open>.
+
+=item Filehandle %s opened only for output
+
+(W io) You tried to read from a filehandle opened only for writing, If
+you intended it to be a read/write filehandle, you needed to open it
+with "+<" or "+>" or "+>>" instead of with "<" or nothing.  If you
+intended only to read from the file, use "<".  See L<perlfunc/open>.
+Another possibility is that you attempted to open filedescriptor 0
+(also known as STDIN) for output (maybe you closed STDIN earlier?).
+
+=item Filehandle %s reopened as %s only for input
+
+(W io) You opened for reading a filehandle that got the same filehandle id
+as STDOUT or STDERR. This occurred because you closed STDOUT or STDERR
+previously.
+
+=item Filehandle STDIN reopened as %s only for output
+
+(W io) You opened for writing a filehandle that got the same filehandle id
+as STDIN. This occurred because you closed STDIN previously.
+
+=item Final $ should be \$ or $name
+
+(F) You must now decide whether the final $ in a string was meant to be
+a literal dollar sign, or was meant to introduce a variable name that
+happens to be missing.  So you have to put either the backslash or the
+name.
+
+=item flock() on closed filehandle %s
+
+(W closed) The filehandle you're attempting to flock() got itself closed
+some time before now.  Check your control flow.  flock() operates on
+filehandles.  Are you attempting to call flock() on a dirhandle by the
+same name?
+
+=item Format not terminated
+
+(F) A format must be terminated by a line with a solitary dot.  Perl got
+to the end of your file without finding such a line.
+
+=item Format %s redefined
+
+(W redefine) You redefined a format.  To suppress this warning, say
+
+    {
+	no warnings 'redefine';
+	eval "format NAME =...";
+    }
+
+=item Found = in conditional, should be ==
+
+(W syntax) You said
+
+    if ($foo = 123)
+
+when you meant
+
+    if ($foo == 123)
+
+(or something like that).
+
+=item %s found where operator expected
+
+(S syntax) The Perl lexer knows whether to expect a term or an operator.
+If it sees what it knows to be a term when it was expecting to see an
+operator, it gives you this warning.  Usually it indicates that an
+operator or delimiter was omitted, such as a semicolon.
+
+=item gdbm store returned %d, errno %d, key "%s"
+
+(S) A warning from the GDBM_File extension that a store failed.
+
+=item gethostent not implemented
+
+(F) Your C library apparently doesn't implement gethostent(), probably
+because if it did, it'd feel morally obligated to return every hostname
+on the Internet.
+
+=item get%sname() on closed socket %s
+
+(W closed) You tried to get a socket or peer socket name on a closed
+socket.  Did you forget to check the return value of your socket() call?
+
+=item getpwnam returned invalid UIC %#o for user "%s"
+
+(S) A warning peculiar to VMS.  The call to C<sys$getuai> underlying the
+C<getpwnam> operator returned an invalid UIC.
+
+=item getsockopt() on closed socket %s
+
+(W closed) You tried to get a socket option on a closed socket.  Did you
+forget to check the return value of your socket() call?  See
+L<perlfunc/getsockopt>.
+
+=item Global symbol "%s" requires explicit package name
+
+(F) You've said "use strict vars", which indicates that all variables
+must either be lexically scoped (using "my"), declared beforehand using
+"our", or explicitly qualified to say which package the global variable
+is in (using "::").
+
+=item glob failed (%s)
+
+(W glob) Something went wrong with the external program(s) used for
+C<glob> and C<< <*.c> >>.  Usually, this means that you supplied a
+C<glob> pattern that caused the external program to fail and exit with a
+nonzero status.  If the message indicates that the abnormal exit
+resulted in a coredump, this may also mean that your csh (C shell) is
+broken.  If so, you should change all of the csh-related variables in
+config.sh:  If you have tcsh, make the variables refer to it as if it
+were csh (e.g.  C<full_csh='/usr/bin/tcsh'>); otherwise, make them all
+empty (except that C<d_csh> should be C<'undef'>) so that Perl will
+think csh is missing.  In either case, after editing config.sh, run
+C<./Configure -S> and rebuild Perl.
+
+=item Glob not terminated
+
+(F) The lexer saw a left angle bracket in a place where it was expecting
+a term, so it's looking for the corresponding right angle bracket, and
+not finding it.  Chances are you left some needed parentheses out
+earlier in the line, and you really meant a "less than".
+
+=item Got an error from DosAllocMem
+
+(P) An error peculiar to OS/2.  Most probably you're using an obsolete
+version of Perl, and this should not happen anyway.
+
+=item goto must have label
+
+(F) Unlike with "next" or "last", you're not allowed to goto an
+unspecified destination.  See L<perlfunc/goto>.
+
+=item ()-group starts with a count
+
+(F) A ()-group started with a count.  A count is
+supposed to follow something: a template character or a ()-group.
+ See L<perlfunc/pack>.
+
+=item %s had compilation errors
+
+(F) The final summary message when a C<perl -c> fails.
+
+=item Had to create %s unexpectedly
+
+(S internal) A routine asked for a symbol from a symbol table that ought
+to have existed already, but for some reason it didn't, and had to be
+created on an emergency basis to prevent a core dump.
+
+=item Hash %%s missing the % in argument %d of %s()
+
+(D deprecated) Really old Perl let you omit the % on hash names in some
+spots.  This is now heavily deprecated.
+
+=item %s has too many errors
+
+(F) The parser has given up trying to parse the program after 10 errors.
+Further error messages would likely be uninformative.
+
+=item Hexadecimal number > 0xffffffff non-portable
+
+(W portable) The hexadecimal number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems.  See
+L<perlport> for more on portability concerns.
+
+=item Identifier too long
+
+(F) Perl limits identifiers (names for variables, functions, etc.) to
+about 250 characters for simple names, and somewhat more for compound
+names (like C<$A::B>).  You've exceeded Perl's limits.  Future versions
+of Perl are likely to eliminate these arbitrary limitations.
+
+=item Illegal binary digit %s
+
+(F) You used a digit other than 0 or 1 in a binary number.
+
+=item Illegal binary digit %s ignored
+
+(W digit) You may have tried to use a digit other than 0 or 1 in a
+binary number.  Interpretation of the binary number stopped before the
+offending digit.
+
+=item Illegal character %s (carriage return)
+
+(F) Perl normally treats carriage returns in the program text as it
+would any other whitespace, which means you should never see this error
+when Perl was built using standard options.  For some reason, your
+version of Perl appears to have been built without this support.  Talk
+to your Perl administrator.
+
+=item Illegal character in prototype for %s : %s
+
+(W syntax) An illegal character was found in a prototype declaration.  Legal
+characters in prototypes are $, @, %, *, ;, [, ], &, and \.
+
+=item Illegal declaration of anonymous subroutine
+
+(F) When using the C<sub> keyword to construct an anonymous subroutine,
+you must always specify a block of code. See L<perlsub>.
+
+=item Illegal declaration of subroutine %s
+
+(F) A subroutine was not declared correctly. See L<perlsub>.
+
+=item Illegal division by zero
+
+(F) You tried to divide a number by 0.  Either something was wrong in
+your logic, or you need to put a conditional in to guard against
+meaningless input.
+
+=item Illegal hexadecimal digit %s ignored
+
+(W digit) You may have tried to use a character other than 0 - 9 or
+A - F, a - f in a hexadecimal number.  Interpretation of the hexadecimal
+number stopped before the illegal character.
+
+=item Illegal modulus zero
+
+(F) You tried to divide a number by 0 to get the remainder.  Most
+numbers don't take to this kindly.
+
+=item Illegal number of bits in vec
+
+(F) The number of bits in vec() (the third argument) must be a power of
+two from 1 to 32 (or 64, if your platform supports that).
+
+=item Illegal octal digit %s
+
+(F) You used an 8 or 9 in an octal number.
+
+=item Illegal octal digit %s ignored
+
+(W digit) You may have tried to use an 8 or 9 in an octal number.
+Interpretation of the octal number stopped before the 8 or 9.
+
+=item Illegal switch in PERL5OPT: %s
+
+(X) The PERL5OPT environment variable may only be used to set the
+following switches: B<-[DIMUdmtw]>.
+
+=item Ill-formed CRTL environ value "%s"
+
+(W internal) A warning peculiar to VMS.  Perl tried to read the CRTL's
+internal environ array, and encountered an element without the C<=>
+delimiter used to separate keys from values.  The element is ignored.
+
+=item Ill-formed message in prime_env_iter: |%s|
+
+(W internal) A warning peculiar to VMS.  Perl tried to read a logical
+name or CLI symbol definition when preparing to iterate over %ENV, and
+didn't see the expected delimiter between key and value, so the line was
+ignored.
+
+=item (in cleanup) %s
+
+(W misc) This prefix usually indicates that a DESTROY() method raised
+the indicated exception.  Since destructors are usually called by the
+system at arbitrary points during execution, and often a vast number of
+times, the warning is issued only once for any number of failures that
+would otherwise result in the same message being repeated.
+
+Failure of user callbacks dispatched using the C<G_KEEPERR> flag could
+also result in this warning.  See L<perlcall/G_KEEPERR>.
+
+=item In EBCDIC the v-string components cannot exceed 2147483647
+
+(F) An error peculiar to EBCDIC.  Internally, v-strings are stored as
+Unicode code points, and encoded in EBCDIC as UTF-EBCDIC.  The UTF-EBCDIC
+encoding is limited to code points no larger than 2147483647 (0x7FFFFFFF).
+
+=item Insecure dependency in %s
+
+(F) You tried to do something that the tainting mechanism didn't like.
+The tainting mechanism is turned on when you're running setuid or
+setgid, or when you specify B<-T> to turn it on explicitly.  The
+tainting mechanism labels all data that's derived directly or indirectly
+from the user, who is considered to be unworthy of your trust.  If any
+such data is used in a "dangerous" operation, you get this error.  See
+L<perlsec> for more information.
+
+=item Insecure directory in %s
+
+(F) You can't use system(), exec(), or a piped open in a setuid or
+setgid script if C<$ENV{PATH}> contains a directory that is writable by
+the world.  Also, the PATH must not contain any relative directory.
+See L<perlsec>.
+
+=item Insecure $ENV{%s} while running %s
+
+(F) You can't use system(), exec(), or a piped open in a setuid or
+setgid script if any of C<$ENV{PATH}>, C<$ENV{IFS}>, C<$ENV{CDPATH}>,
+C<$ENV{ENV}>, C<$ENV{BASH_ENV}> or C<$ENV{TERM}> are derived from data
+supplied (or potentially supplied) by the user.  The script must set
+the path to a known value, using trustworthy data.  See L<perlsec>.
+
+=item Integer overflow in %s number
+
+(W overflow) The hexadecimal, octal or binary number you have specified
+either as a literal or as an argument to hex() or oct() is too big for
+your architecture, and has been converted to a floating point number.
+On a 32-bit architecture the largest hexadecimal, octal or binary number
+representable without overflow is 0xFFFFFFFF, 037777777777, or
+0b11111111111111111111111111111111 respectively.  Note that Perl
+transparently promotes all numbers to a floating point representation
+internally--subject to loss of precision errors in subsequent
+operations.
+
+=item Internal disaster in regex; marked by <-- HERE in m/%s/
+
+(P) Something went badly wrong in the regular expression parser.
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item Internal inconsistency in tracking vforks
+
+(S) A warning peculiar to VMS.  Perl keeps track of the number of times
+you've called C<fork> and C<exec>, to determine whether the current call
+to C<exec> should affect the current script or a subprocess (see
+L<perlvms/"exec LIST">).  Somehow, this count has become scrambled, so
+Perl is making a guess and treating this C<exec> as a request to
+terminate the Perl script and execute the specified command.
+
+=item Internal urp in regex; marked by <-- HERE in m/%s/
+
+(P) Something went badly awry in the regular expression parser. The
+<-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item %s (...) interpreted as function
+
+(W syntax) You've run afoul of the rule that says that any list operator
+followed by parentheses turns into a function, with all the list
+operators arguments found inside the parentheses.  See
+L<perlop/Terms and List Operators (Leftward)>.
+
+=item Invalid %s attribute: %s
+
+The indicated attribute for a subroutine or variable was not recognized
+by Perl or by a user-supplied handler.  See L<attributes>.
+
+=item Invalid %s attributes: %s
+
+The indicated attributes for a subroutine or variable were not
+recognized by Perl or by a user-supplied handler.  See L<attributes>.
+
+=item Invalid conversion in %s: "%s"
+
+(W printf) Perl does not understand the given format conversion.  See
+L<perlfunc/sprintf>.
+
+=item Invalid [] range "%s" in regex; marked by <-- HERE in m/%s/
+
+(F) The range specified in a character class had a minimum character
+greater than the maximum character.  One possibility is that you forgot the
+C<{}> from your ending C<\x{}> - C<\x> without the curly braces can go only
+up to C<ff>.  The <-- HERE shows in the regular expression about where the
+problem was discovered.  See L<perlre>.
+
+=item Invalid range "%s" in transliteration operator
+
+(F) The range specified in the tr/// or y/// operator had a minimum
+character greater than the maximum character.  See L<perlop>.
+
+=item Invalid separator character %s in attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of an attribute list.  If the previous attribute had a
+parenthesised parameter list, perhaps that list was terminated too soon.
+See L<attributes>.
+
+=item Invalid separator character %s in PerlIO layer specification %s
+
+(W layer) When pushing layers onto the Perl I/O system, something other than a
+colon or whitespace was seen between the elements of a layer list.
+If the previous attribute had a parenthesised parameter list, perhaps that
+list was terminated too soon.
+
+=item Invalid type '%s' in %s
+
+(F) The given character is not a valid pack or unpack type.
+See L<perlfunc/pack>.
+(W) The given character is not a valid pack or unpack type but used to be
+silently ignored.
+
+=item ioctl is not implemented
+
+(F) Your machine apparently doesn't implement ioctl(), which is pretty
+strange for a machine that supports C.
+
+=item ioctl() on unopened %s
+
+(W unopened) You tried ioctl() on a filehandle that was never opened.
+Check you control flow and number of arguments.
+
+=item IO layers (like "%s") unavailable
+
+(F) Your Perl has not been configured to have PerlIO, and therefore
+you cannot use IO layers.  To have PerlIO Perl must be configured
+with 'useperlio'.
+
+=item IO::Socket::atmark not implemented on this architecture
+
+(F) Your machine doesn't implement the sockatmark() functionality,
+neither as a system call or an ioctl call (SIOCATMARK).
+
+=item `%s' is not a code reference
+
+(W overload) The second (fourth, sixth, ...) argument of overload::constant
+needs to be a code reference. Either an anonymous subroutine, or a reference
+to a subroutine.
+
+=item `%s' is not an overloadable type
+
+(W overload) You tried to overload a constant type the overload package is
+unaware of.
+
+=item junk on end of regexp
+
+(P) The regular expression parser is confused.
+
+=item Label not found for "last %s"
+
+(F) You named a loop to break out of, but you're not currently in a loop
+of that name, not even if you count where you were called from.  See
+L<perlfunc/last>.
+
+=item Label not found for "next %s"
+
+(F) You named a loop to continue, but you're not currently in a loop of
+that name, not even if you count where you were called from.  See
+L<perlfunc/last>.
+
+=item Label not found for "redo %s"
+
+(F) You named a loop to restart, but you're not currently in a loop of
+that name, not even if you count where you were called from.  See
+L<perlfunc/last>.
+
+=item leaving effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item length/code after end of string in unpack
+
+(F) While unpacking, the string buffer was already used up when an unpack
+length/code combination tried to obtain more data. This results in
+an undefined value for the length. See L<perlfunc/pack>.
+
+=item listen() on closed socket %s
+
+(W closed) You tried to do a listen on a closed socket.  Did you forget
+to check the return value of your socket() call?  See
+L<perlfunc/listen>.
+
+=item Lookbehind longer than %d not implemented in regex; marked by <-- HERE in m/%s/
+
+(F) There is currently a limit on the length of string which lookbehind can
+handle. This restriction may be eased in a future release. The <-- HERE
+shows in the regular expression about where the problem was discovered.
+
+=item lstat() on filehandle %s
+
+(W io) You tried to do an lstat on a filehandle.  What did you mean
+by that?  lstat() makes sense only on filenames.  (Perl did a fstat()
+instead on the filehandle.)
+
+=item Lvalue subs returning %s not implemented yet
+
+(F) Due to limitations in the current implementation, array and hash
+values cannot be returned in subroutines used in lvalue context.  See
+L<perlsub/"Lvalue subroutines">.
+
+=item Malformed integer in [] in  pack
+
+(F) Between the  brackets enclosing a numeric repeat count only digits
+are permitted.  See L<perlfunc/pack>.
+
+=item Malformed integer in [] in unpack
+
+(F) Between the  brackets enclosing a numeric repeat count only digits
+are permitted.  See L<perlfunc/pack>.
+
+=item Malformed PERLLIB_PREFIX
+
+(F) An error peculiar to OS/2.  PERLLIB_PREFIX should be of the form
+
+    prefix1;prefix2
+
+or
+    prefix1 prefix2
+
+with nonempty prefix1 and prefix2.  If C<prefix1> is indeed a prefix of
+a builtin library search path, prefix2 is substituted.  The error may
+appear if components are not found, or are too long.  See
+"PERLLIB_PREFIX" in L<perlos2>.
+
+=item Malformed prototype for %s: %s
+
+(F) You tried to use a function with a malformed prototype.  The
+syntax of function prototypes is given a brief compile-time check for
+obvious errors like invalid characters.  A more rigorous check is run
+when the function is called.
+
+=item Malformed UTF-8 character (%s)
+
+(S utf8) (F) Perl detected something that didn't comply with UTF-8
+encoding rules.
+
+One possible cause is that you read in data that you thought to be in
+UTF-8 but it wasn't (it was for example legacy 8-bit data).  Another
+possibility is careless use of utf8::upgrade().
+
+=item Malformed UTF-16 surrogate
+
+Perl thought it was reading UTF-16 encoded character data but while
+doing it Perl met a malformed Unicode surrogate.
+
+=item %s matches null string many times in regex; marked by <-- HERE in m/%s/
+
+(W regexp) The pattern you've specified would be an infinite loop if the
+regular expression engine didn't specifically check for that.  The <-- HERE
+shows in the regular expression about where the problem was discovered.
+See L<perlre>.
+
+=item "%s" may clash with future reserved word
+
+(W) This warning may be due to running a perl5 script through a perl4
+interpreter, especially if the word that is being warned about is
+"use" or "my".
+
+=item % may not be used in pack
+
+(F) You can't pack a string by supplying a checksum, because the
+checksumming process loses information, and you can't go the other way.
+See L<perlfunc/unpack>.
+
+=item Method for operation %s not found in package %s during blessing
+
+(F) An attempt was made to specify an entry in an overloading table that
+doesn't resolve to a valid subroutine.  See L<overload>.
+
+=item Method %s not permitted
+
+See Server error.
+
+=item Might be a runaway multi-line %s string starting on line %d
+
+(S) An advisory indicating that the previous error may have been caused
+by a missing delimiter on a string or pattern, because it eventually
+ended earlier on the current line.
+
+=item Misplaced _ in number
+
+(W syntax) An underscore (underbar) in a numeric constant did not
+separate two digits.
+
+=item Missing argument to -%c
+
+(F) The argument to the indicated command line switch must follow
+immediately after the switch, without intervening spaces.
+
+=item Missing %sbrace%s on \N{}
+
+(F) Wrong syntax of character name literal C<\N{charname}> within
+double-quotish context.
+
+=item Missing comma after first argument to %s function
+
+(F) While certain functions allow you to specify a filehandle or an
+"indirect object" before the argument list, this ain't one of them.
+
+=item Missing command in piped open
+
+(W pipe) You used the C<open(FH, "| command")> or
+C<open(FH, "command |")> construction, but the command was missing or
+blank.
+
+=item Missing control char name in \c
+
+(F) A double-quoted string ended with "\c", without the required control
+character name.
+
+=item Missing name in "my sub"
+
+(F) The reserved syntax for lexically scoped subroutines requires that
+they have a name with which they can be found.
+
+=item Missing $ on loop variable
+
+(F) Apparently you've been programming in B<csh> too much.  Variables
+are always mentioned with the $ in Perl, unlike in the shells, where it
+can vary from one line to the next.
+
+=item (Missing operator before %s?)
+
+(S syntax) This is an educated guess made in conjunction with the message
+"%s found where operator expected".  Often the missing operator is a comma.
+
+=item Missing right brace on %s
+
+(F) Missing right brace in C<\p{...}> or C<\P{...}>.
+
+=item Missing right curly or square bracket
+
+(F) The lexer counted more opening curly or square brackets than closing
+ones.  As a general rule, you'll find it's missing near the place you
+were last editing.
+
+=item (Missing semicolon on previous line?)
+
+(S syntax) This is an educated guess made in conjunction with the message
+"%s found where operator expected".  Don't automatically put a semicolon on
+the previous line just because you saw this message.
+
+=item Modification of a read-only value attempted
+
+(F) You tried, directly or indirectly, to change the value of a
+constant.  You didn't, of course, try "2 = 1", because the compiler
+catches that.  But an easy way to do the same thing is:
+
+    sub mod { $_[0] = 1 }
+    mod(2);
+
+Another way is to assign to a substr() that's off the end of the string.
+
+Yet another way is to assign to a C<foreach> loop I<VAR> when I<VAR>
+is aliased to a constant in the look I<LIST>:
+
+        $x = 1;
+        foreach my $n ($x, 2) {
+            $n *= 2; # modifies the $x, but fails on attempt to modify the 2
+        }
+
+=item Modification of non-creatable array value attempted, %s
+
+(F) You tried to make an array value spring into existence, and the
+subscript was probably negative, even counting from end of the array
+backwards.
+
+=item Modification of non-creatable hash value attempted, %s
+
+(P) You tried to make a hash value spring into existence, and it
+couldn't be created for some peculiar reason.
+
+=item Module name must be constant
+
+(F) Only a bare module name is allowed as the first argument to a "use".
+
+=item Module name required with -%c option
+
+(F) The C<-M> or C<-m> options say that Perl should load some module, but
+you omitted the name of the module.  Consult L<perlrun> for full details
+about C<-M> and C<-m>.
+
+=item More than one argument to open
+
+(F) The C<open> function has been asked to open multiple files. This
+can happen if you are trying to open a pipe to a command that takes a
+list of arguments, but have forgotten to specify a piped open mode.
+See L<perlfunc/open> for details.
+
+=item msg%s not implemented
+
+(F) You don't have System V message IPC on your system.
+
+=item Multidimensional syntax %s not supported
+
+(W syntax) Multidimensional arrays aren't written like C<$foo[1,2,3]>.
+They're written like C<$foo[1][2][3]>, as in C.
+
+=item '/' must be followed by 'a*', 'A*' or 'Z*'
+
+(F) You had a pack template indicating a counted-length string,
+Currently the only things that can have their length counted are a*, A*
+or Z*.  See L<perlfunc/pack>.
+
+=item '/' must follow a numeric type in unpack
+
+(F) You had an unpack template that contained a '/', but this did not
+follow some unpack specification producing a numeric value.
+See L<perlfunc/pack>.
+
+=item "my sub" not yet implemented
+
+(F) Lexically scoped subroutines are not yet implemented.  Don't try
+that yet.
+
+=item "my" variable %s can't be in a package
+
+(F) Lexically scoped variables aren't in a package, so it doesn't make
+sense to try to declare one with a package qualifier on the front.  Use
+local() if you want to localize a package variable.
+
+=item Name "%s::%s" used only once: possible typo
+
+(W once) Typographical errors often show up as unique variable names.
+If you had a good reason for having a unique name, then just mention it
+again somehow to suppress the message.  The C<our> declaration is
+provided for this purpose.
+
+NOTE: This warning detects symbols that have been used only once so $c, @c,
+%c, *c, &c, sub c{}, c(), and c (the filehandle or format) are considered
+the same; if a program uses $c only once but also uses any of the others it
+will not trigger this warning.
+
+=item Negative '/' count in unpack
+
+(F) The length count obtained from a length/code unpack operation was
+negative.  See L<perlfunc/pack>.
+
+=item Negative length
+
+(F) You tried to do a read/write/send/recv operation with a buffer
+length that is less than 0.  This is difficult to imagine.
+
+=item Negative offset to vec in lvalue context
+
+(F) When C<vec> is called in an lvalue context, the second argument must be
+greater than or equal to zero.
+
+=item Nested quantifiers in regex; marked by <-- HERE in m/%s/
+
+(F) You can't quantify a quantifier without intervening parentheses. So
+things like ** or +* or ?* are illegal. The <-- HERE shows in the regular
+expression about where the problem was discovered.
+
+Note that the minimal matching quantifiers, C<*?>, C<+?>, and
+C<??> appear to be nested quantifiers, but aren't.  See L<perlre>.
+
+=item %s never introduced
+
+(S internal) The symbol in question was declared but somehow went out of
+scope before it could possibly have been used.
+
+=item Newline in left-justified string for %s
+
+(W printf) There is a newline in a string to be left justified by 
+C<printf> or C<sprintf>.
+
+The padding spaces will appear after the newline, which is probably not
+what you wanted.  Usually you should remove the newline from the string 
+and put formatting characters in the C<sprintf> format.
+
+=item No %s allowed while running setuid
+
+(F) Certain operations are deemed to be too insecure for a setuid or
+setgid script to even be allowed to attempt.  Generally speaking there
+will be another way to do what you want that is, if not secure, at least
+securable.  See L<perlsec>.
+
+=item No comma allowed after %s
+
+(F) A list operator that has a filehandle or "indirect object" is not
+allowed to have a comma between that and the following arguments.
+Otherwise it'd be just another one of the arguments.
+
+One possible cause for this is that you expected to have imported a
+constant to your name space with B<use> or B<import> while no such
+importing took place, it may for example be that your operating system
+does not support that particular constant. Hopefully you did use an
+explicit import list for the constants you expect to see, please see
+L<perlfunc/use> and L<perlfunc/import>. While an explicit import list
+would probably have caught this error earlier it naturally does not
+remedy the fact that your operating system still does not support that
+constant. Maybe you have a typo in the constants of the symbol import
+list of B<use> or B<import> or in the constant name at the line where
+this error was triggered?
+
+=item No command into which to pipe on command line
+
+(F) An error peculiar to VMS.  Perl handles its own command line
+redirection, and found a '|' at the end of the command line, so it
+doesn't know where you want to pipe the output from this command.
+
+=item No DB::DB routine defined
+
+(F) The currently executing code was compiled with the B<-d> switch, but
+for some reason the  current debugger (e.g. F<perl5db.pl> or a C<Devel::>
+module) didn't define a routine to be called at the beginning of each
+statement.
+
+=item No dbm on this machine
+
+(P) This is counted as an internal error, because every machine should
+supply dbm nowadays, because Perl comes with SDBM.  See L<SDBM_File>.
+
+=item No DB::sub routine defined
+
+(F) The currently executing code was compiled with the B<-d> switch, but
+for some reason the current debugger (e.g. F<perl5db.pl> or a C<Devel::>
+module) didn't define a C<DB::sub> routine to be called at the beginning
+of each ordinary subroutine call.
+
+=item No B<-e> allowed in setuid scripts
+
+(F) A setuid script can't be specified by the user.
+
+=item No error file after 2> or 2>> on command line
+
+(F) An error peculiar to VMS.  Perl handles its own command line
+redirection, and found a '2>' or a '2>>' on the command line, but can't
+find the name of the file to which to write data destined for stderr.
+
+=item No group ending character '%c' found in template
+
+(F) A pack or unpack template has an opening '(' or '[' without its
+matching counterpart. See L<perlfunc/pack>.
+
+=item No input file after < on command line
+
+(F) An error peculiar to VMS.  Perl handles its own command line
+redirection, and found a '<' on the command line, but can't find the
+name of the file from which to read data for stdin.
+
+=item No #! line
+
+(F) The setuid emulator requires that scripts have a well-formed #! line
+even on machines that don't support the #! construct.
+
+=item "no" not allowed in expression
+
+(F) The "no" keyword is recognized and executed at compile time, and
+returns no useful value.  See L<perlmod>.
+
+=item No output file after > on command line
+
+(F) An error peculiar to VMS.  Perl handles its own command line
+redirection, and found a lone '>' at the end of the command line, so it
+doesn't know where you wanted to redirect stdout.
+
+=item No output file after > or >> on command line
+
+(F) An error peculiar to VMS.  Perl handles its own command line
+redirection, and found a '>' or a '>>' on the command line, but can't
+find the name of the file to which to write data destined for stdout.
+
+=item No package name allowed for variable %s in "our"
+
+(F) Fully qualified variable names are not allowed in "our"
+declarations, because that doesn't make much sense under existing
+semantics.  Such syntax is reserved for future extensions.
+
+=item No Perl script found in input
+
+(F) You called C<perl -x>, but no line was found in the file beginning
+with #! and containing the word "perl".
+
+=item No setregid available
+
+(F) Configure didn't find anything resembling the setregid() call for
+your system.
+
+=item No setreuid available
+
+(F) Configure didn't find anything resembling the setreuid() call for
+your system.
+
+=item No %s specified for -%c
+
+(F) The indicated command line switch needs a mandatory argument, but
+you haven't specified one.
+
+=item No such class %s
+
+(F) You provided a class qualifier in a "my" or "our" declaration, but
+this class doesn't exist at this point in your program.
+
+=item No such pipe open
+
+(P) An error peculiar to VMS.  The internal routine my_pclose() tried to
+close a pipe which hadn't been opened.  This should have been caught
+earlier as an attempt to close an unopened filehandle.
+
+=item No such pseudo-hash field "%s"
+
+(F) You tried to access an array as a hash, but the field name used is
+not defined.  The hash at index 0 should map all valid field names to
+array indices for that to work.
+
+=item No such pseudo-hash field "%s" in variable %s of type %s
+
+(F) You tried to access a field of a typed variable where the type does
+not know about the field name.  The field names are looked up in the
+%FIELDS hash in the type package at compile time.  The %FIELDS hash is
+%usually set up with the 'fields' pragma.
+
+=item No such signal: SIG%s
+
+(W signal) You specified a signal name as a subscript to %SIG that was
+not recognized.  Say C<kill -l> in your shell to see the valid signal
+names on your system.
+
+=item Not a CODE reference
+
+(F) Perl was trying to evaluate a reference to a code value (that is, a
+subroutine), but found a reference to something else instead.  You can
+use the ref() function to find out what kind of ref it really was.  See
+also L<perlref>.
+
+=item Not a format reference
+
+(F) I'm not sure how you managed to generate a reference to an anonymous
+format, but this indicates you did, and that it didn't exist.
+
+=item Not a GLOB reference
+
+(F) Perl was trying to evaluate a reference to a "typeglob" (that is, a
+symbol table entry that looks like C<*foo>), but found a reference to
+something else instead.  You can use the ref() function to find out what
+kind of ref it really was.  See L<perlref>.
+
+=item Not a HASH reference
+
+(F) Perl was trying to evaluate a reference to a hash value, but found a
+reference to something else instead.  You can use the ref() function to
+find out what kind of ref it really was.  See L<perlref>.
+
+=item Not an ARRAY reference
+
+(F) Perl was trying to evaluate a reference to an array value, but found
+a reference to something else instead.  You can use the ref() function
+to find out what kind of ref it really was.  See L<perlref>.
+
+=item Not a perl script
+
+(F) The setuid emulator requires that scripts have a well-formed #! line
+even on machines that don't support the #! construct.  The line must
+mention perl.
+
+=item Not a SCALAR reference
+
+(F) Perl was trying to evaluate a reference to a scalar value, but found
+a reference to something else instead.  You can use the ref() function
+to find out what kind of ref it really was.  See L<perlref>.
+
+=item Not a subroutine reference
+
+(F) Perl was trying to evaluate a reference to a code value (that is, a
+subroutine), but found a reference to something else instead.  You can
+use the ref() function to find out what kind of ref it really was.  See
+also L<perlref>.
+
+=item Not a subroutine reference in overload table
+
+(F) An attempt was made to specify an entry in an overloading table that
+doesn't somehow point to a valid subroutine.  See L<overload>.
+
+=item Not enough arguments for %s
+
+(F) The function requires more arguments than you specified.
+
+=item Not enough format arguments
+
+(W syntax) A format specified more picture fields than the next line
+supplied.  See L<perlform>.
+
+=item %s: not found
+
+(A) You've accidentally run your script through the Bourne shell instead
+of Perl.  Check the #! line, or manually feed your script into Perl
+yourself.
+
+=item no UTC offset information; assuming local time is UTC
+
+(S) A warning peculiar to VMS.  Perl was unable to find the local
+timezone offset, so it's assuming that local system time is equivalent
+to UTC.  If it's not, define the logical name
+F<SYS$TIMEZONE_DIFFERENTIAL> to translate to the number of seconds which
+need to be added to UTC to get local time.
+
+=item Non-string passed as bitmask
+
+(W misc) A number has been passed as a bitmask argument to select().
+Use the vec() function to construct the file descriptor bitmasks for
+select. See L<perlfunc/select>
+
+=item Null filename used
+
+(F) You can't require the null filename, especially because on many
+machines that means the current directory!  See L<perlfunc/require>.
+
+=item NULL OP IN RUN
+
+(P debugging) Some internal routine called run() with a null opcode
+pointer.
+
+=item Null picture in formline
+
+(F) The first argument to formline must be a valid format picture
+specification.  It was found to be empty, which probably means you
+supplied it an uninitialized value.  See L<perlform>.
+
+=item Null realloc
+
+(P) An attempt was made to realloc NULL.
+
+=item NULL regexp argument
+
+(P) The internal pattern matching routines blew it big time.
+
+=item NULL regexp parameter
+
+(P) The internal pattern matching routines are out of their gourd.
+
+=item Number too long
+
+(F) Perl limits the representation of decimal numbers in programs to
+about 250 characters.  You've exceeded that length.  Future
+versions of Perl are likely to eliminate this arbitrary limitation.  In
+the meantime, try using scientific notation (e.g. "1e6" instead of
+"1_000_000").
+
+=item Octal number in vector unsupported
+
+(F) Numbers with a leading C<0> are not currently allowed in vectors.
+The octal number interpretation of such numbers may be supported in a
+future version.
+
+=item Octal number > 037777777777 non-portable
+
+(W portable) The octal number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems.  See
+L<perlport> for more on portability concerns.
+
+See also L<perlport> for writing portable code.
+
+=item Odd number of arguments for overload::constant
+
+(W overload) The call to overload::constant contained an odd number of
+arguments. The arguments should come in pairs.
+
+=item Odd number of elements in anonymous hash
+
+(W misc) You specified an odd number of elements to initialize a hash,
+which is odd, because hashes come in key/value pairs.
+
+=item Odd number of elements in hash assignment
+
+(W misc) You specified an odd number of elements to initialize a hash,
+which is odd, because hashes come in key/value pairs.
+
+=item Offset outside string
+
+(F) You tried to do a read/write/send/recv operation with an offset
+pointing outside the buffer.  This is difficult to imagine.  The sole
+exception to this is that C<sysread()>ing past the buffer will extend
+the buffer and zero pad the new area.
+
+=item %s() on unopened %s
+
+(W unopened) An I/O operation was attempted on a filehandle that was
+never initialized.  You need to do an open(), a sysopen(), or a socket()
+call, or call a constructor from the FileHandle package.
+
+=item -%s on unopened filehandle %s
+
+(W unopened) You tried to invoke a file test operator on a filehandle
+that isn't open.  Check your control flow.  See also L<perlfunc/-X>.
+
+=item oops: oopsAV
+
+(S internal) An internal warning that the grammar is screwed up.
+
+=item oops: oopsHV
+
+(S internal) An internal warning that the grammar is screwed up.
+
+=item Operation "%s": no method found, %s
+
+(F) An attempt was made to perform an overloaded operation for which no
+handler was defined.  While some handlers can be autogenerated in terms
+of other handlers, there is no default handler for any operation, unless
+C<fallback> overloading key is specified to be true.  See L<overload>.
+
+=item Operator or semicolon missing before %s
+
+(S ambiguous) You used a variable or subroutine call where the parser
+was expecting an operator.  The parser has assumed you really meant to
+use an operator, but this is highly likely to be incorrect.  For
+example, if you say "*foo *foo" it will be interpreted as if you said
+"*foo * 'foo'".
+
+=item "our" variable %s redeclared
+
+(W misc) You seem to have already declared the same global once before
+in the current lexical scope.
+
+=item Out of memory!
+
+(X) The malloc() function returned 0, indicating there was insufficient
+remaining memory (or virtual memory) to satisfy the request.  Perl has
+no option but to exit immediately.
+
+At least in Unix you may be able to get past this by increasing your
+process datasize limits: in csh/tcsh use C<limit> and
+C<limit datasize n> (where C<n> is the number of kilobytes) to check
+the current limits and change them, and in ksh/bash/zsh use C<ulimit -a>
+and C<ulimit -d n>, respectively.
+
+=item Out of memory during %s extend
+
+(X) An attempt was made to extend an array, a list, or a string beyond
+the largest possible memory allocation.
+
+=item Out of memory during "large" request for %s
+
+(F) The malloc() function returned 0, indicating there was insufficient
+remaining memory (or virtual memory) to satisfy the request. However,
+the request was judged large enough (compile-time default is 64K), so a
+possibility to shut down by trapping this error is granted.
+
+=item Out of memory during request for %s
+
+(X|F) The malloc() function returned 0, indicating there was
+insufficient remaining memory (or virtual memory) to satisfy the
+request.
+
+The request was judged to be small, so the possibility to trap it
+depends on the way perl was compiled.  By default it is not trappable.
+However, if compiled for this, Perl may use the contents of C<$^M> as an
+emergency pool after die()ing with this message.  In this case the error
+is trappable I<once>, and the error message will include the line and file
+where the failed request happened.
+
+=item Out of memory during ridiculously large request
+
+(F) You can't allocate more than 2^31+"small amount" bytes.  This error
+is most likely to be caused by a typo in the Perl program. e.g.,
+C<$arr[time]> instead of C<$arr[$time]>.
+
+=item Out of memory for yacc stack
+
+(F) The yacc parser wanted to grow its stack so it could continue
+parsing, but realloc() wouldn't give it more memory, virtual or
+otherwise.
+
+=item '@' outside of string in unpack
+
+(F) You had a template that specified an absolute position outside
+the string being unpacked.  See L<perlfunc/pack>.
+
+=item %s package attribute may clash with future reserved word: %s
+
+(W reserved) A lowercase attribute name was used that had a
+package-specific handler.  That name might have a meaning to Perl itself
+some day, even though it doesn't yet.  Perhaps you should use a
+mixed-case attribute name, instead.  See L<attributes>.
+
+=item pack/unpack repeat count overflow
+
+(F) You can't specify a repeat count so large that it overflows your
+signed integers.  See L<perlfunc/pack>.
+
+=item page overflow
+
+(W io) A single call to write() produced more lines than can fit on a
+page.  See L<perlform>.
+
+=item panic: %s
+
+(P) An internal error.
+
+=item panic: ck_grep
+
+(P) Failed an internal consistency check trying to compile a grep.
+
+=item panic: ck_split
+
+(P) Failed an internal consistency check trying to compile a split.
+
+=item panic: corrupt saved stack index
+
+(P) The savestack was requested to restore more localized values than
+there are in the savestack.
+
+=item panic: del_backref
+
+(P) Failed an internal consistency check while trying to reset a weak
+reference.
+
+=item panic: Devel::DProf inconsistent subroutine return
+
+(P) Devel::DProf called a subroutine that exited using goto(LABEL),
+last(LABEL) or next(LABEL). Leaving that way a subroutine called from
+an XSUB will lead very probably to a crash of the interpreter. This is
+a bug that will hopefully one day get fixed.
+
+=item panic: die %s
+
+(P) We popped the context stack to an eval context, and then discovered
+it wasn't an eval context.
+
+=item panic: do_subst
+
+(P) The internal pp_subst() routine was called with invalid operational
+data.
+
+=item panic: do_trans_%s
+
+(P) The internal do_trans routines were called with invalid operational
+data.
+
+=item panic: frexp
+
+(P) The library function frexp() failed, making printf("%f") impossible.
+
+=item panic: goto
+
+(P) We popped the context stack to a context with the specified label,
+and then discovered it wasn't a context we know how to do a goto in.
+
+=item panic: INTERPCASEMOD
+
+(P) The lexer got into a bad state at a case modifier.
+
+=item panic: INTERPCONCAT
+
+(P) The lexer got into a bad state parsing a string with brackets.
+
+=item panic: kid popen errno read
+
+(F) forked child returned an incomprehensible message about its errno.
+
+=item panic: last
+
+(P) We popped the context stack to a block context, and then discovered
+it wasn't a block context.
+
+=item panic: leave_scope clearsv
+
+(P) A writable lexical variable became read-only somehow within the
+scope.
+
+=item panic: leave_scope inconsistency
+
+(P) The savestack probably got out of sync.  At least, there was an
+invalid enum on the top of it.
+
+=item panic: magic_killbackrefs
+
+(P) Failed an internal consistency check while trying to reset all weak
+references to an object.
+
+=item panic: malloc
+
+(P) Something requested a negative number of bytes of malloc.
+
+=item panic: mapstart
+
+(P) The compiler is screwed up with respect to the map() function.
+
+=item panic: memory wrap
+
+(P) Something tried to allocate more memory than possible.
+
+=item panic: null array
+
+(P) One of the internal array routines was passed a null AV pointer.
+
+=item panic: pad_alloc
+
+(P) The compiler got confused about which scratch pad it was allocating
+and freeing temporaries and lexicals from.
+
+=item panic: pad_free curpad
+
+(P) The compiler got confused about which scratch pad it was allocating
+and freeing temporaries and lexicals from.
+
+=item panic: pad_free po
+
+(P) An invalid scratch pad offset was detected internally.
+
+=item panic: pad_reset curpad
+
+(P) The compiler got confused about which scratch pad it was allocating
+and freeing temporaries and lexicals from.
+
+=item panic: pad_sv po
+
+(P) An invalid scratch pad offset was detected internally.
+
+=item panic: pad_swipe curpad
+
+(P) The compiler got confused about which scratch pad it was allocating
+and freeing temporaries and lexicals from.
+
+=item panic: pad_swipe po
+
+(P) An invalid scratch pad offset was detected internally.
+
+=item panic: pp_iter
+
+(P) The foreach iterator got called in a non-loop context frame.
+
+=item panic: pp_match%s
+
+(P) The internal pp_match() routine was called with invalid operational
+data.
+
+=item panic: pp_split
+
+(P) Something terrible went wrong in setting up for the split.
+
+=item panic: realloc
+
+(P) Something requested a negative number of bytes of realloc.
+
+=item panic: restartop
+
+(P) Some internal routine requested a goto (or something like it), and
+didn't supply the destination.
+
+=item panic: return
+
+(P) We popped the context stack to a subroutine or eval context, and
+then discovered it wasn't a subroutine or eval context.
+
+=item panic: scan_num
+
+(P) scan_num() got called on something that wasn't a number.
+
+=item panic: sv_insert
+
+(P) The sv_insert() routine was told to remove more string than there
+was string.
+
+=item panic: top_env
+
+(P) The compiler attempted to do a goto, or something weird like that.
+
+=item panic: utf16_to_utf8: odd bytelen
+
+(P) Something tried to call utf16_to_utf8 with an odd (as opposed
+to even) byte length.
+
+=item panic: yylex
+
+(P) The lexer got into a bad state while processing a case modifier.
+
+=item Parentheses missing around "%s" list
+
+(W parenthesis) You said something like
+
+    my $foo, $bar = @_;
+
+when you meant
+
+    my ($foo, $bar) = @_;
+
+Remember that "my", "our", and "local" bind tighter than comma.
+
+=item C<-p> destination: %s
+
+(F) An error occurred during the implicit output invoked by the C<-p>
+command-line switch.  (This output goes to STDOUT unless you've
+redirected it with select().)
+
+=item (perhaps you forgot to load "%s"?)
+
+(F) This is an educated guess made in conjunction with the message
+"Can't locate object method \"%s\" via package \"%s\"".  It often means
+that a method requires a package that has not been loaded.
+
+=item Perl %s required--this is only version %s, stopped
+
+(F) The module in question uses features of a version of Perl more
+recent than the currently running version.  How long has it been since
+you upgraded, anyway?  See L<perlfunc/require>.
+
+=item PERL_SH_DIR too long
+
+(F) An error peculiar to OS/2. PERL_SH_DIR is the directory to find the
+C<sh>-shell in.  See "PERL_SH_DIR" in L<perlos2>.
+
+=item PERL_SIGNALS illegal: "%s"
+
+See L<perlrun/PERL_SIGNALS> for legal values.
+
+=item perl: warning: Setting locale failed.
+
+(S) The whole warning message will look something like:
+
+	perl: warning: Setting locale failed.
+	perl: warning: Please check that your locale settings:
+	        LC_ALL = "En_US",
+	        LANG = (unset)
+	    are supported and installed on your system.
+	perl: warning: Falling back to the standard locale ("C").
+
+Exactly what were the failed locale settings varies.  In the above the
+settings were that the LC_ALL was "En_US" and the LANG had no value.
+This error means that Perl detected that you and/or your operating
+system supplier and/or system administrator have set up the so-called
+locale system but Perl could not use those settings.  This was not
+dead serious, fortunately: there is a "default locale" called "C" that
+Perl can and will use, the script will be run.  Before you really fix
+the problem, however, you will get the same error message each time
+you run Perl.  How to really fix the problem can be found in
+L<perllocale> section B<LOCALE PROBLEMS>.
+
+=item Permission denied
+
+(F) The setuid emulator in suidperl decided you were up to no good.
+
+=item pid %x not a child
+
+(W exec) A warning peculiar to VMS.  Waitpid() was asked to wait for a
+process which isn't a subprocess of the current process.  While this is
+fine from VMS' perspective, it's probably not what you intended.
+
+=item 'P' must have an explicit size in unpack
+
+(F) The unpack format P must have an explicit size, not "*".
+
+=item B<-P> not allowed for setuid/setgid script
+
+(F) The script would have to be opened by the C preprocessor by name,
+which provides a race condition that breaks security.
+
+=item POSIX class [:%s:] unknown in regex; marked by <-- HERE in m/%s/
+
+(F) The class in the character class [: :] syntax is unknown.  The <-- HERE
+shows in the regular expression about where the problem was discovered.
+Note that the POSIX character classes do B<not> have the C<is> prefix
+the corresponding C interfaces have: in other words, it's C<[[:print:]]>,
+not C<isprint>.  See L<perlre>.
+
+=item POSIX getpgrp can't take an argument
+
+(F) Your system has POSIX getpgrp(), which takes no argument, unlike
+the BSD version, which takes a pid.
+
+=item POSIX syntax [%s] belongs inside character classes in regex; marked by <-- HERE in m/%s/
+
+(W regexp) The character class constructs [: :], [= =], and [. .]  go
+I<inside> character classes, the [] are part of the construct, for example:
+/[012[:alpha:]345]/.  Note that [= =] and [. .] are not currently
+implemented; they are simply placeholders for future extensions and will
+cause fatal errors.  The <-- HERE shows in the regular expression about
+where the problem was discovered.  See L<perlre>.
+
+=item POSIX syntax [. .] is reserved for future extensions in regex; marked by <-- HERE in m/%s/
+
+(F regexp) Within regular expression character classes ([]) the syntax
+beginning with "[." and ending with ".]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[." and ".\]".  The <-- HERE shows in the regular expression
+about where the problem was discovered.  See L<perlre>.
+
+=item POSIX syntax [= =] is reserved for future extensions in regex; marked by <-- HERE in m/%s/
+
+(F) Within regular expression character classes ([]) the syntax beginning
+with "[=" and ending with "=]" is reserved for future extensions.  If you
+need to represent those character sequences inside a regular expression
+character class, just quote the square brackets with the backslash: "\[="
+and "=\]".  The <-- HERE shows in the regular expression about where the
+problem was discovered.  See L<perlre>.
+
+=item Possible attempt to put comments in qw() list
+
+(W qw) qw() lists contain items separated by whitespace; as with literal
+strings, comment characters are not ignored, but are instead treated as
+literal data.  (You may have used different delimiters than the
+parentheses shown here; braces are also frequently used.)
+
+You probably wrote something like this:
+
+    @list = qw(
+	a # a comment
+        b # another comment
+    );
+
+when you should have written this:
+
+    @list = qw(
+	a
+        b
+    );
+
+If you really want comments, build your list the
+old-fashioned way, with quotes and commas:
+
+    @list = (
+        'a',    # a comment
+        'b',    # another comment
+    );
+
+=item Possible attempt to separate words with commas
+
+(W qw) qw() lists contain items separated by whitespace; therefore
+commas aren't needed to separate the items.  (You may have used
+different delimiters than the parentheses shown here; braces are also
+frequently used.)
+
+You probably wrote something like this:
+
+    qw! a, b, c !;
+
+which puts literal commas into some of the list items.  Write it without
+commas if you don't want them to appear in your data:
+
+    qw! a b c !;
+
+=item Possible memory corruption: %s overflowed 3rd argument
+
+(F) An ioctl() or fcntl() returned more than Perl was bargaining for.
+Perl guesses a reasonable buffer size, but puts a sentinel byte at the
+end of the buffer just in case.  This sentinel byte got clobbered, and
+Perl assumes that memory is now corrupted.  See L<perlfunc/ioctl>.
+
+=item Possible precedence problem on bitwise %c operator
+
+(W precedence) Your program uses a bitwise logical operator in conjunction
+with a numeric comparison operator, like this :
+
+    if ($x & $y == 0) { ... }
+
+This expression is actually equivalent to C<$x & ($y == 0)>, due to the
+higher precedence of C<==>. This is probably not what you want. (If you
+really meant to write this, disable the warning, or, better, put the
+parentheses explicitly and write C<$x & ($y == 0)>).
+
+=item Possible unintended interpolation of %s in string
+
+(W ambiguous) You said something like `@foo' in a double-quoted string
+but there was no array C<@foo> in scope at the time. If you wanted a
+literal @foo, then write it as \@foo; otherwise find out what happened
+to the array you apparently lost track of.
+
+=item Possible Y2K bug: %s
+
+(W y2k) You are concatenating the number 19 with another number, which
+could be a potential Year 2000 problem.
+
+=item pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead
+
+(D deprecated) You have written something like this:
+
+    sub doit
+    {
+        use attrs qw(locked);
+    }
+
+You should use the new declaration syntax instead.
+
+    sub doit : locked
+    {
+        ...
+
+The C<use attrs> pragma is now obsolete, and is only provided for
+backward-compatibility. See L<perlsub/"Subroutine Attributes">.
+
+=item Precedence problem: open %s should be open(%s)
+
+(S precedence) The old irregular construct
+
+    open FOO || die;
+
+is now misinterpreted as
+
+    open(FOO || die);
+
+because of the strict regularization of Perl 5's grammar into unary and
+list operators.  (The old open was a little of both.)  You must put
+parentheses around the filehandle, or use the new "or" operator instead
+of "||".
+
+=item Premature end of script headers
+
+See Server error.
+
+=item printf() on closed filehandle %s
+
+(W closed) The filehandle you're writing to got itself closed sometime
+before now.  Check your control flow.
+
+=item print() on closed filehandle %s
+
+(W closed) The filehandle you're printing on got itself closed sometime
+before now.  Check your control flow.
+
+=item Process terminated by SIG%s
+
+(W) This is a standard message issued by OS/2 applications, while *nix
+applications die in silence.  It is considered a feature of the OS/2
+port.  One can easily disable this by appropriate sighandlers, see
+L<perlipc/"Signals">.  See also "Process terminated by SIGTERM/SIGINT"
+in L<perlos2>.
+
+=item Prototype mismatch: %s vs %s
+
+(S prototype) The subroutine being declared or defined had previously been
+declared or defined with a different function prototype.
+
+=item Prototype not terminated
+
+(F) You've omitted the closing parenthesis in a function prototype
+definition.
+
+=item Pseudo-hashes are deprecated
+
+(D deprecated)  Pseudo-hashes were deprecated in Perl 5.8.0 and they
+will be removed in Perl 5.10.0, see L<perl58delta> for more details.
+You can continue to use the C<fields> pragma.
+
+=item Quantifier follows nothing in regex; marked by <-- HERE in m/%s/
+
+(F) You started a regular expression with a quantifier. Backslash it if you
+meant it literally. The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item Quantifier in {,} bigger than %d in regex; marked by <-- HERE in m/%s/
+
+(F) There is currently a limit to the size of the min and max values of the
+{min,max} construct. The <-- HERE shows in the regular expression about where
+the problem was discovered. See L<perlre>.
+
+=item Quantifier unexpected on zero-length expression; marked by <-- HERE in m/%s/
+
+(W regexp) You applied a regular expression quantifier in a place where
+it makes no sense, such as on a zero-width assertion.  Try putting the
+quantifier inside the assertion instead.  For example, the way to match
+"abc" provided that it is followed by three repetitions of "xyz" is
+C</abc(?=(?:xyz){3})/>, not C</abc(?=xyz){3}/>.
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item Range iterator outside integer range
+
+(F) One (or both) of the numeric arguments to the range operator ".."
+are outside the range which can be represented by integers internally.
+One possible workaround is to force Perl to use magical string increment
+by prepending "0" to your numbers.
+
+=item readline() on closed filehandle %s
+
+(W closed) The filehandle you're reading from got itself closed sometime
+before now.  Check your control flow.
+
+=item read() on closed filehandle %s
+
+(W closed) You tried to read from a closed filehandle.
+
+=item read() on unopened filehandle %s
+
+(W unopened) You tried to read from a filehandle that was never opened.
+
+=item Reallocation too large: %lx
+
+(F) You can't allocate more than 64K on an MS-DOS machine.
+
+=item realloc() of freed memory ignored
+
+(S malloc) An internal routine called realloc() on something that had
+already been freed.
+
+=item Recompile perl with B<-D>DEBUGGING to use B<-D> switch
+
+(F debugging) You can't use the B<-D> option unless the code to produce
+the desired output is compiled into Perl, which entails some overhead,
+which is why it's currently left out of your copy.
+
+=item Recursive inheritance detected in package '%s'
+
+(F) More than 100 levels of inheritance were used.  Probably indicates
+an unintended loop in your inheritance hierarchy.
+
+=item Recursive inheritance detected while looking for method %s
+
+(F) More than 100 levels of inheritance were encountered while invoking
+a method.  Probably indicates an unintended loop in your inheritance
+hierarchy.
+
+=item Reference found where even-sized list expected
+
+(W misc) You gave a single reference where Perl was expecting a list
+with an even number of elements (for assignment to a hash). This usually
+means that you used the anon hash constructor when you meant to use
+parens. In any case, a hash requires key/value B<pairs>.
+
+    %hash = { one => 1, two => 2, };	# WRONG
+    %hash = [ qw/ an anon array / ];	# WRONG
+    %hash = ( one => 1, two => 2, );	# right
+    %hash = qw( one 1 two 2 );			# also fine
+
+=item Reference is already weak
+
+(W misc) You have attempted to weaken a reference that is already weak.
+Doing so has no effect.
+
+=item Reference miscount in sv_replace()
+
+(W internal) The internal sv_replace() function was handed a new SV with
+a reference count of other than 1.
+
+=item Reference to nonexistent group in regex; marked by <-- HERE in m/%s/
+
+(F) You used something like C<\7> in your regular expression, but there are
+not at least seven sets of capturing parentheses in the expression. If you
+wanted to have the character with value 7 inserted into the regular expression,
+prepend a zero to make the number at least two digits: C<\07>
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.
+
+=item regexp memory corruption
+
+(P) The regular expression engine got confused by what the regular
+expression compiler gave it.
+
+=item Regexp out of space
+
+(P) A "can't happen" error, because safemalloc() should have caught it
+earlier.
+
+=item Repeated format line will never terminate (~~ and @# incompatible)
+
+(F) Your format contains the ~~ repeat-until-blank sequence and a
+numeric field that will never go blank so that the repetition never
+terminates. You might use ^# instead.  See L<perlform>.
+
+=item Reversed %s= operator
+
+(W syntax) You wrote your assignment operator backwards.  The = must
+always comes last, to avoid ambiguity with subsequent unary operators.
+
+=item Runaway format
+
+(F) Your format contained the ~~ repeat-until-blank sequence, but it
+produced 200 lines at once, and the 200th line looked exactly like the
+199th line.  Apparently you didn't arrange for the arguments to exhaust
+themselves, either by using ^ instead of @ (for scalar variables), or by
+shifting or popping (for array variables).  See L<perlform>.
+
+=item Scalars leaked: %d
+
+(P) Something went wrong in Perl's internal bookkeeping of scalars:
+not all scalar variables were deallocated by the time Perl exited.
+What this usually indicates is a memory leak, which is of course bad,
+especially if the Perl program is intended to be long-running.
+
+=item Scalar value @%s[%s] better written as $%s[%s]
+
+(W syntax) You've used an array slice (indicated by @) to select a
+single element of an array.  Generally it's better to ask for a scalar
+value (indicated by $).  The difference is that C<$foo[&bar]> always
+behaves like a scalar, both when assigning to it and when evaluating its
+argument, while C<@foo[&bar]> behaves like a list when you assign to it,
+and provides a list context to its subscript, which can do weird things
+if you're expecting only one subscript.
+
+On the other hand, if you were actually hoping to treat the array
+element as a list, you need to look into how references work, because
+Perl will not magically convert between scalars and lists for you.  See
+L<perlref>.
+
+=item Scalar value @%s{%s} better written as $%s{%s}
+
+(W syntax) You've used a hash slice (indicated by @) to select a single
+element of a hash.  Generally it's better to ask for a scalar value
+(indicated by $).  The difference is that C<$foo{&bar}> always behaves
+like a scalar, both when assigning to it and when evaluating its
+argument, while C<@foo{&bar}> behaves like a list when you assign to it,
+and provides a list context to its subscript, which can do weird things
+if you're expecting only one subscript.
+
+On the other hand, if you were actually hoping to treat the hash element
+as a list, you need to look into how references work, because Perl will
+not magically convert between scalars and lists for you.  See
+L<perlref>.
+
+=item Script is not setuid/setgid in suidperl
+
+(F) Oddly, the suidperl program was invoked on a script without a setuid
+or setgid bit set.  This doesn't make much sense.
+
+=item Search pattern not terminated
+
+(F) The lexer couldn't find the final delimiter of a // or m{}
+construct.  Remember that bracketing delimiters count nesting level.
+Missing the leading C<$> from a variable C<$m> may cause this error.
+
+Note that since Perl 5.9.0 a // can also be the I<defined-or>
+construct, not just the empty search pattern.  Therefore code written
+in Perl 5.9.0 or later that uses the // as the I<defined-or> can be
+misparsed by pre-5.9.0 Perls as a non-terminated search pattern.
+
+=item Search pattern not terminated or ternary operator parsed as search pattern
+
+(F) The lexer couldn't find the final delimiter of a C<?PATTERN?>
+construct.
+
+The question mark is also used as part of the ternary operator (as in
+C<foo ? 0 : 1>) leading to some ambiguous constructions being wrongly
+parsed. One way to disambiguate the parsing is to put parentheses around
+the conditional expression, i.e. C<(foo) ? 0 : 1>.
+
+=item %sseek() on unopened filehandle
+
+(W unopened) You tried to use the seek() or sysseek() function on a
+filehandle that was either never opened or has since been closed.
+
+=item select not implemented
+
+(F) This machine doesn't implement the select() system call.
+
+=item Self-ties of arrays and hashes are not supported
+
+(F) Self-ties are of arrays and hashes are not supported in
+the current implementation.
+
+=item Semicolon seems to be missing
+
+(W semicolon) A nearby syntax error was probably caused by a missing
+semicolon, or possibly some other missing operator, such as a comma.
+
+=item semi-panic: attempt to dup freed string
+
+(S internal) The internal newSVsv() routine was called to duplicate a
+scalar that had previously been marked as free.
+
+=item sem%s not implemented
+
+(F) You don't have System V semaphore IPC on your system.
+
+=item send() on closed socket %s
+
+(W closed) The socket you're sending to got itself closed sometime
+before now.  Check your control flow.
+
+=item Sequence (? incomplete in regex; marked by <-- HERE in m/%s/
+
+(F) A regular expression ended with an incomplete extension (?. The <-- HERE
+shows in the regular expression about where the problem was discovered. See
+L<perlre>.
+
+=item Sequence (?%s...) not implemented in regex; marked by <-- HERE in m/%s/
+
+(F) A proposed regular expression extension has the character reserved but
+has not yet been written. The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item Sequence (?%s...) not recognized in regex; marked by <-- HERE in m/%s/
+
+(F) You used a regular expression extension that doesn't make sense.  The
+<-- HERE shows in the regular expression about where the problem was
+discovered.  See L<perlre>.
+
+=item Sequence (?#... not terminated in regex; marked by <-- HERE in m/%s/
+
+(F) A regular expression comment must be terminated by a closing
+parenthesis.  Embedded parentheses aren't allowed.  The <-- HERE shows in
+the regular expression about where the problem was discovered. See
+L<perlre>.
+
+=item Sequence (?{...}) not terminated or not {}-balanced in regex; marked by <-- HERE in m/%s/
+
+(F) If the contents of a (?{...}) clause contains braces, they must balance
+for Perl to properly detect the end of the clause. The <-- HERE shows in
+the regular expression about where the problem was discovered. See
+L<perlre>.
+
+=item 500 Server error
+
+See Server error.
+
+=item Server error
+
+This is the error message generally seen in a browser window when trying
+to run a CGI program (including SSI) over the web. The actual error text
+varies widely from server to server. The most frequently-seen variants
+are "500 Server error", "Method (something) not permitted", "Document
+contains no data", "Premature end of script headers", and "Did not
+produce a valid header".
+
+B<This is a CGI error, not a Perl error>.
+
+You need to make sure your script is executable, is accessible by the
+user CGI is running the script under (which is probably not the user
+account you tested it under), does not rely on any environment variables
+(like PATH) from the user it isn't running under, and isn't in a
+location where the CGI server can't find it, basically, more or less.
+Please see the following for more information:
+
+	http://www.perl.org/CGI_MetaFAQ.html
+	http://www.htmlhelp.org/faq/cgifaq.html
+	http://www.w3.org/Security/Faq/
+
+You should also look at L<perlfaq9>.
+
+=item setegid() not implemented
+
+(F) You tried to assign to C<$)>, and your operating system doesn't
+support the setegid() system call (or equivalent), or at least Configure
+didn't think so.
+
+=item seteuid() not implemented
+
+(F) You tried to assign to C<< $> >>, and your operating system doesn't
+support the seteuid() system call (or equivalent), or at least Configure
+didn't think so.
+
+=item setpgrp can't take arguments
+
+(F) Your system has the setpgrp() from BSD 4.2, which takes no
+arguments, unlike POSIX setpgid(), which takes a process ID and process
+group ID.
+
+=item setrgid() not implemented
+
+(F) You tried to assign to C<$(>, and your operating system doesn't
+support the setrgid() system call (or equivalent), or at least Configure
+didn't think so.
+
+=item setruid() not implemented
+
+(F) You tried to assign to C<$<>, and your operating system doesn't
+support the setruid() system call (or equivalent), or at least Configure
+didn't think so.
+
+=item setsockopt() on closed socket %s
+
+(W closed) You tried to set a socket option on a closed socket.  Did you
+forget to check the return value of your socket() call?  See
+L<perlfunc/setsockopt>.
+
+=item Setuid/gid script is writable by world
+
+(F) The setuid emulator won't run a script that is writable by the
+world, because the world might have written on it already.
+
+=item Setuid script not plain file
+
+(F) The setuid emulator won't run a script that isn't read from a file,
+but from a socket, a pipe or another device.
+
+=item shm%s not implemented
+
+(F) You don't have System V shared memory IPC on your system.
+
+=item <> should be quotes
+
+(F) You wrote C<< require <file> >> when you should have written
+C<require 'file'>.
+
+=item /%s/ should probably be written as "%s"
+
+(W syntax) You have used a pattern where Perl expected to find a string,
+as in the first argument to C<join>.  Perl will treat the true or false
+result of matching the pattern against $_ as the string, which is
+probably not what you had in mind.
+
+=item shutdown() on closed socket %s
+
+(W closed) You tried to do a shutdown on a closed socket.  Seems a bit
+superfluous.
+
+=item SIG%s handler "%s" not defined
+
+(W signal) The signal handler named in %SIG doesn't, in fact, exist.
+Perhaps you put it into the wrong package?
+
+=item sort is now a reserved word
+
+(F) An ancient error message that almost nobody ever runs into anymore.
+But before sort was a keyword, people sometimes used it as a filehandle.
+
+=item Sort subroutine didn't return a numeric value
+
+(F) A sort comparison routine must return a number.  You probably blew
+it by not using C<< <=> >> or C<cmp>, or by not using them correctly.
+See L<perlfunc/sort>.
+
+=item Sort subroutine didn't return single value
+
+(F) A sort comparison subroutine may not return a list value with more
+or less than one element.  See L<perlfunc/sort>.
+
+=item splice() offset past end of array
+
+(W misc) You attempted to specify an offset that was past the end of
+the array passed to splice(). Splicing will instead commence at the end
+of the array, rather than past it. If this isn't what you want, try
+explicitly pre-extending the array by assigning $#array = $offset. See
+L<perlfunc/splice>.
+
+=item Split loop
+
+(P) The split was looping infinitely.  (Obviously, a split shouldn't
+iterate more times than there are characters of input, which is what
+happened.) See L<perlfunc/split>.
+
+=item Statement unlikely to be reached
+
+(W exec) You did an exec() with some statement after it other than a
+die().  This is almost always an error, because exec() never returns
+unless there was a failure.  You probably wanted to use system()
+instead, which does return.  To suppress this warning, put the exec() in
+a block by itself.
+
+=item stat() on unopened filehandle %s
+
+(W unopened) You tried to use the stat() function on a filehandle that
+was either never opened or has since been closed.
+
+=item Stub found while resolving method "%s" overloading "%s"
+
+(P) Overloading resolution over @ISA tree may be broken by importation
+stubs.  Stubs should never be implicitly created, but explicit calls to
+C<can> may break this.
+
+=item Subroutine %s redefined
+
+(W redefine) You redefined a subroutine.  To suppress this warning, say
+
+    {
+	no warnings 'redefine';
+	eval "sub name { ... }";
+    }
+
+=item Substitution loop
+
+(P) The substitution was looping infinitely.  (Obviously, a substitution
+shouldn't iterate more times than there are characters of input, which
+is what happened.)  See the discussion of substitution in
+L<perlop/"Quote and Quote-like Operators">.
+
+=item Substitution pattern not terminated
+
+(F) The lexer couldn't find the interior delimiter of an s/// or s{}{}
+construct.  Remember that bracketing delimiters count nesting level.
+Missing the leading C<$> from variable C<$s> may cause this error.
+
+=item Substitution replacement not terminated
+
+(F) The lexer couldn't find the final delimiter of an s/// or s{}{}
+construct.  Remember that bracketing delimiters count nesting level.
+Missing the leading C<$> from variable C<$s> may cause this error.
+
+=item substr outside of string
+
+(W substr),(F) You tried to reference a substr() that pointed outside of
+a string.  That is, the absolute value of the offset was larger than the
+length of the string.  See L<perlfunc/substr>.  This warning is fatal if
+substr is used in an lvalue context (as the left hand side of an
+assignment or as a subroutine argument for example).
+
+=item suidperl is no longer needed since %s
+
+(F) Your Perl was compiled with B<-D>SETUID_SCRIPTS_ARE_SECURE_NOW, but
+a version of the setuid emulator somehow got run anyway.
+
+=item Switch (?(condition)... contains too many branches in regex; marked by <-- HERE in m/%s/
+
+(F) A (?(condition)if-clause|else-clause) construct can have at most two
+branches (the if-clause and the else-clause). If you want one or both to
+contain alternation, such as using C<this|that|other>, enclose it in
+clustering parentheses:
+
+    (?(condition)(?:this|that|other)|else-clause)
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered. See L<perlre>.
+
+=item Switch condition not recognized in regex; marked by <-- HERE in m/%s/
+
+(F) If the argument to the (?(...)if-clause|else-clause) construct is a
+number, it can be only a number. The <-- HERE shows in the regular expression
+about where the problem was discovered. See L<perlre>.
+
+=item switching effective %s is not implemented
+
+(F) While under the C<use filetest> pragma, we cannot switch the real
+and effective uids or gids.
+
+=item %s syntax
+
+(F) The final summary message when a C<perl -c> succeeds.
+
+=item syntax error
+
+(F) Probably means you had a syntax error.  Common reasons include:
+
+    A keyword is misspelled.
+    A semicolon is missing.
+    A comma is missing.
+    An opening or closing parenthesis is missing.
+    An opening or closing brace is missing.
+    A closing quote is missing.
+
+Often there will be another error message associated with the syntax
+error giving more information.  (Sometimes it helps to turn on B<-w>.)
+The error message itself often tells you where it was in the line when
+it decided to give up.  Sometimes the actual error is several tokens
+before this, because Perl is good at understanding random input.
+Occasionally the line number may be misleading, and once in a blue moon
+the only way to figure out what's triggering the error is to call
+C<perl -c> repeatedly, chopping away half the program each time to see
+if the error went away.  Sort of the cybernetic version of S<20
+questions>.
+
+=item syntax error at line %d: `%s' unexpected
+
+(A) You've accidentally run your script through the Bourne shell instead
+of Perl.  Check the #! line, or manually feed your script into Perl
+yourself.
+
+=item syntax error in file %s at line %d, next 2 tokens "%s"
+
+(F) This error is likely to occur if you run a perl5 script through
+a perl4 interpreter, especially if the next 2 tokens are "use strict"
+or "my $var" or "our $var".
+
+=item sysread() on closed filehandle %s
+
+(W closed) You tried to read from a closed filehandle.
+
+=item sysread() on unopened filehandle %s
+
+(W unopened) You tried to read from a filehandle that was never opened.
+
+=item System V %s is not implemented on this machine
+
+(F) You tried to do something with a function beginning with "sem",
+"shm", or "msg" but that System V IPC is not implemented in your
+machine.  In some machines the functionality can exist but be
+unconfigured.  Consult your system support.
+
+=item syswrite() on closed filehandle %s
+
+(W closed) The filehandle you're writing to got itself closed sometime
+before now.  Check your control flow.
+
+=item C<-T> and C<-B> not implemented on filehandles
+
+(F) Perl can't peek at the stdio buffer of filehandles when it doesn't
+know about your kind of stdio.  You'll have to use a filename instead.
+
+=item Target of goto is too deeply nested
+
+(F) You tried to use C<goto> to reach a label that was too deeply nested
+for Perl to reach.  Perl is doing you a favor by refusing.
+
+=item tell() on unopened filehandle
+
+(W unopened) You tried to use the tell() function on a filehandle that
+was either never opened or has since been closed.
+
+=item That use of $[ is unsupported
+
+(F) Assignment to C<$[> is now strictly circumscribed, and interpreted
+as a compiler directive.  You may say only one of
+
+    $[ = 0;
+    $[ = 1;
+    ...
+    local $[ = 0;
+    local $[ = 1;
+    ...
+
+This is to prevent the problem of one module changing the array base out
+from under another module inadvertently.  See L<perlvar/$[>.
+
+=item The crypt() function is unimplemented due to excessive paranoia
+
+(F) Configure couldn't find the crypt() function on your machine,
+probably because your vendor didn't supply it, probably because they
+think the U.S. Government thinks it's a secret, or at least that they
+will continue to pretend that it is.  And if you quote me on that, I
+will deny it.
+
+=item The %s function is unimplemented
+
+The function indicated isn't implemented on this architecture, according
+to the probings of Configure.
+
+=item The stat preceding %s wasn't an lstat
+
+(F) It makes no sense to test the current stat buffer for symbolic
+linkhood if the last stat that wrote to the stat buffer already went
+past the symlink to get to the real file.  Use an actual filename
+instead.
+
+=item The 'unique' attribute may only be applied to 'our' variables
+
+(F) Currently this attribute is not supported on C<my> or C<sub>
+declarations.  See L<perlfunc/our>.
+
+=item This Perl can't reset CRTL environ elements (%s)
+
+=item This Perl can't set CRTL environ elements (%s=%s)
+
+(W internal) Warnings peculiar to VMS.  You tried to change or delete an
+element of the CRTL's internal environ array, but your copy of Perl
+wasn't built with a CRTL that contained the setenv() function.  You'll
+need to rebuild Perl with a CRTL that does, or redefine
+F<PERL_ENV_TABLES> (see L<perlvms>) so that the environ array isn't the
+target of the change to
+%ENV which produced the warning.
+
+=item thread failed to start: %s
+
+(W threads)(S) The entry point function of threads->create() failed for some reason.
+
+=item 5.005 threads are deprecated
+
+(D deprecated)  The 5.005-style threads (activated by C<use Thread;>)
+are deprecated and one should use the new ithreads instead,
+see L<perl58delta> for more details.
+
+=item times not implemented
+
+(F) Your version of the C library apparently doesn't do times().  I
+suspect you're not running on Unix.
+
+=item "-T" is on the #! line, it must also be used on the command line
+
+(X) The #! line (or local equivalent) in a Perl script contains the
+B<-T> option, but Perl was not invoked with B<-T> in its command line.
+This is an error because, by the time Perl discovers a B<-T> in a
+script, it's too late to properly taint everything from the environment.
+So Perl gives up.
+
+If the Perl script is being executed as a command using the #!
+mechanism (or its local equivalent), this error can usually be fixed by
+editing the #! line so that the B<-T> option is a part of Perl's first
+argument: e.g. change C<perl -n -T> to C<perl -T -n>.
+
+If the Perl script is being executed as C<perl scriptname>, then the
+B<-T> option must appear on the command line: C<perl -T scriptname>.
+
+=item To%s: illegal mapping '%s'
+
+(F) You tried to define a customized To-mapping for lc(), lcfirst,
+uc(), or ucfirst() (or their string-inlined versions), but you
+specified an illegal mapping.
+See L<perlunicode/"User-Defined Character Properties">.
+
+=item Too deeply nested ()-groups
+
+(F) Your template contains ()-groups with a ridiculously deep nesting level. 
+
+=item Too few args to syscall
+
+(F) There has to be at least one argument to syscall() to specify the
+system call to call, silly dilly.
+
+=item Too late for "-%s" option
+
+(X) The #! line (or local equivalent) in a Perl script contains the
+B<-M> or B<-m> option.  This is an error because B<-M> and B<-m> options
+are not intended for use inside scripts.  Use the C<use> pragma instead.
+
+=item Too late to run %s block
+
+(W void) A CHECK or INIT block is being defined during run time proper,
+when the opportunity to run them has already passed.  Perhaps you are
+loading a file with C<require> or C<do> when you should be using C<use>
+instead.  Or perhaps you should put the C<require> or C<do> inside a
+BEGIN block.
+
+=item Too many args to syscall
+
+(F) Perl supports a maximum of only 14 args to syscall().
+
+=item Too many arguments for %s
+
+(F) The function requires fewer arguments than you specified.
+
+=item Too many )'s
+
+(A) You've accidentally run your script through B<csh> instead of Perl.
+Check the #! line, or manually feed your script into Perl yourself.
+
+=item Too many ('s
+
+(A) You've accidentally run your script through B<csh> instead of Perl.
+Check the #! line, or manually feed your script into Perl yourself.
+
+=item Trailing \ in regex m/%s/
+
+(F) The regular expression ends with an unbackslashed backslash.
+Backslash it.   See L<perlre>.
+
+=item Transliteration pattern not terminated
+
+(F) The lexer couldn't find the interior delimiter of a tr/// or tr[][]
+or y/// or y[][] construct.  Missing the leading C<$> from variables
+C<$tr> or C<$y> may cause this error.
+
+=item Transliteration replacement not terminated
+
+(F) The lexer couldn't find the final delimiter of a tr///, tr[][],
+y/// or y[][] construct.
+
+=item '%s' trapped by operation mask
+
+(F) You tried to use an operator from a Safe compartment in which it's
+disallowed. See L<Safe>.
+
+=item truncate not implemented
+
+(F) Your machine doesn't implement a file truncation mechanism that
+Configure knows about.
+
+=item Type of arg %d to %s must be %s (not %s)
+
+(F) This function requires the argument in that position to be of a
+certain type.  Arrays must be @NAME or C<@{EXPR}>.  Hashes must be
+%NAME or C<%{EXPR}>.  No implicit dereferencing is allowed--use the
+{EXPR} forms as an explicit dereference.  See L<perlref>.
+
+=item umask not implemented
+
+(F) Your machine doesn't implement the umask function and you tried to
+use it to restrict permissions for yourself (EXPR & 0700).
+
+=item Unable to create sub named "%s"
+
+(F) You attempted to create or access a subroutine with an illegal name.
+
+=item Unbalanced context: %d more PUSHes than POPs
+
+(W internal) The exit code detected an internal inconsistency in how
+many execution contexts were entered and left.
+
+=item Unbalanced saves: %d more saves than restores
+
+(W internal) The exit code detected an internal inconsistency in how
+many values were temporarily localized.
+
+=item Unbalanced scopes: %d more ENTERs than LEAVEs
+
+(W internal) The exit code detected an internal inconsistency in how
+many blocks were entered and left.
+
+=item Unbalanced tmps: %d more allocs than frees
+
+(W internal) The exit code detected an internal inconsistency in how
+many mortal scalars were allocated and freed.
+
+=item Undefined format "%s" called
+
+(F) The format indicated doesn't seem to exist.  Perhaps it's really in
+another package?  See L<perlform>.
+
+=item Undefined sort subroutine "%s" called
+
+(F) The sort comparison routine specified doesn't seem to exist.
+Perhaps it's in a different package?  See L<perlfunc/sort>.
+
+=item Undefined subroutine &%s called
+
+(F) The subroutine indicated hasn't been defined, or if it was, it has
+since been undefined.
+
+=item Undefined subroutine called
+
+(F) The anonymous subroutine you're trying to call hasn't been defined,
+or if it was, it has since been undefined.
+
+=item Undefined subroutine in sort
+
+(F) The sort comparison routine specified is declared but doesn't seem
+to have been defined yet.  See L<perlfunc/sort>.
+
+=item Undefined top format "%s" called
+
+(F) The format indicated doesn't seem to exist.  Perhaps it's really in
+another package?  See L<perlform>.
+
+=item Undefined value assigned to typeglob
+
+(W misc) An undefined value was assigned to a typeglob, a la
+C<*foo = undef>.  This does nothing.  It's possible that you really mean
+C<undef *foo>.
+
+=item %s: Undefined variable
+
+(A) You've accidentally run your script through B<csh> instead of Perl.
+Check the #! line, or manually feed your script into Perl yourself.
+
+=item unexec of %s into %s failed!
+
+(F) The unexec() routine failed for some reason.  See your local FSF
+representative, who probably put it there in the first place.
+
+=item Unicode character %s is illegal
+
+(W utf8) Certain Unicode characters have been designated off-limits by
+the Unicode standard and should not be generated.  If you really know
+what you are doing you can turn off this warning by C<no warnings 'utf8';>.
+
+=item Unknown BYTEORDER
+
+(F) There are no byte-swapping functions for a machine with this byte
+order.
+
+=item Unknown open() mode '%s'
+
+(F) The second argument of 3-argument open() is not among the list
+of valid modes: C<< < >>, C<< > >>, C<<< >> >>>, C<< +< >>,
+C<< +> >>, C<<< +>> >>>, C<-|>, C<|->, C<< <& >>, C<< >& >>.
+
+=item Unknown PerlIO layer "%s"
+
+(W layer) An attempt was made to push an unknown layer onto the Perl I/O
+system.  (Layers take care of transforming data between external and
+internal representations.)  Note that some layers, such as C<mmap>,
+are not supported in all environments.  If your program didn't
+explicitly request the failing operation, it may be the result of the
+value of the environment variable PERLIO.
+
+=item Unknown process %x sent message to prime_env_iter: %s
+
+(P) An error peculiar to VMS.  Perl was reading values for %ENV before
+iterating over it, and someone else stuck a message in the stream of
+data Perl expected.  Someone's very confused, or perhaps trying to
+subvert Perl's population of %ENV for nefarious purposes.
+
+=item Unknown "re" subpragma '%s' (known ones are: %s)
+
+You tried to use an unknown subpragma of the "re" pragma.
+
+=item Unknown switch condition (?(%.2s in regex; marked by <-- HERE in m/%s/
+
+(F) The condition part of a (?(condition)if-clause|else-clause) construct
+is not known. The condition may be lookahead or lookbehind (the condition
+is true if the lookahead or lookbehind is true), a (?{...})  construct (the
+condition is true if the code evaluates to a true value), or a number (the
+condition is true if the set of capturing parentheses named by the number
+matched).
+
+The <-- HERE shows in the regular expression about where the problem was
+discovered.  See L<perlre>.
+
+=item Unknown Unicode option letter '%c'
+
+You specified an unknown Unicode option.  See L<perlrun> documentation
+of the C<-C> switch for the list of known options.
+
+=item Unknown Unicode option value %x
+
+You specified an unknown Unicode option.  See L<perlrun> documentation
+of the C<-C> switch for the list of known options.
+
+=item Unknown warnings category '%s'
+
+(F) An error issued by the C<warnings> pragma. You specified a warnings
+category that is unknown to perl at this point.
+
+Note that if you want to enable a warnings category registered by a module
+(e.g. C<use warnings 'File::Find'>), you must have imported this module
+first.
+
+=item unmatched [ in regex; marked by <-- HERE in m/%s/
+
+(F) The brackets around a character class must match. If you wish to
+include a closing bracket in a character class, backslash it or put it
+first. The <-- HERE shows in the regular expression about where the problem
+was discovered. See L<perlre>.
+
+=item unmatched ( in regex; marked by <-- HERE in m/%s/
+
+(F) Unbackslashed parentheses must always be balanced in regular
+expressions. If you're a vi user, the % key is valuable for finding the
+matching parenthesis. The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item Unmatched right %s bracket
+
+(F) The lexer counted more closing curly or square brackets than opening
+ones, so you're probably missing a matching opening bracket.  As a
+general rule, you'll find the missing one (so to speak) near the place
+you were last editing.
+
+=item Unquoted string "%s" may clash with future reserved word
+
+(W reserved) You used a bareword that might someday be claimed as a
+reserved word.  It's best to put such a word in quotes, or capitalize it
+somehow, or insert an underbar into it.  You might also declare it as a
+subroutine.
+
+=item Unrecognized character %s
+
+(F) The Perl parser has no idea what to do with the specified character
+in your Perl script (or eval).  Perhaps you tried to run a compressed
+script, a binary program, or a directory as a Perl program.
+
+=item /%s/: Unrecognized escape \\%c in character class passed through
+
+(W regexp) You used a backslash-character combination which is not
+recognized by Perl inside character classes.  The character was
+understood literally.
+
+=item Unrecognized escape \\%c passed through
+
+(W misc) You used a backslash-character combination which is not
+recognized by Perl.
+
+=item Unrecognized escape \\%c passed through in regex; marked by <-- HERE in m/%s/
+
+(W regexp) You used a backslash-character combination which is not
+recognized by Perl. This combination appears in an interpolated variable or
+a C<'>-delimited regular expression. The character was understood
+literally. The <-- HERE shows in the regular expression about where the
+escape was discovered.
+
+=item Unrecognized signal name "%s"
+
+(F) You specified a signal name to the kill() function that was not
+recognized.  Say C<kill -l> in your shell to see the valid signal names
+on your system.
+
+=item Unrecognized switch: -%s  (-h will show valid options)
+
+(F) You specified an illegal option to Perl.  Don't do that.  (If you
+think you didn't do that, check the #! line to see if it's supplying the
+bad switch on your behalf.)
+
+=item Unsuccessful %s on filename containing newline
+
+(W newline) A file operation was attempted on a filename, and that
+operation failed, PROBABLY because the filename contained a newline,
+PROBABLY because you forgot to chomp() it off.  See L<perlfunc/chomp>.
+
+=item Unsupported directory function "%s" called
+
+(F) Your machine doesn't support opendir() and readdir().
+
+=item Unsupported function %s
+
+(F) This machine doesn't implement the indicated function, apparently.
+At least, Configure doesn't think so.
+
+=item Unsupported function fork
+
+(F) Your version of executable does not support forking.
+
+Note that under some systems, like OS/2, there may be different flavors
+of Perl executables, some of which may support fork, some not. Try
+changing the name you call Perl by to C<perl_>, C<perl__>, and so on.
+
+=item Unsupported script encoding %s
+
+(F) Your program file begins with a Unicode Byte Order Mark (BOM) which
+declares it to be in a Unicode encoding that Perl cannot read.
+
+=item Unsupported socket function "%s" called
+
+(F) Your machine doesn't support the Berkeley socket mechanism, or at
+least that's what Configure thought.
+
+=item Unterminated attribute list
+
+(F) The lexer found something other than a simple identifier at the
+start of an attribute, and it wasn't a semicolon or the start of a
+block.  Perhaps you terminated the parameter list of the previous
+attribute too soon.  See L<attributes>.
+
+=item Unterminated attribute parameter in attribute list
+
+(F) The lexer saw an opening (left) parenthesis character while parsing
+an attribute list, but the matching closing (right) parenthesis
+character was not found.  You may need to add (or remove) a backslash
+character to get your parentheses to balance.  See L<attributes>.
+
+=item Unterminated compressed integer
+
+(F) An argument to unpack("w",...) was incompatible with the BER
+compressed integer format and could not be converted to an integer.
+See L<perlfunc/pack>.
+
+=item Unterminated <> operator
+
+(F) The lexer saw a left angle bracket in a place where it was expecting
+a term, so it's looking for the corresponding right angle bracket, and
+not finding it.  Chances are you left some needed parentheses out
+earlier in the line, and you really meant a "less than".
+
+=item untie attempted while %d inner references still exist
+
+(W untie) A copy of the object returned from C<tie> (or C<tied>) was
+still valid when C<untie> was called.
+
+=item Usage: POSIX::%s(%s)
+
+(F) You called a POSIX function with incorrect arguments.
+See L<POSIX/FUNCTIONS> for more information.
+
+=item Usage: Win32::%s(%s)
+
+(F) You called a Win32 function with incorrect arguments.
+See L<Win32> for more information.
+
+=item Useless (?-%s) - don't use /%s modifier in regex; marked by <-- HERE in m/%s/
+
+(W regexp) You have used an internal modifier such as (?-o) that has no
+meaning unless removed from the entire regexp:
+
+    if ($string =~ /(?-o)$pattern/o) { ... }
+
+must be written as
+
+    if ($string =~ /$pattern/) { ... }
+
+The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item Useless (?%s) - use /%s modifier in regex; marked by <-- HERE in m/%s/
+
+(W regexp) You have used an internal modifier such as (?o) that has no
+meaning unless applied to the entire regexp:
+
+    if ($string =~ /(?o)$pattern/) { ... }
+
+must be written as
+
+    if ($string =~ /$pattern/o) { ... }
+
+The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item Useless use of %s in void context
+
+(W void) You did something without a side effect in a context that does
+nothing with the return value, such as a statement that doesn't return a
+value from a block, or the left side of a scalar comma operator.  Very
+often this points not to stupidity on your part, but a failure of Perl
+to parse your program the way you thought it would.  For example, you'd
+get this if you mixed up your C precedence with Python precedence and
+said
+
+    $one, $two = 1, 2;
+
+when you meant to say
+
+    ($one, $two) = (1, 2);
+
+Another common error is to use ordinary parentheses to construct a list
+reference when you should be using square or curly brackets, for
+example, if you say
+
+    $array = (1,2);
+
+when you should have said
+
+    $array = [1,2];
+
+The square brackets explicitly turn a list value into a scalar value,
+while parentheses do not.  So when a parenthesized list is evaluated in
+a scalar context, the comma is treated like C's comma operator, which
+throws away the left argument, which is not what you want.  See
+L<perlref> for more on this.
+
+This warning will not be issued for numerical constants equal to 0 or 1
+since they are often used in statements like
+
+    1 while sub_with_side_effects();
+
+String constants that would normally evaluate to 0 or 1 are warned
+about.
+
+=item Useless use of "re" pragma
+
+(W) You did C<use re;> without any arguments.   That isn't very useful.
+
+=item Useless use of sort in scalar context
+
+(W void) You used sort in scalar context, as in :
+
+    my $x = sort @y;
+
+This is not very useful, and perl currently optimizes this away.
+
+=item Useless use of %s with no values
+
+(W syntax) You used the push() or unshift() function with no arguments
+apart from the array, like C<push(@x)> or C<unshift(@foo)>. That won't
+usually have any effect on the array, so is completely useless. It's
+possible in principle that push(@tied_array) could have some effect
+if the array is tied to a class which implements a PUSH method. If so,
+you can write it as C<push(@tied_array,())> to avoid this warning.
+
+=item "use" not allowed in expression
+
+(F) The "use" keyword is recognized and executed at compile time, and
+returns no useful value.  See L<perlmod>.
+
+=item Use of bare << to mean <<"" is deprecated
+
+(D deprecated) You are now encouraged to use the explicitly quoted form
+if you wish to use an empty line as the terminator of the here-document.
+
+=item Use of chdir('') or chdir(undef) as chdir() deprecated
+
+(D deprecated) chdir() with no arguments is documented to change to
+$ENV{HOME} or $ENV{LOGDIR}.  chdir(undef) and chdir('') share this
+behavior, but that has been deprecated.  In future versions they
+will simply fail.
+
+Be careful to check that what you pass to chdir() is defined and not
+blank, else you might find yourself in your home directory.
+
+=item Use of /c modifier is meaningless in s///
+
+(W regexp) You used the /c modifier in a substitution.  The /c
+modifier is not presently meaningful in substitutions.
+
+=item Use of /c modifier is meaningless without /g
+
+(W regexp) You used the /c modifier with a regex operand, but didn't
+use the /g modifier.  Currently, /c is meaningful only when /g is
+used.  (This may change in the future.)
+
+=item Use of freed value in iteration
+
+(F) Perhaps you modified the iterated array within the loop?
+This error is typically caused by code like the following:
+
+    @a = (3,4);
+    @a = () for (1,2,@a);
+
+You are not supposed to modify arrays while they are being iterated over.
+For speed and efficiency reasons, Perl internally does not do full
+reference-counting of iterated items, hence deleting such an item in the
+middle of an iteration causes Perl to see a freed value.
+
+=item Use of *glob{FILEHANDLE} is deprecated
+
+(D deprecated) You are now encouraged to use the shorter *glob{IO} form
+to access the filehandle slot within a typeglob.
+
+=item Use of /g modifier is meaningless in split
+
+(W regexp) You used the /g modifier on the pattern for a C<split>
+operator.  Since C<split> always tries to match the pattern
+repeatedly, the C</g> has no effect.
+
+=item Use of implicit split to @_ is deprecated
+
+(D deprecated) It makes a lot of work for the compiler when you clobber
+a subroutine's argument list, so it's better if you assign the results
+of a split() explicitly to an array (or list).
+
+=item Use of inherited AUTOLOAD for non-method %s() is deprecated
+
+(D deprecated) As an (ahem) accidental feature, C<AUTOLOAD> subroutines
+are looked up as methods (using the C<@ISA> hierarchy) even when the
+subroutines to be autoloaded were called as plain functions (e.g.
+C<Foo::bar()>), not as methods (e.g. C<< Foo->bar() >> or C<<
+$obj->bar() >>).
+
+This bug will be rectified in future by using method lookup only for
+methods' C<AUTOLOAD>s.  However, there is a significant base of existing
+code that may be using the old behavior.  So, as an interim step, Perl
+currently issues an optional warning when non-methods use inherited
+C<AUTOLOAD>s.
+
+The simple rule is:  Inheritance will not work when autoloading
+non-methods.  The simple fix for old code is:  In any module that used
+to depend on inheriting C<AUTOLOAD> for non-methods from a base class
+named C<BaseClass>, execute C<*AUTOLOAD = \&BaseClass::AUTOLOAD> during
+startup.
+
+In code that currently says C<use AutoLoader; @ISA = qw(AutoLoader);>
+you should remove AutoLoader from @ISA and change C<use AutoLoader;> to
+C<use AutoLoader 'AUTOLOAD';>.
+
+=item Use of %s in printf format not supported
+
+(F) You attempted to use a feature of printf that is accessible from
+only C.  This usually means there's a better way to do it in Perl.
+
+=item Use of $* is deprecated
+
+(D deprecated) This variable magically turned on multi-line pattern
+matching, both for you and for any luckless subroutine that you happen
+to call.  You should use the new C<//m> and C<//s> modifiers now to do
+that without the dangerous action-at-a-distance effects of C<$*>.
+
+=item Use of $# is deprecated
+
+(D deprecated) This was an ill-advised attempt to emulate a poorly
+defined B<awk> feature.  Use an explicit printf() or sprintf() instead.
+
+=item Use of %s is deprecated
+
+(D deprecated) The construct indicated is no longer recommended for use,
+generally because there's a better way to do it, and also because the
+old way has bad side effects.
+
+=item Use of -l on filehandle %s
+
+(W io) A filehandle represents an opened file, and when you opened the file
+it already went past any symlink you are presumably trying to look for.
+The operation returned C<undef>.  Use a filename instead.
+
+=item Use of "package" with no arguments is deprecated
+
+(D deprecated) You used the C<package> keyword without specifying a package
+name. So no namespace is current at all. Using this can cause many
+otherwise reasonable constructs to fail in baffling ways. C<use strict;>
+instead.
+
+=item Use of reference "%s" as array index
+
+(W misc) You tried to use a reference as an array index; this probably
+isn't what you mean, because references in numerical context tend
+to be huge numbers, and so usually indicates programmer error.
+
+If you really do mean it, explicitly numify your reference, like so:
+C<$array[0+$ref]>.  This warning is not given for overloaded objects,
+either, because you can overload the numification and stringification
+operators and then you assumedly know what you are doing.
+
+=item Use of reserved word "%s" is deprecated
+
+(D deprecated) The indicated bareword is a reserved word.  Future
+versions of perl may use it as a keyword, so you're better off either
+explicitly quoting the word in a manner appropriate for its context of
+use, or using a different name altogether.  The warning can be
+suppressed for subroutine names by either adding a C<&> prefix, or using
+a package qualifier, e.g. C<&our()>, or C<Foo::our()>.
+
+=item Use of tainted arguments in %s is deprecated
+
+(W taint, deprecated) You have supplied C<system()> or C<exec()> with multiple
+arguments and at least one of them is tainted.  This used to be allowed
+but will become a fatal error in a future version of perl.  Untaint your
+arguments.  See L<perlsec>.
+
+=item Use of uninitialized value%s
+
+(W uninitialized) An undefined value was used as if it were already
+defined.  It was interpreted as a "" or a 0, but maybe it was a mistake.
+To suppress this warning assign a defined value to your variables.
+
+To help you figure out what was undefined, perl tells you what operation
+you used the undefined value in.  Note, however, that perl optimizes your
+program and the operation displayed in the warning may not necessarily
+appear literally in your program.  For example, C<"that $foo"> is
+usually optimized into C<"that " . $foo>, and the warning will refer to
+the C<concatenation (.)> operator, even though there is no C<.> in your
+program.
+
+=item Using a hash as a reference is deprecated
+
+(D deprecated) You tried to use a hash as a reference, as in
+C<< %foo->{"bar"} >> or C<< %$ref->{"hello"} >>.  Versions of perl <= 5.6.1
+used to allow this syntax, but shouldn't have. It is now deprecated, and will
+be removed in a future version.
+
+=item Using an array as a reference is deprecated
+
+(D deprecated) You tried to use an array as a reference, as in
+C<< @foo->[23] >> or C<< @$ref->[99] >>.  Versions of perl <= 5.6.1 used to
+allow this syntax, but shouldn't have. It is now deprecated, and will be
+removed in a future version.
+
+=item UTF-16 surrogate %s
+
+(W utf8) You tried to generate half of an UTF-16 surrogate by
+requesting a Unicode character between the code points 0xD800 and
+0xDFFF (inclusive).  That range is reserved exclusively for the use of
+UTF-16 encoding (by having two 16-bit UCS-2 characters); but Perl
+encodes its characters in UTF-8, so what you got is a very illegal
+character.  If you really know what you are doing you can turn off
+this warning by C<no warnings 'utf8';>.
+
+=item Value of %s can be "0"; test with defined()
+
+(W misc) In a conditional expression, you used <HANDLE>, <*> (glob),
+C<each()>, or C<readdir()> as a boolean value.  Each of these constructs
+can return a value of "0"; that would make the conditional expression
+false, which is probably not what you intended.  When using these
+constructs in conditional expressions, test their values with the
+C<defined> operator.
+
+=item Value of CLI symbol "%s" too long
+
+(W misc) A warning peculiar to VMS.  Perl tried to read the value of an
+%ENV element from a CLI symbol table, and found a resultant string
+longer than 1024 characters.  The return value has been truncated to
+1024 characters.
+
+=item Variable "%s" is not imported%s
+
+(F) While "use strict" in effect, you referred to a global variable that
+you apparently thought was imported from another module, because
+something else of the same name (usually a subroutine) is exported by
+that module.  It usually means you put the wrong funny character on the
+front of your variable.
+
+=item Variable length lookbehind not implemented in regex; marked by <-- HERE in m/%s/
+
+(F) Lookbehind is allowed only for subexpressions whose length is fixed and
+known at compile time. The <-- HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
+
+=item "%s" variable %s masks earlier declaration in same %s
+
+(W misc) A "my" or "our" variable has been redeclared in the current
+scope or statement, effectively eliminating all access to the previous
+instance.  This is almost always a typographical error.  Note that the
+earlier variable will still exist until the end of the scope or until
+all closure referents to it are destroyed.
+
+=item Variable "%s" may be unavailable
+
+(W closure) An inner (nested) I<anonymous> subroutine is inside a
+I<named> subroutine, and outside that is another subroutine; and the
+anonymous (innermost) subroutine is referencing a lexical variable
+defined in the outermost subroutine.  For example:
+
+   sub outermost { my $a; sub middle { sub { $a } } }
+
+If the anonymous subroutine is called or referenced (directly or
+indirectly) from the outermost subroutine, it will share the variable as
+you would expect.  But if the anonymous subroutine is called or
+referenced when the outermost subroutine is not active, it will see the
+value of the shared variable as it was before and during the *first*
+call to the outermost subroutine, which is probably not what you want.
+
+In these circumstances, it is usually best to make the middle subroutine
+anonymous, using the C<sub {}> syntax.  Perl has specific support for
+shared variables in nested anonymous subroutines; a named subroutine in
+between interferes with this feature.
+
+=item Variable syntax
+
+(A) You've accidentally run your script through B<csh> instead
+of Perl.  Check the #! line, or manually feed your script into
+Perl yourself.
+
+=item Variable "%s" will not stay shared
+
+(W closure) An inner (nested) I<named> subroutine is referencing a
+lexical variable defined in an outer subroutine.
+
+When the inner subroutine is called, it will probably see the value of
+the outer subroutine's variable as it was before and during the *first*
+call to the outer subroutine; in this case, after the first call to the
+outer subroutine is complete, the inner and outer subroutines will no
+longer share a common value for the variable.  In other words, the
+variable will no longer be shared.
+
+Furthermore, if the outer subroutine is anonymous and references a
+lexical variable outside itself, then the outer and inner subroutines
+will I<never> share the given variable.
+
+This problem can usually be solved by making the inner subroutine
+anonymous, using the C<sub {}> syntax.  When inner anonymous subs that
+reference variables in outer subroutines are called or referenced, they
+are automatically rebound to the current values of such variables.
+
+=item Version number must be a constant number
+
+(P) The attempt to translate a C<use Module n.n LIST> statement into
+its equivalent C<BEGIN> block found an internal inconsistency with
+the version number.
+
+=item Warning: something's wrong
+
+(W) You passed warn() an empty string (the equivalent of C<warn "">) or
+you called it with no args and C<$_> was empty.
+
+=item Warning: unable to close filehandle %s properly
+
+(S) The implicit close() done by an open() got an error indication on
+the close().  This usually indicates your file system ran out of disk
+space.
+
+=item Warning: Use of "%s" without parentheses is ambiguous
+
+(S ambiguous) You wrote a unary operator followed by something that
+looks like a binary operator that could also have been interpreted as a
+term or unary operator.  For instance, if you know that the rand
+function has a default argument of 1.0, and you write
+
+    rand + 5;
+
+you may THINK you wrote the same thing as
+
+    rand() + 5;
+
+but in actual fact, you got
+
+    rand(+5);
+
+So put in parentheses to say what you really mean.
+
+=item Wide character in %s
+
+(W utf8) Perl met a wide character (>255) when it wasn't expecting
+one.  This warning is by default on for I/O (like print).  The easiest
+way to quiet this warning is simply to add the C<:utf8> layer to the
+output, e.g. C<binmode STDOUT, ':utf8'>.  Another way to turn off the
+warning is to add C<no warnings 'utf8';> but that is often closer to
+cheating.  In general, you are supposed to explicitly mark the
+filehandle with an encoding, see L<open> and L<perlfunc/binmode>.
+
+=item Within []-length '%c' not allowed
+
+(F) The count in the (un)pack template may be replaced by C<[TEMPLATE]> only if
+C<TEMPLATE> always matches the same amount of packed bytes that can be
+determined from the template alone. This is not possible if it contains an
+of the codes @, /, U, u, w or a *-length. Redesign the template.
+
+=item write() on closed filehandle %s
+
+(W closed) The filehandle you're writing to got itself closed sometime
+before now.  Check your control flow.
+
+=item %s "\x%s" does not map to Unicode
+
+When reading in different encodings Perl tries to map everything
+into Unicode characters.  The bytes you read in are not legal in
+this encoding, for example
+
+    utf8 "\xE4" does not map to Unicode
+
+if you try to read in the a-diaereses Latin-1 as UTF-8.
+
+=item 'X' outside of string
+
+(F) You had a (un)pack template that specified a relative position before
+the beginning of the string being (un)packed.  See L<perlfunc/pack>.
+
+=item 'x' outside of string in unpack
+
+(F) You had a pack template that specified a relative position after
+the end of the string being unpacked.  See L<perlfunc/pack>.
+
+=item YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!
+
+(F) And you probably never will, because you probably don't have the
+sources to your kernel, and your vendor probably doesn't give a rip
+about what you want.  Your best bet is to put a setuid C wrapper around
+your script.
+
+=item You need to quote "%s"
+
+(W syntax) You assigned a bareword as a signal handler name.
+Unfortunately, you already have a subroutine of that name declared,
+which means that Perl 5 will try to call the subroutine when the
+assignment is executed, which is probably not what you want.  (If it IS
+what you want, put an & in front.)
+
+=item Your random numbers are not that random
+
+(F) When trying to initialise the random seed for hashes, Perl could
+not get any randomness out of your system.  This usually indicates
+Something Very Wrong.
+
+=back
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldoc.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldoc.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldoc.pod	(revision 14489)
@@ -0,0 +1,220 @@
+
+=head1 NAME
+
+perldoc - Look up Perl documentation in Pod format.
+
+=head1 SYNOPSIS
+
+B<perldoc> [B<-h>] [B<-v>] [B<-t>] [B<-u>] [B<-m>] [B<-l>] [B<-F>]
+[B<-i>] [B<-V>] [B<-T>] [B<-r>]
+[B<-dI<destination_file>>]
+[B<-oI<formatname>>]
+[B<-MI<FormatterClassName>>]
+[B<-wI<formatteroption:value>>]
+[B<-n>I<nroff-replacement>]
+[B<-X>]
+PageName|ModuleName|ProgramName
+
+B<perldoc> B<-f> BuiltinFunction
+
+B<perldoc> B<-q> FAQ Keyword
+
+See below for more description of the switches.
+
+=head1 DESCRIPTION
+
+I<perldoc> looks up a piece of documentation in .pod format that is embedded
+in the perl installation tree or in a perl script, and displays it via
+C<pod2man | nroff -man | $PAGER>. (In addition, if running under HP-UX,
+C<col -x> will be used.) This is primarily used for the documentation for
+the perl library modules.
+
+Your system may also have man pages installed for those modules, in
+which case you can probably just use the man(1) command.
+
+If you are looking for a table of contents to the Perl library modules
+documentation, see the L<perltoc> page.
+
+=head1 OPTIONS
+
+=over 5
+
+=item B<-h>
+
+Prints out a brief B<h>elp message.
+
+=item B<-v>
+
+Describes search for the item in detail (B<v>erbosely).
+
+=item B<-t>
+
+Display docs using plain B<t>ext converter, instead of nroff. This may be faster,
+but it probably won't look as nice.
+
+=item B<-u>
+
+Skip the real Pod formatting, and just show the raw Pod source (B<U>nformatted)
+
+=item B<-m> I<module>
+
+Display the entire module: both code and unformatted pod documentation.
+This may be useful if the docs don't explain a function in the detail
+you need, and you'd like to inspect the code directly; perldoc will find
+the file for you and simply hand it off for display.
+
+=item B<-l>
+
+Display onB<l>y the file name of the module found.
+
+=item B<-F>
+
+Consider arguments as file names; no search in directories will be performed.
+
+=item B<-f> I<perlfunc>
+
+The B<-f> option followed by the name of a perl built in function will
+extract the documentation of this function from L<perlfunc>.
+
+Example:
+
+      perldoc -f sprintf
+
+=item B<-q> I<perlfaq-search-regexp>
+
+The B<-q> option takes a regular expression as an argument.  It will search
+the B<q>uestion headings in perlfaq[1-9] and print the entries matching
+the regular expression.  Example: C<perldoc -q shuffle>
+
+=item B<-T>
+
+This specifies that the output is not to be sent to a pager, but is to
+be sent right to STDOUT.
+
+=item B<-d> I<destination-filename>
+
+This specifies that the output is to be sent neither to a pager nor
+to STDOUT, but is to be saved to the specified filename.  Example:
+C<perldoc -oLaTeX -dtextwrapdocs.tex Text::Wrap>
+
+=item B<-o> I<output-formatname>
+
+This specifies that you want Perldoc to try using a Pod-formatting
+class for the output format that you specify.  For example:
+C<-oman>.  This is actually just a wrapper around the C<-M> switch;
+using C<-oI<formatname>> just looks for a loadable class by adding
+that format name (with different capitalizations) to the end of
+different classname prefixes.
+
+For example, C<-oLaTeX> currently tries all of the following classes:
+Pod::Perldoc::ToLaTeX Pod::Perldoc::Tolatex Pod::Perldoc::ToLatex
+Pod::Perldoc::ToLATEX Pod::Simple::LaTeX Pod::Simple::latex
+Pod::Simple::Latex Pod::Simple::LATEX Pod::LaTeX Pod::latex Pod::Latex
+Pod::LATEX.
+
+=item B<-M> I<module-name>
+
+This specifies the module that you want to try using for formatting the
+pod.  The class must at least provide a C<parse_from_file> method.
+For example: C<perldoc -MPod::Perldoc::ToChecker>.
+
+You can specify several classes to try by joining them with commas
+or semicolons, as in C<-MTk::SuperPod;Tk::Pod>.
+
+=item B<-w> I<option:value> or B<-w> I<option> 
+
+This specifies an option to call the formatter B<w>ith.  For example,
+C<-w textsize:15> will call
+C<< $formatter->textsize(15) >> on the formatter object before it is
+used to format the object.  For this to be valid, the formatter class
+must provide such a method, and the value you pass should be valid.
+(So if C<textsize> expects an integer, and you do C<-w textsize:big>,
+expect trouble.)
+
+You can use C<-w optionname> (without a value) as shorthand for
+C<-w optionname:I<TRUE>>.  This is presumably useful in cases of on/off
+features like: C<-w page_numbering>.
+
+You can use a "=" instead of the ":", as in: C<-w textsize=15>.  This
+might be more (or less) convenient, depending on what shell you use.
+
+=item B<-X>
+
+Use an index if it is present -- the B<-X> option looks for an entry
+whose basename matches the name given on the command line in the file
+C<$Config{archlib}/pod.idx>. The F<pod.idx> file should contain fully
+qualified filenames, one per line.
+
+=item B<PageName|ModuleName|ProgramName>
+
+The item you want to look up.  Nested modules (such as C<File::Basename>)
+are specified either as C<File::Basename> or C<File/Basename>.  You may also
+give a descriptive name of a page, such as C<perlfunc>.
+
+=item B<-n> I<some-formatter>
+
+Specify replacement for nroff
+
+=item B<-r>
+
+Recursive search.
+
+=item B<-i>
+
+Ignore case.
+
+=item B<-V>
+
+Displays the version of perldoc you're running.
+
+=back
+
+
+
+=head1 SECURITY
+
+Because B<perldoc> does not run properly tainted, and is known to
+have security issues, when run as the superuser it will attempt to
+drop privileges by setting the effective and real IDs to nobody's
+or nouser's account, or -2 if unavailable.  If it cannot relinquish
+its privileges, it will not run.  
+
+
+=head1 ENVIRONMENT
+
+Any switches in the C<PERLDOC> environment variable will be used before the
+command line arguments.
+
+Useful values for C<PERLDOC> include C<-oman>, C<-otext>, C<-otk>, C<-ortf>,
+C<-oxml>, and so on, depending on what modules you have on hand; or
+exactly specify the formatter class with C<-MPod::Perldoc::ToMan>
+or the like.
+
+C<perldoc> also searches directories
+specified by the C<PERL5LIB> (or C<PERLLIB> if C<PERL5LIB> is not
+defined) and C<PATH> environment variables.
+(The latter is so that embedded pods for executables, such as
+C<perldoc> itself, are available.)
+
+C<perldoc> will use, in order of preference, the pager defined in
+C<PERLDOC_PAGER>, C<MANPAGER>, or C<PAGER> before trying to find a pager
+on its own. (C<MANPAGER> is not used if C<perldoc> was told to display
+plain text or unformatted pod.)
+
+One useful value for C<PERLDOC_PAGER> is C<less -+C -E>.
+
+Having PERLDOCDEBUG set to a positive integer will make perldoc emit
+even more descriptive output than the C<-v> switch does -- the higher the
+number, the more it emits.
+
+=head1 AUTHOR
+
+Current maintainer: Sean M. Burke, <sburke@cpan.org>
+
+Past contributors are:
+Kenneth Albanowski <kjahds@kjahds.com>,
+Andy Dougherty  <doughera@lafcol.lafayette.edu>,
+and many others.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldos.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldos.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldos.pod	(revision 14489)
@@ -0,0 +1,332 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perldos - Perl under DOS, W31, W95.
+
+=head1 SYNOPSIS
+
+These are instructions for building Perl under DOS (or w??), using
+DJGPP v2.03 or later.  Under w95 long filenames are supported.
+
+=head1 DESCRIPTION
+
+Before you start, you should glance through the README file
+found in the top-level directory where the Perl distribution
+was extracted.  Make sure you read and understand the terms under
+which this software is being distributed.
+
+This port currently supports MakeMaker (the set of modules that
+is used to build extensions to perl).  Therefore, you should be
+able to build and install most extensions found in the CPAN sites.
+
+Detailed instructions on how to build and install perl extension
+modules, including XS-type modules, is included.  See 'BUILDING AND
+INSTALLING MODULES'.
+
+=head2 Prerequisites for Compiling Perl on DOS
+
+=over 4
+
+=item DJGPP
+
+DJGPP is a port of GNU C/C++ compiler and development tools to 32-bit,
+protected-mode environment on Intel 32-bit CPUs running MS-DOS and compatible
+operating systems, by DJ Delorie <dj@delorie.com> and friends.
+
+For more details (FAQ), check out the home of DJGPP at:
+
+        http://www.delorie.com/djgpp/
+
+If you have questions about DJGPP, try posting to the DJGPP newsgroup:
+comp.os.msdos.djgpp, or use the email gateway djgpp@delorie.com.
+
+You can find the full DJGPP distribution on any SimTel.Net mirror all over
+the world. Like:
+
+        ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2*
+
+You need the following files to build perl (or add new modules):
+
+        v2/djdev203.zip
+        v2gnu/bnu2112b.zip
+        v2gnu/gcc2953b.zip
+        v2gnu/bsh204b.zip
+        v2gnu/mak3791b.zip
+        v2gnu/fil40b.zip
+        v2gnu/sed3028b.zip
+        v2gnu/txt20b.zip
+        v2gnu/dif272b.zip
+        v2gnu/grep24b.zip
+        v2gnu/shl20jb.zip
+        v2gnu/gwk306b.zip
+        v2misc/csdpmi5b.zip
+
+or possibly any newer version.
+
+=item Pthreads
+
+Thread support is not tested in this version of the djgpp perl.
+
+=back
+
+=head2 Shortcomings of Perl under DOS
+
+Perl under DOS lacks some features of perl under UNIX because of
+deficiencies in the UNIX-emulation, most notably:
+
+=over 4
+
+=item *
+
+fork() and pipe()
+
+=item *
+
+some features of the UNIX filesystem regarding link count and file dates
+
+=item *
+
+in-place operation is a little bit broken with short filenames
+
+=item *
+
+sockets
+
+=back
+
+=head2 Building Perl on DOS
+
+=over 4
+
+=item *
+
+Unpack the source package F<perl5.8*.tar.gz> with djtarx. If you want
+to use long file names under w95 and also to get Perl to pass all its
+tests, don't forget to use
+
+        set LFN=y
+        set FNCASE=y
+
+before unpacking the archive.
+
+=item *
+
+Create a "symlink" or copy your bash.exe to sh.exe in your C<($DJDIR)/bin>
+directory.
+
+        ln -s bash.exe sh.exe
+
+[If you have the recommended version of bash for DJGPP, this is already
+done for you.]
+
+And make the C<SHELL> environment variable point to this F<sh.exe>:
+
+        set SHELL=c:/djgpp/bin/sh.exe (use full path name!)
+
+You can do this in F<djgpp.env> too. Add this line BEFORE any section
+definition:
+
+        +SHELL=%DJDIR%/bin/sh.exe
+
+=item *
+
+If you have F<split.exe> and F<gsplit.exe> in your path, then rename 
+F<split.exe> to F<djsplit.exe>, and F<gsplit.exe> to F<split.exe>.
+Copy or link F<gecho.exe> to F<echo.exe> if you don't have F<echo.exe>.
+Copy or link F<gawk.exe> to F<awk.exe> if you don't have F<awk.exe>.
+
+[If you have the recommended versions of djdev, shell utilities and
+gawk, all these are already done for you, and you will not need to do
+anything.]
+
+=item *
+
+Chdir to the djgpp subdirectory of perl toplevel and type the following
+commands:
+
+        set FNCASE=y
+        configure.bat
+
+This will do some preprocessing then run the Configure script for you.
+The Configure script is interactive, but in most cases you just need to
+press ENTER.  The "set" command ensures that DJGPP preserves the letter
+case of file names when reading directories.  If you already issued this
+set command when unpacking the archive, and you are in the same DOS
+session as when you unpacked the archive, you don't have to issue the
+set command again.  This command is necessary *before* you start to 
+(re)configure or (re)build perl in order to ensure both that perl builds 
+correctly and that building XS-type modules can succeed.  See the DJGPP 
+info entry for "_preserve_fncase" for more information:
+
+        info libc alphabetical _preserve_fncase
+
+If the script says that your package is incomplete, and asks whether
+to continue, just answer with Y (this can only happen if you don't use
+long filenames or forget to issue "set FNCASE=y" first).
+
+When Configure asks about the extensions, I suggest IO and Fcntl,
+and if you want database handling then SDBM_File or GDBM_File
+(you need to install gdbm for this one). If you want to use the
+POSIX extension (this is the default), make sure that the stack
+size of your F<cc1.exe> is at least 512kbyte (you can check this
+with: C<stubedit cc1.exe>).
+
+You can use the Configure script in non-interactive mode too.
+When I built my F<perl.exe>, I used something like this:
+
+        configure.bat -des
+
+You can find more info about Configure's command line switches in
+the F<INSTALL> file.
+
+When the script ends, and you want to change some values in the
+generated F<config.sh> file, then run
+
+        sh Configure -S
+
+after you made your modifications.
+
+IMPORTANT: if you use this C<-S> switch, be sure to delete the CONFIG
+environment variable before running the script:
+
+        set CONFIG=
+
+=item *
+
+Now you can compile Perl. Type:
+
+        make
+
+=back
+
+=head2 Testing Perl on DOS
+
+Type:
+
+        make test
+
+If you're lucky you should see "All tests successful". But there can be
+a few failed subtests (less than 5 hopefully) depending on some external
+conditions (e.g. some subtests fail under linux/dosemu or plain dos
+with short filenames only).
+
+=head2 Installation of Perl on DOS
+
+Type:
+
+        make install
+
+This will copy the newly compiled perl and libraries into your DJGPP
+directory structure. Perl.exe and the utilities go into C<($DJDIR)/bin>,
+and the library goes under C<($DJDIR)/lib/perl5>. The pod documentation
+goes under C<($DJDIR)/lib/perl5/pod>.
+
+=head1 BUILDING AND INSTALLING MODULES ON DOS
+
+=head2 Building Prerequisites for Perl on DOS
+
+For building and installing non-XS modules, all you need is a working
+perl under DJGPP.  Non-XS modules do not require re-linking the perl
+binary, and so are simpler to build and install.
+
+XS-type modules do require re-linking the perl binary, because part of
+an XS module is written in "C", and has to be linked together with the
+perl binary to be executed.  This is required because perl under DJGPP
+is built with the "static link" option, due to the lack of "dynamic
+linking" in the DJGPP environment.
+
+Because XS modules require re-linking of the perl binary, you need both
+the perl binary distribution and the perl source distribution to build
+an XS extension module.  In addition, you will have to have built your
+perl binary from the source distribution so that all of the components
+of the perl binary are available for the required link step.
+
+=head2 Unpacking CPAN Modules on DOS
+
+First, download the module package from CPAN (e.g., the "Comma Separated
+Value" text package, Text-CSV-0.01.tar.gz).  Then expand the contents of
+the package into some location on your disk.  Most CPAN modules are
+built with an internal directory structure, so it is usually safe to
+expand it in the root of your DJGPP installation.  Some people prefer to
+locate source trees under /usr/src (i.e., C<($DJDIR)/usr/src>), but you may
+put it wherever seems most logical to you, *EXCEPT* under the same
+directory as your perl source code.  There are special rules that apply
+to modules which live in the perl source tree that do not apply to most
+of the modules in CPAN.
+
+Unlike other DJGPP packages, which are normal "zip" files, most CPAN
+module packages are "gzipped tarballs".  Recent versions of WinZip will
+safely unpack and expand them, *UNLESS* they have zero-length files.  It
+is a known WinZip bug (as of v7.0) that it will not extract zero-length
+files.
+
+From the command line, you can use the djtar utility provided with DJGPP
+to unpack and expand these files.  For example:
+
+        C:\djgpp>djtarx -v Text-CSV-0.01.tar.gz
+
+This will create the new directory C<($DJDIR)/Text-CSV-0.01>, filling
+it with the source for this module.
+
+=head2 Building Non-XS Modules on DOS
+
+To build a non-XS module, you can use the standard module-building
+instructions distributed with perl modules.
+
+    perl Makefile.PL
+    make
+    make test
+    make install
+
+This is sufficient because non-XS modules install only ".pm" files and
+(sometimes) pod and/or man documentation.  No re-linking of the perl
+binary is needed to build, install or use non-XS modules.
+
+=head2 Building XS Modules on DOS
+
+To build an XS module, you must use the standard module-building
+instructions distributed with perl modules *PLUS* three extra
+instructions specific to the DJGPP "static link" build environment.
+
+    set FNCASE=y
+    perl Makefile.PL
+    make
+    make perl
+    make test
+    make -f Makefile.aperl inst_perl MAP_TARGET=perl.exe
+    make install
+
+The first extra instruction sets DJGPP's FNCASE environment variable so
+that the new perl binary which you must build for an XS-type module will
+build correctly.  The second extra instruction re-builds the perl binary
+in your module directory before you run "make test", so that you are
+testing with the new module code you built with "make".  The third extra
+instruction installs the perl binary from your module directory into the
+standard DJGPP binary directory, C<($DJDIR)/bin>, replacing your
+previous perl binary.
+
+Note that the MAP_TARGET value *must* have the ".exe" extension or you
+will not create a "perl.exe" to replace the one in C<($DJDIR)/bin>.
+
+When you are done, the XS-module install process will have added information
+to your "perllocal" information telling that the perl binary has been replaced,
+and what module was installed.  You can view this information at any time
+by using the command:
+
+        perl -S perldoc perllocal
+
+=head1 AUTHOR
+
+Laszlo Molnar, F<laszlo.molnar@eth.ericsson.se> [Installing/building perl]
+
+Peter J. Farley III F<pjfarley@banet.net> [Building/installing modules]
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perldsc.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perldsc.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perldsc.pod	(revision 14489)
@@ -0,0 +1,847 @@
+=head1 NAME
+X<data structure> X<complex data structure> X<struct>
+
+perldsc - Perl Data Structures Cookbook
+
+=head1 DESCRIPTION
+
+The single feature most sorely lacking in the Perl programming language
+prior to its 5.0 release was complex data structures.  Even without direct
+language support, some valiant programmers did manage to emulate them, but
+it was hard work and not for the faint of heart.  You could occasionally
+get away with the C<$m{$AoA,$b}> notation borrowed from B<awk> in which the
+keys are actually more like a single concatenated string C<"$AoA$b">, but
+traversal and sorting were difficult.  More desperate programmers even
+hacked Perl's internal symbol table directly, a strategy that proved hard
+to develop and maintain--to put it mildly.
+
+The 5.0 release of Perl let us have complex data structures.  You
+may now write something like this and all of a sudden, you'd have an array
+with three dimensions!
+
+    for $x (1 .. 10) {
+	for $y (1 .. 10) {
+	    for $z (1 .. 10) {
+		$AoA[$x][$y][$z] =
+		    $x ** $y + $z;
+	    }
+	}
+    }
+
+Alas, however simple this may appear, underneath it's a much more
+elaborate construct than meets the eye!
+
+How do you print it out?  Why can't you say just C<print @AoA>?  How do
+you sort it?  How can you pass it to a function or get one of these back
+from a function?  Is it an object?  Can you save it to disk to read
+back later?  How do you access whole rows or columns of that matrix?  Do
+all the values have to be numeric?
+
+As you see, it's quite easy to become confused.  While some small portion
+of the blame for this can be attributed to the reference-based
+implementation, it's really more due to a lack of existing documentation with
+examples designed for the beginner.
+
+This document is meant to be a detailed but understandable treatment of the
+many different sorts of data structures you might want to develop.  It
+should also serve as a cookbook of examples.  That way, when you need to
+create one of these complex data structures, you can just pinch, pilfer, or
+purloin a drop-in example from here.
+
+Let's look at each of these possible constructs in detail.  There are separate
+sections on each of the following:
+
+=over 5
+
+=item * arrays of arrays
+
+=item * hashes of arrays
+
+=item * arrays of hashes
+
+=item * hashes of hashes
+
+=item * more elaborate constructs
+
+=back
+
+But for now, let's look at general issues common to all
+these types of data structures.
+
+=head1 REFERENCES
+X<reference> X<dereference> X<dereferencing> X<pointer>
+
+The most important thing to understand about all data structures in Perl
+-- including multidimensional arrays--is that even though they might
+appear otherwise, Perl C<@ARRAY>s and C<%HASH>es are all internally
+one-dimensional.  They can hold only scalar values (meaning a string,
+number, or a reference).  They cannot directly contain other arrays or
+hashes, but instead contain I<references> to other arrays or hashes.
+X<multidimensional array> X<array, multidimensional>
+
+You can't use a reference to an array or hash in quite the same way that you
+would a real array or hash.  For C or C++ programmers unused to
+distinguishing between arrays and pointers to the same, this can be
+confusing.  If so, just think of it as the difference between a structure
+and a pointer to a structure.
+
+You can (and should) read more about references in the perlref(1) man
+page.  Briefly, references are rather like pointers that know what they
+point to.  (Objects are also a kind of reference, but we won't be needing
+them right away--if ever.)  This means that when you have something which
+looks to you like an access to a two-or-more-dimensional array and/or hash,
+what's really going on is that the base type is
+merely a one-dimensional entity that contains references to the next
+level.  It's just that you can I<use> it as though it were a
+two-dimensional one.  This is actually the way almost all C
+multidimensional arrays work as well.
+
+    $array[7][12]			# array of arrays
+    $array[7]{string}			# array of hashes
+    $hash{string}[7]			# hash of arrays
+    $hash{string}{'another string'}	# hash of hashes
+
+Now, because the top level contains only references, if you try to print
+out your array in with a simple print() function, you'll get something
+that doesn't look very nice, like this:
+
+    @AoA = ( [2, 3], [4, 5, 7], [0] );
+    print $AoA[1][2];
+  7
+    print @AoA;
+  ARRAY(0x83c38)ARRAY(0x8b194)ARRAY(0x8b1d0)
+
+
+That's because Perl doesn't (ever) implicitly dereference your variables.
+If you want to get at the thing a reference is referring to, then you have
+to do this yourself using either prefix typing indicators, like
+C<${$blah}>, C<@{$blah}>, C<@{$blah[$i]}>, or else postfix pointer arrows,
+like C<$a-E<gt>[3]>, C<$h-E<gt>{fred}>, or even C<$ob-E<gt>method()-E<gt>[3]>.
+
+=head1 COMMON MISTAKES
+
+The two most common mistakes made in constructing something like
+an array of arrays is either accidentally counting the number of
+elements or else taking a reference to the same memory location
+repeatedly.  Here's the case where you just get the count instead
+of a nested array:
+
+    for $i (1..10) {
+	@array = somefunc($i);
+	$AoA[$i] = @array;	# WRONG!
+    }
+
+That's just the simple case of assigning an array to a scalar and getting
+its element count.  If that's what you really and truly want, then you
+might do well to consider being a tad more explicit about it, like this:
+
+    for $i (1..10) {
+	@array = somefunc($i);
+	$counts[$i] = scalar @array;
+    }
+
+Here's the case of taking a reference to the same memory location
+again and again:
+
+    for $i (1..10) {
+	@array = somefunc($i);
+	$AoA[$i] = \@array;	# WRONG!
+    }
+
+So, what's the big problem with that?  It looks right, doesn't it?
+After all, I just told you that you need an array of references, so by
+golly, you've made me one!
+
+Unfortunately, while this is true, it's still broken.  All the references
+in @AoA refer to the I<very same place>, and they will therefore all hold
+whatever was last in @array!  It's similar to the problem demonstrated in
+the following C program:
+
+    #include <pwd.h>
+    main() {
+	struct passwd *getpwnam(), *rp, *dp;
+	rp = getpwnam("root");
+	dp = getpwnam("daemon");
+
+	printf("daemon name is %s\nroot name is %s\n",
+		dp->pw_name, rp->pw_name);
+    }
+
+Which will print
+
+    daemon name is daemon
+    root name is daemon
+
+The problem is that both C<rp> and C<dp> are pointers to the same location
+in memory!  In C, you'd have to remember to malloc() yourself some new
+memory.  In Perl, you'll want to use the array constructor C<[]> or the
+hash constructor C<{}> instead.   Here's the right way to do the preceding
+broken code fragments:
+X<[]> X<{}>
+
+    for $i (1..10) {
+	@array = somefunc($i);
+	$AoA[$i] = [ @array ];
+    }
+
+The square brackets make a reference to a new array with a I<copy>
+of what's in @array at the time of the assignment.  This is what
+you want.
+
+Note that this will produce something similar, but it's
+much harder to read:
+
+    for $i (1..10) {
+	@array = 0 .. $i;
+	@{$AoA[$i]} = @array;
+    }
+
+Is it the same?  Well, maybe so--and maybe not.  The subtle difference
+is that when you assign something in square brackets, you know for sure
+it's always a brand new reference with a new I<copy> of the data.
+Something else could be going on in this new case with the C<@{$AoA[$i]}}>
+dereference on the left-hand-side of the assignment.  It all depends on
+whether C<$AoA[$i]> had been undefined to start with, or whether it
+already contained a reference.  If you had already populated @AoA with
+references, as in
+
+    $AoA[3] = \@another_array;
+
+Then the assignment with the indirection on the left-hand-side would
+use the existing reference that was already there:
+
+    @{$AoA[3]} = @array;
+
+Of course, this I<would> have the "interesting" effect of clobbering
+@another_array.  (Have you ever noticed how when a programmer says
+something is "interesting", that rather than meaning "intriguing",
+they're disturbingly more apt to mean that it's "annoying",
+"difficult", or both?  :-)
+
+So just remember always to use the array or hash constructors with C<[]>
+or C<{}>, and you'll be fine, although it's not always optimally
+efficient.
+
+Surprisingly, the following dangerous-looking construct will
+actually work out fine:
+
+    for $i (1..10) {
+        my @array = somefunc($i);
+        $AoA[$i] = \@array;
+    }
+
+That's because my() is more of a run-time statement than it is a
+compile-time declaration I<per se>.  This means that the my() variable is
+remade afresh each time through the loop.  So even though it I<looks> as
+though you stored the same variable reference each time, you actually did
+not!  This is a subtle distinction that can produce more efficient code at
+the risk of misleading all but the most experienced of programmers.  So I
+usually advise against teaching it to beginners.  In fact, except for
+passing arguments to functions, I seldom like to see the gimme-a-reference
+operator (backslash) used much at all in code.  Instead, I advise
+beginners that they (and most of the rest of us) should try to use the
+much more easily understood constructors C<[]> and C<{}> instead of
+relying upon lexical (or dynamic) scoping and hidden reference-counting to
+do the right thing behind the scenes.
+
+In summary:
+
+    $AoA[$i] = [ @array ];	# usually best
+    $AoA[$i] = \@array;		# perilous; just how my() was that array?
+    @{ $AoA[$i] } = @array;	# way too tricky for most programmers
+
+
+=head1 CAVEAT ON PRECEDENCE
+X<dereference, precedence> X<dereferencing, precedence>
+
+Speaking of things like C<@{$AoA[$i]}>, the following are actually the
+same thing:
+X<< -> >>
+
+    $aref->[2][2]	# clear
+    $$aref[2][2]	# confusing
+
+That's because Perl's precedence rules on its five prefix dereferencers
+(which look like someone swearing: C<$ @ * % &>) make them bind more
+tightly than the postfix subscripting brackets or braces!  This will no
+doubt come as a great shock to the C or C++ programmer, who is quite
+accustomed to using C<*a[i]> to mean what's pointed to by the I<i'th>
+element of C<a>.  That is, they first take the subscript, and only then
+dereference the thing at that subscript.  That's fine in C, but this isn't C.
+
+The seemingly equivalent construct in Perl, C<$$aref[$i]> first does
+the deref of $aref, making it take $aref as a reference to an
+array, and then dereference that, and finally tell you the I<i'th> value
+of the array pointed to by $AoA. If you wanted the C notion, you'd have to
+write C<${$AoA[$i]}> to force the C<$AoA[$i]> to get evaluated first
+before the leading C<$> dereferencer.
+
+=head1 WHY YOU SHOULD ALWAYS C<use strict>
+
+If this is starting to sound scarier than it's worth, relax.  Perl has
+some features to help you avoid its most common pitfalls.  The best
+way to avoid getting confused is to start every program like this:
+
+    #!/usr/bin/perl -w
+    use strict;
+
+This way, you'll be forced to declare all your variables with my() and
+also disallow accidental "symbolic dereferencing".  Therefore if you'd done
+this:
+
+    my $aref = [
+	[ "fred", "barney", "pebbles", "bambam", "dino", ],
+	[ "homer", "bart", "marge", "maggie", ],
+	[ "george", "jane", "elroy", "judy", ],
+    ];
+
+    print $aref[2][2];
+
+The compiler would immediately flag that as an error I<at compile time>,
+because you were accidentally accessing C<@aref>, an undeclared
+variable, and it would thereby remind you to write instead:
+
+    print $aref->[2][2]
+
+=head1 DEBUGGING
+X<data structure, debugging> X<complex data structure, debugging>
+X<AoA, debugging> X<HoA, debugging> X<AoH, debugging> X<HoH, debugging>
+X<array of arrays, debugging> X<hash of arrays, debugging>
+X<array of hashes, debugging> X<hash of hashes, debugging>
+
+Before version 5.002, the standard Perl debugger didn't do a very nice job of
+printing out complex data structures.  With 5.002 or above, the
+debugger includes several new features, including command line editing as
+well as the C<x> command to dump out complex data structures.  For
+example, given the assignment to $AoA above, here's the debugger output:
+
+    DB<1> x $AoA
+    $AoA = ARRAY(0x13b5a0)
+       0  ARRAY(0x1f0a24)
+	  0  'fred'
+	  1  'barney'
+	  2  'pebbles'
+	  3  'bambam'
+	  4  'dino'
+       1  ARRAY(0x13b558)
+	  0  'homer'
+	  1  'bart'
+	  2  'marge'
+	  3  'maggie'
+       2  ARRAY(0x13b540)
+	  0  'george'
+	  1  'jane'
+	  2  'elroy'
+	  3  'judy'
+
+=head1 CODE EXAMPLES
+
+Presented with little comment (these will get their own manpages someday)
+here are short code examples illustrating access of various
+types of data structures.
+
+=head1 ARRAYS OF ARRAYS
+X<array of arrays> X<AoA>
+
+=head2 Declaration of an ARRAY OF ARRAYS
+
+ @AoA = (
+        [ "fred", "barney" ],
+        [ "george", "jane", "elroy" ],
+        [ "homer", "marge", "bart" ],
+      );
+
+=head2 Generation of an ARRAY OF ARRAYS
+
+ # reading from file
+ while ( <> ) {
+     push @AoA, [ split ];
+ }
+
+ # calling a function
+ for $i ( 1 .. 10 ) {
+     $AoA[$i] = [ somefunc($i) ];
+ }
+
+ # using temp vars
+ for $i ( 1 .. 10 ) {
+     @tmp = somefunc($i);
+     $AoA[$i] = [ @tmp ];
+ }
+
+ # add to an existing row
+ push @{ $AoA[0] }, "wilma", "betty";
+
+=head2 Access and Printing of an ARRAY OF ARRAYS
+
+ # one element
+ $AoA[0][0] = "Fred";
+
+ # another element
+ $AoA[1][1] =~ s/(\w)/\u$1/;
+
+ # print the whole thing with refs
+ for $aref ( @AoA ) {
+     print "\t [ @$aref ],\n";
+ }
+
+ # print the whole thing with indices
+ for $i ( 0 .. $#AoA ) {
+     print "\t [ @{$AoA[$i]} ],\n";
+ }
+
+ # print the whole thing one at a time
+ for $i ( 0 .. $#AoA ) {
+     for $j ( 0 .. $#{ $AoA[$i] } ) {
+         print "elt $i $j is $AoA[$i][$j]\n";
+     }
+ }
+
+=head1 HASHES OF ARRAYS
+X<hash of arrays> X<HoA>
+
+=head2 Declaration of a HASH OF ARRAYS
+
+ %HoA = (
+        flintstones        => [ "fred", "barney" ],
+        jetsons            => [ "george", "jane", "elroy" ],
+        simpsons           => [ "homer", "marge", "bart" ],
+      );
+
+=head2 Generation of a HASH OF ARRAYS
+
+ # reading from file
+ # flintstones: fred barney wilma dino
+ while ( <> ) {
+     next unless s/^(.*?):\s*//;
+     $HoA{$1} = [ split ];
+ }
+
+ # reading from file; more temps
+ # flintstones: fred barney wilma dino
+ while ( $line = <> ) {
+     ($who, $rest) = split /:\s*/, $line, 2;
+     @fields = split ' ', $rest;
+     $HoA{$who} = [ @fields ];
+ }
+
+ # calling a function that returns a list
+ for $group ( "simpsons", "jetsons", "flintstones" ) {
+     $HoA{$group} = [ get_family($group) ];
+ }
+
+ # likewise, but using temps
+ for $group ( "simpsons", "jetsons", "flintstones" ) {
+     @members = get_family($group);
+     $HoA{$group} = [ @members ];
+ }
+
+ # append new members to an existing family
+ push @{ $HoA{"flintstones"} }, "wilma", "betty";
+
+=head2 Access and Printing of a HASH OF ARRAYS
+
+ # one element
+ $HoA{flintstones}[0] = "Fred";
+
+ # another element
+ $HoA{simpsons}[1] =~ s/(\w)/\u$1/;
+
+ # print the whole thing
+ foreach $family ( keys %HoA ) {
+     print "$family: @{ $HoA{$family} }\n"
+ }
+
+ # print the whole thing with indices
+ foreach $family ( keys %HoA ) {
+     print "family: ";
+     foreach $i ( 0 .. $#{ $HoA{$family} } ) {
+         print " $i = $HoA{$family}[$i]";
+     }
+     print "\n";
+ }
+
+ # print the whole thing sorted by number of members
+ foreach $family ( sort { @{$HoA{$b}} <=> @{$HoA{$a}} } keys %HoA ) {
+     print "$family: @{ $HoA{$family} }\n"
+ }
+
+ # print the whole thing sorted by number of members and name
+ foreach $family ( sort {
+			    @{$HoA{$b}} <=> @{$HoA{$a}}
+					||
+				    $a cmp $b
+	    } keys %HoA )
+ {
+     print "$family: ", join(", ", sort @{ $HoA{$family} }), "\n";
+ }
+
+=head1 ARRAYS OF HASHES
+X<array of hashes> X<AoH>
+
+=head2 Declaration of an ARRAY OF HASHES
+
+ @AoH = (
+        {
+            Lead     => "fred",
+            Friend   => "barney",
+        },
+        {
+            Lead     => "george",
+            Wife     => "jane",
+            Son      => "elroy",
+        },
+        {
+            Lead     => "homer",
+            Wife     => "marge",
+            Son      => "bart",
+        }
+  );
+
+=head2 Generation of an ARRAY OF HASHES
+
+ # reading from file
+ # format: LEAD=fred FRIEND=barney
+ while ( <> ) {
+     $rec = {};
+     for $field ( split ) {
+         ($key, $value) = split /=/, $field;
+         $rec->{$key} = $value;
+     }
+     push @AoH, $rec;
+ }
+
+
+ # reading from file
+ # format: LEAD=fred FRIEND=barney
+ # no temp
+ while ( <> ) {
+     push @AoH, { split /[\s+=]/ };
+ }
+
+ # calling a function  that returns a key/value pair list, like
+ # "lead","fred","daughter","pebbles"
+ while ( %fields = getnextpairset() ) {
+     push @AoH, { %fields };
+ }
+
+ # likewise, but using no temp vars
+ while (<>) {
+     push @AoH, { parsepairs($_) };
+ }
+
+ # add key/value to an element
+ $AoH[0]{pet} = "dino";
+ $AoH[2]{pet} = "santa's little helper";
+
+=head2 Access and Printing of an ARRAY OF HASHES
+
+ # one element
+ $AoH[0]{lead} = "fred";
+
+ # another element
+ $AoH[1]{lead} =~ s/(\w)/\u$1/;
+
+ # print the whole thing with refs
+ for $href ( @AoH ) {
+     print "{ ";
+     for $role ( keys %$href ) {
+         print "$role=$href->{$role} ";
+     }
+     print "}\n";
+ }
+
+ # print the whole thing with indices
+ for $i ( 0 .. $#AoH ) {
+     print "$i is { ";
+     for $role ( keys %{ $AoH[$i] } ) {
+         print "$role=$AoH[$i]{$role} ";
+     }
+     print "}\n";
+ }
+
+ # print the whole thing one at a time
+ for $i ( 0 .. $#AoH ) {
+     for $role ( keys %{ $AoH[$i] } ) {
+         print "elt $i $role is $AoH[$i]{$role}\n";
+     }
+ }
+
+=head1 HASHES OF HASHES
+X<hass of hashes> X<HoH>
+
+=head2 Declaration of a HASH OF HASHES
+
+ %HoH = (
+        flintstones => {
+		lead      => "fred",
+		pal       => "barney",
+        },
+        jetsons     => {
+		lead      => "george",
+		wife      => "jane",
+		"his boy" => "elroy",
+        },
+        simpsons    => {
+		lead      => "homer",
+		wife      => "marge",
+		kid       => "bart",
+	},
+ );
+
+=head2 Generation of a HASH OF HASHES
+
+ # reading from file
+ # flintstones: lead=fred pal=barney wife=wilma pet=dino
+ while ( <> ) {
+     next unless s/^(.*?):\s*//;
+     $who = $1;
+     for $field ( split ) {
+         ($key, $value) = split /=/, $field;
+         $HoH{$who}{$key} = $value;
+     }
+
+
+ # reading from file; more temps
+ while ( <> ) {
+     next unless s/^(.*?):\s*//;
+     $who = $1;
+     $rec = {};
+     $HoH{$who} = $rec;
+     for $field ( split ) {
+         ($key, $value) = split /=/, $field;
+         $rec->{$key} = $value;
+     }
+ }
+
+ # calling a function  that returns a key,value hash
+ for $group ( "simpsons", "jetsons", "flintstones" ) {
+     $HoH{$group} = { get_family($group) };
+ }
+
+ # likewise, but using temps
+ for $group ( "simpsons", "jetsons", "flintstones" ) {
+     %members = get_family($group);
+     $HoH{$group} = { %members };
+ }
+
+ # append new members to an existing family
+ %new_folks = (
+     wife => "wilma",
+     pet  => "dino",
+ );
+
+ for $what (keys %new_folks) {
+     $HoH{flintstones}{$what} = $new_folks{$what};
+ }
+
+=head2 Access and Printing of a HASH OF HASHES
+
+ # one element
+ $HoH{flintstones}{wife} = "wilma";
+
+ # another element
+ $HoH{simpsons}{lead} =~ s/(\w)/\u$1/;
+
+ # print the whole thing
+ foreach $family ( keys %HoH ) {
+     print "$family: { ";
+     for $role ( keys %{ $HoH{$family} } ) {
+         print "$role=$HoH{$family}{$role} ";
+     }
+     print "}\n";
+ }
+
+ # print the whole thing  somewhat sorted
+ foreach $family ( sort keys %HoH ) {
+     print "$family: { ";
+     for $role ( sort keys %{ $HoH{$family} } ) {
+         print "$role=$HoH{$family}{$role} ";
+     }
+     print "}\n";
+ }
+
+
+ # print the whole thing sorted by number of members
+ foreach $family ( sort { keys %{$HoH{$b}} <=> keys %{$HoH{$a}} } keys %HoH ) {
+     print "$family: { ";
+     for $role ( sort keys %{ $HoH{$family} } ) {
+         print "$role=$HoH{$family}{$role} ";
+     }
+     print "}\n";
+ }
+
+ # establish a sort order (rank) for each role
+ $i = 0;
+ for ( qw(lead wife son daughter pal pet) ) { $rank{$_} = ++$i }
+
+ # now print the whole thing sorted by number of members
+ foreach $family ( sort { keys %{ $HoH{$b} } <=> keys %{ $HoH{$a} } } keys %HoH ) {
+     print "$family: { ";
+     # and print these according to rank order
+     for $role ( sort { $rank{$a} <=> $rank{$b} }  keys %{ $HoH{$family} } ) {
+         print "$role=$HoH{$family}{$role} ";
+     }
+     print "}\n";
+ }
+
+
+=head1 MORE ELABORATE RECORDS
+X<record> X<structure> X<struct>
+
+=head2 Declaration of MORE ELABORATE RECORDS
+
+Here's a sample showing how to create and use a record whose fields are of
+many different sorts:
+
+     $rec = {
+	 TEXT      => $string,
+	 SEQUENCE  => [ @old_values ],
+	 LOOKUP    => { %some_table },
+	 THATCODE  => \&some_function,
+	 THISCODE  => sub { $_[0] ** $_[1] },
+	 HANDLE    => \*STDOUT,
+     };
+
+     print $rec->{TEXT};
+
+     print $rec->{SEQUENCE}[0];
+     $last = pop @ { $rec->{SEQUENCE} };
+
+     print $rec->{LOOKUP}{"key"};
+     ($first_k, $first_v) = each %{ $rec->{LOOKUP} };
+
+     $answer = $rec->{THATCODE}->($arg);
+     $answer = $rec->{THISCODE}->($arg1, $arg2);
+
+     # careful of extra block braces on fh ref
+     print { $rec->{HANDLE} } "a string\n";
+
+     use FileHandle;
+     $rec->{HANDLE}->autoflush(1);
+     $rec->{HANDLE}->print(" a string\n");
+
+=head2 Declaration of a HASH OF COMPLEX RECORDS
+
+     %TV = (
+        flintstones => {
+            series   => "flintstones",
+            nights   => [ qw(monday thursday friday) ],
+            members  => [
+                { name => "fred",    role => "lead", age  => 36, },
+                { name => "wilma",   role => "wife", age  => 31, },
+                { name => "pebbles", role => "kid",  age  =>  4, },
+            ],
+        },
+
+        jetsons     => {
+            series   => "jetsons",
+            nights   => [ qw(wednesday saturday) ],
+            members  => [
+                { name => "george",  role => "lead", age  => 41, },
+                { name => "jane",    role => "wife", age  => 39, },
+                { name => "elroy",   role => "kid",  age  =>  9, },
+            ],
+         },
+
+        simpsons    => {
+            series   => "simpsons",
+            nights   => [ qw(monday) ],
+            members  => [
+                { name => "homer", role => "lead", age  => 34, },
+                { name => "marge", role => "wife", age => 37, },
+                { name => "bart",  role => "kid",  age  =>  11, },
+            ],
+         },
+      );
+
+=head2 Generation of a HASH OF COMPLEX RECORDS
+
+     # reading from file
+     # this is most easily done by having the file itself be
+     # in the raw data format as shown above.  perl is happy
+     # to parse complex data structures if declared as data, so
+     # sometimes it's easiest to do that
+
+     # here's a piece by piece build up
+     $rec = {};
+     $rec->{series} = "flintstones";
+     $rec->{nights} = [ find_days() ];
+
+     @members = ();
+     # assume this file in field=value syntax
+     while (<>) {
+         %fields = split /[\s=]+/;
+         push @members, { %fields };
+     }
+     $rec->{members} = [ @members ];
+
+     # now remember the whole thing
+     $TV{ $rec->{series} } = $rec;
+
+     ###########################################################
+     # now, you might want to make interesting extra fields that
+     # include pointers back into the same data structure so if
+     # change one piece, it changes everywhere, like for example
+     # if you wanted a {kids} field that was a reference
+     # to an array of the kids' records without having duplicate
+     # records and thus update problems.
+     ###########################################################
+     foreach $family (keys %TV) {
+         $rec = $TV{$family}; # temp pointer
+         @kids = ();
+         for $person ( @{ $rec->{members} } ) {
+             if ($person->{role} =~ /kid|son|daughter/) {
+                 push @kids, $person;
+             }
+         }
+         # REMEMBER: $rec and $TV{$family} point to same data!!
+         $rec->{kids} = [ @kids ];
+     }
+
+     # you copied the array, but the array itself contains pointers
+     # to uncopied objects. this means that if you make bart get
+     # older via
+
+     $TV{simpsons}{kids}[0]{age}++;
+
+     # then this would also change in
+     print $TV{simpsons}{members}[2]{age};
+
+     # because $TV{simpsons}{kids}[0] and $TV{simpsons}{members}[2]
+     # both point to the same underlying anonymous hash table
+
+     # print the whole thing
+     foreach $family ( keys %TV ) {
+         print "the $family";
+         print " is on during @{ $TV{$family}{nights} }\n";
+         print "its members are:\n";
+         for $who ( @{ $TV{$family}{members} } ) {
+             print " $who->{name} ($who->{role}), age $who->{age}\n";
+         }
+         print "it turns out that $TV{$family}{lead} has ";
+         print scalar ( @{ $TV{$family}{kids} } ), " kids named ";
+         print join (", ", map { $_->{name} } @{ $TV{$family}{kids} } );
+         print "\n";
+     }
+
+=head1 Database Ties
+
+You cannot easily tie a multilevel data structure (such as a hash of
+hashes) to a dbm file.  The first problem is that all but GDBM and
+Berkeley DB have size limitations, but beyond that, you also have problems
+with how references are to be represented on disk.  One experimental
+module that does partially attempt to address this need is the MLDBM
+module.  Check your nearest CPAN site as described in L<perlmodlib> for
+source code to MLDBM.
+
+=head1 SEE ALSO
+
+perlref(1), perllol(1), perldata(1), perlobj(1)
+
+=head1 AUTHOR
+
+Tom Christiansen <F<tchrist@perl.com>>
+
+Last update:
+Wed Oct 23 04:57:50 MET DST 1996
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlebcdic.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlebcdic.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlebcdic.pod	(revision 14489)
@@ -0,0 +1,1394 @@
+=head1 NAME
+
+perlebcdic - Considerations for running Perl on EBCDIC platforms
+
+=head1 DESCRIPTION
+
+An exploration of some of the issues facing Perl programmers
+on EBCDIC based computers.  We do not cover localization, 
+internationalization, or multi byte character set issues other
+than some discussion of UTF-8 and UTF-EBCDIC.
+
+Portions that are still incomplete are marked with XXX.
+
+=head1 COMMON CHARACTER CODE SETS
+
+=head2 ASCII
+
+The American Standard Code for Information Interchange is a set of
+integers running from 0 to 127 (decimal) that imply character 
+interpretation by the display and other system(s) of computers.  
+The range 0..127 can be covered by setting the bits in a 7-bit binary 
+digit, hence the set is sometimes referred to as a "7-bit ASCII".  
+ASCII was described by the American National Standards Institute 
+document ANSI X3.4-1986.  It was also described by ISO 646:1991 
+(with localization for currency symbols).  The full ASCII set is 
+given in the table below as the first 128 elements.  Languages that 
+can be written adequately with the characters in ASCII include 
+English, Hawaiian, Indonesian, Swahili and some Native American 
+languages.
+
+There are many character sets that extend the range of integers
+from 0..2**7-1 up to 2**8-1, or 8 bit bytes (octets if you prefer).
+One common one is the ISO 8859-1 character set.
+
+=head2 ISO 8859
+
+The ISO 8859-$n are a collection of character code sets from the 
+International Organization for Standardization (ISO) each of which 
+adds characters to the ASCII set that are typically found in European 
+languages many of which are based on the Roman, or Latin, alphabet.
+
+=head2 Latin 1 (ISO 8859-1)
+
+A particular 8-bit extension to ASCII that includes grave and acute 
+accented Latin characters.  Languages that can employ ISO 8859-1 
+include all the languages covered by ASCII as well as Afrikaans, 
+Albanian, Basque, Catalan, Danish, Faroese, Finnish, Norwegian, 
+Portuguese, Spanish, and Swedish.  Dutch is covered albeit without 
+the ij ligature.  French is covered too but without the oe ligature. 
+German can use ISO 8859-1 but must do so without German-style
+quotation marks.  This set is based on Western European extensions 
+to ASCII and is commonly encountered in world wide web work.
+In IBM character code set identification terminology ISO 8859-1 is
+also known as CCSID 819 (or sometimes 0819 or even 00819).
+
+=head2 EBCDIC
+
+The Extended Binary Coded Decimal Interchange Code refers to a 
+large collection of slightly different single and multi byte 
+coded character sets that are different from ASCII or ISO 8859-1 
+and typically run on host computers.  The EBCDIC encodings derive 
+from 8 bit byte extensions of Hollerith punched card encodings.
+The layout on the cards was such that high bits were set for the
+upper and lower case alphabet characters [a-z] and [A-Z], but there
+were gaps within each latin alphabet range.
+
+Some IBM EBCDIC character sets may be known by character code set 
+identification numbers (CCSID numbers) or code page numbers.  Leading
+zero digits in CCSID numbers within this document are insignificant.
+E.g. CCSID 0037 may be referred to as 37 in places.
+
+=head2 13 variant characters
+
+Among IBM EBCDIC character code sets there are 13 characters that
+are often mapped to different integer values.  Those characters
+are known as the 13 "variant" characters and are:
+
+    \ [ ] { } ^ ~ ! # | $ @ ` 
+
+=head2 0037
+
+Character code set ID 0037 is a mapping of the ASCII plus Latin-1 
+characters (i.e. ISO 8859-1) to an EBCDIC set.  0037 is used 
+in North American English locales on the OS/400 operating system 
+that runs on AS/400 computers.  CCSID 37 differs from ISO 8859-1 
+in 237 places, in other words they agree on only 19 code point values.
+
+=head2 1047
+
+Character code set ID 1047 is also a mapping of the ASCII plus 
+Latin-1 characters (i.e. ISO 8859-1) to an EBCDIC set.  1047 is 
+used under Unix System Services for OS/390 or z/OS, and OpenEdition 
+for VM/ESA.  CCSID 1047 differs from CCSID 0037 in eight places.
+
+=head2 POSIX-BC
+
+The EBCDIC code page in use on Siemens' BS2000 system is distinct from
+1047 and 0037.  It is identified below as the POSIX-BC set.
+
+=head2 Unicode code points versus EBCDIC code points
+
+In Unicode terminology a I<code point> is the number assigned to a
+character: for example, in EBCDIC the character "A" is usually assigned
+the number 193.  In Unicode the character "A" is assigned the number 65.
+This causes a problem with the semantics of the pack/unpack "U", which
+are supposed to pack Unicode code points to characters and back to numbers.
+The problem is: which code points to use for code points less than 256?
+(for 256 and over there's no problem: Unicode code points are used)
+In EBCDIC, for the low 256 the EBCDIC code points are used.  This
+means that the equivalences
+
+	pack("U", ord($character)) eq $character
+	unpack("U", $character) == ord $character
+
+will hold.  (If Unicode code points were applied consistently over
+all the possible code points, pack("U",ord("A")) would in EBCDIC
+equal I<A with acute> or chr(101), and unpack("U", "A") would equal
+65, or I<non-breaking space>, not 193, or ord "A".)
+
+=head2 Remaining Perl Unicode problems in EBCDIC
+
+=over 4
+
+=item *
+
+Many of the remaining seem to be related to case-insensitive matching:
+for example, C<< /[\x{131}]/ >> (LATIN SMALL LETTER DOTLESS I) does
+not match "I" case-insensitively, as it should under Unicode.
+(The match succeeds in ASCII-derived platforms.)
+
+=item *
+
+The extensions Unicode::Collate and Unicode::Normalized are not
+supported under EBCDIC, likewise for the encoding pragma.
+
+=back
+
+=head2 Unicode and UTF
+
+UTF is a Unicode Transformation Format.  UTF-8 is a Unicode conforming
+representation of the Unicode standard that looks very much like ASCII.
+UTF-EBCDIC is an attempt to represent Unicode characters in an EBCDIC
+transparent manner.
+
+=head2 Using Encode
+
+Starting from Perl 5.8 you can use the standard new module Encode
+to translate from EBCDIC to Latin-1 code points
+
+	use Encode 'from_to';
+
+	my %ebcdic = ( 176 => 'cp37', 95 => 'cp1047', 106 => 'posix-bc' );
+
+	# $a is in EBCDIC code points
+	from_to($a, $ebcdic{ord '^'}, 'latin1');
+	# $a is ISO 8859-1 code points
+
+and from Latin-1 code points to EBCDIC code points
+
+	use Encode 'from_to';
+
+	my %ebcdic = ( 176 => 'cp37', 95 => 'cp1047', 106 => 'posix-bc' );
+
+	# $a is ISO 8859-1 code points
+	from_to($a, 'latin1', $ebcdic{ord '^'});
+	# $a is in EBCDIC code points
+
+For doing I/O it is suggested that you use the autotranslating features
+of PerlIO, see L<perluniintro>.
+
+Since version 5.8 Perl uses the new PerlIO I/O library.  This enables
+you to use different encodings per IO channel.  For example you may use
+
+    use Encode;
+    open($f, ">:encoding(ascii)", "test.ascii");
+    print $f "Hello World!\n";
+    open($f, ">:encoding(cp37)", "test.ebcdic");
+    print $f "Hello World!\n";
+    open($f, ">:encoding(latin1)", "test.latin1");
+    print $f "Hello World!\n";
+    open($f, ">:encoding(utf8)", "test.utf8");
+    print $f "Hello World!\n";
+
+to get two files containing "Hello World!\n" in ASCII, CP 37 EBCDIC,
+ISO 8859-1 (Latin-1) (in this example identical to ASCII) respective
+UTF-EBCDIC (in this example identical to normal EBCDIC).  See the
+documentation of Encode::PerlIO for details.
+
+As the PerlIO layer uses raw IO (bytes) internally, all this totally
+ignores things like the type of your filesystem (ASCII or EBCDIC).
+
+=head1 SINGLE OCTET TABLES
+
+The following tables list the ASCII and Latin 1 ordered sets including
+the subsets: C0 controls (0..31), ASCII graphics (32..7e), delete (7f),
+C1 controls (80..9f), and Latin-1 (a.k.a. ISO 8859-1) (a0..ff).  In the 
+table non-printing control character names as well as the Latin 1 
+extensions to ASCII have been labelled with character names roughly 
+corresponding to I<The Unicode Standard, Version 3.0> albeit with 
+substitutions such as s/LATIN// and s/VULGAR// in all cases, 
+s/CAPITAL LETTER// in some cases, and s/SMALL LETTER ([A-Z])/\l$1/ 
+in some other cases (the C<charnames> pragma names unfortunately do 
+not list explicit names for the C0 or C1 control characters).  The 
+"names" of the C1 control set (128..159 in ISO 8859-1) listed here are 
+somewhat arbitrary.  The differences between the 0037 and 1047 sets are 
+flagged with ***.  The differences between the 1047 and POSIX-BC sets 
+are flagged with ###.  All ord() numbers listed are decimal.  If you 
+would rather see this table listing octal values then run the table 
+(that is, the pod version of this document since this recipe may not 
+work with a pod2_other_format translation) through:
+
+=over 4
+
+=item recipe 0
+
+=back
+
+    perl -ne 'if(/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
+     -e '{printf("%s%-9o%-9o%-9o%o\n",$1,$2,$3,$4,$5)}' perlebcdic.pod
+
+If you want to retain the UTF-x code points then in script form you
+might want to write:
+
+=over 4
+
+=item recipe 1
+
+=back
+
+    open(FH,"<perlebcdic.pod") or die "Could not open perlebcdic.pod: $!";
+    while (<FH>) {
+        if (/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\.?(\d*)\s+(\d+)\.?(\d*)/)  {
+            if ($7 ne '' && $9 ne '') {
+                printf("%s%-9o%-9o%-9o%-9o%-3o.%-5o%-3o.%o\n",$1,$2,$3,$4,$5,$6,$7,$8,$9);
+            }
+            elsif ($7 ne '') {
+                printf("%s%-9o%-9o%-9o%-9o%-3o.%-5o%o\n",$1,$2,$3,$4,$5,$6,$7,$8);
+            }
+            else {
+                printf("%s%-9o%-9o%-9o%-9o%-9o%o\n",$1,$2,$3,$4,$5,$6,$8);
+            }
+        }
+    }
+
+If you would rather see this table listing hexadecimal values then
+run the table through:
+
+=over 4
+
+=item recipe 2
+
+=back
+
+    perl -ne 'if(/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
+     -e '{printf("%s%-9X%-9X%-9X%X\n",$1,$2,$3,$4,$5)}' perlebcdic.pod
+
+Or, in order to retain the UTF-x code points in hexadecimal:
+
+=over 4
+
+=item recipe 3
+
+=back
+
+    open(FH,"<perlebcdic.pod") or die "Could not open perlebcdic.pod: $!";
+    while (<FH>) {
+        if (/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\.?(\d*)\s+(\d+)\.?(\d*)/)  {
+            if ($7 ne '' && $9 ne '') {
+                printf("%s%-9X%-9X%-9X%-9X%-2X.%-6X%-2X.%X\n",$1,$2,$3,$4,$5,$6,$7,$8,$9);
+            }
+            elsif ($7 ne '') {
+                printf("%s%-9X%-9X%-9X%-9X%-2X.%-6X%X\n",$1,$2,$3,$4,$5,$6,$7,$8);
+            }
+            else {
+                printf("%s%-9X%-9X%-9X%-9X%-9X%X\n",$1,$2,$3,$4,$5,$6,$8);
+            }
+        }
+    }
+
+
+                                                                     incomp-  incomp-
+                                 8859-1                              lete     lete
+    chr                          0819     0037     1047     POSIX-BC UTF-8    UTF-EBCDIC
+    ------------------------------------------------------------------------------------
+    <NULL>                       0        0        0        0        0        0 
+    <START OF HEADING>           1        1        1        1        1        1
+    <START OF TEXT>              2        2        2        2        2        2
+    <END OF TEXT>                3        3        3        3        3        3
+    <END OF TRANSMISSION>        4        55       55       55       4        55 
+    <ENQUIRY>                    5        45       45       45       5        45 
+    <ACKNOWLEDGE>                6        46       46       46       6        46 
+    <BELL>                       7        47       47       47       7        47 
+    <BACKSPACE>                  8        22       22       22       8        22 
+    <HORIZONTAL TABULATION>      9        5        5        5        9        5 
+    <LINE FEED>                  10       37       21       21       10       21       ***
+    <VERTICAL TABULATION>        11       11       11       11       11       11
+    <FORM FEED>                  12       12       12       12       12       12
+    <CARRIAGE RETURN>            13       13       13       13       13       13
+    <SHIFT OUT>                  14       14       14       14       14       14
+    <SHIFT IN>                   15       15       15       15       15       15
+    <DATA LINK ESCAPE>           16       16       16       16       16       16
+    <DEVICE CONTROL ONE>         17       17       17       17       17       17
+    <DEVICE CONTROL TWO>         18       18       18       18       18       18
+    <DEVICE CONTROL THREE>       19       19       19       19       19       19
+    <DEVICE CONTROL FOUR>        20       60       60       60       20       60
+    <NEGATIVE ACKNOWLEDGE>       21       61       61       61       21       61
+    <SYNCHRONOUS IDLE>           22       50       50       50       22       50
+    <END OF TRANSMISSION BLOCK>  23       38       38       38       23       38
+    <CANCEL>                     24       24       24       24       24       24
+    <END OF MEDIUM>              25       25       25       25       25       25
+    <SUBSTITUTE>                 26       63       63       63       26       63
+    <ESCAPE>                     27       39       39       39       27       39
+    <FILE SEPARATOR>             28       28       28       28       28       28
+    <GROUP SEPARATOR>            29       29       29       29       29       29
+    <RECORD SEPARATOR>           30       30       30       30       30       30
+    <UNIT SEPARATOR>             31       31       31       31       31       31
+    <SPACE>                      32       64       64       64       32       64
+    !                            33       90       90       90       33       90
+    "                            34       127      127      127      34       127
+    #                            35       123      123      123      35       123
+    $                            36       91       91       91       36       91
+    %                            37       108      108      108      37       108
+    &                            38       80       80       80       38       80
+    '                            39       125      125      125      39       125
+    (                            40       77       77       77       40       77
+    )                            41       93       93       93       41       93
+    *                            42       92       92       92       42       92
+    +                            43       78       78       78       43       78
+    ,                            44       107      107      107      44       107
+    -                            45       96       96       96       45       96
+    .                            46       75       75       75       46       75
+    /                            47       97       97       97       47       97
+    0                            48       240      240      240      48       240
+    1                            49       241      241      241      49       241
+    2                            50       242      242      242      50       242
+    3                            51       243      243      243      51       243
+    4                            52       244      244      244      52       244
+    5                            53       245      245      245      53       245
+    6                            54       246      246      246      54       246
+    7                            55       247      247      247      55       247
+    8                            56       248      248      248      56       248
+    9                            57       249      249      249      57       249
+    :                            58       122      122      122      58       122
+    ;                            59       94       94       94       59       94
+    <                            60       76       76       76       60       76
+    =                            61       126      126      126      61       126
+    >                            62       110      110      110      62       110
+    ?                            63       111      111      111      63       111
+    @                            64       124      124      124      64       124
+    A                            65       193      193      193      65       193
+    B                            66       194      194      194      66       194
+    C                            67       195      195      195      67       195
+    D                            68       196      196      196      68       196
+    E                            69       197      197      197      69       197
+    F                            70       198      198      198      70       198
+    G                            71       199      199      199      71       199
+    H                            72       200      200      200      72       200
+    I                            73       201      201      201      73       201
+    J                            74       209      209      209      74       209
+    K                            75       210      210      210      75       210
+    L                            76       211      211      211      76       211
+    M                            77       212      212      212      77       212
+    N                            78       213      213      213      78       213
+    O                            79       214      214      214      79       214
+    P                            80       215      215      215      80       215
+    Q                            81       216      216      216      81       216
+    R                            82       217      217      217      82       217
+    S                            83       226      226      226      83       226
+    T                            84       227      227      227      84       227
+    U                            85       228      228      228      85       228
+    V                            86       229      229      229      86       229
+    W                            87       230      230      230      87       230
+    X                            88       231      231      231      88       231
+    Y                            89       232      232      232      89       232
+    Z                            90       233      233      233      90       233
+    [                            91       186      173      187      91       173      *** ###
+    \                            92       224      224      188      92       224      ### 
+    ]                            93       187      189      189      93       189      ***
+    ^                            94       176      95       106      94       95       *** ###
+    _                            95       109      109      109      95       109
+    `                            96       121      121      74       96       121      ###
+    a                            97       129      129      129      97       129
+    b                            98       130      130      130      98       130
+    c                            99       131      131      131      99       131
+    d                            100      132      132      132      100      132
+    e                            101      133      133      133      101      133
+    f                            102      134      134      134      102      134
+    g                            103      135      135      135      103      135
+    h                            104      136      136      136      104      136
+    i                            105      137      137      137      105      137
+    j                            106      145      145      145      106      145
+    k                            107      146      146      146      107      146
+    l                            108      147      147      147      108      147
+    m                            109      148      148      148      109      148
+    n                            110      149      149      149      110      149
+    o                            111      150      150      150      111      150
+    p                            112      151      151      151      112      151
+    q                            113      152      152      152      113      152
+    r                            114      153      153      153      114      153
+    s                            115      162      162      162      115      162
+    t                            116      163      163      163      116      163
+    u                            117      164      164      164      117      164
+    v                            118      165      165      165      118      165
+    w                            119      166      166      166      119      166
+    x                            120      167      167      167      120      167
+    y                            121      168      168      168      121      168
+    z                            122      169      169      169      122      169
+    {                            123      192      192      251      123      192      ###
+    |                            124      79       79       79       124      79
+    }                            125      208      208      253      125      208      ###
+    ~                            126      161      161      255      126      161      ###
+    <DELETE>                     127      7        7        7        127      7
+    <C1 0>                       128      32       32       32       194.128  32
+    <C1 1>                       129      33       33       33       194.129  33
+    <C1 2>                       130      34       34       34       194.130  34
+    <C1 3>                       131      35       35       35       194.131  35
+    <C1 4>                       132      36       36       36       194.132  36
+    <C1 5>                       133      21       37       37       194.133  37       ***
+    <C1 6>                       134      6        6        6        194.134  6
+    <C1 7>                       135      23       23       23       194.135  23
+    <C1 8>                       136      40       40       40       194.136  40
+    <C1 9>                       137      41       41       41       194.137  41
+    <C1 10>                      138      42       42       42       194.138  42
+    <C1 11>                      139      43       43       43       194.139  43
+    <C1 12>                      140      44       44       44       194.140  44
+    <C1 13>                      141      9        9        9        194.141  9
+    <C1 14>                      142      10       10       10       194.142  10
+    <C1 15>                      143      27       27       27       194.143  27
+    <C1 16>                      144      48       48       48       194.144  48
+    <C1 17>                      145      49       49       49       194.145  49
+    <C1 18>                      146      26       26       26       194.146  26
+    <C1 19>                      147      51       51       51       194.147  51
+    <C1 20>                      148      52       52       52       194.148  52
+    <C1 21>                      149      53       53       53       194.149  53
+    <C1 22>                      150      54       54       54       194.150  54
+    <C1 23>                      151      8        8        8        194.151  8
+    <C1 24>                      152      56       56       56       194.152  56
+    <C1 25>                      153      57       57       57       194.153  57
+    <C1 26>                      154      58       58       58       194.154  58
+    <C1 27>                      155      59       59       59       194.155  59
+    <C1 28>                      156      4        4        4        194.156  4
+    <C1 29>                      157      20       20       20       194.157  20
+    <C1 30>                      158      62       62       62       194.158  62
+    <C1 31>                      159      255      255      95       194.159  255      ###
+    <NON-BREAKING SPACE>         160      65       65       65       194.160  128.65
+    <INVERTED EXCLAMATION MARK>  161      170      170      170      194.161  128.66
+    <CENT SIGN>                  162      74       74       176      194.162  128.67   ###
+    <POUND SIGN>                 163      177      177      177      194.163  128.68
+    <CURRENCY SIGN>              164      159      159      159      194.164  128.69
+    <YEN SIGN>                   165      178      178      178      194.165  128.70
+    <BROKEN BAR>                 166      106      106      208      194.166  128.71   ###
+    <SECTION SIGN>               167      181      181      181      194.167  128.72
+    <DIAERESIS>                  168      189      187      121      194.168  128.73   *** ###
+    <COPYRIGHT SIGN>             169      180      180      180      194.169  128.74
+    <FEMININE ORDINAL INDICATOR> 170      154      154      154      194.170  128.81
+    <LEFT POINTING GUILLEMET>    171      138      138      138      194.171  128.82
+    <NOT SIGN>                   172      95       176      186      194.172  128.83   *** ###
+    <SOFT HYPHEN>                173      202      202      202      194.173  128.84
+    <REGISTERED TRADE MARK SIGN> 174      175      175      175      194.174  128.85
+    <MACRON>                     175      188      188      161      194.175  128.86   ###
+    <DEGREE SIGN>                176      144      144      144      194.176  128.87
+    <PLUS-OR-MINUS SIGN>         177      143      143      143      194.177  128.88
+    <SUPERSCRIPT TWO>            178      234      234      234      194.178  128.89
+    <SUPERSCRIPT THREE>          179      250      250      250      194.179  128.98
+    <ACUTE ACCENT>               180      190      190      190      194.180  128.99
+    <MICRO SIGN>                 181      160      160      160      194.181  128.100
+    <PARAGRAPH SIGN>             182      182      182      182      194.182  128.101
+    <MIDDLE DOT>                 183      179      179      179      194.183  128.102
+    <CEDILLA>                    184      157      157      157      194.184  128.103
+    <SUPERSCRIPT ONE>            185      218      218      218      194.185  128.104
+    <MASC. ORDINAL INDICATOR>    186      155      155      155      194.186  128.105
+    <RIGHT POINTING GUILLEMET>   187      139      139      139      194.187  128.106
+    <FRACTION ONE QUARTER>       188      183      183      183      194.188  128.112
+    <FRACTION ONE HALF>          189      184      184      184      194.189  128.113
+    <FRACTION THREE QUARTERS>    190      185      185      185      194.190  128.114
+    <INVERTED QUESTION MARK>     191      171      171      171      194.191  128.115
+    <A WITH GRAVE>               192      100      100      100      195.128  138.65
+    <A WITH ACUTE>               193      101      101      101      195.129  138.66
+    <A WITH CIRCUMFLEX>          194      98       98       98       195.130  138.67
+    <A WITH TILDE>               195      102      102      102      195.131  138.68
+    <A WITH DIAERESIS>           196      99       99       99       195.132  138.69
+    <A WITH RING ABOVE>          197      103      103      103      195.133  138.70
+    <CAPITAL LIGATURE AE>        198      158      158      158      195.134  138.71
+    <C WITH CEDILLA>             199      104      104      104      195.135  138.72
+    <E WITH GRAVE>               200      116      116      116      195.136  138.73
+    <E WITH ACUTE>               201      113      113      113      195.137  138.74
+    <E WITH CIRCUMFLEX>          202      114      114      114      195.138  138.81
+    <E WITH DIAERESIS>           203      115      115      115      195.139  138.82
+    <I WITH GRAVE>               204      120      120      120      195.140  138.83
+    <I WITH ACUTE>               205      117      117      117      195.141  138.84
+    <I WITH CIRCUMFLEX>          206      118      118      118      195.142  138.85
+    <I WITH DIAERESIS>           207      119      119      119      195.143  138.86
+    <CAPITAL LETTER ETH>         208      172      172      172      195.144  138.87
+    <N WITH TILDE>               209      105      105      105      195.145  138.88
+    <O WITH GRAVE>               210      237      237      237      195.146  138.89
+    <O WITH ACUTE>               211      238      238      238      195.147  138.98
+    <O WITH CIRCUMFLEX>          212      235      235      235      195.148  138.99
+    <O WITH TILDE>               213      239      239      239      195.149  138.100
+    <O WITH DIAERESIS>           214      236      236      236      195.150  138.101
+    <MULTIPLICATION SIGN>        215      191      191      191      195.151  138.102
+    <O WITH STROKE>              216      128      128      128      195.152  138.103
+    <U WITH GRAVE>               217      253      253      224      195.153  138.104  ###
+    <U WITH ACUTE>               218      254      254      254      195.154  138.105
+    <U WITH CIRCUMFLEX>          219      251      251      221      195.155  138.106  ###
+    <U WITH DIAERESIS>           220      252      252      252      195.156  138.112
+    <Y WITH ACUTE>               221      173      186      173      195.157  138.113  *** ###
+    <CAPITAL LETTER THORN>       222      174      174      174      195.158  138.114
+    <SMALL LETTER SHARP S>       223      89       89       89       195.159  138.115
+    <a WITH GRAVE>               224      68       68       68       195.160  139.65
+    <a WITH ACUTE>               225      69       69       69       195.161  139.66
+    <a WITH CIRCUMFLEX>          226      66       66       66       195.162  139.67
+    <a WITH TILDE>               227      70       70       70       195.163  139.68
+    <a WITH DIAERESIS>           228      67       67       67       195.164  139.69
+    <a WITH RING ABOVE>          229      71       71       71       195.165  139.70
+    <SMALL LIGATURE ae>          230      156      156      156      195.166  139.71
+    <c WITH CEDILLA>             231      72       72       72       195.167  139.72
+    <e WITH GRAVE>               232      84       84       84       195.168  139.73
+    <e WITH ACUTE>               233      81       81       81       195.169  139.74
+    <e WITH CIRCUMFLEX>          234      82       82       82       195.170  139.81
+    <e WITH DIAERESIS>           235      83       83       83       195.171  139.82
+    <i WITH GRAVE>               236      88       88       88       195.172  139.83
+    <i WITH ACUTE>               237      85       85       85       195.173  139.84
+    <i WITH CIRCUMFLEX>          238      86       86       86       195.174  139.85
+    <i WITH DIAERESIS>           239      87       87       87       195.175  139.86
+    <SMALL LETTER eth>           240      140      140      140      195.176  139.87
+    <n WITH TILDE>               241      73       73       73       195.177  139.88
+    <o WITH GRAVE>               242      205      205      205      195.178  139.89
+    <o WITH ACUTE>               243      206      206      206      195.179  139.98
+    <o WITH CIRCUMFLEX>          244      203      203      203      195.180  139.99
+    <o WITH TILDE>               245      207      207      207      195.181  139.100
+    <o WITH DIAERESIS>           246      204      204      204      195.182  139.101
+    <DIVISION SIGN>              247      225      225      225      195.183  139.102
+    <o WITH STROKE>              248      112      112      112      195.184  139.103
+    <u WITH GRAVE>               249      221      221      192      195.185  139.104  ###
+    <u WITH ACUTE>               250      222      222      222      195.186  139.105
+    <u WITH CIRCUMFLEX>          251      219      219      219      195.187  139.106
+    <u WITH DIAERESIS>           252      220      220      220      195.188  139.112
+    <y WITH ACUTE>               253      141      141      141      195.189  139.113
+    <SMALL LETTER thorn>         254      142      142      142      195.190  139.114
+    <y WITH DIAERESIS>           255      223      223      223      195.191  139.115
+
+If you would rather see the above table in CCSID 0037 order rather than
+ASCII + Latin-1 order then run the table through:
+
+=over 4
+
+=item recipe 4
+
+=back
+
+    perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+     -e '{push(@l,$_)}' \
+     -e 'END{print map{$_->[0]}' \
+     -e '          sort{$a->[1] <=> $b->[1]}' \
+     -e '          map{[$_,substr($_,42,3)]}@l;}' perlebcdic.pod
+
+If you would rather see it in CCSID 1047 order then change the digit
+42 in the last line to 51, like this:
+
+=over 4
+
+=item recipe 5
+
+=back
+
+    perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+     -e '{push(@l,$_)}' \
+     -e 'END{print map{$_->[0]}' \
+     -e '          sort{$a->[1] <=> $b->[1]}' \
+     -e '          map{[$_,substr($_,51,3)]}@l;}' perlebcdic.pod
+
+If you would rather see it in POSIX-BC order then change the digit
+51 in the last line to 60, like this:
+
+=over 4
+
+=item recipe 6
+
+=back
+
+    perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+     -e '{push(@l,$_)}' \
+     -e 'END{print map{$_->[0]}' \
+     -e '          sort{$a->[1] <=> $b->[1]}' \
+     -e '          map{[$_,substr($_,60,3)]}@l;}' perlebcdic.pod
+
+
+=head1 IDENTIFYING CHARACTER CODE SETS
+
+To determine the character set you are running under from perl one 
+could use the return value of ord() or chr() to test one or more 
+character values.  For example:
+
+    $is_ascii  = "A" eq chr(65);
+    $is_ebcdic = "A" eq chr(193);
+
+Also, "\t" is a C<HORIZONTAL TABULATION> character so that:
+
+    $is_ascii  = ord("\t") == 9;
+    $is_ebcdic = ord("\t") == 5;
+
+To distinguish EBCDIC code pages try looking at one or more of
+the characters that differ between them.  For example:
+
+    $is_ebcdic_37   = "\n" eq chr(37);
+    $is_ebcdic_1047 = "\n" eq chr(21);
+
+Or better still choose a character that is uniquely encoded in any
+of the code sets, e.g.:
+
+    $is_ascii           = ord('[') == 91;
+    $is_ebcdic_37       = ord('[') == 186;
+    $is_ebcdic_1047     = ord('[') == 173;
+    $is_ebcdic_POSIX_BC = ord('[') == 187;
+
+However, it would be unwise to write tests such as:
+
+    $is_ascii = "\r" ne chr(13);  #  WRONG
+    $is_ascii = "\n" ne chr(10);  #  ILL ADVISED
+
+Obviously the first of these will fail to distinguish most ASCII machines
+from either a CCSID 0037, a 1047, or a POSIX-BC EBCDIC machine since "\r" eq 
+chr(13) under all of those coded character sets.  But note too that 
+because "\n" is chr(13) and "\r" is chr(10) on the MacIntosh (which is an 
+ASCII machine) the second C<$is_ascii> test will lead to trouble there.
+
+To determine whether or not perl was built under an EBCDIC 
+code page you can use the Config module like so:
+
+    use Config;
+    $is_ebcdic = $Config{'ebcdic'} eq 'define';
+
+=head1 CONVERSIONS
+
+=head2 tr///
+
+In order to convert a string of characters from one character set to 
+another a simple list of numbers, such as in the right columns in the
+above table, along with perl's tr/// operator is all that is needed.  
+The data in the table are in ASCII order hence the EBCDIC columns 
+provide easy to use ASCII to EBCDIC operations that are also easily 
+reversed.
+
+For example, to convert ASCII to code page 037 take the output of the second 
+column from the output of recipe 0 (modified to add \\ characters) and use 
+it in tr/// like so:
+
+    $cp_037 = 
+    '\000\001\002\003\234\011\206\177\227\215\216\013\014\015\016\017' .
+    '\020\021\022\023\235\205\010\207\030\031\222\217\034\035\036\037' .
+    '\200\201\202\203\204\012\027\033\210\211\212\213\214\005\006\007' .
+    '\220\221\026\223\224\225\226\004\230\231\232\233\024\025\236\032' .
+    '\040\240\342\344\340\341\343\345\347\361\242\056\074\050\053\174' .
+    '\046\351\352\353\350\355\356\357\354\337\041\044\052\051\073\254' .
+    '\055\057\302\304\300\301\303\305\307\321\246\054\045\137\076\077' .
+    '\370\311\312\313\310\315\316\317\314\140\072\043\100\047\075\042' .
+    '\330\141\142\143\144\145\146\147\150\151\253\273\360\375\376\261' .
+    '\260\152\153\154\155\156\157\160\161\162\252\272\346\270\306\244' .
+    '\265\176\163\164\165\166\167\170\171\172\241\277\320\335\336\256' .
+    '\136\243\245\267\251\247\266\274\275\276\133\135\257\250\264\327' .
+    '\173\101\102\103\104\105\106\107\110\111\255\364\366\362\363\365' .
+    '\175\112\113\114\115\116\117\120\121\122\271\373\374\371\372\377' .
+    '\134\367\123\124\125\126\127\130\131\132\262\324\326\322\323\325' .
+    '\060\061\062\063\064\065\066\067\070\071\263\333\334\331\332\237' ;
+
+    my $ebcdic_string = $ascii_string;
+    eval '$ebcdic_string =~ tr/' . $cp_037 . '/\000-\377/';
+
+To convert from EBCDIC 037 to ASCII just reverse the order of the tr/// 
+arguments like so:
+
+    my $ascii_string = $ebcdic_string;
+    eval '$ascii_string =~ tr/\000-\377/' . $cp_037 . '/';
+
+Similarly one could take the output of the third column from recipe 0 to
+obtain a C<$cp_1047> table.  The fourth column of the output from recipe
+0 could provide a C<$cp_posix_bc> table suitable for transcoding as well.
+
+=head2 iconv
+
+XPG operability often implies the presence of an I<iconv> utility
+available from the shell or from the C library.  Consult your system's
+documentation for information on iconv.
+
+On OS/390 or z/OS see the iconv(1) manpage.  One way to invoke the iconv 
+shell utility from within perl would be to:
+
+    # OS/390 or z/OS example
+    $ascii_data = `echo '$ebcdic_data'| iconv -f IBM-1047 -t ISO8859-1`
+
+or the inverse map:
+
+    # OS/390 or z/OS example
+    $ebcdic_data = `echo '$ascii_data'| iconv -f ISO8859-1 -t IBM-1047`
+
+For other perl based conversion options see the Convert::* modules on CPAN.
+
+=head2 C RTL
+
+The OS/390 and z/OS C run time libraries provide _atoe() and _etoa() functions.
+
+=head1 OPERATOR DIFFERENCES
+
+The C<..> range operator treats certain character ranges with 
+care on EBCDIC machines.  For example the following array
+will have twenty six elements on either an EBCDIC machine
+or an ASCII machine:
+
+    @alphabet = ('A'..'Z');   #  $#alphabet == 25
+
+The bitwise operators such as & ^ | may return different results
+when operating on string or character data in a perl program running 
+on an EBCDIC machine than when run on an ASCII machine.  Here is
+an example adapted from the one in L<perlop>:
+
+    # EBCDIC-based examples
+    print "j p \n" ^ " a h";                      # prints "JAPH\n"
+    print "JA" | "  ph\n";                        # prints "japh\n" 
+    print "JAPH\nJunk" & "\277\277\277\277\277";  # prints "japh\n";
+    print 'p N$' ^ " E<H\n";                      # prints "Perl\n";
+
+An interesting property of the 32 C0 control characters
+in the ASCII table is that they can "literally" be constructed
+as control characters in perl, e.g. C<(chr(0) eq "\c@")> 
+C<(chr(1) eq "\cA")>, and so on.  Perl on EBCDIC machines has been 
+ported to take "\c@" to chr(0) and "\cA" to chr(1) as well, but the
+thirty three characters that result depend on which code page you are
+using.  The table below uses the character names from the previous table 
+but with substitutions such as s/START OF/S.O./; s/END OF /E.O./; 
+s/TRANSMISSION/TRANS./; s/TABULATION/TAB./; s/VERTICAL/VERT./; 
+s/HORIZONTAL/HORIZ./; s/DEVICE CONTROL/D.C./; s/SEPARATOR/SEP./; 
+s/NEGATIVE ACKNOWLEDGE/NEG. ACK./;.  The POSIX-BC and 1047 sets are
+identical throughout this range and differ from the 0037 set at only 
+one spot (21 decimal).  Note that the C<LINE FEED> character
+may be generated by "\cJ" on ASCII machines but by "\cU" on 1047 or POSIX-BC 
+machines and cannot be generated as a C<"\c.letter."> control character on 
+0037 machines.  Note also that "\c\\" maps to two characters
+not one.
+
+    chr   ord  8859-1               0037                1047 && POSIX-BC     
+    ------------------------------------------------------------------------
+    "\c?" 127  <DELETE>             "                   "              ***><
+    "\c@"   0  <NULL>               <NULL>              <NULL>         ***><
+    "\cA"   1  <S.O. HEADING>       <S.O. HEADING>      <S.O. HEADING> 
+    "\cB"   2  <S.O. TEXT>          <S.O. TEXT>         <S.O. TEXT>
+    "\cC"   3  <E.O. TEXT>          <E.O. TEXT>         <E.O. TEXT>
+    "\cD"   4  <E.O. TRANS.>        <C1 28>             <C1 28> 
+    "\cE"   5  <ENQUIRY>            <HORIZ. TAB.>       <HORIZ. TAB.>    
+    "\cF"   6  <ACKNOWLEDGE>        <C1 6>              <C1 6>   
+    "\cG"   7  <BELL>               <DELETE>            <DELETE>   
+    "\cH"   8  <BACKSPACE>          <C1 23>             <C1 23>
+    "\cI"   9  <HORIZ. TAB.>        <C1 13>             <C1 13>
+    "\cJ"  10  <LINE FEED>          <C1 14>             <C1 14>
+    "\cK"  11  <VERT. TAB.>         <VERT. TAB.>        <VERT. TAB.>
+    "\cL"  12  <FORM FEED>          <FORM FEED>         <FORM FEED>    
+    "\cM"  13  <CARRIAGE RETURN>    <CARRIAGE RETURN>   <CARRIAGE RETURN> 
+    "\cN"  14  <SHIFT OUT>          <SHIFT OUT>         <SHIFT OUT>
+    "\cO"  15  <SHIFT IN>           <SHIFT IN>          <SHIFT IN>
+    "\cP"  16  <DATA LINK ESCAPE>   <DATA LINK ESCAPE>  <DATA LINK ESCAPE> 
+    "\cQ"  17  <D.C. ONE>           <D.C. ONE>          <D.C. ONE>
+    "\cR"  18  <D.C. TWO>           <D.C. TWO>          <D.C. TWO>
+    "\cS"  19  <D.C. THREE>         <D.C. THREE>        <D.C. THREE> 
+    "\cT"  20  <D.C. FOUR>          <C1 29>             <C1 29> 
+    "\cU"  21  <NEG. ACK.>          <C1 5>              <LINE FEED>    ***
+    "\cV"  22  <SYNCHRONOUS IDLE>   <BACKSPACE>         <BACKSPACE>
+    "\cW"  23  <E.O. TRANS. BLOCK>  <C1 7>              <C1 7>
+    "\cX"  24  <CANCEL>             <CANCEL>            <CANCEL>
+    "\cY"  25  <E.O. MEDIUM>        <E.O. MEDIUM>       <E.O. MEDIUM>
+    "\cZ"  26  <SUBSTITUTE>         <C1 18>             <C1 18>
+    "\c["  27  <ESCAPE>             <C1 15>             <C1 15>
+    "\c\\" 28  <FILE SEP.>\         <FILE SEP.>\        <FILE SEP.>\
+    "\c]"  29  <GROUP SEP.>         <GROUP SEP.>        <GROUP SEP.>
+    "\c^"  30  <RECORD SEP.>        <RECORD SEP.>       <RECORD SEP.>  ***><
+    "\c_"  31  <UNIT SEP.>          <UNIT SEP.>         <UNIT SEP.>    ***><
+
+
+=head1 FUNCTION DIFFERENCES
+
+=over 8
+
+=item chr()
+
+chr() must be given an EBCDIC code number argument to yield a desired 
+character return value on an EBCDIC machine.  For example:
+
+    $CAPITAL_LETTER_A = chr(193);
+
+=item ord()
+
+ord() will return EBCDIC code number values on an EBCDIC machine.
+For example:
+
+    $the_number_193 = ord("A");
+
+=item pack()
+
+The c and C templates for pack() are dependent upon character set 
+encoding.  Examples of usage on EBCDIC include:
+
+    $foo = pack("CCCC",193,194,195,196);
+    # $foo eq "ABCD"
+    $foo = pack("C4",193,194,195,196);
+    # same thing
+
+    $foo = pack("ccxxcc",193,194,195,196);
+    # $foo eq "AB\0\0CD"
+
+=item print()
+
+One must be careful with scalars and strings that are passed to
+print that contain ASCII encodings.  One common place
+for this to occur is in the output of the MIME type header for
+CGI script writing.  For example, many perl programming guides 
+recommend something similar to:
+
+    print "Content-type:\ttext/html\015\012\015\012"; 
+    # this may be wrong on EBCDIC
+
+Under the IBM OS/390 USS Web Server or WebSphere on z/OS for example 
+you should instead write that as:
+
+    print "Content-type:\ttext/html\r\n\r\n"; # OK for DGW et alia
+
+That is because the translation from EBCDIC to ASCII is done
+by the web server in this case (such code will not be appropriate for
+the Macintosh however).  Consult your web server's documentation for 
+further details.
+
+=item printf()
+
+The formats that can convert characters to numbers and vice versa
+will be different from their ASCII counterparts when executed
+on an EBCDIC machine.  Examples include:
+
+    printf("%c%c%c",193,194,195);  # prints ABC
+
+=item sort()
+
+EBCDIC sort results may differ from ASCII sort results especially for 
+mixed case strings.  This is discussed in more detail below.
+
+=item sprintf()
+
+See the discussion of printf() above.  An example of the use
+of sprintf would be:
+
+    $CAPITAL_LETTER_A = sprintf("%c",193);
+
+=item unpack()
+
+See the discussion of pack() above.
+
+=back
+
+=head1 REGULAR EXPRESSION DIFFERENCES
+
+As of perl 5.005_03 the letter range regular expression such as 
+[A-Z] and [a-z] have been especially coded to not pick up gap 
+characters.  For example, characters such as E<ocirc> C<o WITH CIRCUMFLEX> 
+that lie between I and J would not be matched by the 
+regular expression range C</[H-K]/>.  This works in
+the other direction, too, if either of the range end points is
+explicitly numeric: C<[\x89-\x91]> will match C<\x8e>, even
+though C<\x89> is C<i> and C<\x91 > is C<j>, and C<\x8e>
+is a gap character from the alphabetic viewpoint.
+
+If you do want to match the alphabet gap characters in a single octet 
+regular expression try matching the hex or octal code such 
+as C</\313/> on EBCDIC or C</\364/> on ASCII machines to 
+have your regular expression match C<o WITH CIRCUMFLEX>.
+
+Another construct to be wary of is the inappropriate use of hex or
+octal constants in regular expressions.  Consider the following
+set of subs:
+
+    sub is_c0 {
+        my $char = substr(shift,0,1);
+        $char =~ /[\000-\037]/;
+    }
+
+    sub is_print_ascii {
+        my $char = substr(shift,0,1);
+        $char =~ /[\040-\176]/;
+    }
+
+    sub is_delete {
+        my $char = substr(shift,0,1);
+        $char eq "\177";
+    }
+
+    sub is_c1 {
+        my $char = substr(shift,0,1);
+        $char =~ /[\200-\237]/;
+    }
+
+    sub is_latin_1 {
+        my $char = substr(shift,0,1);
+        $char =~ /[\240-\377]/;
+    }
+
+The above would be adequate if the concern was only with numeric code points.
+However, the concern may be with characters rather than code points 
+and on an EBCDIC machine it may be desirable for constructs such as 
+C<if (is_print_ascii("A")) {print "A is a printable character\n";}> to print
+out the expected message.  One way to represent the above collection
+of character classification subs that is capable of working across the
+four coded character sets discussed in this document is as follows:
+
+    sub Is_c0 {
+        my $char = substr(shift,0,1);
+        if (ord('^')==94)  { # ascii
+            return $char =~ /[\000-\037]/;
+        } 
+        if (ord('^')==176) { # 37
+            return $char =~ /[\000-\003\067\055-\057\026\005\045\013-\023\074\075\062\046\030\031\077\047\034-\037]/;
+        }
+        if (ord('^')==95 || ord('^')==106) { # 1047 || posix-bc
+            return $char =~ /[\000-\003\067\055-\057\026\005\025\013-\023\074\075\062\046\030\031\077\047\034-\037]/;
+        }
+    }
+
+    sub Is_print_ascii {
+        my $char = substr(shift,0,1);
+        $char =~ /[ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~]/;
+    }
+
+    sub Is_delete {
+        my $char = substr(shift,0,1);
+        if (ord('^')==94)  { # ascii
+            return $char eq "\177";
+        }
+        else  {              # ebcdic
+            return $char eq "\007";
+        }
+    }
+
+    sub Is_c1 {
+        my $char = substr(shift,0,1);
+        if (ord('^')==94)  { # ascii
+            return $char =~ /[\200-\237]/;
+        }
+        if (ord('^')==176) { # 37
+            return $char =~ /[\040-\044\025\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\377]/;
+        }
+        if (ord('^')==95)  { # 1047
+            return $char =~ /[\040-\045\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\377]/;
+        }
+        if (ord('^')==106) { # posix-bc
+            return $char =~ 
+              /[\040-\045\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\137]/;
+        }
+    }
+
+    sub Is_latin_1 {
+        my $char = substr(shift,0,1);
+        if (ord('^')==94)  { # ascii
+            return $char =~ /[\240-\377]/;
+        }
+        if (ord('^')==176) { # 37
+            return $char =~ 
+              /[\101\252\112\261\237\262\152\265\275\264\232\212\137\312\257\274\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\375\376\373\374\255\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\335\336\333\334\215\216\337]/;
+        }
+        if (ord('^')==95)  { # 1047
+            return $char =~
+              /[\101\252\112\261\237\262\152\265\273\264\232\212\260\312\257\274\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\375\376\373\374\272\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\335\336\333\334\215\216\337]/; 
+        }
+        if (ord('^')==106) { # posix-bc
+            return $char =~ 
+              /[\101\252\260\261\237\262\320\265\171\264\232\212\272\312\257\241\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\340\376\335\374\255\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\300\336\333\334\215\216\337]/;
+        }
+    }
+
+Note however that only the C<Is_ascii_print()> sub is really independent 
+of coded character set.  Another way to write C<Is_latin_1()> would be 
+to use the characters in the range explicitly:
+
+    sub Is_latin_1 {
+        my $char = substr(shift,0,1);
+        $char =~ /[ ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ]/;
+    }
+
+Although that form may run into trouble in network transit (due to the 
+presence of 8 bit characters) or on non ISO-Latin character sets.
+
+=head1 SOCKETS
+
+Most socket programming assumes ASCII character encodings in network
+byte order.  Exceptions can include CGI script writing under a
+host web server where the server may take care of translation for you.
+Most host web servers convert EBCDIC data to ISO-8859-1 or Unicode on
+output.
+
+=head1 SORTING
+
+One big difference between ASCII based character sets and EBCDIC ones
+are the relative positions of upper and lower case letters and the
+letters compared to the digits.  If sorted on an ASCII based machine the
+two letter abbreviation for a physician comes before the two letter
+for drive, that is:
+
+    @sorted = sort(qw(Dr. dr.));  # @sorted holds ('Dr.','dr.') on ASCII,
+                                  # but ('dr.','Dr.') on EBCDIC
+
+The property of lower case before uppercase letters in EBCDIC is
+even carried to the Latin 1 EBCDIC pages such as 0037 and 1047.
+An example would be that E<Euml> C<E WITH DIAERESIS> (203) comes 
+before E<euml> C<e WITH DIAERESIS> (235) on an ASCII machine, but 
+the latter (83) comes before the former (115) on an EBCDIC machine.  
+(Astute readers will note that the upper case version of E<szlig> 
+C<SMALL LETTER SHARP S> is simply "SS" and that the upper case version of 
+E<yuml> C<y WITH DIAERESIS> is not in the 0..255 range but it is 
+at U+x0178 in Unicode, or C<"\x{178}"> in a Unicode enabled Perl).
+
+The sort order will cause differences between results obtained on
+ASCII machines versus EBCDIC machines.  What follows are some suggestions
+on how to deal with these differences.
+
+=head2 Ignore ASCII vs. EBCDIC sort differences.
+
+This is the least computationally expensive strategy.  It may require
+some user education.
+
+=head2 MONO CASE then sort data.
+
+In order to minimize the expense of mono casing mixed test try to
+C<tr///> towards the character set case most employed within the data.
+If the data are primarily UPPERCASE non Latin 1 then apply tr/[a-z]/[A-Z]/
+then sort().  If the data are primarily lowercase non Latin 1 then
+apply tr/[A-Z]/[a-z]/ before sorting.  If the data are primarily UPPERCASE
+and include Latin-1 characters then apply:  
+
+    tr/[a-z]/[A-Z]/; 
+    tr/[àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ]/[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]/;
+    s/ß/SS/g; 
+
+then sort().  Do note however that such Latin-1 manipulation does not 
+address the E<yuml> C<y WITH DIAERESIS> character that will remain at 
+code point 255 on ASCII machines, but 223 on most EBCDIC machines 
+where it will sort to a place less than the EBCDIC numerals.  With a 
+Unicode enabled Perl you might try:
+
+    tr/^?/\x{178}/;
+
+The strategy of mono casing data before sorting does not preserve the case 
+of the data and may not be acceptable for that reason.
+
+=head2 Convert, sort data, then re convert.
+
+This is the most expensive proposition that does not employ a network
+connection.
+
+=head2 Perform sorting on one type of machine only.
+
+This strategy can employ a network connection.  As such
+it would be computationally expensive.
+
+=head1 TRANSFORMATION FORMATS
+
+There are a variety of ways of transforming data with an intra character set 
+mapping that serve a variety of purposes.  Sorting was discussed in the 
+previous section and a few of the other more popular mapping techniques are 
+discussed next.
+
+=head2 URL decoding and encoding
+
+Note that some URLs have hexadecimal ASCII code points in them in an
+attempt to overcome character or protocol limitation issues.  For example 
+the tilde character is not on every keyboard hence a URL of the form:
+
+    http://www.pvhp.com/~pvhp/
+
+may also be expressed as either of:
+
+    http://www.pvhp.com/%7Epvhp/
+
+    http://www.pvhp.com/%7epvhp/
+
+where 7E is the hexadecimal ASCII code point for '~'.  Here is an example
+of decoding such a URL under CCSID 1047:
+
+    $url = 'http://www.pvhp.com/%7Epvhp/';
+    # this array assumes code page 1047
+    my @a2e_1047 = (
+          0,  1,  2,  3, 55, 45, 46, 47, 22,  5, 21, 11, 12, 13, 14, 15,
+         16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31,
+         64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97,
+        240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111,
+        124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214,
+        215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109,
+        121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150,
+        151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161,  7,
+         32, 33, 34, 35, 36, 37,  6, 23, 40, 41, 42, 43, 44,  9, 10, 27,
+         48, 49, 26, 51, 52, 53, 54,  8, 56, 57, 58, 59,  4, 20, 62,255,
+         65,170, 74,177,159,178,106,181,187,180,154,138,176,202,175,188,
+        144,143,234,250,190,160,182,179,157,218,155,139,183,184,185,171,
+        100,101, 98,102, 99,103,158,104,116,113,114,115,120,117,118,119,
+        172,105,237,238,235,239,236,191,128,253,254,251,252,186,174, 89,
+         68, 69, 66, 70, 67, 71,156, 72, 84, 81, 82, 83, 88, 85, 86, 87,
+        140, 73,205,206,203,207,204,225,112,221,222,219,220,141,142,223
+    );
+    $url =~ s/%([0-9a-fA-F]{2})/pack("c",$a2e_1047[hex($1)])/ge;
+
+Conversely, here is a partial solution for the task of encoding such 
+a URL under the 1047 code page:
+
+    $url = 'http://www.pvhp.com/~pvhp/';
+    # this array assumes code page 1047
+    my @e2a_1047 = (
+          0,  1,  2,  3,156,  9,134,127,151,141,142, 11, 12, 13, 14, 15,
+         16, 17, 18, 19,157, 10,  8,135, 24, 25,146,143, 28, 29, 30, 31,
+        128,129,130,131,132,133, 23, 27,136,137,138,139,140,  5,  6,  7,
+        144,145, 22,147,148,149,150,  4,152,153,154,155, 20, 21,158, 26,
+         32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124,
+         38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94,
+         45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63,
+        248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34,
+        216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177,
+        176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164,
+        181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174,
+        172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215,
+        123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245,
+        125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255,
+         92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213,
+         48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159
+    );
+    # The following regular expression does not address the 
+    # mappings for: ('.' => '%2E', '/' => '%2F', ':' => '%3A') 
+    $url =~ s/([\t "#%&\(\),;<=>\?\@\[\\\]^`{|}~])/sprintf("%%%02X",$e2a_1047[ord($1)])/ge;
+
+where a more complete solution would split the URL into components 
+and apply a full s/// substitution only to the appropriate parts.
+
+In the remaining examples a @e2a or @a2e array may be employed
+but the assignment will not be shown explicitly.  For code page 1047
+you could use the @a2e_1047 or @e2a_1047 arrays just shown.
+
+=head2 uu encoding and decoding
+
+The C<u> template to pack() or unpack() will render EBCDIC data in EBCDIC 
+characters equivalent to their ASCII counterparts.  For example, the 
+following will print "Yes indeed\n" on either an ASCII or EBCDIC computer:
+
+    $all_byte_chrs = '';
+    for (0..255) { $all_byte_chrs .= chr($_); }
+    $uuencode_byte_chrs = pack('u', $all_byte_chrs);
+    ($uu = <<'ENDOFHEREDOC') =~ s/^\s*//gm;
+    M``$"`P0%!@<("0H+#`T.#Q`1$A,4%187&!D:&QP='A\@(2(C)"4F)R@I*BLL
+    M+2XO,#$R,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-3D]045)35%565UA9
+    M6EM<75Y?8&%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ>WQ]?G^`@8*#A(6&
+    MAXB)BHN,C8Z/D)&2DY25EI>8F9J;G)V>GZ"AHJ.DI::GJ*FJJZRMKJ^PL;*S
+    MM+6VM[BYNKN\O;Z_P,'"P\3%QL?(R<K+S,W.S]#1TM/4U=;7V-G:V]S=WM_@
+    ?X>+CY.7FY^CIZNOL[>[O\/'R\_3U]O?X^?K[_/W^_P``
+    ENDOFHEREDOC
+    if ($uuencode_byte_chrs eq $uu) {
+        print "Yes ";
+    }
+    $uudecode_byte_chrs = unpack('u', $uuencode_byte_chrs);
+    if ($uudecode_byte_chrs eq $all_byte_chrs) {
+        print "indeed\n";
+    }
+
+Here is a very spartan uudecoder that will work on EBCDIC provided
+that the @e2a array is filled in appropriately:
+
+    #!/usr/local/bin/perl
+    @e2a = ( # this must be filled in
+           );
+    $_ = <> until ($mode,$file) = /^begin\s*(\d*)\s*(\S*)/;
+    open(OUT, "> $file") if $file ne "";
+    while(<>) {
+        last if /^end/;
+        next if /[a-z]/;
+        next unless int(((($e2a[ord()] - 32 ) & 077) + 2) / 3) ==
+            int(length() / 4);
+        print OUT unpack("u", $_);
+    }
+    close(OUT);
+    chmod oct($mode), $file;
+
+
+=head2 Quoted-Printable encoding and decoding
+
+On ASCII encoded machines it is possible to strip characters outside of
+the printable set using:
+
+    # This QP encoder works on ASCII only
+    $qp_string =~ s/([=\x00-\x1F\x80-\xFF])/sprintf("=%02X",ord($1))/ge;
+
+Whereas a QP encoder that works on both ASCII and EBCDIC machines 
+would look somewhat like the following (where the EBCDIC branch @e2a 
+array is omitted for brevity):
+
+    if (ord('A') == 65) {    # ASCII
+        $delete = "\x7F";    # ASCII
+        @e2a = (0 .. 255)    # ASCII to ASCII identity map
+    }
+    else {                   # EBCDIC
+        $delete = "\x07";    # EBCDIC
+        @e2a =               # EBCDIC to ASCII map (as shown above)
+    }
+    $qp_string =~
+      s/([^ !"\#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~$delete])/sprintf("=%02X",$e2a[ord($1)])/ge;
+
+(although in production code the substitutions might be done
+in the EBCDIC branch with the @e2a array and separately in the 
+ASCII branch without the expense of the identity map).
+
+Such QP strings can be decoded with:
+
+    # This QP decoder is limited to ASCII only
+    $string =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr hex $1/ge;
+    $string =~ s/=[\n\r]+$//;
+
+Whereas a QP decoder that works on both ASCII and EBCDIC machines 
+would look somewhat like the following (where the @a2e array is
+omitted for brevity):
+
+    $string =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr $a2e[hex $1]/ge;
+    $string =~ s/=[\n\r]+$//;
+
+=head2 Caesarian ciphers
+
+The practice of shifting an alphabet one or more characters for encipherment
+dates back thousands of years and was explicitly detailed by Gaius Julius
+Caesar in his B<Gallic Wars> text.  A single alphabet shift is sometimes 
+referred to as a rotation and the shift amount is given as a number $n after
+the string 'rot' or "rot$n".  Rot0 and rot26 would designate identity maps 
+on the 26 letter English version of the Latin alphabet.  Rot13 has the 
+interesting property that alternate subsequent invocations are identity maps 
+(thus rot13 is its own non-trivial inverse in the group of 26 alphabet 
+rotations).  Hence the following is a rot13 encoder and decoder that will 
+work on ASCII and EBCDIC machines:
+
+    #!/usr/local/bin/perl
+
+    while(<>){
+        tr/n-za-mN-ZA-M/a-zA-Z/;
+        print;
+    }
+
+In one-liner form:
+
+    perl -ne 'tr/n-za-mN-ZA-M/a-zA-Z/;print'
+
+
+=head1 Hashing order and checksums
+
+To the extent that it is possible to write code that depends on 
+hashing order there may be differences between hashes as stored
+on an ASCII based machine and hashes stored on an EBCDIC based machine.
+XXX
+
+=head1 I18N AND L10N
+
+Internationalization(I18N) and localization(L10N) are supported at least 
+in principle even on EBCDIC machines.  The details are system dependent 
+and discussed under the L<perlebcdic/OS ISSUES> section below.
+
+=head1 MULTI OCTET CHARACTER SETS
+
+Perl may work with an internal UTF-EBCDIC encoding form for wide characters 
+on EBCDIC platforms in a manner analogous to the way that it works with 
+the UTF-8 internal encoding form on ASCII based platforms.
+
+Legacy multi byte EBCDIC code pages XXX.
+
+=head1 OS ISSUES
+
+There may be a few system dependent issues 
+of concern to EBCDIC Perl programmers.
+
+=head2 OS/400
+
+=over 8
+
+=item PASE
+
+The PASE environment is runtime environment for OS/400 that can run
+executables built for PowerPC AIX in OS/400, see L<perlos400>.  PASE
+is ASCII-based, not EBCDIC-based as the ILE.
+
+=item IFS access
+
+XXX.
+
+=back
+
+=head2 OS/390, z/OS
+
+Perl runs under Unix Systems Services or USS.
+
+=over 8
+
+=item chcp
+
+B<chcp> is supported as a shell utility for displaying and changing 
+one's code page.  See also L<chcp>.
+
+=item dataset access
+
+For sequential data set access try:
+
+    my @ds_records = `cat //DSNAME`;
+
+or:
+
+    my @ds_records = `cat //'HLQ.DSNAME'`;
+
+See also the OS390::Stdio module on CPAN.
+
+=item OS/390, z/OS iconv
+
+B<iconv> is supported as both a shell utility and a C RTL routine.
+See also the iconv(1) and iconv(3) manual pages.
+
+=item locales
+
+On OS/390 or z/OS see L<locale> for information on locales.  The L10N files
+are in F</usr/nls/locale>.  $Config{d_setlocale} is 'define' on OS/390
+or z/OS.
+
+=back
+
+=head2 VM/ESA?
+
+XXX.
+
+=head2 POSIX-BC?
+
+XXX.
+
+=head1 BUGS
+
+This pod document contains literal Latin 1 characters and may encounter 
+translation difficulties.  In particular one popular nroff implementation 
+was known to strip accented characters to their unaccented counterparts 
+while attempting to view this document through the B<pod2man> program 
+(for example, you may see a plain C<y> rather than one with a diaeresis 
+as in E<yuml>).  Another nroff truncated the resultant manpage at
+the first occurrence of 8 bit characters.
+
+Not all shells will allow multiple C<-e> string arguments to perl to
+be concatenated together properly as recipes 0, 2, 4, 5, and 6 might 
+seem to imply.
+
+=head1 SEE ALSO
+
+L<perllocale>, L<perlfunc>, L<perlunicode>, L<utf8>.
+
+=head1 REFERENCES
+
+http://anubis.dkuug.dk/i18n/charmaps
+
+http://www.unicode.org/
+
+http://www.unicode.org/unicode/reports/tr16/
+
+http://www.wps.com/texts/codes/
+B<ASCII: American Standard Code for Information Infiltration> Tom Jennings,
+September 1999.
+
+B<The Unicode Standard, Version 3.0> The Unicode Consortium, Lisa Moore ed., 
+ISBN 0-201-61633-5, Addison Wesley Developers Press, February 2000. 
+
+B<CDRA: IBM - Character Data Representation Architecture - 
+Reference and Registry>, IBM SC09-2190-00, December 1996. 
+
+"Demystifying Character Sets", Andrea Vine, Multilingual Computing 
+& Technology, B<#26 Vol. 10 Issue 4>, August/September 1999;
+ISSN 1523-0309; Multilingual Computing Inc. Sandpoint ID, USA.
+
+B<Codes, Ciphers, and Other Cryptic and Clandestine Communication>
+Fred B. Wrixon, ISBN 1-57912-040-7, Black Dog & Leventhal Publishers,
+1998.
+
+http://www.bobbemer.com/P-BIT.HTM
+B<IBM - EBCDIC and the P-bit; The biggest Computer Goof Ever> Robert Bemer.
+
+=head1 HISTORY
+
+15 April 2001: added UTF-8 and UTF-EBCDIC to main table, pvhp.
+
+=head1 AUTHOR
+
+Peter Prymmer pvhp@best.com wrote this in 1999 and 2000 
+with CCSID 0819 and 0037 help from Chris Leach and 
+AndrE<eacute> Pirard A.Pirard@ulg.ac.be as well as POSIX-BC 
+help from Thomas Dorner Thomas.Dorner@start.de.
+Thanks also to Vickie Cooper, Philip Newton, William Raffloer, and 
+Joe Smith.  Trademarks, registered trademarks, service marks and 
+registered service marks used in this document are the property of 
+their respective owners.
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlembed.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlembed.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlembed.pod	(revision 14489)
@@ -0,0 +1,1140 @@
+=head1 NAME
+
+perlembed - how to embed perl in your C program
+
+=head1 DESCRIPTION
+
+=head2 PREAMBLE
+
+Do you want to:
+
+=over 5
+
+=item B<Use C from Perl?>
+
+Read L<perlxstut>, L<perlxs>, L<h2xs>, L<perlguts>, and L<perlapi>.
+
+=item B<Use a Unix program from Perl?>
+
+Read about back-quotes and about C<system> and C<exec> in L<perlfunc>.
+
+=item B<Use Perl from Perl?>
+
+Read about L<perlfunc/do> and L<perlfunc/eval> and L<perlfunc/require> 
+and L<perlfunc/use>.
+
+=item B<Use C from C?>
+
+Rethink your design.
+
+=item B<Use Perl from C?>
+
+Read on...
+
+=back
+
+=head2 ROADMAP
+
+=over 5
+
+=item *
+
+Compiling your C program
+
+=item *
+
+Adding a Perl interpreter to your C program
+
+=item *
+
+Calling a Perl subroutine from your C program
+
+=item *
+
+Evaluating a Perl statement from your C program
+
+=item *
+
+Performing Perl pattern matches and substitutions from your C program
+
+=item *
+
+Fiddling with the Perl stack from your C program
+
+=item *
+
+Maintaining a persistent interpreter
+
+=item *
+
+Maintaining multiple interpreter instances
+
+=item *
+
+Using Perl modules, which themselves use C libraries, from your C program
+
+=item *
+
+Embedding Perl under Win32
+
+=back 
+
+=head2 Compiling your C program
+
+If you have trouble compiling the scripts in this documentation,
+you're not alone.  The cardinal rule: COMPILE THE PROGRAMS IN EXACTLY
+THE SAME WAY THAT YOUR PERL WAS COMPILED.  (Sorry for yelling.)
+
+Also, every C program that uses Perl must link in the I<perl library>.
+What's that, you ask?  Perl is itself written in C; the perl library
+is the collection of compiled C programs that were used to create your
+perl executable (I</usr/bin/perl> or equivalent).  (Corollary: you
+can't use Perl from your C program unless Perl has been compiled on
+your machine, or installed properly--that's why you shouldn't blithely
+copy Perl executables from machine to machine without also copying the
+I<lib> directory.)
+
+When you use Perl from C, your C program will--usually--allocate,
+"run", and deallocate a I<PerlInterpreter> object, which is defined by
+the perl library.
+
+If your copy of Perl is recent enough to contain this documentation
+(version 5.002 or later), then the perl library (and I<EXTERN.h> and
+I<perl.h>, which you'll also need) will reside in a directory
+that looks like this:
+
+    /usr/local/lib/perl5/your_architecture_here/CORE
+
+or perhaps just
+
+    /usr/local/lib/perl5/CORE
+
+or maybe something like
+
+    /usr/opt/perl5/CORE
+
+Execute this statement for a hint about where to find CORE:
+
+    perl -MConfig -e 'print $Config{archlib}'
+
+Here's how you'd compile the example in the next section,
+L<Adding a Perl interpreter to your C program>, on my Linux box:
+
+    % gcc -O2 -Dbool=char -DHAS_BOOL -I/usr/local/include
+    -I/usr/local/lib/perl5/i586-linux/5.003/CORE
+    -L/usr/local/lib/perl5/i586-linux/5.003/CORE
+    -o interp interp.c -lperl -lm
+
+(That's all one line.)  On my DEC Alpha running old 5.003_05, the 
+incantation is a bit different:
+
+    % cc -O2 -Olimit 2900 -DSTANDARD_C -I/usr/local/include
+    -I/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE
+    -L/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE -L/usr/local/lib
+    -D__LANGUAGE_C__ -D_NO_PROTO -o interp interp.c -lperl -lm
+
+How can you figure out what to add?  Assuming your Perl is post-5.001,
+execute a C<perl -V> command and pay special attention to the "cc" and
+"ccflags" information.
+
+You'll have to choose the appropriate compiler (I<cc>, I<gcc>, et al.) for
+your machine: C<perl -MConfig -e 'print $Config{cc}'> will tell you what
+to use.
+
+You'll also have to choose the appropriate library directory
+(I</usr/local/lib/...>) for your machine.  If your compiler complains
+that certain functions are undefined, or that it can't locate
+I<-lperl>, then you need to change the path following the C<-L>.  If it
+complains that it can't find I<EXTERN.h> and I<perl.h>, you need to
+change the path following the C<-I>.
+
+You may have to add extra libraries as well.  Which ones?
+Perhaps those printed by
+
+   perl -MConfig -e 'print $Config{libs}'
+
+Provided your perl binary was properly configured and installed the
+B<ExtUtils::Embed> module will determine all of this information for
+you:
+
+   % cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+If the B<ExtUtils::Embed> module isn't part of your Perl distribution,
+you can retrieve it from
+http://www.perl.com/perl/CPAN/modules/by-module/ExtUtils/
+(If this documentation came from your Perl distribution, then you're
+running 5.004 or better and you already have it.)
+
+The B<ExtUtils::Embed> kit on CPAN also contains all source code for
+the examples in this document, tests, additional examples and other
+information you may find useful.
+
+=head2 Adding a Perl interpreter to your C program
+
+In a sense, perl (the C program) is a good example of embedding Perl
+(the language), so I'll demonstrate embedding with I<miniperlmain.c>,
+included in the source distribution.  Here's a bastardized, nonportable
+version of I<miniperlmain.c> containing the essentials of embedding:
+
+    #include <EXTERN.h>               /* from the Perl distribution     */
+    #include <perl.h>                 /* from the Perl distribution     */
+
+    static PerlInterpreter *my_perl;  /***    The Perl interpreter    ***/
+
+    int main(int argc, char **argv, char **env)
+    {
+	PERL_SYS_INIT3(&argc,&argv,&env);
+        my_perl = perl_alloc();
+        perl_construct(my_perl);
+	PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+        perl_parse(my_perl, NULL, argc, argv, (char **)NULL);
+        perl_run(my_perl);
+        perl_destruct(my_perl);
+        perl_free(my_perl);
+	PERL_SYS_TERM();
+    }
+
+Notice that we don't use the C<env> pointer.  Normally handed to
+C<perl_parse> as its final argument, C<env> here is replaced by
+C<NULL>, which means that the current environment will be used.  The macros
+PERL_SYS_INIT3() and PERL_SYS_TERM() provide system-specific tune up 
+of the C runtime environment necessary to run Perl interpreters; since
+PERL_SYS_INIT3() may change C<env>, it may be more appropriate to provide
+C<env> as an argument to perl_parse().
+
+Now compile this program (I'll call it I<interp.c>) into an executable:
+
+    % cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+After a successful compilation, you'll be able to use I<interp> just
+like perl itself:
+
+    % interp
+    print "Pretty Good Perl \n";
+    print "10890 - 9801 is ", 10890 - 9801;
+    <CTRL-D>
+    Pretty Good Perl
+    10890 - 9801 is 1089
+
+or
+
+    % interp -e 'printf("%x", 3735928559)'
+    deadbeef
+
+You can also read and execute Perl statements from a file while in the
+midst of your C program, by placing the filename in I<argv[1]> before
+calling I<perl_run>.
+
+=head2 Calling a Perl subroutine from your C program
+
+To call individual Perl subroutines, you can use any of the B<call_*>
+functions documented in L<perlcall>.
+In this example we'll use C<call_argv>.
+
+That's shown below, in a program I'll call I<showtime.c>.
+
+    #include <EXTERN.h>
+    #include <perl.h>
+
+    static PerlInterpreter *my_perl;
+
+    int main(int argc, char **argv, char **env)
+    {
+        char *args[] = { NULL };
+	PERL_SYS_INIT3(&argc,&argv,&env);
+        my_perl = perl_alloc();
+        perl_construct(my_perl);
+
+        perl_parse(my_perl, NULL, argc, argv, NULL);
+	PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+
+        /*** skipping perl_run() ***/
+
+        call_argv("showtime", G_DISCARD | G_NOARGS, args);
+
+        perl_destruct(my_perl);
+        perl_free(my_perl);
+	PERL_SYS_TERM();
+    }
+
+where I<showtime> is a Perl subroutine that takes no arguments (that's the
+I<G_NOARGS>) and for which I'll ignore the return value (that's the
+I<G_DISCARD>).  Those flags, and others, are discussed in L<perlcall>.
+
+I'll define the I<showtime> subroutine in a file called I<showtime.pl>:
+
+    print "I shan't be printed.";
+
+    sub showtime {
+        print time;
+    }
+
+Simple enough.  Now compile and run:
+
+    % cc -o showtime showtime.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+    % showtime showtime.pl
+    818284590
+
+yielding the number of seconds that elapsed between January 1, 1970
+(the beginning of the Unix epoch), and the moment I began writing this
+sentence.
+
+In this particular case we don't have to call I<perl_run>, as we set 
+the PL_exit_flag PERL_EXIT_DESTRUCT_END which executes END blocks in
+perl_destruct.
+
+If you want to pass arguments to the Perl subroutine, you can add
+strings to the C<NULL>-terminated C<args> list passed to
+I<call_argv>.  For other data types, or to examine return values,
+you'll need to manipulate the Perl stack.  That's demonstrated in
+L<Fiddling with the Perl stack from your C program>.
+
+=head2 Evaluating a Perl statement from your C program
+
+Perl provides two API functions to evaluate pieces of Perl code.
+These are L<perlapi/eval_sv> and L<perlapi/eval_pv>.
+
+Arguably, these are the only routines you'll ever need to execute
+snippets of Perl code from within your C program.  Your code can be as
+long as you wish; it can contain multiple statements; it can employ
+L<perlfunc/use>, L<perlfunc/require>, and L<perlfunc/do> to
+include external Perl files.
+
+I<eval_pv> lets us evaluate individual Perl strings, and then
+extract variables for coercion into C types.  The following program,
+I<string.c>, executes three Perl strings, extracting an C<int> from
+the first, a C<float> from the second, and a C<char *> from the third.
+
+   #include <EXTERN.h>
+   #include <perl.h>
+
+   static PerlInterpreter *my_perl;
+
+   main (int argc, char **argv, char **env)
+   {
+       STRLEN n_a;
+       char *embedding[] = { "", "-e", "0" };
+
+       PERL_SYS_INIT3(&argc,&argv,&env);
+       my_perl = perl_alloc();
+       perl_construct( my_perl );
+
+       perl_parse(my_perl, NULL, 3, embedding, NULL);
+       PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+       perl_run(my_perl);
+
+       /** Treat $a as an integer **/
+       eval_pv("$a = 3; $a **= 2", TRUE);
+       printf("a = %d\n", SvIV(get_sv("a", FALSE)));
+
+       /** Treat $a as a float **/
+       eval_pv("$a = 3.14; $a **= 2", TRUE);
+       printf("a = %f\n", SvNV(get_sv("a", FALSE)));
+
+       /** Treat $a as a string **/
+       eval_pv("$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);", TRUE);
+       printf("a = %s\n", SvPV(get_sv("a", FALSE), n_a));
+
+       perl_destruct(my_perl);
+       perl_free(my_perl);
+       PERL_SYS_TERM();
+   }
+
+All of those strange functions with I<sv> in their names help convert Perl scalars to C types.  They're described in L<perlguts> and L<perlapi>.
+
+If you compile and run I<string.c>, you'll see the results of using
+I<SvIV()> to create an C<int>, I<SvNV()> to create a C<float>, and
+I<SvPV()> to create a string:
+
+   a = 9
+   a = 9.859600
+   a = Just Another Perl Hacker
+
+In the example above, we've created a global variable to temporarily
+store the computed value of our eval'd expression.  It is also
+possible and in most cases a better strategy to fetch the return value
+from I<eval_pv()> instead.  Example:
+
+   ...
+   STRLEN n_a;
+   SV *val = eval_pv("reverse 'rekcaH lreP rehtonA tsuJ'", TRUE);
+   printf("%s\n", SvPV(val,n_a));
+   ...
+
+This way, we avoid namespace pollution by not creating global
+variables and we've simplified our code as well.
+
+=head2 Performing Perl pattern matches and substitutions from your C program
+
+The I<eval_sv()> function lets us evaluate strings of Perl code, so we can
+define some functions that use it to "specialize" in matches and
+substitutions: I<match()>, I<substitute()>, and I<matches()>.
+
+   I32 match(SV *string, char *pattern);
+
+Given a string and a pattern (e.g., C<m/clasp/> or C</\b\w*\b/>, which
+in your C program might appear as "/\\b\\w*\\b/"), match()
+returns 1 if the string matches the pattern and 0 otherwise.
+
+   int substitute(SV **string, char *pattern);
+
+Given a pointer to an C<SV> and an C<=~> operation (e.g.,
+C<s/bob/robert/g> or C<tr[A-Z][a-z]>), substitute() modifies the string
+within the C<SV> as according to the operation, returning the number of substitutions
+made.
+
+   int matches(SV *string, char *pattern, AV **matches);
+
+Given an C<SV>, a pattern, and a pointer to an empty C<AV>,
+matches() evaluates C<$string =~ $pattern> in a list context, and
+fills in I<matches> with the array elements, returning the number of matches found.
+
+Here's a sample program, I<match.c>, that uses all three (long lines have
+been wrapped here):
+
+ #include <EXTERN.h>
+ #include <perl.h>
+
+ static PerlInterpreter *my_perl;
+
+ /** my_eval_sv(code, error_check)
+ ** kinda like eval_sv(), 
+ ** but we pop the return value off the stack 
+ **/
+ SV* my_eval_sv(SV *sv, I32 croak_on_error)
+ {
+     dSP;
+     SV* retval;
+     STRLEN n_a;
+
+     PUSHMARK(SP);
+     eval_sv(sv, G_SCALAR);
+
+     SPAGAIN;
+     retval = POPs;
+     PUTBACK;
+
+     if (croak_on_error && SvTRUE(ERRSV))
+ 	croak(SvPVx(ERRSV, n_a));
+
+     return retval;
+ }
+
+ /** match(string, pattern)
+ **
+ ** Used for matches in a scalar context.
+ **
+ ** Returns 1 if the match was successful; 0 otherwise.
+ **/
+
+ I32 match(SV *string, char *pattern)
+ {
+     SV *command = NEWSV(1099, 0), *retval;
+     STRLEN n_a;
+
+     sv_setpvf(command, "my $string = '%s'; $string =~ %s",
+ 	      SvPV(string,n_a), pattern);
+
+     retval = my_eval_sv(command, TRUE);
+     SvREFCNT_dec(command);
+
+     return SvIV(retval);
+ }
+
+ /** substitute(string, pattern)
+ **
+ ** Used for =~ operations that modify their left-hand side (s/// and tr///)
+ **
+ ** Returns the number of successful matches, and
+ ** modifies the input string if there were any.
+ **/
+
+ I32 substitute(SV **string, char *pattern)
+ {
+     SV *command = NEWSV(1099, 0), *retval;
+     STRLEN n_a;
+
+     sv_setpvf(command, "$string = '%s'; ($string =~ %s)",
+ 	      SvPV(*string,n_a), pattern);
+
+     retval = my_eval_sv(command, TRUE);
+     SvREFCNT_dec(command);
+
+     *string = get_sv("string", FALSE);
+     return SvIV(retval);
+ }
+
+ /** matches(string, pattern, matches)
+ **
+ ** Used for matches in a list context.
+ **
+ ** Returns the number of matches,
+ ** and fills in **matches with the matching substrings
+ **/
+
+ I32 matches(SV *string, char *pattern, AV **match_list)
+ {
+     SV *command = NEWSV(1099, 0);
+     I32 num_matches;
+     STRLEN n_a;
+
+     sv_setpvf(command, "my $string = '%s'; @array = ($string =~ %s)",
+ 	      SvPV(string,n_a), pattern);
+
+     my_eval_sv(command, TRUE);
+     SvREFCNT_dec(command);
+
+     *match_list = get_av("array", FALSE);
+     num_matches = av_len(*match_list) + 1; /** assume $[ is 0 **/
+
+     return num_matches;
+ }
+
+ main (int argc, char **argv, char **env)
+ {
+     char *embedding[] = { "", "-e", "0" };
+     AV *match_list;
+     I32 num_matches, i;
+     SV *text;
+     STRLEN n_a;
+
+     PERL_SYS_INIT3(&argc,&argv,&env);
+     my_perl = perl_alloc();
+     perl_construct(my_perl);
+     perl_parse(my_perl, NULL, 3, embedding, NULL);
+     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+
+     text = NEWSV(1099,0);
+     sv_setpv(text, "When he is at a convenience store and the "
+	"bill comes to some amount like 76 cents, Maynard is "
+	"aware that there is something he *should* do, something "
+	"that will enable him to get back a quarter, but he has "
+	"no idea *what*.  He fumbles through his red squeezey "
+	"changepurse and gives the boy three extra pennies with "
+	"his dollar, hoping that he might luck into the correct "
+	"amount.  The boy gives him back two of his own pennies "
+	"and then the big shiny quarter that is his prize. "
+	"-RICHH");
+
+     if (match(text, "m/quarter/")) /** Does text contain 'quarter'? **/
+ 	printf("match: Text contains the word 'quarter'.\n\n");
+     else
+ 	printf("match: Text doesn't contain the word 'quarter'.\n\n");
+
+     if (match(text, "m/eighth/")) /** Does text contain 'eighth'? **/
+ 	printf("match: Text contains the word 'eighth'.\n\n");
+     else
+ 	printf("match: Text doesn't contain the word 'eighth'.\n\n");
+
+     /** Match all occurrences of /wi../ **/
+     num_matches = matches(text, "m/(wi..)/g", &match_list);
+     printf("matches: m/(wi..)/g found %d matches...\n", num_matches);
+
+     for (i = 0; i < num_matches; i++)
+ 	printf("match: %s\n", SvPV(*av_fetch(match_list, i, FALSE),n_a));
+     printf("\n");
+
+     /** Remove all vowels from text **/
+     num_matches = substitute(&text, "s/[aeiou]//gi");
+     if (num_matches) {
+ 	printf("substitute: s/[aeiou]//gi...%d substitutions made.\n",
+ 	       num_matches);
+ 	printf("Now text is: %s\n\n", SvPV(text,n_a));
+     }
+
+     /** Attempt a substitution **/
+     if (!substitute(&text, "s/Perl/C/")) {
+ 	printf("substitute: s/Perl/C...No substitution made.\n\n");
+     }
+
+     SvREFCNT_dec(text);
+     PL_perl_destruct_level = 1;
+     perl_destruct(my_perl);
+     perl_free(my_perl);
+     PERL_SYS_TERM();
+ }
+
+which produces the output (again, long lines have been wrapped here)
+
+   match: Text contains the word 'quarter'.
+
+   match: Text doesn't contain the word 'eighth'.
+
+   matches: m/(wi..)/g found 2 matches...
+   match: will
+   match: with
+
+   substitute: s/[aeiou]//gi...139 substitutions made.
+   Now text is: Whn h s t  cnvnnc str nd th bll cms t sm mnt lk 76 cnts,
+   Mynrd s wr tht thr s smthng h *shld* d, smthng tht wll nbl hm t gt bck
+   qrtr, bt h hs n d *wht*.  H fmbls thrgh hs rd sqzy chngprs nd gvs th by
+   thr xtr pnns wth hs dllr, hpng tht h mght lck nt th crrct mnt.  Th by gvs
+   hm bck tw f hs wn pnns nd thn th bg shny qrtr tht s hs prz. -RCHH
+
+   substitute: s/Perl/C...No substitution made.
+
+=head2 Fiddling with the Perl stack from your C program
+
+When trying to explain stacks, most computer science textbooks mumble
+something about spring-loaded columns of cafeteria plates: the last
+thing you pushed on the stack is the first thing you pop off.  That'll
+do for our purposes: your C program will push some arguments onto "the Perl
+stack", shut its eyes while some magic happens, and then pop the
+results--the return value of your Perl subroutine--off the stack.
+
+First you'll need to know how to convert between C types and Perl
+types, with newSViv() and sv_setnv() and newAV() and all their
+friends.  They're described in L<perlguts> and L<perlapi>.
+
+Then you'll need to know how to manipulate the Perl stack.  That's
+described in L<perlcall>.
+
+Once you've understood those, embedding Perl in C is easy.
+
+Because C has no builtin function for integer exponentiation, let's
+make Perl's ** operator available to it (this is less useful than it
+sounds, because Perl implements ** with C's I<pow()> function).  First
+I'll create a stub exponentiation function in I<power.pl>:
+
+    sub expo {
+        my ($a, $b) = @_;
+        return $a ** $b;
+    }
+
+Now I'll create a C program, I<power.c>, with a function
+I<PerlPower()> that contains all the perlguts necessary to push the
+two arguments into I<expo()> and to pop the return value out.  Take a
+deep breath...
+
+    #include <EXTERN.h>
+    #include <perl.h>
+
+    static PerlInterpreter *my_perl;
+
+    static void
+    PerlPower(int a, int b)
+    {
+      dSP;                            /* initialize stack pointer      */
+      ENTER;                          /* everything created after here */
+      SAVETMPS;                       /* ...is a temporary variable.   */
+      PUSHMARK(SP);                   /* remember the stack pointer    */
+      XPUSHs(sv_2mortal(newSViv(a))); /* push the base onto the stack  */
+      XPUSHs(sv_2mortal(newSViv(b))); /* push the exponent onto stack  */
+      PUTBACK;                      /* make local stack pointer global */
+      call_pv("expo", G_SCALAR);      /* call the function             */
+      SPAGAIN;                        /* refresh stack pointer         */
+                                    /* pop the return value from stack */
+      printf ("%d to the %dth power is %d.\n", a, b, POPi);
+      PUTBACK;
+      FREETMPS;                       /* free that return value        */
+      LEAVE;                       /* ...and the XPUSHed "mortal" args.*/
+    }
+
+    int main (int argc, char **argv, char **env)
+    {
+      char *my_argv[] = { "", "power.pl" };
+
+      PERL_SYS_INIT3(&argc,&argv,&env);
+      my_perl = perl_alloc();
+      perl_construct( my_perl );
+
+      perl_parse(my_perl, NULL, 2, my_argv, (char **)NULL);
+      PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+      perl_run(my_perl);
+
+      PerlPower(3, 4);                      /*** Compute 3 ** 4 ***/
+
+      perl_destruct(my_perl);
+      perl_free(my_perl);
+      PERL_SYS_TERM();
+    }
+
+
+
+Compile and run:
+
+    % cc -o power power.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+    % power
+    3 to the 4th power is 81.
+
+=head2 Maintaining a persistent interpreter
+
+When developing interactive and/or potentially long-running
+applications, it's a good idea to maintain a persistent interpreter
+rather than allocating and constructing a new interpreter multiple
+times.  The major reason is speed: since Perl will only be loaded into
+memory once.
+
+However, you have to be more cautious with namespace and variable
+scoping when using a persistent interpreter.  In previous examples
+we've been using global variables in the default package C<main>.  We
+knew exactly what code would be run, and assumed we could avoid
+variable collisions and outrageous symbol table growth.
+
+Let's say your application is a server that will occasionally run Perl
+code from some arbitrary file.  Your server has no way of knowing what
+code it's going to run.  Very dangerous.
+
+If the file is pulled in by C<perl_parse()>, compiled into a newly
+constructed interpreter, and subsequently cleaned out with
+C<perl_destruct()> afterwards, you're shielded from most namespace
+troubles.
+
+One way to avoid namespace collisions in this scenario is to translate
+the filename into a guaranteed-unique package name, and then compile
+the code into that package using L<perlfunc/eval>.  In the example
+below, each file will only be compiled once.  Or, the application
+might choose to clean out the symbol table associated with the file
+after it's no longer needed.  Using L<perlapi/call_argv>, We'll
+call the subroutine C<Embed::Persistent::eval_file> which lives in the
+file C<persistent.pl> and pass the filename and boolean cleanup/cache
+flag as arguments.
+
+Note that the process will continue to grow for each file that it
+uses.  In addition, there might be C<AUTOLOAD>ed subroutines and other
+conditions that cause Perl's symbol table to grow.  You might want to
+add some logic that keeps track of the process size, or restarts
+itself after a certain number of requests, to ensure that memory
+consumption is minimized.  You'll also want to scope your variables
+with L<perlfunc/my> whenever possible.
+
+
+ package Embed::Persistent;
+ #persistent.pl
+
+ use strict;
+ our %Cache;
+ use Symbol qw(delete_package);
+
+ sub valid_package_name {
+     my($string) = @_;
+     $string =~ s/([^A-Za-z0-9\/])/sprintf("_%2x",unpack("C",$1))/eg;
+     # second pass only for words starting with a digit
+     $string =~ s|/(\d)|sprintf("/_%2x",unpack("C",$1))|eg;
+
+     # Dress it up as a real package name
+     $string =~ s|/|::|g;
+     return "Embed" . $string;
+ }
+
+ sub eval_file {
+     my($filename, $delete) = @_;
+     my $package = valid_package_name($filename);
+     my $mtime = -M $filename;
+     if(defined $Cache{$package}{mtime}
+        &&
+        $Cache{$package}{mtime} <= $mtime)
+     {
+        # we have compiled this subroutine already,
+        # it has not been updated on disk, nothing left to do
+        print STDERR "already compiled $package->handler\n";
+     }
+     else {
+        local *FH;
+        open FH, $filename or die "open '$filename' $!";
+        local($/) = undef;
+        my $sub = <FH>;
+        close FH;
+
+        #wrap the code into a subroutine inside our unique package
+        my $eval = qq{package $package; sub handler { $sub; }};
+        {
+            # hide our variables within this block
+            my($filename,$mtime,$package,$sub);
+            eval $eval;
+        }
+        die $@ if $@;
+
+        #cache it unless we're cleaning out each time
+        $Cache{$package}{mtime} = $mtime unless $delete;
+     }
+
+     eval {$package->handler;};
+     die $@ if $@;
+
+     delete_package($package) if $delete;
+
+     #take a look if you want
+     #print Devel::Symdump->rnew($package)->as_string, $/;
+ }
+
+ 1;
+
+ __END__
+
+ /* persistent.c */
+ #include <EXTERN.h>
+ #include <perl.h>
+
+ /* 1 = clean out filename's symbol table after each request, 0 = don't */
+ #ifndef DO_CLEAN
+ #define DO_CLEAN 0
+ #endif
+
+ #define BUFFER_SIZE 1024
+
+ static PerlInterpreter *my_perl = NULL;
+
+ int
+ main(int argc, char **argv, char **env)
+ {
+     char *embedding[] = { "", "persistent.pl" };
+     char *args[] = { "", DO_CLEAN, NULL };
+     char filename[BUFFER_SIZE];
+     int exitstatus = 0;
+     STRLEN n_a;
+
+     PERL_SYS_INIT3(&argc,&argv,&env);
+     if((my_perl = perl_alloc()) == NULL) {
+        fprintf(stderr, "no memory!");
+        exit(1);
+     }
+     perl_construct(my_perl);
+
+     exitstatus = perl_parse(my_perl, NULL, 2, embedding, NULL);
+     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+     if(!exitstatus) {
+        exitstatus = perl_run(my_perl);
+
+        while(printf("Enter file name: ") &&
+              fgets(filename, BUFFER_SIZE, stdin)) {
+
+            filename[strlen(filename)-1] = '\0'; /* strip \n */
+            /* call the subroutine, passing it the filename as an argument */
+            args[0] = filename;
+            call_argv("Embed::Persistent::eval_file",
+                           G_DISCARD | G_EVAL, args);
+
+            /* check $@ */
+            if(SvTRUE(ERRSV))
+                fprintf(stderr, "eval error: %s\n", SvPV(ERRSV,n_a));
+        }
+     }
+
+     PL_perl_destruct_level = 0;
+     perl_destruct(my_perl);
+     perl_free(my_perl);
+     PERL_SYS_TERM();
+     exit(exitstatus);
+ }
+
+Now compile:
+
+ % cc -o persistent persistent.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+Here's an example script file:
+
+ #test.pl
+ my $string = "hello";
+ foo($string);
+
+ sub foo {
+     print "foo says: @_\n";
+ }
+
+Now run:
+
+ % persistent
+ Enter file name: test.pl
+ foo says: hello
+ Enter file name: test.pl
+ already compiled Embed::test_2epl->handler
+ foo says: hello
+ Enter file name: ^C
+
+=head2 Execution of END blocks
+
+Traditionally END blocks have been executed at the end of the perl_run.
+This causes problems for applications that never call perl_run. Since
+perl 5.7.2 you can specify C<PL_exit_flags |= PERL_EXIT_DESTRUCT_END>
+to get the new behaviour. This also enables the running of END blocks if
+the perl_parse fails and C<perl_destruct> will return the exit value.
+
+=head2 Maintaining multiple interpreter instances
+
+Some rare applications will need to create more than one interpreter
+during a session.  Such an application might sporadically decide to
+release any resources associated with the interpreter.
+
+The program must take care to ensure that this takes place I<before>
+the next interpreter is constructed.  By default, when perl is not
+built with any special options, the global variable
+C<PL_perl_destruct_level> is set to C<0>, since extra cleaning isn't
+usually needed when a program only ever creates a single interpreter
+in its entire lifetime.
+
+Setting C<PL_perl_destruct_level> to C<1> makes everything squeaky clean:
+
+ while(1) {
+     ...
+     /* reset global variables here with PL_perl_destruct_level = 1 */
+     PL_perl_destruct_level = 1;
+     perl_construct(my_perl);
+     ...
+     /* clean and reset _everything_ during perl_destruct */
+     PL_perl_destruct_level = 1;
+     perl_destruct(my_perl);
+     perl_free(my_perl);
+     ...
+     /* let's go do it again! */
+ }
+
+When I<perl_destruct()> is called, the interpreter's syntax parse tree
+and symbol tables are cleaned up, and global variables are reset.  The
+second assignment to C<PL_perl_destruct_level> is needed because
+perl_construct resets it to C<0>.
+
+Now suppose we have more than one interpreter instance running at the
+same time.  This is feasible, but only if you used the Configure option
+C<-Dusemultiplicity> or the options C<-Dusethreads -Duseithreads> when
+building perl.  By default, enabling one of these Configure options
+sets the per-interpreter global variable C<PL_perl_destruct_level> to
+C<1>, so that thorough cleaning is automatic and interpreter variables
+are initialized correctly.  Even if you don't intend to run two or
+more interpreters at the same time, but to run them sequentially, like
+in the above example, it is recommended to build perl with the
+C<-Dusemultiplicity> option otherwise some interpreter variables may
+not be initialized correctly between consecutive runs and your
+application may crash.
+
+Using C<-Dusethreads -Duseithreads> rather than C<-Dusemultiplicity>
+is more appropriate if you intend to run multiple interpreters
+concurrently in different threads, because it enables support for
+linking in the thread libraries of your system with the interpreter.
+
+Let's give it a try:
+
+
+ #include <EXTERN.h>
+ #include <perl.h>
+
+ /* we're going to embed two interpreters */
+ /* we're going to embed two interpreters */
+
+ #define SAY_HELLO "-e", "print qq(Hi, I'm $^X\n)"
+
+ int main(int argc, char **argv, char **env)
+ {
+     PerlInterpreter *one_perl, *two_perl;
+     char *one_args[] = { "one_perl", SAY_HELLO };
+     char *two_args[] = { "two_perl", SAY_HELLO };
+
+     PERL_SYS_INIT3(&argc,&argv,&env);
+     one_perl = perl_alloc();
+     two_perl = perl_alloc();
+
+     PERL_SET_CONTEXT(one_perl);
+     perl_construct(one_perl);
+     PERL_SET_CONTEXT(two_perl);
+     perl_construct(two_perl);
+
+     PERL_SET_CONTEXT(one_perl);
+     perl_parse(one_perl, NULL, 3, one_args, (char **)NULL);
+     PERL_SET_CONTEXT(two_perl);
+     perl_parse(two_perl, NULL, 3, two_args, (char **)NULL);
+
+     PERL_SET_CONTEXT(one_perl);
+     perl_run(one_perl);
+     PERL_SET_CONTEXT(two_perl);
+     perl_run(two_perl);
+
+     PERL_SET_CONTEXT(one_perl);
+     perl_destruct(one_perl);
+     PERL_SET_CONTEXT(two_perl);
+     perl_destruct(two_perl);
+
+     PERL_SET_CONTEXT(one_perl);
+     perl_free(one_perl);
+     PERL_SET_CONTEXT(two_perl);
+     perl_free(two_perl);
+     PERL_SYS_TERM();
+ }
+
+Note the calls to PERL_SET_CONTEXT().  These are necessary to initialize
+the global state that tracks which interpreter is the "current" one on
+the particular process or thread that may be running it.  It should
+always be used if you have more than one interpreter and are making
+perl API calls on both interpreters in an interleaved fashion.
+
+PERL_SET_CONTEXT(interp) should also be called whenever C<interp> is
+used by a thread that did not create it (using either perl_alloc(), or
+the more esoteric perl_clone()).
+
+Compile as usual:
+
+ % cc -o multiplicity multiplicity.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+Run it, Run it:
+
+ % multiplicity
+ Hi, I'm one_perl
+ Hi, I'm two_perl
+
+=head2 Using Perl modules, which themselves use C libraries, from your C program
+
+If you've played with the examples above and tried to embed a script
+that I<use()>s a Perl module (such as I<Socket>) which itself uses a C or C++ library,
+this probably happened:
+
+
+ Can't load module Socket, dynamic loading not available in this perl.
+  (You may need to build a new perl executable which either supports
+  dynamic loading or has the Socket module statically linked into it.)
+
+
+What's wrong?
+
+Your interpreter doesn't know how to communicate with these extensions
+on its own.  A little glue will help.  Up until now you've been
+calling I<perl_parse()>, handing it NULL for the second argument:
+
+ perl_parse(my_perl, NULL, argc, my_argv, NULL);
+
+That's where the glue code can be inserted to create the initial contact between
+Perl and linked C/C++ routines.  Let's take a look some pieces of I<perlmain.c>
+to see how Perl does this:
+
+ static void xs_init (pTHX);
+
+ EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
+ EXTERN_C void boot_Socket (pTHX_ CV* cv);
+
+
+ EXTERN_C void
+ xs_init(pTHX)
+ {
+        char *file = __FILE__;
+        /* DynaLoader is a special case */
+        newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
+        newXS("Socket::bootstrap", boot_Socket, file);
+ }
+
+Simply put: for each extension linked with your Perl executable
+(determined during its initial configuration on your
+computer or when adding a new extension),
+a Perl subroutine is created to incorporate the extension's
+routines.  Normally, that subroutine is named
+I<Module::bootstrap()> and is invoked when you say I<use Module>.  In
+turn, this hooks into an XSUB, I<boot_Module>, which creates a Perl
+counterpart for each of the extension's XSUBs.  Don't worry about this
+part; leave that to the I<xsubpp> and extension authors.  If your
+extension is dynamically loaded, DynaLoader creates I<Module::bootstrap()>
+for you on the fly.  In fact, if you have a working DynaLoader then there
+is rarely any need to link in any other extensions statically.
+
+
+Once you have this code, slap it into the second argument of I<perl_parse()>:
+
+
+ perl_parse(my_perl, xs_init, argc, my_argv, NULL);
+
+
+Then compile:
+
+ % cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
+
+ % interp
+   use Socket;
+   use SomeDynamicallyLoadedModule;
+
+   print "Now I can use extensions!\n"'
+
+B<ExtUtils::Embed> can also automate writing the I<xs_init> glue code.
+
+ % perl -MExtUtils::Embed -e xsinit -- -o perlxsi.c
+ % cc -c perlxsi.c `perl -MExtUtils::Embed -e ccopts`
+ % cc -c interp.c  `perl -MExtUtils::Embed -e ccopts`
+ % cc -o interp perlxsi.o interp.o `perl -MExtUtils::Embed -e ldopts`
+
+Consult L<perlxs>, L<perlguts>, and L<perlapi> for more details.
+
+=head1 Embedding Perl under Win32
+
+In general, all of the source code shown here should work unmodified under
+Windows.
+
+However, there are some caveats about the command-line examples shown.
+For starters, backticks won't work under the Win32 native command shell.
+The ExtUtils::Embed kit on CPAN ships with a script called
+B<genmake>, which generates a simple makefile to build a program from
+a single C source file.  It can be used like this:
+
+ C:\ExtUtils-Embed\eg> perl genmake interp.c
+ C:\ExtUtils-Embed\eg> nmake
+ C:\ExtUtils-Embed\eg> interp -e "print qq{I'm embedded in Win32!\n}"
+
+You may wish to use a more robust environment such as the Microsoft
+Developer Studio.  In this case, run this to generate perlxsi.c:
+
+ perl -MExtUtils::Embed -e xsinit
+
+Create a new project and Insert -> Files into Project: perlxsi.c,
+perl.lib, and your own source files, e.g. interp.c.  Typically you'll
+find perl.lib in B<C:\perl\lib\CORE>, if not, you should see the
+B<CORE> directory relative to C<perl -V:archlib>.  The studio will
+also need this path so it knows where to find Perl include files.
+This path can be added via the Tools -> Options -> Directories menu.
+Finally, select Build -> Build interp.exe and you're ready to go.
+
+=head1 Hiding Perl_
+
+If you completely hide the short forms forms of the Perl public API,
+add -DPERL_NO_SHORT_NAMES to the compilation flags.  This means that
+for example instead of writing
+
+    warn("%d bottles of beer on the wall", bottlecount);
+
+you will have to write the explicit full form
+
+    Perl_warn(aTHX_ "%d bottles of beer on the wall", bottlecount);
+
+(See L<perlguts/Background and PERL_IMPLICIT_CONTEXT for the explanation
+of the C<aTHX_>.> )  Hiding the short forms is very useful for avoiding
+all sorts of nasty (C preprocessor or otherwise) conflicts with other
+software packages (Perl defines about 2400 APIs with these short names,
+take or leave few hundred, so there certainly is room for conflict.)
+
+=head1 MORAL
+
+You can sometimes I<write faster code> in C, but
+you can always I<write code faster> in Perl.  Because you can use
+each from the other, combine them as you wish.
+
+
+=head1 AUTHOR
+
+Jon Orwant <F<orwant@media.mit.edu>> and Doug MacEachern
+<F<dougm@covalent.net>>, with small contributions from Tim Bunce, Tom
+Christiansen, Guy Decoux, Hallvard Furuseth, Dov Grobgeld, and Ilya
+Zakharevich.
+
+Doug MacEachern has an article on embedding in Volume 1, Issue 4 of
+The Perl Journal ( http://www.tpj.com/ ).  Doug is also the developer of the
+most widely-used Perl embedding: the mod_perl system
+(perl.apache.org), which embeds Perl in the Apache web server.
+Oracle, Binary Evolution, ActiveState, and Ben Sugars's nsapi_perl
+have used this model for Oracle, Netscape and Internet Information
+Server Perl plugins.
+
+=head1 COPYRIGHT
+
+Copyright (C) 1995, 1996, 1997, 1998 Doug MacEachern and Jon Orwant.  All
+Rights Reserved.
+
+Permission is granted to make and distribute verbatim copies of this
+documentation provided the copyright notice and this permission notice are
+preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+documentation under the conditions for verbatim copying, provided also
+that they are marked clearly as modified versions, that the authors'
+names and title are unchanged (though subtitles and additional
+authors' names may be added), and that the entire resulting derived
+work is distributed under the terms of a permission notice identical
+to this one.
+
+Permission is granted to copy and distribute translations of this
+documentation into another language, under the above conditions for
+modified versions.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlepoc.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlepoc.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlepoc.pod	(revision 14489)
@@ -0,0 +1,159 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.epoc - Perl for EPOC
+
+=head1 SYNOPSIS
+
+Perl 5 README file for the EPOC Release 5 operating system.
+
+=head1 INTRODUCTION
+
+EPOC is an OS for palmtops and mobile phones. For more informations look at:
+http://www.symbian.com/
+
+This is a port of perl to the epocemx SDK by Eberhard Mattes, which
+itself uses the SDK by symbian. Essentially epocemx it is a POSIX
+look alike environment for the EPOC OS.  For more information look at: 
+http://epocemx.sourceforge.net/
+
+perl and epocemx runs on Epoc Release 5 machines: Psion 5mx, 5mx Pro,
+Psion Revo, Psion Netbook and on the Ericsson M128. It may run on Epoc
+Release 3 Hardware (Series 5 classic), too. For more information about
+this hardware please refer to http://www.psion.com/
+
+Vendors which like to have support for their devices are free to send
+me a sample. 
+
+=head1 INSTALLING PERL ON EPOC
+
+You can download a ready-to-install version from
+http://www.oflebbe.de/oflebbe/perl/
+
+You will need at least ~6MB free space in order to install and run perl.
+
+Please install the emxusr.sis package from
+http://epocemx.sourceforge.net/ first.
+
+Install perl.sis on the EPOC machine. If you do not know how to do
+that, consult your PsiWin documentation.
+
+Perl itself and its standard library is using 4 MB disk space.
+Unicode support and some other modules are left out. (For details,
+please look into epoc/createpkg.pl). If you like to use these modules,
+you are free to copy them from a current perl release.
+
+=head1 STARTING PERL ON EPOC
+
+Please use the epocemx shell to start perl. perl integrates with the
+conventions of epocemx. 
+
+=head2 Editors on Epoc
+
+A suitable text editor can be downloaded from symbian
+http://www.symbian.com/developer/downloads/files/editor.zip
+
+=head2 Features of Perl on Epoc
+
+The built-in function EPOC::getcwd returns the current directory.
+
+=head2 Restrictions of Perl on Epoc
+
+Features are left out, because of restrictions of the POSIX support in
+EPOC:
+
+=over 4
+
+=item * 
+
+socket IO is only implemented poorly. You can only use sysread and
+syswrite on them. The commands read, write, print, <> do not work for
+sockets. This may change iff epocemx supports sockets.
+
+=item *
+
+kill, alarm and signals. Do not try to use them. This may be
+impossible to implement on EPOC.
+
+=item *
+
+select is missing.
+
+=item *
+
+binmode does not exist. (No CR LF to LF translation for text files)
+
+=item *
+
+EPOC does not handle the notion of current drive and current
+directory very well (i.e. not at all, but it tries hard to emulate
+one). See PATH.
+
+=item *
+
+Heap is limited to 4MB.
+
+=item *
+
+Dynamic loading is not implemented.
+
+=back
+
+=head2 Compiling Perl 5 on the EPOC cross compiling environment
+
+Sorry, this is far too short.
+
+=over 4
+
+=item *
+
+You will need the epocemx SDK from Eberhard Mattes. 
+
+=item *
+
+Get the Perl sources from your nearest CPAN site.
+
+=item *
+
+Unpack the sources. 
+
+=item *
+
+Build a native perl from this sources... Make sure to save the
+miniperl executable as miniperl.native.
+
+Start again from scratch
+
+      cp epoc/* .
+      ./Configure -S
+      make 
+      cp miniperl.native miniperl
+      touch miniperl.exe
+      make
+      perl createpkg.pl 
+
+      emxsis perl.pkg perl.sis
+
+=back
+
+=head1 SUPPORT STATUS OF PERL ON EPOC
+
+I'm offering this port "as is". You can ask me questions, but I can't
+guarantee I'll be able to answer them. Since the port to epocemx is
+quite new, please check the web for updates first.
+
+Very special thanks to Eberhard Mattes for epocemx.
+
+=head1 AUTHOR
+
+Olaf Flebbe <olaf@oflebbe.de>
+http://www.oflebbe.de/oflebbe/perl/
+
+=head1 LAST UPDATE
+
+2003-01-18
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq.pod	(revision 14489)
@@ -0,0 +1,1410 @@
+=head1 NAME
+
+perlfaq - frequently asked questions about Perl
+
+=head1 DESCRIPTION
+
+The perlfaq comprises several documents that answer the most commonly
+asked questions about Perl and Perl programming. It's divided by topic
+into nine major sections outlined in this document.
+
+=head2 Where to get the perlfaq
+
+The perlfaq comes with the standard Perl distribution, so if you have Perl
+you should have the perlfaq. You should also have the C<perldoc> tool
+that let's you read the L<perlfaq>:
+
+	$ perldoc perlfaq
+
+Besides your local system, you can find the perlfaq on the web, including
+at http://perldoc.perl.org/ .
+
+The perlfaq is an evolving document and you can read the latest version
+at http://faq.perl.org/ . The perlfaq-workers periodically post extracts
+of the latest perlfaq to comp.lang.perl.misc.
+
+You can view the source tree at
+http://cvs.perl.org/viewcvs/cvs-public/perlfaq/ (which is outside of the
+main Perl source tree).  The CVS repository notes all changes to the FAQ
+and holds the latest version of the working documents and may vary
+significantly from the version distributed with the latest version of
+Perl. Check the repository before sending your corrections.
+
+=head2 How to contribute to the perlfaq
+
+You can mail corrections, additions, and suggestions to 
+C<< <perlfaq-workers AT perl DOT org> >>. The perlfaq volunteers use this
+address to coordinate their efforts and track the perlfaq development.
+They appreciate your contributions to the FAQ but do not have time to
+provide individual help, so don't use this address to ask FAQs.
+
+The perlfaq server posts extracts of the perlfaq to that newsgroup every
+6 hours (or so), and the community of volunteers reviews and updates the
+answers. If you'd like to help review and update the answers, check out
+comp.lang.perl.misc.
+
+=head2 What will happen if you mail your Perl programming problems to the authors?
+
+The perlfaq-workers like to keep all traffic on the perlfaq-workers list
+so that everyone can see the work being done (and the work that needs to
+be done). The mailing list serves as an official record. If you email the
+authors or maintainers directly, you'll probably get a reply asking you
+to post to the mailing list. If you don't get a reply, it probably means
+that the person never saw the message or didn't have time to deal with
+it. Posting to the list allows the volunteers with time to deal with it
+when others are busy.
+
+If you have a question that isn't in the FAQ and you would like help with
+it, try the resources in L<perlfaq2>.
+
+=head1 CREDITS
+
+Tom Christiansen wrote the original perlfaq then expanded it with the
+help of Nat Torkington.  The perlfaq-workers maintain current document
+and the dezinens of comp.lang.perl.misc regularly review and update the
+FAQ. Several people have contributed answers, corrections, and comments,
+and the perlfaq notes those contributions wherever appropriate.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Tom Christainsen wrote the original version of this document.
+brian d foy C<< <bdfoy@cpan.org> >> wrote this version. See the
+individual perlfaq documents for additional copyright information.
+
+This document is available under the same terms as Perl itself. Code
+examples in all the perlfaq documents are in the public domain. Use
+them as you see fit (and at your own risk with no warranty from anyone).
+
+=head1 Table of Contents
+
+=over 4
+
+=item perlfaq  - this document
+
+=item perlfaq1 - General Questions About Perl
+
+=item perlfaq2 - Obtaining and Learning about Perl
+
+=item perlfaq3 - Programming Tools
+
+=item perlfaq4 - Data Manipulation
+
+=item perlfaq5 - Files and Formats
+
+=item perlfaq6 - Regular Expressions
+
+=item perlfaq7 - General Perl Language Issues
+
+=item perlfaq8 - System Interaction
+
+=item perlfaq9 - Networking
+
+=back
+
+=head1 The Questions
+
+=head2 L<perlfaq1>: General Questions About Perl
+
+Very general, high-level questions about Perl.
+
+=over 4
+
+=item *
+
+What is Perl?
+
+=item *
+
+Who supports Perl?  Who develops it?  Why is it free?
+
+=item *
+
+Which version of Perl should I use?
+
+=item *
+
+What are perl4, perl5, or perl6?
+
+=item *
+
+What is Ponie?
+
+=item *
+
+What is perl6?
+
+=item *
+
+How stable is Perl?
+
+=item *
+
+Is Perl difficult to learn?
+
+=item *
+
+How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl?
+
+=item *
+
+Can I do [task] in Perl?
+
+=item *
+
+When shouldn't I program in Perl?
+
+=item *
+
+What's the difference between "perl" and "Perl"?
+
+=item *
+
+Is it a Perl program or a Perl script?
+
+=item *
+
+What is a JAPH?
+
+=item *
+
+Where can I get a list of Larry Wall witticisms?
+
+=item *
+
+How can I convince my sysadmin/supervisor/employees to use version 5/5.6.1/Perl instead of some other language?
+
+=back
+
+
+=head2 L<perlfaq2>: Obtaining and Learning about Perl
+
+Where to find source and documentation for Perl, support, and related matters.
+
+=over 4
+
+=item *
+
+What machines support perl?  Where do I get it?
+
+=item *
+
+How can I get a binary version of perl?
+
+=item *
+
+I don't have a C compiler. How can I build my own Perl interpreter?
+
+=item *
+
+I copied the perl binary from one machine to another, but scripts don't work.
+
+=item *
+
+I grabbed the sources and tried to compile but gdbm/dynamic loading/malloc/linking/... failed.  How do I make it work?
+
+=item *
+
+What modules and extensions are available for Perl?  What is CPAN?  What does CPAN/src/... mean?
+
+=item *
+
+Is there an ISO or ANSI certified version of Perl?
+
+=item *
+
+Where can I get information on Perl?
+
+=item *
+
+What are the Perl newsgroups on Usenet?  Where do I post questions?
+
+=item *
+
+Where should I post source code?
+
+=item *
+
+Perl Books
+
+=item *
+
+Which magazines have Perl content?
+
+=item *
+
+What mailing lists are there for Perl?
+
+=item *
+
+Where are the archives for comp.lang.perl.misc?
+
+=item *
+
+Where can I buy a commercial version of perl?
+
+=item *
+
+Where do I send bug reports?
+
+=item *
+
+What is perl.com? Perl Mongers? pm.org? perl.org? cpan.org?
+
+=back
+
+
+=head2 L<perlfaq3>: Programming Tools
+
+Programmer tools and programming support.
+
+=over 4
+
+=item *
+
+How do I do (anything)?
+
+=item *
+
+How can I use Perl interactively?
+
+=item *
+
+Is there a Perl shell?
+
+=item *
+
+How do I find which modules are installed on my system?
+
+=item *
+
+How do I debug my Perl programs?
+
+=item *
+
+How do I profile my Perl programs?
+
+=item *
+
+How do I cross-reference my Perl programs?
+
+=item *
+
+Is there a pretty-printer (formatter) for Perl?
+
+=item *
+
+Is there a ctags for Perl?
+
+=item *
+
+Is there an IDE or Windows Perl Editor?
+
+=item *
+
+Where can I get Perl macros for vi?
+
+=item *
+
+Where can I get perl-mode for emacs?
+
+=item *
+
+How can I use curses with Perl?
+
+=item *
+
+How can I use X or Tk with Perl?
+
+=item *
+
+How can I make my Perl program run faster?
+
+=item *
+
+How can I make my Perl program take less memory?
+
+=item *
+
+Is it safe to return a reference to local or lexical data?
+
+=item *
+
+How can I free an array or hash so my program shrinks?
+
+=item *
+
+How can I make my CGI script more efficient?
+
+=item *
+
+How can I hide the source for my Perl program?
+
+=item *
+
+How can I compile my Perl program into byte code or C?
+
+=item *
+
+How can I compile Perl into Java?
+
+=item *
+
+How can I get C<#!perl> to work on [MS-DOS,NT,...]?
+
+=item *
+
+Can I write useful Perl programs on the command line?
+
+=item *
+
+Why don't Perl one-liners work on my DOS/Mac/VMS system?
+
+=item *
+
+Where can I learn about CGI or Web programming in Perl?
+
+=item *
+
+Where can I learn about object-oriented Perl programming?
+
+=item *
+
+Where can I learn about linking C with Perl?
+
+=item *
+
+I've read perlembed, perlguts, etc., but I can't embed perl in my C program; what am I doing wrong?
+
+=item *
+
+When I tried to run my script, I got this message. What does it mean?
+
+=item *
+
+What's MakeMaker?
+
+=back
+
+
+=head2 L<perlfaq4>: Data Manipulation
+
+Manipulating numbers, dates, strings, arrays, hashes, and miscellaneous data issues.
+
+=over 4
+
+=item *
+
+Why am I getting long decimals (eg, 19.9499999999999) instead of the numbers I should be getting (eg, 19.95)?
+
+=item *
+
+Why is int() broken?
+
+=item *
+
+Why isn't my octal data interpreted correctly?
+
+=item *
+
+Does Perl have a round() function?  What about ceil() and floor()?  Trig functions?
+
+=item *
+
+How do I convert between numeric representations/bases/radixes?
+
+=item *
+
+Why doesn't & work the way I want it to?
+
+=item *
+
+How do I multiply matrices?
+
+=item *
+
+How do I perform an operation on a series of integers?
+
+=item *
+
+How can I output Roman numerals?
+
+=item *
+
+Why aren't my random numbers random?
+
+=item *
+
+How do I get a random number between X and Y?
+
+=item *
+
+How do I find the day or week of the year?
+
+=item *
+
+How do I find the current century or millennium?
+
+=item *
+
+How can I compare two dates and find the difference?
+
+=item *
+
+How can I take a string and turn it into epoch seconds?
+
+=item *
+
+How can I find the Julian Day?
+
+=item *
+
+How do I find yesterday's date?
+
+=item *
+
+Does Perl have a Year 2000 problem?  Is Perl Y2K compliant?
+
+=item *
+
+How do I validate input?
+
+=item *
+
+How do I unescape a string?
+
+=item *
+
+How do I remove consecutive pairs of characters?
+
+=item *
+
+How do I expand function calls in a string?
+
+=item *
+
+How do I find matching/nesting anything?
+
+=item *
+
+How do I reverse a string?
+
+=item *
+
+How do I expand tabs in a string?
+
+=item *
+
+How do I reformat a paragraph?
+
+=item *
+
+How can I access or change N characters of a string?
+
+=item *
+
+How do I change the Nth occurrence of something?
+
+=item *
+
+How can I count the number of occurrences of a substring within a string?
+
+=item *
+
+How do I capitalize all the words on one line?
+
+=item *
+
+How can I split a [character] delimited string except when inside [character]?
+
+=item *
+
+How do I strip blank space from the beginning/end of a string?
+
+=item *
+
+How do I pad a string with blanks or pad a number with zeroes?
+
+=item *
+
+How do I extract selected columns from a string?
+
+=item *
+
+How do I find the soundex value of a string?
+
+=item *
+
+How can I expand variables in text strings?
+
+=item *
+
+What's wrong with always quoting "$vars"?
+
+=item *
+
+Why don't my E<lt>E<lt>HERE documents work?
+
+=item *
+
+What is the difference between a list and an array?
+
+=item *
+
+What is the difference between $array[1] and @array[1]?
+
+=item *
+
+How can I remove duplicate elements from a list or array?
+
+=item *
+
+How can I tell whether a certain element is contained in a list or array?
+
+=item *
+
+How do I compute the difference of two arrays?  How do I compute the intersection of two arrays?
+
+=item *
+
+How do I test whether two arrays or hashes are equal?
+
+=item *
+
+How do I find the first array element for which a condition is true?
+
+=item *
+
+How do I handle linked lists?
+
+=item *
+
+How do I handle circular lists?
+
+=item *
+
+How do I shuffle an array randomly?
+
+=item *
+
+How do I process/modify each element of an array?
+
+=item *
+
+How do I select a random element from an array?
+
+=item *
+
+How do I permute N elements of a list?
+
+=item *
+
+How do I sort an array by (anything)?
+
+=item *
+
+How do I manipulate arrays of bits?
+
+=item *
+
+Why does defined() return true on empty arrays and hashes?
+
+=item *
+
+How do I process an entire hash?
+
+=item *
+
+What happens if I add or remove keys from a hash while iterating over it?
+
+=item *
+
+How do I look up a hash element by value?
+
+=item *
+
+How can I know how many entries are in a hash?
+
+=item *
+
+How do I sort a hash (optionally by value instead of key)?
+
+=item *
+
+How can I always keep my hash sorted?
+
+=item *
+
+What's the difference between "delete" and "undef" with hashes?
+
+=item *
+
+Why don't my tied hashes make the defined/exists distinction?
+
+=item *
+
+How do I reset an each() operation part-way through?
+
+=item *
+
+How can I get the unique keys from two hashes?
+
+=item *
+
+How can I store a multidimensional array in a DBM file?
+
+=item *
+
+How can I make my hash remember the order I put elements into it?
+
+=item *
+
+Why does passing a subroutine an undefined element in a hash create it?
+
+=item *
+
+How can I make the Perl equivalent of a C structure/C++ class/hash or array of hashes or arrays?
+
+=item *
+
+How can I use a reference as a hash key?
+
+=item *
+
+How do I handle binary data correctly?
+
+=item *
+
+How do I determine whether a scalar is a number/whole/integer/float?
+
+=item *
+
+How do I keep persistent data across program calls?
+
+=item *
+
+How do I print out or copy a recursive data structure?
+
+=item *
+
+How do I define methods for every class/object?
+
+=item *
+
+How do I verify a credit card checksum?
+
+=item *
+
+How do I pack arrays of doubles or floats for XS code?
+
+=back
+
+
+=head2 L<perlfaq5>: Files and Formats
+
+I/O and the "f" issues: filehandles, flushing, formats, and footers.
+
+=over 4
+
+=item *
+
+How do I flush/unbuffer an output filehandle?  Why must I do this?
+
+=item *
+
+How do I change one line in a file/delete a line in a file/insert a line in the middle of a file/append to the beginning of a file?
+
+=item *
+
+How do I count the number of lines in a file?
+
+=item *
+
+How can I use Perl's C<-i> option from within a program?
+
+=item *
+
+How can I copy a file?
+
+=item *
+
+How do I make a temporary file name?
+
+=item *
+
+How can I manipulate fixed-record-length files?
+
+=item *
+
+How can I make a filehandle local to a subroutine?  How do I pass filehandles between subroutines?  How do I make an array of filehandles?
+
+=item *
+
+How can I use a filehandle indirectly?
+
+=item *
+
+How can I set up a footer format to be used with write()?
+
+=item *
+
+How can I write() into a string?
+
+=item *
+
+How can I output my numbers with commas added?
+
+=item *
+
+How can I translate tildes (~) in a filename?
+
+=item *
+
+How come when I open a file read-write it wipes it out?
+
+=item *
+
+Why do I sometimes get an "Argument list too long" when I use E<lt>*E<gt>?
+
+=item *
+
+Is there a leak/bug in glob()?
+
+=item *
+
+How can I open a file with a leading ">" or trailing blanks?
+
+=item *
+
+How can I reliably rename a file?
+
+=item *
+
+How can I lock a file?
+
+=item *
+
+Why can't I just open(FH, "E<gt>file.lock")?
+
+=item *
+
+I still don't get locking.  I just want to increment the number in the file.  How can I do this?
+
+=item *
+
+All I want to do is append a small amount of text to the end of a file.  Do I still have to use locking?
+
+=item *
+
+How do I randomly update a binary file?
+
+=item *
+
+How do I get a file's timestamp in perl?
+
+=item *
+
+How do I set a file's timestamp in perl?
+
+=item *
+
+How do I print to more than one file at once?
+
+=item *
+
+How can I read in an entire file all at once?
+
+=item *
+
+How can I read in a file by paragraphs?
+
+=item *
+
+How can I read a single character from a file?  From the keyboard?
+
+=item *
+
+How can I tell whether there's a character waiting on a filehandle?
+
+=item *
+
+How do I do a C<tail -f> in perl?
+
+=item *
+
+How do I dup() a filehandle in Perl?
+
+=item *
+
+How do I close a file descriptor by number?
+
+=item *
+
+Why can't I use "C:\temp\foo" in DOS paths?  Why doesn't `C:\temp\foo.exe` work?
+
+=item *
+
+Why doesn't glob("*.*") get all the files?
+
+=item *
+
+Why does Perl let me delete read-only files?  Why does C<-i> clobber protected files?  Isn't this a bug in Perl?
+
+=item *
+
+How do I select a random line from a file?
+
+=item *
+
+Why do I get weird spaces when I print an array of lines?
+
+=back
+
+
+=head2 L<perlfaq6>: Regular Expressions
+
+This section is surprisingly small because the rest of the FAQ is littered with answers involving regular expressions. For example, decoding a URL and checking whether something is a number are handled with regular expressions, but those answers are found elsewhere in this document (in L<perlfaq9>: "How do I decode or create those %-encodings on the web" and L<perlfaq4>: "How do I determine whether a scalar is a number/whole/integer/float", to be precise).
+
+=over 4
+
+=item *
+
+How can I hope to use regular expressions without creating illegible and unmaintainable code?
+
+=item *
+
+I'm having trouble matching over more than one line.  What's wrong?
+
+=item *
+
+How can I pull out lines between two patterns that are themselves on different lines?
+
+=item *
+
+I put a regular expression into $/ but it didn't work. What's wrong?
+
+=item *
+
+How do I substitute case insensitively on the LHS while preserving case on the RHS?
+
+=item *
+
+How can I make C<\w> match national character sets?
+
+=item *
+
+How can I match a locale-smart version of C</[a-zA-Z]/>?
+
+=item *
+
+How can I quote a variable to use in a regex?
+
+=item *
+
+What is C</o> really for?
+
+=item *
+
+How do I use a regular expression to strip C style comments from a file?
+
+=item *
+
+Can I use Perl regular expressions to match balanced text?
+
+=item *
+
+What does it mean that regexes are greedy?  How can I get around it?
+
+=item *
+
+How do I process each word on each line?
+
+=item *
+
+How can I print out a word-frequency or line-frequency summary?
+
+=item *
+
+How can I do approximate matching?
+
+=item *
+
+How do I efficiently match many regular expressions at once?
+
+=item *
+
+Why don't word-boundary searches with C<\b> work for me?
+
+=item *
+
+Why does using $&, $`, or $' slow my program down?
+
+=item *
+
+What good is C<\G> in a regular expression?
+
+=item *
+
+Are Perl regexes DFAs or NFAs?  Are they POSIX compliant?
+
+=item *
+
+What's wrong with using grep in a void context?
+
+=item *
+
+How can I match strings with multibyte characters?
+
+=item *
+
+How do I match a pattern that is supplied by the user?
+
+=back
+
+
+=head2 L<perlfaq7>: General Perl Language Issues
+
+General Perl language issues that don't clearly fit into any of the other sections.
+
+=over 4
+
+=item *
+
+Can I get a BNF/yacc/RE for the Perl language?
+
+=item *
+
+What are all these $@%&* punctuation signs, and how do I know when to use them?
+
+=item *
+
+Do I always/never have to quote my strings or use semicolons and commas?
+
+=item *
+
+How do I skip some return values?
+
+=item *
+
+How do I temporarily block warnings?
+
+=item *
+
+What's an extension?
+
+=item *
+
+Why do Perl operators have different precedence than C operators?
+
+=item *
+
+How do I declare/create a structure?
+
+=item *
+
+How do I create a module?
+
+=item *
+
+How do I create a class?
+
+=item *
+
+How can I tell if a variable is tainted?
+
+=item *
+
+What's a closure?
+
+=item *
+
+What is variable suicide and how can I prevent it?
+
+=item *
+
+How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regex}?
+
+=item *
+
+How do I create a static variable?
+
+=item *
+
+What's the difference between dynamic and lexical (static) scoping?  Between local() and my()?
+
+=item *
+
+How can I access a dynamic variable while a similarly named lexical is in scope?
+
+=item *
+
+What's the difference between deep and shallow binding?
+
+=item *
+
+Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
+
+=item *
+
+How do I redefine a builtin function, operator, or method?
+
+=item *
+
+What's the difference between calling a function as &foo and foo()?
+
+=item *
+
+How do I create a switch or case statement?
+
+=item *
+
+How can I catch accesses to undefined variables, functions, or methods?
+
+=item *
+
+Why can't a method included in this same file be found?
+
+=item *
+
+How can I find out my current package?
+
+=item *
+
+How can I comment out a large block of perl code?
+
+=item *
+
+How do I clear a package?
+
+=item *
+
+How can I use a variable as a variable name?
+
+=item *
+
+What does "bad interpreter" mean?
+
+=back
+
+
+=head2 L<perlfaq8>: System Interaction
+
+This section of the Perl FAQ covers questions involving operating system interaction. Topics include interprocess communication (IPC), control over the user-interface (keyboard, screen and pointing devices), and most anything else not related to data manipulation. Read the FAQs and documentation specific to the port of perl to your operating system (eg, L<perlvms>, L<perlplan9>, ...). These should contain more detailed information on the vagaries of your perl.
+
+=over 4
+
+=item *
+
+How do I find out which operating system I'm running under?
+
+=item *
+
+How come exec() doesn't return?
+
+=item *
+
+How do I do fancy stuff with the keyboard/screen/mouse?
+
+=item *
+
+How do I print something out in color?
+
+=item *
+
+How do I read just one key without waiting for a return key?
+
+=item *
+
+How do I check whether input is ready on the keyboard?
+
+=item *
+
+How do I clear the screen?
+
+=item *
+
+How do I get the screen size?
+
+=item *
+
+How do I ask the user for a password?
+
+=item *
+
+How do I read and write the serial port?
+
+=item *
+
+How do I decode encrypted password files?
+
+=item *
+
+How do I start a process in the background?
+
+=item *
+
+How do I trap control characters/signals?
+
+=item *
+
+How do I modify the shadow password file on a Unix system?
+
+=item *
+
+How do I set the time and date?
+
+=item *
+
+How can I sleep() or alarm() for under a second?
+
+=item *
+
+How can I measure time under a second?
+
+=item *
+
+How can I do an atexit() or setjmp()/longjmp()? (Exception handling)
+
+=item *
+
+Why doesn't my sockets program work under System V (Solaris)?  What does the error message "Protocol not supported" mean?
+
+=item *
+
+How can I call my system's unique C functions from Perl?
+
+=item *
+
+Where do I get the include files to do ioctl() or syscall()?
+
+=item *
+
+Why do setuid perl scripts complain about kernel problems?
+
+=item *
+
+How can I open a pipe both to and from a command?
+
+=item *
+
+Why can't I get the output of a command with system()?
+
+=item *
+
+How can I capture STDERR from an external command?
+
+=item *
+
+Why doesn't open() return an error when a pipe open fails?
+
+=item *
+
+What's wrong with using backticks in a void context?
+
+=item *
+
+How can I call backticks without shell processing?
+
+=item *
+
+Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)?
+
+=item *
+
+How can I convert my shell script to perl?
+
+=item *
+
+Can I use perl to run a telnet or ftp session?
+
+=item *
+
+How can I write expect in Perl?
+
+=item *
+
+Is there a way to hide perl's command line from programs such as "ps"?
+
+=item *
+
+I {changed directory, modified my environment} in a perl script.  How come the change disappeared when I exited the script?  How do I get my changes to be visible?
+
+=item *
+
+How do I close a process's filehandle without waiting for it to complete?
+
+=item *
+
+How do I fork a daemon process?
+
+=item *
+
+How do I find out if I'm running interactively or not?
+
+=item *
+
+How do I timeout a slow event?
+
+=item *
+
+How do I set CPU limits?
+
+=item *
+
+How do I avoid zombies on a Unix system?
+
+=item *
+
+How do I use an SQL database?
+
+=item *
+
+How do I make a system() exit on control-C?
+
+=item *
+
+How do I open a file without blocking?
+
+=item *
+
+How do I tell the difference between errors from the shell and perl?
+
+=item *
+
+How do I install a module from CPAN?
+
+=item *
+
+What's the difference between require and use?
+
+=item *
+
+How do I keep my own module/library directory?
+
+=item *
+
+How do I add the directory my program lives in to the module/library search path?
+
+=item *
+
+How do I add a directory to my include path (@INC) at runtime?
+
+=item *
+
+What is socket.ph and where do I get it?
+
+=back
+
+
+=head2 L<perlfaq9>: Networking
+
+Networking, the internet, and a few on the web.
+
+=over 4
+
+=item *
+
+What is the correct form of response from a CGI script?
+
+=item *
+
+My CGI script runs from the command line but not the browser.  (500 Server Error)
+
+=item *
+
+How can I get better error messages from a CGI program?
+
+=item *
+
+How do I remove HTML from a string?
+
+=item *
+
+How do I extract URLs?
+
+=item *
+
+How do I download a file from the user's machine?  How do I open a file on another machine?
+
+=item *
+
+How do I make a pop-up menu in HTML?
+
+=item *
+
+How do I fetch an HTML file?
+
+=item *
+
+How do I automate an HTML form submission?
+
+=item *
+
+How do I decode or create those %-encodings on the web?
+
+=item *
+
+How do I redirect to another page?
+
+=item *
+
+How do I put a password on my web pages?
+
+=item *
+
+How do I edit my .htpasswd and .htgroup files with Perl?
+
+=item *
+
+How do I make sure users can't enter values into a form that cause my CGI script to do bad things?
+
+=item *
+
+How do I parse a mail header?
+
+=item *
+
+How do I decode a CGI form?
+
+=item *
+
+How do I check a valid mail address?
+
+=item *
+
+How do I decode a MIME/BASE64 string?
+
+=item *
+
+How do I return the user's mail address?
+
+=item *
+
+How do I send mail?
+
+=item *
+
+How do I use MIME to make an attachment to a mail message?
+
+=item *
+
+How do I read mail?
+
+=item *
+
+How do I find out my hostname, domainname, or IP address?
+
+=item *
+
+How do I fetch a news article or the active newsgroups?
+
+=item *
+
+How do I fetch/put an FTP file?
+
+=item *
+
+How can I do RPC in Perl?
+
+=back
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq1.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq1.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq1.pod	(revision 14489)
@@ -0,0 +1,408 @@
+=head1 NAME
+
+perlfaq1 - General Questions About Perl ($Revision: 1.19 $, $Date: 2005/12/31 00:54:37 $)
+
+=head1 DESCRIPTION
+
+This section of the FAQ answers very general, high-level questions
+about Perl.
+
+=head2 What is Perl?
+
+Perl is a high-level programming language with an eclectic heritage
+written by Larry Wall and a cast of thousands.  It derives from the
+ubiquitous C programming language and to a lesser extent from sed,
+awk, the Unix shell, and at least a dozen other tools and languages.
+Perl's process, file, and text manipulation facilities make it
+particularly well-suited for tasks involving quick prototyping, system
+utilities, software tools, system management tasks, database access,
+graphical programming, networking, and world wide web programming.
+These strengths make it especially popular with system administrators
+and CGI script authors, but mathematicians, geneticists, journalists,
+and even managers also use Perl.  Maybe you should, too.
+
+=head2 Who supports Perl?  Who develops it?  Why is it free?
+
+The original culture of the pre-populist Internet and the deeply-held
+beliefs of Perl's author, Larry Wall, gave rise to the free and open
+distribution policy of perl.  Perl is supported by its users.  The
+core, the standard Perl library, the optional modules, and the
+documentation you're reading now were all written by volunteers.  See
+the personal note at the end of the README file in the perl source
+distribution for more details.  See L<perlhist> (new as of 5.005)
+for Perl's milestone releases.
+
+In particular, the core development team (known as the Perl Porters)
+are a rag-tag band of highly altruistic individuals committed to
+producing better software for free than you could hope to purchase for
+money.  You may snoop on pending developments via the archives at
+http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/
+and http://archive.develooper.com/perl5-porters@perl.org/
+or the news gateway nntp://nntp.perl.org/perl.perl5.porters or
+its web interface at http://nntp.perl.org/group/perl.perl5.porters ,
+or read the faq at http://simon-cozens.org/writings/p5p-faq ,
+or you can subscribe to the mailing list by sending
+perl5-porters-request@perl.org a subscription request
+(an empty message with no subject is fine).
+
+While the GNU project includes Perl in its distributions, there's no
+such thing as "GNU Perl".  Perl is not produced nor maintained by the
+Free Software Foundation.  Perl's licensing terms are also more open
+than GNU software's tend to be.
+
+You can get commercial support of Perl if you wish, although for most
+users the informal support will more than suffice.  See the answer to
+"Where can I buy a commercial version of perl?" for more information.
+
+=head2 Which version of Perl should I use?
+
+(contributed by brian d foy)
+
+There is often a matter of opinion and taste, and there isn't any
+one answer that fits anyone.  In general, you want to use either
+the current stable release, or the stable release immediately prior
+to that one.  Currently, those are perl5.8.x and perl5.6.x, respectively.
+
+Beyond that, you have to consider several things and decide which
+is best for you.
+
+=over 4
+
+=item *
+
+If things aren't broken, upgrading perl may break
+them (or at least issue new warnings).
+
+=item *
+
+The latest versions of perl have more bug fixes.
+
+=item *
+
+The Perl community is geared toward supporting the most
+recent releases, so you'll have an easier time finding help for
+those.
+
+=item *
+
+Versions prior to perl5.004 had serious security problems with
+buffer overflows, and in some cases have CERT advisories (for
+instance, http://www.cert.org/advisories/CA-1997-17.html ).
+
+=item *
+
+The latest versions are probably the least deployed and
+widely tested, so you may want to wait a few months after their
+release and see what problems others have if you are risk averse.
+
+=item *
+
+The immediate, previous releases (i.e. perl5.6.x ) are usually
+maintained for a while, although not at the same level as the
+current releases.
+
+=item *
+
+No one is actively supporting perl4.x.  Five years ago it was
+a dead camel carcass (according to this document).  Now it's barely
+a skeleton as its whitewashed bones have fractured or eroded.
+
+=item *
+
+There is no perl6.x for the next couple of years.  Stay tuned,
+but don't worry that you'll have to change major versions of Perl
+soon (i.e. before 2006).
+
+=item *
+
+There are really two tracks of perl development: a
+maintenance version and an experimental version.  The
+maintenance versions are stable, and have an even number
+as the minor release (i.e. perl5.8.x, where 8 is the minor
+release).  The experimental versions may include features that
+don't make it into the stable versions, and have an odd number
+as the minor release (i.e. perl5.9.x, where 9 is the minor release).
+
+=back
+
+
+=head2 What are perl4, perl5, or perl6?
+
+(contributed by brian d foy)
+
+In short, perl4 is the past, perl5 is the present, and perl6 is the
+future.
+
+The number after perl (i.e. the 5 after perl5) is the major release
+of the perl interpreter as well as the version of the language.  Each
+major version has significant differences that earlier versions cannot
+support.
+
+The current major release of Perl is perl5, and was released in 1994.
+It can run scripts from the previous major release, perl4 (March 1991),
+but has significant differences. It introduced the concept of references,
+complex data structures, and modules.  The perl5 interpreter was a
+complete re-write of the previous perl sources.
+
+Perl6 is the next major version of Perl, but it's still in development
+in both its syntax and design.  The work started in 2002 and is still
+ongoing.  Many of the most interesting features have shown up in the
+latest versions of perl5, and some perl5 modules allow you to use some
+perl6 syntax in your programs.  You can learn more about perl6 at
+http://dev.perl.org/perl6/ .
+
+See L<perlhist> for a history of Perl revisions.
+
+=head2 What is Ponie?
+
+At The O'Reilly Open Source Software Convention in 2003, Artur
+Bergman, Fotango, and The Perl Foundation announced a project to
+run perl5 on the Parrot virtual machine named Ponie. Ponie stands for
+Perl On New Internal Engine.  The Perl 5.10 language implementation
+will be used for Ponie, and there will be no language level
+differences between perl5 and ponie.  Ponie is not a complete rewrite
+of perl5.
+
+For more details, see http://www.poniecode.org/
+
+=head2 What is perl6?
+
+At The Second O'Reilly Open Source Software Convention, Larry Wall
+announced Perl6 development would begin in earnest. Perl6 was an oft
+used term for Chip Salzenberg's project to rewrite Perl in C++ named
+Topaz. However, Topaz provided valuable insights to the next version
+of Perl and its implementation, but was ultimately abandoned.
+
+If you want to learn more about Perl6, or have a desire to help in
+the crusade to make Perl a better place then peruse the Perl6 developers
+page at http://dev.perl.org/perl6/ and get involved.
+
+Perl6 is not scheduled for release yet, and Perl5 will still be supported
+for quite awhile after its release. Do not wait for Perl6 to do whatever
+you need to do.
+
+"We're really serious about reinventing everything that needs reinventing."
+--Larry Wall
+
+=head2 How stable is Perl?
+
+Production releases, which incorporate bug fixes and new functionality,
+are widely tested before release.  Since the 5.000 release, we have
+averaged only about one production release per year.
+
+Larry and the Perl development team occasionally make changes to the
+internal core of the language, but all possible efforts are made toward
+backward compatibility.  While not quite all perl4 scripts run flawlessly
+under perl5, an update to perl should nearly never invalidate a program
+written for an earlier version of perl (barring accidental bug fixes
+and the rare new keyword).
+
+=head2 Is Perl difficult to learn?
+
+No, Perl is easy to start learning--and easy to keep learning.  It looks
+like most programming languages you're likely to have experience
+with, so if you've ever written a C program, an awk script, a shell
+script, or even a BASIC program, you're already partway there.
+
+Most tasks only require a small subset of the Perl language.  One of
+the guiding mottos for Perl development is "there's more than one way
+to do it" (TMTOWTDI, sometimes pronounced "tim toady").  Perl's
+learning curve is therefore shallow (easy to learn) and long (there's
+a whole lot you can do if you really want).
+
+Finally, because Perl is frequently (but not always, and certainly not by
+definition) an interpreted language, you can write your programs and test
+them without an intermediate compilation step, allowing you to experiment
+and test/debug quickly and easily.  This ease of experimentation flattens
+the learning curve even more.
+
+Things that make Perl easier to learn: Unix experience, almost any kind
+of programming experience, an understanding of regular expressions, and
+the ability to understand other people's code.  If there's something you
+need to do, then it's probably already been done, and a working example is
+usually available for free.  Don't forget the new perl modules, either.
+They're discussed in Part 3 of this FAQ, along with CPAN, which is
+discussed in Part 2.
+
+=head2 How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl?
+
+Favorably in some areas, unfavorably in others.  Precisely which areas
+are good and bad is often a personal choice, so asking this question
+on Usenet runs a strong risk of starting an unproductive Holy War.
+
+Probably the best thing to do is try to write equivalent code to do a
+set of tasks.  These languages have their own newsgroups in which you
+can learn about (but hopefully not argue about) them.
+
+Some comparison documents can be found at http://www.perl.com/doc/FMTEYEWTK/versus/
+if you really can't stop yourself.
+
+=head2 Can I do [task] in Perl?
+
+Perl is flexible and extensible enough for you to use on virtually any
+task, from one-line file-processing tasks to large, elaborate systems.
+For many people, Perl serves as a great replacement for shell scripting.
+For others, it serves as a convenient, high-level replacement for most of
+what they'd program in low-level languages like C or C++.  It's ultimately
+up to you (and possibly your management) which tasks you'll use Perl
+for and which you won't.
+
+If you have a library that provides an API, you can make any component
+of it available as just another Perl function or variable using a Perl
+extension written in C or C++ and dynamically linked into your main
+perl interpreter.  You can also go the other direction, and write your
+main program in C or C++, and then link in some Perl code on the fly,
+to create a powerful application.  See L<perlembed>.
+
+That said, there will always be small, focused, special-purpose
+languages dedicated to a specific problem domain that are simply more
+convenient for certain kinds of problems.  Perl tries to be all things
+to all people, but nothing special to anyone.  Examples of specialized
+languages that come to mind include prolog and matlab.
+
+=head2 When shouldn't I program in Perl?
+
+When your manager forbids it--but do consider replacing them :-).
+
+Actually, one good reason is when you already have an existing
+application written in another language that's all done (and done
+well), or you have an application language specifically designed for a
+certain task (e.g. prolog, make).
+
+For various reasons, Perl is probably not well-suited for real-time
+embedded systems, low-level operating systems development work like
+device drivers or context-switching code, complex multi-threaded
+shared-memory applications, or extremely large applications.  You'll
+notice that perl is not itself written in Perl.
+
+The new, native-code compiler for Perl may eventually reduce the
+limitations given in the previous statement to some degree, but understand
+that Perl remains fundamentally a dynamically typed language, not
+a statically typed one.  You certainly won't be chastised if you don't
+trust nuclear-plant or brain-surgery monitoring code to it.  And Larry
+will sleep easier, too--Wall Street programs not withstanding. :-)
+
+=head2 What's the difference between "perl" and "Perl"?
+
+One bit.  Oh, you weren't talking ASCII? :-) Larry now uses "Perl" to
+signify the language proper and "perl" the implementation of it,
+i.e. the current interpreter.  Hence Tom's quip that "Nothing but perl
+can parse Perl."  You may or may not choose to follow this usage.  For
+example, parallelism means "awk and perl" and "Python and Perl" look
+OK, while "awk and Perl" and "Python and perl" do not.  But never
+write "PERL", because perl is not an acronym, apocryphal
+folklore and post-facto expansions notwithstanding.
+
+=head2 Is it a Perl program or a Perl script?
+
+Larry doesn't really care.  He says (half in jest) that "a script is
+what you give the actors.  A program is what you give the audience."
+
+Originally, a script was a canned sequence of normally interactive
+commands--that is, a chat script.  Something like a UUCP or PPP chat
+script or an expect script fits the bill nicely, as do configuration
+scripts run by a program at its start up, such F<.cshrc> or F<.ircrc>,
+for example.  Chat scripts were just drivers for existing programs,
+not stand-alone programs in their own right.
+
+A computer scientist will correctly explain that all programs are
+interpreted and that the only question is at what level.  But if you
+ask this question of someone who isn't a computer scientist, they might
+tell you that a I<program> has been compiled to physical machine code
+once and can then be run multiple times, whereas a I<script> must be
+translated by a program each time it's used.
+
+Perl programs are (usually) neither strictly compiled nor strictly
+interpreted.  They can be compiled to a byte-code form (something of a
+Perl virtual machine) or to completely different languages, like C or
+assembly language.  You can't tell just by looking at it whether the
+source is destined for a pure interpreter, a parse-tree interpreter,
+a byte-code interpreter, or a native-code compiler, so it's hard to give
+a definitive answer here.
+
+Now that "script" and "scripting" are terms that have been seized by
+unscrupulous or unknowing marketeers for their own nefarious purposes,
+they have begun to take on strange and often pejorative meanings,
+like "non serious" or "not real programming".  Consequently, some Perl
+programmers prefer to avoid them altogether.
+
+=head2 What is a JAPH?
+
+These are the "just another perl hacker" signatures that some people
+sign their postings with.  Randal Schwartz made these famous.  About
+100 of the earlier ones are available from
+http://www.cpan.org/misc/japh .
+
+=head2 Where can I get a list of Larry Wall witticisms?
+
+Over a hundred quips by Larry, from postings of his or source code,
+can be found at http://www.cpan.org/misc/lwall-quotes.txt.gz .
+
+=head2 How can I convince my sysadmin/supervisor/employees to use version 5/5.6.1/Perl instead of some other language?
+
+If your manager or employees are wary of unsupported software, or
+software which doesn't officially ship with your operating system, you
+might try to appeal to their self-interest.  If programmers can be
+more productive using and utilizing Perl constructs, functionality,
+simplicity, and power, then the typical manager/supervisor/employee
+may be persuaded.  Regarding using Perl in general, it's also
+sometimes helpful to point out that delivery times may be reduced
+using Perl compared to other languages.
+
+If you have a project which has a bottleneck, especially in terms of
+translation or testing, Perl almost certainly will provide a viable,
+quick solution.  In conjunction with any persuasion effort, you
+should not fail to point out that Perl is used, quite extensively, and
+with extremely reliable and valuable results, at many large computer
+software and hardware companies throughout the world.  In fact,
+many Unix vendors now ship Perl by default.  Support is usually
+just a news-posting away, if you can't find the answer in the
+I<comprehensive> documentation, including this FAQ.
+
+See http://www.perl.org/advocacy/ for more information.
+
+If you face reluctance to upgrading from an older version of perl,
+then point out that version 4 is utterly unmaintained and unsupported
+by the Perl Development Team.  Another big sell for Perl5 is the large
+number of modules and extensions which greatly reduce development time
+for any given task.  Also mention that the difference between version
+4 and version 5 of Perl is like the difference between awk and C++.
+(Well, OK, maybe it's not quite that distinct, but you get the idea.)
+If you want support and a reasonable guarantee that what you're
+developing will continue to work in the future, then you have to run
+the supported version.  As of December 2003 that means running either
+5.8.2 (released in November 2003), or one of the older releases like
+5.6.2 (also released in November 2003; a maintenance release to let perl
+5.6 compile on newer systems as 5.6.1 was released in April 2001) or
+5.005_03 (released in March 1999),
+although 5.004_05 isn't that bad if you B<absolutely> need such an old
+version (released in April 1999) for stability  reasons.
+Anything older than 5.004_05 shouldn't be used.
+
+Of particular note is the massive bug hunt for buffer overflow
+problems that went into the 5.004 release.  All releases prior to
+that, including perl4, are considered insecure and should be upgraded
+as soon as possible.
+
+In August 2000 in all Linux distributions a new security problem was
+found in the optional 'suidperl' (not built or installed by default)
+in all the Perl branches 5.6, 5.005, and 5.004, see
+http://www.cpan.org/src/5.0/sperl-2000-08-05/
+Perl maintenance releases 5.6.1 and 5.8.0 have this security hole closed.
+Most, if not all, Linux distribution have patches for this
+vulnerability available, see http://www.linuxsecurity.com/advisories/ ,
+but the most recommendable way is to upgrade to at least Perl 5.6.1.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2006 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples here are in the public
+domain.  You are permitted and encouraged to use this code and any
+derivatives thereof in your own programs for fun or for profit as you
+see fit.  A simple comment in the code giving credit to the FAQ would
+be courteous but is not required.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq2.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq2.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq2.pod	(revision 14489)
@@ -0,0 +1,529 @@
+=head1 NAME
+
+perlfaq2 - Obtaining and Learning about Perl ($Revision: 1.39 $, $Date: 2006/01/08 14:27:07 $)
+
+=head1 DESCRIPTION
+
+This section of the FAQ answers questions about where to find
+source and documentation for Perl, support, and
+related matters.
+
+=head2 What machines support perl?  Where do I get it?
+
+The standard release of perl (the one maintained by the perl
+development team) is distributed only in source code form.  You
+can find this at http://www.cpan.org/src/latest.tar.gz , which
+is in a standard Internet format (a gzipped archive in POSIX tar format).
+
+Perl builds and runs on a bewildering number of platforms.  Virtually
+all known and current Unix derivatives are supported (perl's native
+platform), as are other systems like VMS, DOS, OS/2, Windows,
+QNX, BeOS, OS X, MPE/iX and the Amiga.
+
+Binary distributions for some proprietary platforms, including
+Apple systems, can be found http://www.cpan.org/ports/ directory.
+Because these are not part of the standard distribution, they may
+and in fact do differ from the base perl port in a variety of ways.
+You'll have to check their respective release notes to see just
+what the differences are.  These differences can be either positive
+(e.g. extensions for the features of the particular platform that
+are not supported in the source release of perl) or negative (e.g.
+might be based upon a less current source release of perl).
+
+=head2 How can I get a binary version of perl?
+
+If you don't have a C compiler because your vendor for whatever
+reasons did not include one with your system, the best thing to do is
+grab a binary version of gcc from the net and use that to compile perl
+with.  CPAN only has binaries for systems that are terribly hard to
+get free compilers for, not for Unix systems.
+
+Some URLs that might help you are:
+
+    http://www.cpan.org/ports/
+    http://www.perl.com/pub/language/info/software.html
+
+Someone looking for a perl for Win16 might look to Laszlo Molnar's djgpp
+port in http://www.cpan.org/ports/#msdos , which comes with clear
+installation instructions.  A simple installation guide for MS-DOS using
+Ilya Zakharevich's OS/2 port is available at
+http://www.cs.ruu.nl/%7Epiet/perl5dos.html
+and similarly for Windows 3.1 at http://www.cs.ruu.nl/%7Epiet/perlwin3.html .
+
+=head2 I don't have a C compiler. How can I build my own Perl interpreter?
+
+Since you don't have a C compiler, you're doomed and your vendor
+should be sacrificed to the Sun gods.  But that doesn't help you.
+
+What you need to do is get a binary version of gcc for your system
+first.  Consult the Usenet FAQs for your operating system for
+information on where to get such a binary version.
+
+=head2 I copied the perl binary from one machine to another, but scripts don't work.
+
+That's probably because you forgot libraries, or library paths differ.
+You really should build the whole distribution on the machine it will
+eventually live on, and then type C<make install>.  Most other
+approaches are doomed to failure.
+
+One simple way to check that things are in the right place is to print out
+the hard-coded @INC that perl looks through for libraries:
+
+    % perl -le 'print for @INC'
+
+If this command lists any paths that don't exist on your system, then you
+may need to move the appropriate libraries to these locations, or create
+symbolic links, aliases, or shortcuts appropriately.  @INC is also printed as
+part of the output of
+
+    % perl -V
+
+You might also want to check out
+L<perlfaq8/"How do I keep my own module/library directory?">.
+
+=head2 I grabbed the sources and tried to compile but gdbm/dynamic loading/malloc/linking/... failed.  How do I make it work?
+
+Read the F<INSTALL> file, which is part of the source distribution.
+It describes in detail how to cope with most idiosyncrasies that the
+Configure script can't work around for any given system or
+architecture.
+
+=head2 What modules and extensions are available for Perl?  What is CPAN?  What does CPAN/src/... mean?
+
+CPAN stands for Comprehensive Perl Archive Network, a ~1.2Gb archive
+replicated on nearly 200 machines all over the world.  CPAN contains
+source code, non-native ports, documentation, scripts, and many
+third-party modules and extensions, designed for everything from
+commercial database interfaces to keyboard/screen control to web
+walking and CGI scripts.  The master web site for CPAN is
+http://www.cpan.org/ and there is the CPAN Multiplexer at
+http://www.cpan.org/CPAN.html which will choose a mirror near you
+via DNS.  See http://www.perl.com/CPAN (without a slash at the
+end) for how this process works. Also, http://mirror.cpan.org/
+has a nice interface to the http://www.cpan.org/MIRRORED.BY
+mirror directory.
+
+See the CPAN FAQ at http://www.cpan.org/misc/cpan-faq.html for
+answers to the most frequently asked questions about CPAN
+including how to become a mirror.
+
+CPAN/path/... is a naming convention for files available on CPAN
+sites.  CPAN indicates the base directory of a CPAN mirror, and the
+rest of the path is the path from that directory to the file.  For
+instance, if you're using ftp://ftp.funet.fi/pub/languages/perl/CPAN
+as your CPAN site, the file CPAN/misc/japh is downloadable as
+ftp://ftp.funet.fi/pub/languages/perl/CPAN/misc/japh .
+
+Considering that there are close to two thousand existing modules in
+the archive, one probably exists to do nearly anything you can think of.
+Current categories under CPAN/modules/by-category/ include Perl core
+modules; development support; operating system interfaces; networking,
+devices, and interprocess communication; data type utilities; database
+interfaces; user interfaces; interfaces to other languages; filenames,
+file systems, and file locking; internationalization and locale; world
+wide web support; server and daemon utilities; archiving and
+compression; image manipulation; mail and news; control flow
+utilities; filehandle and I/O; Microsoft Windows modules; and
+miscellaneous modules.
+
+See http://www.cpan.org/modules/00modlist.long.html or
+http://search.cpan.org/ for a more complete list of modules by category.
+
+CPAN is not affiliated with O'Reilly Media.
+
+=head2 Is there an ISO or ANSI certified version of Perl?
+
+Certainly not.  Larry expects that he'll be certified before Perl is.
+
+=head2 Where can I get information on Perl?
+
+The complete Perl documentation is available with the Perl distribution.
+If you have Perl installed locally, you probably have the documentation
+installed as well: type C<man perl> if you're on a system resembling Unix.
+This will lead you to other important man pages, including how to set your
+$MANPATH.  If you're not on a Unix system, access to the documentation
+will be different; for example, documentation might only be in HTML format.  All
+proper perl installations have fully-accessible documentation.
+
+You might also try C<perldoc perl> in case your system doesn't
+have a proper man command, or it's been misinstalled.  If that doesn't
+work, try looking in /usr/local/lib/perl5/pod for documentation.
+
+If all else fails, consult http://perldoc.perl.org/ which has the
+complete documentation in HTML and PDF format.
+
+Many good books have been written about Perl--see the section below
+for more details.
+
+Tutorial documents are included in current or upcoming Perl releases
+include L<perltoot> for objects or L<perlboot> for a beginner's
+approach to objects, L<perlopentut> for file opening semantics,
+L<perlreftut> for managing references, L<perlretut> for regular
+expressions, L<perlthrtut> for threads, L<perldebtut> for debugging,
+and L<perlxstut> for linking C and Perl together.  There may be more
+by the time you read this.  These URLs might also be useful:
+
+    http://perldoc.perl.org/
+    http://bookmarks.cpan.org/search.cgi?cat=Training%2FTutorials
+
+=head2 What are the Perl newsgroups on Usenet?  Where do I post questions?
+
+Several groups devoted to the Perl language are on Usenet:
+
+    comp.lang.perl.announce 		Moderated announcement group
+    comp.lang.perl.misc     		High traffic general Perl discussion
+    comp.lang.perl.moderated        Moderated discussion group
+    comp.lang.perl.modules  		Use and development of Perl modules
+    comp.lang.perl.tk           	Using Tk (and X) from Perl
+
+    comp.infosystems.www.authoring.cgi 	Writing CGI scripts for the Web.
+
+Some years ago, comp.lang.perl was divided into those groups, and
+comp.lang.perl itself officially removed.  While that group may still
+be found on some news servers, it is unwise to use it, because
+postings there will not appear on news servers which honour the
+official list of group names.  Use comp.lang.perl.misc for topics
+which do not have a more-appropriate specific group.
+
+There is also a Usenet gateway to Perl mailing lists sponsored by
+perl.org at nntp://nntp.perl.org , a web interface to the same lists
+at http://nntp.perl.org/group/ and these lists are also available
+under the C<perl.*> hierarchy at http://groups.google.com . Other
+groups are listed at http://lists.perl.org/ ( also known as
+http://lists.cpan.org/ ).
+
+A nice place to ask questions is the PerlMonks site,
+http://www.perlmonks.org/ , or the Perl Beginners mailing list
+http://lists.perl.org/showlist.cgi?name=beginners .
+
+Note that none of the above are supposed to write your code for you:
+asking questions about particular problems or general advice is fine,
+but asking someone to write your code for free is not very cool.
+
+=head2 Where should I post source code?
+
+You should post source code to whichever group is most appropriate, but
+feel free to cross-post to comp.lang.perl.misc.  If you want to cross-post
+to alt.sources, please make sure it follows their posting standards,
+including setting the Followup-To header line to NOT include alt.sources;
+see their FAQ ( http://www.faqs.org/faqs/alt-sources-intro/ ) for details.
+
+If you're just looking for software, first use Google
+( http://www.google.com ), Google's usenet search interface
+( http://groups.google.com ),  and CPAN Search ( http://search.cpan.org ).
+This is faster and more productive than just posting a request.
+
+=head2 Perl Books
+
+A number of books on Perl and/or CGI programming are available.  A few
+of these are good, some are OK, but many aren't worth your money.
+There is a list of these books, some with extensive reviews, at
+http://books.perl.org/ . If you don't see your book listed here, you
+can write to perlfaq-workers@perl.org .
+
+The incontestably definitive reference book on Perl, written by
+the creator of Perl, is Programming Perl:
+
+	Programming Perl (the "Camel Book"):
+	by Larry Wall, Tom Christiansen, and Jon Orwant
+	ISBN 0-596-00027-8  [3rd edition July 2000]
+	http://www.oreilly.com/catalog/pperl3/
+	(English, translations to several languages are also available)
+
+The companion volume to the Camel containing thousands
+of real-world examples, mini-tutorials, and complete programs is:
+
+	The Perl Cookbook (the "Ram Book"):
+	by Tom Christiansen and Nathan Torkington,
+	    with Foreword by Larry Wall
+	ISBN 0-596-00313-7 [2nd Edition August 2003]
+	http://www.oreilly.com/catalog/perlckbk2/
+
+If you're already a seasoned programmer, then the Camel Book might
+suffice for you to learn Perl.  If you're not, check out the
+Llama book:
+
+	Learning Perl
+	by Randal L. Schwartz, Tom Phoenix, and brian d foy
+	ISBN 0-596-10105-8 [4th edition July 2005]
+	http://www.oreilly.com/catalog/learnperl4/
+
+And for more advanced information on writing larger programs,
+presented in the same style as the Llama book, continue your education
+with the Alpaca book:
+
+	Learning Perl Objects, References, and Modules (the "Alpaca Book")
+	by Randal L. Schwartz, with Tom Phoenix (foreword by Damian Conway)
+	ISBN 0-596-00478-8 [1st edition June 2003]
+	http://www.oreilly.com/catalog/lrnperlorm/
+
+If you're not an accidental programmer, but a more serious and
+possibly even degreed computer scientist who doesn't need as much
+hand-holding as we try to provide in the Llama, please check out the
+delightful book
+
+	Perl: The Programmer's Companion
+	by Nigel Chapman
+	ISBN 0-471-97563-X [1997, 3rd printing Spring 1998]
+	http://www.wiley.com/compbooks/catalog/97563-X.htm
+	http://www.wiley.com/compbooks/chapman/perl/perltpc.html (errata etc)
+
+If you are more at home in Windows the following is available
+(though unfortunately rather dated).
+
+	Learning Perl on Win32 Systems (the "Gecko Book")
+	by Randal L. Schwartz, Erik Olson, and Tom Christiansen,
+	    with foreword by Larry Wall
+	ISBN 1-56592-324-3 [1st edition August 1997]
+	http://www.oreilly.com/catalog/lperlwin/
+
+Addison-Wesley ( http://www.awlonline.com/ ) and Manning
+( http://www.manning.com/ ) are also publishers of some fine Perl books
+such as I<Object Oriented Programming with Perl> by Damian Conway and
+I<Network Programming with Perl> by Lincoln Stein.
+
+An excellent technical book discounter is Bookpool at
+http://www.bookpool.com/ where a 30% discount or more is not unusual.
+
+What follows is a list of the books that the FAQ authors found personally
+useful.  Your mileage may (but, we hope, probably won't) vary.
+
+Recommended books on (or mostly on) Perl follow.
+
+=over 4
+
+=item References
+
+	Programming Perl
+	by Larry Wall, Tom Christiansen, and Jon Orwant
+	ISBN 0-596-00027-8 [3rd edition July 2000]
+	http://www.oreilly.com/catalog/pperl3/
+
+	Perl 5 Pocket Reference
+	by Johan Vromans
+	ISBN 0-596-00032-4 [3rd edition May 2000]
+	http://www.oreilly.com/catalog/perlpr3/
+
+=item Tutorials
+
+	Beginning Perl
+	by James Lee
+	ISBN 1-59059-391-X [2nd edition August 2004]
+	http://apress.com/book/bookDisplay.html?bID=344
+
+	Elements of Programming with Perl
+	by Andrew L. Johnson
+	ISBN 1-884777-80-5 [1st edition October 1999]
+	http://www.manning.com/Johnson/
+
+	Learning Perl
+	by Randal L. Schwartz, Tom Phoenix, and brian d foy
+	ISBN 0-596-10105-8 [4th edition July 2005]
+	http://www.oreilly.com/catalog/learnperl4/
+
+	Learning Perl Objects, References, and Modules
+	by Randal L. Schwartz, with Tom Phoenix (foreword by Damian Conway)
+	ISBN 0-596-00478-8 [1st edition June 2003]
+	http://www.oreilly.com/catalog/lrnperlorm/
+
+=item Task-Oriented
+
+	Writing Perl Modules for CPAN
+	by Sam Tregar
+	ISBN 1-59059-018-X [1st edition Aug 2002]
+	http://apress.com/book/bookDisplay.html?bID=14
+
+	The Perl Cookbook
+	by Tom Christiansen and Nathan Torkington
+	    with foreword by Larry Wall
+	ISBN 1-56592-243-3 [1st edition August 1998]
+	http://www.oreilly.com/catalog/cookbook/
+
+	Effective Perl Programming
+	by Joseph Hall
+	ISBN 0-201-41975-0 [1st edition 1998]
+	http://www.awl.com/
+
+	Real World SQL Server Administration with Perl
+	by Linchi Shea
+	ISBN 1-59059-097-X [1st edition July 2003]
+	http://apress.com/book/bookDisplay.html?bID=171
+
+=item Special Topics
+
+	Perl Best Practices
+	by Damian Conway
+	ISBN: 0-596-00173-8 [1st edition July 2005]
+	http://www.oreilly.com/catalog/perlbp/
+
+	Higher Order Perl
+	by Mark-Jason Dominus
+	ISBN: 1558607013 [1st edition March 2005]
+	http://hop.perl.plover.com/
+
+	Perl 6 Now: The Core Ideas Illustrated with Perl 5
+	by Scott Walters
+	ISBN 1-59059-395-2 [1st edition December 2004]
+	http://apress.com/book/bookDisplay.html?bID=355
+
+	Mastering Regular Expressions
+	by Jeffrey E. F. Friedl
+	ISBN 0-596-00289-0 [2nd edition July 2002]
+	http://www.oreilly.com/catalog/regex2/
+
+	Network Programming with Perl
+	by Lincoln Stein
+	ISBN 0-201-61571-1 [1st edition 2001]
+	http://www.awlonline.com/
+
+	Object Oriented Perl
+	Damian Conway
+	    with foreword by Randal L. Schwartz
+	ISBN 1-884777-79-1 [1st edition August 1999]
+	http://www.manning.com/Conway/
+
+	Data Munging with Perl
+	Dave Cross
+	ISBN 1-930110-00-6 [1st edition 2001]
+	http://www.manning.com/cross
+
+	Mastering Perl/Tk
+	by Steve Lidie and Nancy Walsh
+	ISBN 1-56592-716-8 [1st edition January 2002]
+	http://www.oreilly.com/catalog/mastperltk/
+
+	Extending and Embedding Perl
+	by Tim Jenness and Simon Cozens
+	ISBN 1-930110-82-0 [1st edition August 2002]
+	http://www.manning.com/jenness
+
+	Perl Debugger Pocket Reference
+	by Richard Foley
+	ISBN 0-596-00503-2 [1st edition January 2004]
+	http://www.oreilly.com/catalog/perldebugpr/
+
+=back
+
+=head2 Which magazines have Perl content?
+
+The first (and for a long time, only) periodical devoted to All Things Perl,
+I<The Perl Journal> contains tutorials, demonstrations, case studies,
+announcements, contests, and much more.  I<TPJ> has columns on web
+development, databases, Win32 Perl, graphical programming, regular
+expressions, and networking, and sponsors the Obfuscated Perl Contest
+and the Perl Poetry Contests.  Beginning in November 2002, TPJ moved to a
+reader-supported monthly e-zine format in which subscribers can download
+issues as PDF documents. For more details on TPJ, see http://www.tpj.com/
+
+Beyond this, magazines that frequently carry quality articles on
+Perl are I<The Perl Review> ( http://www.theperlreview.com ),
+I<Unix Review> ( http://www.unixreview.com/ ),
+I<Linux Magazine> ( http://www.linuxmagazine.com/ ),
+and Usenix's newsletter/magazine to its members, I<login:>
+( http://www.usenix.org/ )
+
+The Perl columns of Randal L. Schwartz are available on the web at
+http://www.stonehenge.com/merlyn/WebTechniques/ ,
+http://www.stonehenge.com/merlyn/UnixReview/ , and
+http://www.stonehenge.com/merlyn/LinuxMag/ .
+
+=head2 What mailing lists are there for Perl?
+
+Most of the major modules (Tk, CGI, libwww-perl) have their own
+mailing lists.  Consult the documentation that came with the module for
+subscription information.
+
+A comprehensive list of Perl related mailing lists can be found at:
+
+	http://lists.perl.org/
+
+=head2 Where are the archives for comp.lang.perl.misc?
+
+The Google search engine now carries archived and searchable newsgroup
+content.
+
+http://groups.google.com/groups?group=comp.lang.perl.misc
+
+If you have a question, you can be sure someone has already asked the
+same question at some point on c.l.p.m. It requires some time and patience
+to sift through all the content but often you will find the answer you
+seek.
+
+=head2 Where can I buy a commercial version of perl?
+
+In a real sense, perl already I<is> commercial software: it has a license
+that you can grab and carefully read to your manager. It is distributed
+in releases and comes in well-defined packages. There is a very large
+user community and an extensive literature.  The comp.lang.perl.*
+newsgroups and several of the mailing lists provide free answers to your
+questions in near real-time.  Perl has traditionally been supported by
+Larry, scores of software designers and developers, and myriad
+programmers, all working for free to create a useful thing to make life
+better for everyone.
+
+However, these answers may not suffice for managers who require a
+purchase order from a company whom they can sue should anything go awry.
+Or maybe they need very serious hand-holding and contractual obligations.
+Shrink-wrapped CDs with perl on them are available from several sources if
+that will help.  For example, many Perl books include a distribution of perl,
+as do the O'Reilly Perl Resource Kits (in both the Unix flavor
+and in the proprietary Microsoft flavor); the free Unix distributions
+also all come with perl.
+
+=head2 Where do I send bug reports?
+
+If you are reporting a bug in the perl interpreter or the modules
+shipped with Perl, use the I<perlbug> program in the Perl distribution or
+mail your report to perlbug@perl.org or at http://rt.perl.org/perlbug/ .
+
+For Perl modules, you can submit bug reports to the Request Tracker set
+up at http://rt.cpan.org .
+
+If you are posting a bug with a non-standard port (see the answer to
+"What platforms is perl available for?"), a binary distribution, or a
+non-standard module (such as Tk, CGI, etc), then please see the
+documentation that came with it to determine the correct place to post
+bugs.
+
+Read the perlbug(1) man page (perl5.004 or later) for more information.
+
+=head2 What is perl.com? Perl Mongers? pm.org? perl.org? cpan.org?
+
+Perl.com at http://www.perl.com/ is part of the O'Reilly Network, a
+subsidiary of O'Reilly Media.
+
+The Perl Foundation is an advocacy organization for the Perl language
+which maintains the web site http://www.perl.org/ as a general
+advocacy site for the Perl language. It uses the domain to provide
+general support services to the Perl community, including the hosting
+of mailing lists, web sites, and other services.  The web site
+http://www.perl.org/ is a general advocacy site for the Perl language,
+and there are many other sub-domains for special topics, such as
+
+	http://learn.perl.org/
+	http://use.perl.org/
+	http://jobs.perl.org/
+	http://lists.perl.org/
+
+Perl Mongers uses the pm.org domain for services related to Perl user
+groups, including the hosting of mailing lists and web sites.  See the
+Perl user group web site at http://www.pm.org/ for more information about
+joining, starting, or requesting services for a Perl user group.
+
+http://www.cpan.org/ is the Comprehensive Perl Archive Network,
+a replicated worldwide repository of Perl software, see
+the I<What is CPAN?> question earlier in this document.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2006 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples here are in the public
+domain.  You are permitted and encouraged to use this code and any
+derivatives thereof in your own programs for fun or for profit as you
+see fit.  A simple comment in the code giving credit to the FAQ would
+be courteous but is not required.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq3.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq3.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq3.pod	(revision 14489)
@@ -0,0 +1,990 @@
+=head1 NAME
+
+perlfaq3 - Programming Tools ($Revision: 1.56 $, $Date: 2005/12/31 00:54:37 $)
+
+=head1 DESCRIPTION
+
+This section of the FAQ answers questions related to programmer tools
+and programming support.
+
+=head2 How do I do (anything)?
+
+Have you looked at CPAN (see L<perlfaq2>)?  The chances are that
+someone has already written a module that can solve your problem.
+Have you read the appropriate manpages?  Here's a brief index:
+
+	Basics	        perldata, perlvar, perlsyn, perlop, perlsub
+	Execution	perlrun, perldebug
+	Functions	perlfunc
+	Objects		perlref, perlmod, perlobj, perltie
+	Data Structures	perlref, perllol, perldsc
+	Modules		perlmod, perlmodlib, perlsub
+	Regexes		perlre, perlfunc, perlop, perllocale
+	Moving to perl5	perltrap, perl
+	Linking w/C	perlxstut, perlxs, perlcall, perlguts, perlembed
+	Various 	http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz
+			(not a man-page but still useful, a collection
+			 of various essays on Perl techniques)
+
+A crude table of contents for the Perl manpage set is found in L<perltoc>.
+
+=head2 How can I use Perl interactively?
+
+The typical approach uses the Perl debugger, described in the
+perldebug(1) manpage, on an "empty" program, like this:
+
+    perl -de 42
+
+Now just type in any legal Perl code, and it will be immediately
+evaluated.  You can also examine the symbol table, get stack
+backtraces, check variable values, set breakpoints, and other
+operations typically found in symbolic debuggers.
+
+=head2 Is there a Perl shell?
+
+The psh (Perl sh) is currently at version 1.8. The Perl Shell is a shell
+that combines the interactive nature of a Unix shell with the power of
+Perl. The goal is a full featured shell that behaves as expected for
+normal shell activity and uses Perl syntax and functionality for
+control-flow statements and other things. You can get psh at
+http://sourceforge.net/projects/psh/ .
+
+Zoidberg is a similar project and provides a shell written in perl,
+configured in perl and operated in perl. It is intended as a login shell
+and development environment. It can be found at http://zoidberg.sf.net/
+or your local CPAN mirror.
+
+The Shell.pm module (distributed with Perl) makes Perl try commands
+which aren't part of the Perl language as shell commands.  perlsh from
+the source distribution is simplistic and uninteresting, but may still
+be what you want.
+
+=head2 How do I find which modules are installed on my system?
+
+You can use the ExtUtils::Installed module to show all installed
+distributions, although it can take awhile to do its magic.  The
+standard library which comes with Perl just shows up as "Perl" (although
+you can get those with Module::CoreList).
+
+	use ExtUtils::Installed;
+
+	my $inst    = ExtUtils::Installed->new();
+	my @modules = $inst->modules();
+
+If you want a list of all of the Perl module filenames, you
+can use File::Find::Rule.
+
+	use File::Find::Rule;
+
+	my @files = File::Find::Rule->file()->name( '*.pm' )->in( @INC );
+
+If you do not have that module, you can do the same thing
+with File::Find which is part of the standard library.
+
+    use File::Find;
+    my @files;
+
+    find(
+      sub {
+      	push @files, $File::Find::name
+      		if -f $File::Find::name && /\.pm$/
+      	},
+
+      @INC
+      );
+
+	print join "\n", @files;
+
+If you simply need to quickly check to see if a module is
+available, you can check for its documentation.  If you can
+read the documentation the module is most likely installed.
+If you cannot read the documentation, the module might not
+have any (in rare cases).
+
+	prompt% perldoc Module::Name
+
+You can also try to include the module in a one-liner to see if
+perl finds it.
+
+	perl -MModule::Name -e1
+
+=head2 How do I debug my Perl programs?
+
+Have you tried C<use warnings> or used C<-w>?  They enable warnings
+to detect dubious practices.
+
+Have you tried C<use strict>?  It prevents you from using symbolic
+references, makes you predeclare any subroutines that you call as bare
+words, and (probably most importantly) forces you to predeclare your
+variables with C<my>, C<our>, or C<use vars>.
+
+Did you check the return values of each and every system call?  The operating
+system (and thus Perl) tells you whether they worked, and if not
+why.
+
+  open(FH, "> /etc/cantwrite")
+    or die "Couldn't write to /etc/cantwrite: $!\n";
+
+Did you read L<perltrap>?  It's full of gotchas for old and new Perl
+programmers and even has sections for those of you who are upgrading
+from languages like I<awk> and I<C>.
+
+Have you tried the Perl debugger, described in L<perldebug>?  You can
+step through your program and see what it's doing and thus work out
+why what it's doing isn't what it should be doing.
+
+=head2 How do I profile my Perl programs?
+
+You should get the Devel::DProf module from the standard distribution
+(or separately on CPAN) and also use Benchmark.pm from the standard
+distribution.  The Benchmark module lets you time specific portions of
+your code, while Devel::DProf gives detailed breakdowns of where your
+code spends its time.
+
+Here's a sample use of Benchmark:
+
+  use Benchmark;
+
+  @junk = `cat /etc/motd`;
+  $count = 10_000;
+
+  timethese($count, {
+            'map' => sub { my @a = @junk;
+			   map { s/a/b/ } @a;
+			   return @a },
+            'for' => sub { my @a = @junk;
+			   for (@a) { s/a/b/ };
+			   return @a },
+           });
+
+This is what it prints (on one machine--your results will be dependent
+on your hardware, operating system, and the load on your machine):
+
+  Benchmark: timing 10000 iterations of for, map...
+         for:  4 secs ( 3.97 usr  0.01 sys =  3.98 cpu)
+         map:  6 secs ( 4.97 usr  0.00 sys =  4.97 cpu)
+
+Be aware that a good benchmark is very hard to write.  It only tests the
+data you give it and proves little about the differing complexities
+of contrasting algorithms.
+
+=head2 How do I cross-reference my Perl programs?
+
+The B::Xref module can be used to generate cross-reference reports
+for Perl programs.
+
+    perl -MO=Xref[,OPTIONS] scriptname.plx
+
+=head2 Is there a pretty-printer (formatter) for Perl?
+
+Perltidy is a Perl script which indents and reformats Perl scripts
+to make them easier to read by trying to follow the rules of the
+L<perlstyle>. If you write Perl scripts, or spend much time reading
+them, you will probably find it useful.  It is available at
+http://perltidy.sourceforge.net
+
+Of course, if you simply follow the guidelines in L<perlstyle>,
+you shouldn't need to reformat.  The habit of formatting your code
+as you write it will help prevent bugs.  Your editor can and should
+help you with this.  The perl-mode or newer cperl-mode for emacs
+can provide remarkable amounts of help with most (but not all)
+code, and even less programmable editors can provide significant
+assistance.  Tom Christiansen and many other VI users  swear by
+the following settings in vi and its clones:
+
+    set ai sw=4
+    map! ^O {^M}^[O^T
+
+Put that in your F<.exrc> file (replacing the caret characters
+with control characters) and away you go.  In insert mode, ^T is
+for indenting, ^D is for undenting, and ^O is for blockdenting--
+as it were.  A more complete example, with comments, can be found at
+http://www.cpan.org/authors/id/TOMC/scripts/toms.exrc.gz
+
+The a2ps http://www-inf.enst.fr/%7Edemaille/a2ps/black+white.ps.gz does
+lots of things related to generating nicely printed output of
+documents, as does enscript at http://people.ssh.fi/mtr/genscript/ .
+
+=head2 Is there a ctags for Perl?
+
+(contributed by brian d foy)
+
+Exuberent ctags supports Perl: http://ctags.sourceforge.net/
+
+You might also try pltags: http://www.mscha.com/pltags.zip
+
+=head2 Is there an IDE or Windows Perl Editor?
+
+Perl programs are just plain text, so any editor will do.
+
+If you're on Unix, you already have an IDE--Unix itself.  The UNIX
+philosophy is the philosophy of several small tools that each do one
+thing and do it well.  It's like a carpenter's toolbox.
+
+If you want an IDE, check the following (in alphabetical order, not
+order of preference):
+
+=over 4
+
+=item Eclipse
+
+http://e-p-i-c.sf.net/
+
+The Eclipse Perl Integration Project integrates Perl
+editing/debugging with Eclipse.
+
+=item Enginsite
+
+http://www.enginsite.com/
+
+Perl Editor by EngInSite is a complete integrated development
+environment (IDE) for creating, testing, and  debugging  Perl scripts;
+the tool runs on Windows 9x/NT/2000/XP or later.
+
+=item Komodo
+
+http://www.ActiveState.com/Products/Komodo/
+
+ActiveState's cross-platform (as of October 2004, that's Windows, Linux,
+and Solaris), multi-language IDE has Perl support, including a regular expression
+debugger and remote debugging.
+
+=item Open Perl IDE
+
+http://open-perl-ide.sourceforge.net/
+
+Open Perl IDE is an integrated development environment for writing
+and debugging Perl scripts with ActiveState's ActivePerl distribution
+under Windows 95/98/NT/2000.
+
+=item OptiPerl
+
+http://www.optiperl.com/
+
+OptiPerl is a Windows IDE with simulated CGI environment, including
+debugger and syntax highlighting editor.
+
+=item PerlBuilder
+
+http://www.solutionsoft.com/perl.htm
+
+PerlBuidler is an integrated development environment for Windows that
+supports Perl development.
+
+=item visiPerl+
+
+http://helpconsulting.net/visiperl/
+
+From Help Consulting, for Windows.
+
+=item Visual Perl
+
+http://www.activestate.com/Products/Visual_Perl/
+
+Visual Perl is a Visual Studio.NET plug-in from ActiveState.
+
+=item Zeus
+
+http://www.zeusedit.com/lookmain.html
+
+Zeus for Window is another Win32 multi-language editor/IDE
+that comes with support for Perl:
+
+=back
+
+For editors: if you're on Unix you probably have vi or a vi clone
+already, and possibly an emacs too, so you may not need to download
+anything. In any emacs the cperl-mode (M-x cperl-mode) gives you
+perhaps the best available Perl editing mode in any editor.
+
+If you are using Windows, you can use any editor that lets you work
+with plain text, such as NotePad or WordPad.  Word processors, such as
+Microsoft Word or WordPerfect, typically do not work since they insert
+all sorts of behind-the-scenes information, although some allow you to
+save files as "Text Only". You can also download text editors designed
+specifically for programming, such as Textpad (
+http://www.textpad.com/ ) and UltraEdit ( http://www.ultraedit.com/ ),
+among others.
+
+If you are using MacOS, the same concerns apply.  MacPerl (for Classic
+environments) comes with a simple editor. Popular external editors are
+BBEdit ( http://www.bbedit.com/ ) or Alpha (
+http://www.his.com/~jguyer/Alpha/Alpha8.html ). MacOS X users can use
+Unix editors as well. Neil Bowers (the man behind Geekcruises) has a
+list of Mac editors that can handle Perl (
+http://www.neilbowers.org/macperleditors.html ).
+
+=over 4
+
+=item GNU Emacs
+
+http://www.gnu.org/software/emacs/windows/ntemacs.html
+
+=item MicroEMACS
+
+http://www.microemacs.de/
+
+=item XEmacs
+
+http://www.xemacs.org/Download/index.html
+
+=item Jed
+
+http://space.mit.edu/~davis/jed/
+
+=back
+
+or a vi clone such as
+
+=over 4
+
+=item Elvis
+
+ftp://ftp.cs.pdx.edu/pub/elvis/ http://www.fh-wedel.de/elvis/
+
+=item Vile
+
+http://dickey.his.com/vile/vile.html
+
+=item Vim
+
+http://www.vim.org/
+
+=back
+
+For vi lovers in general, Windows or elsewhere:
+
+	http://www.thomer.com/thomer/vi/vi.html
+
+nvi ( http://www.bostic.com/vi/ , available from CPAN in src/misc/) is
+yet another vi clone, unfortunately not available for Windows, but in
+UNIX platforms you might be interested in trying it out, firstly because
+strictly speaking it is not a vi clone, it is the real vi, or the new
+incarnation of it, and secondly because you can embed Perl inside it
+to use Perl as the scripting language.  nvi is not alone in this,
+though: at least also vim and vile offer an embedded Perl.
+
+The following are Win32 multilanguage editor/IDESs that support Perl:
+
+=over 4
+
+=item Codewright
+
+http://www.borland.com/codewright/
+
+=item MultiEdit
+
+http://www.MultiEdit.com/
+
+=item SlickEdit
+
+http://www.slickedit.com/
+
+=back
+
+There is also a toyedit Text widget based editor written in Perl
+that is distributed with the Tk module on CPAN.  The ptkdb
+( http://world.std.com/~aep/ptkdb/ ) is a Perl/tk based debugger that
+acts as a development environment of sorts.  Perl Composer
+( http://perlcomposer.sourceforge.net/ ) is an IDE for Perl/Tk
+GUI creation.
+
+In addition to an editor/IDE you might be interested in a more
+powerful shell environment for Win32.  Your options include
+
+=over 4
+
+=item Bash
+
+from the Cygwin package ( http://sources.redhat.com/cygwin/ )
+
+=item Ksh
+
+from the MKS Toolkit ( http://www.mks.com/ ), or the Bourne shell of
+the U/WIN environment ( http://www.research.att.com/sw/tools/uwin/ )
+
+=item Tcsh
+
+ftp://ftp.astron.com/pub/tcsh/ , see also
+http://www.primate.wisc.edu/software/csh-tcsh-book/
+
+=item Zsh
+
+ftp://ftp.blarg.net/users/amol/zsh/ , see also http://www.zsh.org/
+
+=back
+
+MKS and U/WIN are commercial (U/WIN is free for educational and
+research purposes), Cygwin is covered by the GNU Public License (but
+that shouldn't matter for Perl use).  The Cygwin, MKS, and U/WIN all
+contain (in addition to the shells) a comprehensive set of standard
+UNIX toolkit utilities.
+
+If you're transferring text files between Unix and Windows using FTP
+be sure to transfer them in ASCII mode so the ends of lines are
+appropriately converted.
+
+On Mac OS the MacPerl Application comes with a simple 32k text editor
+that behaves like a rudimentary IDE.  In contrast to the MacPerl Application
+the MPW Perl tool can make use of the MPW Shell itself as an editor (with
+no 32k limit).
+
+=over 4
+
+=item Affrus
+
+is a full Perl development environment with full debugger support
+( http://www.latenightsw.com ).
+
+=item Alpha
+
+is an editor, written and extensible in Tcl, that nonetheless has
+built in support for several popular markup and programming languages
+including Perl and HTML ( http://www.his.com/~jguyer/Alpha/Alpha8.html ).
+
+=item BBEdit and BBEdit Lite
+
+are text editors for Mac OS that have a Perl sensitivity mode
+( http://web.barebones.com/ ).
+
+
+=back
+
+Pepper and Pe are programming language sensitive text editors for Mac
+OS X and BeOS respectively ( http://www.hekkelman.com/ ).
+
+=head2 Where can I get Perl macros for vi?
+
+For a complete version of Tom Christiansen's vi configuration file,
+see http://www.cpan.org/authors/Tom_Christiansen/scripts/toms.exrc.gz ,
+the standard benchmark file for vi emulators.  The file runs best with nvi,
+the current version of vi out of Berkeley, which incidentally can be built
+with an embedded Perl interpreter--see http://www.cpan.org/src/misc/ .
+
+=head2 Where can I get perl-mode for emacs?
+
+Since Emacs version 19 patchlevel 22 or so, there have been both a
+perl-mode.el and support for the Perl debugger built in.  These should
+come with the standard Emacs 19 distribution.
+
+In the Perl source directory, you'll find a directory called "emacs",
+which contains a cperl-mode that color-codes keywords, provides
+context-sensitive help, and other nifty things.
+
+Note that the perl-mode of emacs will have fits with C<"main'foo">
+(single quote), and mess up the indentation and highlighting.  You
+are probably using C<"main::foo"> in new Perl code anyway, so this
+shouldn't be an issue.
+
+=head2 How can I use curses with Perl?
+
+The Curses module from CPAN provides a dynamically loadable object
+module interface to a curses library.  A small demo can be found at the
+directory http://www.cpan.org/authors/Tom_Christiansen/scripts/rep.gz ;
+this program repeats a command and updates the screen as needed, rendering
+B<rep ps axu> similar to B<top>.
+
+=head2 How can I use X or Tk with Perl?
+
+Tk is a completely Perl-based, object-oriented interface to the Tk toolkit
+that doesn't force you to use Tcl just to get at Tk.  Sx is an interface
+to the Athena Widget set.  Both are available from CPAN.  See the
+directory http://www.cpan.org/modules/by-category/08_User_Interfaces/
+
+Invaluable for Perl/Tk programming are the Perl/Tk FAQ at
+http://phaseit.net/claird/comp.lang.perl.tk/ptkFAQ.html , the Perl/Tk Reference
+Guide available at
+http://www.cpan.org/authors/Stephen_O_Lidie/ , and the
+online manpages at
+http://www-users.cs.umn.edu/%7Eamundson/perl/perltk/toc.html .
+
+=head2 How can I make my Perl program run faster?
+
+The best way to do this is to come up with a better algorithm.  This
+can often make a dramatic difference.  Jon Bentley's book
+I<Programming Pearls> (that's not a misspelling!)  has some good tips
+on optimization, too.  Advice on benchmarking boils down to: benchmark
+and profile to make sure you're optimizing the right part, look for
+better algorithms instead of microtuning your code, and when all else
+fails consider just buying faster hardware.  You will probably want to
+read the answer to the earlier question "How do I profile my Perl
+programs?" if you haven't done so already.
+
+A different approach is to autoload seldom-used Perl code.  See the
+AutoSplit and AutoLoader modules in the standard distribution for
+that.  Or you could locate the bottleneck and think about writing just
+that part in C, the way we used to take bottlenecks in C code and
+write them in assembler.  Similar to rewriting in C, modules that have
+critical sections can be written in C (for instance, the PDL module
+from CPAN).
+
+If you're currently linking your perl executable to a shared
+I<libc.so>, you can often gain a 10-25% performance benefit by
+rebuilding it to link with a static libc.a instead.  This will make a
+bigger perl executable, but your Perl programs (and programmers) may
+thank you for it.  See the F<INSTALL> file in the source distribution
+for more information.
+
+The undump program was an ancient attempt to speed up Perl program by
+storing the already-compiled form to disk.  This is no longer a viable
+option, as it only worked on a few architectures, and wasn't a good
+solution anyway.
+
+=head2 How can I make my Perl program take less memory?
+
+When it comes to time-space tradeoffs, Perl nearly always prefers to
+throw memory at a problem.  Scalars in Perl use more memory than
+strings in C, arrays take more than that, and hashes use even more.  While
+there's still a lot to be done, recent releases have been addressing
+these issues.  For example, as of 5.004, duplicate hash keys are
+shared amongst all hashes using them, so require no reallocation.
+
+In some cases, using substr() or vec() to simulate arrays can be
+highly beneficial.  For example, an array of a thousand booleans will
+take at least 20,000 bytes of space, but it can be turned into one
+125-byte bit vector--a considerable memory savings.  The standard
+Tie::SubstrHash module can also help for certain types of data
+structure.  If you're working with specialist data structures
+(matrices, for instance) modules that implement these in C may use
+less memory than equivalent Perl modules.
+
+Another thing to try is learning whether your Perl was compiled with
+the system malloc or with Perl's builtin malloc.  Whichever one it
+is, try using the other one and see whether this makes a difference.
+Information about malloc is in the F<INSTALL> file in the source
+distribution.  You can find out whether you are using perl's malloc by
+typing C<perl -V:usemymalloc>.
+
+Of course, the best way to save memory is to not do anything to waste
+it in the first place. Good programming practices can go a long way
+toward this:
+
+=over 4
+
+=item * Don't slurp!
+
+Don't read an entire file into memory if you can process it line
+by line. Or more concretely, use a loop like this:
+
+	#
+	# Good Idea
+	#
+	while (<FILE>) {
+	   # ...
+	}
+
+instead of this:
+
+	#
+	# Bad Idea
+	#
+	@data = <FILE>;
+	foreach (@data) {
+	    # ...
+	}
+
+When the files you're processing are small, it doesn't much matter which
+way you do it, but it makes a huge difference when they start getting
+larger.
+
+=item * Use map and grep selectively
+
+Remember that both map and grep expect a LIST argument, so doing this:
+
+        @wanted = grep {/pattern/} <FILE>;
+
+will cause the entire file to be slurped. For large files, it's better
+to loop:
+
+        while (<FILE>) {
+                push(@wanted, $_) if /pattern/;
+        }
+
+=item * Avoid unnecessary quotes and stringification
+
+Don't quote large strings unless absolutely necessary:
+
+        my $copy = "$large_string";
+
+makes 2 copies of $large_string (one for $copy and another for the
+quotes), whereas
+
+        my $copy = $large_string;
+
+only makes one copy.
+
+Ditto for stringifying large arrays:
+
+        {
+                local $, = "\n";
+                print @big_array;
+        }
+
+is much more memory-efficient than either
+
+        print join "\n", @big_array;
+
+or
+
+        {
+                local $" = "\n";
+                print "@big_array";
+        }
+
+
+=item * Pass by reference
+
+Pass arrays and hashes by reference, not by value. For one thing, it's
+the only way to pass multiple lists or hashes (or both) in a single
+call/return. It also avoids creating a copy of all the contents. This
+requires some judgment, however, because any changes will be propagated
+back to the original data. If you really want to mangle (er, modify) a
+copy, you'll have to sacrifice the memory needed to make one.
+
+=item * Tie large variables to disk.
+
+For "big" data stores (i.e. ones that exceed available memory) consider
+using one of the DB modules to store it on disk instead of in RAM. This
+will incur a penalty in access time, but that's probably better than
+causing your hard disk to thrash due to massive swapping.
+
+=back
+
+=head2 Is it safe to return a reference to local or lexical data?
+
+Yes. Perl's garbage collection system takes care of this so
+everything works out right.
+
+    sub makeone {
+	my @a = ( 1 .. 10 );
+	return \@a;
+    }
+
+    for ( 1 .. 10 ) {
+        push @many, makeone();
+    }
+
+    print $many[4][5], "\n";
+
+    print "@many\n";
+
+=head2 How can I free an array or hash so my program shrinks?
+
+(contributed by Michael Carman)
+
+You usually can't. Memory allocated to lexicals (i.e. my() variables)
+cannot be reclaimed or reused even if they go out of scope. It is
+reserved in case the variables come back into scope. Memory allocated
+to global variables can be reused (within your program) by using
+undef()ing and/or delete().
+
+On most operating systems, memory allocated to a program can never be
+returned to the system. That's why long-running programs sometimes re-
+exec themselves. Some operating systems (notably, systems that use
+mmap(2) for allocating large chunks of memory) can reclaim memory that
+is no longer used, but on such systems, perl must be configured and
+compiled to use the OS's malloc, not perl's.
+
+In general, memory allocation and de-allocation isn't something you can
+or should be worrying about much in Perl.
+
+See also "How can I make my Perl program take less memory?"
+
+=head2 How can I make my CGI script more efficient?
+
+Beyond the normal measures described to make general Perl programs
+faster or smaller, a CGI program has additional issues.  It may be run
+several times per second.  Given that each time it runs it will need
+to be re-compiled and will often allocate a megabyte or more of system
+memory, this can be a killer.  Compiling into C B<isn't going to help
+you> because the process start-up overhead is where the bottleneck is.
+
+There are two popular ways to avoid this overhead.  One solution
+involves running the Apache HTTP server (available from
+http://www.apache.org/ ) with either of the mod_perl or mod_fastcgi
+plugin modules.
+
+With mod_perl and the Apache::Registry module (distributed with
+mod_perl), httpd will run with an embedded Perl interpreter which
+pre-compiles your script and then executes it within the same address
+space without forking.  The Apache extension also gives Perl access to
+the internal server API, so modules written in Perl can do just about
+anything a module written in C can.  For more on mod_perl, see
+http://perl.apache.org/
+
+With the FCGI module (from CPAN) and the mod_fastcgi
+module (available from http://www.fastcgi.com/ ) each of your Perl
+programs becomes a permanent CGI daemon process.
+
+Both of these solutions can have far-reaching effects on your system
+and on the way you write your CGI programs, so investigate them with
+care.
+
+See http://www.cpan.org/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/ .
+
+=head2 How can I hide the source for my Perl program?
+
+Delete it. :-) Seriously, there are a number of (mostly
+unsatisfactory) solutions with varying levels of "security".
+
+First of all, however, you I<can't> take away read permission, because
+the source code has to be readable in order to be compiled and
+interpreted.  (That doesn't mean that a CGI script's source is
+readable by people on the web, though--only by people with access to
+the filesystem.)  So you have to leave the permissions at the socially
+friendly 0755 level.
+
+Some people regard this as a security problem.  If your program does
+insecure things and relies on people not knowing how to exploit those
+insecurities, it is not secure.  It is often possible for someone to
+determine the insecure things and exploit them without viewing the
+source.  Security through obscurity, the name for hiding your bugs
+instead of fixing them, is little security indeed.
+
+You can try using encryption via source filters (Starting from Perl
+5.8 the Filter::Simple and Filter::Util::Call modules are included in
+the standard distribution), but any decent programmer will be able to
+decrypt it.  You can try using the byte code compiler and interpreter
+described below, but the curious might still be able to de-compile it.
+You can try using the native-code compiler described below, but
+crackers might be able to disassemble it.  These pose varying degrees
+of difficulty to people wanting to get at your code, but none can
+definitively conceal it (true of every language, not just Perl).
+
+It is very easy to recover the source of Perl programs.  You simply
+feed the program to the perl interpreter and use the modules in
+the B:: hierarchy.  The B::Deparse module should be able to
+defeat most attempts to hide source.  Again, this is not
+unique to Perl.
+
+If you're concerned about people profiting from your code, then the
+bottom line is that nothing but a restrictive license will give you
+legal security.  License your software and pepper it with threatening
+statements like "This is unpublished proprietary software of XYZ Corp.
+Your access to it does not give you permission to use it blah blah
+blah."  We are not lawyers, of course, so you should see a lawyer if
+you want to be sure your license's wording will stand up in court.
+
+=head2 How can I compile my Perl program into byte code or C?
+
+(contributed by brian d foy)
+
+In general, you can't do this.  There are some things that may work
+for your situation though.  People usually ask this question
+because they want to distribute their works without giving away
+the source code, and most solutions trade disk space for convenience.
+You probably won't see much of a speed increase either, since most
+solutions simply bundle a Perl interpreter in the final product
+(but see L<How can I make my Perl program run faster?>).
+
+The Perl Archive Toolkit ( http://par.perl.org/index.cgi ) is Perl's
+analog to Java's JAR.  It's freely available and on CPAN (
+http://search.cpan.org/dist/PAR/ ).
+
+The B::* namespace, often called "the Perl compiler", but is really a way
+for Perl programs to peek at its innards rather than create pre-compiled
+versions of your program.  However. the B::Bytecode module can turn your
+script  into a bytecode format that could be loaded later by the
+ByteLoader module and executed as a regular Perl script.
+
+There are also some commercial products that may work for you, although
+you have to buy a license for them.
+
+The Perl Dev Kit ( http://www.activestate.com/Products/Perl_Dev_Kit/ )
+from ActiveState can "Turn your Perl programs into ready-to-run
+executables for HP-UX, Linux, Solaris and Windows."
+
+Perl2Exe ( http://www.indigostar.com/perl2exe.htm ) is a command line
+program for converting perl scripts to executable files.  It targets both
+Windows and unix platforms.
+
+=head2 How can I compile Perl into Java?
+
+You can also integrate Java and Perl with the
+Perl Resource Kit from O'Reilly Media.  See
+http://www.oreilly.com/catalog/prkunix/ .
+
+Perl 5.6 comes with Java Perl Lingo, or JPL.  JPL, still in
+development, allows Perl code to be called from Java.  See jpl/README
+in the Perl source tree.
+
+=head2 How can I get C<#!perl> to work on [MS-DOS,NT,...]?
+
+For OS/2 just use
+
+    extproc perl -S -your_switches
+
+as the first line in C<*.cmd> file (C<-S> due to a bug in cmd.exe's
+"extproc" handling).  For DOS one should first invent a corresponding
+batch file and codify it in C<ALTERNATE_SHEBANG> (see the
+F<dosish.h> file in the source distribution for more information).
+
+The Win95/NT installation, when using the ActiveState port of Perl,
+will modify the Registry to associate the C<.pl> extension with the
+perl interpreter.  If you install another port, perhaps even building
+your own Win95/NT Perl from the standard sources by using a Windows port
+of gcc (e.g., with cygwin or mingw32), then you'll have to modify
+the Registry yourself.  In addition to associating C<.pl> with the
+interpreter, NT people can use: C<SET PATHEXT=%PATHEXT%;.PL> to let them
+run the program C<install-linux.pl> merely by typing C<install-linux>.
+
+Under "Classic" MacOS, a perl program will have the appropriate Creator and
+Type, so that double-clicking them will invoke the MacPerl application.
+Under Mac OS X, clickable apps can be made from any C<#!> script using Wil
+Sanchez' DropScript utility: http://www.wsanchez.net/software/ .
+
+I<IMPORTANT!>: Whatever you do, PLEASE don't get frustrated, and just
+throw the perl interpreter into your cgi-bin directory, in order to
+get your programs working for a web server.  This is an EXTREMELY big
+security risk.  Take the time to figure out how to do it correctly.
+
+=head2 Can I write useful Perl programs on the command line?
+
+Yes.  Read L<perlrun> for more information.  Some examples follow.
+(These assume standard Unix shell quoting rules.)
+
+    # sum first and last fields
+    perl -lane 'print $F[0] + $F[-1]' *
+
+    # identify text files
+    perl -le 'for(@ARGV) {print if -f && -T _}' *
+
+    # remove (most) comments from C program
+    perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
+
+    # make file a month younger than today, defeating reaper daemons
+    perl -e '$X=24*60*60; utime(time(),time() + 30 * $X,@ARGV)' *
+
+    # find first unused uid
+    perl -le '$i++ while getpwuid($i); print $i'
+
+    # display reasonable manpath
+    echo $PATH | perl -nl -072 -e '
+	s![^/+]*$!man!&&-d&&!$s{$_}++&&push@m,$_;END{print"@m"}'
+
+OK, the last one was actually an Obfuscated Perl Contest entry. :-)
+
+=head2 Why don't Perl one-liners work on my DOS/Mac/VMS system?
+
+The problem is usually that the command interpreters on those systems
+have rather different ideas about quoting than the Unix shells under
+which the one-liners were created.  On some systems, you may have to
+change single-quotes to double ones, which you must I<NOT> do on Unix
+or Plan9 systems.  You might also have to change a single % to a %%.
+
+For example:
+
+    # Unix
+    perl -e 'print "Hello world\n"'
+
+    # DOS, etc.
+    perl -e "print \"Hello world\n\""
+
+    # Mac
+    print "Hello world\n"
+     (then Run "Myscript" or Shift-Command-R)
+
+    # MPW
+    perl -e 'print "Hello world\n"'
+
+    # VMS
+    perl -e "print ""Hello world\n"""
+
+The problem is that none of these examples are reliable: they depend on the
+command interpreter.  Under Unix, the first two often work. Under DOS,
+it's entirely possible that neither works.  If 4DOS was the command shell,
+you'd probably have better luck like this:
+
+  perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""
+
+Under the Mac, it depends which environment you are using.  The MacPerl
+shell, or MPW, is much like Unix shells in its support for several
+quoting variants, except that it makes free use of the Mac's non-ASCII
+characters as control characters.
+
+Using qq(), q(), and qx(), instead of "double quotes", 'single
+quotes', and `backticks`, may make one-liners easier to write.
+
+There is no general solution to all of this.  It is a mess.
+
+[Some of this answer was contributed by Kenneth Albanowski.]
+
+=head2 Where can I learn about CGI or Web programming in Perl?
+
+For modules, get the CGI or LWP modules from CPAN.  For textbooks,
+see the two especially dedicated to web stuff in the question on
+books.  For problems and questions related to the web, like "Why
+do I get 500 Errors" or "Why doesn't it run from the browser right
+when it runs fine on the command line", see the troubleshooting
+guides and references in L<perlfaq9> or in the CGI MetaFAQ:
+
+	http://www.perl.org/CGI_MetaFAQ.html
+
+=head2 Where can I learn about object-oriented Perl programming?
+
+A good place to start is L<perltoot>, and you can use L<perlobj>,
+L<perlboot>, L<perltoot>, L<perltooc>, and L<perlbot> for reference.
+
+A good book on OO on Perl is the "Object-Oriented Perl"
+by Damian Conway from Manning Publications, or "Learning Perl
+References, Objects, & Modules" by Randal Schwartz and Tom
+Phoenix from O'Reilly Media.
+
+=head2 Where can I learn about linking C with Perl?
+
+If you want to call C from Perl, start with L<perlxstut>,
+moving on to L<perlxs>, L<xsubpp>, and L<perlguts>.  If you want to
+call Perl from C, then read L<perlembed>, L<perlcall>, and
+L<perlguts>.  Don't forget that you can learn a lot from looking at
+how the authors of existing extension modules wrote their code and
+solved their problems.
+
+You might not need all the power of XS. The Inline::C module lets
+you put C code directly in your Perl source. It handles all the
+magic to make it work. You still have to learn at least some of
+the perl API but you won't have to deal with the complexity of the
+XS support files.
+
+=head2 I've read perlembed, perlguts, etc., but I can't embed perl in my C program; what am I doing wrong?
+
+Download the ExtUtils::Embed kit from CPAN and run `make test'.  If
+the tests pass, read the pods again and again and again.  If they
+fail, see L<perlbug> and send a bug report with the output of
+C<make test TEST_VERBOSE=1> along with C<perl -V>.
+
+=head2 When I tried to run my script, I got this message. What does it mean?
+
+A complete list of Perl's error messages and warnings with explanatory
+text can be found in L<perldiag>. You can also use the splain program
+(distributed with Perl) to explain the error messages:
+
+    perl program 2>diag.out
+    splain [-v] [-p] diag.out
+
+or change your program to explain the messages for you:
+
+    use diagnostics;
+
+or
+
+    use diagnostics -verbose;
+
+=head2 What's MakeMaker?
+
+This module (part of the standard Perl distribution) is designed to
+write a Makefile for an extension module from a Makefile.PL.  For more
+information, see L<ExtUtils::MakeMaker>.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2006 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples here are in the public
+domain.  You are permitted and encouraged to use this code and any
+derivatives thereof in your own programs for fun or for profit as you
+see fit.  A simple comment in the code giving credit to the FAQ would
+be courteous but is not required.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq4.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq4.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq4.pod	(revision 14489)
@@ -0,0 +1,2168 @@
+=head1 NAME
+
+perlfaq4 - Data Manipulation ($Revision: 1.73 $, $Date: 2005/12/31 00:54:37 $)
+
+=head1 DESCRIPTION
+
+This section of the FAQ answers questions related to manipulating
+numbers, dates, strings, arrays, hashes, and miscellaneous data issues.
+
+=head1 Data: Numbers
+
+=head2 Why am I getting long decimals (eg, 19.9499999999999) instead of the numbers I should be getting (eg, 19.95)?
+
+Internally, your computer represents floating-point numbers
+in binary. Digital (as in powers of two) computers cannot
+store all numbers exactly.  Some real numbers lose precision
+in the process.  This is a problem with how computers store
+numbers and affects all computer languages, not just Perl.
+
+L<perlnumber> show the gory details of number
+representations and conversions.
+
+To limit the number of decimal places in your numbers, you
+can use the printf or sprintf function.  See the
+L<"Floating Point Arithmetic"|perlop> for more details.
+
+	printf "%.2f", 10/3;
+
+	my $number = sprintf "%.2f", 10/3;
+
+=head2 Why is int() broken?
+
+Your int() is most probably working just fine.  It's the numbers that
+aren't quite what you think.
+
+First, see the above item "Why am I getting long decimals
+(eg, 19.9499999999999) instead of the numbers I should be getting
+(eg, 19.95)?".
+
+For example, this
+
+    print int(0.6/0.2-2), "\n";
+
+will in most computers print 0, not 1, because even such simple
+numbers as 0.6 and 0.2 cannot be presented exactly by floating-point
+numbers.  What you think in the above as 'three' is really more like
+2.9999999999999995559.
+
+=head2 Why isn't my octal data interpreted correctly?
+
+Perl only understands octal and hex numbers as such when they occur as
+literals in your program.  Octal literals in perl must start with a
+leading "0" and hexadecimal literals must start with a leading "0x".
+If they are read in from somewhere and assigned, no automatic
+conversion takes place.  You must explicitly use oct() or hex() if you
+want the values converted to decimal.  oct() interprets hex ("0x350"),
+octal ("0350" or even without the leading "0", like "377") and binary
+("0b1010") numbers, while hex() only converts hexadecimal ones, with
+or without a leading "0x", like "0x255", "3A", "ff", or "deadbeef".
+The inverse mapping from decimal to octal can be done with either the
+"%o" or "%O" sprintf() formats.
+
+This problem shows up most often when people try using chmod(), mkdir(),
+umask(), or sysopen(), which by widespread tradition typically take
+permissions in octal.
+
+    chmod(644,  $file);	# WRONG
+    chmod(0644, $file);	# right
+
+Note the mistake in the first line was specifying the decimal literal
+644, rather than the intended octal literal 0644.  The problem can
+be seen with:
+
+    printf("%#o",644); # prints 01204
+
+Surely you had not intended C<chmod(01204, $file);> - did you?  If you
+want to use numeric literals as arguments to chmod() et al. then please
+try to express them as octal constants, that is with a leading zero and
+with the following digits restricted to the set 0..7.
+
+=head2 Does Perl have a round() function?  What about ceil() and floor()?  Trig functions?
+
+Remember that int() merely truncates toward 0.  For rounding to a
+certain number of digits, sprintf() or printf() is usually the easiest
+route.
+
+    printf("%.3f", 3.1415926535);	# prints 3.142
+
+The POSIX module (part of the standard Perl distribution) implements
+ceil(), floor(), and a number of other mathematical and trigonometric
+functions.
+
+    use POSIX;
+    $ceil   = ceil(3.5);			# 4
+    $floor  = floor(3.5);			# 3
+
+In 5.000 to 5.003 perls, trigonometry was done in the Math::Complex
+module.  With 5.004, the Math::Trig module (part of the standard Perl
+distribution) implements the trigonometric functions. Internally it
+uses the Math::Complex module and some functions can break out from
+the real axis into the complex plane, for example the inverse sine of
+2.
+
+Rounding in financial applications can have serious implications, and
+the rounding method used should be specified precisely.  In these
+cases, it probably pays not to trust whichever system rounding is
+being used by Perl, but to instead implement the rounding function you
+need yourself.
+
+To see why, notice how you'll still have an issue on half-way-point
+alternation:
+
+    for ($i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i}
+
+    0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7
+    0.8 0.8 0.9 0.9 1.0 1.0
+
+Don't blame Perl.  It's the same as in C.  IEEE says we have to do this.
+Perl numbers whose absolute values are integers under 2**31 (on 32 bit
+machines) will work pretty much like mathematical integers.  Other numbers
+are not guaranteed.
+
+=head2 How do I convert between numeric representations/bases/radixes?
+
+As always with Perl there is more than one way to do it.  Below
+are a few examples of approaches to making common conversions
+between number representations.  This is intended to be representational
+rather than exhaustive.
+
+Some of the examples below use the Bit::Vector module from CPAN.
+The reason you might choose Bit::Vector over the perl built in
+functions is that it works with numbers of ANY size, that it is
+optimized for speed on some operations, and for at least some
+programmers the notation might be familiar.
+
+=over 4
+
+=item How do I convert hexadecimal into decimal
+
+Using perl's built in conversion of 0x notation:
+
+    $dec = 0xDEADBEEF;
+
+Using the hex function:
+
+    $dec = hex("DEADBEEF");
+
+Using pack:
+
+    $dec = unpack("N", pack("H8", substr("0" x 8 . "DEADBEEF", -8)));
+
+Using the CPAN module Bit::Vector:
+
+    use Bit::Vector;
+    $vec = Bit::Vector->new_Hex(32, "DEADBEEF");
+    $dec = $vec->to_Dec();
+
+=item How do I convert from decimal to hexadecimal
+
+Using sprintf:
+
+    $hex = sprintf("%X", 3735928559); # upper case A-F
+    $hex = sprintf("%x", 3735928559); # lower case a-f
+
+Using unpack:
+
+    $hex = unpack("H*", pack("N", 3735928559));
+
+Using Bit::Vector:
+
+    use Bit::Vector;
+    $vec = Bit::Vector->new_Dec(32, -559038737);
+    $hex = $vec->to_Hex();
+
+And Bit::Vector supports odd bit counts:
+
+    use Bit::Vector;
+    $vec = Bit::Vector->new_Dec(33, 3735928559);
+    $vec->Resize(32); # suppress leading 0 if unwanted
+    $hex = $vec->to_Hex();
+
+=item How do I convert from octal to decimal
+
+Using Perl's built in conversion of numbers with leading zeros:
+
+    $dec = 033653337357; # note the leading 0!
+
+Using the oct function:
+
+    $dec = oct("33653337357");
+
+Using Bit::Vector:
+
+    use Bit::Vector;
+    $vec = Bit::Vector->new(32);
+    $vec->Chunk_List_Store(3, split(//, reverse "33653337357"));
+    $dec = $vec->to_Dec();
+
+=item How do I convert from decimal to octal
+
+Using sprintf:
+
+    $oct = sprintf("%o", 3735928559);
+
+Using Bit::Vector:
+
+    use Bit::Vector;
+    $vec = Bit::Vector->new_Dec(32, -559038737);
+    $oct = reverse join('', $vec->Chunk_List_Read(3));
+
+=item How do I convert from binary to decimal
+
+Perl 5.6 lets you write binary numbers directly with
+the 0b notation:
+
+    $number = 0b10110110;
+
+Using oct:
+
+    my $input = "10110110";
+    $decimal = oct( "0b$input" );
+
+Using pack and ord:
+
+    $decimal = ord(pack('B8', '10110110'));
+
+Using pack and unpack for larger strings:
+
+    $int = unpack("N", pack("B32",
+	substr("0" x 32 . "11110101011011011111011101111", -32)));
+    $dec = sprintf("%d", $int);
+
+    # substr() is used to left pad a 32 character string with zeros.
+
+Using Bit::Vector:
+
+    $vec = Bit::Vector->new_Bin(32, "11011110101011011011111011101111");
+    $dec = $vec->to_Dec();
+
+=item How do I convert from decimal to binary
+
+Using sprintf (perl 5.6+):
+
+    $bin = sprintf("%b", 3735928559);
+
+Using unpack:
+
+    $bin = unpack("B*", pack("N", 3735928559));
+
+Using Bit::Vector:
+
+    use Bit::Vector;
+    $vec = Bit::Vector->new_Dec(32, -559038737);
+    $bin = $vec->to_Bin();
+
+The remaining transformations (e.g. hex -> oct, bin -> hex, etc.)
+are left as an exercise to the inclined reader.
+
+=back
+
+=head2 Why doesn't & work the way I want it to?
+
+The behavior of binary arithmetic operators depends on whether they're
+used on numbers or strings.  The operators treat a string as a series
+of bits and work with that (the string C<"3"> is the bit pattern
+C<00110011>).  The operators work with the binary form of a number
+(the number C<3> is treated as the bit pattern C<00000011>).
+
+So, saying C<11 & 3> performs the "and" operation on numbers (yielding
+C<3>).  Saying C<"11" & "3"> performs the "and" operation on strings
+(yielding C<"1">).
+
+Most problems with C<&> and C<|> arise because the programmer thinks
+they have a number but really it's a string.  The rest arise because
+the programmer says:
+
+    if ("\020\020" & "\101\101") {
+	# ...
+    }
+
+but a string consisting of two null bytes (the result of C<"\020\020"
+& "\101\101">) is not a false value in Perl.  You need:
+
+    if ( ("\020\020" & "\101\101") !~ /[^\000]/) {
+	# ...
+    }
+
+=head2 How do I multiply matrices?
+
+Use the Math::Matrix or Math::MatrixReal modules (available from CPAN)
+or the PDL extension (also available from CPAN).
+
+=head2 How do I perform an operation on a series of integers?
+
+To call a function on each element in an array, and collect the
+results, use:
+
+    @results = map { my_func($_) } @array;
+
+For example:
+
+    @triple = map { 3 * $_ } @single;
+
+To call a function on each element of an array, but ignore the
+results:
+
+    foreach $iterator (@array) {
+        some_func($iterator);
+    }
+
+To call a function on each integer in a (small) range, you B<can> use:
+
+    @results = map { some_func($_) } (5 .. 25);
+
+but you should be aware that the C<..> operator creates an array of
+all integers in the range.  This can take a lot of memory for large
+ranges.  Instead use:
+
+    @results = ();
+    for ($i=5; $i < 500_005; $i++) {
+        push(@results, some_func($i));
+    }
+
+This situation has been fixed in Perl5.005. Use of C<..> in a C<for>
+loop will iterate over the range, without creating the entire range.
+
+    for my $i (5 .. 500_005) {
+        push(@results, some_func($i));
+    }
+
+will not create a list of 500,000 integers.
+
+=head2 How can I output Roman numerals?
+
+Get the http://www.cpan.org/modules/by-module/Roman module.
+
+=head2 Why aren't my random numbers random?
+
+If you're using a version of Perl before 5.004, you must call C<srand>
+once at the start of your program to seed the random number generator.
+
+	 BEGIN { srand() if $] < 5.004 }
+
+5.004 and later automatically call C<srand> at the beginning.  Don't
+call C<srand> more than once---you make your numbers less random, rather
+than more.
+
+Computers are good at being predictable and bad at being random
+(despite appearances caused by bugs in your programs :-).  see the
+F<random> article in the "Far More Than You Ever Wanted To Know"
+collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz , courtesy of
+Tom Phoenix, talks more about this.  John von Neumann said, "Anyone
+who attempts to generate random numbers by deterministic means is, of
+course, living in a state of sin."
+
+If you want numbers that are more random than C<rand> with C<srand>
+provides, you should also check out the Math::TrulyRandom module from
+CPAN.  It uses the imperfections in your system's timer to generate
+random numbers, but this takes quite a while.  If you want a better
+pseudorandom generator than comes with your operating system, look at
+"Numerical Recipes in C" at http://www.nr.com/ .
+
+=head2 How do I get a random number between X and Y?
+
+C<rand($x)> returns a number such that
+C<< 0 <= rand($x) < $x >>. Thus what you want to have perl
+figure out is a random number in the range from 0 to the
+difference between your I<X> and I<Y>.
+
+That is, to get a number between 10 and 15, inclusive, you
+want a random number between 0 and 5 that you can then add
+to 10.
+
+    my $number = 10 + int rand( 15-10+1 );
+
+Hence you derive the following simple function to abstract
+that. It selects a random integer between the two given
+integers (inclusive), For example: C<random_int_in(50,120)>.
+
+   sub random_int_in ($$) {
+     my($min, $max) = @_;
+      # Assumes that the two arguments are integers themselves!
+     return $min if $min == $max;
+     ($min, $max) = ($max, $min)  if  $min > $max;
+     return $min + int rand(1 + $max - $min);
+   }
+
+=head1 Data: Dates
+
+=head2 How do I find the day or week of the year?
+
+The localtime function returns the day of the year.  Without an
+argument localtime uses the current time.
+
+	$day_of_year = (localtime)[7];
+
+The POSIX module can also format a date as the day of the year or
+week of the year.
+
+	use POSIX qw/strftime/;
+	my $day_of_year  = strftime "%j", localtime;
+	my $week_of_year = strftime "%W", localtime;
+
+To get the day of year for any date, use the Time::Local module to get
+a time in epoch seconds for the argument to localtime.
+
+	use POSIX qw/strftime/;
+	use Time::Local;
+	my $week_of_year = strftime "%W",
+		localtime( timelocal( 0, 0, 0, 18, 11, 1987 ) );
+
+The Date::Calc module provides two functions to calculate these.
+
+	use Date::Calc;
+	my $day_of_year  = Day_of_Year(  1987, 12, 18 );
+	my $week_of_year = Week_of_Year( 1987, 12, 18 );
+
+=head2 How do I find the current century or millennium?
+
+Use the following simple functions:
+
+    sub get_century    {
+	return int((((localtime(shift || time))[5] + 1999))/100);
+    }
+
+    sub get_millennium {
+	return 1+int((((localtime(shift || time))[5] + 1899))/1000);
+    }
+
+On some systems, the POSIX module's strftime() function has
+been extended in a non-standard way to use a C<%C> format,
+which they sometimes claim is the "century".  It isn't,
+because on most such systems, this is only the first two
+digits of the four-digit year, and thus cannot be used to
+reliably determine the current century or millennium.
+
+=head2 How can I compare two dates and find the difference?
+
+(contributed by brian d foy)
+
+You could just store all your dates as a number and then subtract. Life
+isn't always that simple though. If you want to work with formatted
+dates, the Date::Manip, Date::Calc, or DateTime modules can help you.
+
+
+=head2 How can I take a string and turn it into epoch seconds?
+
+If it's a regular enough string that it always has the same format,
+you can split it up and pass the parts to C<timelocal> in the standard
+Time::Local module.  Otherwise, you should look into the Date::Calc
+and Date::Manip modules from CPAN.
+
+=head2 How can I find the Julian Day?
+
+(contributed by brian d foy and Dave Cross)
+
+You can use the Time::JulianDay module available on CPAN.  Ensure that
+you really want to find a Julian day, though, as many people have
+different ideas about Julian days.  See
+http://www.hermetic.ch/cal_stud/jdn.htm for instance.
+
+You can also try the DateTime module, which can convert a date/time
+to a Julian Day.
+
+  $ perl -MDateTime -le'print DateTime->today->jd'
+  2453401.5
+
+Or the modified Julian Day
+
+  $ perl -MDateTime -le'print DateTime->today->mjd'
+  53401
+
+Or even the day of the year (which is what some people think of as a
+Julian day)
+
+  $ perl -MDateTime -le'print DateTime->today->doy'
+  31
+
+=head2 How do I find yesterday's date?
+
+(contributed by brian d foy)
+
+Use one of the Date modules. The C<DateTime> module makes it simple, and
+give you the same time of day, only the day before.
+
+	use DateTime;
+
+	my $yesterday = DateTime->now->subtract( days => 1 );
+
+	print "Yesterday was $yesterday\n";
+
+You can also use the C<Date::Calc> module using its Today_and_Now
+function.
+
+	use Date::Calc qw( Today_and_Now Add_Delta_DHMS );
+
+	my @date_time = Add_Delta_DHMS( Today_and_Now(), -1, 0, 0, 0 );
+
+	print "@date\n";
+
+Most people try to use the time rather than the calendar to figure out
+dates, but that assumes that days are twenty-four hours each.  For
+most people, there are two days a year when they aren't: the switch to
+and from summer time throws this off. Let the modules do the work.
+
+=head2 Does Perl have a Year 2000 problem?  Is Perl Y2K compliant?
+
+Short answer: No, Perl does not have a Year 2000 problem.  Yes, Perl is
+Y2K compliant (whatever that means).  The programmers you've hired to
+use it, however, probably are not.
+
+Long answer: The question belies a true understanding of the issue.
+Perl is just as Y2K compliant as your pencil--no more, and no less.
+Can you use your pencil to write a non-Y2K-compliant memo?  Of course
+you can.  Is that the pencil's fault?  Of course it isn't.
+
+The date and time functions supplied with Perl (gmtime and localtime)
+supply adequate information to determine the year well beyond 2000
+(2038 is when trouble strikes for 32-bit machines).  The year returned
+by these functions when used in a list context is the year minus 1900.
+For years between 1910 and 1999 this I<happens> to be a 2-digit decimal
+number. To avoid the year 2000 problem simply do not treat the year as
+a 2-digit number.  It isn't.
+
+When gmtime() and localtime() are used in scalar context they return
+a timestamp string that contains a fully-expanded year.  For example,
+C<$timestamp = gmtime(1005613200)> sets $timestamp to "Tue Nov 13 01:00:00
+2001".  There's no year 2000 problem here.
+
+That doesn't mean that Perl can't be used to create non-Y2K compliant
+programs.  It can.  But so can your pencil.  It's the fault of the user,
+not the language.  At the risk of inflaming the NRA: "Perl doesn't
+break Y2K, people do."  See http://www.perl.org/about/y2k.html for
+a longer exposition.
+
+=head1 Data: Strings
+
+=head2 How do I validate input?
+
+(contributed by brian d foy)
+
+There are many ways to ensure that values are what you expect or
+want to accept. Besides the specific examples that we cover in the
+perlfaq, you can also look at the modules with "Assert" and "Validate"
+in their names, along with other modules such as C<Regexp::Common>.
+
+Some modules have validation for particular types of input, such
+as C<Business::ISBN>, C<Business::CreditCard>, C<Email::Valid>,
+and C<Data::Validate::IP>.
+
+=head2 How do I unescape a string?
+
+It depends just what you mean by "escape".  URL escapes are dealt
+with in L<perlfaq9>.  Shell escapes with the backslash (C<\>)
+character are removed with
+
+    s/\\(.)/$1/g;
+
+This won't expand C<"\n"> or C<"\t"> or any other special escapes.
+
+=head2 How do I remove consecutive pairs of characters?
+
+(contributed by brian d foy)
+
+You can use the substitution operator to find pairs of characters (or
+runs of characters) and replace them with a single instance. In this
+substitution, we find a character in C<(.)>. The memory parentheses
+store the matched character in the back-reference C<\1> and we use
+that to require that the same thing immediately follow it. We replace
+that part of the string with the character in C<$1>.
+
+    s/(.)\1/$1/g;
+
+We can also use the transliteration operator, C<tr///>. In this
+example, the search list side of our C<tr///> contains nothing, but
+the C<c> option complements that so it contains everything. The
+replacement list also contains nothing, so the transliteration is
+almost a no-op since it won't do any replacements (or more exactly,
+replace the character with itself). However, the C<s> option squashes
+duplicated and consecutive characters in the string so a character
+does not show up next to itself
+
+	my $str = 'Haarlem';   # in the Netherlands
+    $str =~ tr///cs;       # Now Harlem, like in New York
+
+=head2 How do I expand function calls in a string?
+
+(contributed by brian d foy)
+
+This is documented in L<perlref>, and although it's not the easiest
+thing to read, it does work. In each of these examples, we call the
+function inside the braces used to dereference a reference. If we
+have a more than one return value, we can construct and dereference an
+anonymous array. In this case, we call the function in list context.
+
+	print "The time values are @{ [localtime] }.\n";
+
+If we want to call the function in scalar context, we have to do a bit
+more work. We can really have any code we like inside the braces, so
+we simply have to end with the scalar reference, although how you do
+that is up to you, and you can use code inside the braces.
+
+	print "The time is ${\(scalar localtime)}.\n"
+
+	print "The time is ${ my $x = localtime; \$x }.\n";
+
+If your function already returns a reference, you don't need to create
+the reference yourself.
+
+	sub timestamp { my $t = localtime; \$t }
+
+	print "The time is ${ timestamp() }.\n";
+
+The C<Interpolation> module can also do a lot of magic for you. You can
+specify a variable name, in this case C<E>, to set up a tied hash that
+does the interpolation for you. It has several other methods to do this
+as well.
+
+	use Interpolation E => 'eval';
+	print "The time values are $E{localtime()}.\n";
+
+In most cases, it is probably easier to simply use string concatenation,
+which also forces scalar context.
+
+	print "The time is " . localtime . ".\n";
+
+=head2 How do I find matching/nesting anything?
+
+This isn't something that can be done in one regular expression, no
+matter how complicated.  To find something between two single
+characters, a pattern like C</x([^x]*)x/> will get the intervening
+bits in $1. For multiple ones, then something more like
+C</alpha(.*?)omega/> would be needed.  But none of these deals with
+nested patterns.  For balanced expressions using C<(>, C<{>, C<[> or
+C<< < >> as delimiters, use the CPAN module Regexp::Common, or see
+L<perlre/(??{ code })>.  For other cases, you'll have to write a
+parser.
+
+If you are serious about writing a parser, there are a number of
+modules or oddities that will make your life a lot easier.  There are
+the CPAN modules Parse::RecDescent, Parse::Yapp, and Text::Balanced;
+and the byacc program.   Starting from perl 5.8 the Text::Balanced is
+part of the standard distribution.
+
+One simple destructive, inside-out approach that you might try is to
+pull out the smallest nesting parts one at a time:
+
+    while (s/BEGIN((?:(?!BEGIN)(?!END).)*)END//gs) {
+	# do something with $1
+    }
+
+A more complicated and sneaky approach is to make Perl's regular
+expression engine do it for you.  This is courtesy Dean Inada, and
+rather has the nature of an Obfuscated Perl Contest entry, but it
+really does work:
+
+    # $_ contains the string to parse
+    # BEGIN and END are the opening and closing markers for the
+    # nested text.
+
+    @( = ('(','');
+    @) = (')','');
+    ($re=$_)=~s/((BEGIN)|(END)|.)/$)[!$3]\Q$1\E$([!$2]/gs;
+    @$ = (eval{/$re/},$@!~/unmatched/i);
+    print join("\n",@$[0..$#$]) if( $$[-1] );
+
+=head2 How do I reverse a string?
+
+Use reverse() in scalar context, as documented in
+L<perlfunc/reverse>.
+
+    $reversed = reverse $string;
+
+=head2 How do I expand tabs in a string?
+
+You can do it yourself:
+
+    1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
+
+Or you can just use the Text::Tabs module (part of the standard Perl
+distribution).
+
+    use Text::Tabs;
+    @expanded_lines = expand(@lines_with_tabs);
+
+=head2 How do I reformat a paragraph?
+
+Use Text::Wrap (part of the standard Perl distribution):
+
+    use Text::Wrap;
+    print wrap("\t", '  ', @paragraphs);
+
+The paragraphs you give to Text::Wrap should not contain embedded
+newlines.  Text::Wrap doesn't justify the lines (flush-right).
+
+Or use the CPAN module Text::Autoformat.  Formatting files can be easily
+done by making a shell alias, like so:
+
+    alias fmt="perl -i -MText::Autoformat -n0777 \
+        -e 'print autoformat $_, {all=>1}' $*"
+
+See the documentation for Text::Autoformat to appreciate its many
+capabilities.
+
+=head2 How can I access or change N characters of a string?
+
+You can access the first characters of a string with substr().
+To get the first character, for example, start at position 0
+and grab the string of length 1.
+
+
+	$string = "Just another Perl Hacker";
+    $first_char = substr( $string, 0, 1 );  #  'J'
+
+To change part of a string, you can use the optional fourth
+argument which is the replacement string.
+
+    substr( $string, 13, 4, "Perl 5.8.0" );
+
+You can also use substr() as an lvalue.
+
+    substr( $string, 13, 4 ) =  "Perl 5.8.0";
+
+=head2 How do I change the Nth occurrence of something?
+
+You have to keep track of N yourself.  For example, let's say you want
+to change the fifth occurrence of C<"whoever"> or C<"whomever"> into
+C<"whosoever"> or C<"whomsoever">, case insensitively.  These
+all assume that $_ contains the string to be altered.
+
+    $count = 0;
+    s{((whom?)ever)}{
+	++$count == 5   	# is it the 5th?
+	    ? "${2}soever"	# yes, swap
+	    : $1		# renege and leave it there
+    }ige;
+
+In the more general case, you can use the C</g> modifier in a C<while>
+loop, keeping count of matches.
+
+    $WANT = 3;
+    $count = 0;
+    $_ = "One fish two fish red fish blue fish";
+    while (/(\w+)\s+fish\b/gi) {
+        if (++$count == $WANT) {
+            print "The third fish is a $1 one.\n";
+        }
+    }
+
+That prints out: C<"The third fish is a red one.">  You can also use a
+repetition count and repeated pattern like this:
+
+    /(?:\w+\s+fish\s+){2}(\w+)\s+fish/i;
+
+=head2 How can I count the number of occurrences of a substring within a string?
+
+There are a number of ways, with varying efficiency.  If you want a
+count of a certain single character (X) within a string, you can use the
+C<tr///> function like so:
+
+    $string = "ThisXlineXhasXsomeXx'sXinXit";
+    $count = ($string =~ tr/X//);
+    print "There are $count X characters in the string";
+
+This is fine if you are just looking for a single character.  However,
+if you are trying to count multiple character substrings within a
+larger string, C<tr///> won't work.  What you can do is wrap a while()
+loop around a global pattern match.  For example, let's count negative
+integers:
+
+    $string = "-9 55 48 -2 23 -76 4 14 -44";
+    while ($string =~ /-\d+/g) { $count++ }
+    print "There are $count negative numbers in the string";
+
+Another version uses a global match in list context, then assigns the
+result to a scalar, producing a count of the number of matches.
+
+	$count = () = $string =~ /-\d+/g;
+
+=head2 How do I capitalize all the words on one line?
+
+To make the first letter of each word upper case:
+
+        $line =~ s/\b(\w)/\U$1/g;
+
+This has the strange effect of turning "C<don't do it>" into "C<Don'T
+Do It>".  Sometimes you might want this.  Other times you might need a
+more thorough solution (Suggested by brian d foy):
+
+    $string =~ s/ (
+                 (^\w)    #at the beginning of the line
+                   |      # or
+                 (\s\w)   #preceded by whitespace
+                   )
+                /\U$1/xg;
+    $string =~ /([\w']+)/\u\L$1/g;
+
+To make the whole line upper case:
+
+        $line = uc($line);
+
+To force each word to be lower case, with the first letter upper case:
+
+        $line =~ s/(\w+)/\u\L$1/g;
+
+You can (and probably should) enable locale awareness of those
+characters by placing a C<use locale> pragma in your program.
+See L<perllocale> for endless details on locales.
+
+This is sometimes referred to as putting something into "title
+case", but that's not quite accurate.  Consider the proper
+capitalization of the movie I<Dr. Strangelove or: How I Learned to
+Stop Worrying and Love the Bomb>, for example.
+
+Damian Conway's L<Text::Autoformat> module provides some smart
+case transformations:
+
+    use Text::Autoformat;
+    my $x = "Dr. Strangelove or: How I Learned to Stop ".
+      "Worrying and Love the Bomb";
+
+    print $x, "\n";
+    for my $style (qw( sentence title highlight ))
+    {
+        print autoformat($x, { case => $style }), "\n";
+    }
+
+=head2 How can I split a [character] delimited string except when inside [character]?
+
+Several modules can handle this sort of pasing---Text::Balanced,
+Text::CSV, Text::CSV_XS, and Text::ParseWords, among others.
+
+Take the example case of trying to split a string that is
+comma-separated into its different fields. You can't use C<split(/,/)>
+because you shouldn't split if the comma is inside quotes.  For
+example, take a data line like this:
+
+    SAR001,"","Cimetrix, Inc","Bob Smith","CAM",N,8,1,0,7,"Error, Core Dumped"
+
+Due to the restriction of the quotes, this is a fairly complex
+problem.  Thankfully, we have Jeffrey Friedl, author of
+I<Mastering Regular Expressions>, to handle these for us.  He
+suggests (assuming your string is contained in $text):
+
+     @new = ();
+     push(@new, $+) while $text =~ m{
+         "([^\"\\]*(?:\\.[^\"\\]*)*)",?  # groups the phrase inside the quotes
+       | ([^,]+),?
+       | ,
+     }gx;
+     push(@new, undef) if substr($text,-1,1) eq ',';
+
+If you want to represent quotation marks inside a
+quotation-mark-delimited field, escape them with backslashes (eg,
+C<"like \"this\"">.
+
+Alternatively, the Text::ParseWords module (part of the standard Perl
+distribution) lets you say:
+
+    use Text::ParseWords;
+    @new = quotewords(",", 0, $text);
+
+There's also a Text::CSV (Comma-Separated Values) module on CPAN.
+
+=head2 How do I strip blank space from the beginning/end of a string?
+
+(contributed by brian d foy)
+
+A substitution can do this for you. For a single line, you want to
+replace all the leading or trailing whitespace with nothing. You
+can do that with a pair of substitutions.
+
+	s/^\s+//;
+	s/\s+$//;
+
+You can also write that as a single substitution, although it turns
+out the combined statement is slower than the separate ones. That
+might not matter to you, though.
+
+	s/^\s+|\s+$//g;
+
+In this regular expression, the alternation matches either at the
+beginning or the end of the string since the anchors have a lower
+precedence than the alternation. With the C</g> flag, the substitution
+makes all possible matches, so it gets both. Remember, the trailing
+newline matches the C<\s+>, and  the C<$> anchor can match to the
+physical end of the string, so the newline disappears too. Just add
+the newline to the output, which has the added benefit of preserving
+"blank" (consisting entirely of whitespace) lines which the C<^\s+>
+would remove all by itself.
+
+	while( <> )
+		{
+		s/^\s+|\s+$//g;
+		print "$_\n";
+		}
+
+For a multi-line string, you can apply the regular expression
+to each logical line in the string by adding the C</m> flag (for
+"multi-line"). With the C</m> flag, the C<$> matches I<before> an
+embedded newline, so it doesn't remove it. It still removes the
+newline at the end of the string.
+
+    $string =~ s/^\s+|\s+$//gm;
+
+Remember that lines consisting entirely of whitespace will disappear,
+since the first part of the alternation can match the entire string
+and replace it with nothing. If need to keep embedded blank lines,
+you have to do a little more work. Instead of matching any whitespace
+(since that includes a newline), just match the other whitespace.
+
+	$string =~ s/^[\t\f ]+|[\t\f ]+$//mg;
+
+=head2 How do I pad a string with blanks or pad a number with zeroes?
+
+In the following examples, C<$pad_len> is the length to which you wish
+to pad the string, C<$text> or C<$num> contains the string to be padded,
+and C<$pad_char> contains the padding character. You can use a single
+character string constant instead of the C<$pad_char> variable if you
+know what it is in advance. And in the same way you can use an integer in
+place of C<$pad_len> if you know the pad length in advance.
+
+The simplest method uses the C<sprintf> function. It can pad on the left
+or right with blanks and on the left with zeroes and it will not
+truncate the result. The C<pack> function can only pad strings on the
+right with blanks and it will truncate the result to a maximum length of
+C<$pad_len>.
+
+    # Left padding a string with blanks (no truncation):
+	$padded = sprintf("%${pad_len}s", $text);
+	$padded = sprintf("%*s", $pad_len, $text);  # same thing
+
+    # Right padding a string with blanks (no truncation):
+	$padded = sprintf("%-${pad_len}s", $text);
+	$padded = sprintf("%-*s", $pad_len, $text); # same thing
+
+    # Left padding a number with 0 (no truncation):
+	$padded = sprintf("%0${pad_len}d", $num);
+	$padded = sprintf("%0*d", $pad_len, $num); # same thing
+
+    # Right padding a string with blanks using pack (will truncate):
+    $padded = pack("A$pad_len",$text);
+
+If you need to pad with a character other than blank or zero you can use
+one of the following methods.  They all generate a pad string with the
+C<x> operator and combine that with C<$text>. These methods do
+not truncate C<$text>.
+
+Left and right padding with any character, creating a new string:
+
+    $padded = $pad_char x ( $pad_len - length( $text ) ) . $text;
+    $padded = $text . $pad_char x ( $pad_len - length( $text ) );
+
+Left and right padding with any character, modifying C<$text> directly:
+
+    substr( $text, 0, 0 ) = $pad_char x ( $pad_len - length( $text ) );
+    $text .= $pad_char x ( $pad_len - length( $text ) );
+
+=head2 How do I extract selected columns from a string?
+
+Use substr() or unpack(), both documented in L<perlfunc>.
+If you prefer thinking in terms of columns instead of widths,
+you can use this kind of thing:
+
+    # determine the unpack format needed to split Linux ps output
+    # arguments are cut columns
+    my $fmt = cut2fmt(8, 14, 20, 26, 30, 34, 41, 47, 59, 63, 67, 72);
+
+    sub cut2fmt {
+	my(@positions) = @_;
+	my $template  = '';
+	my $lastpos   = 1;
+	for my $place (@positions) {
+	    $template .= "A" . ($place - $lastpos) . " ";
+	    $lastpos   = $place;
+	}
+	$template .= "A*";
+	return $template;
+    }
+
+=head2 How do I find the soundex value of a string?
+
+(contributed by brian d foy)
+
+You can use the Text::Soundex module. If you want to do fuzzy or close
+matching, you might also try the String::Approx, and Text::Metaphone,
+and Text::DoubleMetaphone modules.
+
+=head2 How can I expand variables in text strings?
+
+Let's assume that you have a string that contains placeholder
+variables.
+
+    $text = 'this has a $foo in it and a $bar';
+
+You can use a substitution with a double evaluation.  The
+first /e turns C<$1> into C<$foo>, and the second /e turns
+C<$foo> into its value.  You may want to wrap this in an
+C<eval>: if you try to get the value of an undeclared variable
+while running under C<use strict>, you get a fatal error.
+
+    eval { $text =~ s/(\$\w+)/$1/eeg };
+    die if $@;
+
+It's probably better in the general case to treat those
+variables as entries in some special hash.  For example:
+
+    %user_defs = (
+	foo  => 23,
+	bar  => 19,
+    );
+    $text =~ s/\$(\w+)/$user_defs{$1}/g;
+
+=head2 What's wrong with always quoting "$vars"?
+
+The problem is that those double-quotes force stringification--
+coercing numbers and references into strings--even when you
+don't want them to be strings.  Think of it this way: double-quote
+expansion is used to produce new strings.  If you already
+have a string, why do you need more?
+
+If you get used to writing odd things like these:
+
+    print "$var";   	# BAD
+    $new = "$old";   	# BAD
+    somefunc("$var");	# BAD
+
+You'll be in trouble.  Those should (in 99.8% of the cases) be
+the simpler and more direct:
+
+    print $var;
+    $new = $old;
+    somefunc($var);
+
+Otherwise, besides slowing you down, you're going to break code when
+the thing in the scalar is actually neither a string nor a number, but
+a reference:
+
+    func(\@array);
+    sub func {
+	my $aref = shift;
+	my $oref = "$aref";  # WRONG
+    }
+
+You can also get into subtle problems on those few operations in Perl
+that actually do care about the difference between a string and a
+number, such as the magical C<++> autoincrement operator or the
+syscall() function.
+
+Stringification also destroys arrays.
+
+    @lines = `command`;
+    print "@lines";		# WRONG - extra blanks
+    print @lines;		# right
+
+=head2 Why don't my E<lt>E<lt>HERE documents work?
+
+Check for these three things:
+
+=over 4
+
+=item There must be no space after the E<lt>E<lt> part.
+
+=item There (probably) should be a semicolon at the end.
+
+=item You can't (easily) have any space in front of the tag.
+
+=back
+
+If you want to indent the text in the here document, you
+can do this:
+
+    # all in one
+    ($VAR = <<HERE_TARGET) =~ s/^\s+//gm;
+        your text
+        goes here
+    HERE_TARGET
+
+But the HERE_TARGET must still be flush against the margin.
+If you want that indented also, you'll have to quote
+in the indentation.
+
+    ($quote = <<'    FINIS') =~ s/^\s+//gm;
+            ...we will have peace, when you and all your works have
+            perished--and the works of your dark master to whom you
+            would deliver us. You are a liar, Saruman, and a corrupter
+            of men's hearts.  --Theoden in /usr/src/perl/taint.c
+        FINIS
+    $quote =~ s/\s+--/\n--/;
+
+A nice general-purpose fixer-upper function for indented here documents
+follows.  It expects to be called with a here document as its argument.
+It looks to see whether each line begins with a common substring, and
+if so, strips that substring off.  Otherwise, it takes the amount of leading
+whitespace found on the first line and removes that much off each
+subsequent line.
+
+    sub fix {
+        local $_ = shift;
+        my ($white, $leader);  # common whitespace and common leading string
+        if (/^\s*(?:([^\w\s]+)(\s*).*\n)(?:\s*\1\2?.*\n)+$/) {
+            ($white, $leader) = ($2, quotemeta($1));
+        } else {
+            ($white, $leader) = (/^(\s+)/, '');
+        }
+        s/^\s*?$leader(?:$white)?//gm;
+        return $_;
+    }
+
+This works with leading special strings, dynamically determined:
+
+    $remember_the_main = fix<<'    MAIN_INTERPRETER_LOOP';
+	@@@ int
+	@@@ runops() {
+	@@@     SAVEI32(runlevel);
+	@@@     runlevel++;
+	@@@     while ( op = (*op->op_ppaddr)() );
+	@@@     TAINT_NOT;
+	@@@     return 0;
+	@@@ }
+    MAIN_INTERPRETER_LOOP
+
+Or with a fixed amount of leading whitespace, with remaining
+indentation correctly preserved:
+
+    $poem = fix<<EVER_ON_AND_ON;
+       Now far ahead the Road has gone,
+	  And I must follow, if I can,
+       Pursuing it with eager feet,
+	  Until it joins some larger way
+       Where many paths and errands meet.
+	  And whither then? I cannot say.
+		--Bilbo in /usr/src/perl/pp_ctl.c
+    EVER_ON_AND_ON
+
+=head1 Data: Arrays
+
+=head2 What is the difference between a list and an array?
+
+An array has a changeable length.  A list does not.  An array is something
+you can push or pop, while a list is a set of values.  Some people make
+the distinction that a list is a value while an array is a variable.
+Subroutines are passed and return lists, you put things into list
+context, you initialize arrays with lists, and you foreach() across
+a list.  C<@> variables are arrays, anonymous arrays are arrays, arrays
+in scalar context behave like the number of elements in them, subroutines
+access their arguments through the array C<@_>, and push/pop/shift only work
+on arrays.
+
+As a side note, there's no such thing as a list in scalar context.
+When you say
+
+    $scalar = (2, 5, 7, 9);
+
+you're using the comma operator in scalar context, so it uses the scalar
+comma operator.  There never was a list there at all!  This causes the
+last value to be returned: 9.
+
+=head2 What is the difference between $array[1] and @array[1]?
+
+The former is a scalar value; the latter an array slice, making
+it a list with one (scalar) value.  You should use $ when you want a
+scalar value (most of the time) and @ when you want a list with one
+scalar value in it (very, very rarely; nearly never, in fact).
+
+Sometimes it doesn't make a difference, but sometimes it does.
+For example, compare:
+
+    $good[0] = `some program that outputs several lines`;
+
+with
+
+    @bad[0]  = `same program that outputs several lines`;
+
+The C<use warnings> pragma and the B<-w> flag will warn you about these
+matters.
+
+=head2 How can I remove duplicate elements from a list or array?
+
+(contributed by brian d foy)
+
+Use a hash. When you think the words "unique" or "duplicated", think
+"hash keys".
+
+If you don't care about the order of the elements, you could just
+create the hash then extract the keys. It's not important how you
+create that hash: just that you use C<keys> to get the unique
+elements.
+
+   my %hash   = map { $_, 1 } @array;
+   # or a hash slice: @hash{ @array } = ();
+   # or a foreach: $hash{$_} = 1 foreach ( @array );
+
+   my @unique = keys %hash;
+
+You can also go through each element and skip the ones you've seen
+before. Use a hash to keep track. The first time the loop sees an
+element, that element has no key in C<%Seen>. The C<next> statement
+creates the key and immediately uses its value, which is C<undef>, so
+the loop continues to the C<push> and increments the value for that
+key. The next time the loop sees that same element, its key exists in
+the hash I<and> the value for that key is true (since it's not 0 or
+undef), so the next skips that iteration and the loop goes to the next
+element.
+
+	my @unique = ();
+	my %seen   = ();
+
+	foreach my $elem ( @array )
+		{
+		next if $seen{ $elem }++;
+		push @unique, $elem;
+		}
+
+You can write this more briefly using a grep, which does the
+same thing.
+
+   my %seen = ();
+   my @unique = grep { ! $seen{ $_ }++ } @array;
+
+=head2 How can I tell whether a certain element is contained in a list or array?
+
+(portions of this answer contributed by Anno Siegel)
+
+Hearing the word "in" is an I<in>dication that you probably should have
+used a hash, not a list or array, to store your data.  Hashes are
+designed to answer this question quickly and efficiently.  Arrays aren't.
+
+That being said, there are several ways to approach this.  If you
+are going to make this query many times over arbitrary string values,
+the fastest way is probably to invert the original array and maintain a
+hash whose keys are the first array's values.
+
+    @blues = qw/azure cerulean teal turquoise lapis-lazuli/;
+    %is_blue = ();
+    for (@blues) { $is_blue{$_} = 1 }
+
+Now you can check whether $is_blue{$some_color}.  It might have been a
+good idea to keep the blues all in a hash in the first place.
+
+If the values are all small integers, you could use a simple indexed
+array.  This kind of an array will take up less space:
+
+    @primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31);
+    @is_tiny_prime = ();
+    for (@primes) { $is_tiny_prime[$_] = 1 }
+    # or simply  @istiny_prime[@primes] = (1) x @primes;
+
+Now you check whether $is_tiny_prime[$some_number].
+
+If the values in question are integers instead of strings, you can save
+quite a lot of space by using bit strings instead:
+
+    @articles = ( 1..10, 150..2000, 2017 );
+    undef $read;
+    for (@articles) { vec($read,$_,1) = 1 }
+
+Now check whether C<vec($read,$n,1)> is true for some C<$n>.
+
+These methods guarantee fast individual tests but require a re-organization
+of the original list or array.  They only pay off if you have to test
+multiple values against the same array.
+
+If you are testing only once, the standard module List::Util exports
+the function C<first> for this purpose.  It works by stopping once it
+finds the element. It's written in C for speed, and its Perl equivalant
+looks like this subroutine:
+
+	sub first (&@) {
+		my $code = shift;
+		foreach (@_) {
+			return $_ if &{$code}();
+		}
+		undef;
+	}
+
+If speed is of little concern, the common idiom uses grep in scalar context
+(which returns the number of items that passed its condition) to traverse the
+entire list. This does have the benefit of telling you how many matches it
+found, though.
+
+	my $is_there = grep $_ eq $whatever, @array;
+
+If you want to actually extract the matching elements, simply use grep in
+list context.
+
+	my @matches = grep $_ eq $whatever, @array;
+
+=head2 How do I compute the difference of two arrays?  How do I compute the intersection of two arrays?
+
+Use a hash.  Here's code to do both and more.  It assumes that
+each element is unique in a given array:
+
+    @union = @intersection = @difference = ();
+    %count = ();
+    foreach $element (@array1, @array2) { $count{$element}++ }
+    foreach $element (keys %count) {
+	push @union, $element;
+	push @{ $count{$element} > 1 ? \@intersection : \@difference }, $element;
+    }
+
+Note that this is the I<symmetric difference>, that is, all elements in
+either A or in B but not in both.  Think of it as an xor operation.
+
+=head2 How do I test whether two arrays or hashes are equal?
+
+The following code works for single-level arrays.  It uses a stringwise
+comparison, and does not distinguish defined versus undefined empty
+strings.  Modify if you have other needs.
+
+    $are_equal = compare_arrays(\@frogs, \@toads);
+
+    sub compare_arrays {
+	my ($first, $second) = @_;
+	no warnings;  # silence spurious -w undef complaints
+	return 0 unless @$first == @$second;
+	for (my $i = 0; $i < @$first; $i++) {
+	    return 0 if $first->[$i] ne $second->[$i];
+	}
+	return 1;
+    }
+
+For multilevel structures, you may wish to use an approach more
+like this one.  It uses the CPAN module FreezeThaw:
+
+    use FreezeThaw qw(cmpStr);
+    @a = @b = ( "this", "that", [ "more", "stuff" ] );
+
+    printf "a and b contain %s arrays\n",
+        cmpStr(\@a, \@b) == 0
+	    ? "the same"
+	    : "different";
+
+This approach also works for comparing hashes.  Here
+we'll demonstrate two different answers:
+
+    use FreezeThaw qw(cmpStr cmpStrHard);
+
+    %a = %b = ( "this" => "that", "extra" => [ "more", "stuff" ] );
+    $a{EXTRA} = \%b;
+    $b{EXTRA} = \%a;
+
+    printf "a and b contain %s hashes\n",
+	cmpStr(\%a, \%b) == 0 ? "the same" : "different";
+
+    printf "a and b contain %s hashes\n",
+	cmpStrHard(\%a, \%b) == 0 ? "the same" : "different";
+
+
+The first reports that both those the hashes contain the same data,
+while the second reports that they do not.  Which you prefer is left as
+an exercise to the reader.
+
+=head2 How do I find the first array element for which a condition is true?
+
+To find the first array element which satisfies a condition, you can
+use the first() function in the List::Util module, which comes with
+Perl 5.8.  This example finds the first element that contains "Perl".
+
+	use List::Util qw(first);
+
+	my $element = first { /Perl/ } @array;
+
+If you cannot use List::Util, you can make your own loop to do the
+same thing.  Once you find the element, you stop the loop with last.
+
+	my $found;
+	foreach ( @array )
+		{
+		if( /Perl/ ) { $found = $_; last }
+		}
+
+If you want the array index, you can iterate through the indices
+and check the array element at each index until you find one
+that satisfies the condition.
+
+	my( $found, $index ) = ( undef, -1 );
+	for( $i = 0; $i < @array; $i++ )
+		{
+		if( $array[$i] =~ /Perl/ )
+			{
+			$found = $array[$i];
+			$index = $i;
+			last;
+			}
+		}
+
+=head2 How do I handle linked lists?
+
+In general, you usually don't need a linked list in Perl, since with
+regular arrays, you can push and pop or shift and unshift at either end,
+or you can use splice to add and/or remove arbitrary number of elements at
+arbitrary points.  Both pop and shift are both O(1) operations on Perl's
+dynamic arrays.  In the absence of shifts and pops, push in general
+needs to reallocate on the order every log(N) times, and unshift will
+need to copy pointers each time.
+
+If you really, really wanted, you could use structures as described in
+L<perldsc> or L<perltoot> and do just what the algorithm book tells you
+to do.  For example, imagine a list node like this:
+
+    $node = {
+        VALUE => 42,
+        LINK  => undef,
+    };
+
+You could walk the list this way:
+
+    print "List: ";
+    for ($node = $head;  $node; $node = $node->{LINK}) {
+        print $node->{VALUE}, " ";
+    }
+    print "\n";
+
+You could add to the list this way:
+
+    my ($head, $tail);
+    $tail = append($head, 1);       # grow a new head
+    for $value ( 2 .. 10 ) {
+        $tail = append($tail, $value);
+    }
+
+    sub append {
+        my($list, $value) = @_;
+        my $node = { VALUE => $value };
+        if ($list) {
+            $node->{LINK} = $list->{LINK};
+            $list->{LINK} = $node;
+        } else {
+            $_[0] = $node;      # replace caller's version
+        }
+        return $node;
+    }
+
+But again, Perl's built-in are virtually always good enough.
+
+=head2 How do I handle circular lists?
+
+Circular lists could be handled in the traditional fashion with linked
+lists, or you could just do something like this with an array:
+
+    unshift(@array, pop(@array));  # the last shall be first
+    push(@array, shift(@array));   # and vice versa
+
+=head2 How do I shuffle an array randomly?
+
+If you either have Perl 5.8.0 or later installed, or if you have
+Scalar-List-Utils 1.03 or later installed, you can say:
+
+    use List::Util 'shuffle';
+
+	@shuffled = shuffle(@list);
+
+If not, you can use a Fisher-Yates shuffle.
+
+    sub fisher_yates_shuffle {
+        my $deck = shift;  # $deck is a reference to an array
+        my $i = @$deck;
+        while (--$i) {
+            my $j = int rand ($i+1);
+            @$deck[$i,$j] = @$deck[$j,$i];
+        }
+    }
+
+    # shuffle my mpeg collection
+    #
+    my @mpeg = <audio/*/*.mp3>;
+    fisher_yates_shuffle( \@mpeg );    # randomize @mpeg in place
+    print @mpeg;
+
+Note that the above implementation shuffles an array in place,
+unlike the List::Util::shuffle() which takes a list and returns
+a new shuffled list.
+
+You've probably seen shuffling algorithms that work using splice,
+randomly picking another element to swap the current element with
+
+    srand;
+    @new = ();
+    @old = 1 .. 10;  # just a demo
+    while (@old) {
+	push(@new, splice(@old, rand @old, 1));
+    }
+
+This is bad because splice is already O(N), and since you do it N times,
+you just invented a quadratic algorithm; that is, O(N**2).  This does
+not scale, although Perl is so efficient that you probably won't notice
+this until you have rather largish arrays.
+
+=head2 How do I process/modify each element of an array?
+
+Use C<for>/C<foreach>:
+
+    for (@lines) {
+		s/foo/bar/;	# change that word
+		tr/XZ/ZX/;	# swap those letters
+    }
+
+Here's another; let's compute spherical volumes:
+
+    for (@volumes = @radii) {   # @volumes has changed parts
+		$_ **= 3;
+		$_ *= (4/3) * 3.14159;  # this will be constant folded
+    }
+
+which can also be done with map() which is made to transform
+one list into another:
+
+	@volumes = map {$_ ** 3 * (4/3) * 3.14159} @radii;
+
+If you want to do the same thing to modify the values of the
+hash, you can use the C<values> function.  As of Perl 5.6
+the values are not copied, so if you modify $orbit (in this
+case), you modify the value.
+
+    for $orbit ( values %orbits ) {
+		($orbit **= 3) *= (4/3) * 3.14159;
+    }
+
+Prior to perl 5.6 C<values> returned copies of the values,
+so older perl code often contains constructions such as
+C<@orbits{keys %orbits}> instead of C<values %orbits> where
+the hash is to be modified.
+
+=head2 How do I select a random element from an array?
+
+Use the rand() function (see L<perlfunc/rand>):
+
+    $index   = rand @array;
+    $element = $array[$index];
+
+Or, simply:
+    my $element = $array[ rand @array ];
+
+=head2 How do I permute N elements of a list?
+
+Use the List::Permutor module on CPAN.  If the list is
+actually an array, try the Algorithm::Permute module (also
+on CPAN).  It's written in XS code and is very efficient.
+
+	use Algorithm::Permute;
+	my @array = 'a'..'d';
+	my $p_iterator = Algorithm::Permute->new ( \@array );
+	while (my @perm = $p_iterator->next) {
+	   print "next permutation: (@perm)\n";
+	}
+
+For even faster execution, you could do:
+
+   use Algorithm::Permute;
+   my @array = 'a'..'d';
+   Algorithm::Permute::permute {
+      print "next permutation: (@array)\n";
+   } @array;
+
+Here's a little program that generates all permutations of
+all the words on each line of input. The algorithm embodied
+in the permute() function is discussed in Volume 4 (still
+unpublished) of Knuth's I<The Art of Computer Programming>
+and will work on any list:
+
+	#!/usr/bin/perl -n
+	# Fischer-Kause ordered permutation generator
+
+	sub permute (&@) {
+		my $code = shift;
+		my @idx = 0..$#_;
+		while ( $code->(@_[@idx]) ) {
+			my $p = $#idx;
+			--$p while $idx[$p-1] > $idx[$p];
+			my $q = $p or return;
+			push @idx, reverse splice @idx, $p;
+			++$q while $idx[$p-1] > $idx[$q];
+			@idx[$p-1,$q]=@idx[$q,$p-1];
+		}
+	}
+
+	permute {print"@_\n"} split;
+
+=head2 How do I sort an array by (anything)?
+
+Supply a comparison function to sort() (described in L<perlfunc/sort>):
+
+    @list = sort { $a <=> $b } @list;
+
+The default sort function is cmp, string comparison, which would
+sort C<(1, 2, 10)> into C<(1, 10, 2)>.  C<< <=> >>, used above, is
+the numerical comparison operator.
+
+If you have a complicated function needed to pull out the part you
+want to sort on, then don't do it inside the sort function.  Pull it
+out first, because the sort BLOCK can be called many times for the
+same element.  Here's an example of how to pull out the first word
+after the first number on each item, and then sort those words
+case-insensitively.
+
+    @idx = ();
+    for (@data) {
+	($item) = /\d+\s*(\S+)/;
+	push @idx, uc($item);
+    }
+    @sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];
+
+which could also be written this way, using a trick
+that's come to be known as the Schwartzian Transform:
+
+    @sorted = map  { $_->[0] }
+	      sort { $a->[1] cmp $b->[1] }
+	      map  { [ $_, uc( (/\d+\s*(\S+)/)[0]) ] } @data;
+
+If you need to sort on several fields, the following paradigm is useful.
+
+    @sorted = sort { field1($a) <=> field1($b) ||
+                     field2($a) cmp field2($b) ||
+                     field3($a) cmp field3($b)
+                   }     @data;
+
+This can be conveniently combined with precalculation of keys as given
+above.
+
+See the F<sort> article in the "Far More Than You Ever Wanted
+To Know" collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz for
+more about this approach.
+
+See also the question below on sorting hashes.
+
+=head2 How do I manipulate arrays of bits?
+
+Use pack() and unpack(), or else vec() and the bitwise operations.
+
+For example, this sets $vec to have bit N set if $ints[N] was set:
+
+    $vec = '';
+    foreach(@ints) { vec($vec,$_,1) = 1 }
+
+Here's how, given a vector in $vec, you can
+get those bits into your @ints array:
+
+    sub bitvec_to_list {
+	my $vec = shift;
+	my @ints;
+	# Find null-byte density then select best algorithm
+	if ($vec =~ tr/\0// / length $vec > 0.95) {
+	    use integer;
+	    my $i;
+	    # This method is faster with mostly null-bytes
+	    while($vec =~ /[^\0]/g ) {
+		$i = -9 + 8 * pos $vec;
+		push @ints, $i if vec($vec, ++$i, 1);
+		push @ints, $i if vec($vec, ++$i, 1);
+		push @ints, $i if vec($vec, ++$i, 1);
+		push @ints, $i if vec($vec, ++$i, 1);
+		push @ints, $i if vec($vec, ++$i, 1);
+		push @ints, $i if vec($vec, ++$i, 1);
+		push @ints, $i if vec($vec, ++$i, 1);
+		push @ints, $i if vec($vec, ++$i, 1);
+	    }
+	} else {
+	    # This method is a fast general algorithm
+	    use integer;
+	    my $bits = unpack "b*", $vec;
+	    push @ints, 0 if $bits =~ s/^(\d)// && $1;
+	    push @ints, pos $bits while($bits =~ /1/g);
+	}
+	return \@ints;
+    }
+
+This method gets faster the more sparse the bit vector is.
+(Courtesy of Tim Bunce and Winfried Koenig.)
+
+You can make the while loop a lot shorter with this suggestion
+from Benjamin Goldberg:
+
+	while($vec =~ /[^\0]+/g ) {
+	   push @ints, grep vec($vec, $_, 1), $-[0] * 8 .. $+[0] * 8;
+	}
+
+Or use the CPAN module Bit::Vector:
+
+    $vector = Bit::Vector->new($num_of_bits);
+    $vector->Index_List_Store(@ints);
+    @ints = $vector->Index_List_Read();
+
+Bit::Vector provides efficient methods for bit vector, sets of small integers
+and "big int" math.
+
+Here's a more extensive illustration using vec():
+
+    # vec demo
+    $vector = "\xff\x0f\xef\xfe";
+    print "Ilya's string \\xff\\x0f\\xef\\xfe represents the number ",
+	unpack("N", $vector), "\n";
+    $is_set = vec($vector, 23, 1);
+    print "Its 23rd bit is ", $is_set ? "set" : "clear", ".\n";
+    pvec($vector);
+
+    set_vec(1,1,1);
+    set_vec(3,1,1);
+    set_vec(23,1,1);
+
+    set_vec(3,1,3);
+    set_vec(3,2,3);
+    set_vec(3,4,3);
+    set_vec(3,4,7);
+    set_vec(3,8,3);
+    set_vec(3,8,7);
+
+    set_vec(0,32,17);
+    set_vec(1,32,17);
+
+    sub set_vec {
+	my ($offset, $width, $value) = @_;
+	my $vector = '';
+	vec($vector, $offset, $width) = $value;
+	print "offset=$offset width=$width value=$value\n";
+	pvec($vector);
+    }
+
+    sub pvec {
+	my $vector = shift;
+	my $bits = unpack("b*", $vector);
+	my $i = 0;
+	my $BASE = 8;
+
+	print "vector length in bytes: ", length($vector), "\n";
+	@bytes = unpack("A8" x length($vector), $bits);
+	print "bits are: @bytes\n\n";
+    }
+
+=head2 Why does defined() return true on empty arrays and hashes?
+
+The short story is that you should probably only use defined on scalars or
+functions, not on aggregates (arrays and hashes).  See L<perlfunc/defined>
+in the 5.004 release or later of Perl for more detail.
+
+=head1 Data: Hashes (Associative Arrays)
+
+=head2 How do I process an entire hash?
+
+Use the each() function (see L<perlfunc/each>) if you don't care
+whether it's sorted:
+
+    while ( ($key, $value) = each %hash) {
+	print "$key = $value\n";
+    }
+
+If you want it sorted, you'll have to use foreach() on the result of
+sorting the keys as shown in an earlier question.
+
+=head2 What happens if I add or remove keys from a hash while iterating over it?
+
+(contributed by brian d foy)
+
+The easy answer is "Don't do that!"
+
+If you iterate through the hash with each(), you can delete the key
+most recently returned without worrying about it.  If you delete or add
+other keys, the iterator may skip or double up on them since perl
+may rearrange the hash table.  See the
+entry for C<each()> in L<perlfunc>.
+
+=head2 How do I look up a hash element by value?
+
+Create a reverse hash:
+
+    %by_value = reverse %by_key;
+    $key = $by_value{$value};
+
+That's not particularly efficient.  It would be more space-efficient
+to use:
+
+    while (($key, $value) = each %by_key) {
+	$by_value{$value} = $key;
+    }
+
+If your hash could have repeated values, the methods above will only find
+one of the associated keys.   This may or may not worry you.  If it does
+worry you, you can always reverse the hash into a hash of arrays instead:
+
+     while (($key, $value) = each %by_key) {
+	 push @{$key_list_by_value{$value}}, $key;
+     }
+
+=head2 How can I know how many entries are in a hash?
+
+If you mean how many keys, then all you have to do is
+use the keys() function in a scalar context:
+
+    $num_keys = keys %hash;
+
+The keys() function also resets the iterator, which means that you may
+see strange results if you use this between uses of other hash operators
+such as each().
+
+=head2 How do I sort a hash (optionally by value instead of key)?
+
+(contributed by brian d foy)
+
+To sort a hash, start with the keys. In this example, we give the list of
+keys to the sort function which then compares them ASCIIbetically (which
+might be affected by your locale settings). The output list has the keys
+in ASCIIbetical order. Once we have the keys, we can go through them to
+create a report which lists the keys in ASCIIbetical order.
+
+	my @keys = sort { $a cmp $b } keys %hash;
+
+	foreach my $key ( @keys )
+		{
+		printf "%-20s %6d\n", $key, $hash{$value};
+		}
+
+We could get more fancy in the C<sort()> block though. Instead of
+comparing the keys, we can compute a value with them and use that
+value as the comparison.
+
+For instance, to make our report order case-insensitive, we use
+the C<\L> sequence in a double-quoted string to make everything
+lowercase. The C<sort()> block then compares the lowercased
+values to determine in which order to put the keys.
+
+	my @keys = sort { "\L$a" cmp "\L$b" } keys %hash;
+
+Note: if the computation is expensive or the hash has many elements,
+you may want to look at the Schwartzian Transform to cache the
+computation results.
+
+If we want to sort by the hash value instead, we use the hash key
+to look it up. We still get out a list of keys, but this time they
+are ordered by their value.
+
+	my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
+
+From there we can get more complex. If the hash values are the same,
+we can provide a secondary sort on the hash key.
+
+	my @keys = sort {
+		$hash{$a} <=> $hash{$b}
+			or
+		"\L$a" cmp "\L$b"
+		} keys %hash;
+
+=head2 How can I always keep my hash sorted?
+
+You can look into using the DB_File module and tie() using the
+$DB_BTREE hash bindings as documented in L<DB_File/"In Memory Databases">.
+The Tie::IxHash module from CPAN might also be instructive.
+
+=head2 What's the difference between "delete" and "undef" with hashes?
+
+Hashes contain pairs of scalars: the first is the key, the
+second is the value.  The key will be coerced to a string,
+although the value can be any kind of scalar: string,
+number, or reference.  If a key $key is present in
+%hash, C<exists($hash{$key})> will return true.  The value
+for a given key can be C<undef>, in which case
+C<$hash{$key}> will be C<undef> while C<exists $hash{$key}>
+will return true.  This corresponds to (C<$key>, C<undef>)
+being in the hash.
+
+Pictures help...  here's the %hash table:
+
+	  keys  values
+	+------+------+
+	|  a   |  3   |
+	|  x   |  7   |
+	|  d   |  0   |
+	|  e   |  2   |
+	+------+------+
+
+And these conditions hold
+
+	$hash{'a'}                       is true
+	$hash{'d'}                       is false
+	defined $hash{'d'}               is true
+	defined $hash{'a'}               is true
+	exists $hash{'a'}                is true (Perl5 only)
+	grep ($_ eq 'a', keys %hash)     is true
+
+If you now say
+
+	undef $hash{'a'}
+
+your table now reads:
+
+
+	  keys  values
+	+------+------+
+	|  a   | undef|
+	|  x   |  7   |
+	|  d   |  0   |
+	|  e   |  2   |
+	+------+------+
+
+and these conditions now hold; changes in caps:
+
+	$hash{'a'}                       is FALSE
+	$hash{'d'}                       is false
+	defined $hash{'d'}               is true
+	defined $hash{'a'}               is FALSE
+	exists $hash{'a'}                is true (Perl5 only)
+	grep ($_ eq 'a', keys %hash)     is true
+
+Notice the last two: you have an undef value, but a defined key!
+
+Now, consider this:
+
+	delete $hash{'a'}
+
+your table now reads:
+
+	  keys  values
+	+------+------+
+	|  x   |  7   |
+	|  d   |  0   |
+	|  e   |  2   |
+	+------+------+
+
+and these conditions now hold; changes in caps:
+
+	$hash{'a'}                       is false
+	$hash{'d'}                       is false
+	defined $hash{'d'}               is true
+	defined $hash{'a'}               is false
+	exists $hash{'a'}                is FALSE (Perl5 only)
+	grep ($_ eq 'a', keys %hash)     is FALSE
+
+See, the whole entry is gone!
+
+=head2 Why don't my tied hashes make the defined/exists distinction?
+
+This depends on the tied hash's implementation of EXISTS().
+For example, there isn't the concept of undef with hashes
+that are tied to DBM* files. It also means that exists() and
+defined() do the same thing with a DBM* file, and what they
+end up doing is not what they do with ordinary hashes.
+
+=head2 How do I reset an each() operation part-way through?
+
+Using C<keys %hash> in scalar context returns the number of keys in
+the hash I<and> resets the iterator associated with the hash.  You may
+need to do this if you use C<last> to exit a loop early so that when you
+re-enter it, the hash iterator has been reset.
+
+=head2 How can I get the unique keys from two hashes?
+
+First you extract the keys from the hashes into lists, then solve
+the "removing duplicates" problem described above.  For example:
+
+    %seen = ();
+    for $element (keys(%foo), keys(%bar)) {
+	$seen{$element}++;
+    }
+    @uniq = keys %seen;
+
+Or more succinctly:
+
+    @uniq = keys %{{%foo,%bar}};
+
+Or if you really want to save space:
+
+    %seen = ();
+    while (defined ($key = each %foo)) {
+        $seen{$key}++;
+    }
+    while (defined ($key = each %bar)) {
+        $seen{$key}++;
+    }
+    @uniq = keys %seen;
+
+=head2 How can I store a multidimensional array in a DBM file?
+
+Either stringify the structure yourself (no fun), or else
+get the MLDBM (which uses Data::Dumper) module from CPAN and layer
+it on top of either DB_File or GDBM_File.
+
+=head2 How can I make my hash remember the order I put elements into it?
+
+Use the Tie::IxHash from CPAN.
+
+    use Tie::IxHash;
+    tie my %myhash, 'Tie::IxHash';
+    for (my $i=0; $i<20; $i++) {
+        $myhash{$i} = 2*$i;
+    }
+    my @keys = keys %myhash;
+    # @keys = (0,1,2,3,...)
+
+=head2 Why does passing a subroutine an undefined element in a hash create it?
+
+If you say something like:
+
+    somefunc($hash{"nonesuch key here"});
+
+Then that element "autovivifies"; that is, it springs into existence
+whether you store something there or not.  That's because functions
+get scalars passed in by reference.  If somefunc() modifies C<$_[0]>,
+it has to be ready to write it back into the caller's version.
+
+This has been fixed as of Perl5.004.
+
+Normally, merely accessing a key's value for a nonexistent key does
+I<not> cause that key to be forever there.  This is different than
+awk's behavior.
+
+=head2 How can I make the Perl equivalent of a C structure/C++ class/hash or array of hashes or arrays?
+
+Usually a hash ref, perhaps like this:
+
+    $record = {
+        NAME   => "Jason",
+        EMPNO  => 132,
+        TITLE  => "deputy peon",
+        AGE    => 23,
+        SALARY => 37_000,
+        PALS   => [ "Norbert", "Rhys", "Phineas"],
+    };
+
+References are documented in L<perlref> and the upcoming L<perlreftut>.
+Examples of complex data structures are given in L<perldsc> and
+L<perllol>.  Examples of structures and object-oriented classes are
+in L<perltoot>.
+
+=head2 How can I use a reference as a hash key?
+
+(contributed by brian d foy)
+
+Hash keys are strings, so you can't really use a reference as the key.
+When you try to do that, perl turns the reference into its stringified
+form (for instance, C<HASH(0xDEADBEEF)>). From there you can't get back
+the reference from the stringified form, at least without doing some
+extra work on your own. Also remember that hash keys must be unique, but
+two different variables can store the same reference (and those variables
+can change later).
+
+The Tie::RefHash module, which is distributed with perl, might be what
+you want. It handles that extra work.
+
+=head1 Data: Misc
+
+=head2 How do I handle binary data correctly?
+
+Perl is binary clean, so this shouldn't be a problem.  For example,
+this works fine (assuming the files are found):
+
+    if (`cat /vmunix` =~ /gzip/) {
+	print "Your kernel is GNU-zip enabled!\n";
+    }
+
+On less elegant (read: Byzantine) systems, however, you have
+to play tedious games with "text" versus "binary" files.  See
+L<perlfunc/"binmode"> or L<perlopentut>.
+
+If you're concerned about 8-bit ASCII data, then see L<perllocale>.
+
+If you want to deal with multibyte characters, however, there are
+some gotchas.  See the section on Regular Expressions.
+
+=head2 How do I determine whether a scalar is a number/whole/integer/float?
+
+Assuming that you don't care about IEEE notations like "NaN" or
+"Infinity", you probably just want to use a regular expression.
+
+   if (/\D/)            { print "has nondigits\n" }
+   if (/^\d+$/)         { print "is a whole number\n" }
+   if (/^-?\d+$/)       { print "is an integer\n" }
+   if (/^[+-]?\d+$/)    { print "is a +/- integer\n" }
+   if (/^-?\d+\.?\d*$/) { print "is a real number\n" }
+   if (/^-?(?:\d+(?:\.\d*)?|\.\d+)$/) { print "is a decimal number\n" }
+   if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
+			{ print "a C float\n" }
+
+There are also some commonly used modules for the task.
+L<Scalar::Util> (distributed with 5.8) provides access to perl's
+internal function C<looks_like_number> for determining
+whether a variable looks like a number.  L<Data::Types>
+exports functions that validate data types using both the
+above and other regular expressions. Thirdly, there is
+C<Regexp::Common> which has regular expressions to match
+various types of numbers. Those three modules are available
+from the CPAN.
+
+If you're on a POSIX system, Perl supports the C<POSIX::strtod>
+function.  Its semantics are somewhat cumbersome, so here's a C<getnum>
+wrapper function for more convenient access.  This function takes
+a string and returns the number it found, or C<undef> for input that
+isn't a C float.  The C<is_numeric> function is a front end to C<getnum>
+if you just want to say, "Is this a float?"
+
+    sub getnum {
+        use POSIX qw(strtod);
+        my $str = shift;
+        $str =~ s/^\s+//;
+        $str =~ s/\s+$//;
+        $! = 0;
+        my($num, $unparsed) = strtod($str);
+        if (($str eq '') || ($unparsed != 0) || $!) {
+            return undef;
+        } else {
+            return $num;
+        }
+    }
+
+    sub is_numeric { defined getnum($_[0]) }
+
+Or you could check out the L<String::Scanf> module on the CPAN
+instead. The POSIX module (part of the standard Perl distribution) provides
+the C<strtod> and C<strtol> for converting strings to double and longs,
+respectively.
+
+=head2 How do I keep persistent data across program calls?
+
+For some specific applications, you can use one of the DBM modules.
+See L<AnyDBM_File>.  More generically, you should consult the FreezeThaw
+or Storable modules from CPAN.  Starting from Perl 5.8 Storable is part
+of the standard distribution.  Here's one example using Storable's C<store>
+and C<retrieve> functions:
+
+    use Storable;
+    store(\%hash, "filename");
+
+    # later on...
+    $href = retrieve("filename");        # by ref
+    %hash = %{ retrieve("filename") };   # direct to hash
+
+=head2 How do I print out or copy a recursive data structure?
+
+The Data::Dumper module on CPAN (or the 5.005 release of Perl) is great
+for printing out data structures.  The Storable module on CPAN (or the
+5.8 release of Perl), provides a function called C<dclone> that recursively
+copies its argument.
+
+    use Storable qw(dclone);
+    $r2 = dclone($r1);
+
+Where $r1 can be a reference to any kind of data structure you'd like.
+It will be deeply copied.  Because C<dclone> takes and returns references,
+you'd have to add extra punctuation if you had a hash of arrays that
+you wanted to copy.
+
+    %newhash = %{ dclone(\%oldhash) };
+
+=head2 How do I define methods for every class/object?
+
+Use the UNIVERSAL class (see L<UNIVERSAL>).
+
+=head2 How do I verify a credit card checksum?
+
+Get the Business::CreditCard module from CPAN.
+
+=head2 How do I pack arrays of doubles or floats for XS code?
+
+The kgbpack.c code in the PGPLOT module on CPAN does just this.
+If you're doing a lot of float or double processing, consider using
+the PDL module from CPAN instead--it makes number-crunching easy.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2006 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain.  You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit.  A simple comment in the code giving
+credit would be courteous but is not required.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq5.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq5.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq5.pod	(revision 14489)
@@ -0,0 +1,1119 @@
+=head1 NAME
+
+perlfaq5 - Files and Formats ($Revision: 1.42 $, $Date: 2005/12/31 00:54:37 $)
+
+=head1 DESCRIPTION
+
+This section deals with I/O and the "f" issues: filehandles, flushing,
+formats, and footers.
+
+=head2 How do I flush/unbuffer an output filehandle?  Why must I do this?
+X<flush> X<buffer> X<unbuffer> X<autoflush>
+
+Perl does not support truly unbuffered output (except
+insofar as you can C<syswrite(OUT, $char, 1)>), although it
+does support is "command buffering", in which a physical
+write is performed after every output command.
+
+The C standard I/O library (stdio) normally buffers
+characters sent to devices so that there isn't a system call
+for each byte. In most stdio implementations, the type of
+output buffering and the size of the buffer varies according
+to the type of device. Perl's print() and write() functions
+normally buffer output, while syswrite() bypasses buffering
+all together.
+
+If you want your output to be sent immediately when you
+execute print() or write() (for instance, for some network
+protocols), you must set the handle's autoflush flag. This
+flag is the Perl variable $| and when it is set to a true
+value, Perl will flush the handle's buffer after each
+print() or write(). Setting $| affects buffering only for
+the currently selected default file handle. You choose this
+handle with the one argument select() call (see
+L<perlvar/$E<verbar>> and L<perlfunc/select>).
+
+Use select() to choose the desired handle, then set its
+per-filehandle variables.
+
+    $old_fh = select(OUTPUT_HANDLE);
+    $| = 1;
+    select($old_fh);
+
+Some idioms can handle this in a single statement:
+
+    select((select(OUTPUT_HANDLE), $| = 1)[0]);
+
+    $| = 1, select $_ for select OUTPUT_HANDLE;
+
+Some modules offer object-oriented access to handles and their
+variables, although they may be overkill if this is the only
+thing you do with them.  You can use IO::Handle:
+
+    use IO::Handle;
+    open(DEV, ">/dev/printer");   # but is this?
+    DEV->autoflush(1);
+
+or IO::Socket:
+
+    use IO::Socket;		  # this one is kinda a pipe?
+	my $sock = IO::Socket::INET->new( 'www.example.com:80' );
+
+    $sock->autoflush();
+
+=head2 How do I change one line in a file/delete a line in a file/insert a line in the middle of a file/append to the beginning of a file?
+X<file, editing>
+
+Use the Tie::File module, which is included in the standard
+distribution since Perl 5.8.0.
+
+=head2 How do I count the number of lines in a file?
+X<file, counting lines> X<lines> X<line>
+
+One fairly efficient way is to count newlines in the file. The
+following program uses a feature of tr///, as documented in L<perlop>.
+If your text file doesn't end with a newline, then it's not really a
+proper text file, so this may report one fewer line than you expect.
+
+    $lines = 0;
+    open(FILE, $filename) or die "Can't open `$filename': $!";
+    while (sysread FILE, $buffer, 4096) {
+	$lines += ($buffer =~ tr/\n//);
+    }
+    close FILE;
+
+This assumes no funny games with newline translations.
+
+=head2 How can I use Perl's C<-i> option from within a program?
+X<-i> X<in-place>
+
+C<-i> sets the value of Perl's C<$^I> variable, which in turn affects
+the behavior of C<< <> >>; see L<perlrun> for more details.  By
+modifying the appropriate variables directly, you can get the same
+behavior within a larger program.  For example:
+
+     # ...
+     {
+        local($^I, @ARGV) = ('.orig', glob("*.c"));
+        while (<>) {
+           if ($. == 1) {
+               print "This line should appear at the top of each file\n";
+           }
+           s/\b(p)earl\b/${1}erl/i;        # Correct typos, preserving case
+           print;
+           close ARGV if eof;              # Reset $.
+        }
+     }
+     # $^I and @ARGV return to their old values here
+
+This block modifies all the C<.c> files in the current directory,
+leaving a backup of the original data from each file in a new
+C<.c.orig> file.
+
+=head2 How can I copy a file?
+X<copy> X<file, copy>
+
+(contributed by brian d foy)
+
+Use the File::Copy module. It comes with Perl and can do a
+true copy across file systems, and it does its magic in
+a portable fashion.
+
+	use File::Copy;
+
+	copy( $original, $new_copy ) or die "Copy failed: $!";
+
+If you can't use File::Copy, you'll have to do the work yourself:
+open the original file, open the destination file, then print
+to the destination file as you read the original.
+
+=head2 How do I make a temporary file name?
+X<file, temporary>
+
+If you don't need to know the name of the file, you can use C<open()>
+with C<undef> in place of the file name.  The C<open()> function
+creates an anonymous temporary file.
+
+	open my $tmp, '+>', undef or die $!;
+
+Otherwise, you can use the File::Temp module.
+
+  use File::Temp qw/ tempfile tempdir /;
+
+  $dir = tempdir( CLEANUP => 1 );
+  ($fh, $filename) = tempfile( DIR => $dir );
+
+  # or if you don't need to know the filename
+
+  $fh = tempfile( DIR => $dir );
+
+The File::Temp has been a standard module since Perl 5.6.1.  If you
+don't have a modern enough Perl installed, use the C<new_tmpfile>
+class method from the IO::File module to get a filehandle opened for
+reading and writing.  Use it if you don't need to know the file's name:
+
+    use IO::File;
+    $fh = IO::File->new_tmpfile()
+	or die "Unable to make new temporary file: $!";
+
+If you're committed to creating a temporary file by hand, use the
+process ID and/or the current time-value.  If you need to have many
+temporary files in one process, use a counter:
+
+    BEGIN {
+	use Fcntl;
+	my $temp_dir = -d '/tmp' ? '/tmp' : $ENV{TMPDIR} || $ENV{TEMP};
+	my $base_name = sprintf("%s/%d-%d-0000", $temp_dir, $$, time());
+	sub temp_file {
+	    local *FH;
+	    my $count = 0;
+	    until (defined(fileno(FH)) || $count++ > 100) {
+		$base_name =~ s/-(\d+)$/"-" . (1 + $1)/e;
+		# O_EXCL is required for security reasons.
+		sysopen(FH, $base_name, O_WRONLY|O_EXCL|O_CREAT);
+	    }
+	    if (defined(fileno(FH))
+		return (*FH, $base_name);
+	    } else {
+		return ();
+	    }
+	}
+    }
+
+=head2 How can I manipulate fixed-record-length files?
+X<fixed-length> X<file, fixed-length records>
+
+The most efficient way is using L<pack()|perlfunc/"pack"> and
+L<unpack()|perlfunc/"unpack">.  This is faster than using
+L<substr()|perlfunc/"substr"> when taking many, many strings.  It is
+slower for just a few.
+
+Here is a sample chunk of code to break up and put back together again
+some fixed-format input lines, in this case from the output of a normal,
+Berkeley-style ps:
+
+    # sample input line:
+    #   15158 p5  T      0:00 perl /home/tchrist/scripts/now-what
+    my $PS_T = 'A6 A4 A7 A5 A*';
+    open my $ps, '-|', 'ps';
+    print scalar <$ps>;
+    my @fields = qw( pid tt stat time command );
+    while (<$ps>) {
+        my %process;
+        @process{@fields} = unpack($PS_T, $_);
+	for my $field ( @fields ) {
+	    print "$field: <$process{$field}>\n";
+	}
+	print 'line=', pack($PS_T, @process{@fields} ), "\n";
+    }
+
+We've used a hash slice in order to easily handle the fields of each row.
+Storing the keys in an array means it's easy to operate on them as a
+group or loop over them with for. It also avoids polluting the program
+with global variables and using symbolic references.
+
+=head2 How can I make a filehandle local to a subroutine?  How do I pass filehandles between subroutines?  How do I make an array of filehandles?
+X<filehandle, local> X<filehandle, passing> X<filehandle, reference>
+
+As of perl5.6, open() autovivifies file and directory handles
+as references if you pass it an uninitialized scalar variable.
+You can then pass these references just like any other scalar,
+and use them in the place of named handles.
+
+	open my    $fh, $file_name;
+
+	open local $fh, $file_name;
+
+	print $fh "Hello World!\n";
+
+	process_file( $fh );
+
+Before perl5.6, you had to deal with various typeglob idioms
+which you may see in older code.
+
+	open FILE, "> $filename";
+	process_typeglob(   *FILE );
+	process_reference( \*FILE );
+
+	sub process_typeglob  { local *FH = shift; print FH  "Typeglob!" }
+	sub process_reference { local $fh = shift; print $fh "Reference!" }
+
+If you want to create many anonymous handles, you should
+check out the Symbol or IO::Handle modules.
+
+=head2 How can I use a filehandle indirectly?
+X<filehandle, indirect>
+
+An indirect filehandle is using something other than a symbol
+in a place that a filehandle is expected.  Here are ways
+to get indirect filehandles:
+
+    $fh =   SOME_FH;       # bareword is strict-subs hostile
+    $fh =  "SOME_FH";      # strict-refs hostile; same package only
+    $fh =  *SOME_FH;       # typeglob
+    $fh = \*SOME_FH;       # ref to typeglob (bless-able)
+    $fh =  *SOME_FH{IO};   # blessed IO::Handle from *SOME_FH typeglob
+
+Or, you can use the C<new> method from one of the IO::* modules to
+create an anonymous filehandle, store that in a scalar variable,
+and use it as though it were a normal filehandle.
+
+    use IO::Handle;                     # 5.004 or higher
+    $fh = IO::Handle->new();
+
+Then use any of those as you would a normal filehandle.  Anywhere that
+Perl is expecting a filehandle, an indirect filehandle may be used
+instead. An indirect filehandle is just a scalar variable that contains
+a filehandle.  Functions like C<print>, C<open>, C<seek>, or
+the C<< <FH> >> diamond operator will accept either a named filehandle
+or a scalar variable containing one:
+
+    ($ifh, $ofh, $efh) = (*STDIN, *STDOUT, *STDERR);
+    print $ofh "Type it: ";
+    $got = <$ifh>
+    print $efh "What was that: $got";
+
+If you're passing a filehandle to a function, you can write
+the function in two ways:
+
+    sub accept_fh {
+        my $fh = shift;
+        print $fh "Sending to indirect filehandle\n";
+    }
+
+Or it can localize a typeglob and use the filehandle directly:
+
+    sub accept_fh {
+        local *FH = shift;
+        print  FH "Sending to localized filehandle\n";
+    }
+
+Both styles work with either objects or typeglobs of real filehandles.
+(They might also work with strings under some circumstances, but this
+is risky.)
+
+    accept_fh(*STDOUT);
+    accept_fh($handle);
+
+In the examples above, we assigned the filehandle to a scalar variable
+before using it.  That is because only simple scalar variables, not
+expressions or subscripts of hashes or arrays, can be used with
+built-ins like C<print>, C<printf>, or the diamond operator.  Using
+something other than a simple scalar variable as a filehandle is
+illegal and won't even compile:
+
+    @fd = (*STDIN, *STDOUT, *STDERR);
+    print $fd[1] "Type it: ";                           # WRONG
+    $got = <$fd[0]>                                     # WRONG
+    print $fd[2] "What was that: $got";                 # WRONG
+
+With C<print> and C<printf>, you get around this by using a block and
+an expression where you would place the filehandle:
+
+    print  { $fd[1] } "funny stuff\n";
+    printf { $fd[1] } "Pity the poor %x.\n", 3_735_928_559;
+    # Pity the poor deadbeef.
+
+That block is a proper block like any other, so you can put more
+complicated code there.  This sends the message out to one of two places:
+
+    $ok = -x "/bin/cat";
+    print { $ok ? $fd[1] : $fd[2] } "cat stat $ok\n";
+    print { $fd[ 1+ ($ok || 0) ]  } "cat stat $ok\n";
+
+This approach of treating C<print> and C<printf> like object methods
+calls doesn't work for the diamond operator.  That's because it's a
+real operator, not just a function with a comma-less argument.  Assuming
+you've been storing typeglobs in your structure as we did above, you
+can use the built-in function named C<readline> to read a record just
+as C<< <> >> does.  Given the initialization shown above for @fd, this
+would work, but only because readline() requires a typeglob.  It doesn't
+work with objects or strings, which might be a bug we haven't fixed yet.
+
+    $got = readline($fd[0]);
+
+Let it be noted that the flakiness of indirect filehandles is not
+related to whether they're strings, typeglobs, objects, or anything else.
+It's the syntax of the fundamental operators.  Playing the object
+game doesn't help you at all here.
+
+=head2 How can I set up a footer format to be used with write()?
+X<footer>
+
+There's no builtin way to do this, but L<perlform> has a couple of
+techniques to make it possible for the intrepid hacker.
+
+=head2 How can I write() into a string?
+X<write, into a string>
+
+See L<perlform/"Accessing Formatting Internals"> for an swrite() function.
+
+=head2 How can I output my numbers with commas added?
+X<number, commify>
+
+(contributed by brian d foy and Benjamin Goldberg)
+
+You can use L<Number::Format> to separate places in a number.
+It handles locale information for those of you who want to insert
+full stops instead (or anything else that they want to use,
+really).
+
+This subroutine will add commas to your number:
+
+	sub commify {
+	   local $_  = shift;
+	   1 while s/^([-+]?\d+)(\d{3})/$1,$2/;
+	   return $_;
+	   }
+
+This regex from Benjamin Goldberg will add commas to numbers:
+
+   s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g;
+
+It is easier to see with comments:
+
+   s/(
+       ^[-+]?            # beginning of number.
+       \d+?              # first digits before first comma
+       (?=               # followed by, (but not included in the match) :
+          (?>(?:\d{3})+) # some positive multiple of three digits.
+          (?!\d)         # an *exact* multiple, not x * 3 + 1 or whatever.
+       )
+      |                  # or:
+       \G\d{3}           # after the last group, get three digits
+       (?=\d)            # but they have to have more digits after them.
+   )/$1,/xg;
+
+=head2 How can I translate tildes (~) in a filename?
+X<tilde> X<tilde expansion>
+
+Use the <> (glob()) operator, documented in L<perlfunc>.  Older
+versions of Perl require that you have a shell installed that groks
+tildes.  Recent perl versions have this feature built in. The
+File::KGlob module (available from CPAN) gives more portable glob
+functionality.
+
+Within Perl, you may use this directly:
+
+	$filename =~ s{
+	  ^ ~             # find a leading tilde
+	  (               # save this in $1
+	      [^/]        # a non-slash character
+	            *     # repeated 0 or more times (0 means me)
+	  )
+	}{
+	  $1
+	      ? (getpwnam($1))[7]
+	      : ( $ENV{HOME} || $ENV{LOGDIR} )
+	}ex;
+
+=head2 How come when I open a file read-write it wipes it out?
+X<clobber> X<read-write> X<clobbering> X<truncate> X<truncating>
+
+Because you're using something like this, which truncates the file and
+I<then> gives you read-write access:
+
+    open(FH, "+> /path/name");		# WRONG (almost always)
+
+Whoops.  You should instead use this, which will fail if the file
+doesn't exist.
+
+    open(FH, "+< /path/name");  	# open for update
+
+Using ">" always clobbers or creates.  Using "<" never does
+either.  The "+" doesn't change this.
+
+Here are examples of many kinds of file opens.  Those using sysopen()
+all assume
+
+    use Fcntl;
+
+To open file for reading:
+
+    open(FH, "< $path")                                 || die $!;
+    sysopen(FH, $path, O_RDONLY)                        || die $!;
+
+To open file for writing, create new file if needed or else truncate old file:
+
+    open(FH, "> $path") || die $!;
+    sysopen(FH, $path, O_WRONLY|O_TRUNC|O_CREAT)        || die $!;
+    sysopen(FH, $path, O_WRONLY|O_TRUNC|O_CREAT, 0666)  || die $!;
+
+To open file for writing, create new file, file must not exist:
+
+    sysopen(FH, $path, O_WRONLY|O_EXCL|O_CREAT)         || die $!;
+    sysopen(FH, $path, O_WRONLY|O_EXCL|O_CREAT, 0666)   || die $!;
+
+To open file for appending, create if necessary:
+
+    open(FH, ">> $path") || die $!;
+    sysopen(FH, $path, O_WRONLY|O_APPEND|O_CREAT)       || die $!;
+    sysopen(FH, $path, O_WRONLY|O_APPEND|O_CREAT, 0666) || die $!;
+
+To open file for appending, file must exist:
+
+    sysopen(FH, $path, O_WRONLY|O_APPEND)               || die $!;
+
+To open file for update, file must exist:
+
+    open(FH, "+< $path")                                || die $!;
+    sysopen(FH, $path, O_RDWR)                          || die $!;
+
+To open file for update, create file if necessary:
+
+    sysopen(FH, $path, O_RDWR|O_CREAT)                  || die $!;
+    sysopen(FH, $path, O_RDWR|O_CREAT, 0666)            || die $!;
+
+To open file for update, file must not exist:
+
+    sysopen(FH, $path, O_RDWR|O_EXCL|O_CREAT)           || die $!;
+    sysopen(FH, $path, O_RDWR|O_EXCL|O_CREAT, 0666)     || die $!;
+
+To open a file without blocking, creating if necessary:
+
+    sysopen(FH, "/foo/somefile", O_WRONLY|O_NDELAY|O_CREAT)
+	    or die "can't open /foo/somefile: $!":
+
+Be warned that neither creation nor deletion of files is guaranteed to
+be an atomic operation over NFS.  That is, two processes might both
+successfully create or unlink the same file!  Therefore O_EXCL
+isn't as exclusive as you might wish.
+
+See also the new L<perlopentut> if you have it (new for 5.6).
+
+=head2 Why do I sometimes get an "Argument list too long" when I use E<lt>*E<gt>?
+X<argument list too long>
+
+The C<< <> >> operator performs a globbing operation (see above).
+In Perl versions earlier than v5.6.0, the internal glob() operator forks
+csh(1) to do the actual glob expansion, but
+csh can't handle more than 127 items and so gives the error message
+C<Argument list too long>.  People who installed tcsh as csh won't
+have this problem, but their users may be surprised by it.
+
+To get around this, either upgrade to Perl v5.6.0 or later, do the glob
+yourself with readdir() and patterns, or use a module like File::KGlob,
+one that doesn't use the shell to do globbing.
+
+=head2 Is there a leak/bug in glob()?
+X<glob>
+
+Due to the current implementation on some operating systems, when you
+use the glob() function or its angle-bracket alias in a scalar
+context, you may cause a memory leak and/or unpredictable behavior.  It's
+best therefore to use glob() only in list context.
+
+=head2 How can I open a file with a leading ">" or trailing blanks?
+X<filename, special characters>
+
+(contributed by Brian McCauley)
+
+The special two argument form of Perl's open() function ignores
+trailing blanks in filenames and infers the mode from certain leading
+characters (or a trailing "|"). In older versions of Perl this was the
+only version of open() and so it is prevalent in old code and books.
+
+Unless you have a particular reason to use the two argument form you
+should use the three argument form of open() which does not treat any
+charcters in the filename as special.
+
+	open FILE, "<", "  file  ";  # filename is "   file   "
+	open FILE, ">", ">file";     # filename is ">file"
+
+=head2 How can I reliably rename a file?
+X<rename> X<mv> X<move> X<file, rename> X<ren>
+
+If your operating system supports a proper mv(1) utility or its
+functional equivalent, this works:
+
+    rename($old, $new) or system("mv", $old, $new);
+
+It may be more portable to use the File::Copy module instead.
+You just copy to the new file to the new name (checking return
+values), then delete the old one.  This isn't really the same
+semantically as a rename(), which preserves meta-information like
+permissions, timestamps, inode info, etc.
+
+Newer versions of File::Copy export a move() function.
+
+=head2 How can I lock a file?
+X<lock> X<file, lock> X<flock>
+
+Perl's builtin flock() function (see L<perlfunc> for details) will call
+flock(2) if that exists, fcntl(2) if it doesn't (on perl version 5.004 and
+later), and lockf(3) if neither of the two previous system calls exists.
+On some systems, it may even use a different form of native locking.
+Here are some gotchas with Perl's flock():
+
+=over 4
+
+=item 1
+
+Produces a fatal error if none of the three system calls (or their
+close equivalent) exists.
+
+=item 2
+
+lockf(3) does not provide shared locking, and requires that the
+filehandle be open for writing (or appending, or read/writing).
+
+=item 3
+
+Some versions of flock() can't lock files over a network (e.g. on NFS file
+systems), so you'd need to force the use of fcntl(2) when you build Perl.
+But even this is dubious at best.  See the flock entry of L<perlfunc>
+and the F<INSTALL> file in the source distribution for information on
+building Perl to do this.
+
+Two potentially non-obvious but traditional flock semantics are that
+it waits indefinitely until the lock is granted, and that its locks are
+I<merely advisory>.  Such discretionary locks are more flexible, but
+offer fewer guarantees.  This means that files locked with flock() may
+be modified by programs that do not also use flock().  Cars that stop
+for red lights get on well with each other, but not with cars that don't
+stop for red lights.  See the perlport manpage, your port's specific
+documentation, or your system-specific local manpages for details.  It's
+best to assume traditional behavior if you're writing portable programs.
+(If you're not, you should as always feel perfectly free to write
+for your own system's idiosyncrasies (sometimes called "features").
+Slavish adherence to portability concerns shouldn't get in the way of
+your getting your job done.)
+
+For more information on file locking, see also
+L<perlopentut/"File Locking"> if you have it (new for 5.6).
+
+=back
+
+=head2 Why can't I just open(FH, "E<gt>file.lock")?
+X<lock, lockfile race condition>
+
+A common bit of code B<NOT TO USE> is this:
+
+    sleep(3) while -e "file.lock";	# PLEASE DO NOT USE
+    open(LCK, "> file.lock");		# THIS BROKEN CODE
+
+This is a classic race condition: you take two steps to do something
+which must be done in one.  That's why computer hardware provides an
+atomic test-and-set instruction.   In theory, this "ought" to work:
+
+    sysopen(FH, "file.lock", O_WRONLY|O_EXCL|O_CREAT)
+		or die "can't open  file.lock: $!";
+
+except that lamentably, file creation (and deletion) is not atomic
+over NFS, so this won't work (at least, not every time) over the net.
+Various schemes involving link() have been suggested, but
+these tend to involve busy-wait, which is also subdesirable.
+
+=head2 I still don't get locking.  I just want to increment the number in the file.  How can I do this?
+X<counter> X<file, counter>
+
+Didn't anyone ever tell you web-page hit counters were useless?
+They don't count number of hits, they're a waste of time, and they serve
+only to stroke the writer's vanity.  It's better to pick a random number;
+they're more realistic.
+
+Anyway, this is what you can do if you can't help yourself.
+
+    use Fcntl qw(:DEFAULT :flock);
+    sysopen(FH, "numfile", O_RDWR|O_CREAT) 	 or die "can't open numfile: $!";
+    flock(FH, LOCK_EX) 				 or die "can't flock numfile: $!";
+    $num = <FH> || 0;
+    seek(FH, 0, 0) 				 or die "can't rewind numfile: $!";
+    truncate(FH, 0) 				 or die "can't truncate numfile: $!";
+    (print FH $num+1, "\n")			 or die "can't write numfile: $!";
+    close FH 					 or die "can't close numfile: $!";
+
+Here's a much better web-page hit counter:
+
+    $hits = int( (time() - 850_000_000) / rand(1_000) );
+
+If the count doesn't impress your friends, then the code might.  :-)
+
+=head2 All I want to do is append a small amount of text to the end of a file.  Do I still have to use locking?
+X<append> X<file, append>
+
+If you are on a system that correctly implements flock() and you use the
+example appending code from "perldoc -f flock" everything will be OK
+even if the OS you are on doesn't implement append mode correctly (if
+such a system exists.) So if you are happy to restrict yourself to OSs
+that implement flock() (and that's not really much of a restriction)
+then that is what you should do.
+
+If you know you are only going to use a system that does correctly
+implement appending (i.e. not Win32) then you can omit the seek() from
+the above code.
+
+If you know you are only writing code to run on an OS and filesystem that
+does implement append mode correctly (a local filesystem on a modern
+Unix for example), and you keep the file in block-buffered mode and you
+write less than one buffer-full of output between each manual flushing
+of the buffer then each bufferload is almost guaranteed to be written to
+the end of the file in one chunk without getting intermingled with
+anyone else's output. You can also use the syswrite() function which is
+simply a wrapper around your systems write(2) system call.
+
+There is still a small theoretical chance that a signal will interrupt
+the system level write() operation before completion.  There is also a
+possibility that some STDIO implementations may call multiple system
+level write()s even if the buffer was empty to start.  There may be some
+systems where this probability is reduced to zero.
+
+=head2 How do I randomly update a binary file?
+X<file, binary patch>
+
+If you're just trying to patch a binary, in many cases something as
+simple as this works:
+
+    perl -i -pe 's{window manager}{window mangler}g' /usr/bin/emacs
+
+However, if you have fixed sized records, then you might do something more
+like this:
+
+    $RECSIZE = 220; # size of record, in bytes
+    $recno   = 37;  # which record to update
+    open(FH, "+<somewhere") || die "can't update somewhere: $!";
+    seek(FH, $recno * $RECSIZE, 0);
+    read(FH, $record, $RECSIZE) == $RECSIZE || die "can't read record $recno: $!";
+    # munge the record
+    seek(FH, -$RECSIZE, 1);
+    print FH $record;
+    close FH;
+
+Locking and error checking are left as an exercise for the reader.
+Don't forget them or you'll be quite sorry.
+
+=head2 How do I get a file's timestamp in perl?
+X<timestamp> X<file, timestamp>
+
+If you want to retrieve the time at which the file was last
+read, written, or had its meta-data (owner, etc) changed,
+you use the B<-A>, B<-M>, or B<-C> file test operations as
+documented in L<perlfunc>.  These retrieve the age of the
+file (measured against the start-time of your program) in
+days as a floating point number. Some platforms may not have
+all of these times.  See L<perlport> for details. To
+retrieve the "raw" time in seconds since the epoch, you
+would call the stat function, then use localtime(),
+gmtime(), or POSIX::strftime() to convert this into
+human-readable form.
+
+Here's an example:
+
+    $write_secs = (stat($file))[9];
+    printf "file %s updated at %s\n", $file,
+	scalar localtime($write_secs);
+
+If you prefer something more legible, use the File::stat module
+(part of the standard distribution in version 5.004 and later):
+
+    # error checking left as an exercise for reader.
+    use File::stat;
+    use Time::localtime;
+    $date_string = ctime(stat($file)->mtime);
+    print "file $file updated at $date_string\n";
+
+The POSIX::strftime() approach has the benefit of being,
+in theory, independent of the current locale.  See L<perllocale>
+for details.
+
+=head2 How do I set a file's timestamp in perl?
+X<timestamp> X<file, timestamp>
+
+You use the utime() function documented in L<perlfunc/utime>.
+By way of example, here's a little program that copies the
+read and write times from its first argument to all the rest
+of them.
+
+    if (@ARGV < 2) {
+	die "usage: cptimes timestamp_file other_files ...\n";
+    }
+    $timestamp = shift;
+    ($atime, $mtime) = (stat($timestamp))[8,9];
+    utime $atime, $mtime, @ARGV;
+
+Error checking is, as usual, left as an exercise for the reader.
+
+The perldoc for utime also has an example that has the same
+effect as touch(1) on files that I<already exist>.
+
+Certain file systems have a limited ability to store the times
+on a file at the expected level of precision.  For example, the
+FAT and HPFS filesystem are unable to create dates on files with
+a finer granularity than two seconds.  This is a limitation of
+the filesystems, not of utime().
+
+=head2 How do I print to more than one file at once?
+X<print, to multiple files>
+
+To connect one filehandle to several output filehandles,
+you can use the IO::Tee or Tie::FileHandle::Multiplex modules.
+
+If you only have to do this once, you can print individually
+to each filehandle.
+
+    for $fh (FH1, FH2, FH3) { print $fh "whatever\n" }
+
+=head2 How can I read in an entire file all at once?
+X<slurp> X<file, slurping>
+
+You can use the File::Slurp module to do it in one step.
+
+	use File::Slurp;
+
+	$all_of_it = read_file($filename); # entire file in scalar
+    @all_lines = read_file($filename); # one line perl element
+
+The customary Perl approach for processing all the lines in a file is to
+do so one line at a time:
+
+    open (INPUT, $file) 	|| die "can't open $file: $!";
+    while (<INPUT>) {
+	chomp;
+	# do something with $_
+    }
+    close(INPUT)	    	|| die "can't close $file: $!";
+
+This is tremendously more efficient than reading the entire file into
+memory as an array of lines and then processing it one element at a time,
+which is often--if not almost always--the wrong approach.  Whenever
+you see someone do this:
+
+    @lines = <INPUT>;
+
+you should think long and hard about why you need everything loaded at
+once.  It's just not a scalable solution.  You might also find it more
+fun to use the standard Tie::File module, or the DB_File module's
+$DB_RECNO bindings, which allow you to tie an array to a file so that
+accessing an element the array actually accesses the corresponding
+line in the file.
+
+You can read the entire filehandle contents into a scalar.
+
+    {
+	local(*INPUT, $/);
+	open (INPUT, $file) 	|| die "can't open $file: $!";
+	$var = <INPUT>;
+    }
+
+That temporarily undefs your record separator, and will automatically
+close the file at block exit.  If the file is already open, just use this:
+
+    $var = do { local $/; <INPUT> };
+
+For ordinary files you can also use the read function.
+
+	read( INPUT, $var, -s INPUT );
+
+The third argument tests the byte size of the data on the INPUT filehandle
+and reads that many bytes into the buffer $var.
+
+=head2 How can I read in a file by paragraphs?
+X<file, reading by paragraphs>
+
+Use the C<$/> variable (see L<perlvar> for details).  You can either
+set it to C<""> to eliminate empty paragraphs (C<"abc\n\n\n\ndef">,
+for instance, gets treated as two paragraphs and not three), or
+C<"\n\n"> to accept empty paragraphs.
+
+Note that a blank line must have no blanks in it.  Thus
+S<C<"fred\n \nstuff\n\n">> is one paragraph, but C<"fred\n\nstuff\n\n"> is two.
+
+=head2 How can I read a single character from a file?  From the keyboard?
+X<getc> X<file, reading one character at a time>
+
+You can use the builtin C<getc()> function for most filehandles, but
+it won't (easily) work on a terminal device.  For STDIN, either use
+the Term::ReadKey module from CPAN or use the sample code in
+L<perlfunc/getc>.
+
+If your system supports the portable operating system programming
+interface (POSIX), you can use the following code, which you'll note
+turns off echo processing as well.
+
+    #!/usr/bin/perl -w
+    use strict;
+    $| = 1;
+    for (1..4) {
+	my $got;
+	print "gimme: ";
+	$got = getone();
+	print "--> $got\n";
+    }
+    exit;
+
+    BEGIN {
+	use POSIX qw(:termios_h);
+
+	my ($term, $oterm, $echo, $noecho, $fd_stdin);
+
+	$fd_stdin = fileno(STDIN);
+
+	$term     = POSIX::Termios->new();
+	$term->getattr($fd_stdin);
+	$oterm     = $term->getlflag();
+
+	$echo     = ECHO | ECHOK | ICANON;
+	$noecho   = $oterm & ~$echo;
+
+	sub cbreak {
+	    $term->setlflag($noecho);
+	    $term->setcc(VTIME, 1);
+	    $term->setattr($fd_stdin, TCSANOW);
+	}
+
+	sub cooked {
+	    $term->setlflag($oterm);
+	    $term->setcc(VTIME, 0);
+	    $term->setattr($fd_stdin, TCSANOW);
+	}
+
+	sub getone {
+	    my $key = '';
+	    cbreak();
+	    sysread(STDIN, $key, 1);
+	    cooked();
+	    return $key;
+	}
+
+    }
+
+    END { cooked() }
+
+The Term::ReadKey module from CPAN may be easier to use.  Recent versions
+include also support for non-portable systems as well.
+
+    use Term::ReadKey;
+    open(TTY, "</dev/tty");
+    print "Gimme a char: ";
+    ReadMode "raw";
+    $key = ReadKey 0, *TTY;
+    ReadMode "normal";
+    printf "\nYou said %s, char number %03d\n",
+        $key, ord $key;
+
+=head2 How can I tell whether there's a character waiting on a filehandle?
+
+The very first thing you should do is look into getting the Term::ReadKey
+extension from CPAN.  As we mentioned earlier, it now even has limited
+support for non-portable (read: not open systems, closed, proprietary,
+not POSIX, not Unix, etc) systems.
+
+You should also check out the Frequently Asked Questions list in
+comp.unix.* for things like this: the answer is essentially the same.
+It's very system dependent.  Here's one solution that works on BSD
+systems:
+
+    sub key_ready {
+	my($rin, $nfd);
+	vec($rin, fileno(STDIN), 1) = 1;
+	return $nfd = select($rin,undef,undef,0);
+    }
+
+If you want to find out how many characters are waiting, there's
+also the FIONREAD ioctl call to be looked at.  The I<h2ph> tool that
+comes with Perl tries to convert C include files to Perl code, which
+can be C<require>d.  FIONREAD ends up defined as a function in the
+I<sys/ioctl.ph> file:
+
+    require 'sys/ioctl.ph';
+
+    $size = pack("L", 0);
+    ioctl(FH, FIONREAD(), $size)    or die "Couldn't call ioctl: $!\n";
+    $size = unpack("L", $size);
+
+If I<h2ph> wasn't installed or doesn't work for you, you can
+I<grep> the include files by hand:
+
+    % grep FIONREAD /usr/include/*/*
+    /usr/include/asm/ioctls.h:#define FIONREAD      0x541B
+
+Or write a small C program using the editor of champions:
+
+    % cat > fionread.c
+    #include <sys/ioctl.h>
+    main() {
+        printf("%#08x\n", FIONREAD);
+    }
+    ^D
+    % cc -o fionread fionread.c
+    % ./fionread
+    0x4004667f
+
+And then hard code it, leaving porting as an exercise to your successor.
+
+    $FIONREAD = 0x4004667f;         # XXX: opsys dependent
+
+    $size = pack("L", 0);
+    ioctl(FH, $FIONREAD, $size)     or die "Couldn't call ioctl: $!\n";
+    $size = unpack("L", $size);
+
+FIONREAD requires a filehandle connected to a stream, meaning that sockets,
+pipes, and tty devices work, but I<not> files.
+
+=head2 How do I do a C<tail -f> in perl?
+X<tail>
+
+First try
+
+    seek(GWFILE, 0, 1);
+
+The statement C<seek(GWFILE, 0, 1)> doesn't change the current position,
+but it does clear the end-of-file condition on the handle, so that the
+next <GWFILE> makes Perl try again to read something.
+
+If that doesn't work (it relies on features of your stdio implementation),
+then you need something more like this:
+
+	for (;;) {
+	  for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) {
+	    # search for some stuff and put it into files
+	  }
+	  # sleep for a while
+	  seek(GWFILE, $curpos, 0);  # seek to where we had been
+	}
+
+If this still doesn't work, look into the POSIX module.  POSIX defines
+the clearerr() method, which can remove the end of file condition on a
+filehandle.  The method: read until end of file, clearerr(), read some
+more.  Lather, rinse, repeat.
+
+There's also a File::Tail module from CPAN.
+
+=head2 How do I dup() a filehandle in Perl?
+X<dup>
+
+If you check L<perlfunc/open>, you'll see that several of the ways
+to call open() should do the trick.  For example:
+
+    open(LOG, ">>/foo/logfile");
+    open(STDERR, ">&LOG");
+
+Or even with a literal numeric descriptor:
+
+   $fd = $ENV{MHCONTEXTFD};
+   open(MHCONTEXT, "<&=$fd");	# like fdopen(3S)
+
+Note that "<&STDIN" makes a copy, but "<&=STDIN" make
+an alias.  That means if you close an aliased handle, all
+aliases become inaccessible.  This is not true with
+a copied one.
+
+Error checking, as always, has been left as an exercise for the reader.
+
+=head2 How do I close a file descriptor by number?
+X<file, closing file descriptors>
+
+This should rarely be necessary, as the Perl close() function is to be
+used for things that Perl opened itself, even if it was a dup of a
+numeric descriptor as with MHCONTEXT above.  But if you really have
+to, you may be able to do this:
+
+    require 'sys/syscall.ph';
+    $rc = syscall(&SYS_close, $fd + 0);  # must force numeric
+    die "can't sysclose $fd: $!" unless $rc == -1;
+
+Or, just use the fdopen(3S) feature of open():
+
+    {
+	local *F;
+	open F, "<&=$fd" or die "Cannot reopen fd=$fd: $!";
+	close F;
+    }
+
+=head2 Why can't I use "C:\temp\foo" in DOS paths?  Why doesn't `C:\temp\foo.exe` work?
+X<filename, DOS issues>
+
+Whoops!  You just put a tab and a formfeed into that filename!
+Remember that within double quoted strings ("like\this"), the
+backslash is an escape character.  The full list of these is in
+L<perlop/Quote and Quote-like Operators>.  Unsurprisingly, you don't
+have a file called "c:(tab)emp(formfeed)oo" or
+"c:(tab)emp(formfeed)oo.exe" on your legacy DOS filesystem.
+
+Either single-quote your strings, or (preferably) use forward slashes.
+Since all DOS and Windows versions since something like MS-DOS 2.0 or so
+have treated C</> and C<\> the same in a path, you might as well use the
+one that doesn't clash with Perl--or the POSIX shell, ANSI C and C++,
+awk, Tcl, Java, or Python, just to mention a few.  POSIX paths
+are more portable, too.
+
+=head2 Why doesn't glob("*.*") get all the files?
+X<glob>
+
+Because even on non-Unix ports, Perl's glob function follows standard
+Unix globbing semantics.  You'll need C<glob("*")> to get all (non-hidden)
+files.  This makes glob() portable even to legacy systems.  Your
+port may include proprietary globbing functions as well.  Check its
+documentation for details.
+
+=head2 Why does Perl let me delete read-only files?  Why does C<-i> clobber protected files?  Isn't this a bug in Perl?
+
+This is elaborately and painstakingly described in the
+F<file-dir-perms> article in the "Far More Than You Ever Wanted To
+Know" collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz .
+
+The executive summary: learn how your filesystem works.  The
+permissions on a file say what can happen to the data in that file.
+The permissions on a directory say what can happen to the list of
+files in that directory.  If you delete a file, you're removing its
+name from the directory (so the operation depends on the permissions
+of the directory, not of the file).  If you try to write to the file,
+the permissions of the file govern whether you're allowed to.
+
+=head2 How do I select a random line from a file?
+X<file, selecting a random line>
+
+Here's an algorithm from the Camel Book:
+
+    srand;
+    rand($.) < 1 && ($line = $_) while <>;
+
+This has a significant advantage in space over reading the whole file
+in.  You can find a proof of this method in I<The Art of Computer
+Programming>, Volume 2, Section 3.4.2, by Donald E. Knuth.
+
+You can use the File::Random module which provides a function
+for that algorithm:
+
+	use File::Random qw/random_line/;
+	my $line = random_line($filename);
+
+Another way is to use the Tie::File module, which treats the entire
+file as an array.  Simply access a random array element.
+
+=head2 Why do I get weird spaces when I print an array of lines?
+
+Saying
+
+    print "@lines\n";
+
+joins together the elements of C<@lines> with a space between them.
+If C<@lines> were C<("little", "fluffy", "clouds")> then the above
+statement would print
+
+    little fluffy clouds
+
+but if each element of C<@lines> was a line of text, ending a newline
+character C<("little\n", "fluffy\n", "clouds\n")> then it would print:
+
+    little
+     fluffy
+     clouds
+
+If your array contains lines, just print them:
+
+    print @lines;
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2006 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples here are in the public
+domain.  You are permitted and encouraged to use this code and any
+derivatives thereof in your own programs for fun or for profit as you
+see fit.  A simple comment in the code giving credit to the FAQ would
+be courteous but is not required.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq6.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq6.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq6.pod	(revision 14489)
@@ -0,0 +1,902 @@
+=head1 NAME
+
+perlfaq6 - Regular Expressions ($Revision: 1.38 $, $Date: 2005/12/31 00:54:37 $)
+
+=head1 DESCRIPTION
+
+This section is surprisingly small because the rest of the FAQ is
+littered with answers involving regular expressions.  For example,
+decoding a URL and checking whether something is a number are handled
+with regular expressions, but those answers are found elsewhere in
+this document (in L<perlfaq9>: "How do I decode or create those %-encodings
+on the web" and L<perlfaq4>: "How do I determine whether a scalar is
+a number/whole/integer/float", to be precise).
+
+=head2 How can I hope to use regular expressions without creating illegible and unmaintainable code?
+X<regex, legibility> X<regexp, legibility>
+X<regular expression, legibility> X</x>
+
+Three techniques can make regular expressions maintainable and
+understandable.
+
+=over 4
+
+=item Comments Outside the Regex
+
+Describe what you're doing and how you're doing it, using normal Perl
+comments.
+
+    # turn the line into the first word, a colon, and the
+    # number of characters on the rest of the line
+    s/^(\w+)(.*)/ lc($1) . ":" . length($2) /meg;
+
+=item Comments Inside the Regex
+
+The C</x> modifier causes whitespace to be ignored in a regex pattern
+(except in a character class), and also allows you to use normal
+comments there, too.  As you can imagine, whitespace and comments help
+a lot.
+
+C</x> lets you turn this:
+
+    s{<(?:[^>'"]*|".*?"|'.*?')+>}{}gs;
+
+into this:
+
+    s{ <                    # opening angle bracket
+        (?:                 # Non-backreffing grouping paren
+             [^>'"] *       # 0 or more things that are neither > nor ' nor "
+                |           #    or else
+             ".*?"          # a section between double quotes (stingy match)
+                |           #    or else
+             '.*?'          # a section between single quotes (stingy match)
+        ) +                 #   all occurring one or more times
+       >                    # closing angle bracket
+    }{}gsx;                 # replace with nothing, i.e. delete
+
+It's still not quite so clear as prose, but it is very useful for
+describing the meaning of each part of the pattern.
+
+=item Different Delimiters
+
+While we normally think of patterns as being delimited with C</>
+characters, they can be delimited by almost any character.  L<perlre>
+describes this.  For example, the C<s///> above uses braces as
+delimiters.  Selecting another delimiter can avoid quoting the
+delimiter within the pattern:
+
+    s/\/usr\/local/\/usr\/share/g;	# bad delimiter choice
+    s#/usr/local#/usr/share#g;		# better
+
+=back
+
+=head2 I'm having trouble matching over more than one line.  What's wrong?
+X<regex, multiline> X<regexp, multiline> X<regular expression, multiline>
+
+Either you don't have more than one line in the string you're looking
+at (probably), or else you aren't using the correct modifier(s) on
+your pattern (possibly).
+
+There are many ways to get multiline data into a string.  If you want
+it to happen automatically while reading input, you'll want to set $/
+(probably to '' for paragraphs or C<undef> for the whole file) to
+allow you to read more than one line at a time.
+
+Read L<perlre> to help you decide which of C</s> and C</m> (or both)
+you might want to use: C</s> allows dot to include newline, and C</m>
+allows caret and dollar to match next to a newline, not just at the
+end of the string.  You do need to make sure that you've actually
+got a multiline string in there.
+
+For example, this program detects duplicate words, even when they span
+line breaks (but not paragraph ones).  For this example, we don't need
+C</s> because we aren't using dot in a regular expression that we want
+to cross line boundaries.  Neither do we need C</m> because we aren't
+wanting caret or dollar to match at any point inside the record next
+to newlines.  But it's imperative that $/ be set to something other
+than the default, or else we won't actually ever have a multiline
+record read in.
+
+    $/ = '';  		# read in more whole paragraph, not just one line
+    while ( <> ) {
+	while ( /\b([\w'-]+)(\s+\1)+\b/gi ) {  	# word starts alpha
+	    print "Duplicate $1 at paragraph $.\n";
+	}
+    }
+
+Here's code that finds sentences that begin with "From " (which would
+be mangled by many mailers):
+
+    $/ = '';  		# read in more whole paragraph, not just one line
+    while ( <> ) {
+	while ( /^From /gm ) { # /m makes ^ match next to \n
+	    print "leading from in paragraph $.\n";
+	}
+    }
+
+Here's code that finds everything between START and END in a paragraph:
+
+    undef $/;  		# read in whole file, not just one line or paragraph
+    while ( <> ) {
+	while ( /START(.*?)END/sgm ) { # /s makes . cross line boundaries
+	    print "$1\n";
+	}
+    }
+
+=head2 How can I pull out lines between two patterns that are themselves on different lines?
+X<..>
+
+You can use Perl's somewhat exotic C<..> operator (documented in
+L<perlop>):
+
+    perl -ne 'print if /START/ .. /END/' file1 file2 ...
+
+If you wanted text and not lines, you would use
+
+    perl -0777 -ne 'print "$1\n" while /START(.*?)END/gs' file1 file2 ...
+
+But if you want nested occurrences of C<START> through C<END>, you'll
+run up against the problem described in the question in this section
+on matching balanced text.
+
+Here's another example of using C<..>:
+
+    while (<>) {
+        $in_header =   1  .. /^$/;
+        $in_body   = /^$/ .. eof();
+	# now choose between them
+    } continue {
+	reset if eof();		# fix $.
+    }
+
+=head2 I put a regular expression into $/ but it didn't work. What's wrong?
+X<$/, regexes in> X<$INPUT_RECORD_SEPARATOR, regexes in>
+X<$RS, regexes in>
+
+Up to Perl 5.8.0, $/ has to be a string.  This may change in 5.10,
+but don't get your hopes up. Until then, you can use these examples
+if you really need to do this.
+
+If you have File::Stream, this is easy.
+
+			 use File::Stream;
+             my $stream = File::Stream->new(
+                  $filehandle,
+                  separator => qr/\s*,\s*/,
+                  );
+
+			 print "$_\n" while <$stream>;
+
+If you don't have File::Stream, you have to do a little more work.
+
+You can use the four argument form of sysread to continually add to
+a buffer.  After you add to the buffer, you check if you have a
+complete line (using your regular expression).
+
+       local $_ = "";
+       while( sysread FH, $_, 8192, length ) {
+          while( s/^((?s).*?)your_pattern/ ) {
+             my $record = $1;
+             # do stuff here.
+          }
+       }
+
+ You can do the same thing with foreach and a match using the
+ c flag and the \G anchor, if you do not mind your entire file
+ being in memory at the end.
+
+       local $_ = "";
+       while( sysread FH, $_, 8192, length ) {
+          foreach my $record ( m/\G((?s).*?)your_pattern/gc ) {
+             # do stuff here.
+          }
+          substr( $_, 0, pos ) = "" if pos;
+       }
+
+
+=head2 How do I substitute case insensitively on the LHS while preserving case on the RHS?
+X<replace, case preserving> X<substitute, case preserving>
+X<substitution, case preserving> X<s, case preserving>
+
+Here's a lovely Perlish solution by Larry Rosler.  It exploits
+properties of bitwise xor on ASCII strings.
+
+    $_= "this is a TEsT case";
+
+    $old = 'test';
+    $new = 'success';
+
+    s{(\Q$old\E)}
+     { uc $new | (uc $1 ^ $1) .
+	(uc(substr $1, -1) ^ substr $1, -1) x
+	    (length($new) - length $1)
+     }egi;
+
+    print;
+
+And here it is as a subroutine, modeled after the above:
+
+    sub preserve_case($$) {
+	my ($old, $new) = @_;
+	my $mask = uc $old ^ $old;
+
+	uc $new | $mask .
+	    substr($mask, -1) x (length($new) - length($old))
+    }
+
+    $a = "this is a TEsT case";
+    $a =~ s/(test)/preserve_case($1, "success")/egi;
+    print "$a\n";
+
+This prints:
+
+    this is a SUcCESS case
+
+As an alternative, to keep the case of the replacement word if it is
+longer than the original, you can use this code, by Jeff Pinyan:
+
+  sub preserve_case {
+    my ($from, $to) = @_;
+    my ($lf, $lt) = map length, @_;
+
+    if ($lt < $lf) { $from = substr $from, 0, $lt }
+    else { $from .= substr $to, $lf }
+
+    return uc $to | ($from ^ uc $from);
+  }
+
+This changes the sentence to "this is a SUcCess case."
+
+Just to show that C programmers can write C in any programming language,
+if you prefer a more C-like solution, the following script makes the
+substitution have the same case, letter by letter, as the original.
+(It also happens to run about 240% slower than the Perlish solution runs.)
+If the substitution has more characters than the string being substituted,
+the case of the last character is used for the rest of the substitution.
+
+    # Original by Nathan Torkington, massaged by Jeffrey Friedl
+    #
+    sub preserve_case($$)
+    {
+        my ($old, $new) = @_;
+        my ($state) = 0; # 0 = no change; 1 = lc; 2 = uc
+        my ($i, $oldlen, $newlen, $c) = (0, length($old), length($new));
+        my ($len) = $oldlen < $newlen ? $oldlen : $newlen;
+
+        for ($i = 0; $i < $len; $i++) {
+            if ($c = substr($old, $i, 1), $c =~ /[\W\d_]/) {
+                $state = 0;
+            } elsif (lc $c eq $c) {
+                substr($new, $i, 1) = lc(substr($new, $i, 1));
+                $state = 1;
+            } else {
+                substr($new, $i, 1) = uc(substr($new, $i, 1));
+                $state = 2;
+            }
+        }
+        # finish up with any remaining new (for when new is longer than old)
+        if ($newlen > $oldlen) {
+            if ($state == 1) {
+                substr($new, $oldlen) = lc(substr($new, $oldlen));
+            } elsif ($state == 2) {
+                substr($new, $oldlen) = uc(substr($new, $oldlen));
+            }
+        }
+        return $new;
+    }
+
+=head2 How can I make C<\w> match national character sets?
+X<\w>
+
+Put C<use locale;> in your script.  The \w character class is taken
+from the current locale.
+
+See L<perllocale> for details.
+
+=head2 How can I match a locale-smart version of C</[a-zA-Z]/>?
+X<alpha>
+
+You can use the POSIX character class syntax C</[[:alpha:]]/>
+documented in L<perlre>.
+
+No matter which locale you are in, the alphabetic characters are
+the characters in \w without the digits and the underscore.
+As a regex, that looks like C</[^\W\d_]/>.  Its complement,
+the non-alphabetics, is then everything in \W along with
+the digits and the underscore, or C</[\W\d_]/>.
+
+=head2 How can I quote a variable to use in a regex?
+X<regex, escaping> X<regexp, escaping> X<regular expression, escaping>
+
+The Perl parser will expand $variable and @variable references in
+regular expressions unless the delimiter is a single quote.  Remember,
+too, that the right-hand side of a C<s///> substitution is considered
+a double-quoted string (see L<perlop> for more details).  Remember
+also that any regex special characters will be acted on unless you
+precede the substitution with \Q.  Here's an example:
+
+    $string = "Placido P. Octopus";
+    $regex  = "P.";
+
+    $string =~ s/$regex/Polyp/;
+    # $string is now "Polypacido P. Octopus"
+
+Because C<.> is special in regular expressions, and can match any
+single character, the regex C<P.> here has matched the <Pl> in the
+original string.
+
+To escape the special meaning of C<.>, we use C<\Q>:
+
+    $string = "Placido P. Octopus";
+    $regex  = "P.";
+
+    $string =~ s/\Q$regex/Polyp/;
+    # $string is now "Placido Polyp Octopus"
+
+The use of C<\Q> causes the <.> in the regex to be treated as a
+regular character, so that C<P.> matches a C<P> followed by a dot.
+
+=head2 What is C</o> really for?
+X</o>
+
+Using a variable in a regular expression match forces a re-evaluation
+(and perhaps recompilation) each time the regular expression is
+encountered.  The C</o> modifier locks in the regex the first time
+it's used.  This always happens in a constant regular expression, and
+in fact, the pattern was compiled into the internal format at the same
+time your entire program was.
+
+Use of C</o> is irrelevant unless variable interpolation is used in
+the pattern, and if so, the regex engine will neither know nor care
+whether the variables change after the pattern is evaluated the I<very
+first> time.
+
+C</o> is often used to gain an extra measure of efficiency by not
+performing subsequent evaluations when you know it won't matter
+(because you know the variables won't change), or more rarely, when
+you don't want the regex to notice if they do.
+
+For example, here's a "paragrep" program:
+
+    $/ = '';  # paragraph mode
+    $pat = shift;
+    while (<>) {
+        print if /$pat/o;
+    }
+
+=head2 How do I use a regular expression to strip C style comments from a file?
+
+While this actually can be done, it's much harder than you'd think.
+For example, this one-liner
+
+    perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
+
+will work in many but not all cases.  You see, it's too simple-minded for
+certain kinds of C programs, in particular, those with what appear to be
+comments in quoted strings.  For that, you'd need something like this,
+created by Jeffrey Friedl and later modified by Fred Curtis.
+
+    $/ = undef;
+    $_ = <>;
+    s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
+    print;
+
+This could, of course, be more legibly written with the C</x> modifier, adding
+whitespace and comments.  Here it is expanded, courtesy of Fred Curtis.
+
+    s{
+       /\*         ##  Start of /* ... */ comment
+       [^*]*\*+    ##  Non-* followed by 1-or-more *'s
+       (
+         [^/*][^*]*\*+
+       )*          ##  0-or-more things which don't start with /
+                   ##    but do end with '*'
+       /           ##  End of /* ... */ comment
+
+     |         ##     OR  various things which aren't comments:
+
+       (
+         "           ##  Start of " ... " string
+         (
+           \\.           ##  Escaped char
+         |               ##    OR
+           [^"\\]        ##  Non "\
+         )*
+         "           ##  End of " ... " string
+
+       |         ##     OR
+
+         '           ##  Start of ' ... ' string
+         (
+           \\.           ##  Escaped char
+         |               ##    OR
+           [^'\\]        ##  Non '\
+         )*
+         '           ##  End of ' ... ' string
+
+       |         ##     OR
+
+         .           ##  Anything other char
+         [^/"'\\]*   ##  Chars which doesn't start a comment, string or escape
+       )
+     }{defined $2 ? $2 : ""}gxse;
+
+A slight modification also removes C++ comments:
+
+    s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
+
+=head2 Can I use Perl regular expressions to match balanced text?
+X<regex, matching balanced test> X<regexp, matching balanced test>
+X<regular expression, matching balanced test>
+
+Historically, Perl regular expressions were not capable of matching
+balanced text.  As of more recent versions of perl including 5.6.1
+experimental features have been added that make it possible to do this.
+Look at the documentation for the (??{ }) construct in recent perlre manual
+pages to see an example of matching balanced parentheses.  Be sure to take
+special notice of the  warnings present in the manual before making use
+of this feature.
+
+CPAN contains many modules that can be useful for matching text
+depending on the context.  Damian Conway provides some useful
+patterns in Regexp::Common.  The module Text::Balanced provides a
+general solution to this problem.
+
+One of the common applications of balanced text matching is working
+with XML and HTML.  There are many modules available that support
+these needs.  Two examples are HTML::Parser and XML::Parser. There
+are many others.
+
+An elaborate subroutine (for 7-bit ASCII only) to pull out balanced
+and possibly nested single chars, like C<`> and C<'>, C<{> and C<}>,
+or C<(> and C<)> can be found in
+http://www.cpan.org/authors/id/TOMC/scripts/pull_quotes.gz .
+
+The C::Scan module from CPAN also contains such subs for internal use,
+but they are undocumented.
+
+=head2 What does it mean that regexes are greedy?  How can I get around it?
+X<greedy> X<greediness>
+
+Most people mean that greedy regexes match as much as they can.
+Technically speaking, it's actually the quantifiers (C<?>, C<*>, C<+>,
+C<{}>) that are greedy rather than the whole pattern; Perl prefers local
+greed and immediate gratification to overall greed.  To get non-greedy
+versions of the same quantifiers, use (C<??>, C<*?>, C<+?>, C<{}?>).
+
+An example:
+
+        $s1 = $s2 = "I am very very cold";
+        $s1 =~ s/ve.*y //;      # I am cold
+        $s2 =~ s/ve.*?y //;     # I am very cold
+
+Notice how the second substitution stopped matching as soon as it
+encountered "y ".  The C<*?> quantifier effectively tells the regular
+expression engine to find a match as quickly as possible and pass
+control on to whatever is next in line, like you would if you were
+playing hot potato.
+
+=head2 How do I process each word on each line?
+X<word>
+
+Use the split function:
+
+    while (<>) {
+	foreach $word ( split ) {
+	    # do something with $word here
+	}
+    }
+
+Note that this isn't really a word in the English sense; it's just
+chunks of consecutive non-whitespace characters.
+
+To work with only alphanumeric sequences (including underscores), you
+might consider
+
+    while (<>) {
+	foreach $word (m/(\w+)/g) {
+	    # do something with $word here
+	}
+    }
+
+=head2 How can I print out a word-frequency or line-frequency summary?
+
+To do this, you have to parse out each word in the input stream.  We'll
+pretend that by word you mean chunk of alphabetics, hyphens, or
+apostrophes, rather than the non-whitespace chunk idea of a word given
+in the previous question:
+
+    while (<>) {
+	while ( /(\b[^\W_\d][\w'-]+\b)/g ) {   # misses "`sheep'"
+	    $seen{$1}++;
+	}
+    }
+    while ( ($word, $count) = each %seen ) {
+	print "$count $word\n";
+    }
+
+If you wanted to do the same thing for lines, you wouldn't need a
+regular expression:
+
+    while (<>) {
+	$seen{$_}++;
+    }
+    while ( ($line, $count) = each %seen ) {
+	print "$count $line";
+    }
+
+If you want these output in a sorted order, see L<perlfaq4>: "How do I
+sort a hash (optionally by value instead of key)?".
+
+=head2 How can I do approximate matching?
+X<match, approximate> X<matching, approximate>
+
+See the module String::Approx available from CPAN.
+
+=head2 How do I efficiently match many regular expressions at once?
+X<regex, efficiency> X<regexp, efficiency>
+X<regular expression, efficiency>
+
+( contributed by brian d foy )
+
+Avoid asking Perl to compile a regular expression every time
+you want to match it.  In this example, perl must recompile
+the regular expression for every iteration of the foreach()
+loop since it has no way to know what $pattern will be.
+
+    @patterns = qw( foo bar baz );
+
+    LINE: while( <> )
+    	{
+		foreach $pattern ( @patterns )
+			{
+	    	print if /\b$pattern\b/i;
+	    	next LINE;
+	   		}
+		}
+
+The qr// operator showed up in perl 5.005.  It compiles a
+regular expression, but doesn't apply it.  When you use the
+pre-compiled version of the regex, perl does less work. In
+this example, I inserted a map() to turn each pattern into
+its pre-compiled form.  The rest of the script is the same,
+but faster.
+
+    @patterns = map { qr/\b$_\b/i } qw( foo bar baz );
+
+    LINE: while( <> )
+    	{
+		foreach $pattern ( @patterns )
+			{
+	    	print if /\b$pattern\b/i;
+	    	next LINE;
+	   		}
+		}
+
+In some cases, you may be able to make several patterns into
+a single regular expression.  Beware of situations that require
+backtracking though.
+
+	$regex = join '|', qw( foo bar baz );
+
+    LINE: while( <> )
+    	{
+		print if /\b(?:$regex)\b/i;
+		}
+
+For more details on regular expression efficiency, see Mastering
+Regular Expressions by Jeffrey Freidl.  He explains how regular
+expressions engine work and why some patterns are surprisingly
+inefficient.  Once you understand how perl applies regular
+expressions, you can tune them for individual situations.
+
+=head2 Why don't word-boundary searches with C<\b> work for me?
+X<\b>
+
+(contributed by brian d foy)
+
+Ensure that you know what \b really does: it's the boundary between a
+word character, \w, and something that isn't a word character. That
+thing that isn't a word character might be \W, but it can also be the
+start or end of the string.
+
+It's not (not!) the boundary between whitespace and non-whitespace,
+and it's not the stuff between words we use to create sentences.
+
+In regex speak, a word boundary (\b) is a "zero width assertion",
+meaning that it doesn't represent a character in the string, but a
+condition at a certain position.
+
+For the regular expression, /\bPerl\b/, there has to be a word
+boundary before the "P" and after the "l".  As long as something other
+than a word character precedes the "P" and succeeds the "l", the
+pattern will match. These strings match /\bPerl\b/.
+
+	"Perl"    # no word char before P or after l
+	"Perl "   # same as previous (space is not a word char)
+	"'Perl'"  # the ' char is not a word char
+	"Perl's"  # no word char before P, non-word char after "l"
+
+These strings do not match /\bPerl\b/.
+
+	"Perl_"   # _ is a word char!
+	"Perler"  # no word char before P, but one after l
+
+You don't have to use \b to match words though.  You can look for
+non-word characters surrounded by word characters.  These strings
+match the pattern /\b'\b/.
+
+	"don't"   # the ' char is surrounded by "n" and "t"
+	"qep'a'"  # the ' char is surrounded by "p" and "a"
+
+These strings do not match /\b'\b/.
+
+	"foo'"    # there is no word char after non-word '
+
+You can also use the complement of \b, \B, to specify that there
+should not be a word boundary.
+
+In the pattern /\Bam\B/, there must be a word character before the "a"
+and after the "m". These patterns match /\Bam\B/:
+
+	"llama"   # "am" surrounded by word chars
+	"Samuel"  # same
+
+These strings do not match /\Bam\B/
+
+	"Sam"      # no word boundary before "a", but one after "m"
+	"I am Sam" # "am" surrounded by non-word chars
+
+
+=head2 Why does using $&, $`, or $' slow my program down?
+X<$MATCH> X<$&> X<$POSTMATCH> X<$'> X<$PREMATCH> X<$`>
+
+(contributed by Anno Siegel)
+
+Once Perl sees that you need one of these variables anywhere in the
+program, it provides them on each and every pattern match. That means
+that on every pattern match the entire string will be copied, part of it
+to $`, part to $&, and part to $'. Thus the penalty is most severe with
+long strings and patterns that match often. Avoid $&, $', and $` if you
+can, but if you can't, once you've used them at all, use them at will
+because you've already paid the price. Remember that some algorithms
+really appreciate them. As of the 5.005 release, the $& variable is no
+longer "expensive" the way the other two are.
+
+Since Perl 5.6.1 the special variables @- and @+ can functionally replace
+$`, $& and $'.  These arrays contain pointers to the beginning and end
+of each match (see perlvar for the full story), so they give you
+essentially the same information, but without the risk of excessive
+string copying.
+
+=head2 What good is C<\G> in a regular expression?
+X<\G>
+
+You use the C<\G> anchor to start the next match on the same
+string where the last match left off.  The regular
+expression engine cannot skip over any characters to find
+the next match with this anchor, so C<\G> is similar to the
+beginning of string anchor, C<^>.  The C<\G> anchor is typically
+used with the C<g> flag.  It uses the value of pos()
+as the position to start the next match.  As the match
+operator makes successive matches, it updates pos() with the
+position of the next character past the last match (or the
+first character of the next match, depending on how you like
+to look at it). Each string has its own pos() value.
+
+Suppose you want to match all of consective pairs of digits
+in a string like "1122a44" and stop matching when you
+encounter non-digits.  You want to match C<11> and C<22> but
+the letter <a> shows up between C<22> and C<44> and you want
+to stop at C<a>. Simply matching pairs of digits skips over
+the C<a> and still matches C<44>.
+
+	$_ = "1122a44";
+	my @pairs = m/(\d\d)/g;   # qw( 11 22 44 )
+
+If you use the \G anchor, you force the match after C<22> to
+start with the C<a>.  The regular expression cannot match
+there since it does not find a digit, so the next match
+fails and the match operator returns the pairs it already
+found.
+
+	$_ = "1122a44";
+	my @pairs = m/\G(\d\d)/g; # qw( 11 22 )
+
+You can also use the C<\G> anchor in scalar context. You
+still need the C<g> flag.
+
+	$_ = "1122a44";
+	while( m/\G(\d\d)/g )
+		{
+		print "Found $1\n";
+		}
+
+After the match fails at the letter C<a>, perl resets pos()
+and the next match on the same string starts at the beginning.
+
+	$_ = "1122a44";
+	while( m/\G(\d\d)/g )
+		{
+		print "Found $1\n";
+		}
+
+	print "Found $1 after while" if m/(\d\d)/g; # finds "11"
+
+You can disable pos() resets on fail with the C<c> flag.
+Subsequent matches start where the last successful match
+ended (the value of pos()) even if a match on the same
+string as failed in the meantime. In this case, the match
+after the while() loop starts at the C<a> (where the last
+match stopped), and since it does not use any anchor it can
+skip over the C<a> to find "44".
+
+	$_ = "1122a44";
+	while( m/\G(\d\d)/gc )
+		{
+		print "Found $1\n";
+		}
+
+	print "Found $1 after while" if m/(\d\d)/g; # finds "44"
+
+Typically you use the C<\G> anchor with the C<c> flag
+when you want to try a different match if one fails,
+such as in a tokenizer. Jeffrey Friedl offers this example
+which works in 5.004 or later.
+
+    while (<>) {
+      chomp;
+      PARSER: {
+           m/ \G( \d+\b    )/gcx   && do { print "number: $1\n";  redo; };
+           m/ \G( \w+      )/gcx   && do { print "word:   $1\n";  redo; };
+           m/ \G( \s+      )/gcx   && do { print "space:  $1\n";  redo; };
+           m/ \G( [^\w\d]+ )/gcx   && do { print "other:  $1\n";  redo; };
+      }
+    }
+
+For each line, the PARSER loop first tries to match a series
+of digits followed by a word boundary.  This match has to
+start at the place the last match left off (or the beginning
+of the string on the first match). Since C<m/ \G( \d+\b
+)/gcx> uses the C<c> flag, if the string does not match that
+regular expression, perl does not reset pos() and the next
+match starts at the same position to try a different
+pattern.
+
+=head2 Are Perl regexes DFAs or NFAs?  Are they POSIX compliant?
+X<DFA> X<NFA> X<POSIX>
+
+While it's true that Perl's regular expressions resemble the DFAs
+(deterministic finite automata) of the egrep(1) program, they are in
+fact implemented as NFAs (non-deterministic finite automata) to allow
+backtracking and backreferencing.  And they aren't POSIX-style either,
+because those guarantee worst-case behavior for all cases.  (It seems
+that some people prefer guarantees of consistency, even when what's
+guaranteed is slowness.)  See the book "Mastering Regular Expressions"
+(from O'Reilly) by Jeffrey Friedl for all the details you could ever
+hope to know on these matters (a full citation appears in
+L<perlfaq2>).
+
+=head2 What's wrong with using grep in a void context?
+X<grep>
+
+The problem is that grep builds a return list, regardless of the context.
+This means you're making Perl go to the trouble of building a list that
+you then just throw away. If the list is large, you waste both time and space.
+If your intent is to iterate over the list, then use a for loop for this
+purpose.
+
+In perls older than 5.8.1, map suffers from this problem as well.
+But since 5.8.1, this has been fixed, and map is context aware - in void
+context, no lists are constructed.
+
+=head2 How can I match strings with multibyte characters?
+X<regex, and multibyte characters> X<regexp, and multibyte characters>
+X<regular expression, and multibyte characters>
+
+Starting from Perl 5.6 Perl has had some level of multibyte character
+support.  Perl 5.8 or later is recommended.  Supported multibyte
+character repertoires include Unicode, and legacy encodings
+through the Encode module.  See L<perluniintro>, L<perlunicode>,
+and L<Encode>.
+
+If you are stuck with older Perls, you can do Unicode with the
+C<Unicode::String> module, and character conversions using the
+C<Unicode::Map8> and C<Unicode::Map> modules.  If you are using
+Japanese encodings, you might try using the jperl 5.005_03.
+
+Finally, the following set of approaches was offered by Jeffrey
+Friedl, whose article in issue #5 of The Perl Journal talks about
+this very matter.
+
+Let's suppose you have some weird Martian encoding where pairs of
+ASCII uppercase letters encode single Martian letters (i.e. the two
+bytes "CV" make a single Martian letter, as do the two bytes "SG",
+"VS", "XX", etc.). Other bytes represent single characters, just like
+ASCII.
+
+So, the string of Martian "I am CVSGXX!" uses 12 bytes to encode the
+nine characters 'I', ' ', 'a', 'm', ' ', 'CV', 'SG', 'XX', '!'.
+
+Now, say you want to search for the single character C</GX/>. Perl
+doesn't know about Martian, so it'll find the two bytes "GX" in the "I
+am CVSGXX!"  string, even though that character isn't there: it just
+looks like it is because "SG" is next to "XX", but there's no real
+"GX".  This is a big problem.
+
+Here are a few ways, all painful, to deal with it:
+
+   $martian =~ s/([A-Z][A-Z])/ $1 /g; # Make sure adjacent "martian"
+                                      # bytes are no longer adjacent.
+   print "found GX!\n" if $martian =~ /GX/;
+
+Or like this:
+
+   @chars = $martian =~ m/([A-Z][A-Z]|[^A-Z])/g;
+   # above is conceptually similar to:     @chars = $text =~ m/(.)/g;
+   #
+   foreach $char (@chars) {
+       print "found GX!\n", last if $char eq 'GX';
+   }
+
+Or like this:
+
+   while ($martian =~ m/\G([A-Z][A-Z]|.)/gs) {  # \G probably unneeded
+       print "found GX!\n", last if $1 eq 'GX';
+   }
+
+Here's another, slightly less painful, way to do it from Benjamin
+Goldberg, who uses a zero-width negative look-behind assertion.
+
+	print "found GX!\n" if	$martian =~ m/
+		   (?<![A-Z])
+		   (?:[A-Z][A-Z])*?
+		   GX
+		/x;
+
+This succeeds if the "martian" character GX is in the string, and fails
+otherwise.  If you don't like using (?<!), a zero-width negative
+look-behind assertion, you can replace (?<![A-Z]) with (?:^|[^A-Z]).
+
+It does have the drawback of putting the wrong thing in $-[0] and $+[0],
+but this usually can be worked around.
+
+=head2 How do I match a pattern that is supplied by the user?
+
+Well, if it's really a pattern, then just use
+
+    chomp($pattern = <STDIN>);
+    if ($line =~ /$pattern/) { }
+
+Alternatively, since you have no guarantee that your user entered
+a valid regular expression, trap the exception this way:
+
+    if (eval { $line =~ /$pattern/ }) { }
+
+If all you really want is to search for a string, not a pattern,
+then you should either use the index() function, which is made for
+string searching, or, if you can't be disabused of using a pattern
+match on a non-pattern, then be sure to use C<\Q>...C<\E>, documented
+in L<perlre>.
+
+    $pattern = <STDIN>;
+
+    open (FILE, $input) or die "Couldn't open input $input: $!; aborting";
+    while (<FILE>) {
+	print if /\Q$pattern\E/;
+    }
+    close FILE;
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2006 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain.  You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit.  A simple comment in the code giving
+credit would be courteous but is not required.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq7.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq7.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq7.pod	(revision 14489)
@@ -0,0 +1,976 @@
+=head1 NAME
+
+perlfaq7 - General Perl Language Issues ($Revision: 1.28 $, $Date: 2005/12/31 00:54:37 $)
+
+=head1 DESCRIPTION
+
+This section deals with general Perl language issues that don't
+clearly fit into any of the other sections.
+
+=head2 Can I get a BNF/yacc/RE for the Perl language?
+
+There is no BNF, but you can paw your way through the yacc grammar in
+perly.y in the source distribution if you're particularly brave.  The
+grammar relies on very smart tokenizing code, so be prepared to
+venture into toke.c as well.
+
+In the words of Chaim Frenkel: "Perl's grammar can not be reduced to BNF.
+The work of parsing perl is distributed between yacc, the lexer, smoke
+and mirrors."
+
+=head2 What are all these $@%&* punctuation signs, and how do I know when to use them?
+
+They are type specifiers, as detailed in L<perldata>:
+
+    $ for scalar values (number, string or reference)
+    @ for arrays
+    % for hashes (associative arrays)
+    & for subroutines (aka functions, procedures, methods)
+    * for all types of that symbol name.  In version 4 you used them like
+      pointers, but in modern perls you can just use references.
+
+There are couple of other symbols that you're likely to encounter that aren't
+really type specifiers:
+
+    <> are used for inputting a record from a filehandle.
+    \  takes a reference to something.
+
+Note that <FILE> is I<neither> the type specifier for files
+nor the name of the handle.  It is the C<< <> >> operator applied
+to the handle FILE.  It reads one line (well, record--see
+L<perlvar/$E<sol>>) from the handle FILE in scalar context, or I<all> lines
+in list context.  When performing open, close, or any other operation
+besides C<< <> >> on files, or even when talking about the handle, do
+I<not> use the brackets.  These are correct: C<eof(FH)>, C<seek(FH, 0,
+2)> and "copying from STDIN to FILE".
+
+=head2 Do I always/never have to quote my strings or use semicolons and commas?
+
+Normally, a bareword doesn't need to be quoted, but in most cases
+probably should be (and must be under C<use strict>).  But a hash key
+consisting of a simple word (that isn't the name of a defined
+subroutine) and the left-hand operand to the C<< => >> operator both
+count as though they were quoted:
+
+    This                    is like this
+    ------------            ---------------
+    $foo{line}              $foo{'line'}
+    bar => stuff            'bar' => stuff
+
+The final semicolon in a block is optional, as is the final comma in a
+list.  Good style (see L<perlstyle>) says to put them in except for
+one-liners:
+
+    if ($whoops) { exit 1 }
+    @nums = (1, 2, 3);
+
+    if ($whoops) {
+        exit 1;
+    }
+    @lines = (
+	"There Beren came from mountains cold",
+	"And lost he wandered under leaves",
+    );
+
+=head2 How do I skip some return values?
+
+One way is to treat the return values as a list and index into it:
+
+        $dir = (getpwnam($user))[7];
+
+Another way is to use undef as an element on the left-hand-side:
+
+    ($dev, $ino, undef, undef, $uid, $gid) = stat($file);
+
+You can also use a list slice to select only the elements that
+you need:
+
+	($dev, $ino, $uid, $gid) = ( stat($file) )[0,1,4,5];
+
+=head2 How do I temporarily block warnings?
+
+If you are running Perl 5.6.0 or better, the C<use warnings> pragma
+allows fine control of what warning are produced.
+See L<perllexwarn> for more details.
+
+    {
+	no warnings;          # temporarily turn off warnings
+	$a = $b + $c;         # I know these might be undef
+    }
+
+Additionally, you can enable and disable categories of warnings.
+You turn off the categories you want to ignore and you can still
+get other categories of warnings.  See L<perllexwarn> for the
+complete details, including the category names and hierarchy.
+
+	{
+	no warnings 'uninitialized';
+	$a = $b + $c;
+	}
+
+If you have an older version of Perl, the C<$^W> variable (documented
+in L<perlvar>) controls runtime warnings for a block:
+
+    {
+	local $^W = 0;        # temporarily turn off warnings
+	$a = $b + $c;         # I know these might be undef
+    }
+
+Note that like all the punctuation variables, you cannot currently
+use my() on C<$^W>, only local().
+
+=head2 What's an extension?
+
+An extension is a way of calling compiled C code from Perl.  Reading
+L<perlxstut> is a good place to learn more about extensions.
+
+=head2 Why do Perl operators have different precedence than C operators?
+
+Actually, they don't.  All C operators that Perl copies have the same
+precedence in Perl as they do in C.  The problem is with operators that C
+doesn't have, especially functions that give a list context to everything
+on their right, eg. print, chmod, exec, and so on.  Such functions are
+called "list operators" and appear as such in the precedence table in
+L<perlop>.
+
+A common mistake is to write:
+
+    unlink $file || die "snafu";
+
+This gets interpreted as:
+
+    unlink ($file || die "snafu");
+
+To avoid this problem, either put in extra parentheses or use the
+super low precedence C<or> operator:
+
+    (unlink $file) || die "snafu";
+    unlink $file or die "snafu";
+
+The "English" operators (C<and>, C<or>, C<xor>, and C<not>)
+deliberately have precedence lower than that of list operators for
+just such situations as the one above.
+
+Another operator with surprising precedence is exponentiation.  It
+binds more tightly even than unary minus, making C<-2**2> product a
+negative not a positive four.  It is also right-associating, meaning
+that C<2**3**2> is two raised to the ninth power, not eight squared.
+
+Although it has the same precedence as in C, Perl's C<?:> operator
+produces an lvalue.  This assigns $x to either $a or $b, depending
+on the trueness of $maybe:
+
+    ($maybe ? $a : $b) = $x;
+
+=head2 How do I declare/create a structure?
+
+In general, you don't "declare" a structure.  Just use a (probably
+anonymous) hash reference.  See L<perlref> and L<perldsc> for details.
+Here's an example:
+
+    $person = {};                   # new anonymous hash
+    $person->{AGE}  = 24;           # set field AGE to 24
+    $person->{NAME} = "Nat";        # set field NAME to "Nat"
+
+If you're looking for something a bit more rigorous, try L<perltoot>.
+
+=head2 How do I create a module?
+
+(contributed by brian d foy)
+
+L<perlmod>, L<perlmodlib>, L<perlmodstyle> explain modules
+in all the gory details. L<perlnewmod> gives a brief
+overview of the process along with a couple of suggestions
+about style.
+
+If you need to include C code or C library interfaces in
+your module, you'll need h2xs.  h2xs will create the module
+distribution structure and the initial interface files
+you'll need.  L<perlxs> and L<perlxstut> explain the details.
+
+If you don't need to use C code, other tools such as
+ExtUtils::ModuleMaker and Module::Starter, can help you
+create a skeleton module distribution.
+
+You may also want to see Sam Tregar's "Writing Perl Modules
+for CPAN" ( http://apress.com/book/bookDisplay.html?bID=14 )
+which is the best hands-on guide to creating module
+distributions.
+
+=head2 How do I create a class?
+
+See L<perltoot> for an introduction to classes and objects, as well as
+L<perlobj> and L<perlbot>.
+
+=head2 How can I tell if a variable is tainted?
+
+You can use the tainted() function of the Scalar::Util module, available
+from CPAN (or included with Perl since release 5.8.0).
+See also L<perlsec/"Laundering and Detecting Tainted Data">.
+
+=head2 What's a closure?
+
+Closures are documented in L<perlref>.
+
+I<Closure> is a computer science term with a precise but
+hard-to-explain meaning. Closures are implemented in Perl as anonymous
+subroutines with lasting references to lexical variables outside their
+own scopes.  These lexicals magically refer to the variables that were
+around when the subroutine was defined (deep binding).
+
+Closures make sense in any programming language where you can have the
+return value of a function be itself a function, as you can in Perl.
+Note that some languages provide anonymous functions but are not
+capable of providing proper closures: the Python language, for
+example.  For more information on closures, check out any textbook on
+functional programming.  Scheme is a language that not only supports
+but encourages closures.
+
+Here's a classic function-generating function:
+
+    sub add_function_generator {
+      return sub { shift() + shift() };
+    }
+
+    $add_sub = add_function_generator();
+    $sum = $add_sub->(4,5);                # $sum is 9 now.
+
+The closure works as a I<function template> with some customization
+slots left out to be filled later.  The anonymous subroutine returned
+by add_function_generator() isn't technically a closure because it
+refers to no lexicals outside its own scope.
+
+Contrast this with the following make_adder() function, in which the
+returned anonymous function contains a reference to a lexical variable
+outside the scope of that function itself.  Such a reference requires
+that Perl return a proper closure, thus locking in for all time the
+value that the lexical had when the function was created.
+
+    sub make_adder {
+        my $addpiece = shift;
+        return sub { shift() + $addpiece };
+    }
+
+    $f1 = make_adder(20);
+    $f2 = make_adder(555);
+
+Now C<&$f1($n)> is always 20 plus whatever $n you pass in, whereas
+C<&$f2($n)> is always 555 plus whatever $n you pass in.  The $addpiece
+in the closure sticks around.
+
+Closures are often used for less esoteric purposes.  For example, when
+you want to pass in a bit of code into a function:
+
+    my $line;
+    timeout( 30, sub { $line = <STDIN> } );
+
+If the code to execute had been passed in as a string,
+C<< '$line = <STDIN>' >>, there would have been no way for the
+hypothetical timeout() function to access the lexical variable
+$line back in its caller's scope.
+
+=head2 What is variable suicide and how can I prevent it?
+
+This problem was fixed in perl 5.004_05, so preventing it means upgrading
+your version of perl. ;)
+
+Variable suicide is when you (temporarily or permanently) lose the value
+of a variable.  It is caused by scoping through my() and local()
+interacting with either closures or aliased foreach() iterator variables
+and subroutine arguments.  It used to be easy to inadvertently lose a
+variable's value this way, but now it's much harder.  Take this code:
+
+    my $f = 'foo';
+    sub T {
+      while ($i++ < 3) { my $f = $f; $f .= $i; print $f, "\n" }
+    }
+    T;
+    print "Finally $f\n";
+
+If you are experiencing variable suicide, that C<my $f> in the subroutine
+doesn't pick up a fresh copy of the C<$f> whose value is <foo>. The output
+shows that inside the subroutine the value of C<$f> leaks through when it
+shouldn't, as in this output:
+
+	foobar
+	foobarbar
+	foobarbarbar
+	Finally foo
+
+The $f that has "bar" added to it three times should be a new C<$f>
+C<my $f> should create a new lexical variable each time through the loop.
+The expected output is:
+
+	foobar
+	foobar
+	foobar
+	Finally foo
+
+=head2 How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regex}?
+
+With the exception of regexes, you need to pass references to these
+objects.  See L<perlsub/"Pass by Reference"> for this particular
+question, and L<perlref> for information on references.
+
+See "Passing Regexes", below, for information on passing regular
+expressions.
+
+=over 4
+
+=item Passing Variables and Functions
+
+Regular variables and functions are quite easy to pass: just pass in a
+reference to an existing or anonymous variable or function:
+
+    func( \$some_scalar );
+
+    func( \@some_array  );
+    func( [ 1 .. 10 ]   );
+
+    func( \%some_hash   );
+    func( { this => 10, that => 20 }   );
+
+    func( \&some_func   );
+    func( sub { $_[0] ** $_[1] }   );
+
+=item Passing Filehandles
+
+As of Perl 5.6, you can represent filehandles with scalar variables
+which you treat as any other scalar.
+
+	open my $fh, $filename or die "Cannot open $filename! $!";
+	func( $fh );
+
+	sub func {
+		my $passed_fh = shift;
+
+		my $line = <$fh>;
+		}
+
+Before Perl 5.6, you had to use the C<*FH> or C<\*FH> notations.
+These are "typeglobs"--see L<perldata/"Typeglobs and Filehandles">
+and especially L<perlsub/"Pass by Reference"> for more information.
+
+=item Passing Regexes
+
+To pass regexes around, you'll need to be using a release of Perl
+sufficiently recent as to support the C<qr//> construct, pass around
+strings and use an exception-trapping eval, or else be very, very clever.
+
+Here's an example of how to pass in a string to be regex compared
+using C<qr//>:
+
+    sub compare($$) {
+        my ($val1, $regex) = @_;
+        my $retval = $val1 =~ /$regex/;
+	return $retval;
+    }
+    $match = compare("old McDonald", qr/d.*D/i);
+
+Notice how C<qr//> allows flags at the end.  That pattern was compiled
+at compile time, although it was executed later.  The nifty C<qr//>
+notation wasn't introduced until the 5.005 release.  Before that, you
+had to approach this problem much less intuitively.  For example, here
+it is again if you don't have C<qr//>:
+
+    sub compare($$) {
+        my ($val1, $regex) = @_;
+        my $retval = eval { $val1 =~ /$regex/ };
+	die if $@;
+	return $retval;
+    }
+
+    $match = compare("old McDonald", q/($?i)d.*D/);
+
+Make sure you never say something like this:
+
+    return eval "\$val =~ /$regex/";   # WRONG
+
+or someone can sneak shell escapes into the regex due to the double
+interpolation of the eval and the double-quoted string.  For example:
+
+    $pattern_of_evil = 'danger ${ system("rm -rf * &") } danger';
+
+    eval "\$string =~ /$pattern_of_evil/";
+
+Those preferring to be very, very clever might see the O'Reilly book,
+I<Mastering Regular Expressions>, by Jeffrey Friedl.  Page 273's
+Build_MatchMany_Function() is particularly interesting.  A complete
+citation of this book is given in L<perlfaq2>.
+
+=item Passing Methods
+
+To pass an object method into a subroutine, you can do this:
+
+    call_a_lot(10, $some_obj, "methname")
+    sub call_a_lot {
+        my ($count, $widget, $trick) = @_;
+        for (my $i = 0; $i < $count; $i++) {
+            $widget->$trick();
+        }
+    }
+
+Or, you can use a closure to bundle up the object, its
+method call, and arguments:
+
+    my $whatnot =  sub { $some_obj->obfuscate(@args) };
+    func($whatnot);
+    sub func {
+        my $code = shift;
+        &$code();
+    }
+
+You could also investigate the can() method in the UNIVERSAL class
+(part of the standard perl distribution).
+
+=back
+
+=head2 How do I create a static variable?
+
+(contributed by brian d foy)
+
+Perl doesn't have "static" variables, which can only be accessed from
+the function in which they are declared. You can get the same effect
+with lexical variables, though.
+
+You can fake a static variable by using a lexical variable which goes
+out of scope. In this example, you define the subroutine C<counter>, and
+it uses the lexical variable C<$count>. Since you wrap this in a BEGIN
+block, C<$count> is defined at compile-time, but also goes out of
+scope at the end of the BEGIN block. The BEGIN block also ensures that
+the subroutine and the value it uses is defined at compile-time so the
+subroutine is ready to use just like any other subroutine, and you can
+put this code in the same place as other subroutines in the program
+text (i.e. at the end of the code, typically). The subroutine
+C<counter> still has a reference to the data, and is the only way you
+can access the value (and each time you do, you increment the value).
+The data in chunk of memory defined by C<$count> is private to
+C<counter>.
+
+    BEGIN {
+        my $count = 1;
+        sub counter { $count++ }
+    }
+
+    my $start = count();
+
+    .... # code that calls count();
+
+    my $end = count();
+
+In the previous example, you created a function-private variable
+because only one function remembered its reference. You could define
+multiple functions while the variable is in scope, and each function
+can share the "private" variable. It's not really "static" because you
+can access it outside the function while the lexical variable is in
+scope, and even create references to it. In this example,
+C<increment_count> and C<return_count> share the variable. One
+function adds to the value and the other simply returns the value.
+They can both access C<$count>, and since it has gone out of scope,
+there is no other way to access it.
+
+    BEGIN {
+        my $count = 1;
+        sub increment_count { $count++ }
+        sub return_count    { $count }
+    }
+
+To declare a file-private variable, you still use a lexical variable.
+A file is also a scope, so a lexical variable defined in the file
+cannot be seen from any other file.
+
+See L<perlsub/"Persistent Private Variables"> for more information.
+The discussion of closures in L<perlref> may help you even though we
+did not use anonymous subroutines in this answer. See
+L<perlsub/"Persistent Private Variables"> for details.
+
+=head2 What's the difference between dynamic and lexical (static) scoping?  Between local() and my()?
+
+C<local($x)> saves away the old value of the global variable C<$x>
+and assigns a new value for the duration of the subroutine I<which is
+visible in other functions called from that subroutine>.  This is done
+at run-time, so is called dynamic scoping.  local() always affects global
+variables, also called package variables or dynamic variables.
+
+C<my($x)> creates a new variable that is only visible in the current
+subroutine.  This is done at compile-time, so it is called lexical or
+static scoping.  my() always affects private variables, also called
+lexical variables or (improperly) static(ly scoped) variables.
+
+For instance:
+
+    sub visible {
+	print "var has value $var\n";
+    }
+
+    sub dynamic {
+	local $var = 'local';	# new temporary value for the still-global
+	visible();              #   variable called $var
+    }
+
+    sub lexical {
+	my $var = 'private';    # new private variable, $var
+	visible();              # (invisible outside of sub scope)
+    }
+
+    $var = 'global';
+
+    visible();      		# prints global
+    dynamic();      		# prints local
+    lexical();      		# prints global
+
+Notice how at no point does the value "private" get printed.  That's
+because $var only has that value within the block of the lexical()
+function, and it is hidden from called subroutine.
+
+In summary, local() doesn't make what you think of as private, local
+variables.  It gives a global variable a temporary value.  my() is
+what you're looking for if you want private variables.
+
+See L<perlsub/"Private Variables via my()"> and
+L<perlsub/"Temporary Values via local()"> for excruciating details.
+
+=head2 How can I access a dynamic variable while a similarly named lexical is in scope?
+
+If you know your package, you can just mention it explicitly, as in
+$Some_Pack::var. Note that the notation $::var is B<not> the dynamic $var
+in the current package, but rather the one in the "main" package, as
+though you had written $main::var.
+
+	use vars '$var';
+	local $var = "global";
+	my    $var = "lexical";
+
+	print "lexical is $var\n";
+	print "global  is $main::var\n";
+
+Alternatively you can use the compiler directive our() to bring a
+dynamic variable into the current lexical scope.
+
+	require 5.006; # our() did not exist before 5.6
+	use vars '$var';
+
+	local $var = "global";
+	my $var    = "lexical";
+
+	print "lexical is $var\n";
+
+	{
+	  our $var;
+	  print "global  is $var\n";
+	}
+
+=head2 What's the difference between deep and shallow binding?
+
+In deep binding, lexical variables mentioned in anonymous subroutines
+are the same ones that were in scope when the subroutine was created.
+In shallow binding, they are whichever variables with the same names
+happen to be in scope when the subroutine is called.  Perl always uses
+deep binding of lexical variables (i.e., those created with my()).
+However, dynamic variables (aka global, local, or package variables)
+are effectively shallowly bound.  Consider this just one more reason
+not to use them.  See the answer to L<"What's a closure?">.
+
+=head2 Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
+
+C<my()> and C<local()> give list context to the right hand side
+of C<=>.  The <FH> read operation, like so many of Perl's
+functions and operators, can tell which context it was called in and
+behaves appropriately.  In general, the scalar() function can help.
+This function does nothing to the data itself (contrary to popular myth)
+but rather tells its argument to behave in whatever its scalar fashion is.
+If that function doesn't have a defined scalar behavior, this of course
+doesn't help you (such as with sort()).
+
+To enforce scalar context in this particular case, however, you need
+merely omit the parentheses:
+
+    local($foo) = <FILE>;	    # WRONG
+    local($foo) = scalar(<FILE>);   # ok
+    local $foo  = <FILE>;	    # right
+
+You should probably be using lexical variables anyway, although the
+issue is the same here:
+
+    my($foo) = <FILE>;	# WRONG
+    my $foo  = <FILE>;	# right
+
+=head2 How do I redefine a builtin function, operator, or method?
+
+Why do you want to do that? :-)
+
+If you want to override a predefined function, such as open(),
+then you'll have to import the new definition from a different
+module.  See L<perlsub/"Overriding Built-in Functions">.  There's
+also an example in L<perltoot/"Class::Template">.
+
+If you want to overload a Perl operator, such as C<+> or C<**>,
+then you'll want to use the C<use overload> pragma, documented
+in L<overload>.
+
+If you're talking about obscuring method calls in parent classes,
+see L<perltoot/"Overridden Methods">.
+
+=head2 What's the difference between calling a function as &foo and foo()?
+
+When you call a function as C<&foo>, you allow that function access to
+your current @_ values, and you bypass prototypes.
+The function doesn't get an empty @_--it gets yours!  While not
+strictly speaking a bug (it's documented that way in L<perlsub>), it
+would be hard to consider this a feature in most cases.
+
+When you call your function as C<&foo()>, then you I<do> get a new @_,
+but prototyping is still circumvented.
+
+Normally, you want to call a function using C<foo()>.  You may only
+omit the parentheses if the function is already known to the compiler
+because it already saw the definition (C<use> but not C<require>),
+or via a forward reference or C<use subs> declaration.  Even in this
+case, you get a clean @_ without any of the old values leaking through
+where they don't belong.
+
+=head2 How do I create a switch or case statement?
+
+This is explained in more depth in the L<perlsyn>.  Briefly, there's
+no official case statement, because of the variety of tests possible
+in Perl (numeric comparison, string comparison, glob comparison,
+regex matching, overloaded comparisons, ...).
+Larry couldn't decide how best to do this, so he left it out, even
+though it's been on the wish list since perl1.
+
+Starting from Perl 5.8 to get switch and case one can use the
+Switch extension and say:
+
+	use Switch;
+
+after which one has switch and case.  It is not as fast as it could be
+because it's not really part of the language (it's done using source
+filters) but it is available, and it's very flexible.
+
+But if one wants to use pure Perl, the general answer is to write a
+construct like this:
+
+    for ($variable_to_test) {
+	if    (/pat1/)  { }     # do something
+	elsif (/pat2/)  { }     # do something else
+	elsif (/pat3/)  { }     # do something else
+	else            { }     # default
+    }
+
+Here's a simple example of a switch based on pattern matching, this
+time lined up in a way to make it look more like a switch statement.
+We'll do a multiway conditional based on the type of reference stored
+in $whatchamacallit:
+
+    SWITCH: for (ref $whatchamacallit) {
+
+	/^$/		&& die "not a reference";
+
+	/SCALAR/	&& do {
+				print_scalar($$ref);
+				last SWITCH;
+			};
+
+	/ARRAY/		&& do {
+				print_array(@$ref);
+				last SWITCH;
+			};
+
+	/HASH/		&& do {
+				print_hash(%$ref);
+				last SWITCH;
+			};
+
+	/CODE/		&& do {
+				warn "can't print function ref";
+				last SWITCH;
+			};
+
+	# DEFAULT
+
+	warn "User defined type skipped";
+
+    }
+
+See C<perlsyn/"Basic BLOCKs and Switch Statements"> for many other
+examples in this style.
+
+Sometimes you should change the positions of the constant and the variable.
+For example, let's say you wanted to test which of many answers you were
+given, but in a case-insensitive way that also allows abbreviations.
+You can use the following technique if the strings all start with
+different characters or if you want to arrange the matches so that
+one takes precedence over another, as C<"SEND"> has precedence over
+C<"STOP"> here:
+
+    chomp($answer = <>);
+    if    ("SEND"  =~ /^\Q$answer/i) { print "Action is send\n"  }
+    elsif ("STOP"  =~ /^\Q$answer/i) { print "Action is stop\n"  }
+    elsif ("ABORT" =~ /^\Q$answer/i) { print "Action is abort\n" }
+    elsif ("LIST"  =~ /^\Q$answer/i) { print "Action is list\n"  }
+    elsif ("EDIT"  =~ /^\Q$answer/i) { print "Action is edit\n"  }
+
+A totally different approach is to create a hash of function references.
+
+    my %commands = (
+        "happy" => \&joy,
+        "sad",  => \&sullen,
+        "done"  => sub { die "See ya!" },
+        "mad"   => \&angry,
+    );
+
+    print "How are you? ";
+    chomp($string = <STDIN>);
+    if ($commands{$string}) {
+        $commands{$string}->();
+    } else {
+        print "No such command: $string\n";
+    }
+
+=head2 How can I catch accesses to undefined variables, functions, or methods?
+
+The AUTOLOAD method, discussed in L<perlsub/"Autoloading"> and
+L<perltoot/"AUTOLOAD: Proxy Methods">, lets you capture calls to
+undefined functions and methods.
+
+When it comes to undefined variables that would trigger a warning
+under C<use warnings>, you can promote the warning to an error.
+
+	use warnings FATAL => qw(uninitialized);
+
+=head2 Why can't a method included in this same file be found?
+
+Some possible reasons: your inheritance is getting confused, you've
+misspelled the method name, or the object is of the wrong type.  Check
+out L<perltoot> for details about any of the above cases.  You may
+also use C<print ref($object)> to find out the class C<$object> was
+blessed into.
+
+Another possible reason for problems is because you've used the
+indirect object syntax (eg, C<find Guru "Samy">) on a class name
+before Perl has seen that such a package exists.  It's wisest to make
+sure your packages are all defined before you start using them, which
+will be taken care of if you use the C<use> statement instead of
+C<require>.  If not, make sure to use arrow notation (eg.,
+C<< Guru->find("Samy") >>) instead.  Object notation is explained in
+L<perlobj>.
+
+Make sure to read about creating modules in L<perlmod> and
+the perils of indirect objects in L<perlobj/"Method Invocation">.
+
+=head2 How can I find out my current package?
+
+If you're just a random program, you can do this to find
+out what the currently compiled package is:
+
+    my $packname = __PACKAGE__;
+
+But, if you're a method and you want to print an error message
+that includes the kind of object you were called on (which is
+not necessarily the same as the one in which you were compiled):
+
+    sub amethod {
+	my $self  = shift;
+	my $class = ref($self) || $self;
+	warn "called me from a $class object";
+    }
+
+=head2 How can I comment out a large block of perl code?
+
+You can use embedded POD to discard it.  Enclose the blocks you want
+to comment out in POD markers.  The <=begin> directive marks a section
+for a specific formatter.  Use the C<comment> format, which no formatter
+should claim to understand (by policy).  Mark the end of the block
+with <=end>.
+
+    # program is here
+
+    =begin comment
+
+    all of this stuff
+
+    here will be ignored
+    by everyone
+
+	=end comment
+
+    =cut
+
+    # program continues
+
+The pod directives cannot go just anywhere.  You must put a
+pod directive where the parser is expecting a new statement,
+not just in the middle of an expression or some other
+arbitrary grammar production.
+
+See L<perlpod> for more details.
+
+=head2 How do I clear a package?
+
+Use this code, provided by Mark-Jason Dominus:
+
+    sub scrub_package {
+	no strict 'refs';
+	my $pack = shift;
+	die "Shouldn't delete main package"
+	    if $pack eq "" || $pack eq "main";
+	my $stash = *{$pack . '::'}{HASH};
+	my $name;
+	foreach $name (keys %$stash) {
+	    my $fullname = $pack . '::' . $name;
+	    # Get rid of everything with that name.
+	    undef $$fullname;
+	    undef @$fullname;
+	    undef %$fullname;
+	    undef &$fullname;
+	    undef *$fullname;
+	}
+    }
+
+Or, if you're using a recent release of Perl, you can
+just use the Symbol::delete_package() function instead.
+
+=head2 How can I use a variable as a variable name?
+
+Beginners often think they want to have a variable contain the name
+of a variable.
+
+    $fred    = 23;
+    $varname = "fred";
+    ++$$varname;         # $fred now 24
+
+This works I<sometimes>, but it is a very bad idea for two reasons.
+
+The first reason is that this technique I<only works on global
+variables>.  That means that if $fred is a lexical variable created
+with my() in the above example, the code wouldn't work at all: you'd
+accidentally access the global and skip right over the private lexical
+altogether.  Global variables are bad because they can easily collide
+accidentally and in general make for non-scalable and confusing code.
+
+Symbolic references are forbidden under the C<use strict> pragma.
+They are not true references and consequently are not reference counted
+or garbage collected.
+
+The other reason why using a variable to hold the name of another
+variable is a bad idea is that the question often stems from a lack of
+understanding of Perl data structures, particularly hashes.  By using
+symbolic references, you are just using the package's symbol-table hash
+(like C<%main::>) instead of a user-defined hash.  The solution is to
+use your own hash or a real reference instead.
+
+    $USER_VARS{"fred"} = 23;
+    $varname = "fred";
+    $USER_VARS{$varname}++;  # not $$varname++
+
+There we're using the %USER_VARS hash instead of symbolic references.
+Sometimes this comes up in reading strings from the user with variable
+references and wanting to expand them to the values of your perl
+program's variables.  This is also a bad idea because it conflates the
+program-addressable namespace and the user-addressable one.  Instead of
+reading a string and expanding it to the actual contents of your program's
+own variables:
+
+    $str = 'this has a $fred and $barney in it';
+    $str =~ s/(\$\w+)/$1/eeg;		  # need double eval
+
+it would be better to keep a hash around like %USER_VARS and have
+variable references actually refer to entries in that hash:
+
+    $str =~ s/\$(\w+)/$USER_VARS{$1}/g;   # no /e here at all
+
+That's faster, cleaner, and safer than the previous approach.  Of course,
+you don't need to use a dollar sign.  You could use your own scheme to
+make it less confusing, like bracketed percent symbols, etc.
+
+    $str = 'this has a %fred% and %barney% in it';
+    $str =~ s/%(\w+)%/$USER_VARS{$1}/g;   # no /e here at all
+
+Another reason that folks sometimes think they want a variable to
+contain the name of a variable is because they don't know how to build
+proper data structures using hashes.  For example, let's say they
+wanted two hashes in their program: %fred and %barney, and that they
+wanted to use another scalar variable to refer to those by name.
+
+    $name = "fred";
+    $$name{WIFE} = "wilma";     # set %fred
+
+    $name = "barney";
+    $$name{WIFE} = "betty";	# set %barney
+
+This is still a symbolic reference, and is still saddled with the
+problems enumerated above.  It would be far better to write:
+
+    $folks{"fred"}{WIFE}   = "wilma";
+    $folks{"barney"}{WIFE} = "betty";
+
+And just use a multilevel hash to start with.
+
+The only times that you absolutely I<must> use symbolic references are
+when you really must refer to the symbol table.  This may be because it's
+something that can't take a real reference to, such as a format name.
+Doing so may also be important for method calls, since these always go
+through the symbol table for resolution.
+
+In those cases, you would turn off C<strict 'refs'> temporarily so you
+can play around with the symbol table.  For example:
+
+    @colors = qw(red blue green yellow orange purple violet);
+    for my $name (@colors) {
+        no strict 'refs';  # renege for the block
+        *$name = sub { "<FONT COLOR='$name'>@_</FONT>" };
+    }
+
+All those functions (red(), blue(), green(), etc.) appear to be separate,
+but the real code in the closure actually was compiled only once.
+
+So, sometimes you might want to use symbolic references to directly
+manipulate the symbol table.  This doesn't matter for formats, handles, and
+subroutines, because they are always global--you can't use my() on them.
+For scalars, arrays, and hashes, though--and usually for subroutines--
+you probably only want to use hard references.
+
+=head2 What does "bad interpreter" mean?
+
+(contributed by brian d foy)
+
+The "bad interpreter" message comes from the shell, not perl.  The
+actual message may vary depending on your platform, shell, and locale
+settings.
+
+If you see "bad interpreter - no such file or directory", the first
+line in your perl script (the "shebang" line) does not contain the
+right path to perl (or any other program capable of running scripts).
+Sometimes this happens when you move the script from one machine to
+another and each machine has a different path to perl---/usr/bin/perl
+versus /usr/local/bin/perl for instance. It may also indicate
+that the source machine has CRLF line terminators and the
+destination machine has LF only: the shell tries to find
+/usr/bin/perl<CR>, but can't.
+
+If you see "bad interpreter: Permission denied", you need to make your
+script executable.
+
+In either case, you should still be able to run the scripts with perl
+explicitly:
+
+	% perl script.pl
+
+If you get a message like "perl: command not found", perl is not in
+your PATH, which might also mean that the location of perl is not
+where you expect it so you need to adjust your shebang line.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2006 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain.  You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit.  A simple comment in the code giving
+credit would be courteous but is not required.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq8.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq8.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq8.pod	(revision 14489)
@@ -0,0 +1,1266 @@
+=head1 NAME
+
+perlfaq8 - System Interaction ($Revision: 1.27 $, $Date: 2005/12/31 00:54:37 $)
+
+=head1 DESCRIPTION
+
+This section of the Perl FAQ covers questions involving operating
+system interaction.  Topics include interprocess communication (IPC),
+control over the user-interface (keyboard, screen and pointing
+devices), and most anything else not related to data manipulation.
+
+Read the FAQs and documentation specific to the port of perl to your
+operating system (eg, L<perlvms>, L<perlplan9>, ...).  These should
+contain more detailed information on the vagaries of your perl.
+
+=head2 How do I find out which operating system I'm running under?
+
+The $^O variable ($OSNAME if you use English) contains an indication of
+the name of the operating system (not its release number) that your perl
+binary was built for.
+
+=head2 How come exec() doesn't return?
+
+Because that's what it does: it replaces your currently running
+program with a different one.  If you want to keep going (as is
+probably the case if you're asking this question) use system()
+instead.
+
+=head2 How do I do fancy stuff with the keyboard/screen/mouse?
+
+How you access/control keyboards, screens, and pointing devices
+("mice") is system-dependent.  Try the following modules:
+
+=over 4
+
+=item Keyboard
+
+	Term::Cap               Standard perl distribution
+	Term::ReadKey           CPAN
+	Term::ReadLine::Gnu     CPAN
+	Term::ReadLine::Perl    CPAN
+	Term::Screen            CPAN
+
+=item Screen
+
+	Term::Cap               Standard perl distribution
+	Curses                  CPAN
+	Term::ANSIColor         CPAN
+
+=item Mouse
+
+	Tk                      CPAN
+
+=back
+
+Some of these specific cases are shown as examples in other answers
+in this section of the perlfaq.
+
+=head2 How do I print something out in color?
+
+In general, you don't, because you don't know whether
+the recipient has a color-aware display device.  If you
+know that they have an ANSI terminal that understands
+color, you can use the Term::ANSIColor module from CPAN:
+
+    use Term::ANSIColor;
+    print color("red"), "Stop!\n", color("reset");
+    print color("green"), "Go!\n", color("reset");
+
+Or like this:
+
+    use Term::ANSIColor qw(:constants);
+    print RED, "Stop!\n", RESET;
+    print GREEN, "Go!\n", RESET;
+
+=head2 How do I read just one key without waiting for a return key?
+
+Controlling input buffering is a remarkably system-dependent matter.
+On many systems, you can just use the B<stty> command as shown in
+L<perlfunc/getc>, but as you see, that's already getting you into
+portability snags.
+
+    open(TTY, "+</dev/tty") or die "no tty: $!";
+    system "stty  cbreak </dev/tty >/dev/tty 2>&1";
+    $key = getc(TTY);		# perhaps this works
+    # OR ELSE
+    sysread(TTY, $key, 1);	# probably this does
+    system "stty -cbreak </dev/tty >/dev/tty 2>&1";
+
+The Term::ReadKey module from CPAN offers an easy-to-use interface that
+should be more efficient than shelling out to B<stty> for each key.
+It even includes limited support for Windows.
+
+    use Term::ReadKey;
+    ReadMode('cbreak');
+    $key = ReadKey(0);
+    ReadMode('normal');
+
+However, using the code requires that you have a working C compiler
+and can use it to build and install a CPAN module.  Here's a solution
+using the standard POSIX module, which is already on your systems
+(assuming your system supports POSIX).
+
+    use HotKey;
+    $key = readkey();
+
+And here's the HotKey module, which hides the somewhat mystifying calls
+to manipulate the POSIX termios structures.
+
+    # HotKey.pm
+    package HotKey;
+
+    @ISA = qw(Exporter);
+    @EXPORT = qw(cbreak cooked readkey);
+
+    use strict;
+    use POSIX qw(:termios_h);
+    my ($term, $oterm, $echo, $noecho, $fd_stdin);
+
+    $fd_stdin = fileno(STDIN);
+    $term     = POSIX::Termios->new();
+    $term->getattr($fd_stdin);
+    $oterm     = $term->getlflag();
+
+    $echo     = ECHO | ECHOK | ICANON;
+    $noecho   = $oterm & ~$echo;
+
+    sub cbreak {
+        $term->setlflag($noecho);  # ok, so i don't want echo either
+        $term->setcc(VTIME, 1);
+        $term->setattr($fd_stdin, TCSANOW);
+    }
+
+    sub cooked {
+        $term->setlflag($oterm);
+        $term->setcc(VTIME, 0);
+        $term->setattr($fd_stdin, TCSANOW);
+    }
+
+    sub readkey {
+        my $key = '';
+        cbreak();
+        sysread(STDIN, $key, 1);
+        cooked();
+        return $key;
+    }
+
+    END { cooked() }
+
+    1;
+
+=head2 How do I check whether input is ready on the keyboard?
+
+The easiest way to do this is to read a key in nonblocking mode with the
+Term::ReadKey module from CPAN, passing it an argument of -1 to indicate
+not to block:
+
+    use Term::ReadKey;
+
+    ReadMode('cbreak');
+
+    if (defined ($char = ReadKey(-1)) ) {
+        # input was waiting and it was $char
+    } else {
+        # no input was waiting
+    }
+
+    ReadMode('normal');                  # restore normal tty settings
+
+=head2 How do I clear the screen?
+
+If you only have do so infrequently, use C<system>:
+
+    system("clear");
+
+If you have to do this a lot, save the clear string
+so you can print it 100 times without calling a program
+100 times:
+
+    $clear_string = `clear`;
+    print $clear_string;
+
+If you're planning on doing other screen manipulations, like cursor
+positions, etc, you might wish to use Term::Cap module:
+
+    use Term::Cap;
+    $terminal = Term::Cap->Tgetent( {OSPEED => 9600} );
+    $clear_string = $terminal->Tputs('cl');
+
+=head2 How do I get the screen size?
+
+If you have Term::ReadKey module installed from CPAN,
+you can use it to fetch the width and height in characters
+and in pixels:
+
+    use Term::ReadKey;
+    ($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();
+
+This is more portable than the raw C<ioctl>, but not as
+illustrative:
+
+    require 'sys/ioctl.ph';
+    die "no TIOCGWINSZ " unless defined &TIOCGWINSZ;
+    open(TTY, "+</dev/tty")                     or die "No tty: $!";
+    unless (ioctl(TTY, &TIOCGWINSZ, $winsize='')) {
+        die sprintf "$0: ioctl TIOCGWINSZ (%08x: $!)\n", &TIOCGWINSZ;
+    }
+    ($row, $col, $xpixel, $ypixel) = unpack('S4', $winsize);
+    print "(row,col) = ($row,$col)";
+    print "  (xpixel,ypixel) = ($xpixel,$ypixel)" if $xpixel || $ypixel;
+    print "\n";
+
+=head2 How do I ask the user for a password?
+
+(This question has nothing to do with the web.  See a different
+FAQ for that.)
+
+There's an example of this in L<perlfunc/crypt>).  First, you put the
+terminal into "no echo" mode, then just read the password normally.
+You may do this with an old-style ioctl() function, POSIX terminal
+control (see L<POSIX> or its documentation the Camel Book), or a call
+to the B<stty> program, with varying degrees of portability.
+
+You can also do this for most systems using the Term::ReadKey module
+from CPAN, which is easier to use and in theory more portable.
+
+    use Term::ReadKey;
+
+    ReadMode('noecho');
+    $password = ReadLine(0);
+
+=head2 How do I read and write the serial port?
+
+This depends on which operating system your program is running on.  In
+the case of Unix, the serial ports will be accessible through files in
+/dev; on other systems, device names will doubtless differ.
+Several problem areas common to all device interaction are the
+following:
+
+=over 4
+
+=item lockfiles
+
+Your system may use lockfiles to control multiple access.  Make sure
+you follow the correct protocol.  Unpredictable behavior can result
+from multiple processes reading from one device.
+
+=item open mode
+
+If you expect to use both read and write operations on the device,
+you'll have to open it for update (see L<perlfunc/"open"> for
+details).  You may wish to open it without running the risk of
+blocking by using sysopen() and C<O_RDWR|O_NDELAY|O_NOCTTY> from the
+Fcntl module (part of the standard perl distribution).  See
+L<perlfunc/"sysopen"> for more on this approach.
+
+=item end of line
+
+Some devices will be expecting a "\r" at the end of each line rather
+than a "\n".  In some ports of perl, "\r" and "\n" are different from
+their usual (Unix) ASCII values of "\012" and "\015".  You may have to
+give the numeric values you want directly, using octal ("\015"), hex
+("0x0D"), or as a control-character specification ("\cM").
+
+    print DEV "atv1\012";	# wrong, for some devices
+    print DEV "atv1\015";	# right, for some devices
+
+Even though with normal text files a "\n" will do the trick, there is
+still no unified scheme for terminating a line that is portable
+between Unix, DOS/Win, and Macintosh, except to terminate I<ALL> line
+ends with "\015\012", and strip what you don't need from the output.
+This applies especially to socket I/O and autoflushing, discussed
+next.
+
+=item flushing output
+
+If you expect characters to get to your device when you print() them,
+you'll want to autoflush that filehandle.  You can use select()
+and the C<$|> variable to control autoflushing (see L<perlvar/$E<verbar>>
+and L<perlfunc/select>, or L<perlfaq5>, "How do I flush/unbuffer an
+output filehandle?  Why must I do this?"):
+
+    $oldh = select(DEV);
+    $| = 1;
+    select($oldh);
+
+You'll also see code that does this without a temporary variable, as in
+
+    select((select(DEV), $| = 1)[0]);
+
+Or if you don't mind pulling in a few thousand lines
+of code just because you're afraid of a little $| variable:
+
+    use IO::Handle;
+    DEV->autoflush(1);
+
+As mentioned in the previous item, this still doesn't work when using
+socket I/O between Unix and Macintosh.  You'll need to hard code your
+line terminators, in that case.
+
+=item non-blocking input
+
+If you are doing a blocking read() or sysread(), you'll have to
+arrange for an alarm handler to provide a timeout (see
+L<perlfunc/alarm>).  If you have a non-blocking open, you'll likely
+have a non-blocking read, which means you may have to use a 4-arg
+select() to determine whether I/O is ready on that device (see
+L<perlfunc/"select">.
+
+=back
+
+While trying to read from his caller-id box, the notorious Jamie Zawinski
+<jwz@netscape.com>, after much gnashing of teeth and fighting with sysread,
+sysopen, POSIX's tcgetattr business, and various other functions that
+go bump in the night, finally came up with this:
+
+    sub open_modem {
+	use IPC::Open2;
+	my $stty = `/bin/stty -g`;
+	open2( \*MODEM_IN, \*MODEM_OUT, "cu -l$modem_device -s2400 2>&1");
+	# starting cu hoses /dev/tty's stty settings, even when it has
+	# been opened on a pipe...
+	system("/bin/stty $stty");
+	$_ = <MODEM_IN>;
+	chomp;
+	if ( !m/^Connected/ ) {
+	    print STDERR "$0: cu printed `$_' instead of `Connected'\n";
+	}
+    }
+
+=head2 How do I decode encrypted password files?
+
+You spend lots and lots of money on dedicated hardware, but this is
+bound to get you talked about.
+
+Seriously, you can't if they are Unix password files--the Unix
+password system employs one-way encryption.  It's more like hashing than
+encryption.  The best you can check is whether something else hashes to
+the same string.  You can't turn a hash back into the original string.
+Programs like Crack
+can forcibly (and intelligently) try to guess passwords, but don't
+(can't) guarantee quick success.
+
+If you're worried about users selecting bad passwords, you should
+proactively check when they try to change their password (by modifying
+passwd(1), for example).
+
+=head2 How do I start a process in the background?
+
+Several modules can start other processes that do not block
+your Perl program.  You can use IPC::Open3, Parallel::Jobs,
+IPC::Run, and some of the POE modules.  See CPAN for more
+details.
+
+You could also use
+
+    system("cmd &")
+
+or you could use fork as documented in L<perlfunc/"fork">, with
+further examples in L<perlipc>.  Some things to be aware of, if you're
+on a Unix-like system:
+
+=over 4
+
+=item STDIN, STDOUT, and STDERR are shared
+
+Both the main process and the backgrounded one (the "child" process)
+share the same STDIN, STDOUT and STDERR filehandles.  If both try to
+access them at once, strange things can happen.  You may want to close
+or reopen these for the child.  You can get around this with
+C<open>ing a pipe (see L<perlfunc/"open">) but on some systems this
+means that the child process cannot outlive the parent.
+
+=item Signals
+
+You'll have to catch the SIGCHLD signal, and possibly SIGPIPE too.
+SIGCHLD is sent when the backgrounded process finishes.  SIGPIPE is
+sent when you write to a filehandle whose child process has closed (an
+untrapped SIGPIPE can cause your program to silently die).  This is
+not an issue with C<system("cmd&")>.
+
+=item Zombies
+
+You have to be prepared to "reap" the child process when it finishes.
+
+    $SIG{CHLD} = sub { wait };
+
+    $SIG{CHLD} = 'IGNORE';
+
+You can also use a double fork. You immediately wait() for your
+first child, and the init daemon will wait() for your grandchild once
+it exits.
+
+	unless ($pid = fork) {
+		unless (fork) {
+            exec "what you really wanna do";
+            die "exec failed!";
+        	}
+        exit 0;
+    	}
+    waitpid($pid,0);
+
+
+See L<perlipc/"Signals"> for other examples of code to do this.
+Zombies are not an issue with C<system("prog &")>.
+
+=back
+
+=head2 How do I trap control characters/signals?
+
+You don't actually "trap" a control character.  Instead, that character
+generates a signal which is sent to your terminal's currently
+foregrounded process group, which you then trap in your process.
+Signals are documented in L<perlipc/"Signals"> and the
+section on "Signals" in the Camel.
+
+You can set the values of the %SIG hash to be the functions you want
+to handle the signal.  After perl catches the signal, it looks in %SIG
+for a key with the same name as the signal, then calls the subroutine
+value for that key.
+
+	# as an anonymous subroutine
+
+	$SIG{INT} = sub { syswrite(STDERR, "ouch\n", 5 ) };
+
+	# or a reference to a function
+
+	$SIG{INT} = \&ouch;
+
+	# or the name of the function as a string
+
+	$SIG{INT} = "ouch";
+
+Perl versions before 5.8 had in its C source code signal handlers which
+would catch the signal and possibly run a Perl function that you had set
+in %SIG.  This violated the rules of signal handling at that level
+causing perl to dump core. Since version 5.8.0, perl looks at %SIG
+*after* the signal has been caught, rather than while it is being caught.
+Previous versions of this answer were incorrect.
+
+
+=head2 How do I modify the shadow password file on a Unix system?
+
+If perl was installed correctly and your shadow library was written
+properly, the getpw*() functions described in L<perlfunc> should in
+theory provide (read-only) access to entries in the shadow password
+file.  To change the file, make a new shadow password file (the format
+varies from system to system--see L<passwd> for specifics) and use
+pwd_mkdb(8) to install it (see L<pwd_mkdb> for more details).
+
+=head2 How do I set the time and date?
+
+Assuming you're running under sufficient permissions, you should be
+able to set the system-wide date and time by running the date(1)
+program.  (There is no way to set the time and date on a per-process
+basis.)  This mechanism will work for Unix, MS-DOS, Windows, and NT;
+the VMS equivalent is C<set time>.
+
+However, if all you want to do is change your time zone, you can
+probably get away with setting an environment variable:
+
+    $ENV{TZ} = "MST7MDT";		   # unixish
+    $ENV{'SYS$TIMEZONE_DIFFERENTIAL'}="-5" # vms
+    system "trn comp.lang.perl.misc";
+
+=head2 How can I sleep() or alarm() for under a second?
+
+If you want finer granularity than the 1 second that the sleep()
+function provides, the easiest way is to use the select() function as
+documented in L<perlfunc/"select">.  Try the Time::HiRes and
+the BSD::Itimer modules (available from CPAN, and starting from
+Perl 5.8 Time::HiRes is part of the standard distribution).
+
+=head2 How can I measure time under a second?
+
+In general, you may not be able to.  The Time::HiRes module (available
+from CPAN, and starting from Perl 5.8 part of the standard distribution)
+provides this functionality for some systems.
+
+If your system supports both the syscall() function in Perl as well as
+a system call like gettimeofday(2), then you may be able to do
+something like this:
+
+    require 'sys/syscall.ph';
+
+    $TIMEVAL_T = "LL";
+
+    $done = $start = pack($TIMEVAL_T, ());
+
+    syscall(&SYS_gettimeofday, $start, 0) != -1
+               or die "gettimeofday: $!";
+
+       ##########################
+       # DO YOUR OPERATION HERE #
+       ##########################
+
+    syscall( &SYS_gettimeofday, $done, 0) != -1
+           or die "gettimeofday: $!";
+
+    @start = unpack($TIMEVAL_T, $start);
+    @done  = unpack($TIMEVAL_T, $done);
+
+    # fix microseconds
+    for ($done[1], $start[1]) { $_ /= 1_000_000 }
+
+    $delta_time = sprintf "%.4f", ($done[0]  + $done[1]  )
+                                            -
+                                 ($start[0] + $start[1] );
+
+=head2 How can I do an atexit() or setjmp()/longjmp()? (Exception handling)
+
+Release 5 of Perl added the END block, which can be used to simulate
+atexit().  Each package's END block is called when the program or
+thread ends (see L<perlmod> manpage for more details).
+
+For example, you can use this to make sure your filter program
+managed to finish its output without filling up the disk:
+
+    END {
+	close(STDOUT) || die "stdout close failed: $!";
+    }
+
+The END block isn't called when untrapped signals kill the program,
+though, so if you use END blocks you should also use
+
+	use sigtrap qw(die normal-signals);
+
+Perl's exception-handling mechanism is its eval() operator.  You can
+use eval() as setjmp and die() as longjmp.  For details of this, see
+the section on signals, especially the time-out handler for a blocking
+flock() in L<perlipc/"Signals"> or the section on "Signals" in
+the Camel Book.
+
+If exception handling is all you're interested in, try the
+exceptions.pl library (part of the standard perl distribution).
+
+If you want the atexit() syntax (and an rmexit() as well), try the
+AtExit module available from CPAN.
+
+=head2 Why doesn't my sockets program work under System V (Solaris)?  What does the error message "Protocol not supported" mean?
+
+Some Sys-V based systems, notably Solaris 2.X, redefined some of the
+standard socket constants.  Since these were constant across all
+architectures, they were often hardwired into perl code.  The proper
+way to deal with this is to "use Socket" to get the correct values.
+
+Note that even though SunOS and Solaris are binary compatible, these
+values are different.  Go figure.
+
+=head2 How can I call my system's unique C functions from Perl?
+
+In most cases, you write an external module to do it--see the answer
+to "Where can I learn about linking C with Perl? [h2xs, xsubpp]".
+However, if the function is a system call, and your system supports
+syscall(), you can use the syscall function (documented in
+L<perlfunc>).
+
+Remember to check the modules that came with your distribution, and
+CPAN as well---someone may already have written a module to do it. On
+Windows, try Win32::API.  On Macs, try Mac::Carbon.  If no module
+has an interface to the C function, you can inline a bit of C in your
+Perl source with Inline::C.
+
+=head2 Where do I get the include files to do ioctl() or syscall()?
+
+Historically, these would be generated by the h2ph tool, part of the
+standard perl distribution.  This program converts cpp(1) directives
+in C header files to files containing subroutine definitions, like
+&SYS_getitimer, which you can use as arguments to your functions.
+It doesn't work perfectly, but it usually gets most of the job done.
+Simple files like F<errno.h>, F<syscall.h>, and F<socket.h> were fine,
+but the hard ones like F<ioctl.h> nearly always need to hand-edited.
+Here's how to install the *.ph files:
+
+    1.  become super-user
+    2.  cd /usr/include
+    3.  h2ph *.h */*.h
+
+If your system supports dynamic loading, for reasons of portability and
+sanity you probably ought to use h2xs (also part of the standard perl
+distribution).  This tool converts C header files to Perl extensions.
+See L<perlxstut> for how to get started with h2xs.
+
+If your system doesn't support dynamic loading, you still probably
+ought to use h2xs.  See L<perlxstut> and L<ExtUtils::MakeMaker> for
+more information (in brief, just use B<make perl> instead of a plain
+B<make> to rebuild perl with a new static extension).
+
+=head2 Why do setuid perl scripts complain about kernel problems?
+
+Some operating systems have bugs in the kernel that make setuid
+scripts inherently insecure.  Perl gives you a number of options
+(described in L<perlsec>) to work around such systems.
+
+=head2 How can I open a pipe both to and from a command?
+
+The IPC::Open2 module (part of the standard perl distribution) is an
+easy-to-use approach that internally uses pipe(), fork(), and exec() to do
+the job.  Make sure you read the deadlock warnings in its documentation,
+though (see L<IPC::Open2>).  See
+L<perlipc/"Bidirectional Communication with Another Process"> and
+L<perlipc/"Bidirectional Communication with Yourself">
+
+You may also use the IPC::Open3 module (part of the standard perl
+distribution), but be warned that it has a different order of
+arguments from IPC::Open2 (see L<IPC::Open3>).
+
+=head2 Why can't I get the output of a command with system()?
+
+You're confusing the purpose of system() and backticks (``).  system()
+runs a command and returns exit status information (as a 16 bit value:
+the low 7 bits are the signal the process died from, if any, and
+the high 8 bits are the actual exit value).  Backticks (``) run a
+command and return what it sent to STDOUT.
+
+    $exit_status   = system("mail-users");
+    $output_string = `ls`;
+
+=head2 How can I capture STDERR from an external command?
+
+There are three basic ways of running external commands:
+
+    system $cmd;		# using system()
+    $output = `$cmd`;		# using backticks (``)
+    open (PIPE, "cmd |");	# using open()
+
+With system(), both STDOUT and STDERR will go the same place as the
+script's STDOUT and STDERR, unless the system() command redirects them.
+Backticks and open() read B<only> the STDOUT of your command.
+
+You can also use the open3() function from IPC::Open3.  Benjamin
+Goldberg provides some sample code:
+
+To capture a program's STDOUT, but discard its STDERR:
+
+    use IPC::Open3;
+    use File::Spec;
+    use Symbol qw(gensym);
+    open(NULL, ">", File::Spec->devnull);
+    my $pid = open3(gensym, \*PH, ">&NULL", "cmd");
+    while( <PH> ) { }
+    waitpid($pid, 0);
+
+To capture a program's STDERR, but discard its STDOUT:
+
+    use IPC::Open3;
+    use File::Spec;
+    use Symbol qw(gensym);
+    open(NULL, ">", File::Spec->devnull);
+    my $pid = open3(gensym, ">&NULL", \*PH, "cmd");
+    while( <PH> ) { }
+    waitpid($pid, 0);
+
+To capture a program's STDERR, and let its STDOUT go to our own STDERR:
+
+    use IPC::Open3;
+    use Symbol qw(gensym);
+    my $pid = open3(gensym, ">&STDERR", \*PH, "cmd");
+    while( <PH> ) { }
+    waitpid($pid, 0);
+
+To read both a command's STDOUT and its STDERR separately, you can
+redirect them to temp files, let the command run, then read the temp
+files:
+
+    use IPC::Open3;
+    use Symbol qw(gensym);
+    use IO::File;
+    local *CATCHOUT = IO::File->new_tmpfile;
+    local *CATCHERR = IO::File->new_tmpfile;
+    my $pid = open3(gensym, ">&CATCHOUT", ">&CATCHERR", "cmd");
+    waitpid($pid, 0);
+    seek $_, 0, 0 for \*CATCHOUT, \*CATCHERR;
+    while( <CATCHOUT> ) {}
+    while( <CATCHERR> ) {}
+
+But there's no real need for *both* to be tempfiles... the following
+should work just as well, without deadlocking:
+
+    use IPC::Open3;
+    use Symbol qw(gensym);
+    use IO::File;
+    local *CATCHERR = IO::File->new_tmpfile;
+    my $pid = open3(gensym, \*CATCHOUT, ">&CATCHERR", "cmd");
+    while( <CATCHOUT> ) {}
+    waitpid($pid, 0);
+    seek CATCHERR, 0, 0;
+    while( <CATCHERR> ) {}
+
+And it'll be faster, too, since we can begin processing the program's
+stdout immediately, rather than waiting for the program to finish.
+
+With any of these, you can change file descriptors before the call:
+
+    open(STDOUT, ">logfile");
+    system("ls");
+
+or you can use Bourne shell file-descriptor redirection:
+
+    $output = `$cmd 2>some_file`;
+    open (PIPE, "cmd 2>some_file |");
+
+You can also use file-descriptor redirection to make STDERR a
+duplicate of STDOUT:
+
+    $output = `$cmd 2>&1`;
+    open (PIPE, "cmd 2>&1 |");
+
+Note that you I<cannot> simply open STDERR to be a dup of STDOUT
+in your Perl program and avoid calling the shell to do the redirection.
+This doesn't work:
+
+    open(STDERR, ">&STDOUT");
+    $alloutput = `cmd args`;  # stderr still escapes
+
+This fails because the open() makes STDERR go to where STDOUT was
+going at the time of the open().  The backticks then make STDOUT go to
+a string, but don't change STDERR (which still goes to the old
+STDOUT).
+
+Note that you I<must> use Bourne shell (sh(1)) redirection syntax in
+backticks, not csh(1)!  Details on why Perl's system() and backtick
+and pipe opens all use the Bourne shell are in the
+F<versus/csh.whynot> article in the "Far More Than You Ever Wanted To
+Know" collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz .  To
+capture a command's STDERR and STDOUT together:
+
+    $output = `cmd 2>&1`;                       # either with backticks
+    $pid = open(PH, "cmd 2>&1 |");              # or with an open pipe
+    while (<PH>) { }                            #    plus a read
+
+To capture a command's STDOUT but discard its STDERR:
+
+    $output = `cmd 2>/dev/null`;                # either with backticks
+    $pid = open(PH, "cmd 2>/dev/null |");       # or with an open pipe
+    while (<PH>) { }                            #    plus a read
+
+To capture a command's STDERR but discard its STDOUT:
+
+    $output = `cmd 2>&1 1>/dev/null`;           # either with backticks
+    $pid = open(PH, "cmd 2>&1 1>/dev/null |");  # or with an open pipe
+    while (<PH>) { }                            #    plus a read
+
+To exchange a command's STDOUT and STDERR in order to capture the STDERR
+but leave its STDOUT to come out our old STDERR:
+
+    $output = `cmd 3>&1 1>&2 2>&3 3>&-`;        # either with backticks
+    $pid = open(PH, "cmd 3>&1 1>&2 2>&3 3>&-|");# or with an open pipe
+    while (<PH>) { }                            #    plus a read
+
+To read both a command's STDOUT and its STDERR separately, it's easiest
+to redirect them separately to files, and then read from those files
+when the program is done:
+
+    system("program args 1>program.stdout 2>program.stderr");
+
+Ordering is important in all these examples.  That's because the shell
+processes file descriptor redirections in strictly left to right order.
+
+    system("prog args 1>tmpfile 2>&1");
+    system("prog args 2>&1 1>tmpfile");
+
+The first command sends both standard out and standard error to the
+temporary file.  The second command sends only the old standard output
+there, and the old standard error shows up on the old standard out.
+
+=head2 Why doesn't open() return an error when a pipe open fails?
+
+If the second argument to a piped open() contains shell
+metacharacters, perl fork()s, then exec()s a shell to decode the
+metacharacters and eventually run the desired program.  If the program
+couldn't be run, it's the shell that gets the message, not Perl. All
+your Perl program can find out is whether the shell itself could be
+successfully started.  You can still capture the shell's STDERR and
+check it for error messages.  See L<"How can I capture STDERR from an
+external command?"> elsewhere in this document, or use the
+IPC::Open3 module.
+
+If there are no shell metacharacters in the argument of open(), Perl
+runs the command directly, without using the shell, and can correctly
+report whether the command started.
+
+=head2 What's wrong with using backticks in a void context?
+
+Strictly speaking, nothing.  Stylistically speaking, it's not a good
+way to write maintainable code.  Perl has several operators for
+running external commands.  Backticks are one; they collect the output
+from the command for use in your program.  The C<system> function is
+another; it doesn't do this.
+
+Writing backticks in your program sends a clear message to the readers
+of your code that you wanted to collect the output of the command.
+Why send a clear message that isn't true?
+
+Consider this line:
+
+    `cat /etc/termcap`;
+
+You forgot to check C<$?> to see whether the program even ran
+correctly.  Even if you wrote
+
+    print `cat /etc/termcap`;
+
+this code could and probably should be written as
+
+    system("cat /etc/termcap") == 0
+	or die "cat program failed!";
+
+which will get the output quickly (as it is generated, instead of only
+at the end) and also check the return value.
+
+system() also provides direct control over whether shell wildcard
+processing may take place, whereas backticks do not.
+
+=head2 How can I call backticks without shell processing?
+
+This is a bit tricky.  You can't simply write the command
+like this:
+
+    @ok = `grep @opts '$search_string' @filenames`;
+
+As of Perl 5.8.0, you can use open() with multiple arguments.
+Just like the list forms of system() and exec(), no shell
+escapes happen.
+
+   open( GREP, "-|", 'grep', @opts, $search_string, @filenames );
+   chomp(@ok = <GREP>);
+   close GREP;
+
+You can also:
+
+    my @ok = ();
+    if (open(GREP, "-|")) {
+        while (<GREP>) {
+	    chomp;
+            push(@ok, $_);
+        }
+	close GREP;
+    } else {
+        exec 'grep', @opts, $search_string, @filenames;
+    }
+
+Just as with system(), no shell escapes happen when you exec() a list.
+Further examples of this can be found in L<perlipc/"Safe Pipe Opens">.
+
+Note that if you're use Microsoft, no solution to this vexing issue
+is even possible.  Even if Perl were to emulate fork(), you'd still
+be stuck, because Microsoft does not have a argc/argv-style API.
+
+=head2 Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)?
+
+Some stdio's set error and eof flags that need clearing.  The
+POSIX module defines clearerr() that you can use.  That is the
+technically correct way to do it.  Here are some less reliable
+workarounds:
+
+=over 4
+
+=item 1
+
+Try keeping around the seekpointer and go there, like this:
+
+    $where = tell(LOG);
+    seek(LOG, $where, 0);
+
+=item 2
+
+If that doesn't work, try seeking to a different part of the file and
+then back.
+
+=item 3
+
+If that doesn't work, try seeking to a different part of
+the file, reading something, and then seeking back.
+
+=item 4
+
+If that doesn't work, give up on your stdio package and use sysread.
+
+=back
+
+=head2 How can I convert my shell script to perl?
+
+Learn Perl and rewrite it.  Seriously, there's no simple converter.
+Things that are awkward to do in the shell are easy to do in Perl, and
+this very awkwardness is what would make a shell->perl converter
+nigh-on impossible to write.  By rewriting it, you'll think about what
+you're really trying to do, and hopefully will escape the shell's
+pipeline datastream paradigm, which while convenient for some matters,
+causes many inefficiencies.
+
+=head2 Can I use perl to run a telnet or ftp session?
+
+Try the Net::FTP, TCP::Client, and Net::Telnet modules (available from
+CPAN).  http://www.cpan.org/scripts/netstuff/telnet.emul.shar
+will also help for emulating the telnet protocol, but Net::Telnet is
+quite probably easier to use..
+
+If all you want to do is pretend to be telnet but don't need
+the initial telnet handshaking, then the standard dual-process
+approach will suffice:
+
+    use IO::Socket; 	    	# new in 5.004
+    $handle = IO::Socket::INET->new('www.perl.com:80')
+	    || die "can't connect to port 80 on www.perl.com: $!";
+    $handle->autoflush(1);
+    if (fork()) { 	    	# XXX: undef means failure
+	select($handle);
+	print while <STDIN>;    # everything from stdin to socket
+    } else {
+	print while <$handle>;  # everything from socket to stdout
+    }
+    close $handle;
+    exit;
+
+=head2 How can I write expect in Perl?
+
+Once upon a time, there was a library called chat2.pl (part of the
+standard perl distribution), which never really got finished.  If you
+find it somewhere, I<don't use it>.  These days, your best bet is to
+look at the Expect module available from CPAN, which also requires two
+other modules from CPAN, IO::Pty and IO::Stty.
+
+=head2 Is there a way to hide perl's command line from programs such as "ps"?
+
+First of all note that if you're doing this for security reasons (to
+avoid people seeing passwords, for example) then you should rewrite
+your program so that critical information is never given as an
+argument.  Hiding the arguments won't make your program completely
+secure.
+
+To actually alter the visible command line, you can assign to the
+variable $0 as documented in L<perlvar>.  This won't work on all
+operating systems, though.  Daemon programs like sendmail place their
+state there, as in:
+
+    $0 = "orcus [accepting connections]";
+
+=head2 I {changed directory, modified my environment} in a perl script.  How come the change disappeared when I exited the script?  How do I get my changes to be visible?
+
+=over 4
+
+=item Unix
+
+In the strictest sense, it can't be done--the script executes as a
+different process from the shell it was started from.  Changes to a
+process are not reflected in its parent--only in any children
+created after the change.  There is shell magic that may allow you to
+fake it by eval()ing the script's output in your shell; check out the
+comp.unix.questions FAQ for details.
+
+=back
+
+=head2 How do I close a process's filehandle without waiting for it to complete?
+
+Assuming your system supports such things, just send an appropriate signal
+to the process (see L<perlfunc/"kill">).  It's common to first send a TERM
+signal, wait a little bit, and then send a KILL signal to finish it off.
+
+=head2 How do I fork a daemon process?
+
+If by daemon process you mean one that's detached (disassociated from
+its tty), then the following process is reported to work on most
+Unixish systems.  Non-Unix users should check their Your_OS::Process
+module for other solutions.
+
+=over 4
+
+=item *
+
+Open /dev/tty and use the TIOCNOTTY ioctl on it.  See L<tty>
+for details.  Or better yet, you can just use the POSIX::setsid()
+function, so you don't have to worry about process groups.
+
+=item *
+
+Change directory to /
+
+=item *
+
+Reopen STDIN, STDOUT, and STDERR so they're not connected to the old
+tty.
+
+=item *
+
+Background yourself like this:
+
+    fork && exit;
+
+=back
+
+The Proc::Daemon module, available from CPAN, provides a function to
+perform these actions for you.
+
+=head2 How do I find out if I'm running interactively or not?
+
+Good question.  Sometimes C<-t STDIN> and C<-t STDOUT> can give clues,
+sometimes not.
+
+    if (-t STDIN && -t STDOUT) {
+	print "Now what? ";
+    }
+
+On POSIX systems, you can test whether your own process group matches
+the current process group of your controlling terminal as follows:
+
+    use POSIX qw/getpgrp tcgetpgrp/;
+    open(TTY, "/dev/tty") or die $!;
+    $tpgrp = tcgetpgrp(fileno(*TTY));
+    $pgrp = getpgrp();
+    if ($tpgrp == $pgrp) {
+        print "foreground\n";
+    } else {
+        print "background\n";
+    }
+
+=head2 How do I timeout a slow event?
+
+Use the alarm() function, probably in conjunction with a signal
+handler, as documented in L<perlipc/"Signals"> and the section on
+"Signals" in the Camel.  You may instead use the more flexible
+Sys::AlarmCall module available from CPAN.
+
+The alarm() function is not implemented on all versions of Windows.
+Check the documentation for your specific version of Perl.
+
+=head2 How do I set CPU limits?
+
+Use the BSD::Resource module from CPAN.
+
+=head2 How do I avoid zombies on a Unix system?
+
+Use the reaper code from L<perlipc/"Signals"> to call wait() when a
+SIGCHLD is received, or else use the double-fork technique described
+in L<perlfaq8/"How do I start a process in the background?">.
+
+=head2 How do I use an SQL database?
+
+The DBI module provides an abstract interface to most database
+servers and types, including Oracle, DB2, Sybase, mysql, Postgresql,
+ODBC, and flat files.  The DBI module accesses each database type
+through a database driver, or DBD.  You can see a complete list of
+available drivers on CPAN: http://www.cpan.org/modules/by-module/DBD/ .
+You can read more about DBI on http://dbi.perl.org .
+
+Other modules provide more specific access: Win32::ODBC, Alzabo, iodbc,
+and others found on CPAN Search: http://search.cpan.org .
+
+=head2 How do I make a system() exit on control-C?
+
+You can't.  You need to imitate the system() call (see L<perlipc> for
+sample code) and then have a signal handler for the INT signal that
+passes the signal on to the subprocess.  Or you can check for it:
+
+    $rc = system($cmd);
+    if ($rc & 127) { die "signal death" }
+
+=head2 How do I open a file without blocking?
+
+If you're lucky enough to be using a system that supports
+non-blocking reads (most Unixish systems do), you need only to use the
+O_NDELAY or O_NONBLOCK flag from the Fcntl module in conjunction with
+sysopen():
+
+    use Fcntl;
+    sysopen(FH, "/foo/somefile", O_WRONLY|O_NDELAY|O_CREAT, 0644)
+        or die "can't open /foo/somefile: $!":
+
+=head2 How do I tell the difference between errors from the shell and perl?
+
+(answer contributed by brian d foy, C<< <bdfoy@cpan.org> >>
+
+When you run a Perl script, something else is running the script for you,
+and that something else may output error messages.  The script might
+emit its own warnings and error messages.  Most of the time you cannot
+tell who said what.
+
+You probably cannot fix the thing that runs perl, but you can change how
+perl outputs its warnings by defining a custom warning and die functions.
+
+Consider this script, which has an error you may not notice immediately.
+
+	#!/usr/locl/bin/perl
+
+	print "Hello World\n";
+
+I get an error when I run this from my shell (which happens to be
+bash).  That may look like perl forgot it has a print() function,
+but my shebang line is not the path to perl, so the shell runs the
+script, and I get the error.
+
+	$ ./test
+	./test: line 3: print: command not found
+
+A quick and dirty fix involves a little bit of code, but this may be all
+you need to figure out the problem.
+
+	#!/usr/bin/perl -w
+
+	BEGIN {
+	$SIG{__WARN__} = sub{ print STDERR "Perl: ", @_; };
+	$SIG{__DIE__}  = sub{ print STDERR "Perl: ", @_; exit 1};
+	}
+
+	$a = 1 + undef;
+	$x / 0;
+	__END__
+
+The perl message comes out with "Perl" in front.  The BEGIN block
+works at compile time so all of the compilation errors and warnings
+get the "Perl:" prefix too.
+
+	Perl: Useless use of division (/) in void context at ./test line 9.
+	Perl: Name "main::a" used only once: possible typo at ./test line 8.
+	Perl: Name "main::x" used only once: possible typo at ./test line 9.
+	Perl: Use of uninitialized value in addition (+) at ./test line 8.
+	Perl: Use of uninitialized value in division (/) at ./test line 9.
+	Perl: Illegal division by zero at ./test line 9.
+	Perl: Illegal division by zero at -e line 3.
+
+If I don't see that "Perl:", it's not from perl.
+
+You could also just know all the perl errors, and although there are
+some people who may know all of them, you probably don't.  However, they
+all should be in the perldiag manpage. If you don't find the error in
+there, it probably isn't a perl error.
+
+Looking up every message is not the easiest way, so let perl to do it
+for you.  Use the diagnostics pragma with turns perl's normal messages
+into longer discussions on the topic.
+
+	use diagnostics;
+
+If you don't get a paragraph or two of expanded discussion, it
+might not be perl's message.
+
+=head2 How do I install a module from CPAN?
+
+The easiest way is to have a module also named CPAN do it for you.
+This module comes with perl version 5.004 and later.
+
+    $ perl -MCPAN -e shell
+
+    cpan shell -- CPAN exploration and modules installation (v1.59_54)
+    ReadLine support enabled
+
+    cpan> install Some::Module
+
+To manually install the CPAN module, or any well-behaved CPAN module
+for that matter, follow these steps:
+
+=over 4
+
+=item 1
+
+Unpack the source into a temporary area.
+
+=item 2
+
+    perl Makefile.PL
+
+=item 3
+
+    make
+
+=item 4
+
+    make test
+
+=item 5
+
+    make install
+
+=back
+
+If your version of perl is compiled without dynamic loading, then you
+just need to replace step 3 (B<make>) with B<make perl> and you will
+get a new F<perl> binary with your extension linked in.
+
+See L<ExtUtils::MakeMaker> for more details on building extensions.
+See also the next question, "What's the difference between require
+and use?".
+
+=head2 What's the difference between require and use?
+
+Perl offers several different ways to include code from one file into
+another.  Here are the deltas between the various inclusion constructs:
+
+    1)  do $file is like eval `cat $file`, except the former
+	1.1: searches @INC and updates %INC.
+	1.2: bequeaths an *unrelated* lexical scope on the eval'ed code.
+
+    2)  require $file is like do $file, except the former
+	2.1: checks for redundant loading, skipping already loaded files.
+	2.2: raises an exception on failure to find, compile, or execute $file.
+
+    3)  require Module is like require "Module.pm", except the former
+	3.1: translates each "::" into your system's directory separator.
+	3.2: primes the parser to disambiguate class Module as an indirect object.
+
+    4)  use Module is like require Module, except the former
+	4.1: loads the module at compile time, not run-time.
+	4.2: imports symbols and semantics from that package to the current one.
+
+In general, you usually want C<use> and a proper Perl module.
+
+=head2 How do I keep my own module/library directory?
+
+When you build modules, use the PREFIX and LIB options when generating
+Makefiles:
+
+    perl Makefile.PL PREFIX=/mydir/perl LIB=/mydir/perl/lib
+
+then either set the PERL5LIB environment variable before you run
+scripts that use the modules/libraries (see L<perlrun>) or say
+
+    use lib '/mydir/perl/lib';
+
+This is almost the same as
+
+    BEGIN {
+	unshift(@INC, '/mydir/perl/lib');
+    }
+
+except that the lib module checks for machine-dependent subdirectories.
+See Perl's L<lib> for more information.
+
+=head2 How do I add the directory my program lives in to the module/library search path?
+
+    use FindBin;
+    use lib "$FindBin::Bin";
+    use your_own_modules;
+
+=head2 How do I add a directory to my include path (@INC) at runtime?
+
+Here are the suggested ways of modifying your include path:
+
+    the PERLLIB environment variable
+    the PERL5LIB environment variable
+    the perl -Idir command line flag
+    the use lib pragma, as in
+        use lib "$ENV{HOME}/myown_perllib";
+
+The latter is particularly useful because it knows about machine
+dependent architectures.  The lib.pm pragmatic module was first
+included with the 5.002 release of Perl.
+
+=head2 What is socket.ph and where do I get it?
+
+It's a perl4-style file defining values for system networking
+constants.  Sometimes it is built using h2ph when Perl is installed,
+but other times it is not.  Modern programs C<use Socket;> instead.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2006 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain.  You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit.  A simple comment in the code giving
+credit would be courteous but is not required.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq9.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq9.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq9.pod	(revision 14489)
@@ -0,0 +1,662 @@
+=head1 NAME
+
+perlfaq9 - Networking ($Revision: 1.28 $, $Date: 2005/12/31 00:54:37 $)
+
+=head1 DESCRIPTION
+
+This section deals with questions related to networking, the internet,
+and a few on the web.
+
+=head2 What is the correct form of response from a CGI script?
+
+(Alan Flavell <flavell+www@a5.ph.gla.ac.uk> answers...)
+
+The Common Gateway Interface (CGI) specifies a software interface between
+a program ("CGI script") and a web server (HTTPD). It is not specific
+to Perl, and has its own FAQs and tutorials, and usenet group,
+comp.infosystems.www.authoring.cgi
+
+The CGI specification is outlined in an informational RFC:
+http://www.ietf.org/rfc/rfc3875
+
+Other relevant documentation listed in: http://www.perl.org/CGI_MetaFAQ.html
+
+These Perl FAQs very selectively cover some CGI issues. However, Perl
+programmers are strongly advised to use the CGI.pm module, to take care
+of the details for them.
+
+The similarity between CGI response headers (defined in the CGI
+specification) and HTTP response headers (defined in the HTTP
+specification, RFC2616) is intentional, but can sometimes be confusing.
+
+The CGI specification defines two kinds of script: the "Parsed Header"
+script, and the "Non Parsed Header" (NPH) script. Check your server
+documentation to see what it supports. "Parsed Header" scripts are
+simpler in various respects. The CGI specification allows any of the
+usual newline representations in the CGI response (it's the server's
+job to create an accurate HTTP response based on it). So "\n" written in
+text mode is technically correct, and recommended. NPH scripts are more
+tricky: they must put out a complete and accurate set of HTTP
+transaction response headers; the HTTP specification calls for records
+to be terminated with carriage-return and line-feed, i.e ASCII \015\012
+written in binary mode.
+
+Using CGI.pm gives excellent platform independence, including EBCDIC
+systems. CGI.pm selects an appropriate newline representation
+($CGI::CRLF) and sets binmode as appropriate.
+
+=head2 My CGI script runs from the command line but not the browser.  (500 Server Error)
+
+Several things could be wrong.  You can go through the "Troubleshooting
+Perl CGI scripts" guide at
+
+	http://www.perl.org/troubleshooting_CGI.html
+
+If, after that, you can demonstrate that you've read the FAQs and that
+your problem isn't something simple that can be easily answered, you'll
+probably receive a courteous and useful reply to your question if you
+post it on comp.infosystems.www.authoring.cgi (if it's something to do
+with HTTP or the CGI protocols).  Questions that appear to be Perl
+questions but are really CGI ones that are posted to comp.lang.perl.misc
+are not so well received.
+
+The useful FAQs, related documents, and troubleshooting guides are
+listed in the CGI Meta FAQ:
+
+	http://www.perl.org/CGI_MetaFAQ.html
+
+
+=head2 How can I get better error messages from a CGI program?
+
+Use the CGI::Carp module.  It replaces C<warn> and C<die>, plus the
+normal Carp modules C<carp>, C<croak>, and C<confess> functions with
+more verbose and safer versions.  It still sends them to the normal
+server error log.
+
+    use CGI::Carp;
+    warn "This is a complaint";
+    die "But this one is serious";
+
+The following use of CGI::Carp also redirects errors to a file of your choice,
+placed in a BEGIN block to catch compile-time warnings as well:
+
+    BEGIN {
+        use CGI::Carp qw(carpout);
+        open(LOG, ">>/var/local/cgi-logs/mycgi-log")
+            or die "Unable to append to mycgi-log: $!\n";
+        carpout(*LOG);
+    }
+
+You can even arrange for fatal errors to go back to the client browser,
+which is nice for your own debugging, but might confuse the end user.
+
+    use CGI::Carp qw(fatalsToBrowser);
+    die "Bad error here";
+
+Even if the error happens before you get the HTTP header out, the module
+will try to take care of this to avoid the dreaded server 500 errors.
+Normal warnings still go out to the server error log (or wherever
+you've sent them with C<carpout>) with the application name and date
+stamp prepended.
+
+=head2 How do I remove HTML from a string?
+
+The most correct way (albeit not the fastest) is to use HTML::Parser
+from CPAN.  Another mostly correct
+way is to use HTML::FormatText which not only removes HTML but also
+attempts to do a little simple formatting of the resulting plain text.
+
+Many folks attempt a simple-minded regular expression approach, like
+C<< s/<.*?>//g >>, but that fails in many cases because the tags
+may continue over line breaks, they may contain quoted angle-brackets,
+or HTML comment may be present.  Plus, folks forget to convert
+entities--like C<&lt;> for example.
+
+Here's one "simple-minded" approach, that works for most files:
+
+    #!/usr/bin/perl -p0777
+    s/<(?:[^>'"]*|(['"]).*?\1)*>//gs
+
+If you want a more complete solution, see the 3-stage striphtml
+program in
+http://www.cpan.org/authors/Tom_Christiansen/scripts/striphtml.gz
+.
+
+Here are some tricky cases that you should think about when picking
+a solution:
+
+    <IMG SRC = "foo.gif" ALT = "A > B">
+
+    <IMG SRC = "foo.gif"
+	 ALT = "A > B">
+
+    <!-- <A comment> -->
+
+    <script>if (a<b && a>c)</script>
+
+    <# Just data #>
+
+    <![INCLUDE CDATA [ >>>>>>>>>>>> ]]>
+
+If HTML comments include other tags, those solutions would also break
+on text like this:
+
+    <!-- This section commented out.
+        <B>You can't see me!</B>
+    -->
+
+=head2 How do I extract URLs?
+
+You can easily extract all sorts of URLs from HTML with
+C<HTML::SimpleLinkExtor> which handles anchors, images, objects,
+frames, and many other tags that can contain a URL.  If you need
+anything more complex, you can create your own subclass of
+C<HTML::LinkExtor> or C<HTML::Parser>.  You might even use
+C<HTML::SimpleLinkExtor> as an example for something specifically
+suited to your needs.
+
+You can use URI::Find to extract URLs from an arbitrary text document.
+
+Less complete solutions involving regular expressions can save
+you a lot of processing time if you know that the input is simple.  One
+solution from Tom Christiansen runs 100 times faster than most
+module based approaches but only extracts URLs from anchors where the first
+attribute is HREF and there are no other attributes.
+
+        #!/usr/bin/perl -n00
+        # qxurl - tchrist@perl.com
+        print "$2\n" while m{
+            < \s*
+              A \s+ HREF \s* = \s* (["']) (.*?) \1
+            \s* >
+        }gsix;
+
+
+=head2 How do I download a file from the user's machine?  How do I open a file on another machine?
+
+In this case, download means to use the file upload feature of HTML
+forms.  You allow the web surfer to specify a file to send to your web
+server.  To you it looks like a download, and to the user it looks
+like an upload.  No matter what you call it, you do it with what's
+known as B<multipart/form-data> encoding.  The CGI.pm module (which
+comes with Perl as part of the Standard Library) supports this in the
+start_multipart_form() method, which isn't the same as the startform()
+method.
+
+See the section in the CGI.pm documentation on file uploads for code
+examples and details.
+
+=head2 How do I make a pop-up menu in HTML?
+
+Use the B<< <SELECT> >> and B<< <OPTION> >> tags.  The CGI.pm
+module (available from CPAN) supports this widget, as well as many
+others, including some that it cleverly synthesizes on its own.
+
+=head2 How do I fetch an HTML file?
+
+One approach, if you have the lynx text-based HTML browser installed
+on your system, is this:
+
+    $html_code = `lynx -source $url`;
+    $text_data = `lynx -dump $url`;
+
+The libwww-perl (LWP) modules from CPAN provide a more powerful way
+to do this.  They don't require lynx, but like lynx, can still work
+through proxies:
+
+    # simplest version
+    use LWP::Simple;
+    $content = get($URL);
+
+    # or print HTML from a URL
+    use LWP::Simple;
+    getprint "http://www.linpro.no/lwp/";
+
+    # or print ASCII from HTML from a URL
+    # also need HTML-Tree package from CPAN
+    use LWP::Simple;
+    use HTML::Parser;
+    use HTML::FormatText;
+    my ($html, $ascii);
+    $html = get("http://www.perl.com/");
+    defined $html
+        or die "Can't fetch HTML from http://www.perl.com/";
+    $ascii = HTML::FormatText->new->format(parse_html($html));
+    print $ascii;
+
+=head2 How do I automate an HTML form submission?
+
+If you are doing something complex, such as moving through many pages
+and forms or a web site, you can use C<WWW::Mechanize>.  See its
+documentation for all the details.
+
+If you're submitting values using the GET method, create a URL and encode
+the form using the C<query_form> method:
+
+    use LWP::Simple;
+    use URI::URL;
+
+    my $url = url('http://www.perl.com/cgi-bin/cpan_mod');
+    $url->query_form(module => 'DB_File', readme => 1);
+    $content = get($url);
+
+If you're using the POST method, create your own user agent and encode
+the content appropriately.
+
+    use HTTP::Request::Common qw(POST);
+    use LWP::UserAgent;
+
+    $ua = LWP::UserAgent->new();
+    my $req = POST 'http://www.perl.com/cgi-bin/cpan_mod',
+                   [ module => 'DB_File', readme => 1 ];
+    $content = $ua->request($req)->as_string;
+
+=head2 How do I decode or create those %-encodings on the web?
+
+If you are writing a CGI script, you should be using the CGI.pm module
+that comes with perl, or some other equivalent module.  The CGI module
+automatically decodes queries for you, and provides an escape()
+function to handle encoding.
+
+The best source of detailed information on URI encoding is RFC 2396.
+Basically, the following substitutions do it:
+
+    s/([^\w()'*~!.-])/sprintf '%%%02x', ord $1/eg;   # encode
+
+    s/%([A-Fa-f\d]{2})/chr hex $1/eg;                # decode
+	s/%([[:xdigit:]]{2})/chr hex $1/eg;          # same thing
+
+However, you should only apply them to individual URI components, not
+the entire URI, otherwise you'll lose information and generally mess
+things up.  If that didn't explain it, don't worry.  Just go read
+section 2 of the RFC, it's probably the best explanation there is.
+
+RFC 2396 also contains a lot of other useful information, including a
+regexp for breaking any arbitrary URI into components (Appendix B).
+
+=head2 How do I redirect to another page?
+
+Specify the complete URL of the destination (even if it is on the same
+server). This is one of the two different kinds of CGI "Location:"
+responses which are defined in the CGI specification for a Parsed Headers
+script. The other kind (an absolute URLpath) is resolved internally to
+the server without any HTTP redirection. The CGI specifications do not
+allow relative URLs in either case.
+
+Use of CGI.pm is strongly recommended.  This example shows redirection
+with a complete URL. This redirection is handled by the web browser.
+
+      use CGI qw/:standard/;
+
+      my $url = 'http://www.cpan.org/';
+      print redirect($url);
+
+
+This example shows a redirection with an absolute URLpath.  This
+redirection is handled by the local web server.
+
+      my $url = '/CPAN/index.html';
+      print redirect($url);
+
+
+But if coded directly, it could be as follows (the final "\n" is
+shown separately, for clarity), using either a complete URL or
+an absolute URLpath.
+
+      print "Location: $url\n";   # CGI response header
+      print "\n";                 # end of headers
+
+
+=head2 How do I put a password on my web pages?
+
+To enable authentication for your web server, you need to configure
+your web server.  The configuration is different for different sorts
+of web servers---apache does it differently from iPlanet which does
+it differently from IIS.  Check your web server documentation for
+the details for your particular server.
+
+=head2 How do I edit my .htpasswd and .htgroup files with Perl?
+
+The HTTPD::UserAdmin and HTTPD::GroupAdmin modules provide a
+consistent OO interface to these files, regardless of how they're
+stored.  Databases may be text, dbm, Berkeley DB or any database with
+a DBI compatible driver.  HTTPD::UserAdmin supports files used by the
+"Basic" and "Digest" authentication schemes.  Here's an example:
+
+    use HTTPD::UserAdmin ();
+    HTTPD::UserAdmin
+	  ->new(DB => "/foo/.htpasswd")
+	  ->add($username => $password);
+
+=head2 How do I make sure users can't enter values into a form that cause my CGI script to do bad things?
+
+See the security references listed in the CGI Meta FAQ
+
+	http://www.perl.org/CGI_MetaFAQ.html
+
+=head2 How do I parse a mail header?
+
+For a quick-and-dirty solution, try this solution derived
+from L<perlfunc/split>:
+
+    $/ = '';
+    $header = <MSG>;
+    $header =~ s/\n\s+/ /g;	 # merge continuation lines
+    %head = ( UNIX_FROM_LINE, split /^([-\w]+):\s*/m, $header );
+
+That solution doesn't do well if, for example, you're trying to
+maintain all the Received lines.  A more complete approach is to use
+the Mail::Header module from CPAN (part of the MailTools package).
+
+=head2 How do I decode a CGI form?
+
+(contributed by brian d foy)
+
+Use the CGI.pm module that comes with Perl.  It's quick,
+it's easy, and it actually does quite a bit of work to
+ensure things happen correctly.  It handles GET, POST, and
+HEAD requests, multipart forms, multivalued fields, query
+string and message body combinations, and many other things
+you probably don't want to think about.
+
+It doesn't get much easier: the CGI module automatically
+parses the input and makes each value available through the
+C<param()> function.
+
+	use CGI qw(:standard);
+
+	my $total = param( 'price' ) + param( 'shipping' );
+
+	my @items = param( 'item' ); # multiple values, same field name
+
+If you want an object-oriented approach, CGI.pm can do that too.
+
+	use CGI;
+
+	my $cgi = CGI->new();
+
+	my $total = $cgi->param( 'price' ) + $cgi->param( 'shipping' );
+
+	my @items = $cgi->param( 'item' );
+
+You might also try CGI::Minimal which is a lightweight version
+of the same thing.  Other CGI::* modules on CPAN might work better
+for you, too.
+
+Many people try to write their own decoder (or copy one from
+another program) and then run into one of the many "gotchas"
+of the task.  It's much easier and less hassle to use CGI.pm.
+
+=head2 How do I check a valid mail address?
+
+You can't, at least, not in real time.  Bummer, eh?
+
+Without sending mail to the address and seeing whether there's a human
+on the other end to answer you, you cannot determine whether a mail
+address is valid.  Even if you apply the mail header standard, you
+can have problems, because there are deliverable addresses that aren't
+RFC-822 (the mail header standard) compliant, and addresses that aren't
+deliverable which are compliant.
+
+You can use the Email::Valid or RFC::RFC822::Address which check
+the format of the address, although they cannot actually tell you
+if it is a deliverable address (i.e. that mail to the address
+will not bounce).  Modules like Mail::CheckUser and Mail::EXPN
+try to interact with the domain name system or particular
+mail servers to learn even more, but their methods do not
+work everywhere---especially for security conscious administrators.
+
+Many are tempted to try to eliminate many frequently-invalid
+mail addresses with a simple regex, such as
+C</^[\w.-]+\@(?:[\w-]+\.)+\w+$/>.  It's a very bad idea.  However,
+this also throws out many valid ones, and says nothing about
+potential deliverability, so it is not suggested.  Instead, see
+http://www.cpan.org/authors/Tom_Christiansen/scripts/ckaddr.gz ,
+which actually checks against the full RFC spec (except for nested
+comments), looks for addresses you may not wish to accept mail to
+(say, Bill Clinton or your postmaster), and then makes sure that the
+hostname given can be looked up in the DNS MX records.  It's not fast,
+but it works for what it tries to do.
+
+Our best advice for verifying a person's mail address is to have them
+enter their address twice, just as you normally do to change a password.
+This usually weeds out typos.  If both versions match, send
+mail to that address with a personal message that looks somewhat like:
+
+    Dear someuser@host.com,
+
+    Please confirm the mail address you gave us Wed May  6 09:38:41
+    MDT 1998 by replying to this message.  Include the string
+    "Rumpelstiltskin" in that reply, but spelled in reverse; that is,
+    start with "Nik...".  Once this is done, your confirmed address will
+    be entered into our records.
+
+If you get the message back and they've followed your directions,
+you can be reasonably assured that it's real.
+
+A related strategy that's less open to forgery is to give them a PIN
+(personal ID number).  Record the address and PIN (best that it be a
+random one) for later processing.  In the mail you send, ask them to
+include the PIN in their reply.  But if it bounces, or the message is
+included via a "vacation" script, it'll be there anyway.  So it's
+best to ask them to mail back a slight alteration of the PIN, such as
+with the characters reversed, one added or subtracted to each digit, etc.
+
+=head2 How do I decode a MIME/BASE64 string?
+
+The MIME-Base64 package (available from CPAN) handles this as well as
+the MIME/QP encoding.  Decoding BASE64 becomes as simple as:
+
+    use MIME::Base64;
+    $decoded = decode_base64($encoded);
+
+The MIME-Tools package (available from CPAN) supports extraction with
+decoding of BASE64 encoded attachments and content directly from email
+messages.
+
+If the string to decode is short (less than 84 bytes long)
+a more direct approach is to use the unpack() function's "u"
+format after minor transliterations:
+
+    tr#A-Za-z0-9+/##cd;                   # remove non-base64 chars
+    tr#A-Za-z0-9+/# -_#;                  # convert to uuencoded format
+    $len = pack("c", 32 + 0.75*length);   # compute length byte
+    print unpack("u", $len . $_);         # uudecode and print
+
+=head2 How do I return the user's mail address?
+
+On systems that support getpwuid, the $< variable, and the
+Sys::Hostname module (which is part of the standard perl distribution),
+you can probably try using something like this:
+
+    use Sys::Hostname;
+    $address = sprintf('%s@%s', scalar getpwuid($<), hostname);
+
+Company policies on mail address can mean that this generates addresses
+that the company's mail system will not accept, so you should ask for
+users' mail addresses when this matters.  Furthermore, not all systems
+on which Perl runs are so forthcoming with this information as is Unix.
+
+The Mail::Util module from CPAN (part of the MailTools package) provides a
+mailaddress() function that tries to guess the mail address of the user.
+It makes a more intelligent guess than the code above, using information
+given when the module was installed, but it could still be incorrect.
+Again, the best way is often just to ask the user.
+
+=head2 How do I send mail?
+
+Use the C<sendmail> program directly:
+
+    open(SENDMAIL, "|/usr/lib/sendmail -oi -t -odq")
+                        or die "Can't fork for sendmail: $!\n";
+    print SENDMAIL <<"EOF";
+    From: User Originating Mail <me\@host>
+    To: Final Destination <you\@otherhost>
+    Subject: A relevant subject line
+
+    Body of the message goes here after the blank line
+    in as many lines as you like.
+    EOF
+    close(SENDMAIL)     or warn "sendmail didn't close nicely";
+
+The B<-oi> option prevents sendmail from interpreting a line consisting
+of a single dot as "end of message".  The B<-t> option says to use the
+headers to decide who to send the message to, and B<-odq> says to put
+the message into the queue.  This last option means your message won't
+be immediately delivered, so leave it out if you want immediate
+delivery.
+
+Alternate, less convenient approaches include calling mail (sometimes
+called mailx) directly or simply opening up port 25 have having an
+intimate conversation between just you and the remote SMTP daemon,
+probably sendmail.
+
+Or you might be able use the CPAN module Mail::Mailer:
+
+    use Mail::Mailer;
+
+    $mailer = Mail::Mailer->new();
+    $mailer->open({ From    => $from_address,
+                    To      => $to_address,
+                    Subject => $subject,
+                  })
+        or die "Can't open: $!\n";
+    print $mailer $body;
+    $mailer->close();
+
+The Mail::Internet module uses Net::SMTP which is less Unix-centric than
+Mail::Mailer, but less reliable.  Avoid raw SMTP commands.  There
+are many reasons to use a mail transport agent like sendmail.  These
+include queuing, MX records, and security.
+
+=head2 How do I use MIME to make an attachment to a mail message?
+
+This answer is extracted directly from the MIME::Lite documentation.
+Create a multipart message (i.e., one with attachments).
+
+    use MIME::Lite;
+
+    ### Create a new multipart message:
+    $msg = MIME::Lite->new(
+                 From    =>'me@myhost.com',
+                 To      =>'you@yourhost.com',
+                 Cc      =>'some@other.com, some@more.com',
+                 Subject =>'A message with 2 parts...',
+                 Type    =>'multipart/mixed'
+                 );
+
+    ### Add parts (each "attach" has same arguments as "new"):
+    $msg->attach(Type     =>'TEXT',
+                 Data     =>"Here's the GIF file you wanted"
+                 );
+    $msg->attach(Type     =>'image/gif',
+                 Path     =>'aaa000123.gif',
+                 Filename =>'logo.gif'
+                 );
+
+    $text = $msg->as_string;
+
+MIME::Lite also includes a method for sending these things.
+
+    $msg->send;
+
+This defaults to using L<sendmail> but can be customized to use
+SMTP via L<Net::SMTP>.
+
+=head2 How do I read mail?
+
+While you could use the Mail::Folder module from CPAN (part of the
+MailFolder package) or the Mail::Internet module from CPAN (part
+of the MailTools package), often a module is overkill.  Here's a
+mail sorter.
+
+    #!/usr/bin/perl
+
+    my(@msgs, @sub);
+    my $msgno = -1;
+    $/ = '';                    # paragraph reads
+    while (<>) {
+        if (/^From /m) {
+            /^Subject:\s*(?:Re:\s*)*(.*)/mi;
+            $sub[++$msgno] = lc($1) || '';
+        }
+        $msgs[$msgno] .= $_;
+    }
+    for my $i (sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msgs)) {
+        print $msgs[$i];
+    }
+
+Or more succinctly,
+
+    #!/usr/bin/perl -n00
+    # bysub2 - awkish sort-by-subject
+    BEGIN { $msgno = -1 }
+    $sub[++$msgno] = (/^Subject:\s*(?:Re:\s*)*(.*)/mi)[0] if /^From/m;
+    $msg[$msgno] .= $_;
+    END { print @msg[ sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msg) ] }
+
+=head2 How do I find out my hostname, domainname, or IP address?
+X<hostname, domainname, IP address, host, domain, hostfqdn, inet_ntoa,
+gethostbyname, Socket, Net::Domain, Sys::Hostname>
+
+(contributed by brian d foy)
+
+The Net::Domain module, which is part of the standard distribution starting
+in perl5.7.3, can get you the fully qualified domain name (FQDN), the host
+name, or the domain name.
+
+	use Net::Domain qw(hostname hostfqdn hostdomain);
+
+	my $host = hostfqdn();
+
+The C<Sys::Hostname> module, included in the standard distribution since
+perl5.6, can also get the hostname.
+
+	use Sys::Hostname;
+
+	$host = hostname();
+
+To get the IP address, you can use the C<gethostbyname> built-in function
+to turn the name into a number. To turn that number into the dotted octet
+form (a.b.c.d) that most people expect, use the C<inet_ntoa> function
+from the <Socket> module, which also comes with perl.
+
+    use Socket;
+
+    my $address = inet_ntoa(
+    	scalar gethostbyname( $host || 'localhost' )
+    	);
+
+=head2 How do I fetch a news article or the active newsgroups?
+
+Use the Net::NNTP or News::NNTPClient modules, both available from CPAN.
+This can make tasks like fetching the newsgroup list as simple as
+
+    perl -MNews::NNTPClient
+      -e 'print News::NNTPClient->new->list("newsgroups")'
+
+=head2 How do I fetch/put an FTP file?
+
+LWP::Simple (available from CPAN) can fetch but not put.  Net::FTP (also
+available from CPAN) is more complex but can put as well as fetch.
+
+=head2 How can I do RPC in Perl?
+
+(Contributed by brian d foy)
+
+Use one of the RPC modules you can find on CPAN (
+http://search.cpan.org/search?query=RPC&mode=all ).
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997-2006 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain.  You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit.  A simple comment in the code giving
+credit would be courteous but is not required.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfilter.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfilter.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfilter.pod	(revision 14489)
@@ -0,0 +1,588 @@
+=head1 NAME
+
+perlfilter - Source Filters
+
+=head1 DESCRIPTION
+
+This article is about a little-known feature of Perl called
+I<source filters>. Source filters alter the program text of a module
+before Perl sees it, much as a C preprocessor alters the source text of
+a C program before the compiler sees it. This article tells you more
+about what source filters are, how they work, and how to write your
+own.
+
+The original purpose of source filters was to let you encrypt your
+program source to prevent casual piracy. This isn't all they can do, as
+you'll soon learn. But first, the basics.
+
+=head1 CONCEPTS
+
+Before the Perl interpreter can execute a Perl script, it must first
+read it from a file into memory for parsing and compilation. If that
+script itself includes other scripts with a C<use> or C<require>
+statement, then each of those scripts will have to be read from their
+respective files as well.
+
+Now think of each logical connection between the Perl parser and an
+individual file as a I<source stream>. A source stream is created when
+the Perl parser opens a file, it continues to exist as the source code
+is read into memory, and it is destroyed when Perl is finished parsing
+the file. If the parser encounters a C<require> or C<use> statement in
+a source stream, a new and distinct stream is created just for that
+file.
+
+The diagram below represents a single source stream, with the flow of
+source from a Perl script file on the left into the Perl parser on the
+right. This is how Perl normally operates.
+
+    file -------> parser
+
+There are two important points to remember:
+
+=over 5
+
+=item 1.
+
+Although there can be any number of source streams in existence at any
+given time, only one will be active.
+
+=item 2.
+
+Every source stream is associated with only one file.
+
+=back
+
+A source filter is a special kind of Perl module that intercepts and
+modifies a source stream before it reaches the parser. A source filter
+changes our diagram like this:
+
+    file ----> filter ----> parser
+
+If that doesn't make much sense, consider the analogy of a command
+pipeline. Say you have a shell script stored in the compressed file
+I<trial.gz>. The simple pipeline command below runs the script without
+needing to create a temporary file to hold the uncompressed file.
+
+    gunzip -c trial.gz | sh
+
+In this case, the data flow from the pipeline can be represented as follows:
+
+    trial.gz ----> gunzip ----> sh
+
+With source filters, you can store the text of your script compressed and use a source filter to uncompress it for Perl's parser:
+
+     compressed           gunzip
+    Perl program ---> source filter ---> parser
+
+=head1 USING FILTERS
+
+So how do you use a source filter in a Perl script? Above, I said that
+a source filter is just a special kind of module. Like all Perl
+modules, a source filter is invoked with a use statement.
+
+Say you want to pass your Perl source through the C preprocessor before
+execution. You could use the existing C<-P> command line option to do
+this, but as it happens, the source filters distribution comes with a C
+preprocessor filter module called Filter::cpp. Let's use that instead.
+
+Below is an example program, C<cpp_test>, which makes use of this filter.
+Line numbers have been added to allow specific lines to be referenced
+easily.
+
+    1: use Filter::cpp;
+    2: #define TRUE 1
+    3: $a = TRUE;
+    4: print "a = $a\n";
+
+When you execute this script, Perl creates a source stream for the
+file. Before the parser processes any of the lines from the file, the
+source stream looks like this:
+
+    cpp_test ---------> parser
+
+Line 1, C<use Filter::cpp>, includes and installs the C<cpp> filter
+module. All source filters work this way. The use statement is compiled
+and executed at compile time, before any more of the file is read, and
+it attaches the cpp filter to the source stream behind the scenes. Now
+the data flow looks like this:
+
+    cpp_test ----> cpp filter ----> parser
+
+As the parser reads the second and subsequent lines from the source
+stream, it feeds those lines through the C<cpp> source filter before
+processing them. The C<cpp> filter simply passes each line through the
+real C preprocessor. The output from the C preprocessor is then
+inserted back into the source stream by the filter.
+
+                  .-> cpp --.
+                  |         |
+                  |         |
+                  |       <-'
+   cpp_test ----> cpp filter ----> parser
+
+The parser then sees the following code:
+
+    use Filter::cpp;
+    $a = 1;
+    print "a = $a\n";
+
+Let's consider what happens when the filtered code includes another
+module with use:
+
+    1: use Filter::cpp;
+    2: #define TRUE 1
+    3: use Fred;
+    4: $a = TRUE;
+    5: print "a = $a\n";
+
+The C<cpp> filter does not apply to the text of the Fred module, only
+to the text of the file that used it (C<cpp_test>). Although the use
+statement on line 3 will pass through the cpp filter, the module that
+gets included (C<Fred>) will not. The source streams look like this
+after line 3 has been parsed and before line 4 is parsed:
+
+    cpp_test ---> cpp filter ---> parser (INACTIVE)
+
+    Fred.pm ----> parser
+
+As you can see, a new stream has been created for reading the source
+from C<Fred.pm>. This stream will remain active until all of C<Fred.pm>
+has been parsed. The source stream for C<cpp_test> will still exist,
+but is inactive. Once the parser has finished reading Fred.pm, the
+source stream associated with it will be destroyed. The source stream
+for C<cpp_test> then becomes active again and the parser reads line 4
+and subsequent lines from C<cpp_test>.
+
+You can use more than one source filter on a single file. Similarly,
+you can reuse the same filter in as many files as you like.
+
+For example, if you have a uuencoded and compressed source file, it is
+possible to stack a uudecode filter and an uncompression filter like
+this:
+
+    use Filter::uudecode; use Filter::uncompress;
+    M'XL(".H<US4''V9I;F%L')Q;>7/;1I;_>_I3=&E=%:F*I"T?22Q/
+    M6]9*<IQCO*XFT"0[PL%%'Y+IG?WN^ZYN-$'J.[.JE$,20/?K=_[>
+    ...
+
+Once the first line has been processed, the flow will look like this:
+
+    file ---> uudecode ---> uncompress ---> parser
+               filter         filter
+
+Data flows through filters in the same order they appear in the source
+file. The uudecode filter appeared before the uncompress filter, so the
+source file will be uudecoded before it's uncompressed.
+
+=head1 WRITING A SOURCE FILTER
+
+There are three ways to write your own source filter. You can write it
+in C, use an external program as a filter, or write the filter in Perl.
+I won't cover the first two in any great detail, so I'll get them out
+of the way first. Writing the filter in Perl is most convenient, so
+I'll devote the most space to it.
+
+=head1 WRITING A SOURCE FILTER IN C
+
+The first of the three available techniques is to write the filter
+completely in C. The external module you create interfaces directly
+with the source filter hooks provided by Perl.
+
+The advantage of this technique is that you have complete control over
+the implementation of your filter. The big disadvantage is the
+increased complexity required to write the filter - not only do you
+need to understand the source filter hooks, but you also need a
+reasonable knowledge of Perl guts. One of the few times it is worth
+going to this trouble is when writing a source scrambler. The
+C<decrypt> filter (which unscrambles the source before Perl parses it)
+included with the source filter distribution is an example of a C
+source filter (see Decryption Filters, below).
+
+
+=over 5
+
+=item B<Decryption Filters>
+
+All decryption filters work on the principle of "security through
+obscurity." Regardless of how well you write a decryption filter and
+how strong your encryption algorithm, anyone determined enough can
+retrieve the original source code. The reason is quite simple - once
+the decryption filter has decrypted the source back to its original
+form, fragments of it will be stored in the computer's memory as Perl
+parses it. The source might only be in memory for a short period of
+time, but anyone possessing a debugger, skill, and lots of patience can
+eventually reconstruct your program.
+
+That said, there are a number of steps that can be taken to make life
+difficult for the potential cracker. The most important: Write your
+decryption filter in C and statically link the decryption module into
+the Perl binary. For further tips to make life difficult for the
+potential cracker, see the file I<decrypt.pm> in the source filters
+module.
+
+=back
+
+=head1 CREATING A SOURCE FILTER AS A SEPARATE EXECUTABLE
+
+An alternative to writing the filter in C is to create a separate
+executable in the language of your choice. The separate executable
+reads from standard input, does whatever processing is necessary, and
+writes the filtered data to standard output. C<Filter:cpp> is an
+example of a source filter implemented as a separate executable - the
+executable is the C preprocessor bundled with your C compiler.
+
+The source filter distribution includes two modules that simplify this
+task: C<Filter::exec> and C<Filter::sh>. Both allow you to run any
+external executable. Both use a coprocess to control the flow of data
+into and out of the external executable. (For details on coprocesses,
+see Stephens, W.R. "Advanced Programming in the UNIX Environment."
+Addison-Wesley, ISBN 0-210-56317-7, pages 441-445.) The difference
+between them is that C<Filter::exec> spawns the external command
+directly, while C<Filter::sh> spawns a shell to execute the external
+command. (Unix uses the Bourne shell; NT uses the cmd shell.) Spawning
+a shell allows you to make use of the shell metacharacters and
+redirection facilities.
+
+Here is an example script that uses C<Filter::sh>:
+
+    use Filter::sh 'tr XYZ PQR';
+    $a = 1;
+    print "XYZ a = $a\n";
+
+The output you'll get when the script is executed:
+
+    PQR a = 1
+
+Writing a source filter as a separate executable works fine, but a
+small performance penalty is incurred. For example, if you execute the
+small example above, a separate subprocess will be created to run the
+Unix C<tr> command. Each use of the filter requires its own subprocess.
+If creating subprocesses is expensive on your system, you might want to
+consider one of the other options for creating source filters.
+
+=head1 WRITING A SOURCE FILTER IN PERL
+
+The easiest and most portable option available for creating your own
+source filter is to write it completely in Perl. To distinguish this
+from the previous two techniques, I'll call it a Perl source filter.
+
+To help understand how to write a Perl source filter we need an example
+to study. Here is a complete source filter that performs rot13
+decoding. (Rot13 is a very simple encryption scheme used in Usenet
+postings to hide the contents of offensive posts. It moves every letter
+forward thirteen places, so that A becomes N, B becomes O, and Z
+becomes M.)
+
+
+   package Rot13;
+
+   use Filter::Util::Call;
+
+   sub import {
+      my ($type) = @_;
+      my ($ref) = [];
+      filter_add(bless $ref);
+   }
+
+   sub filter {
+      my ($self) = @_;
+      my ($status);
+
+      tr/n-za-mN-ZA-M/a-zA-Z/
+         if ($status = filter_read()) > 0;
+      $status;
+   }
+
+   1;
+
+All Perl source filters are implemented as Perl classes and have the
+same basic structure as the example above.
+
+First, we include the C<Filter::Util::Call> module, which exports a
+number of functions into your filter's namespace. The filter shown
+above uses two of these functions, C<filter_add()> and
+C<filter_read()>.
+
+Next, we create the filter object and associate it with the source
+stream by defining the C<import> function. If you know Perl well
+enough, you know that C<import> is called automatically every time a
+module is included with a use statement. This makes C<import> the ideal
+place to both create and install a filter object.
+
+In the example filter, the object (C<$ref>) is blessed just like any
+other Perl object. Our example uses an anonymous array, but this isn't
+a requirement. Because this example doesn't need to store any context
+information, we could have used a scalar or hash reference just as
+well. The next section demonstrates context data.
+
+The association between the filter object and the source stream is made
+with the C<filter_add()> function. This takes a filter object as a
+parameter (C<$ref> in this case) and installs it in the source stream.
+
+Finally, there is the code that actually does the filtering. For this
+type of Perl source filter, all the filtering is done in a method
+called C<filter()>. (It is also possible to write a Perl source filter
+using a closure. See the C<Filter::Util::Call> manual page for more
+details.) It's called every time the Perl parser needs another line of
+source to process. The C<filter()> method, in turn, reads lines from
+the source stream using the C<filter_read()> function.
+
+If a line was available from the source stream, C<filter_read()>
+returns a status value greater than zero and appends the line to C<$_>.
+A status value of zero indicates end-of-file, less than zero means an
+error. The filter function itself is expected to return its status in
+the same way, and put the filtered line it wants written to the source
+stream in C<$_>. The use of C<$_> accounts for the brevity of most Perl
+source filters.
+
+In order to make use of the rot13 filter we need some way of encoding
+the source file in rot13 format. The script below, C<mkrot13>, does
+just that.
+
+    die "usage mkrot13 filename\n" unless @ARGV;
+    my $in = $ARGV[0];
+    my $out = "$in.tmp";
+    open(IN, "<$in") or die "Cannot open file $in: $!\n";
+    open(OUT, ">$out") or die "Cannot open file $out: $!\n";
+
+    print OUT "use Rot13;\n";
+    while (<IN>) {
+       tr/a-zA-Z/n-za-mN-ZA-M/;
+       print OUT;
+    }
+
+    close IN;
+    close OUT;
+    unlink $in;
+    rename $out, $in;
+
+If we encrypt this with C<mkrot13>:
+
+    print " hello fred \n";
+
+the result will be this:
+
+    use Rot13;
+    cevag "uryyb serq\a";
+
+Running it produces this output:
+
+    hello fred
+
+=head1 USING CONTEXT: THE DEBUG FILTER
+
+The rot13 example was a trivial example. Here's another demonstration
+that shows off a few more features.
+
+Say you wanted to include a lot of debugging code in your Perl script
+during development, but you didn't want it available in the released
+product. Source filters offer a solution. In order to keep the example
+simple, let's say you wanted the debugging output to be controlled by
+an environment variable, C<DEBUG>. Debugging code is enabled if the
+variable exists, otherwise it is disabled.
+
+Two special marker lines will bracket debugging code, like this:
+
+    ## DEBUG_BEGIN
+    if ($year > 1999) {
+       warn "Debug: millennium bug in year $year\n";
+    }
+    ## DEBUG_END
+
+When the C<DEBUG> environment variable exists, the filter ensures that
+Perl parses only the code between the C<DEBUG_BEGIN> and C<DEBUG_END>
+markers. That means that when C<DEBUG> does exist, the code above
+should be passed through the filter unchanged. The marker lines can
+also be passed through as-is, because the Perl parser will see them as
+comment lines. When C<DEBUG> isn't set, we need a way to disable the
+debug code. A simple way to achieve that is to convert the lines
+between the two markers into comments:
+
+    ## DEBUG_BEGIN
+    #if ($year > 1999) {
+    #     warn "Debug: millennium bug in year $year\n";
+    #}
+    ## DEBUG_END
+
+Here is the complete Debug filter:
+
+    package Debug;
+
+    use strict;
+    use warnings;
+    use Filter::Util::Call;
+
+    use constant TRUE => 1;
+    use constant FALSE => 0;
+
+    sub import {
+       my ($type) = @_;
+       my (%context) = (
+         Enabled => defined $ENV{DEBUG},
+         InTraceBlock => FALSE,
+         Filename => (caller)[1],
+         LineNo => 0,
+         LastBegin => 0,
+       );
+       filter_add(bless \%context);
+    }
+
+    sub Die {
+       my ($self) = shift;
+       my ($message) = shift;
+       my ($line_no) = shift || $self->{LastBegin};
+       die "$message at $self->{Filename} line $line_no.\n"
+    }
+
+    sub filter {
+       my ($self) = @_;
+       my ($status);
+       $status = filter_read();
+       ++ $self->{LineNo};
+
+       # deal with EOF/error first
+       if ($status <= 0) {
+           $self->Die("DEBUG_BEGIN has no DEBUG_END")
+               if $self->{InTraceBlock};
+           return $status;
+       }
+
+       if ($self->{InTraceBlock}) {
+          if (/^\s*##\s*DEBUG_BEGIN/ ) {
+              $self->Die("Nested DEBUG_BEGIN", $self->{LineNo})
+          } elsif (/^\s*##\s*DEBUG_END/) {
+              $self->{InTraceBlock} = FALSE;
+          }
+
+          # comment out the debug lines when the filter is disabled
+          s/^/#/ if ! $self->{Enabled};
+       } elsif ( /^\s*##\s*DEBUG_BEGIN/ ) {
+          $self->{InTraceBlock} = TRUE;
+          $self->{LastBegin} = $self->{LineNo};
+       } elsif ( /^\s*##\s*DEBUG_END/ ) {
+          $self->Die("DEBUG_END has no DEBUG_BEGIN", $self->{LineNo});
+       }
+       return $status;
+    }
+
+    1;
+
+The big difference between this filter and the previous example is the
+use of context data in the filter object. The filter object is based on
+a hash reference, and is used to keep various pieces of context
+information between calls to the filter function. All but two of the
+hash fields are used for error reporting. The first of those two,
+Enabled, is used by the filter to determine whether the debugging code
+should be given to the Perl parser. The second, InTraceBlock, is true
+when the filter has encountered a C<DEBUG_BEGIN> line, but has not yet
+encountered the following C<DEBUG_END> line.
+
+If you ignore all the error checking that most of the code does, the
+essence of the filter is as follows:
+
+    sub filter {
+       my ($self) = @_;
+       my ($status);
+       $status = filter_read();
+
+       # deal with EOF/error first
+       return $status if $status <= 0;
+       if ($self->{InTraceBlock}) {
+          if (/^\s*##\s*DEBUG_END/) {
+             $self->{InTraceBlock} = FALSE
+          }
+
+          # comment out debug lines when the filter is disabled
+          s/^/#/ if ! $self->{Enabled};
+       } elsif ( /^\s*##\s*DEBUG_BEGIN/ ) {
+          $self->{InTraceBlock} = TRUE;
+       }
+       return $status;
+    }
+
+Be warned: just as the C-preprocessor doesn't know C, the Debug filter
+doesn't know Perl. It can be fooled quite easily:
+
+    print <<EOM;
+    ##DEBUG_BEGIN
+    EOM
+
+Such things aside, you can see that a lot can be achieved with a modest
+amount of code.
+
+=head1 CONCLUSION
+
+You now have better understanding of what a source filter is, and you
+might even have a possible use for them. If you feel like playing with
+source filters but need a bit of inspiration, here are some extra
+features you could add to the Debug filter.
+
+First, an easy one. Rather than having debugging code that is
+all-or-nothing, it would be much more useful to be able to control
+which specific blocks of debugging code get included. Try extending the
+syntax for debug blocks to allow each to be identified. The contents of
+the C<DEBUG> environment variable can then be used to control which
+blocks get included.
+
+Once you can identify individual blocks, try allowing them to be
+nested. That isn't difficult either.
+
+Here is an interesting idea that doesn't involve the Debug filter.
+Currently Perl subroutines have fairly limited support for formal
+parameter lists. You can specify the number of parameters and their
+type, but you still have to manually take them out of the C<@_> array
+yourself. Write a source filter that allows you to have a named
+parameter list. Such a filter would turn this:
+
+    sub MySub ($first, $second, @rest) { ... }
+
+into this:
+
+    sub MySub($$@) {
+       my ($first) = shift;
+       my ($second) = shift;
+       my (@rest) = @_;
+       ...
+    }
+
+Finally, if you feel like a real challenge, have a go at writing a
+full-blown Perl macro preprocessor as a source filter. Borrow the
+useful features from the C preprocessor and any other macro processors
+you know. The tricky bit will be choosing how much knowledge of Perl's
+syntax you want your filter to have.
+
+=head1 THINGS TO LOOK OUT FOR
+
+=over 5
+
+=item Some Filters Clobber the C<DATA> Handle
+
+Some source filters use the C<DATA> handle to read the calling program.
+When using these source filters you cannot rely on this handle, nor expect
+any particular kind of behavior when operating on it.  Filters based on
+Filter::Util::Call (and therefore Filter::Simple) do not alter the C<DATA>
+filehandle.
+
+=back
+
+=head1 REQUIREMENTS
+
+The Source Filters distribution is available on CPAN, in 
+
+    CPAN/modules/by-module/Filter
+
+Starting from Perl 5.8 Filter::Util::Call (the core part of the
+Source Filters distribution) is part of the standard Perl distribution.
+Also included is a friendlier interface called Filter::Simple, by
+Damian Conway.
+
+=head1 AUTHOR
+
+Paul Marquess E<lt>Paul.Marquess@btinternet.comE<gt>
+
+=head1 Copyrights
+
+This article originally appeared in The Perl Journal #11, and is
+copyright 1998 The Perl Journal. It appears courtesy of Jon Orwant and
+The Perl Journal.  This document may be distributed under the same terms
+as Perl itself.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfork.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfork.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfork.pod	(revision 14489)
@@ -0,0 +1,313 @@
+=head1 NAME
+
+perlfork - Perl's fork() emulation
+
+=head1 SYNOPSIS
+
+    NOTE:  As of the 5.8.0 release, fork() emulation has considerably
+    matured.  However, there are still a few known bugs and differences
+    from real fork() that might affect you.  See the "BUGS" and
+    "CAVEATS AND LIMITATIONS" sections below.
+
+Perl provides a fork() keyword that corresponds to the Unix system call
+of the same name.  On most Unix-like platforms where the fork() system
+call is available, Perl's fork() simply calls it.
+
+On some platforms such as Windows where the fork() system call is not
+available, Perl can be built to emulate fork() at the interpreter level.
+While the emulation is designed to be as compatible as possible with the
+real fork() at the level of the Perl program, there are certain
+important differences that stem from the fact that all the pseudo child
+"processes" created this way live in the same real process as far as the
+operating system is concerned.
+
+This document provides a general overview of the capabilities and
+limitations of the fork() emulation.  Note that the issues discussed here
+are not applicable to platforms where a real fork() is available and Perl
+has been configured to use it.
+
+=head1 DESCRIPTION
+
+The fork() emulation is implemented at the level of the Perl interpreter.
+What this means in general is that running fork() will actually clone the
+running interpreter and all its state, and run the cloned interpreter in
+a separate thread, beginning execution in the new thread just after the
+point where the fork() was called in the parent.  We will refer to the
+thread that implements this child "process" as the pseudo-process.
+
+To the Perl program that called fork(), all this is designed to be
+transparent.  The parent returns from the fork() with a pseudo-process
+ID that can be subsequently used in any process manipulation functions;
+the child returns from the fork() with a value of C<0> to signify that
+it is the child pseudo-process.
+
+=head2 Behavior of other Perl features in forked pseudo-processes
+
+Most Perl features behave in a natural way within pseudo-processes.
+
+=over 8
+
+=item $$ or $PROCESS_ID
+
+This special variable is correctly set to the pseudo-process ID.
+It can be used to identify pseudo-processes within a particular
+session.  Note that this value is subject to recycling if any
+pseudo-processes are launched after others have been wait()-ed on.
+
+=item %ENV
+
+Each pseudo-process maintains its own virtual environment.  Modifications
+to %ENV affect the virtual environment, and are only visible within that
+pseudo-process, and in any processes (or pseudo-processes) launched from
+it.
+
+=item chdir() and all other builtins that accept filenames
+
+Each pseudo-process maintains its own virtual idea of the current directory.
+Modifications to the current directory using chdir() are only visible within
+that pseudo-process, and in any processes (or pseudo-processes) launched from
+it.  All file and directory accesses from the pseudo-process will correctly
+map the virtual working directory to the real working directory appropriately.
+
+=item wait() and waitpid()
+
+wait() and waitpid() can be passed a pseudo-process ID returned by fork().
+These calls will properly wait for the termination of the pseudo-process
+and return its status.
+
+=item kill()
+
+kill() can be used to terminate a pseudo-process by passing it the ID returned
+by fork().  This should not be used except under dire circumstances, because
+the operating system may not guarantee integrity of the process resources
+when a running thread is terminated.  Note that using kill() on a
+pseudo-process() may typically cause memory leaks, because the thread that
+implements the pseudo-process does not get a chance to clean up its resources.
+
+=item exec()
+
+Calling exec() within a pseudo-process actually spawns the requested
+executable in a separate process and waits for it to complete before
+exiting with the same exit status as that process.  This means that the
+process ID reported within the running executable will be different from
+what the earlier Perl fork() might have returned.  Similarly, any process
+manipulation functions applied to the ID returned by fork() will affect the
+waiting pseudo-process that called exec(), not the real process it is
+waiting for after the exec().
+
+=item exit()
+
+exit() always exits just the executing pseudo-process, after automatically
+wait()-ing for any outstanding child pseudo-processes.  Note that this means
+that the process as a whole will not exit unless all running pseudo-processes
+have exited.
+
+=item Open handles to files, directories and network sockets
+
+All open handles are dup()-ed in pseudo-processes, so that closing
+any handles in one process does not affect the others.  See below for
+some limitations.
+
+=back
+
+=head2 Resource limits
+
+In the eyes of the operating system, pseudo-processes created via the fork()
+emulation are simply threads in the same process.  This means that any
+process-level limits imposed by the operating system apply to all
+pseudo-processes taken together.  This includes any limits imposed by the
+operating system on the number of open file, directory and socket handles,
+limits on disk space usage, limits on memory size, limits on CPU utilization
+etc.
+
+=head2 Killing the parent process
+
+If the parent process is killed (either using Perl's kill() builtin, or
+using some external means) all the pseudo-processes are killed as well,
+and the whole process exits.
+
+=head2 Lifetime of the parent process and pseudo-processes
+
+During the normal course of events, the parent process and every
+pseudo-process started by it will wait for their respective pseudo-children
+to complete before they exit.  This means that the parent and every
+pseudo-child created by it that is also a pseudo-parent will only exit
+after their pseudo-children have exited.
+
+A way to mark a pseudo-processes as running detached from their parent (so
+that the parent would not have to wait() for them if it doesn't want to)
+will be provided in future.
+
+=head2 CAVEATS AND LIMITATIONS
+
+=over 8
+
+=item BEGIN blocks
+
+The fork() emulation will not work entirely correctly when called from
+within a BEGIN block.  The forked copy will run the contents of the
+BEGIN block, but will not continue parsing the source stream after the
+BEGIN block.  For example, consider the following code:
+
+    BEGIN {
+        fork and exit;		# fork child and exit the parent
+	print "inner\n";
+    }
+    print "outer\n";
+
+This will print:
+
+    inner
+
+rather than the expected:
+
+    inner
+    outer
+
+This limitation arises from fundamental technical difficulties in
+cloning and restarting the stacks used by the Perl parser in the
+middle of a parse.
+
+=item Open filehandles
+
+Any filehandles open at the time of the fork() will be dup()-ed.  Thus,
+the files can be closed independently in the parent and child, but beware
+that the dup()-ed handles will still share the same seek pointer.  Changing
+the seek position in the parent will change it in the child and vice-versa.
+One can avoid this by opening files that need distinct seek pointers
+separately in the child.
+
+=item Forking pipe open() not yet implemented
+
+The C<open(FOO, "|-")> and C<open(BAR, "-|")> constructs are not yet
+implemented.  This limitation can be easily worked around in new code
+by creating a pipe explicitly.  The following example shows how to
+write to a forked child:
+
+    # simulate open(FOO, "|-")
+    sub pipe_to_fork ($) {
+	my $parent = shift;
+	pipe my $child, $parent or die;
+	my $pid = fork();
+	die "fork() failed: $!" unless defined $pid;
+	if ($pid) {
+	    close $child;
+	}
+	else {
+	    close $parent;
+	    open(STDIN, "<&=" . fileno($child)) or die;
+	}
+	$pid;
+    }
+
+    if (pipe_to_fork('FOO')) {
+	# parent
+	print FOO "pipe_to_fork\n";
+	close FOO;
+    }
+    else {
+	# child
+	while (<STDIN>) { print; }
+	exit(0);
+    }
+
+And this one reads from the child:
+
+    # simulate open(FOO, "-|")
+    sub pipe_from_fork ($) {
+	my $parent = shift;
+	pipe $parent, my $child or die;
+	my $pid = fork();
+	die "fork() failed: $!" unless defined $pid;
+	if ($pid) {
+	    close $child;
+	}
+	else {
+	    close $parent;
+	    open(STDOUT, ">&=" . fileno($child)) or die;
+	}
+	$pid;
+    }
+
+    if (pipe_from_fork('BAR')) {
+	# parent
+	while (<BAR>) { print; }
+	close BAR;
+    }
+    else {
+	# child
+	print "pipe_from_fork\n";
+	exit(0);
+    }
+
+Forking pipe open() constructs will be supported in future.
+
+=item Global state maintained by XSUBs 
+
+External subroutines (XSUBs) that maintain their own global state may
+not work correctly.  Such XSUBs will either need to maintain locks to
+protect simultaneous access to global data from different pseudo-processes,
+or maintain all their state on the Perl symbol table, which is copied
+naturally when fork() is called.  A callback mechanism that provides
+extensions an opportunity to clone their state will be provided in the
+near future.
+
+=item Interpreter embedded in larger application
+
+The fork() emulation may not behave as expected when it is executed in an
+application which embeds a Perl interpreter and calls Perl APIs that can
+evaluate bits of Perl code.  This stems from the fact that the emulation
+only has knowledge about the Perl interpreter's own data structures and
+knows nothing about the containing application's state.  For example, any
+state carried on the application's own call stack is out of reach.
+
+=item Thread-safety of extensions
+
+Since the fork() emulation runs code in multiple threads, extensions
+calling into non-thread-safe libraries may not work reliably when
+calling fork().  As Perl's threading support gradually becomes more
+widely adopted even on platforms with a native fork(), such extensions
+are expected to be fixed for thread-safety.
+
+=back
+
+=head1 BUGS
+
+=over 8
+
+=item *
+
+Having pseudo-process IDs be negative integers breaks down for the integer
+C<-1> because the wait() and waitpid() functions treat this number as
+being special.  The tacit assumption in the current implementation is that
+the system never allocates a thread ID of C<1> for user threads.  A better
+representation for pseudo-process IDs will be implemented in future.
+
+=item *
+
+In certain cases, the OS-level handles created by the pipe(), socket(),
+and accept() operators are apparently not duplicated accurately in
+pseudo-processes.  This only happens in some situations, but where it
+does happen, it may result in deadlocks between the read and write ends
+of pipe handles, or inability to send or receive data across socket
+handles.
+
+=item *
+
+This document may be incomplete in some respects.
+
+=back
+
+=head1 AUTHOR
+
+Support for concurrent interpreters and the fork() emulation was implemented
+by ActiveState, with funding from Microsoft Corporation.
+
+This document is authored and maintained by Gurusamy Sarathy
+E<lt>gsar@activestate.comE<gt>.
+
+=head1 SEE ALSO
+
+L<perlfunc/"fork">, L<perlipc>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlform.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlform.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlform.pod	(revision 14489)
@@ -0,0 +1,459 @@
+=head1 NAME
+X<format> X<report> X<chart>
+
+perlform - Perl formats
+
+=head1 DESCRIPTION
+
+Perl has a mechanism to help you generate simple reports and charts.  To
+facilitate this, Perl helps you code up your output page close to how it
+will look when it's printed.  It can keep track of things like how many
+lines are on a page, what page you're on, when to print page headers,
+etc.  Keywords are borrowed from FORTRAN: format() to declare and write()
+to execute; see their entries in L<perlfunc>.  Fortunately, the layout is
+much more legible, more like BASIC's PRINT USING statement.  Think of it
+as a poor man's nroff(1).
+X<nroff>
+
+Formats, like packages and subroutines, are declared rather than
+executed, so they may occur at any point in your program.  (Usually it's
+best to keep them all together though.) They have their own namespace
+apart from all the other "types" in Perl.  This means that if you have a
+function named "Foo", it is not the same thing as having a format named
+"Foo".  However, the default name for the format associated with a given
+filehandle is the same as the name of the filehandle.  Thus, the default
+format for STDOUT is named "STDOUT", and the default format for filehandle
+TEMP is named "TEMP".  They just look the same.  They aren't.
+
+Output record formats are declared as follows:
+
+    format NAME =
+    FORMLIST
+    .
+
+If the name is omitted, format "STDOUT" is defined. A single "." in 
+column 1 is used to terminate a format.  FORMLIST consists of a sequence 
+of lines, each of which may be one of three types:
+
+=over 4
+
+=item 1.
+
+A comment, indicated by putting a '#' in the first column.
+
+=item 2.
+
+A "picture" line giving the format for one output line.
+
+=item 3.
+
+An argument line supplying values to plug into the previous picture line.
+
+=back
+
+Picture lines contain output field definitions, intermingled with
+literal text. These lines do not undergo any kind of variable interpolation.
+Field definitions are made up from a set of characters, for starting and
+extending a field to its desired width. This is the complete set of
+characters for field definitions:
+X<format, picture line>
+X<@> X<^> X<< < >> X<< | >> X<< > >> X<#> X<0> X<.> X<...>
+X<@*> X<^*> X<~> X<~~>
+  
+   @    start of regular field
+   ^    start of special field
+   <    pad character for left adjustification
+   |    pad character for centering
+   >    pad character for right adjustificat
+   #    pad character for a right justified numeric field
+   0    instead of first #: pad number with leading zeroes
+   .    decimal point within a numeric field
+   ...  terminate a text field, show "..." as truncation evidence
+   @*   variable width field for a multi-line value
+   ^*   variable width field for next line of a multi-line value
+   ~    suppress line with all fields empty
+   ~~   repeat line until all fields are exhausted
+
+Each field in a picture line starts with either "@" (at) or "^" (caret),
+indicating what we'll call, respectively, a "regular" or "special" field.
+The choice of pad characters determines whether a field is textual or
+numeric. The tilde operators are not part of a field.  Let's look at
+the various possibilities in detail.
+
+
+=head2 Text Fields
+X<format, text field>
+
+The length of the field is supplied by padding out the field with multiple 
+"E<lt>", "E<gt>", or "|" characters to specify a non-numeric field with,
+respectively, left justification, right justification, or centering. 
+For a regular field, the value (up to the first newline) is taken and
+printed according to the selected justification, truncating excess characters.
+If you terminate a text field with "...", three dots will be shown if
+the value is truncated. A special text field may be used to do rudimentary 
+multi-line text block filling; see L</Using Fill Mode> for details.
+
+   Example:
+      format STDOUT =
+      @<<<<<<   @||||||   @>>>>>>
+      "left",   "middle", "right"
+      .
+   Output:
+      left      middle    right
+
+
+=head2 Numeric Fields
+X<#> X<format, numeric field>
+
+Using "#" as a padding character specifies a numeric field, with
+right justification. An optional "." defines the position of the
+decimal point. With a "0" (zero) instead of the first "#", the
+formatted number will be padded with leading zeroes if necessary.
+A special numeric field is blanked out if the value is undefined.
+If the resulting value would exceed the width specified the field is
+filled with "#" as overflow evidence.
+
+   Example:
+      format STDOUT =
+      @###   @.###   @##.###  @###   @###   ^####
+       42,   3.1415,  undef,    0, 10000,   undef
+      .
+   Output:
+        42   3.142     0.000     0   ####
+
+
+=head2 The Field @* for Variable Width Multi-Line Text
+X<@*>
+
+The field "@*" can be used for printing multi-line, nontruncated
+values; it should (but need not) appear by itself on a line. A final
+line feed is chomped off, but all other characters are emitted verbatim.
+
+
+=head2 The Field ^* for Variable Width One-line-at-a-time Text
+X<^*>
+
+Like "@*", this is a variable width field. The value supplied must be a 
+scalar variable. Perl puts the first line (up to the first "\n") of the 
+text into the field, and then chops off the front of the string so that 
+the next time the variable is referenced, more of the text can be printed. 
+The variable will I<not> be restored.
+
+   Example:
+      $text = "line 1\nline 2\nline 3";
+      format STDOUT =
+      Text: ^*
+            $text
+      ~~    ^*
+            $text
+      .
+   Output:
+      Text: line 1
+            line 2
+            line 3
+
+
+=head2 Specifying Values
+X<format, specifying values>
+
+The values are specified on the following format line in the same order as
+the picture fields.  The expressions providing the values must be
+separated by commas.  They are all evaluated in a list context
+before the line is processed, so a single list expression could produce
+multiple list elements.  The expressions may be spread out to more than
+one line if enclosed in braces.  If so, the opening brace must be the first
+token on the first line.  If an expression evaluates to a number with a
+decimal part, and if the corresponding picture specifies that the decimal
+part should appear in the output (that is, any picture except multiple "#"
+characters B<without> an embedded "."), the character used for the decimal
+point is B<always> determined by the current LC_NUMERIC locale.  This
+means that, if, for example, the run-time environment happens to specify a
+German locale, "," will be used instead of the default ".".  See
+L<perllocale> and L<"WARNINGS"> for more information.
+
+
+=head2 Using Fill Mode
+X<format, fill mode>
+
+On text fields the caret enables a kind of fill mode.  Instead of an
+arbitrary expression, the value supplied must be a scalar variable
+that contains a text string.  Perl puts the next portion of the text into
+the field, and then chops off the front of the string so that the next time
+the variable is referenced, more of the text can be printed.  (Yes, this
+means that the variable itself is altered during execution of the write()
+call, and is not restored.)  The next portion of text is determined by
+a crude line breaking algorithm. You may use the carriage return character
+(C<\r>) to force a line break. You can change which characters are legal 
+to break on by changing the variable C<$:> (that's 
+$FORMAT_LINE_BREAK_CHARACTERS if you're using the English module) to a 
+list of the desired characters.
+
+Normally you would use a sequence of fields in a vertical stack associated 
+with the same scalar variable to print out a block of text. You might wish 
+to end the final field with the text "...", which will appear in the output 
+if the text was too long to appear in its entirety.  
+
+
+=head2 Suppressing Lines Where All Fields Are Void
+X<format, suppressing lines>
+
+Using caret fields can produce lines where all fields are blank. You can
+suppress such lines by putting a "~" (tilde) character anywhere in the
+line.  The tilde will be translated to a space upon output.
+
+
+=head2 Repeating Format Lines
+X<format, repeating lines>
+
+If you put two contiguous tilde characters "~~" anywhere into a line,
+the line will be repeated until all the fields on the line are exhausted,
+i.e. undefined. For special (caret) text fields this will occur sooner or
+later, but if you use a text field of the at variety, the  expression you
+supply had better not give the same value every time forever! (C<shift(@f)>
+is a simple example that would work.)  Don't use a regular (at) numeric 
+field in such lines, because it will never go blank.
+
+
+=head2 Top of Form Processing
+X<format, top of form> X<top> X<header>
+
+Top-of-form processing is by default handled by a format with the
+same name as the current filehandle with "_TOP" concatenated to it.
+It's triggered at the top of each page.  See L<perlfunc/write>.
+
+Examples:
+
+ # a report on the /etc/passwd file
+ format STDOUT_TOP =
+                         Passwd File
+ Name                Login    Office   Uid   Gid Home
+ ------------------------------------------------------------------
+ .
+ format STDOUT =
+ @<<<<<<<<<<<<<<<<<< @||||||| @<<<<<<@>>>> @>>>> @<<<<<<<<<<<<<<<<<
+ $name,              $login,  $office,$uid,$gid, $home
+ .
+
+
+ # a report from a bug report form
+ format STDOUT_TOP =
+                         Bug Reports
+ @<<<<<<<<<<<<<<<<<<<<<<<     @|||         @>>>>>>>>>>>>>>>>>>>>>>>
+ $system,                      $%,         $date
+ ------------------------------------------------------------------
+ .
+ format STDOUT =
+ Subject: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+          $subject
+ Index: @<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+        $index,                       $description
+ Priority: @<<<<<<<<<< Date: @<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+           $priority,        $date,   $description
+ From: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+       $from,                         $description
+ Assigned to: @<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+              $programmer,            $description
+ ~                                    ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+                                      $description
+ ~                                    ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+                                      $description
+ ~                                    ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+                                      $description
+ ~                                    ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+                                      $description
+ ~                                    ^<<<<<<<<<<<<<<<<<<<<<<<...
+                                      $description
+ .
+
+It is possible to intermix print()s with write()s on the same output
+channel, but you'll have to handle C<$-> (C<$FORMAT_LINES_LEFT>)
+yourself.
+
+=head2 Format Variables
+X<format variables>
+X<format, variables>
+
+The current format name is stored in the variable C<$~> (C<$FORMAT_NAME>),
+and the current top of form format name is in C<$^> (C<$FORMAT_TOP_NAME>).
+The current output page number is stored in C<$%> (C<$FORMAT_PAGE_NUMBER>),
+and the number of lines on the page is in C<$=> (C<$FORMAT_LINES_PER_PAGE>).
+Whether to autoflush output on this handle is stored in C<$|>
+(C<$OUTPUT_AUTOFLUSH>).  The string output before each top of page (except
+the first) is stored in C<$^L> (C<$FORMAT_FORMFEED>).  These variables are
+set on a per-filehandle basis, so you'll need to select() into a different
+one to affect them:
+
+    select((select(OUTF),
+	    $~ = "My_Other_Format",
+	    $^ = "My_Top_Format"
+	   )[0]);
+
+Pretty ugly, eh?  It's a common idiom though, so don't be too surprised
+when you see it.  You can at least use a temporary variable to hold
+the previous filehandle: (this is a much better approach in general,
+because not only does legibility improve, you now have intermediary
+stage in the expression to single-step the debugger through):
+
+    $ofh = select(OUTF);
+    $~ = "My_Other_Format";
+    $^ = "My_Top_Format";
+    select($ofh);
+
+If you use the English module, you can even read the variable names:
+
+    use English '-no_match_vars';
+    $ofh = select(OUTF);
+    $FORMAT_NAME     = "My_Other_Format";
+    $FORMAT_TOP_NAME = "My_Top_Format";
+    select($ofh);
+
+But you still have those funny select()s.  So just use the FileHandle
+module.  Now, you can access these special variables using lowercase
+method names instead:
+
+    use FileHandle;
+    format_name     OUTF "My_Other_Format";
+    format_top_name OUTF "My_Top_Format";
+
+Much better!
+
+=head1 NOTES
+
+Because the values line may contain arbitrary expressions (for at fields,
+not caret fields), you can farm out more sophisticated processing
+to other functions, like sprintf() or one of your own.  For example:
+
+    format Ident =
+	@<<<<<<<<<<<<<<<
+	&commify($n)
+    .
+
+To get a real at or caret into the field, do this:
+
+    format Ident =
+    I have an @ here.
+	    "@"
+    .
+
+To center a whole line of text, do something like this:
+
+    format Ident =
+    @|||||||||||||||||||||||||||||||||||||||||||||||
+	    "Some text line"
+    .
+
+There is no builtin way to say "float this to the right hand side
+of the page, however wide it is."  You have to specify where it goes.
+The truly desperate can generate their own format on the fly, based
+on the current number of columns, and then eval() it:
+
+    $format  = "format STDOUT = \n"
+             . '^' . '<' x $cols . "\n"
+             . '$entry' . "\n"
+             . "\t^" . "<" x ($cols-8) . "~~\n"
+             . '$entry' . "\n"
+             . ".\n";
+    print $format if $Debugging;
+    eval $format;
+    die $@ if $@;
+
+Which would generate a format looking something like this:
+
+ format STDOUT =
+ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $entry
+         ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+ $entry
+ .
+
+Here's a little program that's somewhat like fmt(1):
+
+ format =
+ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
+ $_
+
+ .
+
+ $/ = '';
+ while (<>) {
+     s/\s*\n\s*/ /g;
+     write;
+ }
+
+=head2 Footers
+X<format, footer> X<footer>
+
+While $FORMAT_TOP_NAME contains the name of the current header format,
+there is no corresponding mechanism to automatically do the same thing
+for a footer.  Not knowing how big a format is going to be until you
+evaluate it is one of the major problems.  It's on the TODO list.
+
+Here's one strategy:  If you have a fixed-size footer, you can get footers
+by checking $FORMAT_LINES_LEFT before each write() and print the footer
+yourself if necessary.
+
+Here's another strategy: Open a pipe to yourself, using C<open(MYSELF, "|-")>
+(see L<perlfunc/open()>) and always write() to MYSELF instead of STDOUT.
+Have your child process massage its STDIN to rearrange headers and footers
+however you like.  Not very convenient, but doable.
+
+=head2 Accessing Formatting Internals
+X<format, internals>
+
+For low-level access to the formatting mechanism.  you may use formline()
+and access C<$^A> (the $ACCUMULATOR variable) directly.
+
+For example:
+
+    $str = formline <<'END', 1,2,3;
+    @<<<  @|||  @>>>
+    END
+
+    print "Wow, I just stored `$^A' in the accumulator!\n";
+
+Or to make an swrite() subroutine, which is to write() what sprintf()
+is to printf(), do this:
+
+    use Carp;
+    sub swrite {
+	croak "usage: swrite PICTURE ARGS" unless @_;
+	my $format = shift;
+	$^A = "";
+	formline($format,@_);
+	return $^A;
+    }
+
+    $string = swrite(<<'END', 1, 2, 3);
+ Check me out
+ @<<<  @|||  @>>>
+ END
+    print $string;
+
+=head1 WARNINGS
+
+The lone dot that ends a format can also prematurely end a mail
+message passing through a misconfigured Internet mailer (and based on
+experience, such misconfiguration is the rule, not the exception).  So
+when sending format code through mail, you should indent it so that
+the format-ending dot is not on the left margin; this will prevent
+SMTP cutoff.
+
+Lexical variables (declared with "my") are not visible within a
+format unless the format is declared within the scope of the lexical
+variable.  (They weren't visible at all before version 5.001.)
+
+Formats are the only part of Perl that unconditionally use information
+from a program's locale; if a program's environment specifies an
+LC_NUMERIC locale, it is always used to specify the decimal point
+character in formatted output.  Perl ignores all other aspects of locale
+handling unless the C<use locale> pragma is in effect.  Formatted output
+cannot be controlled by C<use locale> because the pragma is tied to the
+block structure of the program, and, for historical reasons, formats
+exist outside that block structure.  See L<perllocale> for further
+discussion of locale handling.
+
+Within strings that are to be displayed in a fixed length text field,
+each control character is substituted by a space. (But remember the
+special meaning of C<\r> when using fill mode.) This is done to avoid
+misalignment when control characters "disappear" on some output media.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfreebsd.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfreebsd.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfreebsd.pod	(revision 14489)
@@ -0,0 +1,47 @@
+If you read this file _as_is_, just ignore the funny characters you
+see.  It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.freebsd - Perl version 5 on FreeBSD systems
+
+=head1 DESCRIPTION
+
+This document describes various features of FreeBSD that will affect how Perl
+version 5 (hereafter just Perl) is compiled and/or runs.
+
+=head2 FreeBSD core dumps from readdir_r with ithreads
+
+When perl is configured to use ithreads, it will use re-entrant library calls
+in preference to non-re-entrant versions.  There is a bug in FreeBSD's
+C<readdir_r> function in versions 4.5 and earlier that can cause a SEGV when
+reading large directories. A patch for FreeBSD libc is available
+(see http://www.freebsd.org/cgi/query-pr.cgi?pr=misc/30631 )
+which has been integrated into FreeBSD 4.6.
+
+=head2 $^X doesn't always contain a full path in FreeBSD
+
+perl 5.8.0 sets C<$^X> where possible to a full path by asking the operating
+system. On FreeBSD the full path of the perl interpreter is found by reading
+the symlink F</proc/curproc/file>. There is a bug on FreeBSD, where the
+result of reading this symlink is can be wrong in certain circumstances
+(see http://www.freebsd.org/cgi/query-pr.cgi?pr=35703 ).
+In these cases perl will fall back to the old behaviour of using C's
+argv[0] value for C<$^X>.
+
+=head2 Perl will no longer be part of "base FreeBSD"
+
+Not as bad as it sounds--what this means is that Perl will no longer be
+part of the B<kernel build system> of FreeBSD.  Perl will still very
+probably be part of the "default install", and in any case the latest
+version will be in the ports system.  The first FreeBSD version this
+change will affect is 5.0, all 4.n versions will keep the status quo.
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org>, collating wisdom supplied by Slaven Rezic
+and Tim Bunce.
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfunc.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfunc.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlfunc.pod	(revision 14489)
@@ -0,0 +1,7040 @@
+=head1 NAME
+X<function>
+
+perlfunc - Perl builtin functions
+
+=head1 DESCRIPTION
+
+The functions in this section can serve as terms in an expression.
+They fall into two major categories: list operators and named unary
+operators.  These differ in their precedence relationship with a
+following comma.  (See the precedence table in L<perlop>.)  List
+operators take more than one argument, while unary operators can never
+take more than one argument.  Thus, a comma terminates the argument of
+a unary operator, but merely separates the arguments of a list
+operator.  A unary operator generally provides a scalar context to its
+argument, while a list operator may provide either scalar or list
+contexts for its arguments.  If it does both, the scalar arguments will
+be first, and the list argument will follow.  (Note that there can ever
+be only one such list argument.)  For instance, splice() has three scalar
+arguments followed by a list, whereas gethostbyname() has four scalar
+arguments.
+
+In the syntax descriptions that follow, list operators that expect a
+list (and provide list context for the elements of the list) are shown
+with LIST as an argument.  Such a list may consist of any combination
+of scalar arguments or list values; the list values will be included
+in the list as if each individual element were interpolated at that
+point in the list, forming a longer single-dimensional list value.
+Commas should separate elements of the LIST.
+
+Any function in the list below may be used either with or without
+parentheses around its arguments.  (The syntax descriptions omit the
+parentheses.)  If you use the parentheses, the simple (but occasionally
+surprising) rule is this: It I<looks> like a function, therefore it I<is> a
+function, and precedence doesn't matter.  Otherwise it's a list
+operator or unary operator, and precedence does matter.  And whitespace
+between the function and left parenthesis doesn't count--so you need to
+be careful sometimes:
+
+    print 1+2+4;	# Prints 7.
+    print(1+2) + 4;	# Prints 3.
+    print (1+2)+4;	# Also prints 3!
+    print +(1+2)+4;	# Prints 7.
+    print ((1+2)+4);	# Prints 7.
+
+If you run Perl with the B<-w> switch it can warn you about this.  For
+example, the third line above produces:
+
+    print (...) interpreted as function at - line 1.
+    Useless use of integer addition in void context at - line 1.
+
+A few functions take no arguments at all, and therefore work as neither
+unary nor list operators.  These include such functions as C<time>
+and C<endpwent>.  For example, C<time+86_400> always means
+C<time() + 86_400>.
+
+For functions that can be used in either a scalar or list context,
+nonabortive failure is generally indicated in a scalar context by
+returning the undefined value, and in a list context by returning the
+null list.
+
+Remember the following important rule: There is B<no rule> that relates
+the behavior of an expression in list context to its behavior in scalar
+context, or vice versa.  It might do two totally different things.
+Each operator and function decides which sort of value it would be most
+appropriate to return in scalar context.  Some operators return the
+length of the list that would have been returned in list context.  Some
+operators return the first value in the list.  Some operators return the
+last value in the list.  Some operators return a count of successful
+operations.  In general, they do what you want, unless you want
+consistency.
+X<context>
+
+A named array in scalar context is quite different from what would at
+first glance appear to be a list in scalar context.  You can't get a list
+like C<(1,2,3)> into being in scalar context, because the compiler knows
+the context at compile time.  It would generate the scalar comma operator
+there, not the list construction version of the comma.  That means it
+was never a list to start with.
+
+In general, functions in Perl that serve as wrappers for system calls
+of the same name (like chown(2), fork(2), closedir(2), etc.) all return
+true when they succeed and C<undef> otherwise, as is usually mentioned
+in the descriptions below.  This is different from the C interfaces,
+which return C<-1> on failure.  Exceptions to this rule are C<wait>,
+C<waitpid>, and C<syscall>.  System calls also set the special C<$!>
+variable on failure.  Other functions do not, except accidentally.
+
+=head2 Perl Functions by Category
+X<function>
+
+Here are Perl's functions (including things that look like
+functions, like some keywords and named operators)
+arranged by category.  Some functions appear in more
+than one place.
+
+=over 4
+
+=item Functions for SCALARs or strings
+X<scalar> X<string> X<character>
+
+C<chomp>, C<chop>, C<chr>, C<crypt>, C<hex>, C<index>, C<lc>, C<lcfirst>,
+C<length>, C<oct>, C<ord>, C<pack>, C<q/STRING/>, C<qq/STRING/>, C<reverse>,
+C<rindex>, C<sprintf>, C<substr>, C<tr///>, C<uc>, C<ucfirst>, C<y///>
+
+=item Regular expressions and pattern matching
+X<regular expression> X<regex> X<regexp>
+
+C<m//>, C<pos>, C<quotemeta>, C<s///>, C<split>, C<study>, C<qr//>
+
+=item Numeric functions
+X<numeric> X<number> X<trigonometric> X<trigonometry>
+
+C<abs>, C<atan2>, C<cos>, C<exp>, C<hex>, C<int>, C<log>, C<oct>, C<rand>,
+C<sin>, C<sqrt>, C<srand>
+
+=item Functions for real @ARRAYs
+X<array>
+
+C<pop>, C<push>, C<shift>, C<splice>, C<unshift>
+
+=item Functions for list data
+X<list>
+
+C<grep>, C<join>, C<map>, C<qw/STRING/>, C<reverse>, C<sort>, C<unpack>
+
+=item Functions for real %HASHes
+X<hash>
+
+C<delete>, C<each>, C<exists>, C<keys>, C<values>
+
+=item Input and output functions
+X<I/O> X<input> X<output> X<dbm>
+
+C<binmode>, C<close>, C<closedir>, C<dbmclose>, C<dbmopen>, C<die>, C<eof>,
+C<fileno>, C<flock>, C<format>, C<getc>, C<print>, C<printf>, C<read>,
+C<readdir>, C<rewinddir>, C<seek>, C<seekdir>, C<select>, C<syscall>,
+C<sysread>, C<sysseek>, C<syswrite>, C<tell>, C<telldir>, C<truncate>,
+C<warn>, C<write>
+
+=item Functions for fixed length data or records
+
+C<pack>, C<read>, C<syscall>, C<sysread>, C<syswrite>, C<unpack>, C<vec>
+
+=item Functions for filehandles, files, or directories
+X<file> X<filehandle> X<directory> X<pipe> X<link> X<symlink>
+
+C<-I<X>>, C<chdir>, C<chmod>, C<chown>, C<chroot>, C<fcntl>, C<glob>,
+C<ioctl>, C<link>, C<lstat>, C<mkdir>, C<open>, C<opendir>,
+C<readlink>, C<rename>, C<rmdir>, C<stat>, C<symlink>, C<sysopen>,
+C<umask>, C<unlink>, C<utime>
+
+=item Keywords related to the control flow of your Perl program
+X<control flow>
+
+C<caller>, C<continue>, C<die>, C<do>, C<dump>, C<eval>, C<exit>,
+C<goto>, C<last>, C<next>, C<redo>, C<return>, C<sub>, C<wantarray>
+
+=item Keywords related to scoping
+
+C<caller>, C<import>, C<local>, C<my>, C<our>, C<package>, C<use>
+
+=item Miscellaneous functions
+
+C<defined>, C<dump>, C<eval>, C<formline>, C<local>, C<my>, C<our>, C<reset>,
+C<scalar>, C<undef>, C<wantarray>
+
+=item Functions for processes and process groups
+X<process> X<pid> X<process id>
+
+C<alarm>, C<exec>, C<fork>, C<getpgrp>, C<getppid>, C<getpriority>, C<kill>,
+C<pipe>, C<qx/STRING/>, C<setpgrp>, C<setpriority>, C<sleep>, C<system>,
+C<times>, C<wait>, C<waitpid>
+
+=item Keywords related to perl modules
+X<module>
+
+C<do>, C<import>, C<no>, C<package>, C<require>, C<use>
+
+=item Keywords related to classes and object-orientedness
+X<object> X<class> X<package>
+
+C<bless>, C<dbmclose>, C<dbmopen>, C<package>, C<ref>, C<tie>, C<tied>,
+C<untie>, C<use>
+
+=item Low-level socket functions
+X<socket> X<sock>
+
+C<accept>, C<bind>, C<connect>, C<getpeername>, C<getsockname>,
+C<getsockopt>, C<listen>, C<recv>, C<send>, C<setsockopt>, C<shutdown>,
+C<socket>, C<socketpair>
+
+=item System V interprocess communication functions
+X<IPC> X<System V> X<semaphore> X<shared memory> X<memory> X<message>
+
+C<msgctl>, C<msgget>, C<msgrcv>, C<msgsnd>, C<semctl>, C<semget>, C<semop>,
+C<shmctl>, C<shmget>, C<shmread>, C<shmwrite>
+
+=item Fetching user and group info
+X<user> X<group> X<password> X<uid> X<gid>  X<passwd> X</etc/passwd>
+
+C<endgrent>, C<endhostent>, C<endnetent>, C<endpwent>, C<getgrent>,
+C<getgrgid>, C<getgrnam>, C<getlogin>, C<getpwent>, C<getpwnam>,
+C<getpwuid>, C<setgrent>, C<setpwent>
+
+=item Fetching network info
+X<network> X<protocol> X<host> X<hostname> X<IP> X<address> X<service>
+
+C<endprotoent>, C<endservent>, C<gethostbyaddr>, C<gethostbyname>,
+C<gethostent>, C<getnetbyaddr>, C<getnetbyname>, C<getnetent>,
+C<getprotobyname>, C<getprotobynumber>, C<getprotoent>,
+C<getservbyname>, C<getservbyport>, C<getservent>, C<sethostent>,
+C<setnetent>, C<setprotoent>, C<setservent>
+
+=item Time-related functions
+X<time> X<date>
+
+C<gmtime>, C<localtime>, C<time>, C<times>
+
+=item Functions new in perl5
+X<perl5>
+
+C<abs>, C<bless>, C<chomp>, C<chr>, C<exists>, C<formline>, C<glob>,
+C<import>, C<lc>, C<lcfirst>, C<map>, C<my>, C<no>, C<our>, C<prototype>,
+C<qx>, C<qw>, C<readline>, C<readpipe>, C<ref>, C<sub*>, C<sysopen>, C<tie>,
+C<tied>, C<uc>, C<ucfirst>, C<untie>, C<use>
+
+* - C<sub> was a keyword in perl4, but in perl5 it is an
+operator, which can be used in expressions.
+
+=item Functions obsoleted in perl5
+
+C<dbmclose>, C<dbmopen>
+
+=back
+
+=head2 Portability
+X<portability> X<Unix> X<portable>
+
+Perl was born in Unix and can therefore access all common Unix
+system calls.  In non-Unix environments, the functionality of some
+Unix system calls may not be available, or details of the available
+functionality may differ slightly.  The Perl functions affected
+by this are:
+
+C<-X>, C<binmode>, C<chmod>, C<chown>, C<chroot>, C<crypt>,
+C<dbmclose>, C<dbmopen>, C<dump>, C<endgrent>, C<endhostent>,
+C<endnetent>, C<endprotoent>, C<endpwent>, C<endservent>, C<exec>,
+C<fcntl>, C<flock>, C<fork>, C<getgrent>, C<getgrgid>, C<gethostbyname>,
+C<gethostent>, C<getlogin>, C<getnetbyaddr>, C<getnetbyname>, C<getnetent>,
+C<getppid>, C<getpgrp>, C<getpriority>, C<getprotobynumber>,
+C<getprotoent>, C<getpwent>, C<getpwnam>, C<getpwuid>,
+C<getservbyport>, C<getservent>, C<getsockopt>, C<glob>, C<ioctl>,
+C<kill>, C<link>, C<lstat>, C<msgctl>, C<msgget>, C<msgrcv>,
+C<msgsnd>, C<open>, C<pipe>, C<readlink>, C<rename>, C<select>, C<semctl>,
+C<semget>, C<semop>, C<setgrent>, C<sethostent>, C<setnetent>,
+C<setpgrp>, C<setpriority>, C<setprotoent>, C<setpwent>,
+C<setservent>, C<setsockopt>, C<shmctl>, C<shmget>, C<shmread>,
+C<shmwrite>, C<socket>, C<socketpair>,
+C<stat>, C<symlink>, C<syscall>, C<sysopen>, C<system>,
+C<times>, C<truncate>, C<umask>, C<unlink>,
+C<utime>, C<wait>, C<waitpid>
+
+For more information about the portability of these functions, see
+L<perlport> and other available platform-specific documentation.
+
+=head2 Alphabetical Listing of Perl Functions
+
+=over 8
+
+=item -X FILEHANDLE
+X<-r>X<-w>X<-x>X<-o>X<-R>X<-W>X<-X>X<-O>X<-e>X<-z>X<-s>X<-f>X<-d>X<-l>X<-p>
+X<-S>X<-b>X<-c>X<-t>X<-u>X<-g>X<-k>X<-T>X<-B>X<-M>X<-A>X<-C>
+
+=item -X EXPR
+
+=item -X
+
+A file test, where X is one of the letters listed below.  This unary
+operator takes one argument, either a filename or a filehandle, and
+tests the associated file to see if something is true about it.  If the
+argument is omitted, tests C<$_>, except for C<-t>, which tests STDIN.
+Unless otherwise documented, it returns C<1> for true and C<''> for false, or
+the undefined value if the file doesn't exist.  Despite the funny
+names, precedence is the same as any other named unary operator, and
+the argument may be parenthesized like any other unary operator.  The
+operator may be any of:
+
+    -r	File is readable by effective uid/gid.
+    -w	File is writable by effective uid/gid.
+    -x	File is executable by effective uid/gid.
+    -o	File is owned by effective uid.
+
+    -R	File is readable by real uid/gid.
+    -W	File is writable by real uid/gid.
+    -X	File is executable by real uid/gid.
+    -O	File is owned by real uid.
+
+    -e	File exists.
+    -z	File has zero size (is empty).
+    -s	File has nonzero size (returns size in bytes).
+
+    -f	File is a plain file.
+    -d	File is a directory.
+    -l	File is a symbolic link.
+    -p	File is a named pipe (FIFO), or Filehandle is a pipe.
+    -S	File is a socket.
+    -b	File is a block special file.
+    -c	File is a character special file.
+    -t	Filehandle is opened to a tty.
+
+    -u	File has setuid bit set.
+    -g	File has setgid bit set.
+    -k	File has sticky bit set.
+
+    -T	File is an ASCII text file (heuristic guess).
+    -B	File is a "binary" file (opposite of -T).
+
+    -M	Script start time minus file modification time, in days.
+    -A	Same for access time.
+    -C	Same for inode change time (Unix, may differ for other platforms)
+
+Example:
+
+    while (<>) {
+	chomp;
+	next unless -f $_;	# ignore specials
+	#...
+    }
+
+The interpretation of the file permission operators C<-r>, C<-R>,
+C<-w>, C<-W>, C<-x>, and C<-X> is by default based solely on the mode
+of the file and the uids and gids of the user.  There may be other
+reasons you can't actually read, write, or execute the file.  Such
+reasons may be for example network filesystem access controls, ACLs
+(access control lists), read-only filesystems, and unrecognized
+executable formats.
+
+Also note that, for the superuser on the local filesystems, the C<-r>,
+C<-R>, C<-w>, and C<-W> tests always return 1, and C<-x> and C<-X> return 1
+if any execute bit is set in the mode.  Scripts run by the superuser
+may thus need to do a stat() to determine the actual mode of the file,
+or temporarily set their effective uid to something else.
+
+If you are using ACLs, there is a pragma called C<filetest> that may
+produce more accurate results than the bare stat() mode bits.
+When under the C<use filetest 'access'> the above-mentioned filetests
+will test whether the permission can (not) be granted using the
+access() family of system calls.  Also note that the C<-x> and C<-X> may
+under this pragma return true even if there are no execute permission
+bits set (nor any extra execute permission ACLs).  This strangeness is
+due to the underlying system calls' definitions.  Read the
+documentation for the C<filetest> pragma for more information.
+
+Note that C<-s/a/b/> does not do a negated substitution.  Saying
+C<-exp($foo)> still works as expected, however--only single letters
+following a minus are interpreted as file tests.
+
+The C<-T> and C<-B> switches work as follows.  The first block or so of the
+file is examined for odd characters such as strange control codes or
+characters with the high bit set.  If too many strange characters (>30%)
+are found, it's a C<-B> file; otherwise it's a C<-T> file.  Also, any file
+containing null in the first block is considered a binary file.  If C<-T>
+or C<-B> is used on a filehandle, the current IO buffer is examined
+rather than the first block.  Both C<-T> and C<-B> return true on a null
+file, or a file at EOF when testing a filehandle.  Because you have to
+read a file to do the C<-T> test, on most occasions you want to use a C<-f>
+against the file first, as in C<next unless -f $file && -T $file>.
+
+If any of the file tests (or either the C<stat> or C<lstat> operators) are given
+the special filehandle consisting of a solitary underline, then the stat
+structure of the previous file test (or stat operator) is used, saving
+a system call.  (This doesn't work with C<-t>, and you need to remember
+that lstat() and C<-l> will leave values in the stat structure for the
+symbolic link, not the real file.)  (Also, if the stat buffer was filled by
+an C<lstat> call, C<-T> and C<-B> will reset it with the results of C<stat _>).
+Example:
+
+    print "Can do.\n" if -r $a || -w _ || -x _;
+
+    stat($filename);
+    print "Readable\n" if -r _;
+    print "Writable\n" if -w _;
+    print "Executable\n" if -x _;
+    print "Setuid\n" if -u _;
+    print "Setgid\n" if -g _;
+    print "Sticky\n" if -k _;
+    print "Text\n" if -T _;
+    print "Binary\n" if -B _;
+
+=item abs VALUE
+X<abs> X<absolute>
+
+=item abs
+
+Returns the absolute value of its argument.
+If VALUE is omitted, uses C<$_>.
+
+=item accept NEWSOCKET,GENERICSOCKET
+X<accept>
+
+Accepts an incoming socket connect, just as the accept(2) system call
+does.  Returns the packed address if it succeeded, false otherwise.
+See the example in L<perlipc/"Sockets: Client/Server Communication">.
+
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptor, as determined by the
+value of $^F.  See L<perlvar/$^F>.
+
+=item alarm SECONDS
+X<alarm>
+X<SIGALRM>
+X<timer>
+
+=item alarm
+
+Arranges to have a SIGALRM delivered to this process after the
+specified number of wallclock seconds has elapsed.  If SECONDS is not
+specified, the value stored in C<$_> is used. (On some machines,
+unfortunately, the elapsed time may be up to one second less or more
+than you specified because of how seconds are counted, and process
+scheduling may delay the delivery of the signal even further.)
+
+Only one timer may be counting at once.  Each call disables the
+previous timer, and an argument of C<0> may be supplied to cancel the
+previous timer without starting a new one.  The returned value is the
+amount of time remaining on the previous timer.
+
+For delays of finer granularity than one second, you may use Perl's
+four-argument version of select() leaving the first three arguments
+undefined, or you might be able to use the C<syscall> interface to
+access setitimer(2) if your system supports it.  The Time::HiRes
+module (from CPAN, and starting from Perl 5.8 part of the standard
+distribution) may also prove useful.
+
+It is usually a mistake to intermix C<alarm> and C<sleep> calls.
+(C<sleep> may be internally implemented in your system with C<alarm>)
+
+If you want to use C<alarm> to time out a system call you need to use an
+C<eval>/C<die> pair.  You can't rely on the alarm causing the system call to
+fail with C<$!> set to C<EINTR> because Perl sets up signal handlers to
+restart system calls on some systems.  Using C<eval>/C<die> always works,
+modulo the caveats given in L<perlipc/"Signals">.
+
+    eval {
+	local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
+	alarm $timeout;
+	$nread = sysread SOCKET, $buffer, $size;
+	alarm 0;
+    };
+    if ($@) {
+	die unless $@ eq "alarm\n";   # propagate unexpected errors
+    	# timed out
+    }
+    else {
+    	# didn't
+    }
+
+For more information see L<perlipc>.
+
+=item atan2 Y,X
+X<atan2> X<arctangent> X<tan> X<tangent>
+
+Returns the arctangent of Y/X in the range -PI to PI.
+
+For the tangent operation, you may use the C<Math::Trig::tan>
+function, or use the familiar relation:
+
+    sub tan { sin($_[0]) / cos($_[0])  }
+
+Note that atan2(0, 0) is not well-defined.
+
+=item bind SOCKET,NAME
+X<bind>
+
+Binds a network address to a socket, just as the bind system call
+does.  Returns true if it succeeded, false otherwise.  NAME should be a
+packed address of the appropriate type for the socket.  See the examples in
+L<perlipc/"Sockets: Client/Server Communication">.
+
+=item binmode FILEHANDLE, LAYER
+X<binmode> X<binary> X<text> X<DOS> X<Windows>
+
+=item binmode FILEHANDLE
+
+Arranges for FILEHANDLE to be read or written in "binary" or "text"
+mode on systems where the run-time libraries distinguish between
+binary and text files.  If FILEHANDLE is an expression, the value is
+taken as the name of the filehandle.  Returns true on success,
+otherwise it returns C<undef> and sets C<$!> (errno).
+
+On some systems (in general, DOS and Windows-based systems) binmode()
+is necessary when you're not working with a text file.  For the sake
+of portability it is a good idea to always use it when appropriate,
+and to never use it when it isn't appropriate.  Also, people can
+set their I/O to be by default UTF-8 encoded Unicode, not bytes.
+
+In other words: regardless of platform, use binmode() on binary data,
+like for example images.
+
+If LAYER is present it is a single string, but may contain multiple
+directives. The directives alter the behaviour of the file handle.
+When LAYER is present using binmode on text file makes sense.
+
+If LAYER is omitted or specified as C<:raw> the filehandle is made
+suitable for passing binary data. This includes turning off possible CRLF
+translation and marking it as bytes (as opposed to Unicode characters).
+Note that, despite what may be implied in I<"Programming Perl"> (the
+Camel) or elsewhere, C<:raw> is I<not> the simply inverse of C<:crlf>
+-- other layers which would affect binary nature of the stream are
+I<also> disabled. See L<PerlIO>, L<perlrun> and the discussion about the
+PERLIO environment variable.
+
+The C<:bytes>, C<:crlf>, and C<:utf8>, and any other directives of the
+form C<:...>, are called I/O I<layers>.  The C<open> pragma can be used to
+establish default I/O layers.  See L<open>.
+
+I<The LAYER parameter of the binmode() function is described as "DISCIPLINE"
+in "Programming Perl, 3rd Edition".  However, since the publishing of this
+book, by many known as "Camel III", the consensus of the naming of this
+functionality has moved from "discipline" to "layer".  All documentation
+of this version of Perl therefore refers to "layers" rather than to
+"disciplines".  Now back to the regularly scheduled documentation...>
+
+To mark FILEHANDLE as UTF-8, use C<:utf8>.
+
+In general, binmode() should be called after open() but before any I/O
+is done on the filehandle.  Calling binmode() will normally flush any
+pending buffered output data (and perhaps pending input data) on the
+handle.  An exception to this is the C<:encoding> layer that
+changes the default character encoding of the handle, see L<open>.
+The C<:encoding> layer sometimes needs to be called in
+mid-stream, and it doesn't flush the stream.  The C<:encoding>
+also implicitly pushes on top of itself the C<:utf8> layer because
+internally Perl will operate on UTF-8 encoded Unicode characters.
+
+The operating system, device drivers, C libraries, and Perl run-time
+system all work together to let the programmer treat a single
+character (C<\n>) as the line terminator, irrespective of the external
+representation.  On many operating systems, the native text file
+representation matches the internal representation, but on some
+platforms the external representation of C<\n> is made up of more than
+one character.
+
+Mac OS, all variants of Unix, and Stream_LF files on VMS use a single
+character to end each line in the external representation of text (even
+though that single character is CARRIAGE RETURN on Mac OS and LINE FEED
+on Unix and most VMS files). In other systems like OS/2, DOS and the
+various flavors of MS-Windows your program sees a C<\n> as a simple C<\cJ>,
+but what's stored in text files are the two characters C<\cM\cJ>.  That
+means that, if you don't use binmode() on these systems, C<\cM\cJ>
+sequences on disk will be converted to C<\n> on input, and any C<\n> in
+your program will be converted back to C<\cM\cJ> on output.  This is what
+you want for text files, but it can be disastrous for binary files.
+
+Another consequence of using binmode() (on some systems) is that
+special end-of-file markers will be seen as part of the data stream.
+For systems from the Microsoft family this means that if your binary
+data contains C<\cZ>, the I/O subsystem will regard it as the end of
+the file, unless you use binmode().
+
+binmode() is not only important for readline() and print() operations,
+but also when using read(), seek(), sysread(), syswrite() and tell()
+(see L<perlport> for more details).  See the C<$/> and C<$\> variables
+in L<perlvar> for how to manually set your input and output
+line-termination sequences.
+
+=item bless REF,CLASSNAME
+X<bless>
+
+=item bless REF
+
+This function tells the thingy referenced by REF that it is now an object
+in the CLASSNAME package.  If CLASSNAME is omitted, the current package
+is used.  Because a C<bless> is often the last thing in a constructor,
+it returns the reference for convenience.  Always use the two-argument
+version if a derived class might inherit the function doing the blessing.
+See L<perltoot> and L<perlobj> for more about the blessing (and blessings)
+of objects.
+
+Consider always blessing objects in CLASSNAMEs that are mixed case.
+Namespaces with all lowercase names are considered reserved for
+Perl pragmata.  Builtin types have all uppercase names. To prevent
+confusion, you may wish to avoid such package names as well.  Make sure
+that CLASSNAME is a true value.
+
+See L<perlmod/"Perl Modules">.
+
+=item caller EXPR
+X<caller> X<call stack> X<stack> X<stack trace>
+
+=item caller
+
+Returns the context of the current subroutine call.  In scalar context,
+returns the caller's package name if there is a caller, that is, if
+we're in a subroutine or C<eval> or C<require>, and the undefined value
+otherwise.  In list context, returns
+
+    ($package, $filename, $line) = caller;
+
+With EXPR, it returns some extra information that the debugger uses to
+print a stack trace.  The value of EXPR indicates how many call frames
+to go back before the current one.
+
+    ($package, $filename, $line, $subroutine, $hasargs,
+    $wantarray, $evaltext, $is_require, $hints, $bitmask) = caller($i);
+
+Here $subroutine may be C<(eval)> if the frame is not a subroutine
+call, but an C<eval>.  In such a case additional elements $evaltext and
+C<$is_require> are set: C<$is_require> is true if the frame is created by a
+C<require> or C<use> statement, $evaltext contains the text of the
+C<eval EXPR> statement.  In particular, for an C<eval BLOCK> statement,
+$filename is C<(eval)>, but $evaltext is undefined.  (Note also that
+each C<use> statement creates a C<require> frame inside an C<eval EXPR>
+frame.)  $subroutine may also be C<(unknown)> if this particular
+subroutine happens to have been deleted from the symbol table.
+C<$hasargs> is true if a new instance of C<@_> was set up for the frame.
+C<$hints> and C<$bitmask> contain pragmatic hints that the caller was
+compiled with.  The C<$hints> and C<$bitmask> values are subject to change
+between versions of Perl, and are not meant for external use.
+
+Furthermore, when called from within the DB package, caller returns more
+detailed information: it sets the list variable C<@DB::args> to be the
+arguments with which the subroutine was invoked.
+
+Be aware that the optimizer might have optimized call frames away before
+C<caller> had a chance to get the information.  That means that C<caller(N)>
+might not return information about the call frame you expect it do, for
+C<< N > 1 >>.  In particular, C<@DB::args> might have information from the
+previous time C<caller> was called.
+
+=item chdir EXPR
+X<chdir>
+X<cd>
+
+=item chdir FILEHANDLE
+
+=item chdir DIRHANDLE
+
+=item chdir
+
+Changes the working directory to EXPR, if possible. If EXPR is omitted,
+changes to the directory specified by C<$ENV{HOME}>, if set; if not,
+changes to the directory specified by C<$ENV{LOGDIR}>. (Under VMS, the
+variable C<$ENV{SYS$LOGIN}> is also checked, and used if it is set.) If
+neither is set, C<chdir> does nothing. It returns true upon success,
+false otherwise. See the example under C<die>.
+
+On systems that support fchdir, you might pass a file handle or
+directory handle as argument.  On systems that don't support fchdir,
+passing handles produces a fatal error at run time.
+
+=item chmod LIST
+X<chmod> X<permission> X<mode>
+
+Changes the permissions of a list of files.  The first element of the
+list must be the numerical mode, which should probably be an octal
+number, and which definitely should I<not> be a string of octal digits:
+C<0644> is okay, C<'0644'> is not.  Returns the number of files
+successfully changed.  See also L</oct>, if all you have is a string.
+
+    $cnt = chmod 0755, 'foo', 'bar';
+    chmod 0755, @executables;
+    $mode = '0644'; chmod $mode, 'foo';      # !!! sets mode to
+                                             # --w----r-T
+    $mode = '0644'; chmod oct($mode), 'foo'; # this is better
+    $mode = 0644;   chmod $mode, 'foo';      # this is best
+
+On systems that support fchmod, you might pass file handles among the
+files.  On systems that don't support fchmod, passing file handles
+produces a fatal error at run time.
+
+    open(my $fh, "<", "foo");
+    my $perm = (stat $fh)[2] & 07777;
+    chmod($perm | 0600, $fh);
+
+You can also import the symbolic C<S_I*> constants from the Fcntl
+module:
+
+    use Fcntl ':mode';
+
+    chmod S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, @executables;
+    # This is identical to the chmod 0755 of the above example.
+
+=item chomp VARIABLE
+X<chomp> X<INPUT_RECORD_SEPARATOR> X<$/> X<newline> X<eol>
+
+=item chomp( LIST )
+
+=item chomp
+
+This safer version of L</chop> removes any trailing string
+that corresponds to the current value of C<$/> (also known as
+$INPUT_RECORD_SEPARATOR in the C<English> module).  It returns the total
+number of characters removed from all its arguments.  It's often used to
+remove the newline from the end of an input record when you're worried
+that the final record may be missing its newline.  When in paragraph
+mode (C<$/ = "">), it removes all trailing newlines from the string.
+When in slurp mode (C<$/ = undef>) or fixed-length record mode (C<$/> is
+a reference to an integer or the like, see L<perlvar>) chomp() won't
+remove anything.
+If VARIABLE is omitted, it chomps C<$_>.  Example:
+
+    while (<>) {
+	chomp;	# avoid \n on last field
+	@array = split(/:/);
+	# ...
+    }
+
+If VARIABLE is a hash, it chomps the hash's values, but not its keys.
+
+You can actually chomp anything that's an lvalue, including an assignment:
+
+    chomp($cwd = `pwd`);
+    chomp($answer = <STDIN>);
+
+If you chomp a list, each element is chomped, and the total number of
+characters removed is returned.
+
+If the C<encoding> pragma is in scope then the lengths returned are
+calculated from the length of C<$/> in Unicode characters, which is not
+always the same as the length of C<$/> in the native encoding.
+
+Note that parentheses are necessary when you're chomping anything
+that is not a simple variable.  This is because C<chomp $cwd = `pwd`;>
+is interpreted as C<(chomp $cwd) = `pwd`;>, rather than as
+C<chomp( $cwd = `pwd` )> which you might expect.  Similarly,
+C<chomp $a, $b> is interpreted as C<chomp($a), $b> rather than
+as C<chomp($a, $b)>.
+
+=item chop VARIABLE
+X<chop>
+
+=item chop( LIST )
+
+=item chop
+
+Chops off the last character of a string and returns the character
+chopped.  It is much more efficient than C<s/.$//s> because it neither
+scans nor copies the string.  If VARIABLE is omitted, chops C<$_>.
+If VARIABLE is a hash, it chops the hash's values, but not its keys.
+
+You can actually chop anything that's an lvalue, including an assignment.
+
+If you chop a list, each element is chopped.  Only the value of the
+last C<chop> is returned.
+
+Note that C<chop> returns the last character.  To return all but the last
+character, use C<substr($string, 0, -1)>.
+
+See also L</chomp>.
+
+=item chown LIST
+X<chown> X<owner> X<user> X<group>
+
+Changes the owner (and group) of a list of files.  The first two
+elements of the list must be the I<numeric> uid and gid, in that
+order.  A value of -1 in either position is interpreted by most
+systems to leave that value unchanged.  Returns the number of files
+successfully changed.
+
+    $cnt = chown $uid, $gid, 'foo', 'bar';
+    chown $uid, $gid, @filenames;
+
+On systems that support fchown, you might pass file handles among the
+files.  On systems that don't support fchown, passing file handles
+produces a fatal error at run time.
+
+Here's an example that looks up nonnumeric uids in the passwd file:
+
+    print "User: ";
+    chomp($user = <STDIN>);
+    print "Files: ";
+    chomp($pattern = <STDIN>);
+
+    ($login,$pass,$uid,$gid) = getpwnam($user)
+	or die "$user not in passwd file";
+
+    @ary = glob($pattern);	# expand filenames
+    chown $uid, $gid, @ary;
+
+On most systems, you are not allowed to change the ownership of the
+file unless you're the superuser, although you should be able to change
+the group to any of your secondary groups.  On insecure systems, these
+restrictions may be relaxed, but this is not a portable assumption.
+On POSIX systems, you can detect this condition this way:
+
+    use POSIX qw(sysconf _PC_CHOWN_RESTRICTED);
+    $can_chown_giveaway = not sysconf(_PC_CHOWN_RESTRICTED);
+
+=item chr NUMBER
+X<chr> X<character> X<ASCII> X<Unicode>
+
+=item chr
+
+Returns the character represented by that NUMBER in the character set.
+For example, C<chr(65)> is C<"A"> in either ASCII or Unicode, and
+chr(0x263a) is a Unicode smiley face.  Note that characters from 128
+to 255 (inclusive) are by default not encoded in UTF-8 Unicode for
+backward compatibility reasons (but see L<encoding>).
+
+If NUMBER is omitted, uses C<$_>.
+
+For the reverse, use L</ord>.
+
+Note that under the C<bytes> pragma the NUMBER is masked to
+the low eight bits.
+
+See L<perlunicode> and L<encoding> for more about Unicode.
+
+=item chroot FILENAME
+X<chroot> X<root>
+
+=item chroot
+
+This function works like the system call by the same name: it makes the
+named directory the new root directory for all further pathnames that
+begin with a C</> by your process and all its children.  (It doesn't
+change your current working directory, which is unaffected.)  For security
+reasons, this call is restricted to the superuser.  If FILENAME is
+omitted, does a C<chroot> to C<$_>.
+
+=item close FILEHANDLE
+X<close>
+
+=item close
+
+Closes the file or pipe associated with the file handle, returning
+true only if IO buffers are successfully flushed and closes the system
+file descriptor.  Closes the currently selected filehandle if the
+argument is omitted.
+
+You don't have to close FILEHANDLE if you are immediately going to do
+another C<open> on it, because C<open> will close it for you.  (See
+C<open>.)  However, an explicit C<close> on an input file resets the line
+counter (C<$.>), while the implicit close done by C<open> does not.
+
+If the file handle came from a piped open, C<close> will additionally
+return false if one of the other system calls involved fails, or if the
+program exits with non-zero status.  (If the only problem was that the
+program exited non-zero, C<$!> will be set to C<0>.)  Closing a pipe
+also waits for the process executing on the pipe to complete, in case you
+want to look at the output of the pipe afterwards, and
+implicitly puts the exit status value of that command into C<$?>.
+
+Prematurely closing the read end of a pipe (i.e. before the process
+writing to it at the other end has closed it) will result in a
+SIGPIPE being delivered to the writer.  If the other end can't
+handle that, be sure to read all the data before closing the pipe.
+
+Example:
+
+    open(OUTPUT, '|sort >foo')  # pipe to sort
+        or die "Can't start sort: $!";
+    #...			# print stuff to output
+    close OUTPUT		# wait for sort to finish
+        or warn $! ? "Error closing sort pipe: $!"
+                   : "Exit status $? from sort";
+    open(INPUT, 'foo')		# get sort's results
+        or die "Can't open 'foo' for input: $!";
+
+FILEHANDLE may be an expression whose value can be used as an indirect
+filehandle, usually the real filehandle name.
+
+=item closedir DIRHANDLE
+X<closedir>
+
+Closes a directory opened by C<opendir> and returns the success of that
+system call.
+
+=item connect SOCKET,NAME
+X<connect>
+
+Attempts to connect to a remote socket, just as the connect system call
+does.  Returns true if it succeeded, false otherwise.  NAME should be a
+packed address of the appropriate type for the socket.  See the examples in
+L<perlipc/"Sockets: Client/Server Communication">.
+
+=item continue BLOCK
+X<continue>
+
+C<continue> is actually a flow control statement rather than a function.  If
+there is a C<continue> BLOCK attached to a BLOCK (typically in a C<while> or
+C<foreach>), it is always executed just before the conditional is about to
+be evaluated again, just like the third part of a C<for> loop in C.  Thus
+it can be used to increment a loop variable, even when the loop has been
+continued via the C<next> statement (which is similar to the C C<continue>
+statement).
+
+C<last>, C<next>, or C<redo> may appear within a C<continue>
+block.  C<last> and C<redo> will behave as if they had been executed within
+the main block.  So will C<next>, but since it will execute a C<continue>
+block, it may be more entertaining.
+
+    while (EXPR) {
+	### redo always comes here
+	do_something;
+    } continue {
+	### next always comes here
+	do_something_else;
+	# then back the top to re-check EXPR
+    }
+    ### last always comes here
+
+Omitting the C<continue> section is semantically equivalent to using an
+empty one, logically enough.  In that case, C<next> goes directly back
+to check the condition at the top of the loop.
+
+=item cos EXPR
+X<cos> X<cosine> X<acos> X<arccosine>
+
+=item cos
+
+Returns the cosine of EXPR (expressed in radians).  If EXPR is omitted,
+takes cosine of C<$_>.
+
+For the inverse cosine operation, you may use the C<Math::Trig::acos()>
+function, or use this relation:
+
+    sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) }
+
+=item crypt PLAINTEXT,SALT
+X<crypt> X<digest> X<hash> X<salt> X<plaintext> X<password>
+X<decrypt> X<cryptography> X<passwd>
+
+Creates a digest string exactly like the crypt(3) function in the C
+library (assuming that you actually have a version there that has not
+been extirpated as a potential munitions).
+
+crypt() is a one-way hash function.  The PLAINTEXT and SALT is turned
+into a short string, called a digest, which is returned.  The same
+PLAINTEXT and SALT will always return the same string, but there is no
+(known) way to get the original PLAINTEXT from the hash.  Small
+changes in the PLAINTEXT or SALT will result in large changes in the
+digest.
+
+There is no decrypt function.  This function isn't all that useful for
+cryptography (for that, look for F<Crypt> modules on your nearby CPAN
+mirror) and the name "crypt" is a bit of a misnomer.  Instead it is
+primarily used to check if two pieces of text are the same without
+having to transmit or store the text itself.  An example is checking
+if a correct password is given.  The digest of the password is stored,
+not the password itself.  The user types in a password that is
+crypt()'d with the same salt as the stored digest.  If the two digests
+match the password is correct.
+
+When verifying an existing digest string you should use the digest as
+the salt (like C<crypt($plain, $digest) eq $digest>).  The SALT used
+to create the digest is visible as part of the digest.  This ensures
+crypt() will hash the new string with the same salt as the digest.
+This allows your code to work with the standard L<crypt|/crypt> and
+with more exotic implementations.  In other words, do not assume
+anything about the returned string itself, or how many bytes in the
+digest matter.
+
+Traditionally the result is a string of 13 bytes: two first bytes of
+the salt, followed by 11 bytes from the set C<[./0-9A-Za-z]>, and only
+the first eight bytes of the digest string mattered, but alternative
+hashing schemes (like MD5), higher level security schemes (like C2),
+and implementations on non-UNIX platforms may produce different
+strings.
+
+When choosing a new salt create a random two character string whose
+characters come from the set C<[./0-9A-Za-z]> (like C<join '', ('.',
+'/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]>).  This set of
+characters is just a recommendation; the characters allowed in
+the salt depend solely on your system's crypt library, and Perl can't
+restrict what salts C<crypt()> accepts.
+
+Here's an example that makes sure that whoever runs this program knows
+their password:
+
+    $pwd = (getpwuid($<))[1];
+
+    system "stty -echo";
+    print "Password: ";
+    chomp($word = <STDIN>);
+    print "\n";
+    system "stty echo";
+
+    if (crypt($word, $pwd) ne $pwd) {
+	die "Sorry...\n";
+    } else {
+	print "ok\n";
+    }
+
+Of course, typing in your own password to whoever asks you
+for it is unwise.
+
+The L<crypt|/crypt> function is unsuitable for hashing large quantities
+of data, not least of all because you can't get the information
+back.  Look at the L<Digest> module for more robust algorithms.
+
+If using crypt() on a Unicode string (which I<potentially> has
+characters with codepoints above 255), Perl tries to make sense
+of the situation by trying to downgrade (a copy of the string)
+the string back to an eight-bit byte string before calling crypt()
+(on that copy).  If that works, good.  If not, crypt() dies with
+C<Wide character in crypt>.
+
+=item dbmclose HASH
+X<dbmclose>
+
+[This function has been largely superseded by the C<untie> function.]
+
+Breaks the binding between a DBM file and a hash.
+
+=item dbmopen HASH,DBNAME,MASK
+X<dbmopen> X<dbm> X<ndbm> X<sdbm> X<gdbm>
+
+[This function has been largely superseded by the C<tie> function.]
+
+This binds a dbm(3), ndbm(3), sdbm(3), gdbm(3), or Berkeley DB file to a
+hash.  HASH is the name of the hash.  (Unlike normal C<open>, the first
+argument is I<not> a filehandle, even though it looks like one).  DBNAME
+is the name of the database (without the F<.dir> or F<.pag> extension if
+any).  If the database does not exist, it is created with protection
+specified by MASK (as modified by the C<umask>).  If your system supports
+only the older DBM functions, you may perform only one C<dbmopen> in your
+program.  In older versions of Perl, if your system had neither DBM nor
+ndbm, calling C<dbmopen> produced a fatal error; it now falls back to
+sdbm(3).
+
+If you don't have write access to the DBM file, you can only read hash
+variables, not set them.  If you want to test whether you can write,
+either use file tests or try setting a dummy hash entry inside an C<eval>,
+which will trap the error.
+
+Note that functions such as C<keys> and C<values> may return huge lists
+when used on large DBM files.  You may prefer to use the C<each>
+function to iterate over large DBM files.  Example:
+
+    # print out history file offsets
+    dbmopen(%HIST,'/usr/lib/news/history',0666);
+    while (($key,$val) = each %HIST) {
+	print $key, ' = ', unpack('L',$val), "\n";
+    }
+    dbmclose(%HIST);
+
+See also L<AnyDBM_File> for a more general description of the pros and
+cons of the various dbm approaches, as well as L<DB_File> for a particularly
+rich implementation.
+
+You can control which DBM library you use by loading that library
+before you call dbmopen():
+
+    use DB_File;
+    dbmopen(%NS_Hist, "$ENV{HOME}/.netscape/history.db")
+	or die "Can't open netscape history file: $!";
+
+=item defined EXPR
+X<defined> X<undef> X<undefined>
+
+=item defined
+
+Returns a Boolean value telling whether EXPR has a value other than
+the undefined value C<undef>.  If EXPR is not present, C<$_> will be
+checked.
+
+Many operations return C<undef> to indicate failure, end of file,
+system error, uninitialized variable, and other exceptional
+conditions.  This function allows you to distinguish C<undef> from
+other values.  (A simple Boolean test will not distinguish among
+C<undef>, zero, the empty string, and C<"0">, which are all equally
+false.)  Note that since C<undef> is a valid scalar, its presence
+doesn't I<necessarily> indicate an exceptional condition: C<pop>
+returns C<undef> when its argument is an empty array, I<or> when the
+element to return happens to be C<undef>.
+
+You may also use C<defined(&func)> to check whether subroutine C<&func>
+has ever been defined.  The return value is unaffected by any forward
+declarations of C<&func>.  Note that a subroutine which is not defined
+may still be callable: its package may have an C<AUTOLOAD> method that
+makes it spring into existence the first time that it is called -- see
+L<perlsub>.
+
+Use of C<defined> on aggregates (hashes and arrays) is deprecated.  It
+used to report whether memory for that aggregate has ever been
+allocated.  This behavior may disappear in future versions of Perl.
+You should instead use a simple test for size:
+
+    if (@an_array) { print "has array elements\n" }
+    if (%a_hash)   { print "has hash members\n"   }
+
+When used on a hash element, it tells you whether the value is defined,
+not whether the key exists in the hash.  Use L</exists> for the latter
+purpose.
+
+Examples:
+
+    print if defined $switch{'D'};
+    print "$val\n" while defined($val = pop(@ary));
+    die "Can't readlink $sym: $!"
+	unless defined($value = readlink $sym);
+    sub foo { defined &$bar ? &$bar(@_) : die "No bar"; }
+    $debugging = 0 unless defined $debugging;
+
+Note:  Many folks tend to overuse C<defined>, and then are surprised to
+discover that the number C<0> and C<""> (the zero-length string) are, in fact,
+defined values.  For example, if you say
+
+    "ab" =~ /a(.*)b/;
+
+The pattern match succeeds, and C<$1> is defined, despite the fact that it
+matched "nothing".  It didn't really fail to match anything.  Rather, it
+matched something that happened to be zero characters long.  This is all
+very above-board and honest.  When a function returns an undefined value,
+it's an admission that it couldn't give you an honest answer.  So you
+should use C<defined> only when you're questioning the integrity of what
+you're trying to do.  At other times, a simple comparison to C<0> or C<""> is
+what you want.
+
+See also L</undef>, L</exists>, L</ref>.
+
+=item delete EXPR
+X<delete>
+
+Given an expression that specifies a hash element, array element, hash slice,
+or array slice, deletes the specified element(s) from the hash or array.
+In the case of an array, if the array elements happen to be at the end,
+the size of the array will shrink to the highest element that tests
+true for exists() (or 0 if no such element exists).
+
+Returns a list with the same number of elements as the number of elements
+for which deletion was attempted.  Each element of that list consists of
+either the value of the element deleted, or the undefined value.  In scalar
+context, this means that you get the value of the last element deleted (or
+the undefined value if that element did not exist).
+
+    %hash = (foo => 11, bar => 22, baz => 33);
+    $scalar = delete $hash{foo};             # $scalar is 11
+    $scalar = delete @hash{qw(foo bar)};     # $scalar is 22
+    @array  = delete @hash{qw(foo bar baz)}; # @array  is (undef,undef,33)
+
+Deleting from C<%ENV> modifies the environment.  Deleting from
+a hash tied to a DBM file deletes the entry from the DBM file.  Deleting
+from a C<tie>d hash or array may not necessarily return anything.
+
+Deleting an array element effectively returns that position of the array
+to its initial, uninitialized state.  Subsequently testing for the same
+element with exists() will return false.  Also, deleting array elements
+in the middle of an array will not shift the index of the elements
+after them down.  Use splice() for that.  See L</exists>.
+
+The following (inefficiently) deletes all the values of %HASH and @ARRAY:
+
+    foreach $key (keys %HASH) {
+	delete $HASH{$key};
+    }
+
+    foreach $index (0 .. $#ARRAY) {
+	delete $ARRAY[$index];
+    }
+
+And so do these:
+
+    delete @HASH{keys %HASH};
+
+    delete @ARRAY[0 .. $#ARRAY];
+
+But both of these are slower than just assigning the empty list
+or undefining %HASH or @ARRAY:
+
+    %HASH = ();		# completely empty %HASH
+    undef %HASH;	# forget %HASH ever existed
+
+    @ARRAY = ();	# completely empty @ARRAY
+    undef @ARRAY;	# forget @ARRAY ever existed
+
+Note that the EXPR can be arbitrarily complicated as long as the final
+operation is a hash element, array element,  hash slice, or array slice
+lookup:
+
+    delete $ref->[$x][$y]{$key};
+    delete @{$ref->[$x][$y]}{$key1, $key2, @morekeys};
+
+    delete $ref->[$x][$y][$index];
+    delete @{$ref->[$x][$y]}[$index1, $index2, @moreindices];
+
+=item die LIST
+X<die> X<throw> X<exception> X<raise> X<$@> X<abort>
+
+Outside an C<eval>, prints the value of LIST to C<STDERR> and
+exits with the current value of C<$!> (errno).  If C<$!> is C<0>,
+exits with the value of C<<< ($? >> 8) >>> (backtick `command`
+status).  If C<<< ($? >> 8) >>> is C<0>, exits with C<255>.  Inside
+an C<eval(),> the error message is stuffed into C<$@> and the
+C<eval> is terminated with the undefined value.  This makes
+C<die> the way to raise an exception.
+
+Equivalent examples:
+
+    die "Can't cd to spool: $!\n" unless chdir '/usr/spool/news';
+    chdir '/usr/spool/news' or die "Can't cd to spool: $!\n"
+
+If the last element of LIST does not end in a newline, the current
+script line number and input line number (if any) are also printed,
+and a newline is supplied.  Note that the "input line number" (also
+known as "chunk") is subject to whatever notion of "line" happens to
+be currently in effect, and is also available as the special variable
+C<$.>.  See L<perlvar/"$/"> and L<perlvar/"$.">.
+
+Hint: sometimes appending C<", stopped"> to your message will cause it
+to make better sense when the string C<"at foo line 123"> is appended.
+Suppose you are running script "canasta".
+
+    die "/etc/games is no good";
+    die "/etc/games is no good, stopped";
+
+produce, respectively
+
+    /etc/games is no good at canasta line 123.
+    /etc/games is no good, stopped at canasta line 123.
+
+See also exit(), warn(), and the Carp module.
+
+If LIST is empty and C<$@> already contains a value (typically from a
+previous eval) that value is reused after appending C<"\t...propagated">.
+This is useful for propagating exceptions:
+
+    eval { ... };
+    die unless $@ =~ /Expected exception/;
+
+If LIST is empty and C<$@> contains an object reference that has a
+C<PROPAGATE> method, that method will be called with additional file
+and line number parameters.  The return value replaces the value in
+C<$@>.  i.e. as if C<< $@ = eval { $@->PROPAGATE(__FILE__, __LINE__) }; >>
+were called.
+
+If C<$@> is empty then the string C<"Died"> is used.
+
+die() can also be called with a reference argument.  If this happens to be
+trapped within an eval(), $@ contains the reference.  This behavior permits
+a more elaborate exception handling implementation using objects that
+maintain arbitrary state about the nature of the exception.  Such a scheme
+is sometimes preferable to matching particular string values of $@ using
+regular expressions.  Here's an example:
+
+    use Scalar::Util 'blessed';
+
+    eval { ... ; die Some::Module::Exception->new( FOO => "bar" ) };
+    if ($@) {
+        if (blessed($@) && $@->isa("Some::Module::Exception")) {
+            # handle Some::Module::Exception
+        }
+        else {
+            # handle all other possible exceptions
+        }
+    }
+
+Because perl will stringify uncaught exception messages before displaying
+them, you may want to overload stringification operations on such custom
+exception objects.  See L<overload> for details about that.
+
+You can arrange for a callback to be run just before the C<die>
+does its deed, by setting the C<$SIG{__DIE__}> hook.  The associated
+handler will be called with the error text and can change the error
+message, if it sees fit, by calling C<die> again.  See
+L<perlvar/$SIG{expr}> for details on setting C<%SIG> entries, and
+L<"eval BLOCK"> for some examples.  Although this feature was 
+to be run only right before your program was to exit, this is not
+currently the case--the C<$SIG{__DIE__}> hook is currently called
+even inside eval()ed blocks/strings!  If one wants the hook to do
+nothing in such situations, put
+
+	die @_ if $^S;
+
+as the first line of the handler (see L<perlvar/$^S>).  Because
+this promotes strange action at a distance, this counterintuitive
+behavior may be fixed in a future release.
+
+=item do BLOCK
+X<do> X<block>
+
+Not really a function.  Returns the value of the last command in the
+sequence of commands indicated by BLOCK.  When modified by the C<while> or
+C<until> loop modifier, executes the BLOCK once before testing the loop
+condition. (On other statements the loop modifiers test the conditional
+first.)
+
+C<do BLOCK> does I<not> count as a loop, so the loop control statements
+C<next>, C<last>, or C<redo> cannot be used to leave or restart the block.
+See L<perlsyn> for alternative strategies.
+
+=item do SUBROUTINE(LIST)
+X<do>
+
+This form of subroutine call is deprecated.  See L<perlsub>.
+
+=item do EXPR
+X<do>
+
+Uses the value of EXPR as a filename and executes the contents of the
+file as a Perl script.
+
+    do 'stat.pl';
+
+is just like
+
+    eval `cat stat.pl`;
+
+except that it's more efficient and concise, keeps track of the current
+filename for error messages, searches the @INC directories, and updates
+C<%INC> if the file is found.  See L<perlvar/Predefined Names> for these
+variables.  It also differs in that code evaluated with C<do FILENAME>
+cannot see lexicals in the enclosing scope; C<eval STRING> does.  It's the
+same, however, in that it does reparse the file every time you call it,
+so you probably don't want to do this inside a loop.
+
+If C<do> cannot read the file, it returns undef and sets C<$!> to the
+error.  If C<do> can read the file but cannot compile it, it
+returns undef and sets an error message in C<$@>.   If the file is
+successfully compiled, C<do> returns the value of the last expression
+evaluated.
+
+Note that inclusion of library modules is better done with the
+C<use> and C<require> operators, which also do automatic error checking
+and raise an exception if there's a problem.
+
+You might like to use C<do> to read in a program configuration
+file.  Manual error checking can be done this way:
+
+    # read in config files: system first, then user
+    for $file ("/share/prog/defaults.rc",
+               "$ENV{HOME}/.someprogrc")
+   {
+	unless ($return = do $file) {
+	    warn "couldn't parse $file: $@" if $@;
+	    warn "couldn't do $file: $!"    unless defined $return;
+	    warn "couldn't run $file"       unless $return;
+	}
+    }
+
+=item dump LABEL
+X<dump> X<core> X<undump>
+
+=item dump
+
+This function causes an immediate core dump.  See also the B<-u>
+command-line switch in L<perlrun>, which does the same thing.
+Primarily this is so that you can use the B<undump> program (not
+supplied) to turn your core dump into an executable binary after
+having initialized all your variables at the beginning of the
+program.  When the new binary is executed it will begin by executing
+a C<goto LABEL> (with all the restrictions that C<goto> suffers).
+Think of it as a goto with an intervening core dump and reincarnation.
+If C<LABEL> is omitted, restarts the program from the top.
+
+B<WARNING>: Any files opened at the time of the dump will I<not>
+be open any more when the program is reincarnated, with possible
+resulting confusion on the part of Perl.
+
+This function is now largely obsolete, partly because it's very
+hard to convert a core file into an executable, and because the
+real compiler backends for generating portable bytecode and compilable
+C code have superseded it.  That's why you should now invoke it as
+C<CORE::dump()>, if you don't want to be warned against a possible
+typo.
+
+If you're looking to use L<dump> to speed up your program, consider
+generating bytecode or native C code as described in L<perlcc>.  If
+you're just trying to accelerate a CGI script, consider using the
+C<mod_perl> extension to B<Apache>, or the CPAN module, CGI::Fast.
+You might also consider autoloading or selfloading, which at least
+make your program I<appear> to run faster.
+
+=item each HASH
+X<each> X<hash, iterator>
+
+When called in list context, returns a 2-element list consisting of the
+key and value for the next element of a hash, so that you can iterate over
+it.  When called in scalar context, returns only the key for the next
+element in the hash.
+
+Entries are returned in an apparently random order.  The actual random
+order is subject to change in future versions of perl, but it is
+guaranteed to be in the same order as either the C<keys> or C<values>
+function would produce on the same (unmodified) hash.  Since Perl
+5.8.1 the ordering is different even between different runs of Perl
+for security reasons (see L<perlsec/"Algorithmic Complexity Attacks">).
+
+When the hash is entirely read, a null array is returned in list context
+(which when assigned produces a false (C<0>) value), and C<undef> in
+scalar context.  The next call to C<each> after that will start iterating
+again.  There is a single iterator for each hash, shared by all C<each>,
+C<keys>, and C<values> function calls in the program; it can be reset by
+reading all the elements from the hash, or by evaluating C<keys HASH> or
+C<values HASH>.  If you add or delete elements of a hash while you're
+iterating over it, you may get entries skipped or duplicated, so
+don't.  Exception: It is always safe to delete the item most recently
+returned by C<each()>, which means that the following code will work:
+
+        while (($key, $value) = each %hash) {
+          print $key, "\n";
+          delete $hash{$key};   # This is safe
+        }
+
+The following prints out your environment like the printenv(1) program,
+only in a different order:
+
+    while (($key,$value) = each %ENV) {
+	print "$key=$value\n";
+    }
+
+See also C<keys>, C<values> and C<sort>.
+
+=item eof FILEHANDLE
+X<eof>
+X<end of file>
+X<end-of-file>
+
+=item eof ()
+
+=item eof
+
+Returns 1 if the next read on FILEHANDLE will return end of file, or if
+FILEHANDLE is not open.  FILEHANDLE may be an expression whose value
+gives the real filehandle.  (Note that this function actually
+reads a character and then C<ungetc>s it, so isn't very useful in an
+interactive context.)  Do not read from a terminal file (or call
+C<eof(FILEHANDLE)> on it) after end-of-file is reached.  File types such
+as terminals may lose the end-of-file condition if you do.
+
+An C<eof> without an argument uses the last file read.  Using C<eof()>
+with empty parentheses is very different.  It refers to the pseudo file
+formed from the files listed on the command line and accessed via the
+C<< <> >> operator.  Since C<< <> >> isn't explicitly opened,
+as a normal filehandle is, an C<eof()> before C<< <> >> has been
+used will cause C<@ARGV> to be examined to determine if input is
+available.   Similarly, an C<eof()> after C<< <> >> has returned
+end-of-file will assume you are processing another C<@ARGV> list,
+and if you haven't set C<@ARGV>, will read input from C<STDIN>;
+see L<perlop/"I/O Operators">.
+
+In a C<< while (<>) >> loop, C<eof> or C<eof(ARGV)> can be used to
+detect the end of each file, C<eof()> will only detect the end of the
+last file.  Examples:
+
+    # reset line numbering on each input file
+    while (<>) {
+	next if /^\s*#/;	# skip comments
+	print "$.\t$_";
+    } continue {
+	close ARGV  if eof;	# Not eof()!
+    }
+
+    # insert dashes just before last line of last file
+    while (<>) {
+	if (eof()) {		# check for end of last file
+	    print "--------------\n";
+	}
+	print;
+	last if eof();          # needed if we're reading from a terminal
+    }
+
+Practical hint: you almost never need to use C<eof> in Perl, because the
+input operators typically return C<undef> when they run out of data, or if
+there was an error.
+
+=item eval EXPR
+X<eval> X<try> X<catch> X<evaluate> X<parse> X<execute>
+
+=item eval BLOCK
+
+=item eval
+
+In the first form, the return value of EXPR is parsed and executed as if it
+were a little Perl program.  The value of the expression (which is itself
+determined within scalar context) is first parsed, and if there weren't any
+errors, executed in the lexical context of the current Perl program, so
+that any variable settings or subroutine and format definitions remain
+afterwards.  Note that the value is parsed every time the C<eval> executes.
+If EXPR is omitted, evaluates C<$_>.  This form is typically used to
+delay parsing and subsequent execution of the text of EXPR until run time.
+
+In the second form, the code within the BLOCK is parsed only once--at the
+same time the code surrounding the C<eval> itself was parsed--and executed
+within the context of the current Perl program.  This form is typically
+used to trap exceptions more efficiently than the first (see below), while
+also providing the benefit of checking the code within BLOCK at compile
+time.
+
+The final semicolon, if any, may be omitted from the value of EXPR or within
+the BLOCK.
+
+In both forms, the value returned is the value of the last expression
+evaluated inside the mini-program; a return statement may be also used, just
+as with subroutines.  The expression providing the return value is evaluated
+in void, scalar, or list context, depending on the context of the C<eval> 
+itself.  See L</wantarray> for more on how the evaluation context can be 
+determined.
+
+If there is a syntax error or runtime error, or a C<die> statement is
+executed, an undefined value is returned by C<eval>, and C<$@> is set to the
+error message.  If there was no error, C<$@> is guaranteed to be a null
+string.  Beware that using C<eval> neither silences perl from printing
+warnings to STDERR, nor does it stuff the text of warning messages into C<$@>.
+To do either of those, you have to use the C<$SIG{__WARN__}> facility, or
+turn off warnings inside the BLOCK or EXPR using S<C<no warnings 'all'>>.
+See L</warn>, L<perlvar>, L<warnings> and L<perllexwarn>.
+
+Note that, because C<eval> traps otherwise-fatal errors, it is useful for
+determining whether a particular feature (such as C<socket> or C<symlink>)
+is implemented.  It is also Perl's exception trapping mechanism, where
+the die operator is used to raise exceptions.
+
+If the code to be executed doesn't vary, you may use the eval-BLOCK
+form to trap run-time errors without incurring the penalty of
+recompiling each time.  The error, if any, is still returned in C<$@>.
+Examples:
+
+    # make divide-by-zero nonfatal
+    eval { $answer = $a / $b; }; warn $@ if $@;
+
+    # same thing, but less efficient
+    eval '$answer = $a / $b'; warn $@ if $@;
+
+    # a compile-time error
+    eval { $answer = };			# WRONG
+
+    # a run-time error
+    eval '$answer =';	# sets $@
+
+Using the C<eval{}> form as an exception trap in libraries does have some
+issues.  Due to the current arguably broken state of C<__DIE__> hooks, you
+may wish not to trigger any C<__DIE__> hooks that user code may have installed.
+You can use the C<local $SIG{__DIE__}> construct for this purpose,
+as shown in this example:
+
+    # a very private exception trap for divide-by-zero
+    eval { local $SIG{'__DIE__'}; $answer = $a / $b; };
+    warn $@ if $@;
+
+This is especially significant, given that C<__DIE__> hooks can call
+C<die> again, which has the effect of changing their error messages:
+
+    # __DIE__ hooks may modify error messages
+    {
+       local $SIG{'__DIE__'} =
+              sub { (my $x = $_[0]) =~ s/foo/bar/g; die $x };
+       eval { die "foo lives here" };
+       print $@ if $@;                # prints "bar lives here"
+    }
+
+Because this promotes action at a distance, this counterintuitive behavior
+may be fixed in a future release.
+
+With an C<eval>, you should be especially careful to remember what's
+being looked at when:
+
+    eval $x;		# CASE 1
+    eval "$x";		# CASE 2
+
+    eval '$x';		# CASE 3
+    eval { $x };	# CASE 4
+
+    eval "\$$x++";	# CASE 5
+    $$x++;		# CASE 6
+
+Cases 1 and 2 above behave identically: they run the code contained in
+the variable $x.  (Although case 2 has misleading double quotes making
+the reader wonder what else might be happening (nothing is).)  Cases 3
+and 4 likewise behave in the same way: they run the code C<'$x'>, which
+does nothing but return the value of $x.  (Case 4 is preferred for
+purely visual reasons, but it also has the advantage of compiling at
+compile-time instead of at run-time.)  Case 5 is a place where
+normally you I<would> like to use double quotes, except that in this
+particular situation, you can just use symbolic references instead, as
+in case 6.
+
+C<eval BLOCK> does I<not> count as a loop, so the loop control statements
+C<next>, C<last>, or C<redo> cannot be used to leave or restart the block.
+
+Note that as a very special case, an C<eval ''> executed within the C<DB>
+package doesn't see the usual surrounding lexical scope, but rather the
+scope of the first non-DB piece of code that called it. You don't normally
+need to worry about this unless you are writing a Perl debugger.
+
+=item exec LIST
+X<exec> X<execute>
+
+=item exec PROGRAM LIST
+
+The C<exec> function executes a system command I<and never returns>--
+use C<system> instead of C<exec> if you want it to return.  It fails and
+returns false only if the command does not exist I<and> it is executed
+directly instead of via your system's command shell (see below).
+
+Since it's a common mistake to use C<exec> instead of C<system>, Perl
+warns you if there is a following statement which isn't C<die>, C<warn>,
+or C<exit> (if C<-w> is set  -  but you always do that).   If you
+I<really> want to follow an C<exec> with some other statement, you
+can use one of these styles to avoid the warning:
+
+    exec ('foo')   or print STDERR "couldn't exec foo: $!";
+    { exec ('foo') }; print STDERR "couldn't exec foo: $!";
+
+If there is more than one argument in LIST, or if LIST is an array
+with more than one value, calls execvp(3) with the arguments in LIST.
+If there is only one scalar argument or an array with one element in it,
+the argument is checked for shell metacharacters, and if there are any,
+the entire argument is passed to the system's command shell for parsing
+(this is C</bin/sh -c> on Unix platforms, but varies on other platforms).
+If there are no shell metacharacters in the argument, it is split into
+words and passed directly to C<execvp>, which is more efficient.
+Examples:
+
+    exec '/bin/echo', 'Your arguments are: ', @ARGV;
+    exec "sort $outfile | uniq";
+
+If you don't really want to execute the first argument, but want to lie
+to the program you are executing about its own name, you can specify
+the program you actually want to run as an "indirect object" (without a
+comma) in front of the LIST.  (This always forces interpretation of the
+LIST as a multivalued list, even if there is only a single scalar in
+the list.)  Example:
+
+    $shell = '/bin/csh';
+    exec $shell '-sh';		# pretend it's a login shell
+
+or, more directly,
+
+    exec {'/bin/csh'} '-sh';	# pretend it's a login shell
+
+When the arguments get executed via the system shell, results will
+be subject to its quirks and capabilities.  See L<perlop/"`STRING`">
+for details.
+
+Using an indirect object with C<exec> or C<system> is also more
+secure.  This usage (which also works fine with system()) forces
+interpretation of the arguments as a multivalued list, even if the
+list had just one argument.  That way you're safe from the shell
+expanding wildcards or splitting up words with whitespace in them.
+
+    @args = ( "echo surprise" );
+
+    exec @args;               # subject to shell escapes
+                                # if @args == 1
+    exec { $args[0] } @args;  # safe even with one-arg list
+
+The first version, the one without the indirect object, ran the I<echo>
+program, passing it C<"surprise"> an argument.  The second version
+didn't--it tried to run a program literally called I<"echo surprise">,
+didn't find it, and set C<$?> to a non-zero value indicating failure.
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before the exec, but this may not be supported on some platforms
+(see L<perlport>).  To be safe, you may need to set C<$|> ($AUTOFLUSH
+in English) or call the C<autoflush()> method of C<IO::Handle> on any
+open handles in order to avoid lost output.
+
+Note that C<exec> will not call your C<END> blocks, nor will it call
+any C<DESTROY> methods in your objects.
+
+=item exists EXPR
+X<exists> X<autovivification>
+
+Given an expression that specifies a hash element or array element,
+returns true if the specified element in the hash or array has ever
+been initialized, even if the corresponding value is undefined.  The
+element is not autovivified if it doesn't exist.
+
+    print "Exists\n" 	if exists $hash{$key};
+    print "Defined\n" 	if defined $hash{$key};
+    print "True\n"      if $hash{$key};
+
+    print "Exists\n" 	if exists $array[$index];
+    print "Defined\n" 	if defined $array[$index];
+    print "True\n"      if $array[$index];
+
+A hash or array element can be true only if it's defined, and defined if
+it exists, but the reverse doesn't necessarily hold true.
+
+Given an expression that specifies the name of a subroutine,
+returns true if the specified subroutine has ever been declared, even
+if it is undefined.  Mentioning a subroutine name for exists or defined
+does not count as declaring it.  Note that a subroutine which does not
+exist may still be callable: its package may have an C<AUTOLOAD>
+method that makes it spring into existence the first time that it is
+called -- see L<perlsub>.
+
+    print "Exists\n" 	if exists &subroutine;
+    print "Defined\n" 	if defined &subroutine;
+
+Note that the EXPR can be arbitrarily complicated as long as the final
+operation is a hash or array key lookup or subroutine name:
+
+    if (exists $ref->{A}->{B}->{$key}) 	{ }
+    if (exists $hash{A}{B}{$key}) 	{ }
+
+    if (exists $ref->{A}->{B}->[$ix]) 	{ }
+    if (exists $hash{A}{B}[$ix]) 	{ }
+
+    if (exists &{$ref->{A}{B}{$key}})   { }
+
+Although the deepest nested array or hash will not spring into existence
+just because its existence was tested, any intervening ones will.
+Thus C<< $ref->{"A"} >> and C<< $ref->{"A"}->{"B"} >> will spring
+into existence due to the existence test for the $key element above.
+This happens anywhere the arrow operator is used, including even:
+
+    undef $ref;
+    if (exists $ref->{"Some key"})	{ }
+    print $ref; 	    # prints HASH(0x80d3d5c)
+
+This surprising autovivification in what does not at first--or even
+second--glance appear to be an lvalue context may be fixed in a future
+release.
+
+See L<perlref/"Pseudo-hashes: Using an array as a hash"> for specifics
+on how exists() acts when used on a pseudo-hash.
+
+Use of a subroutine call, rather than a subroutine name, as an argument
+to exists() is an error.
+
+    exists &sub;	# OK
+    exists &sub();	# Error
+
+=item exit EXPR
+X<exit> X<terminate> X<abort>
+
+=item exit
+
+Evaluates EXPR and exits immediately with that value.    Example:
+
+    $ans = <STDIN>;
+    exit 0 if $ans =~ /^[Xx]/;
+
+See also C<die>.  If EXPR is omitted, exits with C<0> status.  The only
+universally recognized values for EXPR are C<0> for success and C<1>
+for error; other values are subject to interpretation depending on the
+environment in which the Perl program is running.  For example, exiting
+69 (EX_UNAVAILABLE) from a I<sendmail> incoming-mail filter will cause
+the mailer to return the item undelivered, but that's not true everywhere.
+
+Don't use C<exit> to abort a subroutine if there's any chance that
+someone might want to trap whatever error happened.  Use C<die> instead,
+which can be trapped by an C<eval>.
+
+The exit() function does not always exit immediately.  It calls any
+defined C<END> routines first, but these C<END> routines may not
+themselves abort the exit.  Likewise any object destructors that need to
+be called are called before the real exit.  If this is a problem, you
+can call C<POSIX:_exit($status)> to avoid END and destructor processing.
+See L<perlmod> for details.
+
+=item exp EXPR
+X<exp> X<exponential> X<antilog> X<antilogarithm> X<e>
+
+=item exp
+
+Returns I<e> (the natural logarithm base) to the power of EXPR.
+If EXPR is omitted, gives C<exp($_)>.
+
+=item fcntl FILEHANDLE,FUNCTION,SCALAR
+X<fcntl>
+
+Implements the fcntl(2) function.  You'll probably have to say
+
+    use Fcntl;
+
+first to get the correct constant definitions.  Argument processing and
+value return works just like C<ioctl> below.
+For example:
+
+    use Fcntl;
+    fcntl($filehandle, F_GETFL, $packed_return_buffer)
+	or die "can't fcntl F_GETFL: $!";
+
+You don't have to check for C<defined> on the return from C<fcntl>.
+Like C<ioctl>, it maps a C<0> return from the system call into
+C<"0 but true"> in Perl.  This string is true in boolean context and C<0>
+in numeric context.  It is also exempt from the normal B<-w> warnings
+on improper numeric conversions.
+
+Note that C<fcntl> will produce a fatal error if used on a machine that
+doesn't implement fcntl(2).  See the Fcntl module or your fcntl(2)
+manpage to learn what functions are available on your system.
+
+Here's an example of setting a filehandle named C<REMOTE> to be
+non-blocking at the system level.  You'll have to negotiate C<$|>
+on your own, though.
+
+    use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
+
+    $flags = fcntl(REMOTE, F_GETFL, 0)
+                or die "Can't get flags for the socket: $!\n";
+
+    $flags = fcntl(REMOTE, F_SETFL, $flags | O_NONBLOCK)
+                or die "Can't set flags for the socket: $!\n";
+
+=item fileno FILEHANDLE
+X<fileno>
+
+Returns the file descriptor for a filehandle, or undefined if the
+filehandle is not open.  This is mainly useful for constructing
+bitmaps for C<select> and low-level POSIX tty-handling operations.
+If FILEHANDLE is an expression, the value is taken as an indirect
+filehandle, generally its name.
+
+You can use this to find out whether two handles refer to the
+same underlying descriptor:
+
+    if (fileno(THIS) == fileno(THAT)) {
+	print "THIS and THAT are dups\n";
+    }
+
+(Filehandles connected to memory objects via new features of C<open> may
+return undefined even though they are open.)
+
+
+=item flock FILEHANDLE,OPERATION
+X<flock> X<lock> X<locking>
+
+Calls flock(2), or an emulation of it, on FILEHANDLE.  Returns true
+for success, false on failure.  Produces a fatal error if used on a
+machine that doesn't implement flock(2), fcntl(2) locking, or lockf(3).
+C<flock> is Perl's portable file locking interface, although it locks
+only entire files, not records.
+
+Two potentially non-obvious but traditional C<flock> semantics are
+that it waits indefinitely until the lock is granted, and that its locks
+B<merely advisory>.  Such discretionary locks are more flexible, but offer
+fewer guarantees.  This means that programs that do not also use C<flock>
+may modify files locked with C<flock>.  See L<perlport>, 
+your port's specific documentation, or your system-specific local manpages
+for details.  It's best to assume traditional behavior if you're writing
+portable programs.  (But if you're not, you should as always feel perfectly
+free to write for your own system's idiosyncrasies (sometimes called
+"features").  Slavish adherence to portability concerns shouldn't get
+in the way of your getting your job done.)
+
+OPERATION is one of LOCK_SH, LOCK_EX, or LOCK_UN, possibly combined with
+LOCK_NB.  These constants are traditionally valued 1, 2, 8 and 4, but
+you can use the symbolic names if you import them from the Fcntl module,
+either individually, or as a group using the ':flock' tag.  LOCK_SH
+requests a shared lock, LOCK_EX requests an exclusive lock, and LOCK_UN
+releases a previously requested lock.  If LOCK_NB is bitwise-or'ed with
+LOCK_SH or LOCK_EX then C<flock> will return immediately rather than blocking
+waiting for the lock (check the return status to see if you got it).
+
+To avoid the possibility of miscoordination, Perl now flushes FILEHANDLE
+before locking or unlocking it.
+
+Note that the emulation built with lockf(3) doesn't provide shared
+locks, and it requires that FILEHANDLE be open with write intent.  These
+are the semantics that lockf(3) implements.  Most if not all systems
+implement lockf(3) in terms of fcntl(2) locking, though, so the
+differing semantics shouldn't bite too many people.
+
+Note that the fcntl(2) emulation of flock(3) requires that FILEHANDLE
+be open with read intent to use LOCK_SH and requires that it be open
+with write intent to use LOCK_EX.
+
+Note also that some versions of C<flock> cannot lock things over the
+network; you would need to use the more system-specific C<fcntl> for
+that.  If you like you can force Perl to ignore your system's flock(2)
+function, and so provide its own fcntl(2)-based emulation, by passing
+the switch C<-Ud_flock> to the F<Configure> program when you configure
+perl.
+
+Here's a mailbox appender for BSD systems.
+
+    use Fcntl ':flock'; # import LOCK_* constants
+
+    sub lock {
+	flock(MBOX,LOCK_EX);
+	# and, in case someone appended
+	# while we were waiting...
+	seek(MBOX, 0, 2);
+    }
+
+    sub unlock {
+	flock(MBOX,LOCK_UN);
+    }
+
+    open(MBOX, ">>/usr/spool/mail/$ENV{'USER'}")
+	    or die "Can't open mailbox: $!";
+
+    lock();
+    print MBOX $msg,"\n\n";
+    unlock();
+
+On systems that support a real flock(), locks are inherited across fork()
+calls, whereas those that must resort to the more capricious fcntl()
+function lose the locks, making it harder to write servers.
+
+See also L<DB_File> for other flock() examples.
+
+=item fork
+X<fork> X<child> X<parent>
+
+Does a fork(2) system call to create a new process running the
+same program at the same point.  It returns the child pid to the
+parent process, C<0> to the child process, or C<undef> if the fork is
+unsuccessful.  File descriptors (and sometimes locks on those descriptors)
+are shared, while everything else is copied.  On most systems supporting
+fork(), great care has gone into making it extremely efficient (for
+example, using copy-on-write technology on data pages), making it the
+dominant paradigm for multitasking over the last few decades.
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before forking the child process, but this may not be supported
+on some platforms (see L<perlport>).  To be safe, you may need to set
+C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method of
+C<IO::Handle> on any open handles in order to avoid duplicate output.
+
+If you C<fork> without ever waiting on your children, you will
+accumulate zombies.  On some systems, you can avoid this by setting
+C<$SIG{CHLD}> to C<"IGNORE">.  See also L<perlipc> for more examples of
+forking and reaping moribund children.
+
+Note that if your forked child inherits system file descriptors like
+STDIN and STDOUT that are actually connected by a pipe or socket, even
+if you exit, then the remote server (such as, say, a CGI script or a
+backgrounded job launched from a remote shell) won't think you're done.
+You should reopen those to F</dev/null> if it's any issue.
+
+=item format
+X<format>
+
+Declare a picture format for use by the C<write> function.  For
+example:
+
+    format Something =
+	Test: @<<<<<<<< @||||| @>>>>>
+	      $str,     $%,    '$' . int($num)
+    .
+
+    $str = "widget";
+    $num = $cost/$quantity;
+    $~ = 'Something';
+    write;
+
+See L<perlform> for many details and examples.
+
+=item formline PICTURE,LIST
+X<formline>
+
+This is an internal function used by C<format>s, though you may call it,
+too.  It formats (see L<perlform>) a list of values according to the
+contents of PICTURE, placing the output into the format output
+accumulator, C<$^A> (or C<$ACCUMULATOR> in English).
+Eventually, when a C<write> is done, the contents of
+C<$^A> are written to some filehandle.  You could also read C<$^A>
+and then set C<$^A> back to C<"">.  Note that a format typically
+does one C<formline> per line of form, but the C<formline> function itself
+doesn't care how many newlines are embedded in the PICTURE.  This means
+that the C<~> and C<~~> tokens will treat the entire PICTURE as a single line.
+You may therefore need to use multiple formlines to implement a single
+record format, just like the format compiler.
+
+Be careful if you put double quotes around the picture, because an C<@>
+character may be taken to mean the beginning of an array name.
+C<formline> always returns true.  See L<perlform> for other examples.
+
+=item getc FILEHANDLE
+X<getc> X<getchar>
+
+=item getc
+
+Returns the next character from the input file attached to FILEHANDLE,
+or the undefined value at end of file, or if there was an error (in
+the latter case C<$!> is set).  If FILEHANDLE is omitted, reads from
+STDIN.  This is not particularly efficient.  However, it cannot be
+used by itself to fetch single characters without waiting for the user
+to hit enter.  For that, try something more like:
+
+    if ($BSD_STYLE) {
+	system "stty cbreak </dev/tty >/dev/tty 2>&1";
+    }
+    else {
+	system "stty", '-icanon', 'eol', "\001";
+    }
+
+    $key = getc(STDIN);
+
+    if ($BSD_STYLE) {
+	system "stty -cbreak </dev/tty >/dev/tty 2>&1";
+    }
+    else {
+	system "stty", 'icanon', 'eol', '^@'; # ASCII null
+    }
+    print "\n";
+
+Determination of whether $BSD_STYLE should be set
+is left as an exercise to the reader.
+
+The C<POSIX::getattr> function can do this more portably on
+systems purporting POSIX compliance.  See also the C<Term::ReadKey>
+module from your nearest CPAN site; details on CPAN can be found on
+L<perlmodlib/CPAN>.
+
+=item getlogin
+X<getlogin> X<login>
+
+This implements the C library function of the same name, which on most
+systems returns the current login from F</etc/utmp>, if any.  If null,
+use C<getpwuid>.
+
+    $login = getlogin || getpwuid($<) || "Kilroy";
+
+Do not consider C<getlogin> for authentication: it is not as
+secure as C<getpwuid>.
+
+=item getpeername SOCKET
+X<getpeername> X<peer>
+
+Returns the packed sockaddr address of other end of the SOCKET connection.
+
+    use Socket;
+    $hersockaddr    = getpeername(SOCK);
+    ($port, $iaddr) = sockaddr_in($hersockaddr);
+    $herhostname    = gethostbyaddr($iaddr, AF_INET);
+    $herstraddr     = inet_ntoa($iaddr);
+
+=item getpgrp PID
+X<getpgrp> X<group>
+
+Returns the current process group for the specified PID.  Use
+a PID of C<0> to get the current process group for the
+current process.  Will raise an exception if used on a machine that
+doesn't implement getpgrp(2).  If PID is omitted, returns process
+group of current process.  Note that the POSIX version of C<getpgrp>
+does not accept a PID argument, so only C<PID==0> is truly portable.
+
+=item getppid
+X<getppid> X<parent> X<pid>
+
+Returns the process id of the parent process.
+
+Note for Linux users: on Linux, the C functions C<getpid()> and
+C<getppid()> return different values from different threads. In order to
+be portable, this behavior is not reflected by the perl-level function
+C<getppid()>, that returns a consistent value across threads. If you want
+to call the underlying C<getppid()>, you may use the CPAN module
+C<Linux::Pid>.
+
+=item getpriority WHICH,WHO
+X<getpriority> X<priority> X<nice>
+
+Returns the current priority for a process, a process group, or a user.
+(See L<getpriority(2)>.)  Will raise a fatal exception if used on a
+machine that doesn't implement getpriority(2).
+
+=item getpwnam NAME
+X<getpwnam> X<getgrnam> X<gethostbyname> X<getnetbyname> X<getprotobyname>
+X<getpwuid> X<getgrgid> X<getservbyname> X<gethostbyaddr> X<getnetbyaddr>
+X<getprotobynumber> X<getservbyport> X<getpwent> X<getgrent> X<gethostent>
+X<getnetent> X<getprotoent> X<getservent> X<setpwent> X<setgrent> X<sethostent>
+X<setnetent> X<setprotoent> X<setservent> X<endpwent> X<endgrent> X<endhostent>
+X<endnetent> X<endprotoent> X<endservent> 
+
+=item getgrnam NAME
+
+=item gethostbyname NAME
+
+=item getnetbyname NAME
+
+=item getprotobyname NAME
+
+=item getpwuid UID
+
+=item getgrgid GID
+
+=item getservbyname NAME,PROTO
+
+=item gethostbyaddr ADDR,ADDRTYPE
+
+=item getnetbyaddr ADDR,ADDRTYPE
+
+=item getprotobynumber NUMBER
+
+=item getservbyport PORT,PROTO
+
+=item getpwent
+
+=item getgrent
+
+=item gethostent
+
+=item getnetent
+
+=item getprotoent
+
+=item getservent
+
+=item setpwent
+
+=item setgrent
+
+=item sethostent STAYOPEN
+
+=item setnetent STAYOPEN
+
+=item setprotoent STAYOPEN
+
+=item setservent STAYOPEN
+
+=item endpwent
+
+=item endgrent
+
+=item endhostent
+
+=item endnetent
+
+=item endprotoent
+
+=item endservent
+
+These routines perform the same functions as their counterparts in the
+system library.  In list context, the return values from the
+various get routines are as follows:
+
+    ($name,$passwd,$uid,$gid,
+       $quota,$comment,$gcos,$dir,$shell,$expire) = getpw*
+    ($name,$passwd,$gid,$members) = getgr*
+    ($name,$aliases,$addrtype,$length,@addrs) = gethost*
+    ($name,$aliases,$addrtype,$net) = getnet*
+    ($name,$aliases,$proto) = getproto*
+    ($name,$aliases,$port,$proto) = getserv*
+
+(If the entry doesn't exist you get a null list.)
+
+The exact meaning of the $gcos field varies but it usually contains
+the real name of the user (as opposed to the login name) and other
+information pertaining to the user.  Beware, however, that in many
+system users are able to change this information and therefore it
+cannot be trusted and therefore the $gcos is tainted (see
+L<perlsec>).  The $passwd and $shell, user's encrypted password and
+login shell, are also tainted, because of the same reason.
+
+In scalar context, you get the name, unless the function was a
+lookup by name, in which case you get the other thing, whatever it is.
+(If the entry doesn't exist you get the undefined value.)  For example:
+
+    $uid   = getpwnam($name);
+    $name  = getpwuid($num);
+    $name  = getpwent();
+    $gid   = getgrnam($name);
+    $name  = getgrgid($num);
+    $name  = getgrent();
+    #etc.
+
+In I<getpw*()> the fields $quota, $comment, and $expire are special
+cases in the sense that in many systems they are unsupported.  If the
+$quota is unsupported, it is an empty scalar.  If it is supported, it
+usually encodes the disk quota.  If the $comment field is unsupported,
+it is an empty scalar.  If it is supported it usually encodes some
+administrative comment about the user.  In some systems the $quota
+field may be $change or $age, fields that have to do with password
+aging.  In some systems the $comment field may be $class.  The $expire
+field, if present, encodes the expiration period of the account or the
+password.  For the availability and the exact meaning of these fields
+in your system, please consult your getpwnam(3) documentation and your
+F<pwd.h> file.  You can also find out from within Perl what your
+$quota and $comment fields mean and whether you have the $expire field
+by using the C<Config> module and the values C<d_pwquota>, C<d_pwage>,
+C<d_pwchange>, C<d_pwcomment>, and C<d_pwexpire>.  Shadow password
+files are only supported if your vendor has implemented them in the
+intuitive fashion that calling the regular C library routines gets the
+shadow versions if you're running under privilege or if there exists
+the shadow(3) functions as found in System V (this includes Solaris
+and Linux.)  Those systems that implement a proprietary shadow password
+facility are unlikely to be supported.
+
+The $members value returned by I<getgr*()> is a space separated list of
+the login names of the members of the group.
+
+For the I<gethost*()> functions, if the C<h_errno> variable is supported in
+C, it will be returned to you via C<$?> if the function call fails.  The
+C<@addrs> value returned by a successful call is a list of the raw
+addresses returned by the corresponding system library call.  In the
+Internet domain, each address is four bytes long and you can unpack it
+by saying something like:
+
+    ($a,$b,$c,$d) = unpack('C4',$addr[0]);
+
+The Socket library makes this slightly easier:
+
+    use Socket;
+    $iaddr = inet_aton("127.1"); # or whatever address
+    $name  = gethostbyaddr($iaddr, AF_INET);
+
+    # or going the other way
+    $straddr = inet_ntoa($iaddr);
+
+If you get tired of remembering which element of the return list
+contains which return value, by-name interfaces are provided
+in standard modules: C<File::stat>, C<Net::hostent>, C<Net::netent>,
+C<Net::protoent>, C<Net::servent>, C<Time::gmtime>, C<Time::localtime>,
+and C<User::grent>.  These override the normal built-ins, supplying
+versions that return objects with the appropriate names
+for each field.  For example:
+
+   use File::stat;
+   use User::pwent;
+   $is_his = (stat($filename)->uid == pwent($whoever)->uid);
+
+Even though it looks like they're the same method calls (uid),
+they aren't, because a C<File::stat> object is different from
+a C<User::pwent> object.
+
+=item getsockname SOCKET
+X<getsockname>
+
+Returns the packed sockaddr address of this end of the SOCKET connection,
+in case you don't know the address because you have several different
+IPs that the connection might have come in on.
+
+    use Socket;
+    $mysockaddr = getsockname(SOCK);
+    ($port, $myaddr) = sockaddr_in($mysockaddr);
+    printf "Connect to %s [%s]\n",
+       scalar gethostbyaddr($myaddr, AF_INET),
+       inet_ntoa($myaddr);
+
+=item getsockopt SOCKET,LEVEL,OPTNAME
+X<getsockopt>
+
+Queries the option named OPTNAME associated with SOCKET at a given LEVEL.
+Options may exist at multiple protocol levels depending on the socket
+type, but at least the uppermost socket level SOL_SOCKET (defined in the
+C<Socket> module) will exist. To query options at another level the
+protocol number of the appropriate protocol controlling the option
+should be supplied. For example, to indicate that an option is to be
+interpreted by the TCP protocol, LEVEL should be set to the protocol
+number of TCP, which you can get using getprotobyname.
+
+The call returns a packed string representing the requested socket option,
+or C<undef> if there is an error (the error reason will be in $!). What
+exactly is in the packed string depends in the LEVEL and OPTNAME, consult
+your system documentation for details. A very common case however is that
+the option is an integer, in which case the result will be a packed
+integer which you can decode using unpack with the C<i> (or C<I>) format.
+
+An example testing if Nagle's algorithm is turned on on a socket:
+
+    use Socket qw(:all);
+
+    defined(my $tcp = getprotobyname("tcp"))
+	or die "Could not determine the protocol number for tcp";
+    # my $tcp = IPPROTO_TCP; # Alternative
+    my $packed = getsockopt($socket, $tcp, TCP_NODELAY)
+	or die "Could not query TCP_NODELAY socket option: $!";
+    my $nodelay = unpack("I", $packed);
+    print "Nagle's algorithm is turned ", $nodelay ? "off\n" : "on\n";
+
+
+=item glob EXPR
+X<glob> X<wildcard> X<filename, expansion> X<expand>
+
+=item glob
+
+In list context, returns a (possibly empty) list of filename expansions on
+the value of EXPR such as the standard Unix shell F</bin/csh> would do. In
+scalar context, glob iterates through such filename expansions, returning
+undef when the list is exhausted. This is the internal function
+implementing the C<< <*.c> >> operator, but you can use it directly. If
+EXPR is omitted, C<$_> is used.  The C<< <*.c> >> operator is discussed in
+more detail in L<perlop/"I/O Operators">.
+
+Beginning with v5.6.0, this operator is implemented using the standard
+C<File::Glob> extension.  See L<File::Glob> for details.
+
+=item gmtime EXPR
+X<gmtime> X<UTC> X<Greenwich>
+
+=item gmtime
+
+Converts a time as returned by the time function to an 9-element list
+with the time localized for the standard Greenwich time zone.
+Typically used as follows:
+
+    #  0    1    2     3     4    5     6     7     8
+    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+					    gmtime(time);
+
+All list elements are numeric, and come straight out of the C `struct
+tm'.  $sec, $min, and $hour are the seconds, minutes, and hours of the
+specified time.  $mday is the day of the month, and $mon is the month
+itself, in the range C<0..11> with 0 indicating January and 11
+indicating December.  $year is the number of years since 1900.  That
+is, $year is C<123> in year 2023.  $wday is the day of the week, with
+0 indicating Sunday and 3 indicating Wednesday.  $yday is the day of
+the year, in the range C<0..364> (or C<0..365> in leap years).  $isdst
+is always C<0>.
+
+Note that the $year element is I<not> simply the last two digits of
+the year.  If you assume it is then you create non-Y2K-compliant
+programs--and you wouldn't want to do that, would you?
+
+The proper way to get a complete 4-digit year is simply:
+
+	$year += 1900;
+
+And to get the last two digits of the year (e.g., '01' in 2001) do:
+
+	$year = sprintf("%02d", $year % 100);
+
+If EXPR is omitted, C<gmtime()> uses the current time (C<gmtime(time)>).
+
+In scalar context, C<gmtime()> returns the ctime(3) value:
+
+    $now_string = gmtime;  # e.g., "Thu Oct 13 04:54:34 1994"
+
+If you need local time instead of GMT use the L</localtime> builtin. 
+See also the C<timegm> function provided by the C<Time::Local> module,
+and the strftime(3) and mktime(3) functions available via the L<POSIX> module.
+
+This scalar value is B<not> locale dependent (see L<perllocale>), but is
+instead a Perl builtin.  To get somewhat similar but locale dependent date
+strings, see the example in L</localtime>.
+
+See L<perlport/gmtime> for portability concerns.
+
+=item goto LABEL
+X<goto> X<jump> X<jmp>
+
+=item goto EXPR
+
+=item goto &NAME
+
+The C<goto-LABEL> form finds the statement labeled with LABEL and resumes
+execution there.  It may not be used to go into any construct that
+requires initialization, such as a subroutine or a C<foreach> loop.  It
+also can't be used to go into a construct that is optimized away,
+or to get out of a block or subroutine given to C<sort>.
+It can be used to go almost anywhere else within the dynamic scope,
+including out of subroutines, but it's usually better to use some other
+construct such as C<last> or C<die>.  The author of Perl has never felt the
+need to use this form of C<goto> (in Perl, that is--C is another matter).
+(The difference being that C does not offer named loops combined with
+loop control.  Perl does, and this replaces most structured uses of C<goto>
+in other languages.)
+
+The C<goto-EXPR> form expects a label name, whose scope will be resolved
+dynamically.  This allows for computed C<goto>s per FORTRAN, but isn't
+necessarily recommended if you're optimizing for maintainability:
+
+    goto ("FOO", "BAR", "GLARCH")[$i];
+
+The C<goto-&NAME> form is quite different from the other forms of
+C<goto>.  In fact, it isn't a goto in the normal sense at all, and
+doesn't have the stigma associated with other gotos.  Instead, it
+exits the current subroutine (losing any changes set by local()) and
+immediately calls in its place the named subroutine using the current
+value of @_.  This is used by C<AUTOLOAD> subroutines that wish to
+load another subroutine and then pretend that the other subroutine had
+been called in the first place (except that any modifications to C<@_>
+in the current subroutine are propagated to the other subroutine.)
+After the C<goto>, not even C<caller> will be able to tell that this
+routine was called first.
+
+NAME needn't be the name of a subroutine; it can be a scalar variable
+containing a code reference, or a block that evaluates to a code
+reference.
+
+=item grep BLOCK LIST
+X<grep>
+
+=item grep EXPR,LIST
+
+This is similar in spirit to, but not the same as, grep(1) and its
+relatives.  In particular, it is not limited to using regular expressions.
+
+Evaluates the BLOCK or EXPR for each element of LIST (locally setting
+C<$_> to each element) and returns the list value consisting of those
+elements for which the expression evaluated to true.  In scalar
+context, returns the number of times the expression was true.
+
+    @foo = grep(!/^#/, @bar);    # weed out comments
+
+or equivalently,
+
+    @foo = grep {!/^#/} @bar;    # weed out comments
+
+Note that C<$_> is an alias to the list value, so it can be used to
+modify the elements of the LIST.  While this is useful and supported,
+it can cause bizarre results if the elements of LIST are not variables.
+Similarly, grep returns aliases into the original list, much as a for
+loop's index variable aliases the list elements.  That is, modifying an
+element of a list returned by grep (for example, in a C<foreach>, C<map>
+or another C<grep>) actually modifies the element in the original list.
+This is usually something to be avoided when writing clear code.
+
+See also L</map> for a list composed of the results of the BLOCK or EXPR.
+
+=item hex EXPR
+X<hex> X<hexadecimal>
+
+=item hex
+
+Interprets EXPR as a hex string and returns the corresponding value.
+(To convert strings that might start with either C<0>, C<0x>, or C<0b>, see
+L</oct>.)  If EXPR is omitted, uses C<$_>.
+
+    print hex '0xAf'; # prints '175'
+    print hex 'aF';   # same
+
+Hex strings may only represent integers.  Strings that would cause
+integer overflow trigger a warning.  Leading whitespace is not stripped,
+unlike oct(). To present something as hex, look into L</printf>,
+L</sprintf>, or L</unpack>.
+
+=item import LIST
+X<import>
+
+There is no builtin C<import> function.  It is just an ordinary
+method (subroutine) defined (or inherited) by modules that wish to export
+names to another module.  The C<use> function calls the C<import> method
+for the package used.  See also L</use>, L<perlmod>, and L<Exporter>.
+
+=item index STR,SUBSTR,POSITION
+X<index> X<indexOf> X<InStr>
+
+=item index STR,SUBSTR
+
+The index function searches for one string within another, but without
+the wildcard-like behavior of a full regular-expression pattern match.
+It returns the position of the first occurrence of SUBSTR in STR at
+or after POSITION.  If POSITION is omitted, starts searching from the
+beginning of the string.  POSITION before the beginning of the string
+or after its end is treated as if it were the beginning or the end,
+respectively.  POSITION and the return value are based at C<0> (or whatever
+you've set the C<$[> variable to--but don't do that).  If the substring
+is not found, C<index> returns one less than the base, ordinarily C<-1>.
+
+=item int EXPR
+X<int> X<integer> X<truncate> X<trunc>
+
+=item int
+
+Returns the integer portion of EXPR.  If EXPR is omitted, uses C<$_>.
+You should not use this function for rounding: one because it truncates
+towards C<0>, and two because machine representations of floating point
+numbers can sometimes produce counterintuitive results.  For example,
+C<int(-6.725/0.025)> produces -268 rather than the correct -269; that's
+because it's really more like -268.99999999999994315658 instead.  Usually,
+the C<sprintf>, C<printf>, or the C<POSIX::floor> and C<POSIX::ceil>
+functions will serve you better than will int().
+
+=item ioctl FILEHANDLE,FUNCTION,SCALAR
+X<ioctl>
+
+Implements the ioctl(2) function.  You'll probably first have to say
+
+    require "sys/ioctl.ph";	# probably in $Config{archlib}/sys/ioctl.ph
+
+to get the correct function definitions.  If F<sys/ioctl.ph> doesn't
+exist or doesn't have the correct definitions you'll have to roll your
+own, based on your C header files such as F<< <sys/ioctl.h> >>.
+(There is a Perl script called B<h2ph> that comes with the Perl kit that
+may help you in this, but it's nontrivial.)  SCALAR will be read and/or
+written depending on the FUNCTION--a pointer to the string value of SCALAR
+will be passed as the third argument of the actual C<ioctl> call.  (If SCALAR
+has no string value but does have a numeric value, that value will be
+passed rather than a pointer to the string value.  To guarantee this to be
+true, add a C<0> to the scalar before using it.)  The C<pack> and C<unpack>
+functions may be needed to manipulate the values of structures used by
+C<ioctl>.
+
+The return value of C<ioctl> (and C<fcntl>) is as follows:
+
+	if OS returns:		then Perl returns:
+	    -1	  		  undefined value
+	     0	 		string "0 but true"
+	anything else		    that number
+
+Thus Perl returns true on success and false on failure, yet you can
+still easily determine the actual value returned by the operating
+system:
+
+    $retval = ioctl(...) || -1;
+    printf "System returned %d\n", $retval;
+
+The special string C<"0 but true"> is exempt from B<-w> complaints
+about improper numeric conversions.
+
+=item join EXPR,LIST
+X<join>
+
+Joins the separate strings of LIST into a single string with fields
+separated by the value of EXPR, and returns that new string.  Example:
+
+    $rec = join(':', $login,$passwd,$uid,$gid,$gcos,$home,$shell);
+
+Beware that unlike C<split>, C<join> doesn't take a pattern as its
+first argument.  Compare L</split>.
+
+=item keys HASH
+X<keys> X<key>
+
+Returns a list consisting of all the keys of the named hash.
+(In scalar context, returns the number of keys.)
+
+The keys are returned in an apparently random order.  The actual
+random order is subject to change in future versions of perl, but it
+is guaranteed to be the same order as either the C<values> or C<each>
+function produces (given that the hash has not been modified).  Since
+Perl 5.8.1 the ordering is different even between different runs of
+Perl for security reasons (see L<perlsec/"Algorithmic Complexity
+Attacks">).
+
+As a side effect, calling keys() resets the HASH's internal iterator
+(see L</each>).  In particular, calling keys() in void context resets
+the iterator with no other overhead.
+
+Here is yet another way to print your environment:
+
+    @keys = keys %ENV;
+    @values = values %ENV;
+    while (@keys) {
+	print pop(@keys), '=', pop(@values), "\n";
+    }
+
+or how about sorted by key:
+
+    foreach $key (sort(keys %ENV)) {
+	print $key, '=', $ENV{$key}, "\n";
+    }
+
+The returned values are copies of the original keys in the hash, so
+modifying them will not affect the original hash.  Compare L</values>.
+
+To sort a hash by value, you'll need to use a C<sort> function.
+Here's a descending numeric sort of a hash by its values:
+
+    foreach $key (sort { $hash{$b} <=> $hash{$a} } keys %hash) {
+	printf "%4d %s\n", $hash{$key}, $key;
+    }
+
+As an lvalue C<keys> allows you to increase the number of hash buckets
+allocated for the given hash.  This can gain you a measure of efficiency if
+you know the hash is going to get big.  (This is similar to pre-extending
+an array by assigning a larger number to $#array.)  If you say
+
+    keys %hash = 200;
+
+then C<%hash> will have at least 200 buckets allocated for it--256 of them,
+in fact, since it rounds up to the next power of two.  These
+buckets will be retained even if you do C<%hash = ()>, use C<undef
+%hash> if you want to free the storage while C<%hash> is still in scope.
+You can't shrink the number of buckets allocated for the hash using
+C<keys> in this way (but you needn't worry about doing this by accident,
+as trying has no effect).
+
+See also C<each>, C<values> and C<sort>.
+
+=item kill SIGNAL, LIST
+X<kill> X<signal>
+
+Sends a signal to a list of processes.  Returns the number of
+processes successfully signaled (which is not necessarily the
+same as the number actually killed).
+
+    $cnt = kill 1, $child1, $child2;
+    kill 9, @goners;
+
+If SIGNAL is zero, no signal is sent to the process.  This is a
+useful way to check that a child process is alive and hasn't changed
+its UID.  See L<perlport> for notes on the portability of this
+construct.
+
+Unlike in the shell, if SIGNAL is negative, it kills
+process groups instead of processes.  (On System V, a negative I<PROCESS>
+number will also kill process groups, but that's not portable.)  That
+means you usually want to use positive not negative signals.  You may also
+use a signal name in quotes.
+
+See L<perlipc/"Signals"> for more details.
+
+=item last LABEL
+X<last> X<break>
+
+=item last
+
+The C<last> command is like the C<break> statement in C (as used in
+loops); it immediately exits the loop in question.  If the LABEL is
+omitted, the command refers to the innermost enclosing loop.  The
+C<continue> block, if any, is not executed:
+
+    LINE: while (<STDIN>) {
+	last LINE if /^$/;	# exit when done with header
+	#...
+    }
+
+C<last> cannot be used to exit a block which returns a value such as
+C<eval {}>, C<sub {}> or C<do {}>, and should not be used to exit
+a grep() or map() operation.
+
+Note that a block by itself is semantically identical to a loop
+that executes once.  Thus C<last> can be used to effect an early
+exit out of such a block.
+
+See also L</continue> for an illustration of how C<last>, C<next>, and
+C<redo> work.
+
+=item lc EXPR
+X<lc> X<lowercase>
+
+=item lc
+
+Returns a lowercased version of EXPR.  This is the internal function
+implementing the C<\L> escape in double-quoted strings.  Respects
+current LC_CTYPE locale if C<use locale> in force.  See L<perllocale>
+and L<perlunicode> for more details about locale and Unicode support.
+
+If EXPR is omitted, uses C<$_>.
+
+=item lcfirst EXPR
+X<lcfirst> X<lowercase>
+
+=item lcfirst
+
+Returns the value of EXPR with the first character lowercased.  This
+is the internal function implementing the C<\l> escape in
+double-quoted strings.  Respects current LC_CTYPE locale if C<use
+locale> in force.  See L<perllocale> and L<perlunicode> for more
+details about locale and Unicode support.
+
+If EXPR is omitted, uses C<$_>.
+
+=item length EXPR
+X<length> X<size>
+
+=item length
+
+Returns the length in I<characters> of the value of EXPR.  If EXPR is
+omitted, returns length of C<$_>.  Note that this cannot be used on
+an entire array or hash to find out how many elements these have.
+For that, use C<scalar @array> and C<scalar keys %hash> respectively.
+
+Note the I<characters>: if the EXPR is in Unicode, you will get the
+number of characters, not the number of bytes.  To get the length
+in bytes, use C<do { use bytes; length(EXPR) }>, see L<bytes>.
+
+=item link OLDFILE,NEWFILE
+X<link>
+
+Creates a new filename linked to the old filename.  Returns true for
+success, false otherwise.
+
+=item listen SOCKET,QUEUESIZE
+X<listen>
+
+Does the same thing that the listen system call does.  Returns true if
+it succeeded, false otherwise.  See the example in
+L<perlipc/"Sockets: Client/Server Communication">.
+
+=item local EXPR
+X<local>
+
+You really probably want to be using C<my> instead, because C<local> isn't
+what most people think of as "local".  See
+L<perlsub/"Private Variables via my()"> for details.
+
+A local modifies the listed variables to be local to the enclosing
+block, file, or eval.  If more than one value is listed, the list must
+be placed in parentheses.  See L<perlsub/"Temporary Values via local()">
+for details, including issues with tied arrays and hashes.
+
+=item localtime EXPR
+X<localtime>
+
+=item localtime
+
+Converts a time as returned by the time function to a 9-element list
+with the time analyzed for the local time zone.  Typically used as
+follows:
+
+    #  0    1    2     3     4    5     6     7     8
+    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+                                                localtime(time);
+
+All list elements are numeric, and come straight out of the C `struct
+tm'.  C<$sec>, C<$min>, and C<$hour> are the seconds, minutes, and hours
+of the specified time.
+
+C<$mday> is the day of the month, and C<$mon> is the month itself, in
+the range C<0..11> with 0 indicating January and 11 indicating December.
+This makes it easy to get a month name from a list:
+
+    my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
+    print "$abbr[$mon] $mday";
+    # $mon=9, $mday=18 gives "Oct 18"
+
+C<$year> is the number of years since 1900, not just the last two digits
+of the year.  That is, C<$year> is C<123> in year 2023.  The proper way
+to get a complete 4-digit year is simply:
+
+    $year += 1900;
+
+To get the last two digits of the year (e.g., '01' in 2001) do:
+
+    $year = sprintf("%02d", $year % 100);
+
+C<$wday> is the day of the week, with 0 indicating Sunday and 3 indicating
+Wednesday.  C<$yday> is the day of the year, in the range C<0..364>
+(or C<0..365> in leap years.)
+
+C<$isdst> is true if the specified time occurs during Daylight Saving
+Time, false otherwise.
+
+If EXPR is omitted, C<localtime()> uses the current time (C<localtime(time)>).
+
+In scalar context, C<localtime()> returns the ctime(3) value:
+
+    $now_string = localtime;  # e.g., "Thu Oct 13 04:54:34 1994"
+
+This scalar value is B<not> locale dependent but is a Perl builtin. For GMT
+instead of local time use the L</gmtime> builtin. See also the
+C<Time::Local> module (to convert the second, minutes, hours, ... back to
+the integer value returned by time()), and the L<POSIX> module's strftime(3)
+and mktime(3) functions.
+
+To get somewhat similar but locale dependent date strings, set up your
+locale environment variables appropriately (please see L<perllocale>) and
+try for example:
+
+    use POSIX qw(strftime);
+    $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;
+    # or for GMT formatted appropriately for your locale:
+    $now_string = strftime "%a %b %e %H:%M:%S %Y", gmtime;
+
+Note that the C<%a> and C<%b>, the short forms of the day of the week
+and the month of the year, may not necessarily be three characters wide.
+
+See L<perlport/localtime> for portability concerns.
+
+=item lock THING
+X<lock>
+
+This function places an advisory lock on a shared variable, or referenced
+object contained in I<THING> until the lock goes out of scope.
+
+lock() is a "weak keyword" : this means that if you've defined a function
+by this name (before any calls to it), that function will be called
+instead. (However, if you've said C<use threads>, lock() is always a
+keyword.) See L<threads>.
+
+=item log EXPR
+X<log> X<logarithm> X<e> X<ln> X<base>
+
+=item log
+
+Returns the natural logarithm (base I<e>) of EXPR.  If EXPR is omitted,
+returns log of C<$_>.  To get the log of another base, use basic algebra:
+The base-N log of a number is equal to the natural log of that number
+divided by the natural log of N.  For example:
+
+    sub log10 {
+	my $n = shift;
+	return log($n)/log(10);
+    }
+
+See also L</exp> for the inverse operation.
+
+=item lstat EXPR
+X<lstat>
+
+=item lstat
+
+Does the same thing as the C<stat> function (including setting the
+special C<_> filehandle) but stats a symbolic link instead of the file
+the symbolic link points to.  If symbolic links are unimplemented on
+your system, a normal C<stat> is done.  For much more detailed
+information, please see the documentation for L</stat>.
+
+If EXPR is omitted, stats C<$_>.
+
+=item m//
+
+The match operator.  See L<perlop>.
+
+=item map BLOCK LIST
+X<map>
+
+=item map EXPR,LIST
+
+Evaluates the BLOCK or EXPR for each element of LIST (locally setting
+C<$_> to each element) and returns the list value composed of the
+results of each such evaluation.  In scalar context, returns the
+total number of elements so generated.  Evaluates BLOCK or EXPR in
+list context, so each element of LIST may produce zero, one, or
+more elements in the returned value.
+
+    @chars = map(chr, @nums);
+
+translates a list of numbers to the corresponding characters.  And
+
+    %hash = map { getkey($_) => $_ } @array;
+
+is just a funny way to write
+
+    %hash = ();
+    foreach $_ (@array) {
+	$hash{getkey($_)} = $_;
+    }
+
+Note that C<$_> is an alias to the list value, so it can be used to
+modify the elements of the LIST.  While this is useful and supported,
+it can cause bizarre results if the elements of LIST are not variables.
+Using a regular C<foreach> loop for this purpose would be clearer in
+most cases.  See also L</grep> for an array composed of those items of
+the original list for which the BLOCK or EXPR evaluates to true.
+
+C<{> starts both hash references and blocks, so C<map { ...> could be either
+the start of map BLOCK LIST or map EXPR, LIST. Because perl doesn't look
+ahead for the closing C<}> it has to take a guess at which its dealing with
+based what it finds just after the C<{>. Usually it gets it right, but if it
+doesn't it won't realize something is wrong until it gets to the C<}> and
+encounters the missing (or unexpected) comma. The syntax error will be
+reported close to the C<}> but you'll need to change something near the C<{>
+such as using a unary C<+> to give perl some help:
+
+    %hash = map {  "\L$_", 1  } @array  # perl guesses EXPR.  wrong
+    %hash = map { +"\L$_", 1  } @array  # perl guesses BLOCK. right
+    %hash = map { ("\L$_", 1) } @array  # this also works
+    %hash = map {  lc($_), 1  } @array  # as does this.
+    %hash = map +( lc($_), 1 ), @array  # this is EXPR and works!
+
+    %hash = map  ( lc($_), 1 ), @array  # evaluates to (1, @array)
+
+or to force an anon hash constructor use C<+{>
+
+   @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end
+
+and you get list of anonymous hashes each with only 1 entry.
+
+=item mkdir FILENAME,MASK
+X<mkdir> X<md> X<directory, create>
+
+=item mkdir FILENAME
+
+Creates the directory specified by FILENAME, with permissions
+specified by MASK (as modified by C<umask>).  If it succeeds it
+returns true, otherwise it returns false and sets C<$!> (errno).
+If omitted, MASK defaults to 0777.
+
+In general, it is better to create directories with permissive MASK,
+and let the user modify that with their C<umask>, than it is to supply
+a restrictive MASK and give the user no way to be more permissive.
+The exceptions to this rule are when the file or directory should be
+kept private (mail files, for instance).  The perlfunc(1) entry on
+C<umask> discusses the choice of MASK in more detail.
+
+Note that according to the POSIX 1003.1-1996 the FILENAME may have any
+number of trailing slashes.  Some operating and filesystems do not get
+this right, so Perl automatically removes all trailing slashes to keep
+everyone happy.
+
+=item msgctl ID,CMD,ARG
+X<msgctl>
+
+Calls the System V IPC function msgctl(2).  You'll probably have to say
+
+    use IPC::SysV;
+
+first to get the correct constant definitions.  If CMD is C<IPC_STAT>,
+then ARG must be a variable that will hold the returned C<msqid_ds>
+structure.  Returns like C<ioctl>: the undefined value for error,
+C<"0 but true"> for zero, or the actual return value otherwise.  See also
+L<perlipc/"SysV IPC">, C<IPC::SysV>, and C<IPC::Semaphore> documentation.
+
+=item msgget KEY,FLAGS
+X<msgget>
+
+Calls the System V IPC function msgget(2).  Returns the message queue
+id, or the undefined value if there is an error.  See also
+L<perlipc/"SysV IPC"> and C<IPC::SysV> and C<IPC::Msg> documentation.
+
+=item msgrcv ID,VAR,SIZE,TYPE,FLAGS
+X<msgrcv>
+
+Calls the System V IPC function msgrcv to receive a message from
+message queue ID into variable VAR with a maximum message size of
+SIZE.  Note that when a message is received, the message type as a
+native long integer will be the first thing in VAR, followed by the
+actual message.  This packing may be opened with C<unpack("l! a*")>.
+Taints the variable.  Returns true if successful, or false if there is
+an error.  See also L<perlipc/"SysV IPC">, C<IPC::SysV>, and
+C<IPC::SysV::Msg> documentation.
+
+=item msgsnd ID,MSG,FLAGS
+X<msgsnd>
+
+Calls the System V IPC function msgsnd to send the message MSG to the
+message queue ID.  MSG must begin with the native long integer message
+type, and be followed by the length of the actual message, and finally
+the message itself.  This kind of packing can be achieved with
+C<pack("l! a*", $type, $message)>.  Returns true if successful,
+or false if there is an error.  See also C<IPC::SysV>
+and C<IPC::SysV::Msg> documentation.
+
+=item my EXPR
+X<my>
+
+=item my TYPE EXPR
+
+=item my EXPR : ATTRS
+
+=item my TYPE EXPR : ATTRS
+
+A C<my> declares the listed variables to be local (lexically) to the
+enclosing block, file, or C<eval>.  If more than one value is listed,
+the list must be placed in parentheses.
+
+The exact semantics and interface of TYPE and ATTRS are still
+evolving.  TYPE is currently bound to the use of C<fields> pragma,
+and attributes are handled using the C<attributes> pragma, or starting
+from Perl 5.8.0 also via the C<Attribute::Handlers> module.  See
+L<perlsub/"Private Variables via my()"> for details, and L<fields>,
+L<attributes>, and L<Attribute::Handlers>.
+
+=item next LABEL
+X<next> X<continue>
+
+=item next
+
+The C<next> command is like the C<continue> statement in C; it starts
+the next iteration of the loop:
+
+    LINE: while (<STDIN>) {
+	next LINE if /^#/;	# discard comments
+	#...
+    }
+
+Note that if there were a C<continue> block on the above, it would get
+executed even on discarded lines.  If the LABEL is omitted, the command
+refers to the innermost enclosing loop.
+
+C<next> cannot be used to exit a block which returns a value such as
+C<eval {}>, C<sub {}> or C<do {}>, and should not be used to exit
+a grep() or map() operation.
+
+Note that a block by itself is semantically identical to a loop
+that executes once.  Thus C<next> will exit such a block early.
+
+See also L</continue> for an illustration of how C<last>, C<next>, and
+C<redo> work.
+
+=item no Module VERSION LIST
+X<no>
+
+=item no Module VERSION
+
+=item no Module LIST
+
+=item no Module
+
+See the C<use> function, which C<no> is the opposite of.
+
+=item oct EXPR
+X<oct> X<octal> X<hex> X<hexadecimal> X<binary> X<bin>
+
+=item oct
+
+Interprets EXPR as an octal string and returns the corresponding
+value.  (If EXPR happens to start off with C<0x>, interprets it as a
+hex string.  If EXPR starts off with C<0b>, it is interpreted as a
+binary string.  Leading whitespace is ignored in all three cases.)
+The following will handle decimal, binary, octal, and hex in the standard
+Perl or C notation:
+
+    $val = oct($val) if $val =~ /^0/;
+
+If EXPR is omitted, uses C<$_>.   To go the other way (produce a number
+in octal), use sprintf() or printf():
+
+    $perms = (stat("filename"))[2] & 07777;
+    $oct_perms = sprintf "%lo", $perms;
+
+The oct() function is commonly used when a string such as C<644> needs
+to be converted into a file mode, for example. (Although perl will
+automatically convert strings into numbers as needed, this automatic
+conversion assumes base 10.)
+
+=item open FILEHANDLE,EXPR
+X<open> X<pipe> X<file, open> X<fopen>
+
+=item open FILEHANDLE,MODE,EXPR
+
+=item open FILEHANDLE,MODE,EXPR,LIST
+
+=item open FILEHANDLE,MODE,REFERENCE
+
+=item open FILEHANDLE
+
+Opens the file whose filename is given by EXPR, and associates it with
+FILEHANDLE.
+
+(The following is a comprehensive reference to open(): for a gentler
+introduction you may consider L<perlopentut>.)
+
+If FILEHANDLE is an undefined scalar variable (or array or hash element)
+the variable is assigned a reference to a new anonymous filehandle,
+otherwise if FILEHANDLE is an expression, its value is used as the name of
+the real filehandle wanted.  (This is considered a symbolic reference, so
+C<use strict 'refs'> should I<not> be in effect.)
+
+If EXPR is omitted, the scalar variable of the same name as the
+FILEHANDLE contains the filename.  (Note that lexical variables--those
+declared with C<my>--will not work for this purpose; so if you're
+using C<my>, specify EXPR in your call to open.)
+
+If three or more arguments are specified then the mode of opening and
+the file name are separate. If MODE is C<< '<' >> or nothing, the file
+is opened for input.  If MODE is C<< '>' >>, the file is truncated and
+opened for output, being created if necessary.  If MODE is C<<< '>>' >>>,
+the file is opened for appending, again being created if necessary.
+
+You can put a C<'+'> in front of the C<< '>' >> or C<< '<' >> to
+indicate that you want both read and write access to the file; thus
+C<< '+<' >> is almost always preferred for read/write updates--the C<<
+'+>' >> mode would clobber the file first.  You can't usually use
+either read-write mode for updating textfiles, since they have
+variable length records.  See the B<-i> switch in L<perlrun> for a
+better approach.  The file is created with permissions of C<0666>
+modified by the process' C<umask> value.
+
+These various prefixes correspond to the fopen(3) modes of C<'r'>,
+C<'r+'>, C<'w'>, C<'w+'>, C<'a'>, and C<'a+'>.
+
+In the 2-arguments (and 1-argument) form of the call the mode and
+filename should be concatenated (in this order), possibly separated by
+spaces.  It is possible to omit the mode in these forms if the mode is
+C<< '<' >>.
+
+If the filename begins with C<'|'>, the filename is interpreted as a
+command to which output is to be piped, and if the filename ends with a
+C<'|'>, the filename is interpreted as a command which pipes output to
+us.  See L<perlipc/"Using open() for IPC">
+for more examples of this.  (You are not allowed to C<open> to a command
+that pipes both in I<and> out, but see L<IPC::Open2>, L<IPC::Open3>,
+and L<perlipc/"Bidirectional Communication with Another Process">
+for alternatives.)
+
+For three or more arguments if MODE is C<'|-'>, the filename is
+interpreted as a command to which output is to be piped, and if MODE
+is C<'-|'>, the filename is interpreted as a command which pipes
+output to us.  In the 2-arguments (and 1-argument) form one should
+replace dash (C<'-'>) with the command.
+See L<perlipc/"Using open() for IPC"> for more examples of this.
+(You are not allowed to C<open> to a command that pipes both in I<and>
+out, but see L<IPC::Open2>, L<IPC::Open3>, and
+L<perlipc/"Bidirectional Communication"> for alternatives.)
+
+In the three-or-more argument form of pipe opens, if LIST is specified
+(extra arguments after the command name) then LIST becomes arguments
+to the command invoked if the platform supports it.  The meaning of
+C<open> with more than three arguments for non-pipe modes is not yet
+specified. Experimental "layers" may give extra LIST arguments
+meaning.
+
+In the 2-arguments (and 1-argument) form opening C<'-'> opens STDIN
+and opening C<< '>-' >> opens STDOUT.
+
+You may use the three-argument form of open to specify IO "layers"
+(sometimes also referred to as "disciplines") to be applied to the handle
+that affect how the input and output are processed (see L<open> and
+L<PerlIO> for more details). For example
+
+  open(FH, "<:utf8", "file")
+
+will open the UTF-8 encoded file containing Unicode characters,
+see L<perluniintro>. Note that if layers are specified in the
+three-arg form then default layers stored in ${^OPEN} (see L<perlvar>;
+usually set by the B<open> pragma or the switch B<-CioD>) are ignored.
+
+Open returns nonzero upon success, the undefined value otherwise.  If
+the C<open> involved a pipe, the return value happens to be the pid of
+the subprocess.
+
+If you're running Perl on a system that distinguishes between text
+files and binary files, then you should check out L</binmode> for tips
+for dealing with this.  The key distinction between systems that need
+C<binmode> and those that don't is their text file formats.  Systems
+like Unix, Mac OS, and Plan 9, which delimit lines with a single
+character, and which encode that character in C as C<"\n">, do not
+need C<binmode>.  The rest need it.
+
+When opening a file, it's usually a bad idea to continue normal execution
+if the request failed, so C<open> is frequently used in connection with
+C<die>.  Even if C<die> won't do what you want (say, in a CGI script,
+where you want to make a nicely formatted error message (but there are
+modules that can help with that problem)) you should always check
+the return value from opening a file.  The infrequent exception is when
+working with an unopened filehandle is actually what you want to do.
+
+As a special case the 3-arg form with a read/write mode and the third
+argument being C<undef>:
+
+    open(TMP, "+>", undef) or die ...
+
+opens a filehandle to an anonymous temporary file.  Also using "+<"
+works for symmetry, but you really should consider writing something
+to the temporary file first.  You will need to seek() to do the
+reading.
+
+Since v5.8.0, perl has built using PerlIO by default.  Unless you've
+changed this (i.e. Configure -Uuseperlio), you can open file handles to
+"in memory" files held in Perl scalars via:
+
+    open($fh, '>', \$variable) || ..
+
+Though if you try to re-open C<STDOUT> or C<STDERR> as an "in memory"
+file, you have to close it first:
+
+    close STDOUT;
+    open STDOUT, '>', \$variable or die "Can't open STDOUT: $!";
+
+Examples:
+
+    $ARTICLE = 100;
+    open ARTICLE or die "Can't find article $ARTICLE: $!\n";
+    while (<ARTICLE>) {...
+
+    open(LOG, '>>/usr/spool/news/twitlog');	# (log is reserved)
+    # if the open fails, output is discarded
+
+    open(DBASE, '+<', 'dbase.mine')		# open for update
+	or die "Can't open 'dbase.mine' for update: $!";
+
+    open(DBASE, '+<dbase.mine')			# ditto
+	or die "Can't open 'dbase.mine' for update: $!";
+
+    open(ARTICLE, '-|', "caesar <$article")     # decrypt article
+	or die "Can't start caesar: $!";
+
+    open(ARTICLE, "caesar <$article |")		# ditto
+	or die "Can't start caesar: $!";
+
+    open(EXTRACT, "|sort >Tmp$$")		# $$ is our process id
+	or die "Can't start sort: $!";
+
+    # in memory files
+    open(MEMORY,'>', \$var)
+	or die "Can't open memory file: $!";
+    print MEMORY "foo!\n";			# output will end up in $var
+
+    # process argument list of files along with any includes
+
+    foreach $file (@ARGV) {
+	process($file, 'fh00');
+    }
+
+    sub process {
+	my($filename, $input) = @_;
+	$input++;		# this is a string increment
+	unless (open($input, $filename)) {
+	    print STDERR "Can't open $filename: $!\n";
+	    return;
+	}
+
+	local $_;
+	while (<$input>) {		# note use of indirection
+	    if (/^#include "(.*)"/) {
+		process($1, $input);
+		next;
+	    }
+	    #...		# whatever
+	}
+    }
+
+See L<perliol> for detailed info on PerlIO.
+
+You may also, in the Bourne shell tradition, specify an EXPR beginning
+with C<< '>&' >>, in which case the rest of the string is interpreted
+as the name of a filehandle (or file descriptor, if numeric) to be
+duped (as L<dup(2)>) and opened.  You may use C<&> after C<< > >>,
+C<<< >> >>>, C<< < >>, C<< +> >>, C<<< +>> >>>, and C<< +< >>.
+The mode you specify should match the mode of the original filehandle.
+(Duping a filehandle does not take into account any existing contents
+of IO buffers.) If you use the 3-arg form then you can pass either a
+number, the name of a filehandle or the normal "reference to a glob".
+
+Here is a script that saves, redirects, and restores C<STDOUT> and
+C<STDERR> using various methods:
+
+    #!/usr/bin/perl
+    open my $oldout, ">&STDOUT"     or die "Can't dup STDOUT: $!";
+    open OLDERR,     ">&", \*STDERR or die "Can't dup STDERR: $!";
+
+    open STDOUT, '>', "foo.out" or die "Can't redirect STDOUT: $!";
+    open STDERR, ">&STDOUT"     or die "Can't dup STDOUT: $!";
+
+    select STDERR; $| = 1;	# make unbuffered
+    select STDOUT; $| = 1;	# make unbuffered
+
+    print STDOUT "stdout 1\n";	# this works for
+    print STDERR "stderr 1\n"; 	# subprocesses too
+
+    open STDOUT, ">&", $oldout or die "Can't dup \$oldout: $!";
+    open STDERR, ">&OLDERR"    or die "Can't dup OLDERR: $!";
+
+    print STDOUT "stdout 2\n";
+    print STDERR "stderr 2\n";
+
+If you specify C<< '<&=X' >>, where C<X> is a file descriptor number
+or a filehandle, then Perl will do an equivalent of C's C<fdopen> of
+that file descriptor (and not call L<dup(2)>); this is more
+parsimonious of file descriptors.  For example:
+
+    # open for input, reusing the fileno of $fd
+    open(FILEHANDLE, "<&=$fd")
+
+or
+
+    open(FILEHANDLE, "<&=", $fd)
+
+or
+
+    # open for append, using the fileno of OLDFH
+    open(FH, ">>&=", OLDFH)
+
+or
+
+    open(FH, ">>&=OLDFH")
+
+Being parsimonious on filehandles is also useful (besides being
+parsimonious) for example when something is dependent on file
+descriptors, like for example locking using flock().  If you do just
+C<< open(A, '>>&B') >>, the filehandle A will not have the same file
+descriptor as B, and therefore flock(A) will not flock(B), and vice
+versa.  But with C<< open(A, '>>&=B') >> the filehandles will share
+the same file descriptor.
+
+Note that if you are using Perls older than 5.8.0, Perl will be using
+the standard C libraries' fdopen() to implement the "=" functionality.
+On many UNIX systems fdopen() fails when file descriptors exceed a
+certain value, typically 255.  For Perls 5.8.0 and later, PerlIO is
+most often the default.
+
+You can see whether Perl has been compiled with PerlIO or not by
+running C<perl -V> and looking for C<useperlio=> line.  If C<useperlio>
+is C<define>, you have PerlIO, otherwise you don't.
+
+If you open a pipe on the command C<'-'>, i.e., either C<'|-'> or C<'-|'>
+with 2-arguments (or 1-argument) form of open(), then
+there is an implicit fork done, and the return value of open is the pid
+of the child within the parent process, and C<0> within the child
+process.  (Use C<defined($pid)> to determine whether the open was successful.)
+The filehandle behaves normally for the parent, but i/o to that
+filehandle is piped from/to the STDOUT/STDIN of the child process.
+In the child process the filehandle isn't opened--i/o happens from/to
+the new STDOUT or STDIN.  Typically this is used like the normal
+piped open when you want to exercise more control over just how the
+pipe command gets executed, such as when you are running setuid, and
+don't want to have to scan shell commands for metacharacters.
+The following triples are more or less equivalent:
+
+    open(FOO, "|tr '[a-z]' '[A-Z]'");
+    open(FOO, '|-', "tr '[a-z]' '[A-Z]'");
+    open(FOO, '|-') || exec 'tr', '[a-z]', '[A-Z]';
+    open(FOO, '|-', "tr", '[a-z]', '[A-Z]');
+
+    open(FOO, "cat -n '$file'|");
+    open(FOO, '-|', "cat -n '$file'");
+    open(FOO, '-|') || exec 'cat', '-n', $file;
+    open(FOO, '-|', "cat", '-n', $file);
+
+The last example in each block shows the pipe as "list form", which is
+not yet supported on all platforms.  A good rule of thumb is that if
+your platform has true C<fork()> (in other words, if your platform is
+UNIX) you can use the list form.
+
+See L<perlipc/"Safe Pipe Opens"> for more examples of this.
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before any operation that may do a fork, but this may not be
+supported on some platforms (see L<perlport>).  To be safe, you may need
+to set C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method
+of C<IO::Handle> on any open handles.
+
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptor as determined by the value
+of $^F.  See L<perlvar/$^F>.
+
+Closing any piped filehandle causes the parent process to wait for the
+child to finish, and returns the status value in C<$?>.
+
+The filename passed to 2-argument (or 1-argument) form of open() will
+have leading and trailing whitespace deleted, and the normal
+redirection characters honored.  This property, known as "magic open",
+can often be used to good effect.  A user could specify a filename of
+F<"rsh cat file |">, or you could change certain filenames as needed:
+
+    $filename =~ s/(.*\.gz)\s*$/gzip -dc < $1|/;
+    open(FH, $filename) or die "Can't open $filename: $!";
+
+Use 3-argument form to open a file with arbitrary weird characters in it,
+
+    open(FOO, '<', $file);
+
+otherwise it's necessary to protect any leading and trailing whitespace:
+
+    $file =~ s#^(\s)#./$1#;
+    open(FOO, "< $file\0");
+
+(this may not work on some bizarre filesystems).  One should
+conscientiously choose between the I<magic> and 3-arguments form
+of open():
+
+    open IN, $ARGV[0];
+
+will allow the user to specify an argument of the form C<"rsh cat file |">,
+but will not work on a filename which happens to have a trailing space, while
+
+    open IN, '<', $ARGV[0];
+
+will have exactly the opposite restrictions.
+
+If you want a "real" C C<open> (see L<open(2)> on your system), then you
+should use the C<sysopen> function, which involves no such magic (but
+may use subtly different filemodes than Perl open(), which is mapped
+to C fopen()).  This is
+another way to protect your filenames from interpretation.  For example:
+
+    use IO::Handle;
+    sysopen(HANDLE, $path, O_RDWR|O_CREAT|O_EXCL)
+	or die "sysopen $path: $!";
+    $oldfh = select(HANDLE); $| = 1; select($oldfh);
+    print HANDLE "stuff $$\n";
+    seek(HANDLE, 0, 0);
+    print "File contains: ", <HANDLE>;
+
+Using the constructor from the C<IO::Handle> package (or one of its
+subclasses, such as C<IO::File> or C<IO::Socket>), you can generate anonymous
+filehandles that have the scope of whatever variables hold references to
+them, and automatically close whenever and however you leave that scope:
+
+    use IO::File;
+    #...
+    sub read_myfile_munged {
+	my $ALL = shift;
+	my $handle = new IO::File;
+	open($handle, "myfile") or die "myfile: $!";
+	$first = <$handle>
+	    or return ();     # Automatically closed here.
+	mung $first or die "mung failed";	# Or here.
+	return $first, <$handle> if $ALL;	# Or here.
+	$first;					# Or here.
+    }
+
+See L</seek> for some details about mixing reading and writing.
+
+=item opendir DIRHANDLE,EXPR
+X<opendir>
+
+Opens a directory named EXPR for processing by C<readdir>, C<telldir>,
+C<seekdir>, C<rewinddir>, and C<closedir>.  Returns true if successful.
+DIRHANDLE may be an expression whose value can be used as an indirect
+dirhandle, usually the real dirhandle name.  If DIRHANDLE is an undefined
+scalar variable (or array or hash element), the variable is assigned a
+reference to a new anonymous dirhandle.
+DIRHANDLEs have their own namespace separate from FILEHANDLEs.
+
+=item ord EXPR
+X<ord> X<encoding>
+
+=item ord
+
+Returns the numeric (the native 8-bit encoding, like ASCII or EBCDIC,
+or Unicode) value of the first character of EXPR.  If EXPR is omitted,
+uses C<$_>.
+
+For the reverse, see L</chr>.
+See L<perlunicode> and L<encoding> for more about Unicode.
+
+=item our EXPR
+X<our> X<global>
+
+=item our EXPR TYPE
+
+=item our EXPR : ATTRS
+
+=item our TYPE EXPR : ATTRS
+
+C<our> associates a simple name with a package variable in the current
+package for use within the current scope.  When C<use strict 'vars'> is in
+effect, C<our> lets you use declared global variables without qualifying
+them with package names, within the lexical scope of the C<our> declaration.
+In this way C<our> differs from C<use vars>, which is package scoped.
+
+Unlike C<my>, which both allocates storage for a variable and associates
+a simple name with that storage for use within the current scope, C<our>
+associates a simple name with a package variable in the current package,
+for use within the current scope.  In other words, C<our> has the same
+scoping rules as C<my>, but does not necessarily create a
+variable.
+
+If more than one value is listed, the list must be placed
+in parentheses.
+
+    our $foo;
+    our($bar, $baz);
+
+An C<our> declaration declares a global variable that will be visible
+across its entire lexical scope, even across package boundaries.  The
+package in which the variable is entered is determined at the point
+of the declaration, not at the point of use.  This means the following
+behavior holds:
+
+    package Foo;
+    our $bar;		# declares $Foo::bar for rest of lexical scope
+    $bar = 20;
+
+    package Bar;
+    print $bar;		# prints 20, as it refers to $Foo::bar
+
+Multiple C<our> declarations with the same name in the same lexical
+scope are allowed if they are in different packages.  If they happen
+to be in the same package, Perl will emit warnings if you have asked
+for them, just like multiple C<my> declarations.  Unlike a second
+C<my> declaration, which will bind the name to a fresh variable, a
+second C<our> declaration in the same package, in the same scope, is
+merely redundant.
+
+    use warnings;
+    package Foo;
+    our $bar;		# declares $Foo::bar for rest of lexical scope
+    $bar = 20;
+
+    package Bar;
+    our $bar = 30;	# declares $Bar::bar for rest of lexical scope
+    print $bar;		# prints 30
+
+    our $bar;		# emits warning but has no other effect
+    print $bar;		# still prints 30
+
+An C<our> declaration may also have a list of attributes associated
+with it.
+
+The exact semantics and interface of TYPE and ATTRS are still
+evolving.  TYPE is currently bound to the use of C<fields> pragma,
+and attributes are handled using the C<attributes> pragma, or starting
+from Perl 5.8.0 also via the C<Attribute::Handlers> module.  See
+L<perlsub/"Private Variables via my()"> for details, and L<fields>,
+L<attributes>, and L<Attribute::Handlers>.
+
+The only currently recognized C<our()> attribute is C<unique> which
+indicates that a single copy of the global is to be used by all
+interpreters should the program happen to be running in a
+multi-interpreter environment. (The default behaviour would be for
+each interpreter to have its own copy of the global.)  Examples:
+
+    our @EXPORT : unique = qw(foo);
+    our %EXPORT_TAGS : unique = (bar => [qw(aa bb cc)]);
+    our $VERSION : unique = "1.00";
+
+Note that this attribute also has the effect of making the global
+readonly when the first new interpreter is cloned (for example,
+when the first new thread is created).
+
+Multi-interpreter environments can come to being either through the
+fork() emulation on Windows platforms, or by embedding perl in a
+multi-threaded application.  The C<unique> attribute does nothing in
+all other environments.
+
+Warning: the current implementation of this attribute operates on the
+typeglob associated with the variable; this means that C<our $x : unique>
+also has the effect of C<our @x : unique; our %x : unique>. This may be
+subject to change.
+
+=item pack TEMPLATE,LIST
+X<pack>
+
+Takes a LIST of values and converts it into a string using the rules
+given by the TEMPLATE.  The resulting string is the concatenation of
+the converted values.  Typically, each converted value looks
+like its machine-level representation.  For example, on 32-bit machines
+a converted integer may be represented by a sequence of 4 bytes.
+
+The TEMPLATE is a sequence of characters that give the order and type
+of values, as follows:
+
+    a	A string with arbitrary binary data, will be null padded.
+    A	A text (ASCII) string, will be space padded.
+    Z	A null terminated (ASCIZ) string, will be null padded.
+
+    b	A bit string (ascending bit order inside each byte, like vec()).
+    B	A bit string (descending bit order inside each byte).
+    h	A hex string (low nybble first).
+    H	A hex string (high nybble first).
+
+    c	A signed char value.
+    C	An unsigned char value.  Only does bytes.  See U for Unicode.
+
+    s	A signed short value.
+    S	An unsigned short value.
+	  (This 'short' is _exactly_ 16 bits, which may differ from
+	   what a local C compiler calls 'short'.  If you want
+	   native-length shorts, use the '!' suffix.)
+
+    i	A signed integer value.
+    I	An unsigned integer value.
+	  (This 'integer' is _at_least_ 32 bits wide.  Its exact
+           size depends on what a local C compiler calls 'int',
+           and may even be larger than the 'long' described in
+           the next item.)
+
+    l	A signed long value.
+    L	An unsigned long value.
+	  (This 'long' is _exactly_ 32 bits, which may differ from
+	   what a local C compiler calls 'long'.  If you want
+	   native-length longs, use the '!' suffix.)
+
+    n	An unsigned short in "network" (big-endian) order.
+    N	An unsigned long in "network" (big-endian) order.
+    v	An unsigned short in "VAX" (little-endian) order.
+    V	An unsigned long in "VAX" (little-endian) order.
+	  (These 'shorts' and 'longs' are _exactly_ 16 bits and
+	   _exactly_ 32 bits, respectively.)
+
+    q	A signed quad (64-bit) value.
+    Q	An unsigned quad value.
+	  (Quads are available only if your system supports 64-bit
+	   integer values _and_ if Perl has been compiled to support those.
+           Causes a fatal error otherwise.)
+
+    j   A signed integer value (a Perl internal integer, IV).
+    J   An unsigned integer value (a Perl internal unsigned integer, UV).
+
+    f	A single-precision float in the native format.
+    d	A double-precision float in the native format.
+
+    F	A floating point value in the native native format
+           (a Perl internal floating point value, NV).
+    D	A long double-precision float in the native format.
+	  (Long doubles are available only if your system supports long
+	   double values _and_ if Perl has been compiled to support those.
+           Causes a fatal error otherwise.)
+
+    p	A pointer to a null-terminated string.
+    P	A pointer to a structure (fixed-length string).
+
+    u	A uuencoded string.
+    U	A Unicode character number.  Encodes to UTF-8 internally
+	(or UTF-EBCDIC in EBCDIC platforms).
+
+    w	A BER compressed integer (not an ASN.1 BER, see perlpacktut for
+	details).  Its bytes represent an unsigned integer in base 128,
+	most significant digit first, with as few digits as possible.  Bit
+	eight (the high bit) is set on each byte except the last.
+
+    x	A null byte.
+    X	Back up a byte.
+    @	Null fill to absolute position, counted from the start of
+        the innermost ()-group.
+    (	Start of a ()-group.
+
+The following rules apply:
+
+=over 8
+
+=item *
+
+Each letter may optionally be followed by a number giving a repeat
+count.  With all types except C<a>, C<A>, C<Z>, C<b>, C<B>, C<h>,
+C<H>, C<@>, C<x>, C<X> and C<P> the pack function will gobble up that
+many values from the LIST.  A C<*> for the repeat count means to use
+however many items are left, except for C<@>, C<x>, C<X>, where it is
+equivalent to C<0>, and C<u>, where it is equivalent to 1 (or 45, what
+is the same).  A numeric repeat count may optionally be enclosed in
+brackets, as in C<pack 'C[80]', @arr>.
+
+One can replace the numeric repeat count by a template enclosed in brackets;
+then the packed length of this template in bytes is used as a count.
+For example, C<x[L]> skips a long (it skips the number of bytes in a long);
+the template C<$t X[$t] $t> unpack()s twice what $t unpacks.
+If the template in brackets contains alignment commands (such as C<x![d]>),
+its packed length is calculated as if the start of the template has the maximal
+possible alignment.
+
+When used with C<Z>, C<*> results in the addition of a trailing null
+byte (so the packed result will be one longer than the byte C<length>
+of the item).
+
+The repeat count for C<u> is interpreted as the maximal number of bytes
+to encode per line of output, with 0 and 1 replaced by 45.
+
+=item *
+
+The C<a>, C<A>, and C<Z> types gobble just one value, but pack it as a
+string of length count, padding with nulls or spaces as necessary.  When
+unpacking, C<A> strips trailing spaces and nulls, C<Z> strips everything
+after the first null, and C<a> returns data verbatim.  When packing,
+C<a>, and C<Z> are equivalent.
+
+If the value-to-pack is too long, it is truncated.  If too long and an
+explicit count is provided, C<Z> packs only C<$count-1> bytes, followed
+by a null byte.  Thus C<Z> always packs a trailing null byte under
+all circumstances.
+
+=item *
+
+Likewise, the C<b> and C<B> fields pack a string that many bits long.
+Each byte of the input field of pack() generates 1 bit of the result.
+Each result bit is based on the least-significant bit of the corresponding
+input byte, i.e., on C<ord($byte)%2>.  In particular, bytes C<"0"> and
+C<"1"> generate bits 0 and 1, as do bytes C<"\0"> and C<"\1">.
+
+Starting from the beginning of the input string of pack(), each 8-tuple
+of bytes is converted to 1 byte of output.  With format C<b>
+the first byte of the 8-tuple determines the least-significant bit of a
+byte, and with format C<B> it determines the most-significant bit of
+a byte.
+
+If the length of the input string is not exactly divisible by 8, the
+remainder is packed as if the input string were padded by null bytes
+at the end.  Similarly, during unpack()ing the "extra" bits are ignored.
+
+If the input string of pack() is longer than needed, extra bytes are ignored.
+A C<*> for the repeat count of pack() means to use all the bytes of
+the input field.  On unpack()ing the bits are converted to a string
+of C<"0">s and C<"1">s.
+
+=item *
+
+The C<h> and C<H> fields pack a string that many nybbles (4-bit groups,
+representable as hexadecimal digits, 0-9a-f) long.
+
+Each byte of the input field of pack() generates 4 bits of the result.
+For non-alphabetical bytes the result is based on the 4 least-significant
+bits of the input byte, i.e., on C<ord($byte)%16>.  In particular,
+bytes C<"0"> and C<"1"> generate nybbles 0 and 1, as do bytes
+C<"\0"> and C<"\1">.  For bytes C<"a".."f"> and C<"A".."F"> the result
+is compatible with the usual hexadecimal digits, so that C<"a"> and
+C<"A"> both generate the nybble C<0xa==10>.  The result for bytes
+C<"g".."z"> and C<"G".."Z"> is not well-defined.
+
+Starting from the beginning of the input string of pack(), each pair
+of bytes is converted to 1 byte of output.  With format C<h> the
+first byte of the pair determines the least-significant nybble of the
+output byte, and with format C<H> it determines the most-significant
+nybble.
+
+If the length of the input string is not even, it behaves as if padded
+by a null byte at the end.  Similarly, during unpack()ing the "extra"
+nybbles are ignored.
+
+If the input string of pack() is longer than needed, extra bytes are ignored.
+A C<*> for the repeat count of pack() means to use all the bytes of
+the input field.  On unpack()ing the bits are converted to a string
+of hexadecimal digits.
+
+=item *
+
+The C<p> type packs a pointer to a null-terminated string.  You are
+responsible for ensuring the string is not a temporary value (which can
+potentially get deallocated before you get around to using the packed result).
+The C<P> type packs a pointer to a structure of the size indicated by the
+length.  A NULL pointer is created if the corresponding value for C<p> or
+C<P> is C<undef>, similarly for unpack().
+
+=item *
+
+The C</> template character allows packing and unpacking of strings where
+the packed structure contains a byte count followed by the string itself.
+You write I<length-item>C</>I<string-item>.
+
+The I<length-item> can be any C<pack> template letter, and describes
+how the length value is packed.  The ones likely to be of most use are
+integer-packing ones like C<n> (for Java strings), C<w> (for ASN.1 or
+SNMP) and C<N> (for Sun XDR).
+
+For C<pack>, the I<string-item> must, at present, be C<"A*">, C<"a*"> or
+C<"Z*">. For C<unpack> the length of the string is obtained from the
+I<length-item>, but if you put in the '*' it will be ignored. For all other
+codes, C<unpack> applies the length value to the next item, which must not
+have a repeat count.
+
+    unpack 'C/a', "\04Gurusamy";        gives 'Guru'
+    unpack 'a3/A* A*', '007 Bond  J ';  gives (' Bond','J')
+    pack 'n/a* w/a*','hello,','world';  gives "\000\006hello,\005world"
+
+The I<length-item> is not returned explicitly from C<unpack>.
+
+Adding a count to the I<length-item> letter is unlikely to do anything
+useful, unless that letter is C<A>, C<a> or C<Z>.  Packing with a
+I<length-item> of C<a> or C<Z> may introduce C<"\000"> characters,
+which Perl does not regard as legal in numeric strings.
+
+=item *
+
+The integer types C<s>, C<S>, C<l>, and C<L> may be
+immediately followed by a C<!> suffix to signify native shorts or
+longs--as you can see from above for example a bare C<l> does mean
+exactly 32 bits, the native C<long> (as seen by the local C compiler)
+may be larger.  This is an issue mainly in 64-bit platforms.  You can
+see whether using C<!> makes any difference by
+
+	print length(pack("s")), " ", length(pack("s!")), "\n";
+	print length(pack("l")), " ", length(pack("l!")), "\n";
+
+C<i!> and C<I!> also work but only because of completeness;
+they are identical to C<i> and C<I>.
+
+The actual sizes (in bytes) of native shorts, ints, longs, and long
+longs on the platform where Perl was built are also available via
+L<Config>:
+
+       use Config;
+       print $Config{shortsize},    "\n";
+       print $Config{intsize},      "\n";
+       print $Config{longsize},     "\n";
+       print $Config{longlongsize}, "\n";
+
+(The C<$Config{longlongsize}> will be undefined if your system does
+not support long longs.)
+
+=item *
+
+The integer formats C<s>, C<S>, C<i>, C<I>, C<l>, C<L>, C<j>, and C<J>
+are inherently non-portable between processors and operating systems
+because they obey the native byteorder and endianness.  For example a
+4-byte integer 0x12345678 (305419896 decimal) would be ordered natively
+(arranged in and handled by the CPU registers) into bytes as
+
+ 	0x12 0x34 0x56 0x78	# big-endian
+ 	0x78 0x56 0x34 0x12	# little-endian
+
+Basically, the Intel and VAX CPUs are little-endian, while everybody
+else, for example Motorola m68k/88k, PPC, Sparc, HP PA, Power, and
+Cray are big-endian.  Alpha and MIPS can be either: Digital/Compaq
+used/uses them in little-endian mode; SGI/Cray uses them in big-endian
+mode.
+
+The names `big-endian' and `little-endian' are comic references to
+the classic "Gulliver's Travels" (via the paper "On Holy Wars and a
+Plea for Peace" by Danny Cohen, USC/ISI IEN 137, April 1, 1980) and
+the egg-eating habits of the Lilliputians.
+
+Some systems may have even weirder byte orders such as
+
+ 	0x56 0x78 0x12 0x34
+ 	0x34 0x12 0x78 0x56
+
+You can see your system's preference with
+
+ 	print join(" ", map { sprintf "%#02x", $_ }
+                            unpack("C*",pack("L",0x12345678))), "\n";
+
+The byteorder on the platform where Perl was built is also available
+via L<Config>:
+
+	use Config;
+	print $Config{byteorder}, "\n";
+
+Byteorders C<'1234'> and C<'12345678'> are little-endian, C<'4321'>
+and C<'87654321'> are big-endian.
+
+If you want portable packed integers use the formats C<n>, C<N>,
+C<v>, and C<V>, their byte endianness and size are known.
+See also L<perlport>.
+
+=item *
+
+Real numbers (floats and doubles) are in the native machine format only;
+due to the multiplicity of floating formats around, and the lack of a
+standard "network" representation, no facility for interchange has been
+made.  This means that packed floating point data written on one machine
+may not be readable on another - even if both use IEEE floating point
+arithmetic (as the endian-ness of the memory representation is not part
+of the IEEE spec).  See also L<perlport>.
+
+Note that Perl uses doubles internally for all numeric calculation, and
+converting from double into float and thence back to double again will
+lose precision (i.e., C<unpack("f", pack("f", $foo)>) will not in general
+equal $foo).
+
+=item *
+
+If the pattern begins with a C<U>, the resulting string will be
+treated as UTF-8-encoded Unicode. You can force UTF-8 encoding on in a
+string with an initial C<U0>, and the bytes that follow will be
+interpreted as Unicode characters. If you don't want this to happen,
+you can begin your pattern with C<C0> (or anything else) to force Perl
+not to UTF-8 encode your string, and then follow this with a C<U*>
+somewhere in your pattern.
+
+=item *
+
+You must yourself do any alignment or padding by inserting for example
+enough C<'x'>es while packing.  There is no way to pack() and unpack()
+could know where the bytes are going to or coming from.  Therefore
+C<pack> (and C<unpack>) handle their output and input as flat
+sequences of bytes.
+
+=item *
+
+A ()-group is a sub-TEMPLATE enclosed in parentheses.  A group may
+take a repeat count, both as postfix, and for unpack() also via the C</>
+template character. Within each repetition of a group, positioning with
+C<@> starts again at 0. Therefore, the result of
+
+    pack( '@1A((@2A)@3A)', 'a', 'b', 'c' )
+
+is the string "\0a\0\0bc".
+
+
+=item *
+
+C<x> and C<X> accept C<!> modifier.  In this case they act as
+alignment commands: they jump forward/back to the closest position
+aligned at a multiple of C<count> bytes.  For example, to pack() or
+unpack() C's C<struct {char c; double d; char cc[2]}> one may need to
+use the template C<C x![d] d C[2]>; this assumes that doubles must be
+aligned on the double's size.
+
+For alignment commands C<count> of 0 is equivalent to C<count> of 1;
+both result in no-ops.
+
+=item *
+
+A comment in a TEMPLATE starts with C<#> and goes to the end of line.
+White space may be used to separate pack codes from each other, but
+a C<!> modifier and a repeat count must follow immediately.
+
+=item *
+
+If TEMPLATE requires more arguments to pack() than actually given, pack()
+assumes additional C<""> arguments.  If TEMPLATE requires fewer arguments
+to pack() than actually given, extra arguments are ignored.
+
+=back
+
+Examples:
+
+    $foo = pack("CCCC",65,66,67,68);
+    # foo eq "ABCD"
+    $foo = pack("C4",65,66,67,68);
+    # same thing
+    $foo = pack("U4",0x24b6,0x24b7,0x24b8,0x24b9);
+    # same thing with Unicode circled letters
+
+    $foo = pack("ccxxcc",65,66,67,68);
+    # foo eq "AB\0\0CD"
+
+    # note: the above examples featuring "C" and "c" are true
+    # only on ASCII and ASCII-derived systems such as ISO Latin 1
+    # and UTF-8.  In EBCDIC the first example would be
+    # $foo = pack("CCCC",193,194,195,196);
+
+    $foo = pack("s2",1,2);
+    # "\1\0\2\0" on little-endian
+    # "\0\1\0\2" on big-endian
+
+    $foo = pack("a4","abcd","x","y","z");
+    # "abcd"
+
+    $foo = pack("aaaa","abcd","x","y","z");
+    # "axyz"
+
+    $foo = pack("a14","abcdefg");
+    # "abcdefg\0\0\0\0\0\0\0"
+
+    $foo = pack("i9pl", gmtime);
+    # a real struct tm (on my system anyway)
+
+    $utmp_template = "Z8 Z8 Z16 L";
+    $utmp = pack($utmp_template, @utmp1);
+    # a struct utmp (BSDish)
+
+    @utmp2 = unpack($utmp_template, $utmp);
+    # "@utmp1" eq "@utmp2"
+
+    sub bintodec {
+	unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
+    }
+
+    $foo = pack('sx2l', 12, 34);
+    # short 12, two zero bytes padding, long 34
+    $bar = pack('s@4l', 12, 34);
+    # short 12, zero fill to position 4, long 34
+    # $foo eq $bar
+
+The same template may generally also be used in unpack().
+
+=item package NAMESPACE
+X<package> X<module> X<namespace>
+
+=item package
+
+Declares the compilation unit as being in the given namespace.  The scope
+of the package declaration is from the declaration itself through the end
+of the enclosing block, file, or eval (the same as the C<my> operator).
+All further unqualified dynamic identifiers will be in this namespace.
+A package statement affects only dynamic variables--including those
+you've used C<local> on--but I<not> lexical variables, which are created
+with C<my>.  Typically it would be the first declaration in a file to
+be included by the C<require> or C<use> operator.  You can switch into a
+package in more than one place; it merely influences which symbol table
+is used by the compiler for the rest of that block.  You can refer to
+variables and filehandles in other packages by prefixing the identifier
+with the package name and a double colon:  C<$Package::Variable>.
+If the package name is null, the C<main> package as assumed.  That is,
+C<$::sail> is equivalent to C<$main::sail> (as well as to C<$main'sail>,
+still seen in older code).
+
+If NAMESPACE is omitted, then there is no current package, and all
+identifiers must be fully qualified or lexicals.  However, you are
+strongly advised not to make use of this feature. Its use can cause
+unexpected behaviour, even crashing some versions of Perl. It is
+deprecated, and will be removed from a future release.
+
+See L<perlmod/"Packages"> for more information about packages, modules,
+and classes.  See L<perlsub> for other scoping issues.
+
+=item pipe READHANDLE,WRITEHANDLE
+X<pipe>
+
+Opens a pair of connected pipes like the corresponding system call.
+Note that if you set up a loop of piped processes, deadlock can occur
+unless you are very careful.  In addition, note that Perl's pipes use
+IO buffering, so you may need to set C<$|> to flush your WRITEHANDLE
+after each command, depending on the application.
+
+See L<IPC::Open2>, L<IPC::Open3>, and L<perlipc/"Bidirectional Communication">
+for examples of such things.
+
+On systems that support a close-on-exec flag on files, the flag will be set
+for the newly opened file descriptors as determined by the value of $^F.
+See L<perlvar/$^F>.
+
+=item pop ARRAY
+X<pop> X<stack>
+
+=item pop
+
+Pops and returns the last value of the array, shortening the array by
+one element.  Has an effect similar to
+
+    $ARRAY[$#ARRAY--]
+
+If there are no elements in the array, returns the undefined value
+(although this may happen at other times as well).  If ARRAY is
+omitted, pops the C<@ARGV> array in the main program, and the C<@_>
+array in subroutines, just like C<shift>.
+
+=item pos SCALAR
+X<pos> X<match, position>
+
+=item pos
+
+Returns the offset of where the last C<m//g> search left off for the variable
+in question (C<$_> is used when the variable is not specified).  Note that
+0 is a valid match offset.  C<undef> indicates that the search position
+is reset (usually due to match failure, but can also be because no match has
+yet been performed on the scalar). C<pos> directly accesses the location used
+by the regexp engine to store the offset, so assigning to C<pos> will change
+that offset, and so will also influence the C<\G> zero-width assertion in
+regular expressions. Because a failed C<m//gc> match doesn't reset the offset,
+the return from C<pos> won't change either in this case.  See L<perlre> and
+L<perlop>.
+
+=item print FILEHANDLE LIST
+X<print>
+
+=item print LIST
+
+=item print
+
+Prints a string or a list of strings.  Returns true if successful.
+FILEHANDLE may be a scalar variable name, in which case the variable
+contains the name of or a reference to the filehandle, thus introducing
+one level of indirection.  (NOTE: If FILEHANDLE is a variable and
+the next token is a term, it may be misinterpreted as an operator
+unless you interpose a C<+> or put parentheses around the arguments.)
+If FILEHANDLE is omitted, prints by default to standard output (or
+to the last selected output channel--see L</select>).  If LIST is
+also omitted, prints C<$_> to the currently selected output channel.
+To set the default output channel to something other than STDOUT
+use the select operation.  The current value of C<$,> (if any) is
+printed between each LIST item.  The current value of C<$\> (if
+any) is printed after the entire LIST has been printed.  Because
+print takes a LIST, anything in the LIST is evaluated in list
+context, and any subroutine that you call will have one or more of
+its expressions evaluated in list context.  Also be careful not to
+follow the print keyword with a left parenthesis unless you want
+the corresponding right parenthesis to terminate the arguments to
+the print--interpose a C<+> or put parentheses around all the
+arguments.
+
+Note that if you're storing FILEHANDLEs in an array, or if you're using
+any other expression more complex than a scalar variable to retrieve it,
+you will have to use a block returning the filehandle value instead:
+
+    print { $files[$i] } "stuff\n";
+    print { $OK ? STDOUT : STDERR } "stuff\n";
+
+=item printf FILEHANDLE FORMAT, LIST
+X<printf>
+
+=item printf FORMAT, LIST
+
+Equivalent to C<print FILEHANDLE sprintf(FORMAT, LIST)>, except that C<$\>
+(the output record separator) is not appended.  The first argument
+of the list will be interpreted as the C<printf> format. See C<sprintf>
+for an explanation of the format argument. If C<use locale> is in effect,
+the character used for the decimal point in formatted real numbers is
+affected by the LC_NUMERIC locale.  See L<perllocale>.
+
+Don't fall into the trap of using a C<printf> when a simple
+C<print> would do.  The C<print> is more efficient and less
+error prone.
+
+=item prototype FUNCTION
+X<prototype>
+
+Returns the prototype of a function as a string (or C<undef> if the
+function has no prototype).  FUNCTION is a reference to, or the name of,
+the function whose prototype you want to retrieve.
+
+If FUNCTION is a string starting with C<CORE::>, the rest is taken as a
+name for Perl builtin.  If the builtin is not I<overridable> (such as
+C<qw//>) or its arguments cannot be expressed by a prototype (such as
+C<system>) returns C<undef> because the builtin does not really behave
+like a Perl function.  Otherwise, the string describing the equivalent
+prototype is returned.
+
+=item push ARRAY,LIST
+X<push>, X<stack>
+
+Treats ARRAY as a stack, and pushes the values of LIST
+onto the end of ARRAY.  The length of ARRAY increases by the length of
+LIST.  Has the same effect as
+
+    for $value (LIST) {
+	$ARRAY[++$#ARRAY] = $value;
+    }
+
+but is more efficient.  Returns the number of elements in the array following
+the completed C<push>.
+
+=item q/STRING/
+
+=item qq/STRING/
+
+=item qr/STRING/
+
+=item qx/STRING/
+
+=item qw/STRING/
+
+Generalized quotes.  See L<perlop/"Regexp Quote-Like Operators">.
+
+=item quotemeta EXPR
+X<quotemeta> X<metacharacter>
+
+=item quotemeta
+
+Returns the value of EXPR with all non-"word"
+characters backslashed.  (That is, all characters not matching
+C</[A-Za-z_0-9]/> will be preceded by a backslash in the
+returned string, regardless of any locale settings.)
+This is the internal function implementing
+the C<\Q> escape in double-quoted strings.
+
+If EXPR is omitted, uses C<$_>.
+
+=item rand EXPR
+X<rand> X<random>
+
+=item rand
+
+Returns a random fractional number greater than or equal to C<0> and less
+than the value of EXPR.  (EXPR should be positive.)  If EXPR is
+omitted, the value C<1> is used.  Currently EXPR with the value C<0> is
+also special-cased as C<1> - this has not been documented before perl 5.8.0
+and is subject to change in future versions of perl.  Automatically calls
+C<srand> unless C<srand> has already been called.  See also C<srand>.
+
+Apply C<int()> to the value returned by C<rand()> if you want random
+integers instead of random fractional numbers.  For example,
+
+    int(rand(10))
+
+returns a random integer between C<0> and C<9>, inclusive.
+
+(Note: If your rand function consistently returns numbers that are too
+large or too small, then your version of Perl was probably compiled
+with the wrong number of RANDBITS.)
+
+=item read FILEHANDLE,SCALAR,LENGTH,OFFSET
+X<read>
+
+=item read FILEHANDLE,SCALAR,LENGTH
+
+Attempts to read LENGTH I<characters> of data into variable SCALAR
+from the specified FILEHANDLE.  Returns the number of characters
+actually read, C<0> at end of file, or undef if there was an error (in
+the latter case C<$!> is also set).  SCALAR will be grown or shrunk 
+so that the last character actually read is the last character of the
+scalar after the read.
+
+An OFFSET may be specified to place the read data at some place in the
+string other than the beginning.  A negative OFFSET specifies
+placement at that many characters counting backwards from the end of
+the string.  A positive OFFSET greater than the length of SCALAR
+results in the string being padded to the required size with C<"\0">
+bytes before the result of the read is appended.
+
+The call is actually implemented in terms of either Perl's or system's
+fread() call.  To get a true read(2) system call, see C<sysread>.
+
+Note the I<characters>: depending on the status of the filehandle,
+either (8-bit) bytes or characters are read.  By default all
+filehandles operate on bytes, but for example if the filehandle has
+been opened with the C<:utf8> I/O layer (see L</open>, and the C<open>
+pragma, L<open>), the I/O will operate on UTF-8 encoded Unicode
+characters, not bytes.  Similarly for the C<:encoding> pragma:
+in that case pretty much any characters can be read.
+
+=item readdir DIRHANDLE
+X<readdir>
+
+Returns the next directory entry for a directory opened by C<opendir>.
+If used in list context, returns all the rest of the entries in the
+directory.  If there are no more entries, returns an undefined value in
+scalar context or a null list in list context.
+
+If you're planning to filetest the return values out of a C<readdir>, you'd
+better prepend the directory in question.  Otherwise, because we didn't
+C<chdir> there, it would have been testing the wrong file.
+
+    opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
+    @dots = grep { /^\./ && -f "$some_dir/$_" } readdir(DIR);
+    closedir DIR;
+
+=item readline EXPR
+X<readline> X<gets> X<fgets>
+
+Reads from the filehandle whose typeglob is contained in EXPR.  In scalar
+context, each call reads and returns the next line, until end-of-file is
+reached, whereupon the subsequent call returns undef.  In list context,
+reads until end-of-file is reached and returns a list of lines.  Note that
+the notion of "line" used here is however you may have defined it
+with C<$/> or C<$INPUT_RECORD_SEPARATOR>).  See L<perlvar/"$/">.
+
+When C<$/> is set to C<undef>, when readline() is in scalar
+context (i.e. file slurp mode), and when an empty file is read, it
+returns C<''> the first time, followed by C<undef> subsequently.
+
+This is the internal function implementing the C<< <EXPR> >>
+operator, but you can use it directly.  The C<< <EXPR> >>
+operator is discussed in more detail in L<perlop/"I/O Operators">.
+
+    $line = <STDIN>;
+    $line = readline(*STDIN);		# same thing
+
+If readline encounters an operating system error, C<$!> will be set with the
+corresponding error message.  It can be helpful to check C<$!> when you are
+reading from filehandles you don't trust, such as a tty or a socket.  The
+following example uses the operator form of C<readline>, and takes the necessary
+steps to ensure that C<readline> was successful.
+
+    for (;;) {
+        undef $!;
+        unless (defined( $line = <> )) {
+            die $! if $!;
+            last; # reached EOF
+        }
+        # ...
+    }
+
+=item readlink EXPR
+X<readlink>
+
+=item readlink
+
+Returns the value of a symbolic link, if symbolic links are
+implemented.  If not, gives a fatal error.  If there is some system
+error, returns the undefined value and sets C<$!> (errno).  If EXPR is
+omitted, uses C<$_>.
+
+=item readpipe EXPR
+X<readpipe>
+
+EXPR is executed as a system command.
+The collected standard output of the command is returned.
+In scalar context, it comes back as a single (potentially
+multi-line) string.  In list context, returns a list of lines
+(however you've defined lines with C<$/> or C<$INPUT_RECORD_SEPARATOR>).
+This is the internal function implementing the C<qx/EXPR/>
+operator, but you can use it directly.  The C<qx/EXPR/>
+operator is discussed in more detail in L<perlop/"I/O Operators">.
+
+=item recv SOCKET,SCALAR,LENGTH,FLAGS
+X<recv>
+
+Receives a message on a socket.  Attempts to receive LENGTH characters
+of data into variable SCALAR from the specified SOCKET filehandle.
+SCALAR will be grown or shrunk to the length actually read.  Takes the
+same flags as the system call of the same name.  Returns the address
+of the sender if SOCKET's protocol supports this; returns an empty
+string otherwise.  If there's an error, returns the undefined value.
+This call is actually implemented in terms of recvfrom(2) system call.
+See L<perlipc/"UDP: Message Passing"> for examples.
+
+Note the I<characters>: depending on the status of the socket, either
+(8-bit) bytes or characters are received.  By default all sockets
+operate on bytes, but for example if the socket has been changed using
+binmode() to operate with the C<:utf8> I/O layer (see the C<open>
+pragma, L<open>), the I/O will operate on UTF-8 encoded Unicode
+characters, not bytes.  Similarly for the C<:encoding> pragma:
+in that case pretty much any characters can be read.
+
+=item redo LABEL
+X<redo>
+
+=item redo
+
+The C<redo> command restarts the loop block without evaluating the
+conditional again.  The C<continue> block, if any, is not executed.  If
+the LABEL is omitted, the command refers to the innermost enclosing
+loop.  Programs that want to lie to themselves about what was just input 
+normally use this command:
+
+    # a simpleminded Pascal comment stripper
+    # (warning: assumes no { or } in strings)
+    LINE: while (<STDIN>) {
+	while (s|({.*}.*){.*}|$1 |) {}
+	s|{.*}| |;
+	if (s|{.*| |) {
+	    $front = $_;
+	    while (<STDIN>) {
+		if (/}/) {	# end of comment?
+		    s|^|$front\{|;
+		    redo LINE;
+		}
+	    }
+	}
+	print;
+    }
+
+C<redo> cannot be used to retry a block which returns a value such as
+C<eval {}>, C<sub {}> or C<do {}>, and should not be used to exit
+a grep() or map() operation.
+
+Note that a block by itself is semantically identical to a loop
+that executes once.  Thus C<redo> inside such a block will effectively
+turn it into a looping construct.
+
+See also L</continue> for an illustration of how C<last>, C<next>, and
+C<redo> work.
+
+=item ref EXPR
+X<ref> X<reference>
+
+=item ref
+
+Returns a non-empty string if EXPR is a reference, the empty
+string otherwise. If EXPR
+is not specified, C<$_> will be used.  The value returned depends on the
+type of thing the reference is a reference to.
+Builtin types include:
+
+    SCALAR
+    ARRAY
+    HASH
+    CODE
+    REF
+    GLOB
+    LVALUE
+
+If the referenced object has been blessed into a package, then that package
+name is returned instead.  You can think of C<ref> as a C<typeof> operator.
+
+    if (ref($r) eq "HASH") {
+	print "r is a reference to a hash.\n";
+    }
+    unless (ref($r)) {
+	print "r is not a reference at all.\n";
+    }
+
+See also L<perlref>.
+
+=item rename OLDNAME,NEWNAME
+X<rename> X<move> X<mv> X<ren>
+
+Changes the name of a file; an existing file NEWNAME will be
+clobbered.  Returns true for success, false otherwise.
+
+Behavior of this function varies wildly depending on your system
+implementation.  For example, it will usually not work across file system
+boundaries, even though the system I<mv> command sometimes compensates
+for this.  Other restrictions include whether it works on directories,
+open files, or pre-existing files.  Check L<perlport> and either the
+rename(2) manpage or equivalent system documentation for details.
+
+=item require VERSION
+X<require>
+
+=item require EXPR
+
+=item require
+
+Demands a version of Perl specified by VERSION, or demands some semantics
+specified by EXPR or by C<$_> if EXPR is not supplied.
+
+VERSION may be either a numeric argument such as 5.006, which will be
+compared to C<$]>, or a literal of the form v5.6.1, which will be compared
+to C<$^V> (aka $PERL_VERSION).  A fatal error is produced at run time if
+VERSION is greater than the version of the current Perl interpreter.
+Compare with L</use>, which can do a similar check at compile time.
+
+Specifying VERSION as a literal of the form v5.6.1 should generally be
+avoided, because it leads to misleading error messages under earlier
+versions of Perl that do not support this syntax.  The equivalent numeric
+version should be used instead.
+
+    require v5.6.1;	# run time version check
+    require 5.6.1;	# ditto
+    require 5.006_001;	# ditto; preferred for backwards compatibility
+
+Otherwise, C<require> demands that a library file be included if it
+hasn't already been included.  The file is included via the do-FILE
+mechanism, which is essentially just a variety of C<eval>.  Has
+semantics similar to the following subroutine:
+
+    sub require {
+       my ($filename) = @_;
+       if (exists $INC{$filename}) {
+           return 1 if $INC{$filename};
+           die "Compilation failed in require";
+       }
+       my ($realfilename,$result);
+       ITER: {
+           foreach $prefix (@INC) {
+               $realfilename = "$prefix/$filename";
+               if (-f $realfilename) {
+                   $INC{$filename} = $realfilename;
+                   $result = do $realfilename;
+                   last ITER;
+               }
+           }
+           die "Can't find $filename in \@INC";
+       }
+       if ($@) {
+           $INC{$filename} = undef;
+           die $@;
+       } elsif (!$result) {
+           delete $INC{$filename};
+           die "$filename did not return true value";
+       } else {
+           return $result;
+       }
+    }
+
+Note that the file will not be included twice under the same specified
+name.
+
+The file must return true as the last statement to indicate
+successful execution of any initialization code, so it's customary to
+end such a file with C<1;> unless you're sure it'll return true
+otherwise.  But it's better just to put the C<1;>, in case you add more
+statements.
+
+If EXPR is a bareword, the require assumes a "F<.pm>" extension and
+replaces "F<::>" with "F</>" in the filename for you,
+to make it easy to load standard modules.  This form of loading of
+modules does not risk altering your namespace.
+
+In other words, if you try this:
+
+        require Foo::Bar;    # a splendid bareword
+
+The require function will actually look for the "F<Foo/Bar.pm>" file in the
+directories specified in the C<@INC> array.
+
+But if you try this:
+
+        $class = 'Foo::Bar';
+        require $class;	     # $class is not a bareword
+    #or
+        require "Foo::Bar";  # not a bareword because of the ""
+
+The require function will look for the "F<Foo::Bar>" file in the @INC array and
+will complain about not finding "F<Foo::Bar>" there.  In this case you can do:
+
+        eval "require $class";
+
+Now that you understand how C<require> looks for files in the case of
+a bareword argument, there is a little extra functionality going on
+behind the scenes.  Before C<require> looks for a "F<.pm>" extension,
+it will first look for a filename with a "F<.pmc>" extension.  A file
+with this extension is assumed to be Perl bytecode generated by
+L<B::Bytecode|B::Bytecode>.  If this file is found, and its modification
+time is newer than a coinciding "F<.pm>" non-compiled file, it will be
+loaded in place of that non-compiled file ending in a "F<.pm>" extension.
+
+You can also insert hooks into the import facility, by putting directly
+Perl code into the @INC array.  There are three forms of hooks: subroutine
+references, array references and blessed objects.
+
+Subroutine references are the simplest case.  When the inclusion system
+walks through @INC and encounters a subroutine, this subroutine gets
+called with two parameters, the first being a reference to itself, and the
+second the name of the file to be included (e.g. "F<Foo/Bar.pm>").  The
+subroutine should return C<undef> or a filehandle, from which the file to
+include will be read.  If C<undef> is returned, C<require> will look at
+the remaining elements of @INC.
+
+If the hook is an array reference, its first element must be a subroutine
+reference.  This subroutine is called as above, but the first parameter is
+the array reference.  This enables to pass indirectly some arguments to
+the subroutine.
+
+In other words, you can write:
+
+    push @INC, \&my_sub;
+    sub my_sub {
+	my ($coderef, $filename) = @_;	# $coderef is \&my_sub
+	...
+    }
+
+or:
+
+    push @INC, [ \&my_sub, $x, $y, ... ];
+    sub my_sub {
+	my ($arrayref, $filename) = @_;
+	# Retrieve $x, $y, ...
+	my @parameters = @$arrayref[1..$#$arrayref];
+	...
+    }
+
+If the hook is an object, it must provide an INC method that will be
+called as above, the first parameter being the object itself.  (Note that
+you must fully qualify the sub's name, as it is always forced into package
+C<main>.)  Here is a typical code layout:
+
+    # In Foo.pm
+    package Foo;
+    sub new { ... }
+    sub Foo::INC {
+	my ($self, $filename) = @_;
+	...
+    }
+
+    # In the main program
+    push @INC, new Foo(...);
+
+Note that these hooks are also permitted to set the %INC entry
+corresponding to the files they have loaded. See L<perlvar/%INC>.
+
+For a yet-more-powerful import facility, see L</use> and L<perlmod>.
+
+=item reset EXPR
+X<reset>
+
+=item reset
+
+Generally used in a C<continue> block at the end of a loop to clear
+variables and reset C<??> searches so that they work again.  The
+expression is interpreted as a list of single characters (hyphens
+allowed for ranges).  All variables and arrays beginning with one of
+those letters are reset to their pristine state.  If the expression is
+omitted, one-match searches (C<?pattern?>) are reset to match again.  Resets
+only variables or searches in the current package.  Always returns
+1.  Examples:
+
+    reset 'X';		# reset all X variables
+    reset 'a-z';	# reset lower case variables
+    reset;		# just reset ?one-time? searches
+
+Resetting C<"A-Z"> is not recommended because you'll wipe out your
+C<@ARGV> and C<@INC> arrays and your C<%ENV> hash.  Resets only package
+variables--lexical variables are unaffected, but they clean themselves
+up on scope exit anyway, so you'll probably want to use them instead.
+See L</my>.
+
+=item return EXPR
+X<return>
+
+=item return
+
+Returns from a subroutine, C<eval>, or C<do FILE> with the value
+given in EXPR.  Evaluation of EXPR may be in list, scalar, or void
+context, depending on how the return value will be used, and the context
+may vary from one execution to the next (see C<wantarray>).  If no EXPR
+is given, returns an empty list in list context, the undefined value in
+scalar context, and (of course) nothing at all in a void context.
+
+(Note that in the absence of an explicit C<return>, a subroutine, eval,
+or do FILE will automatically return the value of the last expression
+evaluated.)
+
+=item reverse LIST
+X<reverse> X<rev> X<invert>
+
+In list context, returns a list value consisting of the elements
+of LIST in the opposite order.  In scalar context, concatenates the
+elements of LIST and returns a string value with all characters
+in the opposite order.
+
+    print reverse <>;		# line tac, last line first
+
+    undef $/;			# for efficiency of <>
+    print scalar reverse <>;	# character tac, last line tsrif
+
+Used without arguments in scalar context, reverse() reverses C<$_>.
+
+This operator is also handy for inverting a hash, although there are some
+caveats.  If a value is duplicated in the original hash, only one of those
+can be represented as a key in the inverted hash.  Also, this has to
+unwind one hash and build a whole new one, which may take some time
+on a large hash, such as from a DBM file.
+
+    %by_name = reverse %by_address;	# Invert the hash
+
+=item rewinddir DIRHANDLE
+X<rewinddir>
+
+Sets the current position to the beginning of the directory for the
+C<readdir> routine on DIRHANDLE.
+
+=item rindex STR,SUBSTR,POSITION
+X<rindex>
+
+=item rindex STR,SUBSTR
+
+Works just like index() except that it returns the position of the I<last>
+occurrence of SUBSTR in STR.  If POSITION is specified, returns the
+last occurrence beginning at or before that position.
+
+=item rmdir FILENAME
+X<rmdir> X<rd> X<directory, remove>
+
+=item rmdir
+
+Deletes the directory specified by FILENAME if that directory is
+empty.  If it succeeds it returns true, otherwise it returns false and
+sets C<$!> (errno).  If FILENAME is omitted, uses C<$_>.
+
+=item s///
+
+The substitution operator.  See L<perlop>.
+
+=item scalar EXPR
+X<scalar> X<context>
+
+Forces EXPR to be interpreted in scalar context and returns the value
+of EXPR.
+
+    @counts = ( scalar @a, scalar @b, scalar @c );
+
+There is no equivalent operator to force an expression to
+be interpolated in list context because in practice, this is never
+needed.  If you really wanted to do so, however, you could use
+the construction C<@{[ (some expression) ]}>, but usually a simple
+C<(some expression)> suffices.
+
+Because C<scalar> is unary operator, if you accidentally use for EXPR a
+parenthesized list, this behaves as a scalar comma expression, evaluating
+all but the last element in void context and returning the final element
+evaluated in scalar context.  This is seldom what you want.
+
+The following single statement:
+
+	print uc(scalar(&foo,$bar)),$baz;
+
+is the moral equivalent of these two:
+
+	&foo;
+	print(uc($bar),$baz);
+
+See L<perlop> for more details on unary operators and the comma operator.
+
+=item seek FILEHANDLE,POSITION,WHENCE
+X<seek> X<fseek> X<filehandle, position>
+
+Sets FILEHANDLE's position, just like the C<fseek> call of C<stdio>.
+FILEHANDLE may be an expression whose value gives the name of the
+filehandle.  The values for WHENCE are C<0> to set the new position
+I<in bytes> to POSITION, C<1> to set it to the current position plus
+POSITION, and C<2> to set it to EOF plus POSITION (typically
+negative).  For WHENCE you may use the constants C<SEEK_SET>,
+C<SEEK_CUR>, and C<SEEK_END> (start of the file, current position, end
+of the file) from the Fcntl module.  Returns C<1> upon success, C<0>
+otherwise.
+
+Note the I<in bytes>: even if the filehandle has been set to
+operate on characters (for example by using the C<:utf8> open
+layer), tell() will return byte offsets, not character offsets
+(because implementing that would render seek() and tell() rather slow).
+
+If you want to position file for C<sysread> or C<syswrite>, don't use
+C<seek>--buffering makes its effect on the file's system position
+unpredictable and non-portable.  Use C<sysseek> instead.
+
+Due to the rules and rigors of ANSI C, on some systems you have to do a
+seek whenever you switch between reading and writing.  Amongst other
+things, this may have the effect of calling stdio's clearerr(3).
+A WHENCE of C<1> (C<SEEK_CUR>) is useful for not moving the file position:
+
+    seek(TEST,0,1);
+
+This is also useful for applications emulating C<tail -f>.  Once you hit
+EOF on your read, and then sleep for a while, you might have to stick in a
+seek() to reset things.  The C<seek> doesn't change the current position,
+but it I<does> clear the end-of-file condition on the handle, so that the
+next C<< <FILE> >> makes Perl try again to read something.  We hope.
+
+If that doesn't work (some IO implementations are particularly
+cantankerous), then you may need something more like this:
+
+    for (;;) {
+	for ($curpos = tell(FILE); $_ = <FILE>;
+             $curpos = tell(FILE)) {
+	    # search for some stuff and put it into files
+	}
+	sleep($for_a_while);
+	seek(FILE, $curpos, 0);
+    }
+
+=item seekdir DIRHANDLE,POS
+X<seekdir>
+
+Sets the current position for the C<readdir> routine on DIRHANDLE.  POS
+must be a value returned by C<telldir>.  C<seekdir> also has the same caveats
+about possible directory compaction as the corresponding system library
+routine.
+
+=item select FILEHANDLE
+X<select> X<filehandle, default>
+
+=item select
+
+Returns the currently selected filehandle.  Sets the current default
+filehandle for output, if FILEHANDLE is supplied.  This has two
+effects: first, a C<write> or a C<print> without a filehandle will
+default to this FILEHANDLE.  Second, references to variables related to
+output will refer to this output channel.  For example, if you have to
+set the top of form format for more than one output channel, you might
+do the following:
+
+    select(REPORT1);
+    $^ = 'report1_top';
+    select(REPORT2);
+    $^ = 'report2_top';
+
+FILEHANDLE may be an expression whose value gives the name of the
+actual filehandle.  Thus:
+
+    $oldfh = select(STDERR); $| = 1; select($oldfh);
+
+Some programmers may prefer to think of filehandles as objects with
+methods, preferring to write the last example as:
+
+    use IO::Handle;
+    STDERR->autoflush(1);
+
+=item select RBITS,WBITS,EBITS,TIMEOUT
+X<select>
+
+This calls the select(2) system call with the bit masks specified, which
+can be constructed using C<fileno> and C<vec>, along these lines:
+
+    $rin = $win = $ein = '';
+    vec($rin,fileno(STDIN),1) = 1;
+    vec($win,fileno(STDOUT),1) = 1;
+    $ein = $rin | $win;
+
+If you want to select on many filehandles you might wish to write a
+subroutine:
+
+    sub fhbits {
+	my(@fhlist) = split(' ',$_[0]);
+	my($bits);
+	for (@fhlist) {
+	    vec($bits,fileno($_),1) = 1;
+	}
+	$bits;
+    }
+    $rin = fhbits('STDIN TTY SOCK');
+
+The usual idiom is:
+
+    ($nfound,$timeleft) =
+      select($rout=$rin, $wout=$win, $eout=$ein, $timeout);
+
+or to block until something becomes ready just do this
+
+    $nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef);
+
+Most systems do not bother to return anything useful in $timeleft, so
+calling select() in scalar context just returns $nfound.
+
+Any of the bit masks can also be undef.  The timeout, if specified, is
+in seconds, which may be fractional.  Note: not all implementations are
+capable of returning the $timeleft.  If not, they always return
+$timeleft equal to the supplied $timeout.
+
+You can effect a sleep of 250 milliseconds this way:
+
+    select(undef, undef, undef, 0.25);
+
+Note that whether C<select> gets restarted after signals (say, SIGALRM)
+is implementation-dependent.  See also L<perlport> for notes on the
+portability of C<select>.
+
+On error, C<select> behaves like the select(2) system call : it returns
+-1 and sets C<$!>.
+
+Note: on some Unixes, the select(2) system call may report a socket file
+descriptor as "ready for reading", when actually no data is available,
+thus a subsequent read blocks. It can be avoided using always the
+O_NONBLOCK flag on the socket. See select(2) and fcntl(2) for further
+details.
+
+B<WARNING>: One should not attempt to mix buffered I/O (like C<read>
+or <FH>) with C<select>, except as permitted by POSIX, and even
+then only on POSIX systems.  You have to use C<sysread> instead.
+
+=item semctl ID,SEMNUM,CMD,ARG
+X<semctl>
+
+Calls the System V IPC function C<semctl>.  You'll probably have to say
+
+    use IPC::SysV;
+
+first to get the correct constant definitions.  If CMD is IPC_STAT or
+GETALL, then ARG must be a variable that will hold the returned
+semid_ds structure or semaphore value array.  Returns like C<ioctl>:
+the undefined value for error, "C<0 but true>" for zero, or the actual
+return value otherwise.  The ARG must consist of a vector of native
+short integers, which may be created with C<pack("s!",(0)x$nsem)>.
+See also L<perlipc/"SysV IPC">, C<IPC::SysV>, C<IPC::Semaphore>
+documentation.
+
+=item semget KEY,NSEMS,FLAGS
+X<semget>
+
+Calls the System V IPC function semget.  Returns the semaphore id, or
+the undefined value if there is an error.  See also
+L<perlipc/"SysV IPC">, C<IPC::SysV>, C<IPC::SysV::Semaphore>
+documentation.
+
+=item semop KEY,OPSTRING
+X<semop>
+
+Calls the System V IPC function semop to perform semaphore operations
+such as signalling and waiting.  OPSTRING must be a packed array of
+semop structures.  Each semop structure can be generated with
+C<pack("s!3", $semnum, $semop, $semflag)>.  The length of OPSTRING 
+implies the number of semaphore operations.  Returns true if
+successful, or false if there is an error.  As an example, the
+following code waits on semaphore $semnum of semaphore id $semid:
+
+    $semop = pack("s!3", $semnum, -1, 0);
+    die "Semaphore trouble: $!\n" unless semop($semid, $semop);
+
+To signal the semaphore, replace C<-1> with C<1>.  See also
+L<perlipc/"SysV IPC">, C<IPC::SysV>, and C<IPC::SysV::Semaphore>
+documentation.
+
+=item send SOCKET,MSG,FLAGS,TO
+X<send>
+
+=item send SOCKET,MSG,FLAGS
+
+Sends a message on a socket.  Attempts to send the scalar MSG to the
+SOCKET filehandle.  Takes the same flags as the system call of the
+same name.  On unconnected sockets you must specify a destination to
+send TO, in which case it does a C C<sendto>.  Returns the number of
+characters sent, or the undefined value if there is an error.  The C
+system call sendmsg(2) is currently unimplemented.  See
+L<perlipc/"UDP: Message Passing"> for examples.
+
+Note the I<characters>: depending on the status of the socket, either
+(8-bit) bytes or characters are sent.  By default all sockets operate
+on bytes, but for example if the socket has been changed using
+binmode() to operate with the C<:utf8> I/O layer (see L</open>, or the
+C<open> pragma, L<open>), the I/O will operate on UTF-8 encoded
+Unicode characters, not bytes.  Similarly for the C<:encoding> pragma:
+in that case pretty much any characters can be sent.
+
+=item setpgrp PID,PGRP
+X<setpgrp> X<group>
+
+Sets the current process group for the specified PID, C<0> for the current
+process.  Will produce a fatal error if used on a machine that doesn't
+implement POSIX setpgid(2) or BSD setpgrp(2).  If the arguments are omitted,
+it defaults to C<0,0>.  Note that the BSD 4.2 version of C<setpgrp> does not
+accept any arguments, so only C<setpgrp(0,0)> is portable.  See also
+C<POSIX::setsid()>.
+
+=item setpriority WHICH,WHO,PRIORITY
+X<setpriority> X<priority> X<nice> X<renice>
+
+Sets the current priority for a process, a process group, or a user.
+(See setpriority(2).)  Will produce a fatal error if used on a machine
+that doesn't implement setpriority(2).
+
+=item setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL
+X<setsockopt>
+
+Sets the socket option requested.  Returns undefined if there is an
+error.  Use integer constants provided by the C<Socket> module for
+LEVEL and OPNAME.  Values for LEVEL can also be obtained from
+getprotobyname.  OPTVAL might either be a packed string or an integer.
+An integer OPTVAL is shorthand for pack("i", OPTVAL).
+
+An example disabling the Nagle's algorithm for a socket:
+
+    use Socket qw(IPPROTO_TCP TCP_NODELAY);
+    setsockopt($socket, IPPROTO_TCP, TCP_NODELAY, 1);
+
+=item shift ARRAY
+X<shift>
+
+=item shift
+
+Shifts the first value of the array off and returns it, shortening the
+array by 1 and moving everything down.  If there are no elements in the
+array, returns the undefined value.  If ARRAY is omitted, shifts the
+C<@_> array within the lexical scope of subroutines and formats, and the
+C<@ARGV> array at file scopes or within the lexical scopes established by
+the C<eval ''>, C<BEGIN {}>, C<INIT {}>, C<CHECK {}>, and C<END {}>
+constructs.
+
+See also C<unshift>, C<push>, and C<pop>.  C<shift> and C<unshift> do the
+same thing to the left end of an array that C<pop> and C<push> do to the
+right end.
+
+=item shmctl ID,CMD,ARG
+X<shmctl>
+
+Calls the System V IPC function shmctl.  You'll probably have to say
+
+    use IPC::SysV;
+
+first to get the correct constant definitions.  If CMD is C<IPC_STAT>,
+then ARG must be a variable that will hold the returned C<shmid_ds>
+structure.  Returns like ioctl: the undefined value for error, "C<0> but
+true" for zero, or the actual return value otherwise.
+See also L<perlipc/"SysV IPC"> and C<IPC::SysV> documentation.
+
+=item shmget KEY,SIZE,FLAGS
+X<shmget>
+
+Calls the System V IPC function shmget.  Returns the shared memory
+segment id, or the undefined value if there is an error.
+See also L<perlipc/"SysV IPC"> and C<IPC::SysV> documentation.
+
+=item shmread ID,VAR,POS,SIZE
+X<shmread>
+X<shmwrite>
+
+=item shmwrite ID,STRING,POS,SIZE
+
+Reads or writes the System V shared memory segment ID starting at
+position POS for size SIZE by attaching to it, copying in/out, and
+detaching from it.  When reading, VAR must be a variable that will
+hold the data read.  When writing, if STRING is too long, only SIZE
+bytes are used; if STRING is too short, nulls are written to fill out
+SIZE bytes.  Return true if successful, or false if there is an error.
+shmread() taints the variable. See also L<perlipc/"SysV IPC">,
+C<IPC::SysV> documentation, and the C<IPC::Shareable> module from CPAN.
+
+=item shutdown SOCKET,HOW
+X<shutdown>
+
+Shuts down a socket connection in the manner indicated by HOW, which
+has the same interpretation as in the system call of the same name.
+
+    shutdown(SOCKET, 0);    # I/we have stopped reading data
+    shutdown(SOCKET, 1);    # I/we have stopped writing data
+    shutdown(SOCKET, 2);    # I/we have stopped using this socket
+
+This is useful with sockets when you want to tell the other
+side you're done writing but not done reading, or vice versa.
+It's also a more insistent form of close because it also
+disables the file descriptor in any forked copies in other
+processes.
+
+=item sin EXPR
+X<sin> X<sine> X<asin> X<arcsine>
+
+=item sin
+
+Returns the sine of EXPR (expressed in radians).  If EXPR is omitted,
+returns sine of C<$_>.
+
+For the inverse sine operation, you may use the C<Math::Trig::asin>
+function, or use this relation:
+
+    sub asin { atan2($_[0], sqrt(1 - $_[0] * $_[0])) }
+
+=item sleep EXPR
+X<sleep> X<pause>
+
+=item sleep
+
+Causes the script to sleep for EXPR seconds, or forever if no EXPR.
+May be interrupted if the process receives a signal such as C<SIGALRM>.
+Returns the number of seconds actually slept.  You probably cannot
+mix C<alarm> and C<sleep> calls, because C<sleep> is often implemented
+using C<alarm>.
+
+On some older systems, it may sleep up to a full second less than what
+you requested, depending on how it counts seconds.  Most modern systems
+always sleep the full amount.  They may appear to sleep longer than that,
+however, because your process might not be scheduled right away in a
+busy multitasking system.
+
+For delays of finer granularity than one second, you may use Perl's
+C<syscall> interface to access setitimer(2) if your system supports
+it, or else see L</select> above.  The Time::HiRes module (from CPAN,
+and starting from Perl 5.8 part of the standard distribution) may also
+help.
+
+See also the POSIX module's C<pause> function.
+
+=item socket SOCKET,DOMAIN,TYPE,PROTOCOL
+X<socket>
+
+Opens a socket of the specified kind and attaches it to filehandle
+SOCKET.  DOMAIN, TYPE, and PROTOCOL are specified the same as for
+the system call of the same name.  You should C<use Socket> first
+to get the proper definitions imported.  See the examples in
+L<perlipc/"Sockets: Client/Server Communication">.
+
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptor, as determined by the
+value of $^F.  See L<perlvar/$^F>.
+
+=item socketpair SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL
+X<socketpair>
+
+Creates an unnamed pair of sockets in the specified domain, of the
+specified type.  DOMAIN, TYPE, and PROTOCOL are specified the same as
+for the system call of the same name.  If unimplemented, yields a fatal
+error.  Returns true if successful.
+
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptors, as determined by the value
+of $^F.  See L<perlvar/$^F>.
+
+Some systems defined C<pipe> in terms of C<socketpair>, in which a call
+to C<pipe(Rdr, Wtr)> is essentially:
+
+    use Socket;
+    socketpair(Rdr, Wtr, AF_UNIX, SOCK_STREAM, PF_UNSPEC);
+    shutdown(Rdr, 1);        # no more writing for reader
+    shutdown(Wtr, 0);        # no more reading for writer
+
+See L<perlipc> for an example of socketpair use.  Perl 5.8 and later will
+emulate socketpair using IP sockets to localhost if your system implements
+sockets but not socketpair.
+
+=item sort SUBNAME LIST
+X<sort> X<qsort> X<quicksort> X<mergesort>
+
+=item sort BLOCK LIST
+
+=item sort LIST
+
+In list context, this sorts the LIST and returns the sorted list value.
+In scalar context, the behaviour of C<sort()> is undefined.
+
+If SUBNAME or BLOCK is omitted, C<sort>s in standard string comparison
+order.  If SUBNAME is specified, it gives the name of a subroutine
+that returns an integer less than, equal to, or greater than C<0>,
+depending on how the elements of the list are to be ordered.  (The C<<
+<=> >> and C<cmp> operators are extremely useful in such routines.)
+SUBNAME may be a scalar variable name (unsubscripted), in which case
+the value provides the name of (or a reference to) the actual
+subroutine to use.  In place of a SUBNAME, you can provide a BLOCK as
+an anonymous, in-line sort subroutine.
+
+If the subroutine's prototype is C<($$)>, the elements to be compared
+are passed by reference in C<@_>, as for a normal subroutine.  This is
+slower than unprototyped subroutines, where the elements to be
+compared are passed into the subroutine
+as the package global variables $a and $b (see example below).  Note that
+in the latter case, it is usually counter-productive to declare $a and
+$b as lexicals.
+
+In either case, the subroutine may not be recursive.  The values to be
+compared are always passed by reference and should not be modified.
+
+You also cannot exit out of the sort block or subroutine using any of the
+loop control operators described in L<perlsyn> or with C<goto>.
+
+When C<use locale> is in effect, C<sort LIST> sorts LIST according to the
+current collation locale.  See L<perllocale>.
+
+sort() returns aliases into the original list, much as a for loop's index
+variable aliases the list elements.  That is, modifying an element of a
+list returned by sort() (for example, in a C<foreach>, C<map> or C<grep>)
+actually modifies the element in the original list.  This is usually
+something to be avoided when writing clear code.
+
+Perl 5.6 and earlier used a quicksort algorithm to implement sort.
+That algorithm was not stable, and I<could> go quadratic.  (A I<stable> sort
+preserves the input order of elements that compare equal.  Although
+quicksort's run time is O(NlogN) when averaged over all arrays of
+length N, the time can be O(N**2), I<quadratic> behavior, for some
+inputs.)  In 5.7, the quicksort implementation was replaced with
+a stable mergesort algorithm whose worst-case behavior is O(NlogN).
+But benchmarks indicated that for some inputs, on some platforms,
+the original quicksort was faster.  5.8 has a sort pragma for
+limited control of the sort.  Its rather blunt control of the
+underlying algorithm may not persist into future Perls, but the
+ability to characterize the input or output in implementation
+independent ways quite probably will.  See L<sort>.
+
+Examples:
+
+    # sort lexically
+    @articles = sort @files;
+
+    # same thing, but with explicit sort routine
+    @articles = sort {$a cmp $b} @files;
+
+    # now case-insensitively
+    @articles = sort {uc($a) cmp uc($b)} @files;
+
+    # same thing in reversed order
+    @articles = sort {$b cmp $a} @files;
+
+    # sort numerically ascending
+    @articles = sort {$a <=> $b} @files;
+
+    # sort numerically descending
+    @articles = sort {$b <=> $a} @files;
+
+    # this sorts the %age hash by value instead of key
+    # using an in-line function
+    @eldest = sort { $age{$b} <=> $age{$a} } keys %age;
+
+    # sort using explicit subroutine name
+    sub byage {
+	$age{$a} <=> $age{$b};	# presuming numeric
+    }
+    @sortedclass = sort byage @class;
+
+    sub backwards { $b cmp $a }
+    @harry  = qw(dog cat x Cain Abel);
+    @george = qw(gone chased yz Punished Axed);
+    print sort @harry;
+	    # prints AbelCaincatdogx
+    print sort backwards @harry;
+	    # prints xdogcatCainAbel
+    print sort @george, 'to', @harry;
+	    # prints AbelAxedCainPunishedcatchaseddoggonetoxyz
+
+    # inefficiently sort by descending numeric compare using
+    # the first integer after the first = sign, or the
+    # whole record case-insensitively otherwise
+
+    @new = sort {
+	($b =~ /=(\d+)/)[0] <=> ($a =~ /=(\d+)/)[0]
+			    ||
+	            uc($a)  cmp  uc($b)
+    } @old;
+
+    # same thing, but much more efficiently;
+    # we'll build auxiliary indices instead
+    # for speed
+    @nums = @caps = ();
+    for (@old) {
+	push @nums, /=(\d+)/;
+	push @caps, uc($_);
+    }
+
+    @new = @old[ sort {
+			$nums[$b] <=> $nums[$a]
+				 ||
+			$caps[$a] cmp $caps[$b]
+		       } 0..$#old
+	       ];
+
+    # same thing, but without any temps
+    @new = map { $_->[0] }
+           sort { $b->[1] <=> $a->[1]
+                           ||
+                  $a->[2] cmp $b->[2]
+           } map { [$_, /=(\d+)/, uc($_)] } @old;
+
+    # using a prototype allows you to use any comparison subroutine
+    # as a sort subroutine (including other package's subroutines)
+    package other;
+    sub backwards ($$) { $_[1] cmp $_[0]; }	# $a and $b are not set here
+
+    package main;
+    @new = sort other::backwards @old;
+
+    # guarantee stability, regardless of algorithm
+    use sort 'stable';
+    @new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
+
+    # force use of mergesort (not portable outside Perl 5.8)
+    use sort '_mergesort';  # note discouraging _
+    @new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
+
+If you're using strict, you I<must not> declare $a
+and $b as lexicals.  They are package globals.  That means
+if you're in the C<main> package and type
+
+    @articles = sort {$b <=> $a} @files;
+
+then C<$a> and C<$b> are C<$main::a> and C<$main::b> (or C<$::a> and C<$::b>),
+but if you're in the C<FooPack> package, it's the same as typing
+
+    @articles = sort {$FooPack::b <=> $FooPack::a} @files;
+
+The comparison function is required to behave.  If it returns
+inconsistent results (sometimes saying C<$x[1]> is less than C<$x[2]> and
+sometimes saying the opposite, for example) the results are not
+well-defined.
+
+Because C<< <=> >> returns C<undef> when either operand is C<NaN>
+(not-a-number), and because C<sort> will trigger a fatal error unless the
+result of a comparison is defined, when sorting with a comparison function
+like C<< $a <=> $b >>, be careful about lists that might contain a C<NaN>.
+The following example takes advantage of the fact that C<NaN != NaN> to
+eliminate any C<NaN>s from the input.
+
+    @result = sort { $a <=> $b } grep { $_ == $_ } @input;
+
+=item splice ARRAY,OFFSET,LENGTH,LIST
+X<splice>
+
+=item splice ARRAY,OFFSET,LENGTH
+
+=item splice ARRAY,OFFSET
+
+=item splice ARRAY
+
+Removes the elements designated by OFFSET and LENGTH from an array, and
+replaces them with the elements of LIST, if any.  In list context,
+returns the elements removed from the array.  In scalar context,
+returns the last element removed, or C<undef> if no elements are
+removed.  The array grows or shrinks as necessary.
+If OFFSET is negative then it starts that far from the end of the array.
+If LENGTH is omitted, removes everything from OFFSET onward.
+If LENGTH is negative, removes the elements from OFFSET onward
+except for -LENGTH elements at the end of the array.
+If both OFFSET and LENGTH are omitted, removes everything. If OFFSET is
+past the end of the array, perl issues a warning, and splices at the
+end of the array.
+
+The following equivalences hold (assuming C<< $[ == 0 and $#a >= $i >> )
+
+    push(@a,$x,$y)	splice(@a,@a,0,$x,$y)
+    pop(@a)		splice(@a,-1)
+    shift(@a)		splice(@a,0,1)
+    unshift(@a,$x,$y)	splice(@a,0,0,$x,$y)
+    $a[$i] = $y		splice(@a,$i,1,$y)
+
+Example, assuming array lengths are passed before arrays:
+
+    sub aeq {	# compare two list values
+	my(@a) = splice(@_,0,shift);
+	my(@b) = splice(@_,0,shift);
+	return 0 unless @a == @b;	# same len?
+	while (@a) {
+	    return 0 if pop(@a) ne pop(@b);
+	}
+	return 1;
+    }
+    if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... }
+
+=item split /PATTERN/,EXPR,LIMIT
+X<split>
+
+=item split /PATTERN/,EXPR
+
+=item split /PATTERN/
+
+=item split
+
+Splits the string EXPR into a list of strings and returns that list.  By
+default, empty leading fields are preserved, and empty trailing ones are
+deleted.  (If all fields are empty, they are considered to be trailing.)
+
+In scalar context, returns the number of fields found and splits into
+the C<@_> array.  Use of split in scalar context is deprecated, however,
+because it clobbers your subroutine arguments.
+
+If EXPR is omitted, splits the C<$_> string.  If PATTERN is also omitted,
+splits on whitespace (after skipping any leading whitespace).  Anything
+matching PATTERN is taken to be a delimiter separating the fields.  (Note
+that the delimiter may be longer than one character.)
+
+If LIMIT is specified and positive, it represents the maximum number
+of fields the EXPR will be split into, though the actual number of
+fields returned depends on the number of times PATTERN matches within
+EXPR.  If LIMIT is unspecified or zero, trailing null fields are
+stripped (which potential users of C<pop> would do well to remember).
+If LIMIT is negative, it is treated as if an arbitrarily large LIMIT
+had been specified.  Note that splitting an EXPR that evaluates to the
+empty string always returns the empty list, regardless of the LIMIT
+specified.
+
+A pattern matching the null string (not to be confused with
+a null pattern C<//>, which is just one member of the set of patterns
+matching a null string) will split the value of EXPR into separate
+characters at each point it matches that way.  For example:
+
+    print join(':', split(/ */, 'hi there'));
+
+produces the output 'h:i:t:h:e:r:e'.
+
+As a special case for C<split>, using the empty pattern C<//> specifically
+matches only the null string, and is not be confused with the regular use
+of C<//> to mean "the last successful pattern match".  So, for C<split>,
+the following:
+
+    print join(':', split(//, 'hi there'));
+
+produces the output 'h:i: :t:h:e:r:e'.
+
+Empty leading (or trailing) fields are produced when there are positive
+width matches at the beginning (or end) of the string; a zero-width match
+at the beginning (or end) of the string does not produce an empty field.
+For example:
+
+   print join(':', split(/(?=\w)/, 'hi there!'));
+
+produces the output 'h:i :t:h:e:r:e!'.
+
+The LIMIT parameter can be used to split a line partially
+
+    ($login, $passwd, $remainder) = split(/:/, $_, 3);
+
+When assigning to a list, if LIMIT is omitted, or zero, Perl supplies
+a LIMIT one larger than the number of variables in the list, to avoid
+unnecessary work.  For the list above LIMIT would have been 4 by
+default.  In time critical applications it behooves you not to split
+into more fields than you really need.
+
+If the PATTERN contains parentheses, additional list elements are
+created from each matching substring in the delimiter.
+
+    split(/([,-])/, "1-10,20", 3);
+
+produces the list value
+
+    (1, '-', 10, ',', 20)
+
+If you had the entire header of a normal Unix email message in $header,
+you could split it up into fields and their values this way:
+
+    $header =~ s/\n\s+/ /g;  # fix continuation lines
+    %hdrs   =  (UNIX_FROM => split /^(\S*?):\s*/m, $header);
+
+The pattern C</PATTERN/> may be replaced with an expression to specify
+patterns that vary at runtime.  (To do runtime compilation only once,
+use C</$variable/o>.)
+
+As a special case, specifying a PATTERN of space (S<C<' '>>) will split on
+white space just as C<split> with no arguments does.  Thus, S<C<split(' ')>> can
+be used to emulate B<awk>'s default behavior, whereas S<C<split(/ /)>>
+will give you as many null initial fields as there are leading spaces.
+A C<split> on C</\s+/> is like a S<C<split(' ')>> except that any leading
+whitespace produces a null first field.  A C<split> with no arguments
+really does a S<C<split(' ', $_)>> internally.
+
+A PATTERN of C</^/> is treated as if it were C</^/m>, since it isn't
+much use otherwise.
+
+Example:
+
+    open(PASSWD, '/etc/passwd');
+    while (<PASSWD>) {
+        chomp;
+        ($login, $passwd, $uid, $gid,
+         $gcos, $home, $shell) = split(/:/);
+	#...
+    }
+
+As with regular pattern matching, any capturing parentheses that are not
+matched in a C<split()> will be set to C<undef> when returned:
+
+    @fields = split /(A)|B/, "1A2B3";
+    # @fields is (1, 'A', 2, undef, 3)
+
+=item sprintf FORMAT, LIST
+X<sprintf>
+
+Returns a string formatted by the usual C<printf> conventions of the C
+library function C<sprintf>.  See below for more details
+and see L<sprintf(3)> or L<printf(3)> on your system for an explanation of
+the general principles.
+
+For example:
+
+        # Format number with up to 8 leading zeroes
+        $result = sprintf("%08d", $number);
+
+        # Round number to 3 digits after decimal point
+        $rounded = sprintf("%.3f", $number);
+
+Perl does its own C<sprintf> formatting--it emulates the C
+function C<sprintf>, but it doesn't use it (except for floating-point
+numbers, and even then only the standard modifiers are allowed).  As a
+result, any non-standard extensions in your local C<sprintf> are not
+available from Perl.
+
+Unlike C<printf>, C<sprintf> does not do what you probably mean when you
+pass it an array as your first argument. The array is given scalar context,
+and instead of using the 0th element of the array as the format, Perl will
+use the count of elements in the array as the format, which is almost never
+useful.
+
+Perl's C<sprintf> permits the following universally-known conversions:
+
+   %%	a percent sign
+   %c	a character with the given number
+   %s	a string
+   %d	a signed integer, in decimal
+   %u	an unsigned integer, in decimal
+   %o	an unsigned integer, in octal
+   %x	an unsigned integer, in hexadecimal
+   %e	a floating-point number, in scientific notation
+   %f	a floating-point number, in fixed decimal notation
+   %g	a floating-point number, in %e or %f notation
+
+In addition, Perl permits the following widely-supported conversions:
+
+   %X	like %x, but using upper-case letters
+   %E	like %e, but using an upper-case "E"
+   %G	like %g, but with an upper-case "E" (if applicable)
+   %b	an unsigned integer, in binary
+   %p	a pointer (outputs the Perl value's address in hexadecimal)
+   %n	special: *stores* the number of characters output so far
+        into the next variable in the parameter list
+
+Finally, for backward (and we do mean "backward") compatibility, Perl
+permits these unnecessary but widely-supported conversions:
+
+   %i	a synonym for %d
+   %D	a synonym for %ld
+   %U	a synonym for %lu
+   %O	a synonym for %lo
+   %F	a synonym for %f
+
+Note that the number of exponent digits in the scientific notation produced
+by C<%e>, C<%E>, C<%g> and C<%G> for numbers with the modulus of the
+exponent less than 100 is system-dependent: it may be three or less
+(zero-padded as necessary).  In other words, 1.23 times ten to the
+99th may be either "1.23e99" or "1.23e099".
+
+Between the C<%> and the format letter, you may specify a number of
+additional attributes controlling the interpretation of the format.
+In order, these are:
+
+=over 4
+
+=item format parameter index
+
+An explicit format parameter index, such as C<2$>. By default sprintf
+will format the next unused argument in the list, but this allows you
+to take the arguments out of order, e.g.:
+
+  printf '%2$d %1$d', 12, 34;      # prints "34 12"
+  printf '%3$d %d %1$d', 1, 2, 3;  # prints "3 1 1"
+
+=item flags
+
+one or more of:
+   space   prefix positive number with a space
+   +       prefix positive number with a plus sign
+   -       left-justify within the field
+   0       use zeros, not spaces, to right-justify
+   #       prefix non-zero octal with "0", non-zero hex with "0x",
+           non-zero binary with "0b"
+
+For example:
+
+  printf '<% d>', 12;   # prints "< 12>"
+  printf '<%+d>', 12;   # prints "<+12>"
+  printf '<%6s>', 12;   # prints "<    12>"
+  printf '<%-6s>', 12;  # prints "<12    >"
+  printf '<%06s>', 12;  # prints "<000012>"
+  printf '<%#x>', 12;   # prints "<0xc>"
+
+=item vector flag
+
+This flag tells perl to interpret the supplied string as a vector of
+integers, one for each character in the string. Perl applies the format to
+each integer in turn, then joins the resulting strings with a separator (a
+dot C<.> by default). This can be useful for displaying ordinal values of
+characters in arbitrary strings:
+
+  printf "%vd", "AB\x{100}";           # prints "65.66.256"
+  printf "version is v%vd\n", $^V;     # Perl's version
+
+Put an asterisk C<*> before the C<v> to override the string to
+use to separate the numbers:
+
+  printf "address is %*vX\n", ":", $addr;   # IPv6 address
+  printf "bits are %0*v8b\n", " ", $bits;   # random bitstring
+
+You can also explicitly specify the argument number to use for
+the join string using e.g. C<*2$v>:
+
+  printf '%*4$vX %*4$vX %*4$vX', @addr[1..3], ":";   # 3 IPv6 addresses
+
+=item (minimum) width
+
+Arguments are usually formatted to be only as wide as required to
+display the given value. You can override the width by putting
+a number here, or get the width from the next argument (with C<*>)
+or from a specified argument (with e.g. C<*2$>):
+
+  printf '<%s>', "a";       # prints "<a>"
+  printf '<%6s>', "a";      # prints "<     a>"
+  printf '<%*s>', 6, "a";   # prints "<     a>"
+  printf '<%*2$s>', "a", 6; # prints "<     a>"
+  printf '<%2s>', "long";   # prints "<long>" (does not truncate)
+
+If a field width obtained through C<*> is negative, it has the same
+effect as the C<-> flag: left-justification.
+
+=item precision, or maximum width
+X<precision>
+
+You can specify a precision (for numeric conversions) or a maximum
+width (for string conversions) by specifying a C<.> followed by a number.
+For floating point formats, with the exception of 'g' and 'G', this specifies
+the number of decimal places to show (the default being 6), e.g.:
+
+  # these examples are subject to system-specific variation
+  printf '<%f>', 1;    # prints "<1.000000>"
+  printf '<%.1f>', 1;  # prints "<1.0>"
+  printf '<%.0f>', 1;  # prints "<1>"
+  printf '<%e>', 10;   # prints "<1.000000e+01>"
+  printf '<%.1e>', 10; # prints "<1.0e+01>"
+
+For 'g' and 'G', this specifies the maximum number of digits to show,
+including prior to the decimal point as well as after it, e.g.:
+
+  # these examples are subject to system-specific variation
+  printf '<%g>', 1;        # prints "<1>"
+  printf '<%.10g>', 1;     # prints "<1>"
+  printf '<%g>', 100;      # prints "<100>"
+  printf '<%.1g>', 100;    # prints "<1e+02>"
+  printf '<%.2g>', 100.01; # prints "<1e+02>"
+  printf '<%.5g>', 100.01; # prints "<100.01>"
+  printf '<%.4g>', 100.01; # prints "<100>"
+
+For integer conversions, specifying a precision implies that the
+output of the number itself should be zero-padded to this width:
+
+  printf '<%.6x>', 1;      # prints "<000001>"
+  printf '<%#.6x>', 1;     # prints "<0x000001>"
+  printf '<%-10.6x>', 1;   # prints "<000001    >"
+
+For string conversions, specifying a precision truncates the string
+to fit in the specified width:
+
+  printf '<%.5s>', "truncated";   # prints "<trunc>"
+  printf '<%10.5s>', "truncated"; # prints "<     trunc>"
+
+You can also get the precision from the next argument using C<.*>:
+
+  printf '<%.6x>', 1;       # prints "<000001>"
+  printf '<%.*x>', 6, 1;    # prints "<000001>"
+
+You cannot currently get the precision from a specified number,
+but it is intended that this will be possible in the future using
+e.g. C<.*2$>:
+
+  printf '<%.*2$x>', 1, 6;   # INVALID, but in future will print "<000001>"
+
+=item size
+
+For numeric conversions, you can specify the size to interpret the
+number as using C<l>, C<h>, C<V>, C<q>, C<L>, or C<ll>. For integer
+conversions (C<d u o x X b i D U O>), numbers are usually assumed to be
+whatever the default integer size is on your platform (usually 32 or 64
+bits), but you can override this to use instead one of the standard C types,
+as supported by the compiler used to build Perl:
+
+   l           interpret integer as C type "long" or "unsigned long"
+   h           interpret integer as C type "short" or "unsigned short"
+   q, L or ll  interpret integer as C type "long long", "unsigned long long".
+               or "quads" (typically 64-bit integers)
+
+The last will produce errors if Perl does not understand "quads" in your
+installation. (This requires that either the platform natively supports quads
+or Perl was specifically compiled to support quads.) You can find out
+whether your Perl supports quads via L<Config>:
+
+	use Config;
+	($Config{use64bitint} eq 'define' || $Config{longsize} >= 8) &&
+		print "quads\n";
+
+For floating point conversions (C<e f g E F G>), numbers are usually assumed
+to be the default floating point size on your platform (double or long double),
+but you can force 'long double' with C<q>, C<L>, or C<ll> if your
+platform supports them. You can find out whether your Perl supports long
+doubles via L<Config>:
+
+	use Config;
+	$Config{d_longdbl} eq 'define' && print "long doubles\n";
+
+You can find out whether Perl considers 'long double' to be the default
+floating point size to use on your platform via L<Config>:
+
+        use Config;
+        ($Config{uselongdouble} eq 'define') &&
+                print "long doubles by default\n";
+
+It can also be the case that long doubles and doubles are the same thing:
+
+        use Config;
+        ($Config{doublesize} == $Config{longdblsize}) &&
+                print "doubles are long doubles\n";
+
+The size specifier C<V> has no effect for Perl code, but it is supported
+for compatibility with XS code; it means 'use the standard size for
+a Perl integer (or floating-point number)', which is already the
+default for Perl code.
+
+=item order of arguments
+
+Normally, sprintf takes the next unused argument as the value to
+format for each format specification. If the format specification
+uses C<*> to require additional arguments, these are consumed from
+the argument list in the order in which they appear in the format
+specification I<before> the value to format. Where an argument is
+specified using an explicit index, this does not affect the normal
+order for the arguments (even when the explicitly specified index
+would have been the next argument in any case).
+
+So:
+
+  printf '<%*.*s>', $a, $b, $c;
+
+would use C<$a> for the width, C<$b> for the precision and C<$c>
+as the value to format, while:
+
+  print '<%*1$.*s>', $a, $b;
+
+would use C<$a> for the width and the precision, and C<$b> as the
+value to format.
+
+Here are some more examples - beware that when using an explicit
+index, the C<$> may need to be escaped:
+
+  printf "%2\$d %d\n",    12, 34;		# will print "34 12\n"
+  printf "%2\$d %d %d\n", 12, 34;		# will print "34 12 34\n"
+  printf "%3\$d %d %d\n", 12, 34, 56;		# will print "56 12 34\n"
+  printf "%2\$*3\$d %d\n", 12, 34, 3;		# will print " 34 12\n"
+
+=back
+
+If C<use locale> is in effect, the character used for the decimal
+point in formatted real numbers is affected by the LC_NUMERIC locale.
+See L<perllocale>.
+
+=item sqrt EXPR
+X<sqrt> X<root> X<square root>
+
+=item sqrt
+
+Return the square root of EXPR.  If EXPR is omitted, returns square
+root of C<$_>.  Only works on non-negative operands, unless you've
+loaded the standard Math::Complex module.
+
+    use Math::Complex;
+    print sqrt(-2);    # prints 1.4142135623731i
+
+=item srand EXPR
+X<srand> X<seed> X<randseed>
+
+=item srand
+
+Sets the random number seed for the C<rand> operator.
+
+The point of the function is to "seed" the C<rand> function so that
+C<rand> can produce a different sequence each time you run your
+program.
+
+If srand() is not called explicitly, it is called implicitly at the
+first use of the C<rand> operator.  However, this was not the case in
+versions of Perl before 5.004, so if your script will run under older
+Perl versions, it should call C<srand>.
+
+Most programs won't even call srand() at all, except those that
+need a cryptographically-strong starting point rather than the
+generally acceptable default, which is based on time of day,
+process ID, and memory allocation, or the F</dev/urandom> device,
+if available.
+
+You can call srand($seed) with the same $seed to reproduce the
+I<same> sequence from rand(), but this is usually reserved for
+generating predictable results for testing or debugging.
+Otherwise, don't call srand() more than once in your program.
+
+Do B<not> call srand() (i.e. without an argument) more than once in
+a script.  The internal state of the random number generator should
+contain more entropy than can be provided by any seed, so calling
+srand() again actually I<loses> randomness.
+
+Most implementations of C<srand> take an integer and will silently
+truncate decimal numbers.  This means C<srand(42)> will usually
+produce the same results as C<srand(42.1)>.  To be safe, always pass
+C<srand> an integer.
+
+In versions of Perl prior to 5.004 the default seed was just the
+current C<time>.  This isn't a particularly good seed, so many old
+programs supply their own seed value (often C<time ^ $$> or C<time ^
+($$ + ($$ << 15))>), but that isn't necessary any more.
+
+For cryptographic purposes, however, you need something much more random 
+than the default seed.  Checksumming the compressed output of one or more
+rapidly changing operating system status programs is the usual method.  For
+example:
+
+    srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
+
+If you're particularly concerned with this, see the C<Math::TrulyRandom>
+module in CPAN.
+
+Frequently called programs (like CGI scripts) that simply use
+
+    time ^ $$
+
+for a seed can fall prey to the mathematical property that
+
+    a^b == (a+1)^(b+1)
+
+one-third of the time.  So don't do that.
+
+=item stat FILEHANDLE
+X<stat> X<file, status>
+
+=item stat EXPR
+
+=item stat
+
+Returns a 13-element list giving the status info for a file, either
+the file opened via FILEHANDLE, or named by EXPR.  If EXPR is omitted,
+it stats C<$_>.  Returns a null list if the stat fails.  Typically used
+as follows:
+
+    ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+       $atime,$mtime,$ctime,$blksize,$blocks)
+           = stat($filename);
+
+Not all fields are supported on all filesystem types.  Here are the
+meanings of the fields:
+
+  0 dev      device number of filesystem
+  1 ino      inode number
+  2 mode     file mode  (type and permissions)
+  3 nlink    number of (hard) links to the file
+  4 uid      numeric user ID of file's owner
+  5 gid      numeric group ID of file's owner
+  6 rdev     the device identifier (special files only)
+  7 size     total size of file, in bytes
+  8 atime    last access time in seconds since the epoch
+  9 mtime    last modify time in seconds since the epoch
+ 10 ctime    inode change time in seconds since the epoch (*)
+ 11 blksize  preferred block size for file system I/O
+ 12 blocks   actual number of blocks allocated
+
+(The epoch was at 00:00 January 1, 1970 GMT.)
+
+(*) Not all fields are supported on all filesystem types. Notably, the
+ctime field is non-portable.  In particular, you cannot expect it to be a
+"creation time", see L<perlport/"Files and Filesystems"> for details.
+
+If C<stat> is passed the special filehandle consisting of an underline, no
+stat is done, but the current contents of the stat structure from the
+last C<stat>, C<lstat>, or filetest are returned.  Example:
+
+    if (-x $file && (($d) = stat(_)) && $d < 0) {
+	print "$file is executable NFS file\n";
+    }
+
+(This works on machines only for which the device number is negative
+under NFS.)
+
+Because the mode contains both the file type and its permissions, you
+should mask off the file type portion and (s)printf using a C<"%o">
+if you want to see the real permissions.
+
+    $mode = (stat($filename))[2];
+    printf "Permissions are %04o\n", $mode & 07777;
+
+In scalar context, C<stat> returns a boolean value indicating success
+or failure, and, if successful, sets the information associated with
+the special filehandle C<_>.
+
+The File::stat module provides a convenient, by-name access mechanism:
+
+    use File::stat;
+    $sb = stat($filename);
+    printf "File is %s, size is %s, perm %04o, mtime %s\n",
+	$filename, $sb->size, $sb->mode & 07777,
+	scalar localtime $sb->mtime;
+
+You can import symbolic mode constants (C<S_IF*>) and functions
+(C<S_IS*>) from the Fcntl module:
+
+    use Fcntl ':mode';
+
+    $mode = (stat($filename))[2];
+
+    $user_rwx      = ($mode & S_IRWXU) >> 6;
+    $group_read    = ($mode & S_IRGRP) >> 3;
+    $other_execute =  $mode & S_IXOTH;
+
+    printf "Permissions are %04o\n", S_IMODE($mode), "\n";
+
+    $is_setuid     =  $mode & S_ISUID;
+    $is_setgid     =  S_ISDIR($mode);
+
+You could write the last two using the C<-u> and C<-d> operators.
+The commonly available C<S_IF*> constants are
+
+    # Permissions: read, write, execute, for user, group, others.
+
+    S_IRWXU S_IRUSR S_IWUSR S_IXUSR
+    S_IRWXG S_IRGRP S_IWGRP S_IXGRP
+    S_IRWXO S_IROTH S_IWOTH S_IXOTH
+
+    # Setuid/Setgid/Stickiness/SaveText.
+    # Note that the exact meaning of these is system dependent.
+
+    S_ISUID S_ISGID S_ISVTX S_ISTXT
+
+    # File types.  Not necessarily all are available on your system.
+
+    S_IFREG S_IFDIR S_IFLNK S_IFBLK S_IFCHR S_IFIFO S_IFSOCK S_IFWHT S_ENFMT
+
+    # The following are compatibility aliases for S_IRUSR, S_IWUSR, S_IXUSR.
+
+    S_IREAD S_IWRITE S_IEXEC
+
+and the C<S_IF*> functions are
+
+    S_IMODE($mode)	the part of $mode containing the permission bits
+			and the setuid/setgid/sticky bits
+
+    S_IFMT($mode)	the part of $mode containing the file type
+			which can be bit-anded with e.g. S_IFREG
+                        or with the following functions
+
+    # The operators -f, -d, -l, -b, -c, -p, and -S.
+
+    S_ISREG($mode) S_ISDIR($mode) S_ISLNK($mode)
+    S_ISBLK($mode) S_ISCHR($mode) S_ISFIFO($mode) S_ISSOCK($mode)
+
+    # No direct -X operator counterpart, but for the first one
+    # the -g operator is often equivalent.  The ENFMT stands for
+    # record flocking enforcement, a platform-dependent feature.
+
+    S_ISENFMT($mode) S_ISWHT($mode)
+
+See your native chmod(2) and stat(2) documentation for more details
+about the C<S_*> constants.  To get status info for a symbolic link
+instead of the target file behind the link, use the C<lstat> function.
+
+=item study SCALAR
+X<study>
+
+=item study
+
+Takes extra time to study SCALAR (C<$_> if unspecified) in anticipation of
+doing many pattern matches on the string before it is next modified.
+This may or may not save time, depending on the nature and number of
+patterns you are searching on, and on the distribution of character
+frequencies in the string to be searched--you probably want to compare
+run times with and without it to see which runs faster.  Those loops
+that scan for many short constant strings (including the constant
+parts of more complex patterns) will benefit most.  You may have only
+one C<study> active at a time--if you study a different scalar the first
+is "unstudied".  (The way C<study> works is this: a linked list of every
+character in the string to be searched is made, so we know, for
+example, where all the C<'k'> characters are.  From each search string,
+the rarest character is selected, based on some static frequency tables
+constructed from some C programs and English text.  Only those places
+that contain this "rarest" character are examined.)
+
+For example, here is a loop that inserts index producing entries
+before any line containing a certain pattern:
+
+    while (<>) {
+	study;
+	print ".IX foo\n" 	if /\bfoo\b/;
+	print ".IX bar\n" 	if /\bbar\b/;
+	print ".IX blurfl\n" 	if /\bblurfl\b/;
+	# ...
+	print;
+    }
+
+In searching for C</\bfoo\b/>, only those locations in C<$_> that contain C<f>
+will be looked at, because C<f> is rarer than C<o>.  In general, this is
+a big win except in pathological cases.  The only question is whether
+it saves you more time than it took to build the linked list in the
+first place.
+
+Note that if you have to look for strings that you don't know till
+runtime, you can build an entire loop as a string and C<eval> that to
+avoid recompiling all your patterns all the time.  Together with
+undefining C<$/> to input entire files as one record, this can be very
+fast, often faster than specialized programs like fgrep(1).  The following
+scans a list of files (C<@files>) for a list of words (C<@words>), and prints
+out the names of those files that contain a match:
+
+    $search = 'while (<>) { study;';
+    foreach $word (@words) {
+	$search .= "++\$seen{\$ARGV} if /\\b$word\\b/;\n";
+    }
+    $search .= "}";
+    @ARGV = @files;
+    undef $/;
+    eval $search;		# this screams
+    $/ = "\n";		# put back to normal input delimiter
+    foreach $file (sort keys(%seen)) {
+	print $file, "\n";
+    }
+
+=item sub NAME BLOCK
+X<sub>
+
+=item sub NAME (PROTO) BLOCK
+
+=item sub NAME : ATTRS BLOCK
+
+=item sub NAME (PROTO) : ATTRS BLOCK
+
+This is subroutine definition, not a real function I<per se>.
+Without a BLOCK it's just a forward declaration.  Without a NAME,
+it's an anonymous function declaration, and does actually return
+a value: the CODE ref of the closure you just created.
+
+See L<perlsub> and L<perlref> for details about subroutines and
+references, and L<attributes> and L<Attribute::Handlers> for more
+information about attributes.
+
+=item substr EXPR,OFFSET,LENGTH,REPLACEMENT
+X<substr> X<substring> X<mid> X<left> X<right>
+
+=item substr EXPR,OFFSET,LENGTH
+
+=item substr EXPR,OFFSET
+
+Extracts a substring out of EXPR and returns it.  First character is at
+offset C<0>, or whatever you've set C<$[> to (but don't do that).
+If OFFSET is negative (or more precisely, less than C<$[>), starts
+that far from the end of the string.  If LENGTH is omitted, returns
+everything to the end of the string.  If LENGTH is negative, leaves that
+many characters off the end of the string.
+
+You can use the substr() function as an lvalue, in which case EXPR
+must itself be an lvalue.  If you assign something shorter than LENGTH,
+the string will shrink, and if you assign something longer than LENGTH,
+the string will grow to accommodate it.  To keep the string the same
+length you may need to pad or chop your value using C<sprintf>.
+
+If OFFSET and LENGTH specify a substring that is partly outside the
+string, only the part within the string is returned.  If the substring
+is beyond either end of the string, substr() returns the undefined
+value and produces a warning.  When used as an lvalue, specifying a
+substring that is entirely outside the string is a fatal error.
+Here's an example showing the behavior for boundary cases:
+
+    my $name = 'fred';
+    substr($name, 4) = 'dy';		# $name is now 'freddy'
+    my $null = substr $name, 6, 2;	# returns '' (no warning)
+    my $oops = substr $name, 7;		# returns undef, with warning
+    substr($name, 7) = 'gap';		# fatal error
+
+An alternative to using substr() as an lvalue is to specify the
+replacement string as the 4th argument.  This allows you to replace
+parts of the EXPR and return what was there before in one operation,
+just as you can with splice().
+
+
+=item symlink OLDFILE,NEWFILE
+X<symlink> X<link> X<symbolic link> X<link, symbolic>
+
+Creates a new filename symbolically linked to the old filename.
+Returns C<1> for success, C<0> otherwise.  On systems that don't support
+symbolic links, produces a fatal error at run time.  To check for that,
+use eval:
+
+    $symlink_exists = eval { symlink("",""); 1 };
+
+=item syscall NUMBER, LIST
+X<syscall> X<system call>
+
+Calls the system call specified as the first element of the list,
+passing the remaining elements as arguments to the system call.  If
+unimplemented, produces a fatal error.  The arguments are interpreted
+as follows: if a given argument is numeric, the argument is passed as
+an int.  If not, the pointer to the string value is passed.  You are
+responsible to make sure a string is pre-extended long enough to
+receive any result that might be written into a string.  You can't use a
+string literal (or other read-only string) as an argument to C<syscall>
+because Perl has to assume that any string pointer might be written
+through.  If your
+integer arguments are not literals and have never been interpreted in a
+numeric context, you may need to add C<0> to them to force them to look
+like numbers.  This emulates the C<syswrite> function (or vice versa):
+
+    require 'syscall.ph';		# may need to run h2ph
+    $s = "hi there\n";
+    syscall(&SYS_write, fileno(STDOUT), $s, length $s);
+
+Note that Perl supports passing of up to only 14 arguments to your system call,
+which in practice should usually suffice.
+
+Syscall returns whatever value returned by the system call it calls.
+If the system call fails, C<syscall> returns C<-1> and sets C<$!> (errno).
+Note that some system calls can legitimately return C<-1>.  The proper
+way to handle such calls is to assign C<$!=0;> before the call and
+check the value of C<$!> if syscall returns C<-1>.
+
+There's a problem with C<syscall(&SYS_pipe)>: it returns the file
+number of the read end of the pipe it creates.  There is no way
+to retrieve the file number of the other end.  You can avoid this
+problem by using C<pipe> instead.
+
+=item sysopen FILEHANDLE,FILENAME,MODE
+X<sysopen>
+
+=item sysopen FILEHANDLE,FILENAME,MODE,PERMS
+
+Opens the file whose filename is given by FILENAME, and associates it
+with FILEHANDLE.  If FILEHANDLE is an expression, its value is used as
+the name of the real filehandle wanted.  This function calls the
+underlying operating system's C<open> function with the parameters
+FILENAME, MODE, PERMS.
+
+The possible values and flag bits of the MODE parameter are
+system-dependent; they are available via the standard module C<Fcntl>.
+See the documentation of your operating system's C<open> to see which
+values and flag bits are available.  You may combine several flags
+using the C<|>-operator.
+
+Some of the most common values are C<O_RDONLY> for opening the file in
+read-only mode, C<O_WRONLY> for opening the file in write-only mode,
+and C<O_RDWR> for opening the file in read-write mode.
+X<O_RDONLY> X<O_RDWR> X<O_WRONLY>
+
+For historical reasons, some values work on almost every system
+supported by perl: zero means read-only, one means write-only, and two
+means read/write.  We know that these values do I<not> work under
+OS/390 & VM/ESA Unix and on the Macintosh; you probably don't want to
+use them in new code.
+
+If the file named by FILENAME does not exist and the C<open> call creates
+it (typically because MODE includes the C<O_CREAT> flag), then the value of
+PERMS specifies the permissions of the newly created file.  If you omit
+the PERMS argument to C<sysopen>, Perl uses the octal value C<0666>.
+These permission values need to be in octal, and are modified by your
+process's current C<umask>.
+X<O_CREAT>
+
+In many systems the C<O_EXCL> flag is available for opening files in
+exclusive mode.  This is B<not> locking: exclusiveness means here that
+if the file already exists, sysopen() fails.  C<O_EXCL> may not work
+on network filesystems, and has no effect unless the C<O_CREAT> flag
+is set as well.  Setting C<O_CREAT|O_EXCL> prevents the file from
+being opened if it is a symbolic link.  It does not protect against
+symbolic links in the file's path.
+X<O_EXCL>
+
+Sometimes you may want to truncate an already-existing file.  This
+can be done using the C<O_TRUNC> flag.  The behavior of
+C<O_TRUNC> with C<O_RDONLY> is undefined.
+X<O_TRUNC>
+
+You should seldom if ever use C<0644> as argument to C<sysopen>, because
+that takes away the user's option to have a more permissive umask.
+Better to omit it.  See the perlfunc(1) entry on C<umask> for more
+on this.
+
+Note that C<sysopen> depends on the fdopen() C library function.
+On many UNIX systems, fdopen() is known to fail when file descriptors
+exceed a certain value, typically 255. If you need more file
+descriptors than that, consider rebuilding Perl to use the C<sfio>
+library, or perhaps using the POSIX::open() function.
+
+See L<perlopentut> for a kinder, gentler explanation of opening files.
+
+=item sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
+X<sysread>
+
+=item sysread FILEHANDLE,SCALAR,LENGTH
+
+Attempts to read LENGTH bytes of data into variable SCALAR from the
+specified FILEHANDLE, using the system call read(2).  It bypasses
+buffered IO, so mixing this with other kinds of reads, C<print>,
+C<write>, C<seek>, C<tell>, or C<eof> can cause confusion because the
+perlio or stdio layers usually buffers data.  Returns the number of
+bytes actually read, C<0> at end of file, or undef if there was an
+error (in the latter case C<$!> is also set).  SCALAR will be grown or
+shrunk so that the last byte actually read is the last byte of the
+scalar after the read.
+
+An OFFSET may be specified to place the read data at some place in the
+string other than the beginning.  A negative OFFSET specifies
+placement at that many characters counting backwards from the end of
+the string.  A positive OFFSET greater than the length of SCALAR
+results in the string being padded to the required size with C<"\0">
+bytes before the result of the read is appended.
+
+There is no syseof() function, which is ok, since eof() doesn't work
+very well on device files (like ttys) anyway.  Use sysread() and check
+for a return value for 0 to decide whether you're done.
+
+Note that if the filehandle has been marked as C<:utf8> Unicode
+characters are read instead of bytes (the LENGTH, OFFSET, and the
+return value of sysread() are in Unicode characters).
+The C<:encoding(...)> layer implicitly introduces the C<:utf8> layer.
+See L</binmode>, L</open>, and the C<open> pragma, L<open>.
+
+=item sysseek FILEHANDLE,POSITION,WHENCE
+X<sysseek> X<lseek>
+
+Sets FILEHANDLE's system position in bytes using the system call
+lseek(2).  FILEHANDLE may be an expression whose value gives the name
+of the filehandle.  The values for WHENCE are C<0> to set the new
+position to POSITION, C<1> to set the it to the current position plus
+POSITION, and C<2> to set it to EOF plus POSITION (typically
+negative).
+
+Note the I<in bytes>: even if the filehandle has been set to operate
+on characters (for example by using the C<:utf8> I/O layer), tell()
+will return byte offsets, not character offsets (because implementing
+that would render sysseek() very slow).
+
+sysseek() bypasses normal buffered IO, so mixing this with reads (other
+than C<sysread>, for example C<< <> >> or read()) C<print>, C<write>,
+C<seek>, C<tell>, or C<eof> may cause confusion.
+
+For WHENCE, you may also use the constants C<SEEK_SET>, C<SEEK_CUR>,
+and C<SEEK_END> (start of the file, current position, end of the file)
+from the Fcntl module.  Use of the constants is also more portable
+than relying on 0, 1, and 2.  For example to define a "systell" function:
+
+	use Fcntl 'SEEK_CUR';
+	sub systell { sysseek($_[0], 0, SEEK_CUR) }
+
+Returns the new position, or the undefined value on failure.  A position
+of zero is returned as the string C<"0 but true">; thus C<sysseek> returns
+true on success and false on failure, yet you can still easily determine
+the new position.
+
+=item system LIST
+X<system> X<shell>
+
+=item system PROGRAM LIST
+
+Does exactly the same thing as C<exec LIST>, except that a fork is
+done first, and the parent process waits for the child process to
+complete.  Note that argument processing varies depending on the
+number of arguments.  If there is more than one argument in LIST,
+or if LIST is an array with more than one value, starts the program
+given by the first element of the list with arguments given by the
+rest of the list.  If there is only one scalar argument, the argument
+is checked for shell metacharacters, and if there are any, the
+entire argument is passed to the system's command shell for parsing
+(this is C</bin/sh -c> on Unix platforms, but varies on other
+platforms).  If there are no shell metacharacters in the argument,
+it is split into words and passed directly to C<execvp>, which is
+more efficient.
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before any operation that may do a fork, but this may not be
+supported on some platforms (see L<perlport>).  To be safe, you may need
+to set C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method
+of C<IO::Handle> on any open handles.
+
+The return value is the exit status of the program as returned by the
+C<wait> call.  To get the actual exit value, shift right by eight (see
+below). See also L</exec>.  This is I<not> what you want to use to capture
+the output from a command, for that you should use merely backticks or
+C<qx//>, as described in L<perlop/"`STRING`">.  Return value of -1
+indicates a failure to start the program or an error of the wait(2) system
+call (inspect $! for the reason).
+
+Like C<exec>, C<system> allows you to lie to a program about its name if
+you use the C<system PROGRAM LIST> syntax.  Again, see L</exec>.
+
+Since C<SIGINT> and C<SIGQUIT> are ignored during the execution of
+C<system>, if you expect your program to terminate on receipt of these
+signals you will need to arrange to do so yourself based on the return
+value.
+
+    @args = ("command", "arg1", "arg2");
+    system(@args) == 0
+	 or die "system @args failed: $?"
+
+You can check all the failure possibilities by inspecting
+C<$?> like this:
+
+    if ($? == -1) {
+	print "failed to execute: $!\n";
+    }
+    elsif ($? & 127) {
+	printf "child died with signal %d, %s coredump\n",
+	    ($? & 127),  ($? & 128) ? 'with' : 'without';
+    }
+    else {
+	printf "child exited with value %d\n", $? >> 8;
+    }
+
+or more portably by using the W*() calls of the POSIX extension;
+see L<perlport> for more information.
+
+When the arguments get executed via the system shell, results
+and return codes will be subject to its quirks and capabilities.
+See L<perlop/"`STRING`"> and L</exec> for details.
+
+=item syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
+X<syswrite>
+
+=item syswrite FILEHANDLE,SCALAR,LENGTH
+
+=item syswrite FILEHANDLE,SCALAR
+
+Attempts to write LENGTH bytes of data from variable SCALAR to the
+specified FILEHANDLE, using the system call write(2).  If LENGTH is
+not specified, writes whole SCALAR.  It bypasses buffered IO, so
+mixing this with reads (other than C<sysread())>, C<print>, C<write>,
+C<seek>, C<tell>, or C<eof> may cause confusion because the perlio and
+stdio layers usually buffers data.  Returns the number of bytes
+actually written, or C<undef> if there was an error (in this case the
+errno variable C<$!> is also set).  If the LENGTH is greater than the
+available data in the SCALAR after the OFFSET, only as much data as is
+available will be written.
+
+An OFFSET may be specified to write the data from some part of the
+string other than the beginning.  A negative OFFSET specifies writing
+that many characters counting backwards from the end of the string.
+In the case the SCALAR is empty you can use OFFSET but only zero offset.
+
+Note that if the filehandle has been marked as C<:utf8>, Unicode
+characters are written instead of bytes (the LENGTH, OFFSET, and the
+return value of syswrite() are in UTF-8 encoded Unicode characters).
+The C<:encoding(...)> layer implicitly introduces the C<:utf8> layer.
+See L</binmode>, L</open>, and the C<open> pragma, L<open>.
+
+=item tell FILEHANDLE
+X<tell>
+
+=item tell
+
+Returns the current position I<in bytes> for FILEHANDLE, or -1 on
+error.  FILEHANDLE may be an expression whose value gives the name of
+the actual filehandle.  If FILEHANDLE is omitted, assumes the file
+last read.
+
+Note the I<in bytes>: even if the filehandle has been set to
+operate on characters (for example by using the C<:utf8> open
+layer), tell() will return byte offsets, not character offsets
+(because that would render seek() and tell() rather slow).
+
+The return value of tell() for the standard streams like the STDIN
+depends on the operating system: it may return -1 or something else.
+tell() on pipes, fifos, and sockets usually returns -1.
+
+There is no C<systell> function.  Use C<sysseek(FH, 0, 1)> for that.
+
+Do not use tell() (or other buffered I/O operations) on a file handle
+that has been manipulated by sysread(), syswrite() or sysseek().
+Those functions ignore the buffering, while tell() does not.
+
+=item telldir DIRHANDLE
+X<telldir>
+
+Returns the current position of the C<readdir> routines on DIRHANDLE.
+Value may be given to C<seekdir> to access a particular location in a
+directory.  C<telldir> has the same caveats about possible directory
+compaction as the corresponding system library routine.
+
+=item tie VARIABLE,CLASSNAME,LIST
+X<tie>
+
+This function binds a variable to a package class that will provide the
+implementation for the variable.  VARIABLE is the name of the variable
+to be enchanted.  CLASSNAME is the name of a class implementing objects
+of correct type.  Any additional arguments are passed to the C<new>
+method of the class (meaning C<TIESCALAR>, C<TIEHANDLE>, C<TIEARRAY>,
+or C<TIEHASH>).  Typically these are arguments such as might be passed
+to the C<dbm_open()> function of C.  The object returned by the C<new>
+method is also returned by the C<tie> function, which would be useful
+if you want to access other methods in CLASSNAME.
+
+Note that functions such as C<keys> and C<values> may return huge lists
+when used on large objects, like DBM files.  You may prefer to use the
+C<each> function to iterate over such.  Example:
+
+    # print out history file offsets
+    use NDBM_File;
+    tie(%HIST, 'NDBM_File', '/usr/lib/news/history', 1, 0);
+    while (($key,$val) = each %HIST) {
+	print $key, ' = ', unpack('L',$val), "\n";
+    }
+    untie(%HIST);
+
+A class implementing a hash should have the following methods:
+
+    TIEHASH classname, LIST
+    FETCH this, key
+    STORE this, key, value
+    DELETE this, key
+    CLEAR this
+    EXISTS this, key
+    FIRSTKEY this
+    NEXTKEY this, lastkey
+    SCALAR this
+    DESTROY this
+    UNTIE this
+
+A class implementing an ordinary array should have the following methods:
+
+    TIEARRAY classname, LIST
+    FETCH this, key
+    STORE this, key, value
+    FETCHSIZE this
+    STORESIZE this, count
+    CLEAR this
+    PUSH this, LIST
+    POP this
+    SHIFT this
+    UNSHIFT this, LIST
+    SPLICE this, offset, length, LIST
+    EXTEND this, count
+    DESTROY this
+    UNTIE this
+
+A class implementing a file handle should have the following methods:
+
+    TIEHANDLE classname, LIST
+    READ this, scalar, length, offset
+    READLINE this
+    GETC this
+    WRITE this, scalar, length, offset
+    PRINT this, LIST
+    PRINTF this, format, LIST
+    BINMODE this
+    EOF this
+    FILENO this
+    SEEK this, position, whence
+    TELL this
+    OPEN this, mode, LIST
+    CLOSE this
+    DESTROY this
+    UNTIE this
+
+A class implementing a scalar should have the following methods:
+
+    TIESCALAR classname, LIST
+    FETCH this,
+    STORE this, value
+    DESTROY this
+    UNTIE this
+
+Not all methods indicated above need be implemented.  See L<perltie>,
+L<Tie::Hash>, L<Tie::Array>, L<Tie::Scalar>, and L<Tie::Handle>.
+
+Unlike C<dbmopen>, the C<tie> function will not use or require a module
+for you--you need to do that explicitly yourself.  See L<DB_File>
+or the F<Config> module for interesting C<tie> implementations.
+
+For further details see L<perltie>, L<"tied VARIABLE">.
+
+=item tied VARIABLE
+X<tied>
+
+Returns a reference to the object underlying VARIABLE (the same value
+that was originally returned by the C<tie> call that bound the variable
+to a package.)  Returns the undefined value if VARIABLE isn't tied to a
+package.
+
+=item time
+X<time> X<epoch>
+
+Returns the number of non-leap seconds since whatever time the system
+considers to be the epoch, suitable for feeding to C<gmtime> and
+C<localtime>. On most systems the epoch is 00:00:00 UTC, January 1, 1970;
+a prominent exception being Mac OS Classic which uses 00:00:00, January 1,
+1904 in the current local time zone for its epoch.
+
+For measuring time in better granularity than one second,
+you may use either the Time::HiRes module (from CPAN, and starting from
+Perl 5.8 part of the standard distribution), or if you have
+gettimeofday(2), you may be able to use the C<syscall> interface of Perl.
+See L<perlfaq8> for details.
+
+=item times
+X<times>
+
+Returns a four-element list giving the user and system times, in
+seconds, for this process and the children of this process.
+
+    ($user,$system,$cuser,$csystem) = times;
+
+In scalar context, C<times> returns C<$user>.
+
+=item tr///
+
+The transliteration operator.  Same as C<y///>.  See L<perlop>.
+
+=item truncate FILEHANDLE,LENGTH
+X<truncate>
+
+=item truncate EXPR,LENGTH
+
+Truncates the file opened on FILEHANDLE, or named by EXPR, to the
+specified length.  Produces a fatal error if truncate isn't implemented
+on your system.  Returns true if successful, the undefined value
+otherwise.
+
+The behavior is undefined if LENGTH is greater than the length of the
+file.
+
+=item uc EXPR
+X<uc> X<uppercase> X<toupper>
+
+=item uc
+
+Returns an uppercased version of EXPR.  This is the internal function
+implementing the C<\U> escape in double-quoted strings.  Respects
+current LC_CTYPE locale if C<use locale> in force.  See L<perllocale>
+and L<perlunicode> for more details about locale and Unicode support.
+It does not attempt to do titlecase mapping on initial letters.  See
+C<ucfirst> for that.
+
+If EXPR is omitted, uses C<$_>.
+
+=item ucfirst EXPR
+X<ucfirst> X<uppercase>
+
+=item ucfirst
+
+Returns the value of EXPR with the first character in uppercase
+(titlecase in Unicode).  This is the internal function implementing
+the C<\u> escape in double-quoted strings.  Respects current LC_CTYPE
+locale if C<use locale> in force.  See L<perllocale> and L<perlunicode>
+for more details about locale and Unicode support.
+
+If EXPR is omitted, uses C<$_>.
+
+=item umask EXPR
+X<umask>
+
+=item umask
+
+Sets the umask for the process to EXPR and returns the previous value.
+If EXPR is omitted, merely returns the current umask.
+
+The Unix permission C<rwxr-x---> is represented as three sets of three
+bits, or three octal digits: C<0750> (the leading 0 indicates octal
+and isn't one of the digits).  The C<umask> value is such a number
+representing disabled permissions bits.  The permission (or "mode")
+values you pass C<mkdir> or C<sysopen> are modified by your umask, so
+even if you tell C<sysopen> to create a file with permissions C<0777>,
+if your umask is C<0022> then the file will actually be created with
+permissions C<0755>.  If your C<umask> were C<0027> (group can't
+write; others can't read, write, or execute), then passing
+C<sysopen> C<0666> would create a file with mode C<0640> (C<0666 &~
+027> is C<0640>).
+
+Here's some advice: supply a creation mode of C<0666> for regular
+files (in C<sysopen>) and one of C<0777> for directories (in
+C<mkdir>) and executable files.  This gives users the freedom of
+choice: if they want protected files, they might choose process umasks
+of C<022>, C<027>, or even the particularly antisocial mask of C<077>.
+Programs should rarely if ever make policy decisions better left to
+the user.  The exception to this is when writing files that should be
+kept private: mail files, web browser cookies, I<.rhosts> files, and
+so on.
+
+If umask(2) is not implemented on your system and you are trying to
+restrict access for I<yourself> (i.e., (EXPR & 0700) > 0), produces a
+fatal error at run time.  If umask(2) is not implemented and you are
+not trying to restrict access for yourself, returns C<undef>.
+
+Remember that a umask is a number, usually given in octal; it is I<not> a
+string of octal digits.  See also L</oct>, if all you have is a string.
+
+=item undef EXPR
+X<undef> X<undefine>
+
+=item undef
+
+Undefines the value of EXPR, which must be an lvalue.  Use only on a
+scalar value, an array (using C<@>), a hash (using C<%>), a subroutine
+(using C<&>), or a typeglob (using C<*>).  (Saying C<undef $hash{$key}>
+will probably not do what you expect on most predefined variables or
+DBM list values, so don't do that; see L<delete>.)  Always returns the
+undefined value.  You can omit the EXPR, in which case nothing is
+undefined, but you still get an undefined value that you could, for
+instance, return from a subroutine, assign to a variable or pass as a
+parameter.  Examples:
+
+    undef $foo;
+    undef $bar{'blurfl'};      # Compare to: delete $bar{'blurfl'};
+    undef @ary;
+    undef %hash;
+    undef &mysub;
+    undef *xyz;       # destroys $xyz, @xyz, %xyz, &xyz, etc.
+    return (wantarray ? (undef, $errmsg) : undef) if $they_blew_it;
+    select undef, undef, undef, 0.25;
+    ($a, $b, undef, $c) = &foo;       # Ignore third value returned
+
+Note that this is a unary operator, not a list operator.
+
+=item unlink LIST
+X<unlink> X<delete> X<remove> X<rm>
+
+=item unlink
+
+Deletes a list of files.  Returns the number of files successfully
+deleted.
+
+    $cnt = unlink 'a', 'b', 'c';
+    unlink @goners;
+    unlink <*.bak>;
+
+Note: C<unlink> will not attempt to delete directories unless you are superuser
+and the B<-U> flag is supplied to Perl.  Even if these conditions are
+met, be warned that unlinking a directory can inflict damage on your
+filesystem.  Finally, using C<unlink> on directories is not supported on 
+many operating systems.  Use C<rmdir> instead.
+
+If LIST is omitted, uses C<$_>.
+
+=item unpack TEMPLATE,EXPR
+X<unpack>
+
+C<unpack> does the reverse of C<pack>: it takes a string
+and expands it out into a list of values.
+(In scalar context, it returns merely the first value produced.)
+
+The string is broken into chunks described by the TEMPLATE.  Each chunk
+is converted separately to a value.  Typically, either the string is a result
+of C<pack>, or the bytes of the string represent a C structure of some
+kind.
+
+The TEMPLATE has the same format as in the C<pack> function.
+Here's a subroutine that does substring:
+
+    sub substr {
+	my($what,$where,$howmuch) = @_;
+	unpack("x$where a$howmuch", $what);
+    }
+
+and then there's
+
+    sub ordinal { unpack("c",$_[0]); } # same as ord()
+
+In addition to fields allowed in pack(), you may prefix a field with
+a %<number> to indicate that
+you want a <number>-bit checksum of the items instead of the items
+themselves.  Default is a 16-bit checksum.  Checksum is calculated by
+summing numeric values of expanded values (for string fields the sum of
+C<ord($char)> is taken, for bit fields the sum of zeroes and ones).
+
+For example, the following
+computes the same number as the System V sum program:
+
+    $checksum = do {
+	local $/;  # slurp!
+	unpack("%32C*",<>) % 65535;
+    };
+
+The following efficiently counts the number of set bits in a bit vector:
+
+    $setbits = unpack("%32b*", $selectmask);
+
+The C<p> and C<P> formats should be used with care.  Since Perl
+has no way of checking whether the value passed to C<unpack()>
+corresponds to a valid memory location, passing a pointer value that's
+not known to be valid is likely to have disastrous consequences.
+
+If there are more pack codes or if the repeat count of a field or a group
+is larger than what the remainder of the input string allows, the result
+is not well defined: in some cases, the repeat count is decreased, or
+C<unpack()> will produce null strings or zeroes, or terminate with an
+error. If the input string is longer than one described by the TEMPLATE,
+the rest is ignored.
+
+See L</pack> for more examples and notes.
+
+=item untie VARIABLE
+X<untie>
+
+Breaks the binding between a variable and a package.  (See C<tie>.)
+Has no effect if the variable is not tied.
+
+=item unshift ARRAY,LIST
+X<unshift>
+
+Does the opposite of a C<shift>.  Or the opposite of a C<push>,
+depending on how you look at it.  Prepends list to the front of the
+array, and returns the new number of elements in the array.
+
+    unshift(@ARGV, '-e') unless $ARGV[0] =~ /^-/;
+
+Note the LIST is prepended whole, not one element at a time, so the
+prepended elements stay in the same order.  Use C<reverse> to do the
+reverse.
+
+=item use Module VERSION LIST
+X<use> X<module> X<import>
+
+=item use Module VERSION
+
+=item use Module LIST
+
+=item use Module
+
+=item use VERSION
+
+Imports some semantics into the current package from the named module,
+generally by aliasing certain subroutine or variable names into your
+package.  It is exactly equivalent to
+
+    BEGIN { require Module; import Module LIST; }
+
+except that Module I<must> be a bareword.
+
+VERSION may be either a numeric argument such as 5.006, which will be
+compared to C<$]>, or a literal of the form v5.6.1, which will be compared
+to C<$^V> (aka $PERL_VERSION.  A fatal error is produced if VERSION is
+greater than the version of the current Perl interpreter; Perl will not
+attempt to parse the rest of the file.  Compare with L</require>, which can
+do a similar check at run time.
+
+Specifying VERSION as a literal of the form v5.6.1 should generally be
+avoided, because it leads to misleading error messages under earlier
+versions of Perl that do not support this syntax.  The equivalent numeric
+version should be used instead.
+
+    use v5.6.1;		# compile time version check
+    use 5.6.1;		# ditto
+    use 5.006_001;	# ditto; preferred for backwards compatibility
+
+This is often useful if you need to check the current Perl version before
+C<use>ing library modules that have changed in incompatible ways from
+older versions of Perl.  (We try not to do this more than we have to.)
+
+The C<BEGIN> forces the C<require> and C<import> to happen at compile time.  The
+C<require> makes sure the module is loaded into memory if it hasn't been
+yet.  The C<import> is not a builtin--it's just an ordinary static method
+call into the C<Module> package to tell the module to import the list of
+features back into the current package.  The module can implement its
+C<import> method any way it likes, though most modules just choose to
+derive their C<import> method via inheritance from the C<Exporter> class that
+is defined in the C<Exporter> module.  See L<Exporter>.  If no C<import>
+method can be found then the call is skipped.
+
+If you do not want to call the package's C<import> method (for instance,
+to stop your namespace from being altered), explicitly supply the empty list:
+
+    use Module ();
+
+That is exactly equivalent to
+
+    BEGIN { require Module }
+
+If the VERSION argument is present between Module and LIST, then the
+C<use> will call the VERSION method in class Module with the given
+version as an argument.  The default VERSION method, inherited from
+the UNIVERSAL class, croaks if the given version is larger than the
+value of the variable C<$Module::VERSION>.
+
+Again, there is a distinction between omitting LIST (C<import> called
+with no arguments) and an explicit empty LIST C<()> (C<import> not
+called).  Note that there is no comma after VERSION!
+
+Because this is a wide-open interface, pragmas (compiler directives)
+are also implemented this way.  Currently implemented pragmas are:
+
+    use constant;
+    use diagnostics;
+    use integer;
+    use sigtrap  qw(SEGV BUS);
+    use strict   qw(subs vars refs);
+    use subs     qw(afunc blurfl);
+    use warnings qw(all);
+    use sort     qw(stable _quicksort _mergesort);
+
+Some of these pseudo-modules import semantics into the current
+block scope (like C<strict> or C<integer>, unlike ordinary modules,
+which import symbols into the current package (which are effective
+through the end of the file).
+
+There's a corresponding C<no> command that unimports meanings imported
+by C<use>, i.e., it calls C<unimport Module LIST> instead of C<import>.
+
+    no integer;
+    no strict 'refs';
+    no warnings;
+
+See L<perlmodlib> for a list of standard modules and pragmas.  See L<perlrun>
+for the C<-M> and C<-m> command-line options to perl that give C<use>
+functionality from the command-line.
+
+=item utime LIST
+X<utime>
+
+Changes the access and modification times on each file of a list of
+files.  The first two elements of the list must be the NUMERICAL access
+and modification times, in that order.  Returns the number of files
+successfully changed.  The inode change time of each file is set
+to the current time.  For example, this code has the same effect as the
+Unix touch(1) command when the files I<already exist> and belong to
+the user running the program:
+
+    #!/usr/bin/perl
+    $atime = $mtime = time;
+    utime $atime, $mtime, @ARGV;
+
+Since perl 5.7.2, if the first two elements of the list are C<undef>, then
+the utime(2) function in the C library will be called with a null second
+argument. On most systems, this will set the file's access and
+modification times to the current time (i.e. equivalent to the example
+above) and will even work on other users' files where you have write
+permission:
+
+    utime undef, undef, @ARGV;
+
+Under NFS this will use the time of the NFS server, not the time of
+the local machine.  If there is a time synchronization problem, the
+NFS server and local machine will have different times.  The Unix
+touch(1) command will in fact normally use this form instead of the
+one shown in the first example.
+
+Note that only passing one of the first two elements as C<undef> will
+be equivalent of passing it as 0 and will not have the same effect as
+described when they are both C<undef>.  This case will also trigger an
+uninitialized warning.
+
+=item values HASH
+X<values>
+
+Returns a list consisting of all the values of the named hash.
+(In a scalar context, returns the number of values.)
+
+The values are returned in an apparently random order.  The actual
+random order is subject to change in future versions of perl, but it
+is guaranteed to be the same order as either the C<keys> or C<each>
+function would produce on the same (unmodified) hash.  Since Perl
+5.8.1 the ordering is different even between different runs of Perl
+for security reasons (see L<perlsec/"Algorithmic Complexity Attacks">).
+
+As a side effect, calling values() resets the HASH's internal iterator,
+see L</each>. (In particular, calling values() in void context resets
+the iterator with no other overhead.)
+
+Note that the values are not copied, which means modifying them will
+modify the contents of the hash:
+
+    for (values %hash) 	    { s/foo/bar/g }   # modifies %hash values
+    for (@hash{keys %hash}) { s/foo/bar/g }   # same
+
+See also C<keys>, C<each>, and C<sort>.
+
+=item vec EXPR,OFFSET,BITS
+X<vec> X<bit> X<bit vector>
+
+Treats the string in EXPR as a bit vector made up of elements of
+width BITS, and returns the value of the element specified by OFFSET
+as an unsigned integer.  BITS therefore specifies the number of bits
+that are reserved for each element in the bit vector.  This must
+be a power of two from 1 to 32 (or 64, if your platform supports
+that).
+
+If BITS is 8, "elements" coincide with bytes of the input string.
+
+If BITS is 16 or more, bytes of the input string are grouped into chunks
+of size BITS/8, and each group is converted to a number as with
+pack()/unpack() with big-endian formats C<n>/C<N> (and analogously
+for BITS==64).  See L<"pack"> for details.
+
+If bits is 4 or less, the string is broken into bytes, then the bits
+of each byte are broken into 8/BITS groups.  Bits of a byte are
+numbered in a little-endian-ish way, as in C<0x01>, C<0x02>,
+C<0x04>, C<0x08>, C<0x10>, C<0x20>, C<0x40>, C<0x80>.  For example,
+breaking the single input byte C<chr(0x36)> into two groups gives a list
+C<(0x6, 0x3)>; breaking it into 4 groups gives C<(0x2, 0x1, 0x3, 0x0)>.
+
+C<vec> may also be assigned to, in which case parentheses are needed
+to give the expression the correct precedence as in
+
+    vec($image, $max_x * $x + $y, 8) = 3;
+
+If the selected element is outside the string, the value 0 is returned.
+If an element off the end of the string is written to, Perl will first
+extend the string with sufficiently many zero bytes.   It is an error
+to try to write off the beginning of the string (i.e. negative OFFSET).
+
+The string should not contain any character with the value > 255 (which
+can only happen if you're using UTF-8 encoding).  If it does, it will be
+treated as something that is not UTF-8 encoded.  When the C<vec> was
+assigned to, other parts of your program will also no longer consider the
+string to be UTF-8 encoded.  In other words, if you do have such characters
+in your string, vec() will operate on the actual byte string, and not the
+conceptual character string.
+
+Strings created with C<vec> can also be manipulated with the logical
+operators C<|>, C<&>, C<^>, and C<~>.  These operators will assume a bit
+vector operation is desired when both operands are strings.
+See L<perlop/"Bitwise String Operators">.
+
+The following code will build up an ASCII string saying C<'PerlPerlPerl'>.
+The comments show the string after each step.  Note that this code works
+in the same way on big-endian or little-endian machines.
+
+    my $foo = '';
+    vec($foo,  0, 32) = 0x5065726C;	# 'Perl'
+
+    # $foo eq "Perl" eq "\x50\x65\x72\x6C", 32 bits
+    print vec($foo, 0, 8);		# prints 80 == 0x50 == ord('P')
+
+    vec($foo,  2, 16) = 0x5065;		# 'PerlPe'
+    vec($foo,  3, 16) = 0x726C;		# 'PerlPerl'
+    vec($foo,  8,  8) = 0x50;		# 'PerlPerlP'
+    vec($foo,  9,  8) = 0x65;		# 'PerlPerlPe'
+    vec($foo, 20,  4) = 2;		# 'PerlPerlPe'   . "\x02"
+    vec($foo, 21,  4) = 7;		# 'PerlPerlPer'
+                                        # 'r' is "\x72"
+    vec($foo, 45,  2) = 3;		# 'PerlPerlPer'  . "\x0c"
+    vec($foo, 93,  1) = 1;		# 'PerlPerlPer'  . "\x2c"
+    vec($foo, 94,  1) = 1;		# 'PerlPerlPerl'
+                                        # 'l' is "\x6c"
+
+To transform a bit vector into a string or list of 0's and 1's, use these:
+
+    $bits = unpack("b*", $vector);
+    @bits = split(//, unpack("b*", $vector));
+
+If you know the exact length in bits, it can be used in place of the C<*>.
+
+Here is an example to illustrate how the bits actually fall in place:
+
+    #!/usr/bin/perl -wl
+
+    print <<'EOT';
+                                      0         1         2         3
+                       unpack("V",$_) 01234567890123456789012345678901
+    ------------------------------------------------------------------
+    EOT
+
+    for $w (0..3) {
+        $width = 2**$w;
+        for ($shift=0; $shift < $width; ++$shift) {
+            for ($off=0; $off < 32/$width; ++$off) {
+                $str = pack("B*", "0"x32);
+                $bits = (1<<$shift);
+                vec($str, $off, $width) = $bits;
+                $res = unpack("b*",$str);
+                $val = unpack("V", $str);
+                write;
+            }
+        }
+    }
+
+    format STDOUT =
+    vec($_,@#,@#) = @<< == @######### @>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+    $off, $width, $bits, $val, $res
+    .
+    __END__
+
+Regardless of the machine architecture on which it is run, the above
+example should print the following table:
+
+                                      0         1         2         3
+                       unpack("V",$_) 01234567890123456789012345678901
+    ------------------------------------------------------------------
+    vec($_, 0, 1) = 1   ==          1 10000000000000000000000000000000
+    vec($_, 1, 1) = 1   ==          2 01000000000000000000000000000000
+    vec($_, 2, 1) = 1   ==          4 00100000000000000000000000000000
+    vec($_, 3, 1) = 1   ==          8 00010000000000000000000000000000
+    vec($_, 4, 1) = 1   ==         16 00001000000000000000000000000000
+    vec($_, 5, 1) = 1   ==         32 00000100000000000000000000000000
+    vec($_, 6, 1) = 1   ==         64 00000010000000000000000000000000
+    vec($_, 7, 1) = 1   ==        128 00000001000000000000000000000000
+    vec($_, 8, 1) = 1   ==        256 00000000100000000000000000000000
+    vec($_, 9, 1) = 1   ==        512 00000000010000000000000000000000
+    vec($_,10, 1) = 1   ==       1024 00000000001000000000000000000000
+    vec($_,11, 1) = 1   ==       2048 00000000000100000000000000000000
+    vec($_,12, 1) = 1   ==       4096 00000000000010000000000000000000
+    vec($_,13, 1) = 1   ==       8192 00000000000001000000000000000000
+    vec($_,14, 1) = 1   ==      16384 00000000000000100000000000000000
+    vec($_,15, 1) = 1   ==      32768 00000000000000010000000000000000
+    vec($_,16, 1) = 1   ==      65536 00000000000000001000000000000000
+    vec($_,17, 1) = 1   ==     131072 00000000000000000100000000000000
+    vec($_,18, 1) = 1   ==     262144 00000000000000000010000000000000
+    vec($_,19, 1) = 1   ==     524288 00000000000000000001000000000000
+    vec($_,20, 1) = 1   ==    1048576 00000000000000000000100000000000
+    vec($_,21, 1) = 1   ==    2097152 00000000000000000000010000000000
+    vec($_,22, 1) = 1   ==    4194304 00000000000000000000001000000000
+    vec($_,23, 1) = 1   ==    8388608 00000000000000000000000100000000
+    vec($_,24, 1) = 1   ==   16777216 00000000000000000000000010000000
+    vec($_,25, 1) = 1   ==   33554432 00000000000000000000000001000000
+    vec($_,26, 1) = 1   ==   67108864 00000000000000000000000000100000
+    vec($_,27, 1) = 1   ==  134217728 00000000000000000000000000010000
+    vec($_,28, 1) = 1   ==  268435456 00000000000000000000000000001000
+    vec($_,29, 1) = 1   ==  536870912 00000000000000000000000000000100
+    vec($_,30, 1) = 1   == 1073741824 00000000000000000000000000000010
+    vec($_,31, 1) = 1   == 2147483648 00000000000000000000000000000001
+    vec($_, 0, 2) = 1   ==          1 10000000000000000000000000000000
+    vec($_, 1, 2) = 1   ==          4 00100000000000000000000000000000
+    vec($_, 2, 2) = 1   ==         16 00001000000000000000000000000000
+    vec($_, 3, 2) = 1   ==         64 00000010000000000000000000000000
+    vec($_, 4, 2) = 1   ==        256 00000000100000000000000000000000
+    vec($_, 5, 2) = 1   ==       1024 00000000001000000000000000000000
+    vec($_, 6, 2) = 1   ==       4096 00000000000010000000000000000000
+    vec($_, 7, 2) = 1   ==      16384 00000000000000100000000000000000
+    vec($_, 8, 2) = 1   ==      65536 00000000000000001000000000000000
+    vec($_, 9, 2) = 1   ==     262144 00000000000000000010000000000000
+    vec($_,10, 2) = 1   ==    1048576 00000000000000000000100000000000
+    vec($_,11, 2) = 1   ==    4194304 00000000000000000000001000000000
+    vec($_,12, 2) = 1   ==   16777216 00000000000000000000000010000000
+    vec($_,13, 2) = 1   ==   67108864 00000000000000000000000000100000
+    vec($_,14, 2) = 1   ==  268435456 00000000000000000000000000001000
+    vec($_,15, 2) = 1   == 1073741824 00000000000000000000000000000010
+    vec($_, 0, 2) = 2   ==          2 01000000000000000000000000000000
+    vec($_, 1, 2) = 2   ==          8 00010000000000000000000000000000
+    vec($_, 2, 2) = 2   ==         32 00000100000000000000000000000000
+    vec($_, 3, 2) = 2   ==        128 00000001000000000000000000000000
+    vec($_, 4, 2) = 2   ==        512 00000000010000000000000000000000
+    vec($_, 5, 2) = 2   ==       2048 00000000000100000000000000000000
+    vec($_, 6, 2) = 2   ==       8192 00000000000001000000000000000000
+    vec($_, 7, 2) = 2   ==      32768 00000000000000010000000000000000
+    vec($_, 8, 2) = 2   ==     131072 00000000000000000100000000000000
+    vec($_, 9, 2) = 2   ==     524288 00000000000000000001000000000000
+    vec($_,10, 2) = 2   ==    2097152 00000000000000000000010000000000
+    vec($_,11, 2) = 2   ==    8388608 00000000000000000000000100000000
+    vec($_,12, 2) = 2   ==   33554432 00000000000000000000000001000000
+    vec($_,13, 2) = 2   ==  134217728 00000000000000000000000000010000
+    vec($_,14, 2) = 2   ==  536870912 00000000000000000000000000000100
+    vec($_,15, 2) = 2   == 2147483648 00000000000000000000000000000001
+    vec($_, 0, 4) = 1   ==          1 10000000000000000000000000000000
+    vec($_, 1, 4) = 1   ==         16 00001000000000000000000000000000
+    vec($_, 2, 4) = 1   ==        256 00000000100000000000000000000000
+    vec($_, 3, 4) = 1   ==       4096 00000000000010000000000000000000
+    vec($_, 4, 4) = 1   ==      65536 00000000000000001000000000000000
+    vec($_, 5, 4) = 1   ==    1048576 00000000000000000000100000000000
+    vec($_, 6, 4) = 1   ==   16777216 00000000000000000000000010000000
+    vec($_, 7, 4) = 1   ==  268435456 00000000000000000000000000001000
+    vec($_, 0, 4) = 2   ==          2 01000000000000000000000000000000
+    vec($_, 1, 4) = 2   ==         32 00000100000000000000000000000000
+    vec($_, 2, 4) = 2   ==        512 00000000010000000000000000000000
+    vec($_, 3, 4) = 2   ==       8192 00000000000001000000000000000000
+    vec($_, 4, 4) = 2   ==     131072 00000000000000000100000000000000
+    vec($_, 5, 4) = 2   ==    2097152 00000000000000000000010000000000
+    vec($_, 6, 4) = 2   ==   33554432 00000000000000000000000001000000
+    vec($_, 7, 4) = 2   ==  536870912 00000000000000000000000000000100
+    vec($_, 0, 4) = 4   ==          4 00100000000000000000000000000000
+    vec($_, 1, 4) = 4   ==         64 00000010000000000000000000000000
+    vec($_, 2, 4) = 4   ==       1024 00000000001000000000000000000000
+    vec($_, 3, 4) = 4   ==      16384 00000000000000100000000000000000
+    vec($_, 4, 4) = 4   ==     262144 00000000000000000010000000000000
+    vec($_, 5, 4) = 4   ==    4194304 00000000000000000000001000000000
+    vec($_, 6, 4) = 4   ==   67108864 00000000000000000000000000100000
+    vec($_, 7, 4) = 4   == 1073741824 00000000000000000000000000000010
+    vec($_, 0, 4) = 8   ==          8 00010000000000000000000000000000
+    vec($_, 1, 4) = 8   ==        128 00000001000000000000000000000000
+    vec($_, 2, 4) = 8   ==       2048 00000000000100000000000000000000
+    vec($_, 3, 4) = 8   ==      32768 00000000000000010000000000000000
+    vec($_, 4, 4) = 8   ==     524288 00000000000000000001000000000000
+    vec($_, 5, 4) = 8   ==    8388608 00000000000000000000000100000000
+    vec($_, 6, 4) = 8   ==  134217728 00000000000000000000000000010000
+    vec($_, 7, 4) = 8   == 2147483648 00000000000000000000000000000001
+    vec($_, 0, 8) = 1   ==          1 10000000000000000000000000000000
+    vec($_, 1, 8) = 1   ==        256 00000000100000000000000000000000
+    vec($_, 2, 8) = 1   ==      65536 00000000000000001000000000000000
+    vec($_, 3, 8) = 1   ==   16777216 00000000000000000000000010000000
+    vec($_, 0, 8) = 2   ==          2 01000000000000000000000000000000
+    vec($_, 1, 8) = 2   ==        512 00000000010000000000000000000000
+    vec($_, 2, 8) = 2   ==     131072 00000000000000000100000000000000
+    vec($_, 3, 8) = 2   ==   33554432 00000000000000000000000001000000
+    vec($_, 0, 8) = 4   ==          4 00100000000000000000000000000000
+    vec($_, 1, 8) = 4   ==       1024 00000000001000000000000000000000
+    vec($_, 2, 8) = 4   ==     262144 00000000000000000010000000000000
+    vec($_, 3, 8) = 4   ==   67108864 00000000000000000000000000100000
+    vec($_, 0, 8) = 8   ==          8 00010000000000000000000000000000
+    vec($_, 1, 8) = 8   ==       2048 00000000000100000000000000000000
+    vec($_, 2, 8) = 8   ==     524288 00000000000000000001000000000000
+    vec($_, 3, 8) = 8   ==  134217728 00000000000000000000000000010000
+    vec($_, 0, 8) = 16  ==         16 00001000000000000000000000000000
+    vec($_, 1, 8) = 16  ==       4096 00000000000010000000000000000000
+    vec($_, 2, 8) = 16  ==    1048576 00000000000000000000100000000000
+    vec($_, 3, 8) = 16  ==  268435456 00000000000000000000000000001000
+    vec($_, 0, 8) = 32  ==         32 00000100000000000000000000000000
+    vec($_, 1, 8) = 32  ==       8192 00000000000001000000000000000000
+    vec($_, 2, 8) = 32  ==    2097152 00000000000000000000010000000000
+    vec($_, 3, 8) = 32  ==  536870912 00000000000000000000000000000100
+    vec($_, 0, 8) = 64  ==         64 00000010000000000000000000000000
+    vec($_, 1, 8) = 64  ==      16384 00000000000000100000000000000000
+    vec($_, 2, 8) = 64  ==    4194304 00000000000000000000001000000000
+    vec($_, 3, 8) = 64  == 1073741824 00000000000000000000000000000010
+    vec($_, 0, 8) = 128 ==        128 00000001000000000000000000000000
+    vec($_, 1, 8) = 128 ==      32768 00000000000000010000000000000000
+    vec($_, 2, 8) = 128 ==    8388608 00000000000000000000000100000000
+    vec($_, 3, 8) = 128 == 2147483648 00000000000000000000000000000001
+
+=item wait
+X<wait>
+
+Behaves like the wait(2) system call on your system: it waits for a child
+process to terminate and returns the pid of the deceased process, or
+C<-1> if there are no child processes.  The status is returned in C<$?>.
+Note that a return value of C<-1> could mean that child processes are
+being automatically reaped, as described in L<perlipc>.
+
+=item waitpid PID,FLAGS
+X<waitpid>
+
+Waits for a particular child process to terminate and returns the pid of
+the deceased process, or C<-1> if there is no such child process.  On some
+systems, a value of 0 indicates that there are processes still running.
+The status is returned in C<$?>.  If you say
+
+    use POSIX ":sys_wait_h";
+    #...
+    do {
+	$kid = waitpid(-1, WNOHANG);
+    } until $kid > 0;
+
+then you can do a non-blocking wait for all pending zombie processes.
+Non-blocking wait is available on machines supporting either the
+waitpid(2) or wait4(2) system calls.  However, waiting for a particular
+pid with FLAGS of C<0> is implemented everywhere.  (Perl emulates the
+system call by remembering the status values of processes that have
+exited but have not been harvested by the Perl script yet.)
+
+Note that on some systems, a return value of C<-1> could mean that child
+processes are being automatically reaped.  See L<perlipc> for details,
+and for other examples.
+
+=item wantarray
+X<wantarray> X<context>
+
+Returns true if the context of the currently executing subroutine or
+C<eval> is looking for a list value.  Returns false if the context is
+looking for a scalar.  Returns the undefined value if the context is
+looking for no value (void context).
+
+    return unless defined wantarray;	# don't bother doing more
+    my @a = complex_calculation();
+    return wantarray ? @a : "@a";
+
+C<wantarray()>'s result is unspecified in the top level of a file,
+in a C<BEGIN>, C<CHECK>, C<INIT> or C<END> block, or in a C<DESTROY>
+method.
+
+This function should have been named wantlist() instead.
+
+=item warn LIST
+X<warn> X<warning> X<STDERR>
+
+Produces a message on STDERR just like C<die>, but doesn't exit or throw
+an exception.
+
+If LIST is empty and C<$@> already contains a value (typically from a
+previous eval) that value is used after appending C<"\t...caught">
+to C<$@>.  This is useful for staying almost, but not entirely similar to
+C<die>.
+
+If C<$@> is empty then the string C<"Warning: Something's wrong"> is used.
+
+No message is printed if there is a C<$SIG{__WARN__}> handler
+installed.  It is the handler's responsibility to deal with the message
+as it sees fit (like, for instance, converting it into a C<die>).  Most
+handlers must therefore make arrangements to actually display the
+warnings that they are not prepared to deal with, by calling C<warn>
+again in the handler.  Note that this is quite safe and will not
+produce an endless loop, since C<__WARN__> hooks are not called from
+inside one.
+
+You will find this behavior is slightly different from that of
+C<$SIG{__DIE__}> handlers (which don't suppress the error text, but can
+instead call C<die> again to change it).
+
+Using a C<__WARN__> handler provides a powerful way to silence all
+warnings (even the so-called mandatory ones).  An example:
+
+    # wipe out *all* compile-time warnings
+    BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] if $DOWARN } }
+    my $foo = 10;
+    my $foo = 20;          # no warning about duplicate my $foo,
+                           # but hey, you asked for it!
+    # no compile-time or run-time warnings before here
+    $DOWARN = 1;
+
+    # run-time warnings enabled after here
+    warn "\$foo is alive and $foo!";     # does show up
+
+See L<perlvar> for details on setting C<%SIG> entries, and for more
+examples.  See the Carp module for other kinds of warnings using its
+carp() and cluck() functions.
+
+=item write FILEHANDLE
+X<write>
+
+=item write EXPR
+
+=item write
+
+Writes a formatted record (possibly multi-line) to the specified FILEHANDLE,
+using the format associated with that file.  By default the format for
+a file is the one having the same name as the filehandle, but the
+format for the current output channel (see the C<select> function) may be set
+explicitly by assigning the name of the format to the C<$~> variable.
+
+Top of form processing is handled automatically:  if there is
+insufficient room on the current page for the formatted record, the
+page is advanced by writing a form feed, a special top-of-page format
+is used to format the new page header, and then the record is written.
+By default the top-of-page format is the name of the filehandle with
+"_TOP" appended, but it may be dynamically set to the format of your
+choice by assigning the name to the C<$^> variable while the filehandle is
+selected.  The number of lines remaining on the current page is in
+variable C<$->, which can be set to C<0> to force a new page.
+
+If FILEHANDLE is unspecified, output goes to the current default output
+channel, which starts out as STDOUT but may be changed by the
+C<select> operator.  If the FILEHANDLE is an EXPR, then the expression
+is evaluated and the resulting string is used to look up the name of
+the FILEHANDLE at run time.  For more on formats, see L<perlform>.
+
+Note that write is I<not> the opposite of C<read>.  Unfortunately.
+
+=item y///
+
+The transliteration operator.  Same as C<tr///>.  See L<perlop>.
+
+=back
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlglossary.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlglossary.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlglossary.pod	(revision 14489)
@@ -0,0 +1,3383 @@
+=head1 NAME
+
+perlglossary - Perl Glossary
+
+=head1 DESCRIPTION
+
+A glossary of terms (technical and otherwise) used in the Perl documentation.
+Other useful sources include the Free On-Line Dictionary of Computing
+L<http://foldoc.doc.ic.ac.uk/foldoc/index.html>, the Jargon File
+L<http://catb.org/~esr/jargon/>, and Wikipedia L<http://www.wikipedia.org/>.
+
+=head2 A
+
+=over 4
+
+=item accessor methods
+
+A L</method> used to indirectly inspect or update an L</object>'s
+state (its L<instance variables|/instance variable>).
+
+=item actual arguments
+
+The L<scalar values|/scalar value> that you supply to a L</function>
+or L</subroutine> when you call it.  For instance, when you call
+C<power("puff")>, the string C<"puff"> is the actual argument.  See
+also L</argument> and L</formal arguments>.
+
+=item address operator
+
+Some languages work directly with the memory addresses of values, but
+this can be like playing with fire.  Perl provides a set of asbestos
+gloves for handling all memory management.  The closest to an address
+operator in Perl is the backslash operator, but it gives you a L</hard
+reference>, which is much safer than a memory address.
+
+=item algorithm
+
+A well-defined sequence of steps, clearly enough explained that even a
+computer could do them.
+
+=item alias
+
+A nickname for something, which behaves in all ways as though you'd
+used the original name instead of the nickname.  Temporary aliases are
+implicitly created in the loop variable for C<foreach> loops, in the
+C<$_> variable for L<map|perlfunc/map> or L<grep|perlfunc/grep>
+operators, in C<$a> and C<$b> during L<sort|perlfunc/sort>'s
+comparison function, and in each element of C<@_> for the L</actual
+arguments> of a subroutine call.  Permanent aliases are explicitly
+created in L<packages|/package> by L<importing|/import> symbols or by
+assignment to L<typeglobs|/typeglob>.  Lexically scoped aliases for
+package variables are explicitly created by the L<our|perlfunc/our>
+declaration.
+
+=item alternatives
+
+A list of possible choices from which you may select only one, as in
+"Would you like door A, B, or C?"  Alternatives in regular expressions
+are separated with a single vertical bar: C<|>.  Alternatives in
+normal Perl expressions are separated with a double vertical bar:
+C<||>.  Logical alternatives in L</Boolean> expressions are separated
+with either C<||> or C<or>.
+
+=item anonymous
+
+Used to describe a L</referent> that is not directly accessible
+through a named L</variable>.  Such a referent must be indirectly
+accessible through at least one L</hard reference>.  When the last
+hard reference goes away, the anonymous referent is destroyed without
+pity.
+
+=item architecture
+
+The kind of computer you're working on, where one "kind" of computer
+means all those computers sharing a compatible machine language.
+Since Perl programs are (typically) simple text files, not executable
+images, a Perl program is much less sensitive to the architecture it's
+running on than programs in other languages, such as C, that are
+compiled into machine code.  See also L</platform> and L</operating
+system>.
+
+=item argument
+
+A piece of data supplied to a L<program|/executable file>,
+L</subroutine>, L</function>, or L</method> to tell it what it's
+supposed to do.  Also called a "parameter".
+
+=item ARGV
+
+The name of the array containing the L</argument> L</vector> from the
+command line.  If you use the empty C<< E<lt>E<gt> >> operator, L</ARGV> is
+the name of both the L</filehandle> used to traverse the arguments and
+the L</scalar> containing the name of the current input file.
+
+=item arithmetical operator
+
+A L</symbol> such as C<+> or C</> that tells Perl to do the arithmetic
+you were supposed to learn in grade school.
+
+=item array
+
+An ordered sequence of L<values|/value>, stored such that you can
+easily access any of the values using an integer L</subscript>
+that specifies the value's L</offset> in the sequence.
+
+=item array context
+
+An archaic expression for what is more correctly referred to as
+L</list context>.
+
+=item ASCII
+
+The American Standard Code for Information Interchange (a 7-bit
+character set adequate only for poorly representing English text).
+Often used loosely to describe the lowest 128 values of the various
+ISO-8859-X character sets, a bunch of mutually incompatible 8-bit
+codes best described as half ASCII.  See also L</Unicode>.
+
+=item assertion
+
+A component of a L</regular expression> that must be true for the
+pattern to match but does not necessarily match any characters itself.
+Often used specifically to mean a L</zero width> assertion.
+
+=item assignment
+
+An L</operator> whose assigned mission in life is to change the value
+of a L</variable>.
+
+=item assignment operator
+
+Either a regular L</assignment>, or a compound L</operator> composed
+of an ordinary assignment and some other operator, that changes the
+value of a variable in place, that is, relative to its old value.  For
+example, C<$a += 2> adds C<2> to C<$a>.
+
+=item associative array
+
+See L</hash>.  Please.
+
+=item associativity
+
+Determines whether you do the left L</operator> first or the right
+L</operator> first when you have "A L</operator> B L</operator> C" and
+the two operators are of the same precedence.  Operators like C<+> are
+left associative, while operators like C<**> are right associative.
+See L<perlop> for a list of operators and their associativity.
+
+=item asynchronous
+
+Said of events or activities whose relative temporal ordering is
+indeterminate because too many things are going on at once.  Hence, an
+asynchronous event is one you didn't know when to expect.
+
+=item atom
+
+A L</regular expression> component potentially matching a
+L</substring> containing one or more characters and treated as an
+indivisible syntactic unit by any following L</quantifier>.  (Contrast
+with an L</assertion> that matches something of L</zero width> and may
+not be quantified.)
+
+=item atomic operation
+
+When Democritus gave the word "atom" to the indivisible bits of
+matter, he meant literally something that could not be cut: I<a->
+(not) + I<tomos> (cuttable).  An atomic operation is an action that
+can't be interrupted, not one forbidden in a nuclear-free zone.
+
+=item attribute
+
+A new feature that allows the declaration of L<variables|/variable>
+and L<subroutines|/subroutine> with modifiers as in C<sub foo : locked
+method>.  Also, another name for an L</instance variable> of an
+L</object>.
+
+=item autogeneration
+
+A feature of L</operator overloading> of L<objects|/object>, whereby
+the behavior of certain L<operators|/operator> can be reasonably
+deduced using more fundamental operators.  This assumes that the
+overloaded operators will often have the same relationships as the
+regular operators.  See L<perlop>.
+
+=item autoincrement
+
+To add one to something automatically, hence the name of the C<++>
+operator.  To instead subtract one from something automatically is
+known as an "autodecrement".
+
+=item autoload
+
+To load on demand.  (Also called "lazy" loading.)  Specifically, to
+call an L<AUTOLOAD|perlsub/Autoloading> subroutine on behalf of an
+undefined subroutine.
+
+=item autosplit
+
+To split a string automatically, as the B<-a> L</switch> does when
+running under B<-p> or B<-n> in order to emulate L</awk>.  (See also
+the L<AutoSplit> module, which has nothing to do with the B<-a>
+switch, but a lot to do with autoloading.)
+
+=item autovivification
+
+A Greco-Roman word meaning "to bring oneself to life".  In Perl,
+storage locations (L<lvalues|/lvalue>) spontaneously generate
+themselves as needed, including the creation of any L</hard reference>
+values to point to the next level of storage.  The assignment
+C<$a[5][5][5][5][5] = "quintet"> potentially creates five scalar
+storage locations, plus four references (in the first four scalar
+locations) pointing to four new anonymous arrays (to hold the last
+four scalar locations).  But the point of autovivification is that you
+don't have to worry about it.
+
+=item AV
+
+Short for "array value", which refers to one of Perl's internal data
+types that holds an L</array>.  The L</AV> type is a subclass of
+L</SV>.
+
+=item awk
+
+Descriptive editing term--short for "awkward".  Also coincidentally
+refers to a venerable text-processing language from which Perl derived
+some of its high-level ideas.
+
+=back
+
+=head2 B
+
+=over 4
+
+=item backreference
+
+A substring L<captured|/capturing> by a subpattern within
+unadorned parentheses in a L</regex>.  Backslashed decimal numbers
+(C<\1>, C<\2>, etc.)  later in the same pattern refer back to the
+corresponding subpattern in the current match.  Outside the pattern,
+the numbered variables (C<$1>, C<$2>, etc.) continue to refer to these
+same values, as long as the pattern was the last successful match of
+the current dynamic scope.
+
+=item backtracking
+
+The practice of saying, "If I had to do it all over, I'd do it
+differently," and then actually going back and doing it all over
+differently.  Mathematically speaking, it's returning from an
+unsuccessful recursion on a tree of possibilities.  Perl backtracks
+when it attempts to match patterns with a L</regular expression>, and
+its earlier attempts don't pan out.  See L<perlre/Backtracking>.
+
+=item backward compatibility
+
+Means you can still run your old program because we didn't break any
+of the features or bugs it was relying on.
+
+=item bareword
+
+A word sufficiently ambiguous to be deemed illegal under L<use strict
+'subs'|strict/strict subs>.  In the absence of that stricture, a
+bareword is treated as if quotes were around it.
+
+=item base class
+
+A generic L</object> type; that is, a L</class> from which other, more
+specific classes are derived genetically by L</inheritance>.  Also
+called a "superclass" by people who respect their ancestors.
+
+=item big-endian
+
+From Swift: someone who eats eggs big end first.  Also used of
+computers that store the most significant L</byte> of a word at a
+lower byte address than the least significant byte.  Often considered
+superior to little-endian machines.  See also L</little-endian>.
+
+=item binary
+
+Having to do with numbers represented in base 2.  That means there's
+basically two numbers, 0 and 1.  Also used to describe a "non-text
+file", presumably because such a file makes full use of all the binary
+bits in its bytes.  With the advent of L</Unicode>, this distinction,
+already suspect, loses even more of its meaning.
+
+=item binary operator
+
+An L</operator> that takes two L<operands|/operand>.
+
+=item bind
+
+To assign a specific L</network address> to a L</socket>.
+
+=item bit
+
+An integer in the range from 0 to 1, inclusive.  The smallest possible
+unit of information storage.  An eighth of a L</byte> or of a dollar.
+(The term "Pieces of Eight" comes from being able to split the old
+Spanish dollar into 8 bits, each of which still counted for money.
+That's why a 25-cent piece today is still "two bits".)
+
+=item bit shift
+
+The movement of bits left or right in a computer word, which has the
+effect of multiplying or dividing by a power of 2.
+
+=item bit string
+
+A sequence of L<bits|/bit> that is actually being thought of as a
+sequence of bits, for once.
+
+=item bless
+
+In corporate life, to grant official approval to a thing, as in, "The
+VP of Engineering has blessed our WebCruncher project." Similarly in
+Perl, to grant official approval to a L</referent> so that it can
+function as an L</object>, such as a WebCruncher object.  See
+L<perlfunc/"bless">.
+
+=item block
+
+What a L</process> does when it has to wait for something: "My process
+blocked waiting for the disk."  As an unrelated noun, it refers to a
+large chunk of data, of a size that the L</operating system> likes to
+deal with (normally a power of two such as 512 or 8192).  Typically
+refers to a chunk of data that's coming from or going to a disk file.
+
+=item BLOCK
+
+A syntactic construct consisting of a sequence of Perl
+L<statements|/statement> that is delimited by braces.  The C<if> and
+C<while> statements are defined in terms of L<BLOCKs|/BLOCK>, for instance.
+Sometimes we also say "block" to mean a lexical scope; that is, a
+sequence of statements that act like a L</BLOCK>, such as within an
+L<eval|perlfunc/eval> or a file, even though the statements aren't
+delimited by braces.
+
+=item block buffering
+
+A method of making input and output efficient by passing one L</block>
+at a time.  By default, Perl does block buffering to disk files.  See
+L</buffer> and L</command buffering>.
+
+=item Boolean
+
+A value that is either L</true> or L</false>.
+
+=item Boolean context
+
+A special kind of L</scalar context> used in conditionals to decide
+whether the L</scalar value> returned by an expression is L</true> or
+L</false>.  Does not evaluate as either a string or a number.  See
+L</context>.
+
+=item breakpoint
+
+A spot in your program where you've told the debugger to stop
+L<execution|/execute> so you can poke around and see whether anything
+is wrong yet.
+
+=item broadcast
+
+To send a L</datagram> to multiple destinations simultaneously.
+
+=item BSD
+
+A psychoactive drug, popular in the 80s, probably developed at
+U. C. Berkeley or thereabouts.  Similar in many ways to the
+prescription-only medication called "System V", but infinitely more
+useful.  (Or, at least, more fun.)  The full chemical name is
+"Berkeley Standard Distribution".
+
+=item bucket
+
+A location in a L</hash table> containing (potentially) multiple
+entries whose keys "hash" to the same hash value according to its hash
+function.  (As internal policy, you don't have to worry about it,
+unless you're into internals, or policy.)
+
+=item buffer
+
+A temporary holding location for data.  L<Block buffering|/block
+buffering> means that the data is passed on to its destination
+whenever the buffer is full.  L<Line buffering|/line buffering> means
+that it's passed on whenever a complete line is received.  L<Command
+buffering|/command buffering> means that it's passed every time you do
+a L<print|perlfunc/print> command (or equivalent).  If your output is
+unbuffered, the system processes it one byte at a time without the use
+of a holding area.  This can be rather inefficient.
+
+=item built-in
+
+A L</function> that is predefined in the language.  Even when hidden
+by L</overriding>, you can always get at a built-in function by
+L<qualifying|/qualified> its name with the C<CORE::> pseudo-package.
+
+=item bundle
+
+A group of related modules on L</CPAN>.  (Also, sometimes refers to a
+group of command-line switches grouped into one L</switch cluster>.)
+
+=item byte
+
+A piece of data worth eight L<bits|/bit> in most places.
+
+=item bytecode
+
+A pidgin-like language spoken among 'droids when they don't wish to
+reveal their orientation (see L</endian>).  Named after some similar
+languages spoken (for similar reasons) between compilers and
+interpreters in the late 20th century.  These languages are
+characterized by representing everything as a
+non-architecture-dependent sequence of bytes.
+
+=back
+
+=head2 C
+
+=over 4
+
+=item C
+
+A language beloved by many for its inside-out L</type> definitions,
+inscrutable L</precedence> rules, and heavy L</overloading> of the
+function-call mechanism.  (Well, actually, people first switched to C
+because they found lowercase identifiers easier to read than upper.)
+Perl is written in C, so it's not surprising that Perl borrowed a few
+ideas from it.
+
+=item C preprocessor
+
+The typical C compiler's first pass, which processes lines beginning
+with C<#> for conditional compilation and macro definition and does
+various manipulations of the program text based on the current
+definitions.  Also known as I<cpp>(1).
+
+=item call by reference
+
+An L</argument>-passing mechanism in which the L</formal arguments>
+refer directly to the L</actual arguments>, and the L</subroutine> can
+change the actual arguments by changing the formal arguments.  That
+is, the formal argument is an L</alias> for the actual argument.  See
+also L</call by value>.
+
+=item call by value
+
+An L</argument>-passing mechanism in which the L</formal arguments>
+refer to a copy of the L</actual arguments>, and the L</subroutine>
+cannot change the actual arguments by changing the formal arguments.
+See also L</call by reference>.
+
+=item callback
+
+A L</handler> that you register with some other part of your program
+in the hope that the other part of your program will L</trigger> your
+handler when some event of interest transpires.
+
+=item canonical
+
+Reduced to a standard form to facilitate comparison.
+
+=item capturing
+
+The use of parentheses around a L</subpattern> in a L</regular
+expression> to store the matched L</substring> as a L</backreference>.
+(Captured strings are also returned as a list in L</list context>.)
+
+=item character
+
+A small integer representative of a unit of orthography.
+Historically, characters were usually stored as fixed-width integers
+(typically in a byte, or maybe two, depending on the character set),
+but with the advent of UTF-8, characters are often stored in a
+variable number of bytes depending on the size of the integer that
+represents the character.  Perl manages this transparently for you,
+for the most part.
+
+=item character class
+
+A square-bracketed list of characters used in a L</regular expression>
+to indicate that any character of the set may occur at a given point.
+Loosely, any predefined set of characters so used.
+
+=item character property
+
+A predefined L</character class> matchable by the C<\p>
+L</metasymbol>.  Many standard properties are defined for L</Unicode>.
+
+=item circumfix operator
+
+An L</operator> that surrounds its L</operand>, like the angle
+operator, or parentheses, or a hug.
+
+=item class
+
+A user-defined L</type>, implemented in Perl via a L</package> that
+provides (either directly or by inheritance) L<methods|/method> (that
+is, L<subroutines|/subroutine>) to handle L<instances|/instance> of
+the class (its L<objects|/object>).  See also L</inheritance>.
+
+=item class method
+
+A L</method> whose L</invocant> is a L</package> name, not an
+L</object> reference.  A method associated with the class as a whole.
+
+=item client
+
+In networking, a L</process> that initiates contact with a L</server>
+process in order to exchange data and perhaps receive a service.
+
+=item cloister
+
+A L</cluster> used to restrict the scope of a L</regular expression
+modifier>.
+
+=item closure
+
+An L</anonymous> subroutine that, when a reference to it is generated
+at run time, keeps track of the identities of externally visible
+L<lexical variables|/lexical variable> even after those lexical
+variables have supposedly gone out of L</scope>.  They're called
+"closures" because this sort of behavior gives mathematicians a sense
+of closure.
+
+=item cluster
+
+A parenthesized L</subpattern> used to group parts of a L</regular
+expression> into a single L</atom>.
+
+=item CODE
+
+The word returned by the L<ref|perlfunc/ref> function when you apply
+it to a reference to a subroutine.  See also L</CV>.
+
+=item code generator
+
+A system that writes code for you in a low-level language, such as
+code to implement the backend of a compiler.  See L</program
+generator>.
+
+=item code subpattern
+
+A L</regular expression> subpattern whose real purpose is to execute
+some Perl code, for example, the C<(?{...})> and C<(??{...})>
+subpatterns.
+
+=item collating sequence
+
+The order into which L<characters|/character> sort.  This is used by
+L</string> comparison routines to decide, for example, where in this
+glossary to put "collating sequence".
+
+=item command
+
+In L</shell> programming, the syntactic combination of a program name
+and its arguments.  More loosely, anything you type to a shell (a
+command interpreter) that starts it doing something.  Even more
+loosely, a Perl L</statement>, which might start with a L</label> and
+typically ends with a semicolon.
+
+=item command buffering
+
+A mechanism in Perl that lets you store up the output of each Perl
+L</command> and then flush it out as a single request to the
+L</operating system>.  It's enabled by setting the C<$|>
+(C<$AUTOFLUSH>) variable to a true value.  It's used when you don't
+want data sitting around not going where it's supposed to, which may
+happen because the default on a L</file> or L</pipe> is to use
+L</block buffering>.
+
+=item command name
+
+The name of the program currently executing, as typed on the command
+line.  In C, the L</command> name is passed to the program as the
+first command-line argument.  In Perl, it comes in separately as
+C<$0>.
+
+=item command-line arguments
+
+The L<values|/value> you supply along with a program name when you
+tell a L</shell> to execute a L</command>.  These values are passed to
+a Perl program through C<@ARGV>.
+
+=item comment
+
+A remark that doesn't affect the meaning of the program.  In Perl, a
+comment is introduced by a C<#> character and continues to the end of
+the line.
+
+=item compilation unit
+
+The L</file> (or L</string>, in the case of L<eval|perlfunc/eval>)
+that is currently being compiled.
+
+=item compile phase
+
+Any time before Perl starts running your main program.  See also
+L</run phase>.  Compile phase is mostly spent in L</compile time>, but
+may also be spent in L</run time> when C<BEGIN> blocks,
+L<use|perlfunc/use> declarations, or constant subexpressions are being
+evaluated.  The startup and import code of any L<use|perlfunc/use>
+declaration is also run during compile phase.
+
+=item compile time
+
+The time when Perl is trying to make sense of your code, as opposed to
+when it thinks it knows what your code means and is merely trying to
+do what it thinks your code says to do, which is L</run time>.
+
+=item compiler
+
+Strictly speaking, a program that munches up another program and spits
+out yet another file containing the program in a "more executable"
+form, typically containing native machine instructions.  The I<perl>
+program is not a compiler by this definition, but it does contain a
+kind of compiler that takes a program and turns it into a more
+executable form (L<syntax trees|/syntax tree>) within the I<perl>
+process itself, which the L</interpreter> then interprets.  There are,
+however, extension L<modules|/module> to get Perl to act more like a
+"real" compiler.  See L<O>.
+
+=item composer
+
+A "constructor" for a L</referent> that isn't really an L</object>,
+like an anonymous array or a hash (or a sonata, for that matter).  For
+example, a pair of braces acts as a composer for a hash, and a pair of
+brackets acts as a composer for an array.  See L<perlref/Making
+References>.
+
+=item concatenation
+
+The process of gluing one cat's nose to another cat's tail.  Also, a
+similar operation on two L<strings|/string>.
+
+=item conditional
+
+Something "iffy".  See L</Boolean context>.
+
+=item connection
+
+In telephony, the temporary electrical circuit between the caller's
+and the callee's phone.  In networking, the same kind of temporary
+circuit between a L</client> and a L</server>.
+
+=item construct
+
+As a noun, a piece of syntax made up of smaller pieces.  As a
+transitive verb, to create an L</object> using a L</constructor>.
+
+=item constructor
+
+Any L</class method>, instance L</method>, or L</subroutine>
+that composes, initializes, blesses, and returns an L</object>.
+Sometimes we use the term loosely to mean a L</composer>.
+
+=item context
+
+The surroundings, or environment.  The context given by the
+surrounding code determines what kind of data a particular
+L</expression> is expected to return.  The three primary contexts are
+L</list context>, L</scalar context>, and L</void context>.  Scalar
+context is sometimes subdivided into L</Boolean context>, L</numeric
+context>, L</string context>, and L</void context>.  There's also a
+"don't care" scalar context (which is dealt with in Programming Perl,
+Third Edition, Chapter 2, "Bits and Pieces" if you care).
+
+=item continuation
+
+The treatment of more than one physical L</line> as a single logical
+line.  L</Makefile> lines are continued by putting a backslash before
+the L</newline>.  Mail headers as defined by RFC 822 are continued by
+putting a space or tab I<after> the newline.  In general, lines in
+Perl do not need any form of continuation mark, because L</whitespace>
+(including newlines) is gleefully ignored.  Usually.
+
+=item core dump
+
+The corpse of a L</process>, in the form of a file left in the
+L</working directory> of the process, usually as a result of certain
+kinds of fatal error.
+
+=item CPAN
+
+The Comprehensive Perl Archive Network.  (See L<perlfaq2/What modules and extensions are available for Perl?  What is CPAN?  What does CPANE<sol>srcE<sol>... mean?>).
+
+=item cracker
+
+Someone who breaks security on computer systems.  A cracker may be a
+true L</hacker> or only a L</script kiddie>.
+
+=item current package
+
+The L</package> in which the current statement is compiled.  Scan
+backwards in the text of your program through the current L<lexical
+scope|/lexical scoping> or any enclosing lexical scopes till you find
+a package declaration.  That's your current package name.
+
+=item current working directory
+
+See L</working directory>.
+
+=item currently selected output channel
+
+The last L</filehandle> that was designated with
+L<select|perlfunc/select>(C<FILEHANDLE>); L</STDOUT>, if no filehandle
+has been selected.
+
+=item CV
+
+An internal "code value" typedef, holding a L</subroutine>.  The L</CV>
+type is a subclass of L</SV>.
+
+=back
+
+=head2 D
+
+=over 4
+
+=item dangling statement
+
+A bare, single L</statement>, without any braces, hanging off an C<if>
+or C<while> conditional.  C allows them.  Perl doesn't.
+
+=item data structure
+
+How your various pieces of data relate to each other and what shape
+they make when you put them all together, as in a rectangular table or
+a triangular-shaped tree.
+
+=item data type
+
+A set of possible values, together with all the operations that know
+how to deal with those values.  For example, a numeric data type has a
+certain set of numbers that you can work with and various mathematical
+operations that you can do on the numbers but would make little sense
+on, say, a string such as C<"Kilroy">.  Strings have their own
+operations, such as L</concatenation>.  Compound types made of a
+number of smaller pieces generally have operations to compose and
+decompose them, and perhaps to rearrange them.  L<Objects|/object>
+that model things in the real world often have operations that
+correspond to real activities.  For instance, if you model an
+elevator, your elevator object might have an C<open_door()>
+L</method>.
+
+=item datagram
+
+A packet of data, such as a L</UDP> message, that (from the viewpoint
+of the programs involved) can be sent independently over the network.
+(In fact, all packets are sent independently at the L</IP> level, but
+L</stream> protocols such as L</TCP> hide this from your program.)
+
+=item DBM
+
+Stands for "Data Base Management" routines, a set of routines that
+emulate an L</associative array> using disk files.  The routines use a
+dynamic hashing scheme to locate any entry with only two disk
+accesses.  DBM files allow a Perl program to keep a persistent
+L</hash> across multiple invocations.  You can L<tie|perlfunc/tie>
+your hash variables to various DBM implementations--see L<AnyDBM_File>
+and L<DB_File>.
+
+=item declaration
+
+An L</assertion> that states something exists and perhaps describes
+what it's like, without giving any commitment as to how or where
+you'll use it.  A declaration is like the part of your recipe that
+says, "two cups flour, one large egg, four or five tadpoles..."  See
+L</statement> for its opposite.  Note that some declarations also
+function as statements.  Subroutine declarations also act as
+definitions if a body is supplied.
+
+=item decrement
+
+To subtract a value from a variable, as in "decrement C<$x>" (meaning
+to remove 1 from its value) or "decrement C<$x> by 3".
+
+=item default
+
+A L</value> chosen for you if you don't supply a value of your own.
+
+=item defined
+
+Having a meaning.  Perl thinks that some of the things people try to
+do are devoid of meaning, in particular, making use of variables that
+have never been given a L</value> and performing certain operations on
+data that isn't there.  For example, if you try to read data past the
+end of a file, Perl will hand you back an undefined value.  See also
+L</false> and L<perlfunc/defined>.
+
+=item delimiter
+
+A L</character> or L</string> that sets bounds to an arbitrarily-sized
+textual object, not to be confused with a L</separator> or
+L</terminator>.  "To delimit" really just means "to surround" or "to
+enclose" (like these parentheses are doing).
+
+=item dereference
+
+A fancy computer science term meaning "to follow a L</reference> to
+what it points to".  The "de" part of it refers to the fact that
+you're taking away one level of L</indirection>.
+
+=item derived class
+
+A L</class> that defines some of its L<methods|/method> in terms of a
+more generic class, called a L</base class>.  Note that classes aren't
+classified exclusively into base classes or derived classes: a class
+can function as both a derived class and a base class simultaneously,
+which is kind of classy.
+
+=item descriptor
+
+See L</file descriptor>.
+
+=item destroy
+
+To deallocate the memory of a L</referent> (first triggering its
+C<DESTROY> method, if it has one).
+
+=item destructor
+
+A special L</method> that is called when an L</object> is thinking
+about L<destroying|/destroy> itself.  A Perl program's C<DESTROY>
+method doesn't do the actual destruction; Perl just
+L<triggers|/trigger> the method in case the L</class> wants to do any
+associated cleanup.
+
+=item device
+
+A whiz-bang hardware gizmo (like a disk or tape drive or a modem or a
+joystick or a mouse) attached to your computer, that the L</operating
+system> tries to make look like a L</file> (or a bunch of files).
+Under Unix, these fake files tend to live in the I</dev> directory.
+
+=item directive
+
+A L</pod> directive.  See L<perlpod>.
+
+=item directory
+
+A special file that contains other files.  Some L<operating
+systems|/operating system> call these "folders", "drawers", or
+"catalogs".
+
+=item directory handle
+
+A name that represents a particular instance of opening a directory to
+read it, until you close it.  See the L<opendir|perlfunc/opendir>
+function.
+
+=item dispatch
+
+To send something to its correct destination.  Often used
+metaphorically to indicate a transfer of programmatic control to a
+destination selected algorithmically, often by lookup in a table of
+function L<references|/reference> or, in the case of object
+L<methods|/method>, by traversing the inheritance tree looking for the
+most specific definition for the method.
+
+=item distribution
+
+A standard, bundled release of a system of software.  The default
+usage implies source code is included.  If that is not the case, it
+will be called a "binary-only" distribution.
+
+=item dweomer
+
+An enchantment, illusion, phantasm, or jugglery.  Said when Perl's
+magical L</dwimmer> effects don't do what you expect, but rather seem
+to be the product of arcane dweomercraft, sorcery, or wonder working.
+[From Old English]
+
+=item dwimmer
+
+DWIM is an acronym for "Do What I Mean", the principle that something
+should just do what you want it to do without an undue amount of fuss.
+A bit of code that does "dwimming" is a "dwimmer".  Dwimming can
+require a great deal of behind-the-scenes magic, which (if it doesn't
+stay properly behind the scenes) is called a L</dweomer> instead.
+
+=item dynamic scoping
+
+Dynamic scoping works over a dynamic scope, making variables visible
+throughout the rest of the L</block> in which they are first used and
+in any L<subroutines|/subroutine> that are called by the rest of the
+block.  Dynamically scoped variables can have their values temporarily
+changed (and implicitly restored later) by a L<local|perlfunc/local>
+operator.  (Compare L</lexical scoping>.)  Used more loosely to mean
+how a subroutine that is in the middle of calling another subroutine
+"contains" that subroutine at L</run time>.
+
+=back
+
+=head2 E
+
+=over 4
+
+=item eclectic
+
+Derived from many sources.  Some would say I<too> many.
+
+=item element
+
+A basic building block.  When you're talking about an L</array>, it's
+one of the items that make up the array.
+
+=item embedding
+
+When something is contained in something else, particularly when that
+might be considered surprising: "I've embedded a complete Perl
+interpreter in my editor!"
+
+=item empty subclass test
+
+The notion that an empty L</derived class> should behave exactly like
+its L</base class>.
+
+=item en passant
+
+When you change a L</value> as it is being copied.  [From French, "in
+passing", as in the exotic pawn-capturing maneuver in chess.]
+
+=item encapsulation
+
+The veil of abstraction separating the L</interface> from the
+L</implementation> (whether enforced or not), which mandates that all
+access to an L</object>'s state be through L<methods|/method> alone.
+
+=item endian
+
+See L</little-endian> and L</big-endian>.
+
+=item environment
+
+The collective set of L<environment variables|/environment variable>
+your L</process> inherits from its parent.  Accessed via C<%ENV>.
+
+=item environment variable
+
+A mechanism by which some high-level agent such as a user can pass its
+preferences down to its future offspring (child L<processes|/process>,
+grandchild processes, great-grandchild processes, and so on).  Each
+environment variable is a L</key>/L</value> pair, like one entry in a
+L</hash>.
+
+=item EOF
+
+End of File.  Sometimes used metaphorically as the terminating string
+of a L</here document>.
+
+=item errno
+
+The error number returned by a L</syscall> when it fails.  Perl refers
+to the error by the name C<$!> (or C<$OS_ERROR> if you use the English
+module).
+
+=item error
+
+See L</exception> or L</fatal error>.
+
+=item escape sequence
+
+See L</metasymbol>.
+
+=item exception
+
+A fancy term for an error.  See L</fatal error>.
+
+=item exception handling
+
+The way a program responds to an error.  The exception handling
+mechanism in Perl is the L<eval|perlfunc/eval> operator.
+
+=item exec
+
+To throw away the current L</process>'s program and replace it with
+another without exiting the process or relinquishing any resources
+held (apart from the old memory image).
+
+=item executable file
+
+A L</file> that is specially marked to tell the L</operating system>
+that it's okay to run this file as a program.  Usually shortened to
+"executable".
+
+=item execute
+
+To run a L<program|/executable file> or L</subroutine>.  (Has nothing
+to do with the L<kill|perlfunc/kill> built-in, unless you're trying to
+run a L</signal handler>.)
+
+=item execute bit
+
+The special mark that tells the operating system it can run this
+program.  There are actually three execute bits under Unix, and which
+bit gets used depends on whether you own the file singularly,
+collectively, or not at all.
+
+=item exit status
+
+See L</status>.
+
+=item export
+
+To make symbols from a L</module> available for L</import> by other modules.
+
+=item expression
+
+Anything you can legally say in a spot where a L</value> is required.
+Typically composed of L<literals|/literal>, L<variables|/variable>,
+L<operators|/operator>, L<functions|/function>, and L</subroutine>
+calls, not necessarily in that order.
+
+=item extension
+
+A Perl module that also pulls in compiled C or C++ code.  More
+generally, any experimental option that can be compiled into Perl,
+such as multithreading.
+
+=back
+
+=head2 F
+
+=over 4
+
+=item false
+
+In Perl, any value that would look like C<""> or C<"0"> if evaluated
+in a string context.  Since undefined values evaluate to C<"">, all
+undefined values are false, but not all false values are undefined.
+
+=item FAQ
+
+Frequently Asked Question (although not necessarily frequently
+answered, especially if the answer appears in the Perl FAQ shipped
+standard with Perl).
+
+=item fatal error
+
+An uncaught L</exception>, which causes termination of the L</process>
+after printing a message on your L</standard error> stream.  Errors
+that happen inside an L<eval|perlfunc/eval> are not fatal.  Instead,
+the L<eval|perlfunc/eval> terminates after placing the exception
+message in the C<$@> (C<$EVAL_ERROR>) variable.  You can try to
+provoke a fatal error with the L<die|perlfunc/die> operator (known as
+throwing or raising an exception), but this may be caught by a
+dynamically enclosing L<eval|perlfunc/eval>.  If not caught, the
+L<die|perlfunc/die> becomes a fatal error.
+
+=item field
+
+A single piece of numeric or string data that is part of a longer
+L</string>, L</record>, or L</line>.  Variable-width fields are usually
+split up by L<separators|/separator> (so use L<split|perlfunc/split> to
+extract the fields), while fixed-width fields are usually at fixed
+positions (so use L<unpack|perlfunc/unpack>).  L<Instance
+variables|/instance variable> are also known as fields.
+
+=item FIFO
+
+First In, First Out.  See also L</LIFO>.  Also, a nickname for a
+L</named pipe>.
+
+=item file
+
+A named collection of data, usually stored on disk in a L</directory>
+in a L</filesystem>.  Roughly like a document, if you're into office
+metaphors.  In modern filesystems, you can actually give a file more
+than one name.  Some files have special properties, like directories
+and devices.
+
+=item file descriptor
+
+The little number the L</operating system> uses to keep track of which
+opened L</file> you're talking about.  Perl hides the file descriptor
+inside a L</standard IE<sol>O> stream and then attaches the stream to
+a L</filehandle>.
+
+=item file test operator
+
+A built-in unary operator that you use to determine whether something
+is L</true> about a file, such as C<-o $filename> to test whether
+you're the owner of the file.
+
+=item fileglob
+
+A "wildcard" match on L<filenames|/filename>.  See the
+L<glob|perlfunc/glob> function.
+
+=item filehandle
+
+An identifier (not necessarily related to the real name of a file)
+that represents a particular instance of opening a file until you
+close it.  If you're going to open and close several different files
+in succession, it's fine to open each of them with the same
+filehandle, so you don't have to write out separate code to process
+each file.
+
+=item filename
+
+One name for a file.  This name is listed in a L</directory>, and you
+can use it in an L<open|perlfunc/open> to tell the L</operating
+system> exactly which file you want to open, and associate the file
+with a L</filehandle> which will carry the subsequent identity of that
+file in your program, until you close it.
+
+=item filesystem
+
+A set of L<directories|/directory> and L<files|/file> residing on a
+partition of the disk.  Sometimes known as a "partition".  You can
+change the file's name or even move a file around from directory to
+directory within a filesystem without actually moving the file itself,
+at least under Unix.
+
+=item filter
+
+A program designed to take a L</stream> of input and transform it into
+a stream of output.
+
+=item flag
+
+We tend to avoid this term because it means so many things.  It may
+mean a command-line L</switch> that takes no argument
+itself (such as Perl's B<-n> and B<-p>
+flags) or, less frequently, a single-bit indicator (such as the
+C<O_CREAT> and C<O_EXCL> flags used in
+L<sysopen|perlfunc/sysopen>).
+
+=item floating point
+
+A method of storing numbers in "scientific notation", such that the
+precision of the number is independent of its magnitude (the decimal
+point "floats").  Perl does its numeric work with floating-point
+numbers (sometimes called "floats"), when it can't get away with
+using L<integers|/integer>.  Floating-point numbers are mere
+approximations of real numbers.
+
+=item flush
+
+The act of emptying a L</buffer>, often before it's full.
+
+=item FMTEYEWTK
+
+Far More Than Everything You Ever Wanted To Know.  An exhaustive
+treatise on one narrow topic, something of a super-L</FAQ>.  See Tom
+for far more.
+
+=item fork
+
+To create a child L</process> identical to the parent process at its
+moment of conception, at least until it gets ideas of its own.  A
+thread with protected memory.
+
+=item formal arguments
+
+The generic names by which a L</subroutine> knows its
+L<arguments|/argument>.  In many languages, formal arguments are
+always given individual names, but in Perl, the formal arguments are
+just the elements of an array.  The formal arguments to a Perl program
+are C<$ARGV[0]>, C<$ARGV[1]>, and so on.  Similarly, the formal
+arguments to a Perl subroutine are C<$_[0]>, C<$_[1]>, and so on.  You
+may give the arguments individual names by assigning the values to a
+L<my|perlfunc/my> list.  See also L</actual arguments>.
+
+=item format
+
+A specification of how many spaces and digits and things to put
+somewhere so that whatever you're printing comes out nice and pretty.
+
+=item freely available
+
+Means you don't have to pay money to get it, but the copyright on it
+may still belong to someone else (like Larry).
+
+=item freely redistributable
+
+Means you're not in legal trouble if you give a bootleg copy of it to
+your friends and we find out about it.  In fact, we'd rather you gave
+a copy to all your friends.
+
+=item freeware
+
+Historically, any software that you give away, particularly if you
+make the source code available as well.  Now often called C<open
+source software>.  Recently there has been a trend to use the term in
+contradistinction to L</open source software>, to refer only to free
+software released under the Free Software Foundation's GPL (General
+Public License), but this is difficult to justify etymologically.
+
+=item function
+
+Mathematically, a mapping of each of a set of input values to a
+particular output value.  In computers, refers to a L</subroutine> or
+L</operator> that returns a L</value>.  It may or may not have input
+values (called L<arguments|/argument>).
+
+=item funny character
+
+Someone like Larry, or one of his peculiar friends.  Also refers to
+the strange prefixes that Perl requires as noun markers on its
+variables.
+
+=item garbage collection
+
+A misnamed feature--it should be called, "expecting your mother to
+pick up after you".  Strictly speaking, Perl doesn't do this, but it
+relies on a reference-counting mechanism to keep things tidy.
+However, we rarely speak strictly and will often refer to the
+reference-counting scheme as a form of garbage collection.  (If it's
+any comfort, when your interpreter exits, a "real" garbage collector
+runs to make sure everything is cleaned up if you've been messy with
+circular references and such.)
+
+=back
+
+=head2 G
+
+=over 4
+
+=item GID
+
+Group ID--in Unix, the numeric group ID that the L</operating system>
+uses to identify you and members of your L</group>.
+
+=item glob
+
+Strictly, the shell's C<*> character, which will match a "glob" of
+characters when you're trying to generate a list of filenames.
+Loosely, the act of using globs and similar symbols to do pattern
+matching.  See also L</fileglob> and L</typeglob>.
+
+=item global
+
+Something you can see from anywhere, usually used of
+L<variables|/variable> and L<subroutines|/subroutine> that are visible
+everywhere in your program.  In Perl, only certain special variables
+are truly global--most variables (and all subroutines) exist only in
+the current L</package>.  Global variables can be declared with
+L<our|perlfunc/our>.  See L<perlfunc/our>.
+
+=item global destruction
+
+The L</garbage collection> of globals (and the running of any
+associated object destructors) that takes place when a Perl
+L</interpreter> is being shut down.  Global destruction should not be
+confused with the Apocalypse, except perhaps when it should.
+
+=item glue language
+
+A language such as Perl that is good at hooking things together that
+weren't intended to be hooked together.
+
+=item granularity
+
+The size of the pieces you're dealing with, mentally speaking.
+
+=item greedy
+
+A L</subpattern> whose L</quantifier> wants to match as many things as
+possible.
+
+=item grep
+
+Originally from the old Unix editor command for "Globally search for a
+Regular Expression and Print it", now used in the general sense of any
+kind of search, especially text searches.  Perl has a built-in
+L<grep|perlfunc/grep> function that searches a list for elements
+matching any given criterion, whereas the I<grep>(1) program searches
+for lines matching a L</regular expression> in one or more files.
+
+=item group
+
+A set of users of which you are a member.  In some operating systems
+(like Unix), you can give certain file access permissions to other
+members of your group.
+
+=item GV
+
+An internal "glob value" typedef, holding a L</typeglob>.  The L</GV>
+type is a subclass of L</SV>.
+
+=back
+
+=head2 H
+
+=over 4
+
+=item hacker
+
+Someone who is brilliantly persistent in solving technical problems,
+whether these involve golfing, fighting orcs, or programming.  Hacker
+is a neutral term, morally speaking.  Good hackers are not to be
+confused with evil L<crackers|/cracker> or clueless L<script
+kiddies|/script kiddie>.  If you confuse them, we will presume that
+you are either evil or clueless.
+
+=item handler
+
+A L</subroutine> or L</method> that is called by Perl when your
+program needs to respond to some internal event, such as a L</signal>,
+or an encounter with an operator subject to L</operator overloading>.
+See also L</callback>.
+
+=item hard reference
+
+A L</scalar> L</value> containing the actual address of a
+L</referent>, such that the referent's L</reference> count accounts
+for it.  (Some hard references are held internally, such as the
+implicit reference from one of a L</typeglob>'s variable slots to its
+corresponding referent.)  A hard reference is different from a
+L</symbolic reference>.
+
+=item hash
+
+An unordered association of L</key>/L</value> pairs, stored such that
+you can easily use a string L</key> to look up its associated data
+L</value>.  This glossary is like a hash, where the word to be defined
+is the key, and the definition is the value.  A hash is also sometimes
+septisyllabically called an "associative array", which is a pretty
+good reason for simply calling it a "hash" instead.
+
+=item hash table
+
+A data structure used internally by Perl for implementing associative
+arrays (hashes) efficiently.  See also L</bucket>.
+
+=item header file
+
+A file containing certain required definitions that you must include
+"ahead" of the rest of your program to do certain obscure operations.
+A C header file has a I<.h> extension.  Perl doesn't really have
+header files, though historically Perl has sometimes used translated
+I<.h> files with a I<.ph> extension.  See L<perlfunc/require>.
+(Header files have been superseded by the L</module> mechanism.)
+
+=item here document
+
+So called because of a similar construct in L<shells|/shell> that
+pretends that the L<lines|/line> following the L</command> are a
+separate L</file> to be fed to the command, up to some terminating
+string.  In Perl, however, it's just a fancy form of quoting.
+
+=item hexadecimal
+
+A number in base 16, "hex" for short.  The digits for 10 through 16
+are customarily represented by the letters C<a> through C<f>.
+Hexadecimal constants in Perl start with C<0x>.  See also
+L<perlfunc/hex>.
+
+=item home directory
+
+The directory you are put into when you log in.  On a Unix system, the
+name is often placed into C<$ENV{HOME}> or C<$ENV{LOGDIR}> by
+I<login>, but you can also find it with C<(getpwuid($E<lt>))[7]>.
+(Some platforms do not have a concept of a home directory.)
+
+=item host
+
+The computer on which a program or other data resides.
+
+=item hubris
+
+Excessive pride, the sort of thing Zeus zaps you for.  Also the
+quality that makes you write (and maintain) programs that other people
+won't want to say bad things about.  Hence, the third great virtue of
+a programmer.  See also L</laziness> and L</impatience>.
+
+=item HV
+
+Short for a "hash value" typedef, which holds Perl's internal
+representation of a hash.  The L</HV> type is a subclass of L</SV>.
+
+=back
+
+=head2 I
+
+=over 4
+
+=item identifier
+
+A legally formed name for most anything in which a computer program
+might be interested.  Many languages (including Perl) allow
+identifiers that start with a letter and contain letters and digits.
+Perl also counts the underscore character as a valid letter.  (Perl
+also has more complicated names, such as L</qualified> names.)
+
+=item impatience
+
+The anger you feel when the computer is being lazy.  This makes you
+write programs that don't just react to your needs, but actually
+anticipate them.  Or at least that pretend to.  Hence, the second
+great virtue of a programmer.  See also L</laziness> and L</hubris>.
+
+=item implementation
+
+How a piece of code actually goes about doing its job.  Users of the
+code should not count on implementation details staying the same
+unless they are part of the published L</interface>.
+
+=item import
+
+To gain access to symbols that are exported from another module.  See
+L<perlfunc/use>.
+
+=item increment
+
+To increase the value of something by 1 (or by some other number, if
+so specified).
+
+=item indexing
+
+In olden days, the act of looking up a L</key> in an actual index
+(such as a phone book), but now merely the act of using any kind of
+key or position to find the corresponding L</value>, even if no index
+is involved.  Things have degenerated to the point that Perl's
+L<index|perlfunc/index> function merely locates the position (index)
+of one string in another.
+
+=item indirect filehandle
+
+An L</expression> that evaluates to something that can be used as a
+L</filehandle>: a L</string> (filehandle name), a L</typeglob>, a
+typeglob L</reference>, or a low-level L</IO> object.
+
+=item indirect object
+
+In English grammar, a short noun phrase between a verb and its direct
+object indicating the beneficiary or recipient of the action.  In
+Perl, C<print STDOUT "$foo\n";> can be understood as "verb
+indirect-object object" where L</STDOUT> is the recipient of the
+L<print|perlfunc/print> action, and C<"$foo"> is the object being
+printed.  Similarly, when invoking a L</method>, you might place the
+invocant between the method and its arguments:
+
+  $gollum = new Pathetic::Creature "Smeagol";
+  give $gollum "Fisssssh!";
+  give $gollum "Precious!";
+
+=item indirect object slot
+
+The syntactic position falling between a method call and its arguments
+when using the indirect object invocation syntax.  (The slot is
+distinguished by the absence of a comma between it and the next
+argument.) L</STDERR> is in the indirect object slot here:
+
+  print STDERR "Awake!  Awake!  Fear, Fire,
+      Foes!  Awake!\n";
+
+=item indirection
+
+If something in a program isn't the value you're looking for but
+indicates where the value is, that's indirection.  This can be done
+with either L<symbolic references|/symbolic reference> or L<hard
+references|/hard reference>.
+
+=item infix
+
+An L</operator> that comes in between its L<operands|/operand>, such
+as multiplication in C<24 * 7>.
+
+=item inheritance
+
+What you get from your ancestors, genetically or otherwise.  If you
+happen to be a L</class>, your ancestors are called L<base
+classes|/base class> and your descendants are called L<derived
+classes|/derived class>.  See L</single inheritance> and L</multiple
+inheritance>.
+
+=item instance
+
+Short for "an instance of a class", meaning an L</object> of that L</class>.
+
+=item instance variable
+
+An L</attribute> of an L</object>; data stored with the particular
+object rather than with the class as a whole.
+
+=item integer
+
+A number with no fractional (decimal) part.  A counting number, like
+1, 2, 3, and so on, but including 0 and the negatives.
+
+=item interface
+
+The services a piece of code promises to provide forever, in contrast to
+its L</implementation>, which it should feel free to change whenever it
+likes.
+
+=item interpolation
+
+The insertion of a scalar or list value somewhere in the middle of
+another value, such that it appears to have been there all along.  In
+Perl, variable interpolation happens in double-quoted strings and
+patterns, and list interpolation occurs when constructing the list of
+values to pass to a list operator or other such construct that takes a
+L</LIST>.
+
+=item interpreter
+
+Strictly speaking, a program that reads a second program and does what
+the second program says directly without turning the program into a
+different form first, which is what L<compilers|/compiler> do.  Perl
+is not an interpreter by this definition, because it contains a kind
+of compiler that takes a program and turns it into a more executable
+form (L<syntax trees|/syntax tree>) within the I<perl> process itself,
+which the Perl L</run time> system then interprets.
+
+=item invocant
+
+The agent on whose behalf a L</method> is invoked.  In a L</class>
+method, the invocant is a package name.  In an L</instance> method,
+the invocant is an object reference.
+
+=item invocation
+
+The act of calling up a deity, daemon, program, method, subroutine, or
+function to get it do what you think it's supposed to do.  We usually
+"call" subroutines but "invoke" methods, since it sounds cooler.
+
+=item I/O
+
+Input from, or output to, a L</file> or L</device>.
+
+=item IO
+
+An internal I/O object.  Can also mean L</indirect object>.
+
+=item IP
+
+Internet Protocol, or Intellectual Property.
+
+=item IPC
+
+Interprocess Communication.
+
+=item is-a
+
+A relationship between two L<objects|/object> in which one object is
+considered to be a more specific version of the other, generic object:
+"A camel is a mammal."  Since the generic object really only exists in
+a Platonic sense, we usually add a little abstraction to the notion of
+objects and think of the relationship as being between a generic
+L</base class> and a specific L</derived class>.  Oddly enough,
+Platonic classes don't always have Platonic relationships--see
+L</inheritance>.
+
+=item iteration
+
+Doing something repeatedly.
+
+=item iterator
+
+A special programming gizmo that keeps track of where you are in
+something that you're trying to iterate over.  The C<foreach> loop in
+Perl contains an iterator; so does a hash, allowing you to
+L<each|perlfunc/each> through it.
+
+=item IV
+
+The integer four, not to be confused with six, Tom's favorite editor.
+IV also means an internal Integer Value of the type a L</scalar> can
+hold, not to be confused with an L</NV>.
+
+=back
+
+=head2 J
+
+=over 4
+
+=item JAPH
+
+"Just Another Perl Hacker," a clever but cryptic bit of Perl code that
+when executed, evaluates to that string.  Often used to illustrate a
+particular Perl feature, and something of an ungoing Obfuscated Perl
+Contest seen in Usenix signatures.
+
+=back
+
+=head2 K
+
+=over 4
+
+=item key
+
+The string index to a L</hash>, used to look up the L</value>
+associated with that key.
+
+=item keyword
+
+See L</reserved words>.
+
+=back
+
+=head2 L
+
+=over 4
+
+=item label
+
+A name you give to a L</statement> so that you can talk about that
+statement elsewhere in the program.
+
+=item laziness
+
+The quality that makes you go to great effort to reduce overall energy
+expenditure.  It makes you write labor-saving programs that other
+people will find useful, and document what you wrote so you don't have
+to answer so many questions about it.  Hence, the first great virtue
+of a programmer.  Also hence, this book.  See also L</impatience> and
+L</hubris>.
+
+=item left shift
+
+A L</bit shift> that multiplies the number by some power of 2.
+
+=item leftmost longest
+
+The preference of the L</regular expression> engine to match the
+leftmost occurrence of a L</pattern>, then given a position at which a
+match will occur, the preference for the longest match (presuming the
+use of a L</greedy> quantifier).  See L<perlre> for I<much> more on
+this subject.
+
+=item lexeme
+
+Fancy term for a L</token>.
+
+=item lexer
+
+Fancy term for a L</tokener>.
+
+=item lexical analysis
+
+Fancy term for L</tokenizing>.
+
+=item lexical scoping
+
+Looking at your I<Oxford English Dictionary> through a microscope.
+(Also known as L</static scoping>, because dictionaries don't change
+very fast.)  Similarly, looking at variables stored in a private
+dictionary (namespace) for each scope, which are visible only from
+their point of declaration down to the end of the lexical scope in
+which they are declared.  --Syn. L</static scoping>.
+--Ant. L</dynamic scoping>.
+
+=item lexical variable
+
+A L</variable> subject to L</lexical scoping>, declared by
+L<my|perlfunc/my>.  Often just called a "lexical".  (The
+L<our|perlfunc/our> declaration declares a lexically scoped name for a
+global variable, which is not itself a lexical variable.)
+
+=item library
+
+Generally, a collection of procedures.  In ancient days, referred to a
+collection of subroutines in a I<.pl> file.  In modern times, refers
+more often to the entire collection of Perl L<modules|/module> on your
+system.
+
+=item LIFO
+
+Last In, First Out.  See also L</FIFO>.  A LIFO is usually called a
+L</stack>.
+
+=item line
+
+In Unix, a sequence of zero or more non-newline characters terminated
+with a L</newline> character.  On non-Unix machines, this is emulated
+by the C library even if the underlying L</operating system> has
+different ideas.
+
+=item line buffering
+
+Used by a L</standard IE<sol>O> output stream that flushes its
+L</buffer> after every L</newline>.  Many standard I/O libraries
+automatically set up line buffering on output that is going to the
+terminal.
+
+=item line number
+
+The number of lines read previous to this one, plus 1.  Perl keeps a
+separate line number for each source or input file it opens.  The
+current source file's line number is represented by C<__LINE__>.  The
+current input line number (for the file that was most recently read
+via C<< E<lt>FHE<gt> >>) is represented by the C<$.>
+(C<$INPUT_LINE_NUMBER>) variable.  Many error messages report both
+values, if available.
+
+=item link
+
+Used as a noun, a name in a L</directory>, representing a L</file>.  A
+given file can have multiple links to it.  It's like having the same
+phone number listed in the phone directory under different names.  As
+a verb, to resolve a partially compiled file's unresolved symbols into
+a (nearly) executable image.  Linking can generally be static or
+dynamic, which has nothing to do with static or dynamic scoping.
+
+=item LIST
+
+A syntactic construct representing a comma-separated list of
+expressions, evaluated to produce a L</list value>.  Each
+L</expression> in a L</LIST> is evaluated in L</list context> and
+interpolated into the list value.
+
+=item list
+
+An ordered set of scalar values.
+
+=item list context
+
+The situation in which an L</expression> is expected by its
+surroundings (the code calling it) to return a list of values rather
+than a single value.  Functions that want a L</LIST> of arguments tell
+those arguments that they should produce a list value.  See also
+L</context>.
+
+=item list operator
+
+An L</operator> that does something with a list of values, such as
+L<join|perlfunc/join> or L<grep|perlfunc/grep>.  Usually used for
+named built-in operators (such as L<print|perlfunc/print>,
+L<unlink|perlfunc/unlink>, and L<system|perlfunc/system>) that do not
+require parentheses around their L</argument> list.
+
+=item list value
+
+An unnamed list of temporary scalar values that may be passed around
+within a program from any list-generating function to any function or
+construct that provides a L</list context>.
+
+=item literal
+
+A token in a programming language such as a number or L</string> that
+gives you an actual L</value> instead of merely representing possible
+values as a L</variable> does.
+
+=item little-endian
+
+From Swift: someone who eats eggs little end first.  Also used of
+computers that store the least significant L</byte> of a word at a
+lower byte address than the most significant byte.  Often considered
+superior to big-endian machines.  See also L</big-endian>.
+
+=item local
+
+Not meaning the same thing everywhere.  A global variable in Perl can
+be localized inside a L<dynamic scope|/dynamic scoping> via the
+L<local|perlfunc/local> operator.
+
+=item logical operator
+
+Symbols representing the concepts "and", "or", "xor", and "not".
+
+=item lookahead
+
+An L</assertion> that peeks at the string to the right of the current
+match location.
+
+=item lookbehind
+
+An L</assertion> that peeks at the string to the left of the current
+match location.
+
+=item loop
+
+A construct that performs something repeatedly, like a roller coaster.
+
+=item loop control statement
+
+Any statement within the body of a loop that can make a loop
+prematurely stop looping or skip an L</iteration>.  Generally you
+shouldn't try this on roller coasters.
+
+=item loop label
+
+A kind of key or name attached to a loop (or roller coaster) so that
+loop control statements can talk about which loop they want to
+control.
+
+=item lvaluable
+
+Able to serve as an L</lvalue>.
+
+=item lvalue
+
+Term used by language lawyers for a storage location you can assign a
+new L</value> to, such as a L</variable> or an element of an
+L</array>.  The "l" is short for "left", as in the left side of an
+assignment, a typical place for lvalues.  An L</lvaluable> function or
+expression is one to which a value may be assigned, as in C<pos($x) =
+10>.
+
+=item lvalue modifier
+
+An adjectival pseudofunction that warps the meaning of an L</lvalue>
+in some declarative fashion.  Currently there are three lvalue
+modifiers: L<my|perlfunc/my>, L<our|perlfunc/our>, and
+L<local|perlfunc/local>.
+
+=back
+
+=head2 M
+
+=over 4
+
+=item magic
+
+Technically speaking, any extra semantics attached to a variable such
+as C<$!>, C<$0>, C<%ENV>, or C<%SIG>, or to any tied variable.
+Magical things happen when you diddle those variables.
+
+=item magical increment
+
+An L</increment> operator that knows how to bump up alphabetics as
+well as numbers.
+
+=item magical variables
+
+Special variables that have side effects when you access them or
+assign to them.  For example, in Perl, changing elements of the
+C<%ENV> array also changes the corresponding environment variables
+that subprocesses will use.  Reading the C<$!> variable gives you the
+current system error number or message.
+
+=item Makefile
+
+A file that controls the compilation of a program.  Perl programs
+don't usually need a L</Makefile> because the Perl compiler has plenty
+of self-control.
+
+=item man
+
+The Unix program that displays online documentation (manual pages) for
+you.
+
+=item manpage
+
+A "page" from the manuals, typically accessed via the I<man>(1)
+command.  A manpage contains a SYNOPSIS, a DESCRIPTION, a list of
+BUGS, and so on, and is typically longer than a page.  There are
+manpages documenting L<commands|/command>, L<syscalls|/syscall>,
+L</library> L<functions|/function>, L<devices|/device>,
+L<protocols|/protocol>, L<files|/file>, and such.  In this book, we
+call any piece of standard Perl documentation (like I<perlop> or
+I<perldelta>) a manpage, no matter what format it's installed in on
+your system.
+
+=item matching
+
+See L</pattern matching>.
+
+=item member data
+
+See L</instance variable>.
+
+=item memory
+
+This always means your main memory, not your disk.  Clouding the issue
+is the fact that your machine may implement L</virtual> memory; that
+is, it will pretend that it has more memory than it really does, and
+it'll use disk space to hold inactive bits.  This can make it seem
+like you have a little more memory than you really do, but it's not a
+substitute for real memory.  The best thing that can be said about
+virtual memory is that it lets your performance degrade gradually
+rather than suddenly when you run out of real memory.  But your
+program can die when you run out of virtual memory too, if you haven't
+thrashed your disk to death first.
+
+=item metacharacter
+
+A L</character> that is I<not> supposed to be treated normally.  Which
+characters are to be treated specially as metacharacters varies
+greatly from context to context.  Your L</shell> will have certain
+metacharacters, double-quoted Perl L<strings|/string> have other
+metacharacters, and L</regular expression> patterns have all the
+double-quote metacharacters plus some extra ones of their own.
+
+=item metasymbol
+
+Something we'd call a L</metacharacter> except that it's a sequence of
+more than one character.  Generally, the first character in the
+sequence must be a true metacharacter to get the other characters in
+the metasymbol to misbehave along with it.
+
+=item method
+
+A kind of action that an L</object> can take if you tell it to.  See
+L<perlobj>.
+
+=item minimalism
+
+The belief that "small is beautiful."  Paradoxically, if you say
+something in a small language, it turns out big, and if you say it in
+a big language, it turns out small.  Go figure.
+
+=item mode
+
+In the context of the L<stat> syscall, refers to the field holding
+the L</permission bits> and the type of the L</file>.
+
+=item modifier
+
+See L</statement modifier>, L</regular expression modifier>, and
+L</lvalue modifier>, not necessarily in that order.
+
+=item module
+
+A L</file> that defines a L</package> of (almost) the same name, which
+can either L</export> symbols or function as an L</object> class.  (A
+module's main I<.pm> file may also load in other files in support of
+the module.)  See the L<use|perlfunc/use> built-in.
+
+=item modulus
+
+An integer divisor when you're interested in the remainder instead of
+the quotient.
+
+=item monger
+
+Short for Perl Monger, a purveyor of Perl.
+
+=item mortal
+
+A temporary value scheduled to die when the current statement
+finishes.
+
+=item multidimensional array
+
+An array with multiple subscripts for finding a single element.  Perl
+implements these using L<references|/reference>--see L<perllol> and
+L<perldsc>.
+
+=item multiple inheritance
+
+The features you got from your mother and father, mixed together
+unpredictably.  (See also L</inheritance>, and L</single
+inheritance>.)  In computer languages (including Perl), the notion
+that a given class may have multiple direct ancestors or L<base
+classes|/base class>.
+
+=back
+
+=head2 N
+
+=over 4
+
+=item named pipe
+
+A L</pipe> with a name embedded in the L</filesystem> so that it can
+be accessed by two unrelated L<processes|/process>.
+
+=item namespace
+
+A domain of names.  You needn't worry about whether the names in one
+such domain have been used in another.  See L</package>.
+
+=item network address
+
+The most important attribute of a socket, like your telephone's
+telephone number.  Typically an IP address.  See also L</port>.
+
+=item newline
+
+A single character that represents the end of a line, with the ASCII
+value of 012 octal under Unix (but 015 on a Mac), and represented by
+C<\n> in Perl strings.  For Windows machines writing text files, and
+for certain physical devices like terminals, the single newline gets
+automatically translated by your C library into a line feed and a
+carriage return, but normally, no translation is done.
+
+=item NFS
+
+Network File System, which allows you to mount a remote filesystem as
+if it were local.
+
+=item null character
+
+A character with the ASCII value of zero.  It's used by C to terminate
+strings, but Perl allows strings to contain a null.
+
+=item null list
+
+A L</list value> with zero elements, represented in Perl by C<()>.
+
+=item null string
+
+A L</string> containing no characters, not to be confused with a
+string containing a L</null character>, which has a positive length
+and is L</true>.
+
+=item numeric context
+
+The situation in which an expression is expected by its surroundings
+(the code calling it) to return a number.  See also L</context> and
+L</string context>.
+
+=item NV
+
+Short for Nevada, no part of which will ever be confused with
+civilization.  NV also means an internal floating-point Numeric Value
+of the type a L</scalar> can hold, not to be confused with an L</IV>.
+
+=item nybble
+
+Half a L</byte>, equivalent to one L</hexadecimal> digit, and worth
+four L<bits|/bit>.
+
+=back
+
+=head2 O
+
+=over 4
+
+=item object
+
+An L</instance> of a L</class>.  Something that "knows" what
+user-defined type (class) it is, and what it can do because of what
+class it is.  Your program can request an object to do things, but the
+object gets to decide whether it wants to do them or not.  Some
+objects are more accommodating than others.
+
+=item octal
+
+A number in base 8.  Only the digits 0 through 7 are allowed.  Octal
+constants in Perl start with 0, as in 013.  See also the
+L<oct|perlfunc/oct> function.
+
+=item offset
+
+How many things you have to skip over when moving from the beginning
+of a string or array to a specific position within it.  Thus, the
+minimum offset is zero, not one, because you don't skip anything to
+get to the first item.
+
+=item one-liner
+
+An entire computer program crammed into one line of text.
+
+=item open source software
+
+Programs for which the source code is freely available and freely
+redistributable, with no commercial strings attached.  For a more
+detailed definition, see L<http://www.opensource.org/osd.html>.
+
+=item operand
+
+An L</expression> that yields a L</value> that an L</operator>
+operates on.  See also L</precedence>.
+
+=item operating system
+
+A special program that runs on the bare machine and hides the gory
+details of managing L<processes|/process> and L<devices|/device>.
+Usually used in a looser sense to indicate a particular culture of
+programming.  The loose sense can be used at varying levels of
+specificity.  At one extreme, you might say that all versions of Unix
+and Unix-lookalikes are the same operating system (upsetting many
+people, especially lawyers and other advocates).  At the other
+extreme, you could say this particular version of this particular
+vendor's operating system is different from any other version of this
+or any other vendor's operating system.  Perl is much more portable
+across operating systems than many other languages.  See also
+L</architecture> and L</platform>.
+
+=item operator
+
+A gizmo that transforms some number of input values to some number of
+output values, often built into a language with a special syntax or
+symbol.  A given operator may have specific expectations about what
+L<types|/type> of data you give as its arguments
+(L<operands|/operand>) and what type of data you want back from it.
+
+=item operator overloading
+
+A kind of L</overloading> that you can do on built-in
+L<operators|/operator> to make them work on L<objects|/object> as if
+the objects were ordinary scalar values, but with the actual semantics
+supplied by the object class.  This is set up with the L<overload>
+L</pragma>.
+
+=item options
+
+See either L<switches|/switch> or L</regular expression modifier>.
+
+=item overloading
+
+Giving additional meanings to a symbol or construct.  Actually, all
+languages do overloading to one extent or another, since people are
+good at figuring out things from L</context>.
+
+=item overriding
+
+Hiding or invalidating some other definition of the same name.  (Not
+to be confused with L</overloading>, which adds definitions that must
+be disambiguated some other way.) To confuse the issue further, we use
+the word with two overloaded definitions: to describe how you can
+define your own L</subroutine> to hide a built-in L</function> of the
+same name (see L<perlsub/Overriding Built-in Functions>) and to
+describe how you can define a replacement L</method> in a L</derived
+class> to hide a L</base class>'s method of the same name (see
+L<perlobj>).
+
+=item owner
+
+The one user (apart from the superuser) who has absolute control over
+a L</file>.  A file may also have a L</group> of users who may
+exercise joint ownership if the real owner permits it.  See
+L</permission bits>.
+
+=back
+
+=head2 P
+
+=over 4
+
+=item package
+
+A L</namespace> for global L<variables|/variable>,
+L<subroutines|/subroutine>, and the like, such that they can be kept
+separate from like-named L<symbols|/symbol> in other namespaces.  In a
+sense, only the package is global, since the symbols in the package's
+symbol table are only accessible from code compiled outside the
+package by naming the package.  But in another sense, all package
+symbols are also globals--they're just well-organized globals.
+
+=item pad
+
+Short for L</scratchpad>.
+
+=item parameter
+
+See L</argument>.
+
+=item parent class
+
+See L</base class>.
+
+=item parse tree
+
+See L</syntax tree>.
+
+=item parsing
+
+The subtle but sometimes brutal art of attempting to turn your
+possibly malformed program into a valid L</syntax tree>.
+
+=item patch
+
+To fix by applying one, as it were.  In the realm of hackerdom, a
+listing of the differences between two versions of a program as might
+be applied by the I<patch>(1) program when you want to fix a bug or
+upgrade your old version.
+
+=item PATH
+
+The list of L<directories|/directory> the system searches to find a
+program you want to L</execute>.  The list is stored as one of your
+L<environment variables|/environment variable>, accessible in Perl as
+C<$ENV{PATH}>.
+
+=item pathname
+
+A fully qualified filename such as I</usr/bin/perl>.  Sometimes
+confused with L</PATH>.
+
+=item pattern
+
+A template used in L</pattern matching>.
+
+=item pattern matching
+
+Taking a pattern, usually a L</regular expression>, and trying the
+pattern various ways on a string to see whether there's any way to
+make it fit.  Often used to pick interesting tidbits out of a file.
+
+=item permission bits
+
+Bits that the L</owner> of a file sets or unsets to allow or disallow
+access to other people.  These flag bits are part of the L</mode> word
+returned by the L<stat|perlfunc/stat> built-in when you ask about a
+file.  On Unix systems, you can check the I<ls>(1) manpage for more
+information.
+
+=item Pern
+
+What you get when you do C<Perl++> twice.  Doing it only once will
+curl your hair.  You have to increment it eight times to shampoo your
+hair.  Lather, rinse, iterate.
+
+=item pipe
+
+A direct L</connection> that carries the output of one L</process> to
+the input of another without an intermediate temporary file.  Once the
+pipe is set up, the two processes in question can read and write as if
+they were talking to a normal file, with some caveats.
+
+=item pipeline
+
+A series of L<processes|/process> all in a row, linked by
+L<pipes|/pipe>, where each passes its output stream to the next.
+
+=item platform
+
+The entire hardware and software context in which a program runs.  A
+ program written in a platform-dependent language might break if you
+change any of: machine, operating system, libraries, compiler, or
+system configuration.  The I<perl> interpreter has to be compiled
+differently for each platform because it is implemented in C, but
+programs written in the Perl language are largely
+platform-independent.
+
+=item pod
+
+The markup used to embed documentation into your Perl code.  See
+L<perlpod>.
+
+=item pointer
+
+A L</variable> in a language like C that contains the exact memory
+location of some other item.  Perl handles pointers internally so you
+don't have to worry about them.  Instead, you just use symbolic
+pointers in the form of L<keys|/key> and L</variable> names, or L<hard
+references|/hard reference>, which aren't pointers (but act like
+pointers and do in fact contain pointers).
+
+=item polymorphism
+
+The notion that you can tell an L</object> to do something generic,
+and the object will interpret the command in different ways depending
+on its type.  [E<lt>Gk many shapes]
+
+=item port
+
+The part of the address of a TCP or UDP socket that directs packets to
+the correct process after finding the right machine, something like
+the phone extension you give when you reach the company operator.
+Also, the result of converting code to run on a different platform
+than originally intended, or the verb denoting this conversion.
+
+=item portable
+
+Once upon a time, C code compilable under both BSD and SysV.  In
+general, code that can be easily converted to run on another
+L</platform>, where "easily" can be defined however you like, and
+usually is.  Anything may be considered portable if you try hard
+enough.  See I<mobile home> or I<London Bridge>.
+
+=item porter
+
+Someone who "carries" software from one L</platform> to another.
+Porting programs written in platform-dependent languages such as C can
+be difficult work, but porting programs like Perl is very much worth
+the agony.
+
+=item POSIX
+
+The Portable Operating System Interface specification.
+
+=item postfix
+
+An L</operator> that follows its L</operand>, as in C<$x++>.
+
+=item pp
+
+An internal shorthand for a "push-pop" code, that is, C code
+implementing Perl's stack machine.
+
+=item pragma
+
+A standard module whose practical hints and suggestions are received
+(and possibly ignored) at compile time.  Pragmas are named in all
+lowercase.
+
+=item precedence
+
+The rules of conduct that, in the absence of other guidance, determine
+what should happen first.  For example, in the absence of parentheses,
+you always do multiplication before addition.
+
+=item prefix
+
+An L</operator> that precedes its L</operand>, as in C<++$x>.
+
+=item preprocessing
+
+What some helper L</process> did to transform the incoming data into a
+form more suitable for the current process.  Often done with an
+incoming L</pipe>.  See also L</C preprocessor>.
+
+=item procedure
+
+A L</subroutine>.
+
+=item process
+
+An instance of a running program.  Under multitasking systems like
+Unix, two or more separate processes could be running the same program
+independently at the same time--in fact, the L<fork|perlfunc/fork>
+function is designed to bring about this happy state of affairs.
+Under other operating systems, processes are sometimes called
+"threads", "tasks", or "jobs", often with slight nuances in meaning.
+
+=item program generator
+
+A system that algorithmically writes code for you in a high-level
+language.  See also L</code generator>.
+
+=item progressive matching
+
+L<Pattern matching|/pattern matching> that picks up where it left off before.
+
+=item property
+
+See either L</instance variable> or L</character property>.
+
+=item protocol
+
+In networking, an agreed-upon way of sending messages back and forth
+so that neither correspondent will get too confused.
+
+=item prototype
+
+An optional part of a L</subroutine> declaration telling the Perl
+compiler how many and what flavor of arguments may be passed as
+L</actual arguments>, so that you can write subroutine calls that
+parse much like built-in functions.  (Or don't parse, as the case may
+be.)
+
+=item pseudofunction
+
+A construct that sometimes looks like a function but really isn't.
+Usually reserved for L</lvalue> modifiers like L<my|perlfunc/my>, for
+L</context> modifiers like L<scalar|perlfunc/scalar>, and for the
+pick-your-own-quotes constructs, C<q//>, C<qq//>, C<qx//>, C<qw//>,
+C<qr//>, C<m//>, C<s///>, C<y///>, and C<tr///>.
+
+=item pseudohash
+
+A reference to an array whose initial element happens to hold a
+reference to a hash.  You can treat a pseudohash reference as either
+an array reference or a hash reference.
+
+=item pseudoliteral
+
+An L</operator> that looks something like a L</literal>, such as the
+output-grabbing operator, C<`>I<C<command>>C<`>.
+
+=item public domain
+
+Something not owned by anybody.  Perl is copyrighted and is thus
+I<not> in the public domain--it's just L</freely available> and
+L</freely redistributable>.
+
+=item pumpkin
+
+A notional "baton" handed around the Perl community indicating who is
+the lead integrator in some arena of development.
+
+=item pumpking
+
+A L</pumpkin> holder, the person in charge of pumping the pump, or at
+least priming it.  Must be willing to play the part of the Great
+Pumpkin now and then.
+
+=item PV
+
+A "pointer value", which is Perl Internals Talk for a C<char*>.
+
+=back
+
+=head2 Q
+
+=over 4
+
+=item qualified
+
+Possessing a complete name.  The symbol C<$Ent::moot> is qualified;
+C<$moot> is unqualified.  A fully qualified filename is specified from
+the top-level directory.
+
+=item quantifier
+
+A component of a L</regular expression> specifying how many times the
+foregoing L</atom> may occur.
+
+=back
+
+=head2 R
+
+=over 4
+
+=item readable
+
+With respect to files, one that has the proper permission bit set to
+let you access the file.  With respect to computer programs, one
+that's written well enough that someone has a chance of figuring out
+what it's trying to do.
+
+=item reaping
+
+The last rites performed by a parent L</process> on behalf of a
+deceased child process so that it doesn't remain a L</zombie>.  See
+the L<wait|perlfunc/wait> and L<waitpid|perlfunc/waitpid> function
+calls.
+
+=item record
+
+A set of related data values in a L</file> or L</stream>, often
+associated with a unique L</key> field.  In Unix, often commensurate
+with a L</line>, or a blank-line-terminated set of lines (a
+"paragraph").  Each line of the I</etc/passwd> file is a record, keyed
+on login name, containing information about that user.
+
+=item recursion
+
+The art of defining something (at least partly) in terms of itself,
+which is a naughty no-no in dictionaries but often works out okay in
+computer programs if you're careful not to recurse forever, which is
+like an infinite loop with more spectacular failure modes.
+
+=item reference
+
+Where you look to find a pointer to information somewhere else.  (See
+L</indirection>.)  References come in two flavors, L<symbolic
+references|/symbolic reference> and L<hard references|/hard
+reference>.
+
+=item referent
+
+Whatever a reference refers to, which may or may not have a name.
+Common types of referents include scalars, arrays, hashes, and
+subroutines.
+
+=item regex
+
+See L</regular expression>.
+
+=item regular expression
+
+A single entity with various interpretations, like an elephant.  To a
+computer scientist, it's a grammar for a little language in which some
+strings are legal and others aren't.  To normal people, it's a pattern
+you can use to find what you're looking for when it varies from case
+to case.  Perl's regular expressions are far from regular in the
+theoretical sense, but in regular use they work quite well.  Here's a
+regular expression: C</Oh s.*t./>.  This will match strings like "C<Oh
+say can you see by the dawn's early light>" and "C<Oh sit!>".  See
+L<perlre>.
+
+=item regular expression modifier
+
+An option on a pattern or substitution, such as C</i> to render the
+pattern case insensitive.  See also L</cloister>.
+
+=item regular file
+
+A L</file> that's not a L</directory>, a L</device>, a named L</pipe>
+or L</socket>, or a L</symbolic link>.  Perl uses the C<-f> file test
+operator to identify regular files.  Sometimes called a "plain" file.
+
+=item relational operator
+
+An L</operator> that says whether a particular ordering relationship
+is L</true> about a pair of L<operands|/operand>.  Perl has both
+numeric and string relational operators.  See L</collating sequence>.
+
+=item reserved words
+
+A word with a specific, built-in meaning to a L</compiler>, such as
+C<if> or L<delete|perlfunc/delete>.  In many languages (not Perl),
+it's illegal to use reserved words to name anything else.  (Which is
+why they're reserved, after all.)  In Perl, you just can't use them to
+name L<labels|/label> or L<filehandles|/filehandle>.  Also called
+"keywords".
+
+=item return value
+
+The L</value> produced by a L</subroutine> or L</expression> when
+evaluated.  In Perl, a return value may be either a L</list> or a
+L</scalar>.
+
+=item RFC
+
+Request For Comment, which despite the timid connotations is the name
+of a series of important standards documents.
+
+=item right shift
+
+A L</bit shift> that divides a number by some power of 2.
+
+=item root
+
+The superuser (UID == 0).  Also, the top-level directory of the
+filesystem.
+
+=item RTFM
+
+What you are told when someone thinks you should Read The Fine Manual.
+
+=item run phase
+
+Any time after Perl starts running your main program.  See also
+L</compile phase>.  Run phase is mostly spent in L</run time> but may
+also be spent in L</compile time> when L<require|perlfunc/require>,
+L<do|perlfunc/do> C<FILE>, or L<eval|perlfunc/eval> C<STRING>
+operators are executed or when a substitution uses the C</ee>
+modifier.
+
+=item run time
+
+The time when Perl is actually doing what your code says to do, as
+opposed to the earlier period of time when it was trying to figure out
+whether what you said made any sense whatsoever, which is L</compile
+time>.
+
+=item run-time pattern
+
+A pattern that contains one or more variables to be interpolated
+before parsing the pattern as a L</regular expression>, and that
+therefore cannot be analyzed at compile time, but must be re-analyzed
+each time the pattern match operator is evaluated.  Run-time patterns
+are useful but expensive.
+
+=item RV
+
+A recreational vehicle, not to be confused with vehicular recreation.
+RV also means an internal Reference Value of the type a L</scalar> can
+hold.  See also L</IV> and L</NV> if you're not confused yet.
+
+=item rvalue
+
+A L</value> that you might find on the right side of an
+L</assignment>.  See also L</lvalue>.
+
+=back
+
+=head2 S
+
+=over 4
+
+=item scalar
+
+A simple, singular value; a number, L</string>, or L</reference>.
+
+=item scalar context
+
+The situation in which an L</expression> is expected by its
+surroundings (the code calling it) to return a single L</value> rather
+than a L</list> of values.  See also L</context> and L</list context>.
+A scalar context sometimes imposes additional constraints on the
+return value--see L</string context> and L</numeric context>.
+Sometimes we talk about a L</Boolean context> inside conditionals, but
+this imposes no additional constraints, since any scalar value,
+whether numeric or L</string>, is already true or false.
+
+=item scalar literal
+
+A number or quoted L</string>--an actual L</value> in the text of your
+program, as opposed to a L</variable>.
+
+=item scalar value
+
+A value that happens to be a L</scalar> as opposed to a L</list>.
+
+=item scalar variable
+
+A L</variable> prefixed with C<$> that holds a single value.
+
+=item scope
+
+How far away you can see a variable from, looking through one.  Perl
+has two visibility mechanisms: it does L</dynamic scoping> of
+L<local|perlfunc/local> L<variables|/variable>, meaning that the rest
+of the L</block>, and any L<subroutines|/subroutine> that are called
+by the rest of the block, can see the variables that are local to the
+block.  Perl does L</lexical scoping> of L<my|perlfunc/my> variables,
+meaning that the rest of the block can see the variable, but other
+subroutines called by the block I<cannot> see the variable.
+
+=item scratchpad
+
+The area in which a particular invocation of a particular file or
+subroutine keeps some of its temporary values, including any lexically
+scoped variables.
+
+=item script
+
+A text L</file> that is a program intended to be L<executed|/execute>
+directly rather than L<compiled|/compiler> to another form of file
+before execution.  Also, in the context of L</Unicode>, a writing
+system for a particular language or group of languages, such as Greek,
+Bengali, or Klingon.
+
+=item script kiddie
+
+A L</cracker> who is not a L</hacker>, but knows just enough to run
+canned scripts.  A cargo-cult programmer.
+
+=item sed
+
+A venerable Stream EDitor from which Perl derives some of its ideas.
+
+=item semaphore
+
+A fancy kind of interlock that prevents multiple L<threads|/thread> or
+L<processes|/process> from using up the same resources simultaneously.
+
+=item separator
+
+A L</character> or L</string> that keeps two surrounding strings from
+being confused with each other.  The L<split|perlfunc/split> function
+works on separators.  Not to be confused with L<delimiters|/delimiter>
+or L<terminators|/terminator>.  The "or" in the previous sentence
+separated the two alternatives.
+
+=item serialization
+
+Putting a fancy L</data structure> into linear order so that it can be
+stored as a L</string> in a disk file or database or sent through a
+L</pipe>.  Also called marshalling.
+
+=item server
+
+In networking, a L</process> that either advertises a L</service> or
+just hangs around at a known location and waits for L<clients|/client>
+who need service to get in touch with it.
+
+=item service
+
+Something you do for someone else to make them happy, like giving them
+the time of day (or of their life).  On some machines, well-known
+services are listed by the L<getservent|perlfunc/getservent> function.
+
+=item setgid
+
+Same as L</setuid>, only having to do with giving away L</group>
+privileges.
+
+=item setuid
+
+Said of a program that runs with the privileges of its L</owner>
+rather than (as is usually the case) the privileges of whoever is
+running it.  Also describes the bit in the mode word (L</permission
+bits>) that controls the feature.  This bit must be explicitly set by
+the owner to enable this feature, and the program must be carefully
+written not to give away more privileges than it ought to.
+
+=item shared memory
+
+A piece of L</memory> accessible by two different
+L<processes|/process> who otherwise would not see each other's memory.
+
+=item shebang
+
+Irish for the whole McGillicuddy.  In Perl culture, a portmanteau of
+"sharp" and "bang", meaning the C<#!> sequence that tells the system
+where to find the interpreter.
+
+=item shell
+
+A L</command>-line L</interpreter>.  The program that interactively
+gives you a prompt, accepts one or more L<lines|/line> of input, and
+executes the programs you mentioned, feeding each of them their proper
+L<arguments|/argument> and input data.  Shells can also execute
+scripts containing such commands.  Under Unix, typical shells include
+the Bourne shell (I</bin/sh>), the C shell (I</bin/csh>), and the Korn
+shell (I</bin/ksh>).  Perl is not strictly a shell because it's not
+interactive (although Perl programs can be interactive).
+
+=item side effects
+
+Something extra that happens when you evaluate an L</expression>.
+Nowadays it can refer to almost anything.  For example, evaluating a
+simple assignment statement typically has the "side effect" of
+assigning a value to a variable.  (And you thought assigning the value
+was your primary intent in the first place!)  Likewise, assigning a
+value to the special variable C<$|> (C<$AUTOFLUSH>) has the side
+effect of forcing a flush after every L<write|perlfunc/write> or
+L<print|perlfunc/print> on the currently selected filehandle.
+
+=item signal
+
+A bolt out of the blue; that is, an event triggered by the
+L</operating system>, probably when you're least expecting it.
+
+=item signal handler
+
+A L</subroutine> that, instead of being content to be called in the
+normal fashion, sits around waiting for a bolt out of the blue before
+it will deign to L</execute>.  Under Perl, bolts out of the blue are
+called signals, and you send them with the L<kill|perlfunc/kill>
+built-in.  See L<perlvar/%SIG> and L<perlipc/Signals>.
+
+=item single inheritance
+
+The features you got from your mother, if she told you that you don't
+have a father.  (See also L</inheritance> and L</multiple
+inheritance>.)  In computer languages, the notion that
+L<classes|/class> reproduce asexually so that a given class can only
+have one direct ancestor or L</base class>.  Perl supplies no such
+restriction, though you may certainly program Perl that way if you
+like.
+
+=item slice
+
+A selection of any number of L<elements|/element> from a L</list>,
+L</array>, or L</hash>.
+
+=item slurp
+
+To read an entire L</file> into a L</string> in one operation.
+
+=item socket
+
+An endpoint for network communication among multiple
+L<processes|/process> that works much like a telephone or a post
+office box.  The most important thing about a socket is its L</network
+address> (like a phone number).  Different kinds of sockets have
+different kinds of addresses--some look like filenames, and some
+don't.
+
+=item soft reference
+
+See L</symbolic reference>.
+
+=item source filter
+
+A special kind of L</module> that does L</preprocessing> on your
+script just before it gets to the L</tokener>.
+
+=item stack
+
+A device you can put things on the top of, and later take them back
+off in the opposite order in which you put them on.  See L</LIFO>.
+
+=item standard
+
+Included in the official Perl distribution, as in a standard module, a
+standard tool, or a standard Perl L</manpage>.
+
+=item standard error
+
+The default output L</stream> for nasty remarks that don't belong in
+L</standard output>.  Represented within a Perl program by the
+L</filehandle> L</STDERR>.  You can use this stream explicitly, but the
+L<die|perlfunc/die> and L<warn|perlfunc/warn> built-ins write to your
+standard error stream automatically.
+
+=item standard I/O
+
+A standard C library for doing L<buffered|/buffer> input and output to
+the L</operating system>.  (The "standard" of standard I/O is only
+marginally related to the "standard" of standard input and output.)
+In general, Perl relies on whatever implementation of standard I/O a
+given operating system supplies, so the buffering characteristics of a
+Perl program on one machine may not exactly match those on another
+machine.  Normally this only influences efficiency, not semantics.  If
+your standard I/O package is doing block buffering and you want it to
+L</flush> the buffer more often, just set the C<$|> variable to a true
+value.
+
+=item standard input
+
+The default input L</stream> for your program, which if possible
+shouldn't care where its data is coming from.  Represented within a
+Perl program by the L</filehandle> L</STDIN>.
+
+=item standard output
+
+The default output L</stream> for your program, which if possible
+shouldn't care where its data is going.  Represented within a Perl
+program by the L</filehandle> L</STDOUT>.
+
+=item stat structure
+
+A special internal spot in which Perl keeps the information about the
+last L</file> on which you requested information.
+
+=item statement
+
+A L</command> to the computer about what to do next, like a step in a
+recipe: "Add marmalade to batter and mix until mixed."  A statement is
+distinguished from a L</declaration>, which doesn't tell the computer
+to do anything, but just to learn something.
+
+=item statement modifier
+
+A L</conditional> or L</loop> that you put after the L</statement>
+instead of before, if you know what we mean.
+
+=item static
+
+Varying slowly compared to something else.  (Unfortunately, everything
+is relatively stable compared to something else, except for certain
+elementary particles, and we're not so sure about them.)  In
+computers, where things are supposed to vary rapidly, "static" has a
+derogatory connotation, indicating a slightly dysfunctional
+L</variable>, L</subroutine>, or L</method>.  In Perl culture, the
+word is politely avoided.
+
+=item static method
+
+No such thing.  See L</class method>.
+
+=item static scoping
+
+No such thing.  See L</lexical scoping>.
+
+=item static variable
+
+No such thing.  Just use a L</lexical variable> in a scope larger than
+your L</subroutine>.
+
+=item status
+
+The L</value> returned to the parent L</process> when one of its child
+processes dies.  This value is placed in the special variable C<$?>.
+Its upper eight L<bits|/bit> are the exit status of the defunct
+process, and its lower eight bits identify the signal (if any) that
+the process died from.  On Unix systems, this status value is the same
+as the status word returned by I<wait>(2).  See L<perlfunc/system>.
+
+=item STDERR
+
+See L</standard error>.
+
+=item STDIN
+
+See L</standard input>.
+
+=item STDIO
+
+See L</standard IE<sol>O>.
+
+=item STDOUT
+
+See L</standard output>.
+
+=item stream
+
+A flow of data into or out of a process as a steady sequence of bytes
+or characters, without the appearance of being broken up into packets.
+This is a kind of L</interface>--the underlying L</implementation> may
+well break your data up into separate packets for delivery, but this
+is hidden from you.
+
+=item string
+
+A sequence of characters such as "He said !@#*&%@#*?!".  A string does
+not have to be entirely printable.
+
+=item string context
+
+The situation in which an expression is expected by its surroundings
+(the code calling it) to return a L</string>.  See also L</context>
+and L</numeric context>.
+
+=item stringification
+
+The process of producing a L</string> representation of an abstract
+object.
+
+=item struct
+
+C keyword introducing a structure definition or name.
+
+=item structure
+
+See L</data structure>.
+
+=item subclass
+
+See L</derived class>.
+
+=item subpattern
+
+A component of a L</regular expression> pattern.
+
+=item subroutine
+
+A named or otherwise accessible piece of program that can be invoked
+from elsewhere in the program in order to accomplish some sub-goal of
+the program.  A subroutine is often parameterized to accomplish
+different but related things depending on its input
+L<arguments|/argument>.  If the subroutine returns a meaningful
+L</value>, it is also called a L</function>.
+
+=item subscript
+
+A L</value> that indicates the position of a particular L</array>
+L</element> in an array.
+
+=item substitution
+
+Changing parts of a string via the C<s///> operator.  (We avoid use of
+this term to mean L</variable interpolation>.)
+
+=item substring
+
+A portion of a L</string>, starting at a certain L</character>
+position (L</offset>) and proceeding for a certain number of
+characters.
+
+=item superclass
+
+See L</base class>.
+
+=item superuser
+
+The person whom the L</operating system> will let do almost anything.
+Typically your system administrator or someone pretending to be your
+system administrator.  On Unix systems, the L</root> user.  On Windows
+systems, usually the Administrator user.
+
+=item SV
+
+Short for "scalar value".  But within the Perl interpreter every
+L</referent> is treated as a member of a class derived from SV, in an
+object-oriented sort of way.  Every L</value> inside Perl is passed
+around as a C language C<SV*> pointer.  The SV L</struct> knows its
+own "referent type", and the code is smart enough (we hope) not to try
+to call a L</hash> function on a L</subroutine>.
+
+=item switch
+
+An option you give on a command line to influence the way your program
+works, usually introduced with a minus sign.  The word is also used as
+a nickname for a L</switch statement>.
+
+=item switch cluster
+
+The combination of multiple command-line switches (e.g., B<-a -b -c>)
+into one switch (e.g., B<-abc>).  Any switch with an additional
+L</argument> must be the last switch in a cluster.
+
+=item switch statement
+
+A program technique that lets you evaluate an L</expression> and then,
+based on the value of the expression, do a multiway branch to the
+appropriate piece of code for that value.  Also called a "case
+structure", named after the similar Pascal construct.  Most switch
+statements in Perl are spelled C<for>.  See L<perlsyn/Basic BLOCKs and
+Switch Statements>.
+
+=item symbol
+
+Generally, any L</token> or L</metasymbol>.  Often used more
+specifically to mean the sort of name you might find in a L</symbol
+table>.
+
+=item symbol table
+
+Where a L</compiler> remembers symbols.  A program like Perl must
+somehow remember all the names of all the L<variables|/variable>,
+L<filehandles|/filehandle>, and L<subroutines|/subroutine> you've
+used.  It does this by placing the names in a symbol table, which is
+implemented in Perl using a L</hash table>.  There is a separate
+symbol table for each L</package> to give each package its own
+L</namespace>.
+
+=item symbolic debugger
+
+A program that lets you step through the L<execution|/execute> of your
+program, stopping or printing things out here and there to see whether
+anything has gone wrong, and if so, what.  The "symbolic" part just
+means that you can talk to the debugger using the same symbols with
+which your program is written.
+
+=item symbolic link
+
+An alternate filename that points to the real L</filename>, which in
+turn points to the real L</file>.  Whenever the L</operating system>
+is trying to parse a L</pathname> containing a symbolic link, it
+merely substitutes the new name and continues parsing.
+
+=item symbolic reference
+
+A variable whose value is the name of another variable or subroutine.
+By L<dereferencing|/dereference> the first variable, you can get at
+the second one.  Symbolic references are illegal under L<use strict
+'refs'|strict/strict refs>.
+
+=item synchronous
+
+Programming in which the orderly sequence of events can be determined;
+that is, when things happen one after the other, not at the same time.
+
+=item syntactic sugar
+
+An alternative way of writing something more easily; a shortcut.
+
+=item syntax
+
+From Greek, "with-arrangement".  How things (particularly symbols) are
+put together with each other.
+
+=item syntax tree
+
+An internal representation of your program wherein lower-level
+L<constructs|/construct> dangle off the higher-level constructs
+enclosing them.
+
+=item syscall
+
+A L</function> call directly to the L</operating system>.  Many of the
+important subroutines and functions you use aren't direct system
+calls, but are built up in one or more layers above the system call
+level.  In general, Perl programmers don't need to worry about the
+distinction.  However, if you do happen to know which Perl functions
+are really syscalls, you can predict which of these will set the C<$!>
+(C<$ERRNO>) variable on failure.  Unfortunately, beginning programmers
+often confusingly employ the term "system call" to mean what happens
+when you call the Perl L<system|perlfunc/system> function, which
+actually involves many syscalls.  To avoid any confusion, we nearly
+always use say "syscall" for something you could call indirectly via
+Perl's L<syscall|perlfunc/syscall> function, and never for something
+you would call with Perl's L<system|perlfunc/system> function.
+
+=back
+
+=head2 T
+
+=over 4
+
+=item tainted
+
+Said of data derived from the grubby hands of a user and thus unsafe
+for a secure program to rely on.  Perl does taint checks if you run a
+L</setuid> (or L</setgid>) program, or if you use the B<-T> switch.
+
+=item TCP
+
+Short for Transmission Control Protocol.  A protocol wrapped around
+the Internet Protocol to make an unreliable packet transmission
+mechanism appear to the application program to be a reliable
+L</stream> of bytes.  (Usually.)
+
+=item term
+
+Short for a "terminal", that is, a leaf node of a L</syntax tree>.  A
+thing that functions grammatically as an L</operand> for the operators
+in an expression.
+
+=item terminator
+
+A L</character> or L</string> that marks the end of another string.
+The C<$/> variable contains the string that terminates a
+L<readline|perlfunc/readline> operation, which L<chomp|perlfunc/chomp>
+deletes from the end.  Not to be confused with
+L<delimiters|/delimiter> or L<separators|/separator>.  The period at
+the end of this sentence is a terminator.
+
+=item ternary
+
+An L</operator> taking three L<operands|/operand>.  Sometimes
+pronounced L</trinary>.
+
+=item text
+
+A L</string> or L</file> containing primarily printable characters.
+
+=item thread
+
+Like a forked process, but without L</fork>'s inherent memory
+protection.  A thread is lighter weight than a full process, in that a
+process could have multiple threads running around in it, all fighting
+over the same process's memory space unless steps are taken to protect
+threads from each other.  See L<threads>.
+
+=item tie
+
+The bond between a magical variable and its implementation class.  See
+L<perlfunc/tie> and L<perltie>.
+
+=item TMTOWTDI
+
+There's More Than One Way To Do It, the Perl Motto.  The notion that
+there can be more than one valid path to solving a programming problem
+in context.  (This doesn't mean that more ways are always better or
+that all possible paths are equally desirable--just that there need
+not be One True Way.)  Pronounced TimToady.
+
+=item token
+
+A morpheme in a programming language, the smallest unit of text with
+semantic significance.
+
+=item tokener
+
+A module that breaks a program text into a sequence of
+L<tokens|/token> for later analysis by a parser.
+
+=item tokenizing
+
+Splitting up a program text into L<tokens|/token>.  Also known as
+"lexing", in which case you get "lexemes" instead of tokens.
+
+=item toolbox approach
+
+The notion that, with a complete set of simple tools that work well
+together, you can build almost anything you want.  Which is fine if
+you're assembling a tricycle, but if you're building a defranishizing
+comboflux regurgalator, you really want your own machine shop in which
+to build special tools.  Perl is sort of a machine shop.
+
+=item transliterate
+
+To turn one string representation into another by mapping each
+character of the source string to its corresponding character in the
+result string.  See
+L<perlop/trE<sol>SEARCHLISTE<sol>REPLACEMENTLISTE<sol>cds>.
+
+=item trigger
+
+An event that causes a L</handler> to be run.
+
+=item trinary
+
+Not a stellar system with three stars, but an L</operator> taking
+three L<operands|/operand>.  Sometimes pronounced L</ternary>.
+
+=item troff
+
+A venerable typesetting language from which Perl derives the name of
+its C<$%> variable and which is secretly used in the production of
+Camel books.
+
+=item true
+
+Any scalar value that doesn't evaluate to 0 or C<"">.
+
+=item truncating
+
+Emptying a file of existing contents, either automatically when
+opening a file for writing or explicitly via the
+L<truncate|perlfunc/truncate> function.
+
+=item type
+
+See L</data type> and L</class>.
+
+=item type casting
+
+Converting data from one type to another.  C permits this.  Perl does
+not need it.  Nor want it.
+
+=item typed lexical
+
+A L</lexical variable> that is declared with a L</class> type: C<my
+Pony $bill>.
+
+=item typedef
+
+A type definition in the C language.
+
+=item typeglob
+
+Use of a single identifier, prefixed with C<*>.  For example, C<*name>
+stands for any or all of C<$name>, C<@name>, C<%name>, C<&name>, or
+just C<name>.  How you use it determines whether it is interpreted as
+all or only one of them.  See L<perldata/Typeglobs and Filehandles>.
+
+=item typemap
+
+A description of how C types may be transformed to and from Perl types
+within an L</extension> module written in L</XS>.
+
+=back
+
+=head2 U
+
+=over 4
+
+=item UDP
+
+User Datagram Protocol, the typical way to send L<datagrams|/datagram>
+over the Internet.
+
+=item UID
+
+A user ID.  Often used in the context of L</file> or L</process>
+ownership.
+
+=item umask
+
+A mask of those L</permission bits> that should be forced off when
+creating files or directories, in order to establish a policy of whom
+you'll ordinarily deny access to.  See the L<umask|perlfunc/umask>
+function.
+
+=item unary operator
+
+An operator with only one L</operand>, like C<!> or
+L<chdir|perlfunc/chdir>.  Unary operators are usually prefix
+operators; that is, they precede their operand.  The C<++> and C<-->
+operators can be either prefix or postfix.  (Their position I<does>
+change their meanings.)
+
+=item Unicode
+
+A character set comprising all the major character sets of the world,
+more or less.  See L<http://www.unicode.org>.
+
+=item Unix
+
+A very large and constantly evolving language with several alternative
+and largely incompatible syntaxes, in which anyone can define anything
+any way they choose, and usually do.  Speakers of this language think
+it's easy to learn because it's so easily twisted to one's own ends,
+but dialectical differences make tribal intercommunication nearly
+impossible, and travelers are often reduced to a pidgin-like subset of
+the language.  To be universally understood, a Unix shell programmer
+must spend years of study in the art.  Many have abandoned this
+discipline and now communicate via an Esperanto-like language called
+Perl.
+
+In ancient times, Unix was also used to refer to some code that a
+couple of people at Bell Labs wrote to make use of a PDP-7 computer
+that wasn't doing much of anything else at the time.
+
+=back
+
+=head2 V
+
+=over 4
+
+=item value
+
+An actual piece of data, in contrast to all the variables, references,
+keys, indexes, operators, and whatnot that you need to access the
+value.
+
+=item variable
+
+A named storage location that can hold any of various kinds of
+L</value>, as your program sees fit.
+
+=item variable interpolation
+
+The L</interpolation> of a scalar or array variable into a string.
+
+=item variadic
+
+Said of a L</function> that happily receives an indeterminate number
+of L</actual arguments>.
+
+=item vector
+
+Mathematical jargon for a list of L<scalar values|/scalar value>.
+
+=item virtual
+
+Providing the appearance of something without the reality, as in:
+virtual memory is not real memory.  (See also L</memory>.)  The
+opposite of "virtual" is "transparent", which means providing the
+reality of something without the appearance, as in: Perl handles the
+variable-length UTF-8 character encoding transparently.
+
+=item void context
+
+A form of L</scalar context> in which an L</expression> is not
+expected to return any L</value> at all and is evaluated for its
+L</side effects> alone.
+
+=item v-string
+
+A "version" or "vector" L</string> specified with a C<v> followed by a
+series of decimal integers in dot notation, for instance,
+C<v1.20.300.4000>.  Each number turns into a L</character> with the
+specified ordinal value.  (The C<v> is optional when there are at
+least three integers.)
+
+=back
+
+=head2 W
+
+=over 4
+
+=item warning
+
+A message printed to the L</STDERR> stream to the effect that something
+might be wrong but isn't worth blowing up over.  See L<perlfunc/warn>
+and the L<warnings> pragma.
+
+=item watch expression
+
+An expression which, when its value changes, causes a breakpoint in
+the Perl debugger.
+
+=item whitespace
+
+A L</character> that moves your cursor but doesn't otherwise put
+anything on your screen.  Typically refers to any of: space, tab, line
+feed, carriage return, or form feed.
+
+=item word
+
+In normal "computerese", the piece of data of the size most
+efficiently handled by your computer, typically 32 bits or so, give or
+take a few powers of 2.  In Perl culture, it more often refers to an
+alphanumeric L</identifier> (including underscores), or to a string of
+nonwhitespace L<characters|/character> bounded by whitespace or string
+boundaries.
+
+=item working directory
+
+Your current L</directory>, from which relative pathnames are
+interpreted by the L</operating system>.  The operating system knows
+your current directory because you told it with a
+L<chdir|perlfunc/chdir> or because you started out in the place where
+your parent L</process> was when you were born.
+
+=item wrapper
+
+A program or subroutine that runs some other program or subroutine for
+you, modifying some of its input or output to better suit your
+purposes.
+
+=item WYSIWYG
+
+What You See Is What You Get.  Usually used when something that
+appears on the screen matches how it will eventually look, like Perl's
+L<format|perlfunc/format> declarations.  Also used to mean the
+opposite of magic because everything works exactly as it appears, as
+in the three-argument form of L<open|perlfunc/open>.
+
+=back
+
+=head2 X
+
+=over 4
+
+=item XS
+
+An extraordinarily exported, expeditiously excellent, expressly
+eXternal Subroutine, executed in existing C or C++ or in an exciting
+new extension language called (exasperatingly) XS.  Examine L<perlxs>
+for the exact explanation or L<perlxstut> for an exemplary unexacting
+one.
+
+=item XSUB
+
+An external L</subroutine> defined in L</XS>.
+
+=back
+
+=head2 Y
+
+=over 4
+
+=item yacc
+
+Yet Another Compiler Compiler.  A parser generator without which Perl
+probably would not have existed.  See the file I<perly.y> in the Perl
+source distribution.
+
+=back
+
+=head2 Z
+
+=over 4
+
+=item zero width
+
+A subpattern L</assertion> matching the L</null string> between
+L<characters|/character>.
+
+=item zombie
+
+A process that has died (exited) but whose parent has not yet received
+proper notification of its demise by virtue of having called
+L<wait|perlfunc/wait> or L<waitpid|perlfunc/waitpid>.  If you
+L<fork|perlfunc/fork>, you must clean up after your child processes
+when they exit, or else the process table will fill up and your system
+administrator will Not Be Happy with you.
+
+=back
+
+=head1 AUTHOR AND COPYRIGHT
+
+Based on the Glossary of Programming Perl, Third Edition,
+by Larry Wall, Tom Christiansen & Jon Orwant.
+Copyright (c) 2000, 1996, 1991 O'Reilly Media, Inc.
+This document may be distributed under the same terms as Perl itself.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlgpl.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlgpl.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlgpl.pod	(revision 14489)
@@ -0,0 +1,384 @@
+
+=head1 NAME
+
+perlgpl - the GNU General Public License, version 2
+
+=head1 SYNOPSIS
+
+ You can refer to this document in Pod via "L<perlgpl>"
+ Or you can see this document by entering "perldoc perlgpl"
+
+=cut
+
+# Because the following document's language disallows "changing"
+# it, we haven't gone thru and prettied it up with =item's or
+# anything.  It's good enough the way it is.
+
+=head1 DESCRIPTION
+
+This is B<"The GNU General Public License, version 2">.  It's here so
+that modules, programs, etc., that want to declare this as their
+distribution license, can link to it.
+
+It is also one of the two licenses Perl allows itself to be
+redistributed and/or modified; for the other one, the Perl Artistic
+License, see the L<perlartistic>.
+
+=head1 GNU GENERAL PUBLIC LICENSE
+
+		    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
+
+--
+
+	Appendix: 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.
+
+[End.]
+
+=cut
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlguts.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlguts.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlguts.pod	(revision 14489)
@@ -0,0 +1,2571 @@
+=head1 NAME
+
+perlguts - Introduction to the Perl API
+
+=head1 DESCRIPTION
+
+This document attempts to describe how to use the Perl API, as well as
+to provide some info on the basic workings of the Perl core. It is far
+from complete and probably contains many errors. Please refer any
+questions or comments to the author below.
+
+=head1 Variables
+
+=head2 Datatypes
+
+Perl has three typedefs that handle Perl's three main data types:
+
+    SV  Scalar Value
+    AV  Array Value
+    HV  Hash Value
+
+Each typedef has specific routines that manipulate the various data types.
+
+=head2 What is an "IV"?
+
+Perl uses a special typedef IV which is a simple signed integer type that is
+guaranteed to be large enough to hold a pointer (as well as an integer).
+Additionally, there is the UV, which is simply an unsigned IV.
+
+Perl also uses two special typedefs, I32 and I16, which will always be at
+least 32-bits and 16-bits long, respectively. (Again, there are U32 and U16,
+as well.)  They will usually be exactly 32 and 16 bits long, but on Crays
+they will both be 64 bits.
+
+=head2 Working with SVs
+
+An SV can be created and loaded with one command.  There are five types of
+values that can be loaded: an integer value (IV), an unsigned integer
+value (UV), a double (NV), a string (PV), and another scalar (SV).
+
+The seven routines are:
+
+    SV*  newSViv(IV);
+    SV*  newSVuv(UV);
+    SV*  newSVnv(double);
+    SV*  newSVpv(const char*, STRLEN);
+    SV*  newSVpvn(const char*, STRLEN);
+    SV*  newSVpvf(const char*, ...);
+    SV*  newSVsv(SV*);
+
+C<STRLEN> is an integer type (Size_t, usually defined as size_t in
+F<config.h>) guaranteed to be large enough to represent the size of
+any string that perl can handle.
+
+In the unlikely case of a SV requiring more complex initialisation, you
+can create an empty SV with newSV(len).  If C<len> is 0 an empty SV of
+type NULL is returned, else an SV of type PV is returned with len + 1 (for
+the NUL) bytes of storage allocated, accessible via SvPVX.  In both cases
+the SV has value undef.
+
+    SV *sv = newSV(0);   /* no storage allocated  */
+    SV *sv = newSV(10);  /* 10 (+1) bytes of uninitialised storage allocated  */
+
+To change the value of an I<already-existing> SV, there are eight routines:
+
+    void  sv_setiv(SV*, IV);
+    void  sv_setuv(SV*, UV);
+    void  sv_setnv(SV*, double);
+    void  sv_setpv(SV*, const char*);
+    void  sv_setpvn(SV*, const char*, STRLEN)
+    void  sv_setpvf(SV*, const char*, ...);
+    void  sv_vsetpvfn(SV*, const char*, STRLEN, va_list *, SV **, I32, bool *);
+    void  sv_setsv(SV*, SV*);
+
+Notice that you can choose to specify the length of the string to be
+assigned by using C<sv_setpvn>, C<newSVpvn>, or C<newSVpv>, or you may
+allow Perl to calculate the length by using C<sv_setpv> or by specifying
+0 as the second argument to C<newSVpv>.  Be warned, though, that Perl will
+determine the string's length by using C<strlen>, which depends on the
+string terminating with a NUL character.
+
+The arguments of C<sv_setpvf> are processed like C<sprintf>, and the
+formatted output becomes the value.
+
+C<sv_vsetpvfn> is an analogue of C<vsprintf>, but it allows you to specify
+either a pointer to a variable argument list or the address and length of
+an array of SVs.  The last argument points to a boolean; on return, if that
+boolean is true, then locale-specific information has been used to format
+the string, and the string's contents are therefore untrustworthy (see
+L<perlsec>).  This pointer may be NULL if that information is not
+important.  Note that this function requires you to specify the length of
+the format.
+
+The C<sv_set*()> functions are not generic enough to operate on values
+that have "magic".  See L<Magic Virtual Tables> later in this document.
+
+All SVs that contain strings should be terminated with a NUL character.
+If it is not NUL-terminated there is a risk of
+core dumps and corruptions from code which passes the string to C
+functions or system calls which expect a NUL-terminated string.
+Perl's own functions typically add a trailing NUL for this reason.
+Nevertheless, you should be very careful when you pass a string stored
+in an SV to a C function or system call.
+
+To access the actual value that an SV points to, you can use the macros:
+
+    SvIV(SV*)
+    SvUV(SV*)
+    SvNV(SV*)
+    SvPV(SV*, STRLEN len)
+    SvPV_nolen(SV*)
+
+which will automatically coerce the actual scalar type into an IV, UV, double,
+or string.
+
+In the C<SvPV> macro, the length of the string returned is placed into the
+variable C<len> (this is a macro, so you do I<not> use C<&len>).  If you do
+not care what the length of the data is, use the C<SvPV_nolen> macro.
+Historically the C<SvPV> macro with the global variable C<PL_na> has been
+used in this case.  But that can be quite inefficient because C<PL_na> must
+be accessed in thread-local storage in threaded Perl.  In any case, remember
+that Perl allows arbitrary strings of data that may both contain NULs and
+might not be terminated by a NUL.
+
+Also remember that C doesn't allow you to safely say C<foo(SvPV(s, len),
+len);>. It might work with your compiler, but it won't work for everyone.
+Break this sort of statement up into separate assignments:
+
+    SV *s;
+    STRLEN len;
+    char * ptr;
+    ptr = SvPV(s, len);
+    foo(ptr, len);
+
+If you want to know if the scalar value is TRUE, you can use:
+
+    SvTRUE(SV*)
+
+Although Perl will automatically grow strings for you, if you need to force
+Perl to allocate more memory for your SV, you can use the macro
+
+    SvGROW(SV*, STRLEN newlen)
+
+which will determine if more memory needs to be allocated.  If so, it will
+call the function C<sv_grow>.  Note that C<SvGROW> can only increase, not
+decrease, the allocated memory of an SV and that it does not automatically
+add a byte for the a trailing NUL (perl's own string functions typically do
+C<SvGROW(sv, len + 1)>).
+
+If you have an SV and want to know what kind of data Perl thinks is stored
+in it, you can use the following macros to check the type of SV you have.
+
+    SvIOK(SV*)
+    SvNOK(SV*)
+    SvPOK(SV*)
+
+You can get and set the current length of the string stored in an SV with
+the following macros:
+
+    SvCUR(SV*)
+    SvCUR_set(SV*, I32 val)
+
+You can also get a pointer to the end of the string stored in the SV
+with the macro:
+
+    SvEND(SV*)
+
+But note that these last three macros are valid only if C<SvPOK()> is true.
+
+If you want to append something to the end of string stored in an C<SV*>,
+you can use the following functions:
+
+    void  sv_catpv(SV*, const char*);
+    void  sv_catpvn(SV*, const char*, STRLEN);
+    void  sv_catpvf(SV*, const char*, ...);
+    void  sv_vcatpvfn(SV*, const char*, STRLEN, va_list *, SV **, I32, bool);
+    void  sv_catsv(SV*, SV*);
+
+The first function calculates the length of the string to be appended by
+using C<strlen>.  In the second, you specify the length of the string
+yourself.  The third function processes its arguments like C<sprintf> and
+appends the formatted output.  The fourth function works like C<vsprintf>.
+You can specify the address and length of an array of SVs instead of the
+va_list argument. The fifth function extends the string stored in the first
+SV with the string stored in the second SV.  It also forces the second SV
+to be interpreted as a string.
+
+The C<sv_cat*()> functions are not generic enough to operate on values that
+have "magic".  See L<Magic Virtual Tables> later in this document.
+
+If you know the name of a scalar variable, you can get a pointer to its SV
+by using the following:
+
+    SV*  get_sv("package::varname", FALSE);
+
+This returns NULL if the variable does not exist.
+
+If you want to know if this variable (or any other SV) is actually C<defined>,
+you can call:
+
+    SvOK(SV*)
+
+The scalar C<undef> value is stored in an SV instance called C<PL_sv_undef>.
+
+Its address can be used whenever an C<SV*> is needed. Make sure that
+you don't try to compare a random sv with C<&PL_sv_undef>. For example
+when interfacing Perl code, it'll work correctly for:
+
+  foo(undef);
+
+But won't work when called as:
+
+  $x = undef;
+  foo($x);
+
+So to repeat always use SvOK() to check whether an sv is defined.
+
+Also you have to be careful when using C<&PL_sv_undef> as a value in
+AVs or HVs (see L<AVs, HVs and undefined values>).
+
+There are also the two values C<PL_sv_yes> and C<PL_sv_no>, which contain
+boolean TRUE and FALSE values, respectively.  Like C<PL_sv_undef>, their
+addresses can be used whenever an C<SV*> is needed.
+
+Do not be fooled into thinking that C<(SV *) 0> is the same as C<&PL_sv_undef>.
+Take this code:
+
+    SV* sv = (SV*) 0;
+    if (I-am-to-return-a-real-value) {
+            sv = sv_2mortal(newSViv(42));
+    }
+    sv_setsv(ST(0), sv);
+
+This code tries to return a new SV (which contains the value 42) if it should
+return a real value, or undef otherwise.  Instead it has returned a NULL
+pointer which, somewhere down the line, will cause a segmentation violation,
+bus error, or just weird results.  Change the zero to C<&PL_sv_undef> in the
+first line and all will be well.
+
+To free an SV that you've created, call C<SvREFCNT_dec(SV*)>.  Normally this
+call is not necessary (see L<Reference Counts and Mortality>).
+
+=head2 Offsets
+
+Perl provides the function C<sv_chop> to efficiently remove characters
+from the beginning of a string; you give it an SV and a pointer to
+somewhere inside the PV, and it discards everything before the
+pointer. The efficiency comes by means of a little hack: instead of
+actually removing the characters, C<sv_chop> sets the flag C<OOK>
+(offset OK) to signal to other functions that the offset hack is in
+effect, and it puts the number of bytes chopped off into the IV field
+of the SV. It then moves the PV pointer (called C<SvPVX>) forward that
+many bytes, and adjusts C<SvCUR> and C<SvLEN>.
+
+Hence, at this point, the start of the buffer that we allocated lives
+at C<SvPVX(sv) - SvIV(sv)> in memory and the PV pointer is pointing
+into the middle of this allocated storage.
+
+This is best demonstrated by example:
+
+  % ./perl -Ilib -MDevel::Peek -le '$a="12345"; $a=~s/.//; Dump($a)'
+  SV = PVIV(0x8128450) at 0x81340f0
+    REFCNT = 1
+    FLAGS = (POK,OOK,pPOK)
+    IV = 1  (OFFSET)
+    PV = 0x8135781 ( "1" . ) "2345"\0
+    CUR = 4
+    LEN = 5
+
+Here the number of bytes chopped off (1) is put into IV, and
+C<Devel::Peek::Dump> helpfully reminds us that this is an offset. The
+portion of the string between the "real" and the "fake" beginnings is
+shown in parentheses, and the values of C<SvCUR> and C<SvLEN> reflect
+the fake beginning, not the real one.
+
+Something similar to the offset hack is performed on AVs to enable
+efficient shifting and splicing off the beginning of the array; while
+C<AvARRAY> points to the first element in the array that is visible from
+Perl, C<AvALLOC> points to the real start of the C array. These are
+usually the same, but a C<shift> operation can be carried out by
+increasing C<AvARRAY> by one and decreasing C<AvFILL> and C<AvLEN>.
+Again, the location of the real start of the C array only comes into
+play when freeing the array. See C<av_shift> in F<av.c>.
+
+=head2 What's Really Stored in an SV?
+
+Recall that the usual method of determining the type of scalar you have is
+to use C<Sv*OK> macros.  Because a scalar can be both a number and a string,
+usually these macros will always return TRUE and calling the C<Sv*V>
+macros will do the appropriate conversion of string to integer/double or
+integer/double to string.
+
+If you I<really> need to know if you have an integer, double, or string
+pointer in an SV, you can use the following three macros instead:
+
+    SvIOKp(SV*)
+    SvNOKp(SV*)
+    SvPOKp(SV*)
+
+These will tell you if you truly have an integer, double, or string pointer
+stored in your SV.  The "p" stands for private.
+
+The are various ways in which the private and public flags may differ.
+For example, a tied SV may have a valid underlying value in the IV slot
+(so SvIOKp is true), but the data should be accessed via the FETCH
+routine rather than directly, so SvIOK is false. Another is when
+numeric conversion has occurred and precision has been lost: only the
+private flag is set on 'lossy' values. So when an NV is converted to an
+IV with loss, SvIOKp, SvNOKp and SvNOK will be set, while SvIOK wont be.
+
+In general, though, it's best to use the C<Sv*V> macros.
+
+=head2 Working with AVs
+
+There are two ways to create and load an AV.  The first method creates an
+empty AV:
+
+    AV*  newAV();
+
+The second method both creates the AV and initially populates it with SVs:
+
+    AV*  av_make(I32 num, SV **ptr);
+
+The second argument points to an array containing C<num> C<SV*>'s.  Once the
+AV has been created, the SVs can be destroyed, if so desired.
+
+Once the AV has been created, the following operations are possible on AVs:
+
+    void  av_push(AV*, SV*);
+    SV*   av_pop(AV*);
+    SV*   av_shift(AV*);
+    void  av_unshift(AV*, I32 num);
+
+These should be familiar operations, with the exception of C<av_unshift>.
+This routine adds C<num> elements at the front of the array with the C<undef>
+value.  You must then use C<av_store> (described below) to assign values
+to these new elements.
+
+Here are some other functions:
+
+    I32   av_len(AV*);
+    SV**  av_fetch(AV*, I32 key, I32 lval);
+    SV**  av_store(AV*, I32 key, SV* val);
+
+The C<av_len> function returns the highest index value in array (just
+like $#array in Perl).  If the array is empty, -1 is returned.  The
+C<av_fetch> function returns the value at index C<key>, but if C<lval>
+is non-zero, then C<av_fetch> will store an undef value at that index.
+The C<av_store> function stores the value C<val> at index C<key>, and does
+not increment the reference count of C<val>.  Thus the caller is responsible
+for taking care of that, and if C<av_store> returns NULL, the caller will
+have to decrement the reference count to avoid a memory leak.  Note that
+C<av_fetch> and C<av_store> both return C<SV**>'s, not C<SV*>'s as their
+return value.
+
+    void  av_clear(AV*);
+    void  av_undef(AV*);
+    void  av_extend(AV*, I32 key);
+
+The C<av_clear> function deletes all the elements in the AV* array, but
+does not actually delete the array itself.  The C<av_undef> function will
+delete all the elements in the array plus the array itself.  The
+C<av_extend> function extends the array so that it contains at least C<key+1>
+elements.  If C<key+1> is less than the currently allocated length of the array,
+then nothing is done.
+
+If you know the name of an array variable, you can get a pointer to its AV
+by using the following:
+
+    AV*  get_av("package::varname", FALSE);
+
+This returns NULL if the variable does not exist.
+
+See L<Understanding the Magic of Tied Hashes and Arrays> for more
+information on how to use the array access functions on tied arrays.
+
+=head2 Working with HVs
+
+To create an HV, you use the following routine:
+
+    HV*  newHV();
+
+Once the HV has been created, the following operations are possible on HVs:
+
+    SV**  hv_store(HV*, const char* key, U32 klen, SV* val, U32 hash);
+    SV**  hv_fetch(HV*, const char* key, U32 klen, I32 lval);
+
+The C<klen> parameter is the length of the key being passed in (Note that
+you cannot pass 0 in as a value of C<klen> to tell Perl to measure the
+length of the key).  The C<val> argument contains the SV pointer to the
+scalar being stored, and C<hash> is the precomputed hash value (zero if
+you want C<hv_store> to calculate it for you).  The C<lval> parameter
+indicates whether this fetch is actually a part of a store operation, in
+which case a new undefined value will be added to the HV with the supplied
+key and C<hv_fetch> will return as if the value had already existed.
+
+Remember that C<hv_store> and C<hv_fetch> return C<SV**>'s and not just
+C<SV*>.  To access the scalar value, you must first dereference the return
+value.  However, you should check to make sure that the return value is
+not NULL before dereferencing it.
+
+These two functions check if a hash table entry exists, and deletes it.
+
+    bool  hv_exists(HV*, const char* key, U32 klen);
+    SV*   hv_delete(HV*, const char* key, U32 klen, I32 flags);
+
+If C<flags> does not include the C<G_DISCARD> flag then C<hv_delete> will
+create and return a mortal copy of the deleted value.
+
+And more miscellaneous functions:
+
+    void   hv_clear(HV*);
+    void   hv_undef(HV*);
+
+Like their AV counterparts, C<hv_clear> deletes all the entries in the hash
+table but does not actually delete the hash table.  The C<hv_undef> deletes
+both the entries and the hash table itself.
+
+Perl keeps the actual data in linked list of structures with a typedef of HE.
+These contain the actual key and value pointers (plus extra administrative
+overhead).  The key is a string pointer; the value is an C<SV*>.  However,
+once you have an C<HE*>, to get the actual key and value, use the routines
+specified below.
+
+    I32    hv_iterinit(HV*);
+            /* Prepares starting point to traverse hash table */
+    HE*    hv_iternext(HV*);
+            /* Get the next entry, and return a pointer to a
+               structure that has both the key and value */
+    char*  hv_iterkey(HE* entry, I32* retlen);
+            /* Get the key from an HE structure and also return
+               the length of the key string */
+    SV*    hv_iterval(HV*, HE* entry);
+            /* Return an SV pointer to the value of the HE
+               structure */
+    SV*    hv_iternextsv(HV*, char** key, I32* retlen);
+            /* This convenience routine combines hv_iternext,
+	       hv_iterkey, and hv_iterval.  The key and retlen
+	       arguments are return values for the key and its
+	       length.  The value is returned in the SV* argument */
+
+If you know the name of a hash variable, you can get a pointer to its HV
+by using the following:
+
+    HV*  get_hv("package::varname", FALSE);
+
+This returns NULL if the variable does not exist.
+
+The hash algorithm is defined in the C<PERL_HASH(hash, key, klen)> macro:
+
+    hash = 0;
+    while (klen--)
+	hash = (hash * 33) + *key++;
+    hash = hash + (hash >> 5);			/* after 5.6 */
+
+The last step was added in version 5.6 to improve distribution of
+lower bits in the resulting hash value.
+
+See L<Understanding the Magic of Tied Hashes and Arrays> for more
+information on how to use the hash access functions on tied hashes.
+
+=head2 Hash API Extensions
+
+Beginning with version 5.004, the following functions are also supported:
+
+    HE*     hv_fetch_ent  (HV* tb, SV* key, I32 lval, U32 hash);
+    HE*     hv_store_ent  (HV* tb, SV* key, SV* val, U32 hash);
+
+    bool    hv_exists_ent (HV* tb, SV* key, U32 hash);
+    SV*     hv_delete_ent (HV* tb, SV* key, I32 flags, U32 hash);
+
+    SV*     hv_iterkeysv  (HE* entry);
+
+Note that these functions take C<SV*> keys, which simplifies writing
+of extension code that deals with hash structures.  These functions
+also allow passing of C<SV*> keys to C<tie> functions without forcing
+you to stringify the keys (unlike the previous set of functions).
+
+They also return and accept whole hash entries (C<HE*>), making their
+use more efficient (since the hash number for a particular string
+doesn't have to be recomputed every time).  See L<perlapi> for detailed
+descriptions.
+
+The following macros must always be used to access the contents of hash
+entries.  Note that the arguments to these macros must be simple
+variables, since they may get evaluated more than once.  See
+L<perlapi> for detailed descriptions of these macros.
+
+    HePV(HE* he, STRLEN len)
+    HeVAL(HE* he)
+    HeHASH(HE* he)
+    HeSVKEY(HE* he)
+    HeSVKEY_force(HE* he)
+    HeSVKEY_set(HE* he, SV* sv)
+
+These two lower level macros are defined, but must only be used when
+dealing with keys that are not C<SV*>s:
+
+    HeKEY(HE* he)
+    HeKLEN(HE* he)
+
+Note that both C<hv_store> and C<hv_store_ent> do not increment the
+reference count of the stored C<val>, which is the caller's responsibility.
+If these functions return a NULL value, the caller will usually have to
+decrement the reference count of C<val> to avoid a memory leak.
+
+=head2 AVs, HVs and undefined values
+
+Sometimes you have to store undefined values in AVs or HVs. Although
+this may be a rare case, it can be tricky. That's because you're
+used to using C<&PL_sv_undef> if you need an undefined SV.
+
+For example, intuition tells you that this XS code:
+
+    AV *av = newAV();
+    av_store( av, 0, &PL_sv_undef );
+
+is equivalent to this Perl code:
+
+    my @av;
+    $av[0] = undef;
+
+Unfortunately, this isn't true. AVs use C<&PL_sv_undef> as a marker
+for indicating that an array element has not yet been initialized.
+Thus, C<exists $av[0]> would be true for the above Perl code, but
+false for the array generated by the XS code.
+
+Other problems can occur when storing C<&PL_sv_undef> in HVs:
+
+    hv_store( hv, "key", 3, &PL_sv_undef, 0 );
+
+This will indeed make the value C<undef>, but if you try to modify
+the value of C<key>, you'll get the following error:
+
+    Modification of non-creatable hash value attempted
+
+In perl 5.8.0, C<&PL_sv_undef> was also used to mark placeholders
+in restricted hashes. This caused such hash entries not to appear
+when iterating over the hash or when checking for the keys
+with the C<hv_exists> function.
+
+You can run into similar problems when you store C<&PL_sv_true> or
+C<&PL_sv_false> into AVs or HVs. Trying to modify such elements
+will give you the following error:
+
+    Modification of a read-only value attempted
+
+To make a long story short, you can use the special variables
+C<&PL_sv_undef>, C<&PL_sv_true> and C<&PL_sv_false> with AVs and
+HVs, but you have to make sure you know what you're doing.
+
+Generally, if you want to store an undefined value in an AV
+or HV, you should not use C<&PL_sv_undef>, but rather create a
+new undefined value using the C<newSV> function, for example:
+
+    av_store( av, 42, newSV(0) );
+    hv_store( hv, "foo", 3, newSV(0), 0 );
+
+=head2 References
+
+References are a special type of scalar that point to other data types
+(including references).
+
+To create a reference, use either of the following functions:
+
+    SV* newRV_inc((SV*) thing);
+    SV* newRV_noinc((SV*) thing);
+
+The C<thing> argument can be any of an C<SV*>, C<AV*>, or C<HV*>.  The
+functions are identical except that C<newRV_inc> increments the reference
+count of the C<thing>, while C<newRV_noinc> does not.  For historical
+reasons, C<newRV> is a synonym for C<newRV_inc>.
+
+Once you have a reference, you can use the following macro to dereference
+the reference:
+
+    SvRV(SV*)
+
+then call the appropriate routines, casting the returned C<SV*> to either an
+C<AV*> or C<HV*>, if required.
+
+To determine if an SV is a reference, you can use the following macro:
+
+    SvROK(SV*)
+
+To discover what type of value the reference refers to, use the following
+macro and then check the return value.
+
+    SvTYPE(SvRV(SV*))
+
+The most useful types that will be returned are:
+
+    SVt_IV    Scalar
+    SVt_NV    Scalar
+    SVt_PV    Scalar
+    SVt_RV    Scalar
+    SVt_PVAV  Array
+    SVt_PVHV  Hash
+    SVt_PVCV  Code
+    SVt_PVGV  Glob (possible a file handle)
+    SVt_PVMG  Blessed or Magical Scalar
+
+    See the sv.h header file for more details.
+
+=head2 Blessed References and Class Objects
+
+References are also used to support object-oriented programming.  In perl's
+OO lexicon, an object is simply a reference that has been blessed into a
+package (or class).  Once blessed, the programmer may now use the reference
+to access the various methods in the class.
+
+A reference can be blessed into a package with the following function:
+
+    SV* sv_bless(SV* sv, HV* stash);
+
+The C<sv> argument must be a reference value.  The C<stash> argument
+specifies which class the reference will belong to.  See
+L<Stashes and Globs> for information on converting class names into stashes.
+
+/* Still under construction */
+
+Upgrades rv to reference if not already one.  Creates new SV for rv to
+point to.  If C<classname> is non-null, the SV is blessed into the specified
+class.  SV is returned.
+
+	SV* newSVrv(SV* rv, const char* classname);
+
+Copies integer, unsigned integer or double into an SV whose reference is C<rv>.  SV is blessed
+if C<classname> is non-null.
+
+	SV* sv_setref_iv(SV* rv, const char* classname, IV iv);
+	SV* sv_setref_uv(SV* rv, const char* classname, UV uv);
+	SV* sv_setref_nv(SV* rv, const char* classname, NV iv);
+
+Copies the pointer value (I<the address, not the string!>) into an SV whose
+reference is rv.  SV is blessed if C<classname> is non-null.
+
+	SV* sv_setref_pv(SV* rv, const char* classname, PV iv);
+
+Copies string into an SV whose reference is C<rv>.  Set length to 0 to let
+Perl calculate the string length.  SV is blessed if C<classname> is non-null.
+
+	SV* sv_setref_pvn(SV* rv, const char* classname, PV iv, STRLEN length);
+
+Tests whether the SV is blessed into the specified class.  It does not
+check inheritance relationships.
+
+	int  sv_isa(SV* sv, const char* name);
+
+Tests whether the SV is a reference to a blessed object.
+
+	int  sv_isobject(SV* sv);
+
+Tests whether the SV is derived from the specified class. SV can be either
+a reference to a blessed object or a string containing a class name. This
+is the function implementing the C<UNIVERSAL::isa> functionality.
+
+	bool sv_derived_from(SV* sv, const char* name);
+
+To check if you've got an object derived from a specific class you have
+to write:
+
+	if (sv_isobject(sv) && sv_derived_from(sv, class)) { ... }
+
+=head2 Creating New Variables
+
+To create a new Perl variable with an undef value which can be accessed from
+your Perl script, use the following routines, depending on the variable type.
+
+    SV*  get_sv("package::varname", TRUE);
+    AV*  get_av("package::varname", TRUE);
+    HV*  get_hv("package::varname", TRUE);
+
+Notice the use of TRUE as the second parameter.  The new variable can now
+be set, using the routines appropriate to the data type.
+
+There are additional macros whose values may be bitwise OR'ed with the
+C<TRUE> argument to enable certain extra features.  Those bits are:
+
+=over
+
+=item GV_ADDMULTI
+
+Marks the variable as multiply defined, thus preventing the:
+
+  Name <varname> used only once: possible typo
+
+warning.
+
+=item GV_ADDWARN
+
+Issues the warning:
+
+  Had to create <varname> unexpectedly
+
+if the variable did not exist before the function was called.
+
+=back
+
+If you do not specify a package name, the variable is created in the current
+package.
+
+=head2 Reference Counts and Mortality
+
+Perl uses a reference count-driven garbage collection mechanism. SVs,
+AVs, or HVs (xV for short in the following) start their life with a
+reference count of 1.  If the reference count of an xV ever drops to 0,
+then it will be destroyed and its memory made available for reuse.
+
+This normally doesn't happen at the Perl level unless a variable is
+undef'ed or the last variable holding a reference to it is changed or
+overwritten.  At the internal level, however, reference counts can be
+manipulated with the following macros:
+
+    int SvREFCNT(SV* sv);
+    SV* SvREFCNT_inc(SV* sv);
+    void SvREFCNT_dec(SV* sv);
+
+However, there is one other function which manipulates the reference
+count of its argument.  The C<newRV_inc> function, you will recall,
+creates a reference to the specified argument.  As a side effect,
+it increments the argument's reference count.  If this is not what
+you want, use C<newRV_noinc> instead.
+
+For example, imagine you want to return a reference from an XSUB function.
+Inside the XSUB routine, you create an SV which initially has a reference
+count of one.  Then you call C<newRV_inc>, passing it the just-created SV.
+This returns the reference as a new SV, but the reference count of the
+SV you passed to C<newRV_inc> has been incremented to two.  Now you
+return the reference from the XSUB routine and forget about the SV.
+But Perl hasn't!  Whenever the returned reference is destroyed, the
+reference count of the original SV is decreased to one and nothing happens.
+The SV will hang around without any way to access it until Perl itself
+terminates.  This is a memory leak.
+
+The correct procedure, then, is to use C<newRV_noinc> instead of
+C<newRV_inc>.  Then, if and when the last reference is destroyed,
+the reference count of the SV will go to zero and it will be destroyed,
+stopping any memory leak.
+
+There are some convenience functions available that can help with the
+destruction of xVs.  These functions introduce the concept of "mortality".
+An xV that is mortal has had its reference count marked to be decremented,
+but not actually decremented, until "a short time later".  Generally the
+term "short time later" means a single Perl statement, such as a call to
+an XSUB function.  The actual determinant for when mortal xVs have their
+reference count decremented depends on two macros, SAVETMPS and FREETMPS.
+See L<perlcall> and L<perlxs> for more details on these macros.
+
+"Mortalization" then is at its simplest a deferred C<SvREFCNT_dec>.
+However, if you mortalize a variable twice, the reference count will
+later be decremented twice.
+
+"Mortal" SVs are mainly used for SVs that are placed on perl's stack.
+For example an SV which is created just to pass a number to a called sub
+is made mortal to have it cleaned up automatically when it's popped off
+the stack. Similarly, results returned by XSUBs (which are pushed on the
+stack) are often made mortal.
+
+To create a mortal variable, use the functions:
+
+    SV*  sv_newmortal()
+    SV*  sv_2mortal(SV*)
+    SV*  sv_mortalcopy(SV*)
+
+The first call creates a mortal SV (with no value), the second converts an existing
+SV to a mortal SV (and thus defers a call to C<SvREFCNT_dec>), and the
+third creates a mortal copy of an existing SV.
+Because C<sv_newmortal> gives the new SV no value,it must normally be given one
+via C<sv_setpv>, C<sv_setiv>, etc. :
+
+    SV *tmp = sv_newmortal();
+    sv_setiv(tmp, an_integer);
+
+As that is multiple C statements it is quite common so see this idiom instead:
+
+    SV *tmp = sv_2mortal(newSViv(an_integer));
+
+
+You should be careful about creating mortal variables.  Strange things
+can happen if you make the same value mortal within multiple contexts,
+or if you make a variable mortal multiple times. Thinking of "Mortalization"
+as deferred C<SvREFCNT_dec> should help to minimize such problems.
+For example if you are passing an SV which you I<know> has high enough REFCNT
+to survive its use on the stack you need not do any mortalization.
+If you are not sure then doing an C<SvREFCNT_inc> and C<sv_2mortal>, or
+making a C<sv_mortalcopy> is safer.
+
+The mortal routines are not just for SVs -- AVs and HVs can be
+made mortal by passing their address (type-casted to C<SV*>) to the
+C<sv_2mortal> or C<sv_mortalcopy> routines.
+
+=head2 Stashes and Globs
+
+A B<stash> is a hash that contains all variables that are defined
+within a package.  Each key of the stash is a symbol
+name (shared by all the different types of objects that have the same
+name), and each value in the hash table is a GV (Glob Value).  This GV
+in turn contains references to the various objects of that name,
+including (but not limited to) the following:
+
+    Scalar Value
+    Array Value
+    Hash Value
+    I/O Handle
+    Format
+    Subroutine
+
+There is a single stash called C<PL_defstash> that holds the items that exist
+in the C<main> package.  To get at the items in other packages, append the
+string "::" to the package name.  The items in the C<Foo> package are in
+the stash C<Foo::> in PL_defstash.  The items in the C<Bar::Baz> package are
+in the stash C<Baz::> in C<Bar::>'s stash.
+
+To get the stash pointer for a particular package, use the function:
+
+    HV*  gv_stashpv(const char* name, I32 create)
+    HV*  gv_stashsv(SV*, I32 create)
+
+The first function takes a literal string, the second uses the string stored
+in the SV.  Remember that a stash is just a hash table, so you get back an
+C<HV*>.  The C<create> flag will create a new package if it is set.
+
+The name that C<gv_stash*v> wants is the name of the package whose symbol table
+you want.  The default package is called C<main>.  If you have multiply nested
+packages, pass their names to C<gv_stash*v>, separated by C<::> as in the Perl
+language itself.
+
+Alternately, if you have an SV that is a blessed reference, you can find
+out the stash pointer by using:
+
+    HV*  SvSTASH(SvRV(SV*));
+
+then use the following to get the package name itself:
+
+    char*  HvNAME(HV* stash);
+
+If you need to bless or re-bless an object you can use the following
+function:
+
+    SV*  sv_bless(SV*, HV* stash)
+
+where the first argument, an C<SV*>, must be a reference, and the second
+argument is a stash.  The returned C<SV*> can now be used in the same way
+as any other SV.
+
+For more information on references and blessings, consult L<perlref>.
+
+=head2 Double-Typed SVs
+
+Scalar variables normally contain only one type of value, an integer,
+double, pointer, or reference.  Perl will automatically convert the
+actual scalar data from the stored type into the requested type.
+
+Some scalar variables contain more than one type of scalar data.  For
+example, the variable C<$!> contains either the numeric value of C<errno>
+or its string equivalent from either C<strerror> or C<sys_errlist[]>.
+
+To force multiple data values into an SV, you must do two things: use the
+C<sv_set*v> routines to add the additional scalar type, then set a flag
+so that Perl will believe it contains more than one type of data.  The
+four macros to set the flags are:
+
+	SvIOK_on
+	SvNOK_on
+	SvPOK_on
+	SvROK_on
+
+The particular macro you must use depends on which C<sv_set*v> routine
+you called first.  This is because every C<sv_set*v> routine turns on
+only the bit for the particular type of data being set, and turns off
+all the rest.
+
+For example, to create a new Perl variable called "dberror" that contains
+both the numeric and descriptive string error values, you could use the
+following code:
+
+    extern int  dberror;
+    extern char *dberror_list;
+
+    SV* sv = get_sv("dberror", TRUE);
+    sv_setiv(sv, (IV) dberror);
+    sv_setpv(sv, dberror_list[dberror]);
+    SvIOK_on(sv);
+
+If the order of C<sv_setiv> and C<sv_setpv> had been reversed, then the
+macro C<SvPOK_on> would need to be called instead of C<SvIOK_on>.
+
+=head2 Magic Variables
+
+[This section still under construction.  Ignore everything here.  Post no
+bills.  Everything not permitted is forbidden.]
+
+Any SV may be magical, that is, it has special features that a normal
+SV does not have.  These features are stored in the SV structure in a
+linked list of C<struct magic>'s, typedef'ed to C<MAGIC>.
+
+    struct magic {
+        MAGIC*      mg_moremagic;
+        MGVTBL*     mg_virtual;
+        U16         mg_private;
+        char        mg_type;
+        U8          mg_flags;
+        SV*         mg_obj;
+        char*       mg_ptr;
+        I32         mg_len;
+    };
+
+Note this is current as of patchlevel 0, and could change at any time.
+
+=head2 Assigning Magic
+
+Perl adds magic to an SV using the sv_magic function:
+
+    void sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen);
+
+The C<sv> argument is a pointer to the SV that is to acquire a new magical
+feature.
+
+If C<sv> is not already magical, Perl uses the C<SvUPGRADE> macro to
+convert C<sv> to type C<SVt_PVMG>. Perl then continues by adding new magic
+to the beginning of the linked list of magical features.  Any prior entry
+of the same type of magic is deleted.  Note that this can be overridden,
+and multiple instances of the same type of magic can be associated with an
+SV.
+
+The C<name> and C<namlen> arguments are used to associate a string with
+the magic, typically the name of a variable. C<namlen> is stored in the
+C<mg_len> field and if C<name> is non-null then either a C<savepvn> copy of
+C<name> or C<name> itself is stored in the C<mg_ptr> field, depending on
+whether C<namlen> is greater than zero or equal to zero respectively.  As a
+special case, if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
+to contain an C<SV*> and is stored as-is with its REFCNT incremented.
+
+The sv_magic function uses C<how> to determine which, if any, predefined
+"Magic Virtual Table" should be assigned to the C<mg_virtual> field.
+See the L<Magic Virtual Tables> section below.  The C<how> argument is also
+stored in the C<mg_type> field. The value of C<how> should be chosen
+from the set of macros C<PERL_MAGIC_foo> found in F<perl.h>. Note that before
+these macros were added, Perl internals used to directly use character
+literals, so you may occasionally come across old code or documentation
+referring to 'U' magic rather than C<PERL_MAGIC_uvar> for example.
+
+The C<obj> argument is stored in the C<mg_obj> field of the C<MAGIC>
+structure.  If it is not the same as the C<sv> argument, the reference
+count of the C<obj> object is incremented.  If it is the same, or if
+the C<how> argument is C<PERL_MAGIC_arylen>, or if it is a NULL pointer,
+then C<obj> is merely stored, without the reference count being incremented.
+
+See also C<sv_magicext> in L<perlapi> for a more flexible way to add magic
+to an SV.
+
+There is also a function to add magic to an C<HV>:
+
+    void hv_magic(HV *hv, GV *gv, int how);
+
+This simply calls C<sv_magic> and coerces the C<gv> argument into an C<SV>.
+
+To remove the magic from an SV, call the function sv_unmagic:
+
+    void sv_unmagic(SV *sv, int type);
+
+The C<type> argument should be equal to the C<how> value when the C<SV>
+was initially made magical.
+
+=head2 Magic Virtual Tables
+
+The C<mg_virtual> field in the C<MAGIC> structure is a pointer to an
+C<MGVTBL>, which is a structure of function pointers and stands for
+"Magic Virtual Table" to handle the various operations that might be
+applied to that variable.
+
+The C<MGVTBL> has five pointers to the following routine types:
+
+    int  (*svt_get)(SV* sv, MAGIC* mg);
+    int  (*svt_set)(SV* sv, MAGIC* mg);
+    U32  (*svt_len)(SV* sv, MAGIC* mg);
+    int  (*svt_clear)(SV* sv, MAGIC* mg);
+    int  (*svt_free)(SV* sv, MAGIC* mg);
+
+This MGVTBL structure is set at compile-time in F<perl.h> and there are
+currently 19 types (or 21 with overloading turned on).  These different
+structures contain pointers to various routines that perform additional
+actions depending on which function is being called.
+
+    Function pointer    Action taken
+    ----------------    ------------
+    svt_get             Do something before the value of the SV is retrieved.
+    svt_set             Do something after the SV is assigned a value.
+    svt_len             Report on the SV's length.
+    svt_clear		Clear something the SV represents.
+    svt_free            Free any extra storage associated with the SV.
+
+For instance, the MGVTBL structure called C<vtbl_sv> (which corresponds
+to an C<mg_type> of C<PERL_MAGIC_sv>) contains:
+
+    { magic_get, magic_set, magic_len, 0, 0 }
+
+Thus, when an SV is determined to be magical and of type C<PERL_MAGIC_sv>,
+if a get operation is being performed, the routine C<magic_get> is
+called.  All the various routines for the various magical types begin
+with C<magic_>.  NOTE: the magic routines are not considered part of
+the Perl API, and may not be exported by the Perl library.
+
+The current kinds of Magic Virtual Tables are:
+
+    mg_type
+    (old-style char and macro)   MGVTBL         Type of magic
+    --------------------------   ------         ----------------------------
+    \0 PERL_MAGIC_sv             vtbl_sv        Special scalar variable
+    A  PERL_MAGIC_overload       vtbl_amagic    %OVERLOAD hash
+    a  PERL_MAGIC_overload_elem  vtbl_amagicelem %OVERLOAD hash element
+    c  PERL_MAGIC_overload_table (none)         Holds overload table (AMT)
+						on stash
+    B  PERL_MAGIC_bm             vtbl_bm        Boyer-Moore (fast string search)
+    D  PERL_MAGIC_regdata        vtbl_regdata   Regex match position data
+						(@+ and @- vars)
+    d  PERL_MAGIC_regdatum       vtbl_regdatum  Regex match position data
+						element
+    E  PERL_MAGIC_env            vtbl_env       %ENV hash
+    e  PERL_MAGIC_envelem        vtbl_envelem   %ENV hash element
+    f  PERL_MAGIC_fm             vtbl_fm        Formline ('compiled' format)
+    g  PERL_MAGIC_regex_global   vtbl_mglob     m//g target / study()ed string
+    I  PERL_MAGIC_isa            vtbl_isa       @ISA array
+    i  PERL_MAGIC_isaelem        vtbl_isaelem   @ISA array element
+    k  PERL_MAGIC_nkeys          vtbl_nkeys     scalar(keys()) lvalue
+    L  PERL_MAGIC_dbfile         (none)         Debugger %_<filename
+    l  PERL_MAGIC_dbline         vtbl_dbline    Debugger %_<filename element
+    m  PERL_MAGIC_mutex          vtbl_mutex     ???
+    o  PERL_MAGIC_collxfrm       vtbl_collxfrm  Locale collate transformation
+    P  PERL_MAGIC_tied           vtbl_pack      Tied array or hash
+    p  PERL_MAGIC_tiedelem       vtbl_packelem  Tied array or hash element
+    q  PERL_MAGIC_tiedscalar     vtbl_packelem  Tied scalar or handle
+    r  PERL_MAGIC_qr             vtbl_qr        precompiled qr// regex
+    S  PERL_MAGIC_sig            vtbl_sig       %SIG hash
+    s  PERL_MAGIC_sigelem        vtbl_sigelem   %SIG hash element
+    t  PERL_MAGIC_taint          vtbl_taint     Taintedness
+    U  PERL_MAGIC_uvar           vtbl_uvar      Available for use by extensions
+    v  PERL_MAGIC_vec            vtbl_vec       vec() lvalue
+    V  PERL_MAGIC_vstring        (none)         v-string scalars
+    w  PERL_MAGIC_utf8           vtbl_utf8      UTF-8 length+offset cache
+    x  PERL_MAGIC_substr         vtbl_substr    substr() lvalue
+    y  PERL_MAGIC_defelem        vtbl_defelem   Shadow "foreach" iterator
+						variable / smart parameter
+						vivification
+    *  PERL_MAGIC_glob           vtbl_glob      GV (typeglob)
+    #  PERL_MAGIC_arylen         vtbl_arylen    Array length ($#ary)
+    .  PERL_MAGIC_pos            vtbl_pos       pos() lvalue
+    <  PERL_MAGIC_backref        vtbl_backref   ???
+    ~  PERL_MAGIC_ext            (none)         Available for use by extensions
+
+When an uppercase and lowercase letter both exist in the table, then the
+uppercase letter is typically used to represent some kind of composite type
+(a list or a hash), and the lowercase letter is used to represent an element
+of that composite type. Some internals code makes use of this case
+relationship.  However, 'v' and 'V' (vec and v-string) are in no way related.
+
+The C<PERL_MAGIC_ext> and C<PERL_MAGIC_uvar> magic types are defined
+specifically for use by extensions and will not be used by perl itself.
+Extensions can use C<PERL_MAGIC_ext> magic to 'attach' private information
+to variables (typically objects).  This is especially useful because
+there is no way for normal perl code to corrupt this private information
+(unlike using extra elements of a hash object).
+
+Similarly, C<PERL_MAGIC_uvar> magic can be used much like tie() to call a
+C function any time a scalar's value is used or changed.  The C<MAGIC>'s
+C<mg_ptr> field points to a C<ufuncs> structure:
+
+    struct ufuncs {
+        I32 (*uf_val)(pTHX_ IV, SV*);
+        I32 (*uf_set)(pTHX_ IV, SV*);
+        IV uf_index;
+    };
+
+When the SV is read from or written to, the C<uf_val> or C<uf_set>
+function will be called with C<uf_index> as the first arg and a pointer to
+the SV as the second.  A simple example of how to add C<PERL_MAGIC_uvar>
+magic is shown below.  Note that the ufuncs structure is copied by
+sv_magic, so you can safely allocate it on the stack.
+
+    void
+    Umagic(sv)
+        SV *sv;
+    PREINIT:
+        struct ufuncs uf;
+    CODE:
+        uf.uf_val   = &my_get_fn;
+        uf.uf_set   = &my_set_fn;
+        uf.uf_index = 0;
+        sv_magic(sv, 0, PERL_MAGIC_uvar, (char*)&uf, sizeof(uf));
+
+Note that because multiple extensions may be using C<PERL_MAGIC_ext>
+or C<PERL_MAGIC_uvar> magic, it is important for extensions to take
+extra care to avoid conflict.  Typically only using the magic on
+objects blessed into the same class as the extension is sufficient.
+For C<PERL_MAGIC_ext> magic, it may also be appropriate to add an I32
+'signature' at the top of the private data area and check that.
+
+Also note that the C<sv_set*()> and C<sv_cat*()> functions described
+earlier do B<not> invoke 'set' magic on their targets.  This must
+be done by the user either by calling the C<SvSETMAGIC()> macro after
+calling these functions, or by using one of the C<sv_set*_mg()> or
+C<sv_cat*_mg()> functions.  Similarly, generic C code must call the
+C<SvGETMAGIC()> macro to invoke any 'get' magic if they use an SV
+obtained from external sources in functions that don't handle magic.
+See L<perlapi> for a description of these functions.
+For example, calls to the C<sv_cat*()> functions typically need to be
+followed by C<SvSETMAGIC()>, but they don't need a prior C<SvGETMAGIC()>
+since their implementation handles 'get' magic.
+
+=head2 Finding Magic
+
+    MAGIC* mg_find(SV*, int type); /* Finds the magic pointer of that type */
+
+This routine returns a pointer to the C<MAGIC> structure stored in the SV.
+If the SV does not have that magical feature, C<NULL> is returned.  Also,
+if the SV is not of type SVt_PVMG, Perl may core dump.
+
+    int mg_copy(SV* sv, SV* nsv, const char* key, STRLEN klen);
+
+This routine checks to see what types of magic C<sv> has.  If the mg_type
+field is an uppercase letter, then the mg_obj is copied to C<nsv>, but
+the mg_type field is changed to be the lowercase letter.
+
+=head2 Understanding the Magic of Tied Hashes and Arrays
+
+Tied hashes and arrays are magical beasts of the C<PERL_MAGIC_tied>
+magic type.
+
+WARNING: As of the 5.004 release, proper usage of the array and hash
+access functions requires understanding a few caveats.  Some
+of these caveats are actually considered bugs in the API, to be fixed
+in later releases, and are bracketed with [MAYCHANGE] below. If
+you find yourself actually applying such information in this section, be
+aware that the behavior may change in the future, umm, without warning.
+
+The perl tie function associates a variable with an object that implements
+the various GET, SET, etc methods.  To perform the equivalent of the perl
+tie function from an XSUB, you must mimic this behaviour.  The code below
+carries out the necessary steps - firstly it creates a new hash, and then
+creates a second hash which it blesses into the class which will implement
+the tie methods. Lastly it ties the two hashes together, and returns a
+reference to the new tied hash.  Note that the code below does NOT call the
+TIEHASH method in the MyTie class -
+see L<Calling Perl Routines from within C Programs> for details on how
+to do this.
+
+    SV*
+    mytie()
+    PREINIT:
+        HV *hash;
+        HV *stash;
+        SV *tie;
+    CODE:
+        hash = newHV();
+        tie = newRV_noinc((SV*)newHV());
+        stash = gv_stashpv("MyTie", TRUE);
+        sv_bless(tie, stash);
+        hv_magic(hash, (GV*)tie, PERL_MAGIC_tied);
+        RETVAL = newRV_noinc(hash);
+    OUTPUT:
+        RETVAL
+
+The C<av_store> function, when given a tied array argument, merely
+copies the magic of the array onto the value to be "stored", using
+C<mg_copy>.  It may also return NULL, indicating that the value did not
+actually need to be stored in the array.  [MAYCHANGE] After a call to
+C<av_store> on a tied array, the caller will usually need to call
+C<mg_set(val)> to actually invoke the perl level "STORE" method on the
+TIEARRAY object.  If C<av_store> did return NULL, a call to
+C<SvREFCNT_dec(val)> will also be usually necessary to avoid a memory
+leak. [/MAYCHANGE]
+
+The previous paragraph is applicable verbatim to tied hash access using the
+C<hv_store> and C<hv_store_ent> functions as well.
+
+C<av_fetch> and the corresponding hash functions C<hv_fetch> and
+C<hv_fetch_ent> actually return an undefined mortal value whose magic
+has been initialized using C<mg_copy>.  Note the value so returned does not
+need to be deallocated, as it is already mortal.  [MAYCHANGE] But you will
+need to call C<mg_get()> on the returned value in order to actually invoke
+the perl level "FETCH" method on the underlying TIE object.  Similarly,
+you may also call C<mg_set()> on the return value after possibly assigning
+a suitable value to it using C<sv_setsv>,  which will invoke the "STORE"
+method on the TIE object. [/MAYCHANGE]
+
+[MAYCHANGE]
+In other words, the array or hash fetch/store functions don't really
+fetch and store actual values in the case of tied arrays and hashes.  They
+merely call C<mg_copy> to attach magic to the values that were meant to be
+"stored" or "fetched".  Later calls to C<mg_get> and C<mg_set> actually
+do the job of invoking the TIE methods on the underlying objects.  Thus
+the magic mechanism currently implements a kind of lazy access to arrays
+and hashes.
+
+Currently (as of perl version 5.004), use of the hash and array access
+functions requires the user to be aware of whether they are operating on
+"normal" hashes and arrays, or on their tied variants.  The API may be
+changed to provide more transparent access to both tied and normal data
+types in future versions.
+[/MAYCHANGE]
+
+You would do well to understand that the TIEARRAY and TIEHASH interfaces
+are mere sugar to invoke some perl method calls while using the uniform hash
+and array syntax.  The use of this sugar imposes some overhead (typically
+about two to four extra opcodes per FETCH/STORE operation, in addition to
+the creation of all the mortal variables required to invoke the methods).
+This overhead will be comparatively small if the TIE methods are themselves
+substantial, but if they are only a few statements long, the overhead
+will not be insignificant.
+
+=head2 Localizing changes
+
+Perl has a very handy construction
+
+  {
+    local $var = 2;
+    ...
+  }
+
+This construction is I<approximately> equivalent to
+
+  {
+    my $oldvar = $var;
+    $var = 2;
+    ...
+    $var = $oldvar;
+  }
+
+The biggest difference is that the first construction would
+reinstate the initial value of $var, irrespective of how control exits
+the block: C<goto>, C<return>, C<die>/C<eval>, etc. It is a little bit
+more efficient as well.
+
+There is a way to achieve a similar task from C via Perl API: create a
+I<pseudo-block>, and arrange for some changes to be automatically
+undone at the end of it, either explicit, or via a non-local exit (via
+die()). A I<block>-like construct is created by a pair of
+C<ENTER>/C<LEAVE> macros (see L<perlcall/"Returning a Scalar">).
+Such a construct may be created specially for some important localized
+task, or an existing one (like boundaries of enclosing Perl
+subroutine/block, or an existing pair for freeing TMPs) may be
+used. (In the second case the overhead of additional localization must
+be almost negligible.) Note that any XSUB is automatically enclosed in
+an C<ENTER>/C<LEAVE> pair.
+
+Inside such a I<pseudo-block> the following service is available:
+
+=over 4
+
+=item C<SAVEINT(int i)>
+
+=item C<SAVEIV(IV i)>
+
+=item C<SAVEI32(I32 i)>
+
+=item C<SAVELONG(long i)>
+
+These macros arrange things to restore the value of integer variable
+C<i> at the end of enclosing I<pseudo-block>.
+
+=item C<SAVESPTR(s)>
+
+=item C<SAVEPPTR(p)>
+
+These macros arrange things to restore the value of pointers C<s> and
+C<p>. C<s> must be a pointer of a type which survives conversion to
+C<SV*> and back, C<p> should be able to survive conversion to C<char*>
+and back.
+
+=item C<SAVEFREESV(SV *sv)>
+
+The refcount of C<sv> would be decremented at the end of
+I<pseudo-block>.  This is similar to C<sv_2mortal> in that it is also a
+mechanism for doing a delayed C<SvREFCNT_dec>.  However, while C<sv_2mortal>
+extends the lifetime of C<sv> until the beginning of the next statement,
+C<SAVEFREESV> extends it until the end of the enclosing scope.  These
+lifetimes can be wildly different.
+
+Also compare C<SAVEMORTALIZESV>.
+
+=item C<SAVEMORTALIZESV(SV *sv)>
+
+Just like C<SAVEFREESV>, but mortalizes C<sv> at the end of the current
+scope instead of decrementing its reference count.  This usually has the
+effect of keeping C<sv> alive until the statement that called the currently
+live scope has finished executing.
+
+=item C<SAVEFREEOP(OP *op)>
+
+The C<OP *> is op_free()ed at the end of I<pseudo-block>.
+
+=item C<SAVEFREEPV(p)>
+
+The chunk of memory which is pointed to by C<p> is Safefree()ed at the
+end of I<pseudo-block>.
+
+=item C<SAVECLEARSV(SV *sv)>
+
+Clears a slot in the current scratchpad which corresponds to C<sv> at
+the end of I<pseudo-block>.
+
+=item C<SAVEDELETE(HV *hv, char *key, I32 length)>
+
+The key C<key> of C<hv> is deleted at the end of I<pseudo-block>. The
+string pointed to by C<key> is Safefree()ed.  If one has a I<key> in
+short-lived storage, the corresponding string may be reallocated like
+this:
+
+  SAVEDELETE(PL_defstash, savepv(tmpbuf), strlen(tmpbuf));
+
+=item C<SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)>
+
+At the end of I<pseudo-block> the function C<f> is called with the
+only argument C<p>.
+
+=item C<SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)>
+
+At the end of I<pseudo-block> the function C<f> is called with the
+implicit context argument (if any), and C<p>.
+
+=item C<SAVESTACK_POS()>
+
+The current offset on the Perl internal stack (cf. C<SP>) is restored
+at the end of I<pseudo-block>.
+
+=back
+
+The following API list contains functions, thus one needs to
+provide pointers to the modifiable data explicitly (either C pointers,
+or Perlish C<GV *>s).  Where the above macros take C<int>, a similar
+function takes C<int *>.
+
+=over 4
+
+=item C<SV* save_scalar(GV *gv)>
+
+Equivalent to Perl code C<local $gv>.
+
+=item C<AV* save_ary(GV *gv)>
+
+=item C<HV* save_hash(GV *gv)>
+
+Similar to C<save_scalar>, but localize C<@gv> and C<%gv>.
+
+=item C<void save_item(SV *item)>
+
+Duplicates the current value of C<SV>, on the exit from the current
+C<ENTER>/C<LEAVE> I<pseudo-block> will restore the value of C<SV>
+using the stored value.
+
+=item C<void save_list(SV **sarg, I32 maxsarg)>
+
+A variant of C<save_item> which takes multiple arguments via an array
+C<sarg> of C<SV*> of length C<maxsarg>.
+
+=item C<SV* save_svref(SV **sptr)>
+
+Similar to C<save_scalar>, but will reinstate an C<SV *>.
+
+=item C<void save_aptr(AV **aptr)>
+
+=item C<void save_hptr(HV **hptr)>
+
+Similar to C<save_svref>, but localize C<AV *> and C<HV *>.
+
+=back
+
+The C<Alias> module implements localization of the basic types within the
+I<caller's scope>.  People who are interested in how to localize things in
+the containing scope should take a look there too.
+
+=head1 Subroutines
+
+=head2 XSUBs and the Argument Stack
+
+The XSUB mechanism is a simple way for Perl programs to access C subroutines.
+An XSUB routine will have a stack that contains the arguments from the Perl
+program, and a way to map from the Perl data structures to a C equivalent.
+
+The stack arguments are accessible through the C<ST(n)> macro, which returns
+the C<n>'th stack argument.  Argument 0 is the first argument passed in the
+Perl subroutine call.  These arguments are C<SV*>, and can be used anywhere
+an C<SV*> is used.
+
+Most of the time, output from the C routine can be handled through use of
+the RETVAL and OUTPUT directives.  However, there are some cases where the
+argument stack is not already long enough to handle all the return values.
+An example is the POSIX tzname() call, which takes no arguments, but returns
+two, the local time zone's standard and summer time abbreviations.
+
+To handle this situation, the PPCODE directive is used and the stack is
+extended using the macro:
+
+    EXTEND(SP, num);
+
+where C<SP> is the macro that represents the local copy of the stack pointer,
+and C<num> is the number of elements the stack should be extended by.
+
+Now that there is room on the stack, values can be pushed on it using C<PUSHs>
+macro. The pushed values will often need to be "mortal" (See
+L</Reference Counts and Mortality>):
+
+    PUSHs(sv_2mortal(newSViv(an_integer)))
+    PUSHs(sv_2mortal(newSVuv(an_unsigned_integer)))
+    PUSHs(sv_2mortal(newSVnv(a_double)))
+    PUSHs(sv_2mortal(newSVpv("Some String",0)))
+
+And now the Perl program calling C<tzname>, the two values will be assigned
+as in:
+
+    ($standard_abbrev, $summer_abbrev) = POSIX::tzname;
+
+An alternate (and possibly simpler) method to pushing values on the stack is
+to use the macro:
+
+    XPUSHs(SV*)
+
+This macro automatically adjust the stack for you, if needed.  Thus, you
+do not need to call C<EXTEND> to extend the stack.
+
+Despite their suggestions in earlier versions of this document the macros
+C<(X)PUSH[iunp]> are I<not> suited to XSUBs which return multiple results.
+For that, either stick to the C<(X)PUSHs> macros shown above, or use the new
+C<m(X)PUSH[iunp]> macros instead; see L</Putting a C value on Perl stack>.
+
+For more information, consult L<perlxs> and L<perlxstut>.
+
+=head2 Calling Perl Routines from within C Programs
+
+There are four routines that can be used to call a Perl subroutine from
+within a C program.  These four are:
+
+    I32  call_sv(SV*, I32);
+    I32  call_pv(const char*, I32);
+    I32  call_method(const char*, I32);
+    I32  call_argv(const char*, I32, register char**);
+
+The routine most often used is C<call_sv>.  The C<SV*> argument
+contains either the name of the Perl subroutine to be called, or a
+reference to the subroutine.  The second argument consists of flags
+that control the context in which the subroutine is called, whether
+or not the subroutine is being passed arguments, how errors should be
+trapped, and how to treat return values.
+
+All four routines return the number of arguments that the subroutine returned
+on the Perl stack.
+
+These routines used to be called C<perl_call_sv>, etc., before Perl v5.6.0,
+but those names are now deprecated; macros of the same name are provided for
+compatibility.
+
+When using any of these routines (except C<call_argv>), the programmer
+must manipulate the Perl stack.  These include the following macros and
+functions:
+
+    dSP
+    SP
+    PUSHMARK()
+    PUTBACK
+    SPAGAIN
+    ENTER
+    SAVETMPS
+    FREETMPS
+    LEAVE
+    XPUSH*()
+    POP*()
+
+For a detailed description of calling conventions from C to Perl,
+consult L<perlcall>.
+
+=head2 Memory Allocation
+
+=head3 Allocation
+
+All memory meant to be used with the Perl API functions should be manipulated
+using the macros described in this section.  The macros provide the necessary
+transparency between differences in the actual malloc implementation that is
+used within perl.
+
+It is suggested that you enable the version of malloc that is distributed
+with Perl.  It keeps pools of various sizes of unallocated memory in
+order to satisfy allocation requests more quickly.  However, on some
+platforms, it may cause spurious malloc or free errors.
+
+The following three macros are used to initially allocate memory :
+
+    Newx(pointer, number, type);
+    Newxc(pointer, number, type, cast);
+    Newxz(pointer, number, type);
+
+The first argument C<pointer> should be the name of a variable that will
+point to the newly allocated memory.
+
+The second and third arguments C<number> and C<type> specify how many of
+the specified type of data structure should be allocated.  The argument
+C<type> is passed to C<sizeof>.  The final argument to C<Newxc>, C<cast>,
+should be used if the C<pointer> argument is different from the C<type>
+argument.
+
+Unlike the C<Newx> and C<Newxc> macros, the C<Newxz> macro calls C<memzero>
+to zero out all the newly allocated memory.
+
+=head3 Reallocation
+
+    Renew(pointer, number, type);
+    Renewc(pointer, number, type, cast);
+    Safefree(pointer)
+
+These three macros are used to change a memory buffer size or to free a
+piece of memory no longer needed.  The arguments to C<Renew> and C<Renewc>
+match those of C<New> and C<Newc> with the exception of not needing the
+"magic cookie" argument.
+
+=head3 Moving
+
+    Move(source, dest, number, type);
+    Copy(source, dest, number, type);
+    Zero(dest, number, type);
+
+These three macros are used to move, copy, or zero out previously allocated
+memory.  The C<source> and C<dest> arguments point to the source and
+destination starting points.  Perl will move, copy, or zero out C<number>
+instances of the size of the C<type> data structure (using the C<sizeof>
+function).
+
+=head2 PerlIO
+
+The most recent development releases of Perl has been experimenting with
+removing Perl's dependency on the "normal" standard I/O suite and allowing
+other stdio implementations to be used.  This involves creating a new
+abstraction layer that then calls whichever implementation of stdio Perl
+was compiled with.  All XSUBs should now use the functions in the PerlIO
+abstraction layer and not make any assumptions about what kind of stdio
+is being used.
+
+For a complete description of the PerlIO abstraction, consult L<perlapio>.
+
+=head2 Putting a C value on Perl stack
+
+A lot of opcodes (this is an elementary operation in the internal perl
+stack machine) put an SV* on the stack. However, as an optimization
+the corresponding SV is (usually) not recreated each time. The opcodes
+reuse specially assigned SVs (I<target>s) which are (as a corollary)
+not constantly freed/created.
+
+Each of the targets is created only once (but see
+L<Scratchpads and recursion> below), and when an opcode needs to put
+an integer, a double, or a string on stack, it just sets the
+corresponding parts of its I<target> and puts the I<target> on stack.
+
+The macro to put this target on stack is C<PUSHTARG>, and it is
+directly used in some opcodes, as well as indirectly in zillions of
+others, which use it via C<(X)PUSH[iunp]>.
+
+Because the target is reused, you must be careful when pushing multiple
+values on the stack. The following code will not do what you think:
+
+    XPUSHi(10);
+    XPUSHi(20);
+
+This translates as "set C<TARG> to 10, push a pointer to C<TARG> onto
+the stack; set C<TARG> to 20, push a pointer to C<TARG> onto the stack".
+At the end of the operation, the stack does not contain the values 10
+and 20, but actually contains two pointers to C<TARG>, which we have set
+to 20.
+
+If you need to push multiple different values then you should either use
+the C<(X)PUSHs> macros, or else use the new C<m(X)PUSH[iunp]> macros,
+none of which make use of C<TARG>.  The C<(X)PUSHs> macros simply push an
+SV* on the stack, which, as noted under L</XSUBs and the Argument Stack>,
+will often need to be "mortal".  The new C<m(X)PUSH[iunp]> macros make
+this a little easier to achieve by creating a new mortal for you (via
+C<(X)PUSHmortal>), pushing that onto the stack (extending it if necessary
+in the case of the C<mXPUSH[iunp]> macros), and then setting its value.
+Thus, instead of writing this to "fix" the example above:
+
+    XPUSHs(sv_2mortal(newSViv(10)))
+    XPUSHs(sv_2mortal(newSViv(20)))
+
+you can simply write:
+
+    mXPUSHi(10)
+    mXPUSHi(20)
+
+On a related note, if you do use C<(X)PUSH[iunp]>, then you're going to
+need a C<dTARG> in your variable declarations so that the C<*PUSH*>
+macros can make use of the local variable C<TARG>.  See also C<dTARGET>
+and C<dXSTARG>.
+
+=head2 Scratchpads
+
+The question remains on when the SVs which are I<target>s for opcodes
+are created. The answer is that they are created when the current unit --
+a subroutine or a file (for opcodes for statements outside of
+subroutines) -- is compiled. During this time a special anonymous Perl
+array is created, which is called a scratchpad for the current
+unit.
+
+A scratchpad keeps SVs which are lexicals for the current unit and are
+targets for opcodes. One can deduce that an SV lives on a scratchpad
+by looking on its flags: lexicals have C<SVs_PADMY> set, and
+I<target>s have C<SVs_PADTMP> set.
+
+The correspondence between OPs and I<target>s is not 1-to-1. Different
+OPs in the compile tree of the unit can use the same target, if this
+would not conflict with the expected life of the temporary.
+
+=head2 Scratchpads and recursion
+
+In fact it is not 100% true that a compiled unit contains a pointer to
+the scratchpad AV. In fact it contains a pointer to an AV of
+(initially) one element, and this element is the scratchpad AV. Why do
+we need an extra level of indirection?
+
+The answer is B<recursion>, and maybe B<threads>. Both
+these can create several execution pointers going into the same
+subroutine. For the subroutine-child not write over the temporaries
+for the subroutine-parent (lifespan of which covers the call to the
+child), the parent and the child should have different
+scratchpads. (I<And> the lexicals should be separate anyway!)
+
+So each subroutine is born with an array of scratchpads (of length 1).
+On each entry to the subroutine it is checked that the current
+depth of the recursion is not more than the length of this array, and
+if it is, new scratchpad is created and pushed into the array.
+
+The I<target>s on this scratchpad are C<undef>s, but they are already
+marked with correct flags.
+
+=head1 Compiled code
+
+=head2 Code tree
+
+Here we describe the internal form your code is converted to by
+Perl. Start with a simple example:
+
+  $a = $b + $c;
+
+This is converted to a tree similar to this one:
+
+             assign-to
+           /           \
+          +             $a
+        /   \
+      $b     $c
+
+(but slightly more complicated).  This tree reflects the way Perl
+parsed your code, but has nothing to do with the execution order.
+There is an additional "thread" going through the nodes of the tree
+which shows the order of execution of the nodes.  In our simplified
+example above it looks like:
+
+     $b ---> $c ---> + ---> $a ---> assign-to
+
+But with the actual compile tree for C<$a = $b + $c> it is different:
+some nodes I<optimized away>.  As a corollary, though the actual tree
+contains more nodes than our simplified example, the execution order
+is the same as in our example.
+
+=head2 Examining the tree
+
+If you have your perl compiled for debugging (usually done with
+C<-DDEBUGGING> on the C<Configure> command line), you may examine the
+compiled tree by specifying C<-Dx> on the Perl command line.  The
+output takes several lines per node, and for C<$b+$c> it looks like
+this:
+
+    5           TYPE = add  ===> 6
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+                    TYPE = null  ===> (4)
+                      (was rv2sv)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+    3                   TYPE = gvsv  ===> 4
+                        FLAGS = (SCALAR)
+                        GV = main::b
+                    }
+                }
+                {
+                    TYPE = null  ===> (5)
+                      (was rv2sv)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+    4                   TYPE = gvsv  ===> 5
+                        FLAGS = (SCALAR)
+                        GV = main::c
+                    }
+                }
+
+This tree has 5 nodes (one per C<TYPE> specifier), only 3 of them are
+not optimized away (one per number in the left column).  The immediate
+children of the given node correspond to C<{}> pairs on the same level
+of indentation, thus this listing corresponds to the tree:
+
+                   add
+                 /     \
+               null    null
+                |       |
+               gvsv    gvsv
+
+The execution order is indicated by C<===E<gt>> marks, thus it is C<3
+4 5 6> (node C<6> is not included into above listing), i.e.,
+C<gvsv gvsv add whatever>.
+
+Each of these nodes represents an op, a fundamental operation inside the
+Perl core. The code which implements each operation can be found in the
+F<pp*.c> files; the function which implements the op with type C<gvsv>
+is C<pp_gvsv>, and so on. As the tree above shows, different ops have
+different numbers of children: C<add> is a binary operator, as one would
+expect, and so has two children. To accommodate the various different
+numbers of children, there are various types of op data structure, and
+they link together in different ways.
+
+The simplest type of op structure is C<OP>: this has no children. Unary
+operators, C<UNOP>s, have one child, and this is pointed to by the
+C<op_first> field. Binary operators (C<BINOP>s) have not only an
+C<op_first> field but also an C<op_last> field. The most complex type of
+op is a C<LISTOP>, which has any number of children. In this case, the
+first child is pointed to by C<op_first> and the last child by
+C<op_last>. The children in between can be found by iteratively
+following the C<op_sibling> pointer from the first child to the last.
+
+There are also two other op types: a C<PMOP> holds a regular expression,
+and has no children, and a C<LOOP> may or may not have children. If the
+C<op_children> field is non-zero, it behaves like a C<LISTOP>. To
+complicate matters, if a C<UNOP> is actually a C<null> op after
+optimization (see L</Compile pass 2: context propagation>) it will still
+have children in accordance with its former type.
+
+Another way to examine the tree is to use a compiler back-end module, such
+as L<B::Concise>.
+
+=head2 Compile pass 1: check routines
+
+The tree is created by the compiler while I<yacc> code feeds it
+the constructions it recognizes. Since I<yacc> works bottom-up, so does
+the first pass of perl compilation.
+
+What makes this pass interesting for perl developers is that some
+optimization may be performed on this pass.  This is optimization by
+so-called "check routines".  The correspondence between node names
+and corresponding check routines is described in F<opcode.pl> (do not
+forget to run C<make regen_headers> if you modify this file).
+
+A check routine is called when the node is fully constructed except
+for the execution-order thread.  Since at this time there are no
+back-links to the currently constructed node, one can do most any
+operation to the top-level node, including freeing it and/or creating
+new nodes above/below it.
+
+The check routine returns the node which should be inserted into the
+tree (if the top-level node was not modified, check routine returns
+its argument).
+
+By convention, check routines have names C<ck_*>. They are usually
+called from C<new*OP> subroutines (or C<convert>) (which in turn are
+called from F<perly.y>).
+
+=head2 Compile pass 1a: constant folding
+
+Immediately after the check routine is called the returned node is
+checked for being compile-time executable.  If it is (the value is
+judged to be constant) it is immediately executed, and a I<constant>
+node with the "return value" of the corresponding subtree is
+substituted instead.  The subtree is deleted.
+
+If constant folding was not performed, the execution-order thread is
+created.
+
+=head2 Compile pass 2: context propagation
+
+When a context for a part of compile tree is known, it is propagated
+down through the tree.  At this time the context can have 5 values
+(instead of 2 for runtime context): void, boolean, scalar, list, and
+lvalue.  In contrast with the pass 1 this pass is processed from top
+to bottom: a node's context determines the context for its children.
+
+Additional context-dependent optimizations are performed at this time.
+Since at this moment the compile tree contains back-references (via
+"thread" pointers), nodes cannot be free()d now.  To allow
+optimized-away nodes at this stage, such nodes are null()ified instead
+of free()ing (i.e. their type is changed to OP_NULL).
+
+=head2 Compile pass 3: peephole optimization
+
+After the compile tree for a subroutine (or for an C<eval> or a file)
+is created, an additional pass over the code is performed. This pass
+is neither top-down or bottom-up, but in the execution order (with
+additional complications for conditionals).  These optimizations are
+done in the subroutine peep().  Optimizations performed at this stage
+are subject to the same restrictions as in the pass 2.
+
+=head2 Pluggable runops
+
+The compile tree is executed in a runops function.  There are two runops
+functions, in F<run.c> and in F<dump.c>.  C<Perl_runops_debug> is used
+with DEBUGGING and C<Perl_runops_standard> is used otherwise.  For fine
+control over the execution of the compile tree it is possible to provide
+your own runops function.
+
+It's probably best to copy one of the existing runops functions and
+change it to suit your needs.  Then, in the BOOT section of your XS
+file, add the line:
+
+  PL_runops = my_runops;
+
+This function should be as efficient as possible to keep your programs
+running as fast as possible.
+
+=head1 Examining internal data structures with the C<dump> functions
+
+To aid debugging, the source file F<dump.c> contains a number of
+functions which produce formatted output of internal data structures.
+
+The most commonly used of these functions is C<Perl_sv_dump>; it's used
+for dumping SVs, AVs, HVs, and CVs. The C<Devel::Peek> module calls
+C<sv_dump> to produce debugging output from Perl-space, so users of that
+module should already be familiar with its format.
+
+C<Perl_op_dump> can be used to dump an C<OP> structure or any of its
+derivatives, and produces output similar to C<perl -Dx>; in fact,
+C<Perl_dump_eval> will dump the main root of the code being evaluated,
+exactly like C<-Dx>.
+
+Other useful functions are C<Perl_dump_sub>, which turns a C<GV> into an
+op tree, C<Perl_dump_packsubs> which calls C<Perl_dump_sub> on all the
+subroutines in a package like so: (Thankfully, these are all xsubs, so
+there is no op tree)
+
+    (gdb) print Perl_dump_packsubs(PL_defstash)
+
+    SUB attributes::bootstrap = (xsub 0x811fedc 0)
+
+    SUB UNIVERSAL::can = (xsub 0x811f50c 0)
+
+    SUB UNIVERSAL::isa = (xsub 0x811f304 0)
+
+    SUB UNIVERSAL::VERSION = (xsub 0x811f7ac 0)
+
+    SUB DynaLoader::boot_DynaLoader = (xsub 0x805b188 0)
+
+and C<Perl_dump_all>, which dumps all the subroutines in the stash and
+the op tree of the main root.
+
+=head1 How multiple interpreters and concurrency are supported
+
+=head2 Background and PERL_IMPLICIT_CONTEXT
+
+The Perl interpreter can be regarded as a closed box: it has an API
+for feeding it code or otherwise making it do things, but it also has
+functions for its own use.  This smells a lot like an object, and
+there are ways for you to build Perl so that you can have multiple
+interpreters, with one interpreter represented either as a C structure,
+or inside a thread-specific structure.  These structures contain all
+the context, the state of that interpreter.
+
+Two macros control the major Perl build flavors: MULTIPLICITY and
+USE_5005THREADS.  The MULTIPLICITY build has a C structure
+that packages all the interpreter state, and there is a similar thread-specific
+data structure under USE_5005THREADS.  In both cases,
+PERL_IMPLICIT_CONTEXT is also normally defined, and enables the
+support for passing in a "hidden" first argument that represents all three
+data structures.
+
+All this obviously requires a way for the Perl internal functions to be
+either subroutines taking some kind of structure as the first
+argument, or subroutines taking nothing as the first argument.  To
+enable these two very different ways of building the interpreter,
+the Perl source (as it does in so many other situations) makes heavy
+use of macros and subroutine naming conventions.
+
+First problem: deciding which functions will be public API functions and
+which will be private.  All functions whose names begin C<S_> are private
+(think "S" for "secret" or "static").  All other functions begin with
+"Perl_", but just because a function begins with "Perl_" does not mean it is
+part of the API. (See L</Internal Functions>.) The easiest way to be B<sure> a
+function is part of the API is to find its entry in L<perlapi>.
+If it exists in L<perlapi>, it's part of the API.  If it doesn't, and you
+think it should be (i.e., you need it for your extension), send mail via
+L<perlbug> explaining why you think it should be.
+
+Second problem: there must be a syntax so that the same subroutine
+declarations and calls can pass a structure as their first argument,
+or pass nothing.  To solve this, the subroutines are named and
+declared in a particular way.  Here's a typical start of a static
+function used within the Perl guts:
+
+  STATIC void
+  S_incline(pTHX_ char *s)
+
+STATIC becomes "static" in C, and may be #define'd to nothing in some
+configurations in future.
+
+A public function (i.e. part of the internal API, but not necessarily
+sanctioned for use in extensions) begins like this:
+
+  void
+  Perl_sv_setiv(pTHX_ SV* dsv, IV num)
+
+C<pTHX_> is one of a number of macros (in perl.h) that hide the
+details of the interpreter's context.  THX stands for "thread", "this",
+or "thingy", as the case may be.  (And no, George Lucas is not involved. :-)
+The first character could be 'p' for a B<p>rototype, 'a' for B<a>rgument,
+or 'd' for B<d>eclaration, so we have C<pTHX>, C<aTHX> and C<dTHX>, and
+their variants.
+
+When Perl is built without options that set PERL_IMPLICIT_CONTEXT, there is no
+first argument containing the interpreter's context.  The trailing underscore
+in the pTHX_ macro indicates that the macro expansion needs a comma
+after the context argument because other arguments follow it.  If
+PERL_IMPLICIT_CONTEXT is not defined, pTHX_ will be ignored, and the
+subroutine is not prototyped to take the extra argument.  The form of the
+macro without the trailing underscore is used when there are no additional
+explicit arguments.
+
+When a core function calls another, it must pass the context.  This
+is normally hidden via macros.  Consider C<sv_setiv>.  It expands into
+something like this:
+
+    #ifdef PERL_IMPLICIT_CONTEXT
+      #define sv_setiv(a,b)      Perl_sv_setiv(aTHX_ a, b)
+      /* can't do this for vararg functions, see below */
+    #else
+      #define sv_setiv           Perl_sv_setiv
+    #endif
+
+This works well, and means that XS authors can gleefully write:
+
+    sv_setiv(foo, bar);
+
+and still have it work under all the modes Perl could have been
+compiled with.
+
+This doesn't work so cleanly for varargs functions, though, as macros
+imply that the number of arguments is known in advance.  Instead we
+either need to spell them out fully, passing C<aTHX_> as the first
+argument (the Perl core tends to do this with functions like
+Perl_warner), or use a context-free version.
+
+The context-free version of Perl_warner is called
+Perl_warner_nocontext, and does not take the extra argument.  Instead
+it does dTHX; to get the context from thread-local storage.  We
+C<#define warner Perl_warner_nocontext> so that extensions get source
+compatibility at the expense of performance.  (Passing an arg is
+cheaper than grabbing it from thread-local storage.)
+
+You can ignore [pad]THXx when browsing the Perl headers/sources.
+Those are strictly for use within the core.  Extensions and embedders
+need only be aware of [pad]THX.
+
+=head2 So what happened to dTHR?
+
+C<dTHR> was introduced in perl 5.005 to support the older thread model.
+The older thread model now uses the C<THX> mechanism to pass context
+pointers around, so C<dTHR> is not useful any more.  Perl 5.6.0 and
+later still have it for backward source compatibility, but it is defined
+to be a no-op.
+
+=head2 How do I use all this in extensions?
+
+When Perl is built with PERL_IMPLICIT_CONTEXT, extensions that call
+any functions in the Perl API will need to pass the initial context
+argument somehow.  The kicker is that you will need to write it in
+such a way that the extension still compiles when Perl hasn't been
+built with PERL_IMPLICIT_CONTEXT enabled.
+
+There are three ways to do this.  First, the easy but inefficient way,
+which is also the default, in order to maintain source compatibility
+with extensions: whenever XSUB.h is #included, it redefines the aTHX
+and aTHX_ macros to call a function that will return the context.
+Thus, something like:
+
+        sv_setiv(sv, num);
+
+in your extension will translate to this when PERL_IMPLICIT_CONTEXT is
+in effect:
+
+        Perl_sv_setiv(Perl_get_context(), sv, num);
+
+or to this otherwise:
+
+        Perl_sv_setiv(sv, num);
+
+You have to do nothing new in your extension to get this; since
+the Perl library provides Perl_get_context(), it will all just
+work.
+
+The second, more efficient way is to use the following template for
+your Foo.xs:
+
+        #define PERL_NO_GET_CONTEXT     /* we want efficiency */
+        #include "EXTERN.h"
+        #include "perl.h"
+        #include "XSUB.h"
+
+        static my_private_function(int arg1, int arg2);
+
+        static SV *
+        my_private_function(int arg1, int arg2)
+        {
+            dTHX;       /* fetch context */
+            ... call many Perl API functions ...
+        }
+
+        [... etc ...]
+
+        MODULE = Foo            PACKAGE = Foo
+
+        /* typical XSUB */
+
+        void
+        my_xsub(arg)
+                int arg
+            CODE:
+                my_private_function(arg, 10);
+
+Note that the only two changes from the normal way of writing an
+extension is the addition of a C<#define PERL_NO_GET_CONTEXT> before
+including the Perl headers, followed by a C<dTHX;> declaration at
+the start of every function that will call the Perl API.  (You'll
+know which functions need this, because the C compiler will complain
+that there's an undeclared identifier in those functions.)  No changes
+are needed for the XSUBs themselves, because the XS() macro is
+correctly defined to pass in the implicit context if needed.
+
+The third, even more efficient way is to ape how it is done within
+the Perl guts:
+
+
+        #define PERL_NO_GET_CONTEXT     /* we want efficiency */
+        #include "EXTERN.h"
+        #include "perl.h"
+        #include "XSUB.h"
+
+        /* pTHX_ only needed for functions that call Perl API */
+        static my_private_function(pTHX_ int arg1, int arg2);
+
+        static SV *
+        my_private_function(pTHX_ int arg1, int arg2)
+        {
+            /* dTHX; not needed here, because THX is an argument */
+            ... call Perl API functions ...
+        }
+
+        [... etc ...]
+
+        MODULE = Foo            PACKAGE = Foo
+
+        /* typical XSUB */
+
+        void
+        my_xsub(arg)
+                int arg
+            CODE:
+                my_private_function(aTHX_ arg, 10);
+
+This implementation never has to fetch the context using a function
+call, since it is always passed as an extra argument.  Depending on
+your needs for simplicity or efficiency, you may mix the previous
+two approaches freely.
+
+Never add a comma after C<pTHX> yourself--always use the form of the
+macro with the underscore for functions that take explicit arguments,
+or the form without the argument for functions with no explicit arguments.
+
+=head2 Should I do anything special if I call perl from multiple threads?
+
+If you create interpreters in one thread and then proceed to call them in
+another, you need to make sure perl's own Thread Local Storage (TLS) slot is
+initialized correctly in each of those threads.
+
+The C<perl_alloc> and C<perl_clone> API functions will automatically set
+the TLS slot to the interpreter they created, so that there is no need to do
+anything special if the interpreter is always accessed in the same thread that
+created it, and that thread did not create or call any other interpreters
+afterwards.  If that is not the case, you have to set the TLS slot of the
+thread before calling any functions in the Perl API on that particular
+interpreter.  This is done by calling the C<PERL_SET_CONTEXT> macro in that
+thread as the first thing you do:
+
+	/* do this before doing anything else with some_perl */
+	PERL_SET_CONTEXT(some_perl);
+
+	... other Perl API calls on some_perl go here ...
+
+=head2 Future Plans and PERL_IMPLICIT_SYS
+
+Just as PERL_IMPLICIT_CONTEXT provides a way to bundle up everything
+that the interpreter knows about itself and pass it around, so too are
+there plans to allow the interpreter to bundle up everything it knows
+about the environment it's running on.  This is enabled with the
+PERL_IMPLICIT_SYS macro.  Currently it only works with USE_ITHREADS
+and USE_5005THREADS on Windows (see inside iperlsys.h).
+
+This allows the ability to provide an extra pointer (called the "host"
+environment) for all the system calls.  This makes it possible for
+all the system stuff to maintain their own state, broken down into
+seven C structures.  These are thin wrappers around the usual system
+calls (see win32/perllib.c) for the default perl executable, but for a
+more ambitious host (like the one that would do fork() emulation) all
+the extra work needed to pretend that different interpreters are
+actually different "processes", would be done here.
+
+The Perl engine/interpreter and the host are orthogonal entities.
+There could be one or more interpreters in a process, and one or
+more "hosts", with free association between them.
+
+=head1 Internal Functions
+
+All of Perl's internal functions which will be exposed to the outside
+world are prefixed by C<Perl_> so that they will not conflict with XS
+functions or functions used in a program in which Perl is embedded.
+Similarly, all global variables begin with C<PL_>. (By convention,
+static functions start with C<S_>.)
+
+Inside the Perl core, you can get at the functions either with or
+without the C<Perl_> prefix, thanks to a bunch of defines that live in
+F<embed.h>. This header file is generated automatically from
+F<embed.pl> and F<embed.fnc>. F<embed.pl> also creates the prototyping
+header files for the internal functions, generates the documentation
+and a lot of other bits and pieces. It's important that when you add
+a new function to the core or change an existing one, you change the
+data in the table in F<embed.fnc> as well. Here's a sample entry from
+that table:
+
+    Apd |SV**   |av_fetch   |AV* ar|I32 key|I32 lval
+
+The second column is the return type, the third column the name. Columns
+after that are the arguments. The first column is a set of flags:
+
+=over 3
+
+=item A
+
+This function is a part of the public API. All such functions should also
+have 'd', very few do not.
+
+=item p
+
+This function has a C<Perl_> prefix; i.e. it is defined as
+C<Perl_av_fetch>.
+
+=item d
+
+This function has documentation using the C<apidoc> feature which we'll
+look at in a second.  Some functions have 'd' but not 'A'; docs are good.
+
+=back
+
+Other available flags are:
+
+=over 3
+
+=item s
+
+This is a static function and is defined as C<STATIC S_whatever>, and
+usually called within the sources as C<whatever(...)>.
+
+=item n
+
+This does not need a interpreter context, so the definition has no
+C<pTHX>, and it follows that callers don't use C<aTHX>.  (See
+L<perlguts/Background and PERL_IMPLICIT_CONTEXT>.)
+
+=item r
+
+This function never returns; C<croak>, C<exit> and friends.
+
+=item f
+
+This function takes a variable number of arguments, C<printf> style.
+The argument list should end with C<...>, like this:
+
+    Afprd   |void   |croak          |const char* pat|...
+
+=item M
+
+This function is part of the experimental development API, and may change
+or disappear without notice.
+
+=item o
+
+This function should not have a compatibility macro to define, say,
+C<Perl_parse> to C<parse>. It must be called as C<Perl_parse>.
+
+=item x
+
+This function isn't exported out of the Perl core.
+
+=item m
+
+This is implemented as a macro.
+
+=item X
+
+This function is explicitly exported.
+
+=item E
+
+This function is visible to extensions included in the Perl core.
+
+=item b
+
+Binary backward compatibility; this function is a macro but also has
+a C<Perl_> implementation (which is exported).
+
+=item others
+
+See the comments at the top of C<embed.fnc> for others.
+
+=back
+
+If you edit F<embed.pl> or F<embed.fnc>, you will need to run
+C<make regen_headers> to force a rebuild of F<embed.h> and other
+auto-generated files.
+
+=head2 Formatted Printing of IVs, UVs, and NVs
+
+If you are printing IVs, UVs, or NVS instead of the stdio(3) style
+formatting codes like C<%d>, C<%ld>, C<%f>, you should use the
+following macros for portability
+
+        IVdf            IV in decimal
+        UVuf            UV in decimal
+        UVof            UV in octal
+        UVxf            UV in hexadecimal
+        NVef            NV %e-like
+        NVff            NV %f-like
+        NVgf            NV %g-like
+
+These will take care of 64-bit integers and long doubles.
+For example:
+
+        printf("IV is %"IVdf"\n", iv);
+
+The IVdf will expand to whatever is the correct format for the IVs.
+
+If you are printing addresses of pointers, use UVxf combined
+with PTR2UV(), do not use %lx or %p.
+
+=head2 Pointer-To-Integer and Integer-To-Pointer
+
+Because pointer size does not necessarily equal integer size,
+use the follow macros to do it right.
+
+        PTR2UV(pointer)
+        PTR2IV(pointer)
+        PTR2NV(pointer)
+        INT2PTR(pointertotype, integer)
+
+For example:
+
+        IV  iv = ...;
+        SV *sv = INT2PTR(SV*, iv);
+
+and
+
+        AV *av = ...;
+        UV  uv = PTR2UV(av);
+
+=head2 Source Documentation
+
+There's an effort going on to document the internal functions and
+automatically produce reference manuals from them - L<perlapi> is one
+such manual which details all the functions which are available to XS
+writers. L<perlintern> is the autogenerated manual for the functions
+which are not part of the API and are supposedly for internal use only.
+
+Source documentation is created by putting POD comments into the C
+source, like this:
+
+ /*
+ =for apidoc sv_setiv
+
+ Copies an integer into the given SV.  Does not handle 'set' magic.  See
+ C<sv_setiv_mg>.
+
+ =cut
+ */
+
+Please try and supply some documentation if you add functions to the
+Perl core.
+
+=head2 Backwards compatibility
+
+The Perl API changes over time. New functions are added or the interfaces
+of existing functions are changed. The C<Devel::PPPort> module tries to
+provide compatibility code for some of these changes, so XS writers don't
+have to code it themselves when supporting multiple versions of Perl.
+
+C<Devel::PPPort> generates a C header file F<ppport.h> that can also
+be run as a Perl script. To generate F<ppport.h>, run:
+
+    perl -MDevel::PPPort -eDevel::PPPort::WriteFile
+
+Besides checking existing XS code, the script can also be used to retrieve
+compatibility information for various API calls using the C<--api-info>
+command line switch. For example:
+
+  % perl ppport.h --api-info=sv_magicext
+
+For details, see C<perldoc ppport.h>.
+
+=head1 Unicode Support
+
+Perl 5.6.0 introduced Unicode support. It's important for porters and XS
+writers to understand this support and make sure that the code they
+write does not corrupt Unicode data.
+
+=head2 What B<is> Unicode, anyway?
+
+In the olden, less enlightened times, we all used to use ASCII. Most of
+us did, anyway. The big problem with ASCII is that it's American. Well,
+no, that's not actually the problem; the problem is that it's not
+particularly useful for people who don't use the Roman alphabet. What
+used to happen was that particular languages would stick their own
+alphabet in the upper range of the sequence, between 128 and 255. Of
+course, we then ended up with plenty of variants that weren't quite
+ASCII, and the whole point of it being a standard was lost.
+
+Worse still, if you've got a language like Chinese or
+Japanese that has hundreds or thousands of characters, then you really
+can't fit them into a mere 256, so they had to forget about ASCII
+altogether, and build their own systems using pairs of numbers to refer
+to one character.
+
+To fix this, some people formed Unicode, Inc. and
+produced a new character set containing all the characters you can
+possibly think of and more. There are several ways of representing these
+characters, and the one Perl uses is called UTF-8. UTF-8 uses
+a variable number of bytes to represent a character, instead of just
+one. You can learn more about Unicode at http://www.unicode.org/
+
+=head2 How can I recognise a UTF-8 string?
+
+You can't. This is because UTF-8 data is stored in bytes just like
+non-UTF-8 data. The Unicode character 200, (C<0xC8> for you hex types)
+capital E with a grave accent, is represented by the two bytes
+C<v196.172>. Unfortunately, the non-Unicode string C<chr(196).chr(172)>
+has that byte sequence as well. So you can't tell just by looking - this
+is what makes Unicode input an interesting problem.
+
+The API function C<is_utf8_string> can help; it'll tell you if a string
+contains only valid UTF-8 characters. However, it can't do the work for
+you. On a character-by-character basis, C<is_utf8_char> will tell you
+whether the current character in a string is valid UTF-8.
+
+=head2 How does UTF-8 represent Unicode characters?
+
+As mentioned above, UTF-8 uses a variable number of bytes to store a
+character. Characters with values 1...128 are stored in one byte, just
+like good ol' ASCII. Character 129 is stored as C<v194.129>; this
+continues up to character 191, which is C<v194.191>. Now we've run out of
+bits (191 is binary C<10111111>) so we move on; 192 is C<v195.128>. And
+so it goes on, moving to three bytes at character 2048.
+
+Assuming you know you're dealing with a UTF-8 string, you can find out
+how long the first character in it is with the C<UTF8SKIP> macro:
+
+    char *utf = "\305\233\340\240\201";
+    I32 len;
+
+    len = UTF8SKIP(utf); /* len is 2 here */
+    utf += len;
+    len = UTF8SKIP(utf); /* len is 3 here */
+
+Another way to skip over characters in a UTF-8 string is to use
+C<utf8_hop>, which takes a string and a number of characters to skip
+over. You're on your own about bounds checking, though, so don't use it
+lightly.
+
+All bytes in a multi-byte UTF-8 character will have the high bit set,
+so you can test if you need to do something special with this
+character like this (the UTF8_IS_INVARIANT() is a macro that tests
+whether the byte can be encoded as a single byte even in UTF-8):
+
+    U8 *utf;
+    UV uv;	/* Note: a UV, not a U8, not a char */
+
+    if (!UTF8_IS_INVARIANT(*utf))
+        /* Must treat this as UTF-8 */
+        uv = utf8_to_uv(utf);
+    else
+        /* OK to treat this character as a byte */
+        uv = *utf;
+
+You can also see in that example that we use C<utf8_to_uv> to get the
+value of the character; the inverse function C<uv_to_utf8> is available
+for putting a UV into UTF-8:
+
+    if (!UTF8_IS_INVARIANT(uv))
+        /* Must treat this as UTF8 */
+        utf8 = uv_to_utf8(utf8, uv);
+    else
+        /* OK to treat this character as a byte */
+        *utf8++ = uv;
+
+You B<must> convert characters to UVs using the above functions if
+you're ever in a situation where you have to match UTF-8 and non-UTF-8
+characters. You may not skip over UTF-8 characters in this case. If you
+do this, you'll lose the ability to match hi-bit non-UTF-8 characters;
+for instance, if your UTF-8 string contains C<v196.172>, and you skip
+that character, you can never match a C<chr(200)> in a non-UTF-8 string.
+So don't do that!
+
+=head2 How does Perl store UTF-8 strings?
+
+Currently, Perl deals with Unicode strings and non-Unicode strings
+slightly differently. If a string has been identified as being UTF-8
+encoded, Perl will set a flag in the SV, C<SVf_UTF8>. You can check and
+manipulate this flag with the following macros:
+
+    SvUTF8(sv)
+    SvUTF8_on(sv)
+    SvUTF8_off(sv)
+
+This flag has an important effect on Perl's treatment of the string: if
+Unicode data is not properly distinguished, regular expressions,
+C<length>, C<substr> and other string handling operations will have
+undesirable results.
+
+The problem comes when you have, for instance, a string that isn't
+flagged is UTF-8, and contains a byte sequence that could be UTF-8 -
+especially when combining non-UTF-8 and UTF-8 strings.
+
+Never forget that the C<SVf_UTF8> flag is separate to the PV value; you
+need be sure you don't accidentally knock it off while you're
+manipulating SVs. More specifically, you cannot expect to do this:
+
+    SV *sv;
+    SV *nsv;
+    STRLEN len;
+    char *p;
+
+    p = SvPV(sv, len);
+    frobnicate(p);
+    nsv = newSVpvn(p, len);
+
+The C<char*> string does not tell you the whole story, and you can't
+copy or reconstruct an SV just by copying the string value. Check if the
+old SV has the UTF-8 flag set, and act accordingly:
+
+    p = SvPV(sv, len);
+    frobnicate(p);
+    nsv = newSVpvn(p, len);
+    if (SvUTF8(sv))
+        SvUTF8_on(nsv);
+
+In fact, your C<frobnicate> function should be made aware of whether or
+not it's dealing with UTF-8 data, so that it can handle the string
+appropriately.
+
+Since just passing an SV to an XS function and copying the data of
+the SV is not enough to copy the UTF-8 flags, even less right is just
+passing a C<char *> to an XS function.
+
+=head2 How do I convert a string to UTF-8?
+
+If you're mixing UTF-8 and non-UTF-8 strings, you might find it necessary
+to upgrade one of the strings to UTF-8. If you've got an SV, the easiest
+way to do this is:
+
+    sv_utf8_upgrade(sv);
+
+However, you must not do this, for example:
+
+    if (!SvUTF8(left))
+        sv_utf8_upgrade(left);
+
+If you do this in a binary operator, you will actually change one of the
+strings that came into the operator, and, while it shouldn't be noticeable
+by the end user, it can cause problems.
+
+Instead, C<bytes_to_utf8> will give you a UTF-8-encoded B<copy> of its
+string argument. This is useful for having the data available for
+comparisons and so on, without harming the original SV. There's also
+C<utf8_to_bytes> to go the other way, but naturally, this will fail if
+the string contains any characters above 255 that can't be represented
+in a single byte.
+
+=head2 Is there anything else I need to know?
+
+Not really. Just remember these things:
+
+=over 3
+
+=item *
+
+There's no way to tell if a string is UTF-8 or not. You can tell if an SV
+is UTF-8 by looking at is C<SvUTF8> flag. Don't forget to set the flag if
+something should be UTF-8. Treat the flag as part of the PV, even though
+it's not - if you pass on the PV to somewhere, pass on the flag too.
+
+=item *
+
+If a string is UTF-8, B<always> use C<utf8_to_uv> to get at the value,
+unless C<UTF8_IS_INVARIANT(*s)> in which case you can use C<*s>.
+
+=item *
+
+When writing a character C<uv> to a UTF-8 string, B<always> use
+C<uv_to_utf8>, unless C<UTF8_IS_INVARIANT(uv))> in which case
+you can use C<*s = uv>.
+
+=item *
+
+Mixing UTF-8 and non-UTF-8 strings is tricky. Use C<bytes_to_utf8> to get
+a new string which is UTF-8 encoded. There are tricks you can use to
+delay deciding whether you need to use a UTF-8 string until you get to a
+high character - C<HALF_UPGRADE> is one of those.
+
+=back
+
+=head1 Custom Operators
+
+Custom operator support is a new experimental feature that allows you to
+define your own ops. This is primarily to allow the building of
+interpreters for other languages in the Perl core, but it also allows
+optimizations through the creation of "macro-ops" (ops which perform the
+functions of multiple ops which are usually executed together, such as
+C<gvsv, gvsv, add>.)
+
+This feature is implemented as a new op type, C<OP_CUSTOM>. The Perl
+core does not "know" anything special about this op type, and so it will
+not be involved in any optimizations. This also means that you can
+define your custom ops to be any op structure - unary, binary, list and
+so on - you like.
+
+It's important to know what custom operators won't do for you. They
+won't let you add new syntax to Perl, directly. They won't even let you
+add new keywords, directly. In fact, they won't change the way Perl
+compiles a program at all. You have to do those changes yourself, after
+Perl has compiled the program. You do this either by manipulating the op
+tree using a C<CHECK> block and the C<B::Generate> module, or by adding
+a custom peephole optimizer with the C<optimize> module.
+
+When you do this, you replace ordinary Perl ops with custom ops by
+creating ops with the type C<OP_CUSTOM> and the C<pp_addr> of your own
+PP function. This should be defined in XS code, and should look like
+the PP ops in C<pp_*.c>. You are responsible for ensuring that your op
+takes the appropriate number of values from the stack, and you are
+responsible for adding stack marks if necessary.
+
+You should also "register" your op with the Perl interpreter so that it
+can produce sensible error and warning messages. Since it is possible to
+have multiple custom ops within the one "logical" op type C<OP_CUSTOM>,
+Perl uses the value of C<< o->op_ppaddr >> as a key into the
+C<PL_custom_op_descs> and C<PL_custom_op_names> hashes. This means you
+need to enter a name and description for your op at the appropriate
+place in the C<PL_custom_op_names> and C<PL_custom_op_descs> hashes.
+
+Forthcoming versions of C<B::Generate> (version 1.0 and above) should
+directly support the creation of custom ops by name.
+
+=head1 AUTHORS
+
+Until May 1997, this document was maintained by Jeff Okamoto
+E<lt>okamoto@corp.hp.comE<gt>.  It is now maintained as part of Perl
+itself by the Perl 5 Porters E<lt>perl5-porters@perl.orgE<gt>.
+
+With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
+Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
+Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
+Stephen McCamant, and Gurusamy Sarathy.
+
+=head1 SEE ALSO
+
+perlapi(1), perlintern(1), perlxs(1), perlembed(1)
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhack.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhack.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhack.pod	(revision 14489)
@@ -0,0 +1,2760 @@
+=head1 NAME
+
+perlhack - How to hack at the Perl internals
+
+=head1 DESCRIPTION
+
+This document attempts to explain how Perl development takes place,
+and ends with some suggestions for people wanting to become bona fide
+porters.
+
+The perl5-porters mailing list is where the Perl standard distribution
+is maintained and developed.  The list can get anywhere from 10 to 150
+messages a day, depending on the heatedness of the debate.  Most days
+there are two or three patches, extensions, features, or bugs being
+discussed at a time.
+
+A searchable archive of the list is at either:
+
+    http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/
+
+or
+
+    http://archive.develooper.com/perl5-porters@perl.org/
+
+List subscribers (the porters themselves) come in several flavours.
+Some are quiet curious lurkers, who rarely pitch in and instead watch
+the ongoing development to ensure they're forewarned of new changes or
+features in Perl.  Some are representatives of vendors, who are there
+to make sure that Perl continues to compile and work on their
+platforms.  Some patch any reported bug that they know how to fix,
+some are actively patching their pet area (threads, Win32, the regexp
+engine), while others seem to do nothing but complain.  In other
+words, it's your usual mix of technical people.
+
+Over this group of porters presides Larry Wall.  He has the final word
+in what does and does not change in the Perl language.  Various
+releases of Perl are shepherded by a "pumpking", a porter
+responsible for gathering patches, deciding on a patch-by-patch,
+feature-by-feature basis what will and will not go into the release.
+For instance, Gurusamy Sarathy was the pumpking for the 5.6 release of
+Perl, and Jarkko Hietaniemi was the pumpking for the 5.8 release, and
+Rafael Garcia-Suarez holds the pumpking crown for the 5.10 release.
+
+In addition, various people are pumpkings for different things.  For
+instance, Andy Dougherty and Jarkko Hietaniemi did a grand job as the
+I<Configure> pumpkin up till the 5.8 release. For the 5.10 release
+H.Merijn Brand took over.
+
+Larry sees Perl development along the lines of the US government:
+there's the Legislature (the porters), the Executive branch (the
+pumpkings), and the Supreme Court (Larry).  The legislature can
+discuss and submit patches to the executive branch all they like, but
+the executive branch is free to veto them.  Rarely, the Supreme Court
+will side with the executive branch over the legislature, or the
+legislature over the executive branch.  Mostly, however, the
+legislature and the executive branch are supposed to get along and
+work out their differences without impeachment or court cases.
+
+You might sometimes see reference to Rule 1 and Rule 2.  Larry's power
+as Supreme Court is expressed in The Rules:
+
+=over 4
+
+=item 1
+
+Larry is always by definition right about how Perl should behave.
+This means he has final veto power on the core functionality.
+
+=item 2
+
+Larry is allowed to change his mind about any matter at a later date,
+regardless of whether he previously invoked Rule 1.
+
+=back
+
+Got that?  Larry is always right, even when he was wrong.  It's rare
+to see either Rule exercised, but they are often alluded to.
+
+New features and extensions to the language are contentious, because
+the criteria used by the pumpkings, Larry, and other porters to decide
+which features should be implemented and incorporated are not codified
+in a few small design goals as with some other languages.  Instead,
+the heuristics are flexible and often difficult to fathom.  Here is
+one person's list, roughly in decreasing order of importance, of
+heuristics that new features have to be weighed against:
+
+=over 4
+
+=item Does concept match the general goals of Perl?
+
+These haven't been written anywhere in stone, but one approximation
+is:
+
+ 1. Keep it fast, simple, and useful.
+ 2. Keep features/concepts as orthogonal as possible.
+ 3. No arbitrary limits (platforms, data sizes, cultures).
+ 4. Keep it open and exciting to use/patch/advocate Perl everywhere.
+ 5. Either assimilate new technologies, or build bridges to them.
+
+=item Where is the implementation?
+
+All the talk in the world is useless without an implementation.  In
+almost every case, the person or people who argue for a new feature
+will be expected to be the ones who implement it.  Porters capable
+of coding new features have their own agendas, and are not available
+to implement your (possibly good) idea.
+
+=item Backwards compatibility
+
+It's a cardinal sin to break existing Perl programs.  New warnings are
+contentious--some say that a program that emits warnings is not
+broken, while others say it is.  Adding keywords has the potential to
+break programs, changing the meaning of existing token sequences or
+functions might break programs.
+
+=item Could it be a module instead?
+
+Perl 5 has extension mechanisms, modules and XS, specifically to avoid
+the need to keep changing the Perl interpreter.  You can write modules
+that export functions, you can give those functions prototypes so they
+can be called like built-in functions, you can even write XS code to
+mess with the runtime data structures of the Perl interpreter if you
+want to implement really complicated things.  If it can be done in a
+module instead of in the core, it's highly unlikely to be added.
+
+=item Is the feature generic enough?
+
+Is this something that only the submitter wants added to the language,
+or would it be broadly useful?  Sometimes, instead of adding a feature
+with a tight focus, the porters might decide to wait until someone
+implements the more generalized feature.  For instance, instead of
+implementing a "delayed evaluation" feature, the porters are waiting
+for a macro system that would permit delayed evaluation and much more.
+
+=item Does it potentially introduce new bugs?
+
+Radical rewrites of large chunks of the Perl interpreter have the
+potential to introduce new bugs.  The smaller and more localized the
+change, the better.
+
+=item Does it preclude other desirable features?
+
+A patch is likely to be rejected if it closes off future avenues of
+development.  For instance, a patch that placed a true and final
+interpretation on prototypes is likely to be rejected because there
+are still options for the future of prototypes that haven't been
+addressed.
+
+=item Is the implementation robust?
+
+Good patches (tight code, complete, correct) stand more chance of
+going in.  Sloppy or incorrect patches might be placed on the back
+burner until the pumpking has time to fix, or might be discarded
+altogether without further notice.
+
+=item Is the implementation generic enough to be portable?
+
+The worst patches make use of a system-specific features.  It's highly
+unlikely that nonportable additions to the Perl language will be
+accepted.
+
+=item Is the implementation tested?
+
+Patches which change behaviour (fixing bugs or introducing new features)
+must include regression tests to verify that everything works as expected.
+Without tests provided by the original author, how can anyone else changing
+perl in the future be sure that they haven't unwittingly broken the behaviour
+the patch implements? And without tests, how can the patch's author be
+confident that his/her hard work put into the patch won't be accidentally
+thrown away by someone in the future?
+
+=item Is there enough documentation?
+
+Patches without documentation are probably ill-thought out or
+incomplete.  Nothing can be added without documentation, so submitting
+a patch for the appropriate manpages as well as the source code is
+always a good idea.
+
+=item Is there another way to do it?
+
+Larry said "Although the Perl Slogan is I<There's More Than One Way
+to Do It>, I hesitate to make 10 ways to do something".  This is a
+tricky heuristic to navigate, though--one man's essential addition is
+another man's pointless cruft.
+
+=item Does it create too much work?
+
+Work for the pumpking, work for Perl programmers, work for module
+authors, ...  Perl is supposed to be easy.
+
+=item Patches speak louder than words
+
+Working code is always preferred to pie-in-the-sky ideas.  A patch to
+add a feature stands a much higher chance of making it to the language
+than does a random feature request, no matter how fervently argued the
+request might be.  This ties into "Will it be useful?", as the fact
+that someone took the time to make the patch demonstrates a strong
+desire for the feature.
+
+=back
+
+If you're on the list, you might hear the word "core" bandied
+around.  It refers to the standard distribution.  "Hacking on the
+core" means you're changing the C source code to the Perl
+interpreter.  "A core module" is one that ships with Perl.
+
+=head2 Keeping in sync
+
+The source code to the Perl interpreter, in its different versions, is
+kept in a repository managed by a revision control system ( which is
+currently the Perforce program, see http://perforce.com/ ).  The
+pumpkings and a few others have access to the repository to check in
+changes.  Periodically the pumpking for the development version of Perl
+will release a new version, so the rest of the porters can see what's
+changed.  The current state of the main trunk of repository, and patches
+that describe the individual changes that have happened since the last
+public release are available at this location:
+
+    http://public.activestate.com/pub/apc/
+    ftp://public.activestate.com/pub/apc/
+
+If you're looking for a particular change, or a change that affected
+a particular set of files, you may find the B<Perl Repository Browser>
+useful:
+
+    http://public.activestate.com/cgi-bin/perlbrowse
+
+You may also want to subscribe to the perl5-changes mailing list to
+receive a copy of each patch that gets submitted to the maintenance
+and development "branches" of the perl repository.  See
+http://lists.perl.org/ for subscription information.
+
+If you are a member of the perl5-porters mailing list, it is a good
+thing to keep in touch with the most recent changes. If not only to
+verify if what you would have posted as a bug report isn't already
+solved in the most recent available perl development branch, also
+known as perl-current, bleading edge perl, bleedperl or bleadperl.
+
+Needless to say, the source code in perl-current is usually in a perpetual
+state of evolution.  You should expect it to be very buggy.  Do B<not> use
+it for any purpose other than testing and development.
+
+Keeping in sync with the most recent branch can be done in several ways,
+but the most convenient and reliable way is using B<rsync>, available at
+ftp://rsync.samba.org/pub/rsync/ .  (You can also get the most recent
+branch by FTP.)
+
+If you choose to keep in sync using rsync, there are two approaches
+to doing so:
+
+=over 4
+
+=item rsync'ing the source tree
+
+Presuming you are in the directory where your perl source resides
+and you have rsync installed and available, you can "upgrade" to
+the bleadperl using:
+
+ # rsync -avz rsync://public.activestate.com/perl-current/ .
+
+This takes care of updating every single item in the source tree to
+the latest applied patch level, creating files that are new (to your
+distribution) and setting date/time stamps of existing files to
+reflect the bleadperl status.
+
+Note that this will not delete any files that were in '.' before
+the rsync. Once you are sure that the rsync is running correctly,
+run it with the --delete and the --dry-run options like this:
+
+ # rsync -avz --delete --dry-run rsync://public.activestate.com/perl-current/ .
+
+This will I<simulate> an rsync run that also deletes files not
+present in the bleadperl master copy. Observe the results from
+this run closely. If you are sure that the actual run would delete
+no files precious to you, you could remove the '--dry-run' option.
+
+You can than check what patch was the latest that was applied by
+looking in the file B<.patch>, which will show the number of the
+latest patch.
+
+If you have more than one machine to keep in sync, and not all of
+them have access to the WAN (so you are not able to rsync all the
+source trees to the real source), there are some ways to get around
+this problem.
+
+=over 4
+
+=item Using rsync over the LAN
+
+Set up a local rsync server which makes the rsynced source tree
+available to the LAN and sync the other machines against this
+directory.
+
+From http://rsync.samba.org/README.html :
+
+   "Rsync uses rsh or ssh for communication. It does not need to be
+    setuid and requires no special privileges for installation.  It
+    does not require an inetd entry or a daemon.  You must, however,
+    have a working rsh or ssh system.  Using ssh is recommended for
+    its security features."
+
+=item Using pushing over the NFS
+
+Having the other systems mounted over the NFS, you can take an
+active pushing approach by checking the just updated tree against
+the other not-yet synced trees. An example would be
+
+  #!/usr/bin/perl -w
+
+  use strict;
+  use File::Copy;
+
+  my %MF = map {
+      m/(\S+)/;
+      $1 => [ (stat $1)[2, 7, 9] ];	# mode, size, mtime
+      } `cat MANIFEST`;
+
+  my %remote = map { $_ => "/$_/pro/3gl/CPAN/perl-5.7.1" } qw(host1 host2);
+
+  foreach my $host (keys %remote) {
+      unless (-d $remote{$host}) {
+	  print STDERR "Cannot Xsync for host $host\n";
+	  next;
+	  }
+      foreach my $file (keys %MF) {
+	  my $rfile = "$remote{$host}/$file";
+	  my ($mode, $size, $mtime) = (stat $rfile)[2, 7, 9];
+	  defined $size or ($mode, $size, $mtime) = (0, 0, 0);
+	  $size == $MF{$file}[1] && $mtime == $MF{$file}[2] and next;
+	  printf "%4s %-34s %8d %9d  %8d %9d\n",
+	      $host, $file, $MF{$file}[1], $MF{$file}[2], $size, $mtime;
+	  unlink $rfile;
+	  copy ($file, $rfile);
+	  utime time, $MF{$file}[2], $rfile;
+	  chmod $MF{$file}[0], $rfile;
+	  }
+      }
+
+though this is not perfect. It could be improved with checking
+file checksums before updating. Not all NFS systems support
+reliable utime support (when used over the NFS).
+
+=back
+
+=item rsync'ing the patches
+
+The source tree is maintained by the pumpking who applies patches to
+the files in the tree. These patches are either created by the
+pumpking himself using C<diff -c> after updating the file manually or
+by applying patches sent in by posters on the perl5-porters list.
+These patches are also saved and rsync'able, so you can apply them
+yourself to the source files.
+
+Presuming you are in a directory where your patches reside, you can
+get them in sync with
+
+ # rsync -avz rsync://public.activestate.com/perl-current-diffs/ .
+
+This makes sure the latest available patch is downloaded to your
+patch directory.
+
+It's then up to you to apply these patches, using something like
+
+ # last=`ls -t *.gz | sed q`
+ # rsync -avz rsync://public.activestate.com/perl-current-diffs/ .
+ # find . -name '*.gz' -newer $last -exec gzcat {} \; >blead.patch
+ # cd ../perl-current
+ # patch -p1 -N <../perl-current-diffs/blead.patch
+
+or, since this is only a hint towards how it works, use CPAN-patchaperl
+from Andreas König to have better control over the patching process.
+
+=back
+
+=head2 Why rsync the source tree
+
+=over 4
+
+=item It's easier to rsync the source tree
+
+Since you don't have to apply the patches yourself, you are sure all
+files in the source tree are in the right state.
+
+=item It's more reliable
+
+While both the rsync-able source and patch areas are automatically
+updated every few minutes, keep in mind that applying patches may
+sometimes mean careful hand-holding, especially if your version of
+the C<patch> program does not understand how to deal with new files,
+files with 8-bit characters, or files without trailing newlines.
+
+=back
+
+=head2 Why rsync the patches
+
+=over 4
+
+=item It's easier to rsync the patches
+
+If you have more than one machine that you want to keep in track with
+bleadperl, it's easier to rsync the patches only once and then apply
+them to all the source trees on the different machines.
+
+In case you try to keep in pace on 5 different machines, for which
+only one of them has access to the WAN, rsync'ing all the source
+trees should than be done 5 times over the NFS. Having
+rsync'ed the patches only once, I can apply them to all the source
+trees automatically. Need you say more ;-)
+
+=item It's a good reference
+
+If you do not only like to have the most recent development branch,
+but also like to B<fix> bugs, or extend features, you want to dive
+into the sources. If you are a seasoned perl core diver, you don't
+need no manuals, tips, roadmaps, perlguts.pod or other aids to find
+your way around. But if you are a starter, the patches may help you
+in finding where you should start and how to change the bits that
+bug you.
+
+The file B<Changes> is updated on occasions the pumpking sees as his
+own little sync points. On those occasions, he releases a tar-ball of
+the current source tree (i.e. perl@7582.tar.gz), which will be an
+excellent point to start with when choosing to use the 'rsync the
+patches' scheme. Starting with perl@7582, which means a set of source
+files on which the latest applied patch is number 7582, you apply all
+succeeding patches available from then on (7583, 7584, ...).
+
+You can use the patches later as a kind of search archive.
+
+=over 4
+
+=item Finding a start point
+
+If you want to fix/change the behaviour of function/feature Foo, just
+scan the patches for patches that mention Foo either in the subject,
+the comments, or the body of the fix. A good chance the patch shows
+you the files that are affected by that patch which are very likely
+to be the starting point of your journey into the guts of perl.
+
+=item Finding how to fix a bug
+
+If you've found I<where> the function/feature Foo misbehaves, but you
+don't know how to fix it (but you do know the change you want to
+make), you can, again, peruse the patches for similar changes and
+look how others apply the fix.
+
+=item Finding the source of misbehaviour
+
+When you keep in sync with bleadperl, the pumpking would love to
+I<see> that the community efforts really work. So after each of his
+sync points, you are to 'make test' to check if everything is still
+in working order. If it is, you do 'make ok', which will send an OK
+report to perlbug@perl.org. (If you do not have access to a mailer
+from the system you just finished successfully 'make test', you can
+do 'make okfile', which creates the file C<perl.ok>, which you can
+than take to your favourite mailer and mail yourself).
+
+But of course, as always, things will not always lead to a success
+path, and one or more test do not pass the 'make test'. Before
+sending in a bug report (using 'make nok' or 'make nokfile'), check
+the mailing list if someone else has reported the bug already and if
+so, confirm it by replying to that message. If not, you might want to
+trace the source of that misbehaviour B<before> sending in the bug,
+which will help all the other porters in finding the solution.
+
+Here the saved patches come in very handy. You can check the list of
+patches to see which patch changed what file and what change caused
+the misbehaviour. If you note that in the bug report, it saves the
+one trying to solve it, looking for that point.
+
+=back
+
+If searching the patches is too bothersome, you might consider using
+perl's bugtron to find more information about discussions and
+ramblings on posted bugs.
+
+If you want to get the best of both worlds, rsync both the source
+tree for convenience, reliability and ease and rsync the patches
+for reference.
+
+=back
+
+=head2 Working with the source
+
+Because you cannot use the Perforce client, you cannot easily generate
+diffs against the repository, nor will merges occur when you update
+via rsync.  If you edit a file locally and then rsync against the
+latest source, changes made in the remote copy will I<overwrite> your
+local versions!
+
+The best way to deal with this is to maintain a tree of symlinks to
+the rsync'd source.  Then, when you want to edit a file, you remove
+the symlink, copy the real file into the other tree, and edit it.  You
+can then diff your edited file against the original to generate a
+patch, and you can safely update the original tree.
+
+Perl's F<Configure> script can generate this tree of symlinks for you.
+The following example assumes that you have used rsync to pull a copy
+of the Perl source into the F<perl-rsync> directory.  In the directory
+above that one, you can execute the following commands:
+
+  mkdir perl-dev
+  cd perl-dev
+  ../perl-rsync/Configure -Dmksymlinks -Dusedevel -D"optimize=-g"
+
+This will start the Perl configuration process.  After a few prompts,
+you should see something like this:
+
+  Symbolic links are supported.
+
+  Checking how to test for symbolic links...
+  Your builtin 'test -h' may be broken.
+  Trying external '/usr/bin/test -h'.
+  You can test for symbolic links with '/usr/bin/test -h'.
+
+  Creating the symbolic links...
+  (First creating the subdirectories...)
+  (Then creating the symlinks...)
+
+The specifics may vary based on your operating system, of course.
+After you see this, you can abort the F<Configure> script, and you
+will see that the directory you are in has a tree of symlinks to the
+F<perl-rsync> directories and files.
+
+If you plan to do a lot of work with the Perl source, here are some
+Bourne shell script functions that can make your life easier:
+
+    function edit {
+	if [ -L $1 ]; then
+	    mv $1 $1.orig
+		cp $1.orig $1
+		vi $1
+	else
+	    /bin/vi $1
+		fi
+    }
+
+    function unedit {
+	if [ -L $1.orig ]; then
+	    rm $1
+		mv $1.orig $1
+		fi
+    }
+
+Replace "vi" with your favorite flavor of editor.
+
+Here is another function which will quickly generate a patch for the
+files which have been edited in your symlink tree:
+
+    mkpatchorig() {
+	local diffopts
+	    for f in `find . -name '*.orig' | sed s,^\./,,`
+		do
+		    case `echo $f | sed 's,.orig$,,;s,.*\.,,'` in
+			c)   diffopts=-p ;;
+		pod) diffopts='-F^=' ;;
+		*)   diffopts= ;;
+		esac
+		    diff -du $diffopts $f `echo $f | sed 's,.orig$,,'`
+		    done
+    }
+
+This function produces patches which include enough context to make
+your changes obvious.  This makes it easier for the Perl pumpking(s)
+to review them when you send them to the perl5-porters list, and that
+means they're more likely to get applied.
+
+This function assumed a GNU diff, and may require some tweaking for
+other diff variants.
+
+=head2 Perlbug administration
+
+There is a single remote administrative interface for modifying bug status, 
+category, open issues etc. using the B<RT> I<bugtracker> system, maintained
+by I<Robert Spier>.  Become an administrator, and close any bugs you can get 
+your sticky mitts on:
+
+	http://rt.perl.org
+
+The bugtracker mechanism for B<perl5> bugs in particular is at:
+
+	http://bugs6.perl.org/perlbug
+
+To email the bug system administrators:
+
+	"perlbug-admin" <perlbug-admin@perl.org>
+
+
+=head2 Submitting patches
+
+Always submit patches to I<perl5-porters@perl.org>.  If you're
+patching a core module and there's an author listed, send the author a
+copy (see L<Patching a core module>).  This lets other porters review
+your patch, which catches a surprising number of errors in patches.
+Either use the diff program (available in source code form from
+ftp://ftp.gnu.org/pub/gnu/ , or use Johan Vromans' I<makepatch>
+(available from I<CPAN/authors/id/JV/>).  Unified diffs are preferred,
+but context diffs are accepted.  Do not send RCS-style diffs or diffs
+without context lines.  More information is given in the
+I<Porting/patching.pod> file in the Perl source distribution.  Please
+patch against the latest B<development> version (e.g., if you're
+fixing a bug in the 5.005 track, patch against the latest 5.005_5x
+version).  Only patches that survive the heat of the development
+branch get applied to maintenance versions.
+
+Your patch should update the documentation and test suite.  See
+L<Writing a test>.
+
+To report a bug in Perl, use the program I<perlbug> which comes with
+Perl (if you can't get Perl to work, send mail to the address
+I<perlbug@perl.org> or I<perlbug@perl.com>).  Reporting bugs through
+I<perlbug> feeds into the automated bug-tracking system, access to
+which is provided through the web at http://bugs.perl.org/ .  It
+often pays to check the archives of the perl5-porters mailing list to
+see whether the bug you're reporting has been reported before, and if
+so whether it was considered a bug.  See above for the location of
+the searchable archives.
+
+The CPAN testers ( http://testers.cpan.org/ ) are a group of
+volunteers who test CPAN modules on a variety of platforms.  Perl
+Smokers ( http://archives.develooper.com/daily-build@perl.org/ )
+automatically tests Perl source releases on platforms with various
+configurations.  Both efforts welcome volunteers.
+
+It's a good idea to read and lurk for a while before chipping in.
+That way you'll get to see the dynamic of the conversations, learn the
+personalities of the players, and hopefully be better prepared to make
+a useful contribution when do you speak up.
+
+If after all this you still think you want to join the perl5-porters
+mailing list, send mail to I<perl5-porters-subscribe@perl.org>.  To
+unsubscribe, send mail to I<perl5-porters-unsubscribe@perl.org>.
+
+To hack on the Perl guts, you'll need to read the following things:
+
+=over 3
+
+=item L<perlguts>
+
+This is of paramount importance, since it's the documentation of what
+goes where in the Perl source. Read it over a couple of times and it
+might start to make sense - don't worry if it doesn't yet, because the
+best way to study it is to read it in conjunction with poking at Perl
+source, and we'll do that later on.
+
+You might also want to look at Gisle Aas's illustrated perlguts -
+there's no guarantee that this will be absolutely up-to-date with the
+latest documentation in the Perl core, but the fundamentals will be
+right. ( http://gisle.aas.no/perl/illguts/ )
+
+=item L<perlxstut> and L<perlxs>
+
+A working knowledge of XSUB programming is incredibly useful for core
+hacking; XSUBs use techniques drawn from the PP code, the portion of the
+guts that actually executes a Perl program. It's a lot gentler to learn
+those techniques from simple examples and explanation than from the core
+itself.
+
+=item L<perlapi>
+
+The documentation for the Perl API explains what some of the internal
+functions do, as well as the many macros used in the source.
+
+=item F<Porting/pumpkin.pod>
+
+This is a collection of words of wisdom for a Perl porter; some of it is
+only useful to the pumpkin holder, but most of it applies to anyone
+wanting to go about Perl development.
+
+=item The perl5-porters FAQ
+
+This should be available from http://simon-cozens.org/writings/p5p-faq ;
+alternatively, you can get the FAQ emailed to you by sending mail to
+C<perl5-porters-faq@perl.org>. It contains hints on reading perl5-porters,
+information on how perl5-porters works and how Perl development in general
+works.
+
+=back
+
+=head2 Finding Your Way Around
+
+Perl maintenance can be split into a number of areas, and certain people
+(pumpkins) will have responsibility for each area. These areas sometimes
+correspond to files or directories in the source kit. Among the areas are:
+
+=over 3
+
+=item Core modules
+
+Modules shipped as part of the Perl core live in the F<lib/> and F<ext/>
+subdirectories: F<lib/> is for the pure-Perl modules, and F<ext/>
+contains the core XS modules.
+
+=item Tests
+
+There are tests for nearly all the modules, built-ins and major bits
+of functionality.  Test files all have a .t suffix.  Module tests live
+in the F<lib/> and F<ext/> directories next to the module being
+tested.  Others live in F<t/>.  See L<Writing a test>
+
+=item Documentation
+
+Documentation maintenance includes looking after everything in the
+F<pod/> directory, (as well as contributing new documentation) and
+the documentation to the modules in core.
+
+=item Configure
+
+The configure process is the way we make Perl portable across the
+myriad of operating systems it supports. Responsibility for the
+configure, build and installation process, as well as the overall
+portability of the core code rests with the configure pumpkin - others
+help out with individual operating systems.
+
+The files involved are the operating system directories, (F<win32/>,
+F<os2/>, F<vms/> and so on) the shell scripts which generate F<config.h>
+and F<Makefile>, as well as the metaconfig files which generate
+F<Configure>. (metaconfig isn't included in the core distribution.)
+
+=item Interpreter
+
+And of course, there's the core of the Perl interpreter itself. Let's
+have a look at that in a little more detail.
+
+=back
+
+Before we leave looking at the layout, though, don't forget that
+F<MANIFEST> contains not only the file names in the Perl distribution,
+but short descriptions of what's in them, too. For an overview of the
+important files, try this:
+
+    perl -lne 'print if /^[^\/]+\.[ch]\s+/' MANIFEST
+
+=head2 Elements of the interpreter
+
+The work of the interpreter has two main stages: compiling the code
+into the internal representation, or bytecode, and then executing it.
+L<perlguts/Compiled code> explains exactly how the compilation stage
+happens.
+
+Here is a short breakdown of perl's operation:
+
+=over 3
+
+=item Startup
+
+The action begins in F<perlmain.c>. (or F<miniperlmain.c> for miniperl)
+This is very high-level code, enough to fit on a single screen, and it
+resembles the code found in L<perlembed>; most of the real action takes
+place in F<perl.c>
+
+First, F<perlmain.c> allocates some memory and constructs a Perl
+interpreter:
+
+    1 PERL_SYS_INIT3(&argc,&argv,&env);
+    2
+    3 if (!PL_do_undump) {
+    4     my_perl = perl_alloc();
+    5     if (!my_perl)
+    6         exit(1);
+    7     perl_construct(my_perl);
+    8     PL_perl_destruct_level = 0;
+    9 }
+
+Line 1 is a macro, and its definition is dependent on your operating
+system. Line 3 references C<PL_do_undump>, a global variable - all
+global variables in Perl start with C<PL_>. This tells you whether the
+current running program was created with the C<-u> flag to perl and then
+F<undump>, which means it's going to be false in any sane context.
+
+Line 4 calls a function in F<perl.c> to allocate memory for a Perl
+interpreter. It's quite a simple function, and the guts of it looks like
+this:
+
+    my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
+
+Here you see an example of Perl's system abstraction, which we'll see
+later: C<PerlMem_malloc> is either your system's C<malloc>, or Perl's
+own C<malloc> as defined in F<malloc.c> if you selected that option at
+configure time.
+
+Next, in line 7, we construct the interpreter; this sets up all the
+special variables that Perl needs, the stacks, and so on.
+
+Now we pass Perl the command line options, and tell it to go:
+
+    exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
+    if (!exitstatus) {
+        exitstatus = perl_run(my_perl);
+    }
+
+
+C<perl_parse> is actually a wrapper around C<S_parse_body>, as defined
+in F<perl.c>, which processes the command line options, sets up any
+statically linked XS modules, opens the program and calls C<yyparse> to
+parse it.
+
+=item Parsing
+
+The aim of this stage is to take the Perl source, and turn it into an op
+tree. We'll see what one of those looks like later. Strictly speaking,
+there's three things going on here.
+
+C<yyparse>, the parser, lives in F<perly.c>, although you're better off
+reading the original YACC input in F<perly.y>. (Yes, Virginia, there
+B<is> a YACC grammar for Perl!) The job of the parser is to take your
+code and "understand" it, splitting it into sentences, deciding which
+operands go with which operators and so on.
+
+The parser is nobly assisted by the lexer, which chunks up your input
+into tokens, and decides what type of thing each token is: a variable
+name, an operator, a bareword, a subroutine, a core function, and so on.
+The main point of entry to the lexer is C<yylex>, and that and its
+associated routines can be found in F<toke.c>. Perl isn't much like
+other computer languages; it's highly context sensitive at times, it can
+be tricky to work out what sort of token something is, or where a token
+ends. As such, there's a lot of interplay between the tokeniser and the
+parser, which can get pretty frightening if you're not used to it.
+
+As the parser understands a Perl program, it builds up a tree of
+operations for the interpreter to perform during execution. The routines
+which construct and link together the various operations are to be found
+in F<op.c>, and will be examined later.
+
+=item Optimization
+
+Now the parsing stage is complete, and the finished tree represents
+the operations that the Perl interpreter needs to perform to execute our
+program. Next, Perl does a dry run over the tree looking for
+optimisations: constant expressions such as C<3 + 4> will be computed
+now, and the optimizer will also see if any multiple operations can be
+replaced with a single one. For instance, to fetch the variable C<$foo>,
+instead of grabbing the glob C<*foo> and looking at the scalar
+component, the optimizer fiddles the op tree to use a function which
+directly looks up the scalar in question. The main optimizer is C<peep>
+in F<op.c>, and many ops have their own optimizing functions.
+
+=item Running
+
+Now we're finally ready to go: we have compiled Perl byte code, and all
+that's left to do is run it. The actual execution is done by the
+C<runops_standard> function in F<run.c>; more specifically, it's done by
+these three innocent looking lines:
+
+    while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX))) {
+        PERL_ASYNC_CHECK();
+    }
+
+You may be more comfortable with the Perl version of that:
+
+    PERL_ASYNC_CHECK() while $Perl::op = &{$Perl::op->{function}};
+
+Well, maybe not. Anyway, each op contains a function pointer, which
+stipulates the function which will actually carry out the operation.
+This function will return the next op in the sequence - this allows for
+things like C<if> which choose the next op dynamically at run time.
+The C<PERL_ASYNC_CHECK> makes sure that things like signals interrupt
+execution if required.
+
+The actual functions called are known as PP code, and they're spread
+between four files: F<pp_hot.c> contains the "hot" code, which is most
+often used and highly optimized, F<pp_sys.c> contains all the
+system-specific functions, F<pp_ctl.c> contains the functions which
+implement control structures (C<if>, C<while> and the like) and F<pp.c>
+contains everything else. These are, if you like, the C code for Perl's
+built-in functions and operators.
+
+Note that each C<pp_> function is expected to return a pointer to the next
+op. Calls to perl subs (and eval blocks) are handled within the same
+runops loop, and do not consume extra space on the C stack. For example,
+C<pp_entersub> and C<pp_entertry> just push a C<CxSUB> or C<CxEVAL> block
+struct onto the context stack which contain the address of the op
+following the sub call or eval. They then return the first op of that sub
+or eval block, and so execution continues of that sub or block.  Later, a
+C<pp_leavesub> or C<pp_leavetry> op pops the C<CxSUB> or C<CxEVAL>,
+retrieves the return op from it, and returns it.
+
+=item Exception handing
+
+Perl's exception handing (i.e. C<die> etc) is built on top of the low-level
+C<setjmp()>/C<longjmp()> C-library functions. These basically provide a
+way to capture the current PC and SP registers and later restore them; i.e.
+a C<longjmp()> continues at the point in code where a previous C<setjmp()>
+was done, with anything further up on the C stack being lost. This is why
+code should always save values using C<SAVE_FOO> rather than in auto
+variables.
+
+The perl core wraps C<setjmp()> etc in the macros C<JMPENV_PUSH> and
+C<JMPENV_JUMP>. The basic rule of perl exceptions is that C<exit>, and
+C<die> (in the absence of C<eval>) perform a C<JMPENV_JUMP(2)>, while
+C<die> within C<eval> does a C<JMPENV_JUMP(3)>.
+
+At entry points to perl, such as C<perl_parse()>, C<perl_run()> and
+C<call_sv(cv, G_EVAL)> each does a C<JMPENV_PUSH>, then enter a runops
+loop or whatever, and handle possible exception returns. For a 2 return,
+final cleanup is performed, such as popping stacks and calling C<CHECK> or
+C<END> blocks. Amongst other things, this is how scope cleanup still
+occurs during an C<exit>.
+
+If a C<die> can find a C<CxEVAL> block on the context stack, then the
+stack is popped to that level and the return op in that block is assigned
+to C<PL_restartop>; then a C<JMPENV_JUMP(3)> is performed.  This normally
+passes control back to the guard. In the case of C<perl_run> and
+C<call_sv>, a non-null C<PL_restartop> triggers re-entry to the runops
+loop. The is the normal way that C<die> or C<croak> is handled within an
+C<eval>.
+
+Sometimes ops are executed within an inner runops loop, such as tie, sort
+or overload code. In this case, something like
+
+    sub FETCH { eval { die } }
+
+would cause a longjmp right back to the guard in C<perl_run>, popping both
+runops loops, which is clearly incorrect. One way to avoid this is for the
+tie code to do a C<JMPENV_PUSH> before executing C<FETCH> in the inner
+runops loop, but for efficiency reasons, perl in fact just sets a flag,
+using C<CATCH_SET(TRUE)>. The C<pp_require>, C<pp_entereval> and
+C<pp_entertry> ops check this flag, and if true, they call C<docatch>,
+which does a C<JMPENV_PUSH> and starts a new runops level to execute the
+code, rather than doing it on the current loop.
+
+As a further optimisation, on exit from the eval block in the C<FETCH>,
+execution of the code following the block is still carried on in the inner
+loop.  When an exception is raised, C<docatch> compares the C<JMPENV>
+level of the C<CxEVAL> with C<PL_top_env> and if they differ, just
+re-throws the exception. In this way any inner loops get popped.
+
+Here's an example.
+
+    1: eval { tie @a, 'A' };
+    2: sub A::TIEARRAY {
+    3:     eval { die };
+    4:     die;
+    5: }
+
+To run this code, C<perl_run> is called, which does a C<JMPENV_PUSH> then
+enters a runops loop. This loop executes the eval and tie ops on line 1,
+with the eval pushing a C<CxEVAL> onto the context stack.
+
+The C<pp_tie> does a C<CATCH_SET(TRUE)>, then starts a second runops loop
+to execute the body of C<TIEARRAY>. When it executes the entertry op on
+line 3, C<CATCH_GET> is true, so C<pp_entertry> calls C<docatch> which
+does a C<JMPENV_PUSH> and starts a third runops loop, which then executes
+the die op. At this point the C call stack looks like this:
+
+    Perl_pp_die
+    Perl_runops      # third loop
+    S_docatch_body
+    S_docatch
+    Perl_pp_entertry
+    Perl_runops      # second loop
+    S_call_body
+    Perl_call_sv
+    Perl_pp_tie
+    Perl_runops      # first loop
+    S_run_body
+    perl_run
+    main
+
+and the context and data stacks, as shown by C<-Dstv>, look like:
+
+    STACK 0: MAIN
+      CX 0: BLOCK  =>
+      CX 1: EVAL   => AV()  PV("A"\0)
+      retop=leave
+    STACK 1: MAGIC
+      CX 0: SUB    =>
+      retop=(null)
+      CX 1: EVAL   => *
+    retop=nextstate
+
+The die pops the first C<CxEVAL> off the context stack, sets
+C<PL_restartop> from it, does a C<JMPENV_JUMP(3)>, and control returns to
+the top C<docatch>. This then starts another third-level runops level,
+which executes the nextstate, pushmark and die ops on line 4. At the point
+that the second C<pp_die> is called, the C call stack looks exactly like
+that above, even though we are no longer within an inner eval; this is
+because of the optimization mentioned earlier. However, the context stack
+now looks like this, ie with the top CxEVAL popped:
+
+    STACK 0: MAIN
+      CX 0: BLOCK  =>
+      CX 1: EVAL   => AV()  PV("A"\0)
+      retop=leave
+    STACK 1: MAGIC
+      CX 0: SUB    =>
+      retop=(null)
+
+The die on line 4 pops the context stack back down to the CxEVAL, leaving
+it as:
+
+    STACK 0: MAIN
+      CX 0: BLOCK  =>
+
+As usual, C<PL_restartop> is extracted from the C<CxEVAL>, and a
+C<JMPENV_JUMP(3)> done, which pops the C stack back to the docatch:
+
+    S_docatch
+    Perl_pp_entertry
+    Perl_runops      # second loop
+    S_call_body
+    Perl_call_sv
+    Perl_pp_tie
+    Perl_runops      # first loop
+    S_run_body
+    perl_run
+    main
+
+In  this case, because the C<JMPENV> level recorded in the C<CxEVAL>
+differs from the current one, C<docatch> just does a C<JMPENV_JUMP(3)>
+and the C stack unwinds to:
+
+    perl_run
+    main
+
+Because C<PL_restartop> is non-null, C<run_body> starts a new runops loop
+and execution continues.
+
+=back
+
+=head2 Internal Variable Types
+
+You should by now have had a look at L<perlguts>, which tells you about
+Perl's internal variable types: SVs, HVs, AVs and the rest. If not, do
+that now.
+
+These variables are used not only to represent Perl-space variables, but
+also any constants in the code, as well as some structures completely
+internal to Perl. The symbol table, for instance, is an ordinary Perl
+hash. Your code is represented by an SV as it's read into the parser;
+any program files you call are opened via ordinary Perl filehandles, and
+so on.
+
+The core L<Devel::Peek|Devel::Peek> module lets us examine SVs from a
+Perl program. Let's see, for instance, how Perl treats the constant
+C<"hello">.
+
+      % perl -MDevel::Peek -e 'Dump("hello")'
+    1 SV = PV(0xa041450) at 0xa04ecbc
+    2   REFCNT = 1
+    3   FLAGS = (POK,READONLY,pPOK)
+    4   PV = 0xa0484e0 "hello"\0
+    5   CUR = 5
+    6   LEN = 6
+
+Reading C<Devel::Peek> output takes a bit of practise, so let's go
+through it line by line.
+
+Line 1 tells us we're looking at an SV which lives at C<0xa04ecbc> in
+memory. SVs themselves are very simple structures, but they contain a
+pointer to a more complex structure. In this case, it's a PV, a
+structure which holds a string value, at location C<0xa041450>.  Line 2
+is the reference count; there are no other references to this data, so
+it's 1.
+
+Line 3 are the flags for this SV - it's OK to use it as a PV, it's a
+read-only SV (because it's a constant) and the data is a PV internally.
+Next we've got the contents of the string, starting at location
+C<0xa0484e0>.
+
+Line 5 gives us the current length of the string - note that this does
+B<not> include the null terminator. Line 6 is not the length of the
+string, but the length of the currently allocated buffer; as the string
+grows, Perl automatically extends the available storage via a routine
+called C<SvGROW>.
+
+You can get at any of these quantities from C very easily; just add
+C<Sv> to the name of the field shown in the snippet, and you've got a
+macro which will return the value: C<SvCUR(sv)> returns the current
+length of the string, C<SvREFCOUNT(sv)> returns the reference count,
+C<SvPV(sv, len)> returns the string itself with its length, and so on.
+More macros to manipulate these properties can be found in L<perlguts>.
+
+Let's take an example of manipulating a PV, from C<sv_catpvn>, in F<sv.c>
+
+     1  void
+     2  Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
+     3  {
+     4      STRLEN tlen;
+     5      char *junk;
+
+     6      junk = SvPV_force(sv, tlen);
+     7      SvGROW(sv, tlen + len + 1);
+     8      if (ptr == junk)
+     9          ptr = SvPVX(sv);
+    10      Move(ptr,SvPVX(sv)+tlen,len,char);
+    11      SvCUR(sv) += len;
+    12      *SvEND(sv) = '\0';
+    13      (void)SvPOK_only_UTF8(sv);          /* validate pointer */
+    14      SvTAINT(sv);
+    15  }
+
+This is a function which adds a string, C<ptr>, of length C<len> onto
+the end of the PV stored in C<sv>. The first thing we do in line 6 is
+make sure that the SV B<has> a valid PV, by calling the C<SvPV_force>
+macro to force a PV. As a side effect, C<tlen> gets set to the current
+value of the PV, and the PV itself is returned to C<junk>.
+
+In line 7, we make sure that the SV will have enough room to accommodate
+the old string, the new string and the null terminator. If C<LEN> isn't
+big enough, C<SvGROW> will reallocate space for us.
+
+Now, if C<junk> is the same as the string we're trying to add, we can
+grab the string directly from the SV; C<SvPVX> is the address of the PV
+in the SV.
+
+Line 10 does the actual catenation: the C<Move> macro moves a chunk of
+memory around: we move the string C<ptr> to the end of the PV - that's
+the start of the PV plus its current length. We're moving C<len> bytes
+of type C<char>. After doing so, we need to tell Perl we've extended the
+string, by altering C<CUR> to reflect the new length. C<SvEND> is a
+macro which gives us the end of the string, so that needs to be a
+C<"\0">.
+
+Line 13 manipulates the flags; since we've changed the PV, any IV or NV
+values will no longer be valid: if we have C<$a=10; $a.="6";> we don't
+want to use the old IV of 10. C<SvPOK_only_utf8> is a special UTF-8-aware
+version of C<SvPOK_only>, a macro which turns off the IOK and NOK flags
+and turns on POK. The final C<SvTAINT> is a macro which launders tainted
+data if taint mode is turned on.
+
+AVs and HVs are more complicated, but SVs are by far the most common
+variable type being thrown around. Having seen something of how we
+manipulate these, let's go on and look at how the op tree is
+constructed.
+
+=head2 Op Trees
+
+First, what is the op tree, anyway? The op tree is the parsed
+representation of your program, as we saw in our section on parsing, and
+it's the sequence of operations that Perl goes through to execute your
+program, as we saw in L</Running>.
+
+An op is a fundamental operation that Perl can perform: all the built-in
+functions and operators are ops, and there are a series of ops which
+deal with concepts the interpreter needs internally - entering and
+leaving a block, ending a statement, fetching a variable, and so on.
+
+The op tree is connected in two ways: you can imagine that there are two
+"routes" through it, two orders in which you can traverse the tree.
+First, parse order reflects how the parser understood the code, and
+secondly, execution order tells perl what order to perform the
+operations in.
+
+The easiest way to examine the op tree is to stop Perl after it has
+finished parsing, and get it to dump out the tree. This is exactly what
+the compiler backends L<B::Terse|B::Terse>, L<B::Concise|B::Concise>
+and L<B::Debug|B::Debug> do.
+
+Let's have a look at how Perl sees C<$a = $b + $c>:
+
+     % perl -MO=Terse -e '$a=$b+$c'
+     1  LISTOP (0x8179888) leave
+     2      OP (0x81798b0) enter
+     3      COP (0x8179850) nextstate
+     4      BINOP (0x8179828) sassign
+     5          BINOP (0x8179800) add [1]
+     6              UNOP (0x81796e0) null [15]
+     7                  SVOP (0x80fafe0) gvsv  GV (0x80fa4cc) *b
+     8              UNOP (0x81797e0) null [15]
+     9                  SVOP (0x8179700) gvsv  GV (0x80efeb0) *c
+    10          UNOP (0x816b4f0) null [15]
+    11              SVOP (0x816dcf0) gvsv  GV (0x80fa460) *a
+
+Let's start in the middle, at line 4. This is a BINOP, a binary
+operator, which is at location C<0x8179828>. The specific operator in
+question is C<sassign> - scalar assignment - and you can find the code
+which implements it in the function C<pp_sassign> in F<pp_hot.c>. As a
+binary operator, it has two children: the add operator, providing the
+result of C<$b+$c>, is uppermost on line 5, and the left hand side is on
+line 10.
+
+Line 10 is the null op: this does exactly nothing. What is that doing
+there? If you see the null op, it's a sign that something has been
+optimized away after parsing. As we mentioned in L</Optimization>,
+the optimization stage sometimes converts two operations into one, for
+example when fetching a scalar variable. When this happens, instead of
+rewriting the op tree and cleaning up the dangling pointers, it's easier
+just to replace the redundant operation with the null op. Originally,
+the tree would have looked like this:
+
+    10          SVOP (0x816b4f0) rv2sv [15]
+    11              SVOP (0x816dcf0) gv  GV (0x80fa460) *a
+
+That is, fetch the C<a> entry from the main symbol table, and then look
+at the scalar component of it: C<gvsv> (C<pp_gvsv> into F<pp_hot.c>)
+happens to do both these things.
+
+The right hand side, starting at line 5 is similar to what we've just
+seen: we have the C<add> op (C<pp_add> also in F<pp_hot.c>) add together
+two C<gvsv>s.
+
+Now, what's this about?
+
+     1  LISTOP (0x8179888) leave
+     2      OP (0x81798b0) enter
+     3      COP (0x8179850) nextstate
+
+C<enter> and C<leave> are scoping ops, and their job is to perform any
+housekeeping every time you enter and leave a block: lexical variables
+are tidied up, unreferenced variables are destroyed, and so on. Every
+program will have those first three lines: C<leave> is a list, and its
+children are all the statements in the block. Statements are delimited
+by C<nextstate>, so a block is a collection of C<nextstate> ops, with
+the ops to be performed for each statement being the children of
+C<nextstate>. C<enter> is a single op which functions as a marker.
+
+That's how Perl parsed the program, from top to bottom:
+
+                        Program
+                           |
+                       Statement
+                           |
+                           =
+                          / \
+                         /   \
+                        $a   +
+                            / \
+                          $b   $c
+
+However, it's impossible to B<perform> the operations in this order:
+you have to find the values of C<$b> and C<$c> before you add them
+together, for instance. So, the other thread that runs through the op
+tree is the execution order: each op has a field C<op_next> which points
+to the next op to be run, so following these pointers tells us how perl
+executes the code. We can traverse the tree in this order using
+the C<exec> option to C<B::Terse>:
+
+     % perl -MO=Terse,exec -e '$a=$b+$c'
+     1  OP (0x8179928) enter
+     2  COP (0x81798c8) nextstate
+     3  SVOP (0x81796c8) gvsv  GV (0x80fa4d4) *b
+     4  SVOP (0x8179798) gvsv  GV (0x80efeb0) *c
+     5  BINOP (0x8179878) add [1]
+     6  SVOP (0x816dd38) gvsv  GV (0x80fa468) *a
+     7  BINOP (0x81798a0) sassign
+     8  LISTOP (0x8179900) leave
+
+This probably makes more sense for a human: enter a block, start a
+statement. Get the values of C<$b> and C<$c>, and add them together.
+Find C<$a>, and assign one to the other. Then leave.
+
+The way Perl builds up these op trees in the parsing process can be
+unravelled by examining F<perly.y>, the YACC grammar. Let's take the
+piece we need to construct the tree for C<$a = $b + $c>
+
+    1 term    :   term ASSIGNOP term
+    2                { $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); }
+    3         |   term ADDOP term
+    4                { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
+
+If you're not used to reading BNF grammars, this is how it works: You're
+fed certain things by the tokeniser, which generally end up in upper
+case. Here, C<ADDOP>, is provided when the tokeniser sees C<+> in your
+code. C<ASSIGNOP> is provided when C<=> is used for assigning. These are
+"terminal symbols", because you can't get any simpler than them.
+
+The grammar, lines one and three of the snippet above, tells you how to
+build up more complex forms. These complex forms, "non-terminal symbols"
+are generally placed in lower case. C<term> here is a non-terminal
+symbol, representing a single expression.
+
+The grammar gives you the following rule: you can make the thing on the
+left of the colon if you see all the things on the right in sequence.
+This is called a "reduction", and the aim of parsing is to completely
+reduce the input. There are several different ways you can perform a
+reduction, separated by vertical bars: so, C<term> followed by C<=>
+followed by C<term> makes a C<term>, and C<term> followed by C<+>
+followed by C<term> can also make a C<term>.
+
+So, if you see two terms with an C<=> or C<+>, between them, you can
+turn them into a single expression. When you do this, you execute the
+code in the block on the next line: if you see C<=>, you'll do the code
+in line 2. If you see C<+>, you'll do the code in line 4. It's this code
+which contributes to the op tree.
+
+            |   term ADDOP term
+            { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
+
+What this does is creates a new binary op, and feeds it a number of
+variables. The variables refer to the tokens: C<$1> is the first token in
+the input, C<$2> the second, and so on - think regular expression
+backreferences. C<$$> is the op returned from this reduction. So, we
+call C<newBINOP> to create a new binary operator. The first parameter to
+C<newBINOP>, a function in F<op.c>, is the op type. It's an addition
+operator, so we want the type to be C<ADDOP>. We could specify this
+directly, but it's right there as the second token in the input, so we
+use C<$2>. The second parameter is the op's flags: 0 means "nothing
+special". Then the things to add: the left and right hand side of our
+expression, in scalar context.
+
+=head2 Stacks
+
+When perl executes something like C<addop>, how does it pass on its
+results to the next op? The answer is, through the use of stacks. Perl
+has a number of stacks to store things it's currently working on, and
+we'll look at the three most important ones here.
+
+=over 3
+
+=item Argument stack
+
+Arguments are passed to PP code and returned from PP code using the
+argument stack, C<ST>. The typical way to handle arguments is to pop
+them off the stack, deal with them how you wish, and then push the result
+back onto the stack. This is how, for instance, the cosine operator
+works:
+
+      NV value;
+      value = POPn;
+      value = Perl_cos(value);
+      XPUSHn(value);
+
+We'll see a more tricky example of this when we consider Perl's macros
+below. C<POPn> gives you the NV (floating point value) of the top SV on
+the stack: the C<$x> in C<cos($x)>. Then we compute the cosine, and push
+the result back as an NV. The C<X> in C<XPUSHn> means that the stack
+should be extended if necessary - it can't be necessary here, because we
+know there's room for one more item on the stack, since we've just
+removed one! The C<XPUSH*> macros at least guarantee safety.
+
+Alternatively, you can fiddle with the stack directly: C<SP> gives you
+the first element in your portion of the stack, and C<TOP*> gives you
+the top SV/IV/NV/etc. on the stack. So, for instance, to do unary
+negation of an integer:
+
+     SETi(-TOPi);
+
+Just set the integer value of the top stack entry to its negation.
+
+Argument stack manipulation in the core is exactly the same as it is in
+XSUBs - see L<perlxstut>, L<perlxs> and L<perlguts> for a longer
+description of the macros used in stack manipulation.
+
+=item Mark stack
+
+I say "your portion of the stack" above because PP code doesn't
+necessarily get the whole stack to itself: if your function calls
+another function, you'll only want to expose the arguments aimed for the
+called function, and not (necessarily) let it get at your own data. The
+way we do this is to have a "virtual" bottom-of-stack, exposed to each
+function. The mark stack keeps bookmarks to locations in the argument
+stack usable by each function. For instance, when dealing with a tied
+variable, (internally, something with "P" magic) Perl has to call
+methods for accesses to the tied variables. However, we need to separate
+the arguments exposed to the method to the argument exposed to the
+original function - the store or fetch or whatever it may be. Here's how
+the tied C<push> is implemented; see C<av_push> in F<av.c>:
+
+     1	PUSHMARK(SP);
+     2	EXTEND(SP,2);
+     3	PUSHs(SvTIED_obj((SV*)av, mg));
+     4	PUSHs(val);
+     5	PUTBACK;
+     6	ENTER;
+     7	call_method("PUSH", G_SCALAR|G_DISCARD);
+     8	LEAVE;
+     9	POPSTACK;
+
+The lines which concern the mark stack are the first, fifth and last
+lines: they save away, restore and remove the current position of the
+argument stack. 
+
+Let's examine the whole implementation, for practice:
+
+     1	PUSHMARK(SP);
+
+Push the current state of the stack pointer onto the mark stack. This is
+so that when we've finished adding items to the argument stack, Perl
+knows how many things we've added recently.
+
+     2	EXTEND(SP,2);
+     3	PUSHs(SvTIED_obj((SV*)av, mg));
+     4	PUSHs(val);
+
+We're going to add two more items onto the argument stack: when you have
+a tied array, the C<PUSH> subroutine receives the object and the value
+to be pushed, and that's exactly what we have here - the tied object,
+retrieved with C<SvTIED_obj>, and the value, the SV C<val>.
+
+     5	PUTBACK;
+
+Next we tell Perl to make the change to the global stack pointer: C<dSP>
+only gave us a local copy, not a reference to the global.
+
+     6	ENTER;
+     7	call_method("PUSH", G_SCALAR|G_DISCARD);
+     8	LEAVE;
+
+C<ENTER> and C<LEAVE> localise a block of code - they make sure that all
+variables are tidied up, everything that has been localised gets
+its previous value returned, and so on. Think of them as the C<{> and
+C<}> of a Perl block.
+
+To actually do the magic method call, we have to call a subroutine in
+Perl space: C<call_method> takes care of that, and it's described in
+L<perlcall>. We call the C<PUSH> method in scalar context, and we're
+going to discard its return value.
+
+     9	POPSTACK;
+
+Finally, we remove the value we placed on the mark stack, since we
+don't need it any more.
+
+=item Save stack
+
+C doesn't have a concept of local scope, so perl provides one. We've
+seen that C<ENTER> and C<LEAVE> are used as scoping braces; the save
+stack implements the C equivalent of, for example:
+
+    {
+        local $foo = 42;
+        ...
+    }
+
+See L<perlguts/Localising Changes> for how to use the save stack.
+
+=back
+
+=head2 Millions of Macros
+
+One thing you'll notice about the Perl source is that it's full of
+macros. Some have called the pervasive use of macros the hardest thing
+to understand, others find it adds to clarity. Let's take an example,
+the code which implements the addition operator:
+
+   1  PP(pp_add)
+   2  {
+   3      dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
+   4      {
+   5        dPOPTOPnnrl_ul;
+   6        SETn( left + right );
+   7        RETURN;
+   8      }
+   9  }
+
+Every line here (apart from the braces, of course) contains a macro. The
+first line sets up the function declaration as Perl expects for PP code;
+line 3 sets up variable declarations for the argument stack and the
+target, the return value of the operation. Finally, it tries to see if
+the addition operation is overloaded; if so, the appropriate subroutine
+is called.
+
+Line 5 is another variable declaration - all variable declarations start
+with C<d> - which pops from the top of the argument stack two NVs (hence
+C<nn>) and puts them into the variables C<right> and C<left>, hence the
+C<rl>. These are the two operands to the addition operator. Next, we
+call C<SETn> to set the NV of the return value to the result of adding
+the two values. This done, we return - the C<RETURN> macro makes sure
+that our return value is properly handled, and we pass the next operator
+to run back to the main run loop.
+
+Most of these macros are explained in L<perlapi>, and some of the more
+important ones are explained in L<perlxs> as well. Pay special attention
+to L<perlguts/Background and PERL_IMPLICIT_CONTEXT> for information on
+the C<[pad]THX_?> macros.
+
+=head2 The .i Targets
+
+You can expand the macros in a F<foo.c> file by saying
+
+    make foo.i
+
+which will expand the macros using cpp.  Don't be scared by the results.
+
+=head2 Poking at Perl
+
+To really poke around with Perl, you'll probably want to build Perl for
+debugging, like this:
+
+    ./Configure -d -D optimize=-g
+    make
+
+C<-g> is a flag to the C compiler to have it produce debugging
+information which will allow us to step through a running program.
+F<Configure> will also turn on the C<DEBUGGING> compilation symbol which
+enables all the internal debugging code in Perl. There are a whole bunch
+of things you can debug with this: L<perlrun> lists them all, and the
+best way to find out about them is to play about with them. The most
+useful options are probably
+
+    l  Context (loop) stack processing
+    t  Trace execution
+    o  Method and overloading resolution
+    c  String/numeric conversions
+
+Some of the functionality of the debugging code can be achieved using XS
+modules.
+
+    -Dr => use re 'debug'
+    -Dx => use O 'Debug'
+
+=head2 Using a source-level debugger
+
+If the debugging output of C<-D> doesn't help you, it's time to step
+through perl's execution with a source-level debugger.
+
+=over 3
+
+=item *
+
+We'll use C<gdb> for our examples here; the principles will apply to any
+debugger, but check the manual of the one you're using.
+
+=back
+
+To fire up the debugger, type
+
+    gdb ./perl
+
+You'll want to do that in your Perl source tree so the debugger can read
+the source code. You should see the copyright message, followed by the
+prompt.
+
+    (gdb)
+
+C<help> will get you into the documentation, but here are the most
+useful commands:
+
+=over 3
+
+=item run [args]
+
+Run the program with the given arguments.
+
+=item break function_name
+
+=item break source.c:xxx
+
+Tells the debugger that we'll want to pause execution when we reach
+either the named function (but see L<perlguts/Internal Functions>!) or the given
+line in the named source file.
+
+=item step
+
+Steps through the program a line at a time.
+
+=item next
+
+Steps through the program a line at a time, without descending into
+functions.
+
+=item continue
+
+Run until the next breakpoint.
+
+=item finish
+
+Run until the end of the current function, then stop again.
+
+=item 'enter'
+
+Just pressing Enter will do the most recent operation again - it's a
+blessing when stepping through miles of source code.
+
+=item print
+
+Execute the given C code and print its results. B<WARNING>: Perl makes
+heavy use of macros, and F<gdb> does not necessarily support macros
+(see later L</"gdb macro support">).  You'll have to substitute them
+yourself, or to invoke cpp on the source code files
+(see L</"The .i Targets">)
+So, for instance, you can't say
+
+    print SvPV_nolen(sv)
+
+but you have to say
+
+    print Perl_sv_2pv_nolen(sv)
+
+=back
+
+You may find it helpful to have a "macro dictionary", which you can
+produce by saying C<cpp -dM perl.c | sort>. Even then, F<cpp> won't
+recursively apply those macros for you. 
+
+=head2 gdb macro support
+
+Recent versions of F<gdb> have fairly good macro support, but
+in order to use it you'll need to compile perl with macro definitions
+included in the debugging information.  Using F<gcc> version 3.1, this
+means configuring with C<-Doptimize=-g3>.  Other compilers might use a
+different switch (if they support debugging macros at all).
+
+=head2 Dumping Perl Data Structures
+
+One way to get around this macro hell is to use the dumping functions in
+F<dump.c>; these work a little like an internal
+L<Devel::Peek|Devel::Peek>, but they also cover OPs and other structures
+that you can't get at from Perl. Let's take an example. We'll use the
+C<$a = $b + $c> we used before, but give it a bit of context: 
+C<$b = "6XXXX"; $c = 2.3;>. Where's a good place to stop and poke around?
+
+What about C<pp_add>, the function we examined earlier to implement the
+C<+> operator:
+
+    (gdb) break Perl_pp_add
+    Breakpoint 1 at 0x46249f: file pp_hot.c, line 309.
+
+Notice we use C<Perl_pp_add> and not C<pp_add> - see L<perlguts/Internal Functions>.
+With the breakpoint in place, we can run our program:
+
+    (gdb) run -e '$b = "6XXXX"; $c = 2.3; $a = $b + $c'
+
+Lots of junk will go past as gdb reads in the relevant source files and
+libraries, and then:
+
+    Breakpoint 1, Perl_pp_add () at pp_hot.c:309
+    309         dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
+    (gdb) step
+    311           dPOPTOPnnrl_ul;
+    (gdb)
+
+We looked at this bit of code before, and we said that C<dPOPTOPnnrl_ul>
+arranges for two C<NV>s to be placed into C<left> and C<right> - let's
+slightly expand it:
+
+    #define dPOPTOPnnrl_ul  NV right = POPn; \
+                            SV *leftsv = TOPs; \
+                            NV left = USE_LEFT(leftsv) ? SvNV(leftsv) : 0.0
+
+C<POPn> takes the SV from the top of the stack and obtains its NV either
+directly (if C<SvNOK> is set) or by calling the C<sv_2nv> function.
+C<TOPs> takes the next SV from the top of the stack - yes, C<POPn> uses
+C<TOPs> - but doesn't remove it. We then use C<SvNV> to get the NV from
+C<leftsv> in the same way as before - yes, C<POPn> uses C<SvNV>. 
+
+Since we don't have an NV for C<$b>, we'll have to use C<sv_2nv> to
+convert it. If we step again, we'll find ourselves there:
+
+    Perl_sv_2nv (sv=0xa0675d0) at sv.c:1669
+    1669        if (!sv)
+    (gdb)
+
+We can now use C<Perl_sv_dump> to investigate the SV:
+
+    SV = PV(0xa057cc0) at 0xa0675d0
+    REFCNT = 1
+    FLAGS = (POK,pPOK)
+    PV = 0xa06a510 "6XXXX"\0
+    CUR = 5
+    LEN = 6
+    $1 = void
+
+We know we're going to get C<6> from this, so let's finish the
+subroutine:
+
+    (gdb) finish
+    Run till exit from #0  Perl_sv_2nv (sv=0xa0675d0) at sv.c:1671
+    0x462669 in Perl_pp_add () at pp_hot.c:311
+    311           dPOPTOPnnrl_ul;
+
+We can also dump out this op: the current op is always stored in
+C<PL_op>, and we can dump it with C<Perl_op_dump>. This'll give us
+similar output to L<B::Debug|B::Debug>.
+
+    {
+    13  TYPE = add  ===> 14
+        TARG = 1
+        FLAGS = (SCALAR,KIDS)
+        {
+            TYPE = null  ===> (12)
+              (was rv2sv)
+            FLAGS = (SCALAR,KIDS)
+            {
+    11          TYPE = gvsv  ===> 12
+                FLAGS = (SCALAR)
+                GV = main::b
+            }
+        }
+
+# finish this later #
+
+=head2 Patching
+
+All right, we've now had a look at how to navigate the Perl sources and
+some things you'll need to know when fiddling with them. Let's now get
+on and create a simple patch. Here's something Larry suggested: if a
+C<U> is the first active format during a C<pack>, (for example, 
+C<pack "U3C8", @stuff>) then the resulting string should be treated as
+UTF-8 encoded.
+
+How do we prepare to fix this up? First we locate the code in question -
+the C<pack> happens at runtime, so it's going to be in one of the F<pp>
+files. Sure enough, C<pp_pack> is in F<pp.c>. Since we're going to be
+altering this file, let's copy it to F<pp.c~>.
+
+[Well, it was in F<pp.c> when this tutorial was written. It has now been
+split off with C<pp_unpack> to its own file, F<pp_pack.c>]
+
+Now let's look over C<pp_pack>: we take a pattern into C<pat>, and then
+loop over the pattern, taking each format character in turn into
+C<datum_type>. Then for each possible format character, we swallow up
+the other arguments in the pattern (a field width, an asterisk, and so
+on) and convert the next chunk input into the specified format, adding
+it onto the output SV C<cat>.
+
+How do we know if the C<U> is the first format in the C<pat>? Well, if
+we have a pointer to the start of C<pat> then, if we see a C<U> we can
+test whether we're still at the start of the string. So, here's where
+C<pat> is set up:
+
+    STRLEN fromlen;
+    register char *pat = SvPVx(*++MARK, fromlen);
+    register char *patend = pat + fromlen;
+    register I32 len;
+    I32 datumtype;
+    SV *fromstr;
+
+We'll have another string pointer in there:
+
+    STRLEN fromlen;
+    register char *pat = SvPVx(*++MARK, fromlen);
+    register char *patend = pat + fromlen;
+ +  char *patcopy;
+    register I32 len;
+    I32 datumtype;
+    SV *fromstr;
+
+And just before we start the loop, we'll set C<patcopy> to be the start
+of C<pat>:
+
+    items = SP - MARK;
+    MARK++;
+    sv_setpvn(cat, "", 0);
+ +  patcopy = pat;
+    while (pat < patend) {
+
+Now if we see a C<U> which was at the start of the string, we turn on
+the C<UTF8> flag for the output SV, C<cat>:
+
+ +  if (datumtype == 'U' && pat==patcopy+1)
+ +      SvUTF8_on(cat);
+    if (datumtype == '#') {
+        while (pat < patend && *pat != '\n')
+            pat++;
+
+Remember that it has to be C<patcopy+1> because the first character of
+the string is the C<U> which has been swallowed into C<datumtype!>
+
+Oops, we forgot one thing: what if there are spaces at the start of the
+pattern? C<pack("  U*", @stuff)> will have C<U> as the first active
+character, even though it's not the first thing in the pattern. In this
+case, we have to advance C<patcopy> along with C<pat> when we see spaces:
+
+    if (isSPACE(datumtype))
+        continue;
+
+needs to become
+
+    if (isSPACE(datumtype)) {
+        patcopy++;
+        continue;
+    }
+
+OK. That's the C part done. Now we must do two additional things before
+this patch is ready to go: we've changed the behaviour of Perl, and so
+we must document that change. We must also provide some more regression
+tests to make sure our patch works and doesn't create a bug somewhere
+else along the line.
+
+The regression tests for each operator live in F<t/op/>, and so we
+make a copy of F<t/op/pack.t> to F<t/op/pack.t~>. Now we can add our
+tests to the end. First, we'll test that the C<U> does indeed create
+Unicode strings.  
+
+t/op/pack.t has a sensible ok() function, but if it didn't we could
+use the one from t/test.pl.
+
+ require './test.pl';
+ plan( tests => 159 );
+
+so instead of this:
+
+ print 'not ' unless "1.20.300.4000" eq sprintf "%vd", pack("U*",1,20,300,4000);
+ print "ok $test\n"; $test++;
+
+we can write the more sensible (see L<Test::More> for a full
+explanation of is() and other testing functions).
+
+ is( "1.20.300.4000", sprintf "%vd", pack("U*",1,20,300,4000), 
+                                       "U* produces unicode" );
+
+Now we'll test that we got that space-at-the-beginning business right:
+
+ is( "1.20.300.4000", sprintf "%vd", pack("  U*",1,20,300,4000),
+                                       "  with spaces at the beginning" );
+
+And finally we'll test that we don't make Unicode strings if C<U> is B<not>
+the first active format:
+
+ isnt( v1.20.300.4000, sprintf "%vd", pack("C0U*",1,20,300,4000),
+                                       "U* not first isn't unicode" );
+
+Mustn't forget to change the number of tests which appears at the top,
+or else the automated tester will get confused.  This will either look
+like this:
+
+ print "1..156\n";
+
+or this:
+
+ plan( tests => 156 );
+
+We now compile up Perl, and run it through the test suite. Our new
+tests pass, hooray!
+
+Finally, the documentation. The job is never done until the paperwork is
+over, so let's describe the change we've just made. The relevant place
+is F<pod/perlfunc.pod>; again, we make a copy, and then we'll insert
+this text in the description of C<pack>:
+
+ =item *
+
+ If the pattern begins with a C<U>, the resulting string will be treated
+ as UTF-8-encoded Unicode. You can force UTF-8 encoding on in a string
+ with an initial C<U0>, and the bytes that follow will be interpreted as
+ Unicode characters. If you don't want this to happen, you can begin your
+ pattern with C<C0> (or anything else) to force Perl not to UTF-8 encode your
+ string, and then follow this with a C<U*> somewhere in your pattern.
+
+All done. Now let's create the patch. F<Porting/patching.pod> tells us
+that if we're making major changes, we should copy the entire directory
+to somewhere safe before we begin fiddling, and then do
+
+    diff -ruN old new > patch
+
+However, we know which files we've changed, and we can simply do this:
+
+    diff -u pp.c~             pp.c             >  patch
+    diff -u t/op/pack.t~      t/op/pack.t      >> patch
+    diff -u pod/perlfunc.pod~ pod/perlfunc.pod >> patch
+
+We end up with a patch looking a little like this:
+
+    --- pp.c~       Fri Jun 02 04:34:10 2000
+    +++ pp.c        Fri Jun 16 11:37:25 2000
+    @@ -4375,6 +4375,7 @@
+         register I32 items;
+         STRLEN fromlen;
+         register char *pat = SvPVx(*++MARK, fromlen);
+    +    char *patcopy;
+         register char *patend = pat + fromlen;
+         register I32 len;
+         I32 datumtype;
+    @@ -4405,6 +4406,7 @@
+    ...
+
+And finally, we submit it, with our rationale, to perl5-porters. Job
+done!
+
+=head2 Patching a core module
+
+This works just like patching anything else, with an extra
+consideration.  Many core modules also live on CPAN.  If this is so,
+patch the CPAN version instead of the core and send the patch off to
+the module maintainer (with a copy to p5p).  This will help the module
+maintainer keep the CPAN version in sync with the core version without
+constantly scanning p5p.
+
+The list of maintainers of core modules is usefully documented in
+F<Porting/Maintainers.pl>.
+
+=head2 Adding a new function to the core
+
+If, as part of a patch to fix a bug, or just because you have an
+especially good idea, you decide to add a new function to the core,
+discuss your ideas on p5p well before you start work.  It may be that
+someone else has already attempted to do what you are considering and
+can give lots of good advice or even provide you with bits of code
+that they already started (but never finished).
+
+You have to follow all of the advice given above for patching.  It is
+extremely important to test any addition thoroughly and add new tests
+to explore all boundary conditions that your new function is expected
+to handle.  If your new function is used only by one module (e.g. toke),
+then it should probably be named S_your_function (for static); on the
+other hand, if you expect it to accessible from other functions in
+Perl, you should name it Perl_your_function.  See L<perlguts/Internal Functions>
+for more details.
+
+The location of any new code is also an important consideration.  Don't
+just create a new top level .c file and put your code there; you would
+have to make changes to Configure (so the Makefile is created properly),
+as well as possibly lots of include files.  This is strictly pumpking
+business.
+
+It is better to add your function to one of the existing top level
+source code files, but your choice is complicated by the nature of
+the Perl distribution.  Only the files that are marked as compiled
+static are located in the perl executable.  Everything else is located
+in the shared library (or DLL if you are running under WIN32).  So,
+for example, if a function was only used by functions located in
+toke.c, then your code can go in toke.c.  If, however, you want to call
+the function from universal.c, then you should put your code in another
+location, for example util.c.
+
+In addition to writing your c-code, you will need to create an
+appropriate entry in embed.pl describing your function, then run
+'make regen_headers' to create the entries in the numerous header
+files that perl needs to compile correctly.  See L<perlguts/Internal Functions>
+for information on the various options that you can set in embed.pl.
+You will forget to do this a few (or many) times and you will get
+warnings during the compilation phase.  Make sure that you mention
+this when you post your patch to P5P; the pumpking needs to know this.
+
+When you write your new code, please be conscious of existing code
+conventions used in the perl source files.  See L<perlstyle> for
+details.  Although most of the guidelines discussed seem to focus on
+Perl code, rather than c, they all apply (except when they don't ;).
+See also I<Porting/patching.pod> file in the Perl source distribution
+for lots of details about both formatting and submitting patches of
+your changes.
+
+Lastly, TEST TEST TEST TEST TEST any code before posting to p5p.
+Test on as many platforms as you can find.  Test as many perl
+Configure options as you can (e.g. MULTIPLICITY).  If you have
+profiling or memory tools, see L<EXTERNAL TOOLS FOR DEBUGGING PERL>
+below for how to use them to further test your code.  Remember that
+most of the people on P5P are doing this on their own time and
+don't have the time to debug your code.
+
+=head2 Writing a test
+
+Every module and built-in function has an associated test file (or
+should...).  If you add or change functionality, you have to write a
+test.  If you fix a bug, you have to write a test so that bug never
+comes back.  If you alter the docs, it would be nice to test what the
+new documentation says.
+
+In short, if you submit a patch you probably also have to patch the
+tests.
+
+For modules, the test file is right next to the module itself.
+F<lib/strict.t> tests F<lib/strict.pm>.  This is a recent innovation,
+so there are some snags (and it would be wonderful for you to brush
+them out), but it basically works that way.  Everything else lives in
+F<t/>.
+
+=over 3
+
+=item F<t/base/>
+
+Testing of the absolute basic functionality of Perl.  Things like
+C<if>, basic file reads and writes, simple regexes, etc.  These are
+run first in the test suite and if any of them fail, something is
+I<really> broken.
+
+=item F<t/cmd/>
+
+These test the basic control structures, C<if/else>, C<while>,
+subroutines, etc.
+
+=item F<t/comp/>
+
+Tests basic issues of how Perl parses and compiles itself.
+
+=item F<t/io/>
+
+Tests for built-in IO functions, including command line arguments.
+
+=item F<t/lib/>
+
+The old home for the module tests, you shouldn't put anything new in
+here.  There are still some bits and pieces hanging around in here
+that need to be moved.  Perhaps you could move them?  Thanks!
+
+=item F<t/op/>
+
+Tests for perl's built in functions that don't fit into any of the
+other directories.
+
+=item F<t/pod/>
+
+Tests for POD directives.  There are still some tests for the Pod
+modules hanging around in here that need to be moved out into F<lib/>.
+
+=item F<t/run/>
+
+Testing features of how perl actually runs, including exit codes and
+handling of PERL* environment variables.
+
+=item F<t/uni/>
+
+Tests for the core support of Unicode.
+
+=item F<t/win32/>
+
+Windows-specific tests.
+
+=item F<t/x2p>
+
+A test suite for the s2p converter.
+
+=back
+
+The core uses the same testing style as the rest of Perl, a simple
+"ok/not ok" run through Test::Harness, but there are a few special
+considerations.
+
+There are three ways to write a test in the core.  Test::More,
+t/test.pl and ad hoc C<print $test ? "ok 42\n" : "not ok 42\n">.  The
+decision of which to use depends on what part of the test suite you're
+working on.  This is a measure to prevent a high-level failure (such
+as Config.pm breaking) from causing basic functionality tests to fail.
+
+=over 4 
+
+=item t/base t/comp
+
+Since we don't know if require works, or even subroutines, use ad hoc
+tests for these two.  Step carefully to avoid using the feature being
+tested.
+
+=item t/cmd t/run t/io t/op
+
+Now that basic require() and subroutines are tested, you can use the
+t/test.pl library which emulates the important features of Test::More
+while using a minimum of core features.
+
+You can also conditionally use certain libraries like Config, but be
+sure to skip the test gracefully if it's not there.
+
+=item t/lib ext lib
+
+Now that the core of Perl is tested, Test::More can be used.  You can
+also use the full suite of core modules in the tests.
+
+=back
+
+When you say "make test" Perl uses the F<t/TEST> program to run the
+test suite (except under Win32 where it uses F<t/harness> instead.)  
+All tests are run from the F<t/> directory, B<not> the directory 
+which contains the test.  This causes some problems with the tests 
+in F<lib/>, so here's some opportunity for some patching.
+
+You must be triply conscious of cross-platform concerns.  This usually
+boils down to using File::Spec and avoiding things like C<fork()> and
+C<system()> unless absolutely necessary.
+
+=head2 Special Make Test Targets
+
+There are various special make targets that can be used to test Perl
+slightly differently than the standard "test" target.  Not all them
+are expected to give a 100% success rate.  Many of them have several
+aliases, and many of them are not available on certain operating
+systems.
+
+=over 4
+
+=item coretest
+
+Run F<perl> on all core tests (F<t/*> and F<lib/[a-z]*> pragma tests).
+
+(Not available on Win32)
+
+=item test.deparse
+
+Run all the tests through B::Deparse.  Not all tests will succeed.
+
+(Not available on Win32)
+
+=item test.taintwarn
+
+Run all tests with the B<-t> command-line switch.  Not all tests
+are expected to succeed (until they're specifically fixed, of course).
+
+(Not available on Win32)
+
+=item minitest
+
+Run F<miniperl> on F<t/base>, F<t/comp>, F<t/cmd>, F<t/run>, F<t/io>,
+F<t/op>, and F<t/uni> tests.
+
+=item test.valgrind check.valgrind utest.valgrind ucheck.valgrind
+
+(Only in Linux) Run all the tests using the memory leak + naughty
+memory access tool "valgrind".  The log files will be named
+F<testname.valgrind>.
+
+=item test.third check.third utest.third ucheck.third
+
+(Only in Tru64)  Run all the tests using the memory leak + naughty
+memory access tool "Third Degree".  The log files will be named
+F<perl.3log.testname>.
+
+=item test.torture torturetest
+
+Run all the usual tests and some extra tests.  As of Perl 5.8.0 the
+only extra tests are Abigail's JAPHs, F<t/japh/abigail.t>.
+
+You can also run the torture test with F<t/harness> by giving
+C<-torture> argument to F<t/harness>.
+
+=item utest ucheck test.utf8 check.utf8
+
+Run all the tests with -Mutf8.  Not all tests will succeed.
+
+(Not available on Win32)
+
+=item minitest.utf16 test.utf16
+
+Runs the tests with UTF-16 encoded scripts, encoded with different
+versions of this encoding.
+
+C<make utest.utf16> runs the test suite with a combination of C<-utf8> and
+C<-utf16> arguments to F<t/TEST>.
+
+(Not available on Win32)
+
+=item test_harness
+
+Run the test suite with the F<t/harness> controlling program, instead of
+F<t/TEST>. F<t/harness> is more sophisticated, and uses the
+L<Test::Harness> module, thus using this test target supposes that perl
+mostly works. The main advantage for our purposes is that it prints a
+detailed summary of failed tests at the end. Also, unlike F<t/TEST>, it
+doesn't redirect stderr to stdout.
+
+Note that under Win32 F<t/harness> is always used instead of F<t/TEST>, so
+there is no special "test_harness" target.
+
+Under Win32's "test" target you may use the TEST_SWITCHES and TEST_FILES
+environment variables to control the behaviour of F<t/harness>.  This means
+you can say
+
+    nmake test TEST_FILES="op/*.t"
+    nmake test TEST_SWITCHES="-torture" TEST_FILES="op/*.t"
+
+=item test-notty test_notty
+
+Sets PERL_SKIP_TTY_TEST to true before running normal test.
+
+=back
+
+=head2 Running tests by hand
+
+You can run part of the test suite by hand by using one the following
+commands from the F<t/> directory :
+
+    ./perl -I../lib TEST list-of-.t-files
+
+or
+
+    ./perl -I../lib harness list-of-.t-files
+
+(if you don't specify test scripts, the whole test suite will be run.)
+
+=head3 Using t/harness for testing
+
+If you use C<harness> for testing you have several command line options
+available to you. The arguments are as follows, and are in the order
+that they must appear if used together.
+
+    harness -v -torture -re=pattern LIST OF FILES TO TEST
+    harness -v -torture -re LIST OF PATTERNS TO MATCH
+
+If C<LIST OF FILES TO TEST> is omitted the file list is obtained from
+the manifest. The file list may include shell wildcards which will be 
+expanded out.
+
+=over 4
+
+=item -v
+
+Run the tests under verbose mode so you can see what tests were run, 
+and debug outbut.
+
+=item -torture
+
+Run the torture tests as well as the normal set.
+
+=item -re=PATTERN
+
+Filter the file list so that all the test files run match PATTERN.
+Note that this form is distinct from the B<-re LIST OF PATTERNS> form below
+in that it allows the file list to be provided as well.
+
+=item -re LIST OF PATTERNS
+
+Filter the file list so that all the test files run match 
+/(LIST|OF|PATTERNS)/. Note that with this form the patterns
+are joined by '|' and you cannot supply a list of files, instead
+the test files are obtained from the MANIFEST.
+
+=back
+
+You can run an individual test by a command similar to
+
+    ./perl -I../lib patho/to/foo.t
+
+except that the harnesses set up some environment variables that may
+affect the execution of the test :
+
+=over 4 
+
+=item PERL_CORE=1
+
+indicates that we're running this test part of the perl core test suite.
+This is useful for modules that have a dual life on CPAN.
+
+=item PERL_DESTRUCT_LEVEL=2
+
+is set to 2 if it isn't set already (see L</PERL_DESTRUCT_LEVEL>)
+
+=item PERL
+
+(used only by F<t/TEST>) if set, overrides the path to the perl executable
+that should be used to run the tests (the default being F<./perl>).
+
+=item PERL_SKIP_TTY_TEST
+
+if set, tells to skip the tests that need a terminal. It's actually set
+automatically by the Makefile, but can also be forced artificially by
+running 'make test_notty'.
+
+=back
+
+=head1 EXTERNAL TOOLS FOR DEBUGGING PERL
+
+Sometimes it helps to use external tools while debugging and
+testing Perl.  This section tries to guide you through using
+some common testing and debugging tools with Perl.  This is
+meant as a guide to interfacing these tools with Perl, not
+as any kind of guide to the use of the tools themselves.
+
+B<NOTE 1>: Running under memory debuggers such as Purify, valgrind, or
+Third Degree greatly slows down the execution: seconds become minutes,
+minutes become hours.  For example as of Perl 5.8.1, the
+ext/Encode/t/Unicode.t takes extraordinarily long to complete under
+e.g. Purify, Third Degree, and valgrind.  Under valgrind it takes more
+than six hours, even on a snappy computer-- the said test must be
+doing something that is quite unfriendly for memory debuggers.  If you
+don't feel like waiting, that you can simply kill away the perl
+process.
+
+B<NOTE 2>: To minimize the number of memory leak false alarms (see
+L</PERL_DESTRUCT_LEVEL> for more information), you have to have
+environment variable PERL_DESTRUCT_LEVEL set to 2.  The F<TEST>
+and harness scripts do that automatically.  But if you are running
+some of the tests manually-- for csh-like shells:
+
+    setenv PERL_DESTRUCT_LEVEL 2
+
+and for Bourne-type shells:
+
+    PERL_DESTRUCT_LEVEL=2
+    export PERL_DESTRUCT_LEVEL
+
+or in UNIXy environments you can also use the C<env> command:
+
+    env PERL_DESTRUCT_LEVEL=2 valgrind ./perl -Ilib ...
+
+B<NOTE 3>: There are known memory leaks when there are compile-time
+errors within eval or require, seeing C<S_doeval> in the call stack
+is a good sign of these.  Fixing these leaks is non-trivial,
+unfortunately, but they must be fixed eventually.
+
+=head2 Rational Software's Purify
+
+Purify is a commercial tool that is helpful in identifying
+memory overruns, wild pointers, memory leaks and other such
+badness.  Perl must be compiled in a specific way for
+optimal testing with Purify.  Purify is available under
+Windows NT, Solaris, HP-UX, SGI, and Siemens Unix.
+
+=head2 Purify on Unix
+
+On Unix, Purify creates a new Perl binary.  To get the most
+benefit out of Purify, you should create the perl to Purify
+using:
+
+    sh Configure -Accflags=-DPURIFY -Doptimize='-g' \
+     -Uusemymalloc -Dusemultiplicity
+
+where these arguments mean:
+
+=over 4
+
+=item -Accflags=-DPURIFY
+
+Disables Perl's arena memory allocation functions, as well as
+forcing use of memory allocation functions derived from the
+system malloc.
+
+=item -Doptimize='-g'
+
+Adds debugging information so that you see the exact source
+statements where the problem occurs.  Without this flag, all
+you will see is the source filename of where the error occurred.
+
+=item -Uusemymalloc
+
+Disable Perl's malloc so that Purify can more closely monitor
+allocations and leaks.  Using Perl's malloc will make Purify
+report most leaks in the "potential" leaks category.
+
+=item -Dusemultiplicity
+
+Enabling the multiplicity option allows perl to clean up
+thoroughly when the interpreter shuts down, which reduces the
+number of bogus leak reports from Purify.
+
+=back
+
+Once you've compiled a perl suitable for Purify'ing, then you
+can just:
+
+    make pureperl   
+
+which creates a binary named 'pureperl' that has been Purify'ed.
+This binary is used in place of the standard 'perl' binary
+when you want to debug Perl memory problems.
+
+As an example, to show any memory leaks produced during the
+standard Perl testset you would create and run the Purify'ed
+perl as:
+
+    make pureperl
+    cd t
+    ../pureperl -I../lib harness 
+
+which would run Perl on test.pl and report any memory problems.
+
+Purify outputs messages in "Viewer" windows by default.  If
+you don't have a windowing environment or if you simply
+want the Purify output to unobtrusively go to a log file
+instead of to the interactive window, use these following
+options to output to the log file "perl.log":
+
+    setenv PURIFYOPTIONS "-chain-length=25 -windows=no \
+     -log-file=perl.log -append-logfile=yes"
+
+If you plan to use the "Viewer" windows, then you only need this option:
+
+    setenv PURIFYOPTIONS "-chain-length=25"
+
+In Bourne-type shells:
+
+    PURIFYOPTIONS="..."
+    export PURIFYOPTIONS
+
+or if you have the "env" utility:
+
+    env PURIFYOPTIONS="..." ../pureperl ...
+
+=head2 Purify on NT
+
+Purify on Windows NT instruments the Perl binary 'perl.exe'
+on the fly.  There are several options in the makefile you
+should change to get the most use out of Purify:
+
+=over 4
+
+=item DEFINES
+
+You should add -DPURIFY to the DEFINES line so the DEFINES
+line looks something like:
+
+    DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT $(CRYPT_FLAG) -DPURIFY=1 
+
+to disable Perl's arena memory allocation functions, as
+well as to force use of memory allocation functions derived
+from the system malloc.
+
+=item USE_MULTI = define
+
+Enabling the multiplicity option allows perl to clean up
+thoroughly when the interpreter shuts down, which reduces the
+number of bogus leak reports from Purify.
+
+=item #PERL_MALLOC = define
+
+Disable Perl's malloc so that Purify can more closely monitor
+allocations and leaks.  Using Perl's malloc will make Purify
+report most leaks in the "potential" leaks category.
+
+=item CFG = Debug
+
+Adds debugging information so that you see the exact source
+statements where the problem occurs.  Without this flag, all
+you will see is the source filename of where the error occurred.
+
+=back
+
+As an example, to show any memory leaks produced during the
+standard Perl testset you would create and run Purify as:
+
+    cd win32
+    make
+    cd ../t
+    purify ../perl -I../lib harness 
+
+which would instrument Perl in memory, run Perl on test.pl,
+then finally report any memory problems.
+
+=head2 valgrind
+
+The excellent valgrind tool can be used to find out both memory leaks
+and illegal memory accesses.  As of August 2003 it unfortunately works
+only on x86 (ELF) Linux.  The special "test.valgrind" target can be used
+to run the tests under valgrind.  Found errors and memory leaks are
+logged in files named F<test.valgrind>.
+
+As system libraries (most notably glibc) are also triggering errors,
+valgrind allows to suppress such errors using suppression files. The
+default suppression file that comes with valgrind already catches a lot
+of them. Some additional suppressions are defined in F<t/perl.supp>.
+
+To get valgrind and for more information see
+
+    http://developer.kde.org/~sewardj/
+
+=head2 Compaq's/Digital's/HP's Third Degree
+
+Third Degree is a tool for memory leak detection and memory access checks.
+It is one of the many tools in the ATOM toolkit.  The toolkit is only
+available on Tru64 (formerly known as Digital UNIX formerly known as
+DEC OSF/1).
+
+When building Perl, you must first run Configure with -Doptimize=-g
+and -Uusemymalloc flags, after that you can use the make targets
+"perl.third" and "test.third".  (What is required is that Perl must be
+compiled using the C<-g> flag, you may need to re-Configure.)
+
+The short story is that with "atom" you can instrument the Perl
+executable to create a new executable called F<perl.third>.  When the
+instrumented executable is run, it creates a log of dubious memory
+traffic in file called F<perl.3log>.  See the manual pages of atom and
+third for more information.  The most extensive Third Degree
+documentation is available in the Compaq "Tru64 UNIX Programmer's
+Guide", chapter "Debugging Programs with Third Degree".
+
+The "test.third" leaves a lot of files named F<foo_bar.3log> in the t/
+subdirectory.  There is a problem with these files: Third Degree is so
+effective that it finds problems also in the system libraries.
+Therefore you should used the Porting/thirdclean script to cleanup
+the F<*.3log> files.
+
+There are also leaks that for given certain definition of a leak,
+aren't.  See L</PERL_DESTRUCT_LEVEL> for more information.
+
+=head2 PERL_DESTRUCT_LEVEL
+
+If you want to run any of the tests yourself manually using e.g.
+valgrind, or the pureperl or perl.third executables, please note that
+by default perl B<does not> explicitly cleanup all the memory it has
+allocated (such as global memory arenas) but instead lets the exit()
+of the whole program "take care" of such allocations, also known as
+"global destruction of objects".
+
+There is a way to tell perl to do complete cleanup: set the
+environment variable PERL_DESTRUCT_LEVEL to a non-zero value.
+The t/TEST wrapper does set this to 2, and this is what you
+need to do too, if you don't want to see the "global leaks":
+For example, for "third-degreed" Perl:
+
+	env PERL_DESTRUCT_LEVEL=2 ./perl.third -Ilib t/foo/bar.t
+
+(Note: the mod_perl apache module uses also this environment variable
+for its own purposes and extended its semantics. Refer to the mod_perl
+documentation for more information. Also, spawned threads do the
+equivalent of setting this variable to the value 1.)
+
+If, at the end of a run you get the message I<N scalars leaked>, you can
+recompile with C<-DDEBUG_LEAKING_SCALARS>, which will cause
+the addresses of all those leaked SVs to be dumped; it also converts
+C<new_SV()> from a macro into a real function, so you can use your
+favourite debugger to discover where those pesky SVs were allocated.
+
+=head2 Profiling
+
+Depending on your platform there are various of profiling Perl.
+
+There are two commonly used techniques of profiling executables:
+I<statistical time-sampling> and I<basic-block counting>.
+
+The first method takes periodically samples of the CPU program
+counter, and since the program counter can be correlated with the code
+generated for functions, we get a statistical view of in which
+functions the program is spending its time.  The caveats are that very
+small/fast functions have lower probability of showing up in the
+profile, and that periodically interrupting the program (this is
+usually done rather frequently, in the scale of milliseconds) imposes
+an additional overhead that may skew the results.  The first problem
+can be alleviated by running the code for longer (in general this is a
+good idea for profiling), the second problem is usually kept in guard
+by the profiling tools themselves.
+
+The second method divides up the generated code into I<basic blocks>.
+Basic blocks are sections of code that are entered only in the
+beginning and exited only at the end.  For example, a conditional jump
+starts a basic block.  Basic block profiling usually works by
+I<instrumenting> the code by adding I<enter basic block #nnnn>
+book-keeping code to the generated code.  During the execution of the
+code the basic block counters are then updated appropriately.  The
+caveat is that the added extra code can skew the results: again, the
+profiling tools usually try to factor their own effects out of the
+results.
+
+=head2 Gprof Profiling
+
+gprof is a profiling tool available in many UNIX platforms,
+it uses F<statistical time-sampling>.
+
+You can build a profiled version of perl called "perl.gprof" by
+invoking the make target "perl.gprof"  (What is required is that Perl
+must be compiled using the C<-pg> flag, you may need to re-Configure).
+Running the profiled version of Perl will create an output file called
+F<gmon.out> is created which contains the profiling data collected
+during the execution.
+
+The gprof tool can then display the collected data in various ways.
+Usually gprof understands the following options:
+
+=over 4
+
+=item -a
+
+Suppress statically defined functions from the profile.
+
+=item -b
+
+Suppress the verbose descriptions in the profile.
+
+=item -e routine
+
+Exclude the given routine and its descendants from the profile.
+
+=item -f routine
+
+Display only the given routine and its descendants in the profile.
+
+=item -s
+
+Generate a summary file called F<gmon.sum> which then may be given
+to subsequent gprof runs to accumulate data over several runs.
+
+=item -z
+
+Display routines that have zero usage.
+
+=back
+
+For more detailed explanation of the available commands and output
+formats, see your own local documentation of gprof.
+
+=head2 GCC gcov Profiling
+
+Starting from GCC 3.0 I<basic block profiling> is officially available
+for the GNU CC.
+
+You can build a profiled version of perl called F<perl.gcov> by
+invoking the make target "perl.gcov" (what is required that Perl must
+be compiled using gcc with the flags C<-fprofile-arcs
+-ftest-coverage>, you may need to re-Configure).
+
+Running the profiled version of Perl will cause profile output to be
+generated.  For each source file an accompanying ".da" file will be
+created.
+
+To display the results you use the "gcov" utility (which should
+be installed if you have gcc 3.0 or newer installed).  F<gcov> is
+run on source code files, like this
+
+    gcov sv.c
+
+which will cause F<sv.c.gcov> to be created.  The F<.gcov> files
+contain the source code annotated with relative frequencies of
+execution indicated by "#" markers.
+
+Useful options of F<gcov> include C<-b> which will summarise the
+basic block, branch, and function call coverage, and C<-c> which
+instead of relative frequencies will use the actual counts.  For
+more information on the use of F<gcov> and basic block profiling
+with gcc, see the latest GNU CC manual, as of GCC 3.0 see
+
+    http://gcc.gnu.org/onlinedocs/gcc-3.0/gcc.html
+
+and its section titled "8. gcov: a Test Coverage Program"
+
+    http://gcc.gnu.org/onlinedocs/gcc-3.0/gcc_8.html#SEC132
+
+=head2 Pixie Profiling
+
+Pixie is a profiling tool available on IRIX and Tru64 (aka Digital
+UNIX aka DEC OSF/1) platforms.  Pixie does its profiling using
+I<basic-block counting>.
+
+You can build a profiled version of perl called F<perl.pixie> by
+invoking the make target "perl.pixie" (what is required is that Perl
+must be compiled using the C<-g> flag, you may need to re-Configure).
+
+In Tru64 a file called F<perl.Addrs> will also be silently created,
+this file contains the addresses of the basic blocks.  Running the
+profiled version of Perl will create a new file called "perl.Counts"
+which contains the counts for the basic block for that particular
+program execution.
+
+To display the results you use the F<prof> utility.  The exact
+incantation depends on your operating system, "prof perl.Counts" in
+IRIX, and "prof -pixie -all -L. perl" in Tru64.
+
+In IRIX the following prof options are available:
+
+=over 4
+
+=item -h
+
+Reports the most heavily used lines in descending order of use.
+Useful for finding the hotspot lines.
+
+=item -l
+
+Groups lines by procedure, with procedures sorted in descending order of use.
+Within a procedure, lines are listed in source order.
+Useful for finding the hotspots of procedures.
+
+=back
+
+In Tru64 the following options are available:
+
+=over 4
+
+=item -p[rocedures]
+
+Procedures sorted in descending order by the number of cycles executed
+in each procedure.  Useful for finding the hotspot procedures.
+(This is the default option.)
+
+=item -h[eavy]
+
+Lines sorted in descending order by the number of cycles executed in
+each line.  Useful for finding the hotspot lines.
+
+=item -i[nvocations]
+
+The called procedures are sorted in descending order by number of calls
+made to the procedures.  Useful for finding the most used procedures.
+
+=item -l[ines]
+
+Grouped by procedure, sorted by cycles executed per procedure.
+Useful for finding the hotspots of procedures.
+
+=item -testcoverage
+
+The compiler emitted code for these lines, but the code was unexecuted.
+
+=item -z[ero]
+
+Unexecuted procedures.
+
+=back
+
+For further information, see your system's manual pages for pixie and prof.
+
+=head2 Miscellaneous tricks
+
+=over 4
+
+=item *
+
+Those debugging perl with the DDD frontend over gdb may find the
+following useful:
+
+You can extend the data conversion shortcuts menu, so for example you
+can display an SV's IV value with one click, without doing any typing.
+To do that simply edit ~/.ddd/init file and add after:
+
+  ! Display shortcuts.
+  Ddd*gdbDisplayShortcuts: \
+  /t ()   // Convert to Bin\n\
+  /d ()   // Convert to Dec\n\
+  /x ()   // Convert to Hex\n\
+  /o ()   // Convert to Oct(\n\
+
+the following two lines:
+
+  ((XPV*) (())->sv_any )->xpv_pv  // 2pvx\n\
+  ((XPVIV*) (())->sv_any )->xiv_iv // 2ivx
+
+so now you can do ivx and pvx lookups or you can plug there the
+sv_peek "conversion":
+
+  Perl_sv_peek(my_perl, (SV*)()) // sv_peek
+
+(The my_perl is for threaded builds.)
+Just remember that every line, but the last one, should end with \n\
+
+Alternatively edit the init file interactively via:
+3rd mouse button -> New Display -> Edit Menu
+
+Note: you can define up to 20 conversion shortcuts in the gdb
+section.
+
+=item *
+
+If you see in a debugger a memory area mysteriously full of 0xabababab,
+you may be seeing the effect of the Poison() macro, see L<perlclib>.
+
+=back
+
+=head2 CONCLUSION
+
+We've had a brief look around the Perl source, an overview of the stages
+F<perl> goes through when it's running your code, and how to use a
+debugger to poke at the Perl guts. We took a very simple problem and
+demonstrated how to solve it fully - with documentation, regression
+tests, and finally a patch for submission to p5p.  Finally, we talked
+about how to use external tools to debug and test Perl.
+
+I'd now suggest you read over those references again, and then, as soon
+as possible, get your hands dirty. The best way to learn is by doing,
+so: 
+
+=over 3
+
+=item *
+
+Subscribe to perl5-porters, follow the patches and try and understand
+them; don't be afraid to ask if there's a portion you're not clear on -
+who knows, you may unearth a bug in the patch...
+
+=item *
+
+Keep up to date with the bleeding edge Perl distributions and get
+familiar with the changes. Try and get an idea of what areas people are
+working on and the changes they're making.
+
+=item *
+
+Do read the README associated with your operating system, e.g. README.aix
+on the IBM AIX OS. Don't hesitate to supply patches to that README if
+you find anything missing or changed over a new OS release.
+
+=item *
+
+Find an area of Perl that seems interesting to you, and see if you can
+work out how it works. Scan through the source, and step over it in the
+debugger. Play, poke, investigate, fiddle! You'll probably get to
+understand not just your chosen area but a much wider range of F<perl>'s
+activity as well, and probably sooner than you'd think.
+
+=back
+
+=over 3
+
+=item I<The Road goes ever on and on, down from the door where it began.>
+
+=back
+
+If you can do these things, you've started on the long road to Perl porting. 
+Thanks for wanting to help make Perl better - and happy hacking!
+
+=head1 AUTHOR
+
+This document was written by Nathan Torkington, and is maintained by
+the perl5-porters mailing list.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhist.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhist.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhist.pod	(revision 14489)
@@ -0,0 +1,623 @@
+=head1 NAME
+
+perlhist - the Perl history records
+
+=head1 DESCRIPTION
+
+This document aims to record the Perl source code releases.
+
+=head1 INTRODUCTION
+
+Perl history in brief, by Larry Wall:
+
+    Perl 0 introduced Perl to my officemates.
+    Perl 1 introduced Perl to the world, and changed /\(...\|...\)/ to
+        /(...|...)/.  \(Dan Faigin still hasn't forgiven me. :-\)
+    Perl 2 introduced Henry Spencer's regular expression package.
+    Perl 3 introduced the ability to handle binary data (embedded nulls).
+    Perl 4 introduced the first Camel book.  Really.  We mostly just
+        switched version numbers so the book could refer to 4.000.
+    Perl 5 introduced everything else, including the ability to
+        introduce everything else.
+
+=head1 THE KEEPERS OF THE PUMPKIN
+
+Larry Wall, Andy Dougherty, Tom Christiansen, Charles Bailey, Nick
+Ing-Simmons, Chip Salzenberg, Tim Bunce, Malcolm Beattie, Gurusamy
+Sarathy, Graham Barr, Jarkko Hietaniemi, Hugo van der Sanden,
+Michael Schwern, Rafael Garcia-Suarez, Nicholas Clark, Richard Clamp,
+Leon Brocard.
+
+=head2 PUMPKIN?
+
+[from Porting/pumpkin.pod in the Perl source code distribution]
+
+Chip Salzenberg gets credit for that, with a nod to his cow orker,
+David Croy.  We had passed around various names (baton, token, hot
+potato) but none caught on.  Then, Chip asked:
+
+[begin quote]
+
+   Who has the patch pumpkin?
+
+To explain:  David Croy once told me once that at a previous job,
+there was one tape drive and multiple systems that used it for backups.
+But instead of some high-tech exclusion software, they used a low-tech
+method to prevent multiple simultaneous backups: a stuffed pumpkin.
+No one was allowed to make backups unless they had the "backup pumpkin".
+
+[end quote]
+
+The name has stuck.  The holder of the pumpkin is sometimes called
+the pumpking (keeping the source afloat?) or the pumpkineer (pulling
+the strings?).
+
+=head1 THE RECORDS
+
+ Pump-  Release         Date            Notes
+ king                                   (by no means
+                                         comprehensive,
+                                         see Changes*
+                                         for details)
+ ===========================================================================
+
+ Larry   0              Classified.     Don't ask.
+
+ Larry   1.000          1987-Dec-18
+
+          1.001..10     1988-Jan-30
+          1.011..14     1988-Feb-02
+ Schwern  1.0.15        2002-Dec-18     Modernization
+ Richard  1.0.16        2003-Dec-18
+
+ Larry   2.000          1988-Jun-05
+
+          2.001         1988-Jun-28
+
+ Larry   3.000          1989-Oct-18
+
+          3.001         1989-Oct-26
+          3.002..4      1989-Nov-11
+          3.005         1989-Nov-18
+          3.006..8      1989-Dec-22
+          3.009..13     1990-Mar-02
+          3.014         1990-Mar-13
+          3.015         1990-Mar-14
+          3.016..18     1990-Mar-28
+          3.019..27     1990-Aug-10     User subs.
+          3.028         1990-Aug-14
+          3.029..36     1990-Oct-17
+          3.037         1990-Oct-20
+          3.040         1990-Nov-10
+          3.041         1990-Nov-13
+          3.042..43     1991-Jan-??
+          3.044         1991-Jan-12
+
+ Larry   4.000          1991-Mar-21
+
+          4.001..3      1991-Apr-12
+          4.004..9      1991-Jun-07
+          4.010         1991-Jun-10
+          4.011..18     1991-Nov-05
+          4.019         1991-Nov-11     Stable.
+          4.020..33     1992-Jun-08
+          4.034         1992-Jun-11
+          4.035         1992-Jun-23
+ Larry    4.036         1993-Feb-05     Very stable.
+
+          5.000alpha1   1993-Jul-31
+          5.000alpha2   1993-Aug-16
+          5.000alpha3   1993-Oct-10
+          5.000alpha4   1993-???-??
+          5.000alpha5   1993-???-??
+          5.000alpha6   1994-Mar-18
+          5.000alpha7   1994-Mar-25
+ Andy     5.000alpha8   1994-Apr-04
+ Larry    5.000alpha9   1994-May-05     ext appears.
+          5.000alpha10  1994-Jun-11
+          5.000alpha11  1994-Jul-01
+ Andy     5.000a11a     1994-Jul-07     To fit 14.
+          5.000a11b     1994-Jul-14
+          5.000a11c     1994-Jul-19
+          5.000a11d     1994-Jul-22
+ Larry    5.000alpha12  1994-Aug-04
+ Andy     5.000a12a     1994-Aug-08
+          5.000a12b     1994-Aug-15
+          5.000a12c     1994-Aug-22
+          5.000a12d     1994-Aug-22
+          5.000a12e     1994-Aug-22
+          5.000a12f     1994-Aug-24
+          5.000a12g     1994-Aug-24
+          5.000a12h     1994-Aug-24
+ Larry    5.000beta1    1994-Aug-30
+ Andy     5.000b1a      1994-Sep-06
+ Larry    5.000beta2    1994-Sep-14     Core slushified.
+ Andy     5.000b2a      1994-Sep-14
+          5.000b2b      1994-Sep-17
+          5.000b2c      1994-Sep-17
+ Larry    5.000beta3    1994-Sep-??
+ Andy     5.000b3a      1994-Sep-18
+          5.000b3b      1994-Sep-22
+          5.000b3c      1994-Sep-23
+          5.000b3d      1994-Sep-27
+          5.000b3e      1994-Sep-28
+          5.000b3f      1994-Sep-30
+          5.000b3g      1994-Oct-04
+ Andy     5.000b3h      1994-Oct-07
+ Larry?   5.000gamma    1994-Oct-13?
+
+ Larry   5.000          1994-Oct-17
+
+ Andy     5.000a        1994-Dec-19
+          5.000b        1995-Jan-18
+          5.000c        1995-Jan-18
+          5.000d        1995-Jan-18
+          5.000e        1995-Jan-18
+          5.000f        1995-Jan-18
+          5.000g        1995-Jan-18
+          5.000h        1995-Jan-18
+          5.000i        1995-Jan-26
+          5.000j        1995-Feb-07
+          5.000k        1995-Feb-11
+          5.000l        1995-Feb-21
+          5.000m        1995-Feb-28
+          5.000n        1995-Mar-07
+          5.000o        1995-Mar-13?
+
+ Larry   5.001          1995-Mar-13
+
+ Andy     5.001a        1995-Mar-15
+          5.001b        1995-Mar-31
+          5.001c        1995-Apr-07
+          5.001d        1995-Apr-14
+          5.001e        1995-Apr-18     Stable.
+          5.001f        1995-May-31
+          5.001g        1995-May-25
+          5.001h        1995-May-25
+          5.001i        1995-May-30
+          5.001j        1995-Jun-05
+          5.001k        1995-Jun-06
+          5.001l        1995-Jun-06     Stable.
+          5.001m        1995-Jul-02     Very stable.
+          5.001n        1995-Oct-31     Very unstable.
+          5.002beta1    1995-Nov-21
+          5.002b1a      1995-Dec-04
+          5.002b1b      1995-Dec-04
+          5.002b1c      1995-Dec-04
+          5.002b1d      1995-Dec-04
+          5.002b1e      1995-Dec-08
+          5.002b1f      1995-Dec-08
+ Tom      5.002b1g      1995-Dec-21     Doc release.
+ Andy     5.002b1h      1996-Jan-05
+          5.002b2       1996-Jan-14
+ Larry    5.002b3       1996-Feb-02
+ Andy     5.002gamma    1996-Feb-11
+ Larry    5.002delta    1996-Feb-27
+
+ Larry   5.002          1996-Feb-29     Prototypes.
+
+ Charles  5.002_01      1996-Mar-25
+
+         5.003          1996-Jun-25     Security release.
+
+          5.003_01      1996-Jul-31
+ Nick     5.003_02      1996-Aug-10
+ Andy     5.003_03      1996-Aug-28
+          5.003_04      1996-Sep-02
+          5.003_05      1996-Sep-12
+          5.003_06      1996-Oct-07
+          5.003_07      1996-Oct-10
+ Chip     5.003_08      1996-Nov-19
+          5.003_09      1996-Nov-26
+          5.003_10      1996-Nov-29
+          5.003_11      1996-Dec-06
+          5.003_12      1996-Dec-19
+          5.003_13      1996-Dec-20
+          5.003_14      1996-Dec-23
+          5.003_15      1996-Dec-23
+          5.003_16      1996-Dec-24
+          5.003_17      1996-Dec-27
+          5.003_18      1996-Dec-31
+          5.003_19      1997-Jan-04
+          5.003_20      1997-Jan-07
+          5.003_21      1997-Jan-15
+          5.003_22      1997-Jan-16
+          5.003_23      1997-Jan-25
+          5.003_24      1997-Jan-29
+          5.003_25      1997-Feb-04
+          5.003_26      1997-Feb-10
+          5.003_27      1997-Feb-18
+          5.003_28      1997-Feb-21
+          5.003_90      1997-Feb-25     Ramping up to the 5.004 release.
+          5.003_91      1997-Mar-01
+          5.003_92      1997-Mar-06
+          5.003_93      1997-Mar-10
+          5.003_94      1997-Mar-22
+          5.003_95      1997-Mar-25
+          5.003_96      1997-Apr-01
+          5.003_97      1997-Apr-03     Fairly widely used.
+          5.003_97a     1997-Apr-05
+          5.003_97b     1997-Apr-08
+          5.003_97c     1997-Apr-10
+          5.003_97d     1997-Apr-13
+          5.003_97e     1997-Apr-15
+          5.003_97f     1997-Apr-17
+          5.003_97g     1997-Apr-18
+          5.003_97h     1997-Apr-24
+          5.003_97i     1997-Apr-25
+          5.003_97j     1997-Apr-28
+          5.003_98      1997-Apr-30
+          5.003_99      1997-May-01
+          5.003_99a     1997-May-09
+          p54rc1        1997-May-12     Release Candidates.
+          p54rc2        1997-May-14
+
+ Chip    5.004          1997-May-15     A major maintenance release.
+
+ Tim      5.004_01-t1   1997-???-??     The 5.004 maintenance track.
+          5.004_01-t2   1997-Jun-11     aka perl5.004m1t2
+          5.004_01      1997-Jun-13
+          5.004_01_01   1997-Jul-29     aka perl5.004m2t1
+          5.004_01_02   1997-Aug-01     aka perl5.004m2t2
+          5.004_01_03   1997-Aug-05     aka perl5.004m2t3
+          5.004_02      1997-Aug-07
+          5.004_02_01   1997-Aug-12     aka perl5.004m3t1
+          5.004_03-t2   1997-Aug-13     aka perl5.004m3t2
+          5.004_03      1997-Sep-05
+          5.004_04-t1   1997-Sep-19     aka perl5.004m4t1
+          5.004_04-t2   1997-Sep-23     aka perl5.004m4t2
+          5.004_04-t3   1997-Oct-10     aka perl5.004m4t3
+          5.004_04-t4   1997-Oct-14     aka perl5.004m4t4
+          5.004_04      1997-Oct-15
+          5.004_04-m1   1998-Mar-04     (5.004m5t1) Maint. trials for 5.004_05.
+          5.004_04-m2   1998-May-01
+          5.004_04-m3   1998-May-15
+          5.004_04-m4   1998-May-19
+          5.004_05-MT5  1998-Jul-21
+          5.004_05-MT6  1998-Oct-09
+          5.004_05-MT7  1998-Nov-22
+          5.004_05-MT8  1998-Dec-03
+ Chip     5.004_05-MT9  1999-Apr-26
+          5.004_05      1999-Apr-29
+
+ Malcolm  5.004_50      1997-Sep-09     The 5.005 development track.
+          5.004_51      1997-Oct-02
+          5.004_52      1997-Oct-15
+          5.004_53      1997-Oct-16
+          5.004_54      1997-Nov-14
+          5.004_55      1997-Nov-25
+          5.004_56      1997-Dec-18
+          5.004_57      1998-Feb-03
+          5.004_58      1998-Feb-06
+          5.004_59      1998-Feb-13
+          5.004_60      1998-Feb-20
+          5.004_61      1998-Feb-27
+          5.004_62      1998-Mar-06
+          5.004_63      1998-Mar-17
+          5.004_64      1998-Apr-03
+          5.004_65      1998-May-15
+          5.004_66      1998-May-29
+ Sarathy  5.004_67      1998-Jun-15
+          5.004_68      1998-Jun-23
+          5.004_69      1998-Jun-29
+          5.004_70      1998-Jul-06
+          5.004_71      1998-Jul-09
+          5.004_72      1998-Jul-12
+          5.004_73      1998-Jul-13
+          5.004_74      1998-Jul-14     5.005 beta candidate.
+          5.004_75      1998-Jul-15     5.005 beta1.
+          5.004_76      1998-Jul-21     5.005 beta2.
+          5.005         1998-Jul-22     Oneperl.
+
+ Sarathy  5.005_01      1998-Jul-27     The 5.005 maintenance track.
+          5.005_02-T1   1998-Aug-02
+          5.005_02-T2   1998-Aug-05
+          5.005_02      1998-Aug-08
+ Graham   5.005_03-MT1  1998-Nov-30
+          5.005_03-MT2  1999-Jan-04
+          5.005_03-MT3  1999-Jan-17
+          5.005_03-MT4  1999-Jan-26
+          5.005_03-MT5  1999-Jan-28
+          5.005_03-MT6  1999-Mar-05
+          5.005_03      1999-Mar-28
+ Leon     5.005_04-RC1  2004-Feb-05
+          5.005_04-RC2  2004-Feb-18
+          5.005_04      2004-Feb-23
+
+ Sarathy  5.005_50      1998-Jul-26     The 5.6 development track.
+          5.005_51      1998-Aug-10
+          5.005_52      1998-Sep-25
+          5.005_53      1998-Oct-31
+          5.005_54      1998-Nov-30
+          5.005_55      1999-Feb-16
+          5.005_56      1999-Mar-01
+          5.005_57      1999-May-25
+          5.005_58      1999-Jul-27
+          5.005_59      1999-Aug-02
+          5.005_60      1999-Aug-02
+          5.005_61      1999-Aug-20
+          5.005_62      1999-Oct-15
+          5.005_63      1999-Dec-09
+          5.5.640       2000-Feb-02
+          5.5.650       2000-Feb-08     beta1
+          5.5.660       2000-Feb-22     beta2
+          5.5.670       2000-Feb-29     beta3
+          5.6.0-RC1     2000-Mar-09     Release candidate 1.
+          5.6.0-RC2     2000-Mar-14     Release candidate 2.
+          5.6.0-RC3     2000-Mar-21     Release candidate 3.
+          5.6.0         2000-Mar-22
+
+ Sarathy  5.6.1-TRIAL1  2000-Dec-18     The 5.6 maintenance track.
+          5.6.1-TRIAL2  2001-Jan-31
+          5.6.1-TRIAL3  2001-Mar-19
+          5.6.1-foolish 2001-Apr-01     The "fools-gold" release.
+          5.6.1         2001-Apr-08
+ Rafael   5.6.2-RC1     2003-Nov-08
+          5.6.2         2003-Nov-15     Fix new build issues
+
+ Jarkko   5.7.0         2000-Sep-02     The 5.7 track: Development.
+          5.7.1         2001-Apr-09
+          5.7.2         2001-Jul-13     Virtual release candidate 0.
+          5.7.3         2002-Mar-05
+          5.8.0-RC1     2002-Jun-01
+          5.8.0-RC2     2002-Jun-21
+          5.8.0-RC3     2002-Jul-13
+          5.8.0         2002-Jul-18
+          5.8.1-RC1     2003-Jul-10
+          5.8.1-RC2     2003-Jul-11
+          5.8.1-RC3     2003-Jul-30
+          5.8.1-RC4     2003-Aug-01
+          5.8.1-RC5     2003-Sep-22
+          5.8.1         2003-Sep-25
+ Nicholas 5.8.2-RC1     2003-Oct-27
+          5.8.2-RC2     2003-Nov-03
+          5.8.2         2003-Nov-05
+          5.8.3-RC1     2004-Jan-07
+          5.8.3         2004-Jan-14
+          5.8.4-RC1     2004-Apr-05
+          5.8.4-RC2     2004-Apr-15
+          5.8.4         2004-Apr-21
+          5.8.5-RC1     2004-Jul-06
+          5.8.5-RC2     2004-Jul-08
+          5.8.5         2004-Jul-19
+          5.8.6-RC1     2004-Nov-11
+          5.8.6         2004-Nov-27
+          5.8.7-RC1     2005-May-18
+          5.8.7         2005-May-30
+          5.8.8-RC1     2006-Jan-20
+          5.8.8         2006-Jan-31
+
+ Hugo     5.9.0         2003-Oct-27
+ Rafael   5.9.1         2004-Mar-16
+          5.9.2         2005-Apr-01
+          5.9.3         2006-Jan-28
+
+=head2 SELECTED RELEASE SIZES
+
+For example the notation "core: 212  29" in the release 1.000 means that
+it had in the core 212 kilobytes, in 29 files.  The "core".."doc" are
+explained below.
+
+ release        core       lib         ext        t         doc
+ ======================================================================
+
+ 1.000           212  29      -   -      -   -     38  51     62   3
+ 1.014           219  29      -   -      -   -     39  52     68   4
+ 2.000           309  31      2   3      -   -     55  57     92   4
+ 2.001           312  31      2   3      -   -     55  57     94   4
+ 3.000           508  36     24  11      -   -     79  73    156   5
+ 3.044           645  37     61  20      -   -     90  74    190   6
+ 4.000           635  37     59  20      -   -     91  75    198   4
+ 4.019           680  37     85  29      -   -     98  76    199   4
+ 4.036           709  37     89  30      -   -     98  76    208   5
+ 5.000alpha2     785  50    114  32      -   -    112  86    209   5
+ 5.000alpha3     801  50    117  33      -   -    121  87    209   5
+ 5.000alpha9    1022  56    149  43    116  29    125  90    217   6
+ 5.000a12h       978  49    140  49    205  46    152  97    228   9
+ 5.000b3h       1035  53    232  70    216  38    162  94    218  21
+ 5.000          1038  53    250  76    216  38    154  92    536  62
+ 5.001m         1071  54    388  82    240  38    159  95    544  29
+ 5.002          1121  54    661 101    287  43    155  94    847  35
+ 5.003          1129  54    680 102    291  43    166 100    853  35
+ 5.003_07       1231  60    748 106    396  53    213 137    976  39
+ 5.004          1351  60   1230 136    408  51    355 161   1587  55
+ 5.004_01       1356  60   1258 138    410  51    358 161   1587  55
+ 5.004_04       1375  60   1294 139    413  51    394 162   1629  55
+ 5.004_05       1463  60   1435 150    394  50    445 175   1855  59
+ 5.004_51       1401  61   1260 140    413  53    358 162   1594  56
+ 5.004_53       1422  62   1295 141    438  70    394 162   1637  56
+ 5.004_56       1501  66   1301 140    447  74    408 165   1648  57
+ 5.004_59       1555  72   1317 142    448  74    424 171   1678  58
+ 5.004_62       1602  77   1327 144    629  92    428 173   1674  58
+ 5.004_65       1626  77   1358 146    615  92    446 179   1698  60
+ 5.004_68       1856  74   1382 152    619  92    463 187   1784  60
+ 5.004_70       1863  75   1456 154    675  92    494 194   1809  60
+ 5.004_73       1874  76   1467 152    762 102    506 196   1883  61
+ 5.004_75       1877  76   1467 152    770 103    508 196   1896  62
+ 5.005          1896  76   1469 152    795 103    509 197   1945  63
+ 5.005_03       1936  77   1541 153    813 104    551 201   2176  72       
+ 5.005_50       1969  78   1842 301    795 103    514 198   1948  63
+ 5.005_53       1999  79   1885 303    806 104    602 224   2002  67
+ 5.005_56       2086  79   1970 307    866 113    672 238   2221  75
+ 5.6.0          2930  80   2626 364   1096 129    868 281   2841  93
+ 5.7.0          2977  80   2801 425   1250 132    975 307   3206 100
+ 5.6.1          3049  80   3764 484   1924 159   1025 304   3593 119
+ 5.7.1          3351  84   3442 455   1944 167   1334 357   3698 124
+ 5.7.2          3491  87   4858 618   3290 298   1598 449   3910 139
+ 5.7.3          3415  87   5367 630  14448 410   2205 640   4491 148
+
+The "core"..."doc" mean the following files from the Perl source code
+distribution.  The glob notation ** means recursively, (.) means
+regular files.
+
+ core   *.[hcy]
+ lib    lib/**/*.p[ml]
+ ext    ext/**/*.{[hcyt],xs,pm}
+ t      t/**/*(.) (for 1-5.005_56) or **/*.t (for 5.6.0-5.7.3)
+ doc    {README*,INSTALL,*[_.]man{,.?},pod/**/*.pod}
+
+Here are some statistics for the other subdirectories and one file in
+the Perl source distribution for somewhat more selected releases.
+
+ ======================================================================
+   Legend:  kB   #
+
+            1.014   2.001   3.044   4.000   4.019   4.036
+
+ atarist      -  -    -  -    -  -    -  -    -  -  113 31
+ Configure   31  1   37  1   62  1   73  1   83  1   86  1
+ eg           -  -   34 28   47 39   47 39   47 39   47 39
+ emacs        -  -    -  -    -  -   67  4   67  4   67  4
+ h2pl         -  -    -  -   12 12   12 12   12 12   12 12
+ hints        -  -    -  -    -  -    -  -    5 42   11 56
+ msdos        -  -    -  -   41 13   57 15   58 15   60 15
+ os2          -  -    -  -   63 22   81 29   81 29  113 31
+ usub         -  -    -  -   21 16   25  7   43  8   43  8
+ x2p        103 17  104 17  137 17  147 18  152 19  154 19
+
+ ======================================================================
+
+            5.000a2 5.000a12h 5.000b3h 5.000  5.001m  5.002   5.003
+
+ atarist    113 31  113 31    -  -      -  -    -  -    -  -    -  -
+ bench        -  -    0  1    -  -      -  -    -  -    -  -    -  -
+ Bugs         2  5   26  1    -  -      -  -    -  -    -  -    -  -
+ dlperl      40  5    -  -    -  -      -  -    -  -    -  -    -  -
+ do         127 71    -  -    -  -      -  -    -  -    -  -    -  -
+ Configure    -  -  153  1  159  1    160  1  180  1  201  1  201  1
+ Doc          -  -   26  1   75  7     11  1   11  1    -  -    -  -
+ eg          79 58   53 44   51 43     54 44   54 44   54 44   54 44
+ emacs       67  4  104  6  104  6    104  1  104  6  108  1  108  1
+ h2pl        12 12   12 12   12 12     12 12   12 12   12 12   12 12
+ hints       11 56   12 46   18 48     18 48   44 56   73 59   77 60
+ msdos       60 15   60 15    -  -      -  -    -  -    -  -    -  -
+ os2        113 31  113 31    -  -      -  -    -  -   84 17   56 10
+ U            -  -   62  8  112 42      -  -    -  -    -  -    -  -
+ usub        43  8    -  -    -  -      -  -    -  -    -  -    -  -
+ utils        -  -    -  -    -  -      -  -    -  -   87  7   88  7
+ vms          -  -   80  7  123  9    184 15  304 20  500 24  475 26
+ x2p        171 22  171 21  162 20    162 20  279 20  280 20  280 20
+
+ ======================================================================
+
+            5.003_07 5.004   5.004_04 5.004_62 5.004_65 5.004_68
+
+ beos         -  -     -  -    -  -     -  -     1   1    1   1
+ Configure  217  1   225  1  225  1   240  1   248   1  256   1
+ cygwin32     -  -    23  5   23  5    23  5    24   5   24   5
+ djgpp        -  -     -  -    -  -    14  5    14   5   14   5
+ eg          54 44    81 62   81 62    81 62    81  62   81  62
+ emacs      143  1   194  1  204  1   212  2   212   2  212   2
+ h2pl        12 12    12 12   12 12    12 12    12  12   12  12
+ hints       90 62   129 69  132 71   144 72   151  74  155  74
+ os2        117 42   121 42  127 42   127 44   129  44  129  44
+ plan9       79 15    82 15   82 15    82 15    82  15   82  15
+ Porting     51  1    94  2  109  4   203  6   234   8  241   9
+ qnx          -  -     1  2    1  2     1  2     1   2    1   2
+ utils       97  7   112  8  118  8   124  8   156   9  159   9
+ vms        505 27   518 34  524 34   538 34   569  34  569  34
+ win32        -  -   285 33  378 36   470 39   493  39  575  41
+ x2p        280 19   281 19  281 19   281 19   282  19  281  19
+
+ ======================================================================
+
+            5.004_70 5.004_73 5.004_75  5.005  5.005_03
+
+ apollo       -   -    -   -    -   -    -   -    0   1
+ beos         1   1    1   1    1   1    1   1    1   1
+ Configure  256   1  256   1  264   1  264   1  270   1
+ cygwin32    24   5   24   5   24   5   24   5   24   5  
+ djgpp       14   5   14   5   14   5   14   5	 15   5
+ eg          86  65   86  65   86  65   86  65	 86  65
+ emacs      262   2  262   2  262   2  262   2	274   2
+ h2pl        12  12   12  12   12  12   12  12	 12  12
+ hints      157  74  157  74  159  74  160  74	179  77
+ mint         -   -    -   -    -   -    -   -	  4   7
+ mpeix        -   -    -   -    5   3    5   3	  5   3
+ os2        129  44  139  44  142  44  143  44	148  44
+ plan9       82  15   82  15   82  15   82  15	 82  15
+ Porting    241   9  253   9  259  10  264  12	272  13
+ qnx          1   2    1   2    1   2    1   2	  1   2
+ utils      160   9  160   9  160   9  160   9	164   9
+ vms        570  34  572  34  573  34  575  34	583  34
+ vos          -   -    -   -    -   -    -   -	156  10
+ win32      577  41  585  41  585  41  587  41	600  42
+ x2p        281  19  281  19  281  19  281  19	281  19
+
+=head2 SELECTED PATCH SIZES
+
+The "diff lines kb" means that for example the patch 5.003_08, to be
+applied on top of the 5.003_07 (or whatever was before the 5.003_08)
+added lines for 110 kilobytes, it removed lines for 19 kilobytes, and
+changed lines for 424 kilobytes.  Just the lines themselves are
+counted, not their context.  The "+ - !" become from the diff(1)
+context diff output format.
+
+ Pump-  Release         Date           diff lines kB
+ king                                  -------------
+                                          +   -   !
+ ===========================================================================
+
+ Chip     5.003_08      1996-Nov-19     110  19 424
+          5.003_09      1996-Nov-26      38   9 248
+          5.003_10      1996-Nov-29      29   2  27
+          5.003_11      1996-Dec-06      73  12 165
+          5.003_12      1996-Dec-19     275   6 436
+          5.003_13      1996-Dec-20      95   1  56
+          5.003_14      1996-Dec-23      23   7 333
+          5.003_15      1996-Dec-23       0   0   1
+          5.003_16      1996-Dec-24      12   3  50
+          5.003_17      1996-Dec-27      19   1  14
+          5.003_18      1996-Dec-31      21   1  32
+          5.003_19      1997-Jan-04      80   3  85
+          5.003_20      1997-Jan-07      18   1 146
+          5.003_21      1997-Jan-15      38  10 221
+          5.003_22      1997-Jan-16       4   0  18
+          5.003_23      1997-Jan-25      71  15 119
+          5.003_24      1997-Jan-29     426   1  20
+          5.003_25      1997-Feb-04      21   8 169
+          5.003_26      1997-Feb-10      16   1  15
+          5.003_27      1997-Feb-18      32  10  38
+          5.003_28      1997-Feb-21      58   4  66
+          5.003_90      1997-Feb-25      22   2  34
+          5.003_91      1997-Mar-01      37   1  39
+          5.003_92      1997-Mar-06      16   3  69
+          5.003_93      1997-Mar-10      12   3  15
+          5.003_94      1997-Mar-22     407   7 200
+          5.003_95      1997-Mar-25      41   1  37
+          5.003_96      1997-Apr-01     283   5 261
+          5.003_97      1997-Apr-03      13   2  34
+          5.003_97a     1997-Apr-05      57   1  27
+          5.003_97b     1997-Apr-08      14   1  20
+          5.003_97c     1997-Apr-10      20   1  16
+          5.003_97d     1997-Apr-13       8   0  16
+          5.003_97e     1997-Apr-15      15   4  46
+          5.003_97f     1997-Apr-17       7   1  33
+          5.003_97g     1997-Apr-18       6   1  42
+          5.003_97h     1997-Apr-24      23   3  68
+          5.003_97i     1997-Apr-25      23   1  31
+          5.003_97j     1997-Apr-28      36   1  49
+          5.003_98      1997-Apr-30     171  12 539
+          5.003_99      1997-May-01       6   0   7
+          5.003_99a     1997-May-09      36   2  61
+          p54rc1        1997-May-12       8   1  11
+          p54rc2        1997-May-14       6   0  40
+
+        5.004           1997-May-15       4   0   4
+
+ Tim      5.004_01      1997-Jun-13     222  14  57
+          5.004_02      1997-Aug-07     112  16 119
+          5.004_03      1997-Sep-05     109   0  17
+          5.004_04      1997-Oct-15      66   8 173
+
+=head1 THE KEEPERS OF THE RECORDS
+
+Jarkko Hietaniemi <F<jhi@iki.fi>>.
+
+Thanks to the collective memory of the Perlfolk.  In addition to the
+Keepers of the Pumpkin also Alan Champion, Mark Dominus, 
+Andreas König, John Macdonald, Matthias Neeracher, Jeff Okamoto,
+Michael Peppler, Randal Schwartz, and Paul D. Smith sent corrections
+and additions.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhpux.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhpux.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhpux.pod	(revision 14489)
@@ -0,0 +1,591 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.hpux - Perl version 5 on Hewlett-Packard Unix (HP-UX) systems
+
+=head1 DESCRIPTION
+
+This document describes various features of HP's Unix operating system
+(HP-UX) that will affect how Perl version 5 (hereafter just Perl) is
+compiled and/or runs.
+
+=head2 Using perl as shipped with HP-UX
+
+Application release September 2001, HP-UX 11.00 is the first to ship
+with Perl. By the time it was perl-5.6.1 in /opt/perl. The first
+occurrence is on CD 5012-7954 and can be installed using
+
+  swinstall -s /cdrom perl
+
+assuming you have mounted that CD on /cdrom. In this version the
+following modules were installed:
+
+  ActivePerl::DocTools-0.04   HTML::Parser-3.19   XML::DOM-1.25
+  Archive::Tar-0.072          HTML::Tagset-3.03   XML::Parser-2.27
+  Compress::Zlib-1.08         MIME::Base64-2.11   XML::Simple-1.05
+  Convert::ASN1-0.10          Net-1.07            XML::XPath-1.09
+  Digest::MD5-2.11            PPM-2.1.5           XML::XSLT-0.32
+  File::CounterFile-0.12      SOAP::Lite-0.46     libwww-perl-5.51
+  Font::AFM-1.18              Storable-1.011      libxml-perl-0.07
+  HTML-Tree-3.11              URI-1.11            perl-ldap-0.23
+
+The build was a portable hppa-1.1 multithread build that supports large
+files compiled with gcc-2.9-hppa-991112
+
+If you perform a new installation, then Perl will be installed
+automatically.
+
+More recent (preinstalled) HP-UX systems have more recent versions of
+Perl and the updated modules.
+
+=head2 Using perl from HP's porting centre
+
+HP porting centre tries very hard to keep up with customer demand and
+release updates from the Open Source community. Having precompiled
+Perl binaries available is obvious.
+
+The HP porting centres are limited in what systems they are allowed
+to port to and they usually choose the two most recent OS versions
+available. This means that at the moment of writing, there are only
+HP-UX 11.11 (pa-risc 2.0) and HP-UX 11.23 (Itanium 2) ports available
+on the porting centres.
+
+HP has asked the porting centre to move Open Source binaries
+from /opt to /usr/local, so binaries produced since the start
+of July 2002 are located in /usr/local.
+
+One of HP porting centres URL's is http://hpux.connect.org.uk/
+The port currently available is built with GNU gcc.
+
+=head2 Compiling Perl 5 on HP-UX
+
+When compiling Perl, you must use an ANSI C compiler.  The C compiler
+that ships with all HP-UX systems is a K&R compiler that should only be
+used to build new kernels.
+
+Perl can be compiled with either HP's ANSI C compiler or with gcc.  The
+former is recommended, as not only can it compile Perl with no
+difficulty, but also can take advantage of features listed later that
+require the use of HP compiler-specific command-line flags.
+
+If you decide to use gcc, make sure your installation is recent and
+complete, and be sure to read the Perl INSTALL file for more gcc-specific
+details.
+
+=head2 PA-RISC
+
+HP's current Unix systems run on its own Precision Architecture
+(PA-RISC) chip.  HP-UX used to run on the Motorola MC68000 family of
+chips, but any machine with this chip in it is quite obsolete and this
+document will not attempt to address issues for compiling Perl on the
+Motorola chipset.
+
+The most recent version of PA-RISC at the time of this document's last
+update is 2.0. HP PA-RISC systems are usually refered to with model
+description "HP 9000".
+
+A complete list of models at the time the OS was built is in the file
+/usr/sam/lib/mo/sched.models. The first column corresponds to the last
+part of the output of the "model" command.  The second column is the
+PA-RISC version and the third column is the exact chip type used.
+(Start browsing at the bottom to prevent confusion ;-)
+
+  # model
+  9000/800/L1000-44
+  # grep L1000-44 /usr/sam/lib/mo/sched.models
+  L1000-44        2.0     PA8500
+
+=head2 Portability Between PA-RISC Versions
+
+An executable compiled on a PA-RISC 2.0 platform will not execute on a
+PA-RISC 1.1 platform, even if they are running the same version of
+HP-UX.  If you are building Perl on a PA-RISC 2.0 platform and want that
+Perl to also run on a PA-RISC 1.1, the compiler flags +DAportable and
++DS32 should be used.
+
+It is no longer possible to compile PA-RISC 1.0 executables on either
+the PA-RISC 1.1 or 2.0 platforms.  The command-line flags are accepted,
+but the resulting executable will not run when transferred to a PA-RISC
+1.0 system.
+
+=head2 PA-RISC 1.0
+
+The original version of PA-RISC, HP no longer sells any system with this chip.
+
+The following systems contained PA-RISC 1.0 chips:
+
+  600, 635, 645, 808, 815, 822, 825, 832, 834, 835, 840, 842, 845, 850,
+  852, 855, 860, 865, 870, 890
+
+=head2 PA-RISC 1.1
+
+An upgrade to the PA-RISC design, it shipped for many years in many different
+system.
+
+The following systems contain with PA-RISC 1.1 chips:
+
+  705, 710, 712, 715, 720, 722, 725, 728, 730, 735, 742, 743, 744, 745,
+  747, 750, 755, 770, 777, 778, 779, 800, 801, 803, 806, 807, 809, 811,
+  813, 816, 817, 819, 821, 826, 827, 829, 831, 837, 839, 841, 847, 849,
+  851, 856, 857, 859, 867, 869, 877, 887, 891, 892, 897, A180, A180C,
+  B115, B120, B132L, B132L+, B160L, B180L, C100, C110, C115, C120,
+  C160L, D200, D210, D220, D230, D250, D260, D310, D320, D330, D350,
+  D360, D410, DX0, DX5, DXO, E25, E35, E45, E55, F10, F20, F30, G30,
+  G40, G50, G60, G70, H20, H30, H40, H50, H60, H70, I30, I40, I50, I60,
+  I70, J200, J210, J210XC, K100, K200, K210, K220, K230, K400, K410,
+  K420, S700i, S715, S744, S760, T500, T520
+
+=head2 PA-RISC 2.0
+
+The most recent upgrade to the PA-RISC design, it added support for
+64-bit integer data.
+
+As of the date of this document's last update, the following systems
+contain PA-RISC 2.0 chips:
+
+  700, 780, 781, 782, 783, 785, 802, 804, 810, 820, 861, 871, 879, 889,
+  893, 895, 896, 898, 899, A400, A500, B1000, B2000, C130, C140, C160,
+  C180, C180+, C180-XP, C200+, C400+, C3000, C360, C3600, CB260, D270,
+  D280, D370, D380, D390, D650, J220, J2240, J280, J282, J400, J410,
+  J5000, J5500XM, J5600, J7000, J7600, K250, K260, K260-EG, K270, K360,
+  K370, K380, K450, K460, K460-EG, K460-XP, K470, K570, K580, L1000,
+  L2000, L3000, N4000, R380, R390, SD16000, SD32000, SD64000, T540,
+  T600, V2000, V2200, V2250, V2500, V2600
+
+Just before HP took over Compaq, some systems were renamed. the link
+that contained the explanation is dead, so here's a short summary:
+
+  HP 9000 A-Class servers, now renamed HP Server rp2400 series.
+  HP 9000 L-Class servers, now renamed HP Server rp5400 series.
+  HP 9000 N-Class servers, now renamed HP Server rp7400.
+
+  rp2400, rp2405, rp2430, rp2450, rp2470, rp3410, rp3440, rp4410,
+  rp4440, rp5400, rp5405, rp5430, rp5450, rp5470, rp7400, rp7405,
+  rp7410, rp7420, rp8400, rp8420, Superdome
+
+The current naming convention is:
+
+  aadddd
+  ||||`+- 00 - 99 relative capacity & newness (upgrades, etc.)
+  |||`--- unique number for each architecture to ensure different
+  |||     systems do not have the same numbering across
+  |||     architectures
+  ||`---- 1 - 9 identifies family and/or relative positioning
+  ||
+  |`----- c = ia32 (cisc)
+  |       p = pa-risc
+  |       x = ia-64 (Itanium & Itanium 2)
+  |       h = housing
+  `------ t = tower
+          r = rack optimized
+          s = super scalable
+          b = blade
+          sa = appliance
+
+=head2 Itanium Processor Family and HP-UX
+
+HP-UX also runs on the new Itanium processor.  This requires the use
+of a different version of HP-UX (currently 11.23 or 11i v2), and with
+the exception of a few differences detailed below and in later sections,
+Perl should compile with no problems.
+
+Although PA-RISC binaries can run on Itanium systems, you should not
+attempt to use a PA-RISC version of Perl on an Itanium system.  This is
+because shared libraries created on an Itanium system cannot be loaded
+while running a PA-RISC executable.
+
+HP Itanium 2 systems are usually refered to with model description
+"HP Integrity".
+
+=head2 Itanium & Itanium 2
+
+HP also ships servers with the 128-bit Itanium processor(s). As of the
+date of this document's last update, the following systems contain
+Itanium or Itanium 2 chips (this is very likely to be out of date):
+
+  BL60p, rx1600, rx1620, rx2600, rx2600hptc, rx2620, rx4610, rx4640,
+  rx5670, rx7620, rx8620, rx9610
+
+To see all about your machine, type
+
+  # model
+  ia64 hp server rx2600
+  # /usr/contrib/bin/machinfo
+
+=head2 Building Dynamic Extensions on HP-UX
+
+HP-UX supports dynamically loadable libraries (shared libraries).
+Shared libraries end with the suffix .sl.  On Itanium systems,
+they end with the suffix .so.
+
+Shared libraries created on a platform using a particular PA-RISC
+version are not usable on platforms using an earlier PA-RISC version by
+default.  However, this backwards compatibility may be enabled using the
+same +DAportable compiler flag (with the same PA-RISC 1.0 caveat
+mentioned above).
+
+Shared libraries created on an Itanium platform cannot be loaded on
+a PA-RISC platform.  Shared libraries created on a PA-RISC platform
+can only be loaded on an Itanium platform if it is a PA-RISC executable
+that is attempting to load the PA-RISC library.  A PA-RISC shared
+library cannot be loaded into an Itanium executable nor vice-versa.
+
+To create a shared library, the following steps must be performed:
+
+  1. Compile source modules with +z or +Z flag to create a .o module
+     which contains Position-Independent Code (PIC).  The linker will
+     tell you in the next step if +Z was needed.
+     (For gcc, the appropriate flag is -fpic or -fPIC.)
+
+  2. Link the shared library using the -b flag.  If the code calls
+     any functions in other system libraries (e.g., libm), it must
+     be included on this line.
+
+(Note that these steps are usually handled automatically by the extension's
+Makefile).
+
+If these dependent libraries are not listed at shared library creation
+time, you will get fatal "Unresolved symbol" errors at run time when the
+library is loaded.
+
+You may create a shared library that refers to another library, which
+may be either an archive library or a shared library.  If this second
+library is a shared library, this is called a "dependent library".  The
+dependent library's name is recorded in the main shared library, but it
+is not linked into the shared library.  Instead, it is loaded when the
+main shared library is loaded.  This can cause problems if you build an
+extension on one system and move it to another system where the
+libraries may not be located in the same place as on the first system.
+
+If the referred library is an archive library, then it is treated as a
+simple collection of .o modules (all of which must contain PIC).  These
+modules are then linked into the shared library.
+
+Note that it is okay to create a library which contains a dependent
+library that is already linked into perl.
+
+Some extensions, like DB_File and Compress::Zlib use/require prebuilt
+libraries for the perl extensions/modules to work. If these libraries
+are built using the default configuration, it might happen that you
+run into an error like "invalid loader fixup" during load phase.
+HP is aware of this problem.  Search the HP-UX cxx-dev forums for
+discussions about the subject.  The short answer is that B<everything>
+(all libraries, everything) must be compiled with C<+z> or C<+Z> to be
+PIC (position independent code).  (For gcc, that would be
+C<-fpic> or C<-fPIC>).  In HP-UX 11.00 or newer the linker
+error message should tell the name of the offending object file.
+
+A more general approach is to intervene manually, as with an example for
+the DB_File module, which requires SleepyCat's libdb.sl:
+
+  # cd .../db-3.2.9/build_unix
+  # vi Makefile
+  ... add +Z to all cflags to create shared objects
+  CFLAGS=         -c $(CPPFLAGS) +Z -Ae +O2 +Onolimit \
+		  -I/usr/local/include -I/usr/include/X11R6
+  CXXFLAGS=       -c $(CPPFLAGS) +Z -Ae +O2 +Onolimit \
+		  -I/usr/local/include -I/usr/include/X11R6
+
+  # make clean
+  # make
+  # mkdir tmp
+  # cd tmp
+  # ar x ../libdb.a
+  # ld -b -o libdb-3.2.sl *.o
+  # mv libdb-3.2.sl /usr/local/lib
+  # rm *.o
+  # cd /usr/local/lib
+  # rm -f libdb.sl
+  # ln -s libdb-3.2.sl libdb.sl
+
+  # cd .../DB_File-1.76
+  # make distclean
+  # perl Makefile.PL
+  # make
+  # make test
+  # make install
+
+As of db-4.2.x it is no longer needed to do this by hand. Sleepycat
+has changed the configuration process to add +z on HP-UX automatically.
+
+  # cd .../db-4.2.25/build_unix
+  # env CFLAGS=+DA2.0w LDFLAGS=+DA2.0w ../dist/configure
+
+should work to generate 64bit shared libraries for HP-UX 11.00 and 11i.
+
+It is no longer possible to link PA-RISC 1.0 shared libraries (even
+though the command-line flags are still present).
+
+PA-RISC and Itanium object files are not interchangeable.  Although
+you may be able to use ar to create an archive library of PA-RISC
+object files on an Itanium system, you cannot link against it using
+an Itanium link editor.
+
+=head2 The HP ANSI C Compiler
+
+When using this compiler to build Perl, you should make sure that the
+flag -Aa is added to the cpprun and cppstdin variables in the config.sh
+file (though see the section on 64-bit perl below). If you are using a
+recent version of the Perl distribution, these flags are set automatically.
+
+=head2 The GNU C Compiler
+
+When you are going to use the GNU C compiler (gcc), and you don't have
+gcc yet, you can either build it yourself from the sources (available
+from e.g. http://www.gnu.ai.mit.edu/software/gcc/releases.html) or fetch
+a prebuilt binary from the HP porting center. There are two places where
+gcc prebuilds can be fetched; the first and best (for HP-UX 11 only) is
+http://h21007.www2.hp.com/dspp/tech/tech_TechSoftwareDetailPage_IDX/1,1703,547,00.html
+the second is http://hpux.cs.utah.edu/hppd/hpux/Gnu/ where you can also
+find the GNU binutils package. (Browse through the list, because there
+are often multiple versions of the same package available).
+
+Above mentioned distributions are depots. H.Merijn Brand has made prebuilt
+gcc binaries available on http://mirrors.develooper.com/hpux/ and/or
+http://www.cmve.net/~merijn/ for HP-UX 10.20, HP-UX 11.00, and HP-UX 11.11
+(HP-UX 11i) in both 32- and 64-bit versions. These are bzipped tar archives
+that also include recent GNU binutils and GNU gdb.  Read the instructions
+on that page to rebuild gcc using itself.
+
+On PA-RISC you need a different compiler for 32-bit applications and for
+64-bit applications. On PA-RISC, 32-bit objects and 64-bit objects do
+not mix. Period. There is no different behaviour for HP C-ANSI-C or GNU
+gcc. So if you require your perl binary to use 64-bit libraries, like
+Oracle-64bit, you MUST build a 64-bit perl.
+
+Building a 64-bit capable gcc on PA-RISC from source is possible only when
+you have the HP C-ANSI C compiler or an already working 64-bit binary of
+gcc available. Best performance for perl is achieved with HP's native
+compiler.
+
+=head2 Using Large Files with Perl on HP-UX
+
+Beginning with HP-UX version 10.20, files larger than 2GB (2^31 bytes)
+may be created and manipulated.  Three separate methods of doing this
+are available.  Of these methods, the best method for Perl is to compile
+using the -Duselargefiles flag to Configure.  This causes Perl to be
+compiled using structures and functions in which these are 64 bits wide,
+rather than 32 bits wide.  (Note that this will only work with HP's ANSI
+C compiler.  If you want to compile Perl using gcc, you will have to get
+a version of the compiler that supports 64-bit operations. See above for
+where to find it.)
+
+There are some drawbacks to this approach.  One is that any extension
+which calls any file-manipulating C function will need to be recompiled
+(just follow the usual "perl Makefile.PL; make; make test; make install"
+procedure).
+
+The list of functions that will need to recompiled is:
+creat,		fgetpos,	fopen,
+freopen,	fsetpos,	fstat,
+fstatvfs,	fstatvfsdev,	ftruncate,
+ftw,		lockf,		lseek,
+lstat,		mmap,		nftw,
+open,		prealloc,	stat,
+statvfs,	statvfsdev,	tmpfile,
+truncate,	getrlimit,	setrlimit
+
+Another drawback is only valid for Perl versions before 5.6.0.  This
+drawback is that the seek and tell functions (both the builtin version
+and POSIX module version) will not perform correctly.
+
+It is strongly recommended that you use this flag when you run
+Configure.  If you do not do this, but later answer the question about
+large files when Configure asks you, you may get a configuration that
+cannot be compiled, or that does not function as expected.
+
+=head2 Threaded Perl on HP-UX
+
+It is possible to compile a version of threaded Perl on any version of
+HP-UX before 10.30, but it is strongly suggested that you be running on
+HP-UX 11.00 at least.
+
+To compile Perl with threads, add -Dusethreads to the arguments of
+Configure.  Verify that the -D_POSIX_C_SOURCE=199506L compiler flag is
+automatically added to the list of flags.  Also make sure that -lpthread
+is listed before -lc in the list of libraries to link Perl with. The
+hints provided for HP-UX during Configure will try very hard to get
+this right for you.
+
+HP-UX versions before 10.30 require a separate installation of a POSIX
+threads library package. Two examples are the HP DCE package, available
+on "HP-UX Hardware Extensions 3.0, Install and Core OS, Release 10.20,
+April 1999 (B3920-13941)" or the Freely available PTH package, available
+on H.Merijn's site (http://mirrors.develooper.com/hpux/).
+
+If you are going to use the HP DCE package, the library used for threading
+is /usr/lib/libcma.sl, but there have been multiple updates of that
+library over time. Perl will build with the first version, but it
+will not pass the test suite. Older Oracle versions might be a compelling
+reason not to update that library, otherwise please find a newer version
+in one of the following patches: PHSS_19739, PHSS_20608, or PHSS_23672
+
+reformatted output:
+
+  d3:/usr/lib 106 > what libcma-*.1
+  libcma-00000.1:
+     HP DCE/9000 1.5               Module: libcma.sl (Export)
+                                   Date: Apr 29 1996 22:11:24
+  libcma-19739.1:
+     HP DCE/9000 1.5 PHSS_19739-40 Module: libcma.sl (Export)
+                                   Date: Sep  4 1999 01:59:07
+  libcma-20608.1:
+     HP DCE/9000 1.5 PHSS_20608    Module: libcma.1 (Export)
+                                   Date: Dec  8 1999 18:41:23
+  libcma-23672.1:
+     HP DCE/9000 1.5 PHSS_23672    Module: libcma.1 (Export)
+                                   Date: Apr  9 2001 10:01:06
+  d3:/usr/lib 107 >
+
+If you choose for the PTH package, use swinstall to install pth in
+the default location (/opt/pth), and then make symbolic links to the
+libraries from /usr/lib
+
+  # cd /usr/lib
+  # ln -s /opt/pth/lib/libpth* .
+
+For building perl to support Oracle, it needs to be linked with libcl
+and libpthread. So even if your perl is an unthreaded build, these
+libraries might be required. See "Oracle on HP-UX" below.
+
+=head2 64-bit Perl on HP-UX
+
+Beginning with HP-UX 11.00, programs compiled under HP-UX can take
+advantage of the LP64 programming environment (LP64 means Longs and
+Pointers are 64 bits wide), in which scalar variables will be able
+to hold numbers larger than 2^32 with complete precision.  Perl has
+proven to be consistent and reliable in 64bit mode since 5.8.1 on
+all HP-UX 11.xx.
+
+As of the date of this document, Perl is fully 64-bit compliant on
+HP-UX 11.00 and up for both cc- and gcc builds. If you are about to
+build a 64-bit perl with GNU gcc, please read the gcc section carefully.
+
+Should a user have the need for compiling Perl in the LP64 environment,
+use the -Duse64bitall flag to Configure.  This will force Perl to be
+compiled in a pure LP64 environment (with the +DD64 flag for HP C-ANSI-C,
+with no additional options for GNU gcc 64-bit on PA-RISC, and with
+-mlp64 for GNU gcc on Itanium).
+If you want to compile Perl using gcc, you will have to get a version of
+the compiler that supports 64-bit operations.)
+
+You can also use the -Duse64bitint flag to Configure.  Although there
+are some minor differences between compiling Perl with this flag versus
+the -Duse64bitall flag, they should not be noticeable from a Perl user's
+perspective. When configuring -Duse64bitint using a 64bit gcc on a
+pa-risc architecture, -Duse64bitint is silently promoted to -Duse64bitall.
+
+In both cases, it is strongly recommended that you use these flags when
+you run Configure.  If you do not use do this, but later answer the
+questions about 64-bit numbers when Configure asks you, you may get a
+configuration that cannot be compiled, or that does not function as
+expected.
+
+=head2 Oracle on HP-UX
+
+Using perl to connect to Oracle databases through DBI and DBD::Oracle
+has caused a lot of people many headaches. Read README.hpux in the
+DBD::Oracle for much more information. The reason to mention it here
+is that Oracle requires a perl built with libcl and libpthread, the
+latter even when perl is build without threads. Building perl using
+all defaults, but still enabling to build DBD::Oracle later on can be
+achieved using
+
+  Configure -A prepend:libswanted='cl pthread ' ...
+
+Do not forget the space before the trailing quote.
+
+Also note that this does not (yet) work with all configurations,
+it is known to fail with 64-bit versions of GCC.
+
+=head2 GDBM and Threads on HP-UX
+
+If you attempt to compile Perl with threads on an 11.X system and also
+link in the GDBM library, then Perl will immediately core dump when it
+starts up.  The only workaround at this point is to relink the GDBM
+library under 11.X, then relink it into Perl.
+
+=head2 NFS filesystems and utime(2) on HP-UX
+
+If you are compiling Perl on a remotely-mounted NFS filesystem, the test
+io/fs.t may fail on test #18.  This appears to be a bug in HP-UX and no
+fix is currently available.
+
+=head2 perl -P and // and HP-UX
+
+If HP-UX Perl is compiled with flags that will cause problems if the
+-P flag of Perl (preprocess Perl code with the C preprocessor before
+perl sees it) is used.  The problem is that C<//>, being a C++-style
+until-end-of-line comment, will disappear along with the remainder
+of the line.  This means that common Perl constructs like
+
+  s/foo//;
+
+will turn into illegal code
+
+  s/foo
+
+The workaround is to use some other quoting separator than C<"/">,
+like for example C<"!">:
+
+  s!foo!!;
+
+=head2 HP-UX Kernel Parameters (maxdsiz) for Compiling Perl
+
+By default, HP-UX comes configured with a maximum data segment size of
+64MB.  This is too small to correctly compile Perl with the maximum
+optimization levels.  You can increase the size of the maxdsiz kernel
+parameter through the use of SAM.
+
+When using the GUI version of SAM, click on the Kernel Configuration
+icon, then the Configurable Parameters icon.  Scroll down and select
+the maxdsiz line.  From the Actions menu, select the Modify Configurable
+Parameter item.  Insert the new formula into the Formula/Value box.
+Then follow the instructions to rebuild your kernel and reboot your
+system.
+
+In general, a value of 256MB (or "256*1024*1024") is sufficient for
+Perl to compile at maximum optimization.
+
+=head1 nss_delete core dump from op/pwent or op/grent
+
+You may get a bus error core dump from the op/pwent or op/grent
+tests. If compiled with -g you will see a stack trace much like
+the following:
+
+  #0  0xc004216c in  () from /usr/lib/libc.2
+  #1  0xc00d7550 in __nss_src_state_destr () from /usr/lib/libc.2
+  #2  0xc00d7768 in __nss_src_state_destr () from /usr/lib/libc.2
+  #3  0xc00d78a8 in nss_delete () from /usr/lib/libc.2
+  #4  0xc01126d8 in endpwent () from /usr/lib/libc.2
+  #5  0xd1950 in Perl_pp_epwent () from ./perl
+  #6  0x94d3c in Perl_runops_standard () from ./perl
+  #7  0x23728 in S_run_body () from ./perl
+  #8  0x23428 in perl_run () from ./perl
+  #9  0x2005c in main () from ./perl
+
+The key here is the C<nss_delete> call.  One workaround for this
+bug seems to be to create add to the file F</etc/nsswitch.conf>
+(at least) the following lines
+
+  group: files
+  passwd: files
+
+Whether you are using NIS does not matter.  Amazingly enough,
+the same bug also affects Solaris.
+
+=head1 AUTHOR
+
+Jeff Okamoto <okamoto@corp.hp.com>
+H.Merijn Brand <h.m.brand@xs4all.nl>
+
+With much assistance regarding shared libraries from Marc Sabatella.
+
+=head1 DATE
+
+Version 0.7.6: 2005-12-20
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhurd.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhurd.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlhurd.pod	(revision 14489)
@@ -0,0 +1,54 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.hurd - Perl version 5 on Hurd
+
+=head1 DESCRIPTION
+
+If you want to use Perl on the Hurd, I recommend using the Debian
+GNU/Hurd distribution ( see http://www.debian.org/ ), even if an
+official, stable release has not yet been made.  The old "gnu-0.2"
+binary distribution will most certainly have additional problems.
+
+=head2 Known Problems with Perl on Hurd 
+
+The Perl test suite may still report some errors on the Hurd.  The
+"lib/anydbm" and "pragma/warnings" tests will almost certainly fail.
+Both failures are not really specific to the Hurd, as indicated by the
+test suite output.
+
+The socket tests may fail if the network is not configured.  You have
+to make "/hurd/pfinet" the translator for "/servers/socket/2", giving
+it the right arguments.  Try "/hurd/pfinet --help" for more
+information.
+
+Here are the statistics for Perl 5.005_62 on my system:
+
+ Failed Test  Status Wstat Total Fail  Failed  List of failed
+ -------------------------------------------------------------------------
+ lib/anydbm.t                 12    1   8.33%  12
+ pragma/warnings             333    1   0.30%  215
+
+ 8 tests and 24 subtests skipped.
+ Failed 2/229 test scripts, 99.13% okay. 2/10850 subtests failed, 99.98% okay.
+
+There are quite a few systems out there that do worse!
+
+However, since I am running a very recent Hurd snapshot, in which a lot of
+bugs that were exposed by the Perl test suite have been fixed, you may
+encounter more failures.  Likely candidates are: "op/stat", "lib/io_pipe",
+"lib/io_sock", "lib/io_udp" and "lib/time".
+
+In any way, if you're seeing failures beyond those mentioned in this
+document, please consider upgrading to the latest Hurd before reporting
+the failure as a bug. 
+
+=head1 AUTHOR
+
+Mark Kettenis <kettenis@gnu.org>
+
+Last Updated: Fri, 29 Oct 1999 22:50:30 +0200
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlintern.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlintern.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlintern.pod	(revision 14489)
@@ -0,0 +1,919 @@
+=head1 NAME
+
+perlintern - autogenerated documentation of purely B<internal>
+		 Perl functions
+
+=head1 DESCRIPTION
+X<internal Perl functions> X<interpreter functions>
+
+This file is the autogenerated documentation of functions in the
+Perl interpreter that are documented using Perl's internal documentation
+format but are not marked as part of the Perl API. In other words,
+B<they are not for use in extensions>!
+
+
+=head1 CV reference counts and CvOUTSIDE
+
+=over 8
+
+=item CvWEAKOUTSIDE
+X<CvWEAKOUTSIDE>
+
+Each CV has a pointer, C<CvOUTSIDE()>, to its lexically enclosing
+CV (if any). Because pointers to anonymous sub prototypes are
+stored in C<&> pad slots, it is a possible to get a circular reference,
+with the parent pointing to the child and vice-versa. To avoid the
+ensuing memory leak, we do not increment the reference count of the CV
+pointed to by C<CvOUTSIDE> in the I<one specific instance> that the parent
+has a C<&> pad slot pointing back to us. In this case, we set the
+C<CvWEAKOUTSIDE> flag in the child. This allows us to determine under what
+circumstances we should decrement the refcount of the parent when freeing
+the child.
+
+There is a further complication with non-closure anonymous subs (i.e. those
+that do not refer to any lexicals outside that sub). In this case, the
+anonymous prototype is shared rather than being cloned. This has the
+consequence that the parent may be freed while there are still active
+children, eg
+
+    BEGIN { $a = sub { eval '$x' } }
+
+In this case, the BEGIN is freed immediately after execution since there
+are no active references to it: the anon sub prototype has
+C<CvWEAKOUTSIDE> set since it's not a closure, and $a points to the same
+CV, so it doesn't contribute to BEGIN's refcount either.  When $a is
+executed, the C<eval '$x'> causes the chain of C<CvOUTSIDE>s to be followed,
+and the freed BEGIN is accessed.
+
+To avoid this, whenever a CV and its associated pad is freed, any
+C<&> entries in the pad are explicitly removed from the pad, and if the
+refcount of the pointed-to anon sub is still positive, then that
+child's C<CvOUTSIDE> is set to point to its grandparent. This will only
+occur in the single specific case of a non-closure anon prototype
+having one or more active references (such as C<$a> above).
+
+One other thing to consider is that a CV may be merely undefined
+rather than freed, eg C<undef &foo>. In this case, its refcount may
+not have reached zero, but we still delete its pad and its C<CvROOT> etc.
+Since various children may still have their C<CvOUTSIDE> pointing at this
+undefined CV, we keep its own C<CvOUTSIDE> for the time being, so that
+the chain of lexical scopes is unbroken. For example, the following
+should print 123:
+
+    my $x = 123;
+    sub tmp { sub { eval '$x' } }
+    my $a = tmp();
+    undef &tmp;
+    print  $a->();
+
+	bool	CvWEAKOUTSIDE(CV *cv)
+
+=for hackers
+Found in file cv.h
+
+
+=back
+
+=head1 Functions in file pad.h
+
+
+=over 8
+
+=item CX_CURPAD_SAVE
+X<CX_CURPAD_SAVE>
+
+Save the current pad in the given context block structure.
+
+	void	CX_CURPAD_SAVE(struct context)
+
+=for hackers
+Found in file pad.h
+
+=item CX_CURPAD_SV
+X<CX_CURPAD_SV>
+
+Access the SV at offset po in the saved current pad in the given
+context block structure (can be used as an lvalue).
+
+	SV *	CX_CURPAD_SV(struct context, PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_BASE_SV
+X<PAD_BASE_SV>
+
+Get the value from slot C<po> in the base (DEPTH=1) pad of a padlist
+
+	SV *	PAD_BASE_SV(PADLIST padlist, PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_CLONE_VARS
+X<PAD_CLONE_VARS>
+
+|CLONE_PARAMS* param
+Clone the state variables associated with running and compiling pads.
+
+	void	PAD_CLONE_VARS(PerlInterpreter *proto_perl \)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_FLAGS
+X<PAD_COMPNAME_FLAGS>
+
+Return the flags for the current compiling pad name
+at offset C<po>. Assumes a valid slot entry.
+
+	U32	PAD_COMPNAME_FLAGS(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_GEN
+X<PAD_COMPNAME_GEN>
+
+The generation number of the name at offset C<po> in the current
+compiling pad (lvalue). Note that C<SvCUR> is hijacked for this purpose.
+
+	STRLEN	PAD_COMPNAME_GEN(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_GEN_set
+X<PAD_COMPNAME_GEN_set>
+
+Sets the generation number of the name at offset C<po> in the current
+ling pad (lvalue) to C<gen>.  Note that C<SvCUR_set> is hijacked for this purpose.
+
+	STRLEN	PAD_COMPNAME_GEN_set(PADOFFSET po, int gen)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_OURSTASH
+X<PAD_COMPNAME_OURSTASH>
+
+Return the stash associated with an C<our> variable.
+Assumes the slot entry is a valid C<our> lexical.
+
+	HV *	PAD_COMPNAME_OURSTASH(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_PV
+X<PAD_COMPNAME_PV>
+
+Return the name of the current compiling pad name
+at offset C<po>. Assumes a valid slot entry.
+
+	char *	PAD_COMPNAME_PV(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_COMPNAME_TYPE
+X<PAD_COMPNAME_TYPE>
+
+Return the type (stash) of the current compiling pad name at offset
+C<po>. Must be a valid name. Returns null if not typed.
+
+	HV *	PAD_COMPNAME_TYPE(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_DUP
+X<PAD_DUP>
+
+Clone a padlist.
+
+	void	PAD_DUP(PADLIST dstpad, PADLIST srcpad, CLONE_PARAMS* param)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_RESTORE_LOCAL
+X<PAD_RESTORE_LOCAL>
+
+Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL()
+
+	void	PAD_RESTORE_LOCAL(PAD *opad)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SAVE_LOCAL
+X<PAD_SAVE_LOCAL>
+
+Save the current pad to the local variable opad, then make the
+current pad equal to npad
+
+	void	PAD_SAVE_LOCAL(PAD *opad, PAD *npad)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SAVE_SETNULLPAD
+X<PAD_SAVE_SETNULLPAD>
+
+Save the current pad then set it to null.
+
+	void	PAD_SAVE_SETNULLPAD()
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SETSV
+X<PAD_SETSV>
+
+Set the slot at offset C<po> in the current pad to C<sv>
+
+	SV *	PAD_SETSV(PADOFFSET po, SV* sv)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SET_CUR
+X<PAD_SET_CUR>
+
+Set the current pad to be pad C<n> in the padlist, saving
+the previous current pad. NB currently this macro expands to a string too
+long for some compilers, so it's best to replace it with
+
+    SAVECOMPPAD();
+    PAD_SET_CUR_NOSAVE(padlist,n);
+
+
+	void	PAD_SET_CUR(PADLIST padlist, I32 n)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SET_CUR_NOSAVE
+X<PAD_SET_CUR_NOSAVE>
+
+like PAD_SET_CUR, but without the save
+
+	void	PAD_SET_CUR_NOSAVE(PADLIST padlist, I32 n)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SV
+X<PAD_SV>
+
+Get the value at offset C<po> in the current pad
+
+	void	PAD_SV(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item PAD_SVl
+X<PAD_SVl>
+
+Lightweight and lvalue version of C<PAD_SV>.
+Get or set the value at offset C<po> in the current pad.
+Unlike C<PAD_SV>, does not print diagnostics with -DX.
+For internal use only.
+
+	SV *	PAD_SVl(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+=item SAVECLEARSV
+X<SAVECLEARSV>
+
+Clear the pointed to pad value on scope exit. (i.e. the runtime action of 'my')
+
+	void	SAVECLEARSV(SV **svp)
+
+=for hackers
+Found in file pad.h
+
+=item SAVECOMPPAD
+X<SAVECOMPPAD>
+
+save PL_comppad and PL_curpad
+
+
+
+
+
+	void	SAVECOMPPAD()
+
+=for hackers
+Found in file pad.h
+
+=item SAVEPADSV
+X<SAVEPADSV>
+
+Save a pad slot (used to restore after an iteration)
+
+XXX DAPM it would make more sense to make the arg a PADOFFSET
+	void	SAVEPADSV(PADOFFSET po)
+
+=for hackers
+Found in file pad.h
+
+
+=back
+
+=head1 Functions in file pp_ctl.c
+
+
+=over 8
+
+=item find_runcv
+X<find_runcv>
+
+Locate the CV corresponding to the currently executing sub or eval.
+If db_seqp is non_null, skip CVs that are in the DB package and populate
+*db_seqp with the cop sequence number at the point that the DB:: code was
+entered. (allows debuggers to eval in the scope of the breakpoint rather
+than in the scope of the debugger itself).
+
+	CV*	find_runcv(U32 *db_seqp)
+
+=for hackers
+Found in file pp_ctl.c
+
+
+=back
+
+=head1 Global Variables
+
+=over 8
+
+=item PL_DBsingle
+X<PL_DBsingle>
+
+When Perl is run in debugging mode, with the B<-d> switch, this SV is a
+boolean which indicates whether subs are being single-stepped.
+Single-stepping is automatically turned on after every step.  This is the C
+variable which corresponds to Perl's $DB::single variable.  See
+C<PL_DBsub>.
+
+	SV *	PL_DBsingle
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_DBsub
+X<PL_DBsub>
+
+When Perl is run in debugging mode, with the B<-d> switch, this GV contains
+the SV which holds the name of the sub being debugged.  This is the C
+variable which corresponds to Perl's $DB::sub variable.  See
+C<PL_DBsingle>.
+
+	GV *	PL_DBsub
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_DBtrace
+X<PL_DBtrace>
+
+Trace variable used when Perl is run in debugging mode, with the B<-d>
+switch.  This is the C variable which corresponds to Perl's $DB::trace
+variable.  See C<PL_DBsingle>.
+
+	SV *	PL_DBtrace
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_dowarn
+X<PL_dowarn>
+
+The C variable which corresponds to Perl's $^W warning variable.
+
+	bool	PL_dowarn
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_last_in_gv
+X<PL_last_in_gv>
+
+The GV which was last used for a filehandle input operation. (C<< <FH> >>)
+
+	GV*	PL_last_in_gv
+
+=for hackers
+Found in file thrdvar.h
+
+=item PL_ofs_sv
+X<PL_ofs_sv>
+
+The output field separator - C<$,> in Perl space.
+
+	SV*	PL_ofs_sv
+
+=for hackers
+Found in file thrdvar.h
+
+=item PL_rs
+X<PL_rs>
+
+The input record separator - C<$/> in Perl space.
+
+	SV*	PL_rs
+
+=for hackers
+Found in file thrdvar.h
+
+
+=back
+
+=head1 GV Functions
+
+=over 8
+
+=item is_gv_magical
+X<is_gv_magical>
+
+Returns C<TRUE> if given the name of a magical GV.
+
+Currently only useful internally when determining if a GV should be
+created even in rvalue contexts.
+
+C<flags> is not used at present but available for future extension to
+allow selecting particular classes of magical variable.
+
+Currently assumes that C<name> is NUL terminated (as well as len being valid).
+This assumption is met by all callers within the perl core, which all pass
+pointers returned by SvPV.
+
+	bool	is_gv_magical(char *name, STRLEN len, U32 flags)
+
+=for hackers
+Found in file gv.c
+
+
+=back
+
+=head1 IO Functions
+
+=over 8
+
+=item start_glob
+X<start_glob>
+
+Function called by C<do_readline> to spawn a glob (or do the glob inside
+perl on VMS). This code used to be inline, but now perl uses C<File::Glob>
+this glob starter is only used by miniperl during the build process.
+Moving it away shrinks pp_hot.c; shrinking pp_hot.c helps speed perl up.
+
+	PerlIO*	start_glob(SV* pattern, IO *io)
+
+=for hackers
+Found in file doio.c
+
+
+=back
+
+=head1 Pad Data Structures
+
+=over 8
+
+=item CvPADLIST
+X<CvPADLIST>
+
+CV's can have CvPADLIST(cv) set to point to an AV.
+
+For these purposes "forms" are a kind-of CV, eval""s are too (except they're
+not callable at will and are always thrown away after the eval"" is done
+executing).
+
+XSUBs don't have CvPADLIST set - dXSTARG fetches values from PL_curpad,
+but that is really the callers pad (a slot of which is allocated by
+every entersub).
+
+The CvPADLIST AV has does not have AvREAL set, so REFCNT of component items
+is managed "manual" (mostly in pad.c) rather than normal av.c rules.
+The items in the AV are not SVs as for a normal AV, but other AVs:
+
+0'th Entry of the CvPADLIST is an AV which represents the "names" or rather
+the "static type information" for lexicals.
+
+The CvDEPTH'th entry of CvPADLIST AV is an AV which is the stack frame at that
+depth of recursion into the CV.
+The 0'th slot of a frame AV is an AV which is @_.
+other entries are storage for variables and op targets.
+
+During compilation:
+C<PL_comppad_name> is set to the names AV.
+C<PL_comppad> is set to the frame AV for the frame CvDEPTH == 1.
+C<PL_curpad> is set to the body of the frame AV (i.e. AvARRAY(PL_comppad)).
+
+During execution, C<PL_comppad> and C<PL_curpad> refer to the live
+frame of the currently executing sub.
+
+Iterating over the names AV iterates over all possible pad
+items. Pad slots that are SVs_PADTMP (targets/GVs/constants) end up having
+&PL_sv_undef "names" (see pad_alloc()).
+
+Only my/our variable (SVs_PADMY/SVs_PADOUR) slots get valid names.
+The rest are op targets/GVs/constants which are statically allocated
+or resolved at compile time.  These don't have names by which they
+can be looked up from Perl code at run time through eval"" like
+my/our variables can be.  Since they can't be looked up by "name"
+but only by their index allocated at compile time (which is usually
+in PL_op->op_targ), wasting a name SV for them doesn't make sense.
+
+The SVs in the names AV have their PV being the name of the variable.
+NV+1..IV inclusive is a range of cop_seq numbers for which the name is
+valid.  For typed lexicals name SV is SVt_PVMG and SvSTASH points at the
+type.  For C<our> lexicals, the type is SVt_PVGV, and GvSTASH points at the
+stash of the associated global (so that duplicate C<our> declarations in the
+same package can be detected).  SvCUR is sometimes hijacked to
+store the generation number during compilation.
+
+If SvFAKE is set on the name SV then slot in the frame AVs are
+a REFCNT'ed references to a lexical from "outside". In this case,
+the name SV does not have a cop_seq range, since it is in scope
+throughout.
+
+If the 'name' is '&' the corresponding entry in frame AV
+is a CV representing a possible closure.
+(SvFAKE and name of '&' is not a meaningful combination currently but could
+become so if C<my sub foo {}> is implemented.)
+
+The flag SVf_PADSTALE is cleared on lexicals each time the my() is executed,
+and set on scope exit. This allows the 'Variable $x is not available' warning
+to be generated in evals, such as 
+
+    { my $x = 1; sub f { eval '$x'} } f();
+
+	AV *	CvPADLIST(CV *cv)
+
+=for hackers
+Found in file pad.c
+
+=item cv_clone
+X<cv_clone>
+
+Clone a CV: make a new CV which points to the same code etc, but which
+has a newly-created pad built by copying the prototype pad and capturing
+any outer lexicals.
+
+	CV*	cv_clone(CV* proto)
+
+=for hackers
+Found in file pad.c
+
+=item cv_dump
+X<cv_dump>
+
+dump the contents of a CV
+
+	void	cv_dump(const CV *cv, const char *title)
+
+=for hackers
+Found in file pad.c
+
+=item do_dump_pad
+X<do_dump_pad>
+
+Dump the contents of a padlist
+
+	void	do_dump_pad(I32 level, PerlIO *file, PADLIST *padlist, int full)
+
+=for hackers
+Found in file pad.c
+
+=item intro_my
+X<intro_my>
+
+"Introduce" my variables to visible status.
+
+	U32	intro_my()
+
+=for hackers
+Found in file pad.c
+
+=item pad_add_anon
+X<pad_add_anon>
+
+Add an anon code entry to the current compiling pad
+
+	PADOFFSET	pad_add_anon(SV* sv, OPCODE op_type)
+
+=for hackers
+Found in file pad.c
+
+=item pad_add_name
+X<pad_add_name>
+
+Create a new name in the current pad at the specified offset.
+If C<typestash> is valid, the name is for a typed lexical; set the
+name's stash to that value.
+If C<ourstash> is valid, it's an our lexical, set the name's
+GvSTASH to that value
+
+Also, if the name is @.. or %.., create a new array or hash for that slot
+
+If fake, it means we're cloning an existing entry
+
+	PADOFFSET	pad_add_name(char *name, HV* typestash, HV* ourstash, bool clone)
+
+=for hackers
+Found in file pad.c
+
+=item pad_alloc
+X<pad_alloc>
+
+Allocate a new my or tmp pad entry. For a my, simply push a null SV onto
+the end of PL_comppad, but for a tmp, scan the pad from PL_padix upwards
+for a slot which has no name and no active value.
+
+	PADOFFSET	pad_alloc(I32 optype, U32 tmptype)
+
+=for hackers
+Found in file pad.c
+
+=item pad_block_start
+X<pad_block_start>
+
+Update the pad compilation state variables on entry to a new block
+
+	void	pad_block_start(int full)
+
+=for hackers
+Found in file pad.c
+
+=item pad_check_dup
+X<pad_check_dup>
+
+Check for duplicate declarations: report any of:
+     * a my in the current scope with the same name;
+     * an our (anywhere in the pad) with the same name and the same stash
+       as C<ourstash>
+C<is_our> indicates that the name to check is an 'our' declaration
+
+	void	pad_check_dup(char* name, bool is_our, HV* ourstash)
+
+=for hackers
+Found in file pad.c
+
+=item pad_findlex
+X<pad_findlex>
+
+Find a named lexical anywhere in a chain of nested pads. Add fake entries
+in the inner pads if it's found in an outer one. innercv is the CV *inside*
+the chain of outer CVs to be searched. If newoff is non-null, this is a
+run-time cloning: don't add fake entries, just find the lexical and add a
+ref to it at newoff in the current pad.
+
+	PADOFFSET	pad_findlex(const char* name, PADOFFSET newoff, const CV* innercv)
+
+=for hackers
+Found in file pad.c
+
+=item pad_findmy
+X<pad_findmy>
+
+Given a lexical name, try to find its offset, first in the current pad,
+or failing that, in the pads of any lexically enclosing subs (including
+the complications introduced by eval). If the name is found in an outer pad,
+then a fake entry is added to the current pad.
+Returns the offset in the current pad, or NOT_IN_PAD on failure.
+
+	PADOFFSET	pad_findmy(char* name)
+
+=for hackers
+Found in file pad.c
+
+=item pad_fixup_inner_anons
+X<pad_fixup_inner_anons>
+
+For any anon CVs in the pad, change CvOUTSIDE of that CV from
+old_cv to new_cv if necessary. Needed when a newly-compiled CV has to be
+moved to a pre-existing CV struct.
+
+	void	pad_fixup_inner_anons(PADLIST *padlist, CV *old_cv, CV *new_cv)
+
+=for hackers
+Found in file pad.c
+
+=item pad_free
+X<pad_free>
+
+Free the SV at offset po in the current pad.
+
+	void	pad_free(PADOFFSET po)
+
+=for hackers
+Found in file pad.c
+
+=item pad_leavemy
+X<pad_leavemy>
+
+Cleanup at end of scope during compilation: set the max seq number for
+lexicals in this scope and warn of any lexicals that never got introduced.
+
+	void	pad_leavemy()
+
+=for hackers
+Found in file pad.c
+
+=item pad_new
+X<pad_new>
+
+Create a new compiling padlist, saving and updating the various global
+vars at the same time as creating the pad itself. The following flags
+can be OR'ed together:
+
+    padnew_CLONE	this pad is for a cloned CV
+    padnew_SAVE		save old globals
+    padnew_SAVESUB	also save extra stuff for start of sub
+
+	PADLIST*	pad_new(int flags)
+
+=for hackers
+Found in file pad.c
+
+=item pad_push
+X<pad_push>
+
+Push a new pad frame onto the padlist, unless there's already a pad at
+this depth, in which case don't bother creating a new one.
+If has_args is true, give the new pad an @_ in slot zero.
+
+	void	pad_push(PADLIST *padlist, int depth, int has_args)
+
+=for hackers
+Found in file pad.c
+
+=item pad_reset
+X<pad_reset>
+
+Mark all the current temporaries for reuse
+
+	void	pad_reset()
+
+=for hackers
+Found in file pad.c
+
+=item pad_setsv
+X<pad_setsv>
+
+Set the entry at offset po in the current pad to sv.
+Use the macro PAD_SETSV() rather than calling this function directly.
+
+	void	pad_setsv(PADOFFSET po, SV* sv)
+
+=for hackers
+Found in file pad.c
+
+=item pad_swipe
+X<pad_swipe>
+
+Abandon the tmp in the current pad at offset po and replace with a
+new one.
+
+	void	pad_swipe(PADOFFSET po, bool refadjust)
+
+=for hackers
+Found in file pad.c
+
+=item pad_tidy
+X<pad_tidy>
+
+Tidy up a pad after we've finished compiling it:
+    * remove most stuff from the pads of anonsub prototypes;
+    * give it a @_;
+    * mark tmps as such.
+
+	void	pad_tidy(padtidy_type type)
+
+=for hackers
+Found in file pad.c
+
+=item pad_undef
+X<pad_undef>
+
+Free the padlist associated with a CV.
+If parts of it happen to be current, we null the relevant
+PL_*pad* global vars so that we don't have any dangling references left.
+We also repoint the CvOUTSIDE of any about-to-be-orphaned
+inner subs to the outer of this cv.
+
+(This function should really be called pad_free, but the name was already
+taken)
+
+	void	pad_undef(CV* cv)
+
+=for hackers
+Found in file pad.c
+
+
+=back
+
+=head1 Stack Manipulation Macros
+
+=over 8
+
+=item djSP
+X<djSP>
+
+Declare Just C<SP>. This is actually identical to C<dSP>, and declares
+a local copy of perl's stack pointer, available via the C<SP> macro.
+See C<SP>.  (Available for backward source code compatibility with the
+old (Perl 5.005) thread model.)
+
+		djSP;
+
+=for hackers
+Found in file pp.h
+
+=item LVRET
+X<LVRET>
+
+True if this op will be the return value of an lvalue subroutine
+
+=for hackers
+Found in file pp.h
+
+
+=back
+
+=head1 SV Manipulation Functions
+
+=over 8
+
+=item report_uninit
+X<report_uninit>
+
+Print appropriate "Use of uninitialized variable" warning
+
+	void	report_uninit()
+
+=for hackers
+Found in file sv.c
+
+=item sv_add_arena
+X<sv_add_arena>
+
+Given a chunk of memory, link it to the head of the list of arenas,
+and split it into a list of free SVs.
+
+	void	sv_add_arena(char* ptr, U32 size, U32 flags)
+
+=for hackers
+Found in file sv.c
+
+=item sv_clean_all
+X<sv_clean_all>
+
+Decrement the refcnt of each remaining SV, possibly triggering a
+cleanup. This function may have to be called multiple times to free
+SVs which are in complex self-referential hierarchies.
+
+	I32	sv_clean_all()
+
+=for hackers
+Found in file sv.c
+
+=item sv_clean_objs
+X<sv_clean_objs>
+
+Attempt to destroy all objects not yet freed
+
+	void	sv_clean_objs()
+
+=for hackers
+Found in file sv.c
+
+=item sv_free_arenas
+X<sv_free_arenas>
+
+Deallocate the memory used by all arenas. Note that all the individual SV
+heads and bodies within the arenas must already have been freed.
+
+	void	sv_free_arenas()
+
+=for hackers
+Found in file sv.c
+
+
+=back
+
+=head1 AUTHORS
+
+The autodocumentation system was originally added to the Perl core by
+Benjamin Stuhl. Documentation is by whoever was kind enough to
+document their functions.
+
+=head1 SEE ALSO
+
+perlguts(1), perlapi(1)
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlintro.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlintro.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlintro.pod	(revision 14489)
@@ -0,0 +1,645 @@
+=head1 NAME
+
+perlintro -- a brief introduction and overview of Perl
+
+=head1 DESCRIPTION
+
+This document is intended to give you a quick overview of the Perl
+programming language, along with pointers to further documentation.  It
+is intended as a "bootstrap" guide for those who are new to the
+language, and provides just enough information for you to be able to
+read other peoples' Perl and understand roughly what it's doing, or
+write your own simple scripts.
+
+This introductory document does not aim to be complete.  It does not
+even aim to be entirely accurate.  In some cases perfection has been
+sacrificed in the goal of getting the general idea across.  You are
+I<strongly> advised to follow this introduction with more information
+from the full Perl manual, the table of contents to which can be found
+in L<perltoc>.
+
+Throughout this document you'll see references to other parts of the 
+Perl documentation.  You can read that documentation using the C<perldoc>
+command or whatever method you're using to read this document.
+
+=head2 What is Perl?
+
+Perl is a general-purpose programming language originally developed for 
+text manipulation and now used for a wide range of tasks including 
+system administration, web development, network programming, GUI 
+development, and more.
+
+The language is intended to be practical (easy to use, efficient,
+complete) rather than beautiful (tiny, elegant, minimal).  Its major
+features are that it's easy to use, supports both procedural and
+object-oriented (OO) programming, has powerful built-in support for text
+processing, and has one of the world's most impressive collections of
+third-party modules.
+
+Different definitions of Perl are given in L<perl>, L<perlfaq1> and 
+no doubt other places.  From this we can determine that Perl is different 
+things to different people, but that lots of people think it's at least
+worth writing about.
+
+=head2 Running Perl programs
+
+To run a Perl program from the Unix command line:
+
+    perl progname.pl
+
+Alternatively, put this as the first line of your script:
+
+    #!/usr/bin/env perl
+
+... and run the script as C</path/to/script.pl>.  Of course, it'll need
+to be executable first, so C<chmod 755 script.pl> (under Unix).
+
+For more information, including instructions for other platforms such as
+Windows and Mac OS, read L<perlrun>.
+
+=head2 Basic syntax overview
+
+A Perl script or program consists of one or more statements.  These
+statements are simply written in the script in a straightforward
+fashion.  There is no need to have a C<main()> function or anything of
+that kind.
+
+Perl statements end in a semi-colon:
+
+    print "Hello, world";
+
+Comments start with a hash symbol and run to the end of the line
+
+    # This is a comment
+
+Whitespace is irrelevant:
+
+    print 
+        "Hello, world"
+        ;
+
+... except inside quoted strings:
+
+    # this would print with a linebreak in the middle
+    print "Hello
+    world";
+
+Double quotes or single quotes may be used around literal strings:
+
+    print "Hello, world";
+    print 'Hello, world';
+
+However, only double quotes "interpolate" variables and special
+characters such as newlines (C<\n>):
+
+    print "Hello, $name\n";     # works fine
+    print 'Hello, $name\n';     # prints $name\n literally
+
+Numbers don't need quotes around them:
+
+    print 42;
+
+You can use parentheses for functions' arguments or omit them
+according to your personal taste.  They are only required 
+occasionally to clarify issues of precedence.
+
+    print("Hello, world\n");
+    print "Hello, world\n";
+
+More detailed information about Perl syntax can be found in L<perlsyn>.
+
+=head2 Perl variable types
+
+Perl has three main variable types: scalars, arrays, and hashes.
+
+=over 4
+
+=item Scalars
+
+A scalar represents a single value:
+
+    my $animal = "camel";
+    my $answer = 42;
+
+Scalar values can be strings, integers or floating point numbers, and Perl 
+will automatically convert between them as required.  There is no need 
+to pre-declare your variable types.
+
+Scalar values can be used in various ways:
+
+    print $animal;
+    print "The animal is $animal\n";
+    print "The square of $answer is ", $answer * $answer, "\n";
+
+There are a number of "magic" scalars with names that look like
+punctuation or line noise.  These special variables are used for all
+kinds of purposes, and are documented in L<perlvar>.  The only one you
+need to know about for now is C<$_> which is the "default variable".
+It's used as the default argument to a number of functions in Perl, and
+it's set implicitly by certain looping constructs.  
+
+    print;          # prints contents of $_ by default
+
+=item Arrays
+
+An array represents a list of values:
+
+    my @animals = ("camel", "llama", "owl");
+    my @numbers = (23, 42, 69);
+    my @mixed   = ("camel", 42, 1.23);
+
+Arrays are zero-indexed.  Here's how you get at elements in an array:
+
+    print $animals[0];              # prints "camel"
+    print $animals[1];              # prints "llama"
+
+The special variable C<$#array> tells you the index of the last element 
+of an array:
+
+    print $mixed[$#mixed];       # last element, prints 1.23
+
+You might be tempted to use C<$#array + 1> to tell you how many items there 
+are in an array.  Don't bother.  As it happens, using C<@array> where Perl
+expects to find a scalar value ("in scalar context") will give you the number
+of elements in the array:
+
+    if (@animals < 5) { ... }
+
+The elements we're getting from the array start with a C<$> because 
+we're getting just a single value out of the array -- you ask for a scalar, 
+you get a scalar.
+
+To get multiple values from an array:
+
+    @animals[0,1];                  # gives ("camel", "llama");
+    @animals[0..2];                 # gives ("camel", "llama", "owl");
+    @animals[1..$#animals];         # gives all except the first element
+
+This is called an "array slice".
+
+You can do various useful things to lists:
+
+    my @sorted    = sort @animals;
+    my @backwards = reverse @numbers;
+
+There are a couple of special arrays too, such as C<@ARGV> (the command
+line arguments to your script) and C<@_> (the arguments passed to a
+subroutine).  These are documented in L<perlvar>.
+
+=item Hashes
+
+A hash represents a set of key/value pairs:
+
+    my %fruit_color = ("apple", "red", "banana", "yellow");
+
+You can use whitespace and the C<< => >> operator to lay them out more
+nicely:
+
+    my %fruit_color = (
+        apple  => "red",
+        banana => "yellow",
+    );
+
+To get at hash elements:
+
+    $fruit_color{"apple"};           # gives "red"
+
+You can get at lists of keys and values with C<keys()> and
+C<values()>.
+
+    my @fruits = keys %fruit_colors;
+    my @colors = values %fruit_colors;
+
+Hashes have no particular internal order, though you can sort the keys
+and loop through them.
+
+Just like special scalars and arrays, there are also special hashes.  
+The most well known of these is C<%ENV> which contains environment
+variables.  Read all about it (and other special variables) in
+L<perlvar>.
+
+=back
+
+Scalars, arrays and hashes are documented more fully in L<perldata>.
+
+More complex data types can be constructed using references, which allow
+you to build lists and hashes within lists and hashes.
+
+A reference is a scalar value and can refer to any other Perl data
+type. So by storing a reference as the value of an array or hash
+element, you can easily create lists and hashes within lists and    
+hashes. The following example shows a 2 level hash of hash
+structure using anonymous hash references.
+
+    my $variables = {
+        scalar  =>  { 
+                     description => "single item",
+                     sigil => '$',
+                    },
+        array   =>  {
+                     description => "ordered list of items",
+                     sigil => '@',
+                    },
+        hash    =>  {
+                     description => "key/value pairs",
+                     sigil => '%',
+                    },
+    };
+
+    print "Scalars begin with a $variables->{'scalar'}->{'sigil'}\n";
+
+Exhaustive information on the topic of references can be found in
+L<perlreftut>, L<perllol>, L<perlref> and L<perldsc>.
+
+=head2 Variable scoping
+
+Throughout the previous section all the examples have used the syntax:
+
+    my $var = "value";
+
+The C<my> is actually not required; you could just use:
+
+    $var = "value";
+
+However, the above usage will create global variables throughout your
+program, which is bad programming practice.  C<my> creates lexically
+scoped variables instead.  The variables are scoped to the block
+(i.e. a bunch of statements surrounded by curly-braces) in which they
+are defined.
+
+    my $a = "foo";
+    if ($some_condition) {
+        my $b = "bar";
+        print $a;           # prints "foo"
+        print $b;           # prints "bar"
+    }
+    print $a;               # prints "foo"
+    print $b;               # prints nothing; $b has fallen out of scope
+
+Using C<my> in combination with a C<use strict;> at the top of
+your Perl scripts means that the interpreter will pick up certain common 
+programming errors.  For instance, in the example above, the final
+C<print $b> would cause a compile-time error and prevent you from
+running the program.  Using C<strict> is highly recommended.
+
+=head2 Conditional and looping constructs
+
+Perl has most of the usual conditional and looping constructs except for
+case/switch (but if you really want it, there is a Switch module in Perl
+5.8 and newer, and on CPAN. See the section on modules, below, for more
+information about modules and CPAN).
+
+The conditions can be any Perl expression.  See the list of operators in
+the next section for information on comparison and boolean logic operators, 
+which are commonly used in conditional statements.
+
+=over 4
+
+=item if
+
+    if ( condition ) {
+        ...
+    } elsif ( other condition ) {
+        ...
+    } else {
+        ...
+    }
+
+There's also a negated version of it:
+
+    unless ( condition ) {
+        ...
+    }
+
+This is provided as a more readable version of C<if (!I<condition>)>.
+
+Note that the braces are required in Perl, even if you've only got one
+line in the block.  However, there is a clever way of making your one-line
+conditional blocks more English like:
+
+    # the traditional way
+    if ($zippy) {
+        print "Yow!";
+    }
+
+    # the Perlish post-condition way
+    print "Yow!" if $zippy;
+    print "We have no bananas" unless $bananas;
+
+=item while
+
+    while ( condition ) {
+        ...
+    }
+
+There's also a negated version, for the same reason we have C<unless>:
+
+    until ( condition ) {
+        ...
+    }
+
+You can also use C<while> in a post-condition:
+
+    print "LA LA LA\n" while 1;          # loops forever
+
+=item for
+
+Exactly like C:
+
+    for ($i=0; $i <= $max; $i++) {
+        ...
+    }
+
+The C style for loop is rarely needed in Perl since Perl provides
+the more friendly list scanning C<foreach> loop.
+
+=item foreach
+
+    foreach (@array) {
+        print "This element is $_\n";
+    }
+
+    # you don't have to use the default $_ either...
+    foreach my $key (keys %hash) {
+        print "The value of $key is $hash{$key}\n";
+    }
+
+=back
+
+For more detail on looping constructs (and some that weren't mentioned in
+this overview) see L<perlsyn>.
+
+=head2 Builtin operators and functions
+
+Perl comes with a wide selection of builtin functions.  Some of the ones
+we've already seen include C<print>, C<sort> and C<reverse>.  A list of
+them is given at the start of L<perlfunc> and you can easily read 
+about any given function by using C<perldoc -f I<functionname>>.
+
+Perl operators are documented in full in L<perlop>, but here are a few
+of the most common ones:
+
+=over 4
+
+=item Arithmetic
+
+    +   addition
+    -   subtraction
+    *   multiplication
+    /   division
+
+=item Numeric comparison
+
+    ==  equality
+    !=  inequality
+    <   less than
+    >   greater than
+    <=  less than or equal
+    >=  greater than or equal
+
+=item String comparison
+
+    eq  equality
+    ne  inequality
+    lt  less than
+    gt  greater than
+    le  less than or equal
+    ge  greater than or equal
+
+(Why do we have separate numeric and string comparisons?  Because we don't 
+have special variable types, and Perl needs to know whether to sort 
+numerically (where 99 is less than 100) or alphabetically (where 100 comes
+before 99).
+
+=item Boolean logic
+
+    &&  and
+    ||  or
+    !   not
+
+(C<and>, C<or> and C<not> aren't just in the above table as descriptions 
+of the operators -- they're also supported as operators in their own
+right.  They're more readable than the C-style operators, but have 
+different precedence to C<&&> and friends.  Check L<perlop> for more 
+detail.)
+
+=item Miscellaneous
+
+    =   assignment
+    .   string concatenation
+    x   string multiplication
+    ..  range operator (creates a list of numbers)
+
+=back
+
+Many operators can be combined with a C<=> as follows:
+
+    $a += 1;        # same as $a = $a + 1
+    $a -= 1;        # same as $a = $a - 1
+    $a .= "\n";     # same as $a = $a . "\n";
+
+=head2 Files and I/O
+
+You can open a file for input or output using the C<open()> function.
+It's documented in extravagant detail in L<perlfunc> and L<perlopentut>, 
+but in short:
+
+    open(INFILE,  "input.txt")   or die "Can't open input.txt: $!";
+    open(OUTFILE, ">output.txt") or die "Can't open output.txt: $!";
+    open(LOGFILE, ">>my.log")    or die "Can't open logfile: $!";
+
+You can read from an open filehandle using the C<< <> >> operator.  In
+scalar context it reads a single line from the filehandle, and in list
+context it reads the whole file in, assigning each line to an element of
+the list:
+
+    my $line  = <INFILE>;
+    my @lines = <INFILE>;
+
+Reading in the whole file at one time is called slurping. It can
+be useful but it may be a memory hog. Most text file processing
+can be done a line at a time with Perl's looping constructs.
+
+The C<< <> >> operator is most often seen in a C<while> loop:
+
+    while (<INFILE>) {     # assigns each line in turn to $_ 
+        print "Just read in this line: $_";
+    }
+
+We've already seen how to print to standard output using C<print()>.
+However, C<print()> can also take an optional first argument specifying
+which filehandle to print to:
+
+    print STDERR "This is your final warning.\n";
+    print OUTFILE $record;
+    print LOGFILE $logmessage;
+
+When you're done with your filehandles, you should C<close()> them
+(though to be honest, Perl will clean up after you if you forget):
+
+    close INFILE;
+
+=head2 Regular expressions
+
+Perl's regular expression support is both broad and deep, and is the
+subject of lengthy documentation in L<perlrequick>, L<perlretut>, and
+elsewhere.  However, in short:
+
+=over 4
+
+=item Simple matching
+
+    if (/foo/)       { ... }  # true if $_ contains "foo"
+    if ($a =~ /foo/) { ... }  # true if $a contains "foo"
+
+The C<//> matching operator is documented in L<perlop>.  It operates on
+C<$_> by default, or can be bound to another variable using the C<=~>
+binding operator (also documented in L<perlop>).
+
+=item Simple substitution
+
+    s/foo/bar/;               # replaces foo with bar in $_
+    $a =~ s/foo/bar/;         # replaces foo with bar in $a
+    $a =~ s/foo/bar/g;        # replaces ALL INSTANCES of foo with bar in $a
+
+The C<s///> substitution operator is documented in L<perlop>.
+
+=item More complex regular expressions
+
+You don't just have to match on fixed strings.  In fact, you can match
+on just about anything you could dream of by using more complex regular
+expressions.  These are documented at great length in L<perlre>, but for
+the meantime, here's a quick cheat sheet:
+
+    .                   a single character
+    \s                  a whitespace character (space, tab, newline)
+    \S                  non-whitespace character
+    \d                  a digit (0-9)
+    \D                  a non-digit
+    \w                  a word character (a-z, A-Z, 0-9, _)
+    \W                  a non-word character
+    [aeiou]             matches a single character in the given set
+    [^aeiou]            matches a single character outside the given set
+    (foo|bar|baz)       matches any of the alternatives specified
+
+    ^                   start of string
+    $                   end of string
+
+Quantifiers can be used to specify how many of the previous thing you 
+want to match on, where "thing" means either a literal character, one 
+of the metacharacters listed above, or a group of characters or 
+metacharacters in parentheses.
+
+    *                   zero or more of the previous thing
+    +                   one or more of the previous thing
+    ?                   zero or one of the previous thing
+    {3}                 matches exactly 3 of the previous thing
+    {3,6}               matches between 3 and 6 of the previous thing
+    {3,}                matches 3 or more of the previous thing
+
+Some brief examples:
+
+    /^\d+/              string starts with one or more digits
+    /^$/                nothing in the string (start and end are adjacent)
+    /(\d\s){3}/         a three digits, each followed by a whitespace 
+                        character (eg "3 4 5 ")
+    /(a.)+/             matches a string in which every odd-numbered letter 
+                        is a (eg "abacadaf")
+
+    # This loop reads from STDIN, and prints non-blank lines:
+    while (<>) {
+        next if /^$/;
+        print;
+    }
+
+=item Parentheses for capturing
+
+As well as grouping, parentheses serve a second purpose.  They can be 
+used to capture the results of parts of the regexp match for later use.
+The results end up in C<$1>, C<$2> and so on.
+
+    # a cheap and nasty way to break an email address up into parts
+
+    if ($email =~ /([^@]+)@(.+)/) {
+        print "Username is $1\n";
+        print "Hostname is $2\n";
+    }
+
+=item Other regexp features
+
+Perl regexps also support backreferences, lookaheads, and all kinds of
+other complex details.  Read all about them in L<perlrequick>,
+L<perlretut>, and L<perlre>.
+
+=back
+
+=head2 Writing subroutines
+
+Writing subroutines is easy:
+
+    sub log {
+        my $logmessage = shift;
+        print LOGFILE $logmessage;
+    }
+
+What's that C<shift>?  Well, the arguments to a subroutine are available
+to us as a special array called C<@_> (see L<perlvar> for more on that).
+The default argument to the C<shift> function just happens to be C<@_>.
+So C<my $logmessage = shift;> shifts the first item off the list of
+arguments and assigns it to C<$logmessage>. 
+
+We can manipulate C<@_> in other ways too:
+
+    my ($logmessage, $priority) = @_;       # common
+    my $logmessage = $_[0];                 # uncommon, and ugly
+
+Subroutines can also return values:
+
+    sub square {
+        my $num = shift;
+        my $result = $num * $num;
+        return $result;
+    }
+
+For more information on writing subroutines, see L<perlsub>.
+
+=head2 OO Perl
+
+OO Perl is relatively simple and is implemented using references which
+know what sort of object they are based on Perl's concept of packages.
+However, OO Perl is largely beyond the scope of this document.  
+Read L<perlboot>, L<perltoot>, L<perltooc> and L<perlobj>.
+
+As a beginning Perl programmer, your most common use of OO Perl will be
+in using third-party modules, which are documented below.
+
+=head2 Using Perl modules
+
+Perl modules provide a range of features to help you avoid reinventing
+the wheel, and can be downloaded from CPAN ( http://www.cpan.org/ ).  A
+number of popular modules are included with the Perl distribution
+itself.
+
+Categories of modules range from text manipulation to network protocols
+to database integration to graphics.  A categorized list of modules is
+also available from CPAN.
+
+To learn how to install modules you download from CPAN, read
+L<perlmodinstall>
+
+To learn how to use a particular module, use C<perldoc I<Module::Name>>.
+Typically you will want to C<use I<Module::Name>>, which will then give
+you access to exported functions or an OO interface to the module.
+
+L<perlfaq> contains questions and answers related to many common
+tasks, and often provides suggestions for good CPAN modules to use.
+
+L<perlmod> describes Perl modules in general.  L<perlmodlib> lists the
+modules which came with your Perl installation.
+
+If you feel the urge to write Perl modules, L<perlnewmod> will give you
+good advice.
+
+=head1 AUTHOR
+
+Kirrily "Skud" Robert <skud@cpan.org>
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perliol.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perliol.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perliol.pod	(revision 14489)
@@ -0,0 +1,1039 @@
+=head1 NAME
+
+perliol - C API for Perl's implementation of IO in Layers.
+
+=head1 SYNOPSIS
+
+    /* Defining a layer ... */
+    #include <perliol.h>
+
+=head1 DESCRIPTION
+
+This document describes the behavior and implementation of the PerlIO
+abstraction described in L<perlapio> when C<USE_PERLIO> is defined (and
+C<USE_SFIO> is not).
+
+=head2 History and Background
+
+The PerlIO abstraction was introduced in perl5.003_02 but languished as
+just an abstraction until perl5.7.0. However during that time a number
+of perl extensions switched to using it, so the API is mostly fixed to
+maintain (source) compatibility.
+
+The aim of the implementation is to provide the PerlIO API in a flexible
+and platform neutral manner. It is also a trial of an "Object Oriented
+C, with vtables" approach which may be applied to perl6.
+
+=head2 Basic Structure
+
+PerlIO is a stack of layers.
+
+The low levels of the stack work with the low-level operating system
+calls (file descriptors in C) getting bytes in and out, the higher
+layers of the stack buffer, filter, and otherwise manipulate the I/O,
+and return characters (or bytes) to Perl.  Terms I<above> and I<below>
+are used to refer to the relative positioning of the stack layers.
+
+A layer contains a "vtable", the table of I/O operations (at C level
+a table of function pointers), and status flags.  The functions in the
+vtable implement operations like "open", "read", and "write".
+
+When I/O, for example "read", is requested, the request goes from Perl
+first down the stack using "read" functions of each layer, then at the
+bottom the input is requested from the operating system services, then
+the result is returned up the stack, finally being interpreted as Perl
+data.
+
+The requests do not necessarily go always all the way down to the
+operating system: that's where PerlIO buffering comes into play.
+
+When you do an open() and specify extra PerlIO layers to be deployed,
+the layers you specify are "pushed" on top of the already existing
+default stack.  One way to see it is that "operating system is
+on the left" and "Perl is on the right".
+
+What exact layers are in this default stack depends on a lot of
+things: your operating system, Perl version, Perl compile time
+configuration, and Perl runtime configuration.  See L<PerlIO>,
+L<perlrun/PERLIO>, and L<open> for more information.
+
+binmode() operates similarly to open(): by default the specified
+layers are pushed on top of the existing stack.
+
+However, note that even as the specified layers are "pushed on top"
+for open() and binmode(), this doesn't mean that the effects are
+limited to the "top": PerlIO layers can be very 'active' and inspect
+and affect layers also deeper in the stack.  As an example there
+is a layer called "raw" which repeatedly "pops" layers until
+it reaches the first layer that has declared itself capable of
+handling binary data.  The "pushed" layers are processed in left-to-right
+order.
+
+sysopen() operates (unsurprisingly) at a lower level in the stack than
+open().  For example in UNIX or UNIX-like systems sysopen() operates
+directly at the level of file descriptors: in the terms of PerlIO
+layers, it uses only the "unix" layer, which is a rather thin wrapper
+on top of the UNIX file descriptors.
+
+=head2 Layers vs Disciplines
+
+Initial discussion of the ability to modify IO streams behaviour used
+the term "discipline" for the entities which were added. This came (I
+believe) from the use of the term in "sfio", which in turn borrowed it
+from "line disciplines" on Unix terminals. However, this document (and
+the C code) uses the term "layer".
+
+This is, I hope, a natural term given the implementation, and should
+avoid connotations that are inherent in earlier uses of "discipline"
+for things which are rather different.
+
+=head2 Data Structures
+
+The basic data structure is a PerlIOl:
+
+	typedef struct _PerlIO PerlIOl;
+	typedef struct _PerlIO_funcs PerlIO_funcs;
+	typedef PerlIOl *PerlIO;
+
+	struct _PerlIO
+	{
+	 PerlIOl *	next;       /* Lower layer */
+	 PerlIO_funcs *	tab;        /* Functions for this layer */
+	 IV		flags;      /* Various flags for state */
+	};
+
+A C<PerlIOl *> is a pointer to the struct, and the I<application>
+level C<PerlIO *> is a pointer to a C<PerlIOl *> - i.e. a pointer
+to a pointer to the struct. This allows the application level C<PerlIO *>
+to remain constant while the actual C<PerlIOl *> underneath
+changes. (Compare perl's C<SV *> which remains constant while its
+C<sv_any> field changes as the scalar's type changes.) An IO stream is
+then in general represented as a pointer to this linked-list of
+"layers".
+
+It should be noted that because of the double indirection in a C<PerlIO *>,
+a C<< &(perlio->next) >> "is" a C<PerlIO *>, and so to some degree
+at least one layer can use the "standard" API on the next layer down.
+
+A "layer" is composed of two parts:
+
+=over 4
+
+=item 1.
+
+The functions and attributes of the "layer class".
+
+=item 2.
+
+The per-instance data for a particular handle.
+
+=back
+
+=head2 Functions and Attributes
+
+The functions and attributes are accessed via the "tab" (for table)
+member of C<PerlIOl>. The functions (methods of the layer "class") are
+fixed, and are defined by the C<PerlIO_funcs> type. They are broadly the
+same as the public C<PerlIO_xxxxx> functions:
+
+  struct _PerlIO_funcs
+  {
+   Size_t		fsize;
+   char *		name;
+   Size_t		size;
+   IV		kind;
+   IV		(*Pushed)(pTHX_ PerlIO *f,const char *mode,SV *arg, PerlIO_funcs *tab);
+   IV		(*Popped)(pTHX_ PerlIO *f);
+   PerlIO *	(*Open)(pTHX_ PerlIO_funcs *tab,
+  			AV *layers, IV n,
+  			const char *mode,
+  			int fd, int imode, int perm,
+  			PerlIO *old,
+  			int narg, SV **args);
+   IV		(*Binmode)(pTHX_ PerlIO *f);
+   SV *		(*Getarg)(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
+   IV		(*Fileno)(pTHX_ PerlIO *f);
+   PerlIO *     (*Dup)(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
+   /* Unix-like functions - cf sfio line disciplines */
+   SSize_t	(*Read)(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+   SSize_t	(*Unread)(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+   SSize_t	(*Write)(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+   IV		(*Seek)(pTHX_ PerlIO *f, Off_t offset, int whence);
+   Off_t	(*Tell)(pTHX_ PerlIO *f);
+   IV		(*Close)(pTHX_ PerlIO *f);
+   /* Stdio-like buffered IO functions */
+   IV		(*Flush)(pTHX_ PerlIO *f);
+   IV		(*Fill)(pTHX_ PerlIO *f);
+   IV		(*Eof)(pTHX_ PerlIO *f);
+   IV		(*Error)(pTHX_ PerlIO *f);
+   void		(*Clearerr)(pTHX_ PerlIO *f);
+   void		(*Setlinebuf)(pTHX_ PerlIO *f);
+   /* Perl's snooping functions */
+   STDCHAR *	(*Get_base)(pTHX_ PerlIO *f);
+   Size_t	(*Get_bufsiz)(pTHX_ PerlIO *f);
+   STDCHAR *	(*Get_ptr)(pTHX_ PerlIO *f);
+   SSize_t	(*Get_cnt)(pTHX_ PerlIO *f);
+   void		(*Set_ptrcnt)(pTHX_ PerlIO *f,STDCHAR *ptr,SSize_t cnt);
+  };
+
+The first few members of the struct give a function table size for
+compatibility check "name" for the layer, the  size to C<malloc> for the per-instance data,
+and some flags which are attributes of the class as whole (such as whether it is a buffering
+layer), then follow the functions which fall into four basic groups:
+
+=over 4
+
+=item 1.
+
+Opening and setup functions
+
+=item 2.
+
+Basic IO operations
+
+=item 3.
+
+Stdio class buffering options.
+
+=item 4.
+
+Functions to support Perl's traditional "fast" access to the buffer.
+
+=back
+
+A layer does not have to implement all the functions, but the whole
+table has to be present. Unimplemented slots can be NULL (which will
+result in an error when called) or can be filled in with stubs to
+"inherit" behaviour from a "base class". This "inheritance" is fixed
+for all instances of the layer, but as the layer chooses which stubs
+to populate the table, limited "multiple inheritance" is possible.
+
+=head2 Per-instance Data
+
+The per-instance data are held in memory beyond the basic PerlIOl
+struct, by making a PerlIOl the first member of the layer's struct
+thus:
+
+	typedef struct
+	{
+	 struct _PerlIO base;       /* Base "class" info */
+	 STDCHAR *	buf;        /* Start of buffer */
+	 STDCHAR *	end;        /* End of valid part of buffer */
+	 STDCHAR *	ptr;        /* Current position in buffer */
+	 Off_t		posn;       /* Offset of buf into the file */
+	 Size_t		bufsiz;     /* Real size of buffer */
+	 IV		oneword;    /* Emergency buffer */
+	} PerlIOBuf;
+
+In this way (as for perl's scalars) a pointer to a PerlIOBuf can be
+treated as a pointer to a PerlIOl.
+
+=head2 Layers in action.
+
+                table           perlio          unix
+            |           |
+            +-----------+    +----------+    +--------+
+   PerlIO ->|           |--->|  next    |--->|  NULL  |
+            +-----------+    +----------+    +--------+
+            |           |    |  buffer  |    |   fd   |
+            +-----------+    |          |    +--------+
+            |           |    +----------+
+
+
+The above attempts to show how the layer scheme works in a simple case.
+The application's C<PerlIO *> points to an entry in the table(s)
+representing open (allocated) handles. For example the first three slots
+in the table correspond to C<stdin>,C<stdout> and C<stderr>. The table
+in turn points to the current "top" layer for the handle - in this case
+an instance of the generic buffering layer "perlio". That layer in turn
+points to the next layer down - in this case the lowlevel "unix" layer.
+
+The above is roughly equivalent to a "stdio" buffered stream, but with
+much more flexibility:
+
+=over 4
+
+=item *
+
+If Unix level C<read>/C<write>/C<lseek> is not appropriate for (say)
+sockets then the "unix" layer can be replaced (at open time or even
+dynamically) with a "socket" layer.
+
+=item *
+
+Different handles can have different buffering schemes. The "top"
+layer could be the "mmap" layer if reading disk files was quicker
+using C<mmap> than C<read>. An "unbuffered" stream can be implemented
+simply by not having a buffer layer.
+
+=item *
+
+Extra layers can be inserted to process the data as it flows through.
+This was the driving need for including the scheme in perl 5.7.0+ - we
+needed a mechanism to allow data to be translated between perl's
+internal encoding (conceptually at least Unicode as UTF-8), and the
+"native" format used by the system. This is provided by the
+":encoding(xxxx)" layer which typically sits above the buffering layer.
+
+=item *
+
+A layer can be added that does "\n" to CRLF translation. This layer
+can be used on any platform, not just those that normally do such
+things.
+
+=back
+
+=head2 Per-instance flag bits
+
+The generic flag bits are a hybrid of C<O_XXXXX> style flags deduced
+from the mode string passed to C<PerlIO_open()>, and state bits for
+typical buffer layers.
+
+=over 4
+
+=item PERLIO_F_EOF
+
+End of file.
+
+=item PERLIO_F_CANWRITE
+
+Writes are permitted, i.e. opened as "w" or "r+" or "a", etc.
+
+=item  PERLIO_F_CANREAD
+
+Reads are permitted i.e. opened "r" or "w+" (or even "a+" - ick).
+
+=item PERLIO_F_ERROR
+
+An error has occurred (for C<PerlIO_error()>).
+
+=item PERLIO_F_TRUNCATE
+
+Truncate file suggested by open mode.
+
+=item PERLIO_F_APPEND
+
+All writes should be appends.
+
+=item PERLIO_F_CRLF
+
+Layer is performing Win32-like "\n" mapped to CR,LF for output and CR,LF
+mapped to "\n" for input. Normally the provided "crlf" layer is the only
+layer that need bother about this. C<PerlIO_binmode()> will mess with this
+flag rather than add/remove layers if the C<PERLIO_K_CANCRLF> bit is set
+for the layers class.
+
+=item PERLIO_F_UTF8
+
+Data written to this layer should be UTF-8 encoded; data provided
+by this layer should be considered UTF-8 encoded. Can be set on any layer
+by ":utf8" dummy layer. Also set on ":encoding" layer.
+
+=item PERLIO_F_UNBUF
+
+Layer is unbuffered - i.e. write to next layer down should occur for
+each write to this layer.
+
+=item PERLIO_F_WRBUF
+
+The buffer for this layer currently holds data written to it but not sent
+to next layer.
+
+=item PERLIO_F_RDBUF
+
+The buffer for this layer currently holds unconsumed data read from
+layer below.
+
+=item PERLIO_F_LINEBUF
+
+Layer is line buffered. Write data should be passed to next layer down
+whenever a "\n" is seen. Any data beyond the "\n" should then be
+processed.
+
+=item PERLIO_F_TEMP
+
+File has been C<unlink()>ed, or should be deleted on C<close()>.
+
+=item PERLIO_F_OPEN
+
+Handle is open.
+
+=item PERLIO_F_FASTGETS
+
+This instance of this layer supports the "fast C<gets>" interface.
+Normally set based on C<PERLIO_K_FASTGETS> for the class and by the
+existence of the function(s) in the table. However a class that
+normally provides that interface may need to avoid it on a
+particular instance. The "pending" layer needs to do this when
+it is pushed above a layer which does not support the interface.
+(Perl's C<sv_gets()> does not expect the streams fast C<gets> behaviour
+to change during one "get".)
+
+=back
+
+=head2 Methods in Detail
+
+=over 4
+
+=item fsize
+
+	Size_t fsize;
+
+Size of the function table. This is compared against the value PerlIO
+code "knows" as a compatibility check. Future versions I<may> be able
+to tolerate layers compiled against an old version of the headers.
+
+=item name
+
+	char * name;
+
+The name of the layer whose open() method Perl should invoke on
+open().  For example if the layer is called APR, you will call:
+
+  open $fh, ">:APR", ...
+
+and Perl knows that it has to invoke the PerlIOAPR_open() method
+implemented by the APR layer.
+
+=item size
+
+	Size_t size;
+
+The size of the per-instance data structure, e.g.:
+
+  sizeof(PerlIOAPR)
+
+If this field is zero then C<PerlIO_pushed> does not malloc anything
+and assumes layer's Pushed function will do any required layer stack
+manipulation - used to avoid malloc/free overhead for dummy layers.
+If the field is non-zero it must be at least the size of C<PerlIOl>,
+C<PerlIO_pushed> will allocate memory for the layer's data structures
+and link new layer onto the stream's stack. (If the layer's Pushed
+method returns an error indication the layer is popped again.)
+
+=item kind
+
+	IV kind;
+
+=over 4
+
+=item * PERLIO_K_BUFFERED
+
+The layer is buffered.
+
+=item * PERLIO_K_RAW
+
+The layer is acceptable to have in a binmode(FH) stack - i.e. it does not
+(or will configure itself not to) transform bytes passing through it.
+
+=item * PERLIO_K_CANCRLF
+
+Layer can translate between "\n" and CRLF line ends.
+
+=item * PERLIO_K_FASTGETS
+
+Layer allows buffer snooping.
+
+=item * PERLIO_K_MULTIARG
+
+Used when the layer's open() accepts more arguments than usual. The
+extra arguments should come not before the C<MODE> argument. When this
+flag is used it's up to the layer to validate the args.
+
+=back
+
+=item Pushed
+
+	IV	(*Pushed)(pTHX_ PerlIO *f,const char *mode, SV *arg);
+
+The only absolutely mandatory method. Called when the layer is pushed
+onto the stack.  The C<mode> argument may be NULL if this occurs
+post-open. The C<arg> will be non-C<NULL> if an argument string was
+passed. In most cases this should call C<PerlIOBase_pushed()> to
+convert C<mode> into the appropriate C<PERLIO_F_XXXXX> flags in
+addition to any actions the layer itself takes.  If a layer is not
+expecting an argument it need neither save the one passed to it, nor
+provide C<Getarg()> (it could perhaps C<Perl_warn> that the argument
+was un-expected).
+
+Returns 0 on success. On failure returns -1 and should set errno.
+
+=item Popped
+
+	IV	(*Popped)(pTHX_ PerlIO *f);
+
+Called when the layer is popped from the stack. A layer will normally
+be popped after C<Close()> is called. But a layer can be popped
+without being closed if the program is dynamically managing layers on
+the stream. In such cases C<Popped()> should free any resources
+(buffers, translation tables, ...) not held directly in the layer's
+struct.  It should also C<Unread()> any unconsumed data that has been
+read and buffered from the layer below back to that layer, so that it
+can be re-provided to what ever is now above.
+
+Returns 0 on success and failure.  If C<Popped()> returns I<true> then
+I<perlio.c> assumes that either the layer has popped itself, or the
+layer is super special and needs to be retained for other reasons.
+In most cases it should return I<false>.
+
+=item Open
+
+	PerlIO *	(*Open)(...);
+
+The C<Open()> method has lots of arguments because it combines the
+functions of perl's C<open>, C<PerlIO_open>, perl's C<sysopen>,
+C<PerlIO_fdopen> and C<PerlIO_reopen>.  The full prototype is as
+follows:
+
+ PerlIO *	(*Open)(pTHX_ PerlIO_funcs *tab,
+			AV *layers, IV n,
+			const char *mode,
+			int fd, int imode, int perm,
+			PerlIO *old,
+			int narg, SV **args);
+
+Open should (perhaps indirectly) call C<PerlIO_allocate()> to allocate
+a slot in the table and associate it with the layers information for
+the opened file, by calling C<PerlIO_push>.  The I<layers> AV is an
+array of all the layers destined for the C<PerlIO *>, and any
+arguments passed to them, I<n> is the index into that array of the
+layer being called. The macro C<PerlIOArg> will return a (possibly
+C<NULL>) SV * for the argument passed to the layer.
+
+The I<mode> string is an "C<fopen()>-like" string which would match
+the regular expression C</^[I#]?[rwa]\+?[bt]?$/>.
+
+The C<'I'> prefix is used during creation of C<stdin>..C<stderr> via
+special C<PerlIO_fdopen> calls; the C<'#'> prefix means that this is
+C<sysopen> and that I<imode> and I<perm> should be passed to
+C<PerlLIO_open3>; C<'r'> means B<r>ead, C<'w'> means B<w>rite and
+C<'a'> means B<a>ppend. The C<'+'> suffix means that both reading and
+writing/appending are permitted.  The C<'b'> suffix means file should
+be binary, and C<'t'> means it is text. (Almost all layers should do
+the IO in binary mode, and ignore the b/t bits. The C<:crlf> layer
+should be pushed to handle the distinction.)
+
+If I<old> is not C<NULL> then this is a C<PerlIO_reopen>. Perl itself
+does not use this (yet?) and semantics are a little vague.
+
+If I<fd> not negative then it is the numeric file descriptor I<fd>,
+which will be open in a manner compatible with the supplied mode
+string, the call is thus equivalent to C<PerlIO_fdopen>. In this case
+I<nargs> will be zero.
+
+If I<nargs> is greater than zero then it gives the number of arguments
+passed to C<open>, otherwise it will be 1 if for example
+C<PerlIO_open> was called.  In simple cases SvPV_nolen(*args) is the
+pathname to open.
+
+Having said all that translation-only layers do not need to provide
+C<Open()> at all, but rather leave the opening to a lower level layer
+and wait to be "pushed".  If a layer does provide C<Open()> it should
+normally call the C<Open()> method of next layer down (if any) and
+then push itself on top if that succeeds.
+
+If C<PerlIO_push> was performed and open has failed, it must
+C<PerlIO_pop> itself, since if it's not, the layer won't be removed
+and may cause bad problems.
+
+Returns C<NULL> on failure.
+
+=item Binmode
+
+	IV        (*Binmode)(pTHX_ PerlIO *f);
+
+Optional. Used when C<:raw> layer is pushed (explicitly or as a result
+of binmode(FH)). If not present layer will be popped. If present
+should configure layer as binary (or pop itself) and return 0.
+If it returns -1 for error C<binmode> will fail with layer
+still on the stack.
+
+=item Getarg
+
+	SV *      (*Getarg)(pTHX_ PerlIO *f,
+			    CLONE_PARAMS *param, int flags);
+
+Optional. If present should return an SV * representing the string
+argument passed to the layer when it was
+pushed. e.g. ":encoding(ascii)" would return an SvPV with value
+"ascii". (I<param> and I<flags> arguments can be ignored in most
+cases)
+
+C<Dup> uses C<Getarg> to retrieve the argument originally passed to
+C<Pushed>, so you must implement this function if your layer has an
+extra argument to C<Pushed> and will ever be C<Dup>ed.
+
+=item Fileno
+
+	IV        (*Fileno)(pTHX_ PerlIO *f);
+
+Returns the Unix/Posix numeric file descriptor for the handle. Normally
+C<PerlIOBase_fileno()> (which just asks next layer down) will suffice
+for this.
+
+Returns -1 on error, which is considered to include the case where the
+layer cannot provide such a file descriptor.
+
+=item Dup
+
+	PerlIO * (*Dup)(pTHX_ PerlIO *f, PerlIO *o,
+			CLONE_PARAMS *param, int flags);
+
+XXX: Needs more docs.
+
+Used as part of the "clone" process when a thread is spawned (in which
+case param will be non-NULL) and when a stream is being duplicated via
+'&' in the C<open>.
+
+Similar to C<Open>, returns PerlIO* on success, C<NULL> on failure.
+
+=item Read
+
+	SSize_t	(*Read)(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+
+Basic read operation.
+
+Typically will call C<Fill> and manipulate pointers (possibly via the
+API).  C<PerlIOBuf_read()> may be suitable for derived classes which
+provide "fast gets" methods.
+
+Returns actual bytes read, or -1 on an error.
+
+=item	Unread
+
+	SSize_t	(*Unread)(pTHX_ PerlIO *f,
+			  const void *vbuf, Size_t count);
+
+A superset of stdio's C<ungetc()>. Should arrange for future reads to
+see the bytes in C<vbuf>. If there is no obviously better implementation
+then C<PerlIOBase_unread()> provides the function by pushing a "fake"
+"pending" layer above the calling layer.
+
+Returns the number of unread chars.
+
+=item Write
+
+	SSize_t	(*Write)(PerlIO *f, const void *vbuf, Size_t count);
+
+Basic write operation.
+
+Returns bytes written or -1 on an error.
+
+=item Seek
+
+	IV	(*Seek)(pTHX_ PerlIO *f, Off_t offset, int whence);
+
+Position the file pointer. Should normally call its own C<Flush>
+method and then the C<Seek> method of next layer down.
+
+Returns 0 on success, -1 on failure.
+
+=item Tell
+
+	Off_t	(*Tell)(pTHX_ PerlIO *f);
+
+Return the file pointer. May be based on layers cached concept of
+position to avoid overhead.
+
+Returns -1 on failure to get the file pointer.
+
+=item Close
+
+	IV	(*Close)(pTHX_ PerlIO *f);
+
+Close the stream. Should normally call C<PerlIOBase_close()> to flush
+itself and close layers below, and then deallocate any data structures
+(buffers, translation tables, ...) not  held directly in the data
+structure.
+
+Returns 0 on success, -1 on failure.
+
+=item Flush
+
+	IV	(*Flush)(pTHX_ PerlIO *f);
+
+Should make stream's state consistent with layers below. That is, any
+buffered write data should be written, and file position of lower layers
+adjusted for data read from below but not actually consumed.
+(Should perhaps C<Unread()> such data to the lower layer.)
+
+Returns 0 on success, -1 on failure.
+
+=item Fill
+
+	IV	(*Fill)(pTHX_ PerlIO *f);
+
+The buffer for this layer should be filled (for read) from layer
+below.  When you "subclass" PerlIOBuf layer, you want to use its
+I<_read> method and to supply your own fill method, which fills the
+PerlIOBuf's buffer.
+
+Returns 0 on success, -1 on failure.
+
+=item Eof
+
+	IV	(*Eof)(pTHX_ PerlIO *f);
+
+Return end-of-file indicator. C<PerlIOBase_eof()> is normally sufficient.
+
+Returns 0 on end-of-file, 1 if not end-of-file, -1 on error.
+
+=item Error
+
+	IV	(*Error)(pTHX_ PerlIO *f);
+
+Return error indicator. C<PerlIOBase_error()> is normally sufficient.
+
+Returns 1 if there is an error (usually when C<PERLIO_F_ERROR> is set,
+0 otherwise.
+
+=item  Clearerr
+
+	void	(*Clearerr)(pTHX_ PerlIO *f);
+
+Clear end-of-file and error indicators. Should call C<PerlIOBase_clearerr()>
+to set the C<PERLIO_F_XXXXX> flags, which may suffice.
+
+=item Setlinebuf
+
+	void	(*Setlinebuf)(pTHX_ PerlIO *f);
+
+Mark the stream as line buffered. C<PerlIOBase_setlinebuf()> sets the
+PERLIO_F_LINEBUF flag and is normally sufficient.
+
+=item Get_base
+
+	STDCHAR *	(*Get_base)(pTHX_ PerlIO *f);
+
+Allocate (if not already done so) the read buffer for this layer and
+return pointer to it. Return NULL on failure.
+
+=item Get_bufsiz
+
+	Size_t	(*Get_bufsiz)(pTHX_ PerlIO *f);
+
+Return the number of bytes that last C<Fill()> put in the buffer.
+
+=item Get_ptr
+
+	STDCHAR *	(*Get_ptr)(pTHX_ PerlIO *f);
+
+Return the current read pointer relative to this layer's buffer.
+
+=item Get_cnt
+
+	SSize_t	(*Get_cnt)(pTHX_ PerlIO *f);
+
+Return the number of bytes left to be read in the current buffer.
+
+=item Set_ptrcnt
+
+	void	(*Set_ptrcnt)(pTHX_ PerlIO *f,
+			      STDCHAR *ptr, SSize_t cnt);
+
+Adjust the read pointer and count of bytes to match C<ptr> and/or C<cnt>.
+The application (or layer above) must ensure they are consistent.
+(Checking is allowed by the paranoid.)
+
+=back
+
+=head2 Utilities
+
+To ask for the next layer down use PerlIONext(PerlIO *f).
+
+To check that a PerlIO* is valid use PerlIOValid(PerlIO *f).  (All
+this does is really just to check that the pointer is non-NULL and
+that the pointer behind that is non-NULL.)
+
+PerlIOBase(PerlIO *f) returns the "Base" pointer, or in other words,
+the C<PerlIOl*> pointer.
+
+PerlIOSelf(PerlIO* f, type) return the PerlIOBase cast to a type.
+
+Perl_PerlIO_or_Base(PerlIO* f, callback, base, failure, args) either
+calls the I<callback> from the functions of the layer I<f> (just by
+the name of the IO function, like "Read") with the I<args>, or if
+there is no such callback, calls the I<base> version of the callback
+with the same args, or if the f is invalid, set errno to EBADF and
+return I<failure>.
+
+Perl_PerlIO_or_fail(PerlIO* f, callback, failure, args) either calls
+the I<callback> of the functions of the layer I<f> with the I<args>,
+or if there is no such callback, set errno to EINVAL.  Or if the f is
+invalid, set errno to EBADF and return I<failure>.
+
+Perl_PerlIO_or_Base_void(PerlIO* f, callback, base, args) either calls
+the I<callback> of the functions of the layer I<f> with the I<args>,
+or if there is no such callback, calls the I<base> version of the
+callback with the same args, or if the f is invalid, set errno to
+EBADF.
+
+Perl_PerlIO_or_fail_void(PerlIO* f, callback, args) either calls the
+I<callback> of the functions of the layer I<f> with the I<args>, or if
+there is no such callback, set errno to EINVAL.  Or if the f is
+invalid, set errno to EBADF.
+
+=head2 Implementing PerlIO Layers
+
+If you find the implementation document unclear or not sufficient,
+look at the existing PerlIO layer implementations, which include:
+
+=over
+
+=item * C implementations
+
+The F<perlio.c> and F<perliol.h> in the Perl core implement the
+"unix", "perlio", "stdio", "crlf", "utf8", "byte", "raw", "pending"
+layers, and also the "mmap" and "win32" layers if applicable.
+(The "win32" is currently unfinished and unused, to see what is used
+instead in Win32, see L<PerlIO/"Querying the layers of filehandles"> .)
+
+PerlIO::encoding, PerlIO::scalar, PerlIO::via in the Perl core.
+
+PerlIO::gzip and APR::PerlIO (mod_perl 2.0) on CPAN.
+
+=item * Perl implementations
+
+PerlIO::via::QuotedPrint in the Perl core and PerlIO::via::* on CPAN.
+
+=back
+
+If you are creating a PerlIO layer, you may want to be lazy, in other
+words, implement only the methods that interest you.  The other methods
+you can either replace with the "blank" methods
+
+    PerlIOBase_noop_ok
+    PerlIOBase_noop_fail
+
+(which do nothing, and return zero and -1, respectively) or for
+certain methods you may assume a default behaviour by using a NULL
+method.  The Open method looks for help in the 'parent' layer.
+The following table summarizes the behaviour:
+
+    method      behaviour with NULL
+
+    Clearerr    PerlIOBase_clearerr
+    Close       PerlIOBase_close
+    Dup         PerlIOBase_dup
+    Eof         PerlIOBase_eof
+    Error       PerlIOBase_error
+    Fileno      PerlIOBase_fileno
+    Fill        FAILURE
+    Flush       SUCCESS
+    Getarg      SUCCESS
+    Get_base    FAILURE
+    Get_bufsiz  FAILURE
+    Get_cnt     FAILURE
+    Get_ptr     FAILURE
+    Open        INHERITED
+    Popped      SUCCESS
+    Pushed      SUCCESS
+    Read        PerlIOBase_read
+    Seek        FAILURE
+    Set_cnt     FAILURE
+    Set_ptrcnt  FAILURE
+    Setlinebuf  PerlIOBase_setlinebuf
+    Tell        FAILURE
+    Unread      PerlIOBase_unread
+    Write       FAILURE
+
+ FAILURE        Set errno (to EINVAL in UNIXish, to LIB$_INVARG in VMS) and
+                return -1 (for numeric return values) or NULL (for pointers)
+ INHERITED      Inherited from the layer below
+ SUCCESS        Return 0 (for numeric return values) or a pointer 
+
+=head2 Core Layers
+
+The file C<perlio.c> provides the following layers:
+
+=over 4
+
+=item "unix"
+
+A basic non-buffered layer which calls Unix/POSIX C<read()>, C<write()>,
+C<lseek()>, C<close()>. No buffering. Even on platforms that distinguish
+between O_TEXT and O_BINARY this layer is always O_BINARY.
+
+=item "perlio"
+
+A very complete generic buffering layer which provides the whole of
+PerlIO API. It is also intended to be used as a "base class" for other
+layers. (For example its C<Read()> method is implemented in terms of
+the C<Get_cnt()>/C<Get_ptr()>/C<Set_ptrcnt()> methods).
+
+"perlio" over "unix" provides a complete replacement for stdio as seen
+via PerlIO API. This is the default for USE_PERLIO when system's stdio
+does not permit perl's "fast gets" access, and which do not
+distinguish between C<O_TEXT> and C<O_BINARY>.
+
+=item "stdio"
+
+A layer which provides the PerlIO API via the layer scheme, but
+implements it by calling system's stdio. This is (currently) the default
+if system's stdio provides sufficient access to allow perl's "fast gets"
+access and which do not distinguish between C<O_TEXT> and C<O_BINARY>.
+
+=item "crlf"
+
+A layer derived using "perlio" as a base class. It provides Win32-like
+"\n" to CR,LF translation. Can either be applied above "perlio" or serve
+as the buffer layer itself. "crlf" over "unix" is the default if system
+distinguishes between C<O_TEXT> and C<O_BINARY> opens. (At some point
+"unix" will be replaced by a "native" Win32 IO layer on that platform,
+as Win32's read/write layer has various drawbacks.) The "crlf" layer is
+a reasonable model for a layer which transforms data in some way.
+
+=item "mmap"
+
+If Configure detects C<mmap()> functions this layer is provided (with
+"perlio" as a "base") which does "read" operations by mmap()ing the
+file. Performance improvement is marginal on modern systems, so it is
+mainly there as a proof of concept. It is likely to be unbundled from
+the core at some point. The "mmap" layer is a reasonable model for a
+minimalist "derived" layer.
+
+=item "pending"
+
+An "internal" derivative of "perlio" which can be used to provide
+Unread() function for layers which have no buffer or cannot be
+bothered.  (Basically this layer's C<Fill()> pops itself off the stack
+and so resumes reading from layer below.)
+
+=item "raw"
+
+A dummy layer which never exists on the layer stack. Instead when
+"pushed" it actually pops the stack removing itself, it then calls
+Binmode function table entry on all the layers in the stack - normally
+this (via PerlIOBase_binmode) removes any layers which do not have
+C<PERLIO_K_RAW> bit set. Layers can modify that behaviour by defining
+their own Binmode entry.
+
+=item "utf8"
+
+Another dummy layer. When pushed it pops itself and sets the
+C<PERLIO_F_UTF8> flag on the layer which was (and now is once more)
+the top of the stack.
+
+=back
+
+In addition F<perlio.c> also provides a number of C<PerlIOBase_xxxx()>
+functions which are intended to be used in the table slots of classes
+which do not need to do anything special for a particular method.
+
+=head2 Extension Layers
+
+Layers can made available by extension modules. When an unknown layer
+is encountered the PerlIO code will perform the equivalent of :
+
+   use PerlIO 'layer';
+
+Where I<layer> is the unknown layer. F<PerlIO.pm> will then attempt to:
+
+   require PerlIO::layer;
+
+If after that process the layer is still not defined then the C<open>
+will fail.
+
+The following extension layers are bundled with perl:
+
+=over 4
+
+=item ":encoding"
+
+   use Encoding;
+
+makes this layer available, although F<PerlIO.pm> "knows" where to
+find it.  It is an example of a layer which takes an argument as it is
+called thus:
+
+   open( $fh, "<:encoding(iso-8859-7)", $pathname );
+
+=item ":scalar"
+
+Provides support for reading data from and writing data to a scalar.
+
+   open( $fh, "+<:scalar", \$scalar );
+
+When a handle is so opened, then reads get bytes from the string value
+of I<$scalar>, and writes change the value. In both cases the position
+in I<$scalar> starts as zero but can be altered via C<seek>, and
+determined via C<tell>.
+
+Please note that this layer is implied when calling open() thus:
+
+   open( $fh, "+<", \$scalar );
+
+=item ":via"
+
+Provided to allow layers to be implemented as Perl code.  For instance:
+
+   use PerlIO::via::StripHTML;
+   open( my $fh, "<:via(StripHTML)", "index.html" );
+
+See L<PerlIO::via> for details.
+
+=back
+
+=head1 TODO
+
+Things that need to be done to improve this document.
+
+=over
+
+=item *
+
+Explain how to make a valid fh without going through open()(i.e. apply
+a layer). For example if the file is not opened through perl, but we
+want to get back a fh, like it was opened by Perl.
+
+How PerlIO_apply_layera fits in, where its docs, was it made public?
+
+Currently the example could be something like this:
+
+  PerlIO *foo_to_PerlIO(pTHX_ char *mode, ...)
+  {
+      char *mode; /* "w", "r", etc */
+      const char *layers = ":APR"; /* the layer name */
+      PerlIO *f = PerlIO_allocate(aTHX);
+      if (!f) {
+          return NULL;
+      }
+
+      PerlIO_apply_layers(aTHX_ f, mode, layers);
+
+      if (f) {
+          PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR);
+          /* fill in the st struct, as in _open() */
+          st->file = file;
+          PerlIOBase(f)->flags |= PERLIO_F_OPEN;
+
+          return f;
+      }
+      return NULL;
+  }
+
+=item *
+
+fix/add the documentation in places marked as XXX.
+
+=item *
+
+The handling of errors by the layer is not specified. e.g. when $!
+should be set explicitly, when the error handling should be just
+delegated to the top layer.
+
+Probably give some hints on using SETERRNO() or pointers to where they
+can be found.
+
+=item *
+
+I think it would help to give some concrete examples to make it easier
+to understand the API. Of course I agree that the API has to be
+concise, but since there is no second document that is more of a
+guide, I think that it'd make it easier to start with the doc which is
+an API, but has examples in it in places where things are unclear, to
+a person who is not a PerlIO guru (yet).
+
+=back
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlipc.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlipc.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlipc.pod	(revision 14489)
@@ -0,0 +1,1697 @@
+=head1 NAME
+
+perlipc - Perl interprocess communication (signals, fifos, pipes, safe subprocesses, sockets, and semaphores)
+
+=head1 DESCRIPTION
+
+The basic IPC facilities of Perl are built out of the good old Unix
+signals, named pipes, pipe opens, the Berkeley socket routines, and SysV
+IPC calls.  Each is used in slightly different situations.
+
+=head1 Signals
+
+Perl uses a simple signal handling model: the %SIG hash contains names
+or references of user-installed signal handlers.  These handlers will
+be called with an argument which is the name of the signal that
+triggered it.  A signal may be generated intentionally from a
+particular keyboard sequence like control-C or control-Z, sent to you
+from another process, or triggered automatically by the kernel when
+special events transpire, like a child process exiting, your process
+running out of stack space, or hitting file size limit.
+
+For example, to trap an interrupt signal, set up a handler like this:
+
+    sub catch_zap {
+	my $signame = shift;
+	$shucks++;
+	die "Somebody sent me a SIG$signame";
+    }
+    $SIG{INT} = 'catch_zap';  # could fail in modules
+    $SIG{INT} = \&catch_zap;  # best strategy
+
+Prior to Perl 5.7.3 it was necessary to do as little as you possibly
+could in your handler; notice how all we do is set a global variable
+and then raise an exception.  That's because on most systems,
+libraries are not re-entrant; particularly, memory allocation and I/O
+routines are not.  That meant that doing nearly I<anything> in your
+handler could in theory trigger a memory fault and subsequent core
+dump - see L</Deferred Signals (Safe Signals)> below.
+
+The names of the signals are the ones listed out by C<kill -l> on your
+system, or you can retrieve them from the Config module.  Set up an
+@signame list indexed by number to get the name and a %signo table
+indexed by name to get the number:
+
+    use Config;
+    defined $Config{sig_name} || die "No sigs?";
+    foreach $name (split(' ', $Config{sig_name})) {
+	$signo{$name} = $i;
+	$signame[$i] = $name;
+	$i++;
+    }
+
+So to check whether signal 17 and SIGALRM were the same, do just this:
+
+    print "signal #17 = $signame[17]\n";
+    if ($signo{ALRM}) {
+	print "SIGALRM is $signo{ALRM}\n";
+    }
+
+You may also choose to assign the strings C<'IGNORE'> or C<'DEFAULT'> as
+the handler, in which case Perl will try to discard the signal or do the
+default thing.
+
+On most Unix platforms, the C<CHLD> (sometimes also known as C<CLD>) signal
+has special behavior with respect to a value of C<'IGNORE'>.
+Setting C<$SIG{CHLD}> to C<'IGNORE'> on such a platform has the effect of
+not creating zombie processes when the parent process fails to C<wait()>
+on its child processes (i.e. child processes are automatically reaped).
+Calling C<wait()> with C<$SIG{CHLD}> set to C<'IGNORE'> usually returns
+C<-1> on such platforms.
+
+Some signals can be neither trapped nor ignored, such as
+the KILL and STOP (but not the TSTP) signals.  One strategy for
+temporarily ignoring signals is to use a local() statement, which will be
+automatically restored once your block is exited.  (Remember that local()
+values are "inherited" by functions called from within that block.)
+
+    sub precious {
+	local $SIG{INT} = 'IGNORE';
+	&more_functions;
+    }
+    sub more_functions {
+	# interrupts still ignored, for now...
+    }
+
+Sending a signal to a negative process ID means that you send the signal
+to the entire Unix process-group.  This code sends a hang-up signal to all
+processes in the current process group (and sets $SIG{HUP} to IGNORE so
+it doesn't kill itself):
+
+    {
+	local $SIG{HUP} = 'IGNORE';
+	kill HUP => -$$;
+	# snazzy writing of: kill('HUP', -$$)
+    }
+
+Another interesting signal to send is signal number zero.  This doesn't
+actually affect a child process, but instead checks whether it's alive
+or has changed its UID.
+
+    unless (kill 0 => $kid_pid) {
+	warn "something wicked happened to $kid_pid";
+    }
+
+When directed at a process whose UID is not identical to that
+of the sending process, signal number zero may fail because
+you lack permission to send the signal, even though the process is alive.
+You may be able to determine the cause of failure using C<%!>.
+
+    unless (kill 0 => $pid or $!{EPERM}) {
+	warn "$pid looks dead";
+    }
+
+You might also want to employ anonymous functions for simple signal
+handlers:
+
+    $SIG{INT} = sub { die "\nOutta here!\n" };
+
+But that will be problematic for the more complicated handlers that need
+to reinstall themselves.  Because Perl's signal mechanism is currently
+based on the signal(3) function from the C library, you may sometimes be so
+misfortunate as to run on systems where that function is "broken", that
+is, it behaves in the old unreliable SysV way rather than the newer, more
+reasonable BSD and POSIX fashion.  So you'll see defensive people writing
+signal handlers like this:
+
+    sub REAPER {
+	$waitedpid = wait;
+	# loathe sysV: it makes us not only reinstate
+	# the handler, but place it after the wait
+	$SIG{CHLD} = \&REAPER;
+    }
+    $SIG{CHLD} = \&REAPER;
+    # now do something that forks...
+
+or better still:
+
+    use POSIX ":sys_wait_h";
+    sub REAPER {
+	my $child;
+	# If a second child dies while in the signal handler caused by the
+	# first death, we won't get another signal. So must loop here else
+	# we will leave the unreaped child as a zombie. And the next time
+	# two children die we get another zombie. And so on.
+        while (($child = waitpid(-1,WNOHANG)) > 0) {
+	    $Kid_Status{$child} = $?;
+	}
+	$SIG{CHLD} = \&REAPER;  # still loathe sysV
+    }
+    $SIG{CHLD} = \&REAPER;
+    # do something that forks...
+
+Signal handling is also used for timeouts in Unix,   While safely
+protected within an C<eval{}> block, you set a signal handler to trap
+alarm signals and then schedule to have one delivered to you in some
+number of seconds.  Then try your blocking operation, clearing the alarm
+when it's done but not before you've exited your C<eval{}> block.  If it
+goes off, you'll use die() to jump out of the block, much as you might
+using longjmp() or throw() in other languages.
+
+Here's an example:
+
+    eval {
+        local $SIG{ALRM} = sub { die "alarm clock restart" };
+        alarm 10;
+        flock(FH, 2);   # blocking write lock
+        alarm 0;
+    };
+    if ($@ and $@ !~ /alarm clock restart/) { die }
+
+If the operation being timed out is system() or qx(), this technique
+is liable to generate zombies.    If this matters to you, you'll
+need to do your own fork() and exec(), and kill the errant child process.
+
+For more complex signal handling, you might see the standard POSIX
+module.  Lamentably, this is almost entirely undocumented, but
+the F<t/lib/posix.t> file from the Perl source distribution has some
+examples in it.
+
+=head2 Handling the SIGHUP Signal in Daemons
+
+A process that usually starts when the system boots and shuts down
+when the system is shut down is called a daemon (Disk And Execution
+MONitor). If a daemon process has a configuration file which is
+modified after the process has been started, there should be a way to
+tell that process to re-read its configuration file, without stopping
+the process. Many daemons provide this mechanism using the C<SIGHUP>
+signal handler. When you want to tell the daemon to re-read the file
+you simply send it the C<SIGHUP> signal.
+
+Not all platforms automatically reinstall their (native) signal
+handlers after a signal delivery.  This means that the handler works
+only the first time the signal is sent. The solution to this problem
+is to use C<POSIX> signal handlers if available, their behaviour
+is well-defined.
+
+The following example implements a simple daemon, which restarts
+itself every time the C<SIGHUP> signal is received. The actual code is
+located in the subroutine C<code()>, which simply prints some debug
+info to show that it works and should be replaced with the real code.
+
+  #!/usr/bin/perl -w
+
+  use POSIX ();
+  use FindBin ();
+  use File::Basename ();
+  use File::Spec::Functions;
+
+  $|=1;
+
+  # make the daemon cross-platform, so exec always calls the script
+  # itself with the right path, no matter how the script was invoked.
+  my $script = File::Basename::basename($0);
+  my $SELF = catfile $FindBin::Bin, $script;
+
+  # POSIX unmasks the sigprocmask properly
+  my $sigset = POSIX::SigSet->new();
+  my $action = POSIX::SigAction->new('sigHUP_handler',
+                                     $sigset,
+                                     &POSIX::SA_NODEFER);
+  POSIX::sigaction(&POSIX::SIGHUP, $action);
+
+  sub sigHUP_handler {
+      print "got SIGHUP\n";
+      exec($SELF, @ARGV) or die "Couldn't restart: $!\n";
+  }
+
+  code();
+
+  sub code {
+      print "PID: $$\n";
+      print "ARGV: @ARGV\n";
+      my $c = 0;
+      while (++$c) {
+          sleep 2;
+          print "$c\n";
+      }
+  }
+  __END__
+
+
+=head1 Named Pipes
+
+A named pipe (often referred to as a FIFO) is an old Unix IPC
+mechanism for processes communicating on the same machine.  It works
+just like a regular, connected anonymous pipes, except that the
+processes rendezvous using a filename and don't have to be related.
+
+To create a named pipe, use the C<POSIX::mkfifo()> function.
+
+    use POSIX qw(mkfifo);
+    mkfifo($path, 0700) or die "mkfifo $path failed: $!";
+
+You can also use the Unix command mknod(1) or on some
+systems, mkfifo(1).  These may not be in your normal path.
+
+    # system return val is backwards, so && not ||
+    #
+    $ENV{PATH} .= ":/etc:/usr/etc";
+    if  (      system('mknod',  $path, 'p')
+	    && system('mkfifo', $path) )
+    {
+	die "mk{nod,fifo} $path failed";
+    }
+
+
+A fifo is convenient when you want to connect a process to an unrelated
+one.  When you open a fifo, the program will block until there's something
+on the other end.
+
+For example, let's say you'd like to have your F<.signature> file be a
+named pipe that has a Perl program on the other end.  Now every time any
+program (like a mailer, news reader, finger program, etc.) tries to read
+from that file, the reading program will block and your program will
+supply the new signature.  We'll use the pipe-checking file test B<-p>
+to find out whether anyone (or anything) has accidentally removed our fifo.
+
+    chdir; # go home
+    $FIFO = '.signature';
+
+    while (1) {
+	unless (-p $FIFO) {
+	    unlink $FIFO;
+	    require POSIX;
+	    POSIX::mkfifo($FIFO, 0700)
+		or die "can't mkfifo $FIFO: $!";
+	}
+
+	# next line blocks until there's a reader
+	open (FIFO, "> $FIFO") || die "can't write $FIFO: $!";
+	print FIFO "John Smith (smith\@host.org)\n", `fortune -s`;
+	close FIFO;
+	sleep 2;    # to avoid dup signals
+    }
+
+=head2 Deferred Signals (Safe Signals)
+
+In Perls before Perl 5.7.3 by installing Perl code to deal with
+signals, you were exposing yourself to danger from two things.  First,
+few system library functions are re-entrant.  If the signal interrupts
+while Perl is executing one function (like malloc(3) or printf(3)),
+and your signal handler then calls the same function again, you could
+get unpredictable behavior--often, a core dump.  Second, Perl isn't
+itself re-entrant at the lowest levels.  If the signal interrupts Perl
+while Perl is changing its own internal data structures, similarly
+unpredictable behaviour may result.
+
+There were two things you could do, knowing this: be paranoid or be
+pragmatic.  The paranoid approach was to do as little as possible in your
+signal handler.  Set an existing integer variable that already has a
+value, and return.  This doesn't help you if you're in a slow system call,
+which will just restart.  That means you have to C<die> to longjump(3) out
+of the handler.  Even this is a little cavalier for the true paranoiac,
+who avoids C<die> in a handler because the system I<is> out to get you.
+The pragmatic approach was to say "I know the risks, but prefer the
+convenience", and to do anything you wanted in your signal handler,
+and be prepared to clean up core dumps now and again.
+
+In Perl 5.7.3 and later to avoid these problems signals are
+"deferred"-- that is when the signal is delivered to the process by
+the system (to the C code that implements Perl) a flag is set, and the
+handler returns immediately. Then at strategic "safe" points in the
+Perl interpreter (e.g. when it is about to execute a new opcode) the
+flags are checked and the Perl level handler from %SIG is
+executed. The "deferred" scheme allows much more flexibility in the
+coding of signal handler as we know Perl interpreter is in a safe
+state, and that we are not in a system library function when the
+handler is called.  However the implementation does differ from
+previous Perls in the following ways:
+
+=over 4
+
+=item Long running opcodes
+
+As Perl interpreter only looks at the signal flags when it about to
+execute a new opcode if a signal arrives during a long running opcode
+(e.g. a regular expression operation on a very large string) then
+signal will not be seen until operation completes.
+
+=item Interrupting IO
+
+When a signal is delivered (e.g. INT control-C) the operating system
+breaks into IO operations like C<read> (used to implement Perls
+E<lt>E<gt> operator). On older Perls the handler was called
+immediately (and as C<read> is not "unsafe" this worked well). With
+the "deferred" scheme the handler is not called immediately, and if
+Perl is using system's C<stdio> library that library may re-start the
+C<read> without returning to Perl and giving it a chance to call the
+%SIG handler. If this happens on your system the solution is to use
+C<:perlio> layer to do IO - at least on those handles which you want
+to be able to break into with signals. (The C<:perlio> layer checks
+the signal flags and calls %SIG handlers before resuming IO operation.)
+
+Note that the default in Perl 5.7.3 and later is to automatically use
+the C<:perlio> layer.
+
+Note that some networking library functions like gethostbyname() are
+known to have their own implementations of timeouts which may conflict
+with your timeouts.  If you are having problems with such functions,
+you can try using the POSIX sigaction() function, which bypasses the
+Perl safe signals (note that this means subjecting yourself to
+possible memory corruption, as described above).  Instead of setting
+C<$SIG{ALRM}>:
+
+   local $SIG{ALRM} = sub { die "alarm" };
+
+try something like the following:
+
+    use POSIX qw(SIGALRM);
+    POSIX::sigaction(SIGALRM,
+                     POSIX::SigAction->new(sub { die "alarm" }))
+          or die "Error setting SIGALRM handler: $!\n";
+
+=item Restartable system calls
+
+On systems that supported it, older versions of Perl used the
+SA_RESTART flag when installing %SIG handlers.  This meant that
+restartable system calls would continue rather than returning when
+a signal arrived.  In order to deliver deferred signals promptly,
+Perl 5.7.3 and later do I<not> use SA_RESTART.  Consequently, 
+restartable system calls can fail (with $! set to C<EINTR>) in places
+where they previously would have succeeded.
+
+Note that the default C<:perlio> layer will retry C<read>, C<write>
+and C<close> as described above and that interrupted C<wait> and 
+C<waitpid> calls will always be retried.
+
+=item Signals as "faults"
+
+Certain signals e.g. SEGV, ILL, BUS are generated as a result of
+virtual memory or other "faults". These are normally fatal and there
+is little a Perl-level handler can do with them. (In particular the
+old signal scheme was particularly unsafe in such cases.)  However if
+a %SIG handler is set the new scheme simply sets a flag and returns as
+described above. This may cause the operating system to try the
+offending machine instruction again and - as nothing has changed - it
+will generate the signal again. The result of this is a rather odd
+"loop". In future Perl's signal mechanism may be changed to avoid this
+- perhaps by simply disallowing %SIG handlers on signals of that
+type. Until then the work-round is not to set a %SIG handler on those
+signals. (Which signals they are is operating system dependent.)
+
+=item Signals triggered by operating system state
+
+On some operating systems certain signal handlers are supposed to "do
+something" before returning. One example can be CHLD or CLD which
+indicates a child process has completed. On some operating systems the
+signal handler is expected to C<wait> for the completed child
+process. On such systems the deferred signal scheme will not work for
+those signals (it does not do the C<wait>). Again the failure will
+look like a loop as the operating system will re-issue the signal as
+there are un-waited-for completed child processes.
+
+=back
+
+If you want the old signal behaviour back regardless of possible
+memory corruption, set the environment variable C<PERL_SIGNALS> to
+C<"unsafe"> (a new feature since Perl 5.8.1).
+
+=head1 Using open() for IPC
+
+Perl's basic open() statement can also be used for unidirectional
+interprocess communication by either appending or prepending a pipe
+symbol to the second argument to open().  Here's how to start
+something up in a child process you intend to write to:
+
+    open(SPOOLER, "| cat -v | lpr -h 2>/dev/null")
+		    || die "can't fork: $!";
+    local $SIG{PIPE} = sub { die "spooler pipe broke" };
+    print SPOOLER "stuff\n";
+    close SPOOLER || die "bad spool: $! $?";
+
+And here's how to start up a child process you intend to read from:
+
+    open(STATUS, "netstat -an 2>&1 |")
+		    || die "can't fork: $!";
+    while (<STATUS>) {
+	next if /^(tcp|udp)/;
+	print;
+    }
+    close STATUS || die "bad netstat: $! $?";
+
+If one can be sure that a particular program is a Perl script that is
+expecting filenames in @ARGV, the clever programmer can write something
+like this:
+
+    % program f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile
+
+and irrespective of which shell it's called from, the Perl program will
+read from the file F<f1>, the process F<cmd1>, standard input (F<tmpfile>
+in this case), the F<f2> file, the F<cmd2> command, and finally the F<f3>
+file.  Pretty nifty, eh?
+
+You might notice that you could use backticks for much the
+same effect as opening a pipe for reading:
+
+    print grep { !/^(tcp|udp)/ } `netstat -an 2>&1`;
+    die "bad netstat" if $?;
+
+While this is true on the surface, it's much more efficient to process the
+file one line or record at a time because then you don't have to read the
+whole thing into memory at once.  It also gives you finer control of the
+whole process, letting you to kill off the child process early if you'd
+like.
+
+Be careful to check both the open() and the close() return values.  If
+you're I<writing> to a pipe, you should also trap SIGPIPE.  Otherwise,
+think of what happens when you start up a pipe to a command that doesn't
+exist: the open() will in all likelihood succeed (it only reflects the
+fork()'s success), but then your output will fail--spectacularly.  Perl
+can't know whether the command worked because your command is actually
+running in a separate process whose exec() might have failed.  Therefore,
+while readers of bogus commands return just a quick end of file, writers
+to bogus command will trigger a signal they'd better be prepared to
+handle.  Consider:
+
+    open(FH, "|bogus")	or die "can't fork: $!";
+    print FH "bang\n"	or die "can't write: $!";
+    close FH		or die "can't close: $!";
+
+That won't blow up until the close, and it will blow up with a SIGPIPE.
+To catch it, you could use this:
+
+    $SIG{PIPE} = 'IGNORE';
+    open(FH, "|bogus")  or die "can't fork: $!";
+    print FH "bang\n"   or die "can't write: $!";
+    close FH            or die "can't close: status=$?";
+
+=head2 Filehandles
+
+Both the main process and any child processes it forks share the same
+STDIN, STDOUT, and STDERR filehandles.  If both processes try to access
+them at once, strange things can happen.  You may also want to close
+or reopen the filehandles for the child.  You can get around this by
+opening your pipe with open(), but on some systems this means that the
+child process cannot outlive the parent.
+
+=head2 Background Processes
+
+You can run a command in the background with:
+
+    system("cmd &");
+
+The command's STDOUT and STDERR (and possibly STDIN, depending on your
+shell) will be the same as the parent's.  You won't need to catch
+SIGCHLD because of the double-fork taking place (see below for more
+details).
+
+=head2 Complete Dissociation of Child from Parent
+
+In some cases (starting server processes, for instance) you'll want to
+completely dissociate the child process from the parent.  This is
+often called daemonization.  A well behaved daemon will also chdir()
+to the root directory (so it doesn't prevent unmounting the filesystem
+containing the directory from which it was launched) and redirect its
+standard file descriptors from and to F</dev/null> (so that random
+output doesn't wind up on the user's terminal).
+
+    use POSIX 'setsid';
+
+    sub daemonize {
+	chdir '/'		or die "Can't chdir to /: $!";
+	open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
+	open STDOUT, '>/dev/null'
+				or die "Can't write to /dev/null: $!";
+	defined(my $pid = fork)	or die "Can't fork: $!";
+	exit if $pid;
+	setsid			or die "Can't start a new session: $!";
+	open STDERR, '>&STDOUT'	or die "Can't dup stdout: $!";
+    }
+
+The fork() has to come before the setsid() to ensure that you aren't a
+process group leader (the setsid() will fail if you are).  If your
+system doesn't have the setsid() function, open F</dev/tty> and use the
+C<TIOCNOTTY> ioctl() on it instead.  See L<tty(4)> for details.
+
+Non-Unix users should check their Your_OS::Process module for other
+solutions.
+
+=head2 Safe Pipe Opens
+
+Another interesting approach to IPC is making your single program go
+multiprocess and communicate between (or even amongst) yourselves.  The
+open() function will accept a file argument of either C<"-|"> or C<"|-">
+to do a very interesting thing: it forks a child connected to the
+filehandle you've opened.  The child is running the same program as the
+parent.  This is useful for safely opening a file when running under an
+assumed UID or GID, for example.  If you open a pipe I<to> minus, you can
+write to the filehandle you opened and your kid will find it in his
+STDIN.  If you open a pipe I<from> minus, you can read from the filehandle
+you opened whatever your kid writes to his STDOUT.
+
+    use English '-no_match_vars';
+    my $sleep_count = 0;
+
+    do {
+	$pid = open(KID_TO_WRITE, "|-");
+	unless (defined $pid) {
+	    warn "cannot fork: $!";
+	    die "bailing out" if $sleep_count++ > 6;
+	    sleep 10;
+	}
+    } until defined $pid;
+
+    if ($pid) {  # parent
+	print KID_TO_WRITE @some_data;
+	close(KID_TO_WRITE) || warn "kid exited $?";
+    } else {     # child
+	($EUID, $EGID) = ($UID, $GID); # suid progs only
+	open (FILE, "> /safe/file")
+	    || die "can't open /safe/file: $!";
+	while (<STDIN>) {
+	    print FILE; # child's STDIN is parent's KID
+	}
+	exit;  # don't forget this
+    }
+
+Another common use for this construct is when you need to execute
+something without the shell's interference.  With system(), it's
+straightforward, but you can't use a pipe open or backticks safely.
+That's because there's no way to stop the shell from getting its hands on
+your arguments.   Instead, use lower-level control to call exec() directly.
+
+Here's a safe backtick or pipe open for read:
+
+    # add error processing as above
+    $pid = open(KID_TO_READ, "-|");
+
+    if ($pid) {   # parent
+	while (<KID_TO_READ>) {
+	    # do something interesting
+	}
+	close(KID_TO_READ) || warn "kid exited $?";
+
+    } else {      # child
+	($EUID, $EGID) = ($UID, $GID); # suid only
+	exec($program, @options, @args)
+	    || die "can't exec program: $!";
+	# NOTREACHED
+    }
+
+
+And here's a safe pipe open for writing:
+
+    # add error processing as above
+    $pid = open(KID_TO_WRITE, "|-");
+    $SIG{PIPE} = sub { die "whoops, $program pipe broke" };
+
+    if ($pid) {  # parent
+	for (@data) {
+	    print KID_TO_WRITE;
+	}
+	close(KID_TO_WRITE) || warn "kid exited $?";
+
+    } else {     # child
+	($EUID, $EGID) = ($UID, $GID);
+	exec($program, @options, @args)
+	    || die "can't exec program: $!";
+	# NOTREACHED
+    }
+
+Since Perl 5.8.0, you can also use the list form of C<open> for pipes :
+the syntax
+
+    open KID_PS, "-|", "ps", "aux" or die $!;
+
+forks the ps(1) command (without spawning a shell, as there are more than
+three arguments to open()), and reads its standard output via the
+C<KID_PS> filehandle.  The corresponding syntax to write to command
+pipes (with C<"|-"> in place of C<"-|">) is also implemented.
+
+Note that these operations are full Unix forks, which means they may not be
+correctly implemented on alien systems.  Additionally, these are not true
+multithreading.  If you'd like to learn more about threading, see the
+F<modules> file mentioned below in the SEE ALSO section.
+
+=head2 Bidirectional Communication with Another Process
+
+While this works reasonably well for unidirectional communication, what
+about bidirectional communication?  The obvious thing you'd like to do
+doesn't actually work:
+
+    open(PROG_FOR_READING_AND_WRITING, "| some program |")
+
+and if you forget to use the C<use warnings> pragma or the B<-w> flag,
+then you'll miss out entirely on the diagnostic message:
+
+    Can't do bidirectional pipe at -e line 1.
+
+If you really want to, you can use the standard open2() library function
+to catch both ends.  There's also an open3() for tridirectional I/O so you
+can also catch your child's STDERR, but doing so would then require an
+awkward select() loop and wouldn't allow you to use normal Perl input
+operations.
+
+If you look at its source, you'll see that open2() uses low-level
+primitives like Unix pipe() and exec() calls to create all the connections.
+While it might have been slightly more efficient by using socketpair(), it
+would have then been even less portable than it already is.  The open2()
+and open3() functions are  unlikely to work anywhere except on a Unix
+system or some other one purporting to be POSIX compliant.
+
+Here's an example of using open2():
+
+    use FileHandle;
+    use IPC::Open2;
+    $pid = open2(*Reader, *Writer, "cat -u -n" );
+    print Writer "stuff\n";
+    $got = <Reader>;
+
+The problem with this is that Unix buffering is really going to
+ruin your day.  Even though your C<Writer> filehandle is auto-flushed,
+and the process on the other end will get your data in a timely manner,
+you can't usually do anything to force it to give it back to you
+in a similarly quick fashion.  In this case, we could, because we
+gave I<cat> a B<-u> flag to make it unbuffered.  But very few Unix
+commands are designed to operate over pipes, so this seldom works
+unless you yourself wrote the program on the other end of the
+double-ended pipe.
+
+A solution to this is the nonstandard F<Comm.pl> library.  It uses
+pseudo-ttys to make your program behave more reasonably:
+
+    require 'Comm.pl';
+    $ph = open_proc('cat -n');
+    for (1..10) {
+	print $ph "a line\n";
+	print "got back ", scalar <$ph>;
+    }
+
+This way you don't have to have control over the source code of the
+program you're using.  The F<Comm> library also has expect()
+and interact() functions.  Find the library (and we hope its
+successor F<IPC::Chat>) at your nearest CPAN archive as detailed
+in the SEE ALSO section below.
+
+The newer Expect.pm module from CPAN also addresses this kind of thing.
+This module requires two other modules from CPAN: IO::Pty and IO::Stty.
+It sets up a pseudo-terminal to interact with programs that insist on
+using talking to the terminal device driver.  If your system is
+amongst those supported, this may be your best bet.
+
+=head2 Bidirectional Communication with Yourself
+
+If you want, you may make low-level pipe() and fork()
+to stitch this together by hand.  This example only
+talks to itself, but you could reopen the appropriate
+handles to STDIN and STDOUT and call other processes.
+
+    #!/usr/bin/perl -w
+    # pipe1 - bidirectional communication using two pipe pairs
+    #         designed for the socketpair-challenged
+    use IO::Handle;	# thousands of lines just for autoflush :-(
+    pipe(PARENT_RDR, CHILD_WTR);		# XXX: failure?
+    pipe(CHILD_RDR,  PARENT_WTR);		# XXX: failure?
+    CHILD_WTR->autoflush(1);
+    PARENT_WTR->autoflush(1);
+
+    if ($pid = fork) {
+	close PARENT_RDR; close PARENT_WTR;
+	print CHILD_WTR "Parent Pid $$ is sending this\n";
+	chomp($line = <CHILD_RDR>);
+	print "Parent Pid $$ just read this: `$line'\n";
+	close CHILD_RDR; close CHILD_WTR;
+	waitpid($pid,0);
+    } else {
+	die "cannot fork: $!" unless defined $pid;
+	close CHILD_RDR; close CHILD_WTR;
+	chomp($line = <PARENT_RDR>);
+	print "Child Pid $$ just read this: `$line'\n";
+	print PARENT_WTR "Child Pid $$ is sending this\n";
+	close PARENT_RDR; close PARENT_WTR;
+	exit;
+    }
+
+But you don't actually have to make two pipe calls.  If you
+have the socketpair() system call, it will do this all for you.
+
+    #!/usr/bin/perl -w
+    # pipe2 - bidirectional communication using socketpair
+    #   "the best ones always go both ways"
+
+    use Socket;
+    use IO::Handle;	# thousands of lines just for autoflush :-(
+    # We say AF_UNIX because although *_LOCAL is the
+    # POSIX 1003.1g form of the constant, many machines
+    # still don't have it.
+    socketpair(CHILD, PARENT, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
+				or  die "socketpair: $!";
+
+    CHILD->autoflush(1);
+    PARENT->autoflush(1);
+
+    if ($pid = fork) {
+	close PARENT;
+	print CHILD "Parent Pid $$ is sending this\n";
+	chomp($line = <CHILD>);
+	print "Parent Pid $$ just read this: `$line'\n";
+	close CHILD;
+	waitpid($pid,0);
+    } else {
+	die "cannot fork: $!" unless defined $pid;
+	close CHILD;
+	chomp($line = <PARENT>);
+	print "Child Pid $$ just read this: `$line'\n";
+	print PARENT "Child Pid $$ is sending this\n";
+	close PARENT;
+	exit;
+    }
+
+=head1 Sockets: Client/Server Communication
+
+While not limited to Unix-derived operating systems (e.g., WinSock on PCs
+provides socket support, as do some VMS libraries), you may not have
+sockets on your system, in which case this section probably isn't going to do
+you much good.  With sockets, you can do both virtual circuits (i.e., TCP
+streams) and datagrams (i.e., UDP packets).  You may be able to do even more
+depending on your system.
+
+The Perl function calls for dealing with sockets have the same names as
+the corresponding system calls in C, but their arguments tend to differ
+for two reasons: first, Perl filehandles work differently than C file
+descriptors.  Second, Perl already knows the length of its strings, so you
+don't need to pass that information.
+
+One of the major problems with old socket code in Perl was that it used
+hard-coded values for some of the constants, which severely hurt
+portability.  If you ever see code that does anything like explicitly
+setting C<$AF_INET = 2>, you know you're in for big trouble:  An
+immeasurably superior approach is to use the C<Socket> module, which more
+reliably grants access to various constants and functions you'll need.
+
+If you're not writing a server/client for an existing protocol like
+NNTP or SMTP, you should give some thought to how your server will
+know when the client has finished talking, and vice-versa.  Most
+protocols are based on one-line messages and responses (so one party
+knows the other has finished when a "\n" is received) or multi-line
+messages and responses that end with a period on an empty line
+("\n.\n" terminates a message/response).
+
+=head2 Internet Line Terminators
+
+The Internet line terminator is "\015\012".  Under ASCII variants of
+Unix, that could usually be written as "\r\n", but under other systems,
+"\r\n" might at times be "\015\015\012", "\012\012\015", or something
+completely different.  The standards specify writing "\015\012" to be
+conformant (be strict in what you provide), but they also recommend
+accepting a lone "\012" on input (but be lenient in what you require).
+We haven't always been very good about that in the code in this manpage,
+but unless you're on a Mac, you'll probably be ok.
+
+=head2 Internet TCP Clients and Servers
+
+Use Internet-domain sockets when you want to do client-server
+communication that might extend to machines outside of your own system.
+
+Here's a sample TCP client using Internet-domain sockets:
+
+    #!/usr/bin/perl -w
+    use strict;
+    use Socket;
+    my ($remote,$port, $iaddr, $paddr, $proto, $line);
+
+    $remote  = shift || 'localhost';
+    $port    = shift || 2345;  # random port
+    if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
+    die "No port" unless $port;
+    $iaddr   = inet_aton($remote) 		|| die "no host: $remote";
+    $paddr   = sockaddr_in($port, $iaddr);
+
+    $proto   = getprotobyname('tcp');
+    socket(SOCK, PF_INET, SOCK_STREAM, $proto)	|| die "socket: $!";
+    connect(SOCK, $paddr)    || die "connect: $!";
+    while (defined($line = <SOCK>)) {
+	print $line;
+    }
+
+    close (SOCK)	    || die "close: $!";
+    exit;
+
+And here's a corresponding server to go along with it.  We'll
+leave the address as INADDR_ANY so that the kernel can choose
+the appropriate interface on multihomed hosts.  If you want sit
+on a particular interface (like the external side of a gateway
+or firewall machine), you should fill this in with your real address
+instead.
+
+    #!/usr/bin/perl -Tw
+    use strict;
+    BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
+    use Socket;
+    use Carp;
+    my $EOL = "\015\012";
+
+    sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
+
+    my $port = shift || 2345;
+    my $proto = getprotobyname('tcp');
+
+    ($port) = $port =~ /^(\d+)$/                        or die "invalid port";
+
+    socket(Server, PF_INET, SOCK_STREAM, $proto)	|| die "socket: $!";
+    setsockopt(Server, SOL_SOCKET, SO_REUSEADDR,
+					pack("l", 1)) 	|| die "setsockopt: $!";
+    bind(Server, sockaddr_in($port, INADDR_ANY))	|| die "bind: $!";
+    listen(Server,SOMAXCONN) 				|| die "listen: $!";
+
+    logmsg "server started on port $port";
+
+    my $paddr;
+
+    $SIG{CHLD} = \&REAPER;
+
+    for ( ; $paddr = accept(Client,Server); close Client) {
+	my($port,$iaddr) = sockaddr_in($paddr);
+	my $name = gethostbyaddr($iaddr,AF_INET);
+
+	logmsg "connection from $name [",
+		inet_ntoa($iaddr), "]
+		at port $port";
+
+	print Client "Hello there, $name, it's now ",
+			scalar localtime, $EOL;
+    }
+
+And here's a multithreaded version.  It's multithreaded in that
+like most typical servers, it spawns (forks) a slave server to
+handle the client request so that the master server can quickly
+go back to service a new client.
+
+    #!/usr/bin/perl -Tw
+    use strict;
+    BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
+    use Socket;
+    use Carp;
+    my $EOL = "\015\012";
+
+    sub spawn;  # forward declaration
+    sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
+
+    my $port = shift || 2345;
+    my $proto = getprotobyname('tcp');
+
+    ($port) = $port =~ /^(\d+)$/                        or die "invalid port";
+
+    socket(Server, PF_INET, SOCK_STREAM, $proto)	|| die "socket: $!";
+    setsockopt(Server, SOL_SOCKET, SO_REUSEADDR,
+					pack("l", 1)) 	|| die "setsockopt: $!";
+    bind(Server, sockaddr_in($port, INADDR_ANY))	|| die "bind: $!";
+    listen(Server,SOMAXCONN) 				|| die "listen: $!";
+
+    logmsg "server started on port $port";
+
+    my $waitedpid = 0;
+    my $paddr;
+
+    use POSIX ":sys_wait_h";
+    sub REAPER {
+	my $child;
+        while (($waitedpid = waitpid(-1,WNOHANG)) > 0) {
+	    logmsg "reaped $waitedpid" . ($? ? " with exit $?" : '');
+	}
+	$SIG{CHLD} = \&REAPER;  # loathe sysV
+    }
+
+    $SIG{CHLD} = \&REAPER;
+
+    for ( $waitedpid = 0;
+	  ($paddr = accept(Client,Server)) || $waitedpid;
+	  $waitedpid = 0, close Client)
+    {
+	next if $waitedpid and not $paddr;
+	my($port,$iaddr) = sockaddr_in($paddr);
+	my $name = gethostbyaddr($iaddr,AF_INET);
+
+	logmsg "connection from $name [",
+		inet_ntoa($iaddr), "]
+		at port $port";
+
+	spawn sub {
+	    $|=1;
+	    print "Hello there, $name, it's now ", scalar localtime, $EOL;
+	    exec '/usr/games/fortune'		# XXX: `wrong' line terminators
+		or confess "can't exec fortune: $!";
+	};
+
+    }
+
+    sub spawn {
+	my $coderef = shift;
+
+	unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') {
+	    confess "usage: spawn CODEREF";
+	}
+
+	my $pid;
+	if (!defined($pid = fork)) {
+	    logmsg "cannot fork: $!";
+	    return;
+	} elsif ($pid) {
+	    logmsg "begat $pid";
+	    return; # I'm the parent
+	}
+	# else I'm the child -- go spawn
+
+	open(STDIN,  "<&Client")   || die "can't dup client to stdin";
+	open(STDOUT, ">&Client")   || die "can't dup client to stdout";
+	## open(STDERR, ">&STDOUT") || die "can't dup stdout to stderr";
+	exit &$coderef();
+    }
+
+This server takes the trouble to clone off a child version via fork() for
+each incoming request.  That way it can handle many requests at once,
+which you might not always want.  Even if you don't fork(), the listen()
+will allow that many pending connections.  Forking servers have to be
+particularly careful about cleaning up their dead children (called
+"zombies" in Unix parlance), because otherwise you'll quickly fill up your
+process table.
+
+We suggest that you use the B<-T> flag to use taint checking (see L<perlsec>)
+even if we aren't running setuid or setgid.  This is always a good idea
+for servers and other programs run on behalf of someone else (like CGI
+scripts), because it lessens the chances that people from the outside will
+be able to compromise your system.
+
+Let's look at another TCP client.  This one connects to the TCP "time"
+service on a number of different machines and shows how far their clocks
+differ from the system on which it's being run:
+
+    #!/usr/bin/perl  -w
+    use strict;
+    use Socket;
+
+    my $SECS_of_70_YEARS = 2208988800;
+    sub ctime { scalar localtime(shift) }
+
+    my $iaddr = gethostbyname('localhost');
+    my $proto = getprotobyname('tcp');
+    my $port = getservbyname('time', 'tcp');
+    my $paddr = sockaddr_in(0, $iaddr);
+    my($host);
+
+    $| = 1;
+    printf "%-24s %8s %s\n",  "localhost", 0, ctime(time());
+
+    foreach $host (@ARGV) {
+	printf "%-24s ", $host;
+	my $hisiaddr = inet_aton($host)     || die "unknown host";
+	my $hispaddr = sockaddr_in($port, $hisiaddr);
+	socket(SOCKET, PF_INET, SOCK_STREAM, $proto)   || die "socket: $!";
+	connect(SOCKET, $hispaddr)          || die "bind: $!";
+	my $rtime = '    ';
+	read(SOCKET, $rtime, 4);
+	close(SOCKET);
+	my $histime = unpack("N", $rtime) - $SECS_of_70_YEARS;
+	printf "%8d %s\n", $histime - time, ctime($histime);
+    }
+
+=head2 Unix-Domain TCP Clients and Servers
+
+That's fine for Internet-domain clients and servers, but what about local
+communications?  While you can use the same setup, sometimes you don't
+want to.  Unix-domain sockets are local to the current host, and are often
+used internally to implement pipes.  Unlike Internet domain sockets, Unix
+domain sockets can show up in the file system with an ls(1) listing.
+
+    % ls -l /dev/log
+    srw-rw-rw-  1 root            0 Oct 31 07:23 /dev/log
+
+You can test for these with Perl's B<-S> file test:
+
+    unless ( -S '/dev/log' ) {
+	die "something's wicked with the log system";
+    }
+
+Here's a sample Unix-domain client:
+
+    #!/usr/bin/perl -w
+    use Socket;
+    use strict;
+    my ($rendezvous, $line);
+
+    $rendezvous = shift || 'catsock';
+    socket(SOCK, PF_UNIX, SOCK_STREAM, 0)	|| die "socket: $!";
+    connect(SOCK, sockaddr_un($rendezvous))	|| die "connect: $!";
+    while (defined($line = <SOCK>)) {
+	print $line;
+    }
+    exit;
+
+And here's a corresponding server.  You don't have to worry about silly
+network terminators here because Unix domain sockets are guaranteed
+to be on the localhost, and thus everything works right.
+
+    #!/usr/bin/perl -Tw
+    use strict;
+    use Socket;
+    use Carp;
+
+    BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
+    sub spawn;  # forward declaration
+    sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
+
+    my $NAME = 'catsock';
+    my $uaddr = sockaddr_un($NAME);
+    my $proto = getprotobyname('tcp');
+
+    socket(Server,PF_UNIX,SOCK_STREAM,0) 	|| die "socket: $!";
+    unlink($NAME);
+    bind  (Server, $uaddr) 			|| die "bind: $!";
+    listen(Server,SOMAXCONN)			|| die "listen: $!";
+
+    logmsg "server started on $NAME";
+
+    my $waitedpid;
+
+    use POSIX ":sys_wait_h";
+    sub REAPER {
+	my $child;
+        while (($waitedpid = waitpid(-1,WNOHANG)) > 0) {
+	    logmsg "reaped $waitedpid" . ($? ? " with exit $?" : '');
+	}
+	$SIG{CHLD} = \&REAPER;  # loathe sysV
+    }
+
+    $SIG{CHLD} = \&REAPER;
+
+
+    for ( $waitedpid = 0;
+	  accept(Client,Server) || $waitedpid;
+	  $waitedpid = 0, close Client)
+    {
+	next if $waitedpid;
+	logmsg "connection on $NAME";
+	spawn sub {
+	    print "Hello there, it's now ", scalar localtime, "\n";
+	    exec '/usr/games/fortune' or die "can't exec fortune: $!";
+	};
+    }
+
+    sub spawn {
+	my $coderef = shift;
+
+	unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') {
+	    confess "usage: spawn CODEREF";
+	}
+
+	my $pid;
+	if (!defined($pid = fork)) {
+	    logmsg "cannot fork: $!";
+	    return;
+	} elsif ($pid) {
+	    logmsg "begat $pid";
+	    return; # I'm the parent
+	}
+	# else I'm the child -- go spawn
+
+	open(STDIN,  "<&Client")   || die "can't dup client to stdin";
+	open(STDOUT, ">&Client")   || die "can't dup client to stdout";
+	## open(STDERR, ">&STDOUT") || die "can't dup stdout to stderr";
+	exit &$coderef();
+    }
+
+As you see, it's remarkably similar to the Internet domain TCP server, so
+much so, in fact, that we've omitted several duplicate functions--spawn(),
+logmsg(), ctime(), and REAPER()--which are exactly the same as in the
+other server.
+
+So why would you ever want to use a Unix domain socket instead of a
+simpler named pipe?  Because a named pipe doesn't give you sessions.  You
+can't tell one process's data from another's.  With socket programming,
+you get a separate session for each client: that's why accept() takes two
+arguments.
+
+For example, let's say that you have a long running database server daemon
+that you want folks from the World Wide Web to be able to access, but only
+if they go through a CGI interface.  You'd have a small, simple CGI
+program that does whatever checks and logging you feel like, and then acts
+as a Unix-domain client and connects to your private server.
+
+=head1 TCP Clients with IO::Socket
+
+For those preferring a higher-level interface to socket programming, the
+IO::Socket module provides an object-oriented approach.  IO::Socket is
+included as part of the standard Perl distribution as of the 5.004
+release.  If you're running an earlier version of Perl, just fetch
+IO::Socket from CPAN, where you'll also find modules providing easy
+interfaces to the following systems: DNS, FTP, Ident (RFC 931), NIS and
+NISPlus, NNTP, Ping, POP3, SMTP, SNMP, SSLeay, Telnet, and Time--just
+to name a few.
+
+=head2 A Simple Client
+
+Here's a client that creates a TCP connection to the "daytime"
+service at port 13 of the host name "localhost" and prints out everything
+that the server there cares to provide.
+
+    #!/usr/bin/perl -w
+    use IO::Socket;
+    $remote = IO::Socket::INET->new(
+			Proto    => "tcp",
+			PeerAddr => "localhost",
+			PeerPort => "daytime(13)",
+		    )
+		  or die "cannot connect to daytime port at localhost";
+    while ( <$remote> ) { print }
+
+When you run this program, you should get something back that
+looks like this:
+
+    Wed May 14 08:40:46 MDT 1997
+
+Here are what those parameters to the C<new> constructor mean:
+
+=over 4
+
+=item C<Proto>
+
+This is which protocol to use.  In this case, the socket handle returned
+will be connected to a TCP socket, because we want a stream-oriented
+connection, that is, one that acts pretty much like a plain old file.
+Not all sockets are this of this type.  For example, the UDP protocol
+can be used to make a datagram socket, used for message-passing.
+
+=item C<PeerAddr>
+
+This is the name or Internet address of the remote host the server is
+running on.  We could have specified a longer name like C<"www.perl.com">,
+or an address like C<"204.148.40.9">.  For demonstration purposes, we've
+used the special hostname C<"localhost">, which should always mean the
+current machine you're running on.  The corresponding Internet address
+for localhost is C<"127.1">, if you'd rather use that.
+
+=item C<PeerPort>
+
+This is the service name or port number we'd like to connect to.
+We could have gotten away with using just C<"daytime"> on systems with a
+well-configured system services file,[FOOTNOTE: The system services file
+is in I</etc/services> under Unix] but just in case, we've specified the
+port number (13) in parentheses.  Using just the number would also have
+worked, but constant numbers make careful programmers nervous.
+
+=back
+
+Notice how the return value from the C<new> constructor is used as
+a filehandle in the C<while> loop?  That's what's called an indirect
+filehandle, a scalar variable containing a filehandle.  You can use
+it the same way you would a normal filehandle.  For example, you
+can read one line from it this way:
+
+    $line = <$handle>;
+
+all remaining lines from is this way:
+
+    @lines = <$handle>;
+
+and send a line of data to it this way:
+
+    print $handle "some data\n";
+
+=head2 A Webget Client
+
+Here's a simple client that takes a remote host to fetch a document
+from, and then a list of documents to get from that host.  This is a
+more interesting client than the previous one because it first sends
+something to the server before fetching the server's response.
+
+    #!/usr/bin/perl -w
+    use IO::Socket;
+    unless (@ARGV > 1) { die "usage: $0 host document ..." }
+    $host = shift(@ARGV);
+    $EOL = "\015\012";
+    $BLANK = $EOL x 2;
+    foreach $document ( @ARGV ) {
+	$remote = IO::Socket::INET->new( Proto     => "tcp",
+					 PeerAddr  => $host,
+					 PeerPort  => "http(80)",
+				        );
+	unless ($remote) { die "cannot connect to http daemon on $host" }
+	$remote->autoflush(1);
+	print $remote "GET $document HTTP/1.0" . $BLANK;
+	while ( <$remote> ) { print }
+	close $remote;
+    }
+
+The web server handing the "http" service, which is assumed to be at
+its standard port, number 80.  If the web server you're trying to
+connect to is at a different port (like 1080 or 8080), you should specify
+as the named-parameter pair, C<< PeerPort => 8080 >>.  The C<autoflush>
+method is used on the socket because otherwise the system would buffer
+up the output we sent it.  (If you're on a Mac, you'll also need to
+change every C<"\n"> in your code that sends data over the network to
+be a C<"\015\012"> instead.)
+
+Connecting to the server is only the first part of the process: once you
+have the connection, you have to use the server's language.  Each server
+on the network has its own little command language that it expects as
+input.  The string that we send to the server starting with "GET" is in
+HTTP syntax.  In this case, we simply request each specified document.
+Yes, we really are making a new connection for each document, even though
+it's the same host.  That's the way you always used to have to speak HTTP.
+Recent versions of web browsers may request that the remote server leave
+the connection open a little while, but the server doesn't have to honor
+such a request.
+
+Here's an example of running that program, which we'll call I<webget>:
+
+    % webget www.perl.com /guanaco.html
+    HTTP/1.1 404 File Not Found
+    Date: Thu, 08 May 1997 18:02:32 GMT
+    Server: Apache/1.2b6
+    Connection: close
+    Content-type: text/html
+
+    <HEAD><TITLE>404 File Not Found</TITLE></HEAD>
+    <BODY><H1>File Not Found</H1>
+    The requested URL /guanaco.html was not found on this server.<P>
+    </BODY>
+
+Ok, so that's not very interesting, because it didn't find that
+particular document.  But a long response wouldn't have fit on this page.
+
+For a more fully-featured version of this program, you should look to
+the I<lwp-request> program included with the LWP modules from CPAN.
+
+=head2 Interactive Client with IO::Socket
+
+Well, that's all fine if you want to send one command and get one answer,
+but what about setting up something fully interactive, somewhat like
+the way I<telnet> works?  That way you can type a line, get the answer,
+type a line, get the answer, etc.
+
+This client is more complicated than the two we've done so far, but if
+you're on a system that supports the powerful C<fork> call, the solution
+isn't that rough.  Once you've made the connection to whatever service
+you'd like to chat with, call C<fork> to clone your process.  Each of
+these two identical process has a very simple job to do: the parent
+copies everything from the socket to standard output, while the child
+simultaneously copies everything from standard input to the socket.
+To accomplish the same thing using just one process would be I<much>
+harder, because it's easier to code two processes to do one thing than it
+is to code one process to do two things.  (This keep-it-simple principle
+a cornerstones of the Unix philosophy, and good software engineering as
+well, which is probably why it's spread to other systems.)
+
+Here's the code:
+
+    #!/usr/bin/perl -w
+    use strict;
+    use IO::Socket;
+    my ($host, $port, $kidpid, $handle, $line);
+
+    unless (@ARGV == 2) { die "usage: $0 host port" }
+    ($host, $port) = @ARGV;
+
+    # create a tcp connection to the specified host and port
+    $handle = IO::Socket::INET->new(Proto     => "tcp",
+				    PeerAddr  => $host,
+				    PeerPort  => $port)
+	   or die "can't connect to port $port on $host: $!";
+
+    $handle->autoflush(1);		# so output gets there right away
+    print STDERR "[Connected to $host:$port]\n";
+
+    # split the program into two processes, identical twins
+    die "can't fork: $!" unless defined($kidpid = fork());
+
+    # the if{} block runs only in the parent process
+    if ($kidpid) {
+	# copy the socket to standard output
+	while (defined ($line = <$handle>)) {
+	    print STDOUT $line;
+	}
+	kill("TERM", $kidpid);  		# send SIGTERM to child
+    }
+    # the else{} block runs only in the child process
+    else {
+	# copy standard input to the socket
+	while (defined ($line = <STDIN>)) {
+	    print $handle $line;
+	}
+    }
+
+The C<kill> function in the parent's C<if> block is there to send a
+signal to our child process (current running in the C<else> block)
+as soon as the remote server has closed its end of the connection.
+
+If the remote server sends data a byte at time, and you need that
+data immediately without waiting for a newline (which might not happen),
+you may wish to replace the C<while> loop in the parent with the
+following:
+
+    my $byte;
+    while (sysread($handle, $byte, 1) == 1) {
+	print STDOUT $byte;
+    }
+
+Making a system call for each byte you want to read is not very efficient
+(to put it mildly) but is the simplest to explain and works reasonably
+well.
+
+=head1 TCP Servers with IO::Socket
+
+As always, setting up a server is little bit more involved than running a client.
+The model is that the server creates a special kind of socket that
+does nothing but listen on a particular port for incoming connections.
+It does this by calling the C<< IO::Socket::INET->new() >> method with
+slightly different arguments than the client did.
+
+=over 4
+
+=item Proto
+
+This is which protocol to use.  Like our clients, we'll
+still specify C<"tcp"> here.
+
+=item LocalPort
+
+We specify a local
+port in the C<LocalPort> argument, which we didn't do for the client.
+This is service name or port number for which you want to be the
+server. (Under Unix, ports under 1024 are restricted to the
+superuser.)  In our sample, we'll use port 9000, but you can use
+any port that's not currently in use on your system.  If you try
+to use one already in used, you'll get an "Address already in use"
+message.  Under Unix, the C<netstat -a> command will show
+which services current have servers.
+
+=item Listen
+
+The C<Listen> parameter is set to the maximum number of
+pending connections we can accept until we turn away incoming clients.
+Think of it as a call-waiting queue for your telephone.
+The low-level Socket module has a special symbol for the system maximum, which
+is SOMAXCONN.
+
+=item Reuse
+
+The C<Reuse> parameter is needed so that we restart our server
+manually without waiting a few minutes to allow system buffers to
+clear out.
+
+=back
+
+Once the generic server socket has been created using the parameters
+listed above, the server then waits for a new client to connect
+to it.  The server blocks in the C<accept> method, which eventually accepts a
+bidirectional connection from the remote client.  (Make sure to autoflush
+this handle to circumvent buffering.)
+
+To add to user-friendliness, our server prompts the user for commands.
+Most servers don't do this.  Because of the prompt without a newline,
+you'll have to use the C<sysread> variant of the interactive client above.
+
+This server accepts one of five different commands, sending output
+back to the client.  Note that unlike most network servers, this one
+only handles one incoming client at a time.  Multithreaded servers are
+covered in Chapter 6 of the Camel.
+
+Here's the code.  We'll
+
+ #!/usr/bin/perl -w
+ use IO::Socket;
+ use Net::hostent;		# for OO version of gethostbyaddr
+
+ $PORT = 9000;			# pick something not in use
+
+ $server = IO::Socket::INET->new( Proto     => 'tcp',
+                                  LocalPort => $PORT,
+                                  Listen    => SOMAXCONN,
+                                  Reuse     => 1);
+
+ die "can't setup server" unless $server;
+ print "[Server $0 accepting clients]\n";
+
+ while ($client = $server->accept()) {
+   $client->autoflush(1);
+   print $client "Welcome to $0; type help for command list.\n";
+   $hostinfo = gethostbyaddr($client->peeraddr);
+   printf "[Connect from %s]\n", $hostinfo ? $hostinfo->name : $client->peerhost;
+   print $client "Command? ";
+   while ( <$client>) {
+     next unless /\S/;	     # blank line
+     if    (/quit|exit/i)    { last;                                     }
+     elsif (/date|time/i)    { printf $client "%s\n", scalar localtime;  }
+     elsif (/who/i )         { print  $client `who 2>&1`;                }
+     elsif (/cookie/i )      { print  $client `/usr/games/fortune 2>&1`; }
+     elsif (/motd/i )        { print  $client `cat /etc/motd 2>&1`;      }
+     else {
+       print $client "Commands: quit date who cookie motd\n";
+     }
+   } continue {
+      print $client "Command? ";
+   }
+   close $client;
+ }
+
+=head1 UDP: Message Passing
+
+Another kind of client-server setup is one that uses not connections, but
+messages.  UDP communications involve much lower overhead but also provide
+less reliability, as there are no promises that messages will arrive at
+all, let alone in order and unmangled.  Still, UDP offers some advantages
+over TCP, including being able to "broadcast" or "multicast" to a whole
+bunch of destination hosts at once (usually on your local subnet).  If you
+find yourself overly concerned about reliability and start building checks
+into your message system, then you probably should use just TCP to start
+with.
+
+Note that UDP datagrams are I<not> a bytestream and should not be treated
+as such. This makes using I/O mechanisms with internal buffering
+like stdio (i.e. print() and friends) especially cumbersome. Use syswrite(),
+or better send(), like in the example below.
+
+Here's a UDP program similar to the sample Internet TCP client given
+earlier.  However, instead of checking one host at a time, the UDP version
+will check many of them asynchronously by simulating a multicast and then
+using select() to do a timed-out wait for I/O.  To do something similar
+with TCP, you'd have to use a different socket handle for each host.
+
+    #!/usr/bin/perl -w
+    use strict;
+    use Socket;
+    use Sys::Hostname;
+
+    my ( $count, $hisiaddr, $hispaddr, $histime,
+	 $host, $iaddr, $paddr, $port, $proto,
+	 $rin, $rout, $rtime, $SECS_of_70_YEARS);
+
+    $SECS_of_70_YEARS      = 2208988800;
+
+    $iaddr = gethostbyname(hostname());
+    $proto = getprotobyname('udp');
+    $port = getservbyname('time', 'udp');
+    $paddr = sockaddr_in(0, $iaddr); # 0 means let kernel pick
+
+    socket(SOCKET, PF_INET, SOCK_DGRAM, $proto)   || die "socket: $!";
+    bind(SOCKET, $paddr)                          || die "bind: $!";
+
+    $| = 1;
+    printf "%-12s %8s %s\n",  "localhost", 0, scalar localtime time;
+    $count = 0;
+    for $host (@ARGV) {
+	$count++;
+	$hisiaddr = inet_aton($host) 	|| die "unknown host";
+	$hispaddr = sockaddr_in($port, $hisiaddr);
+	defined(send(SOCKET, 0, 0, $hispaddr))    || die "send $host: $!";
+    }
+
+    $rin = '';
+    vec($rin, fileno(SOCKET), 1) = 1;
+
+    # timeout after 10.0 seconds
+    while ($count && select($rout = $rin, undef, undef, 10.0)) {
+	$rtime = '';
+	($hispaddr = recv(SOCKET, $rtime, 4, 0)) 	|| die "recv: $!";
+	($port, $hisiaddr) = sockaddr_in($hispaddr);
+	$host = gethostbyaddr($hisiaddr, AF_INET);
+	$histime = unpack("N", $rtime) - $SECS_of_70_YEARS;
+	printf "%-12s ", $host;
+	printf "%8d %s\n", $histime - time, scalar localtime($histime);
+	$count--;
+    }
+
+Note that this example does not include any retries and may consequently
+fail to contact a reachable host. The most prominent reason for this
+is congestion of the queues on the sending host if the number of
+list of hosts to contact is sufficiently large.
+
+=head1 SysV IPC
+
+While System V IPC isn't so widely used as sockets, it still has some
+interesting uses.  You can't, however, effectively use SysV IPC or
+Berkeley mmap() to have shared memory so as to share a variable amongst
+several processes.  That's because Perl would reallocate your string when
+you weren't wanting it to.
+
+Here's a small example showing shared memory usage.
+
+    use IPC::SysV qw(IPC_PRIVATE IPC_RMID S_IRWXU);
+
+    $size = 2000;
+    $id = shmget(IPC_PRIVATE, $size, S_IRWXU) || die "$!";
+    print "shm key $id\n";
+
+    $message = "Message #1";
+    shmwrite($id, $message, 0, 60) || die "$!";
+    print "wrote: '$message'\n";
+    shmread($id, $buff, 0, 60) || die "$!";
+    print "read : '$buff'\n";
+
+    # the buffer of shmread is zero-character end-padded.
+    substr($buff, index($buff, "\0")) = '';
+    print "un" unless $buff eq $message;
+    print "swell\n";
+
+    print "deleting shm $id\n";
+    shmctl($id, IPC_RMID, 0) || die "$!";
+
+Here's an example of a semaphore:
+
+    use IPC::SysV qw(IPC_CREAT);
+
+    $IPC_KEY = 1234;
+    $id = semget($IPC_KEY, 10, 0666 | IPC_CREAT ) || die "$!";
+    print "shm key $id\n";
+
+Put this code in a separate file to be run in more than one process.
+Call the file F<take>:
+
+    # create a semaphore
+
+    $IPC_KEY = 1234;
+    $id = semget($IPC_KEY,  0 , 0 );
+    die if !defined($id);
+
+    $semnum = 0;
+    $semflag = 0;
+
+    # 'take' semaphore
+    # wait for semaphore to be zero
+    $semop = 0;
+    $opstring1 = pack("s!s!s!", $semnum, $semop, $semflag);
+
+    # Increment the semaphore count
+    $semop = 1;
+    $opstring2 = pack("s!s!s!", $semnum, $semop,  $semflag);
+    $opstring = $opstring1 . $opstring2;
+
+    semop($id,$opstring) || die "$!";
+
+Put this code in a separate file to be run in more than one process.
+Call this file F<give>:
+
+    # 'give' the semaphore
+    # run this in the original process and you will see
+    # that the second process continues
+
+    $IPC_KEY = 1234;
+    $id = semget($IPC_KEY, 0, 0);
+    die if !defined($id);
+
+    $semnum = 0;
+    $semflag = 0;
+
+    # Decrement the semaphore count
+    $semop = -1;
+    $opstring = pack("s!s!s!", $semnum, $semop, $semflag);
+
+    semop($id,$opstring) || die "$!";
+
+The SysV IPC code above was written long ago, and it's definitely
+clunky looking.  For a more modern look, see the IPC::SysV module
+which is included with Perl starting from Perl 5.005.
+
+A small example demonstrating SysV message queues:
+
+    use IPC::SysV qw(IPC_PRIVATE IPC_RMID IPC_CREAT S_IRWXU);
+
+    my $id = msgget(IPC_PRIVATE, IPC_CREAT | S_IRWXU);
+
+    my $sent = "message";
+    my $type_sent = 1234;
+    my $rcvd;
+    my $type_rcvd;
+
+    if (defined $id) {
+        if (msgsnd($id, pack("l! a*", $type_sent, $sent), 0)) {
+            if (msgrcv($id, $rcvd, 60, 0, 0)) {
+                ($type_rcvd, $rcvd) = unpack("l! a*", $rcvd);
+                if ($rcvd eq $sent) {
+                    print "okay\n";
+                } else {
+                    print "not okay\n";
+                }
+            } else {
+                die "# msgrcv failed\n";
+            }
+        } else {
+            die "# msgsnd failed\n";
+        }
+        msgctl($id, IPC_RMID, 0) || die "# msgctl failed: $!\n";
+    } else {
+        die "# msgget failed\n";
+    }
+
+=head1 NOTES
+
+Most of these routines quietly but politely return C<undef> when they
+fail instead of causing your program to die right then and there due to
+an uncaught exception.  (Actually, some of the new I<Socket> conversion
+functions  croak() on bad arguments.)  It is therefore essential to
+check return values from these functions.  Always begin your socket
+programs this way for optimal success, and don't forget to add B<-T>
+taint checking flag to the #! line for servers:
+
+    #!/usr/bin/perl -Tw
+    use strict;
+    use sigtrap;
+    use Socket;
+
+=head1 BUGS
+
+All these routines create system-specific portability problems.  As noted
+elsewhere, Perl is at the mercy of your C libraries for much of its system
+behaviour.  It's probably safest to assume broken SysV semantics for
+signals and to stick with simple TCP and UDP socket operations; e.g., don't
+try to pass open file descriptors over a local UDP datagram socket if you
+want your code to stand a chance of being portable.
+
+=head1 AUTHOR
+
+Tom Christiansen, with occasional vestiges of Larry Wall's original
+version and suggestions from the Perl Porters.
+
+=head1 SEE ALSO
+
+There's a lot more to networking than this, but this should get you
+started.
+
+For intrepid programmers, the indispensable textbook is I<Unix
+Network Programming, 2nd Edition, Volume 1> by W. Richard Stevens
+(published by Prentice-Hall).  Note that most books on networking
+address the subject from the perspective of a C programmer; translation
+to Perl is left as an exercise for the reader.
+
+The IO::Socket(3) manpage describes the object library, and the Socket(3)
+manpage describes the low-level interface to sockets.  Besides the obvious
+functions in L<perlfunc>, you should also check out the F<modules> file
+at your nearest CPAN site.  (See L<perlmodlib> or best yet, the F<Perl
+FAQ> for a description of what CPAN is and where to get it.)
+
+Section 5 of the F<modules> file is devoted to "Networking, Device Control
+(modems), and Interprocess Communication", and contains numerous unbundled
+modules numerous networking modules, Chat and Expect operations, CGI
+programming, DCE, FTP, IPC, NNTP, Proxy, Ptty, RPC, SNMP, SMTP, Telnet,
+Threads, and ToolTalk--just to name a few.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlirix.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlirix.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlirix.pod	(revision 14489)
@@ -0,0 +1,141 @@
+If you read this file _as_is_, just ignore the funny characters you
+see.  It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.irix - Perl version 5 on Irix systems
+
+=head1 DESCRIPTION
+
+This document describes various features of Irix that will affect how Perl
+version 5 (hereafter just Perl) is compiled and/or runs.
+
+=head2 Building 32-bit Perl in Irix
+
+Use
+
+	sh Configure -Dcc='cc -n32'
+
+to compile Perl 32-bit.  Don't bother with -n32 unless you have 7.1
+or later compilers (use cc -version to check).
+
+(Building 'cc -n32' is the default.)
+
+=head2 Building 64-bit Perl in Irix
+
+Use
+
+	sh Configure -Dcc='cc -64' -Duse64bitint
+
+This requires require a 64-bit MIPS CPU (R8000, R10000, ...)
+
+You can also use
+
+	sh Configure -Dcc='cc -64' -Duse64bitall
+
+but that makes no difference compared with the -Duse64bitint because
+of the C<cc -64>.
+
+You can also do
+
+	sh Configure -Dcc='cc -n32' -Duse64bitint
+
+to use long longs for the 64-bit integer type, in case you don't
+have a 64-bit CPU.
+
+If you are using gcc, just
+
+	sh Configure -Dcc=gcc -Duse64bitint
+
+should be enough, the Configure should automatically probe for the
+correct 64-bit settings.
+
+=head2 About Compiler Versions of Irix
+
+Some Irix cc versions, e.g. 7.3.1.1m (try cc -version) have been known
+to have issues (coredumps) when compiling perl.c.  If you've used
+-OPT:fast_io=ON and this happens, try removing it.  If that fails, or
+you didn't use that, then try adjusting other optimization options
+(-LNO, -INLINE, -O3 to -O2, etcetera).  The compiler bug has been
+reported to SGI.  (Allen Smith <easmith@beatrice.rutgers.edu>)
+
+=head2 Linker Problems in Irix
+
+If you get complaints about so_locations then search in the file
+hints/irix_6.sh for "lddflags" and do the suggested adjustments.
+(David Billinghurst <David.Billinghurst@riotinto.com.au>)
+
+=head2 Malloc in Irix
+
+Do not try to use Perl's malloc, this will lead into very mysterious
+errors (especially with -Duse64bitall).
+
+=head2 Building with threads in Irix
+
+Run Configure with -Duseithreads which will configure Perl with
+the new Perl 5.8.0 "interpreter threads", see L<threads>.
+
+The old Perl 5.005 threads is obsolete, unmaintained, and its use is
+discouraged.  If you really want it, run Configure with the
+-Dusethreads -Duse5005threads options as described in INSTALL.
+
+For either thread model and for Irix 6.2, you have to have the
+following patches installed:
+
+        1404 Irix 6.2 Posix 1003.1b man pages
+        1645 Irix 6.2 & 6.3 POSIX header file updates
+        2000 Irix 6.2 Posix 1003.1b support modules
+        2254 Pthread library fixes
+        2401 6.2 all platform kernel rollup
+
+B<IMPORTANT>: Without patch 2401, a kernel bug in Irix 6.2 will cause
+your machine to panic and crash when running threaded perl.  Irix 6.3
+and later are okay.
+
+    Thanks to Hannu Napari <Hannu.Napari@hut.fi> for the IRIX
+    pthreads patches information.
+
+=head2 Irix 5.3
+
+While running Configure and when building, you are likely to get
+quite a few of these warnings:
+
+  ld:
+  The shared object /usr/lib/libm.so did not resolve any symbols.
+        You may want to remove it from your link line.
+
+Ignore them: in IRIX 5.3 there is no way to quieten ld about this.
+
+During compilation you will see this warning from toke.c:
+
+  uopt: Warning: Perl_yylex: this procedure not optimized because it
+        exceeds size threshold; to optimize this procedure, use -Olimit option
+        with value >= 4252.
+
+Ignore the warning.
+
+In IRIX 5.3 and with Perl 5.8.1 (Perl 5.8.0 didn't compile in IRIX 5.3)
+the following failures are known.
+
+ Failed Test                  Stat Wstat Total Fail  Failed  List of Failed
+ --------------------------------------------------------------------------
+ ../ext/List/Util/t/shuffle.t    0   139    ??   ??       %  ??
+ ../lib/Math/Trig.t            255 65280    29   12  41.38%  24-29
+ ../lib/sort.t                   0   138   119   72  60.50%  48-119
+ 56 tests and 474 subtests skipped.
+ Failed 3/811 test scripts, 99.63% okay. 78/75813 subtests failed, 99.90% okay.
+
+They are suspected to be compiler errors (at least the shuffle.t
+failure is known from some IRIX 6 setups) and math library errors
+(the Trig.t failure), but since IRIX 5 is long since end-of-lifed,
+further fixes for the IRIX are unlikely.  If you can get gcc for 5.3,
+you could try that, too, since gcc in IRIX 6 is a known workaround for
+at least the shuffle.t and sort.t failures.
+
+=head1 AUTHOR
+
+Jarkko Hietaniemi <jhi@iki.fi>
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perljp.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perljp.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perljp.pod	(revision 14489)
@@ -0,0 +1,204 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+The following documentation is written in euc-jp encoding.
+
+=head1 NAME
+
+perljp - ÆüËÜžì Perl ¥¬¥€¥É
+
+=head1 ÀâÌÀ
+
+Perl €ÎÀ€³Š€Ø€è€Š€³€œ!
+
+Perl 5.8.0 €è€ê¡¢Unicode¥µ¥Ý¡Œ¥È€¬ÂçÉý€Ë¶¯²œ€µ€ì¡¢€œ€Î·ë²Ì¥é¥Æ¥óÊž»ú°Ê³°€ÎÊž»ú¥³¡Œ¥É€Î¥µ¥Ý¡Œ¥È€¬ CJK (Ãæ¹ñžì¡¢ÆüËÜžì¡¢¥Ï¥ó¥°¥ë)€òŽÞ€á€Æ²Ã€ï€ê€Þ€·€¿¡£Unicode€ÏÀ€³ŠÃæ€ÎÊž»ú€ò°ì€Ä€ÎÊž»ú¥³¡Œ¥É€Ç°·€Š€³€È€òÌÜ»Ø€·€¿Éžœàµ¬³Ê€Ç€¢€ê¡¢Åì€«€éÀŸ¡¢€Ï€¿€Þ€¿€œ€ÎŽÖ€ÎÊž»ú¡Ê¥®¥ê¥·¥ãÊž»ú¡¢¥­¥ê¡Œ¥ëÊž»ú¡¢¥¢¥é¥Ó¥¢Êž»ú¡¢¥Ø¥Ö¥é¥€Êž»ú¡¢¥Ç¥£¡Œ¥ô¥¡¥Ê¥¬¡Œ¥êÊž»ú¡¢€Ê€É€Ê€É¡Ë€ä¡¢€³€ì€Þ€Ç€ÏOS¥Ù¥ó¥À¡Œ€¬ÆÈŒ«€ËÄê€á€Æ€€€¿Êž»ú(PC€ª€è€ÓMacintosh)€¬€¹€Ç€ËŽÞ€Þ€ì€Æ€€€Þ€¹¡£
+
+Perl Œ«¿È€Ï Unicode €ÇÆ°ºî€·€Þ€¹¡£Perl ¥¹¥¯¥ê¥×¥ÈÆâ€ÎÊž»úÎó¥ê¥Æ¥é¥ë€äÀµµ¬Éœžœ€Ï Unicode €òÁ°Äó€È€·€Æ€€€Þ€¹¡£€œ€·€ÆÆþœÐÎÏ€Î€¿€á€Ë€Ï¡¢€³€ì€Þ€Ç»È€ï€ì€Æ€­€¿€µ€Þ€¶€Þ€ÊÊž»ú¥³¡Œ¥É€ËÂÐ±þ€¹€ë¥â¥ž¥å¡Œ¥ë¡¢¡Ö Encode ¡×€¬ÉžœàÁõÈ÷€µ€ì€Æ€ª€ê¡¢Unicode €È€³€ì€é€ÎÊž»ú¥³¡Œ¥É€ÎÁêžßÊÑŽ¹€âŽÊÃ±€Ë¹Ô€š€ë€è€Š€Ë€Ê€Ã€Æ€€€Þ€¹¡£
+
+žœ»þÅÀ€Ç Encode €¬¥µ¥Ý¡Œ¥È€¹€ëÊž»ú¥³¡Œ¥É€Ï°Ê²Œ€Î€È€ª€ê€Ç€¹¡£
+
+  7bit-jis      AdobeStandardEncoding AdobeSymbol       AdobeZdingbat
+  ascii             big5              big5-hkscs        cp1006
+  cp1026            cp1047            cp1250            cp1251
+  cp1252            cp1253            cp1254            cp1255
+  cp1256            cp1257            cp1258            cp37
+  cp424             cp437             cp500             cp737
+  cp775             cp850             cp852             cp855
+  cp856             cp857             cp860             cp861
+  cp862             cp863             cp864             cp865
+  cp866             cp869             cp874             cp875
+  cp932             cp936             cp949             cp950
+  dingbats          euc-cn            euc-jp            euc-kr
+  gb12345-raw       gb2312-raw        gsm0338           hp-roman8
+  hz                iso-2022-jp       iso-2022-jp-1     iso-8859-1
+  iso-8859-10       iso-8859-11       iso-8859-13       iso-8859-14
+  iso-8859-15       iso-8859-16       iso-8859-2        iso-8859-3
+  iso-8859-4        iso-8859-5        iso-8859-6        iso-8859-7
+  iso-8859-8        iso-8859-9        iso-ir-165        jis0201-raw
+  jis0208-raw       jis0212-raw       johab             koi8-f
+  koi8-r            koi8-u            ksc5601-raw       MacArabic
+  MacCentralEurRoman  MacChineseSimp    MacChineseTrad    MacCroatian
+  MacCyrillic       MacDingbats       MacFarsi          MacGreek
+  MacHebrew         MacIcelandic      MacJapanese       MacKorean
+  MacRoman          MacRomanian       MacRumanian       MacSami
+  MacSymbol         MacThai           MacTurkish        MacUkrainian
+  nextstep          posix-bc          shiftjis          symbol
+  UCS-2BE           UCS-2LE           UTF-16            UTF-16BE
+  UTF-16LE          UTF-32            UTF-32BE          UTF-32LE
+  utf8              viscii                              
+
+(ÁŽ114ŒïÎà)
+
+Îã€š€Ð¡¢Êž»ú¥³¡Œ¥ÉFOO€Î¥Õ¥¡¥€¥ë€òUTF-8€ËÊÑŽ¹€¹€ë€Ë€Ï¡¢°Ê²Œ€Î€è€Š€Ë€·€Þ€¹¡£
+
+    perl -Mencoding=FOO,STDOUT,utf8 -pe1 < file.FOO > file.utf8
+
+€Þ€¿¡¢Perl€Ë€Ï¡¢ÁŽÉô€¬Perl€Çœñ€«€ì€¿Êž»ú¥³¡Œ¥ÉÊÑŽ¹¥æ¡Œ¥Æ¥£¥ê¥Æ¥£¡¢piconv€âÉÕÂ°€·€Æ€€€ë€Î€Ç¡¢°Ê²Œ€Î€è€Š€Ë€¹€ë€³€È€â€Ç€­€Þ€¹¡£
+
+   piconv -f FOO -t utf8 < file.FOO > file.utf8
+   piconv -f utf8 -t FOO < file.utf8 > file.FOO
+
+=head2 About (jcode.pl|Jcode.pm|JPerl)
+
+5.8°ÊÁ°€Î¡¢¥¹¥¯¥ê¥×¥È€¬EUC-JP€Ç€¢€ì€Ð¥ê¥Æ¥é¥ë€À€±€Ï°·€Š€³€È€¬€Ç€­€Þ€·€¿¡£€Þ€¿¡¢ÆþœÐÎÏ€ò°·€Š¥â¥ž¥å¡Œ¥ë€È€·€Æ€ÏJcode.pm€¬( http://openlab.jp/Jcode/ )¡¢perl4ÍÑ€Î¥æ¡Œ¥Æ¥£¥ê¥Æ¥£€È€·€Æ€Ïjcode.pl( http://srekcah.org/jcode/ )€¬€œ€ì€Ÿ€ìÂžºß€·¡¢ÆüËÜžì€Î°·€š€ëCGI€Ç€è€¯ÍøÍÑ€µ€ì€Æ€€€ë€³€È€òžæÂž€ž€ÎÊý€âŸ¯€Ê€¯€Ê€€€«€È»×€ï€ì€Þ€¹¡£€¿€À€·¡¢ÆüËÜžì€Ë€è€ëÀµµ¬Éœžœ€ò€Š€Þ€¯°·€Š€³€È€ÏÉÔ²ÄÇœ€Ç€·€¿¡£
+
+5.005°ÊÁ°€ÎPerl€Ë€Ï¡¢ÆüËÜžì€ËÆÃ²œ€·€¿¥í¡Œ¥«¥é¥€¥ºÈÇ¡¢Jperl€¬Âžºß€·€Þ€·€¿( http://homepage2.nifty.com/kipp/perl/jperl/index.html )¡£€Þ€¿¡¢Mac OS 9.x/ClassicÍÑ€ÎPerl¡¢MacPerl€ÎÆüËÜžìÈÇ€âMacJPerl€È€·€ÆÂžºß€·€Æ€Þ€·€¿¡£( http://world.std.com/~habilis/macjperl/ ).€³€ì€é€Ç€ÏÊž»ú¥³¡Œ¥É€È€·€ÆEUC-JP€Ë²Ã€šShift_JIS€â€œ€Î€Þ€Þ°·€Š€³€È€¬€Ç€­¡¢€Þ€¿ÆüËÜžì€Ë€è€ëÀµµ¬Éœžœ€ò°·€Š€³€È€â²ÄÇœ€Ç€·€¿¡£
+
+Perl5.8€Ç€Ï¡¢€³€ì€é€Îµ¡Çœ€¬€¹€Ù€ÆPerlËÜÂÎ€À€±€ÇŒÂžœ€Ç€­€ëŸå€Ë¡¢ÆüËÜžì€Î€ß€Ê€é€ºŸåµ­114€ÎÊž»ú¥³¡Œ¥É€ò€¹€Ù€Æ¡¢€·€«€âÆ±»þ€Ë°·€Š€³€È€¬€Ç€­€Þ€¹¡£€µ€é€Ë¡¢CPAN€Ê€É€«€é¿·€·€€Êž»ú¥³¡Œ¥ÉÍÑ€Î¥â¥ž¥å¡Œ¥ë€òÆþŒê€¹€ë€³€È€âŽÊÃ±€Ë€Ç€­€ë€è€Š€Ë€Ê€Ã€Æ€€€Þ€¹¡£
+
+=over 4
+
+=item *
+
+ÆþœÐÎÏ
+
+°Ê²Œ€ÎÎã€Ï€€€Å€ì€âShift_JIS€ÎÆþÎÏ€òEUC-JP€ËÊÑŽ¹€·€ÆœÐÎÏ€·€Þ€¹¡£
+
+  # jcode.pl
+  require "jcode.pl";
+  while(<>){
+    jcode::convert(*_, 'euc', 'sjis');
+    print;
+  }
+  # Jcode.pm
+  use Jcode;
+  while(<>){
+  	print Jcode->new($_, 'sjis')->euc;
+  }
+  # Perl 5.8
+  use Encode;
+  while(<>){
+    from_to($_, 'shiftjis', 'euc-jp');
+    print;
+  }
+  # Perl 5.8 - encoding €òÍøÍÑ€·€Æ
+  use encoding 'euc-jp', STDIN => 'shiftjis';
+  while(<>){
+  	print;
+  }
+
+=item *
+
+Jperl žßŽ¹¥¹¥¯¥ê¥×¥È
+
+ €€€ï€æ€ë"shebang"€òÊÑ¹¹€¹€ë€À€±€Ç¡¢JperlÍÑ€Îscript€Î€Û€È€ó€É€ÏÊÑ¹¹€Ê€·€ËÍøÍÑ²ÄÇœ€À€È»×€ï€ì€Þ€¹¡£
+
+   #!/path/to/jperl
+   ¢­
+   #!/path/to/perl -Mencoding=euc-jp
+
+ ŸÜ€·€¯€Ï perldoc encoding €ò»²ŸÈ€·€Æ€¯€À€µ€€¡£
+
+=back
+
+=head2 €µ€é€ËŸÜ€·€¯
+
+Perl€Ë€ÏËÄÂç€Ê»ñÎÁ€¬ÉÕÂ°€·€Æ€ª€ê¡¢Perl€Î¿·µ¡Çœ€äUnicode¥µ¥Ý¡Œ¥È¡¢€œ€·€ÆEncode¥â¥ž¥å¡Œ¥ë€Î»ÈÍÑË¡€Ê€É€¬ºÙ€«€¯ÌÖÍå€µ€ì€Æ€€€Þ€¹¡Ê»ÄÇ°€Ê€¬€é¡¢€Û€È€ó€É±Ñžì€Ç€Ï€¢€ê€Þ€¹€¬¡Ë¡£°Ê²Œ€Î¥³¥Þ¥ó¥É€Ç€œ€ì€é€Î°ìÉô€ò±ÜÍ÷€¹€ë€³€È€¬²ÄÇœ€Ç€¹¡£
+
+  perldoc perlunicode # Perl€ÎUnicode¥µ¥Ý¡Œ¥ÈÁŽÈÌ
+  perldoc Encode      # Encode¥â¥ž¥å¡Œ¥ë€ËŽØ€·€Æ
+  perldoc Encode::JP  # €Š€ÁÆüËÜžìÊž»ú¥³¡Œ¥É€ËŽØ€·€Æ
+
+=head2 PerlÁŽÈÌ€ËŽØ€¹€ë URL
+
+=over 4
+
+=item L<http://www.perl.com/>
+
+Perl ¥Û¡Œ¥à¥Ú¡Œ¥ž (O'Reilly and Associates)
+
+=item L<http://www.cpan.org/>
+
+CPAN (Comprehensive Perl Archive Network)
+
+=item L<http://lists.perl.org/>
+
+Perl ¥á¡Œ¥ê¥ó¥°¥ê¥¹¥Èœž
+
+=back
+
+=head2 Perl€Îœ€ÆÀ€ËÌòÎ©€Ä URL
+
+=over 4
+
+=item L<http://www.oreilly.com.tw/chinese/>
+
+O'Reilly ŒÒ€ÎPerlŽØÏ¢œñÀÒ(ÈËÂÎ»úÃæ¹ñžì)
+
+=item L<http://www.oreilly.com.cn/chinese/>
+
+O'Reilly ŒÒ€ÎPerlŽØÏ¢œñÀÒ(ŽÊÂÎ»úÃæ¹ñžì)
+
+=item L<http://www.oreilly.co.jp/catalog.htm>
+
+¥ª¥é¥€¥ê¡ŒŒÒ€ÎPerlŽØÏ¢œñÀÒ(ÆüËÜžì)
+
+=back
+
+=head2 Perl ¥æ¡Œ¥¶¡Œ¥°¥ë¡Œ¥×
+
+=over 4
+
+=item L<http://www.pm.org/groups/asia.shtml#China>
+
+Ãæ¹ñ¡ÊÃæ²Ú¿ÍÌ±¶ŠÏÂ¹ñ¡Ë
+
+=item L<http://www.pm.org/groups/asia.shtml#Japan>
+
+ÆüËÜ
+
+=item L<http://www.pm.org/groups/asia.shtml#Korea%20(Republic%20of)>
+
+ŽÚ¹ñ¡ÊÂçŽÚÌ±¹ñ¡Ë
+
+=item L<http://www.pm.org/groups/asia.shtml#Taiwan>
+
+ÂæÏÑ¡ÊÃæ²ÚÌ±¹ñ¡Ë
+
+=back
+
+=head2 UnicodeŽØÏ¢€ÎURL
+
+=over 4
+
+=item L<http://www.unicode.org/>
+
+Unicode ¥³¥ó¥œ¡Œ¥·¥¢¥à (Unicodeµ¬³Ê€ÎÁªÄêÃÄÂÎ)
+
+=item L<http://www.cl.cam.ac.uk/%7Emgk25/unicode.html>
+
+UTF-8 and Unicode FAQ for Unix/Linux
+
+=item L<http://kldp.org/Translations/html/UTF8-Unicode-KLDP/UTF8-Unicode-KLDP.html>
+
+UTF-8 and Unicode FAQ for Unix/Linux (¥Ï¥ó¥°¥ëÌõ)
+
+=back
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi E<lt>jhi@iki.fiE<gt>
+Dan Kogai (Ÿ®»ô¡¡ÃÆ) E<lt>dankogai@dan.co.jpE<gt>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlko.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlko.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlko.pod	(revision 14489)
@@ -0,0 +1,218 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+This file is in Korean encoded in EUC-KR. 
+
+ÀÌ ¹®Œ­žŠ perldocÀ» œáŒ­ ºžÁö ŸÊ°í Á÷Á¢ ºžŽÂ °æ¿ì¿¡ŽÂ °¢ ºÎºÐÀÇ
+¿ªÇÒÀ» Ç¥œÃÇÏ±â À§ÇØ Ÿ²ÀÎ =head, =item, 'L' µîÀº ¹«œÃÇÏœÊœÃ¿À.
+ÀÌ ¹®Œ­ŽÂ µû·Î perldocÀ» Ÿ²Áö ŸÊ°í ºžŽõ¶óµµ ÀÐŽÂµ¥ º° ÁöÀåÀÌ
+ŸøŽÂ POD ÇüœÄÀž·Î Â¥¿© ÀÖœÀŽÏŽÙ.  Žõ ÀÚŒŒÇÑ °ÍÀº perlpod
+žÅŽºŸóÀ» Âü°íÇÏœÊœÃ¿À. 
+
+
+=head1 NAME
+
+perlko - Perl°ú ÇÑ±¹Ÿî ÀÎÄÚµù
+
+=head1 DESCRIPTION
+
+PerlÀÇ ŒŒ°è¿¡ ¿ÀœÅ °ÍÀ» È¯¿µÇÕŽÏŽÙ !
+
+
+PerlÀº 5.8.0ÆÇºÎÅÍ À¯ŽÏÄÚµå/ISO 10646¿¡ ŽëÇÑ ±€¹üÀ§ÇÑ Áö¿øÀ» ÇÕŽÏŽÙ.
+À¯ŽÏÄÚµå Áö¿øÀÇ ÀÏÈ¯Àž·Î ÇÑÁßÀÏÀ» ºñ·ÔÇÑ ŒŒ°è °¢±¹¿¡Œ­
+À¯ŽÏÄÚµå ÀÌÀü¿¡ Ÿ²°í ÀÖŸú°í Áö±Ýµµ ³Îž® Ÿ²ÀÌ°í ÀÖŽÂ Œöž¹Àº ÀÎÄÚµùÀ»
+Áö¿øÇÕŽÏŽÙ.  À¯ŽÏÄÚµåŽÂ Àü ŒŒ°è¿¡Œ­ Ÿ²ÀÌŽÂ žðµç ŸðŸîžŠ À§ÇÑ Ç¥±â ÃŒ°è -
+À¯·ŽÀÇ ¶óÆŸ ŸËÆÄºª, Å°ž± ŸËÆÄºª, ±×ž®œº ŸËÆÄºª, ÀÎµµ¿Í µ¿³² ŸÆœÃŸÆÀÇ
+ºê¶ó¹Ì °è¿­ œºÅ©ž³Æ®, ŸÆ¶ø ¹®ÀÚ, È÷ºêž® ¹®ÀÚ, ÇÑÁßÀÏÀÇ ÇÑÀÚ, ÇÑ±¹ŸîÀÇ ÇÑ±Û,
+ÀÏº»ŸîÀÇ °¡³ª, ºÏ¹Ì ÀÎµðŸÈÀÇ Ç¥±â ÃŒ°è µî-žŠ Œö¿ëÇÏŽÂ °ÍÀ» žñÇ¥·Î ÇÏ°í
+ÀÖ±â ¶§¹®¿¡ ±âÁž¿¡ Ÿ²ÀÌŽø  °¢ ŸðŸî ¹× ±¹°¡ ±×ž®°í ¿î¿µ ÃŒ°è¿¡ °íÀ¯ÇÑ
+¹®ÀÚ ÁýÇÕ°ú ÀÎÄÚµù¿¡ Ÿµ Œö ÀÖŽÂ žðµç ±ÛÀÚŽÂ ¹°·ÐÀÌ°í  ±âÁž ¹®ÀÚ ÁýÇÕ¿¡Œ­
+Áö¿øÇÏ°í ÀÖÁö ŸÊŽø ŸÆÁÖ ž¹Àº ±ÛÀÚžŠ  Æ÷ÇÔÇÏ°í ÀÖœÀŽÏŽÙ.
+
+
+PerlÀº ³»ºÎÀûÀž·Î À¯ŽÏÄÚµåžŠ ¹®ÀÚ Ç¥ÇöÀ» À§ÇØ »ç¿ëÇÕŽÏŽÙ. ºžŽÙ ±žÃŒÀûÀž·Î
+ž»ÇÏžé Perl œºÅ©ž³Æ® ŸÈ¿¡Œ­  UTF-8 ¹®ÀÚ¿­À» Ÿµ Œö ÀÖ°í, 
+°¢ÁŸ ÇÔŒö¿Í ¿¬»êÀÚ(¿¹žŠ µéŸî, Á€±ÔœÄ, index, substr)°¡ ¹ÙÀÌÆ® ŽÜÀ§
+ŽëœÅ À¯ŽÏÄÚµå ±ÛÀÚ ŽÜÀ§·Î µ¿ÀÛÇÕŽÏŽÙ. (Žõ ÀÚŒŒÇÑ °ÍÀº 
+perlunicode žÅŽºŸóÀ» Âü°íÇÏœÊœÃ¿À.) À¯ŽÏÄÚµå°¡ ³Îž® ºž±ÞµÇ±â Àü¿¡
+³Îž® Ÿ²ÀÌ°í ÀÖŸú°í, ¿©ÀüÈ÷ ³Îž® Ÿ²ÀÌ°í ÀÖŽÂ °¢±¹/°¢ ŸðŸîº° ÀÎÄÚµùÀž·Î
+ÀÔÃâ·ÂÀ» ÇÏ°í ÀÌµé ÀÎÄÚµùÀž·Î µÈ µ¥ÀÌÅÍ¿Í ¹®Œ­žŠ ŽÙ·çŽÂ °ÍÀ» µœ±â À§ÇØ
+'Encode'°¡  Ÿ²¿ŽœÀŽÏŽÙ. ¹«ŸùºžŽÙ 'Encode'žŠ  œáŒ­ Œöž¹Àº ÀÎÄÚµù »çÀÌÀÇ
+º¯È¯À» œ±°Ô ÇÒ Œö ÀÖœÀŽÏŽÙ.
+
+'Encode'ŽÂ ŽÙÀœ°ú °°Àº ÇÑ±¹Ÿî ÀÎÄÚµùÀ» Áö¿øÇÕŽÏŽÙ.
+
+=over 4
+
+=item euc-kr 
+
+  US-ASCII¿Í KS X 1001À» °°ÀÌ Ÿ²ŽÂ žÖÆŒ¹ÙÀÌÆ® ÀÎÄÚµù (ÈçÈ÷ ¿ÏŒºÇüÀÌ¶ó°í
+  ºÒž².) KS X 2901°ú RFC 1557 Âü°í.
+
+=item  cp949     
+
+	MS-Windows 9x/ME¿¡Œ­ Ÿ²ÀÌŽÂ È®Àå ¿ÏŒºÇü.  euc-kr¿¡ 8,822ÀÚÀÇ
+	ÇÑ±Û ÀœÀýÀ» ŽõÇÑ °ÍÀÓ.  aliasŽÂ uhc, windows-949, x-windows-949,
+	ks_c_5601-1987. žÇ ž¶Áöž· ÀÌž§Àº ÀûÀýÇÏÁö ŸÊÀº ÀÌž§ÀÌÁöžž, Microsoft
+	ÁŠÇ°¿¡Œ­ CP949ÀÇ ÀÇ¹Ì·Î Ÿ²ÀÌ°í ÀÖÀœ.
+
+=item  johab          
+
+	KS X 1001:1998 ºÎ·Ï 3¿¡Œ­ ±ÔÁ€ÇÑ Á¶ÇÕÇü.  ¹®ÀÚ ·¹ÆÛÅäž®ŽÂ cp949¿Í
+	ž¶Âù°¡Áö·Î US-ASCII¿Í  KS X 1001¿¡ 8,822ÀÚÀÇ ÇÑ±Û ÀœÀýÀ» ŽõÇÑ °ÍÀÓ.
+	ÀÎÄÚµù ¹æœÄÀº ÀüÇô ŽÙž§. 
+
+=item iso-2022-kr     
+
+	RFC 1557¿¡Œ­ ±ÔÁ€ÇÑ ÇÑ±¹Ÿî ÀÎÅÍ³Ý žÞÀÏ ±³È¯¿ë ÀÎÄÚµùÀž·Î US-ASCII¿Í
+	KS X 1001À» ·¹ÆÛÅäž®·Î ÇÏŽÂ Á¡¿¡Œ­ euc-kr°ú °°Áöžž ÀÎÄÚµù ¹æœÄÀÌ ŽÙž§.
+	1997-8³â °æ±îÁö Ÿ²¿ŽÀž³ª Žõ ÀÌ»ó žÞÀÏ ±³È¯¿¡ Ÿ²ÀÌÁö ŸÊÀœ.
+
+=item  ksc5601-raw     
+
+	KS X 1001(KS C 5601)À» GL(Áï, MSBžŠ 0Àž·Î ÇÑ °æ¿ì) ¿¡ ³õŸÒÀ» ¶§ÀÇ
+	ÀÎÄÚµù. US-ASCII¿Í °áÇÕÇÏÁö ŸÊ°í ŽÜµ¶Àž·Î Ÿ²ÀÌŽÂ ÀÏÀº X11 µî¿¡Œ­ ±Û²Ã
+	ÀÎÄÚµù (ksc5601.1987-0. '0'Àº GLÀ» ÀÇ¹ÌÇÔ.)Àž·Î Ÿ²ÀÌŽÂ °ÍÀ» ÁŠ¿ÜÇÏ°íŽÂ
+	°ÅÀÇ ŸøÀœ. KS C 5601Àº 1997³â KS X 1001·Î ÀÌž§À» ¹Ù²ÙŸúÀœ.  1998³â¿¡ŽÂ  µÎ
+	±ÛÀÚ (À¯·ÎÈ­ ºÎÈ£¿Í µî·Ï »óÇ¥ ºÎÈ£)°¡ ŽõÇØÁ³Àœ.
+
+=back
+
+ žî °¡Áö »ç¿ë ¿¹ÁŠžŠ ŸÆ·¡¿¡ ºžÀÔŽÏŽÙ. 
+
+¿¹žŠ µéŸî, euc-kr ÀÎÄÚµùÀž·Î µÈ ÆÄÀÏÀ» UTF-8·Î º¯È¯ÇÏ·Ážé ŽÙÀœ°ú
+°°ÀÌ ÇÏžé µËŽÏŽÙ. 
+
+
+    perl -Mencoding=euc-kr,STDOUT,utf8 -pe1  < file.euckr > file.utf8
+
+¿ªº¯È¯Àº ŽÙÀœ°ú °°ÀÌ ÇÒ Œö ÀÖœÀŽÏŽÙ. 
+
+    perl -Mencoding=utf8,STDOUT,euc-kr -pe1  < file.utf8  > file.euckr
+
+  ÀÌ·± º¯È¯À» Á»Žõ Æíž®ÇÏ°Ô ÇÒ Œö ÀÖµµ·Ï Encode žðµâÀ» œáŒ­ 
+ŒøŒöÇÏ°Ô Perl·Îžž Ÿ²ÀÎ piconv°¡ Perl¿¡ µéŸî ÀÖœÀŽÏŽÙ.
+±× ÀÌž§¿¡Œ­ ŸË Œö ÀÖµíÀÌ piconvŽÂ Unix¿¡ ÀÖŽÂ iconvžŠ
+žðµš·Î ÇÑ °ÍÀÔŽÏŽÙ. ±× »ç¿ë¹ýÀº ŸÆ·¡¿Í °°œÀŽÏŽÙ.
+
+   piconv -f euc-kr -t utf8 < file.euckr > file.utf8
+   piconv -f utf8 -t euc-kr < file.utf8 > file.euckr
+
+  ¶Ç, 'PerlIO::encoding' žðµâÀ» œáŒ­ ÇÑ±¹Ÿî ÀÎÄÚµùÀ» Ÿ²žéŒ­ ±ÛÀÚ ŽÜÀ§
+(¹ÙÀÌÆ® ŽÜÀ§°¡ ŸÆŽÏ¶ó) Ã³ž®žŠ œ±°Ô ÇÒ Œö ÀÖœÀŽÏŽÙ.
+
+  #!/path/to/perl 
+
+  use encoding 'euc-kr', STDIN => 'euc-kr',
+                         STDOUT-> 'euc-kr', STDERR=>'euc-kr';
+
+  print length("°¡³ª");        # 2  (Å« µû¿ÈÇ¥ŽÂ ±ÛÀÚ ŽÜÀ§ Ã³ž®žŠ ÁöœÃ)
+  print length('°¡³ª');        # 4  (ÀÛÀº µû¿ÈÇ¥ŽÂ ¹ÙÀÌÆ® ŽÜÀ§ Ã³ž®žŠ ÁöœÃ)
+  print index("ÇÑ°­, Žëµ¿°­", "¿°");   # -1 ('¿°'ÀÌ ŸøÀœ)
+  print index('ÇÑ°­, Žëµ¿°­', '¿°');   # 7 (8¹øÂ°¿Í 9¹øÂ° ¹ÙÀÌÆ®°¡ '¿°'ÀÇ
+                                            ÄÚµå°ª°ú ÀÏÄ¡ÇÔ.)
+
+
+=head2 Žõ ÀÚŒŒÈ÷ ŸË°í œÍÀžžé...
+
+  PerlÀ» Œ³Ä¡ÇÏžé  ŽëŽÜÈ÷ ÀÚŒŒÇÑ ¹®Œ­°¡ °°ÀÌ µû¶ó ¿Àžç, ÀÌ ¹®Œ­žŠ ÅëÇØ
+Perl Àü¹Ý »Ó ŸÆŽÏ¶ó À¯ŽÏÄÚµå Áö¿ø, EncodeÀÇ »ç¿ë¹ý µî¿¡ ž¹Àº °ÍÀ»
+¹è¿ï Œö ÀÖœÀŽÏŽÙ.  ŸÆÁ÷ ÀÌ ¹®Œ­ŽÂ ÇöÀç žðµÎ ¿µŸî·Î Ÿ²¿© ÀÖœÀŽÏŽÙ.
+
+
+=head2 Perl °ü·Ã ÀÚ·á
+
+À§¿¡Œ­ Ÿð±ÞÇÑ  ¹®Œ­ ¿Ü¿¡µµ ŽÙÀœ°ú °°Àº ÀÚ·á°¡ ÀÖœÀŽÏŽÙ. ÀÌ žñ·ÏÀº °áÄÚ
+¿ÏÀüÇÑ °ÍÀÌ ŸÆŽÏ°í ÀÏºÎ ŽëÇ¥ÀûÀÎ °Ížž žðÀº °ÍÀÔŽÏŽÙ.
+
+=over 4
+
+=item L<http://www.perl.com/>		
+
+   O'ReillyÀÇ Perl À¥ ÆäÀÌÁö 
+
+=item L<http://www.cpan.org/>
+
+	Comprehensive Perl Archive Network
+
+=item L<http://lists.perl.org/>	
+
+  Perl žÞÀÏžµ ž®œºÆ®. ž¹Àº ž®œºÆ® °¡¿îµ¥
+  perl-unicode¿¡Œ­ 'Encode'¿¡ ŽëÇØ ³íÀÇÇÔ.
+
+=back
+
+=head2 PerlÀ» Žõ ±í°Ô °øºÎÇÏŽÂµ¥ µµ¿òÀ» ÁÙ Œö ÀÖŽÂ ÇÑ±¹Ÿî °ü·Ã »çÀÌÆ®
+
+=over 4
+
+=item L<http://www.perl.or.kr/>
+
+  Perl ÇÑ±¹ »ç¿ëÀÚ žðÀÓ 
+
+=item L<news:han.comp.lang.perl/>
+
+  ÇÑ±¹Ÿî Perl Žºœº ±×·ì
+
+=item L<http://seoul.pm.org/>
+
+  Perl žÁ°Åœº (Œ­¿ï)
+
+=item L<http://www.perlmania.or.kr/>
+
+  Home for Korean Perlmanias
+
+=item L<http://www.oreilly.co.kr/perl/>
+
+  O'Reilly¿¡Œ­ ³ª¿Â ÇÑ±¹Ÿî Perl Œ­Àû žñ·Ï
+
+=item L<http://www.perlschool.net/>
+
+  Perl ±âÃÊ °­ÁÂ ¹× ŒÒœº, ÃÖ±Ù µ¿Çâ, °ü·Ã ÇØ¿Ü »çÀÌÆ® žµÅ© 
+
+=item L<http://www.perl.co.kr>
+
+  Perl¿¡ °ü·ÃµÈ CGI, DB, ¿¬µ¿ µî¿¡ ŽëÇÑ  Á€ºž ¹× Žºœº ÁŠ°ø
+
+=back 
+
+=head2 À¯ŽÏÄÚµå ¹× ÇÑ±¹Ÿî ÀÎÄÚµù °ü·Ã ÀÚ·á
+
+=over 4
+
+=item L<http://www.unicode.org/>
+
+  À¯ŽÏÄÚµå ÄÁŒÒœÃŸö.  
+
+=item L<http://std.dkuug.dk/JTC1/SC2/WG2>
+
+±âº»ÀûÀž·Î Unicode¿Í °°Àº ISO Ç¥ÁØÀÎ  ISO/IEC 10646 UCS(Universal
+Character Set)À» žžµåŽÂ  ISO/IEC JTC1/SC2/WG2ÀÇ À¥ ÆäÀÌÁö. 
+
+=item L<http://jshin.net/faq/qa8.html>
+
+  ÇÑ±¹Ÿî ¹®ÀÚ ÁýÇÕ ¹× ÀÎÄÚµù¿¡ ŽëÇÑ ŸÈ³».
+
+=item L<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
+
+  À¯ŽÐœº/ž®Žªœº¿¡Œ­ À¯ŽÏÄÚµå¿Í UTF-8 »ç¿ë¿¡ ŽëÇÑ ¹®ŽäÁý(FAQ)
+
+=item L<http://kldp.org/Translations/html/UTF8-Unicode-KLDP/UTF8-Unicode-KLDP.html>
+
+  À¯ŽÐœº/ž®Žªœº¿¡Œ­ À¯ŽÏÄÚµå¿Í UTF-8 »ç¿ë¿¡ ŽëÇÑ ¹®ŽäÁý(FAQ)ÀÇ  ÇÑ±¹Ÿî ¹ø¿ª
+
+=back
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::KR>, L<encoding>, L<perluniintro>, L<perlunicode>
+
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi E<lt>jhi@iki.fiE<gt>
+œÅÁ€œÄ E<lt>jshin@mailaps.orgE<gt>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perllexwarn.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perllexwarn.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perllexwarn.pod	(revision 14489)
@@ -0,0 +1,540 @@
+=head1 NAME
+X<warning, lexical> X<warnings> X<warning>
+
+perllexwarn - Perl Lexical Warnings
+
+=head1 DESCRIPTION
+
+The C<use warnings> pragma is a replacement for both the command line
+flag B<-w> and the equivalent Perl variable, C<$^W>.
+
+The pragma works just like the existing "strict" pragma.
+This means that the scope of the warning pragma is limited to the
+enclosing block. It also means that the pragma setting will not
+leak across files (via C<use>, C<require> or C<do>). This allows
+authors to independently define the degree of warning checks that will
+be applied to their module.
+
+By default, optional warnings are disabled, so any legacy code that
+doesn't attempt to control the warnings will work unchanged.
+
+All warnings are enabled in a block by either of these:
+
+    use warnings;
+    use warnings 'all';
+
+Similarly all warnings are disabled in a block by either of these:
+
+    no warnings;
+    no warnings 'all';
+
+For example, consider the code below:
+
+    use warnings;
+    my @a;
+    {
+        no warnings;
+	my $b = @a[0];
+    }
+    my $c = @a[0];
+
+The code in the enclosing block has warnings enabled, but the inner
+block has them disabled. In this case that means the assignment to the
+scalar C<$c> will trip the C<"Scalar value @a[0] better written as $a[0]">
+warning, but the assignment to the scalar C<$b> will not.
+
+=head2 Default Warnings and Optional Warnings
+
+Before the introduction of lexical warnings, Perl had two classes of
+warnings: mandatory and optional. 
+
+As its name suggests, if your code tripped a mandatory warning, you
+would get a warning whether you wanted it or not.
+For example, the code below would always produce an C<"isn't numeric">
+warning about the "2:".
+
+    my $a = "2:" + 3;
+
+With the introduction of lexical warnings, mandatory warnings now become
+I<default> warnings. The difference is that although the previously
+mandatory warnings are still enabled by default, they can then be
+subsequently enabled or disabled with the lexical warning pragma. For
+example, in the code below, an C<"isn't numeric"> warning will only
+be reported for the C<$a> variable.
+
+    my $a = "2:" + 3;
+    no warnings;
+    my $b = "2:" + 3;
+
+Note that neither the B<-w> flag or the C<$^W> can be used to
+disable/enable default warnings. They are still mandatory in this case.
+
+=head2 What's wrong with B<-w> and C<$^W>
+
+Although very useful, the big problem with using B<-w> on the command
+line to enable warnings is that it is all or nothing. Take the typical
+scenario when you are writing a Perl program. Parts of the code you
+will write yourself, but it's very likely that you will make use of
+pre-written Perl modules. If you use the B<-w> flag in this case, you
+end up enabling warnings in pieces of code that you haven't written.
+
+Similarly, using C<$^W> to either disable or enable blocks of code is
+fundamentally flawed. For a start, say you want to disable warnings in
+a block of code. You might expect this to be enough to do the trick:
+
+     {
+         local ($^W) = 0;
+	 my $a =+ 2;
+	 my $b; chop $b;
+     }
+
+When this code is run with the B<-w> flag, a warning will be produced
+for the C<$a> line -- C<"Reversed += operator">.
+
+The problem is that Perl has both compile-time and run-time warnings. To
+disable compile-time warnings you need to rewrite the code like this:
+
+     {
+         BEGIN { $^W = 0 }
+	 my $a =+ 2;
+	 my $b; chop $b;
+     }
+
+The other big problem with C<$^W> is the way you can inadvertently
+change the warning setting in unexpected places in your code. For example,
+when the code below is run (without the B<-w> flag), the second call
+to C<doit> will trip a C<"Use of uninitialized value"> warning, whereas
+the first will not.
+
+    sub doit
+    {
+        my $b; chop $b;
+    }
+
+    doit();
+
+    {
+        local ($^W) = 1;
+        doit()
+    }
+
+This is a side-effect of C<$^W> being dynamically scoped.
+
+Lexical warnings get around these limitations by allowing finer control
+over where warnings can or can't be tripped.
+
+=head2 Controlling Warnings from the Command Line
+
+There are three Command Line flags that can be used to control when
+warnings are (or aren't) produced:
+
+=over 5
+
+=item B<-w>
+X<-w>
+
+This is  the existing flag. If the lexical warnings pragma is B<not>
+used in any of you code, or any of the modules that you use, this flag
+will enable warnings everywhere. See L<Backward Compatibility> for
+details of how this flag interacts with lexical warnings.
+
+=item B<-W>
+X<-W>
+
+If the B<-W> flag is used on the command line, it will enable all warnings
+throughout the program regardless of whether warnings were disabled
+locally using C<no warnings> or C<$^W =0>. This includes all files that get
+included via C<use>, C<require> or C<do>.
+Think of it as the Perl equivalent of the "lint" command.
+
+=item B<-X>
+X<-X>
+
+Does the exact opposite to the B<-W> flag, i.e. it disables all warnings.
+
+=back
+
+=head2 Backward Compatibility
+
+If you are used with working with a version of Perl prior to the
+introduction of lexically scoped warnings, or have code that uses both
+lexical warnings and C<$^W>, this section will describe how they interact.
+
+How Lexical Warnings interact with B<-w>/C<$^W>:
+
+=over 5
+
+=item 1.
+
+If none of the three command line flags (B<-w>, B<-W> or B<-X>) that
+control warnings is used and neither C<$^W> or the C<warnings> pragma
+are used, then default warnings will be enabled and optional warnings
+disabled.
+This means that legacy code that doesn't attempt to control the warnings
+will work unchanged.
+
+=item 2.
+
+The B<-w> flag just sets the global C<$^W> variable as in 5.005 -- this
+means that any legacy code that currently relies on manipulating C<$^W>
+to control warning behavior will still work as is. 
+
+=item 3.
+
+Apart from now being a boolean, the C<$^W> variable operates in exactly
+the same horrible uncontrolled global way, except that it cannot
+disable/enable default warnings.
+
+=item 4.
+
+If a piece of code is under the control of the C<warnings> pragma,
+both the C<$^W> variable and the B<-w> flag will be ignored for the
+scope of the lexical warning.
+
+=item 5.
+
+The only way to override a lexical warnings setting is with the B<-W>
+or B<-X> command line flags.
+
+=back
+
+The combined effect of 3 & 4 is that it will allow code which uses
+the C<warnings> pragma to control the warning behavior of $^W-type
+code (using a C<local $^W=0>) if it really wants to, but not vice-versa.
+
+=head2 Category Hierarchy
+X<warning, categories>
+
+A hierarchy of "categories" have been defined to allow groups of warnings
+to be enabled/disabled in isolation.
+
+The current hierarchy is:
+
+  all -+
+       |
+       +- closure
+       |
+       +- deprecated
+       |
+       +- exiting
+       |
+       +- glob
+       |
+       +- io -----------+
+       |                |
+       |                +- closed
+       |                |
+       |                +- exec
+       |                |
+       |                +- layer
+       |                |
+       |                +- newline
+       |                |
+       |                +- pipe
+       |                |
+       |                +- unopened
+       |
+       +- misc
+       |
+       +- numeric
+       |
+       +- once
+       |
+       +- overflow
+       |
+       +- pack
+       |
+       +- portable
+       |
+       +- recursion
+       |
+       +- redefine
+       |
+       +- regexp
+       |
+       +- severe -------+
+       |                |
+       |                +- debugging
+       |                |
+       |                +- inplace
+       |                |
+       |                +- internal
+       |                |
+       |                +- malloc
+       |
+       +- signal
+       |
+       +- substr
+       |
+       +- syntax -------+
+       |                |
+       |                +- ambiguous
+       |                |
+       |                +- bareword
+       |                |
+       |                +- digit
+       |                |
+       |                +- parenthesis
+       |                |
+       |                +- precedence
+       |                |
+       |                +- printf
+       |                |
+       |                +- prototype
+       |                |
+       |                +- qw
+       |                |
+       |                +- reserved
+       |                |
+       |                +- semicolon
+       |
+       +- taint
+       |
+       +- threads
+       |
+       +- uninitialized
+       |
+       +- unpack
+       |
+       +- untie
+       |
+       +- utf8
+       |
+       +- void
+       |
+       +- y2k
+
+Just like the "strict" pragma any of these categories can be combined
+
+    use warnings qw(void redefine);
+    no warnings qw(io syntax untie);
+
+Also like the "strict" pragma, if there is more than one instance of the
+C<warnings> pragma in a given scope the cumulative effect is additive. 
+
+    use warnings qw(void); # only "void" warnings enabled
+    ...
+    use warnings qw(io);   # only "void" & "io" warnings enabled
+    ...
+    no warnings qw(void);  # only "io" warnings enabled
+
+To determine which category a specific warning has been assigned to see
+L<perldiag>.
+
+Note: In Perl 5.6.1, the lexical warnings category "deprecated" was a
+sub-category of the "syntax" category. It is now a top-level category
+in its own right.
+
+
+=head2 Fatal Warnings
+X<warning, fatal>
+
+The presence of the word "FATAL" in the category list will escalate any
+warnings detected from the categories specified in the lexical scope
+into fatal errors. In the code below, the use of C<time>, C<length>
+and C<join> can all produce a C<"Useless use of xxx in void context">
+warning.
+
+    use warnings;
+
+    time;
+
+    {
+        use warnings FATAL => qw(void);
+        length "abc";
+    }
+
+    join "", 1,2,3;
+
+    print "done\n";
+
+When run it produces this output
+
+    Useless use of time in void context at fatal line 3.
+    Useless use of length in void context at fatal line 7.  
+
+The scope where C<length> is used has escalated the C<void> warnings
+category into a fatal error, so the program terminates immediately it
+encounters the warning.
+
+To explicitly turn off a "FATAL" warning you just disable the warning
+it is associated with.  So, for example, to disable the "void" warning
+in the example above, either of these will do the trick:
+
+    no warnings qw(void);
+    no warnings FATAL => qw(void);
+
+If you want to downgrade a warning that has been escalated into a fatal
+error back to a normal warning, you can use the "NONFATAL" keyword. For
+example, the code below will promote all warnings into fatal errors,
+except for those in the "syntax" category.
+
+    use warnings FATAL => 'all', NONFATAL => 'syntax';
+
+=head2 Reporting Warnings from a Module
+X<warning, reporting> X<warning, registering>
+
+The C<warnings> pragma provides a number of functions that are useful for
+module authors. These are used when you want to report a module-specific
+warning to a calling module has enabled warnings via the C<warnings>
+pragma.
+
+Consider the module C<MyMod::Abc> below.
+
+    package MyMod::Abc;
+
+    use warnings::register;
+
+    sub open {
+        my $path = shift;
+        if ($path !~ m#^/#) {
+            warnings::warn("changing relative path to /var/abc")
+                if warnings::enabled();
+            $path = "/var/abc/$path";
+        }
+    }
+
+    1;
+
+The call to C<warnings::register> will create a new warnings category
+called "MyMod::abc", i.e. the new category name matches the current
+package name. The C<open> function in the module will display a warning
+message if it gets given a relative path as a parameter. This warnings
+will only be displayed if the code that uses C<MyMod::Abc> has actually
+enabled them with the C<warnings> pragma like below.
+
+    use MyMod::Abc;
+    use warnings 'MyMod::Abc';
+    ...
+    abc::open("../fred.txt");
+
+It is also possible to test whether the pre-defined warnings categories are
+set in the calling module with the C<warnings::enabled> function. Consider
+this snippet of code:
+
+    package MyMod::Abc;
+
+    sub open {
+        warnings::warnif("deprecated", 
+                         "open is deprecated, use new instead");
+        new(@_);
+    }
+
+    sub new
+    ...
+    1;
+
+The function C<open> has been deprecated, so code has been included to
+display a warning message whenever the calling module has (at least) the
+"deprecated" warnings category enabled. Something like this, say.
+
+    use warnings 'deprecated';
+    use MyMod::Abc;
+    ...
+    MyMod::Abc::open($filename);
+
+Either the C<warnings::warn> or C<warnings::warnif> function should be
+used to actually display the warnings message. This is because they can
+make use of the feature that allows warnings to be escalated into fatal
+errors. So in this case
+
+    use MyMod::Abc;
+    use warnings FATAL => 'MyMod::Abc';
+    ...
+    MyMod::Abc::open('../fred.txt');
+
+the C<warnings::warnif> function will detect this and die after
+displaying the warning message.
+
+The three warnings functions, C<warnings::warn>, C<warnings::warnif>
+and C<warnings::enabled> can optionally take an object reference in place
+of a category name. In this case the functions will use the class name
+of the object as the warnings category.
+
+Consider this example:
+
+    package Original;
+
+    no warnings;
+    use warnings::register;
+
+    sub new
+    {
+        my $class = shift;
+        bless [], $class;
+    }
+
+    sub check
+    {
+        my $self = shift;
+        my $value = shift;
+
+        if ($value % 2 && warnings::enabled($self))
+          { warnings::warn($self, "Odd numbers are unsafe") }
+    }
+
+    sub doit
+    {
+        my $self = shift;
+        my $value = shift;
+        $self->check($value);
+        # ...
+    }
+
+    1;
+
+    package Derived;
+
+    use warnings::register;
+    use Original;
+    our @ISA = qw( Original );
+    sub new
+    {
+        my $class = shift;
+        bless [], $class;
+    }
+
+
+    1;
+
+The code below makes use of both modules, but it only enables warnings from 
+C<Derived>.
+
+    use Original;
+    use Derived;
+    use warnings 'Derived';
+    my $a = new Original;
+    $a->doit(1);
+    my $b = new Derived;
+    $a->doit(1);
+
+When this code is run only the C<Derived> object, C<$b>, will generate
+a warning. 
+
+    Odd numbers are unsafe at main.pl line 7
+
+Notice also that the warning is reported at the line where the object is first
+used.
+
+=head1 TODO
+
+  perl5db.pl
+    The debugger saves and restores C<$^W> at runtime. I haven't checked
+    whether the debugger will still work with the lexical warnings
+    patch applied.
+
+  diagnostics.pm
+    I *think* I've got diagnostics to work with the lexical warnings
+    patch, but there were design decisions made in diagnostics to work
+    around the limitations of C<$^W>. Now that those limitations are gone,
+    the module should be revisited.
+
+  document calling the warnings::* functions from XS
+
+=head1 SEE ALSO
+
+L<warnings>, L<perldiag>.
+
+=head1 AUTHOR
+
+Paul Marquess
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perllinux.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perllinux.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perllinux.pod	(revision 14489)
@@ -0,0 +1,39 @@
+If you read this file _as_is_, just ignore the funny characters you
+see.  It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.linux - Perl version 5 on Linux systems
+
+=head1 DESCRIPTION
+
+This document describes various features of Linux that will affect how Perl
+version 5 (hereafter just Perl) is compiled and/or runs.
+
+=head2 Experimental Support for Sun Studio Compilers for Linux OS
+
+Sun Microsystems has released a port of their Sun Studio compiliers for
+Linux.  As of November 2005, only an alpha version has been released.  
+Until a release of these compilers is made, support for compiling Perl with
+these compiler experimental.
+
+Also, some special instructions for building Perl with Sun Studio on Linux.
+Following the normal C<Configure>, you have to run make as follows:
+
+    LDLOADLIBS=-lc make
+
+C<LDLOADLIBS> is an environment variable used by the linker to link modules
+C</ext> modules to glibc.  Currently, that environment variable is not getting
+populated by a combination of C<Config> entries and C<ExtUtil::MakeMaker>.
+While there may be a bug somewhere in Perl's configuration or
+C<ExtUtil::MakeMaker> causing the problem, the most likely cause is an
+incomplete understanding of Sun Studio by this author.  Further investigation
+is needed to get this working better.
+
+=head1 AUTHOR
+
+Steve Peters <steve@fisharerojo.org>
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perllocale.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perllocale.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perllocale.pod	(revision 14489)
@@ -0,0 +1,1026 @@
+=head1 NAME
+
+perllocale - Perl locale handling (internationalization and localization)
+
+=head1 DESCRIPTION
+
+Perl supports language-specific notions of data such as "is this
+a letter", "what is the uppercase equivalent of this letter", and
+"which of these letters comes first".  These are important issues,
+especially for languages other than English--but also for English: it
+would be naE<iuml>ve to imagine that C<A-Za-z> defines all the "letters"
+needed to write in English. Perl is also aware that some character other
+than '.' may be preferred as a decimal point, and that output date
+representations may be language-specific.  The process of making an
+application take account of its users' preferences in such matters is
+called B<internationalization> (often abbreviated as B<i18n>); telling
+such an application about a particular set of preferences is known as
+B<localization> (B<l10n>).
+
+Perl can understand language-specific data via the standardized (ISO C,
+XPG4, POSIX 1.c) method called "the locale system". The locale system is
+controlled per application using one pragma, one function call, and
+several environment variables.
+
+B<NOTE>: This feature is new in Perl 5.004, and does not apply unless an
+application specifically requests it--see L<Backward compatibility>.
+The one exception is that write() now B<always> uses the current locale
+- see L<"NOTES">.
+
+=head1 PREPARING TO USE LOCALES
+
+If Perl applications are to understand and present your data
+correctly according a locale of your choice, B<all> of the following
+must be true:
+
+=over 4
+
+=item *
+
+B<Your operating system must support the locale system>.  If it does,
+you should find that the setlocale() function is a documented part of
+its C library.
+
+=item *
+
+B<Definitions for locales that you use must be installed>.  You, or
+your system administrator, must make sure that this is the case. The
+available locales, the location in which they are kept, and the manner
+in which they are installed all vary from system to system.  Some systems
+provide only a few, hard-wired locales and do not allow more to be
+added.  Others allow you to add "canned" locales provided by the system
+supplier.  Still others allow you or the system administrator to define
+and add arbitrary locales.  (You may have to ask your supplier to
+provide canned locales that are not delivered with your operating
+system.)  Read your system documentation for further illumination.
+
+=item *
+
+B<Perl must believe that the locale system is supported>.  If it does,
+C<perl -V:d_setlocale> will say that the value for C<d_setlocale> is
+C<define>.
+
+=back
+
+If you want a Perl application to process and present your data
+according to a particular locale, the application code should include
+the S<C<use locale>> pragma (see L<The use locale pragma>) where
+appropriate, and B<at least one> of the following must be true:
+
+=over 4
+
+=item *
+
+B<The locale-determining environment variables (see L<"ENVIRONMENT">)
+must be correctly set up> at the time the application is started, either
+by yourself or by whoever set up your system account.
+
+=item *
+
+B<The application must set its own locale> using the method described in
+L<The setlocale function>.
+
+=back
+
+=head1 USING LOCALES
+
+=head2 The use locale pragma
+
+By default, Perl ignores the current locale.  The S<C<use locale>>
+pragma tells Perl to use the current locale for some operations:
+
+=over 4
+
+=item *
+
+B<The comparison operators> (C<lt>, C<le>, C<cmp>, C<ge>, and C<gt>) and
+the POSIX string collation functions strcoll() and strxfrm() use
+C<LC_COLLATE>.  sort() is also affected if used without an
+explicit comparison function, because it uses C<cmp> by default.
+
+B<Note:> C<eq> and C<ne> are unaffected by locale: they always
+perform a char-by-char comparison of their scalar operands.  What's
+more, if C<cmp> finds that its operands are equal according to the
+collation sequence specified by the current locale, it goes on to
+perform a char-by-char comparison, and only returns I<0> (equal) if the
+operands are char-for-char identical.  If you really want to know whether
+two strings--which C<eq> and C<cmp> may consider different--are equal
+as far as collation in the locale is concerned, see the discussion in
+L<Category LC_COLLATE: Collation>.
+
+=item *
+
+B<Regular expressions and case-modification functions> (uc(), lc(),
+ucfirst(), and lcfirst()) use C<LC_CTYPE>
+
+=item *
+
+B<The formatting functions> (printf(), sprintf() and write()) use
+C<LC_NUMERIC>
+
+=item *
+
+B<The POSIX date formatting function> (strftime()) uses C<LC_TIME>.
+
+=back
+
+C<LC_COLLATE>, C<LC_CTYPE>, and so on, are discussed further in 
+L<LOCALE CATEGORIES>.
+
+The default behavior is restored with the S<C<no locale>> pragma, or
+upon reaching the end of block enclosing C<use locale>.
+
+The string result of any operation that uses locale
+information is tainted, as it is possible for a locale to be
+untrustworthy.  See L<"SECURITY">.
+
+=head2 The setlocale function
+
+You can switch locales as often as you wish at run time with the
+POSIX::setlocale() function:
+
+        # This functionality not usable prior to Perl 5.004
+        require 5.004;
+
+        # Import locale-handling tool set from POSIX module.
+        # This example uses: setlocale -- the function call
+        #                    LC_CTYPE -- explained below
+        use POSIX qw(locale_h);
+
+        # query and save the old locale
+        $old_locale = setlocale(LC_CTYPE);
+
+        setlocale(LC_CTYPE, "fr_CA.ISO8859-1");
+        # LC_CTYPE now in locale "French, Canada, codeset ISO 8859-1"
+
+        setlocale(LC_CTYPE, "");
+        # LC_CTYPE now reset to default defined by LC_ALL/LC_CTYPE/LANG
+        # environment variables.  See below for documentation.
+
+        # restore the old locale
+        setlocale(LC_CTYPE, $old_locale);
+
+The first argument of setlocale() gives the B<category>, the second the
+B<locale>.  The category tells in what aspect of data processing you
+want to apply locale-specific rules.  Category names are discussed in
+L<LOCALE CATEGORIES> and L<"ENVIRONMENT">.  The locale is the name of a
+collection of customization information corresponding to a particular
+combination of language, country or territory, and codeset.  Read on for
+hints on the naming of locales: not all systems name locales as in the
+example.
+
+If no second argument is provided and the category is something else
+than LC_ALL, the function returns a string naming the current locale
+for the category.  You can use this value as the second argument in a
+subsequent call to setlocale().
+
+If no second argument is provided and the category is LC_ALL, the
+result is implementation-dependent.  It may be a string of
+concatenated locales names (separator also implementation-dependent)
+or a single locale name.  Please consult your L<setlocale(3)> for
+details.
+
+If a second argument is given and it corresponds to a valid locale,
+the locale for the category is set to that value, and the function
+returns the now-current locale value.  You can then use this in yet
+another call to setlocale().  (In some implementations, the return
+value may sometimes differ from the value you gave as the second
+argument--think of it as an alias for the value you gave.)
+
+As the example shows, if the second argument is an empty string, the
+category's locale is returned to the default specified by the
+corresponding environment variables.  Generally, this results in a
+return to the default that was in force when Perl started up: changes
+to the environment made by the application after startup may or may not
+be noticed, depending on your system's C library.
+
+If the second argument does not correspond to a valid locale, the locale
+for the category is not changed, and the function returns I<undef>.
+
+For further information about the categories, consult L<setlocale(3)>.
+
+=head2 Finding locales
+
+For locales available in your system, consult also L<setlocale(3)> to
+see whether it leads to the list of available locales (search for the
+I<SEE ALSO> section).  If that fails, try the following command lines:
+
+        locale -a
+
+        nlsinfo
+
+        ls /usr/lib/nls/loc
+
+        ls /usr/lib/locale
+
+        ls /usr/lib/nls
+
+	ls /usr/share/locale
+
+and see whether they list something resembling these
+
+        en_US.ISO8859-1     de_DE.ISO8859-1     ru_RU.ISO8859-5
+        en_US.iso88591      de_DE.iso88591      ru_RU.iso88595
+        en_US               de_DE               ru_RU
+        en                  de                  ru
+        english             german              russian
+        english.iso88591    german.iso88591     russian.iso88595
+        english.roman8                          russian.koi8r
+
+Sadly, even though the calling interface for setlocale() has been
+standardized, names of locales and the directories where the
+configuration resides have not been.  The basic form of the name is
+I<language_territory>B<.>I<codeset>, but the latter parts after
+I<language> are not always present.  The I<language> and I<country>
+are usually from the standards B<ISO 3166> and B<ISO 639>, the
+two-letter abbreviations for the countries and the languages of the
+world, respectively.  The I<codeset> part often mentions some B<ISO
+8859> character set, the Latin codesets.  For example, C<ISO 8859-1>
+is the so-called "Western European codeset" that can be used to encode
+most Western European languages adequately.  Again, there are several
+ways to write even the name of that one standard.  Lamentably.
+
+Two special locales are worth particular mention: "C" and "POSIX".
+Currently these are effectively the same locale: the difference is
+mainly that the first one is defined by the C standard, the second by
+the POSIX standard.  They define the B<default locale> in which
+every program starts in the absence of locale information in its
+environment.  (The I<default> default locale, if you will.)  Its language
+is (American) English and its character codeset ASCII.
+
+B<NOTE>: Not all systems have the "POSIX" locale (not all systems are
+POSIX-conformant), so use "C" when you need explicitly to specify this
+default locale.
+
+=head2 LOCALE PROBLEMS
+
+You may encounter the following warning message at Perl startup:
+
+	perl: warning: Setting locale failed.
+	perl: warning: Please check that your locale settings:
+	        LC_ALL = "En_US",
+	        LANG = (unset)
+	    are supported and installed on your system.
+	perl: warning: Falling back to the standard locale ("C").
+
+This means that your locale settings had LC_ALL set to "En_US" and
+LANG exists but has no value.  Perl tried to believe you but could not.
+Instead, Perl gave up and fell back to the "C" locale, the default locale
+that is supposed to work no matter what.  This usually means your locale
+settings were wrong, they mention locales your system has never heard
+of, or the locale installation in your system has problems (for example,
+some system files are broken or missing).  There are quick and temporary
+fixes to these problems, as well as more thorough and lasting fixes.
+
+=head2 Temporarily fixing locale problems
+
+The two quickest fixes are either to render Perl silent about any
+locale inconsistencies or to run Perl under the default locale "C".
+
+Perl's moaning about locale problems can be silenced by setting the
+environment variable PERL_BADLANG to a zero value, for example "0".
+This method really just sweeps the problem under the carpet: you tell
+Perl to shut up even when Perl sees that something is wrong.  Do not
+be surprised if later something locale-dependent misbehaves.
+
+Perl can be run under the "C" locale by setting the environment
+variable LC_ALL to "C".  This method is perhaps a bit more civilized
+than the PERL_BADLANG approach, but setting LC_ALL (or
+other locale variables) may affect other programs as well, not just
+Perl.  In particular, external programs run from within Perl will see
+these changes.  If you make the new settings permanent (read on), all
+programs you run see the changes.  See L<ENVIRONMENT> for
+the full list of relevant environment variables and L<USING LOCALES>
+for their effects in Perl.  Effects in other programs are 
+easily deducible.  For example, the variable LC_COLLATE may well affect
+your B<sort> program (or whatever the program that arranges "records"
+alphabetically in your system is called).
+
+You can test out changing these variables temporarily, and if the
+new settings seem to help, put those settings into your shell startup
+files.  Consult your local documentation for the exact details.  For in
+Bourne-like shells (B<sh>, B<ksh>, B<bash>, B<zsh>):
+
+	LC_ALL=en_US.ISO8859-1
+	export LC_ALL
+
+This assumes that we saw the locale "en_US.ISO8859-1" using the commands
+discussed above.  We decided to try that instead of the above faulty
+locale "En_US"--and in Cshish shells (B<csh>, B<tcsh>)
+
+	setenv LC_ALL en_US.ISO8859-1
+
+or if you have the "env" application you can do in any shell
+
+	env LC_ALL=en_US.ISO8859-1 perl ...
+
+If you do not know what shell you have, consult your local
+helpdesk or the equivalent.
+
+=head2 Permanently fixing locale problems
+
+The slower but superior fixes are when you may be able to yourself
+fix the misconfiguration of your own environment variables.  The
+mis(sing)configuration of the whole system's locales usually requires
+the help of your friendly system administrator.
+
+First, see earlier in this document about L<Finding locales>.  That tells
+how to find which locales are really supported--and more importantly,
+installed--on your system.  In our example error message, environment
+variables affecting the locale are listed in the order of decreasing
+importance (and unset variables do not matter).  Therefore, having
+LC_ALL set to "En_US" must have been the bad choice, as shown by the
+error message.  First try fixing locale settings listed first.
+
+Second, if using the listed commands you see something B<exactly>
+(prefix matches do not count and case usually counts) like "En_US"
+without the quotes, then you should be okay because you are using a
+locale name that should be installed and available in your system.
+In this case, see L<Permanently fixing your system's locale configuration>.
+
+=head2 Permanently fixing your system's locale configuration
+
+This is when you see something like:
+
+	perl: warning: Please check that your locale settings:
+	        LC_ALL = "En_US",
+	        LANG = (unset)
+	    are supported and installed on your system.
+
+but then cannot see that "En_US" listed by the above-mentioned
+commands.  You may see things like "en_US.ISO8859-1", but that isn't
+the same.  In this case, try running under a locale
+that you can list and which somehow matches what you tried.  The
+rules for matching locale names are a bit vague because
+standardization is weak in this area.  See again the 
+L<Finding locales> about general rules.
+
+=head2 Fixing system locale configuration
+
+Contact a system administrator (preferably your own) and report the exact
+error message you get, and ask them to read this same documentation you
+are now reading.  They should be able to check whether there is something
+wrong with the locale configuration of the system.  The L<Finding locales>
+section is unfortunately a bit vague about the exact commands and places
+because these things are not that standardized.
+
+=head2 The localeconv function
+
+The POSIX::localeconv() function allows you to get particulars of the
+locale-dependent numeric formatting information specified by the current
+C<LC_NUMERIC> and C<LC_MONETARY> locales.  (If you just want the name of
+the current locale for a particular category, use POSIX::setlocale()
+with a single parameter--see L<The setlocale function>.)
+
+        use POSIX qw(locale_h);
+
+        # Get a reference to a hash of locale-dependent info
+        $locale_values = localeconv();
+
+        # Output sorted list of the values
+        for (sort keys %$locale_values) {
+            printf "%-20s = %s\n", $_, $locale_values->{$_}
+        }
+
+localeconv() takes no arguments, and returns B<a reference to> a hash.
+The keys of this hash are variable names for formatting, such as
+C<decimal_point> and C<thousands_sep>.  The values are the
+corresponding, er, values.  See L<POSIX/localeconv> for a longer
+example listing the categories an implementation might be expected to
+provide; some provide more and others fewer.  You don't need an
+explicit C<use locale>, because localeconv() always observes the
+current locale.
+
+Here's a simple-minded example program that rewrites its command-line
+parameters as integers correctly formatted in the current locale:
+
+        # See comments in previous example
+        require 5.004;
+        use POSIX qw(locale_h);
+
+        # Get some of locale's numeric formatting parameters
+        my ($thousands_sep, $grouping) =
+             @{localeconv()}{'thousands_sep', 'grouping'};
+
+        # Apply defaults if values are missing
+        $thousands_sep = ',' unless $thousands_sep;
+
+	# grouping and mon_grouping are packed lists
+	# of small integers (characters) telling the
+	# grouping (thousand_seps and mon_thousand_seps
+	# being the group dividers) of numbers and
+	# monetary quantities.  The integers' meanings:
+	# 255 means no more grouping, 0 means repeat
+	# the previous grouping, 1-254 means use that
+	# as the current grouping.  Grouping goes from
+	# right to left (low to high digits).  In the
+	# below we cheat slightly by never using anything
+	# else than the first grouping (whatever that is).
+	if ($grouping) {
+	    @grouping = unpack("C*", $grouping);
+	} else {
+	    @grouping = (3);
+	}
+
+        # Format command line params for current locale
+        for (@ARGV) {
+            $_ = int;    # Chop non-integer part
+            1 while
+            s/(\d)(\d{$grouping[0]}($|$thousands_sep))/$1$thousands_sep$2/;
+            print "$_";
+        }
+        print "\n";
+
+=head2 I18N::Langinfo
+
+Another interface for querying locale-dependent information is the
+I18N::Langinfo::langinfo() function, available at least in UNIX-like
+systems and VMS.
+
+The following example will import the langinfo() function itself and
+three constants to be used as arguments to langinfo(): a constant for
+the abbreviated first day of the week (the numbering starts from
+Sunday = 1) and two more constants for the affirmative and negative
+answers for a yes/no question in the current locale.
+
+    use I18N::Langinfo qw(langinfo ABDAY_1 YESSTR NOSTR);
+
+    my ($abday_1, $yesstr, $nostr) = map { langinfo } qw(ABDAY_1 YESSTR NOSTR);
+
+    print "$abday_1? [$yesstr/$nostr] ";
+
+In other words, in the "C" (or English) locale the above will probably
+print something like:
+
+    Sun? [yes/no] 
+
+See L<I18N::Langinfo> for more information.
+
+=head1 LOCALE CATEGORIES
+
+The following subsections describe basic locale categories.  Beyond these,
+some combination categories allow manipulation of more than one
+basic category at a time.  See L<"ENVIRONMENT"> for a discussion of these.
+
+=head2 Category LC_COLLATE: Collation
+
+In the scope of S<C<use locale>>, Perl looks to the C<LC_COLLATE>
+environment variable to determine the application's notions on collation
+(ordering) of characters.  For example, 'b' follows 'a' in Latin
+alphabets, but where do 'E<aacute>' and 'E<aring>' belong?  And while
+'color' follows 'chocolate' in English, what about in Spanish?
+
+The following collations all make sense and you may meet any of them
+if you "use locale".
+
+	A B C D E a b c d e
+	A a B b C c D d E e
+	a A b B c C d D e E
+	a b c d e A B C D E
+
+Here is a code snippet to tell what "word"
+characters are in the current locale, in that locale's order:
+
+        use locale;
+        print +(sort grep /\w/, map { chr } 0..255), "\n";
+
+Compare this with the characters that you see and their order if you
+state explicitly that the locale should be ignored:
+
+        no locale;
+        print +(sort grep /\w/, map { chr } 0..255), "\n";
+
+This machine-native collation (which is what you get unless S<C<use
+locale>> has appeared earlier in the same block) must be used for
+sorting raw binary data, whereas the locale-dependent collation of the
+first example is useful for natural text.
+
+As noted in L<USING LOCALES>, C<cmp> compares according to the current
+collation locale when C<use locale> is in effect, but falls back to a
+char-by-char comparison for strings that the locale says are equal. You
+can use POSIX::strcoll() if you don't want this fall-back:
+
+        use POSIX qw(strcoll);
+        $equal_in_locale =
+            !strcoll("space and case ignored", "SpaceAndCaseIgnored");
+
+$equal_in_locale will be true if the collation locale specifies a
+dictionary-like ordering that ignores space characters completely and
+which folds case.
+
+If you have a single string that you want to check for "equality in
+locale" against several others, you might think you could gain a little
+efficiency by using POSIX::strxfrm() in conjunction with C<eq>:
+
+        use POSIX qw(strxfrm);
+        $xfrm_string = strxfrm("Mixed-case string");
+        print "locale collation ignores spaces\n"
+            if $xfrm_string eq strxfrm("Mixed-casestring");
+        print "locale collation ignores hyphens\n"
+            if $xfrm_string eq strxfrm("Mixedcase string");
+        print "locale collation ignores case\n"
+            if $xfrm_string eq strxfrm("mixed-case string");
+
+strxfrm() takes a string and maps it into a transformed string for use
+in char-by-char comparisons against other transformed strings during
+collation.  "Under the hood", locale-affected Perl comparison operators
+call strxfrm() for both operands, then do a char-by-char
+comparison of the transformed strings.  By calling strxfrm() explicitly
+and using a non locale-affected comparison, the example attempts to save
+a couple of transformations.  But in fact, it doesn't save anything: Perl
+magic (see L<perlguts/Magic Variables>) creates the transformed version of a
+string the first time it's needed in a comparison, then keeps this version around
+in case it's needed again.  An example rewritten the easy way with
+C<cmp> runs just about as fast.  It also copes with null characters
+embedded in strings; if you call strxfrm() directly, it treats the first
+null it finds as a terminator.  don't expect the transformed strings
+it produces to be portable across systems--or even from one revision
+of your operating system to the next.  In short, don't call strxfrm()
+directly: let Perl do it for you.
+
+Note: C<use locale> isn't shown in some of these examples because it isn't
+needed: strcoll() and strxfrm() exist only to generate locale-dependent
+results, and so always obey the current C<LC_COLLATE> locale.
+
+=head2 Category LC_CTYPE: Character Types
+
+In the scope of S<C<use locale>>, Perl obeys the C<LC_CTYPE> locale
+setting.  This controls the application's notion of which characters are
+alphabetic.  This affects Perl's C<\w> regular expression metanotation,
+which stands for alphanumeric characters--that is, alphabetic,
+numeric, and including other special characters such as the underscore or
+hyphen.  (Consult L<perlre> for more information about
+regular expressions.)  Thanks to C<LC_CTYPE>, depending on your locale
+setting, characters like 'E<aelig>', 'E<eth>', 'E<szlig>', and
+'E<oslash>' may be understood as C<\w> characters.
+
+The C<LC_CTYPE> locale also provides the map used in transliterating
+characters between lower and uppercase.  This affects the case-mapping
+functions--lc(), lcfirst, uc(), and ucfirst(); case-mapping
+interpolation with C<\l>, C<\L>, C<\u>, or C<\U> in double-quoted strings
+and C<s///> substitutions; and case-independent regular expression
+pattern matching using the C<i> modifier.
+
+Finally, C<LC_CTYPE> affects the POSIX character-class test
+functions--isalpha(), islower(), and so on.  For example, if you move
+from the "C" locale to a 7-bit Scandinavian one, you may find--possibly
+to your surprise--that "|" moves from the ispunct() class to isalpha().
+
+B<Note:> A broken or malicious C<LC_CTYPE> locale definition may result
+in clearly ineligible characters being considered to be alphanumeric by
+your application.  For strict matching of (mundane) letters and
+digits--for example, in command strings--locale-aware applications
+should use C<\w> inside a C<no locale> block.  See L<"SECURITY">.
+
+=head2 Category LC_NUMERIC: Numeric Formatting
+
+In the scope of S<C<use locale>>, Perl obeys the C<LC_NUMERIC> locale
+information, which controls an application's idea of how numbers should
+be formatted for human readability by the printf(), sprintf(), and
+write() functions.  String-to-numeric conversion by the POSIX::strtod()
+function is also affected.  In most implementations the only effect is to
+change the character used for the decimal point--perhaps from '.'  to ','.
+These functions aren't aware of such niceties as thousands separation and
+so on.  (See L<The localeconv function> if you care about these things.)
+
+Output produced by print() is also affected by the current locale: it
+depends on whether C<use locale> or C<no locale> is in effect, and
+corresponds to what you'd get from printf() in the "C" locale.  The
+same is true for Perl's internal conversions between numeric and
+string formats:
+
+        use POSIX qw(strtod);
+        use locale;
+
+        $n = 5/2;   # Assign numeric 2.5 to $n
+
+        $a = " $n"; # Locale-dependent conversion to string
+
+        print "half five is $n\n";       # Locale-dependent output
+
+        printf "half five is %g\n", $n;  # Locale-dependent output
+
+        print "DECIMAL POINT IS COMMA\n"
+            if $n == (strtod("2,5"))[0]; # Locale-dependent conversion
+
+See also L<I18N::Langinfo> and C<RADIXCHAR>.
+
+=head2 Category LC_MONETARY: Formatting of monetary amounts
+
+The C standard defines the C<LC_MONETARY> category, but no function
+that is affected by its contents.  (Those with experience of standards
+committees will recognize that the working group decided to punt on the
+issue.)  Consequently, Perl takes no notice of it.  If you really want
+to use C<LC_MONETARY>, you can query its contents--see 
+L<The localeconv function>--and use the information that it returns in your 
+application's own formatting of currency amounts.  However, you may well 
+find that the information, voluminous and complex though it may be, still 
+does not quite meet your requirements: currency formatting is a hard nut 
+to crack.
+
+See also L<I18N::Langinfo> and C<CRNCYSTR>.
+
+=head2 LC_TIME
+
+Output produced by POSIX::strftime(), which builds a formatted
+human-readable date/time string, is affected by the current C<LC_TIME>
+locale.  Thus, in a French locale, the output produced by the C<%B>
+format element (full month name) for the first month of the year would
+be "janvier".  Here's how to get a list of long month names in the
+current locale:
+
+        use POSIX qw(strftime);
+        for (0..11) {
+            $long_month_name[$_] =
+                strftime("%B", 0, 0, 0, 1, $_, 96);
+        }
+
+Note: C<use locale> isn't needed in this example: as a function that
+exists only to generate locale-dependent results, strftime() always
+obeys the current C<LC_TIME> locale.
+
+See also L<I18N::Langinfo> and C<ABDAY_1>..C<ABDAY_7>, C<DAY_1>..C<DAY_7>,
+C<ABMON_1>..C<ABMON_12>, and C<ABMON_1>..C<ABMON_12>.
+
+=head2 Other categories
+
+The remaining locale category, C<LC_MESSAGES> (possibly supplemented
+by others in particular implementations) is not currently used by
+Perl--except possibly to affect the behavior of library functions
+called by extensions outside the standard Perl distribution and by the
+operating system and its utilities.  Note especially that the string
+value of C<$!> and the error messages given by external utilities may
+be changed by C<LC_MESSAGES>.  If you want to have portable error
+codes, use C<%!>.  See L<Errno>.
+
+=head1 SECURITY
+
+Although the main discussion of Perl security issues can be found in
+L<perlsec>, a discussion of Perl's locale handling would be incomplete
+if it did not draw your attention to locale-dependent security issues.
+Locales--particularly on systems that allow unprivileged users to
+build their own locales--are untrustworthy.  A malicious (or just plain
+broken) locale can make a locale-aware application give unexpected
+results.  Here are a few possibilities:
+
+=over 4
+
+=item *
+
+Regular expression checks for safe file names or mail addresses using
+C<\w> may be spoofed by an C<LC_CTYPE> locale that claims that
+characters such as "E<gt>" and "|" are alphanumeric.
+
+=item *
+
+String interpolation with case-mapping, as in, say, C<$dest =
+"C:\U$name.$ext">, may produce dangerous results if a bogus LC_CTYPE
+case-mapping table is in effect.
+
+=item *
+
+A sneaky C<LC_COLLATE> locale could result in the names of students with
+"D" grades appearing ahead of those with "A"s.
+
+=item *
+
+An application that takes the trouble to use information in
+C<LC_MONETARY> may format debits as if they were credits and vice versa
+if that locale has been subverted.  Or it might make payments in US
+dollars instead of Hong Kong dollars.
+
+=item *
+
+The date and day names in dates formatted by strftime() could be
+manipulated to advantage by a malicious user able to subvert the
+C<LC_DATE> locale.  ("Look--it says I wasn't in the building on
+Sunday.")
+
+=back
+
+Such dangers are not peculiar to the locale system: any aspect of an
+application's environment which may be modified maliciously presents
+similar challenges.  Similarly, they are not specific to Perl: any
+programming language that allows you to write programs that take
+account of their environment exposes you to these issues.
+
+Perl cannot protect you from all possibilities shown in the
+examples--there is no substitute for your own vigilance--but, when
+C<use locale> is in effect, Perl uses the tainting mechanism (see
+L<perlsec>) to mark string results that become locale-dependent, and
+which may be untrustworthy in consequence.  Here is a summary of the
+tainting behavior of operators and functions that may be affected by
+the locale:
+
+=over 4
+
+=item  *
+
+B<Comparison operators> (C<lt>, C<le>, C<ge>, C<gt> and C<cmp>):
+
+Scalar true/false (or less/equal/greater) result is never tainted.
+
+=item  *
+
+B<Case-mapping interpolation> (with C<\l>, C<\L>, C<\u> or C<\U>)
+
+Result string containing interpolated material is tainted if
+C<use locale> is in effect.
+
+=item  *
+
+B<Matching operator> (C<m//>):
+
+Scalar true/false result never tainted.
+
+Subpatterns, either delivered as a list-context result or as $1 etc.
+are tainted if C<use locale> is in effect, and the subpattern regular
+expression contains C<\w> (to match an alphanumeric character), C<\W>
+(non-alphanumeric character), C<\s> (whitespace character), or C<\S>
+(non whitespace character).  The matched-pattern variable, $&, $`
+(pre-match), $' (post-match), and $+ (last match) are also tainted if
+C<use locale> is in effect and the regular expression contains C<\w>,
+C<\W>, C<\s>, or C<\S>.
+
+=item  *
+
+B<Substitution operator> (C<s///>):
+
+Has the same behavior as the match operator.  Also, the left
+operand of C<=~> becomes tainted when C<use locale> in effect
+if modified as a result of a substitution based on a regular
+expression match involving C<\w>, C<\W>, C<\s>, or C<\S>; or of
+case-mapping with C<\l>, C<\L>,C<\u> or C<\U>.
+
+=item *
+
+B<Output formatting functions> (printf() and write()):
+
+Results are never tainted because otherwise even output from print,
+for example C<print(1/7)>, should be tainted if C<use locale> is in
+effect.
+
+=item *
+
+B<Case-mapping functions> (lc(), lcfirst(), uc(), ucfirst()):
+
+Results are tainted if C<use locale> is in effect.
+
+=item *
+
+B<POSIX locale-dependent functions> (localeconv(), strcoll(),
+strftime(), strxfrm()):
+
+Results are never tainted.
+
+=item *
+
+B<POSIX character class tests> (isalnum(), isalpha(), isdigit(),
+isgraph(), islower(), isprint(), ispunct(), isspace(), isupper(),
+isxdigit()):
+
+True/false results are never tainted.
+
+=back
+
+Three examples illustrate locale-dependent tainting.
+The first program, which ignores its locale, won't run: a value taken
+directly from the command line may not be used to name an output file
+when taint checks are enabled.
+
+        #/usr/local/bin/perl -T
+        # Run with taint checking
+
+        # Command line sanity check omitted...
+        $tainted_output_file = shift;
+
+        open(F, ">$tainted_output_file")
+            or warn "Open of $untainted_output_file failed: $!\n";
+
+The program can be made to run by "laundering" the tainted value through
+a regular expression: the second example--which still ignores locale
+information--runs, creating the file named on its command line
+if it can.
+
+        #/usr/local/bin/perl -T
+
+        $tainted_output_file = shift;
+        $tainted_output_file =~ m%[\w/]+%;
+        $untainted_output_file = $&;
+
+        open(F, ">$untainted_output_file")
+            or warn "Open of $untainted_output_file failed: $!\n";
+
+Compare this with a similar but locale-aware program:
+
+        #/usr/local/bin/perl -T
+
+        $tainted_output_file = shift;
+        use locale;
+        $tainted_output_file =~ m%[\w/]+%;
+        $localized_output_file = $&;
+
+        open(F, ">$localized_output_file")
+            or warn "Open of $localized_output_file failed: $!\n";
+
+This third program fails to run because $& is tainted: it is the result
+of a match involving C<\w> while C<use locale> is in effect.
+
+=head1 ENVIRONMENT
+
+=over 12
+
+=item PERL_BADLANG
+
+A string that can suppress Perl's warning about failed locale settings
+at startup.  Failure can occur if the locale support in the operating
+system is lacking (broken) in some way--or if you mistyped the name of
+a locale when you set up your environment.  If this environment
+variable is absent, or has a value that does not evaluate to integer
+zero--that is, "0" or ""-- Perl will complain about locale setting
+failures.
+
+B<NOTE>: PERL_BADLANG only gives you a way to hide the warning message.
+The message tells about some problem in your system's locale support,
+and you should investigate what the problem is.
+
+=back
+
+The following environment variables are not specific to Perl: They are
+part of the standardized (ISO C, XPG4, POSIX 1.c) setlocale() method
+for controlling an application's opinion on data.
+
+=over 12
+
+=item LC_ALL
+
+C<LC_ALL> is the "override-all" locale environment variable. If
+set, it overrides all the rest of the locale environment variables.
+
+=item LANGUAGE
+
+B<NOTE>: C<LANGUAGE> is a GNU extension, it affects you only if you
+are using the GNU libc.  This is the case if you are using e.g. Linux.
+If you are using "commercial" UNIXes you are most probably I<not>
+using GNU libc and you can ignore C<LANGUAGE>.
+
+However, in the case you are using C<LANGUAGE>: it affects the
+language of informational, warning, and error messages output by
+commands (in other words, it's like C<LC_MESSAGES>) but it has higher
+priority than L<LC_ALL>.  Moreover, it's not a single value but
+instead a "path" (":"-separated list) of I<languages> (not locales).
+See the GNU C<gettext> library documentation for more information.
+
+=item LC_CTYPE
+
+In the absence of C<LC_ALL>, C<LC_CTYPE> chooses the character type
+locale.  In the absence of both C<LC_ALL> and C<LC_CTYPE>, C<LANG>
+chooses the character type locale.
+
+=item LC_COLLATE
+
+In the absence of C<LC_ALL>, C<LC_COLLATE> chooses the collation
+(sorting) locale.  In the absence of both C<LC_ALL> and C<LC_COLLATE>,
+C<LANG> chooses the collation locale.
+
+=item LC_MONETARY
+
+In the absence of C<LC_ALL>, C<LC_MONETARY> chooses the monetary
+formatting locale.  In the absence of both C<LC_ALL> and C<LC_MONETARY>,
+C<LANG> chooses the monetary formatting locale.
+
+=item LC_NUMERIC
+
+In the absence of C<LC_ALL>, C<LC_NUMERIC> chooses the numeric format
+locale.  In the absence of both C<LC_ALL> and C<LC_NUMERIC>, C<LANG>
+chooses the numeric format.
+
+=item LC_TIME
+
+In the absence of C<LC_ALL>, C<LC_TIME> chooses the date and time
+formatting locale.  In the absence of both C<LC_ALL> and C<LC_TIME>,
+C<LANG> chooses the date and time formatting locale.
+
+=item LANG
+
+C<LANG> is the "catch-all" locale environment variable. If it is set, it
+is used as the last resort after the overall C<LC_ALL> and the
+category-specific C<LC_...>.
+
+=back
+
+=head1 NOTES
+
+=head2 Backward compatibility
+
+Versions of Perl prior to 5.004 B<mostly> ignored locale information,
+generally behaving as if something similar to the C<"C"> locale were
+always in force, even if the program environment suggested otherwise
+(see L<The setlocale function>).  By default, Perl still behaves this
+way for backward compatibility.  If you want a Perl application to pay
+attention to locale information, you B<must> use the S<C<use locale>>
+pragma (see L<The use locale pragma>) to instruct it to do so.
+
+Versions of Perl from 5.002 to 5.003 did use the C<LC_CTYPE>
+information if available; that is, C<\w> did understand what
+were the letters according to the locale environment variables.
+The problem was that the user had no control over the feature:
+if the C library supported locales, Perl used them.
+
+=head2 I18N:Collate obsolete
+
+In versions of Perl prior to 5.004, per-locale collation was possible
+using the C<I18N::Collate> library module.  This module is now mildly
+obsolete and should be avoided in new applications.  The C<LC_COLLATE>
+functionality is now integrated into the Perl core language: One can
+use locale-specific scalar data completely normally with C<use locale>,
+so there is no longer any need to juggle with the scalar references of
+C<I18N::Collate>.
+
+=head2 Sort speed and memory use impacts
+
+Comparing and sorting by locale is usually slower than the default
+sorting; slow-downs of two to four times have been observed.  It will
+also consume more memory: once a Perl scalar variable has participated
+in any string comparison or sorting operation obeying the locale
+collation rules, it will take 3-15 times more memory than before.  (The
+exact multiplier depends on the string's contents, the operating system
+and the locale.) These downsides are dictated more by the operating
+system's implementation of the locale system than by Perl.
+
+=head2 write() and LC_NUMERIC
+
+Formats are the only part of Perl that unconditionally use information
+from a program's locale; if a program's environment specifies an
+LC_NUMERIC locale, it is always used to specify the decimal point
+character in formatted output.  Formatted output cannot be controlled by
+C<use locale> because the pragma is tied to the block structure of the
+program, and, for historical reasons, formats exist outside that block
+structure.
+
+=head2 Freely available locale definitions
+
+There is a large collection of locale definitions at
+ftp://dkuug.dk/i18n/WG15-collection .  You should be aware that it is
+unsupported, and is not claimed to be fit for any purpose.  If your
+system allows installation of arbitrary locales, you may find the
+definitions useful as they are, or as a basis for the development of
+your own locales.
+
+=head2 I18n and l10n
+
+"Internationalization" is often abbreviated as B<i18n> because its first
+and last letters are separated by eighteen others.  (You may guess why
+the internalin ... internaliti ... i18n tends to get abbreviated.)  In
+the same way, "localization" is often abbreviated to B<l10n>.
+
+=head2 An imperfect standard
+
+Internationalization, as defined in the C and POSIX standards, can be
+criticized as incomplete, ungainly, and having too large a granularity.
+(Locales apply to a whole process, when it would arguably be more useful
+to have them apply to a single thread, window group, or whatever.)  They
+also have a tendency, like standards groups, to divide the world into
+nations, when we all know that the world can equally well be divided
+into bankers, bikers, gamers, and so on.  But, for now, it's the only
+standard we've got.  This may be construed as a bug.
+
+=head1 Unicode and UTF-8
+
+The support of Unicode is new starting from Perl version 5.6, and
+more fully implemented in the version 5.8.  See L<perluniintro> and
+L<perlunicode> for more details.
+
+Usually locale settings and Unicode do not affect each other, but
+there are exceptions, see L<perlunicode/Locales> for examples.
+
+=head1 BUGS
+
+=head2 Broken systems
+
+In certain systems, the operating system's locale support
+is broken and cannot be fixed or used by Perl.  Such deficiencies can
+and will result in mysterious hangs and/or Perl core dumps when the
+C<use locale> is in effect.  When confronted with such a system,
+please report in excruciating detail to <F<perlbug@perl.org>>, and
+complain to your vendor: bug fixes may exist for these problems
+in your operating system.  Sometimes such bug fixes are called an
+operating system upgrade.
+
+=head1 SEE ALSO
+
+L<I18N::Langinfo>, L<perluniintro>, L<perlunicode>, L<open>,
+L<POSIX/isalnum>, L<POSIX/isalpha>,
+L<POSIX/isdigit>, L<POSIX/isgraph>, L<POSIX/islower>,
+L<POSIX/isprint>, L<POSIX/ispunct>, L<POSIX/isspace>,
+L<POSIX/isupper>, L<POSIX/isxdigit>, L<POSIX/localeconv>,
+L<POSIX/setlocale>, L<POSIX/strcoll>, L<POSIX/strftime>,
+L<POSIX/strtod>, L<POSIX/strxfrm>.
+
+=head1 HISTORY
+
+Jarkko Hietaniemi's original F<perli18n.pod> heavily hacked by Dominic
+Dunlop, assisted by the perl5-porters.  Prose worked over a bit by
+Tom Christiansen.
+
+Last update: Thu Jun 11 08:44:13 MDT 1998
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perllol.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perllol.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perllol.pod	(revision 14489)
@@ -0,0 +1,303 @@
+=head1 NAME
+
+perllol - Manipulating Arrays of Arrays in Perl
+
+=head1 DESCRIPTION
+
+=head2 Declaration and Access of Arrays of Arrays
+
+The simplest thing to build is an array of arrays (sometimes imprecisely
+called a list of lists).  It's reasonably easy to understand, and
+almost everything that applies here will also be applicable later
+on with the fancier data structures.
+
+An array of an array is just a regular old array @AoA that you can
+get at with two subscripts, like C<$AoA[3][2]>.  Here's a declaration
+of the array:
+
+    # assign to our array, an array of array references
+    @AoA = (
+	   [ "fred", "barney" ],
+	   [ "george", "jane", "elroy" ],
+	   [ "homer", "marge", "bart" ],
+    );
+
+    print $AoA[2][2];
+  bart
+
+Now you should be very careful that the outer bracket type
+is a round one, that is, a parenthesis.  That's because you're assigning to
+an @array, so you need parentheses.  If you wanted there I<not> to be an @AoA,
+but rather just a reference to it, you could do something more like this:
+
+    # assign a reference to array of array references
+    $ref_to_AoA = [
+	[ "fred", "barney", "pebbles", "bambam", "dino", ],
+	[ "homer", "bart", "marge", "maggie", ],
+	[ "george", "jane", "elroy", "judy", ],
+    ];
+
+    print $ref_to_AoA->[2][2];
+
+Notice that the outer bracket type has changed, and so our access syntax
+has also changed.  That's because unlike C, in perl you can't freely
+interchange arrays and references thereto.  $ref_to_AoA is a reference to an
+array, whereas @AoA is an array proper.  Likewise, C<$AoA[2]> is not an
+array, but an array ref.  So how come you can write these:
+
+    $AoA[2][2]
+    $ref_to_AoA->[2][2]
+
+instead of having to write these:
+
+    $AoA[2]->[2]
+    $ref_to_AoA->[2]->[2]
+
+Well, that's because the rule is that on adjacent brackets only (whether
+square or curly), you are free to omit the pointer dereferencing arrow.
+But you cannot do so for the very first one if it's a scalar containing
+a reference, which means that $ref_to_AoA always needs it.
+
+=head2 Growing Your Own
+
+That's all well and good for declaration of a fixed data structure,
+but what if you wanted to add new elements on the fly, or build
+it up entirely from scratch?
+
+First, let's look at reading it in from a file.  This is something like
+adding a row at a time.  We'll assume that there's a flat file in which
+each line is a row and each word an element.  If you're trying to develop an
+@AoA array containing all these, here's the right way to do that:
+
+    while (<>) {
+	@tmp = split;
+	push @AoA, [ @tmp ];
+    }
+
+You might also have loaded that from a function:
+
+    for $i ( 1 .. 10 ) {
+	$AoA[$i] = [ somefunc($i) ];
+    }
+
+Or you might have had a temporary variable sitting around with the
+array in it.
+
+    for $i ( 1 .. 10 ) {
+	@tmp = somefunc($i);
+	$AoA[$i] = [ @tmp ];
+    }
+
+It's very important that you make sure to use the C<[]> array reference
+constructor.  That's because this will be very wrong:
+
+    $AoA[$i] = @tmp;
+
+You see, assigning a named array like that to a scalar just counts the
+number of elements in @tmp, which probably isn't what you want.
+
+If you are running under C<use strict>, you'll have to add some
+declarations to make it happy:
+
+    use strict;
+    my(@AoA, @tmp);
+    while (<>) {
+	@tmp = split;
+	push @AoA, [ @tmp ];
+    }
+
+Of course, you don't need the temporary array to have a name at all:
+
+    while (<>) {
+	push @AoA, [ split ];
+    }
+
+You also don't have to use push().  You could just make a direct assignment
+if you knew where you wanted to put it:
+
+    my (@AoA, $i, $line);
+    for $i ( 0 .. 10 ) {
+	$line = <>;
+	$AoA[$i] = [ split ' ', $line ];
+    }
+
+or even just
+
+    my (@AoA, $i);
+    for $i ( 0 .. 10 ) {
+	$AoA[$i] = [ split ' ', <> ];
+    }
+
+You should in general be leery of using functions that could
+potentially return lists in scalar context without explicitly stating
+such.  This would be clearer to the casual reader:
+
+    my (@AoA, $i);
+    for $i ( 0 .. 10 ) {
+	$AoA[$i] = [ split ' ', scalar(<>) ];
+    }
+
+If you wanted to have a $ref_to_AoA variable as a reference to an array,
+you'd have to do something like this:
+
+    while (<>) {
+	push @$ref_to_AoA, [ split ];
+    }
+
+Now you can add new rows.  What about adding new columns?  If you're
+dealing with just matrices, it's often easiest to use simple assignment:
+
+    for $x (1 .. 10) {
+	for $y (1 .. 10) {
+	    $AoA[$x][$y] = func($x, $y);
+	}
+    }
+
+    for $x ( 3, 7, 9 ) {
+	$AoA[$x][20] += func2($x);
+    }
+
+It doesn't matter whether those elements are already
+there or not: it'll gladly create them for you, setting
+intervening elements to C<undef> as need be.
+
+If you wanted just to append to a row, you'd have
+to do something a bit funnier looking:
+
+    # add new columns to an existing row
+    push @{ $AoA[0] }, "wilma", "betty";
+
+Notice that I I<couldn't> say just:
+
+    push $AoA[0], "wilma", "betty";  # WRONG!
+
+In fact, that wouldn't even compile.  How come?  Because the argument
+to push() must be a real array, not just a reference to such.
+
+=head2 Access and Printing
+
+Now it's time to print your data structure out.  How
+are you going to do that?  Well, if you want only one
+of the elements, it's trivial:
+
+    print $AoA[0][0];
+
+If you want to print the whole thing, though, you can't
+say
+
+    print @AoA;		# WRONG
+
+because you'll get just references listed, and perl will never
+automatically dereference things for you.  Instead, you have to
+roll yourself a loop or two.  This prints the whole structure,
+using the shell-style for() construct to loop across the outer
+set of subscripts.
+
+    for $aref ( @AoA ) {
+	print "\t [ @$aref ],\n";
+    }
+
+If you wanted to keep track of subscripts, you might do this:
+
+    for $i ( 0 .. $#AoA ) {
+	print "\t elt $i is [ @{$AoA[$i]} ],\n";
+    }
+
+or maybe even this.  Notice the inner loop.
+
+    for $i ( 0 .. $#AoA ) {
+	for $j ( 0 .. $#{$AoA[$i]} ) {
+	    print "elt $i $j is $AoA[$i][$j]\n";
+	}
+    }
+
+As you can see, it's getting a bit complicated.  That's why
+sometimes is easier to take a temporary on your way through:
+
+    for $i ( 0 .. $#AoA ) {
+	$aref = $AoA[$i];
+	for $j ( 0 .. $#{$aref} ) {
+	    print "elt $i $j is $AoA[$i][$j]\n";
+	}
+    }
+
+Hmm... that's still a bit ugly.  How about this:
+
+    for $i ( 0 .. $#AoA ) {
+	$aref = $AoA[$i];
+	$n = @$aref - 1;
+	for $j ( 0 .. $n ) {
+	    print "elt $i $j is $AoA[$i][$j]\n";
+	}
+    }
+
+=head2 Slices
+
+If you want to get at a slice (part of a row) in a multidimensional
+array, you're going to have to do some fancy subscripting.  That's
+because while we have a nice synonym for single elements via the
+pointer arrow for dereferencing, no such convenience exists for slices.
+(Remember, of course, that you can always write a loop to do a slice
+operation.)
+
+Here's how to do one operation using a loop.  We'll assume an @AoA
+variable as before.
+
+    @part = ();
+    $x = 4;
+    for ($y = 7; $y < 13; $y++) {
+	push @part, $AoA[$x][$y];
+    }
+
+That same loop could be replaced with a slice operation:
+
+    @part = @{ $AoA[4] } [ 7..12 ];
+
+but as you might well imagine, this is pretty rough on the reader.
+
+Ah, but what if you wanted a I<two-dimensional slice>, such as having
+$x run from 4..8 and $y run from 7 to 12?  Hmm... here's the simple way:
+
+    @newAoA = ();
+    for ($startx = $x = 4; $x <= 8; $x++) {
+	for ($starty = $y = 7; $y <= 12; $y++) {
+	    $newAoA[$x - $startx][$y - $starty] = $AoA[$x][$y];
+	}
+    }
+
+We can reduce some of the looping through slices
+
+    for ($x = 4; $x <= 8; $x++) {
+	push @newAoA, [ @{ $AoA[$x] } [ 7..12 ] ];
+    }
+
+If you were into Schwartzian Transforms, you would probably
+have selected map for that
+
+    @newAoA = map { [ @{ $AoA[$_] } [ 7..12 ] ] } 4 .. 8;
+
+Although if your manager accused of seeking job security (or rapid
+insecurity) through inscrutable code, it would be hard to argue. :-)
+If I were you, I'd put that in a function:
+
+    @newAoA = splice_2D( \@AoA, 4 => 8, 7 => 12 );
+    sub splice_2D {
+	my $lrr = shift; 	# ref to array of array refs!
+	my ($x_lo, $x_hi,
+	    $y_lo, $y_hi) = @_;
+
+	return map {
+	    [ @{ $lrr->[$_] } [ $y_lo .. $y_hi ] ]
+	} $x_lo .. $x_hi;
+    }
+
+
+=head1 SEE ALSO
+
+perldata(1), perlref(1), perldsc(1)
+
+=head1 AUTHOR
+
+Tom Christiansen <F<tchrist@perl.com>>
+
+Last update: Thu Jun  4 16:16:23 MDT 1998
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmachten.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmachten.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmachten.pod	(revision 14489)
@@ -0,0 +1,116 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.machten - Perl version 5 on Power MachTen systems
+
+=head1 DESCRIPTION
+
+This document describes how to build Perl 5 on Power MachTen systems,
+and discusses a few wrinkles in the implementation.
+
+=head2 Perl version 5.8.x and greater not supported
+
+B<Power MachTen is not supported by versions of Perl later than
+5.6.x.>
+If you wish to build a version from the 5.6 track, please
+obtain a source distribution from the archive at
+L<http://cpan.org/src/5.0/> and follow the instructions in its
+README.machten file.
+
+MachTen is no longer supported by its developers, Tenon Intersystems.
+A UNIX environment hosted on Mac OS Classic, MachTen has been
+superseded by Mac OS X and by BSD and Linux implementations for Macintosh
+hardware.
+The final version of Power MachTen, 4.1.4, lacks many features found in
+modern implementations of UNIX, and has a number of bugs.
+These shortcomings prevent recent versions of Perl from being able to use
+extensions on MachTen, and cause numerous test suite failures in the
+perl core.
+
+In September 2003, a discussion on the MachTen mailing list determined
+that there was no interest in making a later version of Perl build
+successfully on MachTen.
+Consequently, support for building Perl under MachTen has been suppressed
+in Perl distributions published after February 2004.
+The hints file, F<hints/machten.sh>, remains a part of the
+distributions for reference purposes.
+
+=head2 Compiling Perl 5.6.x on MachTen
+
+To compile perl 5.6.x under MachTen 4.1.4 (and probably earlier versions):
+
+  ./Configure -de
+  make
+  make test
+  make install
+
+This builds and installs a statically-linked perl; MachTen's dynamic
+linking facilities are not adequate to support Perl's use of
+dynamically linked libraries.  (See F<hints/machten.sh> for more
+information.)
+
+You should have at least 32 megabytes of free memory on your
+system before running the C<make> command.
+
+For much more information on building perl -- for example, on how to
+change the default installation directory -- see F<INSTALL>.
+
+=head2 Failures during C<make test> on MachTen
+
+=over 4
+
+=item op/lexassign.t
+
+This test may fail when first run after building perl.  It does not
+fail subsequently.  The cause is unknown.
+
+=item pragma/warnings.t
+
+Test 257 fails due to a failure to warn about attempts to read from a
+filehandle which is a duplicate of stdout when stdout is attached to a
+pipe.  The output of the test contains a block comment which discusses
+a different failure, not applicable to MachTen.
+
+The root of the problem is that Machten does not assign a file type to
+either end of a pipe (see L<stat>), resulting, among other things
+in Perl's C<-p> test failing on file descriptors belonging to pipes.
+As a result, perl becomes confused, and the test for reading from a
+write-only file fails.  I am reluctant to patch perl to get around
+this, as it's clearly an OS bug (about which Tenon has been informed),
+and limited in its effect on practical Perl programs.
+
+=back
+
+=head2 Building external modules on MachTen
+
+To add an external module to perl, build in the normal way, which
+is documented in L<ExtUtils::MakeMaker>, or which can be driven
+automatically by the CPAN module (see L<CPAN>), which is part of the
+standard distribution.  If you want to install a module which
+contains XS code (C or C++ source which compiles to object code
+for linking with perl), you will have to replace your perl binary with
+a new version containing the new statically-linked object module.  The
+build process tells you how to do this.
+
+There is a gotcha, however, which users usually encounter immediately
+they respond to CPAN's invitation to C<install Bundle::CPAN>. When
+installing a I<bundle> -- a group of modules which together achieve
+some particular purpose, the installation process for later modules in
+the bundle tends to assume that earlier modules have been fully
+installed and are available for use.  This is not true on a
+statically-linked system for earlier modules which contain XS code.
+As a result the installation of the bundle fails.  The work-around is
+not to install the bundle as a one-shot operation, but instead to see
+what modules it contains, and install these one-at-a-time by hand in
+the order given.
+
+=head1 AUTHOR
+
+Dominic Dunlop <domo@computer.org>
+
+=head1 DATE
+
+Version 1.1.0 2004-02-13
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmacos.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmacos.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmacos.pod	(revision 14489)
@@ -0,0 +1,64 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.macos - Perl under Mac OS (Classic)
+
+=head1 SYNOPSIS
+
+This document briefly describes perl under Mac OS (Classic).
+If you are running perl under Mac OS X, you don't want to be
+here (unless you are in the Classic environment under Mac OS X).
+
+When we say "Mac OS" below, we mean Mac OS 7, 8, and 9, and I<not>
+Mac OS X.
+
+
+=head1 DESCRIPTION
+
+The latest perl source itself builds on Mac OS, with some additional
+pieces. Support for Mac OS is now in the perl core, and MacPerl is kept
+in close sync with regular perl releases.
+
+To build perl for Mac OS (as an MPW tool), you will need the addition
+of the F<macos> subdirectory, distributed separately.  It includes extra
+source files, config files, and make files.  It also includes extra
+Mac-specific modules.
+
+To build the MacPerl application, you will also need the F<macperl>
+directory, which includes the source files for creating the
+application itself.
+
+All of this is available from the development site, via
+HTTP (in the MacPerl Installer, which includes all the source
+and binaries) and anonymous CVS.
+
+	http://dev.macperl.org/
+
+The source is also in the main perl repository in the macperl
+branch (the 5.6 source is in the maint-5.6/macperl branch).
+
+You will also need compilers and libraries, all of them freely
+available.  These are linked to from the SourceForge site. Go that site
+for all things having to do with MacPerl development.
+
+MacPerl 5.6.1 and later are supported on Mac OS 8.1 and later, for 68040
+and PowerPC architectures.  The MPW tool may be used on Mac OS 7.5.5
+and 68030 computers.
+
+MacPerl 5.2.0r4 is also available, on the CPAN and on SourceForge.  It
+is based on perl 5.004, and works with Mac OS 7.5.5 and 68030 computers.
+
+
+=head1 AUTHOR
+
+perl was ported to Mac OS by Matthias Neeracher
+E<lt>neeracher@mac.comE<gt>.  It is currently maintained by Chris
+Nandor E<lt>pudge@pobox.comE<gt>.
+
+
+=head1 DATE
+
+Last modified 2002.05.02.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmacosx.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmacosx.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmacosx.pod	(revision 14489)
@@ -0,0 +1,233 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.macosx - Perl under Mac OS X
+
+=head1 SYNOPSIS
+
+This document briefly describes perl under Mac OS X.
+
+
+=head1 DESCRIPTION
+
+The latest Perl release (5.8.8 as of this writing) builds without changes
+under Mac OS X. Under 10.3 "Panther" and newer OS versions, all self-tests
+pass, and all standard features are supported.
+
+Earlier Mac OS X releases (10.2 "Jaguar" and older) did not include a
+completely thread-safe libc, so threading is not fully supported. Also,
+earlier releases included a buggy libdb, so some of the DB_File tests
+are known to fail on those releases.
+
+
+=head2 Installation Prefix
+
+The default installation location for this release uses the traditional
+UNIX directory layout under /usr/local. This is the recommended location
+for most users, and will leave the Apple-supplied Perl and its modules
+undisturbed.
+
+Using an installation prefix of '/usr' will result in a directory layout
+that mirrors that of Apple's default Perl, with core modules stored in
+'/System/Library/Perl/${version}', CPAN modules stored in
+'/Library/Perl/${version}', and the addition of
+'/Network/Library/Perl/${version}' to @INC for modules that are stored
+on a file server and used by many Macs.
+
+
+=head2 SDK support
+
+First, export the path to the SDK into the build environment:
+
+    export SDK=/Developer/SDKs/MacOSX10.3.9.sdk
+
+Use an SDK by exporting some additions to Perl's 'ccflags' and '..flags'
+config variables:
+
+    ./Configure -Accflags="-nostdinc -B$SDK/usr/include/gcc \
+                           -B$SDK/usr/lib/gcc -isystem$SDK/usr/include \
+                           -F$SDK/System/Library/Frameworks" \
+                -Aldflags="-Wl,-syslibroot,$SDK" \
+                -de
+
+=head2 Universal Binary support
+
+To compile perl as a universal binary (built for both ppc and intel), export
+the SDK variable as above, selecting the 10.4u SDK:
+
+    export SDK=/Developer/SDKs/MacOSX10.4u.sdk
+
+In addition to the compiler flags used to select the SDK, also add the flags
+for creating a universal binary:
+
+    ./Configure -Accflags="-arch i686 -arch ppc -nostdinc -B$SDK/usr/include/gcc \
+                           -B$SDK/usr/lib/gcc -isystem$SDK/usr/include \
+                           -F$SDK/System/Library/Frameworks" \
+                -Aldflags="-arch i686 -arch ppc -Wl,-syslibroot,$SDK" \
+                -de
+
+Keep in mind that these compiler and linker settings will also be used when
+building CPAN modules. For XS modules to be compiled as a universal binary, any
+libraries it links to must also be universal binaries. The system libraries that
+Apple includes with the 10.4u SDK are all universal, but user-installed libraries
+may need to be re-installed as universal binaries.
+
+=head2 libperl and Prebinding
+
+Mac OS X ships with a dynamically-loaded libperl, but the default for
+this release is to compile a static libperl. The reason for this is
+pre-binding. Dynamic libraries can be pre-bound to a specific address in
+memory in order to decrease load time. To do this, one needs to be aware
+of the location and size of all previously-loaded libraries. Apple
+collects this information as part of their overall OS build process, and
+thus has easy access to it when building Perl, but ordinary users would
+need to go to a great deal of effort to obtain the information needed
+for pre-binding.
+
+You can override the default and build a shared libperl if you wish
+(S<Configure ... -Duseshrlib>), but the load time on pre-10.4 OS
+releases will be greater than either the static library, or Apple's
+pre-bound dynamic library.
+
+With 10.4 "Tiger" and newer, Apple has all but eliminated the performance
+penalty for non-prebound libraries.
+
+
+=head2 Updating Apple's Perl
+
+In a word - don't, at least without a *very* good reason. Your scripts
+can just as easily begin with "#!/usr/local/bin/perl" as with
+"#!/usr/bin/perl". Scripts supplied by Apple and other third parties as
+part of installation packages and such have generally only been tested
+with the /usr/bin/perl that's installed by Apple.
+
+If you find that you do need to update the system Perl, one issue worth
+keeping in mind is the question of static vs. dynamic libraries. If you
+upgrade using the default static libperl, you will find that the dynamic
+libperl supplied by Apple will not be deleted. If both libraries are
+present when an application that links against libperl is built, ld will
+link against the dynamic library by default. So, if you need to replace
+Apple's dynamic libperl with a static libperl, you need to be sure to
+delete the older dynamic library after you've installed the update.
+
+
+=head2 Known problems
+
+If you have installed extra libraries such as GDBM through Fink
+(in other words, you have libraries under F</sw/lib>), or libdlcompat
+to F</usr/local/lib>, you may need to be extra careful when running
+Configure to not to confuse Configure and Perl about which libraries
+to use.  Being confused will show up for example as "dyld" errors about
+symbol problems, for example during "make test". The safest bet is to run
+Configure as
+
+    Configure ... -Uloclibpth -Dlibpth=/usr/lib
+
+to make Configure look only into the system libraries.  If you have some
+extra library directories that you really want to use (such as newer
+Berkeley DB libraries in pre-Panther systems), add those to the libpth:
+
+    Configure ... -Uloclibpth -Dlibpth='/usr/lib /opt/lib'
+
+The default of building Perl statically may cause problems with complex
+applications like Tk: in that case consider building shared Perl
+
+    Configure ... -Duseshrplib
+
+but remember that there's a startup cost to pay in that case (see above
+"libperl and Prebinding").
+
+Starting with Tiger (Mac OS X 10.4), Apple shipped broken locale files for
+the eu_ES locale (Basque-Spain).  In previous releases of Perl, this resulted in
+failures in the C<lib/locale> test. These failures have been supressed
+in the current release of Perl by making the test ignore the broken locale.
+If you need to use the eu_ES locale, you should contact Apple support.
+
+=head2 MacPerl
+
+Quite a bit has been written about MacPerl, the Perl distribution for
+"Classic MacOS" - that is, versions 9 and earlier of MacOS. Because it
+runs in environment that's very different from that of UNIX, many things
+are done differently in MacPerl. Modules are installed using a different
+procedure, Perl itself is built differently, path names are different,
+etc.
+
+From the perspective of a Perl programmer, Mac OS X is more like a
+traditional UNIX than Classic MacOS. If you find documentation that
+refers to a special procedure that's needed for MacOS that's drastically
+different from the instructions provided for UNIX, the MacOS
+instructions are quite often intended for MacPerl on Classic MacOS. In
+that case, the correct procedure on Mac OS X is usually to follow the
+UNIX instructions, rather than the MacPerl instructions.
+
+
+=head2 Carbon
+
+MacPerl ships with a number of modules that are used to access the
+classic MacOS toolbox. Many of these modules have been updated to use
+Mac OS X's newer "Carbon" toolbox, and are available from CPAN in the
+"Mac::Carbon" module.
+
+
+=head2 Cocoa
+
+There are two ways to use Cocoa from Perl. Apple's PerlObjCBridge
+module, included with Mac OS X, can be used by standalone scripts to
+access Foundation (i.e. non-GUI) classes and objects.
+
+An alternative is CamelBones, a framework that allows access to both
+Foundation and AppKit classes and objects, so that full GUI applications
+can be built in Perl. CamelBones can be found on SourceForge, at
+L<http://www.sourceforge.net/projects/camelbones/>.
+
+
+=head1 Starting From Scratch
+
+Unfortunately it is not that difficult somehow manage to break one's
+Mac OS X Perl rather severely.  If all else fails and you want to
+really, B<REALLY>, start from scratch and remove even your Apple Perl
+installation (which has become corrupted somehow), the following
+instructions should do it.  B<Please think twice before following
+these instructions: they are much like conducting brain surgery to
+yourself.  Without anesthesia.>  We will B<not> come to fix your system
+if you do this.
+
+First, get rid of the libperl.dylib:
+
+    # cd /System/Library/Perl/darwin/CORE
+    # rm libperl.dylib
+
+Then delete every .bundle file found anywhere in the folders:
+
+    /System/Library/Perl
+    /Library/Perl
+
+You can find them for example by
+
+    # find /System/Library/Perl /Library/Perl -name '*.bundle' -print
+
+After this you can either copy Perl from your operating system media
+(you will need at least the /System/Library/Perl and /usr/bin/perl),
+or rebuild Perl from the source code with C<Configure -Dprefix=/usr
+-Dusershrplib> NOTE: the C<-Dprefix=/usr> to replace the system Perl
+works much better with Perl 5.8.1 and later, in Perl 5.8.0 the
+settings were not quite right.
+
+"Pacifist" from CharlesSoft (L<http://www.charlessoft.com/>) is a nice
+way to extract the Perl binaries from the OS media, without having to
+reinstall the entire OS.
+
+
+=head1 AUTHOR
+
+This README was written by Sherm Pendley E<lt>sherm@dot-app.orgE<gt>,
+and subsequently updated by Dominic Dunlop E<lt>domo@computer.orgE<gt>.
+The "Starting From Scratch" recipe was contributed by John Montbriand
+E<lt>montbriand@apple.comE<gt>.
+
+=head1 DATE
+
+Last modified 2005-11-07.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmint.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmint.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmint.pod	(revision 14489)
@@ -0,0 +1,229 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.mint - Perl version 5 on Atari MiNT
+
+=head1 DESCRIPTION
+
+There is a binary version of perl available from the FreeMiNT project
+http://freemint.de/  You may wish to use this instead of trying to
+compile yourself.
+
+B<The following advice is from perl 5.004_02 and is probably rather
+out of date.>
+
+If you want to build perl yourself on MiNT (or maybe on an Atari without
+MiNT) you may want to accept some advice from somebody who already did it...
+
+There was a perl port for Atari ST done by ++jrb bammi@cadence.com.
+This port tried very hard to build on non-MiNT-systems.  For the
+sake of efficiency I've left this way.  Yet, I haven't removed bammi's
+patches but left them intact.  Unfortunately some of the files that
+bammi contributed to the perl distribution seem to have vanished?
+
+So, how can you distinguish my patches from bammi's patches?  All of
+bammi's stuff is embedded in "#ifdef atarist" preprocessor macros.
+My MiNT port uses "#ifdef __MINT__" instead (and unconditionally
+undefines "atarist".  If you want to continue on bammi's port, all 
+you have to do is to swap the "-D" and "-U" switches for "__MINT__"  
+and "atarist" in the variable ccflags.
+
+However, I think that my version will still run on non-MiNT-systems
+provided that the user has a Eunuchs-like environment (i.e. the
+standard envariables like $PATH, $HOME, ... are set, there is a
+POSIX compliant shell in /bin/sh, and...)
+
+=head1 Known problems with Perl on MiNT
+
+The problems you may encounter when building perl on your machine
+are most probably due to deficiencies in MiNT resp. the Atari
+platform in general.
+
+First of all, if you have less than 8 MB of RAM you shouldn't
+even try to build Perl yourself.  Better grab a binary pre-compiled
+version somewhere.  Even if you have more memory you should take
+some care.  Try to run in a fresh environment (without memory
+fragmented too much) with as few daemons, accessories, xcontrol
+modules etc. as possible.  If you run some AES you should 
+consider to start a console based environment instead.
+
+A problem has been reported with sed.  Sed is used to create
+some configuration files based on the answers you have given
+to the Configure script.  Unfortunately the Perl Configure script
+shows sed on MiNT its limits.  I have sed 2.05 with a stacksize
+of 64k and I have encountered no problems.  If sed crashes
+during your configuration process you should first try to
+augment sed's stacksize:
+
+	fixstk 64k /usr/bin/sed
+
+(or similar).  If it still doesn't help you may have a look
+which other versions of sed are installed on your system.
+If you have a KGMD 1.0 installation you will find three
+in /usr/bin.  Have a look there.
+
+Perl has some "mammut" C files.  If gcc reports "internal
+compiler error: program cc1 got fatal signal 10" this is very
+likely due to a stack overflow in program cc1. Find cc1 
+and fix its stack.  I have made good experiences with 
+
+	fixstk 2 cc1
+
+This doesn't establish a stack of 2 Bytes only as you might
+think.  It really reserves one half of the available memory
+for cc1's stack.  A setting of 1 would reserve the entire
+memory for cc1, 3 would reserve three fourths.  You will have
+to find out the value that suits to your system yourself.
+
+To find out the location of the program "cc1" simply type
+`gcc --print-prog-name cc1' at your shell prompt.
+
+Now run make (maybe "make -k").  If you get a fatal signal 10 
+increase cc1's stacksize, if you run out of memory you should 
+either decrease the stacksize or follow some more hints:
+
+Perl's building process is very handy on machines with a lot
+of virtual memory but may result in a disaster if you are short
+of memory.  If gcc fails to compile many source files you should
+reduce the optimization.  Grep for "optimize" in the file
+config.sh and change the flags.
+
+If only several huge files cause problems (actually it is not a
+matter of the file size resp. the amount of code but depends on
+the size of the individual functions) it is useful to bypass
+the make program and compile these files directly from the
+command line.  For example if you got something like the
+following from make:
+
+	CCCMD = gcc -DPERL_CORE ....
+	...
+	...: virtual memory exhausted
+
+you should hack into the shell:
+
+	gcc -DPERL_CORE ... toke.c
+
+Please note that you have to add the name of the source file
+(here toke.c) at the end.
+
+If none of this helps, you're helpless.  Wait for a binary
+release.  If you have succeeded you may encounter another problem
+at the linking process.  If gcc complains that it can't find
+some libraries within the perl distribution you probably have
+an old linker.  If it complains for example about "file not
+found for xxx.olb" you should cd into the directory in
+question and
+
+	ln -s libxxx.a xxx.olb
+
+This will fix the problem.
+
+This version (5.00402) of perl has passed most of the tests on my system:
+
+ Failed Test  Status Wstat Total Fail  Failed  List of failed
+ ------------------------------------------------------------------------------
+ io/pipe.t                    10    2  20.00%  7, 9
+ io/tell.t                    13    1   7.69%  12
+ lib/complex.t               762   13   1.71%  84-85, 248-251, 257, 272-273,
+                                               371, 380, 419-420
+ lib/io_pipe.t                10    1  10.00%  9
+ lib/io_tell.t                13    1   7.69%  12
+ op/magic.t                   30    2   6.67%  29-30
+ Failed 6/152 test scripts, 96.05% okay. 20/4359 subtests failed, 99.54% okay.
+
+Pipes always cause problems with MiNT, it's actually a surprise that
+most of the tests did work.  I've got no idea why the "tell" test failed,
+this shouldn't mean too big a problem however.
+
+Most of the failures of lib/complex seem to be harmless, actually errors
+far right to the decimal point...  Two failures seem to be serious:
+The sign of the results is reversed.  I would say that this is due
+to minor bugs in the portable math lib that I compiled perl with.
+
+I haven't bothered very much to find the reason for the failures
+with op/magic.t and op/stat.t.  Maybe you'll find it out.
+
+##########################################################################
+
+Another possible problem may arise from the implementation of the "pwd" 
+command.  It happened to add a carriage return and newline to its output 
+no matter what the setting of $UNIXMODE is.  This is quite annoying since many
+library modules for perl take the output of pwd, chop off the
+trailing newline character and then expect to see a valid path in
+that.  But the carriage return (last but second character!) isn't
+chopped off.  You can either try to patch all library modules (at
+the price of performance for the extra transformation) or you can
+use my version of pwd that doesn't suffer from this deficiency.
+
+The fixed implementation is in the mint subdirectory.  Running
+"Configure" will attempt to build and install it if necessary
+(hints/mint.sh will do this work) but you can build and install it
+explicitly by:
+
+	cd mint
+	make install
+
+This is the fastest solution.
+
+Just in case you want to go the hard way: perl won't even build with a
+broken pwd!  You will have to fix the library modules
+(ext/POSIX/POSIX.pm, lib/Cwd.pm, lib/pwd.pl) at last after building
+miniperl.
+
+A major nuisance of current MiNTLib versions is the implementation
+of system() which is far from being POSIX compliant.  A real system()
+should fork and then exec /bin/sh with its argument as a command
+line to the shell.  The MiNTLib system() however doesn't expect
+that every user has a POSIX shell in /bin/sh.  It tries to work
+around the problem by forking and exec'ing the first token in its argument
+string.  To get a little bit of compliance to POSIX system() it
+tries to handle at least redirection ("<" or ">") on its own 
+behalf.  
+
+This isn't a good idea since many programs expect that they can
+pass a command line to system() that exploits all features of a
+POSIX shell.  If you use the MiNTLib version of system() with
+perl the Perl function system() will suffer from the same deficiencies.
+
+You will find a fixed version of system() in the mint subdirectory.
+You can easily insert this version into your system libc:
+
+	cd mint
+	make system.o
+	ar r /usr/lib/libc.a
+	ranlib /usr/lib/libc.a
+
+If you are suspicious you should either back up your libc before
+or extract the original system.o from your libc with 
+"ar x /usr/lib/libc.a system.o".  You can then backup the system.o
+module somewhere before you succeed.
+
+Anything missing?  Yep, I've almost forgotten...  
+No file in this distribution without a fine saying.  Take this one:
+
+	"From a thief you should learn: (1) to work at night;
+	(2) if one cannot gain what one wants in one night to
+	try again the next night; (3) to love one's coworkers
+	just as thieves love each other; (4) to be willing to
+	risk one's life even for a little thing; (5) not to 
+	attach too much value to things even though one has 
+	risked one's life for them - just as a thief will resell
+	a stolen article for a fraction of its real value; 
+	(6) to withstand all kinds of beatings and tortures
+	but to remain what you are; and (7) to believe your
+	work is worthwhile and not be willing to change it."
+
+			-- Rabbi Dov Baer, Maggid of Mezeritch
+
+OK, this was my motto while working on Perl for MiNT, especially rule (1)...
+
+Have fun with Perl!
+
+=head1 AUTHOR
+
+Guido Flohr
+
+	mailto:guido@FreeMiNT.de
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmod.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmod.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmod.pod	(revision 14489)
@@ -0,0 +1,592 @@
+=head1 NAME
+
+perlmod - Perl modules (packages and symbol tables)
+
+=head1 DESCRIPTION
+
+=head2 Packages
+X<package> X<namespace> X<variable, global> X<global variable> X<global>
+
+Perl provides a mechanism for alternative namespaces to protect
+packages from stomping on each other's variables.  In fact, there's
+really no such thing as a global variable in Perl.  The package
+statement declares the compilation unit as being in the given
+namespace.  The scope of the package declaration is from the
+declaration itself through the end of the enclosing block, C<eval>,
+or file, whichever comes first (the same scope as the my() and
+local() operators).  Unqualified dynamic identifiers will be in
+this namespace, except for those few identifiers that if unqualified,
+default to the main package instead of the current one as described
+below.  A package statement affects only dynamic variables--including
+those you've used local() on--but I<not> lexical variables created
+with my().  Typically it would be the first declaration in a file
+included by the C<do>, C<require>, or C<use> operators.  You can
+switch into a package in more than one place; it merely influences
+which symbol table is used by the compiler for the rest of that
+block.  You can refer to variables and filehandles in other packages
+by prefixing the identifier with the package name and a double
+colon: C<$Package::Variable>.  If the package name is null, the
+C<main> package is assumed.  That is, C<$::sail> is equivalent to
+C<$main::sail>.
+
+The old package delimiter was a single quote, but double colon is now the
+preferred delimiter, in part because it's more readable to humans, and
+in part because it's more readable to B<emacs> macros.  It also makes C++
+programmers feel like they know what's going on--as opposed to using the
+single quote as separator, which was there to make Ada programmers feel
+like they knew what was going on.  Because the old-fashioned syntax is still
+supported for backwards compatibility, if you try to use a string like
+C<"This is $owner's house">, you'll be accessing C<$owner::s>; that is,
+the $s variable in package C<owner>, which is probably not what you meant.
+Use braces to disambiguate, as in C<"This is ${owner}'s house">.
+X<::> X<'>
+
+Packages may themselves contain package separators, as in
+C<$OUTER::INNER::var>.  This implies nothing about the order of
+name lookups, however.  There are no relative packages: all symbols
+are either local to the current package, or must be fully qualified
+from the outer package name down.  For instance, there is nowhere
+within package C<OUTER> that C<$INNER::var> refers to
+C<$OUTER::INNER::var>.  C<INNER> refers to a totally
+separate global package.
+
+Only identifiers starting with letters (or underscore) are stored
+in a package's symbol table.  All other symbols are kept in package
+C<main>, including all punctuation variables, like $_.  In addition,
+when unqualified, the identifiers STDIN, STDOUT, STDERR, ARGV,
+ARGVOUT, ENV, INC, and SIG are forced to be in package C<main>,
+even when used for other purposes than their built-in ones.  If you
+have a package called C<m>, C<s>, or C<y>, then you can't use the
+qualified form of an identifier because it would be instead interpreted
+as a pattern match, a substitution, or a transliteration.
+X<variable, punctuation> 
+
+Variables beginning with underscore used to be forced into package
+main, but we decided it was more useful for package writers to be able
+to use leading underscore to indicate private variables and method names.
+However, variables and functions named with a single C<_>, such as
+$_ and C<sub _>, are still forced into the package C<main>.  See also
+L<perlvar/"Technical Note on the Syntax of Variable Names">.
+
+C<eval>ed strings are compiled in the package in which the eval() was
+compiled.  (Assignments to C<$SIG{}>, however, assume the signal
+handler specified is in the C<main> package.  Qualify the signal handler
+name if you wish to have a signal handler in a package.)  For an
+example, examine F<perldb.pl> in the Perl library.  It initially switches
+to the C<DB> package so that the debugger doesn't interfere with variables
+in the program you are trying to debug.  At various points, however, it
+temporarily switches back to the C<main> package to evaluate various
+expressions in the context of the C<main> package (or wherever you came
+from).  See L<perldebug>.
+
+The special symbol C<__PACKAGE__> contains the current package, but cannot
+(easily) be used to construct variable names.
+
+See L<perlsub> for other scoping issues related to my() and local(),
+and L<perlref> regarding closures.
+
+=head2 Symbol Tables
+X<symbol table> X<stash> X<%::> X<%main::> X<typeglob> X<glob> X<alias>
+
+The symbol table for a package happens to be stored in the hash of that
+name with two colons appended.  The main symbol table's name is thus
+C<%main::>, or C<%::> for short.  Likewise the symbol table for the nested
+package mentioned earlier is named C<%OUTER::INNER::>.
+
+The value in each entry of the hash is what you are referring to when you
+use the C<*name> typeglob notation.  In fact, the following have the same
+effect, though the first is more efficient because it does the symbol
+table lookups at compile time:
+
+    local *main::foo    = *main::bar;
+    local $main::{foo}  = $main::{bar};
+
+(Be sure to note the B<vast> difference between the second line above
+and C<local $main::foo = $main::bar>. The former is accessing the hash
+C<%main::>, which is the symbol table of package C<main>. The latter is
+simply assigning scalar C<$bar> in package C<main> to scalar C<$foo> of
+the same package.)
+
+You can use this to print out all the variables in a package, for
+instance.  The standard but antiquated F<dumpvar.pl> library and
+the CPAN module Devel::Symdump make use of this.
+
+Assignment to a typeglob performs an aliasing operation, i.e.,
+
+    *dick = *richard;
+
+causes variables, subroutines, formats, and file and directory handles
+accessible via the identifier C<richard> also to be accessible via the
+identifier C<dick>.  If you want to alias only a particular variable or
+subroutine, assign a reference instead:
+
+    *dick = \$richard;
+
+Which makes $richard and $dick the same variable, but leaves
+@richard and @dick as separate arrays.  Tricky, eh?
+
+There is one subtle difference between the following statements:
+
+    *foo = *bar;
+    *foo = \$bar;
+
+C<*foo = *bar> makes the typeglobs themselves synonymous while
+C<*foo = \$bar> makes the SCALAR portions of two distinct typeglobs
+refer to the same scalar value. This means that the following code:
+
+    $bar = 1;
+    *foo = \$bar;       # Make $foo an alias for $bar
+
+    {
+        local $bar = 2; # Restrict changes to block
+        print $foo;     # Prints '1'!
+    }
+
+Would print '1', because C<$foo> holds a reference to the I<original>
+C<$bar> -- the one that was stuffed away by C<local()> and which will be
+restored when the block ends. Because variables are accessed through the
+typeglob, you can use C<*foo = *bar> to create an alias which can be
+localized. (But be aware that this means you can't have a separate
+C<@foo> and C<@bar>, etc.)
+
+What makes all of this important is that the Exporter module uses glob
+aliasing as the import/export mechanism. Whether or not you can properly
+localize a variable that has been exported from a module depends on how
+it was exported:
+
+    @EXPORT = qw($FOO); # Usual form, can't be localized
+    @EXPORT = qw(*FOO); # Can be localized
+
+You can work around the first case by using the fully qualified name
+(C<$Package::FOO>) where you need a local value, or by overriding it
+by saying C<*FOO = *Package::FOO> in your script.
+
+The C<*x = \$y> mechanism may be used to pass and return cheap references
+into or from subroutines if you don't want to copy the whole
+thing.  It only works when assigning to dynamic variables, not
+lexicals.
+
+    %some_hash = ();			# can't be my()
+    *some_hash = fn( \%another_hash );
+    sub fn {
+	local *hashsym = shift;
+	# now use %hashsym normally, and you
+	# will affect the caller's %another_hash
+	my %nhash = (); # do what you want
+	return \%nhash;
+    }
+
+On return, the reference will overwrite the hash slot in the
+symbol table specified by the *some_hash typeglob.  This
+is a somewhat tricky way of passing around references cheaply
+when you don't want to have to remember to dereference variables
+explicitly.
+
+Another use of symbol tables is for making "constant" scalars.
+X<constant> X<scalar, constant>
+
+    *PI = \3.14159265358979;
+
+Now you cannot alter C<$PI>, which is probably a good thing all in all.
+This isn't the same as a constant subroutine, which is subject to
+optimization at compile-time.  A constant subroutine is one prototyped
+to take no arguments and to return a constant expression.  See
+L<perlsub> for details on these.  The C<use constant> pragma is a
+convenient shorthand for these.
+
+You can say C<*foo{PACKAGE}> and C<*foo{NAME}> to find out what name and
+package the *foo symbol table entry comes from.  This may be useful
+in a subroutine that gets passed typeglobs as arguments:
+
+    sub identify_typeglob {
+        my $glob = shift;
+        print 'You gave me ', *{$glob}{PACKAGE}, '::', *{$glob}{NAME}, "\n";
+    }
+    identify_typeglob *foo;
+    identify_typeglob *bar::baz;
+
+This prints
+
+    You gave me main::foo
+    You gave me bar::baz
+
+The C<*foo{THING}> notation can also be used to obtain references to the
+individual elements of *foo.  See L<perlref>.
+
+Subroutine definitions (and declarations, for that matter) need
+not necessarily be situated in the package whose symbol table they
+occupy.  You can define a subroutine outside its package by
+explicitly qualifying the name of the subroutine:
+
+    package main;
+    sub Some_package::foo { ... }   # &foo defined in Some_package
+
+This is just a shorthand for a typeglob assignment at compile time:
+
+    BEGIN { *Some_package::foo = sub { ... } }
+
+and is I<not> the same as writing:
+
+    {
+	package Some_package;
+	sub foo { ... }
+    }
+
+In the first two versions, the body of the subroutine is
+lexically in the main package, I<not> in Some_package. So
+something like this:
+
+    package main;
+
+    $Some_package::name = "fred";
+    $main::name = "barney";
+
+    sub Some_package::foo {
+	print "in ", __PACKAGE__, ": \$name is '$name'\n";
+    }
+
+    Some_package::foo();
+
+prints:
+
+    in main: $name is 'barney'
+
+rather than:
+
+    in Some_package: $name is 'fred'
+
+This also has implications for the use of the SUPER:: qualifier
+(see L<perlobj>).
+
+=head2 BEGIN, CHECK, INIT and END
+X<BEGIN> X<CHECK> X<INIT> X<END>
+
+Four specially named code blocks are executed at the beginning and at the end
+of a running Perl program.  These are the C<BEGIN>, C<CHECK>, C<INIT>, and
+C<END> blocks.
+
+These code blocks can be prefixed with C<sub> to give the appearance of a
+subroutine (although this is not considered good style).  One should note
+that these code blocks don't really exist as named subroutines (despite
+their appearance). The thing that gives this away is the fact that you can
+have B<more than one> of these code blocks in a program, and they will get
+B<all> executed at the appropriate moment.  So you can't execute any of
+these code blocks by name.
+
+A C<BEGIN> code block is executed as soon as possible, that is, the moment
+it is completely defined, even before the rest of the containing file (or
+string) is parsed.  You may have multiple C<BEGIN> blocks within a file (or
+eval'ed string) -- they will execute in order of definition.  Because a C<BEGIN>
+code block executes immediately, it can pull in definitions of subroutines
+and such from other files in time to be visible to the rest of the compile
+and run time.  Once a C<BEGIN> has run, it is immediately undefined and any
+code it used is returned to Perl's memory pool.
+
+It should be noted that C<BEGIN> code blocks B<are> executed inside string
+C<eval()>'s.  The C<CHECK> and C<INIT> code blocks are B<not> executed inside
+a string eval, which e.g. can be a problem in a mod_perl environment.
+
+An C<END> code block is executed as late as possible, that is, after
+perl has finished running the program and just before the interpreter
+is being exited, even if it is exiting as a result of a die() function.
+(But not if it's morphing into another program via C<exec>, or
+being blown out of the water by a signal--you have to trap that yourself
+(if you can).)  You may have multiple C<END> blocks within a file--they
+will execute in reverse order of definition; that is: last in, first
+out (LIFO).  C<END> blocks are not executed when you run perl with the
+C<-c> switch, or if compilation fails.
+
+Note that C<END> code blocks are B<not> executed at the end of a string
+C<eval()>: if any C<END> code blocks are created in a string C<eval()>,
+they will be executed just as any other C<END> code block of that package
+in LIFO order just before the interpreter is being exited.
+
+Inside an C<END> code block, C<$?> contains the value that the program is
+going to pass to C<exit()>.  You can modify C<$?> to change the exit
+value of the program.  Beware of changing C<$?> by accident (e.g. by
+running something via C<system>).
+X<$?>
+
+C<CHECK> and C<INIT> code blocks are useful to catch the transition between
+the compilation phase and the execution phase of the main program.
+
+C<CHECK> code blocks are run just after the B<initial> Perl compile phase ends
+and before the run time begins, in LIFO order.  C<CHECK> code blocks are used
+in the Perl compiler suite to save the compiled state of the program.
+
+C<INIT> blocks are run just before the Perl runtime begins execution, in
+"first in, first out" (FIFO) order. For example, the code generators
+documented in L<perlcc> make use of C<INIT> blocks to initialize and
+resolve pointers to XSUBs.
+
+When you use the B<-n> and B<-p> switches to Perl, C<BEGIN> and
+C<END> work just as they do in B<awk>, as a degenerate case.
+Both C<BEGIN> and C<CHECK> blocks are run when you use the B<-c>
+switch for a compile-only syntax check, although your main code
+is not.
+
+The B<begincheck> program makes it all clear, eventually:
+
+  #!/usr/bin/perl
+
+  # begincheck
+
+  print         " 8. Ordinary code runs at runtime.\n";
+
+  END { print   "14.   So this is the end of the tale.\n" }
+  INIT { print  " 5. INIT blocks run FIFO just before runtime.\n" }
+  CHECK { print " 4.   So this is the fourth line.\n" }
+
+  print         " 9.   It runs in order, of course.\n";
+
+  BEGIN { print " 1. BEGIN blocks run FIFO during compilation.\n" }
+  END { print   "13.   Read perlmod for the rest of the story.\n" }
+  CHECK { print " 3. CHECK blocks run LIFO at compilation's end.\n" }
+  INIT { print  " 6.   Run this again, using Perl's -c switch.\n" }
+
+  print         "10.   This is anti-obfuscated code.\n";
+
+  END { print   "12. END blocks run LIFO at quitting time.\n" }
+  BEGIN { print " 2.   So this line comes out second.\n" }
+  INIT { print  " 7.   You'll see the difference right away.\n" }
+
+  print         "11.   It merely _looks_ like it should be confusing.\n";
+
+  __END__
+
+=head2 Perl Classes
+X<class> X<@ISA>
+
+There is no special class syntax in Perl, but a package may act
+as a class if it provides subroutines to act as methods.  Such a
+package may also derive some of its methods from another class (package)
+by listing the other package name(s) in its global @ISA array (which
+must be a package global, not a lexical).
+
+For more on this, see L<perltoot> and L<perlobj>.
+
+=head2 Perl Modules
+X<module>
+
+A module is just a set of related functions in a library file, i.e.,
+a Perl package with the same name as the file.  It is specifically
+designed to be reusable by other modules or programs.  It may do this
+by providing a mechanism for exporting some of its symbols into the
+symbol table of any package using it, or it may function as a class
+definition and make its semantics available implicitly through
+method calls on the class and its objects, without explicitly
+exporting anything.  Or it can do a little of both.
+
+For example, to start a traditional, non-OO module called Some::Module,
+create a file called F<Some/Module.pm> and start with this template:
+
+    package Some::Module;  # assumes Some/Module.pm
+
+    use strict;
+    use warnings;
+
+    BEGIN {
+        use Exporter   ();
+        our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+        # set the version for version checking
+        $VERSION     = 1.00;
+        # if using RCS/CVS, this may be preferred
+        $VERSION = sprintf "%d.%03d", q$Revision: 1.1 $ =~ /(\d+)/g;
+
+        @ISA         = qw(Exporter);
+        @EXPORT      = qw(&func1 &func2 &func4);
+        %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
+
+        # your exported package globals go here,
+        # as well as any optionally exported functions
+        @EXPORT_OK   = qw($Var1 %Hashit &func3);
+    }
+    our @EXPORT_OK;
+
+    # exported package globals go here
+    our $Var1;
+    our %Hashit;
+
+    # non-exported package globals go here
+    our @more;
+    our $stuff;
+
+    # initialize package globals, first exported ones
+    $Var1   = '';
+    %Hashit = ();
+
+    # then the others (which are still accessible as $Some::Module::stuff)
+    $stuff  = '';
+    @more   = ();
+
+    # all file-scoped lexicals must be created before
+    # the functions below that use them.
+
+    # file-private lexicals go here
+    my $priv_var    = '';
+    my %secret_hash = ();
+
+    # here's a file-private function as a closure,
+    # callable as &$priv_func;  it cannot be prototyped.
+    my $priv_func = sub {
+        # stuff goes here.
+    };
+
+    # make all your functions, whether exported or not;
+    # remember to put something interesting in the {} stubs
+    sub func1      {}    # no prototype
+    sub func2()    {}    # proto'd void
+    sub func3($$)  {}    # proto'd to 2 scalars
+
+    # this one isn't exported, but could be called!
+    sub func4(\%)  {}    # proto'd to 1 hash ref
+
+    END { }       # module clean-up code here (global destructor)
+
+    ## YOUR CODE GOES HERE
+
+    1;  # don't forget to return a true value from the file
+
+Then go on to declare and use your variables in functions without
+any qualifications.  See L<Exporter> and the L<perlmodlib> for
+details on mechanics and style issues in module creation.
+
+Perl modules are included into your program by saying
+
+    use Module;
+
+or
+
+    use Module LIST;
+
+This is exactly equivalent to
+
+    BEGIN { require Module; import Module; }
+
+or
+
+    BEGIN { require Module; import Module LIST; }
+
+As a special case
+
+    use Module ();
+
+is exactly equivalent to
+
+    BEGIN { require Module; }
+
+All Perl module files have the extension F<.pm>.  The C<use> operator
+assumes this so you don't have to spell out "F<Module.pm>" in quotes.
+This also helps to differentiate new modules from old F<.pl> and
+F<.ph> files.  Module names are also capitalized unless they're
+functioning as pragmas; pragmas are in effect compiler directives,
+and are sometimes called "pragmatic modules" (or even "pragmata"
+if you're a classicist).
+
+The two statements:
+
+    require SomeModule;
+    require "SomeModule.pm";
+
+differ from each other in two ways.  In the first case, any double
+colons in the module name, such as C<Some::Module>, are translated
+into your system's directory separator, usually "/".   The second
+case does not, and would have to be specified literally.  The other
+difference is that seeing the first C<require> clues in the compiler
+that uses of indirect object notation involving "SomeModule", as
+in C<$ob = purge SomeModule>, are method calls, not function calls.
+(Yes, this really can make a difference.)
+
+Because the C<use> statement implies a C<BEGIN> block, the importing
+of semantics happens as soon as the C<use> statement is compiled,
+before the rest of the file is compiled.  This is how it is able
+to function as a pragma mechanism, and also how modules are able to
+declare subroutines that are then visible as list or unary operators for
+the rest of the current file.  This will not work if you use C<require>
+instead of C<use>.  With C<require> you can get into this problem:
+
+    require Cwd;		# make Cwd:: accessible
+    $here = Cwd::getcwd();
+
+    use Cwd;			# import names from Cwd::
+    $here = getcwd();
+
+    require Cwd;	    	# make Cwd:: accessible
+    $here = getcwd(); 		# oops! no main::getcwd()
+
+In general, C<use Module ()> is recommended over C<require Module>,
+because it determines module availability at compile time, not in the
+middle of your program's execution.  An exception would be if two modules
+each tried to C<use> each other, and each also called a function from
+that other module.  In that case, it's easy to use C<require> instead.
+
+Perl packages may be nested inside other package names, so we can have
+package names containing C<::>.  But if we used that package name
+directly as a filename it would make for unwieldy or impossible
+filenames on some systems.  Therefore, if a module's name is, say,
+C<Text::Soundex>, then its definition is actually found in the library
+file F<Text/Soundex.pm>.
+
+Perl modules always have a F<.pm> file, but there may also be
+dynamically linked executables (often ending in F<.so>) or autoloaded
+subroutine definitions (often ending in F<.al>) associated with the
+module.  If so, these will be entirely transparent to the user of
+the module.  It is the responsibility of the F<.pm> file to load
+(or arrange to autoload) any additional functionality.  For example,
+although the POSIX module happens to do both dynamic loading and
+autoloading, the user can say just C<use POSIX> to get it all.
+
+=head2 Making your module threadsafe
+X<threadsafe> X<thread safe>
+X<module, threadsafe> X<module, thread safe>
+X<CLONE> X<CLONE_SKIP> X<thread> X<threads> X<ithread>
+
+Since 5.6.0, Perl has had support for a new type of threads called
+interpreter threads (ithreads). These threads can be used explicitly
+and implicitly.
+
+Ithreads work by cloning the data tree so that no data is shared
+between different threads. These threads can be used by using the C<threads>
+module or by doing fork() on win32 (fake fork() support). When a
+thread is cloned all Perl data is cloned, however non-Perl data cannot
+be cloned automatically.  Perl after 5.7.2 has support for the C<CLONE>
+special subroutine.  In C<CLONE> you can do whatever
+you need to do,
+like for example handle the cloning of non-Perl data, if necessary.
+C<CLONE> will be called once as a class method for every package that has it
+defined (or inherits it).  It will be called in the context of the new thread,
+so all modifications are made in the new area.  Currently CLONE is called with
+no parameters other than the invocant package name, but code should not assume
+that this will remain unchanged, as it is likely that in future extra parameters
+will be passed in to give more information about the state of cloning.
+
+If you want to CLONE all objects you will need to keep track of them per
+package. This is simply done using a hash and Scalar::Util::weaken().
+
+Perl after 5.8.7 has support for the C<CLONE_SKIP> special subroutine.
+Like C<CLONE>, C<CLONE_SKIP> is called once per package; however, it is
+called just before cloning starts, and in the context of the parent
+thread. If it returns a true value, then no objects of that class will
+be cloned; or rather, they will be copied as unblessed, undef values.
+This provides a simple mechanism for making a module threadsafe; just add
+C<sub CLONE_SKIP { 1 }> at the top of the class, and C<DESTROY()> will be
+now only be called once per object. Of course, if the child thread needs
+to make use of the objects, then a more sophisticated approach is
+needed.
+
+Like C<CLONE>, C<CLONE_SKIP> is currently called with no parameters other
+than the invocant package name, although that may change. Similarly, to
+allow for future expansion, the return value should be a single C<0> or
+C<1> value.
+
+=head1 SEE ALSO
+
+See L<perlmodlib> for general style issues related to building Perl
+modules and classes, as well as descriptions of the standard library
+and CPAN, L<Exporter> for how Perl's standard import/export mechanism
+works, L<perltoot> and L<perltooc> for an in-depth tutorial on
+creating classes, L<perlobj> for a hard-core reference document on
+objects, L<perlsub> for an explanation of functions and scoping,
+and L<perlxstut> and L<perlguts> for more information on writing
+extension modules.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmodinstall.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmodinstall.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmodinstall.pod	(revision 14489)
@@ -0,0 +1,465 @@
+=head1 NAME
+
+perlmodinstall - Installing CPAN Modules
+
+=head1 DESCRIPTION
+
+You can think of a module as the fundamental unit of reusable Perl
+code; see L<perlmod> for details.  Whenever anyone creates a chunk of
+Perl code that they think will be useful to the world, they register
+as a Perl developer at http://www.cpan.org/modules/04pause.html
+so that they can then upload their code to the CPAN.  The CPAN is the
+Comprehensive Perl Archive Network and can be accessed at
+http://www.cpan.org/ , and searched at http://search.cpan.org/ .
+
+This documentation is for people who want to download CPAN modules
+and install them on their own computer.
+
+=head2 PREAMBLE
+
+First, are you sure that the module isn't already on your system?  Try
+C<perl -MFoo -e 1>.  (Replace "Foo" with the name of the module; for
+instance, C<perl -MCGI::Carp -e 1>.
+
+If you don't see an error message, you have the module.  (If you do
+see an error message, it's still possible you have the module, but
+that it's not in your path, which you can display with C<perl -e
+"print qq(@INC)">.)  For the remainder of this document, we'll assume
+that you really honestly truly lack an installed module, but have
+found it on the CPAN.
+
+So now you have a file ending in .tar.gz (or, less often, .zip).  You
+know there's a tasty module inside.  There are four steps you must now
+take:
+
+=over 5
+
+=item B<DECOMPRESS> the file
+
+=item B<UNPACK> the file into a directory
+
+=item B<BUILD> the module (sometimes unnecessary)
+
+=item B<INSTALL> the module.
+
+=back
+
+Here's how to perform each step for each operating system.  This is
+<not> a substitute for reading the README and INSTALL files that
+might have come with your module!
+
+Also note that these instructions are tailored for installing the
+module into your system's repository of Perl modules -- but you can
+install modules into any directory you wish.  For instance, where I
+say C<perl Makefile.PL>, you can substitute C<perl Makefile.PL
+PREFIX=/my/perl_directory> to install the modules into
+C</my/perl_directory>.  Then you can use the modules from your Perl
+programs with C<use lib "/my/perl_directory/lib/site_perl";> or
+sometimes just C<use "/my/perl_directory";>.  If you're on a system
+that requires superuser/root access to install modules into the
+directories you see when you type C<perl -e "print qq(@INC)">, you'll
+want to install them into a local directory (such as your home
+directory) and use this approach.
+
+=over 4
+
+=item *
+
+B<If you're on a Unix or Unix-like system,>
+
+You can use Andreas Koenig's CPAN module
+( http://www.cpan.org/modules/by-module/CPAN )
+to automate the following steps, from DECOMPRESS through INSTALL.
+
+A. DECOMPRESS
+
+Decompress the file with C<gzip -d yourmodule.tar.gz>
+
+You can get gzip from ftp://prep.ai.mit.edu/pub/gnu/
+
+Or, you can combine this step with the next to save disk space:
+
+     gzip -dc yourmodule.tar.gz | tar -xof -
+
+B. UNPACK
+
+Unpack the result with C<tar -xof yourmodule.tar>
+
+C. BUILD
+
+Go into the newly-created directory and type:
+
+      perl Makefile.PL
+      make test
+
+or
+
+      perl Makefile.PL PREFIX=/my/perl_directory
+
+to install it locally.  (Remember that if you do this, you'll have to
+put C<use lib "/my/perl_directory";> near the top of the program that
+is to use this module.
+
+D. INSTALL
+
+While still in that directory, type:
+
+      make install
+
+Make sure you have the appropriate permissions to install the module
+in your Perl 5 library directory.  Often, you'll need to be root.
+
+That's all you need to do on Unix systems with dynamic linking.
+Most Unix systems have dynamic linking -- if yours doesn't, or if for
+another reason you have a statically-linked perl, B<and> the
+module requires compilation, you'll need to build a new Perl binary
+that includes the module.  Again, you'll probably need to be root.
+
+=item *
+
+B<If you're running ActivePerl (Win95/98/2K/NT/XP, Linux, Solaris)>
+
+First, type C<ppm> from a shell and see whether ActiveState's PPM
+repository has your module.  If so, you can install it with C<ppm> and
+you won't have to bother with any of the other steps here.  You might
+be able to use the CPAN instructions from the "Unix or Linux" section
+above as well; give it a try.  Otherwise, you'll have to follow the
+steps below.
+
+   A. DECOMPRESS
+
+You can use the shareware Winzip ( http://www.winzip.com ) to
+decompress and unpack modules.
+
+   B. UNPACK
+
+If you used WinZip, this was already done for you.
+
+   C. BUILD
+
+You'll need the C<nmake> utility, available at
+http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/nmake15.exe
+or dmake, available on CPAN.
+http://search.cpan.org/dist/dmake/
+
+Does the module require compilation (i.e. does it have files that end
+in .xs, .c, .h, .y, .cc, .cxx, or .C)?  If it does, life is now
+officially tough for you, because you have to compile the module
+yourself -- no easy feat on Windows.  You'll need a compiler such as
+Visual C++.  Alternatively, you can download a pre-built PPM package
+from ActiveState.
+http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/
+
+Go into the newly-created directory and type:
+
+      perl Makefile.PL
+      nmake test
+
+
+   D. INSTALL
+
+While still in that directory, type:
+
+      nmake install
+
+=item *
+
+B<If you're using a Macintosh with "Classic" MacOS and MacPerl,>
+
+
+A. DECOMPRESS
+
+First, make sure you have the latest B<cpan-mac> distribution (
+http://www.cpan.org/authors/id/CNANDOR/ ), which has utilities for
+doing all of the steps.  Read the cpan-mac directions carefully and
+install it.  If you choose not to use cpan-mac for some reason, there
+are alternatives listed here.
+
+After installing cpan-mac, drop the module archive on the
+B<untarzipme> droplet, which will decompress and unpack for you.
+
+B<Or>, you can either use the shareware B<StuffIt Expander> program
+( http://www.aladdinsys.com/expander/ )
+in combination with B<DropStuff with Expander Enhancer>
+( http://www.aladdinsys.com/dropstuff/ )
+or the freeware B<MacGzip> program (
+http://persephone.cps.unizar.es/general/gente/spd/gzip/gzip.html ).
+
+B. UNPACK
+
+If you're using untarzipme or StuffIt, the archive should be extracted
+now.  B<Or>, you can use the freeware B<suntar> or I<Tar> (
+http://hyperarchive.lcs.mit.edu/HyperArchive/Archive/cmp/ ).
+
+C. BUILD
+
+Check the contents of the distribution.
+Read the module's documentation, looking for
+reasons why you might have trouble using it with MacPerl.  Look for
+F<.xs> and F<.c> files, which normally denote that the distribution
+must be compiled, and you cannot install it "out of the box."
+(See L<"PORTABILITY">.)
+
+If a module does not work on MacPerl but should, or needs to be
+compiled, see if the module exists already as a port on the
+MacPerl Module Porters site ( http://pudge.net/mmp/ ).
+For more information on doing XS with MacPerl yourself, see
+Arved Sandstrom's XS tutorial ( http://macperl.com/depts/Tutorials/ ),
+and then consider uploading your binary to the CPAN and
+registering it on the MMP site.
+
+D. INSTALL
+
+If you are using cpan-mac, just drop the folder on the
+B<installme> droplet, and use the module.
+
+B<Or>, if you aren't using cpan-mac, do some manual labor.
+
+Make sure the newlines for the modules are in Mac format, not Unix format.
+If they are not then you might have decompressed them incorrectly.  Check
+your decompression and unpacking utilities settings to make sure they are
+translating text files properly.
+
+As a last resort, you can use the perl one-liner:
+
+    perl -i.bak -pe 's/(?:\015)?\012/\015/g' <filenames>
+
+on the source files.
+
+Then move the files (probably just the F<.pm> files, though there
+may be some additional ones, too; check the module documentation)
+to their final destination: This will
+most likely be in C<$ENV{MACPERL}site_lib:> (i.e.,
+C<HD:MacPerl folder:site_lib:>).  You can add new paths to
+the default C<@INC> in the Preferences menu item in the
+MacPerl application (C<$ENV{MACPERL}site_lib:> is added
+automagically).  Create whatever directory structures are required
+(i.e., for C<Some::Module>, create
+C<$ENV{MACPERL}site_lib:Some:> and put
+C<Module.pm> in that directory).
+
+Then run the following script (or something like it):
+
+     #!perl -w
+     use AutoSplit;
+     my $dir = "${MACPERL}site_perl";
+     autosplit("$dir:Some:Module.pm", "$dir:auto", 0, 1, 1);
+
+=item *
+
+B<If you're on the DJGPP port of DOS,>
+
+   A. DECOMPRESS
+
+djtarx ( ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2/ )
+will both uncompress and unpack.
+
+   B. UNPACK
+
+See above.
+
+   C. BUILD
+
+Go into the newly-created directory and type:
+
+      perl Makefile.PL
+      make test
+
+You will need the packages mentioned in F<README.dos>
+in the Perl distribution.
+
+   D. INSTALL
+
+While still in that directory, type:
+
+     make install	
+
+You will need the packages mentioned in F<README.dos> in the Perl distribution.
+
+=item *
+
+B<If you're on OS/2,>
+
+Get the EMX development suite and gzip/tar, from either Hobbes (
+http://hobbes.nmsu.edu ) or Leo ( http://www.leo.org ), and then follow
+the instructions for Unix.
+
+=item *
+
+B<If you're on VMS,>
+
+When downloading from CPAN, save your file with a C<.tgz>
+extension instead of C<.tar.gz>.  All other periods in the
+filename should be replaced with underscores.  For example,
+C<Your-Module-1.33.tar.gz> should be downloaded as
+C<Your-Module-1_33.tgz>.
+
+A. DECOMPRESS
+
+Type
+
+    gzip -d Your-Module.tgz
+
+or, for zipped modules, type
+
+    unzip Your-Module.zip
+
+Executables for gzip, zip, and VMStar:
+
+    http://www.openvms.digital.com/freeware/
+    http://www.crinoid.com/utils/
+
+and their source code:
+
+    http://www.fsf.org/order/ftp.html
+
+Note that GNU's gzip/gunzip is not the same as Info-ZIP's zip/unzip
+package.  The former is a simple compression tool; the latter permits
+creation of multi-file archives.
+
+B. UNPACK
+
+If you're using VMStar:
+
+     VMStar xf Your-Module.tar
+
+Or, if you're fond of VMS command syntax:
+
+     tar/extract/verbose Your_Module.tar
+
+C. BUILD
+
+Make sure you have MMS (from Digital) or the freeware MMK ( available
+from MadGoat at http://www.madgoat.com ).  Then type this to create
+the DESCRIP.MMS for the module:
+
+    perl Makefile.PL
+
+Now you're ready to build:
+
+    mms test
+
+Substitute C<mmk> for C<mms> above if you're using MMK.
+
+D. INSTALL
+
+Type
+
+    mms install
+
+Substitute C<mmk> for C<mms> above if you're using MMK.
+
+=item *
+
+B<If you're on MVS>,
+
+Introduce the F<.tar.gz> file into an HFS as binary; don't translate from
+ASCII to EBCDIC.
+
+A. DECOMPRESS
+
+Decompress the file with C<gzip -d yourmodule.tar.gz>
+
+You can get gzip from
+http://www.s390.ibm.com/products/oe/bpxqp1.html
+
+B. UNPACK
+
+Unpack the result with
+
+     pax -o to=IBM-1047,from=ISO8859-1 -r < yourmodule.tar
+
+The BUILD and INSTALL steps are identical to those for Unix.  Some
+modules generate Makefiles that work better with GNU make, which is
+available from http://www.mks.com/s390/gnu/
+
+=back
+
+=head1 PORTABILITY
+
+Note that not all modules will work with on all platforms.
+See L<perlport> for more information on portability issues.
+Read the documentation to see if the module will work on your
+system.  There are basically three categories
+of modules that will not work "out of the box" with all
+platforms (with some possibility of overlap):
+
+=over 4
+
+=item *
+
+B<Those that should, but don't.>  These need to be fixed; consider
+contacting the author and possibly writing a patch.
+
+=item *
+
+B<Those that need to be compiled, where the target platform
+doesn't have compilers readily available.>  (These modules contain
+F<.xs> or F<.c> files, usually.)  You might be able to find
+existing binaries on the CPAN or elsewhere, or you might
+want to try getting compilers and building it yourself, and then
+release the binary for other poor souls to use.
+
+=item *
+
+B<Those that are targeted at a specific platform.>
+(Such as the Win32:: modules.)  If the module is targeted
+specifically at a platform other than yours, you're out
+of luck, most likely.
+
+=back
+
+
+
+Check the CPAN Testers if a module should work with your platform
+but it doesn't behave as you'd expect, or you aren't sure whether or
+not a module will work under your platform.  If the module you want
+isn't listed there, you can test it yourself and let CPAN Testers know,
+you can join CPAN Testers, or you can request it be tested.
+
+    http://testers.cpan.org/
+
+
+=head1 HEY
+
+If you have any suggested changes for this page, let me know.  Please
+don't send me mail asking for help on how to install your modules.
+There are too many modules, and too few Orwants, for me to be able to
+answer or even acknowledge all your questions.  Contact the module
+author instead, or post to comp.lang.perl.modules, or ask someone
+familiar with Perl on your operating system.
+
+=head1 AUTHOR
+
+Jon Orwant
+
+orwant@medita.mit.edu
+
+with invaluable help from Chris Nandor, and valuable help from Brandon
+Allbery, Charles Bailey, Graham Barr, Dominic Dunlop, Jarkko
+Hietaniemi, Ben Holzman, Tom Horsley, Nick Ing-Simmons, Tuomas
+J. Lukka, Laszlo Molnar, Alan Olsen, Peter Prymmer, Gurusamy Sarathy,
+Christoph Spalinger, Dan Sugalski, Larry Virden, and Ilya Zakharevich.
+
+First version July 22, 1998; last revised November 21, 2001.
+
+=head1 COPYRIGHT
+
+Copyright (C) 1998, 2002, 2003 Jon Orwant.  All Rights Reserved.
+
+Permission is granted to make and distribute verbatim copies of this
+documentation provided the copyright notice and this permission notice are
+preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+documentation under the conditions for verbatim copying, provided also
+that they are marked clearly as modified versions, that the authors'
+names and title are unchanged (though subtitles and additional
+authors' names may be added), and that the entire resulting derived
+work is distributed under the terms of a permission notice identical
+to this one.
+
+Permission is granted to copy and distribute translations of this
+documentation into another language, under the above conditions for
+modified versions.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmodlib.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmodlib.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmodlib.pod	(revision 14489)
@@ -0,0 +1,2778 @@
+=for maintainers
+Generated by perlmodlib.PL -- DO NOT EDIT!
+
+=head1 NAME
+
+perlmodlib - constructing new Perl modules and finding existing ones
+
+=head1 THE PERL MODULE LIBRARY
+
+Many modules are included in the Perl distribution.  These are described
+below, and all end in F<.pm>.  You may discover compiled library
+files (usually ending in F<.so>) or small pieces of modules to be
+autoloaded (ending in F<.al>); these were automatically generated
+by the installation process.  You may also discover files in the
+library directory that end in either F<.pl> or F<.ph>.  These are
+old libraries supplied so that old programs that use them still
+run.  The F<.pl> files will all eventually be converted into standard
+modules, and the F<.ph> files made by B<h2ph> will probably end up
+as extension modules made by B<h2xs>.  (Some F<.ph> values may
+already be available through the POSIX, Errno, or Fcntl modules.)
+The B<pl2pm> file in the distribution may help in your conversion,
+but it's just a mechanical process and therefore far from bulletproof.
+
+=head2 Pragmatic Modules
+
+They work somewhat like compiler directives (pragmata) in that they
+tend to affect the compilation of your program, and thus will usually
+work well only when used within a C<use>, or C<no>.  Most of these
+are lexically scoped, so an inner BLOCK may countermand them
+by saying:
+
+    no integer;
+    no strict 'refs';
+    no warnings;
+
+which lasts until the end of that BLOCK.
+
+Some pragmas are lexically scoped--typically those that affect the
+C<$^H> hints variable.  Others affect the current package instead,
+like C<use vars> and C<use subs>, which allow you to predeclare a
+variables or subroutines within a particular I<file> rather than
+just a block.  Such declarations are effective for the entire file
+for which they were declared.  You cannot rescind them with C<no
+vars> or C<no subs>.
+
+The following pragmas are defined (and have their own documentation).
+
+=over 12
+
+=item attributes
+
+Get/set subroutine or variable attributes
+
+=item attrs
+
+Set/get attributes of a subroutine (deprecated)
+
+=item autouse
+
+Postpone load of modules until a function is used
+
+=item base
+
+Establish IS-A relationship with base classes at compile time
+
+=item bigint
+
+Transparent BigInteger support for Perl
+
+=item bignum
+
+Transparent BigNumber support for Perl
+
+=item bigrat
+
+Transparent BigNumber/BigRational support for Perl
+
+=item blib
+
+Use MakeMaker's uninstalled version of a package
+
+=item bytes
+
+Force byte semantics rather than character semantics
+
+=item charnames
+
+Define character names for C<\N{named}> string literal escapes
+
+=item constant
+
+Declare constants
+
+=item diagnostics
+
+Produce verbose warning diagnostics
+
+=item encoding
+
+Allows you to write your script in non-ascii or non-utf8
+
+=item fields
+
+Compile-time class fields
+
+=item filetest
+
+Control the filetest permission operators
+
+=item if
+
+C<use> a Perl module if a condition holds
+
+=item integer
+
+Use integer arithmetic instead of floating point
+
+=item less
+
+Request less of something from the compiler
+
+=item lib
+
+Manipulate @INC at compile time
+
+=item locale
+
+Use and avoid POSIX locales for built-in operations
+
+=item open
+
+Set default PerlIO layers for input and output
+
+=item ops
+
+Restrict unsafe operations when compiling
+
+=item overload
+
+Package for overloading Perl operations
+
+=item re
+
+Alter regular expression behaviour
+
+=item sigtrap
+
+Enable simple signal handling
+
+=item sort
+
+Control sort() behaviour
+
+=item strict
+
+Restrict unsafe constructs
+
+=item subs
+
+Predeclare sub names
+
+=item threads
+
+Perl extension allowing use of interpreter based threads from perl
+
+=item threads::shared
+
+Perl extension for sharing data structures between threads
+
+=item utf8
+
+Enable/disable UTF-8 (or UTF-EBCDIC) in source code
+
+=item vars
+
+Predeclare global variable names (obsolete)
+
+=item vmsish
+
+Control VMS-specific language features
+
+=item warnings
+
+Control optional warnings
+
+=item warnings::register
+
+Warnings import function
+
+=back
+
+=head2 Standard Modules
+
+Standard, bundled modules are all expected to behave in a well-defined
+manner with respect to namespace pollution because they use the
+Exporter module.  See their own documentation for details.
+
+It's possible that not all modules listed below are installed on your
+system. For example, the GDBM_File module will not be installed if you
+don't have the gdbm library.
+
+=over 12
+
+=item AnyDBM_File
+
+Provide framework for multiple DBMs
+
+=item Attribute::Handlers
+
+Simpler definition of attribute handlers
+
+=item AutoLoader
+
+Load subroutines only on demand
+
+=item AutoSplit
+
+Split a package for autoloading
+
+=item B
+
+The Perl Compiler
+
+=item B::Asmdata
+
+Autogenerated data about Perl ops, used to generate bytecode
+
+=item B::Assembler
+
+Assemble Perl bytecode
+
+=item B::Bblock
+
+Walk basic blocks
+
+=item B::Bytecode
+
+Perl compiler's bytecode backend
+
+=item B::C
+
+Perl compiler's C backend
+
+=item B::CC
+
+Perl compiler's optimized C translation backend
+
+=item B::Concise
+
+Walk Perl syntax tree, printing concise info about ops
+
+=item B::Debug
+
+Walk Perl syntax tree, printing debug info about ops
+
+=item B::Deparse
+
+Perl compiler backend to produce perl code
+
+=item B::Disassembler
+
+Disassemble Perl bytecode
+
+=item B::Lint
+
+Perl lint
+
+=item B::Showlex
+
+Show lexical variables used in functions or files
+
+=item B::Stackobj
+
+Helper module for CC backend
+
+=item B::Stash
+
+Show what stashes are loaded
+
+=item B::Terse
+
+Walk Perl syntax tree, printing terse info about ops
+
+=item B::Xref
+
+Generates cross reference reports for Perl programs
+
+=item Benchmark
+
+Benchmark running times of Perl code
+
+=item ByteLoader
+
+Load byte compiled perl code
+
+=item CGI
+
+Simple Common Gateway Interface Class
+
+=item CGI::Apache
+
+Backward compatibility module for CGI.pm
+
+=item CGI::Carp
+
+CGI routines for writing to the HTTPD (or other) error log
+
+=item CGI::Cookie
+
+Interface to Netscape Cookies
+
+=item CGI::Fast
+
+CGI Interface for Fast CGI
+
+=item CGI::Pretty
+
+Module to produce nicely formatted HTML code
+
+=item CGI::Push
+
+Simple Interface to Server Push
+
+=item CGI::Switch
+
+Backward compatibility module for defunct CGI::Switch
+
+=item CGI::Util
+
+Internal utilities used by CGI module
+
+=item CPAN
+
+Query, download and build perl modules from CPAN sites
+
+=item CPAN::FirstTime
+
+Utility for CPAN::Config file Initialization
+
+=item CPAN::Nox
+
+Wrapper around CPAN.pm without using any XS module
+
+=item CPAN::Version
+
+Utility functions to compare CPAN versions
+
+=item Carp
+
+Warn of errors (from perspective of caller)
+
+=item Carp::Heavy
+
+Heavy machinery, no user serviceable parts inside
+
+=item Class::ISA
+
+Report the search path for a class's ISA tree
+
+=item Class::Struct
+
+Declare struct-like datatypes as Perl classes
+
+=item Config
+
+Access Perl configuration information
+
+=item Cwd
+
+Get pathname of current working directory
+
+=item DB
+
+Programmatic interface to the Perl debugging API (draft, subject to
+
+=item DBM_Filter
+
+Filter DBM keys/values 
+
+=item DB_File
+
+Perl5 access to Berkeley DB version 1.x
+
+=item Data::Dumper
+
+Stringified perl data structures, suitable for both printing and C<eval>
+
+=item Devel::DProf
+
+A Perl code profiler
+
+=item Devel::PPPort
+
+Perl/Pollution/Portability
+
+=item Devel::Peek
+
+A data debugging tool for the XS programmer
+
+=item Devel::SelfStubber
+
+Generate stubs for a SelfLoading module
+
+=item Digest
+
+Modules that calculate message digests
+
+=item Digest::MD5
+
+Perl interface to the MD5 Algorithm
+
+=item Digest::base
+
+Digest base class
+
+=item Digest::file
+
+Calculate digests of files
+
+=item DirHandle
+
+Supply object methods for directory handles
+
+=item Dumpvalue
+
+Provides screen dump of Perl data.
+
+=item DynaLoader
+
+Dynamically load C libraries into Perl code
+
+=item Encode
+
+Character encodings
+
+=item Encode::Alias
+
+Alias definitions to encodings
+
+=item Encode::Byte
+
+Single Byte Encodings
+
+=item Encode::CJKConstants
+
+Internally used by Encode::??::ISO_2022_*
+
+=item Encode::CN
+
+China-based Chinese Encodings
+
+=item Encode::CN::HZ
+
+Internally used by Encode::CN
+
+=item Encode::Config
+
+Internally used by Encode
+
+=item Encode::EBCDIC
+
+EBCDIC Encodings
+
+=item Encode::Encoder
+
+Object Oriented Encoder
+
+=item Encode::Encoding
+
+Encode Implementation Base Class
+
+=item Encode::Guess
+
+Guesses encoding from data
+
+=item Encode::JP
+
+Japanese Encodings
+
+=item Encode::JP::H2Z
+
+Internally used by Encode::JP::2022_JP*
+
+=item Encode::JP::JIS7
+
+Internally used by Encode::JP
+
+=item Encode::KR
+
+Korean Encodings
+
+=item Encode::KR::2022_KR
+
+Internally used by Encode::KR
+
+=item Encode::MIME::Header
+
+MIME 'B' and 'Q' header encoding
+
+=item Encode::PerlIO
+
+A detailed document on Encode and PerlIO
+
+=item Encode::Supported
+
+Encodings supported by Encode
+
+=item Encode::Symbol
+
+Symbol Encodings
+
+=item Encode::TW
+
+Taiwan-based Chinese Encodings
+
+=item Encode::Unicode
+
+Various Unicode Transformation Formats
+
+=item Encode::Unicode::UTF7
+
+UTF-7 encoding
+
+=item English
+
+Use nice English (or awk) names for ugly punctuation variables
+
+=item Env
+
+Perl module that imports environment variables as scalars or arrays
+
+=item Errno
+
+System errno constants
+
+=item Exporter
+
+Implements default import method for modules
+
+=item Exporter::Heavy
+
+Exporter guts
+
+=item ExtUtils::Command
+
+Utilities to replace common UNIX commands in Makefiles etc.
+
+=item ExtUtils::Command::MM
+
+Commands for the MM's to use in Makefiles
+
+=item ExtUtils::Constant
+
+Generate XS code to import C header constants
+
+=item ExtUtils::Constant::Base
+
+Base class for ExtUtils::Constant objects
+
+=item ExtUtils::Constant::Utils
+
+Helper functions for ExtUtils::Constant
+
+=item ExtUtils::Constant::XS
+
+Base class for ExtUtils::Constant objects
+
+=item ExtUtils::Embed
+
+Utilities for embedding Perl in C/C++ applications
+
+=item ExtUtils::Install
+
+Install files from here to there
+
+=item ExtUtils::Installed
+
+Inventory management of installed modules
+
+=item ExtUtils::Liblist
+
+Determine libraries to use and how to use them
+
+=item ExtUtils::MM
+
+OS adjusted ExtUtils::MakeMaker subclass
+
+=item ExtUtils::MM_AIX
+
+AIX specific subclass of ExtUtils::MM_Unix
+
+=item ExtUtils::MM_Any
+
+Platform-agnostic MM methods
+
+=item ExtUtils::MM_BeOS
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_Cygwin
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_DOS
+
+DOS specific subclass of ExtUtils::MM_Unix
+
+=item ExtUtils::MM_MacOS
+
+Once produced Makefiles for MacOS Classic
+
+=item ExtUtils::MM_NW5
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_OS2
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_QNX
+
+QNX specific subclass of ExtUtils::MM_Unix
+
+=item ExtUtils::MM_UWIN
+
+U/WIN specific subclass of ExtUtils::MM_Unix
+
+=item ExtUtils::MM_Unix
+
+Methods used by ExtUtils::MakeMaker
+
+=item ExtUtils::MM_VMS
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_VOS
+
+VOS specific subclass of ExtUtils::MM_Unix
+
+=item ExtUtils::MM_Win32
+
+Methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_Win95
+
+Method to customize MakeMaker for Win9X
+
+=item ExtUtils::MY
+
+ExtUtils::MakeMaker subclass for customization
+
+=item ExtUtils::MakeMaker
+
+Create a module Makefile
+
+=item ExtUtils::MakeMaker::Config
+
+Wrapper around Config.pm
+
+=item ExtUtils::MakeMaker::FAQ
+
+Frequently Asked Questions About MakeMaker
+
+=item ExtUtils::MakeMaker::Tutorial
+
+Writing a module with MakeMaker
+
+=item ExtUtils::MakeMaker::bytes
+
+Version-agnostic bytes.pm
+
+=item ExtUtils::MakeMaker::vmsish
+
+Platform-agnostic vmsish.pm
+
+=item ExtUtils::Manifest
+
+Utilities to write and check a MANIFEST file
+
+=item ExtUtils::Mkbootstrap
+
+Make a bootstrap file for use by DynaLoader
+
+=item ExtUtils::Mksymlists
+
+Write linker options files for dynamic extension
+
+=item ExtUtils::Packlist
+
+Manage .packlist files
+
+=item ExtUtils::testlib
+
+Add blib/* directories to @INC
+
+=item Fatal
+
+Replace functions with equivalents which succeed or die
+
+=item Fcntl
+
+Load the C Fcntl.h defines
+
+=item File::Basename
+
+Parse file paths into directory, filename and suffix.
+
+=item File::CheckTree
+
+Run many filetest checks on a tree
+
+=item File::Compare
+
+Compare files or filehandles
+
+=item File::Copy
+
+Copy files or filehandles
+
+=item File::DosGlob
+
+DOS like globbing and then some
+
+=item File::Find
+
+Traverse a directory tree.
+
+=item File::Glob
+
+Perl extension for BSD glob routine
+
+=item File::Path
+
+Create or remove directory trees
+
+=item File::Spec
+
+Portably perform operations on file names
+
+=item File::Spec::Cygwin
+
+Methods for Cygwin file specs
+
+=item File::Spec::Epoc
+
+Methods for Epoc file specs
+
+=item File::Spec::Functions
+
+Portably perform operations on file names
+
+=item File::Spec::Mac
+
+File::Spec for Mac OS (Classic)
+
+=item File::Spec::OS2
+
+Methods for OS/2 file specs
+
+=item File::Spec::Unix
+
+File::Spec for Unix, base for other File::Spec modules
+
+=item File::Spec::VMS
+
+Methods for VMS file specs
+
+=item File::Spec::Win32
+
+Methods for Win32 file specs
+
+=item File::Temp
+
+Return name and handle of a temporary file safely
+
+=item File::stat
+
+By-name interface to Perl's built-in stat() functions
+
+=item FileCache
+
+Keep more files open than the system permits
+
+=item FileHandle
+
+Supply object methods for filehandles
+
+=item Filter::Simple
+
+Simplified source filtering
+
+=item Filter::Util::Call
+
+Perl Source Filter Utility Module
+
+=item FindBin
+
+Locate directory of original perl script
+
+=item GDBM_File
+
+Perl5 access to the gdbm library.
+
+=item Getopt::Long
+
+Extended processing of command line options
+
+=item Getopt::Std
+
+Process single-character switches with switch clustering
+
+=item Hash::Util
+
+A selection of general-utility hash subroutines
+
+=item I18N::Collate
+
+Compare 8-bit scalar data according to the current locale
+
+=item I18N::LangTags
+
+Functions for dealing with RFC3066-style language tags
+
+=item I18N::LangTags::Detect
+
+Detect the user's language preferences
+
+=item I18N::LangTags::List
+
+Tags and names for human languages
+
+=item I18N::Langinfo
+
+Query locale information
+
+=item IO
+
+Load various IO modules
+
+=item IO::Dir
+
+Supply object methods for directory handles
+
+=item IO::File
+
+Supply object methods for filehandles
+
+=item IO::Handle
+
+Supply object methods for I/O handles
+
+=item IO::Pipe
+
+Supply object methods for pipes
+
+=item IO::Poll
+
+Object interface to system poll call
+
+=item IO::Seekable
+
+Supply seek based methods for I/O objects
+
+=item IO::Select
+
+OO interface to the select system call
+
+=item IO::Socket
+
+Object interface to socket communications
+
+=item IO::Socket::INET
+
+Object interface for AF_INET domain sockets
+
+=item IO::Socket::UNIX
+
+Object interface for AF_UNIX domain sockets
+
+=item IPC::Open2
+
+Open a process for both reading and writing
+
+=item IPC::Open3
+
+Open a process for reading, writing, and error handling
+
+=item IPC::SysV
+
+SysV IPC constants
+
+=item IPC::SysV::Msg
+
+SysV Msg IPC object class
+
+=item IPC::SysV::Semaphore
+
+SysV Semaphore IPC object class
+
+=item List::Util
+
+A selection of general-utility list subroutines
+
+=item Locale::Constants
+
+Constants for Locale codes
+
+=item Locale::Country
+
+ISO codes for country identification (ISO 3166)
+
+=item Locale::Currency
+
+ISO three letter codes for currency identification (ISO 4217)
+
+=item Locale::Language
+
+ISO two letter codes for language identification (ISO 639)
+
+=item Locale::Maketext
+
+Framework for localization
+
+=item Locale::Maketext::TPJ13
+
+Article about software localization
+
+=item Locale::Script
+
+ISO codes for script identification (ISO 15924)
+
+=item MIME::Base64
+
+Encoding and decoding of base64 strings
+
+=item MIME::Base64::QuotedPrint
+
+Encoding and decoding of quoted-printable strings
+
+=item Math::BigFloat
+
+Arbitrary size floating point math package
+
+=item Math::BigInt
+
+Arbitrary size integer/float math package
+
+=item Math::BigInt::Calc
+
+Pure Perl module to support Math::BigInt
+
+=item Math::BigInt::CalcEmu
+
+Emulate low-level math with BigInt code
+
+=item Math::BigRat
+
+Arbitrary big rational numbers
+
+=item Math::Complex
+
+Complex numbers and associated mathematical functions
+
+=item Math::Trig
+
+Trigonometric functions
+
+=item Memoize
+
+Make functions faster by trading space for time
+
+=item Memoize::AnyDBM_File
+
+Glue to provide EXISTS for AnyDBM_File for Storable use
+
+=item Memoize::Expire
+
+Plug-in module for automatic expiration of memoized values
+
+=item Memoize::ExpireFile
+
+Test for Memoize expiration semantics
+
+=item Memoize::ExpireTest
+
+Test for Memoize expiration semantics
+
+=item Memoize::NDBM_File
+
+Glue to provide EXISTS for NDBM_File for Storable use
+
+=item Memoize::SDBM_File
+
+Glue to provide EXISTS for SDBM_File for Storable use
+
+=item Memoize::Storable
+
+Store Memoized data in Storable database
+
+=item NDBM_File
+
+Tied access to ndbm files
+
+=item NEXT
+
+Provide a pseudo-class NEXT (et al) that allows method redispatch
+
+=item Net::Cmd
+
+Network Command class (as used by FTP, SMTP etc)
+
+=item Net::Config
+
+Local configuration data for libnet
+
+=item Net::Domain
+
+Attempt to evaluate the current host's internet name and domain
+
+=item Net::FTP
+
+FTP Client class
+
+=item Net::NNTP
+
+NNTP Client class
+
+=item Net::Netrc
+
+OO interface to users netrc file
+
+=item Net::POP3
+
+Post Office Protocol 3 Client class (RFC1939)
+
+=item Net::Ping
+
+Check a remote host for reachability
+
+=item Net::SMTP
+
+Simple Mail Transfer Protocol Client
+
+=item Net::Time
+
+Time and daytime network client interface
+
+=item Net::hostent
+
+By-name interface to Perl's built-in gethost*() functions
+
+=item Net::libnetFAQ
+
+Libnet Frequently Asked Questions
+
+=item Net::netent
+
+By-name interface to Perl's built-in getnet*() functions
+
+=item Net::protoent
+
+By-name interface to Perl's built-in getproto*() functions
+
+=item Net::servent
+
+By-name interface to Perl's built-in getserv*() functions
+
+=item O
+
+Generic interface to Perl Compiler backends
+
+=item ODBM_File
+
+Tied access to odbm files
+
+=item Opcode
+
+Disable named opcodes when compiling perl code
+
+=item POSIX
+
+Perl interface to IEEE Std 1003.1
+
+=item PerlIO
+
+On demand loader for PerlIO layers and root of PerlIO::* name space
+
+=item PerlIO::encoding
+
+Encoding layer
+
+=item PerlIO::scalar
+
+In-memory IO, scalar IO
+
+=item PerlIO::via
+
+Helper class for PerlIO layers implemented in perl
+
+=item PerlIO::via::QuotedPrint
+
+PerlIO layer for quoted-printable strings
+
+=item Pod::Checker
+
+Check pod documents for syntax errors
+
+=item Pod::Find
+
+Find POD documents in directory trees
+
+=item Pod::Functions
+
+Group Perl's functions a la perlfunc.pod
+
+=item Pod::Html
+
+Module to convert pod files to HTML
+
+=item Pod::InputObjects
+
+Objects representing POD input paragraphs, commands, etc.
+
+=item Pod::LaTeX
+
+Convert Pod data to formatted Latex
+
+=item Pod::Man
+
+Convert POD data to formatted *roff input
+
+=item Pod::ParseLink
+
+Parse an LE<lt>E<gt> formatting code in POD text
+
+=item Pod::ParseUtils
+
+Helpers for POD parsing and conversion
+
+=item Pod::Parser
+
+Base class for creating POD filters and translators
+
+=item Pod::Perldoc::ToChecker
+
+Let Perldoc check Pod for errors
+
+=item Pod::Perldoc::ToMan
+
+Let Perldoc render Pod as man pages
+
+=item Pod::Perldoc::ToNroff
+
+Let Perldoc convert Pod to nroff
+
+=item Pod::Perldoc::ToPod
+
+Let Perldoc render Pod as ... Pod!
+
+=item Pod::Perldoc::ToRtf
+
+Let Perldoc render Pod as RTF
+
+=item Pod::Perldoc::ToText
+
+Let Perldoc render Pod as plaintext
+
+=item Pod::Perldoc::ToTk
+
+Let Perldoc use Tk::Pod to render Pod
+
+=item Pod::Perldoc::ToXml
+
+Let Perldoc render Pod as XML
+
+=item Pod::PlainText
+
+Convert POD data to formatted ASCII text
+
+=item Pod::Plainer
+
+Perl extension for converting Pod to old style Pod.
+
+=item Pod::Select
+
+Extract selected sections of POD from input
+
+=item Pod::Text
+
+Convert POD data to formatted ASCII text
+
+=item Pod::Text::Color
+
+Convert POD data to formatted color ASCII text
+
+=item Pod::Text::Overstrike
+
+Convert POD data to formatted overstrike text
+
+=item Pod::Text::Termcap
+
+Convert POD data to ASCII text with format escapes
+
+=item Pod::Usage
+
+Print a usage message from embedded pod documentation
+
+=item SDBM_File
+
+Tied access to sdbm files
+
+=item Safe
+
+Compile and execute code in restricted compartments
+
+=item Scalar::Util
+
+A selection of general-utility scalar subroutines
+
+=item Search::Dict
+
+Search for key in dictionary file
+
+=item SelectSaver
+
+Save and restore selected file handle
+
+=item SelfLoader
+
+Load functions only on demand
+
+=item Shell
+
+Run shell commands transparently within perl
+
+=item Socket
+
+Load the C socket.h defines and structure manipulators 
+
+=item Storable
+
+Persistence for Perl data structures
+
+=item Switch
+
+A switch statement for Perl
+
+=item Symbol
+
+Manipulate Perl symbols and their names
+
+=item Sys::Hostname
+
+Try every conceivable way to get hostname
+
+=item Sys::Syslog
+
+Perl interface to the UNIX syslog(3) calls
+
+=item Term::ANSIColor
+
+Color screen output using ANSI escape sequences
+
+=item Term::Cap
+
+Perl termcap interface
+
+=item Term::Complete
+
+Perl word completion module
+
+=item Term::ReadLine
+
+Perl interface to various C<readline> packages.
+
+=item Test
+
+Provides a simple framework for writing test scripts
+
+=item Test::Builder
+
+Backend for building test libraries
+
+=item Test::Builder::Module
+
+Base class for test modules
+
+=item Test::Builder::Tester
+
+Test testsuites that have been built with
+
+=item Test::Builder::Tester::Color
+
+Turn on colour in Test::Builder::Tester
+
+=item Test::Harness
+
+Run Perl standard test scripts with statistics
+
+=item Test::Harness::Assert
+
+Simple assert
+
+=item Test::Harness::Iterator
+
+Internal Test::Harness Iterator
+
+=item Test::Harness::Point
+
+Object for tracking a single test point
+
+=item Test::Harness::Straps
+
+Detailed analysis of test results
+
+=item Test::Harness::TAP
+
+Documentation for the TAP format
+
+=item Test::More
+
+Yet another framework for writing test scripts
+
+=item Test::Simple
+
+Basic utilities for writing tests.
+
+=item Test::Tutorial
+
+A tutorial about writing really basic tests
+
+=item Text::Abbrev
+
+Create an abbreviation table from a list
+
+=item Text::Balanced
+
+Extract delimited text sequences from strings.
+
+=item Text::ParseWords
+
+Parse text into an array of tokens or array of arrays
+
+=item Text::Soundex
+
+Implementation of the Soundex Algorithm as Described by Knuth
+
+=item Text::Tabs
+
+Expand and unexpand tabs per the unix expand(1) and unexpand(1)
+
+=item Text::Wrap
+
+Line wrapping to form simple paragraphs
+
+=item Thread
+
+Manipulate threads in Perl (for old code only)
+
+=item Thread::Queue
+
+Thread-safe queues
+
+=item Thread::Semaphore
+
+Thread-safe semaphores
+
+=item Thread::Signal
+
+Start a thread which runs signal handlers reliably (for old code)
+
+=item Thread::Specific
+
+Thread-specific keys
+
+=item Tie::Array
+
+Base class for tied arrays
+
+=item Tie::File
+
+Access the lines of a disk file via a Perl array
+
+=item Tie::Handle
+
+Base class definitions for tied handles
+
+=item Tie::Hash
+
+Base class definitions for tied hashes
+
+=item Tie::Memoize
+
+Add data to hash when needed
+
+=item Tie::RefHash
+
+Use references as hash keys
+
+=item Tie::Scalar
+
+Base class definitions for tied scalars
+
+=item Tie::SubstrHash
+
+Fixed-table-size, fixed-key-length hashing
+
+=item Time::HiRes
+
+High resolution alarm, sleep, gettimeofday, interval timers
+
+=item Time::Local
+
+Efficiently compute time from local and GMT time
+
+=item Time::gmtime
+
+By-name interface to Perl's built-in gmtime() function
+
+=item Time::localtime
+
+By-name interface to Perl's built-in localtime() function
+
+=item Time::tm
+
+Internal object used by Time::gmtime and Time::localtime
+
+=item UNIVERSAL
+
+Base class for ALL classes (blessed references)
+
+=item Unicode::Collate
+
+Unicode Collation Algorithm
+
+=item Unicode::Normalize
+
+Unicode Normalization Forms
+
+=item Unicode::UCD
+
+Unicode character database
+
+=item User::grent
+
+By-name interface to Perl's built-in getgr*() functions
+
+=item User::pwent
+
+By-name interface to Perl's built-in getpw*() functions
+
+=item XS::APItest
+
+Test the perl C API
+
+=item XS::Typemap
+
+Module to test the XS typemaps distributed with perl
+
+=item XSLoader
+
+Dynamically load C libraries into Perl code
+
+=back
+
+To find out I<all> modules installed on your system, including
+those without documentation or outside the standard release,
+just use the following command (under the default win32 shell,
+double quotes should be used instead of single quotes).
+
+    % perl -MFile::Find=find -MFile::Spec::Functions -Tlwe \
+      'find { wanted => sub { print canonpath $_ if /\.pm\z/ },
+      no_chdir => 1 }, @INC'
+
+(The -T is here to prevent '.' from being listed in @INC.)
+They should all have their own documentation installed and accessible
+via your system man(1) command.  If you do not have a B<find>
+program, you can use the Perl B<find2perl> program instead, which
+generates Perl code as output you can run through perl.  If you
+have a B<man> program but it doesn't find your modules, you'll have
+to fix your manpath.  See L<perl> for details.  If you have no
+system B<man> command, you might try the B<perldoc> program.
+
+Note also that the command C<perldoc perllocal> gives you a (possibly
+incomplete) list of the modules that have been further installed on
+your system. (The perllocal.pod file is updated by the standard MakeMaker
+install process.)
+
+=head2 Extension Modules
+
+Extension modules are written in C (or a mix of Perl and C).  They
+are usually dynamically loaded into Perl if and when you need them,
+but may also be linked in statically.  Supported extension modules
+include Socket, Fcntl, and POSIX.
+
+Many popular C extension modules do not come bundled (at least, not
+completely) due to their sizes, volatility, or simply lack of time
+for adequate testing and configuration across the multitude of
+platforms on which Perl was beta-tested.  You are encouraged to
+look for them on CPAN (described below), or using web search engines
+like Alta Vista or Google.
+
+=head1 CPAN
+
+CPAN stands for Comprehensive Perl Archive Network; it's a globally
+replicated trove of Perl materials, including documentation, style
+guides, tricks and traps, alternate ports to non-Unix systems and
+occasional binary distributions for these.   Search engines for
+CPAN can be found at http://www.cpan.org/
+
+Most importantly, CPAN includes around a thousand unbundled modules,
+some of which require a C compiler to build.  Major categories of
+modules are:
+
+=over
+
+=item *
+
+Language Extensions and Documentation Tools
+
+=item *
+
+Development Support
+
+=item *
+
+Operating System Interfaces
+
+=item *
+
+Networking, Device Control (modems) and InterProcess Communication
+
+=item *
+
+Data Types and Data Type Utilities
+
+=item *
+
+Database Interfaces
+
+=item *
+
+User Interfaces
+
+=item *
+
+Interfaces to / Emulations of Other Programming Languages
+
+=item *
+
+File Names, File Systems and File Locking (see also File Handles)
+
+=item *
+
+String Processing, Language Text Processing, Parsing, and Searching
+
+=item *
+
+Option, Argument, Parameter, and Configuration File Processing
+
+=item *
+
+Internationalization and Locale
+
+=item *
+
+Authentication, Security, and Encryption
+
+=item *
+
+World Wide Web, HTML, HTTP, CGI, MIME
+
+=item *
+
+Server and Daemon Utilities
+
+=item *
+
+Archiving and Compression
+
+=item *
+
+Images, Pixmap and Bitmap Manipulation, Drawing, and Graphing
+
+=item *
+
+Mail and Usenet News
+
+=item *
+
+Control Flow Utilities (callbacks and exceptions etc)
+
+=item *
+
+File Handle and Input/Output Stream Utilities
+
+=item *
+
+Miscellaneous Modules
+
+=back
+
+The list of the registered CPAN sites as of this writing follows.
+Please note that the sorting order is alphabetical on fields:
+
+Continent
+   |
+   |-->Country
+         |
+         |-->[state/province]
+                   |
+                   |-->ftp
+                   |
+                   |-->[http]
+
+and thus the North American servers happen to be listed between the
+European and the South American sites.
+
+You should try to choose one close to you.
+
+=head2 Africa
+
+=over 4
+
+=item South Africa
+
+                      http://ftp.rucus.ru.ac.za/pub/perl/CPAN/
+                      ftp://ftp.rucus.ru.ac.za/pub/perl/CPAN/
+                      ftp://ftp.is.co.za/programming/perl/CPAN/
+                      ftp://ftp.saix.net/pub/CPAN/
+                      ftp://ftp.sun.ac.za/CPAN/CPAN/
+
+=back
+
+=head2 Asia
+
+=over 4
+
+=item China
+
+                      http://cpan.linuxforum.net/
+                      http://cpan.shellhung.org/
+                      ftp://ftp.shellhung.org/pub/CPAN
+                      ftp://mirrors.hknet.com/CPAN
+
+=item Indonesia
+
+                      http://mirrors.tf.itb.ac.id/cpan/
+                      http://cpan.cbn.net.id/
+                      ftp://ftp.cbn.net.id/mirror/CPAN
+
+=item Israel
+
+                      ftp://ftp.iglu.org.il/pub/CPAN/
+                      http://cpan.lerner.co.il/
+                      http://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/
+                      ftp://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/
+
+=item Japan
+
+                      ftp://ftp.u-aizu.ac.jp/pub/CPAN
+                      ftp://ftp.kddlabs.co.jp/CPAN/
+                      ftp://ftp.ayamura.org/pub/CPAN/
+                      ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/
+                      http://ftp.cpan.jp/
+                      ftp://ftp.cpan.jp/CPAN/
+                      ftp://ftp.dti.ad.jp/pub/lang/CPAN/
+                      ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/
+
+=item Malaysia
+
+                      http://cpan.MyBSD.org.my
+                      http://mirror.leafbug.org/pub/CPAN
+                      http://ossig.mncc.com.my/mirror/pub/CPAN
+
+=item Russian Federation
+
+                      http://cpan.tomsk.ru
+                      ftp://cpan.tomsk.ru/
+
+=item Saudi Arabia
+
+                      ftp://ftp.isu.net.sa/pub/CPAN/
+
+=item Singapore
+
+                      http://CPAN.en.com.sg/
+                      ftp://cpan.en.com.sg/
+                      http://mirror.averse.net/pub/CPAN
+                      ftp://mirror.averse.net/pub/CPAN
+                      http://cpan.oss.eznetsols.org
+                      ftp://ftp.oss.eznetsols.org/cpan
+
+=item South Korea
+
+                      http://CPAN.bora.net/
+                      ftp://ftp.bora.net/pub/CPAN/
+                      http://mirror.kr.FreeBSD.org/CPAN
+                      ftp://ftp.kr.FreeBSD.org/pub/CPAN
+
+=item Taiwan
+
+                      ftp://ftp.nctu.edu.tw/UNIX/perl/CPAN
+                      http://cpan.cdpa.nsysu.edu.tw/
+                      ftp://cpan.cdpa.nsysu.edu.tw/pub/CPAN
+                      http://ftp.isu.edu.tw/pub/CPAN
+                      ftp://ftp.isu.edu.tw/pub/CPAN
+                      ftp://ftp1.sinica.edu.tw/pub1/perl/CPAN/
+                      http://ftp.tku.edu.tw/pub/CPAN/
+                      ftp://ftp.tku.edu.tw/pub/CPAN/
+
+=item Thailand
+
+                      ftp://ftp.loxinfo.co.th/pub/cpan/
+                      ftp://ftp.cs.riubon.ac.th/pub/mirrors/CPAN/
+
+=back
+
+=head2 Central America
+
+=over 4
+
+=item Costa Rica
+
+                      http://ftp.ucr.ac.cr/Unix/CPAN/
+                      ftp://ftp.ucr.ac.cr/pub/Unix/CPAN/
+
+=back
+
+=head2 Europe
+
+=over 4
+
+=item Austria
+
+                      http://cpan.inode.at/
+                      ftp://cpan.inode.at
+                      ftp://ftp.tuwien.ac.at/pub/CPAN/
+
+=item Belgium
+
+                      http://ftp.easynet.be/pub/CPAN/
+                      ftp://ftp.easynet.be/pub/CPAN/
+                      http://cpan.skynet.be
+                      ftp://ftp.cpan.skynet.be/pub/CPAN
+                      ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/
+
+=item Bosnia and Herzegovina
+
+                      http://cpan.blic.net/
+
+=item Bulgaria
+
+                      http://cpan.online.bg
+                      ftp://cpan.online.bg/cpan
+                      http://cpan.zadnik.org
+                      ftp://ftp.zadnik.org/mirrors/CPAN/
+                      http://cpan.lirex.net/
+                      ftp://ftp.lirex.net/pub/mirrors/CPAN
+
+=item Croatia
+
+                      http://ftp.linux.hr/pub/CPAN/
+                      ftp://ftp.linux.hr/pub/CPAN/
+
+=item Czech Republic
+
+                      ftp://ftp.fi.muni.cz/pub/CPAN/
+                      ftp://sunsite.mff.cuni.cz/MIRRORS/ftp.funet.fi/pub/languages/perl/CPAN/
+
+=item Denmark
+
+                      http://mirrors.sunsite.dk/cpan/
+                      ftp://sunsite.dk/mirrors/cpan/
+                      http://cpan.cybercity.dk
+                      http://www.cpan.dk/CPAN/
+                      ftp://www.cpan.dk/ftp.cpan.org/CPAN/
+
+=item Estonia
+
+                      ftp://ftp.ut.ee/pub/languages/perl/CPAN/
+
+=item Finland
+
+                      ftp://ftp.funet.fi/pub/languages/perl/CPAN/
+                      http://mirror.eunet.fi/CPAN
+
+=item France
+
+                      http://www.enstimac.fr/Perl/CPAN
+                      http://ftp.u-paris10.fr/perl/CPAN
+                      ftp://ftp.u-paris10.fr/perl/CPAN
+                      http://cpan.mirrors.easynet.fr/
+                      ftp://cpan.mirrors.easynet.fr/pub/ftp.cpan.org/
+                      ftp://ftp.club-internet.fr/pub/perl/CPAN/
+                      http://fr.cpan.org/
+                      ftp://ftp.lip6.fr/pub/perl/CPAN/
+                      ftp://ftp.oleane.net/pub/mirrors/CPAN/
+                      ftp://ftp.pasteur.fr/pub/computing/CPAN/
+                      http://mir2.ovh.net/ftp.cpan.org
+                      ftp://mir1.ovh.net/ftp.cpan.org
+                      http://ftp.crihan.fr/mirrors/ftp.cpan.org/
+                      ftp://ftp.crihan.fr/mirrors/ftp.cpan.org/
+                      http://ftp.u-strasbg.fr/CPAN
+                      ftp://ftp.u-strasbg.fr/CPAN
+                      ftp://cpan.cict.fr/pub/CPAN/
+                      ftp://ftp.uvsq.fr/pub/perl/CPAN/
+
+=item Germany
+
+                      ftp://ftp.rub.de/pub/CPAN/
+                      ftp://ftp.freenet.de/pub/ftp.cpan.org/pub/CPAN/
+                      ftp://ftp.uni-erlangen.de/pub/source/CPAN/
+                      ftp://ftp-stud.fht-esslingen.de/pub/Mirrors/CPAN
+                      http://pandemonium.tiscali.de/pub/CPAN/
+                      ftp://pandemonium.tiscali.de/pub/CPAN/
+                      http://ftp.gwdg.de/pub/languages/perl/CPAN/
+                      ftp://ftp.gwdg.de/pub/languages/perl/CPAN/
+                      ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN/
+                      ftp://ftp.leo.org/pub/CPAN/
+                      http://cpan.noris.de/
+                      ftp://cpan.noris.de/pub/CPAN/
+                      ftp://ftp.mpi-sb.mpg.de/pub/perl/CPAN/
+                      ftp://ftp.gmd.de/mirrors/CPAN/
+
+=item Greece
+
+                      ftp://ftp.acn.gr/pub/lang/perl
+                      ftp://ftp.forthnet.gr/pub/languages/perl/CPAN
+                      ftp://ftp.ntua.gr/pub/lang/perl/
+
+=item Hungary
+
+                      http://ftp.kfki.hu/packages/perl/CPAN/
+                      ftp://ftp.kfki.hu/pub/packages/perl/CPAN/
+
+=item Iceland
+
+                      http://ftp.rhnet.is/pub/CPAN/
+                      ftp://ftp.rhnet.is/pub/CPAN/
+
+=item Ireland
+
+                      http://cpan.indigo.ie/
+                      ftp://cpan.indigo.ie/pub/CPAN/
+                      http://ftp.heanet.ie/mirrors/ftp.perl.org/pub/CPAN
+                      ftp://ftp.heanet.ie/mirrors/ftp.perl.org/pub/CPAN
+                      http://sunsite.compapp.dcu.ie/pub/perl/
+                      ftp://sunsite.compapp.dcu.ie/pub/perl/
+
+=item Italy
+
+                      http://cpan.nettuno.it/
+                      http://gusp.dyndns.org/CPAN/
+                      ftp://gusp.dyndns.org/pub/CPAN
+                      http://softcity.iol.it/cpan
+                      ftp://softcity.iol.it/pub/cpan
+                      ftp://ftp.unina.it/pub/Other/CPAN/CPAN/
+                      ftp://ftp.unipi.it/pub/mirror/perl/CPAN/
+                      ftp://cis.uniRoma2.it/CPAN/
+                      ftp://ftp.edisontel.it/pub/CPAN_Mirror/
+                      http://cpan.flashnet.it/
+                      ftp://ftp.flashnet.it/pub/CPAN/
+
+=item Latvia
+
+                      http://kvin.lv/pub/CPAN/
+
+=item Lithuania
+
+                      ftp://ftp.unix.lt/pub/CPAN/
+
+=item Netherlands
+
+                      ftp://download.xs4all.nl/pub/mirror/CPAN/
+                      ftp://ftp.nl.uu.net/pub/CPAN/
+                      ftp://ftp.nluug.nl/pub/languages/perl/CPAN/
+                      http://cpan.cybercomm.nl/
+                      ftp://mirror.cybercomm.nl/pub/CPAN
+                      ftp://mirror.vuurwerk.nl/pub/CPAN/
+                      ftp://ftp.cpan.nl/pub/CPAN/
+                      http://ftp.easynet.nl/mirror/CPAN
+                      ftp://ftp.easynet.nl/mirror/CPAN
+                      http://archive.cs.uu.nl/mirror/CPAN/
+                      ftp://ftp.cs.uu.nl/mirror/CPAN/
+
+=item Norway
+
+                      ftp://ftp.uninett.no/pub/languages/perl/CPAN
+                      ftp://ftp.uit.no/pub/languages/perl/cpan/
+
+=item Poland
+
+                      ftp://ftp.mega.net.pl/CPAN
+                      ftp://ftp.man.torun.pl/pub/doc/CPAN/
+                      ftp://sunsite.icm.edu.pl/pub/CPAN/
+
+=item Portugal
+
+                      ftp://ftp.ua.pt/pub/CPAN/
+                      ftp://perl.di.uminho.pt/pub/CPAN/
+                      http://cpan.dei.uc.pt/
+                      ftp://ftp.dei.uc.pt/pub/CPAN
+                      ftp://ftp.nfsi.pt/pub/CPAN
+                      http://ftp.linux.pt/pub/mirrors/CPAN
+                      ftp://ftp.linux.pt/pub/mirrors/CPAN
+                      http://cpan.ip.pt/
+                      ftp://cpan.ip.pt/pub/cpan/
+                      http://cpan.telepac.pt/
+                      ftp://ftp.telepac.pt/pub/cpan/
+
+=item Romania
+
+                      ftp://ftp.bio-net.ro/pub/CPAN
+                      ftp://ftp.kappa.ro/pub/mirrors/ftp.perl.org/pub/CPAN/
+                      ftp://ftp.lug.ro/CPAN
+                      ftp://ftp.roedu.net/pub/CPAN/
+                      ftp://ftp.dntis.ro/pub/cpan/
+                      ftp://ftp.iasi.roedu.net/pub/mirrors/ftp.cpan.org/
+                      http://cpan.ambra.ro/
+                      ftp://ftp.ambra.ro/pub/CPAN
+                      ftp://ftp.dnttm.ro/pub/CPAN/
+                      ftp://ftp.lasting.ro/pub/CPAN
+                      ftp://ftp.timisoara.roedu.net/mirrors/CPAN/
+
+=item Russia
+
+                      ftp://ftp.chg.ru/pub/lang/perl/CPAN/
+                      http://cpan.rinet.ru/
+                      ftp://cpan.rinet.ru/pub/mirror/CPAN/
+                      ftp://ftp.aha.ru/pub/CPAN/
+                      ftp://ftp.corbina.ru/pub/CPAN/
+                      http://cpan.sai.msu.ru/
+                      ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/
+
+=item Slovakia
+
+                      ftp://ftp.cvt.stuba.sk/pub/CPAN/
+
+=item Slovenia
+
+                      ftp://ftp.arnes.si/software/perl/CPAN/
+
+=item Spain
+
+                      http://cpan.imasd.elmundo.es/
+                      ftp://ftp.rediris.es/mirror/CPAN/
+                      ftp://ftp.ri.telefonica-data.net/CPAN
+                      ftp://ftp.etse.urv.es/pub/perl/
+
+=item Sweden
+
+                      http://ftp.du.se/CPAN/
+                      ftp://ftp.du.se/pub/CPAN/
+                      http://mirror.dataphone.se/CPAN
+                      ftp://mirror.dataphone.se/pub/CPAN
+                      ftp://ftp.sunet.se/pub/lang/perl/CPAN/
+
+=item Switzerland
+
+                      http://cpan.mirror.solnet.ch/
+                      ftp://ftp.solnet.ch/mirror/CPAN/
+                      ftp://ftp.danyk.ch/CPAN/
+                      ftp://sunsite.cnlab-switch.ch/mirror/CPAN/
+
+=item Turkey
+
+                      http://ftp.ulak.net.tr/perl/CPAN/
+                      ftp://ftp.ulak.net.tr/perl/CPAN
+                      ftp://sunsite.bilkent.edu.tr/pub/languages/CPAN/
+
+=item Ukraine
+
+                      http://cpan.org.ua/
+                      ftp://cpan.org.ua/
+                      ftp://ftp.perl.org.ua/pub/CPAN/
+                      http://no-more.kiev.ua/CPAN/
+                      ftp://no-more.kiev.ua/pub/CPAN/
+
+=item United Kingdom
+
+                      http://www.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN
+                      ftp://ftp.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN/
+                      http://cpan.teleglobe.net/
+                      ftp://cpan.teleglobe.net/pub/CPAN
+                      http://cpan.mirror.anlx.net/
+                      ftp://ftp.mirror.anlx.net/CPAN/
+                      http://cpan.etla.org/
+                      ftp://cpan.etla.org/pub/CPAN
+                      ftp://ftp.demon.co.uk/pub/CPAN/
+                      http://cpan.m.flirble.org/
+                      ftp://ftp.flirble.org/pub/languages/perl/CPAN/
+                      ftp://ftp.plig.org/pub/CPAN/
+                      http://cpan.hambule.co.uk/
+                      http://cpan.mirrors.clockerz.net/
+                      ftp://ftp.clockerz.net/pub/CPAN/
+                      ftp://usit.shef.ac.uk/pub/packages/CPAN/
+
+=back
+
+=head2 North America
+
+=over 4
+
+=item Canada
+
+=over 8
+
+=item Alberta
+
+                      http://cpan.sunsite.ualberta.ca/
+                      ftp://cpan.sunsite.ualberta.ca/pub/CPAN/
+
+=item Manitoba
+
+                      http://theoryx5.uwinnipeg.ca/pub/CPAN/
+                      ftp://theoryx5.uwinnipeg.ca/pub/CPAN/
+
+=item Nova Scotia
+
+                      ftp://cpan.chebucto.ns.ca/pub/CPAN/
+
+=item Ontario
+
+                      ftp://ftp.nrc.ca/pub/CPAN/
+
+=back
+
+=item Mexico
+
+                      http://cpan.azc.uam.mx
+                      ftp://cpan.azc.uam.mx/mirrors/CPAN
+                      http://www.cpan.unam.mx/
+                      ftp://ftp.unam.mx/pub/CPAN
+                      http://www.msg.com.mx/CPAN/
+                      ftp://ftp.msg.com.mx/pub/CPAN/
+
+=item United States
+
+=over 8
+
+=item Alabama
+
+                      http://mirror.hiwaay.net/CPAN/
+                      ftp://mirror.hiwaay.net/CPAN/
+
+=item California
+
+                      http://cpan.develooper.com/
+                      http://www.cpan.org/
+                      ftp://cpan.valueclick.com/pub/CPAN/
+                      http://www.mednor.net/ftp/pub/mirrors/CPAN/
+                      ftp://ftp.mednor.net/pub/mirrors/CPAN/
+                      http://mirrors.gossamer-threads.com/CPAN
+                      ftp://cpan.nas.nasa.gov/pub/perl/CPAN/
+                      http://mirrors.kernel.org/cpan/
+                      ftp://mirrors.kernel.org/pub/CPAN
+                      http://cpan-sj.viaverio.com/
+                      ftp://cpan-sj.viaverio.com/pub/CPAN/
+                      http://cpan.digisle.net/
+                      ftp://cpan.digisle.net/pub/CPAN
+                      http://www.perl.com/CPAN/
+                      http://www.uberlan.net/CPAN
+
+=item Colorado
+
+                      ftp://ftp.cs.colorado.edu/pub/perl/CPAN/
+                      http://cpan.four10.com
+
+=item Delaware
+
+                      http://ftp.lug.udel.edu/pub/CPAN
+                      ftp://ftp.lug.udel.edu/pub/CPAN
+
+=item District of Columbia
+
+                      ftp://ftp.dc.aleron.net/pub/CPAN/
+
+=item Florida
+
+                      ftp://ftp.cise.ufl.edu/pub/mirrors/CPAN/
+                      http://mirror.csit.fsu.edu/pub/CPAN/
+                      ftp://mirror.csit.fsu.edu/pub/CPAN/
+                      http://cpan.mirrors.nks.net/
+
+=item Indiana
+
+                      ftp://ftp.uwsg.iu.edu/pub/perl/CPAN/
+                      http://cpan.netnitco.net/
+                      ftp://cpan.netnitco.net/pub/mirrors/CPAN/
+                      http://archive.progeny.com/CPAN/
+                      ftp://archive.progeny.com/CPAN/
+                      http://fx.saintjoe.edu/pub/CPAN
+                      ftp://ftp.saintjoe.edu/pub/CPAN
+                      http://csociety-ftp.ecn.purdue.edu/pub/CPAN
+                      ftp://csociety-ftp.ecn.purdue.edu/pub/CPAN
+
+=item Kentucky
+
+                      http://cpan.uky.edu/
+                      ftp://cpan.uky.edu/pub/CPAN/
+                      http://slugsite.louisville.edu/cpan
+                      ftp://slugsite.louisville.edu/CPAN
+
+=item Massachusetts
+
+                      http://mirrors.towardex.com/CPAN
+                      ftp://mirrors.towardex.com/pub/CPAN
+                      ftp://ftp.ccs.neu.edu/net/mirrors/ftp.funet.fi/pub/languages/perl/CPAN/
+
+=item Michigan
+
+                      ftp://cpan.cse.msu.edu/
+                      http://cpan.calvin.edu/pub/CPAN
+                      ftp://cpan.calvin.edu/pub/CPAN
+
+=item Nevada
+
+                      http://www.oss.redundant.com/pub/CPAN
+                      ftp://www.oss.redundant.com/pub/CPAN
+
+=item New Jersey
+
+                      http://ftp.cpanel.net/pub/CPAN/
+                      ftp://ftp.cpanel.net/pub/CPAN/
+                      http://cpan.teleglobe.net/
+                      ftp://cpan.teleglobe.net/pub/CPAN
+
+=item New York
+
+                      http://cpan.belfry.net/
+                      http://cpan.erlbaum.net/
+                      ftp://cpan.erlbaum.net/
+                      http://cpan.thepirtgroup.com/
+                      ftp://cpan.thepirtgroup.com/
+                      ftp://ftp.stealth.net/pub/CPAN/
+                      http://www.rge.com/pub/languages/perl/
+                      ftp://ftp.rge.com/pub/languages/perl/
+
+=item North Carolina
+
+                      http://www.ibiblio.org/pub/languages/perl/CPAN
+                      ftp://ftp.ibiblio.org/pub/languages/perl/CPAN
+                      ftp://ftp.duke.edu/pub/perl/
+                      ftp://ftp.ncsu.edu/pub/mirror/CPAN/
+
+=item Oklahoma
+
+                      ftp://ftp.ou.edu/mirrors/CPAN/
+
+=item Oregon
+
+                      ftp://ftp.orst.edu/pub/CPAN
+
+=item Pennsylvania
+
+                      http://ftp.epix.net/CPAN/
+                      ftp://ftp.epix.net/pub/languages/perl/
+                      http://mirrors.phenominet.com/pub/CPAN/
+                      ftp://mirrors.phenominet.com/pub/CPAN/
+                      http://cpan.pair.com/
+                      ftp://cpan.pair.com/pub/CPAN/
+                      ftp://carroll.cac.psu.edu/pub/CPAN/
+
+=item Tennessee
+
+                      ftp://ftp.sunsite.utk.edu/pub/CPAN/
+
+=item Texas
+
+                      http://ftp.sedl.org/pub/mirrors/CPAN/
+                      http://www.binarycode.org/cpan
+                      ftp://mirror.telentente.com/pub/CPAN
+                      http://mirrors.theonlinerecordstore.com/CPAN
+
+=item Utah
+
+                      ftp://mirror.xmission.com/CPAN/
+
+=item Virginia
+
+                      http://cpan-du.viaverio.com/
+                      ftp://cpan-du.viaverio.com/pub/CPAN/
+                      http://mirrors.rcn.net/pub/lang/CPAN/
+                      ftp://mirrors.rcn.net/pub/lang/CPAN/
+                      http://perl.secsup.org/
+                      ftp://perl.secsup.org/pub/perl/
+                      http://noc.cvaix.com/mirrors/CPAN/
+
+=item Washington
+
+                      http://cpan.llarian.net/
+                      ftp://cpan.llarian.net/pub/CPAN/
+                      http://cpan.mirrorcentral.com/
+                      ftp://ftp.mirrorcentral.com/pub/CPAN/
+                      ftp://ftp-mirror.internap.com/pub/CPAN/
+
+=item Wisconsin
+
+                      http://mirror.sit.wisc.edu/pub/CPAN/
+                      ftp://mirror.sit.wisc.edu/pub/CPAN/
+                      http://mirror.aphix.com/CPAN
+                      ftp://mirror.aphix.com/pub/CPAN
+
+=back
+
+=back
+
+=head2 Oceania
+
+=over 4
+
+=item Australia
+
+                      http://ftp.planetmirror.com/pub/CPAN/
+                      ftp://ftp.planetmirror.com/pub/CPAN/
+                      ftp://mirror.aarnet.edu.au/pub/perl/CPAN/
+                      ftp://cpan.topend.com.au/pub/CPAN/
+                      http://cpan.mirrors.ilisys.com.au
+
+=item New Zealand
+
+                      ftp://ftp.auckland.ac.nz/pub/perl/CPAN/
+
+=item United States
+
+                      http://aniani.ifa.hawaii.edu/CPAN/
+                      ftp://aniani.ifa.hawaii.edu/CPAN/
+
+=back
+
+=head2 South America
+
+=over 4
+
+=item Argentina
+
+                      ftp://mirrors.bannerlandia.com.ar/mirrors/CPAN/
+                      http://www.linux.org.ar/mirrors/cpan
+                      ftp://ftp.linux.org.ar/mirrors/cpan
+
+=item Brazil
+
+                      ftp://cpan.pop-mg.com.br/pub/CPAN/
+                      ftp://ftp.matrix.com.br/pub/perl/CPAN/
+                      http://cpan.hostsul.com.br/
+                      ftp://cpan.hostsul.com.br/
+
+=item Chile
+
+                      http://cpan.netglobalis.net/
+                      ftp://cpan.netglobalis.net/pub/CPAN/
+
+=back
+
+=head2 RSYNC Mirrors
+
+                      www.linux.org.ar::cpan
+                      theoryx5.uwinnipeg.ca::CPAN
+                      ftp.shellhung.org::CPAN
+                      rsync.nic.funet.fi::CPAN
+                      ftp.u-paris10.fr::CPAN
+                      mir1.ovh.net::CPAN
+                      rsync://ftp.crihan.fr::CPAN
+                      ftp.gwdg.de::FTP/languages/perl/CPAN/
+                      ftp.leo.org::CPAN
+                      ftp.cbn.net.id::CPAN
+                      rsync://ftp.heanet.ie/mirrors/ftp.perl.org/pub/CPAN
+                      ftp.iglu.org.il::CPAN
+                      gusp.dyndns.org::cpan
+                      ftp.kddlabs.co.jp::cpan
+                      ftp.ayamura.org::pub/CPAN/
+                      mirror.leafbug.org::CPAN
+                      rsync.en.com.sg::CPAN
+                      mirror.averse.net::cpan
+                      rsync.oss.eznetsols.org
+                      ftp.kr.FreeBSD.org::CPAN
+                      ftp.solnet.ch::CPAN
+                      cpan.cdpa.nsysu.edu.tw::CPAN
+                      cpan.teleglobe.net::CPAN
+                      rsync://rsync.mirror.anlx.net::CPAN
+                      ftp.sedl.org::cpan
+                      ibiblio.org::CPAN
+                      cpan-du.viaverio.com::CPAN
+                      aniani.ifa.hawaii.edu::CPAN
+                      archive.progeny.com::CPAN
+                      rsync://slugsite.louisville.edu::CPAN
+                      mirror.aphix.com::CPAN
+                      cpan.teleglobe.net::CPAN
+                      ftp.lug.udel.edu::cpan
+                      mirrors.kernel.org::mirrors/CPAN
+                      mirrors.phenominet.com::CPAN
+                      cpan.pair.com::CPAN
+                      cpan-sj.viaverio.com::CPAN
+                      mirror.csit.fsu.edu::CPAN
+                      csociety-ftp.ecn.purdue.edu::CPAN
+
+For an up-to-date listing of CPAN sites,
+see http://www.cpan.org/SITES or ftp://www.cpan.org/SITES .
+
+=head1 Modules: Creation, Use, and Abuse
+
+(The following section is borrowed directly from Tim Bunce's modules
+file, available at your nearest CPAN site.)
+
+Perl implements a class using a package, but the presence of a
+package doesn't imply the presence of a class.  A package is just a
+namespace.  A class is a package that provides subroutines that can be
+used as methods.  A method is just a subroutine that expects, as its
+first argument, either the name of a package (for "static" methods),
+or a reference to something (for "virtual" methods).
+
+A module is a file that (by convention) provides a class of the same
+name (sans the .pm), plus an import method in that class that can be
+called to fetch exported symbols.  This module may implement some of
+its methods by loading dynamic C or C++ objects, but that should be
+totally transparent to the user of the module.  Likewise, the module
+might set up an AUTOLOAD function to slurp in subroutine definitions on
+demand, but this is also transparent.  Only the F<.pm> file is required to
+exist.  See L<perlsub>, L<perltoot>, and L<AutoLoader> for details about
+the AUTOLOAD mechanism.
+
+=head2 Guidelines for Module Creation
+
+=over 4
+
+=item  *
+
+Do similar modules already exist in some form?
+
+If so, please try to reuse the existing modules either in whole or
+by inheriting useful features into a new class.  If this is not
+practical try to get together with the module authors to work on
+extending or enhancing the functionality of the existing modules.
+A perfect example is the plethora of packages in perl4 for dealing
+with command line options.
+
+If you are writing a module to expand an already existing set of
+modules, please coordinate with the author of the package.  It
+helps if you follow the same naming scheme and module interaction
+scheme as the original author.
+
+=item  *
+
+Try to design the new module to be easy to extend and reuse.
+
+Try to C<use warnings;> (or C<use warnings qw(...);>).
+Remember that you can add C<no warnings qw(...);> to individual blocks
+of code that need less warnings.
+
+Use blessed references.  Use the two argument form of bless to bless
+into the class name given as the first parameter of the constructor,
+e.g.,:
+
+ sub new {
+     my $class = shift;
+     return bless {}, $class;
+ }
+
+or even this if you'd like it to be used as either a static
+or a virtual method.
+
+ sub new {
+     my $self  = shift;
+     my $class = ref($self) || $self;
+     return bless {}, $class;
+ }
+
+Pass arrays as references so more parameters can be added later
+(it's also faster).  Convert functions into methods where
+appropriate.  Split large methods into smaller more flexible ones.
+Inherit methods from other modules if appropriate.
+
+Avoid class name tests like: C<die "Invalid" unless ref $ref eq 'FOO'>.
+Generally you can delete the C<eq 'FOO'> part with no harm at all.
+Let the objects look after themselves! Generally, avoid hard-wired
+class names as far as possible.
+
+Avoid C<< $r->Class::func() >> where using C<@ISA=qw(... Class ...)> and
+C<< $r->func() >> would work (see L<perlbot> for more details).
+
+Use autosplit so little used or newly added functions won't be a
+burden to programs that don't use them. Add test functions to
+the module after __END__ either using AutoSplit or by saying:
+
+ eval join('',<main::DATA>) || die $@ unless caller();
+
+Does your module pass the 'empty subclass' test? If you say
+C<@SUBCLASS::ISA = qw(YOURCLASS);> your applications should be able
+to use SUBCLASS in exactly the same way as YOURCLASS.  For example,
+does your application still work if you change:  C<$obj = new YOURCLASS;>
+into: C<$obj = new SUBCLASS;> ?
+
+Avoid keeping any state information in your packages. It makes it
+difficult for multiple other packages to use yours. Keep state
+information in objects.
+
+Always use B<-w>.
+
+Try to C<use strict;> (or C<use strict qw(...);>).
+Remember that you can add C<no strict qw(...);> to individual blocks
+of code that need less strictness.
+
+Always use B<-w>.
+
+Follow the guidelines in the perlstyle(1) manual.
+
+Always use B<-w>.
+
+=item  *
+
+Some simple style guidelines
+
+The perlstyle manual supplied with Perl has many helpful points.
+
+Coding style is a matter of personal taste. Many people evolve their
+style over several years as they learn what helps them write and
+maintain good code.  Here's one set of assorted suggestions that
+seem to be widely used by experienced developers:
+
+Use underscores to separate words.  It is generally easier to read
+$var_names_like_this than $VarNamesLikeThis, especially for
+non-native speakers of English. It's also a simple rule that works
+consistently with VAR_NAMES_LIKE_THIS.
+
+Package/Module names are an exception to this rule. Perl informally
+reserves lowercase module names for 'pragma' modules like integer
+and strict. Other modules normally begin with a capital letter and
+use mixed case with no underscores (need to be short and portable).
+
+You may find it helpful to use letter case to indicate the scope
+or nature of a variable. For example:
+
+ $ALL_CAPS_HERE   constants only (beware clashes with Perl vars)
+ $Some_Caps_Here  package-wide global/static
+ $no_caps_here    function scope my() or local() variables
+
+Function and method names seem to work best as all lowercase.
+e.g., C<< $obj->as_string() >>.
+
+You can use a leading underscore to indicate that a variable or
+function should not be used outside the package that defined it.
+
+=item  *
+
+Select what to export.
+
+Do NOT export method names!
+
+Do NOT export anything else by default without a good reason!
+
+Exports pollute the namespace of the module user.  If you must
+export try to use @EXPORT_OK in preference to @EXPORT and avoid
+short or common names to reduce the risk of name clashes.
+
+Generally anything not exported is still accessible from outside the
+module using the ModuleName::item_name (or C<< $blessed_ref->method >>)
+syntax.  By convention you can use a leading underscore on names to
+indicate informally that they are 'internal' and not for public use.
+
+(It is actually possible to get private functions by saying:
+C<my $subref = sub { ... };  &$subref;>.  But there's no way to call that
+directly as a method, because a method must have a name in the symbol
+table.)
+
+As a general rule, if the module is trying to be object oriented
+then export nothing. If it's just a collection of functions then
+@EXPORT_OK anything but use @EXPORT with caution.
+
+=item  *
+
+Select a name for the module.
+
+This name should be as descriptive, accurate, and complete as
+possible.  Avoid any risk of ambiguity. Always try to use two or
+more whole words.  Generally the name should reflect what is special
+about what the module does rather than how it does it.  Please use
+nested module names to group informally or categorize a module.
+There should be a very good reason for a module not to have a nested name.
+Module names should begin with a capital letter.
+
+Having 57 modules all called Sort will not make life easy for anyone
+(though having 23 called Sort::Quick is only marginally better :-).
+Imagine someone trying to install your module alongside many others.
+If in any doubt ask for suggestions in comp.lang.perl.misc.
+
+If you are developing a suite of related modules/classes it's good
+practice to use nested classes with a common prefix as this will
+avoid namespace clashes. For example: Xyz::Control, Xyz::View,
+Xyz::Model etc. Use the modules in this list as a naming guide.
+
+If adding a new module to a set, follow the original author's
+standards for naming modules and the interface to methods in
+those modules.
+
+If developing modules for private internal or project specific use,
+that will never be released to the public, then you should ensure
+that their names will not clash with any future public module. You
+can do this either by using the reserved Local::* category or by
+using a category name that includes an underscore like Foo_Corp::*.
+
+To be portable each component of a module name should be limited to
+11 characters. If it might be used on MS-DOS then try to ensure each is
+unique in the first 8 characters. Nested modules make this easier.
+
+=item  *
+
+Have you got it right?
+
+How do you know that you've made the right decisions? Have you
+picked an interface design that will cause problems later? Have
+you picked the most appropriate name? Do you have any questions?
+
+The best way to know for sure, and pick up many helpful suggestions,
+is to ask someone who knows. Comp.lang.perl.misc is read by just about
+all the people who develop modules and it's the best place to ask.
+
+All you need to do is post a short summary of the module, its
+purpose and interfaces. A few lines on each of the main methods is
+probably enough. (If you post the whole module it might be ignored
+by busy people - generally the very people you want to read it!)
+
+Don't worry about posting if you can't say when the module will be
+ready - just say so in the message. It might be worth inviting
+others to help you, they may be able to complete it for you!
+
+=item  *
+
+README and other Additional Files.
+
+It's well known that software developers usually fully document the
+software they write. If, however, the world is in urgent need of
+your software and there is not enough time to write the full
+documentation please at least provide a README file containing:
+
+=over 10
+
+=item *
+
+A description of the module/package/extension etc.
+
+=item *
+
+A copyright notice - see below.
+
+=item *
+
+Prerequisites - what else you may need to have.
+
+=item *
+
+How to build it - possible changes to Makefile.PL etc.
+
+=item *
+
+How to install it.
+
+=item *
+
+Recent changes in this release, especially incompatibilities
+
+=item *
+
+Changes / enhancements you plan to make in the future.
+
+=back
+
+If the README file seems to be getting too large you may wish to
+split out some of the sections into separate files: INSTALL,
+Copying, ToDo etc.
+
+=over 4
+
+=item *
+
+Adding a Copyright Notice.
+
+How you choose to license your work is a personal decision.
+The general mechanism is to assert your Copyright and then make
+a declaration of how others may copy/use/modify your work.
+
+Perl, for example, is supplied with two types of licence: The GNU GPL
+and The Artistic Licence (see the files README, Copying, and Artistic,
+or L<perlgpl> and L<perlartistic>).  Larry has good reasons for NOT
+just using the GNU GPL.
+
+My personal recommendation, out of respect for Larry, Perl, and the
+Perl community at large is to state something simply like:
+
+ Copyright (c) 1995 Your Name. All rights reserved.
+ This program is free software; you can redistribute it and/or
+ modify it under the same terms as Perl itself.
+
+This statement should at least appear in the README file. You may
+also wish to include it in a Copying file and your source files.
+Remember to include the other words in addition to the Copyright.
+
+=item  *
+
+Give the module a version/issue/release number.
+
+To be fully compatible with the Exporter and MakeMaker modules you
+should store your module's version number in a non-my package
+variable called $VERSION.  This should be a floating point
+number with at least two digits after the decimal (i.e., hundredths,
+e.g, C<$VERSION = "0.01">).  Don't use a "1.3.2" style version.
+See L<Exporter> for details.
+
+It may be handy to add a function or method to retrieve the number.
+Use the number in announcements and archive file names when
+releasing the module (ModuleName-1.02.tar.Z).
+See perldoc ExtUtils::MakeMaker.pm for details.
+
+=item  *
+
+How to release and distribute a module.
+
+It's good idea to post an announcement of the availability of your
+module (or the module itself if small) to the comp.lang.perl.announce
+Usenet newsgroup.  This will at least ensure very wide once-off
+distribution.
+
+If possible, register the module with CPAN.  You should
+include details of its location in your announcement.
+
+Some notes about ftp archives: Please use a long descriptive file
+name that includes the version number. Most incoming directories
+will not be readable/listable, i.e., you won't be able to see your
+file after uploading it. Remember to send your email notification
+message as soon as possible after uploading else your file may get
+deleted automatically. Allow time for the file to be processed
+and/or check the file has been processed before announcing its
+location.
+
+FTP Archives for Perl Modules:
+
+Follow the instructions and links on:
+
+   http://www.cpan.org/modules/00modlist.long.html
+   http://www.cpan.org/modules/04pause.html
+
+or upload to one of these sites:
+
+   https://pause.kbx.de/pause/
+   http://pause.perl.org/pause/
+
+and notify <modules@perl.org>.
+
+By using the WWW interface you can ask the Upload Server to mirror
+your modules from your ftp or WWW site into your own directory on
+CPAN!
+
+Please remember to send me an updated entry for the Module list!
+
+=item  *
+
+Take care when changing a released module.
+
+Always strive to remain compatible with previous released versions.
+Otherwise try to add a mechanism to revert to the
+old behavior if people rely on it.  Document incompatible changes.
+
+=back
+
+=back
+
+=head2 Guidelines for Converting Perl 4 Library Scripts into Modules
+
+=over 4
+
+=item  *
+
+There is no requirement to convert anything.
+
+If it ain't broke, don't fix it! Perl 4 library scripts should
+continue to work with no problems. You may need to make some minor
+changes (like escaping non-array @'s in double quoted strings) but
+there is no need to convert a .pl file into a Module for just that.
+
+=item  *
+
+Consider the implications.
+
+All Perl applications that make use of the script will need to
+be changed (slightly) if the script is converted into a module.  Is
+it worth it unless you plan to make other changes at the same time?
+
+=item  *
+
+Make the most of the opportunity.
+
+If you are going to convert the script to a module you can use the
+opportunity to redesign the interface.  The guidelines for module
+creation above include many of the issues you should consider.
+
+=item  *
+
+The pl2pm utility will get you started.
+
+This utility will read *.pl files (given as parameters) and write
+corresponding *.pm files. The pl2pm utilities does the following:
+
+=over 10
+
+=item *
+
+Adds the standard Module prologue lines
+
+=item *
+
+Converts package specifiers from ' to ::
+
+=item *
+
+Converts die(...) to croak(...)
+
+=item *
+
+Several other minor changes
+
+=back
+
+Being a mechanical process pl2pm is not bullet proof. The converted
+code will need careful checking, especially any package statements.
+Don't delete the original .pl file till the new .pm one works!
+
+=back
+
+=head2 Guidelines for Reusing Application Code
+
+=over 4
+
+=item  *
+
+Complete applications rarely belong in the Perl Module Library.
+
+=item  *
+
+Many applications contain some Perl code that could be reused.
+
+Help save the world! Share your code in a form that makes it easy
+to reuse.
+
+=item  *
+
+Break-out the reusable code into one or more separate module files.
+
+=item  *
+
+Take the opportunity to reconsider and redesign the interfaces.
+
+=item  *
+
+In some cases the 'application' can then be reduced to a small
+
+fragment of code built on top of the reusable modules. In these cases
+the application could invoked as:
+
+     % perl -e 'use Module::Name; method(@ARGV)' ...
+or
+     % perl -mModule::Name ...    (in perl5.002 or higher)
+
+=back
+
+=head1 NOTE
+
+Perl does not enforce private and public parts of its modules as you may
+have been used to in other languages like C++, Ada, or Modula-17.  Perl
+doesn't have an infatuation with enforced privacy.  It would prefer
+that you stayed out of its living room because you weren't invited, not
+because it has a shotgun.
+
+The module and its user have a contract, part of which is common law,
+and part of which is "written".  Part of the common law contract is
+that a module doesn't pollute any namespace it wasn't asked to.  The
+written contract for the module (A.K.A. documentation) may make other
+provisions.  But then you know when you C<use RedefineTheWorld> that
+you're redefining the world and willing to take the consequences.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmodstyle.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmodstyle.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmodstyle.pod	(revision 14489)
@@ -0,0 +1,780 @@
+=head1 NAME
+
+perlmodstyle - Perl module style guide
+
+=head1 INTRODUCTION
+
+This document attempts to describe the Perl Community's "best practice"
+for writing Perl modules.  It extends the recommendations found in 
+L<perlstyle> , which should be considered required reading
+before reading this document.
+
+While this document is intended to be useful to all module authors, it is
+particularly aimed at authors who wish to publish their modules on CPAN.
+
+The focus is on elements of style which are visible to the users of a 
+module, rather than those parts which are only seen by the module's 
+developers.  However, many of the guidelines presented in this document
+can be extrapolated and applied successfully to a module's internals.
+
+This document differs from L<perlnewmod> in that it is a style guide
+rather than a tutorial on creating CPAN modules.  It provides a
+checklist against which modules can be compared to determine whether
+they conform to best practice, without necessarily describing in detail
+how to achieve this.  
+
+All the advice contained in this document has been gleaned from
+extensive conversations with experienced CPAN authors and users.  Every
+piece of advice given here is the result of previous mistakes.  This
+information is here to help you avoid the same mistakes and the extra
+work that would inevitably be required to fix them.
+
+The first section of this document provides an itemized checklist; 
+subsequent sections provide a more detailed discussion of the items on 
+the list.  The final section, "Common Pitfalls", describes some of the 
+most popular mistakes made by CPAN authors.
+
+=head1 QUICK CHECKLIST
+
+For more detail on each item in this checklist, see below.
+
+=head2 Before you start
+
+=over 4
+
+=item *
+
+Don't re-invent the wheel
+
+=item *
+
+Patch, extend or subclass an existing module where possible
+
+=item *
+
+Do one thing and do it well
+
+=item *
+
+Choose an appropriate name
+
+=back
+
+=head2 The API
+
+=over 4
+
+=item *
+
+API should be understandable by the average programmer
+
+=item *
+
+Simple methods for simple tasks
+
+=item *
+
+Separate functionality from output
+
+=item *
+
+Consistent naming of subroutines or methods
+
+=item *
+
+Use named parameters (a hash or hashref) when there are more than two
+parameters
+
+=back
+
+=head2 Stability
+
+=over 4
+
+=item *
+
+Ensure your module works under C<use strict> and C<-w>
+
+=item *
+
+Stable modules should maintain backwards compatibility
+
+=back
+
+=head2 Documentation
+
+=over 4
+
+=item *
+
+Write documentation in POD
+
+=item *
+
+Document purpose, scope and target applications
+
+=item *
+
+Document each publically accessible method or subroutine, including params and return values
+
+=item *
+
+Give examples of use in your documentation
+
+=item *
+
+Provide a README file and perhaps also release notes, changelog, etc
+
+=item *
+
+Provide links to further information (URL, email)
+
+=back
+
+=head2 Release considerations
+
+=over 4
+
+=item *
+
+Specify pre-requisites in Makefile.PL or Build.PL
+
+=item *
+
+Specify Perl version requirements with C<use>
+
+=item *
+
+Include tests with your module
+
+=item *
+
+Choose a sensible and consistent version numbering scheme (X.YY is the common Perl module numbering scheme)
+
+=item *
+
+Increment the version number for every change, no matter how small
+
+=item *
+
+Package the module using "make dist"
+
+=item *
+
+Choose an appropriate license (GPL/Artistic is a good default)
+
+=back
+
+=head1 BEFORE YOU START WRITING A MODULE
+
+Try not to launch headlong into developing your module without spending
+some time thinking first.  A little forethought may save you a vast
+amount of effort later on.
+
+=head2 Has it been done before?
+
+You may not even need to write the module.  Check whether it's already 
+been done in Perl, and avoid re-inventing the wheel unless you have a 
+good reason.
+
+Good places to look for pre-existing modules include
+http://search.cpan.org/ and asking on modules@perl.org
+
+If an existing module B<almost> does what you want, consider writing a
+patch, writing a subclass, or otherwise extending the existing module
+rather than rewriting it.
+
+=head2 Do one thing and do it well
+
+At the risk of stating the obvious, modules are intended to be modular.
+A Perl developer should be able to use modules to put together the
+building blocks of their application.  However, it's important that the
+blocks are the right shape, and that the developer shouldn't have to use
+a big block when all they need is a small one.
+
+Your module should have a clearly defined scope which is no longer than
+a single sentence.  Can your module be broken down into a family of
+related modules?
+
+Bad example:
+
+"FooBar.pm provides an implementation of the FOO protocol and the
+related BAR standard."
+
+Good example:
+
+"Foo.pm provides an implementation of the FOO protocol.  Bar.pm
+implements the related BAR protocol."
+
+This means that if a developer only needs a module for the BAR standard,
+they should not be forced to install libraries for FOO as well.
+
+=head2 What's in a name?
+
+Make sure you choose an appropriate name for your module early on.  This
+will help people find and remember your module, and make programming
+with your module more intuitive.
+
+When naming your module, consider the following:
+
+=over 4
+
+=item *
+
+Be descriptive (i.e. accurately describes the purpose of the module).
+
+=item * 
+
+Be consistent with existing modules.
+
+=item *
+
+Reflect the functionality of the module, not the implementation.
+
+=item *
+
+Avoid starting a new top-level hierarchy, especially if a suitable
+hierarchy already exists under which you could place your module.
+
+=back
+
+You should contact modules@perl.org to ask them about your module name
+before publishing your module.  You should also try to ask people who 
+are already familiar with the module's application domain and the CPAN
+naming system.  Authors of similar modules, or modules with similar
+names, may be a good place to start.
+
+=head1 DESIGNING AND WRITING YOUR MODULE
+
+Considerations for module design and coding:
+
+=head2 To OO or not to OO?
+
+Your module may be object oriented (OO) or not, or it may have both kinds 
+of interfaces available.  There are pros and cons of each technique, which 
+should be considered when you design your API.
+
+According to Damian Conway, you should consider using OO:
+
+=over 4
+
+=item * 
+
+When the system is large or likely to become so
+
+=item * 
+
+When the data is aggregated in obvious structures that will become objects 
+
+=item * 
+
+When the types of data form a natural hierarchy that can make use of inheritance
+
+=item *
+
+When operations on data vary according to data type (making
+polymorphic invocation of methods feasible)
+
+=item *
+
+When it is likely that new data types may be later introduced
+into the system, and will need to be handled by existing code
+
+=item *
+
+When interactions between data are best represented by
+overloaded operators
+
+=item *
+
+When the implementation of system components is likely to
+change over time (and hence should be encapsulated)
+
+=item *
+
+When the system design is itself object-oriented
+
+=item *
+
+When large amounts of client code will use the software (and
+should be insulated from changes in its implementation)
+
+=item *
+
+When many separate operations will need to be applied to the
+same set of data
+
+=back
+
+Think carefully about whether OO is appropriate for your module.
+Gratuitous object orientation results in complex APIs which are
+difficult for the average module user to understand or use.
+
+=head2 Designing your API
+
+Your interfaces should be understandable by an average Perl programmer.  
+The following guidelines may help you judge whether your API is
+sufficiently straightforward:
+
+=over 4
+
+=item Write simple routines to do simple things.
+
+It's better to have numerous simple routines than a few monolithic ones.
+If your routine changes its behaviour significantly based on its
+arguments, it's a sign that you should have two (or more) separate
+routines.
+
+=item Separate functionality from output.  
+
+Return your results in the most generic form possible and allow the user 
+to choose how to use them.  The most generic form possible is usually a
+Perl data structure which can then be used to generate a text report,
+HTML, XML, a database query, or whatever else your users require.
+
+If your routine iterates through some kind of list (such as a list of
+files, or records in a database) you may consider providing a callback
+so that users can manipulate each element of the list in turn.
+File::Find provides an example of this with its 
+C<find(\&wanted, $dir)> syntax.
+
+=item Provide sensible shortcuts and defaults.
+
+Don't require every module user to jump through the same hoops to achieve a
+simple result.  You can always include optional parameters or routines for 
+more complex or non-standard behaviour.  If most of your users have to
+type a few almost identical lines of code when they start using your
+module, it's a sign that you should have made that behaviour a default.
+Another good indicator that you should use defaults is if most of your 
+users call your routines with the same arguments.
+
+=item Naming conventions
+
+Your naming should be consistent.  For instance, it's better to have:
+
+	display_day();
+	display_week();
+	display_year();
+
+than
+
+	display_day();
+	week_display();
+	show_year();
+
+This applies equally to method names, parameter names, and anything else
+which is visible to the user (and most things that aren't!)
+
+=item Parameter passing
+
+Use named parameters. It's easier to use a hash like this:
+
+    $obj->do_something(
+	    name => "wibble",
+	    type => "text",
+	    size => 1024,
+    );
+
+... than to have a long list of unnamed parameters like this:
+
+    $obj->do_something("wibble", "text", 1024);
+
+While the list of arguments might work fine for one, two or even three
+arguments, any more arguments become hard for the module user to
+remember, and hard for the module author to manage.  If you want to add
+a new parameter you will have to add it to the end of the list for
+backward compatibility, and this will probably make your list order
+unintuitive.  Also, if many elements may be undefined you may see the
+following unattractive method calls:
+
+    $obj->do_something(undef, undef, undef, undef, undef, undef, 1024);
+
+Provide sensible defaults for parameters which have them.  Don't make
+your users specify parameters which will almost always be the same.
+
+The issue of whether to pass the arguments in a hash or a hashref is
+largely a matter of personal style. 
+
+The use of hash keys starting with a hyphen (C<-name>) or entirely in 
+upper case (C<NAME>) is a relic of older versions of Perl in which
+ordinary lower case strings were not handled correctly by the C<=E<gt>>
+operator.  While some modules retain uppercase or hyphenated argument
+keys for historical reasons or as a matter of personal style, most new
+modules should use simple lower case keys.  Whatever you choose, be
+consistent!
+
+=back
+
+=head2 Strictness and warnings
+
+Your module should run successfully under the strict pragma and should
+run without generating any warnings.  Your module should also handle 
+taint-checking where appropriate, though this can cause difficulties in
+many cases.
+
+=head2 Backwards compatibility
+
+Modules which are "stable" should not break backwards compatibility
+without at least a long transition phase and a major change in version
+number.
+
+=head2 Error handling and messages
+
+When your module encounters an error it should do one or more of:
+
+=over 4
+
+=item *
+
+Return an undefined value.
+
+=item *
+
+set C<$Module::errstr> or similar (C<errstr> is a common name used by
+DBI and other popular modules; if you choose something else, be sure to
+document it clearly).
+
+=item *
+
+C<warn()> or C<carp()> a message to STDERR.  
+
+=item *
+
+C<croak()> only when your module absolutely cannot figure out what to
+do.  (C<croak()> is a better version of C<die()> for use within 
+modules, which reports its errors from the perspective of the caller.  
+See L<Carp> for details of C<croak()>, C<carp()> and other useful
+routines.)
+
+=item *
+
+As an alternative to the above, you may prefer to throw exceptions using 
+the Error module.
+
+=back
+
+Configurable error handling can be very useful to your users.  Consider
+offering a choice of levels for warning and debug messages, an option to
+send messages to a separate file, a way to specify an error-handling
+routine, or other such features.  Be sure to default all these options
+to the commonest use.
+
+=head1 DOCUMENTING YOUR MODULE
+
+=head2 POD
+
+Your module should include documentation aimed at Perl developers.
+You should use Perl's "plain old documentation" (POD) for your general 
+technical documentation, though you may wish to write additional
+documentation (white papers, tutorials, etc) in some other format.  
+You need to cover the following subjects:
+
+=over 4
+
+=item *
+
+A synopsis of the common uses of the module
+
+=item *
+
+The purpose, scope and target applications of your module
+
+=item *
+
+Use of each publically accessible method or subroutine, including
+parameters and return values
+
+=item *
+
+Examples of use
+
+=item *
+
+Sources of further information
+
+=item *
+
+A contact email address for the author/maintainer
+
+=back
+
+The level of detail in Perl module documentation generally goes from
+less detailed to more detailed.  Your SYNOPSIS section should contain a
+minimal example of use (perhaps as little as one line of code; skip the
+unusual use cases or anything not needed by most users); the
+DESCRIPTION should describe your module in broad terms, generally in
+just a few paragraphs; more detail of the module's routines or methods,
+lengthy code examples, or other in-depth material should be given in 
+subsequent sections.
+
+Ideally, someone who's slightly familiar with your module should be able
+to refresh their memory without hitting "page down".  As your reader
+continues through the document, they should receive a progressively
+greater amount of knowledge.
+
+The recommended order of sections in Perl module documentation is:
+
+=over 4
+
+=item * 
+
+NAME
+
+=item *
+
+SYNOPSIS
+
+=item *
+
+DESCRIPTION
+
+=item *
+
+One or more sections or subsections giving greater detail of available 
+methods and routines and any other relevant information.
+
+=item *
+
+BUGS/CAVEATS/etc
+
+=item *
+
+AUTHOR
+
+=item *
+
+SEE ALSO
+
+=item *
+
+COPYRIGHT and LICENSE
+
+=back
+
+Keep your documentation near the code it documents ("inline"
+documentation).  Include POD for a given method right above that 
+method's subroutine.  This makes it easier to keep the documentation up
+to date, and avoids having to document each piece of code twice (once in
+POD and once in comments).
+
+=head2 README, INSTALL, release notes, changelogs
+
+Your module should also include a README file describing the module and
+giving pointers to further information (website, author email).  
+
+An INSTALL file should be included, and should contain simple installation 
+instructions. When using ExtUtils::MakeMaker this will usually be:
+
+=over 4
+
+=item perl Makefile.PL
+
+=item make
+
+=item make test
+
+=item make install
+
+=back
+
+When using Module::Build, this will usually be:
+
+=over 4
+
+=item perl Build.PL
+
+=item perl Build
+
+=item perl Build test
+
+=item perl Build install
+
+=back
+
+Release notes or changelogs should be produced for each release of your
+software describing user-visible changes to your module, in terms
+relevant to the user.
+
+=head1 RELEASE CONSIDERATIONS
+
+=head2 Version numbering
+
+Version numbers should indicate at least major and minor releases, and
+possibly sub-minor releases.  A major release is one in which most of
+the functionality has changed, or in which major new functionality is
+added.  A minor release is one in which a small amount of functionality
+has been added or changed.  Sub-minor version numbers are usually used
+for changes which do not affect functionality, such as documentation
+patches.
+
+The most common CPAN version numbering scheme looks like this:
+
+    1.00, 1.10, 1.11, 1.20, 1.30, 1.31, 1.32
+
+A correct CPAN version number is a floating point number with at least 
+2 digits after the decimal. You can test whether it conforms to CPAN by 
+using
+
+    perl -MExtUtils::MakeMaker -le 'print MM->parse_version(shift)' 'Foo.pm'
+
+If you want to release a 'beta' or 'alpha' version of a module but
+don't want CPAN.pm to list it as most recent use an '_' after the
+regular version number followed by at least 2 digits, eg. 1.20_01. If
+you do this, the following idiom is recommended:
+
+  $VERSION = "1.12_01";
+  $XS_VERSION = $VERSION; # only needed if you have XS code
+  $VERSION = eval $VERSION;
+
+With that trick MakeMaker will only read the first line and thus read
+the underscore, while the perl interpreter will evaluate the $VERSION
+and convert the string into a number. Later operations that treat
+$VERSION as a number will then be able to do so without provoking a
+warning about $VERSION not being a number.
+
+Never release anything (even a one-word documentation patch) without
+incrementing the number.  Even a one-word documentation patch should
+result in a change in version at the sub-minor level.
+
+=head2 Pre-requisites
+
+Module authors should carefully consider whether to rely on other
+modules, and which modules to rely on.
+
+Most importantly, choose modules which are as stable as possible.  In
+order of preference: 
+
+=over 4
+
+=item *
+
+Core Perl modules
+
+=item *
+
+Stable CPAN modules
+
+=item *
+
+Unstable CPAN modules
+
+=item *
+
+Modules not available from CPAN
+
+=back
+
+Specify version requirements for other Perl modules in the
+pre-requisites in your Makefile.PL or Build.PL.
+
+Be sure to specify Perl version requirements both in Makefile.PL or
+Build.PL and with C<require 5.6.1> or similar. See the section on
+C<use VERSION> of L<perlfunc/require> for details.
+
+=head2 Testing
+
+All modules should be tested before distribution (using "make disttest"),
+and the tests should also be available to people installing the modules 
+(using "make test").  
+For Module::Build you would use the C<make test> equivalent C<perl Build test>.
+
+The importance of these tests is proportional to the alleged stability of a 
+module -- a module which purports to be stable or which hopes to achieve wide 
+use should adhere to as strict a testing regime as possible.
+
+Useful modules to help you write tests (with minimum impact on your 
+development process or your time) include Test::Simple, Carp::Assert 
+and Test::Inline.
+For more sophisticated test suites there are Test::More and Test::MockObject.
+
+=head2 Packaging
+
+Modules should be packaged using one of the standard packaging tools.
+Currently you have the choice between ExtUtils::MakeMaker and the
+more platform independent Module::Build, allowing modules to be installed in a
+consistent manner.
+When using ExtUtils::MakeMaker, you can use "make dist" to create your
+package. Tools exist to help you to build your module in a MakeMaker-friendly
+style. These include ExtUtils::ModuleMaker and h2xs.  See also L<perlnewmod>.
+
+=head2 Licensing
+
+Make sure that your module has a license, and that the full text of it
+is included in the distribution (unless it's a common one and the terms
+of the license don't require you to include it).
+
+If you don't know what license to use, dual licensing under the GPL
+and Artistic licenses (the same as Perl itself) is a good idea.
+See L<perlgpl> and L<perlartistic>.
+
+=head1 COMMON PITFALLS
+
+=head2 Reinventing the wheel
+
+There are certain application spaces which are already very, very well
+served by CPAN.  One example is templating systems, another is date and
+time modules, and there are many more.  While it is a rite of passage to
+write your own version of these things, please consider carefully
+whether the Perl world really needs you to publish it.
+
+=head2 Trying to do too much
+
+Your module will be part of a developer's toolkit.  It will not, in
+itself, form the B<entire> toolkit.  It's tempting to add extra features
+until your code is a monolithic system rather than a set of modular
+building blocks.
+
+=head2 Inappropriate documentation
+
+Don't fall into the trap of writing for the wrong audience.  Your
+primary audience is a reasonably experienced developer with at least 
+a moderate understanding of your module's application domain, who's just 
+downloaded your module and wants to start using it as quickly as possible.
+
+Tutorials, end-user documentation, research papers, FAQs etc are not 
+appropriate in a module's main documentation.  If you really want to 
+write these, include them as sub-documents such as C<My::Module::Tutorial> or
+C<My::Module::FAQ> and provide a link in the SEE ALSO section of the
+main documentation.  
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<perlstyle>
+
+General Perl style guide
+
+=item L<perlnewmod>
+
+How to create a new module
+
+=item L<perlpod>
+
+POD documentation
+
+=item L<podchecker>
+
+Verifies your POD's correctness
+
+=item Packaging Tools
+
+L<ExtUtils::MakeMaker>, L<Module::Build>
+
+=item Testing tools
+
+L<Test::Simple>, L<Test::Inline>, L<Carp::Assert>, L<Test::More>, L<Test::MockObject>
+
+=item http://pause.perl.org/
+
+Perl Authors Upload Server.  Contains links to information for module
+authors.
+
+=item Any good book on software engineering
+
+=back
+
+=head1 AUTHOR
+
+Kirrily "Skud" Robert <skud@cpan.org>
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmpeix.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmpeix.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlmpeix.pod	(revision 14489)
@@ -0,0 +1,730 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.mpeix - Perl/iX for HP e3000 MPE
+
+=head1 SYNOPSIS
+
+   http://www.bixby.org/mark/perlix.html
+   http://jazz.external.hp.com/src/hp_freeware/perl/
+   Perl language for MPE
+   Last updated January 12, 2006 @ 2100 UTC
+
+
+=head1 NOTE
+
+This is a podified version of the above-mentioned web page,
+podified by Jarkko Hietaniemi 2001-Jan-01.
+
+=head1 Binary distribution from HP
+
+The simplest way to obtain Perl for the MPE/iX is to go either of
+these URLs and follow the instructions within.
+
+http://jazz.external.hp.com/src/hp_freeware/perl/
+http://www.bixby.org/mark/perlix.html
+
+Use which ever one is more recent.
+
+
+=head1 What's New in Perl for MPE/iX
+
+January 12, 2006
+
+=over 4
+
+=item *
+
+Updated for perl-5.8.8 and perl-5.9.3 by Ken Hirsch.
+
+Simplified the build process by using the MPEAUTOCONF
+functionality in Mark Klein's ld.
+
+If you build this from scratch, make sure you have a version
+of ld which supports it.  In the shell, type
+
+  ld --help
+    and look for AUTOCONF or MPEAUTOCONF near the bottom
+
+  or do this:
+  ld --help 2>&1 | grep AUTOCONF
+
+If you see don't see AUTOCONF or MPEAUTOCONF, make sure you get a new
+version.
+
+You also do not have to use mpeix/relink after building, so the
+recommend sequence is:
+
+  ./Configure -de
+
+      # or ./Configure -de -Dusedevel 
+      # if you're building a development version
+
+  make
+  make test
+     # if you run this in a job, do "make test_notty"
+
+  make install
+
+Be prepared for a wait. These take much longer on MPE/iX than on a Unix
+system, because of a slow forking, mostly.  On a lightly-loaded HP3000
+Series 979 running MPE/iX 7.5:
+
+    Configure: 1 hour
+    make:      1 hour 15 minutes
+    make test  1 hour 45 minutes
+
+Various socket problems were fixed in mpeix.c.
+
+Mark Klein provided a fixed sigsetjmp (that works with dynamic
+libraries) in mpeix_setjmp.c
+
+=item *
+
+June 1, 2000
+
+=over 4
+
+=item *
+
+Rebuilt to be compatible with mod_perl.  If you plan on using
+mod_perl, you MUST download and install this version of Perl/iX!
+
+=item *
+
+uselargefiles="undef": not available in MPE for POSIX files yet.
+
+=item *
+
+Now bundled with various add-on packages:
+
+=over 8
+
+=item *
+
+libnet (as seen on CPAN)
+
+=item *
+
+libwww-perl (LWP) which lets Perl programs behave like web browsers:
+
+    1. #!/PERL/PUB/perl
+    2. use LWP::Simple;
+    3. $doc = get('http://www.bixby.org/mark/perlix.html');  # reads the
+       web page into variable $doc
+
+(http://www.bixby.org/mark/perlix.html)
+
+=item *
+
+mod_perl (just the perl portion; the actual DSO will be released
+soon with Apache/iX 1.3.12 from bixby.org).  This module allows you to
+write high performance persistent Perl CGI scripts and all sorts of
+cool things. (http://perl.apache.org/)
+
+and much much more hiding under /PERL/PUB/.cpan/
+
+=item *
+
+The CPAN module now works for automatic downloading and
+installing of add-on packages:
+
+    1. export FTP_PASSIVE=1
+    2. perl -MCPAN -e shell
+    3. Ignore any terminal I/O related complaints!
+
+(http://theoryx5.uwinnipeg.ca/CPAN/data/perl/CPAN.html)
+
+=back
+
+=back
+
+May 20, 2000
+
+=over 4
+
+=item *
+
+Updated to version 5.6.0.  Builds straight out of the box on MPE/iX.
+
+=item *
+
+Perl's getpwnam() function which had regressed to being
+unimplemented on MPE is now implemented once again.
+
+=back
+
+September 17, 1999
+
+=over 4
+
+=item *
+
+Migrated from cccd.edu to bixby.org.
+
+=back
+
+=head1 Welcome to Perl/iX
+
+This is the official home page for the HP e3000 MPE/iX
+( http://www.hp.com/go/e3000 ) port of the Perl scripting
+language ( http://www.perl.com/ ) which gives you all of the power of C,
+awk, sed, and sh in a single language. Check here for the latest news,
+implemented functionality, known bugs, to-do list, etc. Status reports
+about major milestones will also be posted to the HP3000-L mailing list
+( http://www.lsoft.com/scripts/wl.exe?SL1=HP3000-L&H=RAVEN.UTC.EDU ) and
+its associated gatewayed newsgroup comp.sys.hp.mpe.
+
+I'm doing this port because I can't live without Perl on the Unix
+machines that I administer, and I want to have the same power
+available to me on MPE.
+
+Please send your comments, questions, and bug reports directly to me,
+Mark Bixby ( http://www.bixby.org/mark/ ). Or just post them to HP3000-L.
+
+The platform I'm using to do this port is an HP 3000 957RX running
+MPE/iX 6.0 and using the GNU gcc C compiler
+( http://jazz.external.hp.com/src/gnu/gnuframe.html ).
+
+The combined porting wisdom from all of my ports can be found in my
+MPE/iX Porting Guide (http://www.bixby.org/mark/porting.html).
+
+IMPORTANT NOTICE: Yes, I do work for the HP CSY R&D lab, but ALL of
+the software you download from bixby.org is my personal freeware that
+is NOT supported by HP.
+
+=head1 System Requirements for Perl/iX
+
+=over 4
+
+=item *
+
+MPE/iX 5.5 or later. This version of Perl/iX does NOT run on
+MPE/iX 5.0 or earlier, nor does it run on "classic" MPE/V machines.
+
+=item *
+
+If you wish to recompile Perl, you must install both GNUCORE and
+GNUGCC from jazz (http://jazz.external.hp.com/src/gnu/gnuframe.html).
+
+=item *
+
+Perl/iX will be happier on MPE/iX 5.5 if you install the MPEKX40B
+extended POSIX filename characters patch, but this is optional.
+
+=item *
+
+Patch LBCJXT6A is required on MPE/iX 5.5 machines in order to
+prevent Perl/iX from dying with an unresolved external reference
+to _getenv_libc.
+
+=item *
+
+If you will be compiling Perl/iX yourself, you will also need
+Syslog/iX ( http://www.bixby.org/mark/syslogix.html ) and the
+/BIND/PUB/include and /BIND/PUB/lib portions of BIND/iX
+( http://www.bixby.org/mark/bindix.html ).
+
+=back
+
+=head1 How to Obtain Perl/iX
+
+=over 4
+
+=item 1.
+
+Download Perl using either FTP.ARPA.SYS or some other client
+
+=item 2.
+
+Extract the installation script
+
+=item 3.
+
+Edit the installation script
+
+=item 4.
+
+Run the installation script
+
+=item 5.
+
+Convert your *.a system archive libraries to *.sl shared libraries
+
+=back
+
+Download Perl using FTP.ARPA.SYS from your HP 3000 (the preferred
+method).....
+
+    :HELLO MANAGER.SYS
+    :XEQ FTP.ARPA.SYS
+    open ftp.bixby.org
+    anonymous
+    your@email.address
+    bytestream
+    cd /pub/mpe
+    get perl-5.6.0-mpe.tar.Z /tmp/perl.tar.Z;disc=2147483647
+    exit
+
+.....Or download using some other generic web or ftp client (the alternate
+method)
+
+Download the following files (make sure that you use "binary mode" or
+whatever client feature that is 8-bit clean):
+
+=over 4
+
+=item *
+
+Perl from
+
+    http://www.bixby.org/ftp/pub/mpe/perl-5.6.0-mpe.tar.Z
+
+or
+
+    ftp://ftp.bixby.org/pub/mpe/perl-5.6.0-mpe.tar.Z
+
+=item *
+
+Upload those files to your HP 3000 in an 8-bit clean bytestream manner to:
+
+    /tmp/perl.tar.Z
+
+=item *
+
+Then extract the installation script (after both download methods)
+
+    :CHDIR /tmp
+    :XEQ TAR.HPBIN.SYS 'xvfopz /tmp/perl.tar.Z INSTALL'
+
+=item *
+
+Edit the installation script
+
+Examine the accounting structure creation commands and modify if
+necessary (adding additional capabilities, choosing a non-system
+volume set, etc).
+
+    :XEQ VI.HPBIN.SYS /tmp/INSTALL
+
+=item *
+
+Run the installation script.
+
+The accounting structure will be created and then all files will be
+extracted from the archive.
+
+    :XEQ SH.HPBIN.SYS /tmp/INSTALL
+
+=item *
+
+Convert your *.a system archive libraries to *.sl shared libraries
+
+You only have to do this ONCE on your MPE/iX 5.5 machine in order to
+convert /lib/lib*.a and /usr/lib/lib*.a libraries to their *.sl
+equivalents.  This step should not be necessary on MPE/iX 6.0 or later
+machines because the 6.0 or later update process does it for you.
+
+    :XEQ SH.HPBIN.SYS /PERL/PUB/LIBSHP3K
+
+=back
+
+=head1 Perl/iX Distribution Contents Highlights
+
+=over 4
+
+=item README
+
+The file you're reading now.
+
+=item INSTALL
+
+Perl/iX Installation script.
+
+=item LIBSHP3K
+
+Script to convert *.a system archive libraries to *.sl shared libraries.
+
+=item PERL
+
+Perl NMPRG executable.  A version-numbered backup copy also
+exists.  You might wish to "ln -s /PERL/PUB/PERL /usr/local/bin/perl".
+
+=item .cpan/
+
+Much add-on source code downloaded with the CPAN module.
+
+=item lib/
+
+Perl libraries, both core and add-on.
+
+=item man/
+
+Perl man page documentation.
+
+=item public_html/feedback.cgi
+
+Sample feedback CGI form written in Perl.
+
+=item src/perl-5.6.0-mpe
+
+Source code.
+
+=back
+
+=head1 How to Compile Perl/iX
+
+=over 4
+
+=item 1.
+
+cd src/perl-5.6.0-mpe
+
+=item 2.
+
+Read the INSTALL file for the official instructions
+
+=item 3.
+
+./Configure -d
+
+=item  4.
+
+make
+
+=item 5.
+
+./mpeix/relink
+
+=item  6.
+
+make test (expect approximately 15 out of 11306 subtests to fail,
+mostly due to MPE not supporting hard links, UDP socket problems,
+and handling exit() return codes improperly)
+
+=item 7.
+
+make install
+
+=item 8.
+
+Optionally create symbolic links that point to the Perl
+executable, i.e. ln -s /PERL/PUB/PERL /usr/local/bin/perl
+
+=back
+
+The summary test results from "cd t; ./perl -I../lib harness":
+
+  Failed Test  Status Wstat Total Fail  Failed  List of failed
+  ---------------------------------------------------------------------------
+  io/fs.t                      29    8  27.59%  2-5, 7-9, 11
+  io/openpid.t                 10    1  10.00%  7
+  lib/io_sock.t                14    1   7.14%  13
+  lib/io_udp.t                  7    2  28.57%  3, 5
+  lib/posix.t                  27    1   3.70%  12
+  op/lex_assign.t             187    1   0.53%  13
+  op/stat.t                    58    1   1.72%  3
+  15 tests and 94 subtests skipped.
+  Failed 7/236 test scripts, 97.03% okay. 15/11306 subtests failed, 99.87% okay.
+
+=head1 Getting Started with Perl/iX
+
+Create your Perl script files with "#!/PERL/PUB/perl" (or an
+equivalent symbolic link) as the first line.  Use the chmod command to
+make sure that your script has execute permission. Run your script!
+
+Be sure to take a look at the CPAN module list
+( http://www.cpan.org/CPAN.html ). A wide variety of free Perl software
+is available.  You can automatically download these packages by using
+the CPAN module ( http://theoryx5.uwinnipeg.ca/CPAN/data/perl/CPAN.html ).
+
+=head1 MPE/iX Implementation Considerations
+
+There some minor functionality issues to be aware of when comparing
+Perl for Unix (Perl/UX) to Perl/iX:
+
+=over 4
+
+=item *
+
+MPE gcc/ld doesn't properly support linking NMPRG executables against
+NMXL dynamic libraries, so you must manually run mpeix/relink after
+each re-build of Perl.
+
+=item *
+
+Perl/iX File::Copy will use MPE's /bin/cp command to copy files by
+name in order to preserve file attributes like file code.
+
+=item *
+
+MPE (and thus Perl/iX) lacks support for setgrent(), endgrent(),
+setpwent(), endpwent().
+
+=item *
+
+MPE (and thus Perl/iX) lacks support for hard links.
+
+=item *
+
+MPE requires GETPRIVMODE() in order to bind() to ports less than 1024.
+Perl/iX will call GETPRIVMODE() automatically on your behalf if you
+attempt to bind() to these low-numbered ports.  Note that the Perl/iX
+executable and the PERL account do not normally have CAP=PM, so if you
+will be bind()-ing to these privileged ports, you will manually need
+to add PM capability as appropriate.
+
+=item *
+
+MPE requires that you bind() to an IP address of zero.  Perl/iX
+automatically replaces the IP address that you pass to bind() with
+a zero.
+
+=item *
+
+MPE requires GETPRIVMODE() in order to setuid().  There are too many
+calls to setuid() within Perl/iX, so I have not attempted an automatic
+GETPRIVMODE() solution similar to bind().
+
+=back
+
+=head1 Known Perl/iX Bugs Under Investigation
+
+None.
+
+=head1 Perl/iX To-Do List
+
+=over 4
+
+=item *
+
+Make setuid()/setgid() support work.
+
+=item *
+
+Make sure that fcntl() against a socket descriptor is redirected to sfcntl().
+
+=item *
+
+Add support for Berkeley DB once I've finished porting Berkeley DB.
+
+=item *
+
+Write an MPE XS extension library containing miscellaneous important
+MPE functions like GETPRIVMODE(), GETUSERMODE(), and sfcntl().
+
+=back
+
+=head1 Perl/iX Change History
+
+May 6, 1999
+
+=over 4
+
+=item *
+
+Patch LBCJXT6A is required on MPE/iX 5.5 machines in order to prevent
+Perl/iX from dying with an unresolved external reference to _getenv_libc.
+
+=back
+
+April 7, 1999
+
+=over 4
+
+=item *
+
+Updated to version 5.005_03.
+
+=item *
+
+The official source distribution once again compiles "straight out
+of the box" for MPE.
+
+=item *
+
+The current incarnation of the 5.5 POSIX filename extended
+characters patch is now MPEKX40B.
+
+=item *
+
+The LIBSHP3K *.a -> *.sl library conversion script is now included
+as /PERL/PUB/LIBSHP3K.
+
+=back
+
+November 20, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005_02.
+
+=item *
+
+Fixed a DynaLoader bug that was unable to load symbols from relative
+path name libraries.
+
+=item *
+
+Fixed a .xs compilation bug where the mpeixish.sh include file wasn't
+being installed into the proper directory.
+
+=item *
+
+All bugfixes will be submitted back to the official Perl developers.
+
+=item *
+
+The current incarnation of the POSIX filename extended characters
+patch is now MPEKXJ3A.
+
+=back
+
+August 14, 1998
+
+=over 4
+
+=item *
+
+The previous POSIX filename extended characters patch MPEKX44C has
+been superseded by MPEKXB5A.
+
+=back
+
+August 7, 1998
+
+=over 4
+
+=item *
+
+The previous POSIX filename extended characters patch MPEKX76A has
+been superseded by MPEKX44C.
+
+=back
+
+July 28, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005_01.
+
+=back
+
+July 23, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005 (production release).  The public
+freeware sources are now 100% MPE-ready "straight out of the box".
+
+=back
+
+July 17, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005b1 (public beta release).  The public
+freeware sources are now 99.9% MPE-ready.  By installing and
+testing this beta on your own HP3000, you will be helping to
+insure that the final release of 5.005 will be 100% MPE-ready and
+100% bug free.
+
+=item *
+
+My MPE binary release is now extracted using my standard INSTALL script.
+
+=back
+
+July 15, 1998
+
+=over 4
+
+=item *
+
+Changed startperl to #!/PERL/PUB/perl so that Perl will recognize
+scripts more easily and efficiently.
+
+=back
+
+July 8, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.004_70 (internal developer release) which is now
+MPE-ready.  The next public freeware release of Perl should compile
+"straight out of the box" on MPE.  Note that this version of Perl/iX
+was strictly internal to me and never publicly released.  Note that
+[21]BIND/iX is now required (well, the include files and libbind.a) if
+you wish to compile Perl/iX.
+
+=back
+
+November 6, 1997
+
+=over 4
+
+=item *
+
+Updated to version 5.004_04.  No changes in MPE-specific functionality.
+
+=back
+
+October 16, 1997
+
+=over 4
+
+=item *
+
+Added Demos section to the Perl/iX home page so you can see some
+sample Perl applications running on my 3000.
+
+=back
+
+October 3, 1997
+
+=over 4
+
+=item *
+
+Added System Requirements section to the Perl/iX home page just so the
+prerequisites stand out more. Various other home page tweaks.
+
+=back
+
+October 2, 1997
+
+=over 4
+
+=item *
+
+Initial public release.
+
+=back
+
+September 1997
+
+=over 4
+
+=item *
+
+Porting begins.
+
+=back
+
+=head1 AUTHOR
+
+Mark Bixby, http://www.bixby.org/mark/
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlnetware.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlnetware.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlnetware.pod	(revision 14489)
@@ -0,0 +1,213 @@
+If you read this file _as_is_, just ignore the funny characters you
+see.  It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+perlnetware - Perl for NetWare
+
+=head1 DESCRIPTION
+
+This file gives instructions for building Perl 5.7 and above, and also 
+Perl modules for NetWare. Before you start, you may want to read the
+README file found in the top level directory into which the Perl source
+code distribution was extracted. Make sure you read and understand
+the terms under which the software is being distributed.
+
+=head1 BUILD
+
+This section describes the steps to be performed to build a Perl NLM
+and other associated NLMs.
+
+=head2 Tools & SDK
+
+The build requires CodeWarrior compiler and linker.  In addition,
+the "NetWare SDK", "NLM & NetWare Libraries for C" and
+"NetWare Server Protocol Libraries for C", all available at
+L<http://developer.novell.com/ndk/>, are also required.
+Microsoft Visual C++ version 4.2 or later is also required.
+
+=head2 Setup
+
+The build process is dependent on the location of the NetWare SDK.
+Once the Tools & SDK are installed, the build environment has to
+be setup.  The following batch files setup the environment.
+
+=over 4
+
+=item SetNWBld.bat
+
+The Execution of this file takes 2 parameters as input. The first
+being the NetWare SDK path, second being the path for CodeWarrior
+Compiler & tools. Execution of this file sets these paths and also
+sets the build type to Release by default.
+
+=item Buildtype.bat
+
+This is used to set the build type to debug or release. Change the
+build type only after executing SetNWBld.bat
+
+=item *
+
+Example:
+  1. Typing "buildtype d on" at the command prompt causes the buildtype
+     to be set to Debug type with D2 flag set. 
+  2. Typing "buildtype d off" or "buildtype d" at the command prompt causes
+     the buildtype to be set to Debug type with D1 flag set. 
+  2. Typing "buildtype r" at the command prompt sets it to Release Build type.
+
+=back
+
+=head2 Make
+
+The make process runs only under WinNT shell.  The NetWare makefile is
+located under the NetWare folder.  This makes use of miniperl.exe to
+run some of the Perl scripts. To create miniperl.exe, first set the
+required paths for Visual c++ compilier (specify vcvars32 location) at
+the command prompt.  Then run nmake from win32 folder through WinNT
+command prompt.  The build process can be stopped after miniperl.exe
+is created. Then run nmake from NetWare folder through WinNT command
+prompt.
+
+Currently the following two build types are tested on NetWare:
+
+=over 4
+
+=item *
+
+USE_MULTI, USE_ITHREADS & USE_IMP_SYS defined
+
+=item *
+
+USE_MULTI & USE_IMP_SYS defined and USE_ITHREADS not defined
+
+=back
+
+=head2 Interpreter
+
+Once miniperl.exe creation is over, run nmake from the NetWare folder.
+This will build the Perl interpreter for NetWare as I<perl.nlm>.
+This is copied under the I<Release> folder if you are doing
+a release build, else will be copied under I<Debug> folder for debug builds.
+
+=head2 Extensions
+
+The make process also creates the Perl extensions as I<<Extension>.nlm>
+
+=head1 INSTALL
+
+To install NetWare Perl onto a NetWare server, first map the Sys
+volume of a NetWare server to I<i:>. This is because the makefile by
+default sets the drive letter to I<i:>.  Type I<nmake nwinstall> from
+NetWare folder on a WinNT command prompt.  This will copy the binaries
+and module files onto the NetWare server under I<sys:\Perl>
+folder. The Perl interpreter, I<perl.nlm>, is copied under
+I<sys:\perl\system> folder.  Copy this to I<sys:\system> folder.
+
+Example: At the command prompt Type "nmake nwinstall".
+          This will install NetWare Perl on the NetWare Server.
+          Similiarly if you type "nmake install",
+          This will cause the binaries to be installed on the local machine.
+          (Typically under the c:\perl folder)
+
+=head1 BUILD NEW EXTENSIONS
+
+To build extensions other than standard extensions, NetWare Perl has
+to be installed on Windows along with Windows Perl. The Perl for
+Windows can be either downloaded from the CPAN site and built using
+the sources, or the binaries can be directly downloaded from the
+ActiveState site.  Installation can be done by invoking I<nmake
+install> from the NetWare folder on a WinNT command prompt after
+building NetWare Perl by following steps given above.  This will copy
+all the *.pm files and other required files.  Documentation files are
+not copied.  Thus one must first install Windows Perl, Then install
+NetWare Perl.
+
+Once this is done, do the following to build any extension:
+
+=over 4
+
+=item *
+
+Change to the extension directory where its source files are present.
+
+=item *
+
+Run the following command at the command prompt:
+
+    perl -II<path to NetWare lib dir> -II<path to lib> Makefile.pl
+
+Example:
+
+    perl -Ic:/perl/5.6.1/lib/NetWare-x86-multi-thread -Ic:\perl\5.6.1\lib MakeFile.pl
+
+or
+
+    perl -Ic:/perl/5.8.0/lib/NetWare-x86-multi-thread -Ic:\perl\5.8.0\lib MakeFile.pl
+
+=item *
+
+nmake
+
+=item *
+
+nmake install
+
+Install will copy the files into the Windows machine where NetWare
+Perl is installed and these files may have to be copied to the NetWare
+server manually. Alternatively, pass I<INSTALLSITELIB=i:\perl\lib> as
+an input to makefile.pl above. Here I<i:> is the mapped drive to the
+sys: volume of the server where Perl on NetWare is installed. Now
+typing I<nmake install>, will copy the files onto the NetWare server.
+
+Example: You can execute the following on the command prompt.
+
+          perl -Ic:/perl/5.6.1/lib/NetWare-x86-multi-thread -Ic:\perl\5.6.1\lib MakeFile.pl
+          INSTALLSITELIB=i:\perl\lib
+
+or
+
+          perl -Ic:/perl/5.8.0/lib/NetWare-x86-multi-thread -Ic:\perl\5.8.0\lib MakeFile.pl
+          INSTALLSITELIB=i:\perl\lib
+
+=item * 
+
+Note: Some modules downloaded from CPAN may require NetWare related
+API in order to build on NetWare.  Other modules may however build
+smoothly with or without minor changes depending on the type of
+module.
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+The makefile for Win32 is used as a reference to create the makefile
+for NetWare.  Also, the make process for NetWare port uses
+miniperl.exe to run scripts during the make and installation process.
+
+=head1 AUTHORS
+
+Anantha Kesari H Y (hyanantha@novell.com)
+Aditya C (caditya@novell.com)
+
+=head1 DATE
+
+=over 4
+
+=item *
+
+Created - 18 Jan 2001
+
+=item *
+
+Modified - 25 June 2001
+
+=item *
+
+Modified - 13 July 2001
+
+=item *
+
+Modified - 28 May 2002
+
+=back
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlnewmod.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlnewmod.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlnewmod.pod	(revision 14489)
@@ -0,0 +1,280 @@
+=head1 NAME
+
+perlnewmod - preparing a new module for distribution
+
+=head1 DESCRIPTION
+
+This document gives you some suggestions about how to go about writing
+Perl modules, preparing them for distribution, and making them available
+via CPAN.
+
+One of the things that makes Perl really powerful is the fact that Perl
+hackers tend to want to share the solutions to problems they've faced,
+so you and I don't have to battle with the same problem again.
+
+The main way they do this is by abstracting the solution into a Perl
+module. If you don't know what one of these is, the rest of this
+document isn't going to be much use to you. You're also missing out on
+an awful lot of useful code; consider having a look at L<perlmod>,
+L<perlmodlib> and L<perlmodinstall> before coming back here.
+
+When you've found that there isn't a module available for what you're
+trying to do, and you've had to write the code yourself, consider
+packaging up the solution into a module and uploading it to CPAN so that
+others can benefit.
+
+=head2 Warning
+
+We're going to primarily concentrate on Perl-only modules here, rather
+than XS modules. XS modules serve a rather different purpose, and
+you should consider different things before distributing them - the
+popularity of the library you are gluing, the portability to other
+operating systems, and so on. However, the notes on preparing the Perl
+side of the module and packaging and distributing it will apply equally
+well to an XS module as a pure-Perl one.
+
+=head2 What should I make into a module?
+
+You should make a module out of any code that you think is going to be
+useful to others. Anything that's likely to fill a hole in the communal
+library and which someone else can slot directly into their program. Any
+part of your code which you can isolate and extract and plug into
+something else is a likely candidate.
+
+Let's take an example. Suppose you're reading in data from a local
+format into a hash-of-hashes in Perl, turning that into a tree, walking
+the tree and then piping each node to an Acme Transmogrifier Server.
+
+Now, quite a few people have the Acme Transmogrifier, and you've had to
+write something to talk the protocol from scratch - you'd almost
+certainly want to make that into a module. The level at which you pitch
+it is up to you: you might want protocol-level modules analogous to
+L<Net::SMTP|Net::SMTP> which then talk to higher level modules analogous
+to L<Mail::Send|Mail::Send>. The choice is yours, but you do want to get
+a module out for that server protocol.
+
+Nobody else on the planet is going to talk your local data format, so we
+can ignore that. But what about the thing in the middle? Building tree
+structures from Perl variables and then traversing them is a nice,
+general problem, and if nobody's already written a module that does
+that, you might want to modularise that code too.
+
+So hopefully you've now got a few ideas about what's good to modularise.
+Let's now see how it's done.
+
+=head2 Step-by-step: Preparing the ground
+
+Before we even start scraping out the code, there are a few things we'll
+want to do in advance.
+
+=over 3
+
+=item Look around
+
+Dig into a bunch of modules to see how they're written. I'd suggest
+starting with L<Text::Tabs|Text::Tabs>, since it's in the standard
+library and is nice and simple, and then looking at something a little
+more complex like L<File::Copy|File::Copy>.  For object oriented
+code, C<WWW::Mechanize> or the C<Email::*> modules provide some good
+examples.
+
+These should give you an overall feel for how modules are laid out and
+written.
+
+=item Check it's new
+
+There are a lot of modules on CPAN, and it's easy to miss one that's
+similar to what you're planning on contributing. Have a good plough
+through the L<http://search.cpan.org> and make sure you're not the one
+reinventing the wheel!
+
+=item Discuss the need
+
+You might love it. You might feel that everyone else needs it. But there
+might not actually be any real demand for it out there. If you're unsure
+about the demand your module will have, consider sending out feelers
+on the C<comp.lang.perl.modules> newsgroup, or as a last resort, ask the
+modules list at C<modules@perl.org>. Remember that this is a closed list
+with a very long turn-around time - be prepared to wait a good while for
+a response from them.
+
+=item Choose a name
+
+Perl modules included on CPAN have a naming hierarchy you should try to
+fit in with. See L<perlmodlib> for more details on how this works, and
+browse around CPAN and the modules list to get a feel of it. At the very
+least, remember this: modules should be title capitalised, (This::Thing)
+fit in with a category, and explain their purpose succinctly.
+
+=item Check again
+
+While you're doing that, make really sure you haven't missed a module
+similar to the one you're about to write.
+
+When you've got your name sorted out and you're sure that your module is
+wanted and not currently available, it's time to start coding.
+
+=back
+
+=head2 Step-by-step: Making the module
+
+=over 3
+
+=item Start with F<module-starter> or F<h2xs>
+
+The F<module-starter> utility is distributed as part of the
+L<Module::Starter|Module::Starter> CPAN package.  It creates a directory
+with stubs of all the necessary files to start a new module, according
+to recent "best practice" for module development, and is invoked from
+the command line, thus:
+
+    module-starter --module=Foo::Bar \
+       --author="Your Name" --email=yourname@cpan.org
+
+If you do not wish to install the L<Module::Starter|Module::Starter>
+package from CPAN, F<h2xs> is an older tool, originally intended for the
+development of XS modules, which comes packaged with the Perl
+distribution. 
+
+A typical invocation of L<h2xs|h2xs> for a pure Perl module is:
+
+    h2xs -AX --skip-exporter --use-new-tests -n Foo::Bar 
+
+The C<-A> omits the Autoloader code, C<-X> omits XS elements,
+C<--skip-exporter> omits the Exporter code, C<--use-new-tests> sets up a
+modern testing environment, and C<-n> specifies the name of the module.
+
+=item Use L<strict|strict> and L<warnings|warnings>
+
+A module's code has to be warning and strict-clean, since you can't
+guarantee the conditions that it'll be used under. Besides, you wouldn't
+want to distribute code that wasn't warning or strict-clean anyway,
+right?
+
+=item Use L<Carp|Carp>
+
+The L<Carp|Carp> module allows you to present your error messages from
+the caller's perspective; this gives you a way to signal a problem with
+the caller and not your module. For instance, if you say this:
+
+    warn "No hostname given";
+
+the user will see something like this:
+
+    No hostname given at /usr/local/lib/perl5/site_perl/5.6.0/Net/Acme.pm
+    line 123.
+
+which looks like your module is doing something wrong. Instead, you want
+to put the blame on the user, and say this:
+
+    No hostname given at bad_code, line 10.
+
+You do this by using L<Carp|Carp> and replacing your C<warn>s with
+C<carp>s. If you need to C<die>, say C<croak> instead. However, keep
+C<warn> and C<die> in place for your sanity checks - where it really is
+your module at fault.
+
+=item Use L<Exporter|Exporter> - wisely!
+
+L<Exporter|Exporter> gives you a standard way of exporting symbols and
+subroutines from your module into the caller's namespace. For instance,
+saying C<use Net::Acme qw(&frob)> would import the C<frob> subroutine.
+
+The package variable C<@EXPORT> will determine which symbols will get
+exported when the caller simply says C<use Net::Acme> - you will hardly
+ever want to put anything in there. C<@EXPORT_OK>, on the other hand,
+specifies which symbols you're willing to export. If you do want to
+export a bunch of symbols, use the C<%EXPORT_TAGS> and define a standard
+export set - look at L<Exporter> for more details.
+
+=item Use L<plain old documentation|perlpod>
+
+The work isn't over until the paperwork is done, and you're going to
+need to put in some time writing some documentation for your module.
+C<module-starter> or C<h2xs> will provide a stub for you to fill in; if
+you're not sure about the format, look at L<perlpod> for an
+introduction. Provide a good synopsis of how your module is used in
+code, a description, and then notes on the syntax and function of the
+individual subroutines or methods. Use Perl comments for developer notes
+and POD for end-user notes.
+
+=item Write tests
+
+You're encouraged to create self-tests for your module to ensure it's
+working as intended on the myriad platforms Perl supports; if you upload
+your module to CPAN, a host of testers will build your module and send
+you the results of the tests. Again, C<module-starter> and C<h2xs>
+provide a test framework which you can extend - you should do something
+more than just checking your module will compile.
+L<Test::Simple|Test::Simple> and L<Test::More|Test::More> are good
+places to start when writing a test suite.
+
+=item Write the README
+
+If you're uploading to CPAN, the automated gremlins will extract the
+README file and place that in your CPAN directory. It'll also appear in
+the main F<by-module> and F<by-category> directories if you make it onto
+the modules list. It's a good idea to put here what the module actually
+does in detail, and the user-visible changes since the last release.
+
+=back
+
+=head2 Step-by-step: Distributing your module
+
+=over 3
+
+=item Get a CPAN user ID
+
+Every developer publishing modules on CPAN needs a CPAN ID.  Visit
+C<http://pause.perl.org/>, select "Request PAUSE Account", and wait for
+your request to be approved by the PAUSE administrators.
+
+=item C<perl Makefile.PL; make test; make dist>
+
+Once again, C<module-starter> or C<h2xs> has done all the work for you.
+They produce the standard C<Makefile.PL> you see when you download and
+install modules, and this produces a Makefile with a C<dist> target.
+
+Once you've ensured that your module passes its own tests - always a
+good thing to make sure - you can C<make dist>, and the Makefile will
+hopefully produce you a nice tarball of your module, ready for upload.
+
+=item Upload the tarball
+
+The email you got when you received your CPAN ID will tell you how to
+log in to PAUSE, the Perl Authors Upload SErver. From the menus there,
+you can upload your module to CPAN.
+
+=item Announce to the modules list
+
+Once uploaded, it'll sit unnoticed in your author directory. If you want
+it connected to the rest of the CPAN, you'll need to go to "Register
+Namespace" on PAUSE.  Once registered, your module will appear in the
+by-module and by-category listings on CPAN.
+
+=item Announce to clpa
+
+If you have a burning desire to tell the world about your release, post
+an announcement to the moderated C<comp.lang.perl.announce> newsgroup.
+
+=item Fix bugs!
+
+Once you start accumulating users, they'll send you bug reports. If
+you're lucky, they'll even send you patches. Welcome to the joys of
+maintaining a software project...
+
+=back
+
+=head1 AUTHOR
+
+Simon Cozens, C<simon@cpan.org>
+
+Updated by Kirrily "Skud" Robert, C<skud@cpan.org>
+
+=head1 SEE ALSO
+
+L<perlmod>, L<perlmodlib>, L<perlmodinstall>, L<h2xs>, L<strict>,
+L<Carp>, L<Exporter>, L<perlpod>, L<Test::Simple>, L<Test::More>
+L<ExtUtils::MakeMaker>, L<Module::Build>, L<Module::Starter>
+http://www.cpan.org/ , Ken Williams' tutorial on building your own
+module at http://mathforum.org/~ken/perl_modules.html
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlnumber.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlnumber.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlnumber.pod	(revision 14489)
@@ -0,0 +1,209 @@
+=head1 NAME
+
+perlnumber - semantics of numbers and numeric operations in Perl
+
+=head1 SYNOPSIS
+
+    $n = 1234;		    # decimal integer
+    $n = 0b1110011;	    # binary integer
+    $n = 01234;		    # octal integer
+    $n = 0x1234;	    # hexadecimal integer
+    $n = 12.34e-56;	    # exponential notation
+    $n = "-12.34e56";	    # number specified as a string
+    $n = "1234";	    # number specified as a string
+
+=head1 DESCRIPTION
+
+This document describes how Perl internally handles numeric values.
+
+Perl's operator overloading facility is completely ignored here.  Operator
+overloading allows user-defined behaviors for numbers, such as operations
+over arbitrarily large integers, floating points numbers with arbitrary
+precision, operations over "exotic" numbers such as modular arithmetic or
+p-adic arithmetic, and so on.  See L<overload> for details.
+
+=head1 Storing numbers
+
+Perl can internally represent numbers in 3 different ways: as native
+integers, as native floating point numbers, and as decimal strings.
+Decimal strings may have an exponential notation part, as in C<"12.34e-56">.
+I<Native> here means "a format supported by the C compiler which was used
+to build perl".
+
+The term "native" does not mean quite as much when we talk about native
+integers, as it does when native floating point numbers are involved.
+The only implication of the term "native" on integers is that the limits for
+the maximal and the minimal supported true integral quantities are close to
+powers of 2.  However, "native" floats have a most fundamental
+restriction: they may represent only those numbers which have a relatively
+"short" representation when converted to a binary fraction.  For example,
+0.9 cannot be represented by a native float, since the binary fraction
+for 0.9 is infinite:
+
+  binary0.1110011001100...
+
+with the sequence C<1100> repeating again and again.  In addition to this
+limitation,  the exponent of the binary number is also restricted when it
+is represented as a floating point number.  On typical hardware, floating
+point values can store numbers with up to 53 binary digits, and with binary
+exponents between -1024 and 1024.  In decimal representation this is close
+to 16 decimal digits and decimal exponents in the range of -304..304.
+The upshot of all this is that Perl cannot store a number like
+12345678901234567 as a floating point number on such architectures without
+loss of information.
+
+Similarly, decimal strings can represent only those numbers which have a
+finite decimal expansion.  Being strings, and thus of arbitrary length, there
+is no practical limit for the exponent or number of decimal digits for these
+numbers.  (But realize that what we are discussing the rules for just the
+I<storage> of these numbers.  The fact that you can store such "large" numbers
+does not mean that the I<operations> over these numbers will use all
+of the significant digits.
+See L<"Numeric operators and numeric conversions"> for details.)
+
+In fact numbers stored in the native integer format may be stored either
+in the signed native form, or in the unsigned native form.  Thus the limits
+for Perl numbers stored as native integers would typically be -2**31..2**32-1,
+with appropriate modifications in the case of 64-bit integers.  Again, this
+does not mean that Perl can do operations only over integers in this range:
+it is possible to store many more integers in floating point format.
+
+Summing up, Perl numeric values can store only those numbers which have
+a finite decimal expansion or a "short" binary expansion.
+
+=head1 Numeric operators and numeric conversions
+
+As mentioned earlier, Perl can store a number in any one of three formats,
+but most operators typically understand only one of those formats.  When
+a numeric value is passed as an argument to such an operator, it will be
+converted to the format understood by the operator.
+
+Six such conversions are possible:
+
+  native integer        --> native floating point	(*)
+  native integer        --> decimal string
+  native floating_point --> native integer		(*)
+  native floating_point --> decimal string		(*)
+  decimal string        --> native integer
+  decimal string        --> native floating point	(*)
+
+These conversions are governed by the following general rules:
+
+=over 4
+
+=item *
+
+If the source number can be represented in the target form, that
+representation is used.
+
+=item *
+
+If the source number is outside of the limits representable in the target form,
+a representation of the closest limit is used.  (I<Loss of information>)
+
+=item *
+
+If the source number is between two numbers representable in the target form,
+a representation of one of these numbers is used.  (I<Loss of information>)
+
+=item *
+
+In C<< native floating point --> native integer >> conversions the magnitude
+of the result is less than or equal to the magnitude of the source.
+(I<"Rounding to zero".>)
+
+=item *
+
+If the C<< decimal string --> native integer >> conversion cannot be done
+without loss of information, the result is compatible with the conversion
+sequence C<< decimal_string --> native_floating_point --> native_integer >>.
+In particular, rounding is strongly biased to 0, though a number like
+C<"0.99999999999999999999"> has a chance of being rounded to 1.
+
+=back
+
+B<RESTRICTION>: The conversions marked with C<(*)> above involve steps
+performed by the C compiler.  In particular, bugs/features of the compiler
+used may lead to breakage of some of the above rules.
+
+=head1 Flavors of Perl numeric operations
+
+Perl operations which take a numeric argument treat that argument in one
+of four different ways: they may force it to one of the integer/floating/
+string formats, or they may behave differently depending on the format of
+the operand.  Forcing a numeric value to a particular format does not
+change the number stored in the value.
+
+All the operators which need an argument in the integer format treat the
+argument as in modular arithmetic, e.g., C<mod 2**32> on a 32-bit
+architecture.  C<sprintf "%u", -1> therefore provides the same result as
+C<sprintf "%u", ~0>.
+
+=over 4
+
+=item Arithmetic operators
+
+The binary operators C<+> C<-> C<*> C</> C<%> C<==> C<!=> C<E<gt>> C<E<lt>>
+C<E<gt>=> C<E<lt>=> and the unary operators C<-> C<abs> and C<--> will
+attempt to convert arguments to integers.  If both conversions are possible
+without loss of precision, and the operation can be performed without
+loss of precision then the integer result is used.  Otherwise arguments are
+converted to floating point format and the floating point result is used.
+The caching of conversions (as described above) means that the integer
+conversion does not throw away fractional parts on floating point numbers.
+
+=item ++
+
+C<++> behaves as the other operators above, except that if it is a string
+matching the format C</^[a-zA-Z]*[0-9]*\z/> the string increment described
+in L<perlop> is used.
+
+=item Arithmetic operators during C<use integer>
+
+In scopes where C<use integer;> is in force, nearly all the operators listed
+above will force their argument(s) into integer format, and return an integer
+result.  The exceptions, C<abs>, C<++> and C<-->, do not change their
+behavior with C<use integer;>
+
+=item Other mathematical operators
+
+Operators such as C<**>, C<sin> and C<exp> force arguments to floating point
+format.
+
+=item Bitwise operators
+
+Arguments are forced into the integer format if not strings.
+
+=item Bitwise operators during C<use integer>
+
+forces arguments to integer format. Also shift operations internally use
+signed integers rather than the default unsigned.
+
+=item Operators which expect an integer
+
+force the argument into the integer format.  This is applicable
+to the third and fourth arguments of C<sysread>, for example.
+
+=item Operators which expect a string
+
+force the argument into the string format.  For example, this is
+applicable to C<printf "%s", $value>.
+
+=back
+
+Though forcing an argument into a particular form does not change the
+stored number, Perl remembers the result of such conversions.  In
+particular, though the first such conversion may be time-consuming,
+repeated operations will not need to redo the conversion.
+
+=head1 AUTHOR
+
+Ilya Zakharevich C<ilya@math.ohio-state.edu>
+
+Editorial adjustments by Gurusamy Sarathy <gsar@ActiveState.com>
+
+Updates for 5.8.0 by Nicholas Clark <nick@ccl4.org>
+
+=head1 SEE ALSO
+
+L<overload>, L<perlop>
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlobj.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlobj.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlobj.pod	(revision 14489)
@@ -0,0 +1,594 @@
+=head1 NAME
+X<object> X<OOP>
+
+perlobj - Perl objects
+
+=head1 DESCRIPTION
+
+First you need to understand what references are in Perl.
+See L<perlref> for that.  Second, if you still find the following
+reference work too complicated, a tutorial on object-oriented programming
+in Perl can be found in L<perltoot> and L<perltooc>.
+
+If you're still with us, then
+here are three very simple definitions that you should find reassuring.
+
+=over 4
+
+=item 1.
+
+An object is simply a reference that happens to know which class it
+belongs to.
+
+=item 2.
+
+A class is simply a package that happens to provide methods to deal
+with object references.
+
+=item 3.
+
+A method is simply a subroutine that expects an object reference (or
+a package name, for class methods) as the first argument.
+
+=back
+
+We'll cover these points now in more depth.
+
+=head2 An Object is Simply a Reference
+X<object> X<bless> X<constructor> X<new>
+
+Unlike say C++, Perl doesn't provide any special syntax for
+constructors.  A constructor is merely a subroutine that returns a
+reference to something "blessed" into a class, generally the
+class that the subroutine is defined in.  Here is a typical
+constructor:
+
+    package Critter;
+    sub new { bless {} }
+
+That word C<new> isn't special.  You could have written
+a construct this way, too:
+
+    package Critter;
+    sub spawn { bless {} }
+
+This might even be preferable, because the C++ programmers won't
+be tricked into thinking that C<new> works in Perl as it does in C++.
+It doesn't.  We recommend that you name your constructors whatever
+makes sense in the context of the problem you're solving.  For example,
+constructors in the Tk extension to Perl are named after the widgets
+they create.
+
+One thing that's different about Perl constructors compared with those in
+C++ is that in Perl, they have to allocate their own memory.  (The other
+things is that they don't automatically call overridden base-class
+constructors.)  The C<{}> allocates an anonymous hash containing no
+key/value pairs, and returns it  The bless() takes that reference and
+tells the object it references that it's now a Critter, and returns
+the reference.  This is for convenience, because the referenced object
+itself knows that it has been blessed, and the reference to it could
+have been returned directly, like this:
+
+    sub new {
+	my $self = {};
+	bless $self;
+	return $self;
+    }
+
+You often see such a thing in more complicated constructors
+that wish to call methods in the class as part of the construction:
+
+    sub new {
+	my $self = {};
+	bless $self;
+	$self->initialize();
+	return $self;
+    }
+
+If you care about inheritance (and you should; see
+L<perlmodlib/"Modules: Creation, Use, and Abuse">),
+then you want to use the two-arg form of bless
+so that your constructors may be inherited:
+
+    sub new {
+	my $class = shift;
+	my $self = {};
+	bless $self, $class;
+	$self->initialize();
+	return $self;
+    }
+
+Or if you expect people to call not just C<< CLASS->new() >> but also
+C<< $obj->new() >>, then use something like the following.  (Note that using
+this to call new() on an instance does not automatically perform any
+copying.  If you want a shallow or deep copy of an object, you'll have to
+specifically allow for that.)  The initialize() method used will be of
+whatever $class we blessed the object into:
+
+    sub new {
+	my $this = shift;
+	my $class = ref($this) || $this;
+	my $self = {};
+	bless $self, $class;
+	$self->initialize();
+	return $self;
+    }
+
+Within the class package, the methods will typically deal with the
+reference as an ordinary reference.  Outside the class package,
+the reference is generally treated as an opaque value that may
+be accessed only through the class's methods.
+
+Although a constructor can in theory re-bless a referenced object
+currently belonging to another class, this is almost certainly going
+to get you into trouble.  The new class is responsible for all
+cleanup later.  The previous blessing is forgotten, as an object
+may belong to only one class at a time.  (Although of course it's
+free to inherit methods from many classes.)  If you find yourself
+having to do this, the parent class is probably misbehaving, though.
+
+A clarification:  Perl objects are blessed.  References are not.  Objects
+know which package they belong to.  References do not.  The bless()
+function uses the reference to find the object.  Consider
+the following example:
+
+    $a = {};
+    $b = $a;
+    bless $a, BLAH;
+    print "\$b is a ", ref($b), "\n";
+
+This reports $b as being a BLAH, so obviously bless()
+operated on the object and not on the reference.
+
+=head2 A Class is Simply a Package
+X<class> X<package> X<@ISA> X<inheritance>
+
+Unlike say C++, Perl doesn't provide any special syntax for class
+definitions.  You use a package as a class by putting method
+definitions into the class.
+
+There is a special array within each package called @ISA, which says
+where else to look for a method if you can't find it in the current
+package.  This is how Perl implements inheritance.  Each element of the
+@ISA array is just the name of another package that happens to be a
+class package.  The classes are searched (depth first) for missing
+methods in the order that they occur in @ISA.  The classes accessible
+through @ISA are known as base classes of the current class.
+
+All classes implicitly inherit from class C<UNIVERSAL> as their
+last base class.  Several commonly used methods are automatically
+supplied in the UNIVERSAL class; see L<"Default UNIVERSAL methods"> for
+more details.
+X<UNIVERSAL> X<base class> X<class, base>
+
+If a missing method is found in a base class, it is cached
+in the current class for efficiency.  Changing @ISA or defining new
+subroutines invalidates the cache and causes Perl to do the lookup again.
+
+If neither the current class, its named base classes, nor the UNIVERSAL
+class contains the requested method, these three places are searched
+all over again, this time looking for a method named AUTOLOAD().  If an
+AUTOLOAD is found, this method is called on behalf of the missing method,
+setting the package global $AUTOLOAD to be the fully qualified name of
+the method that was intended to be called.
+X<AUTOLOAD>
+
+If none of that works, Perl finally gives up and complains.
+
+If you want to stop the AUTOLOAD inheritance say simply
+X<AUTOLOAD>
+
+	sub AUTOLOAD;
+
+and the call will die using the name of the sub being called.
+
+Perl classes do method inheritance only.  Data inheritance is left up
+to the class itself.  By and large, this is not a problem in Perl,
+because most classes model the attributes of their object using an
+anonymous hash, which serves as its own little namespace to be carved up
+by the various classes that might want to do something with the object.
+The only problem with this is that you can't sure that you aren't using
+a piece of the hash that isn't already used.  A reasonable workaround
+is to prepend your fieldname in the hash with the package name.
+X<inheritance, method> X<inheritance, data>
+
+    sub bump {
+	my $self = shift;
+	$self->{ __PACKAGE__ . ".count"}++;
+    } 
+
+=head2 A Method is Simply a Subroutine
+X<method>
+
+Unlike say C++, Perl doesn't provide any special syntax for method
+definition.  (It does provide a little syntax for method invocation
+though.  More on that later.)  A method expects its first argument
+to be the object (reference) or package (string) it is being invoked
+on.  There are two ways of calling methods, which we'll call class
+methods and instance methods.  
+
+A class method expects a class name as the first argument.  It
+provides functionality for the class as a whole, not for any
+individual object belonging to the class.  Constructors are often
+class methods, but see L<perltoot> and L<perltooc> for alternatives.
+Many class methods simply ignore their first argument, because they
+already know what package they're in and don't care what package
+they were invoked via.  (These aren't necessarily the same, because
+class methods follow the inheritance tree just like ordinary instance
+methods.)  Another typical use for class methods is to look up an
+object by name:
+
+    sub find {
+	my ($class, $name) = @_;
+	$objtable{$name};
+    }
+
+An instance method expects an object reference as its first argument.
+Typically it shifts the first argument into a "self" or "this" variable,
+and then uses that as an ordinary reference.
+
+    sub display {
+	my $self = shift;
+	my @keys = @_ ? @_ : sort keys %$self;
+	foreach $key (@keys) {
+	    print "\t$key => $self->{$key}\n";
+	}
+    }
+
+=head2 Method Invocation
+X<invocation> X<method> X<arrow> X<< -> >>
+
+For various historical and other reasons, Perl offers two equivalent
+ways to write a method call.  The simpler and more common way is to use
+the arrow notation:
+
+    my $fred = Critter->find("Fred");
+    $fred->display("Height", "Weight");
+
+You should already be familiar with the use of the C<< -> >> operator with
+references.  In fact, since C<$fred> above is a reference to an object,
+you could think of the method call as just another form of
+dereferencing.
+
+Whatever is on the left side of the arrow, whether a reference or a
+class name, is passed to the method subroutine as its first argument.
+So the above code is mostly equivalent to:
+
+    my $fred = Critter::find("Critter", "Fred");
+    Critter::display($fred, "Height", "Weight");
+
+How does Perl know which package the subroutine is in?  By looking at
+the left side of the arrow, which must be either a package name or a
+reference to an object, i.e. something that has been blessed to a
+package.  Either way, that's the package where Perl starts looking.  If
+that package has no subroutine with that name, Perl starts looking for
+it in any base classes of that package, and so on.
+
+If you need to, you I<can> force Perl to start looking in some other package:
+
+    my $barney = MyCritter->Critter::find("Barney");
+    $barney->Critter::display("Height", "Weight");
+
+Here C<MyCritter> is presumably a subclass of C<Critter> that defines
+its own versions of find() and display().  We haven't specified what
+those methods do, but that doesn't matter above since we've forced Perl
+to start looking for the subroutines in C<Critter>.
+
+As a special case of the above, you may use the C<SUPER> pseudo-class to
+tell Perl to start looking for the method in the packages named in the
+current class's C<@ISA> list.  
+X<SUPER>
+
+    package MyCritter;
+    use base 'Critter';    # sets @MyCritter::ISA = ('Critter');
+
+    sub display { 
+        my ($self, @args) = @_;
+        $self->SUPER::display("Name", @args);
+    }
+
+It is important to note that C<SUPER> refers to the superclass(es) of the
+I<current package> and not to the superclass(es) of the object. Also, the
+C<SUPER> pseudo-class can only currently be used as a modifier to a method
+name, but not in any of the other ways that class names are normally used,
+eg:
+X<SUPER>
+
+    something->SUPER::method(...);	# OK
+    SUPER::method(...);			# WRONG
+    SUPER->method(...);			# WRONG
+
+Instead of a class name or an object reference, you can also use any
+expression that returns either of those on the left side of the arrow.
+So the following statement is valid:
+
+    Critter->find("Fred")->display("Height", "Weight");
+
+and so is the following:
+
+    my $fred = (reverse "rettirC")->find(reverse "derF");
+
+The right side of the arrow typically is the method name, but a simple 
+scalar variable containing either the method name or a subroutine 
+reference can also be used.
+
+=head2 Indirect Object Syntax
+X<indirect object syntax> X<invocation, indirect> X<indirect>
+
+The other way to invoke a method is by using the so-called "indirect
+object" notation.  This syntax was available in Perl 4 long before
+objects were introduced, and is still used with filehandles like this:
+
+   print STDERR "help!!!\n";
+
+The same syntax can be used to call either object or class methods.
+
+   my $fred = find Critter "Fred";
+   display $fred "Height", "Weight";
+
+Notice that there is no comma between the object or class name and the
+parameters.  This is how Perl can tell you want an indirect method call
+instead of an ordinary subroutine call.
+
+But what if there are no arguments?  In that case, Perl must guess what
+you want.  Even worse, it must make that guess I<at compile time>.
+Usually Perl gets it right, but when it doesn't you get a function
+call compiled as a method, or vice versa.  This can introduce subtle bugs
+that are hard to detect.
+
+For example, a call to a method C<new> in indirect notation -- as C++
+programmers are wont to make -- can be miscompiled into a subroutine
+call if there's already a C<new> function in scope.  You'd end up
+calling the current package's C<new> as a subroutine, rather than the
+desired class's method.  The compiler tries to cheat by remembering
+bareword C<require>s, but the grief when it messes up just isn't worth the
+years of debugging it will take you to track down such subtle bugs.
+
+There is another problem with this syntax: the indirect object is
+limited to a name, a scalar variable, or a block, because it would have
+to do too much lookahead otherwise, just like any other postfix
+dereference in the language.  (These are the same quirky rules as are
+used for the filehandle slot in functions like C<print> and C<printf>.)
+This can lead to horribly confusing precedence problems, as in these
+next two lines:
+
+    move $obj->{FIELD};                 # probably wrong!
+    move $ary[$i];                      # probably wrong!
+
+Those actually parse as the very surprising:
+
+    $obj->move->{FIELD};                # Well, lookee here
+    $ary->move([$i]);                   # Didn't expect this one, eh?
+
+Rather than what you might have expected:
+
+    $obj->{FIELD}->move();              # You should be so lucky.
+    $ary[$i]->move;                     # Yeah, sure.
+
+To get the correct behavior with indirect object syntax, you would have
+to use a block around the indirect object:
+
+    move {$obj->{FIELD}};
+    move {$ary[$i]};
+
+Even then, you still have the same potential problem if there happens to
+be a function named C<move> in the current package.  B<The C<< -> >>
+notation suffers from neither of these disturbing ambiguities, so we
+recommend you use it exclusively.>  However, you may still end up having
+to read code using the indirect object notation, so it's important to be
+familiar with it.
+
+=head2 Default UNIVERSAL methods
+X<UNIVERSAL>
+
+The C<UNIVERSAL> package automatically contains the following methods that
+are inherited by all other classes:
+
+=over 4
+
+=item isa(CLASS)
+X<isa>
+
+C<isa> returns I<true> if its object is blessed into a subclass of C<CLASS>
+
+You can also call C<UNIVERSAL::isa> as a subroutine with two arguments.  Of
+course, this will do the wrong thing if someone has overridden C<isa> in a
+class, so don't do it.
+
+If you need to determine whether you've received a valid invocant, use the
+C<blessed> function from L<Scalar::Util>:
+X<invocant> X<blessed>
+
+    if (blessed($ref) && $ref->isa( 'Some::Class')) {
+        # ...
+    }
+
+C<blessed> returns the name of the package the argument has been
+blessed into, or C<undef>.
+
+=item can(METHOD)
+X<can>
+
+C<can> checks to see if its object has a method called C<METHOD>,
+if it does then a reference to the sub is returned, if it does not then
+I<undef> is returned.
+
+C<UNIVERSAL::can> can also be called as a subroutine with two arguments.  It'll
+always return I<undef> if its first argument isn't an object or a class name.
+The same caveats for calling C<UNIVERSAL::isa> directly apply here, too.
+
+=item VERSION( [NEED] )
+X<VERSION>
+
+C<VERSION> returns the version number of the class (package).  If the
+NEED argument is given then it will check that the current version (as
+defined by the $VERSION variable in the given package) not less than
+NEED; it will die if this is not the case.  This method is normally
+called as a class method.  This method is called automatically by the
+C<VERSION> form of C<use>.
+
+    use A 1.2 qw(some imported subs);
+    # implies:
+    A->VERSION(1.2);
+
+=back
+
+B<NOTE:> C<can> directly uses Perl's internal code for method lookup, and
+C<isa> uses a very similar method and cache-ing strategy. This may cause
+strange effects if the Perl code dynamically changes @ISA in any package.
+
+You may add other methods to the UNIVERSAL class via Perl or XS code.
+You do not need to C<use UNIVERSAL> to make these methods
+available to your program (and you should not do so).
+
+=head2 Destructors
+X<destructor> X<DESTROY>
+
+When the last reference to an object goes away, the object is
+automatically destroyed.  (This may even be after you exit, if you've
+stored references in global variables.)  If you want to capture control
+just before the object is freed, you may define a DESTROY method in
+your class.  It will automatically be called at the appropriate moment,
+and you can do any extra cleanup you need to do.  Perl passes a reference
+to the object under destruction as the first (and only) argument.  Beware
+that the reference is a read-only value, and cannot be modified by
+manipulating C<$_[0]> within the destructor.  The object itself (i.e.
+the thingy the reference points to, namely C<${$_[0]}>, C<@{$_[0]}>, 
+C<%{$_[0]}> etc.) is not similarly constrained.
+
+Since DESTROY methods can be called at unpredictable times, it is
+important that you localise any global variables that the method may
+update.  In particular, localise C<$@> if you use C<eval {}> and
+localise C<$?> if you use C<system> or backticks.
+
+If you arrange to re-bless the reference before the destructor returns,
+perl will again call the DESTROY method for the re-blessed object after
+the current one returns.  This can be used for clean delegation of
+object destruction, or for ensuring that destructors in the base classes
+of your choosing get called.  Explicitly calling DESTROY is also possible,
+but is usually never needed.
+
+Do not confuse the previous discussion with how objects I<CONTAINED> in the current
+one are destroyed.  Such objects will be freed and destroyed automatically
+when the current object is freed, provided no other references to them exist
+elsewhere.
+
+=head2 Summary
+
+That's about all there is to it.  Now you need just to go off and buy a
+book about object-oriented design methodology, and bang your forehead
+with it for the next six months or so.
+
+=head2 Two-Phased Garbage Collection
+X<garbage collection> X<GC> X<circular reference>
+X<reference, circular> X<DESTROY> X<destructor>
+
+For most purposes, Perl uses a fast and simple, reference-based
+garbage collection system.  That means there's an extra
+dereference going on at some level, so if you haven't built
+your Perl executable using your C compiler's C<-O> flag, performance
+will suffer.  If you I<have> built Perl with C<cc -O>, then this
+probably won't matter.
+
+A more serious concern is that unreachable memory with a non-zero
+reference count will not normally get freed.  Therefore, this is a bad
+idea:
+
+    {
+	my $a;
+	$a = \$a;
+    }
+
+Even thought $a I<should> go away, it can't.  When building recursive data
+structures, you'll have to break the self-reference yourself explicitly
+if you don't care to leak.  For example, here's a self-referential
+node such as one might use in a sophisticated tree structure:
+
+    sub new_node {
+	my $class = shift;
+	my $node  = {};
+	$node->{LEFT} = $node->{RIGHT} = $node;
+	$node->{DATA} = [ @_ ];
+	return bless $node => $class;
+    }
+
+If you create nodes like that, they (currently) won't go away unless you
+break their self reference yourself.  (In other words, this is not to be
+construed as a feature, and you shouldn't depend on it.)
+
+Almost.
+
+When an interpreter thread finally shuts down (usually when your program
+exits), then a rather costly but complete mark-and-sweep style of garbage
+collection is performed, and everything allocated by that thread gets
+destroyed.  This is essential to support Perl as an embedded or a
+multithreadable language.  For example, this program demonstrates Perl's
+two-phased garbage collection:
+
+    #!/usr/bin/perl
+    package Subtle;
+
+    sub new {
+	my $test;
+	$test = \$test;
+	warn "CREATING " . \$test;
+	return bless \$test;
+    }
+
+    sub DESTROY {
+	my $self = shift;
+	warn "DESTROYING $self";
+    }
+
+    package main;
+
+    warn "starting program";
+    {
+	my $a = Subtle->new;
+	my $b = Subtle->new;
+	$$a = 0;  # break selfref
+	warn "leaving block";
+    }
+
+    warn "just exited block";
+    warn "time to die...";
+    exit;
+
+When run as F</foo/test>, the following output is produced:
+
+    starting program at /foo/test line 18.
+    CREATING SCALAR(0x8e5b8) at /foo/test line 7.
+    CREATING SCALAR(0x8e57c) at /foo/test line 7.
+    leaving block at /foo/test line 23.
+    DESTROYING Subtle=SCALAR(0x8e5b8) at /foo/test line 13.
+    just exited block at /foo/test line 26.
+    time to die... at /foo/test line 27.
+    DESTROYING Subtle=SCALAR(0x8e57c) during global destruction.
+
+Notice that "global destruction" bit there?  That's the thread
+garbage collector reaching the unreachable.
+
+Objects are always destructed, even when regular refs aren't.  Objects
+are destructed in a separate pass before ordinary refs just to 
+prevent object destructors from using refs that have been themselves
+destructed.  Plain refs are only garbage-collected if the destruct level
+is greater than 0.  You can test the higher levels of global destruction
+by setting the PERL_DESTRUCT_LEVEL environment variable, presuming
+C<-DDEBUGGING> was enabled during perl build time.
+See L<perlhack/PERL_DESTRUCT_LEVEL> for more information.
+
+A more complete garbage collection strategy will be implemented
+at a future date.
+
+In the meantime, the best solution is to create a non-recursive container
+class that holds a pointer to the self-referential data structure.
+Define a DESTROY method for the containing object's class that manually
+breaks the circularities in the self-referential structure.
+
+=head1 SEE ALSO
+
+A kinder, gentler tutorial on object-oriented programming in Perl can
+be found in L<perltoot>, L<perlboot> and L<perltooc>.  You should
+also check out L<perlbot> for other object tricks, traps, and tips, as
+well as L<perlmodlib> for some style guides on constructing both
+modules and classes.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlop.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlop.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlop.pod	(revision 14489)
@@ -0,0 +1,2316 @@
+=head1 NAME
+X<operator>
+
+perlop - Perl operators and precedence
+
+=head1 DESCRIPTION
+
+=head2 Operator Precedence and Associativity 
+X<operator, precedence> X<precedence> X<associativity>
+
+Operator precedence and associativity work in Perl more or less like
+they do in mathematics.
+
+I<Operator precedence> means some operators are evaluated before
+others.  For example, in C<2 + 4 * 5>, the multiplication has higher
+precedence so C<4 * 5> is evaluated first yielding C<2 + 20 ==
+22> and not C<6 * 5 == 30>.
+
+I<Operator associativity> defines what happens if a sequence of the
+same operators is used one after another: whether the evaluator will
+evaluate the left operations first or the right.  For example, in C<8
+- 4 - 2>, subtraction is left associative so Perl evaluates the
+expression left to right.  C<8 - 4> is evaluated first making the
+expression C<4 - 2 == 2> and not C<8 - 2 == 6>.
+
+Perl operators have the following associativity and precedence,
+listed from highest precedence to lowest.  Operators borrowed from
+C keep the same precedence relationship with each other, even where
+C's precedence is slightly screwy.  (This makes learning Perl easier
+for C folks.)  With very few exceptions, these all operate on scalar
+values only, not array values.
+
+    left	terms and list operators (leftward)
+    left	->
+    nonassoc	++ --
+    right	**
+    right	! ~ \ and unary + and -
+    left	=~ !~
+    left	* / % x
+    left	+ - .
+    left	<< >>
+    nonassoc	named unary operators
+    nonassoc	< > <= >= lt gt le ge
+    nonassoc	== != <=> eq ne cmp
+    left	&
+    left	| ^
+    left	&&
+    left	||
+    nonassoc	..  ...
+    right	?:
+    right	= += -= *= etc.
+    left	, =>
+    nonassoc	list operators (rightward)
+    right	not
+    left	and
+    left	or xor
+
+In the following sections, these operators are covered in precedence order.
+
+Many operators can be overloaded for objects.  See L<overload>.
+
+=head2 Terms and List Operators (Leftward)
+X<list operator> X<operator, list> X<term>
+
+A TERM has the highest precedence in Perl.  They include variables,
+quote and quote-like operators, any expression in parentheses,
+and any function whose arguments are parenthesized.  Actually, there
+aren't really functions in this sense, just list operators and unary
+operators behaving as functions because you put parentheses around
+the arguments.  These are all documented in L<perlfunc>.
+
+If any list operator (print(), etc.) or any unary operator (chdir(), etc.)
+is followed by a left parenthesis as the next token, the operator and
+arguments within parentheses are taken to be of highest precedence,
+just like a normal function call.
+
+In the absence of parentheses, the precedence of list operators such as
+C<print>, C<sort>, or C<chmod> is either very high or very low depending on
+whether you are looking at the left side or the right side of the operator.
+For example, in
+
+    @ary = (1, 3, sort 4, 2);
+    print @ary;		# prints 1324
+
+the commas on the right of the sort are evaluated before the sort,
+but the commas on the left are evaluated after.  In other words,
+list operators tend to gobble up all arguments that follow, and
+then act like a simple TERM with regard to the preceding expression.
+Be careful with parentheses:
+
+    # These evaluate exit before doing the print:
+    print($foo, exit);	# Obviously not what you want.
+    print $foo, exit;	# Nor is this.
+
+    # These do the print before evaluating exit:
+    (print $foo), exit;	# This is what you want.
+    print($foo), exit;	# Or this.
+    print ($foo), exit;	# Or even this.
+
+Also note that
+
+    print ($foo & 255) + 1, "\n";
+
+probably doesn't do what you expect at first glance.  The parentheses
+enclose the argument list for C<print> which is evaluated (printing
+the result of C<$foo & 255>).  Then one is added to the return value
+of C<print> (usually 1).  The result is something like this:
+
+    1 + 1, "\n";    # Obviously not what you meant.
+
+To do what you meant properly, you must write:
+
+    print(($foo & 255) + 1, "\n");
+
+See L<Named Unary Operators> for more discussion of this.
+
+Also parsed as terms are the C<do {}> and C<eval {}> constructs, as
+well as subroutine and method calls, and the anonymous
+constructors C<[]> and C<{}>.
+
+See also L<Quote and Quote-like Operators> toward the end of this section,
+as well as L<"I/O Operators">.
+
+=head2 The Arrow Operator
+X<arrow> X<dereference> X<< -> >>
+
+"C<< -> >>" is an infix dereference operator, just as it is in C
+and C++.  If the right side is either a C<[...]>, C<{...}>, or a
+C<(...)> subscript, then the left side must be either a hard or
+symbolic reference to an array, a hash, or a subroutine respectively.
+(Or technically speaking, a location capable of holding a hard
+reference, if it's an array or hash reference being used for
+assignment.)  See L<perlreftut> and L<perlref>.
+
+Otherwise, the right side is a method name or a simple scalar
+variable containing either the method name or a subroutine reference,
+and the left side must be either an object (a blessed reference)
+or a class name (that is, a package name).  See L<perlobj>.
+
+=head2 Auto-increment and Auto-decrement
+X<increment> X<auto-increment> X<++> X<decrement> X<auto-decrement> X<-->
+
+"++" and "--" work as in C.  That is, if placed before a variable,
+they increment or decrement the variable by one before returning the
+value, and if placed after, increment or decrement after returning the
+value.
+
+    $i = 0;  $j = 0;
+    print $i++;  # prints 0
+    print ++$j;  # prints 1
+
+Note that just as in C, Perl doesn't define B<when> the variable is
+incremented or decremented. You just know it will be done sometime 
+before or after the value is returned. This also means that modifying
+a variable twice in the same statement will lead to undefined behaviour.
+Avoid statements like:
+
+    $i = $i ++;
+    print ++ $i + $i ++;
+
+Perl will not guarantee what the result of the above statements is.
+
+The auto-increment operator has a little extra builtin magic to it.  If
+you increment a variable that is numeric, or that has ever been used in
+a numeric context, you get a normal increment.  If, however, the
+variable has been used in only string contexts since it was set, and
+has a value that is not the empty string and matches the pattern
+C</^[a-zA-Z]*[0-9]*\z/>, the increment is done as a string, preserving each
+character within its range, with carry:
+
+    print ++($foo = '99');	# prints '100'
+    print ++($foo = 'a0');	# prints 'a1'
+    print ++($foo = 'Az');	# prints 'Ba'
+    print ++($foo = 'zz');	# prints 'aaa'
+
+C<undef> is always treated as numeric, and in particular is changed
+to C<0> before incrementing (so that a post-increment of an undef value
+will return C<0> rather than C<undef>).
+
+The auto-decrement operator is not magical.
+
+=head2 Exponentiation
+X<**> X<exponentiation> X<power>
+
+Binary "**" is the exponentiation operator.  It binds even more
+tightly than unary minus, so -2**4 is -(2**4), not (-2)**4. (This is
+implemented using C's pow(3) function, which actually works on doubles
+internally.)
+
+=head2 Symbolic Unary Operators
+X<unary operator> X<operator, unary>
+
+Unary "!" performs logical negation, i.e., "not".  See also C<not> for a lower
+precedence version of this.
+X<!>
+
+Unary "-" performs arithmetic negation if the operand is numeric.  If
+the operand is an identifier, a string consisting of a minus sign
+concatenated with the identifier is returned.  Otherwise, if the string
+starts with a plus or minus, a string starting with the opposite sign
+is returned.  One effect of these rules is that -bareword is equivalent
+to the string "-bareword".  If, however, the string begins with a
+non-alphabetic character (exluding "+" or "-"), Perl will attempt to convert
+the string to a numeric and the arithmetic negation is performed. If the
+string cannot be cleanly converted to a numeric, Perl will give the warning
+B<Argument "the string" isn't numeric in negation (-) at ...>.
+X<-> X<negation, arithmetic>
+
+Unary "~" performs bitwise negation, i.e., 1's complement.  For
+example, C<0666 & ~027> is 0640.  (See also L<Integer Arithmetic> and
+L<Bitwise String Operators>.)  Note that the width of the result is
+platform-dependent: ~0 is 32 bits wide on a 32-bit platform, but 64
+bits wide on a 64-bit platform, so if you are expecting a certain bit
+width, remember to use the & operator to mask off the excess bits.
+X<~> X<negation, binary>
+
+Unary "+" has no effect whatsoever, even on strings.  It is useful
+syntactically for separating a function name from a parenthesized expression
+that would otherwise be interpreted as the complete list of function
+arguments.  (See examples above under L<Terms and List Operators (Leftward)>.)
+X<+>
+
+Unary "\" creates a reference to whatever follows it.  See L<perlreftut>
+and L<perlref>.  Do not confuse this behavior with the behavior of
+backslash within a string, although both forms do convey the notion
+of protecting the next thing from interpolation.
+X<\> X<reference> X<backslash>
+
+=head2 Binding Operators
+X<binding> X<operator, binding> X<=~> X<!~>
+
+Binary "=~" binds a scalar expression to a pattern match.  Certain operations
+search or modify the string $_ by default.  This operator makes that kind
+of operation work on some other string.  The right argument is a search
+pattern, substitution, or transliteration.  The left argument is what is
+supposed to be searched, substituted, or transliterated instead of the default
+$_.  When used in scalar context, the return value generally indicates the
+success of the operation.  Behavior in list context depends on the particular
+operator.  See L</"Regexp Quote-Like Operators"> for details and 
+L<perlretut> for examples using these operators.
+
+If the right argument is an expression rather than a search pattern,
+substitution, or transliteration, it is interpreted as a search pattern at run
+time.
+
+Binary "!~" is just like "=~" except the return value is negated in
+the logical sense.
+
+=head2 Multiplicative Operators
+X<operator, multiplicative>
+
+Binary "*" multiplies two numbers.
+X<*>
+
+Binary "/" divides two numbers.
+X</> X<slash>
+
+Binary "%" computes the modulus of two numbers.  Given integer
+operands C<$a> and C<$b>: If C<$b> is positive, then C<$a % $b> is
+C<$a> minus the largest multiple of C<$b> that is not greater than
+C<$a>.  If C<$b> is negative, then C<$a % $b> is C<$a> minus the
+smallest multiple of C<$b> that is not less than C<$a> (i.e. the
+result will be less than or equal to zero). 
+Note that when C<use integer> is in scope, "%" gives you direct access
+to the modulus operator as implemented by your C compiler.  This
+operator is not as well defined for negative operands, but it will
+execute faster.
+X<%> X<remainder> X<modulus> X<mod>
+
+Binary "x" is the repetition operator.  In scalar context or if the left
+operand is not enclosed in parentheses, it returns a string consisting
+of the left operand repeated the number of times specified by the right
+operand.  In list context, if the left operand is enclosed in
+parentheses or is a list formed by C<qw/STRING/>, it repeats the list.
+If the right operand is zero or negative, it returns an empty string
+or an empty list, depending on the context.
+X<x>
+
+    print '-' x 80;		# print row of dashes
+
+    print "\t" x ($tab/8), ' ' x ($tab%8);	# tab over
+
+    @ones = (1) x 80;		# a list of 80 1's
+    @ones = (5) x @ones;	# set all elements to 5
+
+
+=head2 Additive Operators
+X<operator, additive>
+
+Binary "+" returns the sum of two numbers.
+X<+>
+
+Binary "-" returns the difference of two numbers.
+X<->
+
+Binary "." concatenates two strings.
+X<string, concatenation> X<concatenation>
+X<cat> X<concat> X<concatenate> X<.>
+
+=head2 Shift Operators
+X<shift operator> X<operator, shift> X<<< << >>>
+X<<< >> >>> X<right shift> X<left shift> X<bitwise shift>
+X<shl> X<shr> X<shift, right> X<shift, left>
+
+Binary "<<" returns the value of its left argument shifted left by the
+number of bits specified by the right argument.  Arguments should be
+integers.  (See also L<Integer Arithmetic>.)
+
+Binary ">>" returns the value of its left argument shifted right by
+the number of bits specified by the right argument.  Arguments should
+be integers.  (See also L<Integer Arithmetic>.)
+
+Note that both "<<" and ">>" in Perl are implemented directly using
+"<<" and ">>" in C.  If C<use integer> (see L<Integer Arithmetic>) is
+in force then signed C integers are used, else unsigned C integers are
+used.  Either way, the implementation isn't going to generate results
+larger than the size of the integer type Perl was built with (32 bits
+or 64 bits).
+
+The result of overflowing the range of the integers is undefined
+because it is undefined also in C.  In other words, using 32-bit
+integers, C<< 1 << 32 >> is undefined.  Shifting by a negative number
+of bits is also undefined.
+
+=head2 Named Unary Operators
+X<operator, named unary>
+
+The various named unary operators are treated as functions with one
+argument, with optional parentheses.
+
+If any list operator (print(), etc.) or any unary operator (chdir(), etc.)
+is followed by a left parenthesis as the next token, the operator and
+arguments within parentheses are taken to be of highest precedence,
+just like a normal function call.  For example,
+because named unary operators are higher precedence than ||:
+
+    chdir $foo    || die;	# (chdir $foo) || die
+    chdir($foo)   || die;	# (chdir $foo) || die
+    chdir ($foo)  || die;	# (chdir $foo) || die
+    chdir +($foo) || die;	# (chdir $foo) || die
+
+but, because * is higher precedence than named operators:
+
+    chdir $foo * 20;	# chdir ($foo * 20)
+    chdir($foo) * 20;	# (chdir $foo) * 20
+    chdir ($foo) * 20;	# (chdir $foo) * 20
+    chdir +($foo) * 20;	# chdir ($foo * 20)
+
+    rand 10 * 20;	# rand (10 * 20)
+    rand(10) * 20;	# (rand 10) * 20
+    rand (10) * 20;	# (rand 10) * 20
+    rand +(10) * 20;	# rand (10 * 20)
+
+Regarding precedence, the filetest operators, like C<-f>, C<-M>, etc. are
+treated like named unary operators, but they don't follow this functional
+parenthesis rule.  That means, for example, that C<-f($file).".bak"> is
+equivalent to C<-f "$file.bak">.
+X<-X> X<filetest> X<operator, filetest>
+
+See also L<"Terms and List Operators (Leftward)">.
+
+=head2 Relational Operators
+X<relational operator> X<operator, relational>
+
+Binary "<" returns true if the left argument is numerically less than
+the right argument.
+X<< < >>
+
+Binary ">" returns true if the left argument is numerically greater
+than the right argument.
+X<< > >>
+
+Binary "<=" returns true if the left argument is numerically less than
+or equal to the right argument.
+X<< <= >>
+
+Binary ">=" returns true if the left argument is numerically greater
+than or equal to the right argument.
+X<< >= >>
+
+Binary "lt" returns true if the left argument is stringwise less than
+the right argument.
+X<< lt >>
+
+Binary "gt" returns true if the left argument is stringwise greater
+than the right argument.
+X<< gt >>
+
+Binary "le" returns true if the left argument is stringwise less than
+or equal to the right argument.
+X<< le >>
+
+Binary "ge" returns true if the left argument is stringwise greater
+than or equal to the right argument.
+X<< ge >>
+
+=head2 Equality Operators
+X<equality> X<equal> X<equals> X<operator, equality>
+
+Binary "==" returns true if the left argument is numerically equal to
+the right argument.
+X<==>
+
+Binary "!=" returns true if the left argument is numerically not equal
+to the right argument.
+X<!=>
+
+Binary "<=>" returns -1, 0, or 1 depending on whether the left
+argument is numerically less than, equal to, or greater than the right
+argument.  If your platform supports NaNs (not-a-numbers) as numeric
+values, using them with "<=>" returns undef.  NaN is not "<", "==", ">",
+"<=" or ">=" anything (even NaN), so those 5 return false. NaN != NaN
+returns true, as does NaN != anything else. If your platform doesn't
+support NaNs then NaN is just a string with numeric value 0.
+X<< <=> >> X<spaceship>
+
+    perl -le '$a = "NaN"; print "No NaN support here" if $a == $a'
+    perl -le '$a = "NaN"; print "NaN support here" if $a != $a'
+
+Binary "eq" returns true if the left argument is stringwise equal to
+the right argument.
+X<eq>
+
+Binary "ne" returns true if the left argument is stringwise not equal
+to the right argument.
+X<ne>
+
+Binary "cmp" returns -1, 0, or 1 depending on whether the left
+argument is stringwise less than, equal to, or greater than the right
+argument.
+X<cmp>
+
+"lt", "le", "ge", "gt" and "cmp" use the collation (sort) order specified
+by the current locale if C<use locale> is in effect.  See L<perllocale>.
+
+=head2 Bitwise And
+X<operator, bitwise, and> X<bitwise and> X<&>
+
+Binary "&" returns its operands ANDed together bit by bit.
+(See also L<Integer Arithmetic> and L<Bitwise String Operators>.)
+
+Note that "&" has lower priority than relational operators, so for example
+the brackets are essential in a test like
+
+	print "Even\n" if ($x & 1) == 0;
+
+=head2 Bitwise Or and Exclusive Or
+X<operator, bitwise, or> X<bitwise or> X<|> X<operator, bitwise, xor>
+X<bitwise xor> X<^>
+
+Binary "|" returns its operands ORed together bit by bit.
+(See also L<Integer Arithmetic> and L<Bitwise String Operators>.)
+
+Binary "^" returns its operands XORed together bit by bit.
+(See also L<Integer Arithmetic> and L<Bitwise String Operators>.)
+
+Note that "|" and "^" have lower priority than relational operators, so
+for example the brackets are essential in a test like
+
+	print "false\n" if (8 | 2) != 10;
+
+=head2 C-style Logical And
+X<&&> X<logical and> X<operator, logical, and>
+
+Binary "&&" performs a short-circuit logical AND operation.  That is,
+if the left operand is false, the right operand is not even evaluated.
+Scalar or list context propagates down to the right operand if it
+is evaluated.
+
+=head2 C-style Logical Or
+X<||> X<operator, logical, or>
+
+Binary "||" performs a short-circuit logical OR operation.  That is,
+if the left operand is true, the right operand is not even evaluated.
+Scalar or list context propagates down to the right operand if it
+is evaluated.
+
+The C<||> and C<&&> operators return the last value evaluated
+(unlike C's C<||> and C<&&>, which return 0 or 1). Thus, a reasonably
+portable way to find out the home directory might be:
+
+    $home = $ENV{'HOME'} || $ENV{'LOGDIR'} ||
+	(getpwuid($<))[7] || die "You're homeless!\n";
+
+In particular, this means that you shouldn't use this
+for selecting between two aggregates for assignment:
+
+    @a = @b || @c;		# this is wrong
+    @a = scalar(@b) || @c;	# really meant this
+    @a = @b ? @b : @c;		# this works fine, though
+
+As more readable alternatives to C<&&> and C<||> when used for
+control flow, Perl provides C<and> and C<or> operators (see below).
+The short-circuit behavior is identical.  The precedence of "and" and
+"or" is much lower, however, so that you can safely use them after a
+list operator without the need for parentheses:
+
+    unlink "alpha", "beta", "gamma"
+	    or gripe(), next LINE;
+
+With the C-style operators that would have been written like this:
+
+    unlink("alpha", "beta", "gamma")
+	    || (gripe(), next LINE);
+
+Using "or" for assignment is unlikely to do what you want; see below.
+
+=head2 Range Operators
+X<operator, range> X<range> X<..> X<...>
+
+Binary ".." is the range operator, which is really two different
+operators depending on the context.  In list context, it returns a
+list of values counting (up by ones) from the left value to the right
+value.  If the left value is greater than the right value then it
+returns the empty list.  The range operator is useful for writing
+C<foreach (1..10)> loops and for doing slice operations on arrays. In
+the current implementation, no temporary array is created when the
+range operator is used as the expression in C<foreach> loops, but older
+versions of Perl might burn a lot of memory when you write something
+like this:
+
+    for (1 .. 1_000_000) {
+	# code
+    }
+
+The range operator also works on strings, using the magical auto-increment,
+see below.
+
+In scalar context, ".." returns a boolean value.  The operator is
+bistable, like a flip-flop, and emulates the line-range (comma) operator
+of B<sed>, B<awk>, and various editors.  Each ".." operator maintains its
+own boolean state.  It is false as long as its left operand is false.
+Once the left operand is true, the range operator stays true until the
+right operand is true, I<AFTER> which the range operator becomes false
+again.  It doesn't become false till the next time the range operator is
+evaluated.  It can test the right operand and become false on the same
+evaluation it became true (as in B<awk>), but it still returns true once.
+If you don't want it to test the right operand till the next
+evaluation, as in B<sed>, just use three dots ("...") instead of
+two.  In all other regards, "..." behaves just like ".." does.
+
+The right operand is not evaluated while the operator is in the
+"false" state, and the left operand is not evaluated while the
+operator is in the "true" state.  The precedence is a little lower
+than || and &&.  The value returned is either the empty string for
+false, or a sequence number (beginning with 1) for true.  The
+sequence number is reset for each range encountered.  The final
+sequence number in a range has the string "E0" appended to it, which
+doesn't affect its numeric value, but gives you something to search
+for if you want to exclude the endpoint.  You can exclude the
+beginning point by waiting for the sequence number to be greater
+than 1.
+
+If either operand of scalar ".." is a constant expression,
+that operand is considered true if it is equal (C<==>) to the current
+input line number (the C<$.> variable).
+
+To be pedantic, the comparison is actually C<int(EXPR) == int(EXPR)>,
+but that is only an issue if you use a floating point expression; when
+implicitly using C<$.> as described in the previous paragraph, the
+comparison is C<int(EXPR) == int($.)> which is only an issue when C<$.>
+is set to a floating point value and you are not reading from a file.
+Furthermore, C<"span" .. "spat"> or C<2.18 .. 3.14> will not do what
+you want in scalar context because each of the operands are evaluated
+using their integer representation.
+
+Examples:
+
+As a scalar operator:
+
+    if (101 .. 200) { print; } # print 2nd hundred lines, short for
+                               #   if ($. == 101 .. $. == 200) ...
+
+    next LINE if (1 .. /^$/);  # skip header lines, short for
+                               #   ... if ($. == 1 .. /^$/);
+                               # (typically in a loop labeled LINE)
+
+    s/^/> / if (/^$/ .. eof());  # quote body
+
+    # parse mail messages
+    while (<>) {
+        $in_header =   1  .. /^$/;
+        $in_body   = /^$/ .. eof;
+        if ($in_header) {
+            # ...
+        } else { # in body
+            # ...
+        }
+    } continue {
+        close ARGV if eof;             # reset $. each file
+    }
+
+Here's a simple example to illustrate the difference between
+the two range operators:
+
+    @lines = ("   - Foo",
+              "01 - Bar",
+              "1  - Baz",
+              "   - Quux");
+
+    foreach (@lines) {
+        if (/0/ .. /1/) {
+            print "$_\n";
+        }
+    }
+
+This program will print only the line containing "Bar". If
+the range operator is changed to C<...>, it will also print the
+"Baz" line.
+
+And now some examples as a list operator:
+
+    for (101 .. 200) { print; }	# print $_ 100 times
+    @foo = @foo[0 .. $#foo];	# an expensive no-op
+    @foo = @foo[$#foo-4 .. $#foo];	# slice last 5 items
+
+The range operator (in list context) makes use of the magical
+auto-increment algorithm if the operands are strings.  You
+can say
+
+    @alphabet = ('A' .. 'Z');
+
+to get all normal letters of the English alphabet, or
+
+    $hexdigit = (0 .. 9, 'a' .. 'f')[$num & 15];
+
+to get a hexadecimal digit, or
+
+    @z2 = ('01' .. '31');  print $z2[$mday];
+
+to get dates with leading zeros.  If the final value specified is not
+in the sequence that the magical increment would produce, the sequence
+goes until the next value would be longer than the final value
+specified.
+
+Because each operand is evaluated in integer form, C<2.18 .. 3.14> will
+return two elements in list context.
+
+    @list = (2.18 .. 3.14); # same as @list = (2 .. 3);
+
+=head2 Conditional Operator
+X<operator, conditional> X<operator, ternary> X<ternary> X<?:>
+
+Ternary "?:" is the conditional operator, just as in C.  It works much
+like an if-then-else.  If the argument before the ? is true, the
+argument before the : is returned, otherwise the argument after the :
+is returned.  For example:
+
+    printf "I have %d dog%s.\n", $n,
+	    ($n == 1) ? '' : "s";
+
+Scalar or list context propagates downward into the 2nd
+or 3rd argument, whichever is selected.
+
+    $a = $ok ? $b : $c;  # get a scalar
+    @a = $ok ? @b : @c;  # get an array
+    $a = $ok ? @b : @c;  # oops, that's just a count!
+
+The operator may be assigned to if both the 2nd and 3rd arguments are
+legal lvalues (meaning that you can assign to them):
+
+    ($a_or_b ? $a : $b) = $c;
+
+Because this operator produces an assignable result, using assignments
+without parentheses will get you in trouble.  For example, this:
+
+    $a % 2 ? $a += 10 : $a += 2
+
+Really means this:
+
+    (($a % 2) ? ($a += 10) : $a) += 2
+
+Rather than this:
+
+    ($a % 2) ? ($a += 10) : ($a += 2)
+
+That should probably be written more simply as:
+
+    $a += ($a % 2) ? 10 : 2;
+
+=head2 Assignment Operators
+X<assignment> X<operator, assignment> X<=> X<**=> X<+=> X<*=> X<&=>
+X<<< <<= >>> X<&&=> X<-=> X</=> X<|=> X<<< >>= >>> X<||=> X<.=>
+X<%=> X<^=> X<x=>
+
+"=" is the ordinary assignment operator.
+
+Assignment operators work as in C.  That is,
+
+    $a += 2;
+
+is equivalent to
+
+    $a = $a + 2;
+
+although without duplicating any side effects that dereferencing the lvalue
+might trigger, such as from tie().  Other assignment operators work similarly.
+The following are recognized:
+
+    **=    +=    *=    &=    <<=    &&=
+           -=    /=    |=    >>=    ||=
+           .=    %=    ^=
+                 x=
+
+Although these are grouped by family, they all have the precedence
+of assignment.
+
+Unlike in C, the scalar assignment operator produces a valid lvalue.
+Modifying an assignment is equivalent to doing the assignment and
+then modifying the variable that was assigned to.  This is useful
+for modifying a copy of something, like this:
+
+    ($tmp = $global) =~ tr [A-Z] [a-z];
+
+Likewise,
+
+    ($a += 2) *= 3;
+
+is equivalent to
+
+    $a += 2;
+    $a *= 3;
+
+Similarly, a list assignment in list context produces the list of
+lvalues assigned to, and a list assignment in scalar context returns
+the number of elements produced by the expression on the right hand
+side of the assignment.
+
+=head2 Comma Operator
+X<comma> X<operator, comma> X<,>
+
+Binary "," is the comma operator.  In scalar context it evaluates
+its left argument, throws that value away, then evaluates its right
+argument and returns that value.  This is just like C's comma operator.
+
+In list context, it's just the list argument separator, and inserts
+both its arguments into the list.
+
+The C<< => >> operator is a synonym for the comma, but forces any word
+(consisting entirely of word characters) to its left to be interpreted
+as a string (as of 5.001).  This includes words that might otherwise be
+considered a constant or function call.
+
+    use constant FOO => "something";
+
+    my %h = ( FOO => 23 );
+
+is equivalent to:
+
+    my %h = ("FOO", 23);
+
+It is I<NOT>:
+
+    my %h = ("something", 23);
+
+If the argument on the left is not a word, it is first interpreted as
+an expression, and then the string value of that is used.
+
+The C<< => >> operator is helpful in documenting the correspondence
+between keys and values in hashes, and other paired elements in lists.
+
+        %hash = ( $key => $value );
+        login( $username => $password );
+
+=head2 List Operators (Rightward)
+X<operator, list, rightward> X<list operator>
+
+On the right side of a list operator, it has very low precedence,
+such that it controls all comma-separated expressions found there.
+The only operators with lower precedence are the logical operators
+"and", "or", and "not", which may be used to evaluate calls to list
+operators without the need for extra parentheses:
+
+    open HANDLE, "filename"
+	or die "Can't open: $!\n";
+
+See also discussion of list operators in L<Terms and List Operators (Leftward)>.
+
+=head2 Logical Not
+X<operator, logical, not> X<not>
+
+Unary "not" returns the logical negation of the expression to its right.
+It's the equivalent of "!" except for the very low precedence.
+
+=head2 Logical And
+X<operator, logical, and> X<and>
+
+Binary "and" returns the logical conjunction of the two surrounding
+expressions.  It's equivalent to && except for the very low
+precedence.  This means that it short-circuits: i.e., the right
+expression is evaluated only if the left expression is true.
+
+=head2 Logical or and Exclusive Or
+X<operator, logical, or> X<operator, logical, xor> X<operator, logical, err>
+X<operator, logical, defined or> X<operator, logical, exclusive or>
+X<or> X<xor> X<err>
+
+Binary "or" returns the logical disjunction of the two surrounding
+expressions.  It's equivalent to || except for the very low precedence.
+This makes it useful for control flow
+
+    print FH $data		or die "Can't write to FH: $!";
+
+This means that it short-circuits: i.e., the right expression is evaluated
+only if the left expression is false.  Due to its precedence, you should
+probably avoid using this for assignment, only for control flow.
+
+    $a = $b or $c;		# bug: this is wrong
+    ($a = $b) or $c;		# really means this
+    $a = $b || $c;		# better written this way
+
+However, when it's a list-context assignment and you're trying to use
+"||" for control flow, you probably need "or" so that the assignment
+takes higher precedence.
+
+    @info = stat($file) || die;     # oops, scalar sense of stat!
+    @info = stat($file) or die;     # better, now @info gets its due
+
+Then again, you could always use parentheses. 
+
+Binary "xor" returns the exclusive-OR of the two surrounding expressions.
+It cannot short circuit, of course.
+
+=head2 C Operators Missing From Perl
+X<operator, missing from perl> X<&> X<*>
+X<typecasting> X<(TYPE)>
+
+Here is what C has that Perl doesn't:
+
+=over 8
+
+=item unary &
+
+Address-of operator.  (But see the "\" operator for taking a reference.)
+
+=item unary *
+
+Dereference-address operator. (Perl's prefix dereferencing
+operators are typed: $, @, %, and &.)
+
+=item (TYPE)
+
+Type-casting operator.
+
+=back
+
+=head2 Quote and Quote-like Operators
+X<operator, quote> X<operator, quote-like> X<q> X<qq> X<qx> X<qw> X<m> 
+X<qr> X<s> X<tr> X<'> X<''> X<"> X<""> X<//> X<`> X<``> X<<< << >>>
+X<escape sequence> X<escape>
+
+
+While we usually think of quotes as literal values, in Perl they
+function as operators, providing various kinds of interpolating and
+pattern matching capabilities.  Perl provides customary quote characters
+for these behaviors, but also provides a way for you to choose your
+quote character for any of them.  In the following table, a C<{}> represents
+any pair of delimiters you choose.
+
+    Customary  Generic        Meaning	     Interpolates
+	''	 q{}	      Literal		  no
+	""	qq{}	      Literal		  yes
+	``	qx{}	      Command		  yes*
+		qw{}	     Word list		  no
+	//	 m{}	   Pattern match	  yes*
+		qr{}	      Pattern		  yes*
+		 s{}{}	    Substitution	  yes*
+		tr{}{}	  Transliteration	  no (but see below)
+        <<EOF                 here-doc            yes*
+
+	* unless the delimiter is ''.
+
+Non-bracketing delimiters use the same character fore and aft, but the four
+sorts of brackets (round, angle, square, curly) will all nest, which means
+that
+
+	q{foo{bar}baz}
+
+is the same as
+
+	'foo{bar}baz'
+
+Note, however, that this does not always work for quoting Perl code:
+
+	$s = q{ if($a eq "}") ... }; # WRONG
+
+is a syntax error. The C<Text::Balanced> module (from CPAN, and
+starting from Perl 5.8 part of the standard distribution) is able
+to do this properly.
+
+There can be whitespace between the operator and the quoting
+characters, except when C<#> is being used as the quoting character.
+C<q#foo#> is parsed as the string C<foo>, while C<q #foo#> is the
+operator C<q> followed by a comment.  Its argument will be taken
+from the next line.  This allows you to write:
+
+    s {foo}  # Replace foo
+      {bar}  # with bar.
+
+The following escape sequences are available in constructs that interpolate
+and in transliterations.
+X<\t> X<\n> X<\r> X<\f> X<\b> X<\a> X<\e> X<\x> X<\0> X<\c> X<\N>
+
+    \t		tab             (HT, TAB)
+    \n		newline         (NL)
+    \r		return          (CR)
+    \f		form feed       (FF)
+    \b		backspace       (BS)
+    \a		alarm (bell)    (BEL)
+    \e		escape          (ESC)
+    \033	octal char	(ESC)
+    \x1b	hex char	(ESC)
+    \x{263a}	wide hex char	(SMILEY)
+    \c[		control char    (ESC)
+    \N{name}	named Unicode character
+
+B<NOTE>: Unlike C and other languages, Perl has no \v escape sequence for
+the vertical tab (VT - ASCII 11).
+
+The following escape sequences are available in constructs that interpolate
+but not in transliterations.
+X<\l> X<\u> X<\L> X<\U> X<\E> X<\Q>
+
+    \l		lowercase next char
+    \u		uppercase next char
+    \L		lowercase till \E
+    \U		uppercase till \E
+    \E		end case modification
+    \Q		quote non-word characters till \E
+
+If C<use locale> is in effect, the case map used by C<\l>, C<\L>,
+C<\u> and C<\U> is taken from the current locale.  See L<perllocale>.
+If Unicode (for example, C<\N{}> or wide hex characters of 0x100 or
+beyond) is being used, the case map used by C<\l>, C<\L>, C<\u> and
+C<\U> is as defined by Unicode.  For documentation of C<\N{name}>,
+see L<charnames>.
+
+All systems use the virtual C<"\n"> to represent a line terminator,
+called a "newline".  There is no such thing as an unvarying, physical
+newline character.  It is only an illusion that the operating system,
+device drivers, C libraries, and Perl all conspire to preserve.  Not all
+systems read C<"\r"> as ASCII CR and C<"\n"> as ASCII LF.  For example,
+on a Mac, these are reversed, and on systems without line terminator,
+printing C<"\n"> may emit no actual data.  In general, use C<"\n"> when
+you mean a "newline" for your system, but use the literal ASCII when you
+need an exact character.  For example, most networking protocols expect
+and prefer a CR+LF (C<"\015\012"> or C<"\cM\cJ">) for line terminators,
+and although they often accept just C<"\012">, they seldom tolerate just
+C<"\015">.  If you get in the habit of using C<"\n"> for networking,
+you may be burned some day.
+X<newline> X<line terminator> X<eol> X<end of line>
+X<\n> X<\r> X<\r\n>
+
+For constructs that do interpolate, variables beginning with "C<$>"
+or "C<@>" are interpolated.  Subscripted variables such as C<$a[3]> or
+C<< $href->{key}[0] >> are also interpolated, as are array and hash slices.
+But method calls such as C<< $obj->meth >> are not.
+
+Interpolating an array or slice interpolates the elements in order,
+separated by the value of C<$">, so is equivalent to interpolating
+C<join $", @array>.    "Punctuation" arrays such as C<@+> are only
+interpolated if the name is enclosed in braces C<@{+}>.
+
+You cannot include a literal C<$> or C<@> within a C<\Q> sequence. 
+An unescaped C<$> or C<@> interpolates the corresponding variable, 
+while escaping will cause the literal string C<\$> to be inserted.
+You'll need to write something like C<m/\Quser\E\@\Qhost/>. 
+
+Patterns are subject to an additional level of interpretation as a
+regular expression.  This is done as a second pass, after variables are
+interpolated, so that regular expressions may be incorporated into the
+pattern from the variables.  If this is not what you want, use C<\Q> to
+interpolate a variable literally.
+
+Apart from the behavior described above, Perl does not expand
+multiple levels of interpolation.  In particular, contrary to the
+expectations of shell programmers, back-quotes do I<NOT> interpolate
+within double quotes, nor do single quotes impede evaluation of
+variables when used within double quotes.
+
+=head2 Regexp Quote-Like Operators
+X<operator, regexp>
+
+Here are the quote-like operators that apply to pattern
+matching and related activities.
+
+=over 8
+
+=item ?PATTERN?
+X<?>
+
+This is just like the C</pattern/> search, except that it matches only
+once between calls to the reset() operator.  This is a useful
+optimization when you want to see only the first occurrence of
+something in each file of a set of files, for instance.  Only C<??>
+patterns local to the current package are reset.
+
+    while (<>) {
+	if (?^$?) {
+			    # blank line between header and body
+	}
+    } continue {
+	reset if eof;	    # clear ?? status for next file
+    }
+
+This usage is vaguely deprecated, which means it just might possibly
+be removed in some distant future version of Perl, perhaps somewhere
+around the year 2168.
+
+=item m/PATTERN/cgimosx
+X<m> X<operator, match> 
+X<regexp, options> X<regexp> X<regex, options> X<regex> 
+X</c> X</i> X</m> X</o> X</s> X</x>
+
+=item /PATTERN/cgimosx
+
+Searches a string for a pattern match, and in scalar context returns
+true if it succeeds, false if it fails.  If no string is specified
+via the C<=~> or C<!~> operator, the $_ string is searched.  (The
+string specified with C<=~> need not be an lvalue--it may be the
+result of an expression evaluation, but remember the C<=~> binds
+rather tightly.)  See also L<perlre>.  See L<perllocale> for
+discussion of additional considerations that apply when C<use locale>
+is in effect.
+
+Options are:
+
+    c	Do not reset search position on a failed match when /g is in effect.
+    g	Match globally, i.e., find all occurrences.
+    i	Do case-insensitive pattern matching.
+    m	Treat string as multiple lines.
+    o	Compile pattern only once.
+    s	Treat string as single line.
+    x	Use extended regular expressions.
+
+If "/" is the delimiter then the initial C<m> is optional.  With the C<m>
+you can use any pair of non-alphanumeric, non-whitespace characters 
+as delimiters.  This is particularly useful for matching path names
+that contain "/", to avoid LTS (leaning toothpick syndrome).  If "?" is
+the delimiter, then the match-only-once rule of C<?PATTERN?> applies.
+If "'" is the delimiter, no interpolation is performed on the PATTERN.
+
+PATTERN may contain variables, which will be interpolated (and the
+pattern recompiled) every time the pattern search is evaluated, except
+for when the delimiter is a single quote.  (Note that C<$(>, C<$)>, and
+C<$|> are not interpolated because they look like end-of-string tests.)
+If you want such a pattern to be compiled only once, add a C</o> after
+the trailing delimiter.  This avoids expensive run-time recompilations,
+and is useful when the value you are interpolating won't change over
+the life of the script.  However, mentioning C</o> constitutes a promise
+that you won't change the variables in the pattern.  If you change them,
+Perl won't even notice.  See also L<"qr/STRING/imosx">.
+
+If the PATTERN evaluates to the empty string, the last
+I<successfully> matched regular expression is used instead. In this
+case, only the C<g> and C<c> flags on the empty pattern is honoured -
+the other flags are taken from the original pattern. If no match has
+previously succeeded, this will (silently) act instead as a genuine
+empty pattern (which will always match).
+
+If the C</g> option is not used, C<m//> in list context returns a
+list consisting of the subexpressions matched by the parentheses in the
+pattern, i.e., (C<$1>, C<$2>, C<$3>...).  (Note that here C<$1> etc. are
+also set, and that this differs from Perl 4's behavior.)  When there are
+no parentheses in the pattern, the return value is the list C<(1)> for
+success.  With or without parentheses, an empty list is returned upon
+failure.
+
+Examples:
+
+    open(TTY, '/dev/tty');
+    <TTY> =~ /^y/i && foo();	# do foo if desired
+
+    if (/Version: *([0-9.]*)/) { $version = $1; }
+
+    next if m#^/usr/spool/uucp#;
+
+    # poor man's grep
+    $arg = shift;
+    while (<>) {
+	print if /$arg/o;	# compile only once
+    }
+
+    if (($F1, $F2, $Etc) = ($foo =~ /^(\S+)\s+(\S+)\s*(.*)/))
+
+This last example splits $foo into the first two words and the
+remainder of the line, and assigns those three fields to $F1, $F2, and
+$Etc.  The conditional is true if any variables were assigned, i.e., if
+the pattern matched.
+
+The C</g> modifier specifies global pattern matching--that is,
+matching as many times as possible within the string.  How it behaves
+depends on the context.  In list context, it returns a list of the
+substrings matched by any capturing parentheses in the regular
+expression.  If there are no parentheses, it returns a list of all
+the matched strings, as if there were parentheses around the whole
+pattern.
+
+In scalar context, each execution of C<m//g> finds the next match,
+returning true if it matches, and false if there is no further match.
+The position after the last match can be read or set using the pos()
+function; see L<perlfunc/pos>.   A failed match normally resets the
+search position to the beginning of the string, but you can avoid that
+by adding the C</c> modifier (e.g. C<m//gc>).  Modifying the target
+string also resets the search position.
+
+You can intermix C<m//g> matches with C<m/\G.../g>, where C<\G> is a
+zero-width assertion that matches the exact position where the previous
+C<m//g>, if any, left off.  Without the C</g> modifier, the C<\G> assertion
+still anchors at pos(), but the match is of course only attempted once.
+Using C<\G> without C</g> on a target string that has not previously had a
+C</g> match applied to it is the same as using the C<\A> assertion to match
+the beginning of the string.  Note also that, currently, C<\G> is only
+properly supported when anchored at the very beginning of the pattern.
+
+Examples:
+
+    # list context
+    ($one,$five,$fifteen) = (`uptime` =~ /(\d+\.\d+)/g);
+
+    # scalar context
+    $/ = "";
+    while (defined($paragraph = <>)) {
+	while ($paragraph =~ /[a-z]['")]*[.!?]+['")]*\s/g) {
+	    $sentences++;
+	}
+    }
+    print "$sentences\n";
+
+    # using m//gc with \G
+    $_ = "ppooqppqq";
+    while ($i++ < 2) {
+        print "1: '";
+        print $1 while /(o)/gc; print "', pos=", pos, "\n";
+        print "2: '";
+        print $1 if /\G(q)/gc;  print "', pos=", pos, "\n";
+        print "3: '";
+        print $1 while /(p)/gc; print "', pos=", pos, "\n";
+    }
+    print "Final: '$1', pos=",pos,"\n" if /\G(.)/;
+
+The last example should print:
+
+    1: 'oo', pos=4
+    2: 'q', pos=5
+    3: 'pp', pos=7
+    1: '', pos=7
+    2: 'q', pos=8
+    3: '', pos=8
+    Final: 'q', pos=8
+
+Notice that the final match matched C<q> instead of C<p>, which a match
+without the C<\G> anchor would have done. Also note that the final match
+did not update C<pos> -- C<pos> is only updated on a C</g> match. If the
+final match did indeed match C<p>, it's a good bet that you're running an
+older (pre-5.6.0) Perl.
+
+A useful idiom for C<lex>-like scanners is C</\G.../gc>.  You can
+combine several regexps like this to process a string part-by-part,
+doing different actions depending on which regexp matched.  Each
+regexp tries to match where the previous one leaves off.
+
+ $_ = <<'EOL';
+      $url = new URI::URL "http://www/";   die if $url eq "xXx";
+ EOL
+ LOOP:
+    {
+      print(" digits"),		redo LOOP if /\G\d+\b[,.;]?\s*/gc;
+      print(" lowercase"),	redo LOOP if /\G[a-z]+\b[,.;]?\s*/gc;
+      print(" UPPERCASE"),	redo LOOP if /\G[A-Z]+\b[,.;]?\s*/gc;
+      print(" Capitalized"),	redo LOOP if /\G[A-Z][a-z]+\b[,.;]?\s*/gc;
+      print(" MiXeD"),		redo LOOP if /\G[A-Za-z]+\b[,.;]?\s*/gc;
+      print(" alphanumeric"),	redo LOOP if /\G[A-Za-z0-9]+\b[,.;]?\s*/gc;
+      print(" line-noise"),	redo LOOP if /\G[^A-Za-z0-9]+/gc;
+      print ". That's all!\n";
+    }
+
+Here is the output (split into several lines):
+
+ line-noise lowercase line-noise lowercase UPPERCASE line-noise
+ UPPERCASE line-noise lowercase line-noise lowercase line-noise
+ lowercase lowercase line-noise lowercase lowercase line-noise
+ MiXeD line-noise. That's all!
+
+=item q/STRING/
+X<q> X<quote, double> X<'> X<''>
+
+=item C<'STRING'>
+
+A single-quoted, literal string.  A backslash represents a backslash
+unless followed by the delimiter or another backslash, in which case
+the delimiter or backslash is interpolated.
+
+    $foo = q!I said, "You said, 'She said it.'"!;
+    $bar = q('This is it.');
+    $baz = '\n';		# a two-character string
+
+=item qq/STRING/
+X<qq> X<quote, double> X<"> X<"">
+
+=item "STRING"
+
+A double-quoted, interpolated string.
+
+    $_ .= qq
+     (*** The previous line contains the naughty word "$1".\n)
+		if /\b(tcl|java|python)\b/i;      # :-)
+    $baz = "\n";		# a one-character string
+
+=item qr/STRING/imosx
+X<qr> X</i> X</m> X</o> X</s> X</x>
+
+This operator quotes (and possibly compiles) its I<STRING> as a regular
+expression.  I<STRING> is interpolated the same way as I<PATTERN>
+in C<m/PATTERN/>.  If "'" is used as the delimiter, no interpolation
+is done.  Returns a Perl value which may be used instead of the
+corresponding C</STRING/imosx> expression.
+
+For example,
+
+    $rex = qr/my.STRING/is;
+    s/$rex/foo/;
+
+is equivalent to
+
+    s/my.STRING/foo/is;
+
+The result may be used as a subpattern in a match:
+
+    $re = qr/$pattern/;
+    $string =~ /foo${re}bar/;	# can be interpolated in other patterns
+    $string =~ $re;		# or used standalone
+    $string =~ /$re/;		# or this way
+
+Since Perl may compile the pattern at the moment of execution of qr()
+operator, using qr() may have speed advantages in some situations,
+notably if the result of qr() is used standalone:
+
+    sub match {
+	my $patterns = shift;
+	my @compiled = map qr/$_/i, @$patterns;
+	grep {
+	    my $success = 0;
+	    foreach my $pat (@compiled) {
+		$success = 1, last if /$pat/;
+	    }
+	    $success;
+	} @_;
+    }
+
+Precompilation of the pattern into an internal representation at
+the moment of qr() avoids a need to recompile the pattern every
+time a match C</$pat/> is attempted.  (Perl has many other internal
+optimizations, but none would be triggered in the above example if
+we did not use qr() operator.)
+
+Options are:
+
+    i	Do case-insensitive pattern matching.
+    m	Treat string as multiple lines.
+    o	Compile pattern only once.
+    s	Treat string as single line.
+    x	Use extended regular expressions.
+
+See L<perlre> for additional information on valid syntax for STRING, and
+for a detailed look at the semantics of regular expressions.
+
+=item qx/STRING/
+X<qx> X<`> X<``> X<backtick>
+
+=item `STRING`
+
+A string which is (possibly) interpolated and then executed as a
+system command with C</bin/sh> or its equivalent.  Shell wildcards,
+pipes, and redirections will be honored.  The collected standard
+output of the command is returned; standard error is unaffected.  In
+scalar context, it comes back as a single (potentially multi-line)
+string, or undef if the command failed.  In list context, returns a
+list of lines (however you've defined lines with $/ or
+$INPUT_RECORD_SEPARATOR), or an empty list if the command failed.
+
+Because backticks do not affect standard error, use shell file descriptor
+syntax (assuming the shell supports this) if you care to address this.
+To capture a command's STDERR and STDOUT together:
+
+    $output = `cmd 2>&1`;
+
+To capture a command's STDOUT but discard its STDERR:
+
+    $output = `cmd 2>/dev/null`;
+
+To capture a command's STDERR but discard its STDOUT (ordering is
+important here):
+
+    $output = `cmd 2>&1 1>/dev/null`;
+
+To exchange a command's STDOUT and STDERR in order to capture the STDERR
+but leave its STDOUT to come out the old STDERR:
+
+    $output = `cmd 3>&1 1>&2 2>&3 3>&-`;
+
+To read both a command's STDOUT and its STDERR separately, it's easiest
+to redirect them separately to files, and then read from those files
+when the program is done:
+
+    system("program args 1>program.stdout 2>program.stderr");
+
+Using single-quote as a delimiter protects the command from Perl's
+double-quote interpolation, passing it on to the shell instead:
+
+    $perl_info  = qx(ps $$);            # that's Perl's $$
+    $shell_info = qx'ps $$';            # that's the new shell's $$
+
+How that string gets evaluated is entirely subject to the command
+interpreter on your system.  On most platforms, you will have to protect
+shell metacharacters if you want them treated literally.  This is in
+practice difficult to do, as it's unclear how to escape which characters.
+See L<perlsec> for a clean and safe example of a manual fork() and exec()
+to emulate backticks safely.
+
+On some platforms (notably DOS-like ones), the shell may not be
+capable of dealing with multiline commands, so putting newlines in
+the string may not get you what you want.  You may be able to evaluate
+multiple commands in a single line by separating them with the command
+separator character, if your shell supports that (e.g. C<;> on many Unix
+shells; C<&> on the Windows NT C<cmd> shell).
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before starting the child process, but this may not be supported
+on some platforms (see L<perlport>).  To be safe, you may need to set
+C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method of
+C<IO::Handle> on any open handles.
+
+Beware that some command shells may place restrictions on the length
+of the command line.  You must ensure your strings don't exceed this
+limit after any necessary interpolations.  See the platform-specific
+release notes for more details about your particular environment.
+
+Using this operator can lead to programs that are difficult to port,
+because the shell commands called vary between systems, and may in
+fact not be present at all.  As one example, the C<type> command under
+the POSIX shell is very different from the C<type> command under DOS.
+That doesn't mean you should go out of your way to avoid backticks
+when they're the right way to get something done.  Perl was made to be
+a glue language, and one of the things it glues together is commands.
+Just understand what you're getting yourself into.
+
+See L<"I/O Operators"> for more discussion.
+
+=item qw/STRING/
+X<qw> X<quote, list> X<quote, words>
+
+Evaluates to a list of the words extracted out of STRING, using embedded
+whitespace as the word delimiters.  It can be understood as being roughly
+equivalent to:
+
+    split(' ', q/STRING/);
+
+the differences being that it generates a real list at compile time, and
+in scalar context it returns the last element in the list.  So
+this expression:
+
+    qw(foo bar baz)
+
+is semantically equivalent to the list:
+
+    'foo', 'bar', 'baz'
+
+Some frequently seen examples:
+
+    use POSIX qw( setlocale localeconv )
+    @EXPORT = qw( foo bar baz );
+
+A common mistake is to try to separate the words with comma or to
+put comments into a multi-line C<qw>-string.  For this reason, the
+C<use warnings> pragma and the B<-w> switch (that is, the C<$^W> variable) 
+produces warnings if the STRING contains the "," or the "#" character.
+
+=item s/PATTERN/REPLACEMENT/egimosx
+X<substitute> X<substitution> X<replace> X<regexp, replace>
+X<regexp, substitute> X</e> X</g> X</i> X</m> X</o> X</s> X</x>
+
+Searches a string for a pattern, and if found, replaces that pattern
+with the replacement text and returns the number of substitutions
+made.  Otherwise it returns false (specifically, the empty string).
+
+If no string is specified via the C<=~> or C<!~> operator, the C<$_>
+variable is searched and modified.  (The string specified with C<=~> must
+be scalar variable, an array element, a hash element, or an assignment
+to one of those, i.e., an lvalue.)
+
+If the delimiter chosen is a single quote, no interpolation is
+done on either the PATTERN or the REPLACEMENT.  Otherwise, if the
+PATTERN contains a $ that looks like a variable rather than an
+end-of-string test, the variable will be interpolated into the pattern
+at run-time.  If you want the pattern compiled only once the first time
+the variable is interpolated, use the C</o> option.  If the pattern
+evaluates to the empty string, the last successfully executed regular
+expression is used instead.  See L<perlre> for further explanation on these.
+See L<perllocale> for discussion of additional considerations that apply
+when C<use locale> is in effect.
+
+Options are:
+
+    e	Evaluate the right side as an expression.
+    g	Replace globally, i.e., all occurrences.
+    i	Do case-insensitive pattern matching.
+    m	Treat string as multiple lines.
+    o	Compile pattern only once.
+    s	Treat string as single line.
+    x	Use extended regular expressions.
+
+Any non-alphanumeric, non-whitespace delimiter may replace the
+slashes.  If single quotes are used, no interpretation is done on the
+replacement string (the C</e> modifier overrides this, however).  Unlike
+Perl 4, Perl 5 treats backticks as normal delimiters; the replacement
+text is not evaluated as a command.  If the
+PATTERN is delimited by bracketing quotes, the REPLACEMENT has its own
+pair of quotes, which may or may not be bracketing quotes, e.g.,
+C<s(foo)(bar)> or C<< s<foo>/bar/ >>.  A C</e> will cause the
+replacement portion to be treated as a full-fledged Perl expression
+and evaluated right then and there.  It is, however, syntax checked at
+compile-time. A second C<e> modifier will cause the replacement portion
+to be C<eval>ed before being run as a Perl expression.
+
+Examples:
+
+    s/\bgreen\b/mauve/g;		# don't change wintergreen
+
+    $path =~ s|/usr/bin|/usr/local/bin|;
+
+    s/Login: $foo/Login: $bar/; # run-time pattern
+
+    ($foo = $bar) =~ s/this/that/;	# copy first, then change
+
+    $count = ($paragraph =~ s/Mister\b/Mr./g);  # get change-count
+
+    $_ = 'abc123xyz';
+    s/\d+/$&*2/e;		# yields 'abc246xyz'
+    s/\d+/sprintf("%5d",$&)/e;	# yields 'abc  246xyz'
+    s/\w/$& x 2/eg;		# yields 'aabbcc  224466xxyyzz'
+
+    s/%(.)/$percent{$1}/g;	# change percent escapes; no /e
+    s/%(.)/$percent{$1} || $&/ge;	# expr now, so /e
+    s/^=(\w+)/&pod($1)/ge;	# use function call
+
+    # expand variables in $_, but dynamics only, using
+    # symbolic dereferencing
+    s/\$(\w+)/${$1}/g;
+
+    # Add one to the value of any numbers in the string
+    s/(\d+)/1 + $1/eg;
+
+    # This will expand any embedded scalar variable
+    # (including lexicals) in $_ : First $1 is interpolated
+    # to the variable name, and then evaluated
+    s/(\$\w+)/$1/eeg;
+
+    # Delete (most) C comments.
+    $program =~ s {
+	/\*	# Match the opening delimiter.
+	.*?	# Match a minimal number of characters.
+	\*/	# Match the closing delimiter.
+    } []gsx;
+
+    s/^\s*(.*?)\s*$/$1/;	# trim whitespace in $_, expensively
+
+    for ($variable) {		# trim whitespace in $variable, cheap
+	s/^\s+//;
+	s/\s+$//;
+    }
+
+    s/([^ ]*) *([^ ]*)/$2 $1/;	# reverse 1st two fields
+
+Note the use of $ instead of \ in the last example.  Unlike
+B<sed>, we use the \<I<digit>> form in only the left hand side.
+Anywhere else it's $<I<digit>>.
+
+Occasionally, you can't use just a C</g> to get all the changes
+to occur that you might want.  Here are two common cases:
+
+    # put commas in the right places in an integer
+    1 while s/(\d)(\d\d\d)(?!\d)/$1,$2/g;  
+
+    # expand tabs to 8-column spacing
+    1 while s/\t+/' ' x (length($&)*8 - length($`)%8)/e;
+
+=item tr/SEARCHLIST/REPLACEMENTLIST/cds
+X<tr> X<y> X<transliterate> X</c> X</d> X</s>
+
+=item y/SEARCHLIST/REPLACEMENTLIST/cds
+
+Transliterates all occurrences of the characters found in the search list
+with the corresponding character in the replacement list.  It returns
+the number of characters replaced or deleted.  If no string is
+specified via the =~ or !~ operator, the $_ string is transliterated.  (The
+string specified with =~ must be a scalar variable, an array element, a
+hash element, or an assignment to one of those, i.e., an lvalue.)
+
+A character range may be specified with a hyphen, so C<tr/A-J/0-9/> 
+does the same replacement as C<tr/ACEGIBDFHJ/0246813579/>.
+For B<sed> devotees, C<y> is provided as a synonym for C<tr>.  If the
+SEARCHLIST is delimited by bracketing quotes, the REPLACEMENTLIST has
+its own pair of quotes, which may or may not be bracketing quotes,
+e.g., C<tr[A-Z][a-z]> or C<tr(+\-*/)/ABCD/>.
+
+Note that C<tr> does B<not> do regular expression character classes
+such as C<\d> or C<[:lower:]>.  The <tr> operator is not equivalent to
+the tr(1) utility.  If you want to map strings between lower/upper
+cases, see L<perlfunc/lc> and L<perlfunc/uc>, and in general consider
+using the C<s> operator if you need regular expressions.
+
+Note also that the whole range idea is rather unportable between
+character sets--and even within character sets they may cause results
+you probably didn't expect.  A sound principle is to use only ranges
+that begin from and end at either alphabets of equal case (a-e, A-E),
+or digits (0-4).  Anything else is unsafe.  If in doubt, spell out the
+character sets in full.
+
+Options:
+
+    c	Complement the SEARCHLIST.
+    d	Delete found but unreplaced characters.
+    s	Squash duplicate replaced characters.
+
+If the C</c> modifier is specified, the SEARCHLIST character set
+is complemented.  If the C</d> modifier is specified, any characters
+specified by SEARCHLIST not found in REPLACEMENTLIST are deleted.
+(Note that this is slightly more flexible than the behavior of some
+B<tr> programs, which delete anything they find in the SEARCHLIST,
+period.) If the C</s> modifier is specified, sequences of characters
+that were transliterated to the same character are squashed down
+to a single instance of the character.
+
+If the C</d> modifier is used, the REPLACEMENTLIST is always interpreted
+exactly as specified.  Otherwise, if the REPLACEMENTLIST is shorter
+than the SEARCHLIST, the final character is replicated till it is long
+enough.  If the REPLACEMENTLIST is empty, the SEARCHLIST is replicated.
+This latter is useful for counting characters in a class or for
+squashing character sequences in a class.
+
+Examples:
+
+    $ARGV[1] =~ tr/A-Z/a-z/;	# canonicalize to lower case
+
+    $cnt = tr/*/*/;		# count the stars in $_
+
+    $cnt = $sky =~ tr/*/*/;	# count the stars in $sky
+
+    $cnt = tr/0-9//;		# count the digits in $_
+
+    tr/a-zA-Z//s;		# bookkeeper -> bokeper
+
+    ($HOST = $host) =~ tr/a-z/A-Z/;
+
+    tr/a-zA-Z/ /cs;		# change non-alphas to single space
+
+    tr [\200-\377]
+       [\000-\177];		# delete 8th bit
+
+If multiple transliterations are given for a character, only the
+first one is used:
+
+    tr/AAA/XYZ/
+
+will transliterate any A to X.
+
+Because the transliteration table is built at compile time, neither
+the SEARCHLIST nor the REPLACEMENTLIST are subjected to double quote
+interpolation.  That means that if you want to use variables, you
+must use an eval():
+
+    eval "tr/$oldlist/$newlist/";
+    die $@ if $@;
+
+    eval "tr/$oldlist/$newlist/, 1" or die $@;
+
+=item <<EOF
+X<here-doc> X<heredoc> X<here-document> X<<< << >>>
+
+A line-oriented form of quoting is based on the shell "here-document"
+syntax.  Following a C<< << >> you specify a string to terminate
+the quoted material, and all lines following the current line down to
+the terminating string are the value of the item.  The terminating
+string may be either an identifier (a word), or some quoted text.  If
+quoted, the type of quotes you use determines the treatment of the
+text, just as in regular quoting.  An unquoted identifier works like
+double quotes.  There must be no space between the C<< << >> and
+the identifier, unless the identifier is quoted.  (If you put a space it
+will be treated as a null identifier, which is valid, and matches the first
+empty line.)  The terminating string must appear by itself (unquoted and
+with no surrounding whitespace) on the terminating line.
+
+       print <<EOF;
+    The price is $Price.
+    EOF
+
+       print << "EOF"; # same as above
+    The price is $Price.
+    EOF
+
+       print << `EOC`; # execute commands
+    echo hi there
+    echo lo there
+    EOC
+
+       print <<"foo", <<"bar"; # you can stack them
+    I said foo.
+    foo
+    I said bar.
+    bar
+
+       myfunc(<< "THIS", 23, <<'THAT');
+    Here's a line
+    or two.
+    THIS
+    and here's another.
+    THAT
+
+Just don't forget that you have to put a semicolon on the end
+to finish the statement, as Perl doesn't know you're not going to
+try to do this:
+
+       print <<ABC
+    179231
+    ABC
+       + 20;
+
+If you want your here-docs to be indented with the 
+rest of the code, you'll need to remove leading whitespace
+from each line manually:
+
+    ($quote = <<'FINIS') =~ s/^\s+//gm;
+       The Road goes ever on and on, 
+       down from the door where it began.
+    FINIS
+
+If you use a here-doc within a delimited construct, such as in C<s///eg>,
+the quoted material must come on the lines following the final delimiter.
+So instead of
+
+    s/this/<<E . 'that'
+    the other
+    E
+     . 'more '/eg;
+
+you have to write
+
+    s/this/<<E . 'that' 
+     . 'more '/eg; 
+    the other 
+    E 
+
+If the terminating identifier is on the last line of the program, you
+must be sure there is a newline after it; otherwise, Perl will give the
+warning B<Can't find string terminator "END" anywhere before EOF...>.
+
+Additionally, the quoting rules for the identifier are not related to
+Perl's quoting rules -- C<q()>, C<qq()>, and the like are not supported
+in place of C<''> and C<"">, and the only interpolation is for backslashing
+the quoting character:
+
+    print << "abc\"def";
+    testing...
+    abc"def
+
+Finally, quoted strings cannot span multiple lines.  The general rule is
+that the identifier must be a string literal.  Stick with that, and you
+should be safe.
+
+=back
+
+=head2 Gory details of parsing quoted constructs
+X<quote, gory details>
+
+When presented with something that might have several different
+interpretations, Perl uses the B<DWIM> (that's "Do What I Mean")
+principle to pick the most probable interpretation.  This strategy
+is so successful that Perl programmers often do not suspect the
+ambivalence of what they write.  But from time to time, Perl's
+notions differ substantially from what the author honestly meant.
+
+This section hopes to clarify how Perl handles quoted constructs.
+Although the most common reason to learn this is to unravel labyrinthine
+regular expressions, because the initial steps of parsing are the
+same for all quoting operators, they are all discussed together.
+
+The most important Perl parsing rule is the first one discussed
+below: when processing a quoted construct, Perl first finds the end
+of that construct, then interprets its contents.  If you understand
+this rule, you may skip the rest of this section on the first
+reading.  The other rules are likely to contradict the user's
+expectations much less frequently than this first one.
+
+Some passes discussed below are performed concurrently, but because
+their results are the same, we consider them individually.  For different
+quoting constructs, Perl performs different numbers of passes, from
+one to five, but these passes are always performed in the same order.
+
+=over 4
+
+=item Finding the end
+
+The first pass is finding the end of the quoted construct, whether
+it be a multicharacter delimiter C<"\nEOF\n"> in the C<<<EOF>
+construct, a C</> that terminates a C<qq//> construct, a C<]> which
+terminates C<qq[]> construct, or a C<< > >> which terminates a
+fileglob started with C<< < >>.
+
+When searching for single-character non-pairing delimiters, such
+as C</>, combinations of C<\\> and C<\/> are skipped.  However,
+when searching for single-character pairing delimiter like C<[>,
+combinations of C<\\>, C<\]>, and C<\[> are all skipped, and nested
+C<[>, C<]> are skipped as well.  When searching for multicharacter
+delimiters, nothing is skipped.
+
+For constructs with three-part delimiters (C<s///>, C<y///>, and
+C<tr///>), the search is repeated once more.
+
+During this search no attention is paid to the semantics of the construct.
+Thus:
+
+    "$hash{"$foo/$bar"}"
+
+or:
+
+    m/ 
+      bar	# NOT a comment, this slash / terminated m//!
+     /x
+
+do not form legal quoted expressions.   The quoted part ends on the
+first C<"> and C</>, and the rest happens to be a syntax error.
+Because the slash that terminated C<m//> was followed by a C<SPACE>,
+the example above is not C<m//x>, but rather C<m//> with no C</x>
+modifier.  So the embedded C<#> is interpreted as a literal C<#>.
+
+Also no attention is paid to C<\c\> during this search.
+Thus the second C<\> in C<qq/\c\/> is interpreted as a part of C<\/>,
+and the following C</> is not recognized as a delimiter.
+Instead, use C<\034> or C<\x1c> at the end of quoted constructs.
+
+=item Removal of backslashes before delimiters
+
+During the second pass, text between the starting and ending
+delimiters is copied to a safe location, and the C<\> is removed
+from combinations consisting of C<\> and delimiter--or delimiters,
+meaning both starting and ending delimiters will should these differ.
+This removal does not happen for multi-character delimiters.
+Note that the combination C<\\> is left intact, just as it was.
+
+Starting from this step no information about the delimiters is
+used in parsing.
+
+=item Interpolation
+X<interpolation>
+
+The next step is interpolation in the text obtained, which is now
+delimiter-independent.  There are four different cases.
+
+=over 4
+
+=item C<<<'EOF'>, C<m''>, C<s'''>, C<tr///>, C<y///>
+
+No interpolation is performed.
+
+=item C<''>, C<q//>
+
+The only interpolation is removal of C<\> from pairs C<\\>.
+
+=item C<"">, C<``>, C<qq//>, C<qx//>, C<< <file*glob> >>
+
+C<\Q>, C<\U>, C<\u>, C<\L>, C<\l> (possibly paired with C<\E>) are
+converted to corresponding Perl constructs.  Thus, C<"$foo\Qbaz$bar">
+is converted to C<$foo . (quotemeta("baz" . $bar))> internally.
+The other combinations are replaced with appropriate expansions.
+
+Let it be stressed that I<whatever falls between C<\Q> and C<\E>>
+is interpolated in the usual way.  Something like C<"\Q\\E"> has
+no C<\E> inside.  instead, it has C<\Q>, C<\\>, and C<E>, so the
+result is the same as for C<"\\\\E">.  As a general rule, backslashes
+between C<\Q> and C<\E> may lead to counterintuitive results.  So,
+C<"\Q\t\E"> is converted to C<quotemeta("\t")>, which is the same
+as C<"\\\t"> (since TAB is not alphanumeric).  Note also that:
+
+  $str = '\t';
+  return "\Q$str";
+
+may be closer to the conjectural I<intention> of the writer of C<"\Q\t\E">.
+
+Interpolated scalars and arrays are converted internally to the C<join> and
+C<.> catenation operations.  Thus, C<"$foo XXX '@arr'"> becomes:
+
+  $foo . " XXX '" . (join $", @arr) . "'";
+
+All operations above are performed simultaneously, left to right.
+
+Because the result of C<"\Q STRING \E"> has all metacharacters
+quoted, there is no way to insert a literal C<$> or C<@> inside a
+C<\Q\E> pair.  If protected by C<\>, C<$> will be quoted to became
+C<"\\\$">; if not, it is interpreted as the start of an interpolated
+scalar.
+
+Note also that the interpolation code needs to make a decision on
+where the interpolated scalar ends.  For instance, whether 
+C<< "a $b -> {c}" >> really means:
+
+  "a " . $b . " -> {c}";
+
+or:
+
+  "a " . $b -> {c};
+
+Most of the time, the longest possible text that does not include
+spaces between components and which contains matching braces or
+brackets.  because the outcome may be determined by voting based
+on heuristic estimators, the result is not strictly predictable.
+Fortunately, it's usually correct for ambiguous cases.
+
+=item C<?RE?>, C</RE/>, C<m/RE/>, C<s/RE/foo/>, 
+
+Processing of C<\Q>, C<\U>, C<\u>, C<\L>, C<\l>, and interpolation
+happens (almost) as with C<qq//> constructs, but the substitution
+of C<\> followed by RE-special chars (including C<\>) is not
+performed.  Moreover, inside C<(?{BLOCK})>, C<(?# comment )>, and
+a C<#>-comment in a C<//x>-regular expression, no processing is
+performed whatsoever.  This is the first step at which the presence
+of the C<//x> modifier is relevant.
+
+Interpolation has several quirks: C<$|>, C<$(>, and C<$)> are not
+interpolated, and constructs C<$var[SOMETHING]> are voted (by several
+different estimators) to be either an array element or C<$var>
+followed by an RE alternative.  This is where the notation
+C<${arr[$bar]}> comes handy: C</${arr[0-9]}/> is interpreted as
+array element C<-9>, not as a regular expression from the variable
+C<$arr> followed by a digit, which would be the interpretation of
+C</$arr[0-9]/>.  Since voting among different estimators may occur,
+the result is not predictable.
+
+It is at this step that C<\1> is begrudgingly converted to C<$1> in
+the replacement text of C<s///> to correct the incorrigible
+I<sed> hackers who haven't picked up the saner idiom yet.  A warning
+is emitted if the C<use warnings> pragma or the B<-w> command-line flag
+(that is, the C<$^W> variable) was set.
+
+The lack of processing of C<\\> creates specific restrictions on
+the post-processed text.  If the delimiter is C</>, one cannot get
+the combination C<\/> into the result of this step.  C</> will
+finish the regular expression, C<\/> will be stripped to C</> on
+the previous step, and C<\\/> will be left as is.  Because C</> is
+equivalent to C<\/> inside a regular expression, this does not
+matter unless the delimiter happens to be character special to the
+RE engine, such as in C<s*foo*bar*>, C<m[foo]>, or C<?foo?>; or an
+alphanumeric char, as in:
+
+  m m ^ a \s* b mmx;
+
+In the RE above, which is intentionally obfuscated for illustration, the
+delimiter is C<m>, the modifier is C<mx>, and after backslash-removal the
+RE is the same as for C<m/ ^ a \s* b /mx>.  There's more than one 
+reason you're encouraged to restrict your delimiters to non-alphanumeric,
+non-whitespace choices.
+
+=back
+
+This step is the last one for all constructs except regular expressions,
+which are processed further.
+
+=item Interpolation of regular expressions
+X<regexp, interpolation>
+
+Previous steps were performed during the compilation of Perl code,
+but this one happens at run time--although it may be optimized to
+be calculated at compile time if appropriate.  After preprocessing
+described above, and possibly after evaluation if catenation,
+joining, casing translation, or metaquoting are involved, the
+resulting I<string> is passed to the RE engine for compilation.
+
+Whatever happens in the RE engine might be better discussed in L<perlre>,
+but for the sake of continuity, we shall do so here.
+
+This is another step where the presence of the C<//x> modifier is
+relevant.  The RE engine scans the string from left to right and
+converts it to a finite automaton.
+
+Backslashed characters are either replaced with corresponding
+literal strings (as with C<\{>), or else they generate special nodes
+in the finite automaton (as with C<\b>).  Characters special to the
+RE engine (such as C<|>) generate corresponding nodes or groups of
+nodes.  C<(?#...)> comments are ignored.  All the rest is either
+converted to literal strings to match, or else is ignored (as is
+whitespace and C<#>-style comments if C<//x> is present).
+
+Parsing of the bracketed character class construct, C<[...]>, is
+rather different than the rule used for the rest of the pattern.
+The terminator of this construct is found using the same rules as
+for finding the terminator of a C<{}>-delimited construct, the only
+exception being that C<]> immediately following C<[> is treated as
+though preceded by a backslash.  Similarly, the terminator of
+C<(?{...})> is found using the same rules as for finding the
+terminator of a C<{}>-delimited construct.
+
+It is possible to inspect both the string given to RE engine and the
+resulting finite automaton.  See the arguments C<debug>/C<debugcolor>
+in the C<use L<re>> pragma, as well as Perl's B<-Dr> command-line
+switch documented in L<perlrun/"Command Switches">.
+
+=item Optimization of regular expressions
+X<regexp, optimization>
+
+This step is listed for completeness only.  Since it does not change
+semantics, details of this step are not documented and are subject
+to change without notice.  This step is performed over the finite
+automaton that was generated during the previous pass.
+
+It is at this stage that C<split()> silently optimizes C</^/> to
+mean C</^/m>.
+
+=back
+
+=head2 I/O Operators
+X<operator, i/o> X<operator, io> X<io> X<while> X<filehandle>
+X<< <> >> X<@ARGV>
+
+There are several I/O operators you should know about.
+
+A string enclosed by backticks (grave accents) first undergoes
+double-quote interpolation.  It is then interpreted as an external
+command, and the output of that command is the value of the
+backtick string, like in a shell.  In scalar context, a single string
+consisting of all output is returned.  In list context, a list of
+values is returned, one per line of output.  (You can set C<$/> to use
+a different line terminator.)  The command is executed each time the
+pseudo-literal is evaluated.  The status value of the command is
+returned in C<$?> (see L<perlvar> for the interpretation of C<$?>).
+Unlike in B<csh>, no translation is done on the return data--newlines
+remain newlines.  Unlike in any of the shells, single quotes do not
+hide variable names in the command from interpretation.  To pass a
+literal dollar-sign through to the shell you need to hide it with a
+backslash.  The generalized form of backticks is C<qx//>.  (Because
+backticks always undergo shell expansion as well, see L<perlsec> for
+security concerns.)
+X<qx> X<`> X<``> X<backtick> X<glob>
+
+In scalar context, evaluating a filehandle in angle brackets yields
+the next line from that file (the newline, if any, included), or
+C<undef> at end-of-file or on error.  When C<$/> is set to C<undef>
+(sometimes known as file-slurp mode) and the file is empty, it
+returns C<''> the first time, followed by C<undef> subsequently.
+
+Ordinarily you must assign the returned value to a variable, but
+there is one situation where an automatic assignment happens.  If
+and only if the input symbol is the only thing inside the conditional
+of a C<while> statement (even if disguised as a C<for(;;)> loop),
+the value is automatically assigned to the global variable $_,
+destroying whatever was there previously.  (This may seem like an
+odd thing to you, but you'll use the construct in almost every Perl
+script you write.)  The $_ variable is not implicitly localized.
+You'll have to put a C<local $_;> before the loop if you want that
+to happen.
+
+The following lines are equivalent:
+
+    while (defined($_ = <STDIN>)) { print; }
+    while ($_ = <STDIN>) { print; }
+    while (<STDIN>) { print; }
+    for (;<STDIN>;) { print; }
+    print while defined($_ = <STDIN>);
+    print while ($_ = <STDIN>);
+    print while <STDIN>;
+
+This also behaves similarly, but avoids $_ :
+
+    while (my $line = <STDIN>) { print $line }    
+
+In these loop constructs, the assigned value (whether assignment
+is automatic or explicit) is then tested to see whether it is
+defined.  The defined test avoids problems where line has a string
+value that would be treated as false by Perl, for example a "" or
+a "0" with no trailing newline.  If you really mean for such values
+to terminate the loop, they should be tested for explicitly:
+
+    while (($_ = <STDIN>) ne '0') { ... }
+    while (<STDIN>) { last unless $_; ... }
+
+In other boolean contexts, C<< <I<filehandle>> >> without an
+explicit C<defined> test or comparison elicit a warning if the 
+C<use warnings> pragma or the B<-w>
+command-line switch (the C<$^W> variable) is in effect.
+
+The filehandles STDIN, STDOUT, and STDERR are predefined.  (The
+filehandles C<stdin>, C<stdout>, and C<stderr> will also work except
+in packages, where they would be interpreted as local identifiers
+rather than global.)  Additional filehandles may be created with
+the open() function, amongst others.  See L<perlopentut> and
+L<perlfunc/open> for details on this.
+X<stdin> X<stdout> X<sterr>
+
+If a <FILEHANDLE> is used in a context that is looking for
+a list, a list comprising all input lines is returned, one line per
+list element.  It's easy to grow to a rather large data space this
+way, so use with care.
+
+<FILEHANDLE> may also be spelled C<readline(*FILEHANDLE)>.
+See L<perlfunc/readline>.
+
+The null filehandle <> is special: it can be used to emulate the
+behavior of B<sed> and B<awk>.  Input from <> comes either from
+standard input, or from each file listed on the command line.  Here's
+how it works: the first time <> is evaluated, the @ARGV array is
+checked, and if it is empty, C<$ARGV[0]> is set to "-", which when opened
+gives you standard input.  The @ARGV array is then processed as a list
+of filenames.  The loop
+
+    while (<>) {
+	...			# code for each line
+    }
+
+is equivalent to the following Perl-like pseudo code:
+
+    unshift(@ARGV, '-') unless @ARGV;
+    while ($ARGV = shift) {
+	open(ARGV, $ARGV);
+	while (<ARGV>) {
+	    ...		# code for each line
+	}
+    }
+
+except that it isn't so cumbersome to say, and will actually work.
+It really does shift the @ARGV array and put the current filename
+into the $ARGV variable.  It also uses filehandle I<ARGV>
+internally--<> is just a synonym for <ARGV>, which
+is magical.  (The pseudo code above doesn't work because it treats
+<ARGV> as non-magical.)
+
+You can modify @ARGV before the first <> as long as the array ends up
+containing the list of filenames you really want.  Line numbers (C<$.>)
+continue as though the input were one big happy file.  See the example
+in L<perlfunc/eof> for how to reset line numbers on each file.
+
+If you want to set @ARGV to your own list of files, go right ahead.  
+This sets @ARGV to all plain text files if no @ARGV was given:
+
+    @ARGV = grep { -f && -T } glob('*') unless @ARGV;
+
+You can even set them to pipe commands.  For example, this automatically
+filters compressed arguments through B<gzip>:
+
+    @ARGV = map { /\.(gz|Z)$/ ? "gzip -dc < $_ |" : $_ } @ARGV;
+
+If you want to pass switches into your script, you can use one of the
+Getopts modules or put a loop on the front like this:
+
+    while ($_ = $ARGV[0], /^-/) {
+	shift;
+        last if /^--$/;
+	if (/^-D(.*)/) { $debug = $1 }
+	if (/^-v/)     { $verbose++  }
+	# ...		# other switches
+    }
+
+    while (<>) {
+	# ...		# code for each line
+    }
+
+The <> symbol will return C<undef> for end-of-file only once.  
+If you call it again after this, it will assume you are processing another 
+@ARGV list, and if you haven't set @ARGV, will read input from STDIN.
+
+If what the angle brackets contain is a simple scalar variable (e.g.,
+<$foo>), then that variable contains the name of the
+filehandle to input from, or its typeglob, or a reference to the
+same.  For example:
+
+    $fh = \*STDIN;
+    $line = <$fh>;
+
+If what's within the angle brackets is neither a filehandle nor a simple
+scalar variable containing a filehandle name, typeglob, or typeglob
+reference, it is interpreted as a filename pattern to be globbed, and
+either a list of filenames or the next filename in the list is returned,
+depending on context.  This distinction is determined on syntactic
+grounds alone.  That means C<< <$x> >> is always a readline() from
+an indirect handle, but C<< <$hash{key}> >> is always a glob().
+That's because $x is a simple scalar variable, but C<$hash{key}> is
+not--it's a hash element.  Even C<< <$x > >> (note the extra space)
+is treated as C<glob("$x ")>, not C<readline($x)>.
+
+One level of double-quote interpretation is done first, but you can't
+say C<< <$foo> >> because that's an indirect filehandle as explained
+in the previous paragraph.  (In older versions of Perl, programmers
+would insert curly brackets to force interpretation as a filename glob:
+C<< <${foo}> >>.  These days, it's considered cleaner to call the
+internal function directly as C<glob($foo)>, which is probably the right
+way to have done it in the first place.)  For example:
+
+    while (<*.c>) {
+	chmod 0644, $_;
+    }
+
+is roughly equivalent to:
+
+    open(FOO, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|");
+    while (<FOO>) {
+	chomp;
+	chmod 0644, $_;
+    }
+
+except that the globbing is actually done internally using the standard
+C<File::Glob> extension.  Of course, the shortest way to do the above is:
+
+    chmod 0644, <*.c>;
+
+A (file)glob evaluates its (embedded) argument only when it is
+starting a new list.  All values must be read before it will start
+over.  In list context, this isn't important because you automatically
+get them all anyway.  However, in scalar context the operator returns
+the next value each time it's called, or C<undef> when the list has
+run out.  As with filehandle reads, an automatic C<defined> is
+generated when the glob occurs in the test part of a C<while>,
+because legal glob returns (e.g. a file called F<0>) would otherwise
+terminate the loop.  Again, C<undef> is returned only once.  So if
+you're expecting a single value from a glob, it is much better to
+say
+
+    ($file) = <blurch*>;
+
+than
+
+    $file = <blurch*>;
+
+because the latter will alternate between returning a filename and
+returning false.
+
+If you're trying to do variable interpolation, it's definitely better
+to use the glob() function, because the older notation can cause people
+to become confused with the indirect filehandle notation.
+
+    @files = glob("$dir/*.[ch]");
+    @files = glob($files[$i]);
+
+=head2 Constant Folding
+X<constant folding> X<folding>
+
+Like C, Perl does a certain amount of expression evaluation at
+compile time whenever it determines that all arguments to an
+operator are static and have no side effects.  In particular, string
+concatenation happens at compile time between literals that don't do
+variable substitution.  Backslash interpolation also happens at
+compile time.  You can say
+
+    'Now is the time for all' . "\n" .
+	'good men to come to.'
+
+and this all reduces to one string internally.  Likewise, if
+you say
+
+    foreach $file (@filenames) {
+	if (-s $file > 5 + 100 * 2**16) {  }
+    }
+
+the compiler will precompute the number which that expression
+represents so that the interpreter won't have to.
+
+=head2 No-ops
+X<no-op> X<nop>
+
+Perl doesn't officially have a no-op operator, but the bare constants
+C<0> and C<1> are special-cased to not produce a warning in a void
+context, so you can for example safely do
+
+    1 while foo();
+
+=head2 Bitwise String Operators
+X<operator, bitwise, string>
+
+Bitstrings of any size may be manipulated by the bitwise operators
+(C<~ | & ^>).
+
+If the operands to a binary bitwise op are strings of different
+sizes, B<|> and B<^> ops act as though the shorter operand had
+additional zero bits on the right, while the B<&> op acts as though
+the longer operand were truncated to the length of the shorter.
+The granularity for such extension or truncation is one or more
+bytes.
+
+    # ASCII-based examples 
+    print "j p \n" ^ " a h";        	# prints "JAPH\n"
+    print "JA" | "  ph\n";          	# prints "japh\n"
+    print "japh\nJunk" & '_____';   	# prints "JAPH\n";
+    print 'p N$' ^ " E<H\n";		# prints "Perl\n";
+
+If you are intending to manipulate bitstrings, be certain that
+you're supplying bitstrings: If an operand is a number, that will imply
+a B<numeric> bitwise operation.  You may explicitly show which type of
+operation you intend by using C<""> or C<0+>, as in the examples below.
+
+    $foo =  150  |  105;	# yields 255  (0x96 | 0x69 is 0xFF)
+    $foo = '150' |  105;	# yields 255
+    $foo =  150  | '105';	# yields 255
+    $foo = '150' | '105';	# yields string '155' (under ASCII)
+
+    $baz = 0+$foo & 0+$bar;	# both ops explicitly numeric
+    $biz = "$foo" ^ "$bar";	# both ops explicitly stringy
+
+See L<perlfunc/vec> for information on how to manipulate individual bits
+in a bit vector.
+
+=head2 Integer Arithmetic
+X<integer>
+
+By default, Perl assumes that it must do most of its arithmetic in
+floating point.  But by saying
+
+    use integer;
+
+you may tell the compiler that it's okay to use integer operations
+(if it feels like it) from here to the end of the enclosing BLOCK.
+An inner BLOCK may countermand this by saying
+
+    no integer;
+
+which lasts until the end of that BLOCK.  Note that this doesn't
+mean everything is only an integer, merely that Perl may use integer
+operations if it is so inclined.  For example, even under C<use
+integer>, if you take the C<sqrt(2)>, you'll still get C<1.4142135623731>
+or so.
+
+Used on numbers, the bitwise operators ("&", "|", "^", "~", "<<",
+and ">>") always produce integral results.  (But see also 
+L<Bitwise String Operators>.)  However, C<use integer> still has meaning for
+them.  By default, their results are interpreted as unsigned integers, but
+if C<use integer> is in effect, their results are interpreted
+as signed integers.  For example, C<~0> usually evaluates to a large
+integral value.  However, C<use integer; ~0> is C<-1> on twos-complement
+machines.
+
+=head2 Floating-point Arithmetic
+X<floating-point> X<floating point> X<float> X<real>
+
+While C<use integer> provides integer-only arithmetic, there is no
+analogous mechanism to provide automatic rounding or truncation to a
+certain number of decimal places.  For rounding to a certain number
+of digits, sprintf() or printf() is usually the easiest route.
+See L<perlfaq4>.
+
+Floating-point numbers are only approximations to what a mathematician
+would call real numbers.  There are infinitely more reals than floats,
+so some corners must be cut.  For example:
+
+    printf "%.20g\n", 123456789123456789;
+    #        produces 123456789123456784
+
+Testing for exact equality of floating-point equality or inequality is
+not a good idea.  Here's a (relatively expensive) work-around to compare
+whether two floating-point numbers are equal to a particular number of
+decimal places.  See Knuth, volume II, for a more robust treatment of
+this topic.
+
+    sub fp_equal {
+	my ($X, $Y, $POINTS) = @_;
+	my ($tX, $tY);
+	$tX = sprintf("%.${POINTS}g", $X);
+	$tY = sprintf("%.${POINTS}g", $Y);
+	return $tX eq $tY;
+    }
+
+The POSIX module (part of the standard perl distribution) implements
+ceil(), floor(), and other mathematical and trigonometric functions.
+The Math::Complex module (part of the standard perl distribution)
+defines mathematical functions that work on both the reals and the
+imaginary numbers.  Math::Complex not as efficient as POSIX, but
+POSIX can't work with complex numbers.
+
+Rounding in financial applications can have serious implications, and
+the rounding method used should be specified precisely.  In these
+cases, it probably pays not to trust whichever system rounding is
+being used by Perl, but to instead implement the rounding function you
+need yourself.
+
+=head2 Bigger Numbers
+X<number, arbitrary precision>
+
+The standard Math::BigInt and Math::BigFloat modules provide
+variable-precision arithmetic and overloaded operators, although
+they're currently pretty slow. At the cost of some space and
+considerable speed, they avoid the normal pitfalls associated with
+limited-precision representations.
+
+    use Math::BigInt;
+    $x = Math::BigInt->new('123456789123456789');
+    print $x * $x;
+
+    # prints +15241578780673678515622620750190521
+
+There are several modules that let you calculate with (bound only by
+memory and cpu-time) unlimited or fixed precision. There are also
+some non-standard modules that provide faster implementations via
+external C libraries.
+
+Here is a short, but incomplete summary:
+
+	Math::Fraction		big, unlimited fractions like 9973 / 12967
+	Math::String		treat string sequences like numbers
+	Math::FixedPrecision	calculate with a fixed precision
+	Math::Currency		for currency calculations
+	Bit::Vector		manipulate bit vectors fast (uses C)
+	Math::BigIntFast	Bit::Vector wrapper for big numbers
+	Math::Pari		provides access to the Pari C library
+	Math::BigInteger	uses an external C library
+	Math::Cephes		uses external Cephes C library (no big numbers)
+	Math::Cephes::Fraction	fractions via the Cephes library
+	Math::GMP		another one using an external C library
+
+Choose wisely.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlopenbsd.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlopenbsd.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlopenbsd.pod	(revision 14489)
@@ -0,0 +1,30 @@
+If you read this file _as_is_, just ignore the funny characters you
+see.  It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.openbsd - Perl version 5 on OpenBSD systems
+
+=head1 DESCRIPTION
+
+This document describes various features of OpenBSD that will affect how Perl
+version 5 (hereafter just Perl) is compiled and/or runs.
+
+=head2 OpenBSD core dumps from getprotobyname_r and getservbyname_r with ithreads
+
+When Perl is configured to use ithreads, it will use re-entrant library calls
+in preference to non-re-entrant versions.  There is an incompatability in
+OpenBSD's C<getprotobyname_r> and C<getservbyname_r> function in versions 3.7
+and later that will cause a SEGV when called without doing a C<bzero> on
+their return structs prior to calling these functions.  Current Perl's
+should handle this problem correctly.  Older threaded Perls (5.8.6 or earlier)
+will run into this problem.  If you want to run a threaded Perl on OpenBSD
+3.7 or higher, you will need to upgrade to at least Perl 5.8.7.
+
+=head1 AUTHOR
+
+Steve Peters <steve@fisharerojo.org>
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlopentut.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlopentut.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlopentut.pod	(revision 14489)
@@ -0,0 +1,954 @@
+=head1 NAME
+
+perlopentut - tutorial on opening things in Perl
+
+=head1 DESCRIPTION
+
+Perl has two simple, built-in ways to open files: the shell way for
+convenience, and the C way for precision.  The shell way also has 2- and
+3-argument forms, which have different semantics for handling the filename.
+The choice is yours.
+
+=head1 Open E<agrave> la shell
+
+Perl's C<open> function was designed to mimic the way command-line
+redirection in the shell works.  Here are some basic examples
+from the shell:
+
+    $ myprogram file1 file2 file3
+    $ myprogram    <  inputfile
+    $ myprogram    >  outputfile
+    $ myprogram    >> outputfile
+    $ myprogram    |  otherprogram 
+    $ otherprogram |  myprogram
+
+And here are some more advanced examples:
+
+    $ otherprogram      | myprogram f1 - f2
+    $ otherprogram 2>&1 | myprogram -
+    $ myprogram     <&3
+    $ myprogram     >&4
+
+Programmers accustomed to constructs like those above can take comfort
+in learning that Perl directly supports these familiar constructs using
+virtually the same syntax as the shell.
+
+=head2 Simple Opens
+
+The C<open> function takes two arguments: the first is a filehandle,
+and the second is a single string comprising both what to open and how
+to open it.  C<open> returns true when it works, and when it fails,
+returns a false value and sets the special variable C<$!> to reflect
+the system error.  If the filehandle was previously opened, it will
+be implicitly closed first.
+
+For example:
+
+    open(INFO,      "datafile") || die("can't open datafile: $!");
+    open(INFO,   "<  datafile") || die("can't open datafile: $!");
+    open(RESULTS,">  runstats") || die("can't open runstats: $!");
+    open(LOG,    ">> logfile ") || die("can't open logfile:  $!");
+
+If you prefer the low-punctuation version, you could write that this way:
+
+    open INFO,   "<  datafile"  or die "can't open datafile: $!";
+    open RESULTS,">  runstats"  or die "can't open runstats: $!";
+    open LOG,    ">> logfile "  or die "can't open logfile:  $!";
+
+A few things to notice.  First, the leading less-than is optional.
+If omitted, Perl assumes that you want to open the file for reading.
+
+Note also that the first example uses the C<||> logical operator, and the
+second uses C<or>, which has lower precedence.  Using C<||> in the latter
+examples would effectively mean
+
+    open INFO, ( "<  datafile"  || die "can't open datafile: $!" );
+
+which is definitely not what you want.
+
+The other important thing to notice is that, just as in the shell,
+any whitespace before or after the filename is ignored.  This is good,
+because you wouldn't want these to do different things:
+
+    open INFO,   "<datafile"   
+    open INFO,   "< datafile" 
+    open INFO,   "<  datafile"
+
+Ignoring surrounding whitespace also helps for when you read a filename
+in from a different file, and forget to trim it before opening:
+
+    $filename = <INFO>;         # oops, \n still there
+    open(EXTRA, "< $filename") || die "can't open $filename: $!";
+
+This is not a bug, but a feature.  Because C<open> mimics the shell in
+its style of using redirection arrows to specify how to open the file, it
+also does so with respect to extra whitespace around the filename itself
+as well.  For accessing files with naughty names, see 
+L<"Dispelling the Dweomer">.
+
+There is also a 3-argument version of C<open>, which lets you put the
+special redirection characters into their own argument:
+
+    open( INFO, ">", $datafile ) || die "Can't create $datafile: $!";
+
+In this case, the filename to open is the actual string in C<$datafile>,
+so you don't have to worry about C<$datafile> containing characters
+that might influence the open mode, or whitespace at the beginning of
+the filename that would be absorbed in the 2-argument version.  Also,
+any reduction of unnecessary string interpolation is a good thing.
+
+=head2 Indirect Filehandles
+
+C<open>'s first argument can be a reference to a filehandle.  As of
+perl 5.6.0, if the argument is uninitialized, Perl will automatically
+create a filehandle and put a reference to it in the first argument,
+like so:
+
+    open( my $in, $infile )   or die "Couldn't read $infile: $!";
+    while ( <$in> ) {
+	# do something with $_
+    }
+    close $in;
+
+Indirect filehandles make namespace management easier.  Since filehandles
+are global to the current package, two subroutines trying to open
+C<INFILE> will clash.  With two functions opening indirect filehandles
+like C<my $infile>, there's no clash and no need to worry about future
+conflicts.
+
+Another convenient behavior is that an indirect filehandle automatically
+closes when it goes out of scope or when you undefine it:
+
+    sub firstline {
+	open( my $in, shift ) && return scalar <$in>;
+	# no close() required
+    }
+
+=head2 Pipe Opens
+
+In C, when you want to open a file using the standard I/O library,
+you use the C<fopen> function, but when opening a pipe, you use the
+C<popen> function.  But in the shell, you just use a different redirection
+character.  That's also the case for Perl.  The C<open> call 
+remains the same--just its argument differs.  
+
+If the leading character is a pipe symbol, C<open> starts up a new
+command and opens a write-only filehandle leading into that command.
+This lets you write into that handle and have what you write show up on
+that command's standard input.  For example:
+
+    open(PRINTER, "| lpr -Plp1")    || die "can't run lpr: $!";
+    print PRINTER "stuff\n";
+    close(PRINTER)                  || die "can't close lpr: $!";
+
+If the trailing character is a pipe, you start up a new command and open a
+read-only filehandle leading out of that command.  This lets whatever that
+command writes to its standard output show up on your handle for reading.
+For example:
+
+    open(NET, "netstat -i -n |")    || die "can't fork netstat: $!";
+    while (<NET>) { }               # do something with input
+    close(NET)                      || die "can't close netstat: $!";
+
+What happens if you try to open a pipe to or from a non-existent
+command?  If possible, Perl will detect the failure and set C<$!> as
+usual.  But if the command contains special shell characters, such as
+C<E<gt>> or C<*>, called 'metacharacters', Perl does not execute the
+command directly.  Instead, Perl runs the shell, which then tries to
+run the command.  This means that it's the shell that gets the error
+indication.  In such a case, the C<open> call will only indicate
+failure if Perl can't even run the shell.  See L<perlfaq8/"How can I
+capture STDERR from an external command?"> to see how to cope with
+this.  There's also an explanation in L<perlipc>.
+
+If you would like to open a bidirectional pipe, the IPC::Open2
+library will handle this for you.  Check out 
+L<perlipc/"Bidirectional Communication with Another Process">
+
+=head2 The Minus File
+
+Again following the lead of the standard shell utilities, Perl's
+C<open> function treats a file whose name is a single minus, "-", in a
+special way.  If you open minus for reading, it really means to access
+the standard input.  If you open minus for writing, it really means to
+access the standard output.
+
+If minus can be used as the default input or default output, what happens
+if you open a pipe into or out of minus?  What's the default command it
+would run?  The same script as you're currently running!  This is actually
+a stealth C<fork> hidden inside an C<open> call.  See 
+L<perlipc/"Safe Pipe Opens"> for details.
+
+=head2 Mixing Reads and Writes
+
+It is possible to specify both read and write access.  All you do is
+add a "+" symbol in front of the redirection.  But as in the shell,
+using a less-than on a file never creates a new file; it only opens an
+existing one.  On the other hand, using a greater-than always clobbers
+(truncates to zero length) an existing file, or creates a brand-new one
+if there isn't an old one.  Adding a "+" for read-write doesn't affect
+whether it only works on existing files or always clobbers existing ones.
+
+    open(WTMP, "+< /usr/adm/wtmp") 
+        || die "can't open /usr/adm/wtmp: $!";
+
+    open(SCREEN, "+> lkscreen")
+        || die "can't open lkscreen: $!";
+
+    open(LOGFILE, "+>> /var/log/applog"
+        || die "can't open /var/log/applog: $!";
+
+The first one won't create a new file, and the second one will always
+clobber an old one.  The third one will create a new file if necessary
+and not clobber an old one, and it will allow you to read at any point
+in the file, but all writes will always go to the end.  In short,
+the first case is substantially more common than the second and third
+cases, which are almost always wrong.  (If you know C, the plus in
+Perl's C<open> is historically derived from the one in C's fopen(3S),
+which it ultimately calls.)
+
+In fact, when it comes to updating a file, unless you're working on
+a binary file as in the WTMP case above, you probably don't want to
+use this approach for updating.  Instead, Perl's B<-i> flag comes to
+the rescue.  The following command takes all the C, C++, or yacc source
+or header files and changes all their foo's to bar's, leaving
+the old version in the original filename with a ".orig" tacked
+on the end:
+
+    $ perl -i.orig -pe 's/\bfoo\b/bar/g' *.[Cchy]
+
+This is a short cut for some renaming games that are really
+the best way to update textfiles.  See the second question in 
+L<perlfaq5> for more details.
+
+=head2 Filters 
+
+One of the most common uses for C<open> is one you never
+even notice.  When you process the ARGV filehandle using
+C<< <ARGV> >>, Perl actually does an implicit open 
+on each file in @ARGV.  Thus a program called like this:
+
+    $ myprogram file1 file2 file3
+
+Can have all its files opened and processed one at a time
+using a construct no more complex than:
+
+    while (<>) {
+        # do something with $_
+    } 
+
+If @ARGV is empty when the loop first begins, Perl pretends you've opened
+up minus, that is, the standard input.  In fact, $ARGV, the currently
+open file during C<< <ARGV> >> processing, is even set to "-"
+in these circumstances.
+
+You are welcome to pre-process your @ARGV before starting the loop to
+make sure it's to your liking.  One reason to do this might be to remove
+command options beginning with a minus.  While you can always roll the
+simple ones by hand, the Getopts modules are good for this:
+
+    use Getopt::Std;
+
+    # -v, -D, -o ARG, sets $opt_v, $opt_D, $opt_o
+    getopts("vDo:");            
+
+    # -v, -D, -o ARG, sets $args{v}, $args{D}, $args{o}
+    getopts("vDo:", \%args);    
+
+Or the standard Getopt::Long module to permit named arguments:
+
+    use Getopt::Long;
+    GetOptions( "verbose"  => \$verbose,        # --verbose
+                "Debug"    => \$debug,          # --Debug
+                "output=s" => \$output );       
+	    # --output=somestring or --output somestring
+
+Another reason for preprocessing arguments is to make an empty
+argument list default to all files:
+
+    @ARGV = glob("*") unless @ARGV;
+
+You could even filter out all but plain, text files.  This is a bit
+silent, of course, and you might prefer to mention them on the way.
+
+    @ARGV = grep { -f && -T } @ARGV;
+
+If you're using the B<-n> or B<-p> command-line options, you
+should put changes to @ARGV in a C<BEGIN{}> block.
+
+Remember that a normal C<open> has special properties, in that it might
+call fopen(3S) or it might called popen(3S), depending on what its
+argument looks like; that's why it's sometimes called "magic open".
+Here's an example:
+
+    $pwdinfo = `domainname` =~ /^(\(none\))?$/
+                    ? '< /etc/passwd'
+                    : 'ypcat passwd |';
+
+    open(PWD, $pwdinfo)                 
+                or die "can't open $pwdinfo: $!";
+
+This sort of thing also comes into play in filter processing.  Because
+C<< <ARGV> >> processing employs the normal, shell-style Perl C<open>,
+it respects all the special things we've already seen:
+
+    $ myprogram f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile
+
+That program will read from the file F<f1>, the process F<cmd1>, standard
+input (F<tmpfile> in this case), the F<f2> file, the F<cmd2> command,
+and finally the F<f3> file.
+
+Yes, this also means that if you have files named "-" (and so on) in
+your directory, they won't be processed as literal files by C<open>.
+You'll need to pass them as "./-", much as you would for the I<rm> program,
+or you could use C<sysopen> as described below.
+
+One of the more interesting applications is to change files of a certain
+name into pipes.  For example, to autoprocess gzipped or compressed
+files by decompressing them with I<gzip>:
+
+    @ARGV = map { /^\.(gz|Z)$/ ? "gzip -dc $_ |" : $_  } @ARGV;
+
+Or, if you have the I<GET> program installed from LWP,
+you can fetch URLs before processing them:
+
+    @ARGV = map { m#^\w+://# ? "GET $_ |" : $_ } @ARGV;
+
+It's not for nothing that this is called magic C<< <ARGV> >>.
+Pretty nifty, eh?
+
+=head1 Open E<agrave> la C
+
+If you want the convenience of the shell, then Perl's C<open> is
+definitely the way to go.  On the other hand, if you want finer precision
+than C's simplistic fopen(3S) provides you should look to Perl's
+C<sysopen>, which is a direct hook into the open(2) system call.
+That does mean it's a bit more involved, but that's the price of 
+precision.
+
+C<sysopen> takes 3 (or 4) arguments.
+
+    sysopen HANDLE, PATH, FLAGS, [MASK]
+
+The HANDLE argument is a filehandle just as with C<open>.  The PATH is
+a literal path, one that doesn't pay attention to any greater-thans or
+less-thans or pipes or minuses, nor ignore whitespace.  If it's there,
+it's part of the path.  The FLAGS argument contains one or more values
+derived from the Fcntl module that have been or'd together using the
+bitwise "|" operator.  The final argument, the MASK, is optional; if
+present, it is combined with the user's current umask for the creation
+mode of the file.  You should usually omit this.
+
+Although the traditional values of read-only, write-only, and read-write
+are 0, 1, and 2 respectively, this is known not to hold true on some
+systems.  Instead, it's best to load in the appropriate constants first
+from the Fcntl module, which supplies the following standard flags:
+
+    O_RDONLY            Read only
+    O_WRONLY            Write only
+    O_RDWR              Read and write
+    O_CREAT             Create the file if it doesn't exist
+    O_EXCL              Fail if the file already exists
+    O_APPEND            Append to the file
+    O_TRUNC             Truncate the file
+    O_NONBLOCK          Non-blocking access
+
+Less common flags that are sometimes available on some operating
+systems include C<O_BINARY>, C<O_TEXT>, C<O_SHLOCK>, C<O_EXLOCK>,
+C<O_DEFER>, C<O_SYNC>, C<O_ASYNC>, C<O_DSYNC>, C<O_RSYNC>,
+C<O_NOCTTY>, C<O_NDELAY> and C<O_LARGEFILE>.  Consult your open(2)
+manpage or its local equivalent for details.  (Note: starting from
+Perl release 5.6 the C<O_LARGEFILE> flag, if available, is automatically
+added to the sysopen() flags because large files are the default.)
+
+Here's how to use C<sysopen> to emulate the simple C<open> calls we had
+before.  We'll omit the C<|| die $!> checks for clarity, but make sure
+you always check the return values in real code.  These aren't quite
+the same, since C<open> will trim leading and trailing whitespace,
+but you'll get the idea.
+
+To open a file for reading:
+
+    open(FH, "< $path");
+    sysopen(FH, $path, O_RDONLY);
+
+To open a file for writing, creating a new file if needed or else truncating
+an old file:
+
+    open(FH, "> $path");
+    sysopen(FH, $path, O_WRONLY | O_TRUNC | O_CREAT);
+
+To open a file for appending, creating one if necessary:
+
+    open(FH, ">> $path");
+    sysopen(FH, $path, O_WRONLY | O_APPEND | O_CREAT);
+
+To open a file for update, where the file must already exist:
+
+    open(FH, "+< $path");
+    sysopen(FH, $path, O_RDWR);
+
+And here are things you can do with C<sysopen> that you cannot do with
+a regular C<open>.  As you'll see, it's just a matter of controlling the
+flags in the third argument.
+
+To open a file for writing, creating a new file which must not previously
+exist:
+
+    sysopen(FH, $path, O_WRONLY | O_EXCL | O_CREAT);
+
+To open a file for appending, where that file must already exist:
+
+    sysopen(FH, $path, O_WRONLY | O_APPEND);
+
+To open a file for update, creating a new file if necessary:
+
+    sysopen(FH, $path, O_RDWR | O_CREAT);
+
+To open a file for update, where that file must not already exist:
+
+    sysopen(FH, $path, O_RDWR | O_EXCL | O_CREAT);
+
+To open a file without blocking, creating one if necessary:
+
+    sysopen(FH, $path, O_WRONLY | O_NONBLOCK | O_CREAT);
+
+=head2 Permissions E<agrave> la mode
+
+If you omit the MASK argument to C<sysopen>, Perl uses the octal value
+0666.  The normal MASK to use for executables and directories should
+be 0777, and for anything else, 0666.
+
+Why so permissive?  Well, it isn't really.  The MASK will be modified
+by your process's current C<umask>.  A umask is a number representing
+I<disabled> permissions bits; that is, bits that will not be turned on
+in the created files' permissions field.
+
+For example, if your C<umask> were 027, then the 020 part would
+disable the group from writing, and the 007 part would disable others
+from reading, writing, or executing.  Under these conditions, passing
+C<sysopen> 0666 would create a file with mode 0640, since C<0666 & ~027>
+is 0640.
+
+You should seldom use the MASK argument to C<sysopen()>.  That takes
+away the user's freedom to choose what permission new files will have.
+Denying choice is almost always a bad thing.  One exception would be for
+cases where sensitive or private data is being stored, such as with mail
+folders, cookie files, and internal temporary files.
+
+=head1 Obscure Open Tricks
+
+=head2 Re-Opening Files (dups)
+
+Sometimes you already have a filehandle open, and want to make another
+handle that's a duplicate of the first one.  In the shell, we place an
+ampersand in front of a file descriptor number when doing redirections.
+For example, C<< 2>&1 >> makes descriptor 2 (that's STDERR in Perl)
+be redirected into descriptor 1 (which is usually Perl's STDOUT).
+The same is essentially true in Perl: a filename that begins with an
+ampersand is treated instead as a file descriptor if a number, or as a
+filehandle if a string.
+
+    open(SAVEOUT, ">&SAVEERR") || die "couldn't dup SAVEERR: $!";
+    open(MHCONTEXT, "<&4")     || die "couldn't dup fd4: $!";
+
+That means that if a function is expecting a filename, but you don't
+want to give it a filename because you already have the file open, you
+can just pass the filehandle with a leading ampersand.  It's best to
+use a fully qualified handle though, just in case the function happens
+to be in a different package:
+
+    somefunction("&main::LOGFILE");
+
+This way if somefunction() is planning on opening its argument, it can
+just use the already opened handle.  This differs from passing a handle,
+because with a handle, you don't open the file.  Here you have something
+you can pass to open.
+
+If you have one of those tricky, newfangled I/O objects that the C++
+folks are raving about, then this doesn't work because those aren't a
+proper filehandle in the native Perl sense.  You'll have to use fileno()
+to pull out the proper descriptor number, assuming you can:
+
+    use IO::Socket;
+    $handle = IO::Socket::INET->new("www.perl.com:80");
+    $fd = $handle->fileno;
+    somefunction("&$fd");  # not an indirect function call
+
+It can be easier (and certainly will be faster) just to use real
+filehandles though:
+
+    use IO::Socket;
+    local *REMOTE = IO::Socket::INET->new("www.perl.com:80");
+    die "can't connect" unless defined(fileno(REMOTE));
+    somefunction("&main::REMOTE");
+
+If the filehandle or descriptor number is preceded not just with a simple
+"&" but rather with a "&=" combination, then Perl will not create a
+completely new descriptor opened to the same place using the dup(2)
+system call.  Instead, it will just make something of an alias to the
+existing one using the fdopen(3S) library call  This is slightly more
+parsimonious of systems resources, although this is less a concern
+these days.  Here's an example of that:
+
+    $fd = $ENV{"MHCONTEXTFD"};
+    open(MHCONTEXT, "<&=$fd")   or die "couldn't fdopen $fd: $!";
+
+If you're using magic C<< <ARGV> >>, you could even pass in as a
+command line argument in @ARGV something like C<"<&=$MHCONTEXTFD">,
+but we've never seen anyone actually do this.
+
+=head2 Dispelling the Dweomer
+
+Perl is more of a DWIMmer language than something like Java--where DWIM
+is an acronym for "do what I mean".  But this principle sometimes leads
+to more hidden magic than one knows what to do with.  In this way, Perl
+is also filled with I<dweomer>, an obscure word meaning an enchantment.
+Sometimes, Perl's DWIMmer is just too much like dweomer for comfort.
+
+If magic C<open> is a bit too magical for you, you don't have to turn
+to C<sysopen>.  To open a file with arbitrary weird characters in
+it, it's necessary to protect any leading and trailing whitespace.
+Leading whitespace is protected by inserting a C<"./"> in front of a
+filename that starts with whitespace.  Trailing whitespace is protected
+by appending an ASCII NUL byte (C<"\0">) at the end of the string.
+
+    $file =~ s#^(\s)#./$1#;
+    open(FH, "< $file\0")   || die "can't open $file: $!";
+
+This assumes, of course, that your system considers dot the current
+working directory, slash the directory separator, and disallows ASCII
+NULs within a valid filename.  Most systems follow these conventions,
+including all POSIX systems as well as proprietary Microsoft systems.
+The only vaguely popular system that doesn't work this way is the
+"Classic" Macintosh system, which uses a colon where the rest of us
+use a slash.  Maybe C<sysopen> isn't such a bad idea after all.
+
+If you want to use C<< <ARGV> >> processing in a totally boring
+and non-magical way, you could do this first:
+
+    #   "Sam sat on the ground and put his head in his hands.  
+    #   'I wish I had never come here, and I don't want to see 
+    #   no more magic,' he said, and fell silent."
+    for (@ARGV) { 
+        s#^([^./])#./$1#;
+        $_ .= "\0";
+    } 
+    while (<>) {  
+        # now process $_
+    } 
+
+But be warned that users will not appreciate being unable to use "-"
+to mean standard input, per the standard convention.
+
+=head2 Paths as Opens
+
+You've probably noticed how Perl's C<warn> and C<die> functions can
+produce messages like:
+
+    Some warning at scriptname line 29, <FH> line 7.
+
+That's because you opened a filehandle FH, and had read in seven records
+from it.  But what was the name of the file, rather than the handle?
+
+If you aren't running with C<strict refs>, or if you've turned them off
+temporarily, then all you have to do is this:
+
+    open($path, "< $path") || die "can't open $path: $!";
+    while (<$path>) {
+        # whatever
+    } 
+
+Since you're using the pathname of the file as its handle,
+you'll get warnings more like
+
+    Some warning at scriptname line 29, </etc/motd> line 7.
+
+=head2 Single Argument Open
+
+Remember how we said that Perl's open took two arguments?  That was a
+passive prevarication.  You see, it can also take just one argument.
+If and only if the variable is a global variable, not a lexical, you
+can pass C<open> just one argument, the filehandle, and it will 
+get the path from the global scalar variable of the same name.
+
+    $FILE = "/etc/motd";
+    open FILE or die "can't open $FILE: $!";
+    while (<FILE>) {
+        # whatever
+    } 
+
+Why is this here?  Someone has to cater to the hysterical porpoises.
+It's something that's been in Perl since the very beginning, if not
+before.
+
+=head2 Playing with STDIN and STDOUT
+
+One clever move with STDOUT is to explicitly close it when you're done
+with the program.
+
+    END { close(STDOUT) || die "can't close stdout: $!" }
+
+If you don't do this, and your program fills up the disk partition due
+to a command line redirection, it won't report the error exit with a
+failure status.
+
+You don't have to accept the STDIN and STDOUT you were given.  You are
+welcome to reopen them if you'd like.
+
+    open(STDIN, "< datafile")
+	|| die "can't open datafile: $!";
+
+    open(STDOUT, "> output")
+	|| die "can't open output: $!";
+
+And then these can be accessed directly or passed on to subprocesses.
+This makes it look as though the program were initially invoked
+with those redirections from the command line.
+
+It's probably more interesting to connect these to pipes.  For example:
+
+    $pager = $ENV{PAGER} || "(less || more)";
+    open(STDOUT, "| $pager")
+	|| die "can't fork a pager: $!";
+
+This makes it appear as though your program were called with its stdout
+already piped into your pager.  You can also use this kind of thing
+in conjunction with an implicit fork to yourself.  You might do this
+if you would rather handle the post processing in your own program,
+just in a different process:
+
+    head(100);
+    while (<>) {
+        print;
+    } 
+
+    sub head {
+        my $lines = shift || 20;
+        return if $pid = open(STDOUT, "|-");       # return if parent
+        die "cannot fork: $!" unless defined $pid;
+        while (<STDIN>) {
+            last if --$lines < 0;
+            print;
+        } 
+        exit;
+    } 
+
+This technique can be applied to repeatedly push as many filters on your
+output stream as you wish.
+
+=head1 Other I/O Issues
+
+These topics aren't really arguments related to C<open> or C<sysopen>,
+but they do affect what you do with your open files.
+
+=head2 Opening Non-File Files
+
+When is a file not a file?  Well, you could say when it exists but
+isn't a plain file.   We'll check whether it's a symbolic link first,
+just in case.
+
+    if (-l $file || ! -f _) {
+        print "$file is not a plain file\n";
+    } 
+
+What other kinds of files are there than, well, files?  Directories,
+symbolic links, named pipes, Unix-domain sockets, and block and character
+devices.  Those are all files, too--just not I<plain> files.  This isn't
+the same issue as being a text file. Not all text files are plain files.
+Not all plain files are text files.  That's why there are separate C<-f>
+and C<-T> file tests.
+
+To open a directory, you should use the C<opendir> function, then
+process it with C<readdir>, carefully restoring the directory 
+name if necessary:
+
+    opendir(DIR, $dirname) or die "can't opendir $dirname: $!";
+    while (defined($file = readdir(DIR))) {
+        # do something with "$dirname/$file"
+    }
+    closedir(DIR);
+
+If you want to process directories recursively, it's better to use the
+File::Find module.  For example, this prints out all files recursively
+and adds a slash to their names if the file is a directory.
+
+    @ARGV = qw(.) unless @ARGV;
+    use File::Find;
+    find sub { print $File::Find::name, -d && '/', "\n" }, @ARGV;
+
+This finds all bogus symbolic links beneath a particular directory:
+
+    find sub { print "$File::Find::name\n" if -l && !-e }, $dir;
+
+As you see, with symbolic links, you can just pretend that it is
+what it points to.  Or, if you want to know I<what> it points to, then
+C<readlink> is called for:
+
+    if (-l $file) {
+        if (defined($whither = readlink($file))) {
+            print "$file points to $whither\n";
+        } else {
+            print "$file points nowhere: $!\n";
+        } 
+    } 
+
+=head2 Opening Named Pipes
+
+Named pipes are a different matter.  You pretend they're regular files,
+but their opens will normally block until there is both a reader and
+a writer.  You can read more about them in L<perlipc/"Named Pipes">.
+Unix-domain sockets are rather different beasts as well; they're
+described in L<perlipc/"Unix-Domain TCP Clients and Servers">.
+
+When it comes to opening devices, it can be easy and it can be tricky.
+We'll assume that if you're opening up a block device, you know what
+you're doing.  The character devices are more interesting.  These are
+typically used for modems, mice, and some kinds of printers.  This is
+described in L<perlfaq8/"How do I read and write the serial port?">
+It's often enough to open them carefully:
+
+    sysopen(TTYIN, "/dev/ttyS1", O_RDWR | O_NDELAY | O_NOCTTY)
+		# (O_NOCTTY no longer needed on POSIX systems)
+        or die "can't open /dev/ttyS1: $!";
+    open(TTYOUT, "+>&TTYIN")
+        or die "can't dup TTYIN: $!";
+
+    $ofh = select(TTYOUT); $| = 1; select($ofh);
+
+    print TTYOUT "+++at\015";
+    $answer = <TTYIN>;
+
+With descriptors that you haven't opened using C<sysopen>, such as
+sockets, you can set them to be non-blocking using C<fcntl>:
+
+    use Fcntl;
+    my $old_flags = fcntl($handle, F_GETFL, 0) 
+        or die "can't get flags: $!";
+    fcntl($handle, F_SETFL, $old_flags | O_NONBLOCK) 
+        or die "can't set non blocking: $!";
+
+Rather than losing yourself in a morass of twisting, turning C<ioctl>s,
+all dissimilar, if you're going to manipulate ttys, it's best to
+make calls out to the stty(1) program if you have it, or else use the
+portable POSIX interface.  To figure this all out, you'll need to read the
+termios(3) manpage, which describes the POSIX interface to tty devices,
+and then L<POSIX>, which describes Perl's interface to POSIX.  There are
+also some high-level modules on CPAN that can help you with these games.
+Check out Term::ReadKey and Term::ReadLine.
+
+=head2 Opening Sockets
+
+What else can you open?  To open a connection using sockets, you won't use
+one of Perl's two open functions.  See 
+L<perlipc/"Sockets: Client/Server Communication"> for that.  Here's an 
+example.  Once you have it, you can use FH as a bidirectional filehandle.
+
+    use IO::Socket;
+    local *FH = IO::Socket::INET->new("www.perl.com:80");
+
+For opening up a URL, the LWP modules from CPAN are just what
+the doctor ordered.  There's no filehandle interface, but
+it's still easy to get the contents of a document:
+
+    use LWP::Simple;
+    $doc = get('http://www.linpro.no/lwp/');
+
+=head2 Binary Files
+
+On certain legacy systems with what could charitably be called terminally
+convoluted (some would say broken) I/O models, a file isn't a file--at
+least, not with respect to the C standard I/O library.  On these old
+systems whose libraries (but not kernels) distinguish between text and
+binary streams, to get files to behave properly you'll have to bend over
+backwards to avoid nasty problems.  On such infelicitous systems, sockets
+and pipes are already opened in binary mode, and there is currently no
+way to turn that off.  With files, you have more options.
+
+Another option is to use the C<binmode> function on the appropriate
+handles before doing regular I/O on them:
+
+    binmode(STDIN);
+    binmode(STDOUT);
+    while (<STDIN>) { print } 
+
+Passing C<sysopen> a non-standard flag option will also open the file in
+binary mode on those systems that support it.  This is the equivalent of
+opening the file normally, then calling C<binmode> on the handle.
+
+    sysopen(BINDAT, "records.data", O_RDWR | O_BINARY)
+        || die "can't open records.data: $!";
+
+Now you can use C<read> and C<print> on that handle without worrying
+about the non-standard system I/O library breaking your data.  It's not
+a pretty picture, but then, legacy systems seldom are.  CP/M will be
+with us until the end of days, and after.
+
+On systems with exotic I/O systems, it turns out that, astonishingly
+enough, even unbuffered I/O using C<sysread> and C<syswrite> might do
+sneaky data mutilation behind your back.
+
+    while (sysread(WHENCE, $buf, 1024)) {
+        syswrite(WHITHER, $buf, length($buf));
+    } 
+
+Depending on the vicissitudes of your runtime system, even these calls
+may need C<binmode> or C<O_BINARY> first.  Systems known to be free of
+such difficulties include Unix, the Mac OS, Plan 9, and Inferno.
+
+=head2 File Locking
+
+In a multitasking environment, you may need to be careful not to collide
+with other processes who want to do I/O on the same files as you
+are working on.  You'll often need shared or exclusive locks
+on files for reading and writing respectively.  You might just
+pretend that only exclusive locks exist.
+
+Never use the existence of a file C<-e $file> as a locking indication,
+because there is a race condition between the test for the existence of
+the file and its creation.  It's possible for another process to create
+a file in the slice of time between your existence check and your attempt
+to create the file.  Atomicity is critical.
+
+Perl's most portable locking interface is via the C<flock> function,
+whose simplicity is emulated on systems that don't directly support it
+such as SysV or Windows.  The underlying semantics may affect how
+it all works, so you should learn how C<flock> is implemented on your
+system's port of Perl.
+
+File locking I<does not> lock out another process that would like to
+do I/O.  A file lock only locks out others trying to get a lock, not
+processes trying to do I/O.  Because locks are advisory, if one process
+uses locking and another doesn't, all bets are off.
+
+By default, the C<flock> call will block until a lock is granted.
+A request for a shared lock will be granted as soon as there is no
+exclusive locker.  A request for an exclusive lock will be granted as
+soon as there is no locker of any kind.  Locks are on file descriptors,
+not file names.  You can't lock a file until you open it, and you can't
+hold on to a lock once the file has been closed.
+
+Here's how to get a blocking shared lock on a file, typically used
+for reading:
+
+    use 5.004;
+    use Fcntl qw(:DEFAULT :flock);
+    open(FH, "< filename")  or die "can't open filename: $!";
+    flock(FH, LOCK_SH) 	    or die "can't lock filename: $!";
+    # now read from FH
+
+You can get a non-blocking lock by using C<LOCK_NB>.
+
+    flock(FH, LOCK_SH | LOCK_NB)
+        or die "can't lock filename: $!";
+
+This can be useful for producing more user-friendly behaviour by warning
+if you're going to be blocking:
+
+    use 5.004;
+    use Fcntl qw(:DEFAULT :flock);
+    open(FH, "< filename")  or die "can't open filename: $!";
+    unless (flock(FH, LOCK_SH | LOCK_NB)) {
+	$| = 1;
+	print "Waiting for lock...";
+	flock(FH, LOCK_SH)  or die "can't lock filename: $!";
+	print "got it.\n"
+    } 
+    # now read from FH
+
+To get an exclusive lock, typically used for writing, you have to be
+careful.  We C<sysopen> the file so it can be locked before it gets
+emptied.  You can get a nonblocking version using C<LOCK_EX | LOCK_NB>.
+
+    use 5.004;
+    use Fcntl qw(:DEFAULT :flock);
+    sysopen(FH, "filename", O_WRONLY | O_CREAT)
+        or die "can't open filename: $!";
+    flock(FH, LOCK_EX)
+        or die "can't lock filename: $!";
+    truncate(FH, 0)
+        or die "can't truncate filename: $!";
+    # now write to FH
+
+Finally, due to the uncounted millions who cannot be dissuaded from
+wasting cycles on useless vanity devices called hit counters, here's
+how to increment a number in a file safely:
+
+    use Fcntl qw(:DEFAULT :flock);
+
+    sysopen(FH, "numfile", O_RDWR | O_CREAT)
+        or die "can't open numfile: $!";
+    # autoflush FH
+    $ofh = select(FH); $| = 1; select ($ofh);
+    flock(FH, LOCK_EX)
+        or die "can't write-lock numfile: $!";
+
+    $num = <FH> || 0;
+    seek(FH, 0, 0)
+        or die "can't rewind numfile : $!";
+    print FH $num+1, "\n"
+        or die "can't write numfile: $!";
+
+    truncate(FH, tell(FH))
+        or die "can't truncate numfile: $!";
+    close(FH)
+        or die "can't close numfile: $!";
+
+=head2 IO Layers
+
+In Perl 5.8.0 a new I/O framework called "PerlIO" was introduced.
+This is a new "plumbing" for all the I/O happening in Perl; for the
+most part everything will work just as it did, but PerlIO also brought
+in some new features such as the ability to think of I/O as "layers".
+One I/O layer may in addition to just moving the data also do
+transformations on the data.  Such transformations may include
+compression and decompression, encryption and decryption, and transforming
+between various character encodings.
+
+Full discussion about the features of PerlIO is out of scope for this
+tutorial, but here is how to recognize the layers being used:
+
+=over 4
+
+=item *
+
+The three-(or more)-argument form of C<open> is being used and the
+second argument contains something else in addition to the usual
+C<< '<' >>, C<< '>' >>, C<< '>>' >>, C<< '|' >> and their variants,
+for example:
+
+    open(my $fh, "<:utf8", $fn);
+
+=item *
+
+The two-argument form of C<binmode> is being used, for example
+
+    binmode($fh, ":encoding(utf16)");
+
+=back
+
+For more detailed discussion about PerlIO see L<PerlIO>;
+for more detailed discussion about Unicode and I/O see L<perluniintro>.
+
+=head1 SEE ALSO 
+
+The C<open> and C<sysopen> functions in perlfunc(1);
+the system open(2), dup(2), fopen(3), and fdopen(3) manpages;
+the POSIX documentation.
+
+=head1 AUTHOR and COPYRIGHT
+
+Copyright 1998 Tom Christiansen.  
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in these files are
+hereby placed into the public domain.  You are permitted and
+encouraged to use this code in your own programs for fun or for profit
+as you see fit.  A simple comment in the code giving credit would be
+courteous but is not required.
+
+=head1 HISTORY
+
+First release: Sat Jan  9 08:09:11 MST 1999
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlos2.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlos2.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlos2.pod	(revision 14489)
@@ -0,0 +1,2743 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT.
+
+=head1 SYNOPSIS
+
+One can read this document in the following formats:
+
+	man perlos2
+	view perl perlos2
+	explorer perlos2.html
+	info perlos2
+
+to list some (not all may be available simultaneously), or it may
+be read I<as is>: either as F<README.os2>, or F<pod/perlos2.pod>.
+
+To read the F<.INF> version of documentation (B<very> recommended)
+outside of OS/2, one needs an IBM's reader (may be available on IBM
+ftp sites (?)  (URL anyone?)) or shipped with PC DOS 7.0 and IBM's
+Visual Age C++ 3.5.
+
+A copy of a Win* viewer is contained in the "Just add OS/2 Warp" package
+
+  ftp://ftp.software.ibm.com/ps/products/os2/tools/jaow/jaow.zip
+
+in F<?:\JUST_ADD\view.exe>. This gives one an access to EMX's 
+F<.INF> docs as well (text form is available in F</emx/doc> in 
+EMX's distribution).  There is also a different viewer named xview.
+
+Note that if you have F<lynx.exe> or F<netscape.exe> installed, you can follow WWW links
+from this document in F<.INF> format. If you have EMX docs installed 
+correctly, you can follow library links (you need to have C<view emxbook>
+working by setting C<EMXBOOK> environment variable as it is described
+in EMX docs).
+
+=cut
+
+Contents (This may be a little bit obsolete)
+ 
+ perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT. 
+
+      NAME
+      SYNOPSIS
+      DESCRIPTION
+	 -  Target
+	 -  Other OSes
+	 -  Prerequisites
+	 -  Starting Perl programs under OS/2 (and DOS and...)
+	 -  Starting OS/2 (and DOS) programs under Perl
+      Frequently asked questions
+	 -  "It does not work"
+	 -  I cannot run external programs
+	 -  I cannot embed perl into my program, or use perl.dll from my
+	 -  `` and pipe-open do not work under DOS.
+	 -  Cannot start find.exe "pattern" file
+      INSTALLATION
+	 -  Automatic binary installation
+	 -  Manual binary installation
+	 -  Warning
+      Accessing documentation
+	 -  OS/2 .INF file
+	 -  Plain text
+	 -  Manpages
+	 -  HTML
+	 -  GNU info files
+	 -  PDF files
+	 -  LaTeX docs
+      BUILD
+	 -  The short story
+	 -  Prerequisites
+	 -  Getting perl source
+	 -  Application of the patches
+	 -  Hand-editing
+	 -  Making
+	 -  Testing
+	 -  Installing the built perl
+	 -  a.out-style build
+      Build FAQ
+	 -  Some / became \ in pdksh.
+	 -  'errno' - unresolved external
+	 -  Problems with tr or sed
+	 -  Some problem (forget which ;-)
+	 -  Library ... not found
+	 -  Segfault in make
+	 -  op/sprintf test failure
+      Specific (mis)features of OS/2 port
+	 -  setpriority, getpriority
+	 -  system()
+	 -  extproc on the first line
+	 -  Additional modules:
+	 -  Prebuilt methods:
+	 -  Prebuilt variables:
+	 -  Misfeatures
+	 -  Modifications
+	 -  Identifying DLLs
+	 -  Centralized management of resources
+      Perl flavors
+	 -  perl.exe
+	 -  perl_.exe
+	 -  perl__.exe
+	 -  perl___.exe
+	 -  Why strange names?
+	 -  Why dynamic linking?
+	 -  Why chimera build?
+      ENVIRONMENT
+	 -  PERLLIB_PREFIX
+	 -  PERL_BADLANG
+	 -  PERL_BADFREE
+	 -  PERL_SH_DIR
+	 -  USE_PERL_FLOCK
+	 -  TMP or TEMP
+      Evolution
+	 -  Text-mode filehandles
+	 -  Priorities
+	 -  DLL name mangling: pre 5.6.2
+	 -  DLL name mangling: 5.6.2 and beyond
+	 -  DLL forwarder generation
+	 -  Threading
+	 -  Calls to external programs
+	 -  Memory allocation
+	 -  Threads
+      BUGS
+      AUTHOR
+      SEE ALSO
+
+=head1 DESCRIPTION
+
+=head2 Target
+
+The target is to make OS/2 one of the best supported platform for
+using/building/developing Perl and I<Perl applications>, as well as
+make Perl the best language to use under OS/2. The secondary target is
+to try to make this work under DOS and Win* as well (but not B<too> hard).
+
+The current state is quite close to this target. Known limitations:
+
+=over 5
+
+=item *
+
+Some *nix programs use fork() a lot; with the mostly useful flavors of
+perl for OS/2 (there are several built simultaneously) this is
+supported; but some flavors do not support this (e.g., when Perl is
+called from inside REXX).  Using fork() after
+I<use>ing dynamically loading extensions would not work with I<very> old
+versions of EMX.
+
+=item *
+
+You need a separate perl executable F<perl__.exe> (see L<perl__.exe>)
+if you want to use PM code in your application (as Perl/Tk or OpenGL
+Perl modules do) without having a text-mode window present.
+
+While using the standard F<perl.exe> from a text-mode window is possible
+too, I have seen cases when this causes degradation of the system stability.
+Using F<perl__.exe> avoids such a degradation.
+
+=item *
+
+There is no simple way to access WPS objects. The only way I know
+is via C<OS2::REXX> and C<SOM> extensions (see L<OS2::REXX>, L<Som>).
+However, we do not have access to
+convenience methods of Object-REXX. (Is it possible at all? I know
+of no Object-REXX API.)  The C<SOM> extension (currently in alpha-text)
+may eventually remove this shortcoming; however, due to the fact that
+DII is not supported by the C<SOM> module, using C<SOM> is not as
+convenient as one would like it.
+
+=back
+
+Please keep this list up-to-date by informing me about other items.
+
+=head2 Other OSes
+
+Since OS/2 port of perl uses a remarkable EMX environment, it can
+run (and build extensions, and - possibly - be built itself) under any
+environment which can run EMX. The current list is DOS,
+DOS-inside-OS/2, Win0.3*, Win0.95 and WinNT. Out of many perl flavors,
+only one works, see L<"perl_.exe">.
+
+Note that not all features of Perl are available under these
+environments. This depends on the features the I<extender> - most
+probably RSX - decided to implement.
+
+Cf. L<Prerequisites>.
+
+=head2 Prerequisites
+
+=over 6
+
+=item EMX
+
+EMX runtime is required (may be substituted by RSX). Note that
+it is possible to make F<perl_.exe> to run under DOS without any
+external support by binding F<emx.exe>/F<rsx.exe> to it, see L<emxbind>. Note
+that under DOS for best results one should use RSX runtime, which
+has much more functions working (like C<fork>, C<popen> and so on). In
+fact RSX is required if there is no VCPI present. Note the
+RSX requires DPMI.  Many implementations of DPMI are known to be very
+buggy, beware!
+
+Only the latest runtime is supported, currently C<0.9d fix 03>. Perl may run
+under earlier versions of EMX, but this is not tested.
+
+One can get different parts of EMX from, say
+
+  http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/
+  http://powerusersbbs.com/pub/os2/dev/   [EMX+GCC Development]
+  http://hobbes.nmsu.edu/pub/os2/dev/emx/v0.9d/
+
+The runtime component should have the name F<emxrt.zip>.
+
+B<NOTE>. When using F<emx.exe>/F<rsx.exe>, it is enough to have them on your path. One
+does not need to specify them explicitly (though this
+
+  emx perl_.exe -de 0
+
+will work as well.)
+
+=item RSX
+
+To run Perl on DPMI platforms one needs RSX runtime. This is
+needed under DOS-inside-OS/2, Win0.3*, Win0.95 and WinNT (see 
+L<"Other OSes">). RSX would not work with VCPI
+only, as EMX would, it requires DMPI.
+
+Having RSX and the latest F<sh.exe> one gets a fully functional
+B<*nix>-ish environment under DOS, say, C<fork>, C<``> and
+pipe-C<open> work. In fact, MakeMaker works (for static build), so one
+can have Perl development environment under DOS. 
+
+One can get RSX from, say
+
+  ftp://ftp.cdrom.com/pub/os2/emx09c/contrib
+  ftp://ftp.uni-bielefeld.de/pub/systems/msdos/misc
+  ftp://ftp.leo.org/pub/comp/os/os2/leo/devtools/emx+gcc/contrib
+
+Contact the author on C<rainer@mathematik.uni-bielefeld.de>.
+
+The latest F<sh.exe> with DOS hooks is available in
+
+  http://www.ilyaz.org/software/os2/
+
+as F<sh_dos.zip> or under similar names starting with C<sh>, C<pdksh> etc.
+
+=item HPFS
+
+Perl does not care about file systems, but the perl library contains
+many files with long names, so to install it intact one needs a file
+system which supports long file names.
+
+Note that if you do not plan to build the perl itself, it may be
+possible to fool EMX to truncate file names. This is not supported,
+read EMX docs to see how to do it.
+
+=item pdksh
+
+To start external programs with complicated command lines (like with
+pipes in between, and/or quoting of arguments), Perl uses an external
+shell. With EMX port such shell should be named F<sh.exe>, and located
+either in the wired-in-during-compile locations (usually F<F:/bin>),
+or in configurable location (see L<"PERL_SH_DIR">).
+
+For best results use EMX pdksh. The standard binary (5.2.14 or later) runs
+under DOS (with L<RSX>) as well, see
+
+  http://www.ilyaz.org/software/os2/
+
+=back
+
+=head2 Starting Perl programs under OS/2 (and DOS and...)
+
+Start your Perl program F<foo.pl> with arguments C<arg1 arg2 arg3> the
+same way as on any other platform, by
+
+	perl foo.pl arg1 arg2 arg3
+
+If you want to specify perl options C<-my_opts> to the perl itself (as
+opposed to your program), use
+
+	perl -my_opts foo.pl arg1 arg2 arg3
+
+Alternately, if you use OS/2-ish shell, like CMD or 4os2, put
+the following at the start of your perl script:
+
+	extproc perl -S -my_opts
+
+rename your program to F<foo.cmd>, and start it by typing
+
+	foo arg1 arg2 arg3
+
+Note that because of stupid OS/2 limitations the full path of the perl
+script is not available when you use C<extproc>, thus you are forced to
+use C<-S> perl switch, and your script should be on the C<PATH>. As a plus
+side, if you know a full path to your script, you may still start it
+with 
+
+	perl ../../blah/foo.cmd arg1 arg2 arg3
+
+(note that the argument C<-my_opts> is taken care of by the C<extproc> line
+in your script, see L<C<extproc> on the first line>).
+
+To understand what the above I<magic> does, read perl docs about C<-S>
+switch - see L<perlrun>, and cmdref about C<extproc>:
+
+	view perl perlrun
+	man perlrun
+	view cmdref extproc
+	help extproc
+
+or whatever method you prefer.
+
+There are also endless possibilities to use I<executable extensions> of
+4os2, I<associations> of WPS and so on... However, if you use
+*nixish shell (like F<sh.exe> supplied in the binary distribution),
+you need to follow the syntax specified in L<perlrun/"Switches">.
+
+Note that B<-S> switch supports scripts with additional extensions 
+F<.cmd>, F<.btm>, F<.bat>, F<.pl> as well.
+
+=head2 Starting OS/2 (and DOS) programs under Perl
+
+This is what system() (see L<perlfunc/system>), C<``> (see
+L<perlop/"I/O Operators">), and I<open pipe> (see L<perlfunc/open>)
+are for. (Avoid exec() (see L<perlfunc/exec>) unless you know what you
+do).
+
+Note however that to use some of these operators you need to have a
+sh-syntax shell installed (see L<"Pdksh">, 
+L<"Frequently asked questions">), and perl should be able to find it
+(see L<"PERL_SH_DIR">).
+
+The cases when the shell is used are:
+
+=over
+
+=item 1
+
+One-argument system() (see L<perlfunc/system>), exec() (see L<perlfunc/exec>)
+with redirection or shell meta-characters;
+
+=item 2
+
+Pipe-open (see L<perlfunc/open>) with the command which contains redirection 
+or shell meta-characters;
+
+=item 3
+
+Backticks C<``> (see L<perlop/"I/O Operators">) with the command which contains
+redirection or shell meta-characters;
+
+=item 4
+
+If the executable called by system()/exec()/pipe-open()/C<``> is a script
+with the "magic" C<#!> line or C<extproc> line which specifies shell;
+
+=item 5
+
+If the executable called by system()/exec()/pipe-open()/C<``> is a script
+without "magic" line, and C<$ENV{EXECSHELL}> is set to shell;
+
+=item 6
+
+If the executable called by system()/exec()/pipe-open()/C<``> is not
+found (is not this remark obsolete?);
+
+=item 7
+
+For globbing (see L<perlfunc/glob>, L<perlop/"I/O Operators">)
+(obsolete? Perl uses builtin globbing nowadays...).
+
+=back
+
+For the sake of speed for a common case, in the above algorithms 
+backslashes in the command name are not considered as shell metacharacters.
+
+Perl starts scripts which begin with cookies
+C<extproc> or C<#!> directly, without an intervention of shell.  Perl uses the
+same algorithm to find the executable as F<pdksh>: if the path
+on C<#!> line does not work, and contains C</>, then the directory
+part of the executable is ignored, and the executable
+is searched in F<.> and on C<PATH>.  To find arguments for these scripts
+Perl uses a different algorithm than F<pdksh>: up to 3 arguments are 
+recognized, and trailing whitespace is stripped.
+
+If a script
+does not contain such a cooky, then to avoid calling F<sh.exe>, Perl uses
+the same algorithm as F<pdksh>: if C<$ENV{EXECSHELL}> is set, the
+script is given as the first argument to this command, if not set, then
+C<$ENV{COMSPEC} /c> is used (or a hardwired guess if C<$ENV{COMSPEC}> is
+not set).
+
+When starting scripts directly, Perl uses exactly the same algorithm as for 
+the search of script given by B<-S> command-line option: it will look in
+the current directory, then on components of C<$ENV{PATH}> using the 
+following order of appended extensions: no extension, F<.cmd>, F<.btm>, 
+F<.bat>, F<.pl>.
+
+Note that Perl will start to look for scripts only if OS/2 cannot start the
+specified application, thus C<system 'blah'> will not look for a script if 
+there is an executable file F<blah.exe> I<anywhere> on C<PATH>.  In
+other words, C<PATH> is essentially searched twice: once by the OS for
+an executable, then by Perl for scripts.
+
+Note also that executable files on OS/2 can have an arbitrary extension, 
+but F<.exe> will be automatically appended if no dot is present in the name.  
+The workaround is as simple as that:  since F<blah.> and F<blah> denote the 
+same file (at list on FAT and HPFS file systems), to start an executable residing in file F<n:/bin/blah> (no 
+extension) give an argument C<n:/bin/blah.> (dot appended) to system().
+
+Perl will start PM programs from VIO (=text-mode) Perl process in a
+separate PM session;
+the opposite is not true: when you start a non-PM program from a PM
+Perl process, Perl would not run it in a separate session.  If a separate
+session is desired, either ensure
+that shell will be used, as in C<system 'cmd /c myprog'>, or start it using
+optional arguments to system() documented in C<OS2::Process> module.  This
+is considered to be a feature.
+
+=head1 Frequently asked questions
+
+=head2 "It does not work"
+
+Perl binary distributions come with a F<testperl.cmd> script which tries
+to detect common problems with misconfigured installations.  There is a
+pretty large chance it will discover which step of the installation you
+managed to goof.  C<;-)>
+
+=head2 I cannot run external programs
+
+=over 4
+
+=item *
+
+Did you run your programs with C<-w> switch? See 
+L<Starting OS/2 (and DOS) programs under Perl>.
+
+=item *
+
+Do you try to run I<internal> shell commands, like C<`copy a b`>
+(internal for F<cmd.exe>), or C<`glob a*b`> (internal for ksh)? You
+need to specify your shell explicitly, like C<`cmd /c copy a b`>,
+since Perl cannot deduce which commands are internal to your shell.
+
+=back
+
+=head2 I cannot embed perl into my program, or use F<perl.dll> from my
+program. 
+
+=over 4
+
+=item Is your program EMX-compiled with C<-Zmt -Zcrtdll>?
+
+Well, nowadays Perl DLL should be usable from a differently compiled
+program too...  If you can run Perl code from REXX scripts (see
+L<OS2::REXX>), then there are some other aspect of interaction which
+are overlooked by the current hackish code to support
+differently-compiled principal programs.
+
+If everything else fails, you need to build a stand-alone DLL for
+perl. Contact me, I did it once. Sockets would not work, as a lot of
+other stuff.
+
+=item Did you use L<ExtUtils::Embed>?
+
+Some time ago I had reports it does not work.  Nowadays it is checked
+in the Perl test suite, so grep F<./t> subdirectory of the build tree
+(as well as F<*.t> files in the F<./lib> subdirectory) to find how it
+should be done "correctly".
+
+=back
+
+=head2 C<``> and pipe-C<open> do not work under DOS.
+
+This may a variant of just L<"I cannot run external programs">, or a
+deeper problem. Basically: you I<need> RSX (see L<"Prerequisites">)
+for these commands to work, and you may need a port of F<sh.exe> which
+understands command arguments. One of such ports is listed in
+L<"Prerequisites"> under RSX. Do not forget to set variable
+C<L<"PERL_SH_DIR">> as well.
+
+DPMI is required for RSX.
+
+=head2 Cannot start C<find.exe "pattern" file>
+
+The whole idea of the "standard C API to start applications" is that
+the forms C<foo> and C<"foo"> of program arguments are completely
+interchangable.  F<find> breaks this paradigm;
+
+  find "pattern" file
+  find pattern file
+
+are not equivalent; F<find> cannot be started directly using the above
+API.  One needs a way to surround the doublequotes in some other
+quoting construction, necessarily having an extra non-Unixish shell in
+between.
+
+Use one of
+
+  system 'cmd', '/c', 'find "pattern" file';
+  `cmd /c 'find "pattern" file'`
+
+This would start F<find.exe> via F<cmd.exe> via C<sh.exe> via
+C<perl.exe>, but this is a price to pay if you want to use
+non-conforming program.
+
+=head1 INSTALLATION
+
+=head2 Automatic binary installation
+
+The most convenient way of installing a binary distribution of perl is via perl installer
+F<install.exe>. Just follow the instructions, and 99% of the
+installation blues would go away. 
+
+Note however, that you need to have F<unzip.exe> on your path, and
+EMX environment I<running>. The latter means that if you just
+installed EMX, and made all the needed changes to F<Config.sys>,
+you may need to reboot in between. Check EMX runtime by running
+
+	emxrev
+
+Binary installer also creates a folder on your desktop with some useful
+objects.  If you need to change some aspects of the work of the binary
+installer, feel free to edit the file F<Perl.pkg>.  This may be useful
+e.g., if you need to run the installer many times and do not want to
+make many interactive changes in the GUI.
+
+B<Things not taken care of by automatic binary installation:>
+
+=over 15
+
+=item C<PERL_BADLANG>
+
+may be needed if you change your codepage I<after> perl installation,
+and the new value is not supported by EMX. See L<"PERL_BADLANG">.
+
+=item C<PERL_BADFREE>
+
+see L<"PERL_BADFREE">.
+
+=item F<Config.pm>
+
+This file resides somewhere deep in the location you installed your
+perl library, find it out by 
+
+  perl -MConfig -le "print $INC{'Config.pm'}"
+
+While most important values in this file I<are> updated by the binary
+installer, some of them may need to be hand-edited. I know no such
+data, please keep me informed if you find one.  Moreover, manual
+changes to the installed version may need to be accompanied by an edit
+of this file.
+
+=back
+
+B<NOTE>. Because of a typo the binary installer of 5.00305
+would install a variable C<PERL_SHPATH> into F<Config.sys>. Please
+remove this variable and put C<L<PERL_SH_DIR>> instead.
+
+=head2 Manual binary installation
+
+As of version 5.00305, OS/2 perl binary distribution comes split
+into 11 components. Unfortunately, to enable configurable binary
+installation, the file paths in the zip files are not absolute, but
+relative to some directory.
+
+Note that the extraction with the stored paths is still necessary
+(default with unzip, specify C<-d> to pkunzip). However, you
+need to know where to extract the files. You need also to manually
+change entries in F<Config.sys> to reflect where did you put the
+files. Note that if you have some primitive unzipper (like
+C<pkunzip>), you may get a lot of warnings/errors during
+unzipping. Upgrade to C<(w)unzip>.
+
+Below is the sample of what to do to reproduce the configuration on my
+machine.  In F<VIEW.EXE> you can press C<Ctrl-Insert> now, and
+cut-and-paste from the resulting file - created in the directory you
+started F<VIEW.EXE> from.
+
+For each component, we mention environment variables related to each
+installation directory.  Either choose directories to match your
+values of the variables, or create/append-to variables to take into
+account the directories.
+
+=over 3
+
+=item Perl VIO and PM executables (dynamically linked)
+
+  unzip perl_exc.zip *.exe *.ico -d f:/emx.add/bin
+  unzip perl_exc.zip *.dll -d f:/emx.add/dll
+
+(have the directories with C<*.exe> on PATH, and C<*.dll> on
+LIBPATH);
+
+=item Perl_ VIO executable (statically linked)
+
+  unzip perl_aou.zip -d f:/emx.add/bin
+
+(have the directory on PATH);
+
+=item Executables for Perl utilities
+
+  unzip perl_utl.zip -d f:/emx.add/bin
+
+(have the directory on PATH);
+
+=item Main Perl library
+
+  unzip perl_mlb.zip -d f:/perllib/lib
+
+If this directory is exactly the same as the prefix which was compiled
+into F<perl.exe>, you do not need to change
+anything. However, for perl to find the library if you use a different
+path, you need to
+C<set PERLLIB_PREFIX> in F<Config.sys>, see L<"PERLLIB_PREFIX">.
+
+=item Additional Perl modules
+
+  unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.8.8/
+
+Same remark as above applies.  Additionally, if this directory is not
+one of directories on @INC (and @INC is influenced by C<PERLLIB_PREFIX>), you
+need to put this
+directory and subdirectory F<./os2> in C<PERLLIB> or C<PERL5LIB>
+variable. Do not use C<PERL5LIB> unless you have it set already. See
+L<perl/"ENVIRONMENT">.
+
+B<[Check whether this extraction directory is still applicable with
+the new directory structure layout!]>
+
+=item Tools to compile Perl modules
+
+  unzip perl_blb.zip -d f:/perllib/lib
+
+Same remark as for F<perl_ste.zip>.
+
+=item Manpages for Perl and utilities
+
+  unzip perl_man.zip -d f:/perllib/man
+
+This directory should better be on C<MANPATH>. You need to have a
+working F<man> to access these files.
+
+=item Manpages for Perl modules
+
+  unzip perl_mam.zip -d f:/perllib/man
+
+This directory should better be on C<MANPATH>. You need to have a
+working man to access these files.
+
+=item Source for Perl documentation
+
+  unzip perl_pod.zip -d f:/perllib/lib
+
+This is used by the C<perldoc> program (see L<perldoc>), and may be used to
+generate HTML documentation usable by WWW browsers, and
+documentation in zillions of other formats: C<info>, C<LaTeX>,
+C<Acrobat>, C<FrameMaker> and so on.  [Use programs such as
+F<pod2latex> etc.]
+
+=item Perl manual in F<.INF> format
+
+  unzip perl_inf.zip -d d:/os2/book
+
+This directory should better be on C<BOOKSHELF>.
+
+=item Pdksh
+
+  unzip perl_sh.zip -d f:/bin
+
+This is used by perl to run external commands which explicitly
+require shell, like the commands using I<redirection> and I<shell
+metacharacters>. It is also used instead of explicit F</bin/sh>.
+
+Set C<PERL_SH_DIR> (see L<"PERL_SH_DIR">) if you move F<sh.exe> from
+the above location.
+
+B<Note.> It may be possible to use some other sh-compatible shell (untested).
+
+=back
+
+After you installed the components you needed and updated the
+F<Config.sys> correspondingly, you need to hand-edit
+F<Config.pm>. This file resides somewhere deep in the location you
+installed your perl library, find it out by
+
+  perl -MConfig -le "print $INC{'Config.pm'}"
+
+You need to correct all the entries which look like file paths (they
+currently start with C<f:/>).
+
+=head2 B<Warning>
+
+The automatic and manual perl installation leave precompiled paths
+inside perl executables. While these paths are overwriteable (see
+L<"PERLLIB_PREFIX">, L<"PERL_SH_DIR">), some people may prefer
+binary editing of paths inside the executables/DLLs.
+
+=head1 Accessing documentation
+
+Depending on how you built/installed perl you may have (otherwise
+identical) Perl documentation in the following formats:
+
+=head2 OS/2 F<.INF> file
+
+Most probably the most convenient form. Under OS/2 view it as
+
+  view perl
+  view perl perlfunc
+  view perl less
+  view perl ExtUtils::MakeMaker
+
+(currently the last two may hit a wrong location, but this may improve
+soon). Under Win* see L<"SYNOPSIS">.
+
+If you want to build the docs yourself, and have I<OS/2 toolkit>, run
+
+	pod2ipf > perl.ipf
+
+in F</perllib/lib/pod> directory, then
+
+	ipfc /inf perl.ipf
+
+(Expect a lot of errors during the both steps.) Now move it on your
+BOOKSHELF path.
+
+=head2 Plain text
+
+If you have perl documentation in the source form, perl utilities
+installed, and GNU groff installed, you may use 
+
+	perldoc perlfunc
+	perldoc less
+	perldoc ExtUtils::MakeMaker
+
+to access the perl documentation in the text form (note that you may get
+better results using perl manpages).
+
+Alternately, try running pod2text on F<.pod> files.
+
+=head2 Manpages
+
+If you have F<man> installed on your system, and you installed perl
+manpages, use something like this:
+
+	man perlfunc
+	man 3 less
+	man ExtUtils.MakeMaker
+
+to access documentation for different components of Perl. Start with
+
+	man perl
+
+Note that dot (F<.>) is used as a package separator for documentation
+for packages, and as usual, sometimes you need to give the section - C<3>
+above - to avoid shadowing by the I<less(1) manpage>.
+
+Make sure that the directory B<above> the directory with manpages is
+on our C<MANPATH>, like this
+
+  set MANPATH=c:/man;f:/perllib/man
+
+for Perl manpages in C<f:/perllib/man/man1/> etc.
+
+=head2 HTML
+
+If you have some WWW browser available, installed the Perl
+documentation in the source form, and Perl utilities, you can build
+HTML docs. Cd to directory with F<.pod> files, and do like this
+
+	cd f:/perllib/lib/pod
+	pod2html
+
+After this you can direct your browser the file F<perl.html> in this
+directory, and go ahead with reading docs, like this:
+
+	explore file:///f:/perllib/lib/pod/perl.html
+
+Alternatively you may be able to get these docs prebuilt from CPAN.
+
+=head2 GNU C<info> files
+
+Users of Emacs would appreciate it very much, especially with
+C<CPerl> mode loaded. You need to get latest C<pod2texi> from C<CPAN>,
+or, alternately, the prebuilt info pages.
+
+=head2 F<PDF> files
+
+for C<Acrobat> are available on CPAN (may be for slightly older version of
+perl).
+
+=head2 C<LaTeX> docs
+
+can be constructed using C<pod2latex>.
+
+=head1 BUILD
+
+Here we discuss how to build Perl under OS/2. There is an alternative
+(but maybe older) view on L<http://www.shadow.net/~troc/os2perl.html>.
+
+=head2 The short story
+
+Assume that you are a seasoned porter, so are sure that all the necessary
+tools are already present on your system, and you know how to get the Perl
+source distribution.  Untar it, change to the extract directory, and
+
+  gnupatch -p0 < os2\diff.configure
+  sh Configure -des -D prefix=f:/perllib
+  make
+  make test
+  make install
+  make aout_test
+  make aout_install
+
+This puts the executables in f:/perllib/bin.  Manually move them to the
+C<PATH>, manually move the built F<perl*.dll> to C<LIBPATH> (here for
+Perl DLL F<*> is a not-very-meaningful hex checksum), and run
+
+  make installcmd INSTALLCMDDIR=d:/ir/on/path
+
+Assuming that the C<man>-files were put on an appropriate location,
+this completes the installation of minimal Perl system.  (The binary
+distribution contains also a lot of additional modules, and the
+documentation in INF format.)
+
+What follows is a detailed guide through these steps.
+
+=head2 Prerequisites
+
+You need to have the latest EMX development environment, the full
+GNU tool suite (gawk renamed to awk, and GNU F<find.exe>
+earlier on path than the OS/2 F<find.exe>, same with F<sort.exe>, to
+check use
+
+  find --version
+  sort --version
+
+). You need the latest version of F<pdksh> installed as F<sh.exe>.
+
+Check that you have B<BSD> libraries and headers installed, and - 
+optionally - Berkeley DB headers and libraries, and crypt.
+
+Possible locations to get the files:
+
+  ftp://hobbes.nmsu.edu/os2/unix/
+  ftp://ftp.cdrom.com/pub/os2/unix/
+  ftp://ftp.cdrom.com/pub/os2/dev32/
+  ftp://ftp.cdrom.com/pub/os2/emx09c/
+
+It is reported that the following archives contain enough utils to
+build perl: F<gnufutil.zip>, F<gnusutil.zip>, F<gnututil.zip>, F<gnused.zip>,
+F<gnupatch.zip>, F<gnuawk.zip>, F<gnumake.zip>, F<gnugrep.zip>, F<bsddev.zip> and
+F<ksh527rt.zip> (or a later version).  Note that all these utilities are
+known to be available from LEO:
+
+  ftp://ftp.leo.org/pub/comp/os/os2/leo/gnu
+
+Note also that the F<db.lib> and F<db.a> from the EMX distribution
+are not suitable for multi-threaded compile (even single-threaded
+flavor of Perl uses multi-threaded C RTL, for
+compatibility with XFree86-OS/2). Get a corrected one from
+
+  http://www.ilyaz.org/software/os2/db_mt.zip
+
+If you have I<exactly the same version of Perl> installed already,
+make sure that no copies or perl are currently running.  Later steps
+of the build may fail since an older version of F<perl.dll> loaded into
+memory may be found.  Running C<make test> becomes meaningless, since
+the test are checking a previous build of perl (this situation is detected
+and reported by F<lib/os2_base.t> test).  Do not forget to unset
+C<PERL_EMXLOAD_SEC> in environment.
+
+Also make sure that you have F</tmp> directory on the current drive,
+and F<.> directory in your C<LIBPATH>. One may try to correct the
+latter condition by
+
+  set BEGINLIBPATH .\.
+
+if you use something like F<CMD.EXE> or latest versions of
+F<4os2.exe>.  (Setting BEGINLIBPATH to just C<.> is ignored by the
+OS/2 kernel.)
+
+Make sure your gcc is good for C<-Zomf> linking: run C<omflibs>
+script in F</emx/lib> directory.
+
+Check that you have link386 installed. It comes standard with OS/2,
+but may be not installed due to customization. If typing
+
+  link386
+
+shows you do not have it, do I<Selective install>, and choose C<Link
+object modules> in I<Optional system utilities/More>. If you get into
+link386 prompts, press C<Ctrl-C> to exit.
+
+=head2 Getting perl source
+
+You need to fetch the latest perl source (including developers
+releases). With some probability it is located in 
+
+  http://www.cpan.org/src/5.0
+  http://www.cpan.org/src/5.0/unsupported
+
+If not, you may need to dig in the indices to find it in the directory
+of the current maintainer.
+
+Quick cycle of developers release may break the OS/2 build time to
+time, looking into 
+
+  http://www.cpan.org/ports/os2/
+
+may indicate the latest release which was publicly released by the
+maintainer. Note that the release may include some additional patches
+to apply to the current source of perl.
+
+Extract it like this
+
+  tar vzxf perl5.00409.tar.gz
+
+You may see a message about errors while extracting F<Configure>. This is
+because there is a conflict with a similarly-named file F<configure>.
+
+Change to the directory of extraction.
+
+=head2 Application of the patches
+
+You need to apply the patches in F<./os2/diff.*> like this:
+
+  gnupatch -p0 < os2\diff.configure
+
+You may also need to apply the patches supplied with the binary
+distribution of perl.  It also makes sense to look on the
+perl5-porters mailing list for the latest OS/2-related patches (see
+L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/>).  Such
+patches usually contain strings C</os2/> and C<patch>, so it makes
+sense looking for these strings.
+
+=head2 Hand-editing
+
+You may look into the file F<./hints/os2.sh> and correct anything
+wrong you find there. I do not expect it is needed anywhere.
+
+=head2 Making
+
+  sh Configure -des -D prefix=f:/perllib
+
+C<prefix> means: where to install the resulting perl library. Giving
+correct prefix you may avoid the need to specify C<PERLLIB_PREFIX>,
+see L<"PERLLIB_PREFIX">.
+
+I<Ignore the message about missing C<ln>, and about C<-c> option to
+tr>. The latter is most probably already fixed, if you see it and can trace
+where the latter spurious warning comes from, please inform me.
+
+Now
+
+  make
+
+At some moment the built may die, reporting a I<version mismatch> or
+I<unable to run F<perl>>.  This means that you do not have F<.> in
+your LIBPATH, so F<perl.exe> cannot find the needed F<perl67B2.dll> (treat
+these hex digits as line noise).  After this is fixed the build
+should finish without a lot of fuss.
+
+=head2 Testing
+
+Now run
+
+  make test
+
+All tests should succeed (with some of them skipped).  If you have the
+same version of Perl installed, it is crucial that you have C<.> early
+in your LIBPATH (or in BEGINLIBPATH), otherwise your tests will most
+probably test the wrong version of Perl.
+
+Some tests may generate extra messages similar to
+
+=over 4
+
+=item A lot of C<bad free>
+
+in database tests related to Berkeley DB. I<This should be fixed already.>
+If it persists, you may disable this warnings, see L<"PERL_BADFREE">.
+
+=item Process terminated by SIGTERM/SIGINT
+
+This is a standard message issued by OS/2 applications. *nix
+applications die in silence. It is considered to be a feature. One can
+easily disable this by appropriate sighandlers. 
+
+However the test engine bleeds these message to screen in unexpected
+moments. Two messages of this kind I<should> be present during
+testing.
+
+=back
+
+To get finer test reports, call
+
+  perl t/harness
+
+The report with F<io/pipe.t> failing may look like this:
+
+  Failed Test  Status Wstat Total Fail  Failed  List of failed
+  ------------------------------------------------------------
+  io/pipe.t                    12    1   8.33%  9
+  7 tests skipped, plus 56 subtests skipped.
+  Failed 1/195 test scripts, 99.49% okay. 1/6542 subtests failed, 99.98% okay.
+
+The reasons for most important skipped tests are:
+
+=over 8
+
+=item F<op/fs.t>
+
+=over 4
+
+=item 18
+
+Checks C<atime> and C<mtime> of C<stat()> - unfortunately, HPFS
+provides only 2sec time granularity (for compatibility with FAT?).
+
+=item 25
+
+Checks C<truncate()> on a filehandle just opened for write - I do not
+know why this should or should not work.
+
+=back
+
+=item F<op/stat.t>
+
+Checks C<stat()>. Tests:
+
+=over 4
+
+=item 4
+
+Checks C<atime> and C<mtime> of C<stat()> - unfortunately, HPFS
+provides only 2sec time granularity (for compatibility with FAT?).
+
+=back
+
+=back
+
+=head2 Installing the built perl
+
+If you haven't yet moved C<perl*.dll> onto LIBPATH, do it now.
+
+Run
+
+  make install
+
+It would put the generated files into needed locations. Manually put
+F<perl.exe>, F<perl__.exe> and F<perl___.exe> to a location on your
+PATH, F<perl.dll> to a location on your LIBPATH.
+
+Run
+
+  make installcmd INSTALLCMDDIR=d:/ir/on/path
+
+to convert perl utilities to F<.cmd> files and put them on
+PATH. You need to put F<.EXE>-utilities on path manually. They are
+installed in C<$prefix/bin>, here C<$prefix> is what you gave to
+F<Configure>, see L<Making>.
+
+If you use C<man>, either move the installed F<*/man/> directories to
+your C<MANPATH>, or modify C<MANPATH> to match the location.  (One
+could have avoided this by providing a correct C<manpath> option to
+F<./Configure>, or editing F<./config.sh> between configuring and
+making steps.)
+
+=head2 C<a.out>-style build
+
+Proceed as above, but make F<perl_.exe> (see L<"perl_.exe">) by
+
+  make perl_
+
+test and install by
+
+  make aout_test
+  make aout_install
+
+Manually put F<perl_.exe> to a location on your PATH.
+
+B<Note.> The build process for C<perl_> I<does not know> about all the
+dependencies, so you should make sure that anything is up-to-date,
+say, by doing
+
+  make perl_dll
+
+first.
+
+=head1 Building a binary distribution
+
+[This section provides a short overview only...]
+
+Building should proceed differently depending on whether the version of perl
+you install is already present and used on your system, or is a new version
+not yet used.  The description below assumes that the version is new, so
+installing its DLLs and F<.pm> files will not disrupt the operation of your
+system even if some intermediate steps are not yet fully working.
+
+The other cases require a little bit more convoluted procedures.  Below I
+suppose that the current version of Perl is C<5.8.2>, so the executables are
+named accordingly.
+
+=over
+
+=item 1.
+
+Fully build and test the Perl distribution.  Make sure that no tests are
+failing with C<test> and C<aout_test> targets; fix the bugs in Perl and
+the Perl test suite detected by these tests.  Make sure that C<all_test>
+make target runs as clean as possible.  Check that C<os2/perlrexx.cmd>
+runs fine.
+
+=item 2.
+
+Fully install Perl, including C<installcmd> target.  Copy the generated DLLs
+to C<LIBPATH>; copy the numbered Perl executables (as in F<perl5.8.2.exe>)
+to C<PATH>; copy C<perl_.exe> to C<PATH> as C<perl_5.8.2.exe>.  Think whether
+you need backward-compatibility DLLs.  In most cases you do not need to install
+them yet; but sometime this may simplify the following steps.
+
+=item 3.
+
+Make sure that C<CPAN.pm> can download files from CPAN.  If not, you may need
+to manually install C<Net::FTP>.
+
+=item 4.
+
+Install the bundle C<Bundle::OS2_default>
+
+  perl5.8.2 -MCPAN -e "install Bundle::OS2_default" < nul |& tee 00cpan_i_1
+
+This may take a couple of hours on 1GHz processor (when run the first time).
+And this should not be necessarily a smooth procedure.  Some modules may not
+specify required dependencies, so one may need to repeat this procedure several
+times until the results stabilize.
+
+  perl5.8.2 -MCPAN -e "install Bundle::OS2_default" < nul |& tee 00cpan_i_2
+  perl5.8.2 -MCPAN -e "install Bundle::OS2_default" < nul |& tee 00cpan_i_3
+
+Even after they stabilize, some tests may fail.
+
+Fix as many discovered bugs as possible.  Document all the bugs which are not
+fixed, and all the failures with unknown reasons.  Inspect the produced logs
+F<00cpan_i_1> to find suspiciously skipped tests, and other fishy events.
+
+Keep in mind that I<installation> of some modules may fail too: for example,
+the DLLs to update may be already loaded by F<CPAN.pm>.  Inspect the C<install>
+logs (in the example above F<00cpan_i_1> etc) for errors, and install things
+manually, as in
+
+  cd $CPANHOME/.cpan/build/Digest-MD5-2.31
+  make install
+
+Some distributions may fail some tests, but you may want to install them
+anyway (as above, or via C<force install> command of C<CPAN.pm> shell-mode).
+
+Since this procedure may take quite a long time to complete, it makes sense
+to "freeze" your CPAN configuration by disabling periodic updates of the
+local copy of CPAN index: set C<index_expire> to some big value (I use 365),
+then save the settings
+
+  CPAN> o conf index_expire 365
+  CPAN> o conf commit
+
+Reset back to the default value C<1> when you are finished.
+
+=item 5.
+
+When satisfied with the results, rerun the C<installcmd> target.  Now you
+can copy C<perl5.8.2.exe> to C<perl.exe>, and install the other OMF-build
+executables: C<perl__.exe> etc.  They are ready to be used.
+
+=item 6.
+
+Change to the C<./pod> directory of the build tree, download the Perl logo
+F<CamelGrayBig.BMP>, and run
+
+  ( perl2ipf > perl.ipf ) |& tee 00ipf
+  ipfc /INF perl.ipf |& tee 00inf
+
+This produces the Perl docs online book C<perl.INF>.  Install in on
+C<BOOKSHELF> path.
+
+=item 7.
+
+Now is the time to build statically linked executable F<perl_.exe> which
+includes newly-installed via C<Bundle::OS2_default> modules.  Doing testing
+via C<CPAN.pm> is going to be painfully slow, since it statically links
+a new executable per XS extension.
+
+Here is a possible workaround: create a toplevel F<Makefile.PL> in
+F<$CPANHOME/.cpan/build/> with contents being (compare with L<Making
+executables with a custom collection of statically loaded extensions>)
+
+  use ExtUtils::MakeMaker;
+  WriteMakefile NAME => 'dummy';
+
+execute this as
+
+  perl_5.8.2.exe Makefile.PL <nul |& tee 00aout_c1
+  make -k all test <nul |& 00aout_t1
+
+Again, this procedure should not be absolutely smooth.  Some C<Makefile.PL>'s
+in subdirectories may be buggy, and would not run as "child" scripts.  The
+interdependency of modules can strike you; however, since non-XS modules
+are already installed, the prerequisites of most modules have a very good
+chance to be present.
+
+If you discover some glitches, move directories of problematic modules to a
+different location; if these modules are non-XS modules, you may just ignore
+them - they are already installed; the remaining, XS, modules you need to
+install manually one by one.
+
+After each such removal you need to rerun the C<Makefile.PL>/C<make> process;
+usually this procedure converges soon.  (But be sure to convert all the
+necessary external C libraries from F<.lib> format to F<.a> format: run one of
+
+  emxaout foo.lib
+  emximp -o foo.a foo.lib
+
+whichever is appropriate.)  Also, make sure that the DLLs for external
+libraries are usable with with executables compiled without C<-Zmtd> options.
+
+When you are sure that only a few subdirectories
+lead to failures, you may want to add C<-j4> option to C<make> to speed up
+skipping subdirectories with already finished build.
+
+When you are satisfied with the results of tests, install the build C libraries
+for extensions:
+
+  make install |& tee 00aout_i
+
+Now you can rename the file F<./perl.exe> generated during the last phase
+to F<perl_5.8.2.exe>; place it on C<PATH>; if there is an inter-dependency
+between some XS modules, you may need to repeat the C<test>/C<install> loop
+with this new executable and some excluded modules - until the procedure
+converges.
+
+Now you have all the necessary F<.a> libraries for these Perl modules in the
+places where Perl builder can find it.  Use the perl builder: change to an
+empty directory, create a "dummy" F<Makefile.PL> again, and run
+
+  perl_5.8.2.exe Makefile.PL |& tee 00c
+  make perl		     |& tee 00p
+
+This should create an executable F<./perl.exe> with all the statically loaded
+extensions built in.  Compare the generated F<perlmain.c> files to make sure
+that during the iterations the number of loaded extensions only increases.
+Rename F<./perl.exe> to F<perl_5.8.2.exe> on C<PATH>.
+
+When it converges, you got a functional variant of F<perl_5.8.2.exe>; copy it
+to C<perl_.exe>.  You are done with generation of the local Perl installation.
+
+=item 8.
+
+Make sure that the installed modules are actually installed in the location
+of the new Perl, and are not inherited from entries of @INC given for
+inheritance from the older versions of Perl: set C<PERLLIB_582_PREFIX> to
+redirect the new version of Perl to a new location, and copy the installed
+files to this new location.  Redo the tests to make sure that the versions of
+modules inherited from older versions of Perl are not needed.
+
+Actually, the log output of L<pod2ipf> during the step 6 gives a very detailed
+info about which modules are loaded from which place; so you may use it as
+an additional verification tool.
+
+Check that some temporary files did not make into the perl install tree.
+Run something like this
+
+  pfind . -f "!(/\.(pm|pl|ix|al|h|a|lib|txt|pod|imp|bs|dll|ld|bs|inc|xbm|yml|cgi|uu|e2x|skip|packlist|eg|cfg|html|pub|enc|all|ini|po|pot)$/i or /^\w+$/") | less
+
+in the install tree (both top one and F<sitelib> one).
+
+Compress all the DLLs with F<lxlite>.  The tiny F<.exe> can be compressed with
+C</c:max> (the bug only appears when there is a fixup in the last 6 bytes of a
+page (?); since the tiny executables are much smaller than a page, the bug
+will not hit).  Do not compress C<perl_.exe> - it would not work under DOS.
+
+=item 9.
+
+Now you can generate the binary distribution.  This is done by running the
+test of the CPAN distribution C<OS2::SoftInstaller>.  Tune up the file
+F<test.pl> to suit the layout of current version of Perl first.  Do not
+forget to pack the necessary external DLLs accordingly.  Include the
+description of the bugs and test suite failures you could not fix.  Include
+the small-stack versions of Perl executables from Perl build directory.
+
+Include F<perl5.def> so that people can relink the perl DLL preserving
+the binary compatibility, or can create compatibility DLLs.  Include the diff
+files (C<diff -pu old new>) of fixes you did so that people can rebuild your
+version.  Include F<perl5.map> so that one can use remote debugging.
+
+=item 10.
+
+Share what you did with the other people.  Relax.  Enjoy fruits of your work.
+
+=item 11.
+
+Brace yourself for thanks, bug reports, hate mail and spam coming as result
+of the previous step.  No good deed should remain unpunished!
+
+=back
+
+=head1 Building custom F<.EXE> files
+
+The Perl executables can be easily rebuilt at any moment.  Moreover, one can
+use the I<embedding> interface (see L<perlembed>) to make very customized
+executables.
+
+=head2 Making executables with a custom collection of statically loaded extensions
+
+It is a little bit easier to do so while I<decreasing> the list of statically
+loaded extensions.  We discuss this case only here.
+
+=over
+
+=item 1.
+
+Change to an empty directory, and create a placeholder <Makefile.PL>:
+
+  use ExtUtils::MakeMaker;
+  WriteMakefile NAME => 'dummy';
+
+=item 2.
+
+Run it with the flavor of Perl (F<perl.exe> or F<perl_.exe>) you want to
+rebuild.
+
+  perl_ Makefile.PL
+
+=item 3.
+
+Ask it to create new Perl executable:
+
+  make perl
+
+(you may need to manually add C<PERLTYPE=-DPERL_CORE> to this commandline on
+some versions of Perl; the symptom is that the command-line globbing does not
+work from OS/2 shells with the newly-compiled executable; check with
+
+  .\perl.exe -wle "print for @ARGV" *
+
+).
+
+=item 4.
+
+The previous step created F<perlmain.c> which contains a list of newXS() calls
+near the end.  Removing unnecessary calls, and rerunning
+
+  make perl
+
+will produce a customized executable.
+
+=back
+
+=head2 Making executables with a custom search-paths
+
+The default perl executable is flexible enough to support most usages.
+However, one may want something yet more flexible; for example, one may want
+to find Perl DLL relatively to the location of the EXE file; or one may want
+to ignore the environment when setting the Perl-library search patch, etc.
+
+If you fill comfortable with I<embedding> interface (see L<perlembed>), such
+things are easy to do repeating the steps outlined in L<Making
+executables with a custom collection of statically loaded extensions>, and
+doing more comprehensive edits to main() of F<perlmain.c>.  The people with
+little desire to understand Perl can just rename main(), and do necessary
+modification in a custom main() which calls the renamed function in appropriate
+time.
+
+However, there is a third way: perl DLL exports the main() function and several
+callbacks to customize the search path.  Below is a complete example of a
+"Perl loader" which
+
+=over
+
+=item 1.
+
+Looks for Perl DLL in the directory C<$exedir/../dll>;
+
+=item 2.
+
+Prepends the above directory to C<BEGINLIBPATH>;
+
+=item 3.
+
+Fails if the Perl DLL found via C<BEGINLIBPATH> is different from what was
+loaded on step 1; e.g., another process could have loaded it from C<LIBPATH>
+or from a different value of C<BEGINLIBPATH>.  In these cases one needs to
+modify the setting of the system so that this other process either does not
+run, or loads the DLL from C<BEGINLIBPATH> with C<LIBPATHSTRICT=T> (available
+with kernels after September 2000).
+
+=item 4.
+
+Loads Perl library from C<$exedir/../dll/lib/>.
+
+=item 5.
+
+Uses Bourne shell from C<$exedir/../dll/sh/ksh.exe>.
+
+=back
+
+For best results compile the C file below with the same options as the Perl
+DLL.  However, a lot of functionality will work even if the executable is not
+an EMX applications, e.g., if compiled with
+
+  gcc -Wall -DDOSISH -DOS2=1 -O2 -s -Zomf -Zsys perl-starter.c -DPERL_DLL_BASENAME=\"perl312F\" -Zstack 8192 -Zlinker /PM:VIO
+
+Here is the sample C file:
+
+  #define INCL_DOS
+  #define INCL_NOPM
+  /* These are needed for compile if os2.h includes os2tk.h, not os2emx.h */
+  #define INCL_DOSPROCESS
+  #include <os2.h>
+
+  #include "EXTERN.h"
+  #define PERL_IN_MINIPERLMAIN_C
+  #include "perl.h"
+
+  static char *me;
+  HMODULE handle;
+
+  static void
+  die_with(char *msg1, char *msg2, char *msg3, char *msg4)
+  {
+     ULONG c;
+     char *s = " error: ";
+
+     DosWrite(2, me, strlen(me), &c);
+     DosWrite(2, s, strlen(s), &c);
+     DosWrite(2, msg1, strlen(msg1), &c);
+     DosWrite(2, msg2, strlen(msg2), &c);
+     DosWrite(2, msg3, strlen(msg3), &c);
+     DosWrite(2, msg4, strlen(msg4), &c);
+     DosWrite(2, "\r\n", 2, &c);
+     exit(255);
+  }
+
+  typedef ULONG (*fill_extLibpath_t)(int type, char *pre, char *post, int replace, char *msg);
+  typedef int (*main_t)(int type, char *argv[], char *env[]);
+  typedef int (*handler_t)(void* data, int which);
+
+  #ifndef PERL_DLL_BASENAME
+  #  define PERL_DLL_BASENAME "perl"
+  #endif
+
+  static HMODULE
+  load_perl_dll(char *basename)
+  {
+      char buf[300], fail[260];
+      STRLEN l, dirl;
+      fill_extLibpath_t f;
+      ULONG rc_fullname;
+      HMODULE handle, handle1;
+
+      if (_execname(buf, sizeof(buf) - 13) != 0)
+          die_with("Can't find full path: ", strerror(errno), "", "");
+      /* XXXX Fill `me' with new value */
+      l = strlen(buf);
+      while (l && buf[l-1] != '/' && buf[l-1] != '\\')
+          l--;
+      dirl = l - 1;
+      strcpy(buf + l, basename);
+      l += strlen(basename);
+      strcpy(buf + l, ".dll");
+      if ( (rc_fullname = DosLoadModule(fail, sizeof fail, buf, &handle)) != 0
+           && DosLoadModule(fail, sizeof fail, basename, &handle) != 0 )
+          die_with("Can't load DLL ", buf, "", "");
+      if (rc_fullname)
+          return handle;		/* was loaded with short name; all is fine */
+      if (DosQueryProcAddr(handle, 0, "fill_extLibpath", (PFN*)&f))
+          die_with(buf, ": DLL exports no symbol ", "fill_extLibpath", "");
+      buf[dirl] = 0;
+      if (f(0 /*BEGINLIBPATH*/, buf /* prepend */, NULL /* append */,
+            0 /* keep old value */, me))
+          die_with(me, ": prepending BEGINLIBPATH", "", "");
+      if (DosLoadModule(fail, sizeof fail, basename, &handle1) != 0)
+          die_with(me, ": finding perl DLL again via BEGINLIBPATH", "", "");
+      buf[dirl] = '\\';     
+      if (handle1 != handle) {
+          if (DosQueryModuleName(handle1, sizeof(fail), fail))
+              strcpy(fail, "???");
+          die_with(buf, ":\n\tperl DLL via BEGINLIBPATH is different: \n\t",
+                   fail,
+                   "\n\tYou may need to manipulate global BEGINLIBPATH and LIBPATHSTRICT"
+                   "\n\tso that the other copy is loaded via BEGINLIBPATH.");
+      }
+      return handle;
+  }
+
+  int
+  main(int argc, char **argv, char **env)
+  {
+      main_t f;
+      handler_t h;
+    
+      me = argv[0];
+      /**/
+      handle = load_perl_dll(PERL_DLL_BASENAME);
+
+      if (DosQueryProcAddr(handle, 0, "Perl_OS2_handler_install", (PFN*)&h))
+          die_with(PERL_DLL_BASENAME, ": DLL exports no symbol ", "Perl_OS2_handler_install", "");
+      if ( !h((void *)"~installprefix", Perlos2_handler_perllib_from)
+           || !h((void *)"~dll", Perlos2_handler_perllib_to)
+           || !h((void *)"~dll/sh/ksh.exe", Perlos2_handler_perl_sh) )
+          die_with(PERL_DLL_BASENAME, ": Can't install @INC manglers", "", "");
+
+      if (DosQueryProcAddr(handle, 0, "dll_perlmain", (PFN*)&f))
+          die_with(PERL_DLL_BASENAME, ": DLL exports no symbol ", "dll_perlmain", "");
+      return f(argc, argv, env);
+  }
+
+
+=head1 Build FAQ
+
+=head2 Some C</> became C<\> in pdksh.
+
+You have a very old pdksh. See L<Prerequisites>.
+
+=head2 C<'errno'> - unresolved external
+
+You do not have MT-safe F<db.lib>. See L<Prerequisites>.
+
+=head2 Problems with tr or sed
+
+reported with very old version of tr and sed.
+
+=head2 Some problem (forget which ;-)
+
+You have an older version of F<perl.dll> on your LIBPATH, which
+broke the build of extensions.
+
+=head2 Library ... not found
+
+You did not run C<omflibs>. See L<Prerequisites>.
+
+=head2 Segfault in make
+
+You use an old version of GNU make. See L<Prerequisites>.
+
+=head2 op/sprintf test failure
+
+This can result from a bug in emx sprintf which was fixed in 0.9d fix 03.
+
+=head1 Specific (mis)features of OS/2 port
+
+=head2 C<setpriority>, C<getpriority>
+
+Note that these functions are compatible with *nix, not with the older
+ports of '94 - 95. The priorities are absolute, go from 32 to -95,
+lower is quicker. 0 is the default priority.
+
+B<WARNING>.  Calling C<getpriority> on a non-existing process could lock
+the system before Warp3 fixpak22.  Starting with Warp3, Perl will use
+a workaround: it aborts getpriority() if the process is not present.
+This is not possible on older versions C<2.*>, and has a race
+condition anyway.
+
+=head2 C<system()>
+
+Multi-argument form of C<system()> allows an additional numeric
+argument. The meaning of this argument is described in
+L<OS2::Process>.
+
+When finding a program to run, Perl first asks the OS to look for executables
+on C<PATH> (OS/2 adds extension F<.exe> if no extension is present).
+If not found, it looks for a script with possible extensions 
+added in this order: no extension, F<.cmd>, F<.btm>, 
+F<.bat>, F<.pl>.  If found, Perl checks the start of the file for magic
+strings C<"#!"> and C<"extproc ">.  If found, Perl uses the rest of the
+first line as the beginning of the command line to run this script.  The
+only mangling done to the first line is extraction of arguments (currently
+up to 3), and ignoring of the path-part of the "interpreter" name if it can't
+be found using the full path.
+
+E.g., C<system 'foo', 'bar', 'baz'> may lead Perl to finding
+F<C:/emx/bin/foo.cmd> with the first line being
+
+ extproc /bin/bash    -x   -c
+
+If F</bin/bash.exe> is not found, then Perl looks for an executable F<bash.exe> on
+C<PATH>.  If found in F<C:/emx.add/bin/bash.exe>, then the above system() is
+translated to
+
+  system qw(C:/emx.add/bin/bash.exe -x -c C:/emx/bin/foo.cmd bar baz)
+
+One additional translation is performed: instead of F</bin/sh> Perl uses
+the hardwired-or-customized shell (see C<L<"PERL_SH_DIR">>).
+
+The above search for "interpreter" is recursive: if F<bash> executable is not
+found, but F<bash.btm> is found, Perl will investigate its first line etc.
+The only hardwired limit on the recursion depth is implicit: there is a limit
+4 on the number of additional arguments inserted before the actual arguments
+given to system().  In particular, if no additional arguments are specified
+on the "magic" first lines, then the limit on the depth is 4.
+
+If Perl finds that the found executable is of PM type when the
+current session is not, it will start the new process in a separate session of
+necessary type.  Call via C<OS2::Process> to disable this magic.
+
+B<WARNING>.  Due to the described logic, you need to explicitly
+specify F<.com> extension if needed.  Moreover, if the executable
+F<perl5.6.1> is requested, Perl will not look for F<perl5.6.1.exe>.
+[This may change in the future.]
+
+=head2 C<extproc> on the first line
+
+If the first chars of a Perl script are C<"extproc ">, this line is treated
+as C<#!>-line, thus all the switches on this line are processed (twice
+if script was started via cmd.exe).  See L<perlrun/DESCRIPTION>.
+
+=head2 Additional modules:
+
+L<OS2::Process>, L<OS2::DLL>, L<OS2::REXX>, L<OS2::PrfDB>, L<OS2::ExtAttr>. These
+modules provide access to additional numeric argument for C<system>
+and to the information about the running process,
+to DLLs having functions with REXX signature and to the REXX runtime, to
+OS/2 databases in the F<.INI> format, and to Extended Attributes.
+
+Two additional extensions by Andreas Kaiser, C<OS2::UPM>, and
+C<OS2::FTP>, are included into C<ILYAZ> directory, mirrored on CPAN.
+Other OS/2-related extensions are available too.
+
+=head2 Prebuilt methods:
+
+=over 4
+
+=item C<File::Copy::syscopy>
+
+used by C<File::Copy::copy>, see L<File::Copy>.
+
+=item C<DynaLoader::mod2fname>
+
+used by C<DynaLoader> for DLL name mangling.
+
+=item  C<Cwd::current_drive()>
+
+Self explanatory.
+
+=item  C<Cwd::sys_chdir(name)>
+
+leaves drive as it is.
+
+=item  C<Cwd::change_drive(name)>
+
+chanes the "current" drive.
+
+=item  C<Cwd::sys_is_absolute(name)>
+
+means has drive letter and is_rooted.
+
+=item  C<Cwd::sys_is_rooted(name)>
+
+means has leading C<[/\\]> (maybe after a drive-letter:).
+
+=item  C<Cwd::sys_is_relative(name)>
+
+means changes with current dir.
+
+=item  C<Cwd::sys_cwd(name)>
+
+Interface to cwd from EMX. Used by C<Cwd::cwd>.
+
+=item  C<Cwd::sys_abspath(name, dir)>
+
+Really really odious function to implement. Returns absolute name of
+file which would have C<name> if CWD were C<dir>.  C<Dir> defaults to the
+current dir.
+
+=item  C<Cwd::extLibpath([type])>
+
+Get current value of extended library search path. If C<type> is
+present and positive, works with C<END_LIBPATH>, if negative, works
+with C<LIBPATHSTRICT>, otherwise with C<BEGIN_LIBPATH>. 
+
+=item  C<Cwd::extLibpath_set( path [, type ] )>
+
+Set current value of extended library search path. If C<type> is
+present and positive, works with <END_LIBPATH>, if negative, works
+with C<LIBPATHSTRICT>, otherwise with C<BEGIN_LIBPATH>.
+
+=item C<OS2::Error(do_harderror,do_exception)>
+
+Returns	C<undef> if it was not called yet, otherwise bit 1 is
+set if on the previous call do_harderror was enabled, bit
+2 is set if on previous call do_exception was enabled.
+
+This function enables/disables error popups associated with 
+hardware errors (Disk not ready etc.) and software exceptions.
+
+I know of no way to find out the state of popups I<before> the first call
+to this function.
+
+=item C<OS2::Errors2Drive(drive)>
+
+Returns C<undef> if it was not called yet, otherwise return false if errors
+were not requested to be written to a hard drive, or the drive letter if
+this was requested.
+
+This function may redirect error popups associated with hardware errors
+(Disk not ready etc.) and software exceptions to the file POPUPLOG.OS2 at
+the root directory of the specified drive.  Overrides OS2::Error() specified
+by individual programs.  Given argument undef will disable redirection.
+
+Has global effect, persists after the application exits.
+
+I know of no way to find out the state of redirection of popups to the disk
+I<before> the first call to this function.
+
+=item OS2::SysInfo()
+
+Returns a hash with system information. The keys of the hash are
+
+	MAX_PATH_LENGTH, MAX_TEXT_SESSIONS, MAX_PM_SESSIONS,
+	MAX_VDM_SESSIONS, BOOT_DRIVE, DYN_PRI_VARIATION,
+	MAX_WAIT, MIN_SLICE, MAX_SLICE, PAGE_SIZE,
+	VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION,
+	MS_COUNT, TIME_LOW, TIME_HIGH, TOTPHYSMEM, TOTRESMEM,
+	TOTAVAILMEM, MAXPRMEM, MAXSHMEM, TIMER_INTERVAL,
+	MAX_COMP_LENGTH, FOREGROUND_FS_SESSION,
+	FOREGROUND_PROCESS
+
+=item OS2::BootDrive()
+
+Returns a letter without colon.
+
+=item C<OS2::MorphPM(serve)>, C<OS2::UnMorphPM(serve)>
+
+Transforms the current application into a PM application and back.
+The argument true means that a real message loop is going to be served.
+OS2::MorphPM() returns the PM message queue handle as an integer.
+
+See L<"Centralized management of resources"> for additional details.
+
+=item C<OS2::Serve_Messages(force)>
+
+Fake on-demand retrieval of outstanding PM messages.  If C<force> is false,
+will not dispatch messages if a real message loop is known to
+be present.  Returns number of messages retrieved.
+
+Dies with "QUITing..." if WM_QUIT message is obtained.
+
+=item C<OS2::Process_Messages(force [, cnt])>
+
+Retrieval of PM messages until window creation/destruction.  
+If C<force> is false, will not dispatch messages if a real message loop
+is known to be present.
+
+Returns change in number of windows.  If C<cnt> is given,
+it is incremented by the number of messages retrieved.
+
+Dies with "QUITing..." if WM_QUIT message is obtained.
+
+=item C<OS2::_control87(new,mask)>
+
+the same as L<_control87(3)> of EMX.  Takes integers as arguments, returns
+the previous coprocessor control word as an integer.  Only bits in C<new> which
+are present in C<mask> are changed in the control word.
+
+=item OS2::get_control87()
+
+gets the coprocessor control word as an integer.
+
+=item C<OS2::set_control87_em(new=MCW_EM,mask=MCW_EM)>
+
+The variant of OS2::_control87() with default values good for
+handling exception mask: if no C<mask>, uses exception mask part of C<new>
+only.  If no C<new>, disables all the floating point exceptions.
+
+See L<"Misfeatures"> for details.
+
+=item C<OS2::DLLname([how [, \&xsub]])>
+
+Gives the information about the Perl DLL or the DLL containing the C
+function bound to by C<&xsub>.  The meaning of C<how> is: default (2):
+full name; 0: handle; 1: module name.
+
+=back
+
+(Note that some of these may be moved to different libraries -
+eventually).
+
+
+=head2 Prebuilt variables:
+
+=over 4
+
+=item $OS2::emx_rev
+
+numeric value is the same as _emx_rev of EMX, a string value the same
+as _emx_vprt (similar to C<0.9c>).
+
+=item $OS2::emx_env
+
+same as _emx_env of EMX, a number similar to 0x8001.
+
+=item $OS2::os_ver
+
+a number C<OS_MAJOR + 0.001 * OS_MINOR>.
+
+=item $OS2::is_aout
+
+true if the Perl library was compiled in AOUT format.
+
+=item $OS2::can_fork
+
+true if the current executable is an AOUT EMX executable, so Perl can
+fork.  Do not use this, use the portable check for
+$Config::Config{dfork}.
+
+=item $OS2::nsyserror
+
+This variable (default is 1) controls whether to enforce the contents
+of $^E to start with C<SYS0003>-like id.  If set to 0, then the string
+value of $^E is what is available from the OS/2 message file.  (Some
+messages in this file have an C<SYS0003>-like id prepended, some not.)
+
+=back
+
+=head2 Misfeatures
+
+=over 4
+
+=item *
+
+Since L<flock(3)> is present in EMX, but is not functional, it is 
+emulated by perl.  To disable the emulations, set environment variable
+C<USE_PERL_FLOCK=0>.
+
+=item *
+
+Here is the list of things which may be "broken" on
+EMX (from EMX docs):
+
+=over 4
+
+=item *
+
+The functions L<recvmsg(3)>, L<sendmsg(3)>, and L<socketpair(3)> are not
+implemented.
+
+=item *
+
+L<sock_init(3)> is not required and not implemented.
+
+=item *
+
+L<flock(3)> is not yet implemented (dummy function).  (Perl has a workaround.)
+
+=item *
+
+L<kill(3)>:  Special treatment of PID=0, PID=1 and PID=-1 is not implemented.
+
+=item *
+
+L<waitpid(3)>:
+
+      WUNTRACED
+	      Not implemented.
+      waitpid() is not implemented for negative values of PID.
+
+=back
+
+Note that C<kill -9> does not work with the current version of EMX.
+
+=item *
+
+See L<"Text-mode filehandles">.
+
+=item *
+
+Unix-domain sockets on OS/2 live in a pseudo-file-system C</sockets/...>.
+To avoid a failure to create a socket with a name of a different form,
+C<"/socket/"> is prepended to the socket name (unless it starts with this
+already).
+
+This may lead to problems later in case the socket is accessed via the
+"usual" file-system calls using the "initial" name.
+
+=item *
+
+Apparently, IBM used a compiler (for some period of time around '95?) which
+changes FP mask right and left.  This is not I<that> bad for IBM's
+programs, but the same compiler was used for DLLs which are used with
+general-purpose applications.  When these DLLs are used, the state of
+floating-point flags in the application is not predictable.
+
+What is much worse, some DLLs change the floating point flags when in
+_DLLInitTerm() (e.g., F<TCP32IP>).  This means that even if you do not I<call>
+any function in the DLL, just the act of loading this DLL will reset your
+flags.  What is worse, the same compiler was used to compile some HOOK DLLs.
+Given that HOOK dlls are executed in the context of I<all> the applications
+in the system, this means a complete unpredictablity of floating point
+flags on systems using such HOOK DLLs.  E.g., F<GAMESRVR.DLL> of B<DIVE>
+origin changes the floating point flags on each write to the TTY of a VIO
+(windowed text-mode) applications.
+
+Some other (not completely debugged) situations when FP flags change include
+some video drivers (?), and some operations related to creation of the windows.
+People who code B<OpenGL> may have more experience on this.
+
+Perl is generally used in the situation when all the floating-point
+exceptions are ignored, as is the default under EMX.  If they are not ignored,
+some benign Perl programs would get a C<SIGFPE> and would die a horrible death.
+
+To circumvent this, Perl uses two hacks.  They help against I<one> type of
+damage only: FP flags changed when loading a DLL.
+
+One of the hacks is to disable floating point exceptions on Perl startup (as
+is the default with EMX).  This helps only with compile-time-linked DLLs
+changing the flags before main() had a chance to be called.
+
+The other hack is to restore FP flags after a call to dlopen().  This helps
+against similar damage done by DLLs _DLLInitTerm() at runtime.  Currently
+no way to switch these hacks off is provided.
+
+=back
+
+=head2 Modifications
+
+Perl modifies some standard C library calls in the following ways:
+
+=over 9
+
+=item C<popen>
+
+C<my_popen> uses F<sh.exe> if shell is required, cf. L<"PERL_SH_DIR">.
+
+=item C<tmpnam>
+
+is created using C<TMP> or C<TEMP> environment variable, via
+C<tempnam>.
+
+=item C<tmpfile>
+
+If the current directory is not writable, file is created using modified
+C<tmpnam>, so there may be a race condition.
+
+=item C<ctermid>
+
+a dummy implementation.
+
+=item C<stat>
+
+C<os2_stat> special-cases F</dev/tty> and F</dev/con>.
+
+=item C<mkdir>, C<rmdir>
+
+these EMX functions do not work if the path contains a trailing C</>.
+Perl contains a workaround for this.
+
+=item C<flock>
+
+Since L<flock(3)> is present in EMX, but is not functional, it is 
+emulated by perl.  To disable the emulations, set environment variable
+C<USE_PERL_FLOCK=0>.
+
+=back
+
+=head2 Identifying DLLs
+
+All the DLLs built with the current versions of Perl have ID strings
+identifying the name of the extension, its version, and the version
+of Perl required for this DLL.  Run C<bldlevel DLL-name> to find this
+info.
+
+=head2 Centralized management of resources
+
+Since to call certain OS/2 API one needs to have a correctly initialized
+C<Win> subsystem, OS/2-specific extensions may require getting C<HAB>s and
+C<HMQ>s.  If an extension would do it on its own, another extension could
+fail to initialize.
+
+Perl provides a centralized management of these resources:
+
+=over
+
+=item C<HAB>
+
+To get the HAB, the extension should call C<hab = perl_hab_GET()> in C.  After
+this call is performed, C<hab> may be accessed as C<Perl_hab>.  There is
+no need to release the HAB after it is used.
+
+If by some reasons F<perl.h> cannot be included, use
+
+  extern int Perl_hab_GET(void);
+
+instead.
+
+=item C<HMQ>
+
+There are two cases:
+
+=over
+
+=item *
+
+the extension needs an C<HMQ> only because some API will not work otherwise.
+Use C<serve = 0> below.
+
+=item *
+
+the extension needs an C<HMQ> since it wants to engage in a PM event loop.
+Use C<serve = 1> below.
+
+=back
+
+To get an C<HMQ>, the extension should call C<hmq = perl_hmq_GET(serve)> in C.
+After this call is performed, C<hmq> may be accessed as C<Perl_hmq>.
+
+To signal to Perl that HMQ is not needed any more, call
+C<perl_hmq_UNSET(serve)>.  Perl process will automatically morph/unmorph itself
+into/from a PM process if HMQ is needed/not-needed.  Perl will automatically
+enable/disable C<WM_QUIT> message during shutdown if the message queue is
+served/not-served.
+
+B<NOTE>.  If during a shutdown there is a message queue which did not disable
+WM_QUIT, and which did not process the received WM_QUIT message, the
+shutdown will be automatically cancelled.  Do not call C<perl_hmq_GET(1)>
+unless you are going to process messages on an orderly basis.
+
+=item * Treating errors reported by OS/2 API
+
+There are two principal conventions (it is useful to call them C<Dos*>
+and C<Win*> - though this part of the function signature is not always
+determined by the name of the API) of reporting the error conditions
+of OS/2 API.  Most of C<Dos*> APIs report the error code as the result
+of the call (so 0 means success, and there are many types of errors).
+Most of C<Win*> API report success/fail via the result being
+C<TRUE>/C<FALSE>; to find the reason for the failure one should call
+WinGetLastError() API.
+
+Some C<Win*> entry points also overload a "meaningful" return value
+with the error indicator; having a 0 return value indicates an error.
+Yet some other C<Win*> entry points overload things even more, and 0
+return value may mean a successful call returning a valid value 0, as
+well as an error condition; in the case of a 0 return value one should
+call WinGetLastError() API to distinguish a successful call from a
+failing one.
+
+By convention, all the calls to OS/2 API should indicate their
+failures by resetting $^E.  All the Perl-accessible functions which
+call OS/2 API may be broken into two classes: some die()s when an API
+error is encountered, the other report the error via a false return
+value (of course, this does not concern Perl-accessible functions
+which I<expect> a failure of the OS/2 API call, having some workarounds
+coded).
+
+Obviously, in the situation of the last type of the signature of an OS/2
+API, it is must more convenient for the users if the failure is
+indicated by die()ing: one does not need to check $^E to know that
+something went wrong.  If, however, this solution is not desirable by
+some reason, the code in question should reset $^E to 0 before making
+this OS/2 API call, so that the caller of this Perl-accessible
+function has a chance to distinguish a success-but-0-return value from
+a failure.  (One may return undef as an alternative way of reporting
+an error.)
+
+The macros to simplify this type of error propagation are
+
+=over
+
+=item C<CheckOSError(expr)>
+
+Returns true on error, sets $^E.  Expects expr() be a call of
+C<Dos*>-style API.
+
+=item C<CheckWinError(expr)>
+
+Returns true on error, sets $^E.  Expects expr() be a call of
+C<Win*>-style API.
+
+=item C<SaveWinError(expr)>
+
+Returns C<expr>, sets $^E from WinGetLastError() if C<expr> is false.
+
+=item C<SaveCroakWinError(expr,die,name1,name2)>
+
+Returns C<expr>, sets $^E from WinGetLastError() if C<expr> is false,
+and die()s if C<die> and $^E are true.  The message to die is the
+concatenated strings C<name1> and C<name2>, separated by C<": "> from
+the contents of $^E.
+
+=item C<WinError_2_Perl_rc>
+
+Sets C<Perl_rc> to the return value of WinGetLastError().
+
+=item C<FillWinError>
+
+Sets C<Perl_rc> to the return value of WinGetLastError(), and sets $^E
+to the corresponding value.
+
+=item C<FillOSError(rc)>
+
+Sets C<Perl_rc> to C<rc>, and sets $^E to the corresponding value.
+
+=back
+
+=item * Loading DLLs and ordinals in DLLs
+
+Some DLLs are only present in some versions of OS/2, or in some
+configurations of OS/2.  Some exported entry points are present only
+in DLLs shipped with some versions of OS/2.  If these DLLs and entry
+points were linked directly for a Perl executable/DLL or from a Perl
+extensions, this binary would work only with the specified
+versions/setups.  Even if these entry points were not needed, the
+I<load> of the executable (or DLL) would fail.
+
+For example, many newer useful APIs are not present in OS/2 v2; many
+PM-related APIs require DLLs not available on floppy-boot setup.
+
+To make these calls fail I<only when the calls are executed>, one
+should call these API via a dynamic linking API.  There is a subsystem
+in Perl to simplify such type of calls.  A large number of entry
+points available for such linking is provided (see C<entries_ordinals>
+- and also C<PMWIN_entries> - in F<os2ish.h>).  These ordinals can be
+accessed via the APIs:
+
+  CallORD(), DeclFuncByORD(), DeclVoidFuncByORD(),
+  DeclOSFuncByORD(), DeclWinFuncByORD(), AssignFuncPByORD(),
+  DeclWinFuncByORD_CACHE(), DeclWinFuncByORD_CACHE_survive(),
+  DeclWinFuncByORD_CACHE_resetError_survive(),
+  DeclWinFunc_CACHE(), DeclWinFunc_CACHE_resetError(),
+  DeclWinFunc_CACHE_survive(), DeclWinFunc_CACHE_resetError_survive()
+
+See the header files and the C code in the supplied OS/2-related
+modules for the details on usage of these functions.
+
+Some of these functions also combine dynaloading semantic with the
+error-propagation semantic discussed above.
+
+=back
+
+=head1 Perl flavors
+
+Because of idiosyncrasies of OS/2 one cannot have all the eggs in the
+same basket (though EMX environment tries hard to overcome this
+limitations, so the situation may somehow improve). There are 4
+executables for Perl provided by the distribution:
+
+=head2 F<perl.exe>
+
+The main workhorse. This is a chimera executable: it is compiled as an
+C<a.out>-style executable, but is linked with C<omf>-style dynamic
+library F<perl.dll>, and with dynamic CRT DLL. This executable is a
+VIO application.
+
+It can load perl dynamic extensions, and it can fork().
+
+B<Note.> Keep in mind that fork() is needed to open a pipe to yourself.
+
+=head2 F<perl_.exe>
+
+This is a statically linked C<a.out>-style executable. It cannot
+load dynamic Perl extensions. The executable supplied in binary
+distributions has a lot of extensions prebuilt, thus the above restriction is 
+important only if you use custom-built extensions. This executable is a VIO
+application.
+
+I<This is the only executable with does not require OS/2.> The
+friends locked into C<M$> world would appreciate the fact that this
+executable runs under DOS, Win0.3*, Win0.95 and WinNT with an
+appropriate extender. See L<"Other OSes">.
+
+=head2 F<perl__.exe>
+
+This is the same executable as F<perl___.exe>, but it is a PM
+application. 
+
+B<Note.> Usually (unless explicitly redirected during the startup)
+STDIN, STDERR, and STDOUT of a PM
+application are redirected to F<nul>. However, it is possible to I<see>
+them if you start C<perl__.exe> from a PM program which emulates a
+console window, like I<Shell mode> of Emacs or EPM. Thus it I<is
+possible> to use Perl debugger (see L<perldebug>) to debug your PM
+application (but beware of the message loop lockups - this will not
+work if you have a message queue to serve, unless you hook the serving
+into the getc() function of the debugger).
+
+Another way to see the output of a PM program is to run it as
+
+  pm_prog args 2>&1 | cat -
+
+with a shell I<different> from F<cmd.exe>, so that it does not create
+a link between a VIO session and the session of C<pm_porg>.  (Such a link
+closes the VIO window.)  E.g., this works with F<sh.exe> - or with Perl!
+
+  open P, 'pm_prog args 2>&1 |' or die;
+  print while <P>;
+
+The flavor F<perl__.exe> is required if you want to start your program without
+a VIO window present, but not C<detach>ed (run C<help detach> for more info).
+Very useful for extensions which use PM, like C<Perl/Tk> or C<OpenGL>.
+
+Note also that the differences between PM and VIO executables are only
+in the I<default> behaviour.  One can start I<any> executable in
+I<any> kind of session by using the arguments C</fs>, C</pm> or
+C</win> switches of the command C<start> (of F<CMD.EXE> or a similar
+shell).  Alternatively, one can use the numeric first argument of the
+C<system> Perl function (see L<OS2::Process>).
+
+=head2 F<perl___.exe>
+
+This is an C<omf>-style executable which is dynamically linked to
+F<perl.dll> and CRT DLL. I know no advantages of this executable
+over C<perl.exe>, but it cannot fork() at all. Well, one advantage is
+that the build process is not so convoluted as with C<perl.exe>.
+
+It is a VIO application.
+
+=head2 Why strange names?
+
+Since Perl processes the C<#!>-line (cf. 
+L<perlrun/DESCRIPTION>, L<perlrun/Switches>,
+L<perldiag/"Not a perl script">, 
+L<perldiag/"No Perl script found in input">), it should know when a
+program I<is a Perl>. There is some naming convention which allows
+Perl to distinguish correct lines from wrong ones. The above names are
+almost the only names allowed by this convention which do not contain
+digits (which have absolutely different semantics).
+
+=head2 Why dynamic linking?
+
+Well, having several executables dynamically linked to the same huge
+library has its advantages, but this would not substantiate the
+additional work to make it compile. The reason is the complicated-to-developers
+but very quick and convenient-to-users "hard" dynamic linking used by OS/2.
+
+There are two distinctive features of the dyna-linking model of OS/2:
+first, all the references to external functions are resolved at the compile time;
+second, there is no runtime fixup of the DLLs after they are loaded into memory.
+The first feature is an enormous advantage over other models: it avoids
+conflicts when several DLLs used by an application export entries with
+the same name.  In such cases "other" models of dyna-linking just choose
+between these two entry points using some random criterion - with predictable
+disasters as results.  But it is the second feature which requires the build
+of F<perl.dll>.
+
+The address tables of DLLs are patched only once, when they are
+loaded. The addresses of the entry points into DLLs are guaranteed to be
+the same for all the programs which use the same DLL.  This removes the
+runtime fixup - once DLL is loaded, its code is read-only.
+
+While this allows some (significant?) performance advantages, this makes life
+much harder for developers, since the above scheme makes it impossible
+for a DLL to be "linked" to a symbol in the F<.EXE> file.  Indeed, this
+would need a DLL to have different relocations tables for the
+(different) executables which use this DLL.
+
+However, a dynamically loaded Perl extension is forced to use some symbols
+from the perl
+executable, e.g., to know how to find the arguments to the functions:
+the arguments live on the perl
+internal evaluation stack. The solution is to put the main code of
+the interpreter into a DLL, and make the F<.EXE> file which just loads
+this DLL into memory and supplies command-arguments.  The extension DLL
+cannot link to symbols in F<.EXE>, but it has no problem linking
+to symbols in the F<.DLL>.
+
+This I<greatly> increases the load time for the application (as well as
+complexity of the compilation). Since interpreter is in a DLL,
+the C RTL is basically forced to reside in a DLL as well (otherwise
+extensions would not be able to use CRT).  There are some advantages if
+you use different flavors of perl, such as running F<perl.exe> and
+F<perl__.exe> simultaneously: they share the memory of F<perl.dll>.
+
+B<NOTE>.  There is one additional effect which makes DLLs more wasteful:
+DLLs are loaded in the shared memory region, which is a scarse resource
+given the 512M barrier of the "standard" OS/2 virtual memory.  The code of
+F<.EXE> files is also shared by all the processes which use the particular
+F<.EXE>, but they are "shared in the private address space of the process";
+this is possible because the address at which different sections
+of the F<.EXE> file are loaded is decided at compile-time, thus all the
+processes have these sections loaded at same addresses, and no fixup
+of internal links inside the F<.EXE> is needed.
+
+Since DLLs may be loaded at run time, to have the same mechanism for DLLs
+one needs to have the address range of I<any of the loaded> DLLs in the
+system to be available I<in all the processes> which did not load a particular
+DLL yet.  This is why the DLLs are mapped to the shared memory region.
+
+=head2 Why chimera build?
+
+Current EMX environment does not allow DLLs compiled using Unixish
+C<a.out> format to export symbols for data (or at least some types of
+data). This forces C<omf>-style compile of F<perl.dll>.
+
+Current EMX environment does not allow F<.EXE> files compiled in
+C<omf> format to fork(). fork() is needed for exactly three Perl
+operations:
+
+=over 4
+
+=item *
+
+explicit fork() in the script, 
+
+=item *
+
+C<open FH, "|-">
+
+=item *
+
+C<open FH, "-|">, in other words, opening pipes to itself.
+
+=back
+
+While these operations are not questions of life and death, they are
+needed for a lot of
+useful scripts. This forces C<a.out>-style compile of
+F<perl.exe>.
+
+
+=head1 ENVIRONMENT
+
+Here we list environment variables with are either OS/2- and DOS- and
+Win*-specific, or are more important under OS/2 than under other OSes.
+
+=head2 C<PERLLIB_PREFIX>
+
+Specific for EMX port. Should have the form
+
+  path1;path2
+
+or
+
+  path1 path2
+
+If the beginning of some prebuilt path matches F<path1>, it is
+substituted with F<path2>.
+
+Should be used if the perl library is moved from the default
+location in preference to C<PERL(5)LIB>, since this would not leave wrong
+entries in @INC.  For example, if the compiled version of perl looks for @INC
+in F<f:/perllib/lib>, and you want to install the library in
+F<h:/opt/gnu>, do
+
+  set PERLLIB_PREFIX=f:/perllib/lib;h:/opt/gnu
+
+This will cause Perl with the prebuilt @INC of
+
+  f:/perllib/lib/5.00553/os2
+  f:/perllib/lib/5.00553
+  f:/perllib/lib/site_perl/5.00553/os2
+  f:/perllib/lib/site_perl/5.00553
+  .
+
+to use the following @INC:
+
+  h:/opt/gnu/5.00553/os2
+  h:/opt/gnu/5.00553
+  h:/opt/gnu/site_perl/5.00553/os2
+  h:/opt/gnu/site_perl/5.00553
+  .
+
+=head2 C<PERL_BADLANG>
+
+If 0, perl ignores setlocale() failing. May be useful with some
+strange I<locale>s.
+
+=head2 C<PERL_BADFREE>
+
+If 0, perl would not warn of in case of unwarranted free(). With older
+perls this might be
+useful in conjunction with the module DB_File, which was buggy when
+dynamically linked and OMF-built.
+
+Should not be set with newer Perls, since this may hide some I<real> problems.
+
+=head2 C<PERL_SH_DIR>
+
+Specific for EMX port. Gives the directory part of the location for
+F<sh.exe>.
+
+=head2 C<USE_PERL_FLOCK>
+
+Specific for EMX port. Since L<flock(3)> is present in EMX, but is not 
+functional, it is emulated by perl.  To disable the emulations, set 
+environment variable C<USE_PERL_FLOCK=0>.
+
+=head2 C<TMP> or C<TEMP>
+
+Specific for EMX port. Used as storage place for temporary files.
+
+=head1 Evolution
+
+Here we list major changes which could make you by surprise.
+
+=head2 Text-mode filehandles
+
+Starting from version 5.8, Perl uses a builtin translation layer for
+text-mode files.  This replaces the efficient well-tested EMX layer by
+some code which should be best characterized as a "quick hack".
+
+In addition to possible bugs and an inability to follow changes to the
+translation policy with off/on switches of TERMIO translation, this
+introduces a serious incompatible change: before sysread() on
+text-mode filehandles would go through the translation layer, now it
+would not.
+
+=head2 Priorities
+
+C<setpriority> and C<getpriority> are not compatible with earlier
+ports by Andreas Kaiser. See C<"setpriority, getpriority">.
+
+=head2 DLL name mangling: pre 5.6.2
+
+With the release 5.003_01 the dynamically loadable libraries
+should be rebuilt when a different version of Perl is compiled. In particular,
+DLLs (including F<perl.dll>) are now created with the names
+which contain a checksum, thus allowing workaround for OS/2 scheme of
+caching DLLs.
+
+It may be possible to code a simple workaround which would 
+
+=over
+
+=item *
+
+find the old DLLs looking through the old @INC;
+
+=item *
+
+mangle the names according to the scheme of new perl and copy the DLLs to
+these names;
+
+=item *
+
+edit the internal C<LX> tables of DLL to reflect the change of the name
+(probably not needed for Perl extension DLLs, since the internally coded names
+are not used for "specific" DLLs, they used only for "global" DLLs).
+
+=item *
+
+edit the internal C<IMPORT> tables and change the name of the "old"
+F<perl????.dll> to the "new" F<perl????.dll>.
+
+=back
+
+=head2 DLL name mangling: 5.6.2 and beyond
+
+In fact mangling of I<extension> DLLs was done due to misunderstanding
+of the OS/2 dynaloading model.  OS/2 (effectively) maintains two
+different tables of loaded DLL:
+
+=over
+
+=item Global DLLs
+
+those loaded by the base name from C<LIBPATH>; including those
+associated at link time;
+
+=item specific DLLs
+
+loaded by the full name.
+
+=back
+
+When resolving a request for a global DLL, the table of already-loaded
+specific DLLs is (effectively) ignored; moreover, specific DLLs are
+I<always> loaded from the prescribed path.
+
+There is/was a minor twist which makes this scheme fragile: what to do
+with DLLs loaded from
+
+=over
+
+=item C<BEGINLIBPATH> and C<ENDLIBPATH>
+
+(which depend on the process)
+
+=item F<.> from C<LIBPATH>
+
+which I<effectively> depends on the process (although C<LIBPATH> is the
+same for all the processes).
+
+=back
+
+Unless C<LIBPATHSTRICT> is set to C<T> (and the kernel is after
+2000/09/01), such DLLs are considered to be global.  When loading a
+global DLL it is first looked in the table of already-loaded global
+DLLs.  Because of this the fact that one executable loaded a DLL from
+C<BEGINLIBPATH> and C<ENDLIBPATH>, or F<.> from C<LIBPATH> may affect
+I<which> DLL is loaded when I<another> executable requests a DLL with
+the same name.  I<This> is the reason for version-specific mangling of
+the DLL name for perl DLL.
+
+Since the Perl extension DLLs are always loaded with the full path,
+there is no need to mangle their names in a version-specific ways:
+their directory already reflects the corresponding version of perl,
+and @INC takes into account binary compatibility with older version.
+Starting from C<5.6.2> the name mangling scheme is fixed to be the
+same as for Perl 5.005_53 (same as in a popular binary release).  Thus
+new Perls will be able to I<resolve the names> of old extension DLLs
+if @INC allows finding their directories.
+
+However, this still does not guarantee that these DLL may be loaded.
+The reason is the mangling of the name of the I<Perl DLL>.  And since
+the extension DLLs link with the Perl DLL, extension DLLs for older
+versions would load an older Perl DLL, and would most probably
+segfault (since the data in this DLL is not properly initialized).
+
+There is a partial workaround (which can be made complete with newer
+OS/2 kernels): create a forwarder DLL with the same name as the DLL of
+the older version of Perl, which forwards the entry points to the
+newer Perl's DLL.  Make this DLL accessible on (say) the C<BEGINLIBPATH> of
+the new Perl executable.  When the new executable accesses old Perl's
+extension DLLs, they would request the old Perl's DLL by name, get the
+forwarder instead, so effectively will link with the currently running
+(new) Perl DLL.
+
+This may break in two ways:
+
+=over
+
+=item *
+
+Old perl executable is started when a new executable is running has
+loaded an extension compiled for the old executable (ouph!).  In this
+case the old executable will get a forwarder DLL instead of the old
+perl DLL, so would link with the new perl DLL.  While not directly
+fatal, it will behave the same as new executable.  This beats the whole
+purpose of explicitly starting an old executable.
+
+=item *
+
+A new executable loads an extension compiled for the old executable
+when an old perl executable is running.  In this case the extension
+will not pick up the forwarder - with fatal results.
+
+=back
+
+With support for C<LIBPATHSTRICT> this may be circumvented - unless
+one of DLLs is started from F<.> from C<LIBPATH> (I do not know
+whether C<LIBPATHSTRICT> affects this case).
+
+B<REMARK>.  Unless newer kernels allow F<.> in C<BEGINLIBPATH> (older
+do not), this mess cannot be completely cleaned.  (It turns out that
+as of the beginning of 2002, F<.> is not allowed, but F<.\.> is - and
+it has the same effect.)
+
+
+B<REMARK>.  C<LIBPATHSTRICT>, C<BEGINLIBPATH> and C<ENDLIBPATH> are
+not environment variables, although F<cmd.exe> emulates them on C<SET
+...> lines.  From Perl they may be accessed by L<Cwd::extLibpath> and
+L<Cwd::extLibpath_set>.
+
+=head2 DLL forwarder generation
+
+Assume that the old DLL is named F<perlE0AC.dll> (as is one for
+5.005_53), and the new version is 5.6.1.  Create a file
+F<perl5shim.def-leader> with
+
+  LIBRARY 'perlE0AC' INITINSTANCE TERMINSTANCE
+  DESCRIPTION '@#perl5-porters@perl.org:5.006001#@ Perl module for 5.00553 -> Perl 5.6.1 forwarder'
+  CODE LOADONCALL
+  DATA LOADONCALL NONSHARED MULTIPLE
+  EXPORTS
+
+modifying the versions/names as needed.  Run
+
+ perl -wnle "next if 0../EXPORTS/; print qq(  \"$1\") if /\"(\w+)\"/" perl5.def >lst
+
+in the Perl build directory (to make the DLL smaller replace perl5.def
+with the definition file for the older version of Perl if present).
+
+ cat perl5shim.def-leader lst >perl5shim.def
+ gcc -Zomf -Zdll -o perlE0AC.dll perl5shim.def -s -llibperl
+
+(ignore multiple C<warning L4085>).
+
+=head2 Threading
+
+As of release 5.003_01 perl is linked to multithreaded C RTL
+DLL.  If perl itself is not compiled multithread-enabled, so will not be perl's
+malloc(). However, extensions may use multiple thread on their own
+risk. 
+
+This was needed to compile C<Perl/Tk> for XFree86-OS/2 out-of-the-box, and
+link with DLLs for other useful libraries, which typically are compiled
+with C<-Zmt -Zcrtdll>.
+
+=head2 Calls to external programs
+
+Due to a popular demand the perl external program calling has been
+changed wrt Andreas Kaiser's port.  I<If> perl needs to call an
+external program I<via shell>, the F<f:/bin/sh.exe> will be called, or
+whatever is the override, see L<"PERL_SH_DIR">.
+
+Thus means that you need to get some copy of a F<sh.exe> as well (I
+use one from pdksh). The path F<F:/bin> above is set up automatically during
+the build to a correct value on the builder machine, but is
+overridable at runtime,
+
+B<Reasons:> a consensus on C<perl5-porters> was that perl should use
+one non-overridable shell per platform. The obvious choices for OS/2
+are F<cmd.exe> and F<sh.exe>. Having perl build itself would be impossible
+with F<cmd.exe> as a shell, thus I picked up C<sh.exe>. This assures almost
+100% compatibility with the scripts coming from *nix. As an added benefit 
+this works as well under DOS if you use DOS-enabled port of pdksh 
+(see L<"Prerequisites">).
+
+B<Disadvantages:> currently F<sh.exe> of pdksh calls external programs
+via fork()/exec(), and there is I<no> functioning exec() on
+OS/2. exec() is emulated by EMX by an asynchronous call while the caller
+waits for child completion (to pretend that the C<pid> did not change). This
+means that 1 I<extra> copy of F<sh.exe> is made active via fork()/exec(),
+which may lead to some resources taken from the system (even if we do
+not count extra work needed for fork()ing).
+
+Note that this a lesser issue now when we do not spawn F<sh.exe>
+unless needed (metachars found).
+
+One can always start F<cmd.exe> explicitly via
+
+  system 'cmd', '/c', 'mycmd', 'arg1', 'arg2', ...
+
+If you need to use F<cmd.exe>, and do not want to hand-edit thousands of your
+scripts, the long-term solution proposed on p5-p is to have a directive
+
+  use OS2::Cmd;
+
+which will override system(), exec(), C<``>, and
+C<open(,'...|')>. With current perl you may override only system(),
+readpipe() - the explicit version of C<``>, and maybe exec(). The code
+will substitute the one-argument call to system() by
+C<CORE::system('cmd.exe', '/c', shift)>.
+
+If you have some working code for C<OS2::Cmd>, please send it to me,
+I will include it into distribution. I have no need for such a module, so
+cannot test it.
+
+For the details of the current situation with calling external programs,
+see L<Starting OS/2 (and DOS) programs under Perl>.  Set us mention a couple
+of features:
+
+=over 4
+
+=item *
+
+External scripts may be called by their basename.  Perl will try the same
+extensions as when processing B<-S> command-line switch.
+
+=item *
+
+External scripts starting with C<#!> or C<extproc > will be executed directly,
+without calling the shell, by calling the program specified on the rest of
+the first line.
+
+=back
+
+=head2 Memory allocation
+
+Perl uses its own malloc() under OS/2 - interpreters are usually malloc-bound
+for speed, but perl is not, since its malloc is lightning-fast.
+Perl-memory-usage-tuned benchmarks show that Perl's malloc is 5 times quicker
+than EMX one.  I do not have convincing data about memory footprint, but
+a (pretty random) benchmark showed that Perl's one is 5% better.
+
+Combination of perl's malloc() and rigid DLL name resolution creates
+a special problem with library functions which expect their return value to
+be free()d by system's free(). To facilitate extensions which need to call 
+such functions, system memory-allocation functions are still available with
+the prefix C<emx_> added. (Currently only DLL perl has this, it should 
+propagate to F<perl_.exe> shortly.)
+
+=head2 Threads
+
+One can build perl with thread support enabled by providing C<-D usethreads>
+option to F<Configure>.  Currently OS/2 support of threads is very 
+preliminary.
+
+Most notable problems: 
+
+=over 4
+
+=item C<COND_WAIT> 
+
+may have a race condition (but probably does not due to edge-triggered
+nature of OS/2 Event semaphores).  (Needs a reimplementation (in terms of chaining
+waiting threads, with the linked list stored in per-thread structure?)?)
+
+=item F<os2.c>
+
+has a couple of static variables used in OS/2-specific functions.  (Need to be
+moved to per-thread structure, or serialized?)
+
+=back
+
+Note that these problems should not discourage experimenting, since they
+have a low probability of affecting small programs.
+
+=head1 BUGS
+
+This description is not updated often (since 5.6.1?), see F<./os2/Changes>
+(L<perlos2delta>) for more info.
+
+=cut
+
+OS/2 extensions
+~~~~~~~~~~~~~~~
+I include 3 extensions by Andreas Kaiser, OS2::REXX, OS2::UPM, and OS2::FTP, 
+into my ftp directory, mirrored on CPAN. I made
+some minor changes needed to compile them by standard tools. I cannot 
+test UPM and FTP, so I will appreciate your feedback. Other extensions
+there are OS2::ExtAttr, OS2::PrfDB for tied access to EAs and .INI
+files - and maybe some other extensions at the time you read it.
+
+Note that OS2 perl defines 2 pseudo-extension functions
+OS2::Copy::copy and DynaLoader::mod2fname (many more now, see
+L<Prebuilt methods>).
+
+The -R switch of older perl is deprecated. If you need to call a REXX code
+which needs access to variables, include the call into a REXX compartment
+created by 
+	REXX_call {...block...};
+
+Two new functions are supported by REXX code, 
+	REXX_eval 'string';
+	REXX_eval_with 'string', REXX_function_name => \&perl_sub_reference;
+
+If you have some other extensions you want to share, send the code to
+me.  At least two are available: tied access to EA's, and tied access
+to system databases.
+
+=head1 AUTHOR
+
+Ilya Zakharevich, cpan@ilyaz.org
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlos390.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlos390.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlos390.pod	(revision 14489)
@@ -0,0 +1,458 @@
+This document is written in pod format hence there are punctuation
+characters in odd places.  Do not worry, you've apparently got the
+ASCII->EBCDIC translation worked out correctly.  You can read more
+about pod in pod/perlpod.pod or the short summary in the INSTALL file.
+
+=head1 NAME
+
+README.os390 - building and installing Perl for OS/390 and z/OS
+
+=head1 SYNOPSIS
+
+This document will help you Configure, build, test and install Perl
+on OS/390 (aka z/OS) Unix System Services.
+
+=head1 DESCRIPTION
+
+This is a fully ported Perl for OS/390 Version 2 Release 3, 5, 6, 7,
+8, and 9.  It may work on other versions or releases, but those are
+the ones we've tested it on.
+
+You may need to carry out some system configuration tasks before
+running the Configure script for Perl.
+
+
+=head2 Tools
+
+The z/OS Unix Tools and Toys list may prove helpful and contains links
+to ports of much of the software helpful for building Perl.
+http://www-1.ibm.com/servers/eserver/zseries/zos/unix/bpxa1toy.html
+
+
+=head2 Unpacking Perl distribution on OS/390
+
+If using ftp remember to transfer the distribution in binary format.
+
+Gunzip/gzip for OS/390 is discussed at:
+
+  http://www-1.ibm.com/servers/eserver/zseries/zos/unix/faq/bpxqp1.html
+
+to extract an ASCII tar archive on OS/390, try this:
+
+   pax -o to=IBM-1047,from=ISO8859-1 -r < latest.tar
+
+or
+
+   zcat latest.tar.Z | pax -o to=IBM-1047,from=ISO8859-1 -r
+
+If you get lots of errors of the form
+
+  tar: FSUM7171 ...: cannot set uid/gid: EDC5139I Operation not permitted.
+
+you didn't read the above and tried to use tar instead of pax, you'll
+first have to remove the (now corrupt) perl directory
+
+   rm -rf perl-...
+
+and then use pax.
+
+=head2 Setup and utilities for Perl on OS/390
+
+Be sure that your yacc installation is in place including any necessary
+parser template files. If you have not already done so then be sure to:
+
+  cp /samples/yyparse.c /etc
+
+This may also be a good time to ensure that your /etc/protocol file
+and either your /etc/resolv.conf or /etc/hosts files are in place.
+The IBM document that described such USS system setup issues was
+SC28-1890-07 "OS/390 UNIX System Services Planning", in particular
+Chapter 6 on customizing the OE shell.
+
+GNU make for OS/390, which is recommended for the build of perl (as
+well as building CPAN modules and extensions), is available from the
+L</Tools>.
+
+Some people have reported encountering "Out of memory!" errors while
+trying to build Perl using GNU make binaries.  If you encounter such
+trouble then try to download the source code kit and build GNU make
+from source to eliminate any such trouble.  You might also find GNU make
+(as well as Perl and Apache) in the red-piece/book "Open Source Software
+for OS/390 UNIX", SG24-5944-00 from IBM.
+
+If instead of the recommended GNU make you would like to use the system
+supplied make program then be sure to install the default rules file
+properly via the shell command:
+
+    cp /samples/startup.mk /etc
+
+and be sure to also set the environment variable _C89_CCMODE=1 (exporting
+_C89_CCMODE=1 is also a good idea for users of GNU make).
+
+You might also want to have GNU groff for OS/390 installed before
+running the "make install" step for Perl.
+
+There is a syntax error in the /usr/include/sys/socket.h header file
+that IBM supplies with USS V2R7, V2R8, and possibly V2R9.  The problem with
+the header file is that near the definition of the SO_REUSEPORT constant
+there is a spurious extra '/' character outside of a comment like so:
+
+ #define SO_REUSEPORT    0x0200    /* allow local address & port
+                                      reuse */                    /
+
+You could edit that header yourself to remove that last '/', or you might
+note that Language Environment (LE) APAR PQ39997 describes the problem
+and PTF's UQ46272 and UQ46271 are the (R8 at least) fixes and apply them.
+If left unattended that syntax error will turn up as an inability for Perl
+to build its "Socket" extension.
+
+For successful testing you may need to turn on the sticky bit for your
+world readable /tmp directory if you have not already done so (see man chmod).
+
+=head2 Configure Perl on OS/390
+
+Once you've unpacked the distribution, run "sh Configure" (see INSTALL
+for a full discussion of the Configure options).  There is a "hints" file
+for os390 that specifies the correct values for most things.  Some things
+to watch out for include:
+
+=over 4
+
+=item *
+
+A message of the form:
+
+ (I see you are using the Korn shell.  Some ksh's blow up on Configure,
+ mainly on older exotic systems.  If yours does, try the Bourne shell instead.)
+
+is nothing to worry about at all.
+
+=item *
+
+Some of the parser default template files in /samples are needed in /etc.
+In particular be sure that you at least copy /samples/yyparse.c to /etc
+before running Perl's Configure.  This step ensures successful extraction
+of EBCDIC versions of parser files such as perly.c, perly.h, and x2p/a2p.c.
+This has to be done before running Configure the first time.  If you failed
+to do so then the easiest way to re-Configure Perl is to delete your
+misconfigured build root and re-extract the source from the tar ball.
+Then you must ensure that /etc/yyparse.c is properly in place before
+attempting to re-run Configure.
+
+=item *
+
+This port will support dynamic loading, but it is not selected by
+default.  If you would like to experiment with dynamic loading then
+be sure to specify -Dusedl in the arguments to the Configure script.
+See the comments in hints/os390.sh for more information on dynamic loading.
+If you build with dynamic loading then you will need to add the
+$archlibexp/CORE directory to your LIBPATH environment variable in order
+for perl to work.  See the config.sh file for the value of $archlibexp.
+If in trying to use Perl you see an error message similar to:
+
+ CEE3501S The module libperl.dll was not found.
+         From entry point __dllstaticinit at compile unit offset +00000194 at
+
+then your LIBPATH does not have the location of libperl.x and either
+libperl.dll or libperl.so in it.  Add that directory to your LIBPATH and
+proceed.
+
+=item *
+
+Do not turn on the compiler optimization flag "-O".  There is
+a bug in either the optimizer or perl that causes perl to
+not work correctly when the optimizer is on.
+
+=item *
+
+Some of the configuration files in /etc used by the
+networking APIs are either missing or have the wrong
+names.  In particular, make sure that there's either
+an /etc/resolv.conf or an /etc/hosts, so that
+gethostbyname() works, and make sure that the file
+/etc/proto has been renamed to /etc/protocol (NOT
+/etc/protocols, as used by other Unix systems).
+You may have to look for things like HOSTNAME and DOMAINORIGIN
+in the "//'SYS1.TCPPARMS(TCPDATA)'" PDS member in order to
+properly set up your /etc networking files.
+
+=back
+
+=head2 Build, Test, Install Perl on OS/390
+
+Simply put:
+
+    sh Configure
+    make
+    make test
+
+if everything looks ok (see the next section for test/IVP diagnosis) then:
+
+    make install
+
+this last step may or may not require UID=0 privileges depending
+on how you answered the questions that Configure asked and whether
+or not you have write access to the directories you specified.
+
+=head2 Build Anomalies with Perl on OS/390
+
+"Out of memory!" messages during the build of Perl are most often fixed
+by re building the GNU make utility for OS/390 from a source code kit.
+
+Another memory limiting item to check is your MAXASSIZE parameter in your
+'SYS1.PARMLIB(BPXPRMxx)' data set (note too that as of V2R8 address space
+limits can be set on a per user ID basis in the USS segment of a RACF
+profile).  People have reported successful builds of Perl with MAXASSIZE
+parameters as small as 503316480 (and it may be possible to build Perl
+with a MAXASSIZE smaller than that).
+
+Within USS your /etc/profile or $HOME/.profile may limit your ulimit
+settings.  Check that the following command returns reasonable values:
+
+    ulimit -a
+
+To conserve memory you should have your compiler modules loaded into the
+Link Pack Area (LPA/ELPA) rather than in a link list or step lib.
+
+If the c89 compiler complains of syntax errors during the build of the
+Socket extension then be sure to fix the syntax error in the system
+header /usr/include/sys/socket.h.
+
+=head2 Testing Anomalies with Perl on OS/390
+
+The "make test" step runs a Perl Verification Procedure, usually before
+installation.  You might encounter STDERR messages even during a successful
+run of "make test".  Here is a guide to some of the more commonly seen
+anomalies:
+
+=over 4
+
+=item *
+
+A message of the form:
+
+ comp/cpp.............ERROR CBC3191 ./.301989890.c:1     The character $ is not a
+  valid C source character.
+ FSUM3065 The COMPILE step ended with return code 12.
+ FSUM3017 Could not compile .301989890.c. Correct the errors and try again.
+ ok
+
+indicates that the t/comp/cpp.t test of Perl's -P command line switch has
+passed but that the particular invocation of c89 -E in the cpp script does
+not suppress the C compiler check of source code validity.
+
+=item *
+
+A message of the form:
+
+ io/openpid...........CEE5210S The signal SIGHUP was received.
+ CEE5210S The signal SIGHUP was received.
+ CEE5210S The signal SIGHUP was received.
+ ok
+
+indicates that the t/io/openpid.t test of Perl has passed but done so
+with extraneous messages on stderr from CEE.
+
+=item *
+
+A message of the form:
+
+ lib/ftmp-security....File::Temp::_gettemp: Parent directory (/tmp/) is not safe
+ (sticky bit not set when world writable?) at lib/ftmp-security.t line 100
+ File::Temp::_gettemp: Parent directory (/tmp/) is not safe (sticky bit not
+ set when world writable?) at lib/ftmp-security.t line 100
+ ok
+
+indicates a problem with the permissions on your /tmp directory within the HFS.
+To correct that problem issue the command:
+
+     chmod a+t /tmp
+
+from an account with write access to the directory entry for /tmp.
+
+=item *
+
+Out of Memory!
+
+Recent perl test suite is quite memory hunrgy. In addition to the comments
+above on memory limitations it is also worth checking for _CEE_RUNOPTS
+in your environment. Perl now has (in miniperlmain.c) a C #pragma
+to set CEE run options, but the environment variable wins.
+
+The C code asks for:
+
+ #pragma runopts(HEAP(2M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON))
+
+The important parts of that are the second argument (the increment) to HEAP,
+and allowing the stack to be "Above the (16M) line". If the heap
+increment is too small then when perl (for example loading unicode/Name.pl) tries
+to create a "big" (400K+) string it cannot fit in a single segment
+and you get "Out of Memory!" - even if there is still plenty of memory
+available.
+
+A related issue is use with perl's malloc. Perl's malloc uses C<sbrk()>
+to get memory, and C<sbrk()> is limited to the first allocation so in this
+case something like:
+
+  HEAP(8M,500K,ANYWHERE,KEEP,8K,4K)
+
+is needed to get through the test suite.
+
+
+=back
+
+=head2 Installation Anomalies with Perl on OS/390
+
+The installman script will try to run on OS/390.  There will be fewer errors
+if you have a roff utility installed.  You can obtain GNU groff from the
+Redbook SG24-5944-00 ftp site.
+
+=head2 Usage Hints for Perl on OS/390
+
+When using perl on OS/390 please keep in mind that the EBCDIC and ASCII
+character sets are different.  See perlebcdic.pod for more on such character
+set issues.  Perl builtin functions that may behave differently under
+EBCDIC are also mentioned in the perlport.pod document.
+
+Open Edition (UNIX System Services) from V2R8 onward does support
+#!/path/to/perl script invocation.  There is a PTF available from
+IBM for V2R7 that will allow shell/kernel support for #!.  USS
+releases prior to V2R7 did not support the #! means of script invocation.
+If you are running V2R6 or earlier then see:
+
+    head `whence perldoc`
+
+for an example of how to use the "eval exec" trick to ask the shell to
+have Perl run your scripts on those older releases of Unix System Services.
+
+If you are having trouble with square brackets then consider switching your
+rlogin or telnet client.  Try to avoid older 3270 emulators and ISHELL for
+working with Perl on USS.
+
+=head2 Floating Point Anomalies with Perl on OS/390
+
+There appears to be a bug in the floating point implementation on S/390
+systems such that calling int() on the product of a number and a small
+magnitude number is not the same as calling int() on the quotient of
+that number and a large magnitude number.  For example, in the following
+Perl code:
+
+    my $x = 100000.0;
+    my $y = int($x * 1e-5) * 1e5; # '0'
+    my $z = int($x / 1e+5) * 1e5;  # '100000'
+    print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000
+
+Although one would expect the quantities $y and $z to be the same and equal
+to 100000 they will differ and instead will be 0 and 100000 respectively.
+
+The problem can be further examined in a roughly equivalent C program:
+
+    #include <stdio.h>
+    #include <math.h>
+    main()
+    {
+    double r1,r2;
+    double x = 100000.0;
+    double y = 0.0;
+    double z = 0.0;
+    x = 100000.0 * 1e-5;
+    r1 = modf (x,&y);
+    x = 100000.0 / 1e+5;
+    r2 = modf (x,&z);
+    printf("y is %e and z is %e\n",y*1e5,z*1e5);
+    /* y is 0.000000e+00 and z is 1.000000e+05 (with c89) */
+    }
+
+=head2 Modules and Extensions for Perl on OS/390
+
+Pure pure (that is non xs) modules may be installed via the usual:
+
+    perl Makefile.PL
+    make
+    make test
+    make install
+
+If you built perl with dynamic loading capability then that would also
+be the way to build xs based extensions.  However, if you built perl with
+the default static linking you can still build xs based extensions for OS/390
+but you will need to follow the instructions in ExtUtils::MakeMaker for
+building statically linked perl binaries.  In the simplest configurations
+building a static perl + xs extension boils down to:
+
+    perl Makefile.PL
+    make
+    make perl
+    make test
+    make install
+    make -f Makefile.aperl inst_perl MAP_TARGET=perl
+
+In most cases people have reported better results with GNU make rather
+than the system's /bin/make program, whether for plain modules or for
+xs based extensions.
+
+If the make process encounters trouble with either compilation or
+linking then try setting the _C89_CCMODE to 1.  Assuming sh is your
+login shell then run:
+
+    export _C89_CCMODE=1
+
+If tcsh is your login shell then use the setenv command.
+
+=head1 AUTHORS
+
+David Fiander and Peter Prymmer with thanks to Dennis Longnecker
+and William Raffloer for valuable reports, LPAR and PTF feedback.
+Thanks to Mike MacIsaac and Egon Terwedow for SG24-5944-00.
+Thanks to Ignasi Roca for pointing out the floating point problems.
+Thanks to John Goodyear for dynamic loading help.
+
+=head1 SEE ALSO
+
+L<INSTALL>, L<perlport>, L<perlebcdic>, L<ExtUtils::MakeMaker>.
+
+    http://www-1.ibm.com/servers/eserver/zseries/zos/unix/bpxa1toy.html
+
+    http://www.redbooks.ibm.com/abstracts/sg245944.html
+
+    http://www-1.ibm.com/servers/eserver/zseries/zos/unix/bpxa1ty1.html#opensrc
+
+    http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
+
+    http://publibz.boulder.ibm.com:80/cgi-bin/bookmgr_OS390/BOOKS/ceea3030/
+
+    http://publibz.boulder.ibm.com:80/cgi-bin/bookmgr_OS390/BOOKS/CBCUG030/
+
+=head2 Mailing list for Perl on OS/390
+
+If you are interested in the VM/ESA, z/OS (formerly known as OS/390)
+and POSIX-BC (BS2000) ports of Perl then see the perl-mvs mailing list.
+To subscribe, send an empty message to perl-mvs-subscribe@perl.org.
+
+See also:
+
+    http://lists.perl.org/showlist.cgi?name=perl-mvs
+
+There are web archives of the mailing list at:
+
+    http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
+    http://archive.develooper.com/perl-mvs@perl.org/
+
+=head1 HISTORY
+
+This document was originally written by David Fiander for the 5.005
+release of Perl.
+
+This document was podified for the 5.005_03 release of Perl 11 March 1999.
+
+Updated 28 November 2001 for broken URLs.
+
+Updated 12 November 2000 for the 5.7.1 release of Perl.
+
+Updated 15 January 2001 for the 5.7.1 release of Perl.
+
+Updated 24 January 2001 to mention dynamic loading.
+
+Updated 12 March 2001 to mention //'SYS1.TCPPARMS(TCPDATA)'.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlos400.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlos400.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlos400.pod	(revision 14489)
@@ -0,0 +1,120 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.os400 - Perl version 5 on OS/400
+
+=head1 DESCRIPTION
+
+This document describes various features of IBM's OS/400 operating
+system that will affect how Perl version 5 (hereafter just Perl) is
+compiled and/or runs.
+
+By far the easiest way to build Perl for OS/400 is to use the PASE
+(Portable Application Solutions Environment), for more information see
+http://www.iseries.ibm.com/developer/factory/pase/index.html
+This environment allows one to use AIX APIs while programming, and it
+provides a runtime that allows AIX binaries to execute directly on the
+PowerPC iSeries.
+
+=head2 Compiling Perl for OS/400 PASE
+
+The recommended way to build Perl for the OS/400 PASE is to build the
+Perl 5 source code (release 5.8.1 or later) under AIX.
+
+The trick is to give a special parameter to the Configure shell script
+when running it on AIX:
+
+  sh Configure -DPASE ...
+
+The default installation directory of Perl under PASE is /QOpenSys/perl.
+This can be modified if needed with Configure parameter -Dprefix=/some/dir.
+
+Starting from OS/400 V5R2 the IBM Visual Age compiler is supported
+on OS/400 PASE, so it is possible to build Perl natively on OS/400.  
+The easier way, however, is to compile in AIX, as just described.
+
+If you don't want to install the compiled Perl in AIX into /QOpenSys
+(for packaging it before copying it to PASE), you can use a Configure
+parameter: -Dinstallprefix=/tmp/QOpenSys/perl.  This will cause the
+"make install" to install everything into that directory, while the
+installed files still think they are (will be) in /QOpenSys/perl.
+
+If building natively on PASE, please do the build under the /QOpenSys
+directory, since Perl is happier when built on a case sensitive filesystem.
+
+=head2 Installing Perl in OS/400 PASE
+
+If you are compiling on AIX, simply do a "make install" on the AIX box.
+Once the install finishes, tar up the /QOpenSys/perl directory.  Transfer
+the tarball to the OS/400 using FTP with the following commands:
+
+  > binary
+  > site namefmt 1
+  > put perl.tar /QOpenSys
+
+Once you have it on, simply bring up a PASE shell and extract the tarball.
+
+If you are compiling in PASE, then "make install" is the only thing you
+will need to do.
+
+The default path for perl binary is /QOpenSys/perl/bin/perl.  You'll
+want to symlink /QOpenSys/usr/bin/perl to this file so you don't have
+to modify your path.
+
+=head2 Using Perl in OS/400 PASE
+
+Perl in PASE may be used in the same manner as you would use Perl on AIX.
+
+Scripts starting with #!/usr/bin/perl should work if you have
+/QOpenSys/usr/bin/perl symlinked to your perl binary.  This will not
+work if you've done a setuid/setgid or have environment variable
+PASE_EXEC_QOPENSYS="N".  If you have V5R1, you'll need to get the
+latest PTFs to have this feature.  Scripts starting with
+#!/QOpenSys/perl/bin/perl should always work.
+
+=head2 Known Problems
+
+When compiling in PASE, there is no "oslevel" command.  Therefore,
+you may want to create a script called "oslevel" that echoes the
+level of AIX that your version of PASE runtime supports.  If you're
+unsure, consult your documentation or use "4.3.3.0".
+
+If you have test cases that fail, check for the existence of spool files.
+The test case may be trying to use a syscall that is not implemented
+in PASE.  To avoid the SIGILL, try setting the PASE_SYSCALL_NOSIGILL
+environment variable or have a handler for the SIGILL.  If you can
+compile programs for PASE, run the config script and edit config.sh
+when it gives you the option.  If you want to remove fchdir(), which
+isn't implement in V5R1, simply change the line that says:
+
+d_fchdir='define'
+
+to
+
+d_fchdir='undef'
+
+and then compile Perl.  The places where fchdir() is used have
+alternatives for systems that do not have fchdir() available.
+
+=head2 Perl on ILE
+
+There exists a port of Perl to the ILE environment.  This port, however,
+is based quite an old release of Perl, Perl 5.00502 (August 1998).
+(As of July 2002 the latest release of Perl is 5.8.0, and even 5.6.1
+has been out since April 2001.)  If you need to run Perl on ILE, though,
+you may need this older port: http://www.cpan.org/ports/#os400
+Note that any Perl release later than 5.00502 has not been ported to ILE.
+
+If you need to use Perl in the ILE environment, you may want to consider
+using Qp2RunPase() to call the PASE version of Perl.
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi <jhi@iki.fi>
+Bryan Logan <bryanlog@us.ibm.com>
+David Larson <larson1@us.ibm.com>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlothrtut.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlothrtut.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlothrtut.pod	(revision 14489)
@@ -0,0 +1,1068 @@
+=head1 NAME
+
+perlothrtut - old tutorial on threads in Perl
+
+=head1 DESCRIPTION
+
+B<WARNING>:
+This tutorial describes the old-style thread model that was introduced in
+release 5.005. This model is now deprecated, and will be removed, probably
+in version 5.10. The interfaces described here were considered
+experimental, and are likely to be buggy.
+
+For information about the new interpreter threads ("ithreads") model, see
+the F<perlthrtut> tutorial, and the L<threads> and L<threads::shared>
+modules.
+
+You are strongly encouraged to migrate any existing threads code to the
+new model as soon as possible.
+
+=head1 What Is A Thread Anyway?
+
+A thread is a flow of control through a program with a single
+execution point.
+
+Sounds an awful lot like a process, doesn't it? Well, it should.
+Threads are one of the pieces of a process.  Every process has at least
+one thread and, up until now, every process running Perl had only one
+thread.  With 5.005, though, you can create extra threads.  We're going
+to show you how, when, and why.
+
+=head1 Threaded Program Models
+
+There are three basic ways that you can structure a threaded
+program.  Which model you choose depends on what you need your program
+to do.  For many non-trivial threaded programs you'll need to choose
+different models for different pieces of your program.
+
+=head2 Boss/Worker
+
+The boss/worker model usually has one `boss' thread and one or more
+`worker' threads.  The boss thread gathers or generates tasks that need
+to be done, then parcels those tasks out to the appropriate worker
+thread.
+
+This model is common in GUI and server programs, where a main thread
+waits for some event and then passes that event to the appropriate
+worker threads for processing.  Once the event has been passed on, the
+boss thread goes back to waiting for another event.
+
+The boss thread does relatively little work.  While tasks aren't
+necessarily performed faster than with any other method, it tends to
+have the best user-response times.
+
+=head2 Work Crew
+
+In the work crew model, several threads are created that do
+essentially the same thing to different pieces of data.  It closely
+mirrors classical parallel processing and vector processors, where a
+large array of processors do the exact same thing to many pieces of
+data.
+
+This model is particularly useful if the system running the program
+will distribute multiple threads across different processors.  It can
+also be useful in ray tracing or rendering engines, where the
+individual threads can pass on interim results to give the user visual
+feedback.
+
+=head2 Pipeline
+
+The pipeline model divides up a task into a series of steps, and
+passes the results of one step on to the thread processing the
+next.  Each thread does one thing to each piece of data and passes the
+results to the next thread in line.
+
+This model makes the most sense if you have multiple processors so two
+or more threads will be executing in parallel, though it can often
+make sense in other contexts as well.  It tends to keep the individual
+tasks small and simple, as well as allowing some parts of the pipeline
+to block (on I/O or system calls, for example) while other parts keep
+going.  If you're running different parts of the pipeline on different
+processors you may also take advantage of the caches on each
+processor.
+
+This model is also handy for a form of recursive programming where,
+rather than having a subroutine call itself, it instead creates
+another thread.  Prime and Fibonacci generators both map well to this
+form of the pipeline model. (A version of a prime number generator is
+presented later on.)
+
+=head1 Native threads
+
+There are several different ways to implement threads on a system.  How
+threads are implemented depends both on the vendor and, in some cases,
+the version of the operating system.  Often the first implementation
+will be relatively simple, but later versions of the OS will be more
+sophisticated.
+
+While the information in this section is useful, it's not necessary,
+so you can skip it if you don't feel up to it.
+
+There are three basic categories of threads-user-mode threads, kernel
+threads, and multiprocessor kernel threads.
+
+User-mode threads are threads that live entirely within a program and
+its libraries.  In this model, the OS knows nothing about threads.  As
+far as it's concerned, your process is just a process.
+
+This is the easiest way to implement threads, and the way most OSes
+start.  The big disadvantage is that, since the OS knows nothing about
+threads, if one thread blocks they all do.  Typical blocking activities
+include most system calls, most I/O, and things like sleep().
+
+Kernel threads are the next step in thread evolution.  The OS knows
+about kernel threads, and makes allowances for them.  The main
+difference between a kernel thread and a user-mode thread is
+blocking.  With kernel threads, things that block a single thread don't
+block other threads.  This is not the case with user-mode threads,
+where the kernel blocks at the process level and not the thread level.
+
+This is a big step forward, and can give a threaded program quite a
+performance boost over non-threaded programs.  Threads that block
+performing I/O, for example, won't block threads that are doing other
+things.  Each process still has only one thread running at once,
+though, regardless of how many CPUs a system might have.
+
+Since kernel threading can interrupt a thread at any time, they will
+uncover some of the implicit locking assumptions you may make in your
+program.  For example, something as simple as C<$a = $a + 2> can behave
+unpredictably with kernel threads if $a is visible to other
+threads, as another thread may have changed $a between the time it
+was fetched on the right hand side and the time the new value is
+stored.
+
+Multiprocessor Kernel Threads are the final step in thread
+support.  With multiprocessor kernel threads on a machine with multiple
+CPUs, the OS may schedule two or more threads to run simultaneously on
+different CPUs.
+
+This can give a serious performance boost to your threaded program,
+since more than one thread will be executing at the same time.  As a
+tradeoff, though, any of those nagging synchronization issues that
+might not have shown with basic kernel threads will appear with a
+vengeance.
+
+In addition to the different levels of OS involvement in threads,
+different OSes (and different thread implementations for a particular
+OS) allocate CPU cycles to threads in different ways.
+
+Cooperative multitasking systems have running threads give up control
+if one of two things happen.  If a thread calls a yield function, it
+gives up control.  It also gives up control if the thread does
+something that would cause it to block, such as perform I/O.  In a
+cooperative multitasking implementation, one thread can starve all the
+others for CPU time if it so chooses.
+
+Preemptive multitasking systems interrupt threads at regular intervals
+while the system decides which thread should run next.  In a preemptive
+multitasking system, one thread usually won't monopolize the CPU.
+
+On some systems, there can be cooperative and preemptive threads
+running simultaneously. (Threads running with realtime priorities
+often behave cooperatively, for example, while threads running at
+normal priorities behave preemptively.)
+
+=head1 What kind of threads are perl threads?
+
+If you have experience with other thread implementations, you might
+find that things aren't quite what you expect.  It's very important to
+remember when dealing with Perl threads that Perl Threads Are Not X
+Threads, for all values of X.  They aren't POSIX threads, or
+DecThreads, or Java's Green threads, or Win32 threads.  There are
+similarities, and the broad concepts are the same, but if you start
+looking for implementation details you're going to be either
+disappointed or confused.  Possibly both.
+
+This is not to say that Perl threads are completely different from
+everything that's ever come before--they're not.  Perl's threading
+model owes a lot to other thread models, especially POSIX.  Just as
+Perl is not C, though, Perl threads are not POSIX threads.  So if you
+find yourself looking for mutexes, or thread priorities, it's time to
+step back a bit and think about what you want to do and how Perl can
+do it.
+
+=head1 Threadsafe Modules
+
+The addition of threads has changed Perl's internals
+substantially.  There are implications for people who write
+modules--especially modules with XS code or external libraries.  While
+most modules won't encounter any problems, modules that aren't
+explicitly tagged as thread-safe should be tested before being used in
+production code.
+
+Not all modules that you might use are thread-safe, and you should
+always assume a module is unsafe unless the documentation says
+otherwise.  This includes modules that are distributed as part of the
+core.  Threads are a beta feature, and even some of the standard
+modules aren't thread-safe.
+
+If you're using a module that's not thread-safe for some reason, you
+can protect yourself by using semaphores and lots of programming
+discipline to control access to the module.  Semaphores are covered
+later in the article.  Perl Threads Are Different
+
+=head1 Thread Basics
+
+The core Thread module provides the basic functions you need to write
+threaded programs.  In the following sections we'll cover the basics,
+showing you what you need to do to create a threaded program.   After
+that, we'll go over some of the features of the Thread module that
+make threaded programming easier.
+
+=head2 Basic Thread Support
+
+Thread support is a Perl compile-time option-it's something that's
+turned on or off when Perl is built at your site, rather than when
+your programs are compiled. If your Perl wasn't compiled with thread
+support enabled, then any attempt to use threads will fail.
+
+Remember that the threading support in 5.005 is in beta release, and
+should be treated as such.   You should expect that it may not function
+entirely properly, and the thread interface may well change some
+before it is a fully supported, production release.  The beta version
+shouldn't be used for mission-critical projects.  Having said that,
+threaded Perl is pretty nifty, and worth a look.
+
+Your programs can use the Config module to check whether threads are
+enabled. If your program can't run without them, you can say something
+like:
+
+  $Config{usethreads} or die "Recompile Perl with threads to run this program.";
+
+A possibly-threaded program using a possibly-threaded module might
+have code like this:
+
+    use Config; 
+    use MyMod; 
+
+    if ($Config{usethreads}) { 
+        # We have threads 
+        require MyMod_threaded; 
+        import MyMod_threaded; 
+    } else { 
+        require MyMod_unthreaded; 
+        import MyMod_unthreaded; 
+    } 
+
+Since code that runs both with and without threads is usually pretty
+messy, it's best to isolate the thread-specific code in its own
+module.  In our example above, that's what MyMod_threaded is, and it's
+only imported if we're running on a threaded Perl.
+
+=head2 Creating Threads
+
+The Thread package provides the tools you need to create new
+threads.  Like any other module, you need to tell Perl you want to use
+it; use Thread imports all the pieces you need to create basic
+threads.
+
+The simplest, straightforward way to create a thread is with new():
+
+    use Thread; 
+
+    $thr = new Thread \&sub1;
+
+    sub sub1 { 
+        print "In the thread\n"; 
+    }
+
+The new() method takes a reference to a subroutine and creates a new
+thread, which starts executing in the referenced subroutine.  Control
+then passes both to the subroutine and the caller.
+
+If you need to, your program can pass parameters to the subroutine as
+part of the thread startup.  Just include the list of parameters as
+part of the C<Thread::new> call, like this:
+
+    use Thread; 
+    $Param3 = "foo"; 
+    $thr = new Thread \&sub1, "Param 1", "Param 2", $Param3; 
+    $thr = new Thread \&sub1, @ParamList; 
+    $thr = new Thread \&sub1, qw(Param1 Param2 $Param3);
+
+    sub sub1 { 
+        my @InboundParameters = @_; 
+        print "In the thread\n"; 
+        print "got parameters >", join("<>", @InboundParameters), "<\n"; 
+    }
+
+
+The subroutine runs like a normal Perl subroutine, and the call to new
+Thread returns whatever the subroutine returns.
+
+The last example illustrates another feature of threads.  You can spawn
+off several threads using the same subroutine.  Each thread executes
+the same subroutine, but in a separate thread with a separate
+environment and potentially separate arguments.
+
+The other way to spawn a new thread is with async(), which is a way to
+spin off a chunk of code like eval(), but into its own thread:
+
+    use Thread qw(async);
+
+    $LineCount = 0; 
+
+    $thr = async { 
+        while(<>) {$LineCount++} 	 
+        print "Got $LineCount lines\n";
+    }; 
+
+    print "Waiting for the linecount to end\n"; 
+    $thr->join; 
+    print "All done\n";
+
+You'll notice we did a use Thread qw(async) in that example.  async is
+not exported by default, so if you want it, you'll either need to
+import it before you use it or fully qualify it as
+Thread::async.  You'll also note that there's a semicolon after the
+closing brace.  That's because async() treats the following block as an
+anonymous subroutine, so the semicolon is necessary.
+
+Like eval(), the code executes in the same context as it would if it
+weren't spun off.  Since both the code inside and after the async start
+executing, you need to be careful with any shared resources.  Locking
+and other synchronization techniques are covered later.
+
+=head2 Giving up control
+
+There are times when you may find it useful to have a thread
+explicitly give up the CPU to another thread.  Your threading package
+might not support preemptive multitasking for threads, for example, or
+you may be doing something compute-intensive and want to make sure
+that the user-interface thread gets called frequently.  Regardless,
+there are times that you might want a thread to give up the processor.
+
+Perl's threading package provides the yield() function that does
+this. yield() is pretty straightforward, and works like this:
+
+    use Thread qw(yield async); 
+    async { 
+        my $foo = 50; 
+        while ($foo--) { print "first async\n" }
+        yield; 
+        $foo = 50; 
+        while ($foo--) { print "first async\n" } 
+    }; 
+    async { 
+        my $foo = 50; 
+        while ($foo--) { print "second async\n" }
+        yield; 
+        $foo = 50; 
+        while ($foo--) { print "second async\n" } 
+    };
+
+=head2 Waiting For A Thread To Exit
+
+Since threads are also subroutines, they can return values.  To wait
+for a thread to exit and extract any scalars it might return, you can
+use the join() method.
+
+    use Thread; 
+    $thr = new Thread \&sub1;
+
+    @ReturnData = $thr->join; 
+    print "Thread returned @ReturnData"; 
+
+    sub sub1 { return "Fifty-six", "foo", 2; }
+
+In the example above, the join() method returns as soon as the thread
+ends.  In addition to waiting for a thread to finish and gathering up
+any values that the thread might have returned, join() also performs
+any OS cleanup necessary for the thread.  That cleanup might be
+important, especially for long-running programs that spawn lots of
+threads.  If you don't want the return values and don't want to wait
+for the thread to finish, you should call the detach() method
+instead. detach() is covered later in the article.
+
+=head2 Errors In Threads
+
+So what happens when an error occurs in a thread? Any errors that
+could be caught with eval() are postponed until the thread is
+joined.  If your program never joins, the errors appear when your
+program exits.
+
+Errors deferred until a join() can be caught with eval():
+
+    use Thread qw(async); 
+    $thr = async {$b = 3/0};   # Divide by zero error
+    $foo = eval {$thr->join}; 
+    if ($@) { 
+        print "died with error $@\n"; 
+    } else { 
+        print "Hey, why aren't you dead?\n"; 
+    }
+
+eval() passes any results from the joined thread back unmodified, so
+if you want the return value of the thread, this is your only chance
+to get them.
+
+=head2 Ignoring A Thread
+
+join() does three things: it waits for a thread to exit, cleans up
+after it, and returns any data the thread may have produced.  But what
+if you're not interested in the thread's return values, and you don't
+really care when the thread finishes? All you want is for the thread
+to get cleaned up after when it's done.
+
+In this case, you use the detach() method.  Once a thread is detached,
+it'll run until it's finished, then Perl will clean up after it
+automatically.
+
+    use Thread; 
+    $thr = new Thread \&sub1; # Spawn the thread
+
+    $thr->detach; # Now we officially don't care any more
+
+    sub sub1 { 
+        $a = 0; 
+        while (1) { 
+            $a++; 
+            print "\$a is $a\n"; 
+            sleep 1; 
+        } 
+    }
+
+
+Once a thread is detached, it may not be joined, and any output that
+it might have produced (if it was done and waiting for a join) is
+lost.
+
+=head1 Threads And Data
+
+Now that we've covered the basics of threads, it's time for our next
+topic: data.  Threading introduces a couple of complications to data
+access that non-threaded programs never need to worry about.
+
+=head2 Shared And Unshared Data
+
+The single most important thing to remember when using threads is that
+all threads potentially have access to all the data anywhere in your
+program.  While this is true with a nonthreaded Perl program as well,
+it's especially important to remember with a threaded program, since
+more than one thread can be accessing this data at once.
+
+Perl's scoping rules don't change because you're using threads.  If a
+subroutine (or block, in the case of async()) could see a variable if
+you weren't running with threads, it can see it if you are.  This is
+especially important for the subroutines that create, and makes C<my>
+variables even more important.  Remember--if your variables aren't
+lexically scoped (declared with C<my>) you're probably sharing them
+between threads.
+
+=head2 Thread Pitfall: Races
+
+While threads bring a new set of useful tools, they also bring a
+number of pitfalls.  One pitfall is the race condition:
+
+    use Thread; 
+    $a = 1; 
+    $thr1 = Thread->new(\&sub1); 
+    $thr2 = Thread->new(\&sub2); 
+
+    sleep 10; 
+    print "$a\n";
+
+    sub sub1 { $foo = $a; $a = $foo + 1; }
+    sub sub2 { $bar = $a; $a = $bar + 1; }
+
+What do you think $a will be? The answer, unfortunately, is "it
+depends." Both sub1() and sub2() access the global variable $a, once
+to read and once to write.  Depending on factors ranging from your
+thread implementation's scheduling algorithm to the phase of the moon,
+$a can be 2 or 3.
+
+Race conditions are caused by unsynchronized access to shared
+data.  Without explicit synchronization, there's no way to be sure that
+nothing has happened to the shared data between the time you access it
+and the time you update it.  Even this simple code fragment has the
+possibility of error:
+
+    use Thread qw(async); 
+    $a = 2; 
+    async{ $b = $a; $a = $b + 1; }; 
+    async{ $c = $a; $a = $c + 1; };
+
+Two threads both access $a.  Each thread can potentially be interrupted
+at any point, or be executed in any order.  At the end, $a could be 3
+or 4, and both $b and $c could be 2 or 3.
+
+Whenever your program accesses data or resources that can be accessed
+by other threads, you must take steps to coordinate access or risk
+data corruption and race conditions.
+
+=head2 Controlling access: lock()
+
+The lock() function takes a variable (or subroutine, but we'll get to
+that later) and puts a lock on it.  No other thread may lock the
+variable until the locking thread exits the innermost block containing
+the lock.  Using lock() is straightforward:
+
+    use Thread qw(async); 
+    $a = 4; 
+    $thr1 = async { 
+        $foo = 12; 
+        { 
+            lock ($a); # Block until we get access to $a 
+            $b = $a; 
+            $a = $b * $foo; 
+        } 
+        print "\$foo was $foo\n";
+    }; 
+    $thr2 = async { 
+        $bar = 7; 
+        { 
+            lock ($a); # Block until we can get access to $a
+            $c = $a; 
+            $a = $c * $bar; 
+        } 
+        print "\$bar was $bar\n";
+    }; 
+    $thr1->join; 
+    $thr2->join; 
+    print "\$a is $a\n";
+
+lock() blocks the thread until the variable being locked is
+available.  When lock() returns, your thread can be sure that no other
+thread can lock that variable until the innermost block containing the
+lock exits.
+
+It's important to note that locks don't prevent access to the variable
+in question, only lock attempts.  This is in keeping with Perl's
+longstanding tradition of courteous programming, and the advisory file
+locking that flock() gives you.  Locked subroutines behave differently,
+however.  We'll cover that later in the article.
+
+You may lock arrays and hashes as well as scalars.  Locking an array,
+though, will not block subsequent locks on array elements, just lock
+attempts on the array itself.
+
+Finally, locks are recursive, which means it's okay for a thread to
+lock a variable more than once.  The lock will last until the outermost
+lock() on the variable goes out of scope.
+
+=head2 Thread Pitfall: Deadlocks
+
+Locks are a handy tool to synchronize access to data.  Using them
+properly is the key to safe shared data.  Unfortunately, locks aren't
+without their dangers.  Consider the following code:
+
+    use Thread qw(async yield); 
+    $a = 4; 
+    $b = "foo"; 
+    async { 
+        lock($a); 
+        yield; 
+        sleep 20; 
+        lock ($b); 
+    }; 
+    async { 
+        lock($b); 
+        yield; 
+        sleep 20; 
+        lock ($a); 
+    };
+
+This program will probably hang until you kill it.  The only way it
+won't hang is if one of the two async() routines acquires both locks
+first.  A guaranteed-to-hang version is more complicated, but the
+principle is the same.
+
+The first thread spawned by async() will grab a lock on $a then, a
+second or two later, try to grab a lock on $b.  Meanwhile, the second
+thread grabs a lock on $b, then later tries to grab a lock on $a.  The
+second lock attempt for both threads will block, each waiting for the
+other to release its lock.
+
+This condition is called a deadlock, and it occurs whenever two or
+more threads are trying to get locks on resources that the others
+own.  Each thread will block, waiting for the other to release a lock
+on a resource.  That never happens, though, since the thread with the
+resource is itself waiting for a lock to be released.
+
+There are a number of ways to handle this sort of problem.  The best
+way is to always have all threads acquire locks in the exact same
+order.  If, for example, you lock variables $a, $b, and $c, always lock
+$a before $b, and $b before $c.  It's also best to hold on to locks for
+as short a period of time to minimize the risks of deadlock.
+
+=head2 Queues: Passing Data Around
+
+A queue is a special thread-safe object that lets you put data in one
+end and take it out the other without having to worry about
+synchronization issues.  They're pretty straightforward, and look like
+this:
+
+    use Thread qw(async); 
+    use Thread::Queue;
+
+    my $DataQueue = new Thread::Queue; 
+    $thr = async { 
+        while ($DataElement = $DataQueue->dequeue) { 
+            print "Popped $DataElement off the queue\n";
+        } 
+    }; 
+
+    $DataQueue->enqueue(12); 
+    $DataQueue->enqueue("A", "B", "C"); 
+    $DataQueue->enqueue(\$thr); 
+    sleep 10; 
+    $DataQueue->enqueue(undef);
+
+You create the queue with new Thread::Queue.  Then you can add lists of
+scalars onto the end with enqueue(), and pop scalars off the front of
+it with dequeue().  A queue has no fixed size, and can grow as needed
+to hold everything pushed on to it.
+
+If a queue is empty, dequeue() blocks until another thread enqueues
+something.  This makes queues ideal for event loops and other
+communications between threads.
+
+=head1 Threads And Code
+
+In addition to providing thread-safe access to data via locks and
+queues, threaded Perl also provides general-purpose semaphores for
+coarser synchronization than locks provide and thread-safe access to
+entire subroutines.
+
+=head2 Semaphores: Synchronizing Data Access
+
+Semaphores are a kind of generic locking mechanism.  Unlike lock, which
+gets a lock on a particular scalar, Perl doesn't associate any
+particular thing with a semaphore so you can use them to control
+access to anything you like.  In addition, semaphores can allow more
+than one thread to access a resource at once, though by default
+semaphores only allow one thread access at a time.
+
+=over 4
+
+=item Basic semaphores
+
+Semaphores have two methods, down and up. down decrements the resource
+count, while up increments it.  down calls will block if the
+semaphore's current count would decrement below zero.  This program
+gives a quick demonstration:
+
+    use Thread qw(yield); 
+    use Thread::Semaphore; 
+    my $semaphore = new Thread::Semaphore; 
+    $GlobalVariable = 0;
+
+    $thr1 = new Thread \&sample_sub, 1; 
+    $thr2 = new Thread \&sample_sub, 2; 
+    $thr3 = new Thread \&sample_sub, 3;
+
+    sub sample_sub { 
+        my $SubNumber = shift @_; 
+        my $TryCount = 10; 
+        my $LocalCopy; 
+        sleep 1; 
+        while ($TryCount--) { 
+            $semaphore->down; 
+            $LocalCopy = $GlobalVariable; 
+            print "$TryCount tries left for sub $SubNumber (\$GlobalVariable is $GlobalVariable)\n"; 
+            yield; 
+            sleep 2; 
+            $LocalCopy++; 
+            $GlobalVariable = $LocalCopy; 
+            $semaphore->up; 
+        } 
+    }
+
+The three invocations of the subroutine all operate in sync.  The
+semaphore, though, makes sure that only one thread is accessing the
+global variable at once.
+
+=item Advanced Semaphores
+
+By default, semaphores behave like locks, letting only one thread
+down() them at a time.  However, there are other uses for semaphores.
+
+Each semaphore has a counter attached to it. down() decrements the
+counter and up() increments the counter.  By default, semaphores are
+created with the counter set to one, down() decrements by one, and
+up() increments by one.  If down() attempts to decrement the counter
+below zero, it blocks until the counter is large enough.  Note that
+while a semaphore can be created with a starting count of zero, any
+up() or down() always changes the counter by at least
+one. $semaphore->down(0) is the same as $semaphore->down(1).
+
+The question, of course, is why would you do something like this? Why
+create a semaphore with a starting count that's not one, or why
+decrement/increment it by more than one? The answer is resource
+availability.  Many resources that you want to manage access for can be
+safely used by more than one thread at once.
+
+For example, let's take a GUI driven program.  It has a semaphore that
+it uses to synchronize access to the display, so only one thread is
+ever drawing at once.  Handy, but of course you don't want any thread
+to start drawing until things are properly set up.  In this case, you
+can create a semaphore with a counter set to zero, and up it when
+things are ready for drawing.
+
+Semaphores with counters greater than one are also useful for
+establishing quotas.  Say, for example, that you have a number of
+threads that can do I/O at once.  You don't want all the threads
+reading or writing at once though, since that can potentially swamp
+your I/O channels, or deplete your process' quota of filehandles.  You
+can use a semaphore initialized to the number of concurrent I/O
+requests (or open files) that you want at any one time, and have your
+threads quietly block and unblock themselves.
+
+Larger increments or decrements are handy in those cases where a
+thread needs to check out or return a number of resources at once.
+
+=back
+
+=head2 Attributes: Restricting Access To Subroutines
+
+In addition to synchronizing access to data or resources, you might
+find it useful to synchronize access to subroutines.  You may be
+accessing a singular machine resource (perhaps a vector processor), or
+find it easier to serialize calls to a particular subroutine than to
+have a set of locks and semaphores.
+
+One of the additions to Perl 5.005 is subroutine attributes.  The
+Thread package uses these to provide several flavors of
+serialization.  It's important to remember that these attributes are
+used in the compilation phase of your program so you can't change a
+subroutine's behavior while your program is actually running.
+
+=head2 Subroutine Locks
+
+The basic subroutine lock looks like this:
+
+    sub test_sub :locked { 
+    }
+
+This ensures that only one thread will be executing this subroutine at
+any one time.  Once a thread calls this subroutine, any other thread
+that calls it will block until the thread in the subroutine exits
+it.  A more elaborate example looks like this:
+
+    use Thread qw(yield); 
+
+    new Thread \&thread_sub, 1; 
+    new Thread \&thread_sub, 2; 
+    new Thread \&thread_sub, 3; 
+    new Thread \&thread_sub, 4;
+
+    sub sync_sub :locked { 
+        my $CallingThread = shift @_; 
+        print "In sync_sub for thread $CallingThread\n";
+        yield; 
+        sleep 3; 
+        print "Leaving sync_sub for thread $CallingThread\n"; 
+    }
+
+    sub thread_sub { 
+        my $ThreadID = shift @_; 
+        print "Thread $ThreadID calling sync_sub\n";
+        sync_sub($ThreadID); 
+        print "$ThreadID is done with sync_sub\n"; 
+    }
+
+The C<locked> attribute tells perl to lock sync_sub(), and if you run
+this, you can see that only one thread is in it at any one time.
+
+=head2 Methods
+
+Locking an entire subroutine can sometimes be overkill, especially
+when dealing with Perl objects.  When calling a method for an object,
+for example, you want to serialize calls to a method, so that only one
+thread will be in the subroutine for a particular object, but threads
+calling that subroutine for a different object aren't blocked.  The
+method attribute indicates whether the subroutine is really a method.
+
+    use Thread;
+
+    sub tester { 
+        my $thrnum = shift @_; 
+        my $bar = new Foo; 
+        foreach (1..10) { 	
+            print "$thrnum calling per_object\n"; 
+            $bar->per_object($thrnum); 	
+            print "$thrnum out of per_object\n"; 
+            yield; 
+            print "$thrnum calling one_at_a_time\n";
+            $bar->one_at_a_time($thrnum); 	
+            print "$thrnum out of one_at_a_time\n"; 
+            yield; 
+        } 
+    }
+
+    foreach my $thrnum (1..10) { 
+        new Thread \&tester, $thrnum; 
+    }
+
+    package Foo; 
+    sub new { 
+        my $class = shift @_; 
+        return bless [@_], $class; 
+    }
+
+    sub per_object :locked :method { 
+        my ($class, $thrnum) = @_; 
+        print "In per_object for thread $thrnum\n"; 
+        yield; 
+        sleep 2; 
+        print "Exiting per_object for thread $thrnum\n"; 
+    }
+
+    sub one_at_a_time :locked { 
+        my ($class, $thrnum) = @_; 
+        print "In one_at_a_time for thread $thrnum\n";     
+        yield; 
+        sleep 2; 
+        print "Exiting one_at_a_time for thread $thrnum\n"; 
+    }
+
+As you can see from the output (omitted for brevity; it's 800 lines)
+all the threads can be in per_object() simultaneously, but only one
+thread is ever in one_at_a_time() at once.
+
+=head2 Locking A Subroutine
+
+You can lock a subroutine as you would lock a variable.  Subroutine locks
+work the same as specifying a C<locked> attribute for the subroutine,
+and block all access to the subroutine for other threads until the
+lock goes out of scope.  When the subroutine isn't locked, any number
+of threads can be in it at once, and getting a lock on a subroutine
+doesn't affect threads already in the subroutine.  Getting a lock on a
+subroutine looks like this:
+
+    lock(\&sub_to_lock);
+
+Simple enough.  Unlike the C<locked> attribute, which is a compile time
+option, locking and unlocking a subroutine can be done at runtime at your
+discretion.  There is some runtime penalty to using lock(\&sub) instead
+of the C<locked> attribute, so make sure you're choosing the proper
+method to do the locking.
+
+You'd choose lock(\&sub) when writing modules and code to run on both
+threaded and unthreaded Perl, especially for code that will run on
+5.004 or earlier Perls.  In that case, it's useful to have subroutines
+that should be serialized lock themselves if they're running threaded,
+like so:
+
+    package Foo; 
+    use Config; 
+    $Running_Threaded = 0;
+
+    BEGIN { $Running_Threaded = $Config{'usethreads'} }
+
+    sub sub1 { lock(\&sub1) if $Running_Threaded }
+
+
+This way you can ensure single-threadedness regardless of which
+version of Perl you're running.
+
+=head1 General Thread Utility Routines
+
+We've covered the workhorse parts of Perl's threading package, and
+with these tools you should be well on your way to writing threaded
+code and packages.  There are a few useful little pieces that didn't
+really fit in anyplace else.
+
+=head2 What Thread Am I In?
+
+The Thread->self method provides your program with a way to get an
+object representing the thread it's currently in.  You can use this
+object in the same way as the ones returned from the thread creation.
+
+=head2 Thread IDs
+
+tid() is a thread object method that returns the thread ID of the
+thread the object represents.  Thread IDs are integers, with the main
+thread in a program being 0.  Currently Perl assigns a unique tid to
+every thread ever created in your program, assigning the first thread
+to be created a tid of 1, and increasing the tid by 1 for each new
+thread that's created.
+
+=head2 Are These Threads The Same?
+
+The equal() method takes two thread objects and returns true 
+if the objects represent the same thread, and false if they don't.
+
+=head2 What Threads Are Running?
+
+Thread->list returns a list of thread objects, one for each thread
+that's currently running.  Handy for a number of things, including
+cleaning up at the end of your program:
+
+    # Loop through all the threads 
+    foreach $thr (Thread->list) { 
+        # Don't join the main thread or ourselves 
+        if ($thr->tid && !Thread::equal($thr, Thread->self)) { 
+            $thr->join; 
+        } 
+    }
+
+The example above is just for illustration.  It isn't strictly
+necessary to join all the threads you create, since Perl detaches all
+the threads before it exits.
+
+=head1 A Complete Example
+
+Confused yet? It's time for an example program to show some of the
+things we've covered.  This program finds prime numbers using threads.
+
+    1  #!/usr/bin/perl -w
+    2  # prime-pthread, courtesy of Tom Christiansen
+    3
+    4  use strict;
+    5
+    6  use Thread;
+    7  use Thread::Queue;
+    8
+    9  my $stream = new Thread::Queue;
+    10 my $kid    = new Thread(\&check_num, $stream, 2);
+    11
+    12 for my $i ( 3 .. 1000 ) {
+    13     $stream->enqueue($i);
+    14 } 
+    15
+    16 $stream->enqueue(undef);
+    17 $kid->join();
+    18
+    19 sub check_num {
+    20     my ($upstream, $cur_prime) = @_;
+    21     my $kid;
+    22     my $downstream = new Thread::Queue;
+    23     while (my $num = $upstream->dequeue) {
+    24         next unless $num % $cur_prime;
+    25         if ($kid) {
+    26            $downstream->enqueue($num);
+    27          	} else {
+    28            print "Found prime $num\n";
+    29	              $kid = new Thread(\&check_num, $downstream, $num);
+    30         }
+    31     } 
+    32     $downstream->enqueue(undef) if $kid;
+    33     $kid->join()		if $kid;
+    34 }
+
+This program uses the pipeline model to generate prime numbers.  Each
+thread in the pipeline has an input queue that feeds numbers to be
+checked, a prime number that it's responsible for, and an output queue
+that it funnels numbers that have failed the check into.  If the thread
+has a number that's failed its check and there's no child thread, then
+the thread must have found a new prime number.  In that case, a new
+child thread is created for that prime and stuck on the end of the
+pipeline.
+
+This probably sounds a bit more confusing than it really is, so lets
+go through this program piece by piece and see what it does.  (For
+those of you who might be trying to remember exactly what a prime
+number is, it's a number that's only evenly divisible by itself and 1)
+
+The bulk of the work is done by the check_num() subroutine, which
+takes a reference to its input queue and a prime number that it's
+responsible for.  After pulling in the input queue and the prime that
+the subroutine's checking (line 20), we create a new queue (line 22)
+and reserve a scalar for the thread that we're likely to create later
+(line 21).
+
+The while loop from lines 23 to line 31 grabs a scalar off the input
+queue and checks against the prime this thread is responsible
+for.  Line 24 checks to see if there's a remainder when we modulo the
+number to be checked against our prime.  If there is one, the number
+must not be evenly divisible by our prime, so we need to either pass
+it on to the next thread if we've created one (line 26) or create a
+new thread if we haven't.
+
+The new thread creation is line 29.  We pass on to it a reference to
+the queue we've created, and the prime number we've found.
+
+Finally, once the loop terminates (because we got a 0 or undef in the
+queue, which serves as a note to die), we pass on the notice to our
+child and wait for it to exit if we've created a child (Lines 32 and
+37).
+
+Meanwhile, back in the main thread, we create a queue (line 9) and the
+initial child thread (line 10), and pre-seed it with the first prime:
+2.  Then we queue all the numbers from 3 to 1000 for checking (lines
+12-14), then queue a die notice (line 16) and wait for the first child
+thread to terminate (line 17).  Because a child won't die until its
+child has died, we know that we're done once we return from the join.
+
+That's how it works.  It's pretty simple; as with many Perl programs,
+the explanation is much longer than the program.
+
+=head1 Conclusion
+
+A complete thread tutorial could fill a book (and has, many times),
+but this should get you well on your way.  The final authority on how
+Perl's threads behave is the documentation bundled with the Perl
+distribution, but with what we've covered in this article, you should
+be well on your way to becoming a threaded Perl expert.
+
+=head1 Bibliography
+
+Here's a short bibliography courtesy of Jürgen Christoffel:
+
+=head2 Introductory Texts
+
+Birrell, Andrew D. An Introduction to Programming with
+Threads. Digital Equipment Corporation, 1989, DEC-SRC Research Report
+#35 online as
+http://www.research.digital.com/SRC/staff/birrell/bib.html (highly
+recommended)
+
+Robbins, Kay. A., and Steven Robbins. Practical Unix Programming: A
+Guide to Concurrency, Communication, and
+Multithreading. Prentice-Hall, 1996.
+
+Lewis, Bill, and Daniel J. Berg. Multithreaded Programming with
+Pthreads. Prentice Hall, 1997, ISBN 0-13-443698-9 (a well-written
+introduction to threads).
+
+Nelson, Greg (editor). Systems Programming with Modula-3.  Prentice
+Hall, 1991, ISBN 0-13-590464-1.
+
+Nichols, Bradford, Dick Buttlar, and Jacqueline Proulx Farrell.
+Pthreads Programming. O'Reilly & Associates, 1996, ISBN 156592-115-1
+(covers POSIX threads).
+
+=head2 OS-Related References
+
+Boykin, Joseph, David Kirschen, Alan Langerman, and Susan
+LoVerso. Programming under Mach. Addison-Wesley, 1994, ISBN
+0-201-52739-1.
+
+Tanenbaum, Andrew S. Distributed Operating Systems. Prentice Hall,
+1995, ISBN 0-13-219908-4 (great textbook).
+
+Silberschatz, Abraham, and Peter B. Galvin. Operating System Concepts,
+4th ed. Addison-Wesley, 1995, ISBN 0-201-59292-4
+
+=head2 Other References
+
+Arnold, Ken and James Gosling. The Java Programming Language, 2nd
+ed. Addison-Wesley, 1998, ISBN 0-201-31006-6.
+
+Le Sergent, T. and B. Berthomieu. "Incremental MultiThreaded Garbage
+Collection on Virtually Shared Memory Architectures" in Memory
+Management: Proc. of the International Workshop IWMM 92, St. Malo,
+France, September 1992, Yves Bekkers and Jacques Cohen, eds. Springer,
+1992, ISBN 3540-55940-X (real-life thread applications).
+
+=head1 Acknowledgements
+
+Thanks (in no particular order) to Chaim Frenkel, Steve Fink, Gurusamy
+Sarathy, Ilya Zakharevich, Benjamin Sugars, Jürgen Christoffel, Joshua
+Pritikin, and Alan Burlison, for their help in reality-checking and
+polishing this article.  Big thanks to Tom Christiansen for his rewrite
+of the prime number generator.
+
+=head1 AUTHOR
+
+Dan Sugalski E<lt>sugalskd@ous.eduE<gt>
+
+=head1 Copyrights
+
+This article originally appeared in The Perl Journal #10, and is
+copyright 1998 The Perl Journal. It appears courtesy of Jon Orwant and
+The Perl Journal.  This document may be distributed under the same terms
+as Perl itself.
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlpacktut.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlpacktut.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlpacktut.pod	(revision 14489)
@@ -0,0 +1,1146 @@
+=head1 NAME
+
+perlpacktut - tutorial on C<pack> and C<unpack>
+
+=head1 DESCRIPTION
+
+C<pack> and C<unpack> are two functions for transforming data according
+to a user-defined template, between the guarded way Perl stores values
+and some well-defined representation as might be required in the 
+environment of a Perl program. Unfortunately, they're also two of 
+the most misunderstood and most often overlooked functions that Perl
+provides. This tutorial will demystify them for you.
+
+
+=head1 The Basic Principle
+
+Most programming languages don't shelter the memory where variables are
+stored. In C, for instance, you can take the address of some variable,
+and the C<sizeof> operator tells you how many bytes are allocated to
+the variable. Using the address and the size, you may access the storage
+to your heart's content.
+
+In Perl, you just can't access memory at random, but the structural and
+representational conversion provided by C<pack> and C<unpack> is an
+excellent alternative. The C<pack> function converts values to a byte
+sequence containing representations according to a given specification,
+the so-called "template" argument. C<unpack> is the reverse process,
+deriving some values from the contents of a string of bytes. (Be cautioned,
+however, that not all that has been packed together can be neatly unpacked - 
+a very common experience as seasoned travellers are likely to confirm.)
+
+Why, you may ask, would you need a chunk of memory containing some values
+in binary representation? One good reason is input and output accessing
+some file, a device, or a network connection, whereby this binary
+representation is either forced on you or will give you some benefit
+in processing. Another cause is passing data to some system call that
+is not available as a Perl function: C<syscall> requires you to provide
+parameters stored in the way it happens in a C program. Even text processing 
+(as shown in the next section) may be simplified with judicious usage 
+of these two functions.
+
+To see how (un)packing works, we'll start with a simple template
+code where the conversion is in low gear: between the contents of a byte
+sequence and a string of hexadecimal digits. Let's use C<unpack>, since
+this is likely to remind you of a dump program, or some desperate last
+message unfortunate programs are wont to throw at you before they expire
+into the wild blue yonder. Assuming that the variable C<$mem> holds a 
+sequence of bytes that we'd like to inspect without assuming anything 
+about its meaning, we can write
+
+   my( $hex ) = unpack( 'H*', $mem );
+   print "$hex\n";
+
+whereupon we might see something like this, with each pair of hex digits
+corresponding to a byte:
+
+   41204d414e204120504c414e20412043414e414c2050414e414d41
+
+What was in this chunk of memory? Numbers, characters, or a mixture of
+both? Assuming that we're on a computer where ASCII (or some similar)
+encoding is used: hexadecimal values in the range C<0x40> - C<0x5A>
+indicate an uppercase letter, and C<0x20> encodes a space. So we might
+assume it is a piece of text, which some are able to read like a tabloid;
+but others will have to get hold of an ASCII table and relive that
+firstgrader feeling. Not caring too much about which way to read this,
+we note that C<unpack> with the template code C<H> converts the contents
+of a sequence of bytes into the customary hexadecimal notation. Since
+"a sequence of" is a pretty vague indication of quantity, C<H> has been
+defined to convert just a single hexadecimal digit unless it is followed
+by a repeat count. An asterisk for the repeat count means to use whatever
+remains.
+
+The inverse operation - packing byte contents from a string of hexadecimal
+digits - is just as easily written. For instance:
+
+   my $s = pack( 'H2' x 10, map { "3$_" } ( 0..9 ) );
+   print "$s\n";
+
+Since we feed a list of ten 2-digit hexadecimal strings to C<pack>, the
+pack template should contain ten pack codes. If this is run on a computer
+with ASCII character coding, it will print C<0123456789>.
+
+
+=head1 Packing Text
+
+Let's suppose you've got to read in a data file like this:
+
+    Date      |Description                | Income|Expenditure
+    01/24/2001 Ahmed's Camel Emporium                  1147.99
+    01/28/2001 Flea spray                                24.99
+    01/29/2001 Camel rides to tourists      235.00
+
+How do we do it? You might think first to use C<split>; however, since
+C<split> collapses blank fields, you'll never know whether a record was
+income or expenditure. Oops. Well, you could always use C<substr>:
+
+    while (<>) { 
+        my $date   = substr($_,  0, 11);
+        my $desc   = substr($_, 12, 27);
+        my $income = substr($_, 40,  7);
+        my $expend = substr($_, 52,  7);
+        ...
+    }
+
+It's not really a barrel of laughs, is it? In fact, it's worse than it
+may seem; the eagle-eyed may notice that the first field should only be
+10 characters wide, and the error has propagated right through the other
+numbers - which we've had to count by hand. So it's error-prone as well
+as horribly unfriendly.
+
+Or maybe we could use regular expressions:
+
+    while (<>) { 
+        my($date, $desc, $income, $expend) = 
+            m|(\d\d/\d\d/\d{4}) (.{27}) (.{7})(.*)|;
+        ...
+    }
+
+Urgh. Well, it's a bit better, but - well, would you want to maintain
+that?
+
+Hey, isn't Perl supposed to make this sort of thing easy? Well, it does,
+if you use the right tools. C<pack> and C<unpack> are designed to help
+you out when dealing with fixed-width data like the above. Let's have a
+look at a solution with C<unpack>:
+
+    while (<>) { 
+        my($date, $desc, $income, $expend) = unpack("A10xA27xA7A*", $_);
+        ...
+    }
+
+That looks a bit nicer; but we've got to take apart that weird template.
+Where did I pull that out of? 
+
+OK, let's have a look at some of our data again; in fact, we'll include
+the headers, and a handy ruler so we can keep track of where we are.
+
+             1         2         3         4         5        
+    1234567890123456789012345678901234567890123456789012345678
+    Date      |Description                | Income|Expenditure
+    01/28/2001 Flea spray                                24.99
+    01/29/2001 Camel rides to tourists      235.00
+
+From this, we can see that the date column stretches from column 1 to
+column 10 - ten characters wide. The C<pack>-ese for "character" is
+C<A>, and ten of them are C<A10>. So if we just wanted to extract the
+dates, we could say this:
+
+    my($date) = unpack("A10", $_);
+
+OK, what's next? Between the date and the description is a blank column;
+we want to skip over that. The C<x> template means "skip forward", so we
+want one of those. Next, we have another batch of characters, from 12 to
+38. That's 27 more characters, hence C<A27>. (Don't make the fencepost
+error - there are 27 characters between 12 and 38, not 26. Count 'em!)
+
+Now we skip another character and pick up the next 7 characters:
+
+    my($date,$description,$income) = unpack("A10xA27xA7", $_);
+
+Now comes the clever bit. Lines in our ledger which are just income and
+not expenditure might end at column 46. Hence, we don't want to tell our
+C<unpack> pattern that we B<need> to find another 12 characters; we'll
+just say "if there's anything left, take it". As you might guess from
+regular expressions, that's what the C<*> means: "use everything
+remaining".
+
+=over 3
+
+=item *
+
+Be warned, though, that unlike regular expressions, if the C<unpack>
+template doesn't match the incoming data, Perl will scream and die.
+
+=back
+
+
+Hence, putting it all together:
+
+    my($date,$description,$income,$expend) = unpack("A10xA27xA7xA*", $_);
+
+Now, that's our data parsed. I suppose what we might want to do now is
+total up our income and expenditure, and add another line to the end of
+our ledger - in the same format - saying how much we've brought in and
+how much we've spent:
+
+    while (<>) {
+        my($date, $desc, $income, $expend) = unpack("A10xA27xA7xA*", $_);
+        $tot_income += $income;
+        $tot_expend += $expend;
+    }
+
+    $tot_income = sprintf("%.2f", $tot_income); # Get them into 
+    $tot_expend = sprintf("%.2f", $tot_expend); # "financial" format
+
+    $date = POSIX::strftime("%m/%d/%Y", localtime); 
+
+    # OK, let's go:
+
+    print pack("A10xA27xA7xA*", $date, "Totals", $tot_income, $tot_expend);
+
+Oh, hmm. That didn't quite work. Let's see what happened:
+
+    01/24/2001 Ahmed's Camel Emporium                   1147.99
+    01/28/2001 Flea spray                                 24.99
+    01/29/2001 Camel rides to tourists     1235.00
+    03/23/2001Totals                     1235.001172.98
+
+OK, it's a start, but what happened to the spaces? We put C<x>, didn't
+we? Shouldn't it skip forward? Let's look at what L<perlfunc/pack> says:
+
+    x   A null byte.
+
+Urgh. No wonder. There's a big difference between "a null byte",
+character zero, and "a space", character 32. Perl's put something
+between the date and the description - but unfortunately, we can't see
+it! 
+
+What we actually need to do is expand the width of the fields. The C<A>
+format pads any non-existent characters with spaces, so we can use the
+additional spaces to line up our fields, like this:
+
+    print pack("A11 A28 A8 A*", $date, "Totals", $tot_income, $tot_expend);
+
+(Note that you can put spaces in the template to make it more readable,
+but they don't translate to spaces in the output.) Here's what we got
+this time:
+
+    01/24/2001 Ahmed's Camel Emporium                   1147.99
+    01/28/2001 Flea spray                                 24.99
+    01/29/2001 Camel rides to tourists     1235.00
+    03/23/2001 Totals                      1235.00 1172.98
+
+That's a bit better, but we still have that last column which needs to
+be moved further over. There's an easy way to fix this up:
+unfortunately, we can't get C<pack> to right-justify our fields, but we
+can get C<sprintf> to do it:
+
+    $tot_income = sprintf("%.2f", $tot_income); 
+    $tot_expend = sprintf("%12.2f", $tot_expend);
+    $date = POSIX::strftime("%m/%d/%Y", localtime); 
+    print pack("A11 A28 A8 A*", $date, "Totals", $tot_income, $tot_expend);
+
+This time we get the right answer:
+
+    01/28/2001 Flea spray                                 24.99
+    01/29/2001 Camel rides to tourists     1235.00
+    03/23/2001 Totals                      1235.00      1172.98
+
+So that's how we consume and produce fixed-width data. Let's recap what
+we've seen of C<pack> and C<unpack> so far:
+
+=over 3
+
+=item *
+
+Use C<pack> to go from several pieces of data to one fixed-width
+version; use C<unpack> to turn a fixed-width-format string into several
+pieces of data. 
+
+=item *
+
+The pack format C<A> means "any character"; if you're C<pack>ing and
+you've run out of things to pack, C<pack> will fill the rest up with
+spaces.
+
+=item *
+
+C<x> means "skip a byte" when C<unpack>ing; when C<pack>ing, it means
+"introduce a null byte" - that's probably not what you mean if you're
+dealing with plain text.
+
+=item *
+
+You can follow the formats with numbers to say how many characters
+should be affected by that format: C<A12> means "take 12 characters";
+C<x6> means "skip 6 bytes" or "character 0, 6 times".
+
+=item *
+
+Instead of a number, you can use C<*> to mean "consume everything else
+left". 
+
+B<Warning>: when packing multiple pieces of data, C<*> only means
+"consume all of the current piece of data". That's to say
+
+    pack("A*A*", $one, $two)
+
+packs all of C<$one> into the first C<A*> and then all of C<$two> into
+the second. This is a general principle: each format character
+corresponds to one piece of data to be C<pack>ed.
+
+=back
+
+
+
+=head1 Packing Numbers
+
+So much for textual data. Let's get onto the meaty stuff that C<pack>
+and C<unpack> are best at: handling binary formats for numbers. There is,
+of course, not just one binary format  - life would be too simple - but
+Perl will do all the finicky labor for you.
+
+
+=head2 Integers
+
+Packing and unpacking numbers implies conversion to and from some
+I<specific> binary representation. Leaving floating point numbers
+aside for the moment, the salient properties of any such representation
+are:
+
+=over 4
+
+=item *
+
+the number of bytes used for storing the integer,
+
+=item *
+
+whether the contents are interpreted as a signed or unsigned number,
+
+=item *
+
+the byte ordering: whether the first byte is the least or most
+significant byte (or: little-endian or big-endian, respectively).
+
+=back
+
+So, for instance, to pack 20302 to a signed 16 bit integer in your
+computer's representation you write
+
+   my $ps = pack( 's', 20302 );
+
+Again, the result is a string, now containing 2 bytes. If you print 
+this string (which is, generally, not recommended) you might see
+C<ON> or C<NO> (depending on your system's byte ordering) - or something
+entirely different if your computer doesn't use ASCII character encoding.
+Unpacking C<$ps> with the same template returns the original integer value:
+
+   my( $s ) = unpack( 's', $ps );
+
+This is true for all numeric template codes. But don't expect miracles:
+if the packed value exceeds the allotted byte capacity, high order bits
+are silently discarded, and unpack certainly won't be able to pull them
+back out of some magic hat. And, when you pack using a signed template
+code such as C<s>, an excess value may result in the sign bit
+getting set, and unpacking this will smartly return a negative value.
+
+16 bits won't get you too far with integers, but there is C<l> and C<L>
+for signed and unsigned 32-bit integers. And if this is not enough and
+your system supports 64 bit integers you can push the limits much closer
+to infinity with pack codes C<q> and C<Q>. A notable exception is provided
+by pack codes C<i> and C<I> for signed and unsigned integers of the 
+"local custom" variety: Such an integer will take up as many bytes as
+a local C compiler returns for C<sizeof(int)>, but it'll use I<at least>
+32 bits.
+
+Each of the integer pack codes C<sSlLqQ> results in a fixed number of bytes,
+no matter where you execute your program. This may be useful for some 
+applications, but it does not provide for a portable way to pass data 
+structures between Perl and C programs (bound to happen when you call 
+XS extensions or the Perl function C<syscall>), or when you read or
+write binary files. What you'll need in this case are template codes that
+depend on what your local C compiler compiles when you code C<short> or
+C<unsigned long>, for instance. These codes and their corresponding
+byte lengths are shown in the table below.  Since the C standard leaves
+much leeway with respect to the relative sizes of these data types, actual
+values may vary, and that's why the values are given as expressions in
+C and Perl. (If you'd like to use values from C<%Config> in your program
+you have to import it with C<use Config>.)
+
+   signed unsigned  byte length in C   byte length in Perl       
+     s!     S!      sizeof(short)      $Config{shortsize}
+     i!     I!      sizeof(int)        $Config{intsize}
+     l!     L!      sizeof(long)       $Config{longsize}
+     q!     Q!      sizeof(long long)  $Config{longlongsize}
+
+The C<i!> and C<I!> codes aren't different from C<i> and C<I>; they are
+tolerated for completeness' sake.
+
+
+=head2 Unpacking a Stack Frame
+
+Requesting a particular byte ordering may be necessary when you work with
+binary data coming from some specific architecture whereas your program could
+run on a totally different system. As an example, assume you have 24 bytes
+containing a stack frame as it happens on an Intel 8086:
+
+      +---------+        +----+----+               +---------+
+ TOS: |   IP    |  TOS+4:| FL | FH | FLAGS  TOS+14:|   SI    |
+      +---------+        +----+----+               +---------+
+      |   CS    |        | AL | AH | AX            |   DI    |
+      +---------+        +----+----+               +---------+
+                         | BL | BH | BX            |   BP    |
+                         +----+----+               +---------+
+                         | CL | CH | CX            |   DS    |
+                         +----+----+               +---------+
+                         | DL | DH | DX            |   ES    |
+                         +----+----+               +---------+
+
+First, we note that this time-honored 16-bit CPU uses little-endian order,
+and that's why the low order byte is stored at the lower address. To
+unpack such a (signed) short we'll have to use code C<v>. A repeat
+count unpacks all 12 shorts:
+
+   my( $ip, $cs, $flags, $ax, $bx, $cd, $dx, $si, $di, $bp, $ds, $es ) =
+     unpack( 'v12', $frame );
+
+Alternatively, we could have used C<C> to unpack the individually
+accessible byte registers FL, FH, AL, AH, etc.:
+
+   my( $fl, $fh, $al, $ah, $bl, $bh, $cl, $ch, $dl, $dh ) =
+     unpack( 'C10', substr( $frame, 4, 10 ) );
+
+It would be nice if we could do this in one fell swoop: unpack a short,
+back up a little, and then unpack 2 bytes. Since Perl I<is> nice, it
+proffers the template code C<X> to back up one byte. Putting this all
+together, we may now write:
+
+   my( $ip, $cs,
+       $flags,$fl,$fh,
+       $ax,$al,$ah, $bx,$bl,$bh, $cx,$cl,$ch, $dx,$dl,$dh, 
+       $si, $di, $bp, $ds, $es ) =
+   unpack( 'v2' . ('vXXCC' x 5) . 'v5', $frame );
+
+(The clumsy construction of the template can be avoided - just read on!)  
+
+We've taken some pains to construct the template so that it matches
+the contents of our frame buffer. Otherwise we'd either get undefined values,
+or C<unpack> could not unpack all. If C<pack> runs out of items, it will
+supply null strings (which are coerced into zeroes whenever the pack code
+says so).
+
+
+=head2 How to Eat an Egg on a Net
+
+The pack code for big-endian (high order byte at the lowest address) is
+C<n> for 16 bit and C<N> for 32 bit integers. You use these codes
+if you know that your data comes from a compliant architecture, but,
+surprisingly enough, you should also use these pack codes if you
+exchange binary data, across the network, with some system that you
+know next to nothing about. The simple reason is that this
+order has been chosen as the I<network order>, and all standard-fearing
+programs ought to follow this convention. (This is, of course, a stern
+backing for one of the Lilliputian parties and may well influence the
+political development there.) So, if the protocol expects you to send
+a message by sending the length first, followed by just so many bytes,
+you could write:
+
+   my $buf = pack( 'N', length( $msg ) ) . $msg;
+
+or even:
+
+   my $buf = pack( 'NA*', length( $msg ), $msg );
+
+and pass C<$buf> to your send routine. Some protocols demand that the
+count should include the length of the count itself: then just add 4
+to the data length. (But make sure to read L<"Lengths and Widths"> before
+you really code this!)
+
+
+
+=head2 Floating point Numbers
+
+For packing floating point numbers you have the choice between the
+pack codes C<f> and C<d> which pack into (or unpack from) single-precision or
+double-precision representation as it is provided by your system. (There
+is no such thing as a network representation for reals, so if you want
+to send your real numbers across computer boundaries, you'd better stick
+to ASCII representation, unless you're absolutely sure what's on the other
+end of the line.)
+
+
+
+=head1 Exotic Templates
+
+
+=head2 Bit Strings
+
+Bits are the atoms in the memory world. Access to individual bits may
+have to be used either as a last resort or because it is the most
+convenient way to handle your data. Bit string (un)packing converts
+between strings containing a series of C<0> and C<1> characters and
+a sequence of bytes each containing a group of 8 bits. This is almost
+as simple as it sounds, except that there are two ways the contents of
+a byte may be written as a bit string. Let's have a look at an annotated
+byte:
+
+     7 6 5 4 3 2 1 0
+   +-----------------+
+   | 1 0 0 0 1 1 0 0 |
+   +-----------------+
+    MSB           LSB
+
+It's egg-eating all over again: Some think that as a bit string this should
+be written "10001100" i.e. beginning with the most significant bit, others
+insist on "00110001". Well, Perl isn't biased, so that's why we have two bit
+string codes:
+
+   $byte = pack( 'B8', '10001100' ); # start with MSB
+   $byte = pack( 'b8', '00110001' ); # start with LSB
+
+It is not possible to pack or unpack bit fields - just integral bytes.
+C<pack> always starts at the next byte boundary and "rounds up" to the
+next multiple of 8 by adding zero bits as required. (If you do want bit
+fields, there is L<perlfunc/vec>. Or you could implement bit field 
+handling at the character string level, using split, substr, and
+concatenation on unpacked bit strings.)
+
+To illustrate unpacking for bit strings, we'll decompose a simple
+status register (a "-" stands for a "reserved" bit):
+
+   +-----------------+-----------------+
+   | S Z - A - P - C | - - - - O D I T |
+   +-----------------+-----------------+
+    MSB           LSB MSB           LSB
+
+Converting these two bytes to a string can be done with the unpack 
+template C<'b16'>. To obtain the individual bit values from the bit
+string we use C<split> with the "empty" separator pattern which dissects
+into individual characters. Bit values from the "reserved" positions are
+simply assigned to C<undef>, a convenient notation for "I don't care where
+this goes".
+
+   ($carry, undef, $parity, undef, $auxcarry, undef, $zero, $sign,
+    $trace, $interrupt, $direction, $overflow) =
+      split( //, unpack( 'b16', $status ) );
+
+We could have used an unpack template C<'b12'> just as well, since the
+last 4 bits can be ignored anyway. 
+
+
+=head2 Uuencoding
+
+Another odd-man-out in the template alphabet is C<u>, which packs an
+"uuencoded string". ("uu" is short for Unix-to-Unix.) Chances are that
+you won't ever need this encoding technique which was invented to overcome
+the shortcomings of old-fashioned transmission mediums that do not support
+other than simple ASCII data. The essential recipe is simple: Take three 
+bytes, or 24 bits. Split them into 4 six-packs, adding a space (0x20) to 
+each. Repeat until all of the data is blended. Fold groups of 4 bytes into 
+lines no longer than 60 and garnish them in front with the original byte count 
+(incremented by 0x20) and a C<"\n"> at the end. - The C<pack> chef will
+prepare this for you, a la minute, when you select pack code C<u> on the menu:
+
+   my $uubuf = pack( 'u', $bindat );
+
+A repeat count after C<u> sets the number of bytes to put into an
+uuencoded line, which is the maximum of 45 by default, but could be
+set to some (smaller) integer multiple of three. C<unpack> simply ignores
+the repeat count.
+
+
+=head2 Doing Sums
+
+An even stranger template code is C<%>E<lt>I<number>E<gt>. First, because 
+it's used as a prefix to some other template code. Second, because it
+cannot be used in C<pack> at all, and third, in C<unpack>, doesn't return the
+data as defined by the template code it precedes. Instead it'll give you an
+integer of I<number> bits that is computed from the data value by 
+doing sums. For numeric unpack codes, no big feat is achieved:
+
+    my $buf = pack( 'iii', 100, 20, 3 );
+    print unpack( '%32i3', $buf ), "\n";  # prints 123
+
+For string values, C<%> returns the sum of the byte values saving
+you the trouble of a sum loop with C<substr> and C<ord>:
+
+    print unpack( '%32A*', "\x01\x10" ), "\n";  # prints 17
+
+Although the C<%> code is documented as returning a "checksum":
+don't put your trust in such values! Even when applied to a small number
+of bytes, they won't guarantee a noticeable Hamming distance.
+
+In connection with C<b> or C<B>, C<%> simply adds bits, and this can be put
+to good use to count set bits efficiently:
+
+    my $bitcount = unpack( '%32b*', $mask );
+
+And an even parity bit can be determined like this:
+
+    my $evenparity = unpack( '%1b*', $mask );
+
+
+=head2  Unicode
+
+Unicode is a character set that can represent most characters in most of
+the world's languages, providing room for over one million different
+characters. Unicode 3.1 specifies 94,140 characters: The Basic Latin
+characters are assigned to the numbers 0 - 127. The Latin-1 Supplement with
+characters that are used in several European languages is in the next
+range, up to 255. After some more Latin extensions we find the character
+sets from languages using non-Roman alphabets, interspersed with a
+variety of symbol sets such as currency symbols, Zapf Dingbats or Braille.
+(You might want to visit L<www.unicode.org> for a look at some of
+them - my personal favourites are Telugu and Kannada.)
+
+The Unicode character sets associates characters with integers. Encoding
+these numbers in an equal number of bytes would more than double the
+requirements for storing texts written in Latin alphabets.
+The UTF-8 encoding avoids this by storing the most common (from a western
+point of view) characters in a single byte while encoding the rarer
+ones in three or more bytes.
+
+So what has this got to do with C<pack>? Well, if you want to convert
+between a Unicode number and its UTF-8 representation you can do so by
+using template code C<U>. As an example, let's produce the UTF-8
+representation of the Euro currency symbol (code number 0x20AC):
+
+   $UTF8{Euro} = pack( 'U', 0x20AC );
+
+Inspecting C<$UTF8{Euro}> shows that it contains 3 bytes: "\xe2\x82\xac". The
+round trip can be completed with C<unpack>:
+
+   $Unicode{Euro} = unpack( 'U', $UTF8{Euro} );
+
+Usually you'll want to pack or unpack UTF-8 strings:
+
+   # pack and unpack the Hebrew alphabet
+   my $alefbet = pack( 'U*', 0x05d0..0x05ea );
+   my @hebrew = unpack( 'U*', $utf );
+
+
+=head2 Another Portable Binary Encoding
+
+The pack code C<w> has been added to support a portable binary data
+encoding scheme that goes way beyond simple integers. (Details can
+be found at L<Casbah.org>, the Scarab project.)  A BER (Binary Encoded
+Representation) compressed unsigned integer stores base 128
+digits, most significant digit first, with as few digits as possible.
+Bit eight (the high bit) is set on each byte except the last. There
+is no size limit to BER encoding, but Perl won't go to extremes.
+
+   my $berbuf = pack( 'w*', 1, 128, 128+1, 128*128+127 );
+
+A hex dump of C<$berbuf>, with spaces inserted at the right places,
+shows 01 8100 8101 81807F. Since the last byte is always less than
+128, C<unpack> knows where to stop.
+
+
+=head1 Template Grouping
+
+Prior to Perl 5.8, repetitions of templates had to be made by
+C<x>-multiplication of template strings. Now there is a better way as
+we may use the pack codes C<(> and C<)> combined with a repeat count.
+The C<unpack> template from the Stack Frame example can simply
+be written like this:
+
+   unpack( 'v2 (vXXCC)5 v5', $frame )
+
+Let's explore this feature a little more. We'll begin with the equivalent of
+
+   join( '', map( substr( $_, 0, 1 ), @str ) )
+
+which returns a string consisting of the first character from each string.
+Using pack, we can write
+
+   pack( '(A)'.@str, @str )
+
+or, because a repeat count C<*> means "repeat as often as required",
+simply
+
+   pack( '(A)*', @str )
+
+(Note that the template C<A*> would only have packed C<$str[0]> in full
+length.)
+
+To pack dates stored as triplets ( day, month, year ) in an array C<@dates>
+into a sequence of byte, byte, short integer we can write
+
+   $pd = pack( '(CCS)*', map( @$_, @dates ) );
+
+To swap pairs of characters in a string (with even length) one could use
+several techniques. First, let's use C<x> and C<X> to skip forward and back:
+
+   $s = pack( '(A)*', unpack( '(xAXXAx)*', $s ) );
+
+We can also use C<@> to jump to an offset, with 0 being the position where
+we were when the last C<(> was encountered:
+
+   $s = pack( '(A)*', unpack( '(@1A @0A @2)*', $s ) );
+
+Finally, there is also an entirely different approach by unpacking big
+endian shorts and packing them in the reverse byte order:
+
+   $s = pack( '(v)*', unpack( '(n)*', $s );
+
+
+=head1 Lengths and Widths
+
+=head2 String Lengths
+
+In the previous section we've seen a network message that was constructed
+by prefixing the binary message length to the actual message. You'll find
+that packing a length followed by so many bytes of data is a 
+frequently used recipe since appending a null byte won't work
+if a null byte may be part of the data. Here is an example where both
+techniques are used: after two null terminated strings with source and
+destination address, a Short Message (to a mobile phone) is sent after
+a length byte:
+
+   my $msg = pack( 'Z*Z*CA*', $src, $dst, length( $sm ), $sm );
+
+Unpacking this message can be done with the same template:
+
+   ( $src, $dst, $len, $sm ) = unpack( 'Z*Z*CA*', $msg );
+
+There's a subtle trap lurking in the offing: Adding another field after
+the Short Message (in variable C<$sm>) is all right when packing, but this
+cannot be unpacked naively:
+
+   # pack a message
+   my $msg = pack( 'Z*Z*CA*C', $src, $dst, length( $sm ), $sm, $prio );
+
+   # unpack fails - $prio remains undefined!
+   ( $src, $dst, $len, $sm, $prio ) = unpack( 'Z*Z*CA*C', $msg );
+
+The pack code C<A*> gobbles up all remaining bytes, and C<$prio> remains
+undefined! Before we let disappointment dampen the morale: Perl's got
+the trump card to make this trick too, just a little further up the sleeve.
+Watch this:
+
+   # pack a message: ASCIIZ, ASCIIZ, length/string, byte
+   my $msg = pack( 'Z* Z* C/A* C', $src, $dst, $sm, $prio );
+
+   # unpack
+   ( $src, $dst, $sm, $prio ) = unpack( 'Z* Z* C/A* C', $msg );
+
+Combining two pack codes with a slash (C</>) associates them with a single
+value from the argument list. In C<pack>, the length of the argument is
+taken and packed according to the first code while the argument itself
+is added after being converted with the template code after the slash.
+This saves us the trouble of inserting the C<length> call, but it is 
+in C<unpack> where we really score: The value of the length byte marks the
+end of the string to be taken from the buffer. Since this combination
+doesn't make sense except when the second pack code isn't C<a*>, C<A*>
+or C<Z*>, Perl won't let you.
+
+The pack code preceding C</> may be anything that's fit to represent a
+number: All the numeric binary pack codes, and even text codes such as
+C<A4> or C<Z*>:
+
+   # pack/unpack a string preceded by its length in ASCII
+   my $buf = pack( 'A4/A*', "Humpty-Dumpty" );
+   # unpack $buf: '13  Humpty-Dumpty'
+   my $txt = unpack( 'A4/A*', $buf );
+
+C</> is not implemented in Perls before 5.6, so if your code is required to
+work on older Perls you'll need to C<unpack( 'Z* Z* C')> to get the length,
+then use it to make a new unpack string. For example
+
+   # pack a message: ASCIIZ, ASCIIZ, length, string, byte (5.005 compatible)
+   my $msg = pack( 'Z* Z* C A* C', $src, $dst, length $sm, $sm, $prio );
+
+   # unpack
+   ( undef, undef, $len) = unpack( 'Z* Z* C', $msg );
+   ($src, $dst, $sm, $prio) = unpack ( "Z* Z* x A$len C", $msg );
+
+But that second C<unpack> is rushing ahead. It isn't using a simple literal
+string for the template. So maybe we should introduce...
+
+=head2 Dynamic Templates
+
+So far, we've seen literals used as templates. If the list of pack
+items doesn't have fixed length, an expression constructing the
+template is required (whenever, for some reason, C<()*> cannot be used).
+Here's an example: To store named string values in a way that can be
+conveniently parsed by a C program, we create a sequence of names and
+null terminated ASCII strings, with C<=> between the name and the value,
+followed by an additional delimiting null byte. Here's how:
+
+   my $env = pack( '(A*A*Z*)' . keys( %Env ) . 'C',
+                   map( { ( $_, '=', $Env{$_} ) } keys( %Env ) ), 0 );
+
+Let's examine the cogs of this byte mill, one by one. There's the C<map>
+call, creating the items we intend to stuff into the C<$env> buffer:
+to each key (in C<$_>) it adds the C<=> separator and the hash entry value.
+Each triplet is packed with the template code sequence C<A*A*Z*> that
+is repeated according to the number of keys. (Yes, that's what the C<keys>
+function returns in scalar context.) To get the very last null byte,
+we add a C<0> at the end of the C<pack> list, to be packed with C<C>.
+(Attentive readers may have noticed that we could have omitted the 0.)
+
+For the reverse operation, we'll have to determine the number of items
+in the buffer before we can let C<unpack> rip it apart:
+
+   my $n = $env =~ tr/\0// - 1;
+   my %env = map( split( /=/, $_ ), unpack( "(Z*)$n", $env ) );
+
+The C<tr> counts the null bytes. The C<unpack> call returns a list of
+name-value pairs each of which is taken apart in the C<map> block. 
+
+
+=head2 Counting Repetitions
+
+Rather than storing a sentinel at the end of a data item (or a list of items),
+we could precede the data with a count. Again, we pack keys and values of
+a hash, preceding each with an unsigned short length count, and up front
+we store the number of pairs:
+
+   my $env = pack( 'S(S/A* S/A*)*', scalar keys( %Env ), %Env );
+
+This simplifies the reverse operation as the number of repetitions can be
+unpacked with the C</> code:
+
+   my %env = unpack( 'S/(S/A* S/A*)', $env );
+
+Note that this is one of the rare cases where you cannot use the same
+template for C<pack> and C<unpack> because C<pack> can't determine
+a repeat count for a C<()>-group.
+
+
+=head1 Packing and Unpacking C Structures
+
+In previous sections we have seen how to pack numbers and character
+strings. If it were not for a couple of snags we could conclude this
+section right away with the terse remark that C structures don't
+contain anything else, and therefore you already know all there is to it.
+Sorry, no: read on, please.
+
+=head2 The Alignment Pit
+
+In the consideration of speed against memory requirements the balance
+has been tilted in favor of faster execution. This has influenced the
+way C compilers allocate memory for structures: On architectures
+where a 16-bit or 32-bit operand can be moved faster between places in
+memory, or to or from a CPU register, if it is aligned at an even or 
+multiple-of-four or even at a multiple-of eight address, a C compiler
+will give you this speed benefit by stuffing extra bytes into structures.
+If you don't cross the C shoreline this is not likely to cause you any
+grief (although you should care when you design large data structures,
+or you want your code to be portable between architectures (you do want
+that, don't you?)).
+
+To see how this affects C<pack> and C<unpack>, we'll compare these two
+C structures:
+
+   typedef struct {
+     char     c1;
+     short    s;
+     char     c2;
+     long     l;
+   } gappy_t;
+
+   typedef struct {
+     long     l;
+     short    s;
+     char     c1;
+     char     c2;
+   } dense_t;
+
+Typically, a C compiler allocates 12 bytes to a C<gappy_t> variable, but
+requires only 8 bytes for a C<dense_t>. After investigating this further,
+we can draw memory maps, showing where the extra 4 bytes are hidden:
+
+   0           +4          +8          +12
+   +--+--+--+--+--+--+--+--+--+--+--+--+
+   |c1|xx|  s  |c2|xx|xx|xx|     l     |    xx = fill byte
+   +--+--+--+--+--+--+--+--+--+--+--+--+
+   gappy_t
+
+   0           +4          +8
+   +--+--+--+--+--+--+--+--+
+   |     l     |  h  |c1|c2|
+   +--+--+--+--+--+--+--+--+
+   dense_t
+
+And that's where the first quirk strikes: C<pack> and C<unpack>
+templates have to be stuffed with C<x> codes to get those extra fill bytes.
+
+The natural question: "Why can't Perl compensate for the gaps?" warrants
+an answer. One good reason is that C compilers might provide (non-ANSI)
+extensions permitting all sorts of fancy control over the way structures
+are aligned, even at the level of an individual structure field. And, if
+this were not enough, there is an insidious thing called C<union> where
+the amount of fill bytes cannot be derived from the alignment of the next
+item alone.
+
+OK, so let's bite the bullet. Here's one way to get the alignment right
+by inserting template codes C<x>, which don't take a corresponding item 
+from the list:
+
+  my $gappy = pack( 'cxs cxxx l!', $c1, $s, $c2, $l );
+
+Note the C<!> after C<l>: We want to make sure that we pack a long
+integer as it is compiled by our C compiler. And even now, it will only
+work for the platforms where the compiler aligns things as above.
+And somebody somewhere has a platform where it doesn't.
+[Probably a Cray, where C<short>s, C<int>s and C<long>s are all 8 bytes. :-)]
+
+Counting bytes and watching alignments in lengthy structures is bound to 
+be a drag. Isn't there a way we can create the template with a simple
+program? Here's a C program that does the trick:
+
+   #include <stdio.h>
+   #include <stddef.h>
+
+   typedef struct {
+     char     fc1;
+     short    fs;
+     char     fc2;
+     long     fl;
+   } gappy_t;
+
+   #define Pt(struct,field,tchar) \
+     printf( "@%d%s ", offsetof(struct,field), # tchar );
+
+   int main() {
+     Pt( gappy_t, fc1, c  );
+     Pt( gappy_t, fs,  s! );
+     Pt( gappy_t, fc2, c  );
+     Pt( gappy_t, fl,  l! );
+     printf( "\n" );
+   }
+
+The output line can be used as a template in a C<pack> or C<unpack> call:
+
+  my $gappy = pack( '@0c @2s! @4c @8l!', $c1, $s, $c2, $l );
+
+Gee, yet another template code - as if we hadn't plenty. But 
+C<@> saves our day by enabling us to specify the offset from the beginning
+of the pack buffer to the next item: This is just the value
+the C<offsetof> macro (defined in C<E<lt>stddef.hE<gt>>) returns when
+given a C<struct> type and one of its field names ("member-designator" in 
+C standardese).
+
+Neither using offsets nor adding C<x>'s to bridge the gaps is satisfactory.
+(Just imagine what happens if the structure changes.) What we really need
+is a way of saying "skip as many bytes as required to the next multiple of N".
+In fluent Templatese, you say this with C<x!N> where N is replaced by the
+appropriate value. Here's the next version of our struct packaging:
+
+  my $gappy = pack( 'c x!2 s c x!4 l!', $c1, $s, $c2, $l );
+
+That's certainly better, but we still have to know how long all the
+integers are, and portability is far away. Rather than C<2>,
+for instance, we want to say "however long a short is". But this can be
+done by enclosing the appropriate pack code in brackets: C<[s]>. So, here's
+the very best we can do:
+
+  my $gappy = pack( 'c x![s] s c x![l!] l!', $c1, $s, $c2, $l );
+
+
+=head2 Alignment, Take 2
+
+I'm afraid that we're not quite through with the alignment catch yet. The
+hydra raises another ugly head when you pack arrays of structures:
+
+   typedef struct {
+     short    count;
+     char     glyph;
+   } cell_t;
+
+   typedef cell_t buffer_t[BUFLEN];
+
+Where's the catch? Padding is neither required before the first field C<count>,
+nor between this and the next field C<glyph>, so why can't we simply pack
+like this:
+
+   # something goes wrong here:
+   pack( 's!a' x @buffer,
+         map{ ( $_->{count}, $_->{glyph} ) } @buffer );
+
+This packs C<3*@buffer> bytes, but it turns out that the size of 
+C<buffer_t> is four times C<BUFLEN>! The moral of the story is that
+the required alignment of a structure or array is propagated to the
+next higher level where we have to consider padding I<at the end>
+of each component as well. Thus the correct template is:
+
+   pack( 's!ax' x @buffer,
+         map{ ( $_->{count}, $_->{glyph} ) } @buffer );
+
+=head2 Alignment, Take 3
+
+And even if you take all the above into account, ANSI still lets this:
+
+   typedef struct {
+     char     foo[2];
+   } foo_t;
+
+vary in size. The alignment constraint of the structure can be greater than
+any of its elements. [And if you think that this doesn't affect anything
+common, dismember the next cellphone that you see. Many have ARM cores, and
+the ARM structure rules make C<sizeof (foo_t)> == 4]
+
+=head2 Pointers for How to Use Them
+
+The title of this section indicates the second problem you may run into
+sooner or later when you pack C structures. If the function you intend
+to call expects a, say, C<void *> value, you I<cannot> simply take
+a reference to a Perl variable. (Although that value certainly is a
+memory address, it's not the address where the variable's contents are
+stored.)
+
+Template code C<P> promises to pack a "pointer to a fixed length string".
+Isn't this what we want? Let's try:
+
+    # allocate some storage and pack a pointer to it
+    my $memory = "\x00" x $size;
+    my $memptr = pack( 'P', $memory );
+
+But wait: doesn't C<pack> just return a sequence of bytes? How can we pass this
+string of bytes to some C code expecting a pointer which is, after all,
+nothing but a number? The answer is simple: We have to obtain the numeric
+address from the bytes returned by C<pack>.
+
+    my $ptr = unpack( 'L!', $memptr );
+
+Obviously this assumes that it is possible to typecast a pointer
+to an unsigned long and vice versa, which frequently works but should not
+be taken as a universal law. - Now that we have this pointer the next question
+is: How can we put it to good use? We need a call to some C function
+where a pointer is expected. The read(2) system call comes to mind:
+
+    ssize_t read(int fd, void *buf, size_t count);
+
+After reading L<perlfunc> explaining how to use C<syscall> we can write
+this Perl function copying a file to standard output:
+
+    require 'syscall.ph';
+    sub cat($){
+        my $path = shift();
+        my $size = -s $path;
+        my $memory = "\x00" x $size;  # allocate some memory
+        my $ptr = unpack( 'L', pack( 'P', $memory ) );
+        open( F, $path ) || die( "$path: cannot open ($!)\n" );
+        my $fd = fileno(F);
+        my $res = syscall( &SYS_read, fileno(F), $ptr, $size );
+        print $memory;
+        close( F );
+    }
+
+This is neither a specimen of simplicity nor a paragon of portability but
+it illustrates the point: We are able to sneak behind the scenes and
+access Perl's otherwise well-guarded memory! (Important note: Perl's
+C<syscall> does I<not> require you to construct pointers in this roundabout
+way. You simply pass a string variable, and Perl forwards the address.) 
+
+How does C<unpack> with C<P> work? Imagine some pointer in the buffer
+about to be unpacked: If it isn't the null pointer (which will smartly
+produce the C<undef> value) we have a start address - but then what?
+Perl has no way of knowing how long this "fixed length string" is, so
+it's up to you to specify the actual size as an explicit length after C<P>.
+
+   my $mem = "abcdefghijklmn";
+   print unpack( 'P5', pack( 'P', $mem ) ); # prints "abcde"
+
+As a consequence, C<pack> ignores any number or C<*> after C<P>.
+
+
+Now that we have seen C<P> at work, we might as well give C<p> a whirl.
+Why do we need a second template code for packing pointers at all? The 
+answer lies behind the simple fact that an C<unpack> with C<p> promises
+a null-terminated string starting at the address taken from the buffer,
+and that implies a length for the data item to be returned:
+
+   my $buf = pack( 'p', "abc\x00efhijklmn" );
+   print unpack( 'p', $buf );    # prints "abc"
+
+
+
+Albeit this is apt to be confusing: As a consequence of the length being
+implied by the string's length, a number after pack code C<p> is a repeat
+count, not a length as after C<P>. 
+
+
+Using C<pack(..., $x)> with C<P> or C<p> to get the address where C<$x> is
+actually stored must be used with circumspection. Perl's internal machinery
+considers the relation between a variable and that address as its very own 
+private matter and doesn't really care that we have obtained a copy. Therefore:
+
+=over 4
+
+=item * 
+
+Do not use C<pack> with C<p> or C<P> to obtain the address of variable
+that's bound to go out of scope (and thereby freeing its memory) before you
+are done with using the memory at that address.
+
+=item * 
+
+Be very careful with Perl operations that change the value of the
+variable. Appending something to the variable, for instance, might require
+reallocation of its storage, leaving you with a pointer into no-man's land.
+
+=item * 
+
+Don't think that you can get the address of a Perl variable
+when it is stored as an integer or double number! C<pack('P', $x)> will
+force the variable's internal representation to string, just as if you
+had written something like C<$x .= ''>.
+
+=back
+
+It's safe, however, to P- or p-pack a string literal, because Perl simply
+allocates an anonymous variable.
+
+
+
+=head1 Pack Recipes
+
+Here are a collection of (possibly) useful canned recipes for C<pack>
+and C<unpack>:
+
+    # Convert IP address for socket functions
+    pack( "C4", split /\./, "123.4.5.6" ); 
+
+    # Count the bits in a chunk of memory (e.g. a select vector)
+    unpack( '%32b*', $mask );
+
+    # Determine the endianness of your system
+    $is_little_endian = unpack( 'c', pack( 's', 1 ) );
+    $is_big_endian = unpack( 'xc', pack( 's', 1 ) );
+
+    # Determine the number of bits in a native integer
+    $bits = unpack( '%32I!', ~0 );
+
+    # Prepare argument for the nanosleep system call
+    my $timespec = pack( 'L!L!', $secs, $nanosecs );
+
+For a simple memory dump we unpack some bytes into just as 
+many pairs of hex digits, and use C<map> to handle the traditional
+spacing - 16 bytes to a line:
+
+    my $i;
+    print map( ++$i % 16 ? "$_ " : "$_\n",
+               unpack( 'H2' x length( $mem ), $mem ) ),
+          length( $mem ) % 16 ? "\n" : '';
+
+
+=head1 Funnies Section
+
+    # Pulling digits out of nowhere...
+    print unpack( 'C', pack( 'x' ) ),
+          unpack( '%B*', pack( 'A' ) ),
+          unpack( 'H', pack( 'A' ) ),
+          unpack( 'A', unpack( 'C', pack( 'A' ) ) ), "\n";
+
+    # One for the road ;-)
+    my $advice = pack( 'all u can in a van' );
+
+
+=head1 Authors
+
+Simon Cozens and Wolfgang Laun.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlplan9.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlplan9.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlplan9.pod	(revision 14489)
@@ -0,0 +1,146 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+perlplan9 - Plan 9-specific documentation for Perl
+
+=head1 DESCRIPTION
+
+These are a few notes describing features peculiar to
+Plan 9 Perl. As such, it is not intended to be a replacement
+for the rest of the Perl 5 documentation (which is both 
+copious and excellent). If you have any questions to 
+which you can't find answers in these man pages, contact 
+Luther Huffman at lutherh@stratcom.com and we'll try to 
+answer them.
+
+=head2 Invoking Perl
+
+Perl is invoked from the command line as described in 
+L<perl>. Most perl scripts, however, do have a first line 
+such as "#!/usr/local/bin/perl". This is known as a shebang 
+(shell-bang) statement and tells the OS shell where to find 
+the perl interpreter. In Plan 9 Perl this statement should be 
+"#!/bin/perl" if you wish to be able to directly invoke the 
+script by its name.
+     Alternatively, you may invoke perl with the command "Perl"
+instead of "perl". This will produce Acme-friendly error
+messages of the form "filename:18".
+
+Some scripts, usually identified with a *.PL extension, are 
+self-configuring and are able to correctly create their own 
+shebang path from config information located in Plan 9 
+Perl. These you won't need to be worried about.
+
+=head2 What's in Plan 9 Perl
+
+Although Plan 9 Perl currently only  provides static 
+loading, it is built with a number of useful extensions. 
+These include Opcode, FileHandle, Fcntl, and POSIX. Expect 
+to see others (and DynaLoading!) in the future.
+
+=head2 What's not in Plan 9 Perl
+
+As mentioned previously, dynamic loading isn't currently 
+available nor is MakeMaker. Both are high-priority items.
+
+=head2 Perl5 Functions not currently supported in Plan 9 Perl
+
+Some, such as C<chown> and C<umask> aren't provided 
+because the concept does not exist within Plan 9. Others,
+such as some of the socket-related functions, simply
+haven't been written yet. Many in the latter category 
+may be supported in the future.
+
+The functions not currently implemented include:
+
+    chown, chroot, dbmclose, dbmopen, getsockopt, 
+    setsockopt, recvmsg, sendmsg, getnetbyname, 
+    getnetbyaddr, getnetent, getprotoent, getservent, 
+    sethostent, setnetent, setprotoent, setservent, 
+    endservent, endnetent, endprotoent, umask
+
+There may be several other functions that have undefined 
+behavior so this list shouldn't be considered complete.
+
+=head2 Signals in Plan 9 Perl
+
+For compatibility with perl scripts written for the Unix 
+environment, Plan 9 Perl uses the POSIX signal emulation
+provided in Plan 9's ANSI POSIX Environment (APE). Signal stacking
+isn't supported. The signals provided are:
+
+    SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT,
+    SIGFPE, SIGKILL, SIGSEGV, SIGPIPE, SIGPIPE, SIGALRM, 
+    SIGTERM, SIGUSR1, SIGUSR2, SIGCHLD, SIGCONT,
+    SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU
+
+=head1 COMPILING AND INSTALLING PERL ON PLAN 9
+
+WELCOME to Plan 9 Perl, brave soul!
+
+   This is a preliminary alpha version of Plan 9 Perl. Still to be
+implemented are MakeMaker and DynaLoader. Many perl commands are
+missing or currently behave in an inscrutable manner. These gaps will,
+with perseverance and a modicum of luck, be remedied in the near
+future.To install this software:
+
+1. Create the source directories and libraries for perl by running the
+plan9/setup.rc command (i.e., located in the plan9 subdirectory).
+Note: the setup routine assumes that you haven't dearchived these
+files into /sys/src/cmd/perl. After running setup.rc you may delete
+the copy of the source you originally detarred, as source code has now
+been installed in /sys/src/cmd/perl. If you plan on installing perl
+binaries for all architectures, run "setup.rc -a".
+
+2. After making sure that you have adequate privileges to build system
+software, from /sys/src/cmd/perl/5.00301 (adjust version
+appropriately) run:
+
+	mk install
+
+If you wish to install perl versions for all architectures (68020,
+mips, sparc and 386) run:
+
+	mk installall
+
+3. Wait. The build process will take a *long* time because perl
+bootstraps itself. A 75MHz Pentium, 16MB RAM machine takes roughly 30
+minutes to build the distribution from scratch.
+
+=head2 Installing Perl Documentation on Plan 9
+
+This perl distribution comes with a tremendous amount of
+documentation. To add these to the built-in manuals that come with
+Plan 9, from /sys/src/cmd/perl/5.00301 (adjust version appropriately)
+run:
+
+	mk man
+
+To begin your reading, start with:
+
+	man perl
+
+This is a good introduction and will direct you towards other man
+pages that may interest you.
+
+(Note: "mk man" may produce some extraneous noise. Fear not.)
+
+=head1 BUGS
+
+"As many as there are grains of sand on all the beaches of the 
+world . . ." - Carl Sagan
+
+=head1 Revision date
+
+This document was revised 09-October-1996 for Perl 5.003_7.
+
+=head1 AUTHOR
+
+Direct questions, comments, and the unlikely bug report (ahem) direct
+comments toward:
+
+Luther Huffman, lutherh@stratcom.com, 
+Strategic Computer Solutions, Inc.		
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlpod.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlpod.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlpod.pod	(revision 14489)
@@ -0,0 +1,731 @@
+
+=for comment
+This document is in Pod format.  To read this, use a Pod formatter,
+like "perldoc perlpod".
+
+=head1 NAME
+X<POD> X<plain old documentation>
+
+perlpod - the Plain Old Documentation format
+
+=head1 DESCRIPTION
+
+Pod is a simple-to-use markup language used for writing documentation
+for Perl, Perl programs, and Perl modules.
+
+Translators are available for converting Pod to various formats
+like plain text, HTML, man pages, and more.
+
+Pod markup consists of three basic kinds of paragraphs:
+L<ordinary|/"Ordinary Paragraph">,
+L<verbatim|/"Verbatim Paragraph">, and 
+L<command|/"Command Paragraph">.
+
+
+=head2 Ordinary Paragraph
+X<POD, ordinary paragraph>
+
+Most paragraphs in your documentation will be ordinary blocks
+of text, like this one.  You can simply type in your text without
+any markup whatsoever, and with just a blank line before and
+after.  When it gets formatted, it will undergo minimal formatting, 
+like being rewrapped, probably put into a proportionally spaced
+font, and maybe even justified.
+
+You can use formatting codes in ordinary paragraphs, for B<bold>,
+I<italic>, C<code-style>, L<hyperlinks|perlfaq>, and more.  Such
+codes are explained in the "L<Formatting Codes|/"Formatting Codes">"
+section, below.
+
+
+=head2 Verbatim Paragraph
+X<POD, verbatim paragraph> X<verbatim>
+
+Verbatim paragraphs are usually used for presenting a codeblock or
+other text which does not require any special parsing or formatting,
+and which shouldn't be wrapped.
+
+A verbatim paragraph is distinguished by having its first character
+be a space or a tab.  (And commonly, all its lines begin with spaces
+and/or tabs.)  It should be reproduced exactly, with tabs assumed to
+be on 8-column boundaries.  There are no special formatting codes,
+so you can't italicize or anything like that.  A \ means \, and
+nothing else.
+
+
+=head2 Command Paragraph
+X<POD, command>
+
+A command paragraph is used for special treatment of whole chunks
+of text, usually as headings or parts of lists.
+
+All command paragraphs (which are typically only one line long) start
+with "=", followed by an identifier, followed by arbitrary text that
+the command can use however it pleases.  Currently recognized commands
+are
+
+    =pod
+    =head1 Heading Text
+    =head2 Heading Text
+    =head3 Heading Text
+    =head4 Heading Text
+    =over indentlevel
+    =item stuff
+    =back
+    =begin format
+    =end format
+    =for format text...
+    =encoding type
+    =cut
+
+To explain them each in detail:
+
+=over
+
+=item C<=head1 I<Heading Text>>
+X<=head1> X<=head2> X<=head3> X<=head4>
+X<head1> X<head2> X<head3> X<head4>
+
+=item C<=head2 I<Heading Text>>
+
+=item C<=head3 I<Heading Text>>
+
+=item C<=head4 I<Heading Text>>
+
+Head1 through head4 produce headings, head1 being the highest
+level.  The text in the rest of this paragraph is the content of the
+heading.  For example:
+
+  =head2 Object Attributes
+
+The text "Object Attributes" comprises the heading there.  (Note that
+head3 and head4 are recent additions, not supported in older Pod
+translators.)  The text in these heading commands can use
+formatting codes, as seen here:
+
+  =head2 Possible Values for C<$/>
+
+Such commands are explained in the
+"L<Formatting Codes|/"Formatting Codes">" section, below.
+
+=item C<=over I<indentlevel>>
+X<=over> X<=item> X<=back> X<over> X<item> X<back>
+
+=item C<=item I<stuff...>>
+
+=item C<=back>
+
+Item, over, and back require a little more explanation:  "=over" starts
+a region specifically for the generation of a list using "=item"
+commands, or for indenting (groups of) normal paragraphs.  At the end
+of your list, use "=back" to end it.  The I<indentlevel> option to
+"=over" indicates how far over to indent, generally in ems (where
+one em is the width of an "M" in the document's base font) or roughly
+comparable units; if there is no I<indentlevel> option, it defaults
+to four.  (And some formatters may just ignore whatever I<indentlevel>
+you provide.)  In the I<stuff> in C<=item I<stuff...>>, you may
+use formatting codes, as seen here:
+
+  =item Using C<$|> to Control Buffering
+
+Such commands are explained in the
+"L<Formatting Codes|/"Formatting Codes">" section, below.
+
+Note also that there are some basic rules to using "=over" ...
+"=back" regions:
+
+=over
+
+=item *
+
+Don't use "=item"s outside of an "=over" ... "=back" region.
+
+=item *
+
+The first thing after the "=over" command should be an "=item", unless
+there aren't going to be any items at all in this "=over" ... "=back"
+region.
+
+=item *
+
+Don't put "=headI<n>" commands inside an "=over" ... "=back" region.
+
+=item *
+
+And perhaps most importantly, keep the items consistent: either use
+"=item *" for all of them, to produce bullets; or use "=item 1.",
+"=item 2.", etc., to produce numbered lists; or use "=item foo",
+"=item bar", etc. -- namely, things that look nothing like bullets or
+numbers.
+
+If you start with bullets or numbers, stick with them, as
+formatters use the first "=item" type to decide how to format the
+list.
+
+=back
+
+=item C<=cut>
+X<=cut> X<cut>
+
+To end a Pod block, use a blank line,
+then a line beginning with "=cut", and a blank
+line after it.  This lets Perl (and the Pod formatter) know that
+this is where Perl code is resuming.  (The blank line before the "=cut"
+is not technically necessary, but many older Pod processors require it.)
+
+=item C<=pod>
+X<=pod> X<pod>
+
+The "=pod" command by itself doesn't do much of anything, but it
+signals to Perl (and Pod formatters) that a Pod block starts here.  A
+Pod block starts with I<any> command paragraph, so a "=pod" command is
+usually used just when you want to start a Pod block with an ordinary
+paragraph or a verbatim paragraph.  For example:
+
+  =item stuff()
+
+  This function does stuff.
+
+  =cut
+
+  sub stuff {
+    ...
+  }
+
+  =pod
+
+  Remember to check its return value, as in:
+
+    stuff() || die "Couldn't do stuff!";
+
+  =cut
+
+=item C<=begin I<formatname>>
+X<=begin> X<=end> X<=for> X<begin> X<end> X<for>
+
+=item C<=end I<formatname>>
+
+=item C<=for I<formatname> I<text...>>
+
+For, begin, and end will let you have regions of text/code/data that
+are not generally interpreted as normal Pod text, but are passed
+directly to particular formatters, or are otherwise special.  A
+formatter that can use that format will use the region, otherwise it
+will be completely ignored.
+
+A command "=begin I<formatname>", some paragraphs, and a
+command "=end I<formatname>", mean that the text/data inbetween
+is meant for formatters that understand the special format
+called I<formatname>.  For example,
+
+  =begin html
+
+  <hr> <img src="thang.png">
+  <p> This is a raw HTML paragraph </p>
+
+  =end html
+
+The command "=for I<formatname> I<text...>"
+specifies that the remainder of just this paragraph (starting
+right after I<formatname>) is in that special format.  
+
+  =for html <hr> <img src="thang.png">
+  <p> This is a raw HTML paragraph </p>
+
+This means the same thing as the above "=begin html" ... "=end html"
+region.
+
+That is, with "=for", you can have only one paragraph's worth
+of text (i.e., the text in "=foo targetname text..."), but with
+"=begin targetname" ... "=end targetname", you can have any amount
+of stuff inbetween.  (Note that there still must be a blank line
+after the "=begin" command and a blank line before the "=end"
+command.
+
+Here are some examples of how to use these:
+
+  =begin html
+
+  <br>Figure 1.<br><IMG SRC="figure1.png"><br>
+
+  =end html
+
+  =begin text
+
+    ---------------
+    |  foo        |
+    |        bar  |
+    ---------------
+
+  ^^^^ Figure 1. ^^^^
+
+  =end text
+
+Some format names that formatters currently are known to accept
+include "roff", "man", "latex", "tex", "text", and "html".  (Some
+formatters will treat some of these as synonyms.)
+
+A format name of "comment" is common for just making notes (presumably
+to yourself) that won't appear in any formatted version of the Pod
+document:
+
+  =for comment
+  Make sure that all the available options are documented!
+
+Some I<formatnames> will require a leading colon (as in
+C<"=for :formatname">, or
+C<"=begin :formatname" ... "=end :formatname">),
+to signal that the text is not raw data, but instead I<is> Pod text
+(i.e., possibly containing formatting codes) that's just not for
+normal formatting (e.g., may not be a normal-use paragraph, but might
+be for formatting as a footnote).
+
+=item C<=encoding I<encodingname>>
+X<=encoding> X<encoding>
+
+This command is used for declaring the encoding of a document.  Most
+users won't need this; but if your encoding isn't US-ASCII or Latin-1,
+then put a C<=encoding I<encodingname>> command early in the document so
+that pod formatters will know how to decode the document.  For
+I<encodingname>, use a name recognized by the L<Encode::Supported>
+module.  Examples:
+
+  =encoding utf8
+
+  =encoding koi8-r
+  
+  =encoding ShiftJIS
+  
+  =encoding big5
+
+=back
+
+And don't forget, when using any command, that the command lasts up
+until the end of its I<paragraph>, not its line.  So in the
+examples below, you can see that every command needs the blank
+line after it, to end its paragraph.
+
+Some examples of lists include:
+
+  =over
+
+  =item *
+
+  First item
+
+  =item *
+
+  Second item
+
+  =back
+
+  =over
+
+  =item Foo()
+
+  Description of Foo function
+
+  =item Bar()
+
+  Description of Bar function
+
+  =back
+
+
+=head2 Formatting Codes
+X<POD, formatting code> X<formatting code>
+X<POD, interior sequence> X<interior sequence>
+
+In ordinary paragraphs and in some command paragraphs, various
+formatting codes (a.k.a. "interior sequences") can be used:
+
+=for comment
+ "interior sequences" is such an opaque term.
+ Prefer "formatting codes" instead.
+
+=over
+
+=item C<IE<lt>textE<gt>> -- italic text
+X<I> X<< IZ<><> >> X<POD, formatting code, italic> X<italic>
+
+Used for emphasis ("C<be IE<lt>careful!E<gt>>") and parameters
+("C<redo IE<lt>LABELE<gt>>")
+
+=item C<BE<lt>textE<gt>> -- bold text
+X<B> X<< BZ<><> >> X<POD, formatting code, bold> X<bold>
+
+Used for switches ("C<perl's BE<lt>-nE<gt> switch>"), programs
+("C<some systems provide a BE<lt>chfnE<gt> for that>"),
+emphasis ("C<be BE<lt>careful!E<gt>>"), and so on
+("C<and that feature is known as BE<lt>autovivificationE<gt>>").
+
+=item C<CE<lt>codeE<gt>> -- code text
+X<C> X<< CZ<><> >> X<POD, formatting code, code> X<code>
+
+Renders code in a typewriter font, or gives some other indication that
+this represents program text ("C<CE<lt>gmtime($^T)E<gt>>") or some other
+form of computerese ("C<CE<lt>drwxr-xr-xE<gt>>").
+
+=item C<LE<lt>nameE<gt>> -- a hyperlink
+X<L> X<< LZ<><> >> X<POD, formatting code, hyperlink> X<hyperlink>
+
+There are various syntaxes, listed below.  In the syntaxes given,
+C<text>, C<name>, and C<section> cannot contain the characters
+'/' and '|'; and any '<' or '>' should be matched.
+
+=over
+
+=item *
+
+C<LE<lt>nameE<gt>>
+
+Link to a Perl manual page (e.g., C<LE<lt>Net::PingE<gt>>).  Note
+that C<name> should not contain spaces.  This syntax
+is also occasionally used for references to UNIX man pages, as in
+C<LE<lt>crontab(5)E<gt>>.
+
+=item *
+
+C<LE<lt>name/"sec"E<gt>> or C<LE<lt>name/secE<gt>>
+
+Link to a section in other manual page.  E.g.,
+C<LE<lt>perlsyn/"For Loops"E<gt>>
+
+=item *
+
+C<LE<lt>/"sec"E<gt>> or C<LE<lt>/secE<gt>> or C<LE<lt>"sec"E<gt>>
+
+Link to a section in this manual page.  E.g.,
+C<LE<lt>/"Object Methods"E<gt>>
+
+=back
+
+A section is started by the named heading or item.  For
+example, C<LE<lt>perlvar/$.E<gt>> or C<LE<lt>perlvar/"$."E<gt>> both
+link to the section started by "C<=item $.>" in perlvar.  And
+C<LE<lt>perlsyn/For LoopsE<gt>> or C<LE<lt>perlsyn/"For Loops"E<gt>>
+both link to the section started by "C<=head2 For Loops>"
+in perlsyn.
+
+To control what text is used for display, you
+use "C<LE<lt>text|...E<gt>>", as in:
+
+=over
+
+=item *
+
+C<LE<lt>text|nameE<gt>>
+
+Link this text to that manual page.  E.g.,
+C<LE<lt>Perl Error Messages|perldiagE<gt>>
+
+=item *
+
+C<LE<lt>text|name/"sec"E<gt>> or C<LE<lt>text|name/secE<gt>>
+
+Link this text to that section in that manual page.  E.g.,
+C<LE<lt>SWITCH statements|perlsyn/"Basic BLOCKs and Switch
+Statements"E<gt>>
+
+=item *
+
+C<LE<lt>text|/"sec"E<gt>> or C<LE<lt>text|/secE<gt>>
+or C<LE<lt>text|"sec"E<gt>>
+
+Link this text to that section in this manual page.  E.g.,
+C<LE<lt>the various attributes|/"Member Data"E<gt>>
+
+=back
+
+Or you can link to a web page:
+
+=over
+
+=item *
+
+C<LE<lt>scheme:...E<gt>>
+
+Links to an absolute URL.  For example,
+C<LE<lt>http://www.perl.org/E<gt>>.  But note
+that there is no corresponding C<LE<lt>text|scheme:...E<gt>> syntax, for
+various reasons.
+
+=back
+
+=item C<EE<lt>escapeE<gt>> -- a character escape
+X<E> X<< EZ<><> >> X<POD, formatting code, escape> X<escape>
+
+Very similar to HTML/XML C<&I<foo>;> "entity references":
+
+=over
+
+=item *
+
+C<EE<lt>ltE<gt>> -- a literal E<lt> (less than)
+
+=item *
+
+C<EE<lt>gtE<gt>> -- a literal E<gt> (greater than)
+
+=item *
+
+C<EE<lt>verbarE<gt>> -- a literal | (I<ver>tical I<bar>)
+
+=item *
+
+C<EE<lt>solE<gt>> = a literal / (I<sol>idus)
+
+The above four are optional except in other formatting codes,
+notably C<LE<lt>...E<gt>>, and when preceded by a
+capital letter.
+
+=item *
+
+C<EE<lt>htmlnameE<gt>>
+
+Some non-numeric HTML entity name, such as C<EE<lt>eacuteE<gt>>,
+meaning the same thing as C<&eacute;> in HTML -- i.e., a lowercase
+e with an acute (/-shaped) accent.
+
+=item *
+
+C<EE<lt>numberE<gt>>
+
+The ASCII/Latin-1/Unicode character with that number.  A
+leading "0x" means that I<number> is hex, as in
+C<EE<lt>0x201EE<gt>>.  A leading "0" means that I<number> is octal,
+as in C<EE<lt>075E<gt>>.  Otherwise I<number> is interpreted as being
+in decimal, as in C<EE<lt>181E<gt>>.
+
+Note that older Pod formatters might not recognize octal or
+hex numeric escapes, and that many formatters cannot reliably
+render characters above 255.  (Some formatters may even have
+to use compromised renderings of Latin-1 characters, like
+rendering C<EE<lt>eacuteE<gt>> as just a plain "e".)
+
+=back
+
+=item C<FE<lt>filenameE<gt>> -- used for filenames
+X<F> X<< FZ<><> >> X<POD, formatting code, filename> X<filename>
+
+Typically displayed in italics.  Example: "C<FE<lt>.cshrcE<gt>>"
+
+=item C<SE<lt>textE<gt>> -- text contains non-breaking spaces
+X<S> X<< SZ<><> >> X<POD, formatting code, non-breaking space> 
+X<non-breaking space>
+
+This means that the words in I<text> should not be broken
+across lines.  Example: S<C<SE<lt>$x ? $y : $zE<gt>>>.
+
+=item C<XE<lt>topic nameE<gt>> -- an index entry
+X<X> X<< XZ<><> >> X<POD, formatting code, index entry> X<index entry>
+
+This is ignored by most formatters, but some may use it for building
+indexes.  It always renders as empty-string.
+Example: C<XE<lt>absolutizing relative URLsE<gt>>
+
+=item C<ZE<lt>E<gt>> -- a null (zero-effect) formatting code
+X<Z> X<< ZZ<><> >> X<POD, formatting code, null> X<null>
+
+This is rarely used.  It's one way to get around using an
+EE<lt>...E<gt> code sometimes.  For example, instead of
+"C<NEE<lt>ltE<gt>3>" (for "NE<lt>3") you could write
+"C<NZE<lt>E<gt>E<lt>3>" (the "ZE<lt>E<gt>" breaks up the "N" and
+the "E<lt>" so they can't be considered
+the part of a (fictitious) "NE<lt>...E<gt>" code.
+
+=for comment
+ This was formerly explained as a "zero-width character".  But it in
+ most parser models, it parses to nothing at all, as opposed to parsing
+ as if it were a E<zwnj> or E<zwj>, which are REAL zero-width characters.
+ So "width" and "character" are exactly the wrong words.
+
+=back
+
+Most of the time, you will need only a single set of angle brackets to
+delimit the beginning and end of formatting codes.  However,
+sometimes you will want to put a real right angle bracket (a
+greater-than sign, '>') inside of a formatting code.  This is particularly
+common when using a formatting code to provide a different font-type for a
+snippet of code.  As with all things in Perl, there is more than
+one way to do it.  One way is to simply escape the closing bracket
+using an C<E> code:
+
+    C<$a E<lt>=E<gt> $b>
+
+This will produce: "C<$a E<lt>=E<gt> $b>"
+
+A more readable, and perhaps more "plain" way is to use an alternate
+set of delimiters that doesn't require a single ">" to be escaped.  With
+the Pod formatters that are standard starting with perl5.5.660, doubled
+angle brackets ("<<" and ">>") may be used I<if and only if there is
+whitespace right after the opening delimiter and whitespace right
+before the closing delimiter!>  For example, the following will
+do the trick:
+X<POD, formatting code, escaping with multiple brackets>
+
+    C<< $a <=> $b >>
+
+In fact, you can use as many repeated angle-brackets as you like so
+long as you have the same number of them in the opening and closing
+delimiters, and make sure that whitespace immediately follows the last
+'<' of the opening delimiter, and immediately precedes the first '>'
+of the closing delimiter.  (The whitespace is ignored.)  So the
+following will also work:
+X<POD, formatting code, escaping with multiple brackets>
+
+    C<<< $a <=> $b >>>
+    C<<<<  $a <=> $b     >>>>
+
+And they all mean exactly the same as this:
+
+    C<$a E<lt>=E<gt> $b>
+
+As a further example, this means that if you wanted to put these bits of
+code in C<C> (code) style:
+
+    open(X, ">>thing.dat") || die $!
+    $foo->bar();
+
+you could do it like so:
+
+    C<<< open(X, ">>thing.dat") || die $! >>>
+    C<< $foo->bar(); >>
+
+which is presumably easier to read than the old way:
+
+    C<open(X, "E<gt>E<gt>thing.dat") || die $!>
+    C<$foo-E<gt>bar();>
+
+This is currently supported by pod2text (Pod::Text), pod2man (Pod::Man),
+and any other pod2xxx or Pod::Xxxx translators that use
+Pod::Parser 1.093 or later, or Pod::Tree 1.02 or later.
+
+=head2 The Intent
+X<POD, intent of>
+
+The intent is simplicity of use, not power of expression.  Paragraphs
+look like paragraphs (block format), so that they stand out
+visually, and so that I could run them through C<fmt> easily to reformat
+them (that's F7 in my version of B<vi>, or Esc Q in my version of
+B<emacs>).  I wanted the translator to always leave the C<'> and C<`> and
+C<"> quotes alone, in verbatim mode, so I could slurp in a
+working program, shift it over four spaces, and have it print out, er,
+verbatim.  And presumably in a monospace font.
+
+The Pod format is not necessarily sufficient for writing a book.  Pod
+is just meant to be an idiot-proof common source for nroff, HTML,
+TeX, and other markup languages, as used for online
+documentation.  Translators exist for B<pod2text>, B<pod2html>,
+B<pod2man> (that's for nroff(1) and troff(1)), B<pod2latex>, and
+B<pod2fm>.  Various others are available in CPAN.
+
+
+=head2 Embedding Pods in Perl Modules
+X<POD, embedding>
+
+You can embed Pod documentation in your Perl modules and scripts.
+Start your documentation with an empty line, a "=head1" command at the
+beginning, and end it with a "=cut" command and an empty line.  Perl
+will ignore the Pod text.  See any of the supplied library modules for
+examples.  If you're going to put your Pod at the end of the file, and
+you're using an __END__ or __DATA__ cut mark, make sure to put an
+empty line there before the first Pod command.
+
+  __END__
+
+  =head1 NAME
+
+  Time::Local - efficiently compute time from local and GMT time
+
+Without that empty line before the "=head1", many translators wouldn't
+have recognized the "=head1" as starting a Pod block.
+
+=head2 Hints for Writing Pod
+
+=over
+
+=item *
+X<podchecker> X<POD, validating>
+
+The B<podchecker> command is provided for checking Pod syntax for errors
+and warnings.  For example, it checks for completely blank lines in
+Pod blocks and for unknown commands and formatting codes.  You should
+still also pass your document through one or more translators and proofread
+the result, or print out the result and proofread that.  Some of the
+problems found may be bugs in the translators, which you may or may not
+wish to work around.
+
+=item *
+
+If you're more familiar with writing in HTML than with writing in Pod, you
+can try your hand at writing documentation in simple HTML, and converting
+it to Pod with the experimental L<Pod::HTML2Pod|Pod::HTML2Pod> module,
+(available in CPAN), and looking at the resulting code.  The experimental
+L<Pod::PXML|Pod::PXML> module in CPAN might also be useful.
+
+=item *
+
+Many older Pod translators require the lines before every Pod
+command and after every Pod command (including "=cut"!) to be a blank
+line.  Having something like this:
+
+ # - - - - - - - - - - - -
+ =item $firecracker->boom()
+
+ This noisily detonates the firecracker object.
+ =cut
+ sub boom {
+ ...
+
+...will make such Pod translators completely fail to see the Pod block
+at all.
+
+Instead, have it like this:
+
+ # - - - - - - - - - - - -
+
+ =item $firecracker->boom()
+
+ This noisily detonates the firecracker object.
+
+ =cut
+
+ sub boom {
+ ...
+
+=item *
+
+Some older Pod translators require paragraphs (including command
+paragraphs like "=head2 Functions") to be separated by I<completely>
+empty lines.  If you have an apparently empty line with some spaces
+on it, this might not count as a separator for those translators, and
+that could cause odd formatting.
+
+=item *
+
+Older translators might add wording around an LE<lt>E<gt> link, so that
+C<LE<lt>Foo::BarE<gt>> may become "the Foo::Bar manpage", for example.
+So you shouldn't write things like C<the LE<lt>fooE<gt>
+documentation>, if you want the translated document to read sensibly
+-- instead write C<the LE<lt>Foo::Bar|Foo::BarE<gt> documentation> or
+C<LE<lt>the Foo::Bar documentation|Foo::BarE<gt>>, to control how the
+link comes out.
+
+=item *
+
+Going past the 70th column in a verbatim block might be ungracefully
+wrapped by some formatters.
+
+=back
+
+=head1 SEE ALSO
+
+L<perlpodspec>, L<perlsyn/"PODs: Embedded Documentation">,
+L<perlnewmod>, L<perldoc>, L<pod2html>, L<pod2man>, L<podchecker>.
+
+=head1 AUTHOR
+
+Larry Wall, Sean M. Burke
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlpodspec.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlpodspec.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlpodspec.pod	(revision 14489)
@@ -0,0 +1,1899 @@
+
+=head1 NAME
+
+perlpodspec - Plain Old Documentation: format specification and notes
+
+=head1 DESCRIPTION
+
+This document is detailed notes on the Pod markup language.  Most
+people will only have to read L<perlpod|perlpod> to know how to write
+in Pod, but this document may answer some incidental questions to do
+with parsing and rendering Pod.
+
+In this document, "must" / "must not", "should" /
+"should not", and "may" have their conventional (cf. RFC 2119)
+meanings: "X must do Y" means that if X doesn't do Y, it's against
+this specification, and should really be fixed.  "X should do Y"
+means that it's recommended, but X may fail to do Y, if there's a
+good reason.  "X may do Y" is merely a note that X can do Y at
+will (although it is up to the reader to detect any connotation of
+"and I think it would be I<nice> if X did Y" versus "it wouldn't
+really I<bother> me if X did Y").
+
+Notably, when I say "the parser should do Y", the
+parser may fail to do Y, if the calling application explicitly
+requests that the parser I<not> do Y.  I often phrase this as
+"the parser should, by default, do Y."  This doesn't I<require>
+the parser to provide an option for turning off whatever
+feature Y is (like expanding tabs in verbatim paragraphs), although
+it implicates that such an option I<may> be provided.
+
+=head1 Pod Definitions
+
+Pod is embedded in files, typically Perl source files -- although you
+can write a file that's nothing but Pod.
+
+A B<line> in a file consists of zero or more non-newline characters,
+terminated by either a newline or the end of the file.
+
+A B<newline sequence> is usually a platform-dependent concept, but
+Pod parsers should understand it to mean any of CR (ASCII 13), LF
+(ASCII 10), or a CRLF (ASCII 13 followed immediately by ASCII 10), in
+addition to any other system-specific meaning.  The first CR/CRLF/LF
+sequence in the file may be used as the basis for identifying the
+newline sequence for parsing the rest of the file.
+
+A B<blank line> is a line consisting entirely of zero or more spaces
+(ASCII 32) or tabs (ASCII 9), and terminated by a newline or end-of-file.
+A B<non-blank line> is a line containing one or more characters other
+than space or tab (and terminated by a newline or end-of-file).
+
+(I<Note:> Many older Pod parsers did not accept a line consisting of
+spaces/tabs and then a newline as a blank line -- the only lines they
+considered blank were lines consisting of I<no characters at all>,
+terminated by a newline.)
+
+B<Whitespace> is used in this document as a blanket term for spaces,
+tabs, and newline sequences.  (By itself, this term usually refers
+to literal whitespace.  That is, sequences of whitespace characters
+in Pod source, as opposed to "EE<lt>32>", which is a formatting
+code that I<denotes> a whitespace character.)
+
+A B<Pod parser> is a module meant for parsing Pod (regardless of
+whether this involves calling callbacks or building a parse tree or
+directly formatting it).  A B<Pod formatter> (or B<Pod translator>)
+is a module or program that converts Pod to some other format (HTML,
+plaintext, TeX, PostScript, RTF).  A B<Pod processor> might be a
+formatter or translator, or might be a program that does something
+else with the Pod (like wordcounting it, scanning for index points,
+etc.).
+
+Pod content is contained in B<Pod blocks>.  A Pod block starts with a
+line that matches <m/\A=[a-zA-Z]/>, and continues up to the next line
+that matches C<m/\A=cut/> -- or up to the end of the file, if there is
+no C<m/\A=cut/> line.
+
+=for comment
+ The current perlsyn says:
+ [beginquote]
+   Note that pod translators should look at only paragraphs beginning
+   with a pod directive (it makes parsing easier), whereas the compiler
+   actually knows to look for pod escapes even in the middle of a
+   paragraph.  This means that the following secret stuff will be ignored
+   by both the compiler and the translators.
+      $a=3;
+      =secret stuff
+       warn "Neither POD nor CODE!?"
+      =cut back
+      print "got $a\n";
+   You probably shouldn't rely upon the warn() being podded out forever.
+   Not all pod translators are well-behaved in this regard, and perhaps
+   the compiler will become pickier.
+ [endquote]
+ I think that those paragraphs should just be removed; paragraph-based
+ parsing  seems to have been largely abandoned, because of the hassle
+ with non-empty blank lines messing up what people meant by "paragraph".
+ Even if the "it makes parsing easier" bit were especially true,
+ it wouldn't be worth the confusion of having perl and pod2whatever
+ actually disagree on what can constitute a Pod block.
+
+Within a Pod block, there are B<Pod paragraphs>.  A Pod paragraph
+consists of non-blank lines of text, separated by one or more blank
+lines.
+
+For purposes of Pod processing, there are four types of paragraphs in
+a Pod block:
+
+=over
+
+=item *
+
+A command paragraph (also called a "directive").  The first line of
+this paragraph must match C<m/\A=[a-zA-Z]/>.  Command paragraphs are
+typically one line, as in:
+
+  =head1 NOTES
+
+  =item *
+
+But they may span several (non-blank) lines:
+
+  =for comment
+  Hm, I wonder what it would look like if
+  you tried to write a BNF for Pod from this.
+
+  =head3 Dr. Strangelove, or: How I Learned to
+  Stop Worrying and Love the Bomb
+
+I<Some> command paragraphs allow formatting codes in their content
+(i.e., after the part that matches C<m/\A=[a-zA-Z]\S*\s*/>), as in:
+
+  =head1 Did You Remember to C<use strict;>?
+
+In other words, the Pod processing handler for "head1" will apply the
+same processing to "Did You Remember to CE<lt>use strict;>?" that it
+would to an ordinary paragraph -- i.e., formatting codes (like
+"CE<lt>...>") are parsed and presumably formatted appropriately, and
+whitespace in the form of literal spaces and/or tabs is not
+significant.
+
+=item *
+
+A B<verbatim paragraph>.  The first line of this paragraph must be a
+literal space or tab, and this paragraph must not be inside a "=begin
+I<identifier>", ... "=end I<identifier>" sequence unless
+"I<identifier>" begins with a colon (":").  That is, if a paragraph
+starts with a literal space or tab, but I<is> inside a
+"=begin I<identifier>", ... "=end I<identifier>" region, then it's
+a data paragraph, unless "I<identifier>" begins with a colon.
+
+Whitespace I<is> significant in verbatim paragraphs (although, in
+processing, tabs are probably expanded).
+
+=item *
+
+An B<ordinary paragraph>.  A paragraph is an ordinary paragraph
+if its first line matches neither C<m/\A=[a-zA-Z]/> nor
+C<m/\A[ \t]/>, I<and> if it's not inside a "=begin I<identifier>",
+... "=end I<identifier>" sequence unless "I<identifier>" begins with
+a colon (":").
+
+=item *
+
+A B<data paragraph>.  This is a paragraph that I<is> inside a "=begin
+I<identifier>" ... "=end I<identifier>" sequence where
+"I<identifier>" does I<not> begin with a literal colon (":").  In
+some sense, a data paragraph is not part of Pod at all (i.e.,
+effectively it's "out-of-band"), since it's not subject to most kinds
+of Pod parsing; but it is specified here, since Pod
+parsers need to be able to call an event for it, or store it in some
+form in a parse tree, or at least just parse I<around> it.
+
+=back
+
+For example: consider the following paragraphs:
+
+  # <- that's the 0th column
+
+  =head1 Foo
+
+  Stuff
+
+    $foo->bar
+
+  =cut
+
+Here, "=head1 Foo" and "=cut" are command paragraphs because the first
+line of each matches C<m/\A=[a-zA-Z]/>.  "I<[space][space]>$foo->bar"
+is a verbatim paragraph, because its first line starts with a literal
+whitespace character (and there's no "=begin"..."=end" region around).
+
+The "=begin I<identifier>" ... "=end I<identifier>" commands stop
+paragraphs that they surround from being parsed as data or verbatim
+paragraphs, if I<identifier> doesn't begin with a colon.  This
+is discussed in detail in the section
+L</About Data Paragraphs and "=beginE<sol>=end" Regions>.
+
+=head1 Pod Commands
+
+This section is intended to supplement and clarify the discussion in
+L<perlpod/"Command Paragraph">.  These are the currently recognized
+Pod commands:
+
+=over
+
+=item "=head1", "=head2", "=head3", "=head4"
+
+This command indicates that the text in the remainder of the paragraph
+is a heading.  That text may contain formatting codes.  Examples:
+
+  =head1 Object Attributes
+
+  =head3 What B<Not> to Do!
+
+=item "=pod"
+
+This command indicates that this paragraph begins a Pod block.  (If we
+are already in the middle of a Pod block, this command has no effect at
+all.)  If there is any text in this command paragraph after "=pod",
+it must be ignored.  Examples:
+
+  =pod
+
+  This is a plain Pod paragraph.
+
+  =pod This text is ignored.
+
+=item "=cut"
+
+This command indicates that this line is the end of this previously
+started Pod block.  If there is any text after "=cut" on the line, it must be
+ignored.  Examples:
+
+  =cut
+
+  =cut The documentation ends here.
+
+  =cut
+  # This is the first line of program text.
+  sub foo { # This is the second.
+
+It is an error to try to I<start> a Pod block with a "=cut" command.  In
+that case, the Pod processor must halt parsing of the input file, and
+must by default emit a warning.
+
+=item "=over"
+
+This command indicates that this is the start of a list/indent
+region.  If there is any text following the "=over", it must consist
+of only a nonzero positive numeral.  The semantics of this numeral is
+explained in the L</"About =over...=back Regions"> section, further
+below.  Formatting codes are not expanded.  Examples:
+
+  =over 3
+
+  =over 3.5
+
+  =over
+
+=item "=item"
+
+This command indicates that an item in a list begins here.  Formatting
+codes are processed.  The semantics of the (optional) text in the
+remainder of this paragraph are
+explained in the L</"About =over...=back Regions"> section, further
+below.  Examples:
+
+  =item
+
+  =item *
+
+  =item      *    
+
+  =item 14
+
+  =item   3.
+
+  =item C<< $thing->stuff(I<dodad>) >>
+
+  =item For transporting us beyond seas to be tried for pretended
+  offenses
+
+  =item He is at this time transporting large armies of foreign
+  mercenaries to complete the works of death, desolation and
+  tyranny, already begun with circumstances of cruelty and perfidy
+  scarcely paralleled in the most barbarous ages, and totally
+  unworthy the head of a civilized nation.
+
+=item "=back"
+
+This command indicates that this is the end of the region begun
+by the most recent "=over" command.  It permits no text after the
+"=back" command.
+
+=item "=begin formatname"
+
+This marks the following paragraphs (until the matching "=end
+formatname") as being for some special kind of processing.  Unless
+"formatname" begins with a colon, the contained non-command
+paragraphs are data paragraphs.  But if "formatname" I<does> begin
+with a colon, then non-command paragraphs are ordinary paragraphs
+or data paragraphs.  This is discussed in detail in the section
+L</About Data Paragraphs and "=beginE<sol>=end" Regions>.
+
+It is advised that formatnames match the regexp
+C<m/\A:?[-a-zA-Z0-9_]+\z/>.  Implementors should anticipate future
+expansion in the semantics and syntax of the first parameter
+to "=begin"/"=end"/"=for".
+
+=item "=end formatname"
+
+This marks the end of the region opened by the matching
+"=begin formatname" region.  If "formatname" is not the formatname
+of the most recent open "=begin formatname" region, then this
+is an error, and must generate an error message.  This
+is discussed in detail in the section
+L</About Data Paragraphs and "=beginE<sol>=end" Regions>.
+
+=item "=for formatname text..."
+
+This is synonymous with:
+
+     =begin formatname
+
+     text...
+
+     =end formatname
+
+That is, it creates a region consisting of a single paragraph; that
+paragraph is to be treated as a normal paragraph if "formatname"
+begins with a ":"; if "formatname" I<doesn't> begin with a colon,
+then "text..." will constitute a data paragraph.  There is no way
+to use "=for formatname text..." to express "text..." as a verbatim
+paragraph.
+
+=item "=encoding encodingname"
+
+This command, which should occur early in the document (at least
+before any non-US-ASCII data!), declares that this document is
+encoded in the encoding I<encodingname>, which must be
+an encoding name that L<Encoding> recognizes.  (Encoding's list
+of supported encodings, in L<Encoding::Supported>, is useful here.)
+If the Pod parser cannot decode the declared encoding, it 
+should emit a warning and may abort parsing the document
+altogether.
+
+A document having more than one "=encoding" line should be
+considered an error.  Pod processors may silently tolerate this if
+the not-first "=encoding" lines are just duplicates of the
+first one (e.g., if there's a "=use utf8" line, and later on
+another "=use utf8" line).  But Pod processors should complain if
+there are contradictory "=encoding" lines in the same document
+(e.g., if there is a "=encoding utf8" early in the document and
+"=encoding big5" later).  Pod processors that recognize BOMs
+may also complain if they see an "=encoding" line
+that contradicts the BOM (e.g., if a document with a UTF-16LE
+BOM has an "=encoding shiftjis" line).
+
+=back
+
+If a Pod processor sees any command other than the ones listed
+above (like "=head", or "=haed1", or "=stuff", or "=cuttlefish",
+or "=w123"), that processor must by default treat this as an
+error.  It must not process the paragraph beginning with that
+command, must by default warn of this as an error, and may
+abort the parse.  A Pod parser may allow a way for particular
+applications to add to the above list of known commands, and to
+stipulate, for each additional command, whether formatting
+codes should be processed.
+
+Future versions of this specification may add additional
+commands.
+
+
+
+=head1 Pod Formatting Codes
+
+(Note that in previous drafts of this document and of perlpod,
+formatting codes were referred to as "interior sequences", and
+this term may still be found in the documentation for Pod parsers,
+and in error messages from Pod processors.)
+
+There are two syntaxes for formatting codes:
+
+=over
+
+=item *
+
+A formatting code starts with a capital letter (just US-ASCII [A-Z])
+followed by a "<", any number of characters, and ending with the first
+matching ">".  Examples:
+
+    That's what I<you> think!
+
+    What's C<dump()> for?
+
+    X<C<chmod> and C<unlink()> Under Different Operating Systems>
+
+=item *
+
+A formatting code starts with a capital letter (just US-ASCII [A-Z])
+followed by two or more "<"'s, one or more whitespace characters,
+any number of characters, one or more whitespace characters,
+and ending with the first matching sequence of two or more ">"'s, where
+the number of ">"'s equals the number of "<"'s in the opening of this
+formatting code.  Examples:
+
+    That's what I<< you >> think!
+
+    C<<< open(X, ">>thing.dat") || die $! >>>
+
+    B<< $foo->bar(); >>
+
+With this syntax, the whitespace character(s) after the "CE<lt><<"
+and before the ">>" (or whatever letter) are I<not> renderable -- they
+do not signify whitespace, are merely part of the formatting codes
+themselves.  That is, these are all synonymous:
+
+    C<thing>
+    C<< thing >>
+    C<<           thing     >>
+    C<<<   thing >>>
+    C<<<<
+    thing
+               >>>>
+
+and so on.
+
+=back
+
+In parsing Pod, a notably tricky part is the correct parsing of
+(potentially nested!) formatting codes.  Implementors should
+consult the code in the C<parse_text> routine in Pod::Parser as an
+example of a correct implementation.
+
+=over
+
+=item C<IE<lt>textE<gt>> -- italic text
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<BE<lt>textE<gt>> -- bold text
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<CE<lt>codeE<gt>> -- code text
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<FE<lt>filenameE<gt>> -- style for filenames
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+=item C<XE<lt>topic nameE<gt>> -- an index entry
+
+See the brief discussion in L<perlpod/"Formatting Codes">.
+
+This code is unusual in that most formatters completely discard
+this code and its content.  Other formatters will render it with
+invisible codes that can be used in building an index of
+the current document.
+
+=item C<ZE<lt>E<gt>> -- a null (zero-effect) formatting code
+
+Discussed briefly in L<perlpod/"Formatting Codes">.
+
+This code is unusual is that it should have no content.  That is,
+a processor may complain if it sees C<ZE<lt>potatoesE<gt>>.  Whether
+or not it complains, the I<potatoes> text should ignored.
+
+=item C<LE<lt>nameE<gt>> -- a hyperlink
+
+The complicated syntaxes of this code are discussed at length in
+L<perlpod/"Formatting Codes">, and implementation details are
+discussed below, in L</"About LE<lt>...E<gt> Codes">.  Parsing the
+contents of LE<lt>content> is tricky.  Notably, the content has to be
+checked for whether it looks like a URL, or whether it has to be split
+on literal "|" and/or "/" (in the right order!), and so on,
+I<before> EE<lt>...> codes are resolved.
+
+=item C<EE<lt>escapeE<gt>> -- a character escape
+
+See L<perlpod/"Formatting Codes">, and several points in
+L</Notes on Implementing Pod Processors>.
+
+=item C<SE<lt>textE<gt>> -- text contains non-breaking spaces
+
+This formatting code is syntactically simple, but semantically
+complex.  What it means is that each space in the printable
+content of this code signifies a non-breaking space.
+
+Consider:
+
+    C<$x ? $y    :  $z>
+
+    S<C<$x ? $y     :  $z>>
+
+Both signify the monospace (c[ode] style) text consisting of
+"$x", one space, "?", one space, ":", one space, "$z".  The
+difference is that in the latter, with the S code, those spaces
+are not "normal" spaces, but instead are non-breaking spaces.
+
+=back
+
+
+If a Pod processor sees any formatting code other than the ones
+listed above (as in "NE<lt>...>", or "QE<lt>...>", etc.), that
+processor must by default treat this as an error.
+A Pod parser may allow a way for particular
+applications to add to the above list of known formatting codes;
+a Pod parser might even allow a way to stipulate, for each additional
+command, whether it requires some form of special processing, as
+LE<lt>...> does.
+
+Future versions of this specification may add additional
+formatting codes.
+
+Historical note:  A few older Pod processors would not see a ">" as
+closing a "CE<lt>" code, if the ">" was immediately preceded by
+a "-".  This was so that this:
+
+    C<$foo->bar>
+
+would parse as equivalent to this:
+
+    C<$foo-E<gt>bar>
+
+instead of as equivalent to a "C" formatting code containing 
+only "$foo-", and then a "bar>" outside the "C" formatting code.  This
+problem has since been solved by the addition of syntaxes like this:
+
+    C<< $foo->bar >>
+
+Compliant parsers must not treat "->" as special.
+
+Formatting codes absolutely cannot span paragraphs.  If a code is
+opened in one paragraph, and no closing code is found by the end of
+that paragraph, the Pod parser must close that formatting code,
+and should complain (as in "Unterminated I code in the paragraph
+starting at line 123: 'Time objects are not...'").  So these
+two paragraphs:
+
+  I<I told you not to do this!
+
+  Don't make me say it again!>
+
+...must I<not> be parsed as two paragraphs in italics (with the I
+code starting in one paragraph and starting in another.)  Instead,
+the first paragraph should generate a warning, but that aside, the
+above code must parse as if it were:
+
+  I<I told you not to do this!>
+
+  Don't make me say it again!E<gt>
+
+(In SGMLish jargon, all Pod commands are like block-level
+elements, whereas all Pod formatting codes are like inline-level
+elements.)
+
+
+
+=head1 Notes on Implementing Pod Processors
+
+The following is a long section of miscellaneous requirements
+and suggestions to do with Pod processing.
+
+=over
+
+=item *
+
+Pod formatters should tolerate lines in verbatim blocks that are of
+any length, even if that means having to break them (possibly several
+times, for very long lines) to avoid text running off the side of the
+page.  Pod formatters may warn of such line-breaking.  Such warnings
+are particularly appropriate for lines are over 100 characters long, which
+are usually not intentional.
+
+=item *
+
+Pod parsers must recognize I<all> of the three well-known newline
+formats: CR, LF, and CRLF.  See L<perlport|perlport>.
+
+=item *
+
+Pod parsers should accept input lines that are of any length.
+
+=item *
+
+Since Perl recognizes a Unicode Byte Order Mark at the start of files
+as signaling that the file is Unicode encoded as in UTF-16 (whether
+big-endian or little-endian) or UTF-8, Pod parsers should do the
+same.  Otherwise, the character encoding should be understood as
+being UTF-8 if the first highbit byte sequence in the file seems
+valid as a UTF-8 sequence, or otherwise as Latin-1.
+
+Future versions of this specification may specify
+how Pod can accept other encodings.  Presumably treatment of other
+encodings in Pod parsing would be as in XML parsing: whatever the
+encoding declared by a particular Pod file, content is to be
+stored in memory as Unicode characters.
+
+=item *
+
+The well known Unicode Byte Order Marks are as follows:  if the
+file begins with the two literal byte values 0xFE 0xFF, this is
+the BOM for big-endian UTF-16.  If the file begins with the two
+literal byte value 0xFF 0xFE, this is the BOM for little-endian
+UTF-16.  If the file begins with the three literal byte values
+0xEF 0xBB 0xBF, this is the BOM for UTF-8.
+
+=for comment
+ use bytes; print map sprintf(" 0x%02X", ord $_), split '', "\x{feff}";
+ 0xEF 0xBB 0xBF
+
+=for comment
+ If toke.c is modified to support UTF-32, add mention of those here.
+
+=item *
+
+A naive but sufficient heuristic for testing the first highbit
+byte-sequence in a BOM-less file (whether in code or in Pod!), to see
+whether that sequence is valid as UTF-8 (RFC 2279) is to check whether
+that the first byte in the sequence is in the range 0xC0 - 0xFD
+I<and> whether the next byte is in the range
+0x80 - 0xBF.  If so, the parser may conclude that this file is in
+UTF-8, and all highbit sequences in the file should be assumed to
+be UTF-8.  Otherwise the parser should treat the file as being
+in Latin-1.  In the unlikely circumstance that the first highbit
+sequence in a truly non-UTF-8 file happens to appear to be UTF-8, one
+can cater to our heuristic (as well as any more intelligent heuristic)
+by prefacing that line with a comment line containing a highbit
+sequence that is clearly I<not> valid as UTF-8.  A line consisting
+of simply "#", an e-acute, and any non-highbit byte,
+is sufficient to establish this file's encoding.
+
+=for comment
+ If/WHEN some brave soul makes these heuristics into a generic
+ text-file class (or PerlIO layer?), we can presumably delete
+ mention of these icky details from this file, and can instead
+ tell people to just use appropriate class/layer.
+ Auto-recognition of newline sequences would be another desirable
+ feature of such a class/layer.
+ HINT HINT HINT.
+
+=for comment
+ "The probability that a string of characters
+ in any other encoding appears as valid UTF-8 is low" - RFC2279
+
+=item *
+
+This document's requirements and suggestions about encodings
+do not apply to Pod processors running on non-ASCII platforms,
+notably EBCDIC platforms.
+
+=item *
+
+Pod processors must treat a "=for [label] [content...]" paragraph as
+meaning the same thing as a "=begin [label]" paragraph, content, and
+an "=end [label]" paragraph.  (The parser may conflate these two
+constructs, or may leave them distinct, in the expectation that the
+formatter will nevertheless treat them the same.)
+
+=item *
+
+When rendering Pod to a format that allows comments (i.e., to nearly
+any format other than plaintext), a Pod formatter must insert comment
+text identifying its name and version number, and the name and
+version numbers of any modules it might be using to process the Pod.
+Minimal examples:
+
+  %% POD::Pod2PS v3.14159, using POD::Parser v1.92
+
+  <!-- Pod::HTML v3.14159, using POD::Parser v1.92 -->
+
+  {\doccomm generated by Pod::Tree::RTF 3.14159 using Pod::Tree 1.08}
+
+  .\" Pod::Man version 3.14159, using POD::Parser version 1.92
+
+Formatters may also insert additional comments, including: the
+release date of the Pod formatter program, the contact address for
+the author(s) of the formatter, the current time, the name of input
+file, the formatting options in effect, version of Perl used, etc.
+
+Formatters may also choose to note errors/warnings as comments,
+besides or instead of emitting them otherwise (as in messages to
+STDERR, or C<die>ing).
+
+=item *
+
+Pod parsers I<may> emit warnings or error messages ("Unknown E code
+EE<lt>zslig>!") to STDERR (whether through printing to STDERR, or
+C<warn>ing/C<carp>ing, or C<die>ing/C<croak>ing), but I<must> allow
+suppressing all such STDERR output, and instead allow an option for
+reporting errors/warnings
+in some other way, whether by triggering a callback, or noting errors
+in some attribute of the document object, or some similarly unobtrusive
+mechanism -- or even by appending a "Pod Errors" section to the end of
+the parsed form of the document.
+
+=item *
+
+In cases of exceptionally aberrant documents, Pod parsers may abort the
+parse.  Even then, using C<die>ing/C<croak>ing is to be avoided; where
+possible, the parser library may simply close the input file
+and add text like "*** Formatting Aborted ***" to the end of the
+(partial) in-memory document.
+
+=item *
+
+In paragraphs where formatting codes (like EE<lt>...>, BE<lt>...>)
+are understood (i.e., I<not> verbatim paragraphs, but I<including>
+ordinary paragraphs, and command paragraphs that produce renderable
+text, like "=head1"), literal whitespace should generally be considered
+"insignificant", in that one literal space has the same meaning as any
+(nonzero) number of literal spaces, literal newlines, and literal tabs
+(as long as this produces no blank lines, since those would terminate
+the paragraph).  Pod parsers should compact literal whitespace in each
+processed paragraph, but may provide an option for overriding this
+(since some processing tasks do not require it), or may follow
+additional special rules (for example, specially treating
+period-space-space or period-newline sequences).
+
+=item *
+
+Pod parsers should not, by default, try to coerce apostrophe (') and
+quote (") into smart quotes (little 9's, 66's, 99's, etc), nor try to
+turn backtick (`) into anything else but a single backtick character
+(distinct from an openquote character!), nor "--" into anything but
+two minus signs.  They I<must never> do any of those things to text
+in CE<lt>...> formatting codes, and never I<ever> to text in verbatim
+paragraphs.
+
+=item *
+
+When rendering Pod to a format that has two kinds of hyphens (-), one
+that's a non-breaking hyphen, and another that's a breakable hyphen
+(as in "object-oriented", which can be split across lines as
+"object-", newline, "oriented"), formatters are encouraged to
+generally translate "-" to non-breaking hyphen, but may apply
+heuristics to convert some of these to breaking hyphens.
+
+=item *
+
+Pod formatters should make reasonable efforts to keep words of Perl
+code from being broken across lines.  For example, "Foo::Bar" in some
+formatting systems is seen as eligible for being broken across lines
+as "Foo::" newline "Bar" or even "Foo::-" newline "Bar".  This should
+be avoided where possible, either by disabling all line-breaking in
+mid-word, or by wrapping particular words with internal punctuation
+in "don't break this across lines" codes (which in some formats may
+not be a single code, but might be a matter of inserting non-breaking
+zero-width spaces between every pair of characters in a word.)
+
+=item *
+
+Pod parsers should, by default, expand tabs in verbatim paragraphs as
+they are processed, before passing them to the formatter or other
+processor.  Parsers may also allow an option for overriding this.
+
+=item *
+
+Pod parsers should, by default, remove newlines from the end of
+ordinary and verbatim paragraphs before passing them to the
+formatter.  For example, while the paragraph you're reading now
+could be considered, in Pod source, to end with (and contain)
+the newline(s) that end it, it should be processed as ending with
+(and containing) the period character that ends this sentence.
+
+=item *
+
+Pod parsers, when reporting errors, should make some effort to report
+an approximate line number ("Nested EE<lt>>'s in Paragraph #52, near
+line 633 of Thing/Foo.pm!"), instead of merely noting the paragraph
+number ("Nested EE<lt>>'s in Paragraph #52 of Thing/Foo.pm!").  Where
+this is problematic, the paragraph number should at least be
+accompanied by an excerpt from the paragraph ("Nested EE<lt>>'s in
+Paragraph #52 of Thing/Foo.pm, which begins 'Read/write accessor for
+the CE<lt>interest rate> attribute...'").
+
+=item *
+
+Pod parsers, when processing a series of verbatim paragraphs one
+after another, should consider them to be one large verbatim
+paragraph that happens to contain blank lines.  I.e., these two
+lines, which have a blank line between them:
+
+	use Foo;
+
+	print Foo->VERSION
+
+should be unified into one paragraph ("\tuse Foo;\n\n\tprint
+Foo->VERSION") before being passed to the formatter or other
+processor.  Parsers may also allow an option for overriding this.
+
+While this might be too cumbersome to implement in event-based Pod
+parsers, it is straightforward for parsers that return parse trees.
+
+=item *
+
+Pod formatters, where feasible, are advised to avoid splitting short
+verbatim paragraphs (under twelve lines, say) across pages.
+
+=item *
+
+Pod parsers must treat a line with only spaces and/or tabs on it as a
+"blank line" such as separates paragraphs.  (Some older parsers
+recognized only two adjacent newlines as a "blank line" but would not
+recognize a newline, a space, and a newline, as a blank line.  This
+is noncompliant behavior.)
+
+=item *
+
+Authors of Pod formatters/processors should make every effort to
+avoid writing their own Pod parser.  There are already several in
+CPAN, with a wide range of interface styles -- and one of them,
+Pod::Parser, comes with modern versions of Perl.
+
+=item *
+
+Characters in Pod documents may be conveyed either as literals, or by
+number in EE<lt>n> codes, or by an equivalent mnemonic, as in
+EE<lt>eacute> which is exactly equivalent to EE<lt>233>.
+
+Characters in the range 32-126 refer to those well known US-ASCII
+characters (also defined there by Unicode, with the same meaning),
+which all Pod formatters must render faithfully.  Characters
+in the ranges 0-31 and 127-159 should not be used (neither as
+literals, nor as EE<lt>number> codes), except for the
+literal byte-sequences for newline (13, 13 10, or 10), and tab (9).
+
+Characters in the range 160-255 refer to Latin-1 characters (also
+defined there by Unicode, with the same meaning).  Characters above
+255 should be understood to refer to Unicode characters.
+
+=item *
+
+Be warned
+that some formatters cannot reliably render characters outside 32-126;
+and many are able to handle 32-126 and 160-255, but nothing above
+255.
+
+=item *
+
+Besides the well-known "EE<lt>lt>" and "EE<lt>gt>" codes for
+less-than and greater-than, Pod parsers must understand "EE<lt>sol>"
+for "/" (solidus, slash), and "EE<lt>verbar>" for "|" (vertical bar,
+pipe).  Pod parsers should also understand "EE<lt>lchevron>" and
+"EE<lt>rchevron>" as legacy codes for characters 171 and 187, i.e.,
+"left-pointing double angle quotation mark" = "left pointing
+guillemet" and "right-pointing double angle quotation mark" = "right
+pointing guillemet".  (These look like little "<<" and ">>", and they
+are now preferably expressed with the HTML/XHTML codes "EE<lt>laquo>"
+and "EE<lt>raquo>".)
+
+=item *
+
+Pod parsers should understand all "EE<lt>html>" codes as defined
+in the entity declarations in the most recent XHTML specification at
+C<www.W3.org>.  Pod parsers must understand at least the entities
+that define characters in the range 160-255 (Latin-1).  Pod parsers,
+when faced with some unknown "EE<lt>I<identifier>>" code,
+shouldn't simply replace it with nullstring (by default, at least),
+but may pass it through as a string consisting of the literal characters
+E, less-than, I<identifier>, greater-than.  Or Pod parsers may offer the
+alternative option of processing such unknown
+"EE<lt>I<identifier>>" codes by firing an event especially
+for such codes, or by adding a special node-type to the in-memory
+document tree.  Such "EE<lt>I<identifier>>" may have special meaning
+to some processors, or some processors may choose to add them to
+a special error report.
+
+=item *
+
+Pod parsers must also support the XHTML codes "EE<lt>quot>" for
+character 34 (doublequote, "), "EE<lt>amp>" for character 38
+(ampersand, &), and "EE<lt>apos>" for character 39 (apostrophe, ').
+
+=item *
+
+Note that in all cases of "EE<lt>whatever>", I<whatever> (whether
+an htmlname, or a number in any base) must consist only of
+alphanumeric characters -- that is, I<whatever> must watch
+C<m/\A\w+\z/>.  So "EE<lt> 0 1 2 3 >" is invalid, because
+it contains spaces, which aren't alphanumeric characters.  This
+presumably does not I<need> special treatment by a Pod processor;
+" 0 1 2 3 " doesn't look like a number in any base, so it would
+presumably be looked up in the table of HTML-like names.  Since
+there isn't (and cannot be) an HTML-like entity called " 0 1 2 3 ",
+this will be treated as an error.  However, Pod processors may
+treat "EE<lt> 0 1 2 3 >" or "EE<lt>e-acute>" as I<syntactically>
+invalid, potentially earning a different error message than the
+error message (or warning, or event) generated by a merely unknown
+(but theoretically valid) htmlname, as in "EE<lt>qacute>"
+[sic].  However, Pod parsers are not required to make this
+distinction.
+
+=item *
+
+Note that EE<lt>number> I<must not> be interpreted as simply
+"codepoint I<number> in the current/native character set".  It always
+means only "the character represented by codepoint I<number> in
+Unicode."  (This is identical to the semantics of &#I<number>; in XML.)
+
+This will likely require many formatters to have tables mapping from
+treatable Unicode codepoints (such as the "\xE9" for the e-acute
+character) to the escape sequences or codes necessary for conveying
+such sequences in the target output format.  A converter to *roff
+would, for example know that "\xE9" (whether conveyed literally, or via
+a EE<lt>...> sequence) is to be conveyed as "e\\*'".
+Similarly, a program rendering Pod in a Mac OS application window, would
+presumably need to know that "\xE9" maps to codepoint 142 in MacRoman
+encoding that (at time of writing) is native for Mac OS.  Such
+Unicode2whatever mappings are presumably already widely available for
+common output formats.  (Such mappings may be incomplete!  Implementers
+are not expected to bend over backwards in an attempt to render
+Cherokee syllabics, Etruscan runes, Byzantine musical symbols, or any
+of the other weird things that Unicode can encode.)  And
+if a Pod document uses a character not found in such a mapping, the
+formatter should consider it an unrenderable character.
+
+=item *
+
+If, surprisingly, the implementor of a Pod formatter can't find a
+satisfactory pre-existing table mapping from Unicode characters to
+escapes in the target format (e.g., a decent table of Unicode
+characters to *roff escapes), it will be necessary to build such a
+table.  If you are in this circumstance, you should begin with the
+characters in the range 0x00A0 - 0x00FF, which is mostly the heavily
+used accented characters.  Then proceed (as patience permits and
+fastidiousness compels) through the characters that the (X)HTML
+standards groups judged important enough to merit mnemonics
+for.  These are declared in the (X)HTML specifications at the
+www.W3.org site.  At time of writing (September 2001), the most recent
+entity declaration files are:
+
+  http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
+  http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent
+  http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent
+
+Then you can progress through any remaining notable Unicode characters
+in the range 0x2000-0x204D (consult the character tables at
+www.unicode.org), and whatever else strikes your fancy.  For example,
+in F<xhtml-symbol.ent>, there is the entry:
+
+  <!ENTITY infin    "&#8734;"> <!-- infinity, U+221E ISOtech -->
+
+While the mapping "infin" to the character "\x{221E}" will (hopefully)
+have been already handled by the Pod parser, the presence of the
+character in this file means that it's reasonably important enough to
+include in a formatter's table that maps from notable Unicode characters
+to the codes necessary for rendering them.  So for a Unicode-to-*roff
+mapping, for example, this would merit the entry:
+
+  "\x{221E}" => '\(in',
+
+It is eagerly hoped that in the future, increasing numbers of formats
+(and formatters) will support Unicode characters directly (as (X)HTML
+does with C<&infin;>, C<&#8734;>, or C<&#x221E;>), reducing the need
+for idiosyncratic mappings of Unicode-to-I<my_escapes>.
+
+=item *
+
+It is up to individual Pod formatter to display good judgment when
+confronted with an unrenderable character (which is distinct from an
+unknown EE<lt>thing> sequence that the parser couldn't resolve to
+anything, renderable or not).  It is good practice to map Latin letters
+with diacritics (like "EE<lt>eacute>"/"EE<lt>233>") to the corresponding
+unaccented US-ASCII letters (like a simple character 101, "e"), but
+clearly this is often not feasible, and an unrenderable character may
+be represented as "?", or the like.  In attempting a sane fallback
+(as from EE<lt>233> to "e"), Pod formatters may use the
+%Latin1Code_to_fallback table in L<Pod::Escapes|Pod::Escapes>, or
+L<Text::Unidecode|Text::Unidecode>, if available.
+
+For example, this Pod text:
+
+  magic is enabled if you set C<$Currency> to 'E<euro>'.
+
+may be rendered as:
+"magic is enabled if you set C<$Currency> to 'I<?>'" or as
+"magic is enabled if you set C<$Currency> to 'B<[euro]>'", or as
+"magic is enabled if you set C<$Currency> to '[x20AC]', etc.
+
+A Pod formatter may also note, in a comment or warning, a list of what
+unrenderable characters were encountered.
+
+=item *
+
+EE<lt>...> may freely appear in any formatting code (other than
+in another EE<lt>...> or in an ZE<lt>>).  That is, "XE<lt>The
+EE<lt>euro>1,000,000 Solution>" is valid, as is "LE<lt>The
+EE<lt>euro>1,000,000 Solution|Million::Euros>".
+
+=item *
+
+Some Pod formatters output to formats that implement non-breaking
+spaces as an individual character (which I'll call "NBSP"), and
+others output to formats that implement non-breaking spaces just as
+spaces wrapped in a "don't break this across lines" code.  Note that
+at the level of Pod, both sorts of codes can occur: Pod can contain a
+NBSP character (whether as a literal, or as a "EE<lt>160>" or
+"EE<lt>nbsp>" code); and Pod can contain "SE<lt>foo
+IE<lt>barE<gt> baz>" codes, where "mere spaces" (character 32) in
+such codes are taken to represent non-breaking spaces.  Pod
+parsers should consider supporting the optional parsing of "SE<lt>foo
+IE<lt>barE<gt> baz>" as if it were
+"fooI<NBSP>IE<lt>barE<gt>I<NBSP>baz", and, going the other way, the
+optional parsing of groups of words joined by NBSP's as if each group
+were in a SE<lt>...> code, so that formatters may use the
+representation that maps best to what the output format demands.
+
+=item *
+
+Some processors may find that the C<SE<lt>...E<gt>> code is easiest to
+implement by replacing each space in the parse tree under the content
+of the S, with an NBSP.  But note: the replacement should apply I<not> to
+spaces in I<all> text, but I<only> to spaces in I<printable> text.  (This
+distinction may or may not be evident in the particular tree/event
+model implemented by the Pod parser.)  For example, consider this
+unusual case:
+
+   S<L</Autoloaded Functions>>
+
+This means that the space in the middle of the visible link text must
+not be broken across lines.  In other words, it's the same as this:
+
+   L<"AutoloadedE<160>Functions"/Autoloaded Functions>
+
+However, a misapplied space-to-NBSP replacement could (wrongly)
+produce something equivalent to this:
+
+   L<"AutoloadedE<160>Functions"/AutoloadedE<160>Functions>
+
+...which is almost definitely not going to work as a hyperlink (assuming
+this formatter outputs a format supporting hypertext).
+
+Formatters may choose to just not support the S format code,
+especially in cases where the output format simply has no NBSP
+character/code and no code for "don't break this stuff across lines".
+
+=item *
+
+Besides the NBSP character discussed above, implementors are reminded
+of the existence of the other "special" character in Latin-1, the
+"soft hyphen" character, also known as "discretionary hyphen",
+i.e. C<EE<lt>173E<gt>> = C<EE<lt>0xADE<gt>> =
+C<EE<lt>shyE<gt>>).  This character expresses an optional hyphenation
+point.  That is, it normally renders as nothing, but may render as a
+"-" if a formatter breaks the word at that point.  Pod formatters
+should, as appropriate, do one of the following:  1) render this with
+a code with the same meaning (e.g., "\-" in RTF), 2) pass it through
+in the expectation that the formatter understands this character as
+such, or 3) delete it.
+
+For example:
+
+  sigE<shy>action
+  manuE<shy>script
+  JarkE<shy>ko HieE<shy>taE<shy>nieE<shy>mi
+
+These signal to a formatter that if it is to hyphenate "sigaction"
+or "manuscript", then it should be done as
+"sig-I<[linebreak]>action" or "manu-I<[linebreak]>script"
+(and if it doesn't hyphenate it, then the C<EE<lt>shyE<gt>> doesn't
+show up at all).  And if it is
+to hyphenate "Jarkko" and/or "Hietaniemi", it can do
+so only at the points where there is a C<EE<lt>shyE<gt>> code.
+
+In practice, it is anticipated that this character will not be used
+often, but formatters should either support it, or delete it.
+
+=item *
+
+If you think that you want to add a new command to Pod (like, say, a
+"=biblio" command), consider whether you could get the same
+effect with a for or begin/end sequence: "=for biblio ..." or "=begin
+biblio" ... "=end biblio".  Pod processors that don't understand
+"=for biblio", etc, will simply ignore it, whereas they may complain
+loudly if they see "=biblio".
+
+=item *
+
+Throughout this document, "Pod" has been the preferred spelling for
+the name of the documentation format.  One may also use "POD" or
+"pod".  For the documentation that is (typically) in the Pod
+format, you may use "pod", or "Pod", or "POD".  Understanding these
+distinctions is useful; but obsessing over how to spell them, usually
+is not.
+
+=back
+
+
+
+
+
+=head1 About LE<lt>...E<gt> Codes
+
+As you can tell from a glance at L<perlpod|perlpod>, the LE<lt>...>
+code is the most complex of the Pod formatting codes.  The points below
+will hopefully clarify what it means and how processors should deal
+with it.
+
+=over
+
+=item *
+
+In parsing an LE<lt>...> code, Pod parsers must distinguish at least
+four attributes:
+
+=over
+
+=item First:
+
+The link-text.  If there is none, this must be undef.  (E.g., in
+"LE<lt>Perl Functions|perlfunc>", the link-text is "Perl Functions".
+In "LE<lt>Time::HiRes>" and even "LE<lt>|Time::HiRes>", there is no
+link text.  Note that link text may contain formatting.)
+
+=item Second:
+
+The possibly inferred link-text -- i.e., if there was no real link
+text, then this is the text that we'll infer in its place.  (E.g., for
+"LE<lt>Getopt::Std>", the inferred link text is "Getopt::Std".)
+
+=item Third:
+
+The name or URL, or undef if none.  (E.g., in "LE<lt>Perl
+Functions|perlfunc>", the name -- also sometimes called the page --
+is "perlfunc".  In "LE<lt>/CAVEATS>", the name is undef.)
+
+=item Fourth:
+
+The section (AKA "item" in older perlpods), or undef if none.  E.g.,
+in L<Getopt::Std/DESCRIPTION>, "DESCRIPTION" is the section.  (Note
+that this is not the same as a manpage section like the "5" in "man 5
+crontab".  "Section Foo" in the Pod sense means the part of the text
+that's introduced by the heading or item whose text is "Foo".)
+
+=back
+
+Pod parsers may also note additional attributes including:
+
+=over
+
+=item Fifth:
+
+A flag for whether item 3 (if present) is a URL (like
+"http://lists.perl.org" is), in which case there should be no section
+attribute; a Pod name (like "perldoc" and "Getopt::Std" are); or
+possibly a man page name (like "crontab(5)" is).
+
+=item Sixth:
+
+The raw original LE<lt>...> content, before text is split on
+"|", "/", etc, and before EE<lt>...> codes are expanded.
+
+=back
+
+(The above were numbered only for concise reference below.  It is not
+a requirement that these be passed as an actual list or array.)
+
+For example:
+
+  L<Foo::Bar>
+    =>  undef,                          # link text
+        "Foo::Bar",                     # possibly inferred link text
+        "Foo::Bar",                     # name
+        undef,                          # section
+        'pod',                          # what sort of link
+        "Foo::Bar"                      # original content
+
+  L<Perlport's section on NL's|perlport/Newlines>
+    =>  "Perlport's section on NL's",   # link text
+        "Perlport's section on NL's",   # possibly inferred link text
+        "perlport",                     # name
+        "Newlines",                     # section
+        'pod',                          # what sort of link
+        "Perlport's section on NL's|perlport/Newlines" # orig. content
+
+  L<perlport/Newlines>
+    =>  undef,                          # link text
+        '"Newlines" in perlport',       # possibly inferred link text
+        "perlport",                     # name
+        "Newlines",                     # section
+        'pod',                          # what sort of link
+        "perlport/Newlines"             # original content
+
+  L<crontab(5)/"DESCRIPTION">
+    =>  undef,                          # link text
+        '"DESCRIPTION" in crontab(5)',  # possibly inferred link text
+        "crontab(5)",                   # name
+        "DESCRIPTION",                  # section
+        'man',                          # what sort of link
+        'crontab(5)/"DESCRIPTION"'      # original content
+
+  L</Object Attributes>
+    =>  undef,                          # link text
+        '"Object Attributes"',          # possibly inferred link text
+        undef,                          # name
+        "Object Attributes",            # section
+        'pod',                          # what sort of link
+        "/Object Attributes"            # original content
+
+  L<http://www.perl.org/>
+    =>  undef,                          # link text
+        "http://www.perl.org/",         # possibly inferred link text
+        "http://www.perl.org/",         # name
+        undef,                          # section
+        'url',                          # what sort of link
+        "http://www.perl.org/"          # original content
+
+Note that you can distinguish URL-links from anything else by the
+fact that they match C<m/\A\w+:[^:\s]\S*\z/>.  So
+C<LE<lt>http://www.perl.comE<gt>> is a URL, but
+C<LE<lt>HTTP::ResponseE<gt>> isn't.
+
+=item *
+
+In case of LE<lt>...> codes with no "text|" part in them,
+older formatters have exhibited great variation in actually displaying
+the link or cross reference.  For example, LE<lt>crontab(5)> would render
+as "the C<crontab(5)> manpage", or "in the C<crontab(5)> manpage"
+or just "C<crontab(5)>".
+
+Pod processors must now treat "text|"-less links as follows:
+
+  L<name>         =>  L<name|name>
+  L</section>     =>  L<"section"|/section>
+  L<name/section> =>  L<"section" in name|name/section>
+
+=item *
+
+Note that section names might contain markup.  I.e., if a section
+starts with:
+
+  =head2 About the C<-M> Operator
+
+or with:
+
+  =item About the C<-M> Operator
+
+then a link to it would look like this:
+
+  L<somedoc/About the C<-M> Operator>
+
+Formatters may choose to ignore the markup for purposes of resolving
+the link and use only the renderable characters in the section name,
+as in:
+
+  <h1><a name="About_the_-M_Operator">About the <code>-M</code>
+  Operator</h1>
+
+  ...
+
+  <a href="somedoc#About_the_-M_Operator">About the <code>-M</code>
+  Operator" in somedoc</a>
+
+=item *
+
+Previous versions of perlpod distinguished C<LE<lt>name/"section"E<gt>>
+links from C<LE<lt>name/itemE<gt>> links (and their targets).  These
+have been merged syntactically and semantically in the current
+specification, and I<section> can refer either to a "=headI<n> Heading
+Content" command or to a "=item Item Content" command.  This
+specification does not specify what behavior should be in the case
+of a given document having several things all seeming to produce the
+same I<section> identifier (e.g., in HTML, several things all producing
+the same I<anchorname> in <a name="I<anchorname>">...</a>
+elements).  Where Pod processors can control this behavior, they should
+use the first such anchor.  That is, C<LE<lt>Foo/BarE<gt>> refers to the
+I<first> "Bar" section in Foo.
+
+But for some processors/formats this cannot be easily controlled; as
+with the HTML example, the behavior of multiple ambiguous
+<a name="I<anchorname>">...</a> is most easily just left up to
+browsers to decide.
+
+=item *
+
+Authors wanting to link to a particular (absolute) URL, must do so
+only with "LE<lt>scheme:...>" codes (like
+LE<lt>http://www.perl.org>), and must not attempt "LE<lt>Some Site
+Name|scheme:...>" codes.  This restriction avoids many problems
+in parsing and rendering LE<lt>...> codes.
+
+=item *
+
+In a C<LE<lt>text|...E<gt>> code, text may contain formatting codes
+for formatting or for EE<lt>...> escapes, as in:
+
+  L<B<ummE<234>stuff>|...>
+
+For C<LE<lt>...E<gt>> codes without a "name|" part, only
+C<EE<lt>...E<gt>> and C<ZE<lt>E<gt>> codes may occur -- no
+other formatting codes.  That is, authors should not use
+"C<LE<lt>BE<lt>Foo::BarE<gt>E<gt>>".
+
+Note, however, that formatting codes and ZE<lt>>'s can occur in any
+and all parts of an LE<lt>...> (i.e., in I<name>, I<section>, I<text>,
+and I<url>).
+
+Authors must not nest LE<lt>...> codes.  For example, "LE<lt>The
+LE<lt>Foo::Bar> man page>" should be treated as an error.
+
+=item *
+
+Note that Pod authors may use formatting codes inside the "text"
+part of "LE<lt>text|name>" (and so on for LE<lt>text|/"sec">).
+
+In other words, this is valid:
+
+  Go read L<the docs on C<$.>|perlvar/"$.">
+
+Some output formats that do allow rendering "LE<lt>...>" codes as
+hypertext, might not allow the link-text to be formatted; in
+that case, formatters will have to just ignore that formatting.
+
+=item *
+
+At time of writing, C<LE<lt>nameE<gt>> values are of two types:
+either the name of a Pod page like C<LE<lt>Foo::BarE<gt>> (which
+might be a real Perl module or program in an @INC / PATH
+directory, or a .pod file in those places); or the name of a UNIX
+man page, like C<LE<lt>crontab(5)E<gt>>.  In theory, C<LE<lt>chmodE<gt>>
+in ambiguous between a Pod page called "chmod", or the Unix man page
+"chmod" (in whatever man-section).  However, the presence of a string
+in parens, as in "crontab(5)", is sufficient to signal that what
+is being discussed is not a Pod page, and so is presumably a
+UNIX man page.  The distinction is of no importance to many
+Pod processors, but some processors that render to hypertext formats
+may need to distinguish them in order to know how to render a
+given C<LE<lt>fooE<gt>> code.
+
+=item *
+
+Previous versions of perlpod allowed for a C<LE<lt>sectionE<gt>> syntax
+(as in "C<LE<lt>Object AttributesE<gt>>"), which was not easily distinguishable
+from C<LE<lt>nameE<gt>> syntax.  This syntax is no longer in the
+specification, and has been replaced by the C<LE<lt>"section"E<gt>> syntax
+(where the quotes were formerly optional).  Pod parsers should tolerate
+the C<LE<lt>sectionE<gt>> syntax, for a while at least.  The suggested
+heuristic for distinguishing C<LE<lt>sectionE<gt>> from C<LE<lt>nameE<gt>>
+is that if it contains any whitespace, it's a I<section>.  Pod processors
+may warn about this being deprecated syntax.
+
+=back
+
+=head1 About =over...=back Regions
+
+"=over"..."=back" regions are used for various kinds of list-like
+structures.  (I use the term "region" here simply as a collective
+term for everything from the "=over" to the matching "=back".)
+
+=over
+
+=item *
+
+The non-zero numeric I<indentlevel> in "=over I<indentlevel>" ...
+"=back" is used for giving the formatter a clue as to how many
+"spaces" (ems, or roughly equivalent units) it should tab over,
+although many formatters will have to convert this to an absolute
+measurement that may not exactly match with the size of spaces (or M's)
+in the document's base font.  Other formatters may have to completely
+ignore the number.  The lack of any explicit I<indentlevel> parameter is
+equivalent to an I<indentlevel> value of 4.  Pod processors may
+complain if I<indentlevel> is present but is not a positive number
+matching C<m/\A(\d*\.)?\d+\z/>.
+
+=item *
+
+Authors of Pod formatters are reminded that "=over" ... "=back" may
+map to several different constructs in your output format.  For
+example, in converting Pod to (X)HTML, it can map to any of
+<ul>...</ul>, <ol>...</ol>, <dl>...</dl>, or
+<blockquote>...</blockquote>.  Similarly, "=item" can map to <li> or
+<dt>.
+
+=item *
+
+Each "=over" ... "=back" region should be one of the following:
+
+=over
+
+=item *
+
+An "=over" ... "=back" region containing only "=item *" commands,
+each followed by some number of ordinary/verbatim paragraphs, other
+nested "=over" ... "=back" regions, "=for..." paragraphs, and
+"=begin"..."=end" regions.
+
+(Pod processors must tolerate a bare "=item" as if it were "=item
+*".)  Whether "*" is rendered as a literal asterisk, an "o", or as
+some kind of real bullet character, is left up to the Pod formatter,
+and may depend on the level of nesting.
+
+=item *
+
+An "=over" ... "=back" region containing only
+C<m/\A=item\s+\d+\.?\s*\z/> paragraphs, each one (or each group of them)
+followed by some number of ordinary/verbatim paragraphs, other nested
+"=over" ... "=back" regions, "=for..." paragraphs, and/or
+"=begin"..."=end" codes.  Note that the numbers must start at 1
+in each section, and must proceed in order and without skipping
+numbers.
+
+(Pod processors must tolerate lines like "=item 1" as if they were
+"=item 1.", with the period.)
+
+=item *
+
+An "=over" ... "=back" region containing only "=item [text]"
+commands, each one (or each group of them) followed by some number of
+ordinary/verbatim paragraphs, other nested "=over" ... "=back"
+regions, or "=for..." paragraphs, and "=begin"..."=end" regions.
+
+The "=item [text]" paragraph should not match
+C<m/\A=item\s+\d+\.?\s*\z/> or C<m/\A=item\s+\*\s*\z/>, nor should it
+match just C<m/\A=item\s*\z/>.
+
+=item *
+
+An "=over" ... "=back" region containing no "=item" paragraphs at
+all, and containing only some number of 
+ordinary/verbatim paragraphs, and possibly also some nested "=over"
+... "=back" regions, "=for..." paragraphs, and "=begin"..."=end"
+regions.  Such an itemless "=over" ... "=back" region in Pod is
+equivalent in meaning to a "<blockquote>...</blockquote>" element in
+HTML.
+
+=back
+
+Note that with all the above cases, you can determine which type of
+"=over" ... "=back" you have, by examining the first (non-"=cut", 
+non-"=pod") Pod paragraph after the "=over" command.
+
+=item *
+
+Pod formatters I<must> tolerate arbitrarily large amounts of text
+in the "=item I<text...>" paragraph.  In practice, most such
+paragraphs are short, as in:
+
+  =item For cutting off our trade with all parts of the world
+
+But they may be arbitrarily long:
+
+  =item For transporting us beyond seas to be tried for pretended
+  offenses
+
+  =item He is at this time transporting large armies of foreign
+  mercenaries to complete the works of death, desolation and
+  tyranny, already begun with circumstances of cruelty and perfidy
+  scarcely paralleled in the most barbarous ages, and totally
+  unworthy the head of a civilized nation.
+
+=item *
+
+Pod processors should tolerate "=item *" / "=item I<number>" commands
+with no accompanying paragraph.  The middle item is an example:
+
+  =over
+
+  =item 1
+
+  Pick up dry cleaning.
+
+  =item 2
+
+  =item 3
+
+  Stop by the store.  Get Abba Zabas, Stoli, and cheap lawn chairs.
+
+  =back
+
+=item *
+
+No "=over" ... "=back" region can contain headings.  Processors may
+treat such a heading as an error.
+
+=item *
+
+Note that an "=over" ... "=back" region should have some
+content.  That is, authors should not have an empty region like this:
+
+  =over
+
+  =back
+
+Pod processors seeing such a contentless "=over" ... "=back" region,
+may ignore it, or may report it as an error.
+
+=item *
+
+Processors must tolerate an "=over" list that goes off the end of the
+document (i.e., which has no matching "=back"), but they may warn
+about such a list.
+
+=item *
+
+Authors of Pod formatters should note that this construct:
+
+  =item Neque
+
+  =item Porro
+
+  =item Quisquam Est
+
+  Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci 
+  velit, sed quia non numquam eius modi tempora incidunt ut
+  labore et dolore magnam aliquam quaerat voluptatem.
+
+  =item Ut Enim
+
+is semantically ambiguous, in a way that makes formatting decisions
+a bit difficult.  On the one hand, it could be mention of an item
+"Neque", mention of another item "Porro", and mention of another
+item "Quisquam Est", with just the last one requiring the explanatory
+paragraph "Qui dolorem ipsum quia dolor..."; and then an item
+"Ut Enim".  In that case, you'd want to format it like so:
+
+  Neque
+
+  Porro
+
+  Quisquam Est
+    Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+    velit, sed quia non numquam eius modi tempora incidunt ut
+    labore et dolore magnam aliquam quaerat voluptatem.
+
+  Ut Enim
+
+But it could equally well be a discussion of three (related or equivalent)
+items, "Neque", "Porro", and "Quisquam Est", followed by a paragraph
+explaining them all, and then a new item "Ut Enim".  In that case, you'd
+probably want to format it like so:
+
+  Neque
+  Porro
+  Quisquam Est
+    Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+    velit, sed quia non numquam eius modi tempora incidunt ut
+    labore et dolore magnam aliquam quaerat voluptatem.
+
+  Ut Enim
+
+But (for the forseeable future), Pod does not provide any way for Pod
+authors to distinguish which grouping is meant by the above
+"=item"-cluster structure.  So formatters should format it like so:
+
+  Neque
+
+  Porro
+
+  Quisquam Est
+
+    Qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+    velit, sed quia non numquam eius modi tempora incidunt ut
+    labore et dolore magnam aliquam quaerat voluptatem.
+
+  Ut Enim
+
+That is, there should be (at least roughly) equal spacing between
+items as between paragraphs (although that spacing may well be less
+than the full height of a line of text).  This leaves it to the reader
+to use (con)textual cues to figure out whether the "Qui dolorem
+ipsum..." paragraph applies to the "Quisquam Est" item or to all three
+items "Neque", "Porro", and "Quisquam Est".  While not an ideal
+situation, this is preferable to providing formatting cues that may
+be actually contrary to the author's intent.
+
+=back
+
+
+
+=head1 About Data Paragraphs and "=begin/=end" Regions
+
+Data paragraphs are typically used for inlining non-Pod data that is
+to be used (typically passed through) when rendering the document to
+a specific format:
+
+  =begin rtf
+
+  \par{\pard\qr\sa4500{\i Printed\~\chdate\~\chtime}\par}
+
+  =end rtf
+
+The exact same effect could, incidentally, be achieved with a single
+"=for" paragraph:
+
+  =for rtf \par{\pard\qr\sa4500{\i Printed\~\chdate\~\chtime}\par}
+
+(Although that is not formally a data paragraph, it has the same
+meaning as one, and Pod parsers may parse it as one.)
+
+Another example of a data paragraph:
+
+  =begin html
+
+  I like <em>PIE</em>!
+
+  <hr>Especially pecan pie!
+
+  =end html
+
+If these were ordinary paragraphs, the Pod parser would try to
+expand the "EE<lt>/em>" (in the first paragraph) as a formatting
+code, just like "EE<lt>lt>" or "EE<lt>eacute>".  But since this
+is in a "=begin I<identifier>"..."=end I<identifier>" region I<and>
+the identifier "html" doesn't begin have a ":" prefix, the contents
+of this region are stored as data paragraphs, instead of being
+processed as ordinary paragraphs (or if they began with a spaces
+and/or tabs, as verbatim paragraphs).
+
+As a further example: At time of writing, no "biblio" identifier is
+supported, but suppose some processor were written to recognize it as
+a way of (say) denoting a bibliographic reference (necessarily
+containing formatting codes in ordinary paragraphs).  The fact that
+"biblio" paragraphs were meant for ordinary processing would be
+indicated by prefacing each "biblio" identifier with a colon:
+
+  =begin :biblio
+
+  Wirth, Niklaus.  1976.  I<Algorithms + Data Structures =
+  Programs.>  Prentice-Hall, Englewood Cliffs, NJ.
+
+  =end :biblio
+
+This would signal to the parser that paragraphs in this begin...end
+region are subject to normal handling as ordinary/verbatim paragraphs
+(while still tagged as meant only for processors that understand the
+"biblio" identifier).  The same effect could be had with:
+
+  =for :biblio
+  Wirth, Niklaus.  1976.  I<Algorithms + Data Structures =
+  Programs.>  Prentice-Hall, Englewood Cliffs, NJ.
+
+The ":" on these identifiers means simply "process this stuff
+normally, even though the result will be for some special target".
+I suggest that parser APIs report "biblio" as the target identifier,
+but also report that it had a ":" prefix.  (And similarly, with the
+above "html", report "html" as the target identifier, and note the
+I<lack> of a ":" prefix.)
+
+Note that a "=begin I<identifier>"..."=end I<identifier>" region where
+I<identifier> begins with a colon, I<can> contain commands.  For example:
+
+  =begin :biblio
+
+  Wirth's classic is available in several editions, including:
+
+  =for comment
+   hm, check abebooks.com for how much used copies cost.
+
+  =over
+
+  =item
+
+  Wirth, Niklaus.  1975.  I<Algorithmen und Datenstrukturen.>
+  Teubner, Stuttgart.  [Yes, it's in German.]
+
+  =item
+
+  Wirth, Niklaus.  1976.  I<Algorithms + Data Structures =
+  Programs.>  Prentice-Hall, Englewood Cliffs, NJ.
+
+  =back
+
+  =end :biblio
+
+Note, however, a "=begin I<identifier>"..."=end I<identifier>"
+region where I<identifier> does I<not> begin with a colon, should not
+directly contain "=head1" ... "=head4" commands, nor "=over", nor "=back",
+nor "=item".  For example, this may be considered invalid:
+
+  =begin somedata
+
+  This is a data paragraph.
+
+  =head1 Don't do this!
+
+  This is a data paragraph too.
+
+  =end somedata
+
+A Pod processor may signal that the above (specifically the "=head1"
+paragraph) is an error.  Note, however, that the following should
+I<not> be treated as an error:
+
+  =begin somedata
+
+  This is a data paragraph.
+
+  =cut
+
+  # Yup, this isn't Pod anymore.
+  sub excl { (rand() > .5) ? "hoo!" : "hah!" }
+
+  =pod
+
+  This is a data paragraph too.
+
+  =end somedata
+
+And this too is valid:
+
+  =begin someformat
+
+  This is a data paragraph.
+
+    And this is a data paragraph.
+
+  =begin someotherformat
+
+  This is a data paragraph too.
+
+    And this is a data paragraph too.
+
+  =begin :yetanotherformat
+
+  =head2 This is a command paragraph!
+
+  This is an ordinary paragraph!
+
+    And this is a verbatim paragraph!
+
+  =end :yetanotherformat
+
+  =end someotherformat
+
+  Another data paragraph!
+
+  =end someformat
+
+The contents of the above "=begin :yetanotherformat" ...
+"=end :yetanotherformat" region I<aren't> data paragraphs, because
+the immediately containing region's identifier (":yetanotherformat")
+begins with a colon.  In practice, most regions that contain
+data paragraphs will contain I<only> data paragraphs; however, 
+the above nesting is syntactically valid as Pod, even if it is
+rare.  However, the handlers for some formats, like "html",
+will accept only data paragraphs, not nested regions; and they may
+complain if they see (targeted for them) nested regions, or commands,
+other than "=end", "=pod", and "=cut".
+
+Also consider this valid structure:
+
+  =begin :biblio
+
+  Wirth's classic is available in several editions, including:
+
+  =over
+
+  =item
+
+  Wirth, Niklaus.  1975.  I<Algorithmen und Datenstrukturen.>
+  Teubner, Stuttgart.  [Yes, it's in German.]
+
+  =item
+
+  Wirth, Niklaus.  1976.  I<Algorithms + Data Structures =
+  Programs.>  Prentice-Hall, Englewood Cliffs, NJ.
+
+  =back
+
+  Buy buy buy!
+
+  =begin html
+
+  <img src='wirth_spokesmodeling_book.png'>
+
+  <hr>
+
+  =end html
+
+  Now now now!
+
+  =end :biblio
+
+There, the "=begin html"..."=end html" region is nested inside
+the larger "=begin :biblio"..."=end :biblio" region.  Note that the
+content of the "=begin html"..."=end html" region is data
+paragraph(s), because the immediately containing region's identifier
+("html") I<doesn't> begin with a colon.
+
+Pod parsers, when processing a series of data paragraphs one
+after another (within a single region), should consider them to
+be one large data paragraph that happens to contain blank lines.  So
+the content of the above "=begin html"..."=end html" I<may> be stored
+as two data paragraphs (one consisting of
+"<img src='wirth_spokesmodeling_book.png'>\n"
+and another consisting of "<hr>\n"), but I<should> be stored as
+a single data paragraph (consisting of 
+"<img src='wirth_spokesmodeling_book.png'>\n\n<hr>\n").
+
+Pod processors should tolerate empty
+"=begin I<something>"..."=end I<something>" regions,
+empty "=begin :I<something>"..."=end :I<something>" regions, and
+contentless "=for I<something>" and "=for :I<something>"
+paragraphs.  I.e., these should be tolerated:
+
+  =for html
+
+  =begin html
+
+  =end html
+
+  =begin :biblio
+
+  =end :biblio
+
+Incidentally, note that there's no easy way to express a data
+paragraph starting with something that looks like a command.  Consider:
+
+  =begin stuff
+
+  =shazbot
+
+  =end stuff
+
+There, "=shazbot" will be parsed as a Pod command "shazbot", not as a data
+paragraph "=shazbot\n".  However, you can express a data paragraph consisting
+of "=shazbot\n" using this code:
+
+  =for stuff =shazbot
+
+The situation where this is necessary, is presumably quite rare.
+
+Note that =end commands must match the currently open =begin command.  That
+is, they must properly nest.  For example, this is valid:
+
+  =begin outer
+
+  X
+
+  =begin inner
+
+  Y
+
+  =end inner
+
+  Z
+
+  =end outer
+
+while this is invalid:
+
+  =begin outer
+
+  X
+
+  =begin inner
+
+  Y
+
+  =end outer
+
+  Z
+
+  =end inner
+
+This latter is improper because when the "=end outer" command is seen, the
+currently open region has the formatname "inner", not "outer".  (It just
+happens that "outer" is the format name of a higher-up region.)  This is
+an error.  Processors must by default report this as an error, and may halt
+processing the document containing that error.  A corollary of this is that
+regions cannot "overlap" -- i.e., the latter block above does not represent
+a region called "outer" which contains X and Y, overlapping a region called
+"inner" which contains Y and Z.  But because it is invalid (as all
+apparently overlapping regions would be), it doesn't represent that, or
+anything at all.
+
+Similarly, this is invalid:
+
+  =begin thing
+
+  =end hting
+
+This is an error because the region is opened by "thing", and the "=end"
+tries to close "hting" [sic].
+
+This is also invalid:
+
+  =begin thing
+
+  =end
+
+This is invalid because every "=end" command must have a formatname
+parameter.
+
+=head1 SEE ALSO
+
+L<perlpod>, L<perlsyn/"PODs: Embedded Documentation">,
+L<podchecker>
+
+=head1 AUTHOR
+
+Sean M. Burke
+
+=cut
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlport.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlport.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlport.pod	(revision 14489)
@@ -0,0 +1,2260 @@
+=head1 NAME
+
+perlport - Writing portable Perl
+
+=head1 DESCRIPTION
+
+Perl runs on numerous operating systems.  While most of them share
+much in common, they also have their own unique features.
+
+This document is meant to help you to find out what constitutes portable
+Perl code.  That way once you make a decision to write portably,
+you know where the lines are drawn, and you can stay within them.
+
+There is a tradeoff between taking full advantage of one particular
+type of computer and taking advantage of a full range of them.
+Naturally, as you broaden your range and become more diverse, the
+common factors drop, and you are left with an increasingly smaller
+area of common ground in which you can operate to accomplish a
+particular task.  Thus, when you begin attacking a problem, it is
+important to consider under which part of the tradeoff curve you
+want to operate.  Specifically, you must decide whether it is
+important that the task that you are coding have the full generality
+of being portable, or whether to just get the job done right now.
+This is the hardest choice to be made.  The rest is easy, because
+Perl provides many choices, whichever way you want to approach your
+problem.
+
+Looking at it another way, writing portable code is usually about
+willfully limiting your available choices.  Naturally, it takes
+discipline and sacrifice to do that.  The product of portability
+and convenience may be a constant.  You have been warned.
+
+Be aware of two important points:
+
+=over 4
+
+=item Not all Perl programs have to be portable
+
+There is no reason you should not use Perl as a language to glue Unix
+tools together, or to prototype a Macintosh application, or to manage the
+Windows registry.  If it makes no sense to aim for portability for one
+reason or another in a given program, then don't bother.
+
+=item Nearly all of Perl already I<is> portable
+
+Don't be fooled into thinking that it is hard to create portable Perl
+code.  It isn't.  Perl tries its level-best to bridge the gaps between
+what's available on different platforms, and all the means available to
+use those features.  Thus almost all Perl code runs on any machine
+without modification.  But there are some significant issues in
+writing portable code, and this document is entirely about those issues.
+
+=back
+
+Here's the general rule: When you approach a task commonly done
+using a whole range of platforms, think about writing portable
+code.  That way, you don't sacrifice much by way of the implementation
+choices you can avail yourself of, and at the same time you can give
+your users lots of platform choices.  On the other hand, when you have to
+take advantage of some unique feature of a particular platform, as is
+often the case with systems programming (whether for Unix, Windows,
+S<Mac OS>, VMS, etc.), consider writing platform-specific code.
+
+When the code will run on only two or three operating systems, you
+may need to consider only the differences of those particular systems.
+The important thing is to decide where the code will run and to be
+deliberate in your decision.
+
+The material below is separated into three main sections: main issues of
+portability (L<"ISSUES">), platform-specific issues (L<"PLATFORMS">), and
+built-in perl functions that behave differently on various ports
+(L<"FUNCTION IMPLEMENTATIONS">).
+
+This information should not be considered complete; it includes possibly
+transient information about idiosyncrasies of some of the ports, almost
+all of which are in a state of constant evolution.  Thus, this material
+should be considered a perpetual work in progress
+(C<< <IMG SRC="yellow_sign.gif" ALT="Under Construction"> >>).
+
+=head1 ISSUES
+
+=head2 Newlines
+
+In most operating systems, lines in files are terminated by newlines.
+Just what is used as a newline may vary from OS to OS.  Unix
+traditionally uses C<\012>, one type of DOSish I/O uses C<\015\012>,
+and S<Mac OS> uses C<\015>.
+
+Perl uses C<\n> to represent the "logical" newline, where what is
+logical may depend on the platform in use.  In MacPerl, C<\n> always
+means C<\015>.  In DOSish perls, C<\n> usually means C<\012>, but
+when accessing a file in "text" mode, STDIO translates it to (or
+from) C<\015\012>, depending on whether you're reading or writing.
+Unix does the same thing on ttys in canonical mode.  C<\015\012>
+is commonly referred to as CRLF.
+
+A common cause of unportable programs is the misuse of chop() to trim
+newlines:
+
+    # XXX UNPORTABLE!
+    while(<FILE>) {
+        chop;
+        @array = split(/:/);
+        #...
+    }
+
+You can get away with this on Unix and Mac OS (they have a single
+character end-of-line), but the same program will break under DOSish
+perls because you're only chop()ing half the end-of-line.  Instead,
+chomp() should be used to trim newlines.  The L<Dunce::Files> module 
+can help audit your code for misuses of chop().
+
+When dealing with binary files (or text files in binary mode) be sure
+to explicitly set $/ to the appropriate value for your file format
+before using chomp().
+
+Because of the "text" mode translation, DOSish perls have limitations
+in using C<seek> and C<tell> on a file accessed in "text" mode.
+Stick to C<seek>-ing to locations you got from C<tell> (and no
+others), and you are usually free to use C<seek> and C<tell> even
+in "text" mode.  Using C<seek> or C<tell> or other file operations
+may be non-portable.  If you use C<binmode> on a file, however, you
+can usually C<seek> and C<tell> with arbitrary values in safety.
+
+A common misconception in socket programming is that C<\n> eq C<\012>
+everywhere.  When using protocols such as common Internet protocols,
+C<\012> and C<\015> are called for specifically, and the values of
+the logical C<\n> and C<\r> (carriage return) are not reliable.
+
+    print SOCKET "Hi there, client!\r\n";      # WRONG
+    print SOCKET "Hi there, client!\015\012";  # RIGHT
+
+However, using C<\015\012> (or C<\cM\cJ>, or C<\x0D\x0A>) can be tedious
+and unsightly, as well as confusing to those maintaining the code.  As
+such, the Socket module supplies the Right Thing for those who want it.
+
+    use Socket qw(:DEFAULT :crlf);
+    print SOCKET "Hi there, client!$CRLF"      # RIGHT
+
+When reading from a socket, remember that the default input record
+separator C<$/> is C<\n>, but robust socket code will recognize as
+either C<\012> or C<\015\012> as end of line:
+
+    while (<SOCKET>) {
+        # ...
+    }
+
+Because both CRLF and LF end in LF, the input record separator can
+be set to LF and any CR stripped later.  Better to write:
+
+    use Socket qw(:DEFAULT :crlf);
+    local($/) = LF;      # not needed if $/ is already \012
+
+    while (<SOCKET>) {
+        s/$CR?$LF/\n/;   # not sure if socket uses LF or CRLF, OK
+    #   s/\015?\012/\n/; # same thing
+    }
+
+This example is preferred over the previous one--even for Unix
+platforms--because now any C<\015>'s (C<\cM>'s) are stripped out
+(and there was much rejoicing).
+
+Similarly, functions that return text data--such as a function that
+fetches a web page--should sometimes translate newlines before
+returning the data, if they've not yet been translated to the local
+newline representation.  A single line of code will often suffice:
+
+    $data =~ s/\015?\012/\n/g;
+    return $data;
+
+Some of this may be confusing.  Here's a handy reference to the ASCII CR
+and LF characters.  You can print it out and stick it in your wallet.
+
+    LF  eq  \012  eq  \x0A  eq  \cJ  eq  chr(10)  eq  ASCII 10
+    CR  eq  \015  eq  \x0D  eq  \cM  eq  chr(13)  eq  ASCII 13
+
+             | Unix | DOS  | Mac  |
+        ---------------------------
+        \n   |  LF  |  LF  |  CR  |
+        \r   |  CR  |  CR  |  LF  |
+        \n * |  LF  | CRLF |  CR  |
+        \r * |  CR  |  CR  |  LF  |
+        ---------------------------
+        * text-mode STDIO
+
+The Unix column assumes that you are not accessing a serial line
+(like a tty) in canonical mode.  If you are, then CR on input becomes
+"\n", and "\n" on output becomes CRLF.
+
+These are just the most common definitions of C<\n> and C<\r> in Perl.
+There may well be others.  For example, on an EBCDIC implementation
+such as z/OS (OS/390) or OS/400 (using the ILE, the PASE is ASCII-based)
+the above material is similar to "Unix" but the code numbers change:
+
+    LF  eq  \025  eq  \x15  eq  \cU  eq  chr(21)  eq  CP-1047 21
+    LF  eq  \045  eq  \x25  eq           chr(37)  eq  CP-0037 37
+    CR  eq  \015  eq  \x0D  eq  \cM  eq  chr(13)  eq  CP-1047 13
+    CR  eq  \015  eq  \x0D  eq  \cM  eq  chr(13)  eq  CP-0037 13
+
+             | z/OS | OS/400 |
+        ----------------------
+        \n   |  LF  |  LF    |
+        \r   |  CR  |  CR    |
+        \n * |  LF  |  LF    |
+        \r * |  CR  |  CR    |
+        ----------------------
+        * text-mode STDIO
+
+=head2 Numbers endianness and Width
+
+Different CPUs store integers and floating point numbers in different
+orders (called I<endianness>) and widths (32-bit and 64-bit being the
+most common today).  This affects your programs when they attempt to transfer
+numbers in binary format from one CPU architecture to another,
+usually either "live" via network connection, or by storing the
+numbers to secondary storage such as a disk file or tape.
+
+Conflicting storage orders make utter mess out of the numbers.  If a
+little-endian host (Intel, VAX) stores 0x12345678 (305419896 in
+decimal), a big-endian host (Motorola, Sparc, PA) reads it as
+0x78563412 (2018915346 in decimal).  Alpha and MIPS can be either:
+Digital/Compaq used/uses them in little-endian mode; SGI/Cray uses
+them in big-endian mode.  To avoid this problem in network (socket)
+connections use the C<pack> and C<unpack> formats C<n> and C<N>, the
+"network" orders.  These are guaranteed to be portable.
+
+As of perl 5.8.5, you can also use the C<E<gt>> and C<E<lt>> modifiers
+to force big- or little-endian byte-order.  This is useful if you want
+to store signed integers or 64-bit integers, for example.
+
+You can explore the endianness of your platform by unpacking a
+data structure packed in native format such as:
+
+    print unpack("h*", pack("s2", 1, 2)), "\n";
+    # '10002000' on e.g. Intel x86 or Alpha 21064 in little-endian mode
+    # '00100020' on e.g. Motorola 68040
+
+If you need to distinguish between endian architectures you could use
+either of the variables set like so:
+
+    $is_big_endian   = unpack("h*", pack("s", 1)) =~ /01/;
+    $is_little_endian = unpack("h*", pack("s", 1)) =~ /^1/;
+
+Differing widths can cause truncation even between platforms of equal
+endianness.  The platform of shorter width loses the upper parts of the
+number.  There is no good solution for this problem except to avoid
+transferring or storing raw binary numbers.
+
+One can circumnavigate both these problems in two ways.  Either
+transfer and store numbers always in text format, instead of raw
+binary, or else consider using modules like Data::Dumper (included in
+the standard distribution as of Perl 5.005) and Storable (included as
+of perl 5.8).  Keeping all data as text significantly simplifies matters.
+
+The v-strings are portable only up to v2147483647 (0x7FFFFFFF), that's
+how far EBCDIC, or more precisely UTF-EBCDIC will go.
+
+=head2 Files and Filesystems
+
+Most platforms these days structure files in a hierarchical fashion.
+So, it is reasonably safe to assume that all platforms support the
+notion of a "path" to uniquely identify a file on the system.  How
+that path is really written, though, differs considerably.
+
+Although similar, file path specifications differ between Unix,
+Windows, S<Mac OS>, OS/2, VMS, VOS, S<RISC OS>, and probably others.
+Unix, for example, is one of the few OSes that has the elegant idea
+of a single root directory.
+
+DOS, OS/2, VMS, VOS, and Windows can work similarly to Unix with C</>
+as path separator, or in their own idiosyncratic ways (such as having
+several root directories and various "unrooted" device files such NIL:
+and LPT:).
+
+S<Mac OS> uses C<:> as a path separator instead of C</>.
+
+The filesystem may support neither hard links (C<link>) nor
+symbolic links (C<symlink>, C<readlink>, C<lstat>).
+
+The filesystem may support neither access timestamp nor change
+timestamp (meaning that about the only portable timestamp is the
+modification timestamp), or one second granularity of any timestamps
+(e.g. the FAT filesystem limits the time granularity to two seconds).
+
+The "inode change timestamp" (the C<-C> filetest) may really be the
+"creation timestamp" (which it is not in UNIX).
+
+VOS perl can emulate Unix filenames with C</> as path separator.  The
+native pathname characters greater-than, less-than, number-sign, and
+percent-sign are always accepted.
+
+S<RISC OS> perl can emulate Unix filenames with C</> as path
+separator, or go native and use C<.> for path separator and C<:> to
+signal filesystems and disk names.
+
+Don't assume UNIX filesystem access semantics: that read, write,
+and execute are all the permissions there are, and even if they exist,
+that their semantics (for example what do r, w, and x mean on
+a directory) are the UNIX ones.  The various UNIX/POSIX compatibility
+layers usually try to make interfaces like chmod() work, but sometimes
+there simply is no good mapping.
+
+If all this is intimidating, have no (well, maybe only a little)
+fear.  There are modules that can help.  The File::Spec modules
+provide methods to do the Right Thing on whatever platform happens
+to be running the program.
+
+    use File::Spec::Functions;
+    chdir(updir());        # go up one directory
+    $file = catfile(curdir(), 'temp', 'file.txt');
+    # on Unix and Win32, './temp/file.txt'
+    # on Mac OS, ':temp:file.txt'
+    # on VMS, '[.temp]file.txt'
+
+File::Spec is available in the standard distribution as of version
+5.004_05.  File::Spec::Functions is only in File::Spec 0.7 and later,
+and some versions of perl come with version 0.6.  If File::Spec
+is not updated to 0.7 or later, you must use the object-oriented
+interface from File::Spec (or upgrade File::Spec).
+
+In general, production code should not have file paths hardcoded.
+Making them user-supplied or read from a configuration file is
+better, keeping in mind that file path syntax varies on different
+machines.
+
+This is especially noticeable in scripts like Makefiles and test suites,
+which often assume C</> as a path separator for subdirectories.
+
+Also of use is File::Basename from the standard distribution, which
+splits a pathname into pieces (base filename, full path to directory,
+and file suffix).
+
+Even when on a single platform (if you can call Unix a single platform),
+remember not to count on the existence or the contents of particular
+system-specific files or directories, like F</etc/passwd>,
+F</etc/sendmail.conf>, F</etc/resolv.conf>, or even F</tmp/>.  For
+example, F</etc/passwd> may exist but not contain the encrypted
+passwords, because the system is using some form of enhanced security.
+Or it may not contain all the accounts, because the system is using NIS. 
+If code does need to rely on such a file, include a description of the
+file and its format in the code's documentation, then make it easy for
+the user to override the default location of the file.
+
+Don't assume a text file will end with a newline.  They should,
+but people forget.
+
+Do not have two files or directories of the same name with different
+case, like F<test.pl> and F<Test.pl>, as many platforms have
+case-insensitive (or at least case-forgiving) filenames.  Also, try
+not to have non-word characters (except for C<.>) in the names, and
+keep them to the 8.3 convention, for maximum portability, onerous a
+burden though this may appear.
+
+Likewise, when using the AutoSplit module, try to keep your functions to
+8.3 naming and case-insensitive conventions; or, at the least,
+make it so the resulting files have a unique (case-insensitively)
+first 8 characters.
+
+Whitespace in filenames is tolerated on most systems, but not all,
+and even on systems where it might be tolerated, some utilities
+might become confused by such whitespace.
+
+Many systems (DOS, VMS) cannot have more than one C<.> in their filenames.
+
+Don't assume C<< > >> won't be the first character of a filename.
+Always use C<< < >> explicitly to open a file for reading, or even
+better, use the three-arg version of open, unless you want the user to
+be able to specify a pipe open.
+
+    open(FILE, '<', $existing_file) or die $!;
+
+If filenames might use strange characters, it is safest to open it
+with C<sysopen> instead of C<open>.  C<open> is magic and can
+translate characters like C<< > >>, C<< < >>, and C<|>, which may
+be the wrong thing to do.  (Sometimes, though, it's the right thing.)
+Three-arg open can also help protect against this translation in cases
+where it is undesirable.
+
+Don't use C<:> as a part of a filename since many systems use that for
+their own semantics (Mac OS Classic for separating pathname components,
+many networking schemes and utilities for separating the nodename and
+the pathname, and so on).  For the same reasons, avoid C<@>, C<;> and
+C<|>.
+
+Don't assume that in pathnames you can collapse two leading slashes
+C<//> into one: some networking and clustering filesystems have special
+semantics for that.  Let the operating system to sort it out.
+
+The I<portable filename characters> as defined by ANSI C are
+
+ a b c d e f g h i j k l m n o p q r 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 T U V W X Y Z
+ 0 1 2 3 4 5 6 7 8 9
+ . _ -
+
+and the "-" shouldn't be the first character.  If you want to be
+hypercorrect, stay case-insensitive and within the 8.3 naming
+convention (all the files and directories have to be unique within one
+directory if their names are lowercased and truncated to eight
+characters before the C<.>, if any, and to three characters after the
+C<.>, if any).  (And do not use C<.>s in directory names.)
+
+=head2 System Interaction
+
+Not all platforms provide a command line.  These are usually platforms
+that rely primarily on a Graphical User Interface (GUI) for user
+interaction.  A program requiring a command line interface might
+not work everywhere.  This is probably for the user of the program
+to deal with, so don't stay up late worrying about it.
+
+Some platforms can't delete or rename files held open by the system,
+this limitation may also apply to changing filesystem metainformation
+like file permissions or owners.  Remember to C<close> files when you
+are done with them.  Don't C<unlink> or C<rename> an open file.  Don't
+C<tie> or C<open> a file already tied or opened; C<untie> or C<close>
+it first.
+
+Don't open the same file more than once at a time for writing, as some
+operating systems put mandatory locks on such files.
+
+Don't assume that write/modify permission on a directory gives the
+right to add or delete files/directories in that directory.  That is
+filesystem specific: in some filesystems you need write/modify
+permission also (or even just) in the file/directory itself.  In some
+filesystems (AFS, DFS) the permission to add/delete directory entries
+is a completely separate permission.
+
+Don't assume that a single C<unlink> completely gets rid of the file:
+some filesystems (most notably the ones in VMS) have versioned
+filesystems, and unlink() removes only the most recent one (it doesn't
+remove all the versions because by default the native tools on those
+platforms remove just the most recent version, too).  The portable
+idiom to remove all the versions of a file is
+
+    1 while unlink "file";
+
+This will terminate if the file is undeleteable for some reason
+(protected, not there, and so on).
+
+Don't count on a specific environment variable existing in C<%ENV>.
+Don't count on C<%ENV> entries being case-sensitive, or even
+case-preserving.  Don't try to clear %ENV by saying C<%ENV = ();>, or,
+if you really have to, make it conditional on C<$^O ne 'VMS'> since in
+VMS the C<%ENV> table is much more than a per-process key-value string
+table.
+
+Don't count on signals or C<%SIG> for anything.
+
+Don't count on filename globbing.  Use C<opendir>, C<readdir>, and
+C<closedir> instead.
+
+Don't count on per-program environment variables, or per-program current
+directories.
+
+Don't count on specific values of C<$!>, neither numeric nor
+especially the strings values-- users may switch their locales causing
+error messages to be translated into their languages.  If you can
+trust a POSIXish environment, you can portably use the symbols defined
+by the Errno module, like ENOENT.  And don't trust on the values of C<$!>
+at all except immediately after a failed system call.
+
+=head2 Command names versus file pathnames
+
+Don't assume that the name used to invoke a command or program with
+C<system> or C<exec> can also be used to test for the existence of the
+file that holds the executable code for that command or program.
+First, many systems have "internal" commands that are built-in to the
+shell or OS and while these commands can be invoked, there is no
+corresponding file.  Second, some operating systems (e.g., Cygwin,
+DJGPP, OS/2, and VOS) have required suffixes for executable files;
+these suffixes are generally permitted on the command name but are not
+required.  Thus, a command like "perl" might exist in a file named
+"perl", "perl.exe", or "perl.pm", depending on the operating system.
+The variable "_exe" in the Config module holds the executable suffix,
+if any.  Third, the VMS port carefully sets up $^X and
+$Config{perlpath} so that no further processing is required.  This is
+just as well, because the matching regular expression used below would
+then have to deal with a possible trailing version number in the VMS
+file name.
+
+To convert $^X to a file pathname, taking account of the requirements
+of the various operating system possibilities, say:
+
+  use Config;
+  $thisperl = $^X;
+  if ($^O ne 'VMS')
+     {$thisperl .= $Config{_exe} unless $thisperl =~ m/$Config{_exe}$/i;}
+
+To convert $Config{perlpath} to a file pathname, say:
+
+  use Config;
+  $thisperl = $Config{perlpath};
+  if ($^O ne 'VMS')
+     {$thisperl .= $Config{_exe} unless $thisperl =~ m/$Config{_exe}$/i;}
+
+=head2 Networking
+
+Don't assume that you can reach the public Internet.
+
+Don't assume that there is only one way to get through firewalls
+to the public Internet.
+
+Don't assume that you can reach outside world through any other port
+than 80, or some web proxy.  ftp is blocked by many firewalls.
+
+Don't assume that you can send email by connecting to the local SMTP port.
+
+Don't assume that you can reach yourself or any node by the name
+'localhost'.  The same goes for '127.0.0.1'.  You will have to try both.
+
+Don't assume that the host has only one network card, or that it
+can't bind to many virtual IP addresses.
+
+Don't assume a particular network device name.
+
+Don't assume a particular set of ioctl()s will work.
+
+Don't assume that you can ping hosts and get replies.
+
+Don't assume that any particular port (service) will respond.
+
+Don't assume that Sys::Hostname (or any other API or command)
+returns either a fully qualified hostname or a non-qualified hostname:
+it all depends on how the system had been configured.  Also remember
+things like DHCP and NAT-- the hostname you get back might not be very
+useful.
+
+All the above "don't":s may look daunting, and they are -- but the key
+is to degrade gracefully if one cannot reach the particular network
+service one wants.  Croaking or hanging do not look very professional.
+
+=head2 Interprocess Communication (IPC)
+
+In general, don't directly access the system in code meant to be
+portable.  That means, no C<system>, C<exec>, C<fork>, C<pipe>,
+C<``>, C<qx//>, C<open> with a C<|>, nor any of the other things
+that makes being a perl hacker worth being.
+
+Commands that launch external processes are generally supported on
+most platforms (though many of them do not support any type of
+forking).  The problem with using them arises from what you invoke
+them on.  External tools are often named differently on different
+platforms, may not be available in the same location, might accept
+different arguments, can behave differently, and often present their
+results in a platform-dependent way.  Thus, you should seldom depend
+on them to produce consistent results. (Then again, if you're calling 
+I<netstat -a>, you probably don't expect it to run on both Unix and CP/M.)
+
+One especially common bit of Perl code is opening a pipe to B<sendmail>:
+
+    open(MAIL, '|/usr/lib/sendmail -t') 
+	or die "cannot fork sendmail: $!";
+
+This is fine for systems programming when sendmail is known to be
+available.  But it is not fine for many non-Unix systems, and even
+some Unix systems that may not have sendmail installed.  If a portable
+solution is needed, see the various distributions on CPAN that deal
+with it.  Mail::Mailer and Mail::Send in the MailTools distribution are
+commonly used, and provide several mailing methods, including mail,
+sendmail, and direct SMTP (via Net::SMTP) if a mail transfer agent is
+not available.  Mail::Sendmail is a standalone module that provides
+simple, platform-independent mailing.
+
+The Unix System V IPC (C<msg*(), sem*(), shm*()>) is not available
+even on all Unix platforms.
+
+Do not use either the bare result of C<pack("N", 10, 20, 30, 40)> or
+bare v-strings (such as C<v10.20.30.40>) to represent IPv4 addresses:
+both forms just pack the four bytes into network order.  That this
+would be equal to the C language C<in_addr> struct (which is what the
+socket code internally uses) is not guaranteed.  To be portable use
+the routines of the Socket extension, such as C<inet_aton()>,
+C<inet_ntoa()>, and C<sockaddr_in()>.
+
+The rule of thumb for portable code is: Do it all in portable Perl, or
+use a module (that may internally implement it with platform-specific
+code, but expose a common interface).
+
+=head2 External Subroutines (XS)
+
+XS code can usually be made to work with any platform, but dependent
+libraries, header files, etc., might not be readily available or
+portable, or the XS code itself might be platform-specific, just as Perl
+code might be.  If the libraries and headers are portable, then it is
+normally reasonable to make sure the XS code is portable, too.
+
+A different type of portability issue arises when writing XS code:
+availability of a C compiler on the end-user's system.  C brings
+with it its own portability issues, and writing XS code will expose
+you to some of those.  Writing purely in Perl is an easier way to
+achieve portability.
+
+=head2 Standard Modules
+
+In general, the standard modules work across platforms.  Notable
+exceptions are the CPAN module (which currently makes connections to external
+programs that may not be available), platform-specific modules (like
+ExtUtils::MM_VMS), and DBM modules.
+
+There is no one DBM module available on all platforms.
+SDBM_File and the others are generally available on all Unix and DOSish
+ports, but not in MacPerl, where only NBDM_File and DB_File are
+available.
+
+The good news is that at least some DBM module should be available, and
+AnyDBM_File will use whichever module it can find.  Of course, then
+the code needs to be fairly strict, dropping to the greatest common
+factor (e.g., not exceeding 1K for each record), so that it will
+work with any DBM module.  See L<AnyDBM_File> for more details.
+
+=head2 Time and Date
+
+The system's notion of time of day and calendar date is controlled in
+widely different ways.  Don't assume the timezone is stored in C<$ENV{TZ}>,
+and even if it is, don't assume that you can control the timezone through
+that variable.  Don't assume anything about the three-letter timezone
+abbreviations (for example that MST would be the Mountain Standard Time,
+it's been known to stand for Moscow Standard Time).  If you need to
+use timezones, express them in some unambiguous format like the
+exact number of minutes offset from UTC, or the POSIX timezone
+format.
+
+Don't assume that the epoch starts at 00:00:00, January 1, 1970,
+because that is OS- and implementation-specific.  It is better to
+store a date in an unambiguous representation.  The ISO 8601 standard
+defines YYYY-MM-DD as the date format, or YYYY-MM-DDTHH-MM-SS
+(that's a literal "T" separating the date from the time).
+Please do use the ISO 8601 instead of making us to guess what
+date 02/03/04 might be.  ISO 8601 even sorts nicely as-is.
+A text representation (like "1987-12-18") can be easily converted
+into an OS-specific value using a module like Date::Parse.
+An array of values, such as those returned by C<localtime>, can be
+converted to an OS-specific representation using Time::Local.
+
+When calculating specific times, such as for tests in time or date modules,
+it may be appropriate to calculate an offset for the epoch.
+
+    require Time::Local;
+    $offset = Time::Local::timegm(0, 0, 0, 1, 0, 70);
+
+The value for C<$offset> in Unix will be C<0>, but in Mac OS will be
+some large number.  C<$offset> can then be added to a Unix time value
+to get what should be the proper value on any system.
+
+On Windows (at least), you shouldn't pass a negative value to C<gmtime> or
+C<localtime>.
+
+=head2 Character sets and character encoding
+
+Assume very little about character sets.
+
+Assume nothing about numerical values (C<ord>, C<chr>) of characters.
+Do not use explicit code point ranges (like \xHH-\xHH); use for
+example symbolic character classes like C<[:print:]>.
+
+Do not assume that the alphabetic characters are encoded contiguously
+(in the numeric sense).  There may be gaps.
+
+Do not assume anything about the ordering of the characters.
+The lowercase letters may come before or after the uppercase letters;
+the lowercase and uppercase may be interlaced so that both "a" and "A"
+come before "b"; the accented and other international characters may
+be interlaced so that E<auml> comes before "b".
+
+=head2 Internationalisation
+
+If you may assume POSIX (a rather large assumption), you may read
+more about the POSIX locale system from L<perllocale>.  The locale
+system at least attempts to make things a little bit more portable,
+or at least more convenient and native-friendly for non-English
+users.  The system affects character sets and encoding, and date
+and time formatting--amongst other things.
+
+If you really want to be international, you should consider Unicode.
+See L<perluniintro> and L<perlunicode> for more information.
+
+If you want to use non-ASCII bytes (outside the bytes 0x00..0x7f) in
+the "source code" of your code, to be portable you have to be explicit
+about what bytes they are.  Someone might for example be using your
+code under a UTF-8 locale, in which case random native bytes might be
+illegal ("Malformed UTF-8 ...")  This means that for example embedding
+ISO 8859-1 bytes beyond 0x7f into your strings might cause trouble
+later.  If the bytes are native 8-bit bytes, you can use the C<bytes>
+pragma.  If the bytes are in a string (regular expression being a
+curious string), you can often also use the C<\xHH> notation instead
+of embedding the bytes as-is.  If they are in some particular legacy
+encoding (ether single-byte or something more complicated), you can
+use the C<encoding> pragma.  (If you want to write your code in UTF-8,
+you can use either the C<utf8> pragma, or the C<encoding> pragma.)
+The C<bytes> and C<utf8> pragmata are available since Perl 5.6.0, and
+the C<encoding> pragma since Perl 5.8.0.
+
+=head2 System Resources
+
+If your code is destined for systems with severely constrained (or
+missing!) virtual memory systems then you want to be I<especially> mindful
+of avoiding wasteful constructs such as:
+
+    # NOTE: this is no longer "bad" in perl5.005
+    for (0..10000000) {}                       # bad
+    for (my $x = 0; $x <= 10000000; ++$x) {}   # good
+
+    @lines = <VERY_LARGE_FILE>;                # bad
+
+    while (<FILE>) {$file .= $_}               # sometimes bad
+    $file = join('', <FILE>);                  # better
+
+The last two constructs may appear unintuitive to most people.  The
+first repeatedly grows a string, whereas the second allocates a
+large chunk of memory in one go.  On some systems, the second is
+more efficient that the first.
+
+=head2 Security
+
+Most multi-user platforms provide basic levels of security, usually
+implemented at the filesystem level.  Some, however, do
+not-- unfortunately.  Thus the notion of user id, or "home" directory,
+or even the state of being logged-in, may be unrecognizable on many
+platforms.  If you write programs that are security-conscious, it
+is usually best to know what type of system you will be running
+under so that you can write code explicitly for that platform (or
+class of platforms).
+
+Don't assume the UNIX filesystem access semantics: the operating
+system or the filesystem may be using some ACL systems, which are
+richer languages than the usual rwx.  Even if the rwx exist,
+their semantics might be different.
+
+(From security viewpoint testing for permissions before attempting to
+do something is silly anyway: if one tries this, there is potential
+for race conditions-- someone or something might change the
+permissions between the permissions check and the actual operation.
+Just try the operation.)
+
+Don't assume the UNIX user and group semantics: especially, don't
+expect the C<< $< >> and C<< $> >> (or the C<$(> and C<$)>) to work
+for switching identities (or memberships).
+
+Don't assume set-uid and set-gid semantics. (And even if you do,
+think twice: set-uid and set-gid are a known can of security worms.)
+
+=head2 Style
+
+For those times when it is necessary to have platform-specific code,
+consider keeping the platform-specific code in one place, making porting
+to other platforms easier.  Use the Config module and the special
+variable C<$^O> to differentiate platforms, as described in
+L<"PLATFORMS">.
+
+Be careful in the tests you supply with your module or programs.
+Module code may be fully portable, but its tests might not be.  This
+often happens when tests spawn off other processes or call external
+programs to aid in the testing, or when (as noted above) the tests
+assume certain things about the filesystem and paths.  Be careful not
+to depend on a specific output style for errors, such as when checking
+C<$!> after a failed system call.  Using C<$!> for anything else than
+displaying it as output is doubtful (though see the Errno module for
+testing reasonably portably for error value). Some platforms expect
+a certain output format, and Perl on those platforms may have been
+adjusted accordingly.  Most specifically, don't anchor a regex when
+testing an error value.
+
+=head1 CPAN Testers
+
+Modules uploaded to CPAN are tested by a variety of volunteers on
+different platforms.  These CPAN testers are notified by mail of each
+new upload, and reply to the list with PASS, FAIL, NA (not applicable to
+this platform), or UNKNOWN (unknown), along with any relevant notations.
+
+The purpose of the testing is twofold: one, to help developers fix any
+problems in their code that crop up because of lack of testing on other
+platforms; two, to provide users with information about whether
+a given module works on a given platform.
+
+Also see: 
+
+=over 4
+
+=item *
+
+Mailing list: cpan-testers@perl.org
+
+=item *
+
+Testing results: http://testers.cpan.org/
+
+=back
+
+=head1 PLATFORMS
+
+As of version 5.002, Perl is built with a C<$^O> variable that
+indicates the operating system it was built on.  This was implemented
+to help speed up code that would otherwise have to C<use Config>
+and use the value of C<$Config{osname}>.  Of course, to get more
+detailed information about the system, looking into C<%Config> is
+certainly recommended.
+
+C<%Config> cannot always be trusted, however, because it was built
+at compile time.  If perl was built in one place, then transferred
+elsewhere, some values may be wrong.  The values may even have been
+edited after the fact.
+
+=head2 Unix
+
+Perl works on a bewildering variety of Unix and Unix-like platforms (see
+e.g. most of the files in the F<hints/> directory in the source code kit).
+On most of these systems, the value of C<$^O> (hence C<$Config{'osname'}>,
+too) is determined either by lowercasing and stripping punctuation from the
+first field of the string returned by typing C<uname -a> (or a similar command)
+at the shell prompt or by testing the file system for the presence of
+uniquely named files such as a kernel or header file.  Here, for example,
+are a few of the more popular Unix flavors:
+
+    uname         $^O        $Config{'archname'}
+    --------------------------------------------
+    AIX           aix        aix
+    BSD/OS        bsdos      i386-bsdos
+    Darwin        darwin     darwin
+    dgux          dgux       AViiON-dgux
+    DYNIX/ptx     dynixptx   i386-dynixptx
+    FreeBSD       freebsd    freebsd-i386    
+    Linux         linux      arm-linux
+    Linux         linux      i386-linux
+    Linux         linux      i586-linux
+    Linux         linux      ppc-linux
+    HP-UX         hpux       PA-RISC1.1
+    IRIX          irix       irix
+    Mac OS X      darwin     darwin
+    MachTen PPC   machten    powerpc-machten
+    NeXT 3        next       next-fat
+    NeXT 4        next       OPENSTEP-Mach
+    openbsd       openbsd    i386-openbsd
+    OSF1          dec_osf    alpha-dec_osf
+    reliantunix-n svr4       RM400-svr4
+    SCO_SV        sco_sv     i386-sco_sv
+    SINIX-N       svr4       RM400-svr4
+    sn4609        unicos     CRAY_C90-unicos
+    sn6521        unicosmk   t3e-unicosmk
+    sn9617        unicos     CRAY_J90-unicos
+    SunOS         solaris    sun4-solaris
+    SunOS         solaris    i86pc-solaris
+    SunOS4        sunos      sun4-sunos
+
+Because the value of C<$Config{archname}> may depend on the
+hardware architecture, it can vary more than the value of C<$^O>.
+
+=head2 DOS and Derivatives
+
+Perl has long been ported to Intel-style microcomputers running under
+systems like PC-DOS, MS-DOS, OS/2, and most Windows platforms you can
+bring yourself to mention (except for Windows CE, if you count that).
+Users familiar with I<COMMAND.COM> or I<CMD.EXE> style shells should
+be aware that each of these file specifications may have subtle
+differences:
+
+    $filespec0 = "c:/foo/bar/file.txt";
+    $filespec1 = "c:\\foo\\bar\\file.txt";
+    $filespec2 = 'c:\foo\bar\file.txt';
+    $filespec3 = 'c:\\foo\\bar\\file.txt';
+
+System calls accept either C</> or C<\> as the path separator.
+However, many command-line utilities of DOS vintage treat C</> as
+the option prefix, so may get confused by filenames containing C</>.
+Aside from calling any external programs, C</> will work just fine,
+and probably better, as it is more consistent with popular usage,
+and avoids the problem of remembering what to backwhack and what
+not to.
+
+The DOS FAT filesystem can accommodate only "8.3" style filenames.  Under
+the "case-insensitive, but case-preserving" HPFS (OS/2) and NTFS (NT)
+filesystems you may have to be careful about case returned with functions
+like C<readdir> or used with functions like C<open> or C<opendir>.
+
+DOS also treats several filenames as special, such as AUX, PRN,
+NUL, CON, COM1, LPT1, LPT2, etc.  Unfortunately, sometimes these
+filenames won't even work if you include an explicit directory
+prefix.  It is best to avoid such filenames, if you want your code
+to be portable to DOS and its derivatives.  It's hard to know what
+these all are, unfortunately.
+
+Users of these operating systems may also wish to make use of
+scripts such as I<pl2bat.bat> or I<pl2cmd> to
+put wrappers around your scripts.
+
+Newline (C<\n>) is translated as C<\015\012> by STDIO when reading from
+and writing to files (see L<"Newlines">).  C<binmode(FILEHANDLE)>
+will keep C<\n> translated as C<\012> for that filehandle.  Since it is a
+no-op on other systems, C<binmode> should be used for cross-platform code
+that deals with binary data.  That's assuming you realize in advance
+that your data is in binary.  General-purpose programs should
+often assume nothing about their data.
+
+The C<$^O> variable and the C<$Config{archname}> values for various
+DOSish perls are as follows:
+
+     OS            $^O      $Config{archname}   ID    Version
+     --------------------------------------------------------
+     MS-DOS        dos        ?                 
+     PC-DOS        dos        ?                 
+     OS/2          os2        ?
+     Windows 3.1   ?          ?                 0      3 01
+     Windows 95    MSWin32    MSWin32-x86       1      4 00
+     Windows 98    MSWin32    MSWin32-x86       1      4 10
+     Windows ME    MSWin32    MSWin32-x86       1      ?
+     Windows NT    MSWin32    MSWin32-x86       2      4 xx
+     Windows NT    MSWin32    MSWin32-ALPHA     2      4 xx
+     Windows NT    MSWin32    MSWin32-ppc       2      4 xx
+     Windows 2000  MSWin32    MSWin32-x86       2      5 00
+     Windows XP    MSWin32    MSWin32-x86       2      5 01
+     Windows 2003  MSWin32    MSWin32-x86       2      5 02
+     Windows CE    MSWin32    ?                 3           
+     Cygwin        cygwin     cygwin
+
+The various MSWin32 Perl's can distinguish the OS they are running on
+via the value of the fifth element of the list returned from 
+Win32::GetOSVersion().  For example:
+
+    if ($^O eq 'MSWin32') {
+        my @os_version_info = Win32::GetOSVersion();
+        print +('3.1','95','NT')[$os_version_info[4]],"\n";
+    }
+
+There are also Win32::IsWinNT() and Win32::IsWin95(), try C<perldoc Win32>,
+and as of libwin32 0.19 (not part of the core Perl distribution)
+Win32::GetOSName().  The very portable POSIX::uname() will work too:
+
+    c:\> perl -MPOSIX -we "print join '|', uname"
+    Windows NT|moonru|5.0|Build 2195 (Service Pack 2)|x86
+
+Also see:
+
+=over 4
+
+=item *
+
+The djgpp environment for DOS, http://www.delorie.com/djgpp/
+and L<perldos>.
+
+=item *
+
+The EMX environment for DOS, OS/2, etc. emx@iaehv.nl,
+http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/index.html or
+ftp://hobbes.nmsu.edu/pub/os2/dev/emx/  Also L<perlos2>.
+
+=item *
+
+Build instructions for Win32 in L<perlwin32>, or under the Cygnus environment
+in L<perlcygwin>.  
+
+=item *
+
+The C<Win32::*> modules in L<Win32>.
+
+=item *
+
+The ActiveState Pages, http://www.activestate.com/
+
+=item *
+
+The Cygwin environment for Win32; F<README.cygwin> (installed 
+as L<perlcygwin>), http://www.cygwin.com/
+
+=item *
+
+The U/WIN environment for Win32,
+http://www.research.att.com/sw/tools/uwin/
+
+=item *
+
+Build instructions for OS/2, L<perlos2>
+
+=back
+
+=head2 S<Mac OS>
+
+Any module requiring XS compilation is right out for most people, because
+MacPerl is built using non-free (and non-cheap!) compilers.  Some XS
+modules that can work with MacPerl are built and distributed in binary
+form on CPAN.
+
+Directories are specified as:
+
+    volume:folder:file              for absolute pathnames
+    volume:folder:                  for absolute pathnames
+    :folder:file                    for relative pathnames
+    :folder:                        for relative pathnames
+    :file                           for relative pathnames
+    file                            for relative pathnames
+
+Files are stored in the directory in alphabetical order.  Filenames are
+limited to 31 characters, and may include any character except for
+null and C<:>, which is reserved as the path separator.
+
+Instead of C<flock>, see C<FSpSetFLock> and C<FSpRstFLock> in the
+Mac::Files module, or C<chmod(0444, ...)> and C<chmod(0666, ...)>.
+
+In the MacPerl application, you can't run a program from the command line;
+programs that expect C<@ARGV> to be populated can be edited with something
+like the following, which brings up a dialog box asking for the command
+line arguments.
+
+    if (!@ARGV) {
+        @ARGV = split /\s+/, MacPerl::Ask('Arguments?');
+    }
+
+A MacPerl script saved as a "droplet" will populate C<@ARGV> with the full
+pathnames of the files dropped onto the script.
+
+Mac users can run programs under a type of command line interface
+under MPW (Macintosh Programmer's Workshop, a free development
+environment from Apple).  MacPerl was first introduced as an MPW
+tool, and MPW can be used like a shell:
+
+    perl myscript.plx some arguments
+
+ToolServer is another app from Apple that provides access to MPW tools
+from MPW and the MacPerl app, which allows MacPerl programs to use
+C<system>, backticks, and piped C<open>.
+
+"S<Mac OS>" is the proper name for the operating system, but the value
+in C<$^O> is "MacOS".  To determine architecture, version, or whether
+the application or MPW tool version is running, check:
+
+    $is_app    = $MacPerl::Version =~ /App/;
+    $is_tool   = $MacPerl::Version =~ /MPW/;
+    ($version) = $MacPerl::Version =~ /^(\S+)/;
+    $is_ppc    = $MacPerl::Architecture eq 'MacPPC';
+    $is_68k    = $MacPerl::Architecture eq 'Mac68K';
+
+S<Mac OS X>, based on NeXT's OpenStep OS, runs MacPerl natively, under the
+"Classic" environment.  There is no "Carbon" version of MacPerl to run
+under the primary Mac OS X environment.  S<Mac OS X> and its Open Source
+version, Darwin, both run Unix perl natively.
+
+Also see:
+
+=over 4
+
+=item *
+
+MacPerl Development, http://dev.macperl.org/ .
+
+=item *
+
+The MacPerl Pages, http://www.macperl.com/ .
+
+=item *
+
+The MacPerl mailing lists, http://lists.perl.org/ .
+
+=item *
+
+MPW, ftp://ftp.apple.com/developer/Tool_Chest/Core_Mac_OS_Tools/
+
+=back
+
+=head2 VMS
+
+Perl on VMS is discussed in L<perlvms> in the perl distribution.
+Perl on VMS can accept either VMS- or Unix-style file
+specifications as in either of the following:
+
+    $ perl -ne "print if /perl_setup/i" SYS$LOGIN:LOGIN.COM
+    $ perl -ne "print if /perl_setup/i" /sys$login/login.com
+
+but not a mixture of both as in:
+
+    $ perl -ne "print if /perl_setup/i" sys$login:/login.com
+    Can't open sys$login:/login.com: file specification syntax error
+
+Interacting with Perl from the Digital Command Language (DCL) shell
+often requires a different set of quotation marks than Unix shells do.
+For example:
+
+    $ perl -e "print ""Hello, world.\n"""
+    Hello, world.
+
+There are several ways to wrap your perl scripts in DCL F<.COM> files, if
+you are so inclined.  For example:
+
+    $ write sys$output "Hello from DCL!"
+    $ if p1 .eqs. ""
+    $ then perl -x 'f$environment("PROCEDURE")
+    $ else perl -x - 'p1 'p2 'p3 'p4 'p5 'p6 'p7 'p8
+    $ deck/dollars="__END__"
+    #!/usr/bin/perl
+
+    print "Hello from Perl!\n";
+
+    __END__
+    $ endif
+
+Do take care with C<$ ASSIGN/nolog/user SYS$COMMAND: SYS$INPUT> if your
+perl-in-DCL script expects to do things like C<< $read = <STDIN>; >>.
+
+Filenames are in the format "name.extension;version".  The maximum
+length for filenames is 39 characters, and the maximum length for
+extensions is also 39 characters.  Version is a number from 1 to
+32767.  Valid characters are C</[A-Z0-9$_-]/>.
+
+VMS's RMS filesystem is case-insensitive and does not preserve case.
+C<readdir> returns lowercased filenames, but specifying a file for
+opening remains case-insensitive.  Files without extensions have a
+trailing period on them, so doing a C<readdir> with a file named F<A.;5>
+will return F<a.> (though that file could be opened with
+C<open(FH, 'A')>).
+
+RMS had an eight level limit on directory depths from any rooted logical
+(allowing 16 levels overall) prior to VMS 7.2.  Hence
+C<PERL_ROOT:[LIB.2.3.4.5.6.7.8]> is a valid directory specification but
+C<PERL_ROOT:[LIB.2.3.4.5.6.7.8.9]> is not.  F<Makefile.PL> authors might
+have to take this into account, but at least they can refer to the former
+as C</PERL_ROOT/lib/2/3/4/5/6/7/8/>.
+
+The VMS::Filespec module, which gets installed as part of the build
+process on VMS, is a pure Perl module that can easily be installed on
+non-VMS platforms and can be helpful for conversions to and from RMS
+native formats.
+
+What C<\n> represents depends on the type of file opened.  It usually
+represents C<\012> but it could also be C<\015>, C<\012>, C<\015\012>, 
+C<\000>, C<\040>, or nothing depending on the file organization and 
+record format.  The VMS::Stdio module provides access to the 
+special fopen() requirements of files with unusual attributes on VMS.
+
+TCP/IP stacks are optional on VMS, so socket routines might not be
+implemented.  UDP sockets may not be supported.
+
+The value of C<$^O> on OpenVMS is "VMS".  To determine the architecture
+that you are running on without resorting to loading all of C<%Config>
+you can examine the content of the C<@INC> array like so:
+
+    if (grep(/VMS_AXP/, @INC)) {
+        print "I'm on Alpha!\n";
+
+    } elsif (grep(/VMS_VAX/, @INC)) {
+        print "I'm on VAX!\n";
+
+    } else {
+        print "I'm not so sure about where $^O is...\n";
+    }
+
+On VMS, perl determines the UTC offset from the C<SYS$TIMEZONE_DIFFERENTIAL>
+logical name.  Although the VMS epoch began at 17-NOV-1858 00:00:00.00,
+calls to C<localtime> are adjusted to count offsets from
+01-JAN-1970 00:00:00.00, just like Unix.
+
+Also see:
+
+=over 4
+
+=item *
+
+F<README.vms> (installed as L<README_vms>), L<perlvms>
+
+=item *
+
+vmsperl list, majordomo@perl.org
+
+(Put the words C<subscribe vmsperl> in message body.)
+
+=item *
+
+vmsperl on the web, http://www.sidhe.org/vmsperl/index.html
+
+=back
+
+=head2 VOS
+
+Perl on VOS is discussed in F<README.vos> in the perl distribution
+(installed as L<perlvos>).  Perl on VOS can accept either VOS- or
+Unix-style file specifications as in either of the following:
+
+    C<< $ perl -ne "print if /perl_setup/i" >system>notices >>
+    C<< $ perl -ne "print if /perl_setup/i" /system/notices >>
+
+or even a mixture of both as in:
+
+    C<< $ perl -ne "print if /perl_setup/i" >system/notices >>
+
+Even though VOS allows the slash character to appear in object
+names, because the VOS port of Perl interprets it as a pathname
+delimiting character, VOS files, directories, or links whose names
+contain a slash character cannot be processed.  Such files must be
+renamed before they can be processed by Perl.  Note that VOS limits
+file names to 32 or fewer characters.
+
+Perl on VOS can be built using two different compilers and two different
+versions of the POSIX runtime.  The recommended method for building full
+Perl is with the GNU C compiler and the generally-available version of
+VOS POSIX support.  See F<README.vos> (installed as L<perlvos>) for
+restrictions that apply when Perl is built using the VOS Standard C
+compiler or the alpha version of VOS POSIX support.
+
+The value of C<$^O> on VOS is "VOS".  To determine the architecture that
+you are running on without resorting to loading all of C<%Config> you
+can examine the content of the @INC array like so:
+
+    if ($^O =~ /VOS/) {
+        print "I'm on a Stratus box!\n";
+    } else {
+        print "I'm not on a Stratus box!\n";
+        die;
+    }
+
+    if (grep(/860/, @INC)) {
+        print "This box is a Stratus XA/R!\n";
+
+    } elsif (grep(/7100/, @INC)) {
+        print "This box is a Stratus HP 7100 or 8xxx!\n";
+
+    } elsif (grep(/8000/, @INC)) {
+        print "This box is a Stratus HP 8xxx!\n";
+
+    } else {
+        print "This box is a Stratus 68K!\n";
+    }
+
+Also see:
+
+=over 4
+
+=item *
+
+F<README.vos> (installed as L<perlvos>)
+
+=item *
+
+The VOS mailing list.
+
+There is no specific mailing list for Perl on VOS.  You can post
+comments to the comp.sys.stratus newsgroup, or subscribe to the general
+Stratus mailing list.  Send a letter with "subscribe Info-Stratus" in
+the message body to majordomo@list.stratagy.com.
+
+=item *
+
+VOS Perl on the web at http://ftp.stratus.com/pub/vos/posix/posix.html
+
+=back
+
+=head2 EBCDIC Platforms
+
+Recent versions of Perl have been ported to platforms such as OS/400 on
+AS/400 minicomputers as well as OS/390, VM/ESA, and BS2000 for S/390
+Mainframes.  Such computers use EBCDIC character sets internally (usually
+Character Code Set ID 0037 for OS/400 and either 1047 or POSIX-BC for S/390
+systems).  On the mainframe perl currently works under the "Unix system
+services for OS/390" (formerly known as OpenEdition), VM/ESA OpenEdition, or
+the BS200 POSIX-BC system (BS2000 is supported in perl 5.6 and greater).
+See L<perlos390> for details.  Note that for OS/400 there is also a port of
+Perl 5.8.1/5.9.0 or later to the PASE which is ASCII-based (as opposed to
+ILE which is EBCDIC-based), see L<perlos400>. 
+
+As of R2.5 of USS for OS/390 and Version 2.3 of VM/ESA these Unix
+sub-systems do not support the C<#!> shebang trick for script invocation.
+Hence, on OS/390 and VM/ESA perl scripts can be executed with a header
+similar to the following simple script:
+
+    : # use perl
+        eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
+            if 0;
+    #!/usr/local/bin/perl     # just a comment really
+
+    print "Hello from perl!\n";
+
+OS/390 will support the C<#!> shebang trick in release 2.8 and beyond.
+Calls to C<system> and backticks can use POSIX shell syntax on all
+S/390 systems.
+
+On the AS/400, if PERL5 is in your library list, you may need
+to wrap your perl scripts in a CL procedure to invoke them like so:
+
+    BEGIN
+      CALL PGM(PERL5/PERL) PARM('/QOpenSys/hello.pl')
+    ENDPGM
+
+This will invoke the perl script F<hello.pl> in the root of the
+QOpenSys file system.  On the AS/400 calls to C<system> or backticks
+must use CL syntax.
+
+On these platforms, bear in mind that the EBCDIC character set may have
+an effect on what happens with some perl functions (such as C<chr>,
+C<pack>, C<print>, C<printf>, C<ord>, C<sort>, C<sprintf>, C<unpack>), as
+well as bit-fiddling with ASCII constants using operators like C<^>, C<&>
+and C<|>, not to mention dealing with socket interfaces to ASCII computers
+(see L<"Newlines">).
+
+Fortunately, most web servers for the mainframe will correctly
+translate the C<\n> in the following statement to its ASCII equivalent
+(C<\r> is the same under both Unix and OS/390 & VM/ESA):
+
+    print "Content-type: text/html\r\n\r\n";
+
+The values of C<$^O> on some of these platforms includes:
+
+    uname         $^O        $Config{'archname'}
+    --------------------------------------------
+    OS/390        os390      os390
+    OS400         os400      os400
+    POSIX-BC      posix-bc   BS2000-posix-bc
+    VM/ESA        vmesa      vmesa
+
+Some simple tricks for determining if you are running on an EBCDIC
+platform could include any of the following (perhaps all):
+
+    if ("\t" eq "\05")   { print "EBCDIC may be spoken here!\n"; }
+
+    if (ord('A') == 193) { print "EBCDIC may be spoken here!\n"; }
+
+    if (chr(169) eq 'z') { print "EBCDIC may be spoken here!\n"; }
+
+One thing you may not want to rely on is the EBCDIC encoding
+of punctuation characters since these may differ from code page to code
+page (and once your module or script is rumoured to work with EBCDIC,
+folks will want it to work with all EBCDIC character sets).
+
+Also see:
+
+=over 4
+
+=item *
+
+L<perlos390>, F<README.os390>, F<perlbs2000>, F<README.vmesa>,
+L<perlebcdic>.
+
+=item *
+
+The perl-mvs@perl.org list is for discussion of porting issues as well as
+general usage issues for all EBCDIC Perls.  Send a message body of
+"subscribe perl-mvs" to majordomo@perl.org.
+
+=item *
+
+AS/400 Perl information at
+http://as400.rochester.ibm.com/
+as well as on CPAN in the F<ports/> directory.
+
+=back
+
+=head2 Acorn RISC OS
+
+Because Acorns use ASCII with newlines (C<\n>) in text files as C<\012> like
+Unix, and because Unix filename emulation is turned on by default, 
+most simple scripts will probably work "out of the box".  The native
+filesystem is modular, and individual filesystems are free to be
+case-sensitive or insensitive, and are usually case-preserving.  Some
+native filesystems have name length limits, which file and directory
+names are silently truncated to fit.  Scripts should be aware that the
+standard filesystem currently has a name length limit of B<10>
+characters, with up to 77 items in a directory, but other filesystems
+may not impose such limitations.
+
+Native filenames are of the form
+
+    Filesystem#Special_Field::DiskName.$.Directory.Directory.File
+
+where
+
+    Special_Field is not usually present, but may contain . and $ .
+    Filesystem =~ m|[A-Za-z0-9_]|
+    DsicName   =~ m|[A-Za-z0-9_/]|
+    $ represents the root directory
+    . is the path separator
+    @ is the current directory (per filesystem but machine global)
+    ^ is the parent directory
+    Directory and File =~ m|[^\0- "\.\$\%\&:\@\\^\|\177]+|
+
+The default filename translation is roughly C<tr|/.|./|;>
+
+Note that C<"ADFS::HardDisk.$.File" ne 'ADFS::HardDisk.$.File'> and that
+the second stage of C<$> interpolation in regular expressions will fall
+foul of the C<$.> if scripts are not careful.
+
+Logical paths specified by system variables containing comma-separated
+search lists are also allowed; hence C<System:Modules> is a valid
+filename, and the filesystem will prefix C<Modules> with each section of
+C<System$Path> until a name is made that points to an object on disk.
+Writing to a new file C<System:Modules> would be allowed only if
+C<System$Path> contains a single item list.  The filesystem will also
+expand system variables in filenames if enclosed in angle brackets, so
+C<< <System$Dir>.Modules >> would look for the file
+S<C<$ENV{'System$Dir'} . 'Modules'>>.  The obvious implication of this is
+that B<fully qualified filenames can start with C<< <> >>> and should
+be protected when C<open> is used for input.
+
+Because C<.> was in use as a directory separator and filenames could not
+be assumed to be unique after 10 characters, Acorn implemented the C
+compiler to strip the trailing C<.c> C<.h> C<.s> and C<.o> suffix from
+filenames specified in source code and store the respective files in
+subdirectories named after the suffix.  Hence files are translated:
+
+    foo.h           h.foo
+    C:foo.h         C:h.foo        (logical path variable)
+    sys/os.h        sys.h.os       (C compiler groks Unix-speak)
+    10charname.c    c.10charname
+    10charname.o    o.10charname
+    11charname_.c   c.11charname   (assuming filesystem truncates at 10)
+
+The Unix emulation library's translation of filenames to native assumes
+that this sort of translation is required, and it allows a user-defined list
+of known suffixes that it will transpose in this fashion.  This may
+seem transparent, but consider that with these rules C<foo/bar/baz.h>
+and C<foo/bar/h/baz> both map to C<foo.bar.h.baz>, and that C<readdir> and
+C<glob> cannot and do not attempt to emulate the reverse mapping.  Other
+C<.>'s in filenames are translated to C</>.
+
+As implied above, the environment accessed through C<%ENV> is global, and
+the convention is that program specific environment variables are of the
+form C<Program$Name>.  Each filesystem maintains a current directory,
+and the current filesystem's current directory is the B<global> current
+directory.  Consequently, sociable programs don't change the current
+directory but rely on full pathnames, and programs (and Makefiles) cannot
+assume that they can spawn a child process which can change the current
+directory without affecting its parent (and everyone else for that
+matter).
+
+Because native operating system filehandles are global and are currently 
+allocated down from 255, with 0 being a reserved value, the Unix emulation
+library emulates Unix filehandles.  Consequently, you can't rely on
+passing C<STDIN>, C<STDOUT>, or C<STDERR> to your children.
+
+The desire of users to express filenames of the form
+C<< <Foo$Dir>.Bar >> on the command line unquoted causes problems,
+too: C<``> command output capture has to perform a guessing game.  It
+assumes that a string C<< <[^<>]+\$[^<>]> >> is a
+reference to an environment variable, whereas anything else involving
+C<< < >> or C<< > >> is redirection, and generally manages to be 99%
+right.  Of course, the problem remains that scripts cannot rely on any
+Unix tools being available, or that any tools found have Unix-like command
+line arguments.
+
+Extensions and XS are, in theory, buildable by anyone using free
+tools.  In practice, many don't, as users of the Acorn platform are
+used to binary distributions.  MakeMaker does run, but no available
+make currently copes with MakeMaker's makefiles; even if and when
+this should be fixed, the lack of a Unix-like shell will cause
+problems with makefile rules, especially lines of the form C<cd
+sdbm && make all>, and anything using quoting.
+
+"S<RISC OS>" is the proper name for the operating system, but the value
+in C<$^O> is "riscos" (because we don't like shouting).
+
+=head2 Other perls
+
+Perl has been ported to many platforms that do not fit into any of
+the categories listed above.  Some, such as AmigaOS, Atari MiNT,
+BeOS, HP MPE/iX, QNX, Plan 9, and VOS, have been well-integrated
+into the standard Perl source code kit.  You may need to see the
+F<ports/> directory on CPAN for information, and possibly binaries,
+for the likes of: aos, Atari ST, lynxos, riscos, Novell Netware,
+Tandem Guardian, I<etc.>  (Yes, we know that some of these OSes may
+fall under the Unix category, but we are not a standards body.)
+
+Some approximate operating system names and their C<$^O> values
+in the "OTHER" category include:
+
+    OS            $^O        $Config{'archname'}
+    ------------------------------------------
+    Amiga DOS     amigaos    m68k-amigos
+    BeOS          beos
+    MPE/iX        mpeix      PA-RISC1.1
+
+See also:
+
+=over 4
+
+=item *
+
+Amiga, F<README.amiga> (installed as L<perlamiga>).
+
+=item *
+
+Atari, F<README.mint> and Guido Flohr's web page
+http://stud.uni-sb.de/~gufl0000/
+
+=item *
+
+Be OS, F<README.beos>
+
+=item *
+
+HP 300 MPE/iX, F<README.mpeix> and Mark Bixby's web page
+http://www.bixby.org/mark/perlix.html
+
+=item *
+
+A free perl5-based PERL.NLM for Novell Netware is available in
+precompiled binary and source code form from http://www.novell.com/
+as well as from CPAN.
+
+=item  *
+
+S<Plan 9>, F<README.plan9>
+
+=back
+
+=head1 FUNCTION IMPLEMENTATIONS
+
+Listed below are functions that are either completely unimplemented
+or else have been implemented differently on various platforms.
+Following each description will be, in parentheses, a list of
+platforms that the description applies to.
+
+The list may well be incomplete, or even wrong in some places.  When
+in doubt, consult the platform-specific README files in the Perl
+source distribution, and any other documentation resources accompanying
+a given port.
+
+Be aware, moreover, that even among Unix-ish systems there are variations.
+
+For many functions, you can also query C<%Config>, exported by
+default from the Config module.  For example, to check whether the
+platform has the C<lstat> call, check C<$Config{d_lstat}>.  See
+L<Config> for a full description of available variables.
+
+=head2 Alphabetical Listing of Perl Functions
+
+=over 8
+
+=item -X
+
+C<-r>, C<-w>, and C<-x> have a limited meaning only; directories
+and applications are executable, and there are no uid/gid
+considerations.  C<-o> is not supported.  (S<Mac OS>)
+
+C<-r>, C<-w>, C<-x>, and C<-o> tell whether the file is accessible,
+which may not reflect UIC-based file protections.  (VMS)
+
+C<-s> returns the size of the data fork, not the total size of data fork
+plus resource fork.  (S<Mac OS>).
+
+C<-s> by name on an open file will return the space reserved on disk,
+rather than the current extent.  C<-s> on an open filehandle returns the
+current size.  (S<RISC OS>)
+
+C<-R>, C<-W>, C<-X>, C<-O> are indistinguishable from C<-r>, C<-w>,
+C<-x>, C<-o>. (S<Mac OS>, Win32, VMS, S<RISC OS>)
+
+C<-b>, C<-c>, C<-k>, C<-g>, C<-p>, C<-u>, C<-A> are not implemented.
+(S<Mac OS>)
+
+C<-g>, C<-k>, C<-l>, C<-p>, C<-u>, C<-A> are not particularly meaningful.
+(Win32, VMS, S<RISC OS>)
+
+C<-d> is true if passed a device spec without an explicit directory.
+(VMS)
+
+C<-T> and C<-B> are implemented, but might misclassify Mac text files
+with foreign characters; this is the case will all platforms, but may
+affect S<Mac OS> often.  (S<Mac OS>)
+
+C<-x> (or C<-X>) determine if a file ends in one of the executable
+suffixes.  C<-S> is meaningless.  (Win32)
+
+C<-x> (or C<-X>) determine if a file has an executable file type.
+(S<RISC OS>)
+
+=item atan2 Y,X
+
+Due to issues with various CPUs, math libraries, compilers, and standards,
+results for C<atan2()> may vary depending on any combination of the above.
+Perl attempts to conform to the Open Group/IEEE standards for the results
+returned from C<atan2()>, but cannot force the issue if the system Perl is
+run on does not allow it.  (Tru64, HP-UX 10.20) 
+
+The current version of the standards for C<atan2()> is available at 
+L<http://www.opengroup.org/onlinepubs/009695399/functions/atan2.html>.
+
+=item atan2
+
+Due to issues with various CPUs, math libraries, compilers, and standards,
+results for C<atan2()> may vary depending on any combination of the above.
+Perl attempts to conform to the Open Group/IEEE standards for the results
+returned from C<atan2()>, but cannot force the issue if the system Perl is
+run on does not allow it.  (Tru64, HP-UX 10.20) 
+
+The current version of the standards for C<atan2()> is available at 
+L<http://www.opengroup.org/onlinepubs/009695399/functions/atan2.html>.
+
+=item binmode
+
+Meaningless.  (S<Mac OS>, S<RISC OS>)
+
+Reopens file and restores pointer; if function fails, underlying
+filehandle may be closed, or pointer may be in a different position.
+(VMS)
+
+The value returned by C<tell> may be affected after the call, and
+the filehandle may be flushed. (Win32)
+
+=item chmod
+
+Only limited meaning.  Disabling/enabling write permission is mapped to
+locking/unlocking the file. (S<Mac OS>)
+
+Only good for changing "owner" read-write access, "group", and "other"
+bits are meaningless. (Win32)
+
+Only good for changing "owner" and "other" read-write access. (S<RISC OS>)
+
+Access permissions are mapped onto VOS access-control list changes. (VOS)
+
+The actual permissions set depend on the value of the C<CYGWIN>
+in the SYSTEM environment settings.  (Cygwin)
+
+=item chown
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>, VOS)
+
+Does nothing, but won't fail. (Win32)
+
+=item chroot
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<Plan 9>, S<RISC OS>, VOS, VM/ESA)
+
+=item crypt
+
+May not be available if library or source was not provided when building
+perl. (Win32)
+
+Not implemented. (VOS)
+
+=item dbmclose
+
+Not implemented. (VMS, S<Plan 9>, VOS)
+
+=item dbmopen
+
+Not implemented. (VMS, S<Plan 9>, VOS)
+
+=item dump
+
+Not useful. (S<Mac OS>, S<RISC OS>)
+
+Not implemented. (Win32)
+
+Invokes VMS debugger. (VMS)
+
+=item exec
+
+Not implemented. (S<Mac OS>)
+
+Implemented via Spawn. (VM/ESA)
+
+Does not automatically flush output handles on some platforms.
+(SunOS, Solaris, HP-UX)
+
+=item exit
+
+Emulates UNIX exit() (which considers C<exit 1> to indicate an error) by
+mapping the C<1> to SS$_ABORT (C<44>).  This behavior may be overridden
+with the pragma C<use vmsish 'exit'>.  As with the CRTL's exit()
+function, C<exit 0> is also mapped to an exit status of SS$_NORMAL
+(C<1>); this mapping cannot be overridden.  Any other argument to exit()
+is used directly as Perl's exit status. (VMS)
+
+=item fcntl
+
+Not implemented. (Win32, VMS)
+
+=item flock
+
+Not implemented (S<Mac OS>, VMS, S<RISC OS>, VOS).
+
+Available only on Windows NT (not on Windows 95). (Win32)
+
+=item fork
+
+Not implemented. (S<Mac OS>, AmigaOS, S<RISC OS>, VOS, VM/ESA, VMS)
+
+Emulated using multiple interpreters.  See L<perlfork>.  (Win32)
+
+Does not automatically flush output handles on some platforms.
+(SunOS, Solaris, HP-UX)
+
+=item getlogin
+
+Not implemented. (S<Mac OS>, S<RISC OS>)
+
+=item getpgrp
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+
+=item getppid
+
+Not implemented. (S<Mac OS>, Win32, S<RISC OS>)
+
+=item getpriority
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS, VM/ESA)
+
+=item getpwnam
+
+Not implemented. (S<Mac OS>, Win32)
+
+Not useful. (S<RISC OS>)
+
+=item getgrnam
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
+
+=item getnetbyname
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item getpwuid
+
+Not implemented. (S<Mac OS>, Win32)
+
+Not useful. (S<RISC OS>)
+
+=item getgrgid
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
+
+=item getnetbyaddr
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item getprotobynumber
+
+Not implemented. (S<Mac OS>)
+
+=item getservbyport
+
+Not implemented. (S<Mac OS>)
+
+=item getpwent
+
+Not implemented. (S<Mac OS>, Win32, VM/ESA)
+
+=item getgrent
+
+Not implemented. (S<Mac OS>, Win32, VMS, VM/ESA)
+
+=item gethostbyname
+
+C<gethostbyname('localhost')> does not work everywhere: you may have
+to use C<gethostbyname('127.0.0.1')>. (S<Mac OS>, S<Irix 5>)
+
+=item gethostent
+
+Not implemented. (S<Mac OS>, Win32)
+
+=item getnetent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item getprotoent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item getservent
+
+Not implemented. (Win32, S<Plan 9>)
+
+=item sethostent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>)
+
+=item setnetent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>)
+
+=item setprotoent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>)
+
+=item setservent
+
+Not implemented. (S<Plan 9>, Win32, S<RISC OS>)
+
+=item endpwent
+
+Not implemented. (S<Mac OS>, MPE/iX, VM/ESA, Win32)
+
+=item endgrent
+
+Not implemented. (S<Mac OS>, MPE/iX, S<RISC OS>, VM/ESA, VMS, Win32)
+
+=item endhostent
+
+Not implemented. (S<Mac OS>, Win32)
+
+=item endnetent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item endprotoent
+
+Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
+
+=item endservent
+
+Not implemented. (S<Plan 9>, Win32)
+
+=item getsockopt SOCKET,LEVEL,OPTNAME
+
+Not implemented. (S<Plan 9>)
+
+=item glob
+
+This operator is implemented via the File::Glob extension on most
+platforms.  See L<File::Glob> for portability information.
+
+=item gmtime
+
+Same portability caveats as L<localtime>.
+
+=item ioctl FILEHANDLE,FUNCTION,SCALAR
+
+Not implemented. (VMS)
+
+Available only for socket handles, and it does what the ioctlsocket() call
+in the Winsock API does. (Win32)
+
+Available only for socket handles. (S<RISC OS>)
+
+=item kill
+
+C<kill(0, LIST)> is implemented for the sake of taint checking;
+use with other signals is unimplemented. (S<Mac OS>)
+
+Not implemented, hence not useful for taint checking. (S<RISC OS>)
+
+C<kill()> doesn't have the semantics of C<raise()>, i.e. it doesn't send
+a signal to the identified process like it does on Unix platforms.
+Instead C<kill($sig, $pid)> terminates the process identified by $pid,
+and makes it exit immediately with exit status $sig.  As in Unix, if
+$sig is 0 and the specified process exists, it returns true without
+actually terminating it. (Win32)
+
+=item link
+
+Not implemented. (S<Mac OS>, MPE/iX, VMS, S<RISC OS>)
+
+Link count not updated because hard links are not quite that hard
+(They are sort of half-way between hard and soft links). (AmigaOS)
+
+Hard links are implemented on Win32 (Windows NT and Windows 2000)
+under NTFS only.
+
+=item localtime
+
+Because Perl currently relies on the native standard C localtime()
+function, it is only safe to use times between 0 and (2**31)-1.  Times
+outside this range may result in unexpected behavior depending on your
+operating system's implementation of localtime().
+
+=item lstat
+
+Not implemented. (VMS, S<RISC OS>)
+
+Return values (especially for device and inode) may be bogus. (Win32)
+
+=item msgctl
+
+=item msgget
+
+=item msgsnd
+
+=item msgrcv
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<Plan 9>, S<RISC OS>, VOS)
+
+=item open
+
+The C<|> variants are supported only if ToolServer is installed.
+(S<Mac OS>)
+
+open to C<|-> and C<-|> are unsupported. (S<Mac OS>, Win32, S<RISC OS>)
+
+Opening a process does not automatically flush output handles on some
+platforms.  (SunOS, Solaris, HP-UX)
+
+=item pipe
+
+Very limited functionality. (MiNT)
+
+=item readlink
+
+Not implemented. (Win32, VMS, S<RISC OS>)
+
+=item rename
+
+Can't move directories between directories on different logical volumes. (Win32)
+
+=item select
+
+Only implemented on sockets. (Win32, VMS)
+
+Only reliable on sockets. (S<RISC OS>)
+
+Note that the C<select FILEHANDLE> form is generally portable.
+
+=item semctl
+
+=item semget
+
+=item semop
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+
+=item setgrent
+
+Not implemented. (S<Mac OS>, MPE/iX, VMS, Win32, S<RISC OS>)
+
+=item setpgrp
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+
+=item setpriority
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+
+=item setpwent
+
+Not implemented. (S<Mac OS>, MPE/iX, Win32, S<RISC OS>)
+
+=item setsockopt
+
+Not implemented. (S<Plan 9>)
+
+=item shmctl
+
+=item shmget
+
+=item shmread
+
+=item shmwrite
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+
+=item sockatmark
+
+A relatively recent addition to socket functions, may not
+be implemented even in UNIX platforms.
+
+=item socketpair
+
+Not implemented. (Win32, VMS, S<RISC OS>, VOS, VM/ESA)
+
+=item stat
+
+Platforms that do not have rdev, blksize, or blocks will return these
+as '', so numeric comparison or manipulation of these fields may cause
+'not numeric' warnings.
+
+mtime and atime are the same thing, and ctime is creation time instead of
+inode change time. (S<Mac OS>).
+
+ctime not supported on UFS (S<Mac OS X>).
+
+ctime is creation time instead of inode change time  (Win32).
+
+device and inode are not meaningful.  (Win32)
+
+device and inode are not necessarily reliable.  (VMS)
+
+mtime, atime and ctime all return the last modification time.  Device and
+inode are not necessarily reliable.  (S<RISC OS>)
+
+dev, rdev, blksize, and blocks are not available.  inode is not
+meaningful and will differ between stat calls on the same file.  (os2)
+
+some versions of cygwin when doing a stat("foo") and if not finding it
+may then attempt to stat("foo.exe") (Cygwin)
+
+=item symlink
+
+Not implemented. (Win32, VMS, S<RISC OS>)
+
+=item syscall
+
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS, VM/ESA)
+
+=item sysopen
+
+The traditional "0", "1", and "2" MODEs are implemented with different
+numeric values on some systems.  The flags exported by C<Fcntl>
+(O_RDONLY, O_WRONLY, O_RDWR) should work everywhere though.  (S<Mac
+OS>, OS/390, VM/ESA)
+
+=item system
+
+In general, do not assume the UNIX/POSIX semantics that you can shift
+C<$?> right by eight to get the exit value, or that C<$? & 127>
+would give you the number of the signal that terminated the program,
+or that C<$? & 128> would test true if the program was terminated by a
+coredump.  Instead, use the POSIX W*() interfaces: for example, use
+WIFEXITED($?) and WEXITVALUE($?) to test for a normal exit and the exit
+value, WIFSIGNALED($?) and WTERMSIG($?) for a signal exit and the
+signal.  Core dumping is not a portable concept, so there's no portable
+way to test for that.
+
+Only implemented if ToolServer is installed. (S<Mac OS>)
+
+As an optimization, may not call the command shell specified in
+C<$ENV{PERL5SHELL}>.  C<system(1, @args)> spawns an external
+process and immediately returns its process designator, without
+waiting for it to terminate.  Return value may be used subsequently
+in C<wait> or C<waitpid>.  Failure to spawn() a subprocess is indicated
+by setting $? to "255 << 8".  C<$?> is set in a way compatible with
+Unix (i.e. the exitstatus of the subprocess is obtained by "$? >> 8",
+as described in the documentation).  (Win32)
+
+There is no shell to process metacharacters, and the native standard is
+to pass a command line terminated by "\n" "\r" or "\0" to the spawned
+program.  Redirection such as C<< > foo >> is performed (if at all) by
+the run time library of the spawned program.  C<system> I<list> will call
+the Unix emulation library's C<exec> emulation, which attempts to provide
+emulation of the stdin, stdout, stderr in force in the parent, providing
+the child program uses a compatible version of the emulation library.
+I<scalar> will call the native command line direct and no such emulation
+of a child Unix program will exists.  Mileage B<will> vary.  (S<RISC OS>)
+
+Far from being POSIX compliant.  Because there may be no underlying
+/bin/sh tries to work around the problem by forking and execing the
+first token in its argument string.  Handles basic redirection
+("<" or ">") on its own behalf. (MiNT)
+
+Does not automatically flush output handles on some platforms.
+(SunOS, Solaris, HP-UX)
+
+The return value is POSIX-like (shifted up by 8 bits), which only allows
+room for a made-up value derived from the severity bits of the native
+32-bit condition code (unless overridden by C<use vmsish 'status'>). 
+For more details see L<perlvms/$?>. (VMS)
+
+=item times
+
+Only the first entry returned is nonzero. (S<Mac OS>)
+
+"cumulative" times will be bogus.  On anything other than Windows NT
+or Windows 2000, "system" time will be bogus, and "user" time is
+actually the time returned by the clock() function in the C runtime
+library. (Win32)
+
+Not useful. (S<RISC OS>)
+
+=item truncate
+
+Not implemented. (Older versions of VMS)
+
+Truncation to zero-length only. (VOS)
+
+If a FILEHANDLE is supplied, it must be writable and opened in append
+mode (i.e., use C<<< open(FH, '>>filename') >>>
+or C<sysopen(FH,...,O_APPEND|O_RDWR)>.  If a filename is supplied, it
+should not be held open elsewhere. (Win32)
+
+=item umask
+
+Returns undef where unavailable, as of version 5.005.
+
+C<umask> works but the correct permissions are set only when the file
+is finally closed. (AmigaOS)
+
+=item utime
+
+Only the modification time is updated. (S<BeOS>, S<Mac OS>, VMS, S<RISC OS>)
+
+May not behave as expected.  Behavior depends on the C runtime
+library's implementation of utime(), and the filesystem being
+used.  The FAT filesystem typically does not support an "access
+time" field, and it may limit timestamps to a granularity of
+two seconds. (Win32)
+
+=item wait
+
+=item waitpid
+
+Not implemented. (S<Mac OS>, VOS)
+
+Can only be applied to process handles returned for processes spawned
+using C<system(1, ...)> or pseudo processes created with C<fork()>. (Win32)
+
+Not useful. (S<RISC OS>)
+
+=back
+
+
+=head1 Supported Platforms
+
+As of September 2003 (the Perl release 5.8.1), the following platforms
+are able to build Perl from the standard source code distribution
+available at http://www.cpan.org/src/index.html
+
+        AIX
+        BeOS
+        BSD/OS          (BSDi)
+        Cygwin
+        DG/UX
+        DOS DJGPP       1)
+        DYNIX/ptx
+        EPOC R5
+        FreeBSD
+        HI-UXMPP        (Hitachi) (5.8.0 worked but we didn't know it)
+        HP-UX
+        IRIX
+        Linux
+        LynxOS
+        Mac OS Classic
+        Mac OS X        (Darwin)
+        MPE/iX
+        NetBSD
+        NetWare
+        NonStop-UX
+        ReliantUNIX     (formerly SINIX)
+        OpenBSD
+        OpenVMS         (formerly VMS)
+        Open UNIX       (Unixware) (since Perl 5.8.1/5.9.0)
+        OS/2
+        OS/400          (using the PASE) (since Perl 5.8.1/5.9.0)
+        PowerUX
+        POSIX-BC        (formerly BS2000)
+        QNX
+        Solaris
+        SunOS 4
+        SUPER-UX        (NEC)
+        SVR4
+        Tru64 UNIX      (formerly DEC OSF/1, Digital UNIX)
+        UNICOS
+        UNICOS/mk
+        UTS
+        VOS
+        Win95/98/ME/2K/XP 2)
+        WinCE
+        z/OS            (formerly OS/390)
+        VM/ESA
+
+        1) in DOS mode either the DOS or OS/2 ports can be used
+        2) compilers: Borland, MinGW (GCC), VC6
+
+The following platforms worked with the previous releases (5.6 and
+5.7), but we did not manage either to fix or to test these in time
+for the 5.8.1 release.  There is a very good chance that many of these
+will work fine with the 5.8.1.
+
+        DomainOS
+        Hurd
+        MachTen
+        PowerMAX
+        SCO SV
+        Unixware
+        Windows 3.1
+
+Known to be broken for 5.8.0 and 5.8.1 (but 5.6.1 and 5.7.2 can be used):
+
+	AmigaOS
+
+The following platforms have been known to build Perl from source in
+the past (5.005_03 and earlier), but we haven't been able to verify
+their status for the current release, either because the
+hardware/software platforms are rare or because we don't have an
+active champion on these platforms--or both.  They used to work,
+though, so go ahead and try compiling them, and let perlbug@perl.org
+of any trouble.
+
+        3b1
+        A/UX
+        ConvexOS
+        CX/UX
+        DC/OSx
+        DDE SMES
+        DOS EMX
+        Dynix
+        EP/IX
+        ESIX
+        FPS
+        GENIX
+        Greenhills
+        ISC
+        MachTen 68k
+        MiNT
+        MPC
+        NEWS-OS
+        NextSTEP
+        OpenSTEP
+        Opus
+        Plan 9
+        RISC/os
+        SCO ODT/OSR
+        Stellar
+        SVR2
+        TI1500
+        TitanOS
+        Ultrix
+        Unisys Dynix
+
+The following platforms have their own source code distributions and
+binaries available via http://www.cpan.org/ports/
+
+                                Perl release
+
+        OS/400 (ILE)            5.005_02
+        Tandem Guardian         5.004
+
+The following platforms have only binaries available via
+http://www.cpan.org/ports/index.html :
+
+                                Perl release
+
+        Acorn RISCOS            5.005_02
+        AOS                     5.002
+        LynxOS                  5.004_02
+
+Although we do suggest that you always build your own Perl from
+the source code, both for maximal configurability and for security,
+in case you are in a hurry you can check
+http://www.cpan.org/ports/index.html for binary distributions.
+
+=head1 SEE ALSO
+
+L<perlaix>, L<perlamiga>, L<perlapollo>, L<perlbeos>, L<perlbs2000>,
+L<perlce>, L<perlcygwin>, L<perldgux>, L<perldos>, L<perlepoc>,
+L<perlebcdic>, L<perlfreebsd>, L<perlhurd>, L<perlhpux>, L<perlirix>,
+L<perlmachten>, L<perlmacos>, L<perlmacosx>, L<perlmint>, L<perlmpeix>,
+L<perlnetware>, L<perlos2>, L<perlos390>, L<perlos400>,
+L<perlplan9>, L<perlqnx>, L<perlsolaris>, L<perltru64>,
+L<perlunicode>, L<perlvmesa>, L<perlvms>, L<perlvos>,
+L<perlwin32>, and L<Win32>.
+
+=head1 AUTHORS / CONTRIBUTORS
+
+Abigail <abigail@foad.org>,
+Charles Bailey <bailey@newman.upenn.edu>,
+Graham Barr <gbarr@pobox.com>,
+Tom Christiansen <tchrist@perl.com>,
+Nicholas Clark <nick@ccl4.org>,
+Thomas Dorner <Thomas.Dorner@start.de>,
+Andy Dougherty <doughera@lafayette.edu>,
+Dominic Dunlop <domo@computer.org>,
+Neale Ferguson <neale@vma.tabnsw.com.au>,
+David J. Fiander <davidf@mks.com>,
+Paul Green <Paul_Green@stratus.com>,
+M.J.T. Guy <mjtg@cam.ac.uk>,
+Jarkko Hietaniemi <jhi@iki.fi>,
+Luther Huffman <lutherh@stratcom.com>,
+Nick Ing-Simmons <nick@ing-simmons.net>,
+Andreas J. KE<ouml>nig <a.koenig@mind.de>,
+Markus Laker <mlaker@contax.co.uk>,
+Andrew M. Langmead <aml@world.std.com>,
+Larry Moore <ljmoore@freespace.net>,
+Paul Moore <Paul.Moore@uk.origin-it.com>,
+Chris Nandor <pudge@pobox.com>,
+Matthias Neeracher <neeracher@mac.com>,
+Philip Newton <pne@cpan.org>,
+Gary Ng <71564.1743@CompuServe.COM>,
+Tom Phoenix <rootbeer@teleport.com>,
+AndrE<eacute> Pirard <A.Pirard@ulg.ac.be>,
+Peter Prymmer <pvhp@forte.com>,
+Hugo van der Sanden <hv@crypt0.demon.co.uk>,
+Gurusamy Sarathy <gsar@activestate.com>,
+Paul J. Schinder <schinder@pobox.com>,
+Michael G Schwern <schwern@pobox.com>,
+Dan Sugalski <dan@sidhe.org>,
+Nathan Torkington <gnat@frii.com>.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlqnx.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlqnx.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlqnx.pod	(revision 14489)
@@ -0,0 +1,143 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.qnx - Perl version 5 on QNX
+
+=head1 DESCRIPTION
+
+As of perl5.7.2 all tests pass under:
+
+  QNX 4.24G
+  Watcom 10.6 with Beta/970211.wcc.update.tar.F
+  socket3r.lib Nov21 1996.
+
+As of perl5.8.1 there is at least one test still failing.
+
+Some tests may complain under known circumstances.
+
+See below and hints/qnx.sh for more information.
+
+Under QNX 6.2.0 there are still a few tests which fail.
+See below and hints/qnx.sh for more information.
+
+=head2 Required Software for Compiling Perl on QNX4
+
+As with many unix ports, this one depends on a few "standard"
+unix utilities which are not necessarily standard for QNX4.
+
+=over 4
+
+=item /bin/sh
+
+This is used heavily by Configure and then by
+perl itself. QNX4's version is fine, but Configure
+will choke on the 16-bit version, so if you are
+running QNX 4.22, link /bin/sh to /bin32/ksh
+
+=item ar
+
+This is the standard unix library builder.
+We use wlib. With Watcom 10.6, when wlib is
+linked as "ar", it behaves like ar and all is
+fine. Under 9.5, a cover is required. One is
+included in ../qnx
+
+=item nm
+
+This is used (optionally) by configure to list
+the contents of libraries. I will generate
+a cover function on the fly in the UU directory.
+
+=item cpp
+
+Configure and perl need a way to invoke a C
+preprocessor. I have created a simple cover
+for cc which does the right thing. Without this,
+Configure will create its own wrapper which works,
+but it doesn't handle some of the command line arguments
+that perl will throw at it.
+
+=item make
+
+You really need GNU make to compile this. GNU make
+ships by default with QNX 4.23, but you can get it
+from quics for earlier versions.
+
+=back
+
+=head2 Outstanding Issues with Perl on QNX4
+
+There is no support for dynamically linked libraries in QNX4.
+
+If you wish to compile with the Socket extension, you need
+to have the TCP/IP toolkit, and you need to make sure that
+-lsocket locates the correct copy of socket3r.lib. Beware
+that the Watcom compiler ships with a stub version of
+socket3r.lib which has very little functionality. Also
+beware the order in which wlink searches directories for
+libraries. You may have /usr/lib/socket3r.lib pointing to
+the correct library, but wlink may pick up
+/usr/watcom/10.6/usr/lib/socket3r.lib instead. Make sure
+they both point to the correct library, that is,
+/usr/tcptk/current/usr/lib/socket3r.lib.
+
+The following tests may report errors under QNX4:
+
+ext/Cwd/Cwd.t will complain if `pwd` and cwd don't give
+the same results. cwd calls `fullpath -t`, so if you
+cd `fullpath -t` before running the test, it will
+pass.
+
+lib/File/Find/taint.t will complain if '.' is in your
+PATH. The PATH test is triggered because cwd calls
+`fullpath -t`.
+
+ext/IO/lib/IO/t/io_sock.t: Subtests 14 and 22 are skipped due to
+the fact that the functionality to read back the non-blocking
+status of a socket is not implemented in QNX's TCP/IP. This has
+been reported to QNX and it may work with later versions of
+TCP/IP.
+
+t/io/tell.t: Subtest 27 is failing. We are still investigating.
+
+=head2 QNX auxiliary files
+
+The files in the "qnx" directory are:
+
+=over 4
+
+=item qnx/ar
+
+A script that emulates the standard unix archive (aka library)
+utility.  Under Watcom 10.6, ar is linked to wlib and provides the
+expected interface. With Watcom 9.5, a cover function is
+required. This one is fairly crude but has proved adequate for
+compiling perl.
+
+=item qnx/cpp
+
+A script that provides C preprocessing functionality.  Configure can
+generate a similar cover, but it doesn't handle all the command-line
+options that perl throws at it. This might be reasonably placed in
+/usr/local/bin.
+
+=back
+
+=head2 Outstanding issues with perl under QNX6
+
+The following tests are still failing for Perl 5.8.1 under QNX 6.2.0:
+
+  op/sprintf.........................FAILED at test 91
+  lib/Benchmark......................FAILED at test 26
+
+This is due to a bug in the C library's printf routine.
+printf("'%e'", 0. ) produces '0.000000e+0', but ANSI requires
+'0.000000e+00'. QNX has acknowledged the bug.
+
+=head1 AUTHOR
+
+Norton T. Allen (allen@huarp.harvard.edu)
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlre.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlre.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlre.pod	(revision 14489)
@@ -0,0 +1,1406 @@
+=head1 NAME
+X<regular expression> X<regex> X<regexp>
+
+perlre - Perl regular expressions
+
+=head1 DESCRIPTION
+
+This page describes the syntax of regular expressions in Perl.  
+
+If you haven't used regular expressions before, a quick-start
+introduction is available in L<perlrequick>, and a longer tutorial
+introduction is available in L<perlretut>.
+
+For reference on how regular expressions are used in matching
+operations, plus various examples of the same, see discussions of
+C<m//>, C<s///>, C<qr//> and C<??> in L<perlop/"Regexp Quote-Like
+Operators">.
+
+Matching operations can have various modifiers.  Modifiers
+that relate to the interpretation of the regular expression inside
+are listed below.  Modifiers that alter the way a regular expression
+is used by Perl are detailed in L<perlop/"Regexp Quote-Like Operators"> and 
+L<perlop/"Gory details of parsing quoted constructs">.
+
+=over 4
+
+=item i
+X</i> X<regex, case-insensitive> X<regexp, case-insensitive>
+X<regular expression, case-insensitive>
+
+Do case-insensitive pattern matching.
+
+If C<use locale> is in effect, the case map is taken from the current
+locale.  See L<perllocale>.
+
+=item m
+X</m> X<regex, multiline> X<regexp, multiline> X<regular expression, multiline>
+
+Treat string as multiple lines.  That is, change "^" and "$" from matching
+the start or end of the string to matching the start or end of any
+line anywhere within the string.
+
+=item s
+X</s> X<regex, single-line> X<regexp, single-line>
+X<regular expression, single-line>
+
+Treat string as single line.  That is, change "." to match any character
+whatsoever, even a newline, which normally it would not match.
+
+The C</s> and C</m> modifiers both override the C<$*> setting.  That
+is, no matter what C<$*> contains, C</s> without C</m> will force
+"^" to match only at the beginning of the string and "$" to match
+only at the end (or just before a newline at the end) of the string.
+Together, as /ms, they let the "." match any character whatsoever,
+while still allowing "^" and "$" to match, respectively, just after
+and just before newlines within the string.
+
+=item x
+X</x>
+
+Extend your pattern's legibility by permitting whitespace and comments.
+
+=back
+
+These are usually written as "the C</x> modifier", even though the delimiter
+in question might not really be a slash.  Any of these
+modifiers may also be embedded within the regular expression itself using
+the C<(?...)> construct.  See below.
+
+The C</x> modifier itself needs a little more explanation.  It tells
+the regular expression parser to ignore whitespace that is neither
+backslashed nor within a character class.  You can use this to break up
+your regular expression into (slightly) more readable parts.  The C<#>
+character is also treated as a metacharacter introducing a comment,
+just as in ordinary Perl code.  This also means that if you want real
+whitespace or C<#> characters in the pattern (outside a character
+class, where they are unaffected by C</x>), that you'll either have to 
+escape them or encode them using octal or hex escapes.  Taken together,
+these features go a long way towards making Perl's regular expressions
+more readable.  Note that you have to be careful not to include the
+pattern delimiter in the comment--perl has no way of knowing you did
+not intend to close the pattern early.  See the C-comment deletion code
+in L<perlop>.
+X</x>
+
+=head2 Regular Expressions
+
+The patterns used in Perl pattern matching derive from supplied in
+the Version 8 regex routines.  (The routines are derived
+(distantly) from Henry Spencer's freely redistributable reimplementation
+of the V8 routines.)  See L<Version 8 Regular Expressions> for
+details.
+
+In particular the following metacharacters have their standard I<egrep>-ish
+meanings:
+X<metacharacter>
+X<\> X<^> X<.> X<$> X<|> X<(> X<()> X<[> X<[]>
+
+
+    \	Quote the next metacharacter
+    ^	Match the beginning of the line
+    .	Match any character (except newline)
+    $	Match the end of the line (or before newline at the end)
+    |	Alternation
+    ()	Grouping
+    []	Character class
+
+By default, the "^" character is guaranteed to match only the
+beginning of the string, the "$" character only the end (or before the
+newline at the end), and Perl does certain optimizations with the
+assumption that the string contains only one line.  Embedded newlines
+will not be matched by "^" or "$".  You may, however, wish to treat a
+string as a multi-line buffer, such that the "^" will match after any
+newline within the string, and "$" will match before any newline.  At the
+cost of a little more overhead, you can do this by using the /m modifier
+on the pattern match operator.  (Older programs did this by setting C<$*>,
+but this practice is now deprecated.)
+X<^> X<$> X</m>
+
+To simplify multi-line substitutions, the "." character never matches a
+newline unless you use the C</s> modifier, which in effect tells Perl to pretend
+the string is a single line--even if it isn't.  The C</s> modifier also
+overrides the setting of C<$*>, in case you have some (badly behaved) older
+code that sets it in another module.
+X<.> X</s>
+
+The following standard quantifiers are recognized:
+X<metacharacter> X<quantifier> X<*> X<+> X<?> X<{n}> X<{n,}> X<{n,m}>
+
+    *	   Match 0 or more times
+    +	   Match 1 or more times
+    ?	   Match 1 or 0 times
+    {n}    Match exactly n times
+    {n,}   Match at least n times
+    {n,m}  Match at least n but not more than m times
+
+(If a curly bracket occurs in any other context, it is treated
+as a regular character.  In particular, the lower bound
+is not optional.)  The "*" modifier is equivalent to C<{0,}>, the "+"
+modifier to C<{1,}>, and the "?" modifier to C<{0,1}>.  n and m are limited
+to integral values less than a preset limit defined when perl is built.
+This is usually 32766 on the most common platforms.  The actual limit can
+be seen in the error message generated by code such as this:
+
+    $_ **= $_ , / {$_} / for 2 .. 42;
+
+By default, a quantified subpattern is "greedy", that is, it will match as
+many times as possible (given a particular starting location) while still
+allowing the rest of the pattern to match.  If you want it to match the
+minimum number of times possible, follow the quantifier with a "?".  Note
+that the meanings don't change, just the "greediness":
+X<metacharacter> X<greedy> X<greedyness>
+X<?> X<*?> X<+?> X<??> X<{n}?> X<{n,}?> X<{n,m}?>
+
+    *?	   Match 0 or more times
+    +?	   Match 1 or more times
+    ??	   Match 0 or 1 time
+    {n}?   Match exactly n times
+    {n,}?  Match at least n times
+    {n,m}? Match at least n but not more than m times
+
+Because patterns are processed as double quoted strings, the following
+also work:
+X<\t> X<\n> X<\r> X<\f> X<\a> X<\l> X<\u> X<\L> X<\U> X<\E> X<\Q>
+X<\0> X<\c> X<\N> X<\x>
+
+    \t		tab                   (HT, TAB)
+    \n		newline               (LF, NL)
+    \r		return                (CR)
+    \f		form feed             (FF)
+    \a		alarm (bell)          (BEL)
+    \e		escape (think troff)  (ESC)
+    \033	octal char (think of a PDP-11)
+    \x1B	hex char
+    \x{263a}	wide hex char         (Unicode SMILEY)
+    \c[		control char
+    \N{name}	named char
+    \l		lowercase next char (think vi)
+    \u		uppercase next char (think vi)
+    \L		lowercase till \E (think vi)
+    \U		uppercase till \E (think vi)
+    \E		end case modification (think vi)
+    \Q		quote (disable) pattern metacharacters till \E
+
+If C<use locale> is in effect, the case map used by C<\l>, C<\L>, C<\u>
+and C<\U> is taken from the current locale.  See L<perllocale>.  For
+documentation of C<\N{name}>, see L<charnames>.
+
+You cannot include a literal C<$> or C<@> within a C<\Q> sequence.
+An unescaped C<$> or C<@> interpolates the corresponding variable,
+while escaping will cause the literal string C<\$> to be matched.
+You'll need to write something like C<m/\Quser\E\@\Qhost/>.
+
+In addition, Perl defines the following:
+X<metacharacter>
+X<\w> X<\W> X<\s> X<\S> X<\d> X<\D> X<\X> X<\p> X<\P> X<\C>
+X<word> X<whitespace>
+
+    \w	Match a "word" character (alphanumeric plus "_")
+    \W	Match a non-"word" character
+    \s	Match a whitespace character
+    \S	Match a non-whitespace character
+    \d	Match a digit character
+    \D	Match a non-digit character
+    \pP	Match P, named property.  Use \p{Prop} for longer names.
+    \PP	Match non-P
+    \X	Match eXtended Unicode "combining character sequence",
+        equivalent to (?:\PM\pM*)
+    \C	Match a single C char (octet) even under Unicode.
+	NOTE: breaks up characters into their UTF-8 bytes,
+	so you may end up with malformed pieces of UTF-8.
+	Unsupported in lookbehind.
+
+A C<\w> matches a single alphanumeric character (an alphabetic
+character, or a decimal digit) or C<_>, not a whole word.  Use C<\w+>
+to match a string of Perl-identifier characters (which isn't the same
+as matching an English word).  If C<use locale> is in effect, the list
+of alphabetic characters generated by C<\w> is taken from the current
+locale.  See L<perllocale>.  You may use C<\w>, C<\W>, C<\s>, C<\S>,
+C<\d>, and C<\D> within character classes, but if you try to use them
+as endpoints of a range, that's not a range, the "-" is understood
+literally.  If Unicode is in effect, C<\s> matches also "\x{85}",
+"\x{2028}, and "\x{2029}", see L<perlunicode> for more details about
+C<\pP>, C<\PP>, and C<\X>, and L<perluniintro> about Unicode in general.
+You can define your own C<\p> and C<\P> properties, see L<perlunicode>.
+X<\w> X<\W> X<word>
+
+The POSIX character class syntax
+X<character class>
+
+    [:class:]
+
+is also available.  The available classes and their backslash
+equivalents (if available) are as follows:
+X<character class>
+X<alpha> X<alnum> X<ascii> X<blank> X<cntrl> X<digit> X<graph>
+X<lower> X<print> X<punct> X<space> X<upper> X<word> X<xdigit>
+
+    alpha
+    alnum
+    ascii
+    blank		[1]
+    cntrl
+    digit       \d
+    graph
+    lower
+    print
+    punct
+    space       \s	[2]
+    upper
+    word        \w	[3]
+    xdigit
+
+=over
+
+=item [1]
+
+A GNU extension equivalent to C<[ \t]>, "all horizontal whitespace".
+
+=item [2]
+
+Not exactly equivalent to C<\s> since the C<[[:space:]]> includes
+also the (very rare) "vertical tabulator", "\ck", chr(11).
+
+=item [3]
+
+A Perl extension, see above.
+
+=back
+
+For example use C<[:upper:]> to match all the uppercase characters.
+Note that the C<[]> are part of the C<[::]> construct, not part of the
+whole character class.  For example:
+
+    [01[:alpha:]%]
+
+matches zero, one, any alphabetic character, and the percentage sign.
+
+The following equivalences to Unicode \p{} constructs and equivalent
+backslash character classes (if available), will hold:
+X<character class> X<\p> X<\p{}>
+
+    [:...:]	\p{...}		backslash
+
+    alpha       IsAlpha
+    alnum       IsAlnum
+    ascii       IsASCII
+    blank       IsSpace
+    cntrl       IsCntrl
+    digit       IsDigit        \d
+    graph       IsGraph
+    lower       IsLower
+    print       IsPrint
+    punct       IsPunct
+    space       IsSpace
+                IsSpacePerl    \s
+    upper       IsUpper
+    word        IsWord
+    xdigit      IsXDigit
+
+For example C<[:lower:]> and C<\p{IsLower}> are equivalent.
+
+If the C<utf8> pragma is not used but the C<locale> pragma is, the
+classes correlate with the usual isalpha(3) interface (except for
+"word" and "blank").
+
+The assumedly non-obviously named classes are:
+
+=over 4
+
+=item cntrl
+X<cntrl>
+
+Any control character.  Usually characters that don't produce output as
+such but instead control the terminal somehow: for example newline and
+backspace are control characters.  All characters with ord() less than
+32 are most often classified as control characters (assuming ASCII,
+the ISO Latin character sets, and Unicode), as is the character with
+the ord() value of 127 (C<DEL>).
+
+=item graph
+X<graph>
+
+Any alphanumeric or punctuation (special) character.
+
+=item print
+X<print>
+
+Any alphanumeric or punctuation (special) character or the space character.
+
+=item punct
+X<punct>
+
+Any punctuation (special) character.
+
+=item xdigit
+X<xdigit>
+
+Any hexadecimal digit.  Though this may feel silly ([0-9A-Fa-f] would
+work just fine) it is included for completeness.
+
+=back
+
+You can negate the [::] character classes by prefixing the class name
+with a '^'. This is a Perl extension.  For example:
+X<character class, negation>
+
+    POSIX	traditional Unicode
+
+    [:^digit:]      \D      \P{IsDigit}
+    [:^space:]	    \S	    \P{IsSpace}
+    [:^word:]	    \W	    \P{IsWord}
+
+Perl respects the POSIX standard in that POSIX character classes are
+only supported within a character class.  The POSIX character classes
+[.cc.] and [=cc=] are recognized but B<not> supported and trying to
+use them will cause an error.
+
+Perl defines the following zero-width assertions:
+X<zero-width assertion> X<assertion> X<regex, zero-width assertion>
+X<regexp, zero-width assertion>
+X<regular expression, zero-width assertion>
+X<\b> X<\B> X<\A> X<\Z> X<\z> X<\G>
+
+    \b	Match a word boundary
+    \B	Match a non-(word boundary)
+    \A	Match only at beginning of string
+    \Z	Match only at end of string, or before newline at the end
+    \z	Match only at end of string
+    \G	Match only at pos() (e.g. at the end-of-match position
+        of prior m//g)
+
+A word boundary (C<\b>) is a spot between two characters
+that has a C<\w> on one side of it and a C<\W> on the other side
+of it (in either order), counting the imaginary characters off the
+beginning and end of the string as matching a C<\W>.  (Within
+character classes C<\b> represents backspace rather than a word
+boundary, just as it normally does in any double-quoted string.)
+The C<\A> and C<\Z> are just like "^" and "$", except that they
+won't match multiple times when the C</m> modifier is used, while
+"^" and "$" will match at every internal line boundary.  To match
+the actual end of the string and not ignore an optional trailing
+newline, use C<\z>.
+X<\b> X<\A> X<\Z> X<\z> X</m>
+
+The C<\G> assertion can be used to chain global matches (using
+C<m//g>), as described in L<perlop/"Regexp Quote-Like Operators">.
+It is also useful when writing C<lex>-like scanners, when you have
+several patterns that you want to match against consequent substrings
+of your string, see the previous reference.  The actual location
+where C<\G> will match can also be influenced by using C<pos()> as
+an lvalue: see L<perlfunc/pos>. Currently C<\G> is only fully
+supported when anchored to the start of the pattern; while it
+is permitted to use it elsewhere, as in C</(?<=\G..)./g>, some
+such uses (C</.\G/g>, for example) currently cause problems, and
+it is recommended that you avoid such usage for now.
+X<\G>
+
+The bracketing construct C<( ... )> creates capture buffers.  To
+refer to the digit'th buffer use \<digit> within the
+match.  Outside the match use "$" instead of "\".  (The
+\<digit> notation works in certain circumstances outside 
+the match.  See the warning below about \1 vs $1 for details.)
+Referring back to another part of the match is called a
+I<backreference>.
+X<regex, capture buffer> X<regexp, capture buffer>
+X<regular expression, capture buffer> X<backreference>
+
+There is no limit to the number of captured substrings that you may
+use.  However Perl also uses \10, \11, etc. as aliases for \010,
+\011, etc.  (Recall that 0 means octal, so \011 is the character at
+number 9 in your coded character set; which would be the 10th character,
+a horizontal tab under ASCII.)  Perl resolves this 
+ambiguity by interpreting \10 as a backreference only if at least 10 
+left parentheses have opened before it.  Likewise \11 is a 
+backreference only if at least 11 left parentheses have opened 
+before it.  And so on.  \1 through \9 are always interpreted as 
+backreferences.
+
+Examples:
+
+    s/^([^ ]*) *([^ ]*)/$2 $1/;     # swap first two words
+
+     if (/(.)\1/) {                 # find first doubled char
+         print "'$1' is the first doubled character\n";
+     }
+
+    if (/Time: (..):(..):(..)/) {   # parse out values
+	$hours = $1;
+	$minutes = $2;
+	$seconds = $3;
+    }
+
+Several special variables also refer back to portions of the previous
+match.  C<$+> returns whatever the last bracket match matched.
+C<$&> returns the entire matched string.  (At one point C<$0> did
+also, but now it returns the name of the program.)  C<$`> returns
+everything before the matched string.  C<$'> returns everything
+after the matched string. And C<$^N> contains whatever was matched by
+the most-recently closed group (submatch). C<$^N> can be used in
+extended patterns (see below), for example to assign a submatch to a
+variable. 
+X<$+> X<$^N> X<$&> X<$`> X<$'>
+
+The numbered match variables ($1, $2, $3, etc.) and the related punctuation
+set (C<$+>, C<$&>, C<$`>, C<$'>, and C<$^N>) are all dynamically scoped
+until the end of the enclosing block or until the next successful
+match, whichever comes first.  (See L<perlsyn/"Compound Statements">.)
+X<$+> X<$^N> X<$&> X<$`> X<$'>
+X<$1> X<$2> X<$3> X<$4> X<$5> X<$6> X<$7> X<$8> X<$9>
+
+
+B<NOTE>: failed matches in Perl do not reset the match variables,
+which makes it easier to write code that tests for a series of more
+specific cases and remembers the best match.
+
+B<WARNING>: Once Perl sees that you need one of C<$&>, C<$`>, or
+C<$'> anywhere in the program, it has to provide them for every
+pattern match.  This may substantially slow your program.  Perl
+uses the same mechanism to produce $1, $2, etc, so you also pay a
+price for each pattern that contains capturing parentheses.  (To
+avoid this cost while retaining the grouping behaviour, use the
+extended regular expression C<(?: ... )> instead.)  But if you never
+use C<$&>, C<$`> or C<$'>, then patterns I<without> capturing
+parentheses will not be penalized.  So avoid C<$&>, C<$'>, and C<$`>
+if you can, but if you can't (and some algorithms really appreciate
+them), once you've used them once, use them at will, because you've
+already paid the price.  As of 5.005, C<$&> is not so costly as the
+other two.
+X<$&> X<$`> X<$'>
+
+Backslashed metacharacters in Perl are alphanumeric, such as C<\b>,
+C<\w>, C<\n>.  Unlike some other regular expression languages, there
+are no backslashed symbols that aren't alphanumeric.  So anything
+that looks like \\, \(, \), \<, \>, \{, or \} is always
+interpreted as a literal character, not a metacharacter.  This was
+once used in a common idiom to disable or quote the special meanings
+of regular expression metacharacters in a string that you want to
+use for a pattern. Simply quote all non-"word" characters:
+
+    $pattern =~ s/(\W)/\\$1/g;
+
+(If C<use locale> is set, then this depends on the current locale.)
+Today it is more common to use the quotemeta() function or the C<\Q>
+metaquoting escape sequence to disable all metacharacters' special
+meanings like this:
+
+    /$unquoted\Q$quoted\E$unquoted/
+
+Beware that if you put literal backslashes (those not inside
+interpolated variables) between C<\Q> and C<\E>, double-quotish
+backslash interpolation may lead to confusing results.  If you
+I<need> to use literal backslashes within C<\Q...\E>,
+consult L<perlop/"Gory details of parsing quoted constructs">.
+
+=head2 Extended Patterns
+
+Perl also defines a consistent extension syntax for features not
+found in standard tools like B<awk> and B<lex>.  The syntax is a
+pair of parentheses with a question mark as the first thing within
+the parentheses.  The character after the question mark indicates
+the extension.
+
+The stability of these extensions varies widely.  Some have been
+part of the core language for many years.  Others are experimental
+and may change without warning or be completely removed.  Check
+the documentation on an individual feature to verify its current
+status.
+
+A question mark was chosen for this and for the minimal-matching
+construct because 1) question marks are rare in older regular
+expressions, and 2) whenever you see one, you should stop and
+"question" exactly what is going on.  That's psychology...
+
+=over 10
+
+=item C<(?#text)>
+X<(?#)>
+
+A comment.  The text is ignored.  If the C</x> modifier enables
+whitespace formatting, a simple C<#> will suffice.  Note that Perl closes
+the comment as soon as it sees a C<)>, so there is no way to put a literal
+C<)> in the comment.
+
+=item C<(?imsx-imsx)>
+X<(?)>
+
+One or more embedded pattern-match modifiers, to be turned on (or
+turned off, if preceded by C<->) for the remainder of the pattern or
+the remainder of the enclosing pattern group (if any). This is
+particularly useful for dynamic patterns, such as those read in from a
+configuration file, read in as an argument, are specified in a table
+somewhere, etc.  Consider the case that some of which want to be case
+sensitive and some do not.  The case insensitive ones need to include
+merely C<(?i)> at the front of the pattern.  For example:
+
+    $pattern = "foobar";
+    if ( /$pattern/i ) { } 
+
+    # more flexible:
+
+    $pattern = "(?i)foobar";
+    if ( /$pattern/ ) { } 
+
+These modifiers are restored at the end of the enclosing group. For example,
+
+    ( (?i) blah ) \s+ \1
+
+will match a repeated (I<including the case>!) word C<blah> in any
+case, assuming C<x> modifier, and no C<i> modifier outside this
+group.
+
+=item C<(?:pattern)>
+X<(?:)>
+
+=item C<(?imsx-imsx:pattern)>
+
+This is for clustering, not capturing; it groups subexpressions like
+"()", but doesn't make backreferences as "()" does.  So
+
+    @fields = split(/\b(?:a|b|c)\b/)
+
+is like
+
+    @fields = split(/\b(a|b|c)\b/)
+
+but doesn't spit out extra fields.  It's also cheaper not to capture
+characters if you don't need to.
+
+Any letters between C<?> and C<:> act as flags modifiers as with
+C<(?imsx-imsx)>.  For example, 
+
+    /(?s-i:more.*than).*million/i
+
+is equivalent to the more verbose
+
+    /(?:(?s-i)more.*than).*million/i
+
+=item C<(?=pattern)>
+X<(?=)> X<look-ahead, positive> X<lookahead, positive>
+
+A zero-width positive look-ahead assertion.  For example, C</\w+(?=\t)/>
+matches a word followed by a tab, without including the tab in C<$&>.
+
+=item C<(?!pattern)>
+X<(?!)> X<look-ahead, negative> X<lookahead, negative>
+
+A zero-width negative look-ahead assertion.  For example C</foo(?!bar)/>
+matches any occurrence of "foo" that isn't followed by "bar".  Note
+however that look-ahead and look-behind are NOT the same thing.  You cannot
+use this for look-behind.
+
+If you are looking for a "bar" that isn't preceded by a "foo", C</(?!foo)bar/>
+will not do what you want.  That's because the C<(?!foo)> is just saying that
+the next thing cannot be "foo"--and it's not, it's a "bar", so "foobar" will
+match.  You would have to do something like C</(?!foo)...bar/> for that.   We
+say "like" because there's the case of your "bar" not having three characters
+before it.  You could cover that this way: C</(?:(?!foo)...|^.{0,2})bar/>.
+Sometimes it's still easier just to say:
+
+    if (/bar/ && $` !~ /foo$/)
+
+For look-behind see below.
+
+=item C<(?<=pattern)>
+X<(?<=)> X<look-behind, positive> X<lookbehind, positive>
+
+A zero-width positive look-behind assertion.  For example, C</(?<=\t)\w+/>
+matches a word that follows a tab, without including the tab in C<$&>.
+Works only for fixed-width look-behind.
+
+=item C<(?<!pattern)>
+X<(?<!)> X<look-behind, negative> X<lookbehind, negative>
+
+A zero-width negative look-behind assertion.  For example C</(?<!bar)foo/>
+matches any occurrence of "foo" that does not follow "bar".  Works
+only for fixed-width look-behind.
+
+=item C<(?{ code })>
+X<(?{})> X<regex, code in> X<regexp, code in> X<regular expression, code in>
+
+B<WARNING>: This extended regular expression feature is considered
+highly experimental, and may be changed or deleted without notice.
+
+This zero-width assertion evaluates any embedded Perl code.  It
+always succeeds, and its C<code> is not interpolated.  Currently,
+the rules to determine where the C<code> ends are somewhat convoluted.
+
+This feature can be used together with the special variable C<$^N> to
+capture the results of submatches in variables without having to keep
+track of the number of nested parentheses. For example:
+
+  $_ = "The brown fox jumps over the lazy dog";
+  /the (\S+)(?{ $color = $^N }) (\S+)(?{ $animal = $^N })/i;
+  print "color = $color, animal = $animal\n";
+
+Inside the C<(?{...})> block, C<$_> refers to the string the regular
+expression is matching against. You can also use C<pos()> to know what is
+the current position of matching within this string.
+
+The C<code> is properly scoped in the following sense: If the assertion
+is backtracked (compare L<"Backtracking">), all changes introduced after
+C<local>ization are undone, so that
+
+  $_ = 'a' x 8;
+  m< 
+     (?{ $cnt = 0 })			# Initialize $cnt.
+     (
+       a 
+       (?{
+           local $cnt = $cnt + 1;	# Update $cnt, backtracking-safe.
+       })
+     )*  
+     aaaa
+     (?{ $res = $cnt })			# On success copy to non-localized
+					# location.
+   >x;
+
+will set C<$res = 4>.  Note that after the match, $cnt returns to the globally
+introduced value, because the scopes that restrict C<local> operators
+are unwound.
+
+This assertion may be used as a C<(?(condition)yes-pattern|no-pattern)>
+switch.  If I<not> used in this way, the result of evaluation of
+C<code> is put into the special variable C<$^R>.  This happens
+immediately, so C<$^R> can be used from other C<(?{ code })> assertions
+inside the same regular expression.
+
+The assignment to C<$^R> above is properly localized, so the old
+value of C<$^R> is restored if the assertion is backtracked; compare
+L<"Backtracking">.
+
+For reasons of security, this construct is forbidden if the regular
+expression involves run-time interpolation of variables, unless the
+perilous C<use re 'eval'> pragma has been used (see L<re>), or the
+variables contain results of C<qr//> operator (see
+L<perlop/"qr/STRING/imosx">).  
+
+This restriction is because of the wide-spread and remarkably convenient
+custom of using run-time determined strings as patterns.  For example:
+
+    $re = <>;
+    chomp $re;
+    $string =~ /$re/;
+
+Before Perl knew how to execute interpolated code within a pattern,
+this operation was completely safe from a security point of view,
+although it could raise an exception from an illegal pattern.  If
+you turn on the C<use re 'eval'>, though, it is no longer secure,
+so you should only do so if you are also using taint checking.
+Better yet, use the carefully constrained evaluation within a Safe
+compartment.  See L<perlsec> for details about both these mechanisms.
+
+=item C<(??{ code })>
+X<(??{})>
+X<regex, postponed> X<regexp, postponed> X<regular expression, postponed>
+X<regex, recursive> X<regexp, recursive> X<regular expression, recursive>
+
+B<WARNING>: This extended regular expression feature is considered
+highly experimental, and may be changed or deleted without notice.
+A simplified version of the syntax may be introduced for commonly
+used idioms.
+
+This is a "postponed" regular subexpression.  The C<code> is evaluated
+at run time, at the moment this subexpression may match.  The result
+of evaluation is considered as a regular expression and matched as
+if it were inserted instead of this construct.
+
+The C<code> is not interpolated.  As before, the rules to determine
+where the C<code> ends are currently somewhat convoluted.
+
+The following pattern matches a parenthesized group:
+
+  $re = qr{
+	     \(
+	     (?:
+		(?> [^()]+ )	# Non-parens without backtracking
+	      |
+		(??{ $re })	# Group with matching parens
+	     )*
+	     \)
+	  }x;
+
+=item C<< (?>pattern) >>
+X<backtrack> X<backtracking>
+
+B<WARNING>: This extended regular expression feature is considered
+highly experimental, and may be changed or deleted without notice.
+
+An "independent" subexpression, one which matches the substring
+that a I<standalone> C<pattern> would match if anchored at the given
+position, and it matches I<nothing other than this substring>.  This
+construct is useful for optimizations of what would otherwise be
+"eternal" matches, because it will not backtrack (see L<"Backtracking">).
+It may also be useful in places where the "grab all you can, and do not
+give anything back" semantic is desirable.
+
+For example: C<< ^(?>a*)ab >> will never match, since C<< (?>a*) >>
+(anchored at the beginning of string, as above) will match I<all>
+characters C<a> at the beginning of string, leaving no C<a> for
+C<ab> to match.  In contrast, C<a*ab> will match the same as C<a+b>,
+since the match of the subgroup C<a*> is influenced by the following
+group C<ab> (see L<"Backtracking">).  In particular, C<a*> inside
+C<a*ab> will match fewer characters than a standalone C<a*>, since
+this makes the tail match.
+
+An effect similar to C<< (?>pattern) >> may be achieved by writing
+C<(?=(pattern))\1>.  This matches the same substring as a standalone
+C<a+>, and the following C<\1> eats the matched string; it therefore
+makes a zero-length assertion into an analogue of C<< (?>...) >>.
+(The difference between these two constructs is that the second one
+uses a capturing group, thus shifting ordinals of backreferences
+in the rest of a regular expression.)
+
+Consider this pattern:
+
+    m{ \(
+	  ( 
+	    [^()]+		# x+
+          | 
+            \( [^()]* \)
+          )+
+       \) 
+     }x
+
+That will efficiently match a nonempty group with matching parentheses
+two levels deep or less.  However, if there is no such group, it
+will take virtually forever on a long string.  That's because there
+are so many different ways to split a long string into several
+substrings.  This is what C<(.+)+> is doing, and C<(.+)+> is similar
+to a subpattern of the above pattern.  Consider how the pattern
+above detects no-match on C<((()aaaaaaaaaaaaaaaaaa> in several
+seconds, but that each extra letter doubles this time.  This
+exponential performance will make it appear that your program has
+hung.  However, a tiny change to this pattern
+
+    m{ \( 
+	  ( 
+	    (?> [^()]+ )	# change x+ above to (?> x+ )
+          | 
+            \( [^()]* \)
+          )+
+       \) 
+     }x
+
+which uses C<< (?>...) >> matches exactly when the one above does (verifying
+this yourself would be a productive exercise), but finishes in a fourth
+the time when used on a similar string with 1000000 C<a>s.  Be aware,
+however, that this pattern currently triggers a warning message under
+the C<use warnings> pragma or B<-w> switch saying it
+C<"matches null string many times in regex">.
+
+On simple groups, such as the pattern C<< (?> [^()]+ ) >>, a comparable
+effect may be achieved by negative look-ahead, as in C<[^()]+ (?! [^()] )>.
+This was only 4 times slower on a string with 1000000 C<a>s.
+
+The "grab all you can, and do not give anything back" semantic is desirable
+in many situations where on the first sight a simple C<()*> looks like
+the correct solution.  Suppose we parse text with comments being delimited
+by C<#> followed by some optional (horizontal) whitespace.  Contrary to
+its appearance, C<#[ \t]*> I<is not> the correct subexpression to match
+the comment delimiter, because it may "give up" some whitespace if
+the remainder of the pattern can be made to match that way.  The correct
+answer is either one of these:
+
+    (?>#[ \t]*)
+    #[ \t]*(?![ \t])
+
+For example, to grab non-empty comments into $1, one should use either
+one of these:
+
+    / (?> \# [ \t]* ) (        .+ ) /x;
+    /     \# [ \t]*   ( [^ \t] .* ) /x;
+
+Which one you pick depends on which of these expressions better reflects
+the above specification of comments.
+
+=item C<(?(condition)yes-pattern|no-pattern)>
+X<(?()>
+
+=item C<(?(condition)yes-pattern)>
+
+B<WARNING>: This extended regular expression feature is considered
+highly experimental, and may be changed or deleted without notice.
+
+Conditional expression.  C<(condition)> should be either an integer in
+parentheses (which is valid if the corresponding pair of parentheses
+matched), or look-ahead/look-behind/evaluate zero-width assertion.
+
+For example:
+
+    m{ ( \( )? 
+       [^()]+ 
+       (?(1) \) ) 
+     }x
+
+matches a chunk of non-parentheses, possibly included in parentheses
+themselves.
+
+=back
+
+=head2 Backtracking
+X<backtrack> X<backtracking>
+
+NOTE: This section presents an abstract approximation of regular
+expression behavior.  For a more rigorous (and complicated) view of
+the rules involved in selecting a match among possible alternatives,
+see L<Combining pieces together>.
+
+A fundamental feature of regular expression matching involves the
+notion called I<backtracking>, which is currently used (when needed)
+by all regular expression quantifiers, namely C<*>, C<*?>, C<+>,
+C<+?>, C<{n,m}>, and C<{n,m}?>.  Backtracking is often optimized
+internally, but the general principle outlined here is valid.
+
+For a regular expression to match, the I<entire> regular expression must
+match, not just part of it.  So if the beginning of a pattern containing a
+quantifier succeeds in a way that causes later parts in the pattern to
+fail, the matching engine backs up and recalculates the beginning
+part--that's why it's called backtracking.
+
+Here is an example of backtracking:  Let's say you want to find the
+word following "foo" in the string "Food is on the foo table.":
+
+    $_ = "Food is on the foo table.";
+    if ( /\b(foo)\s+(\w+)/i ) {
+	print "$2 follows $1.\n";
+    }
+
+When the match runs, the first part of the regular expression (C<\b(foo)>)
+finds a possible match right at the beginning of the string, and loads up
+$1 with "Foo".  However, as soon as the matching engine sees that there's
+no whitespace following the "Foo" that it had saved in $1, it realizes its
+mistake and starts over again one character after where it had the
+tentative match.  This time it goes all the way until the next occurrence
+of "foo". The complete regular expression matches this time, and you get
+the expected output of "table follows foo."
+
+Sometimes minimal matching can help a lot.  Imagine you'd like to match
+everything between "foo" and "bar".  Initially, you write something
+like this:
+
+    $_ =  "The food is under the bar in the barn.";
+    if ( /foo(.*)bar/ ) {
+	print "got <$1>\n";
+    }
+
+Which perhaps unexpectedly yields:
+
+  got <d is under the bar in the >
+
+That's because C<.*> was greedy, so you get everything between the
+I<first> "foo" and the I<last> "bar".  Here it's more effective
+to use minimal matching to make sure you get the text between a "foo"
+and the first "bar" thereafter.
+
+    if ( /foo(.*?)bar/ ) { print "got <$1>\n" }
+  got <d is under the >
+
+Here's another example: let's say you'd like to match a number at the end
+of a string, and you also want to keep the preceding part of the match.
+So you write this:
+
+    $_ = "I have 2 numbers: 53147";
+    if ( /(.*)(\d*)/ ) {				# Wrong!
+	print "Beginning is <$1>, number is <$2>.\n";
+    }
+
+That won't work at all, because C<.*> was greedy and gobbled up the
+whole string. As C<\d*> can match on an empty string the complete
+regular expression matched successfully.
+
+    Beginning is <I have 2 numbers: 53147>, number is <>.
+
+Here are some variants, most of which don't work:
+
+    $_ = "I have 2 numbers: 53147";
+    @pats = qw{
+	(.*)(\d*)
+	(.*)(\d+)
+	(.*?)(\d*)
+	(.*?)(\d+)
+	(.*)(\d+)$
+	(.*?)(\d+)$
+	(.*)\b(\d+)$
+	(.*\D)(\d+)$
+    };
+
+    for $pat (@pats) {
+	printf "%-12s ", $pat;
+	if ( /$pat/ ) {
+	    print "<$1> <$2>\n";
+	} else {
+	    print "FAIL\n";
+	}
+    }
+
+That will print out:
+
+    (.*)(\d*)    <I have 2 numbers: 53147> <>
+    (.*)(\d+)    <I have 2 numbers: 5314> <7>
+    (.*?)(\d*)   <> <>
+    (.*?)(\d+)   <I have > <2>
+    (.*)(\d+)$   <I have 2 numbers: 5314> <7>
+    (.*?)(\d+)$  <I have 2 numbers: > <53147>
+    (.*)\b(\d+)$ <I have 2 numbers: > <53147>
+    (.*\D)(\d+)$ <I have 2 numbers: > <53147>
+
+As you see, this can be a bit tricky.  It's important to realize that a
+regular expression is merely a set of assertions that gives a definition
+of success.  There may be 0, 1, or several different ways that the
+definition might succeed against a particular string.  And if there are
+multiple ways it might succeed, you need to understand backtracking to
+know which variety of success you will achieve.
+
+When using look-ahead assertions and negations, this can all get even
+trickier.  Imagine you'd like to find a sequence of non-digits not
+followed by "123".  You might try to write that as
+
+    $_ = "ABC123";
+    if ( /^\D*(?!123)/ ) {		# Wrong!
+	print "Yup, no 123 in $_\n";
+    }
+
+But that isn't going to match; at least, not the way you're hoping.  It
+claims that there is no 123 in the string.  Here's a clearer picture of
+why that pattern matches, contrary to popular expectations:
+
+    $x = 'ABC123';
+    $y = 'ABC445';
+
+    print "1: got $1\n" if $x =~ /^(ABC)(?!123)/;
+    print "2: got $1\n" if $y =~ /^(ABC)(?!123)/;
+
+    print "3: got $1\n" if $x =~ /^(\D*)(?!123)/;
+    print "4: got $1\n" if $y =~ /^(\D*)(?!123)/;
+
+This prints
+
+    2: got ABC
+    3: got AB
+    4: got ABC
+
+You might have expected test 3 to fail because it seems to a more
+general purpose version of test 1.  The important difference between
+them is that test 3 contains a quantifier (C<\D*>) and so can use
+backtracking, whereas test 1 will not.  What's happening is
+that you've asked "Is it true that at the start of $x, following 0 or more
+non-digits, you have something that's not 123?"  If the pattern matcher had
+let C<\D*> expand to "ABC", this would have caused the whole pattern to
+fail.
+
+The search engine will initially match C<\D*> with "ABC".  Then it will
+try to match C<(?!123> with "123", which fails.  But because
+a quantifier (C<\D*>) has been used in the regular expression, the
+search engine can backtrack and retry the match differently
+in the hope of matching the complete regular expression.
+
+The pattern really, I<really> wants to succeed, so it uses the
+standard pattern back-off-and-retry and lets C<\D*> expand to just "AB" this
+time.  Now there's indeed something following "AB" that is not
+"123".  It's "C123", which suffices.
+
+We can deal with this by using both an assertion and a negation.
+We'll say that the first part in $1 must be followed both by a digit
+and by something that's not "123".  Remember that the look-aheads
+are zero-width expressions--they only look, but don't consume any
+of the string in their match.  So rewriting this way produces what
+you'd expect; that is, case 5 will fail, but case 6 succeeds:
+
+    print "5: got $1\n" if $x =~ /^(\D*)(?=\d)(?!123)/;
+    print "6: got $1\n" if $y =~ /^(\D*)(?=\d)(?!123)/;
+
+    6: got ABC
+
+In other words, the two zero-width assertions next to each other work as though
+they're ANDed together, just as you'd use any built-in assertions:  C</^$/>
+matches only if you're at the beginning of the line AND the end of the
+line simultaneously.  The deeper underlying truth is that juxtaposition in
+regular expressions always means AND, except when you write an explicit OR
+using the vertical bar.  C</ab/> means match "a" AND (then) match "b",
+although the attempted matches are made at different positions because "a"
+is not a zero-width assertion, but a one-width assertion.
+
+B<WARNING>: particularly complicated regular expressions can take
+exponential time to solve because of the immense number of possible
+ways they can use backtracking to try match.  For example, without
+internal optimizations done by the regular expression engine, this will
+take a painfully long time to run:
+
+    'aaaaaaaaaaaa' =~ /((a{0,5}){0,5})*[c]/
+
+And if you used C<*>'s in the internal groups instead of limiting them
+to 0 through 5 matches, then it would take forever--or until you ran
+out of stack space.  Moreover, these internal optimizations are not
+always applicable.  For example, if you put C<{0,5}> instead of C<*>
+on the external group, no current optimization is applicable, and the
+match takes a long time to finish.
+
+A powerful tool for optimizing such beasts is what is known as an
+"independent group",
+which does not backtrack (see L<C<< (?>pattern) >>>).  Note also that
+zero-length look-ahead/look-behind assertions will not backtrack to make
+the tail match, since they are in "logical" context: only 
+whether they match is considered relevant.  For an example
+where side-effects of look-ahead I<might> have influenced the
+following match, see L<C<< (?>pattern) >>>.
+
+=head2 Version 8 Regular Expressions
+X<regular expression, version 8> X<regex, version 8> X<regexp, version 8>
+
+In case you're not familiar with the "regular" Version 8 regex
+routines, here are the pattern-matching rules not described above.
+
+Any single character matches itself, unless it is a I<metacharacter>
+with a special meaning described here or above.  You can cause
+characters that normally function as metacharacters to be interpreted
+literally by prefixing them with a "\" (e.g., "\." matches a ".", not any
+character; "\\" matches a "\").  A series of characters matches that
+series of characters in the target string, so the pattern C<blurfl>
+would match "blurfl" in the target string.
+
+You can specify a character class, by enclosing a list of characters
+in C<[]>, which will match any one character from the list.  If the
+first character after the "[" is "^", the class matches any character not
+in the list.  Within a list, the "-" character specifies a
+range, so that C<a-z> represents all characters between "a" and "z",
+inclusive.  If you want either "-" or "]" itself to be a member of a
+class, put it at the start of the list (possibly after a "^"), or
+escape it with a backslash.  "-" is also taken literally when it is
+at the end of the list, just before the closing "]".  (The
+following all specify the same class of three characters: C<[-az]>,
+C<[az-]>, and C<[a\-z]>.  All are different from C<[a-z]>, which
+specifies a class containing twenty-six characters, even on EBCDIC
+based coded character sets.)  Also, if you try to use the character 
+classes C<\w>, C<\W>, C<\s>, C<\S>, C<\d>, or C<\D> as endpoints of 
+a range, that's not a range, the "-" is understood literally.
+
+Note also that the whole range idea is rather unportable between
+character sets--and even within character sets they may cause results
+you probably didn't expect.  A sound principle is to use only ranges
+that begin from and end at either alphabets of equal case ([a-e],
+[A-E]), or digits ([0-9]).  Anything else is unsafe.  If in doubt,
+spell out the character sets in full.
+
+Characters may be specified using a metacharacter syntax much like that
+used in C: "\n" matches a newline, "\t" a tab, "\r" a carriage return,
+"\f" a form feed, etc.  More generally, \I<nnn>, where I<nnn> is a string
+of octal digits, matches the character whose coded character set value 
+is I<nnn>.  Similarly, \xI<nn>, where I<nn> are hexadecimal digits, 
+matches the character whose numeric value is I<nn>. The expression \cI<x> 
+matches the character control-I<x>.  Finally, the "." metacharacter 
+matches any character except "\n" (unless you use C</s>).
+
+You can specify a series of alternatives for a pattern using "|" to
+separate them, so that C<fee|fie|foe> will match any of "fee", "fie",
+or "foe" in the target string (as would C<f(e|i|o)e>).  The
+first alternative includes everything from the last pattern delimiter
+("(", "[", or the beginning of the pattern) up to the first "|", and
+the last alternative contains everything from the last "|" to the next
+pattern delimiter.  That's why it's common practice to include
+alternatives in parentheses: to minimize confusion about where they
+start and end.
+
+Alternatives are tried from left to right, so the first
+alternative found for which the entire expression matches, is the one that
+is chosen. This means that alternatives are not necessarily greedy. For
+example: when matching C<foo|foot> against "barefoot", only the "foo"
+part will match, as that is the first alternative tried, and it successfully
+matches the target string. (This might not seem important, but it is
+important when you are capturing matched text using parentheses.)
+
+Also remember that "|" is interpreted as a literal within square brackets,
+so if you write C<[fee|fie|foe]> you're really only matching C<[feio|]>.
+
+Within a pattern, you may designate subpatterns for later reference
+by enclosing them in parentheses, and you may refer back to the
+I<n>th subpattern later in the pattern using the metacharacter
+\I<n>.  Subpatterns are numbered based on the left to right order
+of their opening parenthesis.  A backreference matches whatever
+actually matched the subpattern in the string being examined, not
+the rules for that subpattern.  Therefore, C<(0|0x)\d*\s\1\d*> will
+match "0x1234 0x4321", but not "0x1234 01234", because subpattern
+1 matched "0x", even though the rule C<0|0x> could potentially match
+the leading 0 in the second number.
+
+=head2 Warning on \1 vs $1
+
+Some people get too used to writing things like:
+
+    $pattern =~ s/(\W)/\\\1/g;
+
+This is grandfathered for the RHS of a substitute to avoid shocking the
+B<sed> addicts, but it's a dirty habit to get into.  That's because in
+PerlThink, the righthand side of an C<s///> is a double-quoted string.  C<\1> in
+the usual double-quoted string means a control-A.  The customary Unix
+meaning of C<\1> is kludged in for C<s///>.  However, if you get into the habit
+of doing that, you get yourself into trouble if you then add an C</e>
+modifier.
+
+    s/(\d+)/ \1 + 1 /eg;    	# causes warning under -w
+
+Or if you try to do
+
+    s/(\d+)/\1000/;
+
+You can't disambiguate that by saying C<\{1}000>, whereas you can fix it with
+C<${1}000>.  The operation of interpolation should not be confused
+with the operation of matching a backreference.  Certainly they mean two
+different things on the I<left> side of the C<s///>.
+
+=head2 Repeated patterns matching zero-length substring
+
+B<WARNING>: Difficult material (and prose) ahead.  This section needs a rewrite.
+
+Regular expressions provide a terse and powerful programming language.  As
+with most other power tools, power comes together with the ability
+to wreak havoc.
+
+A common abuse of this power stems from the ability to make infinite
+loops using regular expressions, with something as innocuous as:
+
+    'foo' =~ m{ ( o? )* }x;
+
+The C<o?> can match at the beginning of C<'foo'>, and since the position
+in the string is not moved by the match, C<o?> would match again and again
+because of the C<*> modifier.  Another common way to create a similar cycle
+is with the looping modifier C<//g>:
+
+    @matches = ( 'foo' =~ m{ o? }xg );
+
+or
+
+    print "match: <$&>\n" while 'foo' =~ m{ o? }xg;
+
+or the loop implied by split().
+
+However, long experience has shown that many programming tasks may
+be significantly simplified by using repeated subexpressions that
+may match zero-length substrings.  Here's a simple example being:
+
+    @chars = split //, $string;		  # // is not magic in split
+    ($whitewashed = $string) =~ s/()/ /g; # parens avoid magic s// /
+
+Thus Perl allows such constructs, by I<forcefully breaking
+the infinite loop>.  The rules for this are different for lower-level
+loops given by the greedy modifiers C<*+{}>, and for higher-level
+ones like the C</g> modifier or split() operator.
+
+The lower-level loops are I<interrupted> (that is, the loop is
+broken) when Perl detects that a repeated expression matched a
+zero-length substring.   Thus
+
+   m{ (?: NON_ZERO_LENGTH | ZERO_LENGTH )* }x;
+
+is made equivalent to 
+
+   m{   (?: NON_ZERO_LENGTH )* 
+      | 
+        (?: ZERO_LENGTH )? 
+    }x;
+
+The higher level-loops preserve an additional state between iterations:
+whether the last match was zero-length.  To break the loop, the following 
+match after a zero-length match is prohibited to have a length of zero.
+This prohibition interacts with backtracking (see L<"Backtracking">), 
+and so the I<second best> match is chosen if the I<best> match is of
+zero length.
+
+For example:
+
+    $_ = 'bar';
+    s/\w??/<$&>/g;
+
+results in C<< <><b><><a><><r><> >>.  At each position of the string the best
+match given by non-greedy C<??> is the zero-length match, and the I<second 
+best> match is what is matched by C<\w>.  Thus zero-length matches
+alternate with one-character-long matches.
+
+Similarly, for repeated C<m/()/g> the second-best match is the match at the 
+position one notch further in the string.
+
+The additional state of being I<matched with zero-length> is associated with
+the matched string, and is reset by each assignment to pos().
+Zero-length matches at the end of the previous match are ignored
+during C<split>.
+
+=head2 Combining pieces together
+
+Each of the elementary pieces of regular expressions which were described
+before (such as C<ab> or C<\Z>) could match at most one substring
+at the given position of the input string.  However, in a typical regular
+expression these elementary pieces are combined into more complicated
+patterns using combining operators C<ST>, C<S|T>, C<S*> etc
+(in these examples C<S> and C<T> are regular subexpressions).
+
+Such combinations can include alternatives, leading to a problem of choice:
+if we match a regular expression C<a|ab> against C<"abc">, will it match
+substring C<"a"> or C<"ab">?  One way to describe which substring is
+actually matched is the concept of backtracking (see L<"Backtracking">).
+However, this description is too low-level and makes you think
+in terms of a particular implementation.
+
+Another description starts with notions of "better"/"worse".  All the
+substrings which may be matched by the given regular expression can be
+sorted from the "best" match to the "worst" match, and it is the "best"
+match which is chosen.  This substitutes the question of "what is chosen?"
+by the question of "which matches are better, and which are worse?".
+
+Again, for elementary pieces there is no such question, since at most
+one match at a given position is possible.  This section describes the
+notion of better/worse for combining operators.  In the description
+below C<S> and C<T> are regular subexpressions.
+
+=over 4
+
+=item C<ST>
+
+Consider two possible matches, C<AB> and C<A'B'>, C<A> and C<A'> are
+substrings which can be matched by C<S>, C<B> and C<B'> are substrings
+which can be matched by C<T>. 
+
+If C<A> is better match for C<S> than C<A'>, C<AB> is a better
+match than C<A'B'>.
+
+If C<A> and C<A'> coincide: C<AB> is a better match than C<AB'> if
+C<B> is better match for C<T> than C<B'>.
+
+=item C<S|T>
+
+When C<S> can match, it is a better match than when only C<T> can match.
+
+Ordering of two matches for C<S> is the same as for C<S>.  Similar for
+two matches for C<T>.
+
+=item C<S{REPEAT_COUNT}>
+
+Matches as C<SSS...S> (repeated as many times as necessary).
+
+=item C<S{min,max}>
+
+Matches as C<S{max}|S{max-1}|...|S{min+1}|S{min}>.
+
+=item C<S{min,max}?>
+
+Matches as C<S{min}|S{min+1}|...|S{max-1}|S{max}>.
+
+=item C<S?>, C<S*>, C<S+>
+
+Same as C<S{0,1}>, C<S{0,BIG_NUMBER}>, C<S{1,BIG_NUMBER}> respectively.
+
+=item C<S??>, C<S*?>, C<S+?>
+
+Same as C<S{0,1}?>, C<S{0,BIG_NUMBER}?>, C<S{1,BIG_NUMBER}?> respectively.
+
+=item C<< (?>S) >>
+
+Matches the best match for C<S> and only that.
+
+=item C<(?=S)>, C<(?<=S)>
+
+Only the best match for C<S> is considered.  (This is important only if
+C<S> has capturing parentheses, and backreferences are used somewhere
+else in the whole regular expression.)
+
+=item C<(?!S)>, C<(?<!S)>
+
+For this grouping operator there is no need to describe the ordering, since
+only whether or not C<S> can match is important.
+
+=item C<(??{ EXPR })>
+
+The ordering is the same as for the regular expression which is
+the result of EXPR.
+
+=item C<(?(condition)yes-pattern|no-pattern)>
+
+Recall that which of C<yes-pattern> or C<no-pattern> actually matches is
+already determined.  The ordering of the matches is the same as for the
+chosen subexpression.
+
+=back
+
+The above recipes describe the ordering of matches I<at a given position>.
+One more rule is needed to understand how a match is determined for the
+whole regular expression: a match at an earlier position is always better
+than a match at a later position.
+
+=head2 Creating custom RE engines
+
+Overloaded constants (see L<overload>) provide a simple way to extend
+the functionality of the RE engine.
+
+Suppose that we want to enable a new RE escape-sequence C<\Y|> which
+matches at boundary between whitespace characters and non-whitespace
+characters.  Note that C<(?=\S)(?<!\S)|(?!\S)(?<=\S)> matches exactly
+at these positions, so we want to have each C<\Y|> in the place of the
+more complicated version.  We can create a module C<customre> to do
+this:
+
+    package customre;
+    use overload;
+
+    sub import {
+      shift;
+      die "No argument to customre::import allowed" if @_;
+      overload::constant 'qr' => \&convert;
+    }
+
+    sub invalid { die "/$_[0]/: invalid escape '\\$_[1]'"}
+
+    # We must also take care of not escaping the legitimate \\Y|
+    # sequence, hence the presence of '\\' in the conversion rules.
+    my %rules = ( '\\' => '\\\\', 
+		  'Y|' => qr/(?=\S)(?<!\S)|(?!\S)(?<=\S)/ );
+    sub convert {
+      my $re = shift;
+      $re =~ s{ 
+                \\ ( \\ | Y . )
+              }
+              { $rules{$1} or invalid($re,$1) }sgex; 
+      return $re;
+    }
+
+Now C<use customre> enables the new escape in constant regular
+expressions, i.e., those without any runtime variable interpolations.
+As documented in L<overload>, this conversion will work only over
+literal parts of regular expressions.  For C<\Y|$re\Y|> the variable
+part of this regular expression needs to be converted explicitly
+(but only if the special meaning of C<\Y|> should be enabled inside $re):
+
+    use customre;
+    $re = <>;
+    chomp $re;
+    $re = customre::convert $re;
+    /\Y|$re\Y|/;
+
+=head1 BUGS
+
+This document varies from difficult to understand to completely
+and utterly opaque.  The wandering prose riddled with jargon is
+hard to fathom in several places.
+
+This document needs a rewrite that separates the tutorial content
+from the reference content.
+
+=head1 SEE ALSO
+
+L<perlrequick>.
+
+L<perlretut>.
+
+L<perlop/"Regexp Quote-Like Operators">.
+
+L<perlop/"Gory details of parsing quoted constructs">.
+
+L<perlfaq6>.
+
+L<perlfunc/pos>.
+
+L<perllocale>.
+
+L<perlebcdic>.
+
+I<Mastering Regular Expressions> by Jeffrey Friedl, published
+by O'Reilly and Associates.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlref.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlref.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlref.pod	(revision 14489)
@@ -0,0 +1,742 @@
+=head1 NAME
+X<reference> X<pointer> X<data structure> X<structure> X<struct>
+
+perlref - Perl references and nested data structures
+
+=head1 NOTE
+
+This is complete documentation about all aspects of references.
+For a shorter, tutorial introduction to just the essential features,
+see L<perlreftut>.
+
+=head1 DESCRIPTION
+
+Before release 5 of Perl it was difficult to represent complex data
+structures, because all references had to be symbolic--and even then
+it was difficult to refer to a variable instead of a symbol table entry.
+Perl now not only makes it easier to use symbolic references to variables,
+but also lets you have "hard" references to any piece of data or code.
+Any scalar may hold a hard reference.  Because arrays and hashes contain
+scalars, you can now easily build arrays of arrays, arrays of hashes,
+hashes of arrays, arrays of hashes of functions, and so on.
+
+Hard references are smart--they keep track of reference counts for you,
+automatically freeing the thing referred to when its reference count goes
+to zero.  (Reference counts for values in self-referential or
+cyclic data structures may not go to zero without a little help; see
+L<perlobj/"Two-Phased Garbage Collection"> for a detailed explanation.)
+If that thing happens to be an object, the object is destructed.  See
+L<perlobj> for more about objects.  (In a sense, everything in Perl is an
+object, but we usually reserve the word for references to objects that
+have been officially "blessed" into a class package.)
+
+Symbolic references are names of variables or other objects, just as a
+symbolic link in a Unix filesystem contains merely the name of a file.
+The C<*glob> notation is something of a symbolic reference.  (Symbolic
+references are sometimes called "soft references", but please don't call
+them that; references are confusing enough without useless synonyms.)
+X<reference, symbolic> X<reference, soft>
+X<symbolic reference> X<soft reference>
+
+In contrast, hard references are more like hard links in a Unix file
+system: They are used to access an underlying object without concern for
+what its (other) name is.  When the word "reference" is used without an
+adjective, as in the following paragraph, it is usually talking about a
+hard reference.
+X<reference, hard> X<hard reference>
+
+References are easy to use in Perl.  There is just one overriding
+principle: Perl does no implicit referencing or dereferencing.  When a
+scalar is holding a reference, it always behaves as a simple scalar.  It
+doesn't magically start being an array or hash or subroutine; you have to
+tell it explicitly to do so, by dereferencing it.
+
+=head2 Making References
+X<reference, creation> X<referencing>
+
+References can be created in several ways.
+
+=over 4
+
+=item 1.
+X<\> X<backslash>
+
+By using the backslash operator on a variable, subroutine, or value.
+(This works much like the & (address-of) operator in C.)  
+This typically creates I<another> reference to a variable, because
+there's already a reference to the variable in the symbol table.  But
+the symbol table reference might go away, and you'll still have the
+reference that the backslash returned.  Here are some examples:
+
+    $scalarref = \$foo;
+    $arrayref  = \@ARGV;
+    $hashref   = \%ENV;
+    $coderef   = \&handler;
+    $globref   = \*foo;
+
+It isn't possible to create a true reference to an IO handle (filehandle
+or dirhandle) using the backslash operator.  The most you can get is a
+reference to a typeglob, which is actually a complete symbol table entry.
+But see the explanation of the C<*foo{THING}> syntax below.  However,
+you can still use type globs and globrefs as though they were IO handles.
+
+=item 2.
+X<array, anonymous> X<[> X<[]> X<square bracket>
+X<bracket, square> X<arrayref> X<array reference> X<reference, array>
+
+A reference to an anonymous array can be created using square
+brackets:
+
+    $arrayref = [1, 2, ['a', 'b', 'c']];
+
+Here we've created a reference to an anonymous array of three elements
+whose final element is itself a reference to another anonymous array of three
+elements.  (The multidimensional syntax described later can be used to
+access this.  For example, after the above, C<< $arrayref->[2][1] >> would have
+the value "b".)
+
+Taking a reference to an enumerated list is not the same
+as using square brackets--instead it's the same as creating
+a list of references!
+
+    @list = (\$a, \@b, \%c);
+    @list = \($a, @b, %c);	# same thing!
+
+As a special case, C<\(@foo)> returns a list of references to the contents
+of C<@foo>, not a reference to C<@foo> itself.  Likewise for C<%foo>,
+except that the key references are to copies (since the keys are just
+strings rather than full-fledged scalars).
+
+=item 3.
+X<hash, anonymous> X<{> X<{}> X<curly bracket>
+X<bracket, curly> X<brace> X<hashref> X<hash reference> X<reference, hash>
+
+A reference to an anonymous hash can be created using curly
+brackets:
+
+    $hashref = {
+	'Adam'  => 'Eve',
+	'Clyde' => 'Bonnie',
+    };
+
+Anonymous hash and array composers like these can be intermixed freely to
+produce as complicated a structure as you want.  The multidimensional
+syntax described below works for these too.  The values above are
+literals, but variables and expressions would work just as well, because
+assignment operators in Perl (even within local() or my()) are executable
+statements, not compile-time declarations.
+
+Because curly brackets (braces) are used for several other things
+including BLOCKs, you may occasionally have to disambiguate braces at the
+beginning of a statement by putting a C<+> or a C<return> in front so
+that Perl realizes the opening brace isn't starting a BLOCK.  The economy and
+mnemonic value of using curlies is deemed worth this occasional extra
+hassle.
+
+For example, if you wanted a function to make a new hash and return a
+reference to it, you have these options:
+
+    sub hashem {        { @_ } }   # silently wrong
+    sub hashem {       +{ @_ } }   # ok
+    sub hashem { return { @_ } }   # ok
+
+On the other hand, if you want the other meaning, you can do this:
+
+    sub showem {        { @_ } }   # ambiguous (currently ok, but may change)
+    sub showem {       {; @_ } }   # ok
+    sub showem { { return @_ } }   # ok
+
+The leading C<+{> and C<{;> always serve to disambiguate
+the expression to mean either the HASH reference, or the BLOCK.
+
+=item 4.
+X<subroutine, anonymous> X<subroutine, reference> X<reference, subroutine>
+X<scope, lexical> X<closure> X<lexical> X<lexical scope>
+
+A reference to an anonymous subroutine can be created by using
+C<sub> without a subname:
+
+    $coderef = sub { print "Boink!\n" };
+
+Note the semicolon.  Except for the code
+inside not being immediately executed, a C<sub {}> is not so much a
+declaration as it is an operator, like C<do{}> or C<eval{}>.  (However, no
+matter how many times you execute that particular line (unless you're in an
+C<eval("...")>), $coderef will still have a reference to the I<same>
+anonymous subroutine.)
+
+Anonymous subroutines act as closures with respect to my() variables,
+that is, variables lexically visible within the current scope.  Closure
+is a notion out of the Lisp world that says if you define an anonymous
+function in a particular lexical context, it pretends to run in that
+context even when it's called outside the context.
+
+In human terms, it's a funny way of passing arguments to a subroutine when
+you define it as well as when you call it.  It's useful for setting up
+little bits of code to run later, such as callbacks.  You can even
+do object-oriented stuff with it, though Perl already provides a different
+mechanism to do that--see L<perlobj>.
+
+You might also think of closure as a way to write a subroutine
+template without using eval().  Here's a small example of how
+closures work:
+
+    sub newprint {
+	my $x = shift;
+	return sub { my $y = shift; print "$x, $y!\n"; };
+    }
+    $h = newprint("Howdy");
+    $g = newprint("Greetings");
+
+    # Time passes...
+
+    &$h("world");
+    &$g("earthlings");
+
+This prints
+
+    Howdy, world!
+    Greetings, earthlings!
+
+Note particularly that $x continues to refer to the value passed
+into newprint() I<despite> "my $x" having gone out of scope by the
+time the anonymous subroutine runs.  That's what a closure is all
+about.
+
+This applies only to lexical variables, by the way.  Dynamic variables
+continue to work as they have always worked.  Closure is not something
+that most Perl programmers need trouble themselves about to begin with.
+
+=item 5.
+X<constructor> X<new>
+
+References are often returned by special subroutines called constructors.
+Perl objects are just references to a special type of object that happens to know
+which package it's associated with.  Constructors are just special
+subroutines that know how to create that association.  They do so by
+starting with an ordinary reference, and it remains an ordinary reference
+even while it's also being an object.  Constructors are often
+named new() and called indirectly:
+
+    $objref = new Doggie (Tail => 'short', Ears => 'long');
+
+But don't have to be:
+
+    $objref   = Doggie->new(Tail => 'short', Ears => 'long');
+
+    use Term::Cap;
+    $terminal = Term::Cap->Tgetent( { OSPEED => 9600 });
+
+    use Tk;
+    $main    = MainWindow->new();
+    $menubar = $main->Frame(-relief              => "raised",
+                            -borderwidth         => 2)
+
+=item 6.
+X<autovivification>
+
+References of the appropriate type can spring into existence if you
+dereference them in a context that assumes they exist.  Because we haven't
+talked about dereferencing yet, we can't show you any examples yet.
+
+=item 7.
+X<*foo{THING}> X<*>
+
+A reference can be created by using a special syntax, lovingly known as
+the *foo{THING} syntax.  *foo{THING} returns a reference to the THING
+slot in *foo (which is the symbol table entry which holds everything
+known as foo).
+
+    $scalarref = *foo{SCALAR};
+    $arrayref  = *ARGV{ARRAY};
+    $hashref   = *ENV{HASH};
+    $coderef   = *handler{CODE};
+    $ioref     = *STDIN{IO};
+    $globref   = *foo{GLOB};
+    $formatref = *foo{FORMAT};
+
+All of these are self-explanatory except for C<*foo{IO}>.  It returns
+the IO handle, used for file handles (L<perlfunc/open>), sockets
+(L<perlfunc/socket> and L<perlfunc/socketpair>), and directory
+handles (L<perlfunc/opendir>).  For compatibility with previous
+versions of Perl, C<*foo{FILEHANDLE}> is a synonym for C<*foo{IO}>, though it
+is deprecated as of 5.8.0.  If deprecation warnings are in effect, it will warn
+of its use.
+
+C<*foo{THING}> returns undef if that particular THING hasn't been used yet,
+except in the case of scalars.  C<*foo{SCALAR}> returns a reference to an
+anonymous scalar if $foo hasn't been used yet.  This might change in a
+future release.
+
+C<*foo{IO}> is an alternative to the C<*HANDLE> mechanism given in
+L<perldata/"Typeglobs and Filehandles"> for passing filehandles
+into or out of subroutines, or storing into larger data structures.
+Its disadvantage is that it won't create a new filehandle for you.
+Its advantage is that you have less risk of clobbering more than
+you want to with a typeglob assignment.  (It still conflates file
+and directory handles, though.)  However, if you assign the incoming
+value to a scalar instead of a typeglob as we do in the examples
+below, there's no risk of that happening.
+
+    splutter(*STDOUT);		# pass the whole glob
+    splutter(*STDOUT{IO});	# pass both file and dir handles
+
+    sub splutter {
+	my $fh = shift;
+	print $fh "her um well a hmmm\n";
+    }
+
+    $rec = get_rec(*STDIN);	# pass the whole glob
+    $rec = get_rec(*STDIN{IO}); # pass both file and dir handles
+
+    sub get_rec {
+	my $fh = shift;
+	return scalar <$fh>;
+    }
+
+=back
+
+=head2 Using References
+X<reference, use> X<dereferencing> X<dereference>
+
+That's it for creating references.  By now you're probably dying to
+know how to use references to get back to your long-lost data.  There
+are several basic methods.
+
+=over 4
+
+=item 1.
+
+Anywhere you'd put an identifier (or chain of identifiers) as part
+of a variable or subroutine name, you can replace the identifier with
+a simple scalar variable containing a reference of the correct type:
+
+    $bar = $$scalarref;
+    push(@$arrayref, $filename);
+    $$arrayref[0] = "January";
+    $$hashref{"KEY"} = "VALUE";
+    &$coderef(1,2,3);
+    print $globref "output\n";
+
+It's important to understand that we are specifically I<not> dereferencing
+C<$arrayref[0]> or C<$hashref{"KEY"}> there.  The dereference of the
+scalar variable happens I<before> it does any key lookups.  Anything more
+complicated than a simple scalar variable must use methods 2 or 3 below.
+However, a "simple scalar" includes an identifier that itself uses method
+1 recursively.  Therefore, the following prints "howdy".
+
+    $refrefref = \\\"howdy";
+    print $$$$refrefref;
+
+=item 2.
+X<${}> X<@{}> X<%{}>
+
+Anywhere you'd put an identifier (or chain of identifiers) as part of a
+variable or subroutine name, you can replace the identifier with a
+BLOCK returning a reference of the correct type.  In other words, the
+previous examples could be written like this:
+
+    $bar = ${$scalarref};
+    push(@{$arrayref}, $filename);
+    ${$arrayref}[0] = "January";
+    ${$hashref}{"KEY"} = "VALUE";
+    &{$coderef}(1,2,3);
+    $globref->print("output\n");  # iff IO::Handle is loaded
+
+Admittedly, it's a little silly to use the curlies in this case, but
+the BLOCK can contain any arbitrary expression, in particular,
+subscripted expressions:
+
+    &{ $dispatch{$index} }(1,2,3);	# call correct routine
+
+Because of being able to omit the curlies for the simple case of C<$$x>,
+people often make the mistake of viewing the dereferencing symbols as
+proper operators, and wonder about their precedence.  If they were,
+though, you could use parentheses instead of braces.  That's not the case.
+Consider the difference below; case 0 is a short-hand version of case 1,
+I<not> case 2:
+
+    $$hashref{"KEY"}   = "VALUE";	# CASE 0
+    ${$hashref}{"KEY"} = "VALUE";	# CASE 1
+    ${$hashref{"KEY"}} = "VALUE";	# CASE 2
+    ${$hashref->{"KEY"}} = "VALUE";	# CASE 3
+
+Case 2 is also deceptive in that you're accessing a variable
+called %hashref, not dereferencing through $hashref to the hash
+it's presumably referencing.  That would be case 3.
+
+=item 3.
+X<autovivification> X<< -> >> X<arrow>
+
+Subroutine calls and lookups of individual array elements arise often
+enough that it gets cumbersome to use method 2.  As a form of
+syntactic sugar, the examples for method 2 may be written:
+
+    $arrayref->[0] = "January";   # Array element
+    $hashref->{"KEY"} = "VALUE";  # Hash element
+    $coderef->(1,2,3);            # Subroutine call
+
+The left side of the arrow can be any expression returning a reference,
+including a previous dereference.  Note that C<$array[$x]> is I<not> the
+same thing as C<< $array->[$x] >> here:
+
+    $array[$x]->{"foo"}->[0] = "January";
+
+This is one of the cases we mentioned earlier in which references could
+spring into existence when in an lvalue context.  Before this
+statement, C<$array[$x]> may have been undefined.  If so, it's
+automatically defined with a hash reference so that we can look up
+C<{"foo"}> in it.  Likewise C<< $array[$x]->{"foo"} >> will automatically get
+defined with an array reference so that we can look up C<[0]> in it.
+This process is called I<autovivification>.
+
+One more thing here.  The arrow is optional I<between> brackets
+subscripts, so you can shrink the above down to
+
+    $array[$x]{"foo"}[0] = "January";
+
+Which, in the degenerate case of using only ordinary arrays, gives you
+multidimensional arrays just like C's:
+
+    $score[$x][$y][$z] += 42;
+
+Well, okay, not entirely like C's arrays, actually.  C doesn't know how
+to grow its arrays on demand.  Perl does.
+
+=item 4.
+X<encapsulation>
+
+If a reference happens to be a reference to an object, then there are
+probably methods to access the things referred to, and you should probably
+stick to those methods unless you're in the class package that defines the
+object's methods.  In other words, be nice, and don't violate the object's
+encapsulation without a very good reason.  Perl does not enforce
+encapsulation.  We are not totalitarians here.  We do expect some basic
+civility though.
+
+=back
+
+Using a string or number as a reference produces a symbolic reference,
+as explained above.  Using a reference as a number produces an
+integer representing its storage location in memory.  The only
+useful thing to be done with this is to compare two references
+numerically to see whether they refer to the same location.
+X<reference, numeric context>
+
+    if ($ref1 == $ref2) {  # cheap numeric compare of references
+	print "refs 1 and 2 refer to the same thing\n";
+    }
+
+Using a reference as a string produces both its referent's type,
+including any package blessing as described in L<perlobj>, as well
+as the numeric address expressed in hex.  The ref() operator returns
+just the type of thing the reference is pointing to, without the
+address.  See L<perlfunc/ref> for details and examples of its use.
+X<reference, string context>
+
+The bless() operator may be used to associate the object a reference
+points to with a package functioning as an object class.  See L<perlobj>.
+
+A typeglob may be dereferenced the same way a reference can, because
+the dereference syntax always indicates the type of reference desired.
+So C<${*foo}> and C<${\$foo}> both indicate the same scalar variable.
+
+Here's a trick for interpolating a subroutine call into a string:
+
+    print "My sub returned @{[mysub(1,2,3)]} that time.\n";
+
+The way it works is that when the C<@{...}> is seen in the double-quoted
+string, it's evaluated as a block.  The block creates a reference to an
+anonymous array containing the results of the call to C<mysub(1,2,3)>.  So
+the whole block returns a reference to an array, which is then
+dereferenced by C<@{...}> and stuck into the double-quoted string. This
+chicanery is also useful for arbitrary expressions:
+
+    print "That yields @{[$n + 5]} widgets\n";
+
+=head2 Symbolic references
+X<reference, symbolic> X<reference, soft>
+X<symbolic reference> X<soft reference>
+
+We said that references spring into existence as necessary if they are
+undefined, but we didn't say what happens if a value used as a
+reference is already defined, but I<isn't> a hard reference.  If you
+use it as a reference, it'll be treated as a symbolic
+reference.  That is, the value of the scalar is taken to be the I<name>
+of a variable, rather than a direct link to a (possibly) anonymous
+value.
+
+People frequently expect it to work like this.  So it does.
+
+    $name = "foo";
+    $$name = 1;			# Sets $foo
+    ${$name} = 2;		# Sets $foo
+    ${$name x 2} = 3;		# Sets $foofoo
+    $name->[0] = 4;		# Sets $foo[0]
+    @$name = ();		# Clears @foo
+    &$name();			# Calls &foo() (as in Perl 4)
+    $pack = "THAT";
+    ${"${pack}::$name"} = 5;	# Sets $THAT::foo without eval
+
+This is powerful, and slightly dangerous, in that it's possible
+to intend (with the utmost sincerity) to use a hard reference, and
+accidentally use a symbolic reference instead.  To protect against
+that, you can say
+
+    use strict 'refs';
+
+and then only hard references will be allowed for the rest of the enclosing
+block.  An inner block may countermand that with
+
+    no strict 'refs';
+
+Only package variables (globals, even if localized) are visible to
+symbolic references.  Lexical variables (declared with my()) aren't in
+a symbol table, and thus are invisible to this mechanism.  For example:
+
+    local $value = 10;
+    $ref = "value";
+    {
+	my $value = 20;
+	print $$ref;
+    }
+
+This will still print 10, not 20.  Remember that local() affects package
+variables, which are all "global" to the package.
+
+=head2 Not-so-symbolic references
+
+A new feature contributing to readability in perl version 5.001 is that the
+brackets around a symbolic reference behave more like quotes, just as they
+always have within a string.  That is,
+
+    $push = "pop on ";
+    print "${push}over";
+
+has always meant to print "pop on over", even though push is
+a reserved word.  This has been generalized to work the same outside
+of quotes, so that
+
+    print ${push} . "over";
+
+and even
+
+    print ${ push } . "over";
+
+will have the same effect.  (This would have been a syntax error in
+Perl 5.000, though Perl 4 allowed it in the spaceless form.)  This
+construct is I<not> considered to be a symbolic reference when you're
+using strict refs:
+
+    use strict 'refs';
+    ${ bareword };	# Okay, means $bareword.
+    ${ "bareword" };	# Error, symbolic reference.
+
+Similarly, because of all the subscripting that is done using single
+words, we've applied the same rule to any bareword that is used for
+subscripting a hash.  So now, instead of writing
+
+    $array{ "aaa" }{ "bbb" }{ "ccc" }
+
+you can write just
+
+    $array{ aaa }{ bbb }{ ccc }
+
+and not worry about whether the subscripts are reserved words.  In the
+rare event that you do wish to do something like
+
+    $array{ shift }
+
+you can force interpretation as a reserved word by adding anything that
+makes it more than a bareword:
+
+    $array{ shift() }
+    $array{ +shift }
+    $array{ shift @_ }
+
+The C<use warnings> pragma or the B<-w> switch will warn you if it
+interprets a reserved word as a string.
+But it will no longer warn you about using lowercase words, because the
+string is effectively quoted.
+
+=head2 Pseudo-hashes: Using an array as a hash
+X<pseudo-hash> X<pseudo hash> X<pseudohash>
+
+B<WARNING>:  This section describes an experimental feature.  Details may
+change without notice in future versions.
+
+B<NOTE>: The current user-visible implementation of pseudo-hashes
+(the weird use of the first array element) is deprecated starting from
+Perl 5.8.0 and will be removed in Perl 5.10.0, and the feature will be
+implemented differently.  Not only is the current interface rather ugly,
+but the current implementation slows down normal array and hash use quite
+noticeably.  The 'fields' pragma interface will remain available.
+
+Beginning with release 5.005 of Perl, you may use an array reference
+in some contexts that would normally require a hash reference.  This
+allows you to access array elements using symbolic names, as if they
+were fields in a structure.
+
+For this to work, the array must contain extra information.  The first
+element of the array has to be a hash reference that maps field names
+to array indices.  Here is an example:
+
+    $struct = [{foo => 1, bar => 2}, "FOO", "BAR"];
+
+    $struct->{foo};  # same as $struct->[1], i.e. "FOO"
+    $struct->{bar};  # same as $struct->[2], i.e. "BAR"
+
+    keys %$struct;   # will return ("foo", "bar") in some order
+    values %$struct; # will return ("FOO", "BAR") in same some order
+
+    while (my($k,$v) = each %$struct) {
+       print "$k => $v\n";
+    }
+
+Perl will raise an exception if you try to access nonexistent fields.
+To avoid inconsistencies, always use the fields::phash() function
+provided by the C<fields> pragma.
+
+    use fields;
+    $pseudohash = fields::phash(foo => "FOO", bar => "BAR");
+
+For better performance, Perl can also do the translation from field
+names to array indices at compile time for typed object references.
+See L<fields>.
+
+There are two ways to check for the existence of a key in a
+pseudo-hash.  The first is to use exists().  This checks to see if the
+given field has ever been set.  It acts this way to match the behavior
+of a regular hash.  For instance:
+
+    use fields;
+    $phash = fields::phash([qw(foo bar pants)], ['FOO']);
+    $phash->{pants} = undef;
+
+    print exists $phash->{foo};    # true, 'foo' was set in the declaration
+    print exists $phash->{bar};    # false, 'bar' has not been used.
+    print exists $phash->{pants};  # true, your 'pants' have been touched
+
+The second is to use exists() on the hash reference sitting in the
+first array element.  This checks to see if the given key is a valid
+field in the pseudo-hash.
+
+    print exists $phash->[0]{bar};	# true, 'bar' is a valid field
+    print exists $phash->[0]{shoes};# false, 'shoes' can't be used
+
+delete() on a pseudo-hash element only deletes the value corresponding
+to the key, not the key itself.  To delete the key, you'll have to
+explicitly delete it from the first hash element.
+
+    print delete $phash->{foo};     # prints $phash->[1], "FOO"
+    print exists $phash->{foo};     # false
+    print exists $phash->[0]{foo};  # true, key still exists
+    print delete $phash->[0]{foo};  # now key is gone
+    print $phash->{foo};            # runtime exception
+
+=head2 Function Templates
+X<scope, lexical> X<closure> X<lexical> X<lexical scope>
+X<subroutine, nested> X<sub, nested> X<subroutine, local> X<sub, local>
+
+As explained above, an anonymous function with access to the lexical
+variables visible when that function was compiled, creates a closure.  It
+retains access to those variables even though it doesn't get run until
+later, such as in a signal handler or a Tk callback.
+
+Using a closure as a function template allows us to generate many functions
+that act similarly.  Suppose you wanted functions named after the colors
+that generated HTML font changes for the various colors:
+
+    print "Be ", red("careful"), "with that ", green("light");
+
+The red() and green() functions would be similar.  To create these,
+we'll assign a closure to a typeglob of the name of the function we're
+trying to build.  
+
+    @colors = qw(red blue green yellow orange purple violet);
+    for my $name (@colors) {
+        no strict 'refs';	# allow symbol table manipulation
+        *$name = *{uc $name} = sub { "<FONT COLOR='$name'>@_</FONT>" };
+    } 
+
+Now all those different functions appear to exist independently.  You can
+call red(), RED(), blue(), BLUE(), green(), etc.  This technique saves on
+both compile time and memory use, and is less error-prone as well, since
+syntax checks happen at compile time.  It's critical that any variables in
+the anonymous subroutine be lexicals in order to create a proper closure.
+That's the reasons for the C<my> on the loop iteration variable.
+
+This is one of the only places where giving a prototype to a closure makes
+much sense.  If you wanted to impose scalar context on the arguments of
+these functions (probably not a wise idea for this particular example),
+you could have written it this way instead:
+
+    *$name = sub ($) { "<FONT COLOR='$name'>$_[0]</FONT>" };
+
+However, since prototype checking happens at compile time, the assignment
+above happens too late to be of much use.  You could address this by
+putting the whole loop of assignments within a BEGIN block, forcing it
+to occur during compilation.
+
+Access to lexicals that change over type--like those in the C<for> loop
+above--only works with closures, not general subroutines.  In the general
+case, then, named subroutines do not nest properly, although anonymous
+ones do. Thus is because named subroutines are created (and capture any
+outer lexicals) only once at compile time, whereas anonymous subroutines
+get to capture each time you execute the 'sub' operator.  If you are
+accustomed to using nested subroutines in other programming languages with
+their own private variables, you'll have to work at it a bit in Perl.  The
+intuitive coding of this type of thing incurs mysterious warnings about
+"will not stay shared".  For example, this won't work:
+
+    sub outer {
+        my $x = $_[0] + 35;
+        sub inner { return $x * 19 }   # WRONG
+        return $x + inner();
+    }
+
+A work-around is the following:
+
+    sub outer {
+        my $x = $_[0] + 35;
+        local *inner = sub { return $x * 19 };
+        return $x + inner();
+    }
+
+Now inner() can only be called from within outer(), because of the
+temporary assignments of the closure (anonymous subroutine).  But when
+it does, it has normal access to the lexical variable $x from the scope
+of outer().
+
+This has the interesting effect of creating a function local to another
+function, something not normally supported in Perl.
+
+=head1 WARNING
+X<reference, string context> X<reference, use as hash key>
+
+You may not (usefully) use a reference as the key to a hash.  It will be
+converted into a string:
+
+    $x{ \$a } = $a;
+
+If you try to dereference the key, it won't do a hard dereference, and
+you won't accomplish what you're attempting.  You might want to do something
+more like
+
+    $r = \@a;
+    $x{ $r } = $r;
+
+And then at least you can use the values(), which will be
+real refs, instead of the keys(), which won't.
+
+The standard Tie::RefHash module provides a convenient workaround to this.
+
+=head1 SEE ALSO
+
+Besides the obvious documents, source code can be instructive.
+Some pathological examples of the use of references can be found
+in the F<t/op/ref.t> regression test in the Perl source directory.
+
+See also L<perldsc> and L<perllol> for how to use references to create
+complex data structures, and L<perltoot>, L<perlobj>, and L<perlbot>
+for how to use them to create objects.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlreftut.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlreftut.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlreftut.pod	(revision 14489)
@@ -0,0 +1,527 @@
+=head1 NAME
+
+perlreftut - Mark's very short tutorial about references
+
+=head1 DESCRIPTION
+
+One of the most important new features in Perl 5 was the capability to
+manage complicated data structures like multidimensional arrays and
+nested hashes.  To enable these, Perl 5 introduced a feature called
+`references', and using references is the key to managing complicated,
+structured data in Perl.  Unfortunately, there's a lot of funny syntax
+to learn, and the main manual page can be hard to follow.  The manual
+is quite complete, and sometimes people find that a problem, because
+it can be hard to tell what is important and what isn't.
+
+Fortunately, you only need to know 10% of what's in the main page to get
+90% of the benefit.  This page will show you that 10%.
+
+=head1 Who Needs Complicated Data Structures?
+
+One problem that came up all the time in Perl 4 was how to represent a
+hash whose values were lists.  Perl 4 had hashes, of course, but the
+values had to be scalars; they couldn't be lists.
+
+Why would you want a hash of lists?  Let's take a simple example: You
+have a file of city and country names, like this:
+
+	Chicago, USA
+	Frankfurt, Germany
+	Berlin, Germany
+	Washington, USA
+	Helsinki, Finland
+	New York, USA
+
+and you want to produce an output like this, with each country mentioned
+once, and then an alphabetical list of the cities in that country:
+
+	Finland: Helsinki.
+	Germany: Berlin, Frankfurt.
+	USA:  Chicago, New York, Washington.
+
+The natural way to do this is to have a hash whose keys are country
+names.  Associated with each country name key is a list of the cities in
+that country.  Each time you read a line of input, split it into a country
+and a city, look up the list of cities already known to be in that
+country, and append the new city to the list.  When you're done reading
+the input, iterate over the hash as usual, sorting each list of cities
+before you print it out.
+
+If hash values can't be lists, you lose.  In Perl 4, hash values can't
+be lists; they can only be strings.  You lose.  You'd probably have to
+combine all the cities into a single string somehow, and then when
+time came to write the output, you'd have to break the string into a
+list, sort the list, and turn it back into a string.  This is messy
+and error-prone.  And it's frustrating, because Perl already has
+perfectly good lists that would solve the problem if only you could
+use them.
+
+=head1 The Solution
+
+By the time Perl 5 rolled around, we were already stuck with this
+design: Hash values must be scalars.  The solution to this is
+references.
+
+A reference is a scalar value that I<refers to> an entire array or an
+entire hash (or to just about anything else).  Names are one kind of
+reference that you're already familiar with.  Think of the President
+of the United States: a messy, inconvenient bag of blood and bones.
+But to talk about him, or to represent him in a computer program, all
+you need is the easy, convenient scalar string "George Bush".
+
+References in Perl are like names for arrays and hashes.  They're
+Perl's private, internal names, so you can be sure they're
+unambiguous.  Unlike "George Bush", a reference only refers to one
+thing, and you always know what it refers to.  If you have a reference
+to an array, you can recover the entire array from it.  If you have a
+reference to a hash, you can recover the entire hash.  But the
+reference is still an easy, compact scalar value.
+
+You can't have a hash whose values are arrays; hash values can only be
+scalars.  We're stuck with that.  But a single reference can refer to
+an entire array, and references are scalars, so you can have a hash of
+references to arrays, and it'll act a lot like a hash of arrays, and
+it'll be just as useful as a hash of arrays.
+
+We'll come back to this city-country problem later, after we've seen
+some syntax for managing references.
+
+
+=head1 Syntax
+
+There are just two ways to make a reference, and just two ways to use
+it once you have it.
+
+=head2 Making References
+
+=head3 B<Make Rule 1>
+
+If you put a C<\> in front of a variable, you get a
+reference to that variable.
+
+    $aref = \@array;         # $aref now holds a reference to @array
+    $href = \%hash;          # $href now holds a reference to %hash
+    $sref = \$scalar;        # $sref now holds a reference to $scalar
+
+Once the reference is stored in a variable like $aref or $href, you
+can copy it or store it just the same as any other scalar value:
+
+    $xy = $aref;             # $xy now holds a reference to @array
+    $p[3] = $href;           # $p[3] now holds a reference to %hash
+    $z = $p[3];              # $z now holds a reference to %hash
+
+
+These examples show how to make references to variables with names.
+Sometimes you want to make an array or a hash that doesn't have a
+name.  This is analogous to the way you like to be able to use the
+string C<"\n"> or the number 80 without having to store it in a named
+variable first.
+
+B<Make Rule 2>
+
+C<[ ITEMS ]> makes a new, anonymous array, and returns a reference to
+that array.  C<{ ITEMS }> makes a new, anonymous hash, and returns a
+reference to that hash.
+
+    $aref = [ 1, "foo", undef, 13 ];
+    # $aref now holds a reference to an array
+
+    $href = { APR => 4, AUG => 8 };
+    # $href now holds a reference to a hash
+
+
+The references you get from rule 2 are the same kind of
+references that you get from rule 1:
+
+	# This:
+	$aref = [ 1, 2, 3 ];
+
+	# Does the same as this:
+	@array = (1, 2, 3);
+	$aref = \@array;
+
+
+The first line is an abbreviation for the following two lines, except
+that it doesn't create the superfluous array variable C<@array>.
+
+If you write just C<[]>, you get a new, empty anonymous array.
+If you write just C<{}>, you get a new, empty anonymous hash.
+
+
+=head2 Using References
+
+What can you do with a reference once you have it?  It's a scalar
+value, and we've seen that you can store it as a scalar and get it back
+again just like any scalar.  There are just two more ways to use it:
+
+=head3 B<Use Rule 1>
+
+You can always use an array reference, in curly braces, in place of
+the name of an array.  For example, C<@{$aref}> instead of C<@array>.
+
+Here are some examples of that:
+
+Arrays:
+
+
+	@a		@{$aref}		An array
+	reverse @a	reverse @{$aref}	Reverse the array
+	$a[3]		${$aref}[3]		An element of the array
+	$a[3] = 17;	${$aref}[3] = 17	Assigning an element
+
+
+On each line are two expressions that do the same thing.  The
+left-hand versions operate on the array C<@a>.  The right-hand
+versions operate on the array that is referred to by C<$aref>.  Once
+they find the array they're operating on, both versions do the same
+things to the arrays.
+
+Using a hash reference is I<exactly> the same:
+
+	%h		%{$href}	      A hash
+	keys %h		keys %{$href}	      Get the keys from the hash
+	$h{'red'}	${$href}{'red'}	      An element of the hash
+	$h{'red'} = 17	${$href}{'red'} = 17  Assigning an element
+
+Whatever you want to do with a reference, B<Use Rule 1> tells you how
+to do it.  You just write the Perl code that you would have written
+for doing the same thing to a regular array or hash, and then replace
+the array or hash name with C<{$reference}>.  "How do I loop over an
+array when all I have is a reference?"  Well, to loop over an array, you
+would write
+
+        for my $element (@array) {
+           ...
+        }
+
+so replace the array name, C<@array>, with the reference:
+
+        for my $element (@{$aref}) {
+           ...
+        }
+
+"How do I print out the contents of a hash when all I have is a
+reference?"  First write the code for printing out a hash:
+
+        for my $key (keys %hash) {
+          print "$key => $hash{$key}\n";
+        }
+
+And then replace the hash name with the reference:
+
+        for my $key (keys %{$href}) {
+          print "$key => ${$href}{$key}\n";
+        }
+
+=head3 B<Use Rule 2>
+
+B<Use Rule 1> is all you really need, because it tells you how to do
+absolutely everything you ever need to do with references.  But the
+most common thing to do with an array or a hash is to extract a single
+element, and the B<Use Rule 1> notation is cumbersome.  So there is an
+abbreviation.
+
+C<${$aref}[3]> is too hard to read, so you can write C<< $aref->[3] >>
+instead.
+
+C<${$href}{red}> is too hard to read, so you can write
+C<< $href->{red} >> instead.
+
+If C<$aref> holds a reference to an array, then C<< $aref->[3] >> is
+the fourth element of the array.  Don't confuse this with C<$aref[3]>,
+which is the fourth element of a totally different array, one
+deceptively named C<@aref>.  C<$aref> and C<@aref> are unrelated the
+same way that C<$item> and C<@item> are.
+
+Similarly, C<< $href->{'red'} >> is part of the hash referred to by
+the scalar variable C<$href>, perhaps even one with no name.
+C<$href{'red'}> is part of the deceptively named C<%href> hash.  It's
+easy to forget to leave out the C<< -> >>, and if you do, you'll get
+bizarre results when your program gets array and hash elements out of
+totally unexpected hashes and arrays that weren't the ones you wanted
+to use.
+
+
+=head2 An Example
+
+Let's see a quick example of how all this is useful.
+
+First, remember that C<[1, 2, 3]> makes an anonymous array containing
+C<(1, 2, 3)>, and gives you a reference to that array.
+
+Now think about
+
+	@a = ( [1, 2, 3],
+               [4, 5, 6],
+	       [7, 8, 9]
+             );
+
+@a is an array with three elements, and each one is a reference to
+another array.
+
+C<$a[1]> is one of these references.  It refers to an array, the array
+containing C<(4, 5, 6)>, and because it is a reference to an array,
+B<Use Rule 2> says that we can write C<< $a[1]->[2] >> to get the
+third element from that array.  C<< $a[1]->[2] >> is the 6.
+Similarly, C<< $a[0]->[1] >> is the 2.  What we have here is like a
+two-dimensional array; you can write C<< $a[ROW]->[COLUMN] >> to get
+or set the element in any row and any column of the array.
+
+The notation still looks a little cumbersome, so there's one more
+abbreviation:
+
+=head2 Arrow Rule
+
+In between two B<subscripts>, the arrow is optional.
+
+Instead of C<< $a[1]->[2] >>, we can write C<$a[1][2]>; it means the
+same thing.  Instead of C<< $a[0]->[1] = 23 >>, we can write
+C<$a[0][1] = 23>; it means the same thing.
+
+Now it really looks like two-dimensional arrays!
+
+You can see why the arrows are important.  Without them, we would have
+had to write C<${$a[1]}[2]> instead of C<$a[1][2]>.  For
+three-dimensional arrays, they let us write C<$x[2][3][5]> instead of
+the unreadable C<${${$x[2]}[3]}[5]>.
+
+=head1 Solution
+
+Here's the answer to the problem I posed earlier, of reformatting a
+file of city and country names.
+
+    1   my %table;
+
+    2   while (<>) {
+    3    chomp;
+    4     my ($city, $country) = split /, /;
+    5     $table{$country} = [] unless exists $table{$country};
+    6     push @{$table{$country}}, $city;
+    7   }
+
+    8   foreach $country (sort keys %table) {
+    9     print "$country: ";
+   10     my @cities = @{$table{$country}};
+   11     print join ', ', sort @cities;
+   12     print ".\n";
+   13	}
+
+
+The program has two pieces: Lines 2--7 read the input and build a data
+structure, and lines 8-13 analyze the data and print out the report.
+We're going to have a hash, C<%table>, whose keys are country names,
+and whose values are references to arrays of city names.  The data
+structure will look like this:
+
+
+           %table
+        +-------+---+
+        |       |   |   +-----------+--------+
+        |Germany| *---->| Frankfurt | Berlin |
+        |       |   |   +-----------+--------+
+        +-------+---+
+        |       |   |   +----------+
+        |Finland| *---->| Helsinki |
+        |       |   |   +----------+
+        +-------+---+
+        |       |   |   +---------+------------+----------+
+        |  USA  | *---->| Chicago | Washington | New York |
+        |       |   |   +---------+------------+----------+
+        +-------+---+
+
+We'll look at output first.  Supposing we already have this structure,
+how do we print it out?
+
+    8   foreach $country (sort keys %table) {
+    9     print "$country: ";
+   10     my @cities = @{$table{$country}};
+   11     print join ', ', sort @cities;
+   12     print ".\n";
+   13	}
+
+C<%table> is an
+ordinary hash, and we get a list of keys from it, sort the keys, and
+loop over the keys as usual.  The only use of references is in line 10.
+C<$table{$country}> looks up the key C<$country> in the hash
+and gets the value, which is a reference to an array of cities in that country.
+B<Use Rule 1> says that
+we can recover the array by saying
+C<@{$table{$country}}>.  Line 10 is just like
+
+	@cities = @array;
+
+except that the name C<array> has been replaced by the reference
+C<{$table{$country}}>.  The C<@> tells Perl to get the entire array.
+Having gotten the list of cities, we sort it, join it, and print it
+out as usual.
+
+Lines 2-7 are responsible for building the structure in the first
+place.  Here they are again:
+
+    2   while (<>) {
+    3    chomp;
+    4     my ($city, $country) = split /, /;
+    5     $table{$country} = [] unless exists $table{$country};
+    6     push @{$table{$country}}, $city;
+    7   }
+
+Lines 2-4 acquire a city and country name.  Line 5 looks to see if the
+country is already present as a key in the hash.  If it's not, the
+program uses the C<[]> notation (B<Make Rule 2>) to manufacture a new,
+empty anonymous array of cities, and installs a reference to it into
+the hash under the appropriate key.
+
+Line 6 installs the city name into the appropriate array.
+C<$table{$country}> now holds a reference to the array of cities seen
+in that country so far.  Line 6 is exactly like
+
+	push @array, $city;
+
+except that the name C<array> has been replaced by the reference
+C<{$table{$country}}>.  The C<push> adds a city name to the end of the
+referred-to array.
+
+There's one fine point I skipped.  Line 5 is unnecessary, and we can
+get rid of it.
+
+    2   while (<>) {
+    3    chomp;
+    4     my ($city, $country) = split /, /;
+    5   ####  $table{$country} = [] unless exists $table{$country};
+    6     push @{$table{$country}}, $city;
+    7   }
+
+If there's already an entry in C<%table> for the current C<$country>,
+then nothing is different.  Line 6 will locate the value in
+C<$table{$country}>, which is a reference to an array, and push
+C<$city> into the array.  But
+what does it do when
+C<$country> holds a key, say C<Greece>, that is not yet in C<%table>?
+
+This is Perl, so it does the exact right thing.  It sees that you want
+to push C<Athens> onto an array that doesn't exist, so it helpfully
+makes a new, empty, anonymous array for you, installs it into
+C<%table>, and then pushes C<Athens> onto it.  This is called
+`autovivification'--bringing things to life automatically.  Perl saw
+that they key wasn't in the hash, so it created a new hash entry
+automatically. Perl saw that you wanted to use the hash value as an
+array, so it created a new empty array and installed a reference to it
+in the hash automatically.  And as usual, Perl made the array one
+element longer to hold the new city name.
+
+=head1 The Rest
+
+I promised to give you 90% of the benefit with 10% of the details, and
+that means I left out 90% of the details.  Now that you have an
+overview of the important parts, it should be easier to read the
+L<perlref> manual page, which discusses 100% of the details.
+
+Some of the highlights of L<perlref>:
+
+=over 4
+
+=item *
+
+You can make references to anything, including scalars, functions, and
+other references.
+
+=item *
+
+In B<Use Rule 1>, you can omit the curly brackets whenever the thing
+inside them is an atomic scalar variable like C<$aref>.  For example,
+C<@$aref> is the same as C<@{$aref}>, and C<$$aref[1]> is the same as
+C<${$aref}[1]>.  If you're just starting out, you may want to adopt
+the habit of always including the curly brackets.
+
+=item *
+
+This doesn't copy the underlying array:
+
+        $aref2 = $aref1;
+
+You get two references to the same array.  If you modify
+C<< $aref1->[23] >> and then look at
+C<< $aref2->[23] >> you'll see the change.
+
+To copy the array, use
+
+        $aref2 = [@{$aref1}];
+
+This uses C<[...]> notation to create a new anonymous array, and
+C<$aref2> is assigned a reference to the new array.  The new array is
+initialized with the contents of the array referred to by C<$aref1>.
+
+Similarly, to copy an anonymous hash, you can use
+
+        $href2 = {%{$href1}};
+
+=item *
+
+To see if a variable contains a reference, use the C<ref> function.  It
+returns true if its argument is a reference.  Actually it's a little
+better than that: It returns C<HASH> for hash references and C<ARRAY>
+for array references.
+
+=item *
+
+If you try to use a reference like a string, you get strings like
+
+	ARRAY(0x80f5dec)   or    HASH(0x826afc0)
+
+If you ever see a string that looks like this, you'll know you
+printed out a reference by mistake.
+
+A side effect of this representation is that you can use C<eq> to see
+if two references refer to the same thing.  (But you should usually use
+C<==> instead because it's much faster.)
+
+=item *
+
+You can use a string as if it were a reference.  If you use the string
+C<"foo"> as an array reference, it's taken to be a reference to the
+array C<@foo>.  This is called a I<soft reference> or I<symbolic
+reference>.  The declaration C<use strict 'refs'> disables this
+feature, which can cause all sorts of trouble if you use it by accident.
+
+=back
+
+You might prefer to go on to L<perllol> instead of L<perlref>; it
+discusses lists of lists and multidimensional arrays in detail.  After
+that, you should move on to L<perldsc>; it's a Data Structure Cookbook
+that shows recipes for using and printing out arrays of hashes, hashes
+of arrays, and other kinds of data.
+
+=head1 Summary
+
+Everyone needs compound data structures, and in Perl the way you get
+them is with references.  There are four important rules for managing
+references: Two for making references and two for using them.  Once
+you know these rules you can do most of the important things you need
+to do with references.
+
+=head1 Credits
+
+Author: Mark Jason Dominus, Plover Systems (C<mjd-perl-ref+@plover.com>)
+
+This article originally appeared in I<The Perl Journal>
+( http://www.tpj.com/ ) volume 3, #2.  Reprinted with permission.
+
+The original title was I<Understand References Today>.
+
+=head2 Distribution Conditions
+
+Copyright 1998 The Perl Journal.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in these files are
+hereby placed into the public domain.  You are permitted and
+encouraged to use this code in your own programs for fun or for profit
+as you see fit.  A simple comment in the code giving credit would be
+courteous but is not required.
+
+
+
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlrequick.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlrequick.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlrequick.pod	(revision 14489)
@@ -0,0 +1,516 @@
+=head1 NAME
+
+perlrequick - Perl regular expressions quick start
+
+=head1 DESCRIPTION
+
+This page covers the very basics of understanding, creating and
+using regular expressions ('regexes') in Perl.
+
+
+=head1 The Guide
+
+=head2 Simple word matching
+
+The simplest regex is simply a word, or more generally, a string of
+characters.  A regex consisting of a word matches any string that
+contains that word:
+
+    "Hello World" =~ /World/;  # matches
+
+In this statement, C<World> is a regex and the C<//> enclosing
+C</World/> tells perl to search a string for a match.  The operator
+C<=~> associates the string with the regex match and produces a true
+value if the regex matched, or false if the regex did not match.  In
+our case, C<World> matches the second word in C<"Hello World">, so the
+expression is true.  This idea has several variations.
+
+Expressions like this are useful in conditionals:
+
+    print "It matches\n" if "Hello World" =~ /World/;
+
+The sense of the match can be reversed by using C<!~> operator:
+
+    print "It doesn't match\n" if "Hello World" !~ /World/;
+
+The literal string in the regex can be replaced by a variable:
+
+    $greeting = "World";
+    print "It matches\n" if "Hello World" =~ /$greeting/;
+
+If you're matching against C<$_>, the C<$_ =~> part can be omitted:
+
+    $_ = "Hello World";
+    print "It matches\n" if /World/;
+
+Finally, the C<//> default delimiters for a match can be changed to
+arbitrary delimiters by putting an C<'m'> out front:
+
+    "Hello World" =~ m!World!;   # matches, delimited by '!'
+    "Hello World" =~ m{World};   # matches, note the matching '{}'
+    "/usr/bin/perl" =~ m"/perl"; # matches after '/usr/bin',
+                                 # '/' becomes an ordinary char
+
+Regexes must match a part of the string I<exactly> in order for the
+statement to be true:
+
+    "Hello World" =~ /world/;  # doesn't match, case sensitive
+    "Hello World" =~ /o W/;    # matches, ' ' is an ordinary char
+    "Hello World" =~ /World /; # doesn't match, no ' ' at end
+
+perl will always match at the earliest possible point in the string:
+
+    "Hello World" =~ /o/;       # matches 'o' in 'Hello'
+    "That hat is red" =~ /hat/; # matches 'hat' in 'That'
+
+Not all characters can be used 'as is' in a match.  Some characters,
+called B<metacharacters>, are reserved for use in regex notation.
+The metacharacters are
+
+    {}[]()^$.|*+?\
+
+A metacharacter can be matched by putting a backslash before it:
+
+    "2+2=4" =~ /2+2/;    # doesn't match, + is a metacharacter
+    "2+2=4" =~ /2\+2/;   # matches, \+ is treated like an ordinary +
+    'C:\WIN32' =~ /C:\\WIN/;                       # matches
+    "/usr/bin/perl" =~ /\/usr\/bin\/perl/;  # matches
+
+In the last regex, the forward slash C<'/'> is also backslashed,
+because it is used to delimit the regex.
+
+Non-printable ASCII characters are represented by B<escape sequences>.
+Common examples are C<\t> for a tab, C<\n> for a newline, and C<\r>
+for a carriage return.  Arbitrary bytes are represented by octal
+escape sequences, e.g., C<\033>, or hexadecimal escape sequences,
+e.g., C<\x1B>:
+
+    "1000\t2000" =~ m(0\t2)        # matches
+    "cat"        =~ /\143\x61\x74/ # matches, but a weird way to spell cat
+
+Regexes are treated mostly as double quoted strings, so variable
+substitution works:
+
+    $foo = 'house';
+    'cathouse' =~ /cat$foo/;   # matches
+    'housecat' =~ /${foo}cat/; # matches
+
+With all of the regexes above, if the regex matched anywhere in the
+string, it was considered a match.  To specify I<where> it should
+match, we would use the B<anchor> metacharacters C<^> and C<$>.  The
+anchor C<^> means match at the beginning of the string and the anchor
+C<$> means match at the end of the string, or before a newline at the
+end of the string.  Some examples:
+
+    "housekeeper" =~ /keeper/;         # matches
+    "housekeeper" =~ /^keeper/;        # doesn't match
+    "housekeeper" =~ /keeper$/;        # matches
+    "housekeeper\n" =~ /keeper$/;      # matches
+    "housekeeper" =~ /^housekeeper$/;  # matches
+
+=head2 Using character classes
+
+A B<character class> allows a set of possible characters, rather than
+just a single character, to match at a particular point in a regex.
+Character classes are denoted by brackets C<[...]>, with the set of
+characters to be possibly matched inside.  Here are some examples:
+
+    /cat/;            # matches 'cat'
+    /[bcr]at/;        # matches 'bat', 'cat', or 'rat'
+    "abc" =~ /[cab]/; # matches 'a'
+
+In the last statement, even though C<'c'> is the first character in
+the class, the earliest point at which the regex can match is C<'a'>.
+
+    /[yY][eE][sS]/; # match 'yes' in a case-insensitive way
+                    # 'yes', 'Yes', 'YES', etc.
+    /yes/i;         # also match 'yes' in a case-insensitive way
+
+The last example shows a match with an C<'i'> B<modifier>, which makes
+the match case-insensitive.
+
+Character classes also have ordinary and special characters, but the
+sets of ordinary and special characters inside a character class are
+different than those outside a character class.  The special
+characters for a character class are C<-]\^$> and are matched using an
+escape:
+
+   /[\]c]def/; # matches ']def' or 'cdef'
+   $x = 'bcr';
+   /[$x]at/;   # matches 'bat, 'cat', or 'rat'
+   /[\$x]at/;  # matches '$at' or 'xat'
+   /[\\$x]at/; # matches '\at', 'bat, 'cat', or 'rat'
+
+The special character C<'-'> acts as a range operator within character
+classes, so that the unwieldy C<[0123456789]> and C<[abc...xyz]>
+become the svelte C<[0-9]> and C<[a-z]>:
+
+    /item[0-9]/;  # matches 'item0' or ... or 'item9'
+    /[0-9a-fA-F]/;  # matches a hexadecimal digit
+
+If C<'-'> is the first or last character in a character class, it is
+treated as an ordinary character.
+
+The special character C<^> in the first position of a character class
+denotes a B<negated character class>, which matches any character but
+those in the brackets.  Both C<[...]> and C<[^...]> must match a
+character, or the match fails.  Then
+
+    /[^a]at/;  # doesn't match 'aat' or 'at', but matches
+               # all other 'bat', 'cat, '0at', '%at', etc.
+    /[^0-9]/;  # matches a non-numeric character
+    /[a^]at/;  # matches 'aat' or '^at'; here '^' is ordinary
+
+Perl has several abbreviations for common character classes:
+
+=over 4
+
+=item *
+
+\d is a digit and represents
+
+    [0-9]
+
+=item *
+
+\s is a whitespace character and represents
+
+    [\ \t\r\n\f]
+
+=item *
+
+\w is a word character (alphanumeric or _) and represents
+
+    [0-9a-zA-Z_]
+
+=item *
+
+\D is a negated \d; it represents any character but a digit
+
+    [^0-9]
+
+=item *
+
+\S is a negated \s; it represents any non-whitespace character
+
+    [^\s]
+
+=item *
+
+\W is a negated \w; it represents any non-word character
+
+    [^\w]
+
+=item *
+
+The period '.' matches any character but "\n"
+
+=back
+
+The C<\d\s\w\D\S\W> abbreviations can be used both inside and outside
+of character classes.  Here are some in use:
+
+    /\d\d:\d\d:\d\d/; # matches a hh:mm:ss time format
+    /[\d\s]/;         # matches any digit or whitespace character
+    /\w\W\w/;         # matches a word char, followed by a
+                      # non-word char, followed by a word char
+    /..rt/;           # matches any two chars, followed by 'rt'
+    /end\./;          # matches 'end.'
+    /end[.]/;         # same thing, matches 'end.'
+
+The S<B<word anchor> > C<\b> matches a boundary between a word
+character and a non-word character C<\w\W> or C<\W\w>:
+
+    $x = "Housecat catenates house and cat";
+    $x =~ /\bcat/;  # matches cat in 'catenates'
+    $x =~ /cat\b/;  # matches cat in 'housecat'
+    $x =~ /\bcat\b/;  # matches 'cat' at end of string
+
+In the last example, the end of the string is considered a word
+boundary.
+
+=head2 Matching this or that
+
+We can match different character strings with the B<alternation>
+metacharacter C<'|'>.  To match C<dog> or C<cat>, we form the regex
+C<dog|cat>.  As before, perl will try to match the regex at the
+earliest possible point in the string.  At each character position,
+perl will first try to match the first alternative, C<dog>.  If
+C<dog> doesn't match, perl will then try the next alternative, C<cat>.
+If C<cat> doesn't match either, then the match fails and perl moves to
+the next position in the string.  Some examples:
+
+    "cats and dogs" =~ /cat|dog|bird/;  # matches "cat"
+    "cats and dogs" =~ /dog|cat|bird/;  # matches "cat"
+
+Even though C<dog> is the first alternative in the second regex,
+C<cat> is able to match earlier in the string.
+
+    "cats"          =~ /c|ca|cat|cats/; # matches "c"
+    "cats"          =~ /cats|cat|ca|c/; # matches "cats"
+
+At a given character position, the first alternative that allows the
+regex match to succeed will be the one that matches. Here, all the
+alternatives match at the first string position, so the first matches.
+
+=head2 Grouping things and hierarchical matching
+
+The B<grouping> metacharacters C<()> allow a part of a regex to be
+treated as a single unit.  Parts of a regex are grouped by enclosing
+them in parentheses.  The regex C<house(cat|keeper)> means match
+C<house> followed by either C<cat> or C<keeper>.  Some more examples
+are
+
+    /(a|b)b/;    # matches 'ab' or 'bb'
+    /(^a|b)c/;   # matches 'ac' at start of string or 'bc' anywhere
+
+    /house(cat|)/;  # matches either 'housecat' or 'house'
+    /house(cat(s|)|)/;  # matches either 'housecats' or 'housecat' or
+                        # 'house'.  Note groups can be nested.
+
+    "20" =~ /(19|20|)\d\d/;  # matches the null alternative '()\d\d',
+                             # because '20\d\d' can't match
+
+=head2 Extracting matches
+
+The grouping metacharacters C<()> also allow the extraction of the
+parts of a string that matched.  For each grouping, the part that
+matched inside goes into the special variables C<$1>, C<$2>, etc.
+They can be used just as ordinary variables:
+
+    # extract hours, minutes, seconds
+    $time =~ /(\d\d):(\d\d):(\d\d)/;  # match hh:mm:ss format
+    $hours = $1;
+    $minutes = $2;
+    $seconds = $3;
+
+In list context, a match C</regex/> with groupings will return the
+list of matched values C<($1,$2,...)>.  So we could rewrite it as
+
+    ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);
+
+If the groupings in a regex are nested, C<$1> gets the group with the
+leftmost opening parenthesis, C<$2> the next opening parenthesis,
+etc.  For example, here is a complex regex and the matching variables
+indicated below it:
+
+    /(ab(cd|ef)((gi)|j))/;
+     1  2      34
+
+Associated with the matching variables C<$1>, C<$2>, ... are
+the B<backreferences> C<\1>, C<\2>, ...  Backreferences are
+matching variables that can be used I<inside> a regex:
+
+    /(\w\w\w)\s\1/; # find sequences like 'the the' in string
+
+C<$1>, C<$2>, ... should only be used outside of a regex, and C<\1>,
+C<\2>, ... only inside a regex.
+
+=head2 Matching repetitions
+
+The B<quantifier> metacharacters C<?>, C<*>, C<+>, and C<{}> allow us
+to determine the number of repeats of a portion of a regex we
+consider to be a match.  Quantifiers are put immediately after the
+character, character class, or grouping that we want to specify.  They
+have the following meanings:
+
+=over 4
+
+=item *
+
+C<a?> = match 'a' 1 or 0 times
+
+=item *
+
+C<a*> = match 'a' 0 or more times, i.e., any number of times
+
+=item *
+
+C<a+> = match 'a' 1 or more times, i.e., at least once
+
+=item *
+
+C<a{n,m}> = match at least C<n> times, but not more than C<m>
+times.
+
+=item *
+
+C<a{n,}> = match at least C<n> or more times
+
+=item *
+
+C<a{n}> = match exactly C<n> times
+
+=back
+
+Here are some examples:
+
+    /[a-z]+\s+\d*/;  # match a lowercase word, at least some space, and
+                     # any number of digits
+    /(\w+)\s+\1/;    # match doubled words of arbitrary length
+    $year =~ /\d{2,4}/;  # make sure year is at least 2 but not more
+                         # than 4 digits
+    $year =~ /\d{4}|\d{2}/;    # better match; throw out 3 digit dates
+
+These quantifiers will try to match as much of the string as possible,
+while still allowing the regex to match.  So we have
+
+    $x = 'the cat in the hat';
+    $x =~ /^(.*)(at)(.*)$/; # matches,
+                            # $1 = 'the cat in the h'
+                            # $2 = 'at'
+                            # $3 = ''   (0 matches)
+
+The first quantifier C<.*> grabs as much of the string as possible
+while still having the regex match. The second quantifier C<.*> has
+no string left to it, so it matches 0 times.
+
+=head2 More matching
+
+There are a few more things you might want to know about matching
+operators.  In the code
+
+    $pattern = 'Seuss';
+    while (<>) {
+        print if /$pattern/;
+    }
+
+perl has to re-evaluate C<$pattern> each time through the loop.  If
+C<$pattern> won't be changing, use the C<//o> modifier, to only
+perform variable substitutions once.  If you don't want any
+substitutions at all, use the special delimiter C<m''>:
+
+    @pattern = ('Seuss');
+    m/@pattern/; # matches 'Seuss'
+    m'@pattern'; # matches the literal string '@pattern'
+
+The global modifier C<//g> allows the matching operator to match
+within a string as many times as possible.  In scalar context,
+successive matches against a string will have C<//g> jump from match
+to match, keeping track of position in the string as it goes along.
+You can get or set the position with the C<pos()> function.
+For example,
+
+    $x = "cat dog house"; # 3 words
+    while ($x =~ /(\w+)/g) {
+        print "Word is $1, ends at position ", pos $x, "\n";
+    }
+
+prints
+
+    Word is cat, ends at position 3
+    Word is dog, ends at position 7
+    Word is house, ends at position 13
+
+A failed match or changing the target string resets the position.  If
+you don't want the position reset after failure to match, add the
+C<//c>, as in C</regex/gc>.
+
+In list context, C<//g> returns a list of matched groupings, or if
+there are no groupings, a list of matches to the whole regex.  So
+
+    @words = ($x =~ /(\w+)/g);  # matches,
+                                # $word[0] = 'cat'
+                                # $word[1] = 'dog'
+                                # $word[2] = 'house'
+
+=head2 Search and replace
+
+Search and replace is performed using C<s/regex/replacement/modifiers>.
+The C<replacement> is a Perl double quoted string that replaces in the
+string whatever is matched with the C<regex>.  The operator C<=~> is
+also used here to associate a string with C<s///>.  If matching
+against C<$_>, the S<C<$_ =~> > can be dropped.  If there is a match,
+C<s///> returns the number of substitutions made, otherwise it returns
+false.  Here are a few examples:
+
+    $x = "Time to feed the cat!";
+    $x =~ s/cat/hacker/;   # $x contains "Time to feed the hacker!"
+    $y = "'quoted words'";
+    $y =~ s/^'(.*)'$/$1/;  # strip single quotes,
+                           # $y contains "quoted words"
+
+With the C<s///> operator, the matched variables C<$1>, C<$2>, etc.
+are immediately available for use in the replacement expression. With
+the global modifier, C<s///g> will search and replace all occurrences
+of the regex in the string:
+
+    $x = "I batted 4 for 4";
+    $x =~ s/4/four/;   # $x contains "I batted four for 4"
+    $x = "I batted 4 for 4";
+    $x =~ s/4/four/g;  # $x contains "I batted four for four"
+
+The evaluation modifier C<s///e> wraps an C<eval{...}> around the
+replacement string and the evaluated result is substituted for the
+matched substring.  Some examples:
+
+    # reverse all the words in a string
+    $x = "the cat in the hat";
+    $x =~ s/(\w+)/reverse $1/ge;   # $x contains "eht tac ni eht tah"
+
+    # convert percentage to decimal
+    $x = "A 39% hit rate";
+    $x =~ s!(\d+)%!$1/100!e;       # $x contains "A 0.39 hit rate"
+
+The last example shows that C<s///> can use other delimiters, such as
+C<s!!!> and C<s{}{}>, and even C<s{}//>.  If single quotes are used
+C<s'''>, then the regex and replacement are treated as single quoted
+strings.
+
+=head2 The split operator
+
+C<split /regex/, string> splits C<string> into a list of substrings
+and returns that list.  The regex determines the character sequence
+that C<string> is split with respect to.  For example, to split a
+string into words, use
+
+    $x = "Calvin and Hobbes";
+    @word = split /\s+/, $x;  # $word[0] = 'Calvin'
+                              # $word[1] = 'and'
+                              # $word[2] = 'Hobbes'
+
+To extract a comma-delimited list of numbers, use
+
+    $x = "1.618,2.718,   3.142";
+    @const = split /,\s*/, $x;  # $const[0] = '1.618'
+                                # $const[1] = '2.718'
+                                # $const[2] = '3.142'
+
+If the empty regex C<//> is used, the string is split into individual
+characters.  If the regex has groupings, then the list produced contains
+the matched substrings from the groupings as well:
+
+    $x = "/usr/bin";
+    @parts = split m!(/)!, $x;  # $parts[0] = ''
+                                # $parts[1] = '/'
+                                # $parts[2] = 'usr'
+                                # $parts[3] = '/'
+                                # $parts[4] = 'bin'
+
+Since the first character of $x matched the regex, C<split> prepended
+an empty initial element to the list.
+
+=head1 BUGS
+
+None.
+
+=head1 SEE ALSO
+
+This is just a quick start guide.  For a more in-depth tutorial on
+regexes, see L<perlretut> and for the reference page, see L<perlre>.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 2000 Mark Kvale
+All rights reserved.
+
+This document may be distributed under the same terms as Perl itself.
+
+=head2 Acknowledgments
+
+The author would like to thank Mark-Jason Dominus, Tom Christiansen,
+Ilya Zakharevich, Brad Hughes, and Mike Giroux for all their helpful
+comments.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlreref.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlreref.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlreref.pod	(revision 14489)
@@ -0,0 +1,310 @@
+=head1 NAME
+
+perlreref - Perl Regular Expressions Reference
+
+=head1 DESCRIPTION
+
+This is a quick reference to Perl's regular expressions.
+For full information see L<perlre> and L<perlop>, as well
+as the L</"SEE ALSO"> section in this document.
+
+=head2 OPERATORS
+
+  =~ determines to which variable the regex is applied.
+     In its absence, $_ is used.
+
+        $var =~ /foo/;
+
+  !~ determines to which variable the regex is applied,
+     and negates the result of the match; it returns
+     false if the match succeeds, and true if it fails.
+
+       $var !~ /foo/;
+
+  m/pattern/igmsoxc searches a string for a pattern match,
+     applying the given options.
+
+        i  case-Insensitive
+        g  Global - all occurrences
+        m  Multiline mode - ^ and $ match internal lines
+        s  match as a Single line - . matches \n
+        o  compile pattern Once
+        x  eXtended legibility - free whitespace and comments
+        c  don't reset pos on failed matches when using /g
+
+     If 'pattern' is an empty string, the last I<successfully> matched
+     regex is used. Delimiters other than '/' may be used for both this
+     operator and the following ones.
+
+  qr/pattern/imsox lets you store a regex in a variable,
+     or pass one around. Modifiers as for m// and are stored
+     within the regex.
+
+  s/pattern/replacement/igmsoxe substitutes matches of
+     'pattern' with 'replacement'. Modifiers as for m//
+     with one addition:
+
+        e  Evaluate replacement as an expression
+
+     'e' may be specified multiple times. 'replacement' is interpreted
+     as a double quoted string unless a single-quote (') is the delimiter.
+
+  ?pattern? is like m/pattern/ but matches only once. No alternate
+      delimiters can be used. Must be reset with L<reset|perlfunc/reset>.
+
+=head2 SYNTAX
+
+   \       Escapes the character immediately following it
+   .       Matches any single character except a newline (unless /s is used)
+   ^       Matches at the beginning of the string (or line, if /m is used)
+   $       Matches at the end of the string (or line, if /m is used)
+   *       Matches the preceding element 0 or more times
+   +       Matches the preceding element 1 or more times
+   ?       Matches the preceding element 0 or 1 times
+   {...}   Specifies a range of occurrences for the element preceding it
+   [...]   Matches any one of the characters contained within the brackets
+   (...)   Groups subexpressions for capturing to $1, $2...
+   (?:...) Groups subexpressions without capturing (cluster)
+   |       Matches either the subexpression preceding or following it
+   \1, \2 ...  The text from the Nth group
+
+=head2 ESCAPE SEQUENCES
+
+These work as in normal strings.
+
+   \a       Alarm (beep)
+   \e       Escape
+   \f       Formfeed
+   \n       Newline
+   \r       Carriage return
+   \t       Tab
+   \037     Any octal ASCII value
+   \x7f     Any hexadecimal ASCII value
+   \x{263a} A wide hexadecimal value
+   \cx      Control-x
+   \N{name} A named character
+
+   \l  Lowercase next character
+   \u  Titlecase next character
+   \L  Lowercase until \E
+   \U  Uppercase until \E
+   \Q  Disable pattern metacharacters until \E
+   \E  End case modification
+
+For Titlecase, see L</Titlecase>.
+
+This one works differently from normal strings:
+
+   \b  An assertion, not backspace, except in a character class
+
+=head2 CHARACTER CLASSES
+
+   [amy]    Match 'a', 'm' or 'y'
+   [f-j]    Dash specifies "range"
+   [f-j-]   Dash escaped or at start or end means 'dash'
+   [^f-j]   Caret indicates "match any character _except_ these"
+
+The following sequences work within or without a character class.
+The first six are locale aware, all are Unicode aware.  The default
+character class equivalent are given.  See L<perllocale> and
+L<perlunicode> for details.
+
+   \d      A digit                     [0-9]
+   \D      A nondigit                  [^0-9]
+   \w      A word character            [a-zA-Z0-9_]
+   \W      A non-word character        [^a-zA-Z0-9_]
+   \s      A whitespace character      [ \t\n\r\f]
+   \S      A non-whitespace character  [^ \t\n\r\f]
+
+   \C      Match a byte (with Unicode, '.' matches a character)
+   \pP     Match P-named (Unicode) property
+   \p{...} Match Unicode property with long name
+   \PP     Match non-P
+   \P{...} Match lack of Unicode property with long name
+   \X      Match extended unicode sequence
+
+POSIX character classes and their Unicode and Perl equivalents:
+
+   alnum   IsAlnum              Alphanumeric
+   alpha   IsAlpha              Alphabetic
+   ascii   IsASCII              Any ASCII char
+   blank   IsSpace  [ \t]       Horizontal whitespace (GNU extension)
+   cntrl   IsCntrl              Control characters
+   digit   IsDigit  \d          Digits
+   graph   IsGraph              Alphanumeric and punctuation
+   lower   IsLower              Lowercase chars (locale and Unicode aware)
+   print   IsPrint              Alphanumeric, punct, and space
+   punct   IsPunct              Punctuation
+   space   IsSpace  [\s\ck]     Whitespace
+           IsSpacePerl   \s     Perl's whitespace definition
+   upper   IsUpper              Uppercase chars (locale and Unicode aware)
+   word    IsWord   \w          Alphanumeric plus _ (Perl extension)
+   xdigit  IsXDigit [0-9A-Fa-f] Hexadecimal digit
+
+Within a character class:
+
+    POSIX       traditional   Unicode
+    [:digit:]       \d        \p{IsDigit}
+    [:^digit:]      \D        \P{IsDigit}
+
+=head2 ANCHORS
+
+All are zero-width assertions.
+
+   ^  Match string start (or line, if /m is used)
+   $  Match string end (or line, if /m is used) or before newline
+   \b Match word boundary (between \w and \W)
+   \B Match except at word boundary (between \w and \w or \W and \W)
+   \A Match string start (regardless of /m)
+   \Z Match string end (before optional newline)
+   \z Match absolute string end
+   \G Match where previous m//g left off
+
+=head2 QUANTIFIERS
+
+Quantifiers are greedy by default -- match the B<longest> leftmost.
+
+   Maximal Minimal Allowed range
+   ------- ------- -------------
+   {n,m}   {n,m}?  Must occur at least n times but no more than m times
+   {n,}    {n,}?   Must occur at least n times
+   {n}     {n}?    Must occur exactly n times
+   *       *?      0 or more times (same as {0,})
+   +       +?      1 or more times (same as {1,})
+   ?       ??      0 or 1 time (same as {0,1})
+
+There is no quantifier {,n} -- that gets understood as a literal string.
+
+=head2 EXTENDED CONSTRUCTS
+
+   (?#text)         A comment
+   (?imxs-imsx:...) Enable/disable option (as per m// modifiers)
+   (?=...)          Zero-width positive lookahead assertion
+   (?!...)          Zero-width negative lookahead assertion
+   (?<=...)         Zero-width positive lookbehind assertion
+   (?<!...)         Zero-width negative lookbehind assertion
+   (?>...)          Grab what we can, prohibit backtracking
+   (?{ code })      Embedded code, return value becomes $^R
+   (??{ code })     Dynamic regex, return value used as regex
+   (?(cond)yes|no)  cond being integer corresponding to capturing parens
+   (?(cond)yes)        or a lookaround/eval zero-width assertion
+
+=head2 VARIABLES
+
+   $_    Default variable for operators to use
+   $*    Enable multiline matching (deprecated; not in 5.9.0 or later)
+
+   $&    Entire matched string
+   $`    Everything prior to matched string
+   $'    Everything after to matched string
+
+The use of those last three will slow down B<all> regex use
+within your program. Consult L<perlvar> for C<@LAST_MATCH_START>
+to see equivalent expressions that won't cause slow down.
+See also L<Devel::SawAmpersand>.
+
+   $1, $2 ...  hold the Xth captured expr
+   $+    Last parenthesized pattern match
+   $^N   Holds the most recently closed capture
+   $^R   Holds the result of the last (?{...}) expr
+   @-    Offsets of starts of groups. $-[0] holds start of whole match
+   @+    Offsets of ends of groups. $+[0] holds end of whole match
+
+Captured groups are numbered according to their I<opening> paren.
+
+=head2 FUNCTIONS
+
+   lc          Lowercase a string
+   lcfirst     Lowercase first char of a string
+   uc          Uppercase a string
+   ucfirst     Titlecase first char of a string
+
+   pos         Return or set current match position
+   quotemeta   Quote metacharacters
+   reset       Reset ?pattern? status
+   study       Analyze string for optimizing matching
+
+   split       Use regex to split a string into parts
+
+The first four of these are like the escape sequences C<\L>, C<\l>,
+C<\U>, and C<\u>.  For Titlecase, see L</Titlecase>.
+
+=head2 TERMINOLOGY
+
+=head3 Titlecase
+
+Unicode concept which most often is equal to uppercase, but for
+certain characters like the German "sharp s" there is a difference.
+
+=head1 AUTHOR
+
+Iain Truskett.
+
+This document may be distributed under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item *
+
+L<perlretut> for a tutorial on regular expressions.
+
+=item *
+
+L<perlrequick> for a rapid tutorial.
+
+=item *
+
+L<perlre> for more details.
+
+=item *
+
+L<perlvar> for details on the variables.
+
+=item *
+
+L<perlop> for details on the operators.
+
+=item *
+
+L<perlfunc> for details on the functions.
+
+=item *
+
+L<perlfaq6> for FAQs on regular expressions.
+
+=item *
+
+The L<re> module to alter behaviour and aid
+debugging.
+
+=item *
+
+L<perldebug/"Debugging regular expressions">
+
+=item *
+
+L<perluniintro>, L<perlunicode>, L<charnames> and L<locale>
+for details on regexes and internationalisation.
+
+=item *
+
+I<Mastering Regular Expressions> by Jeffrey Friedl
+(F<http://regex.info/>) for a thorough grounding and
+reference on the topic.
+
+=back
+
+=head1 THANKS
+
+David P.C. Wollmann,
+Richard Soderberg,
+Sean M. Burke,
+Tom Christiansen,
+Jim Cromie,
+and
+Jeffrey Goff
+for useful advice.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlretut.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlretut.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlretut.pod	(revision 14489)
@@ -0,0 +1,2523 @@
+=head1 NAME
+
+perlretut - Perl regular expressions tutorial
+
+=head1 DESCRIPTION
+
+This page provides a basic tutorial on understanding, creating and
+using regular expressions in Perl.  It serves as a complement to the
+reference page on regular expressions L<perlre>.  Regular expressions
+are an integral part of the C<m//>, C<s///>, C<qr//> and C<split>
+operators and so this tutorial also overlaps with
+L<perlop/"Regexp Quote-Like Operators"> and L<perlfunc/split>.
+
+Perl is widely renowned for excellence in text processing, and regular
+expressions are one of the big factors behind this fame.  Perl regular
+expressions display an efficiency and flexibility unknown in most
+other computer languages.  Mastering even the basics of regular
+expressions will allow you to manipulate text with surprising ease.
+
+What is a regular expression?  A regular expression is simply a string
+that describes a pattern.  Patterns are in common use these days;
+examples are the patterns typed into a search engine to find web pages
+and the patterns used to list files in a directory, e.g., C<ls *.txt>
+or C<dir *.*>.  In Perl, the patterns described by regular expressions
+are used to search strings, extract desired parts of strings, and to
+do search and replace operations.
+
+Regular expressions have the undeserved reputation of being abstract
+and difficult to understand.  Regular expressions are constructed using
+simple concepts like conditionals and loops and are no more difficult
+to understand than the corresponding C<if> conditionals and C<while>
+loops in the Perl language itself.  In fact, the main challenge in
+learning regular expressions is just getting used to the terse
+notation used to express these concepts.
+
+This tutorial flattens the learning curve by discussing regular
+expression concepts, along with their notation, one at a time and with
+many examples.  The first part of the tutorial will progress from the
+simplest word searches to the basic regular expression concepts.  If
+you master the first part, you will have all the tools needed to solve
+about 98% of your needs.  The second part of the tutorial is for those
+comfortable with the basics and hungry for more power tools.  It
+discusses the more advanced regular expression operators and
+introduces the latest cutting edge innovations in 5.6.0.
+
+A note: to save time, 'regular expression' is often abbreviated as
+regexp or regex.  Regexp is a more natural abbreviation than regex, but
+is harder to pronounce.  The Perl pod documentation is evenly split on
+regexp vs regex; in Perl, there is more than one way to abbreviate it.
+We'll use regexp in this tutorial.
+
+=head1 Part 1: The basics
+
+=head2 Simple word matching
+
+The simplest regexp is simply a word, or more generally, a string of
+characters.  A regexp consisting of a word matches any string that
+contains that word:
+
+    "Hello World" =~ /World/;  # matches
+
+What is this perl statement all about? C<"Hello World"> is a simple
+double quoted string.  C<World> is the regular expression and the
+C<//> enclosing C</World/> tells perl to search a string for a match.
+The operator C<=~> associates the string with the regexp match and
+produces a true value if the regexp matched, or false if the regexp
+did not match.  In our case, C<World> matches the second word in
+C<"Hello World">, so the expression is true.  Expressions like this
+are useful in conditionals:
+
+    if ("Hello World" =~ /World/) {
+        print "It matches\n";
+    }
+    else {
+        print "It doesn't match\n";
+    }
+
+There are useful variations on this theme.  The sense of the match can
+be reversed by using C<!~> operator:
+
+    if ("Hello World" !~ /World/) {
+        print "It doesn't match\n";
+    }
+    else {
+        print "It matches\n";
+    }
+
+The literal string in the regexp can be replaced by a variable:
+
+    $greeting = "World";
+    if ("Hello World" =~ /$greeting/) {
+        print "It matches\n";
+    }
+    else {
+        print "It doesn't match\n";
+    }
+
+If you're matching against the special default variable C<$_>, the
+C<$_ =~> part can be omitted:
+
+    $_ = "Hello World";
+    if (/World/) {
+        print "It matches\n";
+    }
+    else {
+        print "It doesn't match\n";
+    }
+
+And finally, the C<//> default delimiters for a match can be changed
+to arbitrary delimiters by putting an C<'m'> out front:
+
+    "Hello World" =~ m!World!;   # matches, delimited by '!'
+    "Hello World" =~ m{World};   # matches, note the matching '{}'
+    "/usr/bin/perl" =~ m"/perl"; # matches after '/usr/bin',
+                                 # '/' becomes an ordinary char
+
+C</World/>, C<m!World!>, and C<m{World}> all represent the
+same thing.  When, e.g., C<""> is used as a delimiter, the forward
+slash C<'/'> becomes an ordinary character and can be used in a regexp
+without trouble.
+
+Let's consider how different regexps would match C<"Hello World">:
+
+    "Hello World" =~ /world/;  # doesn't match
+    "Hello World" =~ /o W/;    # matches
+    "Hello World" =~ /oW/;     # doesn't match
+    "Hello World" =~ /World /; # doesn't match
+
+The first regexp C<world> doesn't match because regexps are
+case-sensitive.  The second regexp matches because the substring
+S<C<'o W'> > occurs in the string S<C<"Hello World"> >.  The space
+character ' ' is treated like any other character in a regexp and is
+needed to match in this case.  The lack of a space character is the
+reason the third regexp C<'oW'> doesn't match.  The fourth regexp
+C<'World '> doesn't match because there is a space at the end of the
+regexp, but not at the end of the string.  The lesson here is that
+regexps must match a part of the string I<exactly> in order for the
+statement to be true.
+
+If a regexp matches in more than one place in the string, perl will
+always match at the earliest possible point in the string:
+
+    "Hello World" =~ /o/;       # matches 'o' in 'Hello'
+    "That hat is red" =~ /hat/; # matches 'hat' in 'That'
+
+With respect to character matching, there are a few more points you
+need to know about.   First of all, not all characters can be used 'as
+is' in a match.  Some characters, called B<metacharacters>, are reserved
+for use in regexp notation.  The metacharacters are
+
+    {}[]()^$.|*+?\
+
+The significance of each of these will be explained
+in the rest of the tutorial, but for now, it is important only to know
+that a metacharacter can be matched by putting a backslash before it:
+
+    "2+2=4" =~ /2+2/;    # doesn't match, + is a metacharacter
+    "2+2=4" =~ /2\+2/;   # matches, \+ is treated like an ordinary +
+    "The interval is [0,1)." =~ /[0,1)./     # is a syntax error!
+    "The interval is [0,1)." =~ /\[0,1\)\./  # matches
+    "/usr/bin/perl" =~ /\/usr\/bin\/perl/;  # matches
+
+In the last regexp, the forward slash C<'/'> is also backslashed,
+because it is used to delimit the regexp.  This can lead to LTS
+(leaning toothpick syndrome), however, and it is often more readable
+to change delimiters.
+
+    "/usr/bin/perl" =~ m!/usr/bin/perl!;    # easier to read
+
+The backslash character C<'\'> is a metacharacter itself and needs to
+be backslashed:
+
+    'C:\WIN32' =~ /C:\\WIN/;   # matches
+
+In addition to the metacharacters, there are some ASCII characters
+which don't have printable character equivalents and are instead
+represented by B<escape sequences>.  Common examples are C<\t> for a
+tab, C<\n> for a newline, C<\r> for a carriage return and C<\a> for a
+bell.  If your string is better thought of as a sequence of arbitrary
+bytes, the octal escape sequence, e.g., C<\033>, or hexadecimal escape
+sequence, e.g., C<\x1B> may be a more natural representation for your
+bytes.  Here are some examples of escapes:
+
+    "1000\t2000" =~ m(0\t2)   # matches
+    "1000\n2000" =~ /0\n20/   # matches
+    "1000\t2000" =~ /\000\t2/ # doesn't match, "0" ne "\000"
+    "cat"        =~ /\143\x61\x74/ # matches, but a weird way to spell cat
+
+If you've been around Perl a while, all this talk of escape sequences
+may seem familiar.  Similar escape sequences are used in double-quoted
+strings and in fact the regexps in Perl are mostly treated as
+double-quoted strings.  This means that variables can be used in
+regexps as well.  Just like double-quoted strings, the values of the
+variables in the regexp will be substituted in before the regexp is
+evaluated for matching purposes.  So we have:
+
+    $foo = 'house';
+    'housecat' =~ /$foo/;      # matches
+    'cathouse' =~ /cat$foo/;   # matches
+    'housecat' =~ /${foo}cat/; # matches
+
+So far, so good.  With the knowledge above you can already perform
+searches with just about any literal string regexp you can dream up.
+Here is a I<very simple> emulation of the Unix grep program:
+
+    % cat > simple_grep
+    #!/usr/bin/perl
+    $regexp = shift;
+    while (<>) {
+        print if /$regexp/;
+    }
+    ^D
+
+    % chmod +x simple_grep
+
+    % simple_grep abba /usr/dict/words
+    Babbage
+    cabbage
+    cabbages
+    sabbath
+    Sabbathize
+    Sabbathizes
+    sabbatical
+    scabbard
+    scabbards
+
+This program is easy to understand.  C<#!/usr/bin/perl> is the standard
+way to invoke a perl program from the shell.
+S<C<$regexp = shift;> > saves the first command line argument as the
+regexp to be used, leaving the rest of the command line arguments to
+be treated as files.  S<C<< while (<>) >> > loops over all the lines in
+all the files.  For each line, S<C<print if /$regexp/;> > prints the
+line if the regexp matches the line.  In this line, both C<print> and
+C</$regexp/> use the default variable C<$_> implicitly.
+
+With all of the regexps above, if the regexp matched anywhere in the
+string, it was considered a match.  Sometimes, however, we'd like to
+specify I<where> in the string the regexp should try to match.  To do
+this, we would use the B<anchor> metacharacters C<^> and C<$>.  The
+anchor C<^> means match at the beginning of the string and the anchor
+C<$> means match at the end of the string, or before a newline at the
+end of the string.  Here is how they are used:
+
+    "housekeeper" =~ /keeper/;    # matches
+    "housekeeper" =~ /^keeper/;   # doesn't match
+    "housekeeper" =~ /keeper$/;   # matches
+    "housekeeper\n" =~ /keeper$/; # matches
+
+The second regexp doesn't match because C<^> constrains C<keeper> to
+match only at the beginning of the string, but C<"housekeeper"> has
+keeper starting in the middle.  The third regexp does match, since the
+C<$> constrains C<keeper> to match only at the end of the string.
+
+When both C<^> and C<$> are used at the same time, the regexp has to
+match both the beginning and the end of the string, i.e., the regexp
+matches the whole string.  Consider
+
+    "keeper" =~ /^keep$/;      # doesn't match
+    "keeper" =~ /^keeper$/;    # matches
+    ""       =~ /^$/;          # ^$ matches an empty string
+
+The first regexp doesn't match because the string has more to it than
+C<keep>.  Since the second regexp is exactly the string, it
+matches.  Using both C<^> and C<$> in a regexp forces the complete
+string to match, so it gives you complete control over which strings
+match and which don't.  Suppose you are looking for a fellow named
+bert, off in a string by himself:
+
+    "dogbert" =~ /bert/;   # matches, but not what you want
+
+    "dilbert" =~ /^bert/;  # doesn't match, but ..
+    "bertram" =~ /^bert/;  # matches, so still not good enough
+
+    "bertram" =~ /^bert$/; # doesn't match, good
+    "dilbert" =~ /^bert$/; # doesn't match, good
+    "bert"    =~ /^bert$/; # matches, perfect
+
+Of course, in the case of a literal string, one could just as easily
+use the string equivalence S<C<$string eq 'bert'> > and it would be
+more efficient.   The  C<^...$> regexp really becomes useful when we
+add in the more powerful regexp tools below.
+
+=head2 Using character classes
+
+Although one can already do quite a lot with the literal string
+regexps above, we've only scratched the surface of regular expression
+technology.  In this and subsequent sections we will introduce regexp
+concepts (and associated metacharacter notations) that will allow a
+regexp to not just represent a single character sequence, but a I<whole
+class> of them.
+
+One such concept is that of a B<character class>.  A character class
+allows a set of possible characters, rather than just a single
+character, to match at a particular point in a regexp.  Character
+classes are denoted by brackets C<[...]>, with the set of characters
+to be possibly matched inside.  Here are some examples:
+
+    /cat/;       # matches 'cat'
+    /[bcr]at/;   # matches 'bat, 'cat', or 'rat'
+    /item[0123456789]/;  # matches 'item0' or ... or 'item9'
+    "abc" =~ /[cab]/;    # matches 'a'
+
+In the last statement, even though C<'c'> is the first character in
+the class, C<'a'> matches because the first character position in the
+string is the earliest point at which the regexp can match.
+
+    /[yY][eE][sS]/;      # match 'yes' in a case-insensitive way
+                         # 'yes', 'Yes', 'YES', etc.
+
+This regexp displays a common task: perform a case-insensitive
+match.  Perl provides away of avoiding all those brackets by simply
+appending an C<'i'> to the end of the match.  Then C</[yY][eE][sS]/;>
+can be rewritten as C</yes/i;>.  The C<'i'> stands for
+case-insensitive and is an example of a B<modifier> of the matching
+operation.  We will meet other modifiers later in the tutorial.
+
+We saw in the section above that there were ordinary characters, which
+represented themselves, and special characters, which needed a
+backslash C<\> to represent themselves.  The same is true in a
+character class, but the sets of ordinary and special characters
+inside a character class are different than those outside a character
+class.  The special characters for a character class are C<-]\^$>.  C<]>
+is special because it denotes the end of a character class.  C<$> is
+special because it denotes a scalar variable.  C<\> is special because
+it is used in escape sequences, just like above.  Here is how the
+special characters C<]$\> are handled:
+
+   /[\]c]def/; # matches ']def' or 'cdef'
+   $x = 'bcr';
+   /[$x]at/;   # matches 'bat', 'cat', or 'rat'
+   /[\$x]at/;  # matches '$at' or 'xat'
+   /[\\$x]at/; # matches '\at', 'bat, 'cat', or 'rat'
+
+The last two are a little tricky.  in C<[\$x]>, the backslash protects
+the dollar sign, so the character class has two members C<$> and C<x>.
+In C<[\\$x]>, the backslash is protected, so C<$x> is treated as a
+variable and substituted in double quote fashion.
+
+The special character C<'-'> acts as a range operator within character
+classes, so that a contiguous set of characters can be written as a
+range.  With ranges, the unwieldy C<[0123456789]> and C<[abc...xyz]>
+become the svelte C<[0-9]> and C<[a-z]>.  Some examples are
+
+    /item[0-9]/;  # matches 'item0' or ... or 'item9'
+    /[0-9bx-z]aa/;  # matches '0aa', ..., '9aa',
+                    # 'baa', 'xaa', 'yaa', or 'zaa'
+    /[0-9a-fA-F]/;  # matches a hexadecimal digit
+    /[0-9a-zA-Z_]/; # matches a "word" character,
+                    # like those in a perl variable name
+
+If C<'-'> is the first or last character in a character class, it is
+treated as an ordinary character; C<[-ab]>, C<[ab-]> and C<[a\-b]> are
+all equivalent.
+
+The special character C<^> in the first position of a character class
+denotes a B<negated character class>, which matches any character but
+those in the brackets.  Both C<[...]> and C<[^...]> must match a
+character, or the match fails.  Then
+
+    /[^a]at/;  # doesn't match 'aat' or 'at', but matches
+               # all other 'bat', 'cat, '0at', '%at', etc.
+    /[^0-9]/;  # matches a non-numeric character
+    /[a^]at/;  # matches 'aat' or '^at'; here '^' is ordinary
+
+Now, even C<[0-9]> can be a bother the write multiple times, so in the
+interest of saving keystrokes and making regexps more readable, Perl
+has several abbreviations for common character classes:
+
+=over 4
+
+=item *
+
+\d is a digit and represents [0-9]
+
+=item *
+
+\s is a whitespace character and represents [\ \t\r\n\f]
+
+=item *
+
+\w is a word character (alphanumeric or _) and represents [0-9a-zA-Z_]
+
+=item *
+
+\D is a negated \d; it represents any character but a digit [^0-9]
+
+=item *
+
+\S is a negated \s; it represents any non-whitespace character [^\s]
+
+=item *
+
+\W is a negated \w; it represents any non-word character [^\w]
+
+=item *
+
+The period '.' matches any character but "\n"
+
+=back
+
+The C<\d\s\w\D\S\W> abbreviations can be used both inside and outside
+of character classes.  Here are some in use:
+
+    /\d\d:\d\d:\d\d/; # matches a hh:mm:ss time format
+    /[\d\s]/;         # matches any digit or whitespace character
+    /\w\W\w/;         # matches a word char, followed by a
+                      # non-word char, followed by a word char
+    /..rt/;           # matches any two chars, followed by 'rt'
+    /end\./;          # matches 'end.'
+    /end[.]/;         # same thing, matches 'end.'
+
+Because a period is a metacharacter, it needs to be escaped to match
+as an ordinary period. Because, for example, C<\d> and C<\w> are sets
+of characters, it is incorrect to think of C<[^\d\w]> as C<[\D\W]>; in
+fact C<[^\d\w]> is the same as C<[^\w]>, which is the same as
+C<[\W]>. Think DeMorgan's laws.
+
+An anchor useful in basic regexps is the S<B<word anchor> >
+C<\b>.  This matches a boundary between a word character and a non-word
+character C<\w\W> or C<\W\w>:
+
+    $x = "Housecat catenates house and cat";
+    $x =~ /cat/;    # matches cat in 'housecat'
+    $x =~ /\bcat/;  # matches cat in 'catenates'
+    $x =~ /cat\b/;  # matches cat in 'housecat'
+    $x =~ /\bcat\b/;  # matches 'cat' at end of string
+
+Note in the last example, the end of the string is considered a word
+boundary.
+
+You might wonder why C<'.'> matches everything but C<"\n"> - why not
+every character? The reason is that often one is matching against
+lines and would like to ignore the newline characters.  For instance,
+while the string C<"\n"> represents one line, we would like to think
+of as empty.  Then
+
+    ""   =~ /^$/;    # matches
+    "\n" =~ /^$/;    # matches, "\n" is ignored
+
+    ""   =~ /./;      # doesn't match; it needs a char
+    ""   =~ /^.$/;    # doesn't match; it needs a char
+    "\n" =~ /^.$/;    # doesn't match; it needs a char other than "\n"
+    "a"  =~ /^.$/;    # matches
+    "a\n"  =~ /^.$/;  # matches, ignores the "\n"
+
+This behavior is convenient, because we usually want to ignore
+newlines when we count and match characters in a line.  Sometimes,
+however, we want to keep track of newlines.  We might even want C<^>
+and C<$> to anchor at the beginning and end of lines within the
+string, rather than just the beginning and end of the string.  Perl
+allows us to choose between ignoring and paying attention to newlines
+by using the C<//s> and C<//m> modifiers.  C<//s> and C<//m> stand for
+single line and multi-line and they determine whether a string is to
+be treated as one continuous string, or as a set of lines.  The two
+modifiers affect two aspects of how the regexp is interpreted: 1) how
+the C<'.'> character class is defined, and 2) where the anchors C<^>
+and C<$> are able to match.  Here are the four possible combinations:
+
+=over 4
+
+=item *
+
+no modifiers (//): Default behavior.  C<'.'> matches any character
+except C<"\n">.  C<^> matches only at the beginning of the string and
+C<$> matches only at the end or before a newline at the end.
+
+=item *
+
+s modifier (//s): Treat string as a single long line.  C<'.'> matches
+any character, even C<"\n">.  C<^> matches only at the beginning of
+the string and C<$> matches only at the end or before a newline at the
+end.
+
+=item *
+
+m modifier (//m): Treat string as a set of multiple lines.  C<'.'>
+matches any character except C<"\n">.  C<^> and C<$> are able to match
+at the start or end of I<any> line within the string.
+
+=item *
+
+both s and m modifiers (//sm): Treat string as a single long line, but
+detect multiple lines.  C<'.'> matches any character, even
+C<"\n">.  C<^> and C<$>, however, are able to match at the start or end
+of I<any> line within the string.
+
+=back
+
+Here are examples of C<//s> and C<//m> in action:
+
+    $x = "There once was a girl\nWho programmed in Perl\n";
+
+    $x =~ /^Who/;   # doesn't match, "Who" not at start of string
+    $x =~ /^Who/s;  # doesn't match, "Who" not at start of string
+    $x =~ /^Who/m;  # matches, "Who" at start of second line
+    $x =~ /^Who/sm; # matches, "Who" at start of second line
+
+    $x =~ /girl.Who/;   # doesn't match, "." doesn't match "\n"
+    $x =~ /girl.Who/s;  # matches, "." matches "\n"
+    $x =~ /girl.Who/m;  # doesn't match, "." doesn't match "\n"
+    $x =~ /girl.Who/sm; # matches, "." matches "\n"
+
+Most of the time, the default behavior is what is want, but C<//s> and
+C<//m> are occasionally very useful.  If C<//m> is being used, the start
+of the string can still be matched with C<\A> and the end of string
+can still be matched with the anchors C<\Z> (matches both the end and
+the newline before, like C<$>), and C<\z> (matches only the end):
+
+    $x =~ /^Who/m;   # matches, "Who" at start of second line
+    $x =~ /\AWho/m;  # doesn't match, "Who" is not at start of string
+
+    $x =~ /girl$/m;  # matches, "girl" at end of first line
+    $x =~ /girl\Z/m; # doesn't match, "girl" is not at end of string
+
+    $x =~ /Perl\Z/m; # matches, "Perl" is at newline before end
+    $x =~ /Perl\z/m; # doesn't match, "Perl" is not at end of string
+
+We now know how to create choices among classes of characters in a
+regexp.  What about choices among words or character strings? Such
+choices are described in the next section.
+
+=head2 Matching this or that
+
+Sometimes we would like to our regexp to be able to match different
+possible words or character strings.  This is accomplished by using
+the B<alternation> metacharacter C<|>.  To match C<dog> or C<cat>, we
+form the regexp C<dog|cat>.  As before, perl will try to match the
+regexp at the earliest possible point in the string.  At each
+character position, perl will first try to match the first
+alternative, C<dog>.  If C<dog> doesn't match, perl will then try the
+next alternative, C<cat>.  If C<cat> doesn't match either, then the
+match fails and perl moves to the next position in the string.  Some
+examples:
+
+    "cats and dogs" =~ /cat|dog|bird/;  # matches "cat"
+    "cats and dogs" =~ /dog|cat|bird/;  # matches "cat"
+
+Even though C<dog> is the first alternative in the second regexp,
+C<cat> is able to match earlier in the string.
+
+    "cats"          =~ /c|ca|cat|cats/; # matches "c"
+    "cats"          =~ /cats|cat|ca|c/; # matches "cats"
+
+Here, all the alternatives match at the first string position, so the
+first alternative is the one that matches.  If some of the
+alternatives are truncations of the others, put the longest ones first
+to give them a chance to match.
+
+    "cab" =~ /a|b|c/ # matches "c"
+                     # /a|b|c/ == /[abc]/
+
+The last example points out that character classes are like
+alternations of characters.  At a given character position, the first
+alternative that allows the regexp match to succeed will be the one
+that matches.
+
+=head2 Grouping things and hierarchical matching
+
+Alternation allows a regexp to choose among alternatives, but by
+itself it unsatisfying.  The reason is that each alternative is a whole
+regexp, but sometime we want alternatives for just part of a
+regexp.  For instance, suppose we want to search for housecats or
+housekeepers.  The regexp C<housecat|housekeeper> fits the bill, but is
+inefficient because we had to type C<house> twice.  It would be nice to
+have parts of the regexp be constant, like C<house>, and some
+parts have alternatives, like C<cat|keeper>.
+
+The B<grouping> metacharacters C<()> solve this problem.  Grouping
+allows parts of a regexp to be treated as a single unit.  Parts of a
+regexp are grouped by enclosing them in parentheses.  Thus we could solve
+the C<housecat|housekeeper> by forming the regexp as
+C<house(cat|keeper)>.  The regexp C<house(cat|keeper)> means match
+C<house> followed by either C<cat> or C<keeper>.  Some more examples
+are
+
+    /(a|b)b/;    # matches 'ab' or 'bb'
+    /(ac|b)b/;   # matches 'acb' or 'bb'
+    /(^a|b)c/;   # matches 'ac' at start of string or 'bc' anywhere
+    /(a|[bc])d/; # matches 'ad', 'bd', or 'cd'
+
+    /house(cat|)/;  # matches either 'housecat' or 'house'
+    /house(cat(s|)|)/;  # matches either 'housecats' or 'housecat' or
+                        # 'house'.  Note groups can be nested.
+
+    /(19|20|)\d\d/;  # match years 19xx, 20xx, or the Y2K problem, xx
+    "20" =~ /(19|20|)\d\d/;  # matches the null alternative '()\d\d',
+                             # because '20\d\d' can't match
+
+Alternations behave the same way in groups as out of them: at a given
+string position, the leftmost alternative that allows the regexp to
+match is taken.  So in the last example at the first string position,
+C<"20"> matches the second alternative, but there is nothing left over
+to match the next two digits C<\d\d>.  So perl moves on to the next
+alternative, which is the null alternative and that works, since
+C<"20"> is two digits.
+
+The process of trying one alternative, seeing if it matches, and
+moving on to the next alternative if it doesn't, is called
+B<backtracking>.  The term 'backtracking' comes from the idea that
+matching a regexp is like a walk in the woods.  Successfully matching
+a regexp is like arriving at a destination.  There are many possible
+trailheads, one for each string position, and each one is tried in
+order, left to right.  From each trailhead there may be many paths,
+some of which get you there, and some which are dead ends.  When you
+walk along a trail and hit a dead end, you have to backtrack along the
+trail to an earlier point to try another trail.  If you hit your
+destination, you stop immediately and forget about trying all the
+other trails.  You are persistent, and only if you have tried all the
+trails from all the trailheads and not arrived at your destination, do
+you declare failure.  To be concrete, here is a step-by-step analysis
+of what perl does when it tries to match the regexp
+
+    "abcde" =~ /(abd|abc)(df|d|de)/;
+
+=over 4
+
+=item 0
+
+Start with the first letter in the string 'a'.
+
+=item 1
+
+Try the first alternative in the first group 'abd'.
+
+=item 2
+
+Match 'a' followed by 'b'. So far so good.
+
+=item 3
+
+'d' in the regexp doesn't match 'c' in the string - a dead
+end.  So backtrack two characters and pick the second alternative in
+the first group 'abc'.
+
+=item 4
+
+Match 'a' followed by 'b' followed by 'c'.  We are on a roll
+and have satisfied the first group. Set $1 to 'abc'.
+
+=item 5
+
+Move on to the second group and pick the first alternative
+'df'.
+
+=item 6
+
+Match the 'd'.
+
+=item 7
+
+'f' in the regexp doesn't match 'e' in the string, so a dead
+end.  Backtrack one character and pick the second alternative in the
+second group 'd'.
+
+=item 8
+
+'d' matches. The second grouping is satisfied, so set $2 to
+'d'.
+
+=item 9
+
+We are at the end of the regexp, so we are done! We have
+matched 'abcd' out of the string "abcde".
+
+=back
+
+There are a couple of things to note about this analysis.  First, the
+third alternative in the second group 'de' also allows a match, but we
+stopped before we got to it - at a given character position, leftmost
+wins.  Second, we were able to get a match at the first character
+position of the string 'a'.  If there were no matches at the first
+position, perl would move to the second character position 'b' and
+attempt the match all over again.  Only when all possible paths at all
+possible character positions have been exhausted does perl give
+up and declare S<C<$string =~ /(abd|abc)(df|d|de)/;> > to be false.
+
+Even with all this work, regexp matching happens remarkably fast.  To
+speed things up, during compilation stage, perl compiles the regexp
+into a compact sequence of opcodes that can often fit inside a
+processor cache.  When the code is executed, these opcodes can then run
+at full throttle and search very quickly.
+
+=head2 Extracting matches
+
+The grouping metacharacters C<()> also serve another completely
+different function: they allow the extraction of the parts of a string
+that matched.  This is very useful to find out what matched and for
+text processing in general.  For each grouping, the part that matched
+inside goes into the special variables C<$1>, C<$2>, etc.  They can be
+used just as ordinary variables:
+
+    # extract hours, minutes, seconds
+    if ($time =~ /(\d\d):(\d\d):(\d\d)/) {    # match hh:mm:ss format
+	$hours = $1;
+	$minutes = $2;
+	$seconds = $3;
+    }
+
+Now, we know that in scalar context,
+S<C<$time =~ /(\d\d):(\d\d):(\d\d)/> > returns a true or false
+value.  In list context, however, it returns the list of matched values
+C<($1,$2,$3)>.  So we could write the code more compactly as
+
+    # extract hours, minutes, seconds
+    ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);
+
+If the groupings in a regexp are nested, C<$1> gets the group with the
+leftmost opening parenthesis, C<$2> the next opening parenthesis,
+etc.  For example, here is a complex regexp and the matching variables
+indicated below it:
+
+    /(ab(cd|ef)((gi)|j))/;
+     1  2      34
+
+so that if the regexp matched, e.g., C<$2> would contain 'cd' or 'ef'. For
+convenience, perl sets C<$+> to the string held by the highest numbered
+C<$1>, C<$2>, ... that got assigned (and, somewhat related, C<$^N> to the
+value of the C<$1>, C<$2>, ... most-recently assigned; i.e. the C<$1>,
+C<$2>, ... associated with the rightmost closing parenthesis used in the
+match).
+
+Closely associated with the matching variables C<$1>, C<$2>, ... are
+the B<backreferences> C<\1>, C<\2>, ... .  Backreferences are simply
+matching variables that can be used I<inside> a regexp.  This is a
+really nice feature - what matches later in a regexp can depend on
+what matched earlier in the regexp.  Suppose we wanted to look
+for doubled words in text, like 'the the'.  The following regexp finds
+all 3-letter doubles with a space in between:
+
+    /(\w\w\w)\s\1/;
+
+The grouping assigns a value to \1, so that the same 3 letter sequence
+is used for both parts.  Here are some words with repeated parts:
+
+    % simple_grep '^(\w\w\w\w|\w\w\w|\w\w|\w)\1$' /usr/dict/words
+    beriberi
+    booboo
+    coco
+    mama
+    murmur
+    papa
+
+The regexp has a single grouping which considers 4-letter
+combinations, then 3-letter combinations, etc.  and uses C<\1> to look for
+a repeat.  Although C<$1> and C<\1> represent the same thing, care should be
+taken to use matched variables C<$1>, C<$2>, ... only outside a regexp
+and backreferences C<\1>, C<\2>, ... only inside a regexp; not doing
+so may lead to surprising and/or undefined results.
+
+In addition to what was matched, Perl 5.6.0 also provides the
+positions of what was matched with the C<@-> and C<@+>
+arrays. C<$-[0]> is the position of the start of the entire match and
+C<$+[0]> is the position of the end. Similarly, C<$-[n]> is the
+position of the start of the C<$n> match and C<$+[n]> is the position
+of the end. If C<$n> is undefined, so are C<$-[n]> and C<$+[n]>. Then
+this code
+
+    $x = "Mmm...donut, thought Homer";
+    $x =~ /^(Mmm|Yech)\.\.\.(donut|peas)/; # matches
+    foreach $expr (1..$#-) {
+        print "Match $expr: '${$expr}' at position ($-[$expr],$+[$expr])\n";
+    }
+
+prints
+
+    Match 1: 'Mmm' at position (0,3)
+    Match 2: 'donut' at position (6,11)
+
+Even if there are no groupings in a regexp, it is still possible to
+find out what exactly matched in a string.  If you use them, perl
+will set C<$`> to the part of the string before the match, will set C<$&>
+to the part of the string that matched, and will set C<$'> to the part
+of the string after the match.  An example:
+
+    $x = "the cat caught the mouse";
+    $x =~ /cat/;  # $` = 'the ', $& = 'cat', $' = ' caught the mouse'
+    $x =~ /the/;  # $` = '', $& = 'the', $' = ' cat caught the mouse'
+
+In the second match, S<C<$` = ''> > because the regexp matched at the
+first character position in the string and stopped, it never saw the
+second 'the'.  It is important to note that using C<$`> and C<$'>
+slows down regexp matching quite a bit, and C< $& > slows it down to a
+lesser extent, because if they are used in one regexp in a program,
+they are generated for <all> regexps in the program.  So if raw
+performance is a goal of your application, they should be avoided.
+If you need them, use C<@-> and C<@+> instead:
+
+    $` is the same as substr( $x, 0, $-[0] )
+    $& is the same as substr( $x, $-[0], $+[0]-$-[0] )
+    $' is the same as substr( $x, $+[0] )
+
+=head2 Matching repetitions
+
+The examples in the previous section display an annoying weakness.  We
+were only matching 3-letter words, or syllables of 4 letters or
+less.  We'd like to be able to match words or syllables of any length,
+without writing out tedious alternatives like
+C<\w\w\w\w|\w\w\w|\w\w|\w>.
+
+This is exactly the problem the B<quantifier> metacharacters C<?>,
+C<*>, C<+>, and C<{}> were created for.  They allow us to determine the
+number of repeats of a portion of a regexp we consider to be a
+match.  Quantifiers are put immediately after the character, character
+class, or grouping that we want to specify.  They have the following
+meanings:
+
+=over 4
+
+=item *
+
+C<a?> = match 'a' 1 or 0 times
+
+=item *
+
+C<a*> = match 'a' 0 or more times, i.e., any number of times
+
+=item *
+
+C<a+> = match 'a' 1 or more times, i.e., at least once
+
+=item *
+
+C<a{n,m}> = match at least C<n> times, but not more than C<m>
+times.
+
+=item *
+
+C<a{n,}> = match at least C<n> or more times
+
+=item *
+
+C<a{n}> = match exactly C<n> times
+
+=back
+
+Here are some examples:
+
+    /[a-z]+\s+\d*/;  # match a lowercase word, at least some space, and
+                     # any number of digits
+    /(\w+)\s+\1/;    # match doubled words of arbitrary length
+    /y(es)?/i;       # matches 'y', 'Y', or a case-insensitive 'yes'
+    $year =~ /\d{2,4}/;  # make sure year is at least 2 but not more
+                         # than 4 digits
+    $year =~ /\d{4}|\d{2}/;    # better match; throw out 3 digit dates
+    $year =~ /\d{2}(\d{2})?/;  # same thing written differently. However,
+                               # this produces $1 and the other does not.
+
+    % simple_grep '^(\w+)\1$' /usr/dict/words   # isn't this easier?
+    beriberi
+    booboo
+    coco
+    mama
+    murmur
+    papa
+
+For all of these quantifiers, perl will try to match as much of the
+string as possible, while still allowing the regexp to succeed.  Thus
+with C</a?.../>, perl will first try to match the regexp with the C<a>
+present; if that fails, perl will try to match the regexp without the
+C<a> present.  For the quantifier C<*>, we get the following:
+
+    $x = "the cat in the hat";
+    $x =~ /^(.*)(cat)(.*)$/; # matches,
+                             # $1 = 'the '
+                             # $2 = 'cat'
+                             # $3 = ' in the hat'
+
+Which is what we might expect, the match finds the only C<cat> in the
+string and locks onto it.  Consider, however, this regexp:
+
+    $x =~ /^(.*)(at)(.*)$/; # matches,
+                            # $1 = 'the cat in the h'
+                            # $2 = 'at'
+                            # $3 = ''   (0 matches)
+
+One might initially guess that perl would find the C<at> in C<cat> and
+stop there, but that wouldn't give the longest possible string to the
+first quantifier C<.*>.  Instead, the first quantifier C<.*> grabs as
+much of the string as possible while still having the regexp match.  In
+this example, that means having the C<at> sequence with the final C<at>
+in the string.  The other important principle illustrated here is that
+when there are two or more elements in a regexp, the I<leftmost>
+quantifier, if there is one, gets to grab as much the string as
+possible, leaving the rest of the regexp to fight over scraps.  Thus in
+our example, the first quantifier C<.*> grabs most of the string, while
+the second quantifier C<.*> gets the empty string.   Quantifiers that
+grab as much of the string as possible are called B<maximal match> or
+B<greedy> quantifiers.
+
+When a regexp can match a string in several different ways, we can use
+the principles above to predict which way the regexp will match:
+
+=over 4
+
+=item *
+
+Principle 0: Taken as a whole, any regexp will be matched at the
+earliest possible position in the string.
+
+=item *
+
+Principle 1: In an alternation C<a|b|c...>, the leftmost alternative
+that allows a match for the whole regexp will be the one used.
+
+=item *
+
+Principle 2: The maximal matching quantifiers C<?>, C<*>, C<+> and
+C<{n,m}> will in general match as much of the string as possible while
+still allowing the whole regexp to match.
+
+=item *
+
+Principle 3: If there are two or more elements in a regexp, the
+leftmost greedy quantifier, if any, will match as much of the string
+as possible while still allowing the whole regexp to match.  The next
+leftmost greedy quantifier, if any, will try to match as much of the
+string remaining available to it as possible, while still allowing the
+whole regexp to match.  And so on, until all the regexp elements are
+satisfied.
+
+=back
+
+As we have seen above, Principle 0 overrides the others - the regexp
+will be matched as early as possible, with the other principles
+determining how the regexp matches at that earliest character
+position.
+
+Here is an example of these principles in action:
+
+    $x = "The programming republic of Perl";
+    $x =~ /^(.+)(e|r)(.*)$/;  # matches,
+                              # $1 = 'The programming republic of Pe'
+                              # $2 = 'r'
+                              # $3 = 'l'
+
+This regexp matches at the earliest string position, C<'T'>.  One
+might think that C<e>, being leftmost in the alternation, would be
+matched, but C<r> produces the longest string in the first quantifier.
+
+    $x =~ /(m{1,2})(.*)$/;  # matches,
+                            # $1 = 'mm'
+                            # $2 = 'ing republic of Perl'
+
+Here, The earliest possible match is at the first C<'m'> in
+C<programming>. C<m{1,2}> is the first quantifier, so it gets to match
+a maximal C<mm>.
+
+    $x =~ /.*(m{1,2})(.*)$/;  # matches,
+                              # $1 = 'm'
+                              # $2 = 'ing republic of Perl'
+
+Here, the regexp matches at the start of the string. The first
+quantifier C<.*> grabs as much as possible, leaving just a single
+C<'m'> for the second quantifier C<m{1,2}>.
+
+    $x =~ /(.?)(m{1,2})(.*)$/;  # matches,
+                                # $1 = 'a'
+                                # $2 = 'mm'
+                                # $3 = 'ing republic of Perl'
+
+Here, C<.?> eats its maximal one character at the earliest possible
+position in the string, C<'a'> in C<programming>, leaving C<m{1,2}>
+the opportunity to match both C<m>'s. Finally,
+
+    "aXXXb" =~ /(X*)/; # matches with $1 = ''
+
+because it can match zero copies of C<'X'> at the beginning of the
+string.  If you definitely want to match at least one C<'X'>, use
+C<X+>, not C<X*>.
+
+Sometimes greed is not good.  At times, we would like quantifiers to
+match a I<minimal> piece of string, rather than a maximal piece.  For
+this purpose, Larry Wall created the S<B<minimal match> > or
+B<non-greedy> quantifiers C<??>,C<*?>, C<+?>, and C<{}?>.  These are
+the usual quantifiers with a C<?> appended to them.  They have the
+following meanings:
+
+=over 4
+
+=item *
+
+C<a??> = match 'a' 0 or 1 times. Try 0 first, then 1.
+
+=item *
+
+C<a*?> = match 'a' 0 or more times, i.e., any number of times,
+but as few times as possible
+
+=item *
+
+C<a+?> = match 'a' 1 or more times, i.e., at least once, but
+as few times as possible
+
+=item *
+
+C<a{n,m}?> = match at least C<n> times, not more than C<m>
+times, as few times as possible
+
+=item *
+
+C<a{n,}?> = match at least C<n> times, but as few times as
+possible
+
+=item *
+
+C<a{n}?> = match exactly C<n> times.  Because we match exactly
+C<n> times, C<a{n}?> is equivalent to C<a{n}> and is just there for
+notational consistency.
+
+=back
+
+Let's look at the example above, but with minimal quantifiers:
+
+    $x = "The programming republic of Perl";
+    $x =~ /^(.+?)(e|r)(.*)$/; # matches,
+                              # $1 = 'Th'
+                              # $2 = 'e'
+                              # $3 = ' programming republic of Perl'
+
+The minimal string that will allow both the start of the string C<^>
+and the alternation to match is C<Th>, with the alternation C<e|r>
+matching C<e>.  The second quantifier C<.*> is free to gobble up the
+rest of the string.
+
+    $x =~ /(m{1,2}?)(.*?)$/;  # matches,
+                              # $1 = 'm'
+                              # $2 = 'ming republic of Perl'
+
+The first string position that this regexp can match is at the first
+C<'m'> in C<programming>. At this position, the minimal C<m{1,2}?>
+matches just one C<'m'>.  Although the second quantifier C<.*?> would
+prefer to match no characters, it is constrained by the end-of-string
+anchor C<$> to match the rest of the string.
+
+    $x =~ /(.*?)(m{1,2}?)(.*)$/;  # matches,
+                                  # $1 = 'The progra'
+                                  # $2 = 'm'
+                                  # $3 = 'ming republic of Perl'
+
+In this regexp, you might expect the first minimal quantifier C<.*?>
+to match the empty string, because it is not constrained by a C<^>
+anchor to match the beginning of the word.  Principle 0 applies here,
+however.  Because it is possible for the whole regexp to match at the
+start of the string, it I<will> match at the start of the string.  Thus
+the first quantifier has to match everything up to the first C<m>.  The
+second minimal quantifier matches just one C<m> and the third
+quantifier matches the rest of the string.
+
+    $x =~ /(.??)(m{1,2})(.*)$/;  # matches,
+                                 # $1 = 'a'
+                                 # $2 = 'mm'
+                                 # $3 = 'ing republic of Perl'
+
+Just as in the previous regexp, the first quantifier C<.??> can match
+earliest at position C<'a'>, so it does.  The second quantifier is
+greedy, so it matches C<mm>, and the third matches the rest of the
+string.
+
+We can modify principle 3 above to take into account non-greedy
+quantifiers:
+
+=over 4
+
+=item *
+
+Principle 3: If there are two or more elements in a regexp, the
+leftmost greedy (non-greedy) quantifier, if any, will match as much
+(little) of the string as possible while still allowing the whole
+regexp to match.  The next leftmost greedy (non-greedy) quantifier, if
+any, will try to match as much (little) of the string remaining
+available to it as possible, while still allowing the whole regexp to
+match.  And so on, until all the regexp elements are satisfied.
+
+=back
+
+Just like alternation, quantifiers are also susceptible to
+backtracking.  Here is a step-by-step analysis of the example
+
+    $x = "the cat in the hat";
+    $x =~ /^(.*)(at)(.*)$/; # matches,
+                            # $1 = 'the cat in the h'
+                            # $2 = 'at'
+                            # $3 = ''   (0 matches)
+
+=over 4
+
+=item 0
+
+Start with the first letter in the string 't'.
+
+=item 1
+
+The first quantifier '.*' starts out by matching the whole
+string 'the cat in the hat'.
+
+=item 2
+
+'a' in the regexp element 'at' doesn't match the end of the
+string.  Backtrack one character.
+
+=item 3
+
+'a' in the regexp element 'at' still doesn't match the last
+letter of the string 't', so backtrack one more character.
+
+=item 4
+
+Now we can match the 'a' and the 't'.
+
+=item 5
+
+Move on to the third element '.*'.  Since we are at the end of
+the string and '.*' can match 0 times, assign it the empty string.
+
+=item 6
+
+We are done!
+
+=back
+
+Most of the time, all this moving forward and backtracking happens
+quickly and searching is fast.   There are some pathological regexps,
+however, whose execution time exponentially grows with the size of the
+string.  A typical structure that blows up in your face is of the form
+
+    /(a|b+)*/;
+
+The problem is the nested indeterminate quantifiers.  There are many
+different ways of partitioning a string of length n between the C<+>
+and C<*>: one repetition with C<b+> of length n, two repetitions with
+the first C<b+> length k and the second with length n-k, m repetitions
+whose bits add up to length n, etc.  In fact there are an exponential
+number of ways to partition a string as a function of length.  A
+regexp may get lucky and match early in the process, but if there is
+no match, perl will try I<every> possibility before giving up.  So be
+careful with nested C<*>'s, C<{n,m}>'s, and C<+>'s.  The book
+I<Mastering regular expressions> by Jeffrey Friedl gives a wonderful
+discussion of this and other efficiency issues.
+
+=head2 Building a regexp
+
+At this point, we have all the basic regexp concepts covered, so let's
+give a more involved example of a regular expression.  We will build a
+regexp that matches numbers.
+
+The first task in building a regexp is to decide what we want to match
+and what we want to exclude.  In our case, we want to match both
+integers and floating point numbers and we want to reject any string
+that isn't a number.
+
+The next task is to break the problem down into smaller problems that
+are easily converted into a regexp.
+
+The simplest case is integers.  These consist of a sequence of digits,
+with an optional sign in front.  The digits we can represent with
+C<\d+> and the sign can be matched with C<[+-]>.  Thus the integer
+regexp is
+
+    /[+-]?\d+/;  # matches integers
+
+A floating point number potentially has a sign, an integral part, a
+decimal point, a fractional part, and an exponent.  One or more of these
+parts is optional, so we need to check out the different
+possibilities.  Floating point numbers which are in proper form include
+123., 0.345, .34, -1e6, and 25.4E-72.  As with integers, the sign out
+front is completely optional and can be matched by C<[+-]?>.  We can
+see that if there is no exponent, floating point numbers must have a
+decimal point, otherwise they are integers.  We might be tempted to
+model these with C<\d*\.\d*>, but this would also match just a single
+decimal point, which is not a number.  So the three cases of floating
+point number sans exponent are
+
+   /[+-]?\d+\./;  # 1., 321., etc.
+   /[+-]?\.\d+/;  # .1, .234, etc.
+   /[+-]?\d+\.\d+/;  # 1.0, 30.56, etc.
+
+These can be combined into a single regexp with a three-way alternation:
+
+   /[+-]?(\d+\.\d+|\d+\.|\.\d+)/;  # floating point, no exponent
+
+In this alternation, it is important to put C<'\d+\.\d+'> before
+C<'\d+\.'>.  If C<'\d+\.'> were first, the regexp would happily match that
+and ignore the fractional part of the number.
+
+Now consider floating point numbers with exponents.  The key
+observation here is that I<both> integers and numbers with decimal
+points are allowed in front of an exponent.  Then exponents, like the
+overall sign, are independent of whether we are matching numbers with
+or without decimal points, and can be 'decoupled' from the
+mantissa.  The overall form of the regexp now becomes clear:
+
+    /^(optional sign)(integer | f.p. mantissa)(optional exponent)$/;
+
+The exponent is an C<e> or C<E>, followed by an integer.  So the
+exponent regexp is
+
+   /[eE][+-]?\d+/;  # exponent
+
+Putting all the parts together, we get a regexp that matches numbers:
+
+   /^[+-]?(\d+\.\d+|\d+\.|\.\d+|\d+)([eE][+-]?\d+)?$/;  # Ta da!
+
+Long regexps like this may impress your friends, but can be hard to
+decipher.  In complex situations like this, the C<//x> modifier for a
+match is invaluable.  It allows one to put nearly arbitrary whitespace
+and comments into a regexp without affecting their meaning.  Using it,
+we can rewrite our 'extended' regexp in the more pleasing form
+
+   /^
+      [+-]?         # first, match an optional sign
+      (             # then match integers or f.p. mantissas:
+          \d+\.\d+  # mantissa of the form a.b
+         |\d+\.     # mantissa of the form a.
+         |\.\d+     # mantissa of the form .b
+         |\d+       # integer of the form a
+      )
+      ([eE][+-]?\d+)?  # finally, optionally match an exponent
+   $/x;
+
+If whitespace is mostly irrelevant, how does one include space
+characters in an extended regexp? The answer is to backslash it
+S<C<'\ '> > or put it in a character class S<C<[ ]> >.  The same thing
+goes for pound signs, use C<\#> or C<[#]>.  For instance, Perl allows
+a space between the sign and the mantissa/integer, and we could add
+this to our regexp as follows:
+
+   /^
+      [+-]?\ *      # first, match an optional sign *and space*
+      (             # then match integers or f.p. mantissas:
+          \d+\.\d+  # mantissa of the form a.b
+         |\d+\.     # mantissa of the form a.
+         |\.\d+     # mantissa of the form .b
+         |\d+       # integer of the form a
+      )
+      ([eE][+-]?\d+)?  # finally, optionally match an exponent
+   $/x;
+
+In this form, it is easier to see a way to simplify the
+alternation.  Alternatives 1, 2, and 4 all start with C<\d+>, so it
+could be factored out:
+
+   /^
+      [+-]?\ *      # first, match an optional sign
+      (             # then match integers or f.p. mantissas:
+          \d+       # start out with a ...
+          (
+              \.\d* # mantissa of the form a.b or a.
+          )?        # ? takes care of integers of the form a
+         |\.\d+     # mantissa of the form .b
+      )
+      ([eE][+-]?\d+)?  # finally, optionally match an exponent
+   $/x;
+
+or written in the compact form,
+
+    /^[+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/;
+
+This is our final regexp.  To recap, we built a regexp by
+
+=over 4
+
+=item *
+
+specifying the task in detail,
+
+=item *
+
+breaking down the problem into smaller parts,
+
+=item *
+
+translating the small parts into regexps,
+
+=item *
+
+combining the regexps,
+
+=item *
+
+and optimizing the final combined regexp.
+
+=back
+
+These are also the typical steps involved in writing a computer
+program.  This makes perfect sense, because regular expressions are
+essentially programs written a little computer language that specifies
+patterns.
+
+=head2 Using regular expressions in Perl
+
+The last topic of Part 1 briefly covers how regexps are used in Perl
+programs.  Where do they fit into Perl syntax?
+
+We have already introduced the matching operator in its default
+C</regexp/> and arbitrary delimiter C<m!regexp!> forms.  We have used
+the binding operator C<=~> and its negation C<!~> to test for string
+matches.  Associated with the matching operator, we have discussed the
+single line C<//s>, multi-line C<//m>, case-insensitive C<//i> and
+extended C<//x> modifiers.
+
+There are a few more things you might want to know about matching
+operators.  First, we pointed out earlier that variables in regexps are
+substituted before the regexp is evaluated:
+
+    $pattern = 'Seuss';
+    while (<>) {
+        print if /$pattern/;
+    }
+
+This will print any lines containing the word C<Seuss>.  It is not as
+efficient as it could be, however, because perl has to re-evaluate
+C<$pattern> each time through the loop.  If C<$pattern> won't be
+changing over the lifetime of the script, we can add the C<//o>
+modifier, which directs perl to only perform variable substitutions
+once:
+
+    #!/usr/bin/perl
+    #    Improved simple_grep
+    $regexp = shift;
+    while (<>) {
+        print if /$regexp/o;  # a good deal faster
+    }
+
+If you change C<$pattern> after the first substitution happens, perl
+will ignore it.  If you don't want any substitutions at all, use the
+special delimiter C<m''>:
+
+    @pattern = ('Seuss');
+    while (<>) {
+        print if m'@pattern';  # matches literal '@pattern', not 'Seuss'
+    }
+
+C<m''> acts like single quotes on a regexp; all other C<m> delimiters
+act like double quotes.  If the regexp evaluates to the empty string,
+the regexp in the I<last successful match> is used instead.  So we have
+
+    "dog" =~ /d/;  # 'd' matches
+    "dogbert =~ //;  # this matches the 'd' regexp used before
+
+The final two modifiers C<//g> and C<//c> concern multiple matches.
+The modifier C<//g> stands for global matching and allows the
+matching operator to match within a string as many times as possible.
+In scalar context, successive invocations against a string will have
+`C<//g> jump from match to match, keeping track of position in the
+string as it goes along.  You can get or set the position with the
+C<pos()> function.
+
+The use of C<//g> is shown in the following example.  Suppose we have
+a string that consists of words separated by spaces.  If we know how
+many words there are in advance, we could extract the words using
+groupings:
+
+    $x = "cat dog house"; # 3 words
+    $x =~ /^\s*(\w+)\s+(\w+)\s+(\w+)\s*$/; # matches,
+                                           # $1 = 'cat'
+                                           # $2 = 'dog'
+                                           # $3 = 'house'
+
+But what if we had an indeterminate number of words? This is the sort
+of task C<//g> was made for.  To extract all words, form the simple
+regexp C<(\w+)> and loop over all matches with C</(\w+)/g>:
+
+    while ($x =~ /(\w+)/g) {
+        print "Word is $1, ends at position ", pos $x, "\n";
+    }
+
+prints
+
+    Word is cat, ends at position 3
+    Word is dog, ends at position 7
+    Word is house, ends at position 13
+
+A failed match or changing the target string resets the position.  If
+you don't want the position reset after failure to match, add the
+C<//c>, as in C</regexp/gc>.  The current position in the string is
+associated with the string, not the regexp.  This means that different
+strings have different positions and their respective positions can be
+set or read independently.
+
+In list context, C<//g> returns a list of matched groupings, or if
+there are no groupings, a list of matches to the whole regexp.  So if
+we wanted just the words, we could use
+
+    @words = ($x =~ /(\w+)/g);  # matches,
+                                # $word[0] = 'cat'
+                                # $word[1] = 'dog'
+                                # $word[2] = 'house'
+
+Closely associated with the C<//g> modifier is the C<\G> anchor.  The
+C<\G> anchor matches at the point where the previous C<//g> match left
+off.  C<\G> allows us to easily do context-sensitive matching:
+
+    $metric = 1;  # use metric units
+    ...
+    $x = <FILE>;  # read in measurement
+    $x =~ /^([+-]?\d+)\s*/g;  # get magnitude
+    $weight = $1;
+    if ($metric) { # error checking
+        print "Units error!" unless $x =~ /\Gkg\./g;
+    }
+    else {
+        print "Units error!" unless $x =~ /\Glbs\./g;
+    }
+    $x =~ /\G\s+(widget|sprocket)/g;  # continue processing
+
+The combination of C<//g> and C<\G> allows us to process the string a
+bit at a time and use arbitrary Perl logic to decide what to do next.
+Currently, the C<\G> anchor is only fully supported when used to anchor
+to the start of the pattern.
+
+C<\G> is also invaluable in processing fixed length records with
+regexps.  Suppose we have a snippet of coding region DNA, encoded as
+base pair letters C<ATCGTTGAAT...> and we want to find all the stop
+codons C<TGA>.  In a coding region, codons are 3-letter sequences, so
+we can think of the DNA snippet as a sequence of 3-letter records.  The
+naive regexp
+
+    # expanded, this is "ATC GTT GAA TGC AAA TGA CAT GAC"
+    $dna = "ATCGTTGAATGCAAATGACATGAC";
+    $dna =~ /TGA/;
+
+doesn't work; it may match a C<TGA>, but there is no guarantee that
+the match is aligned with codon boundaries, e.g., the substring
+S<C<GTT GAA> > gives a match.  A better solution is
+
+    while ($dna =~ /(\w\w\w)*?TGA/g) {  # note the minimal *?
+        print "Got a TGA stop codon at position ", pos $dna, "\n";
+    }
+
+which prints
+
+    Got a TGA stop codon at position 18
+    Got a TGA stop codon at position 23
+
+Position 18 is good, but position 23 is bogus.  What happened?
+
+The answer is that our regexp works well until we get past the last
+real match.  Then the regexp will fail to match a synchronized C<TGA>
+and start stepping ahead one character position at a time, not what we
+want.  The solution is to use C<\G> to anchor the match to the codon
+alignment:
+
+    while ($dna =~ /\G(\w\w\w)*?TGA/g) {
+        print "Got a TGA stop codon at position ", pos $dna, "\n";
+    }
+
+This prints
+
+    Got a TGA stop codon at position 18
+
+which is the correct answer.  This example illustrates that it is
+important not only to match what is desired, but to reject what is not
+desired.
+
+B<search and replace>
+
+Regular expressions also play a big role in B<search and replace>
+operations in Perl.  Search and replace is accomplished with the
+C<s///> operator.  The general form is
+C<s/regexp/replacement/modifiers>, with everything we know about
+regexps and modifiers applying in this case as well.  The
+C<replacement> is a Perl double quoted string that replaces in the
+string whatever is matched with the C<regexp>.  The operator C<=~> is
+also used here to associate a string with C<s///>.  If matching
+against C<$_>, the S<C<$_ =~> > can be dropped.  If there is a match,
+C<s///> returns the number of substitutions made, otherwise it returns
+false.  Here are a few examples:
+
+    $x = "Time to feed the cat!";
+    $x =~ s/cat/hacker/;   # $x contains "Time to feed the hacker!"
+    if ($x =~ s/^(Time.*hacker)!$/$1 now!/) {
+        $more_insistent = 1;
+    }
+    $y = "'quoted words'";
+    $y =~ s/^'(.*)'$/$1/;  # strip single quotes,
+                           # $y contains "quoted words"
+
+In the last example, the whole string was matched, but only the part
+inside the single quotes was grouped.  With the C<s///> operator, the
+matched variables C<$1>, C<$2>, etc.  are immediately available for use
+in the replacement expression, so we use C<$1> to replace the quoted
+string with just what was quoted.  With the global modifier, C<s///g>
+will search and replace all occurrences of the regexp in the string:
+
+    $x = "I batted 4 for 4";
+    $x =~ s/4/four/;   # doesn't do it all:
+                       # $x contains "I batted four for 4"
+    $x = "I batted 4 for 4";
+    $x =~ s/4/four/g;  # does it all:
+                       # $x contains "I batted four for four"
+
+If you prefer 'regex' over 'regexp' in this tutorial, you could use
+the following program to replace it:
+
+    % cat > simple_replace
+    #!/usr/bin/perl
+    $regexp = shift;
+    $replacement = shift;
+    while (<>) {
+        s/$regexp/$replacement/go;
+        print;
+    }
+    ^D
+
+    % simple_replace regexp regex perlretut.pod
+
+In C<simple_replace> we used the C<s///g> modifier to replace all
+occurrences of the regexp on each line and the C<s///o> modifier to
+compile the regexp only once.  As with C<simple_grep>, both the
+C<print> and the C<s/$regexp/$replacement/go> use C<$_> implicitly.
+
+A modifier available specifically to search and replace is the
+C<s///e> evaluation modifier.  C<s///e> wraps an C<eval{...}> around
+the replacement string and the evaluated result is substituted for the
+matched substring.  C<s///e> is useful if you need to do a bit of
+computation in the process of replacing text.  This example counts
+character frequencies in a line:
+
+    $x = "Bill the cat";
+    $x =~ s/(.)/$chars{$1}++;$1/eg;  # final $1 replaces char with itself
+    print "frequency of '$_' is $chars{$_}\n"
+        foreach (sort {$chars{$b} <=> $chars{$a}} keys %chars);
+
+This prints
+
+    frequency of ' ' is 2
+    frequency of 't' is 2
+    frequency of 'l' is 2
+    frequency of 'B' is 1
+    frequency of 'c' is 1
+    frequency of 'e' is 1
+    frequency of 'h' is 1
+    frequency of 'i' is 1
+    frequency of 'a' is 1
+
+As with the match C<m//> operator, C<s///> can use other delimiters,
+such as C<s!!!> and C<s{}{}>, and even C<s{}//>.  If single quotes are
+used C<s'''>, then the regexp and replacement are treated as single
+quoted strings and there are no substitutions.  C<s///> in list context
+returns the same thing as in scalar context, i.e., the number of
+matches.
+
+B<The split operator>
+
+The B<C<split> > function can also optionally use a matching operator
+C<m//> to split a string.  C<split /regexp/, string, limit> splits
+C<string> into a list of substrings and returns that list.  The regexp
+is used to match the character sequence that the C<string> is split
+with respect to.  The C<limit>, if present, constrains splitting into
+no more than C<limit> number of strings.  For example, to split a
+string into words, use
+
+    $x = "Calvin and Hobbes";
+    @words = split /\s+/, $x;  # $word[0] = 'Calvin'
+                               # $word[1] = 'and'
+                               # $word[2] = 'Hobbes'
+
+If the empty regexp C<//> is used, the regexp always matches and
+the string is split into individual characters.  If the regexp has
+groupings, then list produced contains the matched substrings from the
+groupings as well.  For instance,
+
+    $x = "/usr/bin/perl";
+    @dirs = split m!/!, $x;  # $dirs[0] = ''
+                             # $dirs[1] = 'usr'
+                             # $dirs[2] = 'bin'
+                             # $dirs[3] = 'perl'
+    @parts = split m!(/)!, $x;  # $parts[0] = ''
+                                # $parts[1] = '/'
+                                # $parts[2] = 'usr'
+                                # $parts[3] = '/'
+                                # $parts[4] = 'bin'
+                                # $parts[5] = '/'
+                                # $parts[6] = 'perl'
+
+Since the first character of $x matched the regexp, C<split> prepended
+an empty initial element to the list.
+
+If you have read this far, congratulations! You now have all the basic
+tools needed to use regular expressions to solve a wide range of text
+processing problems.  If this is your first time through the tutorial,
+why not stop here and play around with regexps a while...  S<Part 2>
+concerns the more esoteric aspects of regular expressions and those
+concepts certainly aren't needed right at the start.
+
+=head1 Part 2: Power tools
+
+OK, you know the basics of regexps and you want to know more.  If
+matching regular expressions is analogous to a walk in the woods, then
+the tools discussed in Part 1 are analogous to topo maps and a
+compass, basic tools we use all the time.  Most of the tools in part 2
+are analogous to flare guns and satellite phones.  They aren't used
+too often on a hike, but when we are stuck, they can be invaluable.
+
+What follows are the more advanced, less used, or sometimes esoteric
+capabilities of perl regexps.  In Part 2, we will assume you are
+comfortable with the basics and concentrate on the new features.
+
+=head2 More on characters, strings, and character classes
+
+There are a number of escape sequences and character classes that we
+haven't covered yet.
+
+There are several escape sequences that convert characters or strings
+between upper and lower case.  C<\l> and C<\u> convert the next
+character to lower or upper case, respectively:
+
+    $x = "perl";
+    $string =~ /\u$x/;  # matches 'Perl' in $string
+    $x = "M(rs?|s)\\."; # note the double backslash
+    $string =~ /\l$x/;  # matches 'mr.', 'mrs.', and 'ms.',
+
+C<\L> and C<\U> converts a whole substring, delimited by C<\L> or
+C<\U> and C<\E>, to lower or upper case:
+
+    $x = "This word is in lower case:\L SHOUT\E";
+    $x =~ /shout/;       # matches
+    $x = "I STILL KEYPUNCH CARDS FOR MY 360"
+    $x =~ /\Ukeypunch/;  # matches punch card string
+
+If there is no C<\E>, case is converted until the end of the
+string. The regexps C<\L\u$word> or C<\u\L$word> convert the first
+character of C<$word> to uppercase and the rest of the characters to
+lowercase.
+
+Control characters can be escaped with C<\c>, so that a control-Z
+character would be matched with C<\cZ>.  The escape sequence
+C<\Q>...C<\E> quotes, or protects most non-alphabetic characters.   For
+instance,
+
+    $x = "\QThat !^*&%~& cat!";
+    $x =~ /\Q!^*&%~&\E/;  # check for rough language
+
+It does not protect C<$> or C<@>, so that variables can still be
+substituted.
+
+With the advent of 5.6.0, perl regexps can handle more than just the
+standard ASCII character set.  Perl now supports B<Unicode>, a standard
+for encoding the character sets from many of the world's written
+languages.  Unicode does this by allowing characters to be more than
+one byte wide.  Perl uses the UTF-8 encoding, in which ASCII characters
+are still encoded as one byte, but characters greater than C<chr(127)>
+may be stored as two or more bytes.
+
+What does this mean for regexps? Well, regexp users don't need to know
+much about perl's internal representation of strings.  But they do need
+to know 1) how to represent Unicode characters in a regexp and 2) when
+a matching operation will treat the string to be searched as a
+sequence of bytes (the old way) or as a sequence of Unicode characters
+(the new way).  The answer to 1) is that Unicode characters greater
+than C<chr(127)> may be represented using the C<\x{hex}> notation,
+with C<hex> a hexadecimal integer:
+
+    /\x{263a}/;  # match a Unicode smiley face :)
+
+Unicode characters in the range of 128-255 use two hexadecimal digits
+with braces: C<\x{ab}>.  Note that this is different than C<\xab>,
+which is just a hexadecimal byte with no Unicode significance.
+
+B<NOTE>: in Perl 5.6.0 it used to be that one needed to say C<use
+utf8> to use any Unicode features.  This is no more the case: for
+almost all Unicode processing, the explicit C<utf8> pragma is not
+needed.  (The only case where it matters is if your Perl script is in
+Unicode and encoded in UTF-8, then an explicit C<use utf8> is needed.)
+
+Figuring out the hexadecimal sequence of a Unicode character you want
+or deciphering someone else's hexadecimal Unicode regexp is about as
+much fun as programming in machine code.  So another way to specify
+Unicode characters is to use the S<B<named character> > escape
+sequence C<\N{name}>.  C<name> is a name for the Unicode character, as
+specified in the Unicode standard.  For instance, if we wanted to
+represent or match the astrological sign for the planet Mercury, we
+could use
+
+    use charnames ":full"; # use named chars with Unicode full names
+    $x = "abc\N{MERCURY}def";
+    $x =~ /\N{MERCURY}/;   # matches
+
+One can also use short names or restrict names to a certain alphabet:
+
+    use charnames ':full';
+    print "\N{GREEK SMALL LETTER SIGMA} is called sigma.\n";
+
+    use charnames ":short";
+    print "\N{greek:Sigma} is an upper-case sigma.\n";
+
+    use charnames qw(greek);
+    print "\N{sigma} is Greek sigma\n";
+
+A list of full names is found in the file Names.txt in the
+lib/perl5/5.X.X/unicore directory.
+
+The answer to requirement 2), as of 5.6.0, is that if a regexp
+contains Unicode characters, the string is searched as a sequence of
+Unicode characters.  Otherwise, the string is searched as a sequence of
+bytes.  If the string is being searched as a sequence of Unicode
+characters, but matching a single byte is required, we can use the C<\C>
+escape sequence.  C<\C> is a character class akin to C<.> except that
+it matches I<any> byte 0-255.  So
+
+    use charnames ":full"; # use named chars with Unicode full names
+    $x = "a";
+    $x =~ /\C/;  # matches 'a', eats one byte
+    $x = "";
+    $x =~ /\C/;  # doesn't match, no bytes to match
+    $x = "\N{MERCURY}";  # two-byte Unicode character
+    $x =~ /\C/;  # matches, but dangerous!
+
+The last regexp matches, but is dangerous because the string
+I<character> position is no longer synchronized to the string I<byte>
+position.  This generates the warning 'Malformed UTF-8
+character'.  The C<\C> is best used for matching the binary data in strings
+with binary data intermixed with Unicode characters.
+
+Let us now discuss the rest of the character classes.  Just as with
+Unicode characters, there are named Unicode character classes
+represented by the C<\p{name}> escape sequence.  Closely associated is
+the C<\P{name}> character class, which is the negation of the
+C<\p{name}> class.  For example, to match lower and uppercase
+characters,
+
+    use charnames ":full"; # use named chars with Unicode full names
+    $x = "BOB";
+    $x =~ /^\p{IsUpper}/;   # matches, uppercase char class
+    $x =~ /^\P{IsUpper}/;   # doesn't match, char class sans uppercase
+    $x =~ /^\p{IsLower}/;   # doesn't match, lowercase char class
+    $x =~ /^\P{IsLower}/;   # matches, char class sans lowercase
+
+Here is the association between some Perl named classes and the
+traditional Unicode classes:
+
+    Perl class name  Unicode class name or regular expression
+
+    IsAlpha          /^[LM]/
+    IsAlnum          /^[LMN]/
+    IsASCII          $code <= 127
+    IsCntrl          /^C/
+    IsBlank          $code =~ /^(0020|0009)$/ || /^Z[^lp]/
+    IsDigit          Nd
+    IsGraph          /^([LMNPS]|Co)/
+    IsLower          Ll
+    IsPrint          /^([LMNPS]|Co|Zs)/
+    IsPunct          /^P/
+    IsSpace          /^Z/ || ($code =~ /^(0009|000A|000B|000C|000D)$/
+    IsSpacePerl      /^Z/ || ($code =~ /^(0009|000A|000C|000D|0085|2028|2029)$/
+    IsUpper          /^L[ut]/
+    IsWord           /^[LMN]/ || $code eq "005F"
+    IsXDigit         $code =~ /^00(3[0-9]|[46][1-6])$/
+
+You can also use the official Unicode class names with the C<\p> and
+C<\P>, like C<\p{L}> for Unicode 'letters', or C<\p{Lu}> for uppercase
+letters, or C<\P{Nd}> for non-digits.  If a C<name> is just one
+letter, the braces can be dropped.  For instance, C<\pM> is the
+character class of Unicode 'marks', for example accent marks.
+For the full list see L<perlunicode>.
+
+The Unicode has also been separated into various sets of characters
+which you can test with C<\p{In...}> (in) and C<\P{In...}> (not in),
+for example C<\p{Latin}>, C<\p{Greek}>, or C<\P{Katakana}>.
+For the full list see L<perlunicode>.
+
+C<\X> is an abbreviation for a character class sequence that includes
+the Unicode 'combining character sequences'.  A 'combining character
+sequence' is a base character followed by any number of combining
+characters.  An example of a combining character is an accent.   Using
+the Unicode full names, e.g., S<C<A + COMBINING RING> > is a combining
+character sequence with base character C<A> and combining character
+S<C<COMBINING RING> >, which translates in Danish to A with the circle
+atop it, as in the word Angstrom.  C<\X> is equivalent to C<\PM\pM*}>,
+i.e., a non-mark followed by one or more marks.
+
+For the full and latest information about Unicode see the latest
+Unicode standard, or the Unicode Consortium's website http://www.unicode.org/
+
+As if all those classes weren't enough, Perl also defines POSIX style
+character classes.  These have the form C<[:name:]>, with C<name> the
+name of the POSIX class.  The POSIX classes are C<alpha>, C<alnum>,
+C<ascii>, C<cntrl>, C<digit>, C<graph>, C<lower>, C<print>, C<punct>,
+C<space>, C<upper>, and C<xdigit>, and two extensions, C<word> (a Perl
+extension to match C<\w>), and C<blank> (a GNU extension).  If C<utf8>
+is being used, then these classes are defined the same as their
+corresponding perl Unicode classes: C<[:upper:]> is the same as
+C<\p{IsUpper}>, etc.  The POSIX character classes, however, don't
+require using C<utf8>.  The C<[:digit:]>, C<[:word:]>, and
+C<[:space:]> correspond to the familiar C<\d>, C<\w>, and C<\s>
+character classes.  To negate a POSIX class, put a C<^> in front of
+the name, so that, e.g., C<[:^digit:]> corresponds to C<\D> and under
+C<utf8>, C<\P{IsDigit}>.  The Unicode and POSIX character classes can
+be used just like C<\d>, with the exception that POSIX character
+classes can only be used inside of a character class:
+
+    /\s+[abc[:digit:]xyz]\s*/;  # match a,b,c,x,y,z, or a digit
+    /^=item\s[[:digit:]]/;      # match '=item',
+                                # followed by a space and a digit
+    use charnames ":full";
+    /\s+[abc\p{IsDigit}xyz]\s+/;  # match a,b,c,x,y,z, or a digit
+    /^=item\s\p{IsDigit}/;        # match '=item',
+                                  # followed by a space and a digit
+
+Whew! That is all the rest of the characters and character classes.
+
+=head2 Compiling and saving regular expressions
+
+In Part 1 we discussed the C<//o> modifier, which compiles a regexp
+just once.  This suggests that a compiled regexp is some data structure
+that can be stored once and used again and again.  The regexp quote
+C<qr//> does exactly that: C<qr/string/> compiles the C<string> as a
+regexp and transforms the result into a form that can be assigned to a
+variable:
+
+    $reg = qr/foo+bar?/;  # reg contains a compiled regexp
+
+Then C<$reg> can be used as a regexp:
+
+    $x = "fooooba";
+    $x =~ $reg;     # matches, just like /foo+bar?/
+    $x =~ /$reg/;   # same thing, alternate form
+
+C<$reg> can also be interpolated into a larger regexp:
+
+    $x =~ /(abc)?$reg/;  # still matches
+
+As with the matching operator, the regexp quote can use different
+delimiters, e.g., C<qr!!>, C<qr{}> and C<qr~~>.  The single quote
+delimiters C<qr''> prevent any interpolation from taking place.
+
+Pre-compiled regexps are useful for creating dynamic matches that
+don't need to be recompiled each time they are encountered.  Using
+pre-compiled regexps, C<simple_grep> program can be expanded into a
+program that matches multiple patterns:
+
+    % cat > multi_grep
+    #!/usr/bin/perl
+    # multi_grep - match any of <number> regexps
+    # usage: multi_grep <number> regexp1 regexp2 ... file1 file2 ...
+
+    $number = shift;
+    $regexp[$_] = shift foreach (0..$number-1);
+    @compiled = map qr/$_/, @regexp;
+    while ($line = <>) {
+        foreach $pattern (@compiled) {
+            if ($line =~ /$pattern/) {
+                print $line;
+                last;  # we matched, so move onto the next line
+            }
+        }
+    }
+    ^D
+
+    % multi_grep 2 last for multi_grep
+        $regexp[$_] = shift foreach (0..$number-1);
+            foreach $pattern (@compiled) {
+                    last;
+
+Storing pre-compiled regexps in an array C<@compiled> allows us to
+simply loop through the regexps without any recompilation, thus gaining
+flexibility without sacrificing speed.
+
+=head2 Embedding comments and modifiers in a regular expression
+
+Starting with this section, we will be discussing Perl's set of
+B<extended patterns>.  These are extensions to the traditional regular
+expression syntax that provide powerful new tools for pattern
+matching.  We have already seen extensions in the form of the minimal
+matching constructs C<??>, C<*?>, C<+?>, C<{n,m}?>, and C<{n,}?>.  The
+rest of the extensions below have the form C<(?char...)>, where the
+C<char> is a character that determines the type of extension.
+
+The first extension is an embedded comment C<(?#text)>.  This embeds a
+comment into the regular expression without affecting its meaning.  The
+comment should not have any closing parentheses in the text.  An
+example is
+
+    /(?# Match an integer:)[+-]?\d+/;
+
+This style of commenting has been largely superseded by the raw,
+freeform commenting that is allowed with the C<//x> modifier.
+
+The modifiers C<//i>, C<//m>, C<//s>, and C<//x> can also embedded in
+a regexp using C<(?i)>, C<(?m)>, C<(?s)>, and C<(?x)>.  For instance,
+
+    /(?i)yes/;  # match 'yes' case insensitively
+    /yes/i;     # same thing
+    /(?x)(          # freeform version of an integer regexp
+             [+-]?  # match an optional sign
+             \d+    # match a sequence of digits
+         )
+    /x;
+
+Embedded modifiers can have two important advantages over the usual
+modifiers.  Embedded modifiers allow a custom set of modifiers to
+I<each> regexp pattern.  This is great for matching an array of regexps
+that must have different modifiers:
+
+    $pattern[0] = '(?i)doctor';
+    $pattern[1] = 'Johnson';
+    ...
+    while (<>) {
+        foreach $patt (@pattern) {
+            print if /$patt/;
+        }
+    }
+
+The second advantage is that embedded modifiers only affect the regexp
+inside the group the embedded modifier is contained in.  So grouping
+can be used to localize the modifier's effects:
+
+    /Answer: ((?i)yes)/;  # matches 'Answer: yes', 'Answer: YES', etc.
+
+Embedded modifiers can also turn off any modifiers already present
+by using, e.g., C<(?-i)>.  Modifiers can also be combined into
+a single expression, e.g., C<(?s-i)> turns on single line mode and
+turns off case insensitivity.
+
+=head2 Non-capturing groupings
+
+We noted in Part 1 that groupings C<()> had two distinct functions: 1)
+group regexp elements together as a single unit, and 2) extract, or
+capture, substrings that matched the regexp in the
+grouping.  Non-capturing groupings, denoted by C<(?:regexp)>, allow the
+regexp to be treated as a single unit, but don't extract substrings or
+set matching variables C<$1>, etc.  Both capturing and non-capturing
+groupings are allowed to co-exist in the same regexp.  Because there is
+no extraction, non-capturing groupings are faster than capturing
+groupings.  Non-capturing groupings are also handy for choosing exactly
+which parts of a regexp are to be extracted to matching variables:
+
+    # match a number, $1-$4 are set, but we only want $1
+    /([+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?)/;
+
+    # match a number faster , only $1 is set
+    /([+-]?\ *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)/;
+
+    # match a number, get $1 = whole number, $2 = exponent
+    /([+-]?\ *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE]([+-]?\d+))?)/;
+
+Non-capturing groupings are also useful for removing nuisance
+elements gathered from a split operation:
+
+    $x = '12a34b5';
+    @num = split /(a|b)/, $x;    # @num = ('12','a','34','b','5')
+    @num = split /(?:a|b)/, $x;  # @num = ('12','34','5')
+
+Non-capturing groupings may also have embedded modifiers:
+C<(?i-m:regexp)> is a non-capturing grouping that matches C<regexp>
+case insensitively and turns off multi-line mode.
+
+=head2 Looking ahead and looking behind
+
+This section concerns the lookahead and lookbehind assertions.  First,
+a little background.
+
+In Perl regular expressions, most regexp elements 'eat up' a certain
+amount of string when they match.  For instance, the regexp element
+C<[abc}]> eats up one character of the string when it matches, in the
+sense that perl moves to the next character position in the string
+after the match.  There are some elements, however, that don't eat up
+characters (advance the character position) if they match.  The examples
+we have seen so far are the anchors.  The anchor C<^> matches the
+beginning of the line, but doesn't eat any characters.  Similarly, the
+word boundary anchor C<\b> matches, e.g., if the character to the left
+is a word character and the character to the right is a non-word
+character, but it doesn't eat up any characters itself.  Anchors are
+examples of 'zero-width assertions'.  Zero-width, because they consume
+no characters, and assertions, because they test some property of the
+string.  In the context of our walk in the woods analogy to regexp
+matching, most regexp elements move us along a trail, but anchors have
+us stop a moment and check our surroundings.  If the local environment
+checks out, we can proceed forward.  But if the local environment
+doesn't satisfy us, we must backtrack.
+
+Checking the environment entails either looking ahead on the trail,
+looking behind, or both.  C<^> looks behind, to see that there are no
+characters before.  C<$> looks ahead, to see that there are no
+characters after.  C<\b> looks both ahead and behind, to see if the
+characters on either side differ in their 'word'-ness.
+
+The lookahead and lookbehind assertions are generalizations of the
+anchor concept.  Lookahead and lookbehind are zero-width assertions
+that let us specify which characters we want to test for.  The
+lookahead assertion is denoted by C<(?=regexp)> and the lookbehind
+assertion is denoted by C<< (?<=fixed-regexp) >>.  Some examples are
+
+    $x = "I catch the housecat 'Tom-cat' with catnip";
+    $x =~ /cat(?=\s+)/;  # matches 'cat' in 'housecat'
+    @catwords = ($x =~ /(?<=\s)cat\w+/g);  # matches,
+                                           # $catwords[0] = 'catch'
+                                           # $catwords[1] = 'catnip'
+    $x =~ /\bcat\b/;  # matches 'cat' in 'Tom-cat'
+    $x =~ /(?<=\s)cat(?=\s)/; # doesn't match; no isolated 'cat' in
+                              # middle of $x
+
+Note that the parentheses in C<(?=regexp)> and C<< (?<=regexp) >> are
+non-capturing, since these are zero-width assertions.  Thus in the
+second regexp, the substrings captured are those of the whole regexp
+itself.  Lookahead C<(?=regexp)> can match arbitrary regexps, but
+lookbehind C<< (?<=fixed-regexp) >> only works for regexps of fixed
+width, i.e., a fixed number of characters long.  Thus
+C<< (?<=(ab|bc)) >> is fine, but C<< (?<=(ab)*) >> is not.  The
+negated versions of the lookahead and lookbehind assertions are
+denoted by C<(?!regexp)> and C<< (?<!fixed-regexp) >> respectively.
+They evaluate true if the regexps do I<not> match:
+
+    $x = "foobar";
+    $x =~ /foo(?!bar)/;  # doesn't match, 'bar' follows 'foo'
+    $x =~ /foo(?!baz)/;  # matches, 'baz' doesn't follow 'foo'
+    $x =~ /(?<!\s)foo/;  # matches, there is no \s before 'foo'
+
+The C<\C> is unsupported in lookbehind, because the already
+treacherous definition of C<\C> would become even more so
+when going backwards.
+
+=head2 Using independent subexpressions to prevent backtracking
+
+The last few extended patterns in this tutorial are experimental as of
+5.6.0.  Play with them, use them in some code, but don't rely on them
+just yet for production code.
+
+S<B<Independent subexpressions> > are regular expressions, in the
+context of a larger regular expression, that function independently of
+the larger regular expression.  That is, they consume as much or as
+little of the string as they wish without regard for the ability of
+the larger regexp to match.  Independent subexpressions are represented
+by C<< (?>regexp) >>.  We can illustrate their behavior by first
+considering an ordinary regexp:
+
+    $x = "ab";
+    $x =~ /a*ab/;  # matches
+
+This obviously matches, but in the process of matching, the
+subexpression C<a*> first grabbed the C<a>.  Doing so, however,
+wouldn't allow the whole regexp to match, so after backtracking, C<a*>
+eventually gave back the C<a> and matched the empty string.  Here, what
+C<a*> matched was I<dependent> on what the rest of the regexp matched.
+
+Contrast that with an independent subexpression:
+
+    $x =~ /(?>a*)ab/;  # doesn't match!
+
+The independent subexpression C<< (?>a*) >> doesn't care about the rest
+of the regexp, so it sees an C<a> and grabs it.  Then the rest of the
+regexp C<ab> cannot match.  Because C<< (?>a*) >> is independent, there
+is no backtracking and the independent subexpression does not give
+up its C<a>.  Thus the match of the regexp as a whole fails.  A similar
+behavior occurs with completely independent regexps:
+
+    $x = "ab";
+    $x =~ /a*/g;   # matches, eats an 'a'
+    $x =~ /\Gab/g; # doesn't match, no 'a' available
+
+Here C<//g> and C<\G> create a 'tag team' handoff of the string from
+one regexp to the other.  Regexps with an independent subexpression are
+much like this, with a handoff of the string to the independent
+subexpression, and a handoff of the string back to the enclosing
+regexp.
+
+The ability of an independent subexpression to prevent backtracking
+can be quite useful.  Suppose we want to match a non-empty string
+enclosed in parentheses up to two levels deep.  Then the following
+regexp matches:
+
+    $x = "abc(de(fg)h";  # unbalanced parentheses
+    $x =~ /\( ( [^()]+ | \([^()]*\) )+ \)/x;
+
+The regexp matches an open parenthesis, one or more copies of an
+alternation, and a close parenthesis.  The alternation is two-way, with
+the first alternative C<[^()]+> matching a substring with no
+parentheses and the second alternative C<\([^()]*\)>  matching a
+substring delimited by parentheses.  The problem with this regexp is
+that it is pathological: it has nested indeterminate quantifiers
+of the form C<(a+|b)+>.  We discussed in Part 1 how nested quantifiers
+like this could take an exponentially long time to execute if there
+was no match possible.  To prevent the exponential blowup, we need to
+prevent useless backtracking at some point.  This can be done by
+enclosing the inner quantifier as an independent subexpression:
+
+    $x =~ /\( ( (?>[^()]+) | \([^()]*\) )+ \)/x;
+
+Here, C<< (?>[^()]+) >> breaks the degeneracy of string partitioning
+by gobbling up as much of the string as possible and keeping it.   Then
+match failures fail much more quickly.
+
+=head2 Conditional expressions
+
+A S<B<conditional expression> > is a form of if-then-else statement
+that allows one to choose which patterns are to be matched, based on
+some condition.  There are two types of conditional expression:
+C<(?(condition)yes-regexp)> and
+C<(?(condition)yes-regexp|no-regexp)>.  C<(?(condition)yes-regexp)> is
+like an S<C<'if () {}'> > statement in Perl.  If the C<condition> is true,
+the C<yes-regexp> will be matched.  If the C<condition> is false, the
+C<yes-regexp> will be skipped and perl will move onto the next regexp
+element.  The second form is like an S<C<'if () {} else {}'> > statement
+in Perl.  If the C<condition> is true, the C<yes-regexp> will be
+matched, otherwise the C<no-regexp> will be matched.
+
+The C<condition> can have two forms.  The first form is simply an
+integer in parentheses C<(integer)>.  It is true if the corresponding
+backreference C<\integer> matched earlier in the regexp.  The second
+form is a bare zero width assertion C<(?...)>, either a
+lookahead, a lookbehind, or a code assertion (discussed in the next
+section).
+
+The integer form of the C<condition> allows us to choose, with more
+flexibility, what to match based on what matched earlier in the
+regexp. This searches for words of the form C<"$x$x"> or
+C<"$x$y$y$x">:
+
+    % simple_grep '^(\w+)(\w+)?(?(2)\2\1|\1)$' /usr/dict/words
+    beriberi
+    coco
+    couscous
+    deed
+    ...
+    toot
+    toto
+    tutu
+
+The lookbehind C<condition> allows, along with backreferences,
+an earlier part of the match to influence a later part of the
+match.  For instance,
+
+    /[ATGC]+(?(?<=AA)G|C)$/;
+
+matches a DNA sequence such that it either ends in C<AAG>, or some
+other base pair combination and C<C>.  Note that the form is
+C<< (?(?<=AA)G|C) >> and not C<< (?((?<=AA))G|C) >>; for the
+lookahead, lookbehind or code assertions, the parentheses around the
+conditional are not needed.
+
+=head2 A bit of magic: executing Perl code in a regular expression
+
+Normally, regexps are a part of Perl expressions.
+S<B<Code evaluation> > expressions turn that around by allowing
+arbitrary Perl code to be a part of a regexp.  A code evaluation
+expression is denoted C<(?{code})>, with C<code> a string of Perl
+statements.
+
+Code expressions are zero-width assertions, and the value they return
+depends on their environment.  There are two possibilities: either the
+code expression is used as a conditional in a conditional expression
+C<(?(condition)...)>, or it is not.  If the code expression is a
+conditional, the code is evaluated and the result (i.e., the result of
+the last statement) is used to determine truth or falsehood.  If the
+code expression is not used as a conditional, the assertion always
+evaluates true and the result is put into the special variable
+C<$^R>.  The variable C<$^R> can then be used in code expressions later
+in the regexp.  Here are some silly examples:
+
+    $x = "abcdef";
+    $x =~ /abc(?{print "Hi Mom!";})def/; # matches,
+                                         # prints 'Hi Mom!'
+    $x =~ /aaa(?{print "Hi Mom!";})def/; # doesn't match,
+                                         # no 'Hi Mom!'
+
+Pay careful attention to the next example:
+
+    $x =~ /abc(?{print "Hi Mom!";})ddd/; # doesn't match,
+                                         # no 'Hi Mom!'
+                                         # but why not?
+
+At first glance, you'd think that it shouldn't print, because obviously
+the C<ddd> isn't going to match the target string. But look at this
+example:
+
+    $x =~ /abc(?{print "Hi Mom!";})[d]dd/; # doesn't match,
+                                           # but _does_ print
+
+Hmm. What happened here? If you've been following along, you know that
+the above pattern should be effectively the same as the last one --
+enclosing the d in a character class isn't going to change what it
+matches. So why does the first not print while the second one does?
+
+The answer lies in the optimizations the REx engine makes. In the first
+case, all the engine sees are plain old characters (aside from the
+C<?{}> construct). It's smart enough to realize that the string 'ddd'
+doesn't occur in our target string before actually running the pattern
+through. But in the second case, we've tricked it into thinking that our
+pattern is more complicated than it is. It takes a look, sees our
+character class, and decides that it will have to actually run the
+pattern to determine whether or not it matches, and in the process of
+running it hits the print statement before it discovers that we don't
+have a match.
+
+To take a closer look at how the engine does optimizations, see the
+section L<"Pragmas and debugging"> below.
+
+More fun with C<?{}>:
+
+    $x =~ /(?{print "Hi Mom!";})/;       # matches,
+                                         # prints 'Hi Mom!'
+    $x =~ /(?{$c = 1;})(?{print "$c";})/;  # matches,
+                                           # prints '1'
+    $x =~ /(?{$c = 1;})(?{print "$^R";})/; # matches,
+                                           # prints '1'
+
+The bit of magic mentioned in the section title occurs when the regexp
+backtracks in the process of searching for a match.  If the regexp
+backtracks over a code expression and if the variables used within are
+localized using C<local>, the changes in the variables produced by the
+code expression are undone! Thus, if we wanted to count how many times
+a character got matched inside a group, we could use, e.g.,
+
+    $x = "aaaa";
+    $count = 0;  # initialize 'a' count
+    $c = "bob";  # test if $c gets clobbered
+    $x =~ /(?{local $c = 0;})         # initialize count
+           ( a                        # match 'a'
+             (?{local $c = $c + 1;})  # increment count
+           )*                         # do this any number of times,
+           aa                         # but match 'aa' at the end
+           (?{$count = $c;})          # copy local $c var into $count
+          /x;
+    print "'a' count is $count, \$c variable is '$c'\n";
+
+This prints
+
+    'a' count is 2, $c variable is 'bob'
+
+If we replace the S<C< (?{local $c = $c + 1;})> > with
+S<C< (?{$c = $c + 1;})> >, the variable changes are I<not> undone
+during backtracking, and we get
+
+    'a' count is 4, $c variable is 'bob'
+
+Note that only localized variable changes are undone.  Other side
+effects of code expression execution are permanent.  Thus
+
+    $x = "aaaa";
+    $x =~ /(a(?{print "Yow\n";}))*aa/;
+
+produces
+
+   Yow
+   Yow
+   Yow
+   Yow
+
+The result C<$^R> is automatically localized, so that it will behave
+properly in the presence of backtracking.
+
+This example uses a code expression in a conditional to match the
+article 'the' in either English or German:
+
+    $lang = 'DE';  # use German
+    ...
+    $text = "das";
+    print "matched\n"
+        if $text =~ /(?(?{
+                          $lang eq 'EN'; # is the language English?
+                         })
+                       the |             # if so, then match 'the'
+                       (die|das|der)     # else, match 'die|das|der'
+                     )
+                    /xi;
+
+Note that the syntax here is C<(?(?{...})yes-regexp|no-regexp)>, not
+C<(?((?{...}))yes-regexp|no-regexp)>.  In other words, in the case of a
+code expression, we don't need the extra parentheses around the
+conditional.
+
+If you try to use code expressions with interpolating variables, perl
+may surprise you:
+
+    $bar = 5;
+    $pat = '(?{ 1 })';
+    /foo(?{ $bar })bar/; # compiles ok, $bar not interpolated
+    /foo(?{ 1 })$bar/;   # compile error!
+    /foo${pat}bar/;      # compile error!
+
+    $pat = qr/(?{ $foo = 1 })/;  # precompile code regexp
+    /foo${pat}bar/;      # compiles ok
+
+If a regexp has (1) code expressions and interpolating variables, or
+(2) a variable that interpolates a code expression, perl treats the
+regexp as an error. If the code expression is precompiled into a
+variable, however, interpolating is ok. The question is, why is this
+an error?
+
+The reason is that variable interpolation and code expressions
+together pose a security risk.  The combination is dangerous because
+many programmers who write search engines often take user input and
+plug it directly into a regexp:
+
+    $regexp = <>;       # read user-supplied regexp
+    $chomp $regexp;     # get rid of possible newline
+    $text =~ /$regexp/; # search $text for the $regexp
+
+If the C<$regexp> variable contains a code expression, the user could
+then execute arbitrary Perl code.  For instance, some joker could
+search for S<C<system('rm -rf *');> > to erase your files.  In this
+sense, the combination of interpolation and code expressions B<taints>
+your regexp.  So by default, using both interpolation and code
+expressions in the same regexp is not allowed.  If you're not
+concerned about malicious users, it is possible to bypass this
+security check by invoking S<C<use re 'eval'> >:
+
+    use re 'eval';       # throw caution out the door
+    $bar = 5;
+    $pat = '(?{ 1 })';
+    /foo(?{ 1 })$bar/;   # compiles ok
+    /foo${pat}bar/;      # compiles ok
+
+Another form of code expression is the S<B<pattern code expression> >.
+The pattern code expression is like a regular code expression, except
+that the result of the code evaluation is treated as a regular
+expression and matched immediately.  A simple example is
+
+    $length = 5;
+    $char = 'a';
+    $x = 'aaaaabb';
+    $x =~ /(??{$char x $length})/x; # matches, there are 5 of 'a'
+
+
+This final example contains both ordinary and pattern code
+expressions.   It detects if a binary string C<1101010010001...> has a
+Fibonacci spacing 0,1,1,2,3,5,...  of the C<1>'s:
+
+    $s0 = 0; $s1 = 1; # initial conditions
+    $x = "1101010010001000001";
+    print "It is a Fibonacci sequence\n"
+        if $x =~ /^1         # match an initial '1'
+                    (
+                       (??{'0' x $s0}) # match $s0 of '0'
+                       1               # and then a '1'
+                       (?{
+                          $largest = $s0;   # largest seq so far
+                          $s2 = $s1 + $s0;  # compute next term
+                          $s0 = $s1;        # in Fibonacci sequence
+                          $s1 = $s2;
+                         })
+                    )+   # repeat as needed
+                  $      # that is all there is
+                 /x;
+    print "Largest sequence matched was $largest\n";
+
+This prints
+
+    It is a Fibonacci sequence
+    Largest sequence matched was 5
+
+Ha! Try that with your garden variety regexp package...
+
+Note that the variables C<$s0> and C<$s1> are not substituted when the
+regexp is compiled, as happens for ordinary variables outside a code
+expression.  Rather, the code expressions are evaluated when perl
+encounters them during the search for a match.
+
+The regexp without the C<//x> modifier is
+
+    /^1((??{'0'x$s0})1(?{$largest=$s0;$s2=$s1+$s0$s0=$s1;$s1=$s2;}))+$/;
+
+and is a great start on an Obfuscated Perl entry :-) When working with
+code and conditional expressions, the extended form of regexps is
+almost necessary in creating and debugging regexps.
+
+=head2 Pragmas and debugging
+
+Speaking of debugging, there are several pragmas available to control
+and debug regexps in Perl.  We have already encountered one pragma in
+the previous section, S<C<use re 'eval';> >, that allows variable
+interpolation and code expressions to coexist in a regexp.  The other
+pragmas are
+
+    use re 'taint';
+    $tainted = <>;
+    @parts = ($tainted =~ /(\w+)\s+(\w+)/; # @parts is now tainted
+
+The C<taint> pragma causes any substrings from a match with a tainted
+variable to be tainted as well.  This is not normally the case, as
+regexps are often used to extract the safe bits from a tainted
+variable.  Use C<taint> when you are not extracting safe bits, but are
+performing some other processing.  Both C<taint> and C<eval> pragmas
+are lexically scoped, which means they are in effect only until
+the end of the block enclosing the pragmas.
+
+    use re 'debug';
+    /^(.*)$/s;       # output debugging info
+
+    use re 'debugcolor';
+    /^(.*)$/s;       # output debugging info in living color
+
+The global C<debug> and C<debugcolor> pragmas allow one to get
+detailed debugging info about regexp compilation and
+execution.  C<debugcolor> is the same as debug, except the debugging
+information is displayed in color on terminals that can display
+termcap color sequences.  Here is example output:
+
+    % perl -e 'use re "debug"; "abc" =~ /a*b+c/;'
+    Compiling REx `a*b+c'
+    size 9 first at 1
+       1: STAR(4)
+       2:   EXACT <a>(0)
+       4: PLUS(7)
+       5:   EXACT <b>(0)
+       7: EXACT <c>(9)
+       9: END(0)
+    floating `bc' at 0..2147483647 (checking floating) minlen 2
+    Guessing start of match, REx `a*b+c' against `abc'...
+    Found floating substr `bc' at offset 1...
+    Guessed: match at offset 0
+    Matching REx `a*b+c' against `abc'
+      Setting an EVAL scope, savestack=3
+       0 <> <abc>             |  1:  STAR
+                               EXACT <a> can match 1 times out of 32767...
+      Setting an EVAL scope, savestack=3
+       1 <a> <bc>             |  4:    PLUS
+                               EXACT <b> can match 1 times out of 32767...
+      Setting an EVAL scope, savestack=3
+       2 <ab> <c>             |  7:      EXACT <c>
+       3 <abc> <>             |  9:      END
+    Match successful!
+    Freeing REx: `a*b+c'
+
+If you have gotten this far into the tutorial, you can probably guess
+what the different parts of the debugging output tell you.  The first
+part
+
+    Compiling REx `a*b+c'
+    size 9 first at 1
+       1: STAR(4)
+       2:   EXACT <a>(0)
+       4: PLUS(7)
+       5:   EXACT <b>(0)
+       7: EXACT <c>(9)
+       9: END(0)
+
+describes the compilation stage.  C<STAR(4)> means that there is a
+starred object, in this case C<'a'>, and if it matches, goto line 4,
+i.e., C<PLUS(7)>.  The middle lines describe some heuristics and
+optimizations performed before a match:
+
+    floating `bc' at 0..2147483647 (checking floating) minlen 2
+    Guessing start of match, REx `a*b+c' against `abc'...
+    Found floating substr `bc' at offset 1...
+    Guessed: match at offset 0
+
+Then the match is executed and the remaining lines describe the
+process:
+
+    Matching REx `a*b+c' against `abc'
+      Setting an EVAL scope, savestack=3
+       0 <> <abc>             |  1:  STAR
+                               EXACT <a> can match 1 times out of 32767...
+      Setting an EVAL scope, savestack=3
+       1 <a> <bc>             |  4:    PLUS
+                               EXACT <b> can match 1 times out of 32767...
+      Setting an EVAL scope, savestack=3
+       2 <ab> <c>             |  7:      EXACT <c>
+       3 <abc> <>             |  9:      END
+    Match successful!
+    Freeing REx: `a*b+c'
+
+Each step is of the form S<C<< n <x> <y> >> >, with C<< <x> >> the
+part of the string matched and C<< <y> >> the part not yet
+matched.  The S<C<< |  1:  STAR >> > says that perl is at line number 1
+n the compilation list above.  See
+L<perldebguts/"Debugging regular expressions"> for much more detail.
+
+An alternative method of debugging regexps is to embed C<print>
+statements within the regexp.  This provides a blow-by-blow account of
+the backtracking in an alternation:
+
+    "that this" =~ m@(?{print "Start at position ", pos, "\n";})
+                     t(?{print "t1\n";})
+                     h(?{print "h1\n";})
+                     i(?{print "i1\n";})
+                     s(?{print "s1\n";})
+                         |
+                     t(?{print "t2\n";})
+                     h(?{print "h2\n";})
+                     a(?{print "a2\n";})
+                     t(?{print "t2\n";})
+                     (?{print "Done at position ", pos, "\n";})
+                    @x;
+
+prints
+
+    Start at position 0
+    t1
+    h1
+    t2
+    h2
+    a2
+    t2
+    Done at position 4
+
+=head1 BUGS
+
+Code expressions, conditional expressions, and independent expressions
+are B<experimental>.  Don't use them in production code.  Yet.
+
+=head1 SEE ALSO
+
+This is just a tutorial.  For the full story on perl regular
+expressions, see the L<perlre> regular expressions reference page.
+
+For more information on the matching C<m//> and substitution C<s///>
+operators, see L<perlop/"Regexp Quote-Like Operators">.  For
+information on the C<split> operation, see L<perlfunc/split>.
+
+For an excellent all-around resource on the care and feeding of
+regular expressions, see the book I<Mastering Regular Expressions> by
+Jeffrey Friedl (published by O'Reilly, ISBN 1556592-257-3).
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 2000 Mark Kvale
+All rights reserved.
+
+This document may be distributed under the same terms as Perl itself.
+
+=head2 Acknowledgments
+
+The inspiration for the stop codon DNA example came from the ZIP
+code example in chapter 7 of I<Mastering Regular Expressions>.
+
+The author would like to thank Jeff Pinyan, Andrew Johnson, Peter
+Haworth, Ronald J Kimball, and Joe Smith for all their helpful
+comments.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlrun.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlrun.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlrun.pod	(revision 14489)
@@ -0,0 +1,1320 @@
+=head1 NAME
+
+perlrun - how to execute the Perl interpreter
+
+=head1 SYNOPSIS
+
+B<perl>	S<[ B<-sTtuUWX> ]>
+	S<[ B<-hv> ] [ B<-V>[:I<configvar>] ]>
+	S<[ B<-cw> ] [ B<-d>[B<t>][:I<debugger>] ] [ B<-D>[I<number/list>] ]>
+	S<[ B<-pna> ] [ B<-F>I<pattern> ] [ B<-l>[I<octal>] ] [ B<-0>[I<octal/hexadecimal>] ]>
+	S<[ B<-I>I<dir> ] [ B<-m>[B<->]I<module> ] [ B<-M>[B<->]I<'module...'> ] [ B<-f> ]>
+	S<[ B<-C [I<number/list>] >]>
+	S<[ B<-P> ]>
+	S<[ B<-S> ]>
+	S<[ B<-x>[I<dir>] ]>
+	S<[ B<-i>[I<extension>] ]>
+	S<[ B<-e> I<'command'> ] [ B<--> ] [ I<programfile> ] [ I<argument> ]...>
+
+=head1 DESCRIPTION
+
+The normal way to run a Perl program is by making it directly
+executable, or else by passing the name of the source file as an
+argument on the command line.  (An interactive Perl environment
+is also possible--see L<perldebug> for details on how to do that.)
+Upon startup, Perl looks for your program in one of the following
+places:
+
+=over 4
+
+=item 1.
+
+Specified line by line via B<-e> switches on the command line.
+
+=item 2.
+
+Contained in the file specified by the first filename on the command line.
+(Note that systems supporting the #! notation invoke interpreters this
+way. See L<Location of Perl>.)
+
+=item 3.
+
+Passed in implicitly via standard input.  This works only if there are
+no filename arguments--to pass arguments to a STDIN-read program you
+must explicitly specify a "-" for the program name.
+
+=back
+
+With methods 2 and 3, Perl starts parsing the input file from the
+beginning, unless you've specified a B<-x> switch, in which case it
+scans for the first line starting with #! and containing the word
+"perl", and starts there instead.  This is useful for running a program
+embedded in a larger message.  (In this case you would indicate the end
+of the program using the C<__END__> token.)
+
+The #! line is always examined for switches as the line is being
+parsed.  Thus, if you're on a machine that allows only one argument
+with the #! line, or worse, doesn't even recognize the #! line, you
+still can get consistent switch behavior regardless of how Perl was
+invoked, even if B<-x> was used to find the beginning of the program.
+
+Because historically some operating systems silently chopped off
+kernel interpretation of the #! line after 32 characters, some
+switches may be passed in on the command line, and some may not;
+you could even get a "-" without its letter, if you're not careful.
+You probably want to make sure that all your switches fall either
+before or after that 32-character boundary.  Most switches don't
+actually care if they're processed redundantly, but getting a "-"
+instead of a complete switch could cause Perl to try to execute
+standard input instead of your program.  And a partial B<-I> switch
+could also cause odd results.
+
+Some switches do care if they are processed twice, for instance
+combinations of B<-l> and B<-0>.  Either put all the switches after
+the 32-character boundary (if applicable), or replace the use of
+B<-0>I<digits> by C<BEGIN{ $/ = "\0digits"; }>.
+
+Parsing of the #! switches starts wherever "perl" is mentioned in the line.
+The sequences "-*" and "- " are specifically ignored so that you could,
+if you were so inclined, say
+
+    #!/bin/sh -- # -*- perl -*- -p
+    eval 'exec perl -wS $0 ${1+"$@"}'
+        if $running_under_some_shell;
+
+to let Perl see the B<-p> switch.
+
+A similar trick involves the B<env> program, if you have it.
+
+    #!/usr/bin/env perl
+
+The examples above use a relative path to the perl interpreter,
+getting whatever version is first in the user's path.  If you want
+a specific version of Perl, say, perl5.005_57, you should place
+that directly in the #! line's path.
+
+If the #! line does not contain the word "perl", the program named after
+the #! is executed instead of the Perl interpreter.  This is slightly
+bizarre, but it helps people on machines that don't do #!, because they
+can tell a program that their SHELL is F</usr/bin/perl>, and Perl will then
+dispatch the program to the correct interpreter for them.
+
+After locating your program, Perl compiles the entire program to an
+internal form.  If there are any compilation errors, execution of the
+program is not attempted.  (This is unlike the typical shell script,
+which might run part-way through before finding a syntax error.)
+
+If the program is syntactically correct, it is executed.  If the program
+runs off the end without hitting an exit() or die() operator, an implicit
+C<exit(0)> is provided to indicate successful completion.
+
+=head2 #! and quoting on non-Unix systems
+X<hashbang> X<#!>
+
+Unix's #! technique can be simulated on other systems:
+
+=over 4
+
+=item OS/2
+
+Put
+
+    extproc perl -S -your_switches
+
+as the first line in C<*.cmd> file (B<-S> due to a bug in cmd.exe's
+`extproc' handling).
+
+=item MS-DOS
+
+Create a batch file to run your program, and codify it in
+C<ALTERNATE_SHEBANG> (see the F<dosish.h> file in the source
+distribution for more information).
+
+=item Win95/NT
+
+The Win95/NT installation, when using the ActiveState installer for Perl,
+will modify the Registry to associate the F<.pl> extension with the perl
+interpreter.  If you install Perl by other means (including building from
+the sources), you may have to modify the Registry yourself.  Note that
+this means you can no longer tell the difference between an executable
+Perl program and a Perl library file.
+
+=item Macintosh
+
+Under "Classic" MacOS, a perl program will have the appropriate Creator and
+Type, so that double-clicking them will invoke the MacPerl application.
+Under Mac OS X, clickable apps can be made from any C<#!> script using Wil
+Sanchez' DropScript utility: http://www.wsanchez.net/software/ .
+
+=item VMS
+
+Put
+
+    $ perl -mysw 'f$env("procedure")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8' !
+    $ exit++ + ++$status != 0 and $exit = $status = undef;
+
+at the top of your program, where B<-mysw> are any command line switches you
+want to pass to Perl.  You can now invoke the program directly, by saying
+C<perl program>, or as a DCL procedure, by saying C<@program> (or implicitly
+via F<DCL$PATH> by just using the name of the program).
+
+This incantation is a bit much to remember, but Perl will display it for
+you if you say C<perl "-V:startperl">.
+
+=back
+
+Command-interpreters on non-Unix systems have rather different ideas
+on quoting than Unix shells.  You'll need to learn the special
+characters in your command-interpreter (C<*>, C<\> and C<"> are
+common) and how to protect whitespace and these characters to run
+one-liners (see B<-e> below).
+
+On some systems, you may have to change single-quotes to double ones,
+which you must I<not> do on Unix or Plan 9 systems.  You might also
+have to change a single % to a %%.
+
+For example:
+
+    # Unix
+    perl -e 'print "Hello world\n"'
+
+    # MS-DOS, etc.
+    perl -e "print \"Hello world\n\""
+
+    # Macintosh
+    print "Hello world\n"
+     (then Run "Myscript" or Shift-Command-R)
+
+    # VMS
+    perl -e "print ""Hello world\n"""
+
+The problem is that none of this is reliable: it depends on the
+command and it is entirely possible neither works.  If B<4DOS> were
+the command shell, this would probably work better:
+
+    perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""
+
+B<CMD.EXE> in Windows NT slipped a lot of standard Unix functionality in
+when nobody was looking, but just try to find documentation for its
+quoting rules.
+
+Under the Macintosh, it depends which environment you are using.  The MacPerl
+shell, or MPW, is much like Unix shells in its support for several
+quoting variants, except that it makes free use of the Macintosh's non-ASCII
+characters as control characters.
+
+There is no general solution to all of this.  It's just a mess.
+
+=head2 Location of Perl
+X<perl, location of interpreter>
+
+It may seem obvious to say, but Perl is useful only when users can
+easily find it.  When possible, it's good for both F</usr/bin/perl>
+and F</usr/local/bin/perl> to be symlinks to the actual binary.  If
+that can't be done, system administrators are strongly encouraged
+to put (symlinks to) perl and its accompanying utilities into a
+directory typically found along a user's PATH, or in some other
+obvious and convenient place.
+
+In this documentation, C<#!/usr/bin/perl> on the first line of the program
+will stand in for whatever method works on your system.  You are
+advised to use a specific path if you care about a specific version.
+
+    #!/usr/local/bin/perl5.00554
+
+or if you just want to be running at least version, place a statement
+like this at the top of your program:
+
+    use 5.005_54;
+
+=head2 Command Switches
+X<perl, command switches> X<command switches>
+
+As with all standard commands, a single-character switch may be
+clustered with the following switch, if any.
+
+    #!/usr/bin/perl -spi.orig	# same as -s -p -i.orig
+
+Switches include:
+
+=over 5
+
+=item B<-0>[I<octal/hexadecimal>]
+X<-0> X<$/>
+
+specifies the input record separator (C<$/>) as an octal or
+hexadecimal number.  If there are no digits, the null character is the
+separator.  Other switches may precede or follow the digits.  For
+example, if you have a version of B<find> which can print filenames
+terminated by the null character, you can say this:
+
+    find . -name '*.orig' -print0 | perl -n0e unlink
+
+The special value 00 will cause Perl to slurp files in paragraph mode.
+The value 0777 will cause Perl to slurp files whole because there is no
+legal byte with that value.
+
+If you want to specify any Unicode character, use the hexadecimal
+format: C<-0xHHH...>, where the C<H> are valid hexadecimal digits.
+(This means that you cannot use the C<-x> with a directory name that
+consists of hexadecimal digits.)
+
+=item B<-a>
+X<-a> X<autosplit>
+
+turns on autosplit mode when used with a B<-n> or B<-p>.  An implicit
+split command to the @F array is done as the first thing inside the
+implicit while loop produced by the B<-n> or B<-p>.
+
+    perl -ane 'print pop(@F), "\n";'
+
+is equivalent to
+
+    while (<>) {
+	@F = split(' ');
+	print pop(@F), "\n";
+    }
+
+An alternate delimiter may be specified using B<-F>.
+
+=item B<-C [I<number/list>]>
+X<-C>
+
+The C<-C> flag controls some Unicode of the Perl Unicode features.
+
+As of 5.8.1, the C<-C> can be followed either by a number or a list
+of option letters.  The letters, their numeric values, and effects
+are as follows; listing the letters is equal to summing the numbers.
+
+    I     1    STDIN is assumed to be in UTF-8
+    O     2    STDOUT will be in UTF-8
+    E     4    STDERR will be in UTF-8
+    S     7    I + O + E
+    i     8    UTF-8 is the default PerlIO layer for input streams
+    o    16    UTF-8 is the default PerlIO layer for output streams
+    D    24    i + o
+    A    32    the @ARGV elements are expected to be strings encoded in UTF-8
+    L    64    normally the "IOEioA" are unconditional,
+               the L makes them conditional on the locale environment
+               variables (the LC_ALL, LC_TYPE, and LANG, in the order
+               of decreasing precedence) -- if the variables indicate
+               UTF-8, then the selected "IOEioA" are in effect
+
+For example, C<-COE> and C<-C6> will both turn on UTF-8-ness on both
+STDOUT and STDERR.  Repeating letters is just redundant, not cumulative
+nor toggling.
+
+The C<io> options mean that any subsequent open() (or similar I/O
+operations) will have the C<:utf8> PerlIO layer implicitly applied
+to them, in other words, UTF-8 is expected from any input stream,
+and UTF-8 is produced to any output stream.  This is just the default,
+with explicit layers in open() and with binmode() one can manipulate
+streams as usual.
+
+C<-C> on its own (not followed by any number or option list), or the
+empty string C<""> for the C<PERL_UNICODE> environment variable, has the
+same effect as C<-CSDL>.  In other words, the standard I/O handles and
+the default C<open()> layer are UTF-8-fied B<but> only if the locale
+environment variables indicate a UTF-8 locale.  This behaviour follows
+the I<implicit> (and problematic) UTF-8 behaviour of Perl 5.8.0.
+
+You can use C<-C0> (or C<"0"> for C<PERL_UNICODE>) to explicitly
+disable all the above Unicode features.
+
+The read-only magic variable C<${^UNICODE}> reflects the numeric value
+of this setting.  This is variable is set during Perl startup and is
+thereafter read-only.  If you want runtime effects, use the three-arg
+open() (see L<perlfunc/open>), the two-arg binmode() (see L<perlfunc/binmode>),
+and the C<open> pragma (see L<open>).
+
+(In Perls earlier than 5.8.1 the C<-C> switch was a Win32-only switch
+that enabled the use of Unicode-aware "wide system call" Win32 APIs.
+This feature was practically unused, however, and the command line
+switch was therefore "recycled".)
+
+=item B<-c>
+X<-c>
+
+causes Perl to check the syntax of the program and then exit without
+executing it.  Actually, it I<will> execute C<BEGIN>, C<CHECK>, and
+C<use> blocks, because these are considered as occurring outside the
+execution of your program.  C<INIT> and C<END> blocks, however, will
+be skipped.
+
+=item B<-d>
+X<-d> X<-dt>
+
+=item B<-dt>
+
+runs the program under the Perl debugger.  See L<perldebug>.
+If B<t> is specified, it indicates to the debugger that threads
+will be used in the code being debugged.
+
+=item B<-d:>I<foo[=bar,baz]>
+X<-d> X<-dt>
+
+=item B<-dt:>I<foo[=bar,baz]>
+
+runs the program under the control of a debugging, profiling, or
+tracing module installed as Devel::foo. E.g., B<-d:DProf> executes
+the program using the Devel::DProf profiler.  As with the B<-M>
+flag, options may be passed to the Devel::foo package where they
+will be received and interpreted by the Devel::foo::import routine.
+The comma-separated list of options must follow a C<=> character.
+If B<t> is specified, it indicates to the debugger that threads
+will be used in the code being debugged.
+See L<perldebug>.
+
+=item B<-D>I<letters>
+X<-D> X<DEBUGGING> X<-DDEBUGGING>
+
+=item B<-D>I<number>
+
+sets debugging flags.  To watch how it executes your program, use
+B<-Dtls>.  (This works only if debugging is compiled into your
+Perl.)  Another nice value is B<-Dx>, which lists your compiled
+syntax tree.  And B<-Dr> displays compiled regular expressions;
+the format of the output is explained in L<perldebguts>.
+
+As an alternative, specify a number instead of list of letters (e.g.,
+B<-D14> is equivalent to B<-Dtls>):
+
+        1  p  Tokenizing and parsing
+        2  s  Stack snapshots (with v, displays all stacks)
+        4  l  Context (loop) stack processing
+        8  t  Trace execution
+       16  o  Method and overloading resolution
+       32  c  String/numeric conversions
+       64  P  Print profiling info, preprocessor command for -P, source file input state
+      128  m  Memory allocation
+      256  f  Format processing
+      512  r  Regular expression parsing and execution
+     1024  x  Syntax tree dump
+     2048  u  Tainting checks
+     4096     (Obsolete, previously used for LEAKTEST)
+     8192  H  Hash dump -- usurps values()
+    16384  X  Scratchpad allocation
+    32768  D  Cleaning up
+    65536  S  Thread synchronization
+   131072  T  Tokenising
+   262144  R  Include reference counts of dumped variables (eg when using -Ds)
+   524288  J  Do not s,t,P-debug (Jump over) opcodes within package DB
+  1048576  v  Verbose: use in conjunction with other flags
+  8388608  q  quiet - currently only suppresses the "EXECUTING" message
+
+All these flags require B<-DDEBUGGING> when you compile the Perl
+executable (but see L<Devel::Peek>, L<re> which may change this).
+See the F<INSTALL> file in the Perl source distribution
+for how to do this.  This flag is automatically set if you include B<-g>
+option when C<Configure> asks you about optimizer/debugger flags.
+
+If you're just trying to get a print out of each line of Perl code
+as it executes, the way that C<sh -x> provides for shell scripts,
+you can't use Perl's B<-D> switch.  Instead do this
+
+  # If you have "env" utility
+  env PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program
+
+  # Bourne shell syntax
+  $ PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program
+
+  # csh syntax
+  % (setenv PERLDB_OPTS "NonStop=1 AutoTrace=1 frame=2"; perl -dS program)
+
+See L<perldebug> for details and variations.
+
+=item B<-e> I<commandline>
+X<-e>
+
+may be used to enter one line of program.  If B<-e> is given, Perl
+will not look for a filename in the argument list.  Multiple B<-e>
+commands may be given to build up a multi-line script.  Make sure
+to use semicolons where you would in a normal program.
+
+=item B<-f>
+X<-f>
+
+Disable executing F<$Config{sitelib}/sitecustomize.pl> at startup.
+
+Perl can be built so that it by default will try to execute
+F<$Config{sitelib}/sitecustomize.pl> at startup.  This is a hook that
+allows the sysadmin to customize how perl behaves.  It can for
+instance be used to add entries to the @INC array to make perl find
+modules in non-standard locations.
+
+=item B<-F>I<pattern>
+X<-F>
+
+specifies the pattern to split on if B<-a> is also in effect.  The
+pattern may be surrounded by C<//>, C<"">, or C<''>, otherwise it will be
+put in single quotes. You can't use literal whitespace in the pattern.
+
+=item B<-h>
+X<-h>
+
+prints a summary of the options.
+
+=item B<-i>[I<extension>]
+X<-i> X<in-place>
+
+specifies that files processed by the C<E<lt>E<gt>> construct are to be
+edited in-place.  It does this by renaming the input file, opening the
+output file by the original name, and selecting that output file as the
+default for print() statements.  The extension, if supplied, is used to
+modify the name of the old file to make a backup copy, following these
+rules:
+
+If no extension is supplied, no backup is made and the current file is
+overwritten.
+
+If the extension doesn't contain a C<*>, then it is appended to the
+end of the current filename as a suffix.  If the extension does
+contain one or more C<*> characters, then each C<*> is replaced
+with the current filename.  In Perl terms, you could think of this
+as:
+
+    ($backup = $extension) =~ s/\*/$file_name/g;
+
+This allows you to add a prefix to the backup file, instead of (or in
+addition to) a suffix:
+
+    $ perl -pi'orig_*' -e 's/bar/baz/' fileA	# backup to 'orig_fileA'
+
+Or even to place backup copies of the original files into another
+directory (provided the directory already exists):
+
+    $ perl -pi'old/*.orig' -e 's/bar/baz/' fileA # backup to 'old/fileA.orig'
+
+These sets of one-liners are equivalent:
+
+    $ perl -pi -e 's/bar/baz/' fileA		# overwrite current file
+    $ perl -pi'*' -e 's/bar/baz/' fileA		# overwrite current file
+
+    $ perl -pi'.orig' -e 's/bar/baz/' fileA	# backup to 'fileA.orig'
+    $ perl -pi'*.orig' -e 's/bar/baz/' fileA	# backup to 'fileA.orig'
+
+From the shell, saying
+
+    $ perl -p -i.orig -e "s/foo/bar/; ... "
+
+is the same as using the program:
+
+    #!/usr/bin/perl -pi.orig
+    s/foo/bar/;
+
+which is equivalent to
+
+    #!/usr/bin/perl
+    $extension = '.orig';
+    LINE: while (<>) {
+	if ($ARGV ne $oldargv) {
+	    if ($extension !~ /\*/) {
+		$backup = $ARGV . $extension;
+	    }
+	    else {
+		($backup = $extension) =~ s/\*/$ARGV/g;
+	    }
+	    rename($ARGV, $backup);
+	    open(ARGVOUT, ">$ARGV");
+	    select(ARGVOUT);
+	    $oldargv = $ARGV;
+	}
+	s/foo/bar/;
+    }
+    continue {
+	print;	# this prints to original filename
+    }
+    select(STDOUT);
+
+except that the B<-i> form doesn't need to compare $ARGV to $oldargv to
+know when the filename has changed.  It does, however, use ARGVOUT for
+the selected filehandle.  Note that STDOUT is restored as the default
+output filehandle after the loop.
+
+As shown above, Perl creates the backup file whether or not any output
+is actually changed.  So this is just a fancy way to copy files:
+
+    $ perl -p -i'/some/file/path/*' -e 1 file1 file2 file3...
+or
+    $ perl -p -i'.orig' -e 1 file1 file2 file3...
+
+You can use C<eof> without parentheses to locate the end of each input
+file, in case you want to append to each file, or reset line numbering
+(see example in L<perlfunc/eof>).
+
+If, for a given file, Perl is unable to create the backup file as
+specified in the extension then it will skip that file and continue on
+with the next one (if it exists).
+
+For a discussion of issues surrounding file permissions and B<-i>,
+see L<perlfaq5/Why does Perl let me delete read-only files?  Why does -i clobber protected files?  Isn't this a bug in Perl?>.
+
+You cannot use B<-i> to create directories or to strip extensions from
+files.
+
+Perl does not expand C<~> in filenames, which is good, since some
+folks use it for their backup files:
+
+    $ perl -pi~ -e 's/foo/bar/' file1 file2 file3...
+
+Note that because B<-i> renames or deletes the original file before
+creating a new file of the same name, UNIX-style soft and hard links will
+not be preserved.
+
+Finally, the B<-i> switch does not impede execution when no
+files are given on the command line.  In this case, no backup is made
+(the original file cannot, of course, be determined) and processing
+proceeds from STDIN to STDOUT as might be expected.
+
+=item B<-I>I<directory>
+X<-I> X<@INC>
+
+Directories specified by B<-I> are prepended to the search path for
+modules (C<@INC>), and also tells the C preprocessor where to search for
+include files.  The C preprocessor is invoked with B<-P>; by default it
+searches /usr/include and /usr/lib/perl.
+
+=item B<-l>[I<octnum>]
+X<-l> X<$/> X<$\>
+
+enables automatic line-ending processing.  It has two separate
+effects.  First, it automatically chomps C<$/> (the input record
+separator) when used with B<-n> or B<-p>.  Second, it assigns C<$\>
+(the output record separator) to have the value of I<octnum> so
+that any print statements will have that separator added back on.
+If I<octnum> is omitted, sets C<$\> to the current value of
+C<$/>.  For instance, to trim lines to 80 columns:
+
+    perl -lpe 'substr($_, 80) = ""'
+
+Note that the assignment C<$\ = $/> is done when the switch is processed,
+so the input record separator can be different than the output record
+separator if the B<-l> switch is followed by a B<-0> switch:
+
+    gnufind / -print0 | perl -ln0e 'print "found $_" if -p'
+
+This sets C<$\> to newline and then sets C<$/> to the null character.
+
+=item B<-m>[B<->]I<module>
+X<-m> X<-M>
+
+=item B<-M>[B<->]I<module>
+
+=item B<-M>[B<->]I<'module ...'>
+
+=item B<-[mM]>[B<->]I<module=arg[,arg]...>
+
+B<-m>I<module> executes C<use> I<module> C<();> before executing your
+program.
+
+B<-M>I<module> executes C<use> I<module> C<;> before executing your
+program.  You can use quotes to add extra code after the module name,
+e.g., C<'-Mmodule qw(foo bar)'>.
+
+If the first character after the B<-M> or B<-m> is a dash (C<->)
+then the 'use' is replaced with 'no'.
+
+A little builtin syntactic sugar means you can also say
+B<-mmodule=foo,bar> or B<-Mmodule=foo,bar> as a shortcut for
+C<'-Mmodule qw(foo bar)'>.  This avoids the need to use quotes when
+importing symbols.  The actual code generated by B<-Mmodule=foo,bar> is
+C<use module split(/,/,q{foo,bar})>.  Note that the C<=> form
+removes the distinction between B<-m> and B<-M>.
+
+A consequence of this is that B<-MFoo=number> never does a version check
+(unless C<Foo::import()> itself is set up to do a version check, which
+could happen for example if Foo inherits from Exporter.)
+
+=item B<-n>
+X<-n>
+
+causes Perl to assume the following loop around your program, which
+makes it iterate over filename arguments somewhat like B<sed -n> or
+B<awk>:
+
+  LINE:
+    while (<>) {
+	...		# your program goes here
+    }
+
+Note that the lines are not printed by default.  See B<-p> to have
+lines printed.  If a file named by an argument cannot be opened for
+some reason, Perl warns you about it and moves on to the next file.
+
+Here is an efficient way to delete all files that haven't been modified for
+at least a week:
+
+    find . -mtime +7 -print | perl -nle unlink
+
+This is faster than using the B<-exec> switch of B<find> because you don't
+have to start a process on every filename found.  It does suffer from
+the bug of mishandling newlines in pathnames, which you can fix if
+you follow the example under B<-0>.
+
+C<BEGIN> and C<END> blocks may be used to capture control before or after
+the implicit program loop, just as in B<awk>.
+
+=item B<-p>
+X<-p>
+
+causes Perl to assume the following loop around your program, which
+makes it iterate over filename arguments somewhat like B<sed>:
+
+
+  LINE:
+    while (<>) {
+	...		# your program goes here
+    } continue {
+	print or die "-p destination: $!\n";
+    }
+
+If a file named by an argument cannot be opened for some reason, Perl
+warns you about it, and moves on to the next file.  Note that the
+lines are printed automatically.  An error occurring during printing is
+treated as fatal.  To suppress printing use the B<-n> switch.  A B<-p>
+overrides a B<-n> switch.
+
+C<BEGIN> and C<END> blocks may be used to capture control before or after
+the implicit loop, just as in B<awk>.
+
+=item B<-P>
+X<-P>
+
+B<NOTE: Use of -P is strongly discouraged because of its inherent
+problems, including poor portability.>
+
+This option causes your program to be run through the C preprocessor before
+compilation by Perl.  Because both comments and B<cpp> directives begin
+with the # character, you should avoid starting comments with any words
+recognized by the C preprocessor such as C<"if">, C<"else">, or C<"define">.
+
+If you're considering using C<-P>, you might also want to look at the
+Filter::cpp module from CPAN.
+
+The problems of -P include, but are not limited to:
+
+=over 10
+
+=item *
+
+The C<#!> line is stripped, so any switches there don't apply.
+
+=item *
+
+A C<-P> on a C<#!> line doesn't work.
+
+=item *
+
+B<All> lines that begin with (whitespace and) a C<#> but
+do not look like cpp commands, are stripped, including anything
+inside Perl strings, regular expressions, and here-docs .
+
+=item *
+
+In some platforms the C preprocessor knows too much: it knows about
+the C++ -style until-end-of-line comments starting with C<"//">.
+This will cause problems with common Perl constructs like
+
+    s/foo//;
+
+because after -P this will became illegal code
+
+    s/foo
+
+The workaround is to use some other quoting separator than C<"/">,
+like for example C<"!">:
+
+    s!foo!!;
+
+
+
+=item *
+
+It requires not only a working C preprocessor but also a working
+F<sed>.  If not on UNIX, you are probably out of luck on this.
+
+=item *
+
+Script line numbers are not preserved.
+
+=item *
+
+The C<-x> does not work with C<-P>.
+
+=back
+
+=item B<-s>
+X<-s>
+
+enables rudimentary switch parsing for switches on the command
+line after the program name but before any filename arguments (or before
+an argument of B<-->).  Any switch found there is removed from @ARGV and sets the
+corresponding variable in the Perl program.  The following program
+prints "1" if the program is invoked with a B<-xyz> switch, and "abc"
+if it is invoked with B<-xyz=abc>.
+
+    #!/usr/bin/perl -s
+    if ($xyz) { print "$xyz\n" }
+
+Do note that a switch like B<--help> creates the variable ${-help}, which is not compliant
+with C<strict refs>.  Also, when using this option on a script with
+warnings enabled you may get a lot of spurious "used only once" warnings.
+
+=item B<-S>
+X<-S>
+
+makes Perl use the PATH environment variable to search for the
+program (unless the name of the program contains directory separators).
+
+On some platforms, this also makes Perl append suffixes to the
+filename while searching for it.  For example, on Win32 platforms,
+the ".bat" and ".cmd" suffixes are appended if a lookup for the
+original name fails, and if the name does not already end in one
+of those suffixes.  If your Perl was compiled with DEBUGGING turned
+on, using the -Dp switch to Perl shows how the search progresses.
+
+Typically this is used to emulate #! startup on platforms that don't
+support #!.  Its also convenient when debugging a script that uses #!,
+and is thus normally found by the shell's $PATH search mechanism.
+
+This example works on many platforms that have a shell compatible with
+Bourne shell:
+
+    #!/usr/bin/perl
+    eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}'
+	    if $running_under_some_shell;
+
+The system ignores the first line and feeds the program to F</bin/sh>,
+which proceeds to try to execute the Perl program as a shell script.
+The shell executes the second line as a normal shell command, and thus
+starts up the Perl interpreter.  On some systems $0 doesn't always
+contain the full pathname, so the B<-S> tells Perl to search for the
+program if necessary.  After Perl locates the program, it parses the
+lines and ignores them because the variable $running_under_some_shell
+is never true.  If the program will be interpreted by csh, you will need
+to replace C<${1+"$@"}> with C<$*>, even though that doesn't understand
+embedded spaces (and such) in the argument list.  To start up sh rather
+than csh, some systems may have to replace the #! line with a line
+containing just a colon, which will be politely ignored by Perl.  Other
+systems can't control that, and need a totally devious construct that
+will work under any of B<csh>, B<sh>, or Perl, such as the following:
+
+	eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}'
+	& eval 'exec /usr/bin/perl -wS $0 $argv:q'
+		if $running_under_some_shell;
+
+If the filename supplied contains directory separators (i.e., is an
+absolute or relative pathname), and if that file is not found,
+platforms that append file extensions will do so and try to look
+for the file with those extensions added, one by one.
+
+On DOS-like platforms, if the program does not contain directory
+separators, it will first be searched for in the current directory
+before being searched for on the PATH.  On Unix platforms, the
+program will be searched for strictly on the PATH.
+
+=item B<-t>
+X<-t>
+
+Like B<-T>, but taint checks will issue warnings rather than fatal
+errors.  These warnings can be controlled normally with C<no warnings
+qw(taint)>.
+
+B<NOTE: this is not a substitute for -T.> This is meant only to be
+used as a temporary development aid while securing legacy code:
+for real production code and for new secure code written from scratch
+always use the real B<-T>.
+
+=item B<-T>
+X<-T>
+
+forces "taint" checks to be turned on so you can test them.  Ordinarily
+these checks are done only when running setuid or setgid.  It's a
+good idea to turn them on explicitly for programs that run on behalf
+of someone else whom you might not necessarily trust, such as CGI
+programs or any internet servers you might write in Perl.  See
+L<perlsec> for details.  For security reasons, this option must be
+seen by Perl quite early; usually this means it must appear early
+on the command line or in the #! line for systems which support
+that construct.
+
+=item B<-u>
+X<-u>
+
+This obsolete switch causes Perl to dump core after compiling your
+program.  You can then in theory take this core dump and turn it
+into an executable file by using the B<undump> program (not supplied).
+This speeds startup at the expense of some disk space (which you
+can minimize by stripping the executable).  (Still, a "hello world"
+executable comes out to about 200K on my machine.)  If you want to
+execute a portion of your program before dumping, use the dump()
+operator instead.  Note: availability of B<undump> is platform
+specific and may not be available for a specific port of Perl.
+
+This switch has been superseded in favor of the new Perl code
+generator backends to the compiler.  See L<B> and L<B::Bytecode>
+for details.
+
+=item B<-U>
+X<-U>
+
+allows Perl to do unsafe operations.  Currently the only "unsafe"
+operations are attempting to unlink directories while running as 
+superuser, and running setuid programs with fatal taint checks turned
+into warnings.  Note that the B<-w> switch (or the C<$^W> variable) 
+must be used along with this option to actually I<generate> the
+taint-check warnings.  
+
+=item B<-v>
+X<-v>
+
+prints the version and patchlevel of your perl executable.
+
+=item B<-V>
+X<-V>
+
+prints summary of the major perl configuration values and the current
+values of @INC.
+
+=item B<-V:>I<configvar>
+
+Prints to STDOUT the value of the named configuration variable(s),
+with multiples when your configvar argument looks like a regex (has
+non-letters).  For example:
+
+    $ perl -V:libc
+	libc='/lib/libc-2.2.4.so';
+    $ perl -V:lib.
+	libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc';
+	libc='/lib/libc-2.2.4.so';
+    $ perl -V:lib.*
+	libpth='/usr/local/lib /lib /usr/lib';
+	libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc';
+	lib_ext='.a';
+	libc='/lib/libc-2.2.4.so';
+	libperl='libperl.a';
+	....
+
+Additionally, extra colons can be used to control formatting.  A
+trailing colon suppresses the linefeed and terminator ';', allowing
+you to embed queries into shell commands.  (mnemonic: PATH separator
+':'.)
+
+    $ echo "compression-vars: " `perl -V:z.*: ` " are here !"
+    compression-vars:  zcat='' zip='zip'  are here !
+
+A leading colon removes the 'name=' part of the response, this allows
+you to map to the name you need.  (mnemonic: empty label)
+
+    $ echo "goodvfork="`./perl -Ilib -V::usevfork`
+    goodvfork=false;
+
+Leading and trailing colons can be used together if you need
+positional parameter values without the names.  Note that in the case
+below, the PERL_API params are returned in alphabetical order.
+
+    $ echo building_on `perl -V::osname: -V::PERL_API_.*:` now
+    building_on 'linux' '5' '1' '9' now
+
+=item B<-w>
+X<-w>
+
+prints warnings about dubious constructs, such as variable names
+that are mentioned only once and scalar variables that are used
+before being set, redefined subroutines, references to undefined
+filehandles or filehandles opened read-only that you are attempting
+to write on, values used as a number that don't look like numbers,
+using an array as though it were a scalar, if your subroutines
+recurse more than 100 deep, and innumerable other things.
+
+This switch really just enables the internal C<$^W> variable.  You
+can disable or promote into fatal errors specific warnings using
+C<__WARN__> hooks, as described in L<perlvar> and L<perlfunc/warn>.
+See also L<perldiag> and L<perltrap>.  A new, fine-grained warning
+facility is also available if you want to manipulate entire classes
+of warnings; see L<warnings> or L<perllexwarn>.
+
+=item B<-W>
+X<-W>
+
+Enables all warnings regardless of C<no warnings> or C<$^W>.
+See L<perllexwarn>.
+
+=item B<-X>
+X<-X>
+
+Disables all warnings regardless of C<use warnings> or C<$^W>.
+See L<perllexwarn>.
+
+=item B<-x>
+X<-x>
+
+=item B<-x> I<directory>
+
+tells Perl that the program is embedded in a larger chunk of unrelated
+ASCII text, such as in a mail message.  Leading garbage will be
+discarded until the first line that starts with #! and contains the
+string "perl".  Any meaningful switches on that line will be applied.
+If a directory name is specified, Perl will switch to that directory
+before running the program.  The B<-x> switch controls only the
+disposal of leading garbage.  The program must be terminated with
+C<__END__> if there is trailing garbage to be ignored (the program
+can process any or all of the trailing garbage via the DATA filehandle
+if desired).
+
+=back
+
+=head1 ENVIRONMENT
+X<perl, environment variables>
+
+=over 12
+
+=item HOME
+X<HOME>
+
+Used if chdir has no argument.
+
+=item LOGDIR
+X<LOGDIR>
+
+Used if chdir has no argument and HOME is not set.
+
+=item PATH
+X<PATH>
+
+Used in executing subprocesses, and in finding the program if B<-S> is
+used.
+
+=item PERL5LIB
+X<PERL5LIB>
+
+A list of directories in which to look for Perl library
+files before looking in the standard library and the current
+directory.  Any architecture-specific directories under the specified
+locations are automatically included if they exist.  If PERL5LIB is not
+defined, PERLLIB is used.  Directories are separated (like in PATH) by
+a colon on unixish platforms and by a semicolon on Windows (the proper
+path separator being given by the command C<perl -V:path_sep>).
+
+When running taint checks (either because the program was running setuid
+or setgid, or the B<-T> switch was used), neither variable is used.
+The program should instead say:
+
+    use lib "/my/directory";
+
+=item PERL5OPT
+X<PERL5OPT>
+
+Command-line options (switches).  Switches in this variable are taken
+as if they were on every Perl command line.  Only the B<-[DIMUdmtw]>
+switches are allowed.  When running taint checks (because the program
+was running setuid or setgid, or the B<-T> switch was used), this
+variable is ignored.  If PERL5OPT begins with B<-T>, tainting will be
+enabled, and any subsequent options ignored.
+
+=item PERLIO
+X<PERLIO>
+
+A space (or colon) separated list of PerlIO layers. If perl is built
+to use PerlIO system for IO (the default) these layers effect perl's IO.
+
+It is conventional to start layer names with a colon e.g. C<:perlio> to
+emphasise their similarity to variable "attributes". But the code that parses
+layer specification strings (which is also used to decode the PERLIO
+environment variable) treats the colon as a separator.
+
+An unset or empty PERLIO is equivalent to C<:stdio>.
+
+The list becomes the default for I<all> perl's IO. Consequently only built-in
+layers can appear in this list, as external layers (such as :encoding()) need
+IO in  order to load them!. See L<"open pragma"|open> for how to add external
+encodings as defaults.
+
+The layers that it makes sense to include in the PERLIO environment
+variable are briefly summarised below. For more details see L<PerlIO>.
+
+=over 8
+
+=item :bytes
+X<:bytes>
+
+A pseudolayer that turns I<off> the C<:utf8> flag for the layer below.
+Unlikely to be useful on its own in the global PERLIO environment variable.
+You perhaps were thinking of C<:crlf:bytes> or C<:perlio:bytes>.
+
+=item :crlf
+X<:crlf>
+
+A layer which does CRLF to "\n" translation distinguishing "text" and
+"binary" files in the manner of MS-DOS and similar operating systems.
+(It currently does I<not> mimic MS-DOS as far as treating of Control-Z
+as being an end-of-file marker.)
+
+=item :mmap
+X<:mmap>
+
+A layer which implements "reading" of files by using C<mmap()> to
+make (whole) file appear in the process's address space, and then
+using that as PerlIO's "buffer".
+
+=item :perlio
+X<:perlio>
+
+This is a re-implementation of "stdio-like" buffering written as a
+PerlIO "layer".  As such it will call whatever layer is below it for
+its operations (typically C<:unix>).
+
+=item :pop
+X<:pop>
+
+An experimental pseudolayer that removes the topmost layer.
+Use with the same care as is reserved for nitroglycerin.
+
+=item :raw
+X<:raw>
+
+A pseudolayer that manipulates other layers.  Applying the C<:raw>
+layer is equivalent to calling C<binmode($fh)>.  It makes the stream
+pass each byte as-is without any translation.  In particular CRLF
+translation, and/or :utf8 intuited from locale are disabled.
+
+Unlike in the earlier versions of Perl C<:raw> is I<not>
+just the inverse of C<:crlf> - other layers which would affect the
+binary nature of the stream are also removed or disabled.
+
+=item :stdio
+X<:stdio>
+
+This layer provides PerlIO interface by wrapping system's ANSI C "stdio"
+library calls. The layer provides both buffering and IO.
+Note that C<:stdio> layer does I<not> do CRLF translation even if that
+is platforms normal behaviour. You will need a C<:crlf> layer above it
+to do that.
+
+=item :unix
+X<:unix>
+
+Low level layer which calls C<read>, C<write> and C<lseek> etc.
+
+=item :utf8
+X<:utf8>
+
+A pseudolayer that turns on a flag on the layer below to tell perl
+that output should be in utf8 and that input should be regarded as
+already in utf8 form.  May be useful in PERLIO environment
+variable to make UTF-8 the default. (To turn off that behaviour
+use C<:bytes> layer.)
+
+=item :win32
+X<:win32>
+
+On Win32 platforms this I<experimental> layer uses native "handle" IO
+rather than unix-like numeric file descriptor layer. Known to be
+buggy in this release.
+
+=back
+
+On all platforms the default set of layers should give acceptable results.
+
+For UNIX platforms that will equivalent of "unix perlio" or "stdio".
+Configure is setup to prefer "stdio" implementation if system's library
+provides for fast access to the buffer, otherwise it uses the "unix perlio"
+implementation.
+
+On Win32 the default in this release is "unix crlf". Win32's "stdio"
+has a number of bugs/mis-features for perl IO which are somewhat
+C compiler vendor/version dependent. Using our own C<crlf> layer as
+the buffer avoids those issues and makes things more uniform.
+The C<crlf> layer provides CRLF to/from "\n" conversion as well as
+buffering.
+
+This release uses C<unix> as the bottom layer on Win32 and so still uses C
+compiler's numeric file descriptor routines. There is an experimental native
+C<win32> layer which is expected to be enhanced and should eventually be
+the default under Win32.
+
+=item PERLIO_DEBUG
+X<PERLIO_DEBUG>
+
+If set to the name of a file or device then certain operations of PerlIO
+sub-system will be logged to that file (opened as append). Typical uses
+are UNIX:
+
+   PERLIO_DEBUG=/dev/tty perl script ...
+
+and Win32 approximate equivalent:
+
+   set PERLIO_DEBUG=CON
+   perl script ...
+
+This functionality is disabled for setuid scripts and for scripts run
+with B<-T>.
+
+=item PERLLIB
+X<PERLLIB>
+
+A list of directories in which to look for Perl library
+files before looking in the standard library and the current directory.
+If PERL5LIB is defined, PERLLIB is not used.
+
+=item PERL5DB
+X<PERL5DB>
+
+The command used to load the debugger code.  The default is:
+
+	BEGIN { require 'perl5db.pl' }
+
+=item PERL5DB_THREADED
+X<PERL5DB_THREADED>
+
+If set to a true value, indicates to the debugger that the code being
+debugged uses threads.
+
+=item PERL5SHELL (specific to the Win32 port)
+X<PERL5SHELL>
+
+May be set to an alternative shell that perl must use internally for
+executing "backtick" commands or system().  Default is C<cmd.exe /x/d/c>
+on WindowsNT and C<command.com /c> on Windows95.  The value is considered
+to be space-separated.  Precede any character that needs to be protected
+(like a space or backslash) with a backslash.
+
+Note that Perl doesn't use COMSPEC for this purpose because
+COMSPEC has a high degree of variability among users, leading to
+portability concerns.  Besides, perl can use a shell that may not be
+fit for interactive use, and setting COMSPEC to such a shell may
+interfere with the proper functioning of other programs (which usually
+look in COMSPEC to find a shell fit for interactive use).
+
+=item PERL_ALLOW_NON_IFS_LSP (specific to the Win32 port)
+X<PERL_ALLOW_NON_IFS_LSP>
+
+Set to 1 to allow the use of non-IFS compatible LSP's.
+Perl normally searches for an IFS-compatible LSP because this is required
+for its emulation of Windows sockets as real filehandles.  However, this may
+cause problems if you have a firewall such as McAfee Guardian which requires
+all applications to use its LSP which is not IFS-compatible, because clearly
+Perl will normally avoid using such an LSP.
+Setting this environment variable to 1 means that Perl will simply use the
+first suitable LSP enumerated in the catalog, which keeps McAfee Guardian
+happy (and in that particular case Perl still works too because McAfee
+Guardian's LSP actually plays some other games which allow applications
+requiring IFS compatibility to work).
+
+=item PERL_DEBUG_MSTATS
+X<PERL_DEBUG_MSTATS>
+
+Relevant only if perl is compiled with the malloc included with the perl
+distribution (that is, if C<perl -V:d_mymalloc> is 'define').
+If set, this causes memory statistics to be dumped after execution.  If set
+to an integer greater than one, also causes memory statistics to be dumped
+after compilation.
+
+=item PERL_DESTRUCT_LEVEL
+X<PERL_DESTRUCT_LEVEL>
+
+Relevant only if your perl executable was built with B<-DDEBUGGING>,
+this controls the behavior of global destruction of objects and other
+references.  See L<perlhack/PERL_DESTRUCT_LEVEL> for more information.
+
+=item PERL_DL_NONLAZY
+X<PERL_DL_NONLAZY>
+
+Set to one to have perl resolve B<all> undefined symbols when it loads
+a dynamic library.  The default behaviour is to resolve symbols when
+they are used.  Setting this variable is useful during testing of
+extensions as it ensures that you get an error on misspelled function
+names even if the test suite doesn't call it.
+
+=item PERL_ENCODING
+X<PERL_ENCODING>
+
+If using the C<encoding> pragma without an explicit encoding name, the
+PERL_ENCODING environment variable is consulted for an encoding name.
+
+=item PERL_HASH_SEED
+X<PERL_HASH_SEED>
+
+(Since Perl 5.8.1.)  Used to randomise Perl's internal hash function.
+To emulate the pre-5.8.1 behaviour, set to an integer (zero means
+exactly the same order as 5.8.0).  "Pre-5.8.1" means, among other
+things, that hash keys will be ordered the same between different runs
+of Perl.
+
+The default behaviour is to randomise unless the PERL_HASH_SEED is set.
+If Perl has been compiled with C<-DUSE_HASH_SEED_EXPLICIT>, the default
+behaviour is B<not> to randomise unless the PERL_HASH_SEED is set.
+
+If PERL_HASH_SEED is unset or set to a non-numeric string, Perl uses
+the pseudorandom seed supplied by the operating system and libraries.
+This means that each different run of Perl will have a different
+ordering of the results of keys(), values(), and each().
+
+B<Please note that the hash seed is sensitive information>. Hashes are
+randomized to protect against local and remote attacks against Perl
+code. By manually setting a seed this protection may be partially or
+completely lost.
+
+See L<perlsec/"Algorithmic Complexity Attacks"> and
+L</PERL_HASH_SEED_DEBUG> for more information.
+
+=item PERL_HASH_SEED_DEBUG
+X<PERL_HASH_SEED_DEBUG>
+
+(Since Perl 5.8.1.)  Set to one to display (to STDERR) the value of
+the hash seed at the beginning of execution.  This, combined with
+L</PERL_HASH_SEED> is intended to aid in debugging nondeterministic
+behavior caused by hash randomization.
+
+B<Note that the hash seed is sensitive information>: by knowing it one
+can craft a denial-of-service attack against Perl code, even remotely,
+see L<perlsec/"Algorithmic Complexity Attacks"> for more information.
+B<Do not disclose the hash seed> to people who don't need to know it.
+See also hash_seed() of L<Hash::Util>.
+
+=item PERL_ROOT (specific to the VMS port)
+X<PERL_ROOT>
+
+A translation concealed rooted logical name that contains perl and the
+logical device for the @INC path on VMS only.  Other logical names that
+affect perl on VMS include PERLSHR, PERL_ENV_TABLES, and
+SYS$TIMEZONE_DIFFERENTIAL but are optional and discussed further in
+L<perlvms> and in F<README.vms> in the Perl source distribution.
+
+=item PERL_SIGNALS
+X<PERL_SIGNALS>
+
+In Perls 5.8.1 and later.  If set to C<unsafe> the pre-Perl-5.8.0
+signals behaviour (immediate but unsafe) is restored.  If set to
+C<safe> the safe (or deferred) signals are used.
+See L<perlipc/"Deferred Signals (Safe Signals)">.
+
+=item PERL_UNICODE
+X<PERL_UNICODE>
+
+Equivalent to the B<-C> command-line switch.  Note that this is not
+a boolean variable-- setting this to C<"1"> is not the right way to
+"enable Unicode" (whatever that would mean).  You can use C<"0"> to
+"disable Unicode", though (or alternatively unset PERL_UNICODE in
+your shell before starting Perl).  See the description of the C<-C>
+switch for more information.
+
+=item SYS$LOGIN (specific to the VMS port)
+X<SYS$LOGIN>
+
+Used if chdir has no argument and HOME and LOGDIR are not set.
+
+=back
+
+Perl also has environment variables that control how Perl handles data
+specific to particular natural languages.  See L<perllocale>.
+
+Apart from these, Perl uses no other environment variables, except
+to make them available to the program being executed, and to child
+processes.  However, programs running setuid would do well to execute
+the following lines before doing anything else, just to keep people
+honest:
+
+    $ENV{PATH}  = '/bin:/usr/bin';    # or whatever you need
+    $ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL};
+    delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsec.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsec.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsec.pod	(revision 14489)
@@ -0,0 +1,504 @@
+=head1 NAME
+
+perlsec - Perl security
+
+=head1 DESCRIPTION
+
+Perl is designed to make it easy to program securely even when running
+with extra privileges, like setuid or setgid programs.  Unlike most
+command line shells, which are based on multiple substitution passes on
+each line of the script, Perl uses a more conventional evaluation scheme
+with fewer hidden snags.  Additionally, because the language has more
+builtin functionality, it can rely less upon external (and possibly
+untrustworthy) programs to accomplish its purposes.
+
+Perl automatically enables a set of special security checks, called I<taint
+mode>, when it detects its program running with differing real and effective
+user or group IDs.  The setuid bit in Unix permissions is mode 04000, the
+setgid bit mode 02000; either or both may be set.  You can also enable taint
+mode explicitly by using the B<-T> command line flag. This flag is
+I<strongly> suggested for server programs and any program run on behalf of
+someone else, such as a CGI script. Once taint mode is on, it's on for
+the remainder of your script.
+
+While in this mode, Perl takes special precautions called I<taint
+checks> to prevent both obvious and subtle traps.  Some of these checks
+are reasonably simple, such as verifying that path directories aren't
+writable by others; careful programmers have always used checks like
+these.  Other checks, however, are best supported by the language itself,
+and it is these checks especially that contribute to making a set-id Perl
+program more secure than the corresponding C program.
+
+You may not use data derived from outside your program to affect
+something else outside your program--at least, not by accident.  All
+command line arguments, environment variables, locale information (see
+L<perllocale>), results of certain system calls (C<readdir()>,
+C<readlink()>, the variable of C<shmread()>, the messages returned by
+C<msgrcv()>, the password, gcos and shell fields returned by the
+C<getpwxxx()> calls), and all file input are marked as "tainted".
+Tainted data may not be used directly or indirectly in any command
+that invokes a sub-shell, nor in any command that modifies files,
+directories, or processes, B<with the following exceptions>:
+
+=over 4
+
+=item *
+
+Arguments to C<print> and C<syswrite> are B<not> checked for taintedness.
+
+=item *
+
+Symbolic methods
+
+    $obj->$method(@args);
+
+and symbolic sub references
+
+    &{$foo}(@args);
+    $foo->(@args);
+
+are not checked for taintedness.  This requires extra carefulness
+unless you want external data to affect your control flow.  Unless
+you carefully limit what these symbolic values are, people are able
+to call functions B<outside> your Perl code, such as POSIX::system,
+in which case they are able to run arbitrary external code.
+
+=back
+
+For efficiency reasons, Perl takes a conservative view of
+whether data is tainted.  If an expression contains tainted data,
+any subexpression may be considered tainted, even if the value
+of the subexpression is not itself affected by the tainted data.
+
+Because taintedness is associated with each scalar value, some
+elements of an array or hash can be tainted and others not.
+The keys of a hash are never tainted.
+
+For example:
+
+    $arg = shift;		# $arg is tainted
+    $hid = $arg, 'bar';		# $hid is also tainted
+    $line = <>;			# Tainted
+    $line = <STDIN>;		# Also tainted
+    open FOO, "/home/me/bar" or die $!;
+    $line = <FOO>;		# Still tainted
+    $path = $ENV{'PATH'};	# Tainted, but see below
+    $data = 'abc';		# Not tainted
+
+    system "echo $arg";		# Insecure
+    system "/bin/echo", $arg;	# Considered insecure
+				# (Perl doesn't know about /bin/echo)
+    system "echo $hid";		# Insecure
+    system "echo $data";	# Insecure until PATH set
+
+    $path = $ENV{'PATH'};	# $path now tainted
+
+    $ENV{'PATH'} = '/bin:/usr/bin';
+    delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
+
+    $path = $ENV{'PATH'};	# $path now NOT tainted
+    system "echo $data";	# Is secure now!
+
+    open(FOO, "< $arg");	# OK - read-only file
+    open(FOO, "> $arg"); 	# Not OK - trying to write
+
+    open(FOO,"echo $arg|");	# Not OK
+    open(FOO,"-|")
+	or exec 'echo', $arg;	# Also not OK
+
+    $shout = `echo $arg`;	# Insecure, $shout now tainted
+
+    unlink $data, $arg;		# Insecure
+    umask $arg;			# Insecure
+
+    exec "echo $arg";		# Insecure
+    exec "echo", $arg;		# Insecure
+    exec "sh", '-c', $arg;	# Very insecure!
+
+    @files = <*.c>;		# insecure (uses readdir() or similar)
+    @files = glob('*.c');	# insecure (uses readdir() or similar)
+
+    # In Perl releases older than 5.6.0 the <*.c> and glob('*.c') would
+    # have used an external program to do the filename expansion; but in
+    # either case the result is tainted since the list of filenames comes
+    # from outside of the program.
+
+    $bad = ($arg, 23);		# $bad will be tainted
+    $arg, `true`;		# Insecure (although it isn't really)
+
+If you try to do something insecure, you will get a fatal error saying
+something like "Insecure dependency" or "Insecure $ENV{PATH}".
+
+The exception to the principle of "one tainted value taints the whole
+expression" is with the ternary conditional operator C<?:>.  Since code
+with a ternary conditional
+
+    $result = $tainted_value ? "Untainted" : "Also untainted";
+
+is effectively
+
+    if ( $tainted_value ) {
+        $result = "Untainted";
+    } else {
+        $result = "Also untainted";
+    }
+
+it doesn't make sense for C<$result> to be tainted.
+
+=head2 Laundering and Detecting Tainted Data
+
+To test whether a variable contains tainted data, and whose use would
+thus trigger an "Insecure dependency" message, you can use the
+C<tainted()> function of the Scalar::Util module, available in your
+nearby CPAN mirror, and included in Perl starting from the release 5.8.0.
+Or you may be able to use the following C<is_tainted()> function.
+
+    sub is_tainted {
+        return ! eval { eval("#" . substr(join("", @_), 0, 0)); 1 };
+    }
+
+This function makes use of the fact that the presence of tainted data
+anywhere within an expression renders the entire expression tainted.  It
+would be inefficient for every operator to test every argument for
+taintedness.  Instead, the slightly more efficient and conservative
+approach is used that if any tainted value has been accessed within the
+same expression, the whole expression is considered tainted.
+
+But testing for taintedness gets you only so far.  Sometimes you have just
+to clear your data's taintedness.  Values may be untainted by using them
+as keys in a hash; otherwise the only way to bypass the tainting
+mechanism is by referencing subpatterns from a regular expression match.
+Perl presumes that if you reference a substring using $1, $2, etc., that
+you knew what you were doing when you wrote the pattern.  That means using
+a bit of thought--don't just blindly untaint anything, or you defeat the
+entire mechanism.  It's better to verify that the variable has only good
+characters (for certain values of "good") rather than checking whether it
+has any bad characters.  That's because it's far too easy to miss bad
+characters that you never thought of.
+
+Here's a test to make sure that the data contains nothing but "word"
+characters (alphabetics, numerics, and underscores), a hyphen, an at sign,
+or a dot.
+
+    if ($data =~ /^([-\@\w.]+)$/) {
+	$data = $1; 			# $data now untainted
+    } else {
+	die "Bad data in '$data'"; 	# log this somewhere
+    }
+
+This is fairly secure because C</\w+/> doesn't normally match shell
+metacharacters, nor are dot, dash, or at going to mean something special
+to the shell.  Use of C</.+/> would have been insecure in theory because
+it lets everything through, but Perl doesn't check for that.  The lesson
+is that when untainting, you must be exceedingly careful with your patterns.
+Laundering data using regular expression is the I<only> mechanism for
+untainting dirty data, unless you use the strategy detailed below to fork
+a child of lesser privilege.
+
+The example does not untaint C<$data> if C<use locale> is in effect,
+because the characters matched by C<\w> are determined by the locale.
+Perl considers that locale definitions are untrustworthy because they
+contain data from outside the program.  If you are writing a
+locale-aware program, and want to launder data with a regular expression
+containing C<\w>, put C<no locale> ahead of the expression in the same
+block.  See L<perllocale/SECURITY> for further discussion and examples.
+
+=head2 Switches On the "#!" Line
+
+When you make a script executable, in order to make it usable as a
+command, the system will pass switches to perl from the script's #!
+line.  Perl checks that any command line switches given to a setuid
+(or setgid) script actually match the ones set on the #! line.  Some
+Unix and Unix-like environments impose a one-switch limit on the #!
+line, so you may need to use something like C<-wU> instead of C<-w -U>
+under such systems.  (This issue should arise only in Unix or
+Unix-like environments that support #! and setuid or setgid scripts.)
+
+=head2 Taint mode and @INC
+
+When the taint mode (C<-T>) is in effect, the "." directory is removed
+from C<@INC>, and the environment variables C<PERL5LIB> and C<PERLLIB>
+are ignored by Perl. You can still adjust C<@INC> from outside the
+program by using the C<-I> command line option as explained in
+L<perlrun>. The two environment variables are ignored because
+they are obscured, and a user running a program could be unaware that
+they are set, whereas the C<-I> option is clearly visible and
+therefore permitted.
+
+Another way to modify C<@INC> without modifying the program, is to use
+the C<lib> pragma, e.g.:
+
+  perl -Mlib=/foo program
+
+The benefit of using C<-Mlib=/foo> over C<-I/foo>, is that the former
+will automagically remove any duplicated directories, while the later
+will not.
+
+Note that if a tainted string is added to C<@INC>, the following
+problem will be reported:
+
+  Insecure dependency in require while running with -T switch
+
+=head2 Cleaning Up Your Path
+
+For "Insecure C<$ENV{PATH}>" messages, you need to set C<$ENV{'PATH'}> to
+a known value, and each directory in the path must be absolute and
+non-writable by others than its owner and group.  You may be surprised to
+get this message even if the pathname to your executable is fully
+qualified.  This is I<not> generated because you didn't supply a full path
+to the program; instead, it's generated because you never set your PATH
+environment variable, or you didn't set it to something that was safe.
+Because Perl can't guarantee that the executable in question isn't itself
+going to turn around and execute some other program that is dependent on
+your PATH, it makes sure you set the PATH.
+
+The PATH isn't the only environment variable which can cause problems.
+Because some shells may use the variables IFS, CDPATH, ENV, and
+BASH_ENV, Perl checks that those are either empty or untainted when
+starting subprocesses. You may wish to add something like this to your
+setid and taint-checking scripts.
+
+    delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};   # Make %ENV safer
+
+It's also possible to get into trouble with other operations that don't
+care whether they use tainted values.  Make judicious use of the file
+tests in dealing with any user-supplied filenames.  When possible, do
+opens and such B<after> properly dropping any special user (or group!)
+privileges. Perl doesn't prevent you from opening tainted filenames for reading,
+so be careful what you print out.  The tainting mechanism is intended to
+prevent stupid mistakes, not to remove the need for thought.
+
+Perl does not call the shell to expand wild cards when you pass C<system>
+and C<exec> explicit parameter lists instead of strings with possible shell
+wildcards in them.  Unfortunately, the C<open>, C<glob>, and
+backtick functions provide no such alternate calling convention, so more
+subterfuge will be required.
+
+Perl provides a reasonably safe way to open a file or pipe from a setuid
+or setgid program: just create a child process with reduced privilege who
+does the dirty work for you.  First, fork a child using the special
+C<open> syntax that connects the parent and child by a pipe.  Now the
+child resets its ID set and any other per-process attributes, like
+environment variables, umasks, current working directories, back to the
+originals or known safe values.  Then the child process, which no longer
+has any special permissions, does the C<open> or other system call.
+Finally, the child passes the data it managed to access back to the
+parent.  Because the file or pipe was opened in the child while running
+under less privilege than the parent, it's not apt to be tricked into
+doing something it shouldn't.
+
+Here's a way to do backticks reasonably safely.  Notice how the C<exec> is
+not called with a string that the shell could expand.  This is by far the
+best way to call something that might be subjected to shell escapes: just
+never call the shell at all.  
+
+        use English '-no_match_vars';
+        die "Can't fork: $!" unless defined($pid = open(KID, "-|"));
+        if ($pid) {           # parent
+            while (<KID>) {
+                # do something
+            }
+            close KID;
+        } else {
+            my @temp     = ($EUID, $EGID);
+            my $orig_uid = $UID;
+            my $orig_gid = $GID;
+            $EUID = $UID;
+            $EGID = $GID;
+            # Drop privileges
+            $UID  = $orig_uid;
+            $GID  = $orig_gid;
+            # Make sure privs are really gone
+            ($EUID, $EGID) = @temp;
+            die "Can't drop privileges"
+                unless $UID == $EUID  && $GID eq $EGID;
+            $ENV{PATH} = "/bin:/usr/bin"; # Minimal PATH.
+	    # Consider sanitizing the environment even more.
+            exec 'myprog', 'arg1', 'arg2'
+                or die "can't exec myprog: $!";
+        }
+
+A similar strategy would work for wildcard expansion via C<glob>, although
+you can use C<readdir> instead.
+
+Taint checking is most useful when although you trust yourself not to have
+written a program to give away the farm, you don't necessarily trust those
+who end up using it not to try to trick it into doing something bad.  This
+is the kind of security checking that's useful for set-id programs and
+programs launched on someone else's behalf, like CGI programs.
+
+This is quite different, however, from not even trusting the writer of the
+code not to try to do something evil.  That's the kind of trust needed
+when someone hands you a program you've never seen before and says, "Here,
+run this."  For that kind of safety, check out the Safe module,
+included standard in the Perl distribution.  This module allows the
+programmer to set up special compartments in which all system operations
+are trapped and namespace access is carefully controlled.
+
+=head2 Security Bugs
+
+Beyond the obvious problems that stem from giving special privileges to
+systems as flexible as scripts, on many versions of Unix, set-id scripts
+are inherently insecure right from the start.  The problem is a race
+condition in the kernel.  Between the time the kernel opens the file to
+see which interpreter to run and when the (now-set-id) interpreter turns
+around and reopens the file to interpret it, the file in question may have
+changed, especially if you have symbolic links on your system.
+
+Fortunately, sometimes this kernel "feature" can be disabled.
+Unfortunately, there are two ways to disable it.  The system can simply
+outlaw scripts with any set-id bit set, which doesn't help much.
+Alternately, it can simply ignore the set-id bits on scripts.  If the
+latter is true, Perl can emulate the setuid and setgid mechanism when it
+notices the otherwise useless setuid/gid bits on Perl scripts.  It does
+this via a special executable called F<suidperl> that is automatically
+invoked for you if it's needed.
+
+However, if the kernel set-id script feature isn't disabled, Perl will
+complain loudly that your set-id script is insecure.  You'll need to
+either disable the kernel set-id script feature, or put a C wrapper around
+the script.  A C wrapper is just a compiled program that does nothing
+except call your Perl program.   Compiled programs are not subject to the
+kernel bug that plagues set-id scripts.  Here's a simple wrapper, written
+in C:
+
+    #define REAL_PATH "/path/to/script"
+    main(ac, av)
+	char **av;
+    {
+	execv(REAL_PATH, av);
+    }
+
+Compile this wrapper into a binary executable and then make I<it> rather
+than your script setuid or setgid.
+
+In recent years, vendors have begun to supply systems free of this
+inherent security bug.  On such systems, when the kernel passes the name
+of the set-id script to open to the interpreter, rather than using a
+pathname subject to meddling, it instead passes I</dev/fd/3>.  This is a
+special file already opened on the script, so that there can be no race
+condition for evil scripts to exploit.  On these systems, Perl should be
+compiled with C<-DSETUID_SCRIPTS_ARE_SECURE_NOW>.  The F<Configure>
+program that builds Perl tries to figure this out for itself, so you
+should never have to specify this yourself.  Most modern releases of
+SysVr4 and BSD 4.4 use this approach to avoid the kernel race condition.
+
+Prior to release 5.6.1 of Perl, bugs in the code of F<suidperl> could
+introduce a security hole.
+
+=head2 Protecting Your Programs
+
+There are a number of ways to hide the source to your Perl programs,
+with varying levels of "security".
+
+First of all, however, you I<can't> take away read permission, because
+the source code has to be readable in order to be compiled and
+interpreted.  (That doesn't mean that a CGI script's source is
+readable by people on the web, though.)  So you have to leave the
+permissions at the socially friendly 0755 level.  This lets 
+people on your local system only see your source.
+
+Some people mistakenly regard this as a security problem.  If your program does
+insecure things, and relies on people not knowing how to exploit those
+insecurities, it is not secure.  It is often possible for someone to
+determine the insecure things and exploit them without viewing the
+source.  Security through obscurity, the name for hiding your bugs
+instead of fixing them, is little security indeed.
+
+You can try using encryption via source filters (Filter::* from CPAN,
+or Filter::Util::Call and Filter::Simple since Perl 5.8).
+But crackers might be able to decrypt it.  You can try using the byte
+code compiler and interpreter described below, but crackers might be
+able to de-compile it.  You can try using the native-code compiler
+described below, but crackers might be able to disassemble it.  These
+pose varying degrees of difficulty to people wanting to get at your
+code, but none can definitively conceal it (this is true of every
+language, not just Perl).
+
+If you're concerned about people profiting from your code, then the
+bottom line is that nothing but a restrictive licence will give you
+legal security.  License your software and pepper it with threatening
+statements like "This is unpublished proprietary software of XYZ Corp.
+Your access to it does not give you permission to use it blah blah
+blah."  You should see a lawyer to be sure your licence's wording will
+stand up in court.
+
+=head2 Unicode
+
+Unicode is a new and complex technology and one may easily overlook
+certain security pitfalls.  See L<perluniintro> for an overview and
+L<perlunicode> for details, and L<perlunicode/"Security Implications
+of Unicode"> for security implications in particular.
+
+=head2 Algorithmic Complexity Attacks
+
+Certain internal algorithms used in the implementation of Perl can
+be attacked by choosing the input carefully to consume large amounts
+of either time or space or both.  This can lead into the so-called
+I<Denial of Service> (DoS) attacks.
+
+=over 4
+
+=item *
+
+Hash Function - the algorithm used to "order" hash elements has been
+changed several times during the development of Perl, mainly to be
+reasonably fast.  In Perl 5.8.1 also the security aspect was taken
+into account.
+
+In Perls before 5.8.1 one could rather easily generate data that as
+hash keys would cause Perl to consume large amounts of time because
+internal structure of hashes would badly degenerate.  In Perl 5.8.1
+the hash function is randomly perturbed by a pseudorandom seed which
+makes generating such naughty hash keys harder.
+See L<perlrun/PERL_HASH_SEED> for more information.
+
+The random perturbation is done by default but if one wants for some
+reason emulate the old behaviour one can set the environment variable
+PERL_HASH_SEED to zero (or any other integer).  One possible reason
+for wanting to emulate the old behaviour is that in the new behaviour
+consecutive runs of Perl will order hash keys differently, which may
+confuse some applications (like Data::Dumper: the outputs of two
+different runs are no more identical).
+
+B<Perl has never guaranteed any ordering of the hash keys>, and the
+ordering has already changed several times during the lifetime of
+Perl 5.  Also, the ordering of hash keys has always been, and
+continues to be, affected by the insertion order.
+
+Also note that while the order of the hash elements might be
+randomised, this "pseudoordering" should B<not> be used for
+applications like shuffling a list randomly (use List::Util::shuffle()
+for that, see L<List::Util>, a standard core module since Perl 5.8.0;
+or the CPAN module Algorithm::Numerical::Shuffle), or for generating
+permutations (use e.g. the CPAN modules Algorithm::Permute or
+Algorithm::FastPermute), or for any cryptographic applications.
+
+=item *
+
+Regular expressions - Perl's regular expression engine is so called
+NFA (Non-Finite Automaton), which among other things means that it can
+rather easily consume large amounts of both time and space if the
+regular expression may match in several ways.  Careful crafting of the
+regular expressions can help but quite often there really isn't much
+one can do (the book "Mastering Regular Expressions" is required
+reading, see L<perlfaq2>).  Running out of space manifests itself by
+Perl running out of memory.
+
+=item *
+
+Sorting - the quicksort algorithm used in Perls before 5.8.0 to
+implement the sort() function is very easy to trick into misbehaving
+so that it consumes a lot of time.  Nothing more is required than
+resorting a list already sorted.  Starting from Perl 5.8.0 a different
+sorting algorithm, mergesort, is used.  Mergesort is insensitive to
+its input data, so it cannot be similarly fooled.
+
+=back
+
+See L<http://www.cs.rice.edu/~scrosby/hash/> for more information,
+and any computer science text book on the algorithmic complexity.
+
+=head1 SEE ALSO
+
+L<perlrun> for its description of cleaning up environment variables.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsolaris.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsolaris.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsolaris.pod	(revision 14489)
@@ -0,0 +1,690 @@
+If you read this file _as_is_, just ignore the funny characters you
+see.  It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.solaris - Perl version 5 on Solaris systems
+
+=head1 DESCRIPTION
+
+This document describes various features of Sun's Solaris operating system
+that will affect how Perl version 5 (hereafter just perl) is
+compiled and/or runs.  Some issues relating to the older SunOS 4.x are
+also discussed, though they may be out of date.
+
+For the most part, everything should just work.
+
+Starting with Solaris 8, perl5.00503 (or higher) is supplied with the
+operating system, so you might not even need to build a newer version
+of perl at all.  The Sun-supplied version is installed in /usr/perl5
+with /usr/bin/perl pointing to /usr/perl5/bin/perl.  Do not disturb
+that installation unless you really know what you are doing.  If you
+remove the perl supplied with the OS, you will render some bits of
+your system inoperable.  If you wish to install a newer version of perl,
+install it under a different prefix from /usr/perl5.  Common prefixes
+to use are /usr/local and /opt/perl.
+
+You may wish to put your version of perl in the PATH of all users by
+changing the link /usr/bin/perl.  This is probably OK, as most perl
+scripts shipped with Solaris use an explicit path.  (There are a few
+exceptions, such as /usr/bin/rpm2cpio and /etc/rcm/scripts/README, but
+these are also sufficiently generic that the actual version of perl
+probably doesn't matter too much.)
+
+Solaris ships with a range of Solaris-specific modules.  If you choose
+to install your own version of perl you will find the source of many of
+these modules is available on CPAN under the Sun::Solaris:: namespace.
+
+Solaris may include two versions of perl, e.g. Solaris 9 includes
+both 5.005_03 and 5.6.1.  This is to provide stability across Solaris
+releases, in cases where a later perl version has incompatibilities
+with the version included in the preceeding Solaris release.  The
+default perl version will always be the most recent, and in general
+the old version will only be retained for one Solaris release.  Note
+also that the default perl will NOT be configured to search for modules
+in the older version, again due to compatibility/stability concerns.
+As a consequence if you upgrade Solaris, you will have to
+rebuild/reinstall any additional CPAN modules that you installed for
+the previous Solaris version.  See the CPAN manpage under 'autobundle'
+for a quick way of doing this.
+
+As an interim measure, you may either change the #! line of your
+scripts to specifically refer to the old perl version, e.g. on
+Solaris 9 use #!/usr/perl5/5.00503/bin/perl to use the perl version
+that was the default for Solaris 8, or if you have a large number of
+scripts it may be more convenient to make the old version of perl the
+default on your system.  You can do this by changing the appropriate
+symlinks under /usr/perl5 as follows (example for Solaris 9):
+
+ # cd /usr/perl5
+ # rm bin man pod
+ # ln -s ./5.00503/bin
+ # ln -s ./5.00503/man
+ # ln -s ./5.00503/lib/pod
+ # rm /usr/bin/perl
+ # ln -s ../perl5/5.00503/bin/perl /usr/bin/perl
+
+In both cases this should only be considered to be a temporary
+measure - you should upgrade to the later version of perl as soon as
+is practicable.
+
+Note also that the perl command-line utilities (e.g. perldoc) and any
+that are added by modules that you install will be under
+/usr/perl5/bin, so that directory should be added to your PATH.
+
+=head2 Solaris Version Numbers.
+
+For consistency with common usage, perl's Configure script performs
+some minor manipulations on the operating system name and version
+number as reported by uname.  Here's a partial translation table:
+
+          Sun:                      perl's Configure:
+ uname    uname -r   Name           osname     osvers
+ SunOS    4.1.3     Solaris 1.1     sunos      4.1.3
+ SunOS    5.6       Solaris 2.6     solaris    2.6
+ SunOS    5.8       Solaris 8       solaris    2.8
+ SunOS    5.9       Solaris 9       solaris    2.9
+ SunOS    5.10      Solaris 10      solaris    2.10
+
+The complete table can be found in the Sun Managers' FAQ
+L<ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq> under
+"9.1) Which Sun models run which versions of SunOS?".
+
+=head1 RESOURCES
+
+There are many, many sources for Solaris information.  A few of the
+important ones for perl:
+
+=over 4
+
+=item Solaris FAQ
+
+The Solaris FAQ is available at
+L<http://www.science.uva.nl/pub/solaris/solaris2.html>.
+
+The Sun Managers' FAQ is available at
+L<ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq>
+
+=item Precompiled Binaries
+
+Precompiled binaries, links to many sites, and much, much more are
+available at L<http://www.sunfreeware.com/> and
+L<http://www.blastwave.org/>.
+
+=item Solaris Documentation
+
+All Solaris documentation is available on-line at L<http://docs.sun.com/>.
+
+=back
+
+=head1 SETTING UP
+
+=head2 File Extraction Problems on Solaris.
+
+Be sure to use a tar program compiled under Solaris (not SunOS 4.x)
+to extract the perl-5.x.x.tar.gz file.  Do not use GNU tar compiled
+for SunOS4 on Solaris.  (GNU tar compiled for Solaris should be fine.)
+When you run SunOS4 binaries on Solaris, the run-time system magically
+alters pathnames matching m#lib/locale# so that when tar tries to create
+lib/locale.pm, a file named lib/oldlocale.pm gets created instead.
+If you found this advice too late and used a SunOS4-compiled tar
+anyway, you must find the incorrectly renamed file and move it back
+to lib/locale.pm.
+
+=head2 Compiler and Related Tools on Solaris.
+
+You must use an ANSI C compiler to build perl.  Perl can be compiled
+with either Sun's add-on C compiler or with gcc.  The C compiler that
+shipped with SunOS4 will not do.
+
+=head3 Include /usr/ccs/bin/ in your PATH.
+
+Several tools needed to build perl are located in /usr/ccs/bin/:  ar,
+as, ld, and make.  Make sure that /usr/ccs/bin/ is in your PATH.
+
+You need to make sure the following packages are installed
+(this info is extracted from the Solaris FAQ):
+
+for tools (sccs, lex, yacc, make, nm, truss, ld, as): SUNWbtool,
+SUNWsprot, SUNWtoo
+
+for libraries & headers: SUNWhea, SUNWarc, SUNWlibm, SUNWlibms, SUNWdfbh,
+SUNWcg6h, SUNWxwinc, SUNWolinc
+
+for 64 bit development: SUNWarcx, SUNWbtoox, SUNWdplx, SUNWscpux,
+SUNWsprox, SUNWtoox, SUNWlmsx, SUNWlmx, SUNWlibCx
+
+If you are in doubt which package contains a file you are missing,
+try to find an installation that has that file. Then do a
+
+ $ grep /my/missing/file /var/sadm/install/contents
+
+This will display a line like this:
+
+/usr/include/sys/errno.h f none 0644 root bin 7471 37605 956241356 SUNWhea
+
+The last item listed (SUNWhea in this example) is the package you need.
+
+=head3 Avoid /usr/ucb/cc.
+
+You don't need to have /usr/ucb/ in your PATH to build perl.  If you
+want /usr/ucb/ in your PATH anyway, make sure that /usr/ucb/ is NOT
+in your PATH before the directory containing the right C compiler.
+
+=head3 Sun's C Compiler
+
+If you use Sun's C compiler, make sure the correct directory
+(usually /opt/SUNWspro/bin/) is in your PATH (before /usr/ucb/).
+
+=head3 GCC
+
+If you use gcc, make sure your installation is recent and complete.
+perl versions since 5.6.0 build fine with gcc > 2.8.1 on Solaris >=
+2.6.
+
+You must Configure perl with
+
+ $ sh Configure -Dcc=gcc
+
+If you don't, you may experience strange build errors.
+
+If you have updated your Solaris version, you may also have to update
+your gcc.  For example, if you are running Solaris 2.6 and your gcc is
+installed under /usr/local, check in /usr/local/lib/gcc-lib and make
+sure you have the appropriate directory, sparc-sun-solaris2.6/ or
+i386-pc-solaris2.6/.  If gcc's directory is for a different version of
+Solaris than you are running, then you will need to rebuild gcc for
+your new version of Solaris.
+
+You can get a precompiled version of gcc from
+L<http://www.sunfreeware.com/> or L<http://www.blastwave.org/>. Make
+sure you pick up the package for your Solaris release.
+
+If you wish to use gcc to build add-on modules for use with the perl
+shipped with Solaris, you should use the Solaris::PerlGcc module
+which is available from CPAN.  The perl shipped with Solaris
+is configured and built with the Sun compilers, and the compiler
+configuration information stored in Config.pm is therefore only
+relevant to the Sun compilers.  The Solaris:PerlGcc module contains a
+replacement Config.pm that is correct for gcc - see the module for
+details.
+
+=head3 GNU as and GNU ld
+
+The following information applies to gcc version 2.  Volunteers to
+update it as appropropriate for gcc version 3 would be appreciated.
+
+The versions of as and ld supplied with Solaris work fine for building
+perl.  There is normally no need to install the GNU versions to
+compile perl.
+
+If you decide to ignore this advice and use the GNU versions anyway,
+then be sure that they are relatively recent.  Versions newer than 2.7
+are apparently new enough.  Older versions may have trouble with
+dynamic loading.
+
+If you wish to use GNU ld, then you need to pass it the -Wl,-E flag.
+The hints/solaris_2.sh file tries to do this automatically by setting
+the following Configure variables:
+
+ ccdlflags="$ccdlflags -Wl,-E"
+ lddlflags="$lddlflags -Wl,-E -G"
+
+However, over the years, changes in gcc, GNU ld, and Solaris ld have made
+it difficult to automatically detect which ld ultimately gets called.
+You may have to manually edit config.sh and add the -Wl,-E flags
+yourself, or else run Configure interactively and add the flags at the
+appropriate prompts.
+
+If your gcc is configured to use GNU as and ld but you want to use the
+Solaris ones instead to build perl, then you'll need to add
+-B/usr/ccs/bin/ to the gcc command line.  One convenient way to do
+that is with
+
+ $ sh Configure -Dcc='gcc -B/usr/ccs/bin/'
+
+Note that the trailing slash is required.  This will result in some
+harmless warnings as Configure is run:
+
+ gcc: file path prefix `/usr/ccs/bin/' never used
+
+These messages may safely be ignored.
+(Note that for a SunOS4 system, you must use -B/bin/ instead.)
+
+Alternatively, you can use the GCC_EXEC_PREFIX environment variable to
+ensure that Sun's as and ld are used.  Consult your gcc documentation
+for further information on the -B option and the GCC_EXEC_PREFIX variable.
+
+=head3 Sun and GNU make
+
+The make under /usr/ccs/bin works fine for building perl.  If you
+have the Sun C compilers, you will also have a parallel version of
+make (dmake).  This works fine to build perl, but can sometimes cause
+problems when running 'make test' due to underspecified dependencies
+between the different test harness files.  The same problem can also
+affect the building of some add-on modules, so in those cases either
+specify '-m serial' on the dmake command line, or use
+/usr/ccs/bin/make instead.  If you wish to use GNU make, be sure that
+the set-group-id bit is not set.  If it is, then arrange your PATH so
+that /usr/ccs/bin/make is before GNU make or else have the system
+administrator disable the set-group-id bit on GNU make.
+
+=head3 Avoid libucb.
+
+Solaris provides some BSD-compatibility functions in /usr/ucblib/libucb.a.
+Perl will not build and run correctly if linked against -lucb since it
+contains routines that are incompatible with the standard Solaris libc.
+Normally this is not a problem since the solaris hints file prevents
+Configure from even looking in /usr/ucblib for libraries, and also
+explicitly omits -lucb.
+
+=head2 Environment for Compiling perl on Solaris
+
+=head3 PATH
+
+Make sure your PATH includes the compiler (/opt/SUNWspro/bin/ if you're
+using Sun's compiler) as well as /usr/ccs/bin/ to pick up the other
+development tools (such as make, ar, as, and ld).  Make sure your path
+either doesn't include /usr/ucb or that it includes it after the
+compiler and compiler tools and other standard Solaris directories.
+You definitely don't want /usr/ucb/cc.
+
+=head3 LD_LIBRARY_PATH
+
+If you have the LD_LIBRARY_PATH environment variable set, be sure that
+it does NOT include /lib or /usr/lib.  If you will be building
+extensions that call third-party shared libraries (e.g. Berkeley DB)
+then make sure that your LD_LIBRARY_PATH environment variable includes
+the directory with that library (e.g. /usr/local/lib).
+
+If you get an error message
+
+ dlopen: stub interception failed
+
+it is probably because your LD_LIBRARY_PATH environment variable
+includes a directory which is a symlink to /usr/lib (such as /lib).
+The reason this causes a problem is quite subtle.  The file
+libdl.so.1.0 actually *only* contains functions which generate 'stub
+interception failed' errors!  The runtime linker intercepts links to
+"/usr/lib/libdl.so.1.0" and links in internal implementations of those
+functions instead.  [Thanks to Tim Bunce for this explanation.]
+
+=head1 RUN CONFIGURE.
+
+See the INSTALL file for general information regarding Configure.
+Only Solaris-specific issues are discussed here.  Usually, the
+defaults should be fine.
+
+=head2 64-bit perl on Solaris.
+
+See the INSTALL file for general information regarding 64-bit compiles.
+In general, the defaults should be fine for most people.
+
+By default, perl-5.6.0 (or later) is compiled as a 32-bit application
+with largefile and long-long support.
+
+=head3 General 32-bit vs. 64-bit issues.
+
+Solaris 7 and above will run in either 32 bit or 64 bit mode on SPARC
+CPUs, via a reboot. You can build 64 bit apps whilst running 32 bit
+mode and vice-versa. 32 bit apps will run under Solaris running in
+either 32 or 64 bit mode.  64 bit apps require Solaris to be running
+64 bit mode.
+
+Existing 32 bit apps are properly known as LP32, i.e. Longs and
+Pointers are 32 bit.  64-bit apps are more properly known as LP64.
+The discriminating feature of a LP64 bit app is its ability to utilise a
+64-bit address space.  It is perfectly possible to have a LP32 bit app
+that supports both 64-bit integers (long long) and largefiles (> 2GB),
+and this is the default for perl-5.6.0.
+
+For a more complete explanation of 64-bit issues, see the
+"Solaris 64-bit Developer's Guide" at L<http://docs.sun.com/>
+
+You can detect the OS mode using "isainfo -v", e.g.
+
+ $ isainfo -v   # Ultra 30 in 64 bit mode
+ 64-bit sparcv9 applications
+ 32-bit sparc applications
+
+By default, perl will be compiled as a 32-bit application.  Unless
+you want to allocate more than ~ 4GB of memory inside perl, or unless
+you need more than 255 open file descriptors, you probably don't need
+perl to be a 64-bit app.
+
+=head3 Large File Support
+
+For Solaris 2.6 and onwards, there are two different ways for 32-bit
+applications to manipulate large files (files whose size is > 2GByte).
+(A 64-bit application automatically has largefile support built in
+by default.)
+
+First is the "transitional compilation environment", described in
+lfcompile64(5).  According to the man page,
+
+ The transitional compilation  environment  exports  all  the
+ explicit 64-bit functions (xxx64()) and types in addition to
+ all the regular functions (xxx()) and types. Both xxx()  and
+ xxx64()  functions  are  available to the program source.  A
+ 32-bit application must use the xxx64() functions in  order
+ to  access  large  files.  See the lf64(5) manual page for a
+ complete listing of the 64-bit transitional interfaces.
+
+The transitional compilation environment is obtained with the
+following compiler and linker flags:
+
+ getconf LFS64_CFLAGS        -D_LARGEFILE64_SOURCE
+ getconf LFS64_LDFLAG        # nothing special needed
+ getconf LFS64_LIBS          # nothing special needed
+
+Second is the "large file compilation environment", described in
+lfcompile(5).  According to the man page,
+
+ Each interface named xxx() that needs to access 64-bit entities
+ to  access  large  files maps to a xxx64() call in the
+ resulting binary. All relevant data types are defined to  be
+ of correct size (for example, off_t has a typedef definition
+ for a 64-bit entity).
+
+ An application compiled in this environment is able  to  use
+ the  xxx()  source interfaces to access both large and small
+ files, rather than having to explicitly utilize the  transitional
+ xxx64()  interface  calls to access large files.
+
+Two exceptions are fseek() and ftell().  32-bit applications should
+use fseeko(3C) and ftello(3C).  These will get automatically mapped
+to fseeko64() and ftello64().
+
+The large file compilation environment is obtained with
+
+ getconf LFS_CFLAGS      -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
+ getconf LFS_LDFLAGS     # nothing special needed
+ getconf LFS_LIBS        # nothing special needed
+
+By default, perl uses the large file compilation environment and
+relies on Solaris to do the underlying mapping of interfaces.
+
+=head3 Building an LP64 perl
+
+To compile a 64-bit application on an UltraSparc with a recent Sun Compiler,
+you need to use the flag "-xarch=v9".  getconf(1) will tell you this, e.g.
+
+ $ getconf -a | grep v9
+ XBS5_LP64_OFF64_CFLAGS:         -xarch=v9
+ XBS5_LP64_OFF64_LDFLAGS:        -xarch=v9
+ XBS5_LP64_OFF64_LINTFLAGS:      -xarch=v9
+ XBS5_LPBIG_OFFBIG_CFLAGS:       -xarch=v9
+ XBS5_LPBIG_OFFBIG_LDFLAGS:      -xarch=v9
+ XBS5_LPBIG_OFFBIG_LINTFLAGS:    -xarch=v9
+ _XBS5_LP64_OFF64_CFLAGS:        -xarch=v9
+ _XBS5_LP64_OFF64_LDFLAGS:       -xarch=v9
+ _XBS5_LP64_OFF64_LINTFLAGS:     -xarch=v9
+ _XBS5_LPBIG_OFFBIG_CFLAGS:      -xarch=v9
+ _XBS5_LPBIG_OFFBIG_LDFLAGS:     -xarch=v9
+ _XBS5_LPBIG_OFFBIG_LINTFLAGS:   -xarch=v9
+
+This flag is supported in Sun WorkShop Compilers 5.0 and onwards
+(now marketed under the name Forte) when used on Solaris 7 or later on
+UltraSparc systems.
+
+If you are using gcc, you would need to use -mcpu=v9 -m64 instead.  This
+option is not yet supported as of gcc 2.95.2; from install/SPECIFIC
+in that release:
+
+ GCC version 2.95 is not able to compile code correctly for sparc64
+ targets. Users of the Linux kernel, at least, can use the sparc32
+ program to start up a new shell invocation with an environment that
+ causes configure to recognize (via uname -a) the system as sparc-*-*
+ instead.
+
+All this should be handled automatically by the hints file, if
+requested.
+
+=head3 Long Doubles.
+
+As of 5.8.1, long doubles are working if you use the Sun compilers
+(needed for additional math routines not included in libm).
+
+=head2 Threads in perl on Solaris.
+
+It is possible to build a threaded version of perl on Solaris.  The entire
+perl thread implementation is still experimental, however, so beware.
+
+=head2 Malloc Issues with perl on Solaris.
+
+Starting from perl 5.7.1 perl uses the Solaris malloc, since the perl
+malloc breaks when dealing with more than 2GB of memory, and the Solaris
+malloc also seems to be faster.
+
+If you for some reason (such as binary backward compatibility) really
+need to use perl's malloc, you can rebuild perl from the sources
+and Configure the build with 
+
+ $ sh Configure -Dusemymalloc
+
+You should not use perl's malloc if you are building with gcc.  There
+are reports of core dumps, especially in the PDL module.  The problem
+appears to go away under -DDEBUGGING, so it has been difficult to
+track down.  Sun's compiler appears to be okay with or without perl's
+malloc. [XXX further investigation is needed here.]
+
+=head1 MAKE PROBLEMS.
+
+=over 4
+
+=item Dynamic Loading Problems With GNU as and GNU ld
+
+If you have problems with dynamic loading using gcc on SunOS or
+Solaris, and you are using GNU as and GNU ld, see the section
+L<"GNU as and GNU ld"> above.
+
+=item ld.so.1: ./perl: fatal: relocation error:
+
+If you get this message on SunOS or Solaris, and you're using gcc,
+it's probably the GNU as or GNU ld problem in the previous item
+L<"GNU as and GNU ld">.
+
+=item dlopen: stub interception failed
+
+The primary cause of the 'dlopen: stub interception failed' message is
+that the LD_LIBRARY_PATH environment variable includes a directory
+which is a symlink to /usr/lib (such as /lib).  See
+L<"LD_LIBRARY_PATH"> above.
+
+=item #error "No DATAMODEL_NATIVE specified"
+
+This is a common error when trying to build perl on Solaris 2.6 with a
+gcc installation from Solaris 2.5 or 2.5.1.  The Solaris header files
+changed, so you need to update your gcc installation.  You can either
+rerun the fixincludes script from gcc or take the opportunity to
+update your gcc installation.
+
+=item sh: ar: not found
+
+This is a message from your shell telling you that the command 'ar'
+was not found.  You need to check your PATH environment variable to
+make sure that it includes the directory with the 'ar' command.  This
+is a common problem on Solaris, where 'ar' is in the /usr/ccs/bin/
+directory.
+
+=back
+
+=head1 MAKE TEST
+
+=head2 op/stat.t test 4 in Solaris
+
+op/stat.t test 4 may fail if you are on a tmpfs of some sort.
+Building in /tmp sometimes shows this behavior.  The
+test suite detects if you are building in /tmp, but it may not be able
+to catch all tmpfs situations.
+
+=head2 nss_delete core dump from op/pwent or op/grent
+
+See L<perlhpux/"nss_delete core dump from op/pwent or op/grent">.
+
+=head1 PREBUILT BINARIES OF PERL FOR SOLARIS.
+
+You can pick up prebuilt binaries for Solaris from
+L<http://www.sunfreeware.com/>, L<http://www.blastwave.org>,
+ActiveState L<http://www.activestate.com/>, and
+L<http://www.perl.com/> under the Binaries list at the top of the
+page.  There are probably other sources as well.  Please note that
+these sites are under the control of their respective owners, not the
+perl developers.
+
+=head1 RUNTIME ISSUES FOR PERL ON SOLARIS.
+
+=head2 Limits on Numbers of Open Files on Solaris.
+
+The stdio(3C) manpage notes that for LP32 applications, only 255
+files may be opened using fopen(), and only file descriptors 0
+through 255 can be used in a stream.  Since perl calls open() and
+then fdopen(3C) with the resulting file descriptor, perl is limited
+to 255 simultaneous open files, even if sysopen() is used.  If this
+proves to be an insurmountable problem, you can compile perl as a
+LP64 application, see L<Building an LP64 perl> for details.  Note
+also that the default resource limit for open file descriptors on
+Solaris is 255, so you will have to modify your ulimit or rctl
+(Solaris 9 onwards) appropriately.
+
+=head1 SOLARIS-SPECIFIC MODULES.
+
+See the modules under the Solaris:: and Sun::Solaris namespaces on CPAN,
+see L<http://www.cpan.org/modules/by-module/Solaris/> and
+L<http://www.cpan.org/modules/by-module/Sun/>.
+
+=head1 SOLARIS-SPECIFIC PROBLEMS WITH MODULES.
+
+=head2 Proc::ProcessTable on Solaris
+
+Proc::ProcessTable does not compile on Solaris with perl5.6.0 and higher
+if you have LARGEFILES defined.  Since largefile support is the
+default in 5.6.0 and later, you have to take special steps to use this
+module.
+
+The problem is that various structures visible via procfs use off_t,
+and if you compile with largefile support these change from 32 bits to
+64 bits.  Thus what you get back from procfs doesn't match up with
+the structures in perl, resulting in garbage.  See proc(4) for further
+discussion.
+
+A fix for Proc::ProcessTable is to edit Makefile to
+explicitly remove the largefile flags from the ones MakeMaker picks up
+from Config.pm.  This will result in Proc::ProcessTable being built
+under the correct environment.  Everything should then be OK as long as
+Proc::ProcessTable doesn't try to share off_t's with the rest of perl,
+or if it does they should be explicitly specified as off64_t.
+
+=head2 BSD::Resource on Solaris
+
+BSD::Resource versions earlier than 1.09 do not compile on Solaris
+with perl 5.6.0 and higher, for the same reasons as Proc::ProcessTable.
+BSD::Resource versions starting from 1.09 have a workaround for the problem.
+
+=head2 Net::SSLeay on Solaris
+
+Net::SSLeay requires a /dev/urandom to be present. This device is
+available from Solaris 9 onwards.  For earlier Solaris versions you
+can either get the package SUNWski (packaged with several Sun
+software products, for example the Sun WebServer, which is part of
+the Solaris Server Intranet Extension, or the Sun Directory Services,
+part of Solaris for ISPs) or download the ANDIrand package from
+L<http://www.cosy.sbg.ac.at/~andi/>. If you use SUNWski, make a
+symbolic link /dev/urandom pointing to /dev/random.  For more details,
+see Document ID27606 entitled "Differing /dev/random support requirements
+within Solaris[TM] Operating Environments", available at
+http://sunsolve.sun.com .
+
+It may be possible to use the Entropy Gathering Daemon (written in
+Perl!), available from L<http://www.lothar.com/tech/crypto/>.
+
+=head1 SunOS 4.x
+
+In SunOS 4.x you most probably want to use the SunOS ld, /usr/bin/ld,
+since the more recent versions of GNU ld (like 2.13) do not seem to
+work for building Perl anymore.  When linking the extensions, the
+GNU ld gets very unhappy and spews a lot of errors like this
+
+  ... relocation truncated to fit: BASE13 ...
+
+and dies.  Therefore the SunOS 4.1 hints file explicitly sets the
+ld to be /usr/bin/ld.
+
+As of Perl 5.8.1 the dynamic loading of libraries (DynaLoader, XSLoader)
+also seems to have become broken in in SunOS 4.x.  Therefore the default
+is to build Perl statically.
+
+Running the test suite in SunOS 4.1 is a bit tricky since the
+F<lib/Tie/File/t/09_gen_rs> test hangs (subtest #51, FWIW) for some
+unknown reason.  Just stop the test and kill that particular Perl
+process.
+
+There are various other failures, that as of SunOS 4.1.4 and gcc 3.2.2
+look a lot like gcc bugs.  Many of the failures happen in the Encode
+tests, where for example when the test expects "0" you get "&#48;"
+which should after a little squinting look very odd indeed.
+Another example is earlier in F<t/run/fresh_perl> where chr(0xff) is
+expected but the test fails because the result is chr(0xff).  Exactly.
+
+This is the "make test" result from the said combination:
+
+  Failed 27 test scripts out of 745, 96.38% okay.
+
+Running the C<harness> is painful because of the many failing
+Unicode-related tests will output megabytes of failure messages,
+but if one patiently waits, one gets these results:
+
+ Failed Test                     Stat Wstat Total Fail  Failed  List of Failed
+ -----------------------------------------------------------------------------
+ ...
+ ../ext/Encode/t/at-cn.t            4  1024    29    4  13.79%  14-17
+ ../ext/Encode/t/at-tw.t           10  2560    17   10  58.82%  2 4 6 8 10 12
+                                                                14-17
+ ../ext/Encode/t/enc_data.t        29  7424    ??   ??       %  ??
+ ../ext/Encode/t/enc_eucjp.t       29  7424    ??   ??       %  ??
+ ../ext/Encode/t/enc_module.t      29  7424    ??   ??       %  ??
+ ../ext/Encode/t/encoding.t        29  7424    ??   ??       %  ??
+ ../ext/Encode/t/grow.t            12  3072    24   12  50.00%  2 4 6 8 10 12 14
+                                                                16 18 20 22 24
+  Failed Test                     Stat Wstat Total Fail  Failed  List of Failed
+ ------------------------------------------------------------------------------
+ ../ext/Encode/t/guess.t          255 65280    29   40 137.93%  10-29
+ ../ext/Encode/t/jperl.t           29  7424    15   30 200.00%  1-15
+ ../ext/Encode/t/mime-header.t      2   512    10    2  20.00%  2-3
+ ../ext/Encode/t/perlio.t          22  5632    38   22  57.89%  1-4 9-16 19-20
+                                                                23-24 27-32
+ ../ext/List/Util/t/shuffle.t       0   139    ??   ??       %  ??
+ ../ext/PerlIO/t/encoding.t                    14    1   7.14%  11
+ ../ext/PerlIO/t/fallback.t                     9    2  22.22%  3 5
+ ../ext/Socket/t/socketpair.t       0     2    45   70 155.56%  11-45
+ ../lib/CPAN/t/vcmp.t                          30    1   3.33%  25
+ ../lib/Tie/File/t/09_gen_rs.t      0    15    ??   ??       %  ??
+ ../lib/Unicode/Collate/t/test.t              199   30  15.08%  7 26-27 71-75
+                                                                81-88 95 101
+                                                                103-104 106 108-
+                                                                109 122 124 161
+                                                                169-172
+ ../lib/sort.t                      0   139   119   26  21.85%  107-119
+ op/alarm.t                                     4    1  25.00%  4
+ op/utfhash.t                                  97    1   1.03%  31
+ run/fresh_perl.t                              91    1   1.10%  32
+ uni/tr_7jis.t                                 ??   ??       %  ??
+ uni/tr_eucjp.t                    29  7424     6   12 200.00%  1-6
+ uni/tr_sjis.t                     29  7424     6   12 200.00%  1-6
+ 56 tests and 467 subtests skipped.
+ Failed 27/811 test scripts, 96.67% okay. 1383/75399 subtests failed, 98.17% okay.
+
+The alarm() test failure is caused by system() apparently blocking
+alarm().  That is probably a libc bug, and given that SunOS 4.x
+has been end-of-lifed years ago, don't hold your breath for a fix.
+In addition to that, don't try anything too Unicode-y, especially
+with Encode, and you should be fine in SunOS 4.x.
+
+=head1 AUTHOR
+
+The original was written by Andy Dougherty F<doughera@lafayette.edu>
+drawing heavily on advice from Alan Burlison, Nick Ing-Simmons, Tim Bunce,
+and many other Solaris users over the years.
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlstyle.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlstyle.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlstyle.pod	(revision 14489)
@@ -0,0 +1,303 @@
+=head1 NAME
+
+perlstyle - Perl style guide
+
+=head1 DESCRIPTION
+
+Each programmer will, of course, have his or her own preferences in
+regards to formatting, but there are some general guidelines that will
+make your programs easier to read, understand, and maintain.
+
+The most important thing is to run your programs under the B<-w>
+flag at all times.  You may turn it off explicitly for particular
+portions of code via the C<no warnings> pragma or the C<$^W> variable
+if you must.  You should also always run under C<use strict> or know the
+reason why not.  The C<use sigtrap> and even C<use diagnostics> pragmas
+may also prove useful.
+
+Regarding aesthetics of code lay out, about the only thing Larry
+cares strongly about is that the closing curly bracket of
+a multi-line BLOCK should line up with the keyword that started the construct.
+Beyond that, he has other preferences that aren't so strong:
+
+=over 4
+
+=item *
+
+4-column indent.
+
+=item *
+
+Opening curly on same line as keyword, if possible, otherwise line up.
+
+=item *
+
+Space before the opening curly of a multi-line BLOCK.
+
+=item *
+
+One-line BLOCK may be put on one line, including curlies.
+
+=item *
+
+No space before the semicolon.
+
+=item *
+
+Semicolon omitted in "short" one-line BLOCK.
+
+=item *
+
+Space around most operators.
+
+=item *
+
+Space around a "complex" subscript (inside brackets).
+
+=item *
+
+Blank lines between chunks that do different things.
+
+=item *
+
+Uncuddled elses.
+
+=item *
+
+No space between function name and its opening parenthesis.
+
+=item *
+
+Space after each comma.
+
+=item *
+
+Long lines broken after an operator (except C<and> and C<or>).
+
+=item *
+
+Space after last parenthesis matching on current line.
+
+=item *
+
+Line up corresponding items vertically.
+
+=item *
+
+Omit redundant punctuation as long as clarity doesn't suffer.
+
+=back
+
+Larry has his reasons for each of these things, but he doesn't claim that
+everyone else's mind works the same as his does.
+
+Here are some other more substantive style issues to think about:
+
+=over 4
+
+=item *
+
+Just because you I<CAN> do something a particular way doesn't mean that
+you I<SHOULD> do it that way.  Perl is designed to give you several
+ways to do anything, so consider picking the most readable one.  For
+instance
+
+    open(FOO,$foo) || die "Can't open $foo: $!";
+
+is better than
+
+    die "Can't open $foo: $!" unless open(FOO,$foo);
+
+because the second way hides the main point of the statement in a
+modifier.  On the other hand
+
+    print "Starting analysis\n" if $verbose;
+
+is better than
+
+    $verbose && print "Starting analysis\n";
+
+because the main point isn't whether the user typed B<-v> or not.
+
+Similarly, just because an operator lets you assume default arguments
+doesn't mean that you have to make use of the defaults.  The defaults
+are there for lazy systems programmers writing one-shot programs.  If
+you want your program to be readable, consider supplying the argument.
+
+Along the same lines, just because you I<CAN> omit parentheses in many
+places doesn't mean that you ought to:
+
+    return print reverse sort num values %array;
+    return print(reverse(sort num (values(%array))));
+
+When in doubt, parenthesize.  At the very least it will let some poor
+schmuck bounce on the % key in B<vi>.
+
+Even if you aren't in doubt, consider the mental welfare of the person
+who has to maintain the code after you, and who will probably put
+parentheses in the wrong place.
+
+=item *
+
+Don't go through silly contortions to exit a loop at the top or the
+bottom, when Perl provides the C<last> operator so you can exit in
+the middle.  Just "outdent" it a little to make it more visible:
+
+    LINE:
+	for (;;) {
+	    statements;
+	  last LINE if $foo;
+	    next LINE if /^#/;
+	    statements;
+	}
+
+=item *
+
+Don't be afraid to use loop labels--they're there to enhance
+readability as well as to allow multilevel loop breaks.  See the
+previous example.
+
+=item *
+
+Avoid using C<grep()> (or C<map()>) or `backticks` in a void context, that is,
+when you just throw away their return values.  Those functions all
+have return values, so use them.  Otherwise use a C<foreach()> loop or
+the C<system()> function instead.
+
+=item *
+
+For portability, when using features that may not be implemented on
+every machine, test the construct in an eval to see if it fails.  If
+you know what version or patchlevel a particular feature was
+implemented, you can test C<$]> (C<$PERL_VERSION> in C<English>) to see if it
+will be there.  The C<Config> module will also let you interrogate values
+determined by the B<Configure> program when Perl was installed.
+
+=item *
+
+Choose mnemonic identifiers.  If you can't remember what mnemonic means,
+you've got a problem.
+
+=item *
+
+While short identifiers like C<$gotit> are probably ok, use underscores to
+separate words in longer identifiers.  It is generally easier to read
+C<$var_names_like_this> than C<$VarNamesLikeThis>, especially for
+non-native speakers of English. It's also a simple rule that works
+consistently with C<VAR_NAMES_LIKE_THIS>.
+
+Package names are sometimes an exception to this rule.  Perl informally
+reserves lowercase module names for "pragma" modules like C<integer> and
+C<strict>.  Other modules should begin with a capital letter and use mixed
+case, but probably without underscores due to limitations in primitive
+file systems' representations of module names as files that must fit into a
+few sparse bytes.
+
+=item *
+
+You may find it helpful to use letter case to indicate the scope
+or nature of a variable. For example:
+
+    $ALL_CAPS_HERE   constants only (beware clashes with perl vars!)
+    $Some_Caps_Here  package-wide global/static
+    $no_caps_here    function scope my() or local() variables
+
+Function and method names seem to work best as all lowercase.
+E.g., C<$obj-E<gt>as_string()>.
+
+You can use a leading underscore to indicate that a variable or
+function should not be used outside the package that defined it.
+
+=item *
+
+If you have a really hairy regular expression, use the C</x> modifier and
+put in some whitespace to make it look a little less like line noise.
+Don't use slash as a delimiter when your regexp has slashes or backslashes.
+
+=item *
+
+Use the new C<and> and C<or> operators to avoid having to parenthesize
+list operators so much, and to reduce the incidence of punctuation
+operators like C<&&> and C<||>.  Call your subroutines as if they were
+functions or list operators to avoid excessive ampersands and parentheses.
+
+=item *
+
+Use here documents instead of repeated C<print()> statements.
+
+=item *
+
+Line up corresponding things vertically, especially if it'd be too long
+to fit on one line anyway.
+
+    $IDX = $ST_MTIME;
+    $IDX = $ST_ATIME 	   if $opt_u;
+    $IDX = $ST_CTIME 	   if $opt_c;
+    $IDX = $ST_SIZE  	   if $opt_s;
+
+    mkdir $tmpdir, 0700	or die "can't mkdir $tmpdir: $!";
+    chdir($tmpdir)      or die "can't chdir $tmpdir: $!";
+    mkdir 'tmp',   0777	or die "can't mkdir $tmpdir/tmp: $!";
+
+=item *
+
+Always check the return codes of system calls.  Good error messages should
+go to C<STDERR>, include which program caused the problem, what the failed
+system call and arguments were, and (VERY IMPORTANT) should contain the
+standard system error message for what went wrong.  Here's a simple but
+sufficient example:
+
+    opendir(D, $dir)	 or die "can't opendir $dir: $!";
+
+=item *
+
+Line up your transliterations when it makes sense:
+
+    tr [abc]
+       [xyz];
+
+=item *
+
+Think about reusability.  Why waste brainpower on a one-shot when you
+might want to do something like it again?  Consider generalizing your
+code.  Consider writing a module or object class.  Consider making your
+code run cleanly with C<use strict> and C<use warnings> (or B<-w>) in
+effect.  Consider giving away your code.  Consider changing your whole
+world view.  Consider... oh, never mind.
+
+=item *
+
+Try to document your code and use Pod formatting in a consistent way. Here
+are commonly expected conventions:
+
+=over 4
+
+=item *
+
+use C<CE<lt>E<gt>> for function, variable and module names (and more
+generally anything that can be considered part of code, like filehandles
+or specific values). Note that function names are considered more readable
+with parentheses after their name, that is C<function()>.
+
+=item *
+
+use C<BE<lt>E<gt>> for commands names like B<cat> or B<grep>.
+
+=item *
+
+use C<FE<lt>E<gt>> or C<CE<lt>E<gt>> for file names. C<FE<lt>E<gt>> should
+be the only Pod code for file names, but as most Pod formatters render it
+as italic, Unix and Windows paths with their slashes and backslashes may
+be less readable, and better rendered with C<CE<lt>E<gt>>.
+
+=back
+
+=item *
+
+Be consistent.
+
+=item *
+
+Be nice.
+
+=back
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsub.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsub.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsub.pod	(revision 14489)
@@ -0,0 +1,1429 @@
+=head1 NAME
+X<subroutine> X<function>
+
+perlsub - Perl subroutines
+
+=head1 SYNOPSIS
+
+To declare subroutines:
+X<subroutine, declaration> X<sub>
+
+    sub NAME;			  # A "forward" declaration.
+    sub NAME(PROTO);		  #  ditto, but with prototypes
+    sub NAME : ATTRS;		  #  with attributes
+    sub NAME(PROTO) : ATTRS;	  #  with attributes and prototypes
+
+    sub NAME BLOCK		  # A declaration and a definition.
+    sub NAME(PROTO) BLOCK	  #  ditto, but with prototypes
+    sub NAME : ATTRS BLOCK	  #  with attributes
+    sub NAME(PROTO) : ATTRS BLOCK #  with prototypes and attributes
+
+To define an anonymous subroutine at runtime:
+X<subroutine, anonymous>
+
+    $subref = sub BLOCK;		 # no proto
+    $subref = sub (PROTO) BLOCK;	 # with proto
+    $subref = sub : ATTRS BLOCK;	 # with attributes
+    $subref = sub (PROTO) : ATTRS BLOCK; # with proto and attributes
+
+To import subroutines:
+X<import>
+
+    use MODULE qw(NAME1 NAME2 NAME3);
+
+To call subroutines:
+X<subroutine, call> X<call>
+
+    NAME(LIST);	   # & is optional with parentheses.
+    NAME LIST;	   # Parentheses optional if predeclared/imported.
+    &NAME(LIST);   # Circumvent prototypes.
+    &NAME;	   # Makes current @_ visible to called subroutine.
+
+=head1 DESCRIPTION
+
+Like many languages, Perl provides for user-defined subroutines.
+These may be located anywhere in the main program, loaded in from
+other files via the C<do>, C<require>, or C<use> keywords, or
+generated on the fly using C<eval> or anonymous subroutines.
+You can even call a function indirectly using a variable containing
+its name or a CODE reference.
+
+The Perl model for function call and return values is simple: all
+functions are passed as parameters one single flat list of scalars, and
+all functions likewise return to their caller one single flat list of
+scalars.  Any arrays or hashes in these call and return lists will
+collapse, losing their identities--but you may always use
+pass-by-reference instead to avoid this.  Both call and return lists may
+contain as many or as few scalar elements as you'd like.  (Often a
+function without an explicit return statement is called a subroutine, but
+there's really no difference from Perl's perspective.)
+X<subroutine, parameter> X<parameter>
+
+Any arguments passed in show up in the array C<@_>.  Therefore, if
+you called a function with two arguments, those would be stored in
+C<$_[0]> and C<$_[1]>.  The array C<@_> is a local array, but its
+elements are aliases for the actual scalar parameters.  In particular,
+if an element C<$_[0]> is updated, the corresponding argument is
+updated (or an error occurs if it is not updatable).  If an argument
+is an array or hash element which did not exist when the function
+was called, that element is created only when (and if) it is modified
+or a reference to it is taken.  (Some earlier versions of Perl
+created the element whether or not the element was assigned to.)
+Assigning to the whole array C<@_> removes that aliasing, and does
+not update any arguments.
+X<subroutine, argument> X<argument> X<@_>
+
+A C<return> statement may be used to exit a subroutine, optionally
+specifying the returned value, which will be evaluated in the
+appropriate context (list, scalar, or void) depending on the context of
+the subroutine call.  If you specify no return value, the subroutine
+returns an empty list in list context, the undefined value in scalar
+context, or nothing in void context.  If you return one or more
+aggregates (arrays and hashes), these will be flattened together into
+one large indistinguishable list.
+
+If no C<return> is found and if the last statement is an expression, its
+value is returned. If the last statement is a loop control structure
+like a C<foreach> or a C<while>, the returned value is unspecified. The
+empty sub returns the empty list.
+X<subroutine, return value> X<return value> X<return>
+
+Perl does not have named formal parameters.  In practice all you
+do is assign to a C<my()> list of these.  Variables that aren't
+declared to be private are global variables.  For gory details
+on creating private variables, see L<"Private Variables via my()">
+and L<"Temporary Values via local()">.  To create protected
+environments for a set of functions in a separate package (and
+probably a separate file), see L<perlmod/"Packages">.
+X<formal parameter> X<parameter, formal>
+
+Example:
+
+    sub max {
+	my $max = shift(@_);
+	foreach $foo (@_) {
+	    $max = $foo if $max < $foo;
+	}
+	return $max;
+    }
+    $bestday = max($mon,$tue,$wed,$thu,$fri);
+
+Example:
+
+    # get a line, combining continuation lines
+    #  that start with whitespace
+
+    sub get_line {
+	$thisline = $lookahead;  # global variables!
+	LINE: while (defined($lookahead = <STDIN>)) {
+	    if ($lookahead =~ /^[ \t]/) {
+		$thisline .= $lookahead;
+	    }
+	    else {
+		last LINE;
+	    }
+	}
+	return $thisline;
+    }
+
+    $lookahead = <STDIN>;	# get first line
+    while (defined($line = get_line())) {
+	...
+    }
+
+Assigning to a list of private variables to name your arguments:
+
+    sub maybeset {
+	my($key, $value) = @_;
+	$Foo{$key} = $value unless $Foo{$key};
+    }
+
+Because the assignment copies the values, this also has the effect
+of turning call-by-reference into call-by-value.  Otherwise a
+function is free to do in-place modifications of C<@_> and change
+its caller's values.
+X<call-by-reference> X<call-by-value>
+
+    upcase_in($v1, $v2);  # this changes $v1 and $v2
+    sub upcase_in {
+	for (@_) { tr/a-z/A-Z/ }
+    }
+
+You aren't allowed to modify constants in this way, of course.  If an
+argument were actually literal and you tried to change it, you'd take a
+(presumably fatal) exception.   For example, this won't work:
+X<call-by-reference> X<call-by-value>
+
+    upcase_in("frederick");
+
+It would be much safer if the C<upcase_in()> function
+were written to return a copy of its parameters instead
+of changing them in place:
+
+    ($v3, $v4) = upcase($v1, $v2);  # this doesn't change $v1 and $v2
+    sub upcase {
+	return unless defined wantarray;  # void context, do nothing
+	my @parms = @_;
+	for (@parms) { tr/a-z/A-Z/ }
+  	return wantarray ? @parms : $parms[0];
+    }
+
+Notice how this (unprototyped) function doesn't care whether it was
+passed real scalars or arrays.  Perl sees all arguments as one big,
+long, flat parameter list in C<@_>.  This is one area where
+Perl's simple argument-passing style shines.  The C<upcase()>
+function would work perfectly well without changing the C<upcase()>
+definition even if we fed it things like this:
+
+    @newlist   = upcase(@list1, @list2);
+    @newlist   = upcase( split /:/, $var );
+
+Do not, however, be tempted to do this:
+
+    (@a, @b)   = upcase(@list1, @list2);
+
+Like the flattened incoming parameter list, the return list is also
+flattened on return.  So all you have managed to do here is stored
+everything in C<@a> and made C<@b> empty.  See 
+L<Pass by Reference> for alternatives.
+
+A subroutine may be called using an explicit C<&> prefix.  The
+C<&> is optional in modern Perl, as are parentheses if the
+subroutine has been predeclared.  The C<&> is I<not> optional
+when just naming the subroutine, such as when it's used as
+an argument to defined() or undef().  Nor is it optional when you
+want to do an indirect subroutine call with a subroutine name or
+reference using the C<&$subref()> or C<&{$subref}()> constructs,
+although the C<< $subref->() >> notation solves that problem.
+See L<perlref> for more about all that.
+X<&>
+
+Subroutines may be called recursively.  If a subroutine is called
+using the C<&> form, the argument list is optional, and if omitted,
+no C<@_> array is set up for the subroutine: the C<@_> array at the
+time of the call is visible to subroutine instead.  This is an
+efficiency mechanism that new users may wish to avoid.
+X<recursion>
+
+    &foo(1,2,3);	# pass three arguments
+    foo(1,2,3);		# the same
+
+    foo();		# pass a null list
+    &foo();		# the same
+
+    &foo;		# foo() get current args, like foo(@_) !!
+    foo;		# like foo() IFF sub foo predeclared, else "foo"
+
+Not only does the C<&> form make the argument list optional, it also
+disables any prototype checking on arguments you do provide.  This
+is partly for historical reasons, and partly for having a convenient way
+to cheat if you know what you're doing.  See L<Prototypes> below.
+X<&>
+
+Subroutines whose names are in all upper case are reserved to the Perl
+core, as are modules whose names are in all lower case.  A subroutine in
+all capitals is a loosely-held convention meaning it will be called
+indirectly by the run-time system itself, usually due to a triggered event.
+Subroutines that do special, pre-defined things include C<AUTOLOAD>, C<CLONE>,
+C<DESTROY> plus all functions mentioned in L<perltie> and L<PerlIO::via>.
+
+The C<BEGIN>, C<CHECK>, C<INIT> and C<END> subroutines are not so much
+subroutines as named special code blocks, of which you can have more
+than one in a package, and which you can B<not> call explicitly.  See
+L<perlmod/"BEGIN, CHECK, INIT and END">
+
+=head2 Private Variables via my()
+X<my> X<variable, lexical> X<lexical> X<lexical variable> X<scope, lexical>
+X<lexical scope> X<attributes, my>
+
+Synopsis:
+
+    my $foo;	    	# declare $foo lexically local
+    my (@wid, %get); 	# declare list of variables local
+    my $foo = "flurp";	# declare $foo lexical, and init it
+    my @oof = @bar;	# declare @oof lexical, and init it
+    my $x : Foo = $y;	# similar, with an attribute applied
+
+B<WARNING>: The use of attribute lists on C<my> declarations is still
+evolving.  The current semantics and interface are subject to change.
+See L<attributes> and L<Attribute::Handlers>.
+
+The C<my> operator declares the listed variables to be lexically
+confined to the enclosing block, conditional (C<if/unless/elsif/else>),
+loop (C<for/foreach/while/until/continue>), subroutine, C<eval>,
+or C<do/require/use>'d file.  If more than one value is listed, the
+list must be placed in parentheses.  All listed elements must be
+legal lvalues.  Only alphanumeric identifiers may be lexically
+scoped--magical built-ins like C<$/> must currently be C<local>ized
+with C<local> instead.
+
+Unlike dynamic variables created by the C<local> operator, lexical
+variables declared with C<my> are totally hidden from the outside
+world, including any called subroutines.  This is true if it's the
+same subroutine called from itself or elsewhere--every call gets
+its own copy.
+X<local>
+
+This doesn't mean that a C<my> variable declared in a statically
+enclosing lexical scope would be invisible.  Only dynamic scopes
+are cut off.   For example, the C<bumpx()> function below has access
+to the lexical $x variable because both the C<my> and the C<sub>
+occurred at the same scope, presumably file scope.
+
+    my $x = 10;
+    sub bumpx { $x++ } 
+
+An C<eval()>, however, can see lexical variables of the scope it is
+being evaluated in, so long as the names aren't hidden by declarations within
+the C<eval()> itself.  See L<perlref>.
+X<eval, scope of>
+
+The parameter list to my() may be assigned to if desired, which allows you
+to initialize your variables.  (If no initializer is given for a
+particular variable, it is created with the undefined value.)  Commonly
+this is used to name input parameters to a subroutine.  Examples:
+
+    $arg = "fred";	  # "global" variable
+    $n = cube_root(27);
+    print "$arg thinks the root is $n\n";
+ fred thinks the root is 3
+
+    sub cube_root {
+	my $arg = shift;  # name doesn't matter
+	$arg **= 1/3;
+	return $arg;
+    }
+
+The C<my> is simply a modifier on something you might assign to.  So when
+you do assign to variables in its argument list, C<my> doesn't
+change whether those variables are viewed as a scalar or an array.  So
+
+    my ($foo) = <STDIN>;		# WRONG?
+    my @FOO = <STDIN>;
+
+both supply a list context to the right-hand side, while
+
+    my $foo = <STDIN>;
+
+supplies a scalar context.  But the following declares only one variable:
+
+    my $foo, $bar = 1;			# WRONG
+
+That has the same effect as
+
+    my $foo;
+    $bar = 1;
+
+The declared variable is not introduced (is not visible) until after
+the current statement.  Thus,
+
+    my $x = $x;
+
+can be used to initialize a new $x with the value of the old $x, and
+the expression
+
+    my $x = 123 and $x == 123
+
+is false unless the old $x happened to have the value C<123>.
+
+Lexical scopes of control structures are not bounded precisely by the
+braces that delimit their controlled blocks; control expressions are
+part of that scope, too.  Thus in the loop
+
+    while (my $line = <>) {
+        $line = lc $line;
+    } continue {
+        print $line;
+    }
+
+the scope of $line extends from its declaration throughout the rest of
+the loop construct (including the C<continue> clause), but not beyond
+it.  Similarly, in the conditional
+
+    if ((my $answer = <STDIN>) =~ /^yes$/i) {
+        user_agrees();
+    } elsif ($answer =~ /^no$/i) {
+        user_disagrees();
+    } else {
+	chomp $answer;
+        die "'$answer' is neither 'yes' nor 'no'";
+    }
+
+the scope of $answer extends from its declaration through the rest
+of that conditional, including any C<elsif> and C<else> clauses, 
+but not beyond it.  See L<perlsyn/"Simple statements"> for information
+on the scope of variables in statements with modifiers.
+
+The C<foreach> loop defaults to scoping its index variable dynamically
+in the manner of C<local>.  However, if the index variable is
+prefixed with the keyword C<my>, or if there is already a lexical
+by that name in scope, then a new lexical is created instead.  Thus
+in the loop
+X<foreach> X<for>
+
+    for my $i (1, 2, 3) {
+        some_function();
+    }
+
+the scope of $i extends to the end of the loop, but not beyond it,
+rendering the value of $i inaccessible within C<some_function()>.
+X<foreach> X<for>
+
+Some users may wish to encourage the use of lexically scoped variables.
+As an aid to catching implicit uses to package variables,
+which are always global, if you say
+
+    use strict 'vars';
+
+then any variable mentioned from there to the end of the enclosing
+block must either refer to a lexical variable, be predeclared via
+C<our> or C<use vars>, or else must be fully qualified with the package name.
+A compilation error results otherwise.  An inner block may countermand
+this with C<no strict 'vars'>.
+
+A C<my> has both a compile-time and a run-time effect.  At compile
+time, the compiler takes notice of it.  The principal usefulness
+of this is to quiet C<use strict 'vars'>, but it is also essential
+for generation of closures as detailed in L<perlref>.  Actual
+initialization is delayed until run time, though, so it gets executed
+at the appropriate time, such as each time through a loop, for
+example.
+
+Variables declared with C<my> are not part of any package and are therefore
+never fully qualified with the package name.  In particular, you're not
+allowed to try to make a package variable (or other global) lexical:
+
+    my $pack::var;	# ERROR!  Illegal syntax
+    my $_;		# also illegal (currently)
+
+In fact, a dynamic variable (also known as package or global variables)
+are still accessible using the fully qualified C<::> notation even while a
+lexical of the same name is also visible:
+
+    package main;
+    local $x = 10;
+    my    $x = 20;
+    print "$x and $::x\n";
+
+That will print out C<20> and C<10>.
+
+You may declare C<my> variables at the outermost scope of a file
+to hide any such identifiers from the world outside that file.  This
+is similar in spirit to C's static variables when they are used at
+the file level.  To do this with a subroutine requires the use of
+a closure (an anonymous function that accesses enclosing lexicals).
+If you want to create a private subroutine that cannot be called
+from outside that block, it can declare a lexical variable containing
+an anonymous sub reference:
+
+    my $secret_version = '1.001-beta';
+    my $secret_sub = sub { print $secret_version };
+    &$secret_sub();
+
+As long as the reference is never returned by any function within the
+module, no outside module can see the subroutine, because its name is not in
+any package's symbol table.  Remember that it's not I<REALLY> called
+C<$some_pack::secret_version> or anything; it's just $secret_version,
+unqualified and unqualifiable.
+
+This does not work with object methods, however; all object methods
+have to be in the symbol table of some package to be found.  See
+L<perlref/"Function Templates"> for something of a work-around to
+this.
+
+=head2 Persistent Private Variables
+X<static> X<variable, persistent> X<variable, static> X<closure>
+
+Just because a lexical variable is lexically (also called statically)
+scoped to its enclosing block, C<eval>, or C<do> FILE, this doesn't mean that
+within a function it works like a C static.  It normally works more
+like a C auto, but with implicit garbage collection.  
+
+Unlike local variables in C or C++, Perl's lexical variables don't
+necessarily get recycled just because their scope has exited.
+If something more permanent is still aware of the lexical, it will
+stick around.  So long as something else references a lexical, that
+lexical won't be freed--which is as it should be.  You wouldn't want
+memory being free until you were done using it, or kept around once you
+were done.  Automatic garbage collection takes care of this for you.
+
+This means that you can pass back or save away references to lexical
+variables, whereas to return a pointer to a C auto is a grave error.
+It also gives us a way to simulate C's function statics.  Here's a
+mechanism for giving a function private variables with both lexical
+scoping and a static lifetime.  If you do want to create something like
+C's static variables, just enclose the whole function in an extra block,
+and put the static variable outside the function but in the block.
+
+    {
+	my $secret_val = 0;
+	sub gimme_another {
+	    return ++$secret_val;
+	}
+    }
+    # $secret_val now becomes unreachable by the outside
+    # world, but retains its value between calls to gimme_another
+
+If this function is being sourced in from a separate file
+via C<require> or C<use>, then this is probably just fine.  If it's
+all in the main program, you'll need to arrange for the C<my>
+to be executed early, either by putting the whole block above
+your main program, or more likely, placing merely a C<BEGIN>
+code block around it to make sure it gets executed before your program
+starts to run:
+
+    BEGIN {
+	my $secret_val = 0;
+	sub gimme_another {
+	    return ++$secret_val;
+	}
+    }
+
+See L<perlmod/"BEGIN, CHECK, INIT and END"> about the
+special triggered code blocks, C<BEGIN>, C<CHECK>, C<INIT> and C<END>.
+
+If declared at the outermost scope (the file scope), then lexicals
+work somewhat like C's file statics.  They are available to all
+functions in that same file declared below them, but are inaccessible
+from outside that file.  This strategy is sometimes used in modules
+to create private variables that the whole module can see.
+
+=head2 Temporary Values via local()
+X<local> X<scope, dynamic> X<dynamic scope> X<variable, local>
+X<variable, temporary>
+
+B<WARNING>: In general, you should be using C<my> instead of C<local>, because
+it's faster and safer.  Exceptions to this include the global punctuation
+variables, global filehandles and formats, and direct manipulation of the
+Perl symbol table itself.  C<local> is mostly used when the current value
+of a variable must be visible to called subroutines.
+
+Synopsis:
+
+    # localization of values
+
+    local $foo;			# make $foo dynamically local
+    local (@wid, %get);		# make list of variables local
+    local $foo = "flurp";	# make $foo dynamic, and init it
+    local @oof = @bar;		# make @oof dynamic, and init it
+
+    local $hash{key} = "val";	# sets a local value for this hash entry
+    local ($cond ? $v1 : $v2);	# several types of lvalues support
+				# localization
+
+    # localization of symbols
+
+    local *FH;			# localize $FH, @FH, %FH, &FH  ...
+    local *merlyn = *randal;	# now $merlyn is really $randal, plus
+                                #     @merlyn is really @randal, etc
+    local *merlyn = 'randal';	# SAME THING: promote 'randal' to *randal
+    local *merlyn = \$randal;   # just alias $merlyn, not @merlyn etc
+
+A C<local> modifies its listed variables to be "local" to the
+enclosing block, C<eval>, or C<do FILE>--and to I<any subroutine
+called from within that block>.  A C<local> just gives temporary
+values to global (meaning package) variables.  It does I<not> create
+a local variable.  This is known as dynamic scoping.  Lexical scoping
+is done with C<my>, which works more like C's auto declarations.
+
+Some types of lvalues can be localized as well : hash and array elements
+and slices, conditionals (provided that their result is always
+localizable), and symbolic references.  As for simple variables, this
+creates new, dynamically scoped values.
+
+If more than one variable or expression is given to C<local>, they must be
+placed in parentheses.  This operator works
+by saving the current values of those variables in its argument list on a
+hidden stack and restoring them upon exiting the block, subroutine, or
+eval.  This means that called subroutines can also reference the local
+variable, but not the global one.  The argument list may be assigned to if
+desired, which allows you to initialize your local variables.  (If no
+initializer is given for a particular variable, it is created with an
+undefined value.)
+
+Because C<local> is a run-time operator, it gets executed each time
+through a loop.  Consequently, it's more efficient to localize your
+variables outside the loop.
+
+=head3 Grammatical note on local()
+X<local, context>
+
+A C<local> is simply a modifier on an lvalue expression.  When you assign to
+a C<local>ized variable, the C<local> doesn't change whether its list is viewed
+as a scalar or an array.  So
+
+    local($foo) = <STDIN>;
+    local @FOO = <STDIN>;
+
+both supply a list context to the right-hand side, while
+
+    local $foo = <STDIN>;
+
+supplies a scalar context.
+
+=head3 Localization of special variables
+X<local, special variable>
+
+If you localize a special variable, you'll be giving a new value to it,
+but its magic won't go away.  That means that all side-effects related
+to this magic still work with the localized value.
+
+This feature allows code like this to work :
+
+    # Read the whole contents of FILE in $slurp
+    { local $/ = undef; $slurp = <FILE>; }
+
+Note, however, that this restricts localization of some values ; for
+example, the following statement dies, as of perl 5.9.0, with an error
+I<Modification of a read-only value attempted>, because the $1 variable is
+magical and read-only :
+
+    local $1 = 2;
+
+Similarly, but in a way more difficult to spot, the following snippet will
+die in perl 5.9.0 :
+
+    sub f { local $_ = "foo"; print }
+    for ($1) {
+	# now $_ is aliased to $1, thus is magic and readonly
+	f();
+    }
+
+See next section for an alternative to this situation.
+
+B<WARNING>: Localization of tied arrays and hashes does not currently
+work as described.
+This will be fixed in a future release of Perl; in the meantime, avoid
+code that relies on any particular behaviour of localising tied arrays
+or hashes (localising individual elements is still okay).
+See L<perl58delta/"Localising Tied Arrays and Hashes Is Broken"> for more
+details.
+X<local, tie>
+
+=head3 Localization of globs
+X<local, glob> X<glob>
+
+The construct
+
+    local *name;
+
+creates a whole new symbol table entry for the glob C<name> in the
+current package.  That means that all variables in its glob slot ($name,
+@name, %name, &name, and the C<name> filehandle) are dynamically reset.
+
+This implies, among other things, that any magic eventually carried by
+those variables is locally lost.  In other words, saying C<local */>
+will not have any effect on the internal value of the input record
+separator.
+
+Notably, if you want to work with a brand new value of the default scalar
+$_, and avoid the potential problem listed above about $_ previously
+carrying a magic value, you should use C<local *_> instead of C<local $_>.
+
+=head3 Localization of elements of composite types
+X<local, composite type element> X<local, array element> X<local, hash element>
+
+It's also worth taking a moment to explain what happens when you
+C<local>ize a member of a composite type (i.e. an array or hash element).
+In this case, the element is C<local>ized I<by name>. This means that
+when the scope of the C<local()> ends, the saved value will be
+restored to the hash element whose key was named in the C<local()>, or
+the array element whose index was named in the C<local()>.  If that
+element was deleted while the C<local()> was in effect (e.g. by a
+C<delete()> from a hash or a C<shift()> of an array), it will spring
+back into existence, possibly extending an array and filling in the
+skipped elements with C<undef>.  For instance, if you say
+
+    %hash = ( 'This' => 'is', 'a' => 'test' );
+    @ary  = ( 0..5 );
+    {
+         local($ary[5]) = 6;
+         local($hash{'a'}) = 'drill';
+         while (my $e = pop(@ary)) {
+             print "$e . . .\n";
+             last unless $e > 3;
+         }
+         if (@ary) {
+             $hash{'only a'} = 'test';
+             delete $hash{'a'};
+         }
+    }
+    print join(' ', map { "$_ $hash{$_}" } sort keys %hash),".\n";
+    print "The array has ",scalar(@ary)," elements: ",
+          join(', ', map { defined $_ ? $_ : 'undef' } @ary),"\n";
+
+Perl will print
+
+    6 . . .
+    4 . . .
+    3 . . .
+    This is a test only a test.
+    The array has 6 elements: 0, 1, 2, undef, undef, 5
+
+The behavior of local() on non-existent members of composite
+types is subject to change in future.
+
+=head2 Lvalue subroutines
+X<lvalue> X<subroutine, lvalue>
+
+B<WARNING>: Lvalue subroutines are still experimental and the
+implementation may change in future versions of Perl.
+
+It is possible to return a modifiable value from a subroutine.
+To do this, you have to declare the subroutine to return an lvalue.
+
+    my $val;
+    sub canmod : lvalue {
+	# return $val; this doesn't work, don't say "return"
+	$val;
+    }
+    sub nomod {
+	$val;
+    }
+
+    canmod() = 5;   # assigns to $val
+    nomod()  = 5;   # ERROR
+
+The scalar/list context for the subroutine and for the right-hand
+side of assignment is determined as if the subroutine call is replaced
+by a scalar. For example, consider:
+
+    data(2,3) = get_data(3,4);
+
+Both subroutines here are called in a scalar context, while in:
+
+    (data(2,3)) = get_data(3,4);
+
+and in:
+
+    (data(2),data(3)) = get_data(3,4);
+
+all the subroutines are called in a list context.
+
+=over 4
+
+=item Lvalue subroutines are EXPERIMENTAL
+
+They appear to be convenient, but there are several reasons to be
+circumspect.
+
+You can't use the return keyword, you must pass out the value before
+falling out of subroutine scope. (see comment in example above).  This
+is usually not a problem, but it disallows an explicit return out of a
+deeply nested loop, which is sometimes a nice way out.
+
+They violate encapsulation.  A normal mutator can check the supplied
+argument before setting the attribute it is protecting, an lvalue
+subroutine never gets that chance.  Consider;
+
+    my $some_array_ref = [];	# protected by mutators ??
+
+    sub set_arr { 		# normal mutator
+	my $val = shift;
+	die("expected array, you supplied ", ref $val)
+	   unless ref $val eq 'ARRAY';
+	$some_array_ref = $val;
+    }
+    sub set_arr_lv : lvalue {	# lvalue mutator
+	$some_array_ref;
+    }
+
+    # set_arr_lv cannot stop this !
+    set_arr_lv() = { a => 1 };
+
+=back
+
+=head2 Passing Symbol Table Entries (typeglobs)
+X<typeglob> X<*>
+
+B<WARNING>: The mechanism described in this section was originally
+the only way to simulate pass-by-reference in older versions of
+Perl.  While it still works fine in modern versions, the new reference
+mechanism is generally easier to work with.  See below.
+
+Sometimes you don't want to pass the value of an array to a subroutine
+but rather the name of it, so that the subroutine can modify the global
+copy of it rather than working with a local copy.  In perl you can
+refer to all objects of a particular name by prefixing the name
+with a star: C<*foo>.  This is often known as a "typeglob", because the
+star on the front can be thought of as a wildcard match for all the
+funny prefix characters on variables and subroutines and such.
+
+When evaluated, the typeglob produces a scalar value that represents
+all the objects of that name, including any filehandle, format, or
+subroutine.  When assigned to, it causes the name mentioned to refer to
+whatever C<*> value was assigned to it.  Example:
+
+    sub doubleary {
+	local(*someary) = @_;
+	foreach $elem (@someary) {
+	    $elem *= 2;
+	}
+    }
+    doubleary(*foo);
+    doubleary(*bar);
+
+Scalars are already passed by reference, so you can modify
+scalar arguments without using this mechanism by referring explicitly
+to C<$_[0]> etc.  You can modify all the elements of an array by passing
+all the elements as scalars, but you have to use the C<*> mechanism (or
+the equivalent reference mechanism) to C<push>, C<pop>, or change the size of
+an array.  It will certainly be faster to pass the typeglob (or reference).
+
+Even if you don't want to modify an array, this mechanism is useful for
+passing multiple arrays in a single LIST, because normally the LIST
+mechanism will merge all the array values so that you can't extract out
+the individual arrays.  For more on typeglobs, see
+L<perldata/"Typeglobs and Filehandles">.
+
+=head2 When to Still Use local()
+X<local> X<variable, local>
+
+Despite the existence of C<my>, there are still three places where the
+C<local> operator still shines.  In fact, in these three places, you
+I<must> use C<local> instead of C<my>.
+
+=over 4
+
+=item 1.
+
+You need to give a global variable a temporary value, especially $_.
+
+The global variables, like C<@ARGV> or the punctuation variables, must be 
+C<local>ized with C<local()>.  This block reads in F</etc/motd>, and splits
+it up into chunks separated by lines of equal signs, which are placed
+in C<@Fields>.
+
+    {
+	local @ARGV = ("/etc/motd");
+        local $/ = undef;
+        local $_ = <>;	
+	@Fields = split /^\s*=+\s*$/;
+    } 
+
+It particular, it's important to C<local>ize $_ in any routine that assigns
+to it.  Look out for implicit assignments in C<while> conditionals.
+
+=item 2.
+
+You need to create a local file or directory handle or a local function.
+
+A function that needs a filehandle of its own must use
+C<local()> on a complete typeglob.   This can be used to create new symbol
+table entries:
+
+    sub ioqueue {
+        local  (*READER, *WRITER);    # not my!
+        pipe    (READER,  WRITER)     or die "pipe: $!";
+        return (*READER, *WRITER);
+    }
+    ($head, $tail) = ioqueue();
+
+See the Symbol module for a way to create anonymous symbol table
+entries.
+
+Because assignment of a reference to a typeglob creates an alias, this
+can be used to create what is effectively a local function, or at least,
+a local alias.
+
+    {
+        local *grow = \&shrink; # only until this block exists
+        grow();                 # really calls shrink()
+	move();			# if move() grow()s, it shrink()s too
+    }
+    grow();			# get the real grow() again
+
+See L<perlref/"Function Templates"> for more about manipulating
+functions by name in this way.
+
+=item 3.
+
+You want to temporarily change just one element of an array or hash.
+
+You can C<local>ize just one element of an aggregate.  Usually this
+is done on dynamics:
+
+    {
+	local $SIG{INT} = 'IGNORE';
+	funct();			    # uninterruptible
+    } 
+    # interruptibility automatically restored here
+
+But it also works on lexically declared aggregates.  Prior to 5.005,
+this operation could on occasion misbehave.
+
+=back
+
+=head2 Pass by Reference
+X<pass by reference> X<pass-by-reference> X<reference>
+
+If you want to pass more than one array or hash into a function--or
+return them from it--and have them maintain their integrity, then
+you're going to have to use an explicit pass-by-reference.  Before you
+do that, you need to understand references as detailed in L<perlref>.
+This section may not make much sense to you otherwise.
+
+Here are a few simple examples.  First, let's pass in several arrays
+to a function and have it C<pop> all of then, returning a new list
+of all their former last elements:
+
+    @tailings = popmany ( \@a, \@b, \@c, \@d );
+
+    sub popmany {
+	my $aref;
+	my @retlist = ();
+	foreach $aref ( @_ ) {
+	    push @retlist, pop @$aref;
+	}
+	return @retlist;
+    }
+
+Here's how you might write a function that returns a
+list of keys occurring in all the hashes passed to it:
+
+    @common = inter( \%foo, \%bar, \%joe );
+    sub inter {
+	my ($k, $href, %seen); # locals
+	foreach $href (@_) {
+	    while ( $k = each %$href ) {
+		$seen{$k}++;
+	    }
+	}
+	return grep { $seen{$_} == @_ } keys %seen;
+    }
+
+So far, we're using just the normal list return mechanism.
+What happens if you want to pass or return a hash?  Well,
+if you're using only one of them, or you don't mind them
+concatenating, then the normal calling convention is ok, although
+a little expensive.
+
+Where people get into trouble is here:
+
+    (@a, @b) = func(@c, @d);
+or
+    (%a, %b) = func(%c, %d);
+
+That syntax simply won't work.  It sets just C<@a> or C<%a> and
+clears the C<@b> or C<%b>.  Plus the function didn't get passed
+into two separate arrays or hashes: it got one long list in C<@_>,
+as always.
+
+If you can arrange for everyone to deal with this through references, it's
+cleaner code, although not so nice to look at.  Here's a function that
+takes two array references as arguments, returning the two array elements
+in order of how many elements they have in them:
+
+    ($aref, $bref) = func(\@c, \@d);
+    print "@$aref has more than @$bref\n";
+    sub func {
+	my ($cref, $dref) = @_;
+	if (@$cref > @$dref) {
+	    return ($cref, $dref);
+	} else {
+	    return ($dref, $cref);
+	}
+    }
+
+It turns out that you can actually do this also:
+
+    (*a, *b) = func(\@c, \@d);
+    print "@a has more than @b\n";
+    sub func {
+	local (*c, *d) = @_;
+	if (@c > @d) {
+	    return (\@c, \@d);
+	} else {
+	    return (\@d, \@c);
+	}
+    }
+
+Here we're using the typeglobs to do symbol table aliasing.  It's
+a tad subtle, though, and also won't work if you're using C<my>
+variables, because only globals (even in disguise as C<local>s)
+are in the symbol table.
+
+If you're passing around filehandles, you could usually just use the bare
+typeglob, like C<*STDOUT>, but typeglobs references work, too.
+For example:
+
+    splutter(\*STDOUT);
+    sub splutter {
+	my $fh = shift;
+	print $fh "her um well a hmmm\n";
+    }
+
+    $rec = get_rec(\*STDIN);
+    sub get_rec {
+	my $fh = shift;
+	return scalar <$fh>;
+    }
+
+If you're planning on generating new filehandles, you could do this.
+Notice to pass back just the bare *FH, not its reference.
+
+    sub openit {
+	my $path = shift;
+	local *FH;
+	return open (FH, $path) ? *FH : undef;
+    }
+
+=head2 Prototypes
+X<prototype> X<subroutine, prototype>
+
+Perl supports a very limited kind of compile-time argument checking
+using function prototyping.  If you declare
+
+    sub mypush (\@@)
+
+then C<mypush()> takes arguments exactly like C<push()> does.  The
+function declaration must be visible at compile time.  The prototype
+affects only interpretation of new-style calls to the function,
+where new-style is defined as not using the C<&> character.  In
+other words, if you call it like a built-in function, then it behaves
+like a built-in function.  If you call it like an old-fashioned
+subroutine, then it behaves like an old-fashioned subroutine.  It
+naturally falls out from this rule that prototypes have no influence
+on subroutine references like C<\&foo> or on indirect subroutine
+calls like C<&{$subref}> or C<< $subref->() >>.
+
+Method calls are not influenced by prototypes either, because the
+function to be called is indeterminate at compile time, since
+the exact code called depends on inheritance.
+
+Because the intent of this feature is primarily to let you define
+subroutines that work like built-in functions, here are prototypes
+for some other functions that parse almost exactly like the
+corresponding built-in.
+
+    Declared as			Called as
+
+    sub mylink ($$)	     mylink $old, $new
+    sub myvec ($$$)	     myvec $var, $offset, 1
+    sub myindex ($$;$)	     myindex &getstring, "substr"
+    sub mysyswrite ($$$;$)   mysyswrite $buf, 0, length($buf) - $off, $off
+    sub myreverse (@)	     myreverse $a, $b, $c
+    sub myjoin ($@)	     myjoin ":", $a, $b, $c
+    sub mypop (\@)	     mypop @array
+    sub mysplice (\@$$@)     mysplice @array, @array, 0, @pushme
+    sub mykeys (\%)	     mykeys %{$hashref}
+    sub myopen (*;$)	     myopen HANDLE, $name
+    sub mypipe (**)	     mypipe READHANDLE, WRITEHANDLE
+    sub mygrep (&@)	     mygrep { /foo/ } $a, $b, $c
+    sub myrand ($)	     myrand 42
+    sub mytime ()	     mytime
+
+Any backslashed prototype character represents an actual argument
+that absolutely must start with that character.  The value passed
+as part of C<@_> will be a reference to the actual argument given
+in the subroutine call, obtained by applying C<\> to that argument.
+
+You can also backslash several argument types simultaneously by using
+the C<\[]> notation:
+
+    sub myref (\[$@%&*])
+
+will allow calling myref() as
+
+    myref $var
+    myref @array
+    myref %hash
+    myref &sub
+    myref *glob
+
+and the first argument of myref() will be a reference to
+a scalar, an array, a hash, a code, or a glob.
+
+Unbackslashed prototype characters have special meanings.  Any
+unbackslashed C<@> or C<%> eats all remaining arguments, and forces
+list context.  An argument represented by C<$> forces scalar context.  An
+C<&> requires an anonymous subroutine, which, if passed as the first
+argument, does not require the C<sub> keyword or a subsequent comma.
+
+A C<*> allows the subroutine to accept a bareword, constant, scalar expression,
+typeglob, or a reference to a typeglob in that slot.  The value will be
+available to the subroutine either as a simple scalar, or (in the latter
+two cases) as a reference to the typeglob.  If you wish to always convert
+such arguments to a typeglob reference, use Symbol::qualify_to_ref() as
+follows:
+
+    use Symbol 'qualify_to_ref';
+
+    sub foo (*) {
+	my $fh = qualify_to_ref(shift, caller);
+	...
+    }
+
+A semicolon separates mandatory arguments from optional arguments.
+It is redundant before C<@> or C<%>, which gobble up everything else.
+
+Note how the last three examples in the table above are treated
+specially by the parser.  C<mygrep()> is parsed as a true list
+operator, C<myrand()> is parsed as a true unary operator with unary
+precedence the same as C<rand()>, and C<mytime()> is truly without
+arguments, just like C<time()>.  That is, if you say
+
+    mytime +2;
+
+you'll get C<mytime() + 2>, not C<mytime(2)>, which is how it would be parsed
+without a prototype.
+
+The interesting thing about C<&> is that you can generate new syntax with it,
+provided it's in the initial position:
+X<&>
+
+    sub try (&@) {
+	my($try,$catch) = @_;
+	eval { &$try };
+	if ($@) {
+	    local $_ = $@;
+	    &$catch;
+	}
+    }
+    sub catch (&) { $_[0] }
+
+    try {
+	die "phooey";
+    } catch {
+	/phooey/ and print "unphooey\n";
+    };
+
+That prints C<"unphooey">.  (Yes, there are still unresolved
+issues having to do with visibility of C<@_>.  I'm ignoring that
+question for the moment.  (But note that if we make C<@_> lexically
+scoped, those anonymous subroutines can act like closures... (Gee,
+is this sounding a little Lispish?  (Never mind.))))
+
+And here's a reimplementation of the Perl C<grep> operator:
+X<grep>
+
+    sub mygrep (&@) {
+	my $code = shift;
+	my @result;
+	foreach $_ (@_) {
+	    push(@result, $_) if &$code;
+	}
+	@result;
+    }
+
+Some folks would prefer full alphanumeric prototypes.  Alphanumerics have
+been intentionally left out of prototypes for the express purpose of
+someday in the future adding named, formal parameters.  The current
+mechanism's main goal is to let module writers provide better diagnostics
+for module users.  Larry feels the notation quite understandable to Perl
+programmers, and that it will not intrude greatly upon the meat of the
+module, nor make it harder to read.  The line noise is visually
+encapsulated into a small pill that's easy to swallow.
+
+If you try to use an alphanumeric sequence in a prototype you will
+generate an optional warning - "Illegal character in prototype...".
+Unfortunately earlier versions of Perl allowed the prototype to be
+used as long as its prefix was a valid prototype.  The warning may be
+upgraded to a fatal error in a future version of Perl once the
+majority of offending code is fixed.
+
+It's probably best to prototype new functions, not retrofit prototyping
+into older ones.  That's because you must be especially careful about
+silent impositions of differing list versus scalar contexts.  For example,
+if you decide that a function should take just one parameter, like this:
+
+    sub func ($) {
+	my $n = shift;
+	print "you gave me $n\n";
+    }
+
+and someone has been calling it with an array or expression
+returning a list:
+
+    func(@foo);
+    func( split /:/ );
+
+Then you've just supplied an automatic C<scalar> in front of their
+argument, which can be more than a bit surprising.  The old C<@foo>
+which used to hold one thing doesn't get passed in.  Instead,
+C<func()> now gets passed in a C<1>; that is, the number of elements
+in C<@foo>.  And the C<split> gets called in scalar context so it
+starts scribbling on your C<@_> parameter list.  Ouch!
+
+This is all very powerful, of course, and should be used only in moderation
+to make the world a better place.
+
+=head2 Constant Functions
+X<constant>
+
+Functions with a prototype of C<()> are potential candidates for
+inlining.  If the result after optimization and constant folding
+is either a constant or a lexically-scoped scalar which has no other
+references, then it will be used in place of function calls made
+without C<&>.  Calls made using C<&> are never inlined.  (See
+F<constant.pm> for an easy way to declare most constants.)
+
+The following functions would all be inlined:
+
+    sub pi ()		{ 3.14159 }		# Not exact, but close.
+    sub PI ()		{ 4 * atan2 1, 1 }	# As good as it gets,
+						# and it's inlined, too!
+    sub ST_DEV ()	{ 0 }
+    sub ST_INO ()	{ 1 }
+
+    sub FLAG_FOO ()	{ 1 << 8 }
+    sub FLAG_BAR ()	{ 1 << 9 }
+    sub FLAG_MASK ()	{ FLAG_FOO | FLAG_BAR }
+
+    sub OPT_BAZ ()	{ not (0x1B58 & FLAG_MASK) }
+
+    sub N () { int(OPT_BAZ) / 3 }
+
+    sub FOO_SET () { 1 if FLAG_MASK & FLAG_FOO }
+
+Be aware that these will not be inlined; as they contain inner scopes,
+the constant folding doesn't reduce them to a single constant:
+
+    sub foo_set () { if (FLAG_MASK & FLAG_FOO) { 1 } }
+
+    sub baz_val () {
+	if (OPT_BAZ) {
+	    return 23;
+	}
+	else {
+	    return 42;
+	}
+    }
+
+If you redefine a subroutine that was eligible for inlining, you'll get
+a mandatory warning.  (You can use this warning to tell whether or not a
+particular subroutine is considered constant.)  The warning is
+considered severe enough not to be optional because previously compiled
+invocations of the function will still be using the old value of the
+function.  If you need to be able to redefine the subroutine, you need to
+ensure that it isn't inlined, either by dropping the C<()> prototype
+(which changes calling semantics, so beware) or by thwarting the
+inlining mechanism in some other way, such as
+
+    sub not_inlined () {
+    	23 if $];
+    }
+
+=head2 Overriding Built-in Functions
+X<built-in> X<override> X<CORE> X<CORE::GLOBAL>
+
+Many built-in functions may be overridden, though this should be tried
+only occasionally and for good reason.  Typically this might be
+done by a package attempting to emulate missing built-in functionality
+on a non-Unix system.
+
+Overriding may be done only by importing the name from a module at
+compile time--ordinary predeclaration isn't good enough.  However, the
+C<use subs> pragma lets you, in effect, predeclare subs
+via the import syntax, and these names may then override built-in ones:
+
+    use subs 'chdir', 'chroot', 'chmod', 'chown';
+    chdir $somewhere;
+    sub chdir { ... }
+
+To unambiguously refer to the built-in form, precede the
+built-in name with the special package qualifier C<CORE::>.  For example,
+saying C<CORE::open()> always refers to the built-in C<open()>, even
+if the current package has imported some other subroutine called
+C<&open()> from elsewhere.  Even though it looks like a regular
+function call, it isn't: you can't take a reference to it, such as
+the incorrect C<\&CORE::open> might appear to produce.
+
+Library modules should not in general export built-in names like C<open>
+or C<chdir> as part of their default C<@EXPORT> list, because these may
+sneak into someone else's namespace and change the semantics unexpectedly.
+Instead, if the module adds that name to C<@EXPORT_OK>, then it's
+possible for a user to import the name explicitly, but not implicitly.
+That is, they could say
+
+    use Module 'open';
+
+and it would import the C<open> override.  But if they said
+
+    use Module;
+
+they would get the default imports without overrides.
+
+The foregoing mechanism for overriding built-in is restricted, quite
+deliberately, to the package that requests the import.  There is a second
+method that is sometimes applicable when you wish to override a built-in
+everywhere, without regard to namespace boundaries.  This is achieved by
+importing a sub into the special namespace C<CORE::GLOBAL::>.  Here is an
+example that quite brazenly replaces the C<glob> operator with something
+that understands regular expressions.
+
+    package REGlob;
+    require Exporter;
+    @ISA = 'Exporter';
+    @EXPORT_OK = 'glob';
+
+    sub import {
+	my $pkg = shift;
+	return unless @_;
+	my $sym = shift;
+	my $where = ($sym =~ s/^GLOBAL_// ? 'CORE::GLOBAL' : caller(0));
+	$pkg->export($where, $sym, @_);
+    }
+
+    sub glob {
+	my $pat = shift;
+	my @got;
+	local *D;
+	if (opendir D, '.') { 
+	    @got = grep /$pat/, readdir D; 
+	    closedir D;   
+	}
+	return @got;
+    }
+    1;
+
+And here's how it could be (ab)used:
+
+    #use REGlob 'GLOBAL_glob';	    # override glob() in ALL namespaces
+    package Foo;
+    use REGlob 'glob';		    # override glob() in Foo:: only
+    print for <^[a-z_]+\.pm\$>;	    # show all pragmatic modules
+
+The initial comment shows a contrived, even dangerous example.
+By overriding C<glob> globally, you would be forcing the new (and
+subversive) behavior for the C<glob> operator for I<every> namespace,
+without the complete cognizance or cooperation of the modules that own
+those namespaces.  Naturally, this should be done with extreme caution--if
+it must be done at all.
+
+The C<REGlob> example above does not implement all the support needed to
+cleanly override perl's C<glob> operator.  The built-in C<glob> has
+different behaviors depending on whether it appears in a scalar or list
+context, but our C<REGlob> doesn't.  Indeed, many perl built-in have such
+context sensitive behaviors, and these must be adequately supported by
+a properly written override.  For a fully functional example of overriding
+C<glob>, study the implementation of C<File::DosGlob> in the standard
+library.
+
+When you override a built-in, your replacement should be consistent (if
+possible) with the built-in native syntax.  You can achieve this by using
+a suitable prototype.  To get the prototype of an overridable built-in,
+use the C<prototype> function with an argument of C<"CORE::builtin_name">
+(see L<perlfunc/prototype>).
+
+Note however that some built-ins can't have their syntax expressed by a
+prototype (such as C<system> or C<chomp>).  If you override them you won't
+be able to fully mimic their original syntax.
+
+The built-ins C<do>, C<require> and C<glob> can also be overridden, but due
+to special magic, their original syntax is preserved, and you don't have
+to define a prototype for their replacements.  (You can't override the
+C<do BLOCK> syntax, though).
+
+C<require> has special additional dark magic: if you invoke your
+C<require> replacement as C<require Foo::Bar>, it will actually receive
+the argument C<"Foo/Bar.pm"> in @_.  See L<perlfunc/require>.
+
+And, as you'll have noticed from the previous example, if you override
+C<glob>, the C<E<lt>*E<gt>> glob operator is overridden as well.
+
+In a similar fashion, overriding the C<readline> function also overrides
+the equivalent I/O operator C<< <FILEHANDLE> >>.
+
+Finally, some built-ins (e.g. C<exists> or C<grep>) can't be overridden.
+
+=head2 Autoloading
+X<autoloading> X<AUTOLOAD>
+
+If you call a subroutine that is undefined, you would ordinarily
+get an immediate, fatal error complaining that the subroutine doesn't
+exist.  (Likewise for subroutines being used as methods, when the
+method doesn't exist in any base class of the class's package.)
+However, if an C<AUTOLOAD> subroutine is defined in the package or
+packages used to locate the original subroutine, then that
+C<AUTOLOAD> subroutine is called with the arguments that would have
+been passed to the original subroutine.  The fully qualified name
+of the original subroutine magically appears in the global $AUTOLOAD
+variable of the same package as the C<AUTOLOAD> routine.  The name
+is not passed as an ordinary argument because, er, well, just
+because, that's why...
+
+Many C<AUTOLOAD> routines load in a definition for the requested
+subroutine using eval(), then execute that subroutine using a special
+form of goto() that erases the stack frame of the C<AUTOLOAD> routine
+without a trace.  (See the source to the standard module documented
+in L<AutoLoader>, for example.)  But an C<AUTOLOAD> routine can
+also just emulate the routine and never define it.   For example,
+let's pretend that a function that wasn't defined should just invoke
+C<system> with those arguments.  All you'd do is:
+
+    sub AUTOLOAD {
+	my $program = $AUTOLOAD;
+	$program =~ s/.*:://;
+	system($program, @_);
+    }
+    date();
+    who('am', 'i');
+    ls('-l');
+
+In fact, if you predeclare functions you want to call that way, you don't
+even need parentheses:
+
+    use subs qw(date who ls);
+    date;
+    who "am", "i";
+    ls -l;
+
+A more complete example of this is the standard Shell module, which
+can treat undefined subroutine calls as calls to external programs.
+
+Mechanisms are available to help modules writers split their modules
+into autoloadable files.  See the standard AutoLoader module
+described in L<AutoLoader> and in L<AutoSplit>, the standard
+SelfLoader modules in L<SelfLoader>, and the document on adding C
+functions to Perl code in L<perlxs>.
+
+=head2 Subroutine Attributes
+X<attribute> X<subroutine, attribute> X<attrs>
+
+A subroutine declaration or definition may have a list of attributes
+associated with it.  If such an attribute list is present, it is
+broken up at space or colon boundaries and treated as though a
+C<use attributes> had been seen.  See L<attributes> for details
+about what attributes are currently supported.
+Unlike the limitation with the obsolescent C<use attrs>, the
+C<sub : ATTRLIST> syntax works to associate the attributes with
+a pre-declaration, and not just with a subroutine definition.
+
+The attributes must be valid as simple identifier names (without any
+punctuation other than the '_' character).  They may have a parameter
+list appended, which is only checked for whether its parentheses ('(',')')
+nest properly.
+
+Examples of valid syntax (even though the attributes are unknown):
+
+    sub fnord (&\%) : switch(10,foo(7,3))  :  expensive;
+    sub plugh () : Ugly('\(") :Bad;
+    sub xyzzy : _5x5 { ... }
+
+Examples of invalid syntax:
+
+    sub fnord : switch(10,foo(); # ()-string not balanced
+    sub snoid : Ugly('(');	  # ()-string not balanced
+    sub xyzzy : 5x5;		  # "5x5" not a valid identifier
+    sub plugh : Y2::north;	  # "Y2::north" not a simple identifier
+    sub snurt : foo + bar;	  # "+" not a colon or space
+
+The attribute list is passed as a list of constant strings to the code
+which associates them with the subroutine.  In particular, the second example
+of valid syntax above currently looks like this in terms of how it's
+parsed and invoked:
+
+    use attributes __PACKAGE__, \&plugh, q[Ugly('\(")], 'Bad';
+
+For further details on attribute lists and their manipulation,
+see L<attributes> and L<Attribute::Handlers>.
+
+=head1 SEE ALSO
+
+See L<perlref/"Function Templates"> for more about references and closures.
+See L<perlxs> if you'd like to learn about calling C subroutines from Perl.  
+See L<perlembed> if you'd like to learn about calling Perl subroutines from C.  
+See L<perlmod> to learn about bundling up your functions in separate files.
+See L<perlmodlib> to learn what library modules come standard on your system.
+See L<perltoot> to learn how to make object method calls.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsyn.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsyn.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlsyn.pod	(revision 14489)
@@ -0,0 +1,752 @@
+=head1 NAME
+X<syntax>
+
+perlsyn - Perl syntax
+
+=head1 DESCRIPTION
+
+A Perl program consists of a sequence of declarations and statements
+which run from the top to the bottom.  Loops, subroutines and other
+control structures allow you to jump around within the code.
+
+Perl is a B<free-form> language, you can format and indent it however
+you like.  Whitespace mostly serves to separate tokens, unlike
+languages like Python where it is an important part of the syntax.
+
+Many of Perl's syntactic elements are B<optional>.  Rather than
+requiring you to put parentheses around every function call and
+declare every variable, you can often leave such explicit elements off
+and Perl will figure out what you meant.  This is known as B<Do What I
+Mean>, abbreviated B<DWIM>.  It allows programmers to be B<lazy> and to
+code in a style with which they are comfortable.
+
+Perl B<borrows syntax> and concepts from many languages: awk, sed, C,
+Bourne Shell, Smalltalk, Lisp and even English.  Other
+languages have borrowed syntax from Perl, particularly its regular
+expression extensions.  So if you have programmed in another language
+you will see familiar pieces in Perl.  They often work the same, but
+see L<perltrap> for information about how they differ.
+
+=head2 Declarations
+X<declaration> X<undef> X<undefined> X<uninitialized>
+
+The only things you need to declare in Perl are report formats and
+subroutines (and sometimes not even subroutines).  A variable holds
+the undefined value (C<undef>) until it has been assigned a defined
+value, which is anything other than C<undef>.  When used as a number,
+C<undef> is treated as C<0>; when used as a string, it is treated as
+the empty string, C<"">; and when used as a reference that isn't being
+assigned to, it is treated as an error.  If you enable warnings,
+you'll be notified of an uninitialized value whenever you treat
+C<undef> as a string or a number.  Well, usually.  Boolean contexts,
+such as:
+
+    my $a;
+    if ($a) {}
+
+are exempt from warnings (because they care about truth rather than
+definedness).  Operators such as C<++>, C<-->, C<+=>,
+C<-=>, and C<.=>, that operate on undefined left values such as:
+
+    my $a;
+    $a++;
+
+are also always exempt from such warnings.
+
+A declaration can be put anywhere a statement can, but has no effect on
+the execution of the primary sequence of statements--declarations all
+take effect at compile time.  Typically all the declarations are put at
+the beginning or the end of the script.  However, if you're using
+lexically-scoped private variables created with C<my()>, you'll
+have to make sure
+your format or subroutine definition is within the same block scope
+as the my if you expect to be able to access those private variables.
+
+Declaring a subroutine allows a subroutine name to be used as if it were a
+list operator from that point forward in the program.  You can declare a
+subroutine without defining it by saying C<sub name>, thus:
+X<subroutine, declaration>
+
+    sub myname;
+    $me = myname $0 		or die "can't get myname";
+
+Note that myname() functions as a list operator, not as a unary operator;
+so be careful to use C<or> instead of C<||> in this case.  However, if
+you were to declare the subroutine as C<sub myname ($)>, then
+C<myname> would function as a unary operator, so either C<or> or
+C<||> would work.
+
+Subroutines declarations can also be loaded up with the C<require> statement
+or both loaded and imported into your namespace with a C<use> statement.
+See L<perlmod> for details on this.
+
+A statement sequence may contain declarations of lexically-scoped
+variables, but apart from declaring a variable name, the declaration acts
+like an ordinary statement, and is elaborated within the sequence of
+statements as if it were an ordinary statement.  That means it actually
+has both compile-time and run-time effects.
+
+=head2 Comments
+X<comment> X<#>
+
+Text from a C<"#"> character until the end of the line is a comment,
+and is ignored.  Exceptions include C<"#"> inside a string or regular
+expression.
+
+=head2 Simple Statements
+X<statement> X<semicolon> X<expression> X<;>
+
+The only kind of simple statement is an expression evaluated for its
+side effects.  Every simple statement must be terminated with a
+semicolon, unless it is the final statement in a block, in which case
+the semicolon is optional.  (A semicolon is still encouraged if the
+block takes up more than one line, because you may eventually add
+another line.)  Note that there are some operators like C<eval {}> and
+C<do {}> that look like compound statements, but aren't (they're just
+TERMs in an expression), and thus need an explicit termination if used
+as the last item in a statement.
+
+=head2 Truth and Falsehood
+X<truth> X<falsehood> X<true> X<false> X<!> X<not> X<negation> X<0>
+
+The number 0, the strings C<'0'> and C<''>, the empty list C<()>, and
+C<undef> are all false in a boolean context. All other values are true.
+Negation of a true value by C<!> or C<not> returns a special false value.
+When evaluated as a string it is treated as C<''>, but as a number, it
+is treated as 0.
+
+=head2 Statement Modifiers
+X<statement modifier> X<modifier> X<if> X<unless> X<while>
+X<until> X<foreach> X<for>
+
+Any simple statement may optionally be followed by a I<SINGLE> modifier,
+just before the terminating semicolon (or block ending).  The possible
+modifiers are:
+
+    if EXPR
+    unless EXPR
+    while EXPR
+    until EXPR
+    foreach LIST
+
+The C<EXPR> following the modifier is referred to as the "condition".
+Its truth or falsehood determines how the modifier will behave.
+
+C<if> executes the statement once I<if> and only if the condition is
+true.  C<unless> is the opposite, it executes the statement I<unless>
+the condition is true (i.e., if the condition is false).
+
+    print "Basset hounds got long ears" if length $ear >= 10;
+    go_outside() and play() unless $is_raining;
+
+The C<foreach> modifier is an iterator: it executes the statement once
+for each item in the LIST (with C<$_> aliased to each item in turn).
+
+    print "Hello $_!\n" foreach qw(world Dolly nurse);
+
+C<while> repeats the statement I<while> the condition is true.
+C<until> does the opposite, it repeats the statement I<until> the
+condition is true (or while the condition is false):
+
+    # Both of these count from 0 to 10.
+    print $i++ while $i <= 10;
+    print $j++ until $j >  10;
+
+The C<while> and C<until> modifiers have the usual "C<while> loop"
+semantics (conditional evaluated first), except when applied to a
+C<do>-BLOCK (or to the deprecated C<do>-SUBROUTINE statement), in
+which case the block executes once before the conditional is
+evaluated.  This is so that you can write loops like:
+
+    do {
+	$line = <STDIN>;
+	...
+    } until $line  eq ".\n";
+
+See L<perlfunc/do>.  Note also that the loop control statements described
+later will I<NOT> work in this construct, because modifiers don't take
+loop labels.  Sorry.  You can always put another block inside of it
+(for C<next>) or around it (for C<last>) to do that sort of thing.
+For C<next>, just double the braces:
+X<next> X<last> X<redo>
+
+    do {{
+	next if $x == $y;
+	# do something here
+    }} until $x++ > $z;
+
+For C<last>, you have to be more elaborate:
+X<last>
+
+    LOOP: { 
+	    do {
+		last if $x = $y**2;
+		# do something here
+	    } while $x++ <= $z;
+    }
+
+B<NOTE:> The behaviour of a C<my> statement modified with a statement
+modifier conditional or loop construct (e.g. C<my $x if ...>) is
+B<undefined>.  The value of the C<my> variable may be C<undef>, any
+previously assigned value, or possibly anything else.  Don't rely on
+it.  Future versions of perl might do something different from the
+version of perl you try it out on.  Here be dragons.
+X<my>
+
+=head2 Compound Statements
+X<statement, compound> X<block> X<bracket, curly> X<curly bracket> X<brace>
+X<{> X<}> X<if> X<unless> X<while> X<until> X<foreach> X<for> X<continue>
+
+In Perl, a sequence of statements that defines a scope is called a block.
+Sometimes a block is delimited by the file containing it (in the case
+of a required file, or the program as a whole), and sometimes a block
+is delimited by the extent of a string (in the case of an eval).
+
+But generally, a block is delimited by curly brackets, also known as braces.
+We will call this syntactic construct a BLOCK.
+
+The following compound statements may be used to control flow:
+
+    if (EXPR) BLOCK
+    if (EXPR) BLOCK else BLOCK
+    if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
+    LABEL while (EXPR) BLOCK
+    LABEL while (EXPR) BLOCK continue BLOCK
+    LABEL until (EXPR) BLOCK
+    LABEL until (EXPR) BLOCK continue BLOCK
+    LABEL for (EXPR; EXPR; EXPR) BLOCK
+    LABEL foreach VAR (LIST) BLOCK
+    LABEL foreach VAR (LIST) BLOCK continue BLOCK
+    LABEL BLOCK continue BLOCK
+
+Note that, unlike C and Pascal, these are defined in terms of BLOCKs,
+not statements.  This means that the curly brackets are I<required>--no
+dangling statements allowed.  If you want to write conditionals without
+curly brackets there are several other ways to do it.  The following
+all do the same thing:
+
+    if (!open(FOO)) { die "Can't open $FOO: $!"; }
+    die "Can't open $FOO: $!" unless open(FOO);
+    open(FOO) or die "Can't open $FOO: $!";	# FOO or bust!
+    open(FOO) ? 'hi mom' : die "Can't open $FOO: $!";
+			# a bit exotic, that last one
+
+The C<if> statement is straightforward.  Because BLOCKs are always
+bounded by curly brackets, there is never any ambiguity about which
+C<if> an C<else> goes with.  If you use C<unless> in place of C<if>,
+the sense of the test is reversed.
+
+The C<while> statement executes the block as long as the expression is
+true (does not evaluate to the null string C<""> or C<0> or C<"0">).
+The C<until> statement executes the block as long as the expression is
+false.
+The LABEL is optional, and if present, consists of an identifier followed
+by a colon.  The LABEL identifies the loop for the loop control
+statements C<next>, C<last>, and C<redo>.
+If the LABEL is omitted, the loop control statement
+refers to the innermost enclosing loop.  This may include dynamically
+looking back your call-stack at run time to find the LABEL.  Such
+desperate behavior triggers a warning if you use the C<use warnings>
+pragma or the B<-w> flag.
+
+If there is a C<continue> BLOCK, it is always executed just before the
+conditional is about to be evaluated again.  Thus it can be used to
+increment a loop variable, even when the loop has been continued via
+the C<next> statement.
+
+=head2 Loop Control
+X<loop control> X<loop, control> X<next> X<last> X<redo> X<continue>
+
+The C<next> command starts the next iteration of the loop:
+
+    LINE: while (<STDIN>) {
+	next LINE if /^#/;	# discard comments
+	...
+    }
+
+The C<last> command immediately exits the loop in question.  The
+C<continue> block, if any, is not executed:
+
+    LINE: while (<STDIN>) {
+	last LINE if /^$/;	# exit when done with header
+	...
+    }
+
+The C<redo> command restarts the loop block without evaluating the
+conditional again.  The C<continue> block, if any, is I<not> executed.
+This command is normally used by programs that want to lie to themselves
+about what was just input.
+
+For example, when processing a file like F</etc/termcap>.
+If your input lines might end in backslashes to indicate continuation, you
+want to skip ahead and get the next record.
+
+    while (<>) {
+	chomp;
+	if (s/\\$//) {
+	    $_ .= <>;
+	    redo unless eof();
+	}
+	# now process $_
+    }
+
+which is Perl short-hand for the more explicitly written version:
+
+    LINE: while (defined($line = <ARGV>)) {
+	chomp($line);
+	if ($line =~ s/\\$//) {
+	    $line .= <ARGV>;
+	    redo LINE unless eof(); # not eof(ARGV)!
+	}
+	# now process $line
+    }
+
+Note that if there were a C<continue> block on the above code, it would
+get executed only on lines discarded by the regex (since redo skips the
+continue block). A continue block is often used to reset line counters
+or C<?pat?> one-time matches:
+
+    # inspired by :1,$g/fred/s//WILMA/
+    while (<>) {
+	?(fred)?    && s//WILMA $1 WILMA/;
+	?(barney)?  && s//BETTY $1 BETTY/;
+	?(homer)?   && s//MARGE $1 MARGE/;
+    } continue {
+	print "$ARGV $.: $_";
+	close ARGV  if eof();		# reset $.
+	reset	    if eof();		# reset ?pat?
+    }
+
+If the word C<while> is replaced by the word C<until>, the sense of the
+test is reversed, but the conditional is still tested before the first
+iteration.
+
+The loop control statements don't work in an C<if> or C<unless>, since
+they aren't loops.  You can double the braces to make them such, though.
+
+    if (/pattern/) {{
+	last if /fred/;
+	next if /barney/; # same effect as "last", but doesn't document as well
+	# do something here
+    }}
+
+This is caused by the fact that a block by itself acts as a loop that
+executes once, see L<"Basic BLOCKs and Switch Statements">.
+
+The form C<while/if BLOCK BLOCK>, available in Perl 4, is no longer
+available.   Replace any occurrence of C<if BLOCK> by C<if (do BLOCK)>.
+
+=head2 For Loops
+X<for> X<foreach>
+
+Perl's C-style C<for> loop works like the corresponding C<while> loop;
+that means that this:
+
+    for ($i = 1; $i < 10; $i++) {
+	...
+    }
+
+is the same as this:
+
+    $i = 1;
+    while ($i < 10) {
+	...
+    } continue {
+	$i++;
+    }
+
+There is one minor difference: if variables are declared with C<my>
+in the initialization section of the C<for>, the lexical scope of
+those variables is exactly the C<for> loop (the body of the loop
+and the control sections).
+X<my>
+
+Besides the normal array index looping, C<for> can lend itself
+to many other interesting applications.  Here's one that avoids the
+problem you get into if you explicitly test for end-of-file on
+an interactive file descriptor causing your program to appear to
+hang.
+X<eof> X<end-of-file> X<end of file>
+
+    $on_a_tty = -t STDIN && -t STDOUT;
+    sub prompt { print "yes? " if $on_a_tty }
+    for ( prompt(); <STDIN>; prompt() ) {
+	# do something
+    }
+
+Using C<readline> (or the operator form, C<< <EXPR> >>) as the
+conditional of a C<for> loop is shorthand for the following.  This
+behaviour is the same as a C<while> loop conditional.
+X<readline> X<< <> >>
+
+    for ( prompt(); defined( $_ = <STDIN> ); prompt() ) {
+        # do something
+    }
+
+=head2 Foreach Loops
+X<for> X<foreach>
+
+The C<foreach> loop iterates over a normal list value and sets the
+variable VAR to be each element of the list in turn.  If the variable
+is preceded with the keyword C<my>, then it is lexically scoped, and
+is therefore visible only within the loop.  Otherwise, the variable is
+implicitly local to the loop and regains its former value upon exiting
+the loop.  If the variable was previously declared with C<my>, it uses
+that variable instead of the global one, but it's still localized to
+the loop.  This implicit localisation occurs I<only> in a C<foreach>
+loop.
+X<my> X<local>
+
+The C<foreach> keyword is actually a synonym for the C<for> keyword, so
+you can use C<foreach> for readability or C<for> for brevity.  (Or because
+the Bourne shell is more familiar to you than I<csh>, so writing C<for>
+comes more naturally.)  If VAR is omitted, C<$_> is set to each value.
+X<$_>
+
+If any element of LIST is an lvalue, you can modify it by modifying
+VAR inside the loop.  Conversely, if any element of LIST is NOT an
+lvalue, any attempt to modify that element will fail.  In other words,
+the C<foreach> loop index variable is an implicit alias for each item
+in the list that you're looping over.
+X<alias>
+
+If any part of LIST is an array, C<foreach> will get very confused if
+you add or remove elements within the loop body, for example with
+C<splice>.   So don't do that.
+X<splice>
+
+C<foreach> probably won't do what you expect if VAR is a tied or other
+special variable.   Don't do that either.
+
+Examples:
+
+    for (@ary) { s/foo/bar/ }
+
+    for my $elem (@elements) {
+	$elem *= 2;
+    }
+
+    for $count (10,9,8,7,6,5,4,3,2,1,'BOOM') {
+	print $count, "\n"; sleep(1);
+    }
+
+    for (1..15) { print "Merry Christmas\n"; }
+
+    foreach $item (split(/:[\\\n:]*/, $ENV{TERMCAP})) {
+	print "Item: $item\n";
+    }
+
+Here's how a C programmer might code up a particular algorithm in Perl:
+
+    for (my $i = 0; $i < @ary1; $i++) {
+	for (my $j = 0; $j < @ary2; $j++) {
+	    if ($ary1[$i] > $ary2[$j]) {
+		last; # can't go to outer :-(
+	    }
+	    $ary1[$i] += $ary2[$j];
+	}
+	# this is where that last takes me
+    }
+
+Whereas here's how a Perl programmer more comfortable with the idiom might
+do it:
+
+    OUTER: for my $wid (@ary1) {
+    INNER:   for my $jet (@ary2) {
+		next OUTER if $wid > $jet;
+		$wid += $jet;
+	     }
+	  }
+
+See how much easier this is?  It's cleaner, safer, and faster.  It's
+cleaner because it's less noisy.  It's safer because if code gets added
+between the inner and outer loops later on, the new code won't be
+accidentally executed.  The C<next> explicitly iterates the other loop
+rather than merely terminating the inner one.  And it's faster because
+Perl executes a C<foreach> statement more rapidly than it would the
+equivalent C<for> loop.
+
+=head2 Basic BLOCKs and Switch Statements
+X<switch> X<block> X<case>
+
+A BLOCK by itself (labeled or not) is semantically equivalent to a
+loop that executes once.  Thus you can use any of the loop control
+statements in it to leave or restart the block.  (Note that this is
+I<NOT> true in C<eval{}>, C<sub{}>, or contrary to popular belief
+C<do{}> blocks, which do I<NOT> count as loops.)  The C<continue>
+block is optional.
+
+The BLOCK construct is particularly nice for doing case
+structures.
+
+    SWITCH: {
+	if (/^abc/) { $abc = 1; last SWITCH; }
+	if (/^def/) { $def = 1; last SWITCH; }
+	if (/^xyz/) { $xyz = 1; last SWITCH; }
+	$nothing = 1;
+    }
+
+There is no official C<switch> statement in Perl, because there are
+already several ways to write the equivalent.
+
+However, starting from Perl 5.8 to get switch and case one can use
+the Switch extension and say:
+
+	use Switch;
+
+after which one has switch and case.  It is not as fast as it could be
+because it's not really part of the language (it's done using source
+filters) but it is available, and it's very flexible.
+
+In addition to the above BLOCK construct, you could write
+
+    SWITCH: {
+	$abc = 1, last SWITCH  if /^abc/;
+	$def = 1, last SWITCH  if /^def/;
+	$xyz = 1, last SWITCH  if /^xyz/;
+	$nothing = 1;
+    }
+
+(That's actually not as strange as it looks once you realize that you can
+use loop control "operators" within an expression.  That's just the binary
+comma operator in scalar context.  See L<perlop/"Comma Operator">.)
+
+or
+
+    SWITCH: {
+	/^abc/ && do { $abc = 1; last SWITCH; };
+	/^def/ && do { $def = 1; last SWITCH; };
+	/^xyz/ && do { $xyz = 1; last SWITCH; };
+	$nothing = 1;
+    }
+
+or formatted so it stands out more as a "proper" C<switch> statement:
+
+    SWITCH: {
+	/^abc/ 	    && do {
+			    $abc = 1;
+			    last SWITCH;
+		       };
+
+	/^def/ 	    && do {
+			    $def = 1;
+			    last SWITCH;
+		       };
+
+	/^xyz/ 	    && do {
+			    $xyz = 1;
+			    last SWITCH;
+		        };
+	$nothing = 1;
+    }
+
+or
+
+    SWITCH: {
+	/^abc/ and $abc = 1, last SWITCH;
+	/^def/ and $def = 1, last SWITCH;
+	/^xyz/ and $xyz = 1, last SWITCH;
+	$nothing = 1;
+    }
+
+or even, horrors,
+
+    if (/^abc/)
+	{ $abc = 1 }
+    elsif (/^def/)
+	{ $def = 1 }
+    elsif (/^xyz/)
+	{ $xyz = 1 }
+    else
+	{ $nothing = 1 }
+
+A common idiom for a C<switch> statement is to use C<foreach>'s aliasing to make
+a temporary assignment to C<$_> for convenient matching:
+
+    SWITCH: for ($where) {
+		/In Card Names/     && do { push @flags, '-e'; last; };
+		/Anywhere/          && do { push @flags, '-h'; last; };
+		/In Rulings/        && do {                    last; };
+		die "unknown value for form variable where: `$where'";
+	    }
+
+Another interesting approach to a switch statement is arrange
+for a C<do> block to return the proper value:
+
+    $amode = do {
+	if     ($flag & O_RDONLY) { "r" }	# XXX: isn't this 0?
+	elsif  ($flag & O_WRONLY) { ($flag & O_APPEND) ? "a" : "w" }
+	elsif  ($flag & O_RDWR)   {
+	    if ($flag & O_CREAT)  { "w+" }
+	    else                  { ($flag & O_APPEND) ? "a+" : "r+" }
+	}
+    };
+
+Or 
+
+        print do {
+            ($flags & O_WRONLY) ? "write-only"          :
+            ($flags & O_RDWR)   ? "read-write"          :
+                                  "read-only";
+        };
+
+Or if you are certain that all the C<&&> clauses are true, you can use
+something like this, which "switches" on the value of the
+C<HTTP_USER_AGENT> environment variable.
+
+    #!/usr/bin/perl 
+    # pick out jargon file page based on browser
+    $dir = 'http://www.wins.uva.nl/~mes/jargon';
+    for ($ENV{HTTP_USER_AGENT}) { 
+	$page  =    /Mac/            && 'm/Macintrash.html'
+		 || /Win(dows )?NT/  && 'e/evilandrude.html'
+		 || /Win|MSIE|WebTV/ && 'm/MicroslothWindows.html'
+		 || /Linux/          && 'l/Linux.html'
+		 || /HP-UX/          && 'h/HP-SUX.html'
+		 || /SunOS/          && 's/ScumOS.html'
+		 ||                     'a/AppendixB.html';
+    }
+    print "Location: $dir/$page\015\012\015\012";
+
+That kind of switch statement only works when you know the C<&&> clauses
+will be true.  If you don't, the previous C<?:> example should be used.
+
+You might also consider writing a hash of subroutine references
+instead of synthesizing a C<switch> statement.
+
+=head2 Goto
+X<goto>
+
+Although not for the faint of heart, Perl does support a C<goto>
+statement.  There are three forms: C<goto>-LABEL, C<goto>-EXPR, and
+C<goto>-&NAME.  A loop's LABEL is not actually a valid target for
+a C<goto>; it's just the name of the loop.
+
+The C<goto>-LABEL form finds the statement labeled with LABEL and resumes
+execution there.  It may not be used to go into any construct that
+requires initialization, such as a subroutine or a C<foreach> loop.  It
+also can't be used to go into a construct that is optimized away.  It
+can be used to go almost anywhere else within the dynamic scope,
+including out of subroutines, but it's usually better to use some other
+construct such as C<last> or C<die>.  The author of Perl has never felt the
+need to use this form of C<goto> (in Perl, that is--C is another matter).
+
+The C<goto>-EXPR form expects a label name, whose scope will be resolved
+dynamically.  This allows for computed C<goto>s per FORTRAN, but isn't
+necessarily recommended if you're optimizing for maintainability:
+
+    goto(("FOO", "BAR", "GLARCH")[$i]);
+
+The C<goto>-&NAME form is highly magical, and substitutes a call to the
+named subroutine for the currently running subroutine.  This is used by
+C<AUTOLOAD()> subroutines that wish to load another subroutine and then
+pretend that the other subroutine had been called in the first place
+(except that any modifications to C<@_> in the current subroutine are
+propagated to the other subroutine.)  After the C<goto>, not even C<caller()>
+will be able to tell that this routine was called first.
+
+In almost all cases like this, it's usually a far, far better idea to use the
+structured control flow mechanisms of C<next>, C<last>, or C<redo> instead of
+resorting to a C<goto>.  For certain applications, the catch and throw pair of
+C<eval{}> and die() for exception processing can also be a prudent approach.
+
+=head2 PODs: Embedded Documentation
+X<POD> X<documentation>
+
+Perl has a mechanism for intermixing documentation with source code.
+While it's expecting the beginning of a new statement, if the compiler
+encounters a line that begins with an equal sign and a word, like this
+
+    =head1 Here There Be Pods!
+
+Then that text and all remaining text up through and including a line
+beginning with C<=cut> will be ignored.  The format of the intervening
+text is described in L<perlpod>.
+
+This allows you to intermix your source code
+and your documentation text freely, as in
+
+    =item snazzle($)
+
+    The snazzle() function will behave in the most spectacular
+    form that you can possibly imagine, not even excepting
+    cybernetic pyrotechnics.
+
+    =cut back to the compiler, nuff of this pod stuff!
+
+    sub snazzle($) {
+	my $thingie = shift;
+	.........
+    }
+
+Note that pod translators should look at only paragraphs beginning
+with a pod directive (it makes parsing easier), whereas the compiler
+actually knows to look for pod escapes even in the middle of a
+paragraph.  This means that the following secret stuff will be
+ignored by both the compiler and the translators.
+
+    $a=3;
+    =secret stuff
+     warn "Neither POD nor CODE!?"
+    =cut back
+    print "got $a\n";
+
+You probably shouldn't rely upon the C<warn()> being podded out forever.
+Not all pod translators are well-behaved in this regard, and perhaps
+the compiler will become pickier.
+
+One may also use pod directives to quickly comment out a section
+of code.
+
+=head2 Plain Old Comments (Not!)
+X<comment> X<line> X<#> X<preprocessor> X<eval>
+
+Perl can process line directives, much like the C preprocessor.  Using
+this, one can control Perl's idea of filenames and line numbers in
+error or warning messages (especially for strings that are processed
+with C<eval()>).  The syntax for this mechanism is the same as for most
+C preprocessors: it matches the regular expression
+
+    # example: '# line 42 "new_filename.plx"'
+    /^\#   \s*
+      line \s+ (\d+)   \s*
+      (?:\s("?)([^"]+)\2)? \s*
+     $/x
+
+with C<$1> being the line number for the next line, and C<$3> being
+the optional filename (specified with or without quotes).
+
+There is a fairly obvious gotcha included with the line directive:
+Debuggers and profilers will only show the last source line to appear
+at a particular line number in a given file.  Care should be taken not
+to cause line number collisions in code you'd like to debug later.
+
+Here are some examples that you should be able to type into your command
+shell:
+
+    % perl
+    # line 200 "bzzzt"
+    # the `#' on the previous line must be the first char on line
+    die 'foo';
+    __END__
+    foo at bzzzt line 201.
+
+    % perl
+    # line 200 "bzzzt"
+    eval qq[\n#line 2001 ""\ndie 'foo']; print $@;
+    __END__
+    foo at - line 2001.
+
+    % perl
+    eval qq[\n#line 200 "foo bar"\ndie 'foo']; print $@;
+    __END__
+    foo at foo bar line 200.
+
+    % perl
+    # line 345 "goop"
+    eval "\n#line " . __LINE__ . ' "' . __FILE__ ."\"\ndie 'foo'";
+    print $@;
+    __END__
+    foo at goop line 345.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlthrtut.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlthrtut.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlthrtut.pod	(revision 14489)
@@ -0,0 +1,1110 @@
+=head1 NAME
+
+perlthrtut - tutorial on threads in Perl
+
+=head1 DESCRIPTION
+
+B<NOTE>: this tutorial describes the new Perl threading flavour
+introduced in Perl 5.6.0 called interpreter threads, or B<ithreads>
+for short.  In this model each thread runs in its own Perl interpreter,
+and any data sharing between threads must be explicit.
+
+There is another older Perl threading flavour called the 5.005 model,
+unsurprisingly for 5.005 versions of Perl.  The old model is known to
+have problems, deprecated, and will probably be removed around release
+5.10. You are strongly encouraged to migrate any existing 5.005
+threads code to the new model as soon as possible.
+
+You can see which (or neither) threading flavour you have by
+running C<perl -V> and looking at the C<Platform> section.
+If you have C<useithreads=define> you have ithreads, if you
+have C<use5005threads=define> you have 5.005 threads.
+If you have neither, you don't have any thread support built in.
+If you have both, you are in trouble.
+
+The user-level interface to the 5.005 threads was via the L<Threads>
+class, while ithreads uses the L<threads> class. Note the change in case.
+
+=head1 Status
+
+The ithreads code has been available since Perl 5.6.0, and is considered
+stable. The user-level interface to ithreads (the L<threads> classes)
+appeared in the 5.8.0 release, and as of this time is considered stable
+although it should be treated with caution as with all new features.
+
+=head1 What Is A Thread Anyway?
+
+A thread is a flow of control through a program with a single
+execution point.
+
+Sounds an awful lot like a process, doesn't it? Well, it should.
+Threads are one of the pieces of a process.  Every process has at least
+one thread and, up until now, every process running Perl had only one
+thread.  With 5.8, though, you can create extra threads.  We're going
+to show you how, when, and why.
+
+=head1 Threaded Program Models
+
+There are three basic ways that you can structure a threaded
+program.  Which model you choose depends on what you need your program
+to do.  For many non-trivial threaded programs you'll need to choose
+different models for different pieces of your program.
+
+=head2 Boss/Worker
+
+The boss/worker model usually has one "boss" thread and one or more
+"worker" threads.  The boss thread gathers or generates tasks that need
+to be done, then parcels those tasks out to the appropriate worker
+thread.
+
+This model is common in GUI and server programs, where a main thread
+waits for some event and then passes that event to the appropriate
+worker threads for processing.  Once the event has been passed on, the
+boss thread goes back to waiting for another event.
+
+The boss thread does relatively little work.  While tasks aren't
+necessarily performed faster than with any other method, it tends to
+have the best user-response times.
+
+=head2 Work Crew
+
+In the work crew model, several threads are created that do
+essentially the same thing to different pieces of data.  It closely
+mirrors classical parallel processing and vector processors, where a
+large array of processors do the exact same thing to many pieces of
+data.
+
+This model is particularly useful if the system running the program
+will distribute multiple threads across different processors.  It can
+also be useful in ray tracing or rendering engines, where the
+individual threads can pass on interim results to give the user visual
+feedback.
+
+=head2 Pipeline
+
+The pipeline model divides up a task into a series of steps, and
+passes the results of one step on to the thread processing the
+next.  Each thread does one thing to each piece of data and passes the
+results to the next thread in line.
+
+This model makes the most sense if you have multiple processors so two
+or more threads will be executing in parallel, though it can often
+make sense in other contexts as well.  It tends to keep the individual
+tasks small and simple, as well as allowing some parts of the pipeline
+to block (on I/O or system calls, for example) while other parts keep
+going.  If you're running different parts of the pipeline on different
+processors you may also take advantage of the caches on each
+processor.
+
+This model is also handy for a form of recursive programming where,
+rather than having a subroutine call itself, it instead creates
+another thread.  Prime and Fibonacci generators both map well to this
+form of the pipeline model. (A version of a prime number generator is
+presented later on.)
+
+=head1 What kind of threads are Perl threads?
+
+If you have experience with other thread implementations, you might
+find that things aren't quite what you expect.  It's very important to
+remember when dealing with Perl threads that Perl Threads Are Not X
+Threads, for all values of X.  They aren't POSIX threads, or
+DecThreads, or Java's Green threads, or Win32 threads.  There are
+similarities, and the broad concepts are the same, but if you start
+looking for implementation details you're going to be either
+disappointed or confused.  Possibly both.
+
+This is not to say that Perl threads are completely different from
+everything that's ever come before--they're not.  Perl's threading
+model owes a lot to other thread models, especially POSIX.  Just as
+Perl is not C, though, Perl threads are not POSIX threads.  So if you
+find yourself looking for mutexes, or thread priorities, it's time to
+step back a bit and think about what you want to do and how Perl can
+do it.
+
+However it is important to remember that Perl threads cannot magically
+do things unless your operating systems threads allows it. So if your
+system blocks the entire process on sleep(), Perl usually will as well.
+
+Perl Threads Are Different.
+
+=head1 Thread-Safe Modules
+
+The addition of threads has changed Perl's internals
+substantially. There are implications for people who write
+modules with XS code or external libraries. However, since perl data is
+not shared among threads by default, Perl modules stand a high chance of
+being thread-safe or can be made thread-safe easily.  Modules that are not
+tagged as thread-safe should be tested or code reviewed before being used
+in production code.
+
+Not all modules that you might use are thread-safe, and you should
+always assume a module is unsafe unless the documentation says
+otherwise.  This includes modules that are distributed as part of the
+core.  Threads are a new feature, and even some of the standard
+modules aren't thread-safe.
+
+Even if a module is thread-safe, it doesn't mean that the module is optimized
+to work well with threads. A module could possibly be rewritten to utilize
+the new features in threaded Perl to increase performance in a threaded
+environment.
+
+If you're using a module that's not thread-safe for some reason, you
+can protect yourself by using it from one, and only one thread at all.
+If you need multiple threads to access such a module, you can use semaphores and
+lots of programming discipline to control access to it.  Semaphores
+are covered in L</"Basic semaphores">.
+
+See also L</"Thread-Safety of System Libraries">.
+
+=head1 Thread Basics
+
+The core L<threads> module provides the basic functions you need to write
+threaded programs.  In the following sections we'll cover the basics,
+showing you what you need to do to create a threaded program.   After
+that, we'll go over some of the features of the L<threads> module that
+make threaded programming easier.
+
+=head2 Basic Thread Support
+
+Thread support is a Perl compile-time option - it's something that's
+turned on or off when Perl is built at your site, rather than when
+your programs are compiled. If your Perl wasn't compiled with thread
+support enabled, then any attempt to use threads will fail.
+
+Your programs can use the Config module to check whether threads are
+enabled. If your program can't run without them, you can say something
+like:
+
+    $Config{useithreads} or die "Recompile Perl with threads to run this program.";
+
+A possibly-threaded program using a possibly-threaded module might
+have code like this:
+
+    use Config;
+    use MyMod;
+
+    BEGIN {
+        if ($Config{useithreads}) {
+            # We have threads
+            require MyMod_threaded;
+           import MyMod_threaded;
+        } else {
+           require MyMod_unthreaded;
+           import MyMod_unthreaded;
+        }
+    }
+
+Since code that runs both with and without threads is usually pretty
+messy, it's best to isolate the thread-specific code in its own
+module.  In our example above, that's what MyMod_threaded is, and it's
+only imported if we're running on a threaded Perl.
+
+=head2 A Note about the Examples
+
+Although thread support is considered to be stable, there are still a number
+of quirks that may startle you when you try out any of the examples below.
+In a real situation, care should be taken that all threads are finished
+executing before the program exits.  That care has B<not> been taken in these
+examples in the interest of simplicity.  Running these examples "as is" will
+produce error messages, usually caused by the fact that there are still
+threads running when the program exits.  You should not be alarmed by this.
+Future versions of Perl may fix this problem.
+
+=head2 Creating Threads
+
+The L<threads> package provides the tools you need to create new
+threads.  Like any other module, you need to tell Perl that you want to use
+it; C<use threads> imports all the pieces you need to create basic
+threads.
+
+The simplest, most straightforward way to create a thread is with new():
+
+    use threads; 
+
+    $thr = threads->new(\&sub1);
+
+    sub sub1 { 
+        print "In the thread\n"; 
+    }
+
+The new() method takes a reference to a subroutine and creates a new
+thread, which starts executing in the referenced subroutine.  Control
+then passes both to the subroutine and the caller.
+
+If you need to, your program can pass parameters to the subroutine as
+part of the thread startup.  Just include the list of parameters as
+part of the C<threads::new> call, like this:
+
+    use threads; 
+
+    $Param3 = "foo"; 
+    $thr = threads->new(\&sub1, "Param 1", "Param 2", $Param3); 
+    $thr = threads->new(\&sub1, @ParamList); 
+    $thr = threads->new(\&sub1, qw(Param1 Param2 Param3));
+
+    sub sub1 { 
+        my @InboundParameters = @_; 
+        print "In the thread\n"; 
+        print "got parameters >", join("<>", @InboundParameters), "<\n"; 
+    }
+
+
+The last example illustrates another feature of threads.  You can spawn
+off several threads using the same subroutine.  Each thread executes
+the same subroutine, but in a separate thread with a separate
+environment and potentially separate arguments.
+
+C<create()> is a synonym for C<new()>.
+
+=head2 Waiting For A Thread To Exit
+
+Since threads are also subroutines, they can return values.  To wait
+for a thread to exit and extract any values it might return, you can
+use the join() method:
+
+    use threads; 
+
+    $thr = threads->new(\&sub1);
+
+    @ReturnData = $thr->join; 
+    print "Thread returned @ReturnData"; 
+
+    sub sub1 { return "Fifty-six", "foo", 2; }
+
+In the example above, the join() method returns as soon as the thread
+ends.  In addition to waiting for a thread to finish and gathering up
+any values that the thread might have returned, join() also performs
+any OS cleanup necessary for the thread.  That cleanup might be
+important, especially for long-running programs that spawn lots of
+threads.  If you don't want the return values and don't want to wait
+for the thread to finish, you should call the detach() method
+instead, as described next.
+
+=head2 Ignoring A Thread
+
+join() does three things: it waits for a thread to exit, cleans up
+after it, and returns any data the thread may have produced.  But what
+if you're not interested in the thread's return values, and you don't
+really care when the thread finishes? All you want is for the thread
+to get cleaned up after when it's done.
+
+In this case, you use the detach() method.  Once a thread is detached,
+it'll run until it's finished, then Perl will clean up after it
+automatically.
+
+    use threads; 
+
+    $thr = threads->new(\&sub1); # Spawn the thread
+
+    $thr->detach; # Now we officially don't care any more
+
+    sub sub1 {
+        $a = 0; 
+        while (1) { 
+            $a++; 
+            print "\$a is $a\n"; 
+            sleep 1; 
+        } 
+    }
+
+Once a thread is detached, it may not be joined, and any return data
+that it might have produced (if it was done and waiting for a join) is
+lost.
+
+=head1 Threads And Data
+
+Now that we've covered the basics of threads, it's time for our next
+topic: data.  Threading introduces a couple of complications to data
+access that non-threaded programs never need to worry about.
+
+=head2 Shared And Unshared Data
+
+The biggest difference between Perl ithreads and the old 5.005 style
+threading, or for that matter, to most other threading systems out there,
+is that by default, no data is shared. When a new perl thread is created,
+all the data associated with the current thread is copied to the new
+thread, and is subsequently private to that new thread!
+This is similar in feel to what happens when a UNIX process forks,
+except that in this case, the data is just copied to a different part of
+memory within the same process rather than a real fork taking place.
+
+To make use of threading however, one usually wants the threads to share
+at least some data between themselves. This is done with the
+L<threads::shared> module and the C< : shared> attribute:
+
+    use threads;
+    use threads::shared;
+
+    my $foo : shared = 1;
+    my $bar = 1;
+    threads->new(sub { $foo++; $bar++ })->join;
+
+    print "$foo\n";  #prints 2 since $foo is shared
+    print "$bar\n";  #prints 1 since $bar is not shared
+
+In the case of a shared array, all the array's elements are shared, and for
+a shared hash, all the keys and values are shared. This places
+restrictions on what may be assigned to shared array and hash elements: only
+simple values or references to shared variables are allowed - this is
+so that a private variable can't accidentally become shared. A bad
+assignment will cause the thread to die. For example:
+
+    use threads;
+    use threads::shared;
+
+    my $var           = 1;
+    my $svar : shared = 2;
+    my %hash : shared;
+
+    ... create some threads ...
+
+    $hash{a} = 1;	# all threads see exists($hash{a}) and $hash{a} == 1
+    $hash{a} = $var	# okay - copy-by-value: same effect as previous
+    $hash{a} = $svar	# okay - copy-by-value: same effect as previous
+    $hash{a} = \$svar	# okay - a reference to a shared variable
+    $hash{a} = \$var	# This will die
+    delete $hash{a}	# okay - all threads will see !exists($hash{a})
+
+Note that a shared variable guarantees that if two or more threads try to
+modify it at the same time, the internal state of the variable will not
+become corrupted. However, there are no guarantees beyond this, as
+explained in the next section.
+
+=head2 Thread Pitfalls: Races
+
+While threads bring a new set of useful tools, they also bring a
+number of pitfalls.  One pitfall is the race condition:
+
+    use threads; 
+    use threads::shared;
+
+    my $a : shared = 1; 
+    $thr1 = threads->new(\&sub1); 
+    $thr2 = threads->new(\&sub2); 
+
+    $thr1->join;
+    $thr2->join;
+    print "$a\n";
+
+    sub sub1 { my $foo = $a; $a = $foo + 1; }
+    sub sub2 { my $bar = $a; $a = $bar + 1; }
+
+What do you think $a will be? The answer, unfortunately, is "it
+depends." Both sub1() and sub2() access the global variable $a, once
+to read and once to write.  Depending on factors ranging from your
+thread implementation's scheduling algorithm to the phase of the moon,
+$a can be 2 or 3.
+
+Race conditions are caused by unsynchronized access to shared
+data.  Without explicit synchronization, there's no way to be sure that
+nothing has happened to the shared data between the time you access it
+and the time you update it.  Even this simple code fragment has the
+possibility of error:
+
+    use threads; 
+    my $a : shared = 2;
+    my $b : shared;
+    my $c : shared;
+    my $thr1 = threads->create(sub { $b = $a; $a = $b + 1; }); 
+    my $thr2 = threads->create(sub { $c = $a; $a = $c + 1; });
+    $thr1->join;
+    $thr2->join;
+
+Two threads both access $a.  Each thread can potentially be interrupted
+at any point, or be executed in any order.  At the end, $a could be 3
+or 4, and both $b and $c could be 2 or 3.
+
+Even C<$a += 5> or C<$a++> are not guaranteed to be atomic.
+
+Whenever your program accesses data or resources that can be accessed
+by other threads, you must take steps to coordinate access or risk
+data inconsistency and race conditions. Note that Perl will protect its
+internals from your race conditions, but it won't protect you from you.
+
+=head1 Synchronization and control
+
+Perl provides a number of mechanisms to coordinate the interactions
+between themselves and their data, to avoid race conditions and the like.
+Some of these are designed to resemble the common techniques used in thread
+libraries such as C<pthreads>; others are Perl-specific. Often, the
+standard techniques are clumsy and difficult to get right (such as
+condition waits). Where possible, it is usually easier to use Perlish
+techniques such as queues, which remove some of the hard work involved.
+
+=head2 Controlling access: lock()
+
+The lock() function takes a shared variable and puts a lock on it.  
+No other thread may lock the variable until the variable is unlocked
+by the thread holding the lock. Unlocking happens automatically
+when the locking thread exits the outermost block that contains
+C<lock()> function.  Using lock() is straightforward: this example has
+several threads doing some calculations in parallel, and occasionally
+updating a running total:
+
+    use threads;
+    use threads::shared;
+
+    my $total : shared = 0;
+
+    sub calc {
+	for (;;) {
+	    my $result;
+	    # (... do some calculations and set $result ...)
+	    {
+		lock($total); # block until we obtain the lock
+		$total += $result;
+	    } # lock implicitly released at end of scope
+	    last if $result == 0;
+	}
+    }
+
+    my $thr1 = threads->new(\&calc);
+    my $thr2 = threads->new(\&calc);
+    my $thr3 = threads->new(\&calc);
+    $thr1->join;
+    $thr2->join;
+    $thr3->join;
+    print "total=$total\n";
+
+
+lock() blocks the thread until the variable being locked is
+available.  When lock() returns, your thread can be sure that no other
+thread can lock that variable until the outermost block containing the
+lock exits.
+
+It's important to note that locks don't prevent access to the variable
+in question, only lock attempts.  This is in keeping with Perl's
+longstanding tradition of courteous programming, and the advisory file
+locking that flock() gives you.  
+
+You may lock arrays and hashes as well as scalars.  Locking an array,
+though, will not block subsequent locks on array elements, just lock
+attempts on the array itself.
+
+Locks are recursive, which means it's okay for a thread to
+lock a variable more than once.  The lock will last until the outermost
+lock() on the variable goes out of scope. For example:
+
+    my $x : shared;
+    doit();
+
+    sub doit {
+	{
+	    {
+		lock($x); # wait for lock
+		lock($x); # NOOP - we already have the lock
+		{
+		    lock($x); # NOOP
+		    {
+			lock($x); # NOOP
+			lockit_some_more();
+		    }
+		}
+	    } # *** implicit unlock here ***
+	}
+    }
+
+    sub lockit_some_more {
+	lock($x); # NOOP
+    } # nothing happens here
+
+Note that there is no unlock() function - the only way to unlock a
+variable is to allow it to go out of scope.  
+
+A lock can either be used to guard the data contained within the variable
+being locked, or it can be used to guard something else, like a section
+of code. In this latter case, the variable in question does not hold any
+useful data, and exists only for the purpose of being locked. In this
+respect, the variable behaves like the mutexes and basic semaphores of
+traditional thread libraries.
+
+=head2 A Thread Pitfall: Deadlocks
+
+Locks are a handy tool to synchronize access to data, and using them
+properly is the key to safe shared data.  Unfortunately, locks aren't
+without their dangers, especially when multiple locks are involved.
+Consider the following code:
+
+    use threads; 
+
+    my $a : shared = 4; 
+    my $b : shared = "foo"; 
+    my $thr1 = threads->new(sub { 
+        lock($a); 
+        sleep 20; 
+        lock($b); 
+    }); 
+    my $thr2 = threads->new(sub { 
+        lock($b); 
+        sleep 20; 
+        lock($a); 
+    });
+
+This program will probably hang until you kill it.  The only way it
+won't hang is if one of the two threads acquires both locks
+first.  A guaranteed-to-hang version is more complicated, but the
+principle is the same.
+
+The first thread will grab a lock on $a, then, after a pause during which
+the second thread has probably had time to do some work, try to grab a
+lock on $b.  Meanwhile, the second thread grabs a lock on $b, then later
+tries to grab a lock on $a.  The second lock attempt for both threads will
+block, each waiting for the other to release its lock.
+
+This condition is called a deadlock, and it occurs whenever two or
+more threads are trying to get locks on resources that the others
+own.  Each thread will block, waiting for the other to release a lock
+on a resource.  That never happens, though, since the thread with the
+resource is itself waiting for a lock to be released.
+
+There are a number of ways to handle this sort of problem.  The best
+way is to always have all threads acquire locks in the exact same
+order.  If, for example, you lock variables $a, $b, and $c, always lock
+$a before $b, and $b before $c.  It's also best to hold on to locks for
+as short a period of time to minimize the risks of deadlock.
+
+The other synchronization primitives described below can suffer from
+similar problems.
+
+=head2 Queues: Passing Data Around
+
+A queue is a special thread-safe object that lets you put data in one
+end and take it out the other without having to worry about
+synchronization issues.  They're pretty straightforward, and look like
+this:
+
+    use threads; 
+    use Thread::Queue;
+
+    my $DataQueue = Thread::Queue->new; 
+    $thr = threads->new(sub { 
+        while ($DataElement = $DataQueue->dequeue) { 
+            print "Popped $DataElement off the queue\n";
+        } 
+    }); 
+
+    $DataQueue->enqueue(12); 
+    $DataQueue->enqueue("A", "B", "C"); 
+    $DataQueue->enqueue(\$thr); 
+    sleep 10; 
+    $DataQueue->enqueue(undef);
+    $thr->join;
+
+You create the queue with C<new Thread::Queue>.  Then you can
+add lists of scalars onto the end with enqueue(), and pop scalars off
+the front of it with dequeue().  A queue has no fixed size, and can grow
+as needed to hold everything pushed on to it.
+
+If a queue is empty, dequeue() blocks until another thread enqueues
+something.  This makes queues ideal for event loops and other
+communications between threads.
+
+=head2 Semaphores: Synchronizing Data Access
+
+Semaphores are a kind of generic locking mechanism. In their most basic
+form, they behave very much like lockable scalars, except that they
+can't hold data, and that they must be explicitly unlocked. In their
+advanced form, they act like a kind of counter, and can allow multiple
+threads to have the 'lock' at any one time.
+
+=head2 Basic semaphores
+
+Semaphores have two methods, down() and up(): down() decrements the resource
+count, while up increments it. Calls to down() will block if the
+semaphore's current count would decrement below zero.  This program
+gives a quick demonstration:
+
+    use threads;
+    use Thread::Semaphore; 
+
+    my $semaphore = new Thread::Semaphore; 
+    my $GlobalVariable : shared = 0;
+
+    $thr1 = new threads \&sample_sub, 1; 
+    $thr2 = new threads \&sample_sub, 2; 
+    $thr3 = new threads \&sample_sub, 3;
+
+    sub sample_sub { 
+        my $SubNumber = shift @_; 
+        my $TryCount = 10; 
+        my $LocalCopy; 
+        sleep 1; 
+        while ($TryCount--) { 
+            $semaphore->down; 
+            $LocalCopy = $GlobalVariable; 
+            print "$TryCount tries left for sub $SubNumber (\$GlobalVariable is $GlobalVariable)\n"; 
+            sleep 2; 
+            $LocalCopy++; 
+            $GlobalVariable = $LocalCopy; 
+            $semaphore->up; 
+        } 
+    }
+
+    $thr1->join;
+    $thr2->join;
+    $thr3->join;
+
+The three invocations of the subroutine all operate in sync.  The
+semaphore, though, makes sure that only one thread is accessing the
+global variable at once.
+
+=head2 Advanced Semaphores
+
+By default, semaphores behave like locks, letting only one thread
+down() them at a time.  However, there are other uses for semaphores.
+
+Each semaphore has a counter attached to it. By default, semaphores are
+created with the counter set to one, down() decrements the counter by
+one, and up() increments by one. However, we can override any or all
+of these defaults simply by passing in different values:
+
+    use threads;
+    use Thread::Semaphore;
+    my $semaphore = Thread::Semaphore->new(5);
+                    # Creates a semaphore with the counter set to five
+
+    $thr1 = threads->new(\&sub1);
+    $thr2 = threads->new(\&sub1);
+
+    sub sub1 {
+        $semaphore->down(5); # Decrements the counter by five
+        # Do stuff here
+        $semaphore->up(5); # Increment the counter by five
+    }
+
+    $thr1->detach;
+    $thr2->detach;
+
+If down() attempts to decrement the counter below zero, it blocks until
+the counter is large enough.  Note that while a semaphore can be created
+with a starting count of zero, any up() or down() always changes the
+counter by at least one, and so $semaphore->down(0) is the same as
+$semaphore->down(1).
+
+The question, of course, is why would you do something like this? Why
+create a semaphore with a starting count that's not one, or why
+decrement/increment it by more than one? The answer is resource
+availability.  Many resources that you want to manage access for can be
+safely used by more than one thread at once.
+
+For example, let's take a GUI driven program.  It has a semaphore that
+it uses to synchronize access to the display, so only one thread is
+ever drawing at once.  Handy, but of course you don't want any thread
+to start drawing until things are properly set up.  In this case, you
+can create a semaphore with a counter set to zero, and up it when
+things are ready for drawing.
+
+Semaphores with counters greater than one are also useful for
+establishing quotas.  Say, for example, that you have a number of
+threads that can do I/O at once.  You don't want all the threads
+reading or writing at once though, since that can potentially swamp
+your I/O channels, or deplete your process' quota of filehandles.  You
+can use a semaphore initialized to the number of concurrent I/O
+requests (or open files) that you want at any one time, and have your
+threads quietly block and unblock themselves.
+
+Larger increments or decrements are handy in those cases where a
+thread needs to check out or return a number of resources at once.
+
+=head2 cond_wait() and cond_signal()
+
+These two functions can be used in conjunction with locks to notify
+co-operating threads that a resource has become available. They are
+very similar in use to the functions found in C<pthreads>. However
+for most purposes, queues are simpler to use and more intuitive. See
+L<threads::shared> for more details.
+
+=head2 Giving up control
+
+There are times when you may find it useful to have a thread
+explicitly give up the CPU to another thread.  You may be doing something
+processor-intensive and want to make sure that the user-interface thread
+gets called frequently.  Regardless, there are times that you might want
+a thread to give up the processor.
+
+Perl's threading package provides the yield() function that does
+this. yield() is pretty straightforward, and works like this:
+
+    use threads; 
+
+    sub loop {
+	    my $thread = shift;
+	    my $foo = 50;
+	    while($foo--) { print "in thread $thread\n" }
+	    threads->yield;
+	    $foo = 50;
+	    while($foo--) { print "in thread $thread\n" }
+    }
+
+    my $thread1 = threads->new(\&loop, 'first');
+    my $thread2 = threads->new(\&loop, 'second');
+    my $thread3 = threads->new(\&loop, 'third');
+
+It is important to remember that yield() is only a hint to give up the CPU,
+it depends on your hardware, OS and threading libraries what actually happens.
+B<On many operating systems, yield() is a no-op.>  Therefore it is important
+to note that one should not build the scheduling of the threads around
+yield() calls. It might work on your platform but it won't work on another
+platform.
+
+=head1 General Thread Utility Routines
+
+We've covered the workhorse parts of Perl's threading package, and
+with these tools you should be well on your way to writing threaded
+code and packages.  There are a few useful little pieces that didn't
+really fit in anyplace else.
+
+=head2 What Thread Am I In?
+
+The C<< threads->self >> class method provides your program with a way to
+get an object representing the thread it's currently in.  You can use this
+object in the same way as the ones returned from thread creation.
+
+=head2 Thread IDs
+
+tid() is a thread object method that returns the thread ID of the
+thread the object represents.  Thread IDs are integers, with the main
+thread in a program being 0.  Currently Perl assigns a unique tid to
+every thread ever created in your program, assigning the first thread
+to be created a tid of 1, and increasing the tid by 1 for each new
+thread that's created.
+
+=head2 Are These Threads The Same?
+
+The equal() method takes two thread objects and returns true 
+if the objects represent the same thread, and false if they don't.
+
+Thread objects also have an overloaded == comparison so that you can do
+comparison on them as you would with normal objects.
+
+=head2 What Threads Are Running?
+
+C<< threads->list >> returns a list of thread objects, one for each thread
+that's currently running and not detached.  Handy for a number of things,
+including cleaning up at the end of your program:
+
+    # Loop through all the threads 
+    foreach $thr (threads->list) { 
+        # Don't join the main thread or ourselves 
+        if ($thr->tid && !threads::equal($thr, threads->self)) { 
+            $thr->join; 
+        } 
+    }
+
+If some threads have not finished running when the main Perl thread
+ends, Perl will warn you about it and die, since it is impossible for Perl
+to clean up itself while other threads are running
+
+=head1 A Complete Example
+
+Confused yet? It's time for an example program to show some of the
+things we've covered.  This program finds prime numbers using threads.
+
+    1  #!/usr/bin/perl -w
+    2  # prime-pthread, courtesy of Tom Christiansen
+    3
+    4  use strict;
+    5
+    6  use threads;
+    7  use Thread::Queue;
+    8
+    9  my $stream = new Thread::Queue;
+    10 my $kid    = new threads(\&check_num, $stream, 2);
+    11
+    12 for my $i ( 3 .. 1000 ) {
+    13     $stream->enqueue($i);
+    14 } 
+    15
+    16 $stream->enqueue(undef);
+    17 $kid->join;
+    18
+    19 sub check_num {
+    20     my ($upstream, $cur_prime) = @_;
+    21     my $kid;
+    22     my $downstream = new Thread::Queue;
+    23     while (my $num = $upstream->dequeue) {
+    24         next unless $num % $cur_prime;
+    25         if ($kid) {
+    26            $downstream->enqueue($num);
+    27          	} else {
+    28            print "Found prime $num\n";
+    29	              $kid = new threads(\&check_num, $downstream, $num);
+    30         }
+    31     } 
+    32     $downstream->enqueue(undef) if $kid;
+    33     $kid->join		if $kid;
+    34 }
+
+This program uses the pipeline model to generate prime numbers.  Each
+thread in the pipeline has an input queue that feeds numbers to be
+checked, a prime number that it's responsible for, and an output queue
+into which it funnels numbers that have failed the check.  If the thread
+has a number that's failed its check and there's no child thread, then
+the thread must have found a new prime number.  In that case, a new
+child thread is created for that prime and stuck on the end of the
+pipeline.
+
+This probably sounds a bit more confusing than it really is, so let's
+go through this program piece by piece and see what it does.  (For
+those of you who might be trying to remember exactly what a prime
+number is, it's a number that's only evenly divisible by itself and 1)
+
+The bulk of the work is done by the check_num() subroutine, which
+takes a reference to its input queue and a prime number that it's
+responsible for.  After pulling in the input queue and the prime that
+the subroutine's checking (line 20), we create a new queue (line 22)
+and reserve a scalar for the thread that we're likely to create later
+(line 21).
+
+The while loop from lines 23 to line 31 grabs a scalar off the input
+queue and checks against the prime this thread is responsible
+for.  Line 24 checks to see if there's a remainder when we modulo the
+number to be checked against our prime.  If there is one, the number
+must not be evenly divisible by our prime, so we need to either pass
+it on to the next thread if we've created one (line 26) or create a
+new thread if we haven't.
+
+The new thread creation is line 29.  We pass on to it a reference to
+the queue we've created, and the prime number we've found.
+
+Finally, once the loop terminates (because we got a 0 or undef in the
+queue, which serves as a note to die), we pass on the notice to our
+child and wait for it to exit if we've created a child (lines 32 and
+37).
+
+Meanwhile, back in the main thread, we create a queue (line 9) and the
+initial child thread (line 10), and pre-seed it with the first prime:
+2.  Then we queue all the numbers from 3 to 1000 for checking (lines
+12-14), then queue a die notice (line 16) and wait for the first child
+thread to terminate (line 17).  Because a child won't die until its
+child has died, we know that we're done once we return from the join.
+
+That's how it works.  It's pretty simple; as with many Perl programs,
+the explanation is much longer than the program.
+
+=head1 Different implementations of threads
+
+Some background on thread implementations from the operating system
+viewpoint.  There are three basic categories of threads: user-mode threads,
+kernel threads, and multiprocessor kernel threads.
+
+User-mode threads are threads that live entirely within a program and
+its libraries.  In this model, the OS knows nothing about threads.  As
+far as it's concerned, your process is just a process.
+
+This is the easiest way to implement threads, and the way most OSes
+start.  The big disadvantage is that, since the OS knows nothing about
+threads, if one thread blocks they all do.  Typical blocking activities
+include most system calls, most I/O, and things like sleep().
+
+Kernel threads are the next step in thread evolution.  The OS knows
+about kernel threads, and makes allowances for them.  The main
+difference between a kernel thread and a user-mode thread is
+blocking.  With kernel threads, things that block a single thread don't
+block other threads.  This is not the case with user-mode threads,
+where the kernel blocks at the process level and not the thread level.
+
+This is a big step forward, and can give a threaded program quite a
+performance boost over non-threaded programs.  Threads that block
+performing I/O, for example, won't block threads that are doing other
+things.  Each process still has only one thread running at once,
+though, regardless of how many CPUs a system might have.
+
+Since kernel threading can interrupt a thread at any time, they will
+uncover some of the implicit locking assumptions you may make in your
+program.  For example, something as simple as C<$a = $a + 2> can behave
+unpredictably with kernel threads if $a is visible to other
+threads, as another thread may have changed $a between the time it
+was fetched on the right hand side and the time the new value is
+stored.
+
+Multiprocessor kernel threads are the final step in thread
+support.  With multiprocessor kernel threads on a machine with multiple
+CPUs, the OS may schedule two or more threads to run simultaneously on
+different CPUs.
+
+This can give a serious performance boost to your threaded program,
+since more than one thread will be executing at the same time.  As a
+tradeoff, though, any of those nagging synchronization issues that
+might not have shown with basic kernel threads will appear with a
+vengeance.
+
+In addition to the different levels of OS involvement in threads,
+different OSes (and different thread implementations for a particular
+OS) allocate CPU cycles to threads in different ways.
+
+Cooperative multitasking systems have running threads give up control
+if one of two things happen.  If a thread calls a yield function, it
+gives up control.  It also gives up control if the thread does
+something that would cause it to block, such as perform I/O.  In a
+cooperative multitasking implementation, one thread can starve all the
+others for CPU time if it so chooses.
+
+Preemptive multitasking systems interrupt threads at regular intervals
+while the system decides which thread should run next.  In a preemptive
+multitasking system, one thread usually won't monopolize the CPU.
+
+On some systems, there can be cooperative and preemptive threads
+running simultaneously. (Threads running with realtime priorities
+often behave cooperatively, for example, while threads running at
+normal priorities behave preemptively.)
+
+Most modern operating systems support preemptive multitasking nowadays.
+
+=head1 Performance considerations
+
+The main thing to bear in mind when comparing ithreads to other threading
+models is the fact that for each new thread created, a complete copy of
+all the variables and data of the parent thread has to be taken. Thus
+thread creation can be quite expensive, both in terms of memory usage and
+time spent in creation. The ideal way to reduce these costs is to have a
+relatively short number of long-lived threads, all created fairly early
+on -  before the base thread has accumulated too much data. Of course, this
+may not always be possible, so compromises have to be made. However, after
+a thread has been created, its performance and extra memory usage should
+be little different than ordinary code.
+
+Also note that under the current implementation, shared variables
+use a little more memory and are a little slower than ordinary variables.
+
+=head1 Process-scope Changes
+
+Note that while threads themselves are separate execution threads and
+Perl data is thread-private unless explicitly shared, the threads can
+affect process-scope state, affecting all the threads.
+
+The most common example of this is changing the current working
+directory using chdir().  One thread calls chdir(), and the working
+directory of all the threads changes.
+
+Even more drastic example of a process-scope change is chroot():
+the root directory of all the threads changes, and no thread can
+undo it (as opposed to chdir()).
+
+Further examples of process-scope changes include umask() and
+changing uids/gids.
+
+Thinking of mixing fork() and threads?  Please lie down and wait
+until the feeling passes.  Be aware that the semantics of fork() vary
+between platforms.  For example, some UNIX systems copy all the current
+threads into the child process, while others only copy the thread that
+called fork(). You have been warned!
+
+Similarly, mixing signals and threads should not be attempted.
+Implementations are platform-dependent, and even the POSIX
+semantics may not be what you expect (and Perl doesn't even
+give you the full POSIX API).
+
+=head1 Thread-Safety of System Libraries
+
+Whether various library calls are thread-safe is outside the control
+of Perl.  Calls often suffering from not being thread-safe include:
+localtime(), gmtime(), get{gr,host,net,proto,serv,pw}*(), readdir(),
+rand(), and srand() -- in general, calls that depend on some global
+external state.
+
+If the system Perl is compiled in has thread-safe variants of such
+calls, they will be used.  Beyond that, Perl is at the mercy of
+the thread-safety or -unsafety of the calls.  Please consult your
+C library call documentation.
+
+On some platforms the thread-safe library interfaces may fail if the
+result buffer is too small (for example the user group databases may
+be rather large, and the reentrant interfaces may have to carry around
+a full snapshot of those databases).  Perl will start with a small
+buffer, but keep retrying and growing the result buffer
+until the result fits.  If this limitless growing sounds bad for
+security or memory consumption reasons you can recompile Perl with
+PERL_REENTRANT_MAXSIZE defined to the maximum number of bytes you will
+allow.
+
+=head1 Conclusion
+
+A complete thread tutorial could fill a book (and has, many times),
+but with what we've covered in this introduction, you should be well
+on your way to becoming a threaded Perl expert.
+
+=head1 Bibliography
+
+Here's a short bibliography courtesy of Jürgen Christoffel:
+
+=head2 Introductory Texts
+
+Birrell, Andrew D. An Introduction to Programming with
+Threads. Digital Equipment Corporation, 1989, DEC-SRC Research Report
+#35 online as
+http://gatekeeper.dec.com/pub/DEC/SRC/research-reports/abstracts/src-rr-035.html
+(highly recommended)
+
+Robbins, Kay. A., and Steven Robbins. Practical Unix Programming: A
+Guide to Concurrency, Communication, and
+Multithreading. Prentice-Hall, 1996.
+
+Lewis, Bill, and Daniel J. Berg. Multithreaded Programming with
+Pthreads. Prentice Hall, 1997, ISBN 0-13-443698-9 (a well-written
+introduction to threads).
+
+Nelson, Greg (editor). Systems Programming with Modula-3.  Prentice
+Hall, 1991, ISBN 0-13-590464-1.
+
+Nichols, Bradford, Dick Buttlar, and Jacqueline Proulx Farrell.
+Pthreads Programming. O'Reilly & Associates, 1996, ISBN 156592-115-1
+(covers POSIX threads).
+
+=head2 OS-Related References
+
+Boykin, Joseph, David Kirschen, Alan Langerman, and Susan
+LoVerso. Programming under Mach. Addison-Wesley, 1994, ISBN
+0-201-52739-1.
+
+Tanenbaum, Andrew S. Distributed Operating Systems. Prentice Hall,
+1995, ISBN 0-13-219908-4 (great textbook).
+
+Silberschatz, Abraham, and Peter B. Galvin. Operating System Concepts,
+4th ed. Addison-Wesley, 1995, ISBN 0-201-59292-4
+
+=head2 Other References
+
+Arnold, Ken and James Gosling. The Java Programming Language, 2nd
+ed. Addison-Wesley, 1998, ISBN 0-201-31006-6.
+
+comp.programming.threads FAQ,
+L<http://www.serpentine.com/~bos/threads-faq/>
+
+Le Sergent, T. and B. Berthomieu. "Incremental MultiThreaded Garbage
+Collection on Virtually Shared Memory Architectures" in Memory
+Management: Proc. of the International Workshop IWMM 92, St. Malo,
+France, September 1992, Yves Bekkers and Jacques Cohen, eds. Springer,
+1992, ISBN 3540-55940-X (real-life thread applications).
+
+Artur Bergman, "Where Wizards Fear To Tread", June 11, 2002,
+L<http://www.perl.com/pub/a/2002/06/11/threads.html>
+
+=head1 Acknowledgements
+
+Thanks (in no particular order) to Chaim Frenkel, Steve Fink, Gurusamy
+Sarathy, Ilya Zakharevich, Benjamin Sugars, Jürgen Christoffel, Joshua
+Pritikin, and Alan Burlison, for their help in reality-checking and
+polishing this article.  Big thanks to Tom Christiansen for his rewrite
+of the prime number generator.
+
+=head1 AUTHOR
+
+Dan Sugalski E<lt>dan@sidhe.org<gt>
+
+Slightly modified by Arthur Bergman to fit the new thread model/module.
+
+Reworked slightly by Jörg Walter E<lt>jwalt@cpan.org<gt> to be more concise
+about thread-safety of perl code.
+
+Rearranged slightly by Elizabeth Mattijsen E<lt>liz@dijkmat.nl<gt> to put
+less emphasis on yield().
+
+=head1 Copyrights
+
+The original version of this article originally appeared in The Perl
+Journal #10, and is copyright 1998 The Perl Journal. It appears courtesy
+of Jon Orwant and The Perl Journal.  This document may be distributed
+under the same terms as Perl itself.
+
+For more information please see L<threads> and L<threads::shared>.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perltie.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perltie.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perltie.pod	(revision 14489)
@@ -0,0 +1,1189 @@
+=head1 NAME
+X<tie>
+
+perltie - how to hide an object class in a simple variable
+
+=head1 SYNOPSIS
+
+ tie VARIABLE, CLASSNAME, LIST
+
+ $object = tied VARIABLE
+
+ untie VARIABLE
+
+=head1 DESCRIPTION
+
+Prior to release 5.0 of Perl, a programmer could use dbmopen()
+to connect an on-disk database in the standard Unix dbm(3x)
+format magically to a %HASH in their program.  However, their Perl was either
+built with one particular dbm library or another, but not both, and
+you couldn't extend this mechanism to other packages or types of variables.
+
+Now you can.
+
+The tie() function binds a variable to a class (package) that will provide
+the implementation for access methods for that variable.  Once this magic
+has been performed, accessing a tied variable automatically triggers
+method calls in the proper class.  The complexity of the class is
+hidden behind magic methods calls.  The method names are in ALL CAPS,
+which is a convention that Perl uses to indicate that they're called
+implicitly rather than explicitly--just like the BEGIN() and END()
+functions.
+
+In the tie() call, C<VARIABLE> is the name of the variable to be
+enchanted.  C<CLASSNAME> is the name of a class implementing objects of
+the correct type.  Any additional arguments in the C<LIST> are passed to
+the appropriate constructor method for that class--meaning TIESCALAR(),
+TIEARRAY(), TIEHASH(), or TIEHANDLE().  (Typically these are arguments
+such as might be passed to the dbminit() function of C.) The object
+returned by the "new" method is also returned by the tie() function,
+which would be useful if you wanted to access other methods in
+C<CLASSNAME>. (You don't actually have to return a reference to a right
+"type" (e.g., HASH or C<CLASSNAME>) so long as it's a properly blessed
+object.)  You can also retrieve a reference to the underlying object
+using the tied() function.
+
+Unlike dbmopen(), the tie() function will not C<use> or C<require> a module
+for you--you need to do that explicitly yourself.
+
+=head2 Tying Scalars
+X<scalar, tying>
+
+A class implementing a tied scalar should define the following methods:
+TIESCALAR, FETCH, STORE, and possibly UNTIE and/or DESTROY.
+
+Let's look at each in turn, using as an example a tie class for
+scalars that allows the user to do something like:
+
+    tie $his_speed, 'Nice', getppid();
+    tie $my_speed,  'Nice', $$;
+
+And now whenever either of those variables is accessed, its current
+system priority is retrieved and returned.  If those variables are set,
+then the process's priority is changed!
+
+We'll use Jarkko Hietaniemi <F<jhi@iki.fi>>'s BSD::Resource class (not
+included) to access the PRIO_PROCESS, PRIO_MIN, and PRIO_MAX constants
+from your system, as well as the getpriority() and setpriority() system
+calls.  Here's the preamble of the class.
+
+    package Nice;
+    use Carp;
+    use BSD::Resource;
+    use strict;
+    $Nice::DEBUG = 0 unless defined $Nice::DEBUG;
+
+=over 4
+
+=item TIESCALAR classname, LIST
+X<TIESCALAR>
+
+This is the constructor for the class.  That means it is
+expected to return a blessed reference to a new scalar
+(probably anonymous) that it's creating.  For example:
+
+    sub TIESCALAR {
+        my $class = shift;
+        my $pid = shift || $$; # 0 means me
+
+        if ($pid !~ /^\d+$/) {
+            carp "Nice::Tie::Scalar got non-numeric pid $pid" if $^W;
+            return undef;
+        }
+
+        unless (kill 0, $pid) { # EPERM or ERSCH, no doubt
+            carp "Nice::Tie::Scalar got bad pid $pid: $!" if $^W;
+            return undef;
+        }
+
+        return bless \$pid, $class;
+    }
+
+This tie class has chosen to return an error rather than raising an
+exception if its constructor should fail.  While this is how dbmopen() works,
+other classes may well not wish to be so forgiving.  It checks the global
+variable C<$^W> to see whether to emit a bit of noise anyway.
+
+=item FETCH this
+X<FETCH>
+
+This method will be triggered every time the tied variable is accessed
+(read).  It takes no arguments beyond its self reference, which is the
+object representing the scalar we're dealing with.  Because in this case
+we're using just a SCALAR ref for the tied scalar object, a simple $$self
+allows the method to get at the real value stored there.  In our example
+below, that real value is the process ID to which we've tied our variable.
+
+    sub FETCH {
+        my $self = shift;
+        confess "wrong type" unless ref $self;
+        croak "usage error" if @_;
+        my $nicety;
+        local($!) = 0;
+        $nicety = getpriority(PRIO_PROCESS, $$self);
+        if ($!) { croak "getpriority failed: $!" }
+        return $nicety;
+    }
+
+This time we've decided to blow up (raise an exception) if the renice
+fails--there's no place for us to return an error otherwise, and it's
+probably the right thing to do.
+
+=item STORE this, value
+X<STORE>
+
+This method will be triggered every time the tied variable is set
+(assigned).  Beyond its self reference, it also expects one (and only one)
+argument--the new value the user is trying to assign. Don't worry about
+returning a value from STORE -- the semantic of assignment returning the
+assigned value is implemented with FETCH.
+
+    sub STORE {
+        my $self = shift;
+        confess "wrong type" unless ref $self;
+        my $new_nicety = shift;
+        croak "usage error" if @_;
+
+        if ($new_nicety < PRIO_MIN) {
+            carp sprintf
+              "WARNING: priority %d less than minimum system priority %d",
+                  $new_nicety, PRIO_MIN if $^W;
+            $new_nicety = PRIO_MIN;
+        }
+
+        if ($new_nicety > PRIO_MAX) {
+            carp sprintf
+              "WARNING: priority %d greater than maximum system priority %d",
+                  $new_nicety, PRIO_MAX if $^W;
+            $new_nicety = PRIO_MAX;
+        }
+
+        unless (defined setpriority(PRIO_PROCESS, $$self, $new_nicety)) {
+            confess "setpriority failed: $!";
+        }
+    }
+
+=item UNTIE this
+X<UNTIE>
+
+This method will be triggered when the C<untie> occurs. This can be useful
+if the class needs to know when no further calls will be made. (Except DESTROY
+of course.) See L<The C<untie> Gotcha> below for more details.
+
+=item DESTROY this
+X<DESTROY>
+
+This method will be triggered when the tied variable needs to be destructed.
+As with other object classes, such a method is seldom necessary, because Perl
+deallocates its moribund object's memory for you automatically--this isn't
+C++, you know.  We'll use a DESTROY method here for debugging purposes only.
+
+    sub DESTROY {
+        my $self = shift;
+        confess "wrong type" unless ref $self;
+        carp "[ Nice::DESTROY pid $$self ]" if $Nice::DEBUG;
+    }
+
+=back
+
+That's about all there is to it.  Actually, it's more than all there
+is to it, because we've done a few nice things here for the sake
+of completeness, robustness, and general aesthetics.  Simpler
+TIESCALAR classes are certainly possible.
+
+=head2 Tying Arrays
+X<array, tying>
+
+A class implementing a tied ordinary array should define the following
+methods: TIEARRAY, FETCH, STORE, FETCHSIZE, STORESIZE and perhaps UNTIE and/or DESTROY.
+
+FETCHSIZE and STORESIZE are used to provide C<$#array> and
+equivalent C<scalar(@array)> access.
+
+The methods POP, PUSH, SHIFT, UNSHIFT, SPLICE, DELETE, and EXISTS are
+required if the perl operator with the corresponding (but lowercase) name
+is to operate on the tied array. The B<Tie::Array> class can be used as a
+base class to implement the first five of these in terms of the basic
+methods above.  The default implementations of DELETE and EXISTS in
+B<Tie::Array> simply C<croak>.
+
+In addition EXTEND will be called when perl would have pre-extended
+allocation in a real array.
+
+For this discussion, we'll implement an array whose elements are a fixed
+size at creation.  If you try to create an element larger than the fixed
+size, you'll take an exception.  For example:
+
+    use FixedElem_Array;
+    tie @array, 'FixedElem_Array', 3;
+    $array[0] = 'cat';  # ok.
+    $array[1] = 'dogs'; # exception, length('dogs') > 3.
+
+The preamble code for the class is as follows:
+
+    package FixedElem_Array;
+    use Carp;
+    use strict;
+
+=over 4
+
+=item TIEARRAY classname, LIST
+X<TIEARRAY>
+
+This is the constructor for the class.  That means it is expected to
+return a blessed reference through which the new array (probably an
+anonymous ARRAY ref) will be accessed.
+
+In our example, just to show you that you don't I<really> have to return an
+ARRAY reference, we'll choose a HASH reference to represent our object.
+A HASH works out well as a generic record type: the C<{ELEMSIZE}> field will
+store the maximum element size allowed, and the C<{ARRAY}> field will hold the
+true ARRAY ref.  If someone outside the class tries to dereference the
+object returned (doubtless thinking it an ARRAY ref), they'll blow up.
+This just goes to show you that you should respect an object's privacy.
+
+    sub TIEARRAY {
+      my $class    = shift;
+      my $elemsize = shift;
+      if ( @_ || $elemsize =~ /\D/ ) {
+        croak "usage: tie ARRAY, '" . __PACKAGE__ . "', elem_size";
+      }
+      return bless {
+        ELEMSIZE => $elemsize,
+        ARRAY    => [],
+      }, $class;
+    }
+
+=item FETCH this, index
+X<FETCH>
+
+This method will be triggered every time an individual element the tied array
+is accessed (read).  It takes one argument beyond its self reference: the
+index whose value we're trying to fetch.
+
+    sub FETCH {
+      my $self  = shift;
+      my $index = shift;
+      return $self->{ARRAY}->[$index];
+    }
+
+If a negative array index is used to read from an array, the index
+will be translated to a positive one internally by calling FETCHSIZE
+before being passed to FETCH.  You may disable this feature by
+assigning a true value to the variable C<$NEGATIVE_INDICES> in the
+tied array class.
+
+As you may have noticed, the name of the FETCH method (et al.) is the same
+for all accesses, even though the constructors differ in names (TIESCALAR
+vs TIEARRAY).  While in theory you could have the same class servicing
+several tied types, in practice this becomes cumbersome, and it's easiest
+to keep them at simply one tie type per class.
+
+=item STORE this, index, value
+X<STORE>
+
+This method will be triggered every time an element in the tied array is set
+(written).  It takes two arguments beyond its self reference: the index at
+which we're trying to store something and the value we're trying to put
+there.
+
+In our example, C<undef> is really C<$self-E<gt>{ELEMSIZE}> number of
+spaces so we have a little more work to do here:
+
+    sub STORE {
+      my $self = shift;
+      my( $index, $value ) = @_;
+      if ( length $value > $self->{ELEMSIZE} ) {
+        croak "length of $value is greater than $self->{ELEMSIZE}";
+      }
+      # fill in the blanks
+      $self->EXTEND( $index ) if $index > $self->FETCHSIZE();
+      # right justify to keep element size for smaller elements
+      $self->{ARRAY}->[$index] = sprintf "%$self->{ELEMSIZE}s", $value;
+    }
+
+Negative indexes are treated the same as with FETCH.
+
+=item FETCHSIZE this
+X<FETCHSIZE>
+
+Returns the total number of items in the tied array associated with
+object I<this>. (Equivalent to C<scalar(@array)>).  For example:
+
+    sub FETCHSIZE {
+      my $self = shift;
+      return scalar @{$self->{ARRAY}};
+    }
+
+=item STORESIZE this, count
+X<STORESIZE>
+
+Sets the total number of items in the tied array associated with
+object I<this> to be I<count>. If this makes the array larger then
+class's mapping of C<undef> should be returned for new positions.
+If the array becomes smaller then entries beyond count should be
+deleted. 
+
+In our example, 'undef' is really an element containing
+C<$self-E<gt>{ELEMSIZE}> number of spaces.  Observe:
+
+    sub STORESIZE {
+      my $self  = shift;
+      my $count = shift;
+      if ( $count > $self->FETCHSIZE() ) {
+        foreach ( $count - $self->FETCHSIZE() .. $count ) {
+          $self->STORE( $_, '' );
+        }
+      } elsif ( $count < $self->FETCHSIZE() ) {
+        foreach ( 0 .. $self->FETCHSIZE() - $count - 2 ) {
+          $self->POP();
+        }
+      }
+    }
+
+=item EXTEND this, count
+X<EXTEND>
+
+Informative call that array is likely to grow to have I<count> entries.
+Can be used to optimize allocation. This method need do nothing.
+
+In our example, we want to make sure there are no blank (C<undef>)
+entries, so C<EXTEND> will make use of C<STORESIZE> to fill elements
+as needed:
+
+    sub EXTEND {   
+      my $self  = shift;
+      my $count = shift;
+      $self->STORESIZE( $count );
+    }
+
+=item EXISTS this, key
+X<EXISTS>
+
+Verify that the element at index I<key> exists in the tied array I<this>.
+
+In our example, we will determine that if an element consists of
+C<$self-E<gt>{ELEMSIZE}> spaces only, it does not exist:
+
+    sub EXISTS {
+      my $self  = shift;
+      my $index = shift;
+      return 0 if ! defined $self->{ARRAY}->[$index] ||
+                  $self->{ARRAY}->[$index] eq ' ' x $self->{ELEMSIZE};
+      return 1;
+    }
+
+=item DELETE this, key
+X<DELETE>
+
+Delete the element at index I<key> from the tied array I<this>.
+
+In our example, a deleted item is C<$self-E<gt>{ELEMSIZE}> spaces:
+
+    sub DELETE {
+      my $self  = shift;
+      my $index = shift;
+      return $self->STORE( $index, '' );
+    }
+
+=item CLEAR this
+X<CLEAR>
+
+Clear (remove, delete, ...) all values from the tied array associated with
+object I<this>.  For example:
+
+    sub CLEAR {
+      my $self = shift;
+      return $self->{ARRAY} = [];
+    }
+
+=item PUSH this, LIST 
+X<PUSH>
+
+Append elements of I<LIST> to the array.  For example:
+
+    sub PUSH {  
+      my $self = shift;
+      my @list = @_;
+      my $last = $self->FETCHSIZE();
+      $self->STORE( $last + $_, $list[$_] ) foreach 0 .. $#list;
+      return $self->FETCHSIZE();
+    }   
+
+=item POP this
+X<POP>
+
+Remove last element of the array and return it.  For example:
+
+    sub POP {
+      my $self = shift;
+      return pop @{$self->{ARRAY}};
+    }
+
+=item SHIFT this
+X<SHIFT>
+
+Remove the first element of the array (shifting other elements down)
+and return it.  For example:
+
+    sub SHIFT {
+      my $self = shift;
+      return shift @{$self->{ARRAY}};
+    }
+
+=item UNSHIFT this, LIST 
+X<UNSHIFT>
+
+Insert LIST elements at the beginning of the array, moving existing elements
+up to make room.  For example:
+
+    sub UNSHIFT {
+      my $self = shift;
+      my @list = @_;
+      my $size = scalar( @list );
+      # make room for our list
+      @{$self->{ARRAY}}[ $size .. $#{$self->{ARRAY}} + $size ]
+       = @{$self->{ARRAY}};
+      $self->STORE( $_, $list[$_] ) foreach 0 .. $#list;
+    }
+
+=item SPLICE this, offset, length, LIST
+X<SPLICE>
+
+Perform the equivalent of C<splice> on the array. 
+
+I<offset> is optional and defaults to zero, negative values count back 
+from the end of the array. 
+
+I<length> is optional and defaults to rest of the array.
+
+I<LIST> may be empty.
+
+Returns a list of the original I<length> elements at I<offset>.
+
+In our example, we'll use a little shortcut if there is a I<LIST>:
+
+    sub SPLICE {
+      my $self   = shift;
+      my $offset = shift || 0;
+      my $length = shift || $self->FETCHSIZE() - $offset;
+      my @list   = (); 
+      if ( @_ ) {
+        tie @list, __PACKAGE__, $self->{ELEMSIZE};
+        @list   = @_;
+      }
+      return splice @{$self->{ARRAY}}, $offset, $length, @list;
+    }
+
+=item UNTIE this
+X<UNTIE>
+
+Will be called when C<untie> happens. (See L<The C<untie> Gotcha> below.)
+
+=item DESTROY this
+X<DESTROY>
+
+This method will be triggered when the tied variable needs to be destructed.
+As with the scalar tie class, this is almost never needed in a
+language that does its own garbage collection, so this time we'll
+just leave it out.
+
+=back
+
+=head2 Tying Hashes
+X<hash, tying>
+
+Hashes were the first Perl data type to be tied (see dbmopen()).  A class
+implementing a tied hash should define the following methods: TIEHASH is
+the constructor.  FETCH and STORE access the key and value pairs.  EXISTS
+reports whether a key is present in the hash, and DELETE deletes one.
+CLEAR empties the hash by deleting all the key and value pairs.  FIRSTKEY
+and NEXTKEY implement the keys() and each() functions to iterate over all
+the keys. SCALAR is triggered when the tied hash is evaluated in scalar 
+context. UNTIE is called when C<untie> happens, and DESTROY is called when
+the tied variable is garbage collected.
+
+If this seems like a lot, then feel free to inherit from merely the
+standard Tie::StdHash module for most of your methods, redefining only the
+interesting ones.  See L<Tie::Hash> for details.
+
+Remember that Perl distinguishes between a key not existing in the hash,
+and the key existing in the hash but having a corresponding value of
+C<undef>.  The two possibilities can be tested with the C<exists()> and
+C<defined()> functions.
+
+Here's an example of a somewhat interesting tied hash class:  it gives you
+a hash representing a particular user's dot files.  You index into the hash
+with the name of the file (minus the dot) and you get back that dot file's
+contents.  For example:
+
+    use DotFiles;
+    tie %dot, 'DotFiles';
+    if ( $dot{profile} =~ /MANPATH/ ||
+         $dot{login}   =~ /MANPATH/ ||
+         $dot{cshrc}   =~ /MANPATH/    )
+    {
+	print "you seem to set your MANPATH\n";
+    }
+
+Or here's another sample of using our tied class:
+
+    tie %him, 'DotFiles', 'daemon';
+    foreach $f ( keys %him ) {
+	printf "daemon dot file %s is size %d\n",
+	    $f, length $him{$f};
+    }
+
+In our tied hash DotFiles example, we use a regular
+hash for the object containing several important
+fields, of which only the C<{LIST}> field will be what the
+user thinks of as the real hash.
+
+=over 5
+
+=item USER
+
+whose dot files this object represents
+
+=item HOME
+
+where those dot files live
+
+=item CLOBBER
+
+whether we should try to change or remove those dot files
+
+=item LIST
+
+the hash of dot file names and content mappings
+
+=back
+
+Here's the start of F<Dotfiles.pm>:
+
+    package DotFiles;
+    use Carp;
+    sub whowasi { (caller(1))[3] . '()' }
+    my $DEBUG = 0;
+    sub debug { $DEBUG = @_ ? shift : 1 }
+
+For our example, we want to be able to emit debugging info to help in tracing
+during development.  We keep also one convenience function around
+internally to help print out warnings; whowasi() returns the function name
+that calls it.
+
+Here are the methods for the DotFiles tied hash.
+
+=over 4
+
+=item TIEHASH classname, LIST
+X<TIEHASH>
+
+This is the constructor for the class.  That means it is expected to
+return a blessed reference through which the new object (probably but not
+necessarily an anonymous hash) will be accessed.
+
+Here's the constructor:
+
+    sub TIEHASH {
+	my $self = shift;
+	my $user = shift || $>;
+	my $dotdir = shift || '';
+	croak "usage: @{[&whowasi]} [USER [DOTDIR]]" if @_;
+	$user = getpwuid($user) if $user =~ /^\d+$/;
+	my $dir = (getpwnam($user))[7]
+		|| croak "@{[&whowasi]}: no user $user";
+	$dir .= "/$dotdir" if $dotdir;
+
+	my $node = {
+	    USER    => $user,
+	    HOME    => $dir,
+	    LIST    => {},
+	    CLOBBER => 0,
+	};
+
+	opendir(DIR, $dir)
+		|| croak "@{[&whowasi]}: can't opendir $dir: $!";
+	foreach $dot ( grep /^\./ && -f "$dir/$_", readdir(DIR)) {
+	    $dot =~ s/^\.//;
+	    $node->{LIST}{$dot} = undef;
+	}
+	closedir DIR;
+	return bless $node, $self;
+    }
+
+It's probably worth mentioning that if you're going to filetest the
+return values out of a readdir, you'd better prepend the directory
+in question.  Otherwise, because we didn't chdir() there, it would
+have been testing the wrong file.
+
+=item FETCH this, key
+X<FETCH>
+
+This method will be triggered every time an element in the tied hash is
+accessed (read).  It takes one argument beyond its self reference: the key
+whose value we're trying to fetch.
+
+Here's the fetch for our DotFiles example.
+
+    sub FETCH {
+	carp &whowasi if $DEBUG;
+	my $self = shift;
+	my $dot = shift;
+	my $dir = $self->{HOME};
+	my $file = "$dir/.$dot";
+
+	unless (exists $self->{LIST}->{$dot} || -f $file) {
+	    carp "@{[&whowasi]}: no $dot file" if $DEBUG;
+	    return undef;
+	}
+
+	if (defined $self->{LIST}->{$dot}) {
+	    return $self->{LIST}->{$dot};
+	} else {
+	    return $self->{LIST}->{$dot} = `cat $dir/.$dot`;
+	}
+    }
+
+It was easy to write by having it call the Unix cat(1) command, but it
+would probably be more portable to open the file manually (and somewhat
+more efficient).  Of course, because dot files are a Unixy concept, we're
+not that concerned.
+
+=item STORE this, key, value
+X<STORE>
+
+This method will be triggered every time an element in the tied hash is set
+(written).  It takes two arguments beyond its self reference: the index at
+which we're trying to store something, and the value we're trying to put
+there.
+
+Here in our DotFiles example, we'll be careful not to let
+them try to overwrite the file unless they've called the clobber()
+method on the original object reference returned by tie().
+
+    sub STORE {
+	carp &whowasi if $DEBUG;
+	my $self = shift;
+	my $dot = shift;
+	my $value = shift;
+	my $file = $self->{HOME} . "/.$dot";
+	my $user = $self->{USER};
+
+	croak "@{[&whowasi]}: $file not clobberable"
+	    unless $self->{CLOBBER};
+
+	open(F, "> $file") || croak "can't open $file: $!";
+	print F $value;
+	close(F);
+    }
+
+If they wanted to clobber something, they might say:
+
+    $ob = tie %daemon_dots, 'daemon';
+    $ob->clobber(1);
+    $daemon_dots{signature} = "A true daemon\n";
+
+Another way to lay hands on a reference to the underlying object is to
+use the tied() function, so they might alternately have set clobber
+using:
+
+    tie %daemon_dots, 'daemon';
+    tied(%daemon_dots)->clobber(1);
+
+The clobber method is simply:
+
+    sub clobber {
+	my $self = shift;
+	$self->{CLOBBER} = @_ ? shift : 1;
+    }
+
+=item DELETE this, key
+X<DELETE>
+
+This method is triggered when we remove an element from the hash,
+typically by using the delete() function.  Again, we'll
+be careful to check whether they really want to clobber files.
+
+    sub DELETE   {
+	carp &whowasi if $DEBUG;
+
+	my $self = shift;
+	my $dot = shift;
+	my $file = $self->{HOME} . "/.$dot";
+	croak "@{[&whowasi]}: won't remove file $file"
+	    unless $self->{CLOBBER};
+	delete $self->{LIST}->{$dot};
+	my $success = unlink($file);
+	carp "@{[&whowasi]}: can't unlink $file: $!" unless $success;
+	$success;
+    }
+
+The value returned by DELETE becomes the return value of the call
+to delete().  If you want to emulate the normal behavior of delete(),
+you should return whatever FETCH would have returned for this key.
+In this example, we have chosen instead to return a value which tells
+the caller whether the file was successfully deleted.
+
+=item CLEAR this
+X<CLEAR>
+
+This method is triggered when the whole hash is to be cleared, usually by
+assigning the empty list to it.
+
+In our example, that would remove all the user's dot files!  It's such a
+dangerous thing that they'll have to set CLOBBER to something higher than
+1 to make it happen.
+
+    sub CLEAR    {
+	carp &whowasi if $DEBUG;
+	my $self = shift;
+	croak "@{[&whowasi]}: won't remove all dot files for $self->{USER}"
+	    unless $self->{CLOBBER} > 1;
+	my $dot;
+	foreach $dot ( keys %{$self->{LIST}}) {
+	    $self->DELETE($dot);
+	}
+    }
+
+=item EXISTS this, key
+X<EXISTS>
+
+This method is triggered when the user uses the exists() function
+on a particular hash.  In our example, we'll look at the C<{LIST}>
+hash element for this:
+
+    sub EXISTS   {
+	carp &whowasi if $DEBUG;
+	my $self = shift;
+	my $dot = shift;
+	return exists $self->{LIST}->{$dot};
+    }
+
+=item FIRSTKEY this
+X<FIRSTKEY>
+
+This method will be triggered when the user is going
+to iterate through the hash, such as via a keys() or each()
+call.
+
+    sub FIRSTKEY {
+	carp &whowasi if $DEBUG;
+	my $self = shift;
+	my $a = keys %{$self->{LIST}};		# reset each() iterator
+	each %{$self->{LIST}}
+    }
+
+=item NEXTKEY this, lastkey
+X<NEXTKEY>
+
+This method gets triggered during a keys() or each() iteration.  It has a
+second argument which is the last key that had been accessed.  This is
+useful if you're carrying about ordering or calling the iterator from more
+than one sequence, or not really storing things in a hash anywhere.
+
+For our example, we're using a real hash so we'll do just the simple
+thing, but we'll have to go through the LIST field indirectly.
+
+    sub NEXTKEY  {
+	carp &whowasi if $DEBUG;
+	my $self = shift;
+	return each %{ $self->{LIST} }
+    }
+
+=item SCALAR this
+X<SCALAR>
+
+This is called when the hash is evaluated in scalar context. In order
+to mimic the behaviour of untied hashes, this method should return a
+false value when the tied hash is considered empty. If this method does
+not exist, perl will make some educated guesses and return true when
+the hash is inside an iteration. If this isn't the case, FIRSTKEY is
+called, and the result will be a false value if FIRSTKEY returns the empty
+list, true otherwise.
+
+However, you should B<not> blindly rely on perl always doing the right 
+thing. Particularly, perl will mistakenly return true when you clear the 
+hash by repeatedly calling DELETE until it is empty. You are therefore 
+advised to supply your own SCALAR method when you want to be absolutely 
+sure that your hash behaves nicely in scalar context.
+
+In our example we can just call C<scalar> on the underlying hash
+referenced by C<$self-E<gt>{LIST}>:
+
+    sub SCALAR {
+	carp &whowasi if $DEBUG;
+	my $self = shift;
+	return scalar %{ $self->{LIST} }
+    }
+
+=item UNTIE this
+X<UNTIE>
+
+This is called when C<untie> occurs.  See L<The C<untie> Gotcha> below.
+
+=item DESTROY this
+X<DESTROY>
+
+This method is triggered when a tied hash is about to go out of
+scope.  You don't really need it unless you're trying to add debugging
+or have auxiliary state to clean up.  Here's a very simple function:
+
+    sub DESTROY  {
+	carp &whowasi if $DEBUG;
+    }
+
+=back
+
+Note that functions such as keys() and values() may return huge lists
+when used on large objects, like DBM files.  You may prefer to use the
+each() function to iterate over such.  Example:
+
+    # print out history file offsets
+    use NDBM_File;
+    tie(%HIST, 'NDBM_File', '/usr/lib/news/history', 1, 0);
+    while (($key,$val) = each %HIST) {
+        print $key, ' = ', unpack('L',$val), "\n";
+    }
+    untie(%HIST);
+
+=head2 Tying FileHandles
+X<filehandle, tying>
+
+This is partially implemented now.
+
+A class implementing a tied filehandle should define the following
+methods: TIEHANDLE, at least one of PRINT, PRINTF, WRITE, READLINE, GETC,
+READ, and possibly CLOSE, UNTIE and DESTROY.  The class can also provide: BINMODE,
+OPEN, EOF, FILENO, SEEK, TELL - if the corresponding perl operators are
+used on the handle.
+
+When STDERR is tied, its PRINT method will be called to issue warnings
+and error messages.  This feature is temporarily disabled during the call, 
+which means you can use C<warn()> inside PRINT without starting a recursive
+loop.  And just like C<__WARN__> and C<__DIE__> handlers, STDERR's PRINT
+method may be called to report parser errors, so the caveats mentioned under 
+L<perlvar/%SIG> apply.
+
+All of this is especially useful when perl is embedded in some other 
+program, where output to STDOUT and STDERR may have to be redirected 
+in some special way.  See nvi and the Apache module for examples.
+
+In our example we're going to create a shouting handle.
+
+    package Shout;
+
+=over 4
+
+=item TIEHANDLE classname, LIST
+X<TIEHANDLE>
+
+This is the constructor for the class.  That means it is expected to
+return a blessed reference of some sort. The reference can be used to
+hold some internal information.
+
+    sub TIEHANDLE { print "<shout>\n"; my $i; bless \$i, shift }
+
+=item WRITE this, LIST
+X<WRITE>
+
+This method will be called when the handle is written to via the
+C<syswrite> function.
+
+    sub WRITE {
+	$r = shift;
+	my($buf,$len,$offset) = @_;
+	print "WRITE called, \$buf=$buf, \$len=$len, \$offset=$offset";
+    }
+
+=item PRINT this, LIST
+X<PRINT>
+
+This method will be triggered every time the tied handle is printed to
+with the C<print()> function.
+Beyond its self reference it also expects the list that was passed to
+the print function.
+
+    sub PRINT { $r = shift; $$r++; print join($,,map(uc($_),@_)),$\ }
+
+=item PRINTF this, LIST
+X<PRINTF>
+
+This method will be triggered every time the tied handle is printed to
+with the C<printf()> function.
+Beyond its self reference it also expects the format and list that was
+passed to the printf function.
+
+    sub PRINTF {
+        shift;
+        my $fmt = shift;
+        print sprintf($fmt, @_);
+    }
+
+=item READ this, LIST
+X<READ>
+
+This method will be called when the handle is read from via the C<read>
+or C<sysread> functions.
+
+    sub READ {
+	my $self = shift;
+	my $bufref = \$_[0];
+	my(undef,$len,$offset) = @_;
+	print "READ called, \$buf=$bufref, \$len=$len, \$offset=$offset";
+	# add to $$bufref, set $len to number of characters read
+	$len;
+    }
+
+=item READLINE this
+X<READLINE>
+
+This method will be called when the handle is read from via <HANDLE>.
+The method should return undef when there is no more data.
+
+    sub READLINE { $r = shift; "READLINE called $$r times\n"; }
+
+=item GETC this
+X<GETC>
+
+This method will be called when the C<getc> function is called.
+
+    sub GETC { print "Don't GETC, Get Perl"; return "a"; }
+
+=item CLOSE this
+X<CLOSE>
+
+This method will be called when the handle is closed via the C<close>
+function.
+
+    sub CLOSE { print "CLOSE called.\n" }
+
+=item UNTIE this
+X<UNTIE>
+
+As with the other types of ties, this method will be called when C<untie> happens.
+It may be appropriate to "auto CLOSE" when this occurs.  See
+L<The C<untie> Gotcha> below.
+
+=item DESTROY this
+X<DESTROY>
+
+As with the other types of ties, this method will be called when the
+tied handle is about to be destroyed. This is useful for debugging and
+possibly cleaning up.
+
+    sub DESTROY { print "</shout>\n" }
+
+=back
+
+Here's how to use our little example:
+
+    tie(*FOO,'Shout');
+    print FOO "hello\n";
+    $a = 4; $b = 6;
+    print FOO $a, " plus ", $b, " equals ", $a + $b, "\n";
+    print <FOO>;
+
+=head2 UNTIE this
+X<UNTIE>
+
+You can define for all tie types an UNTIE method that will be called
+at untie().  See L<The C<untie> Gotcha> below.
+
+=head2 The C<untie> Gotcha
+X<untie>
+
+If you intend making use of the object returned from either tie() or
+tied(), and if the tie's target class defines a destructor, there is a
+subtle gotcha you I<must> guard against.
+
+As setup, consider this (admittedly rather contrived) example of a
+tie; all it does is use a file to keep a log of the values assigned to
+a scalar.
+
+    package Remember;
+
+    use strict;
+    use warnings;
+    use IO::File;
+
+    sub TIESCALAR {
+        my $class = shift;
+        my $filename = shift;
+        my $handle = new IO::File "> $filename"
+                         or die "Cannot open $filename: $!\n";
+
+        print $handle "The Start\n";
+        bless {FH => $handle, Value => 0}, $class;
+    }
+
+    sub FETCH {
+        my $self = shift;
+        return $self->{Value};
+    }
+
+    sub STORE {
+        my $self = shift;
+        my $value = shift;
+        my $handle = $self->{FH};
+        print $handle "$value\n";
+        $self->{Value} = $value;
+    }
+
+    sub DESTROY {
+        my $self = shift;
+        my $handle = $self->{FH};
+        print $handle "The End\n";
+        close $handle;
+    }
+
+    1;
+
+Here is an example that makes use of this tie:
+
+    use strict;
+    use Remember;
+
+    my $fred;
+    tie $fred, 'Remember', 'myfile.txt';
+    $fred = 1;
+    $fred = 4;
+    $fred = 5;
+    untie $fred;
+    system "cat myfile.txt";
+
+This is the output when it is executed:
+
+    The Start
+    1
+    4
+    5
+    The End
+
+So far so good.  Those of you who have been paying attention will have
+spotted that the tied object hasn't been used so far.  So lets add an
+extra method to the Remember class to allow comments to be included in
+the file -- say, something like this:
+
+    sub comment {
+        my $self = shift;
+        my $text = shift;
+        my $handle = $self->{FH};
+        print $handle $text, "\n";
+    }
+
+And here is the previous example modified to use the C<comment> method
+(which requires the tied object):
+
+    use strict;
+    use Remember;
+
+    my ($fred, $x);
+    $x = tie $fred, 'Remember', 'myfile.txt';
+    $fred = 1;
+    $fred = 4;
+    comment $x "changing...";
+    $fred = 5;
+    untie $fred;
+    system "cat myfile.txt";
+
+When this code is executed there is no output.  Here's why:
+
+When a variable is tied, it is associated with the object which is the
+return value of the TIESCALAR, TIEARRAY, or TIEHASH function.  This
+object normally has only one reference, namely, the implicit reference
+from the tied variable.  When untie() is called, that reference is
+destroyed.  Then, as in the first example above, the object's
+destructor (DESTROY) is called, which is normal for objects that have
+no more valid references; and thus the file is closed.
+
+In the second example, however, we have stored another reference to
+the tied object in $x.  That means that when untie() gets called
+there will still be a valid reference to the object in existence, so
+the destructor is not called at that time, and thus the file is not
+closed.  The reason there is no output is because the file buffers
+have not been flushed to disk.
+
+Now that you know what the problem is, what can you do to avoid it?
+Prior to the introduction of the optional UNTIE method the only way
+was the good old C<-w> flag. Which will spot any instances where you call
+untie() and there are still valid references to the tied object.  If
+the second script above this near the top C<use warnings 'untie'>
+or was run with the C<-w> flag, Perl prints this
+warning message:
+
+    untie attempted while 1 inner references still exist
+
+To get the script to work properly and silence the warning make sure
+there are no valid references to the tied object I<before> untie() is
+called:
+
+    undef $x;
+    untie $fred;
+
+Now that UNTIE exists the class designer can decide which parts of the
+class functionality are really associated with C<untie> and which with
+the object being destroyed. What makes sense for a given class depends
+on whether the inner references are being kept so that non-tie-related
+methods can be called on the object. But in most cases it probably makes
+sense to move the functionality that would have been in DESTROY to the UNTIE
+method.
+
+If the UNTIE method exists then the warning above does not occur. Instead the
+UNTIE method is passed the count of "extra" references and can issue its own
+warning if appropriate. e.g. to replicate the no UNTIE case this method can
+be used:
+
+    sub UNTIE
+    {
+     my ($obj,$count) = @_;
+     carp "untie attempted while $count inner references still exist" if $count;
+    }
+
+=head1 SEE ALSO
+
+See L<DB_File> or L<Config> for some interesting tie() implementations.
+A good starting point for many tie() implementations is with one of the
+modules L<Tie::Scalar>, L<Tie::Array>, L<Tie::Hash>, or L<Tie::Handle>.
+
+=head1 BUGS
+
+The bucket usage information provided by C<scalar(%hash)> is not
+available.  What this means is that using %tied_hash in boolean
+context doesn't work right (currently this always tests false,
+regardless of whether the hash is empty or hash elements).
+
+Localizing tied arrays or hashes does not work.  After exiting the
+scope the arrays or the hashes are not restored.
+
+Counting the number of entries in a hash via C<scalar(keys(%hash))>
+or C<scalar(values(%hash)>) is inefficient since it needs to iterate
+through all the entries with FIRSTKEY/NEXTKEY.
+
+Tied hash/array slices cause multiple FETCH/STORE pairs, there are no
+tie methods for slice operations.
+
+You cannot easily tie a multilevel data structure (such as a hash of
+hashes) to a dbm file.  The first problem is that all but GDBM and
+Berkeley DB have size limitations, but beyond that, you also have problems
+with how references are to be represented on disk.  One experimental
+module that does attempt to address this need is DBM::Deep.  Check your
+nearest CPAN site as described in L<perlmodlib> for source code.  Note
+that despite its name, DBM::Deep does not use dbm.  Another earlier attempt
+at solving the problem is MLDBM, which is also available on the CPAN, but
+which has some fairly serious limitations.
+
+Tied filehandles are still incomplete.  sysopen(), truncate(),
+flock(), fcntl(), stat() and -X can't currently be trapped.
+
+=head1 AUTHOR
+
+Tom Christiansen
+
+TIEHANDLE by Sven Verdoolaege <F<skimo@dns.ufsia.ac.be>> and Doug MacEachern <F<dougm@osf.org>>
+
+UNTIE by Nick Ing-Simmons <F<nick@ing-simmons.net>>
+
+SCALAR by Tassilo von Parseval <F<tassilo.von.parseval@rwth-aachen.de>>
+
+Tying Arrays by Casey West <F<casey@geeknest.com>>
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perltoc.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perltoc.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perltoc.pod	(revision 14489)
@@ -0,0 +1,22624 @@
+
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+# This file is autogenerated by buildtoc from all the other pods.
+# Edit those files and run buildtoc --build-toc to effect changes.
+
+=head1 NAME
+
+perltoc - perl documentation table of contents
+
+=head1 DESCRIPTION
+
+This page provides a brief table of contents for the rest of the Perl
+documentation set.  It is meant to be scanned quickly or grepped
+through to locate the proper section you're looking for.
+
+=head1 BASIC DOCUMENTATION
+
+=head2 perl - Practical Extraction and Report Language
+
+=over 4
+
+=item SYNOPSIS
+
+=over 4
+
+=item Overview
+
+=item Tutorials
+
+=item Reference Manual
+
+=item Internals and C Language Interface
+
+=item Miscellaneous
+
+=item Language-Specific
+
+=item Platform-Specific
+
+=back
+
+=item DESCRIPTION
+
+=item AVAILABILITY
+
+=item ENVIRONMENT
+
+=item AUTHOR
+
+=item FILES
+
+=item SEE ALSO
+
+=item DIAGNOSTICS
+
+=item BUGS
+
+=item NOTES
+
+=back
+
+=head2 perlintro -- a brief introduction and overview of Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item What is Perl?
+
+=item Running Perl programs
+
+=item Basic syntax overview
+
+=item Perl variable types
+
+Scalars, Arrays, Hashes
+
+=item Variable scoping
+
+=item Conditional and looping constructs
+
+if, while, for, foreach
+
+=item Builtin operators and functions
+
+Arithmetic, Numeric comparison, String comparison, Boolean logic,
+Miscellaneous
+
+=item Files and I/O
+
+=item Regular expressions
+
+Simple matching, Simple substitution, More complex regular expressions,
+Parentheses for capturing, Other regexp features
+
+=item Writing subroutines
+
+=item OO Perl
+
+=item Using Perl modules
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlreftut - Mark's very short tutorial about references
+
+=over 4
+
+=item DESCRIPTION
+
+=item Who Needs Complicated Data Structures?
+
+=item The Solution
+
+=item Syntax
+
+=over 4
+
+=item Making References
+
+=item Using References
+
+=item An Example
+
+=item Arrow Rule
+
+=back
+
+=item Solution
+
+=item The Rest
+
+=item Summary
+
+=item Credits
+
+=over 4
+
+=item Distribution Conditions
+
+=back
+
+=back
+
+=head2 perldsc - Perl Data Structures Cookbook
+
+=over 4
+
+=item DESCRIPTION
+
+arrays of arrays, hashes of arrays, arrays of hashes, hashes of hashes,
+more elaborate constructs
+
+=item REFERENCES
+X<reference> X<dereference> X<dereferencing> X<pointer>
+
+=item COMMON MISTAKES
+
+=item CAVEAT ON PRECEDENCE
+X<dereference, precedence> X<dereferencing, precedence>
+
+=item WHY YOU SHOULD ALWAYS C<use strict>
+
+=item DEBUGGING
+X<data structure, debugging> X<complex data structure, debugging>
+X<AoA, debugging> X<HoA, debugging> X<AoH, debugging> X<HoH, debugging>
+X<array of arrays, debugging> X<hash of arrays, debugging>
+X<array of hashes, debugging> X<hash of hashes, debugging>
+
+=item CODE EXAMPLES
+
+=item ARRAYS OF ARRAYS
+X<array of arrays> X<AoA>
+
+=over 4
+
+=item Declaration of an ARRAY OF ARRAYS
+
+=item Generation of an ARRAY OF ARRAYS
+
+=item Access and Printing of an ARRAY OF ARRAYS
+
+=back
+
+=item HASHES OF ARRAYS
+X<hash of arrays> X<HoA>
+
+=over 4
+
+=item Declaration of a HASH OF ARRAYS
+
+=item Generation of a HASH OF ARRAYS
+
+=item Access and Printing of a HASH OF ARRAYS
+
+=back
+
+=item ARRAYS OF HASHES
+X<array of hashes> X<AoH>
+
+=over 4
+
+=item Declaration of an ARRAY OF HASHES
+
+=item Generation of an ARRAY OF HASHES
+
+=item Access and Printing of an ARRAY OF HASHES
+
+=back
+
+=item HASHES OF HASHES
+X<hass of hashes> X<HoH>
+
+=over 4
+
+=item Declaration of a HASH OF HASHES
+
+=item Generation of a HASH OF HASHES
+
+=item Access and Printing of a HASH OF HASHES
+
+=back
+
+=item MORE ELABORATE RECORDS
+X<record> X<structure> X<struct>
+
+=over 4
+
+=item Declaration of MORE ELABORATE RECORDS
+
+=item Declaration of a HASH OF COMPLEX RECORDS
+
+=item Generation of a HASH OF COMPLEX RECORDS
+
+=back
+
+=item Database Ties
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perllol - Manipulating Arrays of Arrays in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Declaration and Access of Arrays of Arrays
+
+=item Growing Your Own
+
+=item Access and Printing
+
+=item Slices
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perlrequick - Perl regular expressions quick start
+
+=over 4
+
+=item DESCRIPTION
+
+=item The Guide
+
+=over 4
+
+=item Simple word matching
+
+=item Using character classes
+
+=item Matching this or that
+
+=item Grouping things and hierarchical matching
+
+=item Extracting matches
+
+=item Matching repetitions
+
+=item More matching
+
+=item Search and replace
+
+=item The split operator
+
+=back
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHOR AND COPYRIGHT
+
+=over 4
+
+=item Acknowledgments
+
+=back
+
+=back
+
+=head2 perlretut - Perl regular expressions tutorial
+
+=over 4
+
+=item DESCRIPTION
+
+=item Part 1: The basics
+
+=over 4
+
+=item Simple word matching
+
+=item Using character classes
+
+=item Matching this or that
+
+=item Grouping things and hierarchical matching
+
+=item Extracting matches
+
+=item Matching repetitions
+
+=item Building a regexp
+
+=item Using regular expressions in Perl
+
+=back
+
+=item Part 2: Power tools
+
+=over 4
+
+=item More on characters, strings, and character classes
+
+=item Compiling and saving regular expressions
+
+=item Embedding comments and modifiers in a regular expression
+
+=item Non-capturing groupings
+
+=item Looking ahead and looking behind
+
+=item Using independent subexpressions to prevent backtracking
+
+=item Conditional expressions
+
+=item A bit of magic: executing Perl code in a regular expression
+
+=item Pragmas and debugging
+
+=back
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHOR AND COPYRIGHT
+
+=over 4
+
+=item Acknowledgments
+
+=back
+
+=back
+
+=head2 perlboot - Beginner's Object-Oriented Tutorial
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item If we could talk to the animals...
+
+=item Introducing the method invocation arrow
+
+=item Invoking a barnyard
+
+=item The extra parameter of method invocation
+
+=item Calling a second method to simplify things
+
+=item Inheriting the windpipes
+
+=item A few notes about @ISA
+
+=item Overriding the methods
+
+=item Starting the search from a different place
+
+=item The SUPER way of doing things
+
+=item Where we're at so far...
+
+=item A horse is a horse, of course of course -- or is it?
+
+=item Invoking an instance method
+
+=item Accessing the instance data
+
+=item How to build a horse
+
+=item Inheriting the constructor
+
+=item Making a method work with either classes or instances
+
+=item Adding parameters to a method
+
+=item More interesting instances
+
+=item A horse of a different color
+
+=item Summary
+
+=back
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 perltoot - Tom's object-oriented tutorial for perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item Creating a Class
+
+=over 4
+
+=item Object Representation
+
+=item Class Interface
+
+=item Constructors and Instance Methods
+
+=item Planning for the Future: Better Constructors
+
+=item Destructors
+
+=item Other Object Methods
+
+=back
+
+=item Class Data
+
+=over 4
+
+=item Accessing Class Data
+
+=item Debugging Methods
+
+=item Class Destructors
+
+=item Documenting the Interface
+
+=back
+
+=item Aggregation
+
+=item Inheritance
+
+=over 4
+
+=item Overridden Methods
+
+=item Multiple Inheritance
+
+=item UNIVERSAL: The Root of All Objects
+
+=back
+
+=item Alternate Object Representations
+
+=over 4
+
+=item Arrays as Objects
+
+=item Closures as Objects
+
+=back
+
+=item AUTOLOAD: Proxy Methods
+
+=over 4
+
+=item Autoloaded Data Methods
+
+=item Inherited Autoloaded Data Methods
+
+=back
+
+=item Metaclassical Tools
+
+=over 4
+
+=item Class::Struct
+
+=item Data Members as Variables
+
+=back
+
+=item NOTES
+
+=over 4
+
+=item Object Terminology
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR AND COPYRIGHT
+
+=item COPYRIGHT
+
+=over 4
+
+=item Acknowledgments
+
+=back
+
+=back
+
+=head2 perltooc - Tom's OO Tutorial for Class Data in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item Class Data in a Can
+
+=item Class Data as Package Variables
+
+=over 4
+
+=item Putting All Your Eggs in One Basket
+
+=item Inheritance Concerns
+
+=item The Eponymous Meta-Object
+
+=item Indirect References to Class Data
+
+=item Monadic Classes
+
+=item Translucent Attributes
+
+=back
+
+=item Class Data as Lexical Variables
+
+=over 4
+
+=item Privacy and Responsibility 
+
+=item File-Scoped Lexicals
+
+=item More Inheritance Concerns
+
+=item Locking the Door and Throwing Away the Key
+
+=item Translucency Revisited
+
+=back
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR AND COPYRIGHT
+
+=item ACKNOWLEDGEMENTS
+
+=item HISTORY
+
+=back
+
+=head2 perlbot - Bag'o Object Tricks (the BOT)
+
+=over 4
+
+=item DESCRIPTION
+
+=item OO SCALING TIPS
+
+=item INSTANCE VARIABLES
+
+=item SCALAR INSTANCE VARIABLES
+
+=item INSTANCE VARIABLE INHERITANCE
+
+=item OBJECT RELATIONSHIPS
+
+=item OVERRIDING SUPERCLASS METHODS
+
+=item USING RELATIONSHIP WITH SDBM
+
+=item THINKING OF CODE REUSE
+
+=item CLASS CONTEXT AND THE OBJECT
+
+=item INHERITING A CONSTRUCTOR
+
+=item DELEGATION
+
+=item SEE ALSO
+
+=back
+
+=head2 perlstyle - Perl style guide
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 perlcheat - Perl 5 Cheat Sheet
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item The sheet
+
+=back
+
+=item ACKNOWLEDGEMENTS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perltrap - Perl traps for the unwary
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Awk Traps
+
+=item C/C++ Traps
+
+=item Sed Traps
+
+=item Shell Traps
+
+=item Perl Traps
+
+=item Perl4 to Perl5 Traps
+
+Discontinuance, Deprecation, and BugFix traps, Parsing Traps, Numerical
+Traps, General data type traps, Context Traps - scalar, list contexts,
+Precedence Traps, General Regular Expression Traps using s///, etc,
+Subroutine, Signal, Sorting Traps, OS Traps, DBM Traps, Unclassified Traps
+
+=item Discontinuance, Deprecation, and BugFix traps
+
+Symbols starting with "_" no longer forced into main, Double-colon valid
+package separator in variable name, 2nd and 3rd args to C<splice()> are now
+in scalar context, Can't do C<goto> into a block that is optimized away,
+Can't use whitespace as variable name or quote delimiter, C<while/if BLOCK
+BLOCK> gone, C<**> binds tighter than unary minus, C<foreach> changed when
+iterating over a list, C<split> with no args behavior changed, B<-e>
+behavior fixed, C<push> returns number of elements in resulting list, Some
+error messages differ, C<split()> honors subroutine args, Bugs removed
+
+=item Parsing Traps
+
+Space between . and = triggers syntax error, Better parsing in perl 5,
+Function parsing, String interpolation of C<$#array> differs, Perl guesses
+on C<map>, C<grep> followed by C<{> if it starts BLOCK or hash ref
+
+=item Numerical Traps
+
+Formatted output and significant digits, Auto-increment operator over
+signed int limit deleted, Assignment of return values from numeric equality
+tests doesn't work, Bitwise string ops
+
+=item General data type traps
+
+Negative array subscripts now count from the end of array, Setting
+C<$#array> lower now discards array elements, Hashes get defined before
+use, Glob assignment from localized variable to variable, Assigning
+C<undef> to glob, Changes in unary negation (of strings), Modifying of
+constants prohibited, C<defined $var> behavior changed, Variable Suicide
+
+=item Context Traps - scalar, list contexts
+
+Elements of argument lists for formats evaluated in list context,
+C<caller()> returns false value in scalar context if no caller present,
+Comma operator in scalar context gives scalar context to args, C<sprintf()>
+prototyped as C<($;@)>
+
+=item Precedence Traps
+
+LHS vs. RHS of any assignment operator, Semantic errors introduced due to
+precedence, Precedence of assignment operators same as the precedence of
+assignment, C<open> requires parentheses around filehandle, C<$:>
+precedence over C<$::> gone, Precedence of file test operators documented,
+C<keys>, C<each>, C<values> are regular named unary operators
+
+=item General Regular Expression Traps using s///, etc.
+
+C<s'$lhs'$rhs'> interpolates on either side, C<m//g> attaches its state to
+the searched string, C<m//o> used within an anonymous sub, C<$+> isn't set
+to whole match, Substitution now returns null string if it fails,
+C<s`lhs`rhs`> is now a normal substitution, Stricter parsing of variables
+in regular expressions, C<m?x?> matches only once, Failed matches don't
+reset the match variables
+
+=item Subroutine, Signal, Sorting Traps
+
+Barewords that used to look like strings look like subroutine calls,
+Reverse is no longer allowed as the name of a sort subroutine, C<warn()>
+won't let you specify a filehandle
+
+=item OS Traps
+
+SysV resets signal handler correctly, SysV C<seek()> appends correctly
+
+=item Interpolation Traps
+
+C<@> always interpolates an array in double-quotish strings, Double-quoted
+strings may no longer end with an unescaped $, Arbitrary expressions are
+evaluated inside braces within double quotes, C<$$x> now tries to
+dereference $x, Creation of hashes on the fly with C<eval "EXPR"> requires
+protection, Bugs in earlier perl versions, Array and hash brackets during
+interpolation, Interpolation of C<\$$foo{bar}>, C<qq()> string passed to
+C<eval> will not find string terminator
+
+=item DBM Traps
+
+Perl5 must have been linked with same dbm/ndbm as the default for
+C<dbmopen()>, DBM exceeding limit on the key/value size will cause perl5 to
+exit immediately
+
+=item Unclassified Traps
+
+C<require>/C<do> trap using returned value, C<split> on empty string with
+LIMIT specified
+
+=back
+
+=back
+
+=head2 perldebtut - Perl debugging tutorial
+
+=over 4
+
+=item DESCRIPTION
+
+=item use strict
+
+=item Looking at data and -w and v
+
+=item help
+
+=item Stepping through code
+
+=item Placeholder for a, w, t, T
+
+=item REGULAR EXPRESSIONS
+
+=item OUTPUT TIPS
+
+=item CGI
+
+=item GUIs
+
+=item SUMMARY
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item CONTRIBUTORS
+
+=back
+
+=head2 perlfaq - frequently asked questions about Perl ($Date: 2005/12/30
+15:04:07 $)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Where to get the perlfaq
+
+=item How to contribute to the perlfaq
+
+=item What will happen if you mail your Perl programming problems to the
+authors
+
+=back
+
+=item Credits
+
+=item Author and Copyright Information
+
+=over 4
+
+=item Bundled Distributions
+
+=item Disclaimer
+
+=back
+
+=item Table of Contents
+
+perlfaq  - this document, perlfaq1 - General Questions About Perl, perlfaq2
+- Obtaining and Learning about Perl, perlfaq3 - Programming Tools, perlfaq4
+- Data Manipulation, perlfaq5 - Files and Formats, perlfaq6 - Regular
+Expressions, perlfaq7 - General Perl Language Issues, perlfaq8 - System
+Interaction, perlfaq9 - Networking
+
+=item The Questions
+
+=over 4
+
+=item L<perlfaq1>: General Questions About Perl
+
+=item L<perlfaq2>: Obtaining and Learning about Perl
+
+=item L<perlfaq3>: Programming Tools
+
+=item L<perlfaq4>: Data Manipulation
+
+=item L<perlfaq5>: Files and Formats
+
+=item L<perlfaq6>: Regular Expressions
+
+=item L<perlfaq7>: General Perl Language Issues
+
+=item L<perlfaq8>: System Interaction
+
+=item L<perlfaq9>: Networking
+
+=back
+
+=back
+
+=head2 perlfaq1 - General Questions About Perl ($Revision: 1.19 $, $Date:
+2005/12/31 00:54:37 $)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item What is Perl?
+
+=item Who supports Perl?  Who develops it?  Why is it free?
+
+=item Which version of Perl should I use?
+
+=item What are perl4, perl5, or perl6?
+
+=item What is Ponie?
+
+=item What is perl6?
+
+=item How stable is Perl?
+
+=item Is Perl difficult to learn?
+
+=item How does Perl compare with other languages like Java, Python, REXX,
+Scheme, or Tcl?
+
+=item Can I do [task] in Perl?
+
+=item When shouldn't I program in Perl?
+
+=item What's the difference between "perl" and "Perl"?
+
+=item Is it a Perl program or a Perl script?
+
+=item What is a JAPH?
+
+=item Where can I get a list of Larry Wall witticisms?
+
+=item How can I convince my sysadmin/supervisor/employees to use version
+5/5.6.1/Perl instead of some other language?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq2 - Obtaining and Learning about Perl ($Revision: 1.38 $,
+$Date: 2005/12/31 00:54:37 $)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item What machines support perl?  Where do I get it?
+
+=item How can I get a binary version of perl?
+
+=item I don't have a C compiler. How can I build my own Perl interpreter?
+
+=item I copied the perl binary from one machine to another, but scripts
+don't work.
+
+=item I grabbed the sources and tried to compile but gdbm/dynamic
+loading/malloc/linking/... failed.  How do I make it work?
+
+=item What modules and extensions are available for Perl?  What is CPAN? 
+What does CPAN/src/... mean?
+
+=item Is there an ISO or ANSI certified version of Perl?
+
+=item Where can I get information on Perl?
+
+=item What are the Perl newsgroups on Usenet?  Where do I post questions?
+
+=item Where should I post source code?
+
+=item Perl Books
+
+References, Tutorials, Task-Oriented, Special Topics
+
+=item Perl in Magazines
+
+=item Perl on the Net: FTP and WWW Access
+
+=item What mailing lists are there for Perl?
+
+=item Archives of comp.lang.perl.misc
+
+=item Where can I buy a commercial version of perl?
+
+=item Where do I send bug reports?
+
+=item What is perl.com? Perl Mongers? pm.org? perl.org? cpan.org?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq3 - Programming Tools ($Revision: 1.56 $, $Date: 2005/12/31
+00:54:37 $)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item How do I do (anything)?
+
+=item How can I use Perl interactively?
+
+=item Is there a Perl shell?
+
+=item How do I find which modules are installed on my system?
+
+=item How do I debug my Perl programs?
+
+=item How do I profile my Perl programs?
+
+=item How do I cross-reference my Perl programs?
+
+=item Is there a pretty-printer (formatter) for Perl?
+
+=item Is there a ctags for Perl?
+
+=item Is there an IDE or Windows Perl Editor?
+
+Eclipse, Enginsite, Komodo, Open Perl IDE, OptiPerl, PerlBuilder,
+visiPerl+, Visual Perl, Zeus, GNU Emacs, MicroEMACS, XEmacs, Jed, Elvis,
+Vile, Vim, Codewright, MultiEdit, SlickEdit, Bash, Ksh, Tcsh, Zsh, Affrus,
+Alpha, BBEdit and BBEdit Lite
+
+=item Where can I get Perl macros for vi?
+
+=item Where can I get perl-mode for emacs?
+
+=item How can I use curses with Perl?
+
+=item How can I use X or Tk with Perl?
+
+=item How can I make my Perl program run faster?
+
+=item How can I make my Perl program take less memory?
+
+Don't slurp!, Use map and grep selectively, Avoid unnecessary quotes and
+stringification, Pass by reference, Tie large variables to disk
+
+=item Is it safe to return a reference to local or lexical data?
+
+=item How can I free an array or hash so my program shrinks?
+
+=item How can I make my CGI script more efficient?
+
+=item How can I hide the source for my Perl program?
+
+=item How can I compile my Perl program into byte code or C?
+
+=item How can I compile Perl into Java?
+
+=item How can I get C<#!perl> to work on [MS-DOS,NT,...]?
+
+=item Can I write useful Perl programs on the command line?
+
+=item Why don't Perl one-liners work on my DOS/Mac/VMS system?
+
+=item Where can I learn about CGI or Web programming in Perl?
+
+=item Where can I learn about object-oriented Perl programming?
+
+=item Where can I learn about linking C with Perl?
+
+=item I've read perlembed, perlguts, etc., but I can't embed perl in my C
+program; what am I doing wrong?
+
+=item When I tried to run my script, I got this message. What does it mean?
+
+=item What's MakeMaker?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq4 - Data Manipulation ($Revision: 1.73 $, $Date: 2005/12/31
+00:54:37 $)
+
+=over 4
+
+=item DESCRIPTION
+
+=item Data: Numbers
+
+=over 4
+
+=item Why am I getting long decimals (eg, 19.9499999999999) instead of the
+numbers I should be getting (eg, 19.95)?
+
+=item Why is int() broken?
+
+=item Why isn't my octal data interpreted correctly?
+
+=item Does Perl have a round() function?  What about ceil() and floor()? 
+Trig functions?
+
+=item How do I convert between numeric representations/bases/radixes?
+
+How do I convert hexadecimal into decimal, How do I convert from decimal to
+hexadecimal, How do I convert from octal to decimal, How do I convert from
+decimal to octal, How do I convert from binary to decimal, How do I convert
+from decimal to binary
+
+=item Why doesn't & work the way I want it to?
+
+=item How do I multiply matrices?
+
+=item How do I perform an operation on a series of integers?
+
+=item How can I output Roman numerals?
+
+=item Why aren't my random numbers random?
+
+=item How do I get a random number between X and Y?
+
+=back
+
+=item Data: Dates
+
+=over 4
+
+=item How do I find the day or week of the year?
+
+=item How do I find the current century or millennium?
+
+=item How can I compare two dates and find the difference?
+
+=item How can I take a string and turn it into epoch seconds?
+
+=item How can I find the Julian Day?
+
+=item How do I find yesterday's date?
+
+=item Does Perl have a Year 2000 problem?  Is Perl Y2K compliant?
+
+=back
+
+=item Data: Strings
+
+=over 4
+
+=item How do I validate input?
+
+=item How do I unescape a string?
+
+=item How do I remove consecutive pairs of characters?
+
+=item How do I expand function calls in a string?
+
+=item How do I find matching/nesting anything?
+
+=item How do I reverse a string?
+
+=item How do I expand tabs in a string?
+
+=item How do I reformat a paragraph?
+
+=item How can I access or change N characters of a string?
+
+=item How do I change the Nth occurrence of something?
+
+=item How can I count the number of occurrences of a substring within a
+string?
+
+=item How do I capitalize all the words on one line?
+
+=item How can I split a [character] delimited string except when inside
+[character]?
+
+=item How do I strip blank space from the beginning/end of a string?
+
+=item How do I pad a string with blanks or pad a number with zeroes?
+
+=item How do I extract selected columns from a string?
+
+=item How do I find the soundex value of a string?
+
+=item How can I expand variables in text strings?
+
+=item What's wrong with always quoting "$vars"?
+
+=item Why don't my E<lt>E<lt>HERE documents work?
+
+There must be no space after the E<lt>E<lt> part, There (probably) should
+be a semicolon at the end, You can't (easily) have any space in front of
+the tag
+
+=back
+
+=item Data: Arrays
+
+=over 4
+
+=item What is the difference between a list and an array?
+
+=item What is the difference between $array[1] and @array[1]?
+
+=item How can I remove duplicate elements from a list or array?
+
+=item How can I tell whether a certain element is contained in a list or
+array?
+
+=item How do I compute the difference of two arrays?  How do I compute the
+intersection of two arrays?
+
+=item How do I test whether two arrays or hashes are equal?
+
+=item How do I find the first array element for which a condition is true?
+
+=item How do I handle linked lists?
+
+=item How do I handle circular lists?
+
+=item How do I shuffle an array randomly?
+
+=item How do I process/modify each element of an array?
+
+=item How do I select a random element from an array?
+
+=item How do I permute N elements of a list?
+
+=item How do I sort an array by (anything)?
+
+=item How do I manipulate arrays of bits?
+
+=item Why does defined() return true on empty arrays and hashes?
+
+=back
+
+=item Data: Hashes (Associative Arrays)
+
+=over 4
+
+=item How do I process an entire hash?
+
+=item What happens if I add or remove keys from a hash while iterating over
+it?
+
+=item How do I look up a hash element by value?
+
+=item How can I know how many entries are in a hash?
+
+=item How do I sort a hash (optionally by value instead of key)?
+
+=item How can I always keep my hash sorted?
+
+=item What's the difference between "delete" and "undef" with hashes?
+
+=item Why don't my tied hashes make the defined/exists distinction?
+
+=item How do I reset an each() operation part-way through?
+
+=item How can I get the unique keys from two hashes?
+
+=item How can I store a multidimensional array in a DBM file?
+
+=item How can I make my hash remember the order I put elements into it?
+
+=item Why does passing a subroutine an undefined element in a hash create
+it?
+
+=item How can I make the Perl equivalent of a C structure/C++ class/hash or
+array of hashes or arrays?
+
+=item How can I use a reference as a hash key?
+
+=back
+
+=item Data: Misc
+
+=over 4
+
+=item How do I handle binary data correctly?
+
+=item How do I determine whether a scalar is a number/whole/integer/float?
+
+=item How do I keep persistent data across program calls?
+
+=item How do I print out or copy a recursive data structure?
+
+=item How do I define methods for every class/object?
+
+=item How do I verify a credit card checksum?
+
+=item How do I pack arrays of doubles or floats for XS code?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq5 - Files and Formats ($Revision: 1.42 $, $Date: 2005/12/31
+00:54:37 $)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item How do I flush/unbuffer an output filehandle?  Why must I do this?
+X<flush> X<buffer> X<unbuffer> X<autoflush>
+
+=item How do I change one line in a file/delete a line in a file/insert a
+line in the middle of a file/append to the beginning of a file?
+X<file, editing>
+
+=item How do I count the number of lines in a file?
+X<file, counting lines> X<lines> X<line>
+
+=item How can I use Perl's C<-i> option from within a program?
+X<-i> X<in-place>
+
+=item How can I copy a file?
+X<copy> X<file, copy>
+
+=item How do I make a temporary file name?
+X<file, temporary>
+
+=item How can I manipulate fixed-record-length files?
+X<fixed-length> X<file, fixed-length records>
+
+=item How can I make a filehandle local to a subroutine?  How do I pass
+filehandles between subroutines?  How do I make an array of filehandles?
+X<filehandle, local> X<filehandle, passing> X<filehandle, reference>
+
+=item How can I use a filehandle indirectly?
+X<filehandle, indirect>
+
+=item How can I set up a footer format to be used with write()?
+X<footer>
+
+=item How can I write() into a string?
+X<write, into a string>
+
+=item How can I output my numbers with commas added?
+X<number, commify>
+
+=item How can I translate tildes (~) in a filename?
+X<tilde> X<tilde expansion>
+
+=item How come when I open a file read-write it wipes it out?
+X<clobber> X<read-write> X<clobbering> X<truncate> X<truncating>
+
+=item Why do I sometimes get an "Argument list too long" when I use
+E<lt>*E<gt>?
+X<argument list too long>
+
+=item Is there a leak/bug in glob()?
+X<glob>
+
+=item How can I open a file with a leading ">" or trailing blanks?
+X<filename, special characters>
+
+=item How can I reliably rename a file?
+X<rename> X<mv> X<move> X<file, rename> X<ren>
+
+=item How can I lock a file?
+X<lock> X<file, lock> X<flock>
+
+=item Why can't I just open(FH, "E<gt>file.lock")?
+X<lock, lockfile race condition>
+
+=item I still don't get locking.  I just want to increment the number in
+the file.  How can I do this?
+X<counter> X<file, counter>
+
+=item All I want to do is append a small amount of text to the end of a
+file.  Do I still have to use locking?
+X<append> X<file, append>
+
+=item How do I randomly update a binary file?
+X<file, binary patch>
+
+=item How do I get a file's timestamp in perl?
+X<timestamp> X<file, timestamp>
+
+=item How do I set a file's timestamp in perl?
+X<timestamp> X<file, timestamp>
+
+=item How do I print to more than one file at once?
+X<print, to multiple files>
+
+=item How can I read in an entire file all at once?
+X<slurp> X<file, slurping>
+
+=item How can I read in a file by paragraphs?
+X<file, reading by paragraphs>
+
+=item How can I read a single character from a file?  From the keyboard?
+X<getc> X<file, reading one character at a time>
+
+=item How can I tell whether there's a character waiting on a filehandle?
+
+=item How do I do a C<tail -f> in perl?
+X<tail>
+
+=item How do I dup() a filehandle in Perl?
+X<dup>
+
+=item How do I close a file descriptor by number?
+X<file, closing file descriptors>
+
+=item Why can't I use "C:\temp\foo" in DOS paths?  Why doesn't
+`C:\temp\foo.exe` work?
+X<filename, DOS issues>
+
+=item Why doesn't glob("*.*") get all the files?
+X<glob>
+
+=item Why does Perl let me delete read-only files?  Why does C<-i> clobber
+protected files?  Isn't this a bug in Perl?
+
+=item How do I select a random line from a file?
+X<file, selecting a random line>
+
+=item Why do I get weird spaces when I print an array of lines?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq6 - Regular Expressions ($Revision: 1.38 $, $Date: 2005/12/31
+00:54:37 $)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item How can I hope to use regular expressions without creating illegible
+and unmaintainable code?
+X<regex, legibility> X<regexp, legibility>
+X<regular expression, legibility> X</x>
+
+Comments Outside the Regex, Comments Inside the Regex, Different Delimiters
+
+=item I'm having trouble matching over more than one line.  What's wrong?
+X<regex, multiline> X<regexp, multiline> X<regular expression, multiline>
+
+=item How can I pull out lines between two patterns that are themselves on
+different lines?
+X<..>
+
+=item I put a regular expression into $/ but it didn't work. What's wrong?
+X<$/, regexes in> X<$INPUT_RECORD_SEPARATOR, regexes in>
+X<$RS, regexes in>
+
+=item How do I substitute case insensitively on the LHS while preserving
+case on the RHS?
+X<replace, case preserving> X<substitute, case preserving>
+X<substitution, case preserving> X<s, case preserving>
+
+=item How can I make C<\w> match national character sets?
+X<\w>
+
+=item How can I match a locale-smart version of C</[a-zA-Z]/>?
+X<alpha>
+
+=item How can I quote a variable to use in a regex?
+X<regex, escaping> X<regexp, escaping> X<regular expression, escaping>
+
+=item What is C</o> really for?
+X</o>
+
+=item How do I use a regular expression to strip C style comments from a
+file?
+
+=item Can I use Perl regular expressions to match balanced text?
+X<regex, matching balanced test> X<regexp, matching balanced test>
+X<regular expression, matching balanced test>
+
+=item What does it mean that regexes are greedy?  How can I get around it?
+X<greedy> X<greediness>
+
+=item How do I process each word on each line?
+X<word>
+
+=item How can I print out a word-frequency or line-frequency summary?
+
+=item How can I do approximate matching?
+X<match, approximate> X<matching, approximate>
+
+=item How do I efficiently match many regular expressions at once?
+X<regex, efficiency> X<regexp, efficiency>
+X<regular expression, efficiency>
+
+=item Why don't word-boundary searches with C<\b> work for me?
+X<\b>
+
+=item Why does using $&, $`, or $' slow my program down?
+X<$MATCH> X<$&> X<$POSTMATCH> X<$'> X<$PREMATCH> X<$`>
+
+=item What good is C<\G> in a regular expression?
+X<\G>
+
+=item Are Perl regexes DFAs or NFAs?  Are they POSIX compliant?
+X<DFA> X<NFA> X<POSIX>
+
+=item What's wrong with using grep in a void context?
+X<grep>
+
+=item How can I match strings with multibyte characters?
+X<regex, and multibyte characters> X<regexp, and multibyte characters>
+X<regular expression, and multibyte characters>
+
+=item How do I match a pattern that is supplied by the user?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq7 - General Perl Language Issues ($Revision: 1.28 $, $Date:
+2005/12/31 00:54:37 $)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Can I get a BNF/yacc/RE for the Perl language?
+
+=item What are all these $@%&* punctuation signs, and how do I know when to
+use them?
+
+=item Do I always/never have to quote my strings or use semicolons and
+commas?
+
+=item How do I skip some return values?
+
+=item How do I temporarily block warnings?
+
+=item What's an extension?
+
+=item Why do Perl operators have different precedence than C operators?
+
+=item How do I declare/create a structure?
+
+=item How do I create a module?
+
+=item How do I create a class?
+
+=item How can I tell if a variable is tainted?
+
+=item What's a closure?
+
+=item What is variable suicide and how can I prevent it?
+
+=item How can I pass/return a {Function, FileHandle, Array, Hash, Method,
+Regex}?
+
+Passing Variables and Functions, Passing Filehandles, Passing Regexes,
+Passing Methods
+
+=item How do I create a static variable?
+
+=item What's the difference between dynamic and lexical (static) scoping? 
+Between local() and my()?
+
+=item How can I access a dynamic variable while a similarly named lexical
+is in scope?
+
+=item What's the difference between deep and shallow binding?
+
+=item Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
+
+=item How do I redefine a builtin function, operator, or method?
+
+=item What's the difference between calling a function as &foo and foo()?
+
+=item How do I create a switch or case statement?
+
+=item How can I catch accesses to undefined variables, functions, or
+methods?
+
+=item Why can't a method included in this same file be found?
+
+=item How can I find out my current package?
+
+=item How can I comment out a large block of perl code?
+
+=item How do I clear a package?
+
+=item How can I use a variable as a variable name?
+
+=item What does "bad interpreter" mean?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq8 - System Interaction ($Revision: 1.27 $, $Date: 2005/12/31
+00:54:37 $)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item How do I find out which operating system I'm running under?
+
+=item How come exec() doesn't return?
+
+=item How do I do fancy stuff with the keyboard/screen/mouse?
+
+Keyboard, Screen, Mouse
+
+=item How do I print something out in color?
+
+=item How do I read just one key without waiting for a return key?
+
+=item How do I check whether input is ready on the keyboard?
+
+=item How do I clear the screen?
+
+=item How do I get the screen size?
+
+=item How do I ask the user for a password?
+
+=item How do I read and write the serial port?
+
+lockfiles, open mode, end of line, flushing output, non-blocking input
+
+=item How do I decode encrypted password files?
+
+=item How do I start a process in the background?
+
+STDIN, STDOUT, and STDERR are shared, Signals, Zombies
+
+=item How do I trap control characters/signals?
+
+=item How do I modify the shadow password file on a Unix system?
+
+=item How do I set the time and date?
+
+=item How can I sleep() or alarm() for under a second?
+
+=item How can I measure time under a second?
+
+=item How can I do an atexit() or setjmp()/longjmp()? (Exception handling)
+
+=item Why doesn't my sockets program work under System V (Solaris)?  What
+does the error message "Protocol not supported" mean?
+
+=item How can I call my system's unique C functions from Perl?
+
+=item Where do I get the include files to do ioctl() or syscall()?
+
+=item Why do setuid perl scripts complain about kernel problems?
+
+=item How can I open a pipe both to and from a command?
+
+=item Why can't I get the output of a command with system()?
+
+=item How can I capture STDERR from an external command?
+
+=item Why doesn't open() return an error when a pipe open fails?
+
+=item What's wrong with using backticks in a void context?
+
+=item How can I call backticks without shell processing?
+
+=item Why can't my script read from STDIN after I gave it EOF (^D on Unix,
+^Z on MS-DOS)?
+
+=item How can I convert my shell script to perl?
+
+=item Can I use perl to run a telnet or ftp session?
+
+=item How can I write expect in Perl?
+
+=item Is there a way to hide perl's command line from programs such as
+"ps"?
+
+=item I {changed directory, modified my environment} in a perl script.	How
+come the change disappeared when I exited the script?  How do I get my
+changes to be visible?
+
+Unix
+
+=item How do I close a process's filehandle without waiting for it to
+complete?
+
+=item How do I fork a daemon process?
+
+=item How do I find out if I'm running interactively or not?
+
+=item How do I timeout a slow event?
+
+=item How do I set CPU limits?
+
+=item How do I avoid zombies on a Unix system?
+
+=item How do I use an SQL database?
+
+=item How do I make a system() exit on control-C?
+
+=item How do I open a file without blocking?
+
+=item How do I tell the difference between errors from the shell and perl?
+
+=item How do I install a module from CPAN?
+
+=item What's the difference between require and use?
+
+=item How do I keep my own module/library directory?
+
+=item How do I add the directory my program lives in to the module/library
+search path?
+
+=item How do I add a directory to my include path (@INC) at runtime?
+
+=item What is socket.ph and where do I get it?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlfaq9 - Networking ($Revision: 1.28 $, $Date: 2005/12/31 00:54:37
+$)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item What is the correct form of response from a CGI script?
+
+=item My CGI script runs from the command line but not the browser.  (500
+Server Error)
+
+=item How can I get better error messages from a CGI program?
+
+=item How do I remove HTML from a string?
+
+=item How do I extract URLs?
+
+=item How do I download a file from the user's machine?  How do I open a
+file on another machine?
+
+=item How do I make a pop-up menu in HTML?
+
+=item How do I fetch an HTML file?
+
+=item How do I automate an HTML form submission?
+
+=item How do I decode or create those %-encodings on the web?
+
+=item How do I redirect to another page?
+
+=item How do I put a password on my web pages?
+
+=item How do I edit my .htpasswd and .htgroup files with Perl?
+
+=item How do I make sure users can't enter values into a form that cause my
+CGI script to do bad things?
+
+=item How do I parse a mail header?
+
+=item How do I decode a CGI form?
+
+=item How do I check a valid mail address?
+
+=item How do I decode a MIME/BASE64 string?
+
+=item How do I return the user's mail address?
+
+=item How do I send mail?
+
+=item How do I use MIME to make an attachment to a mail message?
+
+=item How do I read mail?
+
+=item How do I find out my hostname, domainname, or IP address?
+X<hostname, domainname, IP address, host, domain, hostfqdn, inet_ntoa,
+gethostbyname, Socket, Net::Domain, Sys::Hostname>
+
+=item How do I fetch a news article or the active newsgroups?
+
+=item How do I fetch/put an FTP file?
+
+=item How can I do RPC in Perl?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlsyn - Perl syntax
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Declarations
+X<declaration> X<undef> X<undefined> X<uninitialized>
+
+=item Comments
+X<comment> X<#>
+
+=item Simple Statements
+X<statement> X<semicolon> X<expression> X<;>
+
+=item Truth and Falsehood
+X<truth> X<falsehood> X<true> X<false> X<!> X<not> X<negation> X<0>
+
+=item Statement Modifiers
+X<statement modifier> X<modifier> X<if> X<unless> X<while>
+X<until> X<foreach> X<for>
+
+=item Compound Statements
+X<statement, compound> X<block> X<bracket, curly> X<curly bracket> X<brace>
+X<{> X<}> X<if> X<unless> X<while> X<until> X<foreach> X<for> X<continue>
+
+=item Loop Control
+X<loop control> X<loop, control> X<next> X<last> X<redo> X<continue>
+
+=item For Loops
+X<for> X<foreach>
+
+=item Foreach Loops
+X<for> X<foreach>
+
+=item Basic BLOCKs and Switch Statements
+X<switch> X<block> X<case>
+
+=item Goto
+X<goto>
+
+=item PODs: Embedded Documentation
+X<POD> X<documentation>
+
+=item Plain Old Comments (Not!)
+X<comment> X<line> X<#> X<preprocessor> X<eval>
+
+=back
+
+=back
+
+=head2 perldata - Perl data types
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Variable names
+X<variable, name> X<variable name> X<data type> X<type>
+
+=item Context
+X<context> X<scalar context> X<list context>
+
+=item Scalar values
+X<scalar> X<number> X<string> X<reference>
+
+=item Scalar value constructors
+X<scalar, literal> X<scalar, constant>
+
+=item List value constructors
+X<list>
+
+=item Subscripts
+
+=item Slices
+X<slice> X<array, slice> X<hash, slice>
+
+=item Typeglobs and Filehandles
+X<typeglob> X<filehandle> X<*>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlop - Perl operators and precedence
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Operator Precedence and Associativity 
+X<operator, precedence> X<precedence> X<associativity>
+
+=item Terms and List Operators (Leftward)
+X<list operator> X<operator, list> X<term>
+
+=item The Arrow Operator
+X<arrow> X<dereference> X<< -> >>
+
+=item Auto-increment and Auto-decrement
+X<increment> X<auto-increment> X<++> X<decrement> X<auto-decrement> X<-->
+
+=item Exponentiation
+X<**> X<exponentiation> X<power>
+
+=item Symbolic Unary Operators
+X<unary operator> X<operator, unary>
+
+=item Binding Operators
+X<binding> X<operator, binding> X<=~> X<!~>
+
+=item Multiplicative Operators
+X<operator, multiplicative>
+
+=item Additive Operators
+X<operator, additive>
+
+=item Shift Operators
+X<shift operator> X<operator, shift> X<<< << >>>
+X<<< >> >>> X<right shift> X<left shift> X<bitwise shift>
+X<shl> X<shr> X<shift, right> X<shift, left>
+
+=item Named Unary Operators
+X<operator, named unary>
+
+=item Relational Operators
+X<relational operator> X<operator, relational>
+
+=item Equality Operators
+X<equality> X<equal> X<equals> X<operator, equality>
+
+=item Bitwise And
+X<operator, bitwise, and> X<bitwise and> X<&>
+
+=item Bitwise Or and Exclusive Or
+X<operator, bitwise, or> X<bitwise or> X<|> X<operator, bitwise, xor>
+X<bitwise xor> X<^>
+
+=item C-style Logical And
+X<&&> X<logical and> X<operator, logical, and>
+
+=item C-style Logical Or
+X<||> X<operator, logical, or>
+
+=item Range Operators
+X<operator, range> X<range> X<..> X<...>
+
+=item Conditional Operator
+X<operator, conditional> X<operator, ternary> X<ternary> X<?:>
+
+=item Assignment Operators
+X<assignment> X<operator, assignment> X<=> X<**=> X<+=> X<*=> X<&=>
+X<<< <<= >>> X<&&=> X<-=> X</=> X<|=> X<<< >>= >>> X<||=> X<.=>
+X<%=> X<^=> X<x=>
+
+=item Comma Operator
+X<comma> X<operator, comma> X<,>
+
+=item List Operators (Rightward)
+X<operator, list, rightward> X<list operator>
+
+=item Logical Not
+X<operator, logical, not> X<not>
+
+=item Logical And
+X<operator, logical, and> X<and>
+
+=item Logical or and Exclusive Or
+X<operator, logical, or> X<operator, logical, xor> X<operator, logical,
+err>
+X<operator, logical, defined or> X<operator, logical, exclusive or>
+X<or> X<xor> X<err>
+
+=item C Operators Missing From Perl
+X<operator, missing from perl> X<&> X<*>
+X<typecasting> X<(TYPE)>
+
+unary &, unary *, (TYPE)
+
+=item Quote and Quote-like Operators
+X<operator, quote> X<operator, quote-like> X<q> X<qq> X<qx> X<qw> X<m> 
+X<qr> X<s> X<tr> X<'> X<''> X<"> X<""> X<//> X<`> X<``> X<<< << >>>
+X<escape sequence> X<escape>
+
+=item Regexp Quote-Like Operators
+X<operator, regexp>
+
+?PATTERN? X<?>, m/PATTERN/cgimosx X<m> X<operator, match>  X<regexp,
+options> X<regexp> X<regex, options> X<regex>  X</c> X</i> X</m> X</o>
+X</s> X</x>, /PATTERN/cgimosx, q/STRING/ X<q> X<quote, double> X<'> X<''>,
+C<'STRING'>, qq/STRING/ X<qq> X<quote, double> X<"> X<"">, "STRING",
+qr/STRING/imosx X<qr> X</i> X</m> X</o> X</s> X</x>, qx/STRING/ X<qx> X<`>
+X<``> X<backtick>, `STRING`, qw/STRING/ X<qw> X<quote, list> X<quote,
+words>, s/PATTERN/REPLACEMENT/egimosx X<substitute> X<substitution>
+X<replace> X<regexp, replace> X<regexp, substitute> X</e> X</g> X</i> X</m>
+X</o> X</s> X</x>, tr/SEARCHLIST/REPLACEMENTLIST/cds X<tr> X<y>
+X<transliterate> X</c> X</d> X</s>, y/SEARCHLIST/REPLACEMENTLIST/cds, <<EOF
+X<here-doc> X<heredoc> X<here-document> X<<< << >>>
+
+=item Gory details of parsing quoted constructs
+X<quote, gory details>
+
+Finding the end, Removal of backslashes before delimiters, Interpolation
+X<interpolation>, C<<<'EOF'>, C<m''>, C<s'''>, C<tr///>, C<y///>, C<''>,
+C<q//>, C<"">, C<``>, C<qq//>, C<qx//>, C<< <file*glob> >>, C<?RE?>,
+C</RE/>, C<m/RE/>, C<s/RE/foo/>,, Interpolation of regular expressions
+X<regexp, interpolation>, Optimization of regular expressions X<regexp,
+optimization>
+
+=item I/O Operators
+X<operator, i/o> X<operator, io> X<io> X<while> X<filehandle>
+X<< <> >> X<@ARGV>
+
+=item Constant Folding
+X<constant folding> X<folding>
+
+=item No-ops
+X<no-op> X<nop>
+
+=item Bitwise String Operators
+X<operator, bitwise, string>
+
+=item Integer Arithmetic
+X<integer>
+
+=item Floating-point Arithmetic
+X<floating-point> X<floating point> X<float> X<real>
+
+=item Bigger Numbers
+X<number, arbitrary precision>
+
+=back
+
+=back
+
+=head2 perlsub - Perl subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Private Variables via my()
+X<my> X<variable, lexical> X<lexical> X<lexical variable> X<scope, lexical>
+X<lexical scope> X<attributes, my>
+
+=item Persistent Private Variables
+X<static> X<variable, persistent> X<variable, static> X<closure>
+
+=item Temporary Values via local()
+X<local> X<scope, dynamic> X<dynamic scope> X<variable, local>
+X<variable, temporary>
+
+=item Lvalue subroutines
+X<lvalue> X<subroutine, lvalue>
+
+Lvalue subroutines are EXPERIMENTAL
+
+=item Passing Symbol Table Entries (typeglobs)
+X<typeglob> X<*>
+
+=item When to Still Use local()
+X<local> X<variable, local>
+
+=item Pass by Reference
+X<pass by reference> X<pass-by-reference> X<reference>
+
+=item Prototypes
+X<prototype> X<subroutine, prototype>
+
+=item Constant Functions
+X<constant>
+
+=item Overriding Built-in Functions
+X<built-in> X<override> X<CORE> X<CORE::GLOBAL>
+
+=item Autoloading
+X<autoloading> X<AUTOLOAD>
+
+=item Subroutine Attributes
+X<attribute> X<subroutine, attribute> X<attrs>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlfunc - Perl builtin functions
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Perl Functions by Category
+X<function>
+
+Functions for SCALARs or strings X<scalar> X<string> X<character>, Regular
+expressions and pattern matching X<regular expression> X<regex> X<regexp>,
+Numeric functions X<numeric> X<number> X<trigonometric> X<trigonometry>,
+Functions for real @ARRAYs X<array>, Functions for list data X<list>,
+Functions for real %HASHes X<hash>, Input and output functions X<I/O>
+X<input> X<output> X<dbm>, Functions for fixed length data or records,
+Functions for filehandles, files, or directories X<file> X<filehandle>
+X<directory> X<pipe> X<link> X<symlink>, Keywords related to the control
+flow of your Perl program X<control flow>, Keywords related to scoping,
+Miscellaneous functions, Functions for processes and process groups
+X<process> X<pid> X<process id>, Keywords related to perl modules
+X<module>, Keywords related to classes and object-orientedness X<object>
+X<class> X<package>, Low-level socket functions X<socket> X<sock>, System V
+interprocess communication functions X<IPC> X<System V> X<semaphore>
+X<shared memory> X<memory> X<message>, Fetching user and group info X<user>
+X<group> X<password> X<uid> X<gid>  X<passwd> X</etc/passwd>, Fetching
+network info X<network> X<protocol> X<host> X<hostname> X<IP> X<address>
+X<service>, Time-related functions X<time> X<date>, Functions new in perl5
+X<perl5>, Functions obsoleted in perl5
+
+=item Portability
+X<portability> X<Unix> X<portable>
+
+=item Alphabetical Listing of Perl Functions
+
+-I<X> FILEHANDLE
+X<-r>X<-w>X<-x>X<-o>X<-R>X<-W>X<-X>X<-O>X<-e>X<-z>X<-s>X<-f>X<-d>X<-l>X<-p>
+X<-S>X<-b>X<-c>X<-t>X<-u>X<-g>X<-k>X<-T>X<-B>X<-M>X<-A>X<-C>, -I<X> EXPR,
+-I<X>, abs VALUE X<abs> X<absolute>, abs, accept NEWSOCKET,GENERICSOCKET
+X<accept>, alarm SECONDS X<alarm> X<SIGALRM> X<timer>, alarm, atan2 Y,X
+X<atan2> X<arctangent> X<tan> X<tangent>, bind SOCKET,NAME X<bind>, binmode
+FILEHANDLE, LAYER X<binmode> X<binary> X<text> X<DOS> X<Windows>, binmode
+FILEHANDLE, bless REF,CLASSNAME X<bless>, bless REF, caller EXPR X<caller>
+X<call stack> X<stack> X<stack trace>, caller, chdir EXPR X<chdir> X<cd>,
+chdir FILEHANDLE, chdir DIRHANDLE, chdir, chmod LIST X<chmod> X<permission>
+X<mode>, chomp VARIABLE X<chomp> X<INPUT_RECORD_SEPARATOR> X<$/> X<newline>
+X<eol>, chomp( LIST ), chomp, chop VARIABLE X<chop>, chop( LIST ), chop,
+chown LIST X<chown> X<owner> X<user> X<group>, chr NUMBER X<chr>
+X<character> X<ASCII> X<Unicode>, chr, chroot FILENAME X<chroot> X<root>,
+chroot, close FILEHANDLE X<close>, close, closedir DIRHANDLE X<closedir>,
+connect SOCKET,NAME X<connect>, continue BLOCK X<continue>, cos EXPR X<cos>
+X<cosine> X<acos> X<arccosine>, cos, crypt PLAINTEXT,SALT X<crypt>
+X<digest> X<hash> X<salt> X<plaintext> X<password> X<decrypt>
+X<cryptography> X<passwd>, dbmclose HASH X<dbmclose>, dbmopen
+HASH,DBNAME,MASK X<dbmopen> X<dbm> X<ndbm> X<sdbm> X<gdbm>, defined EXPR
+X<defined> X<undef> X<undefined>, defined, delete EXPR X<delete>, die LIST
+X<die> X<throw> X<exception> X<raise> X<$@> X<abort>, do BLOCK X<do>
+X<block>, do SUBROUTINE(LIST) X<do>, do EXPR X<do>, dump LABEL X<dump>
+X<core> X<undump>, dump, each HASH X<each> X<hash, iterator>, eof
+FILEHANDLE X<eof> X<end of file> X<end-of-file>, eof (), eof, eval EXPR
+X<eval> X<try> X<catch> X<evaluate> X<parse> X<execute>, eval BLOCK, eval,
+exec LIST X<exec> X<execute>, exec PROGRAM LIST, exists EXPR X<exists>
+X<autovivification>, exit EXPR X<exit> X<terminate> X<abort>, exit, exp
+EXPR X<exp> X<exponential> X<antilog> X<antilogarithm> X<e>, exp, fcntl
+FILEHANDLE,FUNCTION,SCALAR X<fcntl>, fileno FILEHANDLE X<fileno>, flock
+FILEHANDLE,OPERATION X<flock> X<lock> X<locking>, fork X<fork> X<child>
+X<parent>, format X<format>, formline PICTURE,LIST X<formline>, getc
+FILEHANDLE X<getc> X<getchar>, getc, getlogin X<getlogin> X<login>,
+getpeername SOCKET X<getpeername> X<peer>, getpgrp PID X<getpgrp> X<group>,
+getppid X<getppid> X<parent> X<pid>, getpriority WHICH,WHO X<getpriority>
+X<priority> X<nice>, getpwnam NAME X<getpwnam> X<getgrnam> X<gethostbyname>
+X<getnetbyname> X<getprotobyname> X<getpwuid> X<getgrgid> X<getservbyname>
+X<gethostbyaddr> X<getnetbyaddr> X<getprotobynumber> X<getservbyport>
+X<getpwent> X<getgrent> X<gethostent> X<getnetent> X<getprotoent>
+X<getservent> X<setpwent> X<setgrent> X<sethostent> X<setnetent>
+X<setprotoent> X<setservent> X<endpwent> X<endgrent> X<endhostent>
+X<endnetent> X<endprotoent> X<endservent>, getgrnam NAME, gethostbyname
+NAME, getnetbyname NAME, getprotobyname NAME, getpwuid UID, getgrgid GID,
+getservbyname NAME,PROTO, gethostbyaddr ADDR,ADDRTYPE, getnetbyaddr
+ADDR,ADDRTYPE, getprotobynumber NUMBER, getservbyport PORT,PROTO, getpwent,
+getgrent, gethostent, getnetent, getprotoent, getservent, setpwent,
+setgrent, sethostent STAYOPEN, setnetent STAYOPEN, setprotoent STAYOPEN,
+setservent STAYOPEN, endpwent, endgrent, endhostent, endnetent,
+endprotoent, endservent, getsockname SOCKET X<getsockname>, getsockopt
+SOCKET,LEVEL,OPTNAME X<getsockopt>, glob EXPR X<glob> X<wildcard>
+X<filename, expansion> X<expand>, glob, gmtime EXPR X<gmtime> X<UTC>
+X<Greenwich>, gmtime, goto LABEL X<goto> X<jump> X<jmp>, goto EXPR, goto
+&NAME, grep BLOCK LIST X<grep>, grep EXPR,LIST, hex EXPR X<hex>
+X<hexadecimal>, hex, import LIST X<import>, index STR,SUBSTR,POSITION
+X<index> X<indexOf> X<InStr>, index STR,SUBSTR, int EXPR X<int> X<integer>
+X<truncate> X<trunc>, int, ioctl FILEHANDLE,FUNCTION,SCALAR X<ioctl>, join
+EXPR,LIST X<join>, keys HASH X<keys> X<key>, kill SIGNAL, LIST X<kill>
+X<signal>, last LABEL X<last> X<break>, last, lc EXPR X<lc> X<lowercase>,
+lc, lcfirst EXPR X<lcfirst> X<lowercase>, lcfirst, length EXPR X<length>
+X<size>, length, link OLDFILE,NEWFILE X<link>, listen SOCKET,QUEUESIZE
+X<listen>, local EXPR X<local>, localtime EXPR X<localtime>, localtime,
+lock THING X<lock>, log EXPR X<log> X<logarithm> X<e> X<ln> X<base>, log,
+lstat EXPR X<lstat>, lstat, m//, map BLOCK LIST X<map>, map EXPR,LIST,
+mkdir FILENAME,MASK X<mkdir> X<md> X<directory, create>, mkdir FILENAME,
+msgctl ID,CMD,ARG X<msgctl>, msgget KEY,FLAGS X<msgget>, msgrcv
+ID,VAR,SIZE,TYPE,FLAGS X<msgrcv>, msgsnd ID,MSG,FLAGS X<msgsnd>, my EXPR
+X<my>, my TYPE EXPR, my EXPR : ATTRS, my TYPE EXPR : ATTRS, next LABEL
+X<next> X<continue>, next, no Module VERSION LIST X<no>, no Module VERSION,
+no Module LIST, no Module, oct EXPR X<oct> X<octal> X<hex> X<hexadecimal>
+X<binary> X<bin>, oct, open FILEHANDLE,EXPR X<open> X<pipe> X<file, open>
+X<fopen>, open FILEHANDLE,MODE,EXPR, open FILEHANDLE,MODE,EXPR,LIST, open
+FILEHANDLE,MODE,REFERENCE, open FILEHANDLE, opendir DIRHANDLE,EXPR
+X<opendir>, ord EXPR X<ord> X<encoding>, ord, our EXPR X<our> X<global>,
+our EXPR TYPE, our EXPR : ATTRS, our TYPE EXPR : ATTRS, pack TEMPLATE,LIST
+X<pack>, package NAMESPACE X<package> X<module> X<namespace>, package, pipe
+READHANDLE,WRITEHANDLE X<pipe>, pop ARRAY X<pop> X<stack>, pop, pos SCALAR
+X<pos> X<match, position>, pos, print FILEHANDLE LIST X<print>, print LIST,
+print, printf FILEHANDLE FORMAT, LIST X<printf>, printf FORMAT, LIST,
+prototype FUNCTION X<prototype>, push ARRAY,LIST X<push>, X<stack>,
+q/STRING/, qq/STRING/, qr/STRING/, qx/STRING/, qw/STRING/, quotemeta EXPR
+X<quotemeta> X<metacharacter>, quotemeta, rand EXPR X<rand> X<random>,
+rand, read FILEHANDLE,SCALAR,LENGTH,OFFSET X<read>, read
+FILEHANDLE,SCALAR,LENGTH, readdir DIRHANDLE X<readdir>, readline EXPR
+X<readline> X<gets> X<fgets>, readlink EXPR X<readlink>, readlink, readpipe
+EXPR X<readpipe>, recv SOCKET,SCALAR,LENGTH,FLAGS X<recv>, redo LABEL
+X<redo>, redo, ref EXPR X<ref> X<reference>, ref, rename OLDNAME,NEWNAME
+X<rename> X<move> X<mv> X<ren>, require VERSION X<require>, require EXPR,
+require, reset EXPR X<reset>, reset, return EXPR X<return>, return, reverse
+LIST X<reverse> X<rev> X<invert>, rewinddir DIRHANDLE X<rewinddir>, rindex
+STR,SUBSTR,POSITION X<rindex>, rindex STR,SUBSTR, rmdir FILENAME X<rmdir>
+X<rd> X<directory, remove>, rmdir, s///, scalar EXPR X<scalar> X<context>,
+seek FILEHANDLE,POSITION,WHENCE X<seek> X<fseek> X<filehandle, position>,
+seekdir DIRHANDLE,POS X<seekdir>, select FILEHANDLE X<select> X<filehandle,
+default>, select, select RBITS,WBITS,EBITS,TIMEOUT X<select>, semctl
+ID,SEMNUM,CMD,ARG X<semctl>, semget KEY,NSEMS,FLAGS X<semget>, semop
+KEY,OPSTRING X<semop>, send SOCKET,MSG,FLAGS,TO X<send>, send
+SOCKET,MSG,FLAGS, setpgrp PID,PGRP X<setpgrp> X<group>, setpriority
+WHICH,WHO,PRIORITY X<setpriority> X<priority> X<nice> X<renice>, setsockopt
+SOCKET,LEVEL,OPTNAME,OPTVAL X<setsockopt>, shift ARRAY X<shift>, shift,
+shmctl ID,CMD,ARG X<shmctl>, shmget KEY,SIZE,FLAGS X<shmget>, shmread
+ID,VAR,POS,SIZE X<shmread> X<shmwrite>, shmwrite ID,STRING,POS,SIZE,
+shutdown SOCKET,HOW X<shutdown>, sin EXPR X<sin> X<sine> X<asin>
+X<arcsine>, sin, sleep EXPR X<sleep> X<pause>, sleep, socket
+SOCKET,DOMAIN,TYPE,PROTOCOL X<socket>, socketpair
+SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL X<socketpair>, sort SUBNAME LIST
+X<sort> X<qsort> X<quicksort> X<mergesort>, sort BLOCK LIST, sort LIST,
+splice ARRAY,OFFSET,LENGTH,LIST X<splice>, splice ARRAY,OFFSET,LENGTH,
+splice ARRAY,OFFSET, splice ARRAY, split /PATTERN/,EXPR,LIMIT X<split>,
+split /PATTERN/,EXPR, split /PATTERN/, split, sprintf FORMAT, LIST
+X<sprintf>, format parameter index, flags, vector flag, (minimum) width,
+precision, or maximum width X<precision>, size, order of arguments, sqrt
+EXPR X<sqrt> X<root> X<square root>, sqrt, srand EXPR X<srand> X<seed>
+X<randseed>, srand, stat FILEHANDLE X<stat> X<file, status>, stat EXPR,
+stat, study SCALAR X<study>, study, sub NAME BLOCK X<sub>, sub NAME (PROTO)
+BLOCK, sub NAME : ATTRS BLOCK, sub NAME (PROTO) : ATTRS BLOCK, substr
+EXPR,OFFSET,LENGTH,REPLACEMENT X<substr> X<substring> X<mid> X<left>
+X<right>, substr EXPR,OFFSET,LENGTH, substr EXPR,OFFSET, symlink
+OLDFILE,NEWFILE X<symlink> X<link> X<symbolic link> X<link, symbolic>,
+syscall NUMBER, LIST X<syscall> X<system call>, sysopen
+FILEHANDLE,FILENAME,MODE X<sysopen>, sysopen
+FILEHANDLE,FILENAME,MODE,PERMS, sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
+X<sysread>, sysread FILEHANDLE,SCALAR,LENGTH, sysseek
+FILEHANDLE,POSITION,WHENCE X<sysseek> X<lseek>, system LIST X<system>
+X<shell>, system PROGRAM LIST, syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
+X<syswrite>, syswrite FILEHANDLE,SCALAR,LENGTH, syswrite FILEHANDLE,SCALAR,
+tell FILEHANDLE X<tell>, tell, telldir DIRHANDLE X<telldir>, tie
+VARIABLE,CLASSNAME,LIST X<tie>, tied VARIABLE X<tied>, time X<time>
+X<epoch>, times X<times>, tr///, truncate FILEHANDLE,LENGTH X<truncate>,
+truncate EXPR,LENGTH, uc EXPR X<uc> X<uppercase> X<toupper>, uc, ucfirst
+EXPR X<ucfirst> X<uppercase>, ucfirst, umask EXPR X<umask>, umask, undef
+EXPR X<undef> X<undefine>, undef, unlink LIST X<unlink> X<delete> X<remove>
+X<rm>, unlink, unpack TEMPLATE,EXPR X<unpack>, untie VARIABLE X<untie>,
+unshift ARRAY,LIST X<unshift>, use Module VERSION LIST X<use> X<module>
+X<import>, use Module VERSION, use Module LIST, use Module, use VERSION,
+utime LIST X<utime>, values HASH X<values>, vec EXPR,OFFSET,BITS X<vec>
+X<bit> X<bit vector>, wait X<wait>, waitpid PID,FLAGS X<waitpid>, wantarray
+X<wantarray> X<context>, warn LIST X<warn> X<warning> X<STDERR>, write
+FILEHANDLE X<write>, write EXPR, write, y///
+
+=back
+
+=back
+
+=head2 perlopentut - tutorial on opening things in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item Open E<agrave> la shell
+
+=over 4
+
+=item Simple Opens
+
+=item Indirect Filehandles
+
+=item Pipe Opens
+
+=item The Minus File
+
+=item Mixing Reads and Writes
+
+=item Filters 
+
+=back
+
+=item Open E<agrave> la C
+
+=over 4
+
+=item Permissions E<agrave> la mode
+
+=back
+
+=item Obscure Open Tricks
+
+=over 4
+
+=item Re-Opening Files (dups)
+
+=item Dispelling the Dweomer
+
+=item Paths as Opens
+
+=item Single Argument Open
+
+=item Playing with STDIN and STDOUT
+
+=back
+
+=item Other I/O Issues
+
+=over 4
+
+=item Opening Non-File Files
+
+=item Opening Named Pipes
+
+=item Opening Sockets
+
+=item Binary Files
+
+=item File Locking
+
+=item IO Layers
+
+=back
+
+=item SEE ALSO 
+
+=item AUTHOR and COPYRIGHT
+
+=item HISTORY
+
+=back
+
+=head2 perlpacktut - tutorial on C<pack> and C<unpack>
+
+=over 4
+
+=item DESCRIPTION
+
+=item The Basic Principle
+
+=item Packing Text
+
+=item Packing Numbers
+
+=over 4
+
+=item Integers
+
+=item Unpacking a Stack Frame
+
+=item How to Eat an Egg on a Net
+
+=item Floating point Numbers
+
+=back
+
+=item Exotic Templates
+
+=over 4
+
+=item Bit Strings
+
+=item Uuencoding
+
+=item Doing Sums
+
+=item  Unicode
+
+=item Another Portable Binary Encoding
+
+=back
+
+=item Template Grouping
+
+=item Lengths and Widths
+
+=over 4
+
+=item String Lengths
+
+=item Dynamic Templates
+
+=item Counting Repetitions
+
+=back
+
+=item Packing and Unpacking C Structures
+
+=over 4
+
+=item The Alignment Pit
+
+=item Alignment, Take 2
+
+=item Alignment, Take 3
+
+=item Pointers for How to Use Them
+
+=back
+
+=item Pack Recipes
+
+=item Funnies Section
+
+=item Authors
+
+=back
+
+=head2 perlpod - the Plain Old Documentation format
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Ordinary Paragraph
+X<POD, ordinary paragraph>
+
+=item Verbatim Paragraph
+X<POD, verbatim paragraph> X<verbatim>
+
+=item Command Paragraph
+X<POD, command>
+
+C<=head1 I<Heading Text>> X<=head1> X<=head2> X<=head3> X<=head4> X<head1>
+X<head2> X<head3> X<head4>, C<=head2 I<Heading Text>>, C<=head3 I<Heading
+Text>>, C<=head4 I<Heading Text>>, C<=over I<indentlevel>> X<=over>
+X<=item> X<=back> X<over> X<item> X<back>, C<=item I<stuff...>>, C<=back>,
+C<=cut> X<=cut> X<cut>, C<=pod> X<=pod> X<pod>, C<=begin I<formatname>>
+X<=begin> X<=end> X<=for> X<begin> X<end> X<for>, C<=end I<formatname>>,
+C<=for I<formatname> I<text...>>, C<=encoding I<encodingname>> X<=encoding>
+X<encoding>
+
+=item Formatting Codes
+X<POD, formatting code> X<formatting code>
+X<POD, interior sequence> X<interior sequence>
+
+C<IE<lt>textE<gt>> -- italic text X<I> X<< IZ<><> >> X<POD, formatting
+code, italic> X<italic>, C<BE<lt>textE<gt>> -- bold text X<B> X<< BZ<><> >>
+X<POD, formatting code, bold> X<bold>, C<CE<lt>codeE<gt>> -- code text X<C>
+X<< CZ<><> >> X<POD, formatting code, code> X<code>, C<LE<lt>nameE<gt>> --
+a hyperlink X<L> X<< LZ<><> >> X<POD, formatting code, hyperlink>
+X<hyperlink>, C<EE<lt>escapeE<gt>> -- a character escape X<E> X<< EZ<><> >>
+X<POD, formatting code, escape> X<escape>, C<FE<lt>filenameE<gt>> -- used
+for filenames X<F> X<< FZ<><> >> X<POD, formatting code, filename>
+X<filename>, C<SE<lt>textE<gt>> -- text contains non-breaking spaces X<S>
+X<< SZ<><> >> X<POD, formatting code, non-breaking space>  X<non-breaking
+space>, C<XE<lt>topic nameE<gt>> -- an index entry X<X> X<< XZ<><> >>
+X<POD, formatting code, index entry> X<index entry>, C<ZE<lt>E<gt>> -- a
+null (zero-effect) formatting code X<Z> X<< ZZ<><> >> X<POD, formatting
+code, null> X<null>
+
+=item The Intent
+X<POD, intent of>
+
+=item Embedding Pods in Perl Modules
+X<POD, embedding>
+
+=item Hints for Writing Pod
+
+X<podchecker> X<POD, validating>
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perlpodspec - Plain Old Documentation: format specification and
+notes
+
+=over 4
+
+=item DESCRIPTION
+
+=item Pod Definitions
+
+=item Pod Commands
+
+"=head1", "=head2", "=head3", "=head4", "=pod", "=cut", "=over", "=item",
+"=back", "=begin formatname", "=end formatname", "=for formatname text...",
+"=encoding encodingname"
+
+=item Pod Formatting Codes
+
+C<IE<lt>textE<gt>> -- italic text, C<BE<lt>textE<gt>> -- bold text,
+C<CE<lt>codeE<gt>> -- code text, C<FE<lt>filenameE<gt>> -- style for
+filenames, C<XE<lt>topic nameE<gt>> -- an index entry, C<ZE<lt>E<gt>> -- a
+null (zero-effect) formatting code, C<LE<lt>nameE<gt>> -- a hyperlink,
+C<EE<lt>escapeE<gt>> -- a character escape, C<SE<lt>textE<gt>> -- text
+contains non-breaking spaces
+
+=item Notes on Implementing Pod Processors
+
+=item About LE<lt>...E<gt> Codes
+
+First:, Second:, Third:, Fourth:, Fifth:, Sixth:
+
+=item About =over...=back Regions
+
+=item About Data Paragraphs and "=begin/=end" Regions
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perlrun - how to execute the Perl interpreter
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item #! and quoting on non-Unix systems
+X<hashbang> X<#!>
+
+OS/2, MS-DOS, Win95/NT, Macintosh, VMS
+
+=item Location of Perl
+X<perl, location of interpreter>
+
+=item Command Switches
+X<perl, command switches> X<command switches>
+
+B<-0>[I<octal/hexadecimal>] X<-0> X<$/>, B<-a> X<-a> X<autosplit>, B<-C
+[I<number/list>]> X<-C>, B<-c> X<-c>, B<-d> X<-d> X<-dt>, B<-dt>,
+B<-d:>I<foo[=bar,baz]> X<-d> X<-dt>, B<-dt:>I<foo[=bar,baz]>,
+B<-D>I<letters> X<-D> X<DEBUGGING> X<-DDEBUGGING>, B<-D>I<number>, B<-e>
+I<commandline> X<-e>, B<-f> X<-f>, B<-F>I<pattern> X<-F>, B<-h> X<-h>,
+B<-i>[I<extension>] X<-i> X<in-place>, B<-I>I<directory> X<-I> X<@INC>,
+B<-l>[I<octnum>] X<-l> X<$/> X<$\>, B<-m>[B<->]I<module> X<-m> X<-M>,
+B<-M>[B<->]I<module>, B<-M>[B<->]I<'module ...'>,
+B<-[mM]>[B<->]I<module=arg[,arg]...>, B<-n> X<-n>, B<-p> X<-p>, B<-P>
+X<-P>, B<-s> X<-s>, B<-S> X<-S>, B<-t> X<-t>, B<-T> X<-T>, B<-u> X<-u>,
+B<-U> X<-U>, B<-v> X<-v>, B<-V> X<-V>, B<-V:>I<configvar>, B<-w> X<-w>,
+B<-W> X<-W>, B<-X> X<-X>, B<-x> X<-x>, B<-x> I<directory>
+
+=back
+
+=item ENVIRONMENT
+X<perl, environment variables>
+
+HOME X<HOME>, LOGDIR X<LOGDIR>, PATH X<PATH>, PERL5LIB X<PERL5LIB>,
+PERL5OPT X<PERL5OPT>, PERLIO X<PERLIO>, :bytes X<:bytes>, :crlf X<:crlf>,
+:mmap X<:mmap>, :perlio X<:perlio>, :pop X<:pop>, :raw X<:raw>, :stdio
+X<:stdio>, :unix X<:unix>, :utf8 X<:utf8>, :win32 X<:win32>, PERLIO_DEBUG
+X<PERLIO_DEBUG>, PERLLIB X<PERLLIB>, PERL5DB X<PERL5DB>, PERL5DB_THREADED
+X<PERL5DB_THREADED>, PERL5SHELL (specific to the Win32 port) X<PERL5SHELL>,
+PERL_ALLOW_NON_IFS_LSP (specific to the Win32 port)
+X<PERL_ALLOW_NON_IFS_LSP>, PERL_DEBUG_MSTATS X<PERL_DEBUG_MSTATS>,
+PERL_DESTRUCT_LEVEL X<PERL_DESTRUCT_LEVEL>, PERL_DL_NONLAZY
+X<PERL_DL_NONLAZY>, PERL_ENCODING X<PERL_ENCODING>, PERL_HASH_SEED
+X<PERL_HASH_SEED>, PERL_HASH_SEED_DEBUG X<PERL_HASH_SEED_DEBUG>, PERL_ROOT
+(specific to the VMS port) X<PERL_ROOT>, PERL_SIGNALS X<PERL_SIGNALS>,
+PERL_UNICODE X<PERL_UNICODE>, SYS$LOGIN (specific to the VMS port)
+X<SYS$LOGIN>
+
+=back
+
+=head2 perldiag - various Perl diagnostics
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 perllexwarn - Perl Lexical Warnings
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Default Warnings and Optional Warnings
+
+=item What's wrong with B<-w> and C<$^W>
+
+=item Controlling Warnings from the Command Line
+
+B<-w> X<-w>, B<-W> X<-W>, B<-X> X<-X>
+
+=item Backward Compatibility
+
+=item Category Hierarchy
+X<warning, categories>
+
+=item Fatal Warnings
+X<warning, fatal>
+
+=item Reporting Warnings from a Module
+X<warning, reporting> X<warning, registering>
+
+=back
+
+=item TODO
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perldebug - Perl debugging
+
+=over 4
+
+=item DESCRIPTION
+
+=item The Perl Debugger
+
+=over 4
+
+=item Debugger Commands
+
+h X<debugger command, h>, h [command], h h, p expr X<debugger command, p>,
+x [maxdepth] expr X<debugger command, x>, V [pkg [vars]] X<debugger
+command, V>, X [vars] X<debugger command, X>, y [level [vars]] X<debugger
+command, y>, T X<debugger command, T> X<backtrace> X<stack, backtrace>, s
+[expr] X<debugger command, s> X<step>, n [expr] X<debugger command, n>, r
+X<debugger command, r>, <CR>, c [line|sub] X<debugger command, c>, l
+X<debugger command, l>, l min+incr, l min-max, l line, l subname, -
+X<debugger command, ->, v [line] X<debugger command, v>, . X<debugger
+command, .>, f filename X<debugger command, f>, /pattern/, ?pattern?, L
+[abw] X<debugger command, L>, S [[!]regex] X<debugger command, S>, t
+X<debugger command, t>, t expr X<debugger command, t>, b X<breakpoint>
+X<debugger command, b>, b [line] [condition] X<breakpoint> X<debugger
+command, b>, b subname [condition] X<breakpoint> X<debugger command, b>, b
+postpone subname [condition] X<breakpoint> X<debugger command, b>, b load
+filename X<breakpoint> X<debugger command, b>, b compile subname
+X<breakpoint> X<debugger command, b>, B line X<breakpoint> X<debugger
+command, B>, B * X<breakpoint> X<debugger command, B>, a [line] command
+X<debugger command, a>, A line X<debugger command, A>, A * X<debugger
+command, A>, w expr X<debugger command, w>, W expr X<debugger command, W>,
+W * X<debugger command, W>, o X<debugger command, o>, o booloption ...
+X<debugger command, o>, o anyoption? ... X<debugger command, o>, o
+option=value ... X<debugger command, o>, < ? X<< debugger command, < >>, <
+[ command ] X<< debugger command, < >>, < * X<< debugger command, < >>, <<
+command X<< debugger command, << >>, > ? X<< debugger command, > >>, >
+command X<< debugger command, > >>, > * X<< debugger command, > >>, >>
+command X<<< debugger command, >> >>>, { ? X<debugger command, {>, { [
+command ], { * X<debugger command, {>, {{ command X<debugger command, {{>,
+! number X<debugger command, !>, ! -number X<debugger command, !>, !
+pattern X<debugger command, !>, !! cmd X<debugger command, !!>, source file
+X<debugger command, source>, H -number X<debugger command, H>, q or ^D
+X<debugger command, q> X<debugger command, ^D>, R X<debugger command, R>,
+|dbcmd X<debugger command, |>, ||dbcmd X<debugger command, ||>, command, m
+expr X<debugger command, m>, M X<debugger command, M>, man [manpage]
+X<debugger command, man>
+
+=item Configurable Options
+
+C<recallCommand>, C<ShellBang> X<debugger option, recallCommand> X<debugger
+option, ShellBang>, C<pager> X<debugger option, pager>, C<tkRunning>
+X<debugger option, tkRunning>, C<signalLevel>, C<warnLevel>, C<dieLevel>
+X<debugger option, signalLevel> X<debugger option, warnLevel> X<debugger
+option, dieLevel>, C<AutoTrace> X<debugger option, AutoTrace>, C<LineInfo>
+X<debugger option, LineInfo>, C<inhibit_exit> X<debugger option,
+inhibit_exit>, C<PrintRet> X<debugger option, PrintRet>, C<ornaments>
+X<debugger option, ornaments>, C<frame> X<debugger option, frame>,
+C<maxTraceLen> X<debugger option, maxTraceLen>, C<windowSize> X<debugger
+option, windowSize>, C<arrayDepth>, C<hashDepth> X<debugger option,
+arrayDepth> X<debugger option, hashDepth>, C<dumpDepth> X<debugger option,
+dumpDepth>, C<compactDump>, C<veryCompact> X<debugger option, compactDump>
+X<debugger option, veryCompact>, C<globPrint> X<debugger option,
+globPrint>, C<DumpDBFiles> X<debugger option, DumpDBFiles>, C<DumpPackages>
+X<debugger option, DumpPackages>, C<DumpReused> X<debugger option,
+DumpReused>, C<quote>, C<HighBit>, C<undefPrint> X<debugger option, quote>
+X<debugger option, HighBit> X<debugger option, undefPrint>, C<UsageOnly>
+X<debugger option, UsageOnly>, C<TTY> X<debugger option, TTY>, C<noTTY>
+X<debugger option, noTTY>, C<ReadLine> X<debugger option, ReadLine>,
+C<NonStop> X<debugger option, NonStop>
+
+=item Debugger input/output
+
+Prompt, Multiline commands, Stack backtrace X<backtrace> X<stack,
+backtrace>, Line Listing Format, Frame listing
+
+=item Debugging compile-time statements
+
+=item Debugger Customization
+
+=item Readline Support
+
+=item Editor Support for Debugging
+
+=item The Perl Profiler
+X<profile> X<profiling> X<profiler>
+
+=back
+
+=item Debugging regular expressions
+X<regular expression, debugging>
+X<regex, debugging> X<regexp, debugging>
+
+=item Debugging memory usage
+X<memory usage>
+
+=item SEE ALSO
+
+=item BUGS
+
+=back
+
+=head2 perlvar - Perl predefined variables
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Predefined Names
+
+$ARG, $_, $a, $b, $<I<digits>>, $MATCH, $&, $PREMATCH, $`, $POSTMATCH, $',
+$LAST_PAREN_MATCH, $+, $^N, @LAST_MATCH_END, @+, $*,
+HANDLE->input_line_number(EXPR), $INPUT_LINE_NUMBER, $NR, $,
+IO::Handle->input_record_separator(EXPR), $INPUT_RECORD_SEPARATOR, $RS, $/,
+HANDLE->autoflush(EXPR), $OUTPUT_AUTOFLUSH, $|,
+IO::Handle->output_field_separator EXPR, $OUTPUT_FIELD_SEPARATOR, $OFS, $,,
+IO::Handle->output_record_separator EXPR, $OUTPUT_RECORD_SEPARATOR, $ORS,
+$\, $LIST_SEPARATOR, $", $SUBSCRIPT_SEPARATOR, $SUBSEP, $;, $#,
+HANDLE->format_page_number(EXPR), $FORMAT_PAGE_NUMBER, $%,
+HANDLE->format_lines_per_page(EXPR), $FORMAT_LINES_PER_PAGE, $=,
+HANDLE->format_lines_left(EXPR), $FORMAT_LINES_LEFT, $-, @LAST_MATCH_START,
+@-, C<$`> is the same as C<substr($var, 0, $-[0])>, C<$&> is the same as
+C<substr($var, $-[0], $+[0] - $-[0])>, C<$'> is the same as C<substr($var,
+$+[0])>, C<$1> is the same as C<substr($var, $-[1], $+[1] - $-[1])>, C<$2>
+is the same as C<substr($var, $-[2], $+[2] - $-[2])>, C<$3> is the same as
+C<substr($var, $-[3], $+[3] - $-[3])>, HANDLE->format_name(EXPR),
+$FORMAT_NAME, $~, HANDLE->format_top_name(EXPR), $FORMAT_TOP_NAME, $^,
+IO::Handle->format_line_break_characters EXPR,
+$FORMAT_LINE_BREAK_CHARACTERS, $:, IO::Handle->format_formfeed EXPR,
+$FORMAT_FORMFEED, $^L, $ACCUMULATOR, $^A, $CHILD_ERROR, $?, ${^ENCODING},
+$OS_ERROR, $ERRNO, $!, %!, $EXTENDED_OS_ERROR, $^E, $EVAL_ERROR, $@,
+$PROCESS_ID, $PID, $$, $REAL_USER_ID, $UID, $<, $EFFECTIVE_USER_ID, $EUID,
+$>, $REAL_GROUP_ID, $GID, $(, $EFFECTIVE_GROUP_ID, $EGID, $),
+$PROGRAM_NAME, $0, $[, $], $COMPILING, $^C, $DEBUGGING, $^D,
+$SYSTEM_FD_MAX, $^F, $^H, %^H, $INPLACE_EDIT, $^I, $^M, $OSNAME, $^O,
+${^OPEN}, $PERLDB, $^P, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
+0x100, 0x200, 0x400, $LAST_REGEXP_CODE_RESULT, $^R,
+$EXCEPTIONS_BEING_CAUGHT, $^S, $BASETIME, $^T, ${^TAINT}, ${^UNICODE},
+${^UTF8LOCALE}, $PERL_VERSION, $^V, $WARNING, $^W, ${^WARNING_BITS},
+$EXECUTABLE_NAME, $^X, ARGV, $ARGV, @ARGV, ARGVOUT, @F, @INC, @_, %INC,
+%ENV, $ENV{expr}, %SIG, $SIG{expr}
+
+=item Error Indicators
+
+=item Technical Note on the Syntax of Variable Names
+
+=back
+
+=item BUGS
+
+=back
+
+=head2 perlre - Perl regular expressions
+
+=over 4
+
+=item DESCRIPTION
+
+i X</i> X<regex, case-insensitive> X<regexp, case-insensitive> X<regular
+expression, case-insensitive>, m X</m> X<regex, multiline> X<regexp,
+multiline> X<regular expression, multiline>, s X</s> X<regex, single-line>
+X<regexp, single-line> X<regular expression, single-line>, x X</x>
+
+=over 4
+
+=item Regular Expressions
+
+[1], [2], [3], cntrl X<cntrl>, graph X<graph>, print X<print>, punct
+X<punct>, xdigit X<xdigit>
+
+=item Extended Patterns
+
+C<(?#text)> X<(?#)>, C<(?imsx-imsx)> X<(?)>, C<(?:pattern)> X<(?:)>,
+C<(?imsx-imsx:pattern)>, C<(?=pattern)> X<(?=)> X<look-ahead, positive>
+X<lookahead, positive>, C<(?!pattern)> X<(?!)> X<look-ahead, negative>
+X<lookahead, negative>, C<(?<=pattern)> X<(?<=)> X<look-behind, positive>
+X<lookbehind, positive>, C<(?<!pattern)> X<(?<!)> X<look-behind, negative>
+X<lookbehind, negative>, C<(?{ code })> X<(?{})> X<regex, code in>
+X<regexp, code in> X<regular expression, code in>, C<(??{ code })>
+X<(??{})> X<regex, postponed> X<regexp, postponed> X<regular expression,
+postponed> X<regex, recursive> X<regexp, recursive> X<regular expression,
+recursive>, C<< (?>pattern) >> X<backtrack> X<backtracking>,
+C<(?(condition)yes-pattern|no-pattern)> X<(?()>,
+C<(?(condition)yes-pattern)>
+
+=item Backtracking
+X<backtrack> X<backtracking>
+
+=item Version 8 Regular Expressions
+X<regular expression, version 8> X<regex, version 8> X<regexp, version 8>
+
+=item Warning on \1 vs $1
+
+=item Repeated patterns matching zero-length substring
+
+=item Combining pieces together
+
+C<ST>, C<S|T>, C<S{REPEAT_COUNT}>, C<S{min,max}>, C<S{min,max}?>, C<S?>,
+C<S*>, C<S+>, C<S??>, C<S*?>, C<S+?>, C<< (?>S) >>, C<(?=S)>, C<(?<=S)>,
+C<(?!S)>, C<(?<!S)>, C<(??{ EXPR })>,
+C<(?(condition)yes-pattern|no-pattern)>
+
+=item Creating custom RE engines
+
+=back
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 perlreref - Perl Regular Expressions Reference
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item OPERATORS
+
+=item SYNTAX
+
+=item ESCAPE SEQUENCES
+
+=item CHARACTER CLASSES
+
+=item ANCHORS
+
+=item QUANTIFIERS
+
+=item EXTENDED CONSTRUCTS
+
+=item VARIABLES
+
+=item FUNCTIONS
+
+=item TERMINOLOGY
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item THANKS
+
+=back
+
+=head2 perlref - Perl references and nested data structures
+
+=over 4
+
+=item NOTE
+
+=item DESCRIPTION
+
+=over 4
+
+=item Making References
+X<reference, creation> X<referencing>
+
+1. X<\> X<backslash>, 2. X<array, anonymous> X<[> X<[]> X<square bracket>
+X<bracket, square> X<arrayref> X<array reference> X<reference, array>, 3.
+X<hash, anonymous> X<{> X<{}> X<curly bracket> X<bracket, curly> X<brace>
+X<hashref> X<hash reference> X<reference, hash>, 4. X<subroutine,
+anonymous> X<subroutine, reference> X<reference, subroutine> X<scope,
+lexical> X<closure> X<lexical> X<lexical scope>, 5. X<constructor> X<new>,
+6. X<autovivification>, 7. X<*foo{THING}> X<*>
+
+=item Using References
+X<reference, use> X<dereferencing> X<dereference>
+
+2. X<${}> X<@{}> X<%{}>, 3. X<autovivification> X<< -> >> X<arrow>, 4.
+X<encapsulation>
+
+=item Symbolic references
+X<reference, symbolic> X<reference, soft>
+X<symbolic reference> X<soft reference>
+
+=item Not-so-symbolic references
+
+=item Pseudo-hashes: Using an array as a hash
+X<pseudo-hash> X<pseudo hash> X<pseudohash>
+
+=item Function Templates
+X<scope, lexical> X<closure> X<lexical> X<lexical scope>
+X<subroutine, nested> X<sub, nested> X<subroutine, local> X<sub, local>
+
+=back
+
+=item WARNING
+X<reference, string context> X<reference, use as hash key>
+
+=item SEE ALSO
+
+=back
+
+=head2 perlform - Perl formats
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Text Fields
+X<format, text field>
+
+=item Numeric Fields
+X<#> X<format, numeric field>
+
+=item The Field @* for Variable Width Multi-Line Text
+X<@*>
+
+=item The Field ^* for Variable Width One-line-at-a-time Text
+X<^*>
+
+=item Specifying Values
+X<format, specifying values>
+
+=item Using Fill Mode
+X<format, fill mode>
+
+=item Suppressing Lines Where All Fields Are Void
+X<format, suppressing lines>
+
+=item Repeating Format Lines
+X<format, repeating lines>
+
+=item Top of Form Processing
+X<format, top of form> X<top> X<header>
+
+=item Format Variables
+X<format variables>
+X<format, variables>
+
+=back
+
+=item NOTES
+
+=over 4
+
+=item Footers
+X<format, footer> X<footer>
+
+=item Accessing Formatting Internals
+X<format, internals>
+
+=back
+
+=item WARNINGS
+
+=back
+
+=head2 perlobj - Perl objects
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item An Object is Simply a Reference
+X<object> X<bless> X<constructor> X<new>
+
+=item A Class is Simply a Package
+X<class> X<package> X<@ISA> X<inheritance>
+
+=item A Method is Simply a Subroutine
+X<method>
+
+=item Method Invocation
+X<invocation> X<method> X<arrow> X<< -> >>
+
+=item Indirect Object Syntax
+X<indirect object syntax> X<invocation, indirect> X<indirect>
+
+=item Default UNIVERSAL methods
+X<UNIVERSAL>
+
+isa(CLASS) X<isa>, can(METHOD) X<can>, VERSION( [NEED] ) X<VERSION>
+
+=item Destructors
+X<destructor> X<DESTROY>
+
+=item Summary
+
+=item Two-Phased Garbage Collection
+X<garbage collection> X<GC> X<circular reference>
+X<reference, circular> X<DESTROY> X<destructor>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perltie - how to hide an object class in a simple variable
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Tying Scalars
+X<scalar, tying>
+
+TIESCALAR classname, LIST X<TIESCALAR>, FETCH this X<FETCH>, STORE this,
+value X<STORE>, UNTIE this X<UNTIE>, DESTROY this X<DESTROY>
+
+=item Tying Arrays
+X<array, tying>
+
+TIEARRAY classname, LIST X<TIEARRAY>, FETCH this, index X<FETCH>, STORE
+this, index, value X<STORE>, FETCHSIZE this X<FETCHSIZE>, STORESIZE this,
+count X<STORESIZE>, EXTEND this, count X<EXTEND>, EXISTS this, key
+X<EXISTS>, DELETE this, key X<DELETE>, CLEAR this X<CLEAR>, PUSH this, LIST
+ X<PUSH>, POP this X<POP>, SHIFT this X<SHIFT>, UNSHIFT this, LIST 
+X<UNSHIFT>, SPLICE this, offset, length, LIST X<SPLICE>, UNTIE this
+X<UNTIE>, DESTROY this X<DESTROY>
+
+=item Tying Hashes
+X<hash, tying>
+
+USER, HOME, CLOBBER, LIST, TIEHASH classname, LIST X<TIEHASH>, FETCH this,
+key X<FETCH>, STORE this, key, value X<STORE>, DELETE this, key X<DELETE>,
+CLEAR this X<CLEAR>, EXISTS this, key X<EXISTS>, FIRSTKEY this X<FIRSTKEY>,
+NEXTKEY this, lastkey X<NEXTKEY>, SCALAR this X<SCALAR>, UNTIE this
+X<UNTIE>, DESTROY this X<DESTROY>
+
+=item Tying FileHandles
+X<filehandle, tying>
+
+TIEHANDLE classname, LIST X<TIEHANDLE>, WRITE this, LIST X<WRITE>, PRINT
+this, LIST X<PRINT>, PRINTF this, LIST X<PRINTF>, READ this, LIST X<READ>,
+READLINE this X<READLINE>, GETC this X<GETC>, CLOSE this X<CLOSE>, UNTIE
+this X<UNTIE>, DESTROY this X<DESTROY>
+
+=item UNTIE this
+X<UNTIE>
+
+=item The C<untie> Gotcha
+X<untie>
+
+=back
+
+=item SEE ALSO
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 perldbmfilter - Perl DBM Filters
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<filter_store_key>, B<filter_store_value>, B<filter_fetch_key>,
+B<filter_fetch_value>
+
+=over 4
+
+=item The Filter
+
+=item An Example -- the NULL termination problem.
+
+=item Another Example -- Key is a C int.
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 perlipc - Perl interprocess communication (signals, fifos, pipes,
+safe subprocesses, sockets, and semaphores)
+
+=over 4
+
+=item DESCRIPTION
+
+=item Signals
+
+=over 4
+
+=item Handling the SIGHUP Signal in Daemons
+
+=back
+
+=item Named Pipes
+
+=over 4
+
+=item Deferred Signals (Safe Signals)
+
+Long running opcodes, Interrupting IO, Restartable system calls, Signals as
+"faults", Signals triggered by operating system state
+
+=back
+
+=item Using open() for IPC
+
+=over 4
+
+=item Filehandles
+
+=item Background Processes
+
+=item Complete Dissociation of Child from Parent
+
+=item Safe Pipe Opens
+
+=item Bidirectional Communication with Another Process
+
+=item Bidirectional Communication with Yourself
+
+=back
+
+=item Sockets: Client/Server Communication
+
+=over 4
+
+=item Internet Line Terminators
+
+=item Internet TCP Clients and Servers
+
+=item Unix-Domain TCP Clients and Servers
+
+=back
+
+=item TCP Clients with IO::Socket
+
+=over 4
+
+=item A Simple Client
+
+C<Proto>, C<PeerAddr>, C<PeerPort>
+
+=item A Webget Client
+
+=item Interactive Client with IO::Socket
+
+=back
+
+=item TCP Servers with IO::Socket
+
+Proto, LocalPort, Listen, Reuse
+
+=item UDP: Message Passing
+
+=item SysV IPC
+
+=item NOTES
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlfork - Perl's fork() emulation
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Behavior of other Perl features in forked pseudo-processes
+
+$$ or $PROCESS_ID, %ENV, chdir() and all other builtins that accept
+filenames, wait() and waitpid(), kill(), exec(), exit(), Open handles to
+files, directories and network sockets
+
+=item Resource limits
+
+=item Killing the parent process
+
+=item Lifetime of the parent process and pseudo-processes
+
+=item CAVEATS AND LIMITATIONS
+
+BEGIN blocks, Open filehandles, Forking pipe open() not yet implemented,
+Global state maintained by XSUBs, Interpreter embedded in larger
+application, Thread-safety of extensions
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlnumber - semantics of numbers and numeric operations in Perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Storing numbers
+
+=item Numeric operators and numeric conversions
+
+=item Flavors of Perl numeric operations
+
+Arithmetic operators, ++, Arithmetic operators during C<use integer>, Other
+mathematical operators, Bitwise operators, Bitwise operators during C<use
+integer>, Operators which expect an integer, Operators which expect a
+string
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlthrtut - tutorial on threads in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item Status
+
+=item What Is A Thread Anyway?
+
+=item Threaded Program Models
+
+=over 4
+
+=item Boss/Worker
+
+=item Work Crew
+
+=item Pipeline
+
+=back
+
+=item What kind of threads are Perl threads?
+
+=item Thread-Safe Modules
+
+=item Thread Basics
+
+=over 4
+
+=item Basic Thread Support
+
+=item A Note about the Examples
+
+=item Creating Threads
+
+=item Waiting For A Thread To Exit
+
+=item Ignoring A Thread
+
+=back
+
+=item Threads And Data
+
+=over 4
+
+=item Shared And Unshared Data
+
+=item Thread Pitfalls: Races
+
+=back
+
+=item Synchronization and control
+
+=over 4
+
+=item Controlling access: lock()
+
+=item A Thread Pitfall: Deadlocks
+
+=item Queues: Passing Data Around
+
+=item Semaphores: Synchronizing Data Access
+
+=item Basic semaphores
+
+=item Advanced Semaphores
+
+=item cond_wait() and cond_signal()
+
+=item Giving up control
+
+=back
+
+=item General Thread Utility Routines
+
+=over 4
+
+=item What Thread Am I In?
+
+=item Thread IDs
+
+=item Are These Threads The Same?
+
+=item What Threads Are Running?
+
+=back
+
+=item A Complete Example
+
+=item Different implementations of threads
+
+=item Performance considerations
+
+=item Process-scope Changes
+
+=item Thread-Safety of System Libraries
+
+=item Conclusion
+
+=item Bibliography
+
+=over 4
+
+=item Introductory Texts
+
+=item OS-Related References
+
+=item Other References
+
+=back
+
+=item Acknowledgements
+
+=item AUTHOR
+
+=item Copyrights
+
+=back
+
+=head2 perlothrtut - old tutorial on threads in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item What Is A Thread Anyway?
+
+=item Threaded Program Models
+
+=over 4
+
+=item Boss/Worker
+
+=item Work Crew
+
+=item Pipeline
+
+=back
+
+=item Native threads
+
+=item What kind of threads are perl threads?
+
+=item Threadsafe Modules
+
+=item Thread Basics
+
+=over 4
+
+=item Basic Thread Support
+
+=item Creating Threads
+
+=item Giving up control
+
+=item Waiting For A Thread To Exit
+
+=item Errors In Threads
+
+=item Ignoring A Thread
+
+=back
+
+=item Threads And Data
+
+=over 4
+
+=item Shared And Unshared Data
+
+=item Thread Pitfall: Races
+
+=item Controlling access: lock()
+
+=item Thread Pitfall: Deadlocks
+
+=item Queues: Passing Data Around
+
+=back
+
+=item Threads And Code
+
+=over 4
+
+=item Semaphores: Synchronizing Data Access
+
+Basic semaphores, Advanced Semaphores
+
+=item Attributes: Restricting Access To Subroutines
+
+=item Subroutine Locks
+
+=item Methods
+
+=item Locking A Subroutine
+
+=back
+
+=item General Thread Utility Routines
+
+=over 4
+
+=item What Thread Am I In?
+
+=item Thread IDs
+
+=item Are These Threads The Same?
+
+=item What Threads Are Running?
+
+=back
+
+=item A Complete Example
+
+=item Conclusion
+
+=item Bibliography
+
+=over 4
+
+=item Introductory Texts
+
+=item OS-Related References
+
+=item Other References
+
+=back
+
+=item Acknowledgements
+
+=item AUTHOR
+
+=item Copyrights
+
+=back
+
+=head2 perlport - Writing portable Perl
+
+=over 4
+
+=item DESCRIPTION
+
+Not all Perl programs have to be portable, Nearly all of Perl already I<is>
+portable
+
+=item ISSUES
+
+=over 4
+
+=item Newlines
+
+=item Numbers endianness and Width
+
+=item Files and Filesystems
+
+=item System Interaction
+
+=item Command names versus file pathnames
+
+=item Networking
+
+=item Interprocess Communication (IPC)
+
+=item External Subroutines (XS)
+
+=item Standard Modules
+
+=item Time and Date
+
+=item Character sets and character encoding
+
+=item Internationalisation
+
+=item System Resources
+
+=item Security
+
+=item Style
+
+=back
+
+=item CPAN Testers
+
+=item PLATFORMS
+
+=over 4
+
+=item Unix
+
+=item DOS and Derivatives
+
+=item S<Mac OS>
+
+=item VMS
+
+=item VOS
+
+=item EBCDIC Platforms
+
+=item Acorn RISC OS
+
+=item Other perls
+
+=back
+
+=item FUNCTION IMPLEMENTATIONS
+
+=over 4
+
+=item Alphabetical Listing of Perl Functions
+
+-I<X>, atan2 Y,X, atan2, binmode, chmod, chown, chroot, crypt, dbmclose,
+dbmopen, dump, exec, exit, fcntl, flock, fork, getlogin, getpgrp, getppid,
+getpriority, getpwnam, getgrnam, getnetbyname, getpwuid, getgrgid,
+getnetbyaddr, getprotobynumber, getservbyport, getpwent, getgrent,
+gethostbyname, gethostent, getnetent, getprotoent, getservent, sethostent,
+setnetent, setprotoent, setservent, endpwent, endgrent, endhostent,
+endnetent, endprotoent, endservent, getsockopt SOCKET,LEVEL,OPTNAME, glob,
+gmtime, ioctl FILEHANDLE,FUNCTION,SCALAR, kill, link, localtime, lstat,
+msgctl, msgget, msgsnd, msgrcv, open, pipe, readlink, rename, select,
+semctl, semget, semop, setgrent, setpgrp, setpriority, setpwent,
+setsockopt, shmctl, shmget, shmread, shmwrite, sockatmark, socketpair,
+stat, symlink, syscall, sysopen, system, times, truncate, umask, utime,
+wait, waitpid
+
+=back
+
+=item Supported Platforms
+
+=item SEE ALSO
+
+=item AUTHORS / CONTRIBUTORS
+
+=back
+
+=head2 perllocale - Perl locale handling (internationalization and
+localization)
+
+=over 4
+
+=item DESCRIPTION
+
+=item PREPARING TO USE LOCALES
+
+=item USING LOCALES
+
+=over 4
+
+=item The use locale pragma
+
+=item The setlocale function
+
+=item Finding locales
+
+=item LOCALE PROBLEMS
+
+=item Temporarily fixing locale problems
+
+=item Permanently fixing locale problems
+
+=item Permanently fixing your system's locale configuration
+
+=item Fixing system locale configuration
+
+=item The localeconv function
+
+=item I18N::Langinfo
+
+=back
+
+=item LOCALE CATEGORIES
+
+=over 4
+
+=item Category LC_COLLATE: Collation
+
+=item Category LC_CTYPE: Character Types
+
+=item Category LC_NUMERIC: Numeric Formatting
+
+=item Category LC_MONETARY: Formatting of monetary amounts
+
+=item LC_TIME
+
+=item Other categories
+
+=back
+
+=item SECURITY
+
+=item ENVIRONMENT
+
+PERL_BADLANG, LC_ALL, LANGUAGE, LC_CTYPE, LC_COLLATE, LC_MONETARY,
+LC_NUMERIC, LC_TIME, LANG
+
+=item NOTES
+
+=over 4
+
+=item Backward compatibility
+
+=item I18N:Collate obsolete
+
+=item Sort speed and memory use impacts
+
+=item write() and LC_NUMERIC
+
+=item Freely available locale definitions
+
+=item I18n and l10n
+
+=item An imperfect standard
+
+=back
+
+=item Unicode and UTF-8
+
+=item BUGS
+
+=over 4
+
+=item Broken systems
+
+=back
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perluniintro - Perl Unicode introduction
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Unicode
+
+=item Perl's Unicode Support
+
+=item Perl's Unicode Model
+
+=item Unicode and EBCDIC
+
+=item Creating Unicode
+
+=item Handling Unicode
+
+=item Legacy Encodings
+
+=item Unicode I/O
+
+=item Displaying Unicode As Text
+
+=item Special Cases
+
+=item Advanced Topics
+
+=item Miscellaneous
+
+=item Questions With Answers
+
+=item Hexadecimal Notation
+
+=item Further Resources
+
+=back
+
+=item UNICODE IN OLDER PERLS
+
+=item SEE ALSO
+
+=item ACKNOWLEDGMENTS
+
+=item AUTHOR, COPYRIGHT, AND LICENSE
+
+=back
+
+=head2 perlunicode - Unicode support in Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Important Caveats
+
+Input and Output Layers, Regular Expressions, C<use utf8> still needed to
+enable UTF-8/UTF-EBCDIC in scripts, BOM-marked scripts and UTF-16 scripts
+autodetected, C<use encoding> needed to upgrade non-Latin-1 byte strings
+
+=item Byte and Character Semantics
+
+=item Effects of Character Semantics
+
+=item Scripts
+
+=item Blocks
+
+=item User-Defined Character Properties
+
+=item Character Encodings for Input and Output
+
+=item Unicode Regular Expression Support Level
+
+=item Unicode Encodings
+
+=item Security Implications of Unicode
+
+=item Unicode in Perl on EBCDIC
+
+=item Locales
+
+=item When Unicode Does Not Happen
+
+=item Forcing Unicode in Perl (Or Unforcing Unicode in Perl)
+
+=item Using Unicode in XS
+
+=back
+
+=item BUGS
+
+=over 4
+
+=item Interaction with Locales
+
+=item Interaction with Extensions
+
+=item Speed
+
+=item Porting code from perl-5.6.X
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlebcdic - Considerations for running Perl on EBCDIC platforms
+
+=over 4
+
+=item DESCRIPTION
+
+=item COMMON CHARACTER CODE SETS
+
+=over 4
+
+=item ASCII
+
+=item ISO 8859
+
+=item Latin 1 (ISO 8859-1)
+
+=item EBCDIC
+
+=item 13 variant characters
+
+=item 0037
+
+=item 1047
+
+=item POSIX-BC
+
+=item Unicode code points versus EBCDIC code points
+
+=item Remaining Perl Unicode problems in EBCDIC
+
+=item Unicode and UTF
+
+=item Using Encode
+
+=back
+
+=item SINGLE OCTET TABLES
+
+recipe 0, recipe 1, recipe 2, recipe 3, recipe 4, recipe 5, recipe 6
+
+=item IDENTIFYING CHARACTER CODE SETS
+
+=item CONVERSIONS
+
+=over 4
+
+=item tr///
+
+=item iconv
+
+=item C RTL
+
+=back
+
+=item OPERATOR DIFFERENCES
+
+=item FUNCTION DIFFERENCES
+
+chr(), ord(), pack(), print(), printf(), sort(), sprintf(), unpack()
+
+=item REGULAR EXPRESSION DIFFERENCES
+
+=item SOCKETS
+
+=item SORTING
+
+=over 4
+
+=item Ignore ASCII vs. EBCDIC sort differences.
+
+=item MONO CASE then sort data.
+
+=item Convert, sort data, then re convert.
+
+=item Perform sorting on one type of machine only.
+
+=back
+
+=item TRANSFORMATION FORMATS
+
+=over 4
+
+=item URL decoding and encoding
+
+=item uu encoding and decoding
+
+=item Quoted-Printable encoding and decoding
+
+=item Caesarian ciphers
+
+=back
+
+=item Hashing order and checksums
+
+=item I18N AND L10N
+
+=item MULTI OCTET CHARACTER SETS
+
+=item OS ISSUES
+
+=over 4
+
+=item OS/400
+
+PASE, IFS access
+
+=item OS/390, z/OS
+
+chcp, dataset access, OS/390, z/OS iconv, locales
+
+=item VM/ESA?
+
+=item POSIX-BC?
+
+=back
+
+=item BUGS
+
+=item SEE ALSO
+
+=item REFERENCES
+
+=item HISTORY
+
+=item AUTHOR
+
+=back
+
+=head2 perlsec - Perl security
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Laundering and Detecting Tainted Data
+
+=item Switches On the "#!" Line
+
+=item Taint mode and @INC
+
+=item Cleaning Up Your Path
+
+=item Security Bugs
+
+=item Protecting Your Programs
+
+=item Unicode
+
+=item Algorithmic Complexity Attacks
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlmod - Perl modules (packages and symbol tables)
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Packages
+X<package> X<namespace> X<variable, global> X<global variable> X<global>
+
+=item Symbol Tables
+X<symbol table> X<stash> X<%::> X<%main::> X<typeglob> X<glob> X<alias>
+
+=item BEGIN, CHECK, INIT and END
+X<BEGIN> X<CHECK> X<INIT> X<END>
+
+=item Perl Classes
+X<class> X<@ISA>
+
+=item Perl Modules
+X<module>
+
+=item Making your module threadsafe
+X<threadsafe> X<thread safe>
+X<module, threadsafe> X<module, thread safe>
+X<CLONE> X<CLONE_SKIP> X<thread> X<threads> X<ithread>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlmodlib - constructing new Perl modules and finding existing ones
+
+=over 4
+
+=item THE PERL MODULE LIBRARY
+
+=over 4
+
+=item Pragmatic Modules
+
+assertions::compat, attributes, attrs, autouse, base, bigint, bignum,
+bigrat, blib, bytes, charnames, constant, diagnostics, encoding, fields,
+filetest, if, integer, less, lib, locale, open, ops, overload, re, sigtrap,
+sort, strict, subs, threads, threads::shared, utf8, vars, vmsish, warnings,
+warnings::register
+
+=item Standard Modules
+
+AnyDBM_File, Archive::Tar, Archive::Tar::File, Attribute::Handlers,
+AutoLoader, AutoSplit, B, B::Asmdata, B::Assembler, B::Bblock, B::Bytecode,
+B::C, B::CC, B::Concise, B::Debug, B::Deparse, B::Disassembler, B::Lint,
+B::Showlex, B::Stackobj, B::Stash, B::Terse, B::Xref, Benchmark,
+ByteLoader, CGI, CGI::Apache, CGI::Carp, CGI::Cookie, CGI::Fast,
+CGI::Pretty, CGI::Push, CGI::Switch, CGI::Util, CPAN, CPAN::FirstTime,
+CPAN::Nox, Carp, Carp::Heavy, Class::ISA, Class::Struct, Compress::Zlib,
+Config, Cwd, DB, DB_File, Data::Dumper, Devel::DProf, Devel::PPPort,
+Devel::Peek, Devel::SelfStubber, Digest, Digest::MD5, Digest::base,
+DirHandle, Dumpvalue, DynaLoader, Encode, Encode::Alias, Encode::Byte,
+Encode::CJKConstants, Encode::CN, Encode::CN::HZ, Encode::Config,
+Encode::EBCDIC, Encode::Encoder, Encode::Encoding, Encode::Guess,
+Encode::JP, Encode::JP::H2Z, Encode::JP::JIS7, Encode::KR,
+Encode::KR::2022_KR, Encode::MIME::Header, Encode::PerlIO,
+Encode::Supported, Encode::Symbol, Encode::TW, Encode::Unicode,
+Encode::Unicode::UTF7, English, Env, Errno, Exporter, Exporter::Heavy,
+ExtUtils::CBuilder, ExtUtils::CBuilder::Platform::Windows,
+ExtUtils::Command, ExtUtils::Command::MM, ExtUtils::Constant,
+ExtUtils::Embed, ExtUtils::Install, ExtUtils::Installed, ExtUtils::Liblist,
+ExtUtils::MM, ExtUtils::MM_AIX, ExtUtils::MM_Any, ExtUtils::MM_BeOS,
+ExtUtils::MM_Cygwin, ExtUtils::MM_DOS, ExtUtils::MM_MacOS,
+ExtUtils::MM_NW5, ExtUtils::MM_OS2, ExtUtils::MM_QNX, ExtUtils::MM_UWIN,
+ExtUtils::MM_Unix, ExtUtils::MM_VMS, ExtUtils::MM_VOS, ExtUtils::MM_Win32,
+ExtUtils::MM_Win95, ExtUtils::MY, ExtUtils::MakeMaker,
+ExtUtils::MakeMaker::Config, ExtUtils::MakeMaker::FAQ,
+ExtUtils::MakeMaker::Tutorial, ExtUtils::MakeMaker::bytes,
+ExtUtils::MakeMaker::vmsish, ExtUtils::Manifest, ExtUtils::Mkbootstrap,
+ExtUtils::Mksymlists, ExtUtils::Packlist, ExtUtils::ParseXS,
+ExtUtils::testlib, Fatal, Fcntl, File::Basename, File::CheckTree,
+File::Compare, File::Copy, File::DosGlob, File::Find, File::Glob,
+File::Path, File::Spec, File::Spec::Cygwin, File::Spec::Epoc,
+File::Spec::Functions, File::Spec::Mac, File::Spec::OS2, File::Spec::Unix,
+File::Spec::VMS, File::Spec::Win32, File::Temp, File::stat, FileCache,
+FileHandle, Filter::Simple, Filter::Util::Call, FindBin, GDBM_File,
+Getopt::Long, Getopt::Std, Hash::Util, I18N::Collate, I18N::LangTags,
+I18N::LangTags::List, I18N::Langinfo, IO, IO::Dir, IO::File, IO::Handle,
+IO::Pipe, IO::Poll, IO::Seekable, IO::Select, IO::Socket, IO::Socket::INET,
+IO::Socket::UNIX, IO::Zlib, IPC::Open2, IPC::Open3, IPC::SysV,
+IPC::SysV::Msg, IPC::SysV::Semaphore, List::Util, Locale::Constants,
+Locale::Country, Locale::Currency, Locale::Language, Locale::Maketext,
+Locale::Maketext::TPJ13, Locale::Script, MIME::Base64,
+MIME::Base64::QuotedPrint, Math::BigFloat, Math::BigInt,
+Math::BigInt::Calc, Math::BigInt::FastCalc, Math::BigRat, Math::Complex,
+Math::Trig, Memoize, Memoize::AnyDBM_File, Memoize::Expire,
+Memoize::ExpireFile, Memoize::ExpireTest, Memoize::NDBM_File,
+Memoize::SDBM_File, Memoize::Storable, NDBM_File, NEXT, Net::Cmd,
+Net::Config, Net::Domain, Net::FTP, Net::NNTP, Net::Netrc, Net::POP3,
+Net::Ping, Net::SMTP, Net::Time, Net::hostent, Net::libnetFAQ, Net::netent,
+Net::protoent, Net::servent, O, ODBM_File, Opcode, POSIX, PerlIO,
+PerlIO::encoding, PerlIO::scalar, PerlIO::via, PerlIO::via::QuotedPrint,
+Pod::Checker, Pod::Find, Pod::Functions, Pod::Html, Pod::InputObjects,
+Pod::LaTeX, Pod::Man, Pod::ParseLink, Pod::ParseUtils, Pod::Parser,
+Pod::Perldoc::ToChecker, Pod::Perldoc::ToMan, Pod::Perldoc::ToNroff,
+Pod::Perldoc::ToPod, Pod::Perldoc::ToRtf, Pod::Perldoc::ToText,
+Pod::Perldoc::ToTk, Pod::Perldoc::ToXml, Pod::PlainText, Pod::Plainer,
+Pod::Select, Pod::Text, Pod::Text::Color, Pod::Text::Overstrike,
+Pod::Text::Termcap, Pod::Usage, SDBM_File, Safe, Scalar::Util,
+Search::Dict, SelectSaver, SelfLoader, Shell, Socket, Storable, Switch,
+Symbol, Sys::Hostname, Sys::Syslog, Term::ANSIColor, Term::Cap,
+Term::Complete, Term::ReadLine, Test, Test::Builder, Test::Harness,
+Test::Harness::Assert, Test::Harness::Iterator, Test::Harness::Point,
+Test::Harness::Straps, Test::More, Test::Simple, Test::Tutorial,
+Text::Abbrev, Text::Balanced, Text::ParseWords, Text::Soundex, Text::Tabs,
+Text::Wrap, Thread, Thread::Queue, Thread::Semaphore, Thread::Signal,
+Thread::Specific, Tie::Array, Tie::File, Tie::Handle, Tie::Hash,
+Tie::Memoize, Tie::RefHash, Tie::Scalar, Tie::SubstrHash, Time::HiRes,
+Time::Local, Time::gmtime, Time::localtime, Time::tm, UNIVERSAL,
+Unicode::Collate, Unicode::Normalize, Unicode::UCD, User::grent,
+User::pwent, Win32, XS::APItest, XS::Typemap, XSLoader
+
+=item Extension Modules
+
+=back
+
+=item CPAN
+
+=over 4
+
+=item Africa
+
+South Africa
+
+=item Asia
+
+China, Indonesia, Israel, Japan, Malaysia, Russian Federation, Saudi
+Arabia, Singapore, South Korea, Taiwan, Thailand
+
+=item Central America
+
+Costa Rica
+
+=item Europe
+
+Austria, Belgium, Bosnia and Herzegovina, Bulgaria, Croatia, Czech
+Republic, Denmark, Estonia, Finland, France, Germany, Greece, Hungary,
+Iceland, Ireland, Italy, Latvia, Lithuania, Netherlands, Norway, Poland,
+Portugal, Romania, Russia, Slovakia, Slovenia, Spain, Sweden, Switzerland,
+Turkey, Ukraine, United Kingdom
+
+=item North America
+
+Canada, Alberta, Manitoba, Nova Scotia, Ontario, Mexico, United States,
+Alabama, California, Colorado, Delaware, District of Columbia, Florida,
+Indiana, Kentucky, Massachusetts, Michigan, Nevada, New Jersey, New York,
+North Carolina, Oklahoma, Oregon, Pennsylvania, Tennessee, Texas, Utah,
+Virginia, Washington, Wisconsin
+
+=item Oceania
+
+Australia, New Zealand, United States
+
+=item South America
+
+Argentina, Brazil, Chile
+
+=item RSYNC Mirrors
+
+=back
+
+=item Modules: Creation, Use, and Abuse
+
+=over 4
+
+=item Guidelines for Module Creation
+
+=item Guidelines for Converting Perl 4 Library Scripts into Modules
+
+=item Guidelines for Reusing Application Code
+
+=back
+
+=item NOTE
+
+=back
+
+=head2 perlmodstyle - Perl module style guide
+
+=over 4
+
+=item INTRODUCTION
+
+=item QUICK CHECKLIST
+
+=over 4
+
+=item Before you start
+
+=item The API
+
+=item Stability
+
+=item Documentation
+
+=item Release considerations
+
+=back
+
+=item BEFORE YOU START WRITING A MODULE
+
+=over 4
+
+=item Has it been done before?
+
+=item Do one thing and do it well
+
+=item What's in a name?
+
+=back
+
+=item DESIGNING AND WRITING YOUR MODULE
+
+=over 4
+
+=item To OO or not to OO?
+
+=item Designing your API
+
+Write simple routines to do simple things, Separate functionality from
+output, Provide sensible shortcuts and defaults, Naming conventions,
+Parameter passing
+
+=item Strictness and warnings
+
+=item Backwards compatibility
+
+=item Error handling and messages
+
+=back
+
+=item DOCUMENTING YOUR MODULE
+
+=over 4
+
+=item POD
+
+=item README, INSTALL, release notes, changelogs
+
+perl Makefile.PL, make, make test, make install, perl Build.PL, perl Build,
+perl Build test, perl Build install
+
+=back
+
+=item RELEASE CONSIDERATIONS
+
+=over 4
+
+=item Version numbering
+
+=item Pre-requisites
+
+=item Testing
+
+=item Packaging
+
+=item Licensing
+
+=back
+
+=item COMMON PITFALLS
+
+=over 4
+
+=item Reinventing the wheel
+
+=item Trying to do too much
+
+=item Inappropriate documentation
+
+=back
+
+=item SEE ALSO
+
+L<perlstyle>, L<perlnewmod>, L<perlpod>, L<podchecker>, Packaging Tools,
+Testing tools, http://pause.perl.org/, Any good book on software
+engineering
+
+=item AUTHOR
+
+=back
+
+=head2 perlmodinstall - Installing CPAN Modules
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item PREAMBLE
+
+B<DECOMPRESS> the file, B<UNPACK> the file into a directory, B<BUILD> the
+module (sometimes unnecessary), B<INSTALL> the module
+
+=back
+
+=item PORTABILITY
+
+=item HEY
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 perlnewmod - preparing a new module for distribution
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Warning
+
+=item What should I make into a module?
+
+=item Step-by-step: Preparing the ground
+
+Look around, Check it's new, Discuss the need, Choose a name, Check again
+
+=item Step-by-step: Making the module
+
+Start with F<module-starter> or F<h2xs>, Use L<strict|strict> and
+L<warnings|warnings>, Use L<Carp|Carp>, Use L<Exporter|Exporter> - wisely!,
+Use L<plain old documentation|perlpod>, Write tests, Write the README
+
+=item Step-by-step: Distributing your module
+
+Get a CPAN user ID, C<perl Makefile.PL; make test; make dist>, Upload the
+tarball, Announce to the modules list, Announce to clpa, Fix bugs!
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlutil - utilities packaged with the Perl distribution
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item DOCUMENTATION
+
+L<perldoc|perldoc>, L<pod2man|pod2man> and L<pod2text|pod2text>,
+L<pod2html|pod2html> and L<pod2latex|pod2latex>, L<pod2usage|pod2usage>,
+L<podselect|podselect>, L<podchecker|podchecker>, L<splain|splain>,
+L<roffitall|roffitall>
+
+=item CONVERTORS
+
+L<a2p|a2p>, L<s2p|s2p>, L<find2perl|find2perl>
+
+=item Administration
+
+L<libnetcfg|libnetcfg>
+
+=item Development
+
+L<perlbug|perlbug>, L<h2ph|h2ph>, L<c2ph|c2ph> and L<pstruct|pstruct>,
+L<h2xs|h2xs>, L<dprofpp|dprofpp>, L<perlcc|perlcc>
+
+=item SEE ALSO
+
+=back
+
+=back
+
+=head2 perlcompile - Introduction to the Perl Compiler-Translator 
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Layout
+
+B::Bytecode, B::C, B::CC, B::Lint, B::Deparse, B::Xref
+
+=back
+
+=item Using The Back Ends
+
+=over 4
+
+=item The Cross Referencing Back End
+
+i, &, s, r
+
+=item The Decompiling Back End
+
+=item The Lint Back End
+
+=item The Simple C Back End
+
+=item The Bytecode Back End
+
+=item The Optimized C Back End
+
+=back
+
+=item Module List for the Compiler Suite
+
+B, O, B::Asmdata, B::Assembler, B::Bblock, B::Bytecode, B::C, B::CC,
+B::Concise, B::Debug, B::Deparse, B::Disassembler, B::Lint, B::Showlex,
+B::Stackobj, B::Stash, B::Terse, B::Xref
+
+=item KNOWN PROBLEMS
+
+=item AUTHOR
+
+=back
+
+=head2 perlfilter - Source Filters
+
+=over 4
+
+=item DESCRIPTION
+
+=item CONCEPTS
+
+=item USING FILTERS
+
+=item WRITING A SOURCE FILTER
+
+=item WRITING A SOURCE FILTER IN C
+
+B<Decryption Filters>
+
+=item CREATING A SOURCE FILTER AS A SEPARATE EXECUTABLE
+
+=item WRITING A SOURCE FILTER IN PERL
+
+=item USING CONTEXT: THE DEBUG FILTER
+
+=item CONCLUSION
+
+=item THINGS TO LOOK OUT FOR
+
+Some Filters Clobber the C<DATA> Handle
+
+=item REQUIREMENTS
+
+=item AUTHOR
+
+=item Copyrights
+
+=back
+
+=head2 perlglossary - Perl Glossary
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item A
+
+accessor methods, actual arguments, address operator, algorithm, alias,
+alternatives, anonymous, architecture, argument, ARGV, arithmetical
+operator, array, array context, ASCII, assertion, assignment, assignment
+operator, associative array, associativity, asynchronous, atom, atomic
+operation, attribute, autogeneration, autoincrement, autoload, autosplit,
+autovivification, AV, awk
+
+=item B
+
+backreference, backtracking, backward compatibility, bareword, base class,
+big-endian, binary, binary operator, bind, bit, bit shift, bit string,
+bless, block, BLOCK, block buffering, Boolean, Boolean context, breakpoint,
+broadcast, BSD, bucket, buffer, built-in, bundle, byte, bytecode
+
+=item C
+
+C, C preprocessor, call by reference, call by value, callback, canonical,
+capturing, character, character class, character property, circumfix
+operator, class, class method, client, cloister, closure, cluster, CODE,
+code generator, code subpattern, collating sequence, command, command
+buffering, command name, command-line arguments, comment, compilation unit,
+compile phase, compile time, compiler, composer, concatenation,
+conditional, connection, construct, constructor, context, continuation,
+core dump, CPAN, cracker, current package, current working directory,
+currently selected output channel, CV
+
+=item D
+
+dangling statement, data structure, data type, datagram, DBM, declaration,
+decrement, default, defined, delimiter, dereference, derived class,
+descriptor, destroy, destructor, device, directive, directory, directory
+handle, dispatch, distribution, dweomer, dwimmer, dynamic scoping
+
+=item E
+
+eclectic, element, embedding, empty subclass test, en passant,
+encapsulation, endian, environment, environment variable, EOF, errno,
+error, escape sequence, exception, exception handling, exec, executable
+file, execute, execute bit, exit status, export, expression, extension
+
+=item F
+
+false, FAQ, fatal error, field, FIFO, file, file descriptor, file test
+operator, fileglob, filehandle, filename, filesystem, filter, flag,
+floating point, flush, FMTEYEWTK, fork, formal arguments, format, freely
+available, freely redistributable, freeware, function, funny character,
+garbage collection
+
+=item G
+
+GID, glob, global, global destruction, glue language, granularity, greedy,
+grep, group, GV
+
+=item H
+
+hacker, handler, hard reference, hash, hash table, header file, here
+document, hexadecimal, home directory, host, hubris, HV
+
+=item I
+
+identifier, impatience, implementation, import, increment, indexing,
+indirect filehandle, indirect object, indirect object slot, indirection,
+infix, inheritance, instance, instance variable, integer, interface,
+interpolation, interpreter, invocant, invocation, I/O, IO, IP, IPC, is-a,
+iteration, iterator, IV
+
+=item J
+
+JAPH
+
+=item K
+
+key, keyword
+
+=item L
+
+label, laziness, left shift, leftmost longest, lexeme, lexer, lexical
+analysis, lexical scoping, lexical variable, library, LIFO, line, line
+buffering, line number, link, LIST, list, list context, list operator, list
+value, literal, little-endian, local, logical operator, lookahead,
+lookbehind, loop, loop control statement, loop label, lvaluable, lvalue,
+lvalue modifier
+
+=item M
+
+magic, magical increment, magical variables, Makefile, man, manpage,
+matching, member data, memory, metacharacter, metasymbol, method,
+minimalism, mode, modifier, module, modulus, monger, mortal,
+multidimensional array, multiple inheritance
+
+=item N
+
+named pipe, namespace, network address, newline, NFS, null character, null
+list, null string, numeric context, NV, nybble
+
+=item O
+
+object, octal, offset, one-liner, open source software, operand, operating
+system, operator, operator overloading, options, overloading, overriding,
+owner
+
+=item P
+
+package, pad, parameter, parent class, parse tree, parsing, patch, PATH,
+pathname, pattern, pattern matching, permission bits, Pern, pipe, pipeline,
+platform, pod, pointer, polymorphism, port, portable, porter, POSIX,
+postfix, pp, pragma, precedence, prefix, preprocessing, procedure, process,
+program generator, progressive matching, property, protocol, prototype,
+pseudofunction, pseudohash, pseudoliteral, public domain, pumpkin,
+pumpking, PV
+
+=item Q
+
+qualified, quantifier
+
+=item R
+
+readable, reaping, record, recursion, reference, referent, regex, regular
+expression, regular expression modifier, regular file, relational operator,
+reserved words, return value, RFC, right shift, root, RTFM, run phase, run
+time, run-time pattern, RV, rvalue
+
+=item S
+
+scalar, scalar context, scalar literal, scalar value, scalar variable,
+scope, scratchpad, script, script kiddie, sed, semaphore, separator,
+serialization, server, service, setgid, setuid, shared memory, shebang,
+shell, side effects, signal, signal handler, single inheritance, slice,
+slurp, socket, soft reference, source filter, stack, standard, standard
+error, standard I/O, standard input, standard output, stat structure,
+statement, statement modifier, static, static method, static scoping,
+static variable, status, STDERR, STDIN, STDIO, STDOUT, stream, string,
+string context, stringification, struct, structure, subclass, subpattern,
+subroutine, subscript, substitution, substring, superclass, superuser, SV,
+switch, switch cluster, switch statement, symbol, symbol table, symbolic
+debugger, symbolic link, symbolic reference, synchronous, syntactic sugar,
+syntax, syntax tree, syscall
+
+=item T
+
+tainted, TCP, term, terminator, ternary, text, thread, tie, TMTOWTDI,
+token, tokener, tokenizing, toolbox approach, transliterate, trigger,
+trinary, troff, true, truncating, type, type casting, typed lexical,
+typedef, typeglob, typemap
+
+=item U
+
+UDP, UID, umask, unary operator, Unicode, Unix
+
+=item V
+
+value, variable, variable interpolation, variadic, vector, virtual, void
+context, v-string
+
+=item W
+
+warning, watch expression, whitespace, word, working directory, wrapper,
+WYSIWYG
+
+=item X
+
+XS, XSUB
+
+=item Y
+
+yacc
+
+=item Z
+
+zero width, zombie
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 perlembed - how to embed perl in your C program
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item PREAMBLE
+
+B<Use C from Perl?>, B<Use a Unix program from Perl?>, B<Use Perl from
+Perl?>, B<Use C from C?>, B<Use Perl from C?>
+
+=item ROADMAP
+
+=item Compiling your C program
+
+=item Adding a Perl interpreter to your C program
+
+=item Calling a Perl subroutine from your C program
+
+=item Evaluating a Perl statement from your C program
+
+=item Performing Perl pattern matches and substitutions from your C program
+
+=item Fiddling with the Perl stack from your C program
+
+=item Maintaining a persistent interpreter
+
+=item Execution of END blocks
+
+=item Maintaining multiple interpreter instances
+
+=item Using Perl modules, which themselves use C libraries, from your C
+program
+
+=back
+
+=item Embedding Perl under Win32
+
+=item Hiding Perl_
+
+=item MORAL
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 perldebguts - Guts of Perl debugging 
+
+=over 4
+
+=item DESCRIPTION
+
+=item Debugger Internals
+
+=over 4
+
+=item Writing Your Own Debugger
+
+=back
+
+=item Frame Listing Output Examples
+
+=item Debugging regular expressions
+
+=over 4
+
+=item Compile-time output
+
+C<anchored> I<STRING> C<at> I<POS>, C<floating> I<STRING> C<at>
+I<POS1..POS2>, C<matching floating/anchored>, C<minlen>, C<stclass>
+I<TYPE>, C<noscan>, C<isall>, C<GPOS>, C<plus>, C<implicit>, C<with eval>,
+C<anchored(TYPE)>
+
+=item Types of nodes
+
+=item Run-time output
+
+=back
+
+=item Debugging Perl memory usage
+
+=over 4
+
+=item Using C<$ENV{PERL_DEBUG_MSTATS}>
+
+C<buckets SMALLEST(APPROX)..GREATEST(APPROX)>, Free/Used, C<Total sbrk():
+SBRKed/SBRKs:CONTINUOUS>, C<pad: 0>, C<heads: 2192>, C<chain: 0>, C<tail:
+6144>
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlxstut, perlXStut - Tutorial for writing XSUBs
+
+=over 4
+
+=item DESCRIPTION
+
+=item SPECIAL NOTES
+
+=over 4
+
+=item make
+
+=item Version caveat
+
+=item Dynamic Loading versus Static Loading
+
+=back
+
+=item TUTORIAL
+
+=over 4
+
+=item EXAMPLE 1
+
+=item EXAMPLE 2
+
+=item What has gone on?
+
+=item Writing good test scripts
+
+=item EXAMPLE 3
+
+=item What's new here?
+
+=item Input and Output Parameters
+
+=item The XSUBPP Program
+
+=item The TYPEMAP file
+
+=item Warning about Output Arguments
+
+=item EXAMPLE 4
+
+=item What has happened here?
+
+=item Anatomy of .xs file
+
+=item Getting the fat out of XSUBs
+
+=item More about XSUB arguments
+
+=item The Argument Stack
+
+=item Extending your Extension
+
+=item Documenting your Extension
+
+=item Installing your Extension
+
+=item EXAMPLE 5
+
+=item New Things in this Example
+
+=item EXAMPLE 6
+
+=item New Things in this Example
+
+=item EXAMPLE 7 (Coming Soon)
+
+=item EXAMPLE 8 (Coming Soon)
+
+=item EXAMPLE 9 Passing open files to XSes
+
+=item Troubleshooting these Examples
+
+=back
+
+=item See also
+
+=item Author
+
+=over 4
+
+=item Last Changed
+
+=back
+
+=back
+
+=head2 perlxs - XS language reference manual
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Introduction
+
+=item On The Road
+
+=item The Anatomy of an XSUB
+
+=item The Argument Stack
+
+=item The RETVAL Variable
+
+=item Returning SVs, AVs and HVs through RETVAL
+
+=item The MODULE Keyword
+
+=item The PACKAGE Keyword
+
+=item The PREFIX Keyword
+
+=item The OUTPUT: Keyword
+
+=item The NO_OUTPUT Keyword
+
+=item The CODE: Keyword
+
+=item The INIT: Keyword
+
+=item The NO_INIT Keyword
+
+=item Initializing Function Parameters
+
+=item Default Parameter Values
+
+=item The PREINIT: Keyword
+
+=item The SCOPE: Keyword
+
+=item The INPUT: Keyword
+
+=item The IN/OUTLIST/IN_OUTLIST/OUT/IN_OUT Keywords
+
+=item The C<length(NAME)> Keyword
+
+=item Variable-length Parameter Lists
+
+=item The C_ARGS: Keyword
+
+=item The PPCODE: Keyword
+
+=item Returning Undef And Empty Lists
+
+=item The REQUIRE: Keyword
+
+=item The CLEANUP: Keyword
+
+=item The POSTCALL: Keyword
+
+=item The BOOT: Keyword
+
+=item The VERSIONCHECK: Keyword
+
+=item The PROTOTYPES: Keyword
+
+=item The PROTOTYPE: Keyword
+
+=item The ALIAS: Keyword
+
+=item The OVERLOAD: Keyword
+
+=item The FALLBACK: Keyword
+
+=item The INTERFACE: Keyword
+
+=item The INTERFACE_MACRO: Keyword
+
+=item The INCLUDE: Keyword
+
+=item The CASE: Keyword
+
+=item The & Unary Operator
+
+=item Inserting POD, Comments and C Preprocessor Directives
+
+=item Using XS With C++
+
+=item Interface Strategy
+
+=item Perl Objects And C Structures
+
+=item The Typemap
+
+=item Safely Storing Static Data in XS
+
+MY_CXT_KEY, typedef my_cxt_t, START_MY_CXT, MY_CXT_INIT, dMY_CXT, MY_CXT
+
+=back
+
+=item EXAMPLES
+
+=item XS VERSION
+
+=item AUTHOR
+
+=back
+
+=head2 perlclib - Internal replacements for standard C library functions
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Conventions
+
+C<t>, C<p>, C<n>, C<s>
+
+=item File Operations
+
+=item File Input and Output
+
+=item File Positioning
+
+=item Memory Management and String Handling
+
+=item Character Class Tests
+
+=item F<stdlib.h> functions
+
+=item Miscellaneous functions
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlguts - Introduction to the Perl API
+
+=over 4
+
+=item DESCRIPTION
+
+=item Variables
+
+=over 4
+
+=item Datatypes
+
+=item What is an "IV"?
+
+=item Working with SVs
+
+=item Offsets
+
+=item What's Really Stored in an SV?
+
+=item Working with AVs
+
+=item Working with HVs
+
+=item Hash API Extensions
+
+=item AVs, HVs and undefined values
+
+=item References
+
+=item Blessed References and Class Objects
+
+=item Creating New Variables
+
+GV_ADDMULTI, GV_ADDWARN
+
+=item Reference Counts and Mortality
+
+=item Stashes and Globs
+
+=item Double-Typed SVs
+
+=item Magic Variables
+
+=item Assigning Magic
+
+=item Magic Virtual Tables
+
+=item Finding Magic
+
+=item Understanding the Magic of Tied Hashes and Arrays
+
+=item Localizing changes
+
+C<SAVEINT(int i)>, C<SAVEIV(IV i)>, C<SAVEI32(I32 i)>, C<SAVELONG(long i)>,
+C<SAVESPTR(s)>, C<SAVEPPTR(p)>, C<SAVEFREESV(SV *sv)>, C<SAVEMORTALIZESV(SV
+*sv)>, C<SAVEFREEOP(OP *op)>, C<SAVEFREEPV(p)>, C<SAVECLEARSV(SV *sv)>,
+C<SAVEDELETE(HV *hv, char *key, I32 length)>,
+C<SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)>,
+C<SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)>, C<SAVESTACK_POS()>, C<SV*
+save_scalar(GV *gv)>, C<AV* save_ary(GV *gv)>, C<HV* save_hash(GV *gv)>,
+C<void save_item(SV *item)>, C<void save_list(SV **sarg, I32 maxsarg)>,
+C<SV* save_svref(SV **sptr)>, C<void save_aptr(AV **aptr)>, C<void
+save_hptr(HV **hptr)>
+
+=back
+
+=item Subroutines
+
+=over 4
+
+=item XSUBs and the Argument Stack
+
+=item Calling Perl Routines from within C Programs
+
+=item Memory Allocation
+
+=item PerlIO
+
+=item Putting a C value on Perl stack
+
+=item Scratchpads
+
+=item Scratchpads and recursion
+
+=back
+
+=item Compiled code
+
+=over 4
+
+=item Code tree
+
+=item Examining the tree
+
+=item Compile pass 1: check routines
+
+=item Compile pass 1a: constant folding
+
+=item Compile pass 2: context propagation
+
+=item Compile pass 3: peephole optimization
+
+=item Pluggable runops
+
+=back
+
+=item Examining internal data structures with the C<dump> functions
+
+=item How multiple interpreters and concurrency are supported
+
+=over 4
+
+=item Background and PERL_IMPLICIT_CONTEXT
+
+=item So what happened to dTHR?
+
+=item How do I use all this in extensions?
+
+=item Should I do anything special if I call perl from multiple threads?
+
+=item Future Plans and PERL_IMPLICIT_SYS
+
+=back
+
+=item Internal Functions
+
+A, p, d, s, n, r, f, M, o, x, m, X, E, b
+
+=over 4
+
+=item Formatted Printing of IVs, UVs, and NVs
+
+=item Pointer-To-Integer and Integer-To-Pointer
+
+=item Source Documentation
+
+=item Backwards compatibility
+
+=back
+
+=item Unicode Support
+
+=over 4
+
+=item What B<is> Unicode, anyway?
+
+=item How can I recognise a UTF-8 string?
+
+=item How does UTF-8 represent Unicode characters?
+
+=item How does Perl store UTF-8 strings?
+
+=item How do I convert a string to UTF-8?
+
+=item Is there anything else I need to know?
+
+=back
+
+=item Custom Operators
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 perlcall - Perl calling conventions from C
+
+=over 4
+
+=item DESCRIPTION
+
+An Error Handler, An Event Driven Program
+
+=item THE CALL_ FUNCTIONS
+
+call_sv, call_pv, call_method, call_argv
+
+=item FLAG VALUES
+
+=over 4
+
+=item  G_VOID
+
+=item  G_SCALAR
+
+=item G_ARRAY
+
+=item G_DISCARD
+
+=item G_NOARGS
+
+=item G_EVAL
+
+=item G_KEEPERR
+
+=item Determining the Context
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item No Parameters, Nothing returned
+
+=item Passing Parameters
+
+=item Returning a Scalar
+
+=item Returning a list of values
+
+=item Returning a list in a scalar context
+
+=item Returning Data from Perl via the parameter list
+
+=item Using G_EVAL
+
+=item Using G_KEEPERR
+
+=item Using call_sv
+
+=item Using call_argv
+
+=item Using call_method
+
+=item Using GIMME_V
+
+=item Using Perl to dispose of temporaries
+
+=item Strategies for storing Callback Context Information
+
+1. Ignore the problem - Allow only 1 callback, 2. Create a sequence of
+callbacks - hard wired limit, 3. Use a parameter to map to the Perl
+callback
+
+=item Alternate Stack Manipulation
+
+=item Creating and calling an anonymous subroutine in C
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlapi - autogenerated documentation for the perl public API
+
+=over 4
+
+=item DESCRIPTION
+X<Perl API> X<API> X<api>
+
+=item "Gimme" Values
+
+GIMME X<GIMME>, GIMME_V X<GIMME_V>, G_ARRAY X<G_ARRAY>, G_DISCARD
+X<G_DISCARD>, G_EVAL X<G_EVAL>, G_NOARGS X<G_NOARGS>, G_SCALAR X<G_SCALAR>,
+G_VOID X<G_VOID>
+
+=item Array Manipulation Functions
+
+AvFILL X<AvFILL>, av_clear X<av_clear>, av_delete X<av_delete>, av_exists
+X<av_exists>, av_extend X<av_extend>, av_fetch X<av_fetch>, av_fill
+X<av_fill>, av_len X<av_len>, av_make X<av_make>, av_pop X<av_pop>, av_push
+X<av_push>, av_shift X<av_shift>, av_store X<av_store>, av_undef
+X<av_undef>, av_unshift X<av_unshift>, get_av X<get_av>, newAV X<newAV>,
+sortsv X<sortsv>
+
+=item Callback Functions
+
+call_argv X<call_argv>, call_method X<call_method>, call_pv X<call_pv>,
+call_sv X<call_sv>, ENTER X<ENTER>, eval_pv X<eval_pv>, eval_sv X<eval_sv>,
+FREETMPS X<FREETMPS>, LEAVE X<LEAVE>, SAVETMPS X<SAVETMPS>
+
+=item Character classes
+
+isALNUM X<isALNUM>, isALPHA X<isALPHA>, isDIGIT X<isDIGIT>, isLOWER
+X<isLOWER>, isSPACE X<isSPACE>, isUPPER X<isUPPER>, toLOWER X<toLOWER>,
+toUPPER X<toUPPER>
+
+=item Cloning an interpreter
+
+perl_clone X<perl_clone>
+
+=item CV Manipulation Functions
+
+CvSTASH X<CvSTASH>, get_cv X<get_cv>
+
+=item Embedding Functions
+
+cv_undef X<cv_undef>, load_module X<load_module>, nothreadhook
+X<nothreadhook>, perl_alloc X<perl_alloc>, perl_construct
+X<perl_construct>, perl_destruct X<perl_destruct>, perl_free X<perl_free>,
+perl_parse X<perl_parse>, perl_run X<perl_run>, require_pv X<require_pv>
+
+=item Functions in file pp_pack.c
+
+packlist X<packlist>, pack_cat X<pack_cat>, unpackstring X<unpackstring>,
+unpack_str X<unpack_str>
+
+=item Global Variables
+
+PL_modglobal X<PL_modglobal>, PL_na X<PL_na>, PL_sv_no X<PL_sv_no>,
+PL_sv_undef X<PL_sv_undef>, PL_sv_yes X<PL_sv_yes>
+
+=item GV Functions
+
+GvSV X<GvSV>, gv_fetchmeth X<gv_fetchmeth>, gv_fetchmethod
+X<gv_fetchmethod>, gv_fetchmethod_autoload X<gv_fetchmethod_autoload>,
+gv_fetchmeth_autoload X<gv_fetchmeth_autoload>, gv_stashpv X<gv_stashpv>,
+gv_stashpvn X<gv_stashpvn>, gv_stashsv X<gv_stashsv>
+
+=item Handy Values
+
+Nullav X<Nullav>, Nullch X<Nullch>, Nullcv X<Nullcv>, Nullhv X<Nullhv>,
+Nullsv X<Nullsv>
+
+=item Hash Manipulation Functions
+
+get_hv X<get_hv>, HEf_SVKEY X<HEf_SVKEY>, HeHASH X<HeHASH>, HeKEY X<HeKEY>,
+HeKLEN X<HeKLEN>, HePV X<HePV>, HeSVKEY X<HeSVKEY>, HeSVKEY_force
+X<HeSVKEY_force>, HeSVKEY_set X<HeSVKEY_set>, HeVAL X<HeVAL>, HvNAME
+X<HvNAME>, hv_clear X<hv_clear>, hv_clear_placeholders
+X<hv_clear_placeholders>, hv_delete X<hv_delete>, hv_delete_ent
+X<hv_delete_ent>, hv_exists X<hv_exists>, hv_exists_ent X<hv_exists_ent>,
+hv_fetch X<hv_fetch>, hv_fetch_ent X<hv_fetch_ent>, hv_iterinit
+X<hv_iterinit>, hv_iterkey X<hv_iterkey>, hv_iterkeysv X<hv_iterkeysv>,
+hv_iternext X<hv_iternext>, hv_iternextsv X<hv_iternextsv>,
+hv_iternext_flags X<hv_iternext_flags>, hv_iterval X<hv_iterval>, hv_magic
+X<hv_magic>, hv_scalar X<hv_scalar>, hv_store X<hv_store>, hv_store_ent
+X<hv_store_ent>, hv_undef X<hv_undef>, newHV X<newHV>
+
+=item Magical Functions
+
+mg_clear X<mg_clear>, mg_copy X<mg_copy>, mg_find X<mg_find>, mg_free
+X<mg_free>, mg_get X<mg_get>, mg_length X<mg_length>, mg_magical
+X<mg_magical>, mg_set X<mg_set>, SvGETMAGIC X<SvGETMAGIC>, SvLOCK
+X<SvLOCK>, SvSETMAGIC X<SvSETMAGIC>, SvSetMagicSV X<SvSetMagicSV>,
+SvSetMagicSV_nosteal X<SvSetMagicSV_nosteal>, SvSetSV X<SvSetSV>,
+SvSetSV_nosteal X<SvSetSV_nosteal>, SvSHARE X<SvSHARE>, SvUNLOCK
+X<SvUNLOCK>
+
+=item Memory Management
+
+Copy X<Copy>, CopyD X<CopyD>, Move X<Move>, MoveD X<MoveD>, Newx X<Newx>,
+Newxc X<Newxc>, Newxz X<Newxz>, Poison X<Poison>, Renew X<Renew>, Renewc
+X<Renewc>, Safefree X<Safefree>, savepv X<savepv>, savepvn X<savepvn>,
+savesharedpv X<savesharedpv>, savesvpv X<savesvpv>, StructCopy
+X<StructCopy>, Zero X<Zero>, ZeroD X<ZeroD>
+
+=item Miscellaneous Functions
+
+fbm_compile X<fbm_compile>, fbm_instr X<fbm_instr>, form X<form>, getcwd_sv
+X<getcwd_sv>, strEQ X<strEQ>, strGE X<strGE>, strGT X<strGT>, strLE
+X<strLE>, strLT X<strLT>, strNE X<strNE>, strnEQ X<strnEQ>, strnNE
+X<strnNE>, sv_nolocking X<sv_nolocking>, sv_nosharing X<sv_nosharing>,
+sv_nounlocking X<sv_nounlocking>
+
+=item Numeric functions
+
+grok_bin X<grok_bin>, grok_hex X<grok_hex>, grok_number X<grok_number>,
+grok_numeric_radix X<grok_numeric_radix>, grok_oct X<grok_oct>, scan_bin
+X<scan_bin>, scan_hex X<scan_hex>, scan_oct X<scan_oct>
+
+=item Optree Manipulation Functions
+
+cv_const_sv X<cv_const_sv>, newCONSTSUB X<newCONSTSUB>, newXS X<newXS>
+
+=item Pad Data Structures
+
+pad_sv X<pad_sv>
+
+=item Stack Manipulation Macros
+
+dMARK X<dMARK>, dORIGMARK X<dORIGMARK>, dSP X<dSP>, EXTEND X<EXTEND>, MARK
+X<MARK>, mPUSHi X<mPUSHi>, mPUSHn X<mPUSHn>, mPUSHp X<mPUSHp>, mPUSHu
+X<mPUSHu>, mXPUSHi X<mXPUSHi>, mXPUSHn X<mXPUSHn>, mXPUSHp X<mXPUSHp>,
+mXPUSHu X<mXPUSHu>, ORIGMARK X<ORIGMARK>, POPi X<POPi>, POPl X<POPl>, POPn
+X<POPn>, POPp X<POPp>, POPpbytex X<POPpbytex>, POPpx X<POPpx>, POPs
+X<POPs>, PUSHi X<PUSHi>, PUSHMARK X<PUSHMARK>, PUSHmortal X<PUSHmortal>,
+PUSHn X<PUSHn>, PUSHp X<PUSHp>, PUSHs X<PUSHs>, PUSHu X<PUSHu>, PUTBACK
+X<PUTBACK>, SP X<SP>, SPAGAIN X<SPAGAIN>, XPUSHi X<XPUSHi>, XPUSHmortal
+X<XPUSHmortal>, XPUSHn X<XPUSHn>, XPUSHp X<XPUSHp>, XPUSHs X<XPUSHs>,
+XPUSHu X<XPUSHu>, XSRETURN X<XSRETURN>, XSRETURN_EMPTY X<XSRETURN_EMPTY>,
+XSRETURN_IV X<XSRETURN_IV>, XSRETURN_NO X<XSRETURN_NO>, XSRETURN_NV
+X<XSRETURN_NV>, XSRETURN_PV X<XSRETURN_PV>, XSRETURN_UNDEF
+X<XSRETURN_UNDEF>, XSRETURN_UV X<XSRETURN_UV>, XSRETURN_YES
+X<XSRETURN_YES>, XST_mIV X<XST_mIV>, XST_mNO X<XST_mNO>, XST_mNV
+X<XST_mNV>, XST_mPV X<XST_mPV>, XST_mUNDEF X<XST_mUNDEF>, XST_mYES
+X<XST_mYES>
+
+=item SV Flags
+
+svtype X<svtype>, SVt_IV X<SVt_IV>, SVt_NV X<SVt_NV>, SVt_PV X<SVt_PV>,
+SVt_PVAV X<SVt_PVAV>, SVt_PVCV X<SVt_PVCV>, SVt_PVHV X<SVt_PVHV>, SVt_PVMG
+X<SVt_PVMG>
+
+=item SV Manipulation Functions
+
+get_sv X<get_sv>, looks_like_number X<looks_like_number>, newRV_inc
+X<newRV_inc>, newRV_noinc X<newRV_noinc>, NEWSV X<NEWSV>, newSV X<newSV>,
+newSVhek X<newSVhek>, newSViv X<newSViv>, newSVnv X<newSVnv>, newSVpv
+X<newSVpv>, newSVpvf X<newSVpvf>, newSVpvn X<newSVpvn>, newSVpvn_share
+X<newSVpvn_share>, newSVrv X<newSVrv>, newSVsv X<newSVsv>, newSVuv
+X<newSVuv>, SvCUR X<SvCUR>, SvCUR_set X<SvCUR_set>, SvEND X<SvEND>, SvGROW
+X<SvGROW>, SvIOK X<SvIOK>, SvIOKp X<SvIOKp>, SvIOK_notUV X<SvIOK_notUV>,
+SvIOK_off X<SvIOK_off>, SvIOK_on X<SvIOK_on>, SvIOK_only X<SvIOK_only>,
+SvIOK_only_UV X<SvIOK_only_UV>, SvIOK_UV X<SvIOK_UV>, SvIsCOW X<SvIsCOW>,
+SvIsCOW_shared_hash X<SvIsCOW_shared_hash>, SvIV X<SvIV>, SvIVX X<SvIVX>,
+SvIVx X<SvIVx>, SvIV_set X<SvIV_set>, SvLEN X<SvLEN>, SvLEN_set
+X<SvLEN_set>, SvMAGIC_set X<SvMAGIC_set>, SvNIOK X<SvNIOK>, SvNIOKp
+X<SvNIOKp>, SvNIOK_off X<SvNIOK_off>, SvNOK X<SvNOK>, SvNOKp X<SvNOKp>,
+SvNOK_off X<SvNOK_off>, SvNOK_on X<SvNOK_on>, SvNOK_only X<SvNOK_only>,
+SvNV X<SvNV>, SvNVX X<SvNVX>, SvNVx X<SvNVx>, SvNV_set X<SvNV_set>, SvOK
+X<SvOK>, SvOOK X<SvOOK>, SvPOK X<SvPOK>, SvPOKp X<SvPOKp>, SvPOK_off
+X<SvPOK_off>, SvPOK_on X<SvPOK_on>, SvPOK_only X<SvPOK_only>,
+SvPOK_only_UTF8 X<SvPOK_only_UTF8>, SvPV X<SvPV>, SvPVbyte X<SvPVbyte>,
+SvPVbytex X<SvPVbytex>, SvPVbytex_force X<SvPVbytex_force>, SvPVbyte_force
+X<SvPVbyte_force>, SvPVbyte_nolen X<SvPVbyte_nolen>, SvPVutf8 X<SvPVutf8>,
+SvPVutf8x X<SvPVutf8x>, SvPVutf8x_force X<SvPVutf8x_force>, SvPVutf8_force
+X<SvPVutf8_force>, SvPVutf8_nolen X<SvPVutf8_nolen>, SvPVX X<SvPVX>, SvPVx
+X<SvPVx>, SvPV_force X<SvPV_force>, SvPV_force_nomg X<SvPV_force_nomg>,
+SvPV_nolen X<SvPV_nolen>, SvPV_set X<SvPV_set>, SvREFCNT X<SvREFCNT>,
+SvREFCNT_dec X<SvREFCNT_dec>, SvREFCNT_inc X<SvREFCNT_inc>, SvROK X<SvROK>,
+SvROK_off X<SvROK_off>, SvROK_on X<SvROK_on>, SvRV X<SvRV>, SvRV_set
+X<SvRV_set>, SvSTASH X<SvSTASH>, SvSTASH_set X<SvSTASH_set>, SvTAINT
+X<SvTAINT>, SvTAINTED X<SvTAINTED>, SvTAINTED_off X<SvTAINTED_off>,
+SvTAINTED_on X<SvTAINTED_on>, SvTRUE X<SvTRUE>, SvTYPE X<SvTYPE>, SvUOK
+X<SvUOK>, SvUPGRADE X<SvUPGRADE>, SvUTF8 X<SvUTF8>, SvUTF8_off
+X<SvUTF8_off>, SvUTF8_on X<SvUTF8_on>, SvUV X<SvUV>, SvUVX X<SvUVX>, SvUVx
+X<SvUVx>, SvUV_set X<SvUV_set>, sv_2bool X<sv_2bool>, sv_2cv X<sv_2cv>,
+sv_2io X<sv_2io>, sv_2iv X<sv_2iv>, sv_2mortal X<sv_2mortal>, sv_2nv
+X<sv_2nv>, sv_2pvbyte X<sv_2pvbyte>, sv_2pvbyte_nolen X<sv_2pvbyte_nolen>,
+sv_2pvutf8 X<sv_2pvutf8>, sv_2pvutf8_nolen X<sv_2pvutf8_nolen>,
+sv_2pv_flags X<sv_2pv_flags>, sv_2pv_nolen X<sv_2pv_nolen>, sv_2uv
+X<sv_2uv>, sv_backoff X<sv_backoff>, sv_bless X<sv_bless>, sv_catpv
+X<sv_catpv>, sv_catpvf X<sv_catpvf>, sv_catpvf_mg X<sv_catpvf_mg>,
+sv_catpvn X<sv_catpvn>, sv_catpvn_flags X<sv_catpvn_flags>, sv_catpvn_mg
+X<sv_catpvn_mg>, sv_catpvn_nomg X<sv_catpvn_nomg>, sv_catpv_mg
+X<sv_catpv_mg>, sv_catsv X<sv_catsv>, sv_catsv_flags X<sv_catsv_flags>,
+sv_catsv_mg X<sv_catsv_mg>, sv_catsv_nomg X<sv_catsv_nomg>, sv_chop
+X<sv_chop>, sv_clear X<sv_clear>, sv_cmp X<sv_cmp>, sv_cmp_locale
+X<sv_cmp_locale>, sv_collxfrm X<sv_collxfrm>, sv_copypv X<sv_copypv>,
+sv_dec X<sv_dec>, sv_derived_from X<sv_derived_from>, sv_eq X<sv_eq>,
+sv_force_normal X<sv_force_normal>, sv_force_normal_flags
+X<sv_force_normal_flags>, sv_free X<sv_free>, sv_gets X<sv_gets>, sv_grow
+X<sv_grow>, sv_inc X<sv_inc>, sv_insert X<sv_insert>, sv_isa X<sv_isa>,
+sv_isobject X<sv_isobject>, sv_iv X<sv_iv>, sv_len X<sv_len>, sv_len_utf8
+X<sv_len_utf8>, sv_magic X<sv_magic>, sv_magicext X<sv_magicext>,
+sv_mortalcopy X<sv_mortalcopy>, sv_newmortal X<sv_newmortal>, sv_newref
+X<sv_newref>, sv_nv X<sv_nv>, sv_pos_b2u X<sv_pos_b2u>, sv_pos_u2b
+X<sv_pos_u2b>, sv_pv X<sv_pv>, sv_pvbyte X<sv_pvbyte>, sv_pvbyten
+X<sv_pvbyten>, sv_pvbyten_force X<sv_pvbyten_force>, sv_pvn X<sv_pvn>,
+sv_pvn_force X<sv_pvn_force>, sv_pvn_force_flags X<sv_pvn_force_flags>,
+sv_pvutf8 X<sv_pvutf8>, sv_pvutf8n X<sv_pvutf8n>, sv_pvutf8n_force
+X<sv_pvutf8n_force>, sv_reftype X<sv_reftype>, sv_replace X<sv_replace>,
+sv_report_used X<sv_report_used>, sv_reset X<sv_reset>, sv_rvweaken
+X<sv_rvweaken>, sv_setiv X<sv_setiv>, sv_setiv_mg X<sv_setiv_mg>, sv_setnv
+X<sv_setnv>, sv_setnv_mg X<sv_setnv_mg>, sv_setpv X<sv_setpv>, sv_setpvf
+X<sv_setpvf>, sv_setpvf_mg X<sv_setpvf_mg>, sv_setpviv X<sv_setpviv>,
+sv_setpviv_mg X<sv_setpviv_mg>, sv_setpvn X<sv_setpvn>, sv_setpvn_mg
+X<sv_setpvn_mg>, sv_setpv_mg X<sv_setpv_mg>, sv_setref_iv X<sv_setref_iv>,
+sv_setref_nv X<sv_setref_nv>, sv_setref_pv X<sv_setref_pv>, sv_setref_pvn
+X<sv_setref_pvn>, sv_setref_uv X<sv_setref_uv>, sv_setsv X<sv_setsv>,
+sv_setsv_flags X<sv_setsv_flags>, sv_setsv_mg X<sv_setsv_mg>, sv_setsv_nomg
+X<sv_setsv_nomg>, sv_setuv X<sv_setuv>, sv_setuv_mg X<sv_setuv_mg>,
+sv_taint X<sv_taint>, sv_tainted X<sv_tainted>, sv_true X<sv_true>,
+sv_unmagic X<sv_unmagic>, sv_unref X<sv_unref>, sv_unref_flags
+X<sv_unref_flags>, sv_untaint X<sv_untaint>, sv_upgrade X<sv_upgrade>,
+sv_usepvn X<sv_usepvn>, sv_usepvn_mg X<sv_usepvn_mg>, sv_utf8_decode
+X<sv_utf8_decode>, sv_utf8_downgrade X<sv_utf8_downgrade>, sv_utf8_encode
+X<sv_utf8_encode>, sv_utf8_upgrade X<sv_utf8_upgrade>,
+sv_utf8_upgrade_flags X<sv_utf8_upgrade_flags>, sv_uv X<sv_uv>, sv_vcatpvf
+X<sv_vcatpvf>, sv_vcatpvfn X<sv_vcatpvfn>, sv_vcatpvf_mg X<sv_vcatpvf_mg>,
+sv_vsetpvf X<sv_vsetpvf>, sv_vsetpvfn X<sv_vsetpvfn>, sv_vsetpvf_mg
+X<sv_vsetpvf_mg>
+
+=item Unicode Support
+
+bytes_from_utf8 X<bytes_from_utf8>, bytes_to_utf8 X<bytes_to_utf8>,
+ibcmp_utf8 X<ibcmp_utf8>, is_utf8_char X<is_utf8_char>, is_utf8_string
+X<is_utf8_string>, is_utf8_string_loc X<is_utf8_string_loc>,
+is_utf8_string_loclen X<is_utf8_string_loclen>, pv_uni_display
+X<pv_uni_display>, sv_cat_decode X<sv_cat_decode>, sv_recode_to_utf8
+X<sv_recode_to_utf8>, sv_uni_display X<sv_uni_display>, to_utf8_case
+X<to_utf8_case>, to_utf8_fold X<to_utf8_fold>, to_utf8_lower
+X<to_utf8_lower>, to_utf8_title X<to_utf8_title>, to_utf8_upper
+X<to_utf8_upper>, utf8n_to_uvchr X<utf8n_to_uvchr>, utf8n_to_uvuni
+X<utf8n_to_uvuni>, utf8_distance X<utf8_distance>, utf8_hop X<utf8_hop>,
+utf8_length X<utf8_length>, utf8_to_bytes X<utf8_to_bytes>, utf8_to_uvchr
+X<utf8_to_uvchr>, utf8_to_uvuni X<utf8_to_uvuni>, uvchr_to_utf8
+X<uvchr_to_utf8>, uvuni_to_utf8_flags X<uvuni_to_utf8_flags>
+
+=item Variables created by C<xsubpp> and C<xsubpp> internal functions
+
+ax X<ax>, CLASS X<CLASS>, dAX X<dAX>, dAXMARK X<dAXMARK>, dITEMS X<dITEMS>,
+dXSARGS X<dXSARGS>, dXSI32 X<dXSI32>, items X<items>, ix X<ix>, newXSproto
+X<newXSproto>, RETVAL X<RETVAL>, ST X<ST>, THIS X<THIS>, XS X<XS>,
+XS_VERSION X<XS_VERSION>, XS_VERSION_BOOTCHECK X<XS_VERSION_BOOTCHECK>
+
+=item Warning and Dieing
+
+croak X<croak>, warn X<warn>
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 perlintern - autogenerated documentation of purely B<internal>
+		 Perl functions
+
+=over 4
+
+=item DESCRIPTION
+X<internal Perl functions> X<interpreter functions>
+
+=item CV reference counts and CvOUTSIDE
+
+CvWEAKOUTSIDE X<CvWEAKOUTSIDE>
+
+=item Functions in file pad.h
+
+CX_CURPAD_SAVE X<CX_CURPAD_SAVE>, CX_CURPAD_SV X<CX_CURPAD_SV>, PAD_BASE_SV
+X<PAD_BASE_SV>, PAD_CLONE_VARS X<PAD_CLONE_VARS>, PAD_COMPNAME_FLAGS
+X<PAD_COMPNAME_FLAGS>, PAD_COMPNAME_GEN X<PAD_COMPNAME_GEN>,
+PAD_COMPNAME_GEN_set X<PAD_COMPNAME_GEN_set>, PAD_COMPNAME_OURSTASH
+X<PAD_COMPNAME_OURSTASH>, PAD_COMPNAME_PV X<PAD_COMPNAME_PV>,
+PAD_COMPNAME_TYPE X<PAD_COMPNAME_TYPE>, PAD_DUP X<PAD_DUP>,
+PAD_RESTORE_LOCAL X<PAD_RESTORE_LOCAL>, PAD_SAVE_LOCAL X<PAD_SAVE_LOCAL>,
+PAD_SAVE_SETNULLPAD X<PAD_SAVE_SETNULLPAD>, PAD_SETSV X<PAD_SETSV>,
+PAD_SET_CUR X<PAD_SET_CUR>, PAD_SET_CUR_NOSAVE X<PAD_SET_CUR_NOSAVE>,
+PAD_SV X<PAD_SV>, PAD_SVl X<PAD_SVl>, SAVECLEARSV X<SAVECLEARSV>,
+SAVECOMPPAD X<SAVECOMPPAD>, SAVEPADSV X<SAVEPADSV>
+
+=item Functions in file pp_ctl.c
+
+find_runcv X<find_runcv>
+
+=item Global Variables
+
+PL_DBsingle X<PL_DBsingle>, PL_DBsub X<PL_DBsub>, PL_DBtrace X<PL_DBtrace>,
+PL_dowarn X<PL_dowarn>, PL_last_in_gv X<PL_last_in_gv>, PL_ofs_sv
+X<PL_ofs_sv>, PL_rs X<PL_rs>
+
+=item GV Functions
+
+is_gv_magical X<is_gv_magical>
+
+=item IO Functions
+
+start_glob X<start_glob>
+
+=item Pad Data Structures
+
+CvPADLIST X<CvPADLIST>, cv_clone X<cv_clone>, cv_dump X<cv_dump>,
+do_dump_pad X<do_dump_pad>, intro_my X<intro_my>, pad_add_anon
+X<pad_add_anon>, pad_add_name X<pad_add_name>, pad_alloc X<pad_alloc>,
+pad_block_start X<pad_block_start>, pad_check_dup X<pad_check_dup>,
+pad_findlex X<pad_findlex>, pad_findmy X<pad_findmy>, pad_fixup_inner_anons
+X<pad_fixup_inner_anons>, pad_free X<pad_free>, pad_leavemy X<pad_leavemy>,
+pad_new X<pad_new>, pad_push X<pad_push>, pad_reset X<pad_reset>, pad_setsv
+X<pad_setsv>, pad_swipe X<pad_swipe>, pad_tidy X<pad_tidy>, pad_undef
+X<pad_undef>
+
+=item Stack Manipulation Macros
+
+djSP X<djSP>, LVRET X<LVRET>
+
+=item SV Manipulation Functions
+
+report_uninit X<report_uninit>, sv_add_arena X<sv_add_arena>, sv_clean_all
+X<sv_clean_all>, sv_clean_objs X<sv_clean_objs>, sv_free_arenas
+X<sv_free_arenas>
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 perliol - C API for Perl's implementation of IO in Layers.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item History and Background
+
+=item Basic Structure
+
+=item Layers vs Disciplines
+
+=item Data Structures
+
+=item Functions and Attributes
+
+=item Per-instance Data
+
+=item Layers in action.
+
+=item Per-instance flag bits
+
+PERLIO_F_EOF, PERLIO_F_CANWRITE,  PERLIO_F_CANREAD, PERLIO_F_ERROR,
+PERLIO_F_TRUNCATE, PERLIO_F_APPEND, PERLIO_F_CRLF, PERLIO_F_UTF8,
+PERLIO_F_UNBUF, PERLIO_F_WRBUF, PERLIO_F_RDBUF, PERLIO_F_LINEBUF,
+PERLIO_F_TEMP, PERLIO_F_OPEN, PERLIO_F_FASTGETS
+
+=item Methods in Detail
+
+fsize, name, size, kind, PERLIO_K_BUFFERED, PERLIO_K_RAW, PERLIO_K_CANCRLF,
+PERLIO_K_FASTGETS, PERLIO_K_MULTIARG, Pushed, Popped, Open, Binmode,
+Getarg, Fileno, Dup, Read, Write, Seek, Tell, Close, Flush, Fill, Eof,
+Error,	Clearerr, Setlinebuf, Get_base, Get_bufsiz, Get_ptr, Get_cnt,
+Set_ptrcnt
+
+=item Utilities
+
+=item Implementing PerlIO Layers
+
+C implementations, Perl implementations
+
+=item Core Layers
+
+"unix", "perlio", "stdio", "crlf", "mmap", "pending", "raw", "utf8"
+
+=item Extension Layers
+
+":encoding", ":scalar", ":via"
+
+=back
+
+=item TODO
+
+=back
+
+=head2 perlapio - perl's IO abstraction interface.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+1. USE_STDIO, 2. USE_SFIO, 3. USE_PERLIO, B<PerlIO_stdin()>,
+B<PerlIO_stdout()>, B<PerlIO_stderr()>, B<PerlIO_open(path, mode)>,
+B<PerlIO_fdopen(fd,mode)>, B<PerlIO_reopen(path,mode,f)>,
+B<PerlIO_printf(f,fmt,...)>, B<PerlIO_vprintf(f,fmt,a)>,
+B<PerlIO_stdoutf(fmt,...)>, B<PerlIO_read(f,buf,count)>,
+B<PerlIO_write(f,buf,count)>, B<PerlIO_close(f)>, B<PerlIO_puts(f,s)>,
+B<PerlIO_putc(f,c)>, B<PerlIO_ungetc(f,c)>, B<PerlIO_getc(f)>,
+B<PerlIO_eof(f)>, B<PerlIO_error(f)>, B<PerlIO_fileno(f)>,
+B<PerlIO_clearerr(f)>, B<PerlIO_flush(f)>, B<PerlIO_seek(f,offset,whence)>,
+B<PerlIO_tell(f)>, B<PerlIO_getpos(f,p)>, B<PerlIO_setpos(f,p)>,
+B<PerlIO_rewind(f)>, B<PerlIO_tmpfile()>, B<PerlIO_setlinebuf(f)>
+
+=over 4
+
+=item Co-existence with stdio
+
+B<PerlIO_importFILE(f,mode)>, B<PerlIO_exportFILE(f,mode)>,
+B<PerlIO_releaseFILE(p,f)>, B<PerlIO_findFILE(f)>
+
+=item "Fast gets" Functions
+
+B<PerlIO_fast_gets(f)>, B<PerlIO_has_cntptr(f)>, B<PerlIO_get_cnt(f)>,
+B<PerlIO_get_ptr(f)>, B<PerlIO_set_ptrcnt(f,p,c)>, B<PerlIO_canset_cnt(f)>,
+B<PerlIO_set_cnt(f,c)>, B<PerlIO_has_base(f)>, B<PerlIO_get_base(f)>,
+B<PerlIO_get_bufsiz(f)>
+
+=item Other Functions
+
+PerlIO_apply_layers(f,mode,layers), PerlIO_binmode(f,ptype,imode,layers),
+'E<lt>' read, 'E<gt>' write, '+' read/write, PerlIO_debug(fmt,...)
+
+=back
+
+=back
+
+=head2 perlhack - How to hack at the Perl internals
+
+=over 4
+
+=item DESCRIPTION
+
+Does concept match the general goals of Perl?, Where is the
+implementation?, Backwards compatibility, Could it be a module instead?, Is
+the feature generic enough?, Does it potentially introduce new bugs?, Does
+it preclude other desirable features?, Is the implementation robust?, Is
+the implementation generic enough to be portable?, Is the implementation
+tested?, Is there enough documentation?, Is there another way to do it?,
+Does it create too much work?, Patches speak louder than words
+
+=over 4
+
+=item Keeping in sync
+
+rsync'ing the source tree, Using rsync over the LAN, Using pushing over the
+NFS, rsync'ing the patches
+
+=item Why rsync the source tree
+
+It's easier to rsync the source tree, It's more reliable
+
+=item Why rsync the patches
+
+It's easier to rsync the patches, It's a good reference, Finding a start
+point, Finding how to fix a bug, Finding the source of misbehaviour
+
+=item Working with the source
+
+=item Perlbug administration
+
+=item Submitting patches
+
+L<perlguts>, L<perlxstut> and L<perlxs>, L<perlapi>,
+F<Porting/pumpkin.pod>, The perl5-porters FAQ
+
+=item Finding Your Way Around
+
+Core modules, Tests, Documentation, Configure, Interpreter
+
+=item Elements of the interpreter
+
+Startup, Parsing, Optimization, Running, Exception handing
+
+=item Internal Variable Types
+
+=item Op Trees
+
+=item Stacks
+
+Argument stack, Mark stack, Save stack
+
+=item Millions of Macros
+
+=item The .i Targets
+
+=item Poking at Perl
+
+=item Using a source-level debugger
+
+run [args], break function_name, break source.c:xxx, step, next, continue,
+finish, 'enter', print
+
+=item gdb macro support
+
+=item Dumping Perl Data Structures
+
+=item Patching
+
+=item Patching a core module
+
+=item Adding a new function to the core
+
+=item Writing a test
+
+F<t/base/>, F<t/cmd/>, F<t/comp/>, F<t/io/>, F<t/lib/>, F<t/op/>,
+F<t/pod/>, F<t/run/>, F<t/uni/>, F<t/win32/>, F<t/x2p>, t/base t/comp,
+t/cmd t/run t/io t/op, t/lib ext lib
+
+=item Special Make Test Targets
+
+coretest, test.deparse, test.taintwarn, minitest, test.valgrind
+check.valgrind utest.valgrind ucheck.valgrind, test.third check.third
+utest.third ucheck.third, test.torture torturetest, utest ucheck test.utf8
+check.utf8, minitest.utf16 test.utf16, test_harness, test-notty test_notty
+
+=item Running tests by hand
+
+-v, -torture, -re=PATTERN, -re LIST OF PATTERNS, PERL_CORE=1,
+PERL_DESTRUCT_LEVEL=2, PERL, PERL_SKIP_TTY_TEST
+
+=back
+
+=item EXTERNAL TOOLS FOR DEBUGGING PERL
+
+=over 4
+
+=item Rational Software's Purify
+
+=item Purify on Unix
+
+-Accflags=-DPURIFY, -Doptimize='-g', -Uusemymalloc, -Dusemultiplicity
+
+=item Purify on NT
+
+DEFINES, USE_MULTI = define, #PERL_MALLOC = define, CFG = Debug
+
+=item valgrind
+
+=item Compaq's/Digital's/HP's Third Degree
+
+=item PERL_DESTRUCT_LEVEL
+
+=item Profiling
+
+=item Gprof Profiling
+
+-a, -b, -e routine, -f routine, -s, -z
+
+=item GCC gcov Profiling
+
+=item Pixie Profiling
+
+-h, -l, -p[rocedures], -h[eavy], -i[nvocations], -l[ines], -testcoverage,
+-z[ero]
+
+=item Miscellaneous tricks
+
+=item CONCLUSION
+
+I<The Road goes ever on and on, down from the door where it began.>
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlbook - Perl book information
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 perltodo - Perl TO-DO List
+
+=over 4
+
+=item DESCRIPTION
+
+=item The roadmap to 5.10
+
+=over 4
+
+=item Needed for a 5.9.4 release
+
+=item Needed for a 5.9.5 release
+
+Implement L</_ prototype character>, Implement L</state variables>
+
+=item Needed for a 5.9.6 release
+
+=back
+
+=item Tasks that only need Perl knowledge
+
+=over 4
+
+=item common test code for timed bail out
+
+=item POD -> HTML conversion in the core still sucks
+
+=item Parallel testing
+
+=item Make Schwern poorer
+
+=item Improve the coverage of the core tests
+
+=item test B
+
+=item A decent benchmark
+
+=item fix tainting bugs
+
+=item Dual life everything
+
+=item Improving C<threads::shared>
+
+=item POSIX memory footprint
+
+=back
+
+=item Tasks that need a little sysadmin-type knowledge
+
+=over 4
+
+=item Relocatable perl
+
+=item make HTML install work
+
+=item compressed man pages
+
+=item Add a code coverage target to the Makefile
+
+=item Make Config.pm cope with differences between build and installed perl
+
+=item make parallel builds work
+
+=item linker specification files
+
+=back
+
+=item Tasks that need a little C knowledge
+
+=over 4
+
+=item Make it clear from -v if this is the exact official release
+
+=item Tidy up global variables
+
+=item Ordering of "global" variables.
+
+=item bincompat functions
+
+=item am I hot or not?
+
+=item emulate the per-thread memory pool on Unix
+
+=item reduce duplication in sv_setsv_flags
+
+=back
+
+=item Tasks that need a knowledge of XS
+
+=over 4
+
+=item IPv6
+
+=item shrink C<GV>s, C<CV>s
+
+=item merge Perl_sv_2[inpu]v
+
+=item UTF8 caching code
+
+=item Implicit Latin 1 => Unicode translation
+
+=item autovivification
+
+=item Unicode in Filenames
+
+=item Unicode in %ENV
+
+=item use less 'memory'
+
+=item Re-implement C<:unique> in a way that is actually thread-safe
+
+=item Make tainting consistent
+
+=item readpipe(LIST)
+
+=back
+
+=item Tasks that need a knowledge of the interpreter
+
+=over 4
+
+=item lexical pragmas
+
+=item Attach/detach debugger from running program
+
+=item Constant folding
+
+=item LVALUE functions for lists
+
+=item LVALUE functions in the debugger
+
+=item _ prototype character
+
+=item state variables
+
+=item @INC source filter to Filter::Simple
+
+=item regexp optimiser optional
+
+=item UNITCHECK
+
+=item optional optimizer
+
+=item You WANT *how* many
+
+=item lexical aliases
+
+=item entersub XS vs Perl
+
+=item Self ties
+
+=item Optimize away @_
+
+=item What hooks would assertions need?
+
+=back
+
+=item Big projects
+
+=over 4
+
+=item make ithreads more robust
+
+=item iCOW
+
+=item (?{...}) closures in regexps
+
+=item A re-entrant regexp engine
+
+=back
+
+=back
+
+=head2 perldoc - Look up Perl documentation in Pod format.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+B<-h>, B<-v>, B<-t>, B<-u>, B<-m> I<module>, B<-l>, B<-F>, B<-f>
+I<perlfunc>, B<-q> I<perlfaq-search-regexp>, B<-T>, B<-d>
+I<destination-filename>, B<-o> I<output-formatname>, B<-M> I<module-name>,
+B<-w> I<option:value> or B<-w> I<option>, B<-X>,
+B<PageName|ModuleName|ProgramName>, B<-n> I<some-formatter>, B<-r>, B<-i>,
+B<-V>
+
+=item SECURITY
+
+=item ENVIRONMENT
+
+=item AUTHOR
+
+=back
+
+=head2 perlhist - the Perl history records
+
+=over 4
+
+=item DESCRIPTION
+
+=item INTRODUCTION
+
+=item THE KEEPERS OF THE PUMPKIN
+
+=over 4
+
+=item PUMPKIN?
+
+=back
+
+=item THE RECORDS
+
+=over 4
+
+=item SELECTED RELEASE SIZES
+
+=item SELECTED PATCH SIZES
+
+=back
+
+=item THE KEEPERS OF THE RECORDS
+
+=back
+
+=head2 perldelta - what is new for perl v5.8.8
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item New Tests
+
+=item Known Problems
+
+=item Platform Specific Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl588delta, perldelta - what is new for perl v5.8.8
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item New Tests
+
+=item Known Problems
+
+=item Platform Specific Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl587delta, perldelta - what is new for perl v5.8.7
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=over 4
+
+=item Unicode Character Database 4.1.0
+
+=item suidperl less insecure
+
+=item Optional site customization script
+
+=item C<Config.pm> is now much smaller.
+
+=back
+
+=item Modules and Pragmata
+
+=item Utility Changes
+
+=over 4
+
+=item find2perl enhancements
+
+=back
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Known Problems
+
+=item Platform Specific Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl586delta - what is new for perl v5.8.6
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=item Utility Changes
+
+=item Performance Enhancements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item New Tests
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl585delta - what is new for perl v5.8.5
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=item Utility Changes
+
+=over 4
+
+=item Perl's debugger
+
+=item h2ph
+
+=back
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Known Problems
+
+=item Platform Specific Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl584delta - what is new for perl v5.8.4
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=over 4
+
+=item Malloc wrapping
+
+=item Unicode Character Database 4.0.1
+
+=item suidperl less insecure
+
+=item format
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Updated modules
+
+Attribute::Handlers, B, Benchmark, CGI, Carp, Cwd, Exporter, File::Find,
+IO, IPC::Open3, Local::Maketext, Math::BigFloat, Math::BigInt,
+Math::BigRat, MIME::Base64, ODBM_File, POSIX, Shell, Socket, Storable,
+Switch, Sys::Syslog, Term::ANSIColor, Time::HiRes, Unicode::UCD, Win32,
+base, open, threads, utf8
+
+=back
+
+=item Performance Enhancements
+
+=item Utility Changes
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Future Directions
+
+=item Platform Specific Problems
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl583delta - what is new for perl v5.8.3
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+CGI, Cwd, Digest, Digest::MD5, Encode, File::Spec, FindBin, List::Util,
+Math::BigInt, PodParser, Pod::Perldoc, POSIX, Unicode::Collate,
+Unicode::Normalize, Test::Harness, threads::shared
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Installation and Configuration Improvements
+
+=item Selected Bug Fixes
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Configuration and Building
+
+=item Platform Specific Problems
+
+=item Known Problems
+
+=item Future Directions
+
+=item Obituary
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl582delta - what is new for perl v5.8.2
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=over 4
+
+=item Hash Randomisation
+
+=item Threading
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Updated Modules And Pragmata
+
+Devel::PPPort, Digest::MD5, I18N::LangTags, libnet, MIME::Base64,
+Pod::Perldoc, strict, Tie::Hash, Time::HiRes, Unicode::Collate,
+Unicode::Normalize, UNIVERSAL
+
+=back
+
+=item Selected Bug Fixes
+
+=item Changed Internals
+
+=item Platform Specific Problems
+
+=item Future Directions
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl581delta - what is new for perl v5.8.1
+
+=over 4
+
+=item DESCRIPTION
+
+=item Incompatible Changes
+
+=over 4
+
+=item Hash Randomisation
+
+=item UTF-8 On Filehandles No Longer Activated By Locale
+
+=item Single-number v-strings are no longer v-strings before "=>"
+
+=item (Win32) The -C Switch Has Been Repurposed
+
+=item (Win32) The /d Switch Of cmd.exe
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item UTF-8 no longer default under UTF-8 locales
+
+=item Unsafe signals again available
+
+=item Tied Arrays with Negative Array Indices
+
+=item local ${$x}
+
+=item Unicode Character Database 4.0.0
+
+=item Deprecation Warnings
+
+=item Miscellaneous Enhancements
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Updated Modules And Pragmata
+
+base, B::Bytecode, B::Concise, B::Deparse, Benchmark, ByteLoader, bytes,
+CGI, charnames, CPAN, Data::Dumper, DB_File, Devel::PPPort, Digest::MD5,
+Encode, fields, libnet, Math::BigInt, MIME::Base64, NEXT, Net::Ping,
+PerlIO::scalar, podlators, Pod::LaTeX, PodParsers, Pod::Perldoc,
+Scalar::Util, Storable, strict, Term::ANSIcolor, Test::Harness, Test::More,
+Test::Simple, Text::Balanced, Time::HiRes, threads, threads::shared,
+Unicode::Collate, Unicode::Normalize, Win32::GetFolderPath,
+Win32::GetOSVersion
+
+=back
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Platform-specific enhancements
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Closures, eval and lexicals
+
+=item Generic fixes
+
+=item Platform-specific fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=over 4
+
+=item Changed "A thread exited while %d threads were running"
+
+=item Removed "Attempt to clear a restricted hash"
+
+=item New "Illegal declaration of anonymous subroutine"
+
+=item Changed "Invalid range "%s" in transliteration operator"
+
+=item New "Missing control char name in \c"
+
+=item New "Newline in left-justified string for %s"
+
+=item New "Possible precedence problem on bitwise %c operator"
+
+=item New "Pseudo-hashes are deprecated"
+
+=item New "read() on %s filehandle %s"
+
+=item New "5.005 threads are deprecated"
+
+=item New "Tied variable freed while still in use"
+
+=item New "To%s: illegal mapping '%s'"
+
+=item New "Use of freed value in iteration"
+
+=back
+
+=item Changed Internals
+
+=item New Tests
+
+=item Known Problems
+
+=over 4
+
+=item Tied hashes in scalar context
+
+=item Net::Ping 450_service and 510_ping_udp failures
+
+=item B::C
+
+=back
+
+=item Platform Specific Problems
+
+=over 4
+
+=item EBCDIC Platforms
+
+=item Cygwin 1.5 problems
+
+=item HP-UX: HP cc warnings about sendfile and sendpath
+
+=item IRIX: t/uni/tr_7jis.t falsely failing
+
+=item Mac OS X: no usemymalloc
+
+=item Tru64: No threaded builds with GNU cc (gcc)
+
+=item Win32: sysopen, sysread, syswrite
+
+=back
+
+=item Future Directions
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=back
+
+=head2 perl58delta - what is new for perl v5.8.0
+
+=over 4
+
+=item DESCRIPTION
+
+=item Highlights In 5.8.0
+
+=item Incompatible Changes
+
+=over 4
+
+=item Binary Incompatibility
+
+=item 64-bit platforms and malloc
+
+=item AIX Dynaloading
+
+=item Attributes for C<my> variables now handled at run-time
+
+=item Socket Extension Dynamic in VMS
+
+=item IEEE-format Floating Point Default on OpenVMS Alpha
+
+=item New Unicode Semantics (no more C<use utf8>, almost)
+
+=item New Unicode Properties
+
+=item REF(...) Instead Of SCALAR(...)
+
+=item pack/unpack D/F recycled
+
+=item glob() now returns filenames in alphabetical order
+
+=item Deprecations
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item Unicode Overhaul
+
+=item PerlIO is Now The Default
+
+=item ithreads
+
+=item Restricted Hashes
+
+=item Safe Signals
+
+=item Understanding of Numbers
+
+=item Arrays now always interpolate into double-quoted strings [561]
+
+=item Miscellaneous Changes
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules and Pragmata
+
+=item Updated And Improved Modules and Pragmata
+
+=back
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Generic Improvements
+
+=item New Or Improved Platforms
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Platform Specific Changes and Fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Security Vulnerability Closed [561]
+
+=item New Tests
+
+=item Known Problems
+
+=over 4
+
+=item The Compiler Suite Is Still Very Experimental
+
+=item Localising Tied Arrays and Hashes Is Broken
+
+=item Building Extensions Can Fail Because Of Largefiles
+
+=item Modifying $_ Inside for(..)
+
+=item mod_perl 1.26 Doesn't Build With Threaded Perl
+
+=item lib/ftmp-security tests warn 'system possibly insecure'
+
+=item libwww-perl (LWP) fails base/date #51
+
+=item PDL failing some tests
+
+=item Perl_get_sv
+
+=item Self-tying Problems
+
+=item ext/threads/t/libc
+
+=item Failure of Thread (5.005-style) tests
+
+=item Timing problems
+
+=item Tied/Magical Array/Hash Elements Do Not Autovivify
+
+=item Unicode in package/class and subroutine names does not work
+
+=back
+
+=item Platform Specific Problems
+
+=over 4
+
+=item AIX
+
+=item Alpha systems with old gccs fail several tests
+
+=item AmigaOS
+
+=item BeOS
+
+=item Cygwin "unable to remap"
+
+=item Cygwin ndbm tests fail on FAT
+
+=item DJGPP Failures
+
+=item FreeBSD built with ithreads coredumps reading large directories
+
+=item FreeBSD Failing locale Test 117 For ISO 8859-15 Locales
+
+=item IRIX fails ext/List/Util/t/shuffle.t or Digest::MD5
+
+=item HP-UX lib/posix Subtest 9 Fails When LP64-Configured
+
+=item Linux with glibc 2.2.5 fails t/op/int subtest #6 with -Duse64bitint
+
+=item Linux With Sfio Fails op/misc Test 48
+
+=item Mac OS X
+
+=item Mac OS X dyld undefined symbols
+
+=item OS/2 Test Failures
+
+=item op/sprintf tests 91, 129, and 130
+
+=item SCO
+
+=item Solaris 2.5
+
+=item Solaris x86 Fails Tests With -Duse64bitint
+
+=item SUPER-UX (NEC SX)
+
+=item Term::ReadKey not working on Win32
+
+=item UNICOS/mk
+
+=item UTS
+
+=item VOS (Stratus)
+
+=item VMS
+
+=item Win32
+
+=item XML::Parser not working
+
+=item z/OS (OS/390)
+
+=item Unicode Support on EBCDIC Still Spotty
+
+=item Seen In Perl 5.7 But Gone Now
+
+=back
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl573delta - what's new for perl v5.7.3
+
+=over 4
+
+=item DESCRIPTION
+
+=item Changes
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl572delta - what's new for perl v5.7.2
+
+=over 4
+
+=item DESCRIPTION
+
+=item Security Vulnerability Closed
+
+=item Incompatible Changes
+
+=over 4
+
+=item 64-bit platforms and malloc
+
+=item AIX Dynaloading
+
+=item Socket Extension Dynamic in VMS
+
+=item Different Definition of the Unicode Character Classes \p{In...}
+
+=item Deprecations
+
+=back
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules and Distributions
+
+=item Updated And Improved Modules and Pragmata
+
+=back
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item New Or Improved Platforms
+
+=item Generic Improvements
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Platform Specific Changes and Fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=item Source Code Enhancements
+
+=over 4
+
+=item MAGIC constants
+
+=item Better commented code
+
+=item Regex pre-/post-compilation items matched up
+
+=item gcc -Wall
+
+=back
+
+=item New Tests
+
+=item Known Problems
+
+=over 4
+
+=item AIX
+
+=item Amiga Perl Invoking Mystery
+
+=item lib/ftmp-security tests warn 'system possibly insecure'
+
+=item Cygwin intermittent failures of lib/Memoize/t/expire_file 11 and 12
+
+=item HP-UX lib/io_multihomed Fails When LP64-Configured
+
+=item  HP-UX lib/posix Subtest 9 Fails When LP64-Configured
+
+=item Linux With Sfio Fails op/misc Test 48
+
+=item OS/390
+
+=item op/sprintf tests 129 and 130
+
+=item  Failure of Thread tests
+
+=item UNICOS
+
+=item UTS
+
+=item VMS
+
+=item Win32
+
+=item Localising a Tied Variable Leaks Memory
+
+=item Self-tying of Arrays and Hashes Is Forbidden
+
+=item Variable Attributes are not Currently Usable for Tieing
+
+=item Building Extensions Can Fail Because Of Largefiles
+
+=item The Compiler Suite Is Still Experimental
+
+=item The Long Double Support is Still Experimental
+
+=back
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl571delta - what's new for perl v5.7.1
+
+=over 4
+
+=item DESCRIPTION
+
+=item Security Vulnerability Closed
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=over 4
+
+=item AUTOLOAD Is Now Lvaluable
+
+=item PerlIO is Now The Default
+
+=item Signals Are Now Safe
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules
+
+=item Updated And Improved Modules and Pragmata
+
+=back
+
+=item Performance Enhancements
+
+=item Utility Changes
+
+=item New Documentation
+
+=over 4
+
+=item perlclib
+
+=item perliol
+
+=item README.aix
+
+=item README.bs2000
+
+=item README.macos
+
+=item README.mpeix
+
+=item README.solaris
+
+=item README.vos
+
+=item Porting/repository.pod
+
+=back
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item New Or Improved Platforms
+
+=item Generic Improvements
+
+d_cmsghdr, d_fcntl_can_lock, d_fsync, d_getitimer, d_getpagsz, d_msghdr_s,
+need_va_copy, d_readv, d_recvmsg, d_sendmsg, sig_size, d_sockatmark,
+d_strtoq, d_u32align, d_ualarm, d_usleep
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Platform Specific Changes and Fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item New Tests
+
+=item Known Problems
+
+=over 4
+
+=item AIX vac 5.0.0.0 May Produce Buggy Code For Perl
+
+=item lib/ftmp-security tests warn 'system possibly insecure'
+
+=item lib/io_multihomed Fails In LP64-Configured HP-UX
+
+=item Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
+
+=item lib/b test 19
+
+=item Linux With Sfio Fails op/misc Test 48
+
+=item sigaction test 13 in VMS
+
+=item sprintf tests 129 and 130
+
+=item  Failure of Thread tests
+
+=item Localising a Tied Variable Leaks Memory
+
+=item Self-tying of Arrays and Hashes Is Forbidden
+
+=item Building Extensions Can Fail Because Of Largefiles
+
+=item The Compiler Suite Is Still Experimental
+
+=back
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl570delta - what's new for perl v5.7.0
+
+=over 4
+
+=item DESCRIPTION
+
+=item Security Vulnerability Closed
+
+=item Incompatible Changes
+
+=item Core Enhancements
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules
+
+=item Updated And Improved Modules and Pragmata
+
+=back
+
+=item Utility Changes
+
+=item New Documentation
+
+=item Performance Enhancements
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item Generic Improvements
+
+=back
+
+=item Selected Bug Fixes
+
+=over 4
+
+=item Platform Specific Changes and Fixes
+
+=back
+
+=item New or Changed Diagnostics
+
+=item Changed Internals
+
+=item Known Problems
+
+=over 4
+
+=item Unicode Support Still Far From Perfect
+
+=item EBCDIC Still A Lost Platform
+
+=item Building Extensions Can Fail Because Of Largefiles
+
+=item ftmp-security tests warn 'system possibly insecure'
+
+=item Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
+
+=item Long Doubles Still Don't Work In Solaris
+
+=item Linux With Sfio Fails op/misc Test 48
+
+=item Storable tests fail in some platforms
+
+=item Threads Are Still Experimental
+
+=item The Compiler Suite Is Still Experimental
+
+=back
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl561delta - what's new for perl v5.6.x
+
+=over 4
+
+=item DESCRIPTION
+
+=item Summary of changes between 5.6.0 and 5.6.1
+
+=over 4
+
+=item Security Issues
+
+=item Core bug fixes
+
+C<UNIVERSAL::isa()>, Memory leaks, Numeric conversions, qw(a\\b), caller(),
+Bugs in regular expressions, "slurp" mode, Autovivification of symbolic
+references to special variables, Lexical warnings, Spurious warnings and
+errors, glob(), Tainting, sort(), #line directives, Subroutine prototypes,
+map(), Debugger, PERL5OPT, chop(), Unicode support, 64-bit support,
+Compiler, Lvalue subroutines, IO::Socket, File::Find, xsubpp, C<no
+Module;>, Tests
+
+=item Core features
+
+=item Configuration issues
+
+=item Documentation
+
+=item Bundled modules
+
+B::Concise, File::Temp, Pod::LaTeX, Pod::Text::Overstrike, CGI, CPAN,
+Class::Struct, DB_File, Devel::Peek, File::Find, Getopt::Long, IO::Poll,
+IPC::Open3, Math::BigFloat, Math::Complex, Net::Ping, Opcode, Pod::Parser,
+Pod::Text, SDBM_File, Sys::Syslog, Tie::RefHash, Tie::SubstrHash
+
+=item Platform-specific improvements
+
+NCR MP-RAS, NonStop-UX
+
+=back
+
+=item Core Enhancements
+
+=over 4
+
+=item Interpreter cloning, threads, and concurrency
+
+=item Lexically scoped warning categories
+
+=item Unicode and UTF-8 support
+
+=item Support for interpolating named characters
+
+=item "our" declarations
+
+=item Support for strings represented as a vector of ordinals
+
+=item Improved Perl version numbering system
+
+=item New syntax for declaring subroutine attributes
+
+=item File and directory handles can be autovivified
+
+=item open() with more than two arguments
+
+=item 64-bit support
+
+=item Large file support
+
+=item Long doubles
+
+=item "more bits"
+
+=item Enhanced support for sort() subroutines
+
+=item C<sort $coderef @foo> allowed
+
+=item File globbing implemented internally
+
+=item Support for CHECK blocks
+
+=item POSIX character class syntax [: :] supported
+
+=item Better pseudo-random number generator
+
+=item Improved C<qw//> operator
+
+=item Better worst-case behavior of hashes
+
+=item pack() format 'Z' supported
+
+=item pack() format modifier '!' supported
+
+=item pack() and unpack() support counted strings
+
+=item Comments in pack() templates
+
+=item Weak references
+
+=item Binary numbers supported
+
+=item Lvalue subroutines
+
+=item Some arrows may be omitted in calls through references
+
+=item Boolean assignment operators are legal lvalues
+
+=item exists() is supported on subroutine names
+
+=item exists() and delete() are supported on array elements
+
+=item Pseudo-hashes work better
+
+=item Automatic flushing of output buffers
+
+=item Better diagnostics on meaningless filehandle operations
+
+=item Where possible, buffered data discarded from duped input filehandle
+
+=item eof() has the same old magic as <>
+
+=item binmode() can be used to set :crlf and :raw modes
+
+=item C<-T> filetest recognizes UTF-8 encoded files as "text"
+
+=item system(), backticks and pipe open now reflect exec() failure
+
+=item Improved diagnostics
+
+=item Diagnostics follow STDERR
+
+=item More consistent close-on-exec behavior
+
+=item syswrite() ease-of-use
+
+=item Better syntax checks on parenthesized unary operators
+
+=item Bit operators support full native integer width
+
+=item Improved security features
+
+=item More functional bareword prototype (*)
+
+=item C<require> and C<do> may be overridden
+
+=item $^X variables may now have names longer than one character
+
+=item New variable $^C reflects C<-c> switch
+
+=item New variable $^V contains Perl version as a string
+
+=item Optional Y2K warnings
+
+=item Arrays now always interpolate into double-quoted strings
+
+=item @- and @+ provide starting/ending offsets of regex submatches
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Modules
+
+attributes, B, Benchmark, ByteLoader, constant, charnames, Data::Dumper,
+DB, DB_File, Devel::DProf, Devel::Peek, Dumpvalue, DynaLoader, English,
+Env, Fcntl, File::Compare, File::Find, File::Glob, File::Spec,
+File::Spec::Functions, Getopt::Long, IO, JPL, lib, Math::BigInt,
+Math::Complex, Math::Trig, Pod::Parser, Pod::InputObjects, Pod::Checker,
+podchecker, Pod::ParseUtils, Pod::Find, Pod::Select, podselect, Pod::Usage,
+pod2usage, Pod::Text and Pod::Man, SDBM_File, Sys::Syslog, Sys::Hostname,
+Term::ANSIColor, Time::Local, Win32, XSLoader, DBM Filters
+
+=item Pragmata
+
+=back
+
+=item Utility Changes
+
+=over 4
+
+=item dprofpp
+
+=item find2perl
+
+=item h2xs
+
+=item perlcc
+
+=item perldoc
+
+=item The Perl Debugger
+
+=back
+
+=item Improved Documentation
+
+perlapi.pod, perlboot.pod, perlcompile.pod, perldbmfilter.pod,
+perldebug.pod, perldebguts.pod, perlfork.pod, perlfilter.pod, perlhack.pod,
+perlintern.pod, perllexwarn.pod, perlnumber.pod, perlopentut.pod,
+perlreftut.pod, perltootc.pod, perltodo.pod, perlunicode.pod
+
+=item Performance enhancements
+
+=over 4
+
+=item Simple sort() using { $a <=> $b } and the like are optimized
+
+=item Optimized assignments to lexical variables
+
+=item Faster subroutine calls
+
+=item delete(), each(), values() and hash iteration are faster
+
+=back
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item -Dusethreads means something different
+
+=item New Configure flags
+
+=item Threadedness and 64-bitness now more daring
+
+=item Long Doubles
+
+=item -Dusemorebits
+
+=item -Duselargefiles
+
+=item installusrbinperl
+
+=item SOCKS support
+
+=item C<-A> flag
+
+=item Enhanced Installation Directories
+
+=item gcc automatically tried if 'cc' does not seem to be working
+
+=back
+
+=item Platform specific changes
+
+=over 4
+
+=item Supported platforms
+
+=item DOS
+
+=item OS390 (OpenEdition MVS)
+
+=item VMS
+
+=item Win32
+
+=back
+
+=item Significant bug fixes
+
+=over 4
+
+=item <HANDLE> on empty files
+
+=item C<eval '...'> improvements
+
+=item All compilation errors are true errors
+
+=item Implicitly closed filehandles are safer
+
+=item Behavior of list slices is more consistent
+
+=item C<(\$)> prototype and C<$foo{a}>
+
+=item C<goto &sub> and AUTOLOAD
+
+=item C<-bareword> allowed under C<use integer>
+
+=item Failures in DESTROY()
+
+=item Locale bugs fixed
+
+=item Memory leaks
+
+=item Spurious subroutine stubs after failed subroutine calls
+
+=item Taint failures under C<-U>
+
+=item END blocks and the C<-c> switch
+
+=item Potential to leak DATA filehandles
+
+=back
+
+=item New or Changed Diagnostics
+
+"%s" variable %s masks earlier declaration in same %s, "my sub" not yet
+implemented, "our" variable %s redeclared, '!' allowed only after types %s,
+/ cannot take a count, / must be followed by a, A or Z, / must be followed
+by a*, A* or Z*, / must follow a numeric type, /%s/: Unrecognized escape
+\\%c passed through, /%s/: Unrecognized escape \\%c in character class
+passed through, /%s/ should probably be written as "%s", %s() called too
+early to check prototype, %s argument is not a HASH or ARRAY element, %s
+argument is not a HASH or ARRAY element or slice, %s argument is not a
+subroutine name, %s package attribute may clash with future reserved word:
+%s, (in cleanup) %s, <> should be quotes, Attempt to join self, Bad evalled
+substitution pattern, Bad realloc() ignored, Bareword found in conditional,
+Binary number > 0b11111111111111111111111111111111 non-portable, Bit vector
+size > 32 non-portable, Buffer overflow in prime_env_iter: %s, Can't check
+filesystem of script "%s", Can't declare class for non-scalar %s in "%s",
+Can't declare %s in "%s", Can't ignore signal CHLD, forcing to default,
+Can't modify non-lvalue subroutine call, Can't read CRTL environ, Can't
+remove %s: %s, skipping file, Can't return %s from lvalue subroutine, Can't
+weaken a nonreference, Character class [:%s:] unknown, Character class
+syntax [%s] belongs inside character classes, Constant is not %s reference,
+constant(%s): %s, CORE::%s is not a keyword, defined(@array) is deprecated,
+defined(%hash) is deprecated, Did not produce a valid header, (Did you mean
+"local" instead of "our"?), Document contains no data, entering effective
+%s failed, false [] range "%s" in regexp, Filehandle %s opened only for
+output, flock() on closed filehandle %s, Global symbol "%s" requires
+explicit package name, Hexadecimal number > 0xffffffff non-portable,
+Ill-formed CRTL environ value "%s", Ill-formed message in prime_env_iter:
+|%s|, Illegal binary digit %s, Illegal binary digit %s ignored, Illegal
+number of bits in vec, Integer overflow in %s number, Invalid %s attribute:
+%s, Invalid %s attributes: %s, invalid [] range "%s" in regexp, Invalid
+separator character %s in attribute list, Invalid separator character %s in
+subroutine attribute list, leaving effective %s failed, Lvalue subs
+returning %s not implemented yet, Method %s not permitted, Missing
+%sbrace%s on \N{}, Missing command in piped open, Missing name in "my sub",
+No %s specified for -%c, No package name allowed for variable %s in "our",
+No space allowed after -%c, no UTC offset information; assuming local time
+is UTC, Octal number > 037777777777 non-portable, panic: del_backref,
+panic: kid popen errno read, panic: magic_killbackrefs, Parentheses missing
+around "%s" list, Possible unintended interpolation of %s in string,
+Possible Y2K bug: %s, pragma "attrs" is deprecated, use "sub NAME : ATTRS"
+instead, Premature end of script headers, Repeat count in pack overflows,
+Repeat count in unpack overflows, realloc() of freed memory ignored,
+Reference is already weak, setpgrp can't take arguments, Strange *+?{} on
+zero-length expression, switching effective %s is not implemented, This
+Perl can't reset CRTL environ elements (%s), This Perl can't set CRTL
+environ elements (%s=%s), Too late to run %s block, Unknown open() mode
+'%s', Unknown process %x sent message to prime_env_iter: %s, Unrecognized
+escape \\%c passed through, Unterminated attribute parameter in attribute
+list, Unterminated attribute list, Unterminated attribute parameter in
+subroutine attribute list, Unterminated subroutine attribute list, Value of
+CLI symbol "%s" too long, Version number must be a constant number
+
+=item New tests
+
+=item Incompatible Changes
+
+=over 4
+
+=item Perl Source Incompatibilities
+
+CHECK is a new keyword, Treatment of list slices of undef has changed,
+Format of $English::PERL_VERSION is different, Literals of the form
+C<1.2.3> parse differently, Possibly changed pseudo-random number
+generator, Hashing function for hash keys has changed, C<undef> fails on
+read only values, Close-on-exec bit may be set on pipe and socket handles,
+Writing C<"$$1"> to mean C<"${$}1"> is unsupported, delete(), each(),
+values() and C<\(%h)>, vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS,
+Text of some diagnostic output has changed, C<%@> has been removed,
+Parenthesized not() behaves like a list operator, Semantics of bareword
+prototype C<(*)> have changed, Semantics of bit operators may have changed
+on 64-bit platforms, More builtins taint their results
+
+=item C Source Incompatibilities
+
+C<PERL_POLLUTE>, C<PERL_IMPLICIT_CONTEXT>, C<PERL_POLLUTE_MALLOC>
+
+=item Compatible C Source API Changes
+
+C<PATCHLEVEL> is now C<PERL_VERSION>
+
+=item Binary Incompatibilities
+
+=back
+
+=item Known Problems
+
+=over 4
+
+=item Localizing a tied hash element may leak memory
+
+=item Known test failures
+
+=item EBCDIC platforms not fully supported
+
+=item UNICOS/mk CC failures during Configure run
+
+=item Arrow operator and arrays
+
+=item Experimental features
+
+Threads, Unicode, 64-bit support, Lvalue subroutines, Weak references, The
+pseudo-hash data type, The Compiler suite, Internal implementation of file
+globbing, The DB module, The regular expression code constructs:
+
+=back
+
+=item Obsolete Diagnostics
+
+Character class syntax [: :] is reserved for future extensions, Ill-formed
+logical name |%s| in prime_env_iter, In string, @%s now must be written as
+\@%s, Probable precedence problem on %s, regexp too big, Use of "$$<digit>"
+to mean "${$}<digit>" is deprecated
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl56delta - what's new for perl v5.6.0
+
+=over 4
+
+=item DESCRIPTION
+
+=item Core Enhancements
+
+=over 4
+
+=item Interpreter cloning, threads, and concurrency
+
+=item Lexically scoped warning categories
+
+=item Unicode and UTF-8 support
+
+=item Support for interpolating named characters
+
+=item "our" declarations
+
+=item Support for strings represented as a vector of ordinals
+
+=item Improved Perl version numbering system
+
+=item New syntax for declaring subroutine attributes
+
+=item File and directory handles can be autovivified
+
+=item open() with more than two arguments
+
+=item 64-bit support
+
+=item Large file support
+
+=item Long doubles
+
+=item "more bits"
+
+=item Enhanced support for sort() subroutines
+
+=item C<sort $coderef @foo> allowed
+
+=item File globbing implemented internally
+
+=item Support for CHECK blocks
+
+=item POSIX character class syntax [: :] supported
+
+=item Better pseudo-random number generator
+
+=item Improved C<qw//> operator
+
+=item Better worst-case behavior of hashes
+
+=item pack() format 'Z' supported
+
+=item pack() format modifier '!' supported
+
+=item pack() and unpack() support counted strings
+
+=item Comments in pack() templates
+
+=item Weak references
+
+=item Binary numbers supported
+
+=item Lvalue subroutines
+
+=item Some arrows may be omitted in calls through references
+
+=item Boolean assignment operators are legal lvalues
+
+=item exists() is supported on subroutine names
+
+=item exists() and delete() are supported on array elements
+
+=item Pseudo-hashes work better
+
+=item Automatic flushing of output buffers
+
+=item Better diagnostics on meaningless filehandle operations
+
+=item Where possible, buffered data discarded from duped input filehandle
+
+=item eof() has the same old magic as <>
+
+=item binmode() can be used to set :crlf and :raw modes
+
+=item C<-T> filetest recognizes UTF-8 encoded files as "text"
+
+=item system(), backticks and pipe open now reflect exec() failure
+
+=item Improved diagnostics
+
+=item Diagnostics follow STDERR
+
+=item More consistent close-on-exec behavior
+
+=item syswrite() ease-of-use
+
+=item Better syntax checks on parenthesized unary operators
+
+=item Bit operators support full native integer width
+
+=item Improved security features
+
+=item More functional bareword prototype (*)
+
+=item C<require> and C<do> may be overridden
+
+=item $^X variables may now have names longer than one character
+
+=item New variable $^C reflects C<-c> switch
+
+=item New variable $^V contains Perl version as a string
+
+=item Optional Y2K warnings
+
+=item Arrays now always interpolate into double-quoted strings
+
+=item @- and @+ provide starting/ending offsets of regex matches
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item Modules
+
+attributes, B, Benchmark, ByteLoader, constant, charnames, Data::Dumper,
+DB, DB_File, Devel::DProf, Devel::Peek, Dumpvalue, DynaLoader, English,
+Env, Fcntl, File::Compare, File::Find, File::Glob, File::Spec,
+File::Spec::Functions, Getopt::Long, IO, JPL, lib, Math::BigInt,
+Math::Complex, Math::Trig, Pod::Parser, Pod::InputObjects, Pod::Checker,
+podchecker, Pod::ParseUtils, Pod::Find, Pod::Select, podselect, Pod::Usage,
+pod2usage, Pod::Text and Pod::Man, SDBM_File, Sys::Syslog, Sys::Hostname,
+Term::ANSIColor, Time::Local, Win32, XSLoader, DBM Filters
+
+=item Pragmata
+
+=back
+
+=item Utility Changes
+
+=over 4
+
+=item dprofpp
+
+=item find2perl
+
+=item h2xs
+
+=item perlcc
+
+=item perldoc
+
+=item The Perl Debugger
+
+=back
+
+=item Improved Documentation
+
+perlapi.pod, perlboot.pod, perlcompile.pod, perldbmfilter.pod,
+perldebug.pod, perldebguts.pod, perlfork.pod, perlfilter.pod, perlhack.pod,
+perlintern.pod, perllexwarn.pod, perlnumber.pod, perlopentut.pod,
+perlreftut.pod, perltootc.pod, perltodo.pod, perlunicode.pod
+
+=item Performance enhancements
+
+=over 4
+
+=item Simple sort() using { $a <=> $b } and the like are optimized
+
+=item Optimized assignments to lexical variables
+
+=item Faster subroutine calls
+
+=item delete(), each(), values() and hash iteration are faster
+
+=back
+
+=item Installation and Configuration Improvements
+
+=over 4
+
+=item -Dusethreads means something different
+
+=item New Configure flags
+
+=item Threadedness and 64-bitness now more daring
+
+=item Long Doubles
+
+=item -Dusemorebits
+
+=item -Duselargefiles
+
+=item installusrbinperl
+
+=item SOCKS support
+
+=item C<-A> flag
+
+=item Enhanced Installation Directories
+
+=back
+
+=item Platform specific changes
+
+=over 4
+
+=item Supported platforms
+
+=item DOS
+
+=item OS390 (OpenEdition MVS)
+
+=item VMS
+
+=item Win32
+
+=back
+
+=item Significant bug fixes
+
+=over 4
+
+=item <HANDLE> on empty files
+
+=item C<eval '...'> improvements
+
+=item All compilation errors are true errors
+
+=item Implicitly closed filehandles are safer
+
+=item Behavior of list slices is more consistent
+
+=item C<(\$)> prototype and C<$foo{a}>
+
+=item C<goto &sub> and AUTOLOAD
+
+=item C<-bareword> allowed under C<use integer>
+
+=item Failures in DESTROY()
+
+=item Locale bugs fixed
+
+=item Memory leaks
+
+=item Spurious subroutine stubs after failed subroutine calls
+
+=item Taint failures under C<-U>
+
+=item END blocks and the C<-c> switch
+
+=item Potential to leak DATA filehandles
+
+=back
+
+=item New or Changed Diagnostics
+
+"%s" variable %s masks earlier declaration in same %s, "my sub" not yet
+implemented, "our" variable %s redeclared, '!' allowed only after types %s,
+/ cannot take a count, / must be followed by a, A or Z, / must be followed
+by a*, A* or Z*, / must follow a numeric type, /%s/: Unrecognized escape
+\\%c passed through, /%s/: Unrecognized escape \\%c in character class
+passed through, /%s/ should probably be written as "%s", %s() called too
+early to check prototype, %s argument is not a HASH or ARRAY element, %s
+argument is not a HASH or ARRAY element or slice, %s argument is not a
+subroutine name, %s package attribute may clash with future reserved word:
+%s, (in cleanup) %s, <> should be quotes, Attempt to join self, Bad evalled
+substitution pattern, Bad realloc() ignored, Bareword found in conditional,
+Binary number > 0b11111111111111111111111111111111 non-portable, Bit vector
+size > 32 non-portable, Buffer overflow in prime_env_iter: %s, Can't check
+filesystem of script "%s", Can't declare class for non-scalar %s in "%s",
+Can't declare %s in "%s", Can't ignore signal CHLD, forcing to default,
+Can't modify non-lvalue subroutine call, Can't read CRTL environ, Can't
+remove %s: %s, skipping file, Can't return %s from lvalue subroutine, Can't
+weaken a nonreference, Character class [:%s:] unknown, Character class
+syntax [%s] belongs inside character classes, Constant is not %s reference,
+constant(%s): %s, CORE::%s is not a keyword, defined(@array) is deprecated,
+defined(%hash) is deprecated, Did not produce a valid header, (Did you mean
+"local" instead of "our"?), Document contains no data, entering effective
+%s failed, false [] range "%s" in regexp, Filehandle %s opened only for
+output, flock() on closed filehandle %s, Global symbol "%s" requires
+explicit package name, Hexadecimal number > 0xffffffff non-portable,
+Ill-formed CRTL environ value "%s", Ill-formed message in prime_env_iter:
+|%s|, Illegal binary digit %s, Illegal binary digit %s ignored, Illegal
+number of bits in vec, Integer overflow in %s number, Invalid %s attribute:
+%s, Invalid %s attributes: %s, invalid [] range "%s" in regexp, Invalid
+separator character %s in attribute list, Invalid separator character %s in
+subroutine attribute list, leaving effective %s failed, Lvalue subs
+returning %s not implemented yet, Method %s not permitted, Missing
+%sbrace%s on \N{}, Missing command in piped open, Missing name in "my sub",
+No %s specified for -%c, No package name allowed for variable %s in "our",
+No space allowed after -%c, no UTC offset information; assuming local time
+is UTC, Octal number > 037777777777 non-portable, panic: del_backref,
+panic: kid popen errno read, panic: magic_killbackrefs, Parentheses missing
+around "%s" list, Possible unintended interpolation of %s in string,
+Possible Y2K bug: %s, pragma "attrs" is deprecated, use "sub NAME : ATTRS"
+instead, Premature end of script headers, Repeat count in pack overflows,
+Repeat count in unpack overflows, realloc() of freed memory ignored,
+Reference is already weak, setpgrp can't take arguments, Strange *+?{} on
+zero-length expression, switching effective %s is not implemented, This
+Perl can't reset CRTL environ elements (%s), This Perl can't set CRTL
+environ elements (%s=%s), Too late to run %s block, Unknown open() mode
+'%s', Unknown process %x sent message to prime_env_iter: %s, Unrecognized
+escape \\%c passed through, Unterminated attribute parameter in attribute
+list, Unterminated attribute list, Unterminated attribute parameter in
+subroutine attribute list, Unterminated subroutine attribute list, Value of
+CLI symbol "%s" too long, Version number must be a constant number
+
+=item New tests
+
+=item Incompatible Changes
+
+=over 4
+
+=item Perl Source Incompatibilities
+
+CHECK is a new keyword, Treatment of list slices of undef has changed,
+Format of $English::PERL_VERSION is different, Literals of the form
+C<1.2.3> parse differently, Possibly changed pseudo-random number
+generator, Hashing function for hash keys has changed, C<undef> fails on
+read only values, Close-on-exec bit may be set on pipe and socket handles,
+Writing C<"$$1"> to mean C<"${$}1"> is unsupported, delete(), each(),
+values() and C<\(%h)>, vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS,
+Text of some diagnostic output has changed, C<%@> has been removed,
+Parenthesized not() behaves like a list operator, Semantics of bareword
+prototype C<(*)> have changed, Semantics of bit operators may have changed
+on 64-bit platforms, More builtins taint their results
+
+=item C Source Incompatibilities
+
+C<PERL_POLLUTE>, C<PERL_IMPLICIT_CONTEXT>, C<PERL_POLLUTE_MALLOC>
+
+=item Compatible C Source API Changes
+
+C<PATCHLEVEL> is now C<PERL_VERSION>
+
+=item Binary Incompatibilities
+
+=back
+
+=item Known Problems
+
+=over 4
+
+=item Thread test failures
+
+=item EBCDIC platforms not supported
+
+=item In 64-bit HP-UX the lib/io_multihomed test may hang
+
+=item NEXTSTEP 3.3 POSIX test failure
+
+=item Tru64 (aka Digital UNIX, aka DEC OSF/1) lib/sdbm test failure with
+gcc
+
+=item UNICOS/mk CC failures during Configure run
+
+=item Arrow operator and arrays
+
+=item Experimental features
+
+Threads, Unicode, 64-bit support, Lvalue subroutines, Weak references, The
+pseudo-hash data type, The Compiler suite, Internal implementation of file
+globbing, The DB module, The regular expression code constructs:
+
+=back
+
+=item Obsolete Diagnostics
+
+Character class syntax [: :] is reserved for future extensions, Ill-formed
+logical name |%s| in prime_env_iter, In string, @%s now must be written as
+\@%s, Probable precedence problem on %s, regexp too big, Use of "$$<digit>"
+to mean "${$}<digit>" is deprecated
+
+=item Reporting Bugs
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl5005delta - what's new for perl5.005
+
+=over 4
+
+=item DESCRIPTION
+
+=item About the new versioning system
+
+=item Incompatible Changes
+
+=over 4
+
+=item WARNING:	This version is not binary compatible with Perl 5.004.
+
+=item Default installation structure has changed
+
+=item Perl Source Compatibility
+
+=item C Source Compatibility
+
+=item Binary Compatibility
+
+=item Security fixes may affect compatibility
+
+=item Relaxed new mandatory warnings introduced in 5.004
+
+=item Licensing
+
+=back
+
+=item Core Changes
+
+=over 4
+
+=item Threads
+
+=item Compiler
+
+=item Regular Expressions
+
+Many new and improved optimizations, Many bug fixes, New regular expression
+constructs, New operator for precompiled regular expressions, Other
+improvements, Incompatible changes
+
+=item	Improved malloc()
+
+=item Quicksort is internally implemented
+
+=item Reliable signals
+
+=item Reliable stack pointers
+
+=item More generous treatment of carriage returns
+
+=item Memory leaks
+
+=item Better support for multiple interpreters
+
+=item Behavior of local() on array and hash elements is now well-defined
+
+=item C<%!> is transparently tied to the L<Errno> module
+
+=item Pseudo-hashes are supported
+
+=item C<EXPR foreach EXPR> is supported
+
+=item Keywords can be globally overridden
+
+=item C<$^E> is meaningful on Win32
+
+=item C<foreach (1..1000000)> optimized
+
+=item C<Foo::> can be used as implicitly quoted package name
+
+=item C<exists $Foo::{Bar::}> tests existence of a package
+
+=item Better locale support
+
+=item Experimental support for 64-bit platforms
+
+=item prototype() returns useful results on builtins
+
+=item Extended support for exception handling
+
+=item Re-blessing in DESTROY() supported for chaining DESTROY() methods
+
+=item All C<printf> format conversions are handled internally
+
+=item New C<INIT> keyword
+
+=item New C<lock> keyword
+
+=item New C<qr//> operator
+
+=item C<our> is now a reserved word
+
+=item Tied arrays are now fully supported
+
+=item Tied handles support is better
+
+=item 4th argument to substr
+
+=item Negative LENGTH argument to splice
+
+=item Magic lvalues are now more magical
+
+=item <> now reads in records
+
+=back
+
+=item Supported Platforms
+
+=over 4
+
+=item New Platforms
+
+=item Changes in existing support
+
+=back
+
+=item Modules and Pragmata
+
+=over 4
+
+=item New Modules
+
+B, Data::Dumper, Dumpvalue, Errno, File::Spec, ExtUtils::Installed,
+ExtUtils::Packlist, Fatal, IPC::SysV, Test, Tie::Array, Tie::Handle,
+Thread, attrs, fields, re
+
+=item Changes in existing modules
+
+Benchmark, Carp, CGI, Fcntl, Math::Complex, Math::Trig, POSIX, DB_File,
+MakeMaker, CPAN, Cwd
+
+=back
+
+=item Utility Changes
+
+=item Documentation Changes
+
+=item New Diagnostics
+
+Ambiguous call resolved as CORE::%s(), qualify as such or use &, Bad index
+while coercing array into hash, Bareword "%s" refers to nonexistent
+package, Can't call method "%s" on an undefined value, Can't check
+filesystem of script "%s" for nosuid, Can't coerce array into hash, Can't
+goto subroutine from an eval-string, Can't localize pseudo-hash element,
+Can't use %%! because Errno.pm is not available, Cannot find an opnumber
+for "%s", Character class syntax [. .] is reserved for future extensions,
+Character class syntax [: :] is reserved for future extensions, Character
+class syntax [= =] is reserved for future extensions, %s: Eval-group in
+insecure regular expression, %s: Eval-group not allowed, use re 'eval', %s:
+Eval-group not allowed at run time, Explicit blessing to '' (assuming
+package main), Illegal hex digit ignored, No such array field, No such
+field "%s" in variable %s of type %s, Out of memory during ridiculously
+large request, Range iterator outside integer range, Recursive inheritance
+detected while looking for method '%s' %s, Reference found where even-sized
+list expected, Undefined value assigned to typeglob, Use of reserved word
+"%s" is deprecated, perl: warning: Setting locale failed
+
+=item Obsolete Diagnostics
+
+Can't mktemp(), Can't write to temp file for B<-e>: %s, Cannot open
+temporary file, regexp too big
+
+=item Configuration Changes
+
+=item BUGS
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perl5004delta - what's new for perl5.004
+
+=over 4
+
+=item DESCRIPTION
+
+=item Supported Environments
+
+=item Core Changes
+
+=over 4
+
+=item List assignment to %ENV works
+
+=item Change to "Can't locate Foo.pm in @INC" error
+
+=item Compilation option: Binary compatibility with 5.003
+
+=item $PERL5OPT environment variable
+
+=item Limitations on B<-M>, B<-m>, and B<-T> options
+
+=item More precise warnings
+
+=item Deprecated: Inherited C<AUTOLOAD> for non-methods
+
+=item Previously deprecated %OVERLOAD is no longer usable
+
+=item Subroutine arguments created only when they're modified
+
+=item Group vector changeable with C<$)>
+
+=item Fixed parsing of $$<digit>, &$<digit>, etc.
+
+=item Fixed localization of $<digit>, $&, etc.
+
+=item No resetting of $. on implicit close
+
+=item C<wantarray> may return undef
+
+=item C<eval EXPR> determines value of EXPR in scalar context
+
+=item Changes to tainting checks
+
+No glob() or <*>, No spawning if tainted $CDPATH, $ENV, $BASH_ENV, No
+spawning if tainted $TERM doesn't look like a terminal name
+
+=item New Opcode module and revised Safe module
+
+=item Embedding improvements
+
+=item Internal change: FileHandle class based on IO::* classes
+
+=item Internal change: PerlIO abstraction interface
+
+=item New and changed syntax
+
+$coderef->(PARAMS)
+
+=item New and changed builtin constants
+
+__PACKAGE__
+
+=item New and changed builtin variables
+
+$^E, $^H, $^M
+
+=item New and changed builtin functions
+
+delete on slices, flock, printf and sprintf, keys as an lvalue, my() in
+Control Structures, pack() and unpack(), sysseek(), use VERSION, use Module
+VERSION LIST, prototype(FUNCTION), srand, $_ as Default, C<m//gc> does not
+reset search position on failure, C<m//x> ignores whitespace before ?*+{},
+nested C<sub{}> closures work now, formats work right on changing lexicals
+
+=item New builtin methods
+
+isa(CLASS), can(METHOD), VERSION( [NEED] )
+
+=item TIEHANDLE now supported
+
+TIEHANDLE classname, LIST, PRINT this, LIST, PRINTF this, LIST, READ this
+LIST, READLINE this, GETC this, DESTROY this
+
+=item Malloc enhancements
+
+-DPERL_EMERGENCY_SBRK, -DPACK_MALLOC, -DTWO_POT_OPTIMIZE
+
+=item Miscellaneous efficiency enhancements
+
+=back
+
+=item Support for More Operating Systems
+
+=over 4
+
+=item Win32
+
+=item Plan 9
+
+=item QNX
+
+=item AmigaOS
+
+=back
+
+=item Pragmata
+
+use autouse MODULE => qw(sub1 sub2 sub3), use blib, use blib 'dir', use
+constant NAME => VALUE, use locale, use ops, use vmsish
+
+=item Modules
+
+=over 4
+
+=item Required Updates
+
+=item Installation directories
+
+=item Module information summary
+
+=item Fcntl
+
+=item IO
+
+=item Math::Complex
+
+=item Math::Trig
+
+=item DB_File
+
+=item Net::Ping
+
+=item Object-oriented overrides for builtin operators
+
+=back
+
+=item Utility Changes
+
+=over 4
+
+=item pod2html
+
+Sends converted HTML to standard output
+
+=item xsubpp
+
+C<void> XSUBs now default to returning nothing
+
+=back
+
+=item C Language API Changes
+
+C<gv_fetchmethod> and C<perl_call_sv>, C<perl_eval_pv>, Extended API for
+manipulating hashes
+
+=item Documentation Changes
+
+L<perldelta>, L<perlfaq>, L<perllocale>, L<perltoot>, L<perlapio>,
+L<perlmodlib>, L<perldebug>, L<perlsec>
+
+=item New Diagnostics
+
+"my" variable %s masks earlier declaration in same scope, %s argument is
+not a HASH element or slice, Allocation too large: %lx, Allocation too
+large, Applying %s to %s will act on scalar(%s), Attempt to free
+nonexistent shared string, Attempt to use reference as lvalue in substr,
+Bareword "%s" refers to nonexistent package, Can't redefine active sort
+subroutine %s, Can't use bareword ("%s") as %s ref while "strict refs" in
+use, Cannot resolve method `%s' overloading `%s' in package `%s', Constant
+subroutine %s redefined, Constant subroutine %s undefined, Copy method did
+not return a reference, Died, Exiting pseudo-block via %s, Identifier too
+long, Illegal character %s (carriage return), Illegal switch in PERL5OPT:
+%s, Integer overflow in hex number, Integer overflow in octal number,
+internal error: glob failed, Invalid conversion in %s: "%s", Invalid type
+in pack: '%s', Invalid type in unpack: '%s', Name "%s::%s" used only once:
+possible typo, Null picture in formline, Offset outside string, Out of
+memory!, Out of memory during request for %s, panic: frexp, Possible
+attempt to put comments in qw() list, Possible attempt to separate words
+with commas, Scalar value @%s{%s} better written as $%s{%s}, Stub found
+while resolving method `%s' overloading `%s' in %s, Too late for "B<-T>"
+option, untie attempted while %d inner references still exist, Unrecognized
+character %s, Unsupported function fork, Use of "$$<digit>" to mean
+"${$}<digit>" is deprecated, Value of %s can be "0"; test with defined(),
+Variable "%s" may be unavailable, Variable "%s" will not stay shared,
+Warning: something's wrong, Ill-formed logical name |%s| in prime_env_iter,
+Got an error from DosAllocMem, Malformed PERLLIB_PREFIX, PERL_SH_DIR too
+long, Process terminated by SIG%s
+
+=item BUGS
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 perlartistic - the Perl Artistic License
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item The "Artistic License"
+
+=over 4
+
+=item Preamble
+
+=item Definitions
+
+"Package", "Standard Version", "Copyright Holder", "You", "Reasonable
+copying fee", "Freely Available"
+
+=item Conditions
+
+a), b), c), d), a), b), c), d)
+
+=back
+
+=back
+
+=head2 perlgpl - the GNU General Public License, version 2
+
+=over 4
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item GNU GENERAL PUBLIC LICENSE
+
+=back
+
+=head2 perlaix, README.aix - Perl version 5 on IBM Unix (AIX) systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Compiling Perl 5 on AIX
+
+=item OS level
+
+=item Building Dynamic Extensions on AIX
+
+=item The IBM ANSI C Compiler
+
+=item The usenm option
+
+=item Using GNU's gcc for building perl
+
+=item Using Large Files with Perl
+
+=item Threaded Perl
+
+=item 64-bit Perl
+
+=item AIX 4.2 and extensions using C++ with statics
+
+=back
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlamiga - Perl under Amiga OS
+
+=over 4
+
+=item NOTE
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Prerequisites for Compiling Perl on AmigaOS
+
+B<Unix emulation for AmigaOS: ixemul.library>, B<Version of Amiga OS>
+
+=item Starting Perl programs under AmigaOS
+
+=item Shortcomings of Perl under AmigaOS
+
+=back
+
+=item INSTALLATION
+
+=item Accessing documentation
+
+=over 4
+
+=item Manpages for Perl on AmigaOS
+
+=item Perl HTML Documentation on AmigaOS
+
+=item Perl GNU Info Files on AmigaOS
+
+=item Perl LaTeX Documentation on AmigaOS
+
+=back
+
+=item BUILDING PERL ON AMIGAOS
+
+=over 4
+
+=item Build Prerequisites for Perl on AmigaOS
+
+=item Getting the Perl Source for AmigaOS
+
+=item Making Perl on AmigaOS
+
+=item Testing Perl on AmigaOS
+
+=item Installing the built Perl on AmigaOS
+
+=back
+
+=item PERL 5.8.0 BROKEN IN AMIGAOS
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 perlapollo, README.apollo - Perl version 5 on Apollo DomainOS
+
+=over 4
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 perlbeos, README.beos - Perl version 5.8+ on BeOS
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUILD AND INSTALL
+
+=over 4
+
+=item Requirements
+
+=item Configure
+
+=item Build
+
+=item Install
+
+=back
+
+=item KNOWN PROBLEMS
+
+=item CONTACT
+
+=back
+
+=head2 perlbs2000, README.BS2000 - building and installing Perl for BS2000.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item gzip on BS2000
+
+=item bison on BS2000
+
+=item Unpacking Perl Distribution on BS2000
+
+=item Compiling Perl on BS2000
+
+=item Testing Perl on BS2000
+
+=item Installing Perl on BS2000
+
+=item Using Perl in the Posix-Shell of BS2000
+
+=item Using Perl in "native" BS2000
+
+=item Floating point anomalies on BS2000
+
+=item Using PerlIO and different encodings on ASCII and EBCDIC partitions
+
+=back
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=over 4
+
+=item Mailing list
+
+=back
+
+=item HISTORY
+
+=back
+
+=head2 perlce - Perl for WinCE
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUILD
+
+=over 4
+
+=item Tools & SDK
+
+Microsoft Embedded Visual Tools, Microsoft Visual C++, Rainer Keuchel's
+celib-sources, Rainer Keuchel's console-sources
+
+=item Make
+
+go to ./wince subdirectory, edit file compile.bat, run	  compile.bat, run 
+  compile.bat dist
+
+=back
+
+=item ACKNOWLEDGEMENTS
+
+=item AUTHORS
+
+=back
+
+=head2 perlcygwin, README.cygwin - Perl for Cygwin
+
+=over 4
+
+=item SYNOPSIS
+
+=item PREREQUISITES FOR COMPILING PERL ON CYGWIN
+
+=over 4
+
+=item Cygwin = GNU+Cygnus+Windows (Don't leave UNIX without it)
+
+=item Cygwin Configuration
+
+C<PATH>, I<nroff>, Permissions
+
+=back
+
+=item CONFIGURE PERL ON CYGWIN
+
+=over 4
+
+=item Stripping Perl Binaries on Cygwin
+
+=item Optional Libraries for Perl on Cygwin
+
+C<-lcrypt>, C<-lgdbm> (C<use GDBM_File>), C<-ldb> (C<use DB_File>),
+C<-lcygipc> (C<use IPC::SysV>), C<-lutil>
+
+=item Configure-time Options for Perl on Cygwin
+
+C<-Uusedl>, C<-Uusemymalloc>, C<-Uuseperlio>, C<-Dusemultiplicity>,
+C<-Duse64bitint>, C<-Duselongdouble>, C<-Dusethreads>, C<-Duselargefiles>,
+C<-Dmksymlinks>
+
+=item Suspicious Warnings on Cygwin
+
+I<dlsym()>, Win9x and C<d_eofnblk>, Compiler/Preprocessor defines
+
+=back
+
+=item MAKE ON CYGWIN
+
+=over 4
+
+=item Errors on Cygwin
+
+=item ld2 on Cygwin
+
+=back
+
+=item TEST ON CYGWIN
+
+=over 4
+
+=item File Permissions on Cygwin
+
+=item NDBM_File and ODBM_File do not work on FAT filesystems
+
+=item C<fork()> failures in io_* tests
+
+=back
+
+=item Specific features of the Cygwin port
+
+=over 4
+
+=item Script Portability on Cygwin
+
+Pathnames, Text/Binary, PerlIO, F<.exe>, cygwin vs. windows process ids,
+C<chown()>, Miscellaneous
+
+=item Prebuilt methods:
+
+C<Cwd::cwd>, C<Cygwin::pid_to_winpid>, C<Cygwin::winpid_to_pid>
+
+=back
+
+=item INSTALL PERL ON CYGWIN
+
+=item MANIFEST ON CYGWIN
+
+Documentation, Build, Configure, Make, Install, Tests, Compiled Perl
+Source, Compiled Module Source, Perl Modules/Scripts
+
+=item BUGS ON CYGWIN
+
+=item AUTHORS
+
+=item HISTORY
+
+=back
+
+=head2 perldgux - Perl under DG/UX.
+
+=over 4
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUILDING PERL ON DG/UX
+
+=over 4
+
+=item Non-threaded Perl on DG/UX
+
+=item Threaded Perl on DG/UX
+
+=item Testing Perl on DG/UX
+
+=item Installing the built perl on DG/UX
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perldos - Perl under DOS, W31, W95.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Prerequisites for Compiling Perl on DOS
+
+DJGPP, Pthreads
+
+=item Shortcomings of Perl under DOS
+
+=item Building Perl on DOS
+
+=item Testing Perl on DOS
+
+=item Installation of Perl on DOS
+
+=back
+
+=item BUILDING AND INSTALLING MODULES ON DOS
+
+=over 4
+
+=item Building Prerequisites for Perl on DOS
+
+=item Unpacking CPAN Modules on DOS
+
+=item Building Non-XS Modules on DOS
+
+=item Building XS Modules on DOS
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlepoc, README.epoc - Perl for EPOC
+
+=over 4
+
+=item SYNOPSIS
+
+=item INTRODUCTION
+
+=item INSTALLING PERL ON EPOC
+
+=item STARTING PERL ON EPOC
+
+=over 4
+
+=item Editors on Epoc
+
+=item Features of Perl on Epoc
+
+=item Restrictions of Perl on Epoc
+
+=item Compiling Perl 5 on the EPOC cross compiling environment
+
+=back
+
+=item SUPPORT STATUS OF PERL ON EPOC
+
+=item AUTHOR
+
+=item LAST UPDATE
+
+=back
+
+=head2 perlfreebsd, README.freebsd - Perl version 5 on FreeBSD systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item FreeBSD core dumps from readdir_r with ithreads
+
+=item $^X doesn't always contain a full path in FreeBSD
+
+=item Perl will no longer be part of "base FreeBSD"
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlhpux, README.hpux - Perl version 5 on Hewlett-Packard Unix
+(HP-UX) systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Using perl as shipped with HP-UX
+
+=item Using perl from HP's porting centre
+
+=item Compiling Perl 5 on HP-UX
+
+=item PA-RISC
+
+=item Portability Between PA-RISC Versions
+
+=item PA-RISC 1.0
+
+=item PA-RISC 1.1
+
+=item PA-RISC 2.0
+
+=item Itanium Processor Family and HP-UX
+
+=item Itanium & Itanium 2
+
+=item Building Dynamic Extensions on HP-UX
+
+=item The HP ANSI C Compiler
+
+=item The GNU C Compiler
+
+=item Using Large Files with Perl on HP-UX
+
+=item Threaded Perl on HP-UX
+
+=item 64-bit Perl on HP-UX
+
+=item Oracle on HP-UX
+
+=item GDBM and Threads on HP-UX
+
+=item NFS filesystems and utime(2) on HP-UX
+
+=item perl -P and // and HP-UX
+
+=item HP-UX Kernel Parameters (maxdsiz) for Compiling Perl
+
+=back
+
+=item nss_delete core dump from op/pwent or op/grent
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlhurd, README.hurd - Perl version 5 on Hurd
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Known Problems with Perl on Hurd 
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlirix, README.irix - Perl version 5 on Irix systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Building 32-bit Perl in Irix
+
+=item Building 64-bit Perl in Irix
+
+=item About Compiler Versions of Irix
+
+=item Linker Problems in Irix
+
+=item Malloc in Irix
+
+=item Building with threads in Irix
+
+=item Irix 5.3
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perllinux, README.linux - Perl version 5 on Linux systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Experimental Support for Sun Studio Compilers for Linux OS
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlmachten, README.machten - Perl version 5 on Power MachTen
+systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Perl version 5.8.x and greater not supported
+
+=item Compiling Perl 5.6.x on MachTen
+
+=item Failures during C<make test> on MachTen
+
+op/lexassign.t, pragma/warnings.t
+
+=item Building external modules on MachTen
+
+=back
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlmacos, README.macos - Perl under Mac OS (Classic)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlmacosx, README.macosx - Perl under Mac OS X
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Installation Prefix
+
+=item libperl and Prebinding
+
+=item Updating Apple-supplied Perl
+
+=item 64-bit Perl
+
+=item Intel processor support
+
+=item  Universal binaries
+
+=item Known problems
+
+=item MacPerl
+
+=item Carbon
+
+=item Cocoa
+
+=back
+
+=item Starting From Scratch
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 perlmint, README.mint - Perl version 5 on Atari MiNT
+
+=over 4
+
+=item DESCRIPTION
+
+=item Known problems with Perl on MiNT
+
+=item AUTHOR
+
+=back
+
+=head2 perlmpeix, README.mpeix - Perl/iX for HP e3000 MPE
+
+=over 4
+
+=item SYNOPSIS
+
+=item NOTE
+
+=item Binary distribution from HP
+
+=item What's New in Perl for MPE/iX
+
+=item Welcome to Perl/iX
+
+=item System Requirements for Perl/iX
+
+=item How to Obtain Perl/iX
+
+=item Perl/iX Distribution Contents Highlights
+
+README, INSTALL, LIBSHP3K, PERL, .cpan/, lib/, man/,
+public_html/feedback.cgi, src/perl-5.6.0-mpe
+
+=item How to Compile Perl/iX
+
+ 4,  6
+
+=item Getting Started with Perl/iX
+
+=item MPE/iX Implementation Considerations
+
+=item Known Perl/iX Bugs Under Investigation
+
+=item Perl/iX To-Do List
+
+=item Perl/iX Change History
+
+=item AUTHOR
+
+=back
+
+=head2 perlnetware - Perl for NetWare
+
+=over 4
+
+=item DESCRIPTION
+
+=item BUILD
+
+=over 4
+
+=item Tools & SDK
+
+=item Setup
+
+SetNWBld.bat, Buildtype.bat
+
+=item Make
+
+=item Interpreter
+
+=item Extensions
+
+=back
+
+=item INSTALL
+
+=item BUILD NEW EXTENSIONS
+
+=item ACKNOWLEDGEMENTS
+
+=item AUTHORS
+
+=item DATE
+
+=back
+
+=head2 perlopenbsd, README.openbsd - Perl version 5 on OpenBSD systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item OpenBSD core dumps from getprotobyname_r and getservbyname_r with
+ithreads
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT.
+
+=over 4
+
+=item SYNOPSIS
+
+=back
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Target
+
+=item Other OSes
+
+=item Prerequisites
+
+EMX, RSX, HPFS, pdksh
+
+=item Starting Perl programs under OS/2 (and DOS and...)
+
+=item Starting OS/2 (and DOS) programs under Perl
+
+=back
+
+=item Frequently asked questions
+
+=over 4
+
+=item "It does not work"
+
+=item I cannot run external programs
+
+=item I cannot embed perl into my program, or use F<perl.dll> from my
+program. 
+
+Is your program EMX-compiled with C<-Zmt -Zcrtdll>?, Did you use
+L<ExtUtils::Embed>?
+
+=item C<``> and pipe-C<open> do not work under DOS.
+
+=item Cannot start C<find.exe "pattern" file>
+
+=back
+
+=item INSTALLATION
+
+=over 4
+
+=item Automatic binary installation
+
+C<PERL_BADLANG>, C<PERL_BADFREE>, F<Config.pm>
+
+=item Manual binary installation
+
+Perl VIO and PM executables (dynamically linked), Perl_ VIO executable
+(statically linked), Executables for Perl utilities, Main Perl library,
+Additional Perl modules, Tools to compile Perl modules, Manpages for Perl
+and utilities, Manpages for Perl modules, Source for Perl documentation,
+Perl manual in F<.INF> format, Pdksh
+
+=item B<Warning>
+
+=back
+
+=item Accessing documentation
+
+=over 4
+
+=item OS/2 F<.INF> file
+
+=item Plain text
+
+=item Manpages
+
+=item HTML
+
+=item GNU C<info> files
+
+=item F<PDF> files
+
+=item C<LaTeX> docs
+
+=back
+
+=item BUILD
+
+=over 4
+
+=item The short story
+
+=item Prerequisites
+
+=item Getting perl source
+
+=item Application of the patches
+
+=item Hand-editing
+
+=item Making
+
+=item Testing
+
+A lot of C<bad free>, Process terminated by SIGTERM/SIGINT, F<op/fs.t>,
+F<op/stat.t>
+
+=item Installing the built perl
+
+=item C<a.out>-style build
+
+=back
+
+=item Building a binary distribution
+
+=item Building custom F<.EXE> files
+
+=over 4
+
+=item Making executables with a custom collection of statically loaded
+extensions
+
+=item Making executables with a custom search-paths
+
+=back
+
+=item Build FAQ
+
+=over 4
+
+=item Some C</> became C<\> in pdksh.
+
+=item C<'errno'> - unresolved external
+
+=item Problems with tr or sed
+
+=item Some problem (forget which ;-)
+
+=item Library ... not found
+
+=item Segfault in make
+
+=item op/sprintf test failure
+
+=back
+
+=item Specific (mis)features of OS/2 port
+
+=over 4
+
+=item C<setpriority>, C<getpriority>
+
+=item C<system()>
+
+=item C<extproc> on the first line
+
+=item Additional modules:
+
+=item Prebuilt methods:
+
+C<File::Copy::syscopy>, C<DynaLoader::mod2fname>,  C<Cwd::current_drive()>,
+ C<Cwd::sys_chdir(name)>,  C<Cwd::change_drive(name)>, 
+C<Cwd::sys_is_absolute(name)>,	C<Cwd::sys_is_rooted(name)>, 
+C<Cwd::sys_is_relative(name)>,	C<Cwd::sys_cwd(name)>, 
+C<Cwd::sys_abspath(name, dir)>,  C<Cwd::extLibpath([type])>, 
+C<Cwd::extLibpath_set( path [, type ] )>,
+C<OS2::Error(do_harderror,do_exception)>, C<OS2::Errors2Drive(drive)>,
+OS2::SysInfo(), OS2::BootDrive(), C<OS2::MorphPM(serve)>,
+C<OS2::UnMorphPM(serve)>, C<OS2::Serve_Messages(force)>,
+C<OS2::Process_Messages(force [, cnt])>, C<OS2::_control87(new,mask)>,
+OS2::get_control87(), C<OS2::set_control87_em(new=MCW_EM,mask=MCW_EM)>,
+C<OS2::DLLname([how [, \&xsub]])>
+
+=item Prebuilt variables:
+
+$OS2::emx_rev, $OS2::emx_env, $OS2::os_ver, $OS2::is_aout, $OS2::can_fork,
+$OS2::nsyserror
+
+=item Misfeatures
+
+=item Modifications
+
+C<popen>, C<tmpnam>, C<tmpfile>, C<ctermid>, C<stat>, C<mkdir>, C<rmdir>,
+C<flock>
+
+=item Identifying DLLs
+
+=item Centralized management of resources
+
+C<HAB>, C<HMQ>, Treating errors reported by OS/2 API,
+C<CheckOSError(expr)>, C<CheckWinError(expr)>, C<SaveWinError(expr)>,
+C<SaveCroakWinError(expr,die,name1,name2)>, C<WinError_2_Perl_rc>,
+C<FillWinError>, C<FillOSError(rc)>, Loading DLLs and ordinals in DLLs
+
+=back
+
+=item Perl flavors
+
+=over 4
+
+=item F<perl.exe>
+
+=item F<perl_.exe>
+
+=item F<perl__.exe>
+
+=item F<perl___.exe>
+
+=item Why strange names?
+
+=item Why dynamic linking?
+
+=item Why chimera build?
+
+=back
+
+=item ENVIRONMENT
+
+=over 4
+
+=item C<PERLLIB_PREFIX>
+
+=item C<PERL_BADLANG>
+
+=item C<PERL_BADFREE>
+
+=item C<PERL_SH_DIR>
+
+=item C<USE_PERL_FLOCK>
+
+=item C<TMP> or C<TEMP>
+
+=back
+
+=item Evolution
+
+=over 4
+
+=item Text-mode filehandles
+
+=item Priorities
+
+=item DLL name mangling: pre 5.6.2
+
+=item DLL name mangling: 5.6.2 and beyond
+
+Global DLLs, specific DLLs, C<BEGINLIBPATH> and C<ENDLIBPATH>, F<.> from
+C<LIBPATH>
+
+=item DLL forwarder generation
+
+=item Threading
+
+=item Calls to external programs
+
+=item Memory allocation
+
+=item Threads
+
+C<COND_WAIT>, F<os2.c>
+
+=back
+
+=item BUGS
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 perlos390, README.os390 - building and installing Perl for OS/390
+and z/OS
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Tools
+
+=item Unpacking Perl distribution on OS/390
+
+=item Setup and utilities for Perl on OS/390
+
+=item Configure Perl on OS/390
+
+=item Build, Test, Install Perl on OS/390
+
+=item Build Anomalies with Perl on OS/390
+
+=item Testing Anomalies with Perl on OS/390
+
+=item Installation Anomalies with Perl on OS/390
+
+=item Usage Hints for Perl on OS/390
+
+=item Floating Point Anomalies with Perl on OS/390
+
+=item Modules and Extensions for Perl on OS/390
+
+=back
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=over 4
+
+=item Mailing list for Perl on OS/390
+
+=back
+
+=item HISTORY
+
+=back
+
+=head2 perlos400, README.os400 - Perl version 5 on OS/400
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Compiling Perl for OS/400 PASE
+
+=item Installing Perl in OS/400 PASE
+
+=item Using Perl in OS/400 PASE
+
+=item Known Problems
+
+=item Perl on ILE
+
+=back
+
+=item AUTHORS
+
+=back
+
+=head2 perlplan9 - Plan 9-specific documentation for Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Invoking Perl
+
+=item What's in Plan 9 Perl
+
+=item What's not in Plan 9 Perl
+
+=item Perl5 Functions not currently supported in Plan 9 Perl
+
+=item Signals in Plan 9 Perl
+
+=back
+
+=item COMPILING AND INSTALLING PERL ON PLAN 9
+
+=over 4
+
+=item Installing Perl Documentation on Plan 9
+
+=back
+
+=item BUGS
+
+=item Revision date
+
+=item AUTHOR
+
+=back
+
+=head2 perlqnx, README.qnx - Perl version 5 on QNX
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Required Software for Compiling Perl on QNX4
+
+/bin/sh, ar, nm, cpp, make
+
+=item Outstanding Issues with Perl on QNX4
+
+=item QNX auxiliary files
+
+qnx/ar, qnx/cpp
+
+=item Outstanding issues with perl under QNX6
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 perlsolaris, README.solaris - Perl version 5 on Solaris systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Solaris Version Numbers.
+
+=back
+
+=item RESOURCES
+
+Solaris FAQ, Precompiled Binaries, Solaris Documentation
+
+=item SETTING UP
+
+=over 4
+
+=item File Extraction Problems on Solaris.
+
+=item Compiler and Related Tools on Solaris.
+
+=item Environment for Compiling perl on Solaris
+
+=back
+
+=item RUN CONFIGURE.
+
+=over 4
+
+=item 64-bit perl on Solaris.
+
+=item Threads in perl on Solaris.
+
+=item Malloc Issues with perl on Solaris.
+
+=back
+
+=item MAKE PROBLEMS.
+
+Dynamic Loading Problems With GNU as and GNU ld, ld.so.1: ./perl: fatal:
+relocation error:, dlopen: stub interception failed, #error "No
+DATAMODEL_NATIVE specified", sh: ar: not found, warning: dead part of
+constant expression is nonconstant
+
+=item MAKE TEST
+
+=over 4
+
+=item op/stat.t test 4 in Solaris
+
+=item nss_delete core dump from op/pwent or op/grent
+
+=back
+
+=item PREBUILT BINARIES OF PERL FOR SOLARIS.
+
+=item RUNTIME ISSUES FOR PERL ON SOLARIS.
+
+=over 4
+
+=item Limits on Numbers of Open Files on Solaris.
+
+=back
+
+=item SOLARIS-SPECIFIC MODULES.
+
+=item SOLARIS-SPECIFIC PROBLEMS WITH MODULES.
+
+=over 4
+
+=item Proc::ProcessTable on Solaris
+
+=item BSD::Resource on Solaris
+
+=item Net::SSLeay on Solaris
+
+=back
+
+=item SunOS 4.x
+
+=item AUTHOR
+
+=back
+
+=head2 perltru64, README.tru64 - Perl version 5 on Tru64 (formerly known as
+Digital UNIX formerly known as DEC OSF/1) systems
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Compiling Perl 5 on Tru64
+
+=item Using Large Files with Perl on Tru64
+
+=item Threaded Perl on Tru64
+
+=item Long Doubles on Tru64
+
+=item DB_File tests failing on Tru64
+
+=item 64-bit Perl on Tru64
+
+=item Warnings about floating-point overflow when compiling Perl on Tru64
+
+=back
+
+=item Testing Perl on Tru64
+
+=item ext/ODBM_File/odbm Test Failing With Static Builds
+
+=item Perl Fails Because Of Unresolved Symbol sockatmark
+
+=item AUTHOR
+
+=back
+
+=head2 perluts - Perl under UTS
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUILDING PERL ON UTS
+
+=item Installing the built perl on UTS
+
+=item AUTHOR
+
+=back
+
+=head2 perlvmesa, README.vmesa - building and installing Perl for VM/ESA.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Unpacking Perl Distribution on VM/ESA
+
+=item Setup Perl and utilities on VM/ESA
+
+=item Configure Perl on VM/ESA
+
+=item Testing Anomalies of Perl on VM/ESA
+
+=item Usage Hints for Perl on VM/ESA
+
+=back
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=over 4
+
+=item Mailing list for Perl on VM/ESA
+
+=back
+
+=back
+
+=head2 perlvms - VMS-specific documentation for Perl
+
+=over 4
+
+=item DESCRIPTION
+
+=item Installation
+
+=item Organization of Perl Images
+
+=over 4
+
+=item Core Images
+
+=item Perl Extensions
+
+=item Installing static extensions
+
+=item Installing dynamic extensions
+
+=back
+
+=item File specifications
+
+=over 4
+
+=item Syntax
+
+=item Wildcard expansion
+
+=item Pipes
+
+=back
+
+=item PERL5LIB and PERLLIB
+
+=item Command line
+
+=over 4
+
+=item I/O redirection and backgrounding
+
+=item Command line switches
+
+-i, -S, -u
+
+=back
+
+=item Perl functions
+
+File tests, backticks, binmode FILEHANDLE, crypt PLAINTEXT, USER, dump,
+exec LIST, fork, getpwent, getpwnam, getpwuid, gmtime, kill, qx//, select
+(system call), stat EXPR, system LIST, time, times, unlink LIST, utime
+LIST, waitpid PID,FLAGS
+
+=item Perl variables
+
+%ENV, CRTL_ENV, CLISYM_[LOCAL], Any other string, $!, $^E, $?, $|
+
+=item Standard modules with VMS-specific differences
+
+=over 4
+
+=item SDBM_File
+
+=back
+
+=item Revision date
+
+=item AUTHOR
+
+=back
+
+=head2 perlvos, README.vos - Perl for Stratus VOS
+
+=over 4
+
+=item SYNOPSIS
+
+=over 4
+
+=item Multiple methods to build perl for VOS
+
+=item Stratus POSIX Support
+
+=back
+
+=item INSTALLING PERL IN VOS
+
+=over 4
+
+=item Compiling Perl 5 on VOS
+
+=item Installing Perl 5 on VOS
+
+=back
+
+=item USING PERL IN VOS
+
+=over 4
+
+=item Unimplemented Features of Perl on VOS
+
+=item Restrictions of Perl on VOS
+
+=item Handling of underflow and overflow
+
+=back
+
+=item TEST STATUS
+
+=item SUPPORT STATUS
+
+=item AUTHOR
+
+=item LAST UPDATE
+
+=back
+
+=head2 perlwin32 - Perl under Windows
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Setting Up Perl on Win32
+
+Make, Command Shell, Borland C++, Microsoft Visual C++, Microsoft Visual
+C++ Toolkit 2003, Microsoft Platform SDK 64-bit Compiler, MinGW release 3
+with gcc, MinGW release 1 with gcc
+
+=item Building
+
+=item Testing Perl on Win32
+
+=item Installation of Perl on Win32
+
+=item Usage Hints for Perl on Win32
+
+Environment Variables, File Globbing, Using perl from the command line,
+Building Extensions, Command-line Wildcard Expansion, Win32 Specific
+Extensions, Notes on 64-bit Windows
+
+=item Running Perl Scripts
+
+=item Miscellaneous Things
+
+=back
+
+=item BUGS AND CAVEATS
+
+=item ACKNOWLEDGEMENTS
+
+=item AUTHORS
+
+Gary Ng E<lt>71564.1743@CompuServe.COME<gt>, Gurusamy Sarathy
+E<lt>gsar@activestate.comE<gt>, Nick Ing-Simmons
+E<lt>nick@ing-simmons.netE<gt>, Jan Dubois E<lt>jand@activestate.comE<gt>,
+Steve Hay E<lt>steve.hay@uk.radan.comE<gt>
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head1 PRAGMA DOCUMENTATION
+
+=head2 attrs - set/get attributes of a subroutine (deprecated)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+method, locked
+
+=back
+
+=head2 re - Perl pragma to alter regular expression behaviour
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 threadshared::shared, threads::shared - Perl extension for sharing
+data structures between threads
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPORT
+
+=item FUNCTIONS
+
+share VARIABLE, lock VARIABLE, cond_wait VARIABLE, cond_wait CONDVAR,
+LOCKVAR, cond_timedwait VARIABLE, ABS_TIMEOUT, cond_timedwait CONDVAR,
+ABS_TIMEOUT, LOCKVAR, cond_signal VARIABLE, cond_broadcast VARIABLE
+
+=item NOTES
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 threads - Perl extension allowing use of interpreter based threads
+from perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$thread = threads->create(function, LIST), $thread->join, $thread->detach,
+threads->self, $thread->tid, threads->object( tid ), threads->yield();,
+threads->list();, async BLOCK;
+
+=item WARNINGS
+
+A thread exited while %d other threads were still running
+
+=item TODO
+
+=item BUGS
+
+Parent-Child threads, tid is I32, Returning objects, Creating threads
+inside BEGIN blocks, PERL_OLD_SIGNALS are not threadsafe, will not be
+
+=item AUTHOR and COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 attributes - get/set subroutine or variable attributes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Built-in Attributes
+
+locked, method, lvalue
+
+=item Available Subroutines
+
+get, reftype
+
+=item Package-specific Attribute Handling
+
+FETCH_I<type>_ATTRIBUTES, MODIFY_I<type>_ATTRIBUTES
+
+=item Syntax of Attribute Lists
+
+=back
+
+=item EXPORTS
+
+=over 4
+
+=item Default exports
+
+=item Available exports
+
+=item Export tags defined
+
+=back
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=back
+
+=head2 autouse - postpone load of modules until a function is used
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item WARNING
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 base - Establish IS-A relationship with base classes at compile time
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+Base class package "%s" is empty
+
+=item HISTORY
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=back
+
+=head2 bigint - Transparent BigInteger support for Perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Options
+
+a or accuracy, p or precision, t or trace, l or lib, v or version
+
+=item Math Library
+
+=item Internal Format
+
+=item Sign
+
+=item Methods
+
+=item Caveat
+
+=back
+
+=item MODULES USED
+
+=item EXAMPLES
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 bignum - Transparent BigNumber support for Perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Options
+
+a or accuracy, p or precision, t or trace, l or lib, v or version
+
+=item Methods
+
+=item Caveat
+
+inf(), NaN(), upgrade()
+
+=item MATH LIBRARY
+
+=item INTERNAL FORMAT
+
+=item SIGN
+
+=back
+
+=item MODULES USED
+
+=item EXAMPLES
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 bigrat - Transparent BigNumber/BigRational support for Perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Modules Used
+
+=item Math Library
+
+=item Sign
+
+=item Methods
+
+=item Cavaet
+
+=item Options
+
+a or accuracy, p or precision, t or trace, l or lib, v or version
+
+=back
+
+=item EXAMPLES
+
+	perl -Mbigrat -le 'print sqrt(33)'
+	perl -Mbigrat -le 'print 2*255'
+	perl -Mbigrat -le 'print 4.5+2*255'
+	perl -Mbigrat -le 'print 3/7 + 5/7 + 8/3'	
+	perl -Mbigrat -le 'print 12->is_odd()';
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 blib - Use MakeMaker's uninstalled version of a package
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 bytes - Perl pragma to force byte semantics rather than character
+semantics
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item LIMITATIONS
+
+=item SEE ALSO
+
+=back
+
+=head2 charnames - define character names for C<\N{named}> string literal
+escapes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CUSTOM TRANSLATORS
+
+=item CUSTOM ALIASES
+
+=over 4
+
+=item Anonymous hashes
+
+=item Alias file
+
+=item Alias shortcut
+
+=back
+
+=item charnames::viacode(code)
+
+=item charnames::vianame(name)
+
+=item ALIASES
+
+=item ILLEGAL CHARACTERS
+
+=item BUGS
+
+=back
+
+=head2 constant - Perl pragma to declare constants
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=over 4
+
+=item List constants
+
+=item Defining multiple constants at once
+
+=item Magic constants
+
+=back
+
+=item TECHNICAL NOTES
+
+=item BUGS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 diagnostics, splain - produce verbose warning diagnostics
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item The C<diagnostics> Pragma
+
+=item The I<splain> Program
+
+=back
+
+=item EXAMPLES
+
+=item INTERNALS
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 encoding - allows you to write your script in non-ascii or non-utf8
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=over 4
+
+=item Literal Conversions
+
+=item PerlIO layers for C<STD(IN|OUT)>
+
+=item Implicit upgrading for byte strings
+
+=back
+
+=item FEATURES THAT REQUIRE 5.8.1
+
+"NON-EUC" doublebyte encodings, tr//, DATA pseudo-filehandle
+
+=item USAGE
+
+use encoding [I<ENCNAME>] ;, use encoding I<ENCNAME> [ STDIN =E<gt>
+I<ENCNAME_IN> ...] ;, use encoding I<ENCNAME> Filter=E<gt>1;, no encoding;
+
+=item The Filter Option
+
+=over 4
+
+=item Filter-related changes at Encode version 1.87
+
+=back
+
+=item CAVEATS
+
+=over 4
+
+=item NOT SCOPED
+
+=item DO NOT MIX MULTIPLE ENCODINGS
+
+=item tr/// with ranges
+
+Legend of characters above
+
+=back
+
+=item EXAMPLE - Greekperl
+
+=item KNOWN PROBLEMS
+
+literals in regex that are longer than 127 bytes, EBCDIC, format
+
+=over 4
+
+=item The Logic of :locale
+
+=back
+
+=item HISTORY
+
+=item SEE ALSO
+
+=back
+
+=head2 fields - compile-time class fields
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+new, phash
+
+=item SEE ALSO
+
+=back
+
+=head2 filetest - Perl pragma to control the filetest permission operators
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item subpragma access
+
+=back
+
+=back
+
+=head2 if - C<use> a Perl module if a condition holds
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 integer - Perl pragma to use integer arithmetic instead of floating
+point
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 less - perl pragma to request less of something from the compiler
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 lib - manipulate @INC at compile time
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Adding directories to @INC
+
+=item Deleting directories from @INC
+
+=item Restoring original @INC
+
+=back
+
+=item CAVEATS
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 locale - Perl pragma to use and avoid POSIX locales for built-in
+operations
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 open - perl pragma to set default PerlIO layers for input and output
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NONPERLIO FUNCTIONALITY
+
+=item IMPLEMENTATION DETAILS
+
+=item SEE ALSO
+
+=back
+
+=head2 ops - Perl pragma to restrict unsafe operations when compiling
+
+=over 4
+
+=item SYNOPSIS	
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 overload - Package for overloading Perl operations
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Declaration of overloaded functions
+
+=item Calling Conventions for Binary Operations
+
+FALSE, TRUE, C<undef>
+
+=item Calling Conventions for Unary Operations
+
+=item Calling Conventions for Mutators
+
+C<++> and C<-->, C<x=> and other assignment versions
+
+=item Overloadable Operations
+
+I<Arithmetic operations>, I<Comparison operations>, I<Bit operations>,
+I<Increment and decrement>, I<Transcendental functions>, I<Boolean, string
+and numeric conversion>, I<Iteration>, I<Dereferencing>, I<Special>
+
+=item Inheritance and overloading
+
+Strings as values of C<use overload> directive, Overloading of an operation
+is inherited by derived classes
+
+=back
+
+=item SPECIAL SYMBOLS FOR C<use overload>
+
+=over 4
+
+=item Last Resort
+
+=item Fallback
+
+C<undef>, TRUE, defined, but FALSE
+
+=item Copy Constructor
+
+B<Example>
+
+=back
+
+=item MAGIC AUTOGENERATION
+
+I<Assignment forms of arithmetic operations>, I<Conversion operations>,
+I<Increment and decrement>, C<abs($a)>, I<Unary minus>, I<Negation>,
+I<Concatenation>, I<Comparison operations>, I<Iterator>, I<Dereferencing>,
+I<Copy operator>
+
+=item Losing overloading
+
+=item Run-time Overloading
+
+=item Public functions
+
+overload::StrVal(arg), overload::Overloaded(arg), overload::Method(obj,op)
+
+=item Overloading constants
+
+integer, float, binary, q, qr
+
+=item IMPLEMENTATION
+
+=item Metaphor clash
+
+=item Cookbook
+
+=over 4
+
+=item Two-face scalars
+
+=item Two-face references
+
+=item Symbolic calculator
+
+=item I<Really> symbolic calculator
+
+=back
+
+=item AUTHOR
+
+=item DIAGNOSTICS
+
+Odd number of arguments for overload::constant, `%s' is not an overloadable
+type, `%s' is not a code reference
+
+=item BUGS
+
+=back
+
+=head2 sigtrap - Perl pragma to enable simple signal handling
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+=over 4
+
+=item SIGNAL HANDLERS
+
+B<stack-trace>, B<die>, B<handler> I<your-handler>
+
+=item SIGNAL LISTS
+
+B<normal-signals>, B<error-signals>, B<old-interface-signals>
+
+=item OTHER
+
+B<untrapped>, B<any>, I<signal>, I<number>
+
+=back
+
+=item EXAMPLES
+
+=back
+
+=head2 sort - perl pragma to control sort() behaviour
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEATS
+
+=back
+
+=head2 strict - Perl pragma to restrict unsafe constructs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<strict refs>, C<strict vars>, C<strict subs>
+
+=item HISTORY
+
+=back
+
+=head2 subs - Perl pragma to predeclare sub names
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 threadshared, threads::shared - Perl extension for sharing data
+structures between threads
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPORT
+
+=item FUNCTIONS
+
+share VARIABLE, lock VARIABLE, cond_wait VARIABLE, cond_wait CONDVAR,
+LOCKVAR, cond_timedwait VARIABLE, ABS_TIMEOUT, cond_timedwait CONDVAR,
+ABS_TIMEOUT, LOCKVAR, cond_signal VARIABLE, cond_broadcast VARIABLE
+
+=item NOTES
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 utf8 - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) in source
+code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Utility functions
+
+$num_octets = utf8::upgrade($string), $success = utf8::downgrade($string[,
+FAIL_OK]), utf8::encode($string), utf8::decode($string), $flag =
+utf8::is_utf8(STRING), $flag = utf8::valid(STRING)
+
+=back
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 vars - Perl pragma to predeclare global variable names (obsolete)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 vmsish - Perl pragma to control VMS-specific language features
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<vmsish status>, C<vmsish exit>, C<vmsish time>, C<vmsish hushed>
+
+=back
+
+=head2 warnings - Perl pragma to control optional warnings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+use warnings::register, warnings::enabled(), warnings::enabled($category),
+warnings::enabled($object), warnings::warn($message),
+warnings::warn($category, $message), warnings::warn($object, $message),
+warnings::warnif($message), warnings::warnif($category, $message),
+warnings::warnif($object, $message)
+
+=back
+
+=head2 warnings::register - warnings import function
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head1 MODULE DOCUMENTATION
+
+=head2 AnyDBM_File - provide framework for multiple DBMs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item DBM Comparisons
+
+[0], [1], [2], [3]
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Attribute::Handlers - Simpler definition of attribute handlers
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+[0], [1], [2], [3], [4], [5]
+
+=over 4
+
+=item Typed lexicals
+
+=item Type-specific attribute handlers
+
+=item Non-interpretive attribute handlers
+
+=item Phase-specific attribute handlers
+
+=item Attributes as C<tie> interfaces
+
+=back
+
+=item EXAMPLES
+
+=item DIAGNOSTICS
+
+C<Bad attribute type: ATTR(%s)>, C<Attribute handler %s doesn't handle %s
+attributes>, C<Declaration of %s attribute in package %s may clash with
+future reserved word>, C<Can't have two ATTR specifiers on one subroutine>,
+C<Can't autotie a %s>, C<Internal error: %s symbol went missing>, C<Won't
+be able to apply END handler>
+
+=item AUTHOR
+
+=item BUGS
+
+=item COPYRIGHT
+
+=back
+
+=head2 AutoLoader - load subroutines only on demand
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Subroutine Stubs
+
+=item Using B<AutoLoader>'s AUTOLOAD Subroutine
+
+=item Overriding B<AutoLoader>'s AUTOLOAD Subroutine
+
+=item Package Lexicals
+
+=item Not Using AutoLoader
+
+=item B<AutoLoader> vs. B<SelfLoader>
+
+=back
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=back
+
+=head2 AutoSplit - split a package for autoloading
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$keep, $check, $modtime
+
+=over 4
+
+=item Multiple packages
+
+=back
+
+=item DIAGNOSTICS
+
+=back
+
+=head2 B - The Perl Compiler
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OVERVIEW
+
+=item Utility Functions
+
+=over 4
+
+=item Functions Returning C<B::SV>, C<B::AV>, C<B::HV>, and C<B::CV>
+objects
+
+sv_undef, sv_yes, sv_no, svref_2object(SVREF), amagic_generation, init_av,
+check_av, begin_av, end_av, comppadlist, regex_padav, main_cv
+
+=item Functions for Examining the Symbol Table
+
+walksymtable(SYMREF, METHOD, RECURSE, PREFIX)
+
+=item Functions Returning C<B::OP> objects or for walking op trees
+
+main_root, main_start, walkoptree(OP, METHOD), walkoptree_debug(DEBUG)
+
+=item Miscellaneous Utility Functions
+
+ppname(OPNUM), hash(STR), cast_I32(I), minus_c, cstring(STR),
+perlstring(STR), class(OBJ), threadsv_names
+
+=back
+
+=item OVERVIEW OF CLASSES
+
+=over 4
+
+=item SV-RELATED CLASSES
+
+=item B::SV Methods
+
+REFCNT, FLAGS, object_2svref
+
+=item B::IV Methods
+
+IV, IVX, UVX, int_value, needs64bits, packiv
+
+=item B::NV Methods
+
+NV, NVX
+
+=item B::RV Methods
+
+RV
+
+=item B::PV Methods
+
+PV, RV, PVX
+
+=item B::PVMG Methods
+
+MAGIC, SvSTASH
+
+=item B::MAGIC Methods
+
+MOREMAGIC, precomp, PRIVATE, TYPE, FLAGS, OBJ, PTR, REGEX
+
+=item B::PVLV Methods
+
+TARGOFF, TARGLEN, TYPE, TARG
+
+=item B::BM Methods
+
+USEFUL, PREVIOUS, RARE, TABLE
+
+=item B::GV Methods
+
+is_empty, NAME, SAFENAME, STASH, SV, IO, FORM, AV, HV, EGV, CV, CVGEN,
+LINE, FILE, FILEGV, GvREFCNT, FLAGS
+
+=item B::IO Methods
+
+LINES, PAGE, PAGE_LEN, LINES_LEFT, TOP_NAME, TOP_GV, FMT_NAME, FMT_GV,
+BOTTOM_NAME, BOTTOM_GV, SUBPROCESS, IoTYPE, IoFLAGS, IsSTD
+
+=item B::AV Methods
+
+FILL, MAX, OFF, ARRAY, ARRAYelt, AvFLAGS
+
+=item B::CV Methods
+
+STASH, START, ROOT, GV, FILE, DEPTH, PADLIST, OUTSIDE, OUTSIDE_SEQ, XSUB,
+XSUBANY, CvFLAGS, const_sv
+
+=item B::HV Methods
+
+FILL, MAX, KEYS, RITER, NAME, PMROOT, ARRAY
+
+=item OP-RELATED CLASSES
+
+=item B::OP Methods
+
+next, sibling, name, ppaddr, desc, targ, type, opt, static, flags, private,
+spare
+
+=item B::UNOP METHOD
+
+first
+
+=item B::BINOP METHOD
+
+last
+
+=item B::LOGOP METHOD
+
+other
+
+=item B::LISTOP METHOD
+
+children
+
+=item B::PMOP Methods
+
+pmreplroot, pmreplstart, pmnext, pmregexp, pmflags, pmdynflags,
+pmpermflags, precomp, pmoffset
+
+=item B::SVOP METHOD
+
+sv, gv
+
+=item B::PADOP METHOD
+
+padix
+
+=item B::PVOP METHOD
+
+pv
+
+=item B::LOOP Methods
+
+redoop, nextop, lastop
+
+=item B::COP Methods
+
+label, stash, stashpv, file, cop_seq, arybase, line, warnings, io
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 B::Asmdata - Autogenerated data about Perl ops, used to generate
+bytecode
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+%insn_data, @insn_name, @optype, @specialsv_name
+
+=item AUTHOR
+
+=back
+
+=head2 B::Assembler - Assemble Perl bytecode
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHORS
+
+=back
+
+=head2 B::Bblock - Walk basic blocks
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Functions
+
+B<find_leaders>
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 B::Bytecode - Perl compiler's bytecode backend
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLE
+
+=item OPTIONS
+
+B<-b>, B<-H>, B<-k>, B<-o>I<outfile>, B<-s>
+
+=item KNOWN BUGS
+
+=item NOTICE
+
+=item AUTHORS
+
+=back
+
+=head2 B::C - Perl compiler's C backend
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+B<-ofilename>, B<-v>, B<-->, B<-uPackname>, B<-D>, B<-Do>, B<-Dc>, B<-DA>,
+B<-DC>, B<-DM>, B<-f>, B<-fcog>, B<-fsave-data>, B<-fppaddr>, B<-fwarn-sv>,
+B<-fuse-script-name>, B<-fsave-sig-hash>, B<-On>, B<-O0>, B<-O1>, B<-O2>,
+B<-llimit>
+
+=item EXAMPLES
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 B::CC - Perl compiler's optimized C translation backend
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+B<-ofilename>, B<-v>, B<-->, B<-uPackname>, B<-mModulename>, B<-D>, B<-Dr>,
+B<-DO>, B<-Ds>, B<-Dp>, B<-Dq>, B<-Dl>, B<-Dt>, B<-f>,
+B<-ffreetmps-each-bblock>, B<-ffreetmps-each-loop>, B<-fomit-taint>, B<-On>
+
+=item EXAMPLES
+
+=item BUGS
+
+=item DIFFERENCES
+
+=over 4
+
+=item Loops
+
+=item Context of ".."
+
+=item Arithmetic
+
+=item Deprecated features
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 B::Concise - Walk Perl syntax tree, printing concise info about ops
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLE
+
+=item OPTIONS
+
+=over 4
+
+=item Options for Opcode Ordering
+
+B<-basic>, B<-exec>, B<-tree>
+
+=item Options for Line-Style
+
+B<-concise>, B<-terse>, B<-linenoise>, B<-debug>, B<-env>
+
+=item Options for tree-specific formatting
+
+B<-compact>, B<-loose>, B<-vt>, B<-ascii>
+
+=item Options controlling sequence numbering
+
+B<-base>I<n>, B<-bigendian>, B<-littleendian>
+
+=item Other options
+
+B<-main>, B<-nomain>, B<-nobanner>, B<-banner>, B<-banneris> => subref
+
+=item Option Stickiness
+
+=back
+
+=item ABBREVIATIONS
+
+=over 4
+
+=item OP class abbreviations
+
+=item OP flags abbreviations
+
+=back
+
+=item FORMATTING SPECIFICATIONS
+
+=over 4
+
+=item Special Patterns
+
+B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>, B<(*(>I<text>B<)*)>,
+B<(*(>I<text1>B<;>I<text2>B<)*)>, B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>,
+B<~>
+
+=item # Variables
+
+B<#>I<var>, B<#>I<var>I<N>, B<#>I<Var>, B<#addr>, B<#arg>, B<#class>,
+B<#classsym>, B<#coplabel>, B<#exname>, B<#extarg>, B<#firstaddr>,
+B<#flags>, B<#flagval>, B<#hyphseq>, B<#label>, B<#lastaddr>, B<#name>,
+B<#NAME>, B<#next>, B<#nextaddr>, B<#noise>, B<#private>, B<#privval>,
+B<#seq>, B<#seqnum>, B<#opt>, B<#static>, B<#sibaddr>, B<#svaddr>,
+B<#svclass>, B<#svval>, B<#targ>, B<#targarg>, B<#targarglife>, B<#typenum>
+
+=back
+
+=item Using B::Concise outside of the O framework
+
+=over 4
+
+=item Example: Altering Concise Renderings
+
+=item set_style()
+
+=item set_style_standard($name)
+
+=item add_style()
+
+=item add_callback()
+
+=item Running B::Concise::compile()
+
+=item B::Concise::reset_sequence()
+
+=item Errors
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 B::Debug - Walk Perl syntax tree, printing debug info about ops
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 B::Deparse - Perl compiler backend to produce perl code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+B<-d>, B<-f>I<FILE>, B<-l>, B<-p>, B<-P>, B<-q>, B<-s>I<LETTERS>, B<C>,
+B<i>I<NUMBER>, B<T>, B<v>I<STRING>B<.>, B<-x>I<LEVEL>
+
+=item USING B::Deparse AS A MODULE
+
+=over 4
+
+=item Synopsis
+
+=item Description
+
+=item new
+
+=item ambient_pragmas
+
+strict, $[, bytes, utf8, integer, re, warnings, hint_bits, warning_bits
+
+=item coderef2text
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 B::Disassembler - Disassemble Perl bytecode
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 B::Lint - Perl lint
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS AND LINT CHECKS
+
+B<context>, B<implicit-read> and B<implicit-write>, B<bare-subs>,
+B<dollar-underscore>, B<private-names>, B<undefined-subs>,
+B<regexp-variables>, B<all>, B<none>
+
+=item NON LINT-CHECK OPTIONS
+
+B<-u Package>
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 B::O, O - Generic interface to Perl Compiler backends
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONVENTIONS
+
+=item IMPLEMENTATION
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 B::Showlex - Show lexical variables used in functions or files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=over 4
+
+=item OPTIONS
+
+=back
+
+=item SEE ALSO
+
+=item TODO
+
+=item AUTHOR
+
+=back
+
+=head2 B::Stackobj - Helper module for CC backend
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 B::Stash - show what stashes are loaded
+
+=head2 B::Terse - Walk Perl syntax tree, printing terse info about ops
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 B::Xref - Generates cross reference reports for Perl programs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+C<-oFILENAME>, C<-r>, C<-d>, C<-D[tO]>
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 Bblock, B::Bblock - Walk basic blocks
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Functions
+
+B<find_leaders>
+
+=back
+
+=item AUTHOR
+
+=back
+
+=head2 Benchmark - benchmark running times of Perl code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods
+
+new, debug, iters
+
+=item Standard Exports
+
+timeit(COUNT, CODE), timethis ( COUNT, CODE, [ TITLE, [ STYLE ]] ),
+timethese ( COUNT, CODEHASHREF, [ STYLE ] ), timediff ( T1, T2 ), timestr (
+TIMEDIFF, [ STYLE, [ FORMAT ] ] )
+
+=item Optional Exports
+
+clearcache ( COUNT ), clearallcache ( ), cmpthese ( COUNT, CODEHASHREF, [
+STYLE ] ), cmpthese ( RESULTSHASHREF, [ STYLE ] ), countit(TIME, CODE),
+disablecache ( ), enablecache ( ), timesum ( T1, T2 )
+
+=item :hireswallclock
+
+=back
+
+=item NOTES
+
+=item EXAMPLES
+
+=item INHERITANCE
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item MODIFICATION HISTORY
+
+=back
+
+=head2 ByteLoader - load byte compiled perl code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Bytecode, B::Bytecode - Perl compiler's bytecode backend
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLE
+
+=item OPTIONS
+
+B<-b>, B<-H>, B<-k>, B<-o>I<outfile>, B<-s>
+
+=item KNOWN BUGS
+
+=item NOTICE
+
+=item AUTHORS
+
+=back
+
+=head2 CGI - Simple Common Gateway Interface Class
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=over 4
+
+=item PROGRAMMING STYLE
+
+=item CALLING CGI.PM ROUTINES
+
+=item CREATING A NEW QUERY OBJECT (OBJECT-ORIENTED STYLE):
+
+=item CREATING A NEW QUERY OBJECT FROM AN INPUT FILE
+
+=item FETCHING A LIST OF KEYWORDS FROM THE QUERY:
+
+=item FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT:
+
+=item FETCHING THE VALUE OR VALUES OF A SINGLE NAMED PARAMETER:
+
+=item SETTING THE VALUE(S) OF A NAMED PARAMETER:
+
+=item APPENDING ADDITIONAL VALUES TO A NAMED PARAMETER:
+
+=item IMPORTING ALL PARAMETERS INTO A NAMESPACE:
+
+=item DELETING A PARAMETER COMPLETELY:
+
+=item DELETING ALL PARAMETERS:
+
+=item HANDLING NON-URLENCODED ARGUMENTS
+
+=item DIRECT ACCESS TO THE PARAMETER LIST:
+
+=item FETCHING THE PARAMETER LIST AS A HASH:
+
+=item SAVING THE STATE OF THE SCRIPT TO A FILE:
+
+=item RETRIEVING CGI ERRORS
+
+=item USING THE FUNCTION-ORIENTED INTERFACE
+
+B<:cgi>, B<:form>, B<:html2>, B<:html3>, B<:html4>, B<:netscape>, B<:html>,
+B<:standard>, B<:all>
+
+=item PRAGMAS
+
+-any, -compile, -nosticky, -tabindex, -no_undef_params, -no_xhtml, -nph,
+-newstyle_urls, -oldstyle_urls, -autoload, -no_debug, -debug,
+-private_tempfiles
+
+=item SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS
+
+1. start_table() (generates a <table> tag), 2. end_table() (generates a
+</table> tag), 3. start_ul() (generates a <ul> tag), 4. end_ul() (generates
+a </ul> tag)
+
+=back
+
+=item GENERATING DYNAMIC DOCUMENTS
+
+=over 4
+
+=item CREATING A STANDARD HTTP HEADER:
+
+=item GENERATING A REDIRECTION HEADER
+
+=item CREATING THE HTML DOCUMENT HEADER
+
+B<Parameters:>, 4, 5, 6..
+
+=item ENDING THE HTML DOCUMENT:
+
+=item CREATING A SELF-REFERENCING URL THAT PRESERVES STATE INFORMATION:
+
+=item OBTAINING THE SCRIPT'S URL
+
+B<-absolute>, B<-relative>, B<-full>, B<-path> (B<-path_info>), B<-query>
+(B<-query_string>), B<-base>, B<-rewrite>
+
+=item MIXING POST AND URL PARAMETERS
+
+=back
+
+=item CREATING STANDARD HTML ELEMENTS:
+
+=over 4
+
+=item PROVIDING ARGUMENTS TO HTML SHORTCUTS
+
+=item THE DISTRIBUTIVE PROPERTY OF HTML SHORTCUTS
+
+=item HTML SHORTCUTS AND LIST INTERPOLATION
+
+=item NON-STANDARD HTML SHORTCUTS
+
+=item AUTOESCAPING HTML
+
+$escaped_string = escapeHTML("unescaped string");, $charset =
+charset([$charset]);, $flag = autoEscape([$flag]);
+
+=item PRETTY-PRINTING HTML
+
+=back
+
+=item CREATING FILL-OUT FORMS:
+
+=over 4
+
+=item CREATING AN ISINDEX TAG
+
+=item STARTING AND ENDING A FORM
+
+B<application/x-www-form-urlencoded>, B<multipart/form-data>
+
+=item FORM ELEMENTS
+
+B<-name>, B<-value>, B<-values>, B<-tabindex>, B<-id>, B<-override>,
+B<-onChange>, B<-onFocus>, B<-onBlur>, B<-onMouseOver>, B<-onMouseOut>,
+B<-onSelect>
+
+=item CREATING A TEXT FIELD
+
+B<Parameters>
+
+=item CREATING A BIG TEXT FIELD
+
+=item CREATING A PASSWORD FIELD
+
+=item CREATING A FILE UPLOAD FIELD
+
+B<Parameters>
+
+=item CREATING A POPUP MENU
+
+=item CREATING AN OPTION GROUP
+
+=item CREATING A SCROLLING LIST
+
+B<Parameters:>
+
+=item CREATING A GROUP OF RELATED CHECKBOXES
+
+B<Parameters:>
+
+=item CREATING A STANDALONE CHECKBOX
+
+B<Parameters:>
+
+=item CREATING A RADIO BUTTON GROUP
+
+B<Parameters:>
+
+=item CREATING A SUBMIT BUTTON 
+
+B<Parameters:>
+
+=item CREATING A RESET BUTTON
+
+=item CREATING A DEFAULT BUTTON
+
+=item CREATING A HIDDEN FIELD
+
+B<Parameters:>
+
+=item CREATING A CLICKABLE IMAGE BUTTON
+
+B<Parameters:>, 3. The third option (-align, optional) is an alignment
+type, and may be TOP, BOTTOM or MIDDLE
+
+=item CREATING A JAVASCRIPT ACTION BUTTON
+
+=back
+
+=item HTTP COOKIES
+
+1. an expiration time, 2. a domain, 3. a path, 4. a "secure" flag,
+B<-name>, B<-value>, B<-path>, B<-domain>, B<-expires>, B<-secure>
+
+=item WORKING WITH FRAMES
+
+1. Create a <Frameset> document, 2. Specify the destination for the
+document in the HTTP header, 3. Specify the destination for the document in
+the <form> tag
+
+=item SUPPORT FOR JAVASCRIPT
+
+B<onLoad>, B<onUnload>, B<onSubmit>, B<onClick>, B<onChange>, B<onFocus>,
+B<onBlur>, B<onSelect>, B<onMouseOver>, B<onMouseOut>
+
+=item LIMITED SUPPORT FOR CASCADING STYLE SHEETS
+
+=item DEBUGGING
+
+=over 4
+
+=item DUMPING OUT ALL THE NAME/VALUE PAIRS
+
+=back
+
+=item FETCHING ENVIRONMENT VARIABLES
+
+B<Accept()>, B<raw_cookie()>, B<user_agent()>, B<path_info()>,
+B<path_translated()>, B<remote_host()>, B<script_name()> Return the script
+name as a partial URL, for self-refering scripts, B<referer()>, B<auth_type
+()>, B<server_name ()>, B<virtual_host ()>, B<server_port ()>,
+B<virtual_port ()>, B<server_software ()>, B<remote_user ()>, B<user_name
+()>, B<request_method()>, B<content_type()>, B<http()>, B<https()>
+
+=item USING NPH SCRIPTS
+
+In the B<use> statement, By calling the B<nph()> method:, By using B<-nph>
+parameters
+
+=item Server Push
+
+multipart_init(), multipart_start(), multipart_end(), multipart_final()
+
+=item Avoiding Denial of Service Attacks
+
+B<$CGI::POST_MAX>, B<$CGI::DISABLE_UPLOADS>, B<1. On a script-by-script
+basis>, B<2. Globally for all scripts>
+
+=item COMPATIBILITY WITH CGI-LIB.PL
+
+=item AUTHOR INFORMATION
+
+=item CREDITS
+
+Matt Heffron (heffron@falstaff.css.beckman.com), James Taylor
+(james.taylor@srs.gov), Scott Anguish <sanguish@digifix.com>, Mike Jewell
+(mlj3u@virginia.edu), Timothy Shimmin (tes@kbs.citri.edu.au), Joergen Haegg
+(jh@axis.se), Laurent Delfosse (delfosse@delfosse.com), Richard Resnick
+(applepi1@aol.com), Craig Bishop (csb@barwonwater.vic.gov.au), Tony Curtis
+(tc@vcpc.univie.ac.at), Tim Bunce (Tim.Bunce@ig.co.uk), Tom Christiansen
+(tchrist@convex.com), Andreas Koenig (k@franz.ww.TU-Berlin.DE), Tim
+MacKenzie (Tim.MacKenzie@fulcrum.com.au), Kevin B. Hendricks
+(kbhend@dogwood.tyler.wm.edu), Stephen Dahmen (joyfire@inxpress.net), Ed
+Jordan (ed@fidalgo.net), David Alan Pisoni (david@cnation.com), Doug
+MacEachern (dougm@opengroup.org), Robin Houston (robin@oneworld.org),
+...and many many more..
+
+=item A COMPLETE EXAMPLE OF A SIMPLE FORM-BASED SCRIPT
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Apache - Backward compatibility module for CGI.pm
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item AUTHOR INFORMATION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Carp, B<CGI::Carp> - CGI routines for writing to the HTTPD (or
+other) error log
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item REDIRECTING ERROR MESSAGES
+
+=item MAKING PERL ERRORS APPEAR IN THE BROWSER WINDOW
+
+=over 4
+
+=item Changing the default message
+
+=back
+
+=item MAKING WARNINGS APPEAR AS HTML COMMENTS
+
+=item OVERRIDING THE NAME OF THE PROGRAM
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Cookie - Interface to Netscape Cookies
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USING CGI::Cookie
+
+B<1. expiration date>, B<2. domain>, B<3. path>, B<4. secure flag>
+
+=over 4
+
+=item Creating New Cookies
+
+=item Sending the Cookie to the Browser
+
+=item Recovering Previous Cookies
+
+=item Manipulating Cookies
+
+B<name()>, B<value()>, B<domain()>, B<path()>, B<expires()>
+
+=back
+
+=item AUTHOR INFORMATION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Fast - CGI Interface for Fast CGI
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OTHER PIECES OF THE PUZZLE
+
+=item WRITING FASTCGI PERL SCRIPTS
+
+=item INSTALLING FASTCGI SCRIPTS
+
+=item USING FASTCGI SCRIPTS AS CGI SCRIPTS
+
+=item EXTERNAL FASTCGI SERVER INVOCATION
+
+FCGI_SOCKET_PATH, FCGI_LISTEN_QUEUE
+
+=item CAVEATS
+
+=item AUTHOR INFORMATION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Pretty - module to produce nicely formatted HTML code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Tags that won't be formatted
+
+=item Customizing the Indenting
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Push - Simple Interface to Server Push
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USING CGI::Push
+
+-next_page, -last_page, -type, -delay, -cookie, -target, -expires, -nph
+
+=over 4
+
+=item Heterogeneous Pages
+
+=item Changing the Page Delay on the Fly
+
+=back
+
+=item INSTALLING CGI::Push SCRIPTS
+
+=item AUTHOR INFORMATION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Switch - Backward compatibility module for defunct CGI::Switch
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item AUTHOR INFORMATION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 CGI::Util - Internal utilities used by CGI module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR INFORMATION
+
+=item SEE ALSO
+
+=back
+
+=head2 CPAN - query, download and build perl modules from CPAN sites
+
+=over 4
+
+=item SYNOPSIS
+
+=item STATUS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Interactive Mode
+
+Searching for authors, bundles, distribution files and modules, make, test,
+install, clean	modules or distributions, get, readme, perldoc, look module
+or distribution, ls author, ls globbing_expresion, Signals
+
+=item CPAN::Shell
+
+=item autobundle
+
+=item recompile
+
+=item The four C<CPAN::*> Classes: Author, Bundle, Module, Distribution
+
+=item Programmer's interface
+
+expand($type,@things), expandany(@things), Programming Examples
+
+=item Methods in the other Classes
+
+CPAN::Author::as_glimpse(), CPAN::Author::as_string(),
+CPAN::Author::email(), CPAN::Author::fullname(), CPAN::Author::name(),
+CPAN::Bundle::as_glimpse(), CPAN::Bundle::as_string(),
+CPAN::Bundle::clean(), CPAN::Bundle::contains(),
+CPAN::Bundle::force($method,@args), CPAN::Bundle::get(),
+CPAN::Bundle::inst_file(), CPAN::Bundle::inst_version(),
+CPAN::Bundle::uptodate(), CPAN::Bundle::install(), CPAN::Bundle::make(),
+CPAN::Bundle::readme(), CPAN::Bundle::test(),
+CPAN::Distribution::as_glimpse(), CPAN::Distribution::as_string(),
+CPAN::Distribution::clean(), CPAN::Distribution::containsmods(),
+CPAN::Distribution::cvs_import(), CPAN::Distribution::dir(),
+CPAN::Distribution::force($method,@args), CPAN::Distribution::get(),
+CPAN::Distribution::install(), CPAN::Distribution::isa_perl(),
+CPAN::Distribution::look(), CPAN::Distribution::make(),
+CPAN::Distribution::prereq_pm(), CPAN::Distribution::readme(),
+CPAN::Distribution::perldoc(), CPAN::Distribution::test(),
+CPAN::Distribution::uptodate(), CPAN::Index::force_reload(),
+CPAN::Index::reload(), CPAN::InfoObj::dump(), CPAN::Module::as_glimpse(),
+CPAN::Module::as_string(), CPAN::Module::clean(),
+CPAN::Module::cpan_file(), CPAN::Module::cpan_version(),
+CPAN::Module::cvs_import(), CPAN::Module::description(),
+CPAN::Module::force($method,@args), CPAN::Module::get(),
+CPAN::Module::inst_file(), CPAN::Module::inst_version(),
+CPAN::Module::install(), CPAN::Module::look(), CPAN::Module::make(),
+CPAN::Module::manpage_headline(), CPAN::Module::readme(),
+CPAN::Module::perldoc(), CPAN::Module::test(), CPAN::Module::uptodate(),
+CPAN::Module::userid()
+
+=item Cache Manager
+
+=item Bundles
+
+=item Prerequisites
+
+=item Finding packages and VERSION
+
+=item Debugging
+
+=item Floppy, Zip, Offline Mode
+
+=back
+
+=item CONFIGURATION
+
+C<o conf E<lt>scalar optionE<gt>>, C<o conf E<lt>scalar optionE<gt>
+E<lt>valueE<gt>>, C<o conf E<lt>list optionE<gt>>, C<o conf E<lt>list
+optionE<gt> [shift|pop]>, C<o conf E<lt>list optionE<gt>
+[unshift|push|splice] E<lt>listE<gt>>
+
+=over 4
+
+=item Note on urllist parameter's format
+
+=item urllist parameter has CD-ROM support
+
+=back
+
+=item SECURITY
+
+=over 4
+
+=item Cryptographically signed modules
+
+=back
+
+=item EXPORT
+
+=item POPULATE AN INSTALLATION WITH LOTS OF MODULES
+
+=item WORKING WITH CPAN.pm BEHIND FIREWALLS
+
+=over 4
+
+=item Three basic types of firewalls
+
+http firewall, ftp firewall, One way visibility, SOCKS, IP Masquerade
+
+=item Configuring lynx or ncftp for going through a firewall
+
+=back
+
+=item FAQ
+
+1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
+
+=item BUGS
+
+=item AUTHOR
+
+=item TRANSLATIONS
+
+=item SEE ALSO
+
+=back
+
+=head2 CPAN::FirstTime - Utility for CPAN::Config file Initialization
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 CPAN::Version - utility functions to compare CPAN versions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 CPANox, CPAN::Nox - Wrapper around CPAN.pm without using any XS
+module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item  SEE ALSO
+
+=back
+
+=head2 Carp, carp    - warn of errors (from perspective of caller)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Forcing a Stack Trace
+
+=back
+
+=back
+
+=over 4
+
+=item GLOBAL VARIABLES
+
+=over 4
+
+=item $Carp::CarpLevel
+
+=item $Carp::MaxEvalLen
+
+=item $Carp::MaxArgLen
+
+=item $Carp::MaxArgNums
+
+=item $Carp::Verbose
+
+=back
+
+=back
+
+=over 4
+
+=item BUGS
+
+=back
+
+=head2 Carp::Heavy - heavy machinery, no user serviceable parts inside
+
+=head2 Class::ISA -- report the search path for a class's ISA tree
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+the function Class::ISA::super_path($CLASS), the function
+Class::ISA::self_and_super_path($CLASS), the function
+Class::ISA::self_and_super_versions($CLASS)
+
+=item CAUTIONARY NOTES
+
+=item COPYRIGHT
+
+=item AUTHOR
+
+=back
+
+=head2 Class::Struct - declare struct-like datatypes as Perl classes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item The C<struct()> function
+
+=item Class Creation at Compile Time
+
+=item Element Types and Accessor Methods
+
+Scalar (C<'$'> or C<'*$'>), Array (C<'@'> or C<'*@'>), Hash (C<'%'> or
+C<'*%'>), Class (C<'Class_Name'> or C<'*Class_Name'>)
+
+=item Initializing with C<new>
+
+=back
+
+=item EXAMPLES
+
+Example 1, Example 2, Example 3
+
+=item Author and Modification History
+
+=back
+
+=head2 Config - access Perl configuration information
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+myconfig(), config_sh(), config_re($regex), config_vars(@names)
+
+=item EXAMPLE
+
+=item WARNING
+
+=item GLOSSARY
+
+=over 4
+
+=item _
+
+C<_a>, C<_exe>, C<_o>
+
+=item a
+
+C<afs>, C<afsroot>, C<alignbytes>, C<ansi2knr>, C<aphostname>,
+C<api_revision>, C<api_subversion>, C<api_version>, C<api_versionstring>,
+C<ar>, C<archlib>, C<archlibexp>, C<archname64>, C<archname>, C<archobjs>,
+C<asctime_r_proto>, C<awk>
+
+=item b
+
+C<baserev>, C<bash>, C<bin>, C<binexp>, C<bison>, C<byacc>, C<byteorder>
+
+=item c
+
+C<c>, C<castflags>, C<cat>, C<cc>, C<cccdlflags>, C<ccdlflags>, C<ccflags>,
+C<ccflags_uselargefiles>, C<ccname>, C<ccsymbols>, C<ccversion>, C<cf_by>,
+C<cf_email>, C<cf_time>, C<charsize>, C<chgrp>, C<chmod>, C<chown>,
+C<clocktype>, C<comm>, C<compress>, C<contains>, C<cp>, C<cpio>, C<cpp>,
+C<cpp_stuff>, C<cppccsymbols>, C<cppflags>, C<cpplast>, C<cppminus>,
+C<cpprun>, C<cppstdin>, C<cppsymbols>, C<crypt_r_proto>, C<cryptlib>,
+C<csh>, C<ctermid_r_proto>, C<ctime_r_proto>
+
+=item d
+
+C<d__fwalk>, C<d_access>, C<d_accessx>, C<d_aintl>, C<d_alarm>,
+C<d_archlib>, C<d_asctime_r>, C<d_atolf>, C<d_atoll>,
+C<d_attribute_format>, C<d_attribute_malloc>, C<d_attribute_nonnull>,
+C<d_attribute_noreturn>, C<d_attribute_pure>, C<d_attribute_unused>,
+C<d_attribute_warn_unused_result>, C<d_bcmp>, C<d_bcopy>, C<d_bsd>,
+C<d_bsdgetpgrp>, C<d_bsdsetpgrp>, C<d_bzero>, C<d_casti32>, C<d_castneg>,
+C<d_charvspr>, C<d_chown>, C<d_chroot>, C<d_chsize>, C<d_class>,
+C<d_clearenv>, C<d_closedir>, C<d_cmsghdr_s>, C<d_const>, C<d_copysignl>,
+C<d_crypt>, C<d_crypt_r>, C<d_csh>, C<d_ctermid_r>, C<d_ctime_r>,
+C<d_cuserid>, C<d_dbl_dig>, C<d_dbminitproto>, C<d_difftime>, C<d_dirfd>,
+C<d_dirnamlen>, C<d_dlerror>, C<d_dlopen>, C<d_dlsymun>, C<d_dosuid>,
+C<d_drand48_r>, C<d_drand48proto>, C<d_dup2>, C<d_eaccess>, C<d_endgrent>,
+C<d_endgrent_r>, C<d_endhent>, C<d_endhostent_r>, C<d_endnent>,
+C<d_endnetent_r>, C<d_endpent>, C<d_endprotoent_r>, C<d_endpwent>,
+C<d_endpwent_r>, C<d_endsent>, C<d_endservent_r>, C<d_eofnblk>,
+C<d_eunice>, C<d_faststdio>, C<d_fchdir>, C<d_fchmod>, C<d_fchown>,
+C<d_fcntl>, C<d_fcntl_can_lock>, C<d_fd_macros>, C<d_fd_set>,
+C<d_fds_bits>, C<d_fgetpos>, C<d_finite>, C<d_finitel>, C<d_flexfnam>,
+C<d_flock>, C<d_flockproto>, C<d_fork>, C<d_fp_class>, C<d_fpathconf>,
+C<d_fpclass>, C<d_fpclassify>, C<d_fpclassl>, C<d_fpos64_t>, C<d_frexpl>,
+C<d_fs_data_s>, C<d_fseeko>, C<d_fsetpos>, C<d_fstatfs>, C<d_fstatvfs>,
+C<d_fsync>, C<d_ftello>, C<d_ftime>, C<d_futimes>, C<d_Gconvert>,
+C<d_getcwd>, C<d_getespwnam>, C<d_getfsstat>, C<d_getgrent>,
+C<d_getgrent_r>, C<d_getgrgid_r>, C<d_getgrnam_r>, C<d_getgrps>,
+C<d_gethbyaddr>, C<d_gethbyname>, C<d_gethent>, C<d_gethname>,
+C<d_gethostbyaddr_r>, C<d_gethostbyname_r>, C<d_gethostent_r>,
+C<d_gethostprotos>, C<d_getitimer>, C<d_getlogin>, C<d_getlogin_r>,
+C<d_getmnt>, C<d_getmntent>, C<d_getnbyaddr>, C<d_getnbyname>,
+C<d_getnent>, C<d_getnetbyaddr_r>, C<d_getnetbyname_r>, C<d_getnetent_r>,
+C<d_getnetprotos>, C<d_getpagsz>, C<d_getpbyname>, C<d_getpbynumber>,
+C<d_getpent>, C<d_getpgid>, C<d_getpgrp2>, C<d_getpgrp>, C<d_getppid>,
+C<d_getprior>, C<d_getprotobyname_r>, C<d_getprotobynumber_r>,
+C<d_getprotoent_r>, C<d_getprotoprotos>, C<d_getprpwnam>, C<d_getpwent>,
+C<d_getpwent_r>, C<d_getpwnam_r>, C<d_getpwuid_r>, C<d_getsbyname>,
+C<d_getsbyport>, C<d_getsent>, C<d_getservbyname_r>, C<d_getservbyport_r>,
+C<d_getservent_r>, C<d_getservprotos>, C<d_getspnam>, C<d_getspnam_r>,
+C<d_gettimeod>, C<d_gmtime_r>, C<d_gnulibc>, C<d_grpasswd>, C<d_hasmntopt>,
+C<d_htonl>, C<d_ilogbl>, C<d_index>, C<d_inetaton>, C<d_int64_t>,
+C<d_isascii>, C<d_isfinite>, C<d_isinf>, C<d_isnan>, C<d_isnanl>,
+C<d_killpg>, C<d_lchown>, C<d_ldbl_dig>, C<d_link>, C<d_localtime_r>,
+C<d_locconv>, C<d_lockf>, C<d_longdbl>, C<d_longlong>, C<d_lseekproto>,
+C<d_lstat>, C<d_madvise>, C<d_malloc_size>, C<d_malloc_good_size>,
+C<d_mblen>, C<d_mbstowcs>, C<d_mbtowc>, C<d_memchr>, C<d_memcmp>,
+C<d_memcpy>, C<d_memmove>, C<d_memset>, C<d_mkdir>, C<d_mkdtemp>,
+C<d_mkfifo>, C<d_mkstemp>, C<d_mkstemps>, C<d_mktime>, C<d_mmap>,
+C<d_modfl>, C<d_modfl_pow32_bug>, C<d_modflproto>, C<d_mprotect>, C<d_msg>,
+C<d_msg_ctrunc>, C<d_msg_dontroute>, C<d_msg_oob>, C<d_msg_peek>,
+C<d_msg_proxy>, C<d_msgctl>, C<d_msgget>, C<d_msghdr_s>, C<d_msgrcv>,
+C<d_msgsnd>, C<d_msync>, C<d_munmap>, C<d_mymalloc>, C<d_nanosleep>,
+C<d_nice>, C<d_nl_langinfo>, C<d_nv_preserves_uv>,
+C<d_nv_zero_is_allbits_zero>, C<d_off64_t>,
+C<d_old_pthread_create_joinable>, C<d_oldpthreads>, C<d_oldsock>,
+C<d_open3>, C<d_pathconf>, C<d_pause>, C<d_perl_otherlibdirs>,
+C<d_phostname>, C<d_pipe>, C<d_poll>, C<d_portable>, C<d_PRId64>,
+C<d_PRIeldbl>, C<d_PRIEUldbl>, C<d_PRIfldbl>, C<d_PRIFUldbl>,
+C<d_PRIgldbl>, C<d_PRIGUldbl>, C<d_PRIi64>, C<d_PRIo64>, C<d_PRIu64>,
+C<d_PRIx64>, C<d_PRIXU64>, C<d_procselfexe>, C<d_pthread_atfork>,
+C<d_pthread_attr_setscope>, C<d_pthread_yield>, C<d_pwage>, C<d_pwchange>,
+C<d_pwclass>, C<d_pwcomment>, C<d_pwexpire>, C<d_pwgecos>, C<d_pwpasswd>,
+C<d_pwquota>, C<d_qgcvt>, C<d_quad>, C<d_random_r>, C<d_readdir64_r>,
+C<d_readdir>, C<d_readdir_r>, C<d_readlink>, C<d_readv>, C<d_recvmsg>,
+C<d_rename>, C<d_rewinddir>, C<d_rmdir>, C<d_safebcpy>, C<d_safemcpy>,
+C<d_sanemcmp>, C<d_sbrkproto>, C<d_scalbnl>, C<d_sched_yield>,
+C<d_scm_rights>, C<d_SCNfldbl>, C<d_seekdir>, C<d_select>, C<d_sem>,
+C<d_semctl>, C<d_semctl_semid_ds>, C<d_semctl_semun>, C<d_semget>,
+C<d_semop>, C<d_sendmsg>, C<d_setegid>, C<d_seteuid>, C<d_setgrent>,
+C<d_setgrent_r>, C<d_setgrps>, C<d_sethent>, C<d_sethostent_r>,
+C<d_setitimer>, C<d_setlinebuf>, C<d_setlocale>, C<d_setlocale_r>,
+C<d_setnent>, C<d_setnetent_r>, C<d_setpent>, C<d_setpgid>, C<d_setpgrp2>,
+C<d_setpgrp>, C<d_setprior>, C<d_setproctitle>, C<d_setprotoent_r>,
+C<d_setpwent>, C<d_setpwent_r>, C<d_setregid>, C<d_setresgid>,
+C<d_setresuid>, C<d_setreuid>, C<d_setrgid>, C<d_setruid>, C<d_setsent>,
+C<d_setservent_r>, C<d_setsid>, C<d_setvbuf>, C<d_sfio>, C<d_shm>,
+C<d_shmat>, C<d_shmatprototype>, C<d_shmctl>, C<d_shmdt>, C<d_shmget>,
+C<d_sigaction>, C<d_sigprocmask>, C<d_sigsetjmp>, C<d_sockatmark>,
+C<d_sockatmarkproto>, C<d_socket>, C<d_socklen_t>, C<d_sockpair>,
+C<d_socks5_init>, C<d_sprintf_returns_strlen>, C<d_sqrtl>, C<d_srand48_r>,
+C<d_srandom_r>, C<d_sresgproto>, C<d_sresuproto>, C<d_statblks>,
+C<d_statfs_f_flags>, C<d_statfs_s>, C<d_statvfs>, C<d_stdio_cnt_lval>,
+C<d_stdio_ptr_lval>, C<d_stdio_ptr_lval_nochange_cnt>,
+C<d_stdio_ptr_lval_sets_cnt>, C<d_stdio_stream_array>, C<d_stdiobase>,
+C<d_stdstdio>, C<d_strchr>, C<d_strcoll>, C<d_strctcpy>, C<d_strerrm>,
+C<d_strerror>, C<d_strerror_r>, C<d_strftime>, C<d_strlcat>, C<d_strlcpy>,
+C<d_strtod>, C<d_strtol>, C<d_strtold>, C<d_strtoll>, C<d_strtoq>,
+C<d_strtoul>, C<d_strtoull>, C<d_strtouq>, C<d_strxfrm>, C<d_suidsafe>,
+C<d_symlink>, C<d_syscall>, C<d_syscallproto>, C<d_sysconf>,
+C<d_sysernlst>, C<d_syserrlst>, C<d_system>, C<d_tcgetpgrp>,
+C<d_tcsetpgrp>, C<d_telldir>, C<d_telldirproto>, C<d_time>, C<d_times>,
+C<d_tm_tm_gmtoff>, C<d_tm_tm_zone>, C<d_tmpnam_r>, C<d_truncate>,
+C<d_ttyname_r>, C<d_tzname>, C<d_u32align>, C<d_ualarm>, C<d_umask>,
+C<d_uname>, C<d_union_semun>, C<d_unordered>, C<d_unsetenv>, C<d_usleep>,
+C<d_usleepproto>, C<d_ustat>, C<d_vendorarch>, C<d_vendorbin>,
+C<d_vendorlib>, C<d_vendorscript>, C<d_vfork>, C<d_void_closedir>,
+C<d_voidsig>, C<d_voidtty>, C<d_volatile>, C<d_vprintf>, C<d_wait4>,
+C<d_waitpid>, C<d_wcstombs>, C<d_wctomb>, C<d_writev>, C<d_xenix>, C<date>,
+C<db_hashtype>, C<db_prefixtype>, C<db_version_major>, C<db_version_minor>,
+C<db_version_patch>, C<defvoidused>, C<direntrytype>, C<dlext>, C<dlsrc>,
+C<doublesize>, C<drand01>, C<drand48_r_proto>, C<dynamic_ext>
+
+=item e
+
+C<eagain>, C<ebcdic>, C<echo>, C<egrep>, C<emacs>, C<endgrent_r_proto>,
+C<endhostent_r_proto>, C<endnetent_r_proto>, C<endprotoent_r_proto>,
+C<endpwent_r_proto>, C<endservent_r_proto>, C<eunicefix>, C<exe_ext>,
+C<expr>, C<extensions>, C<extras>
+
+=item f
+
+C<fflushall>, C<fflushNULL>, C<find>, C<firstmakefile>, C<flex>,
+C<fpossize>, C<fpostype>, C<freetype>, C<from>, C<full_ar>, C<full_csh>,
+C<full_sed>
+
+=item g
+
+C<gccansipedantic>, C<gccosandvers>, C<gccversion>, C<getgrent_r_proto>,
+C<getgrgid_r_proto>, C<getgrnam_r_proto>, C<gethostbyaddr_r_proto>,
+C<gethostbyname_r_proto>, C<gethostent_r_proto>, C<getlogin_r_proto>,
+C<getnetbyaddr_r_proto>, C<getnetbyname_r_proto>, C<getnetent_r_proto>,
+C<getprotobyname_r_proto>, C<getprotobynumber_r_proto>,
+C<getprotoent_r_proto>, C<getpwent_r_proto>, C<getpwnam_r_proto>,
+C<getpwuid_r_proto>, C<getservbyname_r_proto>, C<getservbyport_r_proto>,
+C<getservent_r_proto>, C<getspnam_r_proto>, C<gidformat>, C<gidsign>,
+C<gidsize>, C<gidtype>, C<glibpth>, C<gmake>, C<gmtime_r_proto>,
+C<gnulibc_version>, C<grep>, C<groupcat>, C<groupstype>, C<gzip>
+
+=item h
+
+C<h_fcntl>, C<h_sysfile>, C<hint>, C<hostcat>, C<html1dir>, C<html1direxp>,
+C<html3dir>, C<html3direxp>
+
+=item i
+
+C<i16size>, C<i16type>, C<i32size>, C<i32type>, C<i64size>, C<i64type>,
+C<i8size>, C<i8type>, C<i_arpainet>, C<i_bsdioctl>, C<i_crypt>, C<i_db>,
+C<i_dbm>, C<i_dirent>, C<i_dld>, C<i_dlfcn>, C<i_fcntl>, C<i_float>,
+C<i_fp>, C<i_fp_class>, C<i_gdbm>, C<i_grp>, C<i_ieeefp>, C<i_inttypes>,
+C<i_langinfo>, C<i_libutil>, C<i_limits>, C<i_locale>, C<i_machcthr>,
+C<i_malloc>, C<i_math>, C<i_memory>, C<i_mntent>, C<i_ndbm>, C<i_netdb>,
+C<i_neterrno>, C<i_netinettcp>, C<i_niin>, C<i_poll>, C<i_prot>,
+C<i_pthread>, C<i_pwd>, C<i_rpcsvcdbm>, C<i_sfio>, C<i_sgtty>, C<i_shadow>,
+C<i_socks>, C<i_stdarg>, C<i_stddef>, C<i_stdlib>, C<i_string>,
+C<i_sunmath>, C<i_sysaccess>, C<i_sysdir>, C<i_sysfile>, C<i_sysfilio>,
+C<i_sysin>, C<i_sysioctl>, C<i_syslog>, C<i_sysmman>, C<i_sysmode>,
+C<i_sysmount>, C<i_sysndir>, C<i_sysparam>, C<i_sysresrc>, C<i_syssecrt>,
+C<i_sysselct>, C<i_syssockio>, C<i_sysstat>, C<i_sysstatfs>,
+C<i_sysstatvfs>, C<i_systime>, C<i_systimek>, C<i_systimes>, C<i_systypes>,
+C<i_sysuio>, C<i_sysun>, C<i_sysutsname>, C<i_sysvfs>, C<i_syswait>,
+C<i_termio>, C<i_termios>, C<i_time>, C<i_unistd>, C<i_ustat>, C<i_utime>,
+C<i_values>, C<i_varargs>, C<i_varhdr>, C<i_vfork>,
+C<ignore_versioned_solibs>, C<inc_version_list>, C<inc_version_list_init>,
+C<incpath>, C<inews>, C<installarchlib>, C<installbin>, C<installhtml1dir>,
+C<installhtml3dir>, C<installman1dir>, C<installman3dir>, C<installprefix>,
+C<installprefixexp>, C<installprivlib>, C<installscript>,
+C<installsitearch>, C<installsitebin>, C<installsitehtml1dir>,
+C<installsitehtml3dir>, C<installsitelib>, C<installsiteman1dir>,
+C<installsiteman3dir>, C<installsitescript>, C<installstyle>,
+C<installusrbinperl>, C<installvendorarch>, C<installvendorbin>,
+C<installvendorhtml1dir>, C<installvendorhtml3dir>, C<installvendorlib>,
+C<installvendorman1dir>, C<installvendorman3dir>, C<installvendorscript>,
+C<intsize>, C<issymlink>, C<ivdformat>, C<ivsize>, C<ivtype>
+
+=item k
+
+C<known_extensions>, C<ksh>
+
+=item l
+
+C<ld>, C<lddlflags>, C<ldflags>, C<ldflags_uselargefiles>, C<ldlibpthname>,
+C<less>, C<lib_ext>, C<libc>, C<libperl>, C<libpth>, C<libs>, C<libsdirs>,
+C<libsfiles>, C<libsfound>, C<libspath>, C<libswanted>,
+C<libswanted_uselargefiles>, C<line>, C<lint>, C<lkflags>, C<ln>, C<lns>,
+C<localtime_r_proto>, C<locincpth>, C<loclibpth>, C<longdblsize>,
+C<longlongsize>, C<longsize>, C<lp>, C<lpr>, C<ls>, C<lseeksize>,
+C<lseektype>
+
+=item m
+
+C<mail>, C<mailx>, C<make>, C<make_set_make>, C<mallocobj>, C<mallocsrc>,
+C<malloctype>, C<man1dir>, C<man1direxp>, C<man1ext>, C<man3dir>,
+C<man3direxp>, C<man3ext>
+
+=item M
+
+C<Mcc>, C<mips_type>, C<mistrustnm>, C<mkdir>, C<mmaptype>, C<modetype>,
+C<more>, C<multiarch>, C<mv>, C<myarchname>, C<mydomain>, C<myhostname>,
+C<myuname>
+
+=item n
+
+C<n>, C<need_va_copy>, C<netdb_hlen_type>, C<netdb_host_type>,
+C<netdb_name_type>, C<netdb_net_type>, C<nm>, C<nm_opt>, C<nm_so_opt>,
+C<nonxs_ext>, C<nroff>, C<nv_preserves_uv_bits>, C<nveformat>,
+C<nvEUformat>, C<nvfformat>, C<nvFUformat>, C<nvgformat>, C<nvGUformat>,
+C<nvsize>, C<nvtype>
+
+=item o
+
+C<o_nonblock>, C<obj_ext>, C<old_pthread_create_joinable>, C<optimize>,
+C<orderlib>, C<osname>, C<osvers>, C<otherlibdirs>
+
+=item p
+
+C<package>, C<pager>, C<passcat>, C<patchlevel>, C<path_sep>, C<perl5>,
+C<perl>, C<perl_patchlevel>
+
+=item P
+
+C<PERL_REVISION>, C<PERL_SUBVERSION>, C<PERL_VERSION>, C<perladmin>,
+C<perllibs>, C<perlpath>, C<pg>, C<phostname>, C<pidtype>, C<plibpth>,
+C<pmake>, C<pr>, C<prefix>, C<prefixexp>, C<privlib>, C<privlibexp>,
+C<procselfexe>, C<prototype>, C<ptrsize>
+
+=item q
+
+C<quadkind>, C<quadtype>
+
+=item r
+
+C<randbits>, C<randfunc>, C<random_r_proto>, C<randseedtype>, C<ranlib>,
+C<rd_nodata>, C<readdir64_r_proto>, C<readdir_r_proto>, C<revision>, C<rm>,
+C<rmail>, C<run>, C<runnm>
+
+=item s
+
+C<sched_yield>, C<scriptdir>, C<scriptdirexp>, C<sed>, C<seedfunc>,
+C<selectminbits>, C<selecttype>, C<sendmail>, C<setgrent_r_proto>,
+C<sethostent_r_proto>, C<setlocale_r_proto>, C<setnetent_r_proto>,
+C<setprotoent_r_proto>, C<setpwent_r_proto>, C<setservent_r_proto>, C<sh>,
+C<shar>, C<sharpbang>, C<shmattype>, C<shortsize>, C<shrpenv>, C<shsharp>,
+C<sig_count>, C<sig_name>, C<sig_name_init>, C<sig_num>, C<sig_num_init>,
+C<sig_size>, C<signal_t>, C<sitearch>, C<sitearchexp>, C<sitebin>,
+C<sitebinexp>, C<sitehtml1dir>, C<sitehtml1direxp>, C<sitehtml3dir>,
+C<sitehtml3direxp>, C<sitelib>, C<sitelib_stem>, C<sitelibexp>,
+C<siteman1dir>, C<siteman1direxp>, C<siteman3dir>, C<siteman3direxp>,
+C<siteprefix>, C<siteprefixexp>, C<sitescript>, C<sitescriptexp>,
+C<sizesize>, C<sizetype>, C<sleep>, C<smail>, C<so>, C<sockethdr>,
+C<socketlib>, C<socksizetype>, C<sort>, C<spackage>, C<spitshell>,
+C<sPRId64>, C<sPRIeldbl>, C<sPRIEUldbl>, C<sPRIfldbl>, C<sPRIFUldbl>,
+C<sPRIgldbl>, C<sPRIGUldbl>, C<sPRIi64>, C<sPRIo64>, C<sPRIu64>,
+C<sPRIx64>, C<sPRIXU64>, C<srand48_r_proto>, C<srandom_r_proto>, C<src>,
+C<sSCNfldbl>, C<ssizetype>, C<startperl>, C<startsh>, C<static_ext>,
+C<stdchar>, C<stdio_base>, C<stdio_bufsiz>, C<stdio_cnt>, C<stdio_filbuf>,
+C<stdio_ptr>, C<stdio_stream_array>, C<strerror_r_proto>, C<strings>,
+C<submit>, C<subversion>, C<sysman>
+
+=item t
+
+C<tail>, C<tar>, C<targetarch>, C<tbl>, C<tee>, C<test>, C<timeincl>,
+C<timetype>, C<tmpnam_r_proto>, C<to>, C<touch>, C<tr>, C<trnl>, C<troff>,
+C<ttyname_r_proto>
+
+=item u
+
+C<u16size>, C<u16type>, C<u32size>, C<u32type>, C<u64size>, C<u64type>,
+C<u8size>, C<u8type>, C<uidformat>, C<uidsign>, C<uidsize>, C<uidtype>,
+C<uname>, C<uniq>, C<uquadtype>, C<use5005threads>, C<use64bitall>,
+C<use64bitint>, C<usecrosscompile>, C<usedl>, C<usefaststdio>,
+C<useithreads>, C<uselargefiles>, C<uselongdouble>, C<usemallocwrap>,
+C<usemorebits>, C<usemultiplicity>, C<usemymalloc>, C<usenm>, C<useopcode>,
+C<useperlio>, C<useposix>, C<usereentrant>, C<usesfio>, C<useshrplib>,
+C<usesocks>, C<usethreads>, C<usevendorprefix>, C<usevfork>, C<usrinc>,
+C<uuname>, C<uvoformat>, C<uvsize>, C<uvtype>, C<uvuformat>, C<uvxformat>,
+C<uvXUformat>
+
+=item v
+
+C<vendorarch>, C<vendorarchexp>, C<vendorbin>, C<vendorbinexp>,
+C<vendorhtml1dir>, C<vendorhtml1direxp>, C<vendorhtml3dir>,
+C<vendorhtml3direxp>, C<vendorlib>, C<vendorlib_stem>, C<vendorlibexp>,
+C<vendorman1dir>, C<vendorman1direxp>, C<vendorman3dir>,
+C<vendorman3direxp>, C<vendorprefix>, C<vendorprefixexp>, C<vendorscript>,
+C<vendorscriptexp>, C<version>, C<version_patchlevel_string>,
+C<versiononly>, C<vi>, C<voidflags>
+
+=item x
+
+C<xlibpth>
+
+=item y
+
+C<yacc>, C<yaccflags>
+
+=item z
+
+C<zcat>, C<zip>
+
+=back
+
+=item NOTE
+
+=back
+
+=head2 Cwd - get pathname of current working directory
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item getcwd and friends
+
+getcwd, cwd, fastcwd, fastgetcwd, getdcwd
+
+=item abs_path and friends
+
+abs_path, realpath, fast_abs_path
+
+=item $ENV{PWD}
+
+=back
+
+=item NOTES
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 DB - programmatic interface to the Perl debugging API (draft,
+subject to
+change)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Global Variables
+
+ $DB::sub,  %DB::sub,  $DB::single,  $DB::signal,  $DB::trace,	@DB::args, 
+@DB::dbline,  %DB::dbline,  $DB::package,  $DB::filename,  $DB::subname, 
+$DB::lineno
+
+=item API Methods
+
+CLIENT->register(), CLIENT->evalcode(STRING), CLIENT->skippkg('D::hide'),
+CLIENT->run(), CLIENT->step(), CLIENT->next(), CLIENT->done()
+
+=item Client Callback Methods
+
+CLIENT->init(), CLIENT->prestop([STRING]), CLIENT->stop(), CLIENT->idle(),
+CLIENT->poststop([STRING]), CLIENT->evalcode(STRING), CLIENT->cleanup(),
+CLIENT->output(LIST)
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 DBM_Filter -- Filter DBM keys/values 
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item What is a DBM Filter?
+
+=over 4
+
+=item So what's new?
+
+=back
+
+=item METHODS
+
+=over 4
+
+=item $db->Filter_Push()
+
+=item $db->Filter_Key_Push()
+
+=item $db->Filter_Value_Push()
+
+Filter_Push, Filter_Key_Push, Filter_Value_Push
+
+=item $db->Filter_Pop()
+
+=item $db->Filtered()
+
+=back
+
+=item Writing a Filter
+
+=over 4
+
+=item Immediate Filters
+
+=item Canned Filters
+
+"name", params
+
+=back
+
+=item Filters Included
+
+utf8, encode, compress, int32, null
+
+=item NOTES
+
+=over 4
+
+=item Maintain Round Trip Integrity
+
+=item Don't mix filtered & non-filtered data in the same database file. 
+
+=back
+
+=item EXAMPLE
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 DB_File - Perl5 access to Berkeley DB version 1.x
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<DB_HASH>, B<DB_BTREE>, B<DB_RECNO>
+
+=over 4
+
+=item Using DB_File with Berkeley DB version 2 or greater
+
+=item Interface to Berkeley DB
+
+=item Opening a Berkeley DB Database File
+
+=item Default Parameters
+
+=item In Memory Databases
+
+=back
+
+=item DB_HASH
+
+=over 4
+
+=item A Simple Example
+
+=back
+
+=item DB_BTREE
+
+=over 4
+
+=item Changing the BTREE sort order
+
+=item Handling Duplicate Keys 
+
+=item The get_dup() Method
+
+=item The find_dup() Method
+
+=item The del_dup() Method
+
+=item Matching Partial Keys 
+
+=back
+
+=item DB_RECNO
+
+=over 4
+
+=item The 'bval' Option
+
+=item A Simple Example
+
+=item Extra RECNO Methods
+
+B<$X-E<gt>push(list) ;>, B<$value = $X-E<gt>pop ;>, B<$X-E<gt>shift>,
+B<$X-E<gt>unshift(list) ;>, B<$X-E<gt>length>, B<$X-E<gt>splice(offset,
+length, elements);>
+
+=item Another Example
+
+=back
+
+=item THE API INTERFACE
+
+B<$status = $X-E<gt>get($key, $value [, $flags]) ;>, B<$status =
+$X-E<gt>put($key, $value [, $flags]) ;>, B<$status = $X-E<gt>del($key [,
+$flags]) ;>, B<$status = $X-E<gt>fd ;>, B<$status = $X-E<gt>seq($key,
+$value, $flags) ;>, B<$status = $X-E<gt>sync([$flags]) ;>
+
+=item DBM FILTERS
+
+B<filter_store_key>, B<filter_store_value>, B<filter_fetch_key>,
+B<filter_fetch_value>
+
+=over 4
+
+=item The Filter
+
+=item An Example -- the NULL termination problem.
+
+=item Another Example -- Key is a C int.
+
+=back
+
+=item HINTS AND TIPS 
+
+=over 4
+
+=item Locking: The Trouble with fd
+
+=item Safe ways to lock a database
+
+B<Tie::DB_Lock>, B<Tie::DB_LockFile>, B<DB_File::Lock>
+
+=item Sharing Databases With C Applications
+
+=item The untie() Gotcha
+
+=back
+
+=item COMMON QUESTIONS
+
+=over 4
+
+=item Why is there Perl source in my database?
+
+=item How do I store complex data structures with DB_File?
+
+=item What does "Invalid Argument" mean?
+
+=item What does "Bareword 'DB_File' not allowed" mean? 
+
+=back
+
+=item REFERENCES
+
+=item HISTORY
+
+=item BUGS
+
+=item AVAILABILITY
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Data::Dumper - stringified perl data structures, suitable for both
+printing and C<eval>
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods
+
+I<PACKAGE>->new(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Dump  I<or> 
+I<PACKAGE>->Dump(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Seen(I<[HASHREF]>),
+I<$OBJ>->Values(I<[ARRAYREF]>), I<$OBJ>->Names(I<[ARRAYREF]>),
+I<$OBJ>->Reset
+
+=item Functions
+
+Dumper(I<LIST>)
+
+=item Configuration Variables or Methods
+
+=item Exports
+
+Dumper
+
+=back
+
+=item EXAMPLES
+
+=item BUGS
+
+=over 4
+
+=item NOTE
+
+=back
+
+=item AUTHOR
+
+=item VERSION
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel::DProf - a Perl code profiler
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item PROFILE FORMAT
+
+=item AUTOLOAD
+
+=item ENVIRONMENT
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel::PPPort - Perl/Pollution/Portability
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Why use ppport.h?
+
+You should use F<ppport.h> in modern code so that your code will work
+with the widest range of Perl interpreters possible, without significant
+additional work.
+
+=item How to use ppport.h
+
+=item Running ppport.h
+
+=back
+
+=item FUNCTIONS
+
+=over 4
+
+=item WriteFile
+
+=back
+
+=item COMPATIBILITY
+
+=over 4
+
+=item Provided Perl compatibility API
+
+=item Perl API not supported by ppport.h
+
+perl 5.9.2, perl 5.9.1, perl 5.9.0, perl 5.8.3, perl 5.8.1, perl 5.8.0,
+perl 5.7.3, perl 5.7.2, perl 5.7.1, perl 5.6.1, perl 5.6.0, perl 5.005_03,
+perl 5.005, perl 5.004_05, perl 5.004_04, perl 5.004
+
+=back
+
+=item BUGS
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel::Peek - A data debugging tool for the XS programmer
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Runtime debugging
+
+=item Memory footprint debugging
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item A simple scalar string
+
+=item A simple scalar number
+
+=item A simple scalar with an extra reference
+
+=item A reference to a simple scalar
+
+=item A reference to an array
+
+=item A reference to a hash
+
+=item Dumping a large array or hash
+
+=item A reference to an SV which holds a C pointer
+
+=item A reference to a subroutine
+
+=back
+
+=item EXPORTS
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel::SelfStubber - generate stubs for a SelfLoading module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 Devel::Size - Perl extension for finding the memory usage of Perl
+variables
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item size($ref)
+
+=item total_size($ref)
+
+=back
+
+=item EXPORT
+
+=item UNDERSTANDING MEMORY ALLOCATION
+
+=over 4
+
+=item The C library
+
+=item Perl
+
+=back
+
+=item DANGERS
+
+=item Messages: texts originating from this module.
+
+=over 4
+
+=item Errors
+
+=item warnings
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Digest - Modules that calculate message digests
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+I<binary>, I<hex>, I<base64>
+
+=item OO INTERFACE
+
+$ctx = Digest->XXX($arg,...), $ctx = Digest->new(XXX => $arg,...), $ctx =
+Digest::XXX->new($arg,...), $other_ctx = $ctx->clone, $ctx->reset,
+$ctx->add( $data, ... ), $ctx->addfile( $io_handle ), $ctx->add_bits(
+$data, $nbits ), $ctx->add_bits( $bitstring ), $ctx->digest,
+$ctx->hexdigest, $ctx->b64digest
+
+=item Digest speed
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Digest::MD5 - Perl interface to the MD5 Algorithm
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+md5($data,...), md5_hex($data,...), md5_base64($data,...)
+
+=item METHODS
+
+$md5 = Digest::MD5->new, $md5->reset, $md5->clone, $md5->add($data,...),
+$md5->addfile($io_handle), $md5->add_bits($data, $nbits),
+$md5->add_bits($bitstring), $md5->digest, $md5->hexdigest, $md5->b64digest
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=item AUTHORS
+
+=back
+
+=head2 Digest::base - Digest base class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Digest::file - Calculate digests of files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+digest_file( $file, $algorithm, [$arg,...] ), digest_file_hex( $file,
+$algorithm, [$arg,...] ), digest_file_base64( $file, $algorithm, [$arg,...]
+)
+
+=item SEE ALSO
+
+=back
+
+=head2 DirHandle - supply object methods for directory handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=back
+
+=head2 Dumpvalue - provides screen dump of Perl data.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Creation
+
+C<arrayDepth>, C<hashDepth>, C<compactDump>, C<veryCompact>, C<globPrint>,
+C<dumpDBFiles>, C<dumpPackages>, C<dumpReused>, C<tick>, C<quoteHighBit>,
+C<printUndef>, C<usageOnly>, unctrl, subdump, bareStringify, quoteHighBit,
+stopDbSignal
+
+=item Methods
+
+dumpValue, dumpValues, stringify, dumpvars, set_quote, set_unctrl,
+compactDump, veryCompact, set, get
+
+=back
+
+=back
+
+=head2 DynaLoader - Dynamically load C libraries into Perl code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+@dl_library_path, @dl_resolve_using, @dl_require_symbols, @dl_librefs,
+@dl_modules, @dl_shared_objects, dl_error(), $dl_debug, dl_findfile(),
+dl_expandspec(), dl_load_file(), dl_unload_file(), dl_load_flags(),
+dl_find_symbol(), dl_find_symbol_anywhere(), dl_undef_symbols(),
+dl_install_xsub(), bootstrap()
+
+=item AUTHOR
+
+=back
+
+=head2 DynaLoader::XSLoader, XSLoader - Dynamically load C libraries into
+Perl code
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Migration from C<DynaLoader>
+
+=item Backward compatible boilerplate
+
+=back
+
+=item Order of initialization: early load()
+
+=over 4
+
+=item The most hairy case
+
+=back
+
+=item DIAGNOSTICS
+
+Can't find '%s' symbol in %s, Can't load '%s' for module %s: %s, Undefined
+symbols present after loading %s: %s, XSLoader::load('Your::Module',
+$Your::Module::VERSION)
+
+=item LIMITATIONS
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Encode - character encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=over 4
+
+=item Table of Contents
+
+=back
+
+=item DESCRIPTION
+
+=over 4
+
+=item TERMINOLOGY
+
+=back
+
+=item PERL ENCODING API
+
+$octets  = encode(ENCODING, $string [, CHECK]), $string = decode(ENCODING,
+$octets [, CHECK]), [$length =] from_to($octets, FROM_ENC, TO_ENC [,
+CHECK]), $octets = encode_utf8($string);, $string = decode_utf8($octets [,
+CHECK]);
+
+=over 4
+
+=item Listing available encodings
+
+=item Defining Aliases
+
+=back
+
+=item Encoding via PerlIO
+
+=item Handling Malformed Data
+
+B<NOTE:> Not all encoding support this feature, I<CHECK> =
+Encode::FB_DEFAULT ( == 0), I<CHECK> = Encode::FB_CROAK ( == 1), I<CHECK> =
+Encode::FB_QUIET, I<CHECK> = Encode::FB_WARN, perlqq mode (I<CHECK> =
+Encode::FB_PERLQQ), HTML charref mode (I<CHECK> = Encode::FB_HTMLCREF), XML
+charref mode (I<CHECK> = Encode::FB_XMLCREF), The bitmask
+
+=over 4
+
+=item coderef for CHECK
+
+=back
+
+=item Defining Encodings
+
+=item The UTF-8 flag
+
+Goal #1:, Goal #2:, Goal #3:, Goal #4:
+
+=over 4
+
+=item Messing with Perl's Internals
+
+is_utf8(STRING [, CHECK]), _utf8_on(STRING), _utf8_off(STRING)
+
+=back
+
+=item UTF-8 vs. utf8
+
+=item SEE ALSO
+
+=item MAINTAINER
+
+=back
+
+=head2 Encode::Alias - alias definitions to encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+As a simple string, As a qr// compiled regular expression, e.g.:, As a code
+reference, e.g.:
+
+=over 4
+
+=item Alias overloading
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Byte - Single Byte Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::CJKConstants -- Internally used by Encode::??::ISO_2022_*
+
+=head2 Encode::CN - China-based Chinese Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::CN::HZ -- internally used by Encode::CN
+
+=head2 Encode::Config -- internally used by Encode
+
+=head2 Encode::EBCDIC - EBCDIC Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Encoding - Encode Implementation Base Class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods you should implement
+
+-E<gt>encode($string [,$check]), -E<gt>decode($octets [,$check]),
+-E<gt>cat_decode($destination, $octets, $offset, $terminator [,$check])
+
+=item Other methods defined in Encode::Encodings
+
+-E<gt>name, -E<gt>renew, -E<gt>renewed, -E<gt>perlio_ok(),
+-E<gt>needs_lines()
+
+=item Example: Encode::ROT13
+
+=back
+
+=item Why the heck Encode API is different?
+
+=over 4
+
+=item Compiled Encodings
+
+=back
+
+=item SEE ALSO
+
+Scheme 1, Scheme 2, Other Schemes
+
+=back
+
+=head2 Encode::Guess -- Guesses encoding from data
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+Encode::Guess->set_suspects, Encode::Guess->add_suspects,
+Encode::decode("Guess" ...), Encode::Guess->guess($data),
+guess_encoding($data, [, I<list of suspects>])
+
+=item CAVEATS
+
+=item TO DO
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::JP - Japanese Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item Note on ISO-2022-JP(-1)?
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::JP::H2Z -- internally used by Encode::JP::2022_JP*
+
+=head2 Encode::JP::JIS7 -- internally used by Encode::JP
+
+=head2 Encode::KR - Korean Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::KR::2022_KR -- internally used by Encode::KR
+
+=head2 Encode::MIME::Header -- MIME 'B' and 'Q' header encoding
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::PerlIO -- a detailed document on Encode and PerlIO
+
+=over 4
+
+=item Overview
+
+=item How does it work?
+
+=item Line Buffering
+
+=over 4
+
+=item How can I tell whether my encoding fully supports PerlIO ?
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Supported -- Encodings supported by Encode
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Encoding Names
+
+=back
+
+=item Supported Encodings
+
+=over 4
+
+=item Built-in Encodings
+
+=item Encode::Unicode -- other Unicode encodings
+
+=item Encode::Byte -- Extended ASCII
+
+ISO-8859 and corresponding vendor mappings, KOI8 - De Facto Standard for
+the Cyrillic world, gsm0338 - Hentai Latin 1
+
+=item CJK: Chinese, Japanese, Korean (Multibyte)
+
+Encode::CN -- Continental China, Encode::JP -- Japan, Encode::KR -- Korea,
+Encode::TW -- Taiwan, Encode::HanExtra -- More Chinese via CPAN,
+Encode::JIS2K -- JIS X 0213 encodings via CPAN
+
+=item Miscellaneous encodings
+
+Encode::EBCDIC, Encode::Symbols, Encode::MIME::Header, Encode::Guess
+
+=back
+
+=item Unsupported encodings
+
+  ISO-2022-JP-2 [RFC1554], ISO-2022-CN [RFC1922], Various HP-UX encodings,
+Cyrillic encoding ISO-IR-111, ISO-8859-8-1 [Hebrew], ISIRI 3342, Iran
+System, ISIRI 2900 [Farsi], Thai encoding TCVN, Vietnamese encodings VPS,
+Various Mac encodings, (Mac) Indic encodings
+
+=item Encoding vs. Charset -- terminology
+
+=item Encoding Classification (by Anton Tagunov and Dan Kogai)
+
+=over 4
+
+=item Microsoft-related naming mess
+
+KS_C_5601-1987, GB2312, Big5, Shift_JIS
+
+=back
+
+=item Glossary
+
+character repertoire, coded character set (CCS), character encoding scheme
+(CES), charset (in MIME context), EUC, ISO-2022, UCS, UCS-2, Unicode, UTF,
+UTF-16
+
+=item See Also
+
+=item References
+
+ECMA, ECMA-035 (eq C<ISO-2022>), IANA, Assigned Charset Names by IANA, ISO,
+RFC, UC, Unicode Glossary
+
+=over 4
+
+=item Other Notable Sites
+
+czyborra.com, CJK.inf, Jungshik Shin's Hangul FAQ, debian.org:
+"Introduction to i18n"
+
+=item Offline sources
+
+C<CJKV Information Processing> by Ken Lunde
+
+=back
+
+=back
+
+=head2 Encode::Symbol - Symbol Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::TW - Taiwan-based Chinese Encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Unicode -- Various Unicode Transformation Formats
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+L<http://www.unicode.org/glossary/> says:, Quick Reference
+
+=item Size, Endianness, and BOM
+
+=over 4
+
+=item by size
+
+=item by endianness
+
+BOM as integer when fetched in network byte order
+
+=back
+
+=item Surrogate Pairs
+
+=item Error Checking
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::Unicode::UTF7 -- UTF-7 encoding
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item In Practice
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::Alias, Encode::Alias - alias definitions to
+encodings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+As a simple string, As a qr// compiled regular expression, e.g.:, As a code
+reference, e.g.:
+
+=over 4
+
+=item Alias overloading
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::CJKConstants, Encode::CJKConstants.pm --
+Internally used by Encode::??::ISO_2022_*
+
+=head2 Encode::lib::Encode::CN::HZ, Encode::CN::HZ -- internally used by
+Encode::CN
+
+=head2 Encode::lib::Encode::Config, Encode::Config -- internally used by
+Encode
+
+=head2 Encode::lib::Encode::Encoding, Encode::Encoding - Encode
+Implementation Base Class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods you should implement
+
+-E<gt>encode($string [,$check]), -E<gt>decode($octets [,$check]),
+-E<gt>cat_decode($destination, $octets, $offset, $terminator [,$check])
+
+=item Other methods defined in Encode::Encodings
+
+-E<gt>name, -E<gt>renew, -E<gt>renewed, -E<gt>perlio_ok(),
+-E<gt>needs_lines()
+
+=item Example: Encode::ROT13
+
+=back
+
+=item Why the heck Encode API is different?
+
+=over 4
+
+=item Compiled Encodings
+
+=back
+
+=item SEE ALSO
+
+Scheme 1, Scheme 2, Other Schemes
+
+=back
+
+=head2 Encode::lib::Encode::Guess, Encode::Guess -- Guesses encoding from
+data
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+Encode::Guess->set_suspects, Encode::Guess->add_suspects,
+Encode::decode("Guess" ...), Encode::Guess->guess($data),
+guess_encoding($data, [, I<list of suspects>])
+
+=item CAVEATS
+
+=item TO DO
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::JP::H2Z, Encode::JP::H2Z -- internally used by
+Encode::JP::2022_JP*
+
+=head2 Encode::lib::Encode::JP::JIS7, Encode::JP::JIS7 -- internally used
+by Encode::JP
+
+=head2 Encode::lib::Encode::KR::2022_KR, Encode::KR::2022_KR -- internally
+used by Encode::KR
+
+=head2 Encode::lib::Encode::MIME::Header, Encode::MIME::Header -- MIME 'B'
+and 'Q' header encoding
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::PerlIO, Encode::PerlIO -- a detailed document
+on Encode and PerlIO
+
+=over 4
+
+=item Overview
+
+=item How does it work?
+
+=item Line Buffering
+
+=over 4
+
+=item How can I tell whether my encoding fully supports PerlIO ?
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encode::Supported, Encode::Supported -- Encodings
+supported by Encode
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Encoding Names
+
+=back
+
+=item Supported Encodings
+
+=over 4
+
+=item Built-in Encodings
+
+=item Encode::Unicode -- other Unicode encodings
+
+=item Encode::Byte -- Extended ASCII
+
+ISO-8859 and corresponding vendor mappings, KOI8 - De Facto Standard for
+the Cyrillic world, gsm0338 - Hentai Latin 1
+
+=item CJK: Chinese, Japanese, Korean (Multibyte)
+
+Encode::CN -- Continental China, Encode::JP -- Japan, Encode::KR -- Korea,
+Encode::TW -- Taiwan, Encode::HanExtra -- More Chinese via CPAN,
+Encode::JIS2K -- JIS X 0213 encodings via CPAN
+
+=item Miscellaneous encodings
+
+Encode::EBCDIC, Encode::Symbols, Encode::MIME::Header, Encode::Guess
+
+=back
+
+=item Unsupported encodings
+
+  ISO-2022-JP-2 [RFC1554], ISO-2022-CN [RFC1922], Various HP-UX encodings,
+Cyrillic encoding ISO-IR-111, ISO-8859-8-1 [Hebrew], ISIRI 3342, Iran
+System, ISIRI 2900 [Farsi], Thai encoding TCVN, Vietnamese encodings VPS,
+Various Mac encodings, (Mac) Indic encodings
+
+=item Encoding vs. Charset -- terminology
+
+=item Encoding Classification (by Anton Tagunov and Dan Kogai)
+
+=over 4
+
+=item Microsoft-related naming mess
+
+KS_C_5601-1987, GB2312, Big5, Shift_JIS
+
+=back
+
+=item Glossary
+
+character repertoire, coded character set (CCS), character encoding scheme
+(CES), charset (in MIME context), EUC, ISO-2022, UCS, UCS-2, Unicode, UTF,
+UTF-16
+
+=item See Also
+
+=item References
+
+ECMA, ECMA-035 (eq C<ISO-2022>), IANA, Assigned Charset Names by IANA, ISO,
+RFC, UC, Unicode Glossary
+
+=over 4
+
+=item Other Notable Sites
+
+czyborra.com, CJK.inf, Jungshik Shin's Hangul FAQ, debian.org:
+"Introduction to i18n"
+
+=item Offline sources
+
+C<CJKV Information Processing> by Ken Lunde
+
+=back
+
+=back
+
+=head2 Encode::lib::Encode::Unicode::UTF7, Encode::Unicode::UTF7 -- UTF-7
+encoding
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item In Practice
+
+=item SEE ALSO
+
+=back
+
+=head2 Encode::lib::Encoder, Encode::Encoder -- Object Oriented Encoder
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item Description
+
+=over 4
+
+=item Predefined Methods
+
+$e = Encode::Encoder-E<gt>new([$data, $encoding]);, encoder(),
+$e-E<gt>data([$data]), $e-E<gt>encoding([$encoding]),
+$e-E<gt>bytes([$encoding])
+
+=item Example: base64 transcoder
+
+=item Operator Overloading
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 Encodencoding, encoding - allows you to write your script in
+non-ascii or non-utf8
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=over 4
+
+=item Literal Conversions
+
+=item PerlIO layers for C<STD(IN|OUT)>
+
+=item Implicit upgrading for byte strings
+
+=back
+
+=item FEATURES THAT REQUIRE 5.8.1
+
+"NON-EUC" doublebyte encodings, tr//, DATA pseudo-filehandle
+
+=item USAGE
+
+use encoding [I<ENCNAME>] ;, use encoding I<ENCNAME> [ STDIN =E<gt>
+I<ENCNAME_IN> ...] ;, use encoding I<ENCNAME> Filter=E<gt>1;, no encoding;
+
+=item The Filter Option
+
+=over 4
+
+=item Filter-related changes at Encode version 1.87
+
+=back
+
+=item CAVEATS
+
+=over 4
+
+=item NOT SCOPED
+
+=item DO NOT MIX MULTIPLE ENCODINGS
+
+=item tr/// with ranges
+
+Legend of characters above
+
+=back
+
+=item EXAMPLE - Greekperl
+
+=item KNOWN PROBLEMS
+
+literals in regex that are longer than 127 bytes, EBCDIC, format
+
+=over 4
+
+=item The Logic of :locale
+
+=back
+
+=item HISTORY
+
+=item SEE ALSO
+
+=back
+
+=head2 Encoder, Encode::Encoder -- Object Oriented Encoder
+
+=over 4
+
+=item SYNOPSIS
+
+=item ABSTRACT
+
+=item Description
+
+=over 4
+
+=item Predefined Methods
+
+$e = Encode::Encoder-E<gt>new([$data, $encoding]);, encoder(),
+$e-E<gt>data([$data]), $e-E<gt>encoding([$encoding]),
+$e-E<gt>bytes([$encoding])
+
+=item Example: base64 transcoder
+
+=item Operator Overloading
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 English - use nice English (or awk) names for ugly punctuation
+variables
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item PERFORMANCE
+
+=back
+
+=head2 Env - perl module that imports environment variables as scalars or
+arrays
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item LIMITATIONS
+
+=item AUTHOR
+
+=back
+
+=head2 Errno - System errno constants
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEATS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Exporter - Implements default import method for modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item How to Export
+
+=item Selecting What To Export
+
+=item How to Import
+
+C<use ModuleName;>, C<use ModuleName ();>, C<use ModuleName qw(...);>
+
+=back
+
+=item Advanced features
+
+=over 4
+
+=item Specialised Import Lists
+
+=item Exporting without using Exporter's import method
+
+=item Exporting without inheriting from Exporter
+
+=item Module Version Checking
+
+=item Managing Unknown Symbols
+
+=item Tag Handling Utility Functions
+
+=item Generating combined tags
+
+=item C<AUTOLOAD>ed Constants
+
+=back
+
+=back
+
+=head2 Exporter::Heavy - Exporter guts
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::Command - utilities to replace common UNIX commands in
+Makefiles etc.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+cat
+
+eqtime
+
+rm_rf
+
+rm_f
+
+touch
+
+mv
+
+cp
+
+chmod
+
+mkpath
+
+test_f
+
+dos2unix
+
+=over 4
+
+=item SEE ALSO 
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Command::MM - Commands for the MM's to use in Makefiles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<test_harness>
+
+=back
+
+B<pod2man>
+
+B<warn_if_old_packlist>
+
+B<perllocal_install>
+
+B<uninstall>
+
+=head2 ExtUtils::Constant - generate XS code to import C header constants
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+IV, UV, NV, PV, PVN, SV, YES, NO, UNDEF
+
+=item FUNCTIONS
+
+=back
+
+constant_types
+
+XS_constant PACKAGE, TYPES, SUBNAME, C_SUBNAME
+
+autoload PACKAGE, VERSION, AUTOLOADER
+
+WriteMakefileSnippet
+
+WriteConstants ATTRIBUTE =E<gt> VALUE [, ...], NAME, DEFAULT_TYPE,
+BREAKOUT_AT, NAMES, C_FILE, XS_FILE, SUBNAME, C_SUBNAME
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Constant::Base - base class for ExtUtils::Constant objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+=back
+
+header
+
+memEQ_clause args_hashref
+
+dump_names arg_hashref, ITEM..
+
+assign arg_hashref, VALUE..
+
+return_clause arg_hashref, ITEM
+
+switch_clause arg_hashref, NAMELEN, ITEMHASH, ITEM..
+
+params WHAT
+
+dogfood arg_hashref, ITEM..
+
+C_constant arg_hashref, ITEM.., name, type, value, macro, default, pre,
+post, def_pre, def_post, utf8, weight
+
+=over 4
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Constant::Utils - helper functions for ExtUtils::Constant
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+C_stringify NAME
+
+=back
+
+perl_stringify NAME
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Constant::XS, ExtUtils::Constant::Base - base class for
+ExtUtils::Constant objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item @EXPORT
+
+=item FUNCTIONS
+
+xsinit(), Examples, ldopts(), Examples, perl_inc(), ccflags(), ccdlflags(),
+ccopts(), xsi_header(), xsi_protos(@modules), xsi_body(@modules)
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Install - install files from here to there
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Functions
+
+B<install>
+
+=back
+
+=back
+
+B<install_default> I<DISCOURAGED>
+
+B<uninstall>
+
+B<pm_to_blib>
+
+_autosplit
+
+=over 4
+
+=item ENVIRONMENT
+
+B<PERL_INSTALL_ROOT>
+
+=item AUTHOR
+
+=item LICENSE
+
+=back
+
+=head2 ExtUtils::Installed - Inventory management of installed modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+=item FUNCTIONS
+
+new(), modules(), files(), directories(), directory_tree(), validate(),
+packlist(), version()
+
+=item EXAMPLE
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Liblist - determine libraries to use and how to use them
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+For static extensions, For dynamic extensions at build/link time, For
+dynamic extensions at load time
+
+=over 4
+
+=item EXTRALIBS
+
+=item LDLOADLIBS and LD_RUN_PATH
+
+=item BSLOADLIBS
+
+=back
+
+=item PORTABILITY
+
+=over 4
+
+=item VMS implementation
+
+=item Win32 implementation
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM - OS adjusted ExtUtils::MakeMaker subclass
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::MM_AIX - AIX specific subclass of ExtUtils::MM_Unix
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+=back
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_Any - Platform-agnostic MM methods
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item Cross-platform helper methods
+
+=back
+
+=back
+
+=over 4
+
+=item Targets
+
+=back
+
+=over 4
+
+=item Init methods
+
+=back
+
+=over 4
+
+=item Tools
+
+=back
+
+=over 4
+
+=item File::Spec wrappers
+
+=back
+
+=over 4
+
+=item Misc
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::MM_BeOS - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+os_flavor
+
+init_linker
+
+=head2 ExtUtils::MM_Cygwin - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+os_flavor
+
+=back
+
+cflags
+
+replace_manpage_separator
+
+init_linker
+
+=head2 ExtUtils::MM_DOS - DOS specific subclass of ExtUtils::MM_Unix
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+os_flavor
+
+=back
+
+=back
+
+B<replace_manpage_separator>
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_MacOS - once produced Makefiles for MacOS Classic
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::MM_NW5 - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+os_flavor
+
+init_platform, platform_constants
+
+const_cccmd
+
+static_lib
+
+dynamic_lib
+
+=head2 ExtUtils::MM_OS2 - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+init_dist
+
+=back
+
+init_linker
+
+os_flavor
+
+=head2 ExtUtils::MM_QNX - QNX specific subclass of ExtUtils::MM_Unix
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+=back
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_UWIN - U/WIN specific subclass of ExtUtils::MM_Unix
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+os_flavor
+
+=back
+
+=back
+
+B<replace_manpage_separator>
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=back
+
+=over 4
+
+=item Methods
+
+os_flavor
+
+=back
+
+c_o (o)
+
+cflags (o)
+
+const_cccmd (o)
+
+const_config (o)
+
+const_loadlibs (o)
+
+constants (o)
+
+depend (o)
+
+init_DEST
+
+init_dist
+
+dist (o)
+
+dist_basics (o)
+
+dist_ci (o)
+
+dist_core (o)
+
+B<dist_target>
+
+B<tardist_target>
+
+B<zipdist_target>
+
+B<tarfile_target>
+
+zipfile_target
+
+uutardist_target
+
+shdist_target
+
+dlsyms (o)
+
+dynamic_bs (o)
+
+dynamic_lib (o)
+
+exescan
+
+extliblist
+
+find_perl
+
+fixin
+
+force (o)
+
+guess_name
+
+has_link_code
+
+init_dirscan
+
+init_DIRFILESEP
+
+init_main
+
+init_others
+
+init_linker
+
+init_lib2arch
+
+init_PERL
+
+init_platform, platform_constants
+
+init_PERM
+
+init_xs
+
+install (o)
+
+installbin (o)
+
+linkext (o)
+
+lsdir
+
+macro (o)
+
+makeaperl (o)
+
+makefile (o)
+
+maybe_command
+
+needs_linking (o)
+
+nicetext
+
+parse_abstract
+
+parse_version
+
+pasthru (o)
+
+perl_script
+
+perldepend (o)
+
+perm_rw (o)
+
+perm_rwx (o)
+
+pm_to_blib
+
+post_constants (o)
+
+post_initialize (o)
+
+postamble (o)
+
+ppd
+
+prefixify
+
+processPL (o)
+
+quote_paren
+
+replace_manpage_separator
+
+cd
+
+oneliner
+
+quote_literal
+
+escape_newlines
+
+max_exec_len
+
+static (o)
+
+static_lib (o)
+
+staticmake (o)
+
+subdir_x (o)
+
+subdirs (o)
+
+test (o)
+
+test_via_harness (override)
+
+test_via_script (override)
+
+tools_other (o)
+
+tool_xsubpp (o)
+
+all_target
+
+top_targets (o)
+
+writedoc
+
+xs_c (o)
+
+xs_cpp (o)
+
+xs_o (o)
+
+=over 4
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_VMS - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Methods always loaded
+
+wraplist
+
+=back
+
+=back
+
+=over 4
+
+=item Methods
+
+guess_name (override)
+
+=back
+
+find_perl (override)
+
+maybe_command (override)
+
+pasthru (override)
+
+pm_to_blib (override)
+
+perl_script (override)
+
+replace_manpage_separator
+
+init_DEST
+
+init_DIRFILESEP
+
+init_main (override)
+
+init_others (override)
+
+init_platform (override)
+
+platform_constants
+
+init_VERSION (override)
+
+constants (override)
+
+special_targets
+
+cflags (override)
+
+const_cccmd (override)
+
+tools_other (override)
+
+init_dist (override)
+
+c_o (override)
+
+xs_c (override)
+
+xs_o (override)
+
+dlsyms (override)
+
+dynamic_lib (override)
+
+static_lib (override)
+
+extra_clean_files
+
+zipfile_target, tarfile_target, shdist_target
+
+install (override)
+
+perldepend (override)
+
+makeaperl (override)
+
+nicetext (override)
+
+prefixify (override)
+
+cd
+
+oneliner
+
+B<echo>
+
+quote_literal
+
+escape_newlines
+
+max_exec_len
+
+init_linker
+
+eliminate_macros
+
+fixpath
+
+os_flavor
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::MM_VOS - VOS specific subclass of ExtUtils::MM_Unix
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overridden methods
+
+=back
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MM_Win32 - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item Overridden methods
+
+B<dlsyms>
+
+=back
+
+replace_manpage_separator
+
+B<maybe_command>
+
+B<init_DIRFILESEP>
+
+B<init_others>
+
+init_platform, platform_constants
+
+special_targets
+
+static_lib
+
+dynamic_lib
+
+extra_clean_files
+
+init_linker
+
+perl_script
+
+xs_o
+
+pasthru
+
+oneliner
+
+cd
+
+max_exec_len
+
+os_flavor
+
+=head2 ExtUtils::MM_Win95 - method to customize MakeMaker for Win9X
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Overriden methods
+
+xs_c
+
+=back
+
+=back
+
+xs_cpp
+
+xs_o
+
+max_exec_len
+
+os_flavor
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::MY - ExtUtils::MakeMaker subclass for customization
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::MakeMaker - Create a module Makefile
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item How To Write A Makefile.PL
+
+=item Default Makefile Behaviour
+
+=item make test
+
+=item make testdb
+
+=item make install
+
+=item PREFIX and LIB attribute
+
+=item AFS users
+
+=item Static Linking of a new Perl Binary
+
+=item Determination of Perl Library and Installation Locations
+
+=item Which architecture dependent directory?
+
+=item Using Attributes and Parameters
+
+ABSTRACT, ABSTRACT_FROM, AUTHOR, BINARY_LOCATION, C, CCFLAGS, CONFIG,
+CONFIGURE, DEFINE, DESTDIR, DIR, DISTNAME, DISTVNAME, DL_FUNCS, DL_VARS,
+EXCLUDE_EXT, EXE_FILES, FIRST_MAKEFILE, FULLPERL, FULLPERLRUN,
+FULLPERLRUNINST, FUNCLIST, H, IMPORTS, INC, INCLUDE_EXT, INSTALLARCHLIB,
+INSTALLBIN, INSTALLDIRS, INSTALLMAN1DIR, INSTALLMAN3DIR, INSTALLPRIVLIB,
+INSTALLSCRIPT, INSTALLSITEARCH, INSTALLSITEBIN, INSTALLSITELIB,
+INSTALLSITEMAN1DIR, INSTALLSITEMAN3DIR, INSTALLVENDORARCH,
+INSTALLVENDORBIN, INSTALLVENDORLIB, INSTALLVENDORMAN1DIR,
+INSTALLVENDORMAN3DIR, INST_ARCHLIB, INST_BIN, INST_LIB, INST_MAN1DIR,
+INST_MAN3DIR, INST_SCRIPT, LD, LDDLFLAGS, LDFROM, LIB, LIBPERL_A, LIBS,
+LINKTYPE, MAKEAPERL, MAKEFILE_OLD, MAN1PODS, MAN3PODS, MAP_TARGET,
+MYEXTLIB, NAME, NEEDS_LINKING, NOECHO, NORECURS, NO_META, NO_VC, OBJECT,
+OPTIMIZE, PERL, PERL_CORE, PERLMAINCC, PERL_ARCHLIB, PERL_LIB,
+PERL_MALLOC_OK, PERLPREFIX, PERLRUN, PERLRUNINST, PERL_SRC, PERM_RW,
+PERM_RWX, PL_FILES, PM, PMLIBDIRS, PM_FILTER, POLLUTE, PPM_INSTALL_EXEC,
+PPM_INSTALL_SCRIPT, PREFIX, PREREQ_FATAL, PREREQ_PM, PREREQ_PRINT,
+PRINT_PREREQ, SITEPREFIX, SIGN, SKIP, TYPEMAPS, VENDORPREFIX, VERBINST,
+VERSION, VERSION_FROM, VERSION_SYM, XS, XSOPT, XSPROTOARG, XS_VERSION
+
+=item Additional lowercase attributes
+
+clean, depend, dist, dynamic_lib, linkext, macro, postamble, realclean,
+test, tool_autosplit
+
+=item Overriding MakeMaker Methods
+
+=item The End Of Cargo Cult Programming
+
+C<< MAN3PODS => ' ' >>
+
+=item Hintsfile support
+
+=item Distribution Support
+
+   make distcheck,    make skipcheck,	 make distclean,    make manifest, 
+  make distdir,   make disttest,    make tardist,    make dist,    make
+uutardist,    make shdist,    make zipdist,    make ci
+
+=item Module Meta-Data
+
+=item Disabling an extension
+
+=item Other Handy Functions
+
+prompt
+
+=back
+
+=item ENVIRONMENT
+
+PERL_MM_OPT, PERL_MM_USE_DEFAULT, PERL_CORE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item LICENSE
+
+=back
+
+=head2 ExtUtils::MakeMaker::Config - Wrapper around Config.pm
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::MakeMaker::FAQ - Frequently Asked Questions About
+MakeMaker
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Module Installation
+
+How do I keep from installing man pages?, How do I use a module without
+installing it?
+
+=item Philosophy and History
+
+Why not just use <insert other build config tool here>?, What is
+Module::Build and how does it relate to MakeMaker?, pure perl.	no make, no
+shell commands, easier to customize, cleaner internals, less cruft
+
+=item Module Writing
+
+How do I keep my $VERSION up to date without resetting it manually?, What's
+this F<META.yml> thing and how did it get in my F<MANIFEST>?!
+
+=item XS
+
+How to I prevent "object version X.XX does not match bootstrap parameter
+Y.YY" errors?, How do I make two or more XS files coexist in the same
+directory?
+
+=back
+
+=item PATCHING
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MakeMaker::Tutorial - Writing a module with MakeMaker
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item The Mantra
+
+=item The Layout
+
+Makefile.PL, MANIFEST, lib/, t/, Changes, README, INSTALL, MANIFEST.SKIP,
+bin/
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::MakeMaker::bytes - Version-agnostic bytes.pm
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::MakeMaker::vmsish - Platform-agnostic vmsish.pm
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::Manifest - utilities to write and check a MANIFEST file
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Functions
+
+mkmanifest
+
+=back
+
+=back
+
+manifind
+
+manicheck
+
+filecheck
+
+fullcheck
+
+skipcheck
+
+maniread
+
+manicopy
+
+maniadd
+
+=over 4
+
+=item MANIFEST
+
+=item MANIFEST.SKIP
+
+=item EXPORT_OK
+
+=item GLOBAL VARIABLES
+
+=back
+
+=over 4
+
+=item DIAGNOSTICS
+
+C<Not in MANIFEST:> I<file>, C<Skipping> I<file>, C<No such file:> I<file>,
+C<MANIFEST:> I<$!>, C<Added to MANIFEST:> I<file>
+
+=item ENVIRONMENT
+
+B<PERL_MM_MANIFEST_DEBUG>
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::Miniperl, writemain - write the C code for perlmain.c
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 ExtUtils::Mksymlists - write linker options files for dynamic
+extension
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+DLBASE, DL_FUNCS, DL_VARS, FILE, FUNCLIST, IMPORTS, NAME
+
+=item AUTHOR
+
+=item REVISION
+
+=back
+
+=head2 ExtUtils::Packlist - manage .packlist files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USAGE
+
+=item FUNCTIONS
+
+new(), read(), write(), validate(), packlist_file()
+
+=item EXAMPLE
+
+=item AUTHOR
+
+=back
+
+=head2 ExtUtils::testlib - add blib/* directories to @INC
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 Fatal - replace functions with equivalents which succeed or die
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 Fcntl - load the C Fcntl.h defines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item EXPORTED SYMBOLS
+
+=back
+
+=head2 File::Basename - Parse file paths into directory, filename and
+suffix.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+C<fileparse>
+
+C<basename>
+
+C<dirname>
+
+C<fileparse_set_fstype>
+
+=over 4
+
+=item SEE ALSO
+
+=back
+
+=head2 File::CheckTree, validate - run many filetest checks on a tree
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item HISTORY
+
+=back
+
+=head2 File::Compare - Compare files or filehandles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item RETURN
+
+=item AUTHOR
+
+=back
+
+=head2 File::Copy - Copy files or filehandles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Special behaviour if C<syscopy> is defined (OS/2, VMS and Win32)
+
+rmscopy($from,$to[,$date_flag])
+
+=back
+
+=item RETURN
+
+=item NOTES
+
+=item AUTHOR
+
+=back
+
+=head2 File::DosGlob - DOS like globbing and then some
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=item EXPORTS (by request only)
+
+=item BUGS
+
+=item AUTHOR
+
+=item HISTORY
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Find - Traverse a directory tree.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<find>, B<finddepth>
+
+=over 4
+
+=item %options
+
+C<wanted>, C<bydepth>, C<preprocess>, C<postprocess>, C<follow>,
+C<follow_fast>, C<follow_skip>, C<dangling_symlinks>, C<no_chdir>,
+C<untaint>, C<untaint_pattern>, C<untaint_skip>
+
+=item The wanted function
+
+C<$File::Find::dir> is the current directory name,, C<$_> is the current
+filename within that directory, C<$File::Find::name> is the complete
+pathname to the file
+
+=back
+
+=item WARNINGS
+
+=item CAVEAT
+
+$dont_use_nlink, symlinks
+
+=item NOTES
+
+=item BUGS AND CAVEATS
+
+=item HISTORY
+
+=back
+
+=head2 File::Glob - Perl extension for BSD glob routine
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item META CHARACTERS
+
+=item POSIX FLAGS
+
+C<GLOB_ERR>, C<GLOB_LIMIT>, C<GLOB_MARK>, C<GLOB_NOCASE>, C<GLOB_NOCHECK>,
+C<GLOB_NOSORT>, C<GLOB_BRACE>, C<GLOB_NOMAGIC>, C<GLOB_QUOTE>,
+C<GLOB_TILDE>, C<GLOB_CSH>, C<GLOB_ALPHASORT>
+
+=back
+
+=item DIAGNOSTICS
+
+C<GLOB_NOSPACE>, C<GLOB_ABEND>
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 File::Path - create or remove directory trees
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+=item AUTHORS
+
+=back
+
+=head2 File::Spec - portably perform operations on file names
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+canonpath, catdir, catfile, curdir, devnull, rootdir, tmpdir, updir,
+no_upwards, case_tolerant, file_name_is_absolute, path, join, splitpath,
+splitdir, catpath(), abs2rel, rel2abs()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 File::Spec::Cygwin - methods for Cygwin file specs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+canonpath
+
+file_name_is_absolute
+
+tmpdir (override)
+
+=over 4
+
+=item COPYRIGHT
+
+=back
+
+=head2 File::Spec::Epoc - methods for Epoc file specs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+canonpath()
+
+=over 4
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Spec::Functions - portably perform operations on file names
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Exports
+
+=back
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Spec::Mac - File::Spec for Mac OS (Classic)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+canonpath
+
+=back
+
+catdir()
+
+catfile
+
+curdir
+
+devnull
+
+rootdir
+
+tmpdir
+
+updir
+
+file_name_is_absolute
+
+path
+
+splitpath
+
+splitdir
+
+catpath
+
+abs2rel
+
+rel2abs
+
+=over 4
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Spec::OS2 - methods for OS/2 file specs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+tmpdir, splitpath
+
+=item COPYRIGHT
+
+=back
+
+=head2 File::Spec::Unix - File::Spec for Unix, base for other File::Spec
+modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+canonpath()
+
+=back
+
+catdir()
+
+catfile
+
+curdir
+
+devnull
+
+rootdir
+
+tmpdir
+
+updir
+
+no_upwards
+
+case_tolerant
+
+file_name_is_absolute
+
+path
+
+join
+
+splitpath
+
+splitdir
+
+catpath()
+
+abs2rel
+
+rel2abs()
+
+=over 4
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Spec::VMS - methods for VMS file specs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+canonpath (override)
+
+=back
+
+catdir (override)
+
+catfile (override)
+
+curdir (override)
+
+devnull (override)
+
+rootdir (override)
+
+tmpdir (override)
+
+updir (override)
+
+case_tolerant (override)
+
+path (override)
+
+file_name_is_absolute (override)
+
+splitpath (override)
+
+splitdir (override)
+
+catpath (override)
+
+abs2rel (override)
+
+rel2abs (override)
+
+=over 4
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Spec::Win32 - methods for Win32 file specs
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+devnull
+
+=back
+
+tmpdir
+
+catfile
+
+canonpath
+
+splitpath
+
+splitdir
+
+catpath
+
+=over 4
+
+=item Note For File::Spec::Win32 Maintainers
+
+=back
+
+=over 4
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 File::Temp - return name and handle of a temporary file safely
+
+=over 4
+
+=item PORTABILITY
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item OBJECT-ORIENTED INTERFACE
+
+B<new>
+
+=back
+
+B<filename>
+
+B<unlink_on_destroy>
+
+B<DESTROY>
+
+=over 4
+
+=item FUNCTIONS
+
+B<tempfile>
+
+=back
+
+B<tempdir>
+
+=over 4
+
+=item MKTEMP FUNCTIONS
+
+B<mkstemp>
+
+=back
+
+B<mkstemps>
+
+B<mkdtemp>
+
+B<mktemp>
+
+=over 4
+
+=item POSIX FUNCTIONS
+
+B<tmpnam>
+
+=back
+
+B<tmpfile>
+
+=over 4
+
+=item ADDITIONAL FUNCTIONS
+
+B<tempnam>
+
+=back
+
+=over 4
+
+=item UTILITY FUNCTIONS
+
+B<unlink0>
+
+=back
+
+B<cmpstat>
+
+B<unlink1>
+
+B<cleanup>
+
+=over 4
+
+=item PACKAGE VARIABLES
+
+B<safe_level>, STANDARD, MEDIUM, HIGH
+
+=back
+
+TopSystemUID
+
+B<$KEEP_ALL>, B<$DEBUG>
+
+=over 4
+
+=item WARNING
+
+=over 4
+
+=item Temporary files and NFS
+
+=item Forking
+
+=item BINMODE
+
+=back
+
+=item HISTORY
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 File::stat - by-name interface to Perl's built-in stat() functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 FileCache - keep more files open than the system permits
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+cacheout EXPR, cacheout MODE, EXPR
+
+=item CAVEATS
+
+=item BUGS
+
+=back
+
+=head2 FileHandle - supply object methods for filehandles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$fh->print, $fh->printf, $fh->getline, $fh->getlines
+
+=item SEE ALSO
+
+=back
+
+=head2 Filter::Simple - Simplified source filtering
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item The Problem
+
+=item A Solution
+
+=item Disabling or changing <no> behaviour
+
+=item All-in-one interface
+
+=item Filtering only specific components of source code
+
+C<"code">, C<"code_no_comments">, C<"executable">,
+C<"executable_no_comments">, C<"quotelike">, C<"string">, C<"regex">,
+C<"all">
+
+=item Filtering only the code parts of source code
+
+Most source code ceases to be grammatically correct when it is broken up
+into the pieces between string literals and regexes. So the C<'code'>
+and C<'code_no_comments'> component filter behave slightly differently
+from the other partial filters described in the previous section.
+
+=item Using Filter::Simple with an explicit C<import> subroutine
+
+=item Using Filter::Simple and Exporter together
+
+=item How it works
+
+=back
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Filter::Util::Call - Perl Source Filter Utility Module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item B<use Filter::Util::Call>
+
+=item B<import()>
+
+=item B<filter() and anonymous sub>
+
+B<$_>, B<$status>, B<filter_read> and B<filter_read_exact>, B<filter_del>
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item Example 1: A simple filter.
+
+=item Example 2: Using the context
+
+=item Example 3: Using the context within the filter
+
+=item Example 4: Using filter_del
+
+=back
+
+=item Filter::Simple
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
+=head2 FindBin - Locate directory of original perl script
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPORTABLE VARIABLES
+
+=item KNOWN ISSUES
+
+=item KNOWN BUGS
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 GDBM_File - Perl5 access to the gdbm library.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AVAILABILITY
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Getopt::Long - Extended processing of command line options
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Command Line Options, an Introduction
+
+=item Getting Started with Getopt::Long
+
+=over 4
+
+=item Simple options
+
+=item A little bit less simple options
+
+=item Mixing command line option with other arguments
+
+=item Options with values
+
+=item Options with multiple values
+
+=item Options with hash values
+
+=item User-defined subroutines to handle options
+
+=item Options with multiple names
+
+=item Case and abbreviations
+
+=item Summary of Option Specifications
+
+!, +, s, i, o, f, : I<type> [ I<desttype> ], : I<number> [ I<desttype> ], :
++ [ I<desttype> ]
+
+=back
+
+=item Advanced Possibilities
+
+=over 4
+
+=item Object oriented interface
+
+=item Thread Safety
+
+=item Documentation and help texts
+
+=item Storing option values in a hash
+
+=item Bundling
+
+=item The lonesome dash
+
+=item Argument callback
+
+=back
+
+=item Configuring Getopt::Long
+
+default, posix_default, auto_abbrev, getopt_compat, gnu_compat, gnu_getopt,
+require_order, permute, bundling (default: disabled), bundling_override
+(default: disabled), ignore_case  (default: enabled), ignore_case_always
+(default: disabled), auto_version (default:disabled), auto_help
+(default:disabled), pass_through (default: disabled), prefix,
+prefix_pattern, long_prefix_pattern, debug (default: disabled)
+
+=item Exportable Methods
+
+VersionMessage, C<-message>, C<-msg>, C<-exitval>, C<-output>, HelpMessage
+
+=item Return values and Errors
+
+=item Legacy
+
+=over 4
+
+=item Default destinations
+
+=item Alternative option starters
+
+=item Configuration variables
+
+=back
+
+=item Trouble Shooting
+
+=over 4
+
+=item GetOptions does not return a false result when an option is not
+supplied
+
+=item GetOptions does not split the command line correctly
+
+=item Undefined subroutine &main::GetOptions called
+
+=item How do I put a "-?" option into a Getopt::Long?
+
+=back
+
+=item AUTHOR
+
+=item COPYRIGHT AND DISCLAIMER
+
+=back
+
+=head2 Getopt::Std, getopt, getopts - Process single-character switches
+with switch clustering
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item C<--help> and C<--version>
+
+=back
+
+=head2 Hash::Util - A selection of general-utility hash subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Restricted hashes
+
+lock_keys, unlock_keys
+
+=back
+
+=back
+
+lock_value, unlock_value
+
+B<lock_hash>, B<unlock_hash>
+
+B<hash_seed>
+
+=over 4
+
+=item CAVEATS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 I18N::Collate - compare 8-bit scalar data according to the current
+locale
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 I18N::LangTags - functions for dealing with RFC3066-style language
+tags
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+the function is_language_tag($lang1)
+
+the function extract_language_tags($whatever)
+
+the function same_language_tag($lang1, $lang2)
+
+the function similarity_language_tag($lang1, $lang2)
+
+the function is_dialect_of($lang1, $lang2)
+
+the function super_languages($lang1)
+
+the function locale2language_tag($locale_identifier)
+
+the function encode_language_tag($lang1)
+
+the function alternate_language_tags($lang1)
+
+the function @langs = panic_languages(@accept_languages)
+
+the function implicate_supers( ...languages... ), the function
+implicate_supers_strictly( ...languages... )
+
+=over 4
+
+=item ABOUT LOWERCASING
+
+=item ABOUT UNICODE PLAINTEXT LANGUAGE TAGS
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=item AUTHOR
+
+=back
+
+=head2 I18N::LangTags::Detect - detect the user's language preferences
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=item ENVIRONMENT
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=item AUTHOR
+
+=back
+
+=head2 I18N::LangTags::List -- tags and names for human languages
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item ABOUT LANGUAGE TAGS
+
+=item LIST OF LANGUAGES
+
+{ab} : Abkhazian, {ace} : Achinese, {ach} : Acoli, {ada} : Adangme, {ady} :
+Adyghe, {aa} : Afar, {afh} : Afrihili, {af} : Afrikaans, [{afa} :
+Afro-Asiatic (Other)], {ak} : Akan, {akk} : Akkadian, {sq} : Albanian,
+{ale} : Aleut, [{alg} : Algonquian languages], [{tut} : Altaic (Other)],
+{am} : Amharic, {i-ami} : Ami, [{apa} : Apache languages], {ar} : Arabic,
+{arc} : Aramaic, {arp} : Arapaho, {arn} : Araucanian, {arw} : Arawak, {hy}
+: Armenian, {an} : Aragonese, [{art} : Artificial (Other)], {ast} :
+Asturian, {as} : Assamese, [{ath} : Athapascan languages], [{aus} :
+Australian languages], [{map} : Austronesian (Other)], {av} : Avaric, {ae}
+: Avestan, {awa} : Awadhi, {ay} : Aymara, {az} : Azerbaijani, {ban} :
+Balinese, [{bat} : Baltic (Other)], {bal} : Baluchi, {bm} : Bambara, [{bai}
+: Bamileke languages], {bad} : Banda, [{bnt} : Bantu (Other)], {bas} :
+Basa, {ba} : Bashkir, {eu} : Basque, {btk} : Batak (Indonesia), {bej} :
+Beja, {be} : Belarusian, {bem} : Bemba, {bn} : Bengali, [{ber} : Berber
+(Other)], {bho} : Bhojpuri, {bh} : Bihari, {bik} : Bikol, {bin} : Bini,
+{bi} : Bislama, {bs} : Bosnian, {bra} : Braj, {br} : Breton, {bug} :
+Buginese, {bg} : Bulgarian, {i-bnn} : Bunun, {bua} : Buriat, {my} :
+Burmese, {cad} : Caddo, {car} : Carib, {ca} : Catalan, [{cau} : Caucasian
+(Other)], {ceb} : Cebuano, [{cel} : Celtic (Other)], [{cai} : Central
+American Indian (Other)], {chg} : Chagatai, [{cmc} : Chamic languages],
+{ch} : Chamorro, {ce} : Chechen, {chr} : Cherokee, {chy} : Cheyenne, {chb}
+: Chibcha, {ny} : Chichewa, {zh} : Chinese, {chn} : Chinook Jargon, {chp} :
+Chipewyan, {cho} : Choctaw, {cu} : Church Slavic, {chk} : Chuukese, {cv} :
+Chuvash, {cop} : Coptic, {kw} : Cornish, {co} : Corsican, {cr} : Cree,
+{mus} : Creek, [{cpe} : English-based Creoles and pidgins (Other)], [{cpf}
+: French-based Creoles and pidgins (Other)], [{cpp} : Portuguese-based
+Creoles and pidgins (Other)], [{crp} : Creoles and pidgins (Other)], {hr} :
+Croatian, [{cus} : Cushitic (Other)], {cs} : Czech, {dak} : Dakota, {da} :
+Danish, {dar} : Dargwa, {day} : Dayak, {i-default} : Default (Fallthru)
+Language, {del} : Delaware, {din} : Dinka, {dv} : Divehi, {doi} : Dogri,
+{dgr} : Dogrib, [{dra} : Dravidian (Other)], {dua} : Duala, {nl} : Dutch,
+{dum} : Middle Dutch (ca.1050-1350), {dyu} : Dyula, {dz} : Dzongkha, {efi}
+: Efik, {egy} : Ancient Egyptian, {eka} : Ekajuk, {elx} : Elamite, {en} :
+English, {enm} : Old English (1100-1500), {ang} : Old English
+(ca.450-1100), {i-enochian} : Enochian (Artificial), {myv} : Erzya, {eo} :
+Esperanto, {et} : Estonian, {ee} : Ewe, {ewo} : Ewondo, {fan} : Fang, {fat}
+: Fanti, {fo} : Faroese, {fj} : Fijian, {fi} : Finnish, [{fiu} :
+Finno-Ugrian (Other)], {fon} : Fon, {fr} : French, {frm} : Middle French
+(ca.1400-1600), {fro} : Old French (842-ca.1400), {fy} : Frisian, {fur} :
+Friulian, {ff} : Fulah, {gaa} : Ga, {gd} : Scots Gaelic, {gl} : Gallegan,
+{lg} : Ganda, {gay} : Gayo, {gba} : Gbaya, {gez} : Geez, {ka} : Georgian,
+{de} : German, {gmh} : Middle High German (ca.1050-1500), {goh} : Old High
+German (ca.750-1050), [{gem} : Germanic (Other)], {gil} : Gilbertese, {gon}
+: Gondi, {gor} : Gorontalo, {got} : Gothic, {grb} : Grebo, {grc} : Ancient
+Greek, {el} : Modern Greek, {gn} : Guarani, {gu} : Gujarati, {gwi} :
+Gwich'in, {hai} : Haida, {ht} : Haitian, {ha} : Hausa, {haw} : Hawaiian,
+{he} : Hebrew, {hz} : Herero, {hil} : Hiligaynon, {him} : Himachali, {hi} :
+Hindi, {ho} : Hiri Motu, {hit} : Hittite, {hmn} : Hmong, {hu} : Hungarian,
+{hup} : Hupa, {iba} : Iban, {is} : Icelandic, {io} : Ido, {ig} : Igbo,
+{ijo} : Ijo, {ilo} : Iloko, [{inc} : Indic (Other)], [{ine} : Indo-European
+(Other)], {id} : Indonesian, {inh} : Ingush, {ia} : Interlingua
+(International Auxiliary Language Association), {ie} : Interlingue, {iu} :
+Inuktitut, {ik} : Inupiaq, [{ira} : Iranian (Other)], {ga} : Irish, {mga} :
+Middle Irish (900-1200), {sga} : Old Irish (to 900), [{iro} : Iroquoian
+languages], {it} : Italian, {ja} : Japanese, {jv} : Javanese, {jrb} :
+Judeo-Arabic, {jpr} : Judeo-Persian, {kbd} : Kabardian, {kab} : Kabyle,
+{kac} : Kachin, {kl} : Kalaallisut, {xal} : Kalmyk, {kam} : Kamba, {kn} :
+Kannada, {kr} : Kanuri, {krc} : Karachay-Balkar, {kaa} : Kara-Kalpak, {kar}
+: Karen, {ks} : Kashmiri, {csb} : Kashubian, {kaw} : Kawi, {kk} : Kazakh,
+{kha} : Khasi, {km} : Khmer, [{khi} : Khoisan (Other)], {kho} : Khotanese,
+{ki} : Kikuyu, {kmb} : Kimbundu, {rw} : Kinyarwanda, {ky} : Kirghiz,
+{i-klingon} : Klingon, {kv} : Komi, {kg} : Kongo, {kok} : Konkani, {ko} :
+Korean, {kos} : Kosraean, {kpe} : Kpelle, {kro} : Kru, {kj} : Kuanyama,
+{kum} : Kumyk, {ku} : Kurdish, {kru} : Kurukh, {kut} : Kutenai, {lad} :
+Ladino, {lah} : Lahnda, {lam} : Lamba, {lo} : Lao, {la} : Latin, {lv} :
+Latvian, {lb} : Letzeburgesch, {lez} : Lezghian, {li} : Limburgish, {ln} :
+Lingala, {lt} : Lithuanian, {nds} : Low German, {art-lojban} : Lojban
+(Artificial), {loz} : Lozi, {lu} : Luba-Katanga, {lua} : Luba-Lulua, {lui}
+: Luiseno, {lun} : Lunda, {luo} : Luo (Kenya and Tanzania), {lus} : Lushai,
+{mk} : Macedonian, {mad} : Madurese, {mag} : Magahi, {mai} : Maithili,
+{mak} : Makasar, {mg} : Malagasy, {ms} : Malay, {ml} : Malayalam, {mt} :
+Maltese, {mnc} : Manchu, {mdr} : Mandar, {man} : Mandingo, {mni} :
+Manipuri, [{mno} : Manobo languages], {gv} : Manx, {mi} : Maori, {mr} :
+Marathi, {chm} : Mari, {mh} : Marshall, {mwr} : Marwari, {mas} : Masai,
+[{myn} : Mayan languages], {men} : Mende, {mic} : Micmac, {min} :
+Minangkabau, {i-mingo} : Mingo, [{mis} : Miscellaneous languages], {moh} :
+Mohawk, {mdf} : Moksha, {mo} : Moldavian, [{mkh} : Mon-Khmer (Other)],
+{lol} : Mongo, {mn} : Mongolian, {mos} : Mossi, [{mul} : Multiple
+languages], [{mun} : Munda languages], {nah} : Nahuatl, {nap} : Neapolitan,
+{na} : Nauru, {nv} : Navajo, {nd} : North Ndebele, {nr} : South Ndebele,
+{ng} : Ndonga, {ne} : Nepali, {new} : Newari, {nia} : Nias, [{nic} :
+Niger-Kordofanian (Other)], [{ssa} : Nilo-Saharan (Other)], {niu} : Niuean,
+{nog} : Nogai, {non} : Old Norse, [{nai} : North American Indian], {no} :
+Norwegian, {nb} : Norwegian Bokmal, {nn} : Norwegian Nynorsk, [{nub} :
+Nubian languages], {nym} : Nyamwezi, {nyn} : Nyankole, {nyo} : Nyoro, {nzi}
+: Nzima, {oc} : Occitan (post 1500), {oj} : Ojibwa, {or} : Oriya, {om} :
+Oromo, {osa} : Osage, {os} : Ossetian; Ossetic, [{oto} : Otomian
+languages], {pal} : Pahlavi, {i-pwn} : Paiwan, {pau} : Palauan, {pi} :
+Pali, {pam} : Pampanga, {pag} : Pangasinan, {pa} : Panjabi, {pap} :
+Papiamento, [{paa} : Papuan (Other)], {fa} : Persian, {peo} : Old Persian
+(ca.600-400 B.C.), [{phi} : Philippine (Other)], {phn} : Phoenician, {pon}
+: Pohnpeian, {pl} : Polish, {pt} : Portuguese, [{pra} : Prakrit languages],
+{pro} : Old Provencal (to 1500), {ps} : Pushto, {qu} : Quechua, {rm} :
+Raeto-Romance, {raj} : Rajasthani, {rap} : Rapanui, {rar} : Rarotongan,
+[{qaa - qtz} : Reserved for local use.], [{roa} : Romance (Other)], {ro} :
+Romanian, {rom} : Romany, {rn} : Rundi, {ru} : Russian, [{sal} : Salishan
+languages], {sam} : Samaritan Aramaic, {se} : Northern Sami, {sma} :
+Southern Sami, {smn} : Inari Sami, {smj} : Lule Sami, {sms} : Skolt Sami,
+[{smi} : Sami languages (Other)], {sm} : Samoan, {sad} : Sandawe, {sg} :
+Sango, {sa} : Sanskrit, {sat} : Santali, {sc} : Sardinian, {sas} : Sasak,
+{sco} : Scots, {sel} : Selkup, [{sem} : Semitic (Other)], {sr} : Serbian,
+{srr} : Serer, {shn} : Shan, {sn} : Shona, {sid} : Sidamo, {sgn-...} : Sign
+Languages, {bla} : Siksika, {sd} : Sindhi, {si} : Sinhalese, [{sit} :
+Sino-Tibetan (Other)], [{sio} : Siouan languages], {den} : Slave
+(Athapascan), [{sla} : Slavic (Other)], {sk} : Slovak, {sl} : Slovenian,
+{sog} : Sogdian, {so} : Somali, {son} : Songhai, {snk} : Soninke, {wen} :
+Sorbian languages, {nso} : Northern Sotho, {st} : Southern Sotho, [{sai} :
+South American Indian (Other)], {es} : Spanish, {suk} : Sukuma, {sux} :
+Sumerian, {su} : Sundanese, {sus} : Susu, {sw} : Swahili, {ss} : Swati,
+{sv} : Swedish, {syr} : Syriac, {tl} : Tagalog, {ty} : Tahitian, [{tai} :
+Tai (Other)], {tg} : Tajik, {tmh} : Tamashek, {ta} : Tamil, {i-tao} : Tao,
+{tt} : Tatar, {i-tay} : Tayal, {te} : Telugu, {ter} : Tereno, {tet} :
+Tetum, {th} : Thai, {bo} : Tibetan, {tig} : Tigre, {ti} : Tigrinya, {tem} :
+Timne, {tiv} : Tiv, {tli} : Tlingit, {tpi} : Tok Pisin, {tkl} : Tokelau,
+{tog} : Tonga (Nyasa), {to} : Tonga (Tonga Islands), {tsi} : Tsimshian,
+{ts} : Tsonga, {i-tsu} : Tsou, {tn} : Tswana, {tum} : Tumbuka, [{tup} :
+Tupi languages], {tr} : Turkish, {ota} : Ottoman Turkish (1500-1928), {crh}
+: Crimean Turkish, {tk} : Turkmen, {tvl} : Tuvalu, {tyv} : Tuvinian, {tw} :
+Twi, {udm} : Udmurt, {uga} : Ugaritic, {ug} : Uighur, {uk} : Ukrainian,
+{umb} : Umbundu, {und} : Undetermined, {ur} : Urdu, {uz} : Uzbek, {vai} :
+Vai, {ve} : Venda, {vi} : Vietnamese, {vo} : Volapuk, {vot} : Votic, [{wak}
+: Wakashan languages], {wa} : Walloon, {wal} : Walamo, {war} : Waray, {was}
+: Washo, {cy} : Welsh, {wo} : Wolof, {x-...} : Unregistered (Semi-Private
+Use), {xh} : Xhosa, {sah} : Yakut, {yao} : Yao, {yap} : Yapese, {ii} :
+Sichuan Yi, {yi} : Yiddish, {yo} : Yoruba, [{ypk} : Yupik languages], {znd}
+: Zande, [{zap} : Zapotec], {zen} : Zenaga, {za} : Zhuang, {zu} : Zulu,
+{zun} : Zuni
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMER
+
+=item AUTHOR
+
+=back
+
+=head2 I18N::Langinfo - query locale information
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item EXPORT
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 IO - load various IO modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DEPRECATED
+
+=back
+
+=head2 IO::Dir - supply object methods for directory handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+new ( [ DIRNAME ] ), open ( DIRNAME ), read (), seek ( POS ), tell (),
+rewind (), close (), tie %hash, 'IO::Dir', DIRNAME [, OPTIONS ]
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::File - supply object methods for filehandles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( FILENAME [,MODE [,PERMS]] ), new_tmpfile
+
+=item METHODS
+
+open( FILENAME [,MODE [,PERMS]] ), open( FILENAME, IOLAYERS ), binmode(
+[LAYER] )
+
+=item NOTE
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 IO::Handle - supply object methods for I/O handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new (), new_from_fd ( FD, MODE )
+
+=item METHODS
+
+$io->fdopen ( FD, MODE ), $io->opened, $io->getline, $io->getlines,
+$io->ungetc ( ORD ), $io->write ( BUF, LEN [, OFFSET ] ), $io->error,
+$io->clearerr, $io->sync, $io->flush, $io->printflush ( ARGS ),
+$io->blocking ( [ BOOL ] ), $io->untaint
+
+=item NOTE
+
+=item SEE ALSO
+
+=item BUGS
+
+=item HISTORY
+
+=back
+
+=head2 IO::Pipe - supply object methods for pipes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [READER, WRITER] )
+
+=item METHODS
+
+reader ([ARGS]), writer ([ARGS]), handles ()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Poll - Object interface to system poll call
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+mask ( IO [, EVENT_MASK ] ), poll ( [ TIMEOUT ] ), events ( IO ), remove (
+IO ), handles( [ EVENT_MASK ] )
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Seekable - supply seek based methods for I/O objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$io->getpos, $io->setpos, $io->seek ( POS, WHENCE ), WHENCE=0 (SEEK_SET),
+WHENCE=1 (SEEK_CUR), WHENCE=2 (SEEK_END), $io->sysseek( POS, WHENCE ),
+$io->tell
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 IO::Select - OO interface to the select system call
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ HANDLES ] )
+
+=item METHODS
+
+add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
+[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_exception ( [ TIMEOUT ] ),
+count (), bits(), select ( READ, WRITE, EXCEPTION [, TIMEOUT ] )
+
+=item EXAMPLE
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Socket - Object interface to socket communications
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item METHODS
+
+accept([PKG]), socketpair(DOMAIN, TYPE, PROTOCOL), atmark, connected,
+protocol, sockdomain, sockopt(OPT [, VAL]), socktype, timeout([VAL])
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Socket::INET - Object interface for AF_INET domain sockets
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=over 4
+
+=item METHODS
+
+sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost
+()
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Socket::UNIX - Object interface for AF_UNIX domain sockets
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item METHODS
+
+hostpath(), peerpath()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Dir, IO::Dir - supply object methods for directory
+handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+new ( [ DIRNAME ] ), open ( DIRNAME ), read (), seek ( POS ), tell (),
+rewind (), close (), tie %hash, 'IO::Dir', DIRNAME [, OPTIONS ]
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::File, IO::File - supply object methods for filehandles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( FILENAME [,MODE [,PERMS]] ), new_tmpfile
+
+=item METHODS
+
+open( FILENAME [,MODE [,PERMS]] ), open( FILENAME, IOLAYERS ), binmode(
+[LAYER] )
+
+=item NOTE
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 IO::lib::IO::Handle, IO::Handle - supply object methods for I/O
+handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new (), new_from_fd ( FD, MODE )
+
+=item METHODS
+
+$io->fdopen ( FD, MODE ), $io->opened, $io->getline, $io->getlines,
+$io->ungetc ( ORD ), $io->write ( BUF, LEN [, OFFSET ] ), $io->error,
+$io->clearerr, $io->sync, $io->flush, $io->printflush ( ARGS ),
+$io->blocking ( [ BOOL ] ), $io->untaint
+
+=item NOTE
+
+=item SEE ALSO
+
+=item BUGS
+
+=item HISTORY
+
+=back
+
+=head2 IO::lib::IO::Pipe, IO::Pipe - supply object methods for pipes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [READER, WRITER] )
+
+=item METHODS
+
+reader ([ARGS]), writer ([ARGS]), handles ()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Poll, IO::Poll - Object interface to system poll call
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+mask ( IO [, EVENT_MASK ] ), poll ( [ TIMEOUT ] ), events ( IO ), remove (
+IO ), handles( [ EVENT_MASK ] )
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Seekable, IO::Seekable - supply seek based methods for
+I/O objects
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+$io->getpos, $io->setpos, $io->seek ( POS, WHENCE ), WHENCE=0 (SEEK_SET),
+WHENCE=1 (SEEK_CUR), WHENCE=2 (SEEK_END), $io->sysseek( POS, WHENCE ),
+$io->tell
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 IO::lib::IO::Select, IO::Select - OO interface to the select system
+call
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ HANDLES ] )
+
+=item METHODS
+
+add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
+[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_exception ( [ TIMEOUT ] ),
+count (), bits(), select ( READ, WRITE, EXCEPTION [, TIMEOUT ] )
+
+=item EXAMPLE
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Socket, IO::Socket - Object interface to socket
+communications
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item METHODS
+
+accept([PKG]), socketpair(DOMAIN, TYPE, PROTOCOL), atmark, connected,
+protocol, sockdomain, sockopt(OPT [, VAL]), socktype, timeout([VAL])
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Socket::INET, IO::Socket::INET - Object interface for
+AF_INET domain sockets
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=over 4
+
+=item METHODS
+
+sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost
+()
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Socket::UNIX, IO::Socket::UNIX - Object interface for
+AF_UNIX domain sockets
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item METHODS
+
+hostpath(), peerpath()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IPC::Msg - SysV Msg IPC object class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+new ( KEY , FLAGS ), id, rcv ( BUF, LEN [, TYPE [, FLAGS ]] ), remove, set
+( STAT ), set ( NAME => VALUE [, NAME => VALUE ...] ), snd ( TYPE, MSG [,
+FLAGS ] ), stat
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IPC::Open2, open2 - open a process for both reading and writing
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item WARNING 
+
+=item SEE ALSO
+
+=back
+
+=head2 IPC::Open3, open3 - open a process for reading, writing, and error
+handling
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item WARNING
+
+=back
+
+=head2 IPC::Semaphore - SysV Semaphore IPC object class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+new ( KEY , NSEMS , FLAGS ), getall, getncnt ( SEM ), getpid ( SEM ),
+getval ( SEM ), getzcnt ( SEM ), id, op ( OPLIST ), remove, set ( STAT ),
+set ( NAME => VALUE [, NAME => VALUE ...] ), setall ( VALUES ), setval ( N
+, VALUE ), stat
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IPC::SysV - SysV IPC constants
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+ftok( PATH, ID )
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 IPC::SysV::Msg, IPC::Msg - SysV Msg IPC object class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+new ( KEY , FLAGS ), id, rcv ( BUF, LEN [, TYPE [, FLAGS ]] ), remove, set
+( STAT ), set ( NAME => VALUE [, NAME => VALUE ...] ), snd ( TYPE, MSG [,
+FLAGS ] ), stat
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IPC::SysV::Semaphore, IPC::Semaphore - SysV Semaphore IPC object
+class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+new ( KEY , NSEMS , FLAGS ), getall, getncnt ( SEM ), getpid ( SEM ),
+getval ( SEM ), getzcnt ( SEM ), id, op ( OPLIST ), remove, set ( STAT ),
+set ( NAME => VALUE [, NAME => VALUE ...] ), setall ( VALUES ), setval ( N
+, VALUE ), stat
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 List::Util - A selection of general-utility list subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+first BLOCK LIST, max LIST, maxstr LIST, min LIST, minstr LIST, reduce
+BLOCK LIST, shuffle LIST, sum LIST
+
+=item KNOWN BUGS
+
+=item SUGGESTED ADDITIONS
+
+=item COPYRIGHT
+
+=back
+
+=head2 List::Utilib::List::Util, List::Util - A selection of
+general-utility list subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+first BLOCK LIST, max LIST, maxstr LIST, min LIST, minstr LIST, reduce
+BLOCK LIST, shuffle LIST, sum LIST
+
+=item KNOWN BUGS
+
+=item SUGGESTED ADDITIONS
+
+=item COPYRIGHT
+
+=back
+
+=head2 List::Utilib::Scalar::Util, Scalar::Util - A selection of
+general-utility scalar subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+blessed EXPR, dualvar NUM, STRING, isvstring EXPR, isweak EXPR,
+looks_like_number EXPR, openhandle FH, refaddr EXPR, reftype EXPR,
+set_prototype CODEREF, PROTOTYPE, tainted EXPR, weaken REF
+
+=item KNOWN BUGS
+
+=item COPYRIGHT
+
+=item BLATANT PLUG
+
+=back
+
+=head2 Locale::Constants - constants for Locale codes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item KNOWN BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+Locale::Language, Locale::Country, Locale::Script, Locale::Currency
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Locale::Country - ISO codes for country identification (ISO 3166)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<alpha-2>, B<alpha-3>, B<numeric>
+
+=item CONVERSION ROUTINES
+
+code2country( CODE, [ CODESET ] ), country2code( STRING, [ CODESET ] ),
+country_code2code( CODE, CODESET, CODESET )
+
+=item QUERY ROUTINES
+
+C<all_country_codes( [ CODESET ] )>, C<all_country_names( [ CODESET ] )>
+
+=item SEMI-PRIVATE ROUTINES
+
+=over 4
+
+=item alias_code
+
+=item rename_country
+
+=back
+
+=item EXAMPLES
+
+=item DOMAIN NAMES
+
+=item KNOWN BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+Locale::Language, Locale::Script, Locale::Currency, Locale::SubCountry, ISO
+3166-1, http://www.iso.org/iso/en/prods-services/iso3166ma/index.html,
+http://www.egt.ie/standards/iso3166/iso3166-1-en.html,
+http://www.cia.gov/cia/publications/factbook/docs/app-d-1.html
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Locale::Currency - ISO three letter codes for currency
+identification (ISO 4217)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+XTS, XXX
+
+=item CONVERSION ROUTINES
+
+code2currency(), currency2code()
+
+=item QUERY ROUTINES
+
+C<all_currency_codes()>, C<all_currency_names()>
+
+=item EXAMPLES
+
+=item KNOWN BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+Locale::Country, Locale::Script, ISO 4217:1995,
+http://www.bsi-global.com/iso4217currency
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Locale::Language - ISO two letter codes for language identification
+(ISO 639)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONVERSION ROUTINES
+
+code2language(), language2code()
+
+=item QUERY ROUTINES
+
+C<all_language_codes()>, C<all_language_names()>
+
+=item EXAMPLES
+
+=item KNOWN BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+Locale::Country, Locale::Script, Locale::Currency, ISO 639:1988 (E/F),
+http://lcweb.loc.gov/standards/iso639-2/langhome.html
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Locale::Maketext - framework for localization
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item QUICK OVERVIEW
+
+=item METHODS
+
+=over 4
+
+=item Construction Methods
+
+=item The "maketext" Method
+
+$lh->fail_with I<or> $lh->fail_with(I<PARAM>), $lh->failure_handler_auto
+
+=item Utility Methods
+
+$language->quant($number, $singular), $language->quant($number, $singular,
+$plural), $language->quant($number, $singular, $plural, $negative),
+$language->numf($number), $language->sprintf($format, @items),
+$language->language_tag(), $language->encoding()
+
+=item Language Handle Attributes and Internals
+
+=back
+
+=item LANGUAGE CLASS HIERARCHIES
+
+=item ENTRIES IN EACH LEXICON
+
+=item BRACKET NOTATION
+
+=item AUTO LEXICONS
+
+=item CONTROLLING LOOKUP FAILURE
+
+=item HOW TO USE MAKETEXT
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMER
+
+=item AUTHOR
+
+=back
+
+=head2 Locale::Maketext::TPJ13 -- article about software localization
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Localization and Perl: gettext breaks, Maketext fixes
+
+=over 4
+
+=item A Localization Horror Story: It Could Happen To You
+
+=item The Linguistic View
+
+=item Breaking gettext
+
+=item Replacing gettext
+
+=item Buzzwords: Abstraction and Encapsulation
+
+=item Buzzword: Isomorphism
+
+=item Buzzword: Inheritance
+
+=item Buzzword: Concision
+
+=item The Devil in the Details
+
+=item The Proof in the Pudding: Localizing Web Sites
+
+=item References
+
+=back
+
+=back
+
+=head2 Locale::Script - ISO codes for script identification (ISO 15924)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<alpha-2>, B<alpha-3>, B<numeric>
+
+=over 4
+
+=item SPECIAL CODES
+
+=back
+
+=item CONVERSION ROUTINES
+
+code2script( CODE, [ CODESET ] ), script2code( STRING, [ CODESET ] ),
+script_code2code( CODE, CODESET, CODESET )
+
+=item QUERY ROUTINES
+
+C<all_script_codes ( [ CODESET ] )>, C<all_script_names ( [ CODESET ] )>
+
+=item EXAMPLES
+
+=item KNOWN BUGS AND LIMITATIONS
+
+=item SEE ALSO
+
+Locale::Language, Locale::Currency, Locale::Country, ISO 15924,
+http://www.evertype.com/standards/iso15924/
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 MIME::Base64 - Encoding and decoding of base64 strings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+encode_base64($str), encode_base64($str, $eol);, decode_base64($str)
+
+=item DIAGNOSTICS
+
+Premature end of base64 data, Premature padding of base64 data, Wide
+character in subroutine entry
+
+=item EXAMPLES
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 MIME::Base64::QuotedPrint, MIME::QuotedPrint - Encoding and decoding
+of quoted-printable strings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+encode_qp($str), encode_qp($str, $eol), encode_qp($str, $eol, $binmode),
+decode_qp($str);
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 MIME::QuotedPrint - Encoding and decoding of quoted-printable
+strings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+encode_qp($str), encode_qp($str, $eol), encode_qp($str, $eol, $binmode),
+decode_qp($str);
+
+=item COPYRIGHT
+
+=item SEE ALSO
+
+=back
+
+=head2 Math::BigFloat - Arbitrary size floating point math package
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Canonical notation
+
+=item Output
+
+=item C<mantissa()>, C<exponent()> and C<parts()>
+
+=item Accuracy vs. Precision
+
+=item Rounding
+
+ffround ( +$scale ), ffround ( -$scale ), ffround ( 0 ), fround  ( +$scale
+), fround  ( -$scale ) and fround ( 0 )
+
+=back
+
+=item METHODS
+
+=over 4
+
+=item accuracy
+
+=item precision()
+
+=back
+
+=item Autocreating constants
+
+=over 4
+
+=item Math library
+
+=item Using Math::BigInt::Lite
+
+=back
+
+=item BUGS
+
+=item CAVEATS
+
+stringify, bstr(), bdiv, Modifying and =, bpow, precision() vs. accuracy()
+
+=item SEE ALSO
+
+=item LICENSE
+
+=item AUTHORS
+
+=back
+
+=head2 Math::BigInt - Arbitrary size integer/float math package
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+Input, Output
+
+=item METHODS
+
+=over 4
+
+=item config
+
+=item accuracy
+
+=item precision
+
+=item brsft
+
+=item new
+
+=item bnan
+
+=item bzero
+
+=item binf
+
+=item bone
+
+=item is_one()/is_zero()/is_nan()/is_inf()
+
+=item is_pos()/is_neg()
+
+	$x->is_pos();			# true if > 0
+	$x->is_neg();			# true if < 0
+
+=item is_odd()/is_even()/is_int()
+
+=item bcmp
+
+=item bacmp
+
+=item sign
+
+=item digit
+
+=item bneg
+
+=item babs
+
+=item bnorm
+
+=item bnot
+
+=item binc
+
+=item bdec
+
+=item badd
+
+=item bsub
+
+=item bmul
+
+=item bdiv
+
+=item bmod
+
+=item bmodinv
+
+=item bmodpow
+
+=item bpow
+
+=item blsft
+
+=item brsft
+
+=item band
+
+=item bior
+
+=item bxor
+
+=item bnot
+
+=item bsqrt
+
+=item bfac
+
+=item round
+
+=item bround
+
+=item bfround
+
+=item bfloor
+
+=item bceil
+
+=item bgcd
+
+=item blcm
+
+=item exponent
+
+=item mantissa
+
+=item parts
+
+=item copy
+
+=item as_int
+
+=item bsstr
+
+=item as_hex
+
+=item as_bin
+
+=back
+
+=item ACCURACY and PRECISION
+
+=over 4
+
+=item Precision P
+
+=item Accuracy A
+
+=item Fallback F
+
+=item Rounding mode R
+
+'trunc', 'even', 'odd', '+inf', '-inf', 'zero', Precision, Accuracy
+(significant digits), Setting/Accessing, Creating numbers, Usage,
+Precedence, Overriding globals, Local settings, Rounding, Default values,
+Remarks
+
+=back
+
+=item Infinity and Not a Number
+
+oct()/hex(), log(-inf), exp(), cos(), sin(), atan2()
+
+=item INTERNALS
+
+=over 4
+
+=item MATH LIBRARY
+
+=item SIGN
+
+=item mantissa(), exponent() and parts()
+
+=back
+
+=item EXAMPLES
+
+  use Math::BigInt;
+
+=item Autocreating constants
+
+=item PERFORMANCE
+
+=over 4
+
+=item Alternative math libraries
+
+=item SUBCLASSING
+
+=back
+
+=item Subclassing Math::BigInt
+
+=item UPGRADING
+
+=over 4
+
+=item Auto-upgrade
+
+bsqrt(), div(), blog()
+
+=back
+
+=item BUGS
+
+broot() does not work, Out of Memory!, Fails to load Calc on Perl prior
+5.6.0
+
+=item CAVEATS
+
+bstr(), bsstr() and 'cmp', int(), length, bdiv, infinity handling,
+Modifying and =, bpow, Overloading -$x, Mixing different object types,
+bsqrt(), brsft()
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 Math::BigInt::Calc - Pure Perl module to support Math::BigInt
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item STORAGE
+
+=item METHODS
+
+=item WRAP YOUR OWN
+
+=item LICENSE
+
+This program is free software; you may redistribute it and/or modify it
+under
+the same terms as Perl itself. 
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 Math::BigInt::CalcEmu - Emulate low-level math with BigInt code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+=over 4
+
+=item __emu_bxor
+
+=item __emu_band
+
+=item __emu_bior
+
+=back
+
+=item LICENSE
+
+This program is free software; you may redistribute it and/or modify it
+under
+the same terms as Perl itself. 
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
+=head2 Math::BigRat - Arbitrary big rational numbers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item MATH LIBRARY
+
+=back
+
+=item METHODS
+
+=over 4
+
+=item new()
+
+=item numerator()
+
+=item denominator()
+
+	$d = $x->denominator();
+
+=item parts()
+
+=item as_int()
+
+=item as_hex()
+
+=item as_bin()
+
+=item bfac()
+
+=item blog()
+
+=item bround()/round()/bfround()
+
+=item bmod()
+
+=item is_one()
+
+=item is_zero()
+
+=item is_pos()
+
+=item is_neg()
+
+=item is_int()
+
+=item is_odd()
+
+=item is_even()
+
+=item bceil()
+
+=item bfloor()
+
+	$x->bfloor();
+
+=item bsqrt()
+
+	$x->bsqrt();
+
+=item config
+
+=back
+
+=item BUGS
+
+inf handling (partial), NaN handling (partial), rounding (not implemented
+except for bceil/bfloor), $x ** $y where $y is not an integer, bmod(),
+blog(), bmodinv() and bmodpow() (partial)
+
+=item LICENSE
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 Math::Complex - complex numbers and associated mathematical
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPERATIONS
+
+=item CREATION
+
+=item DISPLAYING
+
+=over 4
+
+=item CHANGED IN PERL 5.6
+
+=back
+
+=item USAGE
+
+=item ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
+
+=item ERRORS DUE TO INDIGESTIBLE ARGUMENTS
+
+=item BUGS
+
+=item AUTHORS
+
+=back
+
+=head2 Math::Trig - trigonometric functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item TRIGONOMETRIC FUNCTIONS
+
+B<tan>
+
+=over 4
+
+=item ERRORS DUE TO DIVISION BY ZERO
+
+=item SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS
+
+=back
+
+=item PLANE ANGLE CONVERSIONS
+
+=item RADIAL COORDINATE CONVERSIONS
+
+=over 4
+
+=item COORDINATE SYSTEMS
+
+=item 3-D ANGLE CONVERSIONS
+
+cartesian_to_cylindrical, cartesian_to_spherical, cylindrical_to_cartesian,
+cylindrical_to_spherical, spherical_to_cartesian, spherical_to_cylindrical
+
+=back
+
+=item GREAT CIRCLE DISTANCES AND DIRECTIONS
+
+=item EXAMPLES
+
+=over 4
+
+=item CAVEAT FOR GREAT CIRCLE FORMULAS
+
+=back
+
+=item BUGS
+
+=item AUTHORS
+
+=back
+
+=head2 Memoize - Make functions faster by trading space for time
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DETAILS
+
+=item OPTIONS
+
+=over 4
+
+=item INSTALL
+
+=item NORMALIZER
+
+=item C<SCALAR_CACHE>, C<LIST_CACHE>
+
+C<MEMORY>, C<HASH>, C<TIE>, C<FAULT>, C<MERGE>
+
+=back
+
+=item OTHER FACILITIES
+
+=over 4
+
+=item C<unmemoize>
+
+=item C<flush_cache>
+
+=back
+
+=item CAVEATS
+
+=item PERSISTENT CACHE SUPPORT
+
+=item EXPIRATION SUPPORT
+
+=item BUGS
+
+=item MAILING LIST
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=item THANK YOU
+
+=back
+
+=head2 Memoize::AnyDBM_File - glue to provide EXISTS for AnyDBM_File for
+Storable use
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Memoize::Expire - Plug-in module for automatic expiration of
+memoized values
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item INTERFACE
+
+ TIEHASH,  EXISTS,  STORE
+
+=item ALTERNATIVES
+
+=item CAVEATS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Memoize::ExpireFile - test for Memoize expiration semantics
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Memoize::ExpireTest - test for Memoize expiration semantics
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Memoize::NDBM_File - glue to provide EXISTS for NDBM_File for
+Storable use
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Memoize::SDBM_File - glue to provide EXISTS for SDBM_File for
+Storable use
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 Memoize::Storable - store Memoized data in Storable database
+
+=over 4
+
+=item DESCRIPTION
+
+=back
+
+=head2 NDBM_File - Tied access to ndbm files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item C<ndbm store returned -1, errno 22, key "..." at ...>
+
+=back
+
+=item BUGS AND WARNINGS
+
+=back
+
+=head2 NEXT - Provide a pseudo-class NEXT (et al) that allows method
+redispatch
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Enforcing redispatch
+
+=item Avoiding repetitions
+
+=item Invoking all versions of a method with a single call
+
+=item Using C<EVERY> methods
+
+=back
+
+=item AUTHOR
+
+=item BUGS AND IRRITATIONS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::Cmd - Network Command class (as used by FTP, SMTP etc)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item USER METHODS
+
+debug ( VALUE ), message (), code (), ok (), status (), datasend ( DATA ),
+dataend ()
+
+=item CLASS METHODS
+
+debug_print ( DIR, TEXT ), debug_text ( TEXT ), command ( CMD [, ARGS, ...
+]), unsupported (), response (), parse_response ( TEXT ), getline (),
+ungetline ( TEXT ), rawdatasend ( DATA ), read_until_dot (), tied_fh ()
+
+=item EXPORTS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::Config - Local configuration data for libnet
+
+=over 4
+
+=item SYNOPSYS
+
+=item DESCRIPTION
+
+=item METHODS
+
+requires_firewall HOST
+
+=item NetConfig VALUES
+
+nntp_hosts, snpp_hosts, pop3_hosts, smtp_hosts, ph_hosts, daytime_hosts,
+time_hosts, inet_domain, ftp_firewall, ftp_firewall_type, ftp_ext_passive,
+ftp_int_pasive, local_netmask, test_hosts, test_exists
+
+=back
+
+=head2 Net::Domain - Attempt to evaluate the current host's internet name
+and domain
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+hostfqdn (), hostname (), hostdomain ()
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::FTP - FTP Client class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OVERVIEW
+
+=item CONSTRUCTOR
+
+new ([ HOST ] [, OPTIONS ])
+
+=item METHODS
+
+login ([LOGIN [,PASSWORD [, ACCOUNT] ] ]), authorize ( [AUTH [, RESP]]),
+site (ARGS), ascii, binary, rename ( OLDNAME, NEWNAME ), delete ( FILENAME
+), cwd ( [ DIR ] ), cdup (), pwd (), restart ( WHERE ), rmdir ( DIR [,
+RECURSE ]), mkdir ( DIR [, RECURSE ]), alloc ( SIZE [, RECORD_SIZE] ), ls (
+[ DIR ] ), dir ( [ DIR ] ), get ( REMOTE_FILE [, LOCAL_FILE [, WHERE]] ),
+put ( LOCAL_FILE [, REMOTE_FILE ] ), put_unique ( LOCAL_FILE [, REMOTE_FILE
+] ), append ( LOCAL_FILE [, REMOTE_FILE ] ), unique_name (), mdtm ( FILE ),
+size ( FILE ), supported ( CMD ), hash ( [FILEHANDLE_GLOB_REF],[
+BYTES_PER_HASH_MARK] ), nlst ( [ DIR ] ), list ( [ DIR ] ), retr ( FILE ),
+stor ( FILE ), stou ( FILE ), appe ( FILE ), port ( [ PORT ] ), pasv (),
+pasv_xfer ( SRC_FILE, DEST_SERVER [, DEST_FILE ] ), pasv_xfer_unique (
+SRC_FILE, DEST_SERVER [, DEST_FILE ] ), pasv_wait ( NON_PASV_SERVER ),
+abort (), quit ()
+
+=over 4
+
+=item Methods for the adventurous
+
+quot (CMD [,ARGS])
+
+=back
+
+=item THE dataconn CLASS
+
+read ( BUFFER, SIZE [, TIMEOUT ] ), write ( BUFFER, SIZE [, TIMEOUT ] ),
+bytes_read (), abort (), close ()
+
+=item UNIMPLEMENTED
+
+B<SMNT>, B<HELP>, B<MODE>, B<SYST>, B<STAT>, B<STRU>, B<REIN>
+
+=item REPORTING BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item USE EXAMPLES
+
+http://www.csh.rit.edu/~adam/Progs/
+
+=item CREDITS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::NNTP - NNTP Client class
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ HOST ] [, OPTIONS ])
+
+=item METHODS
+
+article ( [ MSGID|MSGNUM ], [FH] ), body ( [ MSGID|MSGNUM ], [FH] ), head (
+[ MSGID|MSGNUM ], [FH] ), articlefh ( [ MSGID|MSGNUM ] ), bodyfh ( [
+MSGID|MSGNUM ] ), headfh ( [ MSGID|MSGNUM ] ), nntpstat ( [ MSGID|MSGNUM ]
+), group ( [ GROUP ] ), ihave ( MSGID [, MESSAGE ]), last (), date (),
+postok (), authinfo ( USER, PASS ), list (), newgroups ( SINCE [,
+DISTRIBUTIONS ]), newnews ( SINCE [, GROUPS [, DISTRIBUTIONS ]]), next (),
+post ( [ MESSAGE ] ), postfh (), slave (), quit ()
+
+=over 4
+
+=item Extension methods
+
+newsgroups ( [ PATTERN ] ), distributions (), subscriptions (),
+overview_fmt (), active_times (), active ( [ PATTERN ] ), xgtitle ( PATTERN
+), xhdr ( HEADER, MESSAGE-SPEC ), xover ( MESSAGE-SPEC ), xpath (
+MESSAGE-ID ), xpat ( HEADER, PATTERN, MESSAGE-SPEC), xrover, listgroup ( [
+GROUP ] ), reader
+
+=back
+
+=item UNSUPPORTED
+
+=item DEFINITIONS
+
+MESSAGE-SPEC, PATTERN, Examples, C<[^]-]>, C<*bdc>, C<[0-9a-zA-Z]>, C<a??d>
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::POP3 - Post Office Protocol 3 Client class (RFC1939)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ HOST ] [, OPTIONS ] 0
+
+=item METHODS
+
+auth ( USERNAME, PASSWORD ), user ( USER ), pass ( PASS ), login ( [ USER
+[, PASS ]] ), apop ( [ USER [, PASS ]] ), banner (), capa (),  capabilities
+(), top ( MSGNUM [, NUMLINES ] ), list ( [ MSGNUM ] ), get ( MSGNUM [, FH ]
+), getfh ( MSGNUM ), last (), popstat (), ping ( USER ), uidl ( [ MSGNUM ]
+), delete ( MSGNUM ), reset (), quit ()
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::Ping - check a remote host for reachability
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Functions
+
+Net::Ping->new([$proto [, $def_timeout [, $bytes [, $device [, $tos
+]]]]]);, $p->ping($host [, $timeout]);, $p->source_verify( { 0 | 1 } );,
+$p->service_check( { 0 | 1 } );, $p->tcp_service_check( { 0 | 1 } );,
+$p->hires( { 0 | 1 } );, $p->bind($local_addr);, $p->open($host);, $p->ack(
+[ $host ] );, $p->nack( $failed_ack_host );, $p->close();, pingecho($host
+[, $timeout]);
+
+=back
+
+=item NOTES
+
+=item INSTALL
+
+=item BUGS
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::SMTP - Simple Mail Transfer Protocol Client
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item CONSTRUCTOR
+
+new ( [ HOST ] [, OPTIONS ] )
+
+=item METHODS
+
+banner (), domain (), hello ( DOMAIN ), host (), etrn ( DOMAIN ), auth (
+USERNAME, PASSWORD ), mail ( ADDRESS [, OPTIONS] ), send ( ADDRESS ),
+send_or_mail ( ADDRESS ), send_and_mail ( ADDRESS ), reset (), recipient (
+ADDRESS [, ADDRESS, [...]] [, OPTIONS ] ), to ( ADDRESS [, ADDRESS [...]]
+), cc ( ADDRESS [, ADDRESS [...]] ), bcc ( ADDRESS [, ADDRESS [...]] ),
+data ( [ DATA ] ), expand ( ADDRESS ), verify ( ADDRESS ), help ( [
+$subject ] ), quit ()
+
+=item ADDRESSES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::Time - time and daytime network client interface
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+inet_time ( [HOST [, PROTOCOL [, TIMEOUT]]]), inet_daytime ( [HOST [,
+PROTOCOL [, TIMEOUT]]])
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 Net::hostent - by-name interface to Perl's built-in gethost*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Net::libnetFAQ, libnetFAQ - libnet Frequently Asked Questions
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Where to get this document
+
+=item How to contribute to this document
+
+=back
+
+=item Author and Copyright Information
+
+=over 4
+
+=item Disclaimer
+
+=back
+
+=item Obtaining and installing libnet
+
+=over 4
+
+=item What is libnet ?
+
+=item Which version of perl do I need ?
+
+=item What other modules do I need ?
+
+=item What machines support libnet ?
+
+=item Where can I get the latest libnet release
+
+=back
+
+=item Using Net::FTP
+
+=over 4
+
+=item How do I download files from an FTP server ?
+
+=item How do I transfer files in binary mode ?
+
+=item How can I get the size of a file on a remote FTP server ?
+
+=item How can I get the modification time of a file on a remote FTP server
+?
+
+=item How can I change the permissions of a file on a remote server ?
+
+=item Can I do a reget operation like the ftp command ?
+
+=item How do I get a directory listing from an FTP server ?
+
+=item Changing directory to "" does not fail ?
+
+=item I am behind a SOCKS firewall, but the Firewall option does not work ?
+
+=item I am behind an FTP proxy firewall, but cannot access machines outside
+?
+
+=item My ftp proxy firewall does not listen on port 21
+
+=item Is it possible to change the file permissions of a file on an FTP
+server ?
+
+=item I have seen scripts call a method message, but cannot find it
+documented ?
+
+=item Why does Net::FTP not implement mput and mget methods
+
+=back
+
+=item Using Net::SMTP
+
+=over 4
+
+=item Why can't the part of an Email address after the @ be used as the
+hostname ?
+
+=item Why does Net::SMTP not do DNS MX lookups ?
+
+=item The verify method always returns true ?
+
+=back
+
+=item Debugging scripts
+
+=over 4
+
+=item How can I debug my scripts that use Net::* modules ?
+
+=back
+
+=item AUTHOR AND COPYRIGHT
+
+=back
+
+=head2 Net::netent - by-name interface to Perl's built-in getnet*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Net::protoent - by-name interface to Perl's built-in getproto*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Net::servent - by-name interface to Perl's built-in getserv*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Netrc, Net::Netrc - OO interface to users netrc file
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item THE .netrc FILE
+
+machine name, default, login name, password string, account string, macdef
+name
+
+=item CONSTRUCTOR
+
+lookup ( MACHINE [, LOGIN ])
+
+=item METHODS
+
+login (), password (), account (), lpa ()
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 O - Generic interface to Perl Compiler backends
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONVENTIONS
+
+=item IMPLEMENTATION
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 ODBM_File - Tied access to odbm files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item C<odbm store returned -1, errno 22, key "..." at ...>
+
+=back
+
+=item BUGS AND WARNINGS
+
+=back
+
+=head2 Opcode - Disable named opcodes when compiling perl code
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item WARNING
+
+=item Operator Names and Operator Lists
+
+an operator name (opname), an operator tag name (optag), a negated opname
+or optag, an operator set (opset)
+
+=item Opcode Functions
+
+opcodes, opset (OP, ...), opset_to_ops (OPSET), opset_to_hex (OPSET),
+full_opset, empty_opset, invert_opset (OPSET), verify_opset (OPSET, ...),
+define_optag (OPTAG, OPSET), opmask_add (OPSET), opmask, opdesc (OP, ...),
+opdump (PAT)
+
+=item Manipulating Opsets
+
+=item TO DO (maybe)
+
+=back
+
+=over 4
+
+=item Predefined Opcode Tags
+
+:base_core, :base_mem, :base_loop, :base_io, :base_orig, :base_math,
+:base_thread, :default, :filesys_read, :sys_db, :browse, :filesys_open,
+:filesys_write, :subprocess, :ownprocess, :others, :still_to_be_decided,
+:dangerous
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=back
+
+=head2 Opcode::Safe, Safe - Compile and execute code in restricted
+compartments
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+a new namespace, an operator mask
+
+=item WARNING
+
+=over 4
+
+=item RECENT CHANGES
+
+=item Methods in class Safe
+
+permit (OP, ...), permit_only (OP, ...), deny (OP, ...), deny_only (OP,
+...), trap (OP, ...), untrap (OP, ...), share (NAME, ...), share_from
+(PACKAGE, ARRAYREF), varglob (VARNAME), reval (STRING), rdo (FILENAME),
+root (NAMESPACE), mask (MASK)
+
+=item Some Safety Issues
+
+Memory, CPU, Snooping, Signals, State Changes
+
+=item AUTHOR
+
+=back
+
+=back
+
+=head2 Opcode::ops, ops - Perl pragma to restrict unsafe operations when
+compiling
+
+=over 4
+
+=item SYNOPSIS	
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 POSIX - Perl interface to IEEE Std 1003.1
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item CAVEATS 
+
+=item FUNCTIONS
+
+_exit, abort, abs, access, acos, alarm, asctime, asin, assert, atan, atan2,
+atexit, atof, atoi, atol, bsearch, calloc, ceil, chdir, chmod, chown,
+clearerr, clock, close, closedir, cos, cosh, creat, ctermid, ctime,
+cuserid, difftime, div, dup, dup2, errno, execl, execle, execlp, execv,
+execve, execvp, exit, exp, fabs, fclose, fcntl, fdopen, feof, ferror,
+fflush, fgetc, fgetpos, fgets, fileno, floor, fmod, fopen, fork, fpathconf,
+fprintf, fputc, fputs, fread, free, freopen, frexp, fscanf, fseek, fsetpos,
+fstat, fsync, ftell, fwrite, getc, getchar, getcwd, getegid, getenv,
+geteuid, getgid, getgrgid, getgrnam, getgroups, getlogin, getpgrp, getpid,
+getppid, getpwnam, getpwuid, gets, getuid, gmtime, isalnum, isalpha,
+isatty, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace,
+isupper, isxdigit, kill, labs, ldexp, ldiv, link, localeconv, localtime,
+log, log10, longjmp, lseek, malloc, mblen, mbstowcs, mbtowc, memchr,
+memcmp, memcpy, memmove, memset, mkdir, mkfifo, mktime, modf, nice,
+offsetof, open, opendir, pathconf, pause, perror, pipe, pow, printf, putc,
+putchar, puts, qsort, raise, rand, read, readdir, realloc, remove, rename,
+rewind, rewinddir, rmdir, scanf, setgid, setjmp, setlocale, setpgid,
+setsid, setuid, sigaction, siglongjmp, sigpending, sigprocmask, sigsetjmp,
+sigsuspend, sin, sinh, sleep, sprintf, sqrt, srand, sscanf, stat, strcat,
+strchr, strcmp, strcoll, strcpy, strcspn, strerror, strftime, strlen,
+strncat, strncmp, strncpy, strpbrk, strrchr, strspn, strstr, strtod,
+strtok, strtol, strtoul, strxfrm, sysconf, system, tan, tanh, tcdrain,
+tcflow, tcflush, tcgetpgrp, tcsendbreak, tcsetpgrp, time, times, tmpfile,
+tmpnam, tolower, toupper, ttyname, tzname, tzset, umask, uname, ungetc,
+unlink, utime, vfprintf, vprintf, vsprintf, wait, waitpid, wcstombs,
+wctomb, write
+
+=item CLASSES
+
+=over 4
+
+=item POSIX::SigAction
+
+new, handler, mask, flags, safe
+
+=item POSIX::SigSet
+
+new, addset, delset, emptyset, fillset, ismember
+
+=item POSIX::Termios
+
+new, getattr, getcc, getcflag, getiflag, getispeed, getlflag, getoflag,
+getospeed, setattr, setcc, setcflag, setiflag, setispeed, setlflag,
+setoflag, setospeed, Baud rate values, Terminal interface values, c_cc
+field values, c_cflag field values, c_iflag field values, c_lflag field
+values, c_oflag field values
+
+=back
+
+=item PATHNAME CONSTANTS
+
+Constants
+
+=item POSIX CONSTANTS
+
+Constants
+
+=item SYSTEM CONFIGURATION
+
+Constants
+
+=item ERRNO
+
+Constants
+
+=item FCNTL
+
+Constants
+
+=item FLOAT
+
+Constants
+
+=item LIMITS
+
+Constants
+
+=item LOCALE
+
+Constants
+
+=item MATH
+
+Constants
+
+=item SIGNAL
+
+Constants
+
+=item STAT
+
+Constants, Macros
+
+=item STDLIB
+
+Constants
+
+=item STDIO
+
+Constants
+
+=item TIME
+
+Constants
+
+=item UNISTD
+
+Constants
+
+=item WAIT
+
+Constants, WNOHANG, WUNTRACED, Macros, WIFEXITED, WEXITSTATUS, WIFSIGNALED,
+WTERMSIG, WIFSTOPPED, WSTOPSIG
+
+=back
+
+=head2 PerlIO - On demand loader for PerlIO layers and root of PerlIO::*
+name space
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+:unix, :stdio, :perlio, :crlf, :mmap, :utf8, :bytes, :raw, :pop, :win32
+
+=over 4
+
+=item Custom Layers
+
+:encoding, :via
+
+=item Alternatives to raw
+
+=item Defaults and how to override them
+
+=item Querying the layers of filehandles
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 PerlIO::encoding - encoding layer
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 PerlIO::scalar - in-memory IO, scalar IO
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item IMPLEMENTATION NOTE
+
+=back
+
+=head2 PerlIO::via - Helper class for PerlIO layers implemented in perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPECTED METHODS
+
+$class->PUSHED([$mode[,$fh]]), $obj->POPPED([$fh]),
+$obj->UTF8($bellowFlag,[$fh]), $obj->OPEN($path,$mode[,$fh]),
+$obj->BINMODE([,$fh]), $obj->FDOPEN($fd[,$fh]),
+$obj->SYSOPEN($path,$imode,$perm,[,$fh]), $obj->FILENO($fh),
+$obj->READ($buffer,$len,$fh), $obj->WRITE($buffer,$fh), $obj->FILL($fh),
+$obj->CLOSE($fh), $obj->SEEK($posn,$whence,$fh), $obj->TELL($fh),
+$obj->UNREAD($buffer,$fh), $obj->FLUSH($fh), $obj->SETLINEBUF($fh),
+$obj->CLEARERR($fh), $obj->ERROR($fh), $obj->EOF($fh)
+
+=item EXAMPLES
+
+=over 4
+
+=item Example - a Hexadecimal Handle
+
+=back
+
+=back
+
+=head2 PerlIO::via::QuotedPrint - PerlIO layer for quoted-printable strings
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item REQUIRED MODULES
+
+=item SEE ALSO
+
+=item ACKNOWLEDGEMENTS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Pod::Checker, podchecker() - check pod documents for syntax errors
+
+=over 4
+
+=item SYNOPSIS
+
+=item OPTIONS/ARGUMENTS
+
+=over 4
+
+=item podchecker()
+
+B<-warnings> =E<gt> I<val>
+
+=back
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item Errors
+
+empty =headn, =over on line I<N> without closing =back, =item without
+previous =over, =back without previous =over, No argument for =begin, =end
+without =begin, Nested =begin's, =for without formatter specification,
+unresolved internal link I<NAME>, Unknown command "I<CMD>", Unknown
+interior-sequence "I<SEQ>", nested commands
+I<CMD>E<lt>...I<CMD>E<lt>...E<gt>...E<gt>, garbled entity I<STRING>, Entity
+number out of range, malformed link LE<lt>E<gt>, nonempty ZE<lt>E<gt>,
+empty XE<lt>E<gt>, Spurious text after =pod / =cut, Spurious character(s)
+after =back
+
+=item Warnings
+
+multiple occurrence of link target I<name>, line containing nothing but
+whitespace in paragraph, file does not start with =head, previous =item has
+no contents, preceding non-item paragraph(s), =item type mismatch (I<one>
+vs. I<two>), I<N> unescaped C<E<lt>E<gt>> in paragraph, Unknown entity, No
+items in =over, No argument for =item, empty section in previous paragraph,
+Verbatim paragraph in NAME section, =headI<n> without preceding higher
+level
+
+=item Hyperlinks
+
+ignoring leading/trailing whitespace in link, (section) in '$page'
+deprecated, alternative text/node '%s' contains non-escaped | or /
+
+=back
+
+=item RETURN VALUE
+
+=item EXAMPLES
+
+=item INTERFACE
+
+=back
+
+C<Pod::Checker-E<gt>new( %options )>
+
+C<$checker-E<gt>poderror( @args )>, C<$checker-E<gt>poderror( {%opts},
+@args )>
+
+C<$checker-E<gt>num_errors()>
+
+C<$checker-E<gt>num_warnings()>
+
+C<$checker-E<gt>name()>
+
+C<$checker-E<gt>node()>
+
+C<$checker-E<gt>idx()>
+
+C<$checker-E<gt>hyperlink()>
+
+=over 4
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Find - find POD documents in directory trees
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item C<pod_find( { %opts } , @directories )>
+
+C<-verbose =E<gt> 1>, C<-perl =E<gt> 1>, C<-script =E<gt> 1>, C<-inc =E<gt>
+1>
+
+=back
+
+=over 4
+
+=item C<simplify_name( $str )>
+
+=back
+
+=over 4
+
+=item C<pod_where( { %opts }, $pod )>
+
+C<-inc =E<gt> 1>, C<-dirs =E<gt> [ $dir1, $dir2, ... ]>, C<-verbose =E<gt>
+1>
+
+=back
+
+=over 4
+
+=item C<contains_pod( $file , $verbose )>
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Pod::Html - module to convert pod files to HTML
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item ARGUMENTS
+
+backlink, cachedir, css, flush, header, help, hiddendirs, htmldir,
+htmlroot, index, infile, libpods, netscape, outfile, podpath, podroot,
+quiet, recurse, title, verbose
+
+=item EXAMPLE
+
+=item ENVIRONMENT
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 Pod::InputObjects - objects representing POD input paragraphs,
+commands, etc.
+
+=over 4
+
+=item SYNOPSIS
+
+=item REQUIRES
+
+=item EXPORTS
+
+=item DESCRIPTION
+
+package B<Pod::InputSource>, package B<Pod::Paragraph>, package
+B<Pod::InteriorSequence>, package B<Pod::ParseTree>
+
+=back
+
+=over 4
+
+=item B<Pod::InputSource>
+
+=back
+
+=over 4
+
+=item B<new()>
+
+=back
+
+=over 4
+
+=item B<name()>
+
+=back
+
+=over 4
+
+=item B<handle()>
+
+=back
+
+=over 4
+
+=item B<was_cutting()>
+
+=back
+
+=over 4
+
+=item B<Pod::Paragraph>
+
+=back
+
+=over 4
+
+=item Pod::Paragraph-E<gt>B<new()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<cmd_name()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<text()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<raw_text()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<cmd_prefix()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<cmd_separator()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<parse_tree()>
+
+=back
+
+=over 4
+
+=item $pod_para-E<gt>B<file_line()>
+
+=back
+
+=over 4
+
+=item B<Pod::InteriorSequence>
+
+=back
+
+=over 4
+
+=item Pod::InteriorSequence-E<gt>B<new()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<cmd_name()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<prepend()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<append()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<nested()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<raw_text()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<left_delimiter()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<right_delimiter()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<parse_tree()>
+
+=back
+
+=over 4
+
+=item $pod_seq-E<gt>B<file_line()>
+
+=back
+
+=over 4
+
+=item Pod::InteriorSequence::B<DESTROY()>
+
+=back
+
+=over 4
+
+=item B<Pod::ParseTree>
+
+=back
+
+=over 4
+
+=item Pod::ParseTree-E<gt>B<new()>
+
+=back
+
+=over 4
+
+=item $ptree-E<gt>B<top()>
+
+=back
+
+=over 4
+
+=item $ptree-E<gt>B<children()>
+
+=back
+
+=over 4
+
+=item $ptree-E<gt>B<prepend()>
+
+=back
+
+=over 4
+
+=item $ptree-E<gt>B<append()>
+
+=back
+
+=over 4
+
+=item $ptree-E<gt>B<raw_text()>
+
+=back
+
+=over 4
+
+=item Pod::ParseTree::B<DESTROY()>
+
+=back
+
+=over 4
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::LaTeX - Convert Pod data to formatted Latex
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item OBJECT METHODS
+
+C<initialize>
+
+=back
+
+=over 4
+
+=item Data Accessors
+
+B<AddPreamble>
+
+=back
+
+B<AddPostamble>
+
+B<Head1Level>
+
+B<Label>
+
+B<LevelNoNum>
+
+B<MakeIndex>
+
+B<ReplaceNAMEwithSection>
+
+B<StartWithNewPage>
+
+B<TableOfContents>
+
+B<UniqueLabels>
+
+B<UserPreamble>
+
+B<UserPostamble>
+
+B<Lists>
+
+=over 4
+
+=item Subclassed methods
+
+=back
+
+B<begin_pod>
+
+B<end_pod>
+
+B<command>
+
+B<verbatim>
+
+B<textblock>
+
+B<interior_sequence>
+
+=over 4
+
+=item List Methods
+
+B<begin_list>
+
+=back
+
+B<end_list>
+
+B<add_item>
+
+=over 4
+
+=item Methods for headings
+
+B<head>
+
+=back
+
+=over 4
+
+=item Internal methods
+
+B<_output>
+
+=back
+
+B<_replace_special_chars>
+
+B<_replace_special_chars_late>
+
+B<_create_label>
+
+B<_create_index>
+
+B<_clean_latex_commands>
+
+B<_split_delimited>
+
+=over 4
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=item REVISION
+
+=back
+
+=head2 Pod::Man - Convert POD data to formatted *roff input
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+center, date, fixed, fixedbold, fixeditalic, fixedbolditalic, name, quotes,
+release, section
+
+=item DIAGNOSTICS
+
+roff font should be 1 or 2 chars, not "%s", Invalid link %s, Invalid quote
+specification "%s", %s:%d: Unknown command paragraph "%s", %s:%d: Unknown
+escape EE<lt>%sE<gt>, %s:%d: Unknown formatting code %s, %s:%d: Unmatched
+=back
+
+=item BUGS
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::ParseLink - Parse an LE<lt>E<gt> formatting code in POD text
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::ParseUtils - helpers for POD parsing and conversion
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item Pod::List
+
+Pod::List-E<gt>new()
+
+=back
+
+$list-E<gt>file()
+
+$list-E<gt>start()
+
+$list-E<gt>indent()
+
+$list-E<gt>type()
+
+$list-E<gt>rx()
+
+$list-E<gt>item()
+
+$list-E<gt>parent()
+
+$list-E<gt>tag()
+
+=over 4
+
+=item Pod::Hyperlink
+
+Pod::Hyperlink-E<gt>new()
+
+=back
+
+$link-E<gt>parse($string)
+
+$link-E<gt>markup($string)
+
+$link-E<gt>text()
+
+$link-E<gt>warning()
+
+$link-E<gt>file(), $link-E<gt>line()
+
+$link-E<gt>page()
+
+$link-E<gt>node()
+
+$link-E<gt>alttext()
+
+$link-E<gt>type()
+
+$link-E<gt>link()
+
+=over 4
+
+=item Pod::Cache
+
+Pod::Cache-E<gt>new()
+
+=back
+
+$cache-E<gt>item()
+
+$cache-E<gt>find_page($name)
+
+=over 4
+
+=item Pod::Cache::Item
+
+Pod::Cache::Item-E<gt>new()
+
+=back
+
+$cacheitem-E<gt>page()
+
+$cacheitem-E<gt>description()
+
+$cacheitem-E<gt>path()
+
+$cacheitem-E<gt>file()
+
+$cacheitem-E<gt>nodes()
+
+$cacheitem-E<gt>find_node($name)
+
+$cacheitem-E<gt>idx()
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Pod::Parser - base class for creating POD filters and translators
+
+=over 4
+
+=item SYNOPSIS
+
+=item REQUIRES
+
+=item EXPORTS
+
+=item DESCRIPTION
+
+=item QUICK OVERVIEW
+
+=item PARSING OPTIONS
+
+B<-want_nonPODs> (default: unset), B<-process_cut_cmd> (default: unset),
+B<-warnings> (default: unset)
+
+=back
+
+=over 4
+
+=item RECOMMENDED SUBROUTINE/METHOD OVERRIDES
+
+=back
+
+=over 4
+
+=item B<command()>
+
+C<$cmd>, C<$text>, C<$line_num>, C<$pod_para>
+
+=back
+
+=over 4
+
+=item B<verbatim()>
+
+C<$text>, C<$line_num>, C<$pod_para>
+
+=back
+
+=over 4
+
+=item B<textblock()>
+
+C<$text>, C<$line_num>, C<$pod_para>
+
+=back
+
+=over 4
+
+=item B<interior_sequence()>
+
+=back
+
+=over 4
+
+=item OPTIONAL SUBROUTINE/METHOD OVERRIDES
+
+=back
+
+=over 4
+
+=item B<new()>
+
+=back
+
+=over 4
+
+=item B<initialize()>
+
+=back
+
+=over 4
+
+=item B<begin_pod()>
+
+=back
+
+=over 4
+
+=item B<begin_input()>
+
+=back
+
+=over 4
+
+=item B<end_input()>
+
+=back
+
+=over 4
+
+=item B<end_pod()>
+
+=back
+
+=over 4
+
+=item B<preprocess_line()>
+
+=back
+
+=over 4
+
+=item B<preprocess_paragraph()>
+
+=back
+
+=over 4
+
+=item METHODS FOR PARSING AND PROCESSING
+
+=back
+
+=over 4
+
+=item B<parse_text()>
+
+B<-expand_seq> =E<gt> I<code-ref>|I<method-name>, B<-expand_text> =E<gt>
+I<code-ref>|I<method-name>, B<-expand_ptree> =E<gt>
+I<code-ref>|I<method-name>
+
+=back
+
+=over 4
+
+=item B<interpolate()>
+
+=back
+
+=over 4
+
+=item B<parse_paragraph()>
+
+=back
+
+=over 4
+
+=item B<parse_from_filehandle()>
+
+=back
+
+=over 4
+
+=item B<parse_from_file()>
+
+=back
+
+=over 4
+
+=item ACCESSOR METHODS
+
+=back
+
+=over 4
+
+=item B<errorsub()>
+
+=back
+
+=over 4
+
+=item B<cutting()>
+
+=back
+
+=over 4
+
+=item B<parseopts()>
+
+=back
+
+=over 4
+
+=item B<output_file()>
+
+=back
+
+=over 4
+
+=item B<output_handle()>
+
+=back
+
+=over 4
+
+=item B<input_file()>
+
+=back
+
+=over 4
+
+=item B<input_handle()>
+
+=back
+
+=over 4
+
+=item B<input_streams()>
+
+=back
+
+=over 4
+
+=item B<top_stream()>
+
+=back
+
+=over 4
+
+=item PRIVATE METHODS AND DATA
+
+=back
+
+=over 4
+
+=item B<_push_input_stream()>
+
+=back
+
+=over 4
+
+=item B<_pop_input_stream()>
+
+=back
+
+=over 4
+
+=item TREE-BASED PARSING
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToChecker - let Perldoc check Pod for errors
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToMan - let Perldoc render Pod as man pages
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEAT
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToNroff - let Perldoc convert Pod to nroff
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEAT
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToPod - let Perldoc render Pod as ... Pod!
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToRtf - let Perldoc render Pod as RTF
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToText - let Perldoc render Pod as plaintext
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEAT
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToTk - let Perldoc use Tk::Pod to render Pod
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Perldoc::ToXml - let Perldoc render Pod as XML
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item COPYRIGHT AND DISCLAIMERS
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::PlainText - Convert POD data to formatted ASCII text
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+alt, indent, loose, sentence, width
+
+=item DIAGNOSTICS
+
+Bizarre space in item, Can't open %s for reading: %s, Unknown escape: %s,
+Unknown sequence: %s, Unmatched =back
+
+=item RESTRICTIONS
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Plainer - Perl extension for converting Pod to old style Pod.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item EXPORT
+
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Pod::Select, podselect() - extract selected sections of POD from
+input
+
+=over 4
+
+=item SYNOPSIS
+
+=item REQUIRES
+
+=item EXPORTS
+
+=item DESCRIPTION
+
+=item SECTION SPECIFICATIONS
+
+=item RANGE SPECIFICATIONS
+
+=back
+
+=over 4
+
+=item OBJECT METHODS
+
+=back
+
+=over 4
+
+=item B<curr_headings()>
+
+=back
+
+=over 4
+
+=item B<select()>
+
+=back
+
+=over 4
+
+=item B<add_selection()>
+
+=back
+
+=over 4
+
+=item B<clear_selections()>
+
+=back
+
+=over 4
+
+=item B<match_section()>
+
+=back
+
+=over 4
+
+=item B<is_selected()>
+
+=back
+
+=over 4
+
+=item EXPORTED FUNCTIONS
+
+=back
+
+=over 4
+
+=item B<podselect()>
+
+B<-output>, B<-sections>, B<-ranges>
+
+=back
+
+=over 4
+
+=item PRIVATE METHODS AND DATA
+
+=back
+
+=over 4
+
+=item B<_compile_section_spec()>
+
+=back
+
+=over 4
+
+=item $self->{_SECTION_HEADINGS}
+
+=back
+
+=over 4
+
+=item $self->{_SELECTED_SECTIONS}
+
+=back
+
+=over 4
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Text - Convert POD data to formatted ASCII text
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+alt, code, indent, loose, margin, quotes, sentence, width
+
+=item DIAGNOSTICS
+
+Bizarre space in item, Item called without tag, Can't open %s for reading:
+%s, Invalid quote specification "%s", %s:%d: Unknown command paragraph: %s,
+%s:%d: Unknown escape: %s, %s:%d: Unknown formatting code: %s, %s:%d:
+Unmatched =back
+
+=item RESTRICTIONS
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::Text::Color - Convert POD data to formatted color ASCII text
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::Text::Overstrike - Convert POD data to formatted overstrike
+text
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::Text::Termcap - Convert POD data to ASCII text with format
+escapes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Pod::Usage, pod2usage() - print a usage message from embedded pod
+documentation
+
+=over 4
+
+=item SYNOPSIS
+
+=item ARGUMENTS
+
+C<-message>, C<-msg>, C<-exitval>, C<-verbose>, C<-section>, C<-output>,
+C<-input>, C<-pathlist>, C<-noperldoc>
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=over 4
+
+=item Recommended Use
+
+=back
+
+=item CAVEATS
+
+=item AUTHOR
+
+=item ACKNOWLEDGEMENTS
+
+=back
+
+=head2 SDBM_File - Tied access to sdbm files
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item C<sdbm store returned -1, errno 22, key "..." at ...>
+
+=back
+
+=item BUGS AND WARNINGS
+
+=back
+
+=head2 Safe - Compile and execute code in restricted compartments
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+a new namespace, an operator mask
+
+=item WARNING
+
+=over 4
+
+=item RECENT CHANGES
+
+=item Methods in class Safe
+
+permit (OP, ...), permit_only (OP, ...), deny (OP, ...), deny_only (OP,
+...), trap (OP, ...), untrap (OP, ...), share (NAME, ...), share_from
+(PACKAGE, ARRAYREF), varglob (VARNAME), reval (STRING), rdo (FILENAME),
+root (NAMESPACE), mask (MASK)
+
+=item Some Safety Issues
+
+Memory, CPU, Snooping, Signals, State Changes
+
+=item AUTHOR
+
+=back
+
+=back
+
+=head2 Scalar::Util - A selection of general-utility scalar subroutines
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+blessed EXPR, dualvar NUM, STRING, isvstring EXPR, isweak EXPR,
+looks_like_number EXPR, openhandle FH, refaddr EXPR, reftype EXPR,
+set_prototype CODEREF, PROTOTYPE, tainted EXPR, weaken REF
+
+=item KNOWN BUGS
+
+=item COPYRIGHT
+
+=item BLATANT PLUG
+
+=back
+
+=head2 Search::Dict, look - search for key in dictionary file
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 SelectSaver - save and restore selected file handle
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 SelfLoader - load functions only on demand
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item The __DATA__ token
+
+=item SelfLoader autoloading
+
+=item Autoloading and package lexicals
+
+=item SelfLoader and AutoLoader
+
+=item __DATA__, __END__, and the FOOBAR::DATA filehandle.
+
+=item Classes and inherited methods.
+
+=back
+
+=item Multiple packages and fully qualified subroutine names
+
+=back
+
+=head2 Shell - run shell commands transparently within perl
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Caveats
+
+=item Escaping Magic Characters
+
+=item Configuration
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C
+socket.h defines and structure manipulators 
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+inet_aton HOSTNAME, inet_ntoa IP_ADDRESS, INADDR_ANY, INADDR_BROADCAST,
+INADDR_LOOPBACK, INADDR_NONE, sockaddr_family SOCKADDR, sockaddr_in PORT,
+ADDRESS, sockaddr_in SOCKADDR_IN, pack_sockaddr_in PORT, IP_ADDRESS,
+unpack_sockaddr_in SOCKADDR_IN, sockaddr_un PATHNAME, sockaddr_un
+SOCKADDR_UN, pack_sockaddr_un PATH, unpack_sockaddr_un SOCKADDR_UN
+
+=back
+
+=head2 Storable - persistence for Perl data structures
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item MEMORY STORE
+
+=item ADVISORY LOCKING
+
+=item SPEED
+
+=item CANONICAL REPRESENTATION
+
+=item CODE REFERENCES
+
+=item FORWARD COMPATIBILITY
+
+utf8 data, restricted hashes, files from future versions of Storable
+
+=item ERROR REPORTING
+
+=item WIZARDS ONLY
+
+=over 4
+
+=item Hooks
+
+C<STORABLE_freeze> I<obj>, I<cloning>, C<STORABLE_thaw> I<obj>, I<cloning>,
+I<serialized>, .., C<STORABLE_attach> I<class>, I<cloning>, I<serialized>
+
+=item Predicates
+
+C<Storable::last_op_in_netorder>, C<Storable::is_storing>,
+C<Storable::is_retrieving>
+
+=item Recursion
+
+=item Deep Cloning
+
+=back
+
+=item Storable magic
+
+=item EXAMPLES
+
+=item WARNING
+
+=item BUGS
+
+=over 4
+
+=item 64 bit data in perl 5.6.0 and 5.6.1
+
+=back
+
+=item CREDITS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Switch - A switch statement for Perl
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item BACKGROUND
+
+=item DESCRIPTION
+
+=over 4
+
+=item Allowing fall-through
+
+=item Automating fall-through
+
+=item Alternative syntax
+
+=item Higher-order Operations
+
+=back
+
+=item DEPENDENCIES
+
+=item AUTHOR
+
+=item BUGS
+
+=item LIMITATIONS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Symbol - manipulate Perl symbols and their names
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=back
+
+=head2 Sys::Hostname - Try every conceivable way to get hostname
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 Syslog, Sys::Syslog - Perl interface to the UNIX syslog(3) calls
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPORTS
+
+=item FUNCTIONS
+
+B<openlog($ident, $logopt, $facility)>, B<syslog($priority, $message)>,
+B<syslog($priority, $format, @args)>, B<Note>,
+B<setlogmask($mask_priority)>, B<setlogsock($sock_type)>,
+B<setlogsock($sock_type, $stream_location)> (added in 5.004_02),
+B<closelog()>
+
+=item EXAMPLES
+
+=item CONSTANTS
+
+=over 4
+
+=item Facilities
+
+=item Levels
+
+=back
+
+=item DIAGNOSTICS
+
+Invalid argument passed to setlogsock, no connection to syslog available,
+stream passed to setlogsock, but %s is not writable, stream passed to
+setlogsock, but could not find any device, tcp passed to setlogsock, but
+tcp service unavailable, syslog: expecting argument %s, syslog: invalid
+level/facility: %s, syslog: too many levels given: %s, syslog: too many
+facilities given: %s, syslog: level must be given, udp passed to
+setlogsock, but udp service unavailable, unix passed to setlogsock, but
+path not available
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item BUGS
+
+=item SUPPORT
+
+AnnoCPAN: Annotated CPAN documentation, CPAN Ratings, RT: CPAN's request
+tracker, Search CPAN
+
+=item LICENSE
+
+=back
+
+=head2 Syslog::Syslog, Sys::Syslog - Perl interface to the UNIX syslog(3)
+calls
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXPORTS
+
+=item FUNCTIONS
+
+B<openlog($ident, $logopt, $facility)>, B<syslog($priority, $message)>,
+B<syslog($priority, $format, @args)>, B<Note>,
+B<setlogmask($mask_priority)>, B<setlogsock($sock_type)>,
+B<setlogsock($sock_type, $stream_location)> (added in 5.004_02),
+B<closelog()>
+
+=item EXAMPLES
+
+=item CONSTANTS
+
+=over 4
+
+=item Facilities
+
+=item Levels
+
+=back
+
+=item DIAGNOSTICS
+
+Invalid argument passed to setlogsock, no connection to syslog available,
+stream passed to setlogsock, but %s is not writable, stream passed to
+setlogsock, but could not find any device, tcp passed to setlogsock, but
+tcp service unavailable, syslog: expecting argument %s, syslog: invalid
+level/facility: %s, syslog: too many levels given: %s, syslog: too many
+facilities given: %s, syslog: level must be given, udp passed to
+setlogsock, but udp service unavailable, unix passed to setlogsock, but
+path not available
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item BUGS
+
+=item SUPPORT
+
+AnnoCPAN: Annotated CPAN documentation, CPAN Ratings, RT: CPAN's request
+tracker, Search CPAN
+
+=item LICENSE
+
+=back
+
+=head2 Term::ANSIColor - Color screen output using ANSI escape sequences
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+Bad escape sequence %s, Bareword "%s" not allowed while "strict subs" in
+use, Invalid attribute name %s, Name "%s" used only once: possible typo, No
+comma allowed after filehandle, No name for escape sequence %s
+
+=item ENVIRONMENT
+
+ANSI_COLORS_DISABLED
+
+=item RESTRICTIONS
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Term::Cap - Perl termcap interface
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item METHODS
+
+=back
+
+=back
+
+B<Tgetent>, OSPEED, TERM
+
+B<Tpad>, B<$string>, B<$cnt>, B<$FH>
+
+B<Tputs>, B<$cap>, B<$cnt>, B<$FH>
+
+B<Tgoto>, B<$cap>, B<$col>, B<$row>, B<$FH>
+
+B<Trequire>
+
+=over 4
+
+=item EXAMPLES
+
+=item COPYRIGHT AND LICENSE
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Term::Complete - Perl word completion module
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+E<lt>tabE<gt>, ^D, ^U, E<lt>delE<gt>, E<lt>bsE<gt>
+
+=item DIAGNOSTICS
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 Term::ReadLine - Perl interface to various C<readline> packages.
+If no real package is found, substitutes stubs instead of basic functions.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Minimal set of supported functions
+
+C<ReadLine>, C<new>, C<readline>, C<addhistory>, C<IN>, C<OUT>, C<MinLine>,
+C<findConsole>, Attribs, C<Features>
+
+=item Additional supported functions
+
+C<tkRunning>, C<ornaments>, C<newTTY>
+
+=item EXPORTS
+
+=item ENVIRONMENT
+
+=item CAVEATS
+
+=back
+
+=head2 Test - provides a simple framework for writing test scripts
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item QUICK START GUIDE
+
+=over 4
+
+=item Functions
+
+C<plan(...)>, C<tests =E<gt> I<number>>, C<todo =E<gt> [I<1,5,14>]>,
+C<onfail =E<gt> sub { ... }>, C<onfail =E<gt> \&some_sub>
+
+=back
+
+=back
+
+B<_to_value>
+
+C<ok(...)>
+
+C<skip(I<skip_if_true>, I<args...>)>
+
+=over 4
+
+=item TEST TYPES
+
+NORMAL TESTS, SKIPPED TESTS, TODO TESTS
+
+=item ONFAIL
+
+=item BUGS and CAVEATS
+
+=item ENVIRONMENT
+
+=item NOTE
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Test::Builder - Backend for building test libraries
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Construction
+
+B<new>
+
+=back
+
+=back
+
+B<create>
+
+B<reset>
+
+=over 4
+
+=item Setting up tests
+
+B<exported_to>
+
+=back
+
+B<plan>
+
+B<expected_tests>
+
+B<no_plan>
+
+B<has_plan>
+
+B<skip_all>
+
+=over 4
+
+=item Running tests
+
+B<ok>
+
+=back
+
+B<is_eq>, B<is_num>
+
+B<isnt_eq>, B<isnt_num>
+
+B<like>, B<unlike>
+
+B<maybe_regex>
+
+B<cmp_ok>
+
+B<BAIL_OUT>
+
+B<skip>
+
+B<todo_skip>
+
+B<skip_rest>
+
+=over 4
+
+=item Test style
+
+B<level>
+
+=back
+
+B<use_numbers>
+
+B<no_diag>, B<no_ending>, B<no_header>
+
+=over 4
+
+=item Output
+
+B<diag>
+
+=back
+
+B<_print>
+
+B<_print_diag>
+
+B<output>, B<failure_output>, B<todo_output>
+
+=over 4
+
+=item Test Status and Info
+
+B<current_test>
+
+=back
+
+B<summary>
+
+B<details>
+
+B<todo>
+
+B<caller>
+
+B<_sanity_check>
+
+B<_whoa>
+
+B<_my_exit>
+
+=over 4
+
+=item EXIT CODES
+
+=item THREADS
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test::Builder::Module - Base class for test modules
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Importing
+
+=back
+
+=back
+
+=over 4
+
+=item Builder
+
+=back
+
+=head2 Test::Builder::Tester - test testsuites that have been built with
+Test::Builder
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item Methods
+
+test_out, test_err
+
+=back
+
+test_fail
+
+test_diag
+
+test_test, title (synonym 'name', 'label'), skip_out, skip_err
+
+line_num
+
+color
+
+=over 4
+
+=item BUGS
+
+=item AUTHOR
+
+=item NOTES
+
+=item SEE ALSO
+
+=back
+
+=head2 Test::Builder::Tester::Color - turn on colour in
+Test::Builder::Tester
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Test::Harness - Run Perl standard test scripts with statistics
+
+=over 4
+
+=item VERSION
+
+=back
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Taint mode
+
+=item Configuration variables.
+
+C<$Test::Harness::Verbose>, C<$Test::Harness::switches>,
+C<$Test::Harness::Timer>
+
+=item Failure
+
+B<Failed Test>, B<Stat>, B<Wstat>, B<Total>, B<Fail>, B<Failed>, B<List of
+Failed>
+
+=item Functions
+
+B<runtests>
+
+=back
+
+=back
+
+B<_all_ok>
+
+B<_globdir>
+
+B<_run_all_tests>
+
+B<_mk_leader>
+
+B<_leader_width>
+
+=over 4
+
+=item EXPORT
+
+=item DIAGNOSTICS
+
+C<All tests successful.\nFiles=%d,  Tests=%d, %s>, C<FAILED tests
+%s\n\tFailed %d/%d tests, %.2f%% okay.>, C<Test returned status %d (wstat
+%d)>, C<Failed 1 test, %.2f%% okay. %s>, C<Failed %d/%d tests, %.2f%% okay.
+%s>, C<FAILED--Further testing stopped: %s>
+
+=item ENVIRONMENT VARIABLES THAT TEST::HARNESS SETS
+
+C<HARNESS_ACTIVE>, C<HARNESS_VERSION>
+
+=item ENVIRONMENT VARIABLES THAT AFFECT TEST::HARNESS
+
+C<HARNESS_COLUMNS>, C<HARNESS_COMPILE_TEST>, C<HARNESS_DEBUG>,
+C<HARNESS_FILELEAK_IN_DIR>, C<HARNESS_IGNORE_EXITCODE>, C<HARNESS_NOTTY>,
+C<HARNESS_PERL>, C<HARNESS_PERL_SWITCHES>, C<HARNESS_VERBOSE>
+
+=item EXAMPLE
+
+=item SEE ALSO
+
+=item TODO
+
+=item BUGS
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test::Harness::Assert - simple assert
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+=over 4
+
+=item C<assert()>
+
+=back
+
+=back
+
+=over 4
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Test::Harness::Iterator - Internal Test::Harness Iterator
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item new()
+
+=item next()
+
+=back
+
+=back
+
+=head2 Test::Harness::Point - object for tracking a single test point
+
+=over 4
+
+=item SYNOPSIS
+
+=item CONSTRUCTION
+
+=over 4
+
+=item new()
+
+=back
+
+=back
+
+=over 4
+
+=item from_test_line( $line )
+
+=back
+
+=over 4
+
+=item ACCESSORS
+
+ok, number
+
+=back
+
+=head2 Test::Harness::Straps - detailed analysis of test results
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTION
+
+=over 4
+
+=item new()
+
+=back
+
+=back
+
+=over 4
+
+=item $strap->_init
+
+=back
+
+=over 4
+
+=item ANALYSIS
+
+=over 4
+
+=item $strap->analyze( $name, \@output_lines )
+
+=back
+
+=back
+
+=over 4
+
+=item $strap->analyze_fh( $name, $test_filehandle )
+
+=back
+
+=over 4
+
+=item $strap->analyze_file( $test_file )
+
+=back
+
+=over 4
+
+=item $strap->_command_line( $file )
+
+=back
+
+=over 4
+
+=item $strap->_command()
+
+=back
+
+=over 4
+
+=item $strap->_switches( $file )
+
+=back
+
+=over 4
+
+=item $strap->_cleaned_switches( @switches_from_user )
+
+=back
+
+=over 4
+
+=item $strap->_INC2PERL5LIB
+
+=back
+
+=over 4
+
+=item $strap->_filtered_INC()
+
+=back
+
+=over 4
+
+=item $strap->_restore_PERL5LIB()
+
+=back
+
+=over 4
+
+=item Parsing
+
+=over 4
+
+=item C<_is_diagnostic>
+
+=back
+
+=back
+
+=over 4
+
+=item C<_is_header>
+
+=back
+
+=over 4
+
+=item C<_is_bail_out>
+
+=back
+
+=over 4
+
+=item C<_reset_file_state>
+
+=back
+
+=over 4
+
+=item Results
+
+=item EXAMPLES
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Test::Harness::TAP - Documentation for the TAP format
+
+=over 4
+
+=item SYNOPSIS
+
+=item TODO
+
+=item THE TAP FORMAT
+
+=item HARNESS BEHAVIOR
+
+=item TESTS LINES AND THE PLAN
+
+=over 4
+
+=item The plan
+
+=item The test line
+
+C<ok> or C<not ok>, Test number, Description, Directive, ok/not ok
+(required), Test number (recommended), Description (recommended), Directive
+(only when necessary)
+
+=back
+
+=item DIRECTIVES
+
+=over 4
+
+=item TODO tests
+
+=item Skipping tests
+
+=back
+
+=item OTHER LINES
+
+=over 4
+
+=item Bail out!
+
+=item Diagnostics
+
+=item Anything else
+
+=back
+
+=item EXAMPLES
+
+=over 4
+
+=item Common with explanation
+
+=item Unknown amount and failures
+
+=item Giving up
+
+=item Skipping a few
+
+=item Skipping everything
+
+=item Got spare tuits?
+
+=item Creative liberties
+
+=back
+
+=item AUTHORS
+
+=item ACKNOWLEDGEMENTS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test::More - yet another framework for writing test scripts
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item I love it when a plan comes together
+
+=back
+
+=back
+
+=over 4
+
+=item Test names
+
+=item I'm ok, you're not ok.
+
+B<ok>
+
+=back
+
+B<is>, B<isnt>
+
+B<like>
+
+B<unlike>
+
+B<cmp_ok>
+
+B<can_ok>
+
+B<isa_ok>
+
+B<pass>, B<fail>
+
+=over 4
+
+=item Module tests
+
+B<use_ok>
+
+=back
+
+B<require_ok>
+
+=over 4
+
+=item Complex data structures
+
+B<is_deeply>
+
+=back
+
+=over 4
+
+=item Diagnostics
+
+B<diag>
+
+=back
+
+=over 4
+
+=item Conditional tests
+
+B<SKIP: BLOCK>
+
+=back
+
+B<TODO: BLOCK>, B<todo_skip>
+
+When do I use SKIP vs. TODO?
+
+=over 4
+
+=item Test control
+
+B<BAIL_OUT>
+
+=back
+
+=over 4
+
+=item Discouraged comparison functions
+
+B<eq_array>
+
+=back
+
+B<eq_hash>
+
+B<eq_set>
+
+=over 4
+
+=item Extending and Embedding Test::More
+
+B<builder>
+
+=back
+
+=over 4
+
+=item EXIT CODES
+
+=item CAVEATS and NOTES
+
+Backwards compatibility, Overloaded objects, Threads, Test::Harness upgrade
+
+=item HISTORY
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item BUGS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test::Simple - Basic utilities for writing tests.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<ok>
+
+=back
+
+=over 4
+
+=item EXAMPLE
+
+=item CAVEATS
+
+=item NOTES
+
+=item HISTORY
+
+=item SEE ALSO
+
+L<Test::More>, L<Test>, L<Test::Unit>, L<Test::Inline>, L<SelfTest>,
+L<Test::Harness>
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Test::Tutorial - A tutorial about writing really basic tests
+
+=over 4
+
+=item DESCRIPTION
+
+=over 4
+
+=item Nuts and bolts of testing.
+
+=item Where to start?
+
+=item Names
+
+=item Test the manual
+
+=item Sometimes the tests are wrong
+
+=item Testing lots of values
+
+=item Informative names
+
+=item Skipping tests
+
+=item Todo tests
+
+=item Testing with taint mode.
+
+=back
+
+=item FOOTNOTES
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Text::Abbrev, abbrev - create an abbreviation table from a list
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLE
+
+=back
+
+=head2 Text::Balanced - Extract delimited text sequences from strings.
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item General behaviour in list contexts
+
+[0], [1], [2]
+
+=item General behaviour in scalar and void contexts
+
+=item A note about prefixes
+
+=item C<extract_delimited>
+
+=item C<extract_bracketed>
+
+=item C<extract_variable>
+
+[0], [1], [2]
+
+=item C<extract_tagged>
+
+C<reject =E<gt> $listref>, C<ignore =E<gt> $listref>, C<fail =E<gt> $str>,
+[0], [1], [2], [3], [4], [5]
+
+=item C<gen_extract_tagged>
+
+=item C<extract_quotelike>
+
+[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10]
+
+=item C<extract_quotelike> and "here documents"
+
+[0], [1], [2], [3], [4], [5], [6], [7..10]
+
+=item C<extract_codeblock>
+
+=item C<extract_multiple>
+
+=item C<gen_delimited_pat>
+
+=back
+
+=item DIAGNOSTICS
+
+ C<Did not find a suitable bracket: "%s">,  C<Did not find prefix: /%s/>, 
+C<Did not find opening bracket after prefix: "%s">,  C<No quotelike
+operator found after prefix: "%s">,  C<Unmatched closing bracket: "%c">, 
+C<Unmatched opening bracket(s): "%s">, C<Unmatched embedded quote (%s)>,
+C<Did not find closing delimiter to match '%s'>,  C<Mismatched closing
+bracket: expected "%c" but found "%s">,  C<No block delimiter found after
+quotelike "%s">, C<Did not find leading dereferencer>, C<Bad identifier
+after dereferencer>, C<Did not find expected opening bracket at %s>,
+C<Improperly nested codeblock at %s>,  C<Missing second block for quotelike
+"%s">, C<No match found for opening bracket>, C<Did not find opening tag:
+/%s/>, C<Unable to construct closing tag to match: /%s/>, C<Found invalid
+nested tag: %s>, C<Found unbalanced nested tag: %s>, C<Did not find closing
+tag>
+
+=item AUTHOR
+
+=item BUGS AND IRRITATIONS
+
+=item COPYRIGHT
+
+=back
+
+=head2 Text::ParseWords - parse text into an array of tokens or array of
+arrays
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item AUTHORS
+
+=back
+
+=head2 Text::Soundex - Implementation of the Soundex Algorithm as Described
+by Knuth
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=item LIMITATIONS
+
+=item AUTHOR
+
+=back
+
+=head2 Text::Tabs -- expand and unexpand tabs per the unix expand(1) and
+unexpand(1)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item LICENSE
+
+=back
+
+=head2 Text::Wrap - line wrapping to form simple paragraphs
+
+=over 4
+
+=item SYNOPSIS 
+
+=item DESCRIPTION
+
+=item OVERRIDES
+
+=item EXAMPLE
+
+=item LICENSE
+
+=back
+
+=head2 Thread - manipulate threads in Perl (for old code only)
+
+=over 4
+
+=item CAVEAT
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS
+
+$thread = Thread->new(\&start_sub), $thread = Thread->new(\&start_sub,
+LIST), lock VARIABLE, async BLOCK;, Thread->self, cond_wait VARIABLE,
+cond_signal VARIABLE, cond_broadcast VARIABLE, yield
+
+=item METHODS
+
+join, eval, detach, equal, tid, flags, done
+
+=item LIMITATIONS
+
+=item SEE ALSO
+
+=back
+
+=head2 Thread::Queue - thread-safe queues
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS AND METHODS
+
+new, enqueue LIST, dequeue, dequeue_nb, pending
+
+=item SEE ALSO
+
+=back
+
+=head2 Thread::Semaphore - thread-safe semaphores
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item FUNCTIONS AND METHODS
+
+new, new NUMBER, down, down NUMBER, up, up NUMBER
+
+=back
+
+=head2 Thread::Signal - Start a thread which runs signal handlers reliably
+(for old code)
+
+=over 4
+
+=item CAVEAT
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=back
+
+=head2 Thread::Specific - thread-specific keys
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 Tie::Array - base class for tied arrays
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+TIEARRAY classname, LIST, STORE this, index, value, FETCH this, index,
+FETCHSIZE this, STORESIZE this, count, EXTEND this, count, EXISTS this,
+key, DELETE this, key, CLEAR this, DESTROY this, PUSH this, LIST, POP this,
+SHIFT this, UNSHIFT this, LIST, SPLICE this, offset, length, LIST
+
+=item CAVEATS
+
+=item AUTHOR
+
+=back
+
+=head2 Tie::File - Access the lines of a disk file via a Perl array
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item C<recsep>
+
+=item C<autochomp>
+
+=item C<mode>
+
+=item C<memory>
+
+=item C<dw_size>
+
+=item Option Format
+
+=back
+
+=item Public Methods
+
+=over 4
+
+=item C<flock>
+
+=item C<autochomp>
+
+=item C<defer>, C<flush>, C<discard>, and C<autodefer>
+
+=item C<offset>
+
+=back
+
+=item Tying to an already-opened filehandle
+
+=item Deferred Writing
+
+=over 4
+
+=item Autodeferring
+
+=back
+
+=item CONCURRENT ACCESS TO FILES
+
+=item CAVEATS
+
+=item SUBCLASSING
+
+=item WHAT ABOUT C<DB_File>?
+
+=item AUTHOR
+
+=item LICENSE
+
+=item WARRANTY
+
+=item THANKS
+
+=item TODO
+
+=back
+
+=head2 Tie::Handle, Tie::StdHandle  - base class definitions for tied
+handles
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+TIEHANDLE classname, LIST, WRITE this, scalar, length, offset, PRINT this,
+LIST, PRINTF this, format, LIST, READ this, scalar, length, offset,
+READLINE this, GETC this, CLOSE this, OPEN this, filename, BINMODE this,
+EOF this, TELL this, SEEK this, offset, whence, DESTROY this
+
+=item MORE INFORMATION
+
+=item COMPATIBILITY
+
+=back
+
+=head2 Tie::Hash, Tie::StdHash, Tie::ExtraHash - base class definitions for
+tied hashes
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+TIEHASH classname, LIST, STORE this, key, value, FETCH this, key, FIRSTKEY
+this, NEXTKEY this, lastkey, EXISTS this, key, DELETE this, key, CLEAR
+this, SCALAR this
+
+=item Inheriting from B<Tie::StdHash>
+
+=item Inheriting from B<Tie::ExtraHash>
+
+=item C<SCALAR>, C<UNTIE> and C<DESTROY>
+
+=item MORE INFORMATION
+
+=back
+
+=head2 Tie::Memoize - add data to hash when needed
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item Inheriting from B<Tie::Memoize>
+
+=item EXAMPLE
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 Tie::RefHash - use references as hash keys
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLE
+
+=item AUTHOR
+
+=item VERSION
+
+=item SEE ALSO
+
+=back
+
+=head2 Tie::Scalar, Tie::StdScalar - base class definitions for tied
+scalars
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+TIESCALAR classname, LIST, FETCH this, STORE this, value, DESTROY this
+
+=item MORE INFORMATION
+
+=back
+
+=head2 Tie::SubstrHash - Fixed-table-size, fixed-key-length hashing
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEATS
+
+=back
+
+=head2 Time::HiRes - High resolution alarm, sleep, gettimeofday, interval
+timers
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+gettimeofday (), usleep ( $useconds ), nanosleep ( $nanoseconds ), ualarm (
+$useconds [, $interval_useconds ] ), tv_interval, time (), sleep (
+$floating_seconds ), alarm ( $floating_seconds [,
+$interval_floating_seconds ] ), setitimer ( $which, $floating_seconds [,
+$interval_floating_seconds ] ), getitimer ( $which ), clock_gettime (
+$which ), clock_getres ( $which ), clock_nanosleep ( $which, $seconds,
+$flags = 0), clock()
+
+=item EXAMPLES
+
+=item C API
+
+=item DIAGNOSTICS
+
+=over 4
+
+=item negative time not invented yet
+
+=item internal error: useconds < 0 (unsigned ... signed ...)
+
+=back
+
+=item CAVEATS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT AND LICENSE
+
+=back
+
+=head2 Time::Local - efficiently compute time from local and GMT time
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Ambiguous Local Times (DST)
+
+=item Non-Existent Local Times (DST)
+
+=item Negative Epoch Values
+
+=back
+
+=item IMPLEMENTATION
+
+=item BUGS
+
+=item SUPPORT
+
+=item AUTHOR
+
+=back
+
+=head2 Time::gmtime - by-name interface to Perl's built-in gmtime()
+function
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Time::localtime - by-name interface to Perl's built-in localtime()
+function
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 Time::tm - internal object used by Time::gmtime and Time::localtime
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 UNIVERSAL - base class for ALL classes (blessed references)
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<< $obj->isa( TYPE ) >>, C<< CLASS->isa( TYPE ) >>, C<isa( VAL, TYPE )>,
+C<TYPE>, C<$obj>, C<CLASS>, C<VAL>, C<< $obj->can( METHOD ) >>, C<<
+CLASS->can( METHOD ) >>, C<can( VAL, METHOD )>, C<VERSION ( [ REQUIRE ] )>
+
+=item EXPORTS
+
+=back
+
+=head2 Unicode::Collate - Unicode Collation Algorithm
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Constructor and Tailoring
+
+UCA_Version, alternate, backwards, entry, hangul_terminator, ignoreChar,
+ignoreName, katakana_before_hiragana, level, normalization, overrideCJK,
+overrideHangul, preprocess, rearrange, table, undefChar, undefName,
+upper_before_lower, variable
+
+=item Methods for Collation
+
+C<@sorted = $Collator-E<gt>sort(@not_sorted)>, C<$result =
+$Collator-E<gt>cmp($a, $b)>, C<$result = $Collator-E<gt>eq($a, $b)>,
+C<$result = $Collator-E<gt>ne($a, $b)>, C<$result = $Collator-E<gt>lt($a,
+$b)>, C<$result = $Collator-E<gt>le($a, $b)>, C<$result =
+$Collator-E<gt>gt($a, $b)>, C<$result = $Collator-E<gt>ge($a, $b)>,
+C<$sortKey = $Collator-E<gt>getSortKey($string)>, C<$sortKeyForm =
+$Collator-E<gt>viewSortKey($string)>
+
+=item Methods for Searching
+
+C<$position = $Collator-E<gt>index($string, $substring[, $position])>,
+C<($position, $length) = $Collator-E<gt>index($string, $substring[,
+$position])>, C<$match_ref = $Collator-E<gt>match($string, $substring)>,
+C<($match)   = $Collator-E<gt>match($string, $substring)>, C<@match =
+$Collator-E<gt>gmatch($string, $substring)>, C<$count =
+$Collator-E<gt>subst($string, $substring, $replacement)>, C<$count =
+$Collator-E<gt>gsubst($string, $substring, $replacement)>
+
+=item Other Methods
+
+C<%old_tailoring = $Collator-E<gt>change(%new_tailoring)>, C<$version =
+$Collator-E<gt>version()>, C<UCA_Version()>, C<Base_Unicode_Version()>
+
+=back
+
+=item EXPORT
+
+=item INSTALL
+
+=item CAVEATS
+
+Normalization, Conformance Test
+
+=item AUTHOR, COPYRIGHT AND LICENSE
+
+=item SEE ALSO
+
+Unicode Collation Algorithm - UTS #10, The Default Unicode Collation
+Element Table (DUCET), The conformance test for the UCA, Hangul Syllable
+Type, Unicode Normalization Forms - UAX #15
+
+=back
+
+=head2 Unicode::Normalize - Unicode Normalization Forms
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Normalization Forms
+
+C<$NFD_string = NFD($string)>, C<$NFC_string = NFC($string)>,
+C<$NFKD_string = NFKD($string)>, C<$NFKC_string = NFKC($string)>,
+C<$FCD_string = FCD($string)>, C<$FCC_string = FCC($string)>,
+C<$normalized_string = normalize($form_name, $string)>
+
+=item Decomposition and Composition
+
+C<$decomposed_string = decompose($string)>, C<$decomposed_string =
+decompose($string, $useCompatMapping)>, C<$reordered_string  =
+reorder($string)>, C<$composed_string	= compose($string)>
+
+=item Quick Check
+
+C<$result = checkNFD($string)>, C<$result = checkNFC($string)>, C<$result =
+checkNFKD($string)>, C<$result = checkNFKC($string)>, C<$result =
+checkFCD($string)>, C<$result = checkFCC($string)>, C<$result =
+check($form_name, $string)>
+
+=item Character Data
+
+C<$canonical_decomposed = getCanon($codepoint)>,
+C<$compatibility_decomposed = getCompat($codepoint)>,
+C<$codepoint_composite = getComposite($codepoint_here, $codepoint_next)>,
+C<$combining_class = getCombinClass($codepoint)>, C<$is_exclusion =
+isExclusion($codepoint)>, C<$is_singleton = isSingleton($codepoint)>,
+C<$is_non_starter_decomposition = isNonStDecomp($codepoint)>,
+C<$may_be_composed_with_prev_char = isComp2nd($codepoint)>
+
+=back
+
+=item EXPORT
+
+=item CAVEATS
+
+Perl's version vs. Unicode version, Correction of decomposition mapping,
+Revised definition of canonical composition
+
+=item AUTHOR
+
+=item SEE ALSO
+
+http://www.unicode.org/reports/tr15/,
+http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt,
+http://www.unicode.org/Public/UNIDATA/NormalizationCorrections.txt,
+http://www.unicode.org/review/pr-29.html, http://www.unicode.org/notes/tn5/
+
+=back
+
+=head2 Unicode::UCD - Unicode character database
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over 4
+
+=item charinfo
+
+=back
+
+=over 4
+
+=item charblock
+
+=back
+
+=over 4
+
+=item charscript
+
+=back
+
+=over 4
+
+=item charblocks
+
+=back
+
+=over 4
+
+=item charscripts
+
+=back
+
+=over 4
+
+=item Blocks versus Scripts
+
+=item Matching Scripts and Blocks
+
+=item Code Point Arguments
+
+=item charinrange
+
+=back
+
+=over 4
+
+=item compexcl
+
+=back
+
+=over 4
+
+=item casefold
+
+=back
+
+=over 4
+
+=item casespec
+
+=back
+
+=over 4
+
+=item namedseq()
+
+=back
+
+=over 4
+
+=item Unicode::UCD::UnicodeVersion
+
+=back
+
+=over 4
+
+=item Implementation Note
+
+=back
+
+=over 4
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
+=head2 User::grent - by-name interface to Perl's built-in getgr*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item NOTE
+
+=item AUTHOR
+
+=back
+
+=head2 User::pwent - by-name interface to Perl's built-in getpw*()
+functions
+
+=over 4
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item System Specifics
+
+=back
+
+=item NOTE
+
+=item AUTHOR
+
+=item HISTORY
+
+March 18th, 2000
+
+=back
+
+=head2 XSLoader - Dynamically load C libraries into Perl code
+
+=over 4
+
+=item VERSION
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over 4
+
+=item Migration from C<DynaLoader>
+
+=item Backward compatible boilerplate
+
+=back
+
+=item Order of initialization: early load()
+
+=over 4
+
+=item The most hairy case
+
+=back
+
+=item DIAGNOSTICS
+
+Can't find '%s' symbol in %s, Can't load '%s' for module %s: %s, Undefined
+symbols present after loading %s: %s, XSLoader::load('Your::Module',
+$Your::Module::VERSION)
+
+=item LIMITATIONS
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHORS
+
+=item COPYRIGHT
+
+=back
+
+=head1 AUXILIARY DOCUMENTATION
+
+Here should be listed all the extra programs' documentation, but they
+don't all have manual pages yet:
+
+=over 4
+
+=item a2p
+
+=item c2ph
+
+=item dprofpp
+
+=item h2ph
+
+=item h2xs
+
+=item perlbug
+
+=item perldoc
+
+=item pl2pm
+
+=item pod2html
+
+=item pod2man
+
+=item s2p
+
+=item splain
+
+=item xsubpp
+
+=back
+
+=head1 AUTHOR
+
+Larry Wall <F<larry@wall.org>>, with the help of oodles
+of other folks.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perltodo.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perltodo.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perltodo.pod	(revision 14489)
@@ -0,0 +1,667 @@
+=head1 NAME
+
+perltodo - Perl TO-DO List
+
+=head1 DESCRIPTION
+
+This is a list of wishes for Perl. The tasks we think are smaller or easier
+are listed first. Anyone is welcome to work on any of these, but it's a good
+idea to first contact I<perl5-porters@perl.org> to avoid duplication of
+effort. By all means contact a pumpking privately first if you prefer.
+
+Whilst patches to make the list shorter are most welcome, ideas to add to
+the list are also encouraged. Check the perl5-porters archives for past
+ideas, and any discussion about them. One set of archives may be found at:
+
+    http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/
+
+What can we offer you in return? Fame, fortune, and everlasting glory? Maybe
+not, but if your patch is incorporated, then we'll add your name to the
+F<AUTHORS> file, which ships in the official distribution. How many other
+programming languages offer you 1 line of immortality?
+
+=head1 The roadmap to 5.10
+
+The roadmap to 5.10 envisages feature based releases, as various items in this
+TODO are completed.
+
+=head2 Needed for a 5.9.4 release
+
+=over
+
+=item *
+
+Review assertions. Review syntax to combine assertions. Assertions could take
+advantage of the lexical pragmas work. L</What hooks would assertions need?>
+
+=back
+
+=head2 Needed for a 5.9.5 release
+
+=over
+
+=item *
+Implement L</_ prototype character>
+
+=item *
+Implement L</state variables>
+
+=back
+
+=head2 Needed for a 5.9.6 release
+
+Stabilisation. If all goes well, this will be the equivalent of a 5.10-beta.
+
+=head1 Tasks that only need Perl knowledge
+
+=head2 common test code for timed bail out
+
+Write portable self destruct code for tests to stop them burning CPU in
+infinite loops. This needs to avoid using alarm, as some of the tests are
+testing alarm/sleep or timers.
+
+=head2 POD -> HTML conversion in the core still sucks
+
+Which is crazy given just how simple POD purports to be, and how simple HTML
+can be. It's not actually I<as> simple as it sounds, particularly with the
+flexibility POD allows for C<=item>, but it would be good to improve the
+visual appeal of the HTML generated, and to avoid it having any validation
+errors. See also L</make HTML install work>, as the layout of installation tree
+is needed to improve the cross-linking.
+
+The addition of C<Pod::Simple> and its related modules may make this task
+easier to complete.
+
+=head2 Parallel testing
+
+The core regression test suite is getting ever more comprehensive, which has
+the side effect that it takes longer to run. This isn't so good. Investigate
+whether it would be feasible to give the harness script the B<option> of
+running sets of tests in parallel. This would be useful for tests in
+F<t/op/*.t> and F<t/uni/*.t> and maybe some sets of tests in F<lib/>.
+
+Questions to answer
+
+=over 4
+
+=item 1
+
+How does screen layout work when you're running more than one test?
+
+=item 2
+
+How does the caller of test specify how many tests to run in parallel?
+
+=item 3
+
+How do setup/teardown tests identify themselves?
+
+=back
+
+Pugs already does parallel testing - can their approach be re-used?
+
+=head2 Make Schwern poorer
+
+We should have for everything. When all the core's modules are tested,
+Schwern has promised to donate to $500 to TPF. We may need volunteers to
+hold him upside down and shake vigorously in order to actually extract the
+cash.
+
+See F<t/lib/1_compile.t> for the 3 remaining modules that need tests.
+
+=head2 Improve the coverage of the core tests
+
+Use Devel::Cover to ascertain the core's test coverage, then add tests that
+are currently missing.
+
+=head2 test B
+
+A full test suite for the B module would be nice.
+
+=head2 A decent benchmark
+
+C<perlbench> seems impervious to any recent changes made to the perl core. It
+would be useful to have a reasonable general benchmarking suite that roughly
+represented what current perl programs do, and measurably reported whether
+tweaks to the core improve, degrade or don't really affect performance, to
+guide people attempting to optimise the guts of perl. Gisle would welcome
+new tests for perlbench.
+
+=head2 fix tainting bugs
+
+Fix the bugs revealed by running the test suite with the C<-t> switch (via
+C<make test.taintwarn>).
+
+=head2 Dual life everything
+
+As part of the "dists" plan, anything that doesn't belong in the smallest perl
+distribution needs to be dual lifed. Anything else can be too. Figure out what
+changes would be needed to package that module and its tests up for CPAN, and
+do so. Test it with older perl releases, and fix the problems you find.
+
+=head2 Improving C<threads::shared>
+
+Investigate whether C<threads::shared> could share aggregates properly with
+only Perl level changes to shared.pm
+
+=head2 POSIX memory footprint
+
+Ilya observed that use POSIX; eats memory like there's no tomorrow, and at
+various times worked to cut it down. There is probably still fat to cut out -
+for example POSIX passes Exporter some very memory hungry data structures.
+
+
+
+
+
+
+
+=head1 Tasks that need a little sysadmin-type knowledge
+
+Or if you prefer, tasks that you would learn from, and broaden your skills
+base...
+
+=head2 Relocatable perl
+
+The C level patches needed to create a relocatable perl binary are done, as
+is the work on F<Config.pm>. All that's left to do is the C<Configure> tweaking
+to let people specify how they want to do the install.
+
+=head2 make HTML install work
+
+There is an C<installhtml> target in the Makefile. It's marked as
+"experimental". It would be good to get this tested, make it work reliably, and
+remove the "experimental" tag. This would include
+
+=over 4
+
+=item 1
+
+Checking that cross linking between various parts of the documentation works.
+In particular that links work between the modules (files with POD in F<lib/>)
+and the core documentation (files in F<pod/>)
+
+=item 2
+
+Work out how to split C<perlfunc> into chunks, preferably one per function
+group, preferably with general case code that could be used elsewhere.
+Challenges here are correctly identifying the groups of functions that go
+together, and making the right named external cross-links point to the right
+page. Things to be aware of are C<-X>, groups such as C<getpwnam> to
+C<endservent>, two or more C<=items> giving the different parameter lists, such
+as
+
+    =item substr EXPR,OFFSET,LENGTH,REPLACEMENT
+    
+    =item substr EXPR,OFFSET,LENGTH
+    
+    =item substr EXPR,OFFSET
+
+and different parameter lists having different meanings. (eg C<select>)
+
+=back
+
+=head2 compressed man pages
+
+Be able to install them. This would probably need a configure test to see how
+the system does compressed man pages (same directory/different directory?
+same filename/different filename), as well as tweaking the F<installman> script
+to compress as necessary.
+
+=head2 Add a code coverage target to the Makefile
+
+Make it easy for anyone to run Devel::Cover on the core's tests. The steps
+to do this manually are roughly
+
+=over 4
+
+=item *
+
+do a normal C<Configure>, but include Devel::Cover as a module to install
+(see F<INSTALL> for how to do this)
+
+=item *
+
+    make perl
+
+=item *
+
+    cd t; HARNESS_PERL_SWITCHES=-MDevel::Cover ./perl -I../lib harness
+
+=item *
+
+Process the resulting Devel::Cover database
+
+=back
+
+This just give you the coverage of the F<.pm>s. To also get the C level
+coverage you need to
+
+=over 4
+
+=item *
+
+Additionally tell C<Configure> to use the appropriate C compiler flags for
+C<gcov>
+
+=item *
+
+    make perl.gcov
+
+(instead of C<make perl>)
+
+=item *
+
+After running the tests run C<gcov> to generate all the F<.gcov> files.
+(Including down in the subdirectories of F<ext/>
+
+=item *
+
+(From the top level perl directory) run C<gcov2perl> on all the C<.gcov> files
+to get their stats into the cover_db directory.
+
+=item *
+
+Then process the Devel::Cover database
+
+=back
+
+It would be good to add a single switch to C<Configure> to specify that you
+wanted to perform perl level coverage, and another to specify C level
+coverage, and have C<Configure> and the F<Makefile> do all the right things
+automatically.
+
+=head2 Make Config.pm cope with differences between build and installed perl
+
+Quite often vendors ship a perl binary compiled with their (pay-for)
+compilers.  People install a free compiler, such as gcc. To work out how to
+build extensions, Perl interrogates C<%Config>, so in this situation
+C<%Config> describes compilers that aren't there, and extension building
+fails. This forces people into choosing between re-compiling perl themselves
+using the compiler they have, or only using modules that the vendor ships.
+
+It would be good to find a way teach C<Config.pm> about the installation setup,
+possibly involving probing at install time or later, so that the C<%Config> in
+a binary distribution better describes the installed machine, when the
+installed machine differs from the build machine in some significant way.
+
+=head2 make parallel builds work
+
+Currently parallel builds (such as C<make -j3>) don't work reliably. We believe
+that this is due to incomplete dependency specification in the F<Makefile>.
+It would be good if someone were able to track down the causes of these
+problems, so that parallel builds worked properly.
+
+=head2 linker specification files
+
+Some platforms mandate that you provide a list of a shared library's external
+symbols to the linker, so the core already has the infrastructure in place to
+do this for generating shared perl libraries. My understanding is that the
+GNU toolchain can accept an optional linker specification file, and restrict
+visibility just to symbols declared in that file. It would be good to extend
+F<makedef.pl> to support this format, and to provide a means within
+C<Configure> to enable it. This would allow Unix users to test that the
+export list is correct, and to build a perl that does not pollute the global
+namespace with private symbols.
+
+
+
+
+=head1 Tasks that need a little C knowledge
+
+These tasks would need a little C knowledge, but don't need any specific
+background or experience with XS, or how the Perl interpreter works
+
+=head2 Make it clear from -v if this is the exact official release
+
+Currently perl from C<p4>/C<rsync> ships with a F<patchlevel.h> file that
+usually defines one local patch, of the form "MAINT12345" or "RC1". The output
+of perl -v doesn't report that a perl isn't an official release, and this
+information can get lost in bugs reports. Because of this, the minor version
+isn't bumped up until RC time, to minimise the possibility of versions of perl
+escaping that believe themselves to be newer than they actually are.
+
+It would be useful to find an elegant way to have the "this is an interim
+maintenance release" or "this is a release candidate" in the terse -v output,
+and have it so that it's easy for the pumpking to remove this just as the
+release tarball is rolled up. This way the version pulled out of rsync would
+always say "I'm a development release" and it would be safe to bump the
+reported minor version as soon as a release ships, which would aid perl
+developers.
+
+This task is really about thinking of an elegant way to arrange the C source
+such that it's trivial for the Pumpking to flag "this is an official release"
+when making a tarball, yet leave the default source saying "I'm not the
+official release".
+
+=head2 Tidy up global variables
+
+There's a note in F<intrpvar.h>
+
+  /* These two variables are needed to preserve 5.8.x bincompat because
+     we can't change function prototypes of two exported functions.
+     Probably should be taken out of blead soon, and relevant prototypes
+     changed.  */
+
+So doing this, and removing any of the unused variables still present would
+be good.
+
+=head2 Ordering of "global" variables.
+
+F<thrdvar.h> and F<intrpvarh> define the "global" variables that need to be
+per-thread under ithreads, where the variables are actually elements in a
+structure. As C dictates, the variables must be laid out in order of
+declaration. There is a comment
+C</* Important ones in the first cache line (if alignment is done right) */>
+which implies that at some point in the past the ordering was carefully chosen
+(at least in part). However, it's clear that the ordering is less than perfect,
+as currently there are things such as 7 C<bool>s in a row, then something
+typically requiring 4 byte alignment, and then an odd C<bool> later on.
+(C<bool>s are typically defined as C<char>s). So it would be good for someone
+to review the ordering of the variables, to see how much alignment padding can
+be removed.
+
+=head2 bincompat functions
+
+There are lots of functions which are retained for binary compatibility.
+Clean these up. Move them to mathom.c, and don't compile for blead?
+
+=head2 am I hot or not?
+
+The idea of F<pp_hot.c> is that it contains the I<hot> ops, the ops that are
+most commonly used. The idea is that by grouping them, their object code will
+be adjacent in the executable, so they have a greater chance of already being
+in the CPU cache (or swapped in) due to being near another op already in use.
+
+Except that it's not clear if these really are the most commonly used ops. So
+anyone feeling like exercising their skill with coverage and profiling tools
+might want to determine what ops I<really> are the most commonly used. And in
+turn suggest evictions and promotions to achieve a better F<pp_hot.c>.
+
+=head2 emulate the per-thread memory pool on Unix
+
+For Windows, ithreads allocates memory for each thread from a separate pool,
+which it discards at thread exit. It also checks that memory is free()d to
+the correct pool. Neither check is done on Unix, so code developed there won't
+be subject to such strictures, so can harbour bugs that only show up when the
+code reaches Windows.
+
+It would be good to be able to optionally emulate the Window pool system on
+Unix, to let developers who only have access to Unix, or want to use
+Unix-specific debugging tools, check for these problems. To do this would
+involve figuring out how the C<PerlMem_*> macros wrap C<malloc()> access, and
+providing a layer that records/checks the identity of the thread making the
+call, and recording all the memory allocated by each thread via this API so
+that it can be summarily free()d at thread exit. One implementation idea
+would be to increase the size of allocation, and store the C<my_perl> pointer
+(to identify the thread) at the start, along with pointers to make a linked
+list of blocks for this thread. To avoid alignment problems it would be
+necessary to do something like
+
+  union memory_header_padded {
+    struct memory_header {
+      void *thread_id;   /* For my_perl */
+      void *next;        /* Pointer to next block for this thread */
+    } data;
+    long double padding; /* whatever type has maximal alignment constraint */
+  };
+
+
+although C<long double> might not be the only type to add to the padding
+union.
+
+=head2 reduce duplication in sv_setsv_flags
+
+C<Perl_sv_setsv_flags> has a comment
+C</* There's a lot of redundancy below but we're going for speed here */>
+
+Whilst this was true 10 years ago, the growing disparity between RAM and CPU
+speeds mean that the trade offs have changed. In addition, the duplicate code
+adds to the maintenance burden. It would be good to see how much of the
+redundancy can be pruned, particular in the less common paths. (Profiling
+tools at the ready...). For example, why does the test for
+"Can't redefine active sort subroutine" need to occur in two places?
+
+
+
+
+=head1 Tasks that need a knowledge of XS
+
+These tasks would need C knowledge, and roughly the level of knowledge of
+the perl API that comes from writing modules that use XS to interface to
+C.
+
+=head2 IPv6
+
+Clean this up. Check everything in core works
+
+=head2 shrink C<GV>s, C<CV>s
+
+By removing unused elements and careful re-ordering, the structures for C<AV>s
+and C<HV>s have recently been shrunk considerably. It's probable that the same
+approach would find savings in C<GV>s and C<CV>s, if not all the other
+larger-than-C<PVMG> types.
+
+=head2 merge Perl_sv_2[inpu]v
+
+There's a lot of code shared between C<Perl_sv_2iv_flags>,
+C<Perl_sv_2uv_flags>, C<Perl_sv_2nv>, and C<Perl_sv_2pv_flags>. It would be
+interesting to see if some of it can be merged into common shared static
+functions. In particular, C<Perl_sv_2uv_flags> started out as a cut&paste
+from C<Perl_sv_2iv_flags> around 5.005_50 time, and it may be possible to
+replace both with a single function that returns a value or union which is
+split out by the macros in F<sv.h>
+
+=head2 UTF8 caching code
+
+The string position/offset cache is not optional. It should be.
+
+=head2 Implicit Latin 1 => Unicode translation
+
+Conversions from byte strings to UTF-8 currently map high bit characters
+to Unicode without translation (or, depending on how you look at it, by
+implicitly assuming that the byte strings are in Latin-1). As perl assumes
+the C locale by default, upgrading a string to UTF-8 may change the
+meaning of its contents regarding character classes, case mapping, etc.
+This should probably emit a warning (at least).
+
+This task is incremental - even a little bit of work on it will help.
+
+=head2 autovivification
+
+Make all autovivification consistent w.r.t LVALUE/RVALUE and strict/no strict;
+
+This task is incremental - even a little bit of work on it will help.
+
+=head2 Unicode in Filenames
+
+chdir, chmod, chown, chroot, exec, glob, link, lstat, mkdir, open,
+opendir, qx, readdir, readlink, rename, rmdir, stat, symlink, sysopen,
+system, truncate, unlink, utime, -X.  All these could potentially accept
+Unicode filenames either as input or output (and in the case of system
+and qx Unicode in general, as input or output to/from the shell).
+Whether a filesystem - an operating system pair understands Unicode in
+filenames varies.
+
+Known combinations that have some level of understanding include
+Microsoft NTFS, Apple HFS+ (In Mac OS 9 and X) and Apple UFS (in Mac
+OS X), NFS v4 is rumored to be Unicode, and of course Plan 9.  How to
+create Unicode filenames, what forms of Unicode are accepted and used
+(UCS-2, UTF-16, UTF-8), what (if any) is the normalization form used,
+and so on, varies.  Finding the right level of interfacing to Perl
+requires some thought.  Remember that an OS does not implicate a
+filesystem.
+
+(The Windows -C command flag "wide API support" has been at least
+temporarily retired in 5.8.1, and the -C has been repurposed, see
+L<perlrun>.)
+
+=head2 Unicode in %ENV
+
+Currently the %ENV entries are always byte strings.
+
+=head2 use less 'memory'
+
+Investigate trade offs to switch out perl's choices on memory usage.
+Particularly perl should be able to give memory back.
+
+This task is incremental - even a little bit of work on it will help.
+
+=head2 Re-implement C<:unique> in a way that is actually thread-safe
+
+The old implementation made bad assumptions on several levels. A good 90%
+solution might be just to make C<:unique> work to share the string buffer
+of SvPVs. That way large constant strings can be shared between ithreads,
+such as the configuration information in F<Config>.
+
+=head2 Make tainting consistent
+
+Tainting would be easier to use if it didn't take documented shortcuts and
+allow taint to "leak" everywhere within an expression.
+
+=head2 readpipe(LIST)
+
+system() accepts a LIST syntax (and a PROGRAM LIST syntax) to avoid
+running a shell. readpipe() (the function behind qx//) could be similarly
+extended.
+
+
+
+
+
+=head1 Tasks that need a knowledge of the interpreter
+
+These tasks would need C knowledge, and knowledge of how the interpreter works,
+or a willingness to learn.
+
+=head2 lexical pragmas
+
+Document the new support for lexical pragmas in 5.9.3 and how %^H works.
+Maybe C<re>, C<encoding>, maybe other pragmas could be made lexical.
+
+=head2 Attach/detach debugger from running program
+
+The old perltodo notes "With C<gdb>, you can attach the debugger to a running
+program if you pass the process ID. It would be good to do this with the Perl
+debugger on a running Perl program, although I'm not sure how it would be
+done." ssh and screen do this with named pipes in /tmp. Maybe we can too.
+
+=head2 Constant folding
+
+The peephole optimiser should trap errors during constant folding, and give
+up on the folding, rather than bailing out at compile time.  It is quite
+possible that the unfoldable constant is in unreachable code, eg something
+akin to C<$a = 0/0 if 0;>
+
+=head2 LVALUE functions for lists
+
+The old perltodo notes that lvalue functions don't work for list or hash
+slices. This would be good to fix.
+
+=head2 LVALUE functions in the debugger
+
+The old perltodo notes that lvalue functions don't work in the debugger. This
+would be good to fix.
+
+=head2 _ prototype character
+
+Study the possibility of adding a new prototype character, C<_>, meaning
+"this argument defaults to $_".
+
+=head2 state variables
+
+C<my $foo if 0;> is deprecated, and should be replaced with
+C<state $x = "initial value\n";> the syntax from Perl 6.
+
+=head2 @INC source filter to Filter::Simple
+
+The second return value from a sub in @INC can be a source filter. This isn't
+documented. It should be changed to use Filter::Simple, tested and documented.
+
+=head2 regexp optimiser optional
+
+The regexp optimiser is not optional. It should configurable to be, to allow
+its performance to be measured, and its bugs to be easily demonstrated.
+
+=head2 UNITCHECK
+
+Introduce a new special block, UNITCHECK, which is run at the end of a
+compilation unit (module, file, eval(STRING) block). This will correspond to
+the Perl 6 CHECK. Perl 5's CHECK cannot be changed or removed because the
+O.pm/B.pm backend framework depends on it.
+
+=head2 optional optimizer
+
+Make the peephole optimizer optional. Currently it performs two tasks as
+it walks the optree - genuine peephole optimisations, and necessary fixups of
+ops. It would be good to find an efficient way to switch out the
+optimisations whilst keeping the fixups.
+
+=head2 You WANT *how* many
+
+Currently contexts are void, scalar and list. split has a special mechanism in
+place to pass in the number of return values wanted. It would be useful to
+have a general mechanism for this, backwards compatible and little speed hit.
+This would allow proposals such as short circuiting sort to be implemented
+as a module on CPAN.
+
+=head2 lexical aliases
+
+Allow lexical aliases (maybe via the syntax C<my \$alias = \$foo>.
+
+=head2 entersub XS vs Perl
+
+At the moment pp_entersub is huge, and has code to deal with entering both
+perl and XS subroutines. Subroutine implementations rarely change between 
+perl and XS at run time, so investigate using 2 ops to enter subs (one for
+XS, one for perl) and swap between if a sub is redefined.
+
+=head2 Self ties
+
+self ties are currently illegal because they caused too many segfaults. Maybe
+the causes of these could be tracked down and self-ties on all types re-
+instated.
+
+=head2 Optimize away @_
+
+The old perltodo notes "Look at the "reification" code in C<av.c>".
+
+=head2 What hooks would assertions need?
+
+Assertions are in the core, and work. However, assertions needed to be added
+as a core patch, rather than an XS module in ext, or a CPAN module, because
+the core has no hooks in the necessary places. It would be useful to
+investigate what hooks would need to be added to make it possible to provide
+the full assertion support from a CPAN module, so that we aren't constraining
+the imagination of future CPAN authors.
+
+
+
+
+
+=head1 Big projects
+
+Tasks that will get your name mentioned in the description of the "Highlights
+of 5.10"
+
+=head2 make ithreads more robust
+
+Generally make ithreads more robust. See also L</iCOW>
+
+This task is incremental - even a little bit of work on it will help, and
+will be greatly appreciated.
+
+=head2 iCOW
+
+Sarathy and Arthur have a proposal for an improved Copy On Write which
+specifically will be able to COW new ithreads. If this can be implemented
+it would be a good thing.
+
+=head2 (?{...}) closures in regexps
+
+Fix (or rewrite) the implementation of the C</(?{...})/> closures.
+
+=head2 A re-entrant regexp engine
+
+This will allow the use of a regex from inside (?{ }), (??{ }) and
+(?(?{ })|) constructs.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perltooc.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perltooc.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perltooc.pod	(revision 14489)
@@ -0,0 +1,1342 @@
+=head1 NAME
+
+perltooc - Tom's OO Tutorial for Class Data in Perl
+
+=head1 DESCRIPTION
+
+When designing an object class, you are sometimes faced with the situation
+of wanting common state shared by all objects of that class.
+Such I<class attributes> act somewhat like global variables for the entire
+class, but unlike program-wide globals, class attributes have meaning only to
+the class itself.
+
+Here are a few examples where class attributes might come in handy:
+
+=over 4
+
+=item *
+
+to keep a count of the objects you've created, or how many are
+still extant.
+
+=item *
+
+to extract the name or file descriptor for a logfile used by a debugging
+method.
+
+=item *
+
+to access collective data, like the total amount of cash dispensed by
+all ATMs in a network in a given day.
+
+=item *
+
+to access the last object created by a class, or the most accessed object,
+or to retrieve a list of all objects.
+
+=back
+
+Unlike a true global, class attributes should not be accessed directly.
+Instead, their state should be inspected, and perhaps altered, only
+through the mediated access of I<class methods>.  These class attributes
+accessor methods are similar in spirit and function to accessors used
+to manipulate the state of instance attributes on an object.  They provide a
+clear firewall between interface and implementation.
+
+You should allow access to class attributes through either the class
+name or any object of that class.  If we assume that $an_object is of
+type Some_Class, and the &Some_Class::population_count method accesses
+class attributes, then these two invocations should both be possible,
+and almost certainly equivalent.
+
+    Some_Class->population_count()
+    $an_object->population_count()
+
+The question is, where do you store the state which that method accesses?
+Unlike more restrictive languages like C++, where these are called
+static data members, Perl provides no syntactic mechanism to declare
+class attributes, any more than it provides a syntactic mechanism to
+declare instance attributes.  Perl provides the developer with a broad
+set of powerful but flexible features that can be uniquely crafted to
+the particular demands of the situation.
+
+A class in Perl is typically implemented in a module.  A module consists
+of two complementary feature sets: a package for interfacing with the
+outside world, and a lexical file scope for privacy.  Either of these
+two mechanisms can be used to implement class attributes.  That means you
+get to decide whether to put your class attributes in package variables
+or to put them in lexical variables.
+
+And those aren't the only decisions to make.  If you choose to use package
+variables, you can make your class attribute accessor methods either ignorant
+of inheritance or sensitive to it.  If you choose lexical variables,
+you can elect to permit access to them from anywhere in the entire file
+scope, or you can limit direct data access exclusively to the methods
+implementing those attributes.
+
+=head1 Class Data in a Can
+
+One of the easiest ways to solve a hard problem is to let someone else
+do it for you!  In this case, Class::Data::Inheritable (available on a
+CPAN near you) offers a canned solution to the class data problem
+using closures.  So before you wade into this document, consider
+having a look at that module.
+
+
+=head1 Class Data as Package Variables
+
+Because a class in Perl is really just a package, using package variables
+to hold class attributes is the most natural choice.  This makes it simple
+for each class to have its own class attributes.  Let's say you have a class
+called Some_Class that needs a couple of different attributes that you'd
+like to be global to the entire class.  The simplest thing to do is to
+use package variables like $Some_Class::CData1 and $Some_Class::CData2
+to hold these attributes.  But we certainly don't want to encourage
+outsiders to touch those data directly, so we provide methods
+to mediate access.
+
+In the accessor methods below, we'll for now just ignore the first
+argument--that part to the left of the arrow on method invocation, which 
+is either a class name or an object reference.
+
+    package Some_Class;
+    sub CData1 {
+	shift;	# XXX: ignore calling class/object
+	$Some_Class::CData1 = shift if @_;
+	return $Some_Class::CData1;
+    } 
+    sub CData2 {
+	shift;	# XXX: ignore calling class/object
+	$Some_Class::CData2 = shift if @_;
+	return $Some_Class::CData2;
+    } 
+
+This technique is highly legible and should be completely straightforward
+to even the novice Perl programmer.  By fully qualifying the package
+variables, they stand out clearly when reading the code.  Unfortunately,
+if you misspell one of these, you've introduced an error that's hard
+to catch.  It's also somewhat disconcerting to see the class name itself
+hard-coded in so many places.
+
+Both these problems can be easily fixed.  Just add the C<use strict>
+pragma, then pre-declare your package variables.  (The C<our> operator
+will be new in 5.6, and will work for package globals just like C<my>
+works for scoped lexicals.)
+
+    package Some_Class;
+    use strict;
+    our($CData1, $CData2);   	# our() is new to perl5.6
+    sub CData1 {
+	shift;	# XXX: ignore calling class/object
+	$CData1 = shift if @_;
+	return $CData1;
+    } 
+    sub CData2 {
+	shift;	# XXX: ignore calling class/object
+	$CData2 = shift if @_;
+	return $CData2;
+    } 
+
+
+As with any other global variable, some programmers prefer to start their
+package variables with capital letters.  This helps clarity somewhat, but
+by no longer fully qualifying the package variables, their significance
+can be lost when reading the code.  You can fix this easily enough by
+choosing better names than were used here.
+
+=head2 Putting All Your Eggs in One Basket
+
+Just as the mindless enumeration of accessor methods for instance attributes
+grows tedious after the first few (see L<perltoot>), so too does the
+repetition begin to grate when listing out accessor methods for class
+data.  Repetition runs counter to the primary virtue of a programmer:
+Laziness, here manifesting as that innate urge every programmer feels
+to factor out duplicate code whenever possible.
+
+Here's what to do.  First, make just one hash to hold all class attributes.
+
+    package Some_Class;
+    use strict;
+    our %ClassData = (   	# our() is new to perl5.6
+	CData1 => "",
+	CData2 => "",
+    );
+
+Using closures (see L<perlref>) and direct access to the package symbol
+table (see L<perlmod>), now clone an accessor method for each key in
+the %ClassData hash.  Each of these methods is used to fetch or store
+values to the specific, named class attribute.
+
+    for my $datum (keys %ClassData) {
+	no strict "refs";	# to register new methods in package
+	*$datum = sub {
+	    shift;	# XXX: ignore calling class/object
+	    $ClassData{$datum} = shift if @_;
+	    return $ClassData{$datum};
+	} 
+    } 
+
+It's true that you could work out a solution employing an &AUTOLOAD
+method, but this approach is unlikely to prove satisfactory.  Your
+function would have to distinguish between class attributes and object
+attributes; it could interfere with inheritance; and it would have to
+careful about DESTROY.  Such complexity is uncalled for in most cases,
+and certainly in this one.
+
+You may wonder why we're rescinding strict refs for the loop.  We're
+manipulating the package's symbol table to introduce new function names
+using symbolic references (indirect naming), which the strict pragma
+would otherwise forbid.  Normally, symbolic references are a dodgy
+notion at best.  This isn't just because they can be used accidentally
+when you aren't meaning to.  It's also because for most uses
+to which beginning Perl programmers attempt to put symbolic references,
+we have much better approaches, like nested hashes or hashes of arrays.
+But there's nothing wrong with using symbolic references to manipulate
+something that is meaningful only from the perspective of the package
+symbol table, like method names or package variables.  In other
+words, when you want to refer to the symbol table, use symbol references.
+
+Clustering all the class attributes in one place has several advantages.
+They're easy to spot, initialize, and change.  The aggregation also
+makes them convenient to access externally, such as from a debugger
+or a persistence package.  The only possible problem is that we don't
+automatically know the name of each class's class object, should it have
+one.  This issue is addressed below in L<"The Eponymous Meta-Object">.
+
+=head2 Inheritance Concerns
+
+Suppose you have an instance of a derived class, and you access class
+data using an inherited method call.  Should that end up referring
+to the base class's attributes, or to those in the derived class?
+How would it work in the earlier examples?  The derived class inherits
+all the base class's methods, including those that access class attributes.
+But what package are the class attributes stored in?
+
+The answer is that, as written, class attributes are stored in the package into
+which those methods were compiled.  When you invoke the &CData1 method
+on the name of the derived class or on one of that class's objects, the
+version shown above is still run, so you'll access $Some_Class::CData1--or
+in the method cloning version, C<$Some_Class::ClassData{CData1}>.
+
+Think of these class methods as executing in the context of their base
+class, not in that of their derived class.  Sometimes this is exactly
+what you want.  If Feline subclasses Carnivore, then the population of
+Carnivores in the world should go up when a new Feline is born.
+But what if you wanted to figure out how many Felines you have apart
+from Carnivores?  The current approach doesn't support that.
+
+You'll have to decide on a case-by-case basis whether it makes any sense
+for class attributes to be package-relative.  If you want it to be so,
+then stop ignoring the first argument to the function.  Either it will
+be a package name if the method was invoked directly on a class name,
+or else it will be an object reference if the method was invoked on an
+object reference.  In the latter case, the ref() function provides the
+class of that object.
+
+    package Some_Class;
+    sub CData1 {
+	my $obclass = shift;	
+	my $class   = ref($obclass) || $obclass;
+	my $varname = $class . "::CData1";
+	no strict "refs"; 	# to access package data symbolically
+	$$varname = shift if @_;
+	return $$varname;
+    } 
+
+And then do likewise for all other class attributes (such as CData2,
+etc.) that you wish to access as package variables in the invoking package
+instead of the compiling package as we had previously.
+
+Once again we temporarily disable the strict references ban, because
+otherwise we couldn't use the fully-qualified symbolic name for
+the package global.  This is perfectly reasonable: since all package
+variables by definition live in a package, there's nothing wrong with
+accessing them via that package's symbol table.  That's what it's there
+for (well, somewhat).
+
+What about just using a single hash for everything and then cloning
+methods?  What would that look like?  The only difference would be the
+closure used to produce new method entries for the class's symbol table.
+
+    no strict "refs";	
+    *$datum = sub {
+	my $obclass = shift;	
+	my $class   = ref($obclass) || $obclass;
+	my $varname = $class . "::ClassData";
+	$varname->{$datum} = shift if @_;
+	return $varname->{$datum};
+    }
+
+=head2 The Eponymous Meta-Object
+
+It could be argued that the %ClassData hash in the previous example is
+neither the most imaginative nor the most intuitive of names.  Is there
+something else that might make more sense, be more useful, or both?
+
+As it happens, yes, there is.  For the "class meta-object", we'll use
+a package variable of the same name as the package itself.  Within the
+scope of a package Some_Class declaration, we'll use the eponymously
+named hash %Some_Class as that class's meta-object.  (Using an eponymously
+named hash is somewhat reminiscent of classes that name their constructors
+eponymously in the Python or C++ fashion.  That is, class Some_Class would
+use &Some_Class::Some_Class as a constructor, probably even exporting that
+name as well.  The StrNum class in Recipe 13.14 in I<The Perl Cookbook>
+does this, if you're looking for an example.)
+
+This predictable approach has many benefits, including having a well-known
+identifier to aid in debugging, transparent persistence,
+or checkpointing.  It's also the obvious name for monadic classes and
+translucent attributes, discussed later.
+
+Here's an example of such a class.  Notice how the name of the 
+hash storing the meta-object is the same as the name of the package
+used to implement the class.
+
+    package Some_Class;
+    use strict;
+
+    # create class meta-object using that most perfect of names
+    our %Some_Class = (   	# our() is new to perl5.6
+	CData1 => "",
+	CData2 => "",
+    );
+
+    # this accessor is calling-package-relative
+    sub CData1 {
+	my $obclass = shift;	
+	my $class   = ref($obclass) || $obclass;
+	no strict "refs"; 	# to access eponymous meta-object
+	$class->{CData1} = shift if @_;
+	return $class->{CData1};
+    }
+
+    # but this accessor is not
+    sub CData2 {
+	shift;			# XXX: ignore calling class/object
+	no strict "refs"; 	# to access eponymous meta-object
+	__PACKAGE__ -> {CData2} = shift if @_;
+	return __PACKAGE__ -> {CData2};
+    } 
+
+In the second accessor method, the __PACKAGE__ notation was used for
+two reasons.  First, to avoid hardcoding the literal package name
+in the code in case we later want to change that name.  Second, to
+clarify to the reader that what matters here is the package currently
+being compiled into, not the package of the invoking object or class.
+If the long sequence of non-alphabetic characters bothers you, you can
+always put the __PACKAGE__ in a variable first.
+
+    sub CData2 {
+	shift;			# XXX: ignore calling class/object
+	no strict "refs"; 	# to access eponymous meta-object
+	my $class = __PACKAGE__;
+	$class->{CData2} = shift if @_;
+	return $class->{CData2};
+    } 
+
+Even though we're using symbolic references for good not evil, some
+folks tend to become unnerved when they see so many places with strict
+ref checking disabled.  Given a symbolic reference, you can always
+produce a real reference (the reverse is not true, though).  So we'll
+create a subroutine that does this conversion for us.  If invoked as a
+function of no arguments, it returns a reference to the compiling class's
+eponymous hash.  Invoked as a class method, it returns a reference to
+the eponymous hash of its caller.  And when invoked as an object method,
+this function returns a reference to the eponymous hash for whatever
+class the object belongs to.
+
+    package Some_Class;
+    use strict;
+
+    our %Some_Class = (   	# our() is new to perl5.6
+	CData1 => "",
+	CData2 => "",
+    );
+
+    # tri-natured: function, class method, or object method
+    sub _classobj {
+	my $obclass = shift || __PACKAGE__;
+	my $class   = ref($obclass) || $obclass;
+	no strict "refs";   # to convert sym ref to real one
+	return \%$class;
+    } 
+
+    for my $datum (keys %{ _classobj() } ) { 
+	# turn off strict refs so that we can
+	# register a method in the symbol table
+	no strict "refs";    	
+	*$datum = sub {
+	    use strict "refs";
+	    my $self = shift->_classobj();
+	    $self->{$datum} = shift if @_;
+	    return $self->{$datum};
+	}
+    }
+
+=head2 Indirect References to Class Data
+
+A reasonably common strategy for handling class attributes is to store
+a reference to each package variable on the object itself.  This is
+a strategy you've probably seen before, such as in L<perltoot> and
+L<perlbot>, but there may be variations in the example below that you
+haven't thought of before.
+
+    package Some_Class;
+    our($CData1, $CData2);      	# our() is new to perl5.6
+
+    sub new {
+	my $obclass = shift;
+	return bless my $self = {
+	    ObData1 => "",
+	    ObData2 => "",
+	    CData1  => \$CData1,
+	    CData2  => \$CData2,
+	} => (ref $obclass || $obclass);
+    } 
+
+    sub ObData1 {
+	my $self = shift;
+	$self->{ObData1} = shift if @_;
+	return $self->{ObData1};
+    } 
+
+    sub ObData2 {
+	my $self = shift;
+	$self->{ObData2} = shift if @_;
+	return $self->{ObData2};
+    } 
+
+    sub CData1 {
+	my $self = shift;
+	my $dataref = ref $self
+			? $self->{CData1}
+			: \$CData1;
+	$$dataref = shift if @_;
+	return $$dataref;
+    } 
+
+    sub CData2 {
+	my $self = shift;
+	my $dataref = ref $self
+			? $self->{CData2}
+			: \$CData2;
+	$$dataref = shift if @_;
+	return $$dataref;
+    } 
+
+As written above, a derived class will inherit these methods, which
+will consequently access package variables in the base class's package.
+This is not necessarily expected behavior in all circumstances.  Here's an
+example that uses a variable meta-object, taking care to access the
+proper package's data.
+
+	package Some_Class;
+	use strict;
+
+	our %Some_Class = (   	# our() is new to perl5.6
+	    CData1 => "",
+	    CData2 => "",
+	);
+
+	sub _classobj {
+	    my $self  = shift;
+	    my $class = ref($self) || $self;
+	    no strict "refs";
+	    # get (hard) ref to eponymous meta-object
+	    return \%$class;
+	} 
+
+	sub new {
+	    my $obclass  = shift;
+	    my $classobj = $obclass->_classobj();
+	    bless my $self = {
+		ObData1 => "",
+		ObData2 => "",
+		CData1  => \$classobj->{CData1},
+		CData2  => \$classobj->{CData2},
+	    } => (ref $obclass || $obclass);
+	    return $self;
+	} 
+
+	sub ObData1 {
+	    my $self = shift;
+	    $self->{ObData1} = shift if @_;
+	    return $self->{ObData1};
+	} 
+
+	sub ObData2 {
+	    my $self = shift;
+	    $self->{ObData2} = shift if @_;
+	    return $self->{ObData2};
+	} 
+
+	sub CData1 {
+	    my $self = shift;
+	    $self = $self->_classobj() unless ref $self;
+	    my $dataref = $self->{CData1};
+	    $$dataref = shift if @_;
+	    return $$dataref;
+	} 
+
+	sub CData2 {
+	    my $self = shift;
+	    $self = $self->_classobj() unless ref $self;
+	    my $dataref = $self->{CData2};
+	    $$dataref = shift if @_;
+	    return $$dataref;
+	} 
+
+Not only are we now strict refs clean, using an eponymous meta-object
+seems to make the code cleaner.  Unlike the previous version, this one
+does something interesting in the face of inheritance: it accesses the
+class meta-object in the invoking class instead of the one into which
+the method was initially compiled.
+
+You can easily access data in the class meta-object, making
+it easy to dump the complete class state using an external mechanism such
+as when debugging or implementing a persistent class.  This works because
+the class meta-object is a package variable, has a well-known name, and
+clusters all its data together.  (Transparent persistence
+is not always feasible, but it's certainly an appealing idea.)
+
+There's still no check that object accessor methods have not been
+invoked on a class name.  If strict ref checking is enabled, you'd
+blow up.  If not, then you get the eponymous meta-object.  What you do
+with--or about--this is up to you.  The next two sections demonstrate
+innovative uses for this powerful feature.
+
+=head2 Monadic Classes
+
+Some of the standard modules shipped with Perl provide class interfaces
+without any attribute methods whatsoever.  The most commonly used module
+not numbered amongst the pragmata, the Exporter module, is a class with
+neither constructors nor attributes.  Its job is simply to provide a
+standard interface for modules wishing to export part of their namespace
+into that of their caller.  Modules use the Exporter's &import method by
+setting their inheritance list in their package's @ISA array to mention
+"Exporter".  But class Exporter provides no constructor, so you can't
+have several instances of the class.  In fact, you can't have any--it
+just doesn't make any sense.  All you get is its methods.  Its interface
+contains no statefulness, so state data is wholly superfluous.
+
+Another sort of class that pops up from time to time is one that supports
+a unique instance.  Such classes are called I<monadic classes>, or less
+formally, I<singletons> or I<highlander classes>.
+
+If a class is monadic, where do you store its state, that is,
+its attributes?  How do you make sure that there's never more than
+one instance?  While you could merely use a slew of package variables,
+it's a lot cleaner to use the eponymously named hash.  Here's a complete
+example of a monadic class:
+
+    package Cosmos;
+    %Cosmos = ();
+
+    # accessor method for "name" attribute
+    sub name {
+	my $self = shift;
+	$self->{name} = shift if @_;
+	return $self->{name};
+    } 
+
+    # read-only accessor method for "birthday" attribute
+    sub birthday {
+	my $self = shift;
+	die "can't reset birthday" if @_;  # XXX: croak() is better
+	return $self->{birthday};
+    } 
+
+    # accessor method for "stars" attribute
+    sub stars {
+	my $self = shift;
+	$self->{stars} = shift if @_;
+	return $self->{stars};
+    } 
+
+    # oh my - one of our stars just went out!
+    sub supernova {
+	my $self = shift;
+	my $count = $self->stars();
+	$self->stars($count - 1) if $count > 0;
+    } 
+
+    # constructor/initializer method - fix by reboot
+    sub bigbang { 
+	my $self = shift;
+	%$self = (
+	    name  	 => "the world according to tchrist",
+	    birthday 	 => time(),
+	    stars 	 => 0,
+	);
+	return $self;	    # yes, it's probably a class.  SURPRISE!
+    }
+
+    # After the class is compiled, but before any use or require 
+    # returns, we start off the universe with a bang.  
+    __PACKAGE__ -> bigbang();
+
+Hold on, that doesn't look like anything special.  Those attribute
+accessors look no different than they would if this were a regular class
+instead of a monadic one.  The crux of the matter is there's nothing
+that says that $self must hold a reference to a blessed object.  It merely
+has to be something you can invoke methods on.  Here the package name
+itself, Cosmos, works as an object.  Look at the &supernova method.  Is that
+a class method or an object method?  The answer is that static analysis
+cannot reveal the answer.  Perl doesn't care, and neither should you.
+In the three attribute methods, C<%$self> is really accessing the %Cosmos
+package variable.
+
+If like Stephen Hawking, you posit the existence of multiple, sequential,
+and unrelated universes, then you can invoke the &bigbang method yourself
+at any time to start everything all over again.  You might think of
+&bigbang as more of an initializer than a constructor, since the function
+doesn't allocate new memory; it only initializes what's already there.
+But like any other constructor, it does return a scalar value to use
+for later method invocations.
+
+Imagine that some day in the future, you decide that one universe just
+isn't enough.  You could write a new class from scratch, but you already
+have an existing class that does what you want--except that it's monadic,
+and you want more than just one cosmos.
+
+That's what code reuse via subclassing is all about.  Look how short
+the new code is:
+
+    package Multiverse;
+    use Cosmos;
+    @ISA = qw(Cosmos);
+
+    sub new {
+	my $protoverse = shift;
+	my $class      = ref($protoverse) || $protoverse;
+	my $self       = {};
+	return bless($self, $class)->bigbang();
+    } 
+    1;
+
+Because we were careful to be good little creators when we designed our
+Cosmos class, we can now reuse it without touching a single line of code
+when it comes time to write our Multiverse class.  The same code that
+worked when invoked as a class method continues to work perfectly well
+when invoked against separate instances of a derived class.
+
+The astonishing thing about the Cosmos class above is that the value
+returned by the &bigbang "constructor" is not a reference to a blessed
+object at all.  It's just the class's own name.  A class name is, for
+virtually all intents and purposes, a perfectly acceptable object.
+It has state, behavior, and identity, the three crucial components
+of an object system.  It even manifests inheritance, polymorphism,
+and encapsulation.  And what more can you ask of an object?
+
+To understand object orientation in Perl, it's important to recognize the
+unification of what other programming languages might think of as class
+methods and object methods into just plain methods.  "Class methods"
+and "object methods" are distinct only in the compartmentalizing mind
+of the Perl programmer, not in the Perl language itself.
+
+Along those same lines, a constructor is nothing special either, which
+is one reason why Perl has no pre-ordained name for them.  "Constructor"
+is just an informal term loosely used to describe a method that returns
+a scalar value that you can make further method calls against.  So long
+as it's either a class name or an object reference, that's good enough.
+It doesn't even have to be a reference to a brand new object.
+
+You can have as many--or as few--constructors as you want, and you can
+name them whatever you care to.  Blindly and obediently using new()
+for each and every constructor you ever write is to speak Perl with
+such a severe C++ accent that you do a disservice to both languages.
+There's no reason to insist that each class have but one constructor,
+or that a constructor be named new(), or that a constructor be
+used solely as a class method and not an object method.
+
+The next section shows how useful it can be to further distance ourselves
+from any formal distinction between class method calls and object method
+calls, both in constructors and in accessor methods.
+
+=head2 Translucent Attributes
+
+A package's eponymous hash can be used for more than just containing
+per-class, global state data.  It can also serve as a sort of template
+containing default settings for object attributes.  These default
+settings can then be used in constructors for initialization of a
+particular object.  The class's eponymous hash can also be used to
+implement I<translucent attributes>.  A translucent attribute is one
+that has a class-wide default.  Each object can set its own value for the
+attribute, in which case C<< $object->attribute() >> returns that value.
+But if no value has been set, then C<< $object->attribute() >> returns
+the class-wide default.
+
+We'll apply something of a copy-on-write approach to these translucent
+attributes.  If you're just fetching values from them, you get
+translucency.  But if you store a new value to them, that new value is
+set on the current object.  On the other hand, if you use the class as
+an object and store the attribute value directly on the class, then the
+meta-object's value changes, and later fetch operations on objects with
+uninitialized values for those attributes will retrieve the meta-object's
+new values.  Objects with their own initialized values, however, won't
+see any change.
+
+Let's look at some concrete examples of using these properties before we
+show how to implement them.  Suppose that a class named Some_Class
+had a translucent data attribute called "color".  First you set the color
+in the meta-object, then you create three objects using a constructor
+that happens to be named &spawn.
+
+    use Vermin;
+    Vermin->color("vermilion");
+
+    $ob1 = Vermin->spawn();   	# so that's where Jedi come from
+    $ob2 = Vermin->spawn();   
+    $ob3 = Vermin->spawn();  
+
+    print $obj3->color();  	# prints "vermilion"
+
+Each of these objects' colors is now "vermilion", because that's the
+meta-object's value for that attribute, and these objects do not have
+individual color values set.
+
+Changing the attribute on one object has no effect on other objects
+previously created.
+
+    $ob3->color("chartreuse");		
+    print $ob3->color();  	# prints "chartreuse"
+    print $ob1->color();  	# prints "vermilion", translucently
+
+If you now use $ob3 to spawn off another object, the new object will
+take the color its parent held, which now happens to be "chartreuse".
+That's because the constructor uses the invoking object as its template
+for initializing attributes.  When that invoking object is the
+class name, the object used as a template is the eponymous meta-object.
+When the invoking object is a reference to an instantiated object, the
+&spawn constructor uses that existing object as a template.  
+
+    $ob4 = $ob3->spawn();	# $ob3 now template, not %Vermin
+    print $ob4->color();  	# prints "chartreuse"
+
+Any actual values set on the template object will be copied to the
+new object.  But attributes undefined in the template object, being
+translucent, will remain undefined and consequently translucent in the
+new one as well.
+
+Now let's change the color attribute on the entire class:
+
+    Vermin->color("azure");	
+    print $ob1->color();  	# prints "azure"
+    print $ob2->color();  	# prints "azure"
+    print $ob3->color();  	# prints "chartreuse"
+    print $ob4->color();  	# prints "chartreuse"
+
+That color change took effect only in the first pair of objects, which
+were still translucently accessing the meta-object's values.  The second
+pair had per-object initialized colors, and so didn't change.
+
+One important question remains.  Changes to the meta-object are reflected
+in translucent attributes in the entire class, but what about
+changes to discrete objects?  If you change the color of $ob3, does the
+value of $ob4 see that change?  Or vice-versa.  If you change the color
+of $ob4, does then the value of $ob3 shift?
+
+    $ob3->color("amethyst");		
+    print $ob3->color();  	# prints "amethyst"
+    print $ob4->color();  	# hmm: "chartreuse" or "amethyst"?
+
+While one could argue that in certain rare cases it should, let's not
+do that.  Good taste aside, we want the answer to the question posed in
+the comment above to be "chartreuse", not "amethyst".  So we'll treat
+these attributes similar to the way process attributes like environment
+variables, user and group IDs, or the current working directory are
+treated across a fork().  You can change only yourself, but you will see
+those changes reflected in your unspawned children.  Changes to one object
+will propagate neither up to the parent nor down to any existing child objects.
+Those objects made later, however, will see the changes.
+
+If you have an object with an actual attribute value, and you want to
+make that object's attribute value translucent again, what do you do?
+Let's design the class so that when you invoke an accessor method with
+C<undef> as its argument, that attribute returns to translucency.
+
+    $ob4->color(undef);		# back to "azure"
+
+Here's a complete implementation of Vermin as described above.
+
+    package Vermin;
+
+    # here's the class meta-object, eponymously named.
+    # it holds all class attributes, and also all instance attributes 
+    # so the latter can be used for both initialization 
+    # and translucency.
+
+    our %Vermin = (   		# our() is new to perl5.6
+	PopCount => 0,		# capital for class attributes
+	color    => "beige",    # small for instance attributes		
+    );
+
+    # constructor method
+    # invoked as class method or object method
+    sub spawn {
+	my $obclass = shift;
+	my $class   = ref($obclass) || $obclass;
+	my $self = {};
+	bless($self, $class);
+	$class->{PopCount}++;
+	# init fields from invoking object, or omit if 
+	# invoking object is the class to provide translucency
+	%$self = %$obclass if ref $obclass;
+	return $self;
+    } 
+
+    # translucent accessor for "color" attribute
+    # invoked as class method or object method
+    sub color {
+	my $self  = shift;
+	my $class = ref($self) || $self;
+
+	# handle class invocation
+	unless (ref $self) {
+	    $class->{color} = shift if @_;
+	    return $class->{color}
+	}
+
+	# handle object invocation
+	$self->{color} = shift if @_;
+	if (defined $self->{color}) {  # not exists!
+	    return $self->{color};
+	} else {
+	    return $class->{color};
+	} 
+    } 
+
+    # accessor for "PopCount" class attribute
+    # invoked as class method or object method
+    # but uses object solely to locate meta-object
+    sub population {
+	my $obclass = shift;
+	my $class   = ref($obclass) || $obclass;
+	return $class->{PopCount};
+    } 
+
+    # instance destructor
+    # invoked only as object method
+    sub DESTROY {
+	my $self  = shift;
+	my $class = ref $self;
+	$class->{PopCount}--;
+    }
+
+Here are a couple of helper methods that might be convenient.  They aren't
+accessor methods at all.  They're used to detect accessibility of data
+attributes.  The &is_translucent method determines whether a particular
+object attribute is coming from the meta-object.  The &has_attribute
+method detects whether a class implements a particular property at all.
+It could also be used to distinguish undefined properties from non-existent
+ones.
+
+    # detect whether an object attribute is translucent
+    # (typically?) invoked only as object method
+    sub is_translucent {
+	my($self, $attr)  = @_;
+	return !defined $self->{$attr};  
+    }
+
+    # test for presence of attribute in class
+    # invoked as class method or object method
+    sub has_attribute {
+	my($self, $attr)  = @_;
+	my $class = ref($self) || $self;
+	return exists $class->{$attr};  
+    } 
+
+If you prefer to install your accessors more generically, you can make
+use of the upper-case versus lower-case convention to register into the
+package appropriate methods cloned from generic closures.
+
+    for my $datum (keys %{ +__PACKAGE__ }) {
+	*$datum = ($datum =~ /^[A-Z]/)
+	    ? sub {  # install class accessor
+		    my $obclass = shift;
+		    my $class   = ref($obclass) || $obclass;
+		    return $class->{$datum};
+		  }
+	    : sub { # install translucent accessor
+		    my $self  = shift;
+		    my $class = ref($self) || $self;
+		    unless (ref $self) {
+			$class->{$datum} = shift if @_;
+			return $class->{$datum}
+		    }
+		    $self->{$datum} = shift if @_;
+		    return defined $self->{$datum}
+			? $self  -> {$datum}
+			: $class -> {$datum}
+		  } 
+    }
+
+Translations of this closure-based approach into C++, Java, and Python
+have been left as exercises for the reader.  Be sure to send us mail as
+soon as you're done.
+
+=head1 Class Data as Lexical Variables
+
+=head2 Privacy and Responsibility 
+
+Unlike conventions used by some Perl programmers, in the previous
+examples, we didn't prefix the package variables used for class attributes
+with an underscore, nor did we do so for the names of the hash keys used
+for instance attributes.  You don't need little markers on data names to
+suggest nominal privacy on attribute variables or hash keys, because these
+are B<already> notionally private!  Outsiders have no business whatsoever
+playing with anything within a class save through the mediated access of
+its documented interface; in other words, through method invocations.
+And not even through just any method, either.  Methods that begin with
+an underscore are traditionally considered off-limits outside the class.
+If outsiders skip the documented method interface to poke around the
+internals of your class and end up breaking something, that's not your
+fault--it's theirs.
+
+Perl believes in individual responsibility rather than mandated control.
+Perl respects you enough to let you choose your own preferred level of
+pain, or of pleasure.  Perl believes that you are creative, intelligent,
+and capable of making your own decisions--and fully expects you to
+take complete responsibility for your own actions.  In a perfect world,
+these admonitions alone would suffice, and everyone would be intelligent,
+responsible, happy, and creative.  And careful.  One probably shouldn't
+forget careful, and that's a good bit harder to expect.  Even Einstein
+would take wrong turns by accident and end up lost in the wrong part
+of town.
+
+Some folks get the heebie-jeebies when they see package variables
+hanging out there for anyone to reach over and alter them.  Some folks
+live in constant fear that someone somewhere might do something wicked.
+The solution to that problem is simply to fire the wicked, of course.
+But unfortunately, it's not as simple as all that.  These cautious
+types are also afraid that they or others will do something not so
+much wicked as careless, whether by accident or out of desperation.
+If we fire everyone who ever gets careless, pretty soon there won't be
+anybody left to get any work done.
+
+Whether it's needless paranoia or sensible caution, this uneasiness can
+be a problem for some people.  We can take the edge off their discomfort
+by providing the option of storing class attributes as lexical variables
+instead of as package variables.  The my() operator is the source of
+all privacy in Perl, and it is a powerful form of privacy indeed.
+
+It is widely perceived, and indeed has often been written, that Perl
+provides no data hiding, that it affords the class designer no privacy
+nor isolation, merely a rag-tag assortment of weak and unenforceable
+social conventions instead.  This perception is demonstrably false and
+easily disproven.  In the next section, we show how to implement forms
+of privacy that are far stronger than those provided in nearly any
+other object-oriented language.
+
+=head2 File-Scoped Lexicals
+
+A lexical variable is visible only through the end of its static scope.
+That means that the only code able to access that variable is code
+residing textually below the my() operator through the end of its block
+if it has one, or through the end of the current file if it doesn't.
+
+Starting again with our simplest example given at the start of this
+document, we replace our() variables with my() versions.
+
+    package Some_Class;
+    my($CData1, $CData2);   # file scope, not in any package
+    sub CData1 {
+	shift;	# XXX: ignore calling class/object
+	$CData1 = shift if @_;
+	return $CData1;
+    } 
+    sub CData2 {
+	shift;	# XXX: ignore calling class/object
+	$CData2 = shift if @_;
+	return $CData2;
+    } 
+
+So much for that old $Some_Class::CData1 package variable and its brethren!
+Those are gone now, replaced with lexicals.  No one outside the
+scope can reach in and alter the class state without resorting to the
+documented interface.  Not even subclasses or superclasses of
+this one have unmediated access to $CData1.  They have to invoke the &CData1
+method against Some_Class or an instance thereof, just like anybody else.
+
+To be scrupulously honest, that last statement assumes you haven't packed
+several classes together into the same file scope, nor strewn your class
+implementation across several different files.  Accessibility of those
+variables is based uniquely on the static file scope.  It has nothing to
+do with the package.  That means that code in a different file but
+the same package (class) could not access those variables, yet code in the
+same file but a different package (class) could.  There are sound reasons
+why we usually suggest a one-to-one mapping between files and packages
+and modules and classes.  You don't have to stick to this suggestion if
+you really know what you're doing, but you're apt to confuse yourself
+otherwise, especially at first.
+
+If you'd like to aggregate your class attributes into one lexically scoped,
+composite structure, you're perfectly free to do so.
+
+    package Some_Class;
+    my %ClassData = (
+	CData1 => "",
+	CData2 => "",
+    );
+    sub CData1 {
+	shift;	# XXX: ignore calling class/object
+	$ClassData{CData1} = shift if @_;
+	return $ClassData{CData1};
+    } 
+    sub CData2 {
+	shift;	# XXX: ignore calling class/object
+	$ClassData{CData2} = shift if @_;
+	return $ClassData{CData2};
+    } 
+
+To make this more scalable as other class attributes are added, we can
+again register closures into the package symbol table to create accessor
+methods for them.
+
+    package Some_Class;
+    my %ClassData = (
+	CData1 => "",
+	CData2 => "",
+    );
+    for my $datum (keys %ClassData) { 
+	no strict "refs";
+	*$datum = sub { 
+	    shift;	# XXX: ignore calling class/object
+	    $ClassData{$datum} = shift if @_;
+	    return $ClassData{$datum};
+	};
+    }
+
+Requiring even your own class to use accessor methods like anybody else is
+probably a good thing.  But demanding and expecting that everyone else,
+be they subclass or superclass, friend or foe, will all come to your
+object through mediation is more than just a good idea.  It's absolutely
+critical to the model.  Let there be in your mind no such thing as
+"public" data, nor even "protected" data, which is a seductive but
+ultimately destructive notion.  Both will come back to bite at you.
+That's because as soon as you take that first step out of the solid
+position in which all state is considered completely private, save from the
+perspective of its own accessor methods, you have violated the envelope.
+And, having pierced that encapsulating envelope, you shall doubtless
+someday pay the price when future changes in the implementation break
+unrelated code.  Considering that avoiding this infelicitous outcome was
+precisely why you consented to suffer the slings and arrows of obsequious
+abstraction by turning to object orientation in the first place, such
+breakage seems unfortunate in the extreme.
+
+=head2 More Inheritance Concerns
+
+Suppose that Some_Class were used as a base class from which to derive
+Another_Class.  If you invoke a &CData method on the derived class or
+on an object of that class, what do you get?  Would the derived class
+have its own state, or would it piggyback on its base class's versions
+of the class attributes?
+
+The answer is that under the scheme outlined above, the derived class
+would B<not> have its own state data.  As before, whether you consider
+this a good thing or a bad one depends on the semantics of the classes
+involved.
+
+The cleanest, sanest, simplest way to address per-class state in a
+lexical is for the derived class to override its base class's version
+of the method that accesses the class attributes.  Since the actual method
+called is the one in the object's derived class if this exists, you
+automatically get per-class state this way.  Any urge to provide an
+unadvertised method to sneak out a reference to the %ClassData hash
+should be strenuously resisted.
+
+As with any other overridden method, the implementation in the
+derived class always has the option of invoking its base class's
+version of the method in addition to its own.  Here's an example:
+
+    package Another_Class;
+    @ISA = qw(Some_Class);
+
+    my %ClassData = (
+	CData1 => "",
+    );
+
+    sub CData1 {
+	my($self, $newvalue) = @_;
+	if (@_ > 1) { 
+	    # set locally first
+	    $ClassData{CData1} = $newvalue;  
+
+	    # then pass the buck up to the first 
+	    # overridden version, if there is one
+	    if ($self->can("SUPER::CData1")) { 
+		$self->SUPER::CData1($newvalue);
+	    }
+	}
+	return $ClassData{CData1};
+    }
+
+Those dabbling in multiple inheritance might be concerned
+about there being more than one override.  
+
+    for my $parent (@ISA) {
+	my $methname = $parent . "::CData1";
+	if ($self->can($methname)) { 
+	    $self->$methname($newvalue);
+	}
+    } 
+
+Because the &UNIVERSAL::can method returns a reference
+to the function directly, you can use this directly
+for a significant performance improvement:
+
+    for my $parent (@ISA) {
+	if (my $coderef = $self->can($parent . "::CData1")) {
+	    $self->$coderef($newvalue);
+	}
+    }
+
+If you override C<UNIVERSAL::can> in your own classes, be sure to return the
+reference appropriately.
+
+=head2 Locking the Door and Throwing Away the Key
+
+As currently implemented, any code within the same scope as the
+file-scoped lexical %ClassData can alter that hash directly.  Is that
+ok?  Is it acceptable or even desirable to allow other parts of the
+implementation of this class to access class attributes directly?
+
+That depends on how careful you want to be.  Think back to the Cosmos
+class.  If the &supernova method had directly altered $Cosmos::Stars or
+C<$Cosmos::Cosmos{stars}>, then we wouldn't have been able to reuse the
+class when it came to inventing a Multiverse.  So letting even the class
+itself access its own class attributes without the mediating intervention of
+properly designed accessor methods is probably not a good idea after all.
+
+Restricting access to class attributes from the class itself is usually
+not enforceable even in strongly object-oriented languages.  But in Perl,
+you can.
+
+Here's one way:
+
+    package Some_Class;
+
+    {  # scope for hiding $CData1
+	my $CData1;
+	sub CData1 {
+	    shift;	# XXX: unused
+	    $CData1 = shift if @_;
+	    return $CData1;
+	} 
+    }
+
+    {  # scope for hiding $CData2
+	my $CData2;
+	sub CData2 {
+	    shift;	# XXX: unused
+	    $CData2 = shift if @_;
+	    return $CData2;
+	} 
+    }
+
+No one--absolutely no one--is allowed to read or write the class
+attributes without the mediation of the managing accessor method, since
+only that method has access to the lexical variable it's managing.
+This use of mediated access to class attributes is a form of privacy far
+stronger than most OO languages provide.
+
+The repetition of code used to create per-datum accessor methods chafes
+at our Laziness, so we'll again use closures to create similar
+methods.
+
+    package Some_Class;
+
+    {  # scope for ultra-private meta-object for class attributes
+	my %ClassData = ( 
+	    CData1 => "",
+	    CData2 => "",
+	);
+
+	for my $datum (keys %ClassData ) { 
+	    no strict "refs";    
+	    *$datum = sub {
+		use strict "refs";    
+		my ($self, $newvalue) = @_;
+		$ClassData{$datum} = $newvalue if @_ > 1;
+		return $ClassData{$datum};
+	    }
+	}
+
+    }
+
+The closure above can be modified to take inheritance into account using
+the &UNIVERSAL::can method and SUPER as shown previously.
+
+=head2 Translucency Revisited
+
+The Vermin class demonstrates translucency using a package variable,
+eponymously named %Vermin, as its meta-object.  If you prefer to
+use absolutely no package variables beyond those necessary to appease
+inheritance or possibly the Exporter, this strategy is closed to you.
+That's too bad, because translucent attributes are an appealing
+technique, so it would be valuable to devise an implementation using
+only lexicals.
+
+There's a second reason why you might wish to avoid the eponymous
+package hash.  If you use class names with double-colons in them, you
+would end up poking around somewhere you might not have meant to poke.
+
+    package Vermin;
+    $class = "Vermin";
+    $class->{PopCount}++;	
+    # accesses $Vermin::Vermin{PopCount}
+
+    package Vermin::Noxious;
+    $class = "Vermin::Noxious";
+    $class->{PopCount}++;	
+    # accesses $Vermin::Noxious{PopCount}
+
+In the first case, because the class name had no double-colons, we got
+the hash in the current package.  But in the second case, instead of
+getting some hash in the current package, we got the hash %Noxious in
+the Vermin package.  (The noxious vermin just invaded another package and
+sprayed their data around it. :-) Perl doesn't support relative packages
+in its naming conventions, so any double-colons trigger a fully-qualified
+lookup instead of just looking in the current package.
+
+In practice, it is unlikely that the Vermin class had an existing
+package variable named %Noxious that you just blew away.  If you're
+still mistrustful, you could always stake out your own territory
+where you know the rules, such as using Eponymous::Vermin::Noxious or
+Hieronymus::Vermin::Boschious or Leave_Me_Alone::Vermin::Noxious as class
+names instead.  Sure, it's in theory possible that someone else has
+a class named Eponymous::Vermin with its own %Noxious hash, but this
+kind of thing is always true.  There's no arbiter of package names.
+It's always the case that globals like @Cwd::ISA would collide if more
+than one class uses the same Cwd package.
+
+If this still leaves you with an uncomfortable twinge of paranoia,
+we have another solution for you.  There's nothing that says that you
+have to have a package variable to hold a class meta-object, either for
+monadic classes or for translucent attributes.  Just code up the methods
+so that they access a lexical instead.
+
+Here's another implementation of the Vermin class with semantics identical
+to those given previously, but this time using no package variables.
+
+    package Vermin;
+
+
+    # Here's the class meta-object, eponymously named.
+    # It holds all class data, and also all instance data 
+    # so the latter can be used for both initialization 
+    # and translucency.  it's a template.
+    my %ClassData = (   		
+	PopCount => 0,		# capital for class attributes
+	color    => "beige",    # small for instance attributes		
+    );
+
+    # constructor method
+    # invoked as class method or object method
+    sub spawn {
+	my $obclass = shift;
+	my $class   = ref($obclass) || $obclass;
+	my $self = {};
+	bless($self, $class);
+	$ClassData{PopCount}++;
+	# init fields from invoking object, or omit if 
+	# invoking object is the class to provide translucency
+	%$self = %$obclass if ref $obclass;
+	return $self;
+    } 
+
+    # translucent accessor for "color" attribute
+    # invoked as class method or object method
+    sub color {
+	my $self  = shift;
+
+	# handle class invocation
+	unless (ref $self) {
+	    $ClassData{color} = shift if @_;
+	    return $ClassData{color}
+	}
+
+	# handle object invocation
+	$self->{color} = shift if @_;
+	if (defined $self->{color}) {  # not exists!
+	    return $self->{color};
+	} else {
+	    return $ClassData{color};
+	} 
+    } 
+
+    # class attribute accessor for "PopCount" attribute
+    # invoked as class method or object method
+    sub population {
+	return $ClassData{PopCount};
+    } 
+
+    # instance destructor; invoked only as object method
+    sub DESTROY {
+	$ClassData{PopCount}--;
+    }
+
+    # detect whether an object attribute is translucent
+    # (typically?) invoked only as object method
+    sub is_translucent {
+	my($self, $attr)  = @_;
+	$self = \%ClassData if !ref $self;
+	return !defined $self->{$attr};  
+    }
+
+    # test for presence of attribute in class
+    # invoked as class method or object method
+    sub has_attribute {
+	my($self, $attr)  = @_;
+	return exists $ClassData{$attr};  
+    } 
+
+=head1 NOTES
+
+Inheritance is a powerful but subtle device, best used only after careful
+forethought and design.  Aggregation instead of inheritance is often a
+better approach.
+
+You can't use file-scoped lexicals in conjunction with the SelfLoader
+or the AutoLoader, because they alter the lexical scope in which the
+module's methods wind up getting compiled.
+
+The usual mealy-mouthed package-munging doubtless applies to setting
+up names of object attributes.  For example, C<< $self->{ObData1} >>
+should probably be C<< $self->{ __PACKAGE__ . "_ObData1" } >>, but that
+would just confuse the examples.
+
+=head1 SEE ALSO
+
+L<perltoot>, L<perlobj>, L<perlmod>, and L<perlbot>.
+
+The Tie::SecureHash and Class::Data::Inheritable modules from CPAN are
+worth checking out.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1999 Tom Christiansen.
+All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain.  You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit.  A simple comment in the code giving
+credit would be courteous but is not required.
+
+=head1 ACKNOWLEDGEMENTS
+
+Russ Allbery, Jon Orwant, Randy Ray, Larry Rosler, Nat Torkington,
+and Stephen Warren all contributed suggestions and corrections to this
+piece.  Thanks especially to Damian Conway for his ideas and feedback,
+and without whose indirect prodding I might never have taken the time
+to show others how much Perl has to offer in the way of objects once
+you start thinking outside the tiny little box that today's "popular"
+object-oriented languages enforce.
+
+=head1 HISTORY
+
+Last edit: Sun Feb  4 20:50:28 EST 2001
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perltoot.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perltoot.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perltoot.pod	(revision 14489)
@@ -0,0 +1,1775 @@
+=head1 NAME
+
+perltoot - Tom's object-oriented tutorial for perl
+
+=head1 DESCRIPTION
+
+Object-oriented programming is a big seller these days.  Some managers
+would rather have objects than sliced bread.  Why is that?  What's so
+special about an object?  Just what I<is> an object anyway?
+
+An object is nothing but a way of tucking away complex behaviours into
+a neat little easy-to-use bundle.  (This is what professors call
+abstraction.) Smart people who have nothing to do but sit around for
+weeks on end figuring out really hard problems make these nifty
+objects that even regular people can use. (This is what professors call
+software reuse.)  Users (well, programmers) can play with this little
+bundle all they want, but they aren't to open it up and mess with the
+insides.  Just like an expensive piece of hardware, the contract says
+that you void the warranty if you muck with the cover.  So don't do that.
+
+The heart of objects is the class, a protected little private namespace
+full of data and functions.  A class is a set of related routines that
+addresses some problem area.  You can think of it as a user-defined type.
+The Perl package mechanism, also used for more traditional modules,
+is used for class modules as well.  Objects "live" in a class, meaning
+that they belong to some package.
+
+More often than not, the class provides the user with little bundles.
+These bundles are objects.  They know whose class they belong to,
+and how to behave.  Users ask the class to do something, like "give
+me an object."  Or they can ask one of these objects to do something.
+Asking a class to do something for you is calling a I<class method>.
+Asking an object to do something for you is calling an I<object method>.
+Asking either a class (usually) or an object (sometimes) to give you
+back an object is calling a I<constructor>, which is just a
+kind of method.
+
+That's all well and good, but how is an object different from any other
+Perl data type?  Just what is an object I<really>; that is, what's its
+fundamental type?  The answer to the first question is easy.  An object
+is different from any other data type in Perl in one and only one way:
+you may dereference it using not merely string or numeric subscripts
+as with simple arrays and hashes, but with named subroutine calls.
+In a word, with I<methods>.
+
+The answer to the second question is that it's a reference, and not just
+any reference, mind you, but one whose referent has been I<bless>()ed
+into a particular class (read: package).  What kind of reference?  Well,
+the answer to that one is a bit less concrete.  That's because in Perl
+the designer of the class can employ any sort of reference they'd like
+as the underlying intrinsic data type.  It could be a scalar, an array,
+or a hash reference.  It could even be a code reference.  But because
+of its inherent flexibility, an object is usually a hash reference.
+
+=head1 Creating a Class
+
+Before you create a class, you need to decide what to name it.  That's
+because the class (package) name governs the name of the file used to
+house it, just as with regular modules.  Then, that class (package)
+should provide one or more ways to generate objects.  Finally, it should
+provide mechanisms to allow users of its objects to indirectly manipulate
+these objects from a distance.
+
+For example, let's make a simple Person class module.  It gets stored in
+the file Person.pm.  If it were called a Happy::Person class, it would
+be stored in the file Happy/Person.pm, and its package would become
+Happy::Person instead of just Person.  (On a personal computer not
+running Unix or Plan 9, but something like Mac OS or VMS, the directory
+separator may be different, but the principle is the same.)  Do not assume
+any formal relationship between modules based on their directory names.
+This is merely a grouping convenience, and has no effect on inheritance,
+variable accessibility, or anything else.
+
+For this module we aren't going to use Exporter, because we're
+a well-behaved class module that doesn't export anything at all.
+In order to manufacture objects, a class needs to have a I<constructor
+method>.  A constructor gives you back not just a regular data type,
+but a brand-new object in that class.  This magic is taken care of by
+the bless() function, whose sole purpose is to enable its referent to
+be used as an object.  Remember: being an object really means nothing
+more than that methods may now be called against it.
+
+While a constructor may be named anything you'd like, most Perl
+programmers seem to like to call theirs new().  However, new() is not
+a reserved word, and a class is under no obligation to supply such.
+Some programmers have also been known to use a function with
+the same name as the class as the constructor.
+
+=head2 Object Representation
+
+By far the most common mechanism used in Perl to represent a Pascal
+record, a C struct, or a C++ class is an anonymous hash.  That's because a
+hash has an arbitrary number of data fields, each conveniently accessed by
+an arbitrary name of your own devising.
+
+If you were just doing a simple
+struct-like emulation, you would likely go about it something like this:
+
+    $rec = {
+        name  => "Jason",
+        age   => 23,
+        peers => [ "Norbert", "Rhys", "Phineas"],
+    };
+
+If you felt like it, you could add a bit of visual distinction
+by up-casing the hash keys:
+
+    $rec = {
+        NAME  => "Jason",
+        AGE   => 23,
+        PEERS => [ "Norbert", "Rhys", "Phineas"],
+    };
+
+And so you could get at C<< $rec->{NAME} >> to find "Jason", or
+C<< @{ $rec->{PEERS} } >> to get at "Norbert", "Rhys", and "Phineas".
+(Have you ever noticed how many 23-year-old programmers seem to
+be named "Jason" these days? :-)
+
+This same model is often used for classes, although it is not considered
+the pinnacle of programming propriety for folks from outside the
+class to come waltzing into an object, brazenly accessing its data
+members directly.  Generally speaking, an object should be considered
+an opaque cookie that you use I<object methods> to access.  Visually,
+methods look like you're dereffing a reference using a function name
+instead of brackets or braces.
+
+=head2 Class Interface
+
+Some languages provide a formal syntactic interface to a class's methods,
+but Perl does not.  It relies on you to read the documentation of each
+class.  If you try to call an undefined method on an object, Perl won't
+complain, but the program will trigger an exception while it's running.
+Likewise, if you call a method expecting a prime number as its argument
+with a non-prime one instead, you can't expect the compiler to catch this.
+(Well, you can expect it all you like, but it's not going to happen.)
+
+Let's suppose you have a well-educated user of your Person class,
+someone who has read the docs that explain the prescribed
+interface.  Here's how they might use the Person class:
+
+    use Person;
+
+    $him = Person->new();
+    $him->name("Jason");
+    $him->age(23);
+    $him->peers( "Norbert", "Rhys", "Phineas" );
+
+    push @All_Recs, $him;  # save object in array for later
+
+    printf "%s is %d years old.\n", $him->name, $him->age;
+    print "His peers are: ", join(", ", $him->peers), "\n";
+
+    printf "Last rec's name is %s\n", $All_Recs[-1]->name;
+
+As you can see, the user of the class doesn't know (or at least, has no
+business paying attention to the fact) that the object has one particular
+implementation or another.  The interface to the class and its objects
+is exclusively via methods, and that's all the user of the class should
+ever play with.
+
+=head2 Constructors and Instance Methods
+
+Still, I<someone> has to know what's in the object.  And that someone is
+the class.  It implements methods that the programmer uses to access
+the object.  Here's how to implement the Person class using the standard
+hash-ref-as-an-object idiom.  We'll make a class method called new() to
+act as the constructor, and three object methods called name(), age(), and
+peers() to get at per-object data hidden away in our anonymous hash.
+
+    package Person;
+    use strict;
+
+    ##################################################
+    ## the object constructor (simplistic version)  ##
+    ##################################################
+    sub new {
+        my $self  = {};
+        $self->{NAME}   = undef;
+        $self->{AGE}    = undef;
+        $self->{PEERS}  = [];
+        bless($self);           # but see below
+        return $self;
+    }
+
+    ##############################################
+    ## methods to access per-object data        ##
+    ##                                          ##
+    ## With args, they set the value.  Without  ##
+    ## any, they only retrieve it/them.         ##
+    ##############################################
+
+    sub name {
+        my $self = shift;
+        if (@_) { $self->{NAME} = shift }
+        return $self->{NAME};
+    }
+
+    sub age {
+        my $self = shift;
+        if (@_) { $self->{AGE} = shift }
+        return $self->{AGE};
+    }
+
+    sub peers {
+        my $self = shift;
+        if (@_) { @{ $self->{PEERS} } = @_ }
+        return @{ $self->{PEERS} };
+    }
+
+    1;  # so the require or use succeeds
+
+We've created three methods to access an object's data, name(), age(),
+and peers().  These are all substantially similar.  If called with an
+argument, they set the appropriate field; otherwise they return the
+value held by that field, meaning the value of that hash key.
+
+=head2 Planning for the Future: Better Constructors
+
+Even though at this point you may not even know what it means, someday
+you're going to worry about inheritance.  (You can safely ignore this
+for now and worry about it later if you'd like.)  To ensure that this
+all works out smoothly, you must use the double-argument form of bless().
+The second argument is the class into which the referent will be blessed.
+By not assuming our own class as the default second argument and instead
+using the class passed into us, we make our constructor inheritable.
+
+    sub new {
+        my $class = shift;
+        my $self  = {};
+        $self->{NAME}   = undef;
+        $self->{AGE}    = undef;
+        $self->{PEERS}  = [];
+        bless ($self, $class);
+        return $self;
+    }
+
+That's about all there is for constructors.  These methods bring objects
+to life, returning neat little opaque bundles to the user to be used in
+subsequent method calls.
+
+=head2 Destructors
+
+Every story has a beginning and an end.  The beginning of the object's
+story is its constructor, explicitly called when the object comes into
+existence.  But the ending of its story is the I<destructor>, a method
+implicitly called when an object leaves this life.  Any per-object
+clean-up code is placed in the destructor, which must (in Perl) be called
+DESTROY.
+
+If constructors can have arbitrary names, then why not destructors?
+Because while a constructor is explicitly called, a destructor is not.
+Destruction happens automatically via Perl's garbage collection (GC)
+system, which is a quick but somewhat lazy reference-based GC system.
+To know what to call, Perl insists that the destructor be named DESTROY.
+Perl's notion of the right time to call a destructor is not well-defined
+currently, which is why your destructors should not rely on when they are
+called.
+
+Why is DESTROY in all caps?  Perl on occasion uses purely uppercase
+function names as a convention to indicate that the function will
+be automatically called by Perl in some way.  Others that are called
+implicitly include BEGIN, END, AUTOLOAD, plus all methods used by
+tied objects, described in L<perltie>.
+
+In really good object-oriented programming languages, the user doesn't
+care when the destructor is called.  It just happens when it's supposed
+to.  In low-level languages without any GC at all, there's no way to
+depend on this happening at the right time, so the programmer must
+explicitly call the destructor to clean up memory and state, crossing
+their fingers that it's the right time to do so.   Unlike C++, an
+object destructor is nearly never needed in Perl, and even when it is,
+explicit invocation is uncalled for.  In the case of our Person class,
+we don't need a destructor because Perl takes care of simple matters
+like memory deallocation.
+
+The only situation where Perl's reference-based GC won't work is
+when there's a circularity in the data structure, such as:
+
+    $this->{WHATEVER} = $this;
+
+In that case, you must delete the self-reference manually if you expect
+your program not to leak memory.  While admittedly error-prone, this is
+the best we can do right now.  Nonetheless, rest assured that when your
+program is finished, its objects' destructors are all duly called.
+So you are guaranteed that an object I<eventually> gets properly
+destroyed, except in the unique case of a program that never exits.
+(If you're running Perl embedded in another application, this full GC
+pass happens a bit more frequently--whenever a thread shuts down.)
+
+=head2 Other Object Methods
+
+The methods we've talked about so far have either been constructors or
+else simple "data methods", interfaces to data stored in the object.
+These are a bit like an object's data members in the C++ world, except
+that strangers don't access them as data.  Instead, they should only
+access the object's data indirectly via its methods.  This is an
+important rule: in Perl, access to an object's data should I<only>
+be made through methods.
+
+Perl doesn't impose restrictions on who gets to use which methods.
+The public-versus-private distinction is by convention, not syntax.
+(Well, unless you use the Alias module described below in
+L<Data Members as Variables>.)  Occasionally you'll see method names beginning or ending
+with an underscore or two.  This marking is a convention indicating
+that the methods are private to that class alone and sometimes to its
+closest acquaintances, its immediate subclasses.  But this distinction
+is not enforced by Perl itself.  It's up to the programmer to behave.
+
+There's no reason to limit methods to those that simply access data.
+Methods can do anything at all.  The key point is that they're invoked
+against an object or a class.  Let's say we'd like object methods that
+do more than fetch or set one particular field.
+
+    sub exclaim {
+        my $self = shift;
+        return sprintf "Hi, I'm %s, age %d, working with %s",
+            $self->{NAME}, $self->{AGE}, join(", ", @{$self->{PEERS}});
+    }
+
+Or maybe even one like this:
+
+    sub happy_birthday {
+        my $self = shift;
+        return ++$self->{AGE};
+    }
+
+Some might argue that one should go at these this way:
+
+    sub exclaim {
+        my $self = shift;
+        return sprintf "Hi, I'm %s, age %d, working with %s",
+            $self->name, $self->age, join(", ", $self->peers);
+    }
+
+    sub happy_birthday {
+        my $self = shift;
+        return $self->age( $self->age() + 1 );
+    }
+
+But since these methods are all executing in the class itself, this
+may not be critical.  There are tradeoffs to be made.  Using direct
+hash access is faster (about an order of magnitude faster, in fact), and
+it's more convenient when you want to interpolate in strings.  But using
+methods (the external interface) internally shields not just the users of
+your class but even you yourself from changes in your data representation.
+
+=head1 Class Data
+
+What about "class data", data items common to each object in a class?
+What would you want that for?  Well, in your Person class, you might
+like to keep track of the total people alive.  How do you implement that?
+
+You I<could> make it a global variable called $Person::Census.  But about
+only reason you'd do that would be if you I<wanted> people to be able to
+get at your class data directly.  They could just say $Person::Census
+and play around with it.  Maybe this is ok in your design scheme.
+You might even conceivably want to make it an exported variable.  To be
+exportable, a variable must be a (package) global.  If this were a
+traditional module rather than an object-oriented one, you might do that.
+
+While this approach is expected in most traditional modules, it's
+generally considered rather poor form in most object modules.  In an
+object module, you should set up a protective veil to separate interface
+from implementation.  So provide a class method to access class data
+just as you provide object methods to access object data.
+
+So, you I<could> still keep $Census as a package global and rely upon
+others to honor the contract of the module and therefore not play around
+with its implementation.  You could even be supertricky and make $Census a
+tied object as described in L<perltie>, thereby intercepting all accesses.
+
+But more often than not, you just want to make your class data a
+file-scoped lexical.  To do so, simply put this at the top of the file:
+
+    my $Census = 0;
+
+Even though the scope of a my() normally expires when the block in which
+it was declared is done (in this case the whole file being required or
+used), Perl's deep binding of lexical variables guarantees that the
+variable will not be deallocated, remaining accessible to functions
+declared within that scope.  This doesn't work with global variables
+given temporary values via local(), though.
+
+Irrespective of whether you leave $Census a package global or make
+it instead a file-scoped lexical, you should make these
+changes to your Person::new() constructor:
+
+    sub new {
+        my $class = shift;
+        my $self  = {};
+        $Census++;
+        $self->{NAME}   = undef;
+        $self->{AGE}    = undef;
+        $self->{PEERS}  = [];
+        bless ($self, $class);
+        return $self;
+    }
+
+    sub population {
+        return $Census;
+    }
+
+Now that we've done this, we certainly do need a destructor so that
+when Person is destroyed, the $Census goes down.  Here's how
+this could be done:
+
+    sub DESTROY { --$Census }
+
+Notice how there's no memory to deallocate in the destructor?  That's
+something that Perl takes care of for you all by itself.
+
+Alternatively, you could use the Class::Data::Inheritable module from
+CPAN.
+
+
+=head2 Accessing Class Data
+
+It turns out that this is not really a good way to go about handling
+class data.  A good scalable rule is that I<you must never reference class
+data directly from an object method>.  Otherwise you aren't building a
+scalable, inheritable class.  The object must be the rendezvous point
+for all operations, especially from an object method.  The globals
+(class data) would in some sense be in the "wrong" package in your
+derived classes.  In Perl, methods execute in the context of the class
+they were defined in, I<not> that of the object that triggered them.
+Therefore, namespace visibility of package globals in methods is unrelated
+to inheritance.
+
+Got that?  Maybe not.  Ok, let's say that some other class "borrowed"
+(well, inherited) the DESTROY method as it was defined above.  When those
+objects are destroyed, the original $Census variable will be altered,
+not the one in the new class's package namespace.  Perhaps this is what
+you want, but probably it isn't.
+
+Here's how to fix this.  We'll store a reference to the data in the
+value accessed by the hash key "_CENSUS".  Why the underscore?  Well,
+mostly because an initial underscore already conveys strong feelings
+of magicalness to a C programmer.  It's really just a mnemonic device
+to remind ourselves that this field is special and not to be used as
+a public data member in the same way that NAME, AGE, and PEERS are.
+(Because we've been developing this code under the strict pragma, prior
+to perl version 5.004 we'll have to quote the field name.)
+
+    sub new {
+        my $class = shift;
+        my $self  = {};
+        $self->{NAME}     = undef;
+        $self->{AGE}      = undef;
+        $self->{PEERS}    = [];
+        # "private" data
+        $self->{"_CENSUS"} = \$Census;
+        bless ($self, $class);
+        ++ ${ $self->{"_CENSUS"} };
+        return $self;
+    }
+
+    sub population {
+        my $self = shift;
+        if (ref $self) {
+            return ${ $self->{"_CENSUS"} };
+        } else {
+            return $Census;
+        }
+    }
+
+    sub DESTROY {
+        my $self = shift;
+        -- ${ $self->{"_CENSUS"} };
+    }
+
+=head2 Debugging Methods
+
+It's common for a class to have a debugging mechanism.  For example,
+you might want to see when objects are created or destroyed.  To do that,
+add a debugging variable as a file-scoped lexical.  For this, we'll pull
+in the standard Carp module to emit our warnings and fatal messages.
+That way messages will come out with the caller's filename and
+line number instead of our own; if we wanted them to be from our own
+perspective, we'd just use die() and warn() directly instead of croak()
+and carp() respectively.
+
+    use Carp;
+    my $Debugging = 0;
+
+Now add a new class method to access the variable.
+
+    sub debug {
+        my $class = shift;
+        if (ref $class)  { confess "Class method called as object method" }
+        unless (@_ == 1) { confess "usage: CLASSNAME->debug(level)" }
+        $Debugging = shift;
+    }
+
+Now fix up DESTROY to murmur a bit as the moribund object expires:
+
+    sub DESTROY {
+        my $self = shift;
+        if ($Debugging) { carp "Destroying $self " . $self->name }
+        -- ${ $self->{"_CENSUS"} };
+    }
+
+One could conceivably make a per-object debug state.  That
+way you could call both of these:
+
+    Person->debug(1);   # entire class
+    $him->debug(1);     # just this object
+
+To do so, we need our debugging method to be a "bimodal" one, one that
+works on both classes I<and> objects.  Therefore, adjust the debug()
+and DESTROY methods as follows:
+
+    sub debug {
+        my $self = shift;
+        confess "usage: thing->debug(level)"    unless @_ == 1;
+        my $level = shift;
+        if (ref($self))  {
+            $self->{"_DEBUG"} = $level;		# just myself
+        } else {
+            $Debugging        = $level;         # whole class
+        }
+    }
+
+    sub DESTROY {
+        my $self = shift;
+        if ($Debugging || $self->{"_DEBUG"}) {
+            carp "Destroying $self " . $self->name;
+        }
+        -- ${ $self->{"_CENSUS"} };
+    }
+
+What happens if a derived class (which we'll call Employee) inherits
+methods from this Person base class?  Then C<< Employee->debug() >>, when called
+as a class method, manipulates $Person::Debugging not $Employee::Debugging.
+
+=head2 Class Destructors
+
+The object destructor handles the death of each distinct object.  But sometimes
+you want a bit of cleanup when the entire class is shut down, which
+currently only happens when the program exits.  To make such a
+I<class destructor>, create a function in that class's package named
+END.  This works just like the END function in traditional modules,
+meaning that it gets called whenever your program exits unless it execs
+or dies of an uncaught signal.  For example,
+
+    sub END {
+        if ($Debugging) {
+            print "All persons are going away now.\n";
+        }
+    }
+
+When the program exits, all the class destructors (END functions) are
+be called in the opposite order that they were loaded in (LIFO order).
+
+=head2 Documenting the Interface
+
+And there you have it: we've just shown you the I<implementation> of this
+Person class.  Its I<interface> would be its documentation.  Usually this
+means putting it in pod ("plain old documentation") format right there
+in the same file.  In our Person example, we would place the following
+docs anywhere in the Person.pm file.  Even though it looks mostly like
+code, it's not.  It's embedded documentation such as would be used by
+the pod2man, pod2html, or pod2text programs.  The Perl compiler ignores
+pods entirely, just as the translators ignore code.  Here's an example of
+some pods describing the informal interface:
+
+    =head1 NAME
+
+    Person - class to implement people
+
+    =head1 SYNOPSIS
+
+     use Person;
+
+     #################
+     # class methods #
+     #################
+     $ob    = Person->new;
+     $count = Person->population;
+
+     #######################
+     # object data methods #
+     #######################
+
+     ### get versions ###
+         $who   = $ob->name;
+         $years = $ob->age;
+         @pals  = $ob->peers;
+
+     ### set versions ###
+         $ob->name("Jason");
+         $ob->age(23);
+         $ob->peers( "Norbert", "Rhys", "Phineas" );
+
+     ########################
+     # other object methods #
+     ########################
+
+     $phrase = $ob->exclaim;
+     $ob->happy_birthday;
+
+    =head1 DESCRIPTION
+
+    The Person class implements dah dee dah dee dah....
+
+That's all there is to the matter of interface versus implementation.
+A programmer who opens up the module and plays around with all the private
+little shiny bits that were safely locked up behind the interface contract
+has voided the warranty, and you shouldn't worry about their fate.
+
+=head1 Aggregation
+
+Suppose you later want to change the class to implement better names.
+Perhaps you'd like to support both given names (called Christian names,
+irrespective of one's religion) and family names (called surnames), plus
+nicknames and titles.  If users of your Person class have been properly
+accessing it through its documented interface, then you can easily change
+the underlying implementation.  If they haven't, then they lose and
+it's their fault for breaking the contract and voiding their warranty.
+
+To do this, we'll make another class, this one called Fullname.  What's
+the Fullname class look like?  To answer that question, you have to
+first figure out how you want to use it.  How about we use it this way:
+
+    $him = Person->new();
+    $him->fullname->title("St");
+    $him->fullname->christian("Thomas");
+    $him->fullname->surname("Aquinas");
+    $him->fullname->nickname("Tommy");
+    printf "His normal name is %s\n", $him->name;
+    printf "But his real name is %s\n", $him->fullname->as_string;
+
+Ok.  To do this, we'll change Person::new() so that it supports
+a full name field this way:
+
+    sub new {
+        my $class = shift;
+        my $self  = {};
+        $self->{FULLNAME} = Fullname->new();
+        $self->{AGE}      = undef;
+        $self->{PEERS}    = [];
+        $self->{"_CENSUS"} = \$Census;
+        bless ($self, $class);
+        ++ ${ $self->{"_CENSUS"} };
+        return $self;
+    }
+
+    sub fullname {
+        my $self = shift;
+        return $self->{FULLNAME};
+    }
+
+Then to support old code, define Person::name() this way:
+
+    sub name {
+        my $self = shift;
+        return $self->{FULLNAME}->nickname(@_)
+          ||   $self->{FULLNAME}->christian(@_);
+    }
+
+Here's the Fullname class.  We'll use the same technique
+of using a hash reference to hold data fields, and methods
+by the appropriate name to access them:
+
+    package Fullname;
+    use strict;
+
+    sub new {
+        my $class = shift;
+        my $self  = {
+            TITLE       => undef,
+            CHRISTIAN   => undef,
+            SURNAME     => undef,
+            NICK        => undef,
+        };
+        bless ($self, $class);
+        return $self;
+    }
+
+    sub christian {
+        my $self = shift;
+        if (@_) { $self->{CHRISTIAN} = shift }
+        return $self->{CHRISTIAN};
+    }
+
+    sub surname {
+        my $self = shift;
+        if (@_) { $self->{SURNAME} = shift }
+        return $self->{SURNAME};
+    }
+
+    sub nickname {
+        my $self = shift;
+        if (@_) { $self->{NICK} = shift }
+        return $self->{NICK};
+    }
+
+    sub title {
+        my $self = shift;
+        if (@_) { $self->{TITLE} = shift }
+        return $self->{TITLE};
+    }
+
+    sub as_string {
+        my $self = shift;
+        my $name = join(" ", @$self{'CHRISTIAN', 'SURNAME'});
+        if ($self->{TITLE}) {
+            $name = $self->{TITLE} . " " . $name;
+        }
+        return $name;
+    }
+
+    1;
+
+Finally, here's the test program:
+
+    #!/usr/bin/perl -w
+    use strict;
+    use Person;
+    sub END { show_census() }
+
+    sub show_census ()  {
+        printf "Current population: %d\n", Person->population;
+    }
+
+    Person->debug(1);
+
+    show_census();
+
+    my $him = Person->new();
+
+    $him->fullname->christian("Thomas");
+    $him->fullname->surname("Aquinas");
+    $him->fullname->nickname("Tommy");
+    $him->fullname->title("St");
+    $him->age(1);
+
+    printf "%s is really %s.\n", $him->name, $him->fullname->as_string;
+    printf "%s's age: %d.\n", $him->name, $him->age;
+    $him->happy_birthday;
+    printf "%s's age: %d.\n", $him->name, $him->age;
+
+    show_census();
+
+=head1 Inheritance
+
+Object-oriented programming systems all support some notion of
+inheritance.  Inheritance means allowing one class to piggy-back on
+top of another one so you don't have to write the same code again and
+again.  It's about software reuse, and therefore related to Laziness,
+the principal virtue of a programmer.  (The import/export mechanisms in
+traditional modules are also a form of code reuse, but a simpler one than
+the true inheritance that you find in object modules.)
+
+Sometimes the syntax of inheritance is built into the core of the
+language, and sometimes it's not.  Perl has no special syntax for
+specifying the class (or classes) to inherit from.  Instead, it's all
+strictly in the semantics.  Each package can have a variable called @ISA,
+which governs (method) inheritance.  If you try to call a method on an
+object or class, and that method is not found in that object's package,
+Perl then looks to @ISA for other packages to go looking through in
+search of the missing method.
+
+Like the special per-package variables recognized by Exporter (such as
+@EXPORT, @EXPORT_OK, @EXPORT_FAIL, %EXPORT_TAGS, and $VERSION), the @ISA
+array I<must> be a package-scoped global and not a file-scoped lexical
+created via my().  Most classes have just one item in their @ISA array.
+In this case, we have what's called "single inheritance", or SI for short.
+
+Consider this class:
+
+    package Employee;
+    use Person;
+    @ISA = ("Person");
+    1;
+
+Not a lot to it, eh?  All it's doing so far is loading in another
+class and stating that this one will inherit methods from that
+other class if need be.  We have given it none of its own methods.
+We rely upon an Employee to behave just like a Person.
+
+Setting up an empty class like this is called the "empty subclass test";
+that is, making a derived class that does nothing but inherit from a
+base class.  If the original base class has been designed properly,
+then the new derived class can be used as a drop-in replacement for the
+old one.  This means you should be able to write a program like this:
+
+    use Employee;
+    my $empl = Employee->new();
+    $empl->name("Jason");
+    $empl->age(23);
+    printf "%s is age %d.\n", $empl->name, $empl->age;
+
+By proper design, we mean always using the two-argument form of bless(),
+avoiding direct access of global data, and not exporting anything.  If you
+look back at the Person::new() function we defined above, we were careful
+to do that.  There's a bit of package data used in the constructor,
+but the reference to this is stored on the object itself and all other
+methods access package data via that reference, so we should be ok.
+
+What do we mean by the Person::new() function -- isn't that actually
+a method?  Well, in principle, yes.  A method is just a function that
+expects as its first argument a class name (package) or object
+(blessed reference).   Person::new() is the function that both the
+C<< Person->new() >> method and the C<< Employee->new() >> method end
+up calling.  Understand that while a method call looks a lot like a
+function call, they aren't really quite the same, and if you treat them
+as the same, you'll very soon be left with nothing but broken programs.
+First, the actual underlying calling conventions are different: method
+calls get an extra argument.  Second, function calls don't do inheritance,
+but methods do.
+
+        Method Call             Resulting Function Call
+        -----------             ------------------------
+        Person->new()           Person::new("Person")
+        Employee->new()         Person::new("Employee")
+
+So don't use function calls when you mean to call a method.
+
+If an employee is just a Person, that's not all too very interesting.
+So let's add some other methods.  We'll give our employee
+data fields to access their salary, their employee ID, and their
+start date.
+
+If you're getting a little tired of creating all these nearly identical
+methods just to get at the object's data, do not despair.  Later,
+we'll describe several different convenience mechanisms for shortening
+this up.  Meanwhile, here's the straight-forward way:
+
+    sub salary {
+        my $self = shift;
+        if (@_) { $self->{SALARY} = shift }
+        return $self->{SALARY};
+    }
+
+    sub id_number {
+        my $self = shift;
+        if (@_) { $self->{ID} = shift }
+        return $self->{ID};
+    }
+
+    sub start_date {
+        my $self = shift;
+        if (@_) { $self->{START_DATE} = shift }
+        return $self->{START_DATE};
+    }
+
+=head2 Overridden Methods
+
+What happens when both a derived class and its base class have the same
+method defined?  Well, then you get the derived class's version of that
+method.  For example, let's say that we want the peers() method called on
+an employee to act a bit differently.  Instead of just returning the list
+of peer names, let's return slightly different strings.  So doing this:
+
+    $empl->peers("Peter", "Paul", "Mary");
+    printf "His peers are: %s\n", join(", ", $empl->peers);
+
+will produce:
+
+    His peers are: PEON=PETER, PEON=PAUL, PEON=MARY
+
+To do this, merely add this definition into the Employee.pm file:
+
+    sub peers {
+        my $self = shift;
+        if (@_) { @{ $self->{PEERS} } = @_ }
+        return map { "PEON=\U$_" } @{ $self->{PEERS} };
+    }
+
+There, we've just demonstrated the high-falutin' concept known in certain
+circles as I<polymorphism>.  We've taken on the form and behaviour of
+an existing object, and then we've altered it to suit our own purposes.
+This is a form of Laziness.  (Getting polymorphed is also what happens
+when the wizard decides you'd look better as a frog.)
+
+Every now and then you'll want to have a method call trigger both its
+derived class (also known as "subclass") version as well as its base class
+(also known as "superclass") version.  In practice, constructors and
+destructors are likely to want to do this, and it probably also makes
+sense in the debug() method we showed previously.
+
+To do this, add this to Employee.pm:
+
+    use Carp;
+    my $Debugging = 0;
+
+    sub debug {
+        my $self = shift;
+        confess "usage: thing->debug(level)"    unless @_ == 1;
+        my $level = shift;
+        if (ref($self))  {
+            $self->{"_DEBUG"} = $level;
+        } else {
+            $Debugging = $level;            # whole class
+        }
+        Person::debug($self, $Debugging);   # don't really do this
+    }
+
+As you see, we turn around and call the Person package's debug() function.
+But this is far too fragile for good design.  What if Person doesn't
+have a debug() function, but is inheriting I<its> debug() method
+from elsewhere?  It would have been slightly better to say
+
+    Person->debug($Debugging);
+
+But even that's got too much hard-coded.  It's somewhat better to say
+
+    $self->Person::debug($Debugging);
+
+Which is a funny way to say to start looking for a debug() method up
+in Person.  This strategy is more often seen on overridden object methods
+than on overridden class methods.
+
+There is still something a bit off here.  We've hard-coded our
+superclass's name.  This in particular is bad if you change which classes
+you inherit from, or add others.  Fortunately, the pseudoclass SUPER
+comes to the rescue here.
+
+    $self->SUPER::debug($Debugging);
+
+This way it starts looking in my class's @ISA.  This only makes sense
+from I<within> a method call, though.  Don't try to access anything
+in SUPER:: from anywhere else, because it doesn't exist outside
+an overridden method call. Note that C<SUPER> refers to the superclass of
+the current package, I<not> to the superclass of C<$self>.
+
+Things are getting a bit complicated here.  Have we done anything
+we shouldn't?  As before, one way to test whether we're designing
+a decent class is via the empty subclass test.  Since we already have
+an Employee class that we're trying to check, we'd better get a new
+empty subclass that can derive from Employee.  Here's one:
+
+    package Boss;
+    use Employee;        # :-)
+    @ISA = qw(Employee);
+
+And here's the test program:
+
+    #!/usr/bin/perl -w
+    use strict;
+    use Boss;
+    Boss->debug(1);
+
+    my $boss = Boss->new();
+
+    $boss->fullname->title("Don");
+    $boss->fullname->surname("Pichon Alvarez");
+    $boss->fullname->christian("Federico Jesus");
+    $boss->fullname->nickname("Fred");
+
+    $boss->age(47);
+    $boss->peers("Frank", "Felipe", "Faust");
+
+    printf "%s is age %d.\n", $boss->fullname->as_string, $boss->age;
+    printf "His peers are: %s\n", join(", ", $boss->peers);
+
+Running it, we see that we're still ok.  If you'd like to dump out your
+object in a nice format, somewhat like the way the 'x' command works in
+the debugger, you could use the Data::Dumper module from CPAN this way:
+
+    use Data::Dumper;
+    print "Here's the boss:\n";
+    print Dumper($boss);
+
+Which shows us something like this:
+
+    Here's the boss:
+    $VAR1 = bless( {
+	 _CENSUS => \1,
+	 FULLNAME => bless( {
+			      TITLE => 'Don',
+			      SURNAME => 'Pichon Alvarez',
+			      NICK => 'Fred',
+			      CHRISTIAN => 'Federico Jesus'
+			    }, 'Fullname' ),
+	 AGE => 47,
+	 PEERS => [
+		    'Frank',
+		    'Felipe',
+		    'Faust'
+		  ]
+       }, 'Boss' );
+
+Hm.... something's missing there.  What about the salary, start date,
+and ID fields?  Well, we never set them to anything, even undef, so they
+don't show up in the hash's keys.  The Employee class has no new() method
+of its own, and the new() method in Person doesn't know about Employees.
+(Nor should it: proper OO design dictates that a subclass be allowed to
+know about its immediate superclass, but never vice-versa.)  So let's
+fix up Employee::new() this way:
+
+    sub new {
+        my $class = shift;
+        my $self  = $class->SUPER::new();
+        $self->{SALARY}        = undef;
+        $self->{ID}            = undef;
+        $self->{START_DATE}    = undef;
+        bless ($self, $class);          # reconsecrate
+        return $self;
+    }
+
+Now if you dump out an Employee or Boss object, you'll find
+that new fields show up there now.
+
+=head2 Multiple Inheritance
+
+Ok, at the risk of confusing beginners and annoying OO gurus, it's
+time to confess that Perl's object system includes that controversial
+notion known as multiple inheritance, or MI for short.  All this means
+is that rather than having just one parent class who in turn might
+itself have a parent class, etc., that you can directly inherit from
+two or more parents.  It's true that some uses of MI can get you into
+trouble, although hopefully not quite so much trouble with Perl as with
+dubiously-OO languages like C++.
+
+The way it works is actually pretty simple: just put more than one package
+name in your @ISA array.  When it comes time for Perl to go finding
+methods for your object, it looks at each of these packages in order.
+Well, kinda.  It's actually a fully recursive, depth-first order.
+Consider a bunch of @ISA arrays like this:
+
+    @First::ISA    = qw( Alpha );
+    @Second::ISA   = qw( Beta );
+    @Third::ISA    = qw( First Second );
+
+If you have an object of class Third:
+
+    my $ob = Third->new();
+    $ob->spin();
+
+How do we find a spin() method (or a new() method for that matter)?
+Because the search is depth-first, classes will be looked up
+in the following order: Third, First, Alpha, Second, and Beta.
+
+In practice, few class modules have been seen that actually
+make use of MI.  One nearly always chooses simple containership of
+one class within another over MI.  That's why our Person
+object I<contained> a Fullname object.  That doesn't mean
+it I<was> one.
+
+However, there is one particular area where MI in Perl is rampant:
+borrowing another class's class methods.  This is rather common,
+especially with some bundled "objectless" classes,
+like Exporter, DynaLoader, AutoLoader, and SelfLoader.  These classes
+do not provide constructors; they exist only so you may inherit their
+class methods.  (It's not entirely clear why inheritance was done
+here rather than traditional module importation.)
+
+For example, here is the POSIX module's @ISA:
+
+    package POSIX;
+    @ISA = qw(Exporter DynaLoader);
+
+The POSIX module isn't really an object module, but then,
+neither are Exporter or DynaLoader.  They're just lending their
+classes' behaviours to POSIX.
+
+Why don't people use MI for object methods much?  One reason is that
+it can have complicated side-effects.  For one thing, your inheritance
+graph (no longer a tree) might converge back to the same base class.
+Although Perl guards against recursive inheritance, merely having parents
+who are related to each other via a common ancestor, incestuous though
+it sounds, is not forbidden.  What if in our Third class shown above we
+wanted its new() method to also call both overridden constructors in its
+two parent classes?  The SUPER notation would only find the first one.
+Also, what about if the Alpha and Beta classes both had a common ancestor,
+like Nought?  If you kept climbing up the inheritance tree calling
+overridden methods, you'd end up calling Nought::new() twice,
+which might well be a bad idea.
+
+=head2 UNIVERSAL: The Root of All Objects
+
+Wouldn't it be convenient if all objects were rooted at some ultimate
+base class?  That way you could give every object common methods without
+having to go and add it to each and every @ISA.  Well, it turns out that
+you can.  You don't see it, but Perl tacitly and irrevocably assumes
+that there's an extra element at the end of @ISA: the class UNIVERSAL.
+In version 5.003, there were no predefined methods there, but you could put
+whatever you felt like into it.
+
+However, as of version 5.004 (or some subversive releases, like 5.003_08),
+UNIVERSAL has some methods in it already.  These are builtin to your Perl
+binary, so they don't take any extra time to load.  Predefined methods
+include isa(), can(), and VERSION().  isa() tells you whether an object or
+class "is" another one without having to traverse the hierarchy yourself:
+
+   $has_io = $fd->isa("IO::Handle");
+   $itza_handle = IO::Socket->isa("IO::Handle");
+
+The can() method, called against that object or class, reports back
+whether its string argument is a callable method name in that class.
+In fact, it gives you back a function reference to that method:
+
+   $his_print_method = $obj->can('as_string');
+
+Finally, the VERSION method checks whether the class (or the object's
+class) has a package global called $VERSION that's high enough, as in:
+
+    Some_Module->VERSION(3.0);
+    $his_vers = $ob->VERSION();
+
+However, we don't usually call VERSION ourselves.  (Remember that an all
+uppercase function name is a Perl convention that indicates that the
+function will be automatically used by Perl in some way.)  In this case,
+it happens when you say
+
+    use Some_Module 3.0;
+
+If you wanted to add version checking to your Person class explained
+above, just add this to Person.pm:
+
+    our $VERSION = '1.1';
+
+and then in Employee.pm you can say
+
+    use Person 1.1;
+
+And it would make sure that you have at least that version number or
+higher available.   This is not the same as loading in that exact version
+number.  No mechanism currently exists for concurrent installation of
+multiple versions of a module.  Lamentably.
+
+=head1 Alternate Object Representations
+
+Nothing requires objects to be implemented as hash references.  An object
+can be any sort of reference so long as its referent has been suitably
+blessed.  That means scalar, array, and code references are also fair
+game.
+
+A scalar would work if the object has only one datum to hold.  An array
+would work for most cases, but makes inheritance a bit dodgy because
+you have to invent new indices for the derived classes.
+
+=head2 Arrays as Objects
+
+If the user of your class honors the contract and sticks to the advertised
+interface, then you can change its underlying interface if you feel
+like it.  Here's another implementation that conforms to the same
+interface specification.  This time we'll use an array reference
+instead of a hash reference to represent the object.
+
+    package Person;
+    use strict;
+
+    my($NAME, $AGE, $PEERS) = ( 0 .. 2 );
+
+    ############################################
+    ## the object constructor (array version) ##
+    ############################################
+    sub new {
+        my $self = [];
+        $self->[$NAME]   = undef;  # this is unnecessary
+        $self->[$AGE]    = undef;  # as is this
+        $self->[$PEERS]  = [];     # but this isn't, really
+        bless($self);
+        return $self;
+    }
+
+    sub name {
+        my $self = shift;
+        if (@_) { $self->[$NAME] = shift }
+        return $self->[$NAME];
+    }
+
+    sub age {
+        my $self = shift;
+        if (@_) { $self->[$AGE] = shift }
+        return $self->[$AGE];
+    }
+
+    sub peers {
+        my $self = shift;
+        if (@_) { @{ $self->[$PEERS] } = @_ }
+        return @{ $self->[$PEERS] };
+    }
+
+    1;  # so the require or use succeeds
+
+You might guess that the array access would be a lot faster than the
+hash access, but they're actually comparable.  The array is a I<little>
+bit faster, but not more than ten or fifteen percent, even when you
+replace the variables above like $AGE with literal numbers, like 1.
+A bigger difference between the two approaches can be found in memory use.
+A hash representation takes up more memory than an array representation
+because you have to allocate memory for the keys as well as for the values.
+However, it really isn't that bad, especially since as of version 5.004,
+memory is only allocated once for a given hash key, no matter how many
+hashes have that key.  It's expected that sometime in the future, even
+these differences will fade into obscurity as more efficient underlying
+representations are devised.
+
+Still, the tiny edge in speed (and somewhat larger one in memory)
+is enough to make some programmers choose an array representation
+for simple classes.  There's still a little problem with
+scalability, though, because later in life when you feel
+like creating subclasses, you'll find that hashes just work
+out better.
+
+=head2 Closures as Objects
+
+Using a code reference to represent an object offers some fascinating
+possibilities.  We can create a new anonymous function (closure) who
+alone in all the world can see the object's data.  This is because we
+put the data into an anonymous hash that's lexically visible only to
+the closure we create, bless, and return as the object.  This object's
+methods turn around and call the closure as a regular subroutine call,
+passing it the field we want to affect.  (Yes,
+the double-function call is slow, but if you wanted fast, you wouldn't
+be using objects at all, eh? :-)
+
+Use would be similar to before:
+
+    use Person;
+    $him = Person->new();
+    $him->name("Jason");
+    $him->age(23);
+    $him->peers( [ "Norbert", "Rhys", "Phineas" ] );
+    printf "%s is %d years old.\n", $him->name, $him->age;
+    print "His peers are: ", join(", ", @{$him->peers}), "\n";
+
+but the implementation would be radically, perhaps even sublimely
+different:
+
+    package Person;
+
+    sub new {
+	 my $class  = shift;
+	 my $self = {
+	    NAME  => undef,
+	    AGE   => undef,
+	    PEERS => [],
+	 };
+	 my $closure = sub {
+	    my $field = shift;
+	    if (@_) { $self->{$field} = shift }
+	    return    $self->{$field};
+	};
+	bless($closure, $class);
+	return $closure;
+    }
+
+    sub name   { &{ $_[0] }("NAME",  @_[ 1 .. $#_ ] ) }
+    sub age    { &{ $_[0] }("AGE",   @_[ 1 .. $#_ ] ) }
+    sub peers  { &{ $_[0] }("PEERS", @_[ 1 .. $#_ ] ) }
+
+    1;
+
+Because this object is hidden behind a code reference, it's probably a bit
+mysterious to those whose background is more firmly rooted in standard
+procedural or object-based programming languages than in functional
+programming languages whence closures derive.  The object
+created and returned by the new() method is itself not a data reference
+as we've seen before.  It's an anonymous code reference that has within
+it access to a specific version (lexical binding and instantiation)
+of the object's data, which are stored in the private variable $self.
+Although this is the same function each time, it contains a different
+version of $self.
+
+When a method like C<$him-E<gt>name("Jason")> is called, its implicit
+zeroth argument is the invoking object--just as it is with all method
+calls.  But in this case, it's our code reference (something like a
+function pointer in C++, but with deep binding of lexical variables).
+There's not a lot to be done with a code reference beyond calling it, so
+that's just what we do when we say C<&{$_[0]}>.  This is just a regular
+function call, not a method call.  The initial argument is the string
+"NAME", and any remaining arguments are whatever had been passed to the
+method itself.
+
+Once we're executing inside the closure that had been created in new(),
+the $self hash reference suddenly becomes visible.  The closure grabs
+its first argument ("NAME" in this case because that's what the name()
+method passed it), and uses that string to subscript into the private
+hash hidden in its unique version of $self.
+
+Nothing under the sun will allow anyone outside the executing method to
+be able to get at this hidden data.  Well, nearly nothing.  You I<could>
+single step through the program using the debugger and find out the
+pieces while you're in the method, but everyone else is out of luck.
+
+There, if that doesn't excite the Scheme folks, then I just don't know
+what will.  Translation of this technique into C++, Java, or any other
+braindead-static language is left as a futile exercise for aficionados
+of those camps.
+
+You could even add a bit of nosiness via the caller() function and
+make the closure refuse to operate unless called via its own package.
+This would no doubt satisfy certain fastidious concerns of programming
+police and related puritans.
+
+If you were wondering when Hubris, the third principle virtue of a
+programmer, would come into play, here you have it. (More seriously,
+Hubris is just the pride in craftsmanship that comes from having written
+a sound bit of well-designed code.)
+
+=head1 AUTOLOAD: Proxy Methods
+
+Autoloading is a way to intercept calls to undefined methods.  An autoload
+routine may choose to create a new function on the fly, either loaded
+from disk or perhaps just eval()ed right there.  This define-on-the-fly
+strategy is why it's called autoloading.
+
+But that's only one possible approach.  Another one is to just
+have the autoloaded method itself directly provide the
+requested service.  When used in this way, you may think
+of autoloaded methods as "proxy" methods.
+
+When Perl tries to call an undefined function in a particular package
+and that function is not defined, it looks for a function in
+that same package called AUTOLOAD.  If one exists, it's called
+with the same arguments as the original function would have had.
+The fully-qualified name of the function is stored in that package's
+global variable $AUTOLOAD.  Once called, the function can do anything
+it would like, including defining a new function by the right name, and
+then doing a really fancy kind of C<goto> right to it, erasing itself
+from the call stack.
+
+What does this have to do with objects?  After all, we keep talking about
+functions, not methods.  Well, since a method is just a function with
+an extra argument and some fancier semantics about where it's found,
+we can use autoloading for methods, too.  Perl doesn't start looking
+for an AUTOLOAD method until it has exhausted the recursive hunt up
+through @ISA, though.  Some programmers have even been known to define
+a UNIVERSAL::AUTOLOAD method to trap unresolved method calls to any
+kind of object.
+
+=head2 Autoloaded Data Methods
+
+You probably began to get a little suspicious about the duplicated
+code way back earlier when we first showed you the Person class, and
+then later the Employee class.  Each method used to access the
+hash fields looked virtually identical.  This should have tickled
+that great programming virtue, Impatience, but for the time,
+we let Laziness win out, and so did nothing.  Proxy methods can cure
+this.
+
+Instead of writing a new function every time we want a new data field,
+we'll use the autoload mechanism to generate (actually, mimic) methods on
+the fly.  To verify that we're accessing a valid member, we will check
+against an C<_permitted> (pronounced "under-permitted") field, which
+is a reference to a file-scoped lexical (like a C file static) hash of permitted fields in this record
+called %fields.  Why the underscore?  For the same reason as the _CENSUS
+field we once used: as a marker that means "for internal use only".
+
+Here's what the module initialization code and class
+constructor will look like when taking this approach:
+
+    package Person;
+    use Carp;
+    our $AUTOLOAD;  # it's a package global
+
+    my %fields = (
+	name        => undef,
+	age         => undef,
+	peers       => undef,
+    );
+
+    sub new {
+	my $class = shift;
+	my $self  = {
+	    _permitted => \%fields,
+	    %fields,
+	};
+	bless $self, $class;
+	return $self;
+    }
+
+If we wanted our record to have default values, we could fill those in
+where current we have C<undef> in the %fields hash.
+
+Notice how we saved a reference to our class data on the object itself?
+Remember that it's important to access class data through the object
+itself instead of having any method reference %fields directly, or else
+you won't have a decent inheritance.
+
+The real magic, though, is going to reside in our proxy method, which
+will handle all calls to undefined methods for objects of class Person
+(or subclasses of Person).  It has to be called AUTOLOAD.  Again, it's
+all caps because it's called for us implicitly by Perl itself, not by
+a user directly.
+
+    sub AUTOLOAD {
+	my $self = shift;
+	my $type = ref($self)
+		    or croak "$self is not an object";
+
+	my $name = $AUTOLOAD;
+	$name =~ s/.*://;   # strip fully-qualified portion
+
+	unless (exists $self->{_permitted}->{$name} ) {
+	    croak "Can't access `$name' field in class $type";
+	}
+
+	if (@_) {
+	    return $self->{$name} = shift;
+	} else {
+	    return $self->{$name};
+	}
+    }
+
+Pretty nifty, eh?  All we have to do to add new data fields
+is modify %fields.  No new functions need be written.
+
+I could have avoided the C<_permitted> field entirely, but I
+wanted to demonstrate how to store a reference to class data on the
+object so you wouldn't have to access that class data
+directly from an object method.
+
+=head2 Inherited Autoloaded Data Methods
+
+But what about inheritance?  Can we define our Employee
+class similarly?  Yes, so long as we're careful enough.
+
+Here's how to be careful:
+
+    package Employee;
+    use Person;
+    use strict;
+    our @ISA = qw(Person);
+
+    my %fields = (
+	id          => undef,
+	salary      => undef,
+    );
+
+    sub new {
+	my $class = shift;
+	my $self  = $class->SUPER::new();
+	my($element);
+	foreach $element (keys %fields) {
+	    $self->{_permitted}->{$element} = $fields{$element};
+	}
+	@{$self}{keys %fields} = values %fields;
+	return $self;
+    }
+
+Once we've done this, we don't even need to have an
+AUTOLOAD function in the Employee package, because
+we'll grab Person's version of that via inheritance,
+and it will all work out just fine.
+
+=head1 Metaclassical Tools
+
+Even though proxy methods can provide a more convenient approach to making
+more struct-like classes than tediously coding up data methods as
+functions, it still leaves a bit to be desired.  For one thing, it means
+you have to handle bogus calls that you don't mean to trap via your proxy.
+It also means you have to be quite careful when dealing with inheritance,
+as detailed above.
+
+Perl programmers have responded to this by creating several different
+class construction classes.  These metaclasses are classes
+that create other classes.  A couple worth looking at are
+Class::Struct and Alias.  These and other related metaclasses can be
+found in the modules directory on CPAN.
+
+=head2 Class::Struct
+
+One of the older ones is Class::Struct.  In fact, its syntax and
+interface were sketched out long before perl5 even solidified into a
+real thing.  What it does is provide you a way to "declare" a class
+as having objects whose fields are of a specific type.  The function
+that does this is called, not surprisingly enough, struct().  Because
+structures or records are not base types in Perl, each time you want to
+create a class to provide a record-like data object, you yourself have
+to define a new() method, plus separate data-access methods for each of
+that record's fields.  You'll quickly become bored with this process.
+The Class::Struct::struct() function alleviates this tedium.
+
+Here's a simple example of using it:
+
+    use Class::Struct qw(struct);
+    use Jobbie;  # user-defined; see below
+
+    struct 'Fred' => {
+        one        => '$',
+        many       => '@',
+        profession => 'Jobbie',  # does not call Jobbie->new()
+    };
+
+    $ob = Fred->new(profession => Jobbie->new());
+    $ob->one("hmmmm");
+
+    $ob->many(0, "here");
+    $ob->many(1, "you");
+    $ob->many(2, "go");
+    print "Just set: ", $ob->many(2), "\n";
+
+    $ob->profession->salary(10_000);
+
+You can declare types in the struct to be basic Perl types, or
+user-defined types (classes).  User types will be initialized by calling
+that class's new() method.
+
+Take care that the C<Jobbie> object is not created automatically by the
+C<Fred> class's new() method, so you should specify a C<Jobbie> object
+when you create an instance of C<Fred>.
+
+Here's a real-world example of using struct generation.  Let's say you
+wanted to override Perl's idea of gethostbyname() and gethostbyaddr() so
+that they would return objects that acted like C structures.  We don't
+care about high-falutin' OO gunk.  All we want is for these objects to
+act like structs in the C sense.
+
+    use Socket;
+    use Net::hostent;
+    $h = gethostbyname("perl.com");  # object return
+    printf "perl.com's real name is %s, address %s\n",
+	$h->name, inet_ntoa($h->addr);
+
+Here's how to do this using the Class::Struct module.
+The crux is going to be this call:
+
+    struct 'Net::hostent' => [  	# note bracket
+	name       => '$',
+	aliases    => '@',
+	addrtype   => '$',
+	'length'   => '$',
+	addr_list  => '@',
+     ];
+
+Which creates object methods of those names and types.
+It even creates a new() method for us.
+
+We could also have implemented our object this way:
+
+    struct 'Net::hostent' => {  	# note brace
+	name       => '$',
+	aliases    => '@',
+	addrtype   => '$',
+	'length'   => '$',
+	addr_list  => '@',
+     };
+
+and then Class::Struct would have used an anonymous hash as the object
+type, instead of an anonymous array.  The array is faster and smaller,
+but the hash works out better if you eventually want to do inheritance.
+Since for this struct-like object we aren't planning on inheritance,
+this time we'll opt for better speed and size over better flexibility.
+
+Here's the whole implementation:
+
+    package Net::hostent;
+    use strict;
+
+    BEGIN {
+	use Exporter   ();
+	our @EXPORT      = qw(gethostbyname gethostbyaddr gethost);
+	our @EXPORT_OK   = qw(
+			       $h_name         @h_aliases
+			       $h_addrtype     $h_length
+			       @h_addr_list    $h_addr
+			   );
+	our %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+    }
+    our @EXPORT_OK;
+
+    # Class::Struct forbids use of @ISA
+    sub import { goto &Exporter::import }
+
+    use Class::Struct qw(struct);
+    struct 'Net::hostent' => [
+       name        => '$',
+       aliases     => '@',
+       addrtype    => '$',
+       'length'    => '$',
+       addr_list   => '@',
+    ];
+
+    sub addr { shift->addr_list->[0] }
+
+    sub populate (@) {
+	return unless @_;
+	my $hob = new();  # Class::Struct made this!
+	$h_name     =    $hob->[0]              = $_[0];
+	@h_aliases  = @{ $hob->[1] } = split ' ', $_[1];
+	$h_addrtype =    $hob->[2]              = $_[2];
+	$h_length   =    $hob->[3]              = $_[3];
+	$h_addr     =                             $_[4];
+	@h_addr_list = @{ $hob->[4] } =         @_[ (4 .. $#_) ];
+	return $hob;
+    }
+
+    sub gethostbyname ($)  { populate(CORE::gethostbyname(shift)) }
+
+    sub gethostbyaddr ($;$) {
+	my ($addr, $addrtype);
+	$addr = shift;
+	require Socket unless @_;
+	$addrtype = @_ ? shift : Socket::AF_INET();
+	populate(CORE::gethostbyaddr($addr, $addrtype))
+    }
+
+    sub gethost($) {
+	if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) {
+	   require Socket;
+	   &gethostbyaddr(Socket::inet_aton(shift));
+	} else {
+	   &gethostbyname;
+	}
+    }
+
+    1;
+
+We've snuck in quite a fair bit of other concepts besides just dynamic
+class creation, like overriding core functions, import/export bits,
+function prototyping, short-cut function call via C<&whatever>, and
+function replacement with C<goto &whatever>.  These all mostly make
+sense from the perspective of a traditional module, but as you can see,
+we can also use them in an object module.
+
+You can look at other object-based, struct-like overrides of core
+functions in the 5.004 release of Perl in File::stat, Net::hostent,
+Net::netent, Net::protoent, Net::servent, Time::gmtime, Time::localtime,
+User::grent, and User::pwent.  These modules have a final component
+that's all lowercase, by convention reserved for compiler pragmas,
+because they affect the compilation and change a builtin function.
+They also have the type names that a C programmer would most expect.
+
+=head2 Data Members as Variables
+
+If you're used to C++ objects, then you're accustomed to being able to
+get at an object's data members as simple variables from within a method.
+The Alias module provides for this, as well as a good bit more, such
+as the possibility of private methods that the object can call but folks
+outside the class cannot.
+
+Here's an example of creating a Person using the Alias module.
+When you update these magical instance variables, you automatically
+update value fields in the hash.  Convenient, eh?
+
+    package Person;
+
+    # this is the same as before...
+    sub new {
+	 my $class = shift;
+	 my $self = {
+	    NAME  => undef,
+	    AGE   => undef,
+	    PEERS => [],
+	};
+	bless($self, $class);
+	return $self;
+    }
+
+    use Alias qw(attr);
+    our ($NAME, $AGE, $PEERS);
+
+    sub name {
+	my $self = attr shift;
+	if (@_) { $NAME = shift; }
+	return    $NAME;
+    }
+
+    sub age {
+	my $self = attr shift;
+	if (@_) { $AGE = shift; }
+	return    $AGE;
+    }
+
+    sub peers {
+	my $self = attr shift;
+	if (@_) { @PEERS = @_; }
+	return    @PEERS;
+    }
+
+    sub exclaim {
+        my $self = attr shift;
+        return sprintf "Hi, I'm %s, age %d, working with %s",
+            $NAME, $AGE, join(", ", @PEERS);
+    }
+
+    sub happy_birthday {
+        my $self = attr shift;
+        return ++$AGE;
+    }
+
+The need for the C<our> declaration is because what Alias does
+is play with package globals with the same name as the fields.  To use
+globals while C<use strict> is in effect, you have to predeclare them.
+These package variables are localized to the block enclosing the attr()
+call just as if you'd used a local() on them.  However, that means that
+they're still considered global variables with temporary values, just
+as with any other local().
+
+It would be nice to combine Alias with
+something like Class::Struct or Class::MethodMaker.
+
+=head1 NOTES
+
+=head2 Object Terminology
+
+In the various OO literature, it seems that a lot of different words
+are used to describe only a few different concepts.  If you're not
+already an object programmer, then you don't need to worry about all
+these fancy words.  But if you are, then you might like to know how to
+get at the same concepts in Perl.
+
+For example, it's common to call an object an I<instance> of a class
+and to call those objects' methods I<instance methods>.  Data fields
+peculiar to each object are often called I<instance data> or I<object
+attributes>, and data fields common to all members of that class are
+I<class data>, I<class attributes>, or I<static data members>.
+
+Also, I<base class>, I<generic class>, and I<superclass> all describe
+the same notion, whereas I<derived class>, I<specific class>, and
+I<subclass> describe the other related one.
+
+C++ programmers have I<static methods> and I<virtual methods>,
+but Perl only has I<class methods> and I<object methods>.
+Actually, Perl only has methods.  Whether a method gets used
+as a class or object method is by usage only.  You could accidentally
+call a class method (one expecting a string argument) on an
+object (one expecting a reference), or vice versa.
+
+From the C++ perspective, all methods in Perl are virtual.
+This, by the way, is why they are never checked for function
+prototypes in the argument list as regular builtin and user-defined
+functions can be.
+
+Because a class is itself something of an object, Perl's classes can be
+taken as describing both a "class as meta-object" (also called I<object
+factory>) philosophy and the "class as type definition" (I<declaring>
+behaviour, not I<defining> mechanism) idea.  C++ supports the latter
+notion, but not the former.
+
+=head1 SEE ALSO
+
+The following manpages will doubtless provide more
+background for this one:
+L<perlmod>,
+L<perlref>,
+L<perlobj>,
+L<perlbot>,
+L<perltie>,
+and
+L<overload>.
+
+L<perlboot> is a kinder, gentler introduction to object-oriented
+programming.
+
+L<perltooc> provides more detail on class data.
+
+Some modules which might prove interesting are Class::Accessor,
+Class::Class, Class::Contract, Class::Data::Inheritable,
+Class::MethodMaker and Tie::SecureHash
+
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997, 1998 Tom Christiansen 
+All rights reserved.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain.  You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit.  A simple comment in the code giving
+credit would be courteous but is not required.
+
+=head1 COPYRIGHT
+
+=head2 Acknowledgments
+
+Thanks to
+Larry Wall,
+Roderick Schertler,
+Gurusamy Sarathy,
+Dean Roehrich,
+Raphael Manfredi,
+Brent Halsey,
+Greg Bacon,
+Brad Appleton,
+and many others for their helpful comments.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perltrap.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perltrap.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perltrap.pod	(revision 14489)
@@ -0,0 +1,1590 @@
+=head1 NAME
+
+perltrap - Perl traps for the unwary
+
+=head1 DESCRIPTION
+
+The biggest trap of all is forgetting to C<use warnings> or use the B<-w>
+switch; see L<perllexwarn> and L<perlrun>. The second biggest trap is not
+making your entire program runnable under C<use strict>.  The third biggest
+trap is not reading the list of changes in this version of Perl; see
+L<perldelta>.
+
+=head2 Awk Traps
+
+Accustomed B<awk> users should take special note of the following:
+
+=over 4
+
+=item *
+
+A Perl program executes only once, not once for each input line.  You can
+do an implicit loop with C<-n> or C<-p>.
+
+=item *
+
+The English module, loaded via
+
+    use English;
+
+allows you to refer to special variables (like C<$/>) with names (like
+$RS), as though they were in B<awk>; see L<perlvar> for details.
+
+=item *
+
+Semicolons are required after all simple statements in Perl (except
+at the end of a block).  Newline is not a statement delimiter.
+
+=item *
+
+Curly brackets are required on C<if>s and C<while>s.
+
+=item *
+
+Variables begin with "$", "@" or "%" in Perl.
+
+=item *
+
+Arrays index from 0.  Likewise string positions in substr() and
+index().
+
+=item *
+
+You have to decide whether your array has numeric or string indices.
+
+=item *
+
+Hash values do not spring into existence upon mere reference.
+
+=item *
+
+You have to decide whether you want to use string or numeric
+comparisons.
+
+=item *
+
+Reading an input line does not split it for you.  You get to split it
+to an array yourself.  And the split() operator has different
+arguments than B<awk>'s.
+
+=item *
+
+The current input line is normally in $_, not $0.  It generally does
+not have the newline stripped.  ($0 is the name of the program
+executed.)  See L<perlvar>.
+
+=item *
+
+$<I<digit>> does not refer to fields--it refers to substrings matched
+by the last match pattern.
+
+=item *
+
+The print() statement does not add field and record separators unless
+you set C<$,> and C<$\>.  You can set $OFS and $ORS if you're using
+the English module.
+
+=item *
+
+You must open your files before you print to them.
+
+=item *
+
+The range operator is "..", not comma.  The comma operator works as in
+C.
+
+=item *
+
+The match operator is "=~", not "~".  ("~" is the one's complement
+operator, as in C.)
+
+=item *
+
+The exponentiation operator is "**", not "^".  "^" is the XOR
+operator, as in C.  (You know, one could get the feeling that B<awk> is
+basically incompatible with C.)
+
+=item *
+
+The concatenation operator is ".", not the null string.  (Using the
+null string would render C</pat/ /pat/> unparsable, because the third slash
+would be interpreted as a division operator--the tokenizer is in fact
+slightly context sensitive for operators like "/", "?", and ">".
+And in fact, "." itself can be the beginning of a number.)
+
+=item *
+
+The C<next>, C<exit>, and C<continue> keywords work differently.
+
+=item *
+
+
+The following variables work differently:
+
+      Awk	Perl
+      ARGC	scalar @ARGV (compare with $#ARGV)
+      ARGV[0]	$0
+      FILENAME	$ARGV
+      FNR	$. - something
+      FS	(whatever you like)
+      NF	$#Fld, or some such
+      NR	$.
+      OFMT	$#
+      OFS	$,
+      ORS	$\
+      RLENGTH	length($&)
+      RS	$/
+      RSTART	length($`)
+      SUBSEP	$;
+
+=item *
+
+You cannot set $RS to a pattern, only a string.
+
+=item *
+
+When in doubt, run the B<awk> construct through B<a2p> and see what it
+gives you.
+
+=back
+
+=head2 C/C++ Traps
+
+Cerebral C and C++ programmers should take note of the following:
+
+=over 4
+
+=item *
+
+Curly brackets are required on C<if>'s and C<while>'s.
+
+=item *
+
+You must use C<elsif> rather than C<else if>.
+
+=item *
+
+The C<break> and C<continue> keywords from C become in Perl C<last>
+and C<next>, respectively.  Unlike in C, these do I<not> work within a
+C<do { } while> construct.  See L<perlsyn/"Loop Control">.
+
+=item *
+
+There's no switch statement.  (But it's easy to build one on the fly,
+see L<perlsyn/"Basic BLOCKs and Switch Statements">)
+
+=item *
+
+Variables begin with "$", "@" or "%" in Perl.
+
+=item *
+
+Comments begin with "#", not "/*" or "//".  Perl may interpret C/C++
+comments as division operators, unterminated regular expressions or
+the defined-or operator.
+
+=item *
+
+You can't take the address of anything, although a similar operator
+in Perl is the backslash, which creates a reference.
+
+=item *
+
+C<ARGV> must be capitalized.  C<$ARGV[0]> is C's C<argv[1]>, and C<argv[0]>
+ends up in C<$0>.
+
+=item *
+
+System calls such as link(), unlink(), rename(), etc. return nonzero for
+success, not 0. (system(), however, returns zero for success.)
+
+=item *
+
+Signal handlers deal with signal names, not numbers.  Use C<kill -l>
+to find their names on your system.
+
+=back
+
+=head2 Sed Traps
+
+Seasoned B<sed> programmers should take note of the following:
+
+=over 4
+
+=item *
+
+A Perl program executes only once, not once for each input line.  You can
+do an implicit loop with C<-n> or C<-p>.
+
+=item *
+
+Backreferences in substitutions use "$" rather than "\".
+
+=item *
+
+The pattern matching metacharacters "(", ")", and "|" do not have backslashes
+in front.
+
+=item *
+
+The range operator is C<...>, rather than comma.
+
+=back
+
+=head2 Shell Traps
+
+Sharp shell programmers should take note of the following:
+
+=over 4
+
+=item *
+
+The backtick operator does variable interpolation without regard to
+the presence of single quotes in the command.
+
+=item *
+
+The backtick operator does no translation of the return value, unlike B<csh>.
+
+=item *
+
+Shells (especially B<csh>) do several levels of substitution on each
+command line.  Perl does substitution in only certain constructs
+such as double quotes, backticks, angle brackets, and search patterns.
+
+=item *
+
+Shells interpret scripts a little bit at a time.  Perl compiles the
+entire program before executing it (except for C<BEGIN> blocks, which
+execute at compile time).
+
+=item *
+
+The arguments are available via @ARGV, not $1, $2, etc.
+
+=item *
+
+The environment is not automatically made available as separate scalar
+variables.
+
+=item *
+
+The shell's C<test> uses "=", "!=", "<" etc for string comparisons and "-eq",
+"-ne", "-lt" etc for numeric comparisons. This is the reverse of Perl, which
+uses C<eq>, C<ne>, C<lt> for string comparisons, and C<==>, C<!=> C<< < >> etc
+for numeric comparisons.
+
+=back
+
+=head2 Perl Traps
+
+Practicing Perl Programmers should take note of the following:
+
+=over 4
+
+=item *
+
+Remember that many operations behave differently in a list
+context than they do in a scalar one.  See L<perldata> for details.
+
+=item *
+
+Avoid barewords if you can, especially all lowercase ones.
+You can't tell by just looking at it whether a bareword is
+a function or a string.  By using quotes on strings and
+parentheses on function calls, you won't ever get them confused.
+
+=item *
+
+You cannot discern from mere inspection which builtins
+are unary operators (like chop() and chdir())
+and which are list operators (like print() and unlink()).
+(Unless prototyped, user-defined subroutines can B<only> be list
+operators, never unary ones.)  See L<perlop> and L<perlsub>.
+
+=item *
+
+People have a hard time remembering that some functions
+default to $_, or @ARGV, or whatever, but that others which
+you might expect to do not.
+
+=item *
+
+The <FH> construct is not the name of the filehandle, it is a readline
+operation on that handle.  The data read is assigned to $_ only if the
+file read is the sole condition in a while loop:
+
+    while (<FH>)      { }
+    while (defined($_ = <FH>)) { }..
+    <FH>;  # data discarded!
+
+=item *
+
+Remember not to use C<=> when you need C<=~>;
+these two constructs are quite different:
+
+    $x =  /foo/;
+    $x =~ /foo/;
+
+=item *
+
+The C<do {}> construct isn't a real loop that you can use
+loop control on.
+
+=item *
+
+Use C<my()> for local variables whenever you can get away with
+it (but see L<perlform> for where you can't).
+Using C<local()> actually gives a local value to a global
+variable, which leaves you open to unforeseen side-effects
+of dynamic scoping.
+
+=item *
+
+If you localize an exported variable in a module, its exported value will
+not change.  The local name becomes an alias to a new value but the
+external name is still an alias for the original.
+
+=back
+
+=head2 Perl4 to Perl5 Traps
+
+Practicing Perl4 Programmers should take note of the following
+Perl4-to-Perl5 specific traps.
+
+They're crudely ordered according to the following list:
+
+=over 4
+
+=item Discontinuance, Deprecation, and BugFix traps
+
+Anything that's been fixed as a perl4 bug, removed as a perl4 feature
+or deprecated as a perl4 feature with the intent to encourage usage of
+some other perl5 feature.
+
+=item Parsing Traps
+
+Traps that appear to stem from the new parser.
+
+=item Numerical Traps
+
+Traps having to do with numerical or mathematical operators.
+
+=item General data type traps
+
+Traps involving perl standard data types.
+
+=item Context Traps - scalar, list contexts
+
+Traps related to context within lists, scalar statements/declarations.
+
+=item Precedence Traps
+
+Traps related to the precedence of parsing, evaluation, and execution of
+code.
+
+=item General Regular Expression Traps using s///, etc.
+
+Traps related to the use of pattern matching.
+
+=item Subroutine, Signal, Sorting Traps
+
+Traps related to the use of signals and signal handlers, general subroutines,
+and sorting, along with sorting subroutines.
+
+=item OS Traps
+
+OS-specific traps.
+
+=item DBM Traps
+
+Traps specific to the use of C<dbmopen()>, and specific dbm implementations.
+
+=item Unclassified Traps
+
+Everything else.
+
+=back
+
+If you find an example of a conversion trap that is not listed here,
+please submit it to <F<perlbug@perl.org>> for inclusion.
+Also note that at least some of these can be caught with the
+C<use warnings> pragma or the B<-w> switch.
+
+=head2 Discontinuance, Deprecation, and BugFix traps
+
+Anything that has been discontinued, deprecated, or fixed as
+a bug from perl4.
+
+=over 4
+
+=item * Symbols starting with "_" no longer forced into main
+
+Symbols starting with "_" are no longer forced into package main, except
+for C<$_> itself (and C<@_>, etc.).
+
+    package test;
+    $_legacy = 1;
+
+    package main;
+    print "\$_legacy is ",$_legacy,"\n";
+
+    # perl4 prints: $_legacy is 1
+    # perl5 prints: $_legacy is
+
+=item * Double-colon valid package separator in variable name
+
+Double-colon is now a valid package separator in a variable name.  Thus these
+behave differently in perl4 vs. perl5, because the packages don't exist.
+
+    $a=1;$b=2;$c=3;$var=4;
+    print "$a::$b::$c ";
+    print "$var::abc::xyz\n";
+
+    # perl4 prints: 1::2::3 4::abc::xyz
+    # perl5 prints: 3
+
+Given that C<::> is now the preferred package delimiter, it is debatable
+whether this should be classed as a bug or not.
+(The older package delimiter, ' ,is used here)
+
+    $x = 10;
+    print "x=${'x}\n";
+
+    # perl4 prints: x=10
+    # perl5 prints: Can't find string terminator "'" anywhere before EOF
+
+You can avoid this problem, and remain compatible with perl4, if you
+always explicitly include the package name:
+
+    $x = 10;
+    print "x=${main'x}\n";
+
+Also see precedence traps, for parsing C<$:>.
+
+=item * 2nd and 3rd args to C<splice()> are now in scalar context
+
+The second and third arguments of C<splice()> are now evaluated in scalar
+context (as the Camel says) rather than list context.
+
+    sub sub1{return(0,2) }          # return a 2-element list
+    sub sub2{ return(1,2,3)}        # return a 3-element list
+    @a1 = ("a","b","c","d","e");
+    @a2 = splice(@a1,&sub1,&sub2);
+    print join(' ',@a2),"\n";
+
+    # perl4 prints: a b
+    # perl5 prints: c d e
+
+=item * Can't do C<goto> into a block that is optimized away
+
+You can't do a C<goto> into a block that is optimized away.  Darn.
+
+    goto marker1;
+
+    for(1){
+    marker1:
+        print "Here I is!\n";
+    }
+
+    # perl4 prints: Here I is!
+    # perl5 errors: Can't "goto" into the middle of a foreach loop
+
+=item * Can't use whitespace as variable name or quote delimiter
+
+It is no longer syntactically legal to use whitespace as the name
+of a variable, or as a delimiter for any kind of quote construct.
+Double darn.
+
+    $a = ("foo bar");
+    $b = q baz;
+    print "a is $a, b is $b\n";
+
+    # perl4 prints: a is foo bar, b is baz
+    # perl5 errors: Bareword found where operator expected
+
+=item * C<while/if BLOCK BLOCK> gone
+
+The archaic while/if BLOCK BLOCK syntax is no longer supported.
+
+    if { 1 } {
+        print "True!";
+    }
+    else {
+        print "False!";
+    }
+
+    # perl4 prints: True!
+    # perl5 errors: syntax error at test.pl line 1, near "if {"
+
+=item * C<**> binds tighter than unary minus
+
+The C<**> operator now binds more tightly than unary minus.
+It was documented to work this way before, but didn't.
+
+    print -4**2,"\n";
+
+    # perl4 prints: 16
+    # perl5 prints: -16
+
+=item * C<foreach> changed when iterating over a list
+
+The meaning of C<foreach{}> has changed slightly when it is iterating over a
+list which is not an array.  This used to assign the list to a
+temporary array, but no longer does so (for efficiency).  This means
+that you'll now be iterating over the actual values, not over copies of
+the values.  Modifications to the loop variable can change the original
+values.
+
+    @list = ('ab','abc','bcd','def');
+    foreach $var (grep(/ab/,@list)){
+        $var = 1;
+    }
+    print (join(':',@list));
+
+    # perl4 prints: ab:abc:bcd:def
+    # perl5 prints: 1:1:bcd:def
+
+To retain Perl4 semantics you need to assign your list
+explicitly to a temporary array and then iterate over that.  For
+example, you might need to change
+
+    foreach $var (grep(/ab/,@list)){
+
+to
+
+    foreach $var (@tmp = grep(/ab/,@list)){
+
+Otherwise changing $var will clobber the values of @list.  (This most often
+happens when you use C<$_> for the loop variable, and call subroutines in
+the loop that don't properly localize C<$_>.)
+
+=item * C<split> with no args behavior changed
+
+C<split> with no arguments now behaves like C<split ' '> (which doesn't
+return an initial null field if $_ starts with whitespace), it used to
+behave like C<split /\s+/> (which does).
+
+    $_ = ' hi mom';
+    print join(':', split);
+
+    # perl4 prints: :hi:mom
+    # perl5 prints: hi:mom
+
+=item * B<-e> behavior fixed
+
+Perl 4 would ignore any text which was attached to an B<-e> switch,
+always taking the code snippet from the following arg.  Additionally, it
+would silently accept an B<-e> switch without a following arg.  Both of
+these behaviors have been fixed.
+
+    perl -e'print "attached to -e"' 'print "separate arg"'
+
+    # perl4 prints: separate arg
+    # perl5 prints: attached to -e
+
+    perl -e
+
+    # perl4 prints:
+    # perl5 dies: No code specified for -e.
+
+=item * C<push> returns number of elements in resulting list
+
+In Perl 4 the return value of C<push> was undocumented, but it was
+actually the last value being pushed onto the target list.  In Perl 5
+the return value of C<push> is documented, but has changed, it is the
+number of elements in the resulting list.
+
+    @x = ('existing');
+    print push(@x, 'first new', 'second new');
+
+    # perl4 prints: second new
+    # perl5 prints: 3
+
+=item * Some error messages differ
+
+Some error messages will be different.
+
+=item * C<split()> honors subroutine args
+
+In Perl 4, if in list context the delimiters to the first argument of
+C<split()> were C<??>, the result would be placed in C<@_> as well as
+being returned.   Perl 5 has more respect for your subroutine arguments.
+
+=item * Bugs removed
+
+Some bugs may have been inadvertently removed.  :-)
+
+=back
+
+=head2 Parsing Traps
+
+Perl4-to-Perl5 traps from having to do with parsing.
+
+=over 4
+
+=item * Space between . and = triggers syntax error
+
+Note the space between . and =
+
+    $string . = "more string";
+    print $string;
+
+    # perl4 prints: more string
+    # perl5 prints: syntax error at - line 1, near ". ="
+
+=item * Better parsing in perl 5
+
+Better parsing in perl 5
+
+    sub foo {}
+    &foo
+    print("hello, world\n");
+
+    # perl4 prints: hello, world
+    # perl5 prints: syntax error
+
+=item * Function parsing
+
+"if it looks like a function, it is a function" rule.
+
+  print
+    ($foo == 1) ? "is one\n" : "is zero\n";
+
+    # perl4 prints: is zero
+    # perl5 warns: "Useless use of a constant in void context" if using -w
+
+=item * String interpolation of C<$#array> differs
+
+String interpolation of the C<$#array> construct differs when braces
+are to used around the name.
+
+    @a = (1..3);
+    print "${#a}";
+
+    # perl4 prints: 2
+    # perl5 fails with syntax error
+
+    @ = (1..3);
+    print "$#{a}";
+
+    # perl4 prints: {a}
+    # perl5 prints: 2
+
+=item * Perl guesses on C<map>, C<grep> followed by C<{> if it starts BLOCK or hash ref
+
+When perl sees C<map {> (or C<grep {>), it has to guess whether the C<{>
+starts a BLOCK or a hash reference. If it guesses wrong, it will report
+a syntax error near the C<}> and the missing (or unexpected) comma.
+
+Use unary C<+> before C<{> on a hash reference, and unary C<+> applied
+to the first thing in a BLOCK (after C<{>), for perl to guess right all
+the time. (See L<perlfunc/map>.)
+
+=back
+
+=head2 Numerical Traps
+
+Perl4-to-Perl5 traps having to do with numerical operators,
+operands, or output from same.
+
+=over 5
+
+=item * Formatted output and significant digits
+
+Formatted output and significant digits.  In general, Perl 5
+tries to be more precise.  For example, on a Solaris Sparc:
+
+    print 7.373504 - 0, "\n";
+    printf "%20.18f\n", 7.373504 - 0;
+
+    # Perl4 prints:
+    7.3750399999999996141
+    7.375039999999999614
+
+    # Perl5 prints:
+    7.373504
+    7.375039999999999614
+
+Notice how the first result looks better in Perl 5.
+
+Your results may vary, since your floating point formatting routines
+and even floating point format may be slightly different.
+
+=item * Auto-increment operator over signed int limit deleted
+
+This specific item has been deleted.  It demonstrated how the auto-increment
+operator would not catch when a number went over the signed int limit.  Fixed
+in version 5.003_04.  But always be wary when using large integers.
+If in doubt:
+
+   use Math::BigInt;
+
+=item * Assignment of return values from numeric equality tests doesn't work
+
+Assignment of return values from numeric equality tests
+does not work in perl5 when the test evaluates to false (0).
+Logical tests now return a null, instead of 0
+
+    $p = ($test == 1);
+    print $p,"\n";
+
+    # perl4 prints: 0
+    # perl5 prints:
+
+Also see L<"General Regular Expression Traps using s///, etc.">
+for another example of this new feature...
+
+=item * Bitwise string ops
+
+When bitwise operators which can operate upon either numbers or
+strings (C<& | ^ ~>) are given only strings as arguments, perl4 would
+treat the operands as bitstrings so long as the program contained a call
+to the C<vec()> function. perl5 treats the string operands as bitstrings.
+(See L<perlop/Bitwise String Operators> for more details.)
+
+    $fred = "10";
+    $barney = "12";
+    $betty = $fred & $barney;
+    print "$betty\n";
+    # Uncomment the next line to change perl4's behavior
+    # ($dummy) = vec("dummy", 0, 0);
+
+    # Perl4 prints:
+    8
+
+    # Perl5 prints:
+    10
+
+    # If vec() is used anywhere in the program, both print:
+    10
+
+=back
+
+=head2 General data type traps
+
+Perl4-to-Perl5 traps involving most data-types, and their usage
+within certain expressions and/or context.
+
+=over 5
+
+=item * Negative array subscripts now count from the end of array
+
+Negative array subscripts now count from the end of the array.
+
+    @a = (1, 2, 3, 4, 5);
+    print "The third element of the array is $a[3] also expressed as $a[-2] \n";
+
+    # perl4 prints: The third element of the array is 4 also expressed as
+    # perl5 prints: The third element of the array is 4 also expressed as 4
+
+=item * Setting C<$#array> lower now discards array elements
+
+Setting C<$#array> lower now discards array elements, and makes them
+impossible to recover.
+
+    @a = (a,b,c,d,e);
+    print "Before: ",join('',@a);
+    $#a =1;
+    print ", After: ",join('',@a);
+    $#a =3;
+    print ", Recovered: ",join('',@a),"\n";
+
+    # perl4 prints: Before: abcde, After: ab, Recovered: abcd
+    # perl5 prints: Before: abcde, After: ab, Recovered: ab
+
+=item * Hashes get defined before use
+
+Hashes get defined before use
+
+    local($s,@a,%h);
+    die "scalar \$s defined" if defined($s);
+    die "array \@a defined" if defined(@a);
+    die "hash \%h defined" if defined(%h);
+
+    # perl4 prints:
+    # perl5 dies: hash %h defined
+
+Perl will now generate a warning when it sees defined(@a) and
+defined(%h).
+
+=item * Glob assignment from localized variable to variable
+
+glob assignment from variable to variable will fail if the assigned
+variable is localized subsequent to the assignment
+
+    @a = ("This is Perl 4");
+    *b = *a;
+    local(@a);
+    print @b,"\n";
+
+    # perl4 prints: This is Perl 4
+    # perl5 prints:
+
+=item * Assigning C<undef> to glob
+
+Assigning C<undef> to a glob has no effect in Perl 5.   In Perl 4
+it undefines the associated scalar (but may have other side effects
+including SEGVs). Perl 5 will also warn if C<undef> is assigned to a
+typeglob. (Note that assigning C<undef> to a typeglob is different
+than calling the C<undef> function on a typeglob (C<undef *foo>), which
+has quite a few effects.
+
+    $foo = "bar";
+    *foo = undef;
+    print $foo;
+
+    # perl4 prints:
+    # perl4 warns: "Use of uninitialized variable" if using -w
+    # perl5 prints: bar
+    # perl5 warns: "Undefined value assigned to typeglob" if using -w
+
+=item * Changes in unary negation (of strings)
+
+Changes in unary negation (of strings)
+This change effects both the return value and what it
+does to auto(magic)increment.
+
+    $x = "aaa";
+    print ++$x," : ";
+    print -$x," : ";
+    print ++$x,"\n";
+
+    # perl4 prints: aab : -0 : 1
+    # perl5 prints: aab : -aab : aac
+
+=item * Modifying of constants prohibited
+
+perl 4 lets you modify constants:
+
+    $foo = "x";
+    &mod($foo);
+    for ($x = 0; $x < 3; $x++) {
+        &mod("a");
+    }
+    sub mod {
+        print "before: $_[0]";
+        $_[0] = "m";
+        print "  after: $_[0]\n";
+    }
+
+    # perl4:
+    # before: x  after: m
+    # before: a  after: m
+    # before: m  after: m
+    # before: m  after: m
+
+    # Perl5:
+    # before: x  after: m
+    # Modification of a read-only value attempted at foo.pl line 12.
+    # before: a
+
+=item * C<defined $var> behavior changed
+
+The behavior is slightly different for:
+
+    print "$x", defined $x
+
+    # perl 4: 1
+    # perl 5: <no output, $x is not called into existence>
+
+=item * Variable Suicide
+
+Variable suicide behavior is more consistent under Perl 5.
+Perl5 exhibits the same behavior for hashes and scalars,
+that perl4 exhibits for only scalars.
+
+    $aGlobal{ "aKey" } = "global value";
+    print "MAIN:", $aGlobal{"aKey"}, "\n";
+    $GlobalLevel = 0;
+    &test( *aGlobal );
+
+    sub test {
+        local( *theArgument ) = @_;
+        local( %aNewLocal ); # perl 4 != 5.001l,m
+        $aNewLocal{"aKey"} = "this should never appear";
+        print "SUB: ", $theArgument{"aKey"}, "\n";
+        $aNewLocal{"aKey"} = "level $GlobalLevel";   # what should print
+        $GlobalLevel++;
+        if( $GlobalLevel<4 ) {
+            &test( *aNewLocal );
+        }
+    }
+
+    # Perl4:
+    # MAIN:global value
+    # SUB: global value
+    # SUB: level 0
+    # SUB: level 1
+    # SUB: level 2
+
+    # Perl5:
+    # MAIN:global value
+    # SUB: global value
+    # SUB: this should never appear
+    # SUB: this should never appear
+    # SUB: this should never appear
+
+=back
+
+=head2 Context Traps - scalar, list contexts
+
+=over 5
+
+=item * Elements of argument lists for formats evaluated in list context
+
+The elements of argument lists for formats are now evaluated in list
+context.  This means you can interpolate list values now.
+
+    @fmt = ("foo","bar","baz");
+    format STDOUT=
+    @<<<<< @||||| @>>>>>
+    @fmt;
+    .
+    write;
+
+    # perl4 errors:  Please use commas to separate fields in file
+    # perl5 prints: foo     bar      baz
+
+=item * C<caller()> returns false value in scalar context if no caller present
+
+The C<caller()> function now returns a false value in a scalar context
+if there is no caller.  This lets library files determine if they're
+being required.
+
+    caller() ? (print "You rang?\n") : (print "Got a 0\n");
+
+    # perl4 errors: There is no caller
+    # perl5 prints: Got a 0
+
+=item * Comma operator in scalar context gives scalar context to args
+
+The comma operator in a scalar context is now guaranteed to give a
+scalar context to its arguments.
+
+    @y= ('a','b','c');
+    $x = (1, 2, @y);
+    print "x = $x\n";
+
+    # Perl4 prints:  x = c   # Thinks list context interpolates list
+    # Perl5 prints:  x = 3   # Knows scalar uses length of list
+
+=item * C<sprintf()> prototyped as C<($;@)>
+
+C<sprintf()> is prototyped as ($;@), so its first argument is given scalar
+context. Thus, if passed an array, it will probably not do what you want,
+unlike Perl 4:
+
+    @z = ('%s%s', 'foo', 'bar');
+    $x = sprintf(@z);
+    print $x;
+
+    # perl4 prints: foobar
+    # perl5 prints: 3
+
+C<printf()> works the same as it did in Perl 4, though:
+
+    @z = ('%s%s', 'foo', 'bar');
+    printf STDOUT (@z);
+
+    # perl4 prints: foobar
+    # perl5 prints: foobar
+
+=back
+
+=head2 Precedence Traps
+
+Perl4-to-Perl5 traps involving precedence order.
+
+Perl 4 has almost the same precedence rules as Perl 5 for the operators
+that they both have.  Perl 4 however, seems to have had some
+inconsistencies that made the behavior differ from what was documented.
+
+=over 5
+
+=item * LHS vs. RHS of any assignment operator
+
+LHS vs. RHS of any assignment operator.  LHS is evaluated first
+in perl4, second in perl5; this can affect the relationship
+between side-effects in sub-expressions.
+
+    @arr = ( 'left', 'right' );
+    $a{shift @arr} = shift @arr;
+    print join( ' ', keys %a );
+
+    # perl4 prints: left
+    # perl5 prints: right
+
+=item * Semantic errors introduced due to precedence
+
+These are now semantic errors because of precedence:
+
+    @list = (1,2,3,4,5);
+    %map = ("a",1,"b",2,"c",3,"d",4);
+    $n = shift @list + 2;   # first item in list plus 2
+    print "n is $n, ";
+    $m = keys %map + 2;     # number of items in hash plus 2
+    print "m is $m\n";
+
+    # perl4 prints: n is 3, m is 6
+    # perl5 errors and fails to compile
+
+=item * Precedence of assignment operators same as the precedence of assignment
+
+The precedence of assignment operators is now the same as the precedence
+of assignment.  Perl 4 mistakenly gave them the precedence of the associated
+operator.  So you now must parenthesize them in expressions like
+
+    /foo/ ? ($a += 2) : ($a -= 2);
+
+Otherwise
+
+    /foo/ ? $a += 2 : $a -= 2
+
+would be erroneously parsed as
+
+    (/foo/ ? $a += 2 : $a) -= 2;
+
+On the other hand,
+
+    $a += /foo/ ? 1 : 2;
+
+now works as a C programmer would expect.
+
+=item * C<open> requires parentheses around filehandle
+
+    open FOO || die;
+
+is now incorrect.  You need parentheses around the filehandle.
+Otherwise, perl5 leaves the statement as its default precedence:
+
+    open(FOO || die);
+
+    # perl4 opens or dies
+    # perl5 opens FOO, dying only if 'FOO' is false, i.e. never
+
+=item * C<$:> precedence over C<$::> gone
+
+perl4 gives the special variable, C<$:> precedence, where perl5
+treats C<$::> as main C<package>
+
+    $a = "x"; print "$::a";
+
+    # perl 4 prints: -:a
+    # perl 5 prints: x
+
+=item * Precedence of file test operators documented
+
+perl4 had buggy precedence for the file test operators vis-a-vis
+the assignment operators.  Thus, although the precedence table
+for perl4 leads one to believe C<-e $foo .= "q"> should parse as
+C<((-e $foo) .= "q")>, it actually parses as C<(-e ($foo .= "q"))>.
+In perl5, the precedence is as documented.
+
+    -e $foo .= "q"
+
+    # perl4 prints: no output
+    # perl5 prints: Can't modify -e in concatenation
+
+=item * C<keys>, C<each>, C<values> are regular named unary operators
+
+In perl4, keys(), each() and values() were special high-precedence operators
+that operated on a single hash, but in perl5, they are regular named unary
+operators.  As documented, named unary operators have lower precedence
+than the arithmetic and concatenation operators C<+ - .>, but the perl4
+variants of these operators actually bind tighter than C<+ - .>.
+Thus, for:
+
+    %foo = 1..10;
+    print keys %foo - 1
+
+    # perl4 prints: 4
+    # perl5 prints: Type of arg 1 to keys must be hash (not subtraction)
+
+The perl4 behavior was probably more useful, if less consistent.
+
+=back
+
+=head2 General Regular Expression Traps using s///, etc.
+
+All types of RE traps.
+
+=over 5
+
+=item * C<s'$lhs'$rhs'> interpolates on either side
+
+C<s'$lhs'$rhs'> now does no interpolation on either side.  It used to
+interpolate $lhs but not $rhs.  (And still does not match a literal
+'$' in string)
+
+    $a=1;$b=2;
+    $string = '1 2 $a $b';
+    $string =~ s'$a'$b';
+    print $string,"\n";
+
+    # perl4 prints: $b 2 $a $b
+    # perl5 prints: 1 2 $a $b
+
+=item * C<m//g> attaches its state to the searched string
+
+C<m//g> now attaches its state to the searched string rather than the
+regular expression.  (Once the scope of a block is left for the sub, the
+state of the searched string is lost)
+
+    $_ = "ababab";
+    while(m/ab/g){
+        &doit("blah");
+    }
+    sub doit{local($_) = shift; print "Got $_ "}
+
+    # perl4 prints: Got blah Got blah Got blah Got blah
+    # perl5 prints: infinite loop blah...
+
+=item * C<m//o> used within an anonymous sub
+
+Currently, if you use the C<m//o> qualifier on a regular expression
+within an anonymous sub, I<all> closures generated from that anonymous
+sub will use the regular expression as it was compiled when it was used
+the very first time in any such closure.  For instance, if you say
+
+    sub build_match {
+        my($left,$right) = @_;
+        return sub { $_[0] =~ /$left stuff $right/o; };
+    }
+    $good = build_match('foo','bar');
+    $bad = build_match('baz','blarch');
+    print $good->('foo stuff bar') ? "ok\n" : "not ok\n";
+    print $bad->('baz stuff blarch') ? "ok\n" : "not ok\n";
+    print $bad->('foo stuff bar') ? "not ok\n" : "ok\n";
+
+For most builds of Perl5, this will print:
+ok
+not ok
+not ok
+
+build_match() will always return a sub which matches the contents of
+$left and $right as they were the I<first> time that build_match()
+was called, not as they are in the current call.
+
+=item * C<$+> isn't set to whole match
+
+If no parentheses are used in a match, Perl4 sets C<$+> to
+the whole match, just like C<$&>. Perl5 does not.
+
+    "abcdef" =~ /b.*e/;
+    print "\$+ = $+\n";
+
+    # perl4 prints: bcde
+    # perl5 prints:
+
+=item * Substitution now returns null string if it fails
+
+substitution now returns the null string if it fails
+
+    $string = "test";
+    $value = ($string =~ s/foo//);
+    print $value, "\n";
+
+    # perl4 prints: 0
+    # perl5 prints:
+
+Also see L<Numerical Traps> for another example of this new feature.
+
+=item * C<s`lhs`rhs`> is now a normal substitution
+
+C<s`lhs`rhs`> (using backticks) is now a normal substitution, with no
+backtick expansion
+
+    $string = "";
+    $string =~ s`^`hostname`;
+    print $string, "\n";
+
+    # perl4 prints: <the local hostname>
+    # perl5 prints: hostname
+
+=item * Stricter parsing of variables in regular expressions
+
+Stricter parsing of variables used in regular expressions
+
+    s/^([^$grpc]*$grpc[$opt$plus$rep]?)//o;
+
+    # perl4: compiles w/o error
+    # perl5: with Scalar found where operator expected ..., near "$opt$plus"
+
+an added component of this example, apparently from the same script, is
+the actual value of the s'd string after the substitution.
+C<[$opt]> is a character class in perl4 and an array subscript in perl5
+
+    $grpc = 'a';
+    $opt  = 'r';
+    $_ = 'bar';
+    s/^([^$grpc]*$grpc[$opt]?)/foo/;
+    print;
+
+    # perl4 prints: foo
+    # perl5 prints: foobar
+
+=item * C<m?x?> matches only once
+
+Under perl5, C<m?x?> matches only once, like C<?x?>. Under perl4, it matched
+repeatedly, like C</x/> or C<m!x!>.
+
+    $test = "once";
+    sub match { $test =~ m?once?; }
+    &match();
+    if( &match() ) {
+        # m?x? matches more then once
+        print "perl4\n";
+    } else {
+        # m?x? matches only once
+        print "perl5\n";
+    }
+
+    # perl4 prints: perl4
+    # perl5 prints: perl5
+
+=item * Failed matches don't reset the match variables
+
+Unlike in Ruby, failed matches in Perl do not reset the match variables
+($1, $2, ..., C<$`>, ...).
+
+=back
+
+=head2 Subroutine, Signal, Sorting Traps
+
+The general group of Perl4-to-Perl5 traps having to do with
+Signals, Sorting, and their related subroutines, as well as
+general subroutine traps.  Includes some OS-Specific traps.
+
+=over 5
+
+=item * Barewords that used to look like strings look like subroutine calls
+
+Barewords that used to look like strings to Perl will now look like subroutine
+calls if a subroutine by that name is defined before the compiler sees them.
+
+    sub SeeYa { warn"Hasta la vista, baby!" }
+    $SIG{'TERM'} = SeeYa;
+    print "SIGTERM is now $SIG{'TERM'}\n";
+
+    # perl4 prints: SIGTERM is now main'SeeYa
+    # perl5 prints: SIGTERM is now main::1 (and warns "Hasta la vista, baby!")
+
+Use B<-w> to catch this one
+
+=item * Reverse is no longer allowed as the name of a sort subroutine
+
+reverse is no longer allowed as the name of a sort subroutine.
+
+    sub reverse{ print "yup "; $a <=> $b }
+    print sort reverse (2,1,3);
+
+    # perl4 prints: yup yup 123
+    # perl5 prints: 123
+    # perl5 warns (if using -w): Ambiguous call resolved as CORE::reverse()
+
+=item * C<warn()> won't let you specify a filehandle.
+
+Although it _always_ printed to STDERR, warn() would let you specify a
+filehandle in perl4.  With perl5 it does not.
+
+    warn STDERR "Foo!";
+
+    # perl4 prints: Foo!
+    # perl5 prints: String found where operator expected
+
+=back
+
+=head2 OS Traps
+
+=over 5
+
+=item * SysV resets signal handler correctly
+
+Under HPUX, and some other SysV OSes, one had to reset any signal handler,
+within  the signal handler function, each time a signal was handled with
+perl4.  With perl5, the reset is now done correctly.  Any code relying
+on the handler _not_ being reset will have to be reworked.
+
+Since version 5.002, Perl uses sigaction() under SysV.
+
+    sub gotit {
+        print "Got @_... ";
+    }
+    $SIG{'INT'} = 'gotit';
+
+    $| = 1;
+    $pid = fork;
+    if ($pid) {
+        kill('INT', $pid);
+        sleep(1);
+        kill('INT', $pid);
+    } else {
+        while (1) {sleep(10);}
+    }
+
+    # perl4 (HPUX) prints: Got INT...
+    # perl5 (HPUX) prints: Got INT... Got INT...
+
+=item * SysV C<seek()> appends correctly
+
+Under SysV OSes, C<seek()> on a file opened to append C<<< >> >>> now does
+the right thing w.r.t. the fopen() manpage. e.g., - When a file is opened
+for append,  it  is  impossible to overwrite information already in
+the file.
+
+    open(TEST,">>seek.test");
+    $start = tell TEST;
+    foreach(1 .. 9){
+        print TEST "$_ ";
+    }
+    $end = tell TEST;
+    seek(TEST,$start,0);
+    print TEST "18 characters here";
+
+    # perl4 (solaris) seek.test has: 18 characters here
+    # perl5 (solaris) seek.test has: 1 2 3 4 5 6 7 8 9 18 characters here
+
+
+
+=back
+
+=head2 Interpolation Traps
+
+Perl4-to-Perl5 traps having to do with how things get interpolated
+within certain expressions, statements, contexts, or whatever.
+
+=over 5
+
+=item * C<@> always interpolates an array in double-quotish strings
+
+@ now always interpolates an array in double-quotish strings.
+
+    print "To: someone@somewhere.com\n";
+
+    # perl4 prints: To:someone@somewhere.com
+    # perl < 5.6.1, error : In string, @somewhere now must be written as \@somewhere
+    # perl >= 5.6.1, warning : Possible unintended interpolation of @somewhere in string
+
+=item * Double-quoted strings may no longer end with an unescaped $
+
+Double-quoted strings may no longer end with an unescaped $.
+
+    $foo = "foo$";
+    print "foo is $foo\n";
+
+    # perl4 prints: foo is foo$
+    # perl5 errors: Final $ should be \$ or $name
+
+Note: perl5 DOES NOT error on the terminating @ in $bar
+
+=item * Arbitrary expressions are evaluated inside braces within double quotes
+
+Perl now sometimes evaluates arbitrary expressions inside braces that occur
+within double quotes (usually when the opening brace is preceded by C<$>
+or C<@>).
+
+    @www = "buz";
+    $foo = "foo";
+    $bar = "bar";
+    sub foo { return "bar" };
+    print "|@{w.w.w}|${main'foo}|";
+
+    # perl4 prints: |@{w.w.w}|foo|
+    # perl5 prints: |buz|bar|
+
+Note that you can C<use strict;> to ward off such trappiness under perl5.
+
+=item * C<$$x> now tries to dereference $x
+
+The construct "this is $$x" used to interpolate the pid at that point, but
+now tries to dereference $x.  C<$$> by itself still works fine, however.
+
+    $s = "a reference";
+    $x = *s;
+    print "this is $$x\n";
+
+    # perl4 prints: this is XXXx   (XXX is the current pid)
+    # perl5 prints: this is a reference
+
+=item * Creation of hashes on the fly with C<eval "EXPR"> requires protection
+
+Creation of hashes on the fly with C<eval "EXPR"> now requires either both
+C<$>'s to be protected in the specification of the hash name, or both curlies
+to be protected.  If both curlies are protected, the result will be compatible
+with perl4 and perl5.  This is a very common practice, and should be changed
+to use the block form of C<eval{}>  if possible.
+
+    $hashname = "foobar";
+    $key = "baz";
+    $value = 1234;
+    eval "\$$hashname{'$key'} = q|$value|";
+    (defined($foobar{'baz'})) ?  (print "Yup") : (print "Nope");
+
+    # perl4 prints: Yup
+    # perl5 prints: Nope
+
+Changing
+
+    eval "\$$hashname{'$key'} = q|$value|";
+
+to
+
+    eval "\$\$hashname{'$key'} = q|$value|";
+
+causes the following result:
+
+    # perl4 prints: Nope
+    # perl5 prints: Yup
+
+or, changing to
+
+    eval "\$$hashname\{'$key'\} = q|$value|";
+
+causes the following result:
+
+    # perl4 prints: Yup
+    # perl5 prints: Yup
+    # and is compatible for both versions
+
+
+=item * Bugs in earlier perl versions
+
+perl4 programs which unconsciously rely on the bugs in earlier perl versions.
+
+    perl -e '$bar=q/not/; print "This is $foo{$bar} perl5"'
+
+    # perl4 prints: This is not perl5
+    # perl5 prints: This is perl5
+
+=item * Array and hash brackets during interpolation
+
+You also have to be careful about array and hash brackets during
+interpolation.
+
+    print "$foo["
+
+    perl 4 prints: [
+    perl 5 prints: syntax error
+
+    print "$foo{"
+
+    perl 4 prints: {
+    perl 5 prints: syntax error
+
+Perl 5 is expecting to find an index or key name following the respective
+brackets, as well as an ending bracket of the appropriate type.  In order
+to mimic the behavior of Perl 4, you must escape the bracket like so.
+
+    print "$foo\[";
+    print "$foo\{";
+
+=item * Interpolation of C<\$$foo{bar}>
+
+Similarly, watch out for: C<\$$foo{bar}>
+
+    $foo = "baz";
+    print "\$$foo{bar}\n";
+
+    # perl4 prints: $baz{bar}
+    # perl5 prints: $
+
+Perl 5 is looking for C<$foo{bar}> which doesn't exist, but perl 4 is
+happy just to expand $foo to "baz" by itself.  Watch out for this
+especially in C<eval>'s.
+
+=item * C<qq()> string passed to C<eval> will not find string terminator
+
+C<qq()> string passed to C<eval>
+
+    eval qq(
+        foreach \$y (keys %\$x\) {
+            \$count++;
+        }
+    );
+
+    # perl4 runs this ok
+    # perl5 prints: Can't find string terminator ")"
+
+=back
+
+=head2 DBM Traps
+
+General DBM traps.
+
+=over 5
+
+=item * Perl5 must have been linked with same dbm/ndbm as the default for C<dbmopen()>
+
+Existing dbm databases created under perl4 (or any other dbm/ndbm tool)
+may cause the same script, run under perl5, to fail.  The build of perl5
+must have been linked with the same dbm/ndbm as the default for C<dbmopen()>
+to function properly without C<tie>'ing to an extension dbm implementation.
+
+    dbmopen (%dbm, "file", undef);
+    print "ok\n";
+
+    # perl4 prints: ok
+    # perl5 prints: ok (IFF linked with -ldbm or -lndbm)
+
+
+=item * DBM exceeding limit on the key/value size will cause perl5 to exit immediately
+
+Existing dbm databases created under perl4 (or any other dbm/ndbm tool)
+may cause the same script, run under perl5, to fail.  The error generated
+when exceeding the limit on the key/value size will cause perl5 to exit
+immediately.
+
+    dbmopen(DB, "testdb",0600) || die "couldn't open db! $!";
+    $DB{'trap'} = "x" x 1024;  # value too large for most dbm/ndbm
+    print "YUP\n";
+
+    # perl4 prints:
+    dbm store returned -1, errno 28, key "trap" at - line 3.
+    YUP
+
+    # perl5 prints:
+    dbm store returned -1, errno 28, key "trap" at - line 3.
+
+=back
+
+=head2 Unclassified Traps
+
+Everything else.
+
+=over 5
+
+=item * C<require>/C<do> trap using returned value
+
+If the file doit.pl has:
+
+    sub foo {
+        $rc = do "./do.pl";
+        return 8;
+    }
+    print &foo, "\n";
+
+And the do.pl file has the following single line:
+
+    return 3;
+
+Running doit.pl gives the following:
+
+    # perl 4 prints: 3 (aborts the subroutine early)
+    # perl 5 prints: 8
+
+Same behavior if you replace C<do> with C<require>.
+
+=item * C<split> on empty string with LIMIT specified
+
+    $string = '';
+    @list = split(/foo/, $string, 2)
+
+Perl4 returns a one element list containing the empty string but Perl5
+returns an empty list.
+
+=back
+
+As always, if any of these are ever officially declared as bugs,
+they'll be fixed and removed.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perltru64.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perltru64.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perltru64.pod	(revision 14489)
@@ -0,0 +1,163 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.tru64 - Perl version 5 on Tru64 (formerly known as Digital UNIX formerly known as DEC OSF/1) systems
+
+=head1 DESCRIPTION
+
+This document describes various features of HP's (formerly Compaq's,
+formerly Digital's) Unix operating system (Tru64) that will affect
+how Perl version 5 (hereafter just Perl) is configured, compiled
+and/or runs.
+
+=head2 Compiling Perl 5 on Tru64
+
+The recommended compiler to use in Tru64 is the native C compiler.
+The native compiler produces much faster code (the speed difference is
+noticeable: several dozen percentages) and also more correct code: if
+you are considering using the GNU C compiler you should use at the
+very least the release of 2.95.3 since all older gcc releases are
+known to produce broken code when compiling Perl.  One manifestation
+of this brokenness is the lib/sdbm test dumping core; another is many
+of the op/regexp and op/pat, or ext/Storable tests dumping core
+(the exact pattern of failures depending on the GCC release and
+optimization flags).
+
+gcc 3.2.1 is known to work okay with Perl 5.8.0.  However, when
+optimizing the toke.c gcc likes to have a lot of memory, 256 megabytes
+seems to be enough.  The default setting of the process data section
+in Tru64 should be one gigabyte, but some sites/setups might have
+lowered that.  The configuration process of Perl checks for too low
+process limits, and lowers the optimization for the toke.c if
+necessary, and also gives advice on how to raise the process limits.
+
+=head2 Using Large Files with Perl on Tru64
+
+In Tru64 Perl is automatically able to use large files, that is,
+files larger than 2 gigabytes, there is no need to use the Configure
+-Duselargefiles option as described in INSTALL (though using the option
+is harmless).
+
+=head2 Threaded Perl on Tru64
+
+If you want to use threads, you should primarily use the new Perl
+5.8.0 threads model by running Configure with -Duseithreads.
+
+The old Perl 5.005 threads is obsolete, unmaintained, and its use is
+discouraged.  If you really want it, run Configure with the
+-Dusethreads -Duse5005threads options as described in INSTALL.
+
+Either thread model is going to work only in Tru64 4.0 and newer
+releases, older operating releases like 3.2 aren't probably going
+to work properly with threads.
+
+In Tru64 V5 (at least V5.1A, V5.1B) you cannot build threaded Perl with gcc
+because the system header <pthread.h> explicitly checks for supported
+C compilers, gcc (at least 3.2.2) not being one of them.  But the
+system C compiler should work just fine.
+
+=head2 Long Doubles on Tru64
+
+You cannot Configure Perl to use long doubles unless you have at least
+Tru64 V5.0, the long double support simply wasn't functional enough
+before that.  Perl's Configure will override attempts to use the long
+doubles (you can notice this by Configure finding out that the modfl()
+function does not work as it should).
+
+At the time of this writing (June 2002), there is a known bug in the
+Tru64 libc printing of long doubles when not using "e" notation.
+The values are correct and usable, but you only get a limited number
+of digits displayed unless you force the issue by using C<printf
+"%.33e",$num> or the like.  For Tru64 versions V5.0A through V5.1A, a
+patch is expected sometime after perl 5.8.0 is released.  If your libc
+has not yet been patched, you'll get a warning from Configure when
+selecting long doubles.
+
+=head2 DB_File tests failing on Tru64
+
+The DB_File tests (db-btree.t, db-hash.t, db-recno.t) may fail you
+have installed a newer version of Berkeley DB into the system and the
+-I and -L compiler and linker flags introduce version conflicts with
+the DB 1.85 headers and libraries that came with the Tru64.  For example, 
+mixing a DB v2 library with the DB v1 headers is a bad idea.  Watch
+out for Configure options -Dlocincpth and -Dloclibpth, and check your
+/usr/local/include and /usr/local/lib since they are included by default.
+
+The second option is to explicitly instruct Configure to detect the
+newer Berkeley DB installation, by supplying the right directories with
+C<-Dlocincpth=/some/include> and C<-Dloclibpth=/some/lib> B<and> before
+running "make test" setting your LD_LIBRARY_PATH to F</some/lib>.
+
+The third option is to work around the problem by disabling the
+DB_File completely when build Perl by specifying -Ui_db to Configure,
+and then using the BerkeleyDB module from CPAN instead of DB_File.
+The BerkeleyDB works with Berkeley DB versions 2.* or greater.
+
+The Berkeley DB 4.1.25 has been tested with Tru64 V5.1A and found
+to work.  The latest Berkeley DB can be found from F<http://www.sleepycat.com>.
+
+=head2 64-bit Perl on Tru64
+
+In Tru64 Perl's integers are automatically 64-bit wide, there is
+no need to use the Configure -Duse64bitint option as described
+in INSTALL.  Similarly, there is no need for -Duse64bitall
+since pointers are automatically 64-bit wide.
+
+=head2 Warnings about floating-point overflow when compiling Perl on Tru64
+
+When compiling Perl in Tru64 you may (depending on the compiler
+release) see two warnings like this
+
+    cc: Warning: numeric.c, line 104: In this statement, floating-point overflow occurs in evaluating the expression "1.8e308". (floatoverfl)
+        return HUGE_VAL;
+    -----------^
+
+and when compiling the POSIX extension
+
+    cc: Warning: const-c.inc, line 2007: In this statement, floating-point overflow occurs in evaluating the expression "1.8e308". (floatoverfl)
+                return HUGE_VAL;
+    -------------------^
+
+The exact line numbers may vary between Perl releases.  The warnings
+are benign and can be ignored: in later C compiler releases the warnings
+should be gone.
+
+When the file F<pp_sys.c> is being compiled you may (depending on the
+operating system release) see an additional compiler flag being used:
+C<-DNO_EFF_ONLY_OK>.  This is normal and refers to a feature that is
+relevant only if you use the C<filetest> pragma.  In older releases of
+the operating system the feature was broken and the NO_EFF_ONLY_OK
+instructs Perl not to use the feature.
+
+=head1 Testing Perl on Tru64
+
+During "make test" the C<comp/cpp> will be skipped because on Tru64 it
+cannot be tested before Perl has been installed.  The test refers to
+the use of the C<-P> option of Perl.
+
+=head1 ext/ODBM_File/odbm Test Failing With Static Builds
+
+The ext/ODBM_File/odbm is known to fail with static builds
+(Configure -Uusedl) due to a known bug in Tru64's static libdbm
+library.  The good news is that you very probably don't need to ever
+use the ODBM_File extension since more advanced NDBM_File works fine,
+not to mention the even more advanced DB_File.
+
+=head1 Perl Fails Because Of Unresolved Symbol sockatmark
+
+If you get an error like
+
+    Can't load '.../OSF1/lib/perl5/5.8.0/alpha-dec_osf/auto/IO/IO.so' for module IO: Unresolved symbol in .../lib/perl5/5.8.0/alpha-dec_osf/auto/IO/IO.so: sockatmark at .../lib/perl5/5.8.0/alpha-dec_osf/XSLoader.pm line 75.
+
+you need to either recompile your Perl in Tru64 4.0D or upgrade your
+Tru64 4.0D to at least 4.0F: the sockatmark() system call was
+added in Tru64 4.0F, and the IO extension refers that symbol.
+
+=head1 AUTHOR
+
+Jarkko Hietaniemi <jhi@iki.fi>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perltw.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perltw.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perltw.pod	(revision 14489)
@@ -0,0 +1,174 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+The following documentation is written in Big5 encoding.
+
+ŠpªG§A¥Î€@¯ëªº€åŠrœs¿èŸ¹Ÿ\Äý³o¥÷€å¥ó, œÐ©¿²€€å€€©_¯Sªºµù°OŠr²Å.
+³o¥÷€å¥ó¬O¥H POD (Â²©ú€å¥ó®æŠ¡) ŒgŠš; ³oºØ®æŠ¡¬O¬°€F¯àÅý€Hªœ±µÅªšú,
+ŠÓ¯S§O³]­pªº. Ãö©óŠ¹®æŠ¡ªº¶i€@šBžê°T, œÐ°ÑŠÒ perlpod œu€W€å¥ó.
+
+=head1 NAME
+
+perltw - ¥¿Åé€€€å Perl «ü«n
+
+=head1 DESCRIPTION
+
+ÅwªïšÓšì Perl ªº€ÑŠa!
+
+±q 5.8.0 ª©¶}©l, Perl šã³Æ€F§¹µœªº Unicode (žU°êœX) €äŽ©,
+€]³s±a€äŽ©€F³\Šh©Ô€B»yšt¥H¥~ªºœsœX€èŠ¡; CJK (€€€éÁú) «K¬Ošä€€ªº€@³¡¥÷.
+Unicode ¬O°ê»Ú©ÊªºŒÐ·Ç, žÕ¹Ï²[»\¥@¬É€W©ÒŠ³ªºŠr²Å: Šè€è¥@¬É, ªF€è¥@¬É,
+¥H€ÎšâªÌ¶¡ªº€@€Á (§ÆÃŸ€å, ±Ô§QšÈ€å, ªü©Ô§B€å, §Æ§BšÓ€å, ŠL«×€å,
+ŠLŠaŠw€å, µ¥µ¥). ¥Š€]®e¯Ç€FŠhºØ§@·~št²Î»P¥­»O (Šp PC €Î³Áª÷¶ð).
+
+Perl ¥»š­¥H Unicode ¶iŠæŸÞ§@. ³oªí¥Ü Perl €º³¡ªºŠrŠêžê®Æ¥i¥Î Unicode
+ªí¥Ü; Perl ªºšçŠ¡»Pºâ²Å (šÒŠp¥¿³Wªí¥ÜŠ¡€ñ¹ï) €]¯à¹ï Unicode ¶iŠæŸÞ§@.
+Šb¿é€J€Î¿é¥X®É, ¬°€F³B²z¥H Unicode €§«eªºœsœX€èŠ¡ÀxŠsªºžê®Æ, Perl
+Ž£šÑ€F Encode ³o­ÓŒÒ²Õ, ¥i¥HÅý§A»Ž©öŠaÅªšú€ÎŒg€JÂÂŠ³ªºœsœXžê®Æ.
+
+Encode ©µŠùŒÒ²Õ€äŽ©€UŠC¥¿Åé€€€åªºœsœX€èŠ¡ ('big5' ªí¥Ü 'big5-eten'):
+
+    big5-eten	Big5 œsœX (§t­Ê€Ñ©µŠùŠr§Î)
+    big5-hkscs	Big5 + ­»Žä¥~Šr¶°, 2001 Š~ª©
+    cp950	ŠrœX­¶ 950 (Big5 + ·L³n²K¥[ªºŠr²Å)
+
+Á|šÒšÓ»¡, ±N Big5 œsœXªºÀÉ®×ÂàŠš Unicode, ¯­»ÝÁä€J€UŠC«ü¥O:
+
+    perl -Mencoding=big5,STDOUT,utf8 -pe1 < file.big5 > file.utf8
+
+Perl €]€ºªþ€F "piconv", €@€ä§¹¥þ¥H Perl ŒgŠšªºŠr²ÅÂàŽ«€ušãµ{Š¡, ¥ÎªkŠp€U:
+
+    piconv -f big5 -t utf8 < file.big5 > file.utf8
+    piconv -f utf8 -t big5 < file.utf8 > file.big5
+
+¥t¥~, §Q¥Î encoding ŒÒ²Õ, §A¥i¥H»Ž©öŒg¥X¥HŠr²Å¬°³æŠìªºµ{Š¡œX, Šp€U©Ò¥Ü:
+
+    #!/usr/bin/env perl
+    # ±Ò°Ê big5 ŠrŠêžÑªR; ŒÐ·Ç¿é¥X€J€ÎŒÐ·Ç¿ù»~³£³]¬° big5 œsœX
+    use encoding 'big5', STDIN => 'big5', STDOUT => 'big5';
+    print length("ÀdŸm");	     #  2 (Âù€Þž¹ªí¥ÜŠr²Å)
+    print length('ÀdŸm');	     #  4 (³æ€Þž¹ªí¥ÜŠì€ž²Õ)
+    print index("œÎœÎ±Ð»£", "ÎœÎ±"); # -1 (€£¥]§tŠ¹€lŠrŠê)
+    print index('œÎœÎ±Ð»£', 'ÎœÎ±'); #  1 (±q²Ä€G­ÓŠì€ž²Õ¶}©l)
+
+Šb³Ì«á€@ŠCšÒ€lžÌ, "œÎ" ªº²Ä€G­ÓŠì€ž²Õ»P "œÎ" ªº²Ä€@­ÓŠì€ž²Õµ²ŠXŠš Big5
+œXªº "Îœ"; "œÎ" ªº²Ä€G­ÓŠì€ž²Õ«h»P "±Ð" ªº²Ä€@­ÓŠì€ž²Õµ²ŠXŠš "Î±".
+³ožÑšM€F¥H«e Big5 œX€ñ¹ï³B²z€W±`š£ªº°ÝÃD.
+
+=head2 ÃB¥~ªº€€€åœsœX
+
+ŠpªG»Ý­n§óŠhªº€€€åœsœX, ¥i¥H±q CPAN (L<http://www.cpan.org/>) €Užü
+Encode::HanExtra ŒÒ²Õ. ¥Š¥Ø«eŽ£šÑ€UŠCœsœX€èŠ¡:
+
+    cccii	1980 Š~€å«Ø·|ªº€€€åžê°T¥æŽ«œX
+    euc-tw	Unix ©µŠùŠr²Å¶°, ¥]§t CNS11643 ¥­­± 1-7
+    big5plus	€€€åŒÆŠì€Æ§Þ³N±ÀŒs°òª÷·|ªº Big5+
+    big5ext	€€€åŒÆŠì€Æ§Þ³N±ÀŒs°òª÷·|ªº Big5e
+
+¥t¥~, Encode::HanConvert ŒÒ²Õ«hŽ£šÑ€FÂ²ÁcÂàŽ«¥ÎªºšâºØœsœX:
+
+    big5-simp	Big5 ¥¿Åé€€€å»P Unicode Â²Åé€€€å€¬Âà
+    gbk-trad	GBK Â²Åé€€€å»P Unicode ¥¿Åé€€€å€¬Âà
+
+­Y·QŠb GBK »P Big5 €§¶¡€¬Âà, œÐ°ÑŠÒžÓŒÒ²Õ€ºªþªº b2g.pl »P g2b.pl šâ€äµ{Š¡,
+©ÎŠbµ{Š¡€ºšÏ¥Î€UŠCŒgªk:
+
+    use Encode::HanConvert;
+    $euc_cn = big5_to_gb($big5); # ±q Big5 Âà¬° GBK
+    $big5 = gb_to_big5($euc_cn); # ±q GBK Âà¬° Big5
+
+=head2 ¶i€@šBªºžê°T
+
+œÐ°ÑŠÒ Perl €ºªþªº€j¶q»¡©ú€å¥ó (€£©¯¥þ¬O¥Î­^€åŒgªº), šÓŸÇ²ß§óŠhÃö©ó
+Perl ªºªŸÃÑ, ¥H€Î Unicode ªºšÏ¥Î€èŠ¡. €£¹L, ¥~³¡ªºžê·œ¬Û·íÂ×ŽI:
+
+=head2 Ž£šÑ Perl žê·œªººô§}
+
+=over 4
+
+=item L<http://www.perl.com/>
+
+Perl ªº­º­¶ (¥ÑŒÚµÜÂ§€œ¥qºûÅ@)
+
+=item L<http://www.cpan.org/>
+
+Perl ºîŠXšåÂÃºô (Comprehensive Perl Archive Network)
+
+=item L<http://lists.perl.org/>
+
+Perl ¶l»Œœ×ŸÂ€@Äý
+
+=back
+
+=head2 ŸÇ²ß Perl ªººô§}
+
+=over 4
+
+=item L<http://www.oreilly.com.tw/chinese/perl/index.html>
+
+¥¿Åé€€€åª©ªºŒÚµÜÂ§ Perl ®ÑÂÇ
+
+=item L<http://groups.google.com/groups?q=tw.bbs.comp.lang.perl>
+
+»OÆW Perl ³sœu°Qœ×°Ï (€]ŽN¬OŠU€j BBS ªº Perl ³sœuª©)
+
+=back
+
+=head2 Perl šÏ¥ÎªÌ¶°·|
+
+=over 4
+
+=item L<http://www.pm.org/groups/asia.shtml#Taiwan>
+
+»OÆW Perl ±ÀŒs²Õ€@Äý
+
+=item L<http://irc.elixus.org/>
+
+ÃÀ¥ßšóœu€W²á€Ñ«Ç
+
+=back
+
+=head2 Unicode ¬ÛÃöºô§}
+
+=over 4
+
+=item L<http://www.unicode.org/>
+
+Unicode ŸÇ³NŸÇ·| (Unicode ŒÐ·Çªºšî©wªÌ)
+
+=item L<http://www.cl.cam.ac.uk/%7Emgk25/unicode.html>
+
+Unix/Linux €Wªº UTF-8 €Î Unicode µª«È°Ý
+
+=back
+
+=head2 €€€å€Æžê°T
+
+=over 4
+
+=item ¬°€°»ò¥s "¥¿Åé€€€å" €£¥s "ÁcÅé€€€å"?
+
+L<http://www.csie.ntu.edu.tw/~b7506051/mozilla/faq.html#faqglossary>
+
+=item €€€å€Æ³nÅéÁp·ù
+
+L<http://www.cpatch.org/>
+
+=item Linux ³nÅé€€€å€Æ­p¹º
+
+L<http://www.linux.org.tw/CLDP/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Encode>, L<Encode::TW>, L<encoding>, L<perluniintro>, L<perlunicode>
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi E<lt>jhi@iki.fiE<gt>
+
+Autrijus Tang (­ð©vº~) E<lt>autrijus@autrijus.orgE<gt>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlunicode.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlunicode.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlunicode.pod	(revision 14489)
@@ -0,0 +1,1501 @@
+=head1 NAME
+
+perlunicode - Unicode support in Perl
+
+=head1 DESCRIPTION
+
+=head2 Important Caveats
+
+Unicode support is an extensive requirement. While Perl does not
+implement the Unicode standard or the accompanying technical reports
+from cover to cover, Perl does support many Unicode features.
+
+=over 4
+
+=item Input and Output Layers
+
+Perl knows when a filehandle uses Perl's internal Unicode encodings
+(UTF-8, or UTF-EBCDIC if in EBCDIC) if the filehandle is opened with
+the ":utf8" layer.  Other encodings can be converted to Perl's
+encoding on input or from Perl's encoding on output by use of the
+":encoding(...)"  layer.  See L<open>.
+
+To indicate that Perl source itself is using a particular encoding,
+see L<encoding>.
+
+=item Regular Expressions
+
+The regular expression compiler produces polymorphic opcodes.  That is,
+the pattern adapts to the data and automatically switches to the Unicode
+character scheme when presented with Unicode data--or instead uses
+a traditional byte scheme when presented with byte data.
+
+=item C<use utf8> still needed to enable UTF-8/UTF-EBCDIC in scripts
+
+As a compatibility measure, the C<use utf8> pragma must be explicitly
+included to enable recognition of UTF-8 in the Perl scripts themselves
+(in string or regular expression literals, or in identifier names) on
+ASCII-based machines or to recognize UTF-EBCDIC on EBCDIC-based
+machines.  B<These are the only times when an explicit C<use utf8>
+is needed.>  See L<utf8>.
+
+You can also use the C<encoding> pragma to change the default encoding
+of the data in your script; see L<encoding>.
+
+=item BOM-marked scripts and UTF-16 scripts autodetected
+
+If a Perl script begins marked with the Unicode BOM (UTF-16LE, UTF16-BE,
+or UTF-8), or if the script looks like non-BOM-marked UTF-16 of either
+endianness, Perl will correctly read in the script as Unicode.
+(BOMless UTF-8 cannot be effectively recognized or differentiated from
+ISO 8859-1 or other eight-bit encodings.)
+
+=item C<use encoding> needed to upgrade non-Latin-1 byte strings
+
+By default, there is a fundamental asymmetry in Perl's unicode model:
+implicit upgrading from byte strings to Unicode strings assumes that
+they were encoded in I<ISO 8859-1 (Latin-1)>, but Unicode strings are
+downgraded with UTF-8 encoding.  This happens because the first 256
+codepoints in Unicode happens to agree with Latin-1.  
+
+If you wish to interpret byte strings as UTF-8 instead, use the
+C<encoding> pragma:
+
+    use encoding 'utf8';
+
+See L</"Byte and Character Semantics"> for more details.
+
+=back
+
+=head2 Byte and Character Semantics
+
+Beginning with version 5.6, Perl uses logically-wide characters to
+represent strings internally.
+
+In future, Perl-level operations will be expected to work with
+characters rather than bytes.
+
+However, as an interim compatibility measure, Perl aims to
+provide a safe migration path from byte semantics to character
+semantics for programs.  For operations where Perl can unambiguously
+decide that the input data are characters, Perl switches to
+character semantics.  For operations where this determination cannot
+be made without additional information from the user, Perl decides in
+favor of compatibility and chooses to use byte semantics.
+
+This behavior preserves compatibility with earlier versions of Perl,
+which allowed byte semantics in Perl operations only if
+none of the program's inputs were marked as being as source of Unicode
+character data.  Such data may come from filehandles, from calls to
+external programs, from information provided by the system (such as %ENV),
+or from literals and constants in the source text.
+
+The C<bytes> pragma will always, regardless of platform, force byte
+semantics in a particular lexical scope.  See L<bytes>.
+
+The C<utf8> pragma is primarily a compatibility device that enables
+recognition of UTF-(8|EBCDIC) in literals encountered by the parser.
+Note that this pragma is only required while Perl defaults to byte
+semantics; when character semantics become the default, this pragma
+may become a no-op.  See L<utf8>.
+
+Unless explicitly stated, Perl operators use character semantics
+for Unicode data and byte semantics for non-Unicode data.
+The decision to use character semantics is made transparently.  If
+input data comes from a Unicode source--for example, if a character
+encoding layer is added to a filehandle or a literal Unicode
+string constant appears in a program--character semantics apply.
+Otherwise, byte semantics are in effect.  The C<bytes> pragma should
+be used to force byte semantics on Unicode data.
+
+If strings operating under byte semantics and strings with Unicode
+character data are concatenated, the new string will be created by
+decoding the byte strings as I<ISO 8859-1 (Latin-1)>, even if the
+old Unicode string used EBCDIC.  This translation is done without
+regard to the system's native 8-bit encoding.  To change this for
+systems with non-Latin-1 and non-EBCDIC native encodings, use the
+C<encoding> pragma.  See L<encoding>.
+
+Under character semantics, many operations that formerly operated on
+bytes now operate on characters. A character in Perl is
+logically just a number ranging from 0 to 2**31 or so. Larger
+characters may encode into longer sequences of bytes internally, but
+this internal detail is mostly hidden for Perl code.
+See L<perluniintro> for more.
+
+=head2 Effects of Character Semantics
+
+Character semantics have the following effects:
+
+=over 4
+
+=item *
+
+Strings--including hash keys--and regular expression patterns may
+contain characters that have an ordinal value larger than 255.
+
+If you use a Unicode editor to edit your program, Unicode characters
+may occur directly within the literal strings in one of the various
+Unicode encodings (UTF-8, UTF-EBCDIC, UCS-2, etc.), but will be recognized
+as such and converted to Perl's internal representation only if the
+appropriate L<encoding> is specified.
+
+Unicode characters can also be added to a string by using the
+C<\x{...}> notation.  The Unicode code for the desired character, in
+hexadecimal, should be placed in the braces. For instance, a smiley
+face is C<\x{263A}>.  This encoding scheme only works for characters
+with a code of 0x100 or above.
+
+Additionally, if you
+
+   use charnames ':full';
+
+you can use the C<\N{...}> notation and put the official Unicode
+character name within the braces, such as C<\N{WHITE SMILING FACE}>.
+
+
+=item *
+
+If an appropriate L<encoding> is specified, identifiers within the
+Perl script may contain Unicode alphanumeric characters, including
+ideographs.  Perl does not currently attempt to canonicalize variable
+names.
+
+=item *
+
+Regular expressions match characters instead of bytes.  "." matches
+a character instead of a byte.  The C<\C> pattern is provided to force
+a match a single byte--a C<char> in C, hence C<\C>.
+
+=item *
+
+Character classes in regular expressions match characters instead of
+bytes and match against the character properties specified in the
+Unicode properties database.  C<\w> can be used to match a Japanese
+ideograph, for instance.
+
+(However, and as a limitation of the current implementation, using
+C<\w> or C<\W> I<inside> a C<[...]> character class will still match
+with byte semantics.)
+
+=item *
+
+Named Unicode properties, scripts, and block ranges may be used like
+character classes via the C<\p{}> "matches property" construct and
+the  C<\P{}> negation, "doesn't match property".
+
+For instance, C<\p{Lu}> matches any character with the Unicode "Lu"
+(Letter, uppercase) property, while C<\p{M}> matches any character
+with an "M" (mark--accents and such) property.  Brackets are not
+required for single letter properties, so C<\p{M}> is equivalent to
+C<\pM>. Many predefined properties are available, such as
+C<\p{Mirrored}> and C<\p{Tibetan}>.
+
+The official Unicode script and block names have spaces and dashes as
+separators, but for convenience you can use dashes, spaces, or
+underbars, and case is unimportant. It is recommended, however, that
+for consistency you use the following naming: the official Unicode
+script, property, or block name (see below for the additional rules
+that apply to block names) with whitespace and dashes removed, and the
+words "uppercase-first-lowercase-rest". C<Latin-1 Supplement> thus
+becomes C<Latin1Supplement>.
+
+You can also use negation in both C<\p{}> and C<\P{}> by introducing a caret
+(^) between the first brace and the property name: C<\p{^Tamil}> is
+equal to C<\P{Tamil}>.
+
+B<NOTE: the properties, scripts, and blocks listed here are as of
+Unicode 3.2.0, March 2002, or Perl 5.8.0, July 2002.  Unicode 4.0.0
+came out in April 2003, and Perl 5.8.1 in September 2003.>
+
+Here are the basic Unicode General Category properties, followed by their
+long form.  You can use either; C<\p{Lu}> and C<\p{UppercaseLetter}>,
+for instance, are identical.
+
+    Short       Long
+
+    L           Letter
+    LC          CasedLetter
+    Lu          UppercaseLetter
+    Ll          LowercaseLetter
+    Lt          TitlecaseLetter
+    Lm          ModifierLetter
+    Lo          OtherLetter
+
+    M           Mark
+    Mn          NonspacingMark
+    Mc          SpacingMark
+    Me          EnclosingMark
+
+    N           Number
+    Nd          DecimalNumber
+    Nl          LetterNumber
+    No          OtherNumber
+
+    P           Punctuation
+    Pc          ConnectorPunctuation
+    Pd          DashPunctuation
+    Ps          OpenPunctuation
+    Pe          ClosePunctuation
+    Pi          InitialPunctuation
+                (may behave like Ps or Pe depending on usage)
+    Pf          FinalPunctuation
+                (may behave like Ps or Pe depending on usage)
+    Po          OtherPunctuation
+
+    S           Symbol
+    Sm          MathSymbol
+    Sc          CurrencySymbol
+    Sk          ModifierSymbol
+    So          OtherSymbol
+
+    Z           Separator
+    Zs          SpaceSeparator
+    Zl          LineSeparator
+    Zp          ParagraphSeparator
+
+    C           Other
+    Cc          Control
+    Cf          Format
+    Cs          Surrogate   (not usable)
+    Co          PrivateUse
+    Cn          Unassigned
+
+Single-letter properties match all characters in any of the
+two-letter sub-properties starting with the same letter.
+C<LC> and C<L&> are special cases, which are aliases for the set of
+C<Ll>, C<Lu>, and C<Lt>.
+
+Because Perl hides the need for the user to understand the internal
+representation of Unicode characters, there is no need to implement
+the somewhat messy concept of surrogates. C<Cs> is therefore not
+supported.
+
+Because scripts differ in their directionality--Hebrew is
+written right to left, for example--Unicode supplies these properties in
+the BidiClass class:
+
+    Property    Meaning
+
+    L           Left-to-Right
+    LRE         Left-to-Right Embedding
+    LRO         Left-to-Right Override
+    R           Right-to-Left
+    AL          Right-to-Left Arabic
+    RLE         Right-to-Left Embedding
+    RLO         Right-to-Left Override
+    PDF         Pop Directional Format
+    EN          European Number
+    ES          European Number Separator
+    ET          European Number Terminator
+    AN          Arabic Number
+    CS          Common Number Separator
+    NSM         Non-Spacing Mark
+    BN          Boundary Neutral
+    B           Paragraph Separator
+    S           Segment Separator
+    WS          Whitespace
+    ON          Other Neutrals
+
+For example, C<\p{BidiClass:R}> matches characters that are normally
+written right to left.
+
+=back
+
+=head2 Scripts
+
+The script names which can be used by C<\p{...}> and C<\P{...}>,
+such as in C<\p{Latin}> or C<\p{Cyrillic}>, are as follows:
+
+    Arabic
+    Armenian
+    Bengali
+    Bopomofo
+    Buhid
+    CanadianAboriginal
+    Cherokee
+    Cyrillic
+    Deseret
+    Devanagari
+    Ethiopic
+    Georgian
+    Gothic
+    Greek
+    Gujarati
+    Gurmukhi
+    Han
+    Hangul
+    Hanunoo
+    Hebrew
+    Hiragana
+    Inherited
+    Kannada
+    Katakana
+    Khmer
+    Lao
+    Latin
+    Malayalam
+    Mongolian
+    Myanmar
+    Ogham
+    OldItalic
+    Oriya
+    Runic
+    Sinhala
+    Syriac
+    Tagalog
+    Tagbanwa
+    Tamil
+    Telugu
+    Thaana
+    Thai
+    Tibetan
+    Yi
+
+Extended property classes can supplement the basic
+properties, defined by the F<PropList> Unicode database:
+
+    ASCIIHexDigit
+    BidiControl
+    Dash
+    Deprecated
+    Diacritic
+    Extender
+    GraphemeLink
+    HexDigit
+    Hyphen
+    Ideographic
+    IDSBinaryOperator
+    IDSTrinaryOperator
+    JoinControl
+    LogicalOrderException
+    NoncharacterCodePoint
+    OtherAlphabetic
+    OtherDefaultIgnorableCodePoint
+    OtherGraphemeExtend
+    OtherLowercase
+    OtherMath
+    OtherUppercase
+    QuotationMark
+    Radical
+    SoftDotted
+    TerminalPunctuation
+    UnifiedIdeograph
+    WhiteSpace
+
+and there are further derived properties:
+
+    Alphabetic      Lu + Ll + Lt + Lm + Lo + OtherAlphabetic
+    Lowercase       Ll + OtherLowercase
+    Uppercase       Lu + OtherUppercase
+    Math            Sm + OtherMath
+
+    ID_Start        Lu + Ll + Lt + Lm + Lo + Nl
+    ID_Continue     ID_Start + Mn + Mc + Nd + Pc
+
+    Any             Any character
+    Assigned        Any non-Cn character (i.e. synonym for \P{Cn})
+    Unassigned      Synonym for \p{Cn}
+    Common          Any character (or unassigned code point)
+                    not explicitly assigned to a script
+
+For backward compatibility (with Perl 5.6), all properties mentioned
+so far may have C<Is> prepended to their name, so C<\P{IsLu}>, for
+example, is equal to C<\P{Lu}>.
+
+=head2 Blocks
+
+In addition to B<scripts>, Unicode also defines B<blocks> of
+characters.  The difference between scripts and blocks is that the
+concept of scripts is closer to natural languages, while the concept
+of blocks is more of an artificial grouping based on groups of 256
+Unicode characters. For example, the C<Latin> script contains letters
+from many blocks but does not contain all the characters from those
+blocks. It does not, for example, contain digits, because digits are
+shared across many scripts. Digits and similar groups, like
+punctuation, are in a category called C<Common>.
+
+For more about scripts, see the UTR #24:
+
+   http://www.unicode.org/unicode/reports/tr24/
+
+For more about blocks, see:
+
+   http://www.unicode.org/Public/UNIDATA/Blocks.txt
+
+Block names are given with the C<In> prefix. For example, the
+Katakana block is referenced via C<\p{InKatakana}>.  The C<In>
+prefix may be omitted if there is no naming conflict with a script
+or any other property, but it is recommended that C<In> always be used
+for block tests to avoid confusion.
+
+These block names are supported:
+
+    InAlphabeticPresentationForms
+    InArabic
+    InArabicPresentationFormsA
+    InArabicPresentationFormsB
+    InArmenian
+    InArrows
+    InBasicLatin
+    InBengali
+    InBlockElements
+    InBopomofo
+    InBopomofoExtended
+    InBoxDrawing
+    InBraillePatterns
+    InBuhid
+    InByzantineMusicalSymbols
+    InCJKCompatibility
+    InCJKCompatibilityForms
+    InCJKCompatibilityIdeographs
+    InCJKCompatibilityIdeographsSupplement
+    InCJKRadicalsSupplement
+    InCJKSymbolsAndPunctuation
+    InCJKUnifiedIdeographs
+    InCJKUnifiedIdeographsExtensionA
+    InCJKUnifiedIdeographsExtensionB
+    InCherokee
+    InCombiningDiacriticalMarks
+    InCombiningDiacriticalMarksforSymbols
+    InCombiningHalfMarks
+    InControlPictures
+    InCurrencySymbols
+    InCyrillic
+    InCyrillicSupplementary
+    InDeseret
+    InDevanagari
+    InDingbats
+    InEnclosedAlphanumerics
+    InEnclosedCJKLettersAndMonths
+    InEthiopic
+    InGeneralPunctuation
+    InGeometricShapes
+    InGeorgian
+    InGothic
+    InGreekExtended
+    InGreekAndCoptic
+    InGujarati
+    InGurmukhi
+    InHalfwidthAndFullwidthForms
+    InHangulCompatibilityJamo
+    InHangulJamo
+    InHangulSyllables
+    InHanunoo
+    InHebrew
+    InHighPrivateUseSurrogates
+    InHighSurrogates
+    InHiragana
+    InIPAExtensions
+    InIdeographicDescriptionCharacters
+    InKanbun
+    InKangxiRadicals
+    InKannada
+    InKatakana
+    InKatakanaPhoneticExtensions
+    InKhmer
+    InLao
+    InLatin1Supplement
+    InLatinExtendedA
+    InLatinExtendedAdditional
+    InLatinExtendedB
+    InLetterlikeSymbols
+    InLowSurrogates
+    InMalayalam
+    InMathematicalAlphanumericSymbols
+    InMathematicalOperators
+    InMiscellaneousMathematicalSymbolsA
+    InMiscellaneousMathematicalSymbolsB
+    InMiscellaneousSymbols
+    InMiscellaneousTechnical
+    InMongolian
+    InMusicalSymbols
+    InMyanmar
+    InNumberForms
+    InOgham
+    InOldItalic
+    InOpticalCharacterRecognition
+    InOriya
+    InPrivateUseArea
+    InRunic
+    InSinhala
+    InSmallFormVariants
+    InSpacingModifierLetters
+    InSpecials
+    InSuperscriptsAndSubscripts
+    InSupplementalArrowsA
+    InSupplementalArrowsB
+    InSupplementalMathematicalOperators
+    InSupplementaryPrivateUseAreaA
+    InSupplementaryPrivateUseAreaB
+    InSyriac
+    InTagalog
+    InTagbanwa
+    InTags
+    InTamil
+    InTelugu
+    InThaana
+    InThai
+    InTibetan
+    InUnifiedCanadianAboriginalSyllabics
+    InVariationSelectors
+    InYiRadicals
+    InYiSyllables
+
+=over 4
+
+=item *
+
+The special pattern C<\X> matches any extended Unicode
+sequence--"a combining character sequence" in Standardese--where the
+first character is a base character and subsequent characters are mark
+characters that apply to the base character.  C<\X> is equivalent to
+C<(?:\PM\pM*)>.
+
+=item *
+
+The C<tr///> operator translates characters instead of bytes.  Note
+that the C<tr///CU> functionality has been removed.  For similar
+functionality see pack('U0', ...) and pack('C0', ...).
+
+=item *
+
+Case translation operators use the Unicode case translation tables
+when character input is provided.  Note that C<uc()>, or C<\U> in
+interpolated strings, translates to uppercase, while C<ucfirst>,
+or C<\u> in interpolated strings, translates to titlecase in languages
+that make the distinction.
+
+=item *
+
+Most operators that deal with positions or lengths in a string will
+automatically switch to using character positions, including
+C<chop()>, C<chomp()>, C<substr()>, C<pos()>, C<index()>, C<rindex()>,
+C<sprintf()>, C<write()>, and C<length()>.  Operators that
+specifically do not switch include C<vec()>, C<pack()>, and
+C<unpack()>.  Operators that really don't care include
+operators that treats strings as a bucket of bits such as C<sort()>,
+and operators dealing with filenames.
+
+=item *
+
+The C<pack()>/C<unpack()> letters C<c> and C<C> do I<not> change,
+since they are often used for byte-oriented formats.  Again, think
+C<char> in the C language.
+
+There is a new C<U> specifier that converts between Unicode characters
+and code points.
+
+=item *
+
+The C<chr()> and C<ord()> functions work on characters, similar to
+C<pack("U")> and C<unpack("U")>, I<not> C<pack("C")> and
+C<unpack("C")>.  C<pack("C")> and C<unpack("C")> are methods for
+emulating byte-oriented C<chr()> and C<ord()> on Unicode strings.
+While these methods reveal the internal encoding of Unicode strings,
+that is not something one normally needs to care about at all.
+
+=item *
+
+The bit string operators, C<& | ^ ~>, can operate on character data.
+However, for backward compatibility, such as when using bit string
+operations when characters are all less than 256 in ordinal value, one
+should not use C<~> (the bit complement) with characters of both
+values less than 256 and values greater than 256.  Most importantly,
+DeMorgan's laws (C<~($x|$y) eq ~$x&~$y> and C<~($x&$y) eq ~$x|~$y>)
+will not hold.  The reason for this mathematical I<faux pas> is that
+the complement cannot return B<both> the 8-bit (byte-wide) bit
+complement B<and> the full character-wide bit complement.
+
+=item *
+
+lc(), uc(), lcfirst(), and ucfirst() work for the following cases:
+
+=over 8
+
+=item *
+
+the case mapping is from a single Unicode character to another
+single Unicode character, or
+
+=item *
+
+the case mapping is from a single Unicode character to more
+than one Unicode character.
+
+=back
+
+Things to do with locales (Lithuanian, Turkish, Azeri) do B<not> work
+since Perl does not understand the concept of Unicode locales.
+
+See the Unicode Technical Report #21, Case Mappings, for more details.
+
+=back
+
+=over 4
+
+=item *
+
+And finally, C<scalar reverse()> reverses by character rather than by byte.
+
+=back
+
+=head2 User-Defined Character Properties
+
+You can define your own character properties by defining subroutines
+whose names begin with "In" or "Is".  The subroutines can be defined in
+any package.  The user-defined properties can be used in the regular
+expression C<\p> and C<\P> constructs; if you are using a user-defined
+property from a package other than the one you are in, you must specify
+its package in the C<\p> or C<\P> construct.
+
+    # assuming property IsForeign defined in Lang::
+    package main;  # property package name required
+    if ($txt =~ /\p{Lang::IsForeign}+/) { ... }
+
+    package Lang;  # property package name not required
+    if ($txt =~ /\p{IsForeign}+/) { ... }
+
+
+Note that the effect is compile-time and immutable once defined.
+
+The subroutines must return a specially-formatted string, with one
+or more newline-separated lines.  Each line must be one of the following:
+
+=over 4
+
+=item *
+
+Two hexadecimal numbers separated by horizontal whitespace (space or
+tabular characters) denoting a range of Unicode code points to include.
+
+=item *
+
+Something to include, prefixed by "+": a built-in character
+property (prefixed by "utf8::") or a user-defined character property,
+to represent all the characters in that property; two hexadecimal code
+points for a range; or a single hexadecimal code point.
+
+=item *
+
+Something to exclude, prefixed by "-": an existing character
+property (prefixed by "utf8::") or a user-defined character property,
+to represent all the characters in that property; two hexadecimal code
+points for a range; or a single hexadecimal code point.
+
+=item *
+
+Something to negate, prefixed "!": an existing character
+property (prefixed by "utf8::") or a user-defined character property,
+to represent all the characters in that property; two hexadecimal code
+points for a range; or a single hexadecimal code point.
+
+=item *
+
+Something to intersect with, prefixed by "&": an existing character
+property (prefixed by "utf8::") or a user-defined character property,
+for all the characters except the characters in the property; two
+hexadecimal code points for a range; or a single hexadecimal code point.
+
+=back
+
+For example, to define a property that covers both the Japanese
+syllabaries (hiragana and katakana), you can define
+
+    sub InKana {
+	return <<END;
+    3040\t309F
+    30A0\t30FF
+    END
+    }
+
+Imagine that the here-doc end marker is at the beginning of the line.
+Now you can use C<\p{InKana}> and C<\P{InKana}>.
+
+You could also have used the existing block property names:
+
+    sub InKana {
+	return <<'END';
+    +utf8::InHiragana
+    +utf8::InKatakana
+    END
+    }
+
+Suppose you wanted to match only the allocated characters,
+not the raw block ranges: in other words, you want to remove
+the non-characters:
+
+    sub InKana {
+	return <<'END';
+    +utf8::InHiragana
+    +utf8::InKatakana
+    -utf8::IsCn
+    END
+    }
+
+The negation is useful for defining (surprise!) negated classes.
+
+    sub InNotKana {
+	return <<'END';
+    !utf8::InHiragana
+    -utf8::InKatakana
+    +utf8::IsCn
+    END
+    }
+
+Intersection is useful for getting the common characters matched by
+two (or more) classes.
+
+    sub InFooAndBar {
+        return <<'END';
+    +main::Foo
+    &main::Bar
+    END
+    }
+
+It's important to remember not to use "&" for the first set -- that
+would be intersecting with nothing (resulting in an empty set).
+
+You can also define your own mappings to be used in the lc(),
+lcfirst(), uc(), and ucfirst() (or their string-inlined versions).
+The principle is the same: define subroutines in the C<main> package
+with names like C<ToLower> (for lc() and lcfirst()), C<ToTitle> (for
+the first character in ucfirst()), and C<ToUpper> (for uc(), and the
+rest of the characters in ucfirst()).
+
+The string returned by the subroutines needs now to be three
+hexadecimal numbers separated by tabulators: start of the source
+range, end of the source range, and start of the destination range.
+For example:
+
+    sub ToUpper {
+	return <<END;
+    0061\t0063\t0041
+    END
+    }
+
+defines an uc() mapping that causes only the characters "a", "b", and
+"c" to be mapped to "A", "B", "C", all other characters will remain
+unchanged.
+
+If there is no source range to speak of, that is, the mapping is from
+a single character to another single character, leave the end of the
+source range empty, but the two tabulator characters are still needed.
+For example:
+
+    sub ToLower {
+	return <<END;
+    0041\t\t0061
+    END
+    }
+
+defines a lc() mapping that causes only "A" to be mapped to "a", all
+other characters will remain unchanged.
+
+(For serious hackers only)  If you want to introspect the default
+mappings, you can find the data in the directory
+C<$Config{privlib}>/F<unicore/To/>.  The mapping data is returned as
+the here-document, and the C<utf8::ToSpecFoo> are special exception
+mappings derived from <$Config{privlib}>/F<unicore/SpecialCasing.txt>.
+The C<Digit> and C<Fold> mappings that one can see in the directory
+are not directly user-accessible, one can use either the
+C<Unicode::UCD> module, or just match case-insensitively (that's when
+the C<Fold> mapping is used).
+
+A final note on the user-defined property tests and mappings: they
+will be used only if the scalar has been marked as having Unicode
+characters.  Old byte-style strings will not be affected.
+
+=head2 Character Encodings for Input and Output
+
+See L<Encode>.
+
+=head2 Unicode Regular Expression Support Level
+
+The following list of Unicode support for regular expressions describes
+all the features currently supported.  The references to "Level N"
+and the section numbers refer to the Unicode Technical Report 18,
+"Unicode Regular Expression Guidelines", version 6 (Unicode 3.2.0,
+Perl 5.8.0).
+
+=over 4
+
+=item *
+
+Level 1 - Basic Unicode Support
+
+        2.1 Hex Notation                        - done          [1]
+            Named Notation                      - done          [2]
+        2.2 Categories                          - done          [3][4]
+        2.3 Subtraction                         - MISSING       [5][6]
+        2.4 Simple Word Boundaries              - done          [7]
+        2.5 Simple Loose Matches                - done          [8]
+        2.6 End of Line                         - MISSING       [9][10]
+
+        [ 1] \x{...}
+        [ 2] \N{...}
+        [ 3] . \p{...} \P{...}
+        [ 4] support for scripts (see UTR#24 Script Names), blocks,
+             binary properties, enumerated non-binary properties, and
+             numeric properties (as listed in UTR#18 Other Properties)
+        [ 5] have negation
+        [ 6] can use regular expression look-ahead [a]
+             or user-defined character properties [b] to emulate subtraction
+        [ 7] include Letters in word characters
+        [ 8] note that Perl does Full case-folding in matching, not Simple:
+             for example U+1F88 is equivalent with U+1F00 U+03B9,
+             not with 1F80.  This difference matters for certain Greek
+             capital letters with certain modifiers: the Full case-folding
+             decomposes the letter, while the Simple case-folding would map
+             it to a single character.
+        [ 9] see UTR #13 Unicode Newline Guidelines
+        [10] should do ^ and $ also on \x{85}, \x{2028} and \x{2029}
+             (should also affect <>, $., and script line numbers)
+             (the \x{85}, \x{2028} and \x{2029} do match \s)
+
+[a] You can mimic class subtraction using lookahead.
+For example, what UTR #18 might write as
+
+    [{Greek}-[{UNASSIGNED}]]
+
+in Perl can be written as:
+
+    (?!\p{Unassigned})\p{InGreekAndCoptic}
+    (?=\p{Assigned})\p{InGreekAndCoptic}
+
+But in this particular example, you probably really want
+
+    \p{GreekAndCoptic}
+
+which will match assigned characters known to be part of the Greek script.
+
+Also see the Unicode::Regex::Set module, it does implement the full
+UTR #18 grouping, intersection, union, and removal (subtraction) syntax.
+
+[b] See L</"User-Defined Character Properties">.
+
+=item *
+
+Level 2 - Extended Unicode Support
+
+        3.1 Surrogates                          - MISSING	[11]
+        3.2 Canonical Equivalents               - MISSING       [12][13]
+        3.3 Locale-Independent Graphemes        - MISSING       [14]
+        3.4 Locale-Independent Words            - MISSING       [15]
+        3.5 Locale-Independent Loose Matches    - MISSING       [16]
+
+        [11] Surrogates are solely a UTF-16 concept and Perl's internal
+             representation is UTF-8.  The Encode module does UTF-16, though.
+        [12] see UTR#15 Unicode Normalization
+        [13] have Unicode::Normalize but not integrated to regexes
+        [14] have \X but at this level . should equal that
+        [15] need three classes, not just \w and \W
+        [16] see UTR#21 Case Mappings
+
+=item *
+
+Level 3 - Locale-Sensitive Support
+
+        4.1 Locale-Dependent Categories         - MISSING
+        4.2 Locale-Dependent Graphemes          - MISSING       [16][17]
+        4.3 Locale-Dependent Words              - MISSING
+        4.4 Locale-Dependent Loose Matches      - MISSING
+        4.5 Locale-Dependent Ranges             - MISSING
+
+        [16] see UTR#10 Unicode Collation Algorithms
+        [17] have Unicode::Collate but not integrated to regexes
+
+=back
+
+=head2 Unicode Encodings
+
+Unicode characters are assigned to I<code points>, which are abstract
+numbers.  To use these numbers, various encodings are needed.
+
+=over 4
+
+=item *
+
+UTF-8
+
+UTF-8 is a variable-length (1 to 6 bytes, current character allocations
+require 4 bytes), byte-order independent encoding. For ASCII (and we
+really do mean 7-bit ASCII, not another 8-bit encoding), UTF-8 is
+transparent.
+
+The following table is from Unicode 3.2.
+
+ Code Points            1st Byte  2nd Byte  3rd Byte  4th Byte
+
+   U+0000..U+007F       00..7F
+   U+0080..U+07FF       C2..DF    80..BF
+   U+0800..U+0FFF       E0        A0..BF    80..BF
+   U+1000..U+CFFF       E1..EC    80..BF    80..BF
+   U+D000..U+D7FF       ED        80..9F    80..BF
+   U+D800..U+DFFF       ******* ill-formed *******
+   U+E000..U+FFFF       EE..EF    80..BF    80..BF
+  U+10000..U+3FFFF      F0        90..BF    80..BF    80..BF
+  U+40000..U+FFFFF      F1..F3    80..BF    80..BF    80..BF
+ U+100000..U+10FFFF     F4        80..8F    80..BF    80..BF
+
+Note the C<A0..BF> in C<U+0800..U+0FFF>, the C<80..9F> in
+C<U+D000...U+D7FF>, the C<90..B>F in C<U+10000..U+3FFFF>, and the
+C<80...8F> in C<U+100000..U+10FFFF>.  The "gaps" are caused by legal
+UTF-8 avoiding non-shortest encodings: it is technically possible to
+UTF-8-encode a single code point in different ways, but that is
+explicitly forbidden, and the shortest possible encoding should always
+be used.  So that's what Perl does.
+
+Another way to look at it is via bits:
+
+ Code Points                    1st Byte   2nd Byte  3rd Byte  4th Byte
+
+                    0aaaaaaa     0aaaaaaa
+            00000bbbbbaaaaaa     110bbbbb  10aaaaaa
+            ccccbbbbbbaaaaaa     1110cccc  10bbbbbb  10aaaaaa
+  00000dddccccccbbbbbbaaaaaa     11110ddd  10cccccc  10bbbbbb  10aaaaaa
+
+As you can see, the continuation bytes all begin with C<10>, and the
+leading bits of the start byte tell how many bytes the are in the
+encoded character.
+
+=item *
+
+UTF-EBCDIC
+
+Like UTF-8 but EBCDIC-safe, in the way that UTF-8 is ASCII-safe.
+
+=item *
+
+UTF-16, UTF-16BE, UTF-16LE, Surrogates, and BOMs (Byte Order Marks)
+
+The followings items are mostly for reference and general Unicode
+knowledge, Perl doesn't use these constructs internally.
+
+UTF-16 is a 2 or 4 byte encoding.  The Unicode code points
+C<U+0000..U+FFFF> are stored in a single 16-bit unit, and the code
+points C<U+10000..U+10FFFF> in two 16-bit units.  The latter case is
+using I<surrogates>, the first 16-bit unit being the I<high
+surrogate>, and the second being the I<low surrogate>.
+
+Surrogates are code points set aside to encode the C<U+10000..U+10FFFF>
+range of Unicode code points in pairs of 16-bit units.  The I<high
+surrogates> are the range C<U+D800..U+DBFF>, and the I<low surrogates>
+are the range C<U+DC00..U+DFFF>.  The surrogate encoding is
+
+	$hi = ($uni - 0x10000) / 0x400 + 0xD800;
+	$lo = ($uni - 0x10000) % 0x400 + 0xDC00;
+
+and the decoding is
+
+	$uni = 0x10000 + ($hi - 0xD800) * 0x400 + ($lo - 0xDC00);
+
+If you try to generate surrogates (for example by using chr()), you
+will get a warning if warnings are turned on, because those code
+points are not valid for a Unicode character.
+
+Because of the 16-bitness, UTF-16 is byte-order dependent.  UTF-16
+itself can be used for in-memory computations, but if storage or
+transfer is required either UTF-16BE (big-endian) or UTF-16LE
+(little-endian) encodings must be chosen.
+
+This introduces another problem: what if you just know that your data
+is UTF-16, but you don't know which endianness?  Byte Order Marks, or
+BOMs, are a solution to this.  A special character has been reserved
+in Unicode to function as a byte order marker: the character with the
+code point C<U+FEFF> is the BOM.
+
+The trick is that if you read a BOM, you will know the byte order,
+since if it was written on a big-endian platform, you will read the
+bytes C<0xFE 0xFF>, but if it was written on a little-endian platform,
+you will read the bytes C<0xFF 0xFE>.  (And if the originating platform
+was writing in UTF-8, you will read the bytes C<0xEF 0xBB 0xBF>.)
+
+The way this trick works is that the character with the code point
+C<U+FFFE> is guaranteed not to be a valid Unicode character, so the
+sequence of bytes C<0xFF 0xFE> is unambiguously "BOM, represented in
+little-endian format" and cannot be C<U+FFFE>, represented in big-endian
+format".
+
+=item *
+
+UTF-32, UTF-32BE, UTF-32LE
+
+The UTF-32 family is pretty much like the UTF-16 family, expect that
+the units are 32-bit, and therefore the surrogate scheme is not
+needed.  The BOM signatures will be C<0x00 0x00 0xFE 0xFF> for BE and
+C<0xFF 0xFE 0x00 0x00> for LE.
+
+=item *
+
+UCS-2, UCS-4
+
+Encodings defined by the ISO 10646 standard.  UCS-2 is a 16-bit
+encoding.  Unlike UTF-16, UCS-2 is not extensible beyond C<U+FFFF>,
+because it does not use surrogates.  UCS-4 is a 32-bit encoding,
+functionally identical to UTF-32.
+
+=item *
+
+UTF-7
+
+A seven-bit safe (non-eight-bit) encoding, which is useful if the
+transport or storage is not eight-bit safe.  Defined by RFC 2152.
+
+=back
+
+=head2 Security Implications of Unicode
+
+=over 4
+
+=item *
+
+Malformed UTF-8
+
+Unfortunately, the specification of UTF-8 leaves some room for
+interpretation of how many bytes of encoded output one should generate
+from one input Unicode character.  Strictly speaking, the shortest
+possible sequence of UTF-8 bytes should be generated,
+because otherwise there is potential for an input buffer overflow at
+the receiving end of a UTF-8 connection.  Perl always generates the
+shortest length UTF-8, and with warnings on Perl will warn about
+non-shortest length UTF-8 along with other malformations, such as the
+surrogates, which are not real Unicode code points.
+
+=item *
+
+Regular expressions behave slightly differently between byte data and
+character (Unicode) data.  For example, the "word character" character
+class C<\w> will work differently depending on if data is eight-bit bytes
+or Unicode.
+
+In the first case, the set of C<\w> characters is either small--the
+default set of alphabetic characters, digits, and the "_"--or, if you
+are using a locale (see L<perllocale>), the C<\w> might contain a few
+more letters according to your language and country.
+
+In the second case, the C<\w> set of characters is much, much larger.
+Most importantly, even in the set of the first 256 characters, it will
+probably match different characters: unlike most locales, which are
+specific to a language and country pair, Unicode classifies all the
+characters that are letters I<somewhere> as C<\w>.  For example, your
+locale might not think that LATIN SMALL LETTER ETH is a letter (unless
+you happen to speak Icelandic), but Unicode does.
+
+As discussed elsewhere, Perl has one foot (two hooves?) planted in
+each of two worlds: the old world of bytes and the new world of
+characters, upgrading from bytes to characters when necessary.
+If your legacy code does not explicitly use Unicode, no automatic
+switch-over to characters should happen.  Characters shouldn't get
+downgraded to bytes, either.  It is possible to accidentally mix bytes
+and characters, however (see L<perluniintro>), in which case C<\w> in
+regular expressions might start behaving differently.  Review your
+code.  Use warnings and the C<strict> pragma.
+
+=back
+
+=head2 Unicode in Perl on EBCDIC
+
+The way Unicode is handled on EBCDIC platforms is still
+experimental.  On such platforms, references to UTF-8 encoding in this
+document and elsewhere should be read as meaning the UTF-EBCDIC
+specified in Unicode Technical Report 16, unless ASCII vs. EBCDIC issues
+are specifically discussed. There is no C<utfebcdic> pragma or
+":utfebcdic" layer; rather, "utf8" and ":utf8" are reused to mean
+the platform's "natural" 8-bit encoding of Unicode. See L<perlebcdic>
+for more discussion of the issues.
+
+=head2 Locales
+
+Usually locale settings and Unicode do not affect each other, but
+there are a couple of exceptions:
+
+=over 4
+
+=item *
+
+You can enable automatic UTF-8-ification of your standard file
+handles, default C<open()> layer, and C<@ARGV> by using either
+the C<-C> command line switch or the C<PERL_UNICODE> environment
+variable, see L<perlrun> for the documentation of the C<-C> switch.
+
+=item *
+
+Perl tries really hard to work both with Unicode and the old
+byte-oriented world. Most often this is nice, but sometimes Perl's
+straddling of the proverbial fence causes problems.
+
+=back
+
+=head2 When Unicode Does Not Happen
+
+While Perl does have extensive ways to input and output in Unicode,
+and few other 'entry points' like the @ARGV which can be interpreted
+as Unicode (UTF-8), there still are many places where Unicode (in some
+encoding or another) could be given as arguments or received as
+results, or both, but it is not.
+
+The following are such interfaces.  For all of these interfaces Perl
+currently (as of 5.8.3) simply assumes byte strings both as arguments
+and results, or UTF-8 strings if the C<encoding> pragma has been used.
+
+One reason why Perl does not attempt to resolve the role of Unicode in
+this cases is that the answers are highly dependent on the operating
+system and the file system(s).  For example, whether filenames can be
+in Unicode, and in exactly what kind of encoding, is not exactly a
+portable concept.  Similarly for the qx and system: how well will the
+'command line interface' (and which of them?) handle Unicode?
+
+=over 4
+
+=item *
+
+chdir, chmod, chown, chroot, exec, link, lstat, mkdir, 
+rename, rmdir, stat, symlink, truncate, unlink, utime, -X
+
+=item *
+
+%ENV
+
+=item *
+
+glob (aka the <*>)
+
+=item *
+
+open, opendir, sysopen
+
+=item *
+
+qx (aka the backtick operator), system
+
+=item *
+
+readdir, readlink
+
+=back
+
+=head2 Forcing Unicode in Perl (Or Unforcing Unicode in Perl)
+
+Sometimes (see L</"When Unicode Does Not Happen">) there are
+situations where you simply need to force Perl to believe that a byte
+string is UTF-8, or vice versa.  The low-level calls
+utf8::upgrade($bytestring) and utf8::downgrade($utf8string) are
+the answers.
+
+Do not use them without careful thought, though: Perl may easily get
+very confused, angry, or even crash, if you suddenly change the 'nature'
+of scalar like that.  Especially careful you have to be if you use the
+utf8::upgrade(): any random byte string is not valid UTF-8.
+
+=head2 Using Unicode in XS
+
+If you want to handle Perl Unicode in XS extensions, you may find the
+following C APIs useful.  See also L<perlguts/"Unicode Support"> for an
+explanation about Unicode at the XS level, and L<perlapi> for the API
+details.
+
+=over 4
+
+=item *
+
+C<DO_UTF8(sv)> returns true if the C<UTF8> flag is on and the bytes
+pragma is not in effect.  C<SvUTF8(sv)> returns true is the C<UTF8>
+flag is on; the bytes pragma is ignored.  The C<UTF8> flag being on
+does B<not> mean that there are any characters of code points greater
+than 255 (or 127) in the scalar or that there are even any characters
+in the scalar.  What the C<UTF8> flag means is that the sequence of
+octets in the representation of the scalar is the sequence of UTF-8
+encoded code points of the characters of a string.  The C<UTF8> flag
+being off means that each octet in this representation encodes a
+single character with code point 0..255 within the string.  Perl's
+Unicode model is not to use UTF-8 until it is absolutely necessary.
+
+=item *
+
+C<uvuni_to_utf8(buf, chr)> writes a Unicode character code point into
+a buffer encoding the code point as UTF-8, and returns a pointer
+pointing after the UTF-8 bytes.
+
+=item *
+
+C<utf8_to_uvuni(buf, lenp)> reads UTF-8 encoded bytes from a buffer and
+returns the Unicode character code point and, optionally, the length of
+the UTF-8 byte sequence.
+
+=item *
+
+C<utf8_length(start, end)> returns the length of the UTF-8 encoded buffer
+in characters.  C<sv_len_utf8(sv)> returns the length of the UTF-8 encoded
+scalar.
+
+=item *
+
+C<sv_utf8_upgrade(sv)> converts the string of the scalar to its UTF-8
+encoded form.  C<sv_utf8_downgrade(sv)> does the opposite, if
+possible.  C<sv_utf8_encode(sv)> is like sv_utf8_upgrade except that
+it does not set the C<UTF8> flag.  C<sv_utf8_decode()> does the
+opposite of C<sv_utf8_encode()>.  Note that none of these are to be
+used as general-purpose encoding or decoding interfaces: C<use Encode>
+for that.  C<sv_utf8_upgrade()> is affected by the encoding pragma
+but C<sv_utf8_downgrade()> is not (since the encoding pragma is
+designed to be a one-way street).
+
+=item *
+
+C<is_utf8_char(s)> returns true if the pointer points to a valid UTF-8
+character.
+
+=item *
+
+C<is_utf8_string(buf, len)> returns true if C<len> bytes of the buffer
+are valid UTF-8.
+
+=item *
+
+C<UTF8SKIP(buf)> will return the number of bytes in the UTF-8 encoded
+character in the buffer.  C<UNISKIP(chr)> will return the number of bytes
+required to UTF-8-encode the Unicode character code point.  C<UTF8SKIP()>
+is useful for example for iterating over the characters of a UTF-8
+encoded buffer; C<UNISKIP()> is useful, for example, in computing
+the size required for a UTF-8 encoded buffer.
+
+=item *
+
+C<utf8_distance(a, b)> will tell the distance in characters between the
+two pointers pointing to the same UTF-8 encoded buffer.
+
+=item *
+
+C<utf8_hop(s, off)> will return a pointer to an UTF-8 encoded buffer
+that is C<off> (positive or negative) Unicode characters displaced
+from the UTF-8 buffer C<s>.  Be careful not to overstep the buffer:
+C<utf8_hop()> will merrily run off the end or the beginning of the
+buffer if told to do so.
+
+=item *
+
+C<pv_uni_display(dsv, spv, len, pvlim, flags)> and
+C<sv_uni_display(dsv, ssv, pvlim, flags)> are useful for debugging the
+output of Unicode strings and scalars.  By default they are useful
+only for debugging--they display B<all> characters as hexadecimal code
+points--but with the flags C<UNI_DISPLAY_ISPRINT>,
+C<UNI_DISPLAY_BACKSLASH>, and C<UNI_DISPLAY_QQ> you can make the
+output more readable.
+
+=item *
+
+C<ibcmp_utf8(s1, pe1, u1, l1, u1, s2, pe2, l2, u2)> can be used to
+compare two strings case-insensitively in Unicode.  For case-sensitive
+comparisons you can just use C<memEQ()> and C<memNE()> as usual.
+
+=back
+
+For more information, see L<perlapi>, and F<utf8.c> and F<utf8.h>
+in the Perl source code distribution.
+
+=head1 BUGS
+
+=head2 Interaction with Locales
+
+Use of locales with Unicode data may lead to odd results.  Currently,
+Perl attempts to attach 8-bit locale info to characters in the range
+0..255, but this technique is demonstrably incorrect for locales that
+use characters above that range when mapped into Unicode.  Perl's
+Unicode support will also tend to run slower.  Use of locales with
+Unicode is discouraged.
+
+=head2 Interaction with Extensions
+
+When Perl exchanges data with an extension, the extension should be
+able to understand the UTF-8 flag and act accordingly. If the
+extension doesn't know about the flag, it's likely that the extension
+will return incorrectly-flagged data.
+
+So if you're working with Unicode data, consult the documentation of
+every module you're using if there are any issues with Unicode data
+exchange. If the documentation does not talk about Unicode at all,
+suspect the worst and probably look at the source to learn how the
+module is implemented. Modules written completely in Perl shouldn't
+cause problems. Modules that directly or indirectly access code written
+in other programming languages are at risk.
+
+For affected functions, the simple strategy to avoid data corruption is
+to always make the encoding of the exchanged data explicit. Choose an
+encoding that you know the extension can handle. Convert arguments passed
+to the extensions to that encoding and convert results back from that
+encoding. Write wrapper functions that do the conversions for you, so
+you can later change the functions when the extension catches up.
+
+To provide an example, let's say the popular Foo::Bar::escape_html
+function doesn't deal with Unicode data yet. The wrapper function
+would convert the argument to raw UTF-8 and convert the result back to
+Perl's internal representation like so:
+
+    sub my_escape_html ($) {
+      my($what) = shift;
+      return unless defined $what;
+      Encode::decode_utf8(Foo::Bar::escape_html(Encode::encode_utf8($what)));
+    }
+
+Sometimes, when the extension does not convert data but just stores
+and retrieves them, you will be in a position to use the otherwise
+dangerous Encode::_utf8_on() function. Let's say the popular
+C<Foo::Bar> extension, written in C, provides a C<param> method that
+lets you store and retrieve data according to these prototypes:
+
+    $self->param($name, $value);            # set a scalar
+    $value = $self->param($name);           # retrieve a scalar
+
+If it does not yet provide support for any encoding, one could write a
+derived class with such a C<param> method:
+
+    sub param {
+      my($self,$name,$value) = @_;
+      utf8::upgrade($name);     # make sure it is UTF-8 encoded
+      if (defined $value)
+        utf8::upgrade($value);  # make sure it is UTF-8 encoded
+        return $self->SUPER::param($name,$value);
+      } else {
+        my $ret = $self->SUPER::param($name);
+        Encode::_utf8_on($ret); # we know, it is UTF-8 encoded
+        return $ret;
+      }
+    }
+
+Some extensions provide filters on data entry/exit points, such as
+DB_File::filter_store_key and family. Look out for such filters in
+the documentation of your extensions, they can make the transition to
+Unicode data much easier.
+
+=head2 Speed
+
+Some functions are slower when working on UTF-8 encoded strings than
+on byte encoded strings.  All functions that need to hop over
+characters such as length(), substr() or index(), or matching regular
+expressions can work B<much> faster when the underlying data are
+byte-encoded.
+
+In Perl 5.8.0 the slowness was often quite spectacular; in Perl 5.8.1
+a caching scheme was introduced which will hopefully make the slowness
+somewhat less spectacular, at least for some operations.  In general,
+operations with UTF-8 encoded strings are still slower. As an example,
+the Unicode properties (character classes) like C<\p{Nd}> are known to
+be quite a bit slower (5-20 times) than their simpler counterparts
+like C<\d> (then again, there 268 Unicode characters matching C<Nd>
+compared with the 10 ASCII characters matching C<d>).
+
+=head2 Porting code from perl-5.6.X
+
+Perl 5.8 has a different Unicode model from 5.6. In 5.6 the programmer
+was required to use the C<utf8> pragma to declare that a given scope
+expected to deal with Unicode data and had to make sure that only
+Unicode data were reaching that scope. If you have code that is
+working with 5.6, you will need some of the following adjustments to
+your code. The examples are written such that the code will continue
+to work under 5.6, so you should be safe to try them out.
+
+=over 4
+
+=item *
+
+A filehandle that should read or write UTF-8
+
+  if ($] > 5.007) {
+    binmode $fh, ":utf8";
+  }
+
+=item *
+
+A scalar that is going to be passed to some extension
+
+Be it Compress::Zlib, Apache::Request or any extension that has no
+mention of Unicode in the manpage, you need to make sure that the
+UTF-8 flag is stripped off. Note that at the time of this writing
+(October 2002) the mentioned modules are not UTF-8-aware. Please
+check the documentation to verify if this is still true.
+
+  if ($] > 5.007) {
+    require Encode;
+    $val = Encode::encode_utf8($val); # make octets
+  }
+
+=item *
+
+A scalar we got back from an extension
+
+If you believe the scalar comes back as UTF-8, you will most likely
+want the UTF-8 flag restored:
+
+  if ($] > 5.007) {
+    require Encode;
+    $val = Encode::decode_utf8($val);
+  }
+
+=item *
+
+Same thing, if you are really sure it is UTF-8
+
+  if ($] > 5.007) {
+    require Encode;
+    Encode::_utf8_on($val);
+  }
+
+=item *
+
+A wrapper for fetchrow_array and fetchrow_hashref
+
+When the database contains only UTF-8, a wrapper function or method is
+a convenient way to replace all your fetchrow_array and
+fetchrow_hashref calls. A wrapper function will also make it easier to
+adapt to future enhancements in your database driver. Note that at the
+time of this writing (October 2002), the DBI has no standardized way
+to deal with UTF-8 data. Please check the documentation to verify if
+that is still true.
+
+  sub fetchrow {
+    my($self, $sth, $what) = @_; # $what is one of fetchrow_{array,hashref}
+    if ($] < 5.007) {
+      return $sth->$what;
+    } else {
+      require Encode;
+      if (wantarray) {
+        my @arr = $sth->$what;
+        for (@arr) {
+          defined && /[^\000-\177]/ && Encode::_utf8_on($_);
+        }
+        return @arr;
+      } else {
+        my $ret = $sth->$what;
+        if (ref $ret) {
+          for my $k (keys %$ret) {
+            defined && /[^\000-\177]/ && Encode::_utf8_on($_) for $ret->{$k};
+          }
+          return $ret;
+        } else {
+          defined && /[^\000-\177]/ && Encode::_utf8_on($_) for $ret;
+          return $ret;
+        }
+      }
+    }
+  }
+
+
+=item *
+
+A large scalar that you know can only contain ASCII
+
+Scalars that contain only ASCII and are marked as UTF-8 are sometimes
+a drag to your program. If you recognize such a situation, just remove
+the UTF-8 flag:
+
+  utf8::downgrade($val) if $] > 5.007;
+
+=back
+
+=head1 SEE ALSO
+
+L<perluniintro>, L<encoding>, L<Encode>, L<open>, L<utf8>, L<bytes>,
+L<perlretut>, L<perlvar/"${^UNICODE}">
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perluniintro.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perluniintro.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perluniintro.pod	(revision 14489)
@@ -0,0 +1,895 @@
+=head1 NAME
+
+perluniintro - Perl Unicode introduction
+
+=head1 DESCRIPTION
+
+This document gives a general idea of Unicode and how to use Unicode
+in Perl.
+
+=head2 Unicode
+
+Unicode is a character set standard which plans to codify all of the
+writing systems of the world, plus many other symbols.
+
+Unicode and ISO/IEC 10646 are coordinated standards that provide code
+points for characters in almost all modern character set standards,
+covering more than 30 writing systems and hundreds of languages,
+including all commercially-important modern languages.  All characters
+in the largest Chinese, Japanese, and Korean dictionaries are also
+encoded. The standards will eventually cover almost all characters in
+more than 250 writing systems and thousands of languages.
+Unicode 1.0 was released in October 1991, and 4.0 in April 2003.
+
+A Unicode I<character> is an abstract entity.  It is not bound to any
+particular integer width, especially not to the C language C<char>.
+Unicode is language-neutral and display-neutral: it does not encode the
+language of the text and it does not define fonts or other graphical
+layout details.  Unicode operates on characters and on text built from
+those characters.
+
+Unicode defines characters like C<LATIN CAPITAL LETTER A> or C<GREEK
+SMALL LETTER ALPHA> and unique numbers for the characters, in this
+case 0x0041 and 0x03B1, respectively.  These unique numbers are called
+I<code points>.
+
+The Unicode standard prefers using hexadecimal notation for the code
+points.  If numbers like C<0x0041> are unfamiliar to you, take a peek
+at a later section, L</"Hexadecimal Notation">.  The Unicode standard
+uses the notation C<U+0041 LATIN CAPITAL LETTER A>, to give the
+hexadecimal code point and the normative name of the character.
+
+Unicode also defines various I<properties> for the characters, like
+"uppercase" or "lowercase", "decimal digit", or "punctuation";
+these properties are independent of the names of the characters.
+Furthermore, various operations on the characters like uppercasing,
+lowercasing, and collating (sorting) are defined.
+
+A Unicode character consists either of a single code point, or a
+I<base character> (like C<LATIN CAPITAL LETTER A>), followed by one or
+more I<modifiers> (like C<COMBINING ACUTE ACCENT>).  This sequence of
+base character and modifiers is called a I<combining character
+sequence>.
+
+Whether to call these combining character sequences "characters"
+depends on your point of view. If you are a programmer, you probably
+would tend towards seeing each element in the sequences as one unit,
+or "character".  The whole sequence could be seen as one "character",
+however, from the user's point of view, since that's probably what it
+looks like in the context of the user's language.
+
+With this "whole sequence" view of characters, the total number of
+characters is open-ended. But in the programmer's "one unit is one
+character" point of view, the concept of "characters" is more
+deterministic.  In this document, we take that second  point of view:
+one "character" is one Unicode code point, be it a base character or
+a combining character.
+
+For some combinations, there are I<precomposed> characters.
+C<LATIN CAPITAL LETTER A WITH ACUTE>, for example, is defined as
+a single code point.  These precomposed characters are, however,
+only available for some combinations, and are mainly
+meant to support round-trip conversions between Unicode and legacy
+standards (like the ISO 8859).  In the general case, the composing
+method is more extensible.  To support conversion between
+different compositions of the characters, various I<normalization
+forms> to standardize representations are also defined.
+
+Because of backward compatibility with legacy encodings, the "a unique
+number for every character" idea breaks down a bit: instead, there is
+"at least one number for every character".  The same character could
+be represented differently in several legacy encodings.  The
+converse is also not true: some code points do not have an assigned
+character.  Firstly, there are unallocated code points within
+otherwise used blocks.  Secondly, there are special Unicode control
+characters that do not represent true characters.
+
+A common myth about Unicode is that it would be "16-bit", that is,
+Unicode is only represented as C<0x10000> (or 65536) characters from
+C<0x0000> to C<0xFFFF>.  B<This is untrue.>  Since Unicode 2.0 (July
+1996), Unicode has been defined all the way up to 21 bits (C<0x10FFFF>),
+and since Unicode 3.1 (March 2001), characters have been defined
+beyond C<0xFFFF>.  The first C<0x10000> characters are called the
+I<Plane 0>, or the I<Basic Multilingual Plane> (BMP).  With Unicode
+3.1, 17 (yes, seventeen) planes in all were defined--but they are
+nowhere near full of defined characters, yet.
+
+Another myth is that the 256-character blocks have something to
+do with languages--that each block would define the characters used
+by a language or a set of languages.  B<This is also untrue.>
+The division into blocks exists, but it is almost completely
+accidental--an artifact of how the characters have been and
+still are allocated.  Instead, there is a concept called I<scripts>,
+which is more useful: there is C<Latin> script, C<Greek> script, and
+so on.  Scripts usually span varied parts of several blocks.
+For further information see L<Unicode::UCD>.
+
+The Unicode code points are just abstract numbers.  To input and
+output these abstract numbers, the numbers must be I<encoded> or
+I<serialised> somehow.  Unicode defines several I<character encoding
+forms>, of which I<UTF-8> is perhaps the most popular.  UTF-8 is a
+variable length encoding that encodes Unicode characters as 1 to 6
+bytes (only 4 with the currently defined characters).  Other encodings
+include UTF-16 and UTF-32 and their big- and little-endian variants
+(UTF-8 is byte-order independent) The ISO/IEC 10646 defines the UCS-2
+and UCS-4 encoding forms.
+
+For more information about encodings--for instance, to learn what
+I<surrogates> and I<byte order marks> (BOMs) are--see L<perlunicode>.
+
+=head2 Perl's Unicode Support
+
+Starting from Perl 5.6.0, Perl has had the capacity to handle Unicode
+natively.  Perl 5.8.0, however, is the first recommended release for
+serious Unicode work.  The maintenance release 5.6.1 fixed many of the
+problems of the initial Unicode implementation, but for example
+regular expressions still do not work with Unicode in 5.6.1.
+
+B<Starting from Perl 5.8.0, the use of C<use utf8> is no longer
+necessary.> In earlier releases the C<utf8> pragma was used to declare
+that operations in the current block or file would be Unicode-aware.
+This model was found to be wrong, or at least clumsy: the "Unicodeness"
+is now carried with the data, instead of being attached to the
+operations.  Only one case remains where an explicit C<use utf8> is
+needed: if your Perl script itself is encoded in UTF-8, you can use
+UTF-8 in your identifier names, and in string and regular expression
+literals, by saying C<use utf8>.  This is not the default because
+scripts with legacy 8-bit data in them would break.  See L<utf8>.
+
+=head2 Perl's Unicode Model
+
+Perl supports both pre-5.6 strings of eight-bit native bytes, and
+strings of Unicode characters.  The principle is that Perl tries to
+keep its data as eight-bit bytes for as long as possible, but as soon
+as Unicodeness cannot be avoided, the data is transparently upgraded
+to Unicode.
+
+Internally, Perl currently uses either whatever the native eight-bit
+character set of the platform (for example Latin-1) is, defaulting to
+UTF-8, to encode Unicode strings. Specifically, if all code points in
+the string are C<0xFF> or less, Perl uses the native eight-bit
+character set.  Otherwise, it uses UTF-8.
+
+A user of Perl does not normally need to know nor care how Perl
+happens to encode its internal strings, but it becomes relevant when
+outputting Unicode strings to a stream without a PerlIO layer -- one with
+the "default" encoding.  In such a case, the raw bytes used internally
+(the native character set or UTF-8, as appropriate for each string)
+will be used, and a "Wide character" warning will be issued if those
+strings contain a character beyond 0x00FF.
+
+For example,
+
+      perl -e 'print "\x{DF}\n", "\x{0100}\x{DF}\n"'              
+
+produces a fairly useless mixture of native bytes and UTF-8, as well
+as a warning:
+
+     Wide character in print at ...
+
+To output UTF-8, use the C<:utf8> output layer.  Prepending
+
+      binmode(STDOUT, ":utf8");
+
+to this sample program ensures that the output is completely UTF-8,
+and removes the program's warning.
+
+You can enable automatic UTF-8-ification of your standard file
+handles, default C<open()> layer, and C<@ARGV> by using either
+the C<-C> command line switch or the C<PERL_UNICODE> environment
+variable, see L<perlrun> for the documentation of the C<-C> switch.
+
+Note that this means that Perl expects other software to work, too:
+if Perl has been led to believe that STDIN should be UTF-8, but then
+STDIN coming in from another command is not UTF-8, Perl will complain
+about the malformed UTF-8.
+
+All features that combine Unicode and I/O also require using the new
+PerlIO feature.  Almost all Perl 5.8 platforms do use PerlIO, though:
+you can see whether yours is by running "perl -V" and looking for
+C<useperlio=define>.
+
+=head2 Unicode and EBCDIC
+
+Perl 5.8.0 also supports Unicode on EBCDIC platforms.  There,
+Unicode support is somewhat more complex to implement since
+additional conversions are needed at every step.  Some problems
+remain, see L<perlebcdic> for details.
+
+In any case, the Unicode support on EBCDIC platforms is better than
+in the 5.6 series, which didn't work much at all for EBCDIC platform.
+On EBCDIC platforms, the internal Unicode encoding form is UTF-EBCDIC
+instead of UTF-8.  The difference is that as UTF-8 is "ASCII-safe" in
+that ASCII characters encode to UTF-8 as-is, while UTF-EBCDIC is
+"EBCDIC-safe".
+
+=head2 Creating Unicode
+
+To create Unicode characters in literals for code points above C<0xFF>,
+use the C<\x{...}> notation in double-quoted strings:
+
+    my $smiley = "\x{263a}";
+
+Similarly, it can be used in regular expression literals
+
+    $smiley =~ /\x{263a}/;
+
+At run-time you can use C<chr()>:
+
+    my $hebrew_alef = chr(0x05d0);
+
+See L</"Further Resources"> for how to find all these numeric codes.
+
+Naturally, C<ord()> will do the reverse: it turns a character into
+a code point.
+
+Note that C<\x..> (no C<{}> and only two hexadecimal digits), C<\x{...}>,
+and C<chr(...)> for arguments less than C<0x100> (decimal 256)
+generate an eight-bit character for backward compatibility with older
+Perls.  For arguments of C<0x100> or more, Unicode characters are
+always produced. If you want to force the production of Unicode
+characters regardless of the numeric value, use C<pack("U", ...)>
+instead of C<\x..>, C<\x{...}>, or C<chr()>.
+
+You can also use the C<charnames> pragma to invoke characters
+by name in double-quoted strings:
+
+    use charnames ':full';
+    my $arabic_alef = "\N{ARABIC LETTER ALEF}";
+
+And, as mentioned above, you can also C<pack()> numbers into Unicode
+characters:
+
+   my $georgian_an  = pack("U", 0x10a0);
+
+Note that both C<\x{...}> and C<\N{...}> are compile-time string
+constants: you cannot use variables in them.  if you want similar
+run-time functionality, use C<chr()> and C<charnames::vianame()>.
+
+If you want to force the result to Unicode characters, use the special
+C<"U0"> prefix.  It consumes no arguments but forces the result to be
+in Unicode characters, instead of bytes.
+
+   my $chars = pack("U0C*", 0x80, 0x42);
+
+Likewise, you can force the result to be bytes by using the special
+C<"C0"> prefix.
+
+=head2 Handling Unicode
+
+Handling Unicode is for the most part transparent: just use the
+strings as usual.  Functions like C<index()>, C<length()>, and
+C<substr()> will work on the Unicode characters; regular expressions
+will work on the Unicode characters (see L<perlunicode> and L<perlretut>).
+
+Note that Perl considers combining character sequences to be
+separate characters, so for example
+
+    use charnames ':full';
+    print length("\N{LATIN CAPITAL LETTER A}\N{COMBINING ACUTE ACCENT}"), "\n";
+
+will print 2, not 1.  The only exception is that regular expressions
+have C<\X> for matching a combining character sequence.
+
+Life is not quite so transparent, however, when working with legacy
+encodings, I/O, and certain special cases:
+
+=head2 Legacy Encodings
+
+When you combine legacy data and Unicode the legacy data needs
+to be upgraded to Unicode.  Normally ISO 8859-1 (or EBCDIC, if
+applicable) is assumed.  You can override this assumption by
+using the C<encoding> pragma, for example
+
+    use encoding 'latin2'; # ISO 8859-2
+
+in which case literals (string or regular expressions), C<chr()>,
+and C<ord()> in your whole script are assumed to produce Unicode
+characters from ISO 8859-2 code points.  Note that the matching for
+encoding names is forgiving: instead of C<latin2> you could have
+said C<Latin 2>, or C<iso8859-2>, or other variations.  With just
+
+    use encoding;
+
+the environment variable C<PERL_ENCODING> will be consulted.
+If that variable isn't set, the encoding pragma will fail.
+
+The C<Encode> module knows about many encodings and has interfaces
+for doing conversions between those encodings:
+
+    use Encode 'decode';
+    $data = decode("iso-8859-3", $data); # convert from legacy to utf-8
+
+=head2 Unicode I/O
+
+Normally, writing out Unicode data
+
+    print FH $some_string_with_unicode, "\n";
+
+produces raw bytes that Perl happens to use to internally encode the
+Unicode string.  Perl's internal encoding depends on the system as
+well as what characters happen to be in the string at the time. If
+any of the characters are at code points C<0x100> or above, you will get
+a warning.  To ensure that the output is explicitly rendered in the
+encoding you desire--and to avoid the warning--open the stream with
+the desired encoding. Some examples:
+
+    open FH, ">:utf8", "file";
+
+    open FH, ">:encoding(ucs2)",      "file";
+    open FH, ">:encoding(UTF-8)",     "file";
+    open FH, ">:encoding(shift_jis)", "file";
+
+and on already open streams, use C<binmode()>:
+
+    binmode(STDOUT, ":utf8");
+
+    binmode(STDOUT, ":encoding(ucs2)");
+    binmode(STDOUT, ":encoding(UTF-8)");
+    binmode(STDOUT, ":encoding(shift_jis)");
+
+The matching of encoding names is loose: case does not matter, and
+many encodings have several aliases.  Note that the C<:utf8> layer
+must always be specified exactly like that; it is I<not> subject to
+the loose matching of encoding names.
+
+See L<PerlIO> for the C<:utf8> layer, L<PerlIO::encoding> and
+L<Encode::PerlIO> for the C<:encoding()> layer, and
+L<Encode::Supported> for many encodings supported by the C<Encode>
+module.
+
+Reading in a file that you know happens to be encoded in one of the
+Unicode or legacy encodings does not magically turn the data into
+Unicode in Perl's eyes.  To do that, specify the appropriate
+layer when opening files
+
+    open(my $fh,'<:utf8', 'anything');
+    my $line_of_unicode = <$fh>;
+
+    open(my $fh,'<:encoding(Big5)', 'anything');
+    my $line_of_unicode = <$fh>;
+
+The I/O layers can also be specified more flexibly with
+the C<open> pragma.  See L<open>, or look at the following example.
+
+    use open ':utf8'; # input and output default layer will be UTF-8
+    open X, ">file";
+    print X chr(0x100), "\n";
+    close X;
+    open Y, "<file";
+    printf "%#x\n", ord(<Y>); # this should print 0x100
+    close Y;
+
+With the C<open> pragma you can use the C<:locale> layer
+
+    BEGIN { $ENV{LC_ALL} = $ENV{LANG} = 'ru_RU.KOI8-R' }
+    # the :locale will probe the locale environment variables like LC_ALL
+    use open OUT => ':locale'; # russki parusski
+    open(O, ">koi8");
+    print O chr(0x430); # Unicode CYRILLIC SMALL LETTER A = KOI8-R 0xc1
+    close O;
+    open(I, "<koi8");
+    printf "%#x\n", ord(<I>), "\n"; # this should print 0xc1
+    close I;
+
+or you can also use the C<':encoding(...)'> layer
+
+    open(my $epic,'<:encoding(iso-8859-7)','iliad.greek');
+    my $line_of_unicode = <$epic>;
+
+These methods install a transparent filter on the I/O stream that
+converts data from the specified encoding when it is read in from the
+stream.  The result is always Unicode.
+
+The L<open> pragma affects all the C<open()> calls after the pragma by
+setting default layers.  If you want to affect only certain
+streams, use explicit layers directly in the C<open()> call.
+
+You can switch encodings on an already opened stream by using
+C<binmode()>; see L<perlfunc/binmode>.
+
+The C<:locale> does not currently (as of Perl 5.8.0) work with
+C<open()> and C<binmode()>, only with the C<open> pragma.  The
+C<:utf8> and C<:encoding(...)> methods do work with all of C<open()>,
+C<binmode()>, and the C<open> pragma.
+
+Similarly, you may use these I/O layers on output streams to
+automatically convert Unicode to the specified encoding when it is
+written to the stream. For example, the following snippet copies the
+contents of the file "text.jis" (encoded as ISO-2022-JP, aka JIS) to
+the file "text.utf8", encoded as UTF-8:
+
+    open(my $nihongo, '<:encoding(iso-2022-jp)', 'text.jis');
+    open(my $unicode, '>:utf8',                  'text.utf8');
+    while (<$nihongo>) { print $unicode $_ }
+
+The naming of encodings, both by the C<open()> and by the C<open>
+pragma, is similar to the C<encoding> pragma in that it allows for
+flexible names: C<koi8-r> and C<KOI8R> will both be understood.
+
+Common encodings recognized by ISO, MIME, IANA, and various other
+standardisation organisations are recognised; for a more detailed
+list see L<Encode::Supported>.
+
+C<read()> reads characters and returns the number of characters.
+C<seek()> and C<tell()> operate on byte counts, as do C<sysread()>
+and C<sysseek()>.
+
+Notice that because of the default behaviour of not doing any
+conversion upon input if there is no default layer,
+it is easy to mistakenly write code that keeps on expanding a file
+by repeatedly encoding the data:
+
+    # BAD CODE WARNING
+    open F, "file";
+    local $/; ## read in the whole file of 8-bit characters
+    $t = <F>;
+    close F;
+    open F, ">:utf8", "file";
+    print F $t; ## convert to UTF-8 on output
+    close F;
+
+If you run this code twice, the contents of the F<file> will be twice
+UTF-8 encoded.  A C<use open ':utf8'> would have avoided the bug, or
+explicitly opening also the F<file> for input as UTF-8.
+
+B<NOTE>: the C<:utf8> and C<:encoding> features work only if your
+Perl has been built with the new PerlIO feature (which is the default
+on most systems).
+
+=head2 Displaying Unicode As Text
+
+Sometimes you might want to display Perl scalars containing Unicode as
+simple ASCII (or EBCDIC) text.  The following subroutine converts
+its argument so that Unicode characters with code points greater than
+255 are displayed as C<\x{...}>, control characters (like C<\n>) are
+displayed as C<\x..>, and the rest of the characters as themselves:
+
+   sub nice_string {
+       join("",
+         map { $_ > 255 ?                  # if wide character...
+               sprintf("\\x{%04X}", $_) :  # \x{...}
+               chr($_) =~ /[[:cntrl:]]/ ?  # else if control character ...
+               sprintf("\\x%02X", $_) :    # \x..
+               quotemeta(chr($_))          # else quoted or as themselves
+         } unpack("U*", $_[0]));           # unpack Unicode characters
+   }
+
+For example,
+
+   nice_string("foo\x{100}bar\n")
+
+returns the string
+
+   'foo\x{0100}bar\x0A'
+
+which is ready to be printed.
+
+=head2 Special Cases
+
+=over 4
+
+=item *
+
+Bit Complement Operator ~ And vec()
+
+The bit complement operator C<~> may produce surprising results if
+used on strings containing characters with ordinal values above
+255. In such a case, the results are consistent with the internal
+encoding of the characters, but not with much else. So don't do
+that. Similarly for C<vec()>: you will be operating on the
+internally-encoded bit patterns of the Unicode characters, not on
+the code point values, which is very probably not what you want.
+
+=item *
+
+Peeking At Perl's Internal Encoding
+
+Normal users of Perl should never care how Perl encodes any particular
+Unicode string (because the normal ways to get at the contents of a
+string with Unicode--via input and output--should always be via
+explicitly-defined I/O layers). But if you must, there are two
+ways of looking behind the scenes.
+
+One way of peeking inside the internal encoding of Unicode characters
+is to use C<unpack("C*", ...> to get the bytes or C<unpack("H*", ...)>
+to display the bytes:
+
+    # this prints  c4 80  for the UTF-8 bytes 0xc4 0x80
+    print join(" ", unpack("H*", pack("U", 0x100))), "\n";
+
+Yet another way would be to use the Devel::Peek module:
+
+    perl -MDevel::Peek -e 'Dump(chr(0x100))'
+
+That shows the C<UTF8> flag in FLAGS and both the UTF-8 bytes
+and Unicode characters in C<PV>.  See also later in this document
+the discussion about the C<utf8::is_utf8()> function.
+
+=back
+
+=head2 Advanced Topics
+
+=over 4
+
+=item *
+
+String Equivalence
+
+The question of string equivalence turns somewhat complicated
+in Unicode: what do you mean by "equal"?
+
+(Is C<LATIN CAPITAL LETTER A WITH ACUTE> equal to
+C<LATIN CAPITAL LETTER A>?)
+
+The short answer is that by default Perl compares equivalence (C<eq>,
+C<ne>) based only on code points of the characters.  In the above
+case, the answer is no (because 0x00C1 != 0x0041).  But sometimes, any
+CAPITAL LETTER As should be considered equal, or even As of any case.
+
+The long answer is that you need to consider character normalization
+and casing issues: see L<Unicode::Normalize>, Unicode Technical
+Reports #15 and #21, I<Unicode Normalization Forms> and I<Case
+Mappings>, http://www.unicode.org/unicode/reports/tr15/ and 
+http://www.unicode.org/unicode/reports/tr21/ 
+
+As of Perl 5.8.0, the "Full" case-folding of I<Case
+Mappings/SpecialCasing> is implemented.
+
+=item *
+
+String Collation
+
+People like to see their strings nicely sorted--or as Unicode
+parlance goes, collated.  But again, what do you mean by collate?
+
+(Does C<LATIN CAPITAL LETTER A WITH ACUTE> come before or after
+C<LATIN CAPITAL LETTER A WITH GRAVE>?)
+
+The short answer is that by default, Perl compares strings (C<lt>,
+C<le>, C<cmp>, C<ge>, C<gt>) based only on the code points of the
+characters.  In the above case, the answer is "after", since
+C<0x00C1> > C<0x00C0>.
+
+The long answer is that "it depends", and a good answer cannot be
+given without knowing (at the very least) the language context.
+See L<Unicode::Collate>, and I<Unicode Collation Algorithm>
+http://www.unicode.org/unicode/reports/tr10/
+
+=back
+
+=head2 Miscellaneous
+
+=over 4
+
+=item *
+
+Character Ranges and Classes
+
+Character ranges in regular expression character classes (C</[a-z]/>)
+and in the C<tr///> (also known as C<y///>) operator are not magically
+Unicode-aware.  What this means that C<[A-Za-z]> will not magically start
+to mean "all alphabetic letters"; not that it does mean that even for
+8-bit characters, you should be using C</[[:alpha:]]/> in that case.
+
+For specifying character classes like that in regular expressions,
+you can use the various Unicode properties--C<\pL>, or perhaps
+C<\p{Alphabetic}>, in this particular case.  You can use Unicode
+code points as the end points of character ranges, but there is no
+magic associated with specifying a certain range.  For further
+information--there are dozens of Unicode character classes--see
+L<perlunicode>.
+
+=item *
+
+String-To-Number Conversions
+
+Unicode does define several other decimal--and numeric--characters
+besides the familiar 0 to 9, such as the Arabic and Indic digits.
+Perl does not support string-to-number conversion for digits other
+than ASCII 0 to 9 (and ASCII a to f for hexadecimal).
+
+=back
+
+=head2 Questions With Answers
+
+=over 4
+
+=item *
+
+Will My Old Scripts Break?
+
+Very probably not.  Unless you are generating Unicode characters
+somehow, old behaviour should be preserved.  About the only behaviour
+that has changed and which could start generating Unicode is the old
+behaviour of C<chr()> where supplying an argument more than 255
+produced a character modulo 255.  C<chr(300)>, for example, was equal
+to C<chr(45)> or "-" (in ASCII), now it is LATIN CAPITAL LETTER I WITH
+BREVE.
+
+=item *
+
+How Do I Make My Scripts Work With Unicode?
+
+Very little work should be needed since nothing changes until you
+generate Unicode data.  The most important thing is getting input as
+Unicode; for that, see the earlier I/O discussion.
+
+=item *
+
+How Do I Know Whether My String Is In Unicode?
+
+You shouldn't care.  No, you really shouldn't.  No, really.  If you
+have to care--beyond the cases described above--it means that we
+didn't get the transparency of Unicode quite right.
+
+Okay, if you insist:
+
+    print utf8::is_utf8($string) ? 1 : 0, "\n";
+
+But note that this doesn't mean that any of the characters in the
+string are necessary UTF-8 encoded, or that any of the characters have
+code points greater than 0xFF (255) or even 0x80 (128), or that the
+string has any characters at all.  All the C<is_utf8()> does is to
+return the value of the internal "utf8ness" flag attached to the
+C<$string>.  If the flag is off, the bytes in the scalar are interpreted
+as a single byte encoding.  If the flag is on, the bytes in the scalar
+are interpreted as the (multi-byte, variable-length) UTF-8 encoded code
+points of the characters.  Bytes added to an UTF-8 encoded string are
+automatically upgraded to UTF-8.  If mixed non-UTF-8 and UTF-8 scalars
+are merged (double-quoted interpolation, explicit concatenation, and
+printf/sprintf parameter substitution), the result will be UTF-8 encoded
+as if copies of the byte strings were upgraded to UTF-8: for example,
+
+    $a = "ab\x80c";
+    $b = "\x{100}";
+    print "$a = $b\n";
+
+the output string will be UTF-8-encoded C<ab\x80c = \x{100}\n>, but
+C<$a> will stay byte-encoded.
+
+Sometimes you might really need to know the byte length of a string
+instead of the character length. For that use either the
+C<Encode::encode_utf8()> function or the C<bytes> pragma and its only
+defined function C<length()>:
+
+    my $unicode = chr(0x100);
+    print length($unicode), "\n"; # will print 1
+    require Encode;
+    print length(Encode::encode_utf8($unicode)), "\n"; # will print 2
+    use bytes;
+    print length($unicode), "\n"; # will also print 2
+                                  # (the 0xC4 0x80 of the UTF-8)
+
+=item *
+
+How Do I Detect Data That's Not Valid In a Particular Encoding?
+
+Use the C<Encode> package to try converting it.
+For example,
+
+    use Encode 'decode_utf8';
+    if (decode_utf8($string_of_bytes_that_I_think_is_utf8)) {
+        # valid
+    } else {
+        # invalid
+    }
+
+For UTF-8 only, you can use:
+
+    use warnings;
+    @chars = unpack("U0U*", $string_of_bytes_that_I_think_is_utf8);
+
+If invalid, a C<Malformed UTF-8 character (byte 0x##) in unpack>
+warning is produced. The "U0" means "expect strictly UTF-8 encoded
+Unicode".  Without that the C<unpack("U*", ...)> would accept also
+data like C<chr(0xFF>), similarly to the C<pack> as we saw earlier.
+
+=item *
+
+How Do I Convert Binary Data Into a Particular Encoding, Or Vice Versa?
+
+This probably isn't as useful as you might think.
+Normally, you shouldn't need to.
+
+In one sense, what you are asking doesn't make much sense: encodings
+are for characters, and binary data are not "characters", so converting
+"data" into some encoding isn't meaningful unless you know in what
+character set and encoding the binary data is in, in which case it's
+not just binary data, now is it?
+
+If you have a raw sequence of bytes that you know should be
+interpreted via a particular encoding, you can use C<Encode>:
+
+    use Encode 'from_to';
+    from_to($data, "iso-8859-1", "utf-8"); # from latin-1 to utf-8
+
+The call to C<from_to()> changes the bytes in C<$data>, but nothing
+material about the nature of the string has changed as far as Perl is
+concerned.  Both before and after the call, the string C<$data>
+contains just a bunch of 8-bit bytes. As far as Perl is concerned,
+the encoding of the string remains as "system-native 8-bit bytes".
+
+You might relate this to a fictional 'Translate' module:
+
+   use Translate;
+   my $phrase = "Yes";
+   Translate::from_to($phrase, 'english', 'deutsch');
+   ## phrase now contains "Ja"
+
+The contents of the string changes, but not the nature of the string.
+Perl doesn't know any more after the call than before that the
+contents of the string indicates the affirmative.
+
+Back to converting data.  If you have (or want) data in your system's
+native 8-bit encoding (e.g. Latin-1, EBCDIC, etc.), you can use
+pack/unpack to convert to/from Unicode.
+
+    $native_string  = pack("C*", unpack("U*", $Unicode_string));
+    $Unicode_string = pack("U*", unpack("C*", $native_string));
+
+If you have a sequence of bytes you B<know> is valid UTF-8,
+but Perl doesn't know it yet, you can make Perl a believer, too:
+
+    use Encode 'decode_utf8';
+    $Unicode = decode_utf8($bytes);
+
+You can convert well-formed UTF-8 to a sequence of bytes, but if
+you just want to convert random binary data into UTF-8, you can't.
+B<Any random collection of bytes isn't well-formed UTF-8>.  You can
+use C<unpack("C*", $string)> for the former, and you can create
+well-formed Unicode data by C<pack("U*", 0xff, ...)>.
+
+=item *
+
+How Do I Display Unicode?  How Do I Input Unicode?
+
+See http://www.alanwood.net/unicode/ and
+http://www.cl.cam.ac.uk/~mgk25/unicode.html
+
+=item *
+
+How Does Unicode Work With Traditional Locales?
+
+In Perl, not very well.  Avoid using locales through the C<locale>
+pragma.  Use only one or the other.  But see L<perlrun> for the
+description of the C<-C> switch and its environment counterpart,
+C<$ENV{PERL_UNICODE}> to see how to enable various Unicode features,
+for example by using locale settings.
+
+=back
+
+=head2 Hexadecimal Notation
+
+The Unicode standard prefers using hexadecimal notation because
+that more clearly shows the division of Unicode into blocks of 256 characters.
+Hexadecimal is also simply shorter than decimal.  You can use decimal
+notation, too, but learning to use hexadecimal just makes life easier
+with the Unicode standard.  The C<U+HHHH> notation uses hexadecimal,
+for example.
+
+The C<0x> prefix means a hexadecimal number, the digits are 0-9 I<and>
+a-f (or A-F, case doesn't matter).  Each hexadecimal digit represents
+four bits, or half a byte.  C<print 0x..., "\n"> will show a
+hexadecimal number in decimal, and C<printf "%x\n", $decimal> will
+show a decimal number in hexadecimal.  If you have just the
+"hex digits" of a hexadecimal number, you can use the C<hex()> function.
+
+    print 0x0009, "\n";    # 9
+    print 0x000a, "\n";    # 10
+    print 0x000f, "\n";    # 15
+    print 0x0010, "\n";    # 16
+    print 0x0011, "\n";    # 17
+    print 0x0100, "\n";    # 256
+
+    print 0x0041, "\n";    # 65
+
+    printf "%x\n",  65;    # 41
+    printf "%#x\n", 65;    # 0x41
+
+    print hex("41"), "\n"; # 65
+
+=head2 Further Resources
+
+=over 4
+
+=item *
+
+Unicode Consortium
+
+    http://www.unicode.org/
+
+=item *
+
+Unicode FAQ
+
+    http://www.unicode.org/unicode/faq/
+
+=item *
+
+Unicode Glossary
+
+    http://www.unicode.org/glossary/
+
+=item *
+
+Unicode Useful Resources
+
+    http://www.unicode.org/unicode/onlinedat/resources.html
+
+=item *
+
+Unicode and Multilingual Support in HTML, Fonts, Web Browsers and Other Applications
+
+    http://www.alanwood.net/unicode/
+
+=item *
+
+UTF-8 and Unicode FAQ for Unix/Linux
+
+    http://www.cl.cam.ac.uk/~mgk25/unicode.html
+
+=item *
+
+Legacy Character Sets
+
+    http://www.czyborra.com/
+    http://www.eki.ee/letter/
+
+=item *
+
+The Unicode support files live within the Perl installation in the
+directory
+
+    $Config{installprivlib}/unicore
+
+in Perl 5.8.0 or newer, and 
+
+    $Config{installprivlib}/unicode
+
+in the Perl 5.6 series.  (The renaming to F<lib/unicore> was done to
+avoid naming conflicts with lib/Unicode in case-insensitive filesystems.)
+The main Unicode data file is F<UnicodeData.txt> (or F<Unicode.301> in
+Perl 5.6.1.)  You can find the C<$Config{installprivlib}> by
+
+    perl "-V:installprivlib"
+
+You can explore various information from the Unicode data files using
+the C<Unicode::UCD> module.
+
+=back
+
+=head1 UNICODE IN OLDER PERLS
+
+If you cannot upgrade your Perl to 5.8.0 or later, you can still
+do some Unicode processing by using the modules C<Unicode::String>,
+C<Unicode::Map8>, and C<Unicode::Map>, available from CPAN.
+If you have the GNU recode installed, you can also use the
+Perl front-end C<Convert::Recode> for character conversions.
+
+The following are fast conversions from ISO 8859-1 (Latin-1) bytes
+to UTF-8 bytes and back, the code works even with older Perl 5 versions.
+
+    # ISO 8859-1 to UTF-8
+    s/([\x80-\xFF])/chr(0xC0|ord($1)>>6).chr(0x80|ord($1)&0x3F)/eg;
+
+    # UTF-8 to ISO 8859-1
+    s/([\xC2\xC3])([\x80-\xBF])/chr(ord($1)<<6&0xC0|ord($2)&0x3F)/eg;
+
+=head1 SEE ALSO
+
+L<perlunicode>, L<Encode>, L<encoding>, L<open>, L<utf8>, L<bytes>,
+L<perlretut>, L<perlrun>, L<Unicode::Collate>, L<Unicode::Normalize>,
+L<Unicode::UCD>
+
+=head1 ACKNOWLEDGMENTS
+
+Thanks to the kind readers of the perl5-porters@perl.org,
+perl-unicode@perl.org, linux-utf8@nl.linux.org, and unicore@unicode.org
+mailing lists for their valuable feedback.
+
+=head1 AUTHOR, COPYRIGHT, AND LICENSE
+
+Copyright 2001-2002 Jarkko Hietaniemi E<lt>jhi@iki.fiE<gt>
+
+This document may be distributed under the same terms as Perl itself.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlutil.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlutil.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlutil.pod	(revision 14489)
@@ -0,0 +1,195 @@
+=head1 NAME
+
+perlutil - utilities packaged with the Perl distribution
+
+=head1 DESCRIPTION
+
+Along with the Perl interpreter itself, the Perl distribution installs a
+range of utilities on your system. There are also several utilities
+which are used by the Perl distribution itself as part of the install
+process. This document exists to list all of these utilities, explain
+what they are for and provide pointers to each module's documentation,
+if appropriate.
+
+=head2 DOCUMENTATION
+
+=over 3
+
+=item L<perldoc|perldoc>
+
+The main interface to Perl's documentation is C<perldoc>, although
+if you're reading this, it's more than likely that you've already found
+it. F<perldoc> will extract and format the documentation from any file
+in the current directory, any Perl module installed on the system, or
+any of the standard documentation pages, such as this one. Use 
+C<perldoc E<lt>nameE<gt>> to get information on any of the utilities
+described in this document.
+
+=item L<pod2man|pod2man> and L<pod2text|pod2text>
+
+If it's run from a terminal, F<perldoc> will usually call F<pod2man> to
+translate POD (Plain Old Documentation - see L<perlpod> for an
+explanation) into a manpage, and then run F<man> to display it; if
+F<man> isn't available, F<pod2text> will be used instead and the output
+piped through your favourite pager.
+
+=item L<pod2html|pod2html> and L<pod2latex|pod2latex>
+
+As well as these two, there are two other converters: F<pod2html> will
+produce HTML pages from POD, and F<pod2latex>, which produces LaTeX
+files.
+
+=item L<pod2usage|pod2usage>
+
+If you just want to know how to use the utilities described here,
+F<pod2usage> will just extract the "USAGE" section; some of
+the utilities will automatically call F<pod2usage> on themselves when
+you call them with C<-help>.
+
+=item L<podselect|podselect>
+
+F<pod2usage> is a special case of F<podselect>, a utility to extract
+named sections from documents written in POD. For instance, while
+utilities have "USAGE" sections, Perl modules usually have "SYNOPSIS"
+sections: C<podselect -s "SYNOPSIS" ...> will extract this section for
+a given file.
+
+=item L<podchecker|podchecker>
+
+If you're writing your own documentation in POD, the F<podchecker>
+utility will look for errors in your markup.
+
+=item L<splain|splain>
+
+F<splain> is an interface to L<perldiag> - paste in your error message
+to it, and it'll explain it for you.
+
+=item L<roffitall|roffitall>
+
+The C<roffitall> utility is not installed on your system but lives in
+the F<pod/> directory of your Perl source kit; it converts all the
+documentation from the distribution to F<*roff> format, and produces a
+typeset PostScript or text file of the whole lot.
+
+=back
+
+=head2 CONVERTORS
+
+To help you convert legacy programs to Perl, we've included three
+conversion filters:
+
+=over 3
+
+=item L<a2p|a2p>
+
+F<a2p> converts F<awk> scripts to Perl programs; for example, C<a2p -F:>
+on the simple F<awk> script C<{print $2}> will produce a Perl program
+based around this code:
+
+    while (<>) {
+        ($Fld1,$Fld2) = split(/[:\n]/, $_, 9999);
+        print $Fld2;
+    }
+
+=item L<s2p|s2p>
+
+Similarly, F<s2p> converts F<sed> scripts to Perl programs. F<s2p> run
+on C<s/foo/bar> will produce a Perl program based around this:
+
+    while (<>) {
+        chomp;
+        s/foo/bar/g;
+        print if $printit;
+    }
+
+=item L<find2perl|find2perl>
+
+Finally, F<find2perl> translates C<find> commands to Perl equivalents which 
+use the L<File::Find|File::Find> module. As an example, 
+C<find2perl . -user root -perm 4000 -print> produces the following callback
+subroutine for C<File::Find>:
+
+    sub wanted {
+        my ($dev,$ino,$mode,$nlink,$uid,$gid);
+        (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
+        $uid == $uid{'root'}) &&
+        (($mode & 0777) == 04000);
+        print("$name\n");
+    }
+
+=back
+
+As well as these filters for converting other languages, the
+L<pl2pm|pl2pm> utility will help you convert old-style Perl 4 libraries to 
+new-style Perl5 modules.
+
+=head2 Administration
+
+=over 3
+
+=item L<libnetcfg|libnetcfg>
+
+To display and change the libnet configuration run the libnetcfg command.
+
+=back
+
+=head2 Development
+
+There are a set of utilities which help you in developing Perl programs, 
+and in particular, extending Perl with C.
+
+=over 3
+
+=item L<perlbug|perlbug>
+
+F<perlbug> is the recommended way to report bugs in the perl interpreter
+itself or any of the standard library modules back to the developers;
+please read through the documentation for F<perlbug> thoroughly before
+using it to submit a bug report.
+
+=item L<h2ph|h2ph>
+
+Back before Perl had the XS system for connecting with C libraries,
+programmers used to get library constants by reading through the C
+header files. You may still see C<require 'syscall.ph'> or similar
+around - the F<.ph> file should be created by running F<h2ph> on the
+corresponding F<.h> file. See the F<h2ph> documentation for more on how
+to convert a whole bunch of header files at once.
+
+=item L<c2ph|c2ph> and L<pstruct|pstruct>
+
+F<c2ph> and F<pstruct>, which are actually the same program but behave
+differently depending on how they are called, provide another way of
+getting at C with Perl - they'll convert C structures and union declarations
+to Perl code. This is deprecated in favour of F<h2xs> these days.
+
+=item L<h2xs|h2xs>
+
+F<h2xs> converts C header files into XS modules, and will try and write
+as much glue between C libraries and Perl modules as it can. It's also
+very useful for creating skeletons of pure Perl modules.
+
+=item L<dprofpp|dprofpp>
+
+Perl comes with a profiler, the F<Devel::DProf> module. The
+F<dprofpp> utility analyzes the output of this profiler and tells you
+which subroutines are taking up the most run time. See L<Devel::DProf>
+for more information.
+
+=item L<perlcc|perlcc>
+
+F<perlcc> is the interface to the experimental Perl compiler suite.
+
+=back
+
+=head2 SEE ALSO
+
+L<perldoc|perldoc>, L<pod2man|pod2man>, L<perlpod>,
+L<pod2html|pod2html>, L<pod2usage|pod2usage>, L<podselect|podselect>,
+L<podchecker|podchecker>, L<splain|splain>, L<perldiag>,
+L<roffitall|roffitall>, L<a2p|a2p>, L<s2p|s2p>, L<find2perl|find2perl>,
+L<File::Find|File::Find>, L<pl2pm|pl2pm>, L<perlbug|perlbug>,
+L<h2ph|h2ph>, L<c2ph|c2ph>, L<h2xs|h2xs>, L<dprofpp|dprofpp>,
+L<Devel::DProf>, L<perlcc|perlcc>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perluts.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perluts.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perluts.pod	(revision 14489)
@@ -0,0 +1,107 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perluts - Perl under UTS
+
+=head1 SYNOPSIS
+
+This document can be read I<as is>: as F<README.uts>, or you
+can read it after you build your package using "man perluts".
+
+The purpose is to help you build Perl for UTS, which, if you
+follow these instructions, should be easy, and result in
+a solidly working installation.
+
+=head1 DESCRIPTION
+
+Perl 5.7.2 (Developmental) or Perl 5.8.x (forthcoming) for UTS
+
+=head1 BUILDING PERL ON UTS
+
+NOTE: Some sites have redefined the way uname works, and if yours
+does this, special steps must be taken so that Configure can
+recognize your system as a UTS system.  To see if you are in
+this category, issue the command "uname -a".  It should look
+something like:
+
+  uts juno 4 4.4 9672 370
+
+At any rate, the first field should be "uts".  If this is not
+the case; supposing it is, say telcoUTS, create a script, uts/uname
+(i.e. uname, in the subdirectory "uts" of the main Perl source dir):
+   # uname
+   /usr/bin/uname "$@" | sed -e 's/^telcoUTS/uts/'
+
+and when you execute Configure, do it as below, except for adding
+PATH=uts:$PATH as a prefix.  I.e. do:
+
+   PATH=uts:$PATH ./Configure ...
+
+There is no need to do an interactive configure, just type
+
+  ./Configure -de [-Dusedevel] [-Doptimize=-g ] 2>&1 | tee Conf.out
+
+"-Dusedevel" may be required to configure Perl 5.7.2 non-interactively.
+Use -Doptimize=-g if you want to run Perl under sdb or gdb, OR
+if you want to be able to use the -D command line flags to perl,
+which are occasionally useful in debugging perl scripts.
+
+In this and the following steps, the "2>&1 | tee XXX.out" records all
+output from the process, which will be useful if anything unexpected
+goes wrong.
+
+Then do the compilation with
+
+  make 2>&1 | tee make.out
+
+Finally, test using
+
+  make test 2>&1 | tee make-test.out
+
+In the output, the only failures you should see should look like:
+
+   lib/Math/BigInt/t/bigfltpm.........Use of uninitialized value ...
+   FAILED at test 57
+   lib/Math/BigInt/t/bigintc..........ok
+   lib/Math/BigInt/t/bigintpm.........FAILED at test 204
+   lib/Math/BigInt/t/mbimbf...........Use of uninitialized value ...
+   Illegal division by zero at ../lib/Math/BigInt/Calc.pm line 314.
+   FAILED at test 71
+   lib/Math/Complex...................exp: OVERFLOW
+   FAILED at test 250
+   lib/Math/Trig......................exp: OVERFLOW
+   ok
+   lib/Memoize/t/array................ok
+   	...
+   lib/Net/protoent...................ok
+   lib/Net/servent....................FAILED at test 0
+
+This means that everything passes except for some problems in the
+packages "Math::BigInt", "Math::Complex", and "Math::Trig".
+The lib/Net/servent failure seems to be a bug in the test
+program.  To confirm this, from the main Perl source dir, do:
+
+   LD_LIBRARY_PATH=`pwd` ./perl -Ilib lib/Net/servent.t
+
+and it should output
+
+   1..3
+   ok 1
+   ok 2
+   ok 3
+
+=head1 Installing the built perl on UTS
+
+Run the command "make install"
+
+=head1 AUTHOR
+
+   Hal Morris
+   UTS Global LLC
+   email: hom00@utsglobal.com
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvar.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvar.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvar.pod	(revision 14489)
@@ -0,0 +1,1532 @@
+=head1 NAME
+
+perlvar - Perl predefined variables
+
+=head1 DESCRIPTION
+
+=head2 Predefined Names
+
+The following names have special meaning to Perl.  Most 
+punctuation names have reasonable mnemonics, or analogs in the
+shells.  Nevertheless, if you wish to use long variable names,
+you need only say
+
+    use English;
+
+at the top of your program. This aliases all the short names to the long
+names in the current package. Some even have medium names, generally
+borrowed from B<awk>. In general, it's best to use the
+
+    use English '-no_match_vars';
+
+invocation if you don't need $PREMATCH, $MATCH, or $POSTMATCH, as it avoids
+a certain performance hit with the use of regular expressions. See
+L<English>.
+
+Variables that depend on the currently selected filehandle may be set by
+calling an appropriate object method on the IO::Handle object, although
+this is less efficient than using the regular built-in variables. (Summary
+lines below for this contain the word HANDLE.) First you must say
+
+    use IO::Handle;
+
+after which you may use either
+
+    method HANDLE EXPR
+
+or more safely,
+
+    HANDLE->method(EXPR)
+
+Each method returns the old value of the IO::Handle attribute.
+The methods each take an optional EXPR, which, if supplied, specifies the
+new value for the IO::Handle attribute in question.  If not supplied,
+most methods do nothing to the current value--except for
+autoflush(), which will assume a 1 for you, just to be different.
+
+Because loading in the IO::Handle class is an expensive operation, you should
+learn how to use the regular built-in variables.
+
+A few of these variables are considered "read-only".  This means that if
+you try to assign to this variable, either directly or indirectly through
+a reference, you'll raise a run-time exception.
+
+You should be very careful when modifying the default values of most
+special variables described in this document. In most cases you want
+to localize these variables before changing them, since if you don't,
+the change may affect other modules which rely on the default values
+of the special variables that you have changed. This is one of the
+correct ways to read the whole file at once:
+
+    open my $fh, "foo" or die $!;
+    local $/; # enable localized slurp mode
+    my $content = <$fh>;
+    close $fh;
+
+But the following code is quite bad:
+
+    open my $fh, "foo" or die $!;
+    undef $/; # enable slurp mode
+    my $content = <$fh>;
+    close $fh;
+
+since some other module, may want to read data from some file in the
+default "line mode", so if the code we have just presented has been
+executed, the global value of C<$/> is now changed for any other code
+running inside the same Perl interpreter.
+
+Usually when a variable is localized you want to make sure that this
+change affects the shortest scope possible. So unless you are already
+inside some short C<{}> block, you should create one yourself. For
+example:
+
+    my $content = '';
+    open my $fh, "foo" or die $!;
+    {
+        local $/;
+        $content = <$fh>;
+    }
+    close $fh;
+
+Here is an example of how your own code can go broken:
+
+    for (1..5){
+        nasty_break();
+        print "$_ ";
+    }
+    sub nasty_break {
+        $_ = 5;
+        # do something with $_
+    }
+
+You probably expect this code to print:
+
+    1 2 3 4 5
+
+but instead you get:
+
+    5 5 5 5 5
+
+Why? Because nasty_break() modifies C<$_> without localizing it
+first. The fix is to add local():
+
+        local $_ = 5;
+
+It's easy to notice the problem in such a short example, but in more
+complicated code you are looking for trouble if you don't localize
+changes to the special variables.
+
+The following list is ordered by scalar variables first, then the
+arrays, then the hashes.
+
+=over 8
+
+=item $ARG
+
+=item $_
+
+The default input and pattern-searching space.  The following pairs are
+equivalent:
+
+    while (<>) {...}	# equivalent only in while!
+    while (defined($_ = <>)) {...}
+
+    /^Subject:/
+    $_ =~ /^Subject:/
+
+    tr/a-z/A-Z/
+    $_ =~ tr/a-z/A-Z/
+
+    chomp
+    chomp($_)
+
+Here are the places where Perl will assume $_ even if you
+don't use it:
+
+=over 3
+
+=item *
+
+Various unary functions, including functions like ord() and int(), as well
+as the all file tests (C<-f>, C<-d>) except for C<-t>, which defaults to
+STDIN.
+
+=item *
+
+Various list functions like print() and unlink().
+
+=item *
+
+The pattern matching operations C<m//>, C<s///>, and C<tr///> when used
+without an C<=~> operator.
+
+=item *
+
+The default iterator variable in a C<foreach> loop if no other
+variable is supplied.
+
+=item *
+
+The implicit iterator variable in the grep() and map() functions.
+
+=item *
+
+The default place to put an input record when a C<< <FH> >>
+operation's result is tested by itself as the sole criterion of a C<while>
+test.  Outside a C<while> test, this will not happen.
+
+=back
+
+(Mnemonic: underline is understood in certain operations.)
+
+=back
+
+=over 8
+
+=item $a
+
+=item $b
+
+Special package variables when using sort(), see L<perlfunc/sort>.
+Because of this specialness $a and $b don't need to be declared
+(using use vars, or our()) even when using the C<strict 'vars'> pragma.
+Don't lexicalize them with C<my $a> or C<my $b> if you want to be
+able to use them in the sort() comparison block or function.
+
+=back
+
+=over 8
+
+=item $<I<digits>>
+
+Contains the subpattern from the corresponding set of capturing
+parentheses from the last pattern match, not counting patterns
+matched in nested blocks that have been exited already.  (Mnemonic:
+like \digits.)  These variables are all read-only and dynamically
+scoped to the current BLOCK.
+
+=item $MATCH
+
+=item $&
+
+The string matched by the last successful pattern match (not counting
+any matches hidden within a BLOCK or eval() enclosed by the current
+BLOCK).  (Mnemonic: like & in some editors.)  This variable is read-only
+and dynamically scoped to the current BLOCK.
+
+The use of this variable anywhere in a program imposes a considerable
+performance penalty on all regular expression matches.  See L</BUGS>.
+
+=item $PREMATCH
+
+=item $`
+
+The string preceding whatever was matched by the last successful
+pattern match (not counting any matches hidden within a BLOCK or eval
+enclosed by the current BLOCK).  (Mnemonic: C<`> often precedes a quoted
+string.)  This variable is read-only.
+
+The use of this variable anywhere in a program imposes a considerable
+performance penalty on all regular expression matches.  See L</BUGS>.
+
+=item $POSTMATCH
+
+=item $'
+
+The string following whatever was matched by the last successful
+pattern match (not counting any matches hidden within a BLOCK or eval()
+enclosed by the current BLOCK).  (Mnemonic: C<'> often follows a quoted
+string.)  Example:
+
+    local $_ = 'abcdefghi';
+    /def/;
+    print "$`:$&:$'\n";  	# prints abc:def:ghi
+
+This variable is read-only and dynamically scoped to the current BLOCK.
+
+The use of this variable anywhere in a program imposes a considerable
+performance penalty on all regular expression matches.  See L</BUGS>.
+
+=item $LAST_PAREN_MATCH
+
+=item $+
+
+The text matched by the last bracket of the last successful search pattern.
+This is useful if you don't know which one of a set of alternative patterns
+matched. For example:
+
+    /Version: (.*)|Revision: (.*)/ && ($rev = $+);
+
+(Mnemonic: be positive and forward looking.)
+This variable is read-only and dynamically scoped to the current BLOCK.
+
+=item $^N
+
+The text matched by the used group most-recently closed (i.e. the group
+with the rightmost closing parenthesis) of the last successful search
+pattern.  (Mnemonic: the (possibly) Nested parenthesis that most
+recently closed.)
+
+This is primarily used inside C<(?{...})> blocks for examining text
+recently matched. For example, to effectively capture text to a variable
+(in addition to C<$1>, C<$2>, etc.), replace C<(...)> with
+
+     (?:(...)(?{ $var = $^N }))
+
+By setting and then using C<$var> in this way relieves you from having to
+worry about exactly which numbered set of parentheses they are.
+
+This variable is dynamically scoped to the current BLOCK.
+
+=item @LAST_MATCH_END
+
+=item @+
+
+This array holds the offsets of the ends of the last successful
+submatches in the currently active dynamic scope.  C<$+[0]> is
+the offset into the string of the end of the entire match.  This
+is the same value as what the C<pos> function returns when called
+on the variable that was matched against.  The I<n>th element
+of this array holds the offset of the I<n>th submatch, so
+C<$+[1]> is the offset past where $1 ends, C<$+[2]> the offset
+past where $2 ends, and so on.  You can use C<$#+> to determine
+how many subgroups were in the last successful match.  See the
+examples given for the C<@-> variable.
+
+=item $*
+
+Set to a non-zero integer value to do multi-line matching within a
+string, 0 (or undefined) to tell Perl that it can assume that strings
+contain a single line, for the purpose of optimizing pattern matches.
+Pattern matches on strings containing multiple newlines can produce
+confusing results when C<$*> is 0 or undefined. Default is undefined.
+(Mnemonic: * matches multiple things.) This variable influences the
+interpretation of only C<^> and C<$>. A literal newline can be searched
+for even when C<$* == 0>.
+
+Use of C<$*> is deprecated in modern Perl, supplanted by 
+the C</s> and C</m> modifiers on pattern matching.
+
+Assigning a non-numerical value to C<$*> triggers a warning (and makes
+C<$*> act if C<$* == 0>), while assigning a numerical value to C<$*>
+makes that an implicit C<int> is applied on the value.
+
+=item HANDLE->input_line_number(EXPR)
+
+=item $INPUT_LINE_NUMBER
+
+=item $NR
+
+=item $.
+
+Current line number for the last filehandle accessed. 
+
+Each filehandle in Perl counts the number of lines that have been read
+from it.  (Depending on the value of C<$/>, Perl's idea of what
+constitutes a line may not match yours.)  When a line is read from a
+filehandle (via readline() or C<< <> >>), or when tell() or seek() is
+called on it, C<$.> becomes an alias to the line counter for that
+filehandle.
+
+You can adjust the counter by assigning to C<$.>, but this will not
+actually move the seek pointer.  I<Localizing C<$.> will not localize
+the filehandle's line count>.  Instead, it will localize perl's notion
+of which filehandle C<$.> is currently aliased to.
+
+C<$.> is reset when the filehandle is closed, but B<not> when an open
+filehandle is reopened without an intervening close().  For more
+details, see L<perlop/"IE<sol>O Operators">.  Because C<< <> >> never does
+an explicit close, line numbers increase across ARGV files (but see
+examples in L<perlfunc/eof>).
+
+You can also use C<< HANDLE->input_line_number(EXPR) >> to access the
+line counter for a given filehandle without having to worry about
+which handle you last accessed.
+
+(Mnemonic: many programs use "." to mean the current line number.)
+
+=item IO::Handle->input_record_separator(EXPR)
+
+=item $INPUT_RECORD_SEPARATOR
+
+=item $RS
+
+=item $/
+
+The input record separator, newline by default.  This 
+influences Perl's idea of what a "line" is.  Works like B<awk>'s RS
+variable, including treating empty lines as a terminator if set to
+the null string.  (An empty line cannot contain any spaces
+or tabs.)  You may set it to a multi-character string to match a
+multi-character terminator, or to C<undef> to read through the end
+of file.  Setting it to C<"\n\n"> means something slightly
+different than setting to C<"">, if the file contains consecutive
+empty lines.  Setting to C<""> will treat two or more consecutive
+empty lines as a single empty line.  Setting to C<"\n\n"> will
+blindly assume that the next input character belongs to the next
+paragraph, even if it's a newline.  (Mnemonic: / delimits
+line boundaries when quoting poetry.)
+
+    local $/;           # enable "slurp" mode
+    local $_ = <FH>;    # whole file now here
+    s/\n[ \t]+/ /g;
+
+Remember: the value of C<$/> is a string, not a regex.  B<awk> has to be
+better for something. :-)
+
+Setting C<$/> to a reference to an integer, scalar containing an integer, or
+scalar that's convertible to an integer will attempt to read records
+instead of lines, with the maximum record size being the referenced
+integer.  So this:
+
+    local $/ = \32768; # or \"32768", or \$var_containing_32768
+    open my $fh, $myfile or die $!;
+    local $_ = <$fh>;
+
+will read a record of no more than 32768 bytes from FILE.  If you're
+not reading from a record-oriented file (or your OS doesn't have
+record-oriented files), then you'll likely get a full chunk of data
+with every read.  If a record is larger than the record size you've
+set, you'll get the record back in pieces.
+
+On VMS, record reads are done with the equivalent of C<sysread>,
+so it's best not to mix record and non-record reads on the same
+file.  (This is unlikely to be a problem, because any file you'd
+want to read in record mode is probably unusable in line mode.)
+Non-VMS systems do normal I/O, so it's safe to mix record and
+non-record reads of a file.
+
+See also L<perlport/"Newlines">.  Also see C<$.>.
+
+=item HANDLE->autoflush(EXPR)
+
+=item $OUTPUT_AUTOFLUSH
+
+=item $|
+
+If set to nonzero, forces a flush right away and after every write
+or print on the currently selected output channel.  Default is 0
+(regardless of whether the channel is really buffered by the
+system or not; C<$|> tells you only whether you've asked Perl
+explicitly to flush after each write).  STDOUT will
+typically be line buffered if output is to the terminal and block
+buffered otherwise.  Setting this variable is useful primarily when
+you are outputting to a pipe or socket, such as when you are running
+a Perl program under B<rsh> and want to see the output as it's
+happening.  This has no effect on input buffering.  See L<perlfunc/getc>
+for that.  (Mnemonic: when you want your pipes to be piping hot.)
+
+=item IO::Handle->output_field_separator EXPR
+
+=item $OUTPUT_FIELD_SEPARATOR
+
+=item $OFS
+
+=item $,
+
+The output field separator for the print operator.  If defined, this
+value is printed between each of print's arguments.  Default is C<undef>.
+(Mnemonic: what is printed when there is a "," in your print statement.)
+
+=item IO::Handle->output_record_separator EXPR
+
+=item $OUTPUT_RECORD_SEPARATOR
+
+=item $ORS
+
+=item $\
+
+The output record separator for the print operator.  If defined, this
+value is printed after the last of print's arguments.  Default is C<undef>.
+(Mnemonic: you set C<$\> instead of adding "\n" at the end of the print.
+Also, it's just like C<$/>, but it's what you get "back" from Perl.)
+
+=item $LIST_SEPARATOR
+
+=item $"
+
+This is like C<$,> except that it applies to array and slice values
+interpolated into a double-quoted string (or similar interpreted
+string).  Default is a space.  (Mnemonic: obvious, I think.)
+
+=item $SUBSCRIPT_SEPARATOR
+
+=item $SUBSEP
+
+=item $;
+
+The subscript separator for multidimensional array emulation.  If you
+refer to a hash element as
+
+    $foo{$a,$b,$c}
+
+it really means
+
+    $foo{join($;, $a, $b, $c)}
+
+But don't put
+
+    @foo{$a,$b,$c}	# a slice--note the @
+
+which means
+
+    ($foo{$a},$foo{$b},$foo{$c})
+
+Default is "\034", the same as SUBSEP in B<awk>.  If your
+keys contain binary data there might not be any safe value for C<$;>.
+(Mnemonic: comma (the syntactic subscript separator) is a
+semi-semicolon.  Yeah, I know, it's pretty lame, but C<$,> is already
+taken for something more important.)
+
+Consider using "real" multidimensional arrays as described
+in L<perllol>.
+
+=item $#
+
+The output format for printed numbers.  This variable is a half-hearted
+attempt to emulate B<awk>'s OFMT variable.  There are times, however,
+when B<awk> and Perl have differing notions of what counts as 
+numeric.  The initial value is "%.I<n>g", where I<n> is the value
+of the macro DBL_DIG from your system's F<float.h>.  This is different from
+B<awk>'s default OFMT setting of "%.6g", so you need to set C<$#>
+explicitly to get B<awk>'s value.  (Mnemonic: # is the number sign.)
+
+Use of C<$#> is deprecated.
+
+=item HANDLE->format_page_number(EXPR)
+
+=item $FORMAT_PAGE_NUMBER
+
+=item $%
+
+The current page number of the currently selected output channel.
+Used with formats.
+(Mnemonic: % is page number in B<nroff>.)
+
+=item HANDLE->format_lines_per_page(EXPR)
+
+=item $FORMAT_LINES_PER_PAGE
+
+=item $=
+
+The current page length (printable lines) of the currently selected
+output channel.  Default is 60.  
+Used with formats.
+(Mnemonic: = has horizontal lines.)
+
+=item HANDLE->format_lines_left(EXPR)
+
+=item $FORMAT_LINES_LEFT
+
+=item $-
+
+The number of lines left on the page of the currently selected output
+channel.  
+Used with formats.
+(Mnemonic: lines_on_page - lines_printed.)
+
+=item @LAST_MATCH_START
+
+=item @-
+
+$-[0] is the offset of the start of the last successful match.
+C<$-[>I<n>C<]> is the offset of the start of the substring matched by
+I<n>-th subpattern, or undef if the subpattern did not match.
+
+Thus after a match against $_, $& coincides with C<substr $_, $-[0],
+$+[0] - $-[0]>.  Similarly, $I<n> coincides with C<substr $_, $-[n],
+$+[n] - $-[n]> if C<$-[n]> is defined, and $+ coincides with
+C<substr $_, $-[$#-], $+[$#-] - $-[$#-]>.  One can use C<$#-> to find the last
+matched subgroup in the last successful match.  Contrast with
+C<$#+>, the number of subgroups in the regular expression.  Compare
+with C<@+>.
+
+This array holds the offsets of the beginnings of the last
+successful submatches in the currently active dynamic scope.
+C<$-[0]> is the offset into the string of the beginning of the
+entire match.  The I<n>th element of this array holds the offset
+of the I<n>th submatch, so C<$-[1]> is the offset where $1
+begins, C<$-[2]> the offset where $2 begins, and so on.
+
+After a match against some variable $var:
+
+=over 5
+
+=item C<$`> is the same as C<substr($var, 0, $-[0])>
+
+=item C<$&> is the same as C<substr($var, $-[0], $+[0] - $-[0])>
+
+=item C<$'> is the same as C<substr($var, $+[0])>
+
+=item C<$1> is the same as C<substr($var, $-[1], $+[1] - $-[1])>  
+
+=item C<$2> is the same as C<substr($var, $-[2], $+[2] - $-[2])>
+
+=item C<$3> is the same as C<substr($var, $-[3], $+[3] - $-[3])>
+
+=back
+
+=item HANDLE->format_name(EXPR)
+
+=item $FORMAT_NAME
+
+=item $~
+
+The name of the current report format for the currently selected output
+channel.  Default is the name of the filehandle.  (Mnemonic: brother to
+C<$^>.)
+
+=item HANDLE->format_top_name(EXPR)
+
+=item $FORMAT_TOP_NAME
+
+=item $^
+
+The name of the current top-of-page format for the currently selected
+output channel.  Default is the name of the filehandle with _TOP
+appended.  (Mnemonic: points to top of page.)
+
+=item IO::Handle->format_line_break_characters EXPR
+
+=item $FORMAT_LINE_BREAK_CHARACTERS
+
+=item $:
+
+The current set of characters after which a string may be broken to
+fill continuation fields (starting with ^) in a format.  Default is
+S<" \n-">, to break on whitespace or hyphens.  (Mnemonic: a "colon" in
+poetry is a part of a line.)
+
+=item IO::Handle->format_formfeed EXPR
+
+=item $FORMAT_FORMFEED
+
+=item $^L
+
+What formats output as a form feed.  Default is \f.
+
+=item $ACCUMULATOR
+
+=item $^A
+
+The current value of the write() accumulator for format() lines.  A format
+contains formline() calls that put their result into C<$^A>.  After
+calling its format, write() prints out the contents of C<$^A> and empties.
+So you never really see the contents of C<$^A> unless you call
+formline() yourself and then look at it.  See L<perlform> and
+L<perlfunc/formline()>.
+
+=item $CHILD_ERROR
+
+=item $?
+
+The status returned by the last pipe close, backtick (C<``>) command,
+successful call to wait() or waitpid(), or from the system()
+operator.  This is just the 16-bit status word returned by the
+wait() system call (or else is made up to look like it).  Thus, the
+exit value of the subprocess is really (C<<< $? >> 8 >>>), and
+C<$? & 127> gives which signal, if any, the process died from, and
+C<$? & 128> reports whether there was a core dump.  (Mnemonic:
+similar to B<sh> and B<ksh>.)
+
+Additionally, if the C<h_errno> variable is supported in C, its value
+is returned via $? if any C<gethost*()> function fails.
+
+If you have installed a signal handler for C<SIGCHLD>, the
+value of C<$?> will usually be wrong outside that handler.
+
+Inside an C<END> subroutine C<$?> contains the value that is going to be
+given to C<exit()>.  You can modify C<$?> in an C<END> subroutine to
+change the exit status of your program.  For example:
+
+    END {
+	$? = 1 if $? == 255;  # die would make it 255
+    } 
+
+Under VMS, the pragma C<use vmsish 'status'> makes C<$?> reflect the
+actual VMS exit status, instead of the default emulation of POSIX
+status; see L<perlvms/$?> for details.
+
+Also see L<Error Indicators>.
+
+=item ${^ENCODING}
+
+The I<object reference> to the Encode object that is used to convert
+the source code to Unicode.  Thanks to this variable your perl script
+does not have to be written in UTF-8.  Default is I<undef>.  The direct
+manipulation of this variable is highly discouraged.  See L<encoding>
+for more details.
+
+=item $OS_ERROR
+
+=item $ERRNO
+
+=item $!
+
+If used numerically, yields the current value of the C C<errno>
+variable, or in other words, if a system or library call fails, it
+sets this variable.  This means that the value of C<$!> is meaningful
+only I<immediately> after a B<failure>:
+
+    if (open(FH, $filename)) {
+	# Here $! is meaningless.
+	...
+    } else {
+	# ONLY here is $! meaningful.
+	...
+	# Already here $! might be meaningless.
+    }
+    # Since here we might have either success or failure,
+    # here $! is meaningless.
+
+In the above I<meaningless> stands for anything: zero, non-zero,
+C<undef>.  A successful system or library call does B<not> set
+the variable to zero.
+
+If used as a string, yields the corresponding system error string.
+You can assign a number to C<$!> to set I<errno> if, for instance,
+you want C<"$!"> to return the string for error I<n>, or you want
+to set the exit value for the die() operator.  (Mnemonic: What just
+went bang?)
+
+Also see L<Error Indicators>.
+
+=item %!
+
+Each element of C<%!> has a true value only if C<$!> is set to that
+value.  For example, C<$!{ENOENT}> is true if and only if the current
+value of C<$!> is C<ENOENT>; that is, if the most recent error was
+"No such file or directory" (or its moral equivalent: not all operating
+systems give that exact error, and certainly not all languages).
+To check if a particular key is meaningful on your system, use
+C<exists $!{the_key}>; for a list of legal keys, use C<keys %!>.
+See L<Errno> for more information, and also see above for the
+validity of C<$!>.
+
+=item $EXTENDED_OS_ERROR
+
+=item $^E
+
+Error information specific to the current operating system.  At
+the moment, this differs from C<$!> under only VMS, OS/2, and Win32
+(and for MacPerl).  On all other platforms, C<$^E> is always just
+the same as C<$!>.
+
+Under VMS, C<$^E> provides the VMS status value from the last
+system error.  This is more specific information about the last
+system error than that provided by C<$!>.  This is particularly
+important when C<$!> is set to B<EVMSERR>.
+
+Under OS/2, C<$^E> is set to the error code of the last call to
+OS/2 API either via CRT, or directly from perl.
+
+Under Win32, C<$^E> always returns the last error information
+reported by the Win32 call C<GetLastError()> which describes
+the last error from within the Win32 API.  Most Win32-specific
+code will report errors via C<$^E>.  ANSI C and Unix-like calls
+set C<errno> and so most portable Perl code will report errors
+via C<$!>. 
+
+Caveats mentioned in the description of C<$!> generally apply to
+C<$^E>, also.  (Mnemonic: Extra error explanation.)
+
+Also see L<Error Indicators>.
+
+=item $EVAL_ERROR
+
+=item $@
+
+The Perl syntax error message from the last eval() operator.
+If $@ is the null string, the last eval() parsed and executed
+correctly (although the operations you invoked may have failed in the
+normal fashion).  (Mnemonic: Where was the syntax error "at"?)
+
+Warning messages are not collected in this variable.  You can,
+however, set up a routine to process warnings by setting C<$SIG{__WARN__}>
+as described below.
+
+Also see L<Error Indicators>.
+
+=item $PROCESS_ID
+
+=item $PID
+
+=item $$
+
+The process number of the Perl running this script.  You should
+consider this variable read-only, although it will be altered
+across fork() calls.  (Mnemonic: same as shells.)
+
+Note for Linux users: on Linux, the C functions C<getpid()> and
+C<getppid()> return different values from different threads. In order to
+be portable, this behavior is not reflected by C<$$>, whose value remains
+consistent across threads. If you want to call the underlying C<getpid()>,
+you may use the CPAN module C<Linux::Pid>.
+
+=item $REAL_USER_ID
+
+=item $UID
+
+=item $<
+
+The real uid of this process.  (Mnemonic: it's the uid you came I<from>,
+if you're running setuid.)  You can change both the real uid and
+the effective uid at the same time by using POSIX::setuid().  Since
+changes to $< require a system call, check $! after a change attempt to 
+detect any possible errors.
+
+=item $EFFECTIVE_USER_ID
+
+=item $EUID
+
+=item $>
+
+The effective uid of this process.  Example:
+
+    $< = $>;		# set real to effective uid
+    ($<,$>) = ($>,$<);	# swap real and effective uid
+
+You can change both the effective uid and the real uid at the same
+time by using POSIX::setuid().  Changes to $> require a check to $!
+to detect any possible errors after an attempted change. 
+
+(Mnemonic: it's the uid you went I<to>, if you're running setuid.)
+C<< $< >> and C<< $> >> can be swapped only on machines
+supporting setreuid().
+
+=item $REAL_GROUP_ID
+
+=item $GID
+
+=item $(
+
+The real gid of this process.  If you are on a machine that supports
+membership in multiple groups simultaneously, gives a space separated
+list of groups you are in.  The first number is the one returned by
+getgid(), and the subsequent ones by getgroups(), one of which may be
+the same as the first number.
+
+However, a value assigned to C<$(> must be a single number used to
+set the real gid.  So the value given by C<$(> should I<not> be assigned
+back to C<$(> without being forced numeric, such as by adding zero.
+
+You can change both the real gid and the effective gid at the same
+time by using POSIX::setgid().  Changes to $( require a check to $!
+to detect any possible errors after an attempted change.
+
+(Mnemonic: parentheses are used to I<group> things.  The real gid is the
+group you I<left>, if you're running setgid.)
+
+=item $EFFECTIVE_GROUP_ID
+
+=item $EGID
+
+=item $)
+
+The effective gid of this process.  If you are on a machine that
+supports membership in multiple groups simultaneously, gives a space
+separated list of groups you are in.  The first number is the one
+returned by getegid(), and the subsequent ones by getgroups(), one of
+which may be the same as the first number.
+
+Similarly, a value assigned to C<$)> must also be a space-separated
+list of numbers.  The first number sets the effective gid, and
+the rest (if any) are passed to setgroups().  To get the effect of an
+empty list for setgroups(), just repeat the new effective gid; that is,
+to force an effective gid of 5 and an effectively empty setgroups()
+list, say C< $) = "5 5" >.
+
+You can change both the effective gid and the real gid at the same
+time by using POSIX::setgid() (use only a single numeric argument).
+Changes to $) require a check to $! to detect any possible errors
+after an attempted change.
+
+(Mnemonic: parentheses are used to I<group> things.  The effective gid
+is the group that's I<right> for you, if you're running setgid.)
+
+C<< $< >>, C<< $> >>, C<$(> and C<$)> can be set only on
+machines that support the corresponding I<set[re][ug]id()> routine.  C<$(>
+and C<$)> can be swapped only on machines supporting setregid().
+
+=item $PROGRAM_NAME
+
+=item $0
+
+Contains the name of the program being executed.
+
+On some (read: not all) operating systems assigning to C<$0> modifies
+the argument area that the C<ps> program sees.  On some platforms you
+may have to use special C<ps> options or a different C<ps> to see the
+changes.  Modifying the $0 is more useful as a way of indicating the
+current program state than it is for hiding the program you're
+running.  (Mnemonic: same as B<sh> and B<ksh>.)
+
+Note that there are platform specific limitations on the maximum
+length of C<$0>.  In the most extreme case it may be limited to the
+space occupied by the original C<$0>.
+
+In some platforms there may be arbitrary amount of padding, for
+example space characters, after the modified name as shown by C<ps>.
+In some platforms this padding may extend all the way to the original
+length of the argument area, no matter what you do (this is the case
+for example with Linux 2.2).
+
+Note for BSD users: setting C<$0> does not completely remove "perl"
+from the ps(1) output.  For example, setting C<$0> to C<"foobar"> may
+result in C<"perl: foobar (perl)"> (whether both the C<"perl: "> prefix
+and the " (perl)" suffix are shown depends on your exact BSD variant
+and version).  This is an operating system feature, Perl cannot help it.
+
+In multithreaded scripts Perl coordinates the threads so that any
+thread may modify its copy of the C<$0> and the change becomes visible
+to ps(1) (assuming the operating system plays along).  Note that
+the view of C<$0> the other threads have will not change since they
+have their own copies of it.
+
+=item $[
+
+The index of the first element in an array, and of the first character
+in a substring.  Default is 0, but you could theoretically set it
+to 1 to make Perl behave more like B<awk> (or Fortran) when
+subscripting and when evaluating the index() and substr() functions.
+(Mnemonic: [ begins subscripts.)
+
+As of release 5 of Perl, assignment to C<$[> is treated as a compiler
+directive, and cannot influence the behavior of any other file.
+(That's why you can only assign compile-time constants to it.)
+Its use is highly discouraged.
+
+Note that, unlike other compile-time directives (such as L<strict>),
+assignment to C<$[> can be seen from outer lexical scopes in the same file.
+However, you can use local() on it to strictly bind its value to a
+lexical block.
+
+=item $]
+
+The version + patchlevel / 1000 of the Perl interpreter.  This variable
+can be used to determine whether the Perl interpreter executing a
+script is in the right range of versions.  (Mnemonic: Is this version
+of perl in the right bracket?)  Example:
+
+    warn "No checksumming!\n" if $] < 3.019;
+
+See also the documentation of C<use VERSION> and C<require VERSION>
+for a convenient way to fail if the running Perl interpreter is too old.
+
+When testing the variable, to steer clear of floating point
+inaccuracies you might want to prefer the inequality tests C<< < >>
+and C<< > >> to the tests containing equivalence: C<< <= >>, C<< == >>,
+and C<< >= >>.
+
+The floating point representation can sometimes lead to inaccurate
+numeric comparisons.  See C<$^V> for a more modern representation of
+the Perl version that allows accurate string comparisons.
+
+=item $COMPILING
+
+=item $^C
+
+The current value of the flag associated with the B<-c> switch.
+Mainly of use with B<-MO=...> to allow code to alter its behavior
+when being compiled, such as for example to AUTOLOAD at compile
+time rather than normal, deferred loading.  See L<perlcc>.  Setting
+C<$^C = 1> is similar to calling C<B::minus_c>.
+
+=item $DEBUGGING
+
+=item $^D
+
+The current value of the debugging flags.  (Mnemonic: value of B<-D>
+switch.) May be read or set. Like its command-line equivalent, you can use
+numeric or symbolic values, eg C<$^D = 10> or C<$^D = "st">.
+
+=item $SYSTEM_FD_MAX
+
+=item $^F
+
+The maximum system file descriptor, ordinarily 2.  System file
+descriptors are passed to exec()ed processes, while higher file
+descriptors are not.  Also, during an open(), system file descriptors are
+preserved even if the open() fails.  (Ordinary file descriptors are
+closed before the open() is attempted.)  The close-on-exec
+status of a file descriptor will be decided according to the value of
+C<$^F> when the corresponding file, pipe, or socket was opened, not the
+time of the exec().
+
+=item $^H
+
+WARNING: This variable is strictly for internal use only.  Its availability,
+behavior, and contents are subject to change without notice.
+
+This variable contains compile-time hints for the Perl interpreter.  At the
+end of compilation of a BLOCK the value of this variable is restored to the
+value when the interpreter started to compile the BLOCK.
+
+When perl begins to parse any block construct that provides a lexical scope
+(e.g., eval body, required file, subroutine body, loop body, or conditional
+block), the existing value of $^H is saved, but its value is left unchanged.
+When the compilation of the block is completed, it regains the saved value.
+Between the points where its value is saved and restored, code that
+executes within BEGIN blocks is free to change the value of $^H.
+
+This behavior provides the semantic of lexical scoping, and is used in,
+for instance, the C<use strict> pragma.
+
+The contents should be an integer; different bits of it are used for
+different pragmatic flags.  Here's an example:
+
+    sub add_100 { $^H |= 0x100 }
+
+    sub foo {
+	BEGIN { add_100() }
+	bar->baz($boon);
+    }
+
+Consider what happens during execution of the BEGIN block.  At this point
+the BEGIN block has already been compiled, but the body of foo() is still
+being compiled.  The new value of $^H will therefore be visible only while
+the body of foo() is being compiled.
+
+Substitution of the above BEGIN block with:
+
+    BEGIN { require strict; strict->import('vars') }
+
+demonstrates how C<use strict 'vars'> is implemented.  Here's a conditional
+version of the same lexical pragma:
+
+    BEGIN { require strict; strict->import('vars') if $condition }
+
+=item %^H
+
+WARNING: This variable is strictly for internal use only.  Its availability,
+behavior, and contents are subject to change without notice.
+
+The %^H hash provides the same scoping semantic as $^H.  This makes it
+useful for implementation of lexically scoped pragmas.
+
+=item $INPLACE_EDIT
+
+=item $^I
+
+The current value of the inplace-edit extension.  Use C<undef> to disable
+inplace editing.  (Mnemonic: value of B<-i> switch.)
+
+=item $^M
+
+By default, running out of memory is an untrappable, fatal error.
+However, if suitably built, Perl can use the contents of C<$^M>
+as an emergency memory pool after die()ing.  Suppose that your Perl
+were compiled with C<-DPERL_EMERGENCY_SBRK> and used Perl's malloc.
+Then
+
+    $^M = 'a' x (1 << 16);
+
+would allocate a 64K buffer for use in an emergency.  See the
+F<INSTALL> file in the Perl distribution for information on how to
+add custom C compilation flags when compiling perl.  To discourage casual
+use of this advanced feature, there is no L<English|English> long name for
+this variable.
+
+=item $OSNAME
+
+=item $^O
+
+The name of the operating system under which this copy of Perl was
+built, as determined during the configuration process.  The value
+is identical to C<$Config{'osname'}>.  See also L<Config> and the 
+B<-V> command-line switch documented in L<perlrun>.
+
+In Windows platforms, $^O is not very helpful: since it is always
+C<MSWin32>, it doesn't tell the difference between
+95/98/ME/NT/2000/XP/CE/.NET.  Use Win32::GetOSName() or
+Win32::GetOSVersion() (see L<Win32> and L<perlport>) to distinguish
+between the variants.
+
+=item ${^OPEN}
+
+An internal variable used by PerlIO.  A string in two parts, separated
+by a C<\0> byte, the first part describes the input layers, the second
+part describes the output layers.
+
+=item $PERLDB
+
+=item $^P
+
+The internal variable for debugging support.  The meanings of the
+various bits are subject to change, but currently indicate:
+
+=over 6
+
+=item 0x01
+
+Debug subroutine enter/exit.
+
+=item 0x02
+
+Line-by-line debugging.
+
+=item 0x04
+
+Switch off optimizations.
+
+=item 0x08
+
+Preserve more data for future interactive inspections.
+
+=item 0x10
+
+Keep info about source lines on which a subroutine is defined.
+
+=item 0x20
+
+Start with single-step on.
+
+=item 0x40
+
+Use subroutine address instead of name when reporting.
+
+=item 0x80
+
+Report C<goto &subroutine> as well.
+
+=item 0x100
+
+Provide informative "file" names for evals based on the place they were compiled.
+
+=item 0x200
+
+Provide informative names to anonymous subroutines based on the place they
+were compiled.
+
+=item 0x400
+
+Debug assertion subroutines enter/exit.
+
+=back
+
+Some bits may be relevant at compile-time only, some at
+run-time only.  This is a new mechanism and the details may change.
+
+=item $LAST_REGEXP_CODE_RESULT
+
+=item $^R
+
+The result of evaluation of the last successful C<(?{ code })>
+regular expression assertion (see L<perlre>).  May be written to.
+
+=item $EXCEPTIONS_BEING_CAUGHT
+
+=item $^S
+
+Current state of the interpreter.
+
+    $^S         State
+    ---------   -------------------
+    undef       Parsing module/eval
+    true (1)    Executing an eval
+    false (0)   Otherwise
+
+The first state may happen in $SIG{__DIE__} and $SIG{__WARN__} handlers.
+
+=item $BASETIME
+
+=item $^T
+
+The time at which the program began running, in seconds since the
+epoch (beginning of 1970).  The values returned by the B<-M>, B<-A>,
+and B<-C> filetests are based on this value.
+
+=item ${^TAINT}
+
+Reflects if taint mode is on or off.  1 for on (the program was run with
+B<-T>), 0 for off, -1 when only taint warnings are enabled (i.e. with
+B<-t> or B<-TU>).
+
+=item ${^UNICODE}
+
+Reflects certain Unicode settings of Perl.  See L<perlrun>
+documentation for the C<-C> switch for more information about
+the possible values. This variable is set during Perl startup
+and is thereafter read-only.
+
+=item ${^UTF8LOCALE}
+
+This variable indicates whether an UTF-8 locale was detected by perl at
+startup. This information is used by perl when it's in
+adjust-utf8ness-to-locale mode (as when run with the C<-CL> command-line
+switch); see L<perlrun> for more info on this.
+
+=item $PERL_VERSION
+
+=item $^V
+
+The revision, version, and subversion of the Perl interpreter, represented
+as a string composed of characters with those ordinals.  Thus in Perl v5.6.0
+it equals C<chr(5) . chr(6) . chr(0)> and will return true for
+C<$^V eq v5.6.0>.  Note that the characters in this string value can
+potentially be in Unicode range.
+
+This can be used to determine whether the Perl interpreter executing a
+script is in the right range of versions.  (Mnemonic: use ^V for Version
+Control.)  Example:
+
+    warn "No \"our\" declarations!\n" if $^V and $^V lt v5.6.0;
+
+To convert C<$^V> into its string representation use sprintf()'s
+C<"%vd"> conversion:
+
+    printf "version is v%vd\n", $^V;  # Perl's version
+
+See the documentation of C<use VERSION> and C<require VERSION>
+for a convenient way to fail if the running Perl interpreter is too old.
+
+See also C<$]> for an older representation of the Perl version.
+
+=item $WARNING
+
+=item $^W
+
+The current value of the warning switch, initially true if B<-w>
+was used, false otherwise, but directly modifiable.  (Mnemonic:
+related to the B<-w> switch.)  See also L<warnings>.
+
+=item ${^WARNING_BITS}
+
+The current set of warning checks enabled by the C<use warnings> pragma.
+See the documentation of C<warnings> for more details.
+
+=item $EXECUTABLE_NAME
+
+=item $^X
+
+The name used to execute the current copy of Perl, from C's
+C<argv[0]> or (where supported) F</proc/self/exe>.
+
+Depending on the host operating system, the value of $^X may be
+a relative or absolute pathname of the perl program file, or may
+be the string used to invoke perl but not the pathname of the
+perl program file.  Also, most operating systems permit invoking
+programs that are not in the PATH environment variable, so there
+is no guarantee that the value of $^X is in PATH.  For VMS, the
+value may or may not include a version number.
+
+You usually can use the value of $^X to re-invoke an independent
+copy of the same perl that is currently running, e.g.,
+
+  @first_run = `$^X -le "print int rand 100 for 1..100"`;
+
+But recall that not all operating systems support forking or
+capturing of the output of commands, so this complex statement
+may not be portable.
+
+It is not safe to use the value of $^X as a path name of a file,
+as some operating systems that have a mandatory suffix on
+executable files do not require use of the suffix when invoking
+a command.  To convert the value of $^X to a path name, use the
+following statements:
+
+  # Build up a set of file names (not command names).
+  use Config;
+  $this_perl = $^X;
+  if ($^O ne 'VMS')
+     {$this_perl .= $Config{_exe}
+          unless $this_perl =~ m/$Config{_exe}$/i;}
+
+Because many operating systems permit anyone with read access to
+the Perl program file to make a copy of it, patch the copy, and
+then execute the copy, the security-conscious Perl programmer
+should take care to invoke the installed copy of perl, not the
+copy referenced by $^X.  The following statements accomplish
+this goal, and produce a pathname that can be invoked as a
+command or referenced as a file.
+
+  use Config;
+  $secure_perl_path = $Config{perlpath};
+  if ($^O ne 'VMS')
+     {$secure_perl_path .= $Config{_exe}
+          unless $secure_perl_path =~ m/$Config{_exe}$/i;}
+
+=item ARGV
+
+The special filehandle that iterates over command-line filenames in
+C<@ARGV>. Usually written as the null filehandle in the angle operator
+C<< <> >>. Note that currently C<ARGV> only has its magical effect
+within the C<< <> >> operator; elsewhere it is just a plain filehandle
+corresponding to the last file opened by C<< <> >>. In particular,
+passing C<\*ARGV> as a parameter to a function that expects a filehandle
+may not cause your function to automatically read the contents of all the
+files in C<@ARGV>.
+
+=item $ARGV
+
+contains the name of the current file when reading from <>.
+
+=item @ARGV
+
+The array @ARGV contains the command-line arguments intended for
+the script.  C<$#ARGV> is generally the number of arguments minus
+one, because C<$ARGV[0]> is the first argument, I<not> the program's
+command name itself.  See C<$0> for the command name.
+
+=item ARGVOUT
+
+The special filehandle that points to the currently open output file
+when doing edit-in-place processing with B<-i>.  Useful when you have
+to do a lot of inserting and don't want to keep modifying $_.  See
+L<perlrun> for the B<-i> switch.
+
+=item @F
+
+The array @F contains the fields of each line read in when autosplit
+mode is turned on.  See L<perlrun> for the B<-a> switch.  This array
+is package-specific, and must be declared or given a full package name
+if not in package main when running under C<strict 'vars'>.
+
+=item @INC
+
+The array @INC contains the list of places that the C<do EXPR>,
+C<require>, or C<use> constructs look for their library files.  It
+initially consists of the arguments to any B<-I> command-line
+switches, followed by the default Perl library, probably
+F</usr/local/lib/perl>, followed by ".", to represent the current
+directory.  ("." will not be appended if taint checks are enabled, either by
+C<-T> or by C<-t>.)  If you need to modify this at runtime, you should use
+the C<use lib> pragma to get the machine-dependent library properly
+loaded also:
+
+    use lib '/mypath/libdir/';
+    use SomeMod;
+
+You can also insert hooks into the file inclusion system by putting Perl
+code directly into @INC.  Those hooks may be subroutine references, array
+references or blessed objects.  See L<perlfunc/require> for details.
+
+=item @_
+
+Within a subroutine the array @_ contains the parameters passed to that
+subroutine.  See L<perlsub>.
+
+=item %INC
+
+The hash %INC contains entries for each filename included via the
+C<do>, C<require>, or C<use> operators.  The key is the filename
+you specified (with module names converted to pathnames), and the
+value is the location of the file found.  The C<require>
+operator uses this hash to determine whether a particular file has
+already been included.
+
+If the file was loaded via a hook (e.g. a subroutine reference, see
+L<perlfunc/require> for a description of these hooks), this hook is
+by default inserted into %INC in place of a filename.  Note, however,
+that the hook may have set the %INC entry by itself to provide some more
+specific info.
+
+=item %ENV
+
+=item $ENV{expr}
+
+The hash %ENV contains your current environment.  Setting a
+value in C<ENV> changes the environment for any child processes
+you subsequently fork() off.
+
+=item %SIG
+
+=item $SIG{expr}
+
+The hash %SIG contains signal handlers for signals.  For example:
+
+    sub handler {	# 1st argument is signal name
+	my($sig) = @_;
+	print "Caught a SIG$sig--shutting down\n";
+	close(LOG);
+	exit(0);
+    }
+
+    $SIG{'INT'}  = \&handler;
+    $SIG{'QUIT'} = \&handler;
+    ...
+    $SIG{'INT'}  = 'DEFAULT';	# restore default action
+    $SIG{'QUIT'} = 'IGNORE';	# ignore SIGQUIT
+
+Using a value of C<'IGNORE'> usually has the effect of ignoring the
+signal, except for the C<CHLD> signal.  See L<perlipc> for more about
+this special case.
+
+Here are some other examples:
+
+    $SIG{"PIPE"} = "Plumber";   # assumes main::Plumber (not recommended)
+    $SIG{"PIPE"} = \&Plumber;   # just fine; assume current Plumber
+    $SIG{"PIPE"} = *Plumber;    # somewhat esoteric
+    $SIG{"PIPE"} = Plumber();   # oops, what did Plumber() return??
+
+Be sure not to use a bareword as the name of a signal handler,
+lest you inadvertently call it. 
+
+If your system has the sigaction() function then signal handlers are
+installed using it.  This means you get reliable signal handling.
+
+The default delivery policy of signals changed in Perl 5.8.0 from 
+immediate (also known as "unsafe") to deferred, also known as 
+"safe signals".  See L<perlipc> for more information.
+
+Certain internal hooks can be also set using the %SIG hash.  The
+routine indicated by C<$SIG{__WARN__}> is called when a warning message is
+about to be printed.  The warning message is passed as the first
+argument.  The presence of a __WARN__ hook causes the ordinary printing
+of warnings to STDERR to be suppressed.  You can use this to save warnings
+in a variable, or turn warnings into fatal errors, like this:
+
+    local $SIG{__WARN__} = sub { die $_[0] };
+    eval $proggie;
+
+The routine indicated by C<$SIG{__DIE__}> is called when a fatal exception
+is about to be thrown.  The error message is passed as the first
+argument.  When a __DIE__ hook routine returns, the exception
+processing continues as it would have in the absence of the hook,
+unless the hook routine itself exits via a C<goto>, a loop exit, or a die().
+The C<__DIE__> handler is explicitly disabled during the call, so that you
+can die from a C<__DIE__> handler.  Similarly for C<__WARN__>.
+
+Due to an implementation glitch, the C<$SIG{__DIE__}> hook is called
+even inside an eval().  Do not use this to rewrite a pending exception
+in C<$@>, or as a bizarre substitute for overriding CORE::GLOBAL::die().
+This strange action at a distance may be fixed in a future release
+so that C<$SIG{__DIE__}> is only called if your program is about
+to exit, as was the original intent.  Any other use is deprecated.
+
+C<__DIE__>/C<__WARN__> handlers are very special in one respect:
+they may be called to report (probable) errors found by the parser.
+In such a case the parser may be in inconsistent state, so any
+attempt to evaluate Perl code from such a handler will probably
+result in a segfault.  This means that warnings or errors that
+result from parsing Perl should be used with extreme caution, like
+this:
+
+    require Carp if defined $^S;
+    Carp::confess("Something wrong") if defined &Carp::confess;
+    die "Something wrong, but could not load Carp to give backtrace...
+         To see backtrace try starting Perl with -MCarp switch";
+
+Here the first line will load Carp I<unless> it is the parser who
+called the handler.  The second line will print backtrace and die if
+Carp was available.  The third line will be executed only if Carp was
+not available.
+
+See L<perlfunc/die>, L<perlfunc/warn>, L<perlfunc/eval>, and
+L<warnings> for additional information.
+
+=back
+
+=head2 Error Indicators
+
+The variables C<$@>, C<$!>, C<$^E>, and C<$?> contain information
+about different types of error conditions that may appear during
+execution of a Perl program.  The variables are shown ordered by
+the "distance" between the subsystem which reported the error and
+the Perl process.  They correspond to errors detected by the Perl
+interpreter, C library, operating system, or an external program,
+respectively.
+
+To illustrate the differences between these variables, consider the 
+following Perl expression, which uses a single-quoted string:
+
+    eval q{
+	open my $pipe, "/cdrom/install |" or die $!;
+	my @res = <$pipe>;
+	close $pipe or die "bad pipe: $?, $!";
+    };
+
+After execution of this statement all 4 variables may have been set.  
+
+C<$@> is set if the string to be C<eval>-ed did not compile (this
+may happen if C<open> or C<close> were imported with bad prototypes),
+or if Perl code executed during evaluation die()d .  In these cases
+the value of $@ is the compile error, or the argument to C<die>
+(which will interpolate C<$!> and C<$?>).  (See also L<Fatal>,
+though.)
+
+When the eval() expression above is executed, open(), C<< <PIPE> >>,
+and C<close> are translated to calls in the C run-time library and
+thence to the operating system kernel.  C<$!> is set to the C library's
+C<errno> if one of these calls fails. 
+
+Under a few operating systems, C<$^E> may contain a more verbose
+error indicator, such as in this case, "CDROM tray not closed."
+Systems that do not support extended error messages leave C<$^E>
+the same as C<$!>.
+
+Finally, C<$?> may be set to non-0 value if the external program
+F</cdrom/install> fails.  The upper eight bits reflect specific
+error conditions encountered by the program (the program's exit()
+value).   The lower eight bits reflect mode of failure, like signal
+death and core dump information  See wait(2) for details.  In
+contrast to C<$!> and C<$^E>, which are set only if error condition
+is detected, the variable C<$?> is set on each C<wait> or pipe
+C<close>, overwriting the old value.  This is more like C<$@>, which
+on every eval() is always set on failure and cleared on success.
+
+For more details, see the individual descriptions at C<$@>, C<$!>, C<$^E>,
+and C<$?>.
+
+=head2 Technical Note on the Syntax of Variable Names
+
+Variable names in Perl can have several formats.  Usually, they
+must begin with a letter or underscore, in which case they can be
+arbitrarily long (up to an internal limit of 251 characters) and
+may contain letters, digits, underscores, or the special sequence
+C<::> or C<'>.  In this case, the part before the last C<::> or
+C<'> is taken to be a I<package qualifier>; see L<perlmod>.
+
+Perl variable names may also be a sequence of digits or a single
+punctuation or control character.  These names are all reserved for
+special uses by Perl; for example, the all-digits names are used
+to hold data captured by backreferences after a regular expression
+match.  Perl has a special syntax for the single-control-character
+names: It understands C<^X> (caret C<X>) to mean the control-C<X>
+character.  For example, the notation C<$^W> (dollar-sign caret
+C<W>) is the scalar variable whose name is the single character
+control-C<W>.  This is better than typing a literal control-C<W>
+into your program.
+
+Finally, new in Perl 5.6, Perl variable names may be alphanumeric
+strings that begin with control characters (or better yet, a caret).
+These variables must be written in the form C<${^Foo}>; the braces
+are not optional.  C<${^Foo}> denotes the scalar variable whose
+name is a control-C<F> followed by two C<o>'s.  These variables are
+reserved for future special uses by Perl, except for the ones that
+begin with C<^_> (control-underscore or caret-underscore).  No
+control-character name that begins with C<^_> will acquire a special
+meaning in any future version of Perl; such names may therefore be
+used safely in programs.  C<$^_> itself, however, I<is> reserved.
+
+Perl identifiers that begin with digits, control characters, or
+punctuation characters are exempt from the effects of the C<package>
+declaration and are always forced to be in package C<main>; they are
+also exempt from C<strict 'vars'> errors.  A few other names are also
+exempt in these ways:
+
+	ENV		STDIN
+	INC		STDOUT
+	ARGV		STDERR
+	ARGVOUT		_
+	SIG
+
+In particular, the new special C<${^_XYZ}> variables are always taken
+to be in package C<main>, regardless of any C<package> declarations
+presently in scope.  
+
+=head1 BUGS
+
+Due to an unfortunate accident of Perl's implementation, C<use
+English> imposes a considerable performance penalty on all regular
+expression matches in a program, regardless of whether they occur
+in the scope of C<use English>.  For that reason, saying C<use
+English> in libraries is strongly discouraged.  See the
+Devel::SawAmpersand module documentation from CPAN
+( http://www.cpan.org/modules/by-module/Devel/ )
+for more information.
+
+Having to even think about the C<$^S> variable in your exception
+handlers is simply wrong.  C<$SIG{__DIE__}> as currently implemented
+invites grievous and difficult to track down errors.  Avoid it
+and use an C<END{}> or CORE::GLOBAL::die override instead.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvmesa.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvmesa.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvmesa.pod	(revision 14489)
@@ -0,0 +1,131 @@
+
+This document is written in pod format hence there are punctuation
+characters in odd places.  Do not worry, you've apparently got
+the ASCII->EBCDIC translation worked out correctly.  You can read
+more about pod in pod/perlpod.pod or the short summary in the
+INSTALL file.
+
+=head1 NAME
+
+README.vmesa - building and installing Perl for VM/ESA.
+
+=head1 SYNOPSIS
+
+This document will help you Configure, build, test and install Perl
+on VM/ESA.
+
+=head1 DESCRIPTION
+
+This is a fully ported perl for VM/ESA 2.3.0.  It may work on
+other versions, but that's the one we've tested it on.
+
+If you've downloaded the binary distribution, it needs to be
+installed below /usr/local.  Source code distributions have an
+automated "make install" step that means you do not need to extract
+the source code below /usr/local (though that is where it will be
+installed by default).  You may need to worry about the networking
+configuration files discussed in the last bullet below.
+
+=head2 Unpacking Perl Distribution on VM/ESA
+
+To extract an ASCII tar archive on VM/ESA, try this:
+
+   pax -o to=IBM-1047,from=ISO8859-1 -r < latest.tar
+
+=head2 Setup Perl and utilities on VM/ESA
+
+GNU make for VM/ESA, which may be required for the build of perl,
+is available from:
+
+  http://vm.marist.edu/~neale/vmoe.html
+
+=head2 Configure Perl on VM/ESA
+
+Once you've unpacked the distribution, run Configure (see INSTALL for
+full discussion of the Configure options), and then run make, then
+"make test" then "make install" (this last step may require UID=0
+privileges).
+
+There is a "hints" file for vmesa that specifies the correct values
+for most things.  Some things to watch out for are:
+
+=over 4
+
+=item *
+
+this port does support dynamic loading but it's not had much testing
+
+=item *
+
+Don't turn on the compiler optimization flag "-O".  There's
+a bug in the compiler (APAR PQ18812) that generates some bad code
+the optimizer is on.
+
+=item *
+
+As VM/ESA doesn't fully support the fork() API programs relying on
+this call will not work. I've replaced fork()/exec() with spawn()
+and the standalone exec() with spawn(). This has a side effect when
+opening unnamed pipes in a shell script: there is no child process
+generated under.
+
+=item *
+
+At the moment the hints file for VM/ESA basically bypasses all of the
+automatic configuration process.  This is because Configure relies on:
+1. The header files living in the Byte File System (you could put the
+there if you want); 2. The C preprocessor including the #include 
+statements in the preprocessor output (.i) file.
+
+=back
+
+=head2 Testing Anomalies of Perl on VM/ESA
+
+The "make test" step runs a Perl Verification Procedure, usually before
+installation.  As the 5.6.1 kit was being assembled
+the following "failures" were known to appear on some machines
+during "make test" (mostly due to ASCII vs. EBCDIC conflicts),
+your results may differ:
+
+[the list of failures being compiled]
+
+=head2 Usage Hints for Perl on VM/ESA
+
+When using perl on VM/ESA please keep in mind that the EBCDIC and ASCII
+character sets are different.  Perl builtin functions that may behave
+differently under EBCDIC are mentioned in the perlport.pod document.
+
+OpenEdition (UNIX System Services) does not (yet) support the #! means
+of script invocation.
+See:
+
+    head `whence perldoc`
+
+for an example of how to use the "eval exec" trick to ask the shell to
+have perl run your scripts for you.
+
+=head1 AUTHORS
+
+Neale Ferguson.
+
+=head1 SEE ALSO
+
+L<INSTALL>, L<perlport>, L<perlebcdic>.
+
+=head2 Mailing list for Perl on VM/ESA
+
+If you are interested in the VM/ESA, z/OS (formerly known as OS/390)
+and POSIX-BC (BS2000) ports of Perl then see the perl-mvs mailing list.
+To subscribe, send an empty message to perl-mvs-subscribe@perl.org.
+
+See also:
+
+    http://lists.perl.org/showlist.cgi?name=perl-mvs
+
+There are web archives of the mailing list at:
+
+    http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
+    http://archive.develooper.com/perl-mvs@perl.org/
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvms.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvms.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvms.pod	(revision 14489)
@@ -0,0 +1,806 @@
+If you read this file _as_is_, just ignore the equal signs on the left.
+This file is written in the POD format (see [.POD]PERLPOD.POD;1) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.vms - Configuring, building, testing, and installing perl on VMS
+
+=head1 SYNOPSIS
+
+To configure, build, test, and install perl on VMS:
+
+    @ Configure
+    mms
+    mms test
+    mms install
+
+mmk may be used in place of mms in the last three steps.
+
+=head1 DESCRIPTION
+
+=head2 Important safety tip
+
+The build and install procedures have changed significantly from the 5.004
+releases!  Make sure you read the "Configuring the Perl Build", "Building 
+Perl", and "Installing Perl" sections of this document before you build or 
+install.  Also please note other changes in the current release by having
+a look at L<perldelta/VMS>.
+
+Also note that, as of Perl version 5.005 and later, an ANSI C compliant 
+compiler is required to build Perl.  VAX C is *not* ANSI compliant, as it 
+died a natural death some time before the standard was set.  Therefore 
+VAX C will not compile Perl 5.005 or later.  We are sorry about that.
+
+If you are stuck without Compaq (formerly DEC) C consider trying Gnu C
+instead, though there have been no recent reports of builds using Gnu C. 
+There is minimal support for Compaq C++ but this support is not complete;
+if you get it working please write to the vmsperl list (for info see
+L</"Mailing Lists">).
+
+
+=head2 Introduction to Perl on VMS
+
+The VMS port of Perl is as functionally complete as any other Perl port
+(and as complete as the ports on some Unix systems). The Perl binaries
+provide all the Perl system calls that are either available under VMS or
+reasonably emulated. There are some incompatibilities in process handling
+(e.g. the fork/exec model for creating subprocesses doesn't do what you
+might expect under Unix), mainly because VMS and Unix handle processes and
+sub-processes very differently.
+
+There are still some unimplemented system functions, and of course we
+could use modules implementing useful VMS system services, so if you'd like
+to lend a hand we'd love to have you.  Join the Perl Porting Team Now!
+
+The current sources and build procedures have been tested on a VAX using
+DEC C, and on an AXP using DEC C. If you run into problems with
+other compilers, please let us know.  (Note: DEC C was renamed to Compaq C
+around version 6.2).
+
+There are issues with various versions of DEC C, so if you're not running a
+relatively modern version, check the "DEC C issues" section later on in this
+document.
+
+=head2 Other required software for Compiling Perl on VMS
+
+In addition to VMS and DCL you will need two things:
+
+=over 4
+
+=item 1  A C compiler. 
+
+DEC (now Compaq) C or gcc for VMS (AXP or VAX).
+
+=item 2  A make tool. 
+
+DEC's MMS (v2.6 or later), or MadGoat's free MMS
+analog MMK (available from ftp.madgoat.com/madgoat) both work
+just fine. Gnu Make might work, but it's been so long since
+anyone's tested it that we're not sure.  MMK is free though, so
+go ahead and use that.
+
+=back
+
+=head2 Additional software that is optional for Perl on VMS
+
+You may also want to have on hand:
+
+=over 4
+
+=item 1  GUNZIP/GZIP.EXE for VMS 
+
+A de-compressor for *.gz and *.tgz files available from a number 
+of web/ftp sites and is distributed on the OpenVMS Freeware CD-ROM 
+from Compaq.
+
+    http://www.fsf.org/order/ftp.html
+    http://www.openvms.compaq.com/freeware/
+    http://www.crinoid.com/utils/
+
+=item 2  VMS TAR 
+
+For reading and writing unix tape archives (*.tar files).  Vmstar is also 
+available from a number of web/ftp sites and is distributed on the OpenVMS
+Freeware CD-ROM from Compaq.
+
+    ftp://ftp.lp.se/vms/
+    http://www.openvms.compaq.com/freeware/
+
+Recent versions of VMS tar on ODS-5 volumes may extract tape archive
+files with ^. escaped periods in them.  See below for further workarounds.
+
+=item 3  UNZIP.EXE for VMS
+
+A combination decompressor and archive reader/writer for *.zip files.  
+Unzip is available from a number of web/ftp sites.
+
+    http://www.info-zip.org/UnZip.html
+    http://www.openvms.compaq.com/freeware/
+    ftp://ftp.openvms.compaq.com/
+    ftp://ftp.madgoat.com/madgoat/
+    ftp://ftp.process.com/vms-freeware/
+
+=item 4  MOST
+
+Most is an optional pager that is convenient to use with perldoc (unlike 
+TYPE/PAGE, MOST can go forward and backwards in a document and supports 
+regular expression searching).  Most builds with the slang 
+library on VMS.  Most and slang are available from:
+
+    ftp://space.mit.edu/pub/davis/
+    ftp://ftp.process.com/vms-freeware/narnia/
+
+=item 5 GNU PATCH and DIFFUTILS for VMS
+
+Patches to Perl are usually distributed as GNU unified or contextual diffs. 
+Such patches are created by the GNU diff program (part of the diffutils
+distribution) and applied with GNU patch.  VMS ports of these utilities are
+available here:
+
+    http://www.crinoid.com/utils/
+    http://www.openvms.compaq.com/freeware/
+
+=back
+
+Please note that UNZIP and GUNZIP are not the same thing (they work with
+different formats).  Many of the useful files from CPAN (the Comprehensive
+Perl Archive Network) are in *.tar.gz or *.tgz format (this includes copies 
+of the source code for perl as well as modules and scripts that you may 
+wish to add later) hence you probably want to have GUNZIP.EXE and 
+VMSTAR.EXE on your VMS machine.
+
+If you want to include socket support, you'll need a TCP/IP stack and either
+DEC C, or socket libraries.  See the "Socket Support (optional)" topic 
+for more details.
+
+=head1 Unpacking the Perl source code
+
+You may need to set up a foreign symbol for the unpacking utility of choice.
+
+If you unpack a perl source kit with a name containing multiple periods on
+an ODS-5 volume using recent versions of vmstar (e.g. V3.4 or later) you may
+need to be especially careful in unpacking the tape archive file.  Try to use
+the ODS-2 compatability qualifiers such as:
+
+    vmstar /extract/verbose/ods2 perl-V^.VIII^.III.tar
+
+or:
+
+    vmstar -xvof perl-5^.8^.8.tar
+
+If you neglected to use the /ODS2 qualifier or the -o switch then you
+could rename the source directory:
+
+    set security/protection=(o:rwed) perl-5^.8^.8.dir
+    rename perl-5^.8^.8.dir perl-5_8_8.dir
+
+Perl on VMS as of 5.8.8 does not completely handle extended file
+parse styles such as are encountered on ODS-5.  While it can be built,
+installed, and run on ODS-5 filesystems; it may encounter
+trouble with characters that are otherwise illegal on ODS-2
+volumes (notably the ^. escaped period sequence).
+
+=head1 Configuring the Perl build
+
+To configure perl (a necessary first step), issue the command
+
+   @ Configure
+
+from the top of an unpacked perl source directory.  You will be asked a 
+series of questions, and the answers to them (along with the capabilities 
+of your C compiler and network stack) will determine how perl is custom 
+built for your machine.
+
+If you have multiple C compilers installed, you'll have your choice of
+which one to use.  Various older versions of DEC C had some caveats, so if
+you're using a version older than 5.2, check the "DEC C Issues" section.
+
+If you have any symbols or logical names in your environment that may 
+interfere with the build or regression testing of perl then configure.com 
+will try to warn you about them.  If a logical name is causing
+you trouble but is in an LNM table that you do not have write access to
+then try defining your own to a harmless equivalence string in a table 
+such that it is resolved before the other (e.g. if TMP is defined in the
+SYSTEM table then try DEFINE TMP "NL:" or somesuch in your process table) 
+otherwise simply deassign the dangerous logical names.  The potentially 
+troublesome logicals and symbols are:
+
+    COMP    "LOGICAL"
+    EXT     "LOGICAL"
+    FOO     "LOGICAL"
+    LIB     "LOGICAL"
+    LIST    "LOGICAL"
+    MIME    "LOGICAL"
+    POSIX   "LOGICAL"
+    SYS     "LOGICAL"
+    T       "LOGICAL"
+    THREAD  "LOGICAL"
+    THREADS "LOGICAL"
+    TIME    "LOGICAL"
+    TMP     "LOGICAL"
+    UNICODE "LOGICAL"
+    UTIL    "LOGICAL"
+    TEST    "SYMBOL"
+
+As a handy shortcut, the command:
+
+    @ Configure "-des"
+
+(note the quotation marks and case) will choose reasonable defaults 
+automatically (it takes DEC C over Gnu C, DEC C sockets over SOCKETSHR 
+sockets, and either over no sockets).  Some options can be given
+explicitly on the command line; the following example specifies a 
+non-default location for where Perl will be installed:
+
+    @ Configure "-d" "-Dprefix=dka100:[utils.perl5.]"
+
+Note that the installation location would be by default where you unpacked 
+the source with a "_ROOT." appended.  For example if you unpacked the perl 
+source into:
+
+   DKA200:[PERL-5_10_2...]
+
+Then the PERL_SETUP.COM that gets written out by CONFIGURE.COM will
+try to DEFINE your installation PERL_ROOT to be:
+
+   DKA200:[PERL-5_10_2_ROOT.]
+
+More help with configure.com is available from:
+
+    @ Configure "-h"
+
+See the "Changing compile-time options (optional)" section below to learn
+even more details about how to influence the outcome of the important 
+configuration step.  If you find yourself reconfiguring and rebuilding 
+then be sure to also follow the advice in the "Cleaning up and starting 
+fresh (optional)" and the checklist of items in the "CAVEATS" sections 
+below.
+
+=head2 Changing compile-time options (optional) for Perl on VMS
+
+Most of the user definable features of Perl are enabled or disabled in
+configure.com, which processes the hints file config_h.SH.  There is
+code in there to Do The Right Thing, but that  may end up being the
+wrong thing for you.  Make sure you understand what you are doing since
+inappropriate changes to configure.com or config_h.SH can render perl 
+unbuildable; odds are that there's nothing in there you'll need to
+change.
+
+The one exception is the various *DIR install locations. Changing those
+requires changes in genconfig.pl as well.  Be really careful if you need to
+change these, as they can cause some fairly subtle problems.
+
+=head2 Socket Support (optional) for Perl on VMS
+
+Perl includes a number of functions for IP sockets, which are available if
+you choose to compile Perl with socket support.  Since IP networking is an 
+optional addition to VMS, there are several different IP stacks available.  
+How well integrated they are into the system depends on the stack, your 
+version of VMS, and the version of your C compiler.
+
+The most portable solution uses the SOCKETSHR library. In combination with
+either UCX or NetLib, this supports all the major TCP stacks (Multinet,
+Pathways, TCPWare, UCX, and CMU) on all versions of VMS Perl runs on, with
+all the compilers on both VAX and Alpha. The socket interface is also
+consistent across versions of VMS and C compilers. It has a problem with
+UDP sockets when used with Multinet, though, so you should be aware of
+that.
+
+The other solution available is to use the socket routines built into DEC
+C. Which routines are available depend on the version of VMS you're
+running, and require proper UCX emulation by your TCP/IP vendor.
+Relatively current versions of Multinet, TCPWare, Pathway, and UCX all
+provide the required libraries--check your manuals or release notes to see
+if your version is new enough.
+
+=head1 Building Perl
+
+The configuration script will print out, at the very end, the MMS or MMK
+command you need to compile perl.  Issue it (exactly as printed) to start
+the build.  
+
+Once you issue your MMS or MMK command, sit back and wait.  Perl should 
+compile and link without a problem.  If a problem does occur check the 
+"CAVEATS" section of this document.  If that does not help send some 
+mail to the VMSPERL mailing list.  Instructions are in the "Mailing Lists" 
+section of this document.
+
+=head1 Testing Perl
+
+Once Perl has built cleanly you need to test it to make sure things work.
+This step is very important since there are always things that can go wrong
+somehow and yield a dysfunctional Perl for you.
+
+Testing is very easy, though, as there's a full test suite in the perl
+distribution.  To run the tests, enter the *exact* MMS line you used to
+compile Perl and add the word "test" to the end, like this:
+
+If the compile command was:
+
+    MMS
+
+then the test command ought to be:
+
+    MMS test
+
+MMS (or MMK) will run all the tests.  This may take some time, as there are 
+a lot of tests.  If any tests fail, there will be a note made on-screen. 
+At the end of all the tests, a summary of the tests, the number passed and 
+failed, and the time taken will be displayed.
+
+The test driver invoked via MMS TEST has a DCL wrapper ([.VMS]TEST.COM) that
+downgrades privileges to NETMBX, TMPMBX for the duration of the test run,
+and then restores them to their prior state upon completion of testing. 
+This is done to ensure that the tests run in a private sandbox and can do no
+harm to your system even in the unlikely event something goes badly wrong in
+one of the test scripts while running the tests from a privileged account. 
+A side effect of this safety precaution is that the account used to run the
+test suite must be the owner of the directory tree in which Perl has been
+built; otherwise the manipulations of temporary files and directories
+attempted by some of the tests will fail.
+
+If any tests fail, it means something is wrong with Perl. If the test suite
+hangs (some tests can take upwards of two or three minutes, or more if
+you're on an especially slow machine, depending on your machine speed, so
+don't be hasty), then the test *after* the last one displayed failed. Don't
+install Perl unless you're confident that you're OK. Regardless of how
+confident you are, make a bug report to the VMSPerl mailing list.
+
+If one or more tests fail, you can get more information on the failure by 
+issuing this command sequence:
+
+    @ [.VMS]TEST .typ "" "-v" [.subdir]test.T
+
+where ".typ" is the file type of the Perl images you just built (if you
+didn't do anything special, use .EXE), and "[.subdir]test.T" is the test
+that failed. For example, with a normal Perl build, if the test indicated
+that t/op/time failed, then you'd do this:
+
+    @ [.VMS]TEST .EXE "" "-v" [.OP]TIME.T
+
+Note that test names are reported in UNIX syntax and relative to the
+top-level build directory.  When supplying them individually to the test
+driver, you can use either UNIX or VMS syntax, but you must give the path
+relative to the [.T] directory and you must also add the .T extension to the
+filename.  So, for example if the test lib/Math/Trig fails, you would run:
+
+    @ [.VMS]TEST .EXE "" -"v" [-.lib.math]trig.t
+
+When you send in a bug report for failed tests, please include the output
+from this command, which is run from the main source directory:
+
+    MCR []MINIPERL "-V"
+
+Note that -"V" really is a capital V in double quotes. This will dump out a
+couple of screens worth of configuration information, and can help us 
+diagnose the problem.  If (and only if) that did not work then try enclosing 
+the output of:
+
+    MMS printconfig
+
+If (and only if) that did not work then try enclosing the output of:
+
+    @ [.vms]myconfig
+
+You may also be asked to provide your C compiler version ("CC/VERSION NL:" 
+with DEC C, "gcc --version" with GNU CC).  To obtain the version of MMS or 
+MMK you are running try "MMS/ident" or "MMK /ident".  The GNU make version 
+can be identified with "make --version".
+
+=head2 Cleaning up and starting fresh (optional) installing Perl on VMS
+
+If you need to recompile from scratch, you have to make sure you clean up
+first.  There is a procedure to do it--enter the *exact* MMS line you used 
+to compile and add "realclean" at the end, like this:
+
+if the compile command was:
+
+    MMS
+
+then the cleanup command ought to be:
+
+    MMS realclean
+
+If you do not do this things may behave erratically during the subsequent 
+rebuild attempt.  They might not, too, so it is best to be sure and do it.
+
+=head1 Installing Perl
+
+There are several steps you need to take to get Perl installed and
+running.
+
+=over 4
+
+=item 1
+
+Check your default file protections with
+
+     SHOW PROTECTION /DEFAULT
+
+and adjust if necessary with SET PROTECTION=(code)/DEFAULT.
+
+=item 2
+
+Decide where you want Perl to be installed (unless you have already done so
+by using the "prefix" configuration parameter -- see the example in the
+"Configuring the Perl build" section).
+
+The DCL script PERL_SETUP.COM that is written by CONFIGURE.COM will help you
+with the definition of the PERL_ROOT and PERLSHR logical names and the PERL
+foreign command  symbol.  Take a look at PERL_SETUP.COM and modify it if you
+want to.  The installation process will execute PERL_SETUP.COM and copy
+files to the directory tree pointed to by the PERL_ROOT logical name defined
+there, so make sure that you have write access to the parent directory of
+what will become the root of your Perl installation.
+
+=item 3
+
+Run the install script via:
+
+    MMS install
+
+or
+
+    MMK install
+
+If for some reason it complains about target INSTALL being up to date,
+throw a /FORCE switch on the MMS or MMK command.
+
+=back
+
+Copy PERL_SETUP.COM to a place accessible to your perl users.  
+
+For example:
+
+    COPY PERL_SETUP.COM SYS$LIBRARY: 
+
+If you want to have everyone on the system have access to perl
+then add a line that reads
+
+    $ @sys$library:perl_setup
+
+to SYS$MANAGER:SYLOGIN.COM.
+
+Two alternatives to the foreign symbol would be to install PERL into 
+DCLTABLES.EXE (Check out the section "Installing Perl into DCLTABLES 
+(optional)" for more information), or put the image in a 
+directory that's in your DCL$PATH (if you're using VMS V6.2 or higher).
+
+An alternative to having PERL_SETUP.COM define the PERLSHR logical name
+is to simply copy it into the system shareable library directory with:
+
+    copy perl_root:[000000]perlshr.exe sys$share:
+
+See also the "INSTALLing images (optional)" section.
+
+=head2 Installing Perl into DCLTABLES (optional) on VMS
+
+Execute the following command file to define PERL as a DCL command.
+You'll need CMKRNL privilege to install the new dcltables.exe.
+
+    $ create perl.cld
+    !
+    ! modify to reflect location of your perl.exe
+    !
+    define verb perl
+      image perl_root:[000000]perl.exe
+      cliflags (foreign)
+    $!
+    $ set command perl /table=sys$common:[syslib]dcltables.exe -
+     /output=sys$common:[syslib]dcltables.exe
+    $ install replace sys$common:[syslib]dcltables.exe
+    $ exit
+
+=head2 INSTALLing Perl images (optional) on VMS
+
+On systems that are using perl quite a bit, and particularly those with 
+minimal RAM, you can boost the performance of perl by INSTALLing it as
+a known image.  PERLSHR.EXE is typically larger than 3000 blocks
+and that is a reasonably large amount of IO to load each time perl is 
+invoked. 
+
+   INSTALL ADD PERLSHR/SHARE
+   INSTALL ADD PERL/HEADER
+
+should be enough for PERLSHR.EXE (/share implies /header and /open), 
+while /HEADER should do for PERL.EXE (perl.exe is not a shared image).
+
+If your code 'use's modules, check to see if there is a shareable image for
+them, too.  In the base perl build, POSIX, IO, Fcntl, Opcode, SDBM_File,
+DCLsym, and Stdio, and other extensions all have shared images that can be
+installed /SHARE.
+
+How much of a win depends on your memory situation, but if you are firing
+off perl with any regularity (like more than once every 20 seconds or so)
+it is probably beneficial to INSTALL at least portions of perl.
+
+While there is code in perl to remove privileges as it runs you are advised
+to NOT INSTALL PERL.EXE with PRIVs!
+
+=head2 Running h2ph to create perl header files (optional) on VMS
+
+If using DEC C or Compaq C ensure that you have extracted loose versions
+of your compiler's header or *.H files.  Be sure to check the contents of:
+
+    SYS$LIBRARY:DECC$RTLDEF.TLB
+    SYS$LIBRARY:SYS$LIB_C.TLB
+    SYS$LIBRARY:SYS$STARLET_C.TLB
+
+etcetera.
+
+If using GNU cc then also check your GNU_CC:[000000...] tree for the locations
+of the GNU cc headers.
+
+=head1 Reporting Bugs
+
+If you come across what you think might be a bug in Perl, please report
+it. There's a script in PERL_ROOT:[UTILS], perlbug, that walks you through
+the process of creating a bug report. This script includes details of your
+installation, and is very handy. Completed bug reports should go to
+perlbug@perl.com.
+
+=head1 CAVEATS
+
+Probably the single biggest gotcha in compiling Perl is giving the wrong
+switches to MMS/MMK when you build. Use *exactly* what the configure.com 
+script prints!
+
+The next big gotcha is directory depth.  Perl can create directories four,
+five, or even six levels deep during the build, so you don't have to be 
+too deep to start to hit the RMS 8 level limit (for ODS 2 volumes which were
+common on versions of VMS prior to V7.2 and even with V7.2 on the VAX).  
+It is best to do:
+
+    DEFINE/TRANS=(CONC,TERM) PERLSRC "disk:[dir.dir.dir.perldir.]"
+    SET DEFAULT PERLSRC:[000000]
+
+before building in cases where you have to unpack the distribution so deep
+(note the trailing period in the definition of PERLSRC).  Perl modules 
+from CPAN can be just as bad (or worse), so watch out for them, too. Perl's
+configuration script will warn if it thinks you are too deep (at least on 
+a VAX or on Alpha versions of VMS prior to 7.2).  But MakeMaker will not 
+warn you if you start out building a module too deep in a directory.
+
+As noted above ODS-5 escape sequences such as ^. can break the perl
+build.  Solutions include renaming files and directories as needed or
+being careful to use the -o switch or /ODS2 qualifier with latter
+versions of the vmstar utility when unpacking perl or CPAN modules
+on ODS-5 volumes.
+
+Be sure that the process that you use to build perl has a PGFLQ greater
+than 100000.  Be sure to have a correct local time zone to UTC offset
+defined (in seconds) in the logical name SYS$TIMEZONE_DIFFERENTIAL before
+running the regression test suite.  The SYS$MANAGER:UTC$CONFIGURE_TDF.COM 
+procedure will help you set that logical for your system but may require 
+system privileges.  For example, a location 5 hours west of UTC (such as 
+the US East coast while not on daylight savings time) would have:
+
+    DEFINE SYS$TIMEZONE_DIFFERENTIAL "-18000"
+
+A final thing that causes trouble is leftover pieces from a failed
+build.  If things go wrong make sure you do a "(MMK|MMS|make) realclean"
+before you rebuild.
+
+=head2 DEC C issues with Perl on VMS
+
+Note to DEC C users: Some early versions (pre-5.2, some pre-4. If you're DEC
+C 5.x or higher, with current patches if any, you're fine) of the DECCRTL
+contained a few bugs which affect Perl performance:
+
+=over 4
+
+=item - pipes
+
+Newlines are lost on I/O through pipes, causing lines to run together.
+This shows up as RMS RTB errors when reading from a pipe.  You can
+work around this by having one process write data to a file, and
+then having the other read the file, instead of the pipe.  This is
+fixed in version 4 of DEC C.
+
+=item - modf()
+
+The modf() routine returns a non-integral value for some values above
+INT_MAX; the Perl "int" operator will return a non-integral value in
+these cases.  This is fixed in version 4 of DEC C.
+
+=item - ALPACRT ECO
+
+On the AXP, if SYSNAM privilege is enabled, the CRTL chdir() routine
+changes the process default device and directory permanently, even
+though the call specified that the change should not persist after
+Perl exited.  This is fixed by DEC CSC patch ALPACRT04_061 or later.
+See also:
+
+    http://ftp.support.compaq.com/patches/.new/openvms.shtml
+
+=back
+
+Please note that in later versions "DEC C" may also be known as 
+"Compaq C".
+
+=head2 GNU issues with Perl on VMS
+
+It has been a while since the GNU utilities such as GCC or GNU make
+were used to build perl on VMS.  Hence they may require a great deal
+of source code modification to work again.
+
+    http://slacvx.slac.stanford.edu/HELP/GCC
+    http://www.progis.de/
+    http://www.lp.se/products/gnu.html
+
+=head2 Floating Point Considerations
+
+Prior to 5.8.0, Perl simply accepted the default floating point options of the
+C compiler, namely representing doubles with D_FLOAT on VAX and G_FLOAT on
+Alpha.  Single precision floating point values are represented in F_FLOAT
+format when either D_FLOAT or G_FLOAT is in use for doubles.  Beginning with
+5.8.0, Alpha builds now use IEEE floating point formats by default, which in
+VMS parlance are S_FLOAT for singles and T_FLOAT for doubles.  IEEE is not
+available on VAX, so F_FLOAT and D_FLOAT remain the defaults for singles and
+doubles respectively.  The available non-default options are G_FLOAT on VAX
+and D_FLOAT or G_FLOAT on Alpha.
+
+The use of IEEE on Alpha introduces NaN, infinity, and denormalization
+capabilities not available with D_FLOAT and G_FLOAT.  When using one of those
+non-IEEE formats, silent underflow and overflow are emulated in the conversion
+of strings to numbers, but it is preferable to get the real thing by using
+IEEE where possible.
+
+Regardless of what floating point format you consider preferable, be aware
+that the choice may have an impact on compatibility with external libraries,
+such as database interfaces, and with existing data, such as data created with
+the C<pack> function and written to disk, or data stored via the Storable
+extension.  For example, a C<pack("d", $foo)")> will create a D_FLOAT,
+G_FLOAT, or T_FLOAT depending on what your Perl was configured with.  When
+written to disk, the value can only be retrieved later by a Perl configured
+with the same floating point option that was in effect when it was created.
+
+To obtain a non-IEEE build on Alpha, simply answer no to the "Use IEEE math?"
+question during the configuration.  To obtain an option different from the C
+compiler default on either VAX or Alpha, put in the option that you want in
+answer to the "Any additional cc flags?" question.  For example, to obtain a
+G_FLOAT build on VAX, put in C</FLOAT=G_FLOAT>.
+
+=head2 Multinet issues with Perl on VMS
+
+Prior to the release of Perl 5.8.0 it was noted that the regression
+test for lib/Net/hostent (in file [.lib.Net]hostent.t) will fail owing
+to problems with the hostent structure returned by C calls to either
+gethostbyname() or gethostbyaddr() using DEC or Compaq C with a
+Multinet TCP/IP stack.  The problem was noted in Multinet 4.3A
+using either Compaq C 6.5 or DEC C 6.0, and with Multinet 4.2A
+using DEC C 5.2, but could easily affect other versions of Multinet.
+Process Software Inc. has acknowledged a bug in the Multinet version 
+of UCX$IPC_SHR and has provided an ECO for it. The ECO is called
+UCX_LIBRARY_EMULATION-010_A044 and is available from:
+
+    http://www.multinet.process.com/eco.html
+
+As of this writing, the ECO is only available for Multinet versions 
+4.3A and later.  You may determine the version of Multinet that you 
+are running using the command:
+
+    multinet show /version
+
+from the DCL command prompt.
+
+If the ECO is unavailable for your version of Multinet and you are 
+unable to upgrade, you might try using Perl programming constructs 
+such as:
+
+    $address = substr($gethostbyname_addr,0,4);
+
+to temporarily work around the problem, or if you are brave
+and do not mind the possibility of breaking IPv6 addresses,
+you might modify the pp_sys.c file to add an ad-hoc correction
+like so:
+
+
+    --- pp_sys.c;1        Thu May 30 14:42:17 2002
+    +++ pp_sys.c        Thu May 30 12:54:02 2002
+    @@ -4684,6 +4684,10 @@
+             }
+     #endif
+
+    +    if (hent) {
+    +        hent->h_length = 4;
+    +    }
+    +
+         if (GIMME != G_ARRAY) {
+             PUSHs(sv = sv_newmortal());
+             if (hent) {
+
+then re-compile and re-test your perl.  After the installation
+of the Multinet ECO you ought to back out any such changes though.
+
+=head1 Mailing Lists
+
+There are several mailing lists available to the Perl porter.  For VMS
+specific issues (including both Perl questions and installation problems)
+there is the VMSPERL mailing list.  It is usually a low-volume (10-12
+messages a week) mailing list.
+
+To subscribe, send a mail message to VMSPERL-SUBSCRIBE@PERL.ORG. The VMSPERL
+mailing list address is VMSPERL@PERL.ORG.  Any mail sent there gets echoed
+to all subscribers of the list.  There is a searchable archive of the list
+on the web at:
+
+    http://www.xray.mpe.mpg.de/mailing-lists/vmsperl/
+
+To unsubscribe from VMSPERL send a message to VMSPERL-UNSUBSCRIBE@PERL.ORG.
+Be sure to do so from the subscribed account that you are canceling.
+
+=head2 Web sites for Perl on VMS
+
+Vmsperl pages on the web include:
+
+    http://www.sidhe.org/vmsperl/index.html
+    http://www.crinoid.com/
+    http://duphy4.physics.drexel.edu/pub/cgi_info.htmlx
+    http://www.cpan.org/modules/by-module/VMS/
+    http://www.xray.mpe.mpg.de/mailing-lists/vmsperl/
+    http://www.best.com/~pvhp/vms/
+    http://www-ang.kfunigraz.ac.at/~binder/perl.html
+    http://lists.perl.org/showlist.cgi?name=vmsperl
+    http://archive.develooper.com/vmsperl@perl.org/
+    http://www.openvms.compaq.com/openvms/products/ips/apache/csws_modperl.html
+
+=head1 SEE ALSO
+
+Perl information for users and programmers about the port of perl to VMS is
+available from the [.VMS]PERLVMS.POD file that gets installed as L<perlvms>.
+For administrators the perlvms document also includes a detailed discussion 
+of extending vmsperl with CPAN modules after Perl has been installed.
+
+=head1 AUTHORS
+
+Revised 10-October-2001 by Craig Berry craigberry@mac.com.  
+Revised 25-February-2000 by Peter Prymmer pvhp@best.com.  
+Revised 27-October-1999 by Craig Berry craigberry@mac.com.  
+Revised 01-March-1999 by Dan Sugalski dan@sidhe.org.  
+Originally by Charles Bailey bailey@newman.upenn.edu.
+
+=head1 ACKNOWLEDGEMENTS
+
+A real big thanks needs to go to Charles Bailey
+bailey@newman.upenn.edu, who is ultimately responsible for Perl 5.004
+running on VMS. Without him, nothing the rest of us have done would be at
+all important.
+
+There are, of course, far too many people involved in the porting and testing
+of Perl to mention everyone who deserves it, so please forgive us if we've
+missed someone.  That said, special thanks are due to the following:
+
+  Tim Adye T.J.Adye@rl.ac.uk
+     for the VMS emulations of getpw*()
+  David Denholm denholm@conmat.phys.soton.ac.uk
+     for extensive testing and provision of pipe and SocketShr code,
+  Mark Pizzolato mark@infocomm.com
+     for the getredirection() code
+  Rich Salz rsalz@bbn.com
+     for readdir() and related routines
+  Peter Prymmer pvhp@best.com 
+     for extensive testing, as well as development work on
+     configuration and documentation for VMS Perl,
+  Dan Sugalski dan@sidhe.org
+     for extensive contributions to recent version support,
+     development of VMS-specific extensions, and dissemination
+     of information about VMS Perl,
+  the Stanford Synchrotron Radiation Laboratory and the
+     Laboratory of Nuclear Studies at Cornell University for
+     the opportunity to test and develop for the AXP,
+  John Hasstedt John.Hasstedt@sunysb.edu
+     for VAX VMS V7.2 support
+
+and to the entire VMSperl group for useful advice and suggestions.  In
+addition the perl5-porters deserve credit for their creativity and
+willingness to work with the VMS newcomers.  Finally, the greatest debt of
+gratitude is due to Larry Wall larry@wall.org, for having the ideas which
+have made our sleepless nights possible.
+
+Thanks,
+The VMSperl group
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvos.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvos.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlvos.pod	(revision 14489)
@@ -0,0 +1,369 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.vos - Perl for Stratus VOS
+
+=head1 SYNOPSIS
+
+This file contains notes for building perl on the Stratus VOS
+operating system.  Perl is a scripting or macro language that is
+popular on many systems.  See L<perlbook> for a number of good
+books on Perl.
+
+These are instructions for building Perl from source.  Most people can
+simply download a pre-compiled distribution from the VOS anonymous FTP
+site.  If you are running VOS Release 14.2.0 or earlier, download Perl
+from ftp://ftp.stratus.com/pub/vos/posix/alpha/alpha.html  If you are
+running VOS Release 14.3.0 or later, download Perl from
+ftp://ftp.stratus.com/pub/vos/posix/ga/ga.html  Instructions for
+unbundling the Perl distribution file are at
+ftp://ftp.stratus.com/pub/vos/utility/utility.html
+
+If you are running VOS Release 14.4.1 or later, you can obtain a
+pre-compiled, supported copy of perl by purchasing Release 2.0.1
+(or later) of the VOS GNU C++ and GNU Tools product from Stratus
+Technologies.
+
+=head2 Multiple methods to build perl for VOS
+
+If you elect to build perl from its source code, you have several
+different ways that you can build perl.  The method that you use
+depends on the version of VOS that you are using and on the
+architecture of your Stratus hardware platform.
+
+=over 5
+
+=item 1
+
+If you have a Stratus XA2000 (Motorola 68k-based) platform, you
+must build perl using the alpha version of VOS POSIX support and
+using the VOS Standard C Cross-compiler.  You must build perl on
+VOS Release 14.1.0 (or later) on an XA/R or Continuum platform.
+
+This version of perl is properly called "miniperl" because it
+does not contain the complete perl functionality.
+
+You must build perl with the compile_perl.cm command macro found
+in the vos subdirectory.
+
+=item 2
+
+If you have a Stratus XA/R (Intel i860-based) platform, you must
+build perl using the alpha version of VOS POSIX support and using
+the VOS Standard C compiler or cross-compiler.  You must build
+perl on VOS Release 14.1.0 (or later) on an XA/R or Continuum
+platform.
+
+This version of perl is properly called "miniperl" because it
+does not contain the complete perl functionality.
+
+You must build perl with the compile_perl.cm command macro found
+in the vos subdirectory.
+
+=item 3
+
+If you have a Stratus Continuum (PA-RISC-based) platform that is
+running a version of VOS earlier than VOS 14.3.0, you must build
+perl using the alpha version of VOS POSIX support and using the
+VOS Standard C compiler or cross-compiler.  You must build perl
+on VOS Release 14.1.0 (or later) on an XA/R or Continuum
+platform.
+
+This version of perl is properly called "miniperl" because it
+does not contain the complete perl functionality.
+
+You must build perl with the compile_perl.cm command macro found
+in the vos subdirectory.
+
+=item 4
+
+If you have a Stratus Continuum (PA-RISC-based) platform that is
+running VOS Release 14.3.0 through VOS Release 14.4.1, you must
+build perl using the generally-available version of VOS POSIX
+support, and using either the VOS Standard C compiler or the VOS
+GNU C compiler.  You must build perl on VOS Release 14.3.0 (or
+later) on a Continuum platform.
+
+This version of perl is properly called "miniperl" because it
+does not contain the complete perl functionality.
+
+You must build perl with the compile_perl.cm command macro found
+in the vos subdirectory.
+
+=item 5
+
+If you have a Stratus Continuum (PA-RISC-based) platform that is
+running VOS Release 14.5.0 or later, you can either use the
+previous method to build "miniperl" or you can build "full
+perl", which contains the complete functionality of perl.  I
+strongly recommend that you build full perl.  To build full
+perl, you must use the generally-available version of VOS POSIX
+support.  You must use the VOS GNU C compiler and the VOS GNU
+C/C++ and GNU Tools Release 2.0.1 (or later) product.  You must
+build full perl on VOS Release 14.5.0 (or later) on a Continuum
+platform.
+
+You must build full perl with the compile_full_perl.cm command
+macro found in the vos subdirectory.
+
+=back
+
+=head2 Stratus POSIX Support
+
+Note that there are two different implementations of POSIX.1
+support on VOS.  There is an alpha version of POSIX that is
+available from the Stratus anonymous ftp site
+( ftp://ftp.stratus.com/pub/vos/posix/alpha/alpha.html ).  There
+is a generally-available version of POSIX that comes with VOS
+Release 14.3.0 or higher.  This port of POSIX will compile and
+bind with either version of POSIX.
+
+Most of the Perl features should work on VOS regardless of which
+version of POSIX that you are using.  However, the alpha version
+of POSIX is missing a number of key functions, and therefore any
+attempt by perl.pm to call the following unimplemented POSIX
+functions will result in an error message and an immediate and
+fatal call to the VOS debugger.  They are "dup", "fork", and
+"waitpid".  The lack of these functions prevents you from
+starting VOS commands and grabbing their output in perl.  The
+workaround is to run the commands outside of perl, then have perl
+process the output file.  These functions are all available in
+the generally-available version of POSIX.
+
+=head1 INSTALLING PERL IN VOS
+
+=head2 Compiling Perl 5 on VOS
+
+Before you can build Perl 5 on VOS, you need to have or acquire the
+following additional items.
+
+=over 5
+
+=item 1
+
+The VOS Standard C Compiler (or the VOS Standard C
+Cross-Compiler) and the VOS C Runtime.  If you are using
+the generally-available version of POSIX support, you may
+instead use the VOS GNU C/C++ Compiler.  These are
+standard Stratus products.
+
+=item 2
+
+Either the VOS OS TCP/IP or STCP product set.  If you are
+building with the alpha version of POSIX you need the OS
+TCP/IP product set.  If you are building with the
+generally-available version of POSIX you need the STCP
+product set.  These are standard Stratus products.
+
+=item 3
+
+Either the alpha or generally-available version of the VOS
+POSIX.1 environment.
+
+The alpha version of POSIX.1 support is available on the
+Stratus FTP site.  Login anonymously to ftp.stratus.com and
+get the file /pub/vos/posix/alpha/posix.save.evf.gz in
+binary file-transfer mode.  Or use the Uniform Resource
+Locator (URL)
+ftp://ftp.stratus.com/pub/vos/posix/alpha/posix.save.evf.gz from
+your web browser.  Instructions for unbundling this file
+are at ftp://ftp.stratus.com/pub/vos/utility/utility.html
+This is NOT a standard Stratus product.
+
+In VOS Release 14.3.0, the generally-available version of
+POSIX.1 support is bundled with the VOS Standard C compiler
+(or Standard C Cross-Compiler).  In VOS Release 14.4.0 or
+higher, it is also bundled with the VOS C Runtime.  These
+are standard Stratus products.
+
+=item 4
+
+You must compile this version of Perl 5 on VOS Release
+14.1.0 or higher because some of the perl source files
+contain more than 32,767 source lines.  Due to VOS
+release-compatibility rules, this port of perl may not
+execute on VOS Release 12 or earlier.
+
+=item 5
+
+If you are using the generally-available version of VOS POSIX
+support, then you should also acquire the VOS GNU C/C++ Compiler
+and GNU Tools product.  When perl is built with this version of
+POSIX support, it assumes that it can find "bash", "sed" and
+other POSIX-compatible commands in the directory
+/system/gnu_library/bin.
+
+=back
+
+To build perl using the supplied VOS command macros, change to
+the "vos" subdirectory and type the command "compile_perl
+-processor X", where X is the processor type (mc68020, i80860,
+pa7100, pa8000) that you wish to use.  Note that the
+generally-available version of POSIX.1 support is not available
+for the mc68020 or i80860 processors.
+
+Use the "-version alpha" control argument to build perl with
+the alpha version of POSIX support, and use the "-version
+ga" control argument to build it with the
+generally-available version of POSIX.  The default is "ga".
+
+Use the "-compiler cc" control argument to build perl with
+the VOS Standard C compiler.  Use the "-compiler gcc"
+control argument to build it with the GNU GCC compiler.  The
+default is "cc".
+
+You must have purchased the VOS Standard C Cross Compiler in
+order to compile perl for a processor type that is different
+from the processor type of the module.
+
+Note that code compiled for the pa7100 processor type can
+execute on the PA7100, PA8000, PA8500 and PA8600 processors, and
+that code compiled for the pa8000 processor type can execute on
+the PA8000, PA8500 and PA8600 processors.
+
+To build full perl using the supplied Configure script and
+makefiles, change to the "vos" subdirectory and type the command
+"compile_full_perl" or "start_process compile_full_perl".  This
+will configure, build, and test perl.
+
+=head2 Installing Perl 5 on VOS
+
+=over 4
+
+=item 1
+
+If you have built perl using the Configure script, ensure that
+you have modify permission to C<< >system>ported >> and type
+
+     gmake install
+
+=item 2
+
+If you have built perl using any of the other methods, type
+
+     install_perl -processor PROCESSOR -name NAME
+
+where PROCESSOR is mc68020, i80860, pa7100, or pa8000, as
+appropriate, and NAME is perl or perl5, according to which name
+you wish to use.
+
+This command macro will install perl and all of its related
+files in the proper directories.
+
+=item 3
+
+While there are currently no architecture-specific
+extensions or modules distributed with perl, the following
+directories can be used to hold such files:
+
+     >system>ported>lib>perl5>5.8.0>68k
+     >system>ported>lib>perl5>5.8.0>860
+     >system>ported>lib>perl5>5.8.0>7100
+     >system>ported>lib>perl5>5.8.0>8000
+
+=item 4
+
+Site-specific perl extensions and modules can be installed in one of
+two places.  Put architecture-independent files into:
+
+     >system>ported>lib>perl5>site_perl>5.8.0
+
+Put site-specific architecture-dependent files into one of the
+following directories:
+
+     >system>ported>lib>perl5>site_perl>5.8.0>68k
+     >system>ported>lib>perl5>site_perl>5.8.0>860
+     >system>ported>lib>perl5>site_perl>5.8.0>7100
+     >system>ported>lib>perl5>site_perl>5.8.0>8000
+
+=item 5
+
+You can examine the @INC variable from within a perl program
+to see the order in which Perl searches these directories.
+
+=back
+
+=head1 USING PERL IN VOS
+
+=head2 Unimplemented Features of Perl on VOS
+
+If perl is built with the alpha version of VOS POSIX.1 support
+and if it attempts to call an unimplemented VOS POSIX.1
+function, it will print a fatal error message and enter the VOS
+debugger.  This error is not recoverable.  See vos_dummies.c for
+a list of the unimplemented POSIX.1 functions.  To see what
+functions are unimplemented and what the error message looks
+like, compile and execute "test_vos_dummies.c".
+
+=head2 Restrictions of Perl on VOS
+
+This port of Perl version 5 to VOS prefers Unix-style,
+slash-separated pathnames over VOS-style greater-than-separated
+pathnames.  VOS-style pathnames should work in most contexts, but
+if you have trouble, replace all greater-than characters by slash
+characters.  Because the slash character is used as a pathname
+delimiter, Perl cannot process VOS pathnames containing a slash
+character in a directory or file name; these must be renamed.
+
+This port of Perl also uses Unix-epoch date values internally.
+As long as you are dealing with ASCII character string
+representations of dates, this should not be an issue.  The
+supported epoch is January 1, 1980 to January 17, 2038.
+
+See the file pod/perlport.pod for more information about the VOS
+port of Perl.
+
+=head2 Handling of underflow and overflow
+
+Prior to VOS Release 14.7.0, VOS does not support automatically
+mapping overflowed floating-point values to +infinity, nor
+automatically mapping underflowed floating-point values to zero,
+unlike many other platforms.  The Perl pack function has been
+modified to perform such mapping in software on VOS.  Performing
+other floating-point computations that underflow or overflow
+will probably result in SIGFPE.  Don't push your luck.
+
+As of VOS Release 14.7.0, the VOS POSIX runtime sets up the
+PA-RISC hardware floating-point status register so that the
+overflow and underflow exceptions do not trap, but instead
+automatically convert the result to infinity or zero, as
+appropriate.  As of this writing, there are still floating-point
+operations that can trap, for example, subtracting two infinite
+values.  This is recorded as suggestion posix-1022, which is not
+yet fixed.
+
+=head1 TEST STATUS
+
+When Perl 5.8.3 is built using the native build process on VOS
+Release 14.7.0 and GNU C++/GNU Tools 2.0.2a, all but three
+attempted tests either pass or result in TODO (ignored)
+failures.  The tests that fail are:
+
+t/io/tell.t, test 28
+t/op/pack.t, test 39
+lib/Net/ing/t/450_service.t, test 8
+
+=head1 SUPPORT STATUS
+
+I'm offering this port "as is".  You can ask me questions, but I
+can't guarantee I'll be able to answer them.  There are some
+excellent books available on the Perl language; consult a book
+seller.
+
+If you want a supported version of perl for VOS, purchase the
+VOS GNU C++ and GNU Tools Release 2.0.1 (or later) product from
+Stratus Technologies, along with a support contract (or from
+anyone else who will sell you support).
+
+=head1 AUTHOR
+
+Paul Green (Paul.Green@stratus.com)
+
+=head1 LAST UPDATE
+
+January 15, 2004
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlwin32.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlwin32.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlwin32.pod	(revision 14489)
@@ -0,0 +1,924 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+perlwin32 - Perl under Windows
+
+=head1 SYNOPSIS
+
+These are instructions for building Perl under Windows 9x/NT/2000/XP
+on the Intel x86 and Itanium architectures.
+
+=head1 DESCRIPTION
+
+Before you start, you should glance through the README file
+found in the top-level directory to which the Perl distribution
+was extracted.  Make sure you read and understand the terms under
+which this software is being distributed.
+
+Also make sure you read L<BUGS AND CAVEATS> below for the
+known limitations of this port.
+
+The INSTALL file in the perl top-level has much information that is
+only relevant to people building Perl on Unix-like systems.  In
+particular, you can safely ignore any information that talks about
+"Configure".
+
+You may also want to look at two other options for building
+a perl that will work on Windows NT:  the README.cygwin and
+README.os2 files, each of which give a different set of rules to
+build a Perl that will work on Win32 platforms.  Those two methods
+will probably enable you to build a more Unix-compatible perl, but
+you will also need to download and use various other build-time and
+run-time support software described in those files.
+
+This set of instructions is meant to describe a so-called "native"
+port of Perl to Win32 platforms.  This includes both 32-bit and
+64-bit Windows operating systems.  The resulting Perl requires no
+additional software to run (other than what came with your operating
+system).  Currently, this port is capable of using one of the
+following compilers on the Intel x86 architecture:
+
+      Borland C++           version 5.02 or later
+      Microsoft Visual C++  version 2.0 or later
+      MinGW with gcc        gcc version 2.95.2 or later
+
+The last of these is a high quality freeware compiler.  Use version
+3.2.x or later for the best results with this compiler.
+
+The Borland C++ and Microsoft Visual C++ compilers are also now being given
+away free.  The Borland compiler is available as "Borland C++ Compiler Free
+Command Line Tools" and is the same compiler that ships with the full
+"Borland C++ Builder" product.  The Microsoft compiler is available as
+"Visual C++ Toolkit 2003", and also as part of the ".NET Framework SDK", and
+is the same compiler that ships with "Visual Studio .NET 2003 Professional".
+
+This port can also be built on the Intel IA64 using:
+
+      Microsoft Platform SDK	Nov 2001 (64-bit compiler and tools)
+
+The MS Platform SDK can be downloaded from http://www.microsoft.com/.
+
+This port fully supports MakeMaker (the set of modules that
+is used to build extensions to perl).  Therefore, you should be
+able to build and install most extensions found in the CPAN sites.
+See L<Usage Hints for Perl on Win32> below for general hints about this.
+
+=head2 Setting Up Perl on Win32
+
+=over 4
+
+=item Make
+
+You need a "make" program to build the sources.  If you are using
+Visual C++ or the Platform SDK tools under Windows NT/2000/XP, nmake
+will work.  All other builds need dmake.
+
+dmake is a freely available make that has very nice macro features
+and parallelability.
+
+A port of dmake for Windows is available from:
+
+    http://search.cpan.org/dist/dmake/
+
+Fetch and install dmake somewhere on your path.
+
+There exists a minor coexistence problem with dmake and Borland C++
+compilers.  Namely, if a distribution has C files named with mixed
+case letters, they will be compiled into appropriate .obj-files named
+with all lowercase letters, and every time dmake is invoked
+to bring files up to date, it will try to recompile such files again.
+For example, Tk distribution has a lot of such files, resulting in
+needless recompiles every time dmake is invoked.  To avoid this, you
+may use the script "sync_ext.pl" after a successful build.  It is
+available in the win32 subdirectory of the Perl source distribution.
+
+=item Command Shell
+
+Use the default "cmd" shell that comes with NT.  Some versions of the
+popular 4DOS/NT shell have incompatibilities that may cause you trouble.
+If the build fails under that shell, try building again with the cmd
+shell.
+
+The nmake Makefile also has known incompatibilities with the
+"command.com" shell that comes with Windows 9x.  You will need to
+use dmake and makefile.mk to build under Windows 9x.
+
+The surest way to build it is on Windows NT/2000/XP, using the cmd shell.
+
+Make sure the path to the build directory does not contain spaces.  The
+build usually works in this circumstance, but some tests will fail.
+
+=item Borland C++
+
+If you are using the Borland compiler, you will need dmake.
+(The make that Borland supplies is seriously crippled and will not
+work for MakeMaker builds.)
+
+See L</"Make"> above.
+
+=item Microsoft Visual C++
+
+The nmake that comes with Visual C++ will suffice for building.
+You will need to run the VCVARS32.BAT file, usually found somewhere
+like C:\MSDEV4.2\BIN or C:\Program Files\Microsoft Visual Studio\VC98\Bin.
+This will set your build environment.
+
+You can also use dmake to build using Visual C++; provided, however,
+you set OSRELEASE to "microsft" (or whatever the directory name
+under which the Visual C dmake configuration lives) in your environment
+and edit win32/config.vc to change "make=nmake" into "make=dmake".  The
+latter step is only essential if you want to use dmake as your default
+make for building extensions using MakeMaker.
+
+=item Microsoft Visual C++ Toolkit 2003
+
+This free toolkit contains the same compiler and linker that ship with
+Visual Studio .NET 2003 Professional, but doesn't contain everything
+necessary to build Perl.
+
+You will also need to download the "Platform SDK" (the "Core SDK" and "MDAC
+SDK" components are required) for header files, libraries and rc.exe, and
+".NET Framework SDK" for more libraries and nmake.exe.  Note that the latter
+(which also includes the free compiler and linker) requires the ".NET
+Framework Redistributable" to be installed first.  This can be downloaded and
+installed separately, but is included in the "Visual C++ Toolkit 2003" anyway.
+
+These packages can all be downloaded by searching in the Download Center at
+http://www.microsoft.com/downloads/search.aspx?displaylang=en.  (Providing exact
+links to these packages has proven a pointless task because the links keep on
+changing so often.)
+
+Try to obtain the latest version of the Platform SDK.  Sometimes these packages
+contain a particular Windows OS version in their name, but actually work on
+other OS versions too.  For example, the "Windows Server 2003 SP1 Platform SDK"
+also runs on Windows XP SP2 and Windows 2000.
+
+According to the download pages the Toolkit and the .NET Framework SDK are only
+supported on Windows 2000/XP/2003, so trying to use these tools on Windows
+95/98/ME and even Windows NT probably won't work.
+
+Install the Toolkit first, then the Platform SDK, then the .NET Framework SDK.
+Setup your environment as follows (assuming default installation locations
+were chosen):
+
+	SET PATH=%SystemRoot%\system32;%SystemRoot%;C:\Program Files\Microsoft Visual C++ Toolkit 2003\bin;C:\Program Files\Microsoft SDK\Bin;C:\Program Files\Microsoft.NET\SDK\v1.1\Bin
+	SET INCLUDE=C:\Program Files\Microsoft Visual C++ Toolkit 2003\include;C:\Program Files\Microsoft SDK\include;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include
+	SET LIB=C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib;C:\Program Files\Microsoft SDK\lib;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib
+
+Several required files will still be missing:
+
+=over 4
+
+=item *
+
+cvtres.exe is required by link.exe when using a .res file.  It is actually
+installed by the .NET Framework SDK, but into a location such as the
+following:
+
+	C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322
+
+Copy it from there to C:\Program Files\Microsoft SDK\Bin
+
+=item *
+
+lib.exe is normally used to build libraries, but link.exe with the /lib
+option also works, so change win32/config.vc to use it instead:
+
+Change the line reading:
+
+	ar='lib'
+
+to:
+
+	ar='link /lib'
+
+It may also be useful to create a batch file called lib.bat in
+C:\Program Files\Microsoft Visual C++ Toolkit 2003\bin containing:
+
+	@echo off
+	link /lib %*
+
+for the benefit of any naughty C extension modules that you might want to build
+later which explicitly reference "lib" rather than taking their value from
+$Config{ar}.
+
+=item *
+
+setargv.obj is required to build perlglob.exe (and perl.exe if the USE_SETARGV
+option is enabled).  The Platform SDK supplies this object file in source form
+in C:\Program Files\Microsoft SDK\src\crt.  Copy setargv.c, cruntime.h and
+internal.h from there to some temporary location and build setargv.obj using
+
+	cl.exe /c /I. /D_CRTBLD setargv.c
+
+Then copy setargv.obj to C:\Program Files\Microsoft SDK\lib
+
+Alternatively, if you don't need perlglob.exe and don't need to enable the
+USE_SETARGV option then you can safely just remove all mention of $(GLOBEXE)
+from win32/Makefile and setargv.obj won't be required anyway.
+
+=back
+
+Perl should now build using the win32/Makefile.  You will need to edit that
+file to set
+
+	CCTYPE = MSVC70FREE
+
+and to set CCHOME, CCINCDIR and CCLIBDIR as per the environment setup above.
+
+=item Microsoft Platform SDK 64-bit Compiler
+
+The nmake that comes with the Platform SDK will suffice for building
+Perl.  Make sure you are building within one of the "Build Environment"
+shells available after you install the Platform SDK from the Start Menu.
+
+=item MinGW release 3 with gcc
+
+The latest release of MinGW at the time of writing is 3.1.0, which contains
+gcc-3.2.3.  It can be downloaded here:
+
+    http://www.mingw.org/
+
+Perl also compiles with earlier releases of gcc (2.95.2 and up).  See below
+for notes about using earlier versions of MinGW/gcc.
+
+You also need dmake.  See L</"Make"> above on how to get it.
+
+=item MinGW release 1 with gcc
+
+The MinGW-1.1 bundle contains gcc-2.95.3.
+
+Make sure you install the binaries that work with MSVCRT.DLL as indicated
+in the README for the GCC bundle.  You may need to set up a few environment
+variables (usually ran from a batch file).
+
+There are a couple of problems with the version of gcc-2.95.2-msvcrt.exe
+released 7 November 1999:
+
+=over
+
+=item *
+
+It left out a fix for certain command line quotes.  To fix this, be sure
+to download and install the file fixes/quote-fix-msvcrt.exe from the above
+ftp location.
+
+=item *
+
+The definition of the fpos_t type in stdio.h may be wrong.  If your
+stdio.h has this problem, you will see an exception when running the
+test t/lib/io_xs.t.  To fix this, change the typedef for fpos_t from
+"long" to "long long" in the file i386-mingw32msvc/include/stdio.h,
+and rebuild.
+
+=back
+
+A potentially simpler to install (but probably soon-to-be-outdated) bundle
+of the above package with the mentioned fixes already applied is available
+here:
+
+    http://downloads.ActiveState.com/pub/staff/gsar/gcc-2.95.2-msvcrt.zip
+    ftp://ftp.ActiveState.com/pub/staff/gsar/gcc-2.95.2-msvcrt.zip
+
+=back
+
+=head2 Building
+
+=over 4
+
+=item *
+
+Make sure you are in the "win32" subdirectory under the perl toplevel.
+This directory contains a "Makefile" that will work with
+versions of nmake that come with Visual C++ or the Platform SDK, and
+a dmake "makefile.mk" that will work for all supported compilers.  The
+defaults in the dmake makefile are setup to build using MinGW/gcc.
+
+=item *
+
+Edit the makefile.mk (or Makefile, if you're using nmake) and change
+the values of INST_DRV and INST_TOP.   You can also enable various
+build flags.  These are explained in the makefiles.
+
+Note that it is generally not a good idea to try to build a perl with
+INST_DRV and INST_TOP set to a path that already exists from a previous
+build.  In particular, this may cause problems with the
+lib/ExtUtils/t/Embed.t test, which attempts to build a test program and
+may end up building against the installed perl's lib/CORE directory rather
+than the one being tested.
+
+You will have to make sure that CCTYPE is set correctly and that
+CCHOME points to wherever you installed your compiler.
+
+The default value for CCHOME in the makefiles for Visual C++
+may not be correct for some versions.  Make sure the default exists
+and is valid.
+
+You may also need to comment out the C<DELAYLOAD = ...> line in the
+Makefile if you're using VC++ 6.0 without the latest service pack and
+the linker reports an internal error.
+
+If you have either the source or a library that contains des_fcrypt(),
+enable the appropriate option in the makefile.  A ready-to-use version
+of fcrypt.c, based on the version originally written by Eric Young at
+ftp://ftp.funet.fi/pub/crypt/mirrors/dsi/libdes/, is bundled with the
+distribution and CRYPT_SRC is set to use it.
+Alternatively, if you have built a library that contains des_fcrypt(),
+you can set CRYPT_LIB to point to the library name.
+Perl will also build without des_fcrypt(), but the crypt() builtin will
+fail at run time.
+
+If you want build some core extensions statically into perl's dll, specify
+them in the STATIC_EXT macro.
+
+Be sure to read the instructions near the top of the makefiles carefully.
+
+=item *
+
+Type "dmake" (or "nmake" if you are using that make).
+
+This should build everything.  Specifically, it will create perl.exe,
+perl58.dll at the perl toplevel, and various other extension dll's
+under the lib\auto directory.  If the build fails for any reason, make
+sure you have done the previous steps correctly.
+
+=back
+
+=head2 Testing Perl on Win32
+
+Type "dmake test" (or "nmake test").  This will run most of the tests from
+the testsuite (many tests will be skipped).
+
+There should be no test failures when running under Windows NT/2000/XP.
+Many tests I<will> fail under Windows 9x due to the inferior command shell.
+
+Some test failures may occur if you use a command shell other than the
+native "cmd.exe", or if you are building from a path that contains
+spaces.  So don't do that.
+
+If you are running the tests from a emacs shell window, you may see
+failures in op/stat.t.  Run "dmake test-notty" in that case.
+
+If you're using the Borland compiler, you may see a failure in op/taint.t
+arising from the inability to find the Borland Runtime DLLs on the system
+default path.  You will need to copy the DLLs reported by the messages
+from where Borland chose to install it, into the Windows system directory
+(usually somewhere like C:\WINNT\SYSTEM32) and rerun the test.
+
+If you're using Borland compiler versions 5.2 and below, you may run into
+problems finding the correct header files when building extensions.  For
+example, building the "Tk" extension may fail because both perl and Tk
+contain a header file called "patchlevel.h".  The latest Borland compiler
+(v5.5) is free of this misbehaviour, and it even supports an
+option -VI- for backward (bugward) compatibility for using the old Borland
+search algorithm  to locate header files.
+
+If you run the tests on a FAT partition, you may see some failures for
+C<link()> related tests:
+
+    Failed Test                     Stat Wstat Total Fail  Failed  List
+
+    ../ext/IO/lib/IO/t/io_dup.t                    6    4  66.67%  2-5
+    ../lib/File/Temp/t/mktemp.t                    9    1  11.11%  2
+    ../lib/File/Temp/t/posix.t                     7    1  14.29%  3
+    ../lib/File/Temp/t/security.t                 13    1   7.69%  2
+    ../lib/File/Temp/t/tempfile.t                 20    2  10.00%  2 4
+    comp/multiline.t                               6    2  33.33%  5-6
+    io/dup.t                                       8    6  75.00%  2-7
+    op/write.t                                    47    7  14.89%  1-3 6 9-11
+
+Testing on NTFS avoids these errors.
+
+Furthermore, you should make sure that during C<make test> you do not
+have any GNU tool packages in your path: some toolkits like Unixutils
+include some tools (C<type> for instance) which override the Windows
+ones and makes tests fail. Remove them from your path while testing to
+avoid these errors.
+
+Please report any other failures as described under L<BUGS AND CAVEATS>.
+
+=head2 Installation of Perl on Win32
+
+Type "dmake install" (or "nmake install").  This will put the newly
+built perl and the libraries under whatever C<INST_TOP> points to in the
+Makefile.  It will also install the pod documentation under
+C<$INST_TOP\$INST_VER\lib\pod> and HTML versions of the same under
+C<$INST_TOP\$INST_VER\lib\pod\html>.
+
+To use the Perl you just installed you will need to add a new entry to
+your PATH environment variable: C<$INST_TOP\bin>, e.g.
+
+    set PATH=c:\perl\bin;%PATH%
+
+If you opted to uncomment C<INST_VER> and C<INST_ARCH> in the makefile
+then the installation structure is a little more complicated and you will
+need to add two new PATH components instead: C<$INST_TOP\$INST_VER\bin> and
+C<$INST_TOP\$INST_VER\bin\$ARCHNAME>, e.g.
+
+    set PATH=c:\perl\5.6.0\bin;c:\perl\5.6.0\bin\MSWin32-x86;%PATH%
+
+=head2 Usage Hints for Perl on Win32
+
+=over 4
+
+=item Environment Variables
+
+The installation paths that you set during the build get compiled
+into perl, so you don't have to do anything additional to start
+using that perl (except add its location to your PATH variable).
+
+If you put extensions in unusual places, you can set PERL5LIB
+to a list of paths separated by semicolons where you want perl
+to look for libraries.  Look for descriptions of other environment
+variables you can set in L<perlrun>.
+
+You can also control the shell that perl uses to run system() and
+backtick commands via PERL5SHELL.  See L<perlrun>.
+
+Perl does not depend on the registry, but it can look up certain default
+values if you choose to put them there.  Perl attempts to read entries from
+C<HKEY_CURRENT_USER\Software\Perl> and C<HKEY_LOCAL_MACHINE\Software\Perl>.
+Entries in the former override entries in the latter.  One or more of the
+following entries (of type REG_SZ or REG_EXPAND_SZ) may be set:
+
+    lib-$]		version-specific standard library path to add to @INC
+    lib			standard library path to add to @INC
+    sitelib-$]		version-specific site library path to add to @INC
+    sitelib		site library path to add to @INC
+    vendorlib-$]	version-specific vendor library path to add to @INC
+    vendorlib		vendor library path to add to @INC
+    PERL*		fallback for all %ENV lookups that begin with "PERL"
+
+Note the C<$]> in the above is not literal.  Substitute whatever version
+of perl you want to honor that entry, e.g. C<5.6.0>.  Paths must be
+separated with semicolons, as usual on win32.
+
+=item File Globbing
+
+By default, perl handles file globbing using the File::Glob extension,
+which provides portable globbing.
+
+If you want perl to use globbing that emulates the quirks of DOS
+filename conventions, you might want to consider using File::DosGlob
+to override the internal glob() implementation.  See L<File::DosGlob> for
+details.
+
+=item Using perl from the command line
+
+If you are accustomed to using perl from various command-line
+shells found in UNIX environments, you will be less than pleased
+with what Windows offers by way of a command shell.
+
+The crucial thing to understand about the Windows environment is that
+the command line you type in is processed twice before Perl sees it.
+First, your command shell (usually CMD.EXE on Windows NT, and
+COMMAND.COM on Windows 9x) preprocesses the command line, to handle
+redirection, environment variable expansion, and location of the
+executable to run. Then, the perl executable splits the remaining
+command line into individual arguments, using the C runtime library
+upon which Perl was built.
+
+It is particularly important to note that neither the shell nor the C
+runtime do any wildcard expansions of command-line arguments (so
+wildcards need not be quoted).  Also, the quoting behaviours of the
+shell and the C runtime are rudimentary at best (and may, if you are
+using a non-standard shell, be inconsistent).  The only (useful) quote
+character is the double quote (").  It can be used to protect spaces
+and other special characters in arguments.
+
+The Windows NT documentation has almost no description of how the
+quoting rules are implemented, but here are some general observations
+based on experiments: The C runtime breaks arguments at spaces and
+passes them to programs in argc/argv.  Double quotes can be used to
+prevent arguments with spaces in them from being split up.  You can
+put a double quote in an argument by escaping it with a backslash and
+enclosing the whole argument within double quotes.  The backslash and
+the pair of double quotes surrounding the argument will be stripped by
+the C runtime.
+
+The file redirection characters "E<lt>", "E<gt>", and "|" can be quoted by
+double quotes (although there are suggestions that this may not always
+be true).  Single quotes are not treated as quotes by the shell or
+the C runtime, they don't get stripped by the shell (just to make
+this type of quoting completely useless).  The caret "^" has also
+been observed to behave as a quoting character, but this appears
+to be a shell feature, and the caret is not stripped from the command
+line, so Perl still sees it (and the C runtime phase does not treat
+the caret as a quote character).
+
+Here are some examples of usage of the "cmd" shell:
+
+This prints two doublequotes:
+
+    perl -e "print '\"\"' "
+
+This does the same:
+
+    perl -e "print \"\\\"\\\"\" "
+
+This prints "bar" and writes "foo" to the file "blurch":
+
+    perl -e "print 'foo'; print STDERR 'bar'" > blurch
+
+This prints "foo" ("bar" disappears into nowhereland):
+
+    perl -e "print 'foo'; print STDERR 'bar'" 2> nul
+
+This prints "bar" and writes "foo" into the file "blurch":
+
+    perl -e "print 'foo'; print STDERR 'bar'" 1> blurch
+
+This pipes "foo" to the "less" pager and prints "bar" on the console:
+
+    perl -e "print 'foo'; print STDERR 'bar'" | less
+
+This pipes "foo\nbar\n" to the less pager:
+
+    perl -le "print 'foo'; print STDERR 'bar'" 2>&1 | less
+
+This pipes "foo" to the pager and writes "bar" in the file "blurch":
+
+    perl -e "print 'foo'; print STDERR 'bar'" 2> blurch | less
+
+
+Discovering the usefulness of the "command.com" shell on Windows 9x
+is left as an exercise to the reader :)
+
+One particularly pernicious problem with the 4NT command shell for
+Windows NT is that it (nearly) always treats a % character as indicating
+that environment variable expansion is needed.  Under this shell, it is
+therefore important to always double any % characters which you want
+Perl to see (for example, for hash variables), even when they are
+quoted.
+
+=item Building Extensions
+
+The Comprehensive Perl Archive Network (CPAN) offers a wealth
+of extensions, some of which require a C compiler to build.
+Look in http://www.cpan.org/ for more information on CPAN.
+
+Note that not all of the extensions available from CPAN may work
+in the Win32 environment; you should check the information at
+http://testers.cpan.org/ before investing too much effort into
+porting modules that don't readily build.
+
+Most extensions (whether they require a C compiler or not) can
+be built, tested and installed with the standard mantra:
+
+    perl Makefile.PL
+    $MAKE
+    $MAKE test
+    $MAKE install
+
+where $MAKE is whatever 'make' program you have configured perl to
+use.  Use "perl -V:make" to find out what this is.  Some extensions
+may not provide a testsuite (so "$MAKE test" may not do anything or
+fail), but most serious ones do.
+
+It is important that you use a supported 'make' program, and
+ensure Config.pm knows about it.  If you don't have nmake, you can
+either get dmake from the location mentioned earlier or get an
+old version of nmake reportedly available from:
+
+ http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/nmake15.exe
+
+Another option is to use the make written in Perl, available from
+CPAN.
+
+    http://www.cpan.org/modules/by-module/Make/
+
+You may also use dmake.  See L</"Make"> above on how to get it.
+
+Note that MakeMaker actually emits makefiles with different syntax
+depending on what 'make' it thinks you are using.  Therefore, it is
+important that one of the following values appears in Config.pm:
+
+    make='nmake'	# MakeMaker emits nmake syntax
+    make='dmake'	# MakeMaker emits dmake syntax
+    any other value	# MakeMaker emits generic make syntax
+    			    (e.g GNU make, or Perl make)
+
+If the value doesn't match the 'make' program you want to use,
+edit Config.pm to fix it.
+
+If a module implements XSUBs, you will need one of the supported
+C compilers.  You must make sure you have set up the environment for
+the compiler for command-line compilation.
+
+If a module does not build for some reason, look carefully for
+why it failed, and report problems to the module author.  If
+it looks like the extension building support is at fault, report
+that with full details of how the build failed using the perlbug
+utility.
+
+=item Command-line Wildcard Expansion
+
+The default command shells on DOS descendant operating systems (such
+as they are) usually do not expand wildcard arguments supplied to
+programs.  They consider it the application's job to handle that.
+This is commonly achieved by linking the application (in our case,
+perl) with startup code that the C runtime libraries usually provide.
+However, doing that results in incompatible perl versions (since the
+behavior of the argv expansion code differs depending on the
+compiler, and it is even buggy on some compilers).  Besides, it may
+be a source of frustration if you use such a perl binary with an
+alternate shell that *does* expand wildcards.
+
+Instead, the following solution works rather well. The nice things
+about it are 1) you can start using it right away; 2) it is more
+powerful, because it will do the right thing with a pattern like
+*/*/*.c; 3) you can decide whether you do/don't want to use it; and
+4) you can extend the method to add any customizations (or even
+entirely different kinds of wildcard expansion).
+
+	C:\> copy con c:\perl\lib\Wild.pm
+	# Wild.pm - emulate shell @ARGV expansion on shells that don't
+	use File::DosGlob;
+	@ARGV = map {
+		      my @g = File::DosGlob::glob($_) if /[*?]/;
+		      @g ? @g : $_;
+		    } @ARGV;
+	1;
+	^Z
+	C:\> set PERL5OPT=-MWild
+	C:\> perl -le "for (@ARGV) { print }" */*/perl*.c
+	p4view/perl/perl.c
+	p4view/perl/perlio.c
+	p4view/perl/perly.c
+	perl5.005/win32/perlglob.c
+	perl5.005/win32/perllib.c
+	perl5.005/win32/perlglob.c
+	perl5.005/win32/perllib.c
+	perl5.005/win32/perlglob.c
+	perl5.005/win32/perllib.c
+
+Note there are two distinct steps there: 1) You'll have to create
+Wild.pm and put it in your perl lib directory. 2) You'll need to
+set the PERL5OPT environment variable.  If you want argv expansion
+to be the default, just set PERL5OPT in your default startup
+environment.
+
+If you are using the Visual C compiler, you can get the C runtime's
+command line wildcard expansion built into perl binary.  The resulting
+binary will always expand unquoted command lines, which may not be
+what you want if you use a shell that does that for you.  The expansion
+done is also somewhat less powerful than the approach suggested above.
+
+=item Win32 Specific Extensions
+
+A number of extensions specific to the Win32 platform are available
+from CPAN.  You may find that many of these extensions are meant to
+be used under the Activeware port of Perl, which used to be the only
+native port for the Win32 platform.  Since the Activeware port does not
+have adequate support for Perl's extension building tools, these
+extensions typically do not support those tools either and, therefore,
+cannot be built using the generic steps shown in the previous section.
+
+To ensure smooth transitioning of existing code that uses the
+ActiveState port, there is a bundle of Win32 extensions that contains
+all of the ActiveState extensions and several other Win32 extensions from
+CPAN in source form, along with many added bugfixes, and with MakeMaker
+support.  The latest version of this bundle is available at:
+
+    http://search.cpan.org/dist/libwin32/
+
+See the README in that distribution for building and installation
+instructions.
+
+=item Notes on 64-bit Windows
+
+Windows .NET Server supports the LLP64 data model on the Intel Itanium
+architecture.
+
+The LLP64 data model is different from the LP64 data model that is the
+norm on 64-bit Unix platforms.  In the former, C<int> and C<long> are
+both 32-bit data types, while pointers are 64 bits wide.  In addition,
+there is a separate 64-bit wide integral type, C<__int64>.  In contrast,
+the LP64 data model that is pervasive on Unix platforms provides C<int>
+as the 32-bit type, while both the C<long> type and pointers are of
+64-bit precision.  Note that both models provide for 64-bits of
+addressability.
+
+64-bit Windows running on Itanium is capable of running 32-bit x86
+binaries transparently.  This means that you could use a 32-bit build
+of Perl on a 64-bit system.  Given this, why would one want to build
+a 64-bit build of Perl?  Here are some reasons why you would bother:
+
+=over
+
+=item *
+
+A 64-bit native application will run much more efficiently on
+Itanium hardware.
+
+=item *
+
+There is no 2GB limit on process size.
+
+=item *
+
+Perl automatically provides large file support when built under
+64-bit Windows.
+
+=item *
+
+Embedding Perl inside a 64-bit application.
+
+=back
+
+=back
+
+=head2 Running Perl Scripts
+
+Perl scripts on UNIX use the "#!" (a.k.a "shebang") line to
+indicate to the OS that it should execute the file using perl.
+Win32 has no comparable means to indicate arbitrary files are
+executables.
+
+Instead, all available methods to execute plain text files on
+Win32 rely on the file "extension".  There are three methods
+to use this to execute perl scripts:
+
+=over 8
+
+=item 1
+
+There is a facility called "file extension associations" that will
+work in Windows NT 4.0.  This can be manipulated via the two
+commands "assoc" and "ftype" that come standard with Windows NT
+4.0.  Type "ftype /?" for a complete example of how to set this
+up for perl scripts (Say what?  You thought Windows NT wasn't
+perl-ready? :).
+
+=item 2
+
+Since file associations don't work everywhere, and there are
+reportedly bugs with file associations where it does work, the
+old method of wrapping the perl script to make it look like a
+regular batch file to the OS, may be used.  The install process
+makes available the "pl2bat.bat" script which can be used to wrap
+perl scripts into batch files.  For example:
+
+	pl2bat foo.pl
+
+will create the file "FOO.BAT".  Note "pl2bat" strips any
+.pl suffix and adds a .bat suffix to the generated file.
+
+If you use the 4DOS/NT or similar command shell, note that
+"pl2bat" uses the "%*" variable in the generated batch file to
+refer to all the command line arguments, so you may need to make
+sure that construct works in batch files.  As of this writing,
+4DOS/NT users will need a "ParameterChar = *" statement in their
+4NT.INI file or will need to execute "setdos /p*" in the 4DOS/NT
+startup file to enable this to work.
+
+=item 3
+
+Using "pl2bat" has a few problems:  the file name gets changed,
+so scripts that rely on C<$0> to find what they must do may not
+run properly; running "pl2bat" replicates the contents of the
+original script, and so this process can be maintenance intensive
+if the originals get updated often.  A different approach that
+avoids both problems is possible.
+
+A script called "runperl.bat" is available that can be copied
+to any filename (along with the .bat suffix).  For example,
+if you call it "foo.bat", it will run the file "foo" when it is
+executed.  Since you can run batch files on Win32 platforms simply
+by typing the name (without the extension), this effectively
+runs the file "foo", when you type either "foo" or "foo.bat".
+With this method, "foo.bat" can even be in a different location
+than the file "foo", as long as "foo" is available somewhere on
+the PATH.  If your scripts are on a filesystem that allows symbolic
+links, you can even avoid copying "runperl.bat".
+
+Here's a diversion:  copy "runperl.bat" to "runperl", and type
+"runperl".  Explain the observed behavior, or lack thereof. :)
+Hint: .gnidnats llits er'uoy fi ,"lrepnur" eteled :tniH
+
+=back
+
+=head2 Miscellaneous Things
+
+A full set of HTML documentation is installed, so you should be
+able to use it if you have a web browser installed on your
+system.
+
+C<perldoc> is also a useful tool for browsing information contained
+in the documentation, especially in conjunction with a pager
+like C<less> (recent versions of which have Win32 support).  You may
+have to set the PAGER environment variable to use a specific pager.
+"perldoc -f foo" will print information about the perl operator
+"foo".
+
+One common mistake when using this port with a GUI library like C<Tk>
+is assuming that Perl's normal behavior of opening a command-line
+window will go away.  This isn't the case.  If you want to start a copy
+of C<perl> without opening a command-line window, use the C<wperl>
+executable built during the installation process.  Usage is exactly
+the same as normal C<perl> on Win32, except that options like C<-h>
+don't work (since they need a command-line window to print to).
+
+If you find bugs in perl, you can run C<perlbug> to create a
+bug report (you may have to send it manually if C<perlbug> cannot
+find a mailer on your system).
+
+=head1 BUGS AND CAVEATS
+
+Norton AntiVirus interferes with the build process, particularly if
+set to "AutoProtect, All Files, when Opened". Unlike large applications
+the perl build process opens and modifies a lot of files. Having the
+the AntiVirus scan each and every one slows build the process significantly.
+Worse, with PERLIO=stdio the build process fails with peculiar messages
+as the virus checker interacts badly with miniperl.exe writing configure
+files (it seems to either catch file part written and treat it as suspicious,
+or virus checker may have it "locked" in a way which inhibits miniperl
+updating it). The build does complete with
+
+   set PERLIO=perlio
+
+but that may be just luck. Other AntiVirus software may have similar issues.
+
+Some of the built-in functions do not act exactly as documented in
+L<perlfunc>, and a few are not implemented at all.  To avoid
+surprises, particularly if you have had prior exposure to Perl
+in other operating environments or if you intend to write code
+that will be portable to other environments, see L<perlport>
+for a reasonably definitive list of these differences.
+
+Not all extensions available from CPAN may build or work properly
+in the Win32 environment.  See L</"Building Extensions">.
+
+Most C<socket()> related calls are supported, but they may not
+behave as on Unix platforms.  See L<perlport> for the full list.
+Perl requires Winsock2 to be installed on the system. If you're
+running Win95, you can download Winsock upgrade from here:
+
+http://www.microsoft.com/windows95/downloads/contents/WUAdminTools/S_WUNetworkingTools/W95Sockets2/Default.asp
+
+Later OS versions already include Winsock2 support.
+
+Signal handling may not behave as on Unix platforms (where it
+doesn't exactly "behave", either :).  For instance, calling C<die()>
+or C<exit()> from signal handlers will cause an exception, since most
+implementations of C<signal()> on Win32 are severely crippled.
+Thus, signals may work only for simple things like setting a flag
+variable in the handler.  Using signals under this port should
+currently be considered unsupported.
+
+Please send detailed descriptions of any problems and solutions that
+you may find to E<lt>F<perlbug@perl.org>E<gt>, along with the output
+produced by C<perl -V>.
+
+=head1 ACKNOWLEDGEMENTS
+
+The use of a camel with the topic of Perl is a trademark
+of O'Reilly and Associates, Inc. Used with permission.
+
+=head1 AUTHORS
+
+=over 4
+
+=item Gary Ng E<lt>71564.1743@CompuServe.COME<gt>
+
+=item Gurusamy Sarathy E<lt>gsar@activestate.comE<gt>
+
+=item Nick Ing-Simmons E<lt>nick@ing-simmons.netE<gt>
+
+=item Jan Dubois E<lt>jand@activestate.comE<gt>
+
+=item Steve Hay E<lt>steve.hay@uk.radan.comE<gt>
+
+=back
+
+This document is maintained by Jan Dubois.
+
+=head1 SEE ALSO
+
+L<perl>
+
+=head1 HISTORY
+
+This port was originally contributed by Gary Ng around 5.003_24,
+and borrowed from the Hip Communications port that was available
+at the time.  Various people have made numerous and sundry hacks
+since then.
+
+Borland support was added in 5.004_01 (Gurusamy Sarathy).
+
+GCC/mingw32 support was added in 5.005 (Nick Ing-Simmons).
+
+Support for PERL_OBJECT was added in 5.005 (ActiveState Tool Corp).
+
+Support for fork() emulation was added in 5.6 (ActiveState Tool Corp).
+
+Win9x support was added in 5.6 (Benjamin Stuhl).
+
+Support for 64-bit Windows added in 5.8 (ActiveState Corp).
+
+Last updated: 30 September 2005
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlxs.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlxs.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlxs.pod	(revision 14489)
@@ -0,0 +1,2059 @@
+=head1 NAME
+
+perlxs - XS language reference manual
+
+=head1 DESCRIPTION
+
+=head2 Introduction
+
+XS is an interface description file format used to create an extension
+interface between Perl and C code (or a C library) which one wishes
+to use with Perl.  The XS interface is combined with the library to
+create a new library which can then be either dynamically loaded
+or statically linked into perl.  The XS interface description is
+written in the XS language and is the core component of the Perl
+extension interface.
+
+An B<XSUB> forms the basic unit of the XS interface.  After compilation
+by the B<xsubpp> compiler, each XSUB amounts to a C function definition
+which will provide the glue between Perl calling conventions and C
+calling conventions.
+
+The glue code pulls the arguments from the Perl stack, converts these
+Perl values to the formats expected by a C function, call this C function,
+transfers the return values of the C function back to Perl.
+Return values here may be a conventional C return value or any C
+function arguments that may serve as output parameters.  These return
+values may be passed back to Perl either by putting them on the
+Perl stack, or by modifying the arguments supplied from the Perl side.
+
+The above is a somewhat simplified view of what really happens.  Since
+Perl allows more flexible calling conventions than C, XSUBs may do much
+more in practice, such as checking input parameters for validity,
+throwing exceptions (or returning undef/empty list) if the return value
+from the C function indicates failure, calling different C functions
+based on numbers and types of the arguments, providing an object-oriented
+interface, etc.
+
+Of course, one could write such glue code directly in C.  However, this
+would be a tedious task, especially if one needs to write glue for
+multiple C functions, and/or one is not familiar enough with the Perl
+stack discipline and other such arcana.  XS comes to the rescue here:
+instead of writing this glue C code in long-hand, one can write
+a more concise short-hand I<description> of what should be done by
+the glue, and let the XS compiler B<xsubpp> handle the rest.
+
+The XS language allows one to describe the mapping between how the C
+routine is used, and how the corresponding Perl routine is used.  It
+also allows creation of Perl routines which are directly translated to
+C code and which are not related to a pre-existing C function.  In cases
+when the C interface coincides with the Perl interface, the XSUB
+declaration is almost identical to a declaration of a C function (in K&R
+style).  In such circumstances, there is another tool called C<h2xs>
+that is able to translate an entire C header file into a corresponding
+XS file that will provide glue to the functions/macros described in
+the header file.
+
+The XS compiler is called B<xsubpp>.  This compiler creates
+the constructs necessary to let an XSUB manipulate Perl values, and
+creates the glue necessary to let Perl call the XSUB.  The compiler
+uses B<typemaps> to determine how to map C function parameters
+and output values to Perl values and back.  The default typemap
+(which comes with Perl) handles many common C types.  A supplementary
+typemap may also be needed to handle any special structures and types
+for the library being linked.
+
+A file in XS format starts with a C language section which goes until the
+first C<MODULE =Z<>> directive.  Other XS directives and XSUB definitions
+may follow this line.  The "language" used in this part of the file
+is usually referred to as the XS language.  B<xsubpp> recognizes and
+skips POD (see L<perlpod>) in both the C and XS language sections, which
+allows the XS file to contain embedded documentation. 
+
+See L<perlxstut> for a tutorial on the whole extension creation process.
+
+Note: For some extensions, Dave Beazley's SWIG system may provide a
+significantly more convenient mechanism for creating the extension
+glue code.  See http://www.swig.org/ for more information.
+
+=head2 On The Road
+
+Many of the examples which follow will concentrate on creating an interface
+between Perl and the ONC+ RPC bind library functions.  The rpcb_gettime()
+function is used to demonstrate many features of the XS language.  This
+function has two parameters; the first is an input parameter and the second
+is an output parameter.  The function also returns a status value.
+
+	bool_t rpcb_gettime(const char *host, time_t *timep);
+
+From C this function will be called with the following
+statements.
+
+     #include <rpc/rpc.h>
+     bool_t status;
+     time_t timep;
+     status = rpcb_gettime( "localhost", &timep );
+
+If an XSUB is created to offer a direct translation between this function
+and Perl, then this XSUB will be used from Perl with the following code.
+The $status and $timep variables will contain the output of the function.
+
+     use RPC;
+     $status = rpcb_gettime( "localhost", $timep );
+
+The following XS file shows an XS subroutine, or XSUB, which
+demonstrates one possible interface to the rpcb_gettime()
+function.  This XSUB represents a direct translation between
+C and Perl and so preserves the interface even from Perl.
+This XSUB will be invoked from Perl with the usage shown
+above.  Note that the first three #include statements, for
+C<EXTERN.h>, C<perl.h>, and C<XSUB.h>, will always be present at the
+beginning of an XS file.  This approach and others will be
+expanded later in this document.
+
+     #include "EXTERN.h"
+     #include "perl.h"
+     #include "XSUB.h"
+     #include <rpc/rpc.h>
+
+     MODULE = RPC  PACKAGE = RPC
+
+     bool_t
+     rpcb_gettime(host,timep)
+          char *host
+          time_t &timep
+        OUTPUT:
+          timep
+
+Any extension to Perl, including those containing XSUBs,
+should have a Perl module to serve as the bootstrap which
+pulls the extension into Perl.  This module will export the
+extension's functions and variables to the Perl program and
+will cause the extension's XSUBs to be linked into Perl.
+The following module will be used for most of the examples
+in this document and should be used from Perl with the C<use>
+command as shown earlier.  Perl modules are explained in
+more detail later in this document.
+
+     package RPC;
+
+     require Exporter;
+     require DynaLoader;
+     @ISA = qw(Exporter DynaLoader);
+     @EXPORT = qw( rpcb_gettime );
+
+     bootstrap RPC;
+     1;
+
+Throughout this document a variety of interfaces to the rpcb_gettime()
+XSUB will be explored.  The XSUBs will take their parameters in different
+orders or will take different numbers of parameters.  In each case the
+XSUB is an abstraction between Perl and the real C rpcb_gettime()
+function, and the XSUB must always ensure that the real rpcb_gettime()
+function is called with the correct parameters.  This abstraction will
+allow the programmer to create a more Perl-like interface to the C
+function.
+
+=head2 The Anatomy of an XSUB
+
+The simplest XSUBs consist of 3 parts: a description of the return
+value, the name of the XSUB routine and the names of its arguments,
+and a description of types or formats of the arguments.
+
+The following XSUB allows a Perl program to access a C library function
+called sin().  The XSUB will imitate the C function which takes a single
+argument and returns a single value.
+
+     double
+     sin(x)
+       double x
+
+Optionally, one can merge the description of types and the list of
+argument names, rewriting this as
+
+     double
+     sin(double x)
+
+This makes this XSUB look similar to an ANSI C declaration.  An optional
+semicolon is allowed after the argument list, as in
+
+     double
+     sin(double x);
+
+Parameters with C pointer types can have different semantic: C functions
+with similar declarations
+
+     bool string_looks_as_a_number(char *s);
+     bool make_char_uppercase(char *c);
+
+are used in absolutely incompatible manner.  Parameters to these functions
+could be described B<xsubpp> like this:
+
+     char *  s
+     char    &c
+
+Both these XS declarations correspond to the C<char*> C type, but they have
+different semantics, see L<"The & Unary Operator">.
+
+It is convenient to think that the indirection operator
+C<*> should be considered as a part of the type and the address operator C<&>
+should be considered part of the variable.  See L<"The Typemap">
+for more info about handling qualifiers and unary operators in C types.
+
+The function name and the return type must be placed on
+separate lines and should be flush left-adjusted.
+
+  INCORRECT                        CORRECT
+
+  double sin(x)                    double
+    double x                       sin(x)
+				     double x
+
+The rest of the function description may be indented or left-adjusted. The
+following example shows a function with its body left-adjusted.  Most
+examples in this document will indent the body for better readability.
+
+  CORRECT
+
+  double
+  sin(x)
+  double x
+
+More complicated XSUBs may contain many other sections.  Each section of
+an XSUB starts with the corresponding keyword, such as INIT: or CLEANUP:.
+However, the first two lines of an XSUB always contain the same data:
+descriptions of the return type and the names of the function and its
+parameters.  Whatever immediately follows these is considered to be
+an INPUT: section unless explicitly marked with another keyword.
+(See L<The INPUT: Keyword>.)
+
+An XSUB section continues until another section-start keyword is found.
+
+=head2 The Argument Stack
+
+The Perl argument stack is used to store the values which are
+sent as parameters to the XSUB and to store the XSUB's
+return value(s).  In reality all Perl functions (including non-XSUB
+ones) keep their values on this stack all the same time, each limited
+to its own range of positions on the stack.  In this document the
+first position on that stack which belongs to the active
+function will be referred to as position 0 for that function.
+
+XSUBs refer to their stack arguments with the macro B<ST(x)>, where I<x>
+refers to a position in this XSUB's part of the stack.  Position 0 for that
+function would be known to the XSUB as ST(0).  The XSUB's incoming
+parameters and outgoing return values always begin at ST(0).  For many
+simple cases the B<xsubpp> compiler will generate the code necessary to
+handle the argument stack by embedding code fragments found in the
+typemaps.  In more complex cases the programmer must supply the code.
+
+=head2 The RETVAL Variable
+
+The RETVAL variable is a special C variable that is declared automatically
+for you.  The C type of RETVAL matches the return type of the C library
+function.  The B<xsubpp> compiler will declare this variable in each XSUB
+with non-C<void> return type.  By default the generated C function
+will use RETVAL to hold the return value of the C library function being
+called.  In simple cases the value of RETVAL will be placed in ST(0) of
+the argument stack where it can be received by Perl as the return value
+of the XSUB.
+
+If the XSUB has a return type of C<void> then the compiler will
+not declare a RETVAL variable for that function.  When using
+a PPCODE: section no manipulation of the RETVAL variable is required, the
+section may use direct stack manipulation to place output values on the stack.
+
+If PPCODE: directive is not used, C<void> return value should be used
+only for subroutines which do not return a value, I<even if> CODE:
+directive is used which sets ST(0) explicitly.
+
+Older versions of this document recommended to use C<void> return
+value in such cases. It was discovered that this could lead to
+segfaults in cases when XSUB was I<truly> C<void>. This practice is
+now deprecated, and may be not supported at some future version. Use
+the return value C<SV *> in such cases. (Currently C<xsubpp> contains
+some heuristic code which tries to disambiguate between "truly-void"
+and "old-practice-declared-as-void" functions. Hence your code is at
+mercy of this heuristics unless you use C<SV *> as return value.)
+
+=head2 Returning SVs, AVs and HVs through RETVAL
+
+When you're using RETVAL to return an C<SV *>, there's some magic
+going on behind the scenes that should be mentioned. When you're
+manipulating the argument stack using the ST(x) macro, for example,
+you usually have to pay special attention to reference counts. (For
+more about reference counts, see L<perlguts>.) To make your life
+easier, the typemap file automatically makes C<RETVAL> mortal when
+you're returning an C<SV *>. Thus, the following two XSUBs are more
+or less equivalent:
+
+  void
+  alpha()
+      PPCODE:
+          ST(0) = newSVpv("Hello World",0);
+          sv_2mortal(ST(0));
+          XSRETURN(1);
+  
+  SV *
+  beta()
+      CODE:
+          RETVAL = newSVpv("Hello World",0);
+      OUTPUT:
+          RETVAL
+
+This is quite useful as it usually improves readability. While
+this works fine for an C<SV *>, it's unfortunately not as easy
+to have C<AV *> or C<HV *> as a return value. You I<should> be
+able to write:
+
+  AV *
+  array()
+      CODE:
+          RETVAL = newAV();
+          /* do something with RETVAL */
+      OUTPUT:
+          RETVAL
+
+But due to an unfixable bug (fixing it would break lots of existing
+CPAN modules) in the typemap file, the reference count of the C<AV *>
+is not properly decremented. Thus, the above XSUB would leak memory
+whenever it is being called. The same problem exists for C<HV *>.
+
+When you're returning an C<AV *> or a C<HV *>, you have make sure
+their reference count is decremented by making the AV or HV mortal:
+
+  AV *
+  array()
+      CODE:
+          RETVAL = newAV();
+          sv_2mortal((SV*)RETVAL);
+          /* do something with RETVAL */
+      OUTPUT:
+          RETVAL
+
+And also remember that you don't have to do this for an C<SV *>.
+
+=head2 The MODULE Keyword
+
+The MODULE keyword is used to start the XS code and to specify the package
+of the functions which are being defined.  All text preceding the first
+MODULE keyword is considered C code and is passed through to the output with
+POD stripped, but otherwise untouched.  Every XS module will have a
+bootstrap function which is used to hook the XSUBs into Perl.  The package
+name of this bootstrap function will match the value of the last MODULE
+statement in the XS source files.  The value of MODULE should always remain
+constant within the same XS file, though this is not required.
+
+The following example will start the XS code and will place
+all functions in a package named RPC.
+
+     MODULE = RPC
+
+=head2 The PACKAGE Keyword
+
+When functions within an XS source file must be separated into packages
+the PACKAGE keyword should be used.  This keyword is used with the MODULE
+keyword and must follow immediately after it when used.
+
+     MODULE = RPC  PACKAGE = RPC
+
+     [ XS code in package RPC ]
+
+     MODULE = RPC  PACKAGE = RPCB
+
+     [ XS code in package RPCB ]
+
+     MODULE = RPC  PACKAGE = RPC
+
+     [ XS code in package RPC ]
+
+The same package name can be used more than once, allowing for
+non-contiguous code. This is useful if you have a stronger ordering
+principle than package names.
+
+Although this keyword is optional and in some cases provides redundant
+information it should always be used.  This keyword will ensure that the
+XSUBs appear in the desired package.
+
+=head2 The PREFIX Keyword
+
+The PREFIX keyword designates prefixes which should be
+removed from the Perl function names.  If the C function is
+C<rpcb_gettime()> and the PREFIX value is C<rpcb_> then Perl will
+see this function as C<gettime()>.
+
+This keyword should follow the PACKAGE keyword when used.
+If PACKAGE is not used then PREFIX should follow the MODULE
+keyword.
+
+     MODULE = RPC  PREFIX = rpc_
+
+     MODULE = RPC  PACKAGE = RPCB  PREFIX = rpcb_
+
+=head2 The OUTPUT: Keyword
+
+The OUTPUT: keyword indicates that certain function parameters should be
+updated (new values made visible to Perl) when the XSUB terminates or that
+certain values should be returned to the calling Perl function.  For
+simple functions which have no CODE: or PPCODE: section,
+such as the sin() function above, the RETVAL variable is
+automatically designated as an output value.  For more complex functions
+the B<xsubpp> compiler will need help to determine which variables are output
+variables.
+
+This keyword will normally be used to complement the CODE:  keyword.
+The RETVAL variable is not recognized as an output variable when the
+CODE: keyword is present.  The OUTPUT:  keyword is used in this
+situation to tell the compiler that RETVAL really is an output
+variable.
+
+The OUTPUT: keyword can also be used to indicate that function parameters
+are output variables.  This may be necessary when a parameter has been
+modified within the function and the programmer would like the update to
+be seen by Perl.
+
+     bool_t
+     rpcb_gettime(host,timep)
+          char *host
+          time_t &timep
+        OUTPUT:
+          timep
+
+The OUTPUT: keyword will also allow an output parameter to
+be mapped to a matching piece of code rather than to a
+typemap.
+
+     bool_t
+     rpcb_gettime(host,timep)
+          char *host
+          time_t &timep
+        OUTPUT:
+          timep sv_setnv(ST(1), (double)timep);
+
+B<xsubpp> emits an automatic C<SvSETMAGIC()> for all parameters in the
+OUTPUT section of the XSUB, except RETVAL.  This is the usually desired
+behavior, as it takes care of properly invoking 'set' magic on output
+parameters (needed for hash or array element parameters that must be
+created if they didn't exist).  If for some reason, this behavior is
+not desired, the OUTPUT section may contain a C<SETMAGIC: DISABLE> line
+to disable it for the remainder of the parameters in the OUTPUT section.
+Likewise,  C<SETMAGIC: ENABLE> can be used to reenable it for the
+remainder of the OUTPUT section.  See L<perlguts> for more details
+about 'set' magic.
+
+=head2 The NO_OUTPUT Keyword
+
+The NO_OUTPUT can be placed as the first token of the XSUB.  This keyword
+indicates that while the C subroutine we provide an interface to has
+a non-C<void> return type, the return value of this C subroutine should not
+be returned from the generated Perl subroutine.
+
+With this keyword present L<The RETVAL Variable> is created, and in the
+generated call to the subroutine this variable is assigned to, but the value
+of this variable is not going to be used in the auto-generated code.
+
+This keyword makes sense only if C<RETVAL> is going to be accessed by the
+user-supplied code.  It is especially useful to make a function interface
+more Perl-like, especially when the C return value is just an error condition
+indicator.  For example,
+
+  NO_OUTPUT int
+  delete_file(char *name)
+    POSTCALL:
+      if (RETVAL != 0)
+	  croak("Error %d while deleting file '%s'", RETVAL, name);
+
+Here the generated XS function returns nothing on success, and will die()
+with a meaningful error message on error.
+
+=head2 The CODE: Keyword
+
+This keyword is used in more complicated XSUBs which require
+special handling for the C function.  The RETVAL variable is
+still declared, but it will not be returned unless it is specified
+in the OUTPUT: section.
+
+The following XSUB is for a C function which requires special handling of
+its parameters.  The Perl usage is given first.
+
+     $status = rpcb_gettime( "localhost", $timep );
+
+The XSUB follows.
+
+     bool_t
+     rpcb_gettime(host,timep)
+          char *host
+          time_t timep
+        CODE:
+               RETVAL = rpcb_gettime( host, &timep );
+        OUTPUT:
+          timep
+          RETVAL
+
+=head2 The INIT: Keyword
+
+The INIT: keyword allows initialization to be inserted into the XSUB before
+the compiler generates the call to the C function.  Unlike the CODE: keyword
+above, this keyword does not affect the way the compiler handles RETVAL.
+
+    bool_t
+    rpcb_gettime(host,timep)
+          char *host
+          time_t &timep
+	INIT:
+	  printf("# Host is %s\n", host );
+        OUTPUT:
+          timep
+
+Another use for the INIT: section is to check for preconditions before
+making a call to the C function:
+
+    long long
+    lldiv(a,b)
+	long long a
+	long long b
+      INIT:
+	if (a == 0 && b == 0)
+	    XSRETURN_UNDEF;
+	if (b == 0)
+	    croak("lldiv: cannot divide by 0");
+
+=head2 The NO_INIT Keyword
+
+The NO_INIT keyword is used to indicate that a function
+parameter is being used only as an output value.  The B<xsubpp>
+compiler will normally generate code to read the values of
+all function parameters from the argument stack and assign
+them to C variables upon entry to the function.  NO_INIT
+will tell the compiler that some parameters will be used for
+output rather than for input and that they will be handled
+before the function terminates.
+
+The following example shows a variation of the rpcb_gettime() function.
+This function uses the timep variable only as an output variable and does
+not care about its initial contents.
+
+     bool_t
+     rpcb_gettime(host,timep)
+          char *host
+          time_t &timep = NO_INIT
+        OUTPUT:
+          timep
+
+=head2 Initializing Function Parameters
+
+C function parameters are normally initialized with their values from
+the argument stack (which in turn contains the parameters that were
+passed to the XSUB from Perl).  The typemaps contain the
+code segments which are used to translate the Perl values to
+the C parameters.  The programmer, however, is allowed to
+override the typemaps and supply alternate (or additional)
+initialization code.  Initialization code starts with the first
+C<=>, C<;> or C<+> on a line in the INPUT: section.  The only
+exception happens if this C<;> terminates the line, then this C<;>
+is quietly ignored.
+
+The following code demonstrates how to supply initialization code for
+function parameters.  The initialization code is eval'd within double
+quotes by the compiler before it is added to the output so anything
+which should be interpreted literally [mainly C<$>, C<@>, or C<\\>]
+must be protected with backslashes.  The variables $var, $arg,
+and $type can be used as in typemaps.
+
+     bool_t
+     rpcb_gettime(host,timep)
+          char *host = (char *)SvPV($arg,PL_na);
+          time_t &timep = 0;
+        OUTPUT:
+          timep
+
+This should not be used to supply default values for parameters.  One
+would normally use this when a function parameter must be processed by
+another library function before it can be used.  Default parameters are
+covered in the next section.
+
+If the initialization begins with C<=>, then it is output in
+the declaration for the input variable, replacing the initialization
+supplied by the typemap.  If the initialization
+begins with C<;> or C<+>, then it is performed after
+all of the input variables have been declared.  In the C<;>
+case the initialization normally supplied by the typemap is not performed.
+For the C<+> case, the declaration for the variable will include the
+initialization from the typemap.  A global
+variable, C<%v>, is available for the truly rare case where
+information from one initialization is needed in another
+initialization.
+
+Here's a truly obscure example:
+
+     bool_t
+     rpcb_gettime(host,timep)
+          time_t &timep; /* \$v{timep}=@{[$v{timep}=$arg]} */
+          char *host + SvOK($v{timep}) ? SvPV($arg,PL_na) : NULL;
+        OUTPUT:
+          timep
+
+The construct C<\$v{timep}=@{[$v{timep}=$arg]}> used in the above
+example has a two-fold purpose: first, when this line is processed by
+B<xsubpp>, the Perl snippet C<$v{timep}=$arg> is evaluated.  Second,
+the text of the evaluated snippet is output into the generated C file
+(inside a C comment)!  During the processing of C<char *host> line,
+$arg will evaluate to C<ST(0)>, and C<$v{timep}> will evaluate to
+C<ST(1)>.
+
+=head2 Default Parameter Values
+
+Default values for XSUB arguments can be specified by placing an
+assignment statement in the parameter list.  The default value may
+be a number, a string or the special string C<NO_INIT>.  Defaults should
+always be used on the right-most parameters only.
+
+To allow the XSUB for rpcb_gettime() to have a default host
+value the parameters to the XSUB could be rearranged.  The
+XSUB will then call the real rpcb_gettime() function with
+the parameters in the correct order.  This XSUB can be called
+from Perl with either of the following statements:
+
+     $status = rpcb_gettime( $timep, $host );
+
+     $status = rpcb_gettime( $timep );
+
+The XSUB will look like the code  which  follows.   A  CODE:
+block  is used to call the real rpcb_gettime() function with
+the parameters in the correct order for that function.
+
+     bool_t
+     rpcb_gettime(timep,host="localhost")
+          char *host
+          time_t timep = NO_INIT
+        CODE:
+               RETVAL = rpcb_gettime( host, &timep );
+        OUTPUT:
+          timep
+          RETVAL
+
+=head2 The PREINIT: Keyword
+
+The PREINIT: keyword allows extra variables to be declared immediately
+before or after the declarations of the parameters from the INPUT: section
+are emitted.
+
+If a variable is declared inside a CODE: section it will follow any typemap
+code that is emitted for the input parameters.  This may result in the
+declaration ending up after C code, which is C syntax error.  Similar
+errors may happen with an explicit C<;>-type or C<+>-type initialization of
+parameters is used (see L<"Initializing Function Parameters">).  Declaring
+these variables in an INIT: section will not help.
+
+In such cases, to force an additional variable to be declared together
+with declarations of other variables, place the declaration into a
+PREINIT: section.  The PREINIT: keyword may be used one or more times
+within an XSUB.
+
+The following examples are equivalent, but if the code is using complex
+typemaps then the first example is safer.
+
+     bool_t
+     rpcb_gettime(timep)
+          time_t timep = NO_INIT
+	PREINIT:
+          char *host = "localhost";
+        CODE:
+	  RETVAL = rpcb_gettime( host, &timep );
+        OUTPUT:
+          timep
+          RETVAL
+
+For this particular case an INIT: keyword would generate the
+same C code as the PREINIT: keyword.  Another correct, but error-prone example:
+
+     bool_t
+     rpcb_gettime(timep)
+          time_t timep = NO_INIT
+	CODE:
+          char *host = "localhost";
+	  RETVAL = rpcb_gettime( host, &timep );
+        OUTPUT:
+          timep
+          RETVAL
+
+Another way to declare C<host> is to use a C block in the CODE: section:
+
+     bool_t
+     rpcb_gettime(timep)
+          time_t timep = NO_INIT
+	CODE:
+	  {
+            char *host = "localhost";
+	    RETVAL = rpcb_gettime( host, &timep );
+	  }
+        OUTPUT:
+          timep
+          RETVAL
+
+The ability to put additional declarations before the typemap entries are
+processed is very handy in the cases when typemap conversions manipulate
+some global state:
+
+    MyObject
+    mutate(o)
+	PREINIT:
+	    MyState st = global_state;
+	INPUT:
+	    MyObject o;
+	CLEANUP:
+	    reset_to(global_state, st);
+
+Here we suppose that conversion to C<MyObject> in the INPUT: section and from
+MyObject when processing RETVAL will modify a global variable C<global_state>.
+After these conversions are performed, we restore the old value of
+C<global_state> (to avoid memory leaks, for example).
+
+There is another way to trade clarity for compactness: INPUT sections allow
+declaration of C variables which do not appear in the parameter list of
+a subroutine.  Thus the above code for mutate() can be rewritten as
+
+    MyObject
+    mutate(o)
+	  MyState st = global_state;
+	  MyObject o;
+	CLEANUP:
+	  reset_to(global_state, st);
+
+and the code for rpcb_gettime() can be rewritten as
+
+     bool_t
+     rpcb_gettime(timep)
+	  time_t timep = NO_INIT
+	  char *host = "localhost";
+	C_ARGS:
+	  host, &timep
+	OUTPUT:
+          timep
+          RETVAL
+
+=head2 The SCOPE: Keyword
+
+The SCOPE: keyword allows scoping to be enabled for a particular XSUB. If
+enabled, the XSUB will invoke ENTER and LEAVE automatically.
+
+To support potentially complex type mappings, if a typemap entry used
+by an XSUB contains a comment like C</*scope*/> then scoping will
+be automatically enabled for that XSUB.
+
+To enable scoping:
+
+    SCOPE: ENABLE
+
+To disable scoping:
+
+    SCOPE: DISABLE
+
+=head2 The INPUT: Keyword
+
+The XSUB's parameters are usually evaluated immediately after entering the
+XSUB.  The INPUT: keyword can be used to force those parameters to be
+evaluated a little later.  The INPUT: keyword can be used multiple times
+within an XSUB and can be used to list one or more input variables.  This
+keyword is used with the PREINIT: keyword.
+
+The following example shows how the input parameter C<timep> can be
+evaluated late, after a PREINIT.
+
+    bool_t
+    rpcb_gettime(host,timep)
+          char *host
+	PREINIT:
+	  time_t tt;
+	INPUT:
+          time_t timep
+        CODE:
+               RETVAL = rpcb_gettime( host, &tt );
+	       timep = tt;
+        OUTPUT:
+          timep
+          RETVAL
+
+The next example shows each input parameter evaluated late.
+
+    bool_t
+    rpcb_gettime(host,timep)
+	PREINIT:
+	  time_t tt;
+	INPUT:
+          char *host
+	PREINIT:
+	  char *h;
+	INPUT:
+          time_t timep
+        CODE:
+	       h = host;
+	       RETVAL = rpcb_gettime( h, &tt );
+	       timep = tt;
+        OUTPUT:
+          timep
+          RETVAL
+
+Since INPUT sections allow declaration of C variables which do not appear
+in the parameter list of a subroutine, this may be shortened to:
+
+    bool_t
+    rpcb_gettime(host,timep)
+	  time_t tt;
+          char *host;
+	  char *h = host;
+          time_t timep;
+        CODE:
+	  RETVAL = rpcb_gettime( h, &tt );
+	  timep = tt;
+        OUTPUT:
+          timep
+          RETVAL
+
+(We used our knowledge that input conversion for C<char *> is a "simple" one,
+thus C<host> is initialized on the declaration line, and our assignment
+C<h = host> is not performed too early.  Otherwise one would need to have the
+assignment C<h = host> in a CODE: or INIT: section.)
+
+=head2 The IN/OUTLIST/IN_OUTLIST/OUT/IN_OUT Keywords
+
+In the list of parameters for an XSUB, one can precede parameter names
+by the C<IN>/C<OUTLIST>/C<IN_OUTLIST>/C<OUT>/C<IN_OUT> keywords.
+C<IN> keyword is the default, the other keywords indicate how the Perl
+interface should differ from the C interface.
+
+Parameters preceded by C<OUTLIST>/C<IN_OUTLIST>/C<OUT>/C<IN_OUT>
+keywords are considered to be used by the C subroutine I<via
+pointers>.  C<OUTLIST>/C<OUT> keywords indicate that the C subroutine
+does not inspect the memory pointed by this parameter, but will write
+through this pointer to provide additional return values.
+
+Parameters preceded by C<OUTLIST> keyword do not appear in the usage
+signature of the generated Perl function.
+
+Parameters preceded by C<IN_OUTLIST>/C<IN_OUT>/C<OUT> I<do> appear as
+parameters to the Perl function.  With the exception of
+C<OUT>-parameters, these parameters are converted to the corresponding
+C type, then pointers to these data are given as arguments to the C
+function.  It is expected that the C function will write through these
+pointers.
+
+The return list of the generated Perl function consists of the C return value
+from the function (unless the XSUB is of C<void> return type or
+C<The NO_OUTPUT Keyword> was used) followed by all the C<OUTLIST>
+and C<IN_OUTLIST> parameters (in the order of appearance).  On the
+return from the XSUB the C<IN_OUT>/C<OUT> Perl parameter will be
+modified to have the values written by the C function.
+
+For example, an XSUB
+
+  void
+  day_month(OUTLIST day, IN unix_time, OUTLIST month)
+    int day
+    int unix_time
+    int month
+
+should be used from Perl as
+
+  my ($day, $month) = day_month(time);
+
+The C signature of the corresponding function should be
+
+  void day_month(int *day, int unix_time, int *month);
+
+The C<IN>/C<OUTLIST>/C<IN_OUTLIST>/C<IN_OUT>/C<OUT> keywords can be
+mixed with ANSI-style declarations, as in
+
+  void
+  day_month(OUTLIST int day, int unix_time, OUTLIST int month)
+
+(here the optional C<IN> keyword is omitted).
+
+The C<IN_OUT> parameters are identical with parameters introduced with
+L<The & Unary Operator> and put into the C<OUTPUT:> section (see
+L<The OUTPUT: Keyword>).  The C<IN_OUTLIST> parameters are very similar,
+the only difference being that the value C function writes through the
+pointer would not modify the Perl parameter, but is put in the output
+list.
+
+The C<OUTLIST>/C<OUT> parameter differ from C<IN_OUTLIST>/C<IN_OUT>
+parameters only by the initial value of the Perl parameter not
+being read (and not being given to the C function - which gets some
+garbage instead).  For example, the same C function as above can be
+interfaced with as
+
+  void day_month(OUT int day, int unix_time, OUT int month);
+
+or
+
+  void
+  day_month(day, unix_time, month)
+      int &day = NO_INIT
+      int  unix_time
+      int &month = NO_INIT
+    OUTPUT:
+      day
+      month
+
+However, the generated Perl function is called in very C-ish style:
+
+  my ($day, $month);
+  day_month($day, time, $month);
+
+=head2 The C<length(NAME)> Keyword
+
+If one of the input arguments to the C function is the length of a string
+argument C<NAME>, one can substitute the name of the length-argument by
+C<length(NAME)> in the XSUB declaration.  This argument must be omitted when
+the generated Perl function is called.  E.g.,
+
+  void
+  dump_chars(char *s, short l)
+  {
+    short n = 0;
+    while (n < l) {
+        printf("s[%d] = \"\\%#03o\"\n", n, (int)s[n]);
+        n++;
+    }
+  }
+
+  MODULE = x		PACKAGE = x
+
+  void dump_chars(char *s, short length(s))
+
+should be called as C<dump_chars($string)>.
+
+This directive is supported with ANSI-type function declarations only.
+
+=head2 Variable-length Parameter Lists
+
+XSUBs can have variable-length parameter lists by specifying an ellipsis
+C<(...)> in the parameter list.  This use of the ellipsis is similar to that
+found in ANSI C.  The programmer is able to determine the number of
+arguments passed to the XSUB by examining the C<items> variable which the
+B<xsubpp> compiler supplies for all XSUBs.  By using this mechanism one can
+create an XSUB which accepts a list of parameters of unknown length.
+
+The I<host> parameter for the rpcb_gettime() XSUB can be
+optional so the ellipsis can be used to indicate that the
+XSUB will take a variable number of parameters.  Perl should
+be able to call this XSUB with either of the following statements.
+
+     $status = rpcb_gettime( $timep, $host );
+
+     $status = rpcb_gettime( $timep );
+
+The XS code, with ellipsis, follows.
+
+     bool_t
+     rpcb_gettime(timep, ...)
+          time_t timep = NO_INIT
+	PREINIT:
+          char *host = "localhost";
+	  STRLEN n_a;
+        CODE:
+	  if( items > 1 )
+	       host = (char *)SvPV(ST(1), n_a);
+	  RETVAL = rpcb_gettime( host, &timep );
+        OUTPUT:
+          timep
+          RETVAL
+
+=head2 The C_ARGS: Keyword
+
+The C_ARGS: keyword allows creating of XSUBS which have different
+calling sequence from Perl than from C, without a need to write
+CODE: or PPCODE: section.  The contents of the C_ARGS: paragraph is
+put as the argument to the called C function without any change.
+
+For example, suppose that a C function is declared as
+
+    symbolic nth_derivative(int n, symbolic function, int flags);
+
+and that the default flags are kept in a global C variable
+C<default_flags>.  Suppose that you want to create an interface which
+is called as
+
+    $second_deriv = $function->nth_derivative(2);
+
+To do this, declare the XSUB as
+
+    symbolic
+    nth_derivative(function, n)
+	symbolic	function
+	int		n
+      C_ARGS:
+	n, function, default_flags
+
+=head2 The PPCODE: Keyword
+
+The PPCODE: keyword is an alternate form of the CODE: keyword and is used
+to tell the B<xsubpp> compiler that the programmer is supplying the code to
+control the argument stack for the XSUBs return values.  Occasionally one
+will want an XSUB to return a list of values rather than a single value.
+In these cases one must use PPCODE: and then explicitly push the list of
+values on the stack.  The PPCODE: and CODE:  keywords should not be used
+together within the same XSUB.
+
+The actual difference between PPCODE: and CODE: sections is in the
+initialization of C<SP> macro (which stands for the I<current> Perl
+stack pointer), and in the handling of data on the stack when returning
+from an XSUB.  In CODE: sections SP preserves the value which was on
+entry to the XSUB: SP is on the function pointer (which follows the
+last parameter).  In PPCODE: sections SP is moved backward to the
+beginning of the parameter list, which allows C<PUSH*()> macros
+to place output values in the place Perl expects them to be when
+the XSUB returns back to Perl.
+
+The generated trailer for a CODE: section ensures that the number of return
+values Perl will see is either 0 or 1 (depending on the C<void>ness of the
+return value of the C function, and heuristics mentioned in
+L<"The RETVAL Variable">).  The trailer generated for a PPCODE: section
+is based on the number of return values and on the number of times
+C<SP> was updated by C<[X]PUSH*()> macros.
+
+Note that macros C<ST(i)>, C<XST_m*()> and C<XSRETURN*()> work equally
+well in CODE: sections and PPCODE: sections.
+
+The following XSUB will call the C rpcb_gettime() function
+and will return its two output values, timep and status, to
+Perl as a single list.
+
+     void
+     rpcb_gettime(host)
+          char *host
+	PREINIT:
+          time_t  timep;
+          bool_t  status;
+        PPCODE:
+          status = rpcb_gettime( host, &timep );
+          EXTEND(SP, 2);
+          PUSHs(sv_2mortal(newSViv(status)));
+          PUSHs(sv_2mortal(newSViv(timep)));
+
+Notice that the programmer must supply the C code necessary
+to have the real rpcb_gettime() function called and to have
+the return values properly placed on the argument stack.
+
+The C<void> return type for this function tells the B<xsubpp> compiler that
+the RETVAL variable is not needed or used and that it should not be created.
+In most scenarios the void return type should be used with the PPCODE:
+directive.
+
+The EXTEND() macro is used to make room on the argument
+stack for 2 return values.  The PPCODE: directive causes the
+B<xsubpp> compiler to create a stack pointer available as C<SP>, and it
+is this pointer which is being used in the EXTEND() macro.
+The values are then pushed onto the stack with the PUSHs()
+macro.
+
+Now the rpcb_gettime() function can be used from Perl with
+the following statement.
+
+     ($status, $timep) = rpcb_gettime("localhost");
+
+When handling output parameters with a PPCODE section, be sure to handle
+'set' magic properly.  See L<perlguts> for details about 'set' magic.
+
+=head2 Returning Undef And Empty Lists
+
+Occasionally the programmer will want to return simply
+C<undef> or an empty list if a function fails rather than a
+separate status value.  The rpcb_gettime() function offers
+just this situation.  If the function succeeds we would like
+to have it return the time and if it fails we would like to
+have undef returned.  In the following Perl code the value
+of $timep will either be undef or it will be a valid time.
+
+     $timep = rpcb_gettime( "localhost" );
+
+The following XSUB uses the C<SV *> return type as a mnemonic only,
+and uses a CODE: block to indicate to the compiler
+that the programmer has supplied all the necessary code.  The
+sv_newmortal() call will initialize the return value to undef, making that
+the default return value.
+
+     SV *
+     rpcb_gettime(host)
+          char *  host
+	PREINIT:
+          time_t  timep;
+          bool_t x;
+        CODE:
+          ST(0) = sv_newmortal();
+          if( rpcb_gettime( host, &timep ) )
+               sv_setnv( ST(0), (double)timep);
+
+The next example demonstrates how one would place an explicit undef in the
+return value, should the need arise.
+
+     SV *
+     rpcb_gettime(host)
+          char *  host
+	PREINIT:
+          time_t  timep;
+          bool_t x;
+        CODE:
+          ST(0) = sv_newmortal();
+          if( rpcb_gettime( host, &timep ) ){
+               sv_setnv( ST(0), (double)timep);
+          }
+          else{
+               ST(0) = &PL_sv_undef;
+          }
+
+To return an empty list one must use a PPCODE: block and
+then not push return values on the stack.
+
+     void
+     rpcb_gettime(host)
+          char *host
+	PREINIT:
+          time_t  timep;
+        PPCODE:
+          if( rpcb_gettime( host, &timep ) )
+               PUSHs(sv_2mortal(newSViv(timep)));
+          else{
+	      /* Nothing pushed on stack, so an empty
+	       * list is implicitly returned. */
+          }
+
+Some people may be inclined to include an explicit C<return> in the above
+XSUB, rather than letting control fall through to the end.  In those
+situations C<XSRETURN_EMPTY> should be used, instead.  This will ensure that
+the XSUB stack is properly adjusted.  Consult L<perlapi> for other
+C<XSRETURN> macros.
+
+Since C<XSRETURN_*> macros can be used with CODE blocks as well, one can
+rewrite this example as:
+
+     int
+     rpcb_gettime(host)
+          char *host
+	PREINIT:
+          time_t  timep;
+        CODE:
+          RETVAL = rpcb_gettime( host, &timep );
+	  if (RETVAL == 0)
+		XSRETURN_UNDEF;
+	OUTPUT:
+	  RETVAL
+
+In fact, one can put this check into a POSTCALL: section as well.  Together
+with PREINIT: simplifications, this leads to:
+
+     int
+     rpcb_gettime(host)
+          char *host
+          time_t  timep;
+	POSTCALL:
+	  if (RETVAL == 0)
+		XSRETURN_UNDEF;
+
+=head2 The REQUIRE: Keyword
+
+The REQUIRE: keyword is used to indicate the minimum version of the
+B<xsubpp> compiler needed to compile the XS module.  An XS module which
+contains the following statement will compile with only B<xsubpp> version
+1.922 or greater:
+
+	REQUIRE: 1.922
+
+=head2 The CLEANUP: Keyword
+
+This keyword can be used when an XSUB requires special cleanup procedures
+before it terminates.  When the CLEANUP:  keyword is used it must follow
+any CODE:, PPCODE:, or OUTPUT: blocks which are present in the XSUB.  The
+code specified for the cleanup block will be added as the last statements
+in the XSUB.
+
+=head2 The POSTCALL: Keyword
+
+This keyword can be used when an XSUB requires special procedures
+executed after the C subroutine call is performed.  When the POSTCALL:
+keyword is used it must precede OUTPUT: and CLEANUP: blocks which are
+present in the XSUB.
+
+See examples in L<"The NO_OUTPUT Keyword"> and L<"Returning Undef And Empty Lists">.
+
+The POSTCALL: block does not make a lot of sense when the C subroutine
+call is supplied by user by providing either CODE: or PPCODE: section.
+
+=head2 The BOOT: Keyword
+
+The BOOT: keyword is used to add code to the extension's bootstrap
+function.  The bootstrap function is generated by the B<xsubpp> compiler and
+normally holds the statements necessary to register any XSUBs with Perl.
+With the BOOT: keyword the programmer can tell the compiler to add extra
+statements to the bootstrap function.
+
+This keyword may be used any time after the first MODULE keyword and should
+appear on a line by itself.  The first blank line after the keyword will
+terminate the code block.
+
+     BOOT:
+     # The following message will be printed when the
+     # bootstrap function executes.
+     printf("Hello from the bootstrap!\n");
+
+=head2 The VERSIONCHECK: Keyword
+
+The VERSIONCHECK: keyword corresponds to B<xsubpp>'s C<-versioncheck> and
+C<-noversioncheck> options.  This keyword overrides the command line
+options.  Version checking is enabled by default.  When version checking is
+enabled the XS module will attempt to verify that its version matches the
+version of the PM module.
+
+To enable version checking:
+
+    VERSIONCHECK: ENABLE
+
+To disable version checking:
+
+    VERSIONCHECK: DISABLE
+
+=head2 The PROTOTYPES: Keyword
+
+The PROTOTYPES: keyword corresponds to B<xsubpp>'s C<-prototypes> and
+C<-noprototypes> options.  This keyword overrides the command line options.
+Prototypes are enabled by default.  When prototypes are enabled XSUBs will
+be given Perl prototypes.  This keyword may be used multiple times in an XS
+module to enable and disable prototypes for different parts of the module.
+
+To enable prototypes:
+
+    PROTOTYPES: ENABLE
+
+To disable prototypes:
+
+    PROTOTYPES: DISABLE
+
+=head2 The PROTOTYPE: Keyword
+
+This keyword is similar to the PROTOTYPES: keyword above but can be used to
+force B<xsubpp> to use a specific prototype for the XSUB.  This keyword
+overrides all other prototype options and keywords but affects only the
+current XSUB.  Consult L<perlsub/Prototypes> for information about Perl
+prototypes.
+
+    bool_t
+    rpcb_gettime(timep, ...)
+          time_t timep = NO_INIT
+	PROTOTYPE: $;$
+	PREINIT:
+          char *host = "localhost";
+	  STRLEN n_a;
+        CODE:
+		  if( items > 1 )
+		       host = (char *)SvPV(ST(1), n_a);
+		  RETVAL = rpcb_gettime( host, &timep );
+        OUTPUT:
+          timep
+          RETVAL
+
+If the prototypes are enabled, you can disable it locally for a given
+XSUB as in the following example:
+
+    void
+    rpcb_gettime_noproto()
+        PROTOTYPE: DISABLE
+    ...
+
+=head2 The ALIAS: Keyword
+
+The ALIAS: keyword allows an XSUB to have two or more unique Perl names
+and to know which of those names was used when it was invoked.  The Perl
+names may be fully-qualified with package names.  Each alias is given an
+index.  The compiler will setup a variable called C<ix> which contain the
+index of the alias which was used.  When the XSUB is called with its
+declared name C<ix> will be 0.
+
+The following example will create aliases C<FOO::gettime()> and
+C<BAR::getit()> for this function.
+
+    bool_t
+    rpcb_gettime(host,timep)
+          char *host
+          time_t &timep
+	ALIAS:
+	    FOO::gettime = 1
+	    BAR::getit = 2
+	INIT:
+	  printf("# ix = %d\n", ix );
+        OUTPUT:
+          timep
+
+=head2 The OVERLOAD: Keyword
+
+Instead of writing an overloaded interface using pure Perl, you
+can also use the OVERLOAD keyword to define additional Perl names
+for your functions (like the ALIAS: keyword above).  However, the
+overloaded functions must be defined with three parameters (except
+for the nomethod() function which needs four parameters).  If any
+function has the OVERLOAD: keyword, several additional lines
+will be defined in the c file generated by xsubpp in order to 
+register with the overload magic.
+
+Since blessed objects are actually stored as RV's, it is useful
+to use the typemap features to preprocess parameters and extract
+the actual SV stored within the blessed RV. See the sample for
+T_PTROBJ_SPECIAL below.
+
+To use the OVERLOAD: keyword, create an XS function which takes
+three input parameters ( or use the c style '...' definition) like
+this:
+
+    SV *
+    cmp (lobj, robj, swap)
+    My_Module_obj    lobj
+    My_Module_obj    robj
+    IV               swap
+    OVERLOAD: cmp <=>
+    { /* function defined here */}
+
+In this case, the function will overload both of the three way
+comparison operators.  For all overload operations using non-alpha
+characters, you must type the parameter without quoting, seperating
+multiple overloads with whitespace.  Note that "" (the stringify 
+overload) should be entered as \"\" (i.e. escaped).
+
+=head2 The FALLBACK: Keyword
+
+In addition to the OVERLOAD keyword, if you need to control how
+Perl autogenerates missing overloaded operators, you can set the
+FALLBACK keyword in the module header section, like this:
+
+    MODULE = RPC  PACKAGE = RPC
+
+    FALLBACK: TRUE
+    ...
+
+where FALLBACK can take any of the three values TRUE, FALSE, or
+UNDEF.  If you do not set any FALLBACK value when using OVERLOAD,
+it defaults to UNDEF.  FALLBACK is not used except when one or 
+more functions using OVERLOAD have been defined.  Please see
+L<overload/Fallback> for more details.
+
+=head2 The INTERFACE: Keyword
+
+This keyword declares the current XSUB as a keeper of the given
+calling signature.  If some text follows this keyword, it is
+considered as a list of functions which have this signature, and
+should be attached to the current XSUB.
+
+For example, if you have 4 C functions multiply(), divide(), add(),
+subtract() all having the signature:
+
+    symbolic f(symbolic, symbolic);
+
+you can make them all to use the same XSUB using this:
+
+    symbolic
+    interface_s_ss(arg1, arg2)  
+	symbolic	arg1
+	symbolic	arg2
+    INTERFACE:
+	multiply divide 
+	add subtract
+
+(This is the complete XSUB code for 4 Perl functions!)  Four generated
+Perl function share names with corresponding C functions.
+
+The advantage of this approach comparing to ALIAS: keyword is that there
+is no need to code a switch statement, each Perl function (which shares
+the same XSUB) knows which C function it should call.  Additionally, one
+can attach an extra function remainder() at runtime by using
+
+    CV *mycv = newXSproto("Symbolic::remainder", 
+			  XS_Symbolic_interface_s_ss, __FILE__, "$$");
+    XSINTERFACE_FUNC_SET(mycv, remainder);
+
+say, from another XSUB.  (This example supposes that there was no
+INTERFACE_MACRO: section, otherwise one needs to use something else instead of
+C<XSINTERFACE_FUNC_SET>, see the next section.)
+
+=head2 The INTERFACE_MACRO: Keyword
+
+This keyword allows one to define an INTERFACE using a different way
+to extract a function pointer from an XSUB.  The text which follows
+this keyword should give the name of macros which would extract/set a
+function pointer.  The extractor macro is given return type, C<CV*>,
+and C<XSANY.any_dptr> for this C<CV*>.  The setter macro is given cv,
+and the function pointer.
+
+The default value is C<XSINTERFACE_FUNC> and C<XSINTERFACE_FUNC_SET>.
+An INTERFACE keyword with an empty list of functions can be omitted if
+INTERFACE_MACRO keyword is used.
+
+Suppose that in the previous example functions pointers for 
+multiply(), divide(), add(), subtract() are kept in a global C array
+C<fp[]> with offsets being C<multiply_off>, C<divide_off>, C<add_off>,
+C<subtract_off>.  Then one can use 
+
+    #define XSINTERFACE_FUNC_BYOFFSET(ret,cv,f) \
+	((XSINTERFACE_CVT(ret,))fp[CvXSUBANY(cv).any_i32])
+    #define XSINTERFACE_FUNC_BYOFFSET_set(cv,f) \
+	CvXSUBANY(cv).any_i32 = CAT2( f, _off )
+
+in C section,
+
+    symbolic
+    interface_s_ss(arg1, arg2)  
+	symbolic	arg1
+	symbolic	arg2
+      INTERFACE_MACRO: 
+	XSINTERFACE_FUNC_BYOFFSET
+	XSINTERFACE_FUNC_BYOFFSET_set
+      INTERFACE:
+	multiply divide 
+	add subtract
+
+in XSUB section.
+
+=head2 The INCLUDE: Keyword
+
+This keyword can be used to pull other files into the XS module.  The other
+files may have XS code.  INCLUDE: can also be used to run a command to
+generate the XS code to be pulled into the module.
+
+The file F<Rpcb1.xsh> contains our C<rpcb_gettime()> function:
+
+    bool_t
+    rpcb_gettime(host,timep)
+          char *host
+          time_t &timep
+        OUTPUT:
+          timep
+
+The XS module can use INCLUDE: to pull that file into it.
+
+    INCLUDE: Rpcb1.xsh
+
+If the parameters to the INCLUDE: keyword are followed by a pipe (C<|>) then
+the compiler will interpret the parameters as a command.
+
+    INCLUDE: cat Rpcb1.xsh |
+
+=head2 The CASE: Keyword
+
+The CASE: keyword allows an XSUB to have multiple distinct parts with each
+part acting as a virtual XSUB.  CASE: is greedy and if it is used then all
+other XS keywords must be contained within a CASE:.  This means nothing may
+precede the first CASE: in the XSUB and anything following the last CASE: is
+included in that case.
+
+A CASE: might switch via a parameter of the XSUB, via the C<ix> ALIAS:
+variable (see L<"The ALIAS: Keyword">), or maybe via the C<items> variable
+(see L<"Variable-length Parameter Lists">).  The last CASE: becomes the
+B<default> case if it is not associated with a conditional.  The following
+example shows CASE switched via C<ix> with a function C<rpcb_gettime()>
+having an alias C<x_gettime()>.  When the function is called as
+C<rpcb_gettime()> its parameters are the usual C<(char *host, time_t *timep)>,
+but when the function is called as C<x_gettime()> its parameters are
+reversed, C<(time_t *timep, char *host)>.
+
+    long
+    rpcb_gettime(a,b)
+      CASE: ix == 1
+	ALIAS:
+	  x_gettime = 1
+	INPUT:
+	  # 'a' is timep, 'b' is host
+          char *b
+          time_t a = NO_INIT
+        CODE:
+               RETVAL = rpcb_gettime( b, &a );
+        OUTPUT:
+          a
+          RETVAL
+      CASE:
+	  # 'a' is host, 'b' is timep
+          char *a
+          time_t &b = NO_INIT
+        OUTPUT:
+          b
+          RETVAL
+
+That function can be called with either of the following statements.  Note
+the different argument lists.
+
+	$status = rpcb_gettime( $host, $timep );
+
+	$status = x_gettime( $timep, $host );
+
+=head2 The & Unary Operator
+
+The C<&> unary operator in the INPUT: section is used to tell B<xsubpp>
+that it should convert a Perl value to/from C using the C type to the left
+of C<&>, but provide a pointer to this value when the C function is called.
+
+This is useful to avoid a CODE: block for a C function which takes a parameter
+by reference.  Typically, the parameter should be not a pointer type (an
+C<int> or C<long> but not an C<int*> or C<long*>).
+
+The following XSUB will generate incorrect C code.  The B<xsubpp> compiler will
+turn this into code which calls C<rpcb_gettime()> with parameters C<(char
+*host, time_t timep)>, but the real C<rpcb_gettime()> wants the C<timep>
+parameter to be of type C<time_t*> rather than C<time_t>.
+
+    bool_t
+    rpcb_gettime(host,timep)
+          char *host
+          time_t timep
+        OUTPUT:
+          timep
+
+That problem is corrected by using the C<&> operator.  The B<xsubpp> compiler
+will now turn this into code which calls C<rpcb_gettime()> correctly with
+parameters C<(char *host, time_t *timep)>.  It does this by carrying the
+C<&> through, so the function call looks like C<rpcb_gettime(host, &timep)>.
+
+    bool_t
+    rpcb_gettime(host,timep)
+          char *host
+          time_t &timep
+        OUTPUT:
+          timep
+
+=head2 Inserting POD, Comments and C Preprocessor Directives
+
+C preprocessor directives are allowed within BOOT:, PREINIT: INIT:, CODE:,
+PPCODE:, POSTCALL:, and CLEANUP: blocks, as well as outside the functions.
+Comments are allowed anywhere after the MODULE keyword.  The compiler will
+pass the preprocessor directives through untouched and will remove the
+commented lines. POD documentation is allowed at any point, both in the
+C and XS language sections. POD must be terminated with a C<=cut> command;
+C<xsubpp> will exit with an error if it does not. It is very unlikely that
+human generated C code will be mistaken for POD, as most indenting styles
+result in whitespace in front of any line starting with C<=>. Machine
+generated XS files may fall into this trap unless care is taken to
+ensure that a space breaks the sequence "\n=".
+
+Comments can be added to XSUBs by placing a C<#> as the first
+non-whitespace of a line.  Care should be taken to avoid making the
+comment look like a C preprocessor directive, lest it be interpreted as
+such.  The simplest way to prevent this is to put whitespace in front of
+the C<#>.
+
+If you use preprocessor directives to choose one of two
+versions of a function, use
+
+    #if ... version1
+    #else /* ... version2  */
+    #endif
+
+and not
+
+    #if ... version1
+    #endif
+    #if ... version2
+    #endif
+
+because otherwise B<xsubpp> will believe that you made a duplicate
+definition of the function.  Also, put a blank line before the
+#else/#endif so it will not be seen as part of the function body.
+
+=head2 Using XS With C++
+
+If an XSUB name contains C<::>, it is considered to be a C++ method.
+The generated Perl function will assume that
+its first argument is an object pointer.  The object pointer
+will be stored in a variable called THIS.  The object should
+have been created by C++ with the new() function and should
+be blessed by Perl with the sv_setref_pv() macro.  The
+blessing of the object by Perl can be handled by a typemap.  An example
+typemap is shown at the end of this section.
+
+If the return type of the XSUB includes C<static>, the method is considered
+to be a static method.  It will call the C++
+function using the class::method() syntax.  If the method is not static
+the function will be called using the THIS-E<gt>method() syntax.
+
+The next examples will use the following C++ class.
+
+     class color {
+          public:
+          color();
+          ~color();
+          int blue();
+          void set_blue( int );
+
+          private:
+          int c_blue;
+     };
+
+The XSUBs for the blue() and set_blue() methods are defined with the class
+name but the parameter for the object (THIS, or "self") is implicit and is
+not listed.
+
+     int
+     color::blue()
+
+     void
+     color::set_blue( val )
+          int val
+
+Both Perl functions will expect an object as the first parameter.  In the 
+generated C++ code the object is called C<THIS>, and the method call will
+be performed on this object.  So in the C++ code the blue() and set_blue()
+methods will be called as this:
+
+     RETVAL = THIS->blue();
+
+     THIS->set_blue( val );
+
+You could also write a single get/set method using an optional argument:
+
+     int
+     color::blue( val = NO_INIT )
+         int val
+         PROTOTYPE $;$
+         CODE:
+             if (items > 1)
+                 THIS->set_blue( val );
+             RETVAL = THIS->blue();
+         OUTPUT:
+             RETVAL
+
+If the function's name is B<DESTROY> then the C++ C<delete> function will be
+called and C<THIS> will be given as its parameter.  The generated C++ code for
+
+     void
+     color::DESTROY()
+
+will look like this:
+
+     color *THIS = ...;	// Initialized as in typemap
+
+     delete THIS;
+
+If the function's name is B<new> then the C++ C<new> function will be called
+to create a dynamic C++ object.  The XSUB will expect the class name, which
+will be kept in a variable called C<CLASS>, to be given as the first
+argument.
+
+     color *
+     color::new()
+
+The generated C++ code will call C<new>.
+
+     RETVAL = new color();
+
+The following is an example of a typemap that could be used for this C++
+example.
+
+    TYPEMAP
+    color *		O_OBJECT
+
+    OUTPUT
+    # The Perl object is blessed into 'CLASS', which should be a
+    # char* having the name of the package for the blessing.
+    O_OBJECT
+    	sv_setref_pv( $arg, CLASS, (void*)$var );
+
+    INPUT
+    O_OBJECT
+    	if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) )
+    		$var = ($type)SvIV((SV*)SvRV( $arg ));
+    	else{
+    		warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
+    		XSRETURN_UNDEF;
+    	}
+
+=head2 Interface Strategy
+
+When designing an interface between Perl and a C library a straight
+translation from C to XS (such as created by C<h2xs -x>) is often sufficient.
+However, sometimes the interface will look
+very C-like and occasionally nonintuitive, especially when the C function
+modifies one of its parameters, or returns failure inband (as in "negative
+return values mean failure").  In cases where the programmer wishes to
+create a more Perl-like interface the following strategy may help to
+identify the more critical parts of the interface.
+
+Identify the C functions with input/output or output parameters.  The XSUBs for
+these functions may be able to return lists to Perl.
+
+Identify the C functions which use some inband info as an indication
+of failure.  They may be
+candidates to return undef or an empty list in case of failure.  If the
+failure may be detected without a call to the C function, you may want to use
+an INIT: section to report the failure.  For failures detectable after the C
+function returns one may want to use a POSTCALL: section to process the
+failure.  In more complicated cases use CODE: or PPCODE: sections.
+
+If many functions use the same failure indication based on the return value,
+you may want to create a special typedef to handle this situation.  Put
+
+  typedef int negative_is_failure;
+
+near the beginning of XS file, and create an OUTPUT typemap entry
+for C<negative_is_failure> which converts negative values to C<undef>, or
+maybe croak()s.  After this the return value of type C<negative_is_failure>
+will create more Perl-like interface.
+
+Identify which values are used by only the C and XSUB functions
+themselves, say, when a parameter to a function should be a contents of a
+global variable.  If Perl does not need to access the contents of the value
+then it may not be necessary to provide a translation for that value
+from C to Perl.
+
+Identify the pointers in the C function parameter lists and return
+values.  Some pointers may be used to implement input/output or
+output parameters, they can be handled in XS with the C<&> unary operator,
+and, possibly, using the NO_INIT keyword.
+Some others will require handling of types like C<int *>, and one needs
+to decide what a useful Perl translation will do in such a case.  When
+the semantic is clear, it is advisable to put the translation into a typemap
+file.
+
+Identify the structures used by the C functions.  In many
+cases it may be helpful to use the T_PTROBJ typemap for
+these structures so they can be manipulated by Perl as
+blessed objects.  (This is handled automatically by C<h2xs -x>.)
+
+If the same C type is used in several different contexts which require
+different translations, C<typedef> several new types mapped to this C type,
+and create separate F<typemap> entries for these new types.  Use these
+types in declarations of return type and parameters to XSUBs.
+
+=head2 Perl Objects And C Structures
+
+When dealing with C structures one should select either
+B<T_PTROBJ> or B<T_PTRREF> for the XS type.  Both types are
+designed to handle pointers to complex objects.  The
+T_PTRREF type will allow the Perl object to be unblessed
+while the T_PTROBJ type requires that the object be blessed.
+By using T_PTROBJ one can achieve a form of type-checking
+because the XSUB will attempt to verify that the Perl object
+is of the expected type.
+
+The following XS code shows the getnetconfigent() function which is used
+with ONC+ TIRPC.  The getnetconfigent() function will return a pointer to a
+C structure and has the C prototype shown below.  The example will
+demonstrate how the C pointer will become a Perl reference.  Perl will
+consider this reference to be a pointer to a blessed object and will
+attempt to call a destructor for the object.  A destructor will be
+provided in the XS source to free the memory used by getnetconfigent().
+Destructors in XS can be created by specifying an XSUB function whose name
+ends with the word B<DESTROY>.  XS destructors can be used to free memory
+which may have been malloc'd by another XSUB.
+
+     struct netconfig *getnetconfigent(const char *netid);
+
+A C<typedef> will be created for C<struct netconfig>.  The Perl
+object will be blessed in a class matching the name of the C
+type, with the tag C<Ptr> appended, and the name should not
+have embedded spaces if it will be a Perl package name.  The
+destructor will be placed in a class corresponding to the
+class of the object and the PREFIX keyword will be used to
+trim the name to the word DESTROY as Perl will expect.
+
+     typedef struct netconfig Netconfig;
+
+     MODULE = RPC  PACKAGE = RPC
+
+     Netconfig *
+     getnetconfigent(netid)
+          char *netid
+
+     MODULE = RPC  PACKAGE = NetconfigPtr  PREFIX = rpcb_
+
+     void
+     rpcb_DESTROY(netconf)
+          Netconfig *netconf
+        CODE:
+          printf("Now in NetconfigPtr::DESTROY\n");
+          free( netconf );
+
+This example requires the following typemap entry.  Consult the typemap
+section for more information about adding new typemaps for an extension.
+
+     TYPEMAP
+     Netconfig *  T_PTROBJ
+
+This example will be used with the following Perl statements.
+
+     use RPC;
+     $netconf = getnetconfigent("udp");
+
+When Perl destroys the object referenced by $netconf it will send the
+object to the supplied XSUB DESTROY function.  Perl cannot determine, and
+does not care, that this object is a C struct and not a Perl object.  In
+this sense, there is no difference between the object created by the
+getnetconfigent() XSUB and an object created by a normal Perl subroutine.
+
+=head2 The Typemap
+
+The typemap is a collection of code fragments which are used by the B<xsubpp>
+compiler to map C function parameters and values to Perl values.  The
+typemap file may consist of three sections labelled C<TYPEMAP>, C<INPUT>, and
+C<OUTPUT>.  An unlabelled initial section is assumed to be a C<TYPEMAP>
+section.  The INPUT section tells
+the compiler how to translate Perl values
+into variables of certain C types.  The OUTPUT section tells the compiler
+how to translate the values from certain C types into values Perl can
+understand.  The TYPEMAP section tells the compiler which of the INPUT and
+OUTPUT code fragments should be used to map a given C type to a Perl value.
+The section labels C<TYPEMAP>, C<INPUT>, or C<OUTPUT> must begin
+in the first column on a line by themselves, and must be in uppercase.
+
+The default typemap in the C<lib/ExtUtils> directory of the Perl source
+contains many useful types which can be used by Perl extensions.  Some
+extensions define additional typemaps which they keep in their own directory.
+These additional typemaps may reference INPUT and OUTPUT maps in the main
+typemap.  The B<xsubpp> compiler will allow the extension's own typemap to
+override any mappings which are in the default typemap.
+
+Most extensions which require a custom typemap will need only the TYPEMAP
+section of the typemap file.  The custom typemap used in the
+getnetconfigent() example shown earlier demonstrates what may be the typical
+use of extension typemaps.  That typemap is used to equate a C structure
+with the T_PTROBJ typemap.  The typemap used by getnetconfigent() is shown
+here.  Note that the C type is separated from the XS type with a tab and
+that the C unary operator C<*> is considered to be a part of the C type name.
+
+	TYPEMAP
+	Netconfig *<tab>T_PTROBJ
+
+Here's a more complicated example: suppose that you wanted C<struct
+netconfig> to be blessed into the class C<Net::Config>.  One way to do
+this is to use underscores (_) to separate package names, as follows:
+
+        typedef struct netconfig * Net_Config;
+
+And then provide a typemap entry C<T_PTROBJ_SPECIAL> that maps underscores to
+double-colons (::), and declare C<Net_Config> to be of that type:
+
+
+        TYPEMAP
+        Net_Config      T_PTROBJ_SPECIAL
+
+        INPUT
+        T_PTROBJ_SPECIAL
+                if (sv_derived_from($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\")) {
+                        IV tmp = SvIV((SV*)SvRV($arg));
+                        $var = INT2PTR($type, tmp);
+                }
+                else
+                        croak(\"$var is not of type ${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\")
+
+        OUTPUT
+        T_PTROBJ_SPECIAL
+                sv_setref_pv($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\",
+                (void*)$var);
+
+The INPUT and OUTPUT sections substitute underscores for double-colons
+on the fly, giving the desired effect.  This example demonstrates some
+of the power and versatility of the typemap facility.
+
+The INT2PTR macro (defined in perl.h) casts an integer to a pointer, 
+of a given type, taking care of the possible different size of integers
+and pointers.  There are also PTR2IV, PTR2UV, PTR2NV macros,
+to map the other way, which may be useful in OUTPUT sections.
+
+=head2 Safely Storing Static Data in XS
+
+Starting with Perl 5.8, a macro framework has been defined to allow
+static data to be safely stored in XS modules that will be accessed from
+a multi-threaded Perl.
+
+Although primarily designed for use with multi-threaded Perl, the macros
+have been designed so that they will work with non-threaded Perl as well.
+
+It is therefore strongly recommended that these macros be used by all
+XS modules that make use of static data.
+
+The easiest way to get a template set of macros to use is by specifying
+the C<-g> (C<--global>) option with h2xs (see L<h2xs>).
+
+Below is an example module that makes use of the macros.
+
+    #include "EXTERN.h"
+    #include "perl.h"
+    #include "XSUB.h"
+
+    /* Global Data */
+
+    #define MY_CXT_KEY "BlindMice::_guts" XS_VERSION
+
+    typedef struct {
+        int count;
+        char name[3][100];
+    } my_cxt_t;
+
+    START_MY_CXT
+
+    MODULE = BlindMice           PACKAGE = BlindMice
+
+    BOOT:
+    {
+        MY_CXT_INIT;
+        MY_CXT.count = 0;
+        strcpy(MY_CXT.name[0], "None");
+        strcpy(MY_CXT.name[1], "None");
+        strcpy(MY_CXT.name[2], "None");
+    }                              
+
+    int
+    newMouse(char * name)
+        char * name;
+        PREINIT:
+          dMY_CXT;
+        CODE:
+          if (MY_CXT.count >= 3) {
+              warn("Already have 3 blind mice");
+              RETVAL = 0;
+          }
+          else {
+              RETVAL = ++ MY_CXT.count;
+              strcpy(MY_CXT.name[MY_CXT.count - 1], name);
+          }
+
+    char *
+    get_mouse_name(index)
+      int index
+      CODE:
+        dMY_CXT;
+        RETVAL = MY_CXT.lives ++;
+        if (index > MY_CXT.count)
+          croak("There are only 3 blind mice.");
+        else
+          RETVAL = newSVpv(MY_CXT.name[index - 1]);
+
+
+B<REFERENCE>
+
+=over 5
+
+=item MY_CXT_KEY
+
+This macro is used to define a unique key to refer to the static data
+for an XS module. The suggested naming scheme, as used by h2xs, is to
+use a string that consists of the module name, the string "::_guts"
+and the module version number.
+
+    #define MY_CXT_KEY "MyModule::_guts" XS_VERSION
+
+=item typedef my_cxt_t
+
+This struct typedef I<must> always be called C<my_cxt_t> -- the other
+C<CXT*> macros assume the existence of the C<my_cxt_t> typedef name.
+
+Declare a typedef named C<my_cxt_t> that is a structure that contains
+all the data that needs to be interpreter-local.
+
+    typedef struct {
+        int some_value;
+    } my_cxt_t;
+
+=item START_MY_CXT
+
+Always place the START_MY_CXT macro directly after the declaration
+of C<my_cxt_t>.
+
+=item MY_CXT_INIT
+
+The MY_CXT_INIT macro initialises storage for the C<my_cxt_t> struct.
+
+It I<must> be called exactly once -- typically in a BOOT: section.
+
+=item dMY_CXT
+
+Use the dMY_CXT macro (a declaration) in all the functions that access
+MY_CXT.
+
+=item MY_CXT
+
+Use the MY_CXT macro to access members of the C<my_cxt_t> struct. For
+example, if C<my_cxt_t> is 
+
+    typedef struct {
+        int index;
+    } my_cxt_t;
+
+then use this to access the C<index> member
+
+    dMY_CXT;
+    MY_CXT.index = 2;
+
+=back
+
+=head1 EXAMPLES
+
+File C<RPC.xs>: Interface to some ONC+ RPC bind library functions.
+
+     #include "EXTERN.h"
+     #include "perl.h"
+     #include "XSUB.h"
+
+     #include <rpc/rpc.h>
+
+     typedef struct netconfig Netconfig;
+
+     MODULE = RPC  PACKAGE = RPC
+
+     SV *
+     rpcb_gettime(host="localhost")
+          char *host
+	PREINIT:
+          time_t  timep;
+        CODE:
+          ST(0) = sv_newmortal();
+          if( rpcb_gettime( host, &timep ) )
+               sv_setnv( ST(0), (double)timep );
+
+     Netconfig *
+     getnetconfigent(netid="udp")
+          char *netid
+
+     MODULE = RPC  PACKAGE = NetconfigPtr  PREFIX = rpcb_
+
+     void
+     rpcb_DESTROY(netconf)
+          Netconfig *netconf
+        CODE:
+          printf("NetconfigPtr::DESTROY\n");
+          free( netconf );
+
+File C<typemap>: Custom typemap for RPC.xs.
+
+     TYPEMAP
+     Netconfig *  T_PTROBJ
+
+File C<RPC.pm>: Perl module for the RPC extension.
+
+     package RPC;
+
+     require Exporter;
+     require DynaLoader;
+     @ISA = qw(Exporter DynaLoader);
+     @EXPORT = qw(rpcb_gettime getnetconfigent);
+
+     bootstrap RPC;
+     1;
+
+File C<rpctest.pl>: Perl test program for the RPC extension.
+
+     use RPC;
+
+     $netconf = getnetconfigent();
+     $a = rpcb_gettime();
+     print "time = $a\n";
+     print "netconf = $netconf\n";
+
+     $netconf = getnetconfigent("tcp");
+     $a = rpcb_gettime("poplar");
+     print "time = $a\n";
+     print "netconf = $netconf\n";
+
+
+=head1 XS VERSION
+
+This document covers features supported by C<xsubpp> 1.935.
+
+=head1 AUTHOR
+
+Originally written by Dean Roehrich <F<roehrich@cray.com>>.
+
+Maintained since 1996 by The Perl Porters <F<perlbug@perl.org>>.
Index: /for-distributions/trunk/bin/windows/perl/lib/Pod/perlxstut.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Pod/perlxstut.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Pod/perlxstut.pod	(revision 14489)
@@ -0,0 +1,1364 @@
+=head1 NAME
+
+perlXStut - Tutorial for writing XSUBs
+
+=head1 DESCRIPTION
+
+This tutorial will educate the reader on the steps involved in creating
+a Perl extension.  The reader is assumed to have access to L<perlguts>,
+L<perlapi> and L<perlxs>.
+
+This tutorial starts with very simple examples and becomes more complex,
+with each new example adding new features.  Certain concepts may not be
+completely explained until later in the tutorial in order to slowly ease
+the reader into building extensions.
+
+This tutorial was written from a Unix point of view.  Where I know them
+to be otherwise different for other platforms (e.g. Win32), I will list
+them.  If you find something that was missed, please let me know.
+
+=head1 SPECIAL NOTES
+
+=head2 make
+
+This tutorial assumes that the make program that Perl is configured to
+use is called C<make>.  Instead of running "make" in the examples that
+follow, you may have to substitute whatever make program Perl has been
+configured to use.  Running B<perl -V:make> should tell you what it is.
+
+=head2 Version caveat
+
+When writing a Perl extension for general consumption, one should expect that
+the extension will be used with versions of Perl different from the
+version available on your machine.  Since you are reading this document,
+the version of Perl on your machine is probably 5.005 or later, but the users
+of your extension may have more ancient versions.
+
+To understand what kinds of incompatibilities one may expect, and in the rare
+case that the version of Perl on your machine is older than this document,
+see the section on "Troubleshooting these Examples" for more information.
+
+If your extension uses some features of Perl which are not available on older
+releases of Perl, your users would appreciate an early meaningful warning.
+You would probably put this information into the F<README> file, but nowadays
+installation of extensions may be performed automatically, guided by F<CPAN.pm>
+module or other tools.
+
+In MakeMaker-based installations, F<Makefile.PL> provides the earliest
+opportunity to perform version checks.  One can put something like this
+in F<Makefile.PL> for this purpose:
+
+    eval { require 5.007 }
+        or die <<EOD;
+    ############
+    ### This module uses frobnication framework which is not available before
+    ### version 5.007 of Perl.  Upgrade your Perl before installing Kara::Mba.
+    ############
+    EOD
+
+=head2 Dynamic Loading versus Static Loading
+
+It is commonly thought that if a system does not have the capability to
+dynamically load a library, you cannot build XSUBs.  This is incorrect.
+You I<can> build them, but you must link the XSUBs subroutines with the
+rest of Perl, creating a new executable.  This situation is similar to
+Perl 4.
+
+This tutorial can still be used on such a system.  The XSUB build mechanism
+will check the system and build a dynamically-loadable library if possible,
+or else a static library and then, optionally, a new statically-linked
+executable with that static library linked in.
+
+Should you wish to build a statically-linked executable on a system which
+can dynamically load libraries, you may, in all the following examples,
+where the command "C<make>" with no arguments is executed, run the command
+"C<make perl>" instead.
+
+If you have generated such a statically-linked executable by choice, then
+instead of saying "C<make test>", you should say "C<make test_static>".
+On systems that cannot build dynamically-loadable libraries at all, simply
+saying "C<make test>" is sufficient.
+
+=head1 TUTORIAL
+
+Now let's go on with the show!
+
+=head2 EXAMPLE 1
+
+Our first extension will be very simple.  When we call the routine in the
+extension, it will print out a well-known message and return.
+
+Run "C<h2xs -A -n Mytest>".  This creates a directory named Mytest,
+possibly under ext/ if that directory exists in the current working
+directory.  Several files will be created in the Mytest dir, including
+MANIFEST, Makefile.PL, Mytest.pm, Mytest.xs, test.pl, and Changes.
+
+The MANIFEST file contains the names of all the files just created in the
+Mytest directory.
+
+The file Makefile.PL should look something like this:
+
+	use ExtUtils::MakeMaker;
+	# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+	# the contents of the Makefile that is written.
+	WriteMakefile(
+	    NAME         => 'Mytest',
+	    VERSION_FROM => 'Mytest.pm', # finds $VERSION
+	    LIBS         => [''],   # e.g., '-lm'
+	    DEFINE       => '',     # e.g., '-DHAVE_SOMETHING'
+	    INC          => '',     # e.g., '-I/usr/include/other'
+	);
+
+The file Mytest.pm should start with something like this:
+
+	package Mytest;
+
+	use strict;
+        use warnings;
+
+	require Exporter;
+	require DynaLoader;
+
+	our @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.
+	our @EXPORT = qw(
+
+	);
+	our $VERSION = '0.01';
+
+	bootstrap Mytest $VERSION;
+
+	# Preloaded methods go here.
+
+	# Autoload methods go after __END__, and are processed by the autosplit program.
+
+	1;
+	__END__
+	# Below is the stub of documentation for your module. You better edit it!
+
+The rest of the .pm file contains sample code for providing documentation for
+the extension.
+
+Finally, the Mytest.xs file should look something like this:
+
+	#include "EXTERN.h"
+	#include "perl.h"
+	#include "XSUB.h"
+
+	MODULE = Mytest		PACKAGE = Mytest
+
+Let's edit the .xs file by adding this to the end of the file:
+
+	void
+	hello()
+	    CODE:
+		printf("Hello, world!\n");
+
+It is okay for the lines starting at the "CODE:" line to not be indented.
+However, for readability purposes, it is suggested that you indent CODE:
+one level and the lines following one more level.
+
+Now we'll run "C<perl Makefile.PL>".  This will create a real Makefile,
+which make needs.  Its output looks something like:
+
+	% perl Makefile.PL
+	Checking if your kit is complete...
+	Looks good
+	Writing Makefile for Mytest
+	%
+
+Now, running make will produce output that looks something like this (some
+long lines have been shortened for clarity and some extraneous lines have
+been deleted):
+
+	% make
+	umask 0 && cp Mytest.pm ./blib/Mytest.pm
+	perl xsubpp -typemap typemap Mytest.xs >Mytest.tc && mv Mytest.tc Mytest.c
+	Please specify prototyping behavior for Mytest.xs (see perlxs manual)
+	cc -c Mytest.c
+	Running Mkbootstrap for Mytest ()
+	chmod 644 Mytest.bs
+	LD_RUN_PATH="" ld -o ./blib/PA-RISC1.1/auto/Mytest/Mytest.sl -b Mytest.o
+	chmod 755 ./blib/PA-RISC1.1/auto/Mytest/Mytest.sl
+	cp Mytest.bs ./blib/PA-RISC1.1/auto/Mytest/Mytest.bs
+	chmod 644 ./blib/PA-RISC1.1/auto/Mytest/Mytest.bs
+	Manifying ./blib/man3/Mytest.3
+	%
+
+You can safely ignore the line about "prototyping behavior" - it is
+explained in the section "The PROTOTYPES: Keyword" in L<perlxs>.
+
+If you are on a Win32 system, and the build process fails with linker
+errors for functions in the C library, check if your Perl is configured
+to use PerlCRT (running B<perl -V:libc> should show you if this is the
+case).  If Perl is configured to use PerlCRT, you have to make sure
+PerlCRT.lib is copied to the same location that msvcrt.lib lives in,
+so that the compiler can find it on its own.  msvcrt.lib is usually
+found in the Visual C compiler's lib directory (e.g. C:/DevStudio/VC/lib).
+
+Perl has its own special way of easily writing test scripts, but for this
+example only, we'll create our own test script.  Create a file called hello
+that looks like this:
+
+	#! /opt/perl5/bin/perl
+
+	use ExtUtils::testlib;
+
+	use Mytest;
+
+	Mytest::hello();
+
+Now we make the script executable (C<chmod +x hello>), run the script
+and we should see the following output:
+
+	% ./hello
+	Hello, world!
+	%
+
+=head2 EXAMPLE 2
+
+Now let's add to our extension a subroutine that will take a single numeric
+argument as input and return 0 if the number is even or 1 if the number
+is odd.
+
+Add the following to the end of Mytest.xs:
+
+	int
+	is_even(input)
+		int	input
+	    CODE:
+		RETVAL = (input % 2 == 0);
+	    OUTPUT:
+		RETVAL
+
+There does not need to be whitespace at the start of the "C<int input>"
+line, but it is useful for improving readability.  Placing a semi-colon at
+the end of that line is also optional.  Any amount and kind of whitespace
+may be placed between the "C<int>" and "C<input>".
+
+Now re-run make to rebuild our new shared library.
+
+Now perform the same steps as before, generating a Makefile from the
+Makefile.PL file, and running make.
+
+In order to test that our extension works, we now need to look at the
+file test.pl.  This file is set up to imitate the same kind of testing
+structure that Perl itself has.  Within the test script, you perform a
+number of tests to confirm the behavior of the extension, printing "ok"
+when the test is correct, "not ok" when it is not.  Change the print
+statement in the BEGIN block to print "1..4", and add the following code
+to the end of the file:
+
+	print &Mytest::is_even(0) == 1 ? "ok 2" : "not ok 2", "\n";
+	print &Mytest::is_even(1) == 0 ? "ok 3" : "not ok 3", "\n";
+	print &Mytest::is_even(2) == 1 ? "ok 4" : "not ok 4", "\n";
+
+We will be calling the test script through the command "C<make test>".  You
+should see output that looks something like this:
+
+	% make test
+	PERL_DL_NONLAZY=1 /opt/perl5.004/bin/perl (lots of -I arguments) test.pl
+	1..4
+	ok 1
+	ok 2
+	ok 3
+	ok 4
+	%
+
+=head2 What has gone on?
+
+The program h2xs is the starting point for creating extensions.  In later
+examples we'll see how we can use h2xs to read header files and generate
+templates to connect to C routines.
+
+h2xs creates a number of files in the extension directory.  The file
+Makefile.PL is a perl script which will generate a true Makefile to build
+the extension.  We'll take a closer look at it later.
+
+The .pm and .xs files contain the meat of the extension.  The .xs file holds
+the C routines that make up the extension.  The .pm file contains routines
+that tell Perl how to load your extension.
+
+Generating the Makefile and running C<make> created a directory called blib
+(which stands for "build library") in the current working directory.  This
+directory will contain the shared library that we will build.  Once we have
+tested it, we can install it into its final location.
+
+Invoking the test script via "C<make test>" did something very important.
+It invoked perl with all those C<-I> arguments so that it could find the
+various files that are part of the extension.  It is I<very> important that
+while you are still testing extensions that you use "C<make test>".  If you
+try to run the test script all by itself, you will get a fatal error.
+Another reason it is important to use "C<make test>" to run your test
+script is that if you are testing an upgrade to an already-existing version,
+using "C<make test>" insures that you will test your new extension, not the
+already-existing version.
+
+When Perl sees a C<use extension;>, it searches for a file with the same name
+as the C<use>'d extension that has a .pm suffix.  If that file cannot be found,
+Perl dies with a fatal error.  The default search path is contained in the
+C<@INC> array.
+
+In our case, Mytest.pm tells perl that it will need the Exporter and Dynamic
+Loader extensions.  It then sets the C<@ISA> and C<@EXPORT> arrays and the
+C<$VERSION> scalar; finally it tells perl to bootstrap the module.  Perl
+will call its dynamic loader routine (if there is one) and load the shared
+library.
+
+The two arrays C<@ISA> and C<@EXPORT> are very important.  The C<@ISA>
+array contains a list of other packages in which to search for methods (or
+subroutines) that do not exist in the current package.  This is usually
+only important for object-oriented extensions (which we will talk about
+much later), and so usually doesn't need to be modified.
+
+The C<@EXPORT> array tells Perl which of the extension's variables and
+subroutines should be placed into the calling package's namespace.  Because
+you don't know if the user has already used your variable and subroutine
+names, it's vitally important to carefully select what to export.  Do I<not>
+export method or variable names I<by default> without a good reason.
+
+As a general rule, if the module is trying to be object-oriented then don't
+export anything.  If it's just a collection of functions and variables, then
+you can export them via another array, called C<@EXPORT_OK>.  This array
+does not automatically place its subroutine and variable names into the
+namespace unless the user specifically requests that this be done.
+
+See L<perlmod> for more information.
+
+The C<$VERSION> variable is used to ensure that the .pm file and the shared
+library are "in sync" with each other.  Any time you make changes to
+the .pm or .xs files, you should increment the value of this variable.
+
+=head2 Writing good test scripts
+
+The importance of writing good test scripts cannot be overemphasized.  You
+should closely follow the "ok/not ok" style that Perl itself uses, so that
+it is very easy and unambiguous to determine the outcome of each test case.
+When you find and fix a bug, make sure you add a test case for it.
+
+By running "C<make test>", you ensure that your test.pl script runs and uses
+the correct version of your extension.  If you have many test cases, you
+might want to copy Perl's test style.  Create a directory named "t" in the
+extension's directory and append the suffix ".t" to the names of your test
+files.  When you run "C<make test>", all of these test files will be executed.
+
+=head2 EXAMPLE 3
+
+Our third extension will take one argument as its input, round off that
+value, and set the I<argument> to the rounded value.
+
+Add the following to the end of Mytest.xs:
+
+	void
+	round(arg)
+		double  arg
+	    CODE:
+		if (arg > 0.0) {
+			arg = floor(arg + 0.5);
+		} else if (arg < 0.0) {
+			arg = ceil(arg - 0.5);
+		} else {
+			arg = 0.0;
+		}
+	    OUTPUT:
+		arg
+
+Edit the Makefile.PL file so that the corresponding line looks like this:
+
+	'LIBS'      => ['-lm'],   # e.g., '-lm'
+
+Generate the Makefile and run make.  Change the BEGIN block to print
+"1..9" and add the following to test.pl:
+
+	$i = -1.5; &Mytest::round($i); print $i == -2.0 ? "ok 5" : "not ok 5", "\n";
+	$i = -1.1; &Mytest::round($i); print $i == -1.0 ? "ok 6" : "not ok 6", "\n";
+	$i = 0.0; &Mytest::round($i); print $i == 0.0 ? "ok 7" : "not ok 7", "\n";
+	$i = 0.5; &Mytest::round($i); print $i == 1.0 ? "ok 8" : "not ok 8", "\n";
+	$i = 1.2; &Mytest::round($i); print $i == 1.0 ? "ok 9" : "not ok 9", "\n";
+
+Running "C<make test>" should now print out that all nine tests are okay.
+
+Notice that in these new test cases, the argument passed to round was a
+scalar variable.  You might be wondering if you can round a constant or
+literal.  To see what happens, temporarily add the following line to test.pl:
+
+	&Mytest::round(3);
+
+Run "C<make test>" and notice that Perl dies with a fatal error.  Perl won't
+let you change the value of constants!
+
+=head2 What's new here?
+
+=over 4
+
+=item *
+
+We've made some changes to Makefile.PL.  In this case, we've specified an
+extra library to be linked into the extension's shared library, the math
+library libm in this case.  We'll talk later about how to write XSUBs that
+can call every routine in a library.
+
+=item *
+
+The value of the function is not being passed back as the function's return
+value, but by changing the value of the variable that was passed into the
+function.  You might have guessed that when you saw that the return value
+of round is of type "void".
+
+=back
+
+=head2 Input and Output Parameters
+
+You specify the parameters that will be passed into the XSUB on the line(s)
+after you declare the function's return value and name.  Each input parameter
+line starts with optional whitespace, and may have an optional terminating
+semicolon.
+
+The list of output parameters occurs at the very end of the function, just
+before after the OUTPUT: directive.  The use of RETVAL tells Perl that you
+wish to send this value back as the return value of the XSUB function.  In
+Example 3, we wanted the "return value" placed in the original variable
+which we passed in, so we listed it (and not RETVAL) in the OUTPUT: section.
+
+=head2 The XSUBPP Program
+
+The B<xsubpp> program takes the XS code in the .xs file and translates it into
+C code, placing it in a file whose suffix is .c.  The C code created makes
+heavy use of the C functions within Perl.
+
+=head2 The TYPEMAP file
+
+The B<xsubpp> program uses rules to convert from Perl's data types (scalar,
+array, etc.) to C's data types (int, char, etc.).  These rules are stored
+in the typemap file ($PERLLIB/ExtUtils/typemap).  This file is split into
+three parts.
+
+The first section maps various C data types to a name, which corresponds
+somewhat with the various Perl types.  The second section contains C code
+which B<xsubpp> uses to handle input parameters.  The third section contains
+C code which B<xsubpp> uses to handle output parameters.
+
+Let's take a look at a portion of the .c file created for our extension.
+The file name is Mytest.c:
+
+	XS(XS_Mytest_round)
+	{
+	    dXSARGS;
+	    if (items != 1)
+		croak("Usage: Mytest::round(arg)");
+	    {
+		double  arg = (double)SvNV(ST(0));	/* XXXXX */
+		if (arg > 0.0) {
+			arg = floor(arg + 0.5);
+		} else if (arg < 0.0) {
+			arg = ceil(arg - 0.5);
+		} else {
+			arg = 0.0;
+		}
+		sv_setnv(ST(0), (double)arg);	/* XXXXX */
+	    }
+	    XSRETURN(1);
+	}
+
+Notice the two lines commented with "XXXXX".  If you check the first section
+of the typemap file, you'll see that doubles are of type T_DOUBLE.  In the
+INPUT section, an argument that is T_DOUBLE is assigned to the variable
+arg by calling the routine SvNV on something, then casting it to double,
+then assigned to the variable arg.  Similarly, in the OUTPUT section,
+once arg has its final value, it is passed to the sv_setnv function to
+be passed back to the calling subroutine.  These two functions are explained
+in L<perlguts>; we'll talk more later about what that "ST(0)" means in the
+section on the argument stack.
+
+=head2 Warning about Output Arguments
+
+In general, it's not a good idea to write extensions that modify their input
+parameters, as in Example 3.  Instead, you should probably return multiple
+values in an array and let the caller handle them (we'll do this in a later
+example).  However, in order to better accommodate calling pre-existing C
+routines, which often do modify their input parameters, this behavior is
+tolerated.
+
+=head2 EXAMPLE 4
+
+In this example, we'll now begin to write XSUBs that will interact with
+pre-defined C libraries.  To begin with, we will build a small library of
+our own, then let h2xs write our .pm and .xs files for us.
+
+Create a new directory called Mytest2 at the same level as the directory
+Mytest.  In the Mytest2 directory, create another directory called mylib,
+and cd into that directory.
+
+Here we'll create some files that will generate a test library.  These will
+include a C source file and a header file.  We'll also create a Makefile.PL
+in this directory.  Then we'll make sure that running make at the Mytest2
+level will automatically run this Makefile.PL file and the resulting Makefile.
+
+In the mylib directory, create a file mylib.h that looks like this:
+
+	#define TESTVAL	4
+
+	extern double	foo(int, long, const char*);
+
+Also create a file mylib.c that looks like this:
+
+	#include <stdlib.h>
+	#include "./mylib.h"
+
+	double
+	foo(int a, long b, const char *c)
+	{
+		return (a + b + atof(c) + TESTVAL);
+	}
+
+And finally create a file Makefile.PL that looks like this:
+
+	use ExtUtils::MakeMaker;
+	$Verbose = 1;
+	WriteMakefile(
+	    NAME   => 'Mytest2::mylib',
+	    SKIP   => [qw(all static static_lib dynamic dynamic_lib)],
+	    clean  => {'FILES' => 'libmylib$(LIB_EXT)'},
+	);
+
+
+	sub MY::top_targets {
+		'
+	all :: static
+
+	pure_all :: static
+
+	static ::       libmylib$(LIB_EXT)
+
+	libmylib$(LIB_EXT): $(O_FILES)
+		$(AR) cr libmylib$(LIB_EXT) $(O_FILES)
+		$(RANLIB) libmylib$(LIB_EXT)
+
+	';
+	}
+
+Make sure you use a tab and not spaces on the lines beginning with "$(AR)"
+and "$(RANLIB)".  Make will not function properly if you use spaces.
+It has also been reported that the "cr" argument to $(AR) is unnecessary
+on Win32 systems.
+
+We will now create the main top-level Mytest2 files.  Change to the directory
+above Mytest2 and run the following command:
+
+	% h2xs -O -n Mytest2 ./Mytest2/mylib/mylib.h
+
+This will print out a warning about overwriting Mytest2, but that's okay.
+Our files are stored in Mytest2/mylib, and will be untouched.
+
+The normal Makefile.PL that h2xs generates doesn't know about the mylib
+directory.  We need to tell it that there is a subdirectory and that we
+will be generating a library in it.  Let's add the argument MYEXTLIB to
+the WriteMakefile call so that it looks like this:
+
+	WriteMakefile(
+	    'NAME'      => 'Mytest2',
+	    'VERSION_FROM' => 'Mytest2.pm', # finds $VERSION
+	    'LIBS'      => [''],   # e.g., '-lm'
+	    'DEFINE'    => '',     # e.g., '-DHAVE_SOMETHING'
+	    'INC'       => '',     # e.g., '-I/usr/include/other'
+	    'MYEXTLIB' => 'mylib/libmylib$(LIB_EXT)',
+	);
+
+and then at the end add a subroutine (which will override the pre-existing
+subroutine).  Remember to use a tab character to indent the line beginning
+with "cd"!
+
+	sub MY::postamble {
+	'
+	$(MYEXTLIB): mylib/Makefile
+		cd mylib && $(MAKE) $(PASSTHRU)
+	';
+	}
+
+Let's also fix the MANIFEST file so that it accurately reflects the contents
+of our extension.  The single line that says "mylib" should be replaced by
+the following three lines:
+
+	mylib/Makefile.PL
+	mylib/mylib.c
+	mylib/mylib.h
+
+To keep our namespace nice and unpolluted, edit the .pm file and change
+the variable C<@EXPORT> to C<@EXPORT_OK>.  Finally, in the
+.xs file, edit the #include line to read:
+
+	#include "mylib/mylib.h"
+
+And also add the following function definition to the end of the .xs file:
+
+	double
+	foo(a,b,c)
+		int             a
+		long            b
+		const char *    c
+	    OUTPUT:
+		RETVAL
+
+Now we also need to create a typemap file because the default Perl doesn't
+currently support the const char * type.  Create a file called typemap in
+the Mytest2 directory and place the following in it:
+
+	const char *	T_PV
+
+Now run perl on the top-level Makefile.PL.  Notice that it also created a
+Makefile in the mylib directory.  Run make and watch that it does cd into
+the mylib directory and run make in there as well.
+
+Now edit the test.pl script and change the BEGIN block to print "1..4",
+and add the following lines to the end of the script:
+
+	print &Mytest2::foo(1, 2, "Hello, world!") == 7 ? "ok 2\n" : "not ok 2\n";
+	print &Mytest2::foo(1, 2, "0.0") == 7 ? "ok 3\n" : "not ok 3\n";
+	print abs(&Mytest2::foo(0, 0, "-3.4") - 0.6) <= 0.01 ? "ok 4\n" : "not ok 4\n";
+
+(When dealing with floating-point comparisons, it is best to not check for
+equality, but rather that the difference between the expected and actual
+result is below a certain amount (called epsilon) which is 0.01 in this case)
+
+Run "C<make test>" and all should be well.
+
+=head2 What has happened here?
+
+Unlike previous examples, we've now run h2xs on a real include file.  This
+has caused some extra goodies to appear in both the .pm and .xs files.
+
+=over 4
+
+=item *
+
+In the .xs file, there's now a #include directive with the absolute path to
+the mylib.h header file.  We changed this to a relative path so that we
+could move the extension directory if we wanted to.
+
+=item *
+
+There's now some new C code that's been added to the .xs file.  The purpose
+of the C<constant> routine is to make the values that are #define'd in the
+header file accessible by the Perl script (by calling either C<TESTVAL> or
+C<&Mytest2::TESTVAL>).  There's also some XS code to allow calls to the
+C<constant> routine.
+
+=item *
+
+The .pm file originally exported the name C<TESTVAL> in the C<@EXPORT> array.
+This could lead to name clashes.  A good rule of thumb is that if the #define
+is only going to be used by the C routines themselves, and not by the user,
+they should be removed from the C<@EXPORT> array.  Alternately, if you don't
+mind using the "fully qualified name" of a variable, you could move most
+or all of the items from the C<@EXPORT> array into the C<@EXPORT_OK> array.
+
+=item *
+
+If our include file had contained #include directives, these would not have
+been processed by h2xs.  There is no good solution to this right now.
+
+=item *
+
+We've also told Perl about the library that we built in the mylib
+subdirectory.  That required only the addition of the C<MYEXTLIB> variable
+to the WriteMakefile call and the replacement of the postamble subroutine
+to cd into the subdirectory and run make.  The Makefile.PL for the
+library is a bit more complicated, but not excessively so.  Again we
+replaced the postamble subroutine to insert our own code.  This code
+simply specified that the library to be created here was a static archive
+library (as opposed to a dynamically loadable library) and provided the
+commands to build it.
+
+=back
+
+=head2 Anatomy of .xs file
+
+The .xs file of L<"EXAMPLE 4"> contained some new elements.  To understand
+the meaning of these elements, pay attention to the line which reads
+
+	MODULE = Mytest2		PACKAGE = Mytest2		
+
+Anything before this line is plain C code which describes which headers
+to include, and defines some convenience functions.  No translations are
+performed on this part, apart from having embedded POD documentation
+skipped over (see L<perlpod>) it goes into the generated output C file as is.
+
+Anything after this line is the description of XSUB functions.
+These descriptions are translated by B<xsubpp> into C code which
+implements these functions using Perl calling conventions, and which
+makes these functions visible from Perl interpreter.
+
+Pay a special attention to the function C<constant>.  This name appears
+twice in the generated .xs file: once in the first part, as a static C
+function, then another time in the second part, when an XSUB interface to
+this static C function is defined.
+
+This is quite typical for .xs files: usually the .xs file provides
+an interface to an existing C function.  Then this C function is defined
+somewhere (either in an external library, or in the first part of .xs file),
+and a Perl interface to this function (i.e. "Perl glue") is described in the
+second part of .xs file.  The situation in L<"EXAMPLE 1">, L<"EXAMPLE 2">,
+and L<"EXAMPLE 3">, when all the work is done inside the "Perl glue", is
+somewhat of an exception rather than the rule.
+
+=head2 Getting the fat out of XSUBs
+
+In L<"EXAMPLE 4"> the second part of .xs file contained the following
+description of an XSUB:
+
+	double
+	foo(a,b,c)
+		int             a
+		long            b
+		const char *    c
+	    OUTPUT:
+		RETVAL
+
+Note that in contrast with L<"EXAMPLE 1">, L<"EXAMPLE 2"> and L<"EXAMPLE 3">,
+this description does not contain the actual I<code> for what is done
+is done during a call to Perl function foo().  To understand what is going
+on here, one can add a CODE section to this XSUB:
+
+	double
+	foo(a,b,c)
+		int             a
+		long            b
+		const char *    c
+	    CODE:
+		RETVAL = foo(a,b,c);
+	    OUTPUT:
+		RETVAL
+
+However, these two XSUBs provide almost identical generated C code: B<xsubpp>
+compiler is smart enough to figure out the C<CODE:> section from the first
+two lines of the description of XSUB.  What about C<OUTPUT:> section?  In
+fact, that is absolutely the same!  The C<OUTPUT:> section can be removed
+as well, I<as far as C<CODE:> section or C<PPCODE:> section> is not
+specified: B<xsubpp> can see that it needs to generate a function call
+section, and will autogenerate the OUTPUT section too.  Thus one can
+shortcut the XSUB to become:
+
+	double
+	foo(a,b,c)
+		int             a
+		long            b
+		const char *    c
+
+Can we do the same with an XSUB
+
+	int
+	is_even(input)
+		int	input
+	    CODE:
+		RETVAL = (input % 2 == 0);
+	    OUTPUT:
+		RETVAL
+
+of L<"EXAMPLE 2">?  To do this, one needs to define a C function C<int
+is_even(int input)>.  As we saw in L<Anatomy of .xs file>, a proper place
+for this definition is in the first part of .xs file.  In fact a C function
+
+	int
+	is_even(int arg)
+	{
+		return (arg % 2 == 0);
+	}
+
+is probably overkill for this.  Something as simple as a C<#define> will
+do too:
+
+	#define is_even(arg)	((arg) % 2 == 0)
+
+After having this in the first part of .xs file, the "Perl glue" part becomes
+as simple as
+
+	int
+	is_even(input)
+		int	input
+
+This technique of separation of the glue part from the workhorse part has
+obvious tradeoffs: if you want to change a Perl interface, you need to
+change two places in your code.  However, it removes a lot of clutter,
+and makes the workhorse part independent from idiosyncrasies of Perl calling
+convention.  (In fact, there is nothing Perl-specific in the above description,
+a different version of B<xsubpp> might have translated this to TCL glue or
+Python glue as well.)
+
+=head2 More about XSUB arguments
+
+With the completion of Example 4, we now have an easy way to simulate some
+real-life libraries whose interfaces may not be the cleanest in the world.
+We shall now continue with a discussion of the arguments passed to the
+B<xsubpp> compiler.
+
+When you specify arguments to routines in the .xs file, you are really
+passing three pieces of information for each argument listed.  The first
+piece is the order of that argument relative to the others (first, second,
+etc).  The second is the type of argument, and consists of the type
+declaration of the argument (e.g., int, char*, etc).  The third piece is
+the calling convention for the argument in the call to the library function.
+
+While Perl passes arguments to functions by reference,
+C passes arguments by value; to implement a C function which modifies data
+of one of the "arguments", the actual argument of this C function would be
+a pointer to the data.  Thus two C functions with declarations
+
+	int string_length(char *s);
+	int upper_case_char(char *cp);
+
+may have completely different semantics: the first one may inspect an array
+of chars pointed by s, and the second one may immediately dereference C<cp>
+and manipulate C<*cp> only (using the return value as, say, a success
+indicator).  From Perl one would use these functions in
+a completely different manner.
+
+One conveys this info to B<xsubpp> by replacing C<*> before the
+argument by C<&>.  C<&> means that the argument should be passed to a library
+function by its address.  The above two function may be XSUB-ified as
+
+	int
+	string_length(s)
+		char *	s
+
+	int
+	upper_case_char(cp)
+		char	&cp
+
+For example, consider:
+
+	int
+	foo(a,b)
+		char	&a
+		char *	b
+
+The first Perl argument to this function would be treated as a char and assigned
+to the variable a, and its address would be passed into the function foo.
+The second Perl argument would be treated as a string pointer and assigned to the
+variable b.  The I<value> of b would be passed into the function foo.  The
+actual call to the function foo that B<xsubpp> generates would look like this:
+
+	foo(&a, b);
+
+B<xsubpp> will parse the following function argument lists identically:
+
+	char	&a
+	char&a
+	char	& a
+
+However, to help ease understanding, it is suggested that you place a "&"
+next to the variable name and away from the variable type), and place a
+"*" near the variable type, but away from the variable name (as in the
+call to foo above).  By doing so, it is easy to understand exactly what
+will be passed to the C function -- it will be whatever is in the "last
+column".
+
+You should take great pains to try to pass the function the type of variable
+it wants, when possible.  It will save you a lot of trouble in the long run.
+
+=head2 The Argument Stack
+
+If we look at any of the C code generated by any of the examples except
+example 1, you will notice a number of references to ST(n), where n is
+usually 0.  "ST" is actually a macro that points to the n'th argument
+on the argument stack.  ST(0) is thus the first argument on the stack and
+therefore the first argument passed to the XSUB, ST(1) is the second
+argument, and so on.
+
+When you list the arguments to the XSUB in the .xs file, that tells B<xsubpp>
+which argument corresponds to which of the argument stack (i.e., the first
+one listed is the first argument, and so on).  You invite disaster if you
+do not list them in the same order as the function expects them.
+
+The actual values on the argument stack are pointers to the values passed
+in.  When an argument is listed as being an OUTPUT value, its corresponding
+value on the stack (i.e., ST(0) if it was the first argument) is changed.
+You can verify this by looking at the C code generated for Example 3.
+The code for the round() XSUB routine contains lines that look like this:
+
+	double  arg = (double)SvNV(ST(0));
+	/* Round the contents of the variable arg */
+	sv_setnv(ST(0), (double)arg);
+
+The arg variable is initially set by taking the value from ST(0), then is
+stored back into ST(0) at the end of the routine.
+
+XSUBs are also allowed to return lists, not just scalars.  This must be
+done by manipulating stack values ST(0), ST(1), etc, in a subtly
+different way.  See L<perlxs> for details.
+
+XSUBs are also allowed to avoid automatic conversion of Perl function arguments
+to C function arguments.  See L<perlxs> for details.  Some people prefer
+manual conversion by inspecting C<ST(i)> even in the cases when automatic
+conversion will do, arguing that this makes the logic of an XSUB call clearer.
+Compare with L<"Getting the fat out of XSUBs"> for a similar tradeoff of
+a complete separation of "Perl glue" and "workhorse" parts of an XSUB.
+
+While experts may argue about these idioms, a novice to Perl guts may
+prefer a way which is as little Perl-guts-specific as possible, meaning
+automatic conversion and automatic call generation, as in
+L<"Getting the fat out of XSUBs">.  This approach has the additional
+benefit of protecting the XSUB writer from future changes to the Perl API.
+
+=head2 Extending your Extension
+
+Sometimes you might want to provide some extra methods or subroutines
+to assist in making the interface between Perl and your extension simpler
+or easier to understand.  These routines should live in the .pm file.
+Whether they are automatically loaded when the extension itself is loaded
+or only loaded when called depends on where in the .pm file the subroutine
+definition is placed.  You can also consult L<AutoLoader> for an alternate
+way to store and load your extra subroutines.
+
+=head2 Documenting your Extension
+
+There is absolutely no excuse for not documenting your extension.
+Documentation belongs in the .pm file.  This file will be fed to pod2man,
+and the embedded documentation will be converted to the manpage format,
+then placed in the blib directory.  It will be copied to Perl's
+manpage directory when the extension is installed.
+
+You may intersperse documentation and Perl code within the .pm file.
+In fact, if you want to use method autoloading, you must do this,
+as the comment inside the .pm file explains.
+
+See L<perlpod> for more information about the pod format.
+
+=head2 Installing your Extension
+
+Once your extension is complete and passes all its tests, installing it
+is quite simple: you simply run "make install".  You will either need
+to have write permission into the directories where Perl is installed,
+or ask your system administrator to run the make for you.
+
+Alternately, you can specify the exact directory to place the extension's
+files by placing a "PREFIX=/destination/directory" after the make install.
+(or in between the make and install if you have a brain-dead version of make).
+This can be very useful if you are building an extension that will eventually
+be distributed to multiple systems.  You can then just archive the files in
+the destination directory and distribute them to your destination systems.
+
+=head2 EXAMPLE 5
+
+In this example, we'll do some more work with the argument stack.  The
+previous examples have all returned only a single value.  We'll now
+create an extension that returns an array.
+
+This extension is very Unix-oriented (struct statfs and the statfs system
+call).  If you are not running on a Unix system, you can substitute for
+statfs any other function that returns multiple values, you can hard-code
+values to be returned to the caller (although this will be a bit harder
+to test the error case), or you can simply not do this example.  If you
+change the XSUB, be sure to fix the test cases to match the changes.
+
+Return to the Mytest directory and add the following code to the end of
+Mytest.xs:
+
+	void
+	statfs(path)
+		char *  path
+	    INIT:
+		int i;
+		struct statfs buf;
+
+	    PPCODE:
+		i = statfs(path, &buf);
+		if (i == 0) {
+			XPUSHs(sv_2mortal(newSVnv(buf.f_bavail)));
+			XPUSHs(sv_2mortal(newSVnv(buf.f_bfree)));
+			XPUSHs(sv_2mortal(newSVnv(buf.f_blocks)));
+			XPUSHs(sv_2mortal(newSVnv(buf.f_bsize)));
+			XPUSHs(sv_2mortal(newSVnv(buf.f_ffree)));
+			XPUSHs(sv_2mortal(newSVnv(buf.f_files)));
+			XPUSHs(sv_2mortal(newSVnv(buf.f_type)));
+			XPUSHs(sv_2mortal(newSVnv(buf.f_fsid[0])));
+			XPUSHs(sv_2mortal(newSVnv(buf.f_fsid[1])));
+		} else {
+			XPUSHs(sv_2mortal(newSVnv(errno)));
+		}
+
+You'll also need to add the following code to the top of the .xs file, just
+after the include of "XSUB.h":
+
+	#include <sys/vfs.h>
+
+Also add the following code segment to test.pl while incrementing the "1..9"
+string in the BEGIN block to "1..11":
+
+	@a = &Mytest::statfs("/blech");
+	print ((scalar(@a) == 1 && $a[0] == 2) ? "ok 10\n" : "not ok 10\n");
+	@a = &Mytest::statfs("/");
+	print scalar(@a) == 9 ? "ok 11\n" : "not ok 11\n";
+
+=head2 New Things in this Example
+
+This example added quite a few new concepts.  We'll take them one at a time.
+
+=over 4
+
+=item *
+
+The INIT: directive contains code that will be placed immediately after
+the argument stack is decoded.  C does not allow variable declarations at
+arbitrary locations inside a function,
+so this is usually the best way to declare local variables needed by the XSUB.
+(Alternatively, one could put the whole C<PPCODE:> section into braces, and
+put these declarations on top.)
+
+=item *
+
+This routine also returns a different number of arguments depending on the
+success or failure of the call to statfs.  If there is an error, the error
+number is returned as a single-element array.  If the call is successful,
+then a 9-element array is returned.  Since only one argument is passed into
+this function, we need room on the stack to hold the 9 values which may be
+returned.
+
+We do this by using the PPCODE: directive, rather than the CODE: directive.
+This tells B<xsubpp> that we will be managing the return values that will be
+put on the argument stack by ourselves.
+
+=item *
+
+When we want to place values to be returned to the caller onto the stack,
+we use the series of macros that begin with "XPUSH".  There are five
+different versions, for placing integers, unsigned integers, doubles,
+strings, and Perl scalars on the stack.  In our example, we placed a
+Perl scalar onto the stack.  (In fact this is the only macro which
+can be used to return multiple values.)
+
+The XPUSH* macros will automatically extend the return stack to prevent
+it from being overrun.  You push values onto the stack in the order you
+want them seen by the calling program.
+
+=item *
+
+The values pushed onto the return stack of the XSUB are actually mortal SV's.
+They are made mortal so that once the values are copied by the calling
+program, the SV's that held the returned values can be deallocated.
+If they were not mortal, then they would continue to exist after the XSUB
+routine returned, but would not be accessible.  This is a memory leak.
+
+=item *
+
+If we were interested in performance, not in code compactness, in the success
+branch we would not use C<XPUSHs> macros, but C<PUSHs> macros, and would
+pre-extend the stack before pushing the return values:
+
+	EXTEND(SP, 9);
+
+The tradeoff is that one needs to calculate the number of return values
+in advance (though overextending the stack will not typically hurt
+anything but memory consumption).
+
+Similarly, in the failure branch we could use C<PUSHs> I<without> extending
+the stack: the Perl function reference comes to an XSUB on the stack, thus
+the stack is I<always> large enough to take one return value.
+
+=back
+
+=head2 EXAMPLE 6
+
+In this example, we will accept a reference to an array as an input
+parameter, and return a reference to an array of hashes.  This will
+demonstrate manipulation of complex Perl data types from an XSUB.
+
+This extension is somewhat contrived.  It is based on the code in
+the previous example.  It calls the statfs function multiple times,
+accepting a reference to an array of filenames as input, and returning
+a reference to an array of hashes containing the data for each of the
+filesystems.
+
+Return to the Mytest directory and add the following code to the end of
+Mytest.xs:
+
+	SV *
+	multi_statfs(paths)
+		SV * paths
+	    INIT:
+        	AV * results;
+        	I32 numpaths = 0;
+        	int i, n;
+        	struct statfs buf;
+
+        	if ((!SvROK(paths))
+		    || (SvTYPE(SvRV(paths)) != SVt_PVAV)
+		    || ((numpaths = av_len((AV *)SvRV(paths))) < 0))
+		{
+		    XSRETURN_UNDEF;
+        	}
+        	results = (AV *)sv_2mortal((SV *)newAV());
+	    CODE:
+        	for (n = 0; n <= numpaths; n++) {
+		    HV * rh;
+            	    STRLEN l;
+            	    char * fn = SvPV(*av_fetch((AV *)SvRV(paths), n, 0), l);
+
+            	    i = statfs(fn, &buf);
+            	    if (i != 0) {
+		        av_push(results, newSVnv(errno));
+		        continue;
+            	    }
+
+            	    rh = (HV *)sv_2mortal((SV *)newHV());
+
+            	    hv_store(rh, "f_bavail", 8, newSVnv(buf.f_bavail), 0);
+            	    hv_store(rh, "f_bfree",  7, newSVnv(buf.f_bfree),  0);
+            	    hv_store(rh, "f_blocks", 8, newSVnv(buf.f_blocks), 0);
+            	    hv_store(rh, "f_bsize",  7, newSVnv(buf.f_bsize),  0);
+            	    hv_store(rh, "f_ffree",  7, newSVnv(buf.f_ffree),  0);
+            	    hv_store(rh, "f_files",  7, newSVnv(buf.f_files),  0);
+            	    hv_store(rh, "f_type",   6, newSVnv(buf.f_type),   0);
+
+            	    av_push(results, newRV((SV *)rh));
+        	}
+        	RETVAL = newRV((SV *)results);
+	    OUTPUT:
+        	RETVAL
+
+And add the following code to test.pl, while incrementing the "1..11"
+string in the BEGIN block to "1..13":
+
+	$results = Mytest::multi_statfs([ '/', '/blech' ]);
+	print ((ref $results->[0]) ? "ok 12\n" : "not ok 12\n");
+	print ((! ref $results->[1]) ? "ok 13\n" : "not ok 13\n");
+
+=head2 New Things in this Example
+
+There are a number of new concepts introduced here, described below:
+
+=over 4
+
+=item *
+
+This function does not use a typemap.  Instead, we declare it as accepting
+one SV* (scalar) parameter, and returning an SV* value, and we take care of
+populating these scalars within the code.  Because we are only returning
+one value, we don't need a C<PPCODE:> directive - instead, we use C<CODE:>
+and C<OUTPUT:> directives.
+
+=item *
+
+When dealing with references, it is important to handle them with caution.
+The C<INIT:> block first checks that
+C<SvROK> returns true, which indicates that paths is a valid reference.  It
+then verifies that the object referenced by paths is an array, using C<SvRV>
+to dereference paths, and C<SvTYPE> to discover its type.  As an added test,
+it checks that the array referenced by paths is non-empty, using the C<av_len>
+function (which returns -1 if the array is empty).  The XSRETURN_UNDEF macro
+is used to abort the XSUB and return the undefined value whenever all three of
+these conditions are not met.
+
+=item *
+
+We manipulate several arrays in this XSUB.  Note that an array is represented
+internally by an AV* pointer.  The functions and macros for manipulating
+arrays are similar to the functions in Perl: C<av_len> returns the highest
+index in an AV*, much like $#array; C<av_fetch> fetches a single scalar value
+from an array, given its index; C<av_push> pushes a scalar value onto the
+end of the array, automatically extending the array as necessary.
+
+Specifically, we read pathnames one at a time from the input array, and
+store the results in an output array (results) in the same order.  If
+statfs fails, the element pushed onto the return array is the value of
+errno after the failure.  If statfs succeeds, though, the value pushed
+onto the return array is a reference to a hash containing some of the
+information in the statfs structure.
+
+As with the return stack, it would be possible (and a small performance win)
+to pre-extend the return array before pushing data into it, since we know
+how many elements we will return:
+
+	av_extend(results, numpaths);
+
+=item *
+
+We are performing only one hash operation in this function, which is storing
+a new scalar under a key using C<hv_store>.  A hash is represented by an HV*
+pointer.  Like arrays, the functions for manipulating hashes from an XSUB
+mirror the functionality available from Perl.  See L<perlguts> and L<perlapi>
+for details.
+
+=item *
+
+To create a reference, we use the C<newRV> function.  Note that you can
+cast an AV* or an HV* to type SV* in this case (and many others).  This
+allows you to take references to arrays, hashes and scalars with the same
+function.  Conversely, the C<SvRV> function always returns an SV*, which may
+need to be cast to the appropriate type if it is something other than a
+scalar (check with C<SvTYPE>).
+
+=item *
+
+At this point, xsubpp is doing very little work - the differences between
+Mytest.xs and Mytest.c are minimal.
+
+=back
+
+=head2 EXAMPLE 7 (Coming Soon)
+
+XPUSH args AND set RETVAL AND assign return value to array
+
+=head2 EXAMPLE 8 (Coming Soon)
+
+Setting $!
+
+=head2 EXAMPLE 9 Passing open files to XSes
+
+You would think passing files to an XS is difficult, with all the
+typeglobs and stuff. Well, it isn't.
+
+Suppose that for some strange reason we need a wrapper around the
+standard C library function C<fputs()>. This is all we need:
+
+	#define PERLIO_NOT_STDIO 0
+	#include "EXTERN.h"
+	#include "perl.h"
+	#include "XSUB.h"
+
+	#include <stdio.h>
+
+	int
+	fputs(s, stream)
+		char *          s
+		FILE *	        stream
+
+The real work is done in the standard typemap.
+
+B<But> you loose all the fine stuff done by the perlio layers. This
+calls the stdio function C<fputs()>, which knows nothing about them.
+
+The standard typemap offers three variants of PerlIO *:
+C<InputStream> (T_IN), C<InOutStream> (T_INOUT) and C<OutputStream>
+(T_OUT). A bare C<PerlIO *> is considered a T_INOUT. If it matters
+in your code (see below for why it might) #define or typedef
+one of the specific names and use that as the argument or result
+type in your XS file.
+
+The standard typemap does not contain PerlIO * before perl 5.7,
+but it has the three stream variants. Using a PerlIO * directly
+is not backwards compatible unless you provide your own typemap.
+
+For streams coming I<from> perl the main difference is that
+C<OutputStream> will get the output PerlIO * - which may make
+a difference on a socket. Like in our example...
+
+For streams being handed I<to> perl a new file handle is created
+(i.e. a reference to a new glob) and associated with the PerlIO *
+provided. If the read/write state of the PerlIO * is not correct then you
+may get errors or warnings from when the file handle is used.
+So if you opened the PerlIO * as "w" it should really be an
+C<OutputStream> if open as "r" it should be an C<InputStream>.
+
+Now, suppose you want to use perlio layers in your XS. We'll use the
+perlio C<PerlIO_puts()> function as an example.
+
+In the C part of the XS file (above the first MODULE line) you
+have
+
+	#define OutputStream	PerlIO *
+    or
+	typedef PerlIO *	OutputStream;
+
+
+And this is the XS code:
+
+	int
+	perlioputs(s, stream)
+		char *          s
+		OutputStream	stream
+	CODE:
+		RETVAL = PerlIO_puts(stream, s);
+	OUTPUT:
+		RETVAL
+
+We have to use a C<CODE> section because C<PerlIO_puts()> has the arguments
+reversed compared to C<fputs()>, and we want to keep the arguments the same.
+
+Wanting to explore this thoroughly, we want to use the stdio C<fputs()>
+on a PerlIO *. This means we have to ask the perlio system for a stdio
+C<FILE *>:
+
+	int
+	perliofputs(s, stream)
+		char *          s
+		OutputStream	stream
+	PREINIT:
+		FILE *fp = PerlIO_findFILE(stream);
+	CODE:
+		if (fp != (FILE*) 0) {
+			RETVAL = fputs(s, fp);
+		} else {
+			RETVAL = -1;
+		}
+	OUTPUT:
+		RETVAL
+
+Note: C<PerlIO_findFILE()> will search the layers for a stdio
+layer. If it can't find one, it will call C<PerlIO_exportFILE()> to
+generate a new stdio C<FILE>. Please only call C<PerlIO_exportFILE()> if
+you want a I<new> C<FILE>. It will generate one on each call and push a
+new stdio layer. So don't call it repeatedly on the same
+file. C<PerlIO()>_findFILE will retrieve the stdio layer once it has been
+generated by C<PerlIO_exportFILE()>.
+
+This applies to the perlio system only. For versions before 5.7,
+C<PerlIO_exportFILE()> is equivalent to C<PerlIO_findFILE()>.
+
+=head2 Troubleshooting these Examples
+
+As mentioned at the top of this document, if you are having problems with
+these example extensions, you might see if any of these help you.
+
+=over 4
+
+=item *
+
+In versions of 5.002 prior to the gamma version, the test script in Example
+1 will not function properly.  You need to change the "use lib" line to
+read:
+
+	use lib './blib';
+
+=item *
+
+In versions of 5.002 prior to version 5.002b1h, the test.pl file was not
+automatically created by h2xs.  This means that you cannot say "make test"
+to run the test script.  You will need to add the following line before the
+"use extension" statement:
+
+	use lib './blib';
+
+=item *
+
+In versions 5.000 and 5.001, instead of using the above line, you will need
+to use the following line:
+
+	BEGIN { unshift(@INC, "./blib") }
+
+=item *
+
+This document assumes that the executable named "perl" is Perl version 5.
+Some systems may have installed Perl version 5 as "perl5".
+
+=back
+
+=head1 See also
+
+For more information, consult L<perlguts>, L<perlapi>, L<perlxs>, L<perlmod>,
+and L<perlpod>.
+
+=head1 Author
+
+Jeff Okamoto <F<okamoto@corp.hp.com>>
+
+Reviewed and assisted by Dean Roehrich, Ilya Zakharevich, Andreas Koenig,
+and Tim Bunce.
+
+PerlIO material contributed by Lupe Christoph, with some clarification
+by Nick Ing-Simmons.
+
+=head2 Last Changed
+
+2002/05/08
Index: /for-distributions/trunk/bin/windows/perl/lib/SDBM_File.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/SDBM_File.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/SDBM_File.pm	(revision 14489)
@@ -0,0 +1,116 @@
+package SDBM_File;
+
+use strict;
+use warnings;
+
+require Tie::Hash;
+use XSLoader ();
+
+our @ISA = qw(Tie::Hash);
+our $VERSION = "1.05";
+
+XSLoader::load 'SDBM_File', $VERSION;
+
+1;
+
+__END__
+
+=head1 NAME
+
+SDBM_File - Tied access to sdbm files
+
+=head1 SYNOPSIS
+
+ use Fcntl;   # For O_RDWR, O_CREAT, etc.
+ use SDBM_File;
+
+ tie(%h, 'SDBM_File', 'filename', O_RDWR|O_CREAT, 0666)
+   or die "Couldn't tie SDBM file 'filename': $!; aborting";
+
+ # Now read and change the hash
+ $h{newkey} = newvalue;
+ print $h{oldkey}; 
+ ...
+
+ untie %h;
+
+=head1 DESCRIPTION
+
+C<SDBM_File> establishes a connection between a Perl hash variable and
+a file in SDBM_File format;.  You can manipulate the data in the file
+just as if it were in a Perl hash, but when your program exits, the
+data will remain in the file, to be used the next time your program
+runs.
+
+Use C<SDBM_File> with the Perl built-in C<tie> function to establish
+the connection between the variable and the file.  The arguments to
+C<tie> should be:
+
+=over 4
+
+=item 1.
+
+The hash variable you want to tie.
+
+=item 2. 
+
+The string C<"SDBM_File">.  (Ths tells Perl to use the C<SDBM_File>
+package to perform the functions of the hash.)
+
+=item 3. 
+
+The name of the file you want to tie to the hash.  
+
+=item 4.
+
+Flags.  Use one of:
+
+=over 2
+
+=item C<O_RDONLY>
+
+Read-only access to the data in the file.
+
+=item C<O_WRONLY>
+
+Write-only access to the data in the file.
+
+=item C<O_RDWR>
+
+Both read and write access.
+
+=back
+
+If you want to create the file if it does not exist, add C<O_CREAT> to
+any of these, as in the example.  If you omit C<O_CREAT> and the file
+does not already exist, the C<tie> call will fail.
+
+=item 5.
+
+The default permissions to use if a new file is created.  The actual
+permissions will be modified by the user's umask, so you should
+probably use 0666 here. (See L<perlfunc/umask>.)
+
+=back
+
+=head1 DIAGNOSTICS
+
+On failure, the C<tie> call returns an undefined value and probably
+sets C<$!> to contain the reason the file could not be tied.
+
+=head2 C<sdbm store returned -1, errno 22, key "..." at ...>
+
+This warning is emitted when you try to store a key or a value that
+is too long.  It means that the change was not recorded in the
+database.  See BUGS AND WARNINGS below.
+
+=head1 BUGS AND WARNINGS
+
+There are a number of limits on the size of the data that you can
+store in the SDBM file.  The most important is that the length of a
+key, plus the length of its associated value, may not exceed 1008
+bytes.
+
+See L<perlfunc/tie>, L<perldbmfilter>, L<Fcntl>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Safe.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Safe.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Safe.pm	(revision 14489)
@@ -0,0 +1,576 @@
+package Safe;
+
+use 5.003_11;
+use strict;
+
+$Safe::VERSION = "2.12";
+
+# *** Don't declare any lexicals above this point ***
+#
+# This function should return a closure which contains an eval that can't
+# see any lexicals in scope (apart from __ExPr__ which is unavoidable)
+
+sub lexless_anon_sub {
+		 # $_[0] is package;
+		 # $_[1] is strict flag;
+    my $__ExPr__ = $_[2];   # must be a lexical to create the closure that
+			    # can be used to pass the value into the safe
+			    # world
+
+    # Create anon sub ref in root of compartment.
+    # Uses a closure (on $__ExPr__) to pass in the code to be executed.
+    # (eval on one line to keep line numbers as expected by caller)
+    eval sprintf
+    'package %s; %s strict; sub { @_=(); eval q[my $__ExPr__;] . $__ExPr__; }',
+		$_[0], $_[1] ? 'use' : 'no';
+}
+
+use Carp;
+use Carp::Heavy;
+
+use Opcode 1.01, qw(
+    opset opset_to_ops opmask_add
+    empty_opset full_opset invert_opset verify_opset
+    opdesc opcodes opmask define_optag opset_to_hex
+);
+
+*ops_to_opset = \&opset;   # Temporary alias for old Penguins
+
+
+my $default_root  = 0;
+my $default_share = ['*_']; #, '*main::'];
+
+sub new {
+    my($class, $root, $mask) = @_;
+    my $obj = {};
+    bless $obj, $class;
+
+    if (defined($root)) {
+	croak "Can't use \"$root\" as root name"
+	    if $root =~ /^main\b/ or $root !~ /^\w[:\w]*$/;
+	$obj->{Root}  = $root;
+	$obj->{Erase} = 0;
+    }
+    else {
+	$obj->{Root}  = "Safe::Root".$default_root++;
+	$obj->{Erase} = 1;
+    }
+
+    # use permit/deny methods instead till interface issues resolved
+    # XXX perhaps new Safe 'Root', mask => $mask, foo => bar, ...;
+    croak "Mask parameter to new no longer supported" if defined $mask;
+    $obj->permit_only(':default');
+
+    # We must share $_ and @_ with the compartment or else ops such
+    # as split, length and so on won't default to $_ properly, nor
+    # will passing argument to subroutines work (via @_). In fact,
+    # for reasons I don't completely understand, we need to share
+    # the whole glob *_ rather than $_ and @_ separately, otherwise
+    # @_ in non default packages within the compartment don't work.
+    $obj->share_from('main', $default_share);
+    Opcode::_safe_pkg_prep($obj->{Root}) if($Opcode::VERSION > 1.04);
+    return $obj;
+}
+
+sub DESTROY {
+    my $obj = shift;
+    $obj->erase('DESTROY') if $obj->{Erase};
+}
+
+sub erase {
+    my ($obj, $action) = @_;
+    my $pkg = $obj->root();
+    my ($stem, $leaf);
+
+    no strict 'refs';
+    $pkg = "main::$pkg\::";	# expand to full symbol table name
+    ($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/;
+
+    # The 'my $foo' is needed! Without it you get an
+    # 'Attempt to free unreferenced scalar' warning!
+    my $stem_symtab = *{$stem}{HASH};
+
+    #warn "erase($pkg) stem=$stem, leaf=$leaf";
+    #warn " stem_symtab hash ".scalar(%$stem_symtab)."\n";
+	# ", join(', ', %$stem_symtab),"\n";
+
+#    delete $stem_symtab->{$leaf};
+
+    my $leaf_glob   = $stem_symtab->{$leaf};
+    my $leaf_symtab = *{$leaf_glob}{HASH};
+#    warn " leaf_symtab ", join(', ', %$leaf_symtab),"\n";
+    %$leaf_symtab = ();
+    #delete $leaf_symtab->{'__ANON__'};
+    #delete $leaf_symtab->{'foo'};
+    #delete $leaf_symtab->{'main::'};
+#    my $foo = undef ${"$stem\::"}{"$leaf\::"};
+
+    if ($action and $action eq 'DESTROY') {
+        delete $stem_symtab->{$leaf};
+    } else {
+        $obj->share_from('main', $default_share);
+    }
+    1;
+}
+
+
+sub reinit {
+    my $obj= shift;
+    $obj->erase;
+    $obj->share_redo;
+}
+
+sub root {
+    my $obj = shift;
+    croak("Safe root method now read-only") if @_;
+    return $obj->{Root};
+}
+
+
+sub mask {
+    my $obj = shift;
+    return $obj->{Mask} unless @_;
+    $obj->deny_only(@_);
+}
+
+# v1 compatibility methods
+sub trap   { shift->deny(@_)   }
+sub untrap { shift->permit(@_) }
+
+sub deny {
+    my $obj = shift;
+    $obj->{Mask} |= opset(@_);
+}
+sub deny_only {
+    my $obj = shift;
+    $obj->{Mask} = opset(@_);
+}
+
+sub permit {
+    my $obj = shift;
+    # XXX needs testing
+    $obj->{Mask} &= invert_opset opset(@_);
+}
+sub permit_only {
+    my $obj = shift;
+    $obj->{Mask} = invert_opset opset(@_);
+}
+
+
+sub dump_mask {
+    my $obj = shift;
+    print opset_to_hex($obj->{Mask}),"\n";
+}
+
+
+
+sub share {
+    my($obj, @vars) = @_;
+    $obj->share_from(scalar(caller), \@vars);
+}
+
+sub share_from {
+    my $obj = shift;
+    my $pkg = shift;
+    my $vars = shift;
+    my $no_record = shift || 0;
+    my $root = $obj->root();
+    croak("vars not an array ref") unless ref $vars eq 'ARRAY';
+    no strict 'refs';
+    # Check that 'from' package actually exists
+    croak("Package \"$pkg\" does not exist")
+	unless keys %{"$pkg\::"};
+    my $arg;
+    foreach $arg (@$vars) {
+	# catch some $safe->share($var) errors:
+	croak("'$arg' not a valid symbol table name")
+	    unless $arg =~ /^[\$\@%*&]?\w[\w:]*$/
+	    	or $arg =~ /^\$\W$/;
+	my ($var, $type);
+	$type = $1 if ($var = $arg) =~ s/^(\W)//;
+	# warn "share_from $pkg $type $var";
+	*{$root."::$var"} = (!$type)       ? \&{$pkg."::$var"}
+			  : ($type eq '&') ? \&{$pkg."::$var"}
+			  : ($type eq '$') ? \${$pkg."::$var"}
+			  : ($type eq '@') ? \@{$pkg."::$var"}
+			  : ($type eq '%') ? \%{$pkg."::$var"}
+			  : ($type eq '*') ?  *{$pkg."::$var"}
+			  : croak(qq(Can't share "$type$var" of unknown type));
+    }
+    $obj->share_record($pkg, $vars) unless $no_record or !$vars;
+}
+
+sub share_record {
+    my $obj = shift;
+    my $pkg = shift;
+    my $vars = shift;
+    my $shares = \%{$obj->{Shares} ||= {}};
+    # Record shares using keys of $obj->{Shares}. See reinit.
+    @{$shares}{@$vars} = ($pkg) x @$vars if @$vars;
+}
+sub share_redo {
+    my $obj = shift;
+    my $shares = \%{$obj->{Shares} ||= {}};
+    my($var, $pkg);
+    while(($var, $pkg) = each %$shares) {
+	# warn "share_redo $pkg\:: $var";
+	$obj->share_from($pkg,  [ $var ], 1);
+    }
+}
+sub share_forget {
+    delete shift->{Shares};
+}
+
+sub varglob {
+    my ($obj, $var) = @_;
+    no strict 'refs';
+    return *{$obj->root()."::$var"};
+}
+
+
+sub reval {
+    my ($obj, $expr, $strict) = @_;
+    my $root = $obj->{Root};
+
+    my $evalsub = lexless_anon_sub($root,$strict, $expr);
+    return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub);
+}
+
+sub rdo {
+    my ($obj, $file) = @_;
+    my $root = $obj->{Root};
+
+    my $evalsub = eval
+	    sprintf('package %s; sub { @_ = (); do $file }', $root);
+    return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub);
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Safe - Compile and execute code in restricted compartments
+
+=head1 SYNOPSIS
+
+  use Safe;
+
+  $compartment = new Safe;
+
+  $compartment->permit(qw(time sort :browse));
+
+  $result = $compartment->reval($unsafe_code);
+
+=head1 DESCRIPTION
+
+The Safe extension module allows the creation of compartments
+in which perl code can be evaluated. Each compartment has
+
+=over 8
+
+=item a new namespace
+
+The "root" of the namespace (i.e. "main::") is changed to a
+different package and code evaluated in the compartment cannot
+refer to variables outside this namespace, even with run-time
+glob lookups and other tricks.
+
+Code which is compiled outside the compartment can choose to place
+variables into (or I<share> variables with) the compartment's namespace
+and only that data will be visible to code evaluated in the
+compartment.
+
+By default, the only variables shared with compartments are the
+"underscore" variables $_ and @_ (and, technically, the less frequently
+used %_, the _ filehandle and so on). This is because otherwise perl
+operators which default to $_ will not work and neither will the
+assignment of arguments to @_ on subroutine entry.
+
+=item an operator mask
+
+Each compartment has an associated "operator mask". Recall that
+perl code is compiled into an internal format before execution.
+Evaluating perl code (e.g. via "eval" or "do 'file'") causes
+the code to be compiled into an internal format and then,
+provided there was no error in the compilation, executed.
+Code evaluated in a compartment compiles subject to the
+compartment's operator mask. Attempting to evaluate code in a
+compartment which contains a masked operator will cause the
+compilation to fail with an error. The code will not be executed.
+
+The default operator mask for a newly created compartment is
+the ':default' optag.
+
+It is important that you read the Opcode(3) module documentation
+for more information, especially for detailed definitions of opnames,
+optags and opsets.
+
+Since it is only at the compilation stage that the operator mask
+applies, controlled access to potentially unsafe operations can
+be achieved by having a handle to a wrapper subroutine (written
+outside the compartment) placed into the compartment. For example,
+
+    $cpt = new Safe;
+    sub wrapper {
+        # vet arguments and perform potentially unsafe operations
+    }
+    $cpt->share('&wrapper');
+
+=back
+
+
+=head1 WARNING
+
+The authors make B<no warranty>, implied or otherwise, about the
+suitability of this software for safety or security purposes.
+
+The authors shall not in any case be liable for special, incidental,
+consequential, indirect or other similar damages arising from the use
+of this software.
+
+Your mileage will vary. If in any doubt B<do not use it>.
+
+
+=head2 RECENT CHANGES
+
+The interface to the Safe module has changed quite dramatically since
+version 1 (as supplied with Perl5.002). Study these pages carefully if
+you have code written to use Safe version 1 because you will need to
+makes changes.
+
+
+=head2 Methods in class Safe
+
+To create a new compartment, use
+
+    $cpt = new Safe;
+
+Optional argument is (NAMESPACE), where NAMESPACE is the root namespace
+to use for the compartment (defaults to "Safe::Root0", incremented for
+each new compartment).
+
+Note that version 1.00 of the Safe module supported a second optional
+parameter, MASK.  That functionality has been withdrawn pending deeper
+consideration. Use the permit and deny methods described below.
+
+The following methods can then be used on the compartment
+object returned by the above constructor. The object argument
+is implicit in each case.
+
+
+=over 8
+
+=item permit (OP, ...)
+
+Permit the listed operators to be used when compiling code in the
+compartment (in I<addition> to any operators already permitted).
+
+You can list opcodes by names, or use a tag name; see
+L<Opcode/"Predefined Opcode Tags">.
+
+=item permit_only (OP, ...)
+
+Permit I<only> the listed operators to be used when compiling code in
+the compartment (I<no> other operators are permitted).
+
+=item deny (OP, ...)
+
+Deny the listed operators from being used when compiling code in the
+compartment (other operators may still be permitted).
+
+=item deny_only (OP, ...)
+
+Deny I<only> the listed operators from being used when compiling code
+in the compartment (I<all> other operators will be permitted).
+
+=item trap (OP, ...)
+
+=item untrap (OP, ...)
+
+The trap and untrap methods are synonyms for deny and permit
+respectfully.
+
+=item share (NAME, ...)
+
+This shares the variable(s) in the argument list with the compartment.
+This is almost identical to exporting variables using the L<Exporter>
+module.
+
+Each NAME must be the B<name> of a non-lexical variable, typically
+with the leading type identifier included. A bareword is treated as a
+function name.
+
+Examples of legal names are '$foo' for a scalar, '@foo' for an
+array, '%foo' for a hash, '&foo' or 'foo' for a subroutine and '*foo'
+for a glob (i.e.  all symbol table entries associated with "foo",
+including scalar, array, hash, sub and filehandle).
+
+Each NAME is assumed to be in the calling package. See share_from
+for an alternative method (which share uses).
+
+=item share_from (PACKAGE, ARRAYREF)
+
+This method is similar to share() but allows you to explicitly name the
+package that symbols should be shared from. The symbol names (including
+type characters) are supplied as an array reference.
+
+    $safe->share_from('main', [ '$foo', '%bar', 'func' ]);
+
+
+=item varglob (VARNAME)
+
+This returns a glob reference for the symbol table entry of VARNAME in
+the package of the compartment. VARNAME must be the B<name> of a
+variable without any leading type marker. For example,
+
+    $cpt = new Safe 'Root';
+    $Root::foo = "Hello world";
+    # Equivalent version which doesn't need to know $cpt's package name:
+    ${$cpt->varglob('foo')} = "Hello world";
+
+
+=item reval (STRING)
+
+This evaluates STRING as perl code inside the compartment.
+
+The code can only see the compartment's namespace (as returned by the
+B<root> method). The compartment's root package appears to be the
+C<main::> package to the code inside the compartment.
+
+Any attempt by the code in STRING to use an operator which is not permitted
+by the compartment will cause an error (at run-time of the main program
+but at compile-time for the code in STRING).  The error is of the form
+"'%s' trapped by operation mask...".
+
+If an operation is trapped in this way, then the code in STRING will
+not be executed. If such a trapped operation occurs or any other
+compile-time or return error, then $@ is set to the error message, just
+as with an eval().
+
+If there is no error, then the method returns the value of the last
+expression evaluated, or a return statement may be used, just as with
+subroutines and B<eval()>. The context (list or scalar) is determined
+by the caller as usual.
+
+This behaviour differs from the beta distribution of the Safe extension
+where earlier versions of perl made it hard to mimic the return
+behaviour of the eval() command and the context was always scalar.
+
+Some points to note:
+
+If the entereval op is permitted then the code can use eval "..." to
+'hide' code which might use denied ops. This is not a major problem
+since when the code tries to execute the eval it will fail because the
+opmask is still in effect. However this technique would allow clever,
+and possibly harmful, code to 'probe' the boundaries of what is
+possible.
+
+Any string eval which is executed by code executing in a compartment,
+or by code called from code executing in a compartment, will be eval'd
+in the namespace of the compartment. This is potentially a serious
+problem.
+
+Consider a function foo() in package pkg compiled outside a compartment
+but shared with it. Assume the compartment has a root package called
+'Root'. If foo() contains an eval statement like eval '$foo = 1' then,
+normally, $pkg::foo will be set to 1.  If foo() is called from the
+compartment (by whatever means) then instead of setting $pkg::foo, the
+eval will actually set $Root::pkg::foo.
+
+This can easily be demonstrated by using a module, such as the Socket
+module, which uses eval "..." as part of an AUTOLOAD function. You can
+'use' the module outside the compartment and share an (autoloaded)
+function with the compartment. If an autoload is triggered by code in
+the compartment, or by any code anywhere that is called by any means
+from the compartment, then the eval in the Socket module's AUTOLOAD
+function happens in the namespace of the compartment. Any variables
+created or used by the eval'd code are now under the control of
+the code in the compartment.
+
+A similar effect applies to I<all> runtime symbol lookups in code
+called from a compartment but not compiled within it.
+
+
+
+=item rdo (FILENAME)
+
+This evaluates the contents of file FILENAME inside the compartment.
+See above documentation on the B<reval> method for further details.
+
+=item root (NAMESPACE)
+
+This method returns the name of the package that is the root of the
+compartment's namespace.
+
+Note that this behaviour differs from version 1.00 of the Safe module
+where the root module could be used to change the namespace. That
+functionality has been withdrawn pending deeper consideration.
+
+=item mask (MASK)
+
+This is a get-or-set method for the compartment's operator mask.
+
+With no MASK argument present, it returns the current operator mask of
+the compartment.
+
+With the MASK argument present, it sets the operator mask for the
+compartment (equivalent to calling the deny_only method).
+
+=back
+
+
+=head2 Some Safety Issues
+
+This section is currently just an outline of some of the things code in
+a compartment might do (intentionally or unintentionally) which can
+have an effect outside the compartment.
+
+=over 8
+
+=item Memory
+
+Consuming all (or nearly all) available memory.
+
+=item CPU
+
+Causing infinite loops etc.
+
+=item Snooping
+
+Copying private information out of your system. Even something as
+simple as your user name is of value to others. Much useful information
+could be gleaned from your environment variables for example.
+
+=item Signals
+
+Causing signals (especially SIGFPE and SIGALARM) to affect your process.
+
+Setting up a signal handler will need to be carefully considered
+and controlled.  What mask is in effect when a signal handler
+gets called?  If a user can get an imported function to get an
+exception and call the user's signal handler, does that user's
+restricted mask get re-instated before the handler is called?
+Does an imported handler get called with its original mask or
+the user's one?
+
+=item State Changes
+
+Ops such as chdir obviously effect the process as a whole and not just
+the code in the compartment. Ops such as rand and srand have a similar
+but more subtle effect.
+
+=back
+
+=head2 AUTHOR
+
+Originally designed and implemented by Malcolm Beattie,
+mbeattie@sable.ox.ac.uk.
+
+Reworked to use the Opcode module and other changes added by Tim Bunce
+E<lt>F<Tim.Bunce@ig.co.uk>E<gt>.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Scalar/Util.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Scalar/Util.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Scalar/Util.pm	(revision 14489)
@@ -0,0 +1,337 @@
+# Scalar::Util.pm
+#
+# Copyright (c) 1997-2005 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 Scalar::Util;
+
+use strict;
+use vars qw(@ISA @EXPORT_OK $VERSION);
+require Exporter;
+require List::Util; # List::Util loads the XS
+
+@ISA       = qw(Exporter);
+@EXPORT_OK = qw(blessed dualvar reftype weaken isweak tainted readonly openhandle refaddr isvstring looks_like_number set_prototype);
+$VERSION    = "1.18";
+$VERSION   = eval $VERSION;
+
+sub export_fail {
+  if (grep { /^(weaken|isweak)$/ } @_ ) {
+    require Carp;
+    Carp::croak("Weak references are not implemented in the version of perl");
+  }
+  if (grep { /^(isvstring)$/ } @_ ) {
+    require Carp;
+    Carp::croak("Vstrings are not implemented in the version of perl");
+  }
+  if (grep { /^(dualvar|set_prototype)$/ } @_ ) {
+    require Carp;
+    Carp::croak("$1 is only avaliable with the XS version");
+  }
+
+  @_;
+}
+
+sub openhandle ($) {
+  my $fh = shift;
+  my $rt = reftype($fh) || '';
+
+  return defined(fileno($fh)) ? $fh : undef
+    if $rt eq 'IO';
+
+  if (reftype(\$fh) eq 'GLOB') { # handle  openhandle(*DATA)
+    $fh = \(my $tmp=$fh);
+  }
+  elsif ($rt ne 'GLOB') {
+    return undef;
+  }
+
+  (tied(*$fh) or defined(fileno($fh)))
+    ? $fh : undef;
+}
+
+eval <<'ESQ' unless defined &dualvar;
+
+use vars qw(@EXPORT_FAIL);
+push @EXPORT_FAIL, qw(weaken isweak dualvar isvstring set_prototype);
+
+# The code beyond here is only used if the XS is not installed
+
+# Hope nobody defines a sub by this name
+sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }
+
+sub blessed ($) {
+  local($@, $SIG{__DIE__}, $SIG{__WARN__});
+  length(ref($_[0]))
+    ? eval { $_[0]->a_sub_not_likely_to_be_here }
+    : undef
+}
+
+sub refaddr($) {
+  my $pkg = ref($_[0]) or return undef;
+  if (blessed($_[0])) {
+    bless $_[0], 'Scalar::Util::Fake';
+  }
+  else {
+    $pkg = undef;
+  }
+  "$_[0]" =~ /0x(\w+)/;
+  my $i = do { local $^W; hex $1 };
+  bless $_[0], $pkg if defined $pkg;
+  $i;
+}
+
+sub reftype ($) {
+  local($@, $SIG{__DIE__}, $SIG{__WARN__});
+  my $r = shift;
+  my $t;
+
+  length($t = ref($r)) or return undef;
+
+  # This eval will fail if the reference is not blessed
+  eval { $r->a_sub_not_likely_to_be_here; 1 }
+    ? do {
+      $t = eval {
+	  # we have a GLOB or an IO. Stringify a GLOB gives it's name
+	  my $q = *$r;
+	  $q =~ /^\*/ ? "GLOB" : "IO";
+	}
+	or do {
+	  # OK, if we don't have a GLOB what parts of
+	  # a glob will it populate.
+	  # NOTE: A glob always has a SCALAR
+	  local *glob = $r;
+	  defined *glob{ARRAY} && "ARRAY"
+	  or defined *glob{HASH} && "HASH"
+	  or defined *glob{CODE} && "CODE"
+	  or length(ref(${$r})) ? "REF" : "SCALAR";
+	}
+    }
+    : $t
+}
+
+sub tainted {
+  local($@, $SIG{__DIE__}, $SIG{__WARN__});
+  local $^W = 0;
+  eval { kill 0 * $_[0] };
+  $@ =~ /^Insecure/;
+}
+
+sub readonly {
+  return 0 if tied($_[0]) || (ref(\($_[0])) ne "SCALAR");
+
+  local($@, $SIG{__DIE__}, $SIG{__WARN__});
+  my $tmp = $_[0];
+
+  !eval { $_[0] = $tmp; 1 };
+}
+
+sub looks_like_number {
+  local $_ = shift;
+
+  # checks from perlfaq4
+  return 0 if !defined($_) or ref($_);
+  return 1 if (/^[+-]?\d+$/); # is a +/- integer
+  return 1 if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/); # a C float
+  return 1 if ($] >= 5.008 and /^(Inf(inity)?|NaN)$/i) or ($] >= 5.006001 and /^Inf$/i);
+
+  0;
+}
+
+ESQ
+
+1;
+
+__END__
+
+=head1 NAME
+
+Scalar::Util - A selection of general-utility scalar subroutines
+
+=head1 SYNOPSIS
+
+    use Scalar::Util qw(blessed dualvar isweak readonly refaddr reftype tainted
+                        weaken isvstring looks_like_number set_prototype);
+
+=head1 DESCRIPTION
+
+C<Scalar::Util> contains a selection of subroutines that people have
+expressed would be nice to have in the perl core, but the usage would
+not really be high enough to warrant the use of a keyword, and the size
+so small such that being individual extensions would be wasteful.
+
+By default C<Scalar::Util> does not export any subroutines. The
+subroutines defined are
+
+=over 4
+
+=item blessed EXPR
+
+If EXPR evaluates to a blessed reference the name of the package
+that it is blessed into is returned. Otherwise C<undef> is returned.
+
+   $scalar = "foo";
+   $class  = blessed $scalar;           # undef
+
+   $ref    = [];
+   $class  = blessed $ref;              # undef
+
+   $obj    = bless [], "Foo";
+   $class  = blessed $obj;              # "Foo"
+
+=item dualvar NUM, STRING
+
+Returns a scalar that has the value NUM in a numeric context and the
+value STRING in a string context.
+
+    $foo = dualvar 10, "Hello";
+    $num = $foo + 2;                    # 12
+    $str = $foo . " world";             # Hello world
+
+=item isvstring EXPR
+
+If EXPR is a scalar which was coded as a vstring the result is true.
+
+    $vs   = v49.46.48;
+    $fmt  = isvstring($vs) ? "%vd" : "%s"; #true
+    printf($fmt,$vs);
+
+=item isweak EXPR
+
+If EXPR is a scalar which is a weak reference the result is true.
+
+    $ref  = \$foo;
+    $weak = isweak($ref);               # false
+    weaken($ref);
+    $weak = isweak($ref);               # true
+
+B<NOTE>: Copying a weak reference creates a normal, strong, reference.
+
+    $copy = $ref;
+    $weak = isweak($ref);               # false
+
+=item looks_like_number EXPR
+
+Returns true if perl thinks EXPR is a number. See
+L<perlapi/looks_like_number>.
+
+=item openhandle FH
+
+Returns FH if FH may be used as a filehandle and is open, or FH is a tied
+handle. Otherwise C<undef> is returned.
+
+    $fh = openhandle(*STDIN);		# \*STDIN
+    $fh = openhandle(\*STDIN);		# \*STDIN
+    $fh = openhandle(*NOTOPEN);		# undef
+    $fh = openhandle("scalar");		# undef
+    
+=item readonly SCALAR
+
+Returns true if SCALAR is readonly.
+
+    sub foo { readonly($_[0]) }
+
+    $readonly = foo($bar);              # false
+    $readonly = foo(0);                 # true
+
+=item refaddr EXPR
+
+If EXPR evaluates to a reference the internal memory address of
+the referenced value is returned. Otherwise C<undef> is returned.
+
+    $addr = refaddr "string";           # undef
+    $addr = refaddr \$var;              # eg 12345678
+    $addr = refaddr [];                 # eg 23456784
+
+    $obj  = bless {}, "Foo";
+    $addr = refaddr $obj;               # eg 88123488
+
+=item reftype EXPR
+
+If EXPR evaluates to a reference the type of the variable referenced
+is returned. Otherwise C<undef> is returned.
+
+    $type = reftype "string";           # undef
+    $type = reftype \$var;              # SCALAR
+    $type = reftype [];                 # ARRAY
+
+    $obj  = bless {}, "Foo";
+    $type = reftype $obj;               # HASH
+
+=item set_prototype CODEREF, PROTOTYPE
+
+Sets the prototype of the given function, or deletes it if PROTOTYPE is
+undef. Returns the CODEREF.
+
+    set_prototype \&foo, '$$';
+
+=item tainted EXPR
+
+Return true if the result of EXPR is tainted
+
+    $taint = tainted("constant");       # false
+    $taint = tainted($ENV{PWD});        # true if running under -T
+
+=item weaken REF
+
+REF will be turned into a weak reference. This means that it will not
+hold a reference count on the object it references. Also when the reference
+count on that object reaches zero, REF will be set to undef.
+
+This is useful for keeping copies of references , but you don't want to
+prevent the object being DESTROY-ed at its usual time.
+
+    {
+      my $var;
+      $ref = \$var;
+      weaken($ref);                     # Make $ref a weak reference
+    }
+    # $ref is now undef
+
+Note that if you take a copy of a scalar with a weakened reference,
+the copy will be a strong reference.
+
+    my $var;
+    my $foo = \$var;
+    weaken($foo);                       # Make $foo a weak reference
+    my $bar = $foo;                     # $bar is now a strong reference
+
+This may be less obvious in other situations, such as C<grep()>, for instance
+when grepping through a list of weakened references to objects that may have
+been destroyed already:
+
+    @object = grep { defined } @object;
+
+This will indeed remove all references to destroyed objects, but the remaining
+references to objects will be strong, causing the remaining objects to never
+be destroyed because there is now always a strong reference to them in the
+@object array.
+
+=back
+
+=head1 KNOWN BUGS
+
+There is a bug in perl5.6.0 with UV's that are >= 1<<31. This will
+show up as tests 8 and 9 of dualvar.t failing
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-2005 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.
+
+Except weaken and isweak which are
+
+Copyright (c) 1999 Tuomas J. Lukka <lukka@iki.fi>. All rights reserved.
+This program is free software; you can redistribute it and/or modify it
+under the same terms as perl itself.
+
+=head1 BLATANT PLUG
+
+The weaken and isweak subroutines in this module and the patch to the core Perl
+were written in connection  with the APress book `Tuomas J. Lukka's Definitive
+Guide to Object-Oriented Programming in Perl', to avoid explaining why certain
+things would have to be done in cumbersome ways.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Search/Dict.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Search/Dict.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Search/Dict.pm	(revision 14489)
@@ -0,0 +1,108 @@
+package Search::Dict;
+require 5.000;
+require Exporter;
+
+use strict;
+
+our $VERSION = '1.02';
+our @ISA = qw(Exporter);
+our @EXPORT = qw(look);
+
+=head1 NAME
+
+Search::Dict, look - search for key in dictionary file
+
+=head1 SYNOPSIS
+
+    use Search::Dict;
+    look *FILEHANDLE, $key, $dict, $fold;
+
+    use Search::Dict;
+    look *FILEHANDLE, $params;
+
+=head1 DESCRIPTION
+
+Sets file position in FILEHANDLE to be first line greater than or equal
+(stringwise) to I<$key>.  Returns the new file position, or -1 if an error
+occurs.
+
+The flags specify dictionary order and case folding:
+
+If I<$dict> is true, search by dictionary order (ignore anything but word
+characters and whitespace).  The default is honour all characters.
+
+If I<$fold> is true, ignore case.  The default is to honour case.
+
+If there are only three arguments and the third argument is a hash
+reference, the keys of that hash can have values C<dict>, C<fold>, and
+C<comp> or C<xfrm> (see below), and their correponding values will be
+used as the parameters.
+
+If a comparison subroutine (comp) is defined, it must return less than zero,
+zero, or greater than zero, if the first comparand is less than,
+equal, or greater than the second comparand.
+
+If a transformation subroutine (xfrm) is defined, its value is used to
+transform the lines read from the filehandle before their comparison.
+
+=cut
+
+sub look {
+    my($fh,$key,$dict,$fold) = @_;
+    my ($comp, $xfrm);
+    if (@_ == 3 && ref $dict eq 'HASH') {
+	my $params = $dict;
+	$dict = 0;
+	$dict = $params->{dict} if exists $params->{dict};
+	$fold = $params->{fold} if exists $params->{fold};
+	$comp = $params->{comp} if exists $params->{comp};
+	$xfrm = $params->{xfrm} if exists $params->{xfrm};
+    }
+    $comp = sub { $_[0] cmp $_[1] } unless defined $comp;
+    local($_);
+    my(@stat) = stat($fh)
+	or return -1;
+    my($size, $blksize) = @stat[7,11];
+    $blksize ||= 8192;
+    $key =~ s/[^\w\s]//g if $dict;
+    $key = lc $key       if $fold;
+    # find the right block
+    my($min, $max) = (0, int($size / $blksize));
+    my $mid;
+    while ($max - $min > 1) {
+	$mid = int(($max + $min) / 2);
+	seek($fh, $mid * $blksize, 0)
+	    or return -1;
+	<$fh> if $mid;			# probably a partial line
+	$_ = <$fh>;
+	$_ = $xfrm->($_) if defined $xfrm;
+	chomp;
+	s/[^\w\s]//g if $dict;
+	$_ = lc $_   if $fold;
+	if (defined($_) && $comp->($_, $key) < 0) {
+	    $min = $mid;
+	}
+	else {
+	    $max = $mid;
+	}
+    }
+    # find the right line
+    $min *= $blksize;
+    seek($fh,$min,0)
+	or return -1;
+    <$fh> if $min;
+    for (;;) {
+	$min = tell($fh);
+	defined($_ = <$fh>)
+	    or last;
+	$_ = $xfrm->($_) if defined $xfrm;
+	chomp;
+	s/[^\w\s]//g if $dict;
+	$_ = lc $_   if $fold;
+	last if $comp->($_, $key) >= 0;
+    }
+    seek($fh,$min,0);
+    $min;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/SelectSaver.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/SelectSaver.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/SelectSaver.pm	(revision 14489)
@@ -0,0 +1,54 @@
+package SelectSaver;
+
+our $VERSION = '1.01';
+
+=head1 NAME
+
+SelectSaver - save and restore selected file handle
+
+=head1 SYNOPSIS
+
+    use SelectSaver;
+
+    {
+       my $saver = new SelectSaver(FILEHANDLE);
+       # FILEHANDLE is selected
+    }
+    # previous handle is selected
+
+    {
+       my $saver = new SelectSaver;
+       # new handle may be selected, or not
+    }
+    # previous handle is selected
+
+=head1 DESCRIPTION
+
+A C<SelectSaver> object contains a reference to the file handle that
+was selected when it was created.  If its C<new> method gets an extra
+parameter, then that parameter is selected; otherwise, the selected
+file handle remains unchanged.
+
+When a C<SelectSaver> is destroyed, it re-selects the file handle
+that was selected when it was created.
+
+=cut
+
+require 5.000;
+use Carp;
+use Symbol;
+
+sub new {
+    @_ >= 1 && @_ <= 2 or croak 'usage: new SelectSaver [FILEHANDLE]';
+    my $fh = select;
+    my $self = bless \$fh, $_[0];
+    select qualify($_[1], caller) if @_ > 1;
+    $self;
+}
+
+sub DESTROY {
+    my $self = $_[0];
+    select $$self;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/SelfLoader.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/SelfLoader.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/SelfLoader.pm	(revision 14489)
@@ -0,0 +1,319 @@
+package SelfLoader;
+# use Carp;
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(AUTOLOAD);
+$VERSION = "1.0904";
+sub Version {$VERSION}
+$DEBUG = 0;
+
+my %Cache;      # private cache for all SelfLoader's client packages
+
+# allow checking for valid ': attrlist' attachments
+# (we use 'our' rather than 'my' here, due to the rather complex and buggy
+# behaviour of lexicals with qr// and (??{$lex}) )
+our $nested;
+$nested = qr{ \( (?: (?> [^()]+ ) | (??{ $nested }) )* \) }x;
+our $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) (?:\s*\:\s*|\s+(?!\:)) }x;
+our $attr_list = qr{ \s* : \s* (?: $one_attr )* }x;
+
+sub croak { require Carp; goto &Carp::croak }
+
+AUTOLOAD {
+    print STDERR "SelfLoader::AUTOLOAD for $AUTOLOAD\n" if $DEBUG;
+    my $SL_code = $Cache{$AUTOLOAD};
+    my $save = $@; # evals in both AUTOLOAD and _load_stubs can corrupt $@
+    unless ($SL_code) {
+        # Maybe this pack had stubs before __DATA__, and never initialized.
+        # Or, this maybe an automatic DESTROY method call when none exists.
+        $AUTOLOAD =~ m/^(.*)::/;
+        SelfLoader->_load_stubs($1) unless exists $Cache{"${1}::<DATA"};
+        $SL_code = $Cache{$AUTOLOAD};
+        $SL_code = "sub $AUTOLOAD { }"
+            if (!$SL_code and $AUTOLOAD =~ m/::DESTROY$/);
+        croak "Undefined subroutine $AUTOLOAD" unless $SL_code;
+    }
+    print STDERR "SelfLoader::AUTOLOAD eval: $SL_code\n" if $DEBUG;
+
+    eval $SL_code;
+    if ($@) {
+        $@ =~ s/ at .*\n//;
+        croak $@;
+    }
+    $@ = $save;
+    defined(&$AUTOLOAD) || die "SelfLoader inconsistency error";
+    delete $Cache{$AUTOLOAD};
+    goto &$AUTOLOAD
+}
+
+sub load_stubs { shift->_load_stubs((caller)[0]) }
+
+sub _load_stubs {
+    # $endlines is used by Devel::SelfStubber to capture lines after __END__
+    my($self, $callpack, $endlines) = @_;
+    my $fh = \*{"${callpack}::DATA"};
+    my $currpack = $callpack;
+    my($line,$name,@lines, @stubs, $protoype);
+
+    print STDERR "SelfLoader::load_stubs($callpack)\n" if $DEBUG;
+    croak("$callpack doesn't contain an __DATA__ token")
+        unless fileno($fh);
+    $Cache{"${currpack}::<DATA"} = 1;   # indicate package is cached
+
+    local($/) = "\n";
+    while(defined($line = <$fh>) and $line !~ m/^__END__/) {
+	if ($line =~ m/^sub\s+([\w:]+)\s*((?:\([\\\$\@\%\&\*\;]*\))?(?:$attr_list)?)/) {
+            push(@stubs, $self->_add_to_cache($name, $currpack, \@lines, $protoype));
+            $protoype = $2;
+            @lines = ($line);
+            if (index($1,'::') == -1) {         # simple sub name
+                $name = "${currpack}::$1";
+            } else {                            # sub name with package
+                $name = $1;
+                $name =~ m/^(.*)::/;
+                if (defined(&{"${1}::AUTOLOAD"})) {
+                    \&{"${1}::AUTOLOAD"} == \&SelfLoader::AUTOLOAD ||
+                        die 'SelfLoader Error: attempt to specify Selfloading',
+                            " sub $name in non-selfloading module $1";
+                } else {
+                    $self->export($1,'AUTOLOAD');
+                }
+            }
+        } elsif ($line =~ m/^package\s+([\w:]+)/) { # A package declared
+            push(@stubs, $self->_add_to_cache($name, $currpack, \@lines, $protoype));
+            $self->_package_defined($line);
+            $name = '';
+            @lines = ();
+            $currpack = $1;
+            $Cache{"${currpack}::<DATA"} = 1;   # indicate package is cached
+            if (defined(&{"${1}::AUTOLOAD"})) {
+                \&{"${1}::AUTOLOAD"} == \&SelfLoader::AUTOLOAD ||
+                    die 'SelfLoader Error: attempt to specify Selfloading',
+                        " package $currpack which already has AUTOLOAD";
+            } else {
+                $self->export($currpack,'AUTOLOAD');
+            }
+        } else {
+            push(@lines,$line);
+        }
+    }
+    if (defined($line) && $line =~ /^__END__/) { # __END__
+        unless ($line =~ /^__END__\s*DATA/) {
+            if ($endlines) {
+                # Devel::SelfStubber would like us to capture the lines after
+                # __END__ so it can write out the entire file
+                @$endlines = <$fh>;
+            }
+            close($fh);
+        }
+    }
+    push(@stubs, $self->_add_to_cache($name, $currpack, \@lines, $protoype));
+    eval join('', @stubs) if @stubs;
+}
+
+
+sub _add_to_cache {
+    my($self,$fullname,$pack,$lines, $protoype) = @_;
+    return () unless $fullname;
+    (require Carp), Carp::carp("Redefining sub $fullname")
+      if exists $Cache{$fullname};
+    $Cache{$fullname} = join('', "package $pack; ",@$lines);
+    print STDERR "SelfLoader cached $fullname: $Cache{$fullname}" if $DEBUG;
+    # return stub to be eval'd
+    defined($protoype) ? "sub $fullname $protoype;" : "sub $fullname;"
+}
+
+sub _package_defined {}
+
+1;
+__END__
+
+=head1 NAME
+
+SelfLoader - load functions only on demand
+
+=head1 SYNOPSIS
+
+    package FOOBAR;
+    use SelfLoader;
+
+    ... (initializing code)
+
+    __DATA__
+    sub {....
+
+
+=head1 DESCRIPTION
+
+This module tells its users that functions in the FOOBAR package are to be
+autoloaded from after the C<__DATA__> token.  See also
+L<perlsub/"Autoloading">.
+
+=head2 The __DATA__ token
+
+The C<__DATA__> token tells the perl compiler that the perl code
+for compilation is finished. Everything after the C<__DATA__> token
+is available for reading via the filehandle FOOBAR::DATA,
+where FOOBAR is the name of the current package when the C<__DATA__>
+token is reached. This works just the same as C<__END__> does in
+package 'main', but for other modules data after C<__END__> is not
+automatically retrievable, whereas data after C<__DATA__> is.
+The C<__DATA__> token is not recognized in versions of perl prior to
+5.001m.
+
+Note that it is possible to have C<__DATA__> tokens in the same package
+in multiple files, and that the last C<__DATA__> token in a given
+package that is encountered by the compiler is the one accessible
+by the filehandle. This also applies to C<__END__> and main, i.e. if
+the 'main' program has an C<__END__>, but a module 'require'd (_not_ 'use'd)
+by that program has a 'package main;' declaration followed by an 'C<__DATA__>',
+then the C<DATA> filehandle is set to access the data after the C<__DATA__>
+in the module, _not_ the data after the C<__END__> token in the 'main'
+program, since the compiler encounters the 'require'd file later.
+
+=head2 SelfLoader autoloading
+
+The B<SelfLoader> works by the user placing the C<__DATA__>
+token I<after> perl code which needs to be compiled and
+run at 'require' time, but I<before> subroutine declarations
+that can be loaded in later - usually because they may never
+be called.
+
+The B<SelfLoader> will read from the FOOBAR::DATA filehandle to
+load in the data after C<__DATA__>, and load in any subroutine
+when it is called. The costs are the one-time parsing of the
+data after C<__DATA__>, and a load delay for the _first_
+call of any autoloaded function. The benefits (hopefully)
+are a speeded up compilation phase, with no need to load
+functions which are never used.
+
+The B<SelfLoader> will stop reading from C<__DATA__> if
+it encounters the C<__END__> token - just as you would expect.
+If the C<__END__> token is present, and is followed by the
+token DATA, then the B<SelfLoader> leaves the FOOBAR::DATA
+filehandle open on the line after that token.
+
+The B<SelfLoader> exports the C<AUTOLOAD> subroutine to the
+package using the B<SelfLoader>, and this loads the called
+subroutine when it is first called.
+
+There is no advantage to putting subroutines which will _always_
+be called after the C<__DATA__> token.
+
+=head2 Autoloading and package lexicals
+
+A 'my $pack_lexical' statement makes the variable $pack_lexical
+local _only_ to the file up to the C<__DATA__> token. Subroutines
+declared elsewhere _cannot_ see these types of variables,
+just as if you declared subroutines in the package but in another
+file, they cannot see these variables.
+
+So specifically, autoloaded functions cannot see package
+lexicals (this applies to both the B<SelfLoader> and the Autoloader).
+The C<vars> pragma provides an alternative to defining package-level
+globals that will be visible to autoloaded routines. See the documentation
+on B<vars> in the pragma section of L<perlmod>.
+
+=head2 SelfLoader and AutoLoader
+
+The B<SelfLoader> can replace the AutoLoader - just change 'use AutoLoader'
+to 'use SelfLoader' (though note that the B<SelfLoader> exports
+the AUTOLOAD function - but if you have your own AUTOLOAD and
+are using the AutoLoader too, you probably know what you're doing),
+and the C<__END__> token to C<__DATA__>. You will need perl version 5.001m
+or later to use this (version 5.001 with all patches up to patch m).
+
+There is no need to inherit from the B<SelfLoader>.
+
+The B<SelfLoader> works similarly to the AutoLoader, but picks up the
+subs from after the C<__DATA__> instead of in the 'lib/auto' directory.
+There is a maintenance gain in not needing to run AutoSplit on the module
+at installation, and a runtime gain in not needing to keep opening and
+closing files to load subs. There is a runtime loss in needing
+to parse the code after the C<__DATA__>. Details of the B<AutoLoader> and
+another view of these distinctions can be found in that module's
+documentation.
+
+=head2 __DATA__, __END__, and the FOOBAR::DATA filehandle.
+
+This section is only relevant if you want to use
+the C<FOOBAR::DATA> together with the B<SelfLoader>.
+
+Data after the C<__DATA__> token in a module is read using the
+FOOBAR::DATA filehandle. C<__END__> can still be used to denote the end
+of the C<__DATA__> section if followed by the token DATA - this is supported
+by the B<SelfLoader>. The C<FOOBAR::DATA> filehandle is left open if an
+C<__END__> followed by a DATA is found, with the filehandle positioned at
+the start of the line after the C<__END__> token. If no C<__END__> token is
+present, or an C<__END__> token with no DATA token on the same line, then
+the filehandle is closed.
+
+The B<SelfLoader> reads from wherever the current
+position of the C<FOOBAR::DATA> filehandle is, until the
+EOF or C<__END__>. This means that if you want to use
+that filehandle (and ONLY if you want to), you should either
+
+1. Put all your subroutine declarations immediately after
+the C<__DATA__> token and put your own data after those
+declarations, using the C<__END__> token to mark the end
+of subroutine declarations. You must also ensure that the B<SelfLoader>
+reads first by  calling 'SelfLoader-E<gt>load_stubs();', or by using a
+function which is selfloaded;
+
+or
+
+2. You should read the C<FOOBAR::DATA> filehandle first, leaving
+the handle open and positioned at the first line of subroutine
+declarations.
+
+You could conceivably do both.
+
+=head2 Classes and inherited methods.
+
+For modules which are not classes, this section is not relevant.
+This section is only relevant if you have methods which could
+be inherited.
+
+A subroutine stub (or forward declaration) looks like
+
+  sub stub;
+
+i.e. it is a subroutine declaration without the body of the
+subroutine. For modules which are not classes, there is no real
+need for stubs as far as autoloading is concerned.
+
+For modules which ARE classes, and need to handle inherited methods,
+stubs are needed to ensure that the method inheritance mechanism works
+properly. You can load the stubs into the module at 'require' time, by
+adding the statement 'SelfLoader-E<gt>load_stubs();' to the module to do
+this.
+
+The alternative is to put the stubs in before the C<__DATA__> token BEFORE
+releasing the module, and for this purpose the C<Devel::SelfStubber>
+module is available.  However this does require the extra step of ensuring
+that the stubs are in the module. If this is done I strongly recommend
+that this is done BEFORE releasing the module - it should NOT be done
+at install time in general.
+
+=head1 Multiple packages and fully qualified subroutine names
+
+Subroutines in multiple packages within the same file are supported - but you
+should note that this requires exporting the C<SelfLoader::AUTOLOAD> to
+every package which requires it. This is done automatically by the
+B<SelfLoader> when it first loads the subs into the cache, but you should
+really specify it in the initialization before the C<__DATA__> by putting
+a 'use SelfLoader' statement in each package.
+
+Fully qualified subroutine names are also supported. For example,
+
+   __DATA__
+   sub foo::bar {23}
+   package baz;
+   sub dob {32}
+
+will all be loaded correctly by the B<SelfLoader>, and the B<SelfLoader>
+will ensure that the packages 'foo' and 'baz' correctly have the
+B<SelfLoader> C<AUTOLOAD> method when the data after C<__DATA__> is first
+parsed.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Shell.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Shell.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Shell.pm	(revision 14489)
@@ -0,0 +1,240 @@
+package Shell;
+use 5.006_001;
+use strict;
+use warnings;
+use File::Spec::Functions;
+
+our($capture_stderr, $raw, $VERSION, $AUTOLOAD);
+
+$VERSION = '0.6';
+
+sub new { bless \my $foo, shift }
+sub DESTROY { }
+
+sub import {
+    my $self = shift;
+    my ($callpack, $callfile, $callline) = caller;
+    my @EXPORT;
+    if (@_) {
+	@EXPORT = @_;
+    } else {
+	@EXPORT = 'AUTOLOAD';
+    }
+    foreach my $sym (@EXPORT) {
+        no strict 'refs';
+        *{"${callpack}::$sym"} = \&{"Shell::$sym"};
+    }
+}
+
+sub AUTOLOAD {
+    shift if ref $_[0] && $_[0]->isa( 'Shell' );
+    my $cmd = $AUTOLOAD;
+    $cmd =~ s/^.*:://;
+    my $null = File::Spec::Functions::devnull();
+    $Shell::capture_stderr ||= 0;
+    eval <<"*END*";
+	sub $AUTOLOAD {
+	    shift if ref \$_[0] && \$_[0]->isa( 'Shell' );
+	    if (\@_ < 1) {
+		\$Shell::capture_stderr ==  1 ? `$cmd 2>&1` : 
+		\$Shell::capture_stderr == -1 ? `$cmd 2>$null` : 
+		`$cmd`;
+	    } elsif ('$^O' eq 'os2') {
+		local(\*SAVEOUT, \*READ, \*WRITE);
+
+		open SAVEOUT, '>&STDOUT' or die;
+		pipe READ, WRITE or die;
+		open STDOUT, '>&WRITE' or die;
+		close WRITE;
+
+		my \$pid = system(1, '$cmd', \@_);
+		die "Can't execute $cmd: \$!\\n" if \$pid < 0;
+
+		open STDOUT, '>&SAVEOUT' or die;
+		close SAVEOUT;
+
+		if (wantarray) {
+		    my \@ret = <READ>;
+		    close READ;
+		    waitpid \$pid, 0;
+		    \@ret;
+		} else {
+		    local(\$/) = undef;
+		    my \$ret = <READ>;
+		    close READ;
+		    waitpid \$pid, 0;
+		    \$ret;
+		}
+	    } else {
+		my \$a;
+		my \@arr = \@_;
+		unless( \$Shell::raw ){
+		  if ('$^O' eq 'MSWin32') {
+		    # XXX this special-casing should not be needed
+		    # if we do quoting right on Windows. :-(
+		    #
+		    # First, escape all quotes.  Cover the case where we
+		    # want to pass along a quote preceded by a backslash
+		    # (i.e., C<"param \\""" end">).
+		    # Ugly, yup?  You know, windoze.
+		    # Enclose in quotes only the parameters that need it:
+		    #   try this: c:\> dir "/w"
+		    #   and this: c:\> dir /w
+		    for (\@arr) {
+			s/"/\\\\"/g;
+			s/\\\\\\\\"/\\\\\\\\"""/g;
+			\$_ = qq["\$_"] if /\\s/;
+		    }
+		  } else {
+		    for (\@arr) {
+			s/(['\\\\])/\\\\\$1/g;
+			\$_ = \$_;
+ 		    }
+                  }
+		}
+		push \@arr, '2>&1'        if \$Shell::capture_stderr ==  1;
+		push \@arr, '2>$null' if \$Shell::capture_stderr == -1;
+		open(SUBPROC, join(' ', '$cmd', \@arr, '|'))
+		    or die "Can't exec $cmd: \$!\\n";
+		if (wantarray) {
+		    my \@ret = <SUBPROC>;
+		    close SUBPROC;	# XXX Oughta use a destructor.
+		    \@ret;
+		} else {
+		    local(\$/) = undef;
+		    my \$ret = <SUBPROC>;
+		    close SUBPROC;
+		    \$ret;
+		}
+	    }
+	}
+*END*
+
+    die "$@\n" if $@;
+    goto &$AUTOLOAD;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Shell - run shell commands transparently within perl
+
+=head1 SYNOPSIS
+
+   use Shell qw(cat ps cp);
+   $passwd = cat('</etc/passwd');
+   @pslines = ps('-ww'),
+   cp("/etc/passwd", "/tmp/passwd");
+
+   # object oriented 
+   my $sh = Shell->new;
+   print $sh->ls('-l');
+
+=head1 DESCRIPTION
+
+=head2 Caveats
+
+This package is included as a show case, illustrating a few Perl features.
+It shouldn't be used for production programs. Although it does provide a 
+simple interface for obtaining the standard output of arbitrary commands,
+there may be better ways of achieving what you need.
+
+Running shell commands while obtaining standard output can be done with the
+C<qx/STRING/> operator, or by calling C<open> with a filename expression that
+ends with C<|>, giving you the option to process one line at a time.
+If you don't need to process standard output at all, you might use C<system>
+(in preference of doing a print with the collected standard output).
+
+Since Shell.pm and all of the aforementioned techniques use your system's
+shell to call some local command, none of them is portable across different 
+systems. Note, however, that there are several built in functions and 
+library packages providing portable implementations of functions operating
+on files, such as: C<glob>, C<link> and C<unlink>, C<mkdir> and C<rmdir>, 
+C<rename>, C<File::Compare>, C<File::Copy>, C<File::Find> etc.
+
+Using Shell.pm while importing C<foo> creates a subroutine C<foo> in the
+namespace of the importing package. Calling C<foo> with arguments C<arg1>,
+C<arg2>,... results in a shell command C<foo arg1 arg2...>, where the 
+function name and the arguments are joined with a blank. (See the subsection 
+on Escaping magic characters.) Since the result is essentially a command
+line to be passed to the shell, your notion of arguments to the Perl
+function is not necessarily identical to what the shell treats as a
+command line token, to be passed as an individual argument to the program.
+Furthermore, note that this implies that C<foo> is callable by file name
+only, which frequently depends on the setting of the program's environment.
+
+Creating a Shell object gives you the opportunity to call any command
+in the usual OO notation without requiring you to announce it in the
+C<use Shell> statement. Don't assume any additional semantics being
+associated with a Shell object: in no way is it similar to a shell
+process with its environment or current working directory or any
+other setting.
+
+=head2 Escaping Magic Characters
+
+It is, in general, impossible to take care of quoting the shell's
+magic characters. For some obscure reason, however, Shell.pm quotes
+apostrophes (C<'>) and backslashes (C<\>) on UNIX, and spaces and
+quotes (C<">) on Windows.
+
+=head2 Configuration
+
+If you set $Shell::capture_stderr to true, the module will attempt to
+capture the standard error output of the process as well. This is
+done by adding C<2E<gt>&1> to the command line, so don't try this on
+a system not supporting this redirection.
+
+If you set $Shell::raw to true no quoting whatsoever is done.
+
+=head1 BUGS
+
+Quoting should be off by default.
+
+It isn't possible to call shell built in commands, but it can be
+done by using a workaround, e.g. shell( '-c', 'set' ).
+
+Capturing standard error does not work on some systems (e.g. VMS).
+
+=head1 AUTHOR
+
+  Date: Thu, 22 Sep 94 16:18:16 -0700
+  Message-Id: <9409222318.AA17072@scalpel.netlabs.com>
+  To: perl5-porters@isu.edu
+  From: Larry Wall <lwall@scalpel.netlabs.com>
+  Subject: a new module I just wrote
+
+Here's one that'll whack your mind a little out.
+
+    #!/usr/bin/perl
+
+    use Shell;
+
+    $foo = echo("howdy", "<funny>", "world");
+    print $foo;
+
+    $passwd = cat("</etc/passwd");
+    print $passwd;
+
+    sub ps;
+    print ps -ww;
+
+    cp("/etc/passwd", "/etc/passwd.orig");
+
+That's maybe too gonzo.  It actually exports an AUTOLOAD to the current
+package (and uncovered a bug in Beta 3, by the way).  Maybe the usual
+usage should be
+
+    use Shell qw(echo cat ps cp);
+
+Larry Wall
+
+Changes by Jenda@Krynicky.cz and Dave Cottle <d.cottle@csc.canterbury.ac.nz>.
+
+Changes for OO syntax and bug fixes by Casey West <casey@geeknest.com>.
+
+C<$Shell::raw> and pod rewrite by Wolfgang Laun.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Socket.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Socket.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Socket.pm	(revision 14489)
@@ -0,0 +1,401 @@
+package Socket;
+
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+$VERSION = "1.78";
+
+=head1 NAME
+
+Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C socket.h defines and structure manipulators 
+
+=head1 SYNOPSIS
+
+    use Socket;
+
+    $proto = getprotobyname('udp');
+    socket(Socket_Handle, PF_INET, SOCK_DGRAM, $proto);
+    $iaddr = gethostbyname('hishost.com');
+    $port = getservbyname('time', 'udp');
+    $sin = sockaddr_in($port, $iaddr);
+    send(Socket_Handle, 0, 0, $sin);
+
+    $proto = getprotobyname('tcp');
+    socket(Socket_Handle, PF_INET, SOCK_STREAM, $proto);
+    $port = getservbyname('smtp', 'tcp');
+    $sin = sockaddr_in($port,inet_aton("127.1"));
+    $sin = sockaddr_in(7,inet_aton("localhost"));
+    $sin = sockaddr_in(7,INADDR_LOOPBACK);
+    connect(Socket_Handle,$sin);
+
+    ($port, $iaddr) = sockaddr_in(getpeername(Socket_Handle));
+    $peer_host = gethostbyaddr($iaddr, AF_INET);
+    $peer_addr = inet_ntoa($iaddr);
+
+    $proto = getprotobyname('tcp');
+    socket(Socket_Handle, PF_UNIX, SOCK_STREAM, $proto);
+    unlink('/var/run/usock');
+    $sun = sockaddr_un('/var/run/usock');
+    connect(Socket_Handle,$sun);
+
+=head1 DESCRIPTION
+
+This module is just a translation of the C F<socket.h> file.
+Unlike the old mechanism of requiring a translated F<socket.ph>
+file, this uses the B<h2xs> program (see the Perl source distribution)
+and your native C compiler.  This means that it has a 
+far more likely chance of getting the numbers right.  This includes
+all of the commonly used pound-defines like AF_INET, SOCK_STREAM, etc.
+
+Also, some common socket "newline" constants are provided: the
+constants C<CR>, C<LF>, and C<CRLF>, as well as C<$CR>, C<$LF>, and
+C<$CRLF>, which map to C<\015>, C<\012>, and C<\015\012>.  If you do
+not want to use the literal characters in your programs, then use
+the constants provided here.  They are not exported by default, but can
+be imported individually, and with the C<:crlf> export tag:
+
+    use Socket qw(:DEFAULT :crlf);
+
+In addition, some structure manipulation functions are available:
+
+=over 4
+
+=item inet_aton HOSTNAME
+
+Takes a string giving the name of a host, and translates that to an
+opaque string (if programming in C, struct in_addr). Takes arguments
+of both the 'rtfm.mit.edu' type and '18.181.0.24'. If the host name
+cannot be resolved, returns undef.  For multi-homed hosts (hosts with
+more than one address), the first address found is returned.
+
+For portability do not assume that the result of inet_aton() is 32
+bits wide, in other words, that it would contain only the IPv4 address
+in network order.
+
+=item inet_ntoa IP_ADDRESS
+
+Takes a string (an opaque string as returned by inet_aton(),
+or a v-string representing the four octets of the IPv4 address in
+network order) and translates it into a string of the form 'd.d.d.d'
+where the 'd's are numbers less than 256 (the normal human-readable
+four dotted number notation for Internet addresses).
+
+=item INADDR_ANY
+
+Note: does not return a number, but a packed string.
+
+Returns the 4-byte wildcard ip address which specifies any
+of the hosts ip addresses.  (A particular machine can have
+more than one ip address, each address corresponding to
+a particular network interface. This wildcard address
+allows you to bind to all of them simultaneously.)
+Normally equivalent to inet_aton('0.0.0.0').
+
+=item INADDR_BROADCAST
+
+Note: does not return a number, but a packed string.
+
+Returns the 4-byte 'this-lan' ip broadcast address.
+This can be useful for some protocols to solicit information
+from all servers on the same LAN cable.
+Normally equivalent to inet_aton('255.255.255.255').
+
+=item INADDR_LOOPBACK
+
+Note - does not return a number.
+
+Returns the 4-byte loopback address.  Normally equivalent
+to inet_aton('localhost').
+
+=item INADDR_NONE
+
+Note - does not return a number.
+
+Returns the 4-byte 'invalid' ip address.  Normally equivalent
+to inet_aton('255.255.255.255').
+
+=item sockaddr_family SOCKADDR
+
+Takes a sockaddr structure (as returned by pack_sockaddr_in(),
+pack_sockaddr_un() or the perl builtin functions getsockname() and
+getpeername()) and returns the address family tag.  It will match the
+constant AF_INET for a sockaddr_in and AF_UNIX for a sockaddr_un.  It
+can be used to figure out what unpacker to use for a sockaddr of
+unknown type.
+
+=item sockaddr_in PORT, ADDRESS
+
+=item sockaddr_in SOCKADDR_IN
+
+In a list context, unpacks its SOCKADDR_IN argument and returns an array
+consisting of (PORT, ADDRESS).  In a scalar context, packs its (PORT,
+ADDRESS) arguments as a SOCKADDR_IN and returns it.  If this is confusing,
+use pack_sockaddr_in() and unpack_sockaddr_in() explicitly.
+
+=item pack_sockaddr_in PORT, IP_ADDRESS
+
+Takes two arguments, a port number and an opaque string, IP_ADDRESS
+(as returned by inet_aton(), or a v-string).  Returns the sockaddr_in
+structure with those arguments packed in with AF_INET filled in.  For
+Internet domain sockets, this structure is normally what you need for
+the arguments in bind(), connect(), and send(), and is also returned
+by getpeername(), getsockname() and recv().
+
+=item unpack_sockaddr_in SOCKADDR_IN
+
+Takes a sockaddr_in structure (as returned by pack_sockaddr_in()) and
+returns an array of two elements: the port and an opaque string
+representing the IP address (you can use inet_ntoa() to convert the
+address to the four-dotted numeric format).  Will croak if the
+structure does not have AF_INET in the right place.
+
+=item sockaddr_un PATHNAME
+
+=item sockaddr_un SOCKADDR_UN
+
+In a list context, unpacks its SOCKADDR_UN argument and returns an array
+consisting of (PATHNAME).  In a scalar context, packs its PATHNAME
+arguments as a SOCKADDR_UN and returns it.  If this is confusing, use
+pack_sockaddr_un() and unpack_sockaddr_un() explicitly.
+These are only supported if your system has E<lt>F<sys/un.h>E<gt>.
+
+=item pack_sockaddr_un PATH
+
+Takes one argument, a pathname. Returns the sockaddr_un structure with
+that path packed in with AF_UNIX filled in. For unix domain sockets, this
+structure is normally what you need for the arguments in bind(),
+connect(), and send(), and is also returned by getpeername(),
+getsockname() and recv().
+
+=item unpack_sockaddr_un SOCKADDR_UN
+
+Takes a sockaddr_un structure (as returned by pack_sockaddr_un())
+and returns the pathname.  Will croak if the structure does not
+have AF_UNIX in the right place.
+
+=back
+
+=cut
+
+use Carp;
+use warnings::register;
+
+require Exporter;
+use XSLoader ();
+@ISA = qw(Exporter);
+@EXPORT = qw(
+	inet_aton inet_ntoa
+	sockaddr_family
+	pack_sockaddr_in unpack_sockaddr_in
+	pack_sockaddr_un unpack_sockaddr_un
+	sockaddr_in sockaddr_un
+	INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_NONE
+	AF_802
+	AF_AAL
+	AF_APPLETALK
+	AF_CCITT
+	AF_CHAOS
+	AF_CTF
+	AF_DATAKIT
+	AF_DECnet
+	AF_DLI
+	AF_ECMA
+	AF_GOSIP
+	AF_HYLINK
+	AF_IMPLINK
+	AF_INET
+	AF_INET6
+	AF_ISO
+	AF_KEY
+	AF_LAST
+	AF_LAT
+	AF_LINK
+	AF_MAX
+	AF_NBS
+	AF_NIT
+	AF_NS
+	AF_OSI
+	AF_OSINET
+	AF_PUP
+	AF_ROUTE
+	AF_SNA
+	AF_UNIX
+	AF_UNSPEC
+	AF_USER
+	AF_WAN
+	AF_X25
+	IOV_MAX
+	MSG_BCAST
+	MSG_BTAG
+	MSG_CTLFLAGS
+	MSG_CTLIGNORE
+	MSG_CTRUNC
+	MSG_DONTROUTE
+	MSG_DONTWAIT
+	MSG_EOF
+	MSG_EOR
+	MSG_ERRQUEUE
+	MSG_ETAG
+	MSG_FIN
+	MSG_MAXIOVLEN
+	MSG_MCAST
+	MSG_NOSIGNAL
+	MSG_OOB
+	MSG_PEEK
+	MSG_PROXY
+	MSG_RST
+	MSG_SYN
+	MSG_TRUNC
+	MSG_URG
+	MSG_WAITALL
+	MSG_WIRE
+	PF_802
+	PF_AAL
+	PF_APPLETALK
+	PF_CCITT
+	PF_CHAOS
+	PF_CTF
+	PF_DATAKIT
+	PF_DECnet
+	PF_DLI
+	PF_ECMA
+	PF_GOSIP
+	PF_HYLINK
+	PF_IMPLINK
+	PF_INET
+	PF_INET6
+	PF_ISO
+	PF_KEY
+	PF_LAST
+	PF_LAT
+	PF_LINK
+	PF_MAX
+	PF_NBS
+	PF_NIT
+	PF_NS
+	PF_OSI
+	PF_OSINET
+	PF_PUP
+	PF_ROUTE
+	PF_SNA
+	PF_UNIX
+	PF_UNSPEC
+	PF_USER
+	PF_WAN
+	PF_X25
+	SCM_CONNECT
+	SCM_CREDENTIALS
+	SCM_CREDS
+	SCM_RIGHTS
+	SCM_TIMESTAMP
+	SHUT_RD
+	SHUT_RDWR
+	SHUT_WR
+	SOCK_DGRAM
+	SOCK_RAW
+	SOCK_RDM
+	SOCK_SEQPACKET
+	SOCK_STREAM
+	SOL_SOCKET
+	SOMAXCONN
+	SO_ACCEPTCONN
+	SO_ATTACH_FILTER
+	SO_BACKLOG
+	SO_BROADCAST
+	SO_CHAMELEON
+	SO_DEBUG
+	SO_DETACH_FILTER
+	SO_DGRAM_ERRIND
+	SO_DONTLINGER
+	SO_DONTROUTE
+	SO_ERROR
+	SO_FAMILY
+	SO_KEEPALIVE
+	SO_LINGER
+	SO_OOBINLINE
+	SO_PASSCRED
+	SO_PASSIFNAME
+	SO_PEERCRED
+	SO_PROTOCOL
+	SO_PROTOTYPE
+	SO_RCVBUF
+	SO_RCVLOWAT
+	SO_RCVTIMEO
+	SO_REUSEADDR
+	SO_REUSEPORT
+	SO_SECURITY_AUTHENTICATION
+	SO_SECURITY_ENCRYPTION_NETWORK
+	SO_SECURITY_ENCRYPTION_TRANSPORT
+	SO_SNDBUF
+	SO_SNDLOWAT
+	SO_SNDTIMEO
+	SO_STATE
+	SO_TYPE
+	SO_USELOOPBACK
+	SO_XOPEN
+	SO_XSE
+	UIO_MAXIOV
+);
+
+@EXPORT_OK = qw(CR LF CRLF $CR $LF $CRLF
+
+	       IPPROTO_TCP
+	       TCP_KEEPALIVE
+	       TCP_MAXRT
+	       TCP_MAXSEG
+	       TCP_NODELAY
+	       TCP_STDURG);
+
+%EXPORT_TAGS = (
+    crlf    => [qw(CR LF CRLF $CR $LF $CRLF)],
+    all     => [@EXPORT, @EXPORT_OK],
+);
+
+BEGIN {
+    sub CR   () {"\015"}
+    sub LF   () {"\012"}
+    sub CRLF () {"\015\012"}
+}
+
+*CR   = \CR();
+*LF   = \LF();
+*CRLF = \CRLF();
+
+sub sockaddr_in {
+    if (@_ == 6 && !wantarray) { # perl5.001m compat; use this && die
+	my($af, $port, @quad) = @_;
+	warnings::warn "6-ARG sockaddr_in call is deprecated" 
+	    if warnings::enabled();
+	pack_sockaddr_in($port, inet_aton(join('.', @quad)));
+    } elsif (wantarray) {
+	croak "usage:   (port,iaddr) = sockaddr_in(sin_sv)" unless @_ == 1;
+        unpack_sockaddr_in(@_);
+    } else {
+	croak "usage:   sin_sv = sockaddr_in(port,iaddr))" unless @_ == 2;
+        pack_sockaddr_in(@_);
+    }
+}
+
+sub sockaddr_un {
+    if (wantarray) {
+	croak "usage:   (filename) = sockaddr_un(sun_sv)" unless @_ == 1;
+        unpack_sockaddr_un(@_);
+    } else {
+	croak "usage:   sun_sv = sockaddr_un(filename)" unless @_ == 1;
+        pack_sockaddr_un(@_);
+    }
+}
+
+sub AUTOLOAD {
+    my($constname);
+    ($constname = $AUTOLOAD) =~ s/.*:://;
+    croak "&Socket::constant not defined" if $constname eq 'constant';
+    my ($error, $val) = constant($constname);
+    if ($error) {
+	croak $error;
+    }
+    *$AUTOLOAD = sub { $val };
+    goto &$AUTOLOAD;
+}
+
+XSLoader::load 'Socket', $VERSION;
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Storable.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Storable.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Storable.pm	(revision 14489)
@@ -0,0 +1,1038 @@
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+
+require DynaLoader;
+require Exporter;
+package Storable; @ISA = qw(Exporter DynaLoader);
+
+@EXPORT = qw(store retrieve);
+@EXPORT_OK = qw(
+	nstore store_fd nstore_fd fd_retrieve
+	freeze nfreeze thaw
+	dclone
+	retrieve_fd
+	lock_store lock_nstore lock_retrieve
+);
+
+use AutoLoader;
+use vars qw($canonical $forgive_me $VERSION);
+
+$VERSION = '2.15';
+*AUTOLOAD = \&AutoLoader::AUTOLOAD;		# Grrr...
+
+#
+# Use of Log::Agent is optional
+#
+
+{
+    local $SIG{__DIE__};
+    eval "use Log::Agent";
+}
+
+require Carp;
+
+#
+# They might miss :flock in Fcntl
+#
+
+BEGIN {
+	if (eval { require Fcntl; 1 } && exists $Fcntl::EXPORT_TAGS{'flock'}) {
+		Fcntl->import(':flock');
+	} else {
+		eval q{
+			sub LOCK_SH ()	{1}
+			sub LOCK_EX ()	{2}
+		};
+	}
+}
+
+sub CLONE {
+    # clone context under threads
+    Storable::init_perinterp();
+}
+
+# Can't Autoload cleanly as this clashes 8.3 with &retrieve
+sub retrieve_fd { &fd_retrieve }		# Backward compatibility
+
+# By default restricted hashes are downgraded on earlier perls.
+
+$Storable::downgrade_restricted = 1;
+$Storable::accept_future_minor = 1;
+bootstrap Storable;
+1;
+__END__
+#
+# Use of Log::Agent is optional. If it hasn't imported these subs then
+# Autoloader will kindly supply our fallback implementation.
+#
+
+sub logcroak {
+    Carp::croak(@_);
+}
+
+sub logcarp {
+  Carp::carp(@_);
+}
+
+#
+# Determine whether locking is possible, but only when needed.
+#
+
+sub CAN_FLOCK; my $CAN_FLOCK; sub CAN_FLOCK {
+	return $CAN_FLOCK if defined $CAN_FLOCK;
+	require Config; import Config;
+	return $CAN_FLOCK =
+		$Config{'d_flock'} ||
+		$Config{'d_fcntl_can_lock'} ||
+		$Config{'d_lockf'};
+}
+
+sub show_file_magic {
+    print <<EOM;
+#
+# To recognize the data files of the Perl module Storable,
+# the following lines need to be added to the local magic(5) file,
+# usually either /usr/share/misc/magic or /etc/magic.
+#
+0	string	perl-store	perl Storable(v0.6) data
+>4	byte	>0	(net-order %d)
+>>4	byte	&01	(network-ordered)
+>>4	byte	=3	(major 1)
+>>4	byte	=2	(major 1)
+
+0	string	pst0	perl Storable(v0.7) data
+>4	byte	>0
+>>4	byte	&01	(network-ordered)
+>>4	byte	=5	(major 2)
+>>4	byte	=4	(major 2)
+>>5	byte	>0	(minor %d)
+EOM
+}
+
+sub read_magic {
+  my $header = shift;
+  return unless defined $header and length $header > 11;
+  my $result;
+  if ($header =~ s/^perl-store//) {
+    die "Can't deal with version 0 headers";
+  } elsif ($header =~ s/^pst0//) {
+    $result->{file} = 1;
+  }
+  # Assume it's a string.
+  my ($major, $minor, $bytelen) = unpack "C3", $header;
+
+  my $net_order = $major & 1;
+  $major >>= 1;
+  @$result{qw(major minor netorder)} = ($major, $minor, $net_order);
+
+  return $result if $net_order;
+
+  # I assume that it is rare to find v1 files, so this is an intentionally
+  # inefficient way of doing it, to make the rest of the code constant.
+  if ($major < 2) {
+    delete $result->{minor};
+    $header = '.' . $header;
+    $bytelen = $minor;
+  }
+
+  @$result{qw(byteorder intsize longsize ptrsize)} =
+    unpack "x3 A$bytelen C3", $header;
+
+  if ($major >= 2 and $minor >= 2) {
+    $result->{nvsize} = unpack "x6 x$bytelen C", $header;
+  }
+  $result;
+}
+
+#
+# store
+#
+# Store target object hierarchy, identified by a reference to its root.
+# The stored object tree may later be retrieved to memory via retrieve.
+# Returns undef if an I/O error occurred, in which case the file is
+# removed.
+#
+sub store {
+	return _store(\&pstore, @_, 0);
+}
+
+#
+# nstore
+#
+# Same as store, but in network order.
+#
+sub nstore {
+	return _store(\&net_pstore, @_, 0);
+}
+
+#
+# lock_store
+#
+# Same as store, but flock the file first (advisory locking).
+#
+sub lock_store {
+	return _store(\&pstore, @_, 1);
+}
+
+#
+# lock_nstore
+#
+# Same as nstore, but flock the file first (advisory locking).
+#
+sub lock_nstore {
+	return _store(\&net_pstore, @_, 1);
+}
+
+# Internal store to file routine
+sub _store {
+	my $xsptr = shift;
+	my $self = shift;
+	my ($file, $use_locking) = @_;
+	logcroak "not a reference" unless ref($self);
+	logcroak "wrong argument number" unless @_ == 2;	# No @foo in arglist
+	local *FILE;
+	if ($use_locking) {
+		open(FILE, ">>$file") || logcroak "can't write into $file: $!";
+		unless (&CAN_FLOCK) {
+			logcarp "Storable::lock_store: fcntl/flock emulation broken on $^O";
+			return undef;
+		}
+		flock(FILE, LOCK_EX) ||
+			logcroak "can't get exclusive lock on $file: $!";
+		truncate FILE, 0;
+		# Unlocking will happen when FILE is closed
+	} else {
+		open(FILE, ">$file") || logcroak "can't create $file: $!";
+	}
+	binmode FILE;				# Archaic systems...
+	my $da = $@;				# Don't mess if called from exception handler
+	my $ret;
+	# Call C routine nstore or pstore, depending on network order
+	eval { $ret = &$xsptr(*FILE, $self) };
+	close(FILE) or $ret = undef;
+	unlink($file) or warn "Can't unlink $file: $!\n" if $@ || !defined $ret;
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	$@ = $da;
+	return $ret ? $ret : undef;
+}
+
+#
+# store_fd
+#
+# Same as store, but perform on an already opened file descriptor instead.
+# Returns undef if an I/O error occurred.
+#
+sub store_fd {
+	return _store_fd(\&pstore, @_);
+}
+
+#
+# nstore_fd
+#
+# Same as store_fd, but in network order.
+#
+sub nstore_fd {
+	my ($self, $file) = @_;
+	return _store_fd(\&net_pstore, @_);
+}
+
+# Internal store routine on opened file descriptor
+sub _store_fd {
+	my $xsptr = shift;
+	my $self = shift;
+	my ($file) = @_;
+	logcroak "not a reference" unless ref($self);
+	logcroak "too many arguments" unless @_ == 1;	# No @foo in arglist
+	my $fd = fileno($file);
+	logcroak "not a valid file descriptor" unless defined $fd;
+	my $da = $@;				# Don't mess if called from exception handler
+	my $ret;
+	# Call C routine nstore or pstore, depending on network order
+	eval { $ret = &$xsptr($file, $self) };
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	local $\; print $file '';	# Autoflush the file if wanted
+	$@ = $da;
+	return $ret ? $ret : undef;
+}
+
+#
+# freeze
+#
+# Store oject and its hierarchy in memory and return a scalar
+# containing the result.
+#
+sub freeze {
+	_freeze(\&mstore, @_);
+}
+
+#
+# nfreeze
+#
+# Same as freeze but in network order.
+#
+sub nfreeze {
+	_freeze(\&net_mstore, @_);
+}
+
+# Internal freeze routine
+sub _freeze {
+	my $xsptr = shift;
+	my $self = shift;
+	logcroak "not a reference" unless ref($self);
+	logcroak "too many arguments" unless @_ == 0;	# No @foo in arglist
+	my $da = $@;				# Don't mess if called from exception handler
+	my $ret;
+	# Call C routine mstore or net_mstore, depending on network order
+	eval { $ret = &$xsptr($self) };
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	$@ = $da;
+	return $ret ? $ret : undef;
+}
+
+#
+# retrieve
+#
+# Retrieve object hierarchy from disk, returning a reference to the root
+# object of that tree.
+#
+sub retrieve {
+	_retrieve($_[0], 0);
+}
+
+#
+# lock_retrieve
+#
+# Same as retrieve, but with advisory locking.
+#
+sub lock_retrieve {
+	_retrieve($_[0], 1);
+}
+
+# Internal retrieve routine
+sub _retrieve {
+	my ($file, $use_locking) = @_;
+	local *FILE;
+	open(FILE, $file) || logcroak "can't open $file: $!";
+	binmode FILE;							# Archaic systems...
+	my $self;
+	my $da = $@;							# Could be from exception handler
+	if ($use_locking) {
+		unless (&CAN_FLOCK) {
+			logcarp "Storable::lock_store: fcntl/flock emulation broken on $^O";
+			return undef;
+		}
+		flock(FILE, LOCK_SH) || logcroak "can't get shared lock on $file: $!";
+		# Unlocking will happen when FILE is closed
+	}
+	eval { $self = pretrieve(*FILE) };		# Call C routine
+	close(FILE);
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	$@ = $da;
+	return $self;
+}
+
+#
+# fd_retrieve
+#
+# Same as retrieve, but perform from an already opened file descriptor instead.
+#
+sub fd_retrieve {
+	my ($file) = @_;
+	my $fd = fileno($file);
+	logcroak "not a valid file descriptor" unless defined $fd;
+	my $self;
+	my $da = $@;							# Could be from exception handler
+	eval { $self = pretrieve($file) };		# Call C routine
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	$@ = $da;
+	return $self;
+}
+
+#
+# thaw
+#
+# Recreate objects in memory from an existing frozen image created
+# by freeze.  If the frozen image passed is undef, return undef.
+#
+sub thaw {
+	my ($frozen) = @_;
+	return undef unless defined $frozen;
+	my $self;
+	my $da = $@;							# Could be from exception handler
+	eval { $self = mretrieve($frozen) };	# Call C routine
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	$@ = $da;
+	return $self;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Storable - persistence for Perl data structures
+
+=head1 SYNOPSIS
+
+ use Storable;
+ store \%table, 'file';
+ $hashref = retrieve('file');
+
+ use Storable qw(nstore store_fd nstore_fd freeze thaw dclone);
+
+ # Network order
+ nstore \%table, 'file';
+ $hashref = retrieve('file');	# There is NO nretrieve()
+
+ # Storing to and retrieving from an already opened file
+ store_fd \@array, \*STDOUT;
+ nstore_fd \%table, \*STDOUT;
+ $aryref = fd_retrieve(\*SOCKET);
+ $hashref = fd_retrieve(\*SOCKET);
+
+ # Serializing to memory
+ $serialized = freeze \%table;
+ %table_clone = %{ thaw($serialized) };
+
+ # Deep (recursive) cloning
+ $cloneref = dclone($ref);
+
+ # Advisory locking
+ use Storable qw(lock_store lock_nstore lock_retrieve)
+ lock_store \%table, 'file';
+ lock_nstore \%table, 'file';
+ $hashref = lock_retrieve('file');
+
+=head1 DESCRIPTION
+
+The Storable package brings persistence to your Perl data structures
+containing SCALAR, ARRAY, HASH or REF objects, i.e. anything that can be
+conveniently stored to disk and retrieved at a later time.
+
+It can be used in the regular procedural way by calling C<store> with
+a reference to the object to be stored, along with the file name where
+the image should be written.
+
+The routine returns C<undef> for I/O problems or other internal error,
+a true value otherwise. Serious errors are propagated as a C<die> exception.
+
+To retrieve data stored to disk, use C<retrieve> with a file name.
+The objects stored into that file are recreated into memory for you,
+and a I<reference> to the root object is returned. In case an I/O error
+occurs while reading, C<undef> is returned instead. Other serious
+errors are propagated via C<die>.
+
+Since storage is performed recursively, you might want to stuff references
+to objects that share a lot of common data into a single array or hash
+table, and then store that object. That way, when you retrieve back the
+whole thing, the objects will continue to share what they originally shared.
+
+At the cost of a slight header overhead, you may store to an already
+opened file descriptor using the C<store_fd> routine, and retrieve
+from a file via C<fd_retrieve>. Those names aren't imported by default,
+so you will have to do that explicitly if you need those routines.
+The file descriptor you supply must be already opened, for read
+if you're going to retrieve and for write if you wish to store.
+
+	store_fd(\%table, *STDOUT) || die "can't store to stdout\n";
+	$hashref = fd_retrieve(*STDIN);
+
+You can also store data in network order to allow easy sharing across
+multiple platforms, or when storing on a socket known to be remotely
+connected. The routines to call have an initial C<n> prefix for I<network>,
+as in C<nstore> and C<nstore_fd>. At retrieval time, your data will be
+correctly restored so you don't have to know whether you're restoring
+from native or network ordered data.  Double values are stored stringified
+to ensure portability as well, at the slight risk of loosing some precision
+in the last decimals.
+
+When using C<fd_retrieve>, objects are retrieved in sequence, one
+object (i.e. one recursive tree) per associated C<store_fd>.
+
+If you're more from the object-oriented camp, you can inherit from
+Storable and directly store your objects by invoking C<store> as
+a method. The fact that the root of the to-be-stored tree is a
+blessed reference (i.e. an object) is special-cased so that the
+retrieve does not provide a reference to that object but rather the
+blessed object reference itself. (Otherwise, you'd get a reference
+to that blessed object).
+
+=head1 MEMORY STORE
+
+The Storable engine can also store data into a Perl scalar instead, to
+later retrieve them. This is mainly used to freeze a complex structure in
+some safe compact memory place (where it can possibly be sent to another
+process via some IPC, since freezing the structure also serializes it in
+effect). Later on, and maybe somewhere else, you can thaw the Perl scalar
+out and recreate the original complex structure in memory.
+
+Surprisingly, the routines to be called are named C<freeze> and C<thaw>.
+If you wish to send out the frozen scalar to another machine, use
+C<nfreeze> instead to get a portable image.
+
+Note that freezing an object structure and immediately thawing it
+actually achieves a deep cloning of that structure:
+
+    dclone(.) = thaw(freeze(.))
+
+Storable provides you with a C<dclone> interface which does not create
+that intermediary scalar but instead freezes the structure in some
+internal memory space and then immediately thaws it out.
+
+=head1 ADVISORY LOCKING
+
+The C<lock_store> and C<lock_nstore> routine are equivalent to
+C<store> and C<nstore>, except that they get an exclusive lock on
+the file before writing.  Likewise, C<lock_retrieve> does the same
+as C<retrieve>, but also gets a shared lock on the file before reading.
+
+As with any advisory locking scheme, the protection only works if you
+systematically use C<lock_store> and C<lock_retrieve>.  If one side of
+your application uses C<store> whilst the other uses C<lock_retrieve>,
+you will get no protection at all.
+
+The internal advisory locking is implemented using Perl's flock()
+routine.  If your system does not support any form of flock(), or if
+you share your files across NFS, you might wish to use other forms
+of locking by using modules such as LockFile::Simple which lock a
+file using a filesystem entry, instead of locking the file descriptor.
+
+=head1 SPEED
+
+The heart of Storable is written in C for decent speed. Extra low-level
+optimizations have been made when manipulating perl internals, to
+sacrifice encapsulation for the benefit of greater speed.
+
+=head1 CANONICAL REPRESENTATION
+
+Normally, Storable stores elements of hashes in the order they are
+stored internally by Perl, i.e. pseudo-randomly.  If you set
+C<$Storable::canonical> to some C<TRUE> value, Storable will store
+hashes with the elements sorted by their key.  This allows you to
+compare data structures by comparing their frozen representations (or
+even the compressed frozen representations), which can be useful for
+creating lookup tables for complicated queries.
+
+Canonical order does not imply network order; those are two orthogonal
+settings.
+
+=head1 CODE REFERENCES
+
+Since Storable version 2.05, CODE references may be serialized with
+the help of L<B::Deparse>. To enable this feature, set
+C<$Storable::Deparse> to a true value. To enable deserializazion,
+C<$Storable::Eval> should be set to a true value. Be aware that
+deserialization is done through C<eval>, which is dangerous if the
+Storable file contains malicious data. You can set C<$Storable::Eval>
+to a subroutine reference which would be used instead of C<eval>. See
+below for an example using a L<Safe> compartment for deserialization
+of CODE references.
+
+If C<$Storable::Deparse> and/or C<$Storable::Eval> are set to false
+values, then the value of C<$Storable::forgive_me> (see below) is
+respected while serializing and deserializing.
+
+=head1 FORWARD COMPATIBILITY
+
+This release of Storable can be used on a newer version of Perl to
+serialize data which is not supported by earlier Perls.  By default,
+Storable will attempt to do the right thing, by C<croak()>ing if it
+encounters data that it cannot deserialize.  However, the defaults
+can be changed as follows:
+
+=over 4
+
+=item utf8 data
+
+Perl 5.6 added support for Unicode characters with code points > 255,
+and Perl 5.8 has full support for Unicode characters in hash keys.
+Perl internally encodes strings with these characters using utf8, and
+Storable serializes them as utf8.  By default, if an older version of
+Perl encounters a utf8 value it cannot represent, it will C<croak()>.
+To change this behaviour so that Storable deserializes utf8 encoded
+values as the string of bytes (effectively dropping the I<is_utf8> flag)
+set C<$Storable::drop_utf8> to some C<TRUE> value.  This is a form of
+data loss, because with C<$drop_utf8> true, it becomes impossible to tell
+whether the original data was the Unicode string, or a series of bytes
+that happen to be valid utf8.
+
+=item restricted hashes
+
+Perl 5.8 adds support for restricted hashes, which have keys
+restricted to a given set, and can have values locked to be read only.
+By default, when Storable encounters a restricted hash on a perl
+that doesn't support them, it will deserialize it as a normal hash,
+silently discarding any placeholder keys and leaving the keys and
+all values unlocked.  To make Storable C<croak()> instead, set
+C<$Storable::downgrade_restricted> to a C<FALSE> value.  To restore
+the default set it back to some C<TRUE> value.
+
+=item files from future versions of Storable
+
+Earlier versions of Storable would immediately croak if they encountered
+a file with a higher internal version number than the reading Storable
+knew about.  Internal version numbers are increased each time new data
+types (such as restricted hashes) are added to the vocabulary of the file
+format.  This meant that a newer Storable module had no way of writing a
+file readable by an older Storable, even if the writer didn't store newer
+data types.
+
+This version of Storable will defer croaking until it encounters a data
+type in the file that it does not recognize.  This means that it will
+continue to read files generated by newer Storable modules which are careful
+in what they write out, making it easier to upgrade Storable modules in a
+mixed environment.
+
+The old behaviour of immediate croaking can be re-instated by setting
+C<$Storable::accept_future_minor> to some C<FALSE> value.
+
+=back
+
+All these variables have no effect on a newer Perl which supports the
+relevant feature.
+
+=head1 ERROR REPORTING
+
+Storable uses the "exception" paradigm, in that it does not try to workaround
+failures: if something bad happens, an exception is generated from the
+caller's perspective (see L<Carp> and C<croak()>).  Use eval {} to trap
+those exceptions.
+
+When Storable croaks, it tries to report the error via the C<logcroak()>
+routine from the C<Log::Agent> package, if it is available.
+
+Normal errors are reported by having store() or retrieve() return C<undef>.
+Such errors are usually I/O errors (or truncated stream errors at retrieval).
+
+=head1 WIZARDS ONLY
+
+=head2 Hooks
+
+Any class may define hooks that will be called during the serialization
+and deserialization process on objects that are instances of that class.
+Those hooks can redefine the way serialization is performed (and therefore,
+how the symmetrical deserialization should be conducted).
+
+Since we said earlier:
+
+    dclone(.) = thaw(freeze(.))
+
+everything we say about hooks should also hold for deep cloning. However,
+hooks get to know whether the operation is a mere serialization, or a cloning.
+
+Therefore, when serializing hooks are involved,
+
+    dclone(.) <> thaw(freeze(.))
+
+Well, you could keep them in sync, but there's no guarantee it will always
+hold on classes somebody else wrote.  Besides, there is little to gain in
+doing so: a serializing hook could keep only one attribute of an object,
+which is probably not what should happen during a deep cloning of that
+same object.
+
+Here is the hooking interface:
+
+=over 4
+
+=item C<STORABLE_freeze> I<obj>, I<cloning>
+
+The serializing hook, called on the object during serialization.  It can be
+inherited, or defined in the class itself, like any other method.
+
+Arguments: I<obj> is the object to serialize, I<cloning> is a flag indicating
+whether we're in a dclone() or a regular serialization via store() or freeze().
+
+Returned value: A LIST C<($serialized, $ref1, $ref2, ...)> where $serialized
+is the serialized form to be used, and the optional $ref1, $ref2, etc... are
+extra references that you wish to let the Storable engine serialize.
+
+At deserialization time, you will be given back the same LIST, but all the
+extra references will be pointing into the deserialized structure.
+
+The B<first time> the hook is hit in a serialization flow, you may have it
+return an empty list.  That will signal the Storable engine to further
+discard that hook for this class and to therefore revert to the default
+serialization of the underlying Perl data.  The hook will again be normally
+processed in the next serialization.
+
+Unless you know better, serializing hook should always say:
+
+    sub STORABLE_freeze {
+        my ($self, $cloning) = @_;
+        return if $cloning;         # Regular default serialization
+        ....
+    }
+
+in order to keep reasonable dclone() semantics.
+
+=item C<STORABLE_thaw> I<obj>, I<cloning>, I<serialized>, ...
+
+The deserializing hook called on the object during deserialization.
+But wait: if we're deserializing, there's no object yet... right?
+
+Wrong: the Storable engine creates an empty one for you.  If you know Eiffel,
+you can view C<STORABLE_thaw> as an alternate creation routine.
+
+This means the hook can be inherited like any other method, and that
+I<obj> is your blessed reference for this particular instance.
+
+The other arguments should look familiar if you know C<STORABLE_freeze>:
+I<cloning> is true when we're part of a deep clone operation, I<serialized>
+is the serialized string you returned to the engine in C<STORABLE_freeze>,
+and there may be an optional list of references, in the same order you gave
+them at serialization time, pointing to the deserialized objects (which
+have been processed courtesy of the Storable engine).
+
+When the Storable engine does not find any C<STORABLE_thaw> hook routine,
+it tries to load the class by requiring the package dynamically (using
+the blessed package name), and then re-attempts the lookup.  If at that
+time the hook cannot be located, the engine croaks.  Note that this mechanism
+will fail if you define several classes in the same file, but L<perlmod>
+warned you.
+
+It is up to you to use this information to populate I<obj> the way you want.
+
+Returned value: none.
+
+=item C<STORABLE_attach> I<class>, I<cloning>, I<serialized>
+
+While C<STORABLE_freeze> and C<STORABLE_thaw> are useful for classes where
+each instance is independant, this mechanism has difficulty (or is
+incompatible) with objects that exist as common process-level or
+system-level resources, such as singleton objects, database pools, caches
+or memoized objects.
+
+The alternative C<STORABLE_attach> method provides a solution for these
+shared objects. Instead of C<STORABLE_freeze> --E<GT> C<STORABLE_thaw>,
+you implement C<STORABLE_freeze> --E<GT> C<STORABLE_attach> instead.
+
+Arguments: I<class> is the class we are attaching to, I<cloning> is a flag
+indicating whether we're in a dclone() or a regular de-serialization via
+thaw(), and I<serialized> is the stored string for the resource object.
+
+Because these resource objects are considered to be owned by the entire
+process/system, and not the "property" of whatever is being serialized,
+no references underneath the object should be included in the serialized
+string. Thus, in any class that implements C<STORABLE_attach>, the
+C<STORABLE_freeze> method cannot return any references, and C<Storable>
+will throw an error if C<STORABLE_freeze> tries to return references.
+
+All information required to "attach" back to the shared resource object
+B<must> be contained B<only> in the C<STORABLE_freeze> return string.
+Otherwise, C<STORABLE_freeze> behaves as normal for C<STORABLE_attach>
+classes.
+
+Because C<STORABLE_attach> is passed the class (rather than an object),
+it also returns the object directly, rather than modifying the passed
+object.
+
+Returned value: object of type C<class>
+
+=back
+
+=head2 Predicates
+
+Predicates are not exportable.  They must be called by explicitly prefixing
+them with the Storable package name.
+
+=over 4
+
+=item C<Storable::last_op_in_netorder>
+
+The C<Storable::last_op_in_netorder()> predicate will tell you whether
+network order was used in the last store or retrieve operation.  If you
+don't know how to use this, just forget about it.
+
+=item C<Storable::is_storing>
+
+Returns true if within a store operation (via STORABLE_freeze hook).
+
+=item C<Storable::is_retrieving>
+
+Returns true if within a retrieve operation (via STORABLE_thaw hook).
+
+=back
+
+=head2 Recursion
+
+With hooks comes the ability to recurse back to the Storable engine.
+Indeed, hooks are regular Perl code, and Storable is convenient when
+it comes to serializing and deserializing things, so why not use it
+to handle the serialization string?
+
+There are a few things you need to know, however:
+
+=over 4
+
+=item *
+
+You can create endless loops if the things you serialize via freeze()
+(for instance) point back to the object we're trying to serialize in
+the hook.
+
+=item *
+
+Shared references among objects will not stay shared: if we're serializing
+the list of object [A, C] where both object A and C refer to the SAME object
+B, and if there is a serializing hook in A that says freeze(B), then when
+deserializing, we'll get [A', C'] where A' refers to B', but C' refers to D,
+a deep clone of B'.  The topology was not preserved.
+
+=back
+
+That's why C<STORABLE_freeze> lets you provide a list of references
+to serialize.  The engine guarantees that those will be serialized in the
+same context as the other objects, and therefore that shared objects will
+stay shared.
+
+In the above [A, C] example, the C<STORABLE_freeze> hook could return:
+
+	("something", $self->{B})
+
+and the B part would be serialized by the engine.  In C<STORABLE_thaw>, you
+would get back the reference to the B' object, deserialized for you.
+
+Therefore, recursion should normally be avoided, but is nonetheless supported.
+
+=head2 Deep Cloning
+
+There is a Clone module available on CPAN which implements deep cloning
+natively, i.e. without freezing to memory and thawing the result.  It is
+aimed to replace Storable's dclone() some day.  However, it does not currently
+support Storable hooks to redefine the way deep cloning is performed.
+
+=head1 Storable magic
+
+Yes, there's a lot of that :-) But more precisely, in UNIX systems
+there's a utility called C<file>, which recognizes data files based on
+their contents (usually their first few bytes).  For this to work,
+a certain file called F<magic> needs to taught about the I<signature>
+of the data.  Where that configuration file lives depends on the UNIX
+flavour; often it's something like F</usr/share/misc/magic> or
+F</etc/magic>.  Your system administrator needs to do the updating of
+the F<magic> file.  The necessary signature information is output to
+STDOUT by invoking Storable::show_file_magic().  Note that the GNU
+implementation of the C<file> utility, version 3.38 or later,
+is expected to contain support for recognising Storable files
+out-of-the-box, in addition to other kinds of Perl files.
+
+=head1 EXAMPLES
+
+Here are some code samples showing a possible usage of Storable:
+
+	use Storable qw(store retrieve freeze thaw dclone);
+
+	%color = ('Blue' => 0.1, 'Red' => 0.8, 'Black' => 0, 'White' => 1);
+
+	store(\%color, 'mycolors') or die "Can't store %a in mycolors!\n";
+
+	$colref = retrieve('mycolors');
+	die "Unable to retrieve from mycolors!\n" unless defined $colref;
+	printf "Blue is still %lf\n", $colref->{'Blue'};
+
+	$colref2 = dclone(\%color);
+
+	$str = freeze(\%color);
+	printf "Serialization of %%color is %d bytes long.\n", length($str);
+	$colref3 = thaw($str);
+
+which prints (on my machine):
+
+	Blue is still 0.100000
+	Serialization of %color is 102 bytes long.
+
+Serialization of CODE references and deserialization in a safe
+compartment:
+
+=for example begin
+
+	use Storable qw(freeze thaw);
+	use Safe;
+	use strict;
+	my $safe = new Safe;
+        # because of opcodes used in "use strict":
+	$safe->permit(qw(:default require));
+	local $Storable::Deparse = 1;
+	local $Storable::Eval = sub { $safe->reval($_[0]) };
+	my $serialized = freeze(sub { 42 });
+	my $code = thaw($serialized);
+	$code->() == 42;
+
+=for example end
+
+=for example_testing
+        is( $code->(), 42 );
+
+=head1 WARNING
+
+If you're using references as keys within your hash tables, you're bound
+to be disappointed when retrieving your data. Indeed, Perl stringifies
+references used as hash table keys. If you later wish to access the
+items via another reference stringification (i.e. using the same
+reference that was used for the key originally to record the value into
+the hash table), it will work because both references stringify to the
+same string.
+
+It won't work across a sequence of C<store> and C<retrieve> operations,
+however, because the addresses in the retrieved objects, which are
+part of the stringified references, will probably differ from the
+original addresses. The topology of your structure is preserved,
+but not hidden semantics like those.
+
+On platforms where it matters, be sure to call C<binmode()> on the
+descriptors that you pass to Storable functions.
+
+Storing data canonically that contains large hashes can be
+significantly slower than storing the same data normally, as
+temporary arrays to hold the keys for each hash have to be allocated,
+populated, sorted and freed.  Some tests have shown a halving of the
+speed of storing -- the exact penalty will depend on the complexity of
+your data.  There is no slowdown on retrieval.
+
+=head1 BUGS
+
+You can't store GLOB, FORMLINE, etc.... If you can define semantics
+for those operations, feel free to enhance Storable so that it can
+deal with them.
+
+The store functions will C<croak> if they run into such references
+unless you set C<$Storable::forgive_me> to some C<TRUE> value. In that
+case, the fatal message is turned in a warning and some
+meaningless string is stored instead.
+
+Setting C<$Storable::canonical> may not yield frozen strings that
+compare equal due to possible stringification of numbers. When the
+string version of a scalar exists, it is the form stored; therefore,
+if you happen to use your numbers as strings between two freezing
+operations on the same data structures, you will get different
+results.
+
+When storing doubles in network order, their value is stored as text.
+However, you should also not expect non-numeric floating-point values
+such as infinity and "not a number" to pass successfully through a
+nstore()/retrieve() pair.
+
+As Storable neither knows nor cares about character sets (although it
+does know that characters may be more than eight bits wide), any difference
+in the interpretation of character codes between a host and a target
+system is your problem.  In particular, if host and target use different
+code points to represent the characters used in the text representation
+of floating-point numbers, you will not be able be able to exchange
+floating-point data, even with nstore().
+
+C<Storable::drop_utf8> is a blunt tool.  There is no facility either to
+return B<all> strings as utf8 sequences, or to attempt to convert utf8
+data back to 8 bit and C<croak()> if the conversion fails.
+
+Prior to Storable 2.01, no distinction was made between signed and
+unsigned integers on storing.  By default Storable prefers to store a
+scalars string representation (if it has one) so this would only cause
+problems when storing large unsigned integers that had never been coverted
+to string or floating point.  In other words values that had been generated
+by integer operations such as logic ops and then not used in any string or
+arithmetic context before storing.
+
+=head2 64 bit data in perl 5.6.0 and 5.6.1
+
+This section only applies to you if you have existing data written out
+by Storable 2.02 or earlier on perl 5.6.0 or 5.6.1 on Unix or Linux which
+has been configured with 64 bit integer support (not the default)
+If you got a precompiled perl, rather than running Configure to build
+your own perl from source, then it almost certainly does not affect you,
+and you can stop reading now (unless you're curious). If you're using perl
+on Windows it does not affect you.
+
+Storable writes a file header which contains the sizes of various C
+language types for the C compiler that built Storable (when not writing in
+network order), and will refuse to load files written by a Storable not
+on the same (or compatible) architecture.  This check and a check on
+machine byteorder is needed because the size of various fields in the file
+are given by the sizes of the C language types, and so files written on
+different architectures are incompatible.  This is done for increased speed.
+(When writing in network order, all fields are written out as standard
+lengths, which allows full interworking, but takes longer to read and write)
+
+Perl 5.6.x introduced the ability to optional configure the perl interpreter
+to use C's C<long long> type to allow scalars to store 64 bit integers on 32
+bit systems.  However, due to the way the Perl configuration system
+generated the C configuration files on non-Windows platforms, and the way
+Storable generates its header, nothing in the Storable file header reflected
+whether the perl writing was using 32 or 64 bit integers, despite the fact
+that Storable was storing some data differently in the file.  Hence Storable
+running on perl with 64 bit integers will read the header from a file
+written by a 32 bit perl, not realise that the data is actually in a subtly
+incompatible format, and then go horribly wrong (possibly crashing) if it
+encountered a stored integer.  This is a design failure.
+
+Storable has now been changed to write out and read in a file header with
+information about the size of integers.  It's impossible to detect whether
+an old file being read in was written with 32 or 64 bit integers (they have
+the same header) so it's impossible to automatically switch to a correct
+backwards compatibility mode.  Hence this Storable defaults to the new,
+correct behaviour.
+
+What this means is that if you have data written by Storable 1.x running
+on perl 5.6.0 or 5.6.1 configured with 64 bit integers on Unix or Linux
+then by default this Storable will refuse to read it, giving the error
+I<Byte order is not compatible>.  If you have such data then you you
+should set C<$Storable::interwork_56_64bit> to a true value to make this
+Storable read and write files with the old header.  You should also
+migrate your data, or any older perl you are communicating with, to this
+current version of Storable.
+
+If you don't have data written with specific configuration of perl described
+above, then you do not and should not do anything.  Don't set the flag -
+not only will Storable on an identically configured perl refuse to load them,
+but Storable a differently configured perl will load them believing them
+to be correct for it, and then may well fail or crash part way through
+reading them.
+
+=head1 CREDITS
+
+Thank you to (in chronological order):
+
+	Jarkko Hietaniemi <jhi@iki.fi>
+	Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
+	Benjamin A. Holzman <bah@ecnvantage.com>
+	Andrew Ford <A.Ford@ford-mason.co.uk>
+	Gisle Aas <gisle@aas.no>
+	Jeff Gresham <gresham_jeffrey@jpmorgan.com>
+	Murray Nesbitt <murray@activestate.com>
+	Marc Lehmann <pcg@opengroup.org>
+	Justin Banks <justinb@wamnet.com>
+	Jarkko Hietaniemi <jhi@iki.fi> (AGAIN, as perl 5.7.0 Pumpkin!)
+	Salvador Ortiz Garcia <sog@msg.com.mx>
+	Dominic Dunlop <domo@computer.org>
+	Erik Haugan <erik@solbors.no>
+
+for their bug reports, suggestions and contributions.
+
+Benjamin Holzman contributed the tied variable support, Andrew Ford
+contributed the canonical order for hashes, and Gisle Aas fixed
+a few misunderstandings of mine regarding the perl internals,
+and optimized the emission of "tags" in the output streams by
+simply counting the objects instead of tagging them (leading to
+a binary incompatibility for the Storable image starting at version
+0.6--older images are, of course, still properly understood).
+Murray Nesbitt made Storable thread-safe.  Marc Lehmann added overloading
+and references to tied items support.
+
+=head1 AUTHOR
+
+Storable was written by Raphael Manfredi F<E<lt>Raphael_Manfredi@pobox.comE<gt>>
+Maintenance is now done by the perl5-porters F<E<lt>perl5-porters@perl.orgE<gt>>
+
+Please e-mail us with problems, bug fixes, comments and complaints,
+although if you have complements you should send them to Raphael.
+Please don't e-mail Raphael with problems, as he no longer works on
+Storable, and your message will be delayed while he forwards it to us.
+
+=head1 SEE ALSO
+
+L<Clone>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Switch.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Switch.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Switch.pm	(revision 14489)
@@ -0,0 +1,879 @@
+package Switch;
+
+use strict;
+use vars qw($VERSION);
+use Carp;
+
+$VERSION = '2.10_01';
+
+
+# LOAD FILTERING MODULE...
+use Filter::Util::Call;
+
+sub __();
+
+# CATCH ATTEMPTS TO CALL case OUTSIDE THE SCOPE OF ANY switch
+
+$::_S_W_I_T_C_H = sub { croak "case/when statement not in switch/given block" };
+
+my $offset;
+my $fallthrough;
+my ($Perl5, $Perl6) = (0,0);
+
+sub import
+{
+	$fallthrough = grep /\bfallthrough\b/, @_;
+	$offset = (caller)[2]+1;
+	filter_add({}) unless @_>1 && $_[1] eq 'noimport';
+	my $pkg = caller;
+	no strict 'refs';
+	for ( qw( on_defined on_exists ) )
+	{
+		*{"${pkg}::$_"} = \&$_;
+	}
+	*{"${pkg}::__"} = \&__ if grep /__/, @_;
+	$Perl6 = 1 if grep(/Perl\s*6/i, @_);
+	$Perl5 = 1 if grep(/Perl\s*5/i, @_) || !grep(/Perl\s*6/i, @_);
+	1;
+}
+
+sub unimport
+{	
+	filter_del()
+}
+
+sub filter
+{
+	my($self) = @_ ;
+	local $Switch::file = (caller)[1];
+
+	my $status = 1;
+	$status = filter_read(1_000_000);
+	return $status if $status<0;
+    	$_ = filter_blocks($_,$offset);
+	$_ = "# line $offset\n" . $_ if $offset; undef $offset;
+	return $status;
+}
+
+use Text::Balanced ':ALL';
+
+sub line
+{
+	my ($pretext,$offset) = @_;
+	($pretext=~tr/\n/\n/)+($offset||0);
+}
+
+sub is_block
+{
+	local $SIG{__WARN__}=sub{die$@};
+	local $^W=1;
+	my $ishash = defined  eval 'my $hr='.$_[0];
+	undef $@;
+	return !$ishash;
+}
+
+
+my $EOP = qr/\n\n|\Z/;
+my $CUT = qr/\n=cut.*$EOP/;
+my $pod_or_DATA = qr/ ^=(?:head[1-4]|item) .*? $CUT
+                    | ^=pod .*? $CUT
+                    | ^=for .*? $EOP
+                    | ^=begin \s* (\S+) .*? \n=end \s* \1 .*? $EOP
+                    | ^__(DATA|END)__\n.*
+                    /smx;
+
+my $casecounter = 1;
+sub filter_blocks
+{
+	my ($source, $line) = @_;
+	return $source unless $Perl5 && $source =~ /case|switch/
+			   || $Perl6 && $source =~ /when|given|default/;
+	pos $source = 0;
+	my $text = "";
+	component: while (pos $source < length $source)
+	{
+		if ($source =~ m/(\G\s*use\s+Switch\b)/gc)
+		{
+			$text .= q{use Switch 'noimport'};
+			next component;
+		}
+		my @pos = Text::Balanced::_match_quotelike(\$source,qr/\s*/,1,0);
+		if (defined $pos[0])
+		{
+			my $pre = substr($source,$pos[0],$pos[1]); # matched prefix
+			$text .= $pre . substr($source,$pos[2],$pos[18]-$pos[2]);
+			next component;
+		}
+		if ($source =~ m/\G\s*($pod_or_DATA)/gc) {
+			next component;
+		}
+		@pos = Text::Balanced::_match_variable(\$source,qr/\s*/);
+		if (defined $pos[0])
+		{
+			$text .= " " if $pos[0] < $pos[2];
+			$text .= substr($source,$pos[0],$pos[4]-$pos[0]);
+			next component;
+		}
+
+		if ($Perl5 && $source =~ m/\G(\n*)(\s*)(switch)\b(?=\s*[(])/gc
+		 || $Perl6 && $source =~ m/\G(\n*)(\s*)(given)\b(?=\s*[(])/gc
+		 || $Perl6 && $source =~ m/\G(\n*)(\s*)(given)\b(.*)(?=\{)/gc)
+		{
+			my $keyword = $3;
+			my $arg = $4;
+			$text .= $1.$2.'S_W_I_T_C_H: while (1) ';
+			unless ($arg) {
+				@pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/\(/,qr/\)/,qr/[[{(<]/,qr/[]})>]/,undef) 
+				or do {
+					die "Bad $keyword statement (problem in the parentheses?) near $Switch::file line ", line(substr($source,0,pos $source),$line), "\n";
+				};
+				$arg = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
+			}
+			$arg =~ s {^\s*[(]\s*%}   { ( \\\%}	||
+			$arg =~ s {^\s*[(]\s*m\b} { ( qr}	||
+			$arg =~ s {^\s*[(]\s*/}   { ( qr/}	||
+			$arg =~ s {^\s*[(]\s*qw}  { ( \\qw};
+			@pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/\{/,qr/\}/,qr/\{/,qr/\}/,undef)
+			or do {
+				die "Bad $keyword statement (problem in the code block?) near $Switch::file line ", line(substr($source,0, pos $source), $line), "\n";
+			};
+			my $code = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
+			$code =~ s/{/{ local \$::_S_W_I_T_C_H; Switch::switch $arg;/;
+			$text .= $code . 'continue {last}';
+			next component;
+		}
+		elsif ($Perl5 && $source =~ m/\G(\s*)(case\b)(?!\s*=>)/gc
+		    || $Perl6 && $source =~ m/\G(\s*)(when\b)(?!\s*=>)/gc
+		    || $Perl6 && $source =~ m/\G(\s*)(default\b)(?=\s*\{)/gc)
+		{
+			my $keyword = $2;
+			$text .= $1 . ($keyword eq "default"
+					? "if (1)"
+					: "if (Switch::case");
+
+			if ($keyword eq "default") {
+				# Nothing to do
+			}
+			elsif (@pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/\{/,qr/\}/,qr/\{/,qr/\}/,undef)) {
+				my $code = substr($source,$pos[0],$pos[4]-$pos[0]);
+				$text .= " " if $pos[0] < $pos[2];
+				$text .= "sub " if is_block $code;
+				$text .= filter_blocks($code,line(substr($source,0,$pos[0]),$line)) . ")";
+			}
+			elsif (@pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/[[(]/,qr/[])]/,qr/[[({]/,qr/[])}]/,undef)) {
+				my $code = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
+				$code =~ s {^\s*[(]\s*%}   { ( \\\%}	||
+				$code =~ s {^\s*[(]\s*m\b} { ( qr}	||
+				$code =~ s {^\s*[(]\s*/}   { ( qr/}	||
+				$code =~ s {^\s*[(]\s*qw}  { ( \\qw};
+				$text .= " " if $pos[0] < $pos[2];
+				$text .= "$code)";
+			}
+			elsif ($Perl6 && do{@pos = Text::Balanced::_match_variable(\$source,qr/\s*/)}) {
+				my $code = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
+				$code =~ s {^\s*%}  { \%}	||
+				$code =~ s {^\s*@}  { \@};
+				$text .= " " if $pos[0] < $pos[2];
+				$text .= "$code)";
+			}
+			elsif ( @pos = Text::Balanced::_match_quotelike(\$source,qr/\s*/,1,0)) {
+				my $code = substr($source,$pos[2],$pos[18]-$pos[2]);
+				$code = filter_blocks($code,line(substr($source,0,$pos[2]),$line));
+				$code =~ s {^\s*m}  { qr}	||
+				$code =~ s {^\s*/}  { qr/}	||
+				$code =~ s {^\s*qw} { \\qw};
+				$text .= " " if $pos[0] < $pos[2];
+				$text .= "$code)";
+			}
+			elsif ($Perl5 && $source =~ m/\G\s*(([^\$\@{])[^\$\@{]*)(?=\s*{)/gc
+			   ||  $Perl6 && $source =~ m/\G\s*([^;{]*)()/gc) {
+				my $code = filter_blocks($1,line(substr($source,0,pos $source),$line));
+				$text .= ' \\' if $2 eq '%';
+				$text .= " $code)";
+			}
+			else {
+				die "Bad $keyword statement (invalid $keyword value?) near $Switch::file line ", line(substr($source,0,pos $source), $line), "\n";
+			}
+
+		        die "Missing opening brace or semi-colon after 'when' value near $Switch::file line ", line(substr($source,0,pos $source), $line), "\n"
+				unless !$Perl6 || $source =~ m/\G(\s*)(?=;|\{)/gc;
+
+			do{@pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/\{/,qr/\}/,qr/\{/,qr/\}/,undef)}
+			or do {
+				if ($source =~ m/\G\s*(?=([};]|\Z))/gc) {
+					$casecounter++;
+					next component;
+				}
+				die "Bad $keyword statement (problem in the code block?) near $Switch::file line ", line(substr($source,0,pos $source),$line), "\n";
+			};
+			my $code = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
+			$code =~ s/}(?=\s*\Z)/;last S_W_I_T_C_H }/
+				unless $fallthrough;
+			$text .= "{ while (1) $code continue { goto C_A_S_E_$casecounter } last S_W_I_T_C_H; C_A_S_E_$casecounter: }";
+			$casecounter++;
+			next component;
+		}
+
+		$source =~ m/\G(\s*(-[sm]\s+|\w+|#.*\n|\W))/gc;
+		$text .= $1;
+	}
+	$text;
+}
+
+
+
+sub in
+{
+	my ($x,$y) = @_;
+	my @numy;
+	for my $nextx ( @$x )
+	{
+		my $numx = ref($nextx) || defined $nextx && (~$nextx&$nextx) eq 0;
+		for my $j ( 0..$#$y )
+		{
+			my $nexty = $y->[$j];
+			push @numy, ref($nexty) || defined $nexty && (~$nexty&$nexty) eq 0
+				if @numy <= $j;
+			return 1 if $numx && $numy[$j] && $nextx==$nexty
+			         || $nextx eq $nexty;
+			
+		}
+	}
+	return "";
+}
+
+sub on_exists
+{
+	my $ref = @_==1 && ref($_[0]) eq 'HASH' ? $_[0] : { @_ };
+	[ keys %$ref ]
+}
+
+sub on_defined
+{
+	my $ref = @_==1 && ref($_[0]) eq 'HASH' ? $_[0] : { @_ };
+	[ grep { defined $ref->{$_} } keys %$ref ]
+}
+
+sub switch(;$)
+{
+	my ($s_val) = @_ ? $_[0] : $_;
+	my $s_ref = ref $s_val;
+	
+	if ($s_ref eq 'CODE')
+	{
+		$::_S_W_I_T_C_H =
+		      sub { my $c_val = $_[0];
+			    return $s_val == $c_val  if ref $c_val eq 'CODE';
+			    return $s_val->(@$c_val) if ref $c_val eq 'ARRAY';
+			    return $s_val->($c_val);
+			  };
+	}
+	elsif ($s_ref eq "" && defined $s_val && (~$s_val&$s_val) eq 0)	# NUMERIC SCALAR
+	{
+		$::_S_W_I_T_C_H =
+		      sub { my $c_val = $_[0];
+			    my $c_ref = ref $c_val;
+			    return $s_val == $c_val 	if $c_ref eq ""
+							&& defined $c_val
+							&& (~$c_val&$c_val) eq 0;
+			    return $s_val eq $c_val 	if $c_ref eq "";
+			    return in([$s_val],$c_val)	if $c_ref eq 'ARRAY';
+			    return $c_val->($s_val)	if $c_ref eq 'CODE';
+			    return $c_val->call($s_val)	if $c_ref eq 'Switch';
+			    return scalar $s_val=~/$c_val/
+							if $c_ref eq 'Regexp';
+			    return scalar $c_val->{$s_val}
+							if $c_ref eq 'HASH';
+		            return;	
+			  };
+	}
+	elsif ($s_ref eq "")				# STRING SCALAR
+	{
+		$::_S_W_I_T_C_H =
+		      sub { my $c_val = $_[0];
+			    my $c_ref = ref $c_val;
+			    return $s_val eq $c_val 	if $c_ref eq "";
+			    return in([$s_val],$c_val)	if $c_ref eq 'ARRAY';
+			    return $c_val->($s_val)	if $c_ref eq 'CODE';
+			    return $c_val->call($s_val)	if $c_ref eq 'Switch';
+			    return scalar $s_val=~/$c_val/
+							if $c_ref eq 'Regexp';
+			    return scalar $c_val->{$s_val}
+							if $c_ref eq 'HASH';
+		            return;	
+			  };
+	}
+	elsif ($s_ref eq 'ARRAY')
+	{
+		$::_S_W_I_T_C_H =
+		      sub { my $c_val = $_[0];
+			    my $c_ref = ref $c_val;
+			    return in($s_val,[$c_val]) 	if $c_ref eq "";
+			    return in($s_val,$c_val)	if $c_ref eq 'ARRAY';
+			    return $c_val->(@$s_val)	if $c_ref eq 'CODE';
+			    return $c_val->call(@$s_val)
+							if $c_ref eq 'Switch';
+			    return scalar grep {$_=~/$c_val/} @$s_val
+							if $c_ref eq 'Regexp';
+			    return scalar grep {$c_val->{$_}} @$s_val
+							if $c_ref eq 'HASH';
+		            return;	
+			  };
+	}
+	elsif ($s_ref eq 'Regexp')
+	{
+		$::_S_W_I_T_C_H =
+		      sub { my $c_val = $_[0];
+			    my $c_ref = ref $c_val;
+			    return $c_val=~/s_val/ 	if $c_ref eq "";
+			    return scalar grep {$_=~/s_val/} @$c_val
+							if $c_ref eq 'ARRAY';
+			    return $c_val->($s_val)	if $c_ref eq 'CODE';
+			    return $c_val->call($s_val)	if $c_ref eq 'Switch';
+			    return $s_val eq $c_val	if $c_ref eq 'Regexp';
+			    return grep {$_=~/$s_val/ && $c_val->{$_}} keys %$c_val
+							if $c_ref eq 'HASH';
+		            return;	
+			  };
+	}
+	elsif ($s_ref eq 'HASH')
+	{
+		$::_S_W_I_T_C_H =
+		      sub { my $c_val = $_[0];
+			    my $c_ref = ref $c_val;
+			    return $s_val->{$c_val} 	if $c_ref eq "";
+			    return scalar grep {$s_val->{$_}} @$c_val
+							if $c_ref eq 'ARRAY';
+			    return $c_val->($s_val)	if $c_ref eq 'CODE';
+			    return $c_val->call($s_val)	if $c_ref eq 'Switch';
+			    return grep {$_=~/$c_val/ && $s_val->{"$_"}} keys %$s_val
+							if $c_ref eq 'Regexp';
+			    return $s_val==$c_val	if $c_ref eq 'HASH';
+		            return;	
+			  };
+	}
+	elsif ($s_ref eq 'Switch')
+	{
+		$::_S_W_I_T_C_H =
+		      sub { my $c_val = $_[0];
+			    return $s_val == $c_val  if ref $c_val eq 'Switch';
+			    return $s_val->call(@$c_val)
+						     if ref $c_val eq 'ARRAY';
+			    return $s_val->call($c_val);
+			  };
+	}
+	else
+	{
+		croak "Cannot switch on $s_ref";
+	}
+	return 1;
+}
+
+sub case($) { local $SIG{__WARN__} = \&carp;
+	      $::_S_W_I_T_C_H->(@_); }
+
+# IMPLEMENT __
+
+my $placeholder = bless { arity=>1, impl=>sub{$_[1+$_[0]]} };
+
+sub __() { $placeholder }
+
+sub __arg($)
+{
+	my $index = $_[0]+1;
+	bless { arity=>0, impl=>sub{$_[$index]} };
+}
+
+sub hosub(&@)
+{
+	# WRITE THIS
+}
+
+sub call
+{
+	my ($self,@args) = @_;
+	return $self->{impl}->(0,@args);
+}
+
+sub meta_bop(&)
+{
+	my ($op) = @_;
+	sub
+	{
+		my ($left, $right, $reversed) = @_;
+		($right,$left) = @_ if $reversed;
+
+		my $rop = ref $right eq 'Switch'
+			? $right
+			: bless { arity=>0, impl=>sub{$right} };
+
+		my $lop = ref $left eq 'Switch'
+			? $left
+			: bless { arity=>0, impl=>sub{$left} };
+
+		my $arity = $lop->{arity} + $rop->{arity};
+
+		return bless {
+				arity => $arity,
+				impl  => sub { my $start = shift;
+					       return $op->($lop->{impl}->($start,@_),
+						            $rop->{impl}->($start+$lop->{arity},@_));
+					     }
+			     };
+	};
+}
+
+sub meta_uop(&)
+{
+	my ($op) = @_;
+	sub
+	{
+		my ($left) = @_;
+
+		my $lop = ref $left eq 'Switch'
+			? $left
+			: bless { arity=>0, impl=>sub{$left} };
+
+		my $arity = $lop->{arity};
+
+		return bless {
+				arity => $arity,
+				impl  => sub { $op->($lop->{impl}->(@_)) }
+			     };
+	};
+}
+
+
+use overload
+	"+"	=> 	meta_bop {$_[0] + $_[1]},
+	"-"	=> 	meta_bop {$_[0] - $_[1]},  
+	"*"	=>  	meta_bop {$_[0] * $_[1]},
+	"/"	=>  	meta_bop {$_[0] / $_[1]},
+	"%"	=>  	meta_bop {$_[0] % $_[1]},
+	"**"	=>  	meta_bop {$_[0] ** $_[1]},
+	"<<"	=>  	meta_bop {$_[0] << $_[1]},
+	">>"	=>  	meta_bop {$_[0] >> $_[1]},
+	"x"	=>  	meta_bop {$_[0] x $_[1]},
+	"."	=>  	meta_bop {$_[0] . $_[1]},
+	"<"	=>  	meta_bop {$_[0] < $_[1]},
+	"<="	=>  	meta_bop {$_[0] <= $_[1]},
+	">"	=>  	meta_bop {$_[0] > $_[1]},
+	">="	=>  	meta_bop {$_[0] >= $_[1]},
+	"=="	=>  	meta_bop {$_[0] == $_[1]},
+	"!="	=>  	meta_bop {$_[0] != $_[1]},
+	"<=>"	=>  	meta_bop {$_[0] <=> $_[1]},
+	"lt"	=>  	meta_bop {$_[0] lt $_[1]},
+	"le"	=> 	meta_bop {$_[0] le $_[1]},
+	"gt"	=> 	meta_bop {$_[0] gt $_[1]},
+	"ge"	=> 	meta_bop {$_[0] ge $_[1]},
+	"eq"	=> 	meta_bop {$_[0] eq $_[1]},
+	"ne"	=> 	meta_bop {$_[0] ne $_[1]},
+	"cmp"	=> 	meta_bop {$_[0] cmp $_[1]},
+	"\&"	=> 	meta_bop {$_[0] & $_[1]},
+	"^"	=> 	meta_bop {$_[0] ^ $_[1]},
+	"|"	=>	meta_bop {$_[0] | $_[1]},
+	"atan2"	=>	meta_bop {atan2 $_[0], $_[1]},
+
+	"neg"	=>	meta_uop {-$_[0]},
+	"!"	=>	meta_uop {!$_[0]},
+	"~"	=>	meta_uop {~$_[0]},
+	"cos"	=>	meta_uop {cos $_[0]},
+	"sin"	=>	meta_uop {sin $_[0]},
+	"exp"	=>	meta_uop {exp $_[0]},
+	"abs"	=>	meta_uop {abs $_[0]},
+	"log"	=>	meta_uop {log $_[0]},
+	"sqrt"  =>	meta_uop {sqrt $_[0]},
+	"bool"  =>	sub { croak "Can't use && or || in expression containing __" },
+
+	#	"&()"	=>	sub { $_[0]->{impl} },
+
+	#	"||"	=>	meta_bop {$_[0] || $_[1]},
+	#	"&&"	=>	meta_bop {$_[0] && $_[1]},
+	# fallback => 1,
+	;
+1;
+
+__END__
+
+
+=head1 NAME
+
+Switch - A switch statement for Perl
+
+=head1 VERSION
+
+This document describes version 2.10 of Switch,
+released Dec 29, 2003.
+
+=head1 SYNOPSIS
+
+	use Switch;
+
+	switch ($val) {
+
+		case 1		{ print "number 1" }
+		case "a"	{ print "string a" }
+		case [1..10,42]	{ print "number in list" }
+		case (@array)	{ print "number in list" }
+		case /\w+/	{ print "pattern" }
+		case qr/\w+/	{ print "pattern" }
+		case (%hash)	{ print "entry in hash" }
+		case (\%hash)	{ print "entry in hash" }
+		case (\&sub)	{ print "arg to subroutine" }
+		else		{ print "previous case not true" }
+	}
+
+=head1 BACKGROUND
+
+[Skip ahead to L<"DESCRIPTION"> if you don't care about the whys
+and wherefores of this control structure]
+
+In seeking to devise a "Swiss Army" case mechanism suitable for Perl,
+it is useful to generalize this notion of distributed conditional
+testing as far as possible. Specifically, the concept of "matching"
+between the switch value and the various case values need not be
+restricted to numeric (or string or referential) equality, as it is in other 
+languages. Indeed, as Table 1 illustrates, Perl
+offers at least eighteen different ways in which two values could
+generate a match.
+
+	Table 1: Matching a switch value ($s) with a case value ($c)
+
+        Switch  Case    Type of Match Implied   Matching Code
+        Value   Value   
+        ======  =====   =====================   =============
+
+        number  same    numeric or referential  match if $s == $c;
+        or ref          equality
+
+	object  method	result of method call   match if $s->$c();
+	ref     name 				match if defined $s->$c();
+		or ref
+
+        other   other   string equality         match if $s eq $c;
+        non-ref non-ref
+        scalar  scalar
+
+        string  regexp  pattern match           match if $s =~ /$c/;
+
+        array   scalar  array entry existence   match if 0<=$c && $c<@$s;
+        ref             array entry definition  match if defined $s->[$c];
+                        array entry truth       match if $s->[$c];
+
+        array   array   array intersection      match if intersects(@$s, @$c);
+        ref     ref     (apply this table to
+                         all pairs of elements
+                         $s->[$i] and
+                         $c->[$j])
+
+        array   regexp  array grep              match if grep /$c/, @$s;
+        ref     
+
+        hash    scalar  hash entry existence    match if exists $s->{$c};
+        ref             hash entry definition   match if defined $s->{$c};
+                        hash entry truth        match if $s->{$c};
+
+        hash    regexp  hash grep               match if grep /$c/, keys %$s;
+        ref     
+
+        sub     scalar  return value defn       match if defined $s->($c);
+        ref             return value truth      match if $s->($c);
+
+        sub     array   return value defn       match if defined $s->(@$c);
+        ref     ref     return value truth      match if $s->(@$c);
+
+
+In reality, Table 1 covers 31 alternatives, because only the equality and
+intersection tests are commutative; in all other cases, the roles of
+the C<$s> and C<$c> variables could be reversed to produce a
+different test. For example, instead of testing a single hash for
+the existence of a series of keys (C<match if exists $s-E<gt>{$c}>),
+one could test for the existence of a single key in a series of hashes
+(C<match if exists $c-E<gt>{$s}>).
+
+As L<perltodo> observes, a Perl case mechanism must support all these
+"ways to do it".
+
+
+=head1 DESCRIPTION
+
+The Switch.pm module implements a generalized case mechanism that covers
+the numerous possible combinations of switch and case values described above.
+
+The module augments the standard Perl syntax with two new control
+statements: C<switch> and C<case>. The C<switch> statement takes a
+single scalar argument of any type, specified in parentheses.
+C<switch> stores this value as the
+current switch value in a (localized) control variable.
+The value is followed by a block which may contain one or more
+Perl statements (including the C<case> statement described below).
+The block is unconditionally executed once the switch value has
+been cached.
+
+A C<case> statement takes a single scalar argument (in mandatory
+parentheses if it's a variable; otherwise the parens are optional) and
+selects the appropriate type of matching between that argument and the
+current switch value. The type of matching used is determined by the
+respective types of the switch value and the C<case> argument, as
+specified in Table 1. If the match is successful, the mandatory
+block associated with the C<case> statement is executed.
+
+In most other respects, the C<case> statement is semantically identical
+to an C<if> statement. For example, it can be followed by an C<else>
+clause, and can be used as a postfix statement qualifier. 
+
+However, when a C<case> block has been executed control is automatically
+transferred to the statement after the immediately enclosing C<switch>
+block, rather than to the next statement within the block. In other
+words, the success of any C<case> statement prevents other cases in the
+same scope from executing. But see L<"Allowing fall-through"> below.
+
+Together these two new statements provide a fully generalized case
+mechanism:
+
+        use Switch;
+
+        # AND LATER...
+
+        %special = ( woohoo => 1,  d'oh => 1 );
+
+        while (<>) {
+            switch ($_) {
+
+                case (%special) { print "homer\n"; }      # if $special{$_}
+                case /a-z/i     { print "alpha\n"; }      # if $_ =~ /a-z/i
+                case [1..9]     { print "small num\n"; }  # if $_ in [1..9]
+
+                case { $_[0] >= 10 } {                    # if $_ >= 10
+                    my $age = <>;
+                    switch (sub{ $_[0] < $age } ) {
+
+                        case 20  { print "teens\n"; }     # if 20 < $age
+                        case 30  { print "twenties\n"; }  # if 30 < $age
+                        else     { print "history\n"; }
+                    }
+                }
+
+                print "must be punctuation\n" case /\W/;  # if $_ ~= /\W/
+        }
+
+Note that C<switch>es can be nested within C<case> (or any other) blocks,
+and a series of C<case> statements can try different types of matches
+-- hash membership, pattern match, array intersection, simple equality,
+etc. -- against the same switch value.
+
+The use of intersection tests against an array reference is particularly
+useful for aggregating integral cases:
+
+        sub classify_digit
+        {
+                switch ($_[0]) { case 0            { return 'zero' }
+                                 case [2,4,6,8]    { return 'even' }
+                                 case [1,3,4,7,9]  { return 'odd' }
+                                 case /[A-F]/i     { return 'hex' }
+                               }
+        }
+
+
+=head2 Allowing fall-through
+
+Fall-though (trying another case after one has already succeeded)
+is usually a Bad Idea in a switch statement. However, this
+is Perl, not a police state, so there I<is> a way to do it, if you must.
+
+If a C<case> block executes an untargeted C<next>, control is
+immediately transferred to the statement I<after> the C<case> statement
+(i.e. usually another case), rather than out of the surrounding
+C<switch> block.
+
+For example:
+
+        switch ($val) {
+                case 1      { handle_num_1(); next }    # and try next case...
+                case "1"    { handle_str_1(); next }    # and try next case...
+                case [0..9] { handle_num_any(); }       # and we're done
+                case /\d/   { handle_dig_any(); next }  # and try next case...
+                case /.*/   { handle_str_any(); next }  # and try next case...
+        }
+
+If $val held the number C<1>, the above C<switch> block would call the
+first three C<handle_...> subroutines, jumping to the next case test
+each time it encountered a C<next>. After the thrid C<case> block
+was executed, control would jump to the end of the enclosing
+C<switch> block.
+
+On the other hand, if $val held C<10>, then only the last two C<handle_...>
+subroutines would be called.
+
+Note that this mechanism allows the notion of I<conditional fall-through>.
+For example:
+
+        switch ($val) {
+                case [0..9] { handle_num_any(); next if $val < 7; }
+                case /\d/   { handle_dig_any(); }
+        }
+
+If an untargeted C<last> statement is executed in a case block, this
+immediately transfers control out of the enclosing C<switch> block
+(in other words, there is an implicit C<last> at the end of each
+normal C<case> block). Thus the previous example could also have been
+written:
+
+        switch ($val) {
+                case [0..9] { handle_num_any(); last if $val >= 7; next; }
+                case /\d/   { handle_dig_any(); }
+        }
+
+
+=head2 Automating fall-through
+
+In situations where case fall-through should be the norm, rather than an
+exception, an endless succession of terminal C<next>s is tedious and ugly.
+Hence, it is possible to reverse the default behaviour by specifying
+the string "fallthrough" when importing the module. For example, the 
+following code is equivalent to the first example in L<"Allowing fall-through">:
+
+        use Switch 'fallthrough';
+
+        switch ($val) {
+                case 1      { handle_num_1(); }
+                case "1"    { handle_str_1(); }
+                case [0..9] { handle_num_any(); last }
+                case /\d/   { handle_dig_any(); }
+                case /.*/   { handle_str_any(); }
+        }
+
+Note the explicit use of a C<last> to preserve the non-fall-through
+behaviour of the third case.
+
+
+
+=head2 Alternative syntax
+
+Perl 6 will provide a built-in switch statement with essentially the
+same semantics as those offered by Switch.pm, but with a different
+pair of keywords. In Perl 6 C<switch> will be spelled C<given>, and
+C<case> will be pronounced C<when>. In addition, the C<when> statement
+will not require switch or case values to be parenthesized.
+
+This future syntax is also (largely) available via the Switch.pm module, by
+importing it with the argument C<"Perl6">.  For example:
+
+        use Switch 'Perl6';
+
+        given ($val) {
+                when 1       { handle_num_1(); }
+                when ($str1) { handle_str_1(); }
+                when [0..9]  { handle_num_any(); last }
+                when /\d/    { handle_dig_any(); }
+                when /.*/    { handle_str_any(); }
+                default      { handle anything else; }
+        }
+
+Note that scalars still need to be parenthesized, since they would be
+ambiguous in Perl 5.
+
+Note too that you can mix and match both syntaxes by importing the module
+with:
+
+	use Switch 'Perl5', 'Perl6';
+
+
+=head2 Higher-order Operations
+
+One situation in which C<switch> and C<case> do not provide a good
+substitute for a cascaded C<if>, is where a switch value needs to
+be tested against a series of conditions. For example:
+
+        sub beverage {
+            switch (shift) {
+
+                case sub { $_[0] < 10 }  { return 'milk' }
+                case sub { $_[0] < 20 }  { return 'coke' }
+                case sub { $_[0] < 30 }  { return 'beer' }
+                case sub { $_[0] < 40 }  { return 'wine' }
+                case sub { $_[0] < 50 }  { return 'malt' }
+                case sub { $_[0] < 60 }  { return 'Moet' }
+                else                     { return 'milk' }
+            }
+        }
+
+The need to specify each condition as a subroutine block is tiresome. To
+overcome this, when importing Switch.pm, a special "placeholder"
+subroutine named C<__> [sic] may also be imported. This subroutine
+converts (almost) any expression in which it appears to a reference to a
+higher-order function. That is, the expression:
+
+        use Switch '__';
+
+        __ < 2 + __
+
+is equivalent to:
+
+        sub { $_[0] < 2 + $_[1] }
+
+With C<__>, the previous ugly case statements can be rewritten:
+
+        case  __ < 10  { return 'milk' }
+        case  __ < 20  { return 'coke' }
+        case  __ < 30  { return 'beer' }
+        case  __ < 40  { return 'wine' }
+        case  __ < 50  { return 'malt' }
+        case  __ < 60  { return 'Moet' }
+        else           { return 'milk' }
+
+The C<__> subroutine makes extensive use of operator overloading to
+perform its magic. All operations involving __ are overloaded to
+produce an anonymous subroutine that implements a lazy version
+of the original operation.
+
+The only problem is that operator overloading does not allow the
+boolean operators C<&&> and C<||> to be overloaded. So a case statement
+like this:
+
+        case  0 <= __ && __ < 10  { return 'digit' }  
+
+doesn't act as expected, because when it is
+executed, it constructs two higher order subroutines
+and then treats the two resulting references as arguments to C<&&>:
+
+        sub { 0 <= $_[0] } && sub { $_[0] < 10 }
+
+This boolean expression is inevitably true, since both references are
+non-false. Fortunately, the overloaded C<'bool'> operator catches this
+situation and flags it as a error. 
+
+=head1 DEPENDENCIES
+
+The module is implemented using Filter::Util::Call and Text::Balanced
+and requires both these modules to be installed. 
+
+=head1 AUTHOR
+
+Damian Conway (damian@conway.org). The maintainer of this module is now Rafael
+Garcia-Suarez (rgarciasuarez@free.fr).
+
+=head1 BUGS
+
+There are undoubtedly serious bugs lurking somewhere in code this funky :-)
+Bug reports and other feedback are most welcome.
+
+=head1 LIMITATIONS
+
+Due to the heuristic nature of Switch.pm's source parsing, the presence
+of regexes specified with raw C<?...?> delimiters may cause mysterious
+errors. The workaround is to use C<m?...?> instead.
+
+Due to the way source filters work in Perl, you can't use Switch inside
+an string C<eval>.
+
+If your source file is longer then 1 million characters and you have a
+switch statement that crosses the 1 million (or 2 million, etc.)
+character boundary you will get mysterious errors. The workaround is to
+use smaller source files.
+
+=head1 COPYRIGHT
+
+    Copyright (c) 1997-2003, Damian Conway. All Rights Reserved.
+    This module is free software. It may be used, redistributed
+        and/or modified under the same terms as Perl itself.
Index: /for-distributions/trunk/bin/windows/perl/lib/Symbol.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Symbol.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Symbol.pm	(revision 14489)
@@ -0,0 +1,170 @@
+package Symbol;
+
+=head1 NAME
+
+Symbol - manipulate Perl symbols and their names
+
+=head1 SYNOPSIS
+
+    use Symbol;
+
+    $sym = gensym;
+    open($sym, "filename");
+    $_ = <$sym>;
+    # etc.
+
+    ungensym $sym;      # no effect
+
+    # replace *FOO{IO} handle but not $FOO, %FOO, etc.
+    *FOO = geniosym;
+
+    print qualify("x"), "\n";              # "Test::x"
+    print qualify("x", "FOO"), "\n"        # "FOO::x"
+    print qualify("BAR::x"), "\n";         # "BAR::x"
+    print qualify("BAR::x", "FOO"), "\n";  # "BAR::x"
+    print qualify("STDOUT", "FOO"), "\n";  # "main::STDOUT" (global)
+    print qualify(\*x), "\n";              # returns \*x
+    print qualify(\*x, "FOO"), "\n";       # returns \*x
+
+    use strict refs;
+    print { qualify_to_ref $fh } "foo!\n";
+    $ref = qualify_to_ref $name, $pkg;
+
+    use Symbol qw(delete_package);
+    delete_package('Foo::Bar');
+    print "deleted\n" unless exists $Foo::{'Bar::'};
+
+=head1 DESCRIPTION
+
+C<Symbol::gensym> creates an anonymous glob and returns a reference
+to it.  Such a glob reference can be used as a file or directory
+handle.
+
+For backward compatibility with older implementations that didn't
+support anonymous globs, C<Symbol::ungensym> is also provided.
+But it doesn't do anything.
+
+C<Symbol::geniosym> creates an anonymous IO handle.  This can be
+assigned into an existing glob without affecting the non-IO portions
+of the glob.
+
+C<Symbol::qualify> turns unqualified symbol names into qualified
+variable names (e.g. "myvar" -E<gt> "MyPackage::myvar").  If it is given a
+second parameter, C<qualify> uses it as the default package;
+otherwise, it uses the package of its caller.  Regardless, global
+variable names (e.g. "STDOUT", "ENV", "SIG") are always qualified with
+"main::".
+
+Qualification applies only to symbol names (strings).  References are
+left unchanged under the assumption that they are glob references,
+which are qualified by their nature.
+
+C<Symbol::qualify_to_ref> is just like C<Symbol::qualify> except that it
+returns a glob ref rather than a symbol name, so you can use the result
+even if C<use strict 'refs'> is in effect.
+
+C<Symbol::delete_package> wipes out a whole package namespace.  Note
+this routine is not exported by default--you may want to import it
+explicitly.
+
+=head1 BUGS
+
+C<Symbol::delete_package> is a bit too powerful. It undefines every symbol that
+lives in the specified package. Since perl, for performance reasons, does not
+perform a symbol table lookup each time a function is called or a global
+variable is accessed, some code that has already been loaded and that makes use
+of symbols in package C<Foo> may stop working after you delete C<Foo>, even if
+you reload the C<Foo> module afterwards.
+
+=cut
+
+BEGIN { require 5.005; }
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(gensym ungensym qualify qualify_to_ref);
+@EXPORT_OK = qw(delete_package geniosym);
+
+$VERSION = '1.06';
+
+my $genpkg = "Symbol::";
+my $genseq = 0;
+
+my %global = map {$_ => 1} qw(ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT);
+
+#
+# Note that we never _copy_ the glob; we just make a ref to it.
+# If we did copy it, then SVf_FAKE would be set on the copy, and
+# glob-specific behaviors (e.g. C<*$ref = \&func>) wouldn't work.
+#
+sub gensym () {
+    my $name = "GEN" . $genseq++;
+    my $ref = \*{$genpkg . $name};
+    delete $$genpkg{$name};
+    $ref;
+}
+
+sub geniosym () {
+    my $sym = gensym();
+    # force the IO slot to be filled
+    select(select $sym);
+    *$sym{IO};
+}
+
+sub ungensym ($) {}
+
+sub qualify ($;$) {
+    my ($name) = @_;
+    if (!ref($name) && index($name, '::') == -1 && index($name, "'") == -1) {
+	my $pkg;
+	# Global names: special character, "^xyz", or other. 
+	if ($name =~ /^(([^a-z])|(\^[a-z_]+))\z/i || $global{$name}) {
+	    # RGS 2001-11-05 : translate leading ^X to control-char
+	    $name =~ s/^\^([a-z_])/'qq(\c'.$1.')'/eei;
+	    $pkg = "main";
+	}
+	else {
+	    $pkg = (@_ > 1) ? $_[1] : caller;
+	}
+	$name = $pkg . "::" . $name;
+    }
+    $name;
+}
+
+sub qualify_to_ref ($;$) {
+    return \*{ qualify $_[0], @_ > 1 ? $_[1] : caller };
+}
+
+#
+# of Safe.pm lineage
+#
+sub delete_package ($) {
+    my $pkg = shift;
+
+    # expand to full symbol table name if needed
+
+    unless ($pkg =~ /^main::.*::$/) {
+        $pkg = "main$pkg"	if	$pkg =~ /^::/;
+        $pkg = "main::$pkg"	unless	$pkg =~ /^main::/;
+        $pkg .= '::'		unless	$pkg =~ /::$/;
+    }
+
+    my($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/;
+    my $stem_symtab = *{$stem}{HASH};
+    return unless defined $stem_symtab and exists $stem_symtab->{$leaf};
+
+
+    # free all the symbols in the package
+
+    my $leaf_symtab = *{$stem_symtab->{$leaf}}{HASH};
+    foreach my $name (keys %$leaf_symtab) {
+        undef *{$pkg . $name};
+    }
+
+    # delete the symbol table
+
+    %$leaf_symtab = ();
+    delete $stem_symtab->{$leaf};
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Sys/Hostname.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Sys/Hostname.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Sys/Hostname.pm	(revision 14489)
@@ -0,0 +1,165 @@
+package Sys::Hostname;
+
+use strict;
+
+use Carp;
+
+require Exporter;
+require AutoLoader;
+
+our @ISA     = qw/ Exporter AutoLoader /;
+our @EXPORT  = qw/ hostname /;
+
+our $VERSION;
+
+our $host;
+
+BEGIN {
+    $VERSION = '1.11';
+    {
+	local $SIG{__DIE__};
+	eval {
+	    require XSLoader;
+	    XSLoader::load('Sys::Hostname', $VERSION);
+	};
+	warn $@ if $@;
+    }
+}
+
+
+sub hostname {
+
+  # method 1 - we already know it
+  return $host if defined $host;
+
+  # method 1' - try to ask the system
+  $host = ghname() if defined &ghname;
+  return $host if defined $host;
+
+  if ($^O eq 'VMS') {
+
+    # method 2 - no sockets ==> return DECnet node name
+    eval { local $SIG{__DIE__}; $host = (gethostbyname('me'))[0] };
+    if ($@) { return $host = $ENV{'SYS$NODE'}; }
+
+    # method 3 - has someone else done the job already?  It's common for the
+    #    TCP/IP stack to advertise the hostname via a logical name.  (Are
+    #    there any other logicals which TCP/IP stacks use for the host name?)
+    $host = $ENV{'ARPANET_HOST_NAME'}  || $ENV{'INTERNET_HOST_NAME'} ||
+            $ENV{'MULTINET_HOST_NAME'} || $ENV{'UCX$INET_HOST'}      ||
+            $ENV{'TCPWARE_DOMAINNAME'} || $ENV{'NEWS_ADDRESS'};
+    return $host if $host;
+
+    # method 4 - does hostname happen to work?
+    my($rslt) = `hostname`;
+    if ($rslt !~ /IVVERB/) { ($host) = $rslt =~ /^(\S+)/; }
+    return $host if $host;
+
+    # rats!
+    $host = '';
+    croak "Cannot get host name of local machine";  
+
+  }
+  elsif ($^O eq 'MSWin32') {
+    ($host) = gethostbyname('localhost');
+    chomp($host = `hostname 2> NUL`) unless defined $host;
+    return $host;
+  }
+  elsif ($^O eq 'epoc') {
+    $host = 'localhost';
+    return $host;
+  }
+  else {  # Unix
+    # is anyone going to make it here?
+
+    local $ENV{PATH} = '/usr/bin:/bin:/usr/sbin:/sbin'; # Paranoia.
+
+    # method 2 - syscall is preferred since it avoids tainting problems
+    # XXX: is it such a good idea to return hostname untainted?
+    eval {
+	local $SIG{__DIE__};
+	require "syscall.ph";
+	$host = "\0" x 65; ## preload scalar
+	syscall(&SYS_gethostname, $host, 65) == 0;
+    }
+
+    # method 2a - syscall using systeminfo instead of gethostname
+    #           -- needed on systems like Solaris
+    || eval {
+	local $SIG{__DIE__};
+	require "sys/syscall.ph";
+	require "sys/systeminfo.ph";
+	$host = "\0" x 65; ## preload scalar
+	syscall(&SYS_systeminfo, &SI_HOSTNAME, $host, 65) != -1;
+    }
+
+    # method 3 - trusty old hostname command
+    || eval {
+	local $SIG{__DIE__};
+	local $SIG{CHLD};
+	$host = `(hostname) 2>/dev/null`; # bsdish
+    }
+
+    # method 4 - use POSIX::uname(), which strictly can't be expected to be
+    # correct
+    || eval {
+	local $SIG{__DIE__};
+	require POSIX;
+	$host = (POSIX::uname())[1];
+    }
+
+    # method 5 - sysV uname command (may truncate)
+    || eval {
+	local $SIG{__DIE__};
+	$host = `uname -n 2>/dev/null`; ## sysVish
+    }
+
+    # method 6 - Apollo pre-SR10
+    || eval {
+	local $SIG{__DIE__};
+        my($a,$b,$c,$d);
+	($host,$a,$b,$c,$d)=split(/[:\. ]/,`/com/host`,6);
+    }
+
+    # bummer
+    || croak "Cannot get host name of local machine";  
+
+    # remove garbage 
+    $host =~ tr/\0\r\n//d;
+    $host;
+  }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Sys::Hostname - Try every conceivable way to get hostname
+
+=head1 SYNOPSIS
+
+    use Sys::Hostname;
+    $host = hostname;
+
+=head1 DESCRIPTION
+
+Attempts several methods of getting the system hostname and
+then caches the result.  It tries the first available of the C
+library's gethostname(), C<`$Config{aphostname}`>, uname(2),
+C<syscall(SYS_gethostname)>, C<`hostname`>, C<`uname -n`>,
+and the file F</com/host>.  If all that fails it C<croak>s.
+
+All NULs, returns, and newlines are removed from the result.
+
+=head1 AUTHOR
+
+David Sundstrom E<lt>F<sunds@asictest.sc.ti.com>E<gt>
+
+Texas Instruments
+
+XS code added by Greg Bacon E<lt>F<gbacon@cs.uah.edu>E<gt>
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Term/ANSIColor.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Term/ANSIColor.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Term/ANSIColor.pm	(revision 14489)
@@ -0,0 +1,472 @@
+# Term::ANSIColor -- Color screen output using ANSI escape sequences.
+# $Id: ANSIColor.pm,v 1.10 2005/08/21 18:31:58 eagle Exp $
+#
+# Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2005
+#   by Russ Allbery <rra@stanford.edu> and Zenin
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# Ah, September, when the sysadmins turn colors and fall off the trees....
+#                               -- Dave Van Domelen
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Term::ANSIColor;
+require 5.001;
+
+use strict;
+use vars qw($AUTOLOAD $AUTORESET $EACHLINE @ISA @EXPORT @EXPORT_OK
+            %EXPORT_TAGS $VERSION %attributes %attributes_r);
+
+use Exporter ();
+@ISA         = qw(Exporter);
+@EXPORT      = qw(color colored);
+@EXPORT_OK   = qw(uncolor);
+%EXPORT_TAGS = (constants => [qw(CLEAR RESET BOLD DARK UNDERLINE UNDERSCORE
+                                 BLINK REVERSE CONCEALED BLACK RED GREEN
+                                 YELLOW BLUE MAGENTA CYAN WHITE ON_BLACK
+                                 ON_RED ON_GREEN ON_YELLOW ON_BLUE ON_MAGENTA
+                                 ON_CYAN ON_WHITE)]);
+Exporter::export_ok_tags ('constants');
+
+# Don't use the CVS revision as the version, since this module is also in Perl
+# core and too many things could munge CVS magic revision strings.
+$VERSION = '1.10';
+
+##############################################################################
+# Internal data structures
+##############################################################################
+
+%attributes = ('clear'      => 0,
+               'reset'      => 0,
+               'bold'       => 1,
+               'dark'       => 2,
+               'underline'  => 4,
+               'underscore' => 4,
+               'blink'      => 5,
+               'reverse'    => 7,
+               'concealed'  => 8,
+
+               'black'      => 30,   'on_black'   => 40,
+               'red'        => 31,   'on_red'     => 41,
+               'green'      => 32,   'on_green'   => 42,
+               'yellow'     => 33,   'on_yellow'  => 43,
+               'blue'       => 34,   'on_blue'    => 44,
+               'magenta'    => 35,   'on_magenta' => 45,
+               'cyan'       => 36,   'on_cyan'    => 46,
+               'white'      => 37,   'on_white'   => 47);
+
+# Reverse lookup.  Alphabetically first name for a sequence is preferred.
+for (reverse sort keys %attributes) {
+    $attributes_r{$attributes{$_}} = $_;
+}
+
+##############################################################################
+# Implementation (constant form)
+##############################################################################
+
+# Time to have fun!  We now want to define the constant subs, which are named
+# the same as the attributes above but in all caps.  Each constant sub needs
+# to act differently depending on whether $AUTORESET is set.  Without
+# autoreset:
+#
+#     BLUE "text\n"  ==>  "\e[34mtext\n"
+#
+# If $AUTORESET is set, we should instead get:
+#
+#     BLUE "text\n"  ==>  "\e[34mtext\n\e[0m"
+#
+# The sub also needs to handle the case where it has no arguments correctly.
+# Maintaining all of this as separate subs would be a major nightmare, as well
+# as duplicate the %attributes hash, so instead we define an AUTOLOAD sub to
+# define the constant subs on demand.  To do that, we check the name of the
+# called sub against the list of attributes, and if it's an all-caps version
+# of one of them, we define the sub on the fly and then run it.
+#
+# If the environment variable ANSI_COLORS_DISABLED is set, turn all of the
+# generated subs into pass-through functions that don't add any escape
+# sequences.  This is to make it easier to write scripts that also work on
+# systems without any ANSI support, like Windows consoles.
+sub AUTOLOAD {
+    my $enable_colors = !defined $ENV{ANSI_COLORS_DISABLED};
+    my $sub;
+    ($sub = $AUTOLOAD) =~ s/^.*:://;
+    my $attr = $attributes{lc $sub};
+    if ($sub =~ /^[A-Z_]+$/ && defined $attr) {
+        $attr = $enable_colors ? "\e[" . $attr . 'm' : '';
+        eval qq {
+            sub $AUTOLOAD {
+                if (\$AUTORESET && \@_) {
+                    '$attr' . "\@_" . "\e[0m";
+                } else {
+                    ('$attr' . "\@_");
+                }
+            }
+        };
+        goto &$AUTOLOAD;
+    } else {
+        require Carp;
+        Carp::croak ("undefined subroutine &$AUTOLOAD called");
+    }
+}
+
+##############################################################################
+# Implementation (attribute string form)
+##############################################################################
+
+# Return the escape code for a given set of color attributes.
+sub color {
+    return '' if defined $ENV{ANSI_COLORS_DISABLED};
+    my @codes = map { split } @_;
+    my $attribute = '';
+    foreach (@codes) {
+        $_ = lc $_;
+        unless (defined $attributes{$_}) {
+            require Carp;
+            Carp::croak ("Invalid attribute name $_");
+        }
+        $attribute .= $attributes{$_} . ';';
+    }
+    chop $attribute;
+    ($attribute ne '') ? "\e[${attribute}m" : undef;
+}
+
+# Return a list of named color attributes for a given set of escape codes.
+# Escape sequences can be given with or without enclosing "\e[" and "m".  The
+# empty escape sequence '' or "\e[m" gives an empty list of attrs.
+sub uncolor {
+    my (@nums, @result);
+    for (@_) {
+        my $escape = $_;
+        $escape =~ s/^\e\[//;
+        $escape =~ s/m$//;
+        unless ($escape =~ /^((?:\d+;)*\d*)$/) {
+            require Carp;
+            Carp::croak ("Bad escape sequence $_");
+        }
+        push (@nums, split (/;/, $1));
+    }
+    for (@nums) {
+	$_ += 0; # Strip leading zeroes
+	my $name = $attributes_r{$_};
+	if (!defined $name) {
+	    require Carp;
+	    Carp::croak ("No name for escape sequence $_" );
+	}
+	push (@result, $name);
+    }
+    @result;
+}
+
+# Given a string and a set of attributes, returns the string surrounded by
+# escape codes to set those attributes and then clear them at the end of the
+# string.  The attributes can be given either as an array ref as the first
+# argument or as a list as the second and subsequent arguments.  If $EACHLINE
+# is set, insert a reset before each occurrence of the string $EACHLINE and
+# the starting attribute code after the string $EACHLINE, so that no attribute
+# crosses line delimiters (this is often desirable if the output is to be
+# piped to a pager or some other program).
+sub colored {
+    my ($string, @codes);
+    if (ref $_[0]) {
+        @codes = @{+shift};
+        $string = join ('', @_);
+    } else {
+        $string = shift;
+        @codes = @_;
+    }
+    return $string if defined $ENV{ANSI_COLORS_DISABLED};
+    if (defined $EACHLINE) {
+        my $attr = color (@codes);
+        join '',
+            map { $_ ne $EACHLINE ? $attr . $_ . "\e[0m" : $_ }
+                grep { length ($_) > 0 }
+                    split (/(\Q$EACHLINE\E)/, $string);
+    } else {
+        color (@codes) . $string . "\e[0m";
+    }
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+# Ensure we evaluate to true.
+1;
+__END__
+
+=head1 NAME
+
+Term::ANSIColor - Color screen output using ANSI escape sequences
+
+=head1 SYNOPSIS
+
+    use Term::ANSIColor;
+    print color 'bold blue';
+    print "This text is bold blue.\n";
+    print color 'reset';
+    print "This text is normal.\n";
+    print colored ("Yellow on magenta.\n", 'yellow on_magenta');
+    print "This text is normal.\n";
+    print colored ['yellow on_magenta'], "Yellow on magenta.\n";
+
+    use Term::ANSIColor qw(uncolor);
+    print uncolor '01;31', "\n";
+
+    use Term::ANSIColor qw(:constants);
+    print BOLD, BLUE, "This text is in bold blue.\n", RESET;
+
+    use Term::ANSIColor qw(:constants);
+    $Term::ANSIColor::AUTORESET = 1;
+    print BOLD BLUE "This text is in bold blue.\n";
+    print "This text is normal.\n";
+
+=head1 DESCRIPTION
+
+This module has two interfaces, one through color() and colored() and the
+other through constants.  It also offers the utility function uncolor(),
+which has to be explicitly imported to be used (see L<SYNOPSIS>).
+
+color() takes any number of strings as arguments and considers them to be
+space-separated lists of attributes.  It then forms and returns the escape
+sequence to set those attributes.  It doesn't print it out, just returns it,
+so you'll have to print it yourself if you want to (this is so that you can
+save it as a string, pass it to something else, send it to a file handle, or
+do anything else with it that you might care to).
+
+uncolor() performs the opposite translation, turning escape sequences
+into a list of strings.
+
+The recognized attributes (all of which should be fairly intuitive) are
+clear, reset, dark, bold, underline, underscore, blink, reverse, concealed,
+black, red, green, yellow, blue, magenta, on_black, on_red, on_green,
+on_yellow, on_blue, on_magenta, on_cyan, and on_white.  Case is not
+significant.  Underline and underscore are equivalent, as are clear and
+reset, so use whichever is the most intuitive to you.  The color alone sets
+the foreground color, and on_color sets the background color.
+
+Note that not all attributes are supported by all terminal types, and some
+terminals may not support any of these sequences.  Dark, blink, and
+concealed in particular are frequently not implemented.
+
+Attributes, once set, last until they are unset (by sending the attribute
+"reset").  Be careful to do this, or otherwise your attribute will last
+after your script is done running, and people get very annoyed at having
+their prompt and typing changed to weird colors.
+
+As an aid to help with this, colored() takes a scalar as the first argument
+and any number of attribute strings as the second argument and returns the
+scalar wrapped in escape codes so that the attributes will be set as
+requested before the string and reset to normal after the string.
+Alternately, you can pass a reference to an array as the first argument, and
+then the contents of that array will be taken as attributes and color codes
+and the remainder of the arguments as text to colorize.
+
+Normally, colored() just puts attribute codes at the beginning and end of
+the string, but if you set $Term::ANSIColor::EACHLINE to some string, that
+string will be considered the line delimiter and the attribute will be set
+at the beginning of each line of the passed string and reset at the end of
+each line.  This is often desirable if the output is being sent to a program
+like a pager that can be confused by attributes that span lines.  Normally
+you'll want to set $Term::ANSIColor::EACHLINE to C<"\n"> to use this
+feature.
+
+Alternately, if you import C<:constants>, you can use the constants CLEAR,
+RESET, BOLD, DARK, UNDERLINE, UNDERSCORE, BLINK, REVERSE, CONCEALED, BLACK,
+RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, ON_BLACK, ON_RED, ON_GREEN,
+ON_YELLOW, ON_BLUE, ON_MAGENTA, ON_CYAN, and ON_WHITE directly.  These are
+the same as color('attribute') and can be used if you prefer typing:
+
+    print BOLD BLUE ON_WHITE "Text\n", RESET;
+
+to
+
+    print colored ("Text\n", 'bold blue on_white');
+
+When using the constants, if you don't want to have to remember to add the
+C<, RESET> at the end of each print line, you can set
+$Term::ANSIColor::AUTORESET to a true value.  Then, the display mode will
+automatically be reset if there is no comma after the constant.  In other
+words, with that variable set:
+
+    print BOLD BLUE "Text\n";
+
+will reset the display mode afterwards, whereas:
+
+    print BOLD, BLUE, "Text\n";
+
+will not.
+
+The subroutine interface has the advantage over the constants interface in
+that only two subroutines are exported into your namespace, versus
+twenty-two in the constants interface.  On the flip side, the constants
+interface has the advantage of better compile time error checking, since
+misspelled names of colors or attributes in calls to color() and colored()
+won't be caught until runtime whereas misspelled names of constants will be
+caught at compile time.  So, polute your namespace with almost two dozen
+subroutines that you may not even use that often, or risk a silly bug by
+mistyping an attribute.  Your choice, TMTOWTDI after all.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Bad escape sequence %s
+
+(F) You passed an invalid ANSI escape sequence to uncolor().
+
+=item Bareword "%s" not allowed while "strict subs" in use
+
+(F) You probably mistyped a constant color name such as:
+
+    $Foobar = FOOBAR . "This line should be blue\n";
+
+or:
+
+    @Foobar = FOOBAR, "This line should be blue\n";
+
+This will only show up under use strict (another good reason to run under
+use strict).
+
+=item Invalid attribute name %s
+
+(F) You passed an invalid attribute name to either color() or colored().
+
+=item Name "%s" used only once: possible typo
+
+(W) You probably mistyped a constant color name such as:
+
+    print FOOBAR "This text is color FOOBAR\n";
+
+It's probably better to always use commas after constant names in order to
+force the next error.
+
+=item No comma allowed after filehandle
+
+(F) You probably mistyped a constant color name such as:
+
+    print FOOBAR, "This text is color FOOBAR\n";
+
+Generating this fatal compile error is one of the main advantages of using
+the constants interface, since you'll immediately know if you mistype a
+color name.
+
+=item No name for escape sequence %s
+
+(F) The ANSI escape sequence passed to uncolor() contains escapes which
+aren't recognized and can't be translated to names.
+
+=back
+
+=head1 ENVIRONMENT
+
+=over 4
+
+=item ANSI_COLORS_DISABLED
+
+If this environment variable is set, all of the functions defined by this
+module (color(), colored(), and all of the constants not previously used in
+the program) will not output any escape sequences and instead will just
+return the empty string or pass through the original text as appropriate.
+This is intended to support easy use of scripts using this module on
+platforms that don't support ANSI escape sequences.
+
+For it to have its proper effect, this environment variable must be set
+before any color constants are used in the program.
+
+=back
+
+=head1 RESTRICTIONS
+
+It would be nice if one could leave off the commas around the constants
+entirely and just say:
+
+    print BOLD BLUE ON_WHITE "Text\n" RESET;
+
+but the syntax of Perl doesn't allow this.  You need a comma after the
+string.  (Of course, you may consider it a bug that commas between all the
+constants aren't required, in which case you may feel free to insert commas
+unless you're using $Term::ANSIColor::AUTORESET.)
+
+For easier debuging, you may prefer to always use the commas when not
+setting $Term::ANSIColor::AUTORESET so that you'll get a fatal compile error
+rather than a warning.
+
+=head1 NOTES
+
+The codes generated by this module are standard terminal control codes,
+complying with ECMA-48 and ISO 6429 (generally referred to as "ANSI color"
+for the color codes).  The non-color control codes (bold, dark, italic,
+underline, and reverse) are part of the earlier ANSI X3.64 standard for
+control sequences for video terminals and peripherals.
+
+Note that not all displays are ISO 6429-compliant, or even X3.64-compliant
+(or are even attempting to be so).  This module will not work as expected on
+displays that do not honor these escape sequences, such as cmd.exe, 4nt.exe,
+and command.com under either Windows NT or Windows 2000.  They may just be
+ignored, or they may display as an ESC character followed by some apparent
+garbage.
+
+Jean Delvare provided the following table of different common terminal
+emulators and their support for the various attributes and others have helped
+me flesh it out:
+
+              clear    bold     dark    under    blink   reverse  conceal
+ ------------------------------------------------------------------------
+ xterm         yes      yes      no      yes     bold      yes      yes
+ linux         yes      yes      yes    bold      yes      yes      no
+ rxvt          yes      yes      no      yes  bold/black   yes      no
+ dtterm        yes      yes      yes     yes    reverse    yes      yes
+ teraterm      yes    reverse    no      yes    rev/red    yes      no
+ aixterm      kinda   normal     no      yes      no       yes      yes
+ PuTTY         yes     color     no      yes      no       yes      no
+ Windows       yes      no       no      no       no       yes      no
+ Cygwin SSH    yes      yes      no     color    color    color     yes
+ Mac Terminal  yes      yes      no      yes      yes      yes      yes
+
+Windows is Windows telnet, Cygwin SSH is the OpenSSH implementation under
+Cygwin on Windows NT, and Mac Terminal is the Terminal application in Mac OS
+X.  Where the entry is other than yes or no, that emulator displays the
+given attribute as something else instead.  Note that on an aixterm, clear
+doesn't reset colors; you have to explicitly set the colors back to what you
+want.  More entries in this table are welcome.
+
+Note that codes 3 (italic), 6 (rapid blink), and 9 (strikethrough) are
+specified in ANSI X3.64 and ECMA-048 but are not commonly supported by most
+displays and emulators and therefore aren't supported by this module at the
+present time.  ECMA-048 also specifies a large number of other attributes,
+including a sequence of attributes for font changes, Fraktur characters,
+double-underlining, framing, circling, and overlining.  As none of these
+attributes are widely supported or useful, they also aren't currently
+supported by this module.
+
+=head1 SEE ALSO
+
+ECMA-048 is available on-line (at least at the time of this writing) at
+L<http://www.ecma-international.org/publications/standards/ECMA-048.HTM>.
+
+ISO 6429 is available from ISO for a charge; the author of this module does
+not own a copy of it.  Since the source material for ISO 6429 was ECMA-048
+and the latter is available for free, there seems little reason to obtain
+the ISO standard.
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/ansicolor/>.  It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHORS
+
+Original idea (using constants) by Zenin, reimplemented using subs by Russ
+Allbery <rra@stanford.edu>, and then combined with the original idea by Russ
+with input from Zenin.  Russ Allbery now maintains this module.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1996, 1997, 1998, 2000, 2001, 2002 Russ Allbery <rra@stanford.edu>
+and Zenin.  This program is free software; you may redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Term/Cap.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Term/Cap.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Term/Cap.pm	(revision 14489)
@@ -0,0 +1,669 @@
+package Term::Cap;
+
+# Since the debugger uses Term::ReadLine which uses Term::Cap, we want
+# to load as few modules as possible.  This includes Carp.pm.
+sub carp {
+    require Carp;
+    goto &Carp::carp;
+}
+
+sub croak {
+    require Carp;
+    goto &Carp::croak;
+}
+
+use strict;
+
+use vars qw($VERSION $VMS_TERMCAP);
+use vars qw($termpat $state $first $entry);
+
+$VERSION = '1.09';
+
+# Version undef: Thu Dec 14 20:02:42 CST 1995 by sanders@bsdi.com
+# Version 1.00:  Thu Nov 30 23:34:29 EST 2000 by schwern@pobox.com
+#	[PATCH] $VERSION crusade, strict, tests, etc... all over lib/
+# Version 1.01:  Wed May 23 00:00:00 CST 2001 by d-lewart@uiuc.edu
+#	Avoid warnings in Tgetent and Tputs
+# Version 1.02:  Sat Nov 17 13:50:39 GMT 2001 by jns@gellyfish.com
+#       Altered layout of the POD
+#       Added Test::More to PREREQ_PM in Makefile.PL
+#       Fixed no argument Tgetent()
+# Version 1.03:  Wed Nov 28 10:09:38 GMT 2001
+#       VMS Support from Charles Lane <lane@DUPHY4.Physics.Drexel.Edu>
+# Version 1.04:  Thu Nov 29 16:22:03 GMT 2001
+#       Fixed warnings in test
+# Version 1.05:  Mon Dec  3 15:33:49 GMT 2001
+#       Don't try to fall back on infocmp if it's not there. From chromatic.
+# Version 1.06:  Thu Dec  6 18:43:22 GMT 2001
+#       Preload the default VMS termcap from Charles Lane
+#       Don't carp at setting OSPEED unless warnings are on.
+# Version 1.07:  Wed Jan  2 21:35:09 GMT 2002
+#       Sanity check on infocmp output from Norton Allen
+#       Repaired INSTALLDIRS thanks to Michael Schwern
+# Version 1.08:  Sat Sep 28 11:33:15 BST 2002
+#       Late loading of 'Carp' as per Michael Schwern
+# Version 1.09:  Tue Apr 20 12:06:51 BST 2004
+#       Merged in changes from and to Core
+#       Core (Fri Aug 30 14:15:55 CEST 2002):
+#       Cope with comments lines from 'infocmp' from Brendan O'Dea
+#       Allow for EBCDIC in Tgoto magic test.
+
+# TODO:
+# support Berkeley DB termcaps
+# should probably be a .xs module
+# force $FH into callers package?
+# keep $FH in object at Tgetent time?
+
+=head1 NAME
+
+Term::Cap - Perl termcap interface
+
+=head1 SYNOPSIS
+
+    require Term::Cap;
+    $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed };
+    $terminal->Trequire(qw/ce ku kd/);
+    $terminal->Tgoto('cm', $col, $row, $FH);
+    $terminal->Tputs('dl', $count, $FH);
+    $terminal->Tpad($string, $count, $FH);
+
+=head1 DESCRIPTION
+
+These are low-level functions to extract and use capabilities from
+a terminal capability (termcap) database.
+
+More information on the terminal capabilities will be found in the
+termcap manpage on most Unix-like systems.
+
+=head2 METHODS
+
+=over 4
+
+The output strings for B<Tputs> are cached for counts of 1 for performance.
+B<Tgoto> and B<Tpad> do not cache.  C<$self-E<gt>{_xx}> is the raw termcap
+data and C<$self-E<gt>{xx}> is the cached version.
+
+    print $terminal->Tpad($self->{_xx}, 1);
+
+B<Tgoto>, B<Tputs>, and B<Tpad> return the string and will also
+output the string to $FH if specified.
+
+
+=cut
+
+# Preload the default VMS termcap.
+# If a different termcap is required then the text of one can be supplied
+# in $Term::Cap::VMS_TERMCAP before Tgetent is called.
+
+if ( $^O eq 'VMS') {
+       chomp (my @entry = <DATA>);
+       $VMS_TERMCAP = join '', @entry;
+}
+
+# Returns a list of termcap files to check.
+
+sub termcap_path { ## private
+    my @termcap_path;
+    # $TERMCAP, if it's a filespec
+    push(@termcap_path, $ENV{TERMCAP})
+	if ((exists $ENV{TERMCAP}) &&
+	    (($^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'dos')
+	     ? $ENV{TERMCAP} =~ /^[a-z]:[\\\/]/is
+	     : $ENV{TERMCAP} =~ /^\//s));
+    if ((exists $ENV{TERMPATH}) && ($ENV{TERMPATH})) {
+	# Add the users $TERMPATH
+	push(@termcap_path, split(/(:|\s+)/, $ENV{TERMPATH}))
+    }
+    else {
+	# Defaults
+	push(@termcap_path,
+	    $ENV{'HOME'} . '/.termcap',
+	    '/etc/termcap',
+	    '/usr/share/misc/termcap',
+	);
+    }
+
+    # return the list of those termcaps that exist
+    return grep(-f, @termcap_path);
+}
+
+=item B<Tgetent>
+
+Returns a blessed object reference which the user can
+then use to send the control strings to the terminal using B<Tputs>
+and B<Tgoto>.
+
+The function extracts the entry of the specified terminal
+type I<TERM> (defaults to the environment variable I<TERM>) from the
+database.
+
+It will look in the environment for a I<TERMCAP> variable.  If
+found, and the value does not begin with a slash, and the terminal
+type name is the same as the environment string I<TERM>, the
+I<TERMCAP> string is used instead of reading a termcap file.  If
+it does begin with a slash, the string is used as a path name of
+the termcap file to search.  If I<TERMCAP> does not begin with a
+slash and name is different from I<TERM>, B<Tgetent> searches the
+files F<$HOME/.termcap>, F</etc/termcap>, and F</usr/share/misc/termcap>,
+in that order, unless the environment variable I<TERMPATH> exists,
+in which case it specifies a list of file pathnames (separated by
+spaces or colons) to be searched B<instead>.  Whenever multiple
+files are searched and a tc field occurs in the requested entry,
+the entry it names must be found in the same file or one of the
+succeeding files.  If there is a C<:tc=...:> in the I<TERMCAP>
+environment variable string it will continue the search in the
+files as above.
+
+The extracted termcap entry is available in the object
+as C<$self-E<gt>{TERMCAP}>.
+
+It takes a hash reference as an argument with two optional keys:
+
+=over 2
+
+=item OSPEED
+
+The terminal output bit rate (often mistakenly called the baud rate)
+for this terminal - if not set a warning will be generated
+and it will be defaulted to 9600.  I<OSPEED> can be be specified as
+either a POSIX termios/SYSV termio speeds (where 9600 equals 9600) or
+an old DSD-style speed ( where 13 equals 9600).
+
+
+=item TERM
+
+The terminal type whose termcap entry will be used - if not supplied it will
+default to $ENV{TERM}: if that is not set then B<Tgetent> will croak.
+
+=back
+
+It calls C<croak> on failure.
+
+=cut
+
+sub Tgetent { ## public -- static method
+    my $class = shift;
+    my ($self) = @_;
+
+    $self = {} unless defined $self;
+    bless $self, $class;
+
+    my($term,$cap,$search,$field,$max,$tmp_term,$TERMCAP);
+    local($termpat,$state,$first,$entry);	# used inside eval
+    local $_;
+
+    # Compute PADDING factor from OSPEED (to be used by Tpad)
+    if (! $self->{OSPEED}) {
+        if ( $^W ) {
+	   carp "OSPEED was not set, defaulting to 9600";
+        }
+	$self->{OSPEED} = 9600;
+    }
+    if ($self->{OSPEED} < 16) {
+	# delays for old style speeds
+	my @pad = (0,200,133.3,90.9,74.3,66.7,50,33.3,16.7,8.3,5.5,4.1,2,1,.5,.2);
+	$self->{PADDING} = $pad[$self->{OSPEED}];
+    }
+    else {
+	$self->{PADDING} = 10000 / $self->{OSPEED};
+    }
+
+    $self->{TERM} = ($self->{TERM} || $ENV{TERM} || croak "TERM not set");
+    $term = $self->{TERM};	# $term is the term type we are looking for
+
+    # $tmp_term is always the next term (possibly :tc=...:) we are looking for
+    $tmp_term = $self->{TERM};
+    # protect any pattern metacharacters in $tmp_term 
+    $termpat = $tmp_term; $termpat =~ s/(\W)/\\$1/g;
+
+    my $foo = (exists $ENV{TERMCAP} ? $ENV{TERMCAP} : '');
+
+    # $entry is the extracted termcap entry
+    if (($foo !~ m:^/:s) && ($foo =~ m/(^|\|)${termpat}[:|]/s)) {
+	$entry = $foo;
+    }
+
+    my @termcap_path = termcap_path();
+
+    unless (@termcap_path || $entry)
+    {
+	# last resort--fake up a termcap from terminfo 
+	local $ENV{TERM} = $term;
+
+        if ( $^O eq 'VMS' ) {
+          $entry = $VMS_TERMCAP;
+        }
+        else {
+           if ( grep { -x "$_/infocmp" } split /:/, $ENV{PATH} ) {
+              eval
+              {
+                my $tmp = `infocmp -C 2>/dev/null`;
+                $tmp =~ s/^#.*\n//gm; # remove comments
+                if (( $tmp !~ m%^/%s ) && ( $tmp =~ /(^|\|)${termpat}[:|]/s)) {
+                   $entry = $tmp;
+                }
+              };
+           }
+        }
+    }
+
+    croak "Can't find a valid termcap file" unless @termcap_path || $entry;
+
+    $state = 1;					# 0 == finished
+						# 1 == next file
+						# 2 == search again
+
+    $first = 0;					# first entry (keeps term name)
+
+    $max = 32;					# max :tc=...:'s
+
+    if ($entry) {
+	# ok, we're starting with $TERMCAP
+	$first++;				# we're the first entry
+	# do we need to continue?
+	if ($entry =~ s/:tc=([^:]+):/:/) {
+	    $tmp_term = $1;
+	    # protect any pattern metacharacters in $tmp_term 
+	    $termpat = $tmp_term; $termpat =~ s/(\W)/\\$1/g;
+	}
+	else {
+	    $state = 0;				# we're already finished
+	}
+    }
+
+    # This is eval'ed inside the while loop for each file
+    $search = q{
+	while (<TERMCAP>) {
+	    next if /^\\t/ || /^#/;
+	    if ($_ =~ m/(^|\\|)${termpat}[:|]/o) {
+		chomp;
+		s/^[^:]*:// if $first++;
+		$state = 0;
+		while ($_ =~ s/\\\\$//) {
+		    defined(my $x = <TERMCAP>) or last;
+		    $_ .= $x; chomp;
+		}
+		last;
+	    }
+	}
+	defined $entry or $entry = '';
+	$entry .= $_ if $_;
+    };
+
+    while ($state != 0) {
+	if ($state == 1) {
+	    # get the next TERMCAP
+	    $TERMCAP = shift @termcap_path
+		|| croak "failed termcap lookup on $tmp_term";
+	}
+	else {
+	    # do the same file again
+	    # prevent endless recursion
+	    $max-- || croak "failed termcap loop at $tmp_term";
+	    $state = 1;		# ok, maybe do a new file next time
+	}
+
+	open(TERMCAP,"< $TERMCAP\0") || croak "open $TERMCAP: $!";
+	eval $search;
+	die $@ if $@;
+	close TERMCAP;
+
+	# If :tc=...: found then search this file again
+	$entry =~ s/:tc=([^:]+):/:/ && ($tmp_term = $1, $state = 2);
+	# protect any pattern metacharacters in $tmp_term 
+	$termpat = $tmp_term; $termpat =~ s/(\W)/\\$1/g;
+    }
+
+    croak "Can't find $term" if $entry eq '';
+    $entry =~ s/:+\s*:+/:/g;				# cleanup $entry
+    $entry =~ s/:+/:/g;					# cleanup $entry
+    $self->{TERMCAP} = $entry;				# save it
+    # print STDERR "DEBUG: $entry = ", $entry, "\n";
+
+    # Precompile $entry into the object
+    $entry =~ s/^[^:]*://;
+    foreach $field (split(/:[\s:\\]*/,$entry)) {
+	if (defined $field && $field =~ /^(\w\w)$/) {
+	    $self->{'_' . $field} = 1 unless defined $self->{'_' . $1};
+	    # print STDERR "DEBUG: flag $1\n";
+	}
+	elsif (defined $field && $field =~ /^(\w\w)\@/) {
+	    $self->{'_' . $1} = "";
+	    # print STDERR "DEBUG: unset $1\n";
+	}
+	elsif (defined $field && $field =~ /^(\w\w)#(.*)/) {
+	    $self->{'_' . $1} = $2 unless defined $self->{'_' . $1};
+	    # print STDERR "DEBUG: numeric $1 = $2\n";
+	}
+	elsif (defined $field && $field =~ /^(\w\w)=(.*)/) {
+	    # print STDERR "DEBUG: string $1 = $2\n";
+	    next if defined $self->{'_' . ($cap = $1)};
+	    $_ = $2;
+	    s/\\E/\033/g;
+	    s/\\(\d\d\d)/pack('c',oct($1) & 0177)/eg;
+	    s/\\n/\n/g;
+	    s/\\r/\r/g;
+	    s/\\t/\t/g;
+	    s/\\b/\b/g;
+	    s/\\f/\f/g;
+	    s/\\\^/\377/g;
+	    s/\^\?/\177/g;
+	    s/\^(.)/pack('c',ord($1) & 31)/eg;
+	    s/\\(.)/$1/g;
+	    s/\377/^/g;
+	    $self->{'_' . $cap} = $_;
+	}
+	# else { carp "junk in $term ignored: $field"; }
+    }
+    $self->{'_pc'} = "\0" unless defined $self->{'_pc'};
+    $self->{'_bc'} = "\b" unless defined $self->{'_bc'};
+    $self;
+}
+
+# $terminal->Tpad($string, $cnt, $FH);
+
+=item B<Tpad>
+
+Outputs a literal string with appropriate padding for the current terminal.
+
+It takes three arguments:
+
+=over 2
+
+=item B<$string>
+
+The literal string to be output.  If it starts with a number and an optional
+'*' then the padding will be increased by an amount relative to this number,
+if the '*' is present then this amount will me multiplied by $cnt.  This part
+of $string is removed before output/
+
+=item B<$cnt>
+
+Will be used to modify the padding applied to string as described above.
+
+=item B<$FH>
+
+An optional filehandle (or IO::Handle ) that output will be printed to.
+
+=back
+
+The padded $string is returned.
+
+=cut
+
+sub Tpad { ## public
+    my $self = shift;
+    my($string, $cnt, $FH) = @_;
+    my($decr, $ms);
+
+    if (defined $string && $string =~ /(^[\d.]+)(\*?)(.*)$/) {
+	$ms = $1;
+	$ms *= $cnt if $2;
+	$string = $3;
+	$decr = $self->{PADDING};
+	if ($decr > .1) {
+	    $ms += $decr / 2;
+	    $string .= $self->{'_pc'} x ($ms / $decr);
+	}
+    }
+    print $FH $string if $FH;
+    $string;
+}
+
+# $terminal->Tputs($cap, $cnt, $FH);
+
+=item B<Tputs>
+
+Output the string for the given capability padded as appropriate without
+any parameter substitution.
+
+It takes three arguments:
+
+=over 2
+
+=item B<$cap>
+
+The capability whose string is to be output.
+
+=item B<$cnt>
+
+A count passed to Tpad to modify the padding applied to the output string.
+If $cnt is zero or one then the resulting string will be cached.
+
+=item B<$FH>
+
+An optional filehandle (or IO::Handle ) that output will be printed to.
+
+=back
+
+The appropriate string for the capability will be returned.
+
+=cut
+
+sub Tputs { ## public
+    my $self = shift;
+    my($cap, $cnt, $FH) = @_;
+    my $string;
+
+    $cnt = 0 unless $cnt;
+
+    if ($cnt > 1) {
+	$string = Tpad($self, $self->{'_' . $cap}, $cnt);
+    } else {
+	# cache result because Tpad can be slow
+	unless (exists $self->{$cap}) {
+	    $self->{$cap} = exists $self->{"_$cap"} ?
+		Tpad($self, $self->{"_$cap"}, 1) : undef;
+	}
+	$string = $self->{$cap};
+    }
+    print $FH $string if $FH;
+    $string;
+}
+
+# $terminal->Tgoto($cap, $col, $row, $FH);
+
+=item B<Tgoto>
+
+B<Tgoto> decodes a cursor addressing string with the given parameters.
+
+There are four arguments:
+
+=over 2
+
+=item B<$cap>
+
+The name of the capability to be output.
+
+=item B<$col>
+
+The first value to be substituted in the output string ( usually the column
+in a cursor addressing capability )
+
+=item B<$row>
+
+The second value to be substituted in the output string (usually the row
+in cursor addressing capabilities)
+
+=item B<$FH>
+
+An optional filehandle (or IO::Handle ) to which the output string will be
+printed.
+
+=back
+
+Substitutions are made with $col and $row in the output string with the
+following sprintf() line formats:
+
+ %%   output `%'
+ %d   output value as in printf %d
+ %2   output value as in printf %2d
+ %3   output value as in printf %3d
+ %.   output value as in printf %c
+ %+x  add x to value, then do %.
+
+ %>xy if value > x then add y, no output
+ %r   reverse order of two parameters, no output
+ %i   increment by one, no output
+ %B   BCD (16*(value/10)) + (value%10), no output
+
+ %n   exclusive-or all parameters with 0140 (Datamedia 2500)
+ %D   Reverse coding (value - 2*(value%16)), no output (Delta Data)
+
+The output string will be returned.
+
+=cut
+
+sub Tgoto { ## public
+    my $self = shift;
+    my($cap, $code, $tmp, $FH) = @_;
+    my $string = $self->{'_' . $cap};
+    my $result = '';
+    my $after = '';
+    my $online = 0;
+    my @tmp = ($tmp,$code);
+    my $cnt = $code;
+
+    while ($string =~ /^([^%]*)%(.)(.*)/) {
+	$result .= $1;
+	$code = $2;
+	$string = $3;
+	if ($code eq 'd') {
+	    $result .= sprintf("%d",shift(@tmp));
+	}
+	elsif ($code eq '.') {
+	    $tmp = shift(@tmp);
+	    if ($tmp == 0 || $tmp == 4 || $tmp == 10) {
+		if ($online) {
+		    ++$tmp, $after .= $self->{'_up'} if $self->{'_up'};
+		}
+		else {
+		    ++$tmp, $after .= $self->{'_bc'};
+		}
+	    }
+	    $result .= sprintf("%c",$tmp);
+	    $online = !$online;
+	}
+	elsif ($code eq '+') {
+	    $result .= sprintf("%c",shift(@tmp)+ord($string));
+	    $string = substr($string,1,99);
+	    $online = !$online;
+	}
+	elsif ($code eq 'r') {
+	    ($code,$tmp) = @tmp;
+	    @tmp = ($tmp,$code);
+	    $online = !$online;
+	}
+	elsif ($code eq '>') {
+	    ($code,$tmp,$string) = unpack("CCa99",$string);
+	    if ($tmp[$[] > $code) {
+		$tmp[$[] += $tmp;
+	    }
+	}
+	elsif ($code eq '2') {
+	    $result .= sprintf("%02d",shift(@tmp));
+	    $online = !$online;
+	}
+	elsif ($code eq '3') {
+	    $result .= sprintf("%03d",shift(@tmp));
+	    $online = !$online;
+	}
+	elsif ($code eq 'i') {
+	    ($code,$tmp) = @tmp;
+	    @tmp = ($code+1,$tmp+1);
+	}
+	else {
+	    return "OOPS";
+	}
+    }
+    $string = Tpad($self, $result . $string . $after, $cnt);
+    print $FH $string if $FH;
+    $string;
+}
+
+# $terminal->Trequire(qw/ce ku kd/);
+
+=item B<Trequire>
+
+Takes a list of capabilities as an argument and will croak if one is not
+found.
+
+=cut
+
+sub Trequire { ## public
+    my $self = shift;
+    my($cap,@undefined);
+    foreach $cap (@_) {
+	push(@undefined, $cap)
+	    unless defined $self->{'_' . $cap} && $self->{'_' . $cap};
+    }
+    croak "Terminal does not support: (@undefined)" if @undefined;
+}
+
+=back
+
+=head1 EXAMPLES
+
+    use Term::Cap;
+
+    # Get terminal output speed
+    require POSIX;
+    my $termios = new POSIX::Termios;
+    $termios->getattr;
+    my $ospeed = $termios->getospeed;
+
+    # Old-style ioctl code to get ospeed:
+    #     require 'ioctl.pl';
+    #     ioctl(TTY,$TIOCGETP,$sgtty);
+    #     ($ispeed,$ospeed) = unpack('cc',$sgtty);
+
+    # allocate and initialize a terminal structure
+    $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed };
+
+    # require certain capabilities to be available
+    $terminal->Trequire(qw/ce ku kd/);
+
+    # Output Routines, if $FH is undefined these just return the string
+
+    # Tgoto does the % expansion stuff with the given args
+    $terminal->Tgoto('cm', $col, $row, $FH);
+
+    # Tputs doesn't do any % expansion.
+    $terminal->Tputs('dl', $count = 1, $FH);
+
+=head1 COPYRIGHT AND LICENSE
+
+Please see the README file in distribution.
+
+=head1 AUTHOR
+
+This module is part of the core Perl distribution and is also maintained
+for CPAN by Jonathan Stowe <jns@gellyfish.com>.
+
+=head1 SEE ALSO
+
+termcap(5)
+
+=cut
+
+# Below is a default entry for systems where there are terminals but no
+# termcap
+1;
+__DATA__
+vt220|vt200|DEC VT220 in vt100 emulation mode:
+am:mi:xn:xo:
+co#80:li#24:
+RA=\E[?7l:SA=\E[?7h:
+ac=kkllmmjjnnwwqquuttvvxx:ae=\E(B:al=\E[L:as=\E(0:
+bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:
+cr=^M:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B:
+ei=\E[4l:ho=\E[H:im=\E[4h:
+is=\E[1;24r\E[24;1H:
+nd=\E[C:
+kd=\E[B::kl=\E[D:kr=\E[C:ku=\E[A:le=^H:
+mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:
+kb=\0177:
+r2=\E>\E[24;1H\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E=:rc=\E8:
+sc=\E7:se=\E[27m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:
+ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[?25h:vi=\E[?25l:
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Term/Complete.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Term/Complete.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Term/Complete.pm	(revision 14489)
@@ -0,0 +1,188 @@
+package Term::Complete;
+require 5.000;
+require Exporter;
+
+use strict;
+our @ISA = qw(Exporter);
+our @EXPORT = qw(Complete);
+our $VERSION = '1.402';
+
+#      @(#)complete.pl,v1.2            (me@anywhere.EBay.Sun.COM) 09/23/91
+
+=head1 NAME
+
+Term::Complete - Perl word completion module
+
+=head1 SYNOPSIS
+
+    $input = Complete('prompt_string', \@completion_list);
+    $input = Complete('prompt_string', @completion_list);
+
+=head1 DESCRIPTION
+
+This routine provides word completion on the list of words in
+the array (or array ref).
+
+The tty driver is put into raw mode and restored using an operating
+system specific command, in UNIX-like environments C<stty>.
+
+The following command characters are defined:
+
+=over 4
+
+=item E<lt>tabE<gt>
+
+Attempts word completion.
+Cannot be changed.
+
+=item ^D
+
+Prints completion list.
+Defined by I<$Term::Complete::complete>.
+
+=item ^U
+
+Erases the current input.
+Defined by I<$Term::Complete::kill>.
+
+=item E<lt>delE<gt>, E<lt>bsE<gt>
+
+Erases one character.
+Defined by I<$Term::Complete::erase1> and I<$Term::Complete::erase2>.
+
+=back
+
+=head1 DIAGNOSTICS
+
+Bell sounds when word completion fails.
+
+=head1 BUGS
+
+The completion character E<lt>tabE<gt> cannot be changed.
+
+=head1 AUTHOR
+
+Wayne Thompson
+
+=cut
+
+our($complete, $kill, $erase1, $erase2, $tty_raw_noecho, $tty_restore, $stty, $tty_safe_restore);
+our($tty_saved_state) = '';
+CONFIG: {
+    $complete = "\004";
+    $kill     = "\025";
+    $erase1 =   "\177";
+    $erase2 =   "\010";
+    foreach my $s (qw(/bin/stty /usr/bin/stty)) {
+	if (-x $s) {
+	    $tty_raw_noecho = "$s raw -echo";
+	    $tty_restore    = "$s -raw echo";
+	    $tty_safe_restore = $tty_restore;
+	    $stty = $s;
+	    last;
+	}
+    }
+}
+
+sub Complete {
+    my($prompt, @cmp_lst, $cmp, $test, $l, @match);
+    my ($return, $r) = ("", 0);
+
+    $return = "";
+    $r      = 0;
+
+    $prompt = shift;
+    if (ref $_[0] || $_[0] =~ /^\*/) {
+	@cmp_lst = sort @{$_[0]};
+    }
+    else {
+	@cmp_lst = sort(@_);
+    }
+
+    # Attempt to save the current stty state, to be restored later
+    if (defined $stty && defined $tty_saved_state && $tty_saved_state eq '') {
+	$tty_saved_state = qx($stty -g 2>/dev/null);
+	if ($?) {
+	    # stty -g not supported
+	    $tty_saved_state = undef;
+	}
+	else {
+	    $tty_saved_state =~ s/\s+$//g;
+	    $tty_restore = qq($stty "$tty_saved_state" 2>/dev/null);
+	}
+    }
+    system $tty_raw_noecho if defined $tty_raw_noecho;
+    LOOP: {
+        local $_;
+        print($prompt, $return);
+        while (($_ = getc(STDIN)) ne "\r") {
+            CASE: {
+                # (TAB) attempt completion
+                $_ eq "\t" && do {
+                    @match = grep(/^\Q$return/, @cmp_lst);
+                    unless ($#match < 0) {
+                        $l = length($test = shift(@match));
+                        foreach $cmp (@match) {
+                            until (substr($cmp, 0, $l) eq substr($test, 0, $l)) {
+                                $l--;
+                            }
+                        }
+                        print("\a");
+                        print($test = substr($test, $r, $l - $r));
+                        $r = length($return .= $test);
+                    }
+                    last CASE;
+                };
+
+                # (^D) completion list
+                $_ eq $complete && do {
+                    print(join("\r\n", '', grep(/^\Q$return/, @cmp_lst)), "\r\n");
+                    redo LOOP;
+                };
+
+                # (^U) kill
+                $_ eq $kill && do {
+                    if ($r) {
+                        $r	= 0;
+			$return	= "";
+                        print("\r\n");
+                        redo LOOP;
+                    }
+                    last CASE;
+                };
+
+                # (DEL) || (BS) erase
+                ($_ eq $erase1 || $_ eq $erase2) && do {
+                    if($r) {
+                        print("\b \b");
+                        chop($return);
+                        $r--;
+                    }
+                    last CASE;
+                };
+
+                # printable char
+                ord >= 32 && do {
+                    $return .= $_;
+                    $r++;
+                    print;
+                    last CASE;
+                };
+            }
+        }
+    }
+
+    # system $tty_restore if defined $tty_restore;
+    if (defined $tty_saved_state && defined $tty_restore && defined $tty_safe_restore)
+    {
+	system $tty_restore;
+	if ($?) {
+	    # tty_restore caused error
+	    system $tty_safe_restore;
+	}
+    }
+    print("\n");
+    $return;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Term/ReadLine.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Term/ReadLine.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Term/ReadLine.pm	(revision 14489)
@@ -0,0 +1,399 @@
+=head1 NAME
+
+Term::ReadLine - Perl interface to various C<readline> packages.
+If no real package is found, substitutes stubs instead of basic functions.
+
+=head1 SYNOPSIS
+
+  use Term::ReadLine;
+  my $term = new Term::ReadLine 'Simple Perl calc';
+  my $prompt = "Enter your arithmetic expression: ";
+  my $OUT = $term->OUT || \*STDOUT;
+  while ( defined ($_ = $term->readline($prompt)) ) {
+    my $res = eval($_);
+    warn $@ if $@;
+    print $OUT $res, "\n" unless $@;
+    $term->addhistory($_) if /\S/;
+  }
+
+=head1 DESCRIPTION
+
+This package is just a front end to some other packages. It's a stub to
+set up a common interface to the various ReadLine implementations found on
+CPAN (under the C<Term::ReadLine::*> namespace).
+
+=head1 Minimal set of supported functions
+
+All the supported functions should be called as methods, i.e., either as 
+
+  $term = new Term::ReadLine 'name';
+
+or as 
+
+  $term->addhistory('row');
+
+where $term is a return value of Term::ReadLine-E<gt>new().
+
+=over 12
+
+=item C<ReadLine>
+
+returns the actual package that executes the commands. Among possible
+values are C<Term::ReadLine::Gnu>, C<Term::ReadLine::Perl>,
+C<Term::ReadLine::Stub>.
+
+=item C<new>
+
+returns the handle for subsequent calls to following
+functions. Argument is the name of the application. Optionally can be
+followed by two arguments for C<IN> and C<OUT> filehandles. These
+arguments should be globs.
+
+=item C<readline>
+
+gets an input line, I<possibly> with actual C<readline>
+support. Trailing newline is removed. Returns C<undef> on C<EOF>.
+
+=item C<addhistory>
+
+adds the line to the history of input, from where it can be used if
+the actual C<readline> is present.
+
+=item C<IN>, C<OUT>
+
+return the filehandles for input and output or C<undef> if C<readline>
+input and output cannot be used for Perl.
+
+=item C<MinLine>
+
+If argument is specified, it is an advice on minimal size of line to
+be included into history.  C<undef> means do not include anything into
+history. Returns the old value.
+
+=item C<findConsole>
+
+returns an array with two strings that give most appropriate names for
+files for input and output using conventions C<"E<lt>$in">, C<"E<gt>out">.
+
+=item Attribs
+
+returns a reference to a hash which describes internal configuration
+of the package. Names of keys in this hash conform to standard
+conventions with the leading C<rl_> stripped.
+
+=item C<Features>
+
+Returns a reference to a hash with keys being features present in
+current implementation. Several optional features are used in the
+minimal interface: C<appname> should be present if the first argument
+to C<new> is recognized, and C<minline> should be present if
+C<MinLine> method is not dummy.  C<autohistory> should be present if
+lines are put into history automatically (maybe subject to
+C<MinLine>), and C<addhistory> if C<addhistory> method is not dummy.
+
+If C<Features> method reports a feature C<attribs> as present, the
+method C<Attribs> is not dummy.
+
+=back
+
+=head1 Additional supported functions
+
+Actually C<Term::ReadLine> can use some other package, that will
+support a richer set of commands.
+
+All these commands are callable via method interface and have names
+which conform to standard conventions with the leading C<rl_> stripped.
+
+The stub package included with the perl distribution allows some
+additional methods: 
+
+=over 12
+
+=item C<tkRunning>
+
+makes Tk event loop run when waiting for user input (i.e., during
+C<readline> method).
+
+=item C<ornaments>
+
+makes the command line stand out by using termcap data.  The argument
+to C<ornaments> should be 0, 1, or a string of a form
+C<"aa,bb,cc,dd">.  Four components of this string should be names of
+I<terminal capacities>, first two will be issued to make the prompt
+standout, last two to make the input line standout.
+
+=item C<newTTY>
+
+takes two arguments which are input filehandle and output filehandle.
+Switches to use these filehandles.
+
+=back
+
+One can check whether the currently loaded ReadLine package supports
+these methods by checking for corresponding C<Features>.
+
+=head1 EXPORTS
+
+None
+
+=head1 ENVIRONMENT
+
+The environment variable C<PERL_RL> governs which ReadLine clone is
+loaded. If the value is false, a dummy interface is used. If the value
+is true, it should be tail of the name of the package to use, such as
+C<Perl> or C<Gnu>.  
+
+As a special case, if the value of this variable is space-separated,
+the tail might be used to disable the ornaments by setting the tail to
+be C<o=0> or C<ornaments=0>.  The head should be as described above, say
+
+If the variable is not set, or if the head of space-separated list is
+empty, the best available package is loaded.
+
+  export "PERL_RL=Perl o=0"	# Use Perl ReadLine without ornaments
+  export "PERL_RL= o=0"		# Use best available ReadLine without ornaments
+
+(Note that processing of C<PERL_RL> for ornaments is in the discretion of the 
+particular used C<Term::ReadLine::*> package).
+
+=head1 CAVEATS
+
+It seems that using Term::ReadLine from Emacs minibuffer doesn't work
+quite right and one will get an error message like
+
+    Cannot open /dev/tty for read at ...
+
+One possible workaround for this is to explicitly open /dev/tty like this
+
+    open (FH, "/dev/tty" )
+      or eval 'sub Term::ReadLine::findConsole { ("&STDIN", "&STDERR") }';
+    die $@ if $@;
+    close (FH);
+
+or you can try using the 4-argument form of Term::ReadLine->new().
+
+=cut
+
+use strict;
+
+package Term::ReadLine::Stub;
+our @ISA = qw'Term::ReadLine::Tk Term::ReadLine::TermCap';
+
+$DB::emacs = $DB::emacs;	# To peacify -w
+our @rl_term_set;
+*rl_term_set = \@Term::ReadLine::TermCap::rl_term_set;
+
+sub PERL_UNICODE_STDIN () { 0x0001 }
+
+sub ReadLine {'Term::ReadLine::Stub'}
+sub readline {
+  my $self = shift;
+  my ($in,$out,$str) = @$self;
+  my $prompt = shift;
+  print $out $rl_term_set[0], $prompt, $rl_term_set[1], $rl_term_set[2]; 
+  $self->register_Tk 
+     if not $Term::ReadLine::registered and $Term::ReadLine::toloop
+	and defined &Tk::DoOneEvent;
+  #$str = scalar <$in>;
+  $str = $self->get_line;
+  $str =~ s/^\s*\Q$prompt\E// if ($^O eq 'MacOS');
+  utf8::upgrade($str)
+      if (${^UNICODE} & PERL_UNICODE_STDIN || defined ${^ENCODING}) &&
+         utf8::valid($str);
+  print $out $rl_term_set[3]; 
+  # bug in 5.000: chomping empty string creats length -1:
+  chomp $str if defined $str;
+  $str;
+}
+sub addhistory {}
+
+sub findConsole {
+    my $console;
+
+    if ($^O eq 'MacOS') {
+        $console = "Dev:Console";
+    } elsif (-e "/dev/tty") {
+	$console = "/dev/tty";
+    } elsif (-e "con" or $^O eq 'MSWin32') {
+	$console = "con";
+    } else {
+	$console = "sys\$command";
+    }
+
+    if (($^O eq 'amigaos') || ($^O eq 'beos') || ($^O eq 'epoc')) {
+	$console = undef;
+    }
+    elsif ($^O eq 'os2') {
+      if ($DB::emacs) {
+	$console = undef;
+      } else {
+	$console = "/dev/con";
+      }
+    }
+
+    my $consoleOUT = $console;
+    $console = "&STDIN" unless defined $console;
+    if (!defined $consoleOUT) {
+      $consoleOUT = defined fileno(STDERR) ? "&STDERR" : "&STDOUT";
+    }
+    ($console,$consoleOUT);
+}
+
+sub new {
+  die "method new called with wrong number of arguments" 
+    unless @_==2 or @_==4;
+  #local (*FIN, *FOUT);
+  my ($FIN, $FOUT, $ret);
+  if (@_==2) {
+    my($console, $consoleOUT) = $_[0]->findConsole;
+
+    open(FIN, "<$console"); 
+    open(FOUT,">$consoleOUT");
+    #OUT->autoflush(1);		# Conflicts with debugger?
+    my $sel = select(FOUT);
+    $| = 1;				# for DB::OUT
+    select($sel);
+    $ret = bless [\*FIN, \*FOUT];
+  } else {			# Filehandles supplied
+    $FIN = $_[2]; $FOUT = $_[3];
+    #OUT->autoflush(1);		# Conflicts with debugger?
+    my $sel = select($FOUT);
+    $| = 1;				# for DB::OUT
+    select($sel);
+    $ret = bless [$FIN, $FOUT];
+  }
+  if ($ret->Features->{ornaments} 
+      and not ($ENV{PERL_RL} and $ENV{PERL_RL} =~ /\bo\w*=0/)) {
+    local $Term::ReadLine::termcap_nowarn = 1;
+    $ret->ornaments(1);
+  }
+  return $ret;
+}
+
+sub newTTY {
+  my ($self, $in, $out) = @_;
+  $self->[0] = $in;
+  $self->[1] = $out;
+  my $sel = select($out);
+  $| = 1;				# for DB::OUT
+  select($sel);
+}
+
+sub IN { shift->[0] }
+sub OUT { shift->[1] }
+sub MinLine { undef }
+sub Attribs { {} }
+
+my %features = (tkRunning => 1, ornaments => 1, 'newTTY' => 1);
+sub Features { \%features }
+
+package Term::ReadLine;		# So late to allow the above code be defined?
+
+our $VERSION = '1.02';
+
+my ($which) = exists $ENV{PERL_RL} ? split /\s+/, $ENV{PERL_RL} : undef;
+if ($which) {
+  if ($which =~ /\bgnu\b/i){
+    eval "use Term::ReadLine::Gnu;";
+  } elsif ($which =~ /\bperl\b/i) {
+    eval "use Term::ReadLine::Perl;";
+  } else {
+    eval "use Term::ReadLine::$which;";
+  }
+} elsif (defined $which and $which ne '') {	# Defined but false
+  # Do nothing fancy
+} else {
+  eval "use Term::ReadLine::Gnu; 1" or eval "use Term::ReadLine::Perl; 1";
+}
+
+#require FileHandle;
+
+# To make possible switch off RL in debugger: (Not needed, work done
+# in debugger).
+our @ISA;
+if (defined &Term::ReadLine::Gnu::readline) {
+  @ISA = qw(Term::ReadLine::Gnu Term::ReadLine::Stub);
+} elsif (defined &Term::ReadLine::Perl::readline) {
+  @ISA = qw(Term::ReadLine::Perl Term::ReadLine::Stub);
+} elsif (defined $which && defined &{"Term::ReadLine::$which\::readline"}) {
+  @ISA = "Term::ReadLine::$which";
+} else {
+  @ISA = qw(Term::ReadLine::Stub);
+}
+
+package Term::ReadLine::TermCap;
+
+# Prompt-start, prompt-end, command-line-start, command-line-end
+#     -- zero-width beautifies to emit around prompt and the command line.
+our @rl_term_set = ("","","","");
+# string encoded:
+our $rl_term_set = ',,,';
+
+our $terminal;
+sub LoadTermCap {
+  return if defined $terminal;
+  
+  require Term::Cap;
+  $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning.
+}
+
+sub ornaments {
+  shift;
+  return $rl_term_set unless @_;
+  $rl_term_set = shift;
+  $rl_term_set ||= ',,,';
+  $rl_term_set = 'us,ue,md,me' if $rl_term_set eq '1';
+  my @ts = split /,/, $rl_term_set, 4;
+  eval { LoadTermCap };
+  unless (defined $terminal) {
+    warn("Cannot find termcap: $@\n") unless $Term::ReadLine::termcap_nowarn;
+    $rl_term_set = ',,,';
+    return;
+  }
+  @rl_term_set = map {$_ ? $terminal->Tputs($_,1) || '' : ''} @ts;
+  return $rl_term_set;
+}
+
+
+package Term::ReadLine::Tk;
+
+our($count_handle, $count_DoOne, $count_loop);
+$count_handle = $count_DoOne = $count_loop = 0;
+
+our($giveup);
+sub handle {$giveup = 1; $count_handle++}
+
+sub Tk_loop {
+  # Tk->tkwait('variable',\$giveup);	# needs Widget
+  $count_DoOne++, Tk::DoOneEvent(0) until $giveup;
+  $count_loop++;
+  $giveup = 0;
+}
+
+sub register_Tk {
+  my $self = shift;
+  $Term::ReadLine::registered++ 
+    or Tk->fileevent($self->IN,'readable',\&handle);
+}
+
+sub tkRunning {
+  $Term::ReadLine::toloop = $_[1] if @_ > 1;
+  $Term::ReadLine::toloop;
+}
+
+sub get_c {
+  my $self = shift;
+  $self->Tk_loop if $Term::ReadLine::toloop && defined &Tk::DoOneEvent;
+  return getc $self->IN;
+}
+
+sub get_line {
+  my $self = shift;
+  $self->Tk_loop if $Term::ReadLine::toloop && defined &Tk::DoOneEvent;
+  my $in = $self->IN;
+  local ($/) = "\n";
+  return scalar <$in>;
+}
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Test.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test.pm	(revision 14489)
@@ -0,0 +1,955 @@
+
+require 5.004;
+package Test;
+# Time-stamp: "2004-04-28 21:46:51 ADT"
+
+use strict;
+
+use Carp;
+use vars (qw($VERSION @ISA @EXPORT @EXPORT_OK $ntest $TestLevel), #public-ish
+          qw($TESTOUT $TESTERR %Program_Lines $told_about_diff
+             $ONFAIL %todo %history $planned @FAILDETAIL) #private-ish
+         );
+
+# In case a test is run in a persistent environment.
+sub _reset_globals {
+    %todo       = ();
+    %history    = ();
+    @FAILDETAIL = ();
+    $ntest      = 1;
+    $TestLevel  = 0;		# how many extra stack frames to skip
+    $planned    = 0;
+}
+
+$VERSION = '1.25';
+require Exporter;
+@ISA=('Exporter');
+
+@EXPORT    = qw(&plan &ok &skip);
+@EXPORT_OK = qw($ntest $TESTOUT $TESTERR);
+
+$|=1;
+$TESTOUT = *STDOUT{IO};
+$TESTERR = *STDERR{IO};
+
+# Use of this variable is strongly discouraged.  It is set mainly to
+# help test coverage analyzers know which test is running.
+$ENV{REGRESSION_TEST} = $0;
+
+
+=head1 NAME
+
+Test - provides a simple framework for writing test scripts
+
+=head1 SYNOPSIS
+
+  use strict;
+  use Test;
+
+  # use a BEGIN block so we print our plan before MyModule is loaded
+  BEGIN { plan tests => 14, todo => [3,4] }
+
+  # load your module...
+  use MyModule;
+
+  # Helpful notes.  All note-lines must start with a "#".
+  print "# I'm testing MyModule version $MyModule::VERSION\n";
+
+  ok(0); # failure
+  ok(1); # success
+
+  ok(0); # ok, expected failure (see todo list, above)
+  ok(1); # surprise success!
+
+  ok(0,1);             # failure: '0' ne '1'
+  ok('broke','fixed'); # failure: 'broke' ne 'fixed'
+  ok('fixed','fixed'); # success: 'fixed' eq 'fixed'
+  ok('fixed',qr/x/);   # success: 'fixed' =~ qr/x/
+
+  ok(sub { 1+1 }, 2);  # success: '2' eq '2'
+  ok(sub { 1+1 }, 3);  # failure: '2' ne '3'
+
+  my @list = (0,0);
+  ok @list, 3, "\@list=".join(',',@list);      #extra notes
+  ok 'segmentation fault', '/(?i)success/';    #regex match
+
+  skip(
+    $^O =~ m/MSWin/ ? "Skip if MSWin" : 0,  # whether to skip
+    $foo, $bar  # arguments just like for ok(...)
+  );
+  skip(
+    $^O =~ m/MSWin/ ? 0 : "Skip unless MSWin",  # whether to skip
+    $foo, $bar  # arguments just like for ok(...)
+  );
+
+=head1 DESCRIPTION
+
+This module simplifies the task of writing test files for Perl modules,
+such that their output is in the format that
+L<Test::Harness|Test::Harness> expects to see.
+
+=head1 QUICK START GUIDE
+
+To write a test for your new (and probably not even done) module, create
+a new file called F<t/test.t> (in a new F<t> directory). If you have
+multiple test files, to test the "foo", "bar", and "baz" feature sets,
+then feel free to call your files F<t/foo.t>, F<t/bar.t>, and
+F<t/baz.t>
+
+=head2 Functions
+
+This module defines three public functions, C<plan(...)>, C<ok(...)>,
+and C<skip(...)>.  By default, all three are exported by
+the C<use Test;> statement.
+
+=over 4
+
+=item C<plan(...)>
+
+     BEGIN { plan %theplan; }
+
+This should be the first thing you call in your test script.  It
+declares your testing plan, how many there will be, if any of them
+should be allowed to fail, and so on.
+
+Typical usage is just:
+
+     use Test;
+     BEGIN { plan tests => 23 }
+
+These are the things that you can put in the parameters to plan:
+
+=over
+
+=item C<tests =E<gt> I<number>>
+
+The number of tests in your script.
+This means all ok() and skip() calls.
+
+=item C<todo =E<gt> [I<1,5,14>]>
+
+A reference to a list of tests which are allowed to fail.
+See L</TODO TESTS>.
+
+=item C<onfail =E<gt> sub { ... }>
+
+=item C<onfail =E<gt> \&some_sub>
+
+A subroutine reference to be run at the end of the test script, if
+any of the tests fail.  See L</ONFAIL>.
+
+=back
+
+You must call C<plan(...)> once and only once.  You should call it
+in a C<BEGIN {...}> block, like so:
+
+     BEGIN { plan tests => 23 }
+
+=cut
+
+sub plan {
+    croak "Test::plan(%args): odd number of arguments" if @_ & 1;
+    croak "Test::plan(): should not be called more than once" if $planned;
+
+    local($\, $,);   # guard against -l and other things that screw with
+                     # print
+
+    _reset_globals();
+
+    _read_program( (caller)[1] );
+
+    my $max=0;
+    while (@_) {
+	my ($k,$v) = splice(@_, 0, 2);
+	if ($k =~ /^test(s)?$/) { $max = $v; }
+	elsif ($k eq 'todo' or
+	       $k eq 'failok') { for (@$v) { $todo{$_}=1; }; }
+	elsif ($k eq 'onfail') {
+	    ref $v eq 'CODE' or croak "Test::plan(onfail => $v): must be CODE";
+	    $ONFAIL = $v;
+	}
+	else { carp "Test::plan(): skipping unrecognized directive '$k'" }
+    }
+    my @todo = sort { $a <=> $b } keys %todo;
+    if (@todo) {
+	print $TESTOUT "1..$max todo ".join(' ', @todo).";\n";
+    } else {
+	print $TESTOUT "1..$max\n";
+    }
+    ++$planned;
+    print $TESTOUT "# Running under perl version $] for $^O",
+      (chr(65) eq 'A') ? "\n" : " in a non-ASCII world\n";
+
+    print $TESTOUT "# Win32::BuildNumber ", &Win32::BuildNumber(), "\n"
+      if defined(&Win32::BuildNumber) and defined &Win32::BuildNumber();
+
+    print $TESTOUT "# MacPerl version $MacPerl::Version\n"
+      if defined $MacPerl::Version;
+
+    printf $TESTOUT
+      "# Current time local: %s\n# Current time GMT:   %s\n",
+      scalar(localtime($^T)), scalar(gmtime($^T));
+
+    print $TESTOUT "# Using Test.pm version $VERSION\n";
+
+    # Retval never used:
+    return undef;
+}
+
+sub _read_program {
+  my($file) = shift;
+  return unless defined $file and length $file
+    and -e $file and -f _ and -r _;
+  open(SOURCEFILE, "<$file") || return;
+  $Program_Lines{$file} = [<SOURCEFILE>];
+  close(SOURCEFILE);
+
+  foreach my $x (@{$Program_Lines{$file}})
+   { $x =~ tr/\cm\cj\n\r//d }
+
+  unshift @{$Program_Lines{$file}}, '';
+  return 1;
+}
+
+=begin _private
+
+=item B<_to_value>
+
+  my $value = _to_value($input);
+
+Converts an C<ok> parameter to its value.  Typically this just means
+running it, if it's a code reference.  You should run all inputted
+values through this.
+
+=cut
+
+sub _to_value {
+    my ($v) = @_;
+    return ref $v eq 'CODE' ? $v->() : $v;
+}
+
+sub _quote {
+    my $str = $_[0];
+    return "<UNDEF>" unless defined $str;
+    $str =~ s/\\/\\\\/g;
+    $str =~ s/"/\\"/g;
+    $str =~ s/\a/\\a/g;
+    $str =~ s/[\b]/\\b/g;
+    $str =~ s/\e/\\e/g;
+    $str =~ s/\f/\\f/g;
+    $str =~ s/\n/\\n/g;
+    $str =~ s/\r/\\r/g;
+    $str =~ s/\t/\\t/g;
+    $str =~ s/([\0-\037])(?!\d)/sprintf('\\%o',ord($1))/eg;
+    $str =~ s/([\0-\037\177-\377])/sprintf('\\x%02X',ord($1))/eg;
+    $str =~ s/([^\0-\176])/sprintf('\\x{%X}',ord($1))/eg;
+    #if( $_[1] ) {
+    #  substr( $str , 218-3 ) = "..."
+    #   if length($str) >= 218 and !$ENV{PERL_TEST_NO_TRUNC};
+    #}
+    return qq("$str");
+}
+
+
+=end _private
+
+=item C<ok(...)>
+
+  ok(1 + 1 == 2);
+  ok($have, $expect);
+  ok($have, $expect, $diagnostics);
+
+This function is the reason for C<Test>'s existence.  It's
+the basic function that
+handles printing "C<ok>" or "C<not ok>", along with the
+current test number.  (That's what C<Test::Harness> wants to see.)
+
+In its most basic usage, C<ok(...)> simply takes a single scalar
+expression.  If its value is true, the test passes; if false,
+the test fails.  Examples:
+
+    # Examples of ok(scalar)
+
+    ok( 1 + 1 == 2 );           # ok if 1 + 1 == 2
+    ok( $foo =~ /bar/ );        # ok if $foo contains 'bar'
+    ok( baz($x + $y) eq 'Armondo' );    # ok if baz($x + $y) returns
+                                        # 'Armondo'
+    ok( @a == @b );             # ok if @a and @b are the same length
+
+The expression is evaluated in scalar context.  So the following will
+work:
+
+    ok( @stuff );                       # ok if @stuff has any elements
+    ok( !grep !defined $_, @stuff );    # ok if everything in @stuff is
+                                        # defined.
+
+A special case is if the expression is a subroutine reference (in either
+C<sub {...}> syntax or C<\&foo> syntax).  In
+that case, it is executed and its value (true or false) determines if
+the test passes or fails.  For example,
+
+    ok( sub {   # See whether sleep works at least passably
+      my $start_time = time;
+      sleep 5;
+      time() - $start_time  >= 4
+    });
+
+In its two-argument form, C<ok(I<arg1>, I<arg2>)> compares the two
+scalar values to see if they match.  They match if both are undefined,
+or if I<arg2> is a regex that matches I<arg1>, or if they compare equal
+with C<eq>.
+
+    # Example of ok(scalar, scalar)
+
+    ok( "this", "that" );               # not ok, 'this' ne 'that'
+    ok( "", undef );                    # not ok, "" is defined
+
+The second argument is considered a regex if it is either a regex
+object or a string that looks like a regex.  Regex objects are
+constructed with the qr// operator in recent versions of perl.  A
+string is considered to look like a regex if its first and last
+characters are "/", or if the first character is "m"
+and its second and last characters are both the
+same non-alphanumeric non-whitespace character.  These regexp
+
+Regex examples:
+
+    ok( 'JaffO', '/Jaff/' );    # ok, 'JaffO' =~ /Jaff/
+    ok( 'JaffO', 'm|Jaff|' );   # ok, 'JaffO' =~ m|Jaff|
+    ok( 'JaffO', qr/Jaff/ );    # ok, 'JaffO' =~ qr/Jaff/;
+    ok( 'JaffO', '/(?i)jaff/ ); # ok, 'JaffO' =~ /jaff/i;
+
+If either (or both!) is a subroutine reference, it is run and used
+as the value for comparing.  For example:
+
+    ok sub {
+        open(OUT, ">x.dat") || die $!;
+        print OUT "\x{e000}";
+        close OUT;
+        my $bytecount = -s 'x.dat';
+        unlink 'x.dat' or warn "Can't unlink : $!";
+        return $bytecount;
+      },
+      4
+    ;
+
+The above test passes two values to C<ok(arg1, arg2)> -- the first 
+a coderef, and the second is the number 4.  Before C<ok> compares them,
+it calls the coderef, and uses its return value as the real value of
+this parameter. Assuming that C<$bytecount> returns 4, C<ok> ends up
+testing C<4 eq 4>.  Since that's true, this test passes.
+
+Finally, you can append an optional third argument, in
+C<ok(I<arg1>,I<arg2>, I<note>)>, where I<note> is a string value that
+will be printed if the test fails.  This should be some useful
+information about the test, pertaining to why it failed, and/or
+a description of the test.  For example:
+
+    ok( grep($_ eq 'something unique', @stuff), 1,
+        "Something that should be unique isn't!\n".
+        '@stuff = '.join ', ', @stuff
+      );
+
+Unfortunately, a note cannot be used with the single argument
+style of C<ok()>.  That is, if you try C<ok(I<arg1>, I<note>)>, then
+C<Test> will interpret this as C<ok(I<arg1>, I<arg2>)>, and probably
+end up testing C<I<arg1> eq I<arg2>> -- and that's not what you want!
+
+All of the above special cases can occasionally cause some
+problems.  See L</BUGS and CAVEATS>.
+
+=cut
+
+# A past maintainer of this module said:
+# <<ok(...)'s special handling of subroutine references is an unfortunate
+#   "feature" that can't be removed due to compatibility.>>
+#
+
+sub ok ($;$$) {
+    croak "ok: plan before you test!" if !$planned;
+
+    local($\,$,);   # guard against -l and other things that screw with
+                    # print
+
+    my ($pkg,$file,$line) = caller($TestLevel);
+    my $repetition = ++$history{"$file:$line"};
+    my $context = ("$file at line $line".
+		   ($repetition > 1 ? " fail \#$repetition" : ''));
+
+    # Are we comparing two values?
+    my $compare = 0;
+
+    my $ok=0;
+    my $result = _to_value(shift);
+    my ($expected, $isregex, $regex);
+    if (@_ == 0) {
+	$ok = $result;
+    } else {
+        $compare = 1;
+	$expected = _to_value(shift);
+	if (!defined $expected) {
+	    $ok = !defined $result;
+	} elsif (!defined $result) {
+	    $ok = 0;
+	} elsif (ref($expected) eq 'Regexp') {
+	    $ok = $result =~ /$expected/;
+            $regex = $expected;
+	} elsif (($regex) = ($expected =~ m,^ / (.+) / $,sx) or
+	    (undef, $regex) = ($expected =~ m,^ m([^\w\s]) (.+) \1 $,sx)) {
+	    $ok = $result =~ /$regex/;
+	} else {
+	    $ok = $result eq $expected;
+	}
+    }
+    my $todo = $todo{$ntest};
+    if ($todo and $ok) {
+	$context .= ' TODO?!' if $todo;
+	print $TESTOUT "ok $ntest # ($context)\n";
+    } else {
+        # Issuing two seperate prints() causes problems on VMS.
+        if (!$ok) {
+            print $TESTOUT "not ok $ntest\n";
+        }
+	else {
+            print $TESTOUT "ok $ntest\n";
+        }
+
+        $ok or _complain($result, $expected,
+        {
+          'repetition' => $repetition, 'package' => $pkg,
+          'result' => $result, 'todo' => $todo,
+          'file' => $file, 'line' => $line,
+          'context' => $context, 'compare' => $compare,
+          @_ ? ('diagnostic' =>  _to_value(shift)) : (),
+        });
+
+    }
+    ++ $ntest;
+    $ok;
+}
+
+
+sub _complain {
+    my($result, $expected, $detail) = @_;
+    $$detail{expected} = $expected if defined $expected;
+
+    # Get the user's diagnostic, protecting against multi-line
+    # diagnostics.
+    my $diag = $$detail{diagnostic};
+    $diag =~ s/\n/\n#/g if defined $diag;
+
+    $$detail{context} .= ' *TODO*' if $$detail{todo};
+    if (!$$detail{compare}) {
+        if (!$diag) {
+            print $TESTERR "# Failed test $ntest in $$detail{context}\n";
+        } else {
+            print $TESTERR "# Failed test $ntest in $$detail{context}: $diag\n";
+        }
+    } else {
+        my $prefix = "Test $ntest";
+
+        print $TESTERR "# $prefix got: " . _quote($result) .
+                       " ($$detail{context})\n";
+        $prefix = ' ' x (length($prefix) - 5);
+        my $expected_quoted = (defined $$detail{regex})
+         ?  'qr{'.($$detail{regex}).'}'  :  _quote($expected);
+
+        print $TESTERR "# $prefix Expected: $expected_quoted",
+           $diag ? " ($diag)" : (), "\n";
+
+        _diff_complain( $result, $expected, $detail, $prefix )
+          if defined($expected) and 2 < ($expected =~ tr/\n//);
+    }
+
+    if(defined $Program_Lines{ $$detail{file} }[ $$detail{line} ]) {
+        print $TESTERR
+          "#  $$detail{file} line $$detail{line} is: $Program_Lines{ $$detail{file} }[ $$detail{line} ]\n"
+         if $Program_Lines{ $$detail{file} }[ $$detail{line} ]
+          =~ m/[^\s\#\(\)\{\}\[\]\;]/;  # Otherwise it's uninformative
+
+        undef $Program_Lines{ $$detail{file} }[ $$detail{line} ];
+         # So we won't repeat it.
+    }
+
+    push @FAILDETAIL, $detail;
+    return;
+}
+
+
+
+sub _diff_complain {
+    my($result, $expected, $detail, $prefix) = @_;
+    return _diff_complain_external(@_) if $ENV{PERL_TEST_DIFF};
+    return _diff_complain_algdiff(@_)
+     if eval { require Algorithm::Diff; Algorithm::Diff->VERSION(1.15); 1; };
+
+    $told_about_diff++ or print $TESTERR <<"EOT";
+# $prefix   (Install the Algorithm::Diff module to have differences in multiline
+# $prefix    output explained.  You might also set the PERL_TEST_DIFF environment
+# $prefix    variable to run a diff program on the output.)
+EOT
+    ;
+    return;
+}
+
+
+
+sub _diff_complain_external {
+    my($result, $expected, $detail, $prefix) = @_;
+    my $diff = $ENV{PERL_TEST_DIFF} || die "WHAAAA?";
+
+    require File::Temp;
+    my($got_fh, $got_filename) = File::Temp::tempfile("test-got-XXXXX");
+    my($exp_fh, $exp_filename) = File::Temp::tempfile("test-exp-XXXXX");
+    unless ($got_fh && $exp_fh) {
+      warn "Can't get tempfiles";
+      return;
+    }
+
+    print $got_fh $result;
+    print $exp_fh $expected;
+    if (close($got_fh) && close($exp_fh)) {
+        my $diff_cmd = "$diff $exp_filename $got_filename";
+        print $TESTERR "#\n# $prefix $diff_cmd\n";
+        if (open(DIFF, "$diff_cmd |")) {
+            local $_;
+            while (<DIFF>) {
+                print $TESTERR "# $prefix $_";
+            }
+            close(DIFF);
+        }
+        else {
+            warn "Can't run diff: $!";
+        }
+    } else {
+        warn "Can't write to tempfiles: $!";
+    }
+    unlink($got_filename);
+    unlink($exp_filename);
+    return;
+}
+
+
+
+sub _diff_complain_algdiff {
+    my($result, $expected, $detail, $prefix) = @_;
+
+    my @got = split(/^/, $result);
+    my @exp = split(/^/, $expected);
+
+    my $diff_kind;
+    my @diff_lines;
+
+    my $diff_flush = sub {
+        return unless $diff_kind;
+
+        my $count_lines = @diff_lines;
+        my $s = $count_lines == 1 ? "" : "s";
+        my $first_line = $diff_lines[0][0] + 1;
+
+        print $TESTERR "# $prefix ";
+        if ($diff_kind eq "GOT") {
+            print $TESTERR "Got $count_lines extra line$s at line $first_line:\n";
+            for my $i (@diff_lines) {
+                print $TESTERR "# $prefix  + " . _quote($got[$i->[0]]) . "\n";
+            }
+        } elsif ($diff_kind eq "EXP") {
+            if ($count_lines > 1) {
+                my $last_line = $diff_lines[-1][0] + 1;
+                print $TESTERR "Lines $first_line-$last_line are";
+            }
+            else {
+                print $TESTERR "Line $first_line is";
+            }
+            print $TESTERR " missing:\n";
+            for my $i (@diff_lines) {
+                print $TESTERR "# $prefix  - " . _quote($exp[$i->[1]]) . "\n";
+            }
+        } elsif ($diff_kind eq "CH") {
+            if ($count_lines > 1) {
+                my $last_line = $diff_lines[-1][0] + 1;
+                print $TESTERR "Lines $first_line-$last_line are";
+            }
+            else {
+                print $TESTERR "Line $first_line is";
+            }
+            print $TESTERR " changed:\n";
+            for my $i (@diff_lines) {
+                print $TESTERR "# $prefix  - " . _quote($exp[$i->[1]]) . "\n";
+                print $TESTERR "# $prefix  + " . _quote($got[$i->[0]]) . "\n";
+            }
+        }
+
+        # reset
+        $diff_kind = undef;
+        @diff_lines = ();
+    };
+
+    my $diff_collect = sub {
+        my $kind = shift;
+        &$diff_flush() if $diff_kind && $diff_kind ne $kind;
+        $diff_kind = $kind;
+        push(@diff_lines, [@_]);
+    };
+
+
+    Algorithm::Diff::traverse_balanced(
+        \@got, \@exp,
+        {
+            DISCARD_A => sub { &$diff_collect("GOT", @_) },
+            DISCARD_B => sub { &$diff_collect("EXP", @_) },
+            CHANGE    => sub { &$diff_collect("CH",  @_) },
+            MATCH     => sub { &$diff_flush() },
+        },
+    );
+    &$diff_flush();
+
+    return;
+}
+
+
+
+
+#~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~
+
+
+=item C<skip(I<skip_if_true>, I<args...>)>
+
+This is used for tests that under some conditions can be skipped.  It's
+basically equivalent to:
+
+  if( $skip_if_true ) {
+    ok(1);
+  } else {
+    ok( args... );
+  }
+
+...except that the C<ok(1)> emits not just "C<ok I<testnum>>" but
+actually "C<ok I<testnum> # I<skip_if_true_value>>".
+
+The arguments after the I<skip_if_true> are what is fed to C<ok(...)> if
+this test isn't skipped.
+
+Example usage:
+
+  my $if_MSWin =
+    $^O =~ m/MSWin/ ? 'Skip if under MSWin' : '';
+
+  # A test to be skipped if under MSWin (i.e., run except under MSWin)
+  skip($if_MSWin, thing($foo), thing($bar) );
+
+Or, going the other way:
+
+  my $unless_MSWin =
+    $^O =~ m/MSWin/ ? '' : 'Skip unless under MSWin';
+
+  # A test to be skipped unless under MSWin (i.e., run only under MSWin)
+  skip($unless_MSWin, thing($foo), thing($bar) );
+
+The tricky thing to remember is that the first parameter is true if
+you want to I<skip> the test, not I<run> it; and it also doubles as a
+note about why it's being skipped. So in the first codeblock above, read
+the code as "skip if MSWin -- (otherwise) test whether C<thing($foo)> is
+C<thing($bar)>" or for the second case, "skip unless MSWin...".
+
+Also, when your I<skip_if_reason> string is true, it really should (for
+backwards compatibility with older Test.pm versions) start with the
+string "Skip", as shown in the above examples.
+
+Note that in the above cases, C<thing($foo)> and C<thing($bar)>
+I<are> evaluated -- but as long as the C<skip_if_true> is true,
+then we C<skip(...)> just tosses out their value (i.e., not
+bothering to treat them like values to C<ok(...)>.  But if
+you need to I<not> eval the arguments when skipping the
+test, use
+this format:
+
+  skip( $unless_MSWin,
+    sub {
+      # This code returns true if the test passes.
+      # (But it doesn't even get called if the test is skipped.)
+      thing($foo) eq thing($bar)
+    }
+  );
+
+or even this, which is basically equivalent:
+
+  skip( $unless_MSWin,
+    sub { thing($foo) }, sub { thing($bar) }
+  );
+
+That is, both are like this:
+
+  if( $unless_MSWin ) {
+    ok(1);  # but it actually appends "# $unless_MSWin"
+            #  so that Test::Harness can tell it's a skip
+  } else {
+    # Not skipping, so actually call and evaluate...
+    ok( sub { thing($foo) }, sub { thing($bar) } );
+  }
+
+=cut
+
+sub skip ($;$$$) {
+    local($\, $,);   # guard against -l and other things that screw with
+                     # print
+
+    my $whyskip = _to_value(shift);
+    if (!@_ or $whyskip) {
+	$whyskip = '' if $whyskip =~ m/^\d+$/;
+        $whyskip =~ s/^[Ss]kip(?:\s+|$)//;  # backwards compatibility, old
+                                            # versions required the reason
+                                            # to start with 'skip'
+        # We print in one shot for VMSy reasons.
+        my $ok = "ok $ntest # skip";
+        $ok .= " $whyskip" if length $whyskip;
+        $ok .= "\n";
+        print $TESTOUT $ok;
+        ++ $ntest;
+        return 1;
+    } else {
+        # backwards compatiblity (I think).  skip() used to be
+        # called like ok(), which is weird.  I haven't decided what to do with
+        # this yet.
+#        warn <<WARN if $^W;
+#This looks like a skip() using the very old interface.  Please upgrade to
+#the documented interface as this has been deprecated.
+#WARN
+
+	local($TestLevel) = $TestLevel+1;  #to ignore this stack frame
+        return &ok(@_);
+    }
+}
+
+=back
+
+=cut
+
+END {
+    $ONFAIL->(\@FAILDETAIL) if @FAILDETAIL && $ONFAIL;
+}
+
+1;
+__END__
+
+=head1 TEST TYPES
+
+=over 4
+
+=item * NORMAL TESTS
+
+These tests are expected to succeed.  Usually, most or all of your tests
+are in this category.  If a normal test doesn't succeed, then that
+means that something is I<wrong>.
+
+=item * SKIPPED TESTS
+
+The C<skip(...)> function is for tests that might or might not be
+possible to run, depending
+on the availability of platform-specific features.  The first argument
+should evaluate to true (think "yes, please skip") if the required
+feature is I<not> available.  After the first argument, C<skip(...)> works
+exactly the same way as C<ok(...)> does.
+
+=item * TODO TESTS
+
+TODO tests are designed for maintaining an B<executable TODO list>.
+These tests are I<expected to fail.>  If a TODO test does succeed,
+then the feature in question shouldn't be on the TODO list, now
+should it?
+
+Packages should NOT be released with succeeding TODO tests.  As soon
+as a TODO test starts working, it should be promoted to a normal test,
+and the newly working feature should be documented in the release
+notes or in the change log.
+
+=back
+
+=head1 ONFAIL
+
+  BEGIN { plan test => 4, onfail => sub { warn "CALL 911!" } }
+
+Although test failures should be enough, extra diagnostics can be
+triggered at the end of a test run.  C<onfail> is passed an array ref
+of hash refs that describe each test failure.  Each hash will contain
+at least the following fields: C<package>, C<repetition>, and
+C<result>.  (You shouldn't rely on any other fields being present.)  If the test
+had an expected value or a diagnostic (or "note") string, these will also be
+included.
+
+The I<optional> C<onfail> hook might be used simply to print out the
+version of your package and/or how to report problems.  It might also
+be used to generate extremely sophisticated diagnostics for a
+particularly bizarre test failure.  However it's not a panacea.  Core
+dumps or other unrecoverable errors prevent the C<onfail> hook from
+running.  (It is run inside an C<END> block.)  Besides, C<onfail> is
+probably over-kill in most cases.  (Your test code should be simpler
+than the code it is testing, yes?)
+
+
+=head1 BUGS and CAVEATS
+
+=over
+
+=item *
+
+C<ok(...)>'s special handing of strings which look like they might be
+regexes can also cause unexpected behavior.  An innocent:
+
+    ok( $fileglob, '/path/to/some/*stuff/' );
+
+will fail, since Test.pm considers the second argument to be a regex!
+The best bet is to use the one-argument form:
+
+    ok( $fileglob eq '/path/to/some/*stuff/' );
+
+=item *
+
+C<ok(...)>'s use of string C<eq> can sometimes cause odd problems
+when comparing
+numbers, especially if you're casting a string to a number:
+
+    $foo = "1.0";
+    ok( $foo, 1 );      # not ok, "1.0" ne 1
+
+Your best bet is to use the single argument form:
+
+    ok( $foo == 1 );    # ok "1.0" == 1
+
+=item *
+
+As you may have inferred from the above documentation and examples,
+C<ok>'s prototype is C<($;$$)> (and, incidentally, C<skip>'s is
+C<($;$$$)>). This means, for example, that you can do C<ok @foo, @bar>
+to compare the I<size> of the two arrays. But don't be fooled into
+thinking that C<ok @foo, @bar> means a comparison of the contents of two
+arrays -- you're comparing I<just> the number of elements of each. It's
+so easy to make that mistake in reading C<ok @foo, @bar> that you might
+want to be very explicit about it, and instead write C<ok scalar(@foo),
+scalar(@bar)>.
+
+=item *
+
+This almost definitely doesn't do what you expect:
+
+     ok $thingy->can('some_method');
+
+Why?  Because C<can> returns a coderef to mean "yes it can (and the
+method is this...)", and then C<ok> sees a coderef and thinks you're
+passing a function that you want it to call and consider the truth of
+the result of!  I.e., just like:
+
+     ok $thingy->can('some_method')->();
+
+What you probably want instead is this:
+
+     ok $thingy->can('some_method') && 1;
+
+If the C<can> returns false, then that is passed to C<ok>.  If it
+returns true, then the larger expression S<< C<<
+$thingy->can('some_method') && 1 >> >> returns 1, which C<ok> sees as
+a simple signal of success, as you would expect.
+
+
+=item *
+
+The syntax for C<skip> is about the only way it can be, but it's still
+quite confusing.  Just start with the above examples and you'll
+be okay.
+
+Moreover, users may expect this:
+
+  skip $unless_mswin, foo($bar), baz($quux);
+
+to not evaluate C<foo($bar)> and C<baz($quux)> when the test is being
+skipped.  But in reality, they I<are> evaluated, but C<skip> just won't
+bother comparing them if C<$unless_mswin> is true.
+
+You could do this:
+
+  skip $unless_mswin, sub{foo($bar)}, sub{baz($quux)};
+
+But that's not terribly pretty.  You may find it simpler or clearer in
+the long run to just do things like this:
+
+  if( $^O =~ m/MSWin/ ) {
+    print "# Yay, we're under $^O\n";
+    ok foo($bar), baz($quux);
+    ok thing($whatever), baz($stuff);
+    ok blorp($quux, $whatever);
+    ok foo($barzbarz), thang($quux);
+  } else {
+    print "# Feh, we're under $^O.  Watch me skip some tests...\n";
+    for(1 .. 4) { skip "Skip unless under MSWin" }
+  }
+
+But be quite sure that C<ok> is called exactly as many times in the
+first block as C<skip> is called in the second block.
+
+=back
+
+
+=head1 ENVIRONMENT
+
+If C<PERL_TEST_DIFF> environment variable is set, it will be used as a
+command for comparing unexpected multiline results.  If you have GNU
+diff installed, you might want to set C<PERL_TEST_DIFF> to C<diff -u>.
+If you don't have a suitable program, you might install the
+C<Text::Diff> module and then set C<PERL_TEST_DIFF> to be C<perl
+-MText::Diff -e 'print diff(@ARGV)'>.  If C<PERL_TEST_DIFF> isn't set
+but the C<Algorithm::Diff> module is available, then it will be used
+to show the differences in multiline results.
+
+=for comment
+If C<PERL_TEST_NO_TRUNC> is set, then the initial "Got 'something' but
+expected 'something_else'" readings for long multiline output values aren't
+truncated at about the 230th column, as they normally could be in some
+cases.  Normally you won't need to use this, unless you were carefully
+parsing the output of your test programs.
+
+
+=head1 NOTE
+
+A past developer of this module once said that it was no longer being
+actively developed.  However, rumors of its demise were greatly
+exaggerated.  Feedback and suggestions are quite welcome.
+
+Be aware that the main value of this module is its simplicity.  Note
+that there are already more ambitious modules out there, such as
+L<Test::More> and L<Test::Unit>.
+
+Some earlier versions of this module had docs with some confusing
+typoes in the description of C<skip(...)>.
+
+
+=head1 SEE ALSO
+
+L<Test::Harness>
+
+L<Test::Simple>, L<Test::More>, L<Devel::Cover>
+
+L<Test::Builder> for building your own testing library.
+
+L<Test::Unit> is an interesting XUnit-style testing library.
+
+L<Test::Inline> and L<SelfTest> let you embed tests in code.
+
+
+=head1 AUTHOR
+
+Copyright (c) 1998-2000 Joshua Nathaniel Pritikin.  All rights reserved.
+
+Copyright (c) 2001-2002 Michael G. Schwern.
+
+Copyright (c) 2002-2004 and counting Sean M. Burke.
+
+Current maintainer: Sean M. Burke. E<lt>sburke@cpan.orgE<gt>
+
+This package is free software and is provided "as is" without express
+or implied warranty.  It may be used, redistributed and/or modified
+under the same terms as Perl itself.
+
+=cut
+
+# "Your mistake was a hidden intention."
+#  -- /Oblique Strategies/,  Brian Eno and Peter Schmidt
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Builder.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Builder.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Builder.pm	(revision 14489)
@@ -0,0 +1,1749 @@
+package Test::Builder;
+
+use 5.004;
+
+# $^C was only introduced in 5.005-ish.  We do this to prevent
+# use of uninitialized value warnings in older perls.
+$^C ||= 0;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.32';
+$VERSION = eval $VERSION;    # make the alpha version come out as a number
+
+# Make Test::Builder thread-safe for ithreads.
+BEGIN {
+    use Config;
+    # Load threads::shared when threads are turned on
+    if( $] >= 5.008 && $Config{useithreads} && $INC{'threads.pm'}) {
+        require threads::shared;
+
+        # Hack around YET ANOTHER threads::shared bug.  It would 
+        # occassionally forget the contents of the variable when sharing it.
+        # So we first copy the data, then share, then put our copy back.
+        *share = sub (\[$@%]) {
+            my $type = ref $_[0];
+            my $data;
+
+            if( $type eq 'HASH' ) {
+                %$data = %{$_[0]};
+            }
+            elsif( $type eq 'ARRAY' ) {
+                @$data = @{$_[0]};
+            }
+            elsif( $type eq 'SCALAR' ) {
+                $$data = ${$_[0]};
+            }
+            else {
+                die "Unknown type: ".$type;
+            }
+
+            $_[0] = &threads::shared::share($_[0]);
+
+            if( $type eq 'HASH' ) {
+                %{$_[0]} = %$data;
+            }
+            elsif( $type eq 'ARRAY' ) {
+                @{$_[0]} = @$data;
+            }
+            elsif( $type eq 'SCALAR' ) {
+                ${$_[0]} = $$data;
+            }
+            else {
+                die "Unknown type: ".$type;
+            }
+
+            return $_[0];
+        };
+    }
+    # 5.8.0's threads::shared is busted when threads are off.
+    # We emulate it here.
+    else {
+        *share = sub { return $_[0] };
+        *lock  = sub { 0 };
+    }
+}
+
+
+=head1 NAME
+
+Test::Builder - Backend for building test libraries
+
+=head1 SYNOPSIS
+
+  package My::Test::Module;
+  use Test::Builder;
+  require Exporter;
+  @ISA = qw(Exporter);
+  @EXPORT = qw(ok);
+
+  my $Test = Test::Builder->new;
+  $Test->output('my_logfile');
+
+  sub import {
+      my($self) = shift;
+      my $pack = caller;
+
+      $Test->exported_to($pack);
+      $Test->plan(@_);
+
+      $self->export_to_level(1, $self, 'ok');
+  }
+
+  sub ok {
+      my($test, $name) = @_;
+
+      $Test->ok($test, $name);
+  }
+
+
+=head1 DESCRIPTION
+
+Test::Simple and Test::More have proven to be popular testing modules,
+but they're not always flexible enough.  Test::Builder provides the a
+building block upon which to write your own test libraries I<which can
+work together>.
+
+=head2 Construction
+
+=over 4
+
+=item B<new>
+
+  my $Test = Test::Builder->new;
+
+Returns a Test::Builder object representing the current state of the
+test.
+
+Since you only run one test per program C<new> always returns the same
+Test::Builder object.  No matter how many times you call new(), you're
+getting the same object.  This is called a singleton.  This is done so that
+multiple modules share such global information as the test counter and
+where test output is going.
+
+If you want a completely new Test::Builder object different from the
+singleton, use C<create>.
+
+=cut
+
+my $Test = Test::Builder->new;
+sub new {
+    my($class) = shift;
+    $Test ||= $class->create;
+    return $Test;
+}
+
+
+=item B<create>
+
+  my $Test = Test::Builder->create;
+
+Ok, so there can be more than one Test::Builder object and this is how
+you get it.  You might use this instead of C<new()> if you're testing
+a Test::Builder based module, but otherwise you probably want C<new>.
+
+B<NOTE>: the implementation is not complete.  C<level>, for example, is
+still shared amongst B<all> Test::Builder objects, even ones created using
+this method.  Also, the method name may change in the future.
+
+=cut
+
+sub create {
+    my $class = shift;
+
+    my $self = bless {}, $class;
+    $self->reset;
+
+    return $self;
+}
+
+=item B<reset>
+
+  $Test->reset;
+
+Reinitializes the Test::Builder singleton to its original state.
+Mostly useful for tests run in persistent environments where the same
+test might be run multiple times in the same process.
+
+=cut
+
+use vars qw($Level);
+
+sub reset {
+    my ($self) = @_;
+
+    # We leave this a global because it has to be localized and localizing
+    # hash keys is just asking for pain.  Also, it was documented.
+    $Level = 1;
+
+    $self->{Test_Died}    = 0;
+    $self->{Have_Plan}    = 0;
+    $self->{No_Plan}      = 0;
+    $self->{Original_Pid} = $$;
+
+    share($self->{Curr_Test});
+    $self->{Curr_Test}    = 0;
+    $self->{Test_Results} = &share([]);
+
+    $self->{Exported_To}    = undef;
+    $self->{Expected_Tests} = 0;
+
+    $self->{Skip_All}   = 0;
+
+    $self->{Use_Nums}   = 1;
+
+    $self->{No_Header}  = 0;
+    $self->{No_Ending}  = 0;
+
+    $self->_dup_stdhandles unless $^C;
+
+    return undef;
+}
+
+=back
+
+=head2 Setting up tests
+
+These methods are for setting up tests and declaring how many there
+are.  You usually only want to call one of these methods.
+
+=over 4
+
+=item B<exported_to>
+
+  my $pack = $Test->exported_to;
+  $Test->exported_to($pack);
+
+Tells Test::Builder what package you exported your functions to.
+This is important for getting TODO tests right.
+
+=cut
+
+sub exported_to {
+    my($self, $pack) = @_;
+
+    if( defined $pack ) {
+        $self->{Exported_To} = $pack;
+    }
+    return $self->{Exported_To};
+}
+
+=item B<plan>
+
+  $Test->plan('no_plan');
+  $Test->plan( skip_all => $reason );
+  $Test->plan( tests => $num_tests );
+
+A convenient way to set up your tests.  Call this and Test::Builder
+will print the appropriate headers and take the appropriate actions.
+
+If you call plan(), don't call any of the other methods below.
+
+=cut
+
+sub plan {
+    my($self, $cmd, $arg) = @_;
+
+    return unless $cmd;
+
+    if( $self->{Have_Plan} ) {
+        die sprintf "You tried to plan twice!  Second plan at %s line %d\n",
+          ($self->caller)[1,2];
+    }
+
+    if( $cmd eq 'no_plan' ) {
+        $self->no_plan;
+    }
+    elsif( $cmd eq 'skip_all' ) {
+        return $self->skip_all($arg);
+    }
+    elsif( $cmd eq 'tests' ) {
+        if( $arg ) {
+            return $self->expected_tests($arg);
+        }
+        elsif( !defined $arg ) {
+            die "Got an undefined number of tests.  Looks like you tried to ".
+                "say how many tests you plan to run but made a mistake.\n";
+        }
+        elsif( !$arg ) {
+            die "You said to run 0 tests!  You've got to run something.\n";
+        }
+    }
+    else {
+        require Carp;
+        my @args = grep { defined } ($cmd, $arg);
+        Carp::croak("plan() doesn't understand @args");
+    }
+
+    return 1;
+}
+
+=item B<expected_tests>
+
+    my $max = $Test->expected_tests;
+    $Test->expected_tests($max);
+
+Gets/sets the # of tests we expect this test to run and prints out
+the appropriate headers.
+
+=cut
+
+sub expected_tests {
+    my $self = shift;
+    my($max) = @_;
+
+    if( @_ ) {
+        die "Number of tests must be a postive integer.  You gave it '$max'.\n"
+          unless $max =~ /^\+?\d+$/ and $max > 0;
+
+        $self->{Expected_Tests} = $max;
+        $self->{Have_Plan}      = 1;
+
+        $self->_print("1..$max\n") unless $self->no_header;
+    }
+    return $self->{Expected_Tests};
+}
+
+
+=item B<no_plan>
+
+  $Test->no_plan;
+
+Declares that this test will run an indeterminate # of tests.
+
+=cut
+
+sub no_plan {
+    my $self = shift;
+
+    $self->{No_Plan}   = 1;
+    $self->{Have_Plan} = 1;
+}
+
+=item B<has_plan>
+
+  $plan = $Test->has_plan
+
+Find out whether a plan has been defined. $plan is either C<undef> (no plan has been set), C<no_plan> (indeterminate # of tests) or an integer (the number of expected tests).
+
+=cut
+
+sub has_plan {
+    my $self = shift;
+
+    return($self->{Expected_Tests}) if $self->{Expected_Tests};
+    return('no_plan') if $self->{No_Plan};
+    return(undef);
+};
+
+
+=item B<skip_all>
+
+  $Test->skip_all;
+  $Test->skip_all($reason);
+
+Skips all the tests, using the given $reason.  Exits immediately with 0.
+
+=cut
+
+sub skip_all {
+    my($self, $reason) = @_;
+
+    my $out = "1..0";
+    $out .= " # Skip $reason" if $reason;
+    $out .= "\n";
+
+    $self->{Skip_All} = 1;
+
+    $self->_print($out) unless $self->no_header;
+    exit(0);
+}
+
+=back
+
+=head2 Running tests
+
+These actually run the tests, analogous to the functions in
+Test::More.
+
+$name is always optional.
+
+=over 4
+
+=item B<ok>
+
+  $Test->ok($test, $name);
+
+Your basic test.  Pass if $test is true, fail if $test is false.  Just
+like Test::Simple's ok().
+
+=cut
+
+sub ok {
+    my($self, $test, $name) = @_;
+
+    # $test might contain an object which we don't want to accidentally
+    # store, so we turn it into a boolean.
+    $test = $test ? 1 : 0;
+
+    unless( $self->{Have_Plan} ) {
+        require Carp;
+        Carp::croak("You tried to run a test without a plan!  Gotta have a plan.");
+    }
+
+    lock $self->{Curr_Test};
+    $self->{Curr_Test}++;
+
+    # In case $name is a string overloaded object, force it to stringify.
+    $self->_unoverload_str(\$name);
+
+    $self->diag(<<ERR) if defined $name and $name =~ /^[\d\s]+$/;
+    You named your test '$name'.  You shouldn't use numbers for your test names.
+    Very confusing.
+ERR
+
+    my($pack, $file, $line) = $self->caller;
+
+    my $todo = $self->todo($pack);
+    $self->_unoverload_str(\$todo);
+
+    my $out;
+    my $result = &share({});
+
+    unless( $test ) {
+        $out .= "not ";
+        @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 );
+    }
+    else {
+        @$result{ 'ok', 'actual_ok' } = ( 1, $test );
+    }
+
+    $out .= "ok";
+    $out .= " $self->{Curr_Test}" if $self->use_numbers;
+
+    if( defined $name ) {
+        $name =~ s|#|\\#|g;     # # in a name can confuse Test::Harness.
+        $out   .= " - $name";
+        $result->{name} = $name;
+    }
+    else {
+        $result->{name} = '';
+    }
+
+    if( $todo ) {
+        $out   .= " # TODO $todo";
+        $result->{reason} = $todo;
+        $result->{type}   = 'todo';
+    }
+    else {
+        $result->{reason} = '';
+        $result->{type}   = '';
+    }
+
+    $self->{Test_Results}[$self->{Curr_Test}-1] = $result;
+    $out .= "\n";
+
+    $self->_print($out);
+
+    unless( $test ) {
+        my $msg = $todo ? "Failed (TODO)" : "Failed";
+        $self->_print_diag("\n") if $ENV{HARNESS_ACTIVE};
+
+	if( defined $name ) {
+	    $self->diag(qq[  $msg test '$name'\n]);
+	    $self->diag(qq[  in $file at line $line.\n]);
+	}
+	else {
+	    $self->diag(qq[  $msg test in $file at line $line.\n]);
+	}
+    } 
+
+    return $test ? 1 : 0;
+}
+
+
+sub _unoverload {
+    my $self  = shift;
+    my $type  = shift;
+
+    local($@,$!);
+
+    eval { require overload } || return;
+
+    foreach my $thing (@_) {
+        eval { 
+            if( _is_object($$thing) ) {
+                if( my $string_meth = overload::Method($$thing, $type) ) {
+                    $$thing = $$thing->$string_meth();
+                }
+            }
+        };
+    }
+}
+
+
+sub _is_object {
+    my $thing = shift;
+
+    return eval { ref $thing && $thing->isa('UNIVERSAL') } ? 1 : 0;
+}
+
+
+sub _unoverload_str {
+    my $self = shift;
+
+    $self->_unoverload(q[""], @_);
+}    
+
+sub _unoverload_num {
+    my $self = shift;
+
+    $self->_unoverload('0+', @_);
+
+    for my $val (@_) {
+        next unless $self->_is_dualvar($$val);
+        $$val = $$val+0;
+    }
+}
+
+
+# This is a hack to detect a dualvar such as $!
+sub _is_dualvar {
+    my($self, $val) = @_;
+
+    local $^W = 0;
+    my $numval = $val+0;
+    return 1 if $numval != 0 and $numval ne $val;
+}
+
+
+
+=item B<is_eq>
+
+  $Test->is_eq($got, $expected, $name);
+
+Like Test::More's is().  Checks if $got eq $expected.  This is the
+string version.
+
+=item B<is_num>
+
+  $Test->is_num($got, $expected, $name);
+
+Like Test::More's is().  Checks if $got == $expected.  This is the
+numeric version.
+
+=cut
+
+sub is_eq {
+    my($self, $got, $expect, $name) = @_;
+    local $Level = $Level + 1;
+
+    $self->_unoverload_str(\$got, \$expect);
+
+    if( !defined $got || !defined $expect ) {
+        # undef only matches undef and nothing else
+        my $test = !defined $got && !defined $expect;
+
+        $self->ok($test, $name);
+        $self->_is_diag($got, 'eq', $expect) unless $test;
+        return $test;
+    }
+
+    return $self->cmp_ok($got, 'eq', $expect, $name);
+}
+
+sub is_num {
+    my($self, $got, $expect, $name) = @_;
+    local $Level = $Level + 1;
+
+    $self->_unoverload_num(\$got, \$expect);
+
+    if( !defined $got || !defined $expect ) {
+        # undef only matches undef and nothing else
+        my $test = !defined $got && !defined $expect;
+
+        $self->ok($test, $name);
+        $self->_is_diag($got, '==', $expect) unless $test;
+        return $test;
+    }
+
+    return $self->cmp_ok($got, '==', $expect, $name);
+}
+
+sub _is_diag {
+    my($self, $got, $type, $expect) = @_;
+
+    foreach my $val (\$got, \$expect) {
+        if( defined $$val ) {
+            if( $type eq 'eq' ) {
+                # quote and force string context
+                $$val = "'$$val'"
+            }
+            else {
+                # force numeric context
+                $self->_unoverload_num($val);
+            }
+        }
+        else {
+            $$val = 'undef';
+        }
+    }
+
+    return $self->diag(sprintf <<DIAGNOSTIC, $got, $expect);
+         got: %s
+    expected: %s
+DIAGNOSTIC
+
+}    
+
+=item B<isnt_eq>
+
+  $Test->isnt_eq($got, $dont_expect, $name);
+
+Like Test::More's isnt().  Checks if $got ne $dont_expect.  This is
+the string version.
+
+=item B<isnt_num>
+
+  $Test->is_num($got, $dont_expect, $name);
+
+Like Test::More's isnt().  Checks if $got ne $dont_expect.  This is
+the numeric version.
+
+=cut
+
+sub isnt_eq {
+    my($self, $got, $dont_expect, $name) = @_;
+    local $Level = $Level + 1;
+
+    if( !defined $got || !defined $dont_expect ) {
+        # undef only matches undef and nothing else
+        my $test = defined $got || defined $dont_expect;
+
+        $self->ok($test, $name);
+        $self->_cmp_diag($got, 'ne', $dont_expect) unless $test;
+        return $test;
+    }
+
+    return $self->cmp_ok($got, 'ne', $dont_expect, $name);
+}
+
+sub isnt_num {
+    my($self, $got, $dont_expect, $name) = @_;
+    local $Level = $Level + 1;
+
+    if( !defined $got || !defined $dont_expect ) {
+        # undef only matches undef and nothing else
+        my $test = defined $got || defined $dont_expect;
+
+        $self->ok($test, $name);
+        $self->_cmp_diag($got, '!=', $dont_expect) unless $test;
+        return $test;
+    }
+
+    return $self->cmp_ok($got, '!=', $dont_expect, $name);
+}
+
+
+=item B<like>
+
+  $Test->like($this, qr/$regex/, $name);
+  $Test->like($this, '/$regex/', $name);
+
+Like Test::More's like().  Checks if $this matches the given $regex.
+
+You'll want to avoid qr// if you want your tests to work before 5.005.
+
+=item B<unlike>
+
+  $Test->unlike($this, qr/$regex/, $name);
+  $Test->unlike($this, '/$regex/', $name);
+
+Like Test::More's unlike().  Checks if $this B<does not match> the
+given $regex.
+
+=cut
+
+sub like {
+    my($self, $this, $regex, $name) = @_;
+
+    local $Level = $Level + 1;
+    $self->_regex_ok($this, $regex, '=~', $name);
+}
+
+sub unlike {
+    my($self, $this, $regex, $name) = @_;
+
+    local $Level = $Level + 1;
+    $self->_regex_ok($this, $regex, '!~', $name);
+}
+
+=item B<maybe_regex>
+
+  $Test->maybe_regex(qr/$regex/);
+  $Test->maybe_regex('/$regex/');
+
+Convenience method for building testing functions that take regular
+expressions as arguments, but need to work before perl 5.005.
+
+Takes a quoted regular expression produced by qr//, or a string
+representing a regular expression.
+
+Returns a Perl value which may be used instead of the corresponding
+regular expression, or undef if it's argument is not recognised.
+
+For example, a version of like(), sans the useful diagnostic messages,
+could be written as:
+
+  sub laconic_like {
+      my ($self, $this, $regex, $name) = @_;
+      my $usable_regex = $self->maybe_regex($regex);
+      die "expecting regex, found '$regex'\n"
+          unless $usable_regex;
+      $self->ok($this =~ m/$usable_regex/, $name);
+  }
+
+=cut
+
+
+sub maybe_regex {
+    my ($self, $regex) = @_;
+    my $usable_regex = undef;
+
+    return $usable_regex unless defined $regex;
+
+    my($re, $opts);
+
+    # Check for qr/foo/
+    if( ref $regex eq 'Regexp' ) {
+        $usable_regex = $regex;
+    }
+    # Check for '/foo/' or 'm,foo,'
+    elsif( ($re, $opts)        = $regex =~ m{^ /(.*)/ (\w*) $ }sx           or
+           (undef, $re, $opts) = $regex =~ m,^ m([^\w\s]) (.+) \1 (\w*) $,sx
+         )
+    {
+        $usable_regex = length $opts ? "(?$opts)$re" : $re;
+    }
+
+    return $usable_regex;
+};
+
+sub _regex_ok {
+    my($self, $this, $regex, $cmp, $name) = @_;
+
+    my $ok = 0;
+    my $usable_regex = $self->maybe_regex($regex);
+    unless (defined $usable_regex) {
+        $ok = $self->ok( 0, $name );
+        $self->diag("    '$regex' doesn't look much like a regex to me.");
+        return $ok;
+    }
+
+    {
+        my $test;
+        my $code = $self->_caller_context;
+
+        local($@, $!);
+
+        # Yes, it has to look like this or 5.4.5 won't see the #line directive.
+        # Don't ask me, man, I just work here.
+        $test = eval "
+$code" . q{$test = $this =~ /$usable_regex/ ? 1 : 0};
+
+        $test = !$test if $cmp eq '!~';
+
+        local $Level = $Level + 1;
+        $ok = $self->ok( $test, $name );
+    }
+
+    unless( $ok ) {
+        $this = defined $this ? "'$this'" : 'undef';
+        my $match = $cmp eq '=~' ? "doesn't match" : "matches";
+        $self->diag(sprintf <<DIAGNOSTIC, $this, $match, $regex);
+                  %s
+    %13s '%s'
+DIAGNOSTIC
+
+    }
+
+    return $ok;
+}
+
+=item B<cmp_ok>
+
+  $Test->cmp_ok($this, $type, $that, $name);
+
+Works just like Test::More's cmp_ok().
+
+    $Test->cmp_ok($big_num, '!=', $other_big_num);
+
+=cut
+
+
+my %numeric_cmps = map { ($_, 1) } 
+                       ("<",  "<=", ">",  ">=", "==", "!=", "<=>");
+
+sub cmp_ok {
+    my($self, $got, $type, $expect, $name) = @_;
+
+    # Treat overloaded objects as numbers if we're asked to do a
+    # numeric comparison.
+    my $unoverload = $numeric_cmps{$type} ? '_unoverload_num'
+                                          : '_unoverload_str';
+
+    $self->$unoverload(\$got, \$expect);
+
+
+    my $test;
+    {
+        local($@,$!);   # don't interfere with $@
+                        # eval() sometimes resets $!
+
+        my $code = $self->_caller_context;
+
+        # Yes, it has to look like this or 5.4.5 won't see the #line directive.
+        # Don't ask me, man, I just work here.
+        $test = eval "
+$code" . "\$got $type \$expect;";
+
+    }
+    local $Level = $Level + 1;
+    my $ok = $self->ok($test, $name);
+
+    unless( $ok ) {
+        if( $type =~ /^(eq|==)$/ ) {
+            $self->_is_diag($got, $type, $expect);
+        }
+        else {
+            $self->_cmp_diag($got, $type, $expect);
+        }
+    }
+    return $ok;
+}
+
+sub _cmp_diag {
+    my($self, $got, $type, $expect) = @_;
+    
+    $got    = defined $got    ? "'$got'"    : 'undef';
+    $expect = defined $expect ? "'$expect'" : 'undef';
+    return $self->diag(sprintf <<DIAGNOSTIC, $got, $type, $expect);
+    %s
+        %s
+    %s
+DIAGNOSTIC
+}
+
+
+sub _caller_context {
+    my $self = shift;
+
+    my($pack, $file, $line) = $self->caller(1);
+
+    my $code = '';
+    $code .= "#line $line $file\n" if defined $file and defined $line;
+
+    return $code;
+}
+
+
+=item B<BAIL_OUT>
+
+    $Test->BAIL_OUT($reason);
+
+Indicates to the Test::Harness that things are going so badly all
+testing should terminate.  This includes running any additional test
+scripts.
+
+It will exit with 255.
+
+=cut
+
+sub BAIL_OUT {
+    my($self, $reason) = @_;
+
+    $self->{Bailed_Out} = 1;
+    $self->_print("Bail out!  $reason");
+    exit 255;
+}
+
+=for deprecated
+BAIL_OUT() used to be BAILOUT()
+
+=cut
+
+*BAILOUT = \&BAIL_OUT;
+
+
+=item B<skip>
+
+    $Test->skip;
+    $Test->skip($why);
+
+Skips the current test, reporting $why.
+
+=cut
+
+sub skip {
+    my($self, $why) = @_;
+    $why ||= '';
+    $self->_unoverload_str(\$why);
+
+    unless( $self->{Have_Plan} ) {
+        require Carp;
+        Carp::croak("You tried to run tests without a plan!  Gotta have a plan.");
+    }
+
+    lock($self->{Curr_Test});
+    $self->{Curr_Test}++;
+
+    $self->{Test_Results}[$self->{Curr_Test}-1] = &share({
+        'ok'      => 1,
+        actual_ok => 1,
+        name      => '',
+        type      => 'skip',
+        reason    => $why,
+    });
+
+    my $out = "ok";
+    $out   .= " $self->{Curr_Test}" if $self->use_numbers;
+    $out   .= " # skip";
+    $out   .= " $why"       if length $why;
+    $out   .= "\n";
+
+    $self->_print($out);
+
+    return 1;
+}
+
+
+=item B<todo_skip>
+
+  $Test->todo_skip;
+  $Test->todo_skip($why);
+
+Like skip(), only it will declare the test as failing and TODO.  Similar
+to
+
+    print "not ok $tnum # TODO $why\n";
+
+=cut
+
+sub todo_skip {
+    my($self, $why) = @_;
+    $why ||= '';
+
+    unless( $self->{Have_Plan} ) {
+        require Carp;
+        Carp::croak("You tried to run tests without a plan!  Gotta have a plan.");
+    }
+
+    lock($self->{Curr_Test});
+    $self->{Curr_Test}++;
+
+    $self->{Test_Results}[$self->{Curr_Test}-1] = &share({
+        'ok'      => 1,
+        actual_ok => 0,
+        name      => '',
+        type      => 'todo_skip',
+        reason    => $why,
+    });
+
+    my $out = "not ok";
+    $out   .= " $self->{Curr_Test}" if $self->use_numbers;
+    $out   .= " # TODO & SKIP $why\n";
+
+    $self->_print($out);
+
+    return 1;
+}
+
+
+=begin _unimplemented
+
+=item B<skip_rest>
+
+  $Test->skip_rest;
+  $Test->skip_rest($reason);
+
+Like skip(), only it skips all the rest of the tests you plan to run
+and terminates the test.
+
+If you're running under no_plan, it skips once and terminates the
+test.
+
+=end _unimplemented
+
+=back
+
+
+=head2 Test style
+
+=over 4
+
+=item B<level>
+
+    $Test->level($how_high);
+
+How far up the call stack should $Test look when reporting where the
+test failed.
+
+Defaults to 1.
+
+Setting $Test::Builder::Level overrides.  This is typically useful
+localized:
+
+    {
+        local $Test::Builder::Level = 2;
+        $Test->ok($test);
+    }
+
+=cut
+
+sub level {
+    my($self, $level) = @_;
+
+    if( defined $level ) {
+        $Level = $level;
+    }
+    return $Level;
+}
+
+
+=item B<use_numbers>
+
+    $Test->use_numbers($on_or_off);
+
+Whether or not the test should output numbers.  That is, this if true:
+
+  ok 1
+  ok 2
+  ok 3
+
+or this if false
+
+  ok
+  ok
+  ok
+
+Most useful when you can't depend on the test output order, such as
+when threads or forking is involved.
+
+Test::Harness will accept either, but avoid mixing the two styles.
+
+Defaults to on.
+
+=cut
+
+sub use_numbers {
+    my($self, $use_nums) = @_;
+
+    if( defined $use_nums ) {
+        $self->{Use_Nums} = $use_nums;
+    }
+    return $self->{Use_Nums};
+}
+
+
+=item B<no_diag>
+
+    $Test->no_diag($no_diag);
+
+If set true no diagnostics will be printed.  This includes calls to
+diag().
+
+=item B<no_ending>
+
+    $Test->no_ending($no_ending);
+
+Normally, Test::Builder does some extra diagnostics when the test
+ends.  It also changes the exit code as described below.
+
+If this is true, none of that will be done.
+
+=item B<no_header>
+
+    $Test->no_header($no_header);
+
+If set to true, no "1..N" header will be printed.
+
+=cut
+
+foreach my $attribute (qw(No_Header No_Ending No_Diag)) {
+    my $method = lc $attribute;
+
+    my $code = sub {
+        my($self, $no) = @_;
+
+        if( defined $no ) {
+            $self->{$attribute} = $no;
+        }
+        return $self->{$attribute};
+    };
+
+    no strict 'refs';
+    *{__PACKAGE__.'::'.$method} = $code;
+}
+
+
+=back
+
+=head2 Output
+
+Controlling where the test output goes.
+
+It's ok for your test to change where STDOUT and STDERR point to,
+Test::Builder's default output settings will not be affected.
+
+=over 4
+
+=item B<diag>
+
+    $Test->diag(@msgs);
+
+Prints out the given @msgs.  Like C<print>, arguments are simply
+appended together.
+
+Normally, it uses the failure_output() handle, but if this is for a
+TODO test, the todo_output() handle is used.
+
+Output will be indented and marked with a # so as not to interfere
+with test output.  A newline will be put on the end if there isn't one
+already.
+
+We encourage using this rather than calling print directly.
+
+Returns false.  Why?  Because diag() is often used in conjunction with
+a failing test (C<ok() || diag()>) it "passes through" the failure.
+
+    return ok(...) || diag(...);
+
+=for blame transfer
+Mark Fowler <mark@twoshortplanks.com>
+
+=cut
+
+sub diag {
+    my($self, @msgs) = @_;
+
+    return if $self->no_diag;
+    return unless @msgs;
+
+    # Prevent printing headers when compiling (i.e. -c)
+    return if $^C;
+
+    # Smash args together like print does.
+    # Convert undef to 'undef' so its readable.
+    my $msg = join '', map { defined($_) ? $_ : 'undef' } @msgs;
+
+    # Escape each line with a #.
+    $msg =~ s/^/# /gm;
+
+    # Stick a newline on the end if it needs it.
+    $msg .= "\n" unless $msg =~ /\n\Z/;
+
+    local $Level = $Level + 1;
+    $self->_print_diag($msg);
+
+    return 0;
+}
+
+=begin _private
+
+=item B<_print>
+
+    $Test->_print(@msgs);
+
+Prints to the output() filehandle.
+
+=end _private
+
+=cut
+
+sub _print {
+    my($self, @msgs) = @_;
+
+    # Prevent printing headers when only compiling.  Mostly for when
+    # tests are deparsed with B::Deparse
+    return if $^C;
+
+    my $msg = join '', @msgs;
+
+    local($\, $", $,) = (undef, ' ', '');
+    my $fh = $self->output;
+
+    # Escape each line after the first with a # so we don't
+    # confuse Test::Harness.
+    $msg =~ s/\n(.)/\n# $1/sg;
+
+    # Stick a newline on the end if it needs it.
+    $msg .= "\n" unless $msg =~ /\n\Z/;
+
+    print $fh $msg;
+}
+
+
+=item B<_print_diag>
+
+    $Test->_print_diag(@msg);
+
+Like _print, but prints to the current diagnostic filehandle.
+
+=cut
+
+sub _print_diag {
+    my $self = shift;
+
+    local($\, $", $,) = (undef, ' ', '');
+    my $fh = $self->todo ? $self->todo_output : $self->failure_output;
+    print $fh @_;
+}    
+
+=item B<output>
+
+    $Test->output($fh);
+    $Test->output($file);
+
+Where normal "ok/not ok" test output should go.
+
+Defaults to STDOUT.
+
+=item B<failure_output>
+
+    $Test->failure_output($fh);
+    $Test->failure_output($file);
+
+Where diagnostic output on test failures and diag() should go.
+
+Defaults to STDERR.
+
+=item B<todo_output>
+
+    $Test->todo_output($fh);
+    $Test->todo_output($file);
+
+Where diagnostics about todo test failures and diag() should go.
+
+Defaults to STDOUT.
+
+=cut
+
+sub output {
+    my($self, $fh) = @_;
+
+    if( defined $fh ) {
+        $self->{Out_FH} = _new_fh($fh);
+    }
+    return $self->{Out_FH};
+}
+
+sub failure_output {
+    my($self, $fh) = @_;
+
+    if( defined $fh ) {
+        $self->{Fail_FH} = _new_fh($fh);
+    }
+    return $self->{Fail_FH};
+}
+
+sub todo_output {
+    my($self, $fh) = @_;
+
+    if( defined $fh ) {
+        $self->{Todo_FH} = _new_fh($fh);
+    }
+    return $self->{Todo_FH};
+}
+
+
+sub _new_fh {
+    my($file_or_fh) = shift;
+
+    my $fh;
+    if( _is_fh($file_or_fh) ) {
+        $fh = $file_or_fh;
+    }
+    else {
+        $fh = do { local *FH };
+        open $fh, ">$file_or_fh" or 
+            die "Can't open test output log $file_or_fh: $!";
+	_autoflush($fh);
+    }
+
+    return $fh;
+}
+
+
+sub _is_fh {
+    my $maybe_fh = shift;
+    return 0 unless defined $maybe_fh;
+
+    return 1 if ref \$maybe_fh eq 'GLOB'; # its a glob
+
+    return UNIVERSAL::isa($maybe_fh,               'GLOB')       ||
+           UNIVERSAL::isa($maybe_fh,               'IO::Handle') ||
+
+           # 5.5.4's tied() and can() doesn't like getting undef
+           UNIVERSAL::can((tied($maybe_fh) || ''), 'TIEHANDLE');
+}
+
+
+sub _autoflush {
+    my($fh) = shift;
+    my $old_fh = select $fh;
+    $| = 1;
+    select $old_fh;
+}
+
+
+sub _dup_stdhandles {
+    my $self = shift;
+
+    $self->_open_testhandles;
+
+    # Set everything to unbuffered else plain prints to STDOUT will
+    # come out in the wrong order from our own prints.
+    _autoflush(\*TESTOUT);
+    _autoflush(\*STDOUT);
+    _autoflush(\*TESTERR);
+    _autoflush(\*STDERR);
+
+    $self->output(\*TESTOUT);
+    $self->failure_output(\*TESTERR);
+    $self->todo_output(\*TESTOUT);
+}
+
+
+my $Opened_Testhandles = 0;
+sub _open_testhandles {
+    return if $Opened_Testhandles;
+    # We dup STDOUT and STDERR so people can change them in their
+    # test suites while still getting normal test output.
+    open(TESTOUT, ">&STDOUT") or die "Can't dup STDOUT:  $!";
+    open(TESTERR, ">&STDERR") or die "Can't dup STDERR:  $!";
+    $Opened_Testhandles = 1;
+}
+
+
+=back
+
+
+=head2 Test Status and Info
+
+=over 4
+
+=item B<current_test>
+
+    my $curr_test = $Test->current_test;
+    $Test->current_test($num);
+
+Gets/sets the current test number we're on.  You usually shouldn't
+have to set this.
+
+If set forward, the details of the missing tests are filled in as 'unknown'.
+if set backward, the details of the intervening tests are deleted.  You
+can erase history if you really want to.
+
+=cut
+
+sub current_test {
+    my($self, $num) = @_;
+
+    lock($self->{Curr_Test});
+    if( defined $num ) {
+        unless( $self->{Have_Plan} ) {
+            require Carp;
+            Carp::croak("Can't change the current test number without a plan!");
+        }
+
+        $self->{Curr_Test} = $num;
+
+        # If the test counter is being pushed forward fill in the details.
+        my $test_results = $self->{Test_Results};
+        if( $num > @$test_results ) {
+            my $start = @$test_results ? @$test_results : 0;
+            for ($start..$num-1) {
+                $test_results->[$_] = &share({
+                    'ok'      => 1, 
+                    actual_ok => undef, 
+                    reason    => 'incrementing test number', 
+                    type      => 'unknown', 
+                    name      => undef 
+                });
+            }
+        }
+        # If backward, wipe history.  Its their funeral.
+        elsif( $num < @$test_results ) {
+            $#{$test_results} = $num - 1;
+        }
+    }
+    return $self->{Curr_Test};
+}
+
+
+=item B<summary>
+
+    my @tests = $Test->summary;
+
+A simple summary of the tests so far.  True for pass, false for fail.
+This is a logical pass/fail, so todos are passes.
+
+Of course, test #1 is $tests[0], etc...
+
+=cut
+
+sub summary {
+    my($self) = shift;
+
+    return map { $_->{'ok'} } @{ $self->{Test_Results} };
+}
+
+=item B<details>
+
+    my @tests = $Test->details;
+
+Like summary(), but with a lot more detail.
+
+    $tests[$test_num - 1] = 
+            { 'ok'       => is the test considered a pass?
+              actual_ok  => did it literally say 'ok'?
+              name       => name of the test (if any)
+              type       => type of test (if any, see below).
+              reason     => reason for the above (if any)
+            };
+
+'ok' is true if Test::Harness will consider the test to be a pass.
+
+'actual_ok' is a reflection of whether or not the test literally
+printed 'ok' or 'not ok'.  This is for examining the result of 'todo'
+tests.  
+
+'name' is the name of the test.
+
+'type' indicates if it was a special test.  Normal tests have a type
+of ''.  Type can be one of the following:
+
+    skip        see skip()
+    todo        see todo()
+    todo_skip   see todo_skip()
+    unknown     see below
+
+Sometimes the Test::Builder test counter is incremented without it
+printing any test output, for example, when current_test() is changed.
+In these cases, Test::Builder doesn't know the result of the test, so
+it's type is 'unkown'.  These details for these tests are filled in.
+They are considered ok, but the name and actual_ok is left undef.
+
+For example "not ok 23 - hole count # TODO insufficient donuts" would
+result in this structure:
+
+    $tests[22] =    # 23 - 1, since arrays start from 0.
+      { ok        => 1,   # logically, the test passed since it's todo
+        actual_ok => 0,   # in absolute terms, it failed
+        name      => 'hole count',
+        type      => 'todo',
+        reason    => 'insufficient donuts'
+      };
+
+=cut
+
+sub details {
+    my $self = shift;
+    return @{ $self->{Test_Results} };
+}
+
+=item B<todo>
+
+    my $todo_reason = $Test->todo;
+    my $todo_reason = $Test->todo($pack);
+
+todo() looks for a $TODO variable in your tests.  If set, all tests
+will be considered 'todo' (see Test::More and Test::Harness for
+details).  Returns the reason (ie. the value of $TODO) if running as
+todo tests, false otherwise.
+
+todo() is about finding the right package to look for $TODO in.  It
+uses the exported_to() package to find it.  If that's not set, it's
+pretty good at guessing the right package to look at based on $Level.
+
+Sometimes there is some confusion about where todo() should be looking
+for the $TODO variable.  If you want to be sure, tell it explicitly
+what $pack to use.
+
+=cut
+
+sub todo {
+    my($self, $pack) = @_;
+
+    $pack = $pack || $self->exported_to || $self->caller($Level);
+    return 0 unless $pack;
+
+    no strict 'refs';
+    return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'}
+                                     : 0;
+}
+
+=item B<caller>
+
+    my $package = $Test->caller;
+    my($pack, $file, $line) = $Test->caller;
+    my($pack, $file, $line) = $Test->caller($height);
+
+Like the normal caller(), except it reports according to your level().
+
+=cut
+
+sub caller {
+    my($self, $height) = @_;
+    $height ||= 0;
+
+    my @caller = CORE::caller($self->level + $height + 1);
+    return wantarray ? @caller : $caller[0];
+}
+
+=back
+
+=cut
+
+=begin _private
+
+=over 4
+
+=item B<_sanity_check>
+
+  $self->_sanity_check();
+
+Runs a bunch of end of test sanity checks to make sure reality came
+through ok.  If anything is wrong it will die with a fairly friendly
+error message.
+
+=cut
+
+#'#
+sub _sanity_check {
+    my $self = shift;
+
+    _whoa($self->{Curr_Test} < 0,  'Says here you ran a negative number of tests!');
+    _whoa(!$self->{Have_Plan} and $self->{Curr_Test}, 
+          'Somehow your tests ran without a plan!');
+    _whoa($self->{Curr_Test} != @{ $self->{Test_Results} },
+          'Somehow you got a different number of results than tests ran!');
+}
+
+=item B<_whoa>
+
+  _whoa($check, $description);
+
+A sanity check, similar to assert().  If the $check is true, something
+has gone horribly wrong.  It will die with the given $description and
+a note to contact the author.
+
+=cut
+
+sub _whoa {
+    my($check, $desc) = @_;
+    if( $check ) {
+        die <<WHOA;
+WHOA!  $desc
+This should never happen!  Please contact the author immediately!
+WHOA
+    }
+}
+
+=item B<_my_exit>
+
+  _my_exit($exit_num);
+
+Perl seems to have some trouble with exiting inside an END block.  5.005_03
+and 5.6.1 both seem to do odd things.  Instead, this function edits $?
+directly.  It should ONLY be called from inside an END block.  It
+doesn't actually exit, that's your job.
+
+=cut
+
+sub _my_exit {
+    $? = $_[0];
+
+    return 1;
+}
+
+
+=back
+
+=end _private
+
+=cut
+
+$SIG{__DIE__} = sub {
+    # We don't want to muck with death in an eval, but $^S isn't
+    # totally reliable.  5.005_03 and 5.6.1 both do the wrong thing
+    # with it.  Instead, we use caller.  This also means it runs under
+    # 5.004!
+    my $in_eval = 0;
+    for( my $stack = 1;  my $sub = (CORE::caller($stack))[3];  $stack++ ) {
+        $in_eval = 1 if $sub =~ /^\(eval\)/;
+    }
+    $Test->{Test_Died} = 1 unless $in_eval;
+};
+
+sub _ending {
+    my $self = shift;
+
+    $self->_sanity_check();
+
+    # Don't bother with an ending if this is a forked copy.  Only the parent
+    # should do the ending.
+    # Exit if plan() was never called.  This is so "require Test::Simple" 
+    # doesn't puke.
+    # Don't do an ending if we bailed out.
+    if( ($self->{Original_Pid} != $$) 			or
+	(!$self->{Have_Plan} && !$self->{Test_Died}) 	or
+	$self->{Bailed_Out}
+      )
+    {
+	_my_exit($?);
+	return;
+    }
+
+    # Figure out if we passed or failed and print helpful messages.
+    my $test_results = $self->{Test_Results};
+    if( @$test_results ) {
+        # The plan?  We have no plan.
+        if( $self->{No_Plan} ) {
+            $self->_print("1..$self->{Curr_Test}\n") unless $self->no_header;
+            $self->{Expected_Tests} = $self->{Curr_Test};
+        }
+
+        # Auto-extended arrays and elements which aren't explicitly
+        # filled in with a shared reference will puke under 5.8.0
+        # ithreads.  So we have to fill them in by hand. :(
+        my $empty_result = &share({});
+        for my $idx ( 0..$self->{Expected_Tests}-1 ) {
+            $test_results->[$idx] = $empty_result
+              unless defined $test_results->[$idx];
+        }
+
+        my $num_failed = grep !$_->{'ok'}, 
+                              @{$test_results}[0..$self->{Curr_Test}-1];
+
+        my $num_extra = $self->{Curr_Test} - $self->{Expected_Tests};
+
+        if( $num_extra < 0 ) {
+            my $s = $self->{Expected_Tests} == 1 ? '' : 's';
+            $self->diag(<<"FAIL");
+Looks like you planned $self->{Expected_Tests} test$s but only ran $self->{Curr_Test}.
+FAIL
+        }
+        elsif( $num_extra > 0 ) {
+            my $s = $self->{Expected_Tests} == 1 ? '' : 's';
+            $self->diag(<<"FAIL");
+Looks like you planned $self->{Expected_Tests} test$s but ran $num_extra extra.
+FAIL
+        }
+
+        if ( $num_failed ) {
+            my $num_tests = $self->{Curr_Test};
+            my $s = $num_failed == 1 ? '' : 's';
+
+            my $qualifier = $num_extra == 0 ? '' : ' run';
+
+            $self->diag(<<"FAIL");
+Looks like you failed $num_failed test$s of $num_tests$qualifier.
+FAIL
+        }
+
+        if( $self->{Test_Died} ) {
+            $self->diag(<<"FAIL");
+Looks like your test died just after $self->{Curr_Test}.
+FAIL
+
+            _my_exit( 255 ) && return;
+        }
+
+        my $exit_code;
+        if( $num_failed ) {
+            $exit_code = $num_failed <= 254 ? $num_failed : 254;
+        }
+        elsif( $num_extra != 0 ) {
+            $exit_code = 255;
+        }
+        else {
+            $exit_code = 0;
+        }
+
+        _my_exit( $exit_code ) && return;
+    }
+    elsif ( $self->{Skip_All} ) {
+        _my_exit( 0 ) && return;
+    }
+    elsif ( $self->{Test_Died} ) {
+        $self->diag(<<'FAIL');
+Looks like your test died before it could output anything.
+FAIL
+        _my_exit( 255 ) && return;
+    }
+    else {
+        $self->diag("No tests run!\n");
+        _my_exit( 255 ) && return;
+    }
+}
+
+END {
+    $Test->_ending if defined $Test and !$Test->no_ending;
+}
+
+=head1 EXIT CODES
+
+If all your tests passed, Test::Builder will exit with zero (which is
+normal).  If anything failed it will exit with how many failed.  If
+you run less (or more) tests than you planned, the missing (or extras)
+will be considered failures.  If no tests were ever run Test::Builder
+will throw a warning and exit with 255.  If the test died, even after
+having successfully completed all its tests, it will still be
+considered a failure and will exit with 255.
+
+So the exit codes are...
+
+    0                   all tests successful
+    255                 test died or all passed but wrong # of tests run
+    any other number    how many failed (including missing or extras)
+
+If you fail more than 254 tests, it will be reported as 254.
+
+
+=head1 THREADS
+
+In perl 5.8.0 and later, Test::Builder is thread-safe.  The test
+number is shared amongst all threads.  This means if one thread sets
+the test number using current_test() they will all be effected.
+
+Test::Builder is only thread-aware if threads.pm is loaded I<before>
+Test::Builder.
+
+=head1 EXAMPLES
+
+CPAN can provide the best examples.  Test::Simple, Test::More,
+Test::Exception and Test::Differences all use Test::Builder.
+
+=head1 SEE ALSO
+
+Test::Simple, Test::More, Test::Harness
+
+=head1 AUTHORS
+
+Original code by chromatic, maintained by Michael G Schwern
+E<lt>schwern@pobox.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright 2002, 2004 by chromatic E<lt>chromatic@wgz.orgE<gt> and
+                        Michael G Schwern E<lt>schwern@pobox.comE<gt>.
+
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+See F<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Builder/Module.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Builder/Module.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Builder/Module.pm	(revision 14489)
@@ -0,0 +1,182 @@
+package Test::Builder::Module;
+
+use Test::Builder;
+
+require Exporter;
+@ISA = qw(Exporter);
+
+$VERSION = '0.02';
+
+use strict;
+
+# 5.004's Exporter doesn't have export_to_level.
+my $_export_to_level = sub {
+      my $pkg = shift;
+      my $level = shift;
+      (undef) = shift;                  # redundant arg
+      my $callpkg = caller($level);
+      $pkg->export($callpkg, @_);
+};
+
+
+=head1 NAME
+
+Test::Builder::Module - Base class for test modules
+
+=head1 SYNOPSIS
+
+  # Emulates Test::Simple
+  package Your::Module;
+
+  my $CLASS = __PACKAGE__;
+
+  use base 'Test::Builder::Module';
+  @EXPORT = qw(ok);
+
+  sub ok ($;$) {
+      my $tb = $CLASS->builder;
+      return $tb->ok(@_);
+  }
+  
+  1;
+
+
+=head1 DESCRIPTION
+
+This is a superclass for Test::Builder-based modules.  It provides a
+handful of common functionality and a method of getting at the underlying
+Test::Builder object.
+
+
+=head2 Importing
+
+Test::Builder::Module is a subclass of Exporter which means your
+module is also a subclass of Exporter.  @EXPORT, @EXPORT_OK, etc...
+all act normally.
+
+A few methods are provided to do the C<use Your::Module tests => 23> part
+for you.
+
+=head3 import
+
+Test::Builder::Module provides an import() method which acts in the
+same basic way as Test::More's, setting the plan and controling
+exporting of functions and variables.  This allows your module to set
+the plan independent of Test::More.
+
+All arguments passed to import() are passed onto 
+C<< Your::Module->builder->plan() >> with the exception of 
+C<import =>[qw(things to import)]>.
+
+    use Your::Module import => [qw(this that)], tests => 23;
+
+says to import the functions this() and that() as well as set the plan
+to be 23 tests.
+
+import() also sets the exported_to() attribute of your builder to be
+the caller of the import() function.
+
+Additional behaviors can be added to your import() method by overriding
+import_extra().
+
+=cut
+
+sub import {
+    my($class) = shift;
+
+    my $test = $class->builder;
+
+    my $caller = caller;
+
+    $test->exported_to($caller);
+
+    $class->import_extra(\@_);
+    my(@imports) = $class->_strip_imports(\@_);
+
+    $test->plan(@_);
+
+    $class->$_export_to_level(1, $class, @imports);
+}
+
+
+sub _strip_imports {
+    my $class = shift;
+    my $list  = shift;
+
+    my @imports = ();
+    my @other   = ();
+    my $idx = 0;
+    while( $idx <= $#{$list} ) {
+        my $item = $list->[$idx];
+
+        if( defined $item and $item eq 'import' ) {
+            push @imports, @{$list->[$idx+1]};
+            $idx++;
+        }
+        else {
+            push @other, $item;
+        }
+
+        $idx++;
+    }
+
+    @$list = @other;
+
+    return @imports;
+}
+
+
+=head3 import_extra
+
+    Your::Module->import_extra(\@import_args);
+
+import_extra() is called by import().  It provides an opportunity for you
+to add behaviors to your module based on its import list.
+
+Any extra arguments which shouldn't be passed on to plan() should be 
+stripped off by this method.
+
+See Test::More for an example of its use.
+
+B<NOTE> This mechanism is I<VERY ALPHA AND LIKELY TO CHANGE> as it
+feels like a bit of an ugly hack in its current form.
+
+=cut
+
+sub import_extra {}
+
+
+=head2 Builder
+
+Test::Builder::Module provides some methods of getting at the underlying
+Test::Builder object.
+
+=head3 builder
+
+  my $builder = Your::Class->builder;
+
+This method returns the Test::Builder object associated with Your::Class.
+It is not a constructor so you can call it as often as you like.
+
+This is the preferred way to get the Test::Builder object.  You should
+I<not> get it via C<< Test::Builder->new >> as was previously
+recommended.
+
+The object returned by builder() may change at runtime so you should
+call builder() inside each function rather than store it in a global.
+
+  sub ok {
+      my $builder = Your::Class->builder;
+
+      return $builder->ok(@_);
+  }
+
+
+=cut
+
+sub builder {
+    return Test::Builder->new;
+}
+
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Builder/Tester.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Builder/Tester.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Builder/Tester.pm	(revision 14489)
@@ -0,0 +1,640 @@
+package Test::Builder::Tester;
+
+use strict;
+use vars qw(@EXPORT $VERSION @ISA);
+$VERSION = "1.02";
+
+use Test::Builder;
+use Symbol;
+use Carp;
+
+=head1 NAME
+
+Test::Builder::Tester - test testsuites that have been built with
+Test::Builder
+
+=head1 SYNOPSIS
+
+    use Test::Builder::Tester tests => 1;
+    use Test::More;
+
+    test_out("not ok 1 - foo");
+    test_fail(+1);
+    fail("foo");
+    test_test("fail works");
+
+=head1 DESCRIPTION
+
+A module that helps you test testing modules that are built with
+B<Test::Builder>.
+
+The testing system is designed to be used by performing a three step
+process for each test you wish to test.  This process starts with using
+C<test_out> and C<test_err> in advance to declare what the testsuite you
+are testing will output with B<Test::Builder> to stdout and stderr.
+
+You then can run the test(s) from your test suite that call
+B<Test::Builder>.  At this point the output of B<Test::Builder> is
+safely captured by B<Test::Builder::Tester> rather than being
+interpreted as real test output.
+
+The final stage is to call C<test_test> that will simply compare what you
+predeclared to what B<Test::Builder> actually outputted, and report the
+results back with a "ok" or "not ok" (with debugging) to the normal
+output.
+
+=cut
+
+####
+# set up testing
+####
+
+my $t = Test::Builder->new;
+
+###
+# make us an exporter
+###
+
+use Exporter;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(test_out test_err test_fail test_diag test_test line_num);
+
+# _export_to_level and import stolen directly from Test::More.  I am
+# the king of cargo cult programming ;-)
+
+# 5.004's Exporter doesn't have export_to_level.
+sub _export_to_level
+{
+      my $pkg = shift;
+      my $level = shift;
+      (undef) = shift;                  # XXX redundant arg
+      my $callpkg = caller($level);
+      $pkg->export($callpkg, @_);
+}
+
+sub import {
+    my $class = shift;
+    my(@plan) = @_;
+
+    my $caller = caller;
+
+    $t->exported_to($caller);
+    $t->plan(@plan);
+
+    my @imports = ();
+    foreach my $idx (0..$#plan) {
+        if( $plan[$idx] eq 'import' ) {
+            @imports = @{$plan[$idx+1]};
+            last;
+        }
+    }
+
+    __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports);
+}
+
+###
+# set up file handles
+###
+
+# create some private file handles
+my $output_handle = gensym;
+my $error_handle  = gensym;
+
+# and tie them to this package
+my $out = tie *$output_handle, "Test::Tester::Tie", "STDOUT";
+my $err = tie *$error_handle,  "Test::Tester::Tie", "STDERR";
+
+####
+# exported functions
+####
+
+# for remembering that we're testing and where we're testing at
+my $testing = 0;
+my $testing_num;
+
+# remembering where the file handles were originally connected
+my $original_output_handle;
+my $original_failure_handle;
+my $original_todo_handle;
+
+my $original_test_number;
+my $original_harness_state;
+
+my $original_harness_env;
+
+# function that starts testing and redirects the filehandles for now
+sub _start_testing
+{
+    # even if we're running under Test::Harness pretend we're not
+    # for now.  This needed so Test::Builder doesn't add extra spaces
+    $original_harness_env = $ENV{HARNESS_ACTIVE} || 0;
+    $ENV{HARNESS_ACTIVE} = 0;
+
+    # remember what the handles were set to
+    $original_output_handle  = $t->output();
+    $original_failure_handle = $t->failure_output();
+    $original_todo_handle    = $t->todo_output();
+
+    # switch out to our own handles
+    $t->output($output_handle);
+    $t->failure_output($error_handle);
+    $t->todo_output($error_handle);
+
+    # clear the expected list
+    $out->reset();
+    $err->reset();
+
+    # remeber that we're testing
+    $testing = 1;
+    $testing_num = $t->current_test;
+    $t->current_test(0);
+
+    # look, we shouldn't do the ending stuff
+    $t->no_ending(1);
+}
+
+=head2 Methods
+
+These are the six methods that are exported as default.
+
+=over 4
+
+=item test_out
+
+=item test_err
+
+Procedures for predeclaring the output that your test suite is
+expected to produce until C<test_test> is called.  These procedures
+automatically assume that each line terminates with "\n".  So
+
+   test_out("ok 1","ok 2");
+
+is the same as
+
+   test_out("ok 1\nok 2");
+
+which is even the same as
+
+   test_out("ok 1");
+   test_out("ok 2");
+
+Once C<test_out> or C<test_err> (or C<test_fail> or C<test_diag>) have
+been called once all further output from B<Test::Builder> will be
+captured by B<Test::Builder::Tester>.  This means that your will not
+be able perform further tests to the normal output in the normal way
+until you call C<test_test> (well, unless you manually meddle with the
+output filehandles)
+
+=cut
+
+sub test_out(@)
+{
+    # do we need to do any setup?
+    _start_testing() unless $testing;
+
+    $out->expect(@_)
+}
+
+sub test_err(@)
+{
+    # do we need to do any setup?
+    _start_testing() unless $testing;
+
+    $err->expect(@_)
+}
+
+=item test_fail
+
+Because the standard failure message that B<Test::Builder> produces
+whenever a test fails will be a common occurrence in your test error
+output, and because has changed between Test::Builder versions, rather
+than forcing you to call C<test_err> with the string all the time like
+so
+
+    test_err("# Failed test ($0 at line ".line_num(+1).")");
+
+C<test_fail> exists as a convenience method that can be called
+instead.  It takes one argument, the offset from the current line that
+the line that causes the fail is on.
+
+    test_fail(+1);
+
+This means that the example in the synopsis could be rewritten
+more simply as:
+
+   test_out("not ok 1 - foo");
+   test_fail(+1);
+   fail("foo");
+   test_test("fail works");
+
+=cut
+
+sub test_fail
+{
+    # do we need to do any setup?
+    _start_testing() unless $testing;
+
+    # work out what line we should be on
+    my ($package, $filename, $line) = caller;
+    $line = $line + (shift() || 0); # prevent warnings
+
+    # expect that on stderr
+    $err->expect("#     Failed test ($0 at line $line)");
+}
+
+=item test_diag
+
+As most of the remaining expected output to the error stream will be
+created by Test::Builder's C<diag> function, B<Test::Builder::Tester>
+provides a convience function C<test_diag> that you can use instead of
+C<test_err>.
+
+The C<test_diag> function prepends comment hashes and spacing to the
+start and newlines to the end of the expected output passed to it and
+adds it to the list of expected error output.  So, instead of writing
+
+   test_err("# Couldn't open file");
+
+you can write
+
+   test_diag("Couldn't open file");
+
+Remember that B<Test::Builder>'s diag function will not add newlines to
+the end of output and test_diag will. So to check
+
+   Test::Builder->new->diag("foo\n","bar\n");
+
+You would do
+
+  test_diag("foo","bar")
+
+without the newlines.
+
+=cut
+
+sub test_diag
+{
+    # do we need to do any setup?
+    _start_testing() unless $testing;
+
+    # expect the same thing, but prepended with "#     "
+    local $_;
+    $err->expect(map {"# $_"} @_)
+}
+
+=item test_test
+
+Actually performs the output check testing the tests, comparing the
+data (with C<eq>) that we have captured from B<Test::Builder> against
+that that was declared with C<test_out> and C<test_err>.
+
+This takes name/value pairs that effect how the test is run.
+
+=over
+
+=item title (synonym 'name', 'label')
+
+The name of the test that will be displayed after the C<ok> or C<not
+ok>.
+
+=item skip_out
+
+Setting this to a true value will cause the test to ignore if the
+output sent by the test to the output stream does not match that
+declared with C<test_out>.
+
+=item skip_err
+
+Setting this to a true value will cause the test to ignore if the
+output sent by the test to the error stream does not match that
+declared with C<test_err>.
+
+=back
+
+As a convience, if only one argument is passed then this argument
+is assumed to be the name of the test (as in the above examples.)
+
+Once C<test_test> has been run test output will be redirected back to
+the original filehandles that B<Test::Builder> was connected to
+(probably STDOUT and STDERR,) meaning any further tests you run
+will function normally and cause success/errors for B<Test::Harness>.
+
+=cut
+
+sub test_test
+{
+   # decode the arguements as described in the pod
+   my $mess;
+   my %args;
+   if (@_ == 1)
+     { $mess = shift }
+   else
+   {
+     %args = @_;
+     $mess = $args{name} if exists($args{name});
+     $mess = $args{title} if exists($args{title});
+     $mess = $args{label} if exists($args{label});
+   }
+
+    # er, are we testing?
+    croak "Not testing.  You must declare output with a test function first."
+	unless $testing;
+
+    # okay, reconnect the test suite back to the saved handles
+    $t->output($original_output_handle);
+    $t->failure_output($original_failure_handle);
+    $t->todo_output($original_todo_handle);
+
+    # restore the test no, etc, back to the original point
+    $t->current_test($testing_num);
+    $testing = 0;
+
+    # re-enable the original setting of the harness
+    $ENV{HARNESS_ACTIVE} = $original_harness_env;
+
+    # check the output we've stashed
+    unless ($t->ok(    ($args{skip_out} || $out->check)
+                    && ($args{skip_err} || $err->check),
+                   $mess))
+    {
+      # print out the diagnostic information about why this
+      # test failed
+
+      local $_;
+
+      $t->diag(map {"$_\n"} $out->complaint)
+	unless $args{skip_out} || $out->check;
+
+      $t->diag(map {"$_\n"} $err->complaint)
+	unless $args{skip_err} || $err->check;
+    }
+}
+
+=item line_num
+
+A utility function that returns the line number that the function was
+called on.  You can pass it an offset which will be added to the
+result.  This is very useful for working out the correct text of
+diagnostic methods that contain line numbers.
+
+Essentially this is the same as the C<__LINE__> macro, but the
+C<line_num(+3)> idiom is arguably nicer.
+
+=cut
+
+sub line_num
+{
+    my ($package, $filename, $line) = caller;
+    return $line + (shift() || 0); # prevent warnings
+}
+
+=back
+
+In addition to the six exported functions there there exists one
+function that can only be accessed with a fully qualified function
+call.
+
+=over 4
+
+=item color
+
+When C<test_test> is called and the output that your tests generate
+does not match that which you declared, C<test_test> will print out
+debug information showing the two conflicting versions.  As this
+output itself is debug information it can be confusing which part of
+the output is from C<test_test> and which was the original output from
+your original tests.  Also, it may be hard to spot things like
+extraneous whitespace at the end of lines that may cause your test to
+fail even though the output looks similar.
+
+To assist you, if you have the B<Term::ANSIColor> module installed
+(which you should do by default from perl 5.005 onwards), C<test_test>
+can colour the background of the debug information to disambiguate the
+different types of output. The debug output will have it's background
+coloured green and red.  The green part represents the text which is
+the same between the executed and actual output, the red shows which
+part differs.
+
+The C<color> function determines if colouring should occur or not.
+Passing it a true or false value will enable or disable colouring
+respectively, and the function called with no argument will return the
+current setting.
+
+To enable colouring from the command line, you can use the
+B<Text::Builder::Tester::Color> module like so:
+
+   perl -Mlib=Text::Builder::Tester::Color test.t
+
+Or by including the B<Test::Builder::Tester::Color> module directly in
+the PERL5LIB.
+
+=cut
+
+my $color;
+sub color
+{
+  $color = shift if @_;
+  $color;
+}
+
+=back
+
+=head1 BUGS
+
+Calls B<Test::Builder>'s C<no_ending> method turning off the ending
+tests.  This is needed as otherwise it will trip out because we've run
+more tests than we strictly should have and it'll register any
+failures we had that we were testing for as real failures.
+
+The color function doesn't work unless B<Term::ANSIColor> is installed
+and is compatible with your terminal.
+
+Bugs (and requests for new features) can be reported to the author
+though the CPAN RT system:
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-Builder-Tester>
+
+=head1 AUTHOR
+
+Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004.
+
+Some code taken from B<Test::More> and B<Test::Catch>, written by by
+Michael G Schwern E<lt>schwern@pobox.comE<gt>.  Hence, those parts
+Copyright Micheal G Schwern 2001.  Used and distributed with
+permission.
+
+This program is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+
+=head1 NOTES
+
+This code has been tested explicitly on the following versions
+of perl: 5.7.3, 5.6.1, 5.6.0, 5.005_03, 5.004_05 and 5.004.
+
+Thanks to Richard Clamp E<lt>richardc@unixbeard.netE<gt> for letting
+me use his testing system to try this module out on.
+
+=head1 SEE ALSO
+
+L<Test::Builder>, L<Test::Builder::Tester::Color>, L<Test::More>.
+
+=cut
+
+1;
+
+####################################################################
+# Helper class that is used to remember expected and received data
+
+package Test::Tester::Tie;
+
+##
+# add line(s) to be expected
+
+sub expect
+{
+    my $self = shift;
+
+    my @checks = @_;
+    foreach my $check (@checks) {
+        $check = $self->_translate_Failed_check($check);
+        push @{$self->[2]}, ref $check ? $check : "$check\n";
+    }
+}
+
+
+sub _translate_Failed_check 
+{
+    my($self, $check) = @_;
+
+    if( $check =~ /\A(.*)#     (Failed .*test) \((.*?) at line (\d+)\)\z/ ) {
+        $check = qr/\Q$1\E#\s+\Q$2\E.*?\n?.*?\Q$3\E at line \Q$4\E.*\n?/;
+    }
+
+    return $check;
+}
+
+
+##
+# return true iff the expected data matches the got data
+
+sub check
+{
+    my $self = shift;
+
+    # turn off warnings as these might be undef
+    local $^W = 0;
+
+    my @checks = @{$self->[2]};
+    my $got = $self->[1];
+    foreach my $check (@checks) {
+        $check = qr/^\Q$check\E/ unless ref $check;
+        return 0 unless $got =~ s/^$check//;
+    }
+
+    return length $got == 0;
+}
+
+##
+# a complaint message about the inputs not matching (to be
+# used for debugging messages)
+
+sub complaint
+{
+    my $self = shift;
+    my $type   = $self->type;
+    my $got    = $self->got;
+    my $wanted = join "\n", @{$self->wanted};
+
+    # are we running in colour mode?
+    if (Test::Builder::Tester::color)
+    {
+      # get color
+      eval "require Term::ANSIColor";
+      unless ($@)
+      {
+	# colours
+
+	my $green = Term::ANSIColor::color("black").
+	            Term::ANSIColor::color("on_green");
+        my $red   = Term::ANSIColor::color("black").
+                    Term::ANSIColor::color("on_red");
+	my $reset = Term::ANSIColor::color("reset");
+
+	# work out where the two strings start to differ
+	my $char = 0;
+	$char++ while substr($got, $char, 1) eq substr($wanted, $char, 1);
+
+	# get the start string and the two end strings
+	my $start     = $green . substr($wanted, 0,   $char);
+	my $gotend    = $red   . substr($got   , $char) . $reset;
+	my $wantedend = $red   . substr($wanted, $char) . $reset;
+
+	# make the start turn green on and off
+	$start =~ s/\n/$reset\n$green/g;
+
+	# make the ends turn red on and off
+	$gotend    =~ s/\n/$reset\n$red/g;
+	$wantedend =~ s/\n/$reset\n$red/g;
+
+	# rebuild the strings
+	$got    = $start . $gotend;
+	$wanted = $start . $wantedend;
+      }
+    }
+
+    return "$type is:\n" .
+           "$got\nnot:\n$wanted\nas expected"
+}
+
+##
+# forget all expected and got data
+
+sub reset
+{
+    my $self = shift;
+    @$self = ($self->[0], '', []);
+}
+
+
+sub got
+{
+    my $self = shift;
+    return $self->[1];
+}
+
+sub wanted
+{
+    my $self = shift;
+    return $self->[2];
+}
+
+sub type
+{
+    my $self = shift;
+    return $self->[0];
+}
+
+###
+# tie interface
+###
+
+sub PRINT  {
+    my $self = shift;
+    $self->[1] .= join '', @_;
+}
+
+sub TIEHANDLE {
+    my($class, $type) = @_;
+
+    my $self = bless [$type], $class;
+    $self->reset;
+
+    return $self;
+}
+
+sub READ {}
+sub READLINE {}
+sub GETC {}
+sub FILENO {}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Builder/Tester/Color.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Builder/Tester/Color.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Builder/Tester/Color.pm	(revision 14489)
@@ -0,0 +1,50 @@
+package Test::Builder::Tester::Color;
+
+use strict;
+
+require Test::Builder::Tester;
+
+=head1 NAME
+
+Test::Builder::Tester::Color - turn on colour in Test::Builder::Tester
+
+=head1 SYNOPSIS
+
+   When running a test script
+
+     perl -MTest::Builder::Tester::Color test.t
+
+=head1 DESCRIPTION
+
+Importing this module causes the subroutine color in Test::Builder::Tester
+to be called with a true value causing colour highlighting to be turned
+on in debug output.
+
+The sole purpose of this module is to enable colour highlighting
+from the command line.
+
+=cut
+
+sub import
+{
+    Test::Builder::Tester::color(1);
+}
+
+=head1 AUTHOR
+
+Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002.
+
+This program is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+
+=head1 BUGS
+
+This module will have no effect unless Term::ANSIColor is installed.
+
+=head1 SEE ALSO
+
+L<Test::Builder::Tester>, L<Term::ANSIColor>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Harness.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Harness.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Harness.pm	(revision 14489)
@@ -0,0 +1,1080 @@
+# -*- Mode: cperl; cperl-indent-level: 4 -*-
+
+package Test::Harness;
+
+require 5.00405;
+use Test::Harness::Straps;
+use Test::Harness::Assert;
+use Exporter;
+use Benchmark;
+use Config;
+use strict;
+
+
+use vars qw(
+    $VERSION 
+    @ISA @EXPORT @EXPORT_OK 
+    $Verbose $Switches $Debug
+    $verbose $switches $debug
+    $Curtest
+    $Columns 
+    $Timer
+    $ML $Last_ML_Print
+    $Strap
+    $has_time_hires
+);
+
+BEGIN {
+    eval "use Time::HiRes 'time'";
+    $has_time_hires = !$@;
+}
+
+=head1 NAME
+
+Test::Harness - Run Perl standard test scripts with statistics
+
+=head1 VERSION
+
+Version 2.56
+
+=cut
+
+$VERSION = "2.56";
+
+# Backwards compatibility for exportable variable names.
+*verbose  = *Verbose;
+*switches = *Switches;
+*debug    = *Debug;
+
+$ENV{HARNESS_ACTIVE} = 1;
+$ENV{HARNESS_VERSION} = $VERSION;
+
+END {
+    # For VMS.
+    delete $ENV{HARNESS_ACTIVE};
+    delete $ENV{HARNESS_VERSION};
+}
+
+# Some experimental versions of OS/2 build have broken $?
+my $Ignore_Exitcode = $ENV{HARNESS_IGNORE_EXITCODE};
+
+my $Files_In_Dir = $ENV{HARNESS_FILELEAK_IN_DIR};
+
+$Strap = Test::Harness::Straps->new;
+
+sub strap { return $Strap };
+
+@ISA = ('Exporter');
+@EXPORT    = qw(&runtests);
+@EXPORT_OK = qw($verbose $switches);
+
+$Verbose  = $ENV{HARNESS_VERBOSE} || 0;
+$Debug    = $ENV{HARNESS_DEBUG} || 0;
+$Switches = "-w";
+$Columns  = $ENV{HARNESS_COLUMNS} || $ENV{COLUMNS} || 80;
+$Columns--;             # Some shells have trouble with a full line of text.
+$Timer    = $ENV{HARNESS_TIMER} || 0;
+
+=head1 SYNOPSIS
+
+  use Test::Harness;
+
+  runtests(@test_files);
+
+=head1 DESCRIPTION
+
+B<STOP!> If all you want to do is write a test script, consider
+using Test::Simple.  Test::Harness is the module that reads the
+output from Test::Simple, Test::More and other modules based on
+Test::Builder.  You don't need to know about Test::Harness to use
+those modules.
+
+Test::Harness runs tests and expects output from the test in a
+certain format.  That format is called TAP, the Test Anything
+Protocol.  It is defined in L<Test::Harness::TAP>.
+
+C<Test::Harness::runtests(@tests)> runs all the testscripts named
+as arguments and checks standard output for the expected strings
+in TAP format.
+
+The F<prove> utility is a thin wrapper around Test::Harness.
+
+=head2 Taint mode
+
+Test::Harness will honor the C<-T> or C<-t> in the #! line on your
+test files.  So if you begin a test with:
+
+    #!perl -T
+
+the test will be run with taint mode on.
+
+=head2 Configuration variables.
+
+These variables can be used to configure the behavior of
+Test::Harness.  They are exported on request.
+
+=over 4
+
+=item C<$Test::Harness::Verbose>
+
+The package variable C<$Test::Harness::Verbose> is exportable and can be
+used to let C<runtests()> display the standard output of the script
+without altering the behavior otherwise.  The F<prove> utility's C<-v>
+flag will set this.
+
+=item C<$Test::Harness::switches>
+
+The package variable C<$Test::Harness::switches> is exportable and can be
+used to set perl command line options used for running the test
+script(s). The default value is C<-w>. It overrides C<HARNESS_SWITCHES>.
+
+=item C<$Test::Harness::Timer>
+
+If set to true, and C<Time::HiRes> is available, print elapsed seconds
+after each test file.
+
+=back
+
+
+=head2 Failure
+
+When tests fail, analyze the summary report:
+
+  t/base..............ok
+  t/nonumbers.........ok
+  t/ok................ok
+  t/test-harness......ok
+  t/waterloo..........dubious
+          Test returned status 3 (wstat 768, 0x300)
+  DIED. FAILED tests 1, 3, 5, 7, 9, 11, 13, 15, 17, 19
+          Failed 10/20 tests, 50.00% okay
+  Failed Test  Stat Wstat Total Fail  Failed  List of Failed
+  -----------------------------------------------------------------------
+  t/waterloo.t    3   768    20   10  50.00%  1 3 5 7 9 11 13 15 17 19
+  Failed 1/5 test scripts, 80.00% okay. 10/44 subtests failed, 77.27% okay.
+
+Everything passed but F<t/waterloo.t>.  It failed 10 of 20 tests and
+exited with non-zero status indicating something dubious happened.
+
+The columns in the summary report mean:
+
+=over 4
+
+=item B<Failed Test>
+
+The test file which failed.
+
+=item B<Stat>
+
+If the test exited with non-zero, this is its exit status.
+
+=item B<Wstat>
+
+The wait status of the test.
+
+=item B<Total>
+
+Total number of tests expected to run.
+
+=item B<Fail>
+
+Number which failed, either from "not ok" or because they never ran.
+
+=item B<Failed>
+
+Percentage of the total tests which failed.
+
+=item B<List of Failed>
+
+A list of the tests which failed.  Successive failures may be
+abbreviated (ie. 15-20 to indicate that tests 15, 16, 17, 18, 19 and
+20 failed).
+
+=back
+
+
+=head2 Functions
+
+Test::Harness currently only has one function, here it is.
+
+=over 4
+
+=item B<runtests>
+
+  my $allok = runtests(@test_files);
+
+This runs all the given I<@test_files> and divines whether they passed
+or failed based on their output to STDOUT (details above).  It prints
+out each individual test which failed along with a summary report and
+a how long it all took.
+
+It returns true if everything was ok.  Otherwise it will C<die()> with
+one of the messages in the DIAGNOSTICS section.
+
+=cut
+
+sub runtests {
+    my(@tests) = @_;
+
+    local ($\, $,);
+
+    my($tot, $failedtests) = _run_all_tests(@tests);
+    _show_results($tot, $failedtests);
+
+    my $ok = _all_ok($tot);
+
+    assert(($ok xor keys %$failedtests), 
+           q{ok status jives with $failedtests});
+
+    return $ok;
+}
+
+=begin _private
+
+=item B<_all_ok>
+
+  my $ok = _all_ok(\%tot);
+
+Tells you if this test run is overall successful or not.
+
+=cut
+
+sub _all_ok {
+    my($tot) = shift;
+
+    return $tot->{bad} == 0 && ($tot->{max} || $tot->{skipped}) ? 1 : 0;
+}
+
+=item B<_globdir>
+
+  my @files = _globdir $dir;
+
+Returns all the files in a directory.  This is shorthand for backwards
+compatibility on systems where C<glob()> doesn't work right.
+
+=cut
+
+sub _globdir { 
+    opendir DIRH, shift; 
+    my @f = readdir DIRH; 
+    closedir DIRH; 
+
+    return @f;
+}
+
+=item B<_run_all_tests>
+
+  my($total, $failed) = _run_all_tests(@test_files);
+
+Runs all the given C<@test_files> (as C<runtests()>) but does it
+quietly (no report).  $total is a hash ref summary of all the tests
+run.  Its keys and values are this:
+
+    bonus           Number of individual todo tests unexpectedly passed
+    max             Number of individual tests ran
+    ok              Number of individual tests passed
+    sub_skipped     Number of individual tests skipped
+    todo            Number of individual todo tests
+
+    files           Number of test files ran
+    good            Number of test files passed
+    bad             Number of test files failed
+    tests           Number of test files originally given
+    skipped         Number of test files skipped
+
+If C<< $total->{bad} == 0 >> and C<< $total->{max} > 0 >>, you've
+got a successful test.
+
+$failed is a hash ref of all the test scripts which failed.  Each key
+is the name of a test script, each value is another hash representing
+how that script failed.  Its keys are these:
+
+    name        Name of the test which failed
+    estat       Script's exit value
+    wstat       Script's wait status
+    max         Number of individual tests
+    failed      Number which failed
+    percent     Percentage of tests which failed
+    canon       List of tests which failed (as string).
+
+C<$failed> should be empty if everything passed.
+
+B<NOTE> Currently this function is still noisy.  I'm working on it.
+
+=cut
+
+# Turns on autoflush for the handle passed
+sub _autoflush {
+    my $flushy_fh = shift;
+    my $old_fh = select $flushy_fh;
+    $| = 1;
+    select $old_fh;
+}
+
+sub _run_all_tests {
+    my @tests = @_;
+
+    _autoflush(\*STDOUT);
+    _autoflush(\*STDERR);
+
+    my(%failedtests);
+
+    # Test-wide totals.
+    my(%tot) = (
+                bonus    => 0,
+                max      => 0,
+                ok       => 0,
+                files    => 0,
+                bad      => 0,
+                good     => 0,
+                tests    => scalar @tests,
+                sub_skipped  => 0,
+                todo     => 0,
+                skipped  => 0,
+                bench    => 0,
+               );
+
+    my @dir_files = _globdir $Files_In_Dir if defined $Files_In_Dir;
+    my $run_start_time = new Benchmark;
+
+    my $width = _leader_width(@tests);
+    foreach my $tfile (@tests) {
+        $Last_ML_Print = 0;  # so each test prints at least once
+        my($leader, $ml) = _mk_leader($tfile, $width);
+        local $ML = $ml;
+
+        print $leader;
+
+        $tot{files}++;
+
+        $Strap->{_seen_header} = 0;
+        if ( $Test::Harness::Debug ) {
+            print "# Running: ", $Strap->_command_line($tfile), "\n";
+        }
+        my $test_start_time = $Timer ? time : 0;
+        my %results = $Strap->analyze_file($tfile) or
+          do { warn $Strap->{error}, "\n";  next };
+        my $elapsed;
+        if ( $Timer ) {
+            $elapsed = time - $test_start_time;
+            if ( $has_time_hires ) {
+                $elapsed = sprintf( " %8.3fs", $elapsed );
+            }
+            else {
+                $elapsed = sprintf( " %8ss", $elapsed ? $elapsed : "<1" );
+            }
+        }
+        else {
+            $elapsed = "";
+        }
+
+        # state of the current test.
+        my @failed = grep { !$results{details}[$_-1]{ok} }
+                     1..@{$results{details}};
+        my %test = (
+                    ok          => $results{ok},
+                    'next'      => $Strap->{'next'},
+                    max         => $results{max},
+                    failed      => \@failed,
+                    bonus       => $results{bonus},
+                    skipped     => $results{skip},
+                    skip_reason => $results{skip_reason},
+                    skip_all    => $Strap->{skip_all},
+                    ml          => $ml,
+                   );
+
+        $tot{bonus}       += $results{bonus};
+        $tot{max}         += $results{max};
+        $tot{ok}          += $results{ok};
+        $tot{todo}        += $results{todo};
+        $tot{sub_skipped} += $results{skip};
+
+        my($estatus, $wstatus) = @results{qw(exit wait)};
+
+        if ($results{passing}) {
+            # XXX Combine these first two
+            if ($test{max} and $test{skipped} + $test{bonus}) {
+                my @msg;
+                push(@msg, "$test{skipped}/$test{max} skipped: $test{skip_reason}")
+                    if $test{skipped};
+                push(@msg, "$test{bonus}/$test{max} unexpectedly succeeded")
+                    if $test{bonus};
+                print "$test{ml}ok$elapsed\n        ".join(', ', @msg)."\n";
+            }
+            elsif ( $test{max} ) {
+                print "$test{ml}ok$elapsed\n";
+            }
+            elsif ( defined $test{skip_all} and length $test{skip_all} ) {
+                print "skipped\n        all skipped: $test{skip_all}\n";
+                $tot{skipped}++;
+            }
+            else {
+                print "skipped\n        all skipped: no reason given\n";
+                $tot{skipped}++;
+            }
+            $tot{good}++;
+        }
+        else {
+            # List unrun tests as failures.
+            if ($test{'next'} <= $test{max}) {
+                push @{$test{failed}}, $test{'next'}..$test{max};
+            }
+            # List overruns as failures.
+            else {
+                my $details = $results{details};
+                foreach my $overrun ($test{max}+1..@$details) {
+                    next unless ref $details->[$overrun-1];
+                    push @{$test{failed}}, $overrun
+                }
+            }
+
+            if ($wstatus) {
+                $failedtests{$tfile} = _dubious_return(\%test, \%tot, 
+                                                       $estatus, $wstatus);
+                $failedtests{$tfile}{name} = $tfile;
+            }
+            elsif($results{seen}) {
+                if (@{$test{failed}} and $test{max}) {
+                    my ($txt, $canon) = _canonfailed($test{max},$test{skipped},
+                                                    @{$test{failed}});
+                    print "$test{ml}$txt";
+                    $failedtests{$tfile} = { canon   => $canon,
+                                             max     => $test{max},
+                                             failed  => scalar @{$test{failed}},
+                                             name    => $tfile, 
+                                             percent => 100*(scalar @{$test{failed}})/$test{max},
+                                             estat   => '',
+                                             wstat   => '',
+                                           };
+                }
+                else {
+                    print "Don't know which tests failed: got $test{ok} ok, ".
+                          "expected $test{max}\n";
+                    $failedtests{$tfile} = { canon   => '??',
+                                             max     => $test{max},
+                                             failed  => '??',
+                                             name    => $tfile, 
+                                             percent => undef,
+                                             estat   => '', 
+                                             wstat   => '',
+                                           };
+                }
+                $tot{bad}++;
+            }
+            else {
+                print "FAILED before any test output arrived\n";
+                $tot{bad}++;
+                $failedtests{$tfile} = { canon       => '??',
+                                         max         => '??',
+                                         failed      => '??',
+                                         name        => $tfile,
+                                         percent     => undef,
+                                         estat       => '', 
+                                         wstat       => '',
+                                       };
+            }
+        }
+
+        if (defined $Files_In_Dir) {
+            my @new_dir_files = _globdir $Files_In_Dir;
+            if (@new_dir_files != @dir_files) {
+                my %f;
+                @f{@new_dir_files} = (1) x @new_dir_files;
+                delete @f{@dir_files};
+                my @f = sort keys %f;
+                print "LEAKED FILES: @f\n";
+                @dir_files = @new_dir_files;
+            }
+        }
+    } # foreach test
+    $tot{bench} = timediff(new Benchmark, $run_start_time);
+
+    $Strap->_restore_PERL5LIB;
+
+    return(\%tot, \%failedtests);
+}
+
+=item B<_mk_leader>
+
+  my($leader, $ml) = _mk_leader($test_file, $width);
+
+Generates the 't/foo........' leader for the given C<$test_file> as well
+as a similar version which will overwrite the current line (by use of
+\r and such).  C<$ml> may be empty if Test::Harness doesn't think you're
+on TTY.
+
+The C<$width> is the width of the "yada/blah.." string.
+
+=cut
+
+sub _mk_leader {
+    my($te, $width) = @_;
+    chomp($te);
+    $te =~ s/\.\w+$/./;
+
+    if ($^O eq 'VMS') {
+        $te =~ s/^.*\.t\./\[.t./s;
+    }
+    my $leader = "$te" . '.' x ($width - length($te));
+    my $ml = "";
+
+    if ( -t STDOUT and not $ENV{HARNESS_NOTTY} and not $Verbose ) {
+        $ml = "\r" . (' ' x 77) . "\r$leader"
+    }
+
+    return($leader, $ml);
+}
+
+=item B<_leader_width>
+
+  my($width) = _leader_width(@test_files);
+
+Calculates how wide the leader should be based on the length of the
+longest test name.
+
+=cut
+
+sub _leader_width {
+    my $maxlen = 0;
+    my $maxsuflen = 0;
+    foreach (@_) {
+        my $suf    = /\.(\w+)$/ ? $1 : '';
+        my $len    = length;
+        my $suflen = length $suf;
+        $maxlen    = $len    if $len    > $maxlen;
+        $maxsuflen = $suflen if $suflen > $maxsuflen;
+    }
+    # + 3 : we want three dots between the test name and the "ok"
+    return $maxlen + 3 - $maxsuflen;
+}
+
+
+sub _show_results {
+    my($tot, $failedtests) = @_;
+
+    my $pct;
+    my $bonusmsg = _bonusmsg($tot);
+
+    if (_all_ok($tot)) {
+        print "All tests successful$bonusmsg.\n";
+    }
+    elsif (!$tot->{tests}){
+        die "FAILED--no tests were run for some reason.\n";
+    }
+    elsif (!$tot->{max}) {
+        my $blurb = $tot->{tests}==1 ? "script" : "scripts";
+        die "FAILED--$tot->{tests} test $blurb could be run, ".
+            "alas--no output ever seen\n";
+    }
+    else {
+        $pct = sprintf("%.2f", $tot->{good} / $tot->{tests} * 100);
+        my $percent_ok = 100*$tot->{ok}/$tot->{max};
+        my $subpct = sprintf " %d/%d subtests failed, %.2f%% okay.",
+                              $tot->{max} - $tot->{ok}, $tot->{max}, 
+                              $percent_ok;
+
+        my($fmt_top, $fmt) = _create_fmts($failedtests);
+
+        # Now write to formats
+        for my $script (sort keys %$failedtests) {
+          $Curtest = $failedtests->{$script};
+          write;
+        }
+        if ($tot->{bad}) {
+            $bonusmsg =~ s/^,\s*//;
+            print "$bonusmsg.\n" if $bonusmsg;
+            die "Failed $tot->{bad}/$tot->{tests} test scripts, $pct% okay.".
+                "$subpct\n";
+        }
+    }
+
+    printf("Files=%d, Tests=%d, %s\n",
+           $tot->{files}, $tot->{max}, timestr($tot->{bench}, 'nop'));
+}
+
+
+my %Handlers = (
+    header => \&header_handler,
+    test => \&test_handler,
+    bailout => \&bailout_handler,
+);
+
+$Strap->{callback} = \&strap_callback;
+sub strap_callback {
+    my($self, $line, $type, $totals) = @_;
+    print $line if $Verbose;
+
+    my $meth = $Handlers{$type};
+    $meth->($self, $line, $type, $totals) if $meth;
+};
+
+
+sub header_handler {
+    my($self, $line, $type, $totals) = @_;
+
+    warn "Test header seen more than once!\n" if $self->{_seen_header};
+
+    $self->{_seen_header}++;
+
+    warn "1..M can only appear at the beginning or end of tests\n"
+      if $totals->{seen} && 
+         $totals->{max}  < $totals->{seen};
+};
+
+sub test_handler {
+    my($self, $line, $type, $totals) = @_;
+
+    my $curr = $totals->{seen};
+    my $next = $self->{'next'};
+    my $max  = $totals->{max};
+    my $detail = $totals->{details}[-1];
+
+    if( $detail->{ok} ) {
+        _print_ml_less("ok $curr/$max");
+
+        if( $detail->{type} eq 'skip' ) {
+            $totals->{skip_reason} = $detail->{reason}
+              unless defined $totals->{skip_reason};
+            $totals->{skip_reason} = 'various reasons'
+              if $totals->{skip_reason} ne $detail->{reason};
+        }
+    }
+    else {
+        _print_ml("NOK $curr");
+    }
+
+    if( $curr > $next ) {
+        print "Test output counter mismatch [test $curr]\n";
+    }
+    elsif( $curr < $next ) {
+        print "Confused test output: test $curr answered after ".
+              "test ", $next - 1, "\n";
+    }
+
+};
+
+sub bailout_handler {
+    my($self, $line, $type, $totals) = @_;
+
+    die "FAILED--Further testing stopped" .
+      ($self->{bailout_reason} ? ": $self->{bailout_reason}\n" : ".\n");
+};
+
+
+sub _print_ml {
+    print join '', $ML, @_ if $ML;
+}
+
+
+# Print updates only once per second.
+sub _print_ml_less {
+    my $now = CORE::time;
+    if ( $Last_ML_Print != $now ) {
+        _print_ml(@_);
+        $Last_ML_Print = $now;
+    }
+}
+
+sub _bonusmsg {
+    my($tot) = @_;
+
+    my $bonusmsg = '';
+    $bonusmsg = (" ($tot->{bonus} subtest".($tot->{bonus} > 1 ? 's' : '').
+               " UNEXPECTEDLY SUCCEEDED)")
+        if $tot->{bonus};
+
+    if ($tot->{skipped}) {
+        $bonusmsg .= ", $tot->{skipped} test"
+                     . ($tot->{skipped} != 1 ? 's' : '');
+        if ($tot->{sub_skipped}) {
+            $bonusmsg .= " and $tot->{sub_skipped} subtest"
+                         . ($tot->{sub_skipped} != 1 ? 's' : '');
+        }
+        $bonusmsg .= ' skipped';
+    }
+    elsif ($tot->{sub_skipped}) {
+        $bonusmsg .= ", $tot->{sub_skipped} subtest"
+                     . ($tot->{sub_skipped} != 1 ? 's' : '')
+                     . " skipped";
+    }
+
+    return $bonusmsg;
+}
+
+# Test program go boom.
+sub _dubious_return {
+    my($test, $tot, $estatus, $wstatus) = @_;
+    my ($failed, $canon, $percent) = ('??', '??');
+
+    printf "$test->{ml}dubious\n\tTest returned status $estatus ".
+           "(wstat %d, 0x%x)\n",
+           $wstatus,$wstatus;
+    print "\t\t(VMS status is $estatus)\n" if $^O eq 'VMS';
+
+    $tot->{bad}++;
+
+    if ($test->{max}) {
+        if ($test->{'next'} == $test->{max} + 1 and not @{$test->{failed}}) {
+            print "\tafter all the subtests completed successfully\n";
+            $percent = 0;
+            $failed = 0;        # But we do not set $canon!
+        }
+        else {
+            push @{$test->{failed}}, $test->{'next'}..$test->{max};
+            $failed = @{$test->{failed}};
+            (my $txt, $canon) = _canonfailed($test->{max},$test->{skipped},@{$test->{failed}});
+            $percent = 100*(scalar @{$test->{failed}})/$test->{max};
+            print "DIED. ",$txt;
+        }
+    }
+
+    return { canon => $canon,  max => $test->{max} || '??',
+             failed => $failed, 
+             percent => $percent,
+             estat => $estatus, wstat => $wstatus,
+           };
+}
+
+
+sub _create_fmts {
+    my($failedtests) = @_;
+
+    my $failed_str = "Failed Test";
+    my $middle_str = " Stat Wstat Total Fail  Failed  ";
+    my $list_str = "List of Failed";
+
+    # Figure out our longest name string for formatting purposes.
+    my $max_namelen = length($failed_str);
+    foreach my $script (keys %$failedtests) {
+        my $namelen = length $failedtests->{$script}->{name};
+        $max_namelen = $namelen if $namelen > $max_namelen;
+    }
+
+    my $list_len = $Columns - length($middle_str) - $max_namelen;
+    if ($list_len < length($list_str)) {
+        $list_len = length($list_str);
+        $max_namelen = $Columns - length($middle_str) - $list_len;
+        if ($max_namelen < length($failed_str)) {
+            $max_namelen = length($failed_str);
+            $Columns = $max_namelen + length($middle_str) + $list_len;
+        }
+    }
+
+    my $fmt_top = "format STDOUT_TOP =\n"
+                  . sprintf("%-${max_namelen}s", $failed_str)
+                  . $middle_str
+                  . $list_str . "\n"
+                  . "-" x $Columns
+                  . "\n.\n";
+
+    my $fmt = "format STDOUT =\n"
+              . "@" . "<" x ($max_namelen - 1)
+              . "  @>> @>>>> @>>>> @>>> ^##.##%  "
+              . "^" . "<" x ($list_len - 1) . "\n"
+              . '{ $Curtest->{name}, $Curtest->{estat},'
+              . '  $Curtest->{wstat}, $Curtest->{max},'
+              . '  $Curtest->{failed}, $Curtest->{percent},'
+              . '  $Curtest->{canon}'
+              . "\n}\n"
+              . "~~" . " " x ($Columns - $list_len - 2) . "^"
+              . "<" x ($list_len - 1) . "\n"
+              . '$Curtest->{canon}'
+              . "\n.\n";
+
+    eval $fmt_top;
+    die $@ if $@;
+    eval $fmt;
+    die $@ if $@;
+
+    return($fmt_top, $fmt);
+}
+
+sub _canonfailed ($$@) {
+    my($max,$skipped,@failed) = @_;
+    my %seen;
+    @failed = sort {$a <=> $b} grep !$seen{$_}++, @failed;
+    my $failed = @failed;
+    my @result = ();
+    my @canon = ();
+    my $min;
+    my $last = $min = shift @failed;
+    my $canon;
+    if (@failed) {
+        for (@failed, $failed[-1]) { # don't forget the last one
+            if ($_ > $last+1 || $_ == $last) {
+                push @canon, ($min == $last) ? $last : "$min-$last";
+                $min = $_;
+            }
+            $last = $_;
+        }
+        local $" = ", ";
+        push @result, "FAILED tests @canon\n";
+        $canon = join ' ', @canon;
+    }
+    else {
+        push @result, "FAILED test $last\n";
+        $canon = $last;
+    }
+
+    push @result, "\tFailed $failed/$max tests, ";
+    if ($max) {
+	push @result, sprintf("%.2f",100*(1-$failed/$max)), "% okay";
+    }
+    else {
+	push @result, "?% okay";
+    }
+    my $ender = 's' x ($skipped > 1);
+    if ($skipped) {
+        my $good = $max - $failed - $skipped;
+	my $skipmsg = " (less $skipped skipped test$ender: $good okay, ";
+	if ($max) {
+	    my $goodper = sprintf("%.2f",100*($good/$max));
+	    $skipmsg .= "$goodper%)";
+        }
+        else {
+	    $skipmsg .= "?%)";
+	}
+	push @result, $skipmsg;
+    }
+    push @result, "\n";
+    my $txt = join "", @result;
+    ($txt, $canon);
+}
+
+=end _private
+
+=back
+
+=cut
+
+
+1;
+__END__
+
+
+=head1 EXPORT
+
+C<&runtests> is exported by Test::Harness by default.
+
+C<$verbose>, C<$switches> and C<$debug> are exported upon request.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item C<All tests successful.\nFiles=%d,  Tests=%d, %s>
+
+If all tests are successful some statistics about the performance are
+printed.
+
+=item C<FAILED tests %s\n\tFailed %d/%d tests, %.2f%% okay.>
+
+For any single script that has failing subtests statistics like the
+above are printed.
+
+=item C<Test returned status %d (wstat %d)>
+
+Scripts that return a non-zero exit status, both C<$? E<gt>E<gt> 8>
+and C<$?> are printed in a message similar to the above.
+
+=item C<Failed 1 test, %.2f%% okay. %s>
+
+=item C<Failed %d/%d tests, %.2f%% okay. %s>
+
+If not all tests were successful, the script dies with one of the
+above messages.
+
+=item C<FAILED--Further testing stopped: %s>
+
+If a single subtest decides that further testing will not make sense,
+the script dies with this message.
+
+=back
+
+=head1 ENVIRONMENT VARIABLES THAT TEST::HARNESS SETS
+
+Test::Harness sets these before executing the individual tests.
+
+=over 4
+
+=item C<HARNESS_ACTIVE>
+
+This is set to a true value.  It allows the tests to determine if they
+are being executed through the harness or by any other means.
+
+=item C<HARNESS_VERSION>
+
+This is the version of Test::Harness.
+
+=back
+
+=head1 ENVIRONMENT VARIABLES THAT AFFECT TEST::HARNESS
+
+=over 4
+
+=item C<HARNESS_COLUMNS>
+
+This value will be used for the width of the terminal. If it is not
+set then it will default to C<COLUMNS>. If this is not set, it will
+default to 80. Note that users of Bourne-sh based shells will need to
+C<export COLUMNS> for this module to use that variable.
+
+=item C<HARNESS_COMPILE_TEST>
+
+When true it will make harness attempt to compile the test using
+C<perlcc> before running it.
+
+B<NOTE> This currently only works when sitting in the perl source
+directory!
+
+=item C<HARNESS_DEBUG>
+
+If true, Test::Harness will print debugging information about itself as
+it runs the tests.  This is different from C<HARNESS_VERBOSE>, which prints
+the output from the test being run.  Setting C<$Test::Harness::Debug> will
+override this, or you can use the C<-d> switch in the F<prove> utility.
+
+=item C<HARNESS_FILELEAK_IN_DIR>
+
+When set to the name of a directory, harness will check after each
+test whether new files appeared in that directory, and report them as
+
+  LEAKED FILES: scr.tmp 0 my.db
+
+If relative, directory name is with respect to the current directory at
+the moment runtests() was called.  Putting absolute path into 
+C<HARNESS_FILELEAK_IN_DIR> may give more predictable results.
+
+=item C<HARNESS_IGNORE_EXITCODE>
+
+Makes harness ignore the exit status of child processes when defined.
+
+=item C<HARNESS_NOTTY>
+
+When set to a true value, forces it to behave as though STDOUT were
+not a console.  You may need to set this if you don't want harness to
+output more frequent progress messages using carriage returns.  Some
+consoles may not handle carriage returns properly (which results in a
+somewhat messy output).
+
+=item C<HARNESS_PERL>
+
+Usually your tests will be run by C<$^X>, the currently-executing Perl.
+However, you may want to have it run by a different executable, such as
+a threading perl, or a different version.
+
+If you're using the F<prove> utility, you can use the C<--perl> switch.
+
+=item C<HARNESS_PERL_SWITCHES>
+
+Its value will be prepended to the switches used to invoke perl on
+each test.  For example, setting C<HARNESS_PERL_SWITCHES> to C<-W> will
+run all tests with all warnings enabled.
+
+=item C<HARNESS_VERBOSE>
+
+If true, Test::Harness will output the verbose results of running
+its tests.  Setting C<$Test::Harness::verbose> will override this,
+or you can use the C<-v> switch in the F<prove> utility.
+
+=back
+
+=head1 EXAMPLE
+
+Here's how Test::Harness tests itself
+
+  $ cd ~/src/devel/Test-Harness
+  $ perl -Mblib -e 'use Test::Harness qw(&runtests $verbose);
+    $verbose=0; runtests @ARGV;' t/*.t
+  Using /home/schwern/src/devel/Test-Harness/blib
+  t/base..............ok
+  t/nonumbers.........ok
+  t/ok................ok
+  t/test-harness......ok
+  All tests successful.
+  Files=4, Tests=24, 2 wallclock secs ( 0.61 cusr + 0.41 csys = 1.02 CPU)
+
+=head1 SEE ALSO
+
+The included F<prove> utility for running test scripts from the command line,
+L<Test> and L<Test::Simple> for writing test scripts, L<Benchmark> for
+the underlying timing routines, and L<Devel::Cover> for test coverage
+analysis.
+
+=head1 TODO
+
+Provide a way of running tests quietly (ie. no printing) for automated
+validation of tests.  This will probably take the form of a version
+of runtests() which rather than printing its output returns raw data
+on the state of the tests.  (Partially done in Test::Harness::Straps)
+
+Document the format.
+
+Fix HARNESS_COMPILE_TEST without breaking its core usage.
+
+Figure a way to report test names in the failure summary.
+
+Rework the test summary so long test names are not truncated as badly.
+(Partially done with new skip test styles)
+
+Add option for coverage analysis.
+
+Trap STDERR.
+
+Implement Straps total_results()
+
+Remember exit code
+
+Completely redo the print summary code.
+
+Implement Straps callbacks.  (experimentally implemented)
+
+Straps->analyze_file() not taint clean, don't know if it can be
+
+Fix that damned VMS nit.
+
+HARNESS_TODOFAIL to display TODO failures
+
+Add a test for verbose.
+
+Change internal list of test results to a hash.
+
+Fix stats display when there's an overrun.
+
+Fix so perls with spaces in the filename work.
+
+Keeping whittling away at _run_all_tests()
+
+Clean up how the summary is printed.  Get rid of those damned formats.
+
+=head1 BUGS
+
+HARNESS_COMPILE_TEST currently assumes it's run from the Perl source
+directory.
+
+Please use the CPAN bug ticketing system at L<http://rt.cpan.org/>.
+You can also mail bugs, fixes and enhancements to 
+C<< <bug-test-harness >> at C<< rt.cpan.org> >>.
+
+=head1 AUTHORS
+
+Either Tim Bunce or Andreas Koenig, we don't know. What we know for
+sure is, that it was inspired by Larry Wall's TEST script that came
+with perl distributions for ages. Numerous anonymous contributors
+exist.  Andreas Koenig held the torch for many years, and then
+Michael G Schwern.
+
+Current maintainer is Andy Lester C<< <andy at petdance.com> >>.
+
+=head1 COPYRIGHT
+
+Copyright 2002-2005
+by Michael G Schwern C<< <schwern at pobox.com> >>,
+Andy Lester C<< <andy at petdance.com> >>.
+
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Assert.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Assert.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Assert.pm	(revision 14489)
@@ -0,0 +1,66 @@
+# $Id: Assert.pm 250 2003-09-11 15:57:29Z andy $
+
+package Test::Harness::Assert;
+
+use strict;
+require Exporter;
+use vars qw($VERSION @EXPORT @ISA);
+
+$VERSION = '0.02';
+
+@ISA = qw(Exporter);
+@EXPORT = qw(assert);
+
+
+=head1 NAME
+
+Test::Harness::Assert - simple assert
+
+=head1 SYNOPSIS
+
+  ### FOR INTERNAL USE ONLY ###
+
+  use Test::Harness::Assert;
+
+  assert( EXPR, $name );
+
+=head1 DESCRIPTION
+
+A simple assert routine since we don't have Carp::Assert handy.
+
+B<For internal use by Test::Harness ONLY!>
+
+=head1 FUNCTIONS
+
+=head2 C<assert()>
+
+  assert( EXPR, $name );
+
+If the expression is false the program aborts.
+
+=cut
+
+sub assert ($;$) {
+    my($assert, $name) = @_;
+
+    unless( $assert ) {
+        require Carp;
+        my $msg = 'Assert failed';
+        $msg .= " - '$name'" if defined $name;
+        $msg .= '!';
+        Carp::croak($msg);
+    }
+
+}
+
+=head1 AUTHOR
+
+Michael G Schwern C<< <schwern@pobox.com> >>
+
+=head1 SEE ALSO
+
+L<Carp::Assert>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Iterator.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Iterator.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Iterator.pm	(revision 14489)
@@ -0,0 +1,70 @@
+package Test::Harness::Iterator;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = 0.02;
+
+=head1 NAME
+
+Test::Harness::Iterator - Internal Test::Harness Iterator
+
+=head1 SYNOPSIS
+
+  use Test::Harness::Iterator;
+  my $it = Test::Harness::Iterator->new(\*TEST);
+  my $it = Test::Harness::Iterator->new(\@array);
+
+  my $line = $it->next;
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY!>
+
+This is a simple iterator wrapper for arrays and filehandles.
+
+=head2 new()
+
+Create an iterator.
+
+=head2 next()
+
+Iterate through it, of course.
+
+=cut
+
+sub new {
+    my($proto, $thing) = @_;
+
+    my $self = {};
+    if( ref $thing eq 'GLOB' ) {
+        bless $self, 'Test::Harness::Iterator::FH';
+        $self->{fh} = $thing;
+    }
+    elsif( ref $thing eq 'ARRAY' ) {
+        bless $self, 'Test::Harness::Iterator::ARRAY';
+        $self->{idx}   = 0;
+        $self->{array} = $thing;
+    }
+    else {
+        warn "Can't iterate with a ", ref $thing;
+    }
+
+    return $self;
+}
+
+package Test::Harness::Iterator::FH;
+sub next {
+    my $fh = $_[0]->{fh};
+
+    # readline() doesn't work so good on 5.5.4.
+    return scalar <$fh>;
+}
+
+
+package Test::Harness::Iterator::ARRAY;
+sub next {
+    my $self = shift;
+    return $self->{array}->[$self->{idx}++];
+}
+
+"Steve Peters, Master Of True Value Finding, was here.";
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Point.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Point.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Point.pm	(revision 14489)
@@ -0,0 +1,152 @@
+# -*- Mode: cperl; cperl-indent-level: 4 -*-
+package Test::Harness::Point;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.01';
+
+=head1 NAME
+
+Test::Harness::Point - object for tracking a single test point
+
+=head1 SYNOPSIS
+
+One Test::Harness::Point object represents a single test point.
+
+=head1 CONSTRUCTION
+
+=head2 new()
+
+    my $point = new Test::Harness::Point;
+
+Create a test point object.
+
+=cut
+
+sub new {
+    my $class = shift;
+    my $self  = bless {}, $class;
+
+    return $self;
+}
+
+my $test_line_regex = qr/
+    ^
+    (not\ )?               # failure?
+    ok\b
+    (?:\s+(\d+))?         # optional test number
+    \s*
+    (.*)                  # and the rest
+/ox;
+
+=head1 from_test_line( $line )
+
+Constructor from a TAP test line, or empty return if the test line
+is not a test line.
+
+=cut
+
+sub from_test_line  {
+    my $class = shift;
+    my $line = shift or return;
+
+    # We pulverize the line down into pieces in three parts.
+    my ($not, $number, $extra) = ($line =~ $test_line_regex ) or return;
+
+    my $point = $class->new;
+    $point->set_number( $number );
+    $point->set_ok( !$not );
+
+    if ( $extra ) {
+        my ($description,$directive) = split( /(?:[^\\]|^)#/, $extra, 2 );
+        $description =~ s/^- //; # Test::More puts it in there
+        $point->set_description( $description );
+        if ( $directive ) {
+            $point->set_directive( $directive );
+        }
+    } # if $extra
+
+    return $point;
+} # from_test_line()
+
+=head1 ACCESSORS
+
+Each of the following fields has a getter and setter method.
+
+=over 4
+
+=item * ok
+
+=item * number
+
+=cut
+
+sub ok              { my $self = shift; $self->{ok} }
+sub set_ok          {
+    my $self = shift;
+    my $ok = shift;
+    $self->{ok} = $ok ? 1 : 0;
+}
+sub pass {
+    my $self = shift;
+
+    return ($self->ok || $self->is_todo || $self->is_skip) ? 1 : 0;
+}
+
+sub number          { my $self = shift; $self->{number} }
+sub set_number      { my $self = shift; $self->{number} = shift }
+
+sub description     { my $self = shift; $self->{description} }
+sub set_description {
+    my $self = shift;
+    $self->{description} = shift;
+    $self->{name} = $self->{description}; # history
+}
+
+sub directive       { my $self = shift; $self->{directive} }
+sub set_directive   {
+    my $self = shift;
+    my $directive = shift;
+
+    $directive =~ s/^\s+//;
+    $directive =~ s/\s+$//;
+    $self->{directive} = $directive;
+
+    my ($type,$reason) = ($directive =~ /^\s*(\S+)(?:\s+(.*))?$/);
+    $self->set_directive_type( $type );
+    $reason = "" unless defined $reason;
+    $self->{directive_reason} = $reason;
+}
+sub set_directive_type {
+    my $self = shift;
+    $self->{directive_type} = lc shift;
+    $self->{type} = $self->{directive_type}; # History
+}
+sub set_directive_reason {
+    my $self = shift;
+    $self->{directive_reason} = shift;
+}
+sub directive_type  { my $self = shift; $self->{directive_type} }
+sub type            { my $self = shift; $self->{directive_type} }
+sub directive_reason{ my $self = shift; $self->{directive_reason} }
+sub reason          { my $self = shift; $self->{directive_reason} }
+sub is_todo {
+    my $self = shift;
+    my $type = $self->directive_type;
+    return $type && ( $type eq 'todo' );
+}
+sub is_skip {
+    my $self = shift;
+    my $type = $self->directive_type;
+    return $type && ( $type eq 'skip' );
+}
+
+sub diagnostics     {
+    my $self = shift;
+    return @{$self->{diagnostics}} if wantarray;
+    return join( "\n", @{$self->{diagnostics}} );
+}
+sub add_diagnostic  { my $self = shift; push @{$self->{diagnostics}}, @_ }
+
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Straps.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Straps.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/Straps.pm	(revision 14489)
@@ -0,0 +1,681 @@
+# -*- Mode: cperl; cperl-indent-level: 4 -*-
+package Test::Harness::Straps;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.26';
+
+use Config;
+use Test::Harness::Assert;
+use Test::Harness::Iterator;
+use Test::Harness::Point;
+
+# Flags used as return values from our methods.  Just for internal 
+# clarification.
+my $YES   = (1==1);
+my $NO    = !$YES;
+
+=head1 NAME
+
+Test::Harness::Straps - detailed analysis of test results
+
+=head1 SYNOPSIS
+
+  use Test::Harness::Straps;
+
+  my $strap = Test::Harness::Straps->new;
+
+  # Various ways to interpret a test
+  my %results = $strap->analyze($name, \@test_output);
+  my %results = $strap->analyze_fh($name, $test_filehandle);
+  my %results = $strap->analyze_file($test_file);
+
+  # UNIMPLEMENTED
+  my %total = $strap->total_results;
+
+  # Altering the behavior of the strap  UNIMPLEMENTED
+  my $verbose_output = $strap->dump_verbose();
+  $strap->dump_verbose_fh($output_filehandle);
+
+
+=head1 DESCRIPTION
+
+B<THIS IS ALPHA SOFTWARE> in that the interface is subject to change
+in incompatible ways.  It is otherwise stable.
+
+Test::Harness is limited to printing out its results.  This makes
+analysis of the test results difficult for anything but a human.  To
+make it easier for programs to work with test results, we provide
+Test::Harness::Straps.  Instead of printing the results, straps
+provide them as raw data.  You can also configure how the tests are to
+be run.
+
+The interface is currently incomplete.  I<Please> contact the author
+if you'd like a feature added or something change or just have
+comments.
+
+=head1 CONSTRUCTION
+
+=head2 new()
+
+  my $strap = Test::Harness::Straps->new;
+
+Initialize a new strap.
+
+=cut
+
+sub new {
+    my $class = shift;
+    my $self  = bless {}, $class;
+
+    $self->_init;
+
+    return $self;
+}
+
+=head2 $strap->_init
+
+  $strap->_init;
+
+Initialize the internal state of a strap to make it ready for parsing.
+
+=cut
+
+sub _init {
+    my($self) = shift;
+
+    $self->{_is_vms}   = ( $^O eq 'VMS' );
+    $self->{_is_win32} = ( $^O =~ /^(MS)?Win32$/ );
+    $self->{_is_macos} = ( $^O eq 'MacOS' );
+}
+
+=head1 ANALYSIS
+
+=head2 $strap->analyze( $name, \@output_lines )
+
+    my %results = $strap->analyze($name, \@test_output);
+
+Analyzes the output of a single test, assigning it the given C<$name>
+for use in the total report.  Returns the C<%results> of the test.
+See L<Results>.
+
+C<@test_output> should be the raw output from the test, including
+newlines.
+
+=cut
+
+sub analyze {
+    my($self, $name, $test_output) = @_;
+
+    my $it = Test::Harness::Iterator->new($test_output);
+    return $self->_analyze_iterator($name, $it);
+}
+
+
+sub _analyze_iterator {
+    my($self, $name, $it) = @_;
+
+    $self->_reset_file_state;
+    $self->{file} = $name;
+    my %totals  = (
+                   max      => 0,
+                   seen     => 0,
+
+                   ok       => 0,
+                   todo     => 0,
+                   skip     => 0,
+                   bonus    => 0,
+
+                   details  => []
+                  );
+
+    # Set them up here so callbacks can have them.
+    $self->{totals}{$name}         = \%totals;
+    while( defined(my $line = $it->next) ) {
+        $self->_analyze_line($line, \%totals);
+        last if $self->{saw_bailout};
+    }
+
+    $totals{skip_all} = $self->{skip_all} if defined $self->{skip_all};
+
+    my $passed = ($totals{max} == 0 && defined $totals{skip_all}) ||
+                 ($totals{max} && $totals{seen} &&
+                  $totals{max} == $totals{seen} && 
+                  $totals{max} == $totals{ok});
+    $totals{passing} = $passed ? 1 : 0;
+
+    return %totals;
+}
+
+
+sub _analyze_line {
+    my $self = shift;
+    my $line = shift;
+    my $totals = shift;
+
+    $self->{line}++;
+
+    my $linetype;
+    my $point = Test::Harness::Point->from_test_line( $line );
+    if ( $point ) {
+        $linetype = 'test';
+
+        $totals->{seen}++;
+        $point->set_number( $self->{'next'} ) unless $point->number;
+
+        # sometimes the 'not ' and the 'ok' are on different lines,
+        # happens often on VMS if you do:
+        #   print "not " unless $test;
+        #   print "ok $num\n";
+        if ( $self->{lone_not_line} && ($self->{lone_not_line} == $self->{line} - 1) ) {
+            $point->set_ok( 0 );
+        }
+
+        if ( $self->{todo}{$point->number} ) {
+            $point->set_directive_type( 'todo' );
+        }
+
+        if ( $point->is_todo ) {
+            $totals->{todo}++;
+            $totals->{bonus}++ if $point->ok;
+        }
+        elsif ( $point->is_skip ) {
+            $totals->{skip}++;
+        }
+
+        $totals->{ok}++ if $point->pass;
+
+        if ( ($point->number > 100_000) && ($point->number > ($self->{max}||100_000)) ) {
+            if ( !$self->{too_many_tests}++ ) {
+                warn "Enormous test number seen [test ", $point->number, "]\n";
+                warn "Can't detailize, too big.\n";
+            }
+        }
+        else {
+            my $details = {
+                ok          => $point->pass,
+                actual_ok   => $point->ok,
+                name        => _def_or_blank( $point->description ),
+                type        => _def_or_blank( $point->directive_type ),
+                reason      => _def_or_blank( $point->directive_reason ),
+            };
+
+            assert( defined( $details->{ok} ) && defined( $details->{actual_ok} ) );
+            $totals->{details}[$point->number - 1] = $details;
+        }
+    } # test point
+    elsif ( $line =~ /^not\s+$/ ) {
+        $linetype = 'other';
+        # Sometimes the "not " and "ok" will be on separate lines on VMS.
+        # We catch this and remember we saw it.
+        $self->{lone_not_line} = $self->{line};
+    }
+    elsif ( $self->_is_header($line) ) {
+        $linetype = 'header';
+
+        $self->{saw_header}++;
+
+        $totals->{max} += $self->{max};
+    }
+    elsif ( $self->_is_bail_out($line, \$self->{bailout_reason}) ) {
+        $linetype = 'bailout';
+        $self->{saw_bailout} = 1;
+    }
+    elsif (my $diagnostics = $self->_is_diagnostic_line( $line )) {
+        $linetype = 'other';
+        my $test = $totals->{details}[-1];
+        $test->{diagnostics} ||=  '';
+        $test->{diagnostics}  .= $diagnostics;
+    }
+    else {
+        $linetype = 'other';
+    }
+
+    $self->{callback}->($self, $line, $linetype, $totals) if $self->{callback};
+
+    $self->{'next'} = $point->number + 1 if $point;
+} # _analyze_line
+
+
+sub _is_diagnostic_line {
+    my ($self, $line) = @_;
+    return if index( $line, '# Looks like you failed' ) == 0;
+    $line =~ s/^#\s//;
+    return $line;
+}
+
+=head2 $strap->analyze_fh( $name, $test_filehandle )
+
+    my %results = $strap->analyze_fh($name, $test_filehandle);
+
+Like C<analyze>, but it reads from the given filehandle.
+
+=cut
+
+sub analyze_fh {
+    my($self, $name, $fh) = @_;
+
+    my $it = Test::Harness::Iterator->new($fh);
+    return $self->_analyze_iterator($name, $it);
+}
+
+=head2 $strap->analyze_file( $test_file )
+
+    my %results = $strap->analyze_file($test_file);
+
+Like C<analyze>, but it runs the given C<$test_file> and parses its
+results.  It will also use that name for the total report.
+
+=cut
+
+sub analyze_file {
+    my($self, $file) = @_;
+
+    unless( -e $file ) {
+        $self->{error} = "$file does not exist";
+        return;
+    }
+
+    unless( -r $file ) {
+        $self->{error} = "$file is not readable";
+        return;
+    }
+
+    local $ENV{PERL5LIB} = $self->_INC2PERL5LIB;
+    if ( $Test::Harness::Debug ) {
+        local $^W=0; # ignore undef warnings
+        print "# PERL5LIB=$ENV{PERL5LIB}\n";
+    }
+
+    # *sigh* this breaks under taint, but open -| is unportable.
+    my $line = $self->_command_line($file);
+
+    unless ( open(FILE, "$line|" )) {
+        print "can't run $file. $!\n";
+        return;
+    }
+
+    my %results = $self->analyze_fh($file, \*FILE);
+    my $exit    = close FILE;
+    $results{'wait'} = $?;
+    if( $? && $self->{_is_vms} ) {
+        eval q{use vmsish "status"; $results{'exit'} = $?};
+    }
+    else {
+        $results{'exit'} = _wait2exit($?);
+    }
+    $results{passing} = 0 unless $? == 0;
+
+    $self->_restore_PERL5LIB();
+
+    return %results;
+}
+
+
+eval { require POSIX; &POSIX::WEXITSTATUS(0) };
+if( $@ ) {
+    *_wait2exit = sub { $_[0] >> 8 };
+}
+else {
+    *_wait2exit = sub { POSIX::WEXITSTATUS($_[0]) }
+}
+
+=head2 $strap->_command_line( $file )
+
+Returns the full command line that will be run to test I<$file>.
+
+=cut
+
+sub _command_line {
+    my $self = shift;
+    my $file = shift;
+
+    my $command =  $self->_command();
+    my $switches = $self->_switches($file);
+
+    $file = qq["$file"] if ($file =~ /\s/) && ($file !~ /^".*"$/);
+    my $line = "$command $switches $file";
+
+    return $line;
+}
+
+
+=head2 $strap->_command()
+
+Returns the command that runs the test.  Combine this with C<_switches()>
+to build a command line.
+
+Typically this is C<$^X>, but you can set C<$ENV{HARNESS_PERL}>
+to use a different Perl than what you're running the harness under.
+This might be to run a threaded Perl, for example.
+
+You can also overload this method if you've built your own strap subclass,
+such as a PHP interpreter for a PHP-based strap.
+
+=cut
+
+sub _command {
+    my $self = shift;
+
+    return $ENV{HARNESS_PERL}           if defined $ENV{HARNESS_PERL};
+    return qq("$^X")    if $self->{_is_win32} && $^X =~ /[^\w\.\/\\]/;
+    return $^X;
+}
+
+
+=head2 $strap->_switches( $file )
+
+Formats and returns the switches necessary to run the test.
+
+=cut
+
+sub _switches {
+    my($self, $file) = @_;
+
+    my @existing_switches = $self->_cleaned_switches( $Test::Harness::Switches, $ENV{HARNESS_PERL_SWITCHES} );
+    my @derived_switches;
+
+    local *TEST;
+    open(TEST, $file) or print "can't open $file. $!\n";
+    my $shebang = <TEST>;
+    close(TEST) or print "can't close $file. $!\n";
+
+    my $taint = ( $shebang =~ /^#!.*\bperl.*\s-\w*([Tt]+)/ );
+    push( @derived_switches, "-$1" ) if $taint;
+
+    # When taint mode is on, PERL5LIB is ignored.  So we need to put
+    # all that on the command line as -Is.
+    # MacPerl's putenv is broken, so it will not see PERL5LIB, tainted or not.
+    if ( $taint || $self->{_is_macos} ) {
+	my @inc = $self->_filtered_INC;
+	push @derived_switches, map { "-I$_" } @inc;
+    }
+
+    # Quote the argument if there's any whitespace in it, or if
+    # we're VMS, since VMS requires all parms quoted.  Also, don't quote
+    # it if it's already quoted.
+    for ( @derived_switches ) {
+	$_ = qq["$_"] if ((/\s/ || $self->{_is_vms}) && !/^".*"$/ );
+    }
+    return join( " ", @existing_switches, @derived_switches );
+}
+
+=head2 $strap->_cleaned_switches( @switches_from_user )
+
+Returns only defined, non-blank, trimmed switches from the parms passed.
+
+=cut
+
+sub _cleaned_switches {
+    my $self = shift;
+
+    local $_;
+
+    my @switches;
+    for ( @_ ) {
+	my $switch = $_;
+	next unless defined $switch;
+	$switch =~ s/^\s+//;
+	$switch =~ s/\s+$//;
+	push( @switches, $switch ) if $switch ne "";
+    }
+
+    return @switches;
+}
+
+=head2 $strap->_INC2PERL5LIB
+
+  local $ENV{PERL5LIB} = $self->_INC2PERL5LIB;
+
+Takes the current value of C<@INC> and turns it into something suitable
+for putting onto C<PERL5LIB>.
+
+=cut
+
+sub _INC2PERL5LIB {
+    my($self) = shift;
+
+    $self->{_old5lib} = $ENV{PERL5LIB};
+
+    return join $Config{path_sep}, $self->_filtered_INC;
+}
+
+=head2 $strap->_filtered_INC()
+
+  my @filtered_inc = $self->_filtered_INC;
+
+Shortens C<@INC> by removing redundant and unnecessary entries.
+Necessary for OSes with limited command line lengths, like VMS.
+
+=cut
+
+sub _filtered_INC {
+    my($self, @inc) = @_;
+    @inc = @INC unless @inc;
+
+    if( $self->{_is_vms} ) {
+	# VMS has a 255-byte limit on the length of %ENV entries, so
+	# toss the ones that involve perl_root, the install location
+        @inc = grep !/perl_root/i, @inc;
+
+    }
+    elsif ( $self->{_is_win32} ) {
+	# Lose any trailing backslashes in the Win32 paths
+	s/[\\\/+]$// foreach @inc;
+    }
+
+    my %seen;
+    $seen{$_}++ foreach $self->_default_inc();
+    @inc = grep !$seen{$_}++, @inc;
+
+    return @inc;
+}
+
+
+sub _default_inc {
+    my $self = shift;
+
+    local $ENV{PERL5LIB};
+    my $perl = $self->_command;
+    my @inc =`$perl -le "print join qq[\\n], \@INC"`;
+    chomp @inc;
+    return @inc;
+}
+
+
+=head2 $strap->_restore_PERL5LIB()
+
+  $self->_restore_PERL5LIB;
+
+This restores the original value of the C<PERL5LIB> environment variable.
+Necessary on VMS, otherwise a no-op.
+
+=cut
+
+sub _restore_PERL5LIB {
+    my($self) = shift;
+
+    return unless $self->{_is_vms};
+
+    if (defined $self->{_old5lib}) {
+        $ENV{PERL5LIB} = $self->{_old5lib};
+    }
+}
+
+=head1 Parsing
+
+Methods for identifying what sort of line you're looking at.
+
+=head2 C<_is_diagnostic>
+
+    my $is_diagnostic = $strap->_is_diagnostic($line, \$comment);
+
+Checks if the given line is a comment.  If so, it will place it into
+C<$comment> (sans #).
+
+=cut
+
+sub _is_diagnostic {
+    my($self, $line, $comment) = @_;
+
+    if( $line =~ /^\s*\#(.*)/ ) {
+        $$comment = $1;
+        return $YES;
+    }
+    else {
+        return $NO;
+    }
+}
+
+=head2 C<_is_header>
+
+  my $is_header = $strap->_is_header($line);
+
+Checks if the given line is a header (1..M) line.  If so, it places how
+many tests there will be in C<< $strap->{max} >>, a list of which tests
+are todo in C<< $strap->{todo} >> and if the whole test was skipped
+C<< $strap->{skip_all} >> contains the reason.
+
+=cut
+
+# Regex for parsing a header.  Will be run with /x
+my $Extra_Header_Re = <<'REGEX';
+                       ^
+                        (?: \s+ todo \s+ ([\d \t]+) )?      # optional todo set
+                        (?: \s* \# \s* ([\w:]+\s?) (.*) )?     # optional skip with optional reason
+REGEX
+
+sub _is_header {
+    my($self, $line) = @_;
+
+    if( my($max, $extra) = $line =~ /^1\.\.(\d+)(.*)/ ) {
+        $self->{max}  = $max;
+        assert( $self->{max} >= 0,  'Max # of tests looks right' );
+
+        if( defined $extra ) {
+            my($todo, $skip, $reason) = $extra =~ /$Extra_Header_Re/xo;
+
+            $self->{todo} = { map { $_ => 1 } split /\s+/, $todo } if $todo;
+
+            if( $self->{max} == 0 ) {
+                $reason = '' unless defined $skip and $skip =~ /^Skip/i;
+            }
+
+            $self->{skip_all} = $reason;
+        }
+
+        return $YES;
+    }
+    else {
+        return $NO;
+    }
+}
+
+=head2 C<_is_bail_out>
+
+  my $is_bail_out = $strap->_is_bail_out($line, \$reason);
+
+Checks if the line is a "Bail out!".  Places the reason for bailing
+(if any) in $reason.
+
+=cut
+
+sub _is_bail_out {
+    my($self, $line, $reason) = @_;
+
+    if( $line =~ /^Bail out!\s*(.*)/i ) {
+        $$reason = $1 if $1;
+        return $YES;
+    }
+    else {
+        return $NO;
+    }
+}
+
+=head2 C<_reset_file_state>
+
+  $strap->_reset_file_state;
+
+Resets things like C<< $strap->{max} >> , C<< $strap->{skip_all} >>,
+etc. so it's ready to parse the next file.
+
+=cut
+
+sub _reset_file_state {
+    my($self) = shift;
+
+    delete @{$self}{qw(max skip_all todo too_many_tests)};
+    $self->{line}       = 0;
+    $self->{saw_header} = 0;
+    $self->{saw_bailout}= 0;
+    $self->{lone_not_line} = 0;
+    $self->{bailout_reason} = '';
+    $self->{'next'}       = 1;
+}
+
+=head1 Results
+
+The C<%results> returned from C<analyze()> contain the following
+information:
+
+  passing           true if the whole test is considered a pass 
+                    (or skipped), false if its a failure
+
+  exit              the exit code of the test run, if from a file
+  wait              the wait code of the test run, if from a file
+
+  max               total tests which should have been run
+  seen              total tests actually seen
+  skip_all          if the whole test was skipped, this will 
+                      contain the reason.
+
+  ok                number of tests which passed 
+                      (including todo and skips)
+
+  todo              number of todo tests seen
+  bonus             number of todo tests which 
+                      unexpectedly passed
+
+  skip              number of tests skipped
+
+So a successful test should have max == seen == ok.
+
+
+There is one final item, the details.
+
+  details           an array ref reporting the result of 
+                    each test looks like this:
+
+    $results{details}[$test_num - 1] = 
+            { ok          => is the test considered ok?
+              actual_ok   => did it literally say 'ok'?
+              name        => name of the test (if any)
+              diagnostics => test diagnostics (if any)
+              type        => 'skip' or 'todo' (if any)
+              reason      => reason for the above (if any)
+            };
+
+Element 0 of the details is test #1.  I tried it with element 1 being
+#1 and 0 being empty, this is less awkward.
+
+=head1 EXAMPLES
+
+See F<examples/mini_harness.plx> for an example of use.
+
+=head1 AUTHOR
+
+Michael G Schwern C<< <schwern@pobox.com> >>, currently maintained by
+Andy Lester C<< <andy@petdance.com> >>.
+
+=head1 SEE ALSO
+
+L<Test::Harness>
+
+=cut
+
+sub _def_or_blank {
+    return $_[0] if defined $_[0];
+    return "";
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/TAP.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/TAP.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Harness/TAP.pod	(revision 14489)
@@ -0,0 +1,366 @@
+=head1 NAME
+
+Test::Harness::TAP - Documentation for the TAP format
+
+=head1 SYNOPSIS
+
+TAP, the Test Anything Protocol, is Perl's simple text-based interface
+between testing modules such as Test::More and the test harness
+Test::Harness.
+
+=head1 TODO
+
+Exit code of the process.
+
+=head1 THE TAP FORMAT
+
+TAP's general format is:
+
+    1..N
+    ok 1 Description # Directive
+    # Diagnostic
+    ....
+    ok 47 Description
+    ok 48 Description
+    more tests....
+
+For example, a test file's output might look like:
+
+    1..4
+    ok 1 - Input file opened
+    not ok 2 - First line of the input valid
+    ok 3 - Read the rest of the file
+    not ok 4 - Summarized correctly # TODO Not written yet
+
+=head1 HARNESS BEHAVIOR
+
+In this document, the "harness" is any program analyzing TAP output.
+Typically this will be Perl's I<prove> program, or the underlying
+C<Test::Harness::runtests> subroutine.
+
+A harness must only read TAP output from standard output and not
+from standard error.  Lines written to standard output matching
+C</^(not )?ok\b/> must be interpreted as test lines.  All other
+lines must not be considered test output.
+
+=head1 TESTS LINES AND THE PLAN
+
+=head2 The plan
+
+The plan tells how many tests will be run, or how many tests have
+run.  It's a check that the test file hasn't stopped prematurely.
+It must appear once, whether at the beginning or end of the output.
+
+The plan is usually the first line of TAP output and it specifies how
+many test points are to follow. For example,
+
+    1..10
+
+means you plan on running 10 tests. This is a safeguard in case your test
+file dies silently in the middle of its run.  The plan is optional but if
+there is a plan before the test points it must be the first non-diagnostic
+line output by the test file.
+
+In certain instances a test file may not know how many test points
+it will ultimately be running. In this case the plan can be the last
+non-diagnostic line in the output.
+
+The plan cannot appear in the middle of the output, nor can it appear more
+than once.
+
+=head2 The test line
+
+The core of TAP is the test line.  A test file prints one test line test
+point executed. There must be at least one test line in TAP output. Each
+test line comprises the following elements:
+
+=over 4
+
+=item * C<ok> or C<not ok>
+
+This tells whether the test point passed or failed. It must be
+at the beginning of the line. C</^not ok/> indicates a failed test
+point. C</^ok/> is a successful test point. This is the only mandatory
+part of the line.
+
+Note that unlike the Directives below, C<ok> and C<not ok> are
+case-sensitive.
+
+=item * Test number
+
+TAP expects the C<ok> or C<not ok> to be followed by a test point
+number. If there is no number the harness must maintain
+its own counter until the script supplies test numbers again. So
+the following test output
+
+    1..6
+    not ok
+    ok
+    not ok
+    ok
+    ok
+
+has five tests.  The sixth is missing.  Test::Harness will generate
+
+    FAILED tests 1, 3, 6
+    Failed 3/6 tests, 50.00% okay
+
+=item * Description
+
+Any text after the test number but before a C<#> is the description of
+the test point.
+
+    ok 42 this is the description of the test
+
+Descriptions should not begin with a digit so that they are not confused
+with the test point number.
+
+The harness may do whatever it wants with the description.
+
+=item * Directive
+
+The test point may include a directive, following a hash on the
+test line.  There are currently two directives allowed: C<TODO> and
+C<SKIP>.  These are discussed below.
+
+=back
+
+To summarize:
+
+=over 4
+
+=item * ok/not ok (required)
+
+=item * Test number (recommended)
+
+=item * Description (recommended)
+
+=item * Directive (only when necessary)
+
+=back
+
+=head1 DIRECTIVES
+
+Directives are special notes that follow a C<#> on the test line.
+Only two are currently defined: C<TODO> and C<SKIP>.  Note that
+these two keywords are not case-sensitive.
+
+=head2 TODO tests
+
+If the directive starts with C<# TODO>, the test is counted as a
+todo test, and the text after C<TODO> is the explanation.
+
+    not ok 13 # TODO bend space and time
+
+Note that if the TODO has an explanation it must be separated from
+C<TODO> by a space.
+
+These tests represent a feature to be implemented or a bug to be fixed
+and act as something of an executable "things to do" list.  They are
+B<not> expected to succeed.  Should a todo test point begin succeeding,
+the harness should report it as a bonus.  This indicates that whatever
+you were supposed to do has been done and you should promote this to a
+normal test point.
+
+=head2 Skipping tests
+
+If the directive starts with C<# SKIP>, the test is counted as having
+been skipped.  If the whole test file succeeds, the count of skipped
+tests is included in the generated output.  The harness should report
+the text after C< # SKIP\S*\s+> as a reason for skipping.
+
+    ok 23 # skip Insufficient flogiston pressure.
+
+Similarly, one can include an explanation in a plan line,
+emitted if the test file is skipped completely:
+
+    1..0 # Skipped: WWW::Mechanize not installed
+
+=head1 OTHER LINES
+
+=head2 Bail out!
+
+As an emergency measure a test script can decide that further tests
+are useless (e.g. missing dependencies) and testing should stop
+immediately. In that case the test script prints the magic words
+
+    Bail out!
+
+to standard output. Any message after these words must be displayed
+by the interpreter as the reason why testing must be stopped, as
+in
+
+    Bail out! MySQL is not running.
+
+=head2 Diagnostics
+
+Additional information may be put into the testing output on separate
+lines.  Diagnostic lines should begin with a C<#>, which the harness must
+ignore, at least as far as analyzing the test results.  The harness is
+free, however, to display the diagnostics.  Typically diagnostics are
+used to provide information about the environment in which test file is
+running, or to delineate a group of tests.
+
+    ...
+    ok 18 - Closed database connection
+    # End of database section.
+    # This starts the network part of the test.
+    # Daemon started on port 2112
+    ok 19 - Opened socket
+    ...
+    ok 47 - Closed socket
+    # End of network tests
+
+=head2 Anything else
+
+Any output line that is not a plan, a test line or a diagnostic is
+incorrect.  How a harness handles the incorrect line is undefined.
+Test::Harness silently ignores incorrect lines, but will become more
+stringent in the future.
+
+=head1 EXAMPLES
+
+All names, places, and events depicted in any example are wholly
+fictitious and bear no resemblance to, connection with, or relation to any
+real entity. Any such similarity is purely coincidental, unintentional,
+and unintended.
+
+=head2 Common with explanation
+
+The following TAP listing declares that six tests follow as well as
+provides handy feedback as to what the test is about to do. All six
+tests pass.
+
+    1..6
+    #
+    # Create a new Board and Tile, then place
+    # the Tile onto the board.
+    #
+    ok 1 - The object isa Board
+    ok 2 - Board size is zero
+    ok 3 - The object isa Tile
+    ok 4 - Get possible places to put the Tile
+    ok 5 - Placing the tile produces no error
+    ok 6 - Board size is 1
+
+=head2 Unknown amount and failures
+
+This hypothetical test program ensures that a handful of servers are
+online and network-accessible. Because it retrieves the hypothetical
+servers from a database, it doesn't know exactly how many servers it
+will need to ping. Thus, the test count is declared at the bottom after
+all the test points have run. Also, two of the tests fail.
+
+    ok 1 - retrieving servers from the database
+    # need to ping 6 servers
+    ok 2 - pinged diamond
+    ok 3 - pinged ruby
+    not ok 4 - pinged saphire
+    ok 5 - pinged onyx
+    not ok 6 - pinged quartz
+    ok 7 - pinged gold
+    1..7
+
+=head2 Giving up
+
+This listing reports that a pile of tests are going to be run. However,
+the first test fails, reportedly because a connection to the database
+could not be established. The program decided that continuing was
+pointless and exited.
+
+    1..573
+    not ok 1 - database handle
+    Bail out! Couldn't connect to database.
+
+=head2 Skipping a few
+
+The following listing plans on running 5 tests. However, our program
+decided to not run tests 2 thru 5 at all. To properly report this,
+the tests are marked as being skipped.
+
+    1..5
+    ok 1 - approved operating system
+    # $^0 is solaris
+    ok 2 - # SKIP no /sys directory
+    ok 3 - # SKIP no /sys directory
+    ok 4 - # SKIP no /sys directory
+    ok 5 - # SKIP no /sys directory
+
+=head2 Skipping everything
+
+This listing shows that the entire listing is a skip. No tests were run.
+
+    1..0 # skip because English-to-French translator isn't installed
+
+=head2 Got spare tuits?
+
+The following example reports that four tests are run and the last two
+tests failed. However, because the failing tests are marked as things
+to do later, they are considered successes. Thus, a harness should report
+this entire listing as a success.
+
+    1..4
+    ok 1 - Creating test program
+    ok 2 - Test program runs, no error
+    not ok 3 - infinite loop # TODO halting problem unsolved
+    not ok 4 - infinite loop 2 # TODO halting problem unsolved
+
+=head2 Creative liberties
+
+This listing shows an alternate output where the test numbers aren't
+provided. The test also reports the state of a ficticious board game in
+diagnostic form. Finally, the test count is reported at the end.
+
+    ok - created Board
+    ok
+    ok
+    ok
+    ok
+    ok
+    ok
+    ok
+    # +------+------+------+------+
+    # |      |16G   |      |05C   |
+    # |      |G N C |      |C C G |
+    # |      |  G   |      |  C  +|
+    # +------+------+------+------+
+    # |10C   |01G   |      |03C   |
+    # |R N G |G A G |      |C C C |
+    # |  R   |  G   |      |  C  +|
+    # +------+------+------+------+
+    # |      |01G   |17C   |00C   |
+    # |      |G A G |G N R |R N R |
+    # |      |  G   |  R   |  G   |
+    # +------+------+------+------+
+    ok - board has 7 tiles + starter tile
+    1..9
+
+=head1 AUTHORS
+
+Andy Lester, based on the original Test::Harness documentation by Michael Schwern.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to
+Pete Krawczyk,
+Paul Johnson,
+Ian Langworth
+and Nik Clayton
+for help and contributions on this document.
+
+The basis for the TAP format was created by Larry Wall in the
+original test script for Perl 1.  Tim Bunce and Andreas Koenig
+developed it further with their modifications to Test::Harness.
+
+=head1 COPYRIGHT
+
+Copyright 2003-2005 by
+Michael G Schwern C<< <schwern@pobox.com> >>,
+Andy Lester C<< <andy@petdance.com> >>.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/More.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/More.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/More.pm	(revision 14489)
@@ -0,0 +1,1536 @@
+package Test::More;
+
+use 5.004;
+
+use strict;
+
+
+# Can't use Carp because it might cause use_ok() to accidentally succeed
+# even though the module being used forgot to use Carp.  Yes, this
+# actually happened.
+sub _carp {
+    my($file, $line) = (caller(1))[1,2];
+    warn @_, " at $file line $line\n";
+}
+
+
+
+use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS $TODO);
+$VERSION = '0.62';
+$VERSION = eval $VERSION;    # make the alpha version come out as a number
+
+use Test::Builder::Module;
+@ISA    = qw(Test::Builder::Module);
+@EXPORT = qw(ok use_ok require_ok
+             is isnt like unlike is_deeply
+             cmp_ok
+             skip todo todo_skip
+             pass fail
+             eq_array eq_hash eq_set
+             $TODO
+             plan
+             can_ok  isa_ok
+             diag
+	     BAIL_OUT
+            );
+
+
+=head1 NAME
+
+Test::More - yet another framework for writing test scripts
+
+=head1 SYNOPSIS
+
+  use Test::More tests => $Num_Tests;
+  # or
+  use Test::More qw(no_plan);
+  # or
+  use Test::More skip_all => $reason;
+
+  BEGIN { use_ok( 'Some::Module' ); }
+  require_ok( 'Some::Module' );
+
+  # Various ways to say "ok"
+  ok($this eq $that, $test_name);
+
+  is  ($this, $that,    $test_name);
+  isnt($this, $that,    $test_name);
+
+  # Rather than print STDERR "# here's what went wrong\n"
+  diag("here's what went wrong");
+
+  like  ($this, qr/that/, $test_name);
+  unlike($this, qr/that/, $test_name);
+
+  cmp_ok($this, '==', $that, $test_name);
+
+  is_deeply($complex_structure1, $complex_structure2, $test_name);
+
+  SKIP: {
+      skip $why, $how_many unless $have_some_feature;
+
+      ok( foo(),       $test_name );
+      is( foo(42), 23, $test_name );
+  };
+
+  TODO: {
+      local $TODO = $why;
+
+      ok( foo(),       $test_name );
+      is( foo(42), 23, $test_name );
+  };
+
+  can_ok($module, @methods);
+  isa_ok($object, $class);
+
+  pass($test_name);
+  fail($test_name);
+
+  BAIL_OUT($why);
+
+  # UNIMPLEMENTED!!!
+  my @status = Test::More::status;
+
+
+=head1 DESCRIPTION
+
+B<STOP!> If you're just getting started writing tests, have a look at
+Test::Simple first.  This is a drop in replacement for Test::Simple
+which you can switch to once you get the hang of basic testing.
+
+The purpose of this module is to provide a wide range of testing
+utilities.  Various ways to say "ok" with better diagnostics,
+facilities to skip tests, test future features and compare complicated
+data structures.  While you can do almost anything with a simple
+C<ok()> function, it doesn't provide good diagnostic output.
+
+
+=head2 I love it when a plan comes together
+
+Before anything else, you need a testing plan.  This basically declares
+how many tests your script is going to run to protect against premature
+failure.
+
+The preferred way to do this is to declare a plan when you C<use Test::More>.
+
+  use Test::More tests => $Num_Tests;
+
+There are rare cases when you will not know beforehand how many tests
+your script is going to run.  In this case, you can declare that you
+have no plan.  (Try to avoid using this as it weakens your test.)
+
+  use Test::More qw(no_plan);
+
+B<NOTE>: using no_plan requires a Test::Harness upgrade else it will
+think everything has failed.  See L<CAVEATS and NOTES>).
+
+In some cases, you'll want to completely skip an entire testing script.
+
+  use Test::More skip_all => $skip_reason;
+
+Your script will declare a skip with the reason why you skipped and
+exit immediately with a zero (success).  See L<Test::Harness> for
+details.
+
+If you want to control what functions Test::More will export, you
+have to use the 'import' option.  For example, to import everything
+but 'fail', you'd do:
+
+  use Test::More tests => 23, import => ['!fail'];
+
+Alternatively, you can use the plan() function.  Useful for when you
+have to calculate the number of tests.
+
+  use Test::More;
+  plan tests => keys %Stuff * 3;
+
+or for deciding between running the tests at all:
+
+  use Test::More;
+  if( $^O eq 'MacOS' ) {
+      plan skip_all => 'Test irrelevant on MacOS';
+  }
+  else {
+      plan tests => 42;
+  }
+
+=cut
+
+sub plan {
+    my $tb = Test::More->builder;
+
+    $tb->plan(@_);
+}
+
+
+# This implements "use Test::More 'no_diag'" but the behavior is
+# deprecated.
+sub import_extra {
+    my $class = shift;
+    my $list  = shift;
+
+    my @other = ();
+    my $idx = 0;
+    while( $idx <= $#{$list} ) {
+        my $item = $list->[$idx];
+
+        if( defined $item and $item eq 'no_diag' ) {
+            $class->builder->no_diag(1);
+        }
+        else {
+            push @other, $item;
+        }
+
+        $idx++;
+    }
+
+    @$list = @other;
+}
+
+
+=head2 Test names
+
+By convention, each test is assigned a number in order.  This is
+largely done automatically for you.  However, it's often very useful to
+assign a name to each test.  Which would you rather see:
+
+  ok 4
+  not ok 5
+  ok 6
+
+or
+
+  ok 4 - basic multi-variable
+  not ok 5 - simple exponential
+  ok 6 - force == mass * acceleration
+
+The later gives you some idea of what failed.  It also makes it easier
+to find the test in your script, simply search for "simple
+exponential".
+
+All test functions take a name argument.  It's optional, but highly
+suggested that you use it.
+
+
+=head2 I'm ok, you're not ok.
+
+The basic purpose of this module is to print out either "ok #" or "not
+ok #" depending on if a given test succeeded or failed.  Everything
+else is just gravy.
+
+All of the following print "ok" or "not ok" depending on if the test
+succeeded or failed.  They all also return true or false,
+respectively.
+
+=over 4
+
+=item B<ok>
+
+  ok($this eq $that, $test_name);
+
+This simply evaluates any expression (C<$this eq $that> is just a
+simple example) and uses that to determine if the test succeeded or
+failed.  A true expression passes, a false one fails.  Very simple.
+
+For example:
+
+    ok( $exp{9} == 81,                   'simple exponential' );
+    ok( Film->can('db_Main'),            'set_db()' );
+    ok( $p->tests == 4,                  'saw tests' );
+    ok( !grep !defined $_, @items,       'items populated' );
+
+(Mnemonic:  "This is ok.")
+
+$test_name is a very short description of the test that will be printed
+out.  It makes it very easy to find a test in your script when it fails
+and gives others an idea of your intentions.  $test_name is optional,
+but we B<very> strongly encourage its use.
+
+Should an ok() fail, it will produce some diagnostics:
+
+    not ok 18 - sufficient mucus
+    #   Failed test 'sufficient mucus'
+    #   in foo.t at line 42.
+
+This is actually Test::Simple's ok() routine.
+
+=cut
+
+sub ok ($;$) {
+    my($test, $name) = @_;
+    my $tb = Test::More->builder;
+
+    $tb->ok($test, $name);
+}
+
+=item B<is>
+
+=item B<isnt>
+
+  is  ( $this, $that, $test_name );
+  isnt( $this, $that, $test_name );
+
+Similar to ok(), is() and isnt() compare their two arguments
+with C<eq> and C<ne> respectively and use the result of that to
+determine if the test succeeded or failed.  So these:
+
+    # Is the ultimate answer 42?
+    is( ultimate_answer(), 42,          "Meaning of Life" );
+
+    # $foo isn't empty
+    isnt( $foo, '',     "Got some foo" );
+
+are similar to these:
+
+    ok( ultimate_answer() eq 42,        "Meaning of Life" );
+    ok( $foo ne '',     "Got some foo" );
+
+(Mnemonic:  "This is that."  "This isn't that.")
+
+So why use these?  They produce better diagnostics on failure.  ok()
+cannot know what you are testing for (beyond the name), but is() and
+isnt() know what the test was and why it failed.  For example this
+test:
+
+    my $foo = 'waffle';  my $bar = 'yarblokos';
+    is( $foo, $bar,   'Is foo the same as bar?' );
+
+Will produce something like this:
+
+    not ok 17 - Is foo the same as bar?
+    #   Failed test 'Is foo the same as bar?'
+    #   in foo.t at line 139.
+    #          got: 'waffle'
+    #     expected: 'yarblokos'
+
+So you can figure out what went wrong without rerunning the test.
+
+You are encouraged to use is() and isnt() over ok() where possible,
+however do not be tempted to use them to find out if something is
+true or false!
+
+  # XXX BAD!
+  is( exists $brooklyn{tree}, 1, 'A tree grows in Brooklyn' );
+
+This does not check if C<exists $brooklyn{tree}> is true, it checks if
+it returns 1.  Very different.  Similar caveats exist for false and 0.
+In these cases, use ok().
+
+  ok( exists $brooklyn{tree},    'A tree grows in Brooklyn' );
+
+For those grammatical pedants out there, there's an C<isn't()>
+function which is an alias of isnt().
+
+=cut
+
+sub is ($$;$) {
+    my $tb = Test::More->builder;
+
+    $tb->is_eq(@_);
+}
+
+sub isnt ($$;$) {
+    my $tb = Test::More->builder;
+
+    $tb->isnt_eq(@_);
+}
+
+*isn't = \&isnt;
+
+
+=item B<like>
+
+  like( $this, qr/that/, $test_name );
+
+Similar to ok(), like() matches $this against the regex C<qr/that/>.
+
+So this:
+
+    like($this, qr/that/, 'this is like that');
+
+is similar to:
+
+    ok( $this =~ /that/, 'this is like that');
+
+(Mnemonic "This is like that".)
+
+The second argument is a regular expression.  It may be given as a
+regex reference (i.e. C<qr//>) or (for better compatibility with older
+perls) as a string that looks like a regex (alternative delimiters are
+currently not supported):
+
+    like( $this, '/that/', 'this is like that' );
+
+Regex options may be placed on the end (C<'/that/i'>).
+
+Its advantages over ok() are similar to that of is() and isnt().  Better
+diagnostics on failure.
+
+=cut
+
+sub like ($$;$) {
+    my $tb = Test::More->builder;
+
+    $tb->like(@_);
+}
+
+
+=item B<unlike>
+
+  unlike( $this, qr/that/, $test_name );
+
+Works exactly as like(), only it checks if $this B<does not> match the
+given pattern.
+
+=cut
+
+sub unlike ($$;$) {
+    my $tb = Test::More->builder;
+
+    $tb->unlike(@_);
+}
+
+
+=item B<cmp_ok>
+
+  cmp_ok( $this, $op, $that, $test_name );
+
+Halfway between ok() and is() lies cmp_ok().  This allows you to
+compare two arguments using any binary perl operator.
+
+    # ok( $this eq $that );
+    cmp_ok( $this, 'eq', $that, 'this eq that' );
+
+    # ok( $this == $that );
+    cmp_ok( $this, '==', $that, 'this == that' );
+
+    # ok( $this && $that );
+    cmp_ok( $this, '&&', $that, 'this && that' );
+    ...etc...
+
+Its advantage over ok() is when the test fails you'll know what $this
+and $that were:
+
+    not ok 1
+    #   Failed test in foo.t at line 12.
+    #     '23'
+    #         &&
+    #     undef
+
+It's also useful in those cases where you are comparing numbers and
+is()'s use of C<eq> will interfere:
+
+    cmp_ok( $big_hairy_number, '==', $another_big_hairy_number );
+
+=cut
+
+sub cmp_ok($$$;$) {
+    my $tb = Test::More->builder;
+
+    $tb->cmp_ok(@_);
+}
+
+
+=item B<can_ok>
+
+  can_ok($module, @methods);
+  can_ok($object, @methods);
+
+Checks to make sure the $module or $object can do these @methods
+(works with functions, too).
+
+    can_ok('Foo', qw(this that whatever));
+
+is almost exactly like saying:
+
+    ok( Foo->can('this') && 
+        Foo->can('that') && 
+        Foo->can('whatever') 
+      );
+
+only without all the typing and with a better interface.  Handy for
+quickly testing an interface.
+
+No matter how many @methods you check, a single can_ok() call counts
+as one test.  If you desire otherwise, use:
+
+    foreach my $meth (@methods) {
+        can_ok('Foo', $meth);
+    }
+
+=cut
+
+sub can_ok ($@) {
+    my($proto, @methods) = @_;
+    my $class = ref $proto || $proto;
+    my $tb = Test::More->builder;
+
+    unless( @methods ) {
+        my $ok = $tb->ok( 0, "$class->can(...)" );
+        $tb->diag('    can_ok() called with no methods');
+        return $ok;
+    }
+
+    my @nok = ();
+    foreach my $method (@methods) {
+        local($!, $@);  # don't interfere with caller's $@
+                        # eval sometimes resets $!
+        eval { $proto->can($method) } || push @nok, $method;
+    }
+
+    my $name;
+    $name = @methods == 1 ? "$class->can('$methods[0]')" 
+                          : "$class->can(...)";
+    
+    my $ok = $tb->ok( !@nok, $name );
+
+    $tb->diag(map "    $class->can('$_') failed\n", @nok);
+
+    return $ok;
+}
+
+=item B<isa_ok>
+
+  isa_ok($object, $class, $object_name);
+  isa_ok($ref,    $type,  $ref_name);
+
+Checks to see if the given C<< $object->isa($class) >>.  Also checks to make
+sure the object was defined in the first place.  Handy for this sort
+of thing:
+
+    my $obj = Some::Module->new;
+    isa_ok( $obj, 'Some::Module' );
+
+where you'd otherwise have to write
+
+    my $obj = Some::Module->new;
+    ok( defined $obj && $obj->isa('Some::Module') );
+
+to safeguard against your test script blowing up.
+
+It works on references, too:
+
+    isa_ok( $array_ref, 'ARRAY' );
+
+The diagnostics of this test normally just refer to 'the object'.  If
+you'd like them to be more specific, you can supply an $object_name
+(for example 'Test customer').
+
+=cut
+
+sub isa_ok ($$;$) {
+    my($object, $class, $obj_name) = @_;
+    my $tb = Test::More->builder;
+
+    my $diag;
+    $obj_name = 'The object' unless defined $obj_name;
+    my $name = "$obj_name isa $class";
+    if( !defined $object ) {
+        $diag = "$obj_name isn't defined";
+    }
+    elsif( !ref $object ) {
+        $diag = "$obj_name isn't a reference";
+    }
+    else {
+        # We can't use UNIVERSAL::isa because we want to honor isa() overrides
+        local($@, $!);  # eval sometimes resets $!
+        my $rslt = eval { $object->isa($class) };
+        if( $@ ) {
+            if( $@ =~ /^Can't call method "isa" on unblessed reference/ ) {
+                if( !UNIVERSAL::isa($object, $class) ) {
+                    my $ref = ref $object;
+                    $diag = "$obj_name isn't a '$class' it's a '$ref'";
+                }
+            } else {
+                die <<WHOA;
+WHOA! I tried to call ->isa on your object and got some weird error.
+This should never happen.  Please contact the author immediately.
+Here's the error.
+$@
+WHOA
+            }
+        }
+        elsif( !$rslt ) {
+            my $ref = ref $object;
+            $diag = "$obj_name isn't a '$class' it's a '$ref'";
+        }
+    }
+            
+      
+
+    my $ok;
+    if( $diag ) {
+        $ok = $tb->ok( 0, $name );
+        $tb->diag("    $diag\n");
+    }
+    else {
+        $ok = $tb->ok( 1, $name );
+    }
+
+    return $ok;
+}
+
+
+=item B<pass>
+
+=item B<fail>
+
+  pass($test_name);
+  fail($test_name);
+
+Sometimes you just want to say that the tests have passed.  Usually
+the case is you've got some complicated condition that is difficult to
+wedge into an ok().  In this case, you can simply use pass() (to
+declare the test ok) or fail (for not ok).  They are synonyms for
+ok(1) and ok(0).
+
+Use these very, very, very sparingly.
+
+=cut
+
+sub pass (;$) {
+    my $tb = Test::More->builder;
+    $tb->ok(1, @_);
+}
+
+sub fail (;$) {
+    my $tb = Test::More->builder;
+    $tb->ok(0, @_);
+}
+
+=back
+
+
+=head2 Module tests
+
+You usually want to test if the module you're testing loads ok, rather
+than just vomiting if its load fails.  For such purposes we have
+C<use_ok> and C<require_ok>.
+
+=over 4
+
+=item B<use_ok>
+
+   BEGIN { use_ok($module); }
+   BEGIN { use_ok($module, @imports); }
+
+These simply use the given $module and test to make sure the load
+happened ok.  It's recommended that you run use_ok() inside a BEGIN
+block so its functions are exported at compile-time and prototypes are
+properly honored.
+
+If @imports are given, they are passed through to the use.  So this:
+
+   BEGIN { use_ok('Some::Module', qw(foo bar)) }
+
+is like doing this:
+
+   use Some::Module qw(foo bar);
+
+Version numbers can be checked like so:
+
+   # Just like "use Some::Module 1.02"
+   BEGIN { use_ok('Some::Module', 1.02) }
+
+Don't try to do this:
+
+   BEGIN {
+       use_ok('Some::Module');
+
+       ...some code that depends on the use...
+       ...happening at compile time...
+   }
+
+because the notion of "compile-time" is relative.  Instead, you want:
+
+  BEGIN { use_ok('Some::Module') }
+  BEGIN { ...some code that depends on the use... }
+
+
+=cut
+
+sub use_ok ($;@) {
+    my($module, @imports) = @_;
+    @imports = () unless @imports;
+    my $tb = Test::More->builder;
+
+    my($pack,$filename,$line) = caller;
+
+    local($@,$!);   # eval sometimes interferes with $!
+
+    if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) {
+        # probably a version check.  Perl needs to see the bare number
+        # for it to work with non-Exporter based modules.
+        eval <<USE;
+package $pack;
+use $module $imports[0];
+USE
+    }
+    else {
+        eval <<USE;
+package $pack;
+use $module \@imports;
+USE
+    }
+
+    my $ok = $tb->ok( !$@, "use $module;" );
+
+    unless( $ok ) {
+        chomp $@;
+        $@ =~ s{^BEGIN failed--compilation aborted at .*$}
+                {BEGIN failed--compilation aborted at $filename line $line.}m;
+        $tb->diag(<<DIAGNOSTIC);
+    Tried to use '$module'.
+    Error:  $@
+DIAGNOSTIC
+
+    }
+
+    return $ok;
+}
+
+=item B<require_ok>
+
+   require_ok($module);
+   require_ok($file);
+
+Like use_ok(), except it requires the $module or $file.
+
+=cut
+
+sub require_ok ($) {
+    my($module) = shift;
+    my $tb = Test::More->builder;
+
+    my $pack = caller;
+
+    # Try to deterine if we've been given a module name or file.
+    # Module names must be barewords, files not.
+    $module = qq['$module'] unless _is_module_name($module);
+
+    local($!, $@); # eval sometimes interferes with $!
+    eval <<REQUIRE;
+package $pack;
+require $module;
+REQUIRE
+
+    my $ok = $tb->ok( !$@, "require $module;" );
+
+    unless( $ok ) {
+        chomp $@;
+        $tb->diag(<<DIAGNOSTIC);
+    Tried to require '$module'.
+    Error:  $@
+DIAGNOSTIC
+
+    }
+
+    return $ok;
+}
+
+
+sub _is_module_name {
+    my $module = shift;
+
+    # Module names start with a letter.
+    # End with an alphanumeric.
+    # The rest is an alphanumeric or ::
+    $module =~ s/\b::\b//g;
+    $module =~ /^[a-zA-Z]\w*$/;
+}
+
+=back
+
+
+=head2 Complex data structures
+
+Not everything is a simple eq check or regex.  There are times you
+need to see if two data structures are equivalent.  For these
+instances Test::More provides a handful of useful functions.
+
+B<NOTE> I'm not quite sure what will happen with filehandles.
+
+=over 4
+
+=item B<is_deeply>
+
+  is_deeply( $this, $that, $test_name );
+
+Similar to is(), except that if $this and $that are references, it
+does a deep comparison walking each data structure to see if they are
+equivalent.  If the two structures are different, it will display the
+place where they start differing.
+
+is_deeply() compares the dereferenced values of references, the
+references themselves (except for their type) are ignored.  This means
+aspects such as blessing and ties are not considered "different".
+
+is_deeply() current has very limited handling of function reference
+and globs.  It merely checks if they have the same referent.  This may
+improve in the future.
+
+Test::Differences and Test::Deep provide more in-depth functionality
+along these lines.
+
+=cut
+
+use vars qw(@Data_Stack %Refs_Seen);
+my $DNE = bless [], 'Does::Not::Exist';
+sub is_deeply {
+    my $tb = Test::More->builder;
+
+    unless( @_ == 2 or @_ == 3 ) {
+        my $msg = <<WARNING;
+is_deeply() takes two or three args, you gave %d.
+This usually means you passed an array or hash instead 
+of a reference to it
+WARNING
+        chop $msg;   # clip off newline so carp() will put in line/file
+
+        _carp sprintf $msg, scalar @_;
+
+	return $tb->ok(0);
+    }
+
+    my($this, $that, $name) = @_;
+
+    $tb->_unoverload_str(\$that, \$this);
+
+    my $ok;
+    if( !ref $this and !ref $that ) {  		# neither is a reference
+        $ok = $tb->is_eq($this, $that, $name);
+    }
+    elsif( !ref $this xor !ref $that ) {  	# one's a reference, one isn't
+        $ok = $tb->ok(0, $name);
+	$tb->diag( _format_stack({ vals => [ $this, $that ] }) );
+    }
+    else {			       		# both references
+        local @Data_Stack = ();
+        if( _deep_check($this, $that) ) {
+            $ok = $tb->ok(1, $name);
+        }
+        else {
+            $ok = $tb->ok(0, $name);
+            $tb->diag(_format_stack(@Data_Stack));
+        }
+    }
+
+    return $ok;
+}
+
+sub _format_stack {
+    my(@Stack) = @_;
+
+    my $var = '$FOO';
+    my $did_arrow = 0;
+    foreach my $entry (@Stack) {
+        my $type = $entry->{type} || '';
+        my $idx  = $entry->{'idx'};
+        if( $type eq 'HASH' ) {
+            $var .= "->" unless $did_arrow++;
+            $var .= "{$idx}";
+        }
+        elsif( $type eq 'ARRAY' ) {
+            $var .= "->" unless $did_arrow++;
+            $var .= "[$idx]";
+        }
+        elsif( $type eq 'REF' ) {
+            $var = "\${$var}";
+        }
+    }
+
+    my @vals = @{$Stack[-1]{vals}}[0,1];
+    my @vars = ();
+    ($vars[0] = $var) =~ s/\$FOO/     \$got/;
+    ($vars[1] = $var) =~ s/\$FOO/\$expected/;
+
+    my $out = "Structures begin differing at:\n";
+    foreach my $idx (0..$#vals) {
+        my $val = $vals[$idx];
+        $vals[$idx] = !defined $val ? 'undef'          :
+                      $val eq $DNE  ? "Does not exist" :
+	              ref $val      ? "$val"           :
+                                      "'$val'";
+    }
+
+    $out .= "$vars[0] = $vals[0]\n";
+    $out .= "$vars[1] = $vals[1]\n";
+
+    $out =~ s/^/    /msg;
+    return $out;
+}
+
+
+sub _type {
+    my $thing = shift;
+
+    return '' if !ref $thing;
+
+    for my $type (qw(ARRAY HASH REF SCALAR GLOB CODE Regexp)) {
+        return $type if UNIVERSAL::isa($thing, $type);
+    }
+
+    return '';
+}
+
+=back
+
+
+=head2 Diagnostics
+
+If you pick the right test function, you'll usually get a good idea of
+what went wrong when it failed.  But sometimes it doesn't work out
+that way.  So here we have ways for you to write your own diagnostic
+messages which are safer than just C<print STDERR>.
+
+=over 4
+
+=item B<diag>
+
+  diag(@diagnostic_message);
+
+Prints a diagnostic message which is guaranteed not to interfere with
+test output.  Like C<print> @diagnostic_message is simply concatenated
+together.
+
+Handy for this sort of thing:
+
+    ok( grep(/foo/, @users), "There's a foo user" ) or
+        diag("Since there's no foo, check that /etc/bar is set up right");
+
+which would produce:
+
+    not ok 42 - There's a foo user
+    #   Failed test 'There's a foo user'
+    #   in foo.t at line 52.
+    # Since there's no foo, check that /etc/bar is set up right.
+
+You might remember C<ok() or diag()> with the mnemonic C<open() or
+die()>.
+
+B<NOTE> The exact formatting of the diagnostic output is still
+changing, but it is guaranteed that whatever you throw at it it won't
+interfere with the test.
+
+=cut
+
+sub diag {
+    my $tb = Test::More->builder;
+
+    $tb->diag(@_);
+}
+
+
+=back
+
+
+=head2 Conditional tests
+
+Sometimes running a test under certain conditions will cause the
+test script to die.  A certain function or method isn't implemented
+(such as fork() on MacOS), some resource isn't available (like a 
+net connection) or a module isn't available.  In these cases it's
+necessary to skip tests, or declare that they are supposed to fail
+but will work in the future (a todo test).
+
+For more details on the mechanics of skip and todo tests see
+L<Test::Harness>.
+
+The way Test::More handles this is with a named block.  Basically, a
+block of tests which can be skipped over or made todo.  It's best if I
+just show you...
+
+=over 4
+
+=item B<SKIP: BLOCK>
+
+  SKIP: {
+      skip $why, $how_many if $condition;
+
+      ...normal testing code goes here...
+  }
+
+This declares a block of tests that might be skipped, $how_many tests
+there are, $why and under what $condition to skip them.  An example is
+the easiest way to illustrate:
+
+    SKIP: {
+        eval { require HTML::Lint };
+
+        skip "HTML::Lint not installed", 2 if $@;
+
+        my $lint = new HTML::Lint;
+        isa_ok( $lint, "HTML::Lint" );
+
+        $lint->parse( $html );
+        is( $lint->errors, 0, "No errors found in HTML" );
+    }
+
+If the user does not have HTML::Lint installed, the whole block of
+code I<won't be run at all>.  Test::More will output special ok's
+which Test::Harness interprets as skipped, but passing, tests.
+
+It's important that $how_many accurately reflects the number of tests
+in the SKIP block so the # of tests run will match up with your plan.
+If your plan is C<no_plan> $how_many is optional and will default to 1.
+
+It's perfectly safe to nest SKIP blocks.  Each SKIP block must have
+the label C<SKIP>, or Test::More can't work its magic.
+
+You don't skip tests which are failing because there's a bug in your
+program, or for which you don't yet have code written.  For that you
+use TODO.  Read on.
+
+=cut
+
+#'#
+sub skip {
+    my($why, $how_many) = @_;
+    my $tb = Test::More->builder;
+
+    unless( defined $how_many ) {
+        # $how_many can only be avoided when no_plan is in use.
+        _carp "skip() needs to know \$how_many tests are in the block"
+          unless $tb->has_plan eq 'no_plan';
+        $how_many = 1;
+    }
+
+    for( 1..$how_many ) {
+        $tb->skip($why);
+    }
+
+    local $^W = 0;
+    last SKIP;
+}
+
+
+=item B<TODO: BLOCK>
+
+    TODO: {
+        local $TODO = $why if $condition;
+
+        ...normal testing code goes here...
+    }
+
+Declares a block of tests you expect to fail and $why.  Perhaps it's
+because you haven't fixed a bug or haven't finished a new feature:
+
+    TODO: {
+        local $TODO = "URI::Geller not finished";
+
+        my $card = "Eight of clubs";
+        is( URI::Geller->your_card, $card, 'Is THIS your card?' );
+
+        my $spoon;
+        URI::Geller->bend_spoon;
+        is( $spoon, 'bent',    "Spoon bending, that's original" );
+    }
+
+With a todo block, the tests inside are expected to fail.  Test::More
+will run the tests normally, but print out special flags indicating
+they are "todo".  Test::Harness will interpret failures as being ok.
+Should anything succeed, it will report it as an unexpected success.
+You then know the thing you had todo is done and can remove the
+TODO flag.
+
+The nice part about todo tests, as opposed to simply commenting out a
+block of tests, is it's like having a programmatic todo list.  You know
+how much work is left to be done, you're aware of what bugs there are,
+and you'll know immediately when they're fixed.
+
+Once a todo test starts succeeding, simply move it outside the block.
+When the block is empty, delete it.
+
+B<NOTE>: TODO tests require a Test::Harness upgrade else it will
+treat it as a normal failure.  See L<CAVEATS and NOTES>).
+
+
+=item B<todo_skip>
+
+    TODO: {
+        todo_skip $why, $how_many if $condition;
+
+        ...normal testing code...
+    }
+
+With todo tests, it's best to have the tests actually run.  That way
+you'll know when they start passing.  Sometimes this isn't possible.
+Often a failing test will cause the whole program to die or hang, even
+inside an C<eval BLOCK> with and using C<alarm>.  In these extreme
+cases you have no choice but to skip over the broken tests entirely.
+
+The syntax and behavior is similar to a C<SKIP: BLOCK> except the
+tests will be marked as failing but todo.  Test::Harness will
+interpret them as passing.
+
+=cut
+
+sub todo_skip {
+    my($why, $how_many) = @_;
+    my $tb = Test::More->builder;
+
+    unless( defined $how_many ) {
+        # $how_many can only be avoided when no_plan is in use.
+        _carp "todo_skip() needs to know \$how_many tests are in the block"
+          unless $tb->has_plan eq 'no_plan';
+        $how_many = 1;
+    }
+
+    for( 1..$how_many ) {
+        $tb->todo_skip($why);
+    }
+
+    local $^W = 0;
+    last TODO;
+}
+
+=item When do I use SKIP vs. TODO?
+
+B<If it's something the user might not be able to do>, use SKIP.
+This includes optional modules that aren't installed, running under
+an OS that doesn't have some feature (like fork() or symlinks), or maybe
+you need an Internet connection and one isn't available.
+
+B<If it's something the programmer hasn't done yet>, use TODO.  This
+is for any code you haven't written yet, or bugs you have yet to fix,
+but want to put tests in your testing script (always a good idea).
+
+
+=back
+
+
+=head2 Test control
+
+=over 4
+
+=item B<BAIL_OUT>
+
+    BAIL_OUT($reason);
+
+Incidates to the harness that things are going so badly all testing
+should terminate.  This includes the running any additional test scripts.
+
+This is typically used when testing cannot continue such as a critical
+module failing to compile or a necessary external utility not being
+available such as a database connection failing.
+
+The test will exit with 255.
+
+=cut
+
+sub BAIL_OUT {
+    my $reason = shift;
+    my $tb = Test::More->builder;
+
+    $tb->BAIL_OUT($reason);
+}
+
+=back
+
+
+=head2 Discouraged comparison functions
+
+The use of the following functions is discouraged as they are not
+actually testing functions and produce no diagnostics to help figure
+out what went wrong.  They were written before is_deeply() existed
+because I couldn't figure out how to display a useful diff of two
+arbitrary data structures.
+
+These functions are usually used inside an ok().
+
+    ok( eq_array(\@this, \@that) );
+
+C<is_deeply()> can do that better and with diagnostics.  
+
+    is_deeply( \@this, \@that );
+
+They may be deprecated in future versions.
+
+=over 4
+
+=item B<eq_array>
+
+  my $is_eq = eq_array(\@this, \@that);
+
+Checks if two arrays are equivalent.  This is a deep check, so
+multi-level structures are handled correctly.
+
+=cut
+
+#'#
+sub eq_array {
+    local @Data_Stack;
+    _deep_check(@_);
+}
+
+sub _eq_array  {
+    my($a1, $a2) = @_;
+
+    if( grep !_type($_) eq 'ARRAY', $a1, $a2 ) {
+        warn "eq_array passed a non-array ref";
+        return 0;
+    }
+
+    return 1 if $a1 eq $a2;
+
+    my $ok = 1;
+    my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2;
+    for (0..$max) {
+        my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_];
+        my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_];
+
+        push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [$e1, $e2] };
+        $ok = _deep_check($e1,$e2);
+        pop @Data_Stack if $ok;
+
+        last unless $ok;
+    }
+
+    return $ok;
+}
+
+sub _deep_check {
+    my($e1, $e2) = @_;
+    my $tb = Test::More->builder;
+
+    my $ok = 0;
+
+    # Effectively turn %Refs_Seen into a stack.  This avoids picking up
+    # the same referenced used twice (such as [\$a, \$a]) to be considered
+    # circular.
+    local %Refs_Seen = %Refs_Seen;
+
+    {
+        # Quiet uninitialized value warnings when comparing undefs.
+        local $^W = 0; 
+
+        $tb->_unoverload_str(\$e1, \$e2);
+
+        # Either they're both references or both not.
+        my $same_ref = !(!ref $e1 xor !ref $e2);
+	my $not_ref  = (!ref $e1 and !ref $e2);
+
+        if( defined $e1 xor defined $e2 ) {
+            $ok = 0;
+        }
+        elsif ( $e1 == $DNE xor $e2 == $DNE ) {
+            $ok = 0;
+        }
+        elsif ( $same_ref and ($e1 eq $e2) ) {
+            $ok = 1;
+        }
+	elsif ( $not_ref ) {
+	    push @Data_Stack, { type => '', vals => [$e1, $e2] };
+	    $ok = 0;
+	}
+        else {
+            if( $Refs_Seen{$e1} ) {
+                return $Refs_Seen{$e1} eq $e2;
+            }
+            else {
+                $Refs_Seen{$e1} = "$e2";
+            }
+
+            my $type = _type($e1);
+            $type = 'DIFFERENT' unless _type($e2) eq $type;
+
+            if( $type eq 'DIFFERENT' ) {
+                push @Data_Stack, { type => $type, vals => [$e1, $e2] };
+                $ok = 0;
+            }
+            elsif( $type eq 'ARRAY' ) {
+                $ok = _eq_array($e1, $e2);
+            }
+            elsif( $type eq 'HASH' ) {
+                $ok = _eq_hash($e1, $e2);
+            }
+            elsif( $type eq 'REF' ) {
+                push @Data_Stack, { type => $type, vals => [$e1, $e2] };
+                $ok = _deep_check($$e1, $$e2);
+                pop @Data_Stack if $ok;
+            }
+            elsif( $type eq 'SCALAR' ) {
+                push @Data_Stack, { type => 'REF', vals => [$e1, $e2] };
+                $ok = _deep_check($$e1, $$e2);
+                pop @Data_Stack if $ok;
+            }
+            elsif( $type ) {
+                push @Data_Stack, { type => $type, vals => [$e1, $e2] };
+                $ok = 0;
+            }
+	    else {
+		_whoa(1, "No type in _deep_check");
+	    }
+        }
+    }
+
+    return $ok;
+}
+
+
+sub _whoa {
+    my($check, $desc) = @_;
+    if( $check ) {
+        die <<WHOA;
+WHOA!  $desc
+This should never happen!  Please contact the author immediately!
+WHOA
+    }
+}
+
+
+=item B<eq_hash>
+
+  my $is_eq = eq_hash(\%this, \%that);
+
+Determines if the two hashes contain the same keys and values.  This
+is a deep check.
+
+=cut
+
+sub eq_hash {
+    local @Data_Stack;
+    return _deep_check(@_);
+}
+
+sub _eq_hash {
+    my($a1, $a2) = @_;
+
+    if( grep !_type($_) eq 'HASH', $a1, $a2 ) {
+        warn "eq_hash passed a non-hash ref";
+        return 0;
+    }
+
+    return 1 if $a1 eq $a2;
+
+    my $ok = 1;
+    my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2;
+    foreach my $k (keys %$bigger) {
+        my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE;
+        my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE;
+
+        push @Data_Stack, { type => 'HASH', idx => $k, vals => [$e1, $e2] };
+        $ok = _deep_check($e1, $e2);
+        pop @Data_Stack if $ok;
+
+        last unless $ok;
+    }
+
+    return $ok;
+}
+
+=item B<eq_set>
+
+  my $is_eq = eq_set(\@this, \@that);
+
+Similar to eq_array(), except the order of the elements is B<not>
+important.  This is a deep check, but the irrelevancy of order only
+applies to the top level.
+
+    ok( eq_set(\@this, \@that) );
+
+Is better written:
+
+    is_deeply( [sort @this], [sort @that] );
+
+B<NOTE> By historical accident, this is not a true set comparison.
+While the order of elements does not matter, duplicate elements do.
+
+B<NOTE> eq_set() does not know how to deal with references at the top
+level.  The following is an example of a comparison which might not work:
+
+    eq_set([\1, \2], [\2, \1]);
+
+Test::Deep contains much better set comparison functions.
+
+=cut
+
+sub eq_set  {
+    my($a1, $a2) = @_;
+    return 0 unless @$a1 == @$a2;
+
+    # There's faster ways to do this, but this is easiest.
+    local $^W = 0;
+
+    # It really doesn't matter how we sort them, as long as both arrays are 
+    # sorted with the same algorithm.
+    #
+    # Ensure that references are not accidentally treated the same as a
+    # string containing the reference.
+    #
+    # Have to inline the sort routine due to a threading/sort bug.
+    # See [rt.cpan.org 6782]
+    #
+    # I don't know how references would be sorted so we just don't sort
+    # them.  This means eq_set doesn't really work with refs.
+    return eq_array(
+           [grep(ref, @$a1), sort( grep(!ref, @$a1) )],
+           [grep(ref, @$a2), sort( grep(!ref, @$a2) )],
+    );
+}
+
+=back
+
+
+=head2 Extending and Embedding Test::More
+
+Sometimes the Test::More interface isn't quite enough.  Fortunately,
+Test::More is built on top of Test::Builder which provides a single,
+unified backend for any test library to use.  This means two test
+libraries which both use Test::Builder B<can be used together in the
+same program>.
+
+If you simply want to do a little tweaking of how the tests behave,
+you can access the underlying Test::Builder object like so:
+
+=over 4
+
+=item B<builder>
+
+    my $test_builder = Test::More->builder;
+
+Returns the Test::Builder object underlying Test::More for you to play
+with.
+
+
+=back
+
+
+=head1 EXIT CODES
+
+If all your tests passed, Test::Builder will exit with zero (which is
+normal).  If anything failed it will exit with how many failed.  If
+you run less (or more) tests than you planned, the missing (or extras)
+will be considered failures.  If no tests were ever run Test::Builder
+will throw a warning and exit with 255.  If the test died, even after
+having successfully completed all its tests, it will still be
+considered a failure and will exit with 255.
+
+So the exit codes are...
+
+    0                   all tests successful
+    255                 test died or all passed but wrong # of tests run
+    any other number    how many failed (including missing or extras)
+
+If you fail more than 254 tests, it will be reported as 254.
+
+B<NOTE>  This behavior may go away in future versions.
+
+
+=head1 CAVEATS and NOTES
+
+=over 4
+
+=item Backwards compatibility
+
+Test::More works with Perls as old as 5.004_05.
+
+
+=item Overloaded objects
+
+String overloaded objects are compared B<as strings> (or in cmp_ok()'s
+case, strings or numbers as appropriate to the comparison op).  This
+prevents Test::More from piercing an object's interface allowing
+better blackbox testing.  So if a function starts returning overloaded
+objects instead of bare strings your tests won't notice the
+difference.  This is good.
+
+However, it does mean that functions like is_deeply() cannot be used to
+test the internals of string overloaded objects.  In this case I would
+suggest Test::Deep which contains more flexible testing functions for
+complex data structures.
+
+
+=item Threads
+
+Test::More will only be aware of threads if "use threads" has been done
+I<before> Test::More is loaded.  This is ok:
+
+    use threads;
+    use Test::More;
+
+This may cause problems:
+
+    use Test::More
+    use threads;
+
+
+=item Test::Harness upgrade
+
+no_plan and todo depend on new Test::Harness features and fixes.  If
+you're going to distribute tests that use no_plan or todo your
+end-users will have to upgrade Test::Harness to the latest one on
+CPAN.  If you avoid no_plan and TODO tests, the stock Test::Harness
+will work fine.
+
+Installing Test::More should also upgrade Test::Harness.
+
+=back
+
+
+=head1 HISTORY
+
+This is a case of convergent evolution with Joshua Pritikin's Test
+module.  I was largely unaware of its existence when I'd first
+written my own ok() routines.  This module exists because I can't
+figure out how to easily wedge test names into Test's interface (along
+with a few other problems).
+
+The goal here is to have a testing utility that's simple to learn,
+quick to use and difficult to trip yourself up with while still
+providing more flexibility than the existing Test.pm.  As such, the
+names of the most common routines are kept tiny, special cases and
+magic side-effects are kept to a minimum.  WYSIWYG.
+
+
+=head1 SEE ALSO
+
+L<Test::Simple> if all this confuses you and you just want to write
+some tests.  You can upgrade to Test::More later (it's forward
+compatible).
+
+L<Test> is the old testing module.  Its main benefit is that it has
+been distributed with Perl since 5.004_05.
+
+L<Test::Harness> for details on how your test results are interpreted
+by Perl.
+
+L<Test::Differences> for more ways to test complex data structures.
+And it plays well with Test::More.
+
+L<Test::Class> is like XUnit but more perlish.
+
+L<Test::Deep> gives you more powerful complex data structure testing.
+
+L<Test::Unit> is XUnit style testing.
+
+L<Test::Inline> shows the idea of embedded testing.
+
+L<Bundle::Test> installs a whole bunch of useful test modules.
+
+
+=head1 AUTHORS
+
+Michael G Schwern E<lt>schwern@pobox.comE<gt> with much inspiration
+from Joshua Pritikin's Test module and lots of help from Barrie
+Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and
+the perl-qa gang.
+
+
+=head1 BUGS
+
+See F<http://rt.cpan.org> to report and view bugs.
+
+
+=head1 COPYRIGHT
+
+Copyright 2001, 2002, 2004 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
+
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+See F<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Simple.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Simple.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Simple.pm	(revision 14489)
@@ -0,0 +1,230 @@
+package Test::Simple;
+
+use 5.004;
+
+use strict 'vars';
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION = '0.62';
+$VERSION = eval $VERSION;    # make the alpha version come out as a number
+
+use Test::Builder::Module;
+@ISA    = qw(Test::Builder::Module);
+@EXPORT = qw(ok);
+
+my $CLASS = __PACKAGE__;
+
+
+=head1 NAME
+
+Test::Simple - Basic utilities for writing tests.
+
+=head1 SYNOPSIS
+
+  use Test::Simple tests => 1;
+
+  ok( $foo eq $bar, 'foo is bar' );
+
+
+=head1 DESCRIPTION
+
+** If you are unfamiliar with testing B<read Test::Tutorial> first! **
+
+This is an extremely simple, extremely basic module for writing tests
+suitable for CPAN modules and other pursuits.  If you wish to do more
+complicated testing, use the Test::More module (a drop-in replacement
+for this one).
+
+The basic unit of Perl testing is the ok.  For each thing you want to
+test your program will print out an "ok" or "not ok" to indicate pass
+or fail.  You do this with the ok() function (see below).
+
+The only other constraint is you must pre-declare how many tests you
+plan to run.  This is in case something goes horribly wrong during the
+test and your test program aborts, or skips a test or whatever.  You
+do this like so:
+
+    use Test::Simple tests => 23;
+
+You must have a plan.
+
+
+=over 4
+
+=item B<ok>
+
+  ok( $foo eq $bar, $name );
+  ok( $foo eq $bar );
+
+ok() is given an expression (in this case C<$foo eq $bar>).  If it's
+true, the test passed.  If it's false, it didn't.  That's about it.
+
+ok() prints out either "ok" or "not ok" along with a test number (it
+keeps track of that for you).
+
+  # This produces "ok 1 - Hell not yet frozen over" (or not ok)
+  ok( get_temperature($hell) > 0, 'Hell not yet frozen over' );
+
+If you provide a $name, that will be printed along with the "ok/not
+ok" to make it easier to find your test when if fails (just search for
+the name).  It also makes it easier for the next guy to understand
+what your test is for.  It's highly recommended you use test names.
+
+All tests are run in scalar context.  So this:
+
+    ok( @stuff, 'I have some stuff' );
+
+will do what you mean (fail if stuff is empty)
+
+=cut
+
+sub ok ($;$) {
+    $CLASS->builder->ok(@_);
+}
+
+
+=back
+
+Test::Simple will start by printing number of tests run in the form
+"1..M" (so "1..5" means you're going to run 5 tests).  This strange
+format lets Test::Harness know how many tests you plan on running in
+case something goes horribly wrong.
+
+If all your tests passed, Test::Simple will exit with zero (which is
+normal).  If anything failed it will exit with how many failed.  If
+you run less (or more) tests than you planned, the missing (or extras)
+will be considered failures.  If no tests were ever run Test::Simple
+will throw a warning and exit with 255.  If the test died, even after
+having successfully completed all its tests, it will still be
+considered a failure and will exit with 255.
+
+So the exit codes are...
+
+    0                   all tests successful
+    255                 test died or all passed but wrong # of tests run
+    any other number    how many failed (including missing or extras)
+
+If you fail more than 254 tests, it will be reported as 254.
+
+This module is by no means trying to be a complete testing system.
+It's just to get you started.  Once you're off the ground its
+recommended you look at L<Test::More>.
+
+
+=head1 EXAMPLE
+
+Here's an example of a simple .t file for the fictional Film module.
+
+    use Test::Simple tests => 5;
+
+    use Film;  # What you're testing.
+
+    my $btaste = Film->new({ Title    => 'Bad Taste',
+                             Director => 'Peter Jackson',
+                             Rating   => 'R',
+                             NumExplodingSheep => 1
+                           });
+    ok( defined($btaste) && ref $btaste eq 'Film,     'new() works' );
+
+    ok( $btaste->Title      eq 'Bad Taste',     'Title() get'    );
+    ok( $btaste->Director   eq 'Peter Jackson', 'Director() get' );
+    ok( $btaste->Rating     eq 'R',             'Rating() get'   );
+    ok( $btaste->NumExplodingSheep == 1,        'NumExplodingSheep() get' );
+
+It will produce output like this:
+
+    1..5
+    ok 1 - new() works
+    ok 2 - Title() get
+    ok 3 - Director() get
+    not ok 4 - Rating() get
+    #   Failed test 'Rating() get'
+    #   in t/film.t at line 14.
+    ok 5 - NumExplodingSheep() get
+    # Looks like you failed 1 tests of 5
+
+Indicating the Film::Rating() method is broken.
+
+
+=head1 CAVEATS
+
+Test::Simple will only report a maximum of 254 failures in its exit
+code.  If this is a problem, you probably have a huge test script.
+Split it into multiple files.  (Otherwise blame the Unix folks for
+using an unsigned short integer as the exit status).
+
+Because VMS's exit codes are much, much different than the rest of the
+universe, and perl does horrible mangling to them that gets in my way,
+it works like this on VMS.
+
+    0     SS$_NORMAL        all tests successful
+    4     SS$_ABORT         something went wrong
+
+Unfortunately, I can't differentiate any further.
+
+
+=head1 NOTES
+
+Test::Simple is B<explicitly> tested all the way back to perl 5.004.
+
+Test::Simple is thread-safe in perl 5.8.0 and up.
+
+=head1 HISTORY
+
+This module was conceived while talking with Tony Bowden in his
+kitchen one night about the problems I was having writing some really
+complicated feature into the new Testing module.  He observed that the
+main problem is not dealing with these edge cases but that people hate
+to write tests B<at all>.  What was needed was a dead simple module
+that took all the hard work out of testing and was really, really easy
+to learn.  Paul Johnson simultaneously had this idea (unfortunately,
+he wasn't in Tony's kitchen).  This is it.
+
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<Test::More>
+
+More testing functions!  Once you outgrow Test::Simple, look at
+Test::More.  Test::Simple is 100% forward compatible with Test::More
+(i.e. you can just use Test::More instead of Test::Simple in your
+programs and things will still work).
+
+=item L<Test>
+
+The original Perl testing module.
+
+=item L<Test::Unit>
+
+Elaborate unit testing.
+
+=item L<Test::Inline>, L<SelfTest>
+
+Embed tests in your code!
+
+=item L<Test::Harness>
+
+Interprets the output of your test program.
+
+=back
+
+
+=head1 AUTHORS
+
+Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern
+E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein.
+
+
+=head1 COPYRIGHT
+
+Copyright 2001, 2002, 2004 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
+
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+See F<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Test/Tutorial.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Test/Tutorial.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Test/Tutorial.pod	(revision 14489)
@@ -0,0 +1,603 @@
+=head1 NAME
+
+Test::Tutorial - A tutorial about writing really basic tests
+
+=head1 DESCRIPTION
+
+
+I<AHHHHHHH!!!!  NOT TESTING!  Anything but testing!  
+Beat me, whip me, send me to Detroit, but don't make 
+me write tests!>
+
+I<*sob*>
+
+I<Besides, I don't know how to write the damned things.>
+
+
+Is this you?  Is writing tests right up there with writing
+documentation and having your fingernails pulled out?  Did you open up
+a test and read 
+
+    ######## We start with some black magic
+
+and decide that's quite enough for you?
+
+It's ok.  That's all gone now.  We've done all the black magic for
+you.  And here are the tricks...
+
+
+=head2 Nuts and bolts of testing.
+
+Here's the most basic test program.
+
+    #!/usr/bin/perl -w
+
+    print "1..1\n";
+
+    print 1 + 1 == 2 ? "ok 1\n" : "not ok 1\n";
+
+since 1 + 1 is 2, it prints:
+
+    1..1
+    ok 1
+
+What this says is: C<1..1> "I'm going to run one test." [1] C<ok 1>
+"The first test passed".  And that's about all magic there is to
+testing.  Your basic unit of testing is the I<ok>.  For each thing you
+test, an C<ok> is printed.  Simple.  B<Test::Harness> interprets your test
+results to determine if you succeeded or failed (more on that later).
+
+Writing all these print statements rapidly gets tedious.  Fortunately,
+there's B<Test::Simple>.  It has one function, C<ok()>.
+
+    #!/usr/bin/perl -w
+
+    use Test::Simple tests => 1;
+
+    ok( 1 + 1 == 2 );
+
+and that does the same thing as the code above.  C<ok()> is the backbone
+of Perl testing, and we'll be using it instead of roll-your-own from
+here on.  If C<ok()> gets a true value, the test passes.  False, it
+fails.
+
+    #!/usr/bin/perl -w
+
+    use Test::Simple tests => 2;
+    ok( 1 + 1 == 2 );
+    ok( 2 + 2 == 5 );
+
+from that comes
+
+    1..2
+    ok 1
+    not ok 2
+    #     Failed test (test.pl at line 5)
+    # Looks like you failed 1 tests of 2.
+
+C<1..2> "I'm going to run two tests."  This number is used to ensure
+your test program ran all the way through and didn't die or skip some
+tests.  C<ok 1> "The first test passed."  C<not ok 2> "The second test
+failed".  Test::Simple helpfully prints out some extra commentary about
+your tests.
+
+It's not scary.  Come, hold my hand.  We're going to give an example
+of testing a module.  For our example, we'll be testing a date
+library, B<Date::ICal>.  It's on CPAN, so download a copy and follow
+along. [2]
+
+
+=head2 Where to start?
+
+This is the hardest part of testing, where do you start?  People often
+get overwhelmed at the apparent enormity of the task of testing a
+whole module.  Best place to start is at the beginning.  Date::ICal is
+an object-oriented module, and that means you start by making an
+object.  So we test C<new()>.
+
+    #!/usr/bin/perl -w
+
+    use Test::Simple tests => 2;
+
+    use Date::ICal;
+
+    my $ical = Date::ICal->new;         # create an object
+    ok( defined $ical );                # check that we got something
+    ok( $ical->isa('Date::ICal') );     # and it's the right class
+
+run that and you should get:
+
+    1..2
+    ok 1
+    ok 2
+
+congratulations, you've written your first useful test.
+
+
+=head2 Names
+
+That output isn't terribly descriptive, is it?  When you have two
+tests you can figure out which one is #2, but what if you have 102?
+
+Each test can be given a little descriptive name as the second
+argument to C<ok()>.
+
+    use Test::Simple tests => 2;
+
+    ok( defined $ical,              'new() returned something' );
+    ok( $ical->isa('Date::ICal'),   "  and it's the right class" );
+
+So now you'd see...
+
+    1..2
+    ok 1 - new() returned something
+    ok 2 -   and it's the right class
+
+
+=head2 Test the manual
+
+Simplest way to build up a decent testing suite is to just test what
+the manual says it does. [3] Let's pull something out of the 
+L<Date::ICal/SYNOPSIS> and test that all its bits work.
+
+    #!/usr/bin/perl -w
+
+    use Test::Simple tests => 8;
+
+    use Date::ICal;
+
+    $ical = Date::ICal->new( year => 1964, month => 10, day => 16, 
+                             hour => 16, min => 12, sec => 47, 
+                             tz => '0530' );
+
+    ok( defined $ical,            'new() returned something' );
+    ok( $ical->isa('Date::ICal'), "  and it's the right class" );
+    ok( $ical->sec   == 47,       '  sec()'   );
+    ok( $ical->min   == 12,       '  min()'   );    
+    ok( $ical->hour  == 16,       '  hour()'  );
+    ok( $ical->day   == 17,       '  day()'   );
+    ok( $ical->month == 10,       '  month()' );
+    ok( $ical->year  == 1964,     '  year()'  );
+
+run that and you get:
+
+    1..8
+    ok 1 - new() returned something
+    ok 2 -   and it's the right class
+    ok 3 -   sec()
+    ok 4 -   min()
+    ok 5 -   hour()
+    not ok 6 -   day()
+    #     Failed test (- at line 16)
+    ok 7 -   month()
+    ok 8 -   year()
+    # Looks like you failed 1 tests of 8.
+
+Whoops, a failure! [4] Test::Simple helpfully lets us know on what line
+the failure occurred, but not much else.  We were supposed to get 17,
+but we didn't.  What did we get??  Dunno.  We'll have to re-run the
+test in the debugger or throw in some print statements to find out.
+
+Instead, we'll switch from B<Test::Simple> to B<Test::More>.  B<Test::More>
+does everything B<Test::Simple> does, and more!  In fact, Test::More does
+things I<exactly> the way Test::Simple does.  You can literally swap
+Test::Simple out and put Test::More in its place.  That's just what
+we're going to do.
+
+Test::More does more than Test::Simple.  The most important difference
+at this point is it provides more informative ways to say "ok".
+Although you can write almost any test with a generic C<ok()>, it
+can't tell you what went wrong.  Instead, we'll use the C<is()>
+function, which lets us declare that something is supposed to be the
+same as something else:
+
+    #!/usr/bin/perl -w
+
+    use Test::More tests => 8;
+
+    use Date::ICal;
+
+    $ical = Date::ICal->new( year => 1964, month => 10, day => 16, 
+                             hour => 16, min => 12, sec => 47, 
+                             tz => '0530' );
+
+    ok( defined $ical,            'new() returned something' );
+    ok( $ical->isa('Date::ICal'), "  and it's the right class" );
+    is( $ical->sec,     47,       '  sec()'   );
+    is( $ical->min,     12,       '  min()'   );    
+    is( $ical->hour,    16,       '  hour()'  );
+    is( $ical->day,     17,       '  day()'   );
+    is( $ical->month,   10,       '  month()' );
+    is( $ical->year,    1964,     '  year()'  );
+
+"Is C<$ical-E<gt>sec> 47?"  "Is C<$ical-E<gt>min> 12?"  With C<is()> in place,
+you get some more information
+
+    1..8
+    ok 1 - new() returned something
+    ok 2 -   and it's the right class
+    ok 3 -   sec()
+    ok 4 -   min()
+    ok 5 -   hour()
+    not ok 6 -   day()
+    #     Failed test (- at line 16)
+    #          got: '16'
+    #     expected: '17'
+    ok 7 -   month()
+    ok 8 -   year()
+    # Looks like you failed 1 tests of 8.
+
+letting us know that C<$ical-E<gt>day> returned 16, but we expected 17.  A
+quick check shows that the code is working fine, we made a mistake
+when writing up the tests.  Just change it to:
+
+    is( $ical->day,     16,       '  day()'   );
+
+and everything works.
+
+So any time you're doing a "this equals that" sort of test, use C<is()>.
+It even works on arrays.  The test is always in scalar context, so you
+can test how many elements are in a list this way. [5]
+
+    is( @foo, 5, 'foo has 5 elements' );
+
+
+=head2 Sometimes the tests are wrong
+
+Which brings us to a very important lesson.  Code has bugs.  Tests are
+code.  Ergo, tests have bugs.  A failing test could mean a bug in the
+code, but don't discount the possibility that the test is wrong.
+
+On the flip side, don't be tempted to prematurely declare a test
+incorrect just because you're having trouble finding the bug.
+Invalidating a test isn't something to be taken lightly, and don't use
+it as a cop out to avoid work.
+
+
+=head2 Testing lots of values
+
+We're going to be wanting to test a lot of dates here, trying to trick
+the code with lots of different edge cases.  Does it work before 1970?
+After 2038?  Before 1904?  Do years after 10,000 give it trouble?
+Does it get leap years right?  We could keep repeating the code above,
+or we could set up a little try/expect loop.
+
+    use Test::More tests => 32;
+    use Date::ICal;
+
+    my %ICal_Dates = (
+            # An ICal string     And the year, month, date
+            #                    hour, minute and second we expect.
+            '19971024T120000' =>    # from the docs.
+                                [ 1997, 10, 24, 12,  0,  0 ],
+            '20390123T232832' =>    # after the Unix epoch
+                                [ 2039,  1, 23, 23, 28, 32 ],
+            '19671225T000000' =>    # before the Unix epoch
+                                [ 1967, 12, 25,  0,  0,  0 ],
+            '18990505T232323' =>    # before the MacOS epoch
+                                [ 1899,  5,  5, 23, 23, 23 ],
+    );
+
+
+    while( my($ical_str, $expect) = each %ICal_Dates ) {
+        my $ical = Date::ICal->new( ical => $ical_str );
+
+        ok( defined $ical,            "new(ical => '$ical_str')" );
+        ok( $ical->isa('Date::ICal'), "  and it's the right class" );
+
+        is( $ical->year,    $expect->[0],     '  year()'  );
+        is( $ical->month,   $expect->[1],     '  month()' );
+        is( $ical->day,     $expect->[2],     '  day()'   );
+        is( $ical->hour,    $expect->[3],     '  hour()'  );
+        is( $ical->min,     $expect->[4],     '  min()'   );    
+        is( $ical->sec,     $expect->[5],     '  sec()'   );
+    }
+
+So now we can test bunches of dates by just adding them to
+C<%ICal_Dates>.  Now that it's less work to test with more dates, you'll
+be inclined to just throw more in as you think of them.
+Only problem is, every time we add to that we have to keep adjusting
+the C<use Test::More tests =E<gt> ##> line.  That can rapidly get
+annoying.  There's two ways to make this work better.
+
+First, we can calculate the plan dynamically using the C<plan()>
+function.
+
+    use Test::More;
+    use Date::ICal;
+
+    my %ICal_Dates = (
+        ...same as before...
+    );
+
+    # For each key in the hash we're running 8 tests.
+    plan tests => keys %ICal_Dates * 8;
+
+Or to be even more flexible, we use C<no_plan>.  This means we're just
+running some tests, don't know how many. [6]
+
+    use Test::More 'no_plan';   # instead of tests => 32
+
+now we can just add tests and not have to do all sorts of math to
+figure out how many we're running.
+
+
+=head2 Informative names
+
+Take a look at this line here
+
+    ok( defined $ical,            "new(ical => '$ical_str')" );
+
+we've added more detail about what we're testing and the ICal string
+itself we're trying out to the name.  So you get results like:
+
+    ok 25 - new(ical => '19971024T120000')
+    ok 26 -   and it's the right class
+    ok 27 -   year()
+    ok 28 -   month()
+    ok 29 -   day()
+    ok 30 -   hour()
+    ok 31 -   min()
+    ok 32 -   sec()
+
+if something in there fails, you'll know which one it was and that
+will make tracking down the problem easier.  So try to put a bit of
+debugging information into the test names.
+
+Describe what the tests test, to make debugging a failed test easier
+for you or for the next person who runs your test.
+
+
+=head2 Skipping tests
+
+Poking around in the existing Date::ICal tests, I found this in
+F<t/01sanity.t> [7]
+
+    #!/usr/bin/perl -w
+
+    use Test::More tests => 7;
+    use Date::ICal;
+
+    # Make sure epoch time is being handled sanely.
+    my $t1 = Date::ICal->new( epoch => 0 );
+    is( $t1->epoch, 0,          "Epoch time of 0" );
+
+    # XXX This will only work on unix systems.
+    is( $t1->ical, '19700101Z', "  epoch to ical" );
+
+    is( $t1->year,  1970,       "  year()"  );
+    is( $t1->month, 1,          "  month()" );
+    is( $t1->day,   1,          "  day()"   );
+
+    # like the tests above, but starting with ical instead of epoch
+    my $t2 = Date::ICal->new( ical => '19700101Z' );
+    is( $t2->ical, '19700101Z', "Start of epoch in ICal notation" );
+
+    is( $t2->epoch, 0,          "  and back to ICal" );
+
+The beginning of the epoch is different on most non-Unix operating
+systems [8].  Even though Perl smooths out the differences for the most
+part, certain ports do it differently.  MacPerl is one off the top of
+my head. [9] We I<know> this will never work on MacOS.  So rather than
+just putting a comment in the test, we can explicitly say it's never
+going to work and skip the test.
+
+    use Test::More tests => 7;
+    use Date::ICal;
+
+    # Make sure epoch time is being handled sanely.
+    my $t1 = Date::ICal->new( epoch => 0 );
+    is( $t1->epoch, 0,          "Epoch time of 0" );
+
+    SKIP: {
+        skip('epoch to ICal not working on MacOS', 6) 
+            if $^O eq 'MacOS';
+
+        is( $t1->ical, '19700101Z', "  epoch to ical" );
+
+        is( $t1->year,  1970,       "  year()"  );
+        is( $t1->month, 1,          "  month()" );
+        is( $t1->day,   1,          "  day()"   );
+
+        # like the tests above, but starting with ical instead of epoch
+        my $t2 = Date::ICal->new( ical => '19700101Z' );
+        is( $t2->ical, '19700101Z', "Start of epoch in ICal notation" );
+
+        is( $t2->epoch, 0,          "  and back to ICal" );
+    }
+
+A little bit of magic happens here.  When running on anything but
+MacOS, all the tests run normally.  But when on MacOS, C<skip()> causes
+the entire contents of the SKIP block to be jumped over.  It's never
+run.  Instead, it prints special output that tells Test::Harness that
+the tests have been skipped.
+
+    1..7
+    ok 1 - Epoch time of 0
+    ok 2 # skip epoch to ICal not working on MacOS
+    ok 3 # skip epoch to ICal not working on MacOS
+    ok 4 # skip epoch to ICal not working on MacOS
+    ok 5 # skip epoch to ICal not working on MacOS
+    ok 6 # skip epoch to ICal not working on MacOS
+    ok 7 # skip epoch to ICal not working on MacOS
+
+This means your tests won't fail on MacOS.  This means less emails
+from MacPerl users telling you about failing tests that you know will
+never work.  You've got to be careful with skip tests.  These are for
+tests which don't work and I<never will>.  It is not for skipping
+genuine bugs (we'll get to that in a moment).
+
+The tests are wholly and completely skipped. [10]  This will work.
+
+    SKIP: {
+        skip("I don't wanna die!");
+
+        die, die, die, die, die;
+    }
+
+
+=head2 Todo tests
+
+Thumbing through the Date::ICal man page, I came across this:
+
+   ical
+
+       $ical_string = $ical->ical;
+
+   Retrieves, or sets, the date on the object, using any
+   valid ICal date/time string.
+
+"Retrieves or sets".  Hmmm, didn't see a test for using C<ical()> to set
+the date in the Date::ICal test suite.  So I'll write one.
+
+    use Test::More tests => 1;
+    use Date::ICal;
+
+    my $ical = Date::ICal->new;
+    $ical->ical('20201231Z');
+    is( $ical->ical, '20201231Z',   'Setting via ical()' );
+
+run that and I get
+
+    1..1
+    not ok 1 - Setting via ical()
+    #     Failed test (- at line 6)
+    #          got: '20010814T233649Z'
+    #     expected: '20201231Z'
+    # Looks like you failed 1 tests of 1.
+
+Whoops!  Looks like it's unimplemented.  Let's assume we don't have
+the time to fix this. [11] Normally, you'd just comment out the test
+and put a note in a todo list somewhere.  Instead, we're going to
+explicitly state "this test will fail" by wrapping it in a C<TODO> block.
+
+    use Test::More tests => 1;
+
+    TODO: {
+        local $TODO = 'ical($ical) not yet implemented';
+
+        my $ical = Date::ICal->new;
+        $ical->ical('20201231Z');
+
+        is( $ical->ical, '20201231Z',   'Setting via ical()' );
+    }
+
+Now when you run, it's a little different:
+
+    1..1
+    not ok 1 - Setting via ical() # TODO ical($ical) not yet implemented
+    #          got: '20010822T201551Z'
+    #     expected: '20201231Z'
+
+Test::More doesn't say "Looks like you failed 1 tests of 1".  That '#
+TODO' tells Test::Harness "this is supposed to fail" and it treats a
+failure as a successful test.  So you can write tests even before
+you've fixed the underlying code.
+
+If a TODO test passes, Test::Harness will report it "UNEXPECTEDLY
+SUCCEEDED".  When that happens, you simply remove the TODO block with
+C<local $TODO> and turn it into a real test.
+
+
+=head2 Testing with taint mode.
+
+Taint mode is a funny thing.  It's the globalest of all global
+features.  Once you turn it on, it affects I<all> code in your program
+and I<all> modules used (and all the modules they use).  If a single
+piece of code isn't taint clean, the whole thing explodes.  With that
+in mind, it's very important to ensure your module works under taint
+mode.
+
+It's very simple to have your tests run under taint mode.  Just throw
+a C<-T> into the C<#!> line.  Test::Harness will read the switches
+in C<#!> and use them to run your tests.
+
+    #!/usr/bin/perl -Tw
+
+    ...test normally here...
+
+So when you say C<make test> it will be run with taint mode and
+warnings on.
+
+
+=head1 FOOTNOTES
+
+=over 4
+
+=item 1
+
+The first number doesn't really mean anything, but it has to be 1.
+It's the second number that's important.
+
+=item 2
+
+For those following along at home, I'm using version 1.31.  It has
+some bugs, which is good -- we'll uncover them with our tests.
+
+=item 3
+
+You can actually take this one step further and test the manual
+itself.  Have a look at B<Test::Inline> (formerly B<Pod::Tests>).
+
+=item 4
+
+Yes, there's a mistake in the test suite.  What!  Me, contrived?
+
+=item 5
+
+We'll get to testing the contents of lists later.
+
+=item 6
+
+But what happens if your test program dies halfway through?!  Since we
+didn't say how many tests we're going to run, how can we know it
+failed?  No problem, Test::More employs some magic to catch that death
+and turn the test into a failure, even if every test passed up to that
+point.
+
+=item 7
+
+I cleaned it up a little.
+
+=item 8
+
+Most Operating Systems record time as the number of seconds since a
+certain date.  This date is the beginning of the epoch.  Unix's starts
+at midnight January 1st, 1970 GMT.
+
+=item 9
+
+MacOS's epoch is midnight January 1st, 1904.  VMS's is midnight,
+November 17th, 1858, but vmsperl emulates the Unix epoch so it's not a
+problem.
+
+=item 10
+
+As long as the code inside the SKIP block at least compiles.  Please
+don't ask how.  No, it's not a filter.
+
+=item 11
+
+Do NOT be tempted to use TODO tests as a way to avoid fixing simple
+bugs!
+
+=back
+
+=head1 AUTHORS
+
+Michael G Schwern E<lt>schwern@pobox.comE<gt> and the perl-qa dancers!
+
+=head1 COPYRIGHT
+
+Copyright 2001 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
+
+This documentation is free; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+Irrespective of its distribution, all code examples in these files
+are hereby placed into the public domain.  You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit.  A simple comment in the code giving
+credit would be courteous but is not required.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Text/Abbrev.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Text/Abbrev.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Text/Abbrev.pm	(revision 14489)
@@ -0,0 +1,84 @@
+package Text::Abbrev;
+require 5.005;		# Probably works on earlier versions too.
+require Exporter;
+
+our $VERSION = '1.01';
+
+=head1 NAME
+
+abbrev - create an abbreviation table from a list
+
+=head1 SYNOPSIS
+
+    use Text::Abbrev;
+    abbrev $hashref, LIST
+
+
+=head1 DESCRIPTION
+
+Stores all unambiguous truncations of each element of LIST
+as keys in the associative array referenced by C<$hashref>.
+The values are the original list elements.
+
+=head1 EXAMPLE
+
+    $hashref = abbrev qw(list edit send abort gripe);
+
+    %hash = abbrev qw(list edit send abort gripe);
+
+    abbrev $hashref, qw(list edit send abort gripe);
+
+    abbrev(*hash, qw(list edit send abort gripe));
+
+=cut
+
+@ISA = qw(Exporter);
+@EXPORT = qw(abbrev);
+
+# Usage:
+#	abbrev \%foo, LIST;
+#	...
+#	$long = $foo{$short};
+
+sub abbrev {
+    my ($word, $hashref, $glob, %table, $returnvoid);
+
+    @_ or return;   # So we don't autovivify onto @_ and trigger warning
+    if (ref($_[0])) {           # hash reference preferably
+      $hashref = shift;
+      $returnvoid = 1;
+    } elsif (ref \$_[0] eq 'GLOB') {  # is actually a glob (deprecated)
+      $hashref = \%{shift()};
+      $returnvoid = 1;
+    }
+    %{$hashref} = ();
+
+    WORD: foreach $word (@_) {
+        for (my $len = (length $word) - 1; $len > 0; --$len) {
+	    my $abbrev = substr($word,0,$len);
+	    my $seen = ++$table{$abbrev};
+	    if ($seen == 1) {	    # We're the first word so far to have
+	    			    # this abbreviation.
+	        $hashref->{$abbrev} = $word;
+	    } elsif ($seen == 2) {  # We're the second word to have this
+	    			    # abbreviation, so we can't use it.
+	        delete $hashref->{$abbrev};
+	    } else {		    # We're the third word to have this
+	    			    # abbreviation, so skip to the next word.
+	        next WORD;
+	    }
+	}
+    }
+    # Non-abbreviations always get entered, even if they aren't unique
+    foreach $word (@_) {
+        $hashref->{$word} = $word;
+    }
+    return if $returnvoid;
+    if (wantarray) {
+      %{$hashref};
+    } else {
+      $hashref;
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Text/Balanced.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Text/Balanced.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Text/Balanced.pm	(revision 14489)
@@ -0,0 +1,2302 @@
+# EXTRACT VARIOUSLY DELIMITED TEXT SEQUENCES FROM STRINGS.
+# FOR FULL DOCUMENTATION SEE Balanced.pod
+
+use 5.005;
+use strict;
+
+package Text::Balanced;
+
+use Exporter;
+use SelfLoader;
+use vars qw { $VERSION @ISA %EXPORT_TAGS };
+
+$VERSION = '1.95';
+@ISA		= qw ( Exporter );
+		     
+%EXPORT_TAGS	= ( ALL => [ qw(
+				&extract_delimited
+				&extract_bracketed
+				&extract_quotelike
+				&extract_codeblock
+				&extract_variable
+				&extract_tagged
+				&extract_multiple
+
+				&gen_delimited_pat
+				&gen_extract_tagged
+
+				&delimited_pat
+			       ) ] );
+
+Exporter::export_ok_tags('ALL');
+
+# PROTOTYPES
+
+sub _match_bracketed($$$$$$);
+sub _match_variable($$);
+sub _match_codeblock($$$$$$$);
+sub _match_quotelike($$$$);
+
+# HANDLE RETURN VALUES IN VARIOUS CONTEXTS
+
+sub _failmsg {
+	my ($message, $pos) = @_;
+	$@ = bless { error=>$message, pos=>$pos }, "Text::Balanced::ErrorMsg";
+}
+
+sub _fail
+{
+	my ($wantarray, $textref, $message, $pos) = @_;
+	_failmsg $message, $pos if $message;
+	return ("",$$textref,"") if $wantarray;
+	return undef;
+}
+
+sub _succeed
+{
+	$@ = undef;
+	my ($wantarray,$textref) = splice @_, 0, 2;
+	my ($extrapos, $extralen) = @_>18 ? splice(@_, -2, 2) : (0,0);
+	my ($startlen) = $_[5];
+	my $remainderpos = $_[2];
+	if ($wantarray)
+	{
+		my @res;
+		while (my ($from, $len) = splice @_, 0, 2)
+		{
+			push @res, substr($$textref,$from,$len);
+		}
+		if ($extralen) {	# CORRECT FILLET
+			my $extra = substr($res[0], $extrapos-$startlen, $extralen, "\n");
+			$res[1] = "$extra$res[1]";
+			eval { substr($$textref,$remainderpos,0) = $extra;
+			       substr($$textref,$extrapos,$extralen,"\n")} ;
+				#REARRANGE HERE DOC AND FILLET IF POSSIBLE
+			pos($$textref) = $remainderpos-$extralen+1; # RESET \G
+		}
+		else {
+			pos($$textref) = $remainderpos;		    # RESET \G
+		}
+		return @res;
+	}
+	else
+	{
+		my $match = substr($$textref,$_[0],$_[1]);
+		substr($match,$extrapos-$_[0]-$startlen,$extralen,"") if $extralen;
+		my $extra = $extralen
+			? substr($$textref, $extrapos, $extralen)."\n" : "";
+		eval {substr($$textref,$_[4],$_[1]+$_[5])=$extra} ;	#CHOP OUT PREFIX & MATCH, IF POSSIBLE
+		pos($$textref) = $_[4];				# RESET \G
+		return $match;
+	}
+}
+
+# BUILD A PATTERN MATCHING A SIMPLE DELIMITED STRING
+
+sub gen_delimited_pat($;$)  # ($delimiters;$escapes)
+{
+	my ($dels, $escs) = @_;
+	return "" unless $dels =~ /\S/;
+	$escs = '\\' unless $escs;
+	$escs .= substr($escs,-1) x (length($dels)-length($escs));
+	my @pat = ();
+	my $i;
+	for ($i=0; $i<length $dels; $i++)
+	{
+		my $del = quotemeta substr($dels,$i,1);
+		my $esc = quotemeta substr($escs,$i,1);
+		if ($del eq $esc)
+		{
+			push @pat, "$del(?:[^$del]*(?:(?:$del$del)[^$del]*)*)$del";
+		}
+		else
+		{
+			push @pat, "$del(?:[^$esc$del]*(?:$esc.[^$esc$del]*)*)$del";
+		}
+	}
+	my $pat = join '|', @pat;
+	return "(?:$pat)";
+}
+
+*delimited_pat = \&gen_delimited_pat;
+
+
+# THE EXTRACTION FUNCTIONS
+
+sub extract_delimited (;$$$$)
+{
+	my $textref = defined $_[0] ? \$_[0] : \$_;
+	my $wantarray = wantarray;
+	my $del  = defined $_[1] ? $_[1] : qq{\'\"\`};
+	my $pre  = defined $_[2] ? $_[2] : '\s*';
+	my $esc  = defined $_[3] ? $_[3] : qq{\\};
+	my $pat = gen_delimited_pat($del, $esc);
+	my $startpos = pos $$textref || 0;
+	return _fail($wantarray, $textref, "Not a delimited pattern", 0)
+		unless $$textref =~ m/\G($pre)($pat)/gc;
+	my $prelen = length($1);
+	my $matchpos = $startpos+$prelen;
+	my $endpos = pos $$textref;
+	return _succeed $wantarray, $textref,
+			$matchpos, $endpos-$matchpos,		# MATCH
+			$endpos,   length($$textref)-$endpos,	# REMAINDER
+			$startpos, $prelen;			# PREFIX
+}
+
+sub extract_bracketed (;$$$)
+{
+	my $textref = defined $_[0] ? \$_[0] : \$_;
+	my $ldel = defined $_[1] ? $_[1] : '{([<';
+	my $pre  = defined $_[2] ? $_[2] : '\s*';
+	my $wantarray = wantarray;
+	my $qdel = "";
+	my $quotelike;
+	$ldel =~ s/'//g and $qdel .= q{'};
+	$ldel =~ s/"//g and $qdel .= q{"};
+	$ldel =~ s/`//g and $qdel .= q{`};
+	$ldel =~ s/q//g and $quotelike = 1;
+	$ldel =~ tr/[](){}<>\0-\377/[[(({{<</ds;
+	my $rdel = $ldel;
+	unless ($rdel =~ tr/[({</])}>/)
+        {
+		return _fail $wantarray, $textref,
+			     "Did not find a suitable bracket in delimiter: \"$_[1]\"",
+			     0;
+	}
+	my $posbug = pos;
+	$ldel = join('|', map { quotemeta $_ } split('', $ldel));
+	$rdel = join('|', map { quotemeta $_ } split('', $rdel));
+	pos = $posbug;
+
+	my $startpos = pos $$textref || 0;
+	my @match = _match_bracketed($textref,$pre, $ldel, $qdel, $quotelike, $rdel);
+
+	return _fail ($wantarray, $textref) unless @match;
+
+	return _succeed ( $wantarray, $textref,
+			  $match[2], $match[5]+2,	# MATCH
+			  @match[8,9],			# REMAINDER
+			  @match[0,1],			# PREFIX
+			);
+}
+
+sub _match_bracketed($$$$$$)	# $textref, $pre, $ldel, $qdel, $quotelike, $rdel
+{
+	my ($textref, $pre, $ldel, $qdel, $quotelike, $rdel) = @_;
+	my ($startpos, $ldelpos, $endpos) = (pos $$textref = pos $$textref||0);
+	unless ($$textref =~ m/\G$pre/gc)
+	{
+		_failmsg "Did not find prefix: /$pre/", $startpos;
+		return;
+	}
+
+	$ldelpos = pos $$textref;
+
+	unless ($$textref =~ m/\G($ldel)/gc)
+	{
+		_failmsg "Did not find opening bracket after prefix: \"$pre\"",
+		         pos $$textref;
+		pos $$textref = $startpos;
+		return;
+	}
+
+	my @nesting = ( $1 );
+	my $textlen = length $$textref;
+	while (pos $$textref < $textlen)
+	{
+		next if $$textref =~ m/\G\\./gcs;
+
+		if ($$textref =~ m/\G($ldel)/gc)
+		{
+			push @nesting, $1;
+		}
+		elsif ($$textref =~ m/\G($rdel)/gc)
+		{
+			my ($found, $brackettype) = ($1, $1);
+			if ($#nesting < 0)
+			{
+				_failmsg "Unmatched closing bracket: \"$found\"",
+					 pos $$textref;
+				pos $$textref = $startpos;
+			        return;
+			}
+			my $expected = pop(@nesting);
+			$expected =~ tr/({[</)}]>/;
+			if ($expected ne $brackettype)
+			{
+				_failmsg qq{Mismatched closing bracket: expected "$expected" but found "$found"},
+					 pos $$textref;
+				pos $$textref = $startpos;
+			        return;
+			}
+			last if $#nesting < 0;
+		}
+		elsif ($qdel && $$textref =~ m/\G([$qdel])/gc)
+		{
+			$$textref =~ m/\G[^\\$1]*(?:\\.[^\\$1]*)*(\Q$1\E)/gsc and next;
+			_failmsg "Unmatched embedded quote ($1)",
+				 pos $$textref;
+			pos $$textref = $startpos;
+			return;
+		}
+		elsif ($quotelike && _match_quotelike($textref,"",1,0))
+		{
+			next;
+		}
+
+		else { $$textref =~ m/\G(?:[a-zA-Z0-9]+|.)/gcs }
+	}
+	if ($#nesting>=0)
+	{
+		_failmsg "Unmatched opening bracket(s): "
+				. join("..",@nesting)."..",
+		         pos $$textref;
+		pos $$textref = $startpos;
+		return;
+	}
+
+	$endpos = pos $$textref;
+	
+	return (
+		$startpos,  $ldelpos-$startpos,		# PREFIX
+		$ldelpos,   1,				# OPENING BRACKET
+		$ldelpos+1, $endpos-$ldelpos-2,		# CONTENTS
+		$endpos-1,  1,				# CLOSING BRACKET
+		$endpos,    length($$textref)-$endpos,	# REMAINDER
+	       );
+}
+
+sub revbracket($)
+{
+	my $brack = reverse $_[0];
+	$brack =~ tr/[({</])}>/;
+	return $brack;
+}
+
+my $XMLNAME = q{[a-zA-Z_:][a-zA-Z0-9_:.-]*};
+
+sub extract_tagged (;$$$$$) # ($text, $opentag, $closetag, $pre, \%options)
+{
+	my $textref = defined $_[0] ? \$_[0] : \$_;
+	my $ldel    = $_[1];
+	my $rdel    = $_[2];
+	my $pre     = defined $_[3] ? $_[3] : '\s*';
+	my %options = defined $_[4] ? %{$_[4]} : ();
+	my $omode   = defined $options{fail} ? $options{fail} : '';
+	my $bad     = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}})
+		    : defined($options{reject})	       ? $options{reject}
+		    :					 ''
+		    ;
+	my $ignore  = ref($options{ignore}) eq 'ARRAY' ? join('|', @{$options{ignore}})
+		    : defined($options{ignore})	       ? $options{ignore}
+		    :					 ''
+		    ;
+
+	if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; }
+	$@ = undef;
+
+	my @match = _match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore);
+
+	return _fail(wantarray, $textref) unless @match;
+	return _succeed wantarray, $textref,
+			$match[2], $match[3]+$match[5]+$match[7],	# MATCH
+			@match[8..9,0..1,2..7];				# REM, PRE, BITS
+}
+
+sub _match_tagged	# ($$$$$$$)
+{
+	my ($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore) = @_;
+	my $rdelspec;
+
+	my ($startpos, $opentagpos, $textpos, $parapos, $closetagpos, $endpos) = ( pos($$textref) = pos($$textref)||0 );
+
+	unless ($$textref =~ m/\G($pre)/gc)
+	{
+		_failmsg "Did not find prefix: /$pre/", pos $$textref;
+		goto failed;
+	}
+
+	$opentagpos = pos($$textref);
+
+	unless ($$textref =~ m/\G$ldel/gc)
+	{
+		_failmsg "Did not find opening tag: /$ldel/", pos $$textref;
+		goto failed;
+	}
+
+	$textpos = pos($$textref);
+
+	if (!defined $rdel)
+	{
+		$rdelspec = $&;
+		unless ($rdelspec =~ s/\A([[(<{]+)($XMLNAME).*/ quotemeta "$1\/$2". revbracket($1) /oes)
+		{
+			_failmsg "Unable to construct closing tag to match: $rdel",
+				 pos $$textref;
+			goto failed;
+		}
+	}
+	else
+	{
+		$rdelspec = eval "qq{$rdel}" || do {
+			my $del;
+			for (qw,~ ! ^ & * ) _ + - = } ] : " ; ' > . ? / | ',)
+				{ next if $rdel =~ /\Q$_/; $del = $_; last }
+			unless ($del) {
+				use Carp;
+				croak "Can't interpolate right delimiter $rdel"
+			}
+			eval "qq$del$rdel$del";
+		};
+	}
+
+	while (pos($$textref) < length($$textref))
+	{
+		next if $$textref =~ m/\G\\./gc;
+
+		if ($$textref =~ m/\G(\n[ \t]*\n)/gc )
+		{
+			$parapos = pos($$textref) - length($1)
+				unless defined $parapos;
+		}
+		elsif ($$textref =~ m/\G($rdelspec)/gc )
+		{
+			$closetagpos = pos($$textref)-length($1);
+			goto matched;
+		}
+		elsif ($ignore && $$textref =~ m/\G(?:$ignore)/gc)
+		{
+			next;
+		}
+		elsif ($bad && $$textref =~ m/\G($bad)/gcs)
+		{
+			pos($$textref) -= length($1);	# CUT OFF WHATEVER CAUSED THE SHORTNESS
+			goto short if ($omode eq 'PARA' || $omode eq 'MAX');
+			_failmsg "Found invalid nested tag: $1", pos $$textref;
+			goto failed;
+		}
+		elsif ($$textref =~ m/\G($ldel)/gc)
+		{
+			my $tag = $1;
+			pos($$textref) -= length($tag);	# REWIND TO NESTED TAG
+			unless (_match_tagged(@_))	# MATCH NESTED TAG
+			{
+				goto short if $omode eq 'PARA' || $omode eq 'MAX';
+				_failmsg "Found unbalanced nested tag: $tag",
+					 pos $$textref;
+				goto failed;
+			}
+		}
+		else { $$textref =~ m/./gcs }
+	}
+
+short:
+	$closetagpos = pos($$textref);
+	goto matched if $omode eq 'MAX';
+	goto failed unless $omode eq 'PARA';
+
+	if (defined $parapos) { pos($$textref) = $parapos }
+	else		      { $parapos = pos($$textref) }
+
+	return (
+		$startpos,    $opentagpos-$startpos,		# PREFIX
+		$opentagpos,  $textpos-$opentagpos,		# OPENING TAG
+		$textpos,     $parapos-$textpos,		# TEXT
+		$parapos,     0,				# NO CLOSING TAG
+		$parapos,     length($$textref)-$parapos,	# REMAINDER
+	       );
+	
+matched:
+	$endpos = pos($$textref);
+	return (
+		$startpos,    $opentagpos-$startpos,		# PREFIX
+		$opentagpos,  $textpos-$opentagpos,		# OPENING TAG
+		$textpos,     $closetagpos-$textpos,		# TEXT
+		$closetagpos, $endpos-$closetagpos,		# CLOSING TAG
+		$endpos,      length($$textref)-$endpos,	# REMAINDER
+	       );
+
+failed:
+	_failmsg "Did not find closing tag", pos $$textref unless $@;
+	pos($$textref) = $startpos;
+	return;
+}
+
+sub extract_variable (;$$)
+{
+	my $textref = defined $_[0] ? \$_[0] : \$_;
+	return ("","","") unless defined $$textref;
+	my $pre  = defined $_[1] ? $_[1] : '\s*';
+
+	my @match = _match_variable($textref,$pre);
+
+	return _fail wantarray, $textref unless @match;
+
+	return _succeed wantarray, $textref,
+			@match[2..3,4..5,0..1];		# MATCH, REMAINDER, PREFIX
+}
+
+sub _match_variable($$)
+{
+#  $#
+#  $^
+#  $$
+	my ($textref, $pre) = @_;
+	my $startpos = pos($$textref) = pos($$textref)||0;
+	unless ($$textref =~ m/\G($pre)/gc)
+	{
+		_failmsg "Did not find prefix: /$pre/", pos $$textref;
+		return;
+	}
+	my $varpos = pos($$textref);
+        unless ($$textref =~ m{\G\$\s*(?!::)(\d+|[][&`'+*./|,";%=~:?!\@<>()-]|\^[a-z]?)}gci)
+	{
+	    unless ($$textref =~ m/\G((\$#?|[*\@\%]|\\&)+)/gc)
+	    {
+		_failmsg "Did not find leading dereferencer", pos $$textref;
+		pos $$textref = $startpos;
+		return;
+	    }
+	    my $deref = $1;
+
+	    unless ($$textref =~ m/\G\s*(?:::|')?(?:[_a-z]\w*(?:::|'))*[_a-z]\w*/gci
+	    	or _match_codeblock($textref, "", '\{', '\}', '\{', '\}', 0)
+		or $deref eq '$#' or $deref eq '$$' )
+	    {
+		_failmsg "Bad identifier after dereferencer", pos $$textref;
+		pos $$textref = $startpos;
+		return;
+	    }
+	}
+
+	while (1)
+	{
+		next if $$textref =~ m/\G\s*(?:->)?\s*[{]\w+[}]/gc;
+		next if _match_codeblock($textref,
+					 qr/\s*->\s*(?:[_a-zA-Z]\w+\s*)?/,
+					 qr/[({[]/, qr/[)}\]]/,
+					 qr/[({[]/, qr/[)}\]]/, 0);
+		next if _match_codeblock($textref,
+					 qr/\s*/, qr/[{[]/, qr/[}\]]/,
+					 qr/[{[]/, qr/[}\]]/, 0);
+		next if _match_variable($textref,'\s*->\s*');
+		next if $$textref =~ m/\G\s*->\s*\w+(?![{([])/gc;
+		last;
+	}
+	
+	my $endpos = pos($$textref);
+	return ($startpos, $varpos-$startpos,
+		$varpos,   $endpos-$varpos,
+		$endpos,   length($$textref)-$endpos
+		);
+}
+
+sub extract_codeblock (;$$$$$)
+{
+	my $textref = defined $_[0] ? \$_[0] : \$_;
+	my $wantarray = wantarray;
+	my $ldel_inner = defined $_[1] ? $_[1] : '{';
+	my $pre        = defined $_[2] ? $_[2] : '\s*';
+	my $ldel_outer = defined $_[3] ? $_[3] : $ldel_inner;
+	my $rd         = $_[4];
+	my $rdel_inner = $ldel_inner;
+	my $rdel_outer = $ldel_outer;
+	my $posbug = pos;
+	for ($ldel_inner, $ldel_outer) { tr/[]()<>{}\0-\377/[[((<<{{/ds }
+	for ($rdel_inner, $rdel_outer) { tr/[]()<>{}\0-\377/]]))>>}}/ds }
+	for ($ldel_inner, $ldel_outer, $rdel_inner, $rdel_outer)
+	{
+		$_ = '('.join('|',map { quotemeta $_ } split('',$_)).')'
+	}
+	pos = $posbug;
+
+	my @match = _match_codeblock($textref, $pre,
+				     $ldel_outer, $rdel_outer,
+				     $ldel_inner, $rdel_inner,
+				     $rd);
+	return _fail($wantarray, $textref) unless @match;
+	return _succeed($wantarray, $textref,
+			@match[2..3,4..5,0..1]	# MATCH, REMAINDER, PREFIX
+		       );
+
+}
+
+sub _match_codeblock($$$$$$$)
+{
+	my ($textref, $pre, $ldel_outer, $rdel_outer, $ldel_inner, $rdel_inner, $rd) = @_;
+	my $startpos = pos($$textref) = pos($$textref) || 0;
+	unless ($$textref =~ m/\G($pre)/gc)
+	{
+		_failmsg qq{Did not match prefix /$pre/ at"} .
+			    substr($$textref,pos($$textref),20) .
+			    q{..."},
+		         pos $$textref;
+		return; 
+	}
+	my $codepos = pos($$textref);
+	unless ($$textref =~ m/\G($ldel_outer)/gc)	# OUTERMOST DELIMITER
+	{
+		_failmsg qq{Did not find expected opening bracket at "} .
+			     substr($$textref,pos($$textref),20) .
+			     q{..."},
+		         pos $$textref;
+		pos $$textref = $startpos;
+		return;
+	}
+	my $closing = $1;
+	   $closing =~ tr/([<{/)]>}/;
+	my $matched;
+	my $patvalid = 1;
+	while (pos($$textref) < length($$textref))
+	{
+		$matched = '';
+		if ($rd && $$textref =~ m#\G(\Q(?)\E|\Q(s?)\E|\Q(s)\E)#gc)
+		{
+			$patvalid = 0;
+			next;
+		}
+
+		if ($$textref =~ m/\G\s*#.*/gc)
+		{
+			next;
+		}
+
+		if ($$textref =~ m/\G\s*($rdel_outer)/gc)
+		{
+			unless ($matched = ($closing && $1 eq $closing) )
+			{
+				next if $1 eq '>';	# MIGHT BE A "LESS THAN"
+				_failmsg q{Mismatched closing bracket at "} .
+					     substr($$textref,pos($$textref),20) .
+					     qq{...". Expected '$closing'},
+					 pos $$textref;
+			}
+			last;
+		}
+
+		if (_match_variable($textref,'\s*') ||
+		    _match_quotelike($textref,'\s*',$patvalid,$patvalid) )
+		{
+			$patvalid = 0;
+			next;
+		}
+
+
+		# NEED TO COVER MANY MORE CASES HERE!!!
+		if ($$textref =~ m#\G\s*(?!$ldel_inner)
+					( [-+*x/%^&|.]=?
+					| [!=]~
+					| =(?!>)
+					| (\*\*|&&|\|\||<<|>>)=?
+					| split|grep|map|return
+					| [([]
+					)#gcx)
+		{
+			$patvalid = 1;
+			next;
+		}
+
+		if ( _match_codeblock($textref, '\s*', $ldel_inner, $rdel_inner, $ldel_inner, $rdel_inner, $rd) )
+		{
+			$patvalid = 1;
+			next;
+		}
+
+		if ($$textref =~ m/\G\s*$ldel_outer/gc)
+		{
+			_failmsg q{Improperly nested codeblock at "} .
+				     substr($$textref,pos($$textref),20) .
+				     q{..."},
+				 pos $$textref;
+			last;
+		}
+
+		$patvalid = 0;
+		$$textref =~ m/\G\s*(\w+|[-=>]>|.|\Z)/gc;
+	}
+	continue { $@ = undef }
+
+	unless ($matched)
+	{
+		_failmsg 'No match found for opening bracket', pos $$textref
+			unless $@;
+		return;
+	}
+
+	my $endpos = pos($$textref);
+	return ( $startpos, $codepos-$startpos,
+		 $codepos, $endpos-$codepos,
+		 $endpos,  length($$textref)-$endpos,
+	       );
+}
+
+
+my %mods   = (
+		'none'	=> '[cgimsox]*',
+		'm'	=> '[cgimsox]*',
+		's'	=> '[cegimsox]*',
+		'tr'	=> '[cds]*',
+		'y'	=> '[cds]*',
+		'qq'	=> '',
+		'qx'	=> '',
+		'qw'	=> '',
+		'qr'	=> '[imsx]*',
+		'q'	=> '',
+	     );
+
+sub extract_quotelike (;$$)
+{
+	my $textref = $_[0] ? \$_[0] : \$_;
+	my $wantarray = wantarray;
+	my $pre  = defined $_[1] ? $_[1] : '\s*';
+
+	my @match = _match_quotelike($textref,$pre,1,0);
+	return _fail($wantarray, $textref) unless @match;
+	return _succeed($wantarray, $textref,
+			$match[2], $match[18]-$match[2],	# MATCH
+			@match[18,19],				# REMAINDER
+			@match[0,1],				# PREFIX
+			@match[2..17],				# THE BITS
+			@match[20,21],				# ANY FILLET?
+		       );
+};
+
+sub _match_quotelike($$$$)	# ($textref, $prepat, $allow_raw_match)
+{
+	my ($textref, $pre, $rawmatch, $qmark) = @_;
+
+	my ($textlen,$startpos,
+	    $oppos,
+	    $preld1pos,$ld1pos,$str1pos,$rd1pos,
+	    $preld2pos,$ld2pos,$str2pos,$rd2pos,
+	    $modpos) = ( length($$textref), pos($$textref) = pos($$textref) || 0 );
+
+	unless ($$textref =~ m/\G($pre)/gc)
+	{
+		_failmsg qq{Did not find prefix /$pre/ at "} .
+			     substr($$textref, pos($$textref), 20) .
+			     q{..."},
+		         pos $$textref;
+		return; 
+	}
+	$oppos = pos($$textref);
+
+	my $initial = substr($$textref,$oppos,1);
+
+	if ($initial && $initial =~ m|^[\"\'\`]|
+		     || $rawmatch && $initial =~ m|^/|
+		     || $qmark && $initial =~ m|^\?|)
+	{
+		unless ($$textref =~ m/ \Q$initial\E [^\\$initial]* (\\.[^\\$initial]*)* \Q$initial\E /gcsx)
+		{
+			_failmsg qq{Did not find closing delimiter to match '$initial' at "} .
+				     substr($$textref, $oppos, 20) .
+				     q{..."},
+				 pos $$textref;
+			pos $$textref = $startpos;
+			return;
+		}
+		$modpos= pos($$textref);
+		$rd1pos = $modpos-1;
+
+		if ($initial eq '/' || $initial eq '?') 
+		{
+			$$textref =~ m/\G$mods{none}/gc
+		}
+
+		my $endpos = pos($$textref);
+		return (
+			$startpos,	$oppos-$startpos,	# PREFIX
+			$oppos,		0,			# NO OPERATOR
+			$oppos,		1,			# LEFT DEL
+			$oppos+1,	$rd1pos-$oppos-1,	# STR/PAT
+			$rd1pos,	1,			# RIGHT DEL
+			$modpos,	0,			# NO 2ND LDEL
+			$modpos,	0,			# NO 2ND STR
+			$modpos,	0,			# NO 2ND RDEL
+			$modpos,	$endpos-$modpos,	# MODIFIERS
+			$endpos, 	$textlen-$endpos,	# REMAINDER
+		       );
+	}
+
+	unless ($$textref =~ m{\G(\b(?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<)}gc)
+	{
+		_failmsg q{No quotelike operator found after prefix at "} .
+			     substr($$textref, pos($$textref), 20) .
+			     q{..."},
+		         pos $$textref;
+		pos $$textref = $startpos;
+		return;
+	}
+
+	my $op = $1;
+	$preld1pos = pos($$textref);
+	if ($op eq '<<') {
+		$ld1pos = pos($$textref);
+		my $label;
+		if ($$textref =~ m{\G([A-Za-z_]\w*)}gc) {
+			$label = $1;
+		}
+		elsif ($$textref =~ m{ \G ' ([^'\\]* (?:\\.[^'\\]*)*) '
+				     | \G " ([^"\\]* (?:\\.[^"\\]*)*) "
+				     | \G ` ([^`\\]* (?:\\.[^`\\]*)*) `
+				     }gcsx) {
+			$label = $+;
+		}
+		else {
+			$label = "";
+		}
+		my $extrapos = pos($$textref);
+		$$textref =~ m{.*\n}gc;
+		$str1pos = pos($$textref);
+		unless ($$textref =~ m{.*?\n(?=$label\n)}gc) {
+			_failmsg qq{Missing here doc terminator ('$label') after "} .
+				     substr($$textref, $startpos, 20) .
+				     q{..."},
+				 pos $$textref;
+			pos $$textref = $startpos;
+			return;
+		}
+		$rd1pos = pos($$textref);
+		$$textref =~ m{$label\n}gc;
+		$ld2pos = pos($$textref);
+		return (
+			$startpos,	$oppos-$startpos,	# PREFIX
+			$oppos,		length($op),		# OPERATOR
+			$ld1pos,	$extrapos-$ld1pos,	# LEFT DEL
+			$str1pos,	$rd1pos-$str1pos,	# STR/PAT
+			$rd1pos,	$ld2pos-$rd1pos,	# RIGHT DEL
+			$ld2pos,	0,			# NO 2ND LDEL
+			$ld2pos,	0,                	# NO 2ND STR
+			$ld2pos,	0,	                # NO 2ND RDEL
+			$ld2pos,	0,                      # NO MODIFIERS
+			$ld2pos,	$textlen-$ld2pos,	# REMAINDER
+			$extrapos,      $str1pos-$extrapos,	# FILLETED BIT
+		       );
+	}
+
+	$$textref =~ m/\G\s*/gc;
+	$ld1pos = pos($$textref);
+	$str1pos = $ld1pos+1;
+
+	unless ($$textref =~ m/\G(\S)/gc)	# SHOULD USE LOOKAHEAD
+	{
+		_failmsg "No block delimiter found after quotelike $op",
+		         pos $$textref;
+		pos $$textref = $startpos;
+		return;
+	}
+	pos($$textref) = $ld1pos;	# HAVE TO DO THIS BECAUSE LOOKAHEAD BROKEN
+	my ($ldel1, $rdel1) = ("\Q$1","\Q$1");
+	if ($ldel1 =~ /[[(<{]/)
+	{
+		$rdel1 =~ tr/[({</])}>/;
+		_match_bracketed($textref,"",$ldel1,"","",$rdel1)
+		|| do { pos $$textref = $startpos; return };
+	}
+	else
+	{
+		$$textref =~ /$ldel1[^\\$ldel1]*(\\.[^\\$ldel1]*)*$ldel1/gcs
+		|| do { pos $$textref = $startpos; return };
+	}
+	$ld2pos = $rd1pos = pos($$textref)-1;
+
+	my $second_arg = $op =~ /s|tr|y/ ? 1 : 0;
+	if ($second_arg)
+	{
+		my ($ldel2, $rdel2);
+		if ($ldel1 =~ /[[(<{]/)
+		{
+			unless ($$textref =~ /\G\s*(\S)/gc)	# SHOULD USE LOOKAHEAD
+			{
+				_failmsg "Missing second block for quotelike $op",
+					 pos $$textref;
+				pos $$textref = $startpos;
+				return;
+			}
+			$ldel2 = $rdel2 = "\Q$1";
+			$rdel2 =~ tr/[({</])}>/;
+		}
+		else
+		{
+			$ldel2 = $rdel2 = $ldel1;
+		}
+		$str2pos = $ld2pos+1;
+
+		if ($ldel2 =~ /[[(<{]/)
+		{
+			pos($$textref)--;	# OVERCOME BROKEN LOOKAHEAD 
+			_match_bracketed($textref,"",$ldel2,"","",$rdel2)
+			|| do { pos $$textref = $startpos; return };
+		}
+		else
+		{
+			$$textref =~ /[^\\$ldel2]*(\\.[^\\$ldel2]*)*$ldel2/gcs
+			|| do { pos $$textref = $startpos; return };
+		}
+		$rd2pos = pos($$textref)-1;
+	}
+	else
+	{
+		$ld2pos = $str2pos = $rd2pos = $rd1pos;
+	}
+
+	$modpos = pos $$textref;
+
+	$$textref =~ m/\G($mods{$op})/gc;
+	my $endpos = pos $$textref;
+
+	return (
+		$startpos,	$oppos-$startpos,	# PREFIX
+		$oppos,		length($op),		# OPERATOR
+		$ld1pos,	1,			# LEFT DEL
+		$str1pos,	$rd1pos-$str1pos,	# STR/PAT
+		$rd1pos,	1,			# RIGHT DEL
+		$ld2pos,	$second_arg,		# 2ND LDEL (MAYBE)
+		$str2pos,	$rd2pos-$str2pos,	# 2ND STR (MAYBE)
+		$rd2pos,	$second_arg,		# 2ND RDEL (MAYBE)
+		$modpos,	$endpos-$modpos,	# MODIFIERS
+		$endpos,	$textlen-$endpos,	# REMAINDER
+	       );
+}
+
+my $def_func = 
+[
+	sub { extract_variable($_[0], '') },
+	sub { extract_quotelike($_[0],'') },
+	sub { extract_codeblock($_[0],'{}','') },
+];
+
+sub extract_multiple (;$$$$)	# ($text, $functions_ref, $max_fields, $ignoreunknown)
+{
+	my $textref = defined($_[0]) ? \$_[0] : \$_;
+	my $posbug = pos;
+	my ($lastpos, $firstpos);
+	my @fields = ();
+
+	#for ($$textref)
+	{
+		my @func = defined $_[1] ? @{$_[1]} : @{$def_func};
+		my $max  = defined $_[2] && $_[2]>0 ? $_[2] : 1_000_000_000;
+		my $igunk = $_[3];
+
+		pos $$textref ||= 0;
+
+		unless (wantarray)
+		{
+			use Carp;
+			carp "extract_multiple reset maximal count to 1 in scalar context"
+				if $^W && defined($_[2]) && $max > 1;
+			$max = 1
+		}
+
+		my $unkpos;
+		my $func;
+		my $class;
+
+		my @class;
+		foreach $func ( @func )
+		{
+			if (ref($func) eq 'HASH')
+			{
+				push @class, (keys %$func)[0];
+				$func = (values %$func)[0];
+			}
+			else
+			{
+				push @class, undef;
+			}
+		}
+
+		FIELD: while (pos($$textref) < length($$textref))
+		{
+			my ($field, $rem);
+			my @bits;
+			foreach my $i ( 0..$#func )
+			{
+				my $pref;
+				$func = $func[$i];
+				$class = $class[$i];
+				$lastpos = pos $$textref;
+				if (ref($func) eq 'CODE')
+					{ ($field,$rem,$pref) = @bits = $func->($$textref);
+					# print "[$field|$rem]" if $field;
+					}
+				elsif (ref($func) eq 'Text::Balanced::Extractor')
+					{ @bits = $field = $func->extract($$textref) }
+				elsif( $$textref =~ m/\G$func/gc )
+					{ @bits = $field = defined($1) ? $1 : $& }
+				$pref ||= "";
+				if (defined($field) && length($field))
+				{
+					if (!$igunk) {
+						$unkpos = pos $$textref
+							if length($pref) && !defined($unkpos);
+						if (defined $unkpos)
+						{
+							push @fields, substr($$textref, $unkpos, $lastpos-$unkpos).$pref;
+							$firstpos = $unkpos unless defined $firstpos;
+							undef $unkpos;
+							last FIELD if @fields == $max;
+						}
+					}
+					push @fields, $class
+						? bless (\$field, $class)
+						: $field;
+					$firstpos = $lastpos unless defined $firstpos;
+					$lastpos = pos $$textref;
+					last FIELD if @fields == $max;
+					next FIELD;
+				}
+			}
+			if ($$textref =~ /\G(.)/gcs)
+			{
+				$unkpos = pos($$textref)-1
+					unless $igunk || defined $unkpos;
+			}
+		}
+		
+		if (defined $unkpos)
+		{
+			push @fields, substr($$textref, $unkpos);
+			$firstpos = $unkpos unless defined $firstpos;
+			$lastpos = length $$textref;
+		}
+		last;
+	}
+
+	pos $$textref = $lastpos;
+	return @fields if wantarray;
+
+	$firstpos ||= 0;
+	eval { substr($$textref,$firstpos,$lastpos-$firstpos)="";
+	       pos $$textref = $firstpos };
+	return $fields[0];
+}
+
+
+sub gen_extract_tagged # ($opentag, $closetag, $pre, \%options)
+{
+	my $ldel    = $_[0];
+	my $rdel    = $_[1];
+	my $pre     = defined $_[2] ? $_[2] : '\s*';
+	my %options = defined $_[3] ? %{$_[3]} : ();
+	my $omode   = defined $options{fail} ? $options{fail} : '';
+	my $bad     = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}})
+		    : defined($options{reject})	       ? $options{reject}
+		    :					 ''
+		    ;
+	my $ignore  = ref($options{ignore}) eq 'ARRAY' ? join('|', @{$options{ignore}})
+		    : defined($options{ignore})	       ? $options{ignore}
+		    :					 ''
+		    ;
+
+	if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; }
+
+	my $posbug = pos;
+	for ($ldel, $pre, $bad, $ignore) { $_ = qr/$_/ if $_ }
+	pos = $posbug;
+
+	my $closure = sub
+	{
+		my $textref = defined $_[0] ? \$_[0] : \$_;
+		my @match = Text::Balanced::_match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore);
+
+		return _fail(wantarray, $textref) unless @match;
+		return _succeed wantarray, $textref,
+				$match[2], $match[3]+$match[5]+$match[7],	# MATCH
+				@match[8..9,0..1,2..7];				# REM, PRE, BITS
+	};
+
+	bless $closure, 'Text::Balanced::Extractor';
+}
+
+package Text::Balanced::Extractor;
+
+sub extract($$)	# ($self, $text)
+{
+	&{$_[0]}($_[1]);
+}
+
+package Text::Balanced::ErrorMsg;
+
+use overload '""' => sub { "$_[0]->{error}, detected at offset $_[0]->{pos}" };
+
+1;
+
+__END__
+
+=head1 NAME
+
+Text::Balanced - Extract delimited text sequences from strings.
+
+
+=head1 SYNOPSIS
+
+ use Text::Balanced qw (
+			extract_delimited
+			extract_bracketed
+			extract_quotelike
+			extract_codeblock
+			extract_variable
+			extract_tagged
+			extract_multiple
+
+			gen_delimited_pat
+			gen_extract_tagged
+		       );
+
+ # Extract the initial substring of $text that is delimited by
+ # two (unescaped) instances of the first character in $delim.
+
+	($extracted, $remainder) = extract_delimited($text,$delim);
+
+
+ # Extract the initial substring of $text that is bracketed
+ # with a delimiter(s) specified by $delim (where the string
+ # in $delim contains one or more of '(){}[]<>').
+
+	($extracted, $remainder) = extract_bracketed($text,$delim);
+
+
+ # Extract the initial substring of $text that is bounded by
+ # an XML tag.
+
+	($extracted, $remainder) = extract_tagged($text);
+
+
+ # Extract the initial substring of $text that is bounded by
+ # a C<BEGIN>...C<END> pair. Don't allow nested C<BEGIN> tags
+
+	($extracted, $remainder) =
+		extract_tagged($text,"BEGIN","END",undef,{bad=>["BEGIN"]});
+
+
+ # Extract the initial substring of $text that represents a
+ # Perl "quote or quote-like operation"
+
+	($extracted, $remainder) = extract_quotelike($text);
+
+
+ # Extract the initial substring of $text that represents a block
+ # of Perl code, bracketed by any of character(s) specified by $delim
+ # (where the string $delim contains one or more of '(){}[]<>').
+
+	($extracted, $remainder) = extract_codeblock($text,$delim);
+
+
+ # Extract the initial substrings of $text that would be extracted by
+ # one or more sequential applications of the specified functions
+ # or regular expressions
+
+	@extracted = extract_multiple($text,
+				      [ \&extract_bracketed,
+					\&extract_quotelike,
+					\&some_other_extractor_sub,
+					qr/[xyz]*/,
+					'literal',
+				      ]);
+
+# Create a string representing an optimized pattern (a la Friedl)
+# that matches a substring delimited by any of the specified characters
+# (in this case: any type of quote or a slash)
+
+	$patstring = gen_delimited_pat(q{'"`/});
+
+
+# Generate a reference to an anonymous sub that is just like extract_tagged
+# but pre-compiled and optimized for a specific pair of tags, and consequently
+# much faster (i.e. 3 times faster). It uses qr// for better performance on
+# repeated calls, so it only works under Perl 5.005 or later.
+
+	$extract_head = gen_extract_tagged('<HEAD>','</HEAD>');
+
+	($extracted, $remainder) = $extract_head->($text);
+
+
+=head1 DESCRIPTION
+
+The various C<extract_...> subroutines may be used to
+extract a delimited substring, possibly after skipping a
+specified prefix string. By default, that prefix is
+optional whitespace (C</\s*/>), but you can change it to whatever
+you wish (see below).
+
+The substring to be extracted must appear at the
+current C<pos> location of the string's variable
+(or at index zero, if no C<pos> position is defined).
+In other words, the C<extract_...> subroutines I<don't>
+extract the first occurance of a substring anywhere
+in a string (like an unanchored regex would). Rather,
+they extract an occurance of the substring appearing
+immediately at the current matching position in the
+string (like a C<\G>-anchored regex would).
+
+
+
+=head2 General behaviour in list contexts
+
+In a list context, all the subroutines return a list, the first three
+elements of which are always:
+
+=over 4
+
+=item [0]
+
+The extracted string, including the specified delimiters.
+If the extraction fails an empty string is returned.
+
+=item [1]
+
+The remainder of the input string (i.e. the characters after the
+extracted string). On failure, the entire string is returned.
+
+=item [2]
+
+The skipped prefix (i.e. the characters before the extracted string).
+On failure, the empty string is returned.
+
+=back 
+
+Note that in a list context, the contents of the original input text (the first
+argument) are not modified in any way. 
+
+However, if the input text was passed in a variable, that variable's
+C<pos> value is updated to point at the first character after the
+extracted text. That means that in a list context the various
+subroutines can be used much like regular expressions. For example:
+
+	while ( $next = (extract_quotelike($text))[0] )
+	{
+		# process next quote-like (in $next)
+	}
+
+
+=head2 General behaviour in scalar and void contexts
+
+In a scalar context, the extracted string is returned, having first been
+removed from the input text. Thus, the following code also processes
+each quote-like operation, but actually removes them from $text:
+
+	while ( $next = extract_quotelike($text) )
+	{
+		# process next quote-like (in $next)
+	}
+
+Note that if the input text is a read-only string (i.e. a literal),
+no attempt is made to remove the extracted text.
+
+In a void context the behaviour of the extraction subroutines is
+exactly the same as in a scalar context, except (of course) that the
+extracted substring is not returned.
+
+=head2 A note about prefixes
+
+Prefix patterns are matched without any trailing modifiers (C</gimsox> etc.)
+This can bite you if you're expecting a prefix specification like
+'.*?(?=<H1>)' to skip everything up to the first <H1> tag. Such a prefix
+pattern will only succeed if the <H1> tag is on the current line, since
+. normally doesn't match newlines.
+
+To overcome this limitation, you need to turn on /s matching within
+the prefix pattern, using the C<(?s)> directive: '(?s).*?(?=<H1>)'
+
+
+=head2 C<extract_delimited>
+
+The C<extract_delimited> function formalizes the common idiom
+of extracting a single-character-delimited substring from the start of
+a string. For example, to extract a single-quote delimited string, the
+following code is typically used:
+
+	($remainder = $text) =~ s/\A('(\\.|[^'])*')//s;
+	$extracted = $1;
+
+but with C<extract_delimited> it can be simplified to:
+
+	($extracted,$remainder) = extract_delimited($text, "'");
+
+C<extract_delimited> takes up to four scalars (the input text, the
+delimiters, a prefix pattern to be skipped, and any escape characters)
+and extracts the initial substring of the text that
+is appropriately delimited. If the delimiter string has multiple
+characters, the first one encountered in the text is taken to delimit
+the substring.
+The third argument specifies a prefix pattern that is to be skipped
+(but must be present!) before the substring is extracted.
+The final argument specifies the escape character to be used for each
+delimiter.
+
+All arguments are optional. If the escape characters are not specified,
+every delimiter is escaped with a backslash (C<\>).
+If the prefix is not specified, the
+pattern C<'\s*'> - optional whitespace - is used. If the delimiter set
+is also not specified, the set C</["'`]/> is used. If the text to be processed
+is not specified either, C<$_> is used.
+
+In list context, C<extract_delimited> returns a array of three
+elements, the extracted substring (I<including the surrounding
+delimiters>), the remainder of the text, and the skipped prefix (if
+any). If a suitable delimited substring is not found, the first
+element of the array is the empty string, the second is the complete
+original text, and the prefix returned in the third element is an
+empty string.
+
+In a scalar context, just the extracted substring is returned. In
+a void context, the extracted substring (and any prefix) are simply
+removed from the beginning of the first argument.
+
+Examples:
+
+	# Remove a single-quoted substring from the very beginning of $text:
+
+		$substring = extract_delimited($text, "'", '');
+
+	# Remove a single-quoted Pascalish substring (i.e. one in which
+	# doubling the quote character escapes it) from the very
+	# beginning of $text:
+
+		$substring = extract_delimited($text, "'", '', "'");
+
+	# Extract a single- or double- quoted substring from the
+	# beginning of $text, optionally after some whitespace
+	# (note the list context to protect $text from modification):
+
+		($substring) = extract_delimited $text, q{"'};
+
+
+	# Delete the substring delimited by the first '/' in $text:
+
+		$text = join '', (extract_delimited($text,'/','[^/]*')[2,1];
+
+Note that this last example is I<not> the same as deleting the first
+quote-like pattern. For instance, if C<$text> contained the string:
+
+	"if ('./cmd' =~ m/$UNIXCMD/s) { $cmd = $1; }"
+	
+then after the deletion it would contain:
+
+	"if ('.$UNIXCMD/s) { $cmd = $1; }"
+
+not:
+
+	"if ('./cmd' =~ ms) { $cmd = $1; }"
+	
+
+See L<"extract_quotelike"> for a (partial) solution to this problem.
+
+
+=head2 C<extract_bracketed>
+
+Like C<"extract_delimited">, the C<extract_bracketed> function takes
+up to three optional scalar arguments: a string to extract from, a delimiter
+specifier, and a prefix pattern. As before, a missing prefix defaults to
+optional whitespace and a missing text defaults to C<$_>. However, a missing
+delimiter specifier defaults to C<'{}()[]E<lt>E<gt>'> (see below).
+
+C<extract_bracketed> extracts a balanced-bracket-delimited
+substring (using any one (or more) of the user-specified delimiter
+brackets: '(..)', '{..}', '[..]', or '<..>'). Optionally it will also
+respect quoted unbalanced brackets (see below).
+
+A "delimiter bracket" is a bracket in list of delimiters passed as
+C<extract_bracketed>'s second argument. Delimiter brackets are
+specified by giving either the left or right (or both!) versions
+of the required bracket(s). Note that the order in which
+two or more delimiter brackets are specified is not significant.
+
+A "balanced-bracket-delimited substring" is a substring bounded by
+matched brackets, such that any other (left or right) delimiter
+bracket I<within> the substring is also matched by an opposite
+(right or left) delimiter bracket I<at the same level of nesting>. Any
+type of bracket not in the delimiter list is treated as an ordinary
+character.
+
+In other words, each type of bracket specified as a delimiter must be
+balanced and correctly nested within the substring, and any other kind of
+("non-delimiter") bracket in the substring is ignored.
+
+For example, given the string:
+
+	$text = "{ an '[irregularly :-(] {} parenthesized >:-)' string }";
+
+then a call to C<extract_bracketed> in a list context:
+
+	@result = extract_bracketed( $text, '{}' );
+
+would return:
+
+	( "{ an '[irregularly :-(] {} parenthesized >:-)' string }" , "" , "" )
+
+since both sets of C<'{..}'> brackets are properly nested and evenly balanced.
+(In a scalar context just the first element of the array would be returned. In
+a void context, C<$text> would be replaced by an empty string.)
+
+Likewise the call in:
+
+	@result = extract_bracketed( $text, '{[' );
+
+would return the same result, since all sets of both types of specified
+delimiter brackets are correctly nested and balanced.
+
+However, the call in:
+
+	@result = extract_bracketed( $text, '{([<' );
+
+would fail, returning:
+
+	( undef , "{ an '[irregularly :-(] {} parenthesized >:-)' string }"  );
+
+because the embedded pairs of C<'(..)'>s and C<'[..]'>s are "cross-nested" and
+the embedded C<'E<gt>'> is unbalanced. (In a scalar context, this call would
+return an empty string. In a void context, C<$text> would be unchanged.)
+
+Note that the embedded single-quotes in the string don't help in this
+case, since they have not been specified as acceptable delimiters and are
+therefore treated as non-delimiter characters (and ignored).
+
+However, if a particular species of quote character is included in the
+delimiter specification, then that type of quote will be correctly handled.
+for example, if C<$text> is:
+
+	$text = '<A HREF=">>>>">link</A>';
+
+then
+
+	@result = extract_bracketed( $text, '<">' );
+
+returns:
+
+	( '<A HREF=">>>>">', 'link</A>', "" )
+
+as expected. Without the specification of C<"> as an embedded quoter:
+
+	@result = extract_bracketed( $text, '<>' );
+
+the result would be:
+
+	( '<A HREF=">', '>>>">link</A>', "" )
+
+In addition to the quote delimiters C<'>, C<">, and C<`>, full Perl quote-like
+quoting (i.e. q{string}, qq{string}, etc) can be specified by including the
+letter 'q' as a delimiter. Hence:
+
+	@result = extract_bracketed( $text, '<q>' );
+
+would correctly match something like this:
+
+	$text = '<leftop: conj /and/ conj>';
+
+See also: C<"extract_quotelike"> and C<"extract_codeblock">.
+
+
+=head2 C<extract_variable>
+
+C<extract_variable> extracts any valid Perl variable or
+variable-involved expression, including scalars, arrays, hashes, array
+accesses, hash look-ups, method calls through objects, subroutine calles
+through subroutine references, etc.
+
+The subroutine takes up to two optional arguments:
+
+=over 4
+
+=item 1.
+
+A string to be processed (C<$_> if the string is omitted or C<undef>)
+
+=item 2.
+
+A string specifying a pattern to be matched as a prefix (which is to be
+skipped). If omitted, optional whitespace is skipped.
+
+=back
+
+On success in a list context, an array of 3 elements is returned. The
+elements are:
+
+=over 4
+
+=item [0]
+
+the extracted variable, or variablish expression
+
+=item [1]
+
+the remainder of the input text,
+
+=item [2]
+
+the prefix substring (if any),
+
+=back
+
+On failure, all of these values (except the remaining text) are C<undef>.
+
+In a scalar context, C<extract_variable> returns just the complete
+substring that matched a variablish expression. C<undef> is returned on
+failure. In addition, the original input text has the returned substring
+(and any prefix) removed from it.
+
+In a void context, the input text just has the matched substring (and
+any specified prefix) removed.
+
+
+=head2 C<extract_tagged>
+
+C<extract_tagged> extracts and segments text between (balanced)
+specified tags. 
+
+The subroutine takes up to five optional arguments:
+
+=over 4
+
+=item 1.
+
+A string to be processed (C<$_> if the string is omitted or C<undef>)
+
+=item 2.
+
+A string specifying a pattern to be matched as the opening tag.
+If the pattern string is omitted (or C<undef>) then a pattern
+that matches any standard XML tag is used.
+
+=item 3.
+
+A string specifying a pattern to be matched at the closing tag. 
+If the pattern string is omitted (or C<undef>) then the closing
+tag is constructed by inserting a C</> after any leading bracket
+characters in the actual opening tag that was matched (I<not> the pattern
+that matched the tag). For example, if the opening tag pattern
+is specified as C<'{{\w+}}'> and actually matched the opening tag 
+C<"{{DATA}}">, then the constructed closing tag would be C<"{{/DATA}}">.
+
+=item 4.
+
+A string specifying a pattern to be matched as a prefix (which is to be
+skipped). If omitted, optional whitespace is skipped.
+
+=item 5.
+
+A hash reference containing various parsing options (see below)
+
+=back
+
+The various options that can be specified are:
+
+=over 4
+
+=item C<reject =E<gt> $listref>
+
+The list reference contains one or more strings specifying patterns
+that must I<not> appear within the tagged text.
+
+For example, to extract
+an HTML link (which should not contain nested links) use:
+
+        extract_tagged($text, '<A>', '</A>', undef, {reject => ['<A>']} );
+
+=item C<ignore =E<gt> $listref>
+
+The list reference contains one or more strings specifying patterns
+that are I<not> be be treated as nested tags within the tagged text
+(even if they would match the start tag pattern).
+
+For example, to extract an arbitrary XML tag, but ignore "empty" elements:
+
+        extract_tagged($text, undef, undef, undef, {ignore => ['<[^>]*/>']} );
+
+(also see L<"gen_delimited_pat"> below).
+
+
+=item C<fail =E<gt> $str>
+
+The C<fail> option indicates the action to be taken if a matching end
+tag is not encountered (i.e. before the end of the string or some
+C<reject> pattern matches). By default, a failure to match a closing
+tag causes C<extract_tagged> to immediately fail.
+
+However, if the string value associated with <reject> is "MAX", then
+C<extract_tagged> returns the complete text up to the point of failure.
+If the string is "PARA", C<extract_tagged> returns only the first paragraph
+after the tag (up to the first line that is either empty or contains
+only whitespace characters).
+If the string is "", the the default behaviour (i.e. failure) is reinstated.
+
+For example, suppose the start tag "/para" introduces a paragraph, which then
+continues until the next "/endpara" tag or until another "/para" tag is
+encountered:
+
+        $text = "/para line 1\n\nline 3\n/para line 4";
+
+        extract_tagged($text, '/para', '/endpara', undef,
+                                {reject => '/para', fail => MAX );
+
+        # EXTRACTED: "/para line 1\n\nline 3\n"
+
+Suppose instead, that if no matching "/endpara" tag is found, the "/para"
+tag refers only to the immediately following paragraph:
+
+        $text = "/para line 1\n\nline 3\n/para line 4";
+
+        extract_tagged($text, '/para', '/endpara', undef,
+                        {reject => '/para', fail => MAX );
+
+        # EXTRACTED: "/para line 1\n"
+
+Note that the specified C<fail> behaviour applies to nested tags as well.
+
+=back
+
+On success in a list context, an array of 6 elements is returned. The elements are:
+
+=over 4
+
+=item [0]
+
+the extracted tagged substring (including the outermost tags),
+
+=item [1]
+
+the remainder of the input text,
+
+=item [2]
+
+the prefix substring (if any),
+
+=item [3]
+
+the opening tag
+
+=item [4]
+
+the text between the opening and closing tags
+
+=item [5]
+
+the closing tag (or "" if no closing tag was found)
+
+=back
+
+On failure, all of these values (except the remaining text) are C<undef>.
+
+In a scalar context, C<extract_tagged> returns just the complete
+substring that matched a tagged text (including the start and end
+tags). C<undef> is returned on failure. In addition, the original input
+text has the returned substring (and any prefix) removed from it.
+
+In a void context, the input text just has the matched substring (and
+any specified prefix) removed.
+
+
+=head2 C<gen_extract_tagged>
+
+(Note: This subroutine is only available under Perl5.005)
+
+C<gen_extract_tagged> generates a new anonymous subroutine which
+extracts text between (balanced) specified tags. In other words,
+it generates a function identical in function to C<extract_tagged>.
+
+The difference between C<extract_tagged> and the anonymous
+subroutines generated by
+C<gen_extract_tagged>, is that those generated subroutines:
+
+=over 4
+
+=item * 
+
+do not have to reparse tag specification or parsing options every time
+they are called (whereas C<extract_tagged> has to effectively rebuild
+its tag parser on every call);
+
+=item *
+
+make use of the new qr// construct to pre-compile the regexes they use
+(whereas C<extract_tagged> uses standard string variable interpolation 
+to create tag-matching patterns).
+
+=back
+
+The subroutine takes up to four optional arguments (the same set as
+C<extract_tagged> except for the string to be processed). It returns
+a reference to a subroutine which in turn takes a single argument (the text to
+be extracted from).
+
+In other words, the implementation of C<extract_tagged> is exactly
+equivalent to:
+
+        sub extract_tagged
+        {
+                my $text = shift;
+                $extractor = gen_extract_tagged(@_);
+                return $extractor->($text);
+        }
+
+(although C<extract_tagged> is not currently implemented that way, in order
+to preserve pre-5.005 compatibility).
+
+Using C<gen_extract_tagged> to create extraction functions for specific tags 
+is a good idea if those functions are going to be called more than once, since
+their performance is typically twice as good as the more general-purpose
+C<extract_tagged>.
+
+
+=head2 C<extract_quotelike>
+
+C<extract_quotelike> attempts to recognize, extract, and segment any
+one of the various Perl quotes and quotelike operators (see
+L<perlop(3)>) Nested backslashed delimiters, embedded balanced bracket
+delimiters (for the quotelike operators), and trailing modifiers are
+all caught. For example, in:
+
+        extract_quotelike 'q # an octothorpe: \# (not the end of the q!) #'
+        
+        extract_quotelike '  "You said, \"Use sed\"."  '
+
+        extract_quotelike ' s{([A-Z]{1,8}\.[A-Z]{3})} /\L$1\E/; '
+
+        extract_quotelike ' tr/\\\/\\\\/\\\//ds; '
+
+the full Perl quotelike operations are all extracted correctly.
+
+Note too that, when using the /x modifier on a regex, any comment
+containing the current pattern delimiter will cause the regex to be
+immediately terminated. In other words:
+
+        'm /
+                (?i)            # CASE INSENSITIVE
+                [a-z_]          # LEADING ALPHABETIC/UNDERSCORE
+                [a-z0-9]*       # FOLLOWED BY ANY NUMBER OF ALPHANUMERICS
+           /x'
+
+will be extracted as if it were:
+
+        'm /
+                (?i)            # CASE INSENSITIVE
+                [a-z_]          # LEADING ALPHABETIC/'
+
+This behaviour is identical to that of the actual compiler.
+
+C<extract_quotelike> takes two arguments: the text to be processed and
+a prefix to be matched at the very beginning of the text. If no prefix 
+is specified, optional whitespace is the default. If no text is given,
+C<$_> is used.
+
+In a list context, an array of 11 elements is returned. The elements are:
+
+=over 4
+
+=item [0]
+
+the extracted quotelike substring (including trailing modifiers),
+
+=item [1]
+
+the remainder of the input text,
+
+=item [2]
+
+the prefix substring (if any),
+
+=item [3]
+
+the name of the quotelike operator (if any),
+
+=item [4]
+
+the left delimiter of the first block of the operation,
+
+=item [5]
+
+the text of the first block of the operation
+(that is, the contents of
+a quote, the regex of a match or substitution or the target list of a
+translation),
+
+=item [6]
+
+the right delimiter of the first block of the operation,
+
+=item [7]
+
+the left delimiter of the second block of the operation
+(that is, if it is a C<s>, C<tr>, or C<y>),
+
+=item [8]
+
+the text of the second block of the operation 
+(that is, the replacement of a substitution or the translation list
+of a translation),
+
+=item [9]
+
+the right delimiter of the second block of the operation (if any),
+
+=item [10]
+
+the trailing modifiers on the operation (if any).
+
+=back
+
+For each of the fields marked "(if any)" the default value on success is
+an empty string.
+On failure, all of these values (except the remaining text) are C<undef>.
+
+
+In a scalar context, C<extract_quotelike> returns just the complete substring
+that matched a quotelike operation (or C<undef> on failure). In a scalar or
+void context, the input text has the same substring (and any specified
+prefix) removed.
+
+Examples:
+
+        # Remove the first quotelike literal that appears in text
+
+                $quotelike = extract_quotelike($text,'.*?');
+
+        # Replace one or more leading whitespace-separated quotelike
+        # literals in $_ with "<QLL>"
+
+                do { $_ = join '<QLL>', (extract_quotelike)[2,1] } until $@;
+
+
+        # Isolate the search pattern in a quotelike operation from $text
+
+                ($op,$pat) = (extract_quotelike $text)[3,5];
+                if ($op =~ /[ms]/)
+                {
+                        print "search pattern: $pat\n";
+                }
+                else
+                {
+                        print "$op is not a pattern matching operation\n";
+                }
+
+
+=head2 C<extract_quotelike> and "here documents"
+
+C<extract_quotelike> can successfully extract "here documents" from an input
+string, but with an important caveat in list contexts.
+
+Unlike other types of quote-like literals, a here document is rarely
+a contiguous substring. For example, a typical piece of code using
+here document might look like this:
+
+        <<'EOMSG' || die;
+        This is the message.
+        EOMSG
+        exit;
+
+Given this as an input string in a scalar context, C<extract_quotelike>
+would correctly return the string "<<'EOMSG'\nThis is the message.\nEOMSG",
+leaving the string " || die;\nexit;" in the original variable. In other words,
+the two separate pieces of the here document are successfully extracted and
+concatenated.
+
+In a list context, C<extract_quotelike> would return the list
+
+=over 4
+
+=item [0]
+
+"<<'EOMSG'\nThis is the message.\nEOMSG\n" (i.e. the full extracted here document,
+including fore and aft delimiters),
+
+=item [1]
+
+" || die;\nexit;" (i.e. the remainder of the input text, concatenated),
+
+=item [2]
+
+"" (i.e. the prefix substring -- trivial in this case),
+
+=item [3]
+
+"<<" (i.e. the "name" of the quotelike operator)
+
+=item [4]
+
+"'EOMSG'" (i.e. the left delimiter of the here document, including any quotes),
+
+=item [5]
+
+"This is the message.\n" (i.e. the text of the here document),
+
+=item [6]
+
+"EOMSG" (i.e. the right delimiter of the here document),
+
+=item [7..10]
+
+"" (a here document has no second left delimiter, second text, second right
+delimiter, or trailing modifiers).
+
+=back
+
+However, the matching position of the input variable would be set to
+"exit;" (i.e. I<after> the closing delimiter of the here document),
+which would cause the earlier " || die;\nexit;" to be skipped in any
+sequence of code fragment extractions.
+
+To avoid this problem, when it encounters a here document whilst
+extracting from a modifiable string, C<extract_quotelike> silently
+rearranges the string to an equivalent piece of Perl:
+
+        <<'EOMSG'
+        This is the message.
+        EOMSG
+        || die;
+        exit;
+
+in which the here document I<is> contiguous. It still leaves the
+matching position after the here document, but now the rest of the line
+on which the here document starts is not skipped.
+
+To prevent <extract_quotelike> from mucking about with the input in this way
+(this is the only case where a list-context C<extract_quotelike> does so),
+you can pass the input variable as an interpolated literal:
+
+        $quotelike = extract_quotelike("$var");
+
+
+=head2 C<extract_codeblock>
+
+C<extract_codeblock> attempts to recognize and extract a balanced
+bracket delimited substring that may contain unbalanced brackets
+inside Perl quotes or quotelike operations. That is, C<extract_codeblock>
+is like a combination of C<"extract_bracketed"> and
+C<"extract_quotelike">.
+
+C<extract_codeblock> takes the same initial three parameters as C<extract_bracketed>:
+a text to process, a set of delimiter brackets to look for, and a prefix to
+match first. It also takes an optional fourth parameter, which allows the
+outermost delimiter brackets to be specified separately (see below).
+
+Omitting the first argument (input text) means process C<$_> instead.
+Omitting the second argument (delimiter brackets) indicates that only C<'{'> is to be used.
+Omitting the third argument (prefix argument) implies optional whitespace at the start.
+Omitting the fourth argument (outermost delimiter brackets) indicates that the
+value of the second argument is to be used for the outermost delimiters.
+
+Once the prefix an dthe outermost opening delimiter bracket have been
+recognized, code blocks are extracted by stepping through the input text and
+trying the following alternatives in sequence:
+
+=over 4
+
+=item 1.
+
+Try and match a closing delimiter bracket. If the bracket was the same
+species as the last opening bracket, return the substring to that
+point. If the bracket was mismatched, return an error.
+
+=item 2.
+
+Try to match a quote or quotelike operator. If found, call
+C<extract_quotelike> to eat it. If C<extract_quotelike> fails, return
+the error it returned. Otherwise go back to step 1.
+
+=item 3.
+
+Try to match an opening delimiter bracket. If found, call
+C<extract_codeblock> recursively to eat the embedded block. If the
+recursive call fails, return an error. Otherwise, go back to step 1.
+
+=item 4.
+
+Unconditionally match a bareword or any other single character, and
+then go back to step 1.
+
+=back
+
+
+Examples:
+
+        # Find a while loop in the text
+
+                if ($text =~ s/.*?while\s*\{/{/)
+                {
+                        $loop = "while " . extract_codeblock($text);
+                }
+
+        # Remove the first round-bracketed list (which may include
+        # round- or curly-bracketed code blocks or quotelike operators)
+
+                extract_codeblock $text, "(){}", '[^(]*';
+
+
+The ability to specify a different outermost delimiter bracket is useful
+in some circumstances. For example, in the Parse::RecDescent module,
+parser actions which are to be performed only on a successful parse
+are specified using a C<E<lt>defer:...E<gt>> directive. For example:
+
+        sentence: subject verb object
+                        <defer: {$::theVerb = $item{verb}} >
+
+Parse::RecDescent uses C<extract_codeblock($text, '{}E<lt>E<gt>')> to extract the code
+within the C<E<lt>defer:...E<gt>> directive, but there's a problem.
+
+A deferred action like this:
+
+                        <defer: {if ($count>10) {$count--}} >
+
+will be incorrectly parsed as:
+
+                        <defer: {if ($count>
+
+because the "less than" operator is interpreted as a closing delimiter.
+
+But, by extracting the directive using
+S<C<extract_codeblock($text, '{}', undef, 'E<lt>E<gt>')>>
+the '>' character is only treated as a delimited at the outermost
+level of the code block, so the directive is parsed correctly.
+
+=head2 C<extract_multiple>
+
+The C<extract_multiple> subroutine takes a string to be processed and a 
+list of extractors (subroutines or regular expressions) to apply to that string.
+
+In an array context C<extract_multiple> returns an array of substrings
+of the original string, as extracted by the specified extractors.
+In a scalar context, C<extract_multiple> returns the first
+substring successfully extracted from the original string. In both
+scalar and void contexts the original string has the first successfully
+extracted substring removed from it. In all contexts
+C<extract_multiple> starts at the current C<pos> of the string, and
+sets that C<pos> appropriately after it matches.
+
+Hence, the aim of of a call to C<extract_multiple> in a list context
+is to split the processed string into as many non-overlapping fields as
+possible, by repeatedly applying each of the specified extractors
+to the remainder of the string. Thus C<extract_multiple> is
+a generalized form of Perl's C<split> subroutine.
+
+The subroutine takes up to four optional arguments:
+
+=over 4
+
+=item 1.
+
+A string to be processed (C<$_> if the string is omitted or C<undef>)
+
+=item 2.
+
+A reference to a list of subroutine references and/or qr// objects and/or
+literal strings and/or hash references, specifying the extractors
+to be used to split the string. If this argument is omitted (or
+C<undef>) the list:
+
+        [
+                sub { extract_variable($_[0], '') },
+                sub { extract_quotelike($_[0],'') },
+                sub { extract_codeblock($_[0],'{}','') },
+        ]
+
+is used.
+
+
+=item 3.
+
+An number specifying the maximum number of fields to return. If this
+argument is omitted (or C<undef>), split continues as long as possible.
+
+If the third argument is I<N>, then extraction continues until I<N> fields
+have been successfully extracted, or until the string has been completely 
+processed.
+
+Note that in scalar and void contexts the value of this argument is 
+automatically reset to 1 (under C<-w>, a warning is issued if the argument 
+has to be reset).
+
+=item 4.
+
+A value indicating whether unmatched substrings (see below) within the
+text should be skipped or returned as fields. If the value is true,
+such substrings are skipped. Otherwise, they are returned.
+
+=back
+
+The extraction process works by applying each extractor in
+sequence to the text string.
+
+If the extractor is a subroutine it is called in a list context and is
+expected to return a list of a single element, namely the extracted
+text. It may optionally also return two further arguments: a string
+representing the text left after extraction (like $' for a pattern
+match), and a string representing any prefix skipped before the
+extraction (like $` in a pattern match). Note that this is designed
+to facilitate the use of other Text::Balanced subroutines with
+C<extract_multiple>. Note too that the value returned by an extractor
+subroutine need not bear any relationship to the corresponding substring
+of the original text (see examples below).
+
+If the extractor is a precompiled regular expression or a string,
+it is matched against the text in a scalar context with a leading
+'\G' and the gc modifiers enabled. The extracted value is either
+$1 if that variable is defined after the match, or else the
+complete match (i.e. $&).
+
+If the extractor is a hash reference, it must contain exactly one element.
+The value of that element is one of the
+above extractor types (subroutine reference, regular expression, or string).
+The key of that element is the name of a class into which the successful
+return value of the extractor will be blessed.
+
+If an extractor returns a defined value, that value is immediately
+treated as the next extracted field and pushed onto the list of fields.
+If the extractor was specified in a hash reference, the field is also
+blessed into the appropriate class, 
+
+If the extractor fails to match (in the case of a regex extractor), or returns an empty list or an undefined value (in the case of a subroutine extractor), it is
+assumed to have failed to extract.
+If none of the extractor subroutines succeeds, then one
+character is extracted from the start of the text and the extraction
+subroutines reapplied. Characters which are thus removed are accumulated and
+eventually become the next field (unless the fourth argument is true, in which
+case they are disgarded).
+
+For example, the following extracts substrings that are valid Perl variables:
+
+        @fields = extract_multiple($text,
+                                   [ sub { extract_variable($_[0]) } ],
+                                   undef, 1);
+
+This example separates a text into fields which are quote delimited,
+curly bracketed, and anything else. The delimited and bracketed
+parts are also blessed to identify them (the "anything else" is unblessed):
+
+        @fields = extract_multiple($text,
+                   [
+                        { Delim => sub { extract_delimited($_[0],q{'"}) } },
+                        { Brack => sub { extract_bracketed($_[0],'{}') } },
+                   ]);
+
+This call extracts the next single substring that is a valid Perl quotelike
+operator (and removes it from $text):
+
+        $quotelike = extract_multiple($text,
+                                      [
+                                        sub { extract_quotelike($_[0]) },
+                                      ], undef, 1);
+
+Finally, here is yet another way to do comma-separated value parsing:
+
+        @fields = extract_multiple($csv_text,
+                                  [
+                                        sub { extract_delimited($_[0],q{'"}) },
+                                        qr/([^,]+)(.*)/,
+                                  ],
+                                  undef,1);
+
+The list in the second argument means:
+I<"Try and extract a ' or " delimited string, otherwise extract anything up to a comma...">.
+The undef third argument means:
+I<"...as many times as possible...">,
+and the true value in the fourth argument means
+I<"...discarding anything else that appears (i.e. the commas)">.
+
+If you wanted the commas preserved as separate fields (i.e. like split
+does if your split pattern has capturing parentheses), you would
+just make the last parameter undefined (or remove it).
+
+
+=head2 C<gen_delimited_pat>
+
+The C<gen_delimited_pat> subroutine takes a single (string) argument and
+   > builds a Friedl-style optimized regex that matches a string delimited
+by any one of the characters in the single argument. For example:
+
+        gen_delimited_pat(q{'"})
+
+returns the regex:
+
+        (?:\"(?:\\\"|(?!\").)*\"|\'(?:\\\'|(?!\').)*\')
+
+Note that the specified delimiters are automatically quotemeta'd.
+
+A typical use of C<gen_delimited_pat> would be to build special purpose tags
+for C<extract_tagged>. For example, to properly ignore "empty" XML elements
+(which might contain quoted strings):
+
+        my $empty_tag = '<(' . gen_delimited_pat(q{'"}) . '|.)+/>';
+
+        extract_tagged($text, undef, undef, undef, {ignore => [$empty_tag]} );
+
+
+C<gen_delimited_pat> may also be called with an optional second argument,
+which specifies the "escape" character(s) to be used for each delimiter.
+For example to match a Pascal-style string (where ' is the delimiter
+and '' is a literal ' within the string):
+
+        gen_delimited_pat(q{'},q{'});
+
+Different escape characters can be specified for different delimiters.
+For example, to specify that '/' is the escape for single quotes
+and '%' is the escape for double quotes:
+
+        gen_delimited_pat(q{'"},q{/%});
+
+If more delimiters than escape chars are specified, the last escape char
+is used for the remaining delimiters.
+If no escape char is specified for a given specified delimiter, '\' is used.
+
+Note that 
+C<gen_delimited_pat> was previously called
+C<delimited_pat>. That name may still be used, but is now deprecated.
+        
+
+=head1 DIAGNOSTICS
+
+In a list context, all the functions return C<(undef,$original_text)>
+on failure. In a scalar context, failure is indicated by returning C<undef>
+(in this case the input text is not modified in any way).
+
+In addition, on failure in I<any> context, the C<$@> variable is set.
+Accessing C<$@-E<gt>{error}> returns one of the error diagnostics listed
+below.
+Accessing C<$@-E<gt>{pos}> returns the offset into the original string at
+which the error was detected (although not necessarily where it occurred!)
+Printing C<$@> directly produces the error message, with the offset appended.
+On success, the C<$@> variable is guaranteed to be C<undef>.
+
+The available diagnostics are:
+
+=over 4
+
+=item  C<Did not find a suitable bracket: "%s">
+
+The delimiter provided to C<extract_bracketed> was not one of
+C<'()[]E<lt>E<gt>{}'>.
+
+=item  C<Did not find prefix: /%s/>
+
+A non-optional prefix was specified but wasn't found at the start of the text.
+
+=item  C<Did not find opening bracket after prefix: "%s">
+
+C<extract_bracketed> or C<extract_codeblock> was expecting a
+particular kind of bracket at the start of the text, and didn't find it.
+
+=item  C<No quotelike operator found after prefix: "%s">
+
+C<extract_quotelike> didn't find one of the quotelike operators C<q>,
+C<qq>, C<qw>, C<qx>, C<s>, C<tr> or C<y> at the start of the substring
+it was extracting.
+
+=item  C<Unmatched closing bracket: "%c">
+
+C<extract_bracketed>, C<extract_quotelike> or C<extract_codeblock> encountered
+a closing bracket where none was expected.
+
+=item  C<Unmatched opening bracket(s): "%s">
+
+C<extract_bracketed>, C<extract_quotelike> or C<extract_codeblock> ran 
+out of characters in the text before closing one or more levels of nested
+brackets.
+
+=item C<Unmatched embedded quote (%s)>
+
+C<extract_bracketed> attempted to match an embedded quoted substring, but
+failed to find a closing quote to match it.
+
+=item C<Did not find closing delimiter to match '%s'>
+
+C<extract_quotelike> was unable to find a closing delimiter to match the
+one that opened the quote-like operation.
+
+=item  C<Mismatched closing bracket: expected "%c" but found "%s">
+
+C<extract_bracketed>, C<extract_quotelike> or C<extract_codeblock> found
+a valid bracket delimiter, but it was the wrong species. This usually
+indicates a nesting error, but may indicate incorrect quoting or escaping.
+
+=item  C<No block delimiter found after quotelike "%s">
+
+C<extract_quotelike> or C<extract_codeblock> found one of the
+quotelike operators C<q>, C<qq>, C<qw>, C<qx>, C<s>, C<tr> or C<y>
+without a suitable block after it.
+
+=item C<Did not find leading dereferencer>
+
+C<extract_variable> was expecting one of '$', '@', or '%' at the start of
+a variable, but didn't find any of them.
+
+=item C<Bad identifier after dereferencer>
+
+C<extract_variable> found a '$', '@', or '%' indicating a variable, but that
+character was not followed by a legal Perl identifier.
+
+=item C<Did not find expected opening bracket at %s>
+
+C<extract_codeblock> failed to find any of the outermost opening brackets
+that were specified.
+
+=item C<Improperly nested codeblock at %s>
+
+A nested code block was found that started with a delimiter that was specified
+as being only to be used as an outermost bracket.
+
+=item  C<Missing second block for quotelike "%s">
+
+C<extract_codeblock> or C<extract_quotelike> found one of the
+quotelike operators C<s>, C<tr> or C<y> followed by only one block.
+
+=item C<No match found for opening bracket>
+
+C<extract_codeblock> failed to find a closing bracket to match the outermost
+opening bracket.
+
+=item C<Did not find opening tag: /%s/>
+
+C<extract_tagged> did not find a suitable opening tag (after any specified
+prefix was removed).
+
+=item C<Unable to construct closing tag to match: /%s/>
+
+C<extract_tagged> matched the specified opening tag and tried to
+modify the matched text to produce a matching closing tag (because
+none was specified). It failed to generate the closing tag, almost
+certainly because the opening tag did not start with a
+bracket of some kind.
+
+=item C<Found invalid nested tag: %s>
+
+C<extract_tagged> found a nested tag that appeared in the "reject" list
+(and the failure mode was not "MAX" or "PARA").
+
+=item C<Found unbalanced nested tag: %s>
+
+C<extract_tagged> found a nested opening tag that was not matched by a
+corresponding nested closing tag (and the failure mode was not "MAX" or "PARA").
+
+=item C<Did not find closing tag>
+
+C<extract_tagged> reached the end of the text without finding a closing tag
+to match the original opening tag (and the failure mode was not
+"MAX" or "PARA").
+
+
+
+
+=back
+
+
+=head1 AUTHOR
+
+Damian Conway (damian@conway.org)
+
+
+=head1 BUGS AND IRRITATIONS
+
+There are undoubtedly serious bugs lurking somewhere in this code, if
+only because parts of it give the impression of understanding a great deal
+more about Perl than they really do. 
+
+Bug reports and other feedback are most welcome.
+
+
+=head1 COPYRIGHT
+
+ Copyright (c) 1997-2001, Damian Conway. All Rights Reserved.
+ This module is free software. It may be used, redistributed
+     and/or modified under the same terms as Perl itself.
Index: /for-distributions/trunk/bin/windows/perl/lib/Text/ParseWords.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Text/ParseWords.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Text/ParseWords.pm	(revision 14489)
@@ -0,0 +1,263 @@
+package Text::ParseWords;
+
+use vars qw($VERSION @ISA @EXPORT $PERL_SINGLE_QUOTE);
+$VERSION = "3.24";
+
+require 5.000;
+
+use Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(shellwords quotewords nested_quotewords parse_line);
+@EXPORT_OK = qw(old_shellwords);
+
+
+sub shellwords {
+    my(@lines) = @_;
+    $lines[$#lines] =~ s/\s+$//;
+    return(quotewords('\s+', 0, @lines));
+}
+
+
+
+sub quotewords {
+    my($delim, $keep, @lines) = @_;
+    my($line, @words, @allwords);
+
+    foreach $line (@lines) {
+	@words = parse_line($delim, $keep, $line);
+	return() unless (@words || !length($line));
+	push(@allwords, @words);
+    }
+    return(@allwords);
+}
+
+
+
+sub nested_quotewords {
+    my($delim, $keep, @lines) = @_;
+    my($i, @allwords);
+
+    for ($i = 0; $i < @lines; $i++) {
+	@{$allwords[$i]} = parse_line($delim, $keep, $lines[$i]);
+	return() unless (@{$allwords[$i]} || !length($lines[$i]));
+    }
+    return(@allwords);
+}
+
+
+
+sub parse_line {
+    my($delimiter, $keep, $line) = @_;
+    my($word, @pieces);
+
+    no warnings 'uninitialized';	# we will be testing undef strings
+
+    while (length($line)) {
+	$line =~ s/^(["'])			# a $quote
+        	    ((?:\\.|(?!\1)[^\\])*)	# and $quoted text
+		    \1				# followed by the same quote
+		   |				# --OR--
+		   ^((?:\\.|[^\\"'])*?)		# an $unquoted text
+		    (\Z(?!\n)|(?-x:$delimiter)|(?!^)(?=["']))  
+		    				# plus EOL, delimiter, or quote
+		  //xs or return;		# extended layout
+	my($quote, $quoted, $unquoted, $delim) = ($1, $2, $3, $4);
+	return() unless( defined($quote) || length($unquoted) || length($delim));
+
+        if ($keep) {
+	    $quoted = "$quote$quoted$quote";
+	}
+        else {
+	    $unquoted =~ s/\\(.)/$1/sg;
+	    if (defined $quote) {
+		$quoted =~ s/\\(.)/$1/sg if ($quote eq '"');
+		$quoted =~ s/\\([\\'])/$1/g if ( $PERL_SINGLE_QUOTE && $quote eq "'");
+            }
+	}
+        $word .= substr($line, 0, 0);	# leave results tainted
+        $word .= defined $quote ? $quoted : $unquoted;
+ 
+        if (length($delim)) {
+            push(@pieces, $word);
+            push(@pieces, $delim) if ($keep eq 'delimiters');
+            undef $word;
+        }
+        if (!length($line)) {
+            push(@pieces, $word);
+	}
+    }
+    return(@pieces);
+}
+
+
+
+sub old_shellwords {
+
+    # Usage:
+    #	use ParseWords;
+    #	@words = old_shellwords($line);
+    #	or
+    #	@words = old_shellwords(@lines);
+    #	or
+    #	@words = old_shellwords();	# defaults to $_ (and clobbers it)
+
+    no warnings 'uninitialized';	# we will be testing undef strings
+    local *_ = \join('', @_) if @_;
+    my (@words, $snippet);
+
+    s/\A\s+//;
+    while ($_ ne '') {
+	my $field = substr($_, 0, 0);	# leave results tainted
+	for (;;) {
+	    if (s/\A"(([^"\\]|\\.)*)"//s) {
+		($snippet = $1) =~ s#\\(.)#$1#sg;
+	    }
+	    elsif (/\A"/) {
+		require Carp;
+		Carp::carp("Unmatched double quote: $_");
+		return();
+	    }
+	    elsif (s/\A'(([^'\\]|\\.)*)'//s) {
+		($snippet = $1) =~ s#\\(.)#$1#sg;
+	    }
+	    elsif (/\A'/) {
+		require Carp;
+		Carp::carp("Unmatched single quote: $_");
+		return();
+	    }
+	    elsif (s/\A\\(.)//s) {
+		$snippet = $1;
+	    }
+	    elsif (s/\A([^\s\\'"]+)//) {
+		$snippet = $1;
+	    }
+	    else {
+		s/\A\s+//;
+		last;
+	    }
+	    $field .= $snippet;
+	}
+	push(@words, $field);
+    }
+    return @words;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Text::ParseWords - parse text into an array of tokens or array of arrays
+
+=head1 SYNOPSIS
+
+  use Text::ParseWords;
+  @lists = &nested_quotewords($delim, $keep, @lines);
+  @words = &quotewords($delim, $keep, @lines);
+  @words = &shellwords(@lines);
+  @words = &parse_line($delim, $keep, $line);
+  @words = &old_shellwords(@lines); # DEPRECATED!
+
+=head1 DESCRIPTION
+
+The &nested_quotewords() and &quotewords() functions accept a delimiter 
+(which can be a regular expression)
+and a list of lines and then breaks those lines up into a list of
+words ignoring delimiters that appear inside quotes.  &quotewords()
+returns all of the tokens in a single long list, while &nested_quotewords()
+returns a list of token lists corresponding to the elements of @lines.
+&parse_line() does tokenizing on a single string.  The &*quotewords()
+functions simply call &parse_line(), so if you're only splitting
+one line you can call &parse_line() directly and save a function
+call.
+
+The $keep argument is a boolean flag.  If true, then the tokens are
+split on the specified delimiter, but all other characters (quotes,
+backslashes, etc.) are kept in the tokens.  If $keep is false then the
+&*quotewords() functions remove all quotes and backslashes that are
+not themselves backslash-escaped or inside of single quotes (i.e.,
+&quotewords() tries to interpret these characters just like the Bourne
+shell).  NB: these semantics are significantly different from the
+original version of this module shipped with Perl 5.000 through 5.004.
+As an additional feature, $keep may be the keyword "delimiters" which
+causes the functions to preserve the delimiters in each string as
+tokens in the token lists, in addition to preserving quote and
+backslash characters.
+
+&shellwords() is written as a special case of &quotewords(), and it
+does token parsing with whitespace as a delimiter-- similar to most
+Unix shells.
+
+=head1 EXAMPLES
+
+The sample program:
+
+  use Text::ParseWords;
+  @words = &quotewords('\s+', 0, q{this   is "a test" of\ quotewords \"for you});
+  $i = 0;
+  foreach (@words) {
+      print "$i: <$_>\n";
+      $i++;
+  }
+
+produces:
+
+  0: <this>
+  1: <is>
+  2: <a test>
+  3: <of quotewords>
+  4: <"for>
+  5: <you>
+
+demonstrating:
+
+=over 4
+
+=item 0
+
+a simple word
+
+=item 1
+
+multiple spaces are skipped because of our $delim
+
+=item 2
+
+use of quotes to include a space in a word
+
+=item 3
+
+use of a backslash to include a space in a word
+
+=item 4
+
+use of a backslash to remove the special meaning of a double-quote
+
+=item 5
+
+another simple word (note the lack of effect of the
+backslashed double-quote)
+
+=back
+
+Replacing C<&quotewords('\s+', 0, q{this   is...})>
+with C<&shellwords(q{this   is...})>
+is a simpler way to accomplish the same thing.
+
+=head1 AUTHORS
+
+Maintainer is Hal Pomeranz <pomeranz@netcom.com>, 1994-1997 (Original
+author unknown).  Much of the code for &parse_line() (including the
+primary regexp) from Joerk Behrends <jbehrends@multimediaproduzenten.de>.
+
+Examples section another documentation provided by John Heidemann 
+<johnh@ISI.EDU>
+
+Bug reports, patches, and nagging provided by lots of folks-- thanks
+everybody!  Special thanks to Michael Schwern <schwern@envirolink.org>
+for assuring me that a &nested_quotewords() would be useful, and to 
+Jeff Friedl <jfriedl@yahoo-inc.com> for telling me not to worry about
+error-checking (sort of-- you had to be there).
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Text/Soundex.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Text/Soundex.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Text/Soundex.pm	(revision 14489)
@@ -0,0 +1,150 @@
+package Text::Soundex;
+require 5.000;
+require Exporter;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(&soundex $soundex_nocode);
+
+$VERSION = '1.01';
+
+# $Id: soundex.pl,v 1.2 1994/03/24 00:30:27 mike Exp $
+#
+# Implementation of soundex algorithm as described by Knuth in volume
+# 3 of The Art of Computer Programming, with ideas stolen from Ian
+# Phillipps <ian@pipex.net>.
+#
+# Mike Stok <Mike.Stok@meiko.concord.ma.us>, 2 March 1994.
+#
+# Knuth's test cases are:
+# 
+# Euler, Ellery -> E460
+# Gauss, Ghosh -> G200
+# Hilbert, Heilbronn -> H416
+# Knuth, Kant -> K530
+# Lloyd, Ladd -> L300
+# Lukasiewicz, Lissajous -> L222
+#
+# $Log: soundex.pl,v $
+# Revision 1.2  1994/03/24  00:30:27  mike
+# Subtle bug (any excuse :-) spotted by Rich Pinder <rpinder@hsc.usc.edu>
+# in the way I handles leasing characters which were different but had
+# the same soundex code.  This showed up comparing it with Oracle's
+# soundex output.
+#
+# Revision 1.1  1994/03/02  13:01:30  mike
+# Initial revision
+#
+#
+##############################################################################
+
+# $soundex_nocode is used to indicate a string doesn't have a soundex
+# code, I like undef other people may want to set it to 'Z000'.
+
+$soundex_nocode = undef;
+
+sub soundex
+{
+  local (@s, $f, $fc, $_) = @_;
+
+  push @s, '' unless @s;	# handle no args as a single empty string
+
+  foreach (@s)
+  {
+    $_ = uc $_;
+    tr/A-Z//cd;
+
+    if ($_ eq '')
+    {
+      $_ = $soundex_nocode;
+    }
+    else
+    {
+      ($f) = /^(.)/;
+      tr/AEHIOUWYBFPVCGJKQSXZDTLMNR/00000000111122222222334556/;
+      ($fc) = /^(.)/;
+      s/^$fc+//;
+      tr///cs;
+      tr/0//d;
+      $_ = $f . $_ . '000';
+      s/^(.{4}).*/$1/;
+    }
+  }
+
+  wantarray ? @s : shift @s;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Text::Soundex - Implementation of the Soundex Algorithm as Described by Knuth
+
+=head1 SYNOPSIS
+
+  use Text::Soundex;
+
+  $code = soundex $string;            # get soundex code for a string
+  @codes = soundex @list;             # get list of codes for list of strings
+
+  # set value to be returned for strings without soundex code
+
+  $soundex_nocode = 'Z000';
+
+=head1 DESCRIPTION
+
+This module implements the soundex algorithm as described by Donald Knuth
+in Volume 3 of B<The Art of Computer Programming>.  The algorithm is
+intended to hash words (in particular surnames) into a small space using a
+simple model which approximates the sound of the word when spoken by an English
+speaker.  Each word is reduced to a four character string, the first
+character being an upper case letter and the remaining three being digits.
+
+If there is no soundex code representation for a string then the value of
+C<$soundex_nocode> is returned.  This is initially set to C<undef>, but
+many people seem to prefer an I<unlikely> value like C<Z000>
+(how unlikely this is depends on the data set being dealt with.)  Any value
+can be assigned to C<$soundex_nocode>.
+
+In scalar context C<soundex> returns the soundex code of its first
+argument, and in list context a list is returned in which each element is the 
+soundex code for the corresponding argument passed to C<soundex> e.g.
+
+  @codes = soundex qw(Mike Stok);
+
+leaves C<@codes> containing C<('M200', 'S320')>.
+
+=head1 EXAMPLES
+
+Knuth's examples of various names and the soundex codes they map to
+are listed below:
+
+  Euler, Ellery -> E460
+  Gauss, Ghosh -> G200
+  Hilbert, Heilbronn -> H416
+  Knuth, Kant -> K530
+  Lloyd, Ladd -> L300
+  Lukasiewicz, Lissajous -> L222
+
+so:
+
+  $code = soundex 'Knuth';              # $code contains 'K530'
+  @list = soundex qw(Lloyd Gauss);	# @list contains 'L300', 'G200'
+
+=head1 LIMITATIONS
+
+As the soundex algorithm was originally used a B<long> time ago in the US
+it considers only the English alphabet and pronunciation.
+
+As it is mapping a large space (arbitrary length strings) onto a small
+space (single letter plus 3 digits) no inference can be made about the
+similarity of two strings which end up with the same soundex code.  For 
+example, both C<Hilbert> and C<Heilbronn> end up with a soundex code
+of C<H416>.
+
+=head1 AUTHOR
+
+This code was implemented by Mike Stok (C<stok@cybercom.net>) from the 
+description given by Knuth.  Ian Phillipps (C<ian@pipex.net>) and Rich Pinder 
+(C<rpinder@hsc.usc.edu>) supplied ideas and spotted mistakes.
Index: /for-distributions/trunk/bin/windows/perl/lib/Text/Tabs.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Text/Tabs.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Text/Tabs.pm	(revision 14489)
@@ -0,0 +1,121 @@
+
+package Text::Tabs;
+
+require Exporter;
+
+@ISA = (Exporter);
+@EXPORT = qw(expand unexpand $tabstop);
+
+use vars qw($VERSION $tabstop $debug);
+$VERSION = 2005.0824;
+
+use strict;
+
+BEGIN	{
+	$tabstop = 8;
+	$debug = 0;
+}
+
+sub expand {
+	my @l;
+	my $pad;
+	for ( @_ ) {
+		my $s = '';
+		for (split(/^/m, $_, -1)) {
+			my $offs = 0;
+			s{\t}{
+				$pad = $tabstop - (pos() + $offs) % $tabstop;
+				$offs += $pad - 1;
+				" " x $pad;
+			}eg;
+			$s .= $_;
+		}
+		push(@l, $s);
+	}
+	return @l if wantarray;
+	return $l[0];
+}
+
+sub unexpand
+{
+	my (@l) = @_;
+	my @e;
+	my $x;
+	my $line;
+	my @lines;
+	my $lastbit;
+	for $x (@l) {
+		@lines = split("\n", $x, -1);
+		for $line (@lines) {
+			$line = expand($line);
+			@e = split(/(.{$tabstop})/,$line,-1);
+			$lastbit = pop(@e);
+			$lastbit = '' unless defined $lastbit;
+			$lastbit = "\t"
+				if $lastbit eq " "x$tabstop;
+			for $_ (@e) {
+				if ($debug) {
+					my $x = $_;
+					$x =~ s/\t/^I\t/gs;
+					print "sub on '$x'\n";
+				}
+				s/  +$/\t/;
+			}
+			$line = join('',@e, $lastbit);
+		}
+		$x = join("\n", @lines);
+	}
+	return @l if wantarray;
+	return $l[0];
+}
+
+1;
+__END__
+
+sub expand
+{
+	my (@l) = @_;
+	for $_ (@l) {
+		1 while s/(^|\n)([^\t\n]*)(\t+)/
+			$1. $2 . (" " x 
+				($tabstop * length($3)
+				- (length($2) % $tabstop)))
+			/sex;
+	}
+	return @l if wantarray;
+	return $l[0];
+}
+
+
+=head1 NAME
+
+Text::Tabs -- expand and unexpand tabs per the unix expand(1) and unexpand(1)
+
+=head1 SYNOPSIS
+
+  use Text::Tabs;
+
+  $tabstop = 4;
+  @lines_without_tabs = expand(@lines_with_tabs);
+  @lines_with_tabs = unexpand(@lines_without_tabs);
+
+=head1 DESCRIPTION
+
+Text::Tabs does about what the unix utilities expand(1) and unexpand(1)
+do.  Given a line with tabs in it, expand will replace the tabs with
+the appropriate number of spaces.  Given a line with or without tabs in
+it, unexpand will add tabs when it can save bytes by doing so.  Invisible
+compression with plain ascii!
+
+=head1 BUGS
+
+expand doesn't handle newlines very quickly -- do not feed it an
+entire document in one string.  Instead feed it an array of lines.
+
+=head1 LICENSE
+
+Copyright (C) 1996-2002,2005 David Muir Sharnoff.  
+Copyright (C) 2005 Aristotle Pagaltzis 
+This module may be modified, used, copied, and redistributed at your own risk.
+Publicly redistributed modified versions must use a different name.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Text/Wrap.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Text/Wrap.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Text/Wrap.pm	(revision 14489)
@@ -0,0 +1,223 @@
+package Text::Wrap;
+
+require Exporter;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(wrap fill);
+@EXPORT_OK = qw($columns $break $huge);
+
+$VERSION = 2005.0824_01;
+
+use vars qw($VERSION $columns $debug $break $huge $unexpand $tabstop
+	$separator $separator2);
+use strict;
+
+BEGIN	{
+	$columns = 76;  # <= screen width
+	$debug = 0;
+	$break = '\s';
+	$huge = 'wrap'; # alternatively: 'die' or 'overflow'
+	$unexpand = 1;
+	$tabstop = 8;
+	$separator = "\n";
+	$separator2 = undef;
+}
+
+use Text::Tabs qw(expand unexpand);
+
+sub wrap
+{
+	my ($ip, $xp, @t) = @_;
+
+	local($Text::Tabs::tabstop) = $tabstop;
+	my $r = "";
+	my $tail = pop(@t);
+	my $t = expand(join("", (map { /\s+\z/ ? ( $_ ) : ($_, ' ') } @t), $tail));
+	my $lead = $ip;
+	my $ll = $columns - length(expand($ip)) - 1;
+	$ll = 0 if $ll < 0;
+	my $nll = $columns - length(expand($xp)) - 1;
+	my $nl = "";
+	my $remainder = "";
+
+	use re 'taint';
+
+	pos($t) = 0;
+	while ($t !~ /\G\s*\Z/gc) {
+		if ($t =~ /\G([^\n]{0,$ll})($break|\n*\z)/xmgc) {
+			$r .= $unexpand 
+				? unexpand($nl . $lead . $1)
+				: $nl . $lead . $1;
+			$remainder = $2;
+		} elsif ($huge eq 'wrap' && $t =~ /\G([^\n]{$ll})/gc) {
+			$r .= $unexpand 
+				? unexpand($nl . $lead . $1)
+				: $nl . $lead . $1;
+			$remainder = defined($separator2) ? $separator2 : $separator;
+		} elsif ($huge eq 'overflow' && $t =~ /\G([^\n]*?)($break|\z)/xmgc) {
+			$r .= $unexpand 
+				? unexpand($nl . $lead . $1)
+				: $nl . $lead . $1;
+			$remainder = $2;
+		} elsif ($huge eq 'die') {
+			die "couldn't wrap '$t'";
+		} else {
+			die "This shouldn't happen";
+		}
+			
+		$lead = $xp;
+		$ll = $nll;
+		$nl = defined($separator2)
+			? ($remainder eq "\n"
+				? "\n"
+				: $separator2)
+			: $separator;
+	}
+	$r .= $remainder;
+
+	print "-----------$r---------\n" if $debug;
+
+	print "Finish up with '$lead'\n" if $debug;
+
+	$r .= $lead . substr($t, pos($t), length($t)-pos($t))
+		if pos($t) ne length($t);
+
+	print "-----------$r---------\n" if $debug;;
+
+	return $r;
+}
+
+sub fill 
+{
+	my ($ip, $xp, @raw) = @_;
+	my @para;
+	my $pp;
+
+	for $pp (split(/\n\s+/, join("\n",@raw))) {
+		$pp =~ s/\s+/ /g;
+		my $x = wrap($ip, $xp, $pp);
+		push(@para, $x);
+	}
+
+	# if paragraph_indent is the same as line_indent, 
+	# separate paragraphs with blank lines
+
+	my $ps = ($ip eq $xp) ? "\n\n" : "\n";
+	return join ($ps, @para);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Text::Wrap - line wrapping to form simple paragraphs
+
+=head1 SYNOPSIS 
+
+B<Example 1>
+
+	use Text::Wrap
+
+	$initial_tab = "\t";	# Tab before first line
+	$subsequent_tab = "";	# All other lines flush left
+
+	print wrap($initial_tab, $subsequent_tab, @text);
+	print fill($initial_tab, $subsequent_tab, @text);
+
+	$lines = wrap($initial_tab, $subsequent_tab, @text);
+
+	@paragraphs = fill($initial_tab, $subsequent_tab, @text);
+
+B<Example 2>
+
+	use Text::Wrap qw(wrap $columns $huge);
+
+	$columns = 132;		# Wrap at 132 characters
+	$huge = 'die';
+	$huge = 'wrap';
+	$huge = 'overflow';
+
+B<Example 3>
+
+	use Text::Wrap
+
+	$Text::Wrap::columns = 72;
+	print wrap('', '', @text);
+
+=head1 DESCRIPTION
+
+C<Text::Wrap::wrap()> is a very simple paragraph formatter.  It formats a
+single paragraph at a time by breaking lines at word boundries.
+Indentation is controlled for the first line (C<$initial_tab>) and
+all subsequent lines (C<$subsequent_tab>) independently.  Please note: 
+C<$initial_tab> and C<$subsequent_tab> are the literal strings that will
+be used: it is unlikley you would want to pass in a number.
+
+Text::Wrap::fill() is a simple multi-paragraph formatter.  It formats
+each paragraph separately and then joins them together when it's done.  It
+will destroy any whitespace in the original text.  It breaks text into
+paragraphs by looking for whitespace after a newline.  In other respects
+it acts like wrap().
+
+=head1 OVERRIDES
+
+C<Text::Wrap::wrap()> has a number of variables that control its behavior.
+Because other modules might be using C<Text::Wrap::wrap()> it is suggested
+that you leave these variables alone!  If you can't do that, then 
+use C<local($Text::Wrap::VARIABLE) = YOURVALUE> when you change the
+values so that the original value is restored.  This C<local()> trick
+will not work if you import the variable into your own namespace.
+
+Lines are wrapped at C<$Text::Wrap::columns> columns.  C<$Text::Wrap::columns>
+should be set to the full width of your output device.  In fact,
+every resulting line will have length of no more than C<$columns - 1>.  
+
+It is possible to control which characters terminate words by
+modifying C<$Text::Wrap::break>. Set this to a string such as
+C<'[\s:]'> (to break before spaces or colons) or a pre-compiled regexp
+such as C<qr/[\s']/> (to break before spaces or apostrophes). The
+default is simply C<'\s'>; that is, words are terminated by spaces.
+(This means, among other things, that trailing punctuation  such as
+full stops or commas stay with the word they are "attached" to.)
+
+Beginner note: In example 2, above C<$columns> is imported into
+the local namespace, and set locally.  In example 3,
+C<$Text::Wrap::columns> is set in its own namespace without importing it.
+
+C<Text::Wrap::wrap()> starts its work by expanding all the tabs in its
+input into spaces.  The last thing it does it to turn spaces back
+into tabs.  If you do not want tabs in your results, set 
+C<$Text::Wrap::unexpand> to a false value.  Likewise if you do not
+want to use 8-character tabstops, set C<$Text::Wrap::tabstop> to
+the number of characters you do want for your tabstops.
+
+If you want to separate your lines with something other than C<\n>
+then set C<$Text::Wrap::separator> to your preference.  This replaces
+all newlines with C<$Text::Wrap::separator>.  If you just to preserve
+existing newlines but add new breaks with something else, set 
+C<$Text::Wrap::separator2> instead.
+
+When words that are longer than C<$columns> are encountered, they
+are broken up.  C<wrap()> adds a C<"\n"> at column C<$columns>.
+This behavior can be overridden by setting C<$huge> to
+'die' or to 'overflow'.  When set to 'die', large words will cause
+C<die()> to be called.  When set to 'overflow', large words will be
+left intact.  
+
+Historical notes: 'die' used to be the default value of
+C<$huge>.  Now, 'wrap' is the default value.
+
+=head1 EXAMPLE
+
+	print wrap("\t","","This is a bit of text that forms 
+		a normal book-style paragraph");
+
+=head1 LICENSE
+
+David Muir Sharnoff <muir@idiom.com> with help from Tim Pierce and
+many many others.  Copyright (C) 1996-2002 David Muir Sharnoff.  
+This module may be modified, used, copied, and redistributed at
+your own risk.  Publicly redistributed modified versions must use 
+a different name.
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Thread.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Thread.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Thread.pm	(revision 14489)
@@ -0,0 +1,337 @@
+package Thread;
+
+use strict;
+
+our($VERSION, $ithreads, $othreads);
+
+BEGIN {
+    $VERSION = '2.00';
+    use Config;
+    $ithreads = $Config{useithreads};
+    $othreads = $Config{use5005threads};
+}
+
+require Exporter;
+use XSLoader ();
+our(@ISA, @EXPORT, @EXPORT_OK);
+
+@ISA = qw(Exporter);
+
+BEGIN {
+    if ($ithreads) {
+	@EXPORT = qw(cond_wait cond_broadcast cond_signal)
+    } elsif ($othreads) {
+	@EXPORT_OK = qw(cond_signal cond_broadcast cond_wait);
+    }
+    push @EXPORT_OK, qw(async yield);
+}
+
+=head1 NAME
+
+Thread - manipulate threads in Perl (for old code only)
+
+=head1 CAVEAT
+
+Perl has two thread models.
+
+In Perl 5.005 the thread model was that all data is implicitly shared
+and shared access to data has to be explicitly synchronized.
+This model is called "5005threads".
+
+In Perl 5.6 a new model was introduced in which all is was thread
+local and shared access to data has to be explicitly declared.
+This model is called "ithreads", for "interpreter threads".
+
+In Perl 5.6 the ithreads model was not available as a public API,
+only as an internal API that was available for extension writers,
+and to implement fork() emulation on Win32 platforms.
+
+In Perl 5.8 the ithreads model became available through the C<threads>
+module.
+
+Neither model is configured by default into Perl (except, as mentioned
+above, in Win32 ithreads are always available.)  You can see your
+Perl's threading configuration by running C<perl -V> and looking for
+the I<use...threads> variables, or inside script by C<use Config;>
+and testing for C<$Config{use5005threads}> and C<$Config{useithreads}>.
+
+For old code and interim backwards compatibility, the Thread module
+has been reworked to function as a frontend for both 5005threads and
+ithreads.
+
+Note that the compatibility is not complete: because the data sharing
+models are directly opposed, anything to do with data sharing has to
+be thought differently.  With the ithreads you must explicitly share()
+variables between the threads.
+
+For new code the use of the C<Thread> module is discouraged and
+the direct use of the C<threads> and C<threads::shared> modules
+is encouraged instead.
+
+Finally, note that there are many known serious problems with the
+5005threads, one of the least of which is that regular expression
+match variables like $1 are not threadsafe, that is, they easily get
+corrupted by competing threads.  Other problems include more insidious
+data corruption and mysterious crashes.  You are seriously urged to
+use ithreads instead.
+
+=head1 SYNOPSIS
+
+    use Thread;
+
+    my $t = Thread->new(\&start_sub, @start_args);
+
+    $result = $t->join;
+    $result = $t->eval;
+    $t->detach;
+
+    if ($t->done) {
+        $t->join;
+    }
+
+    if($t->equal($another_thread)) {
+    	# ...
+    }
+
+    yield();
+
+    my $tid = Thread->self->tid; 
+
+    lock($scalar);
+    lock(@array);
+    lock(%hash);
+
+    lock(\&sub);	# not available with ithreads
+
+    $flags = $t->flags;	# not available with ithreads
+
+    my @list = Thread->list;	# not available with ithreads
+
+    use Thread 'async';
+
+=head1 DESCRIPTION
+
+The C<Thread> module provides multithreading support for perl.
+
+=head1 FUNCTIONS
+
+=over 8
+
+=item $thread = Thread->new(\&start_sub)
+
+=item $thread = Thread->new(\&start_sub, LIST)
+
+C<new> starts a new thread of execution in the referenced subroutine. The
+optional list is passed as parameters to the subroutine. Execution
+continues in both the subroutine and the code after the C<new> call.
+
+C<Thread-&gt;new> returns a thread object representing the newly created
+thread.
+
+=item lock VARIABLE
+
+C<lock> places a lock on a variable until the lock goes out of scope.
+
+If the variable is locked by another thread, the C<lock> call will
+block until it's available.  C<lock> is recursive, so multiple calls
+to C<lock> are safe--the variable will remain locked until the
+outermost lock on the variable goes out of scope.
+
+Locks on variables only affect C<lock> calls--they do I<not> affect normal
+access to a variable. (Locks on subs are different, and covered in a bit.)
+If you really, I<really> want locks to block access, then go ahead and tie
+them to something and manage this yourself.  This is done on purpose.
+While managing access to variables is a good thing, Perl doesn't force
+you out of its living room...
+
+If a container object, such as a hash or array, is locked, all the
+elements of that container are not locked. For example, if a thread
+does a C<lock @a>, any other thread doing a C<lock($a[12])> won't
+block.
+
+With 5005threads you may also C<lock> a sub, using C<lock &sub>.
+Any calls to that sub from another thread will block until the lock
+is released. This behaviour is not equivalent to declaring the sub
+with the C<locked> attribute.  The C<locked> attribute serializes
+access to a subroutine, but allows different threads non-simultaneous
+access. C<lock &sub>, on the other hand, will not allow I<any> other
+thread access for the duration of the lock.
+
+Finally, C<lock> will traverse up references exactly I<one> level.
+C<lock(\$a)> is equivalent to C<lock($a)>, while C<lock(\\$a)> is not.
+
+=item async BLOCK;
+
+C<async> creates a thread to execute the block immediately following
+it.  This block is treated as an anonymous sub, and so must have a
+semi-colon after the closing brace. Like C<Thread-&gt;new>, C<async>
+returns a thread object.
+
+=item Thread->self
+
+The C<Thread-E<gt>self> function returns a thread object that represents
+the thread making the C<Thread-E<gt>self> call.
+
+=item cond_wait VARIABLE
+
+The C<cond_wait> function takes a B<locked> variable as
+a parameter, unlocks the variable, and blocks until another thread
+does a C<cond_signal> or C<cond_broadcast> for that same locked
+variable. The variable that C<cond_wait> blocked on is relocked
+after the C<cond_wait> is satisfied.  If there are multiple threads
+C<cond_wait>ing on the same variable, all but one will reblock waiting
+to reaquire the lock on the variable.  (So if you're only using
+C<cond_wait> for synchronization, give up the lock as soon as
+possible.)
+
+=item cond_signal VARIABLE
+
+The C<cond_signal> function takes a locked variable as a parameter and
+unblocks one thread that's C<cond_wait>ing on that variable. If more than
+one thread is blocked in a C<cond_wait> on that variable, only one (and
+which one is indeterminate) will be unblocked.
+
+If there are no threads blocked in a C<cond_wait> on the variable,
+the signal is discarded.
+
+=item cond_broadcast VARIABLE
+
+The C<cond_broadcast> function works similarly to C<cond_signal>.
+C<cond_broadcast>, though, will unblock B<all> the threads that are
+blocked in a C<cond_wait> on the locked variable, rather than only
+one.
+
+=item yield
+
+The C<yield> function allows another thread to take control of the
+CPU. The exact results are implementation-dependent.
+
+=back
+
+=head1 METHODS
+
+=over 8
+
+=item join
+
+C<join> waits for a thread to end and returns any values the thread
+exited with.  C<join> will block until the thread has ended, though
+it won't block if the thread has already terminated.
+
+If the thread being C<join>ed C<die>d, the error it died with will
+be returned at this time. If you don't want the thread performing
+the C<join> to die as well, you should either wrap the C<join> in
+an C<eval> or use the C<eval> thread method instead of C<join>.
+
+=item eval
+
+The C<eval> method wraps an C<eval> around a C<join>, and so waits for
+a thread to exit, passing along any values the thread might have returned.
+Errors, of course, get placed into C<$@>.  (Not available with ithreads.)
+
+=item detach
+
+C<detach> tells a thread that it is never going to be joined i.e.
+that all traces of its existence can be removed once it stops running.
+Errors in detached threads will not be visible anywhere - if you want
+to catch them, you should use $SIG{__DIE__} or something like that.
+
+=item equal 
+
+C<equal> tests whether two thread objects represent the same thread and
+returns true if they do.
+
+=item tid
+
+The C<tid> method returns the tid of a thread. The tid is
+a monotonically increasing integer assigned when a thread is
+created. The main thread of a program will have a tid of zero,
+while subsequent threads will have tids assigned starting with one.
+
+=item flags
+
+The C<flags> method returns the flags for the thread. This is the
+integer value corresponding to the internal flags for the thread,
+and the value may not be all that meaningful to you.
+(Not available with ithreads.)
+
+=item done
+
+The C<done> method returns true if the thread you're checking has
+finished, and false otherwise.  (Not available with ithreads.)
+
+=back
+
+=head1 LIMITATIONS
+
+The sequence number used to assign tids is a simple integer, and no
+checking is done to make sure the tid isn't currently in use.  If a
+program creates more than 2**32 - 1 threads in a single run, threads
+may be assigned duplicate tids.  This limitation may be lifted in
+a future version of Perl.
+
+=head1 SEE ALSO
+
+L<threads::shared> (not available with 5005threads)
+
+L<attributes>, L<Thread::Queue>, L<Thread::Semaphore>,
+L<Thread::Specific> (not available with ithreads)
+
+=cut
+
+#
+# Methods
+#
+
+#
+# Exported functions
+#
+
+sub async (&) {
+    return Thread->new($_[0]);
+}
+
+sub eval {
+    return eval { shift->join; };
+}
+
+sub unimplemented {
+    print $_[0], " unimplemented with ",
+          $Config{useithreads} ? "ithreads" : "5005threads", "\n";
+
+}
+
+sub unimplement {
+    for my $m (@_) {
+	no strict 'refs';
+	*{"Thread::$m"} = sub { unimplemented $m };
+    }
+}
+
+BEGIN {
+    if ($ithreads) {
+	if ($othreads) {
+	    require Carp;
+	    Carp::croak("This Perl has both ithreads and 5005threads (serious malconfiguration)");
+	}
+	XSLoader::load 'threads';
+	for my $m (qw(new join detach yield self tid equal list)) {
+	    no strict 'refs';
+	    *{"Thread::$m"} = \&{"threads::$m"};
+	}
+	require 'threads/shared.pm';
+	for my $m (qw(cond_signal cond_broadcast cond_wait)) {
+	    no strict 'refs';
+	    *{"Thread::$m"} = \&{"threads::shared::${m}_enabled"};
+	}
+	# trying to unimplement eval gives redefined warning
+	unimplement(qw(done flags));
+    } elsif ($othreads) {
+	XSLoader::load 'Thread';
+    } else {
+	require Carp;
+	Carp::croak("This Perl has neither ithreads nor 5005threads");
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Thread/Queue.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Thread/Queue.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Thread/Queue.pm	(revision 14489)
@@ -0,0 +1,101 @@
+package Thread::Queue;
+
+use threads::shared;
+use strict;
+
+our $VERSION = '2.00';
+
+=head1 NAME
+
+Thread::Queue - thread-safe queues
+
+=head1 SYNOPSIS
+
+    use Thread::Queue;
+    my $q = new Thread::Queue;
+    $q->enqueue("foo", "bar");
+    my $foo = $q->dequeue;    # The "bar" is still in the queue.
+    my $foo = $q->dequeue_nb; # returns "bar", or undef if the queue was empty
+    my $left = $q->pending;   # returns the number of items still in the queue
+
+=head1 DESCRIPTION
+
+A queue, as implemented by C<Thread::Queue> is a thread-safe 
+data structure much like a list.  Any number of threads can safely 
+add elements to the end of the list, or remove elements from the head 
+of the list. (Queues don't permit adding or removing elements from 
+the middle of the list).
+
+=head1 FUNCTIONS AND METHODS
+
+=over 8
+
+=item new
+
+The C<new> function creates a new empty queue.
+
+=item enqueue LIST
+
+The C<enqueue> method adds a list of scalars on to the end of the queue.
+The queue will grow as needed to accommodate the list.
+
+=item dequeue
+
+The C<dequeue> method removes a scalar from the head of the queue and
+returns it. If the queue is currently empty, C<dequeue> will block the
+thread until another thread C<enqueue>s a scalar.
+
+=item dequeue_nb
+
+The C<dequeue_nb> method, like the C<dequeue> method, removes a scalar from
+the head of the queue and returns it. Unlike C<dequeue>, though,
+C<dequeue_nb> won't block if the queue is empty, instead returning
+C<undef>.
+
+=item pending
+
+The C<pending> method returns the number of items still in the queue.
+
+=back
+
+=head1 SEE ALSO
+
+L<threads>, L<threads::shared>
+
+=cut
+
+sub new {
+    my $class = shift;
+    my @q : shared = @_;
+    return bless \@q, $class;
+}
+
+sub dequeue  {
+    my $q = shift;
+    lock(@$q);
+    cond_wait @$q until @$q;
+    cond_signal @$q if @$q > 1;
+    return shift @$q;
+}
+
+sub dequeue_nb {
+    my $q = shift;
+    lock(@$q);
+    return shift @$q;
+}
+
+sub enqueue {
+    my $q = shift;
+    lock(@$q);
+    push @$q, @_  and cond_signal @$q;
+}
+
+sub pending  {
+    my $q = shift;
+    lock(@$q);
+    return scalar(@$q);
+}
+
+1;
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Thread/Semaphore.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Thread/Semaphore.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Thread/Semaphore.pm	(revision 14489)
@@ -0,0 +1,97 @@
+package Thread::Semaphore;
+
+use threads::shared;
+
+our $VERSION = '2.01';
+
+=head1 NAME
+
+Thread::Semaphore - thread-safe semaphores
+
+=head1 SYNOPSIS
+
+    use Thread::Semaphore;
+    my $s = new Thread::Semaphore;
+    $s->down;	# Also known as the semaphore P operation.
+    # The guarded section is here
+    $s->up;	# Also known as the semaphore V operation.
+
+    # The default semaphore value is 1.
+    my $s = new Thread::Semaphore($initial_value);
+    $s->down($down_value);
+    $s->up($up_value);
+
+=head1 DESCRIPTION
+
+Semaphores provide a mechanism to regulate access to resources. Semaphores,
+unlike locks, aren't tied to particular scalars, and so may be used to
+control access to anything you care to use them for.
+
+Semaphores don't limit their values to zero or one, so they can be used to
+control access to some resource that there may be more than one of. (For
+example, filehandles.) Increment and decrement amounts aren't fixed at one
+either, so threads can reserve or return multiple resources at once.
+
+=head1 FUNCTIONS AND METHODS
+
+=over 8
+
+=item new
+
+=item new NUMBER
+
+C<new> creates a new semaphore, and initializes its count to the passed
+number. If no number is passed, the semaphore's count is set to one.
+
+=item down
+
+=item down NUMBER
+
+The C<down> method decreases the semaphore's count by the specified number,
+or by one if no number has been specified. If the semaphore's count would drop
+below zero, this method will block until such time that the semaphore's
+count is equal to or larger than the amount you're C<down>ing the
+semaphore's count by.
+
+This is the semaphore "P operation" (the name derives from the Dutch
+word "pak", which means "capture" -- the semaphore operations were
+named by the late Dijkstra, who was Dutch).
+
+=item up
+
+=item up NUMBER
+
+The C<up> method increases the semaphore's count by the number specified,
+or by one if no number has been specified. This will unblock any thread blocked
+trying to C<down> the semaphore if the C<up> raises the semaphore count
+above the amount that the C<down>s are trying to decrement it by.
+
+This is the semaphore "V operation" (the name derives from the Dutch
+word "vrij", which means "release").
+
+=back
+
+=cut
+
+sub new {
+    my $class = shift;
+    my $val : shared = @_ ? shift : 1;
+    bless \$val, $class;
+}
+
+sub down {
+    my $s = shift;
+    lock($$s);
+    my $inc = @_ ? shift : 1;
+    cond_wait $$s until $$s >= $inc;
+    $$s -= $inc;
+}
+
+sub up {
+    my $s = shift;
+    lock($$s);
+    my $inc = @_ ? shift : 1;
+    ($$s += $inc) > 0 and cond_broadcast $$s;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Thread/Signal.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Thread/Signal.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Thread/Signal.pm	(revision 14489)
@@ -0,0 +1,72 @@
+package Thread::Signal;
+use Thread qw(async);
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+Thread::Signal - Start a thread which runs signal handlers reliably (for old code)
+
+=head1 CAVEAT
+
+For new code the use of the C<Thread::Signal> module is discouraged and
+the direct use of the C<threads> and associated modules is encouraged instead.
+
+However, there is no direct equivalent of the Thread::Signal module in the
+new implementation of threads.  On the bright side: signals are now delivered
+reliably to Perl programs that do not use threads.  The handling of signals
+with the new threading features is up to the underlying thread implementation
+that is being used and may therefor be less reliable.
+
+If you want to specify a thread-specific signal, you can alter the %SIG hash
+in the thread where you want to handle a signal differently from other threads.
+This at least seems to work under Linux.  But there are no guarantees and your
+mileage may vary.
+
+For the whole story about the development of threads in Perl, and why you
+should B<not> be using this module unless you know what you're doing, see the
+CAVEAT of the C<Thread> module.
+
+=head1 SYNOPSIS
+
+    use Thread::Signal;
+
+    $SIG{HUP} = \&some_handler;
+
+=head1 DESCRIPTION
+
+The C<Thread::Signal> module starts up a special signal handler thread.
+All signals to the process are delivered to it and it runs the
+associated C<$SIG{FOO}> handlers for them. Without this module,
+signals arriving at inopportune moments (such as when perl's internals
+are in the middle of updating critical structures) cause the perl
+code of the handler to be run unsafely which can cause memory corruption
+or worse.
+
+=head1 BUGS
+
+This module changes the semantics of signal handling slightly in that
+the signal handler is run separately from the main thread (and in
+parallel with it). This means that tricks such as calling C<die> from
+a signal handler behave differently (and, in particular, can't be
+used to exit directly from a system call).
+
+=cut
+
+if (!init_thread_signals()) {
+    require Carp;
+    Carp::croak("init_thread_signals failed: $!");
+}
+
+async {
+    my $sig;
+    while ($sig = await_signal()) {
+	&$sig();
+    }
+};
+
+END {
+    kill_sighandler_thread();
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Thread/Specific.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Thread/Specific.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Thread/Specific.pm	(revision 14489)
@@ -0,0 +1,30 @@
+package Thread::Specific;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+Thread::Specific - thread-specific keys
+
+=head1 SYNOPSIS
+
+    use Thread::Specific;
+    my $k = key_create Thread::Specific;
+
+=head1 DESCRIPTION
+
+C<key_create> returns a unique thread-specific key.
+
+=cut
+
+sub import : locked : method {
+    require fields;
+    fields::->import(@_);
+}	
+
+sub key_create : locked : method {
+    our %FIELDS;   # suppress "used only once"
+    return ++$FIELDS{__MAX__};
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Tie/Array.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Tie/Array.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Tie/Array.pm	(revision 14489)
@@ -0,0 +1,287 @@
+package Tie::Array;
+
+use 5.006_001;
+use strict;
+use Carp;
+our $VERSION = '1.03';
+
+# Pod documentation after __END__ below.
+
+sub DESTROY { }
+sub EXTEND  { }
+sub UNSHIFT { scalar shift->SPLICE(0,0,@_) }
+sub SHIFT { shift->SPLICE(0,1) }
+sub CLEAR   { shift->STORESIZE(0) }
+
+sub PUSH
+{
+ my $obj = shift;
+ my $i   = $obj->FETCHSIZE;
+ $obj->STORE($i++, shift) while (@_);
+}
+
+sub POP
+{
+ my $obj = shift;
+ my $newsize = $obj->FETCHSIZE - 1;
+ my $val;
+ if ($newsize >= 0)
+  {
+   $val = $obj->FETCH($newsize);
+   $obj->STORESIZE($newsize);
+  }
+ $val;
+}
+
+sub SPLICE {
+    my $obj = shift;
+    my $sz  = $obj->FETCHSIZE;
+    my $off = (@_) ? shift : 0;
+    $off += $sz if ($off < 0);
+    my $len = (@_) ? shift : $sz - $off;
+    $len += $sz - $off if $len < 0;
+    my @result;
+    for (my $i = 0; $i < $len; $i++) {
+        push(@result,$obj->FETCH($off+$i));
+    }
+    $off = $sz if $off > $sz;
+    $len -= $off + $len - $sz if $off + $len > $sz;
+    if (@_ > $len) {
+        # Move items up to make room
+        my $d = @_ - $len;
+        my $e = $off+$len;
+        $obj->EXTEND($sz+$d);
+        for (my $i=$sz-1; $i >= $e; $i--) {
+            my $val = $obj->FETCH($i);
+            $obj->STORE($i+$d,$val);
+        }
+    }
+    elsif (@_ < $len) {
+        # Move items down to close the gap
+        my $d = $len - @_;
+        my $e = $off+$len;
+        for (my $i=$off+$len; $i < $sz; $i++) {
+            my $val = $obj->FETCH($i);
+            $obj->STORE($i-$d,$val);
+        }
+        $obj->STORESIZE($sz-$d);
+    }
+    for (my $i=0; $i < @_; $i++) {
+        $obj->STORE($off+$i,$_[$i]);
+    }
+    return wantarray ? @result : pop @result;
+}
+
+sub EXISTS {
+    my $pkg = ref $_[0];
+    croak "$pkg doesn't define an EXISTS method";
+}
+
+sub DELETE {
+    my $pkg = ref $_[0];
+    croak "$pkg doesn't define a DELETE method";
+}
+
+package Tie::StdArray;
+use vars qw(@ISA);
+@ISA = 'Tie::Array';
+
+sub TIEARRAY  { bless [], $_[0] }
+sub FETCHSIZE { scalar @{$_[0]} }
+sub STORESIZE { $#{$_[0]} = $_[1]-1 }
+sub STORE     { $_[0]->[$_[1]] = $_[2] }
+sub FETCH     { $_[0]->[$_[1]] }
+sub CLEAR     { @{$_[0]} = () }
+sub POP       { pop(@{$_[0]}) }
+sub PUSH      { my $o = shift; push(@$o,@_) }
+sub SHIFT     { shift(@{$_[0]}) }
+sub UNSHIFT   { my $o = shift; unshift(@$o,@_) }
+sub EXISTS    { exists $_[0]->[$_[1]] }
+sub DELETE    { delete $_[0]->[$_[1]] }
+
+sub SPLICE
+{
+ my $ob  = shift;
+ my $sz  = $ob->FETCHSIZE;
+ my $off = @_ ? shift : 0;
+ $off   += $sz if $off < 0;
+ my $len = @_ ? shift : $sz-$off;
+ return splice(@$ob,$off,$len,@_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Tie::Array - base class for tied arrays
+
+=head1 SYNOPSIS
+
+    package Tie::NewArray;
+    use Tie::Array;
+    @ISA = ('Tie::Array');
+
+    # mandatory methods
+    sub TIEARRAY { ... }
+    sub FETCH { ... }
+    sub FETCHSIZE { ... }
+
+    sub STORE { ... }        # mandatory if elements writeable
+    sub STORESIZE { ... }    # mandatory if elements can be added/deleted
+    sub EXISTS { ... }       # mandatory if exists() expected to work
+    sub DELETE { ... }       # mandatory if delete() expected to work
+
+    # optional methods - for efficiency
+    sub CLEAR { ... }
+    sub PUSH { ... }
+    sub POP { ... }
+    sub SHIFT { ... }
+    sub UNSHIFT { ... }
+    sub SPLICE { ... }
+    sub EXTEND { ... }
+    sub DESTROY { ... }
+
+    package Tie::NewStdArray;
+    use Tie::Array;
+
+    @ISA = ('Tie::StdArray');
+
+    # all methods provided by default
+
+    package main;
+
+    $object = tie @somearray,Tie::NewArray;
+    $object = tie @somearray,Tie::StdArray;
+    $object = tie @somearray,Tie::NewStdArray;
+
+
+
+=head1 DESCRIPTION
+
+This module provides methods for array-tying classes. See
+L<perltie> for a list of the functions required in order to tie an array
+to a package. The basic B<Tie::Array> package provides stub C<DESTROY>,
+and C<EXTEND> methods that do nothing, stub C<DELETE> and C<EXISTS>
+methods that croak() if the delete() or exists() builtins are ever called
+on the tied array, and implementations of C<PUSH>, C<POP>, C<SHIFT>,
+C<UNSHIFT>, C<SPLICE> and C<CLEAR> in terms of basic C<FETCH>, C<STORE>,
+C<FETCHSIZE>, C<STORESIZE>.
+
+The B<Tie::StdArray> package provides efficient methods required for tied arrays
+which are implemented as blessed references to an "inner" perl array.
+It inherits from B<Tie::Array>, and should cause tied arrays to behave exactly
+like standard arrays, allowing for selective overloading of methods.
+
+For developers wishing to write their own tied arrays, the required methods
+are briefly defined below. See the L<perltie> section for more detailed
+descriptive, as well as example code:
+
+=over 4
+
+=item TIEARRAY classname, LIST
+
+The class method is invoked by the command C<tie @array, classname>. Associates
+an array instance with the specified class. C<LIST> would represent
+additional arguments (along the lines of L<AnyDBM_File> and compatriots) needed
+to complete the association. The method should return an object of a class which
+provides the methods below.
+
+=item STORE this, index, value
+
+Store datum I<value> into I<index> for the tied array associated with
+object I<this>. If this makes the array larger then
+class's mapping of C<undef> should be returned for new positions.
+
+=item FETCH this, index
+
+Retrieve the datum in I<index> for the tied array associated with
+object I<this>.
+
+=item FETCHSIZE this
+
+Returns the total number of items in the tied array associated with
+object I<this>. (Equivalent to C<scalar(@array)>).
+
+=item STORESIZE this, count
+
+Sets the total number of items in the tied array associated with
+object I<this> to be I<count>. If this makes the array larger then
+class's mapping of C<undef> should be returned for new positions.
+If the array becomes smaller then entries beyond count should be
+deleted.
+
+=item EXTEND this, count
+
+Informative call that array is likely to grow to have I<count> entries.
+Can be used to optimize allocation. This method need do nothing.
+
+=item EXISTS this, key
+
+Verify that the element at index I<key> exists in the tied array I<this>.
+
+The B<Tie::Array> implementation is a stub that simply croaks.
+
+=item DELETE this, key
+
+Delete the element at index I<key> from the tied array I<this>.
+
+The B<Tie::Array> implementation is a stub that simply croaks.
+
+=item CLEAR this
+
+Clear (remove, delete, ...) all values from the tied array associated with
+object I<this>.
+
+=item DESTROY this
+
+Normal object destructor method.
+
+=item PUSH this, LIST
+
+Append elements of LIST to the array.
+
+=item POP this
+
+Remove last element of the array and return it.
+
+=item SHIFT this
+
+Remove the first element of the array (shifting other elements down)
+and return it.
+
+=item UNSHIFT this, LIST
+
+Insert LIST elements at the beginning of the array, moving existing elements
+up to make room.
+
+=item SPLICE this, offset, length, LIST
+
+Perform the equivalent of C<splice> on the array.
+
+I<offset> is optional and defaults to zero, negative values count back
+from the end of the array.
+
+I<length> is optional and defaults to rest of the array.
+
+I<LIST> may be empty.
+
+Returns a list of the original I<length> elements at I<offset>.
+
+=back
+
+=head1 CAVEATS
+
+There is no support at present for tied @ISA. There is a potential conflict
+between magic entries needed to notice setting of @ISA, and those needed to
+implement 'tie'.
+
+Very little consideration has been given to the behaviour of tied arrays
+when C<$[> is not default value of zero.
+
+=head1 AUTHOR
+
+Nick Ing-Simmons E<lt>nik@tiuk.ti.comE<gt>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Tie/File.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Tie/File.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Tie/File.pm	(revision 14489)
@@ -0,0 +1,2632 @@
+
+package Tie::File;
+require 5.005;
+use Carp ':DEFAULT', 'confess';
+use POSIX 'SEEK_SET';
+use Fcntl 'O_CREAT', 'O_RDWR', 'LOCK_EX', 'LOCK_SH', 'O_WRONLY', 'O_RDONLY';
+sub O_ACCMODE () { O_RDONLY | O_RDWR | O_WRONLY }
+
+
+$VERSION = "0.97";
+my $DEFAULT_MEMORY_SIZE = 1<<21;    # 2 megabytes
+my $DEFAULT_AUTODEFER_THRESHHOLD = 3; # 3 records
+my $DEFAULT_AUTODEFER_FILELEN_THRESHHOLD = 65536; # 16 disk blocksful
+
+my %good_opt = map {$_ => 1, "-$_" => 1}
+                 qw(memory dw_size mode recsep discipline 
+                    autodefer autochomp autodefer_threshhold concurrent);
+
+sub TIEARRAY {
+  if (@_ % 2 != 0) {
+    croak "usage: tie \@array, $_[0], filename, [option => value]...";
+  }
+  my ($pack, $file, %opts) = @_;
+
+  # transform '-foo' keys into 'foo' keys
+  for my $key (keys %opts) {
+    unless ($good_opt{$key}) {
+      croak("$pack: Unrecognized option '$key'\n");
+    }
+    my $okey = $key;
+    if ($key =~ s/^-+//) {
+      $opts{$key} = delete $opts{$okey};
+    }
+  }
+
+  if ($opts{concurrent}) {
+    croak("$pack: concurrent access not supported yet\n");
+  }
+
+  unless (defined $opts{memory}) {
+    # default is the larger of the default cache size and the 
+    # deferred-write buffer size (if specified)
+    $opts{memory} = $DEFAULT_MEMORY_SIZE;
+    $opts{memory} = $opts{dw_size}
+      if defined $opts{dw_size} && $opts{dw_size} > $DEFAULT_MEMORY_SIZE;
+    # Dora Winifred Read
+  }
+  $opts{dw_size} = $opts{memory} unless defined $opts{dw_size};
+  if ($opts{dw_size} > $opts{memory}) {
+      croak("$pack: dw_size may not be larger than total memory allocation\n");
+  }
+  # are we in deferred-write mode?
+  $opts{defer} = 0 unless defined $opts{defer};
+  $opts{deferred} = {};         # no records are presently deferred
+  $opts{deferred_s} = 0;        # count of total bytes in ->{deferred}
+  $opts{deferred_max} = -1;     # empty
+
+  # What's a good way to arrange that this class can be overridden?
+  $opts{cache} = Tie::File::Cache->new($opts{memory});
+
+  # autodeferment is enabled by default
+  $opts{autodefer} = 1 unless defined $opts{autodefer};
+  $opts{autodeferring} = 0;     # but is not initially active
+  $opts{ad_history} = [];
+  $opts{autodefer_threshhold} = $DEFAULT_AUTODEFER_THRESHHOLD
+    unless defined $opts{autodefer_threshhold};
+  $opts{autodefer_filelen_threshhold} = $DEFAULT_AUTODEFER_FILELEN_THRESHHOLD
+    unless defined $opts{autodefer_filelen_threshhold};
+
+  $opts{offsets} = [0];
+  $opts{filename} = $file;
+  unless (defined $opts{recsep}) { 
+    $opts{recsep} = _default_recsep();
+  }
+  $opts{recseplen} = length($opts{recsep});
+  if ($opts{recseplen} == 0) {
+    croak "Empty record separator not supported by $pack";
+  }
+
+  $opts{autochomp} = 1 unless defined $opts{autochomp};
+
+  $opts{mode} = O_CREAT|O_RDWR unless defined $opts{mode};
+  $opts{rdonly} = (($opts{mode} & O_ACCMODE) == O_RDONLY);
+  $opts{sawlastrec} = undef;
+
+  my $fh;
+
+  if (UNIVERSAL::isa($file, 'GLOB')) {
+    # We use 1 here on the theory that some systems 
+    # may not indicate failure if we use 0.
+    # MSWin32 does not indicate failure with 0, but I don't know if
+    # it will indicate failure with 1 or not.
+    unless (seek $file, 1, SEEK_SET) {
+      croak "$pack: your filehandle does not appear to be seekable";
+    }
+    seek $file, 0, SEEK_SET     # put it back
+    $fh = $file;                # setting binmode is the user's problem
+  } elsif (ref $file) {
+    croak "usage: tie \@array, $pack, filename, [option => value]...";
+  } else {
+    # $fh = \do { local *FH };  # XXX this is buggy
+    if ($] < 5.006) {
+	# perl 5.005 and earlier don't autovivify filehandles
+	require Symbol;
+	$fh = Symbol::gensym();
+    }
+    sysopen $fh, $file, $opts{mode}, 0666 or return;
+    binmode $fh;
+    ++$opts{ourfh};
+  }
+  { my $ofh = select $fh; $| = 1; select $ofh } # autoflush on write
+  if (defined $opts{discipline} && $] >= 5.006) {
+    # This avoids a compile-time warning under 5.005
+    eval 'binmode($fh, $opts{discipline})';
+    croak $@ if $@ =~ /unknown discipline/i;
+    die if $@;
+  }
+  $opts{fh} = $fh;
+
+  bless \%opts => $pack;
+}
+
+sub FETCH {
+  my ($self, $n) = @_;
+  my $rec;
+
+  # check the defer buffer
+  $rec = $self->{deferred}{$n} if exists $self->{deferred}{$n};
+  $rec = $self->_fetch($n) unless defined $rec;
+
+  # inlined _chomp1
+  substr($rec, - $self->{recseplen}) = ""
+    if defined $rec && $self->{autochomp};
+  $rec;
+}
+
+# Chomp many records in-place; return nothing useful
+sub _chomp {
+  my $self = shift;
+  return unless $self->{autochomp};
+  if ($self->{autochomp}) {
+    for (@_) {
+      next unless defined;
+      substr($_, - $self->{recseplen}) = "";
+    }
+  }
+}
+
+# Chomp one record in-place; return modified record
+sub _chomp1 {
+  my ($self, $rec) = @_;
+  return $rec unless $self->{autochomp};
+  return unless defined $rec;
+  substr($rec, - $self->{recseplen}) = "";
+  $rec;
+}
+
+sub _fetch {
+  my ($self, $n) = @_;
+
+  # check the record cache
+  { my $cached = $self->{cache}->lookup($n);
+    return $cached if defined $cached;
+  }
+
+  if ($#{$self->{offsets}} < $n) {
+    return if $self->{eof};  # request for record beyond end of file
+    my $o = $self->_fill_offsets_to($n);
+    # If it's still undefined, there is no such record, so return 'undef'
+    return unless defined $o;
+  }
+
+  my $fh = $self->{FH};
+  $self->_seek($n);             # we can do this now that offsets is populated
+  my $rec = $self->_read_record;
+
+# If we happen to have just read the first record, check to see if
+# the length of the record matches what 'tell' says.  If not, Tie::File
+# won't work, and should drop dead.
+#
+#  if ($n == 0 && defined($rec) && tell($self->{fh}) != length($rec)) {
+#    if (defined $self->{discipline}) {
+#      croak "I/O discipline $self->{discipline} not supported";
+#    } else {
+#      croak "File encoding not supported";
+#    }
+#  }
+
+  $self->{cache}->insert($n, $rec) if defined $rec && not $self->{flushing};
+  $rec;
+}
+
+sub STORE {
+  my ($self, $n, $rec) = @_;
+  die "STORE called from _check_integrity!" if $DIAGNOSTIC;
+
+  $self->_fixrecs($rec);
+
+  if ($self->{autodefer}) {
+    $self->_annotate_ad_history($n);
+  }
+
+  return $self->_store_deferred($n, $rec) if $self->_is_deferring;
+
+
+  # We need this to decide whether the new record will fit
+  # It incidentally populates the offsets table 
+  # Note we have to do this before we alter the cache
+  # 20020324 Wait, but this DOES alter the cache.  TODO BUG?
+  my $oldrec = $self->_fetch($n);
+
+  if (not defined $oldrec) {
+    # We're storing a record beyond the end of the file
+    $self->_extend_file_to($n+1);
+    $oldrec = $self->{recsep};
+  }
+#  return if $oldrec eq $rec;    # don't bother
+  my $len_diff = length($rec) - length($oldrec);
+
+  # length($oldrec) here is not consistent with text mode  TODO XXX BUG
+  $self->_mtwrite($rec, $self->{offsets}[$n], length($oldrec));
+  $self->_oadjust([$n, 1, $rec]);
+  $self->{cache}->update($n, $rec);
+}
+
+sub _store_deferred {
+  my ($self, $n, $rec) = @_;
+  $self->{cache}->remove($n);
+  my $old_deferred = $self->{deferred}{$n};
+
+  if (defined $self->{deferred_max} && $n > $self->{deferred_max}) {
+    $self->{deferred_max} = $n;
+  }
+  $self->{deferred}{$n} = $rec;
+
+  my $len_diff = length($rec);
+  $len_diff -= length($old_deferred) if defined $old_deferred;
+  $self->{deferred_s} += $len_diff;
+  $self->{cache}->adj_limit(-$len_diff);
+  if ($self->{deferred_s} > $self->{dw_size}) {
+    $self->_flush;
+  } elsif ($self->_cache_too_full) {
+    $self->_cache_flush;
+  }
+}
+
+# Remove a single record from the deferred-write buffer without writing it
+# The record need not be present
+sub _delete_deferred {
+  my ($self, $n) = @_;
+  my $rec = delete $self->{deferred}{$n};
+  return unless defined $rec;
+
+  if (defined $self->{deferred_max} 
+      && $n == $self->{deferred_max}) {
+    undef $self->{deferred_max};
+  }
+
+  $self->{deferred_s} -= length $rec;
+  $self->{cache}->adj_limit(length $rec);
+}
+
+sub FETCHSIZE {
+  my $self = shift;
+  my $n = $self->{eof} ? $#{$self->{offsets}} : $self->_fill_offsets;
+
+  my $top_deferred = $self->_defer_max;
+  $n = $top_deferred+1 if defined $top_deferred && $n < $top_deferred+1;
+  $n;
+}
+
+sub STORESIZE {
+  my ($self, $len) = @_;
+
+  if ($self->{autodefer}) {
+    $self->_annotate_ad_history('STORESIZE');
+  }
+
+  my $olen = $self->FETCHSIZE;
+  return if $len == $olen;      # Woo-hoo!
+
+  # file gets longer
+  if ($len > $olen) {
+    if ($self->_is_deferring) {
+      for ($olen .. $len-1) {
+        $self->_store_deferred($_, $self->{recsep});
+      }
+    } else {
+      $self->_extend_file_to($len);
+    }
+    return;
+  }
+
+  # file gets shorter
+  if ($self->_is_deferring) {
+    # TODO maybe replace this with map-plus-assignment?
+    for (grep $_ >= $len, keys %{$self->{deferred}}) {
+      $self->_delete_deferred($_);
+    }
+    $self->{deferred_max} = $len-1;
+  }
+
+  $self->_seek($len);
+  $self->_chop_file;
+  $#{$self->{offsets}} = $len;
+#  $self->{offsets}[0] = 0;      # in case we just chopped this
+
+  $self->{cache}->remove(grep $_ >= $len, $self->{cache}->ckeys);
+}
+
+### OPTIMIZE ME
+### It should not be necessary to do FETCHSIZE
+### Just seek to the end of the file.
+sub PUSH {
+  my $self = shift;
+  $self->SPLICE($self->FETCHSIZE, scalar(@_), @_);
+
+  # No need to return:
+  #  $self->FETCHSIZE;  # because av.c takes care of this for me
+}
+
+sub POP {
+  my $self = shift;
+  my $size = $self->FETCHSIZE;
+  return if $size == 0;
+#  print STDERR "# POPPITY POP POP POP\n";
+  scalar $self->SPLICE($size-1, 1);
+}
+
+sub SHIFT {
+  my $self = shift;
+  scalar $self->SPLICE(0, 1);
+}
+
+sub UNSHIFT {
+  my $self = shift;
+  $self->SPLICE(0, 0, @_);
+  # $self->FETCHSIZE; # av.c takes care of this for me
+}
+
+sub CLEAR {
+  my $self = shift;
+
+  if ($self->{autodefer}) {
+    $self->_annotate_ad_history('CLEAR');
+  }
+
+  $self->_seekb(0);
+  $self->_chop_file;
+    $self->{cache}->set_limit($self->{memory});
+    $self->{cache}->empty;
+  @{$self->{offsets}} = (0);
+  %{$self->{deferred}}= ();
+    $self->{deferred_s} = 0;
+    $self->{deferred_max} = -1;
+}
+
+sub EXTEND {
+  my ($self, $n) = @_;
+
+  # No need to pre-extend anything in this case
+  return if $self->_is_deferring;
+
+  $self->_fill_offsets_to($n);
+  $self->_extend_file_to($n);
+}
+
+sub DELETE {
+  my ($self, $n) = @_;
+
+  if ($self->{autodefer}) {
+    $self->_annotate_ad_history('DELETE');
+  }
+
+  my $lastrec = $self->FETCHSIZE-1;
+  my $rec = $self->FETCH($n);
+  $self->_delete_deferred($n) if $self->_is_deferring;
+  if ($n == $lastrec) {
+    $self->_seek($n);
+    $self->_chop_file;
+    $#{$self->{offsets}}--;
+    $self->{cache}->remove($n);
+    # perhaps in this case I should also remove trailing null records?
+    # 20020316
+    # Note that delete @a[-3..-1] deletes the records in the wrong order,
+    # so we only chop the very last one out of the file.  We could repair this
+    # by tracking deleted records inside the object.
+  } elsif ($n < $lastrec) {
+    $self->STORE($n, "");
+  }
+  $rec;
+}
+
+sub EXISTS {
+  my ($self, $n) = @_;
+  return 1 if exists $self->{deferred}{$n};
+  $n < $self->FETCHSIZE;
+}
+
+sub SPLICE {
+  my $self = shift;
+
+  if ($self->{autodefer}) {
+    $self->_annotate_ad_history('SPLICE');
+  }
+
+  $self->_flush if $self->_is_deferring; # move this up?
+  if (wantarray) {
+    $self->_chomp(my @a = $self->_splice(@_));
+    @a;
+  } else {
+    $self->_chomp1(scalar $self->_splice(@_));
+  }
+}
+
+sub DESTROY {
+  my $self = shift;
+  $self->flush if $self->_is_deferring;
+  $self->{cache}->delink if defined $self->{cache}; # break circular link
+  if ($self->{fh} and $self->{ourfh}) {
+      delete $self->{ourfh};
+      close delete $self->{fh};
+  }
+}
+
+sub _splice {
+  my ($self, $pos, $nrecs, @data) = @_;
+  my @result;
+
+  $pos = 0 unless defined $pos;
+
+  # Deal with negative and other out-of-range positions
+  # Also set default for $nrecs 
+  {
+    my $oldsize = $self->FETCHSIZE;
+    $nrecs = $oldsize unless defined $nrecs;
+    my $oldpos = $pos;
+
+    if ($pos < 0) {
+      $pos += $oldsize;
+      if ($pos < 0) {
+        croak "Modification of non-creatable array value attempted, subscript $oldpos";
+      }
+    }
+
+    if ($pos > $oldsize) {
+      return unless @data;
+      $pos = $oldsize;          # This is what perl does for normal arrays
+    }
+
+    # The manual is very unclear here
+    if ($nrecs < 0) {
+      $nrecs = $oldsize - $pos + $nrecs;
+      $nrecs = 0 if $nrecs < 0;
+    }
+
+    # nrecs is too big---it really means "until the end"
+    # 20030507
+    if ($nrecs + $pos > $oldsize) {
+      $nrecs = $oldsize - $pos;
+    }
+  }
+
+  $self->_fixrecs(@data);
+  my $data = join '', @data;
+  my $datalen = length $data;
+  my $oldlen = 0;
+
+  # compute length of data being removed
+  for ($pos .. $pos+$nrecs-1) {
+    last unless defined $self->_fill_offsets_to($_);
+    my $rec = $self->_fetch($_);
+    last unless defined $rec;
+    push @result, $rec;
+
+    # Why don't we just use length($rec) here?
+    # Because that record might have come from the cache.  _splice
+    # might have been called to flush out the deferred-write records,
+    # and in this case length($rec) is the length of the record to be
+    # *written*, not the length of the actual record in the file.  But
+    # the offsets are still true. 20020322
+    $oldlen += $self->{offsets}[$_+1] - $self->{offsets}[$_]
+      if defined $self->{offsets}[$_+1];
+  }
+  $self->_fill_offsets_to($pos+$nrecs);
+
+  # Modify the file
+  $self->_mtwrite($data, $self->{offsets}[$pos], $oldlen);
+  # Adjust the offsets table
+  $self->_oadjust([$pos, $nrecs, @data]);
+
+  { # Take this read cache stuff out into a separate function
+    # You made a half-attempt to put it into _oadjust.  
+    # Finish something like that up eventually.
+    # STORE also needs to do something similarish
+
+    # update the read cache, part 1
+    # modified records
+    for ($pos .. $pos+$nrecs-1) {
+      my $new = $data[$_-$pos];
+      if (defined $new) {
+        $self->{cache}->update($_, $new);
+      } else {
+        $self->{cache}->remove($_);
+      }
+    }
+    
+    # update the read cache, part 2
+    # moved records - records past the site of the change
+    # need to be renumbered
+    # Maybe merge this with the previous block?
+    {
+      my @oldkeys = grep $_ >= $pos + $nrecs, $self->{cache}->ckeys;
+      my @newkeys = map $_-$nrecs+@data, @oldkeys;
+      $self->{cache}->rekey(\@oldkeys, \@newkeys);
+    }
+
+    # Now there might be too much data in the cache, if we spliced out
+    # some short records and spliced in some long ones.  If so, flush
+    # the cache.
+    $self->_cache_flush;
+  }
+
+  # Yes, the return value of 'splice' *is* actually this complicated
+  wantarray ? @result : @result ? $result[-1] : undef;
+}
+
+
+# write data into the file
+# $data is the data to be written.
+# it should be written at position $pos, and should overwrite
+# exactly $len of the following bytes.  
+# Note that if length($data) > $len, the subsequent bytes will have to 
+# be moved up, and if length($data) < $len, they will have to
+# be moved down
+sub _twrite {
+  my ($self, $data, $pos, $len) = @_;
+
+  unless (defined $pos) {
+    die "\$pos was undefined in _twrite";
+  }
+
+  my $len_diff = length($data) - $len;
+
+  if ($len_diff == 0) {          # Woo-hoo!
+    my $fh = $self->{fh};
+    $self->_seekb($pos);
+    $self->_write_record($data);
+    return;                     # well, that was easy.
+  }
+
+  # the two records are of different lengths
+  # our strategy here: rewrite the tail of the file,
+  # reading ahead one buffer at a time
+  # $bufsize is required to be at least as large as the data we're overwriting
+  my $bufsize = _bufsize($len_diff);
+  my ($writepos, $readpos) = ($pos, $pos+$len);
+  my $next_block;
+  my $more_data;
+
+  # Seems like there ought to be a way to avoid the repeated code
+  # and the special case here.  The read(1) is also a little weird.
+  # Think about this.
+  do {
+    $self->_seekb($readpos);
+    my $br = read $self->{fh}, $next_block, $bufsize;
+    $more_data = read $self->{fh}, my($dummy), 1;
+    $self->_seekb($writepos);
+    $self->_write_record($data);
+    $readpos += $br;
+    $writepos += length $data;
+    $data = $next_block;
+  } while $more_data;
+  $self->_seekb($writepos);
+  $self->_write_record($next_block);
+
+  # There might be leftover data at the end of the file
+  $self->_chop_file if $len_diff < 0;
+}
+
+# _iwrite(D, S, E)
+# Insert text D at position S.
+# Let C = E-S-|D|.  If C < 0; die.  
+# Data in [S,S+C) is copied to [S+D,S+D+C) = [S+D,E).
+# Data in [S+C = E-D, E) is returned.  Data in [E, oo) is untouched.
+#
+# In a later version, don't read the entire intervening area into
+# memory at once; do the copying block by block.
+sub _iwrite {
+  my $self = shift;
+  my ($D, $s, $e) = @_;
+  my $d = length $D;
+  my $c = $e-$s-$d;
+  local *FH = $self->{fh};
+  confess "Not enough space to insert $d bytes between $s and $e"
+    if $c < 0;
+  confess "[$s,$e) is an invalid insertion range" if $e < $s;
+
+  $self->_seekb($s);
+  read FH, my $buf, $e-$s;
+
+  $D .= substr($buf, 0, $c, "");
+
+  $self->_seekb($s);
+  $self->_write_record($D);
+
+  return $buf;
+}
+
+# Like _twrite, but the data-pos-len triple may be repeated; you may
+# write several chunks.  All the writing will be done in
+# one pass.   Chunks SHALL be in ascending order and SHALL NOT overlap.
+sub _mtwrite {
+  my $self = shift;
+  my $unwritten = "";
+  my $delta = 0;
+
+  @_ % 3 == 0 
+    or die "Arguments to _mtwrite did not come in groups of three";
+
+  while (@_) {
+    my ($data, $pos, $len) = splice @_, 0, 3;
+    my $end = $pos + $len;  # The OLD end of the segment to be replaced
+    $data = $unwritten . $data;
+    $delta -= length($unwritten);
+    $unwritten  = "";
+    $pos += $delta;             # This is where the data goes now
+    my $dlen = length $data;
+    $self->_seekb($pos);
+    if ($len >= $dlen) {        # the data will fit
+      $self->_write_record($data);
+      $delta += ($dlen - $len); # everything following moves down by this much
+      $data = ""; # All the data in the buffer has been written
+    } else {                    # won't fit
+      my $writable = substr($data, 0, $len - $delta, "");
+      $self->_write_record($writable);
+      $delta += ($dlen - $len); # everything following moves down by this much
+    } 
+
+    # At this point we've written some but maybe not all of the data.
+    # There might be a gap to close up, or $data might still contain a
+    # bunch of unwritten data that didn't fit.
+    my $ndlen = length $data;
+    if ($delta == 0) {
+      $self->_write_record($data);
+    } elsif ($delta < 0) {
+      # upcopy (close up gap)
+      if (@_) {
+        $self->_upcopy($end, $end + $delta, $_[1] - $end);  
+      } else {
+        $self->_upcopy($end, $end + $delta);  
+      }
+    } else {
+      # downcopy (insert data that didn't fit; replace this data in memory
+      # with _later_ data that doesn't fit)
+      if (@_) {
+        $unwritten = $self->_downcopy($data, $end, $_[1] - $end);
+      } else {
+        # Make the file longer to accomodate the last segment that doesn'
+        $unwritten = $self->_downcopy($data, $end);
+      }
+    }
+  }
+}
+
+# Copy block of data of length $len from position $spos to position $dpos
+# $dpos must be <= $spos
+#
+# If $len is undefined, go all the way to the end of the file
+# and then truncate it ($spos - $dpos bytes will be removed)
+sub _upcopy {
+  my $blocksize = 8192;
+  my ($self, $spos, $dpos, $len) = @_;
+  if ($dpos > $spos) {
+    die "source ($spos) was upstream of destination ($dpos) in _upcopy";
+  } elsif ($dpos == $spos) {
+    return;
+  }
+  
+  while (! defined ($len) || $len > 0) {
+    my $readsize = ! defined($len) ? $blocksize
+               : $len > $blocksize ? $blocksize
+               : $len;
+      
+    my $fh = $self->{fh};
+    $self->_seekb($spos);
+    my $bytes_read = read $fh, my($data), $readsize;
+    $self->_seekb($dpos);
+    if ($data eq "") { 
+      $self->_chop_file;
+      last;
+    }
+    $self->_write_record($data);
+    $spos += $bytes_read;
+    $dpos += $bytes_read;
+    $len -= $bytes_read if defined $len;
+  }
+}
+
+# Write $data into a block of length $len at position $pos,
+# moving everything in the block forwards to make room.
+# Instead of writing the last length($data) bytes from the block
+# (because there isn't room for them any longer) return them.
+#
+# Undefined $len means 'until the end of the file'
+sub _downcopy {
+  my $blocksize = 8192;
+  my ($self, $data, $pos, $len) = @_;
+  my $fh = $self->{fh};
+
+  while (! defined $len || $len > 0) {
+    my $readsize = ! defined($len) ? $blocksize 
+      : $len > $blocksize? $blocksize : $len;
+    $self->_seekb($pos);
+    read $fh, my($old), $readsize;
+    my $last_read_was_short = length($old) < $readsize;
+    $data .= $old;
+    my $writable;
+    if ($last_read_was_short) {
+      # If last read was short, then $data now contains the entire rest
+      # of the file, so there's no need to write only one block of it
+      $writable = $data;
+      $data = "";
+    } else {
+      $writable = substr($data, 0, $readsize, "");
+    }
+    last if $writable eq "";
+    $self->_seekb($pos);
+    $self->_write_record($writable);
+    last if $last_read_was_short && $data eq "";
+    $len -= $readsize if defined $len;
+    $pos += $readsize;
+  }
+  return $data;
+}
+
+# Adjust the object data structures following an '_mtwrite'
+# Arguments are
+#  [$pos, $nrecs, @length]  items
+# indicating that $nrecs records were removed at $recpos (a record offset)
+# and replaced with records of length @length...
+# Arguments guarantee that $recpos is strictly increasing.
+# No return value
+sub _oadjust {
+  my $self = shift;
+  my $delta = 0;
+  my $delta_recs = 0;
+  my $prev_end = -1;
+  my %newkeys;
+
+  for (@_) {
+    my ($pos, $nrecs, @data) = @$_;
+    $pos += $delta_recs;
+
+    # Adjust the offsets of the records after the previous batch up
+    # to the first new one of this batch
+    for my $i ($prev_end+2 .. $pos - 1) {
+      $self->{offsets}[$i] += $delta;
+      $newkey{$i} = $i + $delta_recs;
+    }
+
+    $prev_end = $pos + @data - 1; # last record moved on this pass 
+
+    # Remove the offsets for the removed records;
+    # replace with the offsets for the inserted records
+    my @newoff = ($self->{offsets}[$pos] + $delta);
+    for my $i (0 .. $#data) {
+      my $newlen = length $data[$i];
+      push @newoff, $newoff[$i] + $newlen;
+      $delta += $newlen;
+    }
+
+    for my $i ($pos .. $pos+$nrecs-1) {
+      last if $i+1 > $#{$self->{offsets}};
+      my $oldlen = $self->{offsets}[$i+1] - $self->{offsets}[$i];
+      $delta -= $oldlen;
+    }
+
+#    # also this data has changed, so update it in the cache
+#    for (0 .. $#data) {
+#      $self->{cache}->update($pos + $_, $data[$_]);
+#    }
+#    if ($delta_recs) {
+#      my @oldkeys = grep $_ >= $pos + @data, $self->{cache}->ckeys;
+#      my @newkeys = map $_ + $delta_recs, @oldkeys;
+#      $self->{cache}->rekey(\@oldkeys, \@newkeys);
+#    }
+
+    # replace old offsets with new
+    splice @{$self->{offsets}}, $pos, $nrecs+1, @newoff;
+    # What if we just spliced out the end of the offsets table?
+    # shouldn't we clear $self->{eof}?   Test for this XXX BUG TODO
+
+    $delta_recs += @data - $nrecs; # net change in total number of records
+  }
+
+  # The trailing records at the very end of the file
+  if ($delta) {
+    for my $i ($prev_end+2 .. $#{$self->{offsets}}) {
+      $self->{offsets}[$i] += $delta;
+    }
+  }
+
+  # If we scrubbed out all known offsets, regenerate the trivial table
+  # that knows that the file does indeed start at 0.
+  $self->{offsets}[0] = 0 unless @{$self->{offsets}};
+  # If the file got longer, the offsets table is no longer complete
+  # $self->{eof} = 0 if $delta_recs > 0;
+
+  # Now there might be too much data in the cache, if we spliced out
+  # some short records and spliced in some long ones.  If so, flush
+  # the cache.
+  $self->_cache_flush;
+}
+
+# If a record does not already end with the appropriate terminator
+# string, append one.
+sub _fixrecs {
+  my $self = shift;
+  for (@_) {
+    $_ = "" unless defined $_;
+    $_ .= $self->{recsep}
+      unless substr($_, - $self->{recseplen}) eq $self->{recsep};
+  }
+}
+
+
+################################################################
+#
+# Basic read, write, and seek
+#
+
+# seek to the beginning of record #$n
+# Assumes that the offsets table is already correctly populated
+#
+# Note that $n=-1 has a special meaning here: It means the start of
+# the last known record; this may or may not be the very last record
+# in the file, depending on whether the offsets table is fully populated.
+#
+sub _seek {
+  my ($self, $n) = @_;
+  my $o = $self->{offsets}[$n];
+  defined($o)
+    or confess("logic error: undefined offset for record $n");
+  seek $self->{fh}, $o, SEEK_SET
+    or confess "Couldn't seek filehandle: $!";  # "Should never happen."
+}
+
+# seek to byte $b in the file
+sub _seekb {
+  my ($self, $b) = @_;
+  seek $self->{fh}, $b, SEEK_SET
+    or die "Couldn't seek filehandle: $!";  # "Should never happen."
+}
+
+# populate the offsets table up to the beginning of record $n
+# return the offset of record $n
+sub _fill_offsets_to {
+  my ($self, $n) = @_;
+
+  return $self->{offsets}[$n] if $self->{eof};
+
+  my $fh = $self->{fh};
+  local *OFF = $self->{offsets};
+  my $rec;
+
+  until ($#OFF >= $n) {
+    $self->_seek(-1);           # tricky -- see comment at _seek
+    $rec = $self->_read_record;
+    if (defined $rec) {
+      push @OFF, int(tell $fh);  # Tels says that int() saves memory here
+    } else {
+      $self->{eof} = 1;
+      return;                   # It turns out there is no such record
+    }
+  }
+
+  # we have now read all the records up to record n-1,
+  # so we can return the offset of record n
+  $OFF[$n];
+}
+
+sub _fill_offsets {
+  my ($self) = @_;
+
+  my $fh = $self->{fh};
+  local *OFF = $self->{offsets};
+  
+  $self->_seek(-1);           # tricky -- see comment at _seek
+
+  # Tels says that inlining read_record() would make this loop
+  # five times faster. 20030508
+  while ( defined $self->_read_record()) {
+    # int() saves us memory here
+    push @OFF, int(tell $fh);
+  }
+
+  $self->{eof} = 1;
+  $#OFF;
+}
+
+# assumes that $rec is already suitably terminated
+sub _write_record {
+  my ($self, $rec) = @_;
+  my $fh = $self->{fh};
+  local $\ = "";
+  print $fh $rec
+    or die "Couldn't write record: $!";  # "Should never happen."
+#  $self->{_written} += length($rec);
+}
+
+sub _read_record {
+  my $self = shift;
+  my $rec;
+  { local $/ = $self->{recsep};
+    my $fh = $self->{fh};
+    $rec = <$fh>;
+  }
+  return unless defined $rec;
+  if (substr($rec, -$self->{recseplen}) ne $self->{recsep}) {
+    # improperly terminated final record --- quietly fix it.
+#    my $ac = substr($rec, -$self->{recseplen});
+#    $ac =~ s/\n/\\n/g;
+    $self->{sawlastrec} = 1;
+    unless ($self->{rdonly}) {
+      local $\ = "";
+      my $fh = $self->{fh};
+      print $fh $self->{recsep};
+    }
+    $rec .= $self->{recsep};
+  }
+#  $self->{_read} += length($rec) if defined $rec;
+  $rec;
+}
+
+sub _rw_stats {
+  my $self = shift;
+  @{$self}{'_read', '_written'};
+}
+
+################################################################
+#
+# Read cache management
+
+sub _cache_flush {
+  my ($self) = @_;
+  $self->{cache}->reduce_size_to($self->{memory} - $self->{deferred_s});
+}
+
+sub _cache_too_full {
+  my $self = shift;
+  $self->{cache}->bytes + $self->{deferred_s} >= $self->{memory};
+}
+
+################################################################
+#
+# File custodial services
+#
+
+
+# We have read to the end of the file and have the offsets table
+# entirely populated.  Now we need to write a new record beyond
+# the end of the file.  We prepare for this by writing
+# empty records into the file up to the position we want
+#
+# assumes that the offsets table already contains the offset of record $n,
+# if it exists, and extends to the end of the file if not.
+sub _extend_file_to {
+  my ($self, $n) = @_;
+  $self->_seek(-1);             # position after the end of the last record
+  my $pos = $self->{offsets}[-1];
+
+  # the offsets table has one entry more than the total number of records
+  my $extras = $n - $#{$self->{offsets}};
+
+  # Todo : just use $self->{recsep} x $extras here?
+  while ($extras-- > 0) {
+    $self->_write_record($self->{recsep});
+    push @{$self->{offsets}}, int(tell $self->{fh});
+  }
+}
+
+# Truncate the file at the current position
+sub _chop_file {
+  my $self = shift;
+  truncate $self->{fh}, tell($self->{fh});
+}
+
+
+# compute the size of a buffer suitable for moving
+# all the data in a file forward $n bytes
+# ($n may be negative)
+# The result should be at least $n.
+sub _bufsize {
+  my $n = shift;
+  return 8192 if $n <= 0;
+  my $b = $n & ~8191;
+  $b += 8192 if $n & 8191;
+  $b;
+}
+
+################################################################
+#
+# Miscellaneous public methods
+#
+
+# Lock the file
+sub flock {
+  my ($self, $op) = @_;
+  unless (@_ <= 3) {
+    my $pack = ref $self;
+    croak "Usage: $pack\->flock([OPERATION])";
+  }
+  my $fh = $self->{fh};
+  $op = LOCK_EX unless defined $op;
+  my $locked = flock $fh, $op;
+  
+  if ($locked && ($op & (LOCK_EX | LOCK_SH))) {
+    # If you're locking the file, then presumably it's because
+    # there might have been a write access by another process.
+    # In that case, the read cache contents and the offsets table
+    # might be invalid, so discard them.  20030508
+    $self->{offsets} = [0];
+    $self->{cache}->empty;
+  }
+
+  $locked;
+}
+
+# Get/set autochomp option
+sub autochomp {
+  my $self = shift;
+  if (@_) {
+    my $old = $self->{autochomp};
+    $self->{autochomp} = shift;
+    $old;
+  } else {
+    $self->{autochomp};
+  }
+}
+
+# Get offset table entries; returns offset of nth record
+sub offset {
+  my ($self, $n) = @_;
+
+  if ($#{$self->{offsets}} < $n) {
+    return if $self->{eof};     # request for record beyond the end of file
+    my $o = $self->_fill_offsets_to($n);
+    # If it's still undefined, there is no such record, so return 'undef'
+    return unless defined $o;
+   }
+ 
+  $self->{offsets}[$n];
+}
+
+sub discard_offsets {
+  my $self = shift;
+  $self->{offsets} = [0];
+}
+
+################################################################
+#
+# Matters related to deferred writing
+#
+
+# Defer writes
+sub defer {
+  my $self = shift;
+  $self->_stop_autodeferring;
+  @{$self->{ad_history}} = ();
+  $self->{defer} = 1;
+}
+
+# Flush deferred writes
+#
+# This could be better optimized to write the file in one pass, instead
+# of one pass per block of records.  But that will require modifications
+# to _twrite, so I should have a good _twrite test suite first.
+sub flush {
+  my $self = shift;
+
+  $self->_flush;
+  $self->{defer} = 0;
+}
+
+sub _old_flush {
+  my $self = shift;
+  my @writable = sort {$a<=>$b} (keys %{$self->{deferred}});
+
+  while (@writable) {
+    # gather all consecutive records from the front of @writable
+    my $first_rec = shift @writable;
+    my $last_rec = $first_rec+1;
+    ++$last_rec, shift @writable while @writable && $last_rec == $writable[0];
+    --$last_rec;
+    $self->_fill_offsets_to($last_rec);
+    $self->_extend_file_to($last_rec);
+    $self->_splice($first_rec, $last_rec-$first_rec+1, 
+                   @{$self->{deferred}}{$first_rec .. $last_rec});
+  }
+
+  $self->_discard;               # clear out defered-write-cache
+}
+
+sub _flush {
+  my $self = shift;
+  my @writable = sort {$a<=>$b} (keys %{$self->{deferred}});
+  my @args;
+  my @adjust;
+
+  while (@writable) {
+    # gather all consecutive records from the front of @writable
+    my $first_rec = shift @writable;
+    my $last_rec = $first_rec+1;
+    ++$last_rec, shift @writable while @writable && $last_rec == $writable[0];
+    --$last_rec;
+    my $end = $self->_fill_offsets_to($last_rec+1);
+    if (not defined $end) {
+      $self->_extend_file_to($last_rec);
+      $end = $self->{offsets}[$last_rec];
+    }
+    my ($start) = $self->{offsets}[$first_rec];
+    push @args,
+         join("", @{$self->{deferred}}{$first_rec .. $last_rec}), # data
+         $start,                                                  # position
+         $end-$start;                                             # length
+    push @adjust, [$first_rec, # starting at this position...
+                   $last_rec-$first_rec+1,  # this many records...
+                   # are replaced with these...
+                   @{$self->{deferred}}{$first_rec .. $last_rec},
+                  ];
+  }
+
+  $self->_mtwrite(@args);  # write multiple record groups
+  $self->_discard;               # clear out defered-write-cache
+  $self->_oadjust(@adjust);
+}
+
+# Discard deferred writes and disable future deferred writes
+sub discard {
+  my $self = shift;
+  $self->_discard;
+  $self->{defer} = 0;
+}
+
+# Discard deferred writes, but retain old deferred writing mode
+sub _discard {
+  my $self = shift;
+  %{$self->{deferred}} = ();
+  $self->{deferred_s}  = 0;
+  $self->{deferred_max}  = -1;
+  $self->{cache}->set_limit($self->{memory});
+}
+
+# Deferred writing is enabled, either explicitly ($self->{defer})
+# or automatically ($self->{autodeferring})
+sub _is_deferring {
+  my $self = shift;
+  $self->{defer} || $self->{autodeferring};
+}
+
+# The largest record number of any deferred record
+sub _defer_max {
+  my $self = shift;
+  return $self->{deferred_max} if defined $self->{deferred_max};
+  my $max = -1;
+  for my $key (keys %{$self->{deferred}}) {
+    $max = $key if $key > $max;
+  }
+  $self->{deferred_max} = $max;
+  $max;
+}
+
+################################################################
+#
+# Matters related to autodeferment
+#
+
+# Get/set autodefer option
+sub autodefer {
+  my $self = shift;
+  if (@_) {
+    my $old = $self->{autodefer};
+    $self->{autodefer} = shift;
+    if ($old) {
+      $self->_stop_autodeferring;
+      @{$self->{ad_history}} = ();
+    }
+    $old;
+  } else {
+    $self->{autodefer};
+  }
+}
+
+# The user is trying to store record #$n Record that in the history,
+# and then enable (or disable) autodeferment if that seems useful.
+# Note that it's OK for $n to be a non-number, as long as the function
+# is prepared to deal with that.  Nobody else looks at the ad_history.
+#
+# Now, what does the ad_history mean, and what is this function doing?
+# Essentially, the idea is to enable autodeferring when we see that the
+# user has made three consecutive STORE calls to three consecutive records.
+# ("Three" is actually ->{autodefer_threshhold}.)
+# A STORE call for record #$n inserts $n into the autodefer history,
+# and if the history contains three consecutive records, we enable 
+# autodeferment.  An ad_history of [X, Y] means that the most recent
+# STOREs were for records X, X+1, ..., Y, in that order.  
+#
+# Inserting a nonconsecutive number erases the history and starts over.
+#
+# Performing a special operation like SPLICE erases the history.
+#
+# There's one special case: CLEAR means that CLEAR was just called.
+# In this case, we prime the history with [-2, -1] so that if the next
+# write is for record 0, autodeferring goes on immediately.  This is for
+# the common special case of "@a = (...)".
+#
+sub _annotate_ad_history {
+  my ($self, $n) = @_;
+  return unless $self->{autodefer}; # feature is disabled
+  return if $self->{defer};     # already in explicit defer mode
+  return unless $self->{offsets}[-1] >= $self->{autodefer_filelen_threshhold};
+
+  local *H = $self->{ad_history};
+  if ($n eq 'CLEAR') {
+    @H = (-2, -1);              # prime the history with fake records
+    $self->_stop_autodeferring;
+  } elsif ($n =~ /^\d+$/) {
+    if (@H == 0) {
+      @H =  ($n, $n);
+    } else {                    # @H == 2
+      if ($H[1] == $n-1) {      # another consecutive record
+        $H[1]++;
+        if ($H[1] - $H[0] + 1 >= $self->{autodefer_threshhold}) {
+          $self->{autodeferring} = 1;
+        }
+      } else {                  # nonconsecutive- erase and start over
+        @H = ($n, $n);
+        $self->_stop_autodeferring;
+      }
+    }
+  } else {                      # SPLICE or STORESIZE or some such
+    @H = ();
+    $self->_stop_autodeferring;
+  }
+}
+
+# If autodeferring was enabled, cut it out and discard the history
+sub _stop_autodeferring {
+  my $self = shift;
+  if ($self->{autodeferring}) {
+    $self->_flush;
+  }
+  $self->{autodeferring} = 0;
+}
+
+################################################################
+
+
+# This is NOT a method.  It is here for two reasons:
+#  1. To factor a fairly complicated block out of the constructor
+#  2. To provide access for the test suite, which need to be sure
+#     files are being written properly.
+sub _default_recsep {
+  my $recsep = $/;
+  if ($^O eq 'MSWin32') {       # Dos too?
+    # Windows users expect files to be terminated with \r\n
+    # But $/ is set to \n instead
+    # Note that this also transforms \n\n into \r\n\r\n.
+    # That is a feature.
+    $recsep =~ s/\n/\r\n/g;
+  }
+  $recsep;
+}
+
+# Utility function for _check_integrity
+sub _ci_warn {
+  my $msg = shift;
+  $msg =~ s/\n/\\n/g;
+  $msg =~ s/\r/\\r/g;
+  print "# $msg\n";
+}
+
+# Given a file, make sure the cache is consistent with the
+# file contents and the internal data structures are consistent with
+# each other.  Returns true if everything checks out, false if not
+#
+# The $file argument is no longer used.  It is retained for compatibility
+# with the existing test suite.
+sub _check_integrity {
+  my ($self, $file, $warn) = @_;
+  my $rsl = $self->{recseplen};
+  my $rs  = $self->{recsep};
+  my $good = 1; 
+  local *_;                     # local $_ does not work here
+  local $DIAGNOSTIC = 1;
+
+  if (not defined $rs) {
+    _ci_warn("recsep is undef!");
+    $good = 0;
+  } elsif ($rs eq "") {
+    _ci_warn("recsep is empty!");
+    $good = 0;
+  } elsif ($rsl != length $rs) {
+    my $ln = length $rs;
+    _ci_warn("recsep <$rs> has length $ln, should be $rsl");
+    $good = 0;
+  }
+
+  if (not defined $self->{offsets}[0]) {
+    _ci_warn("offset 0 is missing!");
+    $good = 0;
+
+  } elsif ($self->{offsets}[0] != 0) {
+    _ci_warn("rec 0: offset <$self->{offsets}[0]> s/b 0!");
+    $good = 0;
+  }
+
+  my $cached = 0;
+  {
+    local *F = $self->{fh};
+    seek F, 0, SEEK_SET;
+    local $. = 0;
+    local $/ = $rs;
+
+    while (<F>) {
+      my $n = $. - 1;
+      my $cached = $self->{cache}->_produce($n);
+      my $offset = $self->{offsets}[$.];
+      my $ao = tell F;
+      if (defined $offset && $offset != $ao) {
+        _ci_warn("rec $n: offset <$offset> actual <$ao>");
+        $good = 0;
+      }
+      if (defined $cached && $_ ne $cached && ! $self->{deferred}{$n}) {
+        $good = 0;
+        _ci_warn("rec $n: cached <$cached> actual <$_>");
+      }
+      if (defined $cached && substr($cached, -$rsl) ne $rs) {
+        $good = 0;
+        _ci_warn("rec $n in the cache is missing the record separator");
+      }
+      if (! defined $offset && $self->{eof}) {
+        $good = 0;
+        _ci_warn("The offset table was marked complete, but it is missing element $.");
+      }
+    }
+    if (@{$self->{offsets}} > $.+1) {
+        $good = 0;
+        my $n = @{$self->{offsets}};
+        _ci_warn("The offset table has $n items, but the file has only $.");
+    }
+
+    my $deferring = $self->_is_deferring;
+    for my $n ($self->{cache}->ckeys) {
+      my $r = $self->{cache}->_produce($n);
+      $cached += length($r);
+      next if $n+1 <= $.;         # checked this already
+      _ci_warn("spurious caching of record $n");
+      $good = 0;
+    }
+    my $b = $self->{cache}->bytes;
+    if ($cached != $b) {
+      _ci_warn("cache size is $b, should be $cached");
+      $good = 0;
+    }
+  }
+
+  # That cache has its own set of tests
+  $good = 0 unless $self->{cache}->_check_integrity;
+
+  # Now let's check the deferbuffer
+  # Unless deferred writing is enabled, it should be empty
+  if (! $self->_is_deferring && %{$self->{deferred}}) {
+    _ci_warn("deferred writing disabled, but deferbuffer nonempty");
+    $good = 0;
+  }
+
+  # Any record in the deferbuffer should *not* be present in the readcache
+  my $deferred_s = 0;
+  while (my ($n, $r) = each %{$self->{deferred}}) {
+    $deferred_s += length($r);
+    if (defined $self->{cache}->_produce($n)) {
+      _ci_warn("record $n is in the deferbuffer *and* the readcache");
+      $good = 0;
+    }
+    if (substr($r, -$rsl) ne $rs) {
+      _ci_warn("rec $n in the deferbuffer is missing the record separator");
+      $good = 0;
+    }
+  }
+
+  # Total size of deferbuffer should match internal total
+  if ($deferred_s != $self->{deferred_s}) {
+    _ci_warn("buffer size is $self->{deferred_s}, should be $deferred_s");
+    $good = 0;
+  }
+
+  # Total size of deferbuffer should not exceed the specified limit
+  if ($deferred_s > $self->{dw_size}) {
+    _ci_warn("buffer size is $self->{deferred_s} which exceeds the limit of $self->{dw_size}");
+    $good = 0;
+  }
+
+  # Total size of cached data should not exceed the specified limit
+  if ($deferred_s + $cached > $self->{memory}) {
+    my $total = $deferred_s + $cached;
+    _ci_warn("total stored data size is $total which exceeds the limit of $self->{memory}");
+    $good = 0;
+  }
+
+  # Stuff related to autodeferment
+  if (!$self->{autodefer} && @{$self->{ad_history}}) {
+    _ci_warn("autodefer is disabled, but ad_history is nonempty");
+    $good = 0;
+  }
+  if ($self->{autodeferring} && $self->{defer}) {
+    _ci_warn("both autodeferring and explicit deferring are active");
+    $good = 0;
+  }
+  if (@{$self->{ad_history}} == 0) {
+    # That's OK, no additional tests required
+  } elsif (@{$self->{ad_history}} == 2) {
+    my @non_number = grep !/^-?\d+$/, @{$self->{ad_history}};
+    if (@non_number) {
+      my $msg;
+      { local $" = ')(';
+        $msg = "ad_history contains non-numbers (@{$self->{ad_history}})";
+      }
+      _ci_warn($msg);
+      $good = 0;
+    } elsif ($self->{ad_history}[1] < $self->{ad_history}[0]) {
+      _ci_warn("ad_history has nonsensical values @{$self->{ad_history}}");
+      $good = 0;
+    }
+  } else {
+    _ci_warn("ad_history has bad length <@{$self->{ad_history}}>");
+    $good = 0;
+  }
+
+  $good;
+}
+
+################################################################
+#
+# Tie::File::Cache
+#
+# Read cache
+
+package Tie::File::Cache;
+$Tie::File::Cache::VERSION = $Tie::File::VERSION;
+use Carp ':DEFAULT', 'confess';
+
+sub HEAP () { 0 }
+sub HASH () { 1 }
+sub MAX  () { 2 }
+sub BYTES() { 3 }
+#sub STAT () { 4 } # Array with request statistics for each record
+#sub MISS () { 5 } # Total number of cache misses
+#sub REQ  () { 6 } # Total number of cache requests 
+use strict 'vars';
+
+sub new {
+  my ($pack, $max) = @_;
+  local *_;
+  croak "missing argument to ->new" unless defined $max;
+  my $self = [];
+  bless $self => $pack;
+  @$self = (Tie::File::Heap->new($self), {}, $max, 0);
+  $self;
+}
+
+sub adj_limit {
+  my ($self, $n) = @_;
+  $self->[MAX] += $n;
+}
+
+sub set_limit {
+  my ($self, $n) = @_;
+  $self->[MAX] = $n;
+}
+
+# For internal use only
+# Will be called by the heap structure to notify us that a certain 
+# piece of data has moved from one heap element to another.
+# $k is the hash key of the item
+# $n is the new index into the heap at which it is stored
+# If $n is undefined, the item has been removed from the heap.
+sub _heap_move {
+  my ($self, $k, $n) = @_;
+  if (defined $n) {
+    $self->[HASH]{$k} = $n;
+  } else {
+    delete $self->[HASH]{$k};
+  }
+}
+
+sub insert {
+  my ($self, $key, $val) = @_;
+  local *_;
+  croak "missing argument to ->insert" unless defined $key;
+  unless (defined $self->[MAX]) {
+    confess "undefined max" ;
+  }
+  confess "undefined val" unless defined $val;
+  return if length($val) > $self->[MAX];
+
+#  if ($self->[STAT]) {
+#    $self->[STAT][$key] = 1;
+#    return;
+#  }
+
+  my $oldnode = $self->[HASH]{$key};
+  if (defined $oldnode) {
+    my $oldval = $self->[HEAP]->set_val($oldnode, $val);
+    $self->[BYTES] -= length($oldval);
+  } else {
+    $self->[HEAP]->insert($key, $val);
+  }
+  $self->[BYTES] += length($val);
+  $self->flush if $self->[BYTES] > $self->[MAX];
+}
+
+sub expire {
+  my $self = shift;
+  my $old_data = $self->[HEAP]->popheap;
+  return unless defined $old_data;
+  $self->[BYTES] -= length $old_data;
+  $old_data;
+}
+
+sub remove {
+  my ($self, @keys) = @_;
+  my @result;
+
+#  if ($self->[STAT]) {
+#    for my $key (@keys) {
+#      $self->[STAT][$key] = 0;
+#    }
+#    return;
+#  }
+
+  for my $key (@keys) {
+    next unless exists $self->[HASH]{$key};
+    my $old_data = $self->[HEAP]->remove($self->[HASH]{$key});
+    $self->[BYTES] -= length $old_data;
+    push @result, $old_data;
+  }
+  @result;
+}
+
+sub lookup {
+  my ($self, $key) = @_;
+  local *_;
+  croak "missing argument to ->lookup" unless defined $key;
+
+#  if ($self->[STAT]) {
+#    $self->[MISS]++  if $self->[STAT][$key]++ == 0;
+#    $self->[REQ]++;
+#    my $hit_rate = 1 - $self->[MISS] / $self->[REQ];
+#    # Do some testing to determine this threshhold
+#    $#$self = STAT - 1 if $hit_rate > 0.20; 
+#  }
+
+  if (exists $self->[HASH]{$key}) {
+    $self->[HEAP]->lookup($self->[HASH]{$key});
+  } else {
+    return;
+  }
+}
+
+# For internal use only
+sub _produce {
+  my ($self, $key) = @_;
+  my $loc = $self->[HASH]{$key};
+  return unless defined $loc;
+  $self->[HEAP][$loc][2];
+}
+
+# For internal use only
+sub _promote {
+  my ($self, $key) = @_;
+  $self->[HEAP]->promote($self->[HASH]{$key});
+}
+
+sub empty {
+  my ($self) = @_;
+  %{$self->[HASH]} = ();
+    $self->[BYTES] = 0;
+    $self->[HEAP]->empty;
+#  @{$self->[STAT]} = ();
+#    $self->[MISS] = 0;
+#    $self->[REQ] = 0;
+}
+
+sub is_empty {
+  my ($self) = @_;
+  keys %{$self->[HASH]} == 0;
+}
+
+sub update {
+  my ($self, $key, $val) = @_;
+  local *_;
+  croak "missing argument to ->update" unless defined $key;
+  if (length($val) > $self->[MAX]) {
+    my ($oldval) = $self->remove($key);
+    $self->[BYTES] -= length($oldval) if defined $oldval;
+  } elsif (exists $self->[HASH]{$key}) {
+    my $oldval = $self->[HEAP]->set_val($self->[HASH]{$key}, $val);
+    $self->[BYTES] += length($val);
+    $self->[BYTES] -= length($oldval) if defined $oldval;
+  } else {
+    $self->[HEAP]->insert($key, $val);
+    $self->[BYTES] += length($val);
+  }
+  $self->flush;
+}
+
+sub rekey {
+  my ($self, $okeys, $nkeys) = @_;
+  local *_;
+  my %map;
+  @map{@$okeys} = @$nkeys;
+  croak "missing argument to ->rekey" unless defined $nkeys;
+  croak "length mismatch in ->rekey arguments" unless @$nkeys == @$okeys;
+  my %adjusted;                 # map new keys to heap indices
+  # You should be able to cut this to one loop TODO XXX
+  for (0 .. $#$okeys) {
+    $adjusted{$nkeys->[$_]} = delete $self->[HASH]{$okeys->[$_]};
+  }
+  while (my ($nk, $ix) = each %adjusted) {
+    # @{$self->[HASH]}{keys %adjusted} = values %adjusted;
+    $self->[HEAP]->rekey($ix, $nk);
+    $self->[HASH]{$nk} = $ix;
+  }
+}
+
+sub ckeys {
+  my $self = shift;
+  my @a = keys %{$self->[HASH]};
+  @a;
+}
+
+# Return total amount of cached data
+sub bytes {
+  my $self = shift;
+  $self->[BYTES];
+}
+
+# Expire oldest item from cache until cache size is smaller than $max
+sub reduce_size_to {
+  my ($self, $max) = @_;
+  until ($self->[BYTES] <= $max) {
+    # Note that Tie::File::Cache::expire has been inlined here
+    my $old_data = $self->[HEAP]->popheap;
+    return unless defined $old_data;
+    $self->[BYTES] -= length $old_data;
+  }
+}
+
+# Why not just $self->reduce_size_to($self->[MAX])?
+# Try this when things stabilize   TODO XXX
+# If the cache is too full, expire the oldest records
+sub flush {
+  my $self = shift;
+  $self->reduce_size_to($self->[MAX]) if $self->[BYTES] > $self->[MAX];
+}
+
+# For internal use only
+sub _produce_lru {
+  my $self = shift;
+  $self->[HEAP]->expire_order;
+}
+
+BEGIN { *_ci_warn = \&Tie::File::_ci_warn }
+
+sub _check_integrity {          # For CACHE
+  my $self = shift;
+  my $good = 1;
+
+  # Test HEAP
+  $self->[HEAP]->_check_integrity or $good = 0;
+
+  # Test HASH
+  my $bytes = 0;
+  for my $k (keys %{$self->[HASH]}) {
+    if ($k ne '0' && $k !~ /^[1-9][0-9]*$/) {
+      $good = 0;
+      _ci_warn "Cache hash key <$k> is non-numeric";
+    }
+
+    my $h = $self->[HASH]{$k};
+    if (! defined $h) {
+      $good = 0;
+      _ci_warn "Heap index number for key $k is undefined";
+    } elsif ($h == 0) {
+      $good = 0;
+      _ci_warn "Heap index number for key $k is zero";
+    } else {
+      my $j = $self->[HEAP][$h];
+      if (! defined $j) {
+        $good = 0;
+        _ci_warn "Heap contents key $k (=> $h) are undefined";
+      } else {
+        $bytes += length($j->[2]);
+        if ($k ne $j->[1]) {
+          $good = 0;
+          _ci_warn "Heap contents key $k (=> $h) is $j->[1], should be $k";
+        }
+      }
+    }
+  }
+
+  # Test BYTES
+  if ($bytes != $self->[BYTES]) {
+    $good = 0;
+    _ci_warn "Total data in cache is $bytes, expected $self->[BYTES]";
+  }
+
+  # Test MAX
+  if ($bytes > $self->[MAX]) {
+    $good = 0;
+    _ci_warn "Total data in cache is $bytes, exceeds maximum $self->[MAX]";
+  }
+
+  return $good;
+}
+
+sub delink {
+  my $self = shift;
+  $self->[HEAP] = undef;        # Bye bye heap
+}
+
+################################################################
+#
+# Tie::File::Heap
+#
+# Heap data structure for use by cache LRU routines
+
+package Tie::File::Heap;
+use Carp ':DEFAULT', 'confess';
+$Tie::File::Heap::VERSION = $Tie::File::Cache::VERSION;
+sub SEQ () { 0 };
+sub KEY () { 1 };
+sub DAT () { 2 };
+
+sub new {
+  my ($pack, $cache) = @_;
+  die "$pack: Parent cache object $cache does not support _heap_move method"
+    unless eval { $cache->can('_heap_move') };
+  my $self = [[0,$cache,0]];
+  bless $self => $pack;
+}
+
+# Allocate a new sequence number, larger than all previously allocated numbers
+sub _nseq {
+  my $self = shift;
+  $self->[0][0]++;
+}
+
+sub _cache {
+  my $self = shift;
+  $self->[0][1];
+}
+
+sub _nelts {
+  my $self = shift;
+  $self->[0][2];
+}
+
+sub _nelts_inc {
+  my $self = shift;
+  ++$self->[0][2];
+}  
+
+sub _nelts_dec {
+  my $self = shift;
+  --$self->[0][2];
+}  
+
+sub is_empty {
+  my $self = shift;
+  $self->_nelts == 0;
+}
+
+sub empty {
+  my $self = shift;
+  $#$self = 0;
+  $self->[0][2] = 0;
+  $self->[0][0] = 0;            # might as well reset the sequence numbers
+}
+
+# notify the parent cache object that we moved something
+sub _heap_move {
+  my $self = shift;
+  $self->_cache->_heap_move(@_);
+}
+
+# Insert a piece of data into the heap with the indicated sequence number.
+# The item with the smallest sequence number is always at the top.
+# If no sequence number is specified, allocate a new one and insert the
+# item at the bottom.
+sub insert {
+  my ($self, $key, $data, $seq) = @_;
+  $seq = $self->_nseq unless defined $seq;
+  $self->_insert_new([$seq, $key, $data]);
+}
+
+# Insert a new, fresh item at the bottom of the heap
+sub _insert_new {
+  my ($self, $item) = @_;
+  my $i = @$self;
+  $i = int($i/2) until defined $self->[$i/2];
+  $self->[$i] = $item;
+  $self->[0][1]->_heap_move($self->[$i][KEY], $i);
+  $self->_nelts_inc;
+}
+
+# Insert [$data, $seq] pair at or below item $i in the heap.
+# If $i is omitted, default to 1 (the top element.)
+sub _insert {
+  my ($self, $item, $i) = @_;
+#  $self->_check_loc($i) if defined $i;
+  $i = 1 unless defined $i;
+  until (! defined $self->[$i]) {
+    if ($self->[$i][SEQ] > $item->[SEQ]) { # inserted item is older
+      ($self->[$i], $item) = ($item, $self->[$i]);
+      $self->[0][1]->_heap_move($self->[$i][KEY], $i);
+    }
+    # If either is undefined, go that way.  Otherwise, choose at random
+    my $dir;
+    $dir = 0 if !defined $self->[2*$i];
+    $dir = 1 if !defined $self->[2*$i+1];
+    $dir = int(rand(2)) unless defined $dir;
+    $i = 2*$i + $dir;
+  }
+  $self->[$i] = $item;
+  $self->[0][1]->_heap_move($self->[$i][KEY], $i);
+  $self->_nelts_inc;
+}
+
+# Remove the item at node $i from the heap, moving child items upwards.
+# The item with the smallest sequence number is always at the top.
+# Moving items upwards maintains this condition.
+# Return the removed item.  Return undef if there was no item at node $i.
+sub remove {
+  my ($self, $i) = @_;
+  $i = 1 unless defined $i;
+  my $top = $self->[$i];
+  return unless defined $top;
+  while (1) {
+    my $ii;
+    my ($L, $R) = (2*$i, 2*$i+1);
+
+    # If either is undefined, go the other way.
+    # Otherwise, go towards the smallest.
+    last unless defined $self->[$L] || defined $self->[$R];
+    $ii = $R if not defined $self->[$L];
+    $ii = $L if not defined $self->[$R];
+    unless (defined $ii) {
+      $ii = $self->[$L][SEQ] < $self->[$R][SEQ] ? $L : $R;
+    }
+
+    $self->[$i] = $self->[$ii]; # Promote child to fill vacated spot
+    $self->[0][1]->_heap_move($self->[$i][KEY], $i);
+    $i = $ii; # Fill new vacated spot
+  }
+  $self->[0][1]->_heap_move($top->[KEY], undef);
+  undef $self->[$i];
+  $self->_nelts_dec;
+  return $top->[DAT];
+}
+
+sub popheap {
+  my $self = shift;
+  $self->remove(1);
+}
+
+# set the sequence number of the indicated item to a higher number
+# than any other item in the heap, and bubble the item down to the
+# bottom.
+sub promote {
+  my ($self, $n) = @_;
+#  $self->_check_loc($n);
+  $self->[$n][SEQ] = $self->_nseq;
+  my $i = $n;
+  while (1) {
+    my ($L, $R) = (2*$i, 2*$i+1);
+    my $dir;
+    last unless defined $self->[$L] || defined $self->[$R];
+    $dir = $R unless defined $self->[$L];
+    $dir = $L unless defined $self->[$R];
+    unless (defined $dir) {
+      $dir = $self->[$L][SEQ] < $self->[$R][SEQ] ? $L : $R;
+    }
+    @{$self}[$i, $dir] = @{$self}[$dir, $i];
+    for ($i, $dir) {
+      $self->[0][1]->_heap_move($self->[$_][KEY], $_) if defined $self->[$_];
+    }
+    $i = $dir;
+  }
+}
+
+# Return item $n from the heap, promoting its LRU status
+sub lookup {
+  my ($self, $n) = @_;
+#  $self->_check_loc($n);
+  my $val = $self->[$n];
+  $self->promote($n);
+  $val->[DAT];
+}
+
+
+# Assign a new value for node $n, promoting it to the bottom of the heap
+sub set_val {
+  my ($self, $n, $val) = @_;
+#  $self->_check_loc($n);
+  my $oval = $self->[$n][DAT];
+  $self->[$n][DAT] = $val;
+  $self->promote($n);
+  return $oval;
+}
+
+# The hask key has changed for an item;
+# alter the heap's record of the hash key
+sub rekey {
+  my ($self, $n, $new_key) = @_;
+#  $self->_check_loc($n);
+  $self->[$n][KEY] = $new_key;
+}
+
+sub _check_loc {
+  my ($self, $n) = @_;
+  unless (1 || defined $self->[$n]) {
+    confess "_check_loc($n) failed";
+  }
+}
+
+BEGIN { *_ci_warn = \&Tie::File::_ci_warn }
+
+sub _check_integrity {
+  my $self = shift;
+  my $good = 1;
+  my %seq;
+
+  unless (eval {$self->[0][1]->isa("Tie::File::Cache")}) {
+    _ci_warn "Element 0 of heap corrupt";
+    $good = 0;
+  }
+  $good = 0 unless $self->_satisfies_heap_condition(1);
+  for my $i (2 .. $#{$self}) {
+    my $p = int($i/2);          # index of parent node
+    if (defined $self->[$i] && ! defined $self->[$p]) {
+      _ci_warn "Element $i of heap defined, but parent $p isn't";
+      $good = 0;
+    }
+
+    if (defined $self->[$i]) {
+      if ($seq{$self->[$i][SEQ]}) {
+        my $seq = $self->[$i][SEQ];
+        _ci_warn "Nodes $i and $seq{$seq} both have SEQ=$seq";
+        $good = 0;
+      } else {
+        $seq{$self->[$i][SEQ]} = $i;
+      }
+    }
+  }
+
+  return $good;
+}
+
+sub _satisfies_heap_condition {
+  my $self = shift;
+  my $n = shift || 1;
+  my $good = 1;
+  for (0, 1) {
+    my $c = $n*2 + $_;
+    next unless defined $self->[$c];
+    if ($self->[$n][SEQ] >= $self->[$c]) {
+      _ci_warn "Node $n of heap does not predate node $c";
+      $good = 0 ;
+    }
+    $good = 0 unless $self->_satisfies_heap_condition($c);
+  }
+  return $good;
+}
+
+# Return a list of all the values, sorted by expiration order
+sub expire_order {
+  my $self = shift;
+  my @nodes = sort {$a->[SEQ] <=> $b->[SEQ]} $self->_nodes;
+  map { $_->[KEY] } @nodes;
+}
+
+sub _nodes {
+  my $self = shift;
+  my $i = shift || 1;
+  return unless defined $self->[$i];
+  ($self->[$i], $self->_nodes($i*2), $self->_nodes($i*2+1));
+}
+
+"Cogito, ergo sum.";  # don't forget to return a true value from the file
+
+__END__
+
+=head1 NAME
+
+Tie::File - Access the lines of a disk file via a Perl array
+
+=head1 SYNOPSIS
+
+	# This file documents Tie::File version 0.97
+	use Tie::File;
+
+	tie @array, 'Tie::File', filename or die ...;
+
+	$array[13] = 'blah';     # line 13 of the file is now 'blah'
+	print $array[42];        # display line 42 of the file
+
+	$n_recs = @array;        # how many records are in the file?
+	$#array -= 2;            # chop two records off the end
+
+
+	for (@array) {
+	  s/PERL/Perl/g;         # Replace PERL with Perl everywhere in the file
+	}
+
+	# These are just like regular push, pop, unshift, shift, and splice
+	# Except that they modify the file in the way you would expect
+
+	push @array, new recs...;
+	my $r1 = pop @array;
+	unshift @array, new recs...;
+	my $r2 = shift @array;
+	@old_recs = splice @array, 3, 7, new recs...;
+
+	untie @array;            # all finished
+
+
+=head1 DESCRIPTION
+
+C<Tie::File> represents a regular text file as a Perl array.  Each
+element in the array corresponds to a record in the file.  The first
+line of the file is element 0 of the array; the second line is element
+1, and so on.
+
+The file is I<not> loaded into memory, so this will work even for
+gigantic files.
+
+Changes to the array are reflected in the file immediately.
+
+Lazy people and beginners may now stop reading the manual.
+
+=head2 C<recsep>
+
+What is a 'record'?  By default, the meaning is the same as for the
+C<E<lt>...E<gt>> operator: It's a string terminated by C<$/>, which is
+probably C<"\n">.  (Minor exception: on DOS and Win32 systems, a
+'record' is a string terminated by C<"\r\n">.)  You may change the
+definition of "record" by supplying the C<recsep> option in the C<tie>
+call:
+
+	tie @array, 'Tie::File', $file, recsep => 'es';
+
+This says that records are delimited by the string C<es>.  If the file
+contained the following data:
+
+	Curse these pesky flies!\n
+
+then the C<@array> would appear to have four elements:
+
+	"Curse th"
+	"e p"
+	"ky fli"
+	"!\n"
+
+An undefined value is not permitted as a record separator.  Perl's
+special "paragraph mode" semantics (E<agrave> la C<$/ = "">) are not
+emulated.
+
+Records read from the tied array do not have the record separator
+string on the end; this is to allow
+
+	$array[17] .= "extra";
+
+to work as expected.
+
+(See L<"autochomp">, below.)  Records stored into the array will have
+the record separator string appended before they are written to the
+file, if they don't have one already.  For example, if the record
+separator string is C<"\n">, then the following two lines do exactly
+the same thing:
+
+	$array[17] = "Cherry pie";
+	$array[17] = "Cherry pie\n";
+
+The result is that the contents of line 17 of the file will be
+replaced with "Cherry pie"; a newline character will separate line 17
+from line 18.  This means that this code will do nothing:
+
+	chomp $array[17];
+
+Because the C<chomp>ed value will have the separator reattached when
+it is written back to the file.  There is no way to create a file
+whose trailing record separator string is missing.
+
+Inserting records that I<contain> the record separator string is not
+supported by this module.  It will probably produce a reasonable
+result, but what this result will be may change in a future version.
+Use 'splice' to insert records or to replace one record with several.
+
+=head2 C<autochomp>
+
+Normally, array elements have the record separator removed, so that if
+the file contains the text
+
+	Gold
+	Frankincense
+	Myrrh
+
+the tied array will appear to contain C<("Gold", "Frankincense",
+"Myrrh")>.  If you set C<autochomp> to a false value, the record
+separator will not be removed.  If the file above was tied with
+
+	tie @gifts, "Tie::File", $gifts, autochomp => 0;
+
+then the array C<@gifts> would appear to contain C<("Gold\n",
+"Frankincense\n", "Myrrh\n")>, or (on Win32 systems) C<("Gold\r\n",
+"Frankincense\r\n", "Myrrh\r\n")>.
+
+=head2 C<mode>
+
+Normally, the specified file will be opened for read and write access,
+and will be created if it does not exist.  (That is, the flags
+C<O_RDWR | O_CREAT> are supplied in the C<open> call.)  If you want to
+change this, you may supply alternative flags in the C<mode> option.
+See L<Fcntl> for a listing of available flags.
+For example:
+
+	# open the file if it exists, but fail if it does not exist
+	use Fcntl 'O_RDWR';
+	tie @array, 'Tie::File', $file, mode => O_RDWR;
+
+	# create the file if it does not exist
+	use Fcntl 'O_RDWR', 'O_CREAT';
+	tie @array, 'Tie::File', $file, mode => O_RDWR | O_CREAT;
+
+	# open an existing file in read-only mode
+	use Fcntl 'O_RDONLY';
+	tie @array, 'Tie::File', $file, mode => O_RDONLY;
+
+Opening the data file in write-only or append mode is not supported.
+
+=head2 C<memory>
+
+This is an upper limit on the amount of memory that C<Tie::File> will
+consume at any time while managing the file.  This is used for two
+things: managing the I<read cache> and managing the I<deferred write
+buffer>.
+
+Records read in from the file are cached, to avoid having to re-read
+them repeatedly.  If you read the same record twice, the first time it
+will be stored in memory, and the second time it will be fetched from
+the I<read cache>.  The amount of data in the read cache will not
+exceed the value you specified for C<memory>.  If C<Tie::File> wants
+to cache a new record, but the read cache is full, it will make room
+by expiring the least-recently visited records from the read cache.
+
+The default memory limit is 2Mib.  You can adjust the maximum read
+cache size by supplying the C<memory> option.  The argument is the
+desired cache size, in bytes.
+
+	# I have a lot of memory, so use a large cache to speed up access
+	tie @array, 'Tie::File', $file, memory => 20_000_000;
+
+Setting the memory limit to 0 will inhibit caching; records will be
+fetched from disk every time you examine them.
+
+The C<memory> value is not an absolute or exact limit on the memory
+used.  C<Tie::File> objects contains some structures besides the read
+cache and the deferred write buffer, whose sizes are not charged
+against C<memory>. 
+
+The cache itself consumes about 310 bytes per cached record, so if
+your file has many short records, you may want to decrease the cache
+memory limit, or else the cache overhead may exceed the size of the
+cached data.
+
+
+=head2 C<dw_size>
+
+(This is an advanced feature.  Skip this section on first reading.)
+
+If you use deferred writing (See L<"Deferred Writing">, below) then
+data you write into the array will not be written directly to the
+file; instead, it will be saved in the I<deferred write buffer> to be
+written out later.  Data in the deferred write buffer is also charged
+against the memory limit you set with the C<memory> option.
+
+You may set the C<dw_size> option to limit the amount of data that can
+be saved in the deferred write buffer.  This limit may not exceed the
+total memory limit.  For example, if you set C<dw_size> to 1000 and
+C<memory> to 2500, that means that no more than 1000 bytes of deferred
+writes will be saved up.  The space available for the read cache will
+vary, but it will always be at least 1500 bytes (if the deferred write
+buffer is full) and it could grow as large as 2500 bytes (if the
+deferred write buffer is empty.)
+
+If you don't specify a C<dw_size>, it defaults to the entire memory
+limit.
+
+=head2 Option Format
+
+C<-mode> is a synonym for C<mode>.  C<-recsep> is a synonym for
+C<recsep>.  C<-memory> is a synonym for C<memory>.  You get the
+idea.
+
+=head1 Public Methods
+
+The C<tie> call returns an object, say C<$o>.  You may call
+
+	$rec = $o->FETCH($n);
+	$o->STORE($n, $rec);
+
+to fetch or store the record at line C<$n>, respectively; similarly
+the other tied array methods.  (See L<perltie> for details.)  You may
+also call the following methods on this object:
+
+=head2 C<flock>
+
+	$o->flock(MODE)
+
+will lock the tied file.  C<MODE> has the same meaning as the second
+argument to the Perl built-in C<flock> function; for example
+C<LOCK_SH> or C<LOCK_EX | LOCK_NB>.  (These constants are provided by
+the C<use Fcntl ':flock'> declaration.)
+
+C<MODE> is optional; the default is C<LOCK_EX>.
+
+C<Tie::File> maintains an internal table of the byte offset of each
+record it has seen in the file.  
+
+When you use C<flock> to lock the file, C<Tie::File> assumes that the
+read cache is no longer trustworthy, because another process might
+have modified the file since the last time it was read.  Therefore, a
+successful call to C<flock> discards the contents of the read cache
+and the internal record offset table.
+
+C<Tie::File> promises that the following sequence of operations will
+be safe:
+
+	my $o = tie @array, "Tie::File", $filename;
+	$o->flock;
+
+In particular, C<Tie::File> will I<not> read or write the file during
+the C<tie> call.  (Exception: Using C<mode =E<gt> O_TRUNC> will, of
+course, erase the file during the C<tie> call.  If you want to do this
+safely, then open the file without C<O_TRUNC>, lock the file, and use
+C<@array = ()>.)
+
+The best way to unlock a file is to discard the object and untie the
+array.  It is probably unsafe to unlock the file without also untying
+it, because if you do, changes may remain unwritten inside the object.
+That is why there is no shortcut for unlocking.  If you really want to
+unlock the file prematurely, you know what to do; if you don't know
+what to do, then don't do it.
+
+All the usual warnings about file locking apply here.  In particular,
+note that file locking in Perl is B<advisory>, which means that
+holding a lock will not prevent anyone else from reading, writing, or
+erasing the file; it only prevents them from getting another lock at
+the same time.  Locks are analogous to green traffic lights: If you
+have a green light, that does not prevent the idiot coming the other
+way from plowing into you sideways; it merely guarantees to you that
+the idiot does not also have a green light at the same time.
+
+=head2 C<autochomp>
+
+	my $old_value = $o->autochomp(0);    # disable autochomp option
+	my $old_value = $o->autochomp(1);    #  enable autochomp option
+
+	my $ac = $o->autochomp();   # recover current value
+
+See L<"autochomp">, above.
+
+=head2 C<defer>, C<flush>, C<discard>, and C<autodefer>
+
+See L<"Deferred Writing">, below.
+
+=head2 C<offset>
+
+	$off = $o->offset($n);
+
+This method returns the byte offset of the start of the C<$n>th record
+in the file.  If there is no such record, it returns an undefined
+value.
+
+=head1 Tying to an already-opened filehandle
+
+If C<$fh> is a filehandle, such as is returned by C<IO::File> or one
+of the other C<IO> modules, you may use:
+
+	tie @array, 'Tie::File', $fh, ...;
+
+Similarly if you opened that handle C<FH> with regular C<open> or
+C<sysopen>, you may use:
+
+	tie @array, 'Tie::File', \*FH, ...;
+
+Handles that were opened write-only won't work.  Handles that were
+opened read-only will work as long as you don't try to modify the
+array.  Handles must be attached to seekable sources of data---that
+means no pipes or sockets.  If C<Tie::File> can detect that you
+supplied a non-seekable handle, the C<tie> call will throw an
+exception.  (On Unix systems, it can detect this.)
+
+Note that Tie::File will only close any filehandles that it opened
+internally.  If you passed it a filehandle as above, you "own" the
+filehandle, and are responsible for closing it after you have untied
+the @array.
+
+=head1 Deferred Writing
+
+(This is an advanced feature.  Skip this section on first reading.)
+
+Normally, modifying a C<Tie::File> array writes to the underlying file
+immediately.  Every assignment like C<$a[3] = ...> rewrites as much of
+the file as is necessary; typically, everything from line 3 through
+the end will need to be rewritten.  This is the simplest and most
+transparent behavior.  Performance even for large files is reasonably
+good.
+
+However, under some circumstances, this behavior may be excessively
+slow.  For example, suppose you have a million-record file, and you
+want to do:
+
+	for (@FILE) {
+	  $_ = "> $_";
+	}
+
+The first time through the loop, you will rewrite the entire file,
+from line 0 through the end.  The second time through the loop, you
+will rewrite the entire file from line 1 through the end.  The third
+time through the loop, you will rewrite the entire file from line 2 to
+the end.  And so on.
+
+If the performance in such cases is unacceptable, you may defer the
+actual writing, and then have it done all at once.  The following loop
+will perform much better for large files:
+
+	(tied @a)->defer;
+	for (@a) {
+	  $_ = "> $_";
+	}
+	(tied @a)->flush;
+
+If C<Tie::File>'s memory limit is large enough, all the writing will
+done in memory.  Then, when you call C<-E<gt>flush>, the entire file
+will be rewritten in a single pass.
+
+(Actually, the preceding discussion is something of a fib.  You don't
+need to enable deferred writing to get good performance for this
+common case, because C<Tie::File> will do it for you automatically
+unless you specifically tell it not to.  See L<"autodeferring">,
+below.)
+
+Calling C<-E<gt>flush> returns the array to immediate-write mode.  If
+you wish to discard the deferred writes, you may call C<-E<gt>discard>
+instead of C<-E<gt>flush>.  Note that in some cases, some of the data
+will have been written already, and it will be too late for
+C<-E<gt>discard> to discard all the changes.  Support for
+C<-E<gt>discard> may be withdrawn in a future version of C<Tie::File>.
+
+Deferred writes are cached in memory up to the limit specified by the
+C<dw_size> option (see above).  If the deferred-write buffer is full
+and you try to write still more deferred data, the buffer will be
+flushed.  All buffered data will be written immediately, the buffer
+will be emptied, and the now-empty space will be used for future
+deferred writes.
+
+If the deferred-write buffer isn't yet full, but the total size of the
+buffer and the read cache would exceed the C<memory> limit, the oldest
+records will be expired from the read cache until the total size is
+under the limit.
+
+C<push>, C<pop>, C<shift>, C<unshift>, and C<splice> cannot be
+deferred.  When you perform one of these operations, any deferred data
+is written to the file and the operation is performed immediately.
+This may change in a future version.
+
+If you resize the array with deferred writing enabled, the file will
+be resized immediately, but deferred records will not be written.
+This has a surprising consequence: C<@a = (...)> erases the file
+immediately, but the writing of the actual data is deferred.  This
+might be a bug.  If it is a bug, it will be fixed in a future version.
+
+=head2 Autodeferring
+
+C<Tie::File> tries to guess when deferred writing might be helpful,
+and to turn it on and off automatically. 
+
+	for (@a) {
+	  $_ = "> $_";
+	}
+
+In this example, only the first two assignments will be done
+immediately; after this, all the changes to the file will be deferred
+up to the user-specified memory limit.
+
+You should usually be able to ignore this and just use the module
+without thinking about deferring.  However, special applications may
+require fine control over which writes are deferred, or may require
+that all writes be immediate.  To disable the autodeferment feature,
+use
+
+	(tied @o)->autodefer(0);
+
+or
+
+       	tie @array, 'Tie::File', $file, autodefer => 0;
+
+
+Similarly, C<-E<gt>autodefer(1)> re-enables autodeferment, and 
+C<-E<gt>autodefer()> recovers the current value of the autodefer setting.
+
+
+=head1 CONCURRENT ACCESS TO FILES
+
+Caching and deferred writing are inappropriate if you want the same
+file to be accessed simultaneously from more than one process.  Other
+optimizations performed internally by this module are also
+incompatible with concurrent access.  A future version of this module will
+support a C<concurrent =E<gt> 1> option that enables safe concurrent access.
+
+Previous versions of this documentation suggested using C<memory
+=E<gt> 0> for safe concurrent access.  This was mistaken.  Tie::File
+will not support safe concurrent access before version 0.98.
+
+=head1 CAVEATS
+
+(That's Latin for 'warnings'.)
+
+=over 4
+
+=item *
+
+Reasonable effort was made to make this module efficient.  Nevertheless,
+changing the size of a record in the middle of a large file will
+always be fairly slow, because everything after the new record must be
+moved.
+
+=item *
+
+The behavior of tied arrays is not precisely the same as for regular
+arrays.  For example:
+
+	# This DOES print "How unusual!"
+	undef $a[10];  print "How unusual!\n" if defined $a[10];
+
+C<undef>-ing a C<Tie::File> array element just blanks out the
+corresponding record in the file.  When you read it back again, you'll
+get the empty string, so the supposedly-C<undef>'ed value will be
+defined.  Similarly, if you have C<autochomp> disabled, then
+
+	# This DOES print "How unusual!" if 'autochomp' is disabled
+	undef $a[10];
+        print "How unusual!\n" if $a[10];
+
+Because when C<autochomp> is disabled, C<$a[10]> will read back as
+C<"\n"> (or whatever the record separator string is.)  
+
+There are other minor differences, particularly regarding C<exists>
+and C<delete>, but in general, the correspondence is extremely close.
+
+=item *
+
+I have supposed that since this module is concerned with file I/O,
+almost all normal use of it will be heavily I/O bound.  This means
+that the time to maintain complicated data structures inside the
+module will be dominated by the time to actually perform the I/O.
+When there was an opportunity to spend CPU time to avoid doing I/O, I
+usually tried to take it.
+
+=item *
+
+You might be tempted to think that deferred writing is like
+transactions, with C<flush> as C<commit> and C<discard> as
+C<rollback>, but it isn't, so don't.
+
+=item *
+
+There is a large memory overhead for each record offset and for each
+cache entry: about 310 bytes per cached data record, and about 21 bytes per offset table entry.
+
+The per-record overhead will limit the maximum number of records you
+can access per file. Note that I<accessing> the length of the array
+via C<$x = scalar @tied_file> accesses B<all> records and stores their
+offsets.  The same for C<foreach (@tied_file)>, even if you exit the
+loop early.
+
+=back
+
+=head1 SUBCLASSING
+
+This version promises absolutely nothing about the internals, which
+may change without notice.  A future version of the module will have a
+well-defined and stable subclassing API.
+
+=head1 WHAT ABOUT C<DB_File>?
+
+People sometimes point out that L<DB_File> will do something similar,
+and ask why C<Tie::File> module is necessary.
+
+There are a number of reasons that you might prefer C<Tie::File>.
+A list is available at C<http://perl.plover.com/TieFile/why-not-DB_File>.
+
+=head1 AUTHOR
+
+Mark Jason Dominus
+
+To contact the author, send email to: C<mjd-perl-tiefile+@plover.com>
+
+To receive an announcement whenever a new version of this module is
+released, send a blank email message to
+C<mjd-perl-tiefile-subscribe@plover.com>.
+
+The most recent version of this module, including documentation and
+any news of importance, will be available at
+
+	http://perl.plover.com/TieFile/
+
+
+=head1 LICENSE
+
+C<Tie::File> version 0.97 is copyright (C) 2003 Mark Jason Dominus.
+
+This library is free software; you may redistribute it and/or modify
+it under the same terms as Perl itself.
+
+These terms are your choice of any of (1) the Perl Artistic Licence,
+or (2) version 2 of the GNU General Public License as published by the
+Free Software Foundation, or (3) any later version of the GNU General
+Public License.
+
+This library 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 library program; it should be in the file C<COPYING>.
+If not, write to the Free Software Foundation, Inc., 59 Temple Place,
+Suite 330, Boston, MA 02111 USA
+
+For licensing inquiries, contact the author at:
+
+	Mark Jason Dominus
+	255 S. Warnock St.
+	Philadelphia, PA 19107
+
+=head1 WARRANTY
+
+C<Tie::File> version 0.97 comes with ABSOLUTELY NO WARRANTY.
+For details, see the license.
+
+=head1 THANKS
+
+Gigantic thanks to Jarkko Hietaniemi, for agreeing to put this in the
+core when I hadn't written it yet, and for generally being helpful,
+supportive, and competent.  (Usually the rule is "choose any one.")
+Also big thanks to Abhijit Menon-Sen for all of the same things.
+
+Special thanks to Craig Berry and Peter Prymmer (for VMS portability
+help), Randy Kobes (for Win32 portability help), Clinton Pierce and
+Autrijus Tang (for heroic eleventh-hour Win32 testing above and beyond
+the call of duty), Michael G Schwern (for testing advice), and the
+rest of the CPAN testers (for testing generally).
+
+Special thanks to Tels for suggesting several speed and memory
+optimizations.
+
+Additional thanks to:
+Edward Avis /
+Mattia Barbon /
+Tom Christiansen /
+Gerrit Haase /
+Gurusamy Sarathy /
+Jarkko Hietaniemi (again) /
+Nikola Knezevic /
+John Kominetz /
+Nick Ing-Simmons /
+Tassilo von Parseval /
+H. Dieter Pearcey /
+Slaven Rezic /
+Eric Roode /
+Peter Scott /
+Peter Somu /
+Autrijus Tang (again) /
+Tels (again) /
+Juerd Waalboer
+
+=head1 TODO
+
+More tests.  (Stuff I didn't think of yet.)
+
+Paragraph mode?
+
+Fixed-length mode.  Leave-blanks mode.
+
+Maybe an autolocking mode?
+
+For many common uses of the module, the read cache is a liability.
+For example, a program that inserts a single record, or that scans the
+file once, will have a cache hit rate of zero.  This suggests a major
+optimization: The cache should be initially disabled.  Here's a hybrid
+approach: Initially, the cache is disabled, but the cache code
+maintains statistics about how high the hit rate would be *if* it were
+enabled.  When it sees the hit rate get high enough, it enables
+itself.  The STAT comments in this code are the beginning of an
+implementation of this.
+
+Record locking with fcntl()?  Then the module might support an undo
+log and get real transactions.  What a tour de force that would be.
+
+Keeping track of the highest cached record. This would allow reads-in-a-row
+to skip the cache lookup faster (if reading from 1..N with empty cache at
+start, the last cached value will be always N-1).
+
+More tests.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Tie/Handle.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Tie/Handle.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Tie/Handle.pm	(revision 14489)
@@ -0,0 +1,234 @@
+package Tie::Handle;
+
+use 5.006_001;
+our $VERSION = '4.1';
+
+=head1 NAME
+
+Tie::Handle, Tie::StdHandle  - base class definitions for tied handles
+
+=head1 SYNOPSIS
+
+    package NewHandle;
+    require Tie::Handle;
+
+    @ISA = qw(Tie::Handle);
+
+    sub READ { ... }		# Provide a needed method
+    sub TIEHANDLE { ... }	# Overrides inherited method
+
+
+    package main;
+
+    tie *FH, 'NewHandle';
+
+=head1 DESCRIPTION
+
+This module provides some skeletal methods for handle-tying classes. See
+L<perltie> for a list of the functions required in tying a handle to a package.
+The basic B<Tie::Handle> package provides a C<new> method, as well as methods
+C<TIEHANDLE>, C<PRINT>, C<PRINTF> and C<GETC>. 
+
+For developers wishing to write their own tied-handle classes, the methods
+are summarized below. The L<perltie> section not only documents these, but
+has sample code as well:
+
+=over 4
+
+=item TIEHANDLE classname, LIST
+
+The method invoked by the command C<tie *glob, classname>. Associates a new
+glob instance with the specified class. C<LIST> would represent additional
+arguments (along the lines of L<AnyDBM_File> and compatriots) needed to
+complete the association.
+
+=item WRITE this, scalar, length, offset
+
+Write I<length> bytes of data from I<scalar> starting at I<offset>.
+
+=item PRINT this, LIST
+
+Print the values in I<LIST>
+
+=item PRINTF this, format, LIST
+
+Print the values in I<LIST> using I<format>
+
+=item READ this, scalar, length, offset
+
+Read I<length> bytes of data into I<scalar> starting at I<offset>.
+
+=item READLINE this
+
+Read a single line
+
+=item GETC this
+
+Get a single character
+
+=item CLOSE this
+
+Close the handle
+
+=item OPEN this, filename
+
+(Re-)open the handle
+
+=item BINMODE this
+
+Specify content is binary
+
+=item EOF this
+
+Test for end of file.
+
+=item TELL this
+
+Return position in the file.
+
+=item SEEK this, offset, whence
+
+Position the file.
+
+Test for end of file.
+
+=item DESTROY this
+
+Free the storage associated with the tied handle referenced by I<this>.
+This is rarely needed, as Perl manages its memory quite well. But the
+option exists, should a class wish to perform specific actions upon the
+destruction of an instance.
+
+=back
+
+=head1 MORE INFORMATION
+
+The L<perltie> section contains an example of tying handles.
+
+=head1 COMPATIBILITY
+
+This version of Tie::Handle is neither related to nor compatible with
+the Tie::Handle (3.0) module available on CPAN. It was due to an
+accident that two modules with the same name appeared. The namespace
+clash has been cleared in favor of this module that comes with the
+perl core in September 2000 and accordingly the version number has
+been bumped up to 4.0.
+
+=cut
+
+use Carp;
+use warnings::register;
+
+sub new {
+    my $pkg = shift;
+    $pkg->TIEHANDLE(@_);
+}
+
+# "Grandfather" the new, a la Tie::Hash
+
+sub TIEHANDLE {
+    my $pkg = shift;
+    if (defined &{"{$pkg}::new"}) {
+	warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing");
+	$pkg->new(@_);
+    }
+    else {
+	croak "$pkg doesn't define a TIEHANDLE method";
+    }
+}
+
+sub PRINT {
+    my $self = shift;
+    if($self->can('WRITE') != \&WRITE) {
+	my $buf = join(defined $, ? $, : "",@_);
+	$buf .= $\ if defined $\;
+	$self->WRITE($buf,length($buf),0);
+    }
+    else {
+	croak ref($self)," doesn't define a PRINT method";
+    }
+}
+
+sub PRINTF {
+    my $self = shift;
+    
+    if($self->can('WRITE') != \&WRITE) {
+	my $buf = sprintf(shift,@_);
+	$self->WRITE($buf,length($buf),0);
+    }
+    else {
+	croak ref($self)," doesn't define a PRINTF method";
+    }
+}
+
+sub READLINE {
+    my $pkg = ref $_[0];
+    croak "$pkg doesn't define a READLINE method";
+}
+
+sub GETC {
+    my $self = shift;
+    
+    if($self->can('READ') != \&READ) {
+	my $buf;
+	$self->READ($buf,1);
+	return $buf;
+    }
+    else {
+	croak ref($self)," doesn't define a GETC method";
+    }
+}
+
+sub READ {
+    my $pkg = ref $_[0];
+    croak "$pkg doesn't define a READ method";
+}
+
+sub WRITE {
+    my $pkg = ref $_[0];
+    croak "$pkg doesn't define a WRITE method";
+}
+
+sub CLOSE {
+    my $pkg = ref $_[0];
+    croak "$pkg doesn't define a CLOSE method";
+}
+
+package Tie::StdHandle; 
+our @ISA = 'Tie::Handle';
+use Carp;
+
+sub TIEHANDLE 
+{
+ my $class = shift;
+ my $fh    = \do { local *HANDLE};
+ bless $fh,$class;
+ $fh->OPEN(@_) if (@_);
+ return $fh;
+}
+
+sub EOF     { eof($_[0]) }
+sub TELL    { tell($_[0]) }
+sub FILENO  { fileno($_[0]) }
+sub SEEK    { seek($_[0],$_[1],$_[2]) }
+sub CLOSE   { close($_[0]) }
+sub BINMODE { binmode($_[0]) }
+
+sub OPEN
+{
+ $_[0]->CLOSE if defined($_[0]->FILENO);
+ @_ == 2 ? open($_[0], $_[1]) : open($_[0], $_[1], $_[2]);
+}
+
+sub READ     { read($_[0],$_[1],$_[2]) }
+sub READLINE { my $fh = $_[0]; <$fh> }
+sub GETC     { getc($_[0]) }
+
+sub WRITE
+{
+ my $fh = $_[0];
+ print $fh substr($_[1],0,$_[2])
+}
+
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Tie/Hash.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Tie/Hash.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Tie/Hash.pm	(revision 14489)
@@ -0,0 +1,257 @@
+package Tie::Hash;
+
+our $VERSION = '1.02';
+
+=head1 NAME
+
+Tie::Hash, Tie::StdHash, Tie::ExtraHash - base class definitions for tied hashes
+
+=head1 SYNOPSIS
+
+    package NewHash;
+    require Tie::Hash;
+
+    @ISA = (Tie::Hash);
+
+    sub DELETE { ... }		# Provides needed method
+    sub CLEAR { ... }		# Overrides inherited method
+
+
+    package NewStdHash;
+    require Tie::Hash;
+
+    @ISA = (Tie::StdHash);
+
+    # All methods provided by default, define only those needing overrides
+    # Accessors access the storage in %{$_[0]};
+    # TIEHASH should return a reference to the actual storage
+    sub DELETE { ... }
+
+    package NewExtraHash;
+    require Tie::Hash;
+
+    @ISA = (Tie::ExtraHash);
+
+    # All methods provided by default, define only those needing overrides
+    # Accessors access the storage in %{$_[0][0]};
+    # TIEHASH should return an array reference with the first element being
+    # the reference to the actual storage 
+    sub DELETE { 
+      $_[0][1]->('del', $_[0][0], $_[1]); # Call the report writer
+      delete $_[0][0]->{$_[1]};		  #  $_[0]->SUPER::DELETE($_[1])
+    }
+
+
+    package main;
+
+    tie %new_hash, 'NewHash';
+    tie %new_std_hash, 'NewStdHash';
+    tie %new_extra_hash, 'NewExtraHash',
+	sub {warn "Doing \U$_[1]\E of $_[2].\n"};
+
+=head1 DESCRIPTION
+
+This module provides some skeletal methods for hash-tying classes. See
+L<perltie> for a list of the functions required in order to tie a hash
+to a package. The basic B<Tie::Hash> package provides a C<new> method, as well
+as methods C<TIEHASH>, C<EXISTS> and C<CLEAR>. The B<Tie::StdHash> and
+B<Tie::ExtraHash> packages
+provide most methods for hashes described in L<perltie> (the exceptions
+are C<UNTIE> and C<DESTROY>).  They cause tied hashes to behave exactly like standard hashes,
+and allow for selective overwriting of methods.  B<Tie::Hash> grandfathers the
+C<new> method: it is used if C<TIEHASH> is not defined
+in the case a class forgets to include a C<TIEHASH> method.
+
+For developers wishing to write their own tied hashes, the required methods
+are briefly defined below. See the L<perltie> section for more detailed
+descriptive, as well as example code:
+
+=over 4
+
+=item TIEHASH classname, LIST
+
+The method invoked by the command C<tie %hash, classname>. Associates a new
+hash instance with the specified class. C<LIST> would represent additional
+arguments (along the lines of L<AnyDBM_File> and compatriots) needed to
+complete the association.
+
+=item STORE this, key, value
+
+Store datum I<value> into I<key> for the tied hash I<this>.
+
+=item FETCH this, key
+
+Retrieve the datum in I<key> for the tied hash I<this>.
+
+=item FIRSTKEY this
+
+Return the first key in the hash.
+
+=item NEXTKEY this, lastkey
+
+Return the next key in the hash.
+
+=item EXISTS this, key
+
+Verify that I<key> exists with the tied hash I<this>.
+
+The B<Tie::Hash> implementation is a stub that simply croaks.
+
+=item DELETE this, key
+
+Delete the key I<key> from the tied hash I<this>.
+
+=item CLEAR this
+
+Clear all values from the tied hash I<this>.
+
+=item SCALAR this
+
+Returns what evaluating the hash in scalar context yields.
+
+B<Tie::Hash> does not implement this method (but B<Tie::StdHash>
+and B<Tie::ExtraHash> do).
+
+=back
+
+=head1 Inheriting from B<Tie::StdHash>
+
+The accessor methods assume that the actual storage for the data in the tied
+hash is in the hash referenced by C<tied(%tiedhash)>.  Thus overwritten
+C<TIEHASH> method should return a hash reference, and the remaining methods
+should operate on the hash referenced by the first argument:
+
+  package ReportHash;
+  our @ISA = 'Tie::StdHash';
+
+  sub TIEHASH  {
+    my $storage = bless {}, shift;
+    warn "New ReportHash created, stored in $storage.\n";
+    $storage
+  }
+  sub STORE    {
+    warn "Storing data with key $_[1] at $_[0].\n";
+    $_[0]{$_[1]} = $_[2]
+  }
+
+
+=head1 Inheriting from B<Tie::ExtraHash>
+
+The accessor methods assume that the actual storage for the data in the tied
+hash is in the hash referenced by C<(tied(%tiedhash))-E<gt>[0]>.  Thus overwritten
+C<TIEHASH> method should return an array reference with the first
+element being a hash reference, and the remaining methods should operate on the
+hash C<< %{ $_[0]->[0] } >>:
+
+  package ReportHash;
+  our @ISA = 'Tie::ExtraHash';
+
+  sub TIEHASH  {
+    my $class = shift;
+    my $storage = bless [{}, @_], $class;
+    warn "New ReportHash created, stored in $storage.\n";
+    $storage;
+  }
+  sub STORE    {
+    warn "Storing data with key $_[1] at $_[0].\n";
+    $_[0][0]{$_[1]} = $_[2]
+  }
+
+The default C<TIEHASH> method stores "extra" arguments to tie() starting
+from offset 1 in the array referenced by C<tied(%tiedhash)>; this is the
+same storage algorithm as in TIEHASH subroutine above.  Hence, a typical
+package inheriting from B<Tie::ExtraHash> does not need to overwrite this
+method.
+
+=head1 C<SCALAR>, C<UNTIE> and C<DESTROY>
+
+The methods C<UNTIE> and C<DESTROY> are not defined in B<Tie::Hash>,
+B<Tie::StdHash>, or B<Tie::ExtraHash>.  Tied hashes do not require
+presence of these methods, but if defined, the methods will be called in
+proper time, see L<perltie>.
+
+C<SCALAR> is only defined in B<Tie::StdHash> and B<Tie::ExtraHash>.
+
+If needed, these methods should be defined by the package inheriting from
+B<Tie::Hash>, B<Tie::StdHash>, or B<Tie::ExtraHash>. See L<pertie/"SCALAR">
+to find out what happens when C<SCALAR> does not exist.
+
+=head1 MORE INFORMATION
+
+The packages relating to various DBM-related implementations (F<DB_File>,
+F<NDBM_File>, etc.) show examples of general tied hashes, as does the
+L<Config> module. While these do not utilize B<Tie::Hash>, they serve as
+good working examples.
+
+=cut
+
+use Carp;
+use warnings::register;
+
+sub new {
+    my $pkg = shift;
+    $pkg->TIEHASH(@_);
+}
+
+# Grandfather "new"
+
+sub TIEHASH {
+    my $pkg = shift;
+    if (defined &{"${pkg}::new"}) {
+	warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHASH is missing");
+	$pkg->new(@_);
+    }
+    else {
+	croak "$pkg doesn't define a TIEHASH method";
+    }
+}
+
+sub EXISTS {
+    my $pkg = ref $_[0];
+    croak "$pkg doesn't define an EXISTS method";
+}
+
+sub CLEAR {
+    my $self = shift;
+    my $key = $self->FIRSTKEY(@_);
+    my @keys;
+
+    while (defined $key) {
+	push @keys, $key;
+	$key = $self->NEXTKEY(@_, $key);
+    }
+    foreach $key (@keys) {
+	$self->DELETE(@_, $key);
+    }
+}
+
+# The Tie::StdHash package implements standard perl hash behaviour.
+# It exists to act as a base class for classes which only wish to
+# alter some parts of their behaviour.
+
+package Tie::StdHash;
+# @ISA = qw(Tie::Hash);		# would inherit new() only
+
+sub TIEHASH  { bless {}, $_[0] }
+sub STORE    { $_[0]->{$_[1]} = $_[2] }
+sub FETCH    { $_[0]->{$_[1]} }
+sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]} }
+sub NEXTKEY  { each %{$_[0]} }
+sub EXISTS   { exists $_[0]->{$_[1]} }
+sub DELETE   { delete $_[0]->{$_[1]} }
+sub CLEAR    { %{$_[0]} = () }
+sub SCALAR   { scalar %{$_[0]} }
+
+package Tie::ExtraHash;
+
+sub TIEHASH  { my $p = shift; bless [{}, @_], $p }
+sub STORE    { $_[0][0]{$_[1]} = $_[2] }
+sub FETCH    { $_[0][0]{$_[1]} }
+sub FIRSTKEY { my $a = scalar keys %{$_[0][0]}; each %{$_[0][0]} }
+sub NEXTKEY  { each %{$_[0][0]} }
+sub EXISTS   { exists $_[0][0]->{$_[1]} }
+sub DELETE   { delete $_[0][0]->{$_[1]} }
+sub CLEAR    { %{$_[0][0]} = () }
+sub SCALAR   { scalar %{$_[0][0]} }
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Tie/Memoize.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Tie/Memoize.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Tie/Memoize.pm	(revision 14489)
@@ -0,0 +1,128 @@
+use strict;
+package Tie::Memoize;
+use Tie::Hash;
+our @ISA = 'Tie::ExtraHash';
+our $VERSION = '1.0';
+
+our $exists_token = \undef;
+
+sub croak {require Carp; goto &Carp::croak}
+
+# Format: [0: STORAGE, 1: EXISTS-CACHE, 2: FETCH_function;
+#	   3: EXISTS_function, 4: DATA, 5: EXISTS_different ]
+
+sub FETCH {
+  my ($h,$key) = ($_[0][0], $_[1]);
+  my $res = $h->{$key};
+  return $res if defined $res;	# Shortcut if accessible
+  return $res if exists $h->{$key}; # Accessible, but undef
+  my $cache = $_[0][1]{$key};
+  return if defined $cache and not $cache; # Known to not exist
+  my @res = $_[0][2]->($key, $_[0][4]);	# Autoload
+  $_[0][1]{$key} = 0, return unless @res; # Cache non-existence
+  delete $_[0][1]{$key};	# Clear existence cache, not needed any more
+  $_[0][0]{$key} = $res[0];	# Store data and return
+}
+
+sub EXISTS   {
+  my ($a,$key) = (shift, shift);
+  return 1 if exists $a->[0]{$key}; # Have data
+  my $cache = $a->[1]{$key};
+  return $cache if defined $cache; # Existence cache
+  my @res = $a->[3]($key,$a->[4]);
+  $_[0][1]{$key} = 0, return unless @res; # Cache non-existence
+  # Now we know it exists
+  return ($_[0][1]{$key} = 1) if $a->[5]; # Only existence reported
+  # Now know the value
+  $_[0][0]{$key} = $res[0];	# Store data
+  return 1
+}
+
+sub TIEHASH  {
+  croak 'syntax: tie %hash, \'Tie::AutoLoad\', \&fetch_subr' if @_ < 2;
+  croak 'syntax: tie %hash, \'Tie::AutoLoad\', \&fetch_subr, $data, \&exists_subr, \%data_cache, \%existence_cache' if @_ > 6;
+  push @_, undef if @_ < 3;	# Data
+  push @_, $_[1] if @_ < 4;	# exists
+  push @_, {} while @_ < 6;	# initial value and caches
+  bless [ @_[4,5,1,3,2], $_[1] ne $_[3]], $_[0]
+}
+
+1;
+
+=head1 NAME
+
+Tie::Memoize - add data to hash when needed
+
+=head1 SYNOPSIS
+
+  require Tie::Memoize;
+  tie %hash, 'Tie::Memoize',
+      \&fetch,			# The rest is optional
+      $DATA, \&exists,
+      {%ini_value}, {%ini_existence};
+
+=head1 DESCRIPTION
+
+This package allows a tied hash to autoload its values on the first access,
+and to use the cached value on the following accesses.
+
+Only read-accesses (via fetching the value or C<exists>) result in calls to
+the functions; the modify-accesses are performed as on a normal hash.
+
+The required arguments during C<tie> are the hash, the package, and
+the reference to the C<FETCH>ing function.  The optional arguments are
+an arbitrary scalar $data, the reference to the C<EXISTS> function,
+and initial values of the hash and of the existence cache.
+
+Both the C<FETCH>ing function and the C<EXISTS> functions have the
+same signature: the arguments are C<$key, $data>; $data is the same
+value as given as argument during tie()ing.  Both functions should
+return an empty list if the value does not exist.  If C<EXISTS>
+function is different from the C<FETCH>ing function, it should return
+a TRUE value on success.  The C<FETCH>ing function should return the
+intended value if the key is valid.
+
+=head1 Inheriting from B<Tie::Memoize>
+
+The structure of the tied() data is an array reference with elements
+
+  0:  cache of known values
+  1:  cache of known existence of keys
+  2:  FETCH  function
+  3:  EXISTS function
+  4:  $data
+
+The rest is for internal usage of this package.  In particular, if
+TIEHASH is overwritten, it should call SUPER::TIEHASH.
+
+=head1 EXAMPLE
+
+  sub slurp {
+    my ($key, $dir) = shift;
+    open my $h, '<', "$dir/$key" or return;
+    local $/; <$h>			# slurp it all
+  }
+  sub exists { my ($key, $dir) = shift; return -f "$dir/$key" }
+
+  tie %hash, 'Tie::Memoize', \&slurp, $directory, \&exists,
+      { fake_file1 => $content1, fake_file2 => $content2 },
+      { pretend_does_not_exists => 0, known_to_exist => 1 };
+
+This example treats the slightly modified contents of $directory as a
+hash.  The modifications are that the keys F<fake_file1> and
+F<fake_file2> fetch values $content1 and $content2, and
+F<pretend_does_not_exists> will never be accessed.  Additionally, the
+existence of F<known_to_exist> is never checked (so if it does not
+exists when its content is needed, the user of %hash may be confused).
+
+=head1 BUGS
+
+FIRSTKEY and NEXTKEY methods go through the keys which were already read,
+not all the possible keys of the hash.
+
+=head1 AUTHOR
+
+Ilya Zakharevich L<mailto:perl-module-hash-memoize@ilyaz.org>.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Tie/RefHash.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Tie/RefHash.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Tie/RefHash.pm	(revision 14489)
@@ -0,0 +1,170 @@
+package Tie::RefHash;
+
+our $VERSION = 1.32;
+
+=head1 NAME
+
+Tie::RefHash - use references as hash keys
+
+=head1 SYNOPSIS
+
+    require 5.004;
+    use Tie::RefHash;
+    tie HASHVARIABLE, 'Tie::RefHash', LIST;
+    tie HASHVARIABLE, 'Tie::RefHash::Nestable', LIST;
+
+    untie HASHVARIABLE;
+
+=head1 DESCRIPTION
+
+This module provides the ability to use references as hash keys if you
+first C<tie> the hash variable to this module.  Normally, only the
+keys of the tied hash itself are preserved as references; to use
+references as keys in hashes-of-hashes, use Tie::RefHash::Nestable,
+included as part of Tie::RefHash.
+
+It is implemented using the standard perl TIEHASH interface.  Please
+see the C<tie> entry in perlfunc(1) and perltie(1) for more information.
+
+The Nestable version works by looking for hash references being stored
+and converting them to tied hashes so that they too can have
+references as keys.  This will happen without warning whenever you
+store a reference to one of your own hashes in the tied hash.
+
+=head1 EXAMPLE
+
+    use Tie::RefHash;
+    tie %h, 'Tie::RefHash';
+    $a = [];
+    $b = {};
+    $c = \*main;
+    $d = \"gunk";
+    $e = sub { 'foo' };
+    %h = ($a => 1, $b => 2, $c => 3, $d => 4, $e => 5);
+    $a->[0] = 'foo';
+    $b->{foo} = 'bar';
+    for (keys %h) {
+       print ref($_), "\n";
+    }
+
+    tie %h, 'Tie::RefHash::Nestable';
+    $h{$a}->{$b} = 1;
+    for (keys %h, keys %{$h{$a}}) {
+       print ref($_), "\n";
+    }
+
+=head1 AUTHOR
+
+Gurusamy Sarathy        gsar@activestate.com
+
+'Nestable' by Ed Avis   ed@membled.com
+
+=head1 VERSION
+
+Version 1.32
+
+=head1 SEE ALSO
+
+perl(1), perlfunc(1), perltie(1)
+
+=cut
+
+use Tie::Hash;
+use vars '@ISA';
+@ISA = qw(Tie::Hash);
+use strict;
+
+require overload; # to support objects with overloaded ""
+
+sub TIEHASH {
+  my $c = shift;
+  my $s = [];
+  bless $s, $c;
+  while (@_) {
+    $s->STORE(shift, shift);
+  }
+  return $s;
+}
+
+sub FETCH {
+  my($s, $k) = @_;
+  if (ref $k) {
+      my $kstr = overload::StrVal($k);
+      if (defined $s->[0]{$kstr}) {
+        $s->[0]{$kstr}[1];
+      }
+      else {
+        undef;
+      }
+  }
+  else {
+      $s->[1]{$k};
+  }
+}
+
+sub STORE {
+  my($s, $k, $v) = @_;
+  if (ref $k) {
+    $s->[0]{overload::StrVal($k)} = [$k, $v];
+  }
+  else {
+    $s->[1]{$k} = $v;
+  }
+  $v;
+}
+
+sub DELETE {
+  my($s, $k) = @_;
+  (ref $k)
+    ? (delete($s->[0]{overload::StrVal($k)}) || [])->[1]
+    : delete($s->[1]{$k});
+}
+
+sub EXISTS {
+  my($s, $k) = @_;
+  (ref $k) ? exists($s->[0]{overload::StrVal($k)}) : exists($s->[1]{$k});
+}
+
+sub FIRSTKEY {
+  my $s = shift;
+  keys %{$s->[0]};	# reset iterator
+  keys %{$s->[1]};	# reset iterator
+  $s->[2] = 0;      # flag for iteration, see NEXTKEY
+  $s->NEXTKEY;
+}
+
+sub NEXTKEY {
+  my $s = shift;
+  my ($k, $v);
+  if (!$s->[2]) {
+    if (($k, $v) = each %{$s->[0]}) {
+      return $v->[0];
+    }
+    else {
+      $s->[2] = 1;
+    }
+  }
+  return each %{$s->[1]};
+}
+
+sub CLEAR {
+  my $s = shift;
+  $s->[2] = 0;
+  %{$s->[0]} = ();
+  %{$s->[1]} = ();
+}
+
+package Tie::RefHash::Nestable;
+use vars '@ISA';
+@ISA = 'Tie::RefHash';
+
+sub STORE {
+  my($s, $k, $v) = @_;
+  if (ref($v) eq 'HASH' and not tied %$v) {
+      my @elems = %$v;
+      tie %$v, ref($s), @elems;
+  }
+  $s->SUPER::STORE($k, $v);
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Tie/Scalar.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Tie/Scalar.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Tie/Scalar.pm	(revision 14489)
@@ -0,0 +1,140 @@
+package Tie::Scalar;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+Tie::Scalar, Tie::StdScalar - base class definitions for tied scalars
+
+=head1 SYNOPSIS
+
+    package NewScalar;
+    require Tie::Scalar;
+
+    @ISA = (Tie::Scalar);
+
+    sub FETCH { ... }		# Provide a needed method
+    sub TIESCALAR { ... }	# Overrides inherited method
+
+
+    package NewStdScalar;
+    require Tie::Scalar;
+
+    @ISA = (Tie::StdScalar);
+
+    # All methods provided by default, so define only what needs be overridden
+    sub FETCH { ... }
+
+
+    package main;
+
+    tie $new_scalar, 'NewScalar';
+    tie $new_std_scalar, 'NewStdScalar';
+
+=head1 DESCRIPTION
+
+This module provides some skeletal methods for scalar-tying classes. See
+L<perltie> for a list of the functions required in tying a scalar to a
+package. The basic B<Tie::Scalar> package provides a C<new> method, as well
+as methods C<TIESCALAR>, C<FETCH> and C<STORE>. The B<Tie::StdScalar>
+package provides all the methods specified in  L<perltie>. It inherits from
+B<Tie::Scalar> and causes scalars tied to it to behave exactly like the
+built-in scalars, allowing for selective overloading of methods. The C<new>
+method is provided as a means of grandfathering, for classes that forget to
+provide their own C<TIESCALAR> method.
+
+For developers wishing to write their own tied-scalar classes, the methods
+are summarized below. The L<perltie> section not only documents these, but
+has sample code as well:
+
+=over 4
+
+=item TIESCALAR classname, LIST
+
+The method invoked by the command C<tie $scalar, classname>. Associates a new
+scalar instance with the specified class. C<LIST> would represent additional
+arguments (along the lines of L<AnyDBM_File> and compatriots) needed to
+complete the association.
+
+=item FETCH this
+
+Retrieve the value of the tied scalar referenced by I<this>.
+
+=item STORE this, value
+
+Store data I<value> in the tied scalar referenced by I<this>.
+
+=item DESTROY this
+
+Free the storage associated with the tied scalar referenced by I<this>.
+This is rarely needed, as Perl manages its memory quite well. But the
+option exists, should a class wish to perform specific actions upon the
+destruction of an instance.
+
+=back
+
+=head1 MORE INFORMATION
+
+The L<perltie> section uses a good example of tying scalars by associating
+process IDs with priority.
+
+=cut
+
+use Carp;
+use warnings::register;
+
+sub new {
+    my $pkg = shift;
+    $pkg->TIESCALAR(@_);
+}
+
+# "Grandfather" the new, a la Tie::Hash
+
+sub TIESCALAR {
+    my $pkg = shift;
+	if ($pkg->can('new') and $pkg ne __PACKAGE__) {
+	warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIESCALAR is missing");
+	$pkg->new(@_);
+    }
+    else {
+	croak "$pkg doesn't define a TIESCALAR method";
+    }
+}
+
+sub FETCH {
+    my $pkg = ref $_[0];
+    croak "$pkg doesn't define a FETCH method";
+}
+
+sub STORE {
+    my $pkg = ref $_[0];
+    croak "$pkg doesn't define a STORE method";
+}
+
+#
+# The Tie::StdScalar package provides scalars that behave exactly like
+# Perl's built-in scalars. Good base to inherit from, if you're only going to
+# tweak a small bit.
+#
+package Tie::StdScalar;
+@ISA = (Tie::Scalar);
+
+sub TIESCALAR {
+    my $class = shift;
+    my $instance = shift || undef;
+    return bless \$instance => $class;
+}
+
+sub FETCH {
+    return ${$_[0]};
+}
+
+sub STORE {
+    ${$_[0]} = $_[1];
+}
+
+sub DESTROY {
+    undef ${$_[0]};
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Tie/SubstrHash.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Tie/SubstrHash.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Tie/SubstrHash.pm	(revision 14489)
@@ -0,0 +1,215 @@
+package Tie::SubstrHash;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+Tie::SubstrHash - Fixed-table-size, fixed-key-length hashing
+
+=head1 SYNOPSIS
+
+    require Tie::SubstrHash;
+
+    tie %myhash, 'Tie::SubstrHash', $key_len, $value_len, $table_size;
+
+=head1 DESCRIPTION
+
+The B<Tie::SubstrHash> package provides a hash-table-like interface to
+an array of determinate size, with constant key size and record size.
+
+Upon tying a new hash to this package, the developer must specify the
+size of the keys that will be used, the size of the value fields that the
+keys will index, and the size of the overall table (in terms of key-value
+pairs, not size in hard memory). I<These values will not change for the
+duration of the tied hash>. The newly-allocated hash table may now have
+data stored and retrieved. Efforts to store more than C<$table_size>
+elements will result in a fatal error, as will efforts to store a value
+not exactly C<$value_len> characters in length, or reference through a
+key not exactly C<$key_len> characters in length. While these constraints
+may seem excessive, the result is a hash table using much less internal
+memory than an equivalent freely-allocated hash table.
+
+=head1 CAVEATS
+
+Because the current implementation uses the table and key sizes for the
+hashing algorithm, there is no means by which to dynamically change the
+value of any of the initialization parameters.
+
+The hash does not support exists().
+
+=cut
+
+use Carp;
+
+sub TIEHASH {
+    my $pack = shift;
+    my ($klen, $vlen, $tsize) = @_;
+    my $rlen = 1 + $klen + $vlen;
+    $tsize = [$tsize,
+	      findgteprime($tsize * 1.1)]; # Allow 10% empty.
+    local $self = bless ["\0", $klen, $vlen, $tsize, $rlen, 0, -1];
+    $$self[0] x= $rlen * $tsize->[1];
+    $self;
+}
+
+sub CLEAR {
+    local($self) = @_;
+    $$self[0] = "\0" x ($$self[4] * $$self[3]->[1]);
+    $$self[5] =  0;
+    $$self[6] = -1;
+}
+
+sub FETCH {
+    local($self,$key) = @_;
+    local($klen, $vlen, $tsize, $rlen) = @$self[1..4];
+    &hashkey;
+    for (;;) {
+	$offset = $hash * $rlen;
+	$record = substr($$self[0], $offset, $rlen);
+	if (ord($record) == 0) {
+	    return undef;
+	}
+	elsif (ord($record) == 1) {
+	}
+	elsif (substr($record, 1, $klen) eq $key) {
+	    return substr($record, 1+$klen, $vlen);
+	}
+	&rehash;
+    }
+}
+
+sub STORE {
+    local($self,$key,$val) = @_;
+    local($klen, $vlen, $tsize, $rlen) = @$self[1..4];
+    croak("Table is full ($tsize->[0] elements)") if $$self[5] > $tsize->[0];
+    croak(qq/Value "$val" is not $vlen characters long/)
+	if length($val) != $vlen;
+    my $writeoffset;
+
+    &hashkey;
+    for (;;) {
+	$offset = $hash * $rlen;
+	$record = substr($$self[0], $offset, $rlen);
+	if (ord($record) == 0) {
+	    $record = "\2". $key . $val;
+	    die "panic" unless length($record) == $rlen;
+	    $writeoffset = $offset unless defined $writeoffset;
+	    substr($$self[0], $writeoffset, $rlen) = $record;
+	    ++$$self[5];
+	    return;
+	}
+	elsif (ord($record) == 1) {
+	    $writeoffset = $offset unless defined $writeoffset;
+	}
+	elsif (substr($record, 1, $klen) eq $key) {
+	    $record = "\2". $key . $val;
+	    die "panic" unless length($record) == $rlen;
+	    substr($$self[0], $offset, $rlen) = $record;
+	    return;
+	}
+	&rehash;
+    }
+}
+
+sub DELETE {
+    local($self,$key) = @_;
+    local($klen, $vlen, $tsize, $rlen) = @$self[1..4];
+    &hashkey;
+    for (;;) {
+	$offset = $hash * $rlen;
+	$record = substr($$self[0], $offset, $rlen);
+	if (ord($record) == 0) {
+	    return undef;
+	}
+	elsif (ord($record) == 1) {
+	}
+	elsif (substr($record, 1, $klen) eq $key) {
+	    substr($$self[0], $offset, 1) = "\1";
+	    return substr($record, 1+$klen, $vlen);
+	    --$$self[5];
+	}
+	&rehash;
+    }
+}
+
+sub FIRSTKEY {
+    local($self) = @_;
+    $$self[6] = -1;
+    &NEXTKEY;
+}
+
+sub NEXTKEY {
+    local($self) = @_;
+    local($klen, $vlen, $tsize, $rlen, $entries, $iterix) = @$self[1..6];
+    for (++$iterix; $iterix < $tsize->[1]; ++$iterix) {
+	next unless substr($$self[0], $iterix * $rlen, 1) eq "\2";
+	$$self[6] = $iterix;
+	return substr($$self[0], $iterix * $rlen + 1, $klen);
+    }
+    $$self[6] = -1;
+    undef;
+}
+
+sub EXISTS {
+    croak "Tie::SubstrHash does not support exists()";
+}
+
+sub hashkey {
+    croak(qq/Key "$key" is not $klen characters long/)
+	if length($key) != $klen;
+    $hash = 2;
+    for (unpack('C*', $key)) {
+	$hash = $hash * 33 + $_;
+	&_hashwrap if $hash >= 1e13;
+    }
+    &_hashwrap if $hash >= $tsize->[1];
+    $hash = 1 unless $hash;
+    $hashbase = $hash;
+}
+
+sub _hashwrap {
+    $hash -= int($hash / $tsize->[1]) * $tsize->[1];
+}
+
+sub rehash {
+    $hash += $hashbase;
+    $hash -= $tsize->[1] if $hash >= $tsize->[1];
+}
+
+# using POSIX::ceil() would be too heavy, and not all platforms have it.
+sub ceil {
+    my $num = shift;
+    $num = int($num + 1) unless $num == int $num;
+    return $num;
+}
+
+# See:
+#
+# http://www-groups.dcs.st-andrews.ac.uk/~history/HistTopics/Prime_numbers.html
+#
+
+sub findgteprime { # find the smallest prime integer greater than or equal to
+    use integer;
+
+    my $num = ceil(shift);
+    return 2 if $num <= 2;
+
+    $num++ unless $num % 2;
+    my $i;
+    my $sqrtnum = int sqrt $num;
+    my $sqrtnumsquared = $sqrtnum * $sqrtnum;
+
+  NUM:
+    for (;; $num += 2) {
+	if ($sqrtnumsquared < $num) {
+	    $sqrtnum++;
+	    $sqrtnumsquared = $sqrtnum * $sqrtnum;
+	}
+        for ($i = 3; $i <= $sqrtnum; $i += 2) {
+            next NUM unless $num % $i;
+        }
+        return $num;
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/Time/HiRes.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Time/HiRes.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Time/HiRes.pm	(revision 14489)
@@ -0,0 +1,500 @@
+package Time::HiRes;
+
+use strict;
+use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD);
+
+require Exporter;
+require DynaLoader;
+
+@ISA = qw(Exporter DynaLoader);
+
+@EXPORT = qw( );
+@EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
+		 getitimer setitimer nanosleep clock_gettime clock_getres
+		 clock clock_nanosleep
+		 CLOCK_HIGHRES CLOCK_MONOTONIC CLOCK_PROCESS_CPUTIME_ID
+		 CLOCK_REALTIME CLOCK_SOFTTIME CLOCK_THREAD_CPUTIME_ID
+		 CLOCK_TIMEOFDAY CLOCKS_PER_SEC
+		 ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF ITIMER_REALPROF
+		 TIMER_ABSTIME
+		 d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
+		 d_nanosleep d_clock_gettime d_clock_getres
+		 d_clock d_clock_nanosleep);
+	
+$VERSION = '1.86';
+$XS_VERSION = $VERSION;
+$VERSION = eval $VERSION;
+
+sub AUTOLOAD {
+    my $constname;
+    ($constname = $AUTOLOAD) =~ s/.*:://;
+    # print "AUTOLOAD: constname = $constname ($AUTOLOAD)\n";
+    die "&Time::HiRes::constant not defined" if $constname eq 'constant';
+    my ($error, $val) = constant($constname);
+    # print "AUTOLOAD: error = $error, val = $val\n";
+    if ($error) {
+        my (undef,$file,$line) = caller;
+        die "$error at $file line $line.\n";
+    }
+    {
+	no strict 'refs';
+	*$AUTOLOAD = sub { $val };
+    }
+    goto &$AUTOLOAD;
+}
+
+sub import {
+    my $this = shift;
+    for my $i (@_) {
+	if (($i eq 'clock_getres'    && !&d_clock_getres)    ||
+	    ($i eq 'clock_gettime'   && !&d_clock_gettime)   ||
+	    ($i eq 'clock_nanosleep' && !&d_clock_nanosleep) ||
+	    ($i eq 'clock'           && !&d_clock)           ||
+	    ($i eq 'nanosleep'       && !&d_nanosleep)       ||
+	    ($i eq 'usleep'          && !&d_usleep)          ||
+	    ($i eq 'ualarm'          && !&d_ualarm)) {
+	    require Carp;
+	    Carp::croak("Time::HiRes::$i(): unimplemented in this platform");
+	}
+    }
+    Time::HiRes->export_to_level(1, $this, @_);
+}
+
+bootstrap Time::HiRes;
+
+# Preloaded methods go here.
+
+sub tv_interval {
+    # probably could have been done in C
+    my ($a, $b) = @_;
+    $b = [gettimeofday()] unless defined($b);
+    (${$b}[0] - ${$a}[0]) + ((${$b}[1] - ${$a}[1]) / 1_000_000);
+}
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+1;
+__END__
+
+=head1 NAME
+
+Time::HiRes - High resolution alarm, sleep, gettimeofday, interval timers
+
+=head1 SYNOPSIS
+
+  use Time::HiRes qw( usleep ualarm gettimeofday tv_interval nanosleep
+		      clock_gettime clock_getres clock_nanosleep clock );
+
+  usleep ($microseconds);
+  nanosleep ($nanoseconds);
+
+  ualarm ($microseconds);
+  ualarm ($microseconds, $interval_microseconds);
+
+  $t0 = [gettimeofday];
+  ($seconds, $microseconds) = gettimeofday;
+
+  $elapsed = tv_interval ( $t0, [$seconds, $microseconds]);
+  $elapsed = tv_interval ( $t0, [gettimeofday]);
+  $elapsed = tv_interval ( $t0 );
+
+  use Time::HiRes qw ( time alarm sleep );
+
+  $now_fractions = time;
+  sleep ($floating_seconds);
+  alarm ($floating_seconds);
+  alarm ($floating_seconds, $floating_interval);
+
+  use Time::HiRes qw( setitimer getitimer
+		      ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF ITIMER_REALPROF );
+
+  setitimer ($which, $floating_seconds, $floating_interval );
+  getitimer ($which);
+
+  $realtime   = clock_gettime(CLOCK_REALTIME);
+  $resolution = clock_getres(CLOCK_REALTIME);
+
+  clock_nanosleep(CLOCK_REALTIME, 1.5);
+  clock_nanosleep(CLOCK_REALTIME, time() + 10, TIMER_ABSTIME);
+
+  my $ticktock = clock();
+
+=head1 DESCRIPTION
+
+The C<Time::HiRes> module implements a Perl interface to the
+C<usleep>, C<nanosleep>, C<ualarm>, C<gettimeofday>, and
+C<setitimer>/C<getitimer> system calls, in other words, high
+resolution time and timers. See the L</EXAMPLES> section below and the
+test scripts for usage; see your system documentation for the
+description of the underlying C<nanosleep> or C<usleep>, C<ualarm>,
+C<gettimeofday>, and C<setitimer>/C<getitimer> calls.
+
+If your system lacks C<gettimeofday()> or an emulation of it you don't
+get C<gettimeofday()> or the one-argument form of C<tv_interval()>.
+If your system lacks all of C<nanosleep()>, C<usleep()>,
+C<select()>, and C<poll>, you don't get C<Time::HiRes::usleep()>,
+C<Time::HiRes::nanosleep()>, or C<Time::HiRes::sleep()>.
+If your system lacks both C<ualarm()> and C<setitimer()> you don't get
+C<Time::HiRes::ualarm()> or C<Time::HiRes::alarm()>.
+
+If you try to import an unimplemented function in the C<use> statement
+it will fail at compile time.
+
+If your subsecond sleeping is implemented with C<nanosleep()> instead
+of C<usleep()>, you can mix subsecond sleeping with signals since
+C<nanosleep()> does not use signals.  This, however, is not portable,
+and you should first check for the truth value of
+C<&Time::HiRes::d_nanosleep> to see whether you have nanosleep, and
+then carefully read your C<nanosleep()> C API documentation for any
+peculiarities.
+
+If you are using C<nanosleep> for something else than mixing sleeping
+with signals, give some thought to whether Perl is the tool you should
+be using for work requiring nanosecond accuracies.
+
+The following functions can be imported from this module.
+No functions are exported by default.
+
+=over 4
+
+=item gettimeofday ()
+
+In array context returns a two-element array with the seconds and
+microseconds since the epoch.  In scalar context returns floating
+seconds like C<Time::HiRes::time()> (see below).
+
+=item usleep ( $useconds )
+
+Sleeps for the number of microseconds (millionths of a second)
+specified.  Returns the number of microseconds actually slept.  Can
+sleep for more than one second, unlike the C<usleep> system call. Can
+also sleep for zero seconds, which often works like a I<thread yield>.
+See also C<Time::HiRes::usleep()>, C<Time::HiRes::sleep()>, and
+C<Time::HiRes::clock_nanosleep()>.
+
+Do not expect usleep() to be exact down to one microsecond.
+
+=item nanosleep ( $nanoseconds )
+
+Sleeps for the number of nanoseconds (1e9ths of a second) specified.
+Returns the number of nanoseconds actually slept (accurate only to
+microseconds, the nearest thousand of them).  Can sleep for more than
+one second.  Can also sleep for zero seconds, which often works like a
+I<thread yield>.  See also C<Time::HiRes::sleep()>,
+C<Time::HiRes::usleep()>, and C<Time::HiRes::clock_nanosleep()>.
+
+Do not expect nanosleep() to be exact down to one nanosecond.
+Getting even accuracy of one thousand nanoseconds is good.
+
+=item ualarm ( $useconds [, $interval_useconds ] )
+
+Issues a C<ualarm> call; the C<$interval_useconds> is optional and
+will be zero if unspecified, resulting in C<alarm>-like behaviour.
+
+Note that the interaction between alarms and sleeps is unspecified.
+
+=item tv_interval 
+
+tv_interval ( $ref_to_gettimeofday [, $ref_to_later_gettimeofday] )
+
+Returns the floating seconds between the two times, which should have
+been returned by C<gettimeofday()>. If the second argument is omitted,
+then the current time is used.
+
+=item time ()
+
+Returns a floating seconds since the epoch. This function can be
+imported, resulting in a nice drop-in replacement for the C<time>
+provided with core Perl; see the L</EXAMPLES> below.
+
+B<NOTE 1>: This higher resolution timer can return values either less
+or more than the core C<time()>, depending on whether your platform
+rounds the higher resolution timer values up, down, or to the nearest second
+to get the core C<time()>, but naturally the difference should be never
+more than half a second.  See also L</clock_getres>, if available
+in your system.
+
+B<NOTE 2>: Since Sunday, September 9th, 2001 at 01:46:40 AM GMT, when
+the C<time()> seconds since epoch rolled over to 1_000_000_000, the
+default floating point format of Perl and the seconds since epoch have
+conspired to produce an apparent bug: if you print the value of
+C<Time::HiRes::time()> you seem to be getting only five decimals, not
+six as promised (microseconds).  Not to worry, the microseconds are
+there (assuming your platform supports such granularity in the first
+place).  What is going on is that the default floating point format of
+Perl only outputs 15 digits.  In this case that means ten digits
+before the decimal separator and five after.  To see the microseconds
+you can use either C<printf>/C<sprintf> with C<"%.6f">, or the
+C<gettimeofday()> function in list context, which will give you the
+seconds and microseconds as two separate values.
+
+=item sleep ( $floating_seconds )
+
+Sleeps for the specified amount of seconds.  Returns the number of
+seconds actually slept (a floating point value).  This function can
+be imported, resulting in a nice drop-in replacement for the C<sleep>
+provided with perl, see the L</EXAMPLES> below.
+
+Note that the interaction between alarms and sleeps is unspecified.
+
+=item alarm ( $floating_seconds [, $interval_floating_seconds ] )
+
+The C<SIGALRM> signal is sent after the specified number of seconds.
+Implemented using C<ualarm()>.  The C<$interval_floating_seconds> argument
+is optional and will be zero if unspecified, resulting in C<alarm()>-like
+behaviour.  This function can be imported, resulting in a nice drop-in
+replacement for the C<alarm> provided with perl, see the L</EXAMPLES> below.
+
+B<NOTE 1>: With some combinations of operating systems and Perl
+releases C<SIGALRM> restarts C<select()>, instead of interrupting it.
+This means that an C<alarm()> followed by a C<select()> may together
+take the sum of the times specified for the the C<alarm()> and the
+C<select()>, not just the time of the C<alarm()>.
+
+Note that the interaction between alarms and sleeps is unspecified.
+
+=item setitimer ( $which, $floating_seconds [, $interval_floating_seconds ] )
+
+Start up an interval timer: after a certain time, a signal arrives,
+and more signals may keep arriving at certain intervals.  To disable
+an "itimer", use C<$floating_seconds> of zero.  If the
+C<$interval_floating_seconds> is set to zero (or unspecified), the
+timer is disabled B<after> the next delivered signal.
+
+Use of interval timers may interfere with C<alarm()>, C<sleep()>,
+and C<usleep()>.  In standard-speak the "interaction is unspecified",
+which means that I<anything> may happen: it may work, it may not.
+
+In scalar context, the remaining time in the timer is returned.
+
+In list context, both the remaining time and the interval are returned.
+
+There are usually three or four interval timers available: the
+C<$which> can be C<ITIMER_REAL>, C<ITIMER_VIRTUAL>, C<ITIMER_PROF>, or
+C<ITIMER_REALPROF>.  Note that which ones are available depends: true
+UNIX platforms usually have the first three, but (for example) Win32
+and Cygwin have only C<ITIMER_REAL>, and only Solaris seems to have
+C<ITIMER_REALPROF> (which is used to profile multithreaded programs).
+
+C<ITIMER_REAL> results in C<alarm()>-like behaviour.  Time is counted in
+I<real time>; that is, wallclock time.  C<SIGALRM> is delivered when
+the timer expires.
+
+C<ITIMER_VIRTUAL> counts time in (process) I<virtual time>; that is,
+only when the process is running.  In multiprocessor/user/CPU systems
+this may be more or less than real or wallclock time.  (This time is
+also known as the I<user time>.)  C<SIGVTALRM> is delivered when the
+timer expires.
+
+C<ITIMER_PROF> counts time when either the process virtual time or when
+the operating system is running on behalf of the process (such as I/O).
+(This time is also known as the I<system time>.)  (The sum of user
+time and system time is known as the I<CPU time>.)  C<SIGPROF> is
+delivered when the timer expires.  C<SIGPROF> can interrupt system calls.
+
+The semantics of interval timers for multithreaded programs are
+system-specific, and some systems may support additional interval
+timers.  See your C<setitimer()> documentation.
+
+=item getitimer ( $which )
+
+Return the remaining time in the interval timer specified by C<$which>.
+
+In scalar context, the remaining time is returned.
+
+In list context, both the remaining time and the interval are returned.
+The interval is always what you put in using C<setitimer()>.
+
+=item clock_gettime ( $which )
+
+Return as seconds the current value of the POSIX high resolution timer
+specified by C<$which>.  All implementations that support POSIX high
+resolution timers are supposed to support at least the C<$which> value
+of C<CLOCK_REALTIME>, which is supposed to return results close to the
+results of C<gettimeofday>, or the number of seconds since 00:00:00:00
+January 1, 1970 Greenwich Mean Time (GMT).  Do not assume that
+CLOCK_REALTIME is zero, it might be one, or something else.
+Another potentially useful (but not available everywhere) value is
+C<CLOCK_MONOTONIC>, which guarantees a monotonically increasing time
+value (unlike time(), which can be adjusted).  See your system
+documentation for other possibly supported values.
+
+=item clock_getres ( $which )
+
+Return as seconds the resolution of the POSIX high resolution timer
+specified by C<$which>.  All implementations that support POSIX high
+resolution timers are supposed to support at least the C<$which> value
+of C<CLOCK_REALTIME>, see L</clock_gettime>.
+
+=item clock_nanosleep ( $which, $seconds, $flags = 0)
+
+Sleeps for the number of seconds (1e9ths of a second) specified.
+Returns the number of seconds actually slept.  The $which is the
+"clock id", as with clock_gettime() and clock_getres().  The flags
+default to zero but C<TIMER_ABSTIME> can specified (must be exported
+explicitly) which means that C<$nanoseconds> is not a time interval
+(as is the default) but instead an absolute time.  Can sleep for more
+than one second.  Can also sleep for zero seconds, which often works
+like a I<thread yield>.  See also C<Time::HiRes::sleep()>,
+C<Time::HiRes::usleep()>, and C<Time::HiRes::nanosleep()>.
+
+Do not expect clock_nanosleep() to be exact down to one nanosecond.
+Getting even accuracy of one thousand nanoseconds is good.
+
+=item clock()
+
+Return as seconds the I<process time> (user + system time) spent by
+the process since the first call to clock() (the definition is B<not>
+"since the start of the process", though if you are lucky these times
+may be quite close to each other, depending on the system).  What this
+means is that you probably need to store the result of your first call
+to clock(), and subtract that value from the following results of clock().
+
+The time returned also includes the process times of the terminated
+child processes for which wait() has been executed.  This value is
+somewhat like the second value returned by the times() of core Perl,
+but not necessarily identical.  Note that due to backward
+compatibility limitations the returned value may wrap around at about
+2147 seconds or at about 36 minutes.
+
+=back
+
+=head1 EXAMPLES
+
+  use Time::HiRes qw(usleep ualarm gettimeofday tv_interval);
+
+  $microseconds = 750_000;
+  usleep($microseconds);
+
+  # signal alarm in 2.5s & every .1s thereafter
+  ualarm(2_500_000, 100_000);
+
+  # get seconds and microseconds since the epoch
+  ($s, $usec) = gettimeofday();
+
+  # measure elapsed time 
+  # (could also do by subtracting 2 gettimeofday return values)
+  $t0 = [gettimeofday];
+  # do bunch of stuff here
+  $t1 = [gettimeofday];
+  # do more stuff here
+  $t0_t1 = tv_interval $t0, $t1;
+
+  $elapsed = tv_interval ($t0, [gettimeofday]);
+  $elapsed = tv_interval ($t0);	# equivalent code
+
+  #
+  # replacements for time, alarm and sleep that know about
+  # floating seconds
+  #
+  use Time::HiRes;
+  $now_fractions = Time::HiRes::time;
+  Time::HiRes::sleep (2.5);
+  Time::HiRes::alarm (10.6666666);
+
+  use Time::HiRes qw ( time alarm sleep );
+  $now_fractions = time;
+  sleep (2.5);
+  alarm (10.6666666);
+
+  # Arm an interval timer to go off first at 10 seconds and
+  # after that every 2.5 seconds, in process virtual time
+
+  use Time::HiRes qw ( setitimer ITIMER_VIRTUAL time );
+
+  $SIG{VTALRM} = sub { print time, "\n" };
+  setitimer(ITIMER_VIRTUAL, 10, 2.5);
+
+  use Time::HiRes qw( clock_gettime clock_getres CLOCK_REALTIME );
+  # Read the POSIX high resolution timer.
+  my $high = clock_getres(CLOCK_REALTIME);
+  # But how accurate we can be, really?
+  my $reso = clock_getres(CLOCK_REALTIME);
+
+  use Time::HiRes qw( clock_nanosleep TIMER_ABSTIME );
+  clock_nanosleep(CLOCK_REALTIME, 1e6);
+  clock_nanosleep(CLOCK_REALTIME, 2e9, TIMER_ABSTIME);
+
+  use Time::HiRes qw( clock );
+  my $clock0 = clock();
+  ... # Do something.
+  my $clock1 = clock();
+  my $clockd = $clock1 - $clock0;
+
+=head1 C API
+
+In addition to the perl API described above, a C API is available for
+extension writers.  The following C functions are available in the
+modglobal hash:
+
+  name             C prototype
+  ---------------  ----------------------
+  Time::NVtime     double (*)()
+  Time::U2time     void (*)(pTHX_ UV ret[2])
+
+Both functions return equivalent information (like C<gettimeofday>)
+but with different representations.  The names C<NVtime> and C<U2time>
+were selected mainly because they are operating system independent.
+(C<gettimeofday> is Unix-centric, though some platforms like Win32 and
+VMS have emulations for it.)
+
+Here is an example of using C<NVtime> from C:
+
+  double (*myNVtime)(); /* Returns -1 on failure. */
+  SV **svp = hv_fetch(PL_modglobal, "Time::NVtime", 12, 0);
+  if (!svp)         croak("Time::HiRes is required");
+  if (!SvIOK(*svp)) croak("Time::NVtime isn't a function pointer");
+  myNVtime = INT2PTR(double(*)(), SvIV(*svp));
+  printf("The current time is: %f\n", (*myNVtime)());
+
+=head1 DIAGNOSTICS
+
+=head2 negative time not invented yet
+
+You tried to use a negative time argument.
+
+=head2 internal error: useconds < 0 (unsigned ... signed ...)
+
+Something went horribly wrong-- the number of microseconds that cannot
+become negative just became negative.  Maybe your compiler is broken?
+
+=head1 CAVEATS
+
+Notice that the core C<time()> maybe rounding rather than truncating.
+What this means is that the core C<time()> may be reporting the time
+as one second later than C<gettimeofday()> and C<Time::HiRes::time()>.
+
+Adjusting the system clock (either manually or by services like ntp)
+may cause problems, especially for long running programs that assume
+a monotonously increasing time (note that all platforms do not adjust
+time as gracefully as UNIX ntp does).  For example in Win32 (and derived
+platforms like Cygwin and MinGW) the Time::HiRes::time() may temporarily
+drift off from the system clock (and the original time())  by up to 0.5
+seconds. Time::HiRes will notice this eventually and recalibrate.
+Note that since Time::HiRes 1.77 the clock_gettime(CLOCK_MONOTONIC)
+might help in this (in case your system supports CLOCK_MONOTONIC).
+
+=head1 SEE ALSO
+
+Perl modules L<BSD::Resource>, L<Time::TAI64>.
+
+Your system documentation for C<clock_gettime>, C<clock_settime>,
+C<gettimeofday>, C<getitimer>, C<setitimer>, C<ualarm>.
+
+=head1 AUTHORS
+
+D. Wegscheid <wegscd@whirlpool.com>
+R. Schertler <roderick@argon.org>
+J. Hietaniemi <jhi@iki.fi>
+G. Aas <gisle@aas.no>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 1996-2002 Douglas E. Wegscheid.  All rights reserved.
+
+Copyright (c) 2002, 2003, 2004, 2005 Jarkko Hietaniemi.  All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Time/Local.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Time/Local.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Time/Local.pm	(revision 14489)
@@ -0,0 +1,366 @@
+package Time::Local;
+
+require Exporter;
+use Carp;
+use Config;
+use strict;
+use integer;
+
+use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK );
+$VERSION    = '1.11';
+$VERSION    = eval $VERSION;
+@ISA	= qw( Exporter );
+@EXPORT	= qw( timegm timelocal );
+@EXPORT_OK	= qw( timegm_nocheck timelocal_nocheck );
+
+my @MonthDays = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
+
+# Determine breakpoint for rolling century
+my $ThisYear     = (localtime())[5];
+my $Breakpoint   = ($ThisYear + 50) % 100;
+my $NextCentury  = $ThisYear - $ThisYear % 100;
+   $NextCentury += 100 if $Breakpoint < 50;
+my $Century      = $NextCentury - 100;
+my $SecOff       = 0;
+
+my (%Options, %Cheat, %Min, %Max);
+my ($MinInt, $MaxInt);
+
+if ($^O eq 'MacOS') {
+    # time_t is unsigned...
+    $MaxInt = (1 << (8 * $Config{intsize})) - 1;
+    $MinInt = 0;
+} else {
+    $MaxInt = ((1 << (8 * $Config{intsize} - 2))-1)*2 + 1;
+    $MinInt = -$MaxInt - 1;
+
+    # On Win32 (and others?) time_t appears to be signed, but negative
+    # epochs still don't work. - XXX - this is experimental
+    $MinInt = 0
+        unless defined ((localtime(-1))[0]);
+}
+
+$Max{Day} = ($MaxInt >> 1) / 43200;
+$Min{Day} = $MinInt ? -($Max{Day} + 1) : 0;
+
+$Max{Sec} = $MaxInt - 86400 * $Max{Day};
+$Min{Sec} = $MinInt - 86400 * $Min{Day};
+
+# Determine the EPOC day for this machine
+my $Epoc = 0;
+if ($^O eq 'vos') {
+# work around posix-977 -- VOS doesn't handle dates in
+# the range 1970-1980.
+  $Epoc = _daygm((0, 0, 0, 1, 0, 70, 4, 0));
+}
+elsif ($^O eq 'MacOS') {
+  no integer;
+
+  # MacOS time() is seconds since 1 Jan 1904, localtime
+  # so we need to calculate an offset to apply later
+  $Epoc = 693901;
+  $SecOff = timelocal(localtime(0)) - timelocal(gmtime(0));
+  $Epoc += _daygm(gmtime(0));
+}
+else {
+  $Epoc = _daygm(gmtime(0));
+}
+
+%Cheat=(); # clear the cache as epoc has changed
+
+sub _daygm {
+    $_[3] + ($Cheat{pack("ss",@_[4,5])} ||= do {
+	my $month = ($_[4] + 10) % 12;
+	my $year = $_[5] + 1900 - $month/10;
+	365*$year + $year/4 - $year/100 + $year/400 + ($month*306 + 5)/10 - $Epoc
+    });
+}
+
+
+sub _timegm {
+    my $sec = $SecOff + $_[0]  +  60 * $_[1]  +  3600 * $_[2];
+
+    no integer;
+
+    $sec +  86400 * &_daygm;
+}
+
+
+sub _zoneadjust {
+    my ($day, $sec, $time) = @_;
+
+    $sec = $sec + _timegm(localtime($time)) - $time;
+    if ($sec >= 86400) { $day++; $sec -= 86400; }
+    if ($sec <  0)     { $day--; $sec += 86400; }
+
+    ($day, $sec);
+}
+
+
+sub timegm {
+    my ($sec,$min,$hour,$mday,$month,$year) = @_;
+
+    if ($year >= 1000) {
+	$year -= 1900;
+    }
+    elsif ($year < 100 and $year >= 0) {
+	$year += ($year > $Breakpoint) ? $Century : $NextCentury;
+    }
+
+    unless ($Options{no_range_check}) {
+	if (abs($year) >= 0x7fff) {
+	    $year += 1900;
+	    croak "Cannot handle date ($sec, $min, $hour, $mday, $month, *$year*)";
+	}
+
+	croak "Month '$month' out of range 0..11" if $month > 11 or $month < 0;
+
+	my $md = $MonthDays[$month];
+#        ++$md if $month == 1 and $year % 4 == 0 and
+#            ($year % 100 != 0 or ($year + 1900) % 400 == 0);
+	++$md unless $month != 1 or $year % 4 or !($year % 400);
+
+	croak "Day '$mday' out of range 1..$md"   if $mday  > $md  or $mday  < 1;
+	croak "Hour '$hour' out of range 0..23"   if $hour  > 23   or $hour  < 0;
+	croak "Minute '$min' out of range 0..59"  if $min   > 59   or $min   < 0;
+	croak "Second '$sec' out of range 0..59"  if $sec   > 59   or $sec   < 0;
+    }
+
+    my $days = _daygm(undef, undef, undef, $mday, $month, $year);
+    my $xsec = $sec + $SecOff + 60*$min + 3600*$hour;
+
+    unless ($Options{no_range_check}
+        or  ($days > $Min{Day} or $days == $Min{Day} and $xsec >= $Min{Sec})
+       and  ($days < $Max{Day} or $days == $Max{Day} and $xsec <= $Max{Sec}))
+    {
+        warn "Day too small - $days > $Min{Day}\n" if $days < $Min{Day};
+        warn "Day too big - $days > $Max{Day}\n" if $days > $Max{Day};
+        warn "Sec too small - $days < $Min{Sec}\n" if $days < $Min{Sec};
+        warn "Sec too big - $days > $Max{Sec}\n" if $days > $Max{Sec};
+	$year += 1900;
+	croak "Cannot handle date ($sec, $min, $hour, $mday, $month, $year)";
+    }
+
+    no integer;
+
+    $xsec + 86400 * $days;
+}
+
+
+sub timegm_nocheck {
+    local $Options{no_range_check} = 1;
+    &timegm;
+}
+
+
+sub timelocal {
+    # Adjust Max/Min allowed times to fit local time zone and call timegm
+    local ($Max{Day}, $Max{Sec}) = _zoneadjust($Max{Day}, $Max{Sec}, $MaxInt);
+    local ($Min{Day}, $Min{Sec}) = _zoneadjust($Min{Day}, $Min{Sec}, $MinInt);
+    my $ref_t = &timegm;
+
+    # Calculate first guess with a one-day delta to avoid localtime overflow
+    my $delta = ($_[5] < 100)? 86400 : -86400;
+    my $loc_t = _timegm(localtime( $ref_t + $delta )) - $delta;
+
+    # Is there a timezone offset from GMT or are we done
+    my $zone_off = $ref_t - $loc_t
+	or return $loc_t;
+
+    # This hack is needed to always pick the first matching time
+    # during a DST change when time would otherwise be ambiguous
+    $zone_off -= 3600 if ($delta > 0 && $ref_t >= 3600);
+
+    # Adjust for timezone
+    $loc_t = $ref_t + $zone_off;
+
+    # Are we close to a DST change or are we done
+    my $dst_off = $ref_t - _timegm(localtime($loc_t))
+	or return $loc_t;
+
+    # Adjust for DST change
+    $loc_t += $dst_off;
+
+    return $loc_t if $dst_off >= 0;
+
+    # for a negative offset from GMT, and if the original date
+    # was a non-extent gap in a forward DST jump, we should
+    # now have the wrong answer - undo the DST adjust;
+
+    my ($s,$m,$h) = localtime($loc_t);
+    $loc_t -= $dst_off if $s != $_[0] || $m != $_[1] || $h != $_[2];
+
+    $loc_t;
+}
+
+
+sub timelocal_nocheck {
+    local $Options{no_range_check} = 1;
+    &timelocal;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Time::Local - efficiently compute time from local and GMT time
+
+=head1 SYNOPSIS
+
+    $time = timelocal($sec,$min,$hour,$mday,$mon,$year);
+    $time = timegm($sec,$min,$hour,$mday,$mon,$year);
+
+=head1 DESCRIPTION
+
+These routines are the inverse of built-in perl functions localtime()
+and gmtime().  They accept a date as a six-element array, and return
+the corresponding time(2) value in seconds since the system epoch
+(Midnight, January 1, 1970 GMT on Unix, for example).  This value can
+be positive or negative, though POSIX only requires support for
+positive values, so dates before the system's epoch may not work on
+all operating systems.
+
+It is worth drawing particular attention to the expected ranges for
+the values provided.  The value for the day of the month is the actual day
+(ie 1..31), while the month is the number of months since January (0..11).
+This is consistent with the values returned from localtime() and gmtime().
+
+The timelocal() and timegm() functions perform range checking on the
+input $sec, $min, $hour, $mday, and $mon values by default.  If you'd
+rather they didn't, you can explicitly import the timelocal_nocheck()
+and timegm_nocheck() functions.
+
+	use Time::Local 'timelocal_nocheck';
+
+	{
+	    # The 365th day of 1999
+	    print scalar localtime timelocal_nocheck 0,0,0,365,0,99;
+
+	    # The twenty thousandth day since 1970
+	    print scalar localtime timelocal_nocheck 0,0,0,20000,0,70;
+
+	    # And even the 10,000,000th second since 1999!
+	    print scalar localtime timelocal_nocheck 10000000,0,0,1,0,99;
+	}
+
+Your mileage may vary when trying these with minutes and hours,
+and it doesn't work at all for months.
+
+Strictly speaking, the year should also be specified in a form consistent
+with localtime(), i.e. the offset from 1900.
+In order to make the interpretation of the year easier for humans,
+however, who are more accustomed to seeing years as two-digit or four-digit
+values, the following conventions are followed:
+
+=over 4
+
+=item *
+
+Years greater than 999 are interpreted as being the actual year,
+rather than the offset from 1900.  Thus, 1964 would indicate the year
+Martin Luther King won the Nobel prize, not the year 3864.
+
+=item *
+
+Years in the range 100..999 are interpreted as offset from 1900, 
+so that 112 indicates 2012.  This rule also applies to years less than zero
+(but see note below regarding date range).
+
+=item *
+
+Years in the range 0..99 are interpreted as shorthand for years in the
+rolling "current century," defined as 50 years on either side of the current
+year.  Thus, today, in 1999, 0 would refer to 2000, and 45 to 2045,
+but 55 would refer to 1955.  Twenty years from now, 55 would instead refer
+to 2055.  This is messy, but matches the way people currently think about
+two digit dates.  Whenever possible, use an absolute four digit year instead.
+
+=back
+
+The scheme above allows interpretation of a wide range of dates, particularly
+if 4-digit years are used.  
+
+Please note, however, that the range of dates that can be actually be handled
+depends on the size of an integer (time_t) on a given platform.  
+Currently, this is 32 bits for most systems, yielding an approximate range 
+from Dec 1901 to Jan 2038.
+
+Both timelocal() and timegm() croak if given dates outside the supported
+range.
+
+=head2 Ambiguous Local Times (DST)
+
+Because of DST changes, there are many time zones where the same local
+time occurs for two different GMT times on the same day.  For example,
+in the "Europe/Paris" time zone, the local time of 2001-10-28 02:30:00
+can represent either 2001-10-28 00:30:00 GMT, B<or> 2001-10-28
+01:30:00 GMT.
+
+When given an ambiguous local time, the timelocal() function should
+always return the epoch for the I<earlier> of the two possible GMT
+times.
+
+=head2 Non-Existent Local Times (DST)
+
+When a DST change causes a locale clock to skip one hour forward,
+there will be an hour's worth of local times that don't exist.  Again,
+for the "Europe/Paris" time zone, the local clock jumped from
+2001-03-25 01:59:59 to 2001-03-25 03:00:00.
+
+If the timelocal() function is given a non-existent local time, it
+will simply return an epoch value for the time one hour later.
+
+=head2 Negative Epoch Values
+
+Negative epoch (time_t) values are not officially supported by the
+POSIX standards, so this module's tests do not test them.  On some
+systems, they are known not to work.  These include MacOS (pre-OSX)
+and Win32.
+
+On systems which do support negative epoch values, this module should
+be able to cope with dates before the start of the epoch, down the
+minimum value of time_t for the system.
+
+=head1 IMPLEMENTATION
+
+These routines are quite efficient and yet are always guaranteed to agree
+with localtime() and gmtime().  We manage this by caching the start times
+of any months we've seen before.  If we know the start time of the month,
+we can always calculate any time within the month.  The start times
+are calculated using a mathematical formula. Unlike other algorithms
+that do multiple calls to gmtime().
+
+timelocal() is implemented using the same cache.  We just assume that we're
+translating a GMT time, and then fudge it when we're done for the timezone
+and daylight savings arguments.  Note that the timezone is evaluated for
+each date because countries occasionally change their official timezones.
+Assuming that localtime() corrects for these changes, this routine will
+also be correct.
+
+=head1 BUGS
+
+The whole scheme for interpreting two-digit years can be considered a bug.
+
+=head1 SUPPORT
+
+Support for this module is provided via the datetime@perl.org
+email list.  See http://lists.perl.org/ for more details.
+
+Please submit bugs using the RT system at rt.cpan.org, or as a last
+resort, to the datetime@perl.org list.
+
+=head1 AUTHOR
+
+This module is based on a Perl 4 library, timelocal.pl, that was
+included with Perl 4.036, and was most likely written by Tom
+Christiansen.
+
+The current version was written by Graham Barr.
+
+It is now being maintained separately from the Perl core by Dave
+Rolsky, <autarch@urth.org>.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/Time/gmtime.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Time/gmtime.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Time/gmtime.pm	(revision 14489)
@@ -0,0 +1,90 @@
+package Time::gmtime;
+use strict;
+use 5.006_001;
+
+use Time::tm;
+
+our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
+BEGIN { 
+    use Exporter   ();
+    @ISA         = qw(Exporter Time::tm);
+    @EXPORT      = qw(gmtime gmctime);
+    @EXPORT_OK   = qw(  
+			$tm_sec $tm_min $tm_hour $tm_mday 
+			$tm_mon $tm_year $tm_wday $tm_yday 
+			$tm_isdst
+		    );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+    $VERSION     = 1.02;
+}
+use vars      @EXPORT_OK;
+
+sub populate (@) {
+    return unless @_;
+    my $tmob = Time::tm->new();
+    @$tmob = (
+		$tm_sec, $tm_min, $tm_hour, $tm_mday, 
+		$tm_mon, $tm_year, $tm_wday, $tm_yday, 
+		$tm_isdst )
+	    = @_;
+    return $tmob;
+} 
+
+sub gmtime (;$)    { populate CORE::gmtime(@_ ? shift : time)}
+sub gmctime (;$)   { scalar   CORE::gmtime(@_ ? shift : time)} 
+
+1;
+__END__
+
+=head1 NAME
+
+Time::gmtime - by-name interface to Perl's built-in gmtime() function
+
+=head1 SYNOPSIS
+
+ use Time::gmtime;
+ $gm = gmtime();
+ printf "The day in Greenwich is %s\n", 
+    (qw(Sun Mon Tue Wed Thu Fri Sat Sun))[ gm->wday() ];
+
+ use Time::gmtime w(:FIELDS;
+ printf "The day in Greenwich is %s\n", 
+    (qw(Sun Mon Tue Wed Thu Fri Sat Sun))[ gm_wday() ];
+
+ $now = gmctime();
+
+ use Time::gmtime;
+ use File::stat;
+ $date_string = gmctime(stat($file)->mtime);
+
+=head1 DESCRIPTION
+
+This module's default exports override the core gmtime() function,
+replacing it with a version that returns "Time::tm" objects.
+This object has methods that return the similarly named structure field
+name from the C's tm structure from F<time.h>; namely sec, min, hour,
+mday, mon, year, wday, yday, and isdst.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this
+still overrides your core functions.)  Access these fields as variables
+named with a preceding C<tm_> in front their method names.  Thus,
+C<$tm_obj-E<gt>mday()> corresponds to $tm_mday if you import the fields.
+
+The gmctime() function provides a way of getting at the 
+scalar sense of the original CORE::gmtime() function.
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
Index: /for-distributions/trunk/bin/windows/perl/lib/Time/localtime.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Time/localtime.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Time/localtime.pm	(revision 14489)
@@ -0,0 +1,86 @@
+package Time::localtime;
+use strict;
+use 5.006_001;
+
+use Time::tm;
+
+our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
+BEGIN {
+    use Exporter   ();
+    @ISA         = qw(Exporter Time::tm);
+    @EXPORT      = qw(localtime ctime);
+    @EXPORT_OK   = qw(  
+			$tm_sec $tm_min $tm_hour $tm_mday 
+			$tm_mon $tm_year $tm_wday $tm_yday 
+			$tm_isdst
+		    );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+    $VERSION     = 1.02;
+}
+use vars      @EXPORT_OK;
+
+sub populate (@) {
+    return unless @_;
+    my $tmob = Time::tm->new();
+    @$tmob = (
+		$tm_sec, $tm_min, $tm_hour, $tm_mday, 
+		$tm_mon, $tm_year, $tm_wday, $tm_yday, 
+		$tm_isdst )
+	    = @_;
+    return $tmob;
+} 
+
+sub localtime (;$) { populate CORE::localtime(@_ ? shift : time)}
+sub ctime (;$)     { scalar   CORE::localtime(@_ ? shift : time) } 
+
+1;
+
+__END__
+
+=head1 NAME
+
+Time::localtime - by-name interface to Perl's built-in localtime() function
+
+=head1 SYNOPSIS
+
+ use Time::localtime;
+ printf "Year is %d\n", localtime->year() + 1900;
+
+ $now = ctime();
+
+ use Time::localtime;
+ use File::stat;
+ $date_string = ctime(stat($file)->mtime);
+
+=head1 DESCRIPTION
+
+This module's default exports override the core localtime() function,
+replacing it with a version that returns "Time::tm" objects.
+This object has methods that return the similarly named structure field
+name from the C's tm structure from F<time.h>; namely sec, min, hour,
+mday, mon, year, wday, yday, and isdst.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as
+variables named with a preceding C<tm_> in front their method names.
+Thus, C<$tm_obj-E<gt>mday()> corresponds to $tm_mday if you import
+the fields.
+
+The ctime() function provides a way of getting at the 
+scalar sense of the original CORE::localtime() function.
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
Index: /for-distributions/trunk/bin/windows/perl/lib/Time/tm.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Time/tm.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Time/tm.pm	(revision 14489)
@@ -0,0 +1,33 @@
+package Time::tm;
+use strict;
+
+our $VERSION = '1.00';
+
+use Class::Struct qw(struct);
+struct('Time::tm' => [
+     map { $_ => '$' } qw{ sec min hour mday mon year wday yday isdst }
+]);
+
+1;
+__END__
+
+=head1 NAME
+
+Time::tm - internal object used by Time::gmtime and Time::localtime
+
+=head1 SYNOPSIS
+
+Don't use this module directly.
+
+=head1 DESCRIPTION
+
+This module is used internally as a base class by Time::localtime And
+Time::gmtime functions.  It creates a Time::tm struct object which is
+addressable just like's C's tm structure from F<time.h>; namely with sec,
+min, hour, mday, mon, year, wday, yday, and isdst.
+
+This class is an internal interface only. 
+
+=head1 AUTHOR
+
+Tom Christiansen
Index: /for-distributions/trunk/bin/windows/perl/lib/UNIVERSAL.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/UNIVERSAL.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/UNIVERSAL.pm	(revision 14489)
@@ -0,0 +1,147 @@
+package UNIVERSAL;
+
+our $VERSION = '1.01';
+
+# UNIVERSAL should not contain any extra subs/methods beyond those
+# that it exists to define. The use of Exporter below is a historical
+# accident that can't be fixed without breaking code.  Note that we
+# *don't* set @ISA here, don't want all classes/objects inheriting from
+# Exporter.  It's bad enough that all classes have a import() method
+# whenever UNIVERSAL.pm is loaded.
+require Exporter;
+*import = \&Exporter::import;
+@EXPORT_OK = qw(isa can VERSION);
+
+1;
+__END__
+
+=head1 NAME
+
+UNIVERSAL - base class for ALL classes (blessed references)
+
+=head1 SYNOPSIS
+
+    $is_io = $fd->isa("IO::Handle");
+    $is_io = Class->isa("IO::Handle");
+
+    $sub = $obj->can("print");
+    $sub = Class->can("print");
+
+    use UNIVERSAL qw( isa can VERSION );
+    $yes = isa $ref, "HASH" ;
+    $sub = can $ref, "fandango" ;
+    $ver = VERSION $obj ;
+
+=head1 DESCRIPTION
+
+C<UNIVERSAL> is the base class which all bless references will inherit from,
+see L<perlobj>.
+
+C<UNIVERSAL> provides the following methods and functions:
+
+=over 4
+
+=item C<< $obj->isa( TYPE ) >>
+
+=item C<< CLASS->isa( TYPE ) >> 
+
+=item C<isa( VAL, TYPE )>
+
+Where
+
+=over 4
+
+=item C<TYPE>
+
+is a package name
+
+=item C<$obj>
+
+is a blessed reference or a string containing a package name
+
+=item C<CLASS>
+
+is a package name
+
+=item C<VAL>
+
+is any of the above or an unblessed reference
+
+=back
+
+When used as an instance or class method (C<< $obj->isa( TYPE ) >>),
+C<isa> returns I<true> if $obj is blessed into package C<TYPE> or
+inherits from package C<TYPE>.
+
+When used as a class method (C<< CLASS->isa( TYPE ) >>: sometimes
+referred to as a static method), C<isa> returns I<true> if C<CLASS>
+inherits from (or is itself) the name of the package C<TYPE> or
+inherits from package C<TYPE>.
+
+When used as a function, like
+
+   use UNIVERSAL qw( isa ) ;
+   $yes = isa $h, "HASH";
+   $yes = isa "Foo", "Bar";
+
+or
+
+   require UNIVERSAL ;
+   $yes = UNIVERSAL::isa $a, "ARRAY";
+
+C<isa> returns I<true> in the same cases as above and also if C<VAL> is an
+unblessed reference to a perl variable of type C<TYPE>, such as "HASH",
+"ARRAY", or "Regexp".
+
+=item C<< $obj->can( METHOD ) >>
+
+=item C<< CLASS->can( METHOD ) >>
+
+=item C<can( VAL, METHOD )>
+
+C<can> checks if the object or class has a method called C<METHOD>. If it does
+then a reference to the sub is returned. If it does not then I<undef> is
+returned.  This includes methods inherited or imported by C<$obj>, C<CLASS>, or
+C<VAL>.
+
+C<can> cannot know whether an object will be able to provide a method
+through AUTOLOAD, so a return value of I<undef> does not necessarily mean
+the object will not be able to handle the method call. To get around
+this some module authors use a forward declaration (see L<perlsub>)
+for methods they will handle via AUTOLOAD. For such 'dummy' subs, C<can>
+will still return a code reference, which, when called, will fall through
+to the AUTOLOAD. If no suitable AUTOLOAD is provided, calling the coderef
+will cause an error.
+
+C<can> can be called as a class (static) method, an object method, or a
+function.
+
+When used as a function, if C<VAL> is a blessed reference or package name which
+has a method called C<METHOD>, C<can> returns a reference to the subroutine.
+If C<VAL> is not a blessed reference, or if it does not have a method
+C<METHOD>, I<undef> is returned.
+
+=item C<VERSION ( [ REQUIRE ] )>
+
+C<VERSION> will return the value of the variable C<$VERSION> in the
+package the object is blessed into. If C<REQUIRE> is given then
+it will do a comparison and die if the package version is not
+greater than or equal to C<REQUIRE>.
+
+C<VERSION> can be called as either a class (static) method, an object
+method or a function.
+
+
+=back
+
+=head1 EXPORTS
+
+None by default.
+
+You may request the import of all three functions (C<isa>, C<can>, and
+C<VERSION>), however it isn't usually necessary to do so.  Perl magically
+makes these functions act as methods on all objects.  The one exception is
+C<isa>, which is useful as a function when operating on non-blessed
+references.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Unicode/Collate.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Unicode/Collate.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Unicode/Collate.pm	(revision 14489)
@@ -0,0 +1,1877 @@
+package Unicode::Collate;
+
+BEGIN {
+    unless ("A" eq pack('U', 0x41)) {
+	die "Unicode::Collate cannot stringify a Unicode code point\n";
+    }
+}
+
+use 5.006;
+use strict;
+use warnings;
+use Carp;
+use File::Spec;
+
+no warnings 'utf8';
+
+our $VERSION = '0.52';
+our $PACKAGE = __PACKAGE__;
+
+my @Path = qw(Unicode Collate);
+my $KeyFile = "allkeys.txt";
+
+# Perl's boolean
+use constant TRUE  => 1;
+use constant FALSE => "";
+use constant NOMATCHPOS => -1;
+
+# A coderef to get combining class imported from Unicode::Normalize
+# (i.e. \&Unicode::Normalize::getCombinClass).
+# This is also used as a HAS_UNICODE_NORMALIZE flag.
+my $CVgetCombinClass;
+
+# Supported Levels
+use constant MinLevel => 1;
+use constant MaxLevel => 4;
+
+# Minimum weights at level 2 and 3, respectively
+use constant Min2Wt => 0x20;
+use constant Min3Wt => 0x02;
+
+# Shifted weight at 4th level
+use constant Shift4Wt => 0xFFFF;
+
+# A boolean for Variable and 16-bit weights at 4 levels of Collation Element
+# PROBLEM: The Default Unicode Collation Element Table
+# has weights over 0xFFFF at the 4th level.
+# The tie-breaking in the variable weights
+# other than "shift" (as well as "shift-trimmed") is unreliable.
+use constant VCE_TEMPLATE => 'Cn4';
+
+# A sort key: 16-bit weights
+# See also the PROBLEM on VCE_TEMPLATE above.
+use constant KEY_TEMPLATE => 'n*';
+
+# Level separator in a sort key:
+# i.e. pack(KEY_TEMPLATE, 0)
+use constant LEVEL_SEP => "\0\0";
+
+# As Unicode code point separator for hash keys.
+# A joined code point string (denoted by JCPS below)
+# like "65;768" is used for internal processing
+# instead of Perl's Unicode string like "\x41\x{300}",
+# as the native code point is different from the Unicode code point
+# on EBCDIC platform.
+# This character must not be included in any stringified
+# representation of an integer.
+use constant CODE_SEP => ';';
+
+# boolean values of variable weights
+use constant NON_VAR => 0; # Non-Variable character
+use constant VAR     => 1; # Variable character
+
+# specific code points
+use constant Hangul_LBase  => 0x1100;
+use constant Hangul_LIni   => 0x1100;
+use constant Hangul_LFin   => 0x1159;
+use constant Hangul_LFill  => 0x115F;
+use constant Hangul_VBase  => 0x1161;
+use constant Hangul_VIni   => 0x1160; # from Vowel Filler
+use constant Hangul_VFin   => 0x11A2;
+use constant Hangul_TBase  => 0x11A7; # from "no-final" codepoint
+use constant Hangul_TIni   => 0x11A8;
+use constant Hangul_TFin   => 0x11F9;
+use constant Hangul_TCount => 28;
+use constant Hangul_NCount => 588;
+use constant Hangul_SBase  => 0xAC00;
+use constant Hangul_SIni   => 0xAC00;
+use constant Hangul_SFin   => 0xD7A3;
+use constant CJK_UidIni    => 0x4E00;
+use constant CJK_UidFin    => 0x9FA5;
+use constant CJK_UidF41    => 0x9FBB;
+use constant CJK_ExtAIni   => 0x3400;
+use constant CJK_ExtAFin   => 0x4DB5;
+use constant CJK_ExtBIni   => 0x20000;
+use constant CJK_ExtBFin   => 0x2A6D6;
+use constant BMP_Max       => 0xFFFF;
+
+# Logical_Order_Exception in PropList.txt
+my $DefaultRearrange = [ 0x0E40..0x0E44, 0x0EC0..0x0EC4 ];
+
+sub UCA_Version { "14" }
+
+sub Base_Unicode_Version { "4.1.0" }
+
+######
+
+sub pack_U {
+    return pack('U*', @_);
+}
+
+sub unpack_U {
+    return unpack('U*', shift(@_).pack('U*'));
+}
+
+######
+
+my (%VariableOK);
+@VariableOK{ qw/
+    blanked  non-ignorable  shifted  shift-trimmed
+  / } = (); # keys lowercased
+
+our @ChangeOK = qw/
+    alternate backwards level normalization rearrange
+    katakana_before_hiragana upper_before_lower
+    overrideHangul overrideCJK preprocess UCA_Version
+    hangul_terminator variable
+  /;
+
+our @ChangeNG = qw/
+    entry mapping table maxlength
+    ignoreChar ignoreName undefChar undefName variableTable
+    versionTable alternateTable backwardsTable forwardsTable rearrangeTable
+    derivCode normCode rearrangeHash
+    backwardsFlag
+  /;
+# The hash key 'ignored' is deleted at v 0.21.
+# The hash key 'isShift' is deleted at v 0.23.
+# The hash key 'combining' is deleted at v 0.24.
+# The hash key 'entries' is deleted at v 0.30.
+# The hash key 'L3_ignorable' is deleted at v 0.40.
+
+sub version {
+    my $self = shift;
+    return $self->{versionTable} || 'unknown';
+}
+
+my (%ChangeOK, %ChangeNG);
+@ChangeOK{ @ChangeOK } = ();
+@ChangeNG{ @ChangeNG } = ();
+
+sub change {
+    my $self = shift;
+    my %hash = @_;
+    my %old;
+    if (exists $hash{variable} && exists $hash{alternate}) {
+	delete $hash{alternate};
+    }
+    elsif (!exists $hash{variable} && exists $hash{alternate}) {
+	$hash{variable} = $hash{alternate};
+    }
+    foreach my $k (keys %hash) {
+	if (exists $ChangeOK{$k}) {
+	    $old{$k} = $self->{$k};
+	    $self->{$k} = $hash{$k};
+	}
+	elsif (exists $ChangeNG{$k}) {
+	    croak "change of $k via change() is not allowed!";
+	}
+	# else => ignored
+    }
+    $self->checkCollator();
+    return wantarray ? %old : $self;
+}
+
+sub _checkLevel {
+    my $level = shift;
+    my $key   = shift; # 'level' or 'backwards'
+    MinLevel <= $level or croak sprintf
+	"Illegal level %d (in value for key '%s') lower than %d.",
+	    $level, $key, MinLevel;
+    $level <= MaxLevel or croak sprintf
+	"Unsupported level %d (in value for key '%s') higher than %d.",
+	    $level, $key, MaxLevel;
+}
+
+my %DerivCode = (
+    8 => \&_derivCE_8,
+    9 => \&_derivCE_9,
+   11 => \&_derivCE_9, # 11 == 9
+   14 => \&_derivCE_14,
+);
+
+sub checkCollator {
+    my $self = shift;
+    _checkLevel($self->{level}, "level");
+
+    $self->{derivCode} = $DerivCode{ $self->{UCA_Version} }
+	or croak "Illegal UCA version (passed $self->{UCA_Version}).";
+
+    $self->{variable} ||= $self->{alternate} || $self->{variableTable} ||
+				$self->{alternateTable} || 'shifted';
+    $self->{variable} = $self->{alternate} = lc($self->{variable});
+    exists $VariableOK{ $self->{variable} }
+	or croak "$PACKAGE unknown variable parameter name: $self->{variable}";
+
+    if (! defined $self->{backwards}) {
+	$self->{backwardsFlag} = 0;
+    }
+    elsif (! ref $self->{backwards}) {
+	_checkLevel($self->{backwards}, "backwards");
+	$self->{backwardsFlag} = 1 << $self->{backwards};
+    }
+    else {
+	my %level;
+	$self->{backwardsFlag} = 0;
+	for my $b (@{ $self->{backwards} }) {
+	    _checkLevel($b, "backwards");
+	    $level{$b} = 1;
+	}
+	for my $v (sort keys %level) {
+	    $self->{backwardsFlag} += 1 << $v;
+	}
+    }
+
+    defined $self->{rearrange} or $self->{rearrange} = [];
+    ref $self->{rearrange}
+	or croak "$PACKAGE: list for rearrangement must be store in ARRAYREF";
+
+    # keys of $self->{rearrangeHash} are $self->{rearrange}.
+    $self->{rearrangeHash} = undef;
+
+    if (@{ $self->{rearrange} }) {
+	@{ $self->{rearrangeHash} }{ @{ $self->{rearrange} } } = ();
+    }
+
+    $self->{normCode} = undef;
+
+    if (defined $self->{normalization}) {
+	eval { require Unicode::Normalize };
+	$@ and croak "Unicode::Normalize is required to normalize strings";
+
+	$CVgetCombinClass ||= \&Unicode::Normalize::getCombinClass;
+
+	if ($self->{normalization} =~ /^(?:NF)D\z/) { # tweak for default
+	    $self->{normCode} = \&Unicode::Normalize::NFD;
+	}
+	elsif ($self->{normalization} ne 'prenormalized') {
+	    my $norm = $self->{normalization};
+	    $self->{normCode} = sub {
+		Unicode::Normalize::normalize($norm, shift);
+	    };
+	    eval { $self->{normCode}->("") }; # try
+	    $@ and croak "$PACKAGE unknown normalization form name: $norm";
+	}
+    }
+    return;
+}
+
+sub new
+{
+    my $class = shift;
+    my $self = bless { @_ }, $class;
+
+    # If undef is passed explicitly, no file is read.
+    $self->{table} = $KeyFile if ! exists $self->{table};
+    $self->read_table() if defined $self->{table};
+
+    if ($self->{entry}) {
+	while ($self->{entry} =~ /([^\n]+)/g) {
+	    $self->parseEntry($1);
+	}
+    }
+
+    $self->{level} ||= MaxLevel;
+    $self->{UCA_Version} ||= UCA_Version();
+
+    $self->{overrideHangul} = FALSE
+	if ! exists $self->{overrideHangul};
+    $self->{overrideCJK} = FALSE
+	if ! exists $self->{overrideCJK};
+    $self->{normalization} = 'NFD'
+	if ! exists $self->{normalization};
+    $self->{rearrange} = $self->{rearrangeTable} ||
+	($self->{UCA_Version} <= 11 ? $DefaultRearrange : [])
+	if ! exists $self->{rearrange};
+    $self->{backwards} = $self->{backwardsTable}
+	if ! exists $self->{backwards};
+
+    $self->checkCollator();
+
+    return $self;
+}
+
+sub read_table {
+    my $self = shift;
+
+    my($f, $fh);
+    foreach my $d (@INC) {
+	$f = File::Spec->catfile($d, @Path, $self->{table});
+	last if open($fh, $f);
+	$f = undef;
+    }
+    if (!defined $f) {
+	$f = File::Spec->catfile(@Path, $self->{table});
+	croak("$PACKAGE: Can't locate $f in \@INC (\@INC contains: @INC)");
+    }
+
+    while (my $line = <$fh>) {
+	next if $line =~ /^\s*#/;
+	unless ($line =~ s/^\s*\@//) {
+	    $self->parseEntry($line);
+	    next;
+	}
+
+	# matched ^\s*\@
+	if ($line =~ /^version\s*(\S*)/) {
+	    $self->{versionTable} ||= $1;
+	}
+	elsif ($line =~ /^variable\s+(\S*)/) { # since UTS #10-9
+	    $self->{variableTable} ||= $1;
+	}
+	elsif ($line =~ /^alternate\s+(\S*)/) { # till UTS #10-8
+	    $self->{alternateTable} ||= $1;
+	}
+	elsif ($line =~ /^backwards\s+(\S*)/) {
+	    push @{ $self->{backwardsTable} }, $1;
+	}
+	elsif ($line =~ /^forwards\s+(\S*)/) { # parhaps no use
+	    push @{ $self->{forwardsTable} }, $1;
+	}
+	elsif ($line =~ /^rearrange\s+(.*)/) { # (\S*) is NG
+	    push @{ $self->{rearrangeTable} }, _getHexArray($1);
+	}
+    }
+    close $fh;
+}
+
+
+##
+## get $line, parse it, and write an entry in $self
+##
+sub parseEntry
+{
+    my $self = shift;
+    my $line = shift;
+    my($name, $entry, @uv, @key);
+
+    return if $line !~ /^\s*[0-9A-Fa-f]/;
+
+    # removes comment and gets name
+    $name = $1
+	if $line =~ s/[#%]\s*(.*)//;
+    return if defined $self->{undefName} && $name =~ /$self->{undefName}/;
+
+    # gets element
+    my($e, $k) = split /;/, $line;
+    croak "Wrong Entry: <charList> must be separated by ';' from <collElement>"
+	if ! $k;
+
+    @uv = _getHexArray($e);
+    return if !@uv;
+
+    $entry = join(CODE_SEP, @uv); # in JCPS
+
+    if (defined $self->{undefChar} || defined $self->{ignoreChar}) {
+	my $ele = pack_U(@uv);
+
+	# regarded as if it were not entried in the table
+	return
+	    if defined $self->{undefChar} && $ele =~ /$self->{undefChar}/;
+
+	# replaced as completely ignorable
+	$k = '[.0000.0000.0000.0000]'
+	    if defined $self->{ignoreChar} && $ele =~ /$self->{ignoreChar}/;
+    }
+
+    # replaced as completely ignorable
+    $k = '[.0000.0000.0000.0000]'
+	if defined $self->{ignoreName} && $name =~ /$self->{ignoreName}/;
+
+    my $is_L3_ignorable = TRUE;
+
+    foreach my $arr ($k =~ /\[([^\[\]]+)\]/g) { # SPACEs allowed
+	my $var = $arr =~ /\*/; # exactly /^\*/ but be lenient.
+	my @wt = _getHexArray($arr);
+	push @key, pack(VCE_TEMPLATE, $var, @wt);
+	$is_L3_ignorable = FALSE
+	    if $wt[0] || $wt[1] || $wt[2];
+	# Conformance Test for 3.1.1 and 4.0.0 shows Level 3 ignorable
+	# is completely ignorable.
+	# For expansion, an entry $is_L3_ignorable
+	# if and only if "all" CEs are [.0000.0000.0000].
+    }
+
+    $self->{mapping}{$entry} = $is_L3_ignorable ? [] : \@key;
+
+    if (@uv > 1) {
+	(!$self->{maxlength}{$uv[0]} || $self->{maxlength}{$uv[0]} < @uv)
+	    and $self->{maxlength}{$uv[0]} = @uv;
+    }
+}
+
+
+##
+## VCE = _varCE(variable term, VCE)
+##
+sub _varCE
+{
+    my $vbl = shift;
+    my $vce = shift;
+    if ($vbl eq 'non-ignorable') {
+	return $vce;
+    }
+    my ($var, @wt) = unpack VCE_TEMPLATE, $vce;
+
+    if ($var) {
+	return pack(VCE_TEMPLATE, $var, 0, 0, 0,
+		$vbl eq 'blanked' ? $wt[3] : $wt[0]);
+    }
+    elsif ($vbl eq 'blanked') {
+	return $vce;
+    }
+    else {
+	return pack(VCE_TEMPLATE, $var, @wt[0..2],
+	    $vbl eq 'shifted' && $wt[0]+$wt[1]+$wt[2] ? Shift4Wt : 0);
+    }
+}
+
+sub viewSortKey
+{
+    my $self = shift;
+    $self->visualizeSortKey($self->getSortKey(@_));
+}
+
+sub visualizeSortKey
+{
+    my $self = shift;
+    my $view = join " ", map sprintf("%04X", $_), unpack(KEY_TEMPLATE, shift);
+
+    if ($self->{UCA_Version} <= 8) {
+	$view =~ s/ ?0000 ?/|/g;
+    } else {
+	$view =~ s/\b0000\b/|/g;
+    }
+    return "[$view]";
+}
+
+
+##
+## arrayref of JCPS   = splitEnt(string to be collated)
+## arrayref of arrayref[JCPS, ini_pos, fin_pos] = splitEnt(string, true)
+##
+sub splitEnt
+{
+    my $self = shift;
+    my $wLen = $_[1];
+
+    my $code = $self->{preprocess};
+    my $norm = $self->{normCode};
+    my $map  = $self->{mapping};
+    my $max  = $self->{maxlength};
+    my $reH  = $self->{rearrangeHash};
+    my $ver9 = $self->{UCA_Version} >= 9 && $self->{UCA_Version} <= 11;
+
+    my ($str, @buf);
+
+    if ($wLen) {
+	$code and croak "Preprocess breaks character positions. "
+			. "Don't use with index(), match(), etc.";
+	$norm and croak "Normalization breaks character positions. "
+			. "Don't use with index(), match(), etc.";
+	$str = $_[0];
+    }
+    else {
+	$str = $_[0];
+	$str = &$code($str) if ref $code;
+	$str = &$norm($str) if ref $norm;
+    }
+
+    # get array of Unicode code point of string.
+    my @src = unpack_U($str);
+
+    # rearrangement:
+    # Character positions are not kept if rearranged,
+    # then neglected if $wLen is true.
+    if ($reH && ! $wLen) {
+	for (my $i = 0; $i < @src; $i++) {
+	    if (exists $reH->{ $src[$i] } && $i + 1 < @src) {
+		($src[$i], $src[$i+1]) = ($src[$i+1], $src[$i]);
+		$i++;
+	    }
+	}
+    }
+
+    # remove a code point marked as a completely ignorable.
+    for (my $i = 0; $i < @src; $i++) {
+	$src[$i] = undef
+	    if _isIllegal($src[$i]) || ($ver9 &&
+		$map->{ $src[$i] } && @{ $map->{ $src[$i] } } == 0);
+    }
+
+    for (my $i = 0; $i < @src; $i++) {
+	my $jcps = $src[$i];
+
+	# skip removed code point
+	if (! defined $jcps) {
+	    if ($wLen && @buf) {
+		$buf[-1][2] = $i + 1;
+	    }
+	    next;
+	}
+
+	my $i_orig = $i;
+
+	# find contraction
+	if ($max->{$jcps}) {
+	    my $temp_jcps = $jcps;
+	    my $jcpsLen = 1;
+	    my $maxLen = $max->{$jcps};
+
+	    for (my $p = $i + 1; $jcpsLen < $maxLen && $p < @src; $p++) {
+		next if ! defined $src[$p];
+		$temp_jcps .= CODE_SEP . $src[$p];
+		$jcpsLen++;
+		if ($map->{$temp_jcps}) {
+		    $jcps = $temp_jcps;
+		    $i = $p;
+		}
+	    }
+
+	# not-contiguous contraction with Combining Char (cf. UTS#10, S2.1).
+	# This process requires Unicode::Normalize.
+	# If "normalization" is undef, here should be skipped *always*
+	# (in spite of bool value of $CVgetCombinClass),
+	# since canonical ordering cannot be expected.
+	# Blocked combining character should not be contracted.
+
+	    if ($self->{normalization})
+	    # $self->{normCode} is false in the case of "prenormalized".
+	    {
+		my $preCC = 0;
+		my $curCC = 0;
+
+		for (my $p = $i + 1; $p < @src; $p++) {
+		    next if ! defined $src[$p];
+		    $curCC = $CVgetCombinClass->($src[$p]);
+		    last unless $curCC;
+		    my $tail = CODE_SEP . $src[$p];
+		    if ($preCC != $curCC && $map->{$jcps.$tail}) {
+			$jcps .= $tail;
+			$src[$p] = undef;
+		    } else {
+			$preCC = $curCC;
+		    }
+		}
+	    }
+	}
+
+	# skip completely ignorable
+	if ($map->{$jcps} && @{ $map->{$jcps} } == 0) {
+	    if ($wLen && @buf) {
+		$buf[-1][2] = $i + 1;
+	    }
+	    next;
+	}
+
+	push @buf, $wLen ? [$jcps, $i_orig, $i + 1] : $jcps;
+    }
+    return \@buf;
+}
+
+
+##
+## list of VCE = getWt(JCPS)
+##
+sub getWt
+{
+    my $self = shift;
+    my $u    = shift;
+    my $vbl  = $self->{variable};
+    my $map  = $self->{mapping};
+    my $der  = $self->{derivCode};
+
+    return if !defined $u;
+    return map(_varCE($vbl, $_), @{ $map->{$u} })
+	if $map->{$u};
+
+    # JCPS must not be a contraction, then it's a code point.
+    if (Hangul_SIni <= $u && $u <= Hangul_SFin) {
+	my $hang = $self->{overrideHangul};
+	my @hangulCE;
+	if ($hang) {
+	    @hangulCE = map(pack(VCE_TEMPLATE, NON_VAR, @$_), &$hang($u));
+	}
+	elsif (!defined $hang) {
+	    @hangulCE = $der->($u);
+	}
+	else {
+	    my $max  = $self->{maxlength};
+	    my @decH = _decompHangul($u);
+
+	    if (@decH == 2) {
+		my $contract = join(CODE_SEP, @decH);
+		@decH = ($contract) if $map->{$contract};
+	    } else { # must be <@decH == 3>
+		if ($max->{$decH[0]}) {
+		    my $contract = join(CODE_SEP, @decH);
+		    if ($map->{$contract}) {
+			@decH = ($contract);
+		    } else {
+			$contract = join(CODE_SEP, @decH[0,1]);
+			$map->{$contract} and @decH = ($contract, $decH[2]);
+		    }
+		    # even if V's ignorable, LT contraction is not supported.
+		    # If such a situatution were required, NFD should be used.
+		}
+		if (@decH == 3 && $max->{$decH[1]}) {
+		    my $contract = join(CODE_SEP, @decH[1,2]);
+		    $map->{$contract} and @decH = ($decH[0], $contract);
+		}
+	    }
+
+	    @hangulCE = map({
+		    $map->{$_} ? @{ $map->{$_} } : $der->($_);
+		} @decH);
+	}
+	return map _varCE($vbl, $_), @hangulCE;
+    }
+    elsif (_isUIdeo($u, $self->{UCA_Version})) {
+	my $cjk  = $self->{overrideCJK};
+	return map _varCE($vbl, $_),
+	    $cjk
+		? map(pack(VCE_TEMPLATE, NON_VAR, @$_), &$cjk($u))
+		: defined $cjk && $self->{UCA_Version} <= 8 && $u < 0x10000
+		    ? _uideoCE_8($u)
+		    : $der->($u);
+    }
+    else {
+	return map _varCE($vbl, $_), $der->($u);
+    }
+}
+
+
+##
+## string sortkey = getSortKey(string arg)
+##
+sub getSortKey
+{
+    my $self = shift;
+    my $lev  = $self->{level};
+    my $rEnt = $self->splitEnt(shift); # get an arrayref of JCPS
+    my $v2i  = $self->{UCA_Version} >= 9 &&
+		$self->{variable} ne 'non-ignorable';
+
+    my @buf; # weight arrays
+    if ($self->{hangul_terminator}) {
+	my $preHST = '';
+	foreach my $jcps (@$rEnt) {
+	    # weird things like VL, TL-contraction are not considered!
+	    my $curHST = '';
+	    foreach my $u (split /;/, $jcps) {
+		$curHST .= getHST($u);
+	    }
+	    if ($preHST && !$curHST || # hangul before non-hangul
+		$preHST =~ /L\z/ && $curHST =~ /^T/ ||
+		$preHST =~ /V\z/ && $curHST =~ /^L/ ||
+		$preHST =~ /T\z/ && $curHST =~ /^[LV]/) {
+
+		push @buf, $self->getWtHangulTerm();
+	    }
+	    $preHST = $curHST;
+
+	    push @buf, $self->getWt($jcps);
+	}
+	$preHST # end at hangul
+	    and push @buf, $self->getWtHangulTerm();
+    }
+    else {
+	foreach my $jcps (@$rEnt) {
+	    push @buf, $self->getWt($jcps);
+	}
+    }
+
+    # make sort key
+    my @ret = ([],[],[],[]);
+    my $last_is_variable;
+
+    foreach my $vwt (@buf) {
+	my($var, @wt) = unpack(VCE_TEMPLATE, $vwt);
+
+	# "Ignorable (L1, L2) after Variable" since track. v. 9
+	if ($v2i) {
+	    if ($var) {
+		$last_is_variable = TRUE;
+	    }
+	    elsif (!$wt[0]) { # ignorable
+		next if $last_is_variable;
+	    }
+	    else {
+		$last_is_variable = FALSE;
+	    }
+	}
+	foreach my $v (0..$lev-1) {
+	    0 < $wt[$v] and push @{ $ret[$v] }, $wt[$v];
+	}
+    }
+
+    # modification of tertiary weights
+    if ($self->{upper_before_lower}) {
+	foreach my $w (@{ $ret[2] }) {
+	    if    (0x8 <= $w && $w <= 0xC) { $w -= 6 } # lower
+	    elsif (0x2 <= $w && $w <= 0x6) { $w += 6 } # upper
+	    elsif ($w == 0x1C)             { $w += 1 } # square upper
+	    elsif ($w == 0x1D)             { $w -= 1 } # square lower
+	}
+    }
+    if ($self->{katakana_before_hiragana}) {
+	foreach my $w (@{ $ret[2] }) {
+	    if    (0x0F <= $w && $w <= 0x13) { $w -= 2 } # katakana
+	    elsif (0x0D <= $w && $w <= 0x0E) { $w += 5 } # hiragana
+	}
+    }
+
+    if ($self->{backwardsFlag}) {
+	for (my $v = MinLevel; $v <= MaxLevel; $v++) {
+	    if ($self->{backwardsFlag} & (1 << $v)) {
+		@{ $ret[$v-1] } = reverse @{ $ret[$v-1] };
+	    }
+	}
+    }
+
+    join LEVEL_SEP, map pack(KEY_TEMPLATE, @$_), @ret;
+}
+
+
+##
+## int compare = cmp(string a, string b)
+##
+sub cmp { $_[0]->getSortKey($_[1]) cmp $_[0]->getSortKey($_[2]) }
+sub eq  { $_[0]->getSortKey($_[1]) eq  $_[0]->getSortKey($_[2]) }
+sub ne  { $_[0]->getSortKey($_[1]) ne  $_[0]->getSortKey($_[2]) }
+sub lt  { $_[0]->getSortKey($_[1]) lt  $_[0]->getSortKey($_[2]) }
+sub le  { $_[0]->getSortKey($_[1]) le  $_[0]->getSortKey($_[2]) }
+sub gt  { $_[0]->getSortKey($_[1]) gt  $_[0]->getSortKey($_[2]) }
+sub ge  { $_[0]->getSortKey($_[1]) ge  $_[0]->getSortKey($_[2]) }
+
+##
+## list[strings] sorted = sort(list[strings] arg)
+##
+sub sort {
+    my $obj = shift;
+    return
+	map { $_->[1] }
+	    sort{ $a->[0] cmp $b->[0] }
+		map [ $obj->getSortKey($_), $_ ], @_;
+}
+
+
+sub _derivCE_14 {
+    my $u = shift;
+    my $base =
+	(CJK_UidIni  <= $u && $u <= CJK_UidF41)
+	    ? 0xFB40 : # CJK
+	(CJK_ExtAIni <= $u && $u <= CJK_ExtAFin ||
+	 CJK_ExtBIni <= $u && $u <= CJK_ExtBFin)
+	    ? 0xFB80   # CJK ext.
+	    : 0xFBC0;  # others
+
+    my $aaaa = $base + ($u >> 15);
+    my $bbbb = ($u & 0x7FFF) | 0x8000;
+    return
+	pack(VCE_TEMPLATE, NON_VAR, $aaaa, Min2Wt, Min3Wt, $u),
+	pack(VCE_TEMPLATE, NON_VAR, $bbbb,      0,      0, $u);
+}
+
+sub _derivCE_9 {
+    my $u = shift;
+    my $base =
+	(CJK_UidIni  <= $u && $u <= CJK_UidFin)
+	    ? 0xFB40 : # CJK
+	(CJK_ExtAIni <= $u && $u <= CJK_ExtAFin ||
+	 CJK_ExtBIni <= $u && $u <= CJK_ExtBFin)
+	    ? 0xFB80   # CJK ext.
+	    : 0xFBC0;  # others
+
+    my $aaaa = $base + ($u >> 15);
+    my $bbbb = ($u & 0x7FFF) | 0x8000;
+    return
+	pack(VCE_TEMPLATE, NON_VAR, $aaaa, Min2Wt, Min3Wt, $u),
+	pack(VCE_TEMPLATE, NON_VAR, $bbbb,      0,      0, $u);
+}
+
+sub _derivCE_8 {
+    my $code = shift;
+    my $aaaa =  0xFF80 + ($code >> 15);
+    my $bbbb = ($code & 0x7FFF) | 0x8000;
+    return
+	pack(VCE_TEMPLATE, NON_VAR, $aaaa, 2, 1, $code),
+	pack(VCE_TEMPLATE, NON_VAR, $bbbb, 0, 0, $code);
+}
+
+sub _uideoCE_8 {
+    my $u = shift;
+    return pack(VCE_TEMPLATE, NON_VAR, $u, Min2Wt, Min3Wt, $u);
+}
+
+sub _isUIdeo {
+    my ($u, $uca_vers) = @_;
+    return(
+	(CJK_UidIni <= $u &&
+	    ($uca_vers >= 14 ? ( $u <= CJK_UidF41) : ($u <= CJK_UidFin)))
+		||
+	(CJK_ExtAIni <= $u && $u <= CJK_ExtAFin)
+		||
+	(CJK_ExtBIni <= $u && $u <= CJK_ExtBFin)
+    );
+}
+
+
+sub getWtHangulTerm {
+    my $self = shift;
+    return _varCE($self->{variable},
+	pack(VCE_TEMPLATE, NON_VAR, $self->{hangul_terminator}, 0,0,0));
+}
+
+
+##
+## "hhhh hhhh hhhh" to (dddd, dddd, dddd)
+##
+sub _getHexArray { map hex, $_[0] =~ /([0-9a-fA-F]+)/g }
+
+#
+# $code *must* be in Hangul syllable.
+# Check it before you enter here.
+#
+sub _decompHangul {
+    my $code = shift;
+    my $si = $code - Hangul_SBase;
+    my $li = int( $si / Hangul_NCount);
+    my $vi = int(($si % Hangul_NCount) / Hangul_TCount);
+    my $ti =      $si % Hangul_TCount;
+    return (
+	Hangul_LBase + $li,
+	Hangul_VBase + $vi,
+	$ti ? (Hangul_TBase + $ti) : (),
+    );
+}
+
+sub _isIllegal {
+    my $code = shift;
+    return ! defined $code                      # removed
+	|| ($code < 0 || 0x10FFFF < $code)      # out of range
+	|| (($code & 0xFFFE) == 0xFFFE)         # ??FFF[EF] (cf. utf8.c)
+	|| (0xD800 <= $code && $code <= 0xDFFF) # unpaired surrogates
+	|| (0xFDD0 <= $code && $code <= 0xFDEF) # other non-characters
+    ;
+}
+
+# Hangul Syllable Type
+sub getHST {
+    my $u = shift;
+    return
+	Hangul_LIni <= $u && $u <= Hangul_LFin || $u == Hangul_LFill ? "L" :
+	Hangul_VIni <= $u && $u <= Hangul_VFin	     ? "V" :
+	Hangul_TIni <= $u && $u <= Hangul_TFin	     ? "T" :
+	Hangul_SIni <= $u && $u <= Hangul_SFin ?
+	    ($u - Hangul_SBase) % Hangul_TCount ? "LVT" : "LV" : "";
+}
+
+
+##
+## bool _nonIgnorAtLevel(arrayref weights, int level)
+##
+sub _nonIgnorAtLevel($$)
+{
+    my $wt = shift;
+    return if ! defined $wt;
+    my $lv = shift;
+    return grep($wt->[$_-1] != 0, MinLevel..$lv) ? TRUE : FALSE;
+}
+
+##
+## bool _eqArray(
+##    arrayref of arrayref[weights] source,
+##    arrayref of arrayref[weights] substr,
+##    int level)
+## * comparison of graphemes vs graphemes.
+##   @$source >= @$substr must be true (check it before call this);
+##
+sub _eqArray($$$)
+{
+    my $source = shift;
+    my $substr = shift;
+    my $lev = shift;
+
+    for my $g (0..@$substr-1){
+	# Do the $g'th graphemes have the same number of AV weigths?
+	return if @{ $source->[$g] } != @{ $substr->[$g] };
+
+	for my $w (0..@{ $substr->[$g] }-1) {
+	    for my $v (0..$lev-1) {
+		return if $source->[$g][$w][$v] != $substr->[$g][$w][$v];
+	    }
+	}
+    }
+    return 1;
+}
+
+##
+## (int position, int length)
+## int position = index(string, substring, position, [undoc'ed grobal])
+##
+## With "grobal" (only for the list context),
+##  returns list of arrayref[position, length].
+##
+sub index
+{
+    my $self = shift;
+    my $str  = shift;
+    my $len  = length($str);
+    my $subE = $self->splitEnt(shift);
+    my $pos  = @_ ? shift : 0;
+       $pos  = 0 if $pos < 0;
+    my $grob = shift;
+
+    my $lev  = $self->{level};
+    my $v2i  = $self->{UCA_Version} >= 9 &&
+		$self->{variable} ne 'non-ignorable';
+
+    if (! @$subE) {
+	my $temp = $pos <= 0 ? 0 : $len <= $pos ? $len : $pos;
+	return $grob
+	    ? map([$_, 0], $temp..$len)
+	    : wantarray ? ($temp,0) : $temp;
+    }
+    $len < $pos
+	and return wantarray ? () : NOMATCHPOS;
+    my $strE = $self->splitEnt($pos ? substr($str, $pos) : $str, TRUE);
+    @$strE
+	or return wantarray ? () : NOMATCHPOS;
+
+    my(@strWt, @iniPos, @finPos, @subWt, @g_ret);
+
+    my $last_is_variable;
+    for my $vwt (map $self->getWt($_), @$subE) {
+	my($var, @wt) = unpack(VCE_TEMPLATE, $vwt);
+	my $to_be_pushed = _nonIgnorAtLevel(\@wt,$lev);
+
+	# "Ignorable (L1, L2) after Variable" since track. v. 9
+	if ($v2i) {
+	    if ($var) {
+		$last_is_variable = TRUE;
+	    }
+	    elsif (!$wt[0]) { # ignorable
+		$to_be_pushed = FALSE if $last_is_variable;
+	    }
+	    else {
+		$last_is_variable = FALSE;
+	    }
+	}
+
+	if (@subWt && !$var && !$wt[0]) {
+	    push @{ $subWt[-1] }, \@wt if $to_be_pushed;
+	} else {
+	    push @subWt, [ \@wt ];
+	}
+    }
+
+    my $count = 0;
+    my $end = @$strE - 1;
+
+    $last_is_variable = FALSE; # reuse
+    for (my $i = 0; $i <= $end; ) { # no $i++
+	my $found_base = 0;
+
+	# fetch a grapheme
+	while ($i <= $end && $found_base == 0) {
+	    for my $vwt ($self->getWt($strE->[$i][0])) {
+		my($var, @wt) = unpack(VCE_TEMPLATE, $vwt);
+		my $to_be_pushed = _nonIgnorAtLevel(\@wt,$lev);
+
+		# "Ignorable (L1, L2) after Variable" since track. v. 9
+		if ($v2i) {
+		    if ($var) {
+			$last_is_variable = TRUE;
+		    }
+		    elsif (!$wt[0]) { # ignorable
+			$to_be_pushed = FALSE if $last_is_variable;
+		    }
+		    else {
+			$last_is_variable = FALSE;
+		    }
+		}
+
+		if (@strWt && !$var && !$wt[0]) {
+		    push @{ $strWt[-1] }, \@wt if $to_be_pushed;
+		    $finPos[-1] = $strE->[$i][2];
+		} elsif ($to_be_pushed) {
+		    push @strWt, [ \@wt ];
+		    push @iniPos, $found_base ? NOMATCHPOS : $strE->[$i][1];
+		    $finPos[-1] = NOMATCHPOS if $found_base;
+		    push @finPos, $strE->[$i][2];
+		    $found_base++;
+		}
+		# else ===> no-op
+	    }
+	    $i++;
+	}
+
+	# try to match
+	while ( @strWt > @subWt || (@strWt == @subWt && $i > $end) ) {
+	    if ($iniPos[0] != NOMATCHPOS &&
+		    $finPos[$#subWt] != NOMATCHPOS &&
+			_eqArray(\@strWt, \@subWt, $lev)) {
+		my $temp = $iniPos[0] + $pos;
+
+		if ($grob) {
+		    push @g_ret, [$temp, $finPos[$#subWt] - $iniPos[0]];
+		    splice @strWt,  0, $#subWt;
+		    splice @iniPos, 0, $#subWt;
+		    splice @finPos, 0, $#subWt;
+		}
+		else {
+		    return wantarray
+			? ($temp, $finPos[$#subWt] - $iniPos[0])
+			:  $temp;
+		}
+	    }
+	    shift @strWt;
+	    shift @iniPos;
+	    shift @finPos;
+	}
+    }
+
+    return $grob
+	? @g_ret
+	: wantarray ? () : NOMATCHPOS;
+}
+
+##
+## scalarref to matching part = match(string, substring)
+##
+sub match
+{
+    my $self = shift;
+    if (my($pos,$len) = $self->index($_[0], $_[1])) {
+	my $temp = substr($_[0], $pos, $len);
+	return wantarray ? $temp : \$temp;
+	# An lvalue ref \substr should be avoided,
+	# since its value is affected by modification of its referent.
+    }
+    else {
+	return;
+    }
+}
+
+##
+## arrayref matching parts = gmatch(string, substring)
+##
+sub gmatch
+{
+    my $self = shift;
+    my $str  = shift;
+    my $sub  = shift;
+    return map substr($str, $_->[0], $_->[1]),
+		$self->index($str, $sub, 0, 'g');
+}
+
+##
+## bool subst'ed = subst(string, substring, replace)
+##
+sub subst
+{
+    my $self = shift;
+    my $code = ref $_[2] eq 'CODE' ? $_[2] : FALSE;
+
+    if (my($pos,$len) = $self->index($_[0], $_[1])) {
+	if ($code) {
+	    my $mat = substr($_[0], $pos, $len);
+	    substr($_[0], $pos, $len, $code->($mat));
+	} else {
+	    substr($_[0], $pos, $len, $_[2]);
+	}
+	return TRUE;
+    }
+    else {
+	return FALSE;
+    }
+}
+
+##
+## int count = gsubst(string, substring, replace)
+##
+sub gsubst
+{
+    my $self = shift;
+    my $code = ref $_[2] eq 'CODE' ? $_[2] : FALSE;
+    my $cnt = 0;
+
+    # Replacement is carried out from the end, then use reverse.
+    for my $pos_len (reverse $self->index($_[0], $_[1], 0, 'g')) {
+	if ($code) {
+	    my $mat = substr($_[0], $pos_len->[0], $pos_len->[1]);
+	    substr($_[0], $pos_len->[0], $pos_len->[1], $code->($mat));
+	} else {
+	    substr($_[0], $pos_len->[0], $pos_len->[1], $_[2]);
+	}
+	$cnt++;
+    }
+    return $cnt;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Unicode::Collate - Unicode Collation Algorithm
+
+=head1 SYNOPSIS
+
+  use Unicode::Collate;
+
+  #construct
+  $Collator = Unicode::Collate->new(%tailoring);
+
+  #sort
+  @sorted = $Collator->sort(@not_sorted);
+
+  #compare
+  $result = $Collator->cmp($a, $b); # returns 1, 0, or -1.
+
+  # If %tailoring is false (i.e. empty),
+  # $Collator should do the default collation.
+
+=head1 DESCRIPTION
+
+This module is an implementation of Unicode Technical Standard #10
+(a.k.a. UTS #10) - Unicode Collation Algorithm (a.k.a. UCA).
+
+=head2 Constructor and Tailoring
+
+The C<new> method returns a collator object.
+
+   $Collator = Unicode::Collate->new(
+      UCA_Version => $UCA_Version,
+      alternate => $alternate, # deprecated: use of 'variable' is recommended.
+      backwards => $levelNumber, # or \@levelNumbers
+      entry => $element,
+      hangul_terminator => $term_primary_weight,
+      ignoreName => qr/$ignoreName/,
+      ignoreChar => qr/$ignoreChar/,
+      katakana_before_hiragana => $bool,
+      level => $collationLevel,
+      normalization  => $normalization_form,
+      overrideCJK => \&overrideCJK,
+      overrideHangul => \&overrideHangul,
+      preprocess => \&preprocess,
+      rearrange => \@charList,
+      table => $filename,
+      undefName => qr/$undefName/,
+      undefChar => qr/$undefChar/,
+      upper_before_lower => $bool,
+      variable => $variable,
+   );
+
+=over 4
+
+=item UCA_Version
+
+If the tracking version number of UCA is given,
+behavior of that tracking version is emulated on collating.
+If omitted, the return value of C<UCA_Version()> is used.
+C<UCA_Version()> should return the latest tracking version supported.
+
+The supported tracking version: 8, 9, 11, or 14.
+
+     UCA       Unicode Standard         DUCET (@version)
+     ---------------------------------------------------
+      8              3.1                3.0.1 (3.0.1d9)
+      9     3.1 with Corrigendum 3      3.1.1 (3.1.1)
+     11              4.0                4.0.0 (4.0.0)
+     14             4.1.0               4.1.0 (4.1.0)
+
+Note: Recent UTS #10 renames "Tracking Version" to "Revision."
+
+=item alternate
+
+-- see 3.2.2 Alternate Weighting, version 8 of UTS #10
+
+For backward compatibility, C<alternate> (old name) can be used
+as an alias for C<variable>.
+
+=item backwards
+
+-- see 3.1.2 French Accents, UTS #10.
+
+     backwards => $levelNumber or \@levelNumbers
+
+Weights in reverse order; ex. level 2 (diacritic ordering) in French.
+If omitted, forwards at all the levels.
+
+=item entry
+
+-- see 3.1 Linguistic Features; 3.2.1 File Format, UTS #10.
+
+If the same character (or a sequence of characters) exists
+in the collation element table through C<table>,
+mapping to collation elements is overrided.
+If it does not exist, the mapping is defined additionally.
+
+    entry => <<'ENTRY', # for DUCET v4.0.0 (allkeys-4.0.0.txt)
+0063 0068 ; [.0E6A.0020.0002.0063] # ch
+0043 0068 ; [.0E6A.0020.0007.0043] # Ch
+0043 0048 ; [.0E6A.0020.0008.0043] # CH
+006C 006C ; [.0F4C.0020.0002.006C] # ll
+004C 006C ; [.0F4C.0020.0007.004C] # Ll
+004C 004C ; [.0F4C.0020.0008.004C] # LL
+00F1      ; [.0F7B.0020.0002.00F1] # n-tilde
+006E 0303 ; [.0F7B.0020.0002.00F1] # n-tilde
+00D1      ; [.0F7B.0020.0008.00D1] # N-tilde
+004E 0303 ; [.0F7B.0020.0008.00D1] # N-tilde
+ENTRY
+
+    entry => <<'ENTRY', # for DUCET v4.0.0 (allkeys-4.0.0.txt)
+00E6 ; [.0E33.0020.0002.00E6][.0E8B.0020.0002.00E6] # ae ligature as <a><e>
+00C6 ; [.0E33.0020.0008.00C6][.0E8B.0020.0008.00C6] # AE ligature as <A><E>
+ENTRY
+
+B<NOTE:> The code point in the UCA file format (before C<';'>)
+B<must> be a Unicode code point (defined as hexadecimal),
+but not a native code point.
+So C<0063> must always denote C<U+0063>,
+but not a character of C<"\x63">.
+
+Weighting may vary depending on collation element table.
+So ensure the weights defined in C<entry> will be consistent with
+those in the collation element table loaded via C<table>.
+
+In DUCET v4.0.0, primary weight of C<C> is C<0E60>
+and that of C<D> is C<0E6D>. So setting primary weight of C<CH> to C<0E6A>
+(as a value between C<0E60> and C<0E6D>)
+makes ordering as C<C E<lt> CH E<lt> D>.
+Exactly speaking DUCET already has some characters between C<C> and C<D>:
+C<small capital C> (C<U+1D04>) with primary weight C<0E64>,
+C<c-hook/C-hook> (C<U+0188/U+0187>) with C<0E65>,
+and C<c-curl> (C<U+0255>) with C<0E69>.
+Then primary weight C<0E6A> for C<CH> makes C<CH>
+ordered between C<c-curl> and C<D>.
+
+=item hangul_terminator
+
+-- see 7.1.4 Trailing Weights, UTS #10.
+
+If a true value is given (non-zero but should be positive),
+it will be added as a terminator primary weight to the end of
+every standard Hangul syllable. Secondary and any higher weights
+for terminator are set to zero.
+If the value is false or C<hangul_terminator> key does not exist,
+insertion of terminator weights will not be performed.
+
+Boundaries of Hangul syllables are determined
+according to conjoining Jamo behavior in F<the Unicode Standard>
+and F<HangulSyllableType.txt>.
+
+B<Implementation Note:>
+(1) For expansion mapping (Unicode character mapped
+to a sequence of collation elements), a terminator will not be added
+between collation elements, even if Hangul syllable boundary exists there.
+Addition of terminator is restricted to the next position
+to the last collation element.
+
+(2) Non-conjoining Hangul letters
+(Compatibility Jamo, halfwidth Jamo, and enclosed letters) are not
+automatically terminated with a terminator primary weight.
+These characters may need terminator included in a collation element
+table beforehand.
+
+=item ignoreChar
+
+=item ignoreName
+
+-- see 3.2.2 Variable Weighting, UTS #10.
+
+Makes the entry in the table completely ignorable;
+i.e. as if the weights were zero at all level.
+
+Through C<ignoreChar>, any character matching C<qr/$ignoreChar/>
+will be ignored. Through C<ignoreName>, any character whose name
+(given in the C<table> file as a comment) matches C<qr/$ignoreName/>
+will be ignored.
+
+E.g. when 'a' and 'e' are ignorable,
+'element' is equal to 'lament' (or 'lmnt').
+
+=item katakana_before_hiragana
+
+-- see 7.3.1 Tertiary Weight Table, UTS #10.
+
+By default, hiragana is before katakana.
+If the parameter is made true, this is reversed.
+
+B<NOTE>: This parameter simplemindedly assumes that any hiragana/katakana
+distinctions must occur in level 3, and their weights at level 3 must be
+same as those mentioned in 7.3.1, UTS #10.
+If you define your collation elements which violate this requirement,
+this parameter does not work validly.
+
+=item level
+
+-- see 4.3 Form Sort Key, UTS #10.
+
+Set the maximum level.
+Any higher levels than the specified one are ignored.
+
+  Level 1: alphabetic ordering
+  Level 2: diacritic ordering
+  Level 3: case ordering
+  Level 4: tie-breaking (e.g. in the case when variable is 'shifted')
+
+  ex.level => 2,
+
+If omitted, the maximum is the 4th.
+
+=item normalization
+
+-- see 4.1 Normalize, UTS #10.
+
+If specified, strings are normalized before preparation of sort keys
+(the normalization is executed after preprocess).
+
+A form name C<Unicode::Normalize::normalize()> accepts will be applied
+as C<$normalization_form>.
+Acceptable names include C<'NFD'>, C<'NFC'>, C<'NFKD'>, and C<'NFKC'>.
+See C<Unicode::Normalize::normalize()> for detail.
+If omitted, C<'NFD'> is used.
+
+C<normalization> is performed after C<preprocess> (if defined).
+
+Furthermore, special values, C<undef> and C<"prenormalized">, can be used,
+though they are not concerned with C<Unicode::Normalize::normalize()>.
+
+If C<undef> (not a string C<"undef">) is passed explicitly
+as the value for this key,
+any normalization is not carried out (this may make tailoring easier
+if any normalization is not desired). Under C<(normalization =E<gt> undef)>,
+only contiguous contractions are resolved;
+e.g. even if C<A-ring> (and C<A-ring-cedilla>) is ordered after C<Z>,
+C<A-cedilla-ring> would be primary equal to C<A>.
+In this point,
+C<(normalization =E<gt> undef, preprocess =E<gt> sub { NFD(shift) })>
+B<is not> equivalent to C<(normalization =E<gt> 'NFD')>.
+
+In the case of C<(normalization =E<gt> "prenormalized")>,
+any normalization is not performed, but
+non-contiguous contractions with combining characters are performed.
+Therefore
+C<(normalization =E<gt> 'prenormalized', preprocess =E<gt> sub { NFD(shift) })>
+B<is> equivalent to C<(normalization =E<gt> 'NFD')>.
+If source strings are finely prenormalized,
+C<(normalization =E<gt> 'prenormalized')> may save time for normalization.
+
+Except C<(normalization =E<gt> undef)>,
+B<Unicode::Normalize> is required (see also B<CAVEAT>).
+
+=item overrideCJK
+
+-- see 7.1 Derived Collation Elements, UTS #10.
+
+By default, CJK Unified Ideographs are ordered in Unicode codepoint order
+but C<CJK Unified Ideographs> (if C<UCA_Version> is 8 to 11, its range is
+C<U+4E00..U+9FA5>; if C<UCA_Version> is 14, its range is C<U+4E00..U+9FBB>)
+are lesser than C<CJK Unified Ideographs Extension> (its range is
+C<U+3400..U+4DB5> and C<U+20000..U+2A6D6>).
+
+Through C<overrideCJK>, ordering of CJK Unified Ideographs can be overrided.
+
+ex. CJK Unified Ideographs in the JIS code point order.
+
+  overrideCJK => sub {
+      my $u = shift;             # get a Unicode codepoint
+      my $b = pack('n', $u);     # to UTF-16BE
+      my $s = your_unicode_to_sjis_converter($b); # convert
+      my $n = unpack('n', $s);   # convert sjis to short
+      [ $n, 0x20, 0x2, $u ];     # return the collation element
+  },
+
+ex. ignores all CJK Unified Ideographs.
+
+  overrideCJK => sub {()}, # CODEREF returning empty list
+
+   # where ->eq("Pe\x{4E00}rl", "Perl") is true
+   # as U+4E00 is a CJK Unified Ideograph and to be ignorable.
+
+If C<undef> is passed explicitly as the value for this key,
+weights for CJK Unified Ideographs are treated as undefined.
+But assignment of weight for CJK Unified Ideographs
+in table or C<entry> is still valid.
+
+=item overrideHangul
+
+-- see 7.1 Derived Collation Elements, UTS #10.
+
+By default, Hangul Syllables are decomposed into Hangul Jamo,
+even if C<(normalization =E<gt> undef)>.
+But the mapping of Hangul Syllables may be overrided.
+
+This parameter works like C<overrideCJK>, so see there for examples.
+
+If you want to override the mapping of Hangul Syllables,
+NFD, NFKD, and FCD are not appropriate,
+since they will decompose Hangul Syllables before overriding.
+
+If C<undef> is passed explicitly as the value for this key,
+weight for Hangul Syllables is treated as undefined
+without decomposition into Hangul Jamo.
+But definition of weight for Hangul Syllables
+in table or C<entry> is still valid.
+
+=item preprocess
+
+-- see 5.1 Preprocessing, UTS #10.
+
+If specified, the coderef is used to preprocess
+before the formation of sort keys.
+
+ex. dropping English articles, such as "a" or "the".
+Then, "the pen" is before "a pencil".
+
+     preprocess => sub {
+           my $str = shift;
+           $str =~ s/\b(?:an?|the)\s+//gi;
+           return $str;
+        },
+
+C<preprocess> is performed before C<normalization> (if defined).
+
+=item rearrange
+
+-- see 3.1.3 Rearrangement, UTS #10.
+
+Characters that are not coded in logical order and to be rearranged.
+If C<UCA_Version> is equal to or lesser than 11, default is:
+
+    rearrange => [ 0x0E40..0x0E44, 0x0EC0..0x0EC4 ],
+
+If you want to disallow any rearrangement, pass C<undef> or C<[]>
+(a reference to empty list) as the value for this key.
+
+If C<UCA_Version> is equal to 14, default is C<[]> (i.e. no rearrangement).
+
+B<According to the version 9 of UCA, this parameter shall not be used;
+but it is not warned at present.>
+
+=item table
+
+-- see 3.2 Default Unicode Collation Element Table, UTS #10.
+
+You can use another collation element table if desired.
+
+The table file should locate in the F<Unicode/Collate> directory
+on C<@INC>. Say, if the filename is F<Foo.txt>,
+the table file is searched as F<Unicode/Collate/Foo.txt> in C<@INC>.
+
+By default, F<allkeys.txt> (as the filename of DUCET) is used.
+If you will prepare your own table file, any name other than F<allkeys.txt>
+may be better to avoid namespace conflict.
+
+If C<undef> is passed explicitly as the value for this key,
+no file is read (but you can define collation elements via C<entry>).
+
+A typical way to define a collation element table
+without any file of table:
+
+   $onlyABC = Unicode::Collate->new(
+       table => undef,
+       entry => << 'ENTRIES',
+0061 ; [.0101.0020.0002.0061] # LATIN SMALL LETTER A
+0041 ; [.0101.0020.0008.0041] # LATIN CAPITAL LETTER A
+0062 ; [.0102.0020.0002.0062] # LATIN SMALL LETTER B
+0042 ; [.0102.0020.0008.0042] # LATIN CAPITAL LETTER B
+0063 ; [.0103.0020.0002.0063] # LATIN SMALL LETTER C
+0043 ; [.0103.0020.0008.0043] # LATIN CAPITAL LETTER C
+ENTRIES
+    );
+
+If C<ignoreName> or C<undefName> is used, character names should be
+specified as a comment (following C<#>) on each line.
+
+=item undefChar
+
+=item undefName
+
+-- see 6.3.4 Reducing the Repertoire, UTS #10.
+
+Undefines the collation element as if it were unassigned in the table.
+This reduces the size of the table.
+If an unassigned character appears in the string to be collated,
+the sort key is made from its codepoint
+as a single-character collation element,
+as it is greater than any other assigned collation elements
+(in the codepoint order among the unassigned characters).
+But, it'd be better to ignore characters
+unfamiliar to you and maybe never used.
+
+Through C<undefChar>, any character matching C<qr/$undefChar/>
+will be undefined. Through C<undefName>, any character whose name
+(given in the C<table> file as a comment) matches C<qr/$undefName/>
+will be undefined.
+
+ex. Collation weights for beyond-BMP characters are not stored in object:
+
+    undefChar => qr/[^\0-\x{fffd}]/,
+
+=item upper_before_lower
+
+-- see 6.6 Case Comparisons, UTS #10.
+
+By default, lowercase is before uppercase.
+If the parameter is made true, this is reversed.
+
+B<NOTE>: This parameter simplemindedly assumes that any lowercase/uppercase
+distinctions must occur in level 3, and their weights at level 3 must be
+same as those mentioned in 7.3.1, UTS #10.
+If you define your collation elements which differs from this requirement,
+this parameter doesn't work validly.
+
+=item variable
+
+-- see 3.2.2 Variable Weighting, UTS #10.
+
+This key allows to variable weighting for variable collation elements,
+which are marked with an ASTERISK in the table
+(NOTE: Many punction marks and symbols are variable in F<allkeys.txt>).
+
+   variable => 'blanked', 'non-ignorable', 'shifted', or 'shift-trimmed'.
+
+These names are case-insensitive.
+By default (if specification is omitted), 'shifted' is adopted.
+
+   'Blanked'        Variable elements are made ignorable at levels 1 through 3;
+                    considered at the 4th level.
+
+   'Non-Ignorable'  Variable elements are not reset to ignorable.
+
+   'Shifted'        Variable elements are made ignorable at levels 1 through 3
+                    their level 4 weight is replaced by the old level 1 weight.
+                    Level 4 weight for Non-Variable elements is 0xFFFF.
+
+   'Shift-Trimmed'  Same as 'shifted', but all FFFF's at the 4th level
+                    are trimmed.
+
+=back
+
+=head2 Methods for Collation
+
+=over 4
+
+=item C<@sorted = $Collator-E<gt>sort(@not_sorted)>
+
+Sorts a list of strings.
+
+=item C<$result = $Collator-E<gt>cmp($a, $b)>
+
+Returns 1 (when C<$a> is greater than C<$b>)
+or 0 (when C<$a> is equal to C<$b>)
+or -1 (when C<$a> is lesser than C<$b>).
+
+=item C<$result = $Collator-E<gt>eq($a, $b)>
+
+=item C<$result = $Collator-E<gt>ne($a, $b)>
+
+=item C<$result = $Collator-E<gt>lt($a, $b)>
+
+=item C<$result = $Collator-E<gt>le($a, $b)>
+
+=item C<$result = $Collator-E<gt>gt($a, $b)>
+
+=item C<$result = $Collator-E<gt>ge($a, $b)>
+
+They works like the same name operators as theirs.
+
+   eq : whether $a is equal to $b.
+   ne : whether $a is not equal to $b.
+   lt : whether $a is lesser than $b.
+   le : whether $a is lesser than $b or equal to $b.
+   gt : whether $a is greater than $b.
+   ge : whether $a is greater than $b or equal to $b.
+
+=item C<$sortKey = $Collator-E<gt>getSortKey($string)>
+
+-- see 4.3 Form Sort Key, UTS #10.
+
+Returns a sort key.
+
+You compare the sort keys using a binary comparison
+and get the result of the comparison of the strings using UCA.
+
+   $Collator->getSortKey($a) cmp $Collator->getSortKey($b)
+
+      is equivalent to
+
+   $Collator->cmp($a, $b)
+
+=item C<$sortKeyForm = $Collator-E<gt>viewSortKey($string)>
+
+Converts a sorting key into its representation form.
+If C<UCA_Version> is 8, the output is slightly different.
+
+   use Unicode::Collate;
+   my $c = Unicode::Collate->new();
+   print $c->viewSortKey("Perl"),"\n";
+
+   # output:
+   # [0B67 0A65 0B7F 0B03 | 0020 0020 0020 0020 | 0008 0002 0002 0002 | FFFF FFFF FFFF FFFF]
+   #  Level 1               Level 2               Level 3               Level 4
+
+=back
+
+=head2 Methods for Searching
+
+B<DISCLAIMER:> If C<preprocess> or C<normalization> parameter is true
+for C<$Collator>, calling these methods (C<index>, C<match>, C<gmatch>,
+C<subst>, C<gsubst>) is croaked,
+as the position and the length might differ
+from those on the specified string.
+(And C<rearrange> and C<hangul_terminator> parameters are neglected.)
+
+The C<match>, C<gmatch>, C<subst>, C<gsubst> methods work
+like C<m//>, C<m//g>, C<s///>, C<s///g>, respectively,
+but they are not aware of any pattern, but only a literal substring.
+
+=over 4
+
+=item C<$position = $Collator-E<gt>index($string, $substring[, $position])>
+
+=item C<($position, $length) = $Collator-E<gt>index($string, $substring[, $position])>
+
+If C<$substring> matches a part of C<$string>, returns
+the position of the first occurrence of the matching part in scalar context;
+in list context, returns a two-element list of
+the position and the length of the matching part.
+
+If C<$substring> does not match any part of C<$string>,
+returns C<-1> in scalar context and
+an empty list in list context.
+
+e.g. you say
+
+  my $Collator = Unicode::Collate->new( normalization => undef, level => 1 );
+                                     # (normalization => undef) is REQUIRED.
+  my $str = "Ich muß studieren Perl.";
+  my $sub = "MÜSS";
+  my $match;
+  if (my($pos,$len) = $Collator->index($str, $sub)) {
+      $match = substr($str, $pos, $len);
+  }
+
+and get C<"muß"> in C<$match> since C<"muß">
+is primary equal to C<"MÜSS">.
+
+=item C<$match_ref = $Collator-E<gt>match($string, $substring)>
+
+=item C<($match)   = $Collator-E<gt>match($string, $substring)>
+
+If C<$substring> matches a part of C<$string>, in scalar context, returns
+B<a reference to> the first occurrence of the matching part
+(C<$match_ref> is always true if matches,
+since every reference is B<true>);
+in list context, returns the first occurrence of the matching part.
+
+If C<$substring> does not match any part of C<$string>,
+returns C<undef> in scalar context and
+an empty list in list context.
+
+e.g.
+
+    if ($match_ref = $Collator->match($str, $sub)) { # scalar context
+	print "matches [$$match_ref].\n";
+    } else {
+	print "doesn't match.\n";
+    }
+
+     or
+
+    if (($match) = $Collator->match($str, $sub)) { # list context
+	print "matches [$match].\n";
+    } else {
+	print "doesn't match.\n";
+    }
+
+=item C<@match = $Collator-E<gt>gmatch($string, $substring)>
+
+If C<$substring> matches a part of C<$string>, returns
+all the matching parts (or matching count in scalar context).
+
+If C<$substring> does not match any part of C<$string>,
+returns an empty list.
+
+=item C<$count = $Collator-E<gt>subst($string, $substring, $replacement)>
+
+If C<$substring> matches a part of C<$string>,
+the first occurrence of the matching part is replaced by C<$replacement>
+(C<$string> is modified) and return C<$count> (always equals to C<1>).
+
+C<$replacement> can be a C<CODEREF>,
+taking the matching part as an argument,
+and returning a string to replace the matching part
+(a bit similar to C<s/(..)/$coderef-E<gt>($1)/e>).
+
+=item C<$count = $Collator-E<gt>gsubst($string, $substring, $replacement)>
+
+If C<$substring> matches a part of C<$string>,
+all the occurrences of the matching part is replaced by C<$replacement>
+(C<$string> is modified) and return C<$count>.
+
+C<$replacement> can be a C<CODEREF>,
+taking the matching part as an argument,
+and returning a string to replace the matching part
+(a bit similar to C<s/(..)/$coderef-E<gt>($1)/eg>).
+
+e.g.
+
+  my $Collator = Unicode::Collate->new( normalization => undef, level => 1 );
+                                     # (normalization => undef) is REQUIRED.
+  my $str = "Camel donkey zebra came\x{301}l CAMEL horse cAm\0E\0L...";
+  $Collator->gsubst($str, "camel", sub { "<b>$_[0]</b>" });
+
+  # now $str is "<b>Camel</b> donkey zebra <b>came\x{301}l</b> <b>CAMEL</b> horse <b>cAm\0E\0L</b>...";
+  # i.e., all the camels are made bold-faced.
+
+=back
+
+=head2 Other Methods
+
+=over 4
+
+=item C<%old_tailoring = $Collator-E<gt>change(%new_tailoring)>
+
+Change the value of specified keys and returns the changed part.
+
+    $Collator = Unicode::Collate->new(level => 4);
+
+    $Collator->eq("perl", "PERL"); # false
+
+    %old = $Collator->change(level => 2); # returns (level => 4).
+
+    $Collator->eq("perl", "PERL"); # true
+
+    $Collator->change(%old); # returns (level => 2).
+
+    $Collator->eq("perl", "PERL"); # false
+
+Not all C<(key,value)>s are allowed to be changed.
+See also C<@Unicode::Collate::ChangeOK> and C<@Unicode::Collate::ChangeNG>.
+
+In the scalar context, returns the modified collator
+(but it is B<not> a clone from the original).
+
+    $Collator->change(level => 2)->eq("perl", "PERL"); # true
+
+    $Collator->eq("perl", "PERL"); # true; now max level is 2nd.
+
+    $Collator->change(level => 4)->eq("perl", "PERL"); # false
+
+=item C<$version = $Collator-E<gt>version()>
+
+Returns the version number (a string) of the Unicode Standard
+which the C<table> file used by the collator object is based on.
+If the table does not include a version line (starting with C<@version>),
+returns C<"unknown">.
+
+=item C<UCA_Version()>
+
+Returns the tracking version number of UTS #10 this module consults.
+
+=item C<Base_Unicode_Version()>
+
+Returns the version number of UTS #10 this module consults.
+
+=back
+
+=head1 EXPORT
+
+No method will be exported.
+
+=head1 INSTALL
+
+Though this module can be used without any C<table> file,
+to use this module easily, it is recommended to install a table file
+in the UCA format, by copying it under the directory
+<a place in @INC>/Unicode/Collate.
+
+The most preferable one is "The Default Unicode Collation Element Table"
+(aka DUCET), available from the Unicode Consortium's website:
+
+   http://www.unicode.org/Public/UCA/
+
+   http://www.unicode.org/Public/UCA/latest/allkeys.txt (latest version)
+
+If DUCET is not installed, it is recommended to copy the file
+from http://www.unicode.org/Public/UCA/latest/allkeys.txt
+to <a place in @INC>/Unicode/Collate/allkeys.txt
+manually.
+
+=head1 CAVEATS
+
+=over 4
+
+=item Normalization
+
+Use of the C<normalization> parameter requires the B<Unicode::Normalize>
+module (see L<Unicode::Normalize>).
+
+If you need not it (say, in the case when you need not
+handle any combining characters),
+assign C<normalization =E<gt> undef> explicitly.
+
+-- see 6.5 Avoiding Normalization, UTS #10.
+
+=item Conformance Test
+
+The Conformance Test for the UCA is available
+under L<http://www.unicode.org/Public/UCA/>.
+
+For F<CollationTest_SHIFTED.txt>,
+a collator via C<Unicode::Collate-E<gt>new( )> should be used;
+for F<CollationTest_NON_IGNORABLE.txt>, a collator via
+C<Unicode::Collate-E<gt>new(variable =E<gt> "non-ignorable", level =E<gt> 3)>.
+
+B<Unicode::Normalize is required to try The Conformance Test.>
+
+=back
+
+=head1 AUTHOR, COPYRIGHT AND LICENSE
+
+The Unicode::Collate module for perl was written by SADAHIRO Tomoyuki,
+<SADAHIRO@cpan.org>. This module is Copyright(C) 2001-2005,
+SADAHIRO Tomoyuki. Japan. All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+The file Unicode/Collate/allkeys.txt was copied directly
+from L<http://www.unicode.org/Public/UCA/4.1.0/allkeys.txt>.
+This file is Copyright (c) 1991-2005 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in L<http://www.unicode.org/copyright.html>.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Unicode Collation Algorithm - UTS #10
+
+L<http://www.unicode.org/reports/tr10/>
+
+=item The Default Unicode Collation Element Table (DUCET)
+
+L<http://www.unicode.org/Public/UCA/latest/allkeys.txt>
+
+=item The conformance test for the UCA
+
+L<http://www.unicode.org/Public/UCA/latest/CollationTest.html>
+
+L<http://www.unicode.org/Public/UCA/latest/CollationTest.zip>
+
+=item Hangul Syllable Type
+
+L<http://www.unicode.org/Public/UNIDATA/HangulSyllableType.txt>
+
+=item Unicode Normalization Forms - UAX #15
+
+L<http://www.unicode.org/reports/tr15/>
+
+=back
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Unicode/Collate/keys.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Unicode/Collate/keys.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Unicode/Collate/keys.txt	(revision 14489)
@@ -0,0 +1,864 @@
+#### This file is generated from allkeys-3.1.1.txt (unicode.org)
+#### by deleting many many entries.
+####
+#### This table is intended ONLY for doing a test
+#### of Unicode/Collate.pm, a Perl module.
+####
+#### The entries contained here ARE:
+####    0000..007F   # Basic Latin
+####    0080..00FF   # Latin-1 Supplement
+####    0300..036F   # Combining Diacritical Marks
+####    1100..11FF   # Hangul Jamo
+####    2000..206F   # General Punctuation
+####    3040..309F   # Hiragana
+####    30A0..30FF   # Katakana
+####
+#### To fetch the original file, access to this:
+#### http://www.unicode.org/reports/tr10/allkeys.txt
+####
+@version 3.1.1
+0000  ; [.0000.0000.0000.0000] # [0000] NULL (in 6429)
+0001  ; [.0000.0000.0000.0000] # [0001] START OF HEADING (in 6429)
+0002  ; [.0000.0000.0000.0000] # [0002] START OF TEXT (in 6429)
+0003  ; [.0000.0000.0000.0000] # [0003] END OF TEXT (in 6429)
+0004  ; [.0000.0000.0000.0000] # [0004] END OF TRANSMISSION (in 6429)
+0005  ; [.0000.0000.0000.0000] # [0005] ENQUIRY (in 6429)
+0006  ; [.0000.0000.0000.0000] # [0006] ACKNOWLEDGE (in 6429)
+0007  ; [.0000.0000.0000.0000] # [0007] BELL (in 6429)
+0008  ; [.0000.0000.0000.0000] # [0008] BACKSPACE (in 6429)
+000E  ; [.0000.0000.0000.0000] # [000E] SHIFT OUT (in 6429)
+000F  ; [.0000.0000.0000.0000] # [000F] SHIFT IN (in 6429)
+0010  ; [.0000.0000.0000.0000] # [0010] DATA LINK ESCAPE (in 6429)
+0011  ; [.0000.0000.0000.0000] # [0011] DEVICE CONTROL ONE (in 6429)
+0012  ; [.0000.0000.0000.0000] # [0012] DEVICE CONTROL TWO (in 6429)
+0013  ; [.0000.0000.0000.0000] # [0013] DEVICE CONTROL THREE (in 6429)
+0014  ; [.0000.0000.0000.0000] # [0014] DEVICE CONTROL FOUR (in 6429)
+0015  ; [.0000.0000.0000.0000] # [0015] NEGATIVE ACKNOWLEDGE (in 6429)
+0016  ; [.0000.0000.0000.0000] # [0016] SYNCHRONOUS IDLE (in 6429)
+0017  ; [.0000.0000.0000.0000] # [0017] END OF TRANSMISSION BLOCK (in 6429)
+0018  ; [.0000.0000.0000.0000] # [0018] CANCEL (in 6429)
+0019  ; [.0000.0000.0000.0000] # [0019] END OF MEDIUM (in 6429)
+001A  ; [.0000.0000.0000.0000] # [001A] SUBSTITUTE (in 6429)
+001B  ; [.0000.0000.0000.0000] # [001B] ESCAPE (in 6429)
+001C  ; [.0000.0000.0000.0000] # [001C] FILE SEPARATOR (in 6429)
+001D  ; [.0000.0000.0000.0000] # [001D] GROUP SEPARATOR (in 6429)
+001E  ; [.0000.0000.0000.0000] # [001E] RECORD SEPARATOR (in 6429)
+001F  ; [.0000.0000.0000.0000] # [001F] UNIT SEPARATOR (in 6429)
+007F  ; [.0000.0000.0000.0000] # [007F] DELETE (in 6429)
+0080  ; [.0000.0000.0000.0000] # [0080] <control>
+0081  ; [.0000.0000.0000.0000] # [0081] <control>
+0082  ; [.0000.0000.0000.0000] # [0082] BREAK PERMITTED HERE (in 6429)
+0083  ; [.0000.0000.0000.0000] # [0083] NO BREAK HERE (in 6429)
+0084  ; [.0000.0000.0000.0000] # [0084] <control>
+0086  ; [.0000.0000.0000.0000] # [0086] START OF SELECTED AREA (in 6429)
+0087  ; [.0000.0000.0000.0000] # [0087] END OF SELECTED AREA (in 6429)
+0088  ; [.0000.0000.0000.0000] # [0088] CHARACTER TABULATION SET (in 6429)
+0089  ; [.0000.0000.0000.0000] # [0089] CHARACTER TABULATION WITH JUSTIFICATION (in 6429)
+008A  ; [.0000.0000.0000.0000] # [008A] LINE TABULATION SET (in 6429)
+008B  ; [.0000.0000.0000.0000] # [008B] PARTIAL LINE FORWARD (in 6429)
+008C  ; [.0000.0000.0000.0000] # [008C] PARTIAL LINE BACKWARD (in 6429)
+008D  ; [.0000.0000.0000.0000] # [008D] PARTIAL LINE FEED (in 6429)
+008E  ; [.0000.0000.0000.0000] # [008E] SINGLE SHIFT TWO (in 6429)
+008F  ; [.0000.0000.0000.0000] # [008F] SINGLE SHIFT THREE (in 6429)
+0090  ; [.0000.0000.0000.0000] # [0090] DEVICE CONTROL STRING (in 6429)
+0091  ; [.0000.0000.0000.0000] # [0091] PRIVATE USE ONE (in 6429)
+0092  ; [.0000.0000.0000.0000] # [0092] PRIVATE USE TWO (in 6429)
+0093  ; [.0000.0000.0000.0000] # [0093] SET TRANSMIT STATE (in 6429)
+0094  ; [.0000.0000.0000.0000] # [0094] CANCEL CHARACTER (in 6429)
+0095  ; [.0000.0000.0000.0000] # [0095] MESSAGE WAITING (in 6429)
+0096  ; [.0000.0000.0000.0000] # [0096] START OF GUARDED AREA (in 6429)
+0097  ; [.0000.0000.0000.0000] # [0097] END OF GUARDED AREA (in 6429)
+0098  ; [.0000.0000.0000.0000] # [0098] START OF STRING (in 6429)
+0099  ; [.0000.0000.0000.0000] # [0099] <control>
+009A  ; [.0000.0000.0000.0000] # [009A] SINGLE CHARACTER INTRODUCER (in 6429)
+009B  ; [.0000.0000.0000.0000] # [009B] CONTROL SEQUENCE INTRODUCER (in 6429)
+009C  ; [.0000.0000.0000.0000] # [009C] STRING TERMINATOR (in 6429)
+009D  ; [.0000.0000.0000.0000] # [009D] OPERATING SYSTEM COMMAND (in 6429)
+009E  ; [.0000.0000.0000.0000] # [009E] PRIVACY MESSAGE (in 6429)
+009F  ; [.0000.0000.0000.0000] # [009F] APPLICATION PROGRAM COMMAND (in 6429)
+200B  ; [.0000.0000.0000.0000] # [200B] ZERO WIDTH SPACE
+200C  ; [.0000.0000.0000.0000] # [200C] ZERO WIDTH NON-JOINER
+200D  ; [.0000.0000.0000.0000] # [200D] ZERO WIDTH JOINER
+200E  ; [.0000.0000.0000.0000] # [200E] LEFT-TO-RIGHT MARK
+200F  ; [.0000.0000.0000.0000] # [200F] RIGHT-TO-LEFT MARK
+202A  ; [.0000.0000.0000.0000] # [202A] LEFT-TO-RIGHT EMBEDDING
+202B  ; [.0000.0000.0000.0000] # [202B] RIGHT-TO-LEFT EMBEDDING
+202C  ; [.0000.0000.0000.0000] # [202C] POP DIRECTIONAL FORMATTING
+202D  ; [.0000.0000.0000.0000] # [202D] LEFT-TO-RIGHT OVERRIDE
+202E  ; [.0000.0000.0000.0000] # [202E] RIGHT-TO-LEFT OVERRIDE
+206A  ; [.0000.0000.0000.0000] # [206A] INHIBIT SYMMETRIC SWAPPING
+206B  ; [.0000.0000.0000.0000] # [206B] ACTIVATE SYMMETRIC SWAPPING
+206C  ; [.0000.0000.0000.0000] # [206C] INHIBIT ARABIC FORM SHAPING
+206D  ; [.0000.0000.0000.0000] # [206D] ACTIVATE ARABIC FORM SHAPING
+206E  ; [.0000.0000.0000.0000] # [206E] NATIONAL DIGIT SHAPES
+206F  ; [.0000.0000.0000.0000] # [206F] NOMINAL DIGIT SHAPES
+0009  ; [*0201.0020.0002.0009] # HORIZONTAL TABULATION (in 6429)
+000A  ; [*0202.0020.0002.000A] # LINE FEED (in 6429)
+000B  ; [*0203.0020.0002.000B] # VERTICAL TABULATION (in 6429)
+000C  ; [*0204.0020.0002.000C] # FORM FEED (in 6429)
+000D  ; [*0205.0020.0002.000D] # CARRIAGE RETURN (in 6429)
+0020  ; [*0209.0020.0002.0020] # SPACE
+0021  ; [*024B.0020.0002.0021] # EXCLAMATION MARK
+0022  ; [*0270.0020.0002.0022] # QUOTATION MARK
+0023  ; [*02A9.0020.0002.0023] # NUMBER SIGN
+0025  ; [*02AA.0020.0002.0025] # PERCENT SIGN
+0026  ; [*02A7.0020.0002.0026] # AMPERSAND
+0027  ; [*0269.0020.0002.0027] # APOSTROPHE
+0028  ; [*027A.0020.0002.0028] # LEFT PARENTHESIS
+0029  ; [*027B.0020.0002.0029] # RIGHT PARENTHESIS
+002A  ; [*02A2.0020.0002.002A] # ASTERISK
+002B  ; [*039F.0020.0002.002B] # PLUS SIGN
+002C  ; [*022D.0020.0002.002C] # COMMA
+002D  ; [*0221.0020.0002.002D] # HYPHEN-MINUS
+002E  ; [*0255.0020.0002.002E] # FULL STOP
+002F  ; [*02A4.0020.0002.002F] # SOLIDUS
+003A  ; [*0237.0020.0002.003A] # COLON
+003B  ; [*0235.0020.0002.003B] # SEMICOLON
+003C  ; [*03A3.0020.0002.003C] # LESS-THAN SIGN
+003D  ; [*03A4.0020.0002.003D] # EQUALS SIGN
+003E  ; [*03A5.0020.0002.003E] # GREATER-THAN SIGN
+003F  ; [*024E.0020.0002.003F] # QUESTION MARK
+0040  ; [*02A1.0020.0002.0040] # COMMERCIAL AT
+005B  ; [*027C.0020.0002.005B] # LEFT SQUARE BRACKET
+005C  ; [*02A6.0020.0002.005C] # REVERSE SOLIDUS
+005D  ; [*027D.0020.0002.005D] # RIGHT SQUARE BRACKET
+005E  ; [*020F.0020.0002.005E] # CIRCUMFLEX ACCENT
+005F  ; [*021B.0020.0002.005F] # LOW LINE
+0060  ; [*020C.0020.0002.0060] # GRAVE ACCENT
+007B  ; [*027E.0020.0002.007B] # LEFT CURLY BRACKET
+007C  ; [*03A7.0020.0002.007C] # VERTICAL LINE
+007D  ; [*027F.0020.0002.007D] # RIGHT CURLY BRACKET
+007E  ; [*03AA.0020.0002.007E] # TILDE
+0085  ; [*0206.0020.0002.0085] # NEXT LINE (in 6429)
+00A0  ; [*0209.0020.001B.00A0] # NO-BREAK SPACE; QQK
+00A1  ; [*024C.0020.0002.00A1] # INVERTED EXCLAMATION MARK
+00A6  ; [*03A8.0020.0002.00A6] # BROKEN BAR
+00A7  ; [*029C.0020.0002.00A7] # SECTION SIGN
+00A8  ; [*0214.0020.0002.00A8] # DIAERESIS
+00A9  ; [*029F.0020.0002.00A9] # COPYRIGHT SIGN
+00AB  ; [*0278.0020.0002.00AB] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC  ; [*03A6.0020.0002.00AC] # NOT SIGN
+00AD  ; [*0220.0020.0002.00AD] # SOFT HYPHEN
+00AE  ; [*02A0.0020.0002.00AE] # REGISTERED SIGN
+00AF  ; [*0210.0020.0002.00AF] # MACRON
+00B0  ; [*030A.0020.0002.00B0] # DEGREE SIGN
+00B1  ; [*03A0.0020.0002.00B1] # PLUS-MINUS SIGN
+00B4  ; [*020D.0020.0002.00B4] # ACUTE ACCENT
+00B6  ; [*029D.0020.0002.00B6] # PILCROW SIGN
+00B7  ; [*025F.0020.0002.00B7] # MIDDLE DOT
+00B8  ; [*0219.0020.0002.00B8] # CEDILLA
+00BB  ; [*0279.0020.0002.00BB] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BF  ; [*024F.0020.0002.00BF] # INVERTED QUESTION MARK
+00D7  ; [*03A2.0020.0002.00D7] # MULTIPLICATION SIGN
+00F7  ; [*03A1.0020.0002.00F7] # DIVISION SIGN
+2000  ; [*0209.0020.0004.2000] # EN QUAD; QQK
+2001  ; [*0209.0020.0004.2001] # EM QUAD; QQK
+2002  ; [*0209.0020.0004.2002] # EN SPACE; QQK
+2003  ; [*0209.0020.0004.2003] # EM SPACE; QQK
+2004  ; [*0209.0020.0004.2004] # THREE-PER-EM SPACE; QQK
+2005  ; [*0209.0020.0004.2005] # FOUR-PER-EM SPACE; QQK
+2006  ; [*0209.0020.0004.2006] # SIX-PER-EM SPACE; QQK
+2007  ; [*0209.0020.001B.2007] # FIGURE SPACE; QQK
+2008  ; [*0209.0020.0004.2008] # PUNCTUATION SPACE; QQK
+2009  ; [*0209.0020.0004.2009] # THIN SPACE; QQK
+200A  ; [*0209.0020.0004.200A] # HAIR SPACE; QQK
+2010  ; [*0225.0020.0002.2010] # HYPHEN
+2011  ; [*0225.0020.001B.2011] # NON-BREAKING HYPHEN; QQK
+2012  ; [*0226.0020.0002.2012] # FIGURE DASH
+2013  ; [*0227.0020.0002.2013] # EN DASH
+2014  ; [*0228.0020.0002.2014] # EM DASH
+2015  ; [*0229.0020.0002.2015] # HORIZONTAL BAR
+2016  ; [*03A9.0020.0002.2016] # DOUBLE VERTICAL LINE
+2017  ; [*021C.0020.0002.2017] # DOUBLE LOW LINE
+2018  ; [*026A.0020.0002.2018] # LEFT SINGLE QUOTATION MARK
+2019  ; [*026B.0020.0002.2019] # RIGHT SINGLE QUOTATION MARK
+201A  ; [*026C.0020.0002.201A] # SINGLE LOW-9 QUOTATION MARK
+201B  ; [*026D.0020.0002.201B] # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C  ; [*0271.0020.0002.201C] # LEFT DOUBLE QUOTATION MARK
+201D  ; [*0272.0020.0002.201D] # RIGHT DOUBLE QUOTATION MARK
+201E  ; [*0273.0020.0002.201E] # DOUBLE LOW-9 QUOTATION MARK
+201F  ; [*0274.0020.0002.201F] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020  ; [*02AE.0020.0002.2020] # DAGGER
+2021  ; [*02AF.0020.0002.2021] # DOUBLE DAGGER
+2022  ; [*02B0.0020.0002.2022] # BULLET
+2023  ; [*02B1.0020.0002.2023] # TRIANGULAR BULLET
+2024  ; [*0255.0020.0004.2024] # ONE DOT LEADER; QQK
+2025  ; [*0255.0020.0004.2025][*0255.0020.0004.2025] # TWO DOT LEADER; QQKN
+2026  ; [*0255.0020.0004.2026][*0255.0020.0004.2026][*0255.0020.001F.2026] # HORIZONTAL ELLIPSIS; QQKN
+2027  ; [*02B2.0020.0002.2027] # HYPHENATION POINT
+2028  ; [*0207.0020.0002.2028] # LINE SEPARATOR
+2029  ; [*0208.0020.0002.2029] # PARAGRAPH SEPARATOR
+202F  ; [*0209.0020.001B.202F] # NARROW NO-BREAK SPACE; QQK
+2030  ; [*02AC.0020.0002.2030] # PER MILLE SIGN
+2031  ; [*02AD.0020.0002.2031] # PER TEN THOUSAND SIGN
+2032  ; [*02B6.0020.0002.2032] # PRIME
+2033  ; [*02B6.0020.0004.2033][*02B6.0020.0004.2033] # DOUBLE PRIME; QQKN
+2034  ; [*02B6.0020.0004.2034][*02B6.0020.0004.2034][*02B6.0020.001F.2034] # TRIPLE PRIME; QQKN
+2035  ; [*02B7.0020.0002.2035] # REVERSED PRIME
+2036  ; [*02B7.0020.0004.2036][*02B7.0020.0004.2036] # REVERSED DOUBLE PRIME; QQKN
+2037  ; [*02B7.0020.0004.2037][*02B7.0020.0004.2037][*02B7.0020.001F.2037] # REVERSED TRIPLE PRIME; QQKN
+2038  ; [*02B9.0020.0002.2038] # CARET
+2039  ; [*026E.0020.0002.2039] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A  ; [*026F.0020.0002.203A] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B  ; [*02BA.0020.0002.203B] # REFERENCE MARK
+203C  ; [*024B.0020.0004.203C][*024B.0020.0004.203C] # DOUBLE EXCLAMATION MARK; QQKN
+203D  ; [*0254.0020.0002.203D] # INTERROBANG
+203E  ; [*0211.0020.0002.203E] # OVERLINE
+203F  ; [*02BB.0020.0002.203F] # UNDERTIE
+2040  ; [*02BC.0020.0002.2040] # CHARACTER TIE
+2041  ; [*02BD.0020.0002.2041] # CARET INSERTION POINT
+2042  ; [*02BE.0020.0002.2042] # ASTERISM
+2043  ; [*02B3.0020.0002.2043] # HYPHEN BULLET
+2044  ; [*02A5.0020.0002.2044] # FRACTION SLASH
+2045  ; [*0286.0020.0002.2045] # LEFT SQUARE BRACKET WITH QUILL
+2046  ; [*0287.0020.0002.2046] # RIGHT SQUARE BRACKET WITH QUILL
+2048  ; [*024E.0020.0004.2048][*024B.0020.0004.2048] # QUESTION EXCLAMATION MARK; QQKN
+2049  ; [*024B.0020.0004.2049][*024E.0020.0004.2049] # EXCLAMATION QUESTION MARK; QQKN
+204A  ; [*02A8.0020.0002.204A] # TIRONIAN SIGN ET
+204B  ; [*029E.0020.0002.204B] # REVERSED PILCROW SIGN
+204C  ; [*02B4.0020.0002.204C] # BLACK LEFTWARDS BULLET
+204D  ; [*02B5.0020.0002.204D] # BLACK RIGHTWARDS BULLET
+309B  ; [*021E.0020.0002.309B] # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C  ; [*021F.0020.0002.309C] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30FB  ; [*022C.0020.0002.30FB] # KATAKANA MIDDLE DOT
+0332  ; [.0000.0021.0002.0332] # COMBINING LOW LINE
+0313  ; [.0000.0022.0002.0313] # COMBINING COMMA ABOVE
+0343  ; [.0000.0022.0002.0343] # COMBINING GREEK KORONIS; QQC
+0314  ; [.0000.002A.0002.0314] # COMBINING REVERSED COMMA ABOVE
+0301  ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
+0341  ; [.0000.0032.0002.0341] # COMBINING ACUTE TONE MARK; QQC
+0300  ; [.0000.0035.0002.0300] # COMBINING GRAVE ACCENT
+0340  ; [.0000.0035.0002.0340] # COMBINING GRAVE TONE MARK; QQC
+0306  ; [.0000.0037.0002.0306] # COMBINING BREVE
+0302  ; [.0000.003C.0002.0302] # COMBINING CIRCUMFLEX ACCENT
+030C  ; [.0000.0041.0002.030C] # COMBINING CARON
+030A  ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
+0342  ; [.0000.0045.0002.0342] # COMBINING GREEK PERISPOMENI
+0308  ; [.0000.0047.0002.0308] # COMBINING DIAERESIS
+0344  ; [.0000.0047.0002.0308][.0000.0032.0002.0301] # COMBINING GREEK DIALYTIKA TONOS; QQCM
+030B  ; [.0000.004D.0002.030B] # COMBINING DOUBLE ACUTE ACCENT
+0303  ; [.0000.004E.0002.0303] # COMBINING TILDE
+0307  ; [.0000.0052.0002.0307] # COMBINING DOT ABOVE
+0338  ; [.0000.0054.0002.0338] # COMBINING LONG SOLIDUS OVERLAY
+0327  ; [.0000.0055.0002.0327] # COMBINING CEDILLA
+0328  ; [.0000.0058.0002.0328] # COMBINING OGONEK
+0304  ; [.0000.005A.0002.0304] # COMBINING MACRON
+0305  ; [.0000.005E.0002.0305] # COMBINING OVERLINE
+0309  ; [.0000.005F.0002.0309] # COMBINING HOOK ABOVE
+030D  ; [.0000.0060.0002.030D] # COMBINING VERTICAL LINE ABOVE
+030E  ; [.0000.0061.0002.030E] # COMBINING DOUBLE VERTICAL LINE ABOVE
+030F  ; [.0000.0062.0002.030F] # COMBINING DOUBLE GRAVE ACCENT
+0310  ; [.0000.0063.0002.0310] # COMBINING CANDRABINDU
+0311  ; [.0000.0064.0002.0311] # COMBINING INVERTED BREVE
+0312  ; [.0000.0065.0002.0312] # COMBINING TURNED COMMA ABOVE
+0315  ; [.0000.0066.0002.0315] # COMBINING COMMA ABOVE RIGHT
+0316  ; [.0000.0067.0002.0316] # COMBINING GRAVE ACCENT BELOW
+0317  ; [.0000.0068.0002.0317] # COMBINING ACUTE ACCENT BELOW
+0318  ; [.0000.0069.0002.0318] # COMBINING LEFT TACK BELOW
+0319  ; [.0000.006A.0002.0319] # COMBINING RIGHT TACK BELOW
+031A  ; [.0000.006B.0002.031A] # COMBINING LEFT ANGLE ABOVE
+031B  ; [.0000.006C.0002.031B] # COMBINING HORN
+031C  ; [.0000.0072.0002.031C] # COMBINING LEFT HALF RING BELOW
+031D  ; [.0000.0073.0002.031D] # COMBINING UP TACK BELOW
+031E  ; [.0000.0074.0002.031E] # COMBINING DOWN TACK BELOW
+031F  ; [.0000.0075.0002.031F] # COMBINING PLUS SIGN BELOW
+0320  ; [.0000.0076.0002.0320] # COMBINING MINUS SIGN BELOW
+0321  ; [.0000.0077.0002.0321] # COMBINING PALATALIZED HOOK BELOW
+0322  ; [.0000.0078.0002.0322] # COMBINING RETROFLEX HOOK BELOW
+0323  ; [.0000.0079.0002.0323] # COMBINING DOT BELOW
+0324  ; [.0000.007E.0002.0324] # COMBINING DIAERESIS BELOW
+0325  ; [.0000.007F.0002.0325] # COMBINING RING BELOW
+0326  ; [.0000.0080.0002.0326] # COMBINING COMMA BELOW
+0329  ; [.0000.0081.0002.0329] # COMBINING VERTICAL LINE BELOW
+032A  ; [.0000.0082.0002.032A] # COMBINING BRIDGE BELOW
+032B  ; [.0000.0083.0002.032B] # COMBINING INVERTED DOUBLE ARCH BELOW
+032C  ; [.0000.0084.0002.032C] # COMBINING CARON BELOW
+032D  ; [.0000.0085.0002.032D] # COMBINING CIRCUMFLEX ACCENT BELOW
+032E  ; [.0000.0086.0002.032E] # COMBINING BREVE BELOW
+032F  ; [.0000.0087.0002.032F] # COMBINING INVERTED BREVE BELOW
+0330  ; [.0000.0088.0002.0330] # COMBINING TILDE BELOW
+0331  ; [.0000.0089.0002.0331] # COMBINING MACRON BELOW
+0333  ; [.0000.008A.0002.0333] # COMBINING DOUBLE LOW LINE
+0334  ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
+0335  ; [.0000.008C.0002.0335] # COMBINING SHORT STROKE OVERLAY
+0336  ; [.0000.008D.0002.0336] # COMBINING LONG STROKE OVERLAY
+0337  ; [.0000.008E.0002.0337] # COMBINING SHORT SOLIDUS OVERLAY
+0339  ; [.0000.008F.0002.0339] # COMBINING RIGHT HALF RING BELOW
+033A  ; [.0000.0090.0002.033A] # COMBINING INVERTED BRIDGE BELOW
+033B  ; [.0000.0091.0002.033B] # COMBINING SQUARE BELOW
+033C  ; [.0000.0092.0002.033C] # COMBINING SEAGULL BELOW
+033D  ; [.0000.0093.0002.033D] # COMBINING X ABOVE
+033E  ; [.0000.0094.0002.033E] # COMBINING VERTICAL TILDE
+033F  ; [.0000.0095.0002.033F] # COMBINING DOUBLE OVERLINE
+0345  ; [.0000.0096.0002.0345] # COMBINING GREEK YPOGEGRAMMENI
+0346  ; [.0000.0097.0002.0346] # COMBINING BRIDGE ABOVE
+0347  ; [.0000.0098.0002.0347] # COMBINING EQUALS SIGN BELOW
+0348  ; [.0000.0099.0002.0348] # COMBINING DOUBLE VERTICAL LINE BELOW
+0349  ; [.0000.009A.0002.0349] # COMBINING LEFT ANGLE BELOW
+034A  ; [.0000.009B.0002.034A] # COMBINING NOT TILDE ABOVE
+034B  ; [.0000.009C.0002.034B] # COMBINING HOMOTHETIC ABOVE
+034C  ; [.0000.009D.0002.034C] # COMBINING ALMOST EQUAL TO ABOVE
+034D  ; [.0000.009E.0002.034D] # COMBINING LEFT RIGHT ARROW BELOW
+034E  ; [.0000.009F.0002.034E] # COMBINING UPWARDS ARROW BELOW
+0360  ; [.0000.00A0.0002.0360] # COMBINING DOUBLE TILDE
+0361  ; [.0000.00A1.0002.0361] # COMBINING DOUBLE INVERTED BREVE
+0362  ; [.0000.00A2.0002.0362] # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+3099  ; [.0000.013D.0002.3099] # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A  ; [.0000.013E.0002.309A] # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D  ; [.09DB.0020.0002.309D] # HIRAGANA ITERATION MARK
+309E  ; [.09DB.0020.0002.309D][.0000.013D.0002.3099] # HIRAGANA VOICED ITERATION MARK; QQCM
+30FC  ; [.09DC.0020.0002.30FC] # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD  ; [.09DD.0020.0002.30FD] # KATAKANA ITERATION MARK
+30FE  ; [.09DD.0020.0002.30FD][.0000.013D.0002.3099] # KATAKANA VOICED ITERATION MARK; QQCM
+00A4  ; [.09DE.0020.0002.00A4] # CURRENCY SIGN
+00A2  ; [.09DF.0020.0002.00A2] # CENT SIGN
+0024  ; [.09E0.0020.0002.0024] # DOLLAR SIGN
+00A3  ; [.09E1.0020.0002.00A3] # POUND SIGN
+00A5  ; [.09E2.0020.0002.00A5] # YEN SIGN
+0030  ; [.0A0B.0020.0002.0030] # DIGIT ZERO
+0031  ; [.0A0C.0020.0002.0031] # DIGIT ONE
+00B9  ; [.0A0C.0020.0014.00B9] # SUPERSCRIPT ONE; QQK
+00BD  ; [.0A0C.0020.001E.00BD][*02A5.0020.001E.00BD][.0A0D.0020.001F.00BD] # VULGAR FRACTION ONE HALF; QQKN
+00BC  ; [.0A0C.0020.001E.00BC][*02A5.0020.001E.00BC][.0A0F.0020.001F.00BC] # VULGAR FRACTION ONE QUARTER; QQKN
+0032  ; [.0A0D.0020.0002.0032] # DIGIT TWO
+00B2  ; [.0A0D.0020.0014.00B2] # SUPERSCRIPT TWO; QQK
+0033  ; [.0A0E.0020.0002.0033] # DIGIT THREE
+00B3  ; [.0A0E.0020.0014.00B3] # SUPERSCRIPT THREE; QQK
+00BE  ; [.0A0E.0020.001E.00BE][*02A5.0020.001E.00BE][.0A0F.0020.001F.00BE] # VULGAR FRACTION THREE QUARTERS; QQKN
+0034  ; [.0A0F.0020.0002.0034] # DIGIT FOUR
+0035  ; [.0A10.0020.0002.0035] # DIGIT FIVE
+0036  ; [.0A11.0020.0002.0036] # DIGIT SIX
+0037  ; [.0A12.0020.0002.0037] # DIGIT SEVEN
+0038  ; [.0A13.0020.0002.0038] # DIGIT EIGHT
+0039  ; [.0A14.0020.0002.0039] # DIGIT NINE
+0061  ; [.0A15.0020.0002.0061] # LATIN SMALL LETTER A
+0041  ; [.0A15.0020.0008.0041] # LATIN CAPITAL LETTER A
+00AA  ; [.0A15.0020.0014.00AA] # FEMININE ORDINAL INDICATOR; QQK
+00E1  ; [.0A15.0020.0002.0061][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH ACUTE; QQCM
+00C1  ; [.0A15.0020.0008.0041][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH ACUTE; QQCM
+00E0  ; [.0A15.0020.0002.0061][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH GRAVE; QQCM
+00C0  ; [.0A15.0020.0008.0041][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH GRAVE; QQCM
+00E2  ; [.0A15.0020.0002.0061][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX; QQCM
+00C2  ; [.0A15.0020.0008.0041][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX; QQCM
+00E5  ; [.0A15.0020.0002.0061][.0000.0043.0002.030A] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
+00C5  ; [.0A15.0020.0008.0041][.0000.0043.0002.030A] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
+00E4  ; [.0A15.0020.0002.0061][.0000.0047.0002.0308] # LATIN SMALL LETTER A WITH DIAERESIS; QQCM
+00C4  ; [.0A15.0020.0008.0041][.0000.0047.0002.0308] # LATIN CAPITAL LETTER A WITH DIAERESIS; QQCM
+00E3  ; [.0A15.0020.0002.0061][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH TILDE; QQCM
+00C3  ; [.0A15.0020.0008.0041][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH TILDE; QQCM
+00E6  ; [.0A19.0020.0002.00E6] # LATIN SMALL LETTER AE
+00C6  ; [.0A19.0020.0008.00C6] # LATIN CAPITAL LETTER AE
+0062  ; [.0A29.0020.0002.0062] # LATIN SMALL LETTER B
+0042  ; [.0A29.0020.0008.0042] # LATIN CAPITAL LETTER B
+0063  ; [.0A3D.0020.0002.0063] # LATIN SMALL LETTER C
+0043  ; [.0A3D.0020.0008.0043] # LATIN CAPITAL LETTER C
+00E7  ; [.0A3D.0020.0002.0063][.0000.0055.0002.0327] # LATIN SMALL LETTER C WITH CEDILLA; QQCM
+00C7  ; [.0A3D.0020.0008.0043][.0000.0055.0002.0327] # LATIN CAPITAL LETTER C WITH CEDILLA; QQCM
+0064  ; [.0A49.0020.0002.0064] # LATIN SMALL LETTER D
+0044  ; [.0A49.0020.0008.0044] # LATIN CAPITAL LETTER D
+00F0  ; [.0A5D.0020.0002.00F0] # LATIN SMALL LETTER ETH
+00D0  ; [.0A5D.0020.0008.00D0] # LATIN CAPITAL LETTER ETH
+0065  ; [.0A65.0020.0002.0065] # LATIN SMALL LETTER E
+0045  ; [.0A65.0020.0008.0045] # LATIN CAPITAL LETTER E
+00E9  ; [.0A65.0020.0002.0065][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH ACUTE; QQCM
+00C9  ; [.0A65.0020.0008.0045][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH ACUTE; QQCM
+00E8  ; [.0A65.0020.0002.0065][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH GRAVE; QQCM
+00C8  ; [.0A65.0020.0008.0045][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH GRAVE; QQCM
+00EA  ; [.0A65.0020.0002.0065][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX; QQCM
+00CA  ; [.0A65.0020.0008.0045][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX; QQCM
+00EB  ; [.0A65.0020.0002.0065][.0000.0047.0002.0308] # LATIN SMALL LETTER E WITH DIAERESIS; QQCM
+00CB  ; [.0A65.0020.0008.0045][.0000.0047.0002.0308] # LATIN CAPITAL LETTER E WITH DIAERESIS; QQCM
+0066  ; [.0A91.0020.0002.0066] # LATIN SMALL LETTER F
+0046  ; [.0A91.0020.0008.0046] # LATIN CAPITAL LETTER F
+0067  ; [.0A99.0020.0002.0067] # LATIN SMALL LETTER G
+0047  ; [.0A99.0020.0008.0047] # LATIN CAPITAL LETTER G
+0068  ; [.0AB9.0020.0002.0068] # LATIN SMALL LETTER H
+0048  ; [.0AB9.0020.0008.0048] # LATIN CAPITAL LETTER H
+0069  ; [.0AD3.0020.0002.0069] # LATIN SMALL LETTER I
+0049  ; [.0AD3.0020.0008.0049] # LATIN CAPITAL LETTER I
+00ED  ; [.0AD3.0020.0002.0069][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH ACUTE; QQCM
+00CD  ; [.0AD3.0020.0008.0049][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH ACUTE; QQCM
+00EC  ; [.0AD3.0020.0002.0069][.0000.0035.0002.0300] # LATIN SMALL LETTER I WITH GRAVE; QQCM
+00CC  ; [.0AD3.0020.0008.0049][.0000.0035.0002.0300] # LATIN CAPITAL LETTER I WITH GRAVE; QQCM
+00EE  ; [.0AD3.0020.0002.0069][.0000.003C.0002.0302] # LATIN SMALL LETTER I WITH CIRCUMFLEX; QQCM
+00CE  ; [.0AD3.0020.0008.0049][.0000.003C.0002.0302] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX; QQCM
+00EF  ; [.0AD3.0020.0002.0069][.0000.0047.0002.0308] # LATIN SMALL LETTER I WITH DIAERESIS; QQCM
+00CF  ; [.0AD3.0020.0008.0049][.0000.0047.0002.0308] # LATIN CAPITAL LETTER I WITH DIAERESIS; QQCM
+006A  ; [.0AE7.0020.0002.006A] # LATIN SMALL LETTER J
+004A  ; [.0AE7.0020.0008.004A] # LATIN CAPITAL LETTER J
+006B  ; [.0AF7.0020.0002.006B] # LATIN SMALL LETTER K
+004B  ; [.0AF7.0020.0008.004B] # LATIN CAPITAL LETTER K
+006C  ; [.0B03.0020.0002.006C] # LATIN SMALL LETTER L
+004C  ; [.0B03.0020.0008.004C] # LATIN CAPITAL LETTER L
+006D  ; [.0B2B.0020.0002.006D] # LATIN SMALL LETTER M
+004D  ; [.0B2B.0020.0008.004D] # LATIN CAPITAL LETTER M
+006E  ; [.0B33.0020.0002.006E] # LATIN SMALL LETTER N
+004E  ; [.0B33.0020.0008.004E] # LATIN CAPITAL LETTER N
+00F1  ; [.0B33.0020.0002.006E][.0000.004E.0002.0303] # LATIN SMALL LETTER N WITH TILDE; QQCM
+00D1  ; [.0B33.0020.0008.004E][.0000.004E.0002.0303] # LATIN CAPITAL LETTER N WITH TILDE; QQCM
+006F  ; [.0B4B.0020.0002.006F] # LATIN SMALL LETTER O
+004F  ; [.0B4B.0020.0008.004F] # LATIN CAPITAL LETTER O
+00BA  ; [.0B4B.0020.0014.00BA] # MASCULINE ORDINAL INDICATOR; QQK
+00F3  ; [.0B4B.0020.0002.006F][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH ACUTE; QQCM
+00D3  ; [.0B4B.0020.0008.004F][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH ACUTE; QQCM
+00F2  ; [.0B4B.0020.0002.006F][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH GRAVE; QQCM
+00D2  ; [.0B4B.0020.0008.004F][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH GRAVE; QQCM
+00F4  ; [.0B4B.0020.0002.006F][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX; QQCM
+00D4  ; [.0B4B.0020.0008.004F][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX; QQCM
+00F6  ; [.0B4B.0020.0002.006F][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH DIAERESIS; QQCM
+00D6  ; [.0B4B.0020.0008.004F][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH DIAERESIS; QQCM
+00F5  ; [.0B4B.0020.0002.006F][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH TILDE; QQCM
+00D5  ; [.0B4B.0020.0008.004F][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH TILDE; QQCM
+00F8  ; [.0B53.0020.0002.00F8] # LATIN SMALL LETTER O WITH STROKE
+00D8  ; [.0B53.0020.0008.00D8] # LATIN CAPITAL LETTER O WITH STROKE
+0070  ; [.0B67.0020.0002.0070] # LATIN SMALL LETTER P
+0050  ; [.0B67.0020.0008.0050] # LATIN CAPITAL LETTER P
+0071  ; [.0B73.0020.0002.0071] # LATIN SMALL LETTER Q
+0051  ; [.0B73.0020.0008.0051] # LATIN CAPITAL LETTER Q
+0072  ; [.0B7F.0020.0002.0072] # LATIN SMALL LETTER R
+0052  ; [.0B7F.0020.0008.0052] # LATIN CAPITAL LETTER R
+0073  ; [.0BA7.0020.0002.0073] # LATIN SMALL LETTER S
+0053  ; [.0BA7.0020.0008.0053] # LATIN CAPITAL LETTER S
+00DF  ; [.0BA7.0020.0004.00DF][.0000.0153.0004.00DF][.0BA7.0020.001F.00DF] # LATIN SMALL LETTER SHARP S; QQKN
+0074  ; [.0BBF.0020.0002.0074] # LATIN SMALL LETTER T
+0054  ; [.0BBF.0020.0008.0054] # LATIN CAPITAL LETTER T
+0075  ; [.0BD7.0020.0002.0075] # LATIN SMALL LETTER U
+0055  ; [.0BD7.0020.0008.0055] # LATIN CAPITAL LETTER U
+00FA  ; [.0BD7.0020.0002.0075][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH ACUTE; QQCM
+00DA  ; [.0BD7.0020.0008.0055][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH ACUTE; QQCM
+00F9  ; [.0BD7.0020.0002.0075][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH GRAVE; QQCM
+00D9  ; [.0BD7.0020.0008.0055][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH GRAVE; QQCM
+00FB  ; [.0BD7.0020.0002.0075][.0000.003C.0002.0302] # LATIN SMALL LETTER U WITH CIRCUMFLEX; QQCM
+00DB  ; [.0BD7.0020.0008.0055][.0000.003C.0002.0302] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX; QQCM
+00FC  ; [.0BD7.0020.0002.0075][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH DIAERESIS; QQCM
+00DC  ; [.0BD7.0020.0008.0055][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH DIAERESIS; QQCM
+0076  ; [.0BEF.0020.0002.0076] # LATIN SMALL LETTER V
+0056  ; [.0BEF.0020.0008.0056] # LATIN CAPITAL LETTER V
+0077  ; [.0BFB.0020.0002.0077] # LATIN SMALL LETTER W
+0057  ; [.0BFB.0020.0008.0057] # LATIN CAPITAL LETTER W
+0078  ; [.0C03.0020.0002.0078] # LATIN SMALL LETTER X
+0058  ; [.0C03.0020.0008.0058] # LATIN CAPITAL LETTER X
+0079  ; [.0C07.0020.0002.0079] # LATIN SMALL LETTER Y
+0059  ; [.0C07.0020.0008.0059] # LATIN CAPITAL LETTER Y
+00FD  ; [.0C07.0020.0002.0079][.0000.0032.0002.0301] # LATIN SMALL LETTER Y WITH ACUTE; QQCM
+00DD  ; [.0C07.0020.0008.0059][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Y WITH ACUTE; QQCM
+00FF  ; [.0C07.0020.0002.0079][.0000.0047.0002.0308] # LATIN SMALL LETTER Y WITH DIAERESIS; QQCM
+007A  ; [.0C13.0020.0002.007A] # LATIN SMALL LETTER Z
+005A  ; [.0C13.0020.0008.005A] # LATIN CAPITAL LETTER Z
+00FE  ; [.0C3B.0020.0002.00FE] # LATIN SMALL LETTER THORN
+00DE  ; [.0C3B.0020.0008.00DE] # LATIN CAPITAL LETTER THORN
+00B5  ; [.0C9F.0020.0004.00B5] # MICRO SIGN; QQK
+1100  ; [.1831.0020.0002.1100] # HANGUL CHOSEONG KIYEOK
+1101  ; [.1832.0020.0002.1101] # HANGUL CHOSEONG SSANGKIYEOK
+1102  ; [.1833.0020.0002.1102] # HANGUL CHOSEONG NIEUN
+1103  ; [.1834.0020.0002.1103] # HANGUL CHOSEONG TIKEUT
+1104  ; [.1835.0020.0002.1104] # HANGUL CHOSEONG SSANGTIKEUT
+1105  ; [.1836.0020.0002.1105] # HANGUL CHOSEONG RIEUL
+1106  ; [.1837.0020.0002.1106] # HANGUL CHOSEONG MIEUM
+1107  ; [.1838.0020.0002.1107] # HANGUL CHOSEONG PIEUP
+1108  ; [.1839.0020.0002.1108] # HANGUL CHOSEONG SSANGPIEUP
+1109  ; [.183A.0020.0002.1109] # HANGUL CHOSEONG SIOS
+110A  ; [.183B.0020.0002.110A] # HANGUL CHOSEONG SSANGSIOS
+110B  ; [.183C.0020.0002.110B] # HANGUL CHOSEONG IEUNG
+110C  ; [.183D.0020.0002.110C] # HANGUL CHOSEONG CIEUC
+110D  ; [.183E.0020.0002.110D] # HANGUL CHOSEONG SSANGCIEUC
+110E  ; [.183F.0020.0002.110E] # HANGUL CHOSEONG CHIEUCH
+110F  ; [.1840.0020.0002.110F] # HANGUL CHOSEONG KHIEUKH
+1110  ; [.1841.0020.0002.1110] # HANGUL CHOSEONG THIEUTH
+1111  ; [.1842.0020.0002.1111] # HANGUL CHOSEONG PHIEUPH
+1112  ; [.1843.0020.0002.1112] # HANGUL CHOSEONG HIEUH
+1113  ; [.1844.0020.0002.1113] # HANGUL CHOSEONG NIEUN-KIYEOK
+1114  ; [.1845.0020.0002.1114] # HANGUL CHOSEONG SSANGNIEUN
+1115  ; [.1846.0020.0002.1115] # HANGUL CHOSEONG NIEUN-TIKEUT
+1116  ; [.1847.0020.0002.1116] # HANGUL CHOSEONG NIEUN-PIEUP
+1117  ; [.1848.0020.0002.1117] # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118  ; [.1849.0020.0002.1118] # HANGUL CHOSEONG RIEUL-NIEUN
+1119  ; [.184A.0020.0002.1119] # HANGUL CHOSEONG SSANGRIEUL
+111A  ; [.184B.0020.0002.111A] # HANGUL CHOSEONG RIEUL-HIEUH
+111B  ; [.184C.0020.0002.111B] # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C  ; [.184D.0020.0002.111C] # HANGUL CHOSEONG MIEUM-PIEUP
+111D  ; [.184E.0020.0002.111D] # HANGUL CHOSEONG KAPYEOUNMIEUM
+111E  ; [.184F.0020.0002.111E] # HANGUL CHOSEONG PIEUP-KIYEOK
+111F  ; [.1850.0020.0002.111F] # HANGUL CHOSEONG PIEUP-NIEUN
+1120  ; [.1851.0020.0002.1120] # HANGUL CHOSEONG PIEUP-TIKEUT
+1121  ; [.1852.0020.0002.1121] # HANGUL CHOSEONG PIEUP-SIOS
+1122  ; [.1853.0020.0002.1122] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123  ; [.1854.0020.0002.1123] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124  ; [.1855.0020.0002.1124] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125  ; [.1856.0020.0002.1125] # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126  ; [.1857.0020.0002.1126] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127  ; [.1858.0020.0002.1127] # HANGUL CHOSEONG PIEUP-CIEUC
+1128  ; [.1859.0020.0002.1128] # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129  ; [.185A.0020.0002.1129] # HANGUL CHOSEONG PIEUP-THIEUTH
+112A  ; [.185B.0020.0002.112A] # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B  ; [.185C.0020.0002.112B] # HANGUL CHOSEONG KAPYEOUNPIEUP
+112C  ; [.185D.0020.0002.112C] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D  ; [.185E.0020.0002.112D] # HANGUL CHOSEONG SIOS-KIYEOK
+112E  ; [.185F.0020.0002.112E] # HANGUL CHOSEONG SIOS-NIEUN
+112F  ; [.1860.0020.0002.112F] # HANGUL CHOSEONG SIOS-TIKEUT
+1130  ; [.1861.0020.0002.1130] # HANGUL CHOSEONG SIOS-RIEUL
+1131  ; [.1862.0020.0002.1131] # HANGUL CHOSEONG SIOS-MIEUM
+1132  ; [.1863.0020.0002.1132] # HANGUL CHOSEONG SIOS-PIEUP
+1133  ; [.1864.0020.0002.1133] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134  ; [.1865.0020.0002.1134] # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135  ; [.1866.0020.0002.1135] # HANGUL CHOSEONG SIOS-IEUNG
+1136  ; [.1867.0020.0002.1136] # HANGUL CHOSEONG SIOS-CIEUC
+1137  ; [.1868.0020.0002.1137] # HANGUL CHOSEONG SIOS-CHIEUCH
+1138  ; [.1869.0020.0002.1138] # HANGUL CHOSEONG SIOS-KHIEUKH
+1139  ; [.186A.0020.0002.1139] # HANGUL CHOSEONG SIOS-THIEUTH
+113A  ; [.186B.0020.0002.113A] # HANGUL CHOSEONG SIOS-PHIEUPH
+113B  ; [.186C.0020.0002.113B] # HANGUL CHOSEONG SIOS-HIEUH
+113C  ; [.186D.0020.0002.113C] # HANGUL CHOSEONG CHITUEUMSIOS
+113D  ; [.186E.0020.0002.113D] # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E  ; [.186F.0020.0002.113E] # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F  ; [.1870.0020.0002.113F] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140  ; [.1871.0020.0002.1140] # HANGUL CHOSEONG PANSIOS
+1141  ; [.1872.0020.0002.1141] # HANGUL CHOSEONG IEUNG-KIYEOK
+1142  ; [.1873.0020.0002.1142] # HANGUL CHOSEONG IEUNG-TIKEUT
+1143  ; [.1874.0020.0002.1143] # HANGUL CHOSEONG IEUNG-MIEUM
+1144  ; [.1875.0020.0002.1144] # HANGUL CHOSEONG IEUNG-PIEUP
+1145  ; [.1876.0020.0002.1145] # HANGUL CHOSEONG IEUNG-SIOS
+1146  ; [.1877.0020.0002.1146] # HANGUL CHOSEONG IEUNG-PANSIOS
+1147  ; [.1878.0020.0002.1147] # HANGUL CHOSEONG SSANGIEUNG
+1148  ; [.1879.0020.0002.1148] # HANGUL CHOSEONG IEUNG-CIEUC
+1149  ; [.187A.0020.0002.1149] # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A  ; [.187B.0020.0002.114A] # HANGUL CHOSEONG IEUNG-THIEUTH
+114B  ; [.187C.0020.0002.114B] # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C  ; [.187D.0020.0002.114C] # HANGUL CHOSEONG YESIEUNG
+114D  ; [.187E.0020.0002.114D] # HANGUL CHOSEONG CIEUC-IEUNG
+114E  ; [.187F.0020.0002.114E] # HANGUL CHOSEONG CHITUEUMCIEUC
+114F  ; [.1880.0020.0002.114F] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150  ; [.1881.0020.0002.1150] # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151  ; [.1882.0020.0002.1151] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152  ; [.1883.0020.0002.1152] # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153  ; [.1884.0020.0002.1153] # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154  ; [.1885.0020.0002.1154] # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155  ; [.1886.0020.0002.1155] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156  ; [.1887.0020.0002.1156] # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157  ; [.1888.0020.0002.1157] # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158  ; [.1889.0020.0002.1158] # HANGUL CHOSEONG SSANGHIEUH
+1159  ; [.188A.0020.0002.1159] # HANGUL CHOSEONG YEORINHIEUH
+115F  ; [.188B.0020.0002.115F] # HANGUL CHOSEONG FILLER
+1160  ; [.188C.0020.0002.1160] # HANGUL JUNGSEONG FILLER
+1161  ; [.188D.0020.0002.1161] # HANGUL JUNGSEONG A
+1162  ; [.188E.0020.0002.1162] # HANGUL JUNGSEONG AE
+1163  ; [.188F.0020.0002.1163] # HANGUL JUNGSEONG YA
+1164  ; [.1890.0020.0002.1164] # HANGUL JUNGSEONG YAE
+1165  ; [.1891.0020.0002.1165] # HANGUL JUNGSEONG EO
+1166  ; [.1892.0020.0002.1166] # HANGUL JUNGSEONG E
+1167  ; [.1893.0020.0002.1167] # HANGUL JUNGSEONG YEO
+1168  ; [.1894.0020.0002.1168] # HANGUL JUNGSEONG YE
+1169  ; [.1895.0020.0002.1169] # HANGUL JUNGSEONG O
+116A  ; [.1896.0020.0002.116A] # HANGUL JUNGSEONG WA
+116B  ; [.1897.0020.0002.116B] # HANGUL JUNGSEONG WAE
+116C  ; [.1898.0020.0002.116C] # HANGUL JUNGSEONG OE
+116D  ; [.1899.0020.0002.116D] # HANGUL JUNGSEONG YO
+116E  ; [.189A.0020.0002.116E] # HANGUL JUNGSEONG U
+116F  ; [.189B.0020.0002.116F] # HANGUL JUNGSEONG WEO
+1170  ; [.189C.0020.0002.1170] # HANGUL JUNGSEONG WE
+1171  ; [.189D.0020.0002.1171] # HANGUL JUNGSEONG WI
+1172  ; [.189E.0020.0002.1172] # HANGUL JUNGSEONG YU
+1173  ; [.189F.0020.0002.1173] # HANGUL JUNGSEONG EU
+1174  ; [.18A0.0020.0002.1174] # HANGUL JUNGSEONG YI
+1175  ; [.18A1.0020.0002.1175] # HANGUL JUNGSEONG I
+1176  ; [.18A2.0020.0002.1176] # HANGUL JUNGSEONG A-O
+1177  ; [.18A3.0020.0002.1177] # HANGUL JUNGSEONG A-U
+1178  ; [.18A4.0020.0002.1178] # HANGUL JUNGSEONG YA-O
+1179  ; [.18A5.0020.0002.1179] # HANGUL JUNGSEONG YA-YO
+117A  ; [.18A6.0020.0002.117A] # HANGUL JUNGSEONG EO-O
+117B  ; [.18A7.0020.0002.117B] # HANGUL JUNGSEONG EO-U
+117C  ; [.18A8.0020.0002.117C] # HANGUL JUNGSEONG EO-EU
+117D  ; [.18A9.0020.0002.117D] # HANGUL JUNGSEONG YEO-O
+117E  ; [.18AA.0020.0002.117E] # HANGUL JUNGSEONG YEO-U
+117F  ; [.18AB.0020.0002.117F] # HANGUL JUNGSEONG O-EO
+1180  ; [.18AC.0020.0002.1180] # HANGUL JUNGSEONG O-E
+1181  ; [.18AD.0020.0002.1181] # HANGUL JUNGSEONG O-YE
+1182  ; [.18AE.0020.0002.1182] # HANGUL JUNGSEONG O-O
+1183  ; [.18AF.0020.0002.1183] # HANGUL JUNGSEONG O-U
+1184  ; [.18B0.0020.0002.1184] # HANGUL JUNGSEONG YO-YA
+1185  ; [.18B1.0020.0002.1185] # HANGUL JUNGSEONG YO-YAE
+1186  ; [.18B2.0020.0002.1186] # HANGUL JUNGSEONG YO-YEO
+1187  ; [.18B3.0020.0002.1187] # HANGUL JUNGSEONG YO-O
+1188  ; [.18B4.0020.0002.1188] # HANGUL JUNGSEONG YO-I
+1189  ; [.18B5.0020.0002.1189] # HANGUL JUNGSEONG U-A
+118A  ; [.18B6.0020.0002.118A] # HANGUL JUNGSEONG U-AE
+118B  ; [.18B7.0020.0002.118B] # HANGUL JUNGSEONG U-EO-EU
+118C  ; [.18B8.0020.0002.118C] # HANGUL JUNGSEONG U-YE
+118D  ; [.18B9.0020.0002.118D] # HANGUL JUNGSEONG U-U
+118E  ; [.18BA.0020.0002.118E] # HANGUL JUNGSEONG YU-A
+118F  ; [.18BB.0020.0002.118F] # HANGUL JUNGSEONG YU-EO
+1190  ; [.18BC.0020.0002.1190] # HANGUL JUNGSEONG YU-E
+1191  ; [.18BD.0020.0002.1191] # HANGUL JUNGSEONG YU-YEO
+1192  ; [.18BE.0020.0002.1192] # HANGUL JUNGSEONG YU-YE
+1193  ; [.18BF.0020.0002.1193] # HANGUL JUNGSEONG YU-U
+1194  ; [.18C0.0020.0002.1194] # HANGUL JUNGSEONG YU-I
+1195  ; [.18C1.0020.0002.1195] # HANGUL JUNGSEONG EU-U
+1196  ; [.18C2.0020.0002.1196] # HANGUL JUNGSEONG EU-EU
+1197  ; [.18C3.0020.0002.1197] # HANGUL JUNGSEONG YI-U
+1198  ; [.18C4.0020.0002.1198] # HANGUL JUNGSEONG I-A
+1199  ; [.18C5.0020.0002.1199] # HANGUL JUNGSEONG I-YA
+119A  ; [.18C6.0020.0002.119A] # HANGUL JUNGSEONG I-O
+119B  ; [.18C7.0020.0002.119B] # HANGUL JUNGSEONG I-U
+119C  ; [.18C8.0020.0002.119C] # HANGUL JUNGSEONG I-EU
+119D  ; [.18C9.0020.0002.119D] # HANGUL JUNGSEONG I-ARAEA
+119E  ; [.18CA.0020.0002.119E] # HANGUL JUNGSEONG ARAEA
+119F  ; [.18CB.0020.0002.119F] # HANGUL JUNGSEONG ARAEA-EO
+11A0  ; [.18CC.0020.0002.11A0] # HANGUL JUNGSEONG ARAEA-U
+11A1  ; [.18CD.0020.0002.11A1] # HANGUL JUNGSEONG ARAEA-I
+11A2  ; [.18CE.0020.0002.11A2] # HANGUL JUNGSEONG SSANGARAEA
+11A8  ; [.18CF.0020.0002.11A8] # HANGUL JONGSEONG KIYEOK
+11A9  ; [.18D0.0020.0002.11A9] # HANGUL JONGSEONG SSANGKIYEOK
+11AA  ; [.18D1.0020.0002.11AA] # HANGUL JONGSEONG KIYEOK-SIOS
+11AB  ; [.18D2.0020.0002.11AB] # HANGUL JONGSEONG NIEUN
+11AC  ; [.18D3.0020.0002.11AC] # HANGUL JONGSEONG NIEUN-CIEUC
+11AD  ; [.18D4.0020.0002.11AD] # HANGUL JONGSEONG NIEUN-HIEUH
+11AE  ; [.18D5.0020.0002.11AE] # HANGUL JONGSEONG TIKEUT
+11AF  ; [.18D6.0020.0002.11AF] # HANGUL JONGSEONG RIEUL
+11B0  ; [.18D7.0020.0002.11B0] # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1  ; [.18D8.0020.0002.11B1] # HANGUL JONGSEONG RIEUL-MIEUM
+11B2  ; [.18D9.0020.0002.11B2] # HANGUL JONGSEONG RIEUL-PIEUP
+11B3  ; [.18DA.0020.0002.11B3] # HANGUL JONGSEONG RIEUL-SIOS
+11B4  ; [.18DB.0020.0002.11B4] # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5  ; [.18DC.0020.0002.11B5] # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6  ; [.18DD.0020.0002.11B6] # HANGUL JONGSEONG RIEUL-HIEUH
+11B7  ; [.18DE.0020.0002.11B7] # HANGUL JONGSEONG MIEUM
+11B8  ; [.18DF.0020.0002.11B8] # HANGUL JONGSEONG PIEUP
+11B9  ; [.18E0.0020.0002.11B9] # HANGUL JONGSEONG PIEUP-SIOS
+11BA  ; [.18E1.0020.0002.11BA] # HANGUL JONGSEONG SIOS
+11BB  ; [.18E2.0020.0002.11BB] # HANGUL JONGSEONG SSANGSIOS
+11BC  ; [.18E3.0020.0002.11BC] # HANGUL JONGSEONG IEUNG
+11BD  ; [.18E4.0020.0002.11BD] # HANGUL JONGSEONG CIEUC
+11BE  ; [.18E5.0020.0002.11BE] # HANGUL JONGSEONG CHIEUCH
+11BF  ; [.18E6.0020.0002.11BF] # HANGUL JONGSEONG KHIEUKH
+11C0  ; [.18E7.0020.0002.11C0] # HANGUL JONGSEONG THIEUTH
+11C1  ; [.18E8.0020.0002.11C1] # HANGUL JONGSEONG PHIEUPH
+11C2  ; [.18E9.0020.0002.11C2] # HANGUL JONGSEONG HIEUH
+11C3  ; [.18EA.0020.0002.11C3] # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4  ; [.18EB.0020.0002.11C4] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5  ; [.18EC.0020.0002.11C5] # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6  ; [.18ED.0020.0002.11C6] # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7  ; [.18EE.0020.0002.11C7] # HANGUL JONGSEONG NIEUN-SIOS
+11C8  ; [.18EF.0020.0002.11C8] # HANGUL JONGSEONG NIEUN-PANSIOS
+11C9  ; [.18F0.0020.0002.11C9] # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA  ; [.18F1.0020.0002.11CA] # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB  ; [.18F2.0020.0002.11CB] # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC  ; [.18F3.0020.0002.11CC] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD  ; [.18F4.0020.0002.11CD] # HANGUL JONGSEONG RIEUL-NIEUN
+11CE  ; [.18F5.0020.0002.11CE] # HANGUL JONGSEONG RIEUL-TIKEUT
+11CF  ; [.18F6.0020.0002.11CF] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0  ; [.18F7.0020.0002.11D0] # HANGUL JONGSEONG SSANGRIEUL
+11D1  ; [.18F8.0020.0002.11D1] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2  ; [.18F9.0020.0002.11D2] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3  ; [.18FA.0020.0002.11D3] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4  ; [.18FB.0020.0002.11D4] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5  ; [.18FC.0020.0002.11D5] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6  ; [.18FD.0020.0002.11D6] # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7  ; [.18FE.0020.0002.11D7] # HANGUL JONGSEONG RIEUL-PANSIOS
+11D8  ; [.18FF.0020.0002.11D8] # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9  ; [.1900.0020.0002.11D9] # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA  ; [.1901.0020.0002.11DA] # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB  ; [.1902.0020.0002.11DB] # HANGUL JONGSEONG MIEUM-RIEUL
+11DC  ; [.1903.0020.0002.11DC] # HANGUL JONGSEONG MIEUM-PIEUP
+11DD  ; [.1904.0020.0002.11DD] # HANGUL JONGSEONG MIEUM-SIOS
+11DE  ; [.1905.0020.0002.11DE] # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF  ; [.1906.0020.0002.11DF] # HANGUL JONGSEONG MIEUM-PANSIOS
+11E0  ; [.1907.0020.0002.11E0] # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1  ; [.1908.0020.0002.11E1] # HANGUL JONGSEONG MIEUM-HIEUH
+11E2  ; [.1909.0020.0002.11E2] # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3  ; [.190A.0020.0002.11E3] # HANGUL JONGSEONG PIEUP-RIEUL
+11E4  ; [.190B.0020.0002.11E4] # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5  ; [.190C.0020.0002.11E5] # HANGUL JONGSEONG PIEUP-HIEUH
+11E6  ; [.190D.0020.0002.11E6] # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7  ; [.190E.0020.0002.11E7] # HANGUL JONGSEONG SIOS-KIYEOK
+11E8  ; [.190F.0020.0002.11E8] # HANGUL JONGSEONG SIOS-TIKEUT
+11E9  ; [.1910.0020.0002.11E9] # HANGUL JONGSEONG SIOS-RIEUL
+11EA  ; [.1911.0020.0002.11EA] # HANGUL JONGSEONG SIOS-PIEUP
+11EB  ; [.1912.0020.0002.11EB] # HANGUL JONGSEONG PANSIOS
+11EC  ; [.1913.0020.0002.11EC] # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED  ; [.1914.0020.0002.11ED] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE  ; [.1915.0020.0002.11EE] # HANGUL JONGSEONG SSANGIEUNG
+11EF  ; [.1916.0020.0002.11EF] # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0  ; [.1917.0020.0002.11F0] # HANGUL JONGSEONG YESIEUNG
+11F1  ; [.1918.0020.0002.11F1] # HANGUL JONGSEONG YESIEUNG-SIOS
+11F2  ; [.1919.0020.0002.11F2] # HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3  ; [.191A.0020.0002.11F3] # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4  ; [.191B.0020.0002.11F4] # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5  ; [.191C.0020.0002.11F5] # HANGUL JONGSEONG HIEUH-NIEUN
+11F6  ; [.191D.0020.0002.11F6] # HANGUL JONGSEONG HIEUH-RIEUL
+11F7  ; [.191E.0020.0002.11F7] # HANGUL JONGSEONG HIEUH-MIEUM
+11F8  ; [.191F.0020.0002.11F8] # HANGUL JONGSEONG HIEUH-PIEUP
+11F9  ; [.1920.0020.0002.11F9] # HANGUL JONGSEONG YEORINHIEUH
+3041  ; [.1921.0020.000D.3041] # HIRAGANA LETTER SMALL A
+3042  ; [.1921.0020.000E.3042] # HIRAGANA LETTER A
+30A1  ; [.1921.0020.000F.30A1] # KATAKANA LETTER SMALL A
+30A2  ; [.1921.0020.0011.30A2] # KATAKANA LETTER A
+3043  ; [.1922.0020.000D.3043] # HIRAGANA LETTER SMALL I
+3044  ; [.1922.0020.000E.3044] # HIRAGANA LETTER I
+30A3  ; [.1922.0020.000F.30A3] # KATAKANA LETTER SMALL I
+30A4  ; [.1922.0020.0011.30A4] # KATAKANA LETTER I
+3045  ; [.1923.0020.000D.3045] # HIRAGANA LETTER SMALL U
+3046  ; [.1923.0020.000E.3046] # HIRAGANA LETTER U
+30A5  ; [.1923.0020.000F.30A5] # KATAKANA LETTER SMALL U
+30A6  ; [.1923.0020.0011.30A6] # KATAKANA LETTER U
+3094  ; [.1923.0020.000E.3046][.0000.013D.0002.3099] # HIRAGANA LETTER VU; QQCM
+30F4  ; [.1923.0020.0011.30A6][.0000.013D.0002.3099] # KATAKANA LETTER VU; QQCM
+3047  ; [.1924.0020.000D.3047] # HIRAGANA LETTER SMALL E
+3048  ; [.1924.0020.000E.3048] # HIRAGANA LETTER E
+30A7  ; [.1924.0020.000F.30A7] # KATAKANA LETTER SMALL E
+30A8  ; [.1924.0020.0011.30A8] # KATAKANA LETTER E
+3049  ; [.1925.0020.000D.3049] # HIRAGANA LETTER SMALL O
+304A  ; [.1925.0020.000E.304A] # HIRAGANA LETTER O
+30A9  ; [.1925.0020.000F.30A9] # KATAKANA LETTER SMALL O
+30AA  ; [.1925.0020.0011.30AA] # KATAKANA LETTER O
+304B  ; [.1926.0020.000E.304B] # HIRAGANA LETTER KA
+30F5  ; [.1926.0020.000F.30F5] # KATAKANA LETTER SMALL KA
+30AB  ; [.1926.0020.0011.30AB] # KATAKANA LETTER KA
+304C  ; [.1926.0020.000E.304B][.0000.013D.0002.3099] # HIRAGANA LETTER GA; QQCM
+30AC  ; [.1926.0020.0011.30AB][.0000.013D.0002.3099] # KATAKANA LETTER GA; QQCM
+304D  ; [.1927.0020.000E.304D] # HIRAGANA LETTER KI
+30AD  ; [.1927.0020.0011.30AD] # KATAKANA LETTER KI
+304E  ; [.1927.0020.000E.304D][.0000.013D.0002.3099] # HIRAGANA LETTER GI; QQCM
+30AE  ; [.1927.0020.0011.30AD][.0000.013D.0002.3099] # KATAKANA LETTER GI; QQCM
+304F  ; [.1928.0020.000E.304F] # HIRAGANA LETTER KU
+30AF  ; [.1928.0020.0011.30AF] # KATAKANA LETTER KU
+3050  ; [.1928.0020.000E.304F][.0000.013D.0002.3099] # HIRAGANA LETTER GU; QQCM
+30B0  ; [.1928.0020.0011.30AF][.0000.013D.0002.3099] # KATAKANA LETTER GU; QQCM
+3051  ; [.1929.0020.000E.3051] # HIRAGANA LETTER KE
+30F6  ; [.1929.0020.000F.30F6] # KATAKANA LETTER SMALL KE
+30B1  ; [.1929.0020.0011.30B1] # KATAKANA LETTER KE
+3052  ; [.1929.0020.000E.3051][.0000.013D.0002.3099] # HIRAGANA LETTER GE; QQCM
+30B2  ; [.1929.0020.0011.30B1][.0000.013D.0002.3099] # KATAKANA LETTER GE; QQCM
+3053  ; [.192A.0020.000E.3053] # HIRAGANA LETTER KO
+30B3  ; [.192A.0020.0011.30B3] # KATAKANA LETTER KO
+3054  ; [.192A.0020.000E.3053][.0000.013D.0002.3099] # HIRAGANA LETTER GO; QQCM
+30B4  ; [.192A.0020.0011.30B3][.0000.013D.0002.3099] # KATAKANA LETTER GO; QQCM
+3055  ; [.192B.0020.000E.3055] # HIRAGANA LETTER SA
+30B5  ; [.192B.0020.0011.30B5] # KATAKANA LETTER SA
+3056  ; [.192B.0020.000E.3055][.0000.013D.0002.3099] # HIRAGANA LETTER ZA; QQCM
+30B6  ; [.192B.0020.0011.30B5][.0000.013D.0002.3099] # KATAKANA LETTER ZA; QQCM
+3057  ; [.192C.0020.000E.3057] # HIRAGANA LETTER SI
+30B7  ; [.192C.0020.0011.30B7] # KATAKANA LETTER SI
+3058  ; [.192C.0020.000E.3057][.0000.013D.0002.3099] # HIRAGANA LETTER ZI; QQCM
+30B8  ; [.192C.0020.0011.30B7][.0000.013D.0002.3099] # KATAKANA LETTER ZI; QQCM
+3059  ; [.192D.0020.000E.3059] # HIRAGANA LETTER SU
+30B9  ; [.192D.0020.0011.30B9] # KATAKANA LETTER SU
+305A  ; [.192D.0020.000E.3059][.0000.013D.0002.3099] # HIRAGANA LETTER ZU; QQCM
+30BA  ; [.192D.0020.0011.30B9][.0000.013D.0002.3099] # KATAKANA LETTER ZU; QQCM
+305B  ; [.192E.0020.000E.305B] # HIRAGANA LETTER SE
+30BB  ; [.192E.0020.0011.30BB] # KATAKANA LETTER SE
+305C  ; [.192E.0020.000E.305B][.0000.013D.0002.3099] # HIRAGANA LETTER ZE; QQCM
+30BC  ; [.192E.0020.0011.30BB][.0000.013D.0002.3099] # KATAKANA LETTER ZE; QQCM
+305D  ; [.192F.0020.000E.305D] # HIRAGANA LETTER SO
+30BD  ; [.192F.0020.0011.30BD] # KATAKANA LETTER SO
+305E  ; [.192F.0020.000E.305D][.0000.013D.0002.3099] # HIRAGANA LETTER ZO; QQCM
+30BE  ; [.192F.0020.0011.30BD][.0000.013D.0002.3099] # KATAKANA LETTER ZO; QQCM
+305F  ; [.1930.0020.000E.305F] # HIRAGANA LETTER TA
+30BF  ; [.1930.0020.0011.30BF] # KATAKANA LETTER TA
+3060  ; [.1930.0020.000E.305F][.0000.013D.0002.3099] # HIRAGANA LETTER DA; QQCM
+30C0  ; [.1930.0020.0011.30BF][.0000.013D.0002.3099] # KATAKANA LETTER DA; QQCM
+3061  ; [.1931.0020.000E.3061] # HIRAGANA LETTER TI
+30C1  ; [.1931.0020.0011.30C1] # KATAKANA LETTER TI
+3062  ; [.1931.0020.000E.3061][.0000.013D.0002.3099] # HIRAGANA LETTER DI; QQCM
+30C2  ; [.1931.0020.0011.30C1][.0000.013D.0002.3099] # KATAKANA LETTER DI; QQCM
+3063  ; [.1932.0020.000D.3063] # HIRAGANA LETTER SMALL TU
+3064  ; [.1932.0020.000E.3064] # HIRAGANA LETTER TU
+30C3  ; [.1932.0020.000F.30C3] # KATAKANA LETTER SMALL TU
+30C4  ; [.1932.0020.0011.30C4] # KATAKANA LETTER TU
+3065  ; [.1932.0020.000E.3064][.0000.013D.0002.3099] # HIRAGANA LETTER DU; QQCM
+30C5  ; [.1932.0020.0011.30C4][.0000.013D.0002.3099] # KATAKANA LETTER DU; QQCM
+3066  ; [.1933.0020.000E.3066] # HIRAGANA LETTER TE
+30C6  ; [.1933.0020.0011.30C6] # KATAKANA LETTER TE
+3067  ; [.1933.0020.000E.3066][.0000.013D.0002.3099] # HIRAGANA LETTER DE; QQCM
+30C7  ; [.1933.0020.0011.30C6][.0000.013D.0002.3099] # KATAKANA LETTER DE; QQCM
+3068  ; [.1934.0020.000E.3068] # HIRAGANA LETTER TO
+30C8  ; [.1934.0020.0011.30C8] # KATAKANA LETTER TO
+3069  ; [.1934.0020.000E.3068][.0000.013D.0002.3099] # HIRAGANA LETTER DO; QQCM
+30C9  ; [.1934.0020.0011.30C8][.0000.013D.0002.3099] # KATAKANA LETTER DO; QQCM
+306A  ; [.1935.0020.000E.306A] # HIRAGANA LETTER NA
+30CA  ; [.1935.0020.0011.30CA] # KATAKANA LETTER NA
+306B  ; [.1936.0020.000E.306B] # HIRAGANA LETTER NI
+30CB  ; [.1936.0020.0011.30CB] # KATAKANA LETTER NI
+306C  ; [.1937.0020.000E.306C] # HIRAGANA LETTER NU
+30CC  ; [.1937.0020.0011.30CC] # KATAKANA LETTER NU
+306D  ; [.1938.0020.000E.306D] # HIRAGANA LETTER NE
+30CD  ; [.1938.0020.0011.30CD] # KATAKANA LETTER NE
+306E  ; [.1939.0020.000E.306E] # HIRAGANA LETTER NO
+30CE  ; [.1939.0020.0011.30CE] # KATAKANA LETTER NO
+306F  ; [.193A.0020.000E.306F] # HIRAGANA LETTER HA
+30CF  ; [.193A.0020.0011.30CF] # KATAKANA LETTER HA
+3070  ; [.193A.0020.000E.306F][.0000.013D.0002.3099] # HIRAGANA LETTER BA; QQCM
+30D0  ; [.193A.0020.0011.30CF][.0000.013D.0002.3099] # KATAKANA LETTER BA; QQCM
+3071  ; [.193A.0020.000E.306F][.0000.013E.0002.309A] # HIRAGANA LETTER PA; QQCM
+30D1  ; [.193A.0020.0011.30CF][.0000.013E.0002.309A] # KATAKANA LETTER PA; QQCM
+3072  ; [.193B.0020.000E.3072] # HIRAGANA LETTER HI
+30D2  ; [.193B.0020.0011.30D2] # KATAKANA LETTER HI
+3073  ; [.193B.0020.000E.3072][.0000.013D.0002.3099] # HIRAGANA LETTER BI; QQCM
+30D3  ; [.193B.0020.0011.30D2][.0000.013D.0002.3099] # KATAKANA LETTER BI; QQCM
+3074  ; [.193B.0020.000E.3072][.0000.013E.0002.309A] # HIRAGANA LETTER PI; QQCM
+30D4  ; [.193B.0020.0011.30D2][.0000.013E.0002.309A] # KATAKANA LETTER PI; QQCM
+3075  ; [.193C.0020.000E.3075] # HIRAGANA LETTER HU
+30D5  ; [.193C.0020.0011.30D5] # KATAKANA LETTER HU
+3076  ; [.193C.0020.000E.3075][.0000.013D.0002.3099] # HIRAGANA LETTER BU; QQCM
+30D6  ; [.193C.0020.0011.30D5][.0000.013D.0002.3099] # KATAKANA LETTER BU; QQCM
+3077  ; [.193C.0020.000E.3075][.0000.013E.0002.309A] # HIRAGANA LETTER PU; QQCM
+30D7  ; [.193C.0020.0011.30D5][.0000.013E.0002.309A] # KATAKANA LETTER PU; QQCM
+3078  ; [.193D.0020.000E.3078] # HIRAGANA LETTER HE
+30D8  ; [.193D.0020.0011.30D8] # KATAKANA LETTER HE
+3079  ; [.193D.0020.000E.3078][.0000.013D.0002.3099] # HIRAGANA LETTER BE; QQCM
+30D9  ; [.193D.0020.0011.30D8][.0000.013D.0002.3099] # KATAKANA LETTER BE; QQCM
+307A  ; [.193D.0020.000E.3078][.0000.013E.0002.309A] # HIRAGANA LETTER PE; QQCM
+30DA  ; [.193D.0020.0011.30D8][.0000.013E.0002.309A] # KATAKANA LETTER PE; QQCM
+307B  ; [.193E.0020.000E.307B] # HIRAGANA LETTER HO
+30DB  ; [.193E.0020.0011.30DB] # KATAKANA LETTER HO
+307C  ; [.193E.0020.000E.307B][.0000.013D.0002.3099] # HIRAGANA LETTER BO; QQCM
+30DC  ; [.193E.0020.0011.30DB][.0000.013D.0002.3099] # KATAKANA LETTER BO; QQCM
+307D  ; [.193E.0020.000E.307B][.0000.013E.0002.309A] # HIRAGANA LETTER PO; QQCM
+30DD  ; [.193E.0020.0011.30DB][.0000.013E.0002.309A] # KATAKANA LETTER PO; QQCM
+307E  ; [.193F.0020.000E.307E] # HIRAGANA LETTER MA
+30DE  ; [.193F.0020.0011.30DE] # KATAKANA LETTER MA
+307F  ; [.1940.0020.000E.307F] # HIRAGANA LETTER MI
+30DF  ; [.1940.0020.0011.30DF] # KATAKANA LETTER MI
+3080  ; [.1941.0020.000E.3080] # HIRAGANA LETTER MU
+30E0  ; [.1941.0020.0011.30E0] # KATAKANA LETTER MU
+3081  ; [.1942.0020.000E.3081] # HIRAGANA LETTER ME
+30E1  ; [.1942.0020.0011.30E1] # KATAKANA LETTER ME
+3082  ; [.1943.0020.000E.3082] # HIRAGANA LETTER MO
+30E2  ; [.1943.0020.0011.30E2] # KATAKANA LETTER MO
+3083  ; [.1944.0020.000D.3083] # HIRAGANA LETTER SMALL YA
+3084  ; [.1944.0020.000E.3084] # HIRAGANA LETTER YA
+30E3  ; [.1944.0020.000F.30E3] # KATAKANA LETTER SMALL YA
+30E4  ; [.1944.0020.0011.30E4] # KATAKANA LETTER YA
+3085  ; [.1945.0020.000D.3085] # HIRAGANA LETTER SMALL YU
+3086  ; [.1945.0020.000E.3086] # HIRAGANA LETTER YU
+30E5  ; [.1945.0020.000F.30E5] # KATAKANA LETTER SMALL YU
+30E6  ; [.1945.0020.0011.30E6] # KATAKANA LETTER YU
+3087  ; [.1946.0020.000D.3087] # HIRAGANA LETTER SMALL YO
+3088  ; [.1946.0020.000E.3088] # HIRAGANA LETTER YO
+30E7  ; [.1946.0020.000F.30E7] # KATAKANA LETTER SMALL YO
+30E8  ; [.1946.0020.0011.30E8] # KATAKANA LETTER YO
+3089  ; [.1947.0020.000E.3089] # HIRAGANA LETTER RA
+30E9  ; [.1947.0020.0011.30E9] # KATAKANA LETTER RA
+308A  ; [.1948.0020.000E.308A] # HIRAGANA LETTER RI
+30EA  ; [.1948.0020.0011.30EA] # KATAKANA LETTER RI
+308B  ; [.1949.0020.000E.308B] # HIRAGANA LETTER RU
+30EB  ; [.1949.0020.0011.30EB] # KATAKANA LETTER RU
+308C  ; [.194A.0020.000E.308C] # HIRAGANA LETTER RE
+30EC  ; [.194A.0020.0011.30EC] # KATAKANA LETTER RE
+308D  ; [.194B.0020.000E.308D] # HIRAGANA LETTER RO
+30ED  ; [.194B.0020.0011.30ED] # KATAKANA LETTER RO
+308E  ; [.194C.0020.000D.308E] # HIRAGANA LETTER SMALL WA
+308F  ; [.194C.0020.000E.308F] # HIRAGANA LETTER WA
+30EE  ; [.194C.0020.000F.30EE] # KATAKANA LETTER SMALL WA
+30EF  ; [.194C.0020.0011.30EF] # KATAKANA LETTER WA
+30F7  ; [.194C.0020.0011.30EF][.0000.013D.0002.3099] # KATAKANA LETTER VA; QQCM
+3090  ; [.194D.0020.000E.3090] # HIRAGANA LETTER WI
+30F0  ; [.194D.0020.0011.30F0] # KATAKANA LETTER WI
+30F8  ; [.194D.0020.0011.30F0][.0000.013D.0002.3099] # KATAKANA LETTER VI; QQCM
+3091  ; [.194E.0020.000E.3091] # HIRAGANA LETTER WE
+30F1  ; [.194E.0020.0011.30F1] # KATAKANA LETTER WE
+30F9  ; [.194E.0020.0011.30F1][.0000.013D.0002.3099] # KATAKANA LETTER VE; QQCM
+3092  ; [.194F.0020.000E.3092] # HIRAGANA LETTER WO
+30F2  ; [.194F.0020.0011.30F2] # KATAKANA LETTER WO
+30FA  ; [.194F.0020.0011.30F2][.0000.013D.0002.3099] # KATAKANA LETTER VO; QQCM
+3093  ; [.1950.0020.000E.3093] # HIRAGANA LETTER N
+30F3  ; [.1950.0020.0011.30F3] # KATAKANA LETTER N
Index: /for-distributions/trunk/bin/windows/perl/lib/Unicode/Normalize.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Unicode/Normalize.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Unicode/Normalize.pm	(revision 14489)
@@ -0,0 +1,479 @@
+package Unicode::Normalize;
+
+BEGIN {
+    unless ("A" eq pack('U', 0x41)) {
+	die "Unicode::Normalize cannot stringify a Unicode code point\n";
+    }
+}
+
+use 5.006;
+use strict;
+use warnings;
+use Carp;
+
+no warnings 'utf8';
+
+our $VERSION = '0.32';
+our $PACKAGE = __PACKAGE__;
+
+require Exporter;
+require DynaLoader;
+
+our @ISA = qw(Exporter DynaLoader);
+our @EXPORT = qw( NFC NFD NFKC NFKD );
+our @EXPORT_OK = qw(
+    normalize decompose reorder compose
+    checkNFD checkNFKD checkNFC checkNFKC check
+    getCanon getCompat getComposite getCombinClass
+    isExclusion isSingleton isNonStDecomp isComp2nd isComp_Ex
+    isNFD_NO isNFC_NO isNFC_MAYBE isNFKD_NO isNFKC_NO isNFKC_MAYBE
+    FCD checkFCD FCC checkFCC composeContiguous
+    splitOnLastStarter
+);
+our %EXPORT_TAGS = (
+    all       => [ @EXPORT, @EXPORT_OK ],
+    normalize => [ @EXPORT, qw/normalize decompose reorder compose/ ],
+    check     => [ qw/checkNFD checkNFKD checkNFC checkNFKC check/ ],
+    fast      => [ qw/FCD checkFCD FCC checkFCC composeContiguous/ ],
+);
+
+######
+
+bootstrap Unicode::Normalize $VERSION;
+
+######
+
+sub pack_U {
+    return pack('U*', @_);
+}
+
+sub unpack_U {
+    return unpack('U*', pack('U*').shift);
+}
+
+
+##
+## normalization forms
+##
+
+use constant COMPAT => 1;
+
+sub NFD  ($) { reorder(decompose($_[0])) }
+sub NFKD ($) { reorder(decompose($_[0], COMPAT)) }
+sub NFC  ($) { compose(reorder(decompose($_[0]))) }
+sub NFKC ($) { compose(reorder(decompose($_[0], COMPAT))) }
+
+sub FCD ($) {
+    my $str = shift;
+    return checkFCD($str) ? $str : NFD($str);
+}
+sub FCC ($) { composeContiguous(reorder(decompose($_[0]))) }
+
+our %formNorm = (
+    NFC  => \&NFC,	C  => \&NFC,
+    NFD  => \&NFD,	D  => \&NFD,
+    NFKC => \&NFKC,	KC => \&NFKC,
+    NFKD => \&NFKD,	KD => \&NFKD,
+    FCD  => \&FCD,	FCC => \&FCC,
+);
+
+sub normalize($$)
+{
+    my $form = shift;
+    my $str = shift;
+    return exists $formNorm{$form}
+	? $formNorm{$form}->($str)
+	: croak $PACKAGE."::normalize: invalid form name: $form";
+}
+
+
+##
+## quick check
+##
+
+our %formCheck = (
+    NFC  => \&checkNFC, 	C  => \&checkNFC,
+    NFD  => \&checkNFD, 	D  => \&checkNFD,
+    NFKC => \&checkNFKC,	KC => \&checkNFKC,
+    NFKD => \&checkNFKD,	KD => \&checkNFKD,
+    FCD  => \&checkFCD, 	FCC => \&checkFCC,
+);
+
+sub check($$)
+{
+    my $form = shift;
+    my $str = shift;
+    return exists $formCheck{$form}
+	? $formCheck{$form}->($str)
+	: croak $PACKAGE."::check: invalid form name: $form";
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Unicode::Normalize - Unicode Normalization Forms
+
+=head1 SYNOPSIS
+
+(1) using function names exported by default:
+
+  use Unicode::Normalize;
+
+  $NFD_string  = NFD($string);  # Normalization Form D
+  $NFC_string  = NFC($string);  # Normalization Form C
+  $NFKD_string = NFKD($string); # Normalization Form KD
+  $NFKC_string = NFKC($string); # Normalization Form KC
+
+(2) using function names exported on request:
+
+  use Unicode::Normalize 'normalize';
+
+  $NFD_string  = normalize('D',  $string);  # Normalization Form D
+  $NFC_string  = normalize('C',  $string);  # Normalization Form C
+  $NFKD_string = normalize('KD', $string);  # Normalization Form KD
+  $NFKC_string = normalize('KC', $string);  # Normalization Form KC
+
+=head1 DESCRIPTION
+
+Parameters:
+
+C<$string> is used as a string under character semantics
+(see F<perlunicode>).
+
+C<$codepoint> should be an unsigned integer
+representing a Unicode code point.
+
+Note: Between XSUB and pure Perl, there is an incompatibility
+about the interpretation of C<$codepoint> as a decimal number.
+XSUB converts C<$codepoint> to an unsigned integer, but pure Perl does not.
+Do not use a floating point nor a negative sign in C<$codepoint>.
+
+=head2 Normalization Forms
+
+=over 4
+
+=item C<$NFD_string = NFD($string)>
+
+returns the Normalization Form D (formed by canonical decomposition).
+
+=item C<$NFC_string = NFC($string)>
+
+returns the Normalization Form C (formed by canonical decomposition
+followed by canonical composition).
+
+=item C<$NFKD_string = NFKD($string)>
+
+returns the Normalization Form KD (formed by compatibility decomposition).
+
+=item C<$NFKC_string = NFKC($string)>
+
+returns the Normalization Form KC (formed by compatibility decomposition
+followed by B<canonical> composition).
+
+=item C<$FCD_string = FCD($string)>
+
+If the given string is in FCD ("Fast C or D" form; cf. UTN #5),
+returns it without modification; otherwise returns an FCD string.
+
+Note: FCD is not always unique, then plural forms may be equivalent
+each other. C<FCD()> will return one of these equivalent forms.
+
+=item C<$FCC_string = FCC($string)>
+
+returns the FCC form ("Fast C Contiguous"; cf. UTN #5).
+
+Note: FCC is unique, as well as four normalization forms (NF*).
+
+=item C<$normalized_string = normalize($form_name, $string)>
+
+As C<$form_name>, one of the following names must be given.
+
+  'C'  or 'NFC'  for Normalization Form C  (UAX #15)
+  'D'  or 'NFD'  for Normalization Form D  (UAX #15)
+  'KC' or 'NFKC' for Normalization Form KC (UAX #15)
+  'KD' or 'NFKD' for Normalization Form KD (UAX #15)
+
+  'FCD'          for "Fast C or D" Form  (UTN #5)
+  'FCC'          for "Fast C Contiguous" (UTN #5)
+
+=back
+
+=head2 Decomposition and Composition
+
+=over 4
+
+=item C<$decomposed_string = decompose($string)>
+
+=item C<$decomposed_string = decompose($string, $useCompatMapping)>
+
+Decomposes the specified string and returns the result.
+
+If the second parameter (a boolean) is omitted or false, decomposes it
+using the Canonical Decomposition Mapping.
+If true, decomposes it using the Compatibility Decomposition Mapping.
+
+The string returned is not always in NFD/NFKD.
+Reordering may be required.
+
+    $NFD_string  = reorder(decompose($string));       # eq. to NFD()
+    $NFKD_string = reorder(decompose($string, TRUE)); # eq. to NFKD()
+
+=item C<$reordered_string  = reorder($string)>
+
+Reorders the combining characters and the like in the canonical ordering
+and returns the result.
+
+E.g., when you have a list of NFD/NFKD strings,
+you can get the concatenated NFD/NFKD string from them, saying
+
+    $concat_NFD  = reorder(join '', @NFD_strings);
+    $concat_NFKD = reorder(join '', @NFKD_strings);
+
+=item C<$composed_string   = compose($string)>
+
+Returns the string where composable pairs are composed.
+
+E.g., when you have a NFD/NFKD string,
+you can get its NFC/NFKC string, saying
+
+    $NFC_string  = compose($NFD_string);
+    $NFKC_string = compose($NFKD_string);
+
+=back
+
+=head2 Quick Check
+
+(see Annex 8, UAX #15; and F<DerivedNormalizationProps.txt>)
+
+The following functions check whether the string is in that normalization form.
+
+The result returned will be:
+
+    YES     The string is in that normalization form.
+    NO      The string is not in that normalization form.
+    MAYBE   Dubious. Maybe yes, maybe no.
+
+=over 4
+
+=item C<$result = checkNFD($string)>
+
+returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>.
+
+=item C<$result = checkNFC($string)>
+
+returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+=item C<$result = checkNFKD($string)>
+
+returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>.
+
+=item C<$result = checkNFKC($string)>
+
+returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+=item C<$result = checkFCD($string)>
+
+returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>.
+
+=item C<$result = checkFCC($string)>
+
+returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+If a string is not in FCD, it must not be in FCC.
+So C<checkFCC($not_FCD_string)> should return C<NO>.
+
+=item C<$result = check($form_name, $string)>
+
+returns true (C<1>) if C<YES>; false (C<empty string>) if C<NO>;
+C<undef> if C<MAYBE>.
+
+As C<$form_name>, one of the following names must be given.
+
+  'C'  or 'NFC'  for Normalization Form C  (UAX #15)
+  'D'  or 'NFD'  for Normalization Form D  (UAX #15)
+  'KC' or 'NFKC' for Normalization Form KC (UAX #15)
+  'KD' or 'NFKD' for Normalization Form KD (UAX #15)
+
+  'FCD'          for "Fast C or D" Form  (UTN #5)
+  'FCC'          for "Fast C Contiguous" (UTN #5)
+
+=back
+
+B<Note>
+
+In the cases of NFD, NFKD, and FCD, the answer must be
+either C<YES> or C<NO>. The answer C<MAYBE> may be returned
+in the cases of NFC, NFKC, and FCC.
+
+A C<MAYBE> string should contain at least one combining character
+or the like. For example, C<COMBINING ACUTE ACCENT> has
+the MAYBE_NFC/MAYBE_NFKC property.
+
+Both C<checkNFC("A\N{COMBINING ACUTE ACCENT}")>
+and C<checkNFC("B\N{COMBINING ACUTE ACCENT}")> will return C<MAYBE>.
+C<"A\N{COMBINING ACUTE ACCENT}"> is not in NFC
+(its NFC is C<"\N{LATIN CAPITAL LETTER A WITH ACUTE}">),
+while C<"B\N{COMBINING ACUTE ACCENT}"> is in NFC.
+
+If you want to check exactly, compare the string with its NFC/NFKC/FCC.
+
+    if ($string eq NFC($string)) {
+	# $string is exactly normalized in NFC;
+    } else {
+	# $string is not normalized in NFC;
+    }
+
+    if ($string eq NFKC($string)) {
+	# $string is exactly normalized in NFKC;
+    } else {
+	# $string is not normalized in NFKC;
+    }
+
+=head2 Character Data
+
+These functions are interface of character data used internally.
+If you want only to get Unicode normalization forms, you don't need
+call them yourself.
+
+=over 4
+
+=item C<$canonical_decomposed = getCanon($codepoint)>
+
+If the character of the specified codepoint is canonically
+decomposable (including Hangul Syllables),
+returns the B<completely decomposed> string canonically equivalent to it.
+
+If it is not decomposable, returns C<undef>.
+
+=item C<$compatibility_decomposed = getCompat($codepoint)>
+
+If the character of the specified codepoint is compatibility
+decomposable (including Hangul Syllables),
+returns the B<completely decomposed> string compatibility equivalent to it.
+
+If it is not decomposable, returns C<undef>.
+
+=item C<$codepoint_composite = getComposite($codepoint_here, $codepoint_next)>
+
+If two characters here and next (as codepoints) are composable
+(including Hangul Jamo/Syllables and Composition Exclusions),
+returns the codepoint of the composite.
+
+If they are not composable, returns C<undef>.
+
+=item C<$combining_class = getCombinClass($codepoint)>
+
+Returns the combining class of the character as an integer.
+
+=item C<$is_exclusion = isExclusion($codepoint)>
+
+Returns a boolean whether the character of the specified codepoint
+is a composition exclusion.
+
+=item C<$is_singleton = isSingleton($codepoint)>
+
+Returns a boolean whether the character of the specified codepoint is
+a singleton.
+
+=item C<$is_non_starter_decomposition = isNonStDecomp($codepoint)>
+
+Returns a boolean whether the canonical decomposition
+of the character of the specified codepoint
+is a Non-Starter Decomposition.
+
+=item C<$may_be_composed_with_prev_char = isComp2nd($codepoint)>
+
+Returns a boolean whether the character of the specified codepoint
+may be composed with the previous one in a certain composition
+(including Hangul Compositions, but excluding
+Composition Exclusions and Non-Starter Decompositions).
+
+=back
+
+=head1 EXPORT
+
+C<NFC>, C<NFD>, C<NFKC>, C<NFKD>: by default.
+
+C<normalize> and other some functions: on request.
+
+=head1 CAVEATS
+
+=over 4
+
+=item Perl's version vs. Unicode version
+
+Since this module refers to perl core's Unicode database in the directory
+F</lib/unicore> (or formerly F</lib/unicode>), the Unicode version of
+normalization implemented by this module depends on your perl's version.
+
+    perl's version         implemented Unicode version
+       5.6.1                  3.0.1
+       5.7.2                  3.1.0
+       5.7.3                  3.1.1 (same normalized form as that of 3.1.0)
+       5.8.0                  3.2.0
+     5.8.1-5.8.3              4.0.0
+     5.8.4-5.8.6 (latest)     4.0.1 (same normalized form as that of 4.0.0)
+
+=item Correction of decomposition mapping
+
+In older Unicode versions, a small number of characters (all of which are
+CJK compatibility ideographs as far as they have been found) may have
+an erroneous decomposition mapping (see F<NormalizationCorrections.txt>).
+Anyhow, this module will neither refer to F<NormalizationCorrections.txt>
+nor provide any specific version of normalization. Therefore this module
+running on an older perl with an older Unicode database may use
+the erroneous decomposition mapping blindly conforming to the Unicode database.
+
+=item Revised definition of canonical composition
+
+In Unicode 4.1.0, the definition D2 of canonical composition (which
+affects NFC and NFKC) has been changed (see Public Review Issue #29
+and recent UAX #15). This module has used the newer definition
+since the version 0.07 (Oct 31, 2001).
+This module does not support normalization according to the older
+definition, even if the Unicode version implemented by perl is
+lower than 4.1.0.
+
+=back
+
+=head1 AUTHOR
+
+SADAHIRO Tomoyuki <SADAHIRO@cpan.org>
+
+Copyright(C) 2001-2005, SADAHIRO Tomoyuki. Japan. 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
+
+=over 4
+
+=item http://www.unicode.org/reports/tr15/
+
+Unicode Normalization Forms - UAX #15
+
+=item http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt
+
+Derived Normalization Properties
+
+=item http://www.unicode.org/Public/UNIDATA/NormalizationCorrections.txt
+
+Normalization Corrections
+
+=item http://www.unicode.org/review/pr-29.html
+
+Public Review Issue #29: Normalization Issue
+
+=item http://www.unicode.org/notes/tn5/
+
+Canonical Equivalence in Applications - UTN #5
+
+=back
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/Unicode/UCD.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Unicode/UCD.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Unicode/UCD.pm	(revision 14489)
@@ -0,0 +1,820 @@
+package Unicode::UCD;
+
+use strict;
+use warnings;
+
+our $VERSION = '0.24';
+
+use Storable qw(dclone);
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+
+our @EXPORT_OK = qw(charinfo
+		    charblock charscript
+		    charblocks charscripts
+		    charinrange
+		    compexcl
+		    casefold casespec
+		    namedseq);
+
+use Carp;
+
+=head1 NAME
+
+Unicode::UCD - Unicode character database
+
+=head1 SYNOPSIS
+
+    use Unicode::UCD 'charinfo';
+    my $charinfo   = charinfo($codepoint);
+
+    use Unicode::UCD 'charblock';
+    my $charblock  = charblock($codepoint);
+
+    use Unicode::UCD 'charscript';
+    my $charscript = charscript($codepoint);
+
+    use Unicode::UCD 'charblocks';
+    my $charblocks = charblocks();
+
+    use Unicode::UCD 'charscripts';
+    my %charscripts = charscripts();
+
+    use Unicode::UCD qw(charscript charinrange);
+    my $range = charscript($script);
+    print "looks like $script\n" if charinrange($range, $codepoint);
+
+    use Unicode::UCD 'compexcl';
+    my $compexcl = compexcl($codepoint);
+
+    use Unicode::UCD 'namedseq';
+    my $namedseq = namedseq($named_sequence_name);
+
+    my $unicode_version = Unicode::UCD::UnicodeVersion();
+
+=head1 DESCRIPTION
+
+The Unicode::UCD module offers a simple interface to the Unicode
+Character Database.
+
+=cut
+
+my $UNICODEFH;
+my $BLOCKSFH;
+my $SCRIPTSFH;
+my $VERSIONFH;
+my $COMPEXCLFH;
+my $CASEFOLDFH;
+my $CASESPECFH;
+my $NAMEDSEQFH;
+
+sub openunicode {
+    my ($rfh, @path) = @_;
+    my $f;
+    unless (defined $$rfh) {
+	for my $d (@INC) {
+	    use File::Spec;
+	    $f = File::Spec->catfile($d, "unicore", @path);
+	    last if open($$rfh, $f);
+	    undef $f;
+	}
+	croak __PACKAGE__, ": failed to find ",
+              File::Spec->catfile(@path), " in @INC"
+	    unless defined $f;
+    }
+    return $f;
+}
+
+=head2 charinfo
+
+    use Unicode::UCD 'charinfo';
+
+    my $charinfo = charinfo(0x41);
+
+charinfo() returns a reference to a hash that has the following fields
+as defined by the Unicode standard:
+
+    key
+
+    code             code point with at least four hexdigits
+    name             name of the character IN UPPER CASE
+    category         general category of the character
+    combining        classes used in the Canonical Ordering Algorithm
+    bidi             bidirectional category
+    decomposition    character decomposition mapping
+    decimal          if decimal digit this is the integer numeric value
+    digit            if digit this is the numeric value
+    numeric          if numeric is the integer or rational numeric value
+    mirrored         if mirrored in bidirectional text
+    unicode10        Unicode 1.0 name if existed and different
+    comment          ISO 10646 comment field
+    upper            uppercase equivalent mapping
+    lower            lowercase equivalent mapping
+    title            titlecase equivalent mapping
+
+    block            block the character belongs to (used in \p{In...})
+    script           script the character belongs to
+
+If no match is found, a reference to an empty hash is returned.
+
+The C<block> property is the same as returned by charinfo().  It is
+not defined in the Unicode Character Database proper (Chapter 4 of the
+Unicode 3.0 Standard, aka TUS3) but instead in an auxiliary database
+(Chapter 14 of TUS3).  Similarly for the C<script> property.
+
+Note that you cannot do (de)composition and casing based solely on the
+above C<decomposition> and C<lower>, C<upper>, C<title>, properties,
+you will need also the compexcl(), casefold(), and casespec() functions.
+
+=cut
+
+# NB: This function is duplicated in charnames.pm
+sub _getcode {
+    my $arg = shift;
+
+    if ($arg =~ /^[1-9]\d*$/) {
+	return $arg;
+    } elsif ($arg =~ /^(?:[Uu]\+|0[xX])?([[:xdigit:]]+)$/) {
+	return hex($1);
+    }
+
+    return;
+}
+
+# Lingua::KO::Hangul::Util not part of the standard distribution
+# but it will be used if available.
+
+eval { require Lingua::KO::Hangul::Util };
+my $hasHangulUtil = ! $@;
+if ($hasHangulUtil) {
+    Lingua::KO::Hangul::Util->import();
+}
+
+sub hangul_decomp { # internal: called from charinfo
+    if ($hasHangulUtil) {
+	my @tmp = decomposeHangul(shift);
+	return sprintf("%04X %04X",      @tmp) if @tmp == 2;
+	return sprintf("%04X %04X %04X", @tmp) if @tmp == 3;
+    }
+    return;
+}
+
+sub hangul_charname { # internal: called from charinfo
+    return sprintf("HANGUL SYLLABLE-%04X", shift);
+}
+
+sub han_charname { # internal: called from charinfo
+    return sprintf("CJK UNIFIED IDEOGRAPH-%04X", shift);
+}
+
+my @CharinfoRanges = (
+# block name
+# [ first, last, coderef to name, coderef to decompose ],
+# CJK Ideographs Extension A
+  [ 0x3400,   0x4DB5,   \&han_charname,   undef  ],
+# CJK Ideographs
+  [ 0x4E00,   0x9FA5,   \&han_charname,   undef  ],
+# Hangul Syllables
+  [ 0xAC00,   0xD7A3,   $hasHangulUtil ? \&getHangulName : \&hangul_charname,  \&hangul_decomp ],
+# Non-Private Use High Surrogates
+  [ 0xD800,   0xDB7F,   undef,   undef  ],
+# Private Use High Surrogates
+  [ 0xDB80,   0xDBFF,   undef,   undef  ],
+# Low Surrogates
+  [ 0xDC00,   0xDFFF,   undef,   undef  ],
+# The Private Use Area
+  [ 0xE000,   0xF8FF,   undef,   undef  ],
+# CJK Ideographs Extension B
+  [ 0x20000,  0x2A6D6,  \&han_charname,   undef  ],
+# Plane 15 Private Use Area
+  [ 0xF0000,  0xFFFFD,  undef,   undef  ],
+# Plane 16 Private Use Area
+  [ 0x100000, 0x10FFFD, undef,   undef  ],
+);
+
+sub charinfo {
+    my $arg  = shift;
+    my $code = _getcode($arg);
+    croak __PACKAGE__, "::charinfo: unknown code '$arg'"
+	unless defined $code;
+    my $hexk = sprintf("%06X", $code);
+    my($rcode,$rname,$rdec);
+    foreach my $range (@CharinfoRanges){
+      if ($range->[0] <= $code && $code <= $range->[1]) {
+        $rcode = $hexk;
+	$rcode =~ s/^0+//;
+	$rcode =  sprintf("%04X", hex($rcode));
+        $rname = $range->[2] ? $range->[2]->($code) : '';
+        $rdec  = $range->[3] ? $range->[3]->($code) : '';
+        $hexk  = sprintf("%06X", $range->[0]); # replace by the first
+        last;
+      }
+    }
+    openunicode(\$UNICODEFH, "UnicodeData.txt");
+    if (defined $UNICODEFH) {
+	use Search::Dict 1.02;
+	if (look($UNICODEFH, "$hexk;", { xfrm => sub { $_[0] =~ /^([^;]+);(.+)/; sprintf "%06X;$2", hex($1) } } ) >= 0) {
+	    my $line = <$UNICODEFH>;
+	    return unless defined $line;
+	    chomp $line;
+	    my %prop;
+	    @prop{qw(
+		     code name category
+		     combining bidi decomposition
+		     decimal digit numeric
+		     mirrored unicode10 comment
+		     upper lower title
+		    )} = split(/;/, $line, -1);
+	    $hexk =~ s/^0+//;
+	    $hexk =  sprintf("%04X", hex($hexk));
+	    if ($prop{code} eq $hexk) {
+		$prop{block}  = charblock($code);
+		$prop{script} = charscript($code);
+		if(defined $rname){
+                    $prop{code} = $rcode;
+                    $prop{name} = $rname;
+                    $prop{decomposition} = $rdec;
+                }
+		return \%prop;
+	    }
+	}
+    }
+    return;
+}
+
+sub _search { # Binary search in a [[lo,hi,prop],[...],...] table.
+    my ($table, $lo, $hi, $code) = @_;
+
+    return if $lo > $hi;
+
+    my $mid = int(($lo+$hi) / 2);
+
+    if ($table->[$mid]->[0] < $code) {
+	if ($table->[$mid]->[1] >= $code) {
+	    return $table->[$mid]->[2];
+	} else {
+	    _search($table, $mid + 1, $hi, $code);
+	}
+    } elsif ($table->[$mid]->[0] > $code) {
+	_search($table, $lo, $mid - 1, $code);
+    } else {
+	return $table->[$mid]->[2];
+    }
+}
+
+sub charinrange {
+    my ($range, $arg) = @_;
+    my $code = _getcode($arg);
+    croak __PACKAGE__, "::charinrange: unknown code '$arg'"
+	unless defined $code;
+    _search($range, 0, $#$range, $code);
+}
+
+=head2 charblock
+
+    use Unicode::UCD 'charblock';
+
+    my $charblock = charblock(0x41);
+    my $charblock = charblock(1234);
+    my $charblock = charblock("0x263a");
+    my $charblock = charblock("U+263a");
+
+    my $range     = charblock('Armenian');
+
+With a B<code point argument> charblock() returns the I<block> the character
+belongs to, e.g.  C<Basic Latin>.  Note that not all the character
+positions within all blocks are defined.
+
+See also L</Blocks versus Scripts>.
+
+If supplied with an argument that can't be a code point, charblock() tries
+to do the opposite and interpret the argument as a character block. The
+return value is a I<range>: an anonymous list of lists that contain
+I<start-of-range>, I<end-of-range> code point pairs. You can test whether
+a code point is in a range using the L</charinrange> function. If the
+argument is not a known character block, C<undef> is returned.
+
+=cut
+
+my @BLOCKS;
+my %BLOCKS;
+
+sub _charblocks {
+    unless (@BLOCKS) {
+	if (openunicode(\$BLOCKSFH, "Blocks.txt")) {
+	    local $_;
+	    while (<$BLOCKSFH>) {
+		if (/^([0-9A-F]+)\.\.([0-9A-F]+);\s+(.+)/) {
+		    my ($lo, $hi) = (hex($1), hex($2));
+		    my $subrange = [ $lo, $hi, $3 ];
+		    push @BLOCKS, $subrange;
+		    push @{$BLOCKS{$3}}, $subrange;
+		}
+	    }
+	    close($BLOCKSFH);
+	}
+    }
+}
+
+sub charblock {
+    my $arg = shift;
+
+    _charblocks() unless @BLOCKS;
+
+    my $code = _getcode($arg);
+
+    if (defined $code) {
+	_search(\@BLOCKS, 0, $#BLOCKS, $code);
+    } else {
+	if (exists $BLOCKS{$arg}) {
+	    return dclone $BLOCKS{$arg};
+	} else {
+	    return;
+	}
+    }
+}
+
+=head2 charscript
+
+    use Unicode::UCD 'charscript';
+
+    my $charscript = charscript(0x41);
+    my $charscript = charscript(1234);
+    my $charscript = charscript("U+263a");
+
+    my $range      = charscript('Thai');
+
+With a B<code point argument> charscript() returns the I<script> the
+character belongs to, e.g.  C<Latin>, C<Greek>, C<Han>.
+
+See also L</Blocks versus Scripts>.
+
+If supplied with an argument that can't be a code point, charscript() tries
+to do the opposite and interpret the argument as a character script. The
+return value is a I<range>: an anonymous list of lists that contain
+I<start-of-range>, I<end-of-range> code point pairs. You can test whether a
+code point is in a range using the L</charinrange> function. If the
+argument is not a known character script, C<undef> is returned.
+
+=cut
+
+my @SCRIPTS;
+my %SCRIPTS;
+
+sub _charscripts {
+    unless (@SCRIPTS) {
+	if (openunicode(\$SCRIPTSFH, "Scripts.txt")) {
+	    local $_;
+	    while (<$SCRIPTSFH>) {
+		if (/^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s+;\s+(\w+)/) {
+		    my ($lo, $hi) = (hex($1), $2 ? hex($2) : hex($1));
+		    my $script = lc($3);
+		    $script =~ s/\b(\w)/uc($1)/ge;
+		    my $subrange = [ $lo, $hi, $script ];
+		    push @SCRIPTS, $subrange;
+		    push @{$SCRIPTS{$script}}, $subrange;
+		}
+	    }
+	    close($SCRIPTSFH);
+	    @SCRIPTS = sort { $a->[0] <=> $b->[0] } @SCRIPTS;
+	}
+    }
+}
+
+sub charscript {
+    my $arg = shift;
+
+    _charscripts() unless @SCRIPTS;
+
+    my $code = _getcode($arg);
+
+    if (defined $code) {
+	_search(\@SCRIPTS, 0, $#SCRIPTS, $code);
+    } else {
+	if (exists $SCRIPTS{$arg}) {
+	    return dclone $SCRIPTS{$arg};
+	} else {
+	    return;
+	}
+    }
+}
+
+=head2 charblocks
+
+    use Unicode::UCD 'charblocks';
+
+    my $charblocks = charblocks();
+
+charblocks() returns a reference to a hash with the known block names
+as the keys, and the code point ranges (see L</charblock>) as the values.
+
+See also L</Blocks versus Scripts>.
+
+=cut
+
+sub charblocks {
+    _charblocks() unless %BLOCKS;
+    return dclone \%BLOCKS;
+}
+
+=head2 charscripts
+
+    use Unicode::UCD 'charscripts';
+
+    my %charscripts = charscripts();
+
+charscripts() returns a hash with the known script names as the keys,
+and the code point ranges (see L</charscript>) as the values.
+
+See also L</Blocks versus Scripts>.
+
+=cut
+
+sub charscripts {
+    _charscripts() unless %SCRIPTS;
+    return dclone \%SCRIPTS;
+}
+
+=head2 Blocks versus Scripts
+
+The difference between a block and a script is that scripts are closer
+to the linguistic notion of a set of characters required to present
+languages, while block is more of an artifact of the Unicode character
+numbering and separation into blocks of (mostly) 256 characters.
+
+For example the Latin B<script> is spread over several B<blocks>, such
+as C<Basic Latin>, C<Latin 1 Supplement>, C<Latin Extended-A>, and
+C<Latin Extended-B>.  On the other hand, the Latin script does not
+contain all the characters of the C<Basic Latin> block (also known as
+the ASCII): it includes only the letters, and not, for example, the digits
+or the punctuation.
+
+For blocks see http://www.unicode.org/Public/UNIDATA/Blocks.txt
+
+For scripts see UTR #24: http://www.unicode.org/unicode/reports/tr24/
+
+=head2 Matching Scripts and Blocks
+
+Scripts are matched with the regular-expression construct
+C<\p{...}> (e.g. C<\p{Tibetan}> matches characters of the Tibetan script),
+while C<\p{In...}> is used for blocks (e.g. C<\p{InTibetan}> matches
+any of the 256 code points in the Tibetan block).
+
+=head2 Code Point Arguments
+
+A I<code point argument> is either a decimal or a hexadecimal scalar
+designating a Unicode character, or C<U+> followed by hexadecimals
+designating a Unicode character.  In other words, if you want a code
+point to be interpreted as a hexadecimal number, you must prefix it
+with either C<0x> or C<U+>, because a string like e.g. C<123> will
+be interpreted as a decimal code point.  Also note that Unicode is
+B<not> limited to 16 bits (the number of Unicode characters is
+open-ended, in theory unlimited): you may have more than 4 hexdigits.
+
+=head2 charinrange
+
+In addition to using the C<\p{In...}> and C<\P{In...}> constructs, you
+can also test whether a code point is in the I<range> as returned by
+L</charblock> and L</charscript> or as the values of the hash returned
+by L</charblocks> and L</charscripts> by using charinrange():
+
+    use Unicode::UCD qw(charscript charinrange);
+
+    $range = charscript('Hiragana');
+    print "looks like hiragana\n" if charinrange($range, $codepoint);
+
+=cut
+
+=head2 compexcl
+
+    use Unicode::UCD 'compexcl';
+
+    my $compexcl = compexcl("09dc");
+
+The compexcl() returns the composition exclusion (that is, if the
+character should not be produced during a precomposition) of the 
+character specified by a B<code point argument>.
+
+If there is a composition exclusion for the character, true is
+returned.  Otherwise, false is returned.
+
+=cut
+
+my %COMPEXCL;
+
+sub _compexcl {
+    unless (%COMPEXCL) {
+	if (openunicode(\$COMPEXCLFH, "CompositionExclusions.txt")) {
+	    local $_;
+	    while (<$COMPEXCLFH>) {
+		if (/^([0-9A-F]+)\s+\#\s+/) {
+		    my $code = hex($1);
+		    $COMPEXCL{$code} = undef;
+		}
+	    }
+	    close($COMPEXCLFH);
+	}
+    }
+}
+
+sub compexcl {
+    my $arg  = shift;
+    my $code = _getcode($arg);
+    croak __PACKAGE__, "::compexcl: unknown code '$arg'"
+	unless defined $code;
+
+    _compexcl() unless %COMPEXCL;
+
+    return exists $COMPEXCL{$code};
+}
+
+=head2 casefold
+
+    use Unicode::UCD 'casefold';
+
+    my $casefold = casefold("00DF");
+
+The casefold() returns the locale-independent case folding of the
+character specified by a B<code point argument>.
+
+If there is a case folding for that character, a reference to a hash
+with the following fields is returned:
+
+    key
+
+    code             code point with at least four hexdigits
+    status           "C", "F", "S", or "I"
+    mapping          one or more codes separated by spaces
+
+The meaning of the I<status> is as follows:
+
+   C                 common case folding, common mappings shared
+                     by both simple and full mappings
+   F                 full case folding, mappings that cause strings
+                     to grow in length. Multiple characters are separated
+                     by spaces
+   S                 simple case folding, mappings to single characters
+                     where different from F
+   I                 special case for dotted uppercase I and
+                     dotless lowercase i
+                     - If this mapping is included, the result is
+                       case-insensitive, but dotless and dotted I's
+                       are not distinguished
+                     - If this mapping is excluded, the result is not
+                       fully case-insensitive, but dotless and dotted
+                       I's are distinguished
+
+If there is no case folding for that character, C<undef> is returned.
+
+For more information about case mappings see
+http://www.unicode.org/unicode/reports/tr21/
+
+=cut
+
+my %CASEFOLD;
+
+sub _casefold {
+    unless (%CASEFOLD) {
+	if (openunicode(\$CASEFOLDFH, "CaseFolding.txt")) {
+	    local $_;
+	    while (<$CASEFOLDFH>) {
+		if (/^([0-9A-F]+); ([CFSI]); ([0-9A-F]+(?: [0-9A-F]+)*);/) {
+		    my $code = hex($1);
+		    $CASEFOLD{$code} = { code    => $1,
+					 status  => $2,
+					 mapping => $3 };
+		}
+	    }
+	    close($CASEFOLDFH);
+	}
+    }
+}
+
+sub casefold {
+    my $arg  = shift;
+    my $code = _getcode($arg);
+    croak __PACKAGE__, "::casefold: unknown code '$arg'"
+	unless defined $code;
+
+    _casefold() unless %CASEFOLD;
+
+    return $CASEFOLD{$code};
+}
+
+=head2 casespec
+
+    use Unicode::UCD 'casespec';
+
+    my $casespec = casespec("FB00");
+
+The casespec() returns the potentially locale-dependent case mapping
+of the character specified by a B<code point argument>.  The mapping
+may change the length of the string (which the basic Unicode case
+mappings as returned by charinfo() never do).
+
+If there is a case folding for that character, a reference to a hash
+with the following fields is returned:
+
+    key
+
+    code             code point with at least four hexdigits
+    lower            lowercase
+    title            titlecase
+    upper            uppercase
+    condition        condition list (may be undef)
+
+The C<condition> is optional.  Where present, it consists of one or
+more I<locales> or I<contexts>, separated by spaces (other than as
+used to separate elements, spaces are to be ignored).  A condition
+list overrides the normal behavior if all of the listed conditions are
+true.  Case distinctions in the condition list are not significant.
+Conditions preceded by "NON_" represent the negation of the condition.
+
+Note that when there are multiple case folding definitions for a
+single code point because of different locales, the value returned by
+casespec() is a hash reference which has the locales as the keys and
+hash references as described above as the values.
+
+A I<locale> is defined as a 2-letter ISO 3166 country code, possibly
+followed by a "_" and a 2-letter ISO language code (possibly followed
+by a "_" and a variant code).  You can find the lists of those codes,
+see L<Locale::Country> and L<Locale::Language>.
+
+A I<context> is one of the following choices:
+
+    FINAL            The letter is not followed by a letter of
+                     general category L (e.g. Ll, Lt, Lu, Lm, or Lo)
+    MODERN           The mapping is only used for modern text
+    AFTER_i          The last base character was "i" (U+0069)
+
+For more information about case mappings see
+http://www.unicode.org/unicode/reports/tr21/
+
+=cut
+
+my %CASESPEC;
+
+sub _casespec {
+    unless (%CASESPEC) {
+	if (openunicode(\$CASESPECFH, "SpecialCasing.txt")) {
+	    local $_;
+	    while (<$CASESPECFH>) {
+		if (/^([0-9A-F]+); ([0-9A-F]+(?: [0-9A-F]+)*)?; ([0-9A-F]+(?: [0-9A-F]+)*)?; ([0-9A-F]+(?: [0-9A-F]+)*)?; (\w+(?: \w+)*)?/) {
+		    my ($hexcode, $lower, $title, $upper, $condition) =
+			($1, $2, $3, $4, $5);
+		    my $code = hex($hexcode);
+		    if (exists $CASESPEC{$code}) {
+			if (exists $CASESPEC{$code}->{code}) {
+			    my ($oldlower,
+				$oldtitle,
+				$oldupper,
+				$oldcondition) =
+				    @{$CASESPEC{$code}}{qw(lower
+							   title
+							   upper
+							   condition)};
+			    if (defined $oldcondition) {
+				my ($oldlocale) =
+				($oldcondition =~ /^([a-z][a-z](?:_\S+)?)/);
+				delete $CASESPEC{$code};
+				$CASESPEC{$code}->{$oldlocale} =
+				{ code      => $hexcode,
+				  lower     => $oldlower,
+				  title     => $oldtitle,
+				  upper     => $oldupper,
+				  condition => $oldcondition };
+			    }
+			}
+			my ($locale) =
+			    ($condition =~ /^([a-z][a-z](?:_\S+)?)/);
+			$CASESPEC{$code}->{$locale} =
+			{ code      => $hexcode,
+			  lower     => $lower,
+			  title     => $title,
+			  upper     => $upper,
+			  condition => $condition };
+		    } else {
+			$CASESPEC{$code} =
+			{ code      => $hexcode,
+			  lower     => $lower,
+			  title     => $title,
+			  upper     => $upper,
+			  condition => $condition };
+		    }
+		}
+	    }
+	    close($CASESPECFH);
+	}
+    }
+}
+
+sub casespec {
+    my $arg  = shift;
+    my $code = _getcode($arg);
+    croak __PACKAGE__, "::casespec: unknown code '$arg'"
+	unless defined $code;
+
+    _casespec() unless %CASESPEC;
+
+    return ref $CASESPEC{$code} ? dclone $CASESPEC{$code} : $CASESPEC{$code};
+}
+
+=head2 namedseq()
+
+    use Unicode::UCD 'namedseq';
+
+    my $namedseq = namedseq("KATAKANA LETTER AINU P");
+    my @namedseq = namedseq("KATAKANA LETTER AINU P");
+    my %namedseq = namedseq();
+
+If used with a single argument in a scalar context, returns the string
+consisting of the code points of the named sequence, or C<undef> if no
+named sequence by that name exists.  If used with a single argument in
+a list context, returns list of the code points.  If used with no
+arguments in a list context, returns a hash with the names of the
+named sequences as the keys and the named sequences as strings as
+the values.  Otherwise, returns C<undef> or empty list depending
+on the context.
+
+(New from Unicode 4.1.0)
+
+=cut
+
+my %NAMEDSEQ;
+
+sub _namedseq {
+    unless (%NAMEDSEQ) {
+	if (openunicode(\$NAMEDSEQFH, "NamedSequences.txt")) {
+	    local $_;
+	    while (<$NAMEDSEQFH>) {
+		if (/^(.+)\s*;\s*([0-9A-F]+(?: [0-9A-F]+)*)$/) {
+		    my ($n, $s) = ($1, $2);
+		    my @s = map { chr(hex($_)) } split(' ', $s);
+		    $NAMEDSEQ{$n} = join("", @s);
+		}
+	    }
+	    close($NAMEDSEQFH);
+	}
+    }
+}
+
+sub namedseq {
+    _namedseq() unless %NAMEDSEQ;
+    my $wantarray = wantarray();
+    if (defined $wantarray) {
+	if ($wantarray) {
+	    if (@_ == 0) {
+		return %NAMEDSEQ;
+	    } elsif (@_ == 1) {
+		my $s = $NAMEDSEQ{ $_[0] };
+		return defined $s ? map { ord($_) } split('', $s) : ();
+	    }
+	} elsif (@_ == 1) {
+	    return $NAMEDSEQ{ $_[0] };
+	}
+    }
+    return;
+}
+
+=head2 Unicode::UCD::UnicodeVersion
+
+Unicode::UCD::UnicodeVersion() returns the version of the Unicode
+Character Database, in other words, the version of the Unicode
+standard the database implements.  The version is a string
+of numbers delimited by dots (C<'.'>).
+
+=cut
+
+my $UNICODEVERSION;
+
+sub UnicodeVersion {
+    unless (defined $UNICODEVERSION) {
+	openunicode(\$VERSIONFH, "version");
+	chomp($UNICODEVERSION = <$VERSIONFH>);
+	close($VERSIONFH);
+	croak __PACKAGE__, "::VERSION: strange version '$UNICODEVERSION'"
+	    unless $UNICODEVERSION =~ /^\d+(?:\.\d+)+$/;
+    }
+    return $UNICODEVERSION;
+}
+
+=head2 Implementation Note
+
+The first use of charinfo() opens a read-only filehandle to the Unicode
+Character Database (the database is included in the Perl distribution).
+The filehandle is then kept open for further queries.  In other words,
+if you are wondering where one of your filehandles went, that's where.
+
+=head1 BUGS
+
+Does not yet support EBCDIC platforms.
+
+=head1 AUTHOR
+
+Jarkko Hietaniemi
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/User/grent.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/User/grent.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/User/grent.pm	(revision 14489)
@@ -0,0 +1,95 @@
+package User::grent;
+use strict;
+
+use 5.006_001;
+our $VERSION = '1.01';
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN { 
+    use Exporter   ();
+    @EXPORT      = qw(getgrent getgrgid getgrnam getgr);
+    @EXPORT_OK   = qw($gr_name $gr_gid $gr_passwd $gr_mem @gr_members);
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'User::grent' => [
+    name    => '$',
+    passwd  => '$',
+    gid	    => '$',
+    members => '@',
+];
+
+sub populate (@) {
+    return unless @_;
+    my $gob = new();
+    ($gr_name, $gr_passwd, $gr_gid) = @$gob[0,1,2] = @_[0,1,2];
+    @gr_members = @{$gob->[3]} = split ' ', $_[3];
+    return $gob;
+} 
+
+sub getgrent ( ) { populate(CORE::getgrent()) } 
+sub getgrnam ($) { populate(CORE::getgrnam(shift)) } 
+sub getgrgid ($) { populate(CORE::getgrgid(shift)) } 
+sub getgr    ($) { ($_[0] =~ /^\d+/) ? &getgrgid : &getgrnam } 
+
+1;
+__END__
+
+=head1 NAME
+
+User::grent - by-name interface to Perl's built-in getgr*() functions
+
+=head1 SYNOPSIS
+
+ use User::grent;
+ $gr = getgrgid(0) or die "No group zero";
+ if ( $gr->name eq 'wheel' && @{$gr->members} > 1 ) {
+     print "gid zero name wheel, with other members";
+ } 
+
+ use User::grent qw(:FIELDS);
+ getgrgid(0) or die "No group zero";
+ if ( $gr_name eq 'wheel' && @gr_members > 1 ) {
+     print "gid zero name wheel, with other members";
+ } 
+
+ $gr = getgr($whoever);
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getgrent(), getgruid(),
+and getgrnam() functions, replacing them with versions that return
+"User::grent" objects.  This object has methods that return the similarly
+named structure field name from the C's passwd structure from F<grp.h>; 
+namely name, passwd, gid, and members (not mem).  The first three
+return scalars, the last an array reference.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as variables named
+with a preceding C<gr_>.  Thus, C<$group_obj-E<gt>gid()> corresponds
+to $gr_gid if you import the fields.  Array references are available as
+regular array variables, so C<@{ $group_obj-E<gt>members() }> would be
+simply @gr_members.
+
+The getpw() function is a simple front-end that forwards
+a numeric argument to getpwuid() and the rest to getpwnam().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
Index: /for-distributions/trunk/bin/windows/perl/lib/User/pwent.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/User/pwent.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/User/pwent.pm	(revision 14489)
@@ -0,0 +1,298 @@
+package User::pwent;
+
+use 5.006;
+our $VERSION = '1.00';
+
+use strict;
+use warnings;
+
+use Config;
+use Carp;
+
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN {
+    use Exporter   ();
+    @EXPORT      = qw(getpwent getpwuid getpwnam getpw);
+    @EXPORT_OK   = qw(
+                        pw_has
+
+                        $pw_name    $pw_passwd  $pw_uid  $pw_gid
+                        $pw_gecos   $pw_dir     $pw_shell
+                        $pw_expire  $pw_change  $pw_class
+                        $pw_age
+                        $pw_quota   $pw_comment
+                        $pw_expire
+
+                   );
+    %EXPORT_TAGS = (
+        FIELDS => [ grep(/^\$pw_/, @EXPORT_OK), @EXPORT ],
+        ALL    => [ @EXPORT, @EXPORT_OK ],
+    );
+}
+use vars grep /^\$pw_/, @EXPORT_OK;
+
+#
+# XXX: these mean somebody hacked this module's source
+#      without understanding the underlying assumptions.
+#
+my $IE = "[INTERNAL ERROR]";
+
+# Class::Struct forbids use of @ISA
+sub import { goto &Exporter::import }
+
+use Class::Struct qw(struct);
+struct 'User::pwent' => [
+    name    => '$',         # pwent[0]
+    passwd  => '$',         # pwent[1]
+    uid     => '$',         # pwent[2]
+    gid     => '$',         # pwent[3]
+
+    # you'll only have one/none of these three
+    change  => '$',         # pwent[4]
+    age     => '$',         # pwent[4]
+    quota   => '$',         # pwent[4]
+
+    # you'll only have one/none of these two
+    comment => '$',         # pwent[5]
+    class   => '$',         # pwent[5]
+
+    # you might not have this one
+    gecos   => '$',         # pwent[6]
+
+    dir     => '$',         # pwent[7]
+    shell   => '$',         # pwent[8]
+
+    # you might not have this one
+    expire  => '$',         # pwent[9]
+
+];
+
+
+# init our groks hash to be true if the built platform knew how
+# to do each struct pwd field that perl can ever under any circumstances
+# know about.  we do not use /^pw_?/, but just the tails.
+sub _feature_init {
+    our %Groks;         # whether build system knew how to do this feature
+    for my $feep ( qw{
+                         pwage      pwchange   pwclass    pwcomment
+                         pwexpire   pwgecos    pwpasswd   pwquota
+                     }
+                 )
+    {
+        my $short = $feep =~ /^pw(.*)/
+                  ? $1
+                  : do {
+                        # not cluck, as we know we called ourselves,
+                        # and a confession is probably imminent anyway
+                        warn("$IE $feep is a funny struct pwd field");
+                        $feep;
+                    };
+
+        exists $Config{ "d_" . $feep }
+            || confess("$IE Configure doesn't d_$feep");
+        $Groks{$short} = defined $Config{ "d_" . $feep };
+    }
+    # assume that any that are left are always there
+    for my $feep (grep /^\$pw_/s, @EXPORT_OK) {
+        $feep =~ /^\$pw_(.*)/;
+        $Groks{$1} = 1 unless defined $Groks{$1};
+    }
+}
+
+# With arguments, reports whether one or more fields are all implemented
+# in the build machine's struct pwd pw_*.  May be whitespace separated.
+# We do not use /^pw_?/, just the tails.
+#
+# Without arguments, returns the list of fields implemented on build
+# machine, space separated in scalar context.
+#
+# Takes exception to being asked whether this machine's struct pwd has
+# a field that Perl never knows how to provide under any circumstances.
+# If the module does this idiocy to itself, the explosion is noisier.
+#
+sub pw_has {
+    our %Groks;         # whether build system knew how to do this feature
+    my $cando = 1;
+    my $sploder = caller() ne __PACKAGE__
+                    ? \&croak
+                    : sub { confess("$IE @_") };
+    if (@_ == 0) {
+        my @valid = sort grep { $Groks{$_} } keys %Groks;
+        return wantarray ? @valid : "@valid";
+    }
+    for my $feep (map { split } @_) {
+        defined $Groks{$feep}
+            || $sploder->("$feep is never a valid struct pwd field");
+        $cando &&= $Groks{$feep};
+    }
+    return $cando;
+}
+
+sub _populate (@) {
+    return unless @_;
+    my $pwob = new();
+
+    # Any that haven't been pw_had are assumed on "all" platforms of
+    # course, this may not be so, but you can't get here otherwise,
+    # since the underlying core call already took exception to your
+    # impudence.
+
+    $pw_name    = $pwob->name   ( $_[0] );
+    $pw_passwd  = $pwob->passwd ( $_[1] )   if pw_has("passwd");
+    $pw_uid     = $pwob->uid    ( $_[2] );
+    $pw_gid     = $pwob->gid    ( $_[3] );
+
+    if (pw_has("change")) {
+        $pw_change      = $pwob->change ( $_[4] );
+    }
+    elsif (pw_has("age")) {
+        $pw_age         = $pwob->age    ( $_[4] );
+    }
+    elsif (pw_has("quota")) {
+        $pw_quota       = $pwob->quota  ( $_[4] );
+    }
+
+    if (pw_has("class")) {
+        $pw_class       = $pwob->class  ( $_[5] );
+    }
+    elsif (pw_has("comment")) {
+        $pw_comment     = $pwob->comment( $_[5] );
+    }
+
+    $pw_gecos   = $pwob->gecos  ( $_[6] ) if pw_has("gecos");
+
+    $pw_dir     = $pwob->dir    ( $_[7] );
+    $pw_shell   = $pwob->shell  ( $_[8] );
+
+    $pw_expire  = $pwob->expire ( $_[9] ) if pw_has("expire");
+
+    return $pwob;
+}
+
+sub getpwent ( ) { _populate(CORE::getpwent()) }
+sub getpwnam ($) { _populate(CORE::getpwnam(shift)) }
+sub getpwuid ($) { _populate(CORE::getpwuid(shift)) }
+sub getpw    ($) { ($_[0] =~ /^\d+\z/s) ? &getpwuid : &getpwnam }
+
+_feature_init();
+
+1;
+__END__
+
+=head1 NAME
+
+User::pwent - by-name interface to Perl's built-in getpw*() functions
+
+=head1 SYNOPSIS
+
+ use User::pwent;
+ $pw = getpwnam('daemon')       || die "No daemon user";
+ if ( $pw->uid == 1 && $pw->dir =~ m#^/(bin|tmp)?\z#s ) {
+     print "gid 1 on root dir";
+ }
+
+ $real_shell = $pw->shell || '/bin/sh';
+
+ for (($fullname, $office, $workphone, $homephone) =
+        split /\s*,\s*/, $pw->gecos)
+ {
+    s/&/ucfirst(lc($pw->name))/ge;
+ }
+
+ use User::pwent qw(:FIELDS);
+ getpwnam('daemon')             || die "No daemon user";
+ if ( $pw_uid == 1 && $pw_dir =~ m#^/(bin|tmp)?\z#s ) {
+     print "gid 1 on root dir";
+ }
+
+ $pw = getpw($whoever);
+
+ use User::pwent qw/:DEFAULT pw_has/;
+ if (pw_has(qw[gecos expire quota])) { .... }
+ if (pw_has("name uid gid passwd"))  { .... }
+ print "Your struct pwd has: ", scalar pw_has(), "\n";
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getpwent(), getpwuid(),
+and getpwnam() functions, replacing them with versions that return
+C<User::pwent> objects.  This object has methods that return the
+similarly named structure field name from the C's passwd structure
+from F<pwd.h>, stripped of their leading "pw_" parts, namely C<name>,
+C<passwd>, C<uid>, C<gid>, C<change>, C<age>, C<quota>, C<comment>,
+C<class>, C<gecos>, C<dir>, C<shell>, and C<expire>.  The C<passwd>,
+C<gecos>, and C<shell> fields are tainted when running in taint mode.
+
+You may also import all the structure fields directly into your
+namespace as regular variables using the :FIELDS import tag.  (Note
+that this still overrides your core functions.)  Access these fields
+as variables named with a preceding C<pw_> in front their method
+names.  Thus, C<< $passwd_obj->shell >> corresponds to $pw_shell
+if you import the fields.
+
+The getpw() function is a simple front-end that forwards
+a numeric argument to getpwuid() and the rest to getpwnam().
+
+To access this functionality without the core overrides, pass the
+C<use> an empty import list, and then access function functions
+with their full qualified names.  The built-ins are always still
+available via the C<CORE::> pseudo-package.
+
+=head2 System Specifics
+
+Perl believes that no machine ever has more than one of C<change>,
+C<age>, or C<quota> implemented, nor more than one of either
+C<comment> or C<class>.  Some machines do not support C<expire>,
+C<gecos>, or allegedly, C<passwd>.  You may call these methods
+no matter what machine you're on, but they return C<undef> if
+unimplemented.
+
+You may ask whether one of these was implemented on the system Perl
+was built on by asking the importable C<pw_has> function about them.
+This function returns true if all parameters are supported fields
+on the build platform, false if one or more were not, and raises
+an exception if you asked about a field that Perl never knows how
+to provide.  Parameters may be in a space-separated string, or as
+separate arguments.  If you pass no parameters, the function returns
+the list of C<struct pwd> fields supported by your build platform's
+C library, as a list in list context, or a space-separated string
+in scalar context.  Note that just because your C library had
+a field doesn't necessarily mean that it's fully implemented on
+that system.
+
+Interpretation of the C<gecos> field varies between systems, but
+traditionally holds 4 comma-separated fields containing the user's
+full name, office location, work phone number, and home phone number.
+An C<&> in the gecos field should be replaced by the user's properly
+capitalized login C<name>.  The C<shell> field, if blank, must be
+assumed to be F</bin/sh>.  Perl does not do this for you.  The
+C<passwd> is one-way hashed garble, not clear text, and may not be
+unhashed save by brute-force guessing.  Secure systems use more a
+more secure hashing than DES.  On systems supporting shadow password
+systems, Perl automatically returns the shadow password entry when
+called by a suitably empowered user, even if your underlying
+vendor-provided C library was too short-sighted to realize it should
+do this.
+
+See passwd(5) and getpwent(3) for details.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Struct
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
+
+=head1 HISTORY
+
+=over 4
+
+=item March 18th, 2000
+
+Reworked internals to support better interface to dodgey fields
+than normal Perl function provides.  Added pw_has() field.  Improved
+documentation.
+
+=back
Index: /for-distributions/trunk/bin/windows/perl/lib/Win32.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/Win32.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/Win32.pm	(revision 14489)
@@ -0,0 +1,712 @@
+package Win32;
+
+BEGIN {
+    use strict;
+    use vars qw|$VERSION @ISA @EXPORT @EXPORT_OK|;
+
+    require Exporter;
+    require DynaLoader;
+
+    @ISA = qw|Exporter DynaLoader|;
+    $VERSION = '0.2601';
+
+    @EXPORT = qw(
+	NULL
+	WIN31_CLASS
+	OWNER_SECURITY_INFORMATION
+	GROUP_SECURITY_INFORMATION
+	DACL_SECURITY_INFORMATION
+	SACL_SECURITY_INFORMATION
+	MB_ICONHAND
+	MB_ICONQUESTION
+	MB_ICONEXCLAMATION
+	MB_ICONASTERISK
+	MB_ICONWARNING
+	MB_ICONERROR
+	MB_ICONINFORMATION
+	MB_ICONSTOP
+    );
+    @EXPORT_OK = qw(
+        GetOSName
+        SW_HIDE
+        SW_SHOWNORMAL
+        SW_SHOWMINIMIZED
+        SW_SHOWMAXIMIZED
+        SW_SHOWNOACTIVATE
+
+        CSIDL_DESKTOP
+        CSIDL_PROGRAMS
+        CSIDL_PERSONAL
+        CSIDL_FAVORITES
+        CSIDL_STARTUP
+        CSIDL_RECENT
+        CSIDL_SENDTO
+        CSIDL_STARTMENU
+        CSIDL_MYMUSIC
+        CSIDL_MYVIDEO
+        CSIDL_DESKTOPDIRECTORY
+        CSIDL_NETHOOD
+        CSIDL_FONTS
+        CSIDL_TEMPLATES
+        CSIDL_COMMON_STARTMENU
+        CSIDL_COMMON_PROGRAMS
+        CSIDL_COMMON_STARTUP
+        CSIDL_COMMON_DESKTOPDIRECTORY
+        CSIDL_APPDATA
+        CSIDL_PRINTHOOD
+        CSIDL_LOCAL_APPDATA
+        CSIDL_COMMON_FAVORITES
+        CSIDL_INTERNET_CACHE
+        CSIDL_COOKIES
+        CSIDL_HISTORY
+        CSIDL_COMMON_APPDATA
+        CSIDL_WINDOWS
+        CSIDL_SYSTEM
+        CSIDL_PROGRAM_FILES
+        CSIDL_MYPICTURES
+        CSIDL_PROFILE
+        CSIDL_PROGRAM_FILES_COMMON
+        CSIDL_COMMON_TEMPLATES
+        CSIDL_COMMON_DOCUMENTS
+        CSIDL_COMMON_ADMINTOOLS
+        CSIDL_ADMINTOOLS
+        CSIDL_COMMON_MUSIC
+        CSIDL_COMMON_PICTURES
+        CSIDL_COMMON_VIDEO
+        CSIDL_RESOURCES
+        CSIDL_RESOURCES_LOCALIZED
+        CSIDL_CDBURN_AREA
+    );
+}
+
+# Routines available in core:
+# Win32::GetLastError
+# Win32::LoginName
+# Win32::NodeName
+# Win32::DomainName
+# Win32::FsType
+# Win32::GetCwd
+# Win32::GetOSVersion
+# Win32::FormatMessage ERRORCODE
+# Win32::Spawn COMMAND, ARGS, PID
+# Win32::GetTickCount
+# Win32::IsWinNT
+# Win32::IsWin95
+
+# We won't bother with the constant stuff, too much of a hassle.  Just hard
+# code it here.
+
+sub NULL 				{ 0 }
+sub WIN31_CLASS 			{ &NULL }
+
+sub OWNER_SECURITY_INFORMATION		{ 0x00000001 }
+sub GROUP_SECURITY_INFORMATION		{ 0x00000002 }
+sub DACL_SECURITY_INFORMATION		{ 0x00000004 }
+sub SACL_SECURITY_INFORMATION		{ 0x00000008 }
+
+sub MB_ICONHAND				{ 0x00000010 }
+sub MB_ICONQUESTION			{ 0x00000020 }
+sub MB_ICONEXCLAMATION			{ 0x00000030 }
+sub MB_ICONASTERISK			{ 0x00000040 }
+sub MB_ICONWARNING			{ 0x00000030 }
+sub MB_ICONERROR			{ 0x00000010 }
+sub MB_ICONINFORMATION			{ 0x00000040 }
+sub MB_ICONSTOP				{ 0x00000010 }
+
+#
+# Newly added constants.  These have an empty prototype, unlike the
+# the ones above, which aren't prototyped for compatibility reasons.
+#
+sub SW_HIDE           ()		{ 0 }
+sub SW_SHOWNORMAL     ()		{ 1 }
+sub SW_SHOWMINIMIZED  ()		{ 2 }
+sub SW_SHOWMAXIMIZED  ()		{ 3 }
+sub SW_SHOWNOACTIVATE ()		{ 4 }
+
+sub CSIDL_DESKTOP              ()       { 0x0000 }     # <desktop>
+sub CSIDL_PROGRAMS             ()       { 0x0002 }     # Start Menu\Programs
+sub CSIDL_PERSONAL             ()       { 0x0005 }     # "My Documents" folder
+sub CSIDL_FAVORITES            ()       { 0x0006 }     # <user name>\Favorites
+sub CSIDL_STARTUP              ()       { 0x0007 }     # Start Menu\Programs\Startup
+sub CSIDL_RECENT               ()       { 0x0008 }     # <user name>\Recent
+sub CSIDL_SENDTO               ()       { 0x0009 }     # <user name>\SendTo
+sub CSIDL_STARTMENU            ()       { 0x000B }     # <user name>\Start Menu
+sub CSIDL_MYMUSIC              ()       { 0x000D }     # "My Music" folder
+sub CSIDL_MYVIDEO              ()       { 0x000E }     # "My Videos" folder
+sub CSIDL_DESKTOPDIRECTORY     ()       { 0x0010 }     # <user name>\Desktop
+sub CSIDL_NETHOOD              ()       { 0x0013 }     # <user name>\nethood
+sub CSIDL_FONTS                ()       { 0x0014 }     # windows\fonts
+sub CSIDL_TEMPLATES            ()       { 0x0015 }
+sub CSIDL_COMMON_STARTMENU     ()       { 0x0016 }     # All Users\Start Menu
+sub CSIDL_COMMON_PROGRAMS      ()       { 0x0017 }     # All Users\Start Menu\Programs
+sub CSIDL_COMMON_STARTUP       ()       { 0x0018 }     # All Users\Startup
+sub CSIDL_COMMON_DESKTOPDIRECTORY ()    { 0x0019 }     # All Users\Desktop
+sub CSIDL_APPDATA              ()       { 0x001A }     # Application Data, new for NT4
+sub CSIDL_PRINTHOOD            ()       { 0x001B }     # <user name>\PrintHood
+sub CSIDL_LOCAL_APPDATA        ()       { 0x001C }     # non roaming, user\Local Settings\Application Data
+sub CSIDL_COMMON_FAVORITES     ()       { 0x001F }
+sub CSIDL_INTERNET_CACHE       ()       { 0x0020 }
+sub CSIDL_COOKIES              ()       { 0x0021 }
+sub CSIDL_HISTORY              ()       { 0x0022 }
+sub CSIDL_COMMON_APPDATA       ()       { 0x0023 }     # All Users\Application Data
+sub CSIDL_WINDOWS              ()       { 0x0024 }     # GetWindowsDirectory()
+sub CSIDL_SYSTEM               ()       { 0x0025 }     # GetSystemDirectory()
+sub CSIDL_PROGRAM_FILES        ()       { 0x0026 }     # C:\Program Files
+sub CSIDL_MYPICTURES           ()       { 0x0027 }     # "My Pictures", new for Win2K
+sub CSIDL_PROFILE              ()       { 0x0028 }     # USERPROFILE
+sub CSIDL_PROGRAM_FILES_COMMON ()       { 0x002B }     # C:\Program Files\Common
+sub CSIDL_COMMON_TEMPLATES     ()       { 0x002D }     # All Users\Templates
+sub CSIDL_COMMON_DOCUMENTS     ()       { 0x002E }     # All Users\Documents
+sub CSIDL_COMMON_ADMINTOOLS    ()       { 0x002F }     # All Users\Start Menu\Programs\Administrative Tools
+sub CSIDL_ADMINTOOLS           ()       { 0x0030 }     # <user name>\Start Menu\Programs\Administrative Tools
+sub CSIDL_COMMON_MUSIC         ()       { 0x0035 }     # All Users\My Music
+sub CSIDL_COMMON_PICTURES      ()       { 0x0036 }     # All Users\My Pictures
+sub CSIDL_COMMON_VIDEO         ()       { 0x0037 }     # All Users\My Video
+sub CSIDL_RESOURCES            ()       { 0x0038 }     # %windir%\Resources\, For theme and other windows resources.
+sub CSIDL_RESOURCES_LOCALIZED  ()       { 0x0039 }     # %windir%\Resources\<LangID>, for theme and other windows specific resources.
+sub CSIDL_CDBURN_AREA          ()       { 0x003B }     # <user name>\Local Settings\Application Data\Microsoft\CD Burning
+
+### This method is just a simple interface into GetOSVersion().  More
+### specific or demanding situations should use that instead.
+
+my ($found_os, $found_desc);
+
+sub GetOSName {
+    my ($os,$desc,$major, $minor, $build, $id)=("","");
+    unless (defined $found_os) {
+        # If we have a run this already, we have the results cached
+        # If so, return them
+
+        # Use the standard API call to determine the version
+        ($desc, $major, $minor, $build, $id) = Win32::GetOSVersion();
+
+        # If id==0 then its a win32s box -- Meaning Win3.11
+        unless($id) {
+            $os = 'Win32s';
+        }
+	else {
+	    # Magic numbers from MSDN documentation of OSVERSIONINFO
+	    # Most version names can be parsed from just the id and minor
+	    # version
+	    $os = {
+		1 => {
+		    0  => "95",
+		    10 => "98",
+		    90 => "Me"
+		},
+		2 => {
+		    0  => "NT4",
+		    1  => "XP/.Net",
+		    2  => "2003",
+		    51 => "NT3.51"
+		}
+	    }->{$id}->{$minor};
+	}
+
+        # This _really_ shouldnt happen.  At least not for quite a while
+        # Politely warn and return undef
+        unless (defined $os) {
+            warn qq[Windows version [$id:$major:$minor] unknown!];
+            return undef;
+        }
+
+        my $tag = "";
+
+        # But distinguising W2k and Vista from NT4 requires looking at the major version
+        if ($os eq "NT4") {
+	    $os = {5 => "2000", 6 => "Vista"}->{$major} || "NT4";
+        }
+
+        # For the rest we take a look at the build numbers and try to deduce
+	# the exact release name, but we put that in the $desc
+        elsif ($os eq "95") {
+            if ($build eq '67109814') {
+                    $tag = '(a)';
+            }
+	    elsif ($build eq '67306684') {
+                    $tag = '(b1)';
+            }
+	    elsif ($build eq '67109975') {
+                    $tag = '(b2)';
+            }
+        }
+	elsif ($os eq "98" && $build eq '67766446') {
+            $tag = '(2nd ed)';
+        }
+
+	if (length $tag) {
+	    if (length $desc) {
+	        $desc = "$tag $desc";
+	    }
+	    else {
+	        $desc = $tag;
+	    }
+	}
+
+        # cache the results, so we dont have to do this again
+        $found_os      = "Win$os";
+        $found_desc    = $desc;
+    }
+
+    return wantarray ? ($found_os, $found_desc) : $found_os;
+}
+
+bootstrap Win32;
+
+1;
+
+__END__
+
+=head1 NAME
+
+Win32 - Interfaces to some Win32 API Functions
+
+=head1 DESCRIPTION
+
+Perl on Win32 contains several functions to access Win32 APIs.  Some
+are included in Perl itself (on Win32) and some are only available
+after explicitly requesting the Win32 module with:
+
+	use Win32;
+
+The builtin functions are marked as [CORE] and the other ones
+as [EXT] in the following alphabetical listing.
+
+=head2 Alphabetical Listing of Win32 Functions
+
+=over
+
+=item Win32::AbortSystemShutdown(MACHINE)
+
+[EXT] Aborts a system shutdown (started by the
+InitiateSystemShutdown function) on the specified MACHINE.
+
+=item Win32::BuildNumber()
+
+[CORE] Returns the ActivePerl build number.  This function is
+only available in the ActivePerl binary distribution.
+
+=item Win32::CopyFile(FROM, TO, OVERWRITE)
+
+[CORE] The Win32::CopyFile() function copies an existing file to a new
+file.  All file information like creation time and file attributes will
+be copied to the new file.  However it will B<not> copy the security
+information.  If the destination file already exists it will only be
+overwritten when the OVERWRITE parameter is true.  But even this will
+not overwrite a read-only file; you have to unlink() it first
+yourself.
+
+=item Win32::DomainName()
+
+[CORE] Returns the name of the Microsoft Network domain that the
+owner of the current perl process is logged into.  This function does
+B<not> work on Windows 9x.
+
+=item Win32::ExpandEnvironmentStrings(STRING)
+
+[EXT] Takes STRING and replaces all referenced environment variable
+names with their defined values.  References to environment variables
+take the form C<%VariableName%>.  Case is ignored when looking up the
+VariableName in the environment.  If the variable is not found then the
+original C<%VariableName%> text is retained.  Has the same effect
+as the following:
+
+	$string =~ s/%([^%]*)%/$ENV{$1} || "%$1%"/eg
+
+=item Win32::FormatMessage(ERRORCODE)
+
+[CORE] Converts the supplied Win32 error number (e.g. returned by
+Win32::GetLastError()) to a descriptive string.  Analogous to the
+perror() standard-C library function.  Note that C<$^E> used
+in a string context has much the same effect.
+
+	C:\> perl -e "$^E = 26; print $^E;"
+	The specified disk or diskette cannot be accessed
+
+=item Win32::FsType()
+
+[CORE] Returns the name of the filesystem of the currently active
+drive (like 'FAT' or 'NTFS').  In list context it returns three values:
+(FSTYPE, FLAGS, MAXCOMPLEN).  FSTYPE is the filesystem type as
+before.  FLAGS is a combination of values of the following table:
+
+	0x00000001  supports case-sensitive filenames
+	0x00000002  preserves the case of filenames
+	0x00000004  supports Unicode in filenames
+	0x00000008  preserves and enforces ACLs
+	0x00000010  supports file-based compression
+	0x00000020  supports disk quotas
+	0x00000040  supports sparse files
+	0x00000080  supports reparse points
+	0x00000100  supports remote storage
+	0x00008000  is a compressed volume (e.g. DoubleSpace)
+	0x00010000  supports object identifiers
+	0x00020000  supports the Encrypted File System (EFS)
+
+MAXCOMPLEN is the maximum length of a filename component (the part
+between two backslashes) on this file system.
+
+=item Win32::FreeLibrary(HANDLE)
+
+[EXT] Unloads a previously loaded dynamic-link library.  The HANDLE is
+no longer valid after this call.  See L<LoadLibrary|Win32::LoadLibrary(LIBNAME)>
+for information on dynamically loading a library.
+
+=item Win32::GetArchName()
+
+[EXT] Use of this function is deprecated.  It is equivalent with
+$ENV{PROCESSOR_ARCHITECTURE}.  This might not work on Win9X.
+
+=item Win32::GetChipName()
+
+[EXT] Returns the processor type: 386, 486 or 586 for Intel processors,
+21064 for the Alpha chip.
+
+=item Win32::GetCwd()
+
+[CORE] Returns the current active drive and directory.  This function
+does not return a UNC path, since the functionality required for such
+a feature is not available under Windows 95.
+
+=item Win32::GetFileVersion(FILENAME)
+
+[EXT] Returns the file version number from the VERSIONINFO resource of
+the executable file or DLL.  This is a tuple of four 16 bit numbers.
+In list context these four numbers will be returned.  In scalar context
+they are concatenated into a string, separated by dots.
+
+=item Win32::GetFolderPath(FOLDER [, CREATE])
+
+[EXT] Returns the full pathname of one of the Windows special folders.
+The folder will be created if it doesn't exist and the optional CREATE
+argument is true.  The following FOLDER constants are defined by the
+Win32 module, but only exported on demand:
+
+        CSIDL_ADMINTOOLS
+        CSIDL_APPDATA
+        CSIDL_CDBURN_AREA
+        CSIDL_COMMON_ADMINTOOLS
+        CSIDL_COMMON_APPDATA
+        CSIDL_COMMON_DESKTOPDIRECTORY
+        CSIDL_COMMON_DOCUMENTS
+        CSIDL_COMMON_FAVORITES
+        CSIDL_COMMON_MUSIC
+        CSIDL_COMMON_PICTURES
+        CSIDL_COMMON_PROGRAMS
+        CSIDL_COMMON_STARTMENU
+        CSIDL_COMMON_STARTUP
+        CSIDL_COMMON_TEMPLATES
+        CSIDL_COMMON_VIDEO
+        CSIDL_COOKIES
+        CSIDL_DESKTOP
+        CSIDL_DESKTOPDIRECTORY
+        CSIDL_FAVORITES
+        CSIDL_FONTS
+        CSIDL_HISTORY
+        CSIDL_INTERNET_CACHE
+        CSIDL_LOCAL_APPDATA
+        CSIDL_MYMUSIC
+        CSIDL_MYPICTURES
+        CSIDL_MYVIDEO
+        CSIDL_NETHOOD
+        CSIDL_PERSONAL
+        CSIDL_PRINTHOOD
+        CSIDL_PROFILE
+        CSIDL_PROGRAMS
+        CSIDL_PROGRAM_FILES
+        CSIDL_PROGRAM_FILES_COMMON
+        CSIDL_RECENT
+        CSIDL_RESOURCES
+        CSIDL_RESOURCES_LOCALIZED
+        CSIDL_SENDTO
+        CSIDL_STARTMENU
+        CSIDL_STARTUP
+        CSIDL_SYSTEM
+        CSIDL_TEMPLATES
+        CSIDL_WINDOWS
+
+Note that not all folders are defined on all versions of Windows.
+
+Please refer to the MSDN documentation of the CSIDL constants,
+currently available at:
+
+http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp
+
+=item Win32::GetFullPathName(FILENAME)
+
+[CORE] GetFullPathName combines the FILENAME with the current drive
+and directory name and returns a fully qualified (aka, absolute)
+path name.  In list context it returns two elements: (PATH, FILE) where
+PATH is the complete pathname component (including trailing backslash)
+and FILE is just the filename part.  Note that no attempt is made to
+convert 8.3 components in the supplied FILENAME to longnames or
+vice-versa.  Compare with Win32::GetShortPathName and
+Win32::GetLongPathName.
+
+=item Win32::GetLastError()
+
+[CORE] Returns the last error value generated by a call to a Win32 API
+function.  Note that C<$^E> used in a numeric context amounts to the
+same value.
+
+=item Win32::GetLongPathName(PATHNAME)
+
+[CORE] Returns a representation of PATHNAME composed of longname
+components (if any).  The result may not necessarily be longer
+than PATHNAME.  No attempt is made to convert PATHNAME to the
+absolute path.  Compare with Win32::GetShortPathName and
+Win32::GetFullPathName.
+
+=item Win32::GetNextAvailDrive()
+
+[CORE] Returns a string in the form of "<d>:" where <d> is the first
+available drive letter.
+
+=item Win32::GetOSVersion()
+
+[CORE] Returns the list (STRING, MAJOR, MINOR, BUILD, ID), where the
+elements are, respectively: An arbitrary descriptive string, the major
+version number of the operating system, the minor version number, the
+build number, and a digit indicating the actual operating system.
+For the ID, the values are 0 for Win32s, 1 for Windows 9X/Me and 2 for
+Windows NT/2000/XP/2003.  In scalar context it returns just the ID.
+
+Currently known values for ID MAJOR and MINOR are as follows:
+
+    OS                    ID    MAJOR   MINOR
+    Win32s                 0      -       -
+    Windows 95             1      4       0
+    Windows 98             1      4      10
+    Windows Me             1      4      90
+    Windows NT 3.51        2      3      51
+    Windows NT 4           2      4       0
+    Windows 2000           2      5       0
+    Windows XP             2      5       1
+    Windows Server 2003    2      5       2
+    Windows Vista          2      6       0
+
+On Windows NT 4 SP6 and later this function returns the following
+additional values: SPMAJOR, SPMINOR, SUITEMASK, PRODUCTTYPE.
+
+SPMAJOR and SPMINOR are are the version numbers of the latest
+installed service pack.
+
+SUITEMASK is a bitfield identifying the product suites available on
+the system.  Known bits are:
+
+    VER_SUITE_SMALLBUSINESS             0x00000001
+    VER_SUITE_ENTERPRISE                0x00000002
+    VER_SUITE_BACKOFFICE                0x00000004
+    VER_SUITE_COMMUNICATIONS            0x00000008
+    VER_SUITE_TERMINAL                  0x00000010
+    VER_SUITE_SMALLBUSINESS_RESTRICTED  0x00000020
+    VER_SUITE_EMBEDDEDNT                0x00000040
+    VER_SUITE_DATACENTER                0x00000080
+    VER_SUITE_SINGLEUSERTS              0x00000100
+    VER_SUITE_PERSONAL                  0x00000200
+    VER_SUITE_BLADE                     0x00000400
+    VER_SUITE_EMBEDDED_RESTRICTED       0x00000800
+    VER_SUITE_SECURITY_APPLIANCE        0x00001000
+
+The VER_SUITE_xxx names are listed here to crossreference the Microsoft
+documentation.  The Win32 module does not provide symbolic names for these
+constants.
+
+PRODUCTTYPE provides additional information about the system.  It should
+be one of the following integer values:
+
+    1 - Workstation (NT 4, 2000 Pro, XP Home, XP Pro)
+    2 - Domaincontroller
+    3 - Server
+
+=item Win32::GetOSName()
+
+[EXT] In scalar context returns the name of the Win32 operating system
+being used.  In list context returns a two element list of the OS name
+and whatever edition information is known about the particular build
+(for Win9X boxes) and whatever service packs have been installed.
+The latter is roughly equivalent to the first item returned by
+GetOSVersion() in list context.
+
+Currently the possible values for the OS name are
+
+ Win32s Win95 Win98 WinMe WinNT3.51 WinNT4 Win2000 WinXP/.Net Win2003
+
+This routine is just a simple interface into GetOSVersion().  More
+specific or demanding situations should use that instead.  Another
+option would be to use POSIX::uname(), however the latter appears to
+report only the OS family name and not the specific OS.  In scalar
+context it returns just the ID.
+
+The name "WinXP/.Net" is used for historical reasons only, to maintain
+backwards compatibility of the Win32 module.  Windows .NET Server has
+been renamed as Windows 2003 Server before final release and uses a
+different major/minor version number than Windows XP.
+
+=item Win32::GetShortPathName(PATHNAME)
+
+[CORE] Returns a representation of PATHNAME that is composed of short
+(8.3) path components where available.  For path components where the
+file system has not generated the short form the returned path will
+use the long form, so this function might still for instance return a
+path containing spaces.  Compare with Win32::GetFullPathName and
+Win32::GetLongPathName.
+
+=item Win32::GetProcAddress(INSTANCE, PROCNAME)
+
+[EXT] Returns the address of a function inside a loaded library.  The
+information about what you can do with this address has been lost in
+the mist of time.  Use the Win32::API module instead of this deprecated
+function.
+
+=item Win32::GetTickCount()
+
+[CORE] Returns the number of milliseconds elapsed since the last
+system boot.  Resolution is limited to system timer ticks (about 10ms
+on WinNT and 55ms on Win9X).
+
+=item Win32::GuidGen()
+
+[EXT] Creates a globally unique 128 bit integer that can be used as a
+persistent identifier in a distributed setting. To a very high degree
+of certainty this function returns a unique value. No other
+invocation, on the same or any other system (networked or not), should
+return the same value.
+
+The return value is formatted according to OLE conventions, as groups
+of hex digits with surrounding braces.  For example:
+
+    {09531CF1-D0C7-4860-840C-1C8C8735E2AD}
+ 
+=item Win32::InitiateSystemShutdown
+
+(MACHINE, MESSAGE, TIMEOUT, FORCECLOSE, REBOOT)
+
+[EXT] Shutsdown the specified MACHINE, notifying users with the
+supplied MESSAGE, within the specified TIMEOUT interval.  Forces
+closing of all documents without prompting the user if FORCECLOSE is
+true, and reboots the machine if REBOOT is true.  This function works
+only on WinNT.
+
+=item Win32::IsAdminUser()
+
+[EXT] Returns non zero if the account in whose security context the
+current process/thread is running belongs to the local group of
+Administrators in the built-in system domain; returns 0 if not.
+Returns the undefined value and prints a warning if an error occurred.
+This function always returns 1 on Win9X.
+
+=item Win32::IsWinNT()
+
+[CORE] Returns non zero if the Win32 subsystem is Windows NT.
+
+=item Win32::IsWin95()
+
+[CORE] Returns non zero if the Win32 subsystem is Windows 95.
+
+=item Win32::LoadLibrary(LIBNAME)
+
+[EXT] Loads a dynamic link library into memory and returns its module
+handle.  This handle can be used with Win32::GetProcAddress and
+Win32::FreeLibrary.  This function is deprecated.  Use the Win32::API
+module instead.
+
+=item Win32::LoginName()
+
+[CORE] Returns the username of the owner of the current perl process.
+
+=item Win32::LookupAccountName(SYSTEM, ACCOUNT, DOMAIN, SID, SIDTYPE)
+
+[EXT] Looks up ACCOUNT on SYSTEM and returns the domain name the SID and
+the SID type.
+
+=item Win32::LookupAccountSID(SYSTEM, SID, ACCOUNT, DOMAIN, SIDTYPE)
+
+[EXT] Looks up SID on SYSTEM and returns the account name, domain name,
+and the SID type.
+
+=item Win32::MsgBox(MESSAGE [, FLAGS [, TITLE]])
+
+[EXT] Create a dialogbox containing MESSAGE.  FLAGS specifies the
+required icon and buttons according to the following table:
+
+	0 = OK
+	1 = OK and Cancel
+	2 = Abort, Retry, and Ignore
+	3 = Yes, No and Cancel
+	4 = Yes and No
+	5 = Retry and Cancel
+
+	MB_ICONSTOP          "X" in a red circle
+	MB_ICONQUESTION      question mark in a bubble
+	MB_ICONEXCLAMATION   exclamation mark in a yellow triangle
+	MB_ICONINFORMATION   "i" in a bubble
+
+TITLE specifies an optional window title.  The default is "Perl".
+
+The function returns the menu id of the selected push button:
+
+	0  Error
+
+	1  OK
+	2  Cancel
+	3  Abort
+	4  Retry
+	5  Ignore
+	6  Yes
+	7  No
+
+=item Win32::NodeName()
+
+[CORE] Returns the Microsoft Network node-name of the current machine.
+
+=item Win32::RegisterServer(LIBRARYNAME)
+
+[EXT] Loads the DLL LIBRARYNAME and calls the function DllRegisterServer.
+
+=item Win32::SetChildShowWindow(SHOWWINDOW)
+
+[CORE] Sets the I<ShowMode> of child processes started by system().
+By default system() will create a new console window for child
+processes if Perl itself is not running from a console.  Calling
+SetChildShowWindow(0) will make these new console windows invisible.
+Calling SetChildShowWindow() without arguments reverts system() to the
+default behavior.  The return value of SetChildShowWindow() is the
+previous setting or C<undef>.
+
+[EXT] The following symbolic constants for SHOWWINDOW are available
+(but not exported) from the Win32 module: SW_HIDE, SW_SHOWNORMAL,
+SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED and SW_SHOWNOACTIVATE.
+
+=item Win32::SetCwd(NEWDIRECTORY)
+
+[CORE] Sets the current active drive and directory.  This function does not
+work with UNC paths, since the functionality required to required for
+such a feature is not available under Windows 95.
+
+=item Win32::SetLastError(ERROR)
+
+[CORE] Sets the value of the last error encountered to ERROR.  This is
+that value that will be returned by the Win32::GetLastError()
+function.
+
+=item Win32::Sleep(TIME)
+
+[CORE] Pauses for TIME milliseconds.  The timeslices are made available
+to other processes and threads.
+
+=item Win32::Spawn(COMMAND, ARGS, PID)
+
+[CORE] Spawns a new process using the supplied COMMAND, passing in
+arguments in the string ARGS.  The pid of the new process is stored in
+PID.  This function is deprecated.  Please use the Win32::Process module
+instead.
+
+=item Win32::UnregisterServer(LIBRARYNAME)
+
+[EXT] Loads the DLL LIBRARYNAME and calls the function
+DllUnregisterServer.
+
+=back
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/XML/Parser.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XML/Parser.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XML/Parser.pm	(revision 14489)
@@ -0,0 +1,840 @@
+# XML::Parser
+#
+# Copyright (c) 1998-2000 Larry Wall and Clark Cooper
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package XML::Parser;
+
+use Carp;
+
+BEGIN {
+  require XML::Parser::Expat;
+  $VERSION = '2.34';
+  die "Parser.pm and Expat.pm versions don't match"
+    unless $VERSION eq $XML::Parser::Expat::VERSION;
+}
+
+use strict;
+
+use vars qw($VERSION $LWP_load_failed);
+
+$LWP_load_failed = 0;
+
+sub new {
+  my ($class, %args) = @_;
+  my $style = $args{Style};
+  
+  my $nonexopt = $args{Non_Expat_Options} ||= {};
+  
+  $nonexopt->{Style}             = 1;
+  $nonexopt->{Non_Expat_Options} = 1;
+  $nonexopt->{Handlers}          = 1;
+  $nonexopt->{_HNDL_TYPES}       = 1;
+  $nonexopt->{NoLWP}             = 1;
+  
+  $args{_HNDL_TYPES} = {%XML::Parser::Expat::Handler_Setters};
+  $args{_HNDL_TYPES}->{Init} = 1;
+  $args{_HNDL_TYPES}->{Final} = 1;
+  
+  $args{Handlers} ||= {};
+  my $handlers = $args{Handlers};
+  
+  if (defined($style)) {
+    my $stylepkg = $style;
+    
+    if ($stylepkg !~ /::/) {
+      $stylepkg = "\u$style";
+      
+      eval {
+          my $fullpkg = 'XML::Parser::Style::' . $stylepkg;
+          my $stylefile = $fullpkg;
+          $stylefile =~ s/::/\//g;
+          require "$stylefile.pm";
+          $stylepkg = $fullpkg;
+      };
+      if ($@) {
+          # fallback to old behaviour
+          $stylepkg = 'XML::Parser::' . $stylepkg;
+      }
+    }
+    
+    my $htype;
+    foreach $htype (keys %{$args{_HNDL_TYPES}}) {
+      # Handlers explicity given override
+      # handlers from the Style package
+      unless (defined($handlers->{$htype})) {
+        
+        # A handler in the style package must either have
+        # exactly the right case as the type name or a
+        # completely lower case version of it.
+        
+        my $hname = "${stylepkg}::$htype";
+        if (defined(&$hname)) {
+          $handlers->{$htype} = \&$hname;
+          next;
+        }
+        
+        $hname = "${stylepkg}::\L$htype";
+        if (defined(&$hname)) {
+          $handlers->{$htype} = \&$hname;
+          next;
+        }
+      }
+    }
+  }
+  
+  unless (defined($handlers->{ExternEnt})
+          or defined ($handlers->{ExternEntFin})) {
+    
+    if ($args{NoLWP} or $LWP_load_failed) {
+      $handlers->{ExternEnt} = \&file_ext_ent_handler;
+      $handlers->{ExternEntFin} = \&file_ext_ent_cleanup;
+    }
+    else {
+      # The following just bootstraps the real LWP external entity
+      # handler
+
+      $handlers->{ExternEnt} = \&initial_ext_ent_handler;
+
+      # No cleanup function available until LWPExternEnt.pl loaded
+    }
+  }
+
+  $args{Pkg} ||= caller;
+  bless \%args, $class;
+}                                # End of new
+
+sub setHandlers {
+  my ($self, @handler_pairs) = @_;
+  
+  croak("Uneven number of arguments to setHandlers method")
+    if (int(@handler_pairs) & 1);
+  
+  my @ret;
+  while (@handler_pairs) {
+    my $type = shift @handler_pairs;
+    my $handler = shift @handler_pairs;
+    unless (defined($self->{_HNDL_TYPES}->{$type})) {
+      my @types = sort keys %{$self->{_HNDL_TYPES}};
+      
+      croak("Unknown Parser handler type: $type\n Valid types: @types");
+    }
+    push(@ret, $type, $self->{Handlers}->{$type});
+    $self->{Handlers}->{$type} = $handler;
+  }
+
+  return @ret;
+}
+
+sub parse_start {
+  my $self = shift;
+  my @expat_options = ();
+
+  my ($key, $val);
+  while (($key, $val) = each %{$self}) {
+    push (@expat_options, $key, $val)
+      unless exists $self->{Non_Expat_Options}->{$key};
+  }
+
+  my %handlers = %{$self->{Handlers}};
+  my $init = delete $handlers{Init};
+  my $final = delete $handlers{Final};
+
+  my $expatnb = new XML::Parser::ExpatNB(@expat_options, @_);
+  $expatnb->setHandlers(%handlers);
+
+  &$init($expatnb)
+    if defined($init);
+
+  $expatnb->{_State_} = 1;
+
+  $expatnb->{FinalHandler} = $final
+    if defined($final);
+
+  return $expatnb;
+}
+
+sub parse {
+  my $self = shift;
+  my $arg  = shift;
+  my @expat_options = ();
+  my ($key, $val);
+  while (($key, $val) = each %{$self}) {
+    push(@expat_options, $key, $val)
+      unless exists $self->{Non_Expat_Options}->{$key};
+  }
+  
+  my $expat = new XML::Parser::Expat(@expat_options, @_);
+  my %handlers = %{$self->{Handlers}};
+  my $init = delete $handlers{Init};
+  my $final = delete $handlers{Final};
+  
+  $expat->setHandlers(%handlers);
+  
+  if ($self->{Base}) {
+    $expat->base($self->{Base});
+  }
+
+  &$init($expat)
+    if defined($init);
+  
+  my @result = ();
+  my $result;
+  eval {
+    $result = $expat->parse($arg);
+  };
+  my $err = $@;
+  if ($err) {
+    $expat->release;
+    die $err;
+  }
+  
+  if ($result and defined($final)) {
+    if (wantarray) {
+      @result = &$final($expat);
+    }
+    else {
+      $result = &$final($expat);
+    }
+  }
+  
+  $expat->release;
+
+  return unless defined wantarray;
+  return wantarray ? @result : $result;
+}
+
+sub parsestring {
+  my $self = shift;
+  $self->parse(@_);
+}
+
+sub parsefile {
+  my $self = shift;
+  my $file = shift;
+  local(*FILE);
+  open(FILE, $file) or  croak "Couldn't open $file:\n$!";
+  binmode(FILE);
+  my @ret;
+  my $ret;
+
+  $self->{Base} = $file;
+
+  if (wantarray) {
+    eval {
+      @ret = $self->parse(*FILE, @_);
+    };
+  }
+  else {
+    eval {
+      $ret = $self->parse(*FILE, @_);
+    };
+  }
+  my $err = $@;
+  close(FILE);
+  die $err if $err;
+  
+  return unless defined wantarray;
+  return wantarray ? @ret : $ret;
+}
+
+sub initial_ext_ent_handler {
+  # This just bootstraps in the real lwp_ext_ent_handler which
+  # also loads the URI and LWP modules.
+
+  unless ($LWP_load_failed) {
+    local($^W) = 0;
+
+    my $stat =
+      eval {
+        require('XML/Parser/LWPExternEnt.pl');
+      };
+      
+    if ($stat) {
+      $_[0]->setHandlers(ExternEnt    => \&lwp_ext_ent_handler,
+                         ExternEntFin => \&lwp_ext_ent_cleanup);
+                       
+      goto &lwp_ext_ent_handler;
+    }
+
+    # Failed to load lwp handler, act as if NoLWP
+
+    $LWP_load_failed = 1;
+
+    my $cmsg = "Couldn't load LWP based external entity handler\n";
+    $cmsg .= "Switching to file-based external entity handler\n";
+    $cmsg .= " (To avoid this message, use NoLWP option to XML::Parser)\n";
+    warn($cmsg);
+  }
+
+  $_[0]->setHandlers(ExternEnt    => \&file_ext_ent_handler,
+                     ExternEntFin => \&file_ext_ent_cleanup);
+  goto &file_ext_ent_handler;
+
+}
+
+sub file_ext_ent_handler {
+  my ($xp, $base, $path) = @_;
+
+  # Prepend base only for relative paths
+
+  if (defined($base)
+      and not ($path =~ m!^(?:[\\/]|\w+:)!))
+    {
+      my $newpath = $base;
+      $newpath =~ s![^\\/:]*$!$path!;
+      $path = $newpath;
+    }
+
+  if ($path =~ /^\s*[|>+]/
+      or $path =~ /\|\s*$/) {
+    $xp->{ErrorMessage}
+        .= "System ID ($path) contains Perl IO control characters";
+    return undef;
+  }
+
+  require IO::File;
+  my $fh = new IO::File($path);
+  unless (defined $fh) {
+    $xp->{ErrorMessage}
+      .= "Failed to open $path:\n$!";
+    return undef;
+  }
+
+  $xp->{_BaseStack} ||= [];
+  $xp->{_FhStack} ||= [];
+
+  push(@{$xp->{_BaseStack}}, $base);
+  push(@{$xp->{_FhStack}}, $fh);
+
+  $xp->base($path);
+  
+  return $fh;
+}
+
+sub file_ext_ent_cleanup {
+  my ($xp) = @_;
+
+  my $fh = pop(@{$xp->{_FhStack}});
+  $fh->close;
+
+  my $base = pop(@{$xp->{_BaseStack}});
+  $xp->base($base);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::Parser - A perl module for parsing XML documents
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  
+  $p1 = new XML::Parser(Style => 'Debug');
+  $p1->parsefile('REC-xml-19980210.xml');
+  $p1->parse('<foo id="me">Hello World</foo>');
+
+  # Alternative
+  $p2 = new XML::Parser(Handlers => {Start => \&handle_start,
+                                     End   => \&handle_end,
+                                     Char  => \&handle_char});
+  $p2->parse($socket);
+
+  # Another alternative
+  $p3 = new XML::Parser(ErrorContext => 2);
+
+  $p3->setHandlers(Char    => \&text,
+                   Default => \&other);
+
+  open(FOO, 'xmlgenerator |');
+  $p3->parse(*FOO, ProtocolEncoding => 'ISO-8859-1');
+  close(FOO);
+
+  $p3->parsefile('junk.xml', ErrorContext => 3);
+
+=begin man
+.ds PI PI
+
+=end man
+
+=head1 DESCRIPTION
+
+This module provides ways to parse XML documents. It is built on top of
+L<XML::Parser::Expat>, which is a lower level interface to James Clark's
+expat library. Each call to one of the parsing methods creates a new
+instance of XML::Parser::Expat which is then used to parse the document.
+Expat options may be provided when the XML::Parser object is created.
+These options are then passed on to the Expat object on each parse call.
+They can also be given as extra arguments to the parse methods, in which
+case they override options given at XML::Parser creation time.
+
+The behavior of the parser is controlled either by C<L</Style>> and/or
+C<L</Handlers>> options, or by L</setHandlers> method. These all provide
+mechanisms for XML::Parser to set the handlers needed by XML::Parser::Expat.
+If neither C<Style> nor C<Handlers> are specified, then parsing just
+checks the document for being well-formed.
+
+When underlying handlers get called, they receive as their first parameter
+the I<Expat> object, not the Parser object.
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+This is a class method, the constructor for XML::Parser. Options are passed
+as keyword value pairs. Recognized options are:
+
+=over 4
+
+=item * Style
+
+This option provides an easy way to create a given style of parser. The
+built in styles are: L<"Debug">, L<"Subs">, L<"Tree">, L<"Objects">,
+and L<"Stream">. These are all defined in separate packages under
+C<XML::Parser::Style::*>, and you can find further documentation for
+each style both below, and in those packages.
+
+Custom styles can be provided by giving a full package name containing
+at least one '::'. This package should then have subs defined for each
+handler it wishes to have installed. See L<"STYLES"> below
+for a discussion of each built in style.
+
+=item * Handlers
+
+When provided, this option should be an anonymous hash containing as
+keys the type of handler and as values a sub reference to handle that
+type of event. All the handlers get passed as their 1st parameter the
+instance of expat that is parsing the document. Further details on
+handlers can be found in L<"HANDLERS">. Any handler set here
+overrides the corresponding handler set with the Style option.
+
+=item * Pkg
+
+Some styles will refer to subs defined in this package. If not provided,
+it defaults to the package which called the constructor.
+
+=item * ErrorContext
+
+This is an Expat option. When this option is defined, errors are reported
+in context. The value should be the number of lines to show on either side
+of the line in which the error occurred.
+
+=item * ProtocolEncoding
+
+This is an Expat option. This sets the protocol encoding name. It defaults
+to none. The built-in encodings are: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and
+C<US-ASCII>. Other encodings may be used if they have encoding maps in one
+of the directories in the @Encoding_Path list. Check L<"ENCODINGS"> for
+more information on encoding maps. Setting the protocol encoding overrides
+any encoding in the XML declaration.
+
+=item * Namespaces
+
+This is an Expat option. If this is set to a true value, then namespace
+processing is done during the parse. See L<XML::Parser::Expat/"Namespaces">
+for further discussion of namespace processing.
+
+=item * NoExpand
+
+This is an Expat option. Normally, the parser will try to expand references
+to entities defined in the internal subset. If this option is set to a true
+value, and a default handler is also set, then the default handler will be
+called when an entity reference is seen in text. This has no effect if a
+default handler has not been registered, and it has no effect on the expansion
+of entity references inside attribute values.
+
+=item * Stream_Delimiter
+
+This is an Expat option. It takes a string value. When this string is found
+alone on a line while parsing from a stream, then the parse is ended as if it
+saw an end of file. The intended use is with a stream of xml documents in a
+MIME multipart format. The string should not contain a trailing newline.
+
+=item * ParseParamEnt
+
+This is an Expat option. Unless standalone is set to "yes" in the XML
+declaration, setting this to a true value allows the external DTD to be read,
+and parameter entities to be parsed and expanded.
+
+=item * NoLWP
+
+This option has no effect if the ExternEnt or ExternEntFin handlers are
+directly set. Otherwise, if true, it forces the use of a file based external
+entity handler.
+
+=item * Non-Expat-Options
+
+If provided, this should be an anonymous hash whose keys are options that
+shouldn't be passed to Expat. This should only be of concern to those
+subclassing XML::Parser.
+
+=back
+
+=item  setHandlers(TYPE, HANDLER [, TYPE, HANDLER [...]])
+
+This method registers handlers for various parser events. It overrides any
+previous handlers registered through the Style or Handler options or through
+earlier calls to setHandlers. By providing a false or undefined value as
+the handler, the existing handler can be unset.
+
+This method returns a list of type, handler pairs corresponding to the
+input. The handlers returned are the ones that were in effect prior to
+the call.
+
+See a description of the handler types in L<"HANDLERS">.
+
+=item parse(SOURCE [, OPT => OPT_VALUE [...]])
+
+The SOURCE parameter should either be a string containing the whole XML
+document, or it should be an open IO::Handle. Constructor options to
+XML::Parser::Expat given as keyword-value pairs may follow the SOURCE
+parameter. These override, for this call, any options or attributes passed
+through from the XML::Parser instance.
+
+A die call is thrown if a parse error occurs. Otherwise it will return 1
+or whatever is returned from the B<Final> handler, if one is installed.
+In other words, what parse may return depends on the style.
+
+=item parsestring
+
+This is just an alias for parse for backwards compatibility.
+
+=item parsefile(FILE [, OPT => OPT_VALUE [...]])
+
+Open FILE for reading, then call parse with the open handle. The file
+is closed no matter how parse returns. Returns what parse returns.
+
+=item parse_start([ OPT => OPT_VALUE [...]])
+
+Create and return a new instance of XML::Parser::ExpatNB. Constructor
+options may be provided. If an init handler has been provided, it is
+called before returning the ExpatNB object. Documents are parsed by
+making incremental calls to the parse_more method of this object, which
+takes a string. A single call to the parse_done method of this object,
+which takes no arguments, indicates that the document is finished.
+
+If there is a final handler installed, it is executed by the parse_done
+method before returning and the parse_done method returns whatever is
+returned by the final handler.
+
+=back
+
+=head1 HANDLERS
+
+Expat is an event based parser. As the parser recognizes parts of the
+document (say the start or end tag for an XML element), then any handlers
+registered for that type of an event are called with suitable parameters.
+All handlers receive an instance of XML::Parser::Expat as their first
+argument. See L<XML::Parser::Expat/"METHODS"> for a discussion of the
+methods that can be called on this object.
+
+=head2 Init                (Expat)
+
+This is called just before the parsing of the document starts.
+
+=head2 Final                (Expat)
+
+This is called just after parsing has finished, but only if no errors
+occurred during the parse. Parse returns what this returns.
+
+=head2 Start                (Expat, Element [, Attr, Val [,...]])
+
+This event is generated when an XML start tag is recognized. Element is the
+name of the XML element type that is opened with the start tag. The Attr &
+Val pairs are generated for each attribute in the start tag.
+
+=head2 End                (Expat, Element)
+
+This event is generated when an XML end tag is recognized. Note that
+an XML empty tag (<foo/>) generates both a start and an end event.
+
+=head2 Char                (Expat, String)
+
+This event is generated when non-markup is recognized. The non-markup
+sequence of characters is in String. A single non-markup sequence of
+characters may generate multiple calls to this handler. Whatever the
+encoding of the string in the original document, this is given to the
+handler in UTF-8.
+
+=head2 Proc                (Expat, Target, Data)
+
+This event is generated when a processing instruction is recognized.
+
+=head2 Comment                (Expat, Data)
+
+This event is generated when a comment is recognized.
+
+=head2 CdataStart        (Expat)
+
+This is called at the start of a CDATA section.
+
+=head2 CdataEnd                (Expat)
+
+This is called at the end of a CDATA section.
+
+=head2 Default                (Expat, String)
+
+This is called for any characters that don't have a registered handler.
+This includes both characters that are part of markup for which no
+events are generated (markup declarations) and characters that
+could generate events, but for which no handler has been registered.
+
+Whatever the encoding in the original document, the string is returned to
+the handler in UTF-8.
+
+=head2 Unparsed                (Expat, Entity, Base, Sysid, Pubid, Notation)
+
+This is called for a declaration of an unparsed entity. Entity is the name
+of the entity. Base is the base to be used for resolving a relative URI.
+Sysid is the system id. Pubid is the public id. Notation is the notation
+name. Base and Pubid may be undefined.
+
+=head2 Notation                (Expat, Notation, Base, Sysid, Pubid)
+
+This is called for a declaration of notation. Notation is the notation name.
+Base is the base to be used for resolving a relative URI. Sysid is the system
+id. Pubid is the public id. Base, Sysid, and Pubid may all be undefined.
+
+=head2 ExternEnt        (Expat, Base, Sysid, Pubid)
+
+This is called when an external entity is referenced. Base is the base to be
+used for resolving a relative URI. Sysid is the system id. Pubid is the public
+id. Base, and Pubid may be undefined.
+
+This handler should either return a string, which represents the contents of
+the external entity, or return an open filehandle that can be read to obtain
+the contents of the external entity, or return undef, which indicates the
+external entity couldn't be found and will generate a parse error.
+
+If an open filehandle is returned, it must be returned as either a glob
+(*FOO) or as a reference to a glob (e.g. an instance of IO::Handle).
+
+A default handler is installed for this event. The default handler is
+XML::Parser::lwp_ext_ent_handler unless the NoLWP option was provided with
+a true value, otherwise XML::Parser::file_ext_ent_handler is the default
+handler for external entities. Even without the NoLWP option, if the
+URI or LWP modules are missing, the file based handler ends up being used
+after giving a warning on the first external entity reference.
+
+The LWP external entity handler will use proxies defined in the environment
+(http_proxy, ftp_proxy, etc.).
+
+Please note that the LWP external entity handler reads the entire
+entity into a string and returns it, where as the file handler opens a
+filehandle.
+
+Also note that the file external entity handler will likely choke on
+absolute URIs or file names that don't fit the conventions of the local
+operating system.
+
+The expat base method can be used to set a basename for
+relative pathnames. If no basename is given, or if the basename is itself
+a relative name, then it is relative to the current working directory.
+
+=head2 ExternEntFin        (Expat)
+
+This is called after parsing an external entity. It's not called unless
+an ExternEnt handler is also set. There is a default handler installed
+that pairs with the default ExternEnt handler.
+
+If you're going to install your own ExternEnt handler, then you should
+set (or unset) this handler too.
+
+=head2 Entity                (Expat, Name, Val, Sysid, Pubid, Ndata, IsParam)
+
+This is called when an entity is declared. For internal entities, the Val
+parameter will contain the value and the remaining three parameters will be
+undefined. For external entities, the Val parameter will be undefined, the
+Sysid parameter will have the system id, the Pubid parameter will have the
+public id if it was provided (it will be undefined otherwise), the Ndata
+parameter will contain the notation for unparsed entities. If this is a
+parameter entity declaration, then the IsParam parameter is true.
+
+Note that this handler and the Unparsed handler above overlap. If both are
+set, then this handler will not be called for unparsed entities.
+
+=head2 Element                (Expat, Name, Model)
+
+The element handler is called when an element declaration is found. Name
+is the element name, and Model is the content model as an XML::Parser::Content
+object. See L<XML::Parser::Expat/"XML::Parser::ContentModel Methods">
+for methods available for this class.
+
+=head2 Attlist                (Expat, Elname, Attname, Type, Default, Fixed)
+
+This handler is called for each attribute in an ATTLIST declaration.
+So an ATTLIST declaration that has multiple attributes will generate multiple
+calls to this handler. The Elname parameter is the name of the element with
+which the attribute is being associated. The Attname parameter is the name
+of the attribute. Type is the attribute type, given as a string. Default is
+the default value, which will either be "#REQUIRED", "#IMPLIED" or a quoted
+string (i.e. the returned string will begin and end with a quote character).
+If Fixed is true, then this is a fixed attribute.
+
+=head2 Doctype                (Expat, Name, Sysid, Pubid, Internal)
+
+This handler is called for DOCTYPE declarations. Name is the document type
+name. Sysid is the system id of the document type, if it was provided,
+otherwise it's undefined. Pubid is the public id of the document type,
+which will be undefined if no public id was given. Internal is the internal
+subset, given as a string. If there was no internal subset, it will be
+undefined. Internal will contain all whitespace, comments, processing
+instructions, and declarations seen in the internal subset. The declarations
+will be there whether or not they have been processed by another handler
+(except for unparsed entities processed by the Unparsed handler). However,
+comments and processing instructions will not appear if they've been processed
+by their respective handlers.
+
+=head2 * DoctypeFin                (Parser)
+
+This handler is called after parsing of the DOCTYPE declaration has finished,
+including any internal or external DTD declarations.
+
+=head2 XMLDecl                (Expat, Version, Encoding, Standalone)
+
+This handler is called for xml declarations. Version is a string containg
+the version. Encoding is either undefined or contains an encoding string.
+Standalone will be either true, false, or undefined if the standalone attribute
+is yes, no, or not made respectively.
+
+=head1 STYLES
+
+=head2 Debug
+
+This just prints out the document in outline form. Nothing special is
+returned by parse.
+
+=head2 Subs
+
+Each time an element starts, a sub by that name in the package specified
+by the Pkg option is called with the same parameters that the Start
+handler gets called with.
+
+Each time an element ends, a sub with that name appended with an underscore
+("_"), is called with the same parameters that the End handler gets called
+with.
+
+Nothing special is returned by parse.
+
+=head2 Tree
+
+Parse will return a parse tree for the document. Each node in the tree
+takes the form of a tag, content pair. Text nodes are represented with
+a pseudo-tag of "0" and the string that is their content. For elements,
+the content is an array reference. The first item in the array is a
+(possibly empty) hash reference containing attributes. The remainder of
+the array is a sequence of tag-content pairs representing the content
+of the element.
+
+So for example the result of parsing:
+
+  <foo><head id="a">Hello <em>there</em></head><bar>Howdy<ref/></bar>do</foo>
+
+would be:
+
+             Tag   Content
+  ==================================================================
+  [foo, [{}, head, [{id => "a"}, 0, "Hello ",  em, [{}, 0, "there"]],
+              bar, [         {}, 0, "Howdy",  ref, [{}]],
+                0, "do"
+        ]
+  ]
+
+The root document "foo", has 3 children: a "head" element, a "bar"
+element and the text "do". After the empty attribute hash, these are
+represented in it's contents by 3 tag-content pairs.
+
+=head2 Objects
+
+This is similar to the Tree style, except that a hash object is created for
+each element. The corresponding object will be in the class whose name
+is created by appending "::" and the element name to the package set with
+the Pkg option. Non-markup text will be in the ::Characters class. The
+contents of the corresponding object will be in an anonymous array that
+is the value of the Kids property for that object.
+
+=head2 Stream
+
+This style also uses the Pkg package. If none of the subs that this
+style looks for is there, then the effect of parsing with this style is
+to print a canonical copy of the document without comments or declarations.
+All the subs receive as their 1st parameter the Expat instance for the
+document they're parsing.
+
+It looks for the following routines:
+
+=over 4
+
+=item * StartDocument
+
+Called at the start of the parse .
+
+=item * StartTag
+
+Called for every start tag with a second parameter of the element type. The $_
+variable will contain a copy of the tag and the %_ variable will contain
+attribute values supplied for that element.
+
+=item * EndTag
+
+Called for every end tag with a second parameter of the element type. The $_
+variable will contain a copy of the end tag.
+
+=item * Text
+
+Called just before start or end tags with accumulated non-markup text in
+the $_ variable.
+
+=item * PI
+
+Called for processing instructions. The $_ variable will contain a copy of
+the PI and the target and data are sent as 2nd and 3rd parameters
+respectively.
+
+=item * EndDocument
+
+Called at conclusion of the parse.
+
+=back
+
+=head1 ENCODINGS
+
+XML documents may be encoded in character sets other than Unicode as
+long as they may be mapped into the Unicode character set. Expat has
+further restrictions on encodings. Read the xmlparse.h header file in
+the expat distribution to see details on these restrictions.
+
+Expat has built-in encodings for: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and
+C<US-ASCII>. Encodings are set either through the XML declaration
+encoding attribute or through the ProtocolEncoding option to XML::Parser
+or XML::Parser::Expat.
+
+For encodings other than the built-ins, expat calls the function
+load_encoding in the Expat package with the encoding name. This function
+looks for a file in the path list @XML::Parser::Expat::Encoding_Path, that
+matches the lower-cased name with a '.enc' extension. The first one it
+finds, it loads.
+
+If you wish to build your own encoding maps, check out the XML::Encoding
+module from CPAN.
+
+=head1 AUTHORS
+
+Larry Wall <F<larry@wall.org>> wrote version 1.0.
+
+Clark Cooper <F<coopercc@netheaven.com>> picked up support, changed the API
+for this version (2.x), provided documentation,
+and added some standard package features.
+
+Matt Sergeant <F<matt@sergeant.org>> is now maintaining XML::Parser
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Encodings/Japanese_Encodings.msg
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Encodings/Japanese_Encodings.msg	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Encodings/Japanese_Encodings.msg	(revision 14489)
@@ -0,0 +1,117 @@
+Mapping files for Japanese encodings
+
+1998 12/25
+
+Fuji Xerox Information Systems
+MURATA Makoto
+
+1.  Overview
+
+This version of XML::Parser and XML::Encoding does not come with map files for
+the charset "Shift_JIS" and the charset "euc-jp".  Unfortunately, each of these 
+charsets has more than one mapping.  None of these mappings are
+considered as authoritative.
+
+Therefore, we have come to believe that it is dangerous to provide map files
+for these charsets.  Rather, we introduce several private charsets and map
+files for these private charsets.  If IANA, Unicode Consoritum, and JIS
+eventually reach a consensus, we will be able to provide map files for
+"Shift_JIS" and "euc-jp".
+
+2. Different mappings from existing charsets to Unicode
+
+1) Different mappings in JIS X0221 and Unicode
+
+The mapping between JIS X0208:1990 and Unicode 1.1 and the mapping
+between JIS X0212:1990 and Unicode 1.1 are published from Unicode
+consortium.  They are available at 
+ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/JIS0208.TXT and 
+ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/JIS0212.TXT, 
+respectively.)  These mapping files have a note as below:
+
+#   The kanji mappings are a normative part of ISO/IEC 10646.  The
+#       non-kanji mappings are provisional, pending definition of
+#       official mappings by Japanese standards bodies.
+
+Unfortunately, the non-kanji mappings in the Japanese standard for ISO 10646/1,
+namely JIS X 0221:1995, is different from the Unicode Consortium mapping since
+0x213D of JIS X 0208 is mapped to U+2014 (em dash) rather than U+2015
+(horizontal bar).  Furthermore, JIS X 0221 clearly says that the mapping is
+informational and non-normative.  As a result, some companies (e.g., Microsoft and
+Apple) have introduced slightly different mappings.  Therefore, neither the
+Unicode consortium mapping nor the JIS X 0221 mapping are considered as
+authoritative.
+
+2) Shift-JIS
+
+This charset is especially problematic, since its definition has been unclear
+since its inception.
+
+The current registration of the charset "Shift_JIS" is as below:
+
+>Name: Shift_JIS  (preferred MIME name)
+>MIBenum: 17
+>Source: A Microsoft code that extends csHalfWidthKatakana to include 
+>       kanji by adding a second byte when the value of the first 
+>       byte is in the ranges 81-9F or E0-EF.
+>Alias: MS_Kanji 
+>Alias: csShiftJIS
+
+First, this does not reference to the mapping "Shift-JIS to Unicode" 
+published by the Unicode consortium (available at
+ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/SHIFTJIS.TXT).
+
+Second, "kanji" in this registration can be interepreted in different ways.
+Does this "kanji" reference to JIS X0208:1978, JIS X0208:1983, or JIS
+X0208:1990(== JIS X0208:1997)?  These three standards are *incompatible* with
+each other.  Moreover, we can even argue that "kanji" refers to JIS X0212 or
+ideographic characters in other countries.
+
+Third, each company has extended Shift JIS. For example, Microsoft introduced
+OEM extensions (NEC extensionsand IBM extensions).
+
+Forth, Shift JIS uses JIS X0201, which is almost upper-compatible with US-ASCII
+but is not quite.  5C and 7E of JIS X 0201 are different from backslash and 
+tilde, respectively.  However, many programming languages (e.g., Java) 
+ignore this difference and assumes that 5C and 7E of Shift JIS are backslash 
+and tilde.
+
+
+3.  Proposed charsets and mappings
+
+As a tentative solution, we introduce two private charsets for EUC-JP and four
+priviate charsets for Shift JIS.
+
+1) EUC-JP
+
+We have two charsets, namely "x-eucjp-unicode" and "x-eucjp-jisx0221".  Their 
+difference is only one code point.  The mapping for the former is based 
+on the Unicode Consortium mapping, while the latter is based on the JIS X0221 
+mapping.
+
+2) Shift JIS
+
+We have four charsets, namely x-sjis-unicode, x-sjis-jisx0221, 
+x-sjis-jdk117, and x-sjis-cp932.
+
+The mapping for the charset x-sjis-unicode is the one published by the Unicode
+consortium.  The mapping for x-sjis-jisx0221 is almost equivalent to
+x-sjis-unicode, but 0x213D of JIS X 0208 is mapped to U+2014 (em dash) rather
+than U+2015.  The charset x-sjis-jdk117 is again almost equivalent to
+x-sjis-unicode, but 0x5C and 0x7E of JIS X0201 are mapped to backslash and
+tilde.
+
+The charset x-sjis-cp932 is used by Microsoft Windows, and its mapping is
+published from the Unicode Consortium (available at:
+ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.txt).  The
+coded character set for this charset includes NEC-extensions and
+IBM-extensions.  0x5C and 0x7E of JIS X0201 are mapped to backslash and tilde;
+0x213D is mapped to U+2015; and 0x2140, 0x2141, 0x2142, and 0x215E of JIS X
+0208 are mapped to compatibility characters.
+
+Makoto
+ 
+Fuji Xerox Information Systems
+ 
+Tel: +81-44-812-7230   Fax: +81-44-812-7231
+E-mail: murata@apsdc.ksp.fujixerox.co.jp
Index: /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Encodings/README
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Encodings/README	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Encodings/README	(revision 14489)
@@ -0,0 +1,51 @@
+This directory contains binary encoding maps for some selected encodings.
+If they are placed in a directoy listed in @XML::Parser::Expat::Encoding_Path,
+then they are automaticly loaded by the XML::Parser::Expat::load_encoding
+function as needed. Otherwise you may load what you need directly by
+explicity calling this function.
+
+These maps were generated by a perl script that comes with the module
+XML::Encoding, compile_encoding, from XML formatted encoding maps that
+are distributed with that module. These XML encoding maps were generated
+in turn with a different script, domap, from mapping information contained
+on the Unicode version 2.0 CD-ROM. This CD-ROM comes with the Unicode
+Standard reference manual and can be ordered from the Unicode Consortium
+at http://www.unicode.org. The identical information is available on the
+internet at ftp://ftp.unicode.org/Public/MAPPINGS.
+
+See the encoding.h header in the Expat sub-directory for a description of
+the structure of these files.
+
+Clark Cooper
+December 12, 1998
+
+================================================================
+
+Contributed maps
+
+This distribution contains four contributed encodings from MURATA Makoto
+<murata@apsdc.ksp.fujixerox.co.jp> that are variations on the encoding
+commonly called Shift_JIS:
+
+x-sjis-cp932.enc
+x-sjis-jdk117.enc
+x-sjis-jisx0221.enc
+x-sjis-unicode.enc	(This is the same encoding as the shift_jis.enc that
+			 was distributed with this module in version 2.17)
+
+Please read his message (Japanese_Encodings.msg) about why these are here
+and why I've removed the shift_jis.enc encoding.
+
+We also have two contributed encodings that are variations of the EUC-JP
+encoding from Yoshida Masato <yoshidam@inse.co.jp>:
+
+x-euc-jp-jisx0221.enc
+x-euc-jp-unicode.enc
+
+The comments that MURATA Makoto made in his message apply to these
+encodings too.
+
+KangChan Lee <dolphin@comeng.chungnam.ac.kr> supplied the euc-kr encoding.
+
+Clark Cooper
+December 26, 1998
Index: /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Expat.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Expat.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Expat.pm	(revision 14489)
@@ -0,0 +1,1230 @@
+package XML::Parser::Expat;
+
+require 5.004;
+
+use strict;
+use vars qw($VERSION @ISA %Handler_Setters %Encoding_Table @Encoding_Path
+            $have_File_Spec);
+use Carp;
+
+require DynaLoader;
+
+@ISA = qw(DynaLoader);
+$VERSION = "2.34" ;
+
+$have_File_Spec = $INC{'File/Spec.pm'} || do 'File/Spec.pm';
+
+%Encoding_Table = ();
+if ($have_File_Spec) {
+  @Encoding_Path = (grep(-d $_,
+                         map(File::Spec->catdir($_, qw(XML Parser Encodings)),
+                             @INC)),
+                    File::Spec->curdir);
+}
+else {
+  @Encoding_Path = (grep(-d $_, map($_ . '/XML/Parser/Encodings', @INC)), '.');
+}
+  
+
+bootstrap XML::Parser::Expat $VERSION;
+
+%Handler_Setters = (
+                    Start => \&SetStartElementHandler,
+                    End   => \&SetEndElementHandler,
+                    Char  => \&SetCharacterDataHandler,
+                    Proc  => \&SetProcessingInstructionHandler,
+                    Comment => \&SetCommentHandler,
+                    CdataStart => \&SetStartCdataHandler,
+                    CdataEnd   => \&SetEndCdataHandler,
+                    Default => \&SetDefaultHandler,
+                    Unparsed => \&SetUnparsedEntityDeclHandler,
+                    Notation => \&SetNotationDeclHandler,
+                    ExternEnt => \&SetExternalEntityRefHandler,
+                    ExternEntFin => \&SetExtEntFinishHandler,
+                    Entity => \&SetEntityDeclHandler,
+                    Element => \&SetElementDeclHandler,
+                    Attlist => \&SetAttListDeclHandler,
+                    Doctype => \&SetDoctypeHandler,
+                    DoctypeFin => \&SetEndDoctypeHandler,
+                    XMLDecl => \&SetXMLDeclHandler
+                    );
+
+sub new {
+  my ($class, %args) = @_;
+  my $self = bless \%args, $_[0];
+  $args{_State_} = 0;
+  $args{Context} = [];
+  $args{Namespaces} ||= 0;
+  $args{ErrorMessage} ||= '';
+  if ($args{Namespaces}) {
+    $args{Namespace_Table} = {};
+    $args{Namespace_List} = [undef];
+    $args{Prefix_Table} = {};
+    $args{New_Prefixes} = [];
+  }
+  $args{_Setters} = \%Handler_Setters;
+  $args{Parser} = ParserCreate($self, $args{ProtocolEncoding},
+                               $args{Namespaces});
+  $self;
+}
+
+sub load_encoding {
+  my ($file) = @_;
+
+  $file =~ s!([^/]+)$!\L$1\E!;
+  $file .= '.enc' unless $file =~ /\.enc$/;
+  unless ($file =~ m!^/!) {
+    foreach (@Encoding_Path) {
+      my $tmp = ($have_File_Spec
+                 ? File::Spec->catfile($_, $file)
+                 : "$_/$file");
+      if (-e $tmp) {
+        $file = $tmp;
+        last;
+      }
+    }
+  }
+
+  local(*ENC);
+  open(ENC, $file) or croak("Couldn't open encmap $file:\n$!\n");
+  binmode(ENC);
+  my $data;
+  my $br = sysread(ENC, $data, -s $file);
+  croak("Trouble reading $file:\n$!\n")
+    unless defined($br);
+  close(ENC);
+
+  my $name = LoadEncoding($data, $br);
+  croak("$file isn't an encmap file")
+    unless defined($name);
+
+  $name;
+}  # End load_encoding
+
+sub setHandlers {
+  my ($self, @handler_pairs) = @_;
+
+  croak("Uneven number of arguments to setHandlers method")
+    if (int(@handler_pairs) & 1);
+
+  my @ret;
+
+  while (@handler_pairs) {
+    my $type = shift @handler_pairs;
+    my $handler = shift @handler_pairs;
+    croak "Handler for $type not a Code ref"
+      unless (! defined($handler) or ! $handler or ref($handler) eq 'CODE');
+
+    my $hndl = $self->{_Setters}->{$type};
+
+    unless (defined($hndl)) {
+      my @types = sort keys %{$self->{_Setters}};
+      croak("Unknown Expat handler type: $type\n Valid types: @types");
+    }
+
+    my $old = &$hndl($self->{Parser}, $handler);
+    push (@ret, $type, $old);
+  }
+
+  return @ret;
+}
+
+sub xpcroak
+ {
+  my ($self, $message) = @_;
+
+  my $eclines = $self->{ErrorContext};
+  my $line = GetCurrentLineNumber($_[0]->{Parser});
+  $message .= " at line $line";
+  $message .= ":\n" . $self->position_in_context($eclines)
+    if defined($eclines);
+  croak $message;
+}
+
+sub xpcarp {
+  my ($self, $message) = @_;
+
+  my $eclines = $self->{ErrorContext};
+  my $line = GetCurrentLineNumber($_[0]->{Parser});
+  $message .= " at line $line";
+  $message .= ":\n" . $self->position_in_context($eclines)
+    if defined($eclines);
+  carp $message;
+}
+
+sub default_current {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return DefaultCurrent($self->{Parser});
+  }
+}
+
+sub recognized_string {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return RecognizedString($self->{Parser});
+  }
+}
+
+sub original_string {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return OriginalString($self->{Parser});
+  }
+}
+
+sub current_line {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return GetCurrentLineNumber($self->{Parser});
+  }
+}
+
+sub current_column {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return GetCurrentColumnNumber($self->{Parser});
+  }
+}
+
+sub current_byte {
+  my $self = shift;
+  if ($self->{_State_} == 1) {
+    return GetCurrentByteIndex($self->{Parser});
+  }
+}
+
+sub base {
+  my ($self, $newbase) = @_;
+  my $p = $self->{Parser};
+  my $oldbase = GetBase($p);
+  SetBase($p, $newbase) if @_ > 1;
+  return $oldbase;
+}
+
+sub context {
+  my $ctx = $_[0]->{Context};
+  @$ctx;
+}
+
+sub current_element {
+  my ($self) = @_;
+  @{$self->{Context}} ? $self->{Context}->[-1] : undef;
+}
+
+sub in_element {
+  my ($self, $element) = @_;
+  @{$self->{Context}} ? $self->eq_name($self->{Context}->[-1], $element)
+    : undef;
+}
+
+sub within_element {
+  my ($self, $element) = @_;
+  my $cnt = 0;
+  foreach (@{$self->{Context}}) {
+    $cnt++ if $self->eq_name($_, $element);
+  }
+  return $cnt;
+}
+
+sub depth {
+  my ($self) = @_;
+  int(@{$self->{Context}});
+}
+
+sub element_index {
+  my ($self) = @_;
+
+  if ($self->{_State_} == 1) {
+    return ElementIndex($self->{Parser});
+  }
+}
+
+################
+# Namespace methods
+
+sub namespace {
+  my ($self, $name) = @_;
+  local($^W) = 0;
+  $self->{Namespace_List}->[int($name)];
+}
+
+sub eq_name {
+  my ($self, $nm1, $nm2) = @_;
+  local($^W) = 0;
+
+  int($nm1) == int($nm2) and $nm1 eq $nm2;
+}
+
+sub generate_ns_name {
+  my ($self, $name, $namespace) = @_;
+
+  $namespace ?
+    GenerateNSName($name, $namespace, $self->{Namespace_Table},
+                   $self->{Namespace_List})
+      : $name;
+}
+
+sub new_ns_prefixes {
+  my ($self) = @_;
+  if ($self->{Namespaces}) {
+    return @{$self->{New_Prefixes}};
+  }
+  return ();
+}
+
+sub expand_ns_prefix {
+  my ($self, $prefix) = @_;
+
+  if ($self->{Namespaces}) {
+    my $stack = $self->{Prefix_Table}->{$prefix};
+    return (defined($stack) and @$stack) ? $stack->[-1] : undef;
+  }
+
+  return undef;
+}
+
+sub current_ns_prefixes {
+  my ($self) = @_;
+
+  if ($self->{Namespaces}) {
+    my %set = %{$self->{Prefix_Table}};
+
+    if (exists $set{'#default'} and not defined($set{'#default'}->[-1])) {
+      delete $set{'#default'};
+    }
+
+    return keys %set;
+  }
+
+  return ();
+}
+
+
+################################################################
+# Namespace declaration handlers
+#
+
+sub NamespaceStart {
+  my ($self, $prefix, $uri) = @_;
+
+  $prefix = '#default' unless defined $prefix;
+  my $stack = $self->{Prefix_Table}->{$prefix}; 
+
+  if (defined $stack) {
+    push(@$stack, $uri);
+  }
+  else {
+    $self->{Prefix_Table}->{$prefix} = [$uri];
+  }
+
+  # The New_Prefixes list gets emptied at end of startElement function
+  # in Expat.xs
+
+  push(@{$self->{New_Prefixes}}, $prefix);
+}
+
+sub NamespaceEnd {
+  my ($self, $prefix) = @_;
+
+  $prefix = '#default' unless defined $prefix;
+
+  my $stack = $self->{Prefix_Table}->{$prefix};
+  if (@$stack > 1) {
+    pop(@$stack);
+  }
+  else {
+    delete $self->{Prefix_Table}->{$prefix};
+  }
+}
+
+################
+
+sub specified_attr {
+  my $self = shift;
+  
+  if ($self->{_State_} == 1) {
+    return GetSpecifiedAttributeCount($self->{Parser});
+  }
+}
+
+sub finish {
+  my ($self) = @_;
+  if ($self->{_State_} == 1) {
+    my $parser = $self->{Parser};
+    UnsetAllHandlers($parser);
+  }
+}
+
+sub position_in_context {
+  my ($self, $lines) = @_;
+  if ($self->{_State_} == 1) {
+    my $parser = $self->{Parser};
+    my ($string, $linepos) = PositionContext($parser, $lines);
+
+    return '' unless defined($string);
+
+    my $col = GetCurrentColumnNumber($parser);
+    my $ptr = ('=' x ($col - 1)) . '^' . "\n";
+    my $ret;
+    my $dosplit = $linepos < length($string);
+  
+    $string .= "\n" unless $string =~ /\n$/;
+  
+    if ($dosplit) {
+      $ret = substr($string, 0, $linepos) . $ptr
+        . substr($string, $linepos);
+    } else {
+      $ret = $string . $ptr;
+    }
+  
+    return $ret;
+  }
+}
+
+sub xml_escape {
+  my $self = shift;
+  my $text = shift;
+
+  study $text;
+  $text =~ s/\&/\&amp;/g;
+  $text =~ s/</\&lt;/g;
+  foreach (@_) {
+    croak "xml_escape: '$_' isn't a single character" if length($_) > 1;
+
+    if ($_ eq '>') {
+      $text =~ s/>/\&gt;/g;
+    }
+    elsif ($_ eq '"') {
+      $text =~ s/\"/\&quot;/;
+    }
+    elsif ($_ eq "'") {
+      $text =~ s/\'/\&apos;/;
+    }
+    else {
+      my $rep = '&#' . sprintf('x%X', ord($_)) . ';';
+      if (/\W/) {
+        my $ptrn = "\\$_";
+        $text =~ s/$ptrn/$rep/g;
+      }
+      else {
+        $text =~ s/$_/$rep/g;
+      }
+    }
+  }
+  $text;
+}
+
+sub skip_until {
+  my $self = shift;
+  if ($self->{_State_} <= 1) {
+    SkipUntil($self->{Parser}, $_[0]);
+  }
+}
+
+sub release {
+  my $self = shift;
+  ParserRelease($self->{Parser});
+}
+
+sub DESTROY {
+  my $self = shift;
+  ParserFree($self->{Parser});
+}
+
+sub parse {
+  my $self = shift;
+  my $arg = shift;
+  croak "Parse already in progress (Expat)" if $self->{_State_};
+  $self->{_State_} = 1;
+  my $parser = $self->{Parser};
+  my $ioref;
+  my $result = 0;
+  
+  if (defined $arg) {
+    if (ref($arg) and UNIVERSAL::isa($arg, 'IO::Handle')) {
+      $ioref = $arg;
+    } elsif (tied($arg)) {
+      my $class = ref($arg);
+      no strict 'refs';
+      $ioref = $arg if defined &{"${class}::TIEHANDLE"};
+    }
+    else {
+      require IO::Handle;
+      eval {
+        no strict 'refs';
+        $ioref = *{$arg}{IO} if defined *{$arg};
+      };
+      undef $@;
+    }
+  }
+  
+  if (defined($ioref)) {
+    my $delim = $self->{Stream_Delimiter};
+    my $prev_rs;
+    
+    $prev_rs = ref($ioref)->input_record_separator("\n$delim\n")
+      if defined($delim);
+    
+    $result = ParseStream($parser, $ioref, $delim);
+    
+    ref($ioref)->input_record_separator($prev_rs)
+      if defined($delim);
+  } else {
+    $result = ParseString($parser, $arg);
+  }
+  
+  $self->{_State_} = 2;
+  $result or croak $self->{ErrorMessage};
+}
+
+sub parsestring {
+  my $self = shift;
+  $self->parse(@_);
+}
+
+sub parsefile {
+  my $self = shift;
+  croak "Parser has already been used" if $self->{_State_};
+  local(*FILE);
+  open(FILE, $_[0]) or  croak "Couldn't open $_[0]:\n$!";
+  binmode(FILE);
+  my $ret = $self->parse(*FILE);
+  close(FILE);
+  $ret;
+}
+
+################################################################
+package XML::Parser::ContentModel;
+use overload '""' => \&asString, 'eq' => \&thiseq;
+
+sub EMPTY  () {1}
+sub ANY    () {2}
+sub MIXED  () {3}
+sub NAME   () {4}
+sub CHOICE () {5}
+sub SEQ    () {6}
+
+
+sub isempty {
+  return $_[0]->{Type} == EMPTY;
+}
+
+sub isany {
+  return $_[0]->{Type} == ANY;
+}
+
+sub ismixed {
+  return $_[0]->{Type} == MIXED;
+}
+
+sub isname {
+  return $_[0]->{Type} == NAME;
+}
+
+sub name {
+  return $_[0]->{Tag};
+}
+
+sub ischoice {
+  return $_[0]->{Type} == CHOICE;
+}
+
+sub isseq {
+  return $_[0]->{Type} == SEQ;
+}
+
+sub quant {
+  return $_[0]->{Quant};
+}
+
+sub children {
+  my $children = $_[0]->{Children};
+  if (defined $children) {
+    return @$children;
+  }
+  return undef;
+}
+
+sub asString {
+  my ($self) = @_;
+  my $ret;
+
+  if ($self->{Type} == NAME) {
+    $ret = $self->{Tag};
+  }
+  elsif ($self->{Type} == EMPTY) {
+    return "EMPTY";
+  }
+  elsif ($self->{Type} == ANY) {
+    return "ANY";
+  }
+  elsif ($self->{Type} == MIXED) {
+    $ret = '(#PCDATA';
+    foreach (@{$self->{Children}}) {
+      $ret .= '|' . $_;
+    }
+    $ret .= ')';
+  }
+  else {
+    my $sep = $self->{Type} == CHOICE ? '|' : ',';
+    $ret = '(' . join($sep, map { $_->asString } @{$self->{Children}}) . ')';
+  }
+
+  $ret .= $self->{Quant} if $self->{Quant};
+  return $ret;
+}
+
+sub thiseq {
+  my $self = shift;
+
+  return $self->asString eq $_[0];
+}
+
+################################################################
+package XML::Parser::ExpatNB;
+
+use vars qw(@ISA);
+use Carp;
+
+@ISA = qw(XML::Parser::Expat);
+
+sub parse {
+  my $self = shift;
+  my $class = ref($self);
+  croak "parse method not supported in $class";
+}
+
+sub parsestring {
+  my $self = shift;
+  my $class = ref($self);
+  croak "parsestring method not supported in $class";
+}
+
+sub parsefile {
+  my $self = shift;
+  my $class = ref($self);
+  croak "parsefile method not supported in $class";
+}
+
+sub parse_more {
+  my ($self, $data) = @_;
+
+  $self->{_State_} = 1;
+  my $ret = XML::Parser::Expat::ParsePartial($self->{Parser}, $data);
+
+  croak $self->{ErrorMessage} unless $ret;
+}
+
+sub parse_done {
+  my $self = shift;
+
+  my $ret = XML::Parser::Expat::ParseDone($self->{Parser});
+  unless ($ret) {
+    my $msg = $self->{ErrorMessage};
+    $self->release;
+    croak $msg;
+  }
+
+  $self->{_State_} = 2;
+
+  my $result = $ret;
+  my @result = ();
+  my $final = $self->{FinalHandler};
+  if (defined $final) {
+    if (wantarray) {
+      @result = &$final($self);
+    }
+    else {
+      $result = &$final($self);
+    }
+  }
+
+  $self->release;
+
+  return unless defined wantarray;
+  return wantarray ? @result : $result;
+}
+
+################################################################
+
+package XML::Parser::Encinfo;
+
+sub DESTROY {
+  my $self = shift;
+  XML::Parser::Expat::FreeEncoding($self);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::Parser::Expat - Lowlevel access to James Clark's expat XML parser
+
+=head1 SYNOPSIS
+
+ use XML::Parser::Expat;
+
+ $parser = new XML::Parser::Expat;
+ $parser->setHandlers('Start' => \&sh,
+                      'End'   => \&eh,
+                      'Char'  => \&ch);
+ open(FOO, 'info.xml') or die "Couldn't open";
+ $parser->parse(*FOO);
+ close(FOO);
+ # $parser->parse('<foo id="me"> here <em>we</em> go </foo>');
+
+ sub sh
+ {
+   my ($p, $el, %atts) = @_;
+   $p->setHandlers('Char' => \&spec)
+     if ($el eq 'special');
+   ...
+ }
+
+ sub eh
+ {
+   my ($p, $el) = @_;
+   $p->setHandlers('Char' => \&ch)  # Special elements won't contain
+     if ($el eq 'special');         # other special elements
+   ...
+ } 
+
+=head1 DESCRIPTION
+
+This module provides an interface to James Clark's XML parser, expat. As in
+expat, a single instance of the parser can only parse one document. Calls
+to parsestring after the first for a given instance will die.
+
+Expat (and XML::Parser::Expat) are event based. As the parser recognizes
+parts of the document (say the start or end of an XML element), then any
+handlers registered for that type of an event are called with suitable
+parameters.
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+This is a class method, the constructor for XML::Parser::Expat. Options are
+passed as keyword value pairs. The recognized options are:
+
+=over 4
+
+=item * ProtocolEncoding
+
+The protocol encoding name. The default is none. The expat built-in
+encodings are: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and C<US-ASCII>.
+Other encodings may be used if they have encoding maps in one of the
+directories in the @Encoding_Path list. Setting the protocol encoding
+overrides any encoding in the XML declaration.
+
+=item * Namespaces
+
+When this option is given with a true value, then the parser does namespace
+processing. By default, namespace processing is turned off. When it is
+turned on, the parser consumes I<xmlns> attributes and strips off prefixes
+from element and attributes names where those prefixes have a defined
+namespace. A name's namespace can be found using the L<"namespace"> method
+and two names can be checked for absolute equality with the L<"eq_name">
+method.
+
+=item * NoExpand
+
+Normally, the parser will try to expand references to entities defined in
+the internal subset. If this option is set to a true value, and a default
+handler is also set, then the default handler will be called when an
+entity reference is seen in text. This has no effect if a default handler
+has not been registered, and it has no effect on the expansion of entity
+references inside attribute values.
+
+=item * Stream_Delimiter
+
+This option takes a string value. When this string is found alone on a line
+while parsing from a stream, then the parse is ended as if it saw an end of
+file. The intended use is with a stream of xml documents in a MIME multipart
+format. The string should not contain a trailing newline.
+
+=item * ErrorContext
+
+When this option is defined, errors are reported in context. The value
+of ErrorContext should be the number of lines to show on either side of
+the line in which the error occurred.
+
+=item * ParseParamEnt
+
+Unless standalone is set to "yes" in the XML declaration, setting this to
+a true value allows the external DTD to be read, and parameter entities
+to be parsed and expanded.
+
+=item * Base
+
+The base to use for relative pathnames or URLs. This can also be done by
+using the base method.
+
+=back
+
+=item setHandlers(TYPE, HANDLER [, TYPE, HANDLER [...]])
+
+This method registers handlers for the various events. If no handlers are
+registered, then a call to parsestring or parsefile will only determine if
+the corresponding XML document is well formed (by returning without error.)
+This may be called from within a handler, after the parse has started.
+
+Setting a handler to something that evaluates to false unsets that
+handler.
+
+This method returns a list of type, handler pairs corresponding to the
+input. The handlers returned are the ones that were in effect before the
+call to setHandlers.
+
+The recognized events and the parameters passed to the corresponding
+handlers are:
+
+=over 4
+
+=item * Start             (Parser, Element [, Attr, Val [,...]])
+
+This event is generated when an XML start tag is recognized. Parser is
+an XML::Parser::Expat instance. Element is the name of the XML element that
+is opened with the start tag. The Attr & Val pairs are generated for each
+attribute in the start tag.
+
+=item * End               (Parser, Element)
+
+This event is generated when an XML end tag is recognized. Note that
+an XML empty tag (<foo/>) generates both a start and an end event.
+
+There is always a lower level start and end handler installed that wrap
+the corresponding callbacks. This is to handle the context mechanism.
+A consequence of this is that the default handler (see below) will not
+see a start tag or end tag unless the default_current method is called.
+
+=item * Char              (Parser, String)
+
+This event is generated when non-markup is recognized. The non-markup
+sequence of characters is in String. A single non-markup sequence of
+characters may generate multiple calls to this handler. Whatever the
+encoding of the string in the original document, this is given to the
+handler in UTF-8.
+
+=item * Proc              (Parser, Target, Data)
+
+This event is generated when a processing instruction is recognized.
+
+=item * Comment           (Parser, String)
+
+This event is generated when a comment is recognized.
+
+=item * CdataStart        (Parser)
+
+This is called at the start of a CDATA section.
+
+=item * CdataEnd          (Parser)
+
+This is called at the end of a CDATA section.
+
+=item * Default           (Parser, String)
+
+This is called for any characters that don't have a registered handler.
+This includes both characters that are part of markup for which no
+events are generated (markup declarations) and characters that
+could generate events, but for which no handler has been registered.
+
+Whatever the encoding in the original document, the string is returned to
+the handler in UTF-8.
+
+=item * Unparsed          (Parser, Entity, Base, Sysid, Pubid, Notation)
+
+This is called for a declaration of an unparsed entity. Entity is the name
+of the entity. Base is the base to be used for resolving a relative URI.
+Sysid is the system id. Pubid is the public id. Notation is the notation
+name. Base and Pubid may be undefined.
+
+=item * Notation          (Parser, Notation, Base, Sysid, Pubid)
+
+This is called for a declaration of notation. Notation is the notation name.
+Base is the base to be used for resolving a relative URI. Sysid is the system
+id. Pubid is the public id. Base, Sysid, and Pubid may all be undefined.
+
+=item * ExternEnt         (Parser, Base, Sysid, Pubid)
+
+This is called when an external entity is referenced. Base is the base to be
+used for resolving a relative URI. Sysid is the system id. Pubid is the public
+id. Base, and Pubid may be undefined.
+
+This handler should either return a string, which represents the contents of
+the external entity, or return an open filehandle that can be read to obtain
+the contents of the external entity, or return undef, which indicates the
+external entity couldn't be found and will generate a parse error.
+
+If an open filehandle is returned, it must be returned as either a glob
+(*FOO) or as a reference to a glob (e.g. an instance of IO::Handle).
+
+=item * ExternEntFin      (Parser)
+
+This is called after an external entity has been parsed. It allows
+applications to perform cleanup on actions performed in the above
+ExternEnt handler.
+
+=item * Entity            (Parser, Name, Val, Sysid, Pubid, Ndata, IsParam)
+
+This is called when an entity is declared. For internal entities, the Val
+parameter will contain the value and the remaining three parameters will
+be undefined. For external entities, the Val parameter
+will be undefined, the Sysid parameter will have the system id, the Pubid
+parameter will have the public id if it was provided (it will be undefined
+otherwise), the Ndata parameter will contain the notation for unparsed
+entities. If this is a parameter entity declaration, then the IsParam
+parameter is true.
+
+Note that this handler and the Unparsed handler above overlap. If both are
+set, then this handler will not be called for unparsed entities.
+
+=item * Element           (Parser, Name, Model)
+
+The element handler is called when an element declaration is found. Name is
+the element name, and Model is the content model as an
+XML::Parser::ContentModel object. See L<"XML::Parser::ContentModel Methods">
+for methods available for this class.
+
+=item * Attlist           (Parser, Elname, Attname, Type, Default, Fixed)
+
+This handler is called for each attribute in an ATTLIST declaration.
+So an ATTLIST declaration that has multiple attributes
+will generate multiple calls to this handler. The Elname parameter is the
+name of the element with which the attribute is being associated. The Attname
+parameter is the name of the attribute. Type is the attribute type, given as
+a string. Default is the default value, which will either be "#REQUIRED",
+"#IMPLIED" or a quoted string (i.e. the returned string will begin and end
+with a quote character). If Fixed is true, then this is a fixed attribute.
+
+=item * Doctype           (Parser, Name, Sysid, Pubid, Internal)
+
+This handler is called for DOCTYPE declarations. Name is the document type
+name. Sysid is the system id of the document type, if it was provided,
+otherwise it's undefined. Pubid is the public id of the document type,
+which will be undefined if no public id was given. Internal will be
+true or false, indicating whether or not the doctype declaration contains
+an internal subset.
+
+=item * DoctypeFin        (Parser)
+
+This handler is called after parsing of the DOCTYPE declaration has finished,
+including any internal or external DTD declarations.
+
+=item * XMLDecl           (Parser, Version, Encoding, Standalone)
+
+This handler is called for XML declarations. Version is a string containg
+the version. Encoding is either undefined or contains an encoding string.
+Standalone is either undefined, or true or false. Undefined indicates
+that no standalone parameter was given in the XML declaration. True or
+false indicates "yes" or "no" respectively.
+
+=back
+
+=item namespace(name)
+
+Return the URI of the namespace that the name belongs to. If the name doesn't
+belong to any namespace, an undef is returned. This is only valid on names
+received through the Start or End handlers from a single document, or through
+a call to the generate_ns_name method. In other words, don't use names
+generated from one instance of XML::Parser::Expat with other instances.
+
+=item eq_name(name1, name2)
+
+Return true if name1 and name2 are identical (i.e. same name and from
+the same namespace.) This is only meaningful if both names were obtained
+through the Start or End handlers from a single document, or through
+a call to the generate_ns_name method.
+
+=item generate_ns_name(name, namespace)
+
+Return a name, associated with a given namespace, good for using with the
+above 2 methods. The namespace argument should be the namespace URI, not
+a prefix.
+
+=item new_ns_prefixes
+
+When called from a start tag handler, returns namespace prefixes declared
+with this start tag. If called elsewere (or if there were no namespace
+prefixes declared), it returns an empty list. Setting of the default
+namespace is indicated with '#default' as a prefix.
+
+=item expand_ns_prefix(prefix)
+
+Return the uri to which the given prefix is currently bound. Returns
+undef if the prefix isn't currently bound. Use '#default' to find the
+current binding of the default namespace (if any).
+
+=item current_ns_prefixes
+
+Return a list of currently bound namespace prefixes. The order of the
+the prefixes in the list has no meaning. If the default namespace is
+currently bound, '#default' appears in the list.
+
+=item recognized_string
+
+Returns the string from the document that was recognized in order to call
+the current handler. For instance, when called from a start handler, it
+will give us the the start-tag string. The string is encoded in UTF-8.
+This method doesn't return a meaningful string inside declaration handlers.
+
+=item original_string
+
+Returns the verbatim string from the document that was recognized in
+order to call the current handler. The string is in the original document
+encoding. This method doesn't return a meaningful string inside declaration
+handlers.
+
+=item default_current
+
+When called from a handler, causes the sequence of characters that generated
+the corresponding event to be sent to the default handler (if one is
+registered). Use of this method is deprecated in favor the recognized_string
+method, which you can use without installing a default handler. This
+method doesn't deliver a meaningful string to the default handler when
+called from inside declaration handlers.
+
+=item xpcroak(message)
+
+Concatenate onto the given message the current line number within the
+XML document plus the message implied by ErrorContext. Then croak with
+the formed message.
+
+=item xpcarp(message)
+
+Concatenate onto the given message the current line number within the
+XML document plus the message implied by ErrorContext. Then carp with
+the formed message.
+
+=item current_line
+
+Returns the line number of the current position of the parse.
+
+=item current_column
+
+Returns the column number of the current position of the parse.
+
+=item current_byte
+
+Returns the current position of the parse.
+
+=item base([NEWBASE]);
+
+Returns the current value of the base for resolving relative URIs. If
+NEWBASE is supplied, changes the base to that value.
+
+=item context
+
+Returns a list of element names that represent open elements, with the
+last one being the innermost. Inside start and end tag handlers, this
+will be the tag of the parent element.
+
+=item current_element
+
+Returns the name of the innermost currently opened element. Inside
+start or end handlers, returns the parent of the element associated
+with those tags.
+
+=item in_element(NAME)
+
+Returns true if NAME is equal to the name of the innermost currently opened
+element. If namespace processing is being used and you want to check
+against a name that may be in a namespace, then use the generate_ns_name
+method to create the NAME argument.
+
+=item within_element(NAME)
+
+Returns the number of times the given name appears in the context list.
+If namespace processing is being used and you want to check
+against a name that may be in a namespace, then use the generate_ns_name
+method to create the NAME argument.
+
+=item depth
+
+Returns the size of the context list.
+
+=item element_index
+
+Returns an integer that is the depth-first visit order of the current
+element. This will be zero outside of the root element. For example,
+this will return 1 when called from the start handler for the root element
+start tag.
+
+=item skip_until(INDEX)
+
+INDEX is an integer that represents an element index. When this method
+is called, all handlers are suspended until the start tag for an element
+that has an index number equal to INDEX is seen. If a start handler has
+been set, then this is the first tag that the start handler will see
+after skip_until has been called.
+
+
+=item position_in_context(LINES)
+
+Returns a string that shows the current parse position. LINES should be
+an integer >= 0 that represents the number of lines on either side of the
+current parse line to place into the returned string.
+
+=item xml_escape(TEXT [, CHAR [, CHAR ...]])
+
+Returns TEXT with markup characters turned into character entities. Any
+additional characters provided as arguments are also turned into character
+references where found in TEXT.
+
+=item parse (SOURCE)
+
+The SOURCE parameter should either be a string containing the whole XML
+document, or it should be an open IO::Handle. Only a single document
+may be parsed for a given instance of XML::Parser::Expat, so this will croak
+if it's been called previously for this instance.
+
+=item parsestring(XML_DOC_STRING)
+
+Parses the given string as an XML document. Only a single document may be
+parsed for a given instance of XML::Parser::Expat, so this will die if either
+parsestring or parsefile has been called for this instance previously.
+
+This method is deprecated in favor of the parse method.
+
+=item parsefile(FILENAME)
+
+Parses the XML document in the given file. Will die if parsestring or
+parsefile has been called previously for this instance.
+
+=item is_defaulted(ATTNAME)
+
+NO LONGER WORKS. To find out if an attribute is defaulted please use
+the specified_attr method.
+
+=item specified_attr
+
+When the start handler receives lists of attributes and values, the
+non-defaulted (i.e. explicitly specified) attributes occur in the list
+first. This method returns the number of specified items in the list.
+So if this number is equal to the length of the list, there were no
+defaulted values. Otherwise the number points to the index of the
+first defaulted attribute name.
+
+=item finish
+
+Unsets all handlers (including internal ones that set context), but expat
+continues parsing to the end of the document or until it finds an error.
+It should finish up a lot faster than with the handlers set.
+
+=item release
+
+There are data structures used by XML::Parser::Expat that have circular
+references. This means that these structures will never be garbage
+collected unless these references are explicitly broken. Calling this
+method breaks those references (and makes the instance unusable.)
+
+Normally, higher level calls handle this for you, but if you are using
+XML::Parser::Expat directly, then it's your responsibility to call it.
+
+=back
+
+=head2 XML::Parser::ContentModel Methods
+
+The element declaration handlers are passed objects of this class as the
+content model of the element declaration. They also represent content
+particles, components of a content model.
+
+When referred to as a string, these objects are automagicly converted to a
+string representation of the model (or content particle).
+
+=over 4
+
+=item isempty
+
+This method returns true if the object is "EMPTY", false otherwise.
+
+=item isany
+
+This method returns true if the object is "ANY", false otherwise.
+
+=item ismixed
+
+This method returns true if the object is "(#PCDATA)" or "(#PCDATA|...)*",
+false otherwise.
+
+=item isname
+
+This method returns if the object is an element name.
+
+=item ischoice
+
+This method returns true if the object is a choice of content particles.
+
+
+=item isseq
+
+This method returns true if the object is a sequence of content particles.
+
+=item quant
+
+This method returns undef or a string representing the quantifier
+('?', '*', '+') associated with the model or particle.
+
+=item children
+
+This method returns undef or (for mixed, choice, and sequence types)
+an array of component content particles. There will always be at least
+one component for choices and sequences, but for a mixed content model
+of pure PCDATA, "(#PCDATA)", then an undef is returned.
+
+=back
+
+=head2 XML::Parser::ExpatNB Methods
+
+The class XML::Parser::ExpatNB is a subclass of XML::Parser::Expat used
+for non-blocking access to the expat library. It does not support the parse,
+parsestring, or parsefile methods, but it does have these additional methods:
+
+=over 4
+
+=item parse_more(DATA)
+
+Feed expat more text to munch on.
+
+=item parse_done
+
+Tell expat that it's gotten the whole document.
+
+=back
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item XML::Parser::Expat::load_encoding(ENCODING)
+
+Load an external encoding. ENCODING is either the name of an encoding or
+the name of a file. The basename is converted to lowercase and a '.enc'
+extension is appended unless there's one already there. Then, unless
+it's an absolute pathname (i.e. begins with '/'), the first file by that
+name discovered in the @Encoding_Path path list is used.
+
+The encoding in the file is loaded and kept in the %Encoding_Table
+table. Earlier encodings of the same name are replaced.
+
+This function is automaticly called by expat when it encounters an encoding
+it doesn't know about. Expat shouldn't call this twice for the same
+encoding name. The only reason users should use this function is to
+explicitly load an encoding not contained in the @Encoding_Path list.
+
+=back
+
+=head1 AUTHORS
+
+Larry Wall <F<larry@wall.org>> wrote version 1.0.
+
+Clark Cooper <F<coopercc@netheaven.com>> picked up support, changed the API
+for this version (2.x), provided documentation, and added some standard
+package features.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/LWPExternEnt.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/LWPExternEnt.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/LWPExternEnt.pl	(revision 14489)
@@ -0,0 +1,71 @@
+# LWPExternEnt.pl
+#
+# Copyright (c) 2000 Clark Cooper
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package XML::Parser;
+
+use URI;
+use URI::file;
+use LWP;
+
+##
+## Note that this external entity handler reads the entire entity into
+## memory, so it will choke on huge ones. It would be really nice if
+## LWP::UserAgent optionally returned us an IO::Handle.
+##
+
+sub lwp_ext_ent_handler {
+  my ($xp, $base, $sys) = @_;  # We don't use public id
+
+  my $uri;
+
+  if (defined $base) {
+    # Base may have been set by parsefile, which is agnostic about
+    # whether its a file or URI.
+    my $base_uri = new URI($base);
+    unless (defined $base_uri->scheme) {
+      $base_uri = URI->new_abs($base_uri, URI::file->cwd);
+    }
+
+    $uri = URI->new_abs($sys, $base_uri);
+  }
+  else {
+    $uri = new URI($sys);
+    unless (defined $uri->scheme) {
+      $uri = URI->new_abs($uri, URI::file->cwd);
+    }
+  }
+  
+  my $ua = $xp->{_lwpagent};
+  unless (defined $ua) {
+    $ua = $xp->{_lwpagent} = new LWP::UserAgent();
+    $ua->env_proxy();
+  }
+
+  my $req = new HTTP::Request('GET', $uri);
+
+  my $res = $ua->request($req);
+  if ($res->is_error) {
+    $xp->{ErrorMessage} .= "\n" . $res->status_line . " $uri";
+    return undef;
+  }
+  
+  $xp->{_BaseStack} ||= [];
+  push(@{$xp->{_BaseStack}}, $base);
+
+  $xp->base($uri);
+  
+  return $res->content;
+}  # End lwp_ext_ent_handler
+
+sub lwp_ext_ent_cleanup {
+  my ($xp) = @_;
+
+  $xp->base(pop(@{$xp->{_BaseStack}}));
+}  # End lwp_ext_ent_cleanup
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Debug.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Debug.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Debug.pm	(revision 14489)
@@ -0,0 +1,52 @@
+# $Id: Debug.pm,v 1.1 2003/07/27 16:07:49 matt Exp $
+
+package XML::Parser::Style::Debug;
+use strict;
+
+sub Start {
+  my $expat = shift;
+  my $tag = shift;
+  print STDERR "@{$expat->{Context}} \\\\ (@_)\n";
+}
+
+sub End {
+  my $expat = shift;
+  my $tag = shift;
+  print STDERR "@{$expat->{Context}} //\n";
+}
+
+sub Char {
+  my $expat = shift;
+  my $text = shift;
+  $text =~ s/([\x80-\xff])/sprintf "#x%X;", ord $1/eg;
+  $text =~ s/([\t\n])/sprintf "#%d;", ord $1/eg;
+  print STDERR "@{$expat->{Context}} || $text\n";
+}
+
+sub Proc {
+  my $expat = shift;
+  my $target = shift;
+  my $text = shift;
+  my @foo = @{$expat->{Context}};
+  print STDERR "@foo $target($text)\n";
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Debug - Debug style for XML::Parser
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Debug');
+  $p->parsefile('foo.xml');
+
+=head1 DESCRIPTION
+
+This just prints out the document in outline form to STDERR. Nothing special is
+returned by parse.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Objects.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Objects.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Objects.pm	(revision 14489)
@@ -0,0 +1,78 @@
+# $Id: Objects.pm,v 1.1 2003/08/18 20:20:51 matt Exp $
+
+package XML::Parser::Style::Objects;
+use strict;
+
+sub Init {
+  my $expat = shift;
+  $expat->{Lists} = [];
+  $expat->{Curlist} = $expat->{Tree} = [];
+}
+
+sub Start {
+  my $expat = shift;
+  my $tag = shift;
+  my $newlist = [ ];
+  my $class = "${$expat}{Pkg}::$tag";
+  my $newobj = bless { @_, Kids => $newlist }, $class;
+  push @{ $expat->{Lists} }, $expat->{Curlist};
+  push @{ $expat->{Curlist} }, $newobj;
+  $expat->{Curlist} = $newlist;
+}
+
+sub End {
+  my $expat = shift;
+  my $tag = shift;
+  $expat->{Curlist} = pop @{ $expat->{Lists} };
+}
+
+sub Char {
+  my $expat = shift;
+  my $text = shift;
+  my $class = "${$expat}{Pkg}::Characters";
+  my $clist = $expat->{Curlist};
+  my $pos = $#$clist;
+  
+  if ($pos >= 0 and ref($clist->[$pos]) eq $class) {
+    $clist->[$pos]->{Text} .= $text;
+  } else {
+    push @$clist, bless { Text => $text }, $class;
+  }
+}
+
+sub Final {
+  my $expat = shift;
+  delete $expat->{Curlist};
+  delete $expat->{Lists};
+  $expat->{Tree};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Objects
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Objects', Pkg => 'MyNode');
+  my $tree = $p->parsefile('foo.xml');
+
+=head1 DESCRIPTION
+
+This module implements XML::Parser's Objects style parser.
+
+This is similar to the Tree style, except that a hash object is created for
+each element. The corresponding object will be in the class whose name
+is created by appending "::" and the element name to the package set with
+the Pkg option. Non-markup text will be in the ::Characters class. The
+contents of the corresponding object will be in an anonymous array that
+is the value of the Kids property for that object.
+
+=head1 SEE ALSO
+
+L<XML::Parser::Style::Tree>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Stream.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Stream.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Stream.pm	(revision 14489)
@@ -0,0 +1,184 @@
+# $Id: Stream.pm,v 1.1 2003/07/27 16:07:49 matt Exp $
+
+package XML::Parser::Style::Stream;
+use strict;
+
+# This style invented by Tim Bray <tbray@textuality.com>
+
+sub Init {
+  no strict 'refs';
+  my $expat = shift;
+  $expat->{Text} = '';
+  my $sub = $expat->{Pkg} ."::StartDocument";
+  &$sub($expat)
+    if defined(&$sub);
+}
+
+sub Start {
+  no strict 'refs';
+  my $expat = shift;
+  my $type = shift;
+  
+  doText($expat);
+  $_ = "<$type";
+  
+  %_ = @_;
+  while (@_) {
+    $_ .= ' ' . shift() . '="' . shift() . '"';
+  }
+  $_ .= '>';
+  
+  my $sub = $expat->{Pkg} . "::StartTag";
+  if (defined(&$sub)) {
+    &$sub($expat, $type);
+  } else {
+    print;
+  }
+}
+
+sub End {
+  no strict 'refs';
+  my $expat = shift;
+  my $type = shift;
+  
+  # Set right context for Text handler
+  push(@{$expat->{Context}}, $type);
+  doText($expat);
+  pop(@{$expat->{Context}});
+  
+  $_ = "</$type>";
+  
+  my $sub = $expat->{Pkg} . "::EndTag";
+  if (defined(&$sub)) {
+    &$sub($expat, $type);
+  } else {
+    print;
+  }
+}
+
+sub Char {
+  my $expat = shift;
+  $expat->{Text} .= shift;
+}
+
+sub Proc {
+  no strict 'refs';
+  my $expat = shift;
+  my $target = shift;
+  my $text = shift;
+  
+  doText($expat);
+
+  $_ = "<?$target $text?>";
+  
+  my $sub = $expat->{Pkg} . "::PI";
+  if (defined(&$sub)) {
+    &$sub($expat, $target, $text);
+  } else {
+    print;
+  }
+}
+
+sub Final {
+  no strict 'refs';
+  my $expat = shift;
+  my $sub = $expat->{Pkg} . "::EndDocument";
+  &$sub($expat)
+    if defined(&$sub);
+}
+
+sub doText {
+  no strict 'refs';
+  my $expat = shift;
+  $_ = $expat->{Text};
+  
+  if (length($_)) {
+    my $sub = $expat->{Pkg} . "::Text";
+    if (defined(&$sub)) {
+      &$sub($expat);
+    } else {
+      print;
+    }
+    
+    $expat->{Text} = '';
+  }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Stream - Stream style for XML::Parser
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Stream', Pkg => 'MySubs');
+  $p->parsefile('foo.xml');
+  
+  {
+    package MySubs;
+    
+    sub StartTag {
+      my ($e, $name) = @_;
+      # do something with start tags
+    }
+    
+    sub EndTag {
+      my ($e, $name) = @_;
+      # do something with end tags
+    }
+    
+    sub Characters {
+      my ($e, $data) = @_;
+      # do something with text nodes
+    }
+  }
+
+=head1 DESCRIPTION
+
+This style uses the Pkg option to find subs in a given package to call for each event.
+If none of the subs that this
+style looks for is there, then the effect of parsing with this style is
+to print a canonical copy of the document without comments or declarations.
+All the subs receive as their 1st parameter the Expat instance for the
+document they're parsing.
+
+It looks for the following routines:
+
+=over 4
+
+=item * StartDocument
+
+Called at the start of the parse .
+
+=item * StartTag
+
+Called for every start tag with a second parameter of the element type. The $_
+variable will contain a copy of the tag and the %_ variable will contain
+attribute values supplied for that element.
+
+=item * EndTag
+
+Called for every end tag with a second parameter of the element type. The $_
+variable will contain a copy of the end tag.
+
+=item * Text
+
+Called just before start or end tags with accumulated non-markup text in
+the $_ variable.
+
+=item * PI
+
+Called for processing instructions. The $_ variable will contain a copy of
+the PI and the target and data are sent as 2nd and 3rd parameters
+respectively.
+
+=item * EndDocument
+
+Called at conclusion of the parse.
+
+=back
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Subs.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Subs.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Subs.pm	(revision 14489)
@@ -0,0 +1,58 @@
+# $Id: Subs.pm,v 1.1 2003/07/27 16:07:49 matt Exp $
+
+package XML::Parser::Style::Subs;
+
+sub Start {
+  no strict 'refs';
+  my $expat = shift;
+  my $tag = shift;
+  my $sub = $expat->{Pkg} . "::$tag";
+  eval { &$sub($expat, $tag, @_) };
+}
+
+sub End {
+  no strict 'refs';
+  my $expat = shift;
+  my $tag = shift;
+  my $sub = $expat->{Pkg} . "::${tag}_";
+  eval { &$sub($expat, $tag) };
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Subs
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Subs', Pkg => 'MySubs');
+  $p->parsefile('foo.xml');
+  
+  {
+    package MySubs;
+    
+    sub foo {
+      # start of foo tag
+    }
+    
+    sub foo_ {
+      # end of foo tag
+    }
+  }
+
+=head1 DESCRIPTION
+
+Each time an element starts, a sub by that name in the package specified
+by the Pkg option is called with the same parameters that the Start
+handler gets called with.
+
+Each time an element ends, a sub with that name appended with an underscore
+("_"), is called with the same parameters that the End handler gets called
+with.
+
+Nothing special is returned by parse.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Tree.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Tree.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XML/Parser/Style/Tree.pm	(revision 14489)
@@ -0,0 +1,90 @@
+# $Id: Tree.pm,v 1.2 2003/07/31 07:54:51 matt Exp $
+
+package XML::Parser::Style::Tree;
+$XML::Parser::Built_In_Styles{Tree} = 1;
+
+sub Init {
+  my $expat = shift;
+  $expat->{Lists} = [];
+  $expat->{Curlist} = $expat->{Tree} = [];
+}
+
+sub Start {
+  my $expat = shift;
+  my $tag = shift;
+  my $newlist = [ { @_ } ];
+  push @{ $expat->{Lists} }, $expat->{Curlist};
+  push @{ $expat->{Curlist} }, $tag => $newlist;
+  $expat->{Curlist} = $newlist;
+}
+
+sub End {
+  my $expat = shift;
+  my $tag = shift;
+  $expat->{Curlist} = pop @{ $expat->{Lists} };
+}
+
+sub Char {
+  my $expat = shift;
+  my $text = shift;
+  my $clist = $expat->{Curlist};
+  my $pos = $#$clist;
+  
+  if ($pos > 0 and $clist->[$pos - 1] eq '0') {
+    $clist->[$pos] .= $text;
+  } else {
+    push @$clist, 0 => $text;
+  }
+}
+
+sub Final {
+  my $expat = shift;
+  delete $expat->{Curlist};
+  delete $expat->{Lists};
+  $expat->{Tree};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::Parser::Style::Tree
+
+=head1 SYNOPSIS
+
+  use XML::Parser;
+  my $p = XML::Parser->new(Style => 'Tree');
+  my $tree = $p->parsefile('foo.xml');
+
+=head1 DESCRIPTION
+
+This module implements XML::Parser's Tree style parser.
+
+When parsing a document, C<parse()> will return a parse tree for the
+document. Each node in the tree
+takes the form of a tag, content pair. Text nodes are represented with
+a pseudo-tag of "0" and the string that is their content. For elements,
+the content is an array reference. The first item in the array is a
+(possibly empty) hash reference containing attributes. The remainder of
+the array is a sequence of tag-content pairs representing the content
+of the element.
+
+So for example the result of parsing:
+
+  <foo><head id="a">Hello <em>there</em></head><bar>Howdy<ref/></bar>do</foo>
+
+would be:
+             Tag   Content
+  ==================================================================
+  [foo, [{}, head, [{id => "a"}, 0, "Hello ",  em, [{}, 0, "there"]],
+              bar, [         {}, 0, "Howdy",  ref, [{}]],
+                0, "do"
+        ]
+  ]
+
+The root document "foo", has 3 children: a "head" element, a "bar"
+element and the text "do". After the empty attribute hash, these are
+represented in it's contents by 3 tag-content pairs.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/XS/APItest.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XS/APItest.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XS/APItest.pm	(revision 14489)
@@ -0,0 +1,195 @@
+package XS::APItest;
+
+use 5.008;
+use strict;
+use warnings;
+use Carp;
+
+use base qw/ DynaLoader Exporter /;
+
+# 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 everything since these functions are only used by a test script
+our @EXPORT = qw( print_double print_int print_long
+		  print_float print_long_double have_long_double print_flush
+		  mpushp mpushn mpushi mpushu
+		  mxpushp mxpushn mxpushi mxpushu
+		  call_sv call_pv call_method eval_sv eval_pv require_pv
+		  G_SCALAR G_ARRAY G_VOID G_DISCARD G_EVAL G_NOARGS
+		  G_KEEPERR G_NODEBUG G_METHOD
+		  mycroak strtab
+);
+
+# from cop.h 
+sub G_SCALAR()	{   0 }
+sub G_ARRAY()	{   1 }
+sub G_VOID()	{ 128 }
+sub G_DISCARD()	{   2 }
+sub G_EVAL()	{   4 }
+sub G_NOARGS()	{   8 }
+sub G_KEEPERR()	{  16 }
+sub G_NODEBUG()	{  32 }
+sub G_METHOD()	{  64 }
+
+our $VERSION = '0.08';
+
+bootstrap XS::APItest $VERSION;
+
+1;
+__END__
+
+=head1 NAME
+
+XS::APItest - Test the perl C API
+
+=head1 SYNOPSIS
+
+  use XS::APItest;
+  print_double(4);
+
+=head1 ABSTRACT
+
+This module tests the perl C API. Currently tests that C<printf>
+works correctly.
+
+=head1 DESCRIPTION
+
+This module can be used to check that the perl C API is behaving
+correctly. This module provides test functions and an associated
+test script that verifies the output.
+
+This module is not meant to be installed.
+
+=head2 EXPORT
+
+Exports all the test functions:
+
+=over 4
+
+=item B<print_double>
+
+Test that a double-precision floating point number is formatted
+correctly by C<printf>.
+
+  print_double( $val );
+
+Output is sent to STDOUT.
+
+=item B<print_long_double>
+
+Test that a C<long double> is formatted correctly by
+C<printf>. Takes no arguments - the test value is hard-wired
+into the function (as "7").
+
+  print_long_double();
+
+Output is sent to STDOUT.
+
+=item B<have_long_double>
+
+Determine whether a C<long double> is supported by Perl.  This should
+be used to determine whether to test C<print_long_double>.
+
+  print_long_double() if have_long_double;
+
+=item B<print_nv>
+
+Test that an C<NV> is formatted correctly by
+C<printf>.
+
+  print_nv( $val );
+
+Output is sent to STDOUT.
+
+=item B<print_iv>
+
+Test that an C<IV> is formatted correctly by
+C<printf>.
+
+  print_iv( $val );
+
+Output is sent to STDOUT.
+
+=item B<print_uv>
+
+Test that an C<UV> is formatted correctly by
+C<printf>.
+
+  print_uv( $val );
+
+Output is sent to STDOUT.
+
+=item B<print_int>
+
+Test that an C<int> is formatted correctly by
+C<printf>.
+
+  print_int( $val );
+
+Output is sent to STDOUT.
+
+=item B<print_long>
+
+Test that an C<long> is formatted correctly by
+C<printf>.
+
+  print_long( $val );
+
+Output is sent to STDOUT.
+
+=item B<print_float>
+
+Test that a single-precision floating point number is formatted
+correctly by C<printf>.
+
+  print_float( $val );
+
+Output is sent to STDOUT.
+
+=item B<call_sv>, B<call_pv>, B<call_method>
+
+These exercise the C calls of the same names. Everything after the flags
+arg is passed as the the args to the called function. They return whatever
+the C function itself pushed onto the stack, plus the return value from
+the function; for example
+
+    call_sv( sub { @_, 'c' }, G_ARRAY,  'a', 'b'); # returns 'a', 'b', 'c', 3
+    call_sv( sub { @_ },      G_SCALAR, 'a', 'b'); # returns 'b', 1
+
+=item B<eval_sv>
+
+Evaluates the passed SV. Result handling is done the same as for
+C<call_sv()> etc.
+
+=item B<eval_pv>
+
+Exercises the C function of the same name in scalar context. Returns the
+same SV that the C function returns.
+
+=item B<require_pv>
+
+Exercises the C function of the same name. Returns nothing.
+
+=back
+
+=head1 SEE ALSO
+
+L<XS::Typemap>, L<perlapi>.
+
+=head1 AUTHORS
+
+Tim Jenness, E<lt>t.jenness@jach.hawaii.eduE<gt>,
+Christian Soeller, E<lt>csoelle@mph.auckland.ac.nzE<gt>,
+Hugo van der Sanden E<lt>hv@crypt.compulink.co.ukE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2002,2004 Tim Jenness, Christian Soeller, Hugo van der Sanden.
+All Rights Reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself. 
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/XS/Typemap.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XS/Typemap.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XS/Typemap.pm	(revision 14489)
@@ -0,0 +1,95 @@
+package XS::Typemap;
+
+=head1 NAME
+
+XS::Typemap - module to test the XS typemaps distributed with perl
+
+=head1 SYNOPSIS
+
+  use XS::Typemap;
+
+  $output = T_IV( $input );
+  $output = T_PV( $input );
+  @output = T_ARRAY( @input );
+
+=head1 DESCRIPTION
+
+This module is used to test that the XS typemaps distributed
+with perl are working as advertised. A function is available
+for each typemap definition (eventually). In general each function
+takes a variable, processes it through the OUTPUT typemap and then
+returns it using the INPUT typemap.
+
+A test script can then compare the input and output to make sure they
+are the expected values. When only an input or output function is
+provided the function will be named after the typemap entry and have
+either '_IN' or '_OUT' appended.
+
+All the functions are exported. There is no reason not to do this since
+the entire purpose is for testing Perl. Namespace pollution will be limited
+to the test script.
+
+=cut
+
+use base qw/ DynaLoader Exporter /;
+
+
+use vars qw/ $VERSION @EXPORT /;
+
+$VERSION = '0.02';
+
+@EXPORT = (qw/
+	   T_SV
+	   T_SVREF
+	   T_AVREF
+	   T_HVREF
+	   T_CVREF
+	   T_SYSRET_fail T_SYSRET_pass
+	   T_UV
+	   T_IV
+	   T_INT
+           T_ENUM
+           T_BOOL
+           T_U_INT
+           T_SHORT
+           T_U_SHORT
+           T_LONG
+           T_U_LONG
+           T_CHAR
+           T_U_CHAR
+           T_FLOAT
+           T_NV
+	   T_DOUBLE
+	   T_PV
+	   T_PTR_IN T_PTR_OUT
+	   T_PTRREF_IN T_PTRREF_OUT
+	   T_REF_IV_REF
+	   T_REF_IV_PTR_IN T_REF_IV_PTR_OUT
+	   T_PTROBJ_IN T_PTROBJ_OUT
+	   T_OPAQUE_IN T_OPAQUE_OUT T_OPAQUE_array
+	   T_OPAQUEPTR_IN T_OPAQUEPTR_OUT T_OPAQUEPTR_OUT_short
+           T_OPAQUEPTR_IN_struct T_OPAQUEPTR_OUT_struct
+	   T_ARRAY
+	   T_STDIO_open T_STDIO_close T_STDIO_print
+	   /);
+
+
+bootstrap XS::Typemap;
+
+=head1 NOTES
+
+This module is for testing only and should not normally be installed.
+
+=head1 AUTHOR
+
+Tim Jenness E<lt>t.jenness@jach.hawaii.eduE<gt>
+
+Copyright (C) 2001 Tim Jenness All Rights Reserved.  This program is
+free software; you can redistribute it and/or modify it under the same
+terms as Perl itself.
+
+=cut
+
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/XSLoader.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/XSLoader.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/XSLoader.pm	(revision 14489)
@@ -0,0 +1,356 @@
+# Generated from XSLoader.pm.PL (resolved %Config::Config value)
+
+package XSLoader;
+
+$VERSION = "0.06";
+
+#use strict;
+
+# enable debug/trace messages from DynaLoader perl code
+# $dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug;
+
+  my $dl_dlext = 'dll';
+
+package DynaLoader;
+
+# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
+# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB
+boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
+                                !defined(&dl_error);
+package XSLoader;
+
+sub load {
+    package DynaLoader;
+
+    die q{XSLoader::load('Your::Module', $Your::Module::VERSION)} unless @_;
+
+    my($module) = $_[0];
+
+    # work with static linking too
+    my $b = "$module\::bootstrap";
+    goto &$b if defined &$b;
+
+    goto retry unless $module and defined &dl_load_file;
+
+    my @modparts = split(/::/,$module);
+    my $modfname = $modparts[-1];
+
+    my $modpname = join('/',@modparts);
+    my $modlibname = (caller())[1];
+    my $c = @modparts;
+    $modlibname =~ s,[\\/][^\\/]+$,, while $c--;	# Q&D basename
+    my $file = "$modlibname/auto/$modpname/$modfname.$dl_dlext";
+
+#   print STDERR "XSLoader::load for $module ($file)\n" if $dl_debug;
+
+    my $bs = $file;
+    $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library
+
+    goto retry if not -f $file or -s $bs;
+
+    my $bootname = "boot_$module";
+    $bootname =~ s/\W/_/g;
+    @DynaLoader::dl_require_symbols = ($bootname);
+
+    my $boot_symbol_ref;
+
+    if ($^O eq 'darwin') {
+        if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) {
+            goto boot; #extension library has already been loaded, e.g. darwin
+        }
+    }
+
+    # Many dynamic extension loading problems will appear to come from
+    # this section of code: XYZ failed at line 123 of DynaLoader.pm.
+    # Often these errors are actually occurring in the initialisation
+    # C code of the extension XS file. Perl reports the error as being
+    # in this perl code simply because this was the last perl code
+    # it executed.
+
+    my $libref = dl_load_file($file, 0) or do { 
+        require Carp;
+        Carp::croak("Can't load '$file' for module $module: " . dl_error());
+    };
+    push(@DynaLoader::dl_librefs,$libref);  # record loaded object
+
+    my @unresolved = dl_undef_symbols();
+    if (@unresolved) {
+        require Carp;
+        Carp::carp("Undefined symbols present after loading $file: @unresolved\n");
+    }
+
+    $boot_symbol_ref = dl_find_symbol($libref, $bootname) or do {
+        require Carp;
+        Carp::croak("Can't find '$bootname' symbol in $file\n");
+    };
+
+    push(@DynaLoader::dl_modules, $module); # record loaded module
+
+  boot:
+    my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file);
+
+    # See comment block above
+    push(@DynaLoader::dl_shared_objects, $file); # record files loaded
+    return &$xs(@_);
+
+  retry:
+    my $bootstrap_inherit = DynaLoader->can('bootstrap_inherit') || 
+                            XSLoader->can('bootstrap_inherit');
+    goto &$bootstrap_inherit;
+}
+
+# Versions of DynaLoader prior to 5.6.0 don't have this function.
+sub bootstrap_inherit {
+    package DynaLoader;
+
+    my $module = $_[0];
+    local *DynaLoader::isa = *{"$module\::ISA"};
+    local @DynaLoader::isa = (@DynaLoader::isa, 'DynaLoader');
+    # Cannot goto due to delocalization.  Will report errors on a wrong line?
+    require DynaLoader;
+    DynaLoader::bootstrap(@_);
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+XSLoader - Dynamically load C libraries into Perl code
+
+=head1 VERSION
+
+Version 0.06
+
+=head1 SYNOPSIS
+
+    package YourPackage;
+    use XSLoader;
+
+    XSLoader::load 'YourPackage', $YourPackage::VERSION;
+
+=head1 DESCRIPTION
+
+This module defines a standard I<simplified> interface to the dynamic
+linking mechanisms available on many platforms.  Its primary purpose is
+to implement cheap automatic dynamic loading of Perl modules.
+
+For a more complicated interface, see L<DynaLoader>.  Many (most)
+features of C<DynaLoader> are not implemented in C<XSLoader>, like for
+example the C<dl_load_flags>, not honored by C<XSLoader>.
+
+=head2 Migration from C<DynaLoader>
+
+A typical module using L<DynaLoader|DynaLoader> starts like this:
+
+    package YourPackage;
+    require DynaLoader;
+
+    our @ISA = qw( OnePackage OtherPackage DynaLoader );
+    our $VERSION = '0.01';
+    bootstrap YourPackage $VERSION;
+
+Change this to
+
+    package YourPackage;
+    use XSLoader;
+
+    our @ISA = qw( OnePackage OtherPackage );
+    our $VERSION = '0.01';
+    XSLoader::load 'YourPackage', $VERSION;
+
+In other words: replace C<require DynaLoader> by C<use XSLoader>, remove
+C<DynaLoader> from C<@ISA>, change C<bootstrap> by C<XSLoader::load>.  Do not
+forget to quote the name of your package on the C<XSLoader::load> line,
+and add comma (C<,>) before the arguments (C<$VERSION> above).
+
+Of course, if C<@ISA> contained only C<DynaLoader>, there is no need to have
+the C<@ISA> assignment at all; moreover, if instead of C<our> one uses the
+more backward-compatible
+
+    use vars qw($VERSION @ISA);
+
+one can remove this reference to C<@ISA> together with the C<@ISA> assignment.
+
+If no C<$VERSION> was specified on the C<bootstrap> line, the last line becomes
+
+    XSLoader::load 'YourPackage';
+
+=head2 Backward compatible boilerplate
+
+If you want to have your cake and eat it too, you need a more complicated
+boilerplate.
+
+    package YourPackage;
+    use vars qw($VERSION @ISA);
+
+    @ISA = qw( OnePackage OtherPackage );
+    $VERSION = '0.01';
+    eval {
+       require XSLoader;
+       XSLoader::load('YourPackage', $VERSION);
+       1;
+    } or do {
+       require DynaLoader;
+       push @ISA, 'DynaLoader';
+       bootstrap YourPackage $VERSION;
+    };
+
+The parentheses about C<XSLoader::load()> arguments are needed since we replaced
+C<use XSLoader> by C<require>, so the compiler does not know that a function
+C<XSLoader::load()> is present.
+
+This boilerplate uses the low-overhead C<XSLoader> if present; if used with
+an antic Perl which has no C<XSLoader>, it falls back to using C<DynaLoader>.
+
+=head1 Order of initialization: early load()
+
+I<Skip this section if the XSUB functions are supposed to be called from other
+modules only; read it only if you call your XSUBs from the code in your module,
+or have a C<BOOT:> section in your XS file (see L<perlxs/"The BOOT: Keyword">).
+What is described here is equally applicable to the L<DynaLoader|DynaLoader>
+interface.>
+
+A sufficiently complicated module using XS would have both Perl code (defined
+in F<YourPackage.pm>) and XS code (defined in F<YourPackage.xs>).  If this
+Perl code makes calls into this XS code, and/or this XS code makes calls to
+the Perl code, one should be careful with the order of initialization.
+
+The call to C<XSLoader::load()> (or C<bootstrap()>) has three side effects:
+
+=over
+
+=item *
+
+if C<$VERSION> was specified, a sanity check is done to ensure that the
+versions of the F<.pm> and the (compiled) F<.xs> parts are compatible;
+
+=item *
+
+the XSUBs are made accessible from Perl;
+
+=item *
+
+if a C<BOOT:> section was present in the F<.xs> file, the code there is called.
+
+=back
+
+Consequently, if the code in the F<.pm> file makes calls to these XSUBs, it is
+convenient to have XSUBs installed before the Perl code is defined; for
+example, this makes prototypes for XSUBs visible to this Perl code.
+Alternatively, if the C<BOOT:> section makes calls to Perl functions (or
+uses Perl variables) defined in the F<.pm> file, they must be defined prior to
+the call to C<XSLoader::load()> (or C<bootstrap()>).
+
+The first situation being much more frequent, it makes sense to rewrite the
+boilerplate as
+
+    package YourPackage;
+    use XSLoader;
+    use vars qw($VERSION @ISA);
+
+    BEGIN {
+       @ISA = qw( OnePackage OtherPackage );
+       $VERSION = '0.01';
+
+       # Put Perl code used in the BOOT: section here
+
+       XSLoader::load 'YourPackage', $VERSION;
+    }
+
+    # Put Perl code making calls into XSUBs here
+
+=head2 The most hairy case
+
+If the interdependence of your C<BOOT:> section and Perl code is
+more complicated than this (e.g., the C<BOOT:> section makes calls to Perl
+functions which make calls to XSUBs with prototypes), get rid of the C<BOOT:>
+section altogether.  Replace it with a function C<onBOOT()>, and call it like
+this:
+
+    package YourPackage;
+    use XSLoader;
+    use vars qw($VERSION @ISA);
+
+    BEGIN {
+       @ISA = qw( OnePackage OtherPackage );
+       $VERSION = '0.01';
+       XSLoader::load 'YourPackage', $VERSION;
+    }
+
+    # Put Perl code used in onBOOT() function here; calls to XSUBs are
+    # prototype-checked.
+
+    onBOOT;
+
+    # Put Perl initialization code assuming that XS is initialized here
+
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Can't find '%s' symbol in %s
+
+B<(F)> The bootstrap symbol could not be found in the extension module.
+
+=item Can't load '%s' for module %s: %s
+
+B<(F)> The loading or initialisation of the extension module failed.
+The detailed error follows.
+
+=item Undefined symbols present after loading %s: %s
+
+B<(W)> As the message says, some symbols stay undefined although the
+extension module was correctly loaded and initialised. The list of undefined
+symbols follows.
+
+=item XSLoader::load('Your::Module', $Your::Module::VERSION)
+
+B<(F)> You tried to invoke C<load()> without any argument. You must supply
+a module name, and optionally its version.
+
+=back
+
+
+=head1 LIMITATIONS
+
+To reduce the overhead as much as possible, only one possible location
+is checked to find the extension DLL (this location is where C<make install>
+would put the DLL).  If not found, the search for the DLL is transparently
+delegated to C<DynaLoader>, which looks for the DLL along the C<@INC> list.
+
+In particular, this is applicable to the structure of C<@INC> used for testing
+not-yet-installed extensions.  This means that running uninstalled extensions
+may have much more overhead than running the same extensions after
+C<make install>.
+
+
+=head1 BUGS
+
+Please report any bugs or feature requests via the perlbug(1) utility.
+
+
+=head1 SEE ALSO
+
+L<DynaLoader>
+
+
+=head1 AUTHORS
+
+Ilya Zakharevich originally extracted C<XSLoader> from C<DynaLoader>.
+
+CPAN version is currently maintained by SE<eacute>bastien Aperghis-Tramoni
+E<lt>sebastien@aperghis.netE<gt>
+
+Previous maintainer was Michael G Schwern <schwern@pobox.com>
+
+
+=head1 COPYRIGHT
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/abbrev.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/abbrev.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/abbrev.pl	(revision 14489)
@@ -0,0 +1,43 @@
+;# Usage:
+;#	%foo = ();
+;#	&abbrev(*foo,LIST);
+;#	...
+;#	$long = $foo{$short};
+
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Text::Abbrev
+#
+
+package abbrev;
+
+sub main'abbrev {
+    local(*domain) = @_;
+    shift(@_);
+    @cmp = @_;
+    local($[) = 0;
+    foreach $name (@_) {
+	@extra = split(//,$name);
+	$abbrev = shift(@extra);
+	$len = 1;
+	foreach $cmp (@cmp) {
+	    next if $cmp eq $name;
+	    while (@extra && substr($cmp,0,$len) eq $abbrev) {
+		$abbrev .= shift(@extra);
+		++$len;
+	    }
+	}
+	$domain{$abbrev} = $name;
+	while ($#extra >= 0) {
+	    $abbrev .= shift(@extra);
+	    $domain{$abbrev} = $name;
+	}
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/assert.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/assert.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/assert.pl	(revision 14489)
@@ -0,0 +1,55 @@
+# assert.pl
+# tchrist@convex.com (Tom Christiansen)
+# 
+# Usage:
+# 
+#     &assert('@x > @y');
+#     &assert('$var > 10', $var, $othervar, @various_info);
+# 
+# That is, if the first expression evals false, we blow up.  The
+# rest of the args, if any, are nice to know because they will
+# be printed out by &panic, which is just the stack-backtrace
+# routine shamelessly borrowed from the perl debugger.
+
+sub assert {
+    &panic("ASSERTION BOTCHED: $_[$[]",$@) unless eval $_[$[];
+} 
+
+sub panic {
+    package DB;
+
+    select(STDERR);
+
+    print "\npanic: @_\n";
+
+    exit 1 if $] <= 4.003;  # caller broken
+
+    # stack traceback gratefully borrowed from perl debugger
+
+    local $_;
+    my $i;
+    my ($p,$f,$l,$s,$h,$a,@a,@frames);
+    for ($i = 0; ($p,$f,$l,$s,$h,$w) = caller($i); $i++) {
+	@a = @args;
+	for (@a) {
+	    if (/^StB\000/ && length($_) == length($_main{'_main'})) {
+		$_ = sprintf("%s",$_);
+	    }
+	    else {
+		s/'/\\'/g;
+		s/([^\0]*)/'$1'/ unless /^-?[\d.]+$/;
+		s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
+		s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
+	    }
+	}
+	$w = $w ? '@ = ' : '$ = ';
+	$a = $h ? '(' . join(', ', @a) . ')' : '';
+	push(@frames, "$w&$s$a from file $f line $l\n");
+    }
+    for ($i=0; $i <= $#frames; $i++) {
+	print $frames[$i];
+    }
+    exit 1;
+} 
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/attributes.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/attributes.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/attributes.pm	(revision 14489)
@@ -0,0 +1,418 @@
+package attributes;
+
+our $VERSION = 0.06;
+
+@EXPORT_OK = qw(get reftype);
+@EXPORT = ();
+%EXPORT_TAGS = (ALL => [@EXPORT, @EXPORT_OK]);
+
+use strict;
+
+sub croak {
+    require Carp;
+    goto &Carp::croak;
+}
+
+sub carp {
+    require Carp;
+    goto &Carp::carp;
+}
+
+## forward declaration(s) rather than wrapping the bootstrap call in BEGIN{}
+#sub reftype ($) ;
+#sub _fetch_attrs ($) ;
+#sub _guess_stash ($) ;
+#sub _modify_attrs ;
+#sub _warn_reserved () ;
+#
+# The extra trips through newATTRSUB in the interpreter wipe out any savings
+# from avoiding the BEGIN block.  Just do the bootstrap now.
+BEGIN { bootstrap attributes }
+
+sub import {
+    @_ > 2 && ref $_[2] or do {
+	require Exporter;
+	goto &Exporter::import;
+    };
+    my (undef,$home_stash,$svref,@attrs) = @_;
+
+    my $svtype = uc reftype($svref);
+    my $pkgmeth;
+    $pkgmeth = UNIVERSAL::can($home_stash, "MODIFY_${svtype}_ATTRIBUTES")
+	if defined $home_stash && $home_stash ne '';
+    my @badattrs;
+    if ($pkgmeth) {
+	my @pkgattrs = _modify_attrs($svref, @attrs);
+	@badattrs = $pkgmeth->($home_stash, $svref, @attrs);
+	if (!@badattrs && @pkgattrs) {
+	    return unless _warn_reserved;
+	    @pkgattrs = grep { m/\A[[:lower:]]+(?:\z|\()/ } @pkgattrs;
+	    if (@pkgattrs) {
+		for my $attr (@pkgattrs) {
+		    $attr =~ s/\(.+\z//s;
+		}
+		my $s = ((@pkgattrs == 1) ? '' : 's');
+		carp "$svtype package attribute$s " .
+		    "may clash with future reserved word$s: " .
+		    join(' : ' , @pkgattrs);
+	    }
+	}
+    }
+    else {
+	@badattrs = _modify_attrs($svref, @attrs);
+    }
+    if (@badattrs) {
+	croak "Invalid $svtype attribute" .
+	    (( @badattrs == 1 ) ? '' : 's') .
+	    ": " .
+	    join(' : ', @badattrs);
+    }
+}
+
+sub get ($) {
+    @_ == 1  && ref $_[0] or
+	croak 'Usage: '.__PACKAGE__.'::get $ref';
+    my $svref = shift;
+    my $svtype = uc reftype $svref;
+    my $stash = _guess_stash $svref;
+    $stash = caller unless defined $stash;
+    my $pkgmeth;
+    $pkgmeth = UNIVERSAL::can($stash, "FETCH_${svtype}_ATTRIBUTES")
+	if defined $stash && $stash ne '';
+    return $pkgmeth ?
+		(_fetch_attrs($svref), $pkgmeth->($stash, $svref)) :
+		(_fetch_attrs($svref))
+	;
+}
+
+sub require_version { goto &UNIVERSAL::VERSION }
+
+1;
+__END__
+#The POD goes here
+
+=head1 NAME
+
+attributes - get/set subroutine or variable attributes
+
+=head1 SYNOPSIS
+
+  sub foo : method ;
+  my ($x,@y,%z) : Bent = 1;
+  my $s = sub : method { ... };
+
+  use attributes ();	# optional, to get subroutine declarations
+  my @attrlist = attributes::get(\&foo);
+
+  use attributes 'get'; # import the attributes::get subroutine
+  my @attrlist = get \&foo;
+
+=head1 DESCRIPTION
+
+Subroutine declarations and definitions may optionally have attribute lists
+associated with them.  (Variable C<my> declarations also may, but see the
+warning below.)  Perl handles these declarations by passing some information
+about the call site and the thing being declared along with the attribute
+list to this module.  In particular, the first example above is equivalent to
+the following:
+
+    use attributes __PACKAGE__, \&foo, 'method';
+
+The second example in the synopsis does something equivalent to this:
+
+    use attributes ();
+    my ($x,@y,%z);
+    attributes::->import(__PACKAGE__, \$x, 'Bent');
+    attributes::->import(__PACKAGE__, \@y, 'Bent');
+    attributes::->import(__PACKAGE__, \%z, 'Bent');
+    ($x,@y,%z) = 1;
+
+Yes, that's a lot of expansion.
+
+B<WARNING>: attribute declarations for variables are still evolving.
+The semantics and interfaces of such declarations could change in
+future versions.  They are present for purposes of experimentation
+with what the semantics ought to be.  Do not rely on the current
+implementation of this feature.
+
+There are only a few attributes currently handled by Perl itself (or
+directly by this module, depending on how you look at it.)  However,
+package-specific attributes are allowed by an extension mechanism.
+(See L<"Package-specific Attribute Handling"> below.)
+
+The setting of subroutine attributes happens at compile time.
+Variable attributes in C<our> declarations are also applied at compile time.
+However, C<my> variables get their attributes applied at run-time.
+This means that you have to I<reach> the run-time component of the C<my>
+before those attributes will get applied.  For example:
+
+    my $x : Bent = 42 if 0;
+
+will neither assign 42 to $x I<nor> will it apply the C<Bent> attribute
+to the variable.
+
+An attempt to set an unrecognized attribute is a fatal error.  (The
+error is trappable, but it still stops the compilation within that
+C<eval>.)  Setting an attribute with a name that's all lowercase
+letters that's not a built-in attribute (such as "foo") will result in
+a warning with B<-w> or C<use warnings 'reserved'>.
+
+=head2 Built-in Attributes
+
+The following are the built-in attributes for subroutines:
+
+=over 4
+
+=item locked
+
+B<5.005 threads only!  The use of the "locked" attribute currently
+only makes sense if you are using the deprecated "Perl 5.005 threads"
+implementation of threads.>
+
+Setting this attribute is only meaningful when the subroutine or
+method is to be called by multiple threads.  When set on a method
+subroutine (i.e., one marked with the B<method> attribute below),
+Perl ensures that any invocation of it implicitly locks its first
+argument before execution.  When set on a non-method subroutine,
+Perl ensures that a lock is taken on the subroutine itself before
+execution.  The semantics of the lock are exactly those of one
+explicitly taken with the C<lock> operator immediately after the
+subroutine is entered.
+
+=item method
+
+Indicates that the referenced subroutine is a method.
+This has a meaning when taken together with the B<locked> attribute,
+as described there.  It also means that a subroutine so marked
+will not trigger the "Ambiguous call resolved as CORE::%s" warning.
+
+=item lvalue
+
+Indicates that the referenced subroutine is a valid lvalue and can
+be assigned to. The subroutine must return a modifiable value such
+as a scalar variable, as described in L<perlsub>.
+
+=back
+
+For global variables there is C<unique> attribute: see L<perlfunc/our>.
+
+=head2 Available Subroutines
+
+The following subroutines are available for general use once this module
+has been loaded:
+
+=over 4
+
+=item get
+
+This routine expects a single parameter--a reference to a
+subroutine or variable.  It returns a list of attributes, which may be
+empty.  If passed invalid arguments, it uses die() (via L<Carp::croak|Carp>)
+to raise a fatal exception.  If it can find an appropriate package name
+for a class method lookup, it will include the results from a
+C<FETCH_I<type>_ATTRIBUTES> call in its return list, as described in
+L<"Package-specific Attribute Handling"> below.
+Otherwise, only L<built-in attributes|"Built-in Attributes"> will be returned.
+
+=item reftype
+
+This routine expects a single parameter--a reference to a subroutine or
+variable.  It returns the built-in type of the referenced variable,
+ignoring any package into which it might have been blessed.
+This can be useful for determining the I<type> value which forms part of
+the method names described in L<"Package-specific Attribute Handling"> below.
+
+=back
+
+Note that these routines are I<not> exported by default.
+
+=head2 Package-specific Attribute Handling
+
+B<WARNING>: the mechanisms described here are still experimental.  Do not
+rely on the current implementation.  In particular, there is no provision
+for applying package attributes to 'cloned' copies of subroutines used as
+closures.  (See L<perlref/"Making References"> for information on closures.)
+Package-specific attribute handling may change incompatibly in a future
+release.
+
+When an attribute list is present in a declaration, a check is made to see
+whether an attribute 'modify' handler is present in the appropriate package
+(or its @ISA inheritance tree).  Similarly, when C<attributes::get> is
+called on a valid reference, a check is made for an appropriate attribute
+'fetch' handler.  See L<"EXAMPLES"> to see how the "appropriate package"
+determination works.
+
+The handler names are based on the underlying type of the variable being
+declared or of the reference passed.  Because these attributes are
+associated with subroutine or variable declarations, this deliberately
+ignores any possibility of being blessed into some package.  Thus, a
+subroutine declaration uses "CODE" as its I<type>, and even a blessed
+hash reference uses "HASH" as its I<type>.
+
+The class methods invoked for modifying and fetching are these:
+
+=over 4
+
+=item FETCH_I<type>_ATTRIBUTES
+
+This method receives a single argument, which is a reference to the
+variable or subroutine for which package-defined attributes are desired.
+The expected return value is a list of associated attributes.
+This list may be empty.
+
+=item MODIFY_I<type>_ATTRIBUTES
+
+This method is called with two fixed arguments, followed by the list of
+attributes from the relevant declaration.  The two fixed arguments are
+the relevant package name and a reference to the declared subroutine or
+variable.  The expected return value is a list of attributes which were
+not recognized by this handler.  Note that this allows for a derived class
+to delegate a call to its base class, and then only examine the attributes
+which the base class didn't already handle for it.
+
+The call to this method is currently made I<during> the processing of the
+declaration.  In particular, this means that a subroutine reference will
+probably be for an undefined subroutine, even if this declaration is
+actually part of the definition.
+
+=back
+
+Calling C<attributes::get()> from within the scope of a null package
+declaration C<package ;> for an unblessed variable reference will
+not provide any starting package name for the 'fetch' method lookup.
+Thus, this circumstance will not result in a method call for package-defined
+attributes.  A named subroutine knows to which symbol table entry it belongs
+(or originally belonged), and it will use the corresponding package.
+An anonymous subroutine knows the package name into which it was compiled
+(unless it was also compiled with a null package declaration), and so it
+will use that package name.
+
+=head2 Syntax of Attribute Lists
+
+An attribute list is a sequence of attribute specifications, separated by
+whitespace or a colon (with optional whitespace).
+Each attribute specification is a simple
+name, optionally followed by a parenthesised parameter list.
+If such a parameter list is present, it is scanned past as for the rules
+for the C<q()> operator.  (See L<perlop/"Quote and Quote-like Operators">.)
+The parameter list is passed as it was found, however, and not as per C<q()>.
+
+Some examples of syntactically valid attribute lists:
+
+    switch(10,foo(7,3))  :  expensive
+    Ugly('\(") :Bad
+    _5x5
+    locked method
+
+Some examples of syntactically invalid attribute lists (with annotation):
+
+    switch(10,foo()		# ()-string not balanced
+    Ugly('(')			# ()-string not balanced
+    5x5				# "5x5" not a valid identifier
+    Y2::north			# "Y2::north" not a simple identifier
+    foo + bar			# "+" neither a colon nor whitespace
+
+=head1 EXPORTS
+
+=head2 Default exports
+
+None.
+
+=head2 Available exports
+
+The routines C<get> and C<reftype> are exportable.
+
+=head2 Export tags defined
+
+The C<:ALL> tag will get all of the above exports.
+
+=head1 EXAMPLES
+
+Here are some samples of syntactically valid declarations, with annotation
+as to how they resolve internally into C<use attributes> invocations by
+perl.  These examples are primarily useful to see how the "appropriate
+package" is found for the possible method lookups for package-defined
+attributes.
+
+=over 4
+
+=item 1.
+
+Code:
+
+    package Canine;
+    package Dog;
+    my Canine $spot : Watchful ;
+
+Effect:
+
+    use attributes ();
+    attributes::->import(Canine => \$spot, "Watchful");
+
+=item 2.
+
+Code:
+
+    package Felis;
+    my $cat : Nervous;
+
+Effect:
+
+    use attributes ();
+    attributes::->import(Felis => \$cat, "Nervous");
+
+=item 3.
+
+Code:
+
+    package X;
+    sub foo : locked ;
+
+Effect:
+
+    use attributes X => \&foo, "locked";
+
+=item 4.
+
+Code:
+
+    package X;
+    sub Y::x : locked { 1 }
+
+Effect:
+
+    use attributes Y => \&Y::x, "locked";
+
+=item 5.
+
+Code:
+
+    package X;
+    sub foo { 1 }
+
+    package Y;
+    BEGIN { *bar = \&X::foo; }
+
+    package Z;
+    sub Y::bar : locked ;
+
+Effect:
+
+    use attributes X => \&X::foo, "locked";
+
+=back
+
+This last example is purely for purposes of completeness.  You should not
+be trying to mess with the attributes of something in a package that's
+not your own.
+
+=head1 SEE ALSO
+
+L<perlsub/"Private Variables via my()"> and
+L<perlsub/"Subroutine Attributes"> for details on the basic declarations;
+L<attrs> for the obsolescent form of subroutine attribute specification
+which this module replaces;
+L<perlfunc/use> for details on the normal invocation mechanism.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/attrs.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/attrs.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/attrs.pm	(revision 14489)
@@ -0,0 +1,58 @@
+package attrs;
+use XSLoader ();
+
+$VERSION = "1.02";
+
+=head1 NAME
+
+attrs - set/get attributes of a subroutine (deprecated)
+
+=head1 SYNOPSIS
+
+    sub foo {
+        use attrs qw(locked method);
+        ...
+    }
+
+    @a = attrs::get(\&foo);
+
+=head1 DESCRIPTION
+
+NOTE: Use of this pragma is deprecated.  Use the syntax
+
+    sub foo : locked method { }
+
+to declare attributes instead.  See also L<attributes>.
+
+This pragma lets you set and get attributes for subroutines.
+Setting attributes takes place at compile time; trying to set
+invalid attribute names causes a compile-time error. Calling
+C<attrs::get> on a subroutine reference or name returns its list
+of attribute names. Notice that C<attrs::get> is not exported.
+Valid attributes are as follows.
+
+=over 4
+
+=item method
+
+Indicates that the invoking subroutine is a method.
+
+=item locked
+
+Setting this attribute is only meaningful when the subroutine or
+method is to be called by multiple threads. When set on a method
+subroutine (i.e. one marked with the B<method> attribute above),
+perl ensures that any invocation of it implicitly locks its first
+argument before execution. When set on a non-method subroutine,
+perl ensures that a lock is taken on the subroutine itself before
+execution. The semantics of the lock are exactly those of one
+explicitly taken with the C<lock> operator immediately after the
+subroutine is entered.
+
+=back
+
+=cut
+
+XSLoader::load 'attrs', $VERSION;
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/autosplit.ix
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/autosplit.ix	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/autosplit.ix	(revision 14489)
@@ -0,0 +1,8 @@
+# Index created by AutoSplit for ../LIB\DynaLoader.pm
+#    (file acts as timestamp)
+package DynaLoader;
+sub dl_findfile  ;
+sub dl_expandspec  ;
+sub dl_find_symbol_anywhere 
+;
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/dl_expandspec.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/dl_expandspec.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/dl_expandspec.al	(revision 14489)
@@ -0,0 +1,34 @@
+# NOTE: Derived from ../LIB\DynaLoader.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package DynaLoader;
+
+#line 377 "../LIB\DynaLoader.pm (autosplit into ..\lib\auto\DynaLoader\dl_expandspec.al)"
+sub dl_expandspec {
+    my($spec) = @_;
+    # Optional function invoked if DynaLoader.pm sets $do_expand.
+    # Most systems do not require or use this function.
+    # Some systems may implement it in the dl_*.xs file in which case
+    # this autoload version will not be called but is harmless.
+
+    # This function is designed to deal with systems which treat some
+    # 'filenames' in a special way. For example VMS 'Logical Names'
+    # (something like unix environment variables - but different).
+    # This function should recognise such names and expand them into
+    # full file paths.
+    # Must return undef if $spec is invalid or file does not exist.
+
+    my $file = $spec; # default output to input
+
+    if ($Is_VMS) { # dl_expandspec should be defined in dl_vms.xs
+	require Carp;
+	Carp::croak("dl_expandspec: should be defined in XS file!\n");
+    } else {
+	return undef unless -f $file;
+    }
+    print STDERR "dl_expandspec($spec) => $file\n" if $dl_debug;
+    $file;
+}
+
+# end of DynaLoader::dl_expandspec
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/dl_find_symbol_anywhere.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/dl_find_symbol_anywhere.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/dl_find_symbol_anywhere.al	(revision 14489)
@@ -0,0 +1,19 @@
+# NOTE: Derived from ../LIB\DynaLoader.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package DynaLoader;
+
+#line 403 "../LIB\DynaLoader.pm (autosplit into ..\lib\auto\DynaLoader\dl_find_symbol_anywhere.al)"
+sub dl_find_symbol_anywhere
+{
+    my $sym = shift;
+    my $libref;
+    foreach $libref (@dl_librefs) {
+	my $symref = dl_find_symbol($libref,$sym);
+	return $symref if $symref;
+    }
+    return undef;
+}
+
+1;
+# end of DynaLoader::dl_find_symbol_anywhere
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/dl_findfile.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/dl_findfile.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/DynaLoader/dl_findfile.al	(revision 14489)
@@ -0,0 +1,115 @@
+# NOTE: Derived from ../LIB\DynaLoader.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package DynaLoader;
+
+#line 269 "../LIB\DynaLoader.pm (autosplit into ..\lib\auto\DynaLoader\dl_findfile.al)"
+sub dl_findfile {
+    # Read ext/DynaLoader/DynaLoader.doc for detailed information.
+    # This function does not automatically consider the architecture
+    # or the perl library auto directories.
+    my (@args) = @_;
+    my (@dirs,  $dir);   # which directories to search
+    my (@found);         # full paths to real files we have found
+    my $dl_ext= 'dll'; # $Config::Config{'dlext'} suffix for perl extensions
+    my $dl_so = 'dll'; # $Config::Config{'so'} suffix for shared libraries
+
+    print STDERR "dl_findfile(@args)\n" if $dl_debug;
+
+    # accumulate directories but process files as they appear
+    arg: foreach(@args) {
+        #  Special fast case: full filepath requires no search
+        if ($Is_VMS && m%[:>/\]]% && -f $_) {
+	    push(@found,dl_expandspec(VMS::Filespec::vmsify($_)));
+	    last arg unless wantarray;
+	    next;
+        }
+	elsif ($Is_MacOS) {
+	    if (m/:/ && -f $_) {
+	    	push(@found,$_);
+	    	last arg unless wantarray;
+	    }
+	}
+        elsif (m:/: && -f $_ && !$do_expand) {
+	    push(@found,$_);
+	    last arg unless wantarray;
+	    next;
+	}
+
+        # Deal with directories first:
+        #  Using a -L prefix is the preferred option (faster and more robust)
+        if (m:^-L:) { s/^-L//; push(@dirs, $_); next; }
+
+	if ($Is_MacOS) {
+            #  Otherwise we try to try to spot directories by a heuristic
+            #  (this is a more complicated issue than it first appears)
+	    if (m/:/ && -d $_) {   push(@dirs, $_); next; }
+            #  Only files should get this far...
+            my(@names, $name);    # what filenames to look for
+	    s/^-l//;
+	    push(@names, $_);
+            foreach $dir (@dirs, @dl_library_path) {
+            	next unless -d $dir;
+		$dir =~ s/^([^:]+)$/:$1/;
+		$dir =~ s/:$//;
+            	foreach $name (@names) {
+	    	    my($file) = "$dir:$name";
+                    print STDERR " checking in $dir for $name\n" if $dl_debug;
+		    if (-f $file) {
+                    	push(@found, $file);
+                    	next arg; # no need to look any further
+                    }
+                }
+	    }
+	    next;
+	}
+	
+        #  Otherwise we try to try to spot directories by a heuristic
+        #  (this is a more complicated issue than it first appears)
+        if (m:/: && -d $_) {   push(@dirs, $_); next; }
+
+        # VMS: we may be using native VMS directory syntax instead of
+        # Unix emulation, so check this as well
+        if ($Is_VMS && /[:>\]]/ && -d $_) {   push(@dirs, $_); next; }
+
+        #  Only files should get this far...
+        my(@names, $name);    # what filenames to look for
+        if (m:-l: ) {          # convert -lname to appropriate library name
+            s/-l//;
+            push(@names,"lib$_.$dl_so");
+            push(@names,"lib$_.a");
+        } else {                # Umm, a bare name. Try various alternatives:
+            # these should be ordered with the most likely first
+            push(@names,"$_.$dl_ext")    unless m/\.$dl_ext$/o;
+            push(@names,"$_.$dl_so")     unless m/\.$dl_so$/o;
+            push(@names,"lib$_.$dl_so")  unless m:/:;
+            push(@names,"$_.a")          if !m/\.a$/ and $dlsrc eq "dl_dld.xs";
+            push(@names, $_);
+        }
+        foreach $dir (@dirs, @dl_library_path) {
+            next unless -d $dir;
+            chop($dir = VMS::Filespec::unixpath($dir)) if $Is_VMS;
+            foreach $name (@names) {
+		my($file) = "$dir/$name";
+                print STDERR " checking in $dir for $name\n" if $dl_debug;
+		$file = ($do_expand) ? dl_expandspec($file) : (-f $file && $file);
+		#$file = _check_file($file);
+		if ($file) {
+                    push(@found, $file);
+                    next arg; # no need to look any further
+                }
+            }
+        }
+    }
+    if ($dl_debug) {
+        foreach(@dirs) {
+            print STDERR " dl_findfile ignored non-existent directory: $_\n" unless -d $_;
+        }
+        print STDERR "dl_findfile found: @found\n";
+    }
+    return $found[0] unless wantarray;
+    @found;
+}
+
+# end of DynaLoader::dl_findfile
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/flags.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/flags.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/flags.al	(revision 14489)
@@ -0,0 +1,9 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX::SigAction;
+
+#line 964 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\SigAction\flags.al)"
+sub flags   { $_[0]->{FLAGS}   = $_[1] if @_ > 1; $_[0]->{FLAGS} };
+# end of POSIX::SigAction::flags
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/handler.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/handler.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/handler.al	(revision 14489)
@@ -0,0 +1,11 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX::SigAction;
+
+#line 960 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\SigAction\handler.al)"
+package POSIX::SigAction;
+
+sub handler { $_[0]->{HANDLER} = $_[1] if @_ > 1; $_[0]->{HANDLER} };
+# end of POSIX::SigAction::handler
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/mask.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/mask.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/mask.al	(revision 14489)
@@ -0,0 +1,9 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX::SigAction;
+
+#line 963 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\SigAction\mask.al)"
+sub mask    { $_[0]->{MASK}    = $_[1] if @_ > 1; $_[0]->{MASK} };
+# end of POSIX::SigAction::mask
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/safe.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/safe.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/SigAction/safe.al	(revision 14489)
@@ -0,0 +1,9 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX::SigAction;
+
+#line 965 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\SigAction\safe.al)"
+sub safe    { $_[0]->{SAFE}    = $_[1] if @_ > 1; $_[0]->{SAFE} };
+1;
+# end of POSIX::SigAction::safe
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/abs.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/abs.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/abs.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 398 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\abs.al)"
+sub abs {
+    usage "abs(x)" if @_ != 1;
+    CORE::abs($_[0]);
+}
+
+# end of POSIX::abs
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/alarm.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/alarm.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/alarm.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 615 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\alarm.al)"
+sub alarm {
+    usage "alarm(seconds)" if @_ != 1;
+    CORE::alarm($_[0]);
+}
+
+# end of POSIX::alarm
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/assert.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/assert.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/assert.al	(revision 14489)
@@ -0,0 +1,15 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 80 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\assert.al)"
+sub assert {
+    usage "assert(expr)" if @_ != 1;
+    if (!$_[0]) {
+	croak "Assertion failed";
+    }
+}
+
+# end of POSIX::assert
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atan2.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atan2.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atan2.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 145 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\atan2.al)"
+sub atan2 {
+    usage "atan2(x,y)" if @_ != 2;
+    CORE::atan2($_[0], $_[1]);
+}
+
+# end of POSIX::atan2
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atexit.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atexit.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atexit.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 403 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\atexit.al)"
+sub atexit {
+    unimpl "atexit() is C-specific: use END {} instead";
+}
+
+# end of POSIX::atexit
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atof.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atof.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atof.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 407 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\atof.al)"
+sub atof {
+    unimpl "atof() is C-specific, stopped";
+}
+
+# end of POSIX::atof
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atoi.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atoi.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atoi.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 411 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\atoi.al)"
+sub atoi {
+    unimpl "atoi() is C-specific, stopped";
+}
+
+# end of POSIX::atoi
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atol.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atol.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/atol.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 415 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\atol.al)"
+sub atol {
+    unimpl "atol() is C-specific, stopped";
+}
+
+# end of POSIX::atol
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/autosplit.ix
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/autosplit.ix	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/autosplit.ix	(revision 14489)
@@ -0,0 +1,159 @@
+# Index created by AutoSplit for ..\..\lib\POSIX.pm
+#    (file acts as timestamp)
+package POSIX;
+sub usage  ;
+sub redef  ;
+sub unimpl  ;
+sub assert  ;
+sub tolower  ;
+sub toupper  ;
+sub closedir  ;
+sub opendir  ;
+sub readdir  ;
+sub rewinddir  ;
+sub errno  ;
+sub creat  ;
+sub fcntl  ;
+sub getgrgid  ;
+sub getgrnam  ;
+sub atan2  ;
+sub cos  ;
+sub exp  ;
+sub fabs  ;
+sub log  ;
+sub pow  ;
+sub sin  ;
+sub sqrt  ;
+sub getpwnam  ;
+sub getpwuid  ;
+sub longjmp  ;
+sub setjmp  ;
+sub siglongjmp  ;
+sub sigsetjmp  ;
+sub kill  ;
+sub raise  ;
+sub offsetof  ;
+sub clearerr  ;
+sub fclose  ;
+sub fdopen  ;
+sub feof  ;
+sub fgetc  ;
+sub fgets  ;
+sub fileno  ;
+sub fopen  ;
+sub fprintf  ;
+sub fputc  ;
+sub fputs  ;
+sub fread  ;
+sub freopen  ;
+sub fscanf  ;
+sub fseek  ;
+sub fsync  ;
+sub ferror  ;
+sub fflush  ;
+sub fgetpos  ;
+sub fsetpos  ;
+sub ftell  ;
+sub fwrite  ;
+sub getc  ;
+sub getchar  ;
+sub gets  ;
+sub perror  ;
+sub printf  ;
+sub putc  ;
+sub putchar  ;
+sub puts  ;
+sub remove  ;
+sub rename  ;
+sub rewind  ;
+sub scanf  ;
+sub sprintf  ;
+sub sscanf  ;
+sub tmpfile  ;
+sub ungetc  ;
+sub vfprintf  ;
+sub vprintf  ;
+sub vsprintf  ;
+sub abs  ;
+sub atexit  ;
+sub atof  ;
+sub atoi  ;
+sub atol  ;
+sub bsearch  ;
+sub calloc  ;
+sub div  ;
+sub exit  ;
+sub free  ;
+sub getenv  ;
+sub labs  ;
+sub ldiv  ;
+sub malloc  ;
+sub qsort  ;
+sub rand  ;
+sub realloc  ;
+sub srand  ;
+sub system  ;
+sub memchr  ;
+sub memcmp  ;
+sub memcpy  ;
+sub memmove  ;
+sub memset  ;
+sub strcat  ;
+sub strchr  ;
+sub strcmp  ;
+sub strcpy  ;
+sub strcspn  ;
+sub strerror  ;
+sub strlen  ;
+sub strncat  ;
+sub strncmp  ;
+sub strncpy  ;
+sub strpbrk  ;
+sub strrchr  ;
+sub strspn  ;
+sub strstr  ;
+sub strtok  ;
+sub chmod  ;
+sub fstat  ;
+sub mkdir  ;
+sub stat  ;
+sub umask  ;
+sub wait  ;
+sub waitpid  ;
+sub gmtime  ;
+sub localtime  ;
+sub time  ;
+sub alarm  ;
+sub chdir  ;
+sub chown  ;
+sub execl  ;
+sub execle  ;
+sub execlp  ;
+sub execv  ;
+sub execve  ;
+sub execvp  ;
+sub fork  ;
+sub getegid  ;
+sub geteuid  ;
+sub getgid  ;
+sub getgroups  ;
+sub getlogin  ;
+sub getpgrp  ;
+sub getpid  ;
+sub getppid  ;
+sub getuid  ;
+sub isatty  ;
+sub link  ;
+sub rmdir  ;
+sub setbuf  ;
+sub setvbuf  ;
+sub sleep  ;
+sub unlink  ;
+sub utime  ;
+sub load_imports  ;
+package POSIX::SigAction;
+sub handler  ;
+sub mask     ;
+sub flags    ;
+sub safe     ;
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/bsearch.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/bsearch.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/bsearch.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 419 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\bsearch.al)"
+sub bsearch {
+    unimpl "bsearch() not supplied";
+}
+
+# end of POSIX::bsearch
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/calloc.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/calloc.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/calloc.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 423 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\calloc.al)"
+sub calloc {
+    unimpl "calloc() is C-specific, stopped";
+}
+
+# end of POSIX::calloc
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/chdir.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/chdir.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/chdir.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 620 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\chdir.al)"
+sub chdir {
+    usage "chdir(directory)" if @_ != 1;
+    CORE::chdir($_[0]);
+}
+
+# end of POSIX::chdir
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/chmod.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/chmod.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/chmod.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 561 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\chmod.al)"
+sub chmod {
+    usage "chmod(mode, filename)" if @_ != 2;
+    CORE::chmod($_[0], $_[1]);
+}
+
+# end of POSIX::chmod
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/chown.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/chown.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/chown.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 625 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\chown.al)"
+sub chown {
+    usage "chown(uid, gid, filename)" if @_ != 3;
+    CORE::chown($_[0], $_[1], $_[2]);
+}
+
+# end of POSIX::chown
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/clearerr.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/clearerr.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/clearerr.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 225 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\clearerr.al)"
+sub clearerr {
+    redef "IO::Handle::clearerr()";
+}
+
+# end of POSIX::clearerr
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/closedir.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/closedir.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/closedir.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 97 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\closedir.al)"
+sub closedir {
+    usage "closedir(dirhandle)" if @_ != 1;
+    CORE::closedir($_[0]);
+}
+
+# end of POSIX::closedir
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/cos.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/cos.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/cos.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 150 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\cos.al)"
+sub cos {
+    usage "cos(x)" if @_ != 1;
+    CORE::cos($_[0]);
+}
+
+# end of POSIX::cos
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/creat.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/creat.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/creat.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 125 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\creat.al)"
+sub creat {
+    usage "creat(filename, mode)" if @_ != 2;
+    &open($_[0], &O_WRONLY | &O_CREAT | &O_TRUNC, $_[1]);
+}
+
+# end of POSIX::creat
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/div.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/div.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/div.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 427 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\div.al)"
+sub div {
+    unimpl "div() is C-specific, use /, % and int instead";
+}
+
+# end of POSIX::div
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/errno.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/errno.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/errno.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 120 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\errno.al)"
+sub errno {
+    usage "errno()" if @_ != 0;
+    $! + 0;
+}
+
+# end of POSIX::errno
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execl.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execl.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execl.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 630 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execl.al)"
+sub execl {
+    unimpl "execl() is C-specific, stopped";
+}
+
+# end of POSIX::execl
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execle.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execle.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execle.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 634 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execle.al)"
+sub execle {
+    unimpl "execle() is C-specific, stopped";
+}
+
+# end of POSIX::execle
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execlp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execlp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execlp.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 638 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execlp.al)"
+sub execlp {
+    unimpl "execlp() is C-specific, stopped";
+}
+
+# end of POSIX::execlp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execv.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execv.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execv.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 642 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execv.al)"
+sub execv {
+    unimpl "execv() is C-specific, stopped";
+}
+
+# end of POSIX::execv
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execve.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execve.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execve.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 646 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execve.al)"
+sub execve {
+    unimpl "execve() is C-specific, stopped";
+}
+
+# end of POSIX::execve
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execvp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execvp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/execvp.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 650 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\execvp.al)"
+sub execvp {
+    unimpl "execvp() is C-specific, stopped";
+}
+
+# end of POSIX::execvp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/exit.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/exit.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/exit.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 431 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\exit.al)"
+sub exit {
+    usage "exit(status)" if @_ != 1;
+    CORE::exit($_[0]);
+}
+
+# end of POSIX::exit
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/exp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/exp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/exp.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 155 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\exp.al)"
+sub exp {
+    usage "exp(x)" if @_ != 1;
+    CORE::exp($_[0]);
+}
+
+# end of POSIX::exp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fabs.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fabs.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fabs.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 160 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fabs.al)"
+sub fabs {
+    usage "fabs(x)" if @_ != 1;
+    CORE::abs($_[0]);
+}
+
+# end of POSIX::fabs
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fclose.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fclose.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fclose.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 229 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fclose.al)"
+sub fclose {
+    redef "IO::Handle::close()";
+}
+
+# end of POSIX::fclose
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fcntl.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fcntl.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fcntl.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 130 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fcntl.al)"
+sub fcntl {
+    usage "fcntl(filehandle, cmd, arg)" if @_ != 3;
+    CORE::fcntl($_[0], $_[1], $_[2]);
+}
+
+# end of POSIX::fcntl
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fdopen.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fdopen.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fdopen.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 233 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fdopen.al)"
+sub fdopen {
+    redef "IO::Handle::new_from_fd()";
+}
+
+# end of POSIX::fdopen
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/feof.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/feof.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/feof.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 237 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\feof.al)"
+sub feof {
+    redef "IO::Handle::eof()";
+}
+
+# end of POSIX::feof
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ferror.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ferror.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ferror.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 289 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\ferror.al)"
+sub ferror {
+    redef "IO::Handle::error()";
+}
+
+# end of POSIX::ferror
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fflush.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fflush.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fflush.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 293 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fflush.al)"
+sub fflush {
+    redef "IO::Handle::flush()";
+}
+
+# end of POSIX::fflush
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fgetc.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fgetc.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fgetc.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 241 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fgetc.al)"
+sub fgetc {
+    redef "IO::Handle::getc()";
+}
+
+# end of POSIX::fgetc
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fgetpos.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fgetpos.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fgetpos.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 297 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fgetpos.al)"
+sub fgetpos {
+    redef "IO::Seekable::getpos()";
+}
+
+# end of POSIX::fgetpos
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fgets.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fgets.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fgets.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 245 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fgets.al)"
+sub fgets {
+    redef "IO::Handle::gets()";
+}
+
+# end of POSIX::fgets
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fileno.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fileno.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fileno.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 249 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fileno.al)"
+sub fileno {
+    redef "IO::Handle::fileno()";
+}
+
+# end of POSIX::fileno
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fopen.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fopen.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fopen.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 253 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fopen.al)"
+sub fopen {
+    redef "IO::File::open()";
+}
+
+# end of POSIX::fopen
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fork.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fork.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fork.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 654 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fork.al)"
+sub fork {
+    usage "fork()" if @_ != 0;
+    CORE::fork;
+}
+
+# end of POSIX::fork
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fprintf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fprintf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fprintf.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 257 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fprintf.al)"
+sub fprintf {
+    unimpl "fprintf() is C-specific--use printf instead";
+}
+
+# end of POSIX::fprintf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fputc.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fputc.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fputc.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 261 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fputc.al)"
+sub fputc {
+    unimpl "fputc() is C-specific--use print instead";
+}
+
+# end of POSIX::fputc
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fputs.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fputs.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fputs.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 265 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fputs.al)"
+sub fputs {
+    unimpl "fputs() is C-specific--use print instead";
+}
+
+# end of POSIX::fputs
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fread.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fread.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fread.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 269 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fread.al)"
+sub fread {
+    unimpl "fread() is C-specific--use read instead";
+}
+
+# end of POSIX::fread
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/free.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/free.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/free.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 436 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\free.al)"
+sub free {
+    unimpl "free() is C-specific, stopped";
+}
+
+# end of POSIX::free
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/freopen.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/freopen.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/freopen.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 273 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\freopen.al)"
+sub freopen {
+    unimpl "freopen() is C-specific--use open instead";
+}
+
+# end of POSIX::freopen
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fscanf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fscanf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fscanf.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 277 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fscanf.al)"
+sub fscanf {
+    unimpl "fscanf() is C-specific--use <> and regular expressions instead";
+}
+
+# end of POSIX::fscanf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fseek.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fseek.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fseek.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 281 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fseek.al)"
+sub fseek {
+    redef "IO::Seekable::seek()";
+}
+
+# end of POSIX::fseek
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fsetpos.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fsetpos.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fsetpos.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 301 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fsetpos.al)"
+sub fsetpos {
+    redef "IO::Seekable::setpos()";
+}
+
+# end of POSIX::fsetpos
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fstat.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fstat.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fstat.al	(revision 14489)
@@ -0,0 +1,17 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 566 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fstat.al)"
+sub fstat {
+    usage "fstat(fd)" if @_ != 1;
+    local *TMP;
+    CORE::open(TMP, "<&$_[0]");		# Gross.
+    my @l = CORE::stat(TMP);
+    CORE::close(TMP);
+    @l;
+}
+
+# end of POSIX::fstat
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fsync.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fsync.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fsync.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 285 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fsync.al)"
+sub fsync {
+    redef "IO::Handle::sync()";
+}
+
+# end of POSIX::fsync
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ftell.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ftell.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ftell.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 305 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\ftell.al)"
+sub ftell {
+    redef "IO::Seekable::tell()";
+}
+
+# end of POSIX::ftell
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fwrite.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fwrite.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/fwrite.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 309 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\fwrite.al)"
+sub fwrite {
+    unimpl "fwrite() is C-specific--use print instead";
+}
+
+# end of POSIX::fwrite
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getc.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getc.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getc.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 313 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getc.al)"
+sub getc {
+    usage "getc(handle)" if @_ != 1;
+    CORE::getc($_[0]);
+}
+
+# end of POSIX::getc
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getchar.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getchar.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getchar.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 318 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getchar.al)"
+sub getchar {
+    usage "getchar()" if @_ != 0;
+    CORE::getc(STDIN);
+}
+
+# end of POSIX::getchar
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getegid.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getegid.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getegid.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 659 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getegid.al)"
+sub getegid {
+    usage "getegid()" if @_ != 0;
+    $) + 0;
+}
+
+# end of POSIX::getegid
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getenv.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getenv.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getenv.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 440 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getenv.al)"
+sub getenv {
+    usage "getenv(name)" if @_ != 1;
+    $ENV{$_[0]};
+}
+
+# end of POSIX::getenv
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/geteuid.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/geteuid.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/geteuid.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 664 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\geteuid.al)"
+sub geteuid {
+    usage "geteuid()" if @_ != 0;
+    $> + 0;
+}
+
+# end of POSIX::geteuid
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgid.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgid.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgid.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 669 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getgid.al)"
+sub getgid {
+    usage "getgid()" if @_ != 0;
+    $( + 0;
+}
+
+# end of POSIX::getgid
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgrgid.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgrgid.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgrgid.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 135 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getgrgid.al)"
+sub getgrgid {
+    usage "getgrgid(gid)" if @_ != 1;
+    CORE::getgrgid($_[0]);
+}
+
+# end of POSIX::getgrgid
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgrnam.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgrnam.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgrnam.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 140 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getgrnam.al)"
+sub getgrnam {
+    usage "getgrnam(name)" if @_ != 1;
+    CORE::getgrnam($_[0]);
+}
+
+# end of POSIX::getgrnam
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgroups.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgroups.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getgroups.al	(revision 14489)
@@ -0,0 +1,14 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 674 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getgroups.al)"
+sub getgroups {
+    usage "getgroups()" if @_ != 0;
+    my %seen;
+    grep(!$seen{$_}++, split(' ', $) ));
+}
+
+# end of POSIX::getgroups
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getlogin.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getlogin.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getlogin.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 680 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getlogin.al)"
+sub getlogin {
+    usage "getlogin()" if @_ != 0;
+    CORE::getlogin();
+}
+
+# end of POSIX::getlogin
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpgrp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpgrp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpgrp.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 685 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getpgrp.al)"
+sub getpgrp {
+    usage "getpgrp()" if @_ != 0;
+    CORE::getpgrp;
+}
+
+# end of POSIX::getpgrp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpid.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpid.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpid.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 690 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getpid.al)"
+sub getpid {
+    usage "getpid()" if @_ != 0;
+    $$;
+}
+
+# end of POSIX::getpid
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getppid.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getppid.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getppid.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 695 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getppid.al)"
+sub getppid {
+    usage "getppid()" if @_ != 0;
+    CORE::getppid;
+}
+
+# end of POSIX::getppid
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpwnam.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpwnam.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpwnam.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 185 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getpwnam.al)"
+sub getpwnam {
+    usage "getpwnam(name)" if @_ != 1;
+    CORE::getpwnam($_[0]);
+}
+
+# end of POSIX::getpwnam
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpwuid.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpwuid.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getpwuid.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 190 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getpwuid.al)"
+sub getpwuid {
+    usage "getpwuid(uid)" if @_ != 1;
+    CORE::getpwuid($_[0]);
+}
+
+# end of POSIX::getpwuid
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/gets.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/gets.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/gets.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 323 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\gets.al)"
+sub gets {
+    usage "gets()" if @_ != 0;
+    scalar <STDIN>;
+}
+
+# end of POSIX::gets
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getuid.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getuid.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/getuid.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 700 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\getuid.al)"
+sub getuid {
+    usage "getuid()" if @_ != 0;
+    $<;
+}
+
+# end of POSIX::getuid
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/gmtime.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/gmtime.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/gmtime.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 600 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\gmtime.al)"
+sub gmtime {
+    usage "gmtime(time)" if @_ != 1;
+    CORE::gmtime($_[0]);
+}
+
+# end of POSIX::gmtime
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/isatty.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/isatty.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/isatty.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 705 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\isatty.al)"
+sub isatty {
+    usage "isatty(filehandle)" if @_ != 1;
+    -t $_[0];
+}
+
+# end of POSIX::isatty
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/kill.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/kill.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/kill.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 211 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\kill.al)"
+sub kill {
+    usage "kill(pid, sig)" if @_ != 2;
+    CORE::kill $_[1], $_[0];
+}
+
+# end of POSIX::kill
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/labs.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/labs.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/labs.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 445 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\labs.al)"
+sub labs {
+    unimpl "labs() is C-specific, use abs instead";
+}
+
+# end of POSIX::labs
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ldiv.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ldiv.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ldiv.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 449 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\ldiv.al)"
+sub ldiv {
+    unimpl "ldiv() is C-specific, use /, % and int instead";
+}
+
+# end of POSIX::ldiv
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/link.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/link.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/link.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 710 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\link.al)"
+sub link {
+    usage "link(oldfilename, newfilename)" if @_ != 2;
+    CORE::link($_[0], $_[1]);
+}
+
+# end of POSIX::link
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/load_imports.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/load_imports.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/load_imports.al	(revision 14489)
@@ -0,0 +1,225 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 743 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\load_imports.al)"
+sub load_imports {
+%EXPORT_TAGS = (
+
+    assert_h =>	[qw(assert NDEBUG)],
+
+    ctype_h =>	[qw(isalnum isalpha iscntrl isdigit isgraph islower
+		isprint ispunct isspace isupper isxdigit tolower toupper)],
+
+    dirent_h =>	[],
+
+    errno_h =>	[qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
+		EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
+		ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
+		EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
+		EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
+		EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
+		ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
+		ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
+		ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
+		EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
+		ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
+		ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
+		EUSERS EWOULDBLOCK EXDEV errno)],
+
+    fcntl_h =>	[qw(FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_RDLCK
+		F_SETFD F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK
+		O_ACCMODE O_APPEND O_CREAT O_EXCL O_NOCTTY O_NONBLOCK
+		O_RDONLY O_RDWR O_TRUNC O_WRONLY
+		creat
+		SEEK_CUR SEEK_END SEEK_SET
+		S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
+		S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG S_ISUID
+		S_IWGRP S_IWOTH S_IWUSR)],
+
+    float_h =>	[qw(DBL_DIG DBL_EPSILON DBL_MANT_DIG
+		DBL_MAX DBL_MAX_10_EXP DBL_MAX_EXP
+		DBL_MIN DBL_MIN_10_EXP DBL_MIN_EXP
+		FLT_DIG FLT_EPSILON FLT_MANT_DIG
+		FLT_MAX FLT_MAX_10_EXP FLT_MAX_EXP
+		FLT_MIN FLT_MIN_10_EXP FLT_MIN_EXP
+		FLT_RADIX FLT_ROUNDS
+		LDBL_DIG LDBL_EPSILON LDBL_MANT_DIG
+		LDBL_MAX LDBL_MAX_10_EXP LDBL_MAX_EXP
+		LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP)],
+
+    grp_h =>	[],
+
+    limits_h =>	[qw( ARG_MAX CHAR_BIT CHAR_MAX CHAR_MIN CHILD_MAX
+		INT_MAX INT_MIN LINK_MAX LONG_MAX LONG_MIN MAX_CANON
+		MAX_INPUT MB_LEN_MAX NAME_MAX NGROUPS_MAX OPEN_MAX
+		PATH_MAX PIPE_BUF SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN
+		SSIZE_MAX STREAM_MAX TZNAME_MAX UCHAR_MAX UINT_MAX
+		ULONG_MAX USHRT_MAX _POSIX_ARG_MAX _POSIX_CHILD_MAX
+		_POSIX_LINK_MAX _POSIX_MAX_CANON _POSIX_MAX_INPUT
+		_POSIX_NAME_MAX _POSIX_NGROUPS_MAX _POSIX_OPEN_MAX
+		_POSIX_PATH_MAX _POSIX_PIPE_BUF _POSIX_SSIZE_MAX
+		_POSIX_STREAM_MAX _POSIX_TZNAME_MAX)],
+
+    locale_h =>	[qw(LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES
+		    LC_MONETARY LC_NUMERIC LC_TIME NULL
+		    localeconv setlocale)],
+
+    math_h =>	[qw(HUGE_VAL acos asin atan ceil cosh fabs floor fmod
+		frexp ldexp log10 modf pow sinh tan tanh)],
+
+    pwd_h =>	[],
+
+    setjmp_h =>	[qw(longjmp setjmp siglongjmp sigsetjmp)],
+
+    signal_h =>	[qw(SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK
+		SA_RESETHAND SA_RESTART SA_SIGINFO SIGABRT SIGALRM
+		SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL
+		SIGPIPE SIGQUIT SIGSEGV SIGSTOP SIGTERM SIGTSTP SIGTTIN
+		SIGTTOU SIGUSR1 SIGUSR2 SIG_BLOCK SIG_DFL SIG_ERR
+		SIG_IGN SIG_SETMASK SIG_UNBLOCK raise sigaction signal
+		sigpending sigprocmask sigsuspend)],
+
+    stdarg_h =>	[],
+
+    stddef_h =>	[qw(NULL offsetof)],
+
+    stdio_h =>	[qw(BUFSIZ EOF FILENAME_MAX L_ctermid L_cuserid
+		L_tmpname NULL SEEK_CUR SEEK_END SEEK_SET
+		STREAM_MAX TMP_MAX stderr stdin stdout
+		clearerr fclose fdopen feof ferror fflush fgetc fgetpos
+		fgets fopen fprintf fputc fputs fread freopen
+		fscanf fseek fsetpos ftell fwrite getchar gets
+		perror putc putchar puts remove rewind
+		scanf setbuf setvbuf sscanf tmpfile tmpnam
+		ungetc vfprintf vprintf vsprintf)],
+
+    stdlib_h =>	[qw(EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX NULL RAND_MAX
+		abort atexit atof atoi atol bsearch calloc div
+		free getenv labs ldiv malloc mblen mbstowcs mbtowc
+		qsort realloc strtod strtol strtoul wcstombs wctomb)],
+
+    string_h =>	[qw(NULL memchr memcmp memcpy memmove memset strcat
+		strchr strcmp strcoll strcpy strcspn strerror strlen
+		strncat strncmp strncpy strpbrk strrchr strspn strstr
+		strtok strxfrm)],
+
+    sys_stat_h => [qw(S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
+		S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG
+		S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR
+		fstat mkfifo)],
+
+    sys_times_h => [],
+
+    sys_types_h => [],
+
+    sys_utsname_h => [qw(uname)],
+
+    sys_wait_h => [qw(WEXITSTATUS WIFEXITED WIFSIGNALED WIFSTOPPED
+		WNOHANG WSTOPSIG WTERMSIG WUNTRACED)],
+
+    termios_h => [qw( B0 B110 B1200 B134 B150 B1800 B19200 B200 B2400
+		B300 B38400 B4800 B50 B600 B75 B9600 BRKINT CLOCAL
+		CREAD CS5 CS6 CS7 CS8 CSIZE CSTOPB ECHO ECHOE ECHOK
+		ECHONL HUPCL ICANON ICRNL IEXTEN IGNBRK IGNCR IGNPAR
+		INLCR INPCK ISIG ISTRIP IXOFF IXON NCCS NOFLSH OPOST
+		PARENB PARMRK PARODD TCIFLUSH TCIOFF TCIOFLUSH TCION
+		TCOFLUSH TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW
+		TOSTOP VEOF VEOL VERASE VINTR VKILL VMIN VQUIT VSTART
+		VSTOP VSUSP VTIME
+		cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcdrain
+		tcflow tcflush tcgetattr tcsendbreak tcsetattr )],
+
+    time_h =>	[qw(CLK_TCK CLOCKS_PER_SEC NULL asctime clock ctime
+		difftime mktime strftime tzset tzname)],
+
+    unistd_h =>	[qw(F_OK NULL R_OK SEEK_CUR SEEK_END SEEK_SET
+		STDERR_FILENO STDIN_FILENO STDOUT_FILENO W_OK X_OK
+		_PC_CHOWN_RESTRICTED _PC_LINK_MAX _PC_MAX_CANON
+		_PC_MAX_INPUT _PC_NAME_MAX _PC_NO_TRUNC _PC_PATH_MAX
+		_PC_PIPE_BUF _PC_VDISABLE _POSIX_CHOWN_RESTRICTED
+		_POSIX_JOB_CONTROL _POSIX_NO_TRUNC _POSIX_SAVED_IDS
+		_POSIX_VDISABLE _POSIX_VERSION _SC_ARG_MAX
+		_SC_CHILD_MAX _SC_CLK_TCK _SC_JOB_CONTROL
+		_SC_NGROUPS_MAX _SC_OPEN_MAX _SC_PAGESIZE _SC_SAVED_IDS
+		_SC_STREAM_MAX _SC_TZNAME_MAX _SC_VERSION
+		_exit access ctermid cuserid
+		dup2 dup execl execle execlp execv execve execvp
+		fpathconf fsync getcwd getegid geteuid getgid getgroups
+		getpid getuid isatty lseek pathconf pause setgid setpgid
+		setsid setuid sysconf tcgetpgrp tcsetpgrp ttyname)],
+
+    utime_h =>	[],
+
+);
+
+# Exporter::export_tags();
+for (values %EXPORT_TAGS) {
+  push @EXPORT, @$_;
+}
+
+@EXPORT_OK = qw(
+		abs
+		alarm
+		atan2
+		chdir
+		chmod
+		chown
+		close
+		closedir
+		cos
+		exit
+		exp
+		fcntl
+		fileno
+		fork
+		getc
+		getgrgid
+		getgrnam
+		getlogin
+		getpgrp
+		getppid
+		getpwnam
+		getpwuid
+		gmtime
+		isatty
+		kill
+		lchown
+		link
+		localtime
+		log
+		mkdir
+		nice
+		open
+		opendir
+		pipe
+		printf
+		rand
+		read
+		readdir
+		rename
+		rewinddir
+		rmdir
+		sin
+		sleep
+		sprintf
+		sqrt
+		srand
+		stat
+		system
+		time
+		times
+		umask
+		unlink
+		utime
+		wait
+		waitpid
+		write
+);
+
+require Exporter;
+}
+
+# end of POSIX::SigAction::load_imports
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/localtime.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/localtime.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/localtime.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 605 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\localtime.al)"
+sub localtime {
+    usage "localtime(time)" if @_ != 1;
+    CORE::localtime($_[0]);
+}
+
+# end of POSIX::localtime
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/log.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/log.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/log.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 165 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\log.al)"
+sub log {
+    usage "log(x)" if @_ != 1;
+    CORE::log($_[0]);
+}
+
+# end of POSIX::log
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/longjmp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/longjmp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/longjmp.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 195 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\longjmp.al)"
+sub longjmp {
+    unimpl "longjmp() is C-specific: use die instead";
+}
+
+# end of POSIX::longjmp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/malloc.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/malloc.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/malloc.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 453 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\malloc.al)"
+sub malloc {
+    unimpl "malloc() is C-specific, stopped";
+}
+
+# end of POSIX::malloc
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memchr.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memchr.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memchr.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 478 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\memchr.al)"
+sub memchr {
+    unimpl "memchr() is C-specific, use index() instead";
+}
+
+# end of POSIX::memchr
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memcmp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memcmp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memcmp.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 482 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\memcmp.al)"
+sub memcmp {
+    unimpl "memcmp() is C-specific, use eq instead";
+}
+
+# end of POSIX::memcmp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memcpy.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memcpy.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memcpy.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 486 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\memcpy.al)"
+sub memcpy {
+    unimpl "memcpy() is C-specific, use = instead";
+}
+
+# end of POSIX::memcpy
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memmove.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memmove.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memmove.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 490 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\memmove.al)"
+sub memmove {
+    unimpl "memmove() is C-specific, use = instead";
+}
+
+# end of POSIX::memmove
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memset.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memset.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/memset.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 494 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\memset.al)"
+sub memset {
+    unimpl "memset() is C-specific, use x instead";
+}
+
+# end of POSIX::memset
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/mkdir.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/mkdir.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/mkdir.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 575 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\mkdir.al)"
+sub mkdir {
+    usage "mkdir(directoryname, mode)" if @_ != 2;
+    CORE::mkdir($_[0], $_[1]);
+}
+
+# end of POSIX::mkdir
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/offsetof.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/offsetof.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/offsetof.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 221 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\offsetof.al)"
+sub offsetof {
+    unimpl "offsetof() is C-specific, stopped";
+}
+
+# end of POSIX::offsetof
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/opendir.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/opendir.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/opendir.al	(revision 14489)
@@ -0,0 +1,16 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 102 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\opendir.al)"
+sub opendir {
+    usage "opendir(directory)" if @_ != 1;
+    my $dirhandle;
+    CORE::opendir($dirhandle, $_[0])
+	? $dirhandle
+	: undef;
+}
+
+# end of POSIX::opendir
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/perror.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/perror.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/perror.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 328 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\perror.al)"
+sub perror {
+    print STDERR "@_: " if @_;
+    print STDERR $!,"\n";
+}
+
+# end of POSIX::perror
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/pow.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/pow.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/pow.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 170 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\pow.al)"
+sub pow {
+    usage "pow(x,exponent)" if @_ != 2;
+    $_[0] ** $_[1];
+}
+
+# end of POSIX::pow
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/printf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/printf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/printf.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 333 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\printf.al)"
+sub printf {
+    usage "printf(pattern, args...)" if @_ < 1;
+    CORE::printf STDOUT @_;
+}
+
+# end of POSIX::printf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/putc.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/putc.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/putc.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 338 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\putc.al)"
+sub putc {
+    unimpl "putc() is C-specific--use print instead";
+}
+
+# end of POSIX::putc
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/putchar.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/putchar.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/putchar.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 342 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\putchar.al)"
+sub putchar {
+    unimpl "putchar() is C-specific--use print instead";
+}
+
+# end of POSIX::putchar
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/puts.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/puts.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/puts.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 346 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\puts.al)"
+sub puts {
+    unimpl "puts() is C-specific--use print instead";
+}
+
+# end of POSIX::puts
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/qsort.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/qsort.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/qsort.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 457 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\qsort.al)"
+sub qsort {
+    unimpl "qsort() is C-specific, use sort instead";
+}
+
+# end of POSIX::qsort
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/raise.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/raise.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/raise.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 216 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\raise.al)"
+sub raise {
+    usage "raise(sig)" if @_ != 1;
+    CORE::kill $_[0], $$;	# Is this good enough?
+}
+
+# end of POSIX::raise
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rand.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rand.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rand.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 461 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\rand.al)"
+sub rand {
+    unimpl "rand() is non-portable, use Perl's rand instead";
+}
+
+# end of POSIX::rand
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/readdir.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/readdir.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/readdir.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 110 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\readdir.al)"
+sub readdir {
+    usage "readdir(dirhandle)" if @_ != 1;
+    CORE::readdir($_[0]);
+}
+
+# end of POSIX::readdir
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/realloc.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/realloc.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/realloc.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 465 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\realloc.al)"
+sub realloc {
+    unimpl "realloc() is C-specific, stopped";
+}
+
+# end of POSIX::realloc
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/redef.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/redef.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/redef.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 69 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\redef.al)"
+sub redef {
+    my ($mess) = @_;
+    croak "Use method $mess instead";
+}
+
+# end of POSIX::redef
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/remove.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/remove.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/remove.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 350 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\remove.al)"
+sub remove {
+    usage "remove(filename)" if @_ != 1;
+    CORE::unlink($_[0]);
+}
+
+# end of POSIX::remove
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rename.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rename.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rename.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 355 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\rename.al)"
+sub rename {
+    usage "rename(oldfilename, newfilename)" if @_ != 2;
+    CORE::rename($_[0], $_[1]);
+}
+
+# end of POSIX::rename
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rewind.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rewind.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rewind.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 360 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\rewind.al)"
+sub rewind {
+    usage "rewind(filehandle)" if @_ != 1;
+    CORE::seek($_[0],0,0);
+}
+
+# end of POSIX::rewind
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rewinddir.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rewinddir.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rewinddir.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 115 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\rewinddir.al)"
+sub rewinddir {
+    usage "rewinddir(dirhandle)" if @_ != 1;
+    CORE::rewinddir($_[0]);
+}
+
+# end of POSIX::rewinddir
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rmdir.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rmdir.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/rmdir.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 715 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\rmdir.al)"
+sub rmdir {
+    usage "rmdir(directoryname)" if @_ != 1;
+    CORE::rmdir($_[0]);
+}
+
+# end of POSIX::rmdir
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/scanf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/scanf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/scanf.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 365 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\scanf.al)"
+sub scanf {
+    unimpl "scanf() is C-specific--use <> and regular expressions instead";
+}
+
+# end of POSIX::scanf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/setbuf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/setbuf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/setbuf.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 720 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\setbuf.al)"
+sub setbuf {
+    redef "IO::Handle::setbuf()";
+}
+
+# end of POSIX::setbuf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/setjmp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/setjmp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/setjmp.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 199 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\setjmp.al)"
+sub setjmp {
+    unimpl "setjmp() is C-specific: use eval {} instead";
+}
+
+# end of POSIX::setjmp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/setvbuf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/setvbuf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/setvbuf.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 724 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\setvbuf.al)"
+sub setvbuf {
+    redef "IO::Handle::setvbuf()";
+}
+
+# end of POSIX::setvbuf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/siglongjmp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/siglongjmp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/siglongjmp.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 203 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\siglongjmp.al)"
+sub siglongjmp {
+    unimpl "siglongjmp() is C-specific: use die instead";
+}
+
+# end of POSIX::siglongjmp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sigsetjmp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sigsetjmp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sigsetjmp.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 207 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sigsetjmp.al)"
+sub sigsetjmp {
+    unimpl "sigsetjmp() is C-specific: use eval {} instead";
+}
+
+# end of POSIX::sigsetjmp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sin.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sin.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sin.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 175 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sin.al)"
+sub sin {
+    usage "sin(x)" if @_ != 1;
+    CORE::sin($_[0]);
+}
+
+# end of POSIX::sin
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sleep.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sleep.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sleep.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 728 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sleep.al)"
+sub sleep {
+    usage "sleep(seconds)" if @_ != 1;
+    $_[0] - CORE::sleep($_[0]);
+}
+
+# end of POSIX::sleep
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sprintf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sprintf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sprintf.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 369 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sprintf.al)"
+sub sprintf {
+    usage "sprintf(pattern,args)" if @_ == 0;
+    CORE::sprintf(shift,@_);
+}
+
+# end of POSIX::sprintf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sqrt.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sqrt.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sqrt.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 180 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sqrt.al)"
+sub sqrt {
+    usage "sqrt(x)" if @_ != 1;
+    CORE::sqrt($_[0]);
+}
+
+# end of POSIX::sqrt
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/srand.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/srand.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/srand.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 469 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\srand.al)"
+sub srand {
+    unimpl "srand()";
+}
+
+# end of POSIX::srand
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sscanf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sscanf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/sscanf.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 374 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\sscanf.al)"
+sub sscanf {
+    unimpl "sscanf() is C-specific--use regular expressions instead";
+}
+
+# end of POSIX::sscanf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/stat.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/stat.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/stat.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 580 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\stat.al)"
+sub stat {
+    usage "stat(filename)" if @_ != 1;
+    CORE::stat($_[0]);
+}
+
+# end of POSIX::stat
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcat.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcat.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcat.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 498 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strcat.al)"
+sub strcat {
+    unimpl "strcat() is C-specific, use .= instead";
+}
+
+# end of POSIX::strcat
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strchr.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strchr.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strchr.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 502 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strchr.al)"
+sub strchr {
+    unimpl "strchr() is C-specific, use index() instead";
+}
+
+# end of POSIX::strchr
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcmp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcmp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcmp.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 506 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strcmp.al)"
+sub strcmp {
+    unimpl "strcmp() is C-specific, use eq instead";
+}
+
+# end of POSIX::strcmp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcpy.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcpy.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcpy.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 510 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strcpy.al)"
+sub strcpy {
+    unimpl "strcpy() is C-specific, use = instead";
+}
+
+# end of POSIX::strcpy
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcspn.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcspn.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strcspn.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 514 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strcspn.al)"
+sub strcspn {
+    unimpl "strcspn() is C-specific, use regular expressions instead";
+}
+
+# end of POSIX::strcspn
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strerror.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strerror.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strerror.al	(revision 14489)
@@ -0,0 +1,14 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 518 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strerror.al)"
+sub strerror {
+    usage "strerror(errno)" if @_ != 1;
+    local $! = $_[0];
+    $! . "";
+}
+
+# end of POSIX::strerror
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strlen.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strlen.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strlen.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 524 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strlen.al)"
+sub strlen {
+    unimpl "strlen() is C-specific, use length instead";
+}
+
+# end of POSIX::strlen
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strncat.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strncat.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strncat.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 528 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strncat.al)"
+sub strncat {
+    unimpl "strncat() is C-specific, use .= instead";
+}
+
+# end of POSIX::strncat
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strncmp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strncmp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strncmp.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 532 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strncmp.al)"
+sub strncmp {
+    unimpl "strncmp() is C-specific, use eq instead";
+}
+
+# end of POSIX::strncmp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strncpy.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strncpy.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strncpy.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 536 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strncpy.al)"
+sub strncpy {
+    unimpl "strncpy() is C-specific, use = instead";
+}
+
+# end of POSIX::strncpy
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strpbrk.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strpbrk.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strpbrk.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 540 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strpbrk.al)"
+sub strpbrk {
+    unimpl "strpbrk() is C-specific, stopped";
+}
+
+# end of POSIX::strpbrk
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strrchr.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strrchr.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strrchr.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 544 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strrchr.al)"
+sub strrchr {
+    unimpl "strrchr() is C-specific, use rindex() instead";
+}
+
+# end of POSIX::strrchr
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strspn.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strspn.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strspn.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 548 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strspn.al)"
+sub strspn {
+    unimpl "strspn() is C-specific, stopped";
+}
+
+# end of POSIX::strspn
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strstr.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strstr.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strstr.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 552 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strstr.al)"
+sub strstr {
+    usage "strstr(big, little)" if @_ != 2;
+    CORE::index($_[0], $_[1]);
+}
+
+# end of POSIX::strstr
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strtok.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strtok.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/strtok.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 557 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\strtok.al)"
+sub strtok {
+    unimpl "strtok() is C-specific, stopped";
+}
+
+# end of POSIX::strtok
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/system.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/system.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/system.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 473 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\system.al)"
+sub system {
+    usage "system(command)" if @_ != 1;
+    CORE::system($_[0]);
+}
+
+# end of POSIX::system
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/time.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/time.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/time.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 610 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\time.al)"
+sub time {
+    usage "time()" if @_ != 0;
+    CORE::time;
+}
+
+# end of POSIX::time
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/tmpfile.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/tmpfile.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/tmpfile.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 378 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\tmpfile.al)"
+sub tmpfile {
+    redef "IO::File::new_tmpfile()";
+}
+
+# end of POSIX::tmpfile
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/tolower.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/tolower.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/tolower.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 87 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\tolower.al)"
+sub tolower {
+    usage "tolower(string)" if @_ != 1;
+    lc($_[0]);
+}
+
+# end of POSIX::tolower
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/toupper.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/toupper.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/toupper.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 92 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\toupper.al)"
+sub toupper {
+    usage "toupper(string)" if @_ != 1;
+    uc($_[0]);
+}
+
+# end of POSIX::toupper
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/umask.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/umask.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/umask.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 585 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\umask.al)"
+sub umask {
+    usage "umask(mask)" if @_ != 1;
+    CORE::umask($_[0]);
+}
+
+# end of POSIX::umask
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ungetc.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ungetc.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/ungetc.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 382 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\ungetc.al)"
+sub ungetc {
+    redef "IO::Handle::ungetc()";
+}
+
+# end of POSIX::ungetc
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/unimpl.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/unimpl.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/unimpl.al	(revision 14489)
@@ -0,0 +1,14 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 74 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\unimpl.al)"
+sub unimpl {
+    my ($mess) = @_;
+    $mess =~ s/xxx//;
+    croak "Unimplemented: POSIX::$mess";
+}
+
+# end of POSIX::unimpl
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/unlink.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/unlink.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/unlink.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 733 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\unlink.al)"
+sub unlink {
+    usage "unlink(filename)" if @_ != 1;
+    CORE::unlink($_[0]);
+}
+
+# end of POSIX::unlink
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/usage.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/usage.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/usage.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 64 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\usage.al)"
+sub usage {
+    my ($mess) = @_;
+    croak "Usage: POSIX::$mess";
+}
+
+# end of POSIX::usage
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/utime.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/utime.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/utime.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 738 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\utime.al)"
+sub utime {
+    usage "utime(filename, atime, mtime)" if @_ != 3;
+    CORE::utime($_[1], $_[2], $_[0]);
+}
+
+# end of POSIX::utime
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/vfprintf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/vfprintf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/vfprintf.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 386 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\vfprintf.al)"
+sub vfprintf {
+    unimpl "vfprintf() is C-specific";
+}
+
+# end of POSIX::vfprintf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/vprintf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/vprintf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/vprintf.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 390 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\vprintf.al)"
+sub vprintf {
+    unimpl "vprintf() is C-specific";
+}
+
+# end of POSIX::vprintf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/vsprintf.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/vsprintf.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/vsprintf.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 394 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\vsprintf.al)"
+sub vsprintf {
+    unimpl "vsprintf() is C-specific";
+}
+
+# end of POSIX::vsprintf
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/wait.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/wait.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/wait.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 590 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\wait.al)"
+sub wait {
+    usage "wait()" if @_ != 0;
+    CORE::wait();
+}
+
+# end of POSIX::wait
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/waitpid.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/waitpid.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/POSIX/waitpid.al	(revision 14489)
@@ -0,0 +1,13 @@
+# NOTE: Derived from ..\..\lib\POSIX.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package POSIX;
+
+#line 595 "..\..\lib\POSIX.pm (autosplit into ..\..\lib\auto\POSIX\waitpid.al)"
+sub waitpid {
+    usage "waitpid(pid, options)" if @_ != 2;
+    CORE::waitpid($_[0], $_[1]);
+}
+
+# end of POSIX::waitpid
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/CAN_FLOCK.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/CAN_FLOCK.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/CAN_FLOCK.al	(revision 14489)
@@ -0,0 +1,21 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 81 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\CAN_FLOCK.al)"
+#
+# Determine whether locking is possible, but only when needed.
+#
+
+sub CAN_FLOCK; my $CAN_FLOCK; sub CAN_FLOCK {
+	return $CAN_FLOCK if defined $CAN_FLOCK;
+	require Config; import Config;
+	return $CAN_FLOCK =
+		$Config{'d_flock'} ||
+		$Config{'d_fcntl_can_lock'} ||
+		$Config{'d_lockf'};
+}
+
+# end of Storable::CAN_FLOCK
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_freeze.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_freeze.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_freeze.al	(revision 14489)
@@ -0,0 +1,23 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 281 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\_freeze.al)"
+# Internal freeze routine
+sub _freeze {
+	my $xsptr = shift;
+	my $self = shift;
+	logcroak "not a reference" unless ref($self);
+	logcroak "too many arguments" unless @_ == 0;	# No @foo in arglist
+	my $da = $@;				# Don't mess if called from exception handler
+	my $ret;
+	# Call C routine mstore or net_mstore, depending on network order
+	eval { $ret = &$xsptr($self) };
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	$@ = $da;
+	return $ret ? $ret : undef;
+}
+
+# end of Storable::_freeze
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_retrieve.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_retrieve.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_retrieve.al	(revision 14489)
@@ -0,0 +1,31 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 315 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\_retrieve.al)"
+# Internal retrieve routine
+sub _retrieve {
+	my ($file, $use_locking) = @_;
+	local *FILE;
+	open(FILE, $file) || logcroak "can't open $file: $!";
+	binmode FILE;							# Archaic systems...
+	my $self;
+	my $da = $@;							# Could be from exception handler
+	if ($use_locking) {
+		unless (&CAN_FLOCK) {
+			logcarp "Storable::lock_store: fcntl/flock emulation broken on $^O";
+			return undef;
+		}
+		flock(FILE, LOCK_SH) || logcroak "can't get shared lock on $file: $!";
+		# Unlocking will happen when FILE is closed
+	}
+	eval { $self = pretrieve(*FILE) };		# Call C routine
+	close(FILE);
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	$@ = $da;
+	return $self;
+}
+
+# end of Storable::_retrieve
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_store.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_store.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_store.al	(revision 14489)
@@ -0,0 +1,41 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 190 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\_store.al)"
+# Internal store to file routine
+sub _store {
+	my $xsptr = shift;
+	my $self = shift;
+	my ($file, $use_locking) = @_;
+	logcroak "not a reference" unless ref($self);
+	logcroak "wrong argument number" unless @_ == 2;	# No @foo in arglist
+	local *FILE;
+	if ($use_locking) {
+		open(FILE, ">>$file") || logcroak "can't write into $file: $!";
+		unless (&CAN_FLOCK) {
+			logcarp "Storable::lock_store: fcntl/flock emulation broken on $^O";
+			return undef;
+		}
+		flock(FILE, LOCK_EX) ||
+			logcroak "can't get exclusive lock on $file: $!";
+		truncate FILE, 0;
+		# Unlocking will happen when FILE is closed
+	} else {
+		open(FILE, ">$file") || logcroak "can't create $file: $!";
+	}
+	binmode FILE;				# Archaic systems...
+	my $da = $@;				# Don't mess if called from exception handler
+	my $ret;
+	# Call C routine nstore or pstore, depending on network order
+	eval { $ret = &$xsptr(*FILE, $self) };
+	close(FILE) or $ret = undef;
+	unlink($file) or warn "Can't unlink $file: $!\n" if $@ || !defined $ret;
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	$@ = $da;
+	return $ret ? $ret : undef;
+}
+
+# end of Storable::_store
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_store_fd.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_store_fd.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/_store_fd.al	(revision 14489)
@@ -0,0 +1,27 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 243 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\_store_fd.al)"
+# Internal store routine on opened file descriptor
+sub _store_fd {
+	my $xsptr = shift;
+	my $self = shift;
+	my ($file) = @_;
+	logcroak "not a reference" unless ref($self);
+	logcroak "too many arguments" unless @_ == 1;	# No @foo in arglist
+	my $fd = fileno($file);
+	logcroak "not a valid file descriptor" unless defined $fd;
+	my $da = $@;				# Don't mess if called from exception handler
+	my $ret;
+	# Call C routine nstore or pstore, depending on network order
+	eval { $ret = &$xsptr($file, $self) };
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	local $\; print $file '';	# Autoflush the file if wanted
+	$@ = $da;
+	return $ret ? $ret : undef;
+}
+
+# end of Storable::_store_fd
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/autosplit.ix
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/autosplit.ix	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/autosplit.ix	(revision 14489)
@@ -0,0 +1,25 @@
+# Index created by AutoSplit for ..\..\lib\Storable.pm
+#    (file acts as timestamp)
+package Storable;
+sub logcroak  ;
+sub logcarp  ;
+sub CAN_FLOCK ;
+sub show_file_magic  ;
+sub read_magic  ;
+sub store  ;
+sub nstore  ;
+sub lock_store  ;
+sub lock_nstore  ;
+sub _store  ;
+sub store_fd  ;
+sub nstore_fd  ;
+sub _store_fd  ;
+sub freeze  ;
+sub nfreeze  ;
+sub _freeze  ;
+sub retrieve  ;
+sub lock_retrieve  ;
+sub _retrieve  ;
+sub fd_retrieve  ;
+sub thaw  ;
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/fd_retrieve.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/fd_retrieve.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/fd_retrieve.al	(revision 14489)
@@ -0,0 +1,25 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 338 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\fd_retrieve.al)"
+#
+# fd_retrieve
+#
+# Same as retrieve, but perform from an already opened file descriptor instead.
+#
+sub fd_retrieve {
+	my ($file) = @_;
+	my $fd = fileno($file);
+	logcroak "not a valid file descriptor" unless defined $fd;
+	my $self;
+	my $da = $@;							# Could be from exception handler
+	eval { $self = pretrieve($file) };		# Call C routine
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	$@ = $da;
+	return $self;
+}
+
+# end of Storable::fd_retrieve
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/freeze.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/freeze.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/freeze.al	(revision 14489)
@@ -0,0 +1,18 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 262 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\freeze.al)"
+#
+# freeze
+#
+# Store oject and its hierarchy in memory and return a scalar
+# containing the result.
+#
+sub freeze {
+	_freeze(\&mstore, @_);
+}
+
+# end of Storable::freeze
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/lock_nstore.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/lock_nstore.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/lock_nstore.al	(revision 14489)
@@ -0,0 +1,17 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 181 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\lock_nstore.al)"
+#
+# lock_nstore
+#
+# Same as nstore, but flock the file first (advisory locking).
+#
+sub lock_nstore {
+	return _store(\&net_pstore, @_, 1);
+}
+
+# end of Storable::lock_nstore
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/lock_retrieve.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/lock_retrieve.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/lock_retrieve.al	(revision 14489)
@@ -0,0 +1,17 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 306 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\lock_retrieve.al)"
+#
+# lock_retrieve
+#
+# Same as retrieve, but with advisory locking.
+#
+sub lock_retrieve {
+	_retrieve($_[0], 1);
+}
+
+# end of Storable::lock_retrieve
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/lock_store.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/lock_store.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/lock_store.al	(revision 14489)
@@ -0,0 +1,17 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 172 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\lock_store.al)"
+#
+# lock_store
+#
+# Same as store, but flock the file first (advisory locking).
+#
+sub lock_store {
+	return _store(\&pstore, @_, 1);
+}
+
+# end of Storable::lock_store
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/logcarp.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/logcarp.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/logcarp.al	(revision 14489)
@@ -0,0 +1,12 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 77 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\logcarp.al)"
+sub logcarp {
+  Carp::carp(@_);
+}
+
+# end of Storable::logcarp
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/logcroak.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/logcroak.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/logcroak.al	(revision 14489)
@@ -0,0 +1,17 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 68 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\logcroak.al)"
+#
+# Use of Log::Agent is optional. If it hasn't imported these subs then
+# Autoloader will kindly supply our fallback implementation.
+#
+
+sub logcroak {
+    Carp::croak(@_);
+}
+
+# end of Storable::logcroak
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/nfreeze.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/nfreeze.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/nfreeze.al	(revision 14489)
@@ -0,0 +1,17 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 272 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\nfreeze.al)"
+#
+# nfreeze
+#
+# Same as freeze but in network order.
+#
+sub nfreeze {
+	_freeze(\&net_mstore, @_);
+}
+
+# end of Storable::nfreeze
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/nstore.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/nstore.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/nstore.al	(revision 14489)
@@ -0,0 +1,17 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 163 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\nstore.al)"
+#
+# nstore
+#
+# Same as store, but in network order.
+#
+sub nstore {
+	return _store(\&net_pstore, @_, 0);
+}
+
+# end of Storable::nstore
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/nstore_fd.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/nstore_fd.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/nstore_fd.al	(revision 14489)
@@ -0,0 +1,18 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 233 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\nstore_fd.al)"
+#
+# nstore_fd
+#
+# Same as store_fd, but in network order.
+#
+sub nstore_fd {
+	my ($self, $file) = @_;
+	return _store_fd(\&net_pstore, @_);
+}
+
+# end of Storable::nstore_fd
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/read_magic.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/read_magic.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/read_magic.al	(revision 14489)
@@ -0,0 +1,43 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 116 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\read_magic.al)"
+sub read_magic {
+  my $header = shift;
+  return unless defined $header and length $header > 11;
+  my $result;
+  if ($header =~ s/^perl-store//) {
+    die "Can't deal with version 0 headers";
+  } elsif ($header =~ s/^pst0//) {
+    $result->{file} = 1;
+  }
+  # Assume it's a string.
+  my ($major, $minor, $bytelen) = unpack "C3", $header;
+
+  my $net_order = $major & 1;
+  $major >>= 1;
+  @$result{qw(major minor netorder)} = ($major, $minor, $net_order);
+
+  return $result if $net_order;
+
+  # I assume that it is rare to find v1 files, so this is an intentionally
+  # inefficient way of doing it, to make the rest of the code constant.
+  if ($major < 2) {
+    delete $result->{minor};
+    $header = '.' . $header;
+    $bytelen = $minor;
+  }
+
+  @$result{qw(byteorder intsize longsize ptrsize)} =
+    unpack "x3 A$bytelen C3", $header;
+
+  if ($major >= 2 and $minor >= 2) {
+    $result->{nvsize} = unpack "x6 x$bytelen C", $header;
+  }
+  $result;
+}
+
+# end of Storable::read_magic
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/retrieve.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/retrieve.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/retrieve.al	(revision 14489)
@@ -0,0 +1,18 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 296 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\retrieve.al)"
+#
+# retrieve
+#
+# Retrieve object hierarchy from disk, returning a reference to the root
+# object of that tree.
+#
+sub retrieve {
+	_retrieve($_[0], 0);
+}
+
+# end of Storable::retrieve
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/show_file_magic.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/show_file_magic.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/show_file_magic.al	(revision 14489)
@@ -0,0 +1,30 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 94 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\show_file_magic.al)"
+sub show_file_magic {
+    print <<EOM;
+#
+# To recognize the data files of the Perl module Storable,
+# the following lines need to be added to the local magic(5) file,
+# usually either /usr/share/misc/magic or /etc/magic.
+#
+0	string	perl-store	perl Storable(v0.6) data
+>4	byte	>0	(net-order %d)
+>>4	byte	&01	(network-ordered)
+>>4	byte	=3	(major 1)
+>>4	byte	=2	(major 1)
+
+0	string	pst0	perl Storable(v0.7) data
+>4	byte	>0
+>>4	byte	&01	(network-ordered)
+>>4	byte	=5	(major 2)
+>>4	byte	=4	(major 2)
+>>5	byte	>0	(minor %d)
+EOM
+}
+
+# end of Storable::show_file_magic
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/store.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/store.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/store.al	(revision 14489)
@@ -0,0 +1,20 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 151 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\store.al)"
+#
+# store
+#
+# Store target object hierarchy, identified by a reference to its root.
+# The stored object tree may later be retrieved to memory via retrieve.
+# Returns undef if an I/O error occurred, in which case the file is
+# removed.
+#
+sub store {
+	return _store(\&pstore, @_, 0);
+}
+
+# end of Storable::store
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/store_fd.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/store_fd.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/store_fd.al	(revision 14489)
@@ -0,0 +1,18 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 223 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\store_fd.al)"
+#
+# store_fd
+#
+# Same as store, but perform on an already opened file descriptor instead.
+# Returns undef if an I/O error occurred.
+#
+sub store_fd {
+	return _store_fd(\&pstore, @_);
+}
+
+# end of Storable::store_fd
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/thaw.al
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/thaw.al	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Storable/thaw.al	(revision 14489)
@@ -0,0 +1,28 @@
+# NOTE: Derived from ..\..\lib\Storable.pm.
+# Changes made here will be lost when autosplit is run again.
+# See AutoSplit.pm.
+package Storable;
+
+#line 355 "..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\thaw.al)"
+#
+# thaw
+#
+# Recreate objects in memory from an existing frozen image created
+# by freeze.  If the frozen image passed is undef, return undef.
+#
+sub thaw {
+	my ($frozen) = @_;
+	return undef unless defined $frozen;
+	my $self;
+	my $da = $@;							# Could be from exception handler
+	eval { $self = mretrieve($frozen) };	# Call C routine
+	logcroak $@ if $@ =~ s/\.?\n$/,/;
+	$@ = $da;
+	return $self;
+}
+
+1;
+__END__
+
+1;
+# end of Storable::thaw
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/Sys/Hostname/autosplit.ix
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/Sys/Hostname/autosplit.ix	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/Sys/Hostname/autosplit.ix	(revision 14489)
@@ -0,0 +1,3 @@
+# Index created by AutoSplit for ..\..\..\lib\Sys\Hostname.pm
+#    (file acts as timestamp)
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/XML/Parser/.packlist
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/XML/Parser/.packlist	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/XML/Parser/.packlist	(revision 14489)
@@ -0,0 +1,32 @@
+C:\shaoqunWu\perl\lib\XML\Parser.pm
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\Japanese_Encodings.msg
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\README
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\big5.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\euc-kr.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\iso-8859-2.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\iso-8859-3.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\iso-8859-4.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\iso-8859-5.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\iso-8859-7.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\iso-8859-8.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\iso-8859-9.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\windows-1250.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\windows-1252.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\x-euc-jp-jisx0221.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\x-euc-jp-unicode.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\x-sjis-cp932.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\x-sjis-jdk117.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\x-sjis-jisx0221.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Encodings\x-sjis-unicode.enc
+C:\shaoqunWu\perl\lib\XML\Parser\Expat.pm
+C:\shaoqunWu\perl\lib\XML\Parser\LWPExternEnt.pl
+C:\shaoqunWu\perl\lib\XML\Parser\Style\Debug.pm
+C:\shaoqunWu\perl\lib\XML\Parser\Style\Objects.pm
+C:\shaoqunWu\perl\lib\XML\Parser\Style\Stream.pm
+C:\shaoqunWu\perl\lib\XML\Parser\Style\Subs.pm
+C:\shaoqunWu\perl\lib\XML\Parser\Style\Tree.pm
+C:\shaoqunWu\perl\lib\auto\XML\Parser\Expat\Expat.bs
+C:\shaoqunWu\perl\lib\auto\XML\Parser\Expat\Expat.dll
+C:\shaoqunWu\perl\lib\auto\XML\Parser\Expat\Expat.exp
+C:\shaoqunWu\perl\lib\auto\XML\Parser\Expat\Expat.lib
+C:\shaoqunWu\perl\lib\auto\XML\Parser\Expat\Expat.pdb
Index: /for-distributions/trunk/bin/windows/perl/lib/auto/sdbm/extralibs.ld
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/auto/sdbm/extralibs.ld	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/auto/sdbm/extralibs.ld	(revision 14489)
@@ -0,0 +1,1 @@
+
Index: /for-distributions/trunk/bin/windows/perl/lib/autouse.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/autouse.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/autouse.pm	(revision 14489)
@@ -0,0 +1,170 @@
+package autouse;
+
+#use strict;		# debugging only
+use 5.003_90;		# ->can, for my $var
+
+$autouse::VERSION = '1.05';
+
+$autouse::DEBUG ||= 0;
+
+sub vet_import ($);
+
+sub croak {
+    require Carp;
+    Carp::croak(@_);
+}
+
+sub import {
+    my $class = @_ ? shift : 'autouse';
+    croak "usage: use $class MODULE [,SUBS...]" unless @_;
+    my $module = shift;
+
+    (my $pm = $module) =~ s{::}{/}g;
+    $pm .= '.pm';
+    if (exists $INC{$pm}) {
+	vet_import $module;
+	local $Exporter::ExportLevel = $Exporter::ExportLevel + 1;
+	# $Exporter::Verbose = 1;
+	return $module->import(map { (my $f = $_) =~ s/\(.*?\)$//; $f } @_);
+    }
+
+    # It is not loaded: need to do real work.
+    my $callpkg = caller(0);
+    print "autouse called from $callpkg\n" if $autouse::DEBUG;
+
+    my $index;
+    for my $f (@_) {
+	my $proto;
+	$proto = $1 if (my $func = $f) =~ s/\((.*)\)$//;
+
+	my $closure_import_func = $func;	# Full name
+	my $closure_func = $func;		# Name inside package
+	my $index = rindex($func, '::');
+	if ($index == -1) {
+	    $closure_import_func = "${callpkg}::$func";
+	} else {
+	    $closure_func = substr $func, $index + 2;
+	    croak "autouse into different package attempted"
+		unless substr($func, 0, $index) eq $module;
+	}
+
+	my $load_sub = sub {
+	    unless ($INC{$pm}) {
+		require $pm;
+		vet_import $module;
+	    }
+            no warnings 'redefine';
+	    *$closure_import_func = \&{"${module}::$closure_func"};
+	    print "autousing $module; "
+		  ."imported $closure_func as $closure_import_func\n"
+		if $autouse::DEBUG;
+	    goto &$closure_import_func;
+	};
+
+	if (defined $proto) {
+	    *$closure_import_func = eval "sub ($proto) { goto &\$load_sub }"
+	        || die;
+	} else {
+	    *$closure_import_func = $load_sub;
+	}
+    }
+}
+
+sub vet_import ($) {
+    my $module = shift;
+    if (my $import = $module->can('import')) {
+	croak "autoused module has unique import() method"
+	    unless defined(&Exporter::import)
+		   && $import == \&Exporter::import;
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+autouse - postpone load of modules until a function is used
+
+=head1 SYNOPSIS
+
+  use autouse 'Carp' => qw(carp croak);
+  carp "this carp was predeclared and autoused ";
+
+=head1 DESCRIPTION
+
+If the module C<Module> is already loaded, then the declaration
+
+  use autouse 'Module' => qw(func1 func2($;$));
+
+is equivalent to
+
+  use Module qw(func1 func2);
+
+if C<Module> defines func2() with prototype C<($;$)>, and func1() has
+no prototypes.  (At least if C<Module> uses C<Exporter>'s C<import>,
+otherwise it is a fatal error.)
+
+If the module C<Module> is not loaded yet, then the above declaration
+declares functions func1() and func2() in the current package.  When
+these functions are called, they load the package C<Module> if needed,
+and substitute themselves with the correct definitions.
+
+=begin _deprecated
+
+   use Module qw(Module::func3);
+
+will work and is the equivalent to:
+
+   use Module qw(func3);
+
+It is not a very useful feature and has been deprecated.
+
+=end _deprecated
+
+
+=head1 WARNING
+
+Using C<autouse> will move important steps of your program's execution
+from compile time to runtime.  This can
+
+=over 4
+
+=item *
+
+Break the execution of your program if the module you C<autouse>d has
+some initialization which it expects to be done early.
+
+=item *
+
+hide bugs in your code since important checks (like correctness of
+prototypes) is moved from compile time to runtime.  In particular, if
+the prototype you specified on C<autouse> line is wrong, you will not
+find it out until the corresponding function is executed.  This will be
+very unfortunate for functions which are not always called (note that
+for such functions C<autouse>ing gives biggest win, for a workaround
+see below).
+
+=back
+
+To alleviate the second problem (partially) it is advised to write
+your scripts like this:
+
+  use Module;
+  use autouse Module => qw(carp($) croak(&$));
+  carp "this carp was predeclared and autoused ";
+
+The first line ensures that the errors in your argument specification
+are found early.  When you ship your application you should comment
+out the first line, since it makes the second one useless.
+
+=head1 AUTHOR
+
+Ilya Zakharevich (ilya@math.ohio-state.edu)
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/base.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/base.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/base.pm	(revision 14489)
@@ -0,0 +1,226 @@
+package base;
+
+use strict 'vars';
+use vars qw($VERSION);
+$VERSION = '2.07';
+
+# constant.pm is slow
+sub SUCCESS () { 1 }
+
+sub PUBLIC     () { 2**0  }
+sub PRIVATE    () { 2**1  }
+sub INHERITED  () { 2**2  }
+sub PROTECTED  () { 2**3  }
+
+
+my $Fattr = \%fields::attr;
+
+sub has_fields {
+    my($base) = shift;
+    my $fglob = ${"$base\::"}{FIELDS};
+    return( ($fglob && *$fglob{HASH}) ? 1 : 0 );
+}
+
+sub has_version {
+    my($base) = shift;
+    my $vglob = ${$base.'::'}{VERSION};
+    return( ($vglob && *$vglob{SCALAR}) ? 1 : 0 );
+}
+
+sub has_attr {
+    my($proto) = shift;
+    my($class) = ref $proto || $proto;
+    return exists $Fattr->{$class};
+}
+
+sub get_attr {
+    $Fattr->{$_[0]} = [1] unless $Fattr->{$_[0]};
+    return $Fattr->{$_[0]};
+}
+
+if ($] < 5.009) {
+    *get_fields = sub {
+	# Shut up a possible typo warning.
+	() = \%{$_[0].'::FIELDS'};
+	my $f = \%{$_[0].'::FIELDS'};
+
+	# should be centralized in fields? perhaps
+	# fields::mk_FIELDS_be_OK. Peh. As long as %{ $package . '::FIELDS' }
+	# is used here anyway, it doesn't matter.
+	bless $f, 'pseudohash' if (ref($f) ne 'pseudohash');
+
+	return $f;
+    }
+}
+else {
+    *get_fields = sub {
+	# Shut up a possible typo warning.
+	() = \%{$_[0].'::FIELDS'};
+	return \%{$_[0].'::FIELDS'};
+    }
+}
+
+sub import {
+    my $class = shift;
+
+    return SUCCESS unless @_;
+
+    # List of base classes from which we will inherit %FIELDS.
+    my $fields_base;
+
+    my $inheritor = caller(0);
+
+    foreach my $base (@_) {
+        next if $inheritor->isa($base);
+
+        if (has_version($base)) {
+	    ${$base.'::VERSION'} = '-1, set by base.pm' 
+	      unless defined ${$base.'::VERSION'};
+        }
+        else {
+            local $SIG{__DIE__};
+            eval "require $base";
+            # Only ignore "Can't locate" errors from our eval require.
+            # Other fatal errors (syntax etc) must be reported.
+            die if $@ && $@ !~ /^Can't locate .*? at \(eval /;
+            unless (%{"$base\::"}) {
+                require Carp;
+                Carp::croak(<<ERROR);
+Base class package "$base" is empty.
+    (Perhaps you need to 'use' the module which defines that package first.)
+ERROR
+
+            }
+            ${$base.'::VERSION'} = "-1, set by base.pm"
+              unless defined ${$base.'::VERSION'};
+        }
+        push @{"$inheritor\::ISA"}, $base;
+
+        if ( has_fields($base) || has_attr($base) ) {
+	    # No multiple fields inheritence *suck*
+	    if ($fields_base) {
+		require Carp;
+		Carp::croak("Can't multiply inherit %FIELDS");
+	    } else {
+		$fields_base = $base;
+	    }
+        }
+    }
+
+    if( defined $fields_base ) {
+        inherit_fields($inheritor, $fields_base);
+    }
+}
+
+
+sub inherit_fields {
+    my($derived, $base) = @_;
+
+    return SUCCESS unless $base;
+
+    my $battr = get_attr($base);
+    my $dattr = get_attr($derived);
+    my $dfields = get_fields($derived);
+    my $bfields = get_fields($base);
+
+    $dattr->[0] = @$battr;
+
+    if( keys %$dfields ) {
+        warn "$derived is inheriting from $base but already has its own ".
+             "fields!\n".
+             "This will cause problems.\n".
+             "Be sure you use base BEFORE declaring fields\n";
+    }
+
+    # Iterate through the base's fields adding all the non-private
+    # ones to the derived class.  Hang on to the original attribute
+    # (Public, Private, etc...) and add Inherited.
+    # This is all too complicated to do efficiently with add_fields().
+    while (my($k,$v) = each %$bfields) {
+        my $fno;
+	if ($fno = $dfields->{$k} and $fno != $v) {
+	    require Carp;
+	    Carp::croak ("Inherited %FIELDS can't override existing %FIELDS");
+	}
+
+        if( $battr->[$v] & PRIVATE ) {
+            $dattr->[$v] = PRIVATE | INHERITED;
+        }
+        else {
+            $dattr->[$v] = INHERITED | $battr->[$v];
+            $dfields->{$k} = $v;
+        }
+    }
+
+    foreach my $idx (1..$#{$battr}) {
+	next if defined $dattr->[$idx];
+	$dattr->[$idx] = $battr->[$idx] & INHERITED;
+    }
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+base - Establish IS-A relationship with base classes at compile time
+
+=head1 SYNOPSIS
+
+    package Baz;
+    use base qw(Foo Bar);
+
+=head1 DESCRIPTION
+
+Allows you to both load one or more modules, while setting up inheritance from
+those modules at the same time.  Roughly similar in effect to
+
+    package Baz;
+    BEGIN {
+        require Foo;
+        require Bar;
+        push @ISA, qw(Foo Bar);
+    }
+
+If any of the listed modules are not loaded yet, I<base> silently attempts to
+C<require> them (and silently continues if the C<require> failed).  Whether to
+C<require> a base class module is determined by the absence of a global variable
+$VERSION in the base package.  If $VERSION is not detected even after loading
+it, <base> will define $VERSION in the base package, setting it to the string
+C<-1, set by base.pm>.
+
+Will also initialize the fields if one of the base classes has it.
+Multiple inheritence of fields is B<NOT> supported, if two or more
+base classes each have inheritable fields the 'base' pragma will
+croak.  See L<fields>, L<public> and L<protected> for a description of
+this feature.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Base class package "%s" is empty.
+
+base.pm was unable to require the base package, because it was not
+found in your path.
+
+=back
+
+=head1 HISTORY
+
+This module was introduced with Perl 5.004_04.
+
+
+=head1 CAVEATS
+
+Due to the limitations of the implementation, you must use
+base I<before> you declare any of your own fields.
+
+
+=head1 SEE ALSO
+
+L<fields>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/bigfloat.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/bigfloat.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/bigfloat.pl	(revision 14489)
@@ -0,0 +1,259 @@
+package bigfloat;
+require "bigint.pl";
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Math::BigFloat
+#
+# Arbitrary length float math package
+#
+# by Mark Biggar
+#
+# number format
+#   canonical strings have the form /[+-]\d+E[+-]\d+/
+#   Input values can have embedded whitespace
+# Error returns
+#   'NaN'           An input parameter was "Not a Number" or 
+#                       divide by zero or sqrt of negative number
+# Division is computed to 
+#   max($div_scale,length(dividend)+length(divisor)) 
+#   digits by default.
+# Also used for default sqrt scale
+
+$div_scale = 40;
+
+# Rounding modes one of 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'.
+
+$rnd_mode = 'even';
+
+#   bigfloat routines
+#
+#   fadd(NSTR, NSTR) return NSTR            addition
+#   fsub(NSTR, NSTR) return NSTR            subtraction
+#   fmul(NSTR, NSTR) return NSTR            multiplication
+#   fdiv(NSTR, NSTR[,SCALE]) returns NSTR   division to SCALE places
+#   fneg(NSTR) return NSTR                  negation
+#   fabs(NSTR) return NSTR                  absolute value
+#   fcmp(NSTR,NSTR) return CODE             compare undef,<0,=0,>0
+#   fround(NSTR, SCALE) return NSTR         round to SCALE digits
+#   ffround(NSTR, SCALE) return NSTR        round at SCALEth place
+#   fnorm(NSTR) return (NSTR)               normalize
+#   fsqrt(NSTR[, SCALE]) return NSTR        sqrt to SCALE places
+
+
+# Convert a number to canonical string form.
+#   Takes something that looks like a number and converts it to
+#   the form /^[+-]\d+E[+-]\d+$/.
+sub main'fnorm { #(string) return fnum_str
+    local($_) = @_;
+    s/\s+//g;                               # strip white space
+    if (/^([+-]?)(\d*)(\.(\d*))?([Ee]([+-]?\d+))?$/
+	  && ($2 ne '' || defined($4))) {
+	my $x = defined($4) ? $4 : '';
+	&norm(($1 ? "$1$2$x" : "+$2$x"), (($x ne '') ? $6-length($x) : $6));
+    } else {
+	'NaN';
+    }
+}
+
+# normalize number -- for internal use
+sub norm { #(mantissa, exponent) return fnum_str
+    local($_, $exp) = @_;
+    if ($_ eq 'NaN') {
+	'NaN';
+    } else {
+	s/^([+-])0+/$1/;                        # strip leading zeros
+	if (length($_) == 1) {
+	    '+0E+0';
+	} else {
+	    $exp += length($1) if (s/(0+)$//);  # strip trailing zeros
+	    sprintf("%sE%+ld", $_, $exp);
+	}
+    }
+}
+
+# negation
+sub main'fneg { #(fnum_str) return fnum_str
+    local($_) = &'fnorm($_[$[]);
+    vec($_,0,8) ^= ord('+') ^ ord('-') unless $_ eq '+0E+0'; # flip sign
+    if ( ord("\t") == 9 ) { # ascii
+        s/^H/N/;
+    }
+    else { # ebcdic character set
+        s/\373/N/;
+    }
+    $_;
+}
+
+# absolute value
+sub main'fabs { #(fnum_str) return fnum_str
+    local($_) = &'fnorm($_[$[]);
+    s/^-/+/;		                       # mash sign
+    $_;
+}
+
+# multiplication
+sub main'fmul { #(fnum_str, fnum_str) return fnum_str
+    local($x,$y) = (&'fnorm($_[$[]),&'fnorm($_[$[+1]));
+    if ($x eq 'NaN' || $y eq 'NaN') {
+	'NaN';
+    } else {
+	local($xm,$xe) = split('E',$x);
+	local($ym,$ye) = split('E',$y);
+	&norm(&'bmul($xm,$ym),$xe+$ye);
+    }
+}
+
+
+# addition
+sub main'fadd { #(fnum_str, fnum_str) return fnum_str
+    local($x,$y) = (&'fnorm($_[$[]),&'fnorm($_[$[+1]));
+    if ($x eq 'NaN' || $y eq 'NaN') {
+	'NaN';
+    } else {
+	local($xm,$xe) = split('E',$x);
+	local($ym,$ye) = split('E',$y);
+	($xm,$xe,$ym,$ye) = ($ym,$ye,$xm,$xe) if ($xe < $ye);
+	&norm(&'badd($ym,$xm.('0' x ($xe-$ye))),$ye);
+    }
+}
+
+# subtraction
+sub main'fsub { #(fnum_str, fnum_str) return fnum_str
+    &'fadd($_[$[],&'fneg($_[$[+1]));    
+}
+
+# division
+#   args are dividend, divisor, scale (optional)
+#   result has at most max(scale, length(dividend), length(divisor)) digits
+sub main'fdiv #(fnum_str, fnum_str[,scale]) return fnum_str
+{
+    local($x,$y,$scale) = (&'fnorm($_[$[]),&'fnorm($_[$[+1]),$_[$[+2]);
+    if ($x eq 'NaN' || $y eq 'NaN' || $y eq '+0E+0') {
+	'NaN';
+    } else {
+	local($xm,$xe) = split('E',$x);
+	local($ym,$ye) = split('E',$y);
+	$scale = $div_scale if (!$scale);
+	$scale = length($xm)-1 if (length($xm)-1 > $scale);
+	$scale = length($ym)-1 if (length($ym)-1 > $scale);
+	$scale = $scale + length($ym) - length($xm);
+	&norm(&round(&'bdiv($xm.('0' x $scale),$ym),&'babs($ym)),
+	    $xe-$ye-$scale);
+    }
+}
+
+
+# round int $q based on fraction $r/$base using $rnd_mode
+sub round { #(int_str, int_str, int_str) return int_str
+    local($q,$r,$base) = @_;
+    if ($q eq 'NaN' || $r eq 'NaN') {
+	'NaN';
+    } elsif ($rnd_mode eq 'trunc') {
+	$q;                         # just truncate
+    } else {
+	local($cmp) = &'bcmp(&'bmul($r,'+2'),$base);
+	if ( $cmp < 0 ||
+		 ($cmp == 0 &&
+		  ( $rnd_mode eq 'zero'                             ||
+		   ($rnd_mode eq '-inf' && (substr($q,$[,1) eq '+')) ||
+		   ($rnd_mode eq '+inf' && (substr($q,$[,1) eq '-')) ||
+		   ($rnd_mode eq 'even' && $q =~ /[24680]$/)        ||
+		   ($rnd_mode eq 'odd'  && $q =~ /[13579]$/)        )) ) {
+	    $q;                     # round down
+	} else {
+	    &'badd($q, ((substr($q,$[,1) eq '-') ? '-1' : '+1'));
+				    # round up
+	}
+    }
+}
+
+# round the mantissa of $x to $scale digits
+sub main'fround { #(fnum_str, scale) return fnum_str
+    local($x,$scale) = (&'fnorm($_[$[]),$_[$[+1]);
+    if ($x eq 'NaN' || $scale <= 0) {
+	$x;
+    } else {
+	local($xm,$xe) = split('E',$x);
+	if (length($xm)-1 <= $scale) {
+	    $x;
+	} else {
+	    &norm(&round(substr($xm,$[,$scale+1),
+			 "+0".substr($xm,$[+$scale+1,1),"+10"),
+		  $xe+length($xm)-$scale-1);
+	}
+    }
+}
+
+
+# round $x at the 10 to the $scale digit place
+sub main'ffround { #(fnum_str, scale) return fnum_str
+    local($x,$scale) = (&'fnorm($_[$[]),$_[$[+1]);
+    if ($x eq 'NaN') {
+	'NaN';
+    } else {
+	local($xm,$xe) = split('E',$x);
+	if ($xe >= $scale) {
+	    $x;
+	} else {
+	    $xe = length($xm)+$xe-$scale;
+	    if ($xe < 1) {
+		'+0E+0';
+	    } elsif ($xe == 1) {
+		# The first substr preserves the sign, which means that
+		# we'll pass a non-normalized "-0" to &round when rounding
+		# -0.006 (for example), purely so that &round won't lose
+		# the sign.
+		&norm(&round(substr($xm,$[,1).'0',
+		      "+0".substr($xm,$[+1,1),"+10"), $scale);
+	    } else {
+		&norm(&round(substr($xm,$[,$xe),
+		      "+0".substr($xm,$[+$xe,1),"+10"), $scale);
+	    }
+	}
+    }
+}
+    
+# compare 2 values returns one of undef, <0, =0, >0
+#   returns undef if either or both input value are not numbers
+sub main'fcmp #(fnum_str, fnum_str) return cond_code
+{
+    local($x, $y) = (&'fnorm($_[$[]),&'fnorm($_[$[+1]));
+    if ($x eq "NaN" || $y eq "NaN") {
+	undef;
+    } else {
+	ord($y) <=> ord($x)
+	||
+	(  local($xm,$xe,$ym,$ye) = split('E', $x."E$y"),
+	     (($xe <=> $ye) * (substr($x,$[,1).'1')
+             || &bigint'cmp($xm,$ym))
+	);
+    }
+}
+
+
+# square root by Newtons method.
+sub main'fsqrt { #(fnum_str[, scale]) return fnum_str
+    local($x, $scale) = (&'fnorm($_[$[]), $_[$[+1]);
+    if ($x eq 'NaN' || $x =~ /^-/) {
+	'NaN';
+    } elsif ($x eq '+0E+0') {
+	'+0E+0';
+    } else {
+	local($xm, $xe) = split('E',$x);
+	$scale = $div_scale if (!$scale);
+	$scale = length($xm)-1 if ($scale < length($xm)-1);
+	local($gs, $guess) = (1, sprintf("1E%+d", (length($xm)+$xe-1)/2));
+	while ($gs < 2*$scale) {
+	    $guess = &'fmul(&'fadd($guess,&'fdiv($x,$guess,$gs*2)),".5");
+	    $gs *= 2;
+	}
+	&'fround($guess, $scale);
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/bigint.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/bigint.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/bigint.pl	(revision 14489)
@@ -0,0 +1,324 @@
+package bigint;
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative:  Math::BigInt
+#
+# arbitrary size integer math package
+#
+# by Mark Biggar
+#
+# Canonical Big integer value are strings of the form
+#       /^[+-]\d+$/ with leading zeros suppressed
+# Input values to these routines may be strings of the form
+#       /^\s*[+-]?[\d\s]+$/.
+# Examples:
+#   '+0'                            canonical zero value
+#   '   -123 123 123'               canonical value '-123123123'
+#   '1 23 456 7890'                 canonical value '+1234567890'
+# Output values always in canonical form
+#
+# Actual math is done in an internal format consisting of an array
+#   whose first element is the sign (/^[+-]$/) and whose remaining 
+#   elements are base 100000 digits with the least significant digit first.
+# The string 'NaN' is used to represent the result when input arguments 
+#   are not numbers, as well as the result of dividing by zero
+#
+# routines provided are:
+#
+#   bneg(BINT) return BINT              negation
+#   babs(BINT) return BINT              absolute value
+#   bcmp(BINT,BINT) return CODE         compare numbers (undef,<0,=0,>0)
+#   badd(BINT,BINT) return BINT         addition
+#   bsub(BINT,BINT) return BINT         subtraction
+#   bmul(BINT,BINT) return BINT         multiplication
+#   bdiv(BINT,BINT) return (BINT,BINT)  division (quo,rem) just quo if scalar
+#   bmod(BINT,BINT) return BINT         modulus
+#   bgcd(BINT,BINT) return BINT         greatest common divisor
+#   bnorm(BINT) return BINT             normalization
+#
+
+# overcome a floating point problem on certain osnames (posix-bc, os390)
+BEGIN {
+    my $x = 100000.0;
+    my $use_mult = int($x*1e-5)*1e5 == $x ? 1 : 0;
+}
+
+$zero = 0;
+
+
+
+# normalize string form of number.   Strip leading zeros.  Strip any
+#   white space and add a sign, if missing.
+# Strings that are not numbers result the value 'NaN'.
+
+sub main'bnorm { #(num_str) return num_str
+    local($_) = @_;
+    s/\s+//g;                           # strip white space
+    if (s/^([+-]?)0*(\d+)$/$1$2/) {     # test if number
+	substr($_,$[,0) = '+' unless $1; # Add missing sign
+	s/^-0/+0/;
+	$_;
+    } else {
+	'NaN';
+    }
+}
+
+# Convert a number from string format to internal base 100000 format.
+#   Assumes normalized value as input.
+sub internal { #(num_str) return int_num_array
+    local($d) = @_;
+    ($is,$il) = (substr($d,$[,1),length($d)-2);
+    substr($d,$[,1) = '';
+    ($is, reverse(unpack("a" . ($il%5+1) . ("a5" x ($il/5)), $d)));
+}
+
+# Convert a number from internal base 100000 format to string format.
+#   This routine scribbles all over input array.
+sub external { #(int_num_array) return num_str
+    $es = shift;
+    grep($_ > 9999 || ($_ = substr('0000'.$_,-5)), @_);   # zero pad
+    &'bnorm(join('', $es, reverse(@_)));    # reverse concat and normalize
+}
+
+# Negate input value.
+sub main'bneg { #(num_str) return num_str
+    local($_) = &'bnorm(@_);
+    vec($_,0,8) ^= ord('+') ^ ord('-') unless $_ eq '+0';
+    s/^./N/ unless /^[-+]/; # works both in ASCII and EBCDIC
+    $_;
+}
+
+# Returns the absolute value of the input.
+sub main'babs { #(num_str) return num_str
+    &abs(&'bnorm(@_));
+}
+
+sub abs { # post-normalized abs for internal use
+    local($_) = @_;
+    s/^-/+/;
+    $_;
+}
+
+
+# Compares 2 values.  Returns one of undef, <0, =0, >0. (suitable for sort)
+sub main'bcmp { #(num_str, num_str) return cond_code
+    local($x,$y) = (&'bnorm($_[$[]),&'bnorm($_[$[+1]));
+    if ($x eq 'NaN') {
+	undef;
+    } elsif ($y eq 'NaN') {
+	undef;
+    } else {
+	&cmp($x,$y);
+    }
+}
+
+sub cmp { # post-normalized compare for internal use
+    local($cx, $cy) = @_;
+    return 0 if ($cx eq $cy);
+
+    local($sx, $sy) = (substr($cx, 0, 1), substr($cy, 0, 1));
+    local($ld);
+
+    if ($sx eq '+') {
+      return  1 if ($sy eq '-' || $cy eq '+0');
+      $ld = length($cx) - length($cy);
+      return $ld if ($ld);
+      return $cx cmp $cy;
+    } else { # $sx eq '-'
+      return -1 if ($sy eq '+');
+      $ld = length($cy) - length($cx);
+      return $ld if ($ld);
+      return $cy cmp $cx;
+    }
+
+}
+
+sub main'badd { #(num_str, num_str) return num_str
+    local(*x, *y); ($x, $y) = (&'bnorm($_[$[]),&'bnorm($_[$[+1]));
+    if ($x eq 'NaN') {
+	'NaN';
+    } elsif ($y eq 'NaN') {
+	'NaN';
+    } else {
+	@x = &internal($x);             # convert to internal form
+	@y = &internal($y);
+	local($sx, $sy) = (shift @x, shift @y); # get signs
+	if ($sx eq $sy) {
+	    &external($sx, &add(*x, *y)); # if same sign add
+	} else {
+	    ($x, $y) = (&abs($x),&abs($y)); # make abs
+	    if (&cmp($y,$x) > 0) {
+		&external($sy, &sub(*y, *x));
+	    } else {
+		&external($sx, &sub(*x, *y));
+	    }
+	}
+    }
+}
+
+sub main'bsub { #(num_str, num_str) return num_str
+    &'badd($_[$[],&'bneg($_[$[+1]));    
+}
+
+# GCD -- Euclids algorithm Knuth Vol 2 pg 296
+sub main'bgcd { #(num_str, num_str) return num_str
+    local($x,$y) = (&'bnorm($_[$[]),&'bnorm($_[$[+1]));
+    if ($x eq 'NaN' || $y eq 'NaN') {
+	'NaN';
+    } else {
+	($x, $y) = ($y,&'bmod($x,$y)) while $y ne '+0';
+	$x;
+    }
+}
+
+
+# routine to add two base 1e5 numbers
+#   stolen from Knuth Vol 2 Algorithm A pg 231
+#   there are separate routines to add and sub as per Kunth pg 233
+sub add { #(int_num_array, int_num_array) return int_num_array
+    local(*x, *y) = @_;
+    $car = 0;
+    for $x (@x) {
+	last unless @y || $car;
+	$x -= 1e5 if $car = (($x += shift(@y) + $car) >= 1e5) ? 1 : 0;
+    }
+    for $y (@y) {
+	last unless $car;
+	$y -= 1e5 if $car = (($y += $car) >= 1e5) ? 1 : 0;
+    }
+    (@x, @y, $car);
+}
+
+# subtract base 1e5 numbers -- stolen from Knuth Vol 2 pg 232, $x > $y
+sub sub { #(int_num_array, int_num_array) return int_num_array
+    local(*sx, *sy) = @_;
+    $bar = 0;
+    for $sx (@sx) {
+	last unless @y || $bar;
+	$sx += 1e5 if $bar = (($sx -= shift(@sy) + $bar) < 0);
+    }
+    @sx;
+}
+
+# multiply two numbers -- stolen from Knuth Vol 2 pg 233
+sub main'bmul { #(num_str, num_str) return num_str
+    local(*x, *y); ($x, $y) = (&'bnorm($_[$[]), &'bnorm($_[$[+1]));
+    if ($x eq 'NaN') {
+	'NaN';
+    } elsif ($y eq 'NaN') {
+	'NaN';
+    } else {
+	@x = &internal($x);
+	@y = &internal($y);
+	local($signr) = (shift @x ne shift @y) ? '-' : '+';
+	@prod = ();
+	for $x (@x) {
+	    ($car, $cty) = (0, $[);
+	    for $y (@y) {
+		$prod = $x * $y + $prod[$cty] + $car;
+                if ($use_mult) {
+		    $prod[$cty++] =
+		        $prod - ($car = int($prod * 1e-5)) * 1e5;
+                }
+                else {
+		    $prod[$cty++] =
+		        $prod - ($car = int($prod / 1e5)) * 1e5;
+                }
+	    }
+	    $prod[$cty] += $car if $car;
+	    $x = shift @prod;
+	}
+	&external($signr, @x, @prod);
+    }
+}
+
+# modulus
+sub main'bmod { #(num_str, num_str) return num_str
+    (&'bdiv(@_))[$[+1];
+}
+
+
+sub main'bdiv { #(dividend: num_str, divisor: num_str) return num_str
+    local (*x, *y); ($x, $y) = (&'bnorm($_[$[]), &'bnorm($_[$[+1]));
+    return wantarray ? ('NaN','NaN') : 'NaN'
+	if ($x eq 'NaN' || $y eq 'NaN' || $y eq '+0');
+    return wantarray ? ('+0',$x) : '+0' if (&cmp(&abs($x),&abs($y)) < 0);
+    @x = &internal($x); @y = &internal($y);
+    $srem = $y[$[];
+    $sr = (shift @x ne shift @y) ? '-' : '+';
+    $car = $bar = $prd = 0;
+    if (($dd = int(1e5/($y[$#y]+1))) != 1) {
+	for $x (@x) {
+	    $x = $x * $dd + $car;
+            if ($use_mult) {
+	    $x -= ($car = int($x * 1e-5)) * 1e5;
+            }
+            else {
+	    $x -= ($car = int($x / 1e5)) * 1e5;
+            }
+	}
+	push(@x, $car); $car = 0;
+	for $y (@y) {
+	    $y = $y * $dd + $car;
+            if ($use_mult) {
+	    $y -= ($car = int($y * 1e-5)) * 1e5;
+            }
+            else {
+	    $y -= ($car = int($y / 1e5)) * 1e5;
+            }
+	}
+    }
+    else {
+	push(@x, 0);
+    }
+    @q = (); ($v2,$v1) = @y[-2,-1];
+    while ($#x > $#y) {
+	($u2,$u1,$u0) = @x[-3..-1];
+	$q = (($u0 == $v1) ? 99999 : int(($u0*1e5+$u1)/$v1));
+	--$q while ($v2*$q > ($u0*1e5+$u1-$q*$v1)*1e5+$u2);
+	if ($q) {
+	    ($car, $bar) = (0,0);
+	    for ($y = $[, $x = $#x-$#y+$[-1; $y <= $#y; ++$y,++$x) {
+		$prd = $q * $y[$y] + $car;
+                if ($use_mult) {
+		$prd -= ($car = int($prd * 1e-5)) * 1e5;
+                }
+                else {
+		$prd -= ($car = int($prd / 1e5)) * 1e5;
+                }
+		$x[$x] += 1e5 if ($bar = (($x[$x] -= $prd + $bar) < 0));
+	    }
+	    if ($x[$#x] < $car + $bar) {
+		$car = 0; --$q;
+		for ($y = $[, $x = $#x-$#y+$[-1; $y <= $#y; ++$y,++$x) {
+		    $x[$x] -= 1e5
+			if ($car = (($x[$x] += $y[$y] + $car) > 1e5));
+		}
+	    }   
+	}
+	pop(@x); unshift(@q, $q);
+    }
+    if (wantarray) {
+	@d = ();
+	if ($dd != 1) {
+	    $car = 0;
+	    for $x (reverse @x) {
+		$prd = $car * 1e5 + $x;
+		$car = $prd - ($tmp = int($prd / $dd)) * $dd;
+		unshift(@d, $tmp);
+	    }
+	}
+	else {
+	    @d = @x;
+	}
+	(&external($sr, @q), &external($srem, @d, $zero));
+    } else {
+	&external($sr, @q);
+    }
+}
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/bigint.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/bigint.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/bigint.pm	(revision 14489)
@@ -0,0 +1,385 @@
+package bigint;
+require 5.005;
+
+$VERSION = '0.07';
+use Exporter;
+@ISA		= qw( Exporter );
+@EXPORT_OK	= qw( ); 
+@EXPORT		= qw( inf NaN ); 
+
+use strict;
+use overload;
+
+############################################################################## 
+
+# These are all alike, and thus faked by AUTOLOAD
+
+my @faked = qw/round_mode accuracy precision div_scale/;
+use vars qw/$VERSION $AUTOLOAD $_lite/;		# _lite for testsuite
+
+sub AUTOLOAD
+  {
+  my $name = $AUTOLOAD;
+
+  $name =~ s/.*:://;    # split package
+  no strict 'refs';
+  foreach my $n (@faked)
+    {
+    if ($n eq $name)
+      {
+      *{"bigint::$name"} = sub 
+        {
+        my $self = shift;
+        no strict 'refs';
+        if (defined $_[0])
+          {
+          return Math::BigInt->$name($_[0]);
+          }
+        return Math::BigInt->$name();
+        };
+      return &$name;
+      }
+    }
+ 
+  # delayed load of Carp and avoid recursion
+  require Carp;
+  Carp::croak ("Can't call bigint\-\>$name, not a valid method");
+  }
+
+sub upgrade
+  {
+  my $self = shift;
+  no strict 'refs';
+#  if (defined $_[0])
+#    {
+#    $Math::BigInt::upgrade = $_[0];
+#    }
+  return $Math::BigInt::upgrade;
+  }
+
+sub _constant
+  {
+  # this takes a floating point constant string and returns it truncated to
+  # integer. For instance, '4.5' => '4', '1.234e2' => '123' etc
+  my $float = shift;
+
+  # some simple cases first
+  return $float if ($float =~ /^[+-]?[0-9]+$/);		# '+123','-1','0' etc
+  return $float 
+    if ($float =~ /^[+-]?[0-9]+\.?[eE]\+?[0-9]+$/);	# 123e2, 123.e+2
+  return '0' if ($float =~ /^[+-]?[0]*\.[0-9]+$/);	# .2, 0.2, -.1
+  if ($float =~ /^[+-]?[0-9]+\.[0-9]*$/)		# 1., 1.23, -1.2 etc
+    {
+    $float =~ s/\..*//;
+    return $float;
+    }
+  my ($mis,$miv,$mfv,$es,$ev) = Math::BigInt::_split($float);
+  return $float if !defined $mis; 	# doesn't look like a number to me
+  my $ec = int($$ev);
+  my $sign = $$mis; $sign = '' if $sign eq '+';
+  if ($$es eq '-')
+    {
+    # ignore fraction part entirely
+    if ($ec >= length($$miv))			# 123.23E-4
+      {
+      return '0';
+      }
+    return $sign . substr ($$miv,0,length($$miv)-$ec);	# 1234.45E-2 = 12
+    }
+  # xE+y
+  if ($ec >= length($$mfv))
+    {
+    $ec -= length($$mfv);			
+    return $sign.$$miv.$$mfv if $ec == 0;	# 123.45E+2 => 12345
+    return $sign.$$miv.$$mfv.'E'.$ec; 		# 123.45e+3 => 12345e1
+    }
+  $mfv = substr($$mfv,0,$ec);
+  return $sign.$$miv.$mfv; 			# 123.45e+1 => 1234
+  }
+
+sub import 
+  {
+  my $self = shift;
+
+  # some defaults
+  my $lib = '';
+
+  my @import = ( ':constant' );				# drive it w/ constant
+  my @a = @_; my $l = scalar @_; my $j = 0;
+  my ($ver,$trace);					# version? trace?
+  my ($a,$p);						# accuracy, precision
+  for ( my $i = 0; $i < $l ; $i++,$j++ )
+    {
+    if ($_[$i] =~ /^(l|lib)$/)
+      {
+      # this causes a different low lib to take care...
+      $lib = $_[$i+1] || '';
+      my $s = 2; $s = 1 if @a-$j < 2;	# avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] =~ /^(a|accuracy)$/)
+      {
+      $a = $_[$i+1];
+      my $s = 2; $s = 1 if @a-$j < 2;	# avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] =~ /^(p|precision)$/)
+      {
+      $p = $_[$i+1];
+      my $s = 2; $s = 1 if @a-$j < 2;	# avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] =~ /^(v|version)$/)
+      {
+      $ver = 1;
+      splice @a, $j, 1; $j --;
+      }
+    elsif ($_[$i] =~ /^(t|trace)$/)
+      {
+      $trace = 1;
+      splice @a, $j, 1; $j --;
+      }
+    else { die "unknown option $_[$i]"; }
+    }
+  my $class;
+  $_lite = 0;					# using M::BI::L ?
+  if ($trace)
+    {
+    require Math::BigInt::Trace; $class = 'Math::BigInt::Trace';
+    }
+  else
+    {
+    # see if we can find Math::BigInt::Lite
+    if (!defined $a && !defined $p)		# rounding won't work to well
+      {
+      eval 'require Math::BigInt::Lite;';
+      if ($@ eq '')
+        {
+        @import = ( );				# :constant in Lite, not MBI
+        Math::BigInt::Lite->import( ':constant' );
+        $_lite= 1;				# signal okay
+        }
+      }
+    require Math::BigInt if $_lite == 0;	# not already loaded?
+    $class = 'Math::BigInt';			# regardless of MBIL or not
+    }
+  push @import, 'lib' => $lib if $lib ne '';
+  # Math::BigInt::Trace or plain Math::BigInt
+  $class->import(@import);
+
+  bigint->accuracy($a) if defined $a;
+  bigint->precision($p) if defined $p;
+  if ($ver)
+    {
+    print "bigint\t\t\t v$VERSION\n";
+    print "Math::BigInt::Lite\t v$Math::BigInt::Lite::VERSION\n" if $_lite;
+    print "Math::BigInt\t\t v$Math::BigInt::VERSION";
+    my $config = Math::BigInt->config();
+    print " lib => $config->{lib} v$config->{lib_version}\n";
+    exit;
+    }
+  # we take care of floating point constants, since BigFloat isn't available
+  # and BigInt doesn't like them:
+  overload::constant float => sub { Math::BigInt->new( _constant(shift) ); };
+
+  $self->export_to_level(1,$self,@a);           # export inf and NaN
+  }
+
+sub inf () { Math::BigInt->binf(); }
+sub NaN () { Math::BigInt->bnan(); }
+
+1;
+
+__END__
+
+=head1 NAME
+
+bigint - Transparent BigInteger support for Perl
+
+=head1 SYNOPSIS
+
+  use bigint;
+
+  $x = 2 + 4.5,"\n";			# BigInt 6
+  print 2 ** 512,"\n";			# really is what you think it is
+  print inf + 42,"\n";			# inf
+  print NaN * 7,"\n";			# NaN
+
+=head1 DESCRIPTION
+
+All operators (including basic math operations) are overloaded. Integer
+constants are created as proper BigInts.
+
+Floating point constants are truncated to integer. All results are also
+truncated.
+
+=head2 Options
+
+bigint recognizes some options that can be passed while loading it via use.
+The options can (currently) be either a single letter form, or the long form.
+The following options exist:
+
+=over 2
+
+=item a or accuracy
+
+This sets the accuracy for all math operations. The argument must be greater
+than or equal to zero. See Math::BigInt's bround() function for details.
+
+	perl -Mbigint=a,2 -le 'print 12345+1'
+
+=item p or precision
+
+This sets the precision for all math operations. The argument can be any
+integer. Negative values mean a fixed number of digits after the dot, and
+are <B>ignored</B> since all operations happen in integer space.
+A positive value rounds to this digit left from the dot. 0 or 1 mean round to
+integer and are ignore like negative values.
+
+See Math::BigInt's bfround() function for details.
+
+	perl -Mbignum=p,5 -le 'print 123456789+123'
+
+=item t or trace
+
+This enables a trace mode and is primarily for debugging bigint or
+Math::BigInt.
+
+=item l or lib
+
+Load a different math lib, see L<MATH LIBRARY>.
+
+	perl -Mbigint=l,GMP -e 'print 2 ** 512'
+
+Currently there is no way to specify more than one library on the command
+line. This will be hopefully fixed soon ;)
+
+=item v or version
+
+This prints out the name and version of all modules used and then exits.
+
+	perl -Mbigint=v
+
+=head2 Math Library
+
+Math with the numbers is done (by default) by a module called
+Math::BigInt::Calc. This is equivalent to saying:
+
+	use bigint lib => 'Calc';
+
+You can change this by using:
+
+	use bigint lib => 'BitVect';
+
+The following would first try to find Math::BigInt::Foo, then
+Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
+
+	use bigint lib => 'Foo,Math::BigInt::Bar';
+
+Please see respective module documentation for further details.
+
+=head2 Internal Format
+
+The numbers are stored as objects, and their internals might change at anytime,
+especially between math operations. The objects also might belong to different
+classes, like Math::BigInt, or Math::BigInt::Lite. Mixing them together, even
+with normal scalars is not extraordinary, but normal and expected.
+
+You should not depend on the internal format, all accesses must go through
+accessor methods. E.g. looking at $x->{sign} is not a good idea since there
+is no guaranty that the object in question has such a hash key, nor is a hash
+underneath at all.
+
+=head2 Sign
+
+The sign is either '+', '-', 'NaN', '+inf' or '-inf'.
+You can access it with the sign() method.
+
+A sign of 'NaN' is used to represent the result when input arguments are not
+numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
+minus infinity. You will get '+inf' when dividing a positive number by 0, and
+'-inf' when dividing any negative number by 0.
+
+=head2 Methods
+
+Since all numbers are now objects, you can use all functions that are part of
+the BigInt API. You can only use the bxxx() notation, and not the fxxx()
+notation, though. 
+
+=head2 Caveat
+
+But a warning is in order. When using the following to make a copy of a number,
+only a shallow copy will be made.
+
+	$x = 9; $y = $x;
+	$x = $y = 7;
+
+Using the copy or the original with overloaded math is okay, e.g. the
+following work:
+
+	$x = 9; $y = $x;
+	print $x + 1, " ", $y,"\n";	# prints 10 9
+
+but calling any method that modifies the number directly will result in
+B<both> the original and the copy beeing destroyed:
+	
+	$x = 9; $y = $x;
+	print $x->badd(1), " ", $y,"\n";	# prints 10 10
+	
+        $x = 9; $y = $x;
+	print $x->binc(1), " ", $y,"\n";	# prints 10 10
+        
+	$x = 9; $y = $x;
+	print $x->bmul(2), " ", $y,"\n";	# prints 18 18
+	
+Using methods that do not modify, but testthe contents works:
+
+	$x = 9; $y = $x;
+	$z = 9 if $x->is_zero();		# works fine
+
+See the documentation about the copy constructor and C<=> in overload, as
+well as the documentation in BigInt for further details.
+
+=head1 MODULES USED
+
+C<bigint> is just a thin wrapper around various modules of the Math::BigInt
+family. Think of it as the head of the family, who runs the shop, and orders
+the others to do the work.
+
+The following modules are currently used by bigint:
+
+	Math::BigInt::Lite	(for speed, and only if it is loadable)
+	Math::BigInt
+
+=head1 EXAMPLES
+
+Some cool command line examples to impress the Python crowd ;) You might want
+to compare them to the results under -Mbignum or -Mbigrat:
+ 
+	perl -Mbigint -le 'print sqrt(33)'
+	perl -Mbigint -le 'print 2*255'
+	perl -Mbigint -le 'print 4.5+2*255'
+	perl -Mbigint -le 'print 3/7 + 5/7 + 8/3'
+	perl -Mbigint -le 'print 123->is_odd()'
+	perl -Mbigint -le 'print log(2)'
+	perl -Mbigint -le 'print 2 ** 0.5'
+	perl -Mbigint=a,65 -le 'print 2 ** 0.2'
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+Especially L<bigrat> as in C<perl -Mbigrat -le 'print 1/3+1/4'> and
+L<bignum> as in C<perl -Mbignum -le 'print sqrt(2)'>.
+
+L<Math::BigInt>, L<Math::BigRat> and L<Math::Big> as well
+as L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and  L<Math::BigInt::GMP>.
+
+=head1 AUTHORS
+
+(C) by Tels L<http://bloodgate.com/> in early 2002 - 2005.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/bignum.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/bignum.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/bignum.pm	(revision 14489)
@@ -0,0 +1,486 @@
+package bignum;
+require 5.005;
+
+$VERSION = '0.17';
+use Exporter;
+@EXPORT_OK 	= qw( ); 
+@EXPORT 	= qw( inf NaN ); 
+@ISA 		= qw( Exporter );
+
+use strict;
+
+############################################################################## 
+
+# These are all alike, and thus faked by AUTOLOAD
+
+my @faked = qw/round_mode accuracy precision div_scale/;
+use vars qw/$VERSION $AUTOLOAD $_lite/;		# _lite for testsuite
+
+sub AUTOLOAD
+  {
+  my $name = $AUTOLOAD;
+
+  $name =~ s/.*:://;    # split package
+  no strict 'refs';
+  foreach my $n (@faked)
+    {
+    if ($n eq $name)
+      {
+      *{"bignum::$name"} = sub 
+        {
+        my $self = shift;
+        no strict 'refs';
+        if (defined $_[0])
+          {
+          Math::BigInt->$name($_[0]);
+          return Math::BigFloat->$name($_[0]);
+          }
+        return Math::BigInt->$name();
+        };
+      return &$name;
+      }
+    }
+ 
+  # delayed load of Carp and avoid recursion
+  require Carp;
+  Carp::croak ("Can't call bignum\-\>$name, not a valid method");
+  }
+
+sub upgrade
+  {
+  my $self = shift;
+  no strict 'refs';
+#  if (defined $_[0])
+#    {
+#    $Math::BigInt::upgrade = $_[0];
+#    $Math::BigFloat::upgrade = $_[0];
+#    }
+  return $Math::BigInt::upgrade;
+  }
+
+sub import 
+  {
+  my $self = shift;
+
+  # some defaults
+  my $lib = '';
+  my $upgrade = 'Math::BigFloat';
+  my $downgrade = 'Math::BigInt';
+
+  my @import = ( ':constant' );				# drive it w/ constant
+  my @a = @_; my $l = scalar @_; my $j = 0;
+  my ($ver,$trace);					# version? trace?
+  my ($a,$p);						# accuracy, precision
+  for ( my $i = 0; $i < $l ; $i++,$j++ )
+    {
+    if ($_[$i] eq 'upgrade')
+      {
+      # this causes upgrading
+      $upgrade = $_[$i+1];		# or undef to disable
+      my $s = 2; $s = 1 if @a-$j < 2;	# avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] eq 'downgrade')
+      {
+      # this causes downgrading
+      $downgrade = $_[$i+1];		# or undef to disable
+      my $s = 2; $s = 1 if @a-$j < 2;	# avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] =~ /^(l|lib)$/)
+      {
+      # this causes a different low lib to take care...
+      $lib = $_[$i+1] || '';
+      my $s = 2; $s = 1 if @a-$j < 2;	# avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] =~ /^(a|accuracy)$/)
+      {
+      $a = $_[$i+1];
+      my $s = 2; $s = 1 if @a-$j < 2;	# avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] =~ /^(p|precision)$/)
+      {
+      $p = $_[$i+1];
+      my $s = 2; $s = 1 if @a-$j < 2;	# avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] =~ /^(v|version)$/)
+      {
+      $ver = 1;
+      splice @a, $j, 1; $j --;
+      }
+    elsif ($_[$i] =~ /^(t|trace)$/)
+      {
+      $trace = 1;
+      splice @a, $j, 1; $j --;
+      }
+    else { die "unknown option $_[$i]"; }
+    }
+  my $class;
+  $_lite = 0;					# using M::BI::L ?
+  if ($trace)
+    {
+    require Math::BigInt::Trace; $class = 'Math::BigInt::Trace';
+    $upgrade = 'Math::BigFloat::Trace';	
+    }
+  else
+    {
+    # see if we can find Math::BigInt::Lite
+    if (!defined $a && !defined $p)		# rounding won't work to well
+      {
+      eval 'require Math::BigInt::Lite;';
+      if ($@ eq '')
+        {
+        @import = ( );				# :constant in Lite, not MBI
+        Math::BigInt::Lite->import( ':constant' );
+        $_lite= 1;				# signal okay
+        }
+      }
+    require Math::BigInt if $_lite == 0;	# not already loaded?
+    $class = 'Math::BigInt';			# regardless of MBIL or not
+    }
+  push @import, 'lib' => $lib if $lib ne ''; 
+  # Math::BigInt::Trace or plain Math::BigInt
+  $class->import(@import, upgrade => $upgrade);
+
+  if ($trace)
+    {
+    require Math::BigFloat::Trace; $class = 'Math::BigFloat::Trace';
+    $downgrade = 'Math::BigInt::Trace';	
+    }
+  else
+    {
+    require Math::BigFloat; $class = 'Math::BigFloat';
+    }
+  $class->import(':constant','downgrade',$downgrade);
+
+  bignum->accuracy($a) if defined $a;
+  bignum->precision($p) if defined $p;
+  if ($ver)
+    {
+    print "bignum\t\t\t v$VERSION\n";
+    print "Math::BigInt::Lite\t v$Math::BigInt::Lite::VERSION\n" if $_lite;
+    print "Math::BigInt\t\t v$Math::BigInt::VERSION";
+    my $config = Math::BigInt->config();
+    print " lib => $config->{lib} v$config->{lib_version}\n";
+    print "Math::BigFloat\t\t v$Math::BigFloat::VERSION\n";
+    exit;
+    }
+  $self->export_to_level(1,$self,@a);		# export inf and NaN
+  }
+
+sub inf () { Math::BigInt->binf(); }
+sub NaN () { Math::BigInt->bnan(); }
+
+1;
+
+__END__
+
+=head1 NAME
+
+bignum - Transparent BigNumber support for Perl
+
+=head1 SYNOPSIS
+
+  use bignum;
+
+  $x = 2 + 4.5,"\n";			# BigFloat 6.5
+  print 2 ** 512 * 0.1,"\n";		# really is what you think it is
+  print inf * inf,"\n";			# prints inf
+  print NaN * 3,"\n";			# prints NaN
+
+=head1 DESCRIPTION
+
+All operators (including basic math operations) are overloaded. Integer and
+floating-point constants are created as proper BigInts or BigFloats,
+respectively.
+
+If you do 
+
+        use bignum;
+
+at the top of your script, Math::BigFloat and Math::BigInt will be loaded
+and any constant number will be converted to an object (Math::BigFloat for
+floats like 3.1415 and Math::BigInt for integers like 1234).
+
+So, the following line:
+
+        $x = 1234;
+
+creates actually a Math::BigInt and stores a reference to in $x.
+This happens transparently and behind your back, so to speak.
+
+You can see this with the following:
+
+        perl -Mbignum -le 'print ref(1234)'
+
+Don't worry if it says Math::BigInt::Lite, bignum and friends will use Lite
+if it is installed since it is faster for some operations. It will be
+automatically upgraded to BigInt whenever neccessary:
+
+        perl -Mbignum -le 'print ref(2**255)'
+
+This also means it is a bad idea to check for some specific package, since
+the actual contents of $x might be something unexpected. Due to the
+transparent way of bignum C<ref()> should not be neccessary, anyway.
+
+Since Math::BigInt and BigFloat also overload the normal math operations,
+the following line will still work:
+
+        perl -Mbignum -le 'print ref(1234+1234)'
+
+Since numbers are actually objects, you can call all the usual methods from
+BigInt/BigFloat on them. This even works to some extent on expressions:
+
+        perl -Mbignum -le '$x = 1234; print $x->bdec()'
+        perl -Mbignum -le 'print 1234->binc();'
+        perl -Mbignum -le 'print 1234->binc->badd(6);'
+        perl -Mbignum -le 'print +(1234)->binc()'
+
+(Note that print doesn't do what you expect if the expression starts with
+'(' hence the C<+>)
+
+You can even chain the operations together as usual:
+
+        perl -Mbignum -le 'print 1234->binc->badd(6);'
+        1241
+
+Under bignum (or bigint or bigrat), Perl will "upgrade" the numbers
+appropriately. This means that:
+
+        perl -Mbignum -le 'print 1234+4.5'
+        1238.5
+
+will work correctly. These mixed cases don't do always work when using
+Math::BigInt or Math::BigFloat alone, or at least not in the way normal Perl
+scalars work. 
+
+If you do want to work with large integers like under C<use integer;>, try
+C<use bigint;>:
+
+        perl -Mbigint -le 'print 1234.5+4.5'
+        1238
+
+There is also C<use bigrat;> which gives you big rationals:
+
+        perl -Mbigrat -le 'print 1234+4.1'
+        12381/10
+
+The entire upgrading/downgrading is still experimental and might not work
+as you expect or may even have bugs.
+
+You might get errors like this:
+
+        Can't use an undefined value as an ARRAY reference at
+        /usr/local/lib/perl5/5.8.0/Math/BigInt/Calc.pm line 864
+
+This means somewhere a routine got a BigFloat/Lite but expected a BigInt (or
+vice versa) and the upgrade/downgrad path was missing. This is a bug, please
+report it so that we can fix it.
+
+You might consider using just Math::BigInt or Math::BigFloat, since they
+allow you finer control over what get's done in which module/space. For
+instance, simple loop counters will be Math::BigInts under C<use bignum;> and
+this is slower than keeping them as Perl scalars:
+
+        perl -Mbignum -le 'for ($i = 0; $i < 10; $i++) { print ref($i); }'
+
+Please note the following does not work as expected (prints nothing), since
+overloading of '..' is not yet possible in Perl (as of v5.8.0):
+
+        perl -Mbignum -le 'for (1..2) { print ref($_); }'
+
+=head2 Options
+
+bignum recognizes some options that can be passed while loading it via use.
+The options can (currently) be either a single letter form, or the long form.
+The following options exist:
+
+=over 2
+
+=item a or accuracy
+
+This sets the accuracy for all math operations. The argument must be greater
+than or equal to zero. See Math::BigInt's bround() function for details.
+
+	perl -Mbignum=a,50 -le 'print sqrt(20)'
+
+=item p or precision
+
+This sets the precision for all math operations. The argument can be any
+integer. Negative values mean a fixed number of digits after the dot, while
+a positive value rounds to this digit left from the dot. 0 or 1 mean round to
+integer. See Math::BigInt's bfround() function for details.
+
+	perl -Mbignum=p,-50 -le 'print sqrt(20)'
+
+=item t or trace
+
+This enables a trace mode and is primarily for debugging bignum or
+Math::BigInt/Math::BigFloat.
+
+=item l or lib
+
+Load a different math lib, see L<MATH LIBRARY>.
+
+	perl -Mbignum=l,GMP -e 'print 2 ** 512'
+
+Currently there is no way to specify more than one library on the command
+line. This will be hopefully fixed soon ;)
+
+=item v or version
+
+This prints out the name and version of all modules used and then exits.
+
+	perl -Mbignum=v
+
+=head2 Methods
+
+Beside import() and AUTOLOAD() there are only a few other methods.
+
+Since all numbers are now objects, you can use all functions that are part of
+the BigInt or BigFloat API. It is wise to use only the bxxx() notation, and not
+the fxxx() notation, though. This makes it possible that the underlying object
+might morph into a different class than BigFloat.
+
+=head2 Caveat
+
+But a warning is in order. When using the following to make a copy of a number,
+only a shallow copy will be made.
+
+        $x = 9; $y = $x;
+        $x = $y = 7;
+
+If you want to make a real copy, use the following:
+
+        $y = $x->copy();
+
+Using the copy or the original with overloaded math is okay, e.g. the
+following work:
+
+        $x = 9; $y = $x;
+        print $x + 1, " ", $y,"\n";     # prints 10 9
+
+but calling any method that modifies the number directly will result in
+B<both> the original and the copy beeing destroyed:
+
+        $x = 9; $y = $x;
+        print $x->badd(1), " ", $y,"\n";        # prints 10 10
+
+        $x = 9; $y = $x;
+        print $x->binc(1), " ", $y,"\n";        # prints 10 10
+
+        $x = 9; $y = $x;
+        print $x->bmul(2), " ", $y,"\n";        # prints 18 18
+
+Using methods that do not modify, but testthe contents works:
+
+        $x = 9; $y = $x;
+        $z = 9 if $x->is_zero();                # works fine
+
+See the documentation about the copy constructor and C<=> in overload, as
+well as the documentation in BigInt for further details.
+
+=over 2
+
+=item inf()
+
+A shortcut to return Math::BigInt->binf(). Usefull because Perl does not always
+handle bareword C<inf> properly.
+
+=item NaN()
+
+A shortcut to return Math::BigInt->bnan(). Usefull because Perl does not always
+handle bareword C<NaN> properly.
+
+=item upgrade()
+
+Return the class that numbers are upgraded to, is in fact returning
+C<$Math::BigInt::upgrade>.
+
+=back
+
+=head2 MATH LIBRARY
+
+Math with the numbers is done (by default) by a module called
+Math::BigInt::Calc. This is equivalent to saying:
+
+	use bignum lib => 'Calc';
+
+You can change this by using:
+
+	use bignum lib => 'BitVect';
+
+The following would first try to find Math::BigInt::Foo, then
+Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
+
+	use bignum lib => 'Foo,Math::BigInt::Bar';
+
+Please see respective module documentation for further details.
+
+=head2 INTERNAL FORMAT
+
+The numbers are stored as objects, and their internals might change at anytime,
+especially between math operations. The objects also might belong to different
+classes, like Math::BigInt, or Math::BigFLoat. Mixing them together, even
+with normal scalars is not extraordinary, but normal and expected.
+
+You should not depend on the internal format, all accesses must go through
+accessor methods. E.g. looking at $x->{sign} is not a bright idea since there
+is no guaranty that the object in question has such a hashkey, nor is a hash
+underneath at all.
+
+=head2 SIGN
+
+The sign is either '+', '-', 'NaN', '+inf' or '-inf' and stored seperately.
+You can access it with the sign() method.
+
+A sign of 'NaN' is used to represent the result when input arguments are not
+numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
+minus infinity. You will get '+inf' when dividing a positive number by 0, and
+'-inf' when dividing any negative number by 0.
+
+=head1 MODULES USED
+
+C<bignum> is just a thin wrapper around various modules of the Math::BigInt
+family. Think of it as the head of the family, who runs the shop, and orders
+the others to do the work.
+
+The following modules are currently used by bignum:
+
+	Math::BigInt::Lite	(for speed, and only if it is loadable)
+	Math::BigInt
+	Math::BigFloat
+
+=head1 EXAMPLES
+
+Some cool command line examples to impress the Python crowd ;)
+ 
+	perl -Mbignum -le 'print sqrt(33)'
+	perl -Mbignum -le 'print 2*255'
+	perl -Mbignum -le 'print 4.5+2*255'
+	perl -Mbignum -le 'print 3/7 + 5/7 + 8/3'
+	perl -Mbignum -le 'print 123->is_odd()'
+	perl -Mbignum -le 'print log(2)'
+	perl -Mbignum -le 'print 2 ** 0.5'
+	perl -Mbignum=a,65 -le 'print 2 ** 0.2'
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+Especially L<bigrat> as in C<perl -Mbigrat -le 'print 1/3+1/4'>.
+
+L<Math::BigFloat>, L<Math::BigInt>, L<Math::BigRat> and L<Math::Big> as well
+as L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and  L<Math::BigInt::GMP>.
+
+=head1 AUTHORS
+
+(C) by Tels L<http://bloodgate.com/> in early 2002, 2003.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/bigrat.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/bigrat.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/bigrat.pl	(revision 14489)
@@ -0,0 +1,157 @@
+package bigrat;
+require "bigint.pl";
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Arbitrary size rational math package
+#
+# by Mark Biggar
+#
+# Input values to these routines consist of strings of the form 
+#   m|^\s*[+-]?[\d\s]+(/[\d\s]+)?$|.
+# Examples:
+#   "+0/1"                          canonical zero value
+#   "3"                             canonical value "+3/1"
+#   "   -123/123 123"               canonical value "-1/1001"
+#   "123 456/7890"                  canonical value "+20576/1315"
+# Output values always include a sign and no leading zeros or
+#   white space.
+# This package makes use of the bigint package.
+# The string 'NaN' is used to represent the result when input arguments 
+#   that are not numbers, as well as the result of dividing by zero and
+#       the sqrt of a negative number.
+# Extreamly naive algorthims are used.
+#
+# Routines provided are:
+#
+#   rneg(RAT) return RAT                negation
+#   rabs(RAT) return RAT                absolute value
+#   rcmp(RAT,RAT) return CODE           compare numbers (undef,<0,=0,>0)
+#   radd(RAT,RAT) return RAT            addition
+#   rsub(RAT,RAT) return RAT            subtraction
+#   rmul(RAT,RAT) return RAT            multiplication
+#   rdiv(RAT,RAT) return RAT            division
+#   rmod(RAT) return (RAT,RAT)          integer and fractional parts
+#   rnorm(RAT) return RAT               normalization
+#   rsqrt(RAT, cycles) return RAT       square root
+
+
+# Convert a number to the canonical string form m|^[+-]\d+/\d+|.
+sub main'rnorm { #(string) return rat_num
+    local($_) = @_;
+    s/\s+//g;
+    if (m#^([+-]?\d+)(/(\d*[1-9]0*))?$#) {
+	&norm($1, $3 ? $3 : '+1');
+    } else {
+	'NaN';
+    }
+}
+
+# Normalize by reducing to lowest terms
+sub norm { #(bint, bint) return rat_num
+    local($num,$dom) = @_;
+    if ($num eq 'NaN') {
+	'NaN';
+    } elsif ($dom eq 'NaN') {
+	'NaN';
+    } elsif ($dom =~ /^[+-]?0+$/) {
+	'NaN';
+    } else {
+	local($gcd) = &'bgcd($num,$dom);
+	$gcd =~ s/^-/+/;
+	if ($gcd ne '+1') { 
+	    $num = &'bdiv($num,$gcd);
+	    $dom = &'bdiv($dom,$gcd);
+	} else {
+	    $num = &'bnorm($num);
+	    $dom = &'bnorm($dom);
+	}
+	substr($dom,$[,1) = '';
+	"$num/$dom";
+    }
+}
+
+# negation
+sub main'rneg { #(rat_num) return rat_num
+    local($_) = &'rnorm(@_);
+    tr/-+/+-/ if ($_ ne '+0/1');
+    $_;
+}
+
+# absolute value
+sub main'rabs { #(rat_num) return $rat_num
+    local($_) = &'rnorm(@_);
+    substr($_,$[,1) = '+' unless $_ eq 'NaN';
+    $_;
+}
+
+# multipication
+sub main'rmul { #(rat_num, rat_num) return rat_num
+    local($xn,$xd) = split('/',&'rnorm($_[$[]));
+    local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
+    &norm(&'bmul($xn,$yn),&'bmul($xd,$yd));
+}
+
+# division
+sub main'rdiv { #(rat_num, rat_num) return rat_num
+    local($xn,$xd) = split('/',&'rnorm($_[$[]));
+    local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
+    &norm(&'bmul($xn,$yd),&'bmul($xd,$yn));
+}
+
+
+# addition
+sub main'radd { #(rat_num, rat_num) return rat_num
+    local($xn,$xd) = split('/',&'rnorm($_[$[]));
+    local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
+    &norm(&'badd(&'bmul($xn,$yd),&'bmul($yn,$xd)),&'bmul($xd,$yd));
+}
+
+# subtraction
+sub main'rsub { #(rat_num, rat_num) return rat_num
+    local($xn,$xd) = split('/',&'rnorm($_[$[]));
+    local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
+    &norm(&'bsub(&'bmul($xn,$yd),&'bmul($yn,$xd)),&'bmul($xd,$yd));
+}
+
+# comparison
+sub main'rcmp { #(rat_num, rat_num) return cond_code
+    local($xn,$xd) = split('/',&'rnorm($_[$[]));
+    local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
+    &bigint'cmp(&'bmul($xn,$yd),&'bmul($yn,$xd));
+}
+
+# int and frac parts
+sub main'rmod { #(rat_num) return (rat_num,rat_num)
+    local($xn,$xd) = split('/',&'rnorm(@_));
+    local($i,$f) = &'bdiv($xn,$xd);
+    if (wantarray) {
+	("$i/1", "$f/$xd");
+    } else {
+	"$i/1";
+    }   
+}
+
+# square root by Newtons method.
+#   cycles specifies the number of iterations default: 5
+sub main'rsqrt { #(fnum_str[, cycles]) return fnum_str
+    local($x, $scale) = (&'rnorm($_[$[]), $_[$[+1]);
+    if ($x eq 'NaN') {
+	'NaN';
+    } elsif ($x =~ /^-/) {
+	'NaN';
+    } else {
+	local($gscale, $guess) = (0, '+1/1');
+	$scale = 5 if (!$scale);
+	while ($gscale++ < $scale) {
+	    $guess = &'rmul(&'radd($guess,&'rdiv($x,$guess)),"+1/2");
+	}
+	"$guess";          # quotes necessary due to perl bug
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/bigrat.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/bigrat.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/bigrat.pm	(revision 14489)
@@ -0,0 +1,345 @@
+package bigrat;
+require 5.005;
+
+$VERSION = '0.08';
+require Exporter;
+@ISA		= qw( Exporter );
+@EXPORT_OK	= qw( ); 
+@EXPORT		= qw( inf NaN ); 
+
+use strict;
+
+############################################################################## 
+
+# These are all alike, and thus faked by AUTOLOAD
+
+my @faked = qw/round_mode accuracy precision div_scale/;
+use vars qw/$VERSION $AUTOLOAD $_lite/;		# _lite for testsuite
+
+sub AUTOLOAD
+  {
+  my $name = $AUTOLOAD;
+
+  $name =~ s/.*:://;    # split package
+  no strict 'refs';
+  foreach my $n (@faked)
+    {
+    if ($n eq $name)
+      {
+      *{"bigrat::$name"} = sub 
+        {
+        my $self = shift;
+        no strict 'refs';
+        if (defined $_[0])
+          {
+          Math::BigInt->$name($_[0]);
+          Math::BigFloat->$name($_[0]);
+          return Math::BigRat->$name($_[0]);
+          }
+        return Math::BigInt->$name();
+        };
+      return &$name;
+      }
+    }
+ 
+  # delayed load of Carp and avoid recursion
+  require Carp;
+  Carp::croak ("Can't call bigrat\-\>$name, not a valid method");
+  }
+
+sub upgrade
+  {
+  my $self = shift;
+  no strict 'refs';
+#  if (defined $_[0])
+#    {
+#    $Math::BigInt::upgrade = $_[0];
+#    $Math::BigFloat::upgrade = $_[0];
+#    }
+  return $Math::BigInt::upgrade;
+  }
+
+sub import 
+  {
+  my $self = shift;
+
+  # see also bignum->import() for additional comments
+
+  # some defaults
+  my $lib = ''; my $upgrade = 'Math::BigFloat';
+
+  my @import = ( ':constant' );				# drive it w/ constant
+  my @a = @_; my $l = scalar @_; my $j = 0;
+  my ($a,$p);
+  my ($ver,$trace);					# version? trace?
+  for ( my $i = 0; $i < $l ; $i++,$j++ )
+    {
+    if ($_[$i] eq 'upgrade')
+      {
+      # this causes upgrading
+      $upgrade = $_[$i+1];		# or undef to disable
+      my $s = 2; $s = 1 if @a-$j < 2;	# avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s;
+      }
+    elsif ($_[$i] =~ /^(l|lib)$/)
+      {
+      # this causes a different low lib to take care...
+      $lib = $_[$i+1] || '';
+      my $s = 2; $s = 1 if @a-$j < 2;	# avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] =~ /^(a|accuracy)$/)
+      {
+      $a = $_[$i+1];
+      my $s = 2; $s = 1 if @a-$j < 2;   # avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] =~ /^(p|precision)$/)
+      {
+      $p = $_[$i+1];
+      my $s = 2; $s = 1 if @a-$j < 2;   # avoid "can not modify non-existant..."
+      splice @a, $j, $s; $j -= $s; $i++;
+      }
+    elsif ($_[$i] =~ /^(v|version)$/)
+      {
+      $ver = 1;
+      splice @a, $j, 1; $j --;
+      }
+    elsif ($_[$i] =~ /^(t|trace)$/)
+      {
+      $trace = 1;
+      splice @a, $j, 1; $j --;
+      }
+    else
+      {
+      die ("unknown option $_[$i]");
+      }
+    }
+  my $class;
+  $_lite = 0;                                   # using M::BI::L ?
+  if ($trace)
+    {
+    require Math::BigInt::Trace; $class = 'Math::BigInt::Trace';
+    $upgrade = 'Math::BigFloat::Trace';
+    }
+  else
+    {
+    # see if we can find Math::BigInt::Lite
+    if (!defined $a && !defined $p)             # rounding won't work to well
+      {
+      eval 'require Math::BigInt::Lite;';
+      if ($@ eq '')
+        {
+        @import = ( );                          # :constant in Lite, not MBI
+        Math::BigInt::Lite->import( ':constant' );
+        $_lite= 1;                              # signal okay
+        }
+      }
+    require Math::BigInt if $_lite == 0;        # not already loaded?
+    $class = 'Math::BigInt';                    # regardless of MBIL or not
+    }
+  push @import, 'lib' => $lib if $lib ne '';
+  # Math::BigInt::Trace or plain Math::BigInt
+  $class->import(@import, upgrade => $upgrade);
+
+  require Math::BigFloat;
+  Math::BigFloat->import( upgrade => 'Math::BigRat', ':constant' );
+  require Math::BigRat;
+
+  bigrat->accuracy($a) if defined $a;
+  bigrat->precision($p) if defined $p;
+  if ($ver)
+    {
+    print "bigrat\t\t\t v$VERSION\n";
+    print "Math::BigInt::Lite\t v$Math::BigInt::Lite::VERSION\n" if $_lite;  
+    print "Math::BigInt\t\t v$Math::BigInt::VERSION";
+    my $config = Math::BigInt->config();
+    print " lib => $config->{lib} v$config->{lib_version}\n";
+    print "Math::BigFloat\t\t v$Math::BigFloat::VERSION\n";
+    print "Math::BigRat\t\t v$Math::BigRat::VERSION\n";
+    exit;
+    }
+  $self->export_to_level(1,$self,@a);           # export inf and NaN
+  }
+
+sub inf () { Math::BigInt->binf(); }
+sub NaN () { Math::BigInt->bnan(); }
+
+1;
+
+__END__
+
+=head1 NAME
+
+bigrat - Transparent BigNumber/BigRational support for Perl
+
+=head1 SYNOPSIS
+
+  use bigrat;
+
+  $x = 2 + 4.5,"\n";			# BigFloat 6.5
+  print 1/3 + 1/4,"\n";			# produces 7/12
+
+=head1 DESCRIPTION
+
+All operators (inlcuding basic math operations) are overloaded. Integer and
+floating-point constants are created as proper BigInts or BigFloats,
+respectively.
+
+Other than L<bignum>, this module upgrades to Math::BigRat, meaning that
+instead of 2.5 you will get 2+1/2 as output.
+
+=head2 Modules Used
+
+C<bigrat> is just a thin wrapper around various modules of the Math::BigInt
+family. Think of it as the head of the family, who runs the shop, and orders
+the others to do the work.
+
+The following modules are currently used by bignum:
+
+        Math::BigInt::Lite      (for speed, and only if it is loadable)
+        Math::BigInt
+        Math::BigFloat
+        Math::BigRat
+
+=head2 Math Library
+
+Math with the numbers is done (by default) by a module called
+Math::BigInt::Calc. This is equivalent to saying:
+
+	use bigrat lib => 'Calc';
+
+You can change this by using:
+
+	use bigrat lib => 'BitVect';
+
+The following would first try to find Math::BigInt::Foo, then
+Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
+
+	use bigrat lib => 'Foo,Math::BigInt::Bar';
+
+Please see respective module documentation for further details.
+
+=head2 Sign
+
+The sign is either '+', '-', 'NaN', '+inf' or '-inf'.
+
+A sign of 'NaN' is used to represent the result when input arguments are not
+numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
+minus infinity. You will get '+inf' when dividing a positive number by 0, and
+'-inf' when dividing any negative number by 0.
+
+=head2 Methods
+
+Since all numbers are not objects, you can use all functions that are part of
+the BigInt or BigFloat API. It is wise to use only the bxxx() notation, and not
+the fxxx() notation, though. This makes you independed on the fact that the
+underlying object might morph into a different class than BigFloat.
+
+=head2 Cavaet
+
+But a warning is in order. When using the following to make a copy of a number,
+only a shallow copy will be made.
+
+        $x = 9; $y = $x;
+        $x = $y = 7;
+
+If you want to make a real copy, use the following:
+
+	$y = $x->copy();
+
+Using the copy or the original with overloaded math is okay, e.g. the
+following work:
+
+        $x = 9; $y = $x;
+        print $x + 1, " ", $y,"\n";     # prints 10 9
+
+but calling any method that modifies the number directly will result in
+B<both> the original and the copy beeing destroyed:
+
+        $x = 9; $y = $x;
+        print $x->badd(1), " ", $y,"\n";        # prints 10 10
+
+        $x = 9; $y = $x;
+        print $x->binc(1), " ", $y,"\n";        # prints 10 10
+
+        $x = 9; $y = $x;
+        print $x->bmul(2), " ", $y,"\n";        # prints 18 18
+
+Using methods that do not modify, but testthe contents works:
+
+        $x = 9; $y = $x;
+        $z = 9 if $x->is_zero();                # works fine
+
+See the documentation about the copy constructor and C<=> in overload, as
+well as the documentation in BigInt for further details.
+
+=head2 Options
+
+bignum recognizes some options that can be passed while loading it via use.
+The options can (currently) be either a single letter form, or the long form.
+The following options exist:
+
+=over 2
+
+=item a or accuracy
+
+This sets the accuracy for all math operations. The argument must be greater
+than or equal to zero. See Math::BigInt's bround() function for details.
+
+	perl -Mbigrat=a,50 -le 'print sqrt(20)'
+
+=item p or precision
+
+This sets the precision for all math operations. The argument can be any
+integer. Negative values mean a fixed number of digits after the dot, while
+a positive value rounds to this digit left from the dot. 0 or 1 mean round to
+integer. See Math::BigInt's bfround() function for details.
+
+	perl -Mbigrat=p,-50 -le 'print sqrt(20)'
+
+=item t or trace
+
+This enables a trace mode and is primarily for debugging bignum or
+Math::BigInt/Math::BigFloat.
+
+=item l or lib
+
+Load a different math lib, see L<MATH LIBRARY>.
+
+	perl -Mbigrat=l,GMP -e 'print 2 ** 512'
+
+Currently there is no way to specify more than one library on the command
+line. This will be hopefully fixed soon ;)
+
+=item v or version
+
+This prints out the name and version of all modules used and then exits.
+
+	perl -Mbigrat=v
+
+=head1 EXAMPLES
+ 
+	perl -Mbigrat -le 'print sqrt(33)'
+	perl -Mbigrat -le 'print 2*255'
+	perl -Mbigrat -le 'print 4.5+2*255'
+	perl -Mbigrat -le 'print 3/7 + 5/7 + 8/3'	
+	perl -Mbigrat -le 'print 12->is_odd()';
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+Especially L<bignum>.
+
+L<Math::BigFloat>, L<Math::BigInt>, L<Math::BigRat> and L<Math::Big> as well
+as L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and  L<Math::BigInt::GMP>.
+
+=head1 AUTHORS
+
+(C) by Tels L<http://bloodgate.com/> in early 2002 - 2005.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/blib.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/blib.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/blib.pm	(revision 14489)
@@ -0,0 +1,86 @@
+package blib;
+
+=head1 NAME
+
+blib - Use MakeMaker's uninstalled version of a package
+
+=head1 SYNOPSIS
+
+ perl -Mblib script [args...]
+
+ perl -Mblib=dir script [args...]
+
+=head1 DESCRIPTION
+
+Looks for MakeMaker-like I<'blib'> directory structure starting in 
+I<dir> (or current directory) and working back up to five levels of '..'.
+
+Intended for use on command line with B<-M> option as a way of testing
+arbitrary scripts against an uninstalled version of a package.
+
+However it is possible to : 
+
+ use blib; 
+ or 
+ use blib '..';
+
+etc. if you really must.
+
+=head1 BUGS
+
+Pollutes global name space for development only task.
+
+=head1 AUTHOR
+
+Nick Ing-Simmons nik@tiuk.ti.com
+
+=cut
+
+use Cwd;
+use File::Spec;
+
+use vars qw($VERSION $Verbose);
+$VERSION = '1.03';
+$Verbose = 0;
+
+sub import
+{
+ my $package = shift;
+ my $dir = getcwd;
+ if ($^O eq 'VMS') { ($dir = VMS::Filespec::unixify($dir)) =~ s-/\z--; }
+ if (@_)
+  {
+   $dir = shift;
+   $dir =~ s/blib\z//;
+   $dir =~ s,/+\z,,;
+   $dir = File::Spec->curdir unless ($dir);
+   die "$dir is not a directory\n" unless (-d $dir);
+  }
+ my $i = 5;
+ my($blib, $blib_lib, $blib_arch);
+ while ($i--)
+  {
+   $blib = File::Spec->catdir($dir, "blib");
+   $blib_lib = File::Spec->catdir($blib, "lib");
+
+   if ($^O eq 'MacOS')
+    {
+     $blib_arch = File::Spec->catdir($blib_lib, $MacPerl::Architecture);
+    }
+   else
+    {
+     $blib_arch = File::Spec->catdir($blib, "arch");
+    }
+
+   if (-d $blib && -d $blib_arch && -d $blib_lib)
+    {
+     unshift(@INC,$blib_arch,$blib_lib);
+     warn "Using $blib\n" if $Verbose;
+     return;
+    }
+   $dir = File::Spec->catdir($dir, File::Spec->updir);
+  }
+ die "Cannot find blib even in $dir\n";
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/bytes.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/bytes.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/bytes.pm	(revision 14489)
@@ -0,0 +1,88 @@
+package bytes;
+
+our $VERSION = '1.02';
+
+$bytes::hint_bits = 0x00000008;
+
+sub import {
+    $^H |= $bytes::hint_bits;
+}
+
+sub unimport {
+    $^H &= ~$bytes::hint_bits;
+}
+
+sub AUTOLOAD {
+    require "bytes_heavy.pl";
+    goto &$AUTOLOAD if defined &$AUTOLOAD;
+    require Carp;
+    Carp::croak("Undefined subroutine $AUTOLOAD called");
+}
+
+sub length ($);
+sub chr ($);
+sub ord ($);
+sub substr ($$;$$);
+sub index ($$;$);
+sub rindex ($$;$);
+
+1;
+__END__
+
+=head1 NAME
+
+bytes - Perl pragma to force byte semantics rather than character semantics
+
+=head1 SYNOPSIS
+
+    use bytes;
+    ... chr(...);       # or bytes::chr
+    ... index(...);     # or bytes::index
+    ... length(...);    # or bytes::length
+    ... ord(...);       # or bytes::ord
+    ... rindex(...);    # or bytes::rindex
+    ... substr(...);    # or bytes::substr
+    no bytes;
+
+
+=head1 DESCRIPTION
+
+The C<use bytes> pragma disables character semantics for the rest of the
+lexical scope in which it appears.  C<no bytes> can be used to reverse
+the effect of C<use bytes> within the current lexical scope.
+
+Perl normally assumes character semantics in the presence of character
+data (i.e. data that has come from a source that has been marked as
+being of a particular character encoding). When C<use bytes> is in
+effect, the encoding is temporarily ignored, and each string is treated
+as a series of bytes. 
+
+As an example, when Perl sees C<$x = chr(400)>, it encodes the character
+in UTF-8 and stores it in $x. Then it is marked as character data, so,
+for instance, C<length $x> returns C<1>. However, in the scope of the
+C<bytes> pragma, $x is treated as a series of bytes - the bytes that make
+up the UTF8 encoding - and C<length $x> returns C<2>:
+
+    $x = chr(400);
+    print "Length is ", length $x, "\n";     # "Length is 1"
+    printf "Contents are %vd\n", $x;         # "Contents are 400"
+    { 
+        use bytes; # or "require bytes; bytes::length()"
+        print "Length is ", length $x, "\n"; # "Length is 2"
+        printf "Contents are %vd\n", $x;     # "Contents are 198.144"
+    }
+
+chr(), ord(), substr(), index() and rindex() behave similarly.
+
+For more on the implications and differences between character
+semantics and byte semantics, see L<perluniintro> and L<perlunicode>.
+
+=head1 LIMITATIONS
+
+bytes::substr() does not work as an lvalue().
+
+=head1 SEE ALSO
+
+L<perluniintro>, L<perlunicode>, L<utf8>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/bytes_heavy.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/bytes_heavy.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/bytes_heavy.pl	(revision 14489)
@@ -0,0 +1,40 @@
+package bytes;
+
+sub length ($) {
+    BEGIN { bytes::import() }
+    return CORE::length($_[0]);
+}
+
+sub substr ($$;$$) {
+    BEGIN { bytes::import() }
+    return
+	@_ == 2 ? CORE::substr($_[0], $_[1]) :
+	@_ == 3 ? CORE::substr($_[0], $_[1], $_[2]) :
+	          CORE::substr($_[0], $_[1], $_[2], $_[3]) ;
+}
+
+sub ord ($) {
+    BEGIN { bytes::import() }
+    return CORE::ord($_[0]);
+}
+
+sub chr ($) {
+    BEGIN { bytes::import() }
+    return CORE::chr($_[0]);
+}
+
+sub index ($$;$) {
+    BEGIN { bytes::import() }
+    return
+	@_ == 2 ? CORE::index($_[0], $_[1]) :
+	          CORE::index($_[0], $_[1], $_[2]) ;
+}
+
+sub rindex ($$;$) {
+    BEGIN { bytes::import() }
+    return
+	@_ == 2 ? CORE::rindex($_[0], $_[1]) :
+	          CORE::rindex($_[0], $_[1], $_[2]) ;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/cacheout.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/cacheout.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/cacheout.pl	(revision 14489)
@@ -0,0 +1,55 @@
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: FileCache
+
+# Open in their package.
+
+sub cacheout'open {
+    open($_[0], $_[1]);
+}
+
+# Close as well
+
+sub cacheout'close {
+    close($_[0]);
+}
+
+# But only this sub name is visible to them.
+
+sub cacheout {
+    package cacheout;
+
+    ($file) = @_;
+    if (!$isopen{$file}) {
+	if (++$numopen > $maxopen) {
+	    local(@lru) = sort {$isopen{$a} <=> $isopen{$b};} keys(%isopen);
+	    splice(@lru, $maxopen / 3);
+	    $numopen -= @lru;
+	    for (@lru) { &close($_); delete $isopen{$_}; }
+	}
+	&open($file, ($saw{$file}++ ? '>>' : '>') . $file)
+	    || die "Can't create $file: $!\n";
+    }
+    $isopen{$file} = ++$seq;
+}
+
+package cacheout;
+
+$seq = 0;
+$numopen = 0;
+
+if (open(PARAM,'/usr/include/sys/param.h')) {
+    local($_, $.);
+    while (<PARAM>) {
+	$maxopen = $1 - 4 if /^\s*#\s*define\s+NOFILE\s+(\d+)/;
+    }
+    close PARAM;
+}
+$maxopen = 16 unless $maxopen;
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/charnames.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/charnames.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/charnames.pm	(revision 14489)
@@ -0,0 +1,544 @@
+package charnames;
+use strict;
+use warnings;
+use Carp;
+use File::Spec;
+our $VERSION = '1.05';
+
+use bytes ();		# for $bytes::hint_bits
+$charnames::hint_bits = 0x20000; # HINT_LOCALIZE_HH
+
+my %alias1 = (
+		# Icky 3.2 names with parentheses.
+		'LINE FEED'		=> 'LINE FEED (LF)',
+		'FORM FEED'		=> 'FORM FEED (FF)',
+		'CARRIAGE RETURN'	=> 'CARRIAGE RETURN (CR)',
+		'NEXT LINE'		=> 'NEXT LINE (NEL)',
+		# Convenience.
+		'LF'			=> 'LINE FEED (LF)',
+		'FF'			=> 'FORM FEED (FF)',
+		'CR'			=> 'CARRIAGE RETURN (CR)',
+		'NEL'			=> 'NEXT LINE (NEL)',
+	        # More convenience.  For futher convencience,
+	        # it is suggested some way using using the NamesList
+		# aliases is implemented.
+	        'ZWNJ'			=> 'ZERO WIDTH NON-JOINER',
+	        'ZWJ'			=> 'ZERO WIDTH JOINER',
+		'BOM'			=> 'BYTE ORDER MARK',
+	    );
+
+my %alias2 = (
+		# Pre-3.2 compatibility (only for the first 256 characters).
+		'HORIZONTAL TABULATION'	=> 'CHARACTER TABULATION',
+		'VERTICAL TABULATION'	=> 'LINE TABULATION',
+		'FILE SEPARATOR'	=> 'INFORMATION SEPARATOR FOUR',
+		'GROUP SEPARATOR'	=> 'INFORMATION SEPARATOR THREE',
+		'RECORD SEPARATOR'	=> 'INFORMATION SEPARATOR TWO',
+		'UNIT SEPARATOR'	=> 'INFORMATION SEPARATOR ONE',
+		'PARTIAL LINE DOWN'	=> 'PARTIAL LINE FORWARD',
+		'PARTIAL LINE UP'	=> 'PARTIAL LINE BACKWARD',
+	    );
+
+my %alias3 = (
+		# User defined aliasses. Even more convenient :)
+	    );
+my $txt;
+
+sub alias (@)
+{
+  @_ or return %alias3;
+  my $alias = ref $_[0] ? $_[0] : { @_ };
+  @alias3{keys %$alias} = values %$alias;
+} # alias
+
+sub alias_file ($)
+{
+  my ($arg, $file) = @_;
+  if (-f $arg && File::Spec->file_name_is_absolute ($arg)) {
+    $file = $arg;
+  }
+  elsif ($arg =~ m/^\w+$/) {
+    $file = "unicore/${arg}_alias.pl";
+  }
+  else {
+    croak "Charnames alias files can only have identifier characters";
+  }
+  if (my @alias = do $file) {
+    @alias == 1 && !defined $alias[0] and
+      croak "$file cannot be used as alias file for charnames";
+    @alias % 2 and
+      croak "$file did not return a (valid) list of alias pairs";
+    alias (@alias);
+    return (1);
+  }
+  0;
+} # alias_file
+
+# This is not optimized in any way yet
+sub charnames
+{
+  my $name = shift;
+
+  if (exists $alias1{$name}) {
+    $name = $alias1{$name};
+  }
+  elsif (exists $alias2{$name}) {
+    require warnings;
+    warnings::warnif('deprecated', qq{Unicode character name "$name" is deprecated, use "$alias2{$name}" instead});
+    $name = $alias2{$name};
+  }
+  elsif (exists $alias3{$name}) {
+    $name = $alias3{$name};
+  }
+
+  my $ord;
+  my @off;
+  my $fname;
+
+  if ($name eq "BYTE ORDER MARK") {
+    $fname = $name;
+    $ord = 0xFEFF;
+  } else {
+    ## Suck in the code/name list as a big string.
+    ## Lines look like:
+    ##     "0052\t\tLATIN CAPITAL LETTER R\n"
+    $txt = do "unicore/Name.pl" unless $txt;
+
+    ## @off will hold the index into the code/name string of the start and
+    ## end of the name as we find it.
+
+    ## If :full, look for the name exactly
+    if ($^H{charnames_full} and $txt =~ /\t\t\Q$name\E$/m) {
+      @off = ($-[0], $+[0]);
+    }
+
+    ## If we didn't get above, and :short allowed, look for the short name.
+    ## The short name is like "greek:Sigma"
+    unless (@off) {
+      if ($^H{charnames_short} and $name =~ /^(.+?):(.+)/s) {
+	my ($script, $cname) = ($1, $2);
+	my $case = $cname =~ /[[:upper:]]/ ? "CAPITAL" : "SMALL";
+	if ($txt =~ m/\t\t\U$script\E (?:$case )?LETTER \U\Q$cname\E$/m) {
+	  @off = ($-[0], $+[0]);
+	}
+      }
+    }
+
+    ## If we still don't have it, check for the name among the loaded
+    ## scripts.
+    if (not @off) {
+      my $case = $name =~ /[[:upper:]]/ ? "CAPITAL" : "SMALL";
+      for my $script (@{$^H{charnames_scripts}}) {
+	if ($txt =~ m/\t\t$script (?:$case )?LETTER \U\Q$name\E$/m) {
+	  @off = ($-[0], $+[0]);
+	  last;
+	}
+      }
+    }
+
+    ## If we don't have it by now, give up.
+    unless (@off) {
+      carp "Unknown charname '$name'";
+      return "\x{FFFD}";
+    }
+
+    ##
+    ## Now know where in the string the name starts.
+    ## The code, in hex, is before that.
+    ##
+    ## The code can be 4-6 characters long, so we've got to sort of
+    ## go look for it, just after the newline that comes before $off[0].
+    ##
+    ## This would be much easier if unicore/Name.pl had info in
+    ## a name/code order, instead of code/name order.
+    ##
+    ## The +1 after the rindex() is to skip past the newline we're finding,
+    ## or, if the rindex() fails, to put us to an offset of zero.
+    ##
+    my $hexstart = rindex($txt, "\n", $off[0]) + 1;
+
+    ## we know where it starts, so turn into number -
+    ## the ordinal for the char.
+    $ord = hex substr($txt, $hexstart, $off[0] - $hexstart);
+  }
+
+  if ($^H & $bytes::hint_bits) {	# "use bytes" in effect?
+    use bytes;
+    return chr $ord if $ord <= 255;
+    my $hex = sprintf "%04x", $ord;
+    if (not defined $fname) {
+      $fname = substr $txt, $off[0] + 2, $off[1] - $off[0] - 2;
+    }
+    croak "Character 0x$hex with name '$fname' is above 0xFF";
+  }
+
+  no warnings 'utf8'; # allow even illegal characters
+  return pack "U", $ord;
+} # charnames
+
+sub import
+{
+  shift; ## ignore class name
+
+  if (not @_) {
+    carp("`use charnames' needs explicit imports list");
+  }
+  $^H |= $charnames::hint_bits;
+  $^H{charnames} = \&charnames ;
+
+  ##
+  ## fill %h keys with our @_ args.
+  ##
+  my ($promote, %h, @args) = (0);
+  while (my $arg = shift) {
+    if ($arg eq ":alias") {
+      @_ or
+	croak ":alias needs an argument in charnames";
+      my $alias = shift;
+      if (ref $alias) {
+	ref $alias eq "HASH" or
+	  croak "Only HASH reference supported as argument to :alias";
+	alias ($alias);
+	next;
+      }
+      if ($alias =~ m{:(\w+)$}) {
+	$1 eq "full" || $1 eq "short" and
+	  croak ":alias cannot use existing pragma :$1 (reversed order?)";
+	alias_file ($1) and $promote = 1;
+	next;
+      }
+      alias_file ($alias);
+      next;
+    }
+    if (substr($arg, 0, 1) eq ':' and ! ($arg eq ":full" || $arg eq ":short")) {
+      warn "unsupported special '$arg' in charnames";
+      next;
+    }
+    push @args, $arg;
+  }
+  @args == 0 && $promote and @args = (":full");
+  @h{@args} = (1) x @args;
+
+  $^H{charnames_full} = delete $h{':full'};
+  $^H{charnames_short} = delete $h{':short'};
+  $^H{charnames_scripts} = [map uc, keys %h];
+
+  ##
+  ## If utf8? warnings are enabled, and some scripts were given,
+  ## see if at least we can find one letter of each script.
+  ##
+  if (warnings::enabled('utf8') && @{$^H{charnames_scripts}}) {
+    $txt = do "unicore/Name.pl" unless $txt;
+
+    for my $script (@{$^H{charnames_scripts}}) {
+      if (not $txt =~ m/\t\t$script (?:CAPITAL |SMALL )?LETTER /) {
+	warnings::warn('utf8',  "No such script: '$script'");
+      }
+    }
+  }
+} # import
+
+my %viacode;
+
+sub viacode
+{
+  if (@_ != 1) {
+    carp "charnames::viacode() expects one argument";
+    return;
+  }
+
+  my $arg = shift;
+
+  # this comes actually from Unicode::UCD, where it is the named
+  # function _getcode (), but it avoids the overhead of loading it
+  my $hex;
+  if ($arg =~ /^[1-9]\d*$/) {
+    $hex = sprintf "%04X", $arg;
+  } elsif ($arg =~ /^(?:[Uu]\+|0[xX])?([[:xdigit:]]+)$/) {
+    $hex = $1;
+  } else {
+    carp("unexpected arg \"$arg\" to charnames::viacode()");
+    return;
+  }
+
+  # checking the length first is slightly faster
+  if (length($hex) > 5 && hex($hex) > 0x10FFFF) {
+    carp sprintf "Unicode characters only allocated up to U+10FFFF (you asked for U+%X)", $hex;
+    return;
+  }
+
+  return $viacode{$hex} if exists $viacode{$hex};
+
+  $txt = do "unicore/Name.pl" unless $txt;
+
+  return unless $txt =~ m/^$hex\t\t(.+)/m;
+
+  $viacode{$hex} = $1;
+} # viacode
+
+my %vianame;
+
+sub vianame
+{
+  if (@_ != 1) {
+    carp "charnames::vianame() expects one name argument";
+    return ()
+  }
+
+  my $arg = shift;
+
+  return chr hex $1 if $arg =~ /^U\+([0-9a-fA-F]+)$/;
+
+  return $vianame{$arg} if exists $vianame{$arg};
+
+  $txt = do "unicore/Name.pl" unless $txt;
+
+  my $pos = index $txt, "\t\t$arg\n";
+  if ($[ <= $pos) {
+    my $posLF = rindex $txt, "\n", $pos;
+    (my $code = substr $txt, $posLF + 1, 6) =~ tr/\t//d;
+    return $vianame{$arg} = hex $code;
+
+    # If $pos is at the 1st line, $posLF must be $[ - 1 (not found);
+    # then $posLF + 1 equals to $[ (at the beginning of $txt).
+    # Otherwise $posLF is the position of "\n";
+    # then $posLF + 1 must be the position of the next to "\n"
+    # (the beginning of the line).
+    # substr($txt, $posLF + 1, 6) may be "0000\t\t", "00A1\t\t",
+    # "10300\t", "100000", etc. So we can get the code via removing TAB.
+  } else {
+    return;
+  }
+} # vianame
+
+
+1;
+__END__
+
+=head1 NAME
+
+charnames - define character names for C<\N{named}> string literal escapes
+
+=head1 SYNOPSIS
+
+  use charnames ':full';
+  print "\N{GREEK SMALL LETTER SIGMA} is called sigma.\n";
+
+  use charnames ':short';
+  print "\N{greek:Sigma} is an upper-case sigma.\n";
+
+  use charnames qw(cyrillic greek);
+  print "\N{sigma} is Greek sigma, and \N{be} is Cyrillic b.\n";
+
+  use charnames ":full", ":alias" => {
+    e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
+  };
+  print "\N{e_ACUTE} is a small letter e with an acute.\n";
+
+  use charnames ();
+  print charnames::viacode(0x1234); # prints "ETHIOPIC SYLLABLE SEE"
+  printf "%04X", charnames::vianame("GOTHIC LETTER AHSA"); # prints "10330"
+
+=head1 DESCRIPTION
+
+Pragma C<use charnames> supports arguments C<:full>, C<:short>, script
+names and customized aliases.  If C<:full> is present, for expansion of
+C<\N{CHARNAME}>, the string C<CHARNAME> is first looked up in the list of
+standard Unicode character names.  If C<:short> is present, and
+C<CHARNAME> has the form C<SCRIPT:CNAME>, then C<CNAME> is looked up
+as a letter in script C<SCRIPT>.  If pragma C<use charnames> is used
+with script name arguments, then for C<\N{CHARNAME}> the name
+C<CHARNAME> is looked up as a letter in the given scripts (in the
+specified order). Customized aliases are explained in L</CUSTOM ALIASES>.
+
+For lookup of C<CHARNAME> inside a given script C<SCRIPTNAME>
+this pragma looks for the names
+
+  SCRIPTNAME CAPITAL LETTER CHARNAME
+  SCRIPTNAME SMALL LETTER CHARNAME
+  SCRIPTNAME LETTER CHARNAME
+
+in the table of standard Unicode names.  If C<CHARNAME> is lowercase,
+then the C<CAPITAL> variant is ignored, otherwise the C<SMALL> variant
+is ignored.
+
+Note that C<\N{...}> is compile-time, it's a special form of string
+constant used inside double-quoted strings: in other words, you cannot
+use variables inside the C<\N{...}>.  If you want similar run-time
+functionality, use charnames::vianame().
+
+For the C0 and C1 control characters (U+0000..U+001F, U+0080..U+009F)
+as of Unicode 3.1, there are no official Unicode names but you can use
+instead the ISO 6429 names (LINE FEED, ESCAPE, and so forth).  In
+Unicode 3.2 (as of Perl 5.8) some naming changes take place ISO 6429
+has been updated, see L</ALIASES>.  Also note that the U+UU80, U+0081,
+U+0084, and U+0099 do not have names even in ISO 6429.
+
+Since the Unicode standard uses "U+HHHH", so can you: "\N{U+263a}"
+is the Unicode smiley face, or "\N{WHITE SMILING FACE}".
+
+=head1 CUSTOM TRANSLATORS
+
+The mechanism of translation of C<\N{...}> escapes is general and not
+hardwired into F<charnames.pm>.  A module can install custom
+translations (inside the scope which C<use>s the module) with the
+following magic incantation:
+
+    use charnames ();		# for $charnames::hint_bits
+    sub import {
+	shift;
+	$^H |= $charnames::hint_bits;
+	$^H{charnames} = \&translator;
+    }
+
+Here translator() is a subroutine which takes C<CHARNAME> as an
+argument, and returns text to insert into the string instead of the
+C<\N{CHARNAME}> escape.  Since the text to insert should be different
+in C<bytes> mode and out of it, the function should check the current
+state of C<bytes>-flag as in:
+
+    use bytes ();			# for $bytes::hint_bits
+    sub translator {
+	if ($^H & $bytes::hint_bits) {
+	    return bytes_translator(@_);
+	}
+	else {
+	    return utf8_translator(@_);
+	}
+    }
+
+=head1 CUSTOM ALIASES
+
+This version of charnames supports three mechanisms of adding local
+or customized aliases to standard Unicode naming conventions (:full)
+
+=head2 Anonymous hashes
+
+    use charnames ":full", ":alias" => {
+        e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
+        };
+    my $str = "\N{e_ACUTE}";
+
+=head2 Alias file
+
+    use charnames ":full", ":alias" => "pro";
+
+    will try to read "unicore/pro_alias.pl" from the @INC path. This
+    file should return a list in plain perl:
+
+    (
+    A_GRAVE         => "LATIN CAPITAL LETTER A WITH GRAVE",
+    A_CIRCUM        => "LATIN CAPITAL LETTER A WITH CIRCUMFLEX",
+    A_DIAERES       => "LATIN CAPITAL LETTER A WITH DIAERESIS",
+    A_TILDE         => "LATIN CAPITAL LETTER A WITH TILDE",
+    A_BREVE         => "LATIN CAPITAL LETTER A WITH BREVE",
+    A_RING          => "LATIN CAPITAL LETTER A WITH RING ABOVE",
+    A_MACRON        => "LATIN CAPITAL LETTER A WITH MACRON",
+    );
+
+=head2 Alias shortcut
+
+    use charnames ":alias" => ":pro";
+
+    works exactly the same as the alias pairs, only this time,
+    ":full" is inserted automatically as first argument (if no
+    other argument is given).
+
+=head1 charnames::viacode(code)
+
+Returns the full name of the character indicated by the numeric code.
+The example
+
+    print charnames::viacode(0x2722);
+
+prints "FOUR TEARDROP-SPOKED ASTERISK".
+
+Returns undef if no name is known for the code.
+
+This works only for the standard names, and does not yet apply
+to custom translators.
+
+Notice that the name returned for of U+FEFF is "ZERO WIDTH NO-BREAK
+SPACE", not "BYTE ORDER MARK".
+
+=head1 charnames::vianame(name)
+
+Returns the code point indicated by the name.
+The example
+
+    printf "%04X", charnames::vianame("FOUR TEARDROP-SPOKED ASTERISK");
+
+prints "2722".
+
+Returns undef if the name is unknown.
+
+This works only for the standard names, and does not yet apply
+to custom translators.
+
+=head1 ALIASES
+
+A few aliases have been defined for convenience: instead of having
+to use the official names
+
+    LINE FEED (LF)
+    FORM FEED (FF)
+    CARRIAGE RETURN (CR)
+    NEXT LINE (NEL)
+
+(yes, with parentheses) one can use
+
+    LINE FEED
+    FORM FEED
+    CARRIAGE RETURN
+    NEXT LINE
+    LF
+    FF
+    CR
+    NEL
+
+One can also use
+
+    BYTE ORDER MARK
+    BOM
+
+and
+
+    ZWNJ
+    ZWJ
+
+for ZERO WIDTH NON-JOINER and ZERO WIDTH JOINER.
+
+For backward compatibility one can use the old names for
+certain C0 and C1 controls
+
+    old                         new
+
+    HORIZONTAL TABULATION       CHARACTER TABULATION
+    VERTICAL TABULATION         LINE TABULATION
+    FILE SEPARATOR              INFORMATION SEPARATOR FOUR
+    GROUP SEPARATOR             INFORMATION SEPARATOR THREE
+    RECORD SEPARATOR            INFORMATION SEPARATOR TWO
+    UNIT SEPARATOR              INFORMATION SEPARATOR ONE
+    PARTIAL LINE DOWN           PARTIAL LINE FORWARD
+    PARTIAL LINE UP             PARTIAL LINE BACKWARD
+
+but the old names in addition to giving the character
+will also give a warning about being deprecated.
+
+=head1 ILLEGAL CHARACTERS
+
+If you ask by name for a character that does not exist, a warning is
+given and the Unicode I<replacement character> "\x{FFFD}" is returned.
+
+If you ask by code for a character that does not exist, no warning is
+given and C<undef> is returned.  (Though if you ask for a code point
+past U+10FFFF you do get a warning.)
+
+=head1 BUGS
+
+Since evaluation of the translation function happens in a middle of
+compilation (of a string literal), the translation function should not
+do any C<eval>s or C<require>s.  This restriction should be lifted in
+a future version of Perl.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/complete.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/complete.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/complete.pl	(revision 14489)
@@ -0,0 +1,120 @@
+;#
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Term::Complete
+#
+;#      @(#)complete.pl,v1.1            (me@anywhere.EBay.Sun.COM) 09/23/91
+;#
+;# Author: Wayne Thompson
+;#
+;# Description:
+;#     This routine provides word completion.
+;#     (TAB) attempts word completion.
+;#     (^D)  prints completion list.
+;#      (These may be changed by setting $Complete'complete, etc.)
+;#
+;# Diagnostics:
+;#     Bell when word completion fails.
+;#
+;# Dependencies:
+;#     The tty driver is put into raw mode.
+;#
+;# Bugs:
+;#
+;# Usage:
+;#     $input = &Complete('prompt_string', *completion_list);
+;#         or
+;#     $input = &Complete('prompt_string', @completion_list);
+;#
+
+CONFIG: {
+    package Complete;
+
+    $complete = "\004";
+    $kill     = "\025";
+    $erase1 =   "\177";
+    $erase2 =   "\010";
+}
+
+sub Complete {
+    package Complete;
+
+    local($prompt, @cmp_list, $return, @match, $l, $test, $cmp, $r);
+    if ($_[1] =~ /^StB\0/) {
+        ($prompt, *_) = @_;
+    }
+    else {
+        $prompt = shift(@_);
+    }
+    @cmp_lst = sort(@_);
+
+    system('stty raw -echo');
+    LOOP: {
+        print($prompt, $return);
+        while (($_ = getc(STDIN)) ne "\r") {
+            CASE: {
+                # (TAB) attempt completion
+                $_ eq "\t" && do {
+                    @match = grep(/^$return/, @cmp_lst);
+                    $l = length($test = shift(@match));
+                    unless ($#match < 0) {
+                        foreach $cmp (@match) {
+                            until (substr($cmp, 0, $l) eq substr($test, 0, $l)) {
+                                $l--;
+                            }
+                        }
+                        print("\a");
+                    }
+                    print($test = substr($test, $r, $l - $r));
+                    $r = length($return .= $test);
+                    last CASE;
+                };
+
+                # (^D) completion list
+                $_ eq $complete && do {
+                    print(join("\r\n", '', grep(/^$return/, @cmp_lst)), "\r\n");
+                    redo LOOP;
+                };
+
+                # (^U) kill
+                $_ eq $kill && do {
+                    if ($r) {
+                        undef $r;
+			undef $return;
+                        print("\r\n");
+                        redo LOOP;
+                    }
+                    last CASE;
+                };
+
+                # (DEL) || (BS) erase
+                ($_ eq $erase1 || $_ eq $erase2) && do {
+                    if($r) {
+                        print("\b \b");
+                        chop($return);
+                        $r--;
+                    }
+                    last CASE;
+                };
+
+                # printable char
+                ord >= 32 && do {
+                    $return .= $_;
+                    $r++;
+                    print;
+                    last CASE;
+                };
+            }
+        }
+    }
+    system('stty -raw echo');
+    print("\n");
+    $return;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/constant.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/constant.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/constant.pm	(revision 14489)
@@ -0,0 +1,340 @@
+package constant;
+
+use strict;
+use 5.006_00;
+use warnings::register;
+
+our($VERSION, %declared);
+$VERSION = '1.05';
+
+#=======================================================================
+
+# Some names are evil choices.
+my %keywords = map +($_, 1), qw{ BEGIN INIT CHECK END DESTROY AUTOLOAD };
+
+my %forced_into_main = map +($_, 1),
+    qw{ STDIN STDOUT STDERR ARGV ARGVOUT ENV INC SIG };
+
+my %forbidden = (%keywords, %forced_into_main);
+
+#=======================================================================
+# import() - import symbols into user's namespace
+#
+# What we actually do is define a function in the caller's namespace
+# which returns the value. The function we create will normally
+# be inlined as a constant, thereby avoiding further sub calling 
+# overhead.
+#=======================================================================
+sub import {
+    my $class = shift;
+    return unless @_;			# Ignore 'use constant;'
+    my %constants = ();
+    my $multiple  = ref $_[0];
+
+    if ( $multiple ) {
+	if (ref $_[0] ne 'HASH') {
+	    require Carp;
+	    Carp::croak("Invalid reference type '".ref(shift)."' not 'HASH'");
+	}
+	%constants = %{+shift};
+    } else {
+	$constants{+shift} = undef;
+    }
+
+    foreach my $name ( keys %constants ) {
+	unless (defined $name) {
+	    require Carp;
+	    Carp::croak("Can't use undef as constant name");
+	}
+	my $pkg = caller;
+
+	# Normal constant name
+	if ($name =~ /^_?[^\W_0-9]\w*\z/ and !$forbidden{$name}) {
+	    # Everything is okay
+
+	# Name forced into main, but we're not in main. Fatal.
+	} elsif ($forced_into_main{$name} and $pkg ne 'main') {
+	    require Carp;
+	    Carp::croak("Constant name '$name' is forced into main::");
+
+	# Starts with double underscore. Fatal.
+	} elsif ($name =~ /^__/) {
+	    require Carp;
+	    Carp::croak("Constant name '$name' begins with '__'");
+
+	# Maybe the name is tolerable
+	} elsif ($name =~ /^[A-Za-z_]\w*\z/) {
+	    # Then we'll warn only if you've asked for warnings
+	    if (warnings::enabled()) {
+		if ($keywords{$name}) {
+		    warnings::warn("Constant name '$name' is a Perl keyword");
+		} elsif ($forced_into_main{$name}) {
+		    warnings::warn("Constant name '$name' is " .
+			"forced into package main::");
+		}
+	    }
+
+	# Looks like a boolean
+	# use constant FRED == fred;
+	} elsif ($name =~ /^[01]?\z/) {
+            require Carp;
+	    if (@_) {
+		Carp::croak("Constant name '$name' is invalid");
+	    } else {
+		Carp::croak("Constant name looks like boolean value");
+	    }
+
+	} else {
+	   # Must have bad characters
+            require Carp;
+	    Carp::croak("Constant name '$name' has invalid characters");
+	}
+
+	{
+	    no strict 'refs';
+	    my $full_name = "${pkg}::$name";
+	    $declared{$full_name}++;
+	    if ($multiple) {
+		my $scalar = $constants{$name};
+		*$full_name = sub () { $scalar };
+	    } else {
+		if (@_ == 1) {
+		    my $scalar = $_[0];
+		    *$full_name = sub () { $scalar };
+		} elsif (@_) {
+		    my @list = @_;
+		    *$full_name = sub () { @list };
+		} else {
+		    *$full_name = sub () { };
+		}
+	    }
+	}
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+constant - Perl pragma to declare constants
+
+=head1 SYNOPSIS
+
+    use constant PI    => 4 * atan2(1, 1);
+    use constant DEBUG => 0;
+
+    print "Pi equals ", PI, "...\n" if DEBUG;
+
+    use constant {
+        SEC   => 0,
+        MIN   => 1,
+        HOUR  => 2,
+        MDAY  => 3,
+        MON   => 4,
+        YEAR  => 5,
+        WDAY  => 6,
+        YDAY  => 7,
+        ISDST => 8,
+    };
+
+    use constant WEEKDAYS => qw(
+        Sunday Monday Tuesday Wednesday Thursday Friday Saturday
+    );
+
+    print "Today is ", (WEEKDAYS)[ (localtime)[WDAY] ], ".\n";
+
+=head1 DESCRIPTION
+
+This will declare a symbol to be a constant with the given value.
+
+When you declare a constant such as C<PI> using the method shown
+above, each machine your script runs upon can have as many digits
+of accuracy as it can use. Also, your program will be easier to
+read, more likely to be maintained (and maintained correctly), and
+far less likely to send a space probe to the wrong planet because
+nobody noticed the one equation in which you wrote C<3.14195>.
+
+When a constant is used in an expression, perl replaces it with its
+value at compile time, and may then optimize the expression further.
+In particular, any code in an C<if (CONSTANT)> block will be optimized
+away if the constant is false.
+
+=head1 NOTES
+
+As with all C<use> directives, defining a constant happens at
+compile time. Thus, it's probably not correct to put a constant
+declaration inside of a conditional statement (like C<if ($foo)
+{ use constant ... }>).
+
+Constants defined using this module cannot be interpolated into
+strings like variables.  However, concatenation works just fine:
+
+    print "Pi equals PI...\n";        # WRONG: does not expand "PI"
+    print "Pi equals ".PI."...\n";    # right
+
+Even though a reference may be declared as a constant, the reference may
+point to data which may be changed, as this code shows.
+
+    use constant ARRAY => [ 1,2,3,4 ];
+    print ARRAY->[1];
+    ARRAY->[1] = " be changed";
+    print ARRAY->[1];
+
+Dereferencing constant references incorrectly (such as using an array
+subscript on a constant hash reference, or vice versa) will be trapped at
+compile time.
+
+Constants belong to the package they are defined in.  To refer to a
+constant defined in another package, specify the full package name, as
+in C<Some::Package::CONSTANT>.  Constants may be exported by modules,
+and may also be called as either class or instance methods, that is,
+as C<< Some::Package->CONSTANT >> or as C<< $obj->CONSTANT >> where
+C<$obj> is an instance of C<Some::Package>.  Subclasses may define
+their own constants to override those in their base class.
+
+The use of all caps for constant names is merely a convention,
+although it is recommended in order to make constants stand out
+and to help avoid collisions with other barewords, keywords, and
+subroutine names. Constant names must begin with a letter or
+underscore. Names beginning with a double underscore are reserved. Some
+poor choices for names will generate warnings, if warnings are enabled at
+compile time.
+
+=head2 List constants
+
+Constants may be lists of more (or less) than one value.  A constant
+with no values evaluates to C<undef> in scalar context.  Note that
+constants with more than one value do I<not> return their last value in
+scalar context as one might expect.  They currently return the number
+of values, but B<this may change in the future>.  Do not use constants
+with multiple values in scalar context.
+
+B<NOTE:> This implies that the expression defining the value of a
+constant is evaluated in list context.  This may produce surprises:
+
+    use constant TIMESTAMP => localtime;                # WRONG!
+    use constant TIMESTAMP => scalar localtime;         # right
+
+The first line above defines C<TIMESTAMP> as a 9-element list, as
+returned by localtime() in list context.  To set it to the string
+returned by localtime() in scalar context, an explicit C<scalar>
+keyword is required.
+
+List constants are lists, not arrays.  To index or slice them, they
+must be placed in parentheses.
+
+    my @workdays = WEEKDAYS[1 .. 5];            # WRONG!
+    my @workdays = (WEEKDAYS)[1 .. 5];          # right
+
+=head2 Defining multiple constants at once
+
+Instead of writing multiple C<use constant> statements, you may define
+multiple constants in a single statement by giving, instead of the
+constant name, a reference to a hash where the keys are the names of
+the constants to be defined.  Obviously, all constants defined using
+this method must have a single value.
+
+    use constant {
+        FOO => "A single value",
+        BAR => "This", "won't", "work!",        # Error!
+    };
+
+This is a fundamental limitation of the way hashes are constructed in
+Perl.  The error messages produced when this happens will often be
+quite cryptic -- in the worst case there may be none at all, and
+you'll only later find that something is broken.
+
+When defining multiple constants, you cannot use the values of other
+constants defined in the same declaration.  This is because the
+calling package doesn't know about any constant within that group
+until I<after> the C<use> statement is finished.
+
+    use constant {
+        BITMASK => 0xAFBAEBA8,
+        NEGMASK => ~BITMASK,                    # Error!
+    };
+
+=head2 Magic constants
+
+Magical values and references can be made into constants at compile
+time, allowing for way cool stuff like this.  (These error numbers
+aren't totally portable, alas.)
+
+    use constant E2BIG => ($! = 7);
+    print   E2BIG, "\n";        # something like "Arg list too long"
+    print 0+E2BIG, "\n";        # "7"
+
+You can't produce a tied constant by giving a tied scalar as the
+value.  References to tied variables, however, can be used as
+constants without any problems.
+
+=head1 TECHNICAL NOTES
+
+In the current implementation, scalar constants are actually
+inlinable subroutines. As of version 5.004 of Perl, the appropriate
+scalar constant is inserted directly in place of some subroutine
+calls, thereby saving the overhead of a subroutine call. See
+L<perlsub/"Constant Functions"> for details about how and when this
+happens.
+
+In the rare case in which you need to discover at run time whether a
+particular constant has been declared via this module, you may use
+this function to examine the hash C<%constant::declared>. If the given
+constant name does not include a package name, the current package is
+used.
+
+    sub declared ($) {
+        use constant 1.01;              # don't omit this!
+        my $name = shift;
+        $name =~ s/^::/main::/;
+        my $pkg = caller;
+        my $full_name = $name =~ /::/ ? $name : "${pkg}::$name";
+        $constant::declared{$full_name};
+    }
+
+=head1 BUGS
+
+In the current version of Perl, list constants are not inlined
+and some symbols may be redefined without generating a warning.
+
+It is not possible to have a subroutine or a keyword with the same
+name as a constant in the same package. This is probably a Good Thing.
+
+A constant with a name in the list C<STDIN STDOUT STDERR ARGV ARGVOUT
+ENV INC SIG> is not allowed anywhere but in package C<main::>, for
+technical reasons. 
+
+Unlike constants in some languages, these cannot be overridden
+on the command line or via environment variables.
+
+You can get into trouble if you use constants in a context which
+automatically quotes barewords (as is true for any subroutine call).
+For example, you can't say C<$hash{CONSTANT}> because C<CONSTANT> will
+be interpreted as a string.  Use C<$hash{CONSTANT()}> or
+C<$hash{+CONSTANT}> to prevent the bareword quoting mechanism from
+kicking in.  Similarly, since the C<< => >> operator quotes a bareword
+immediately to its left, you have to say C<< CONSTANT() => 'value' >>
+(or simply use a comma in place of the big arrow) instead of
+C<< CONSTANT => 'value' >>.
+
+=head1 AUTHOR
+
+Tom Phoenix, E<lt>F<rootbeer@redcat.com>E<gt>, with help from
+many other folks.
+
+Multiple constant declarations at once added by Casey West,
+E<lt>F<casey@geeknest.com>E<gt>.
+
+Documentation mostly rewritten by Ilmari Karonen,
+E<lt>F<perl@itz.pp.sci.fi>E<gt>.
+
+=head1 COPYRIGHT
+
+Copyright (C) 1997, 1999 Tom Phoenix
+
+This module is free software; you can redistribute it or modify it
+under the same terms as Perl itself.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/ctime.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ctime.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ctime.pl	(revision 14489)
@@ -0,0 +1,59 @@
+;# ctime.pl is a simple Perl emulation for the well known ctime(3C) function.
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: the POSIX ctime function
+;#
+;# Waldemar Kebsch, Federal Republic of Germany, November 1988
+;# kebsch.pad@nixpbe.UUCP
+;# Modified March 1990, Feb 1991 to properly handle timezones
+;#  $RCSfile: ctime.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:23:47 $
+;#   Marion Hakanson (hakanson@cse.ogi.edu)
+;#   Oregon Graduate Institute of Science and Technology
+;#
+;# usage:
+;#
+;#     #include <ctime.pl>          # see the -P and -I option in perl.man
+;#     $Date = &ctime(time);
+
+CONFIG: {
+    package ctime;
+
+    @DoW = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
+    @MoY = ('Jan','Feb','Mar','Apr','May','Jun',
+	    'Jul','Aug','Sep','Oct','Nov','Dec');
+}
+
+sub ctime {
+    package ctime;
+
+    local($time) = @_;
+    local($[) = 0;
+    local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
+
+    # Determine what time zone is in effect.
+    # Use GMT if TZ is defined as null, local time if TZ undefined.
+    # There's no portable way to find the system default timezone.
+
+    $TZ = defined($ENV{'TZ'}) ? ( $ENV{'TZ'} ? $ENV{'TZ'} : 'GMT' ) : '';
+    ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
+        ($TZ eq 'GMT') ? gmtime($time) : localtime($time);
+
+    # Hack to deal with 'PST8PDT' format of TZ
+    # Note that this can't deal with all the esoteric forms, but it
+    # does recognize the most common: [:]STDoff[DST[off][,rule]]
+
+    if($TZ=~/^([^:\d+\-,]{3,})([+-]?\d{1,2}(:\d{1,2}){0,2})([^\d+\-,]{3,})?/){
+        $TZ = $isdst ? $4 : $1;
+    }
+    $TZ .= ' ' unless $TZ eq '';
+
+    $year += 1900;
+    sprintf("%s %s %2d %2d:%02d:%02d %s%4d\n",
+      $DoW[$wday], $MoY[$mon], $mday, $hour, $min, $sec, $TZ, $year);
+}
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/dbm_filter_util.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/dbm_filter_util.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/dbm_filter_util.pl	(revision 14489)
@@ -0,0 +1,68 @@
+use strict;
+use warnings;
+
+sub StoreData
+{
+    my $hashref = shift ;
+    my $store = shift ;
+
+    my (undef, $file, $line) = caller;
+    ok 1, "StoreData called from $file, line $line";
+
+    ok ref $store eq 'HASH', "Store Data is a hash reference";
+    ok tied %$hashref, "Storing to tied hash";
+
+    while (my ($k, $v) = each %$store) {
+        no warnings 'uninitialized';
+	#diag "Stored [$k][$v]";
+        $$hashref{$k} = $v ;
+    }
+
+}
+
+sub VerifyData
+{
+    my $hashref = shift ;
+    my $expected = shift ;
+    my %expected = %$expected;
+
+    my (undef, $file, $line) = caller;
+    ok 1, "VerifyData called from $file, line $line";
+
+    ok ref $expected eq 'HASH', "Expected data is a hash reference";
+    ok tied %$hashref, "Verifying a tied hash";
+
+    my %bad = ();
+    while (my ($k, $v) = each %$hashref) {
+        no warnings 'uninitialized';
+        if ($expected{$k} eq $v) {
+            #diag "Match [$k][$v]"; 
+            delete $expected{$k} ;
+        }
+        else {
+            #diag "No Match [$k][$v]"; 
+            $bad{$k} = $v;
+        }
+    }
+
+    if( ! ok(keys(%bad) + keys(%expected) == 0, "Expected == Actual") ) {
+        my $bad = "Expected does not match actual\n";
+        if (keys %expected ) {
+            $bad .="  No Match from Expected:\n" ;
+            while (my ($k, $v) = each %expected) {
+                $bad .= "\t'$k' =>\t'$v'\n";
+            }
+        }
+        if (keys %bad ) {
+            $bad .= "\n  No Match from Actual:\n" ;
+            while (my ($k, $v) = each %bad) {
+                no warnings 'uninitialized';
+                $bad .= "\t'$k' =>\t'$v'\n";
+            }
+        }
+        diag "${bad}\n" ;
+    }
+}
+
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/diagnostics.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/diagnostics.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/diagnostics.pm	(revision 14489)
@@ -0,0 +1,646 @@
+package diagnostics;
+
+=head1 NAME
+
+diagnostics, splain - produce verbose warning diagnostics
+
+=head1 SYNOPSIS
+
+Using the C<diagnostics> pragma:
+
+    use diagnostics;
+    use diagnostics -verbose;
+
+    enable  diagnostics;
+    disable diagnostics;
+
+Using the C<splain> standalone filter program:
+
+    perl program 2>diag.out
+    splain [-v] [-p] diag.out
+
+Using diagnostics to get stack traces from a misbehaving script:
+
+    perl -Mdiagnostics=-traceonly my_script.pl
+
+=head1 DESCRIPTION
+
+=head2 The C<diagnostics> Pragma
+
+This module extends the terse diagnostics normally emitted by both the
+perl compiler and the perl interpreter (from running perl with a -w 
+switch or C<use warnings>), augmenting them with the more
+explicative and endearing descriptions found in L<perldiag>.  Like the
+other pragmata, it affects the compilation phase of your program rather
+than merely the execution phase.
+
+To use in your program as a pragma, merely invoke
+
+    use diagnostics;
+
+at the start (or near the start) of your program.  (Note 
+that this I<does> enable perl's B<-w> flag.)  Your whole
+compilation will then be subject(ed :-) to the enhanced diagnostics.
+These still go out B<STDERR>.
+
+Due to the interaction between runtime and compiletime issues,
+and because it's probably not a very good idea anyway,
+you may not use C<no diagnostics> to turn them off at compiletime.
+However, you may control their behaviour at runtime using the 
+disable() and enable() methods to turn them off and on respectively.
+
+The B<-verbose> flag first prints out the L<perldiag> introduction before
+any other diagnostics.  The $diagnostics::PRETTY variable can generate nicer
+escape sequences for pagers.
+
+Warnings dispatched from perl itself (or more accurately, those that match
+descriptions found in L<perldiag>) are only displayed once (no duplicate
+descriptions).  User code generated warnings a la warn() are unaffected,
+allowing duplicate user messages to be displayed.
+
+This module also adds a stack trace to the error message when perl dies.
+This is useful for pinpointing what caused the death. The B<-traceonly> (or
+just B<-t>) flag turns off the explanations of warning messages leaving just
+the stack traces. So if your script is dieing, run it again with
+
+  perl -Mdiagnostics=-traceonly my_bad_script
+
+to see the call stack at the time of death. By supplying the B<-warntrace>
+(or just B<-w>) flag, any warnings emitted will also come with a stack
+trace.
+
+=head2 The I<splain> Program
+
+While apparently a whole nuther program, I<splain> is actually nothing
+more than a link to the (executable) F<diagnostics.pm> module, as well as
+a link to the F<diagnostics.pod> documentation.  The B<-v> flag is like
+the C<use diagnostics -verbose> directive.
+The B<-p> flag is like the
+$diagnostics::PRETTY variable.  Since you're post-processing with 
+I<splain>, there's no sense in being able to enable() or disable() processing.
+
+Output from I<splain> is directed to B<STDOUT>, unlike the pragma.
+
+=head1 EXAMPLES
+
+The following file is certain to trigger a few errors at both
+runtime and compiletime:
+
+    use diagnostics;
+    print NOWHERE "nothing\n";
+    print STDERR "\n\tThis message should be unadorned.\n";
+    warn "\tThis is a user warning";
+    print "\nDIAGNOSTIC TESTER: Please enter a <CR> here: ";
+    my $a, $b = scalar <STDIN>;
+    print "\n";
+    print $x/$y;
+
+If you prefer to run your program first and look at its problem
+afterwards, do this:
+
+    perl -w test.pl 2>test.out
+    ./splain < test.out
+
+Note that this is not in general possible in shells of more dubious heritage, 
+as the theoretical 
+
+    (perl -w test.pl >/dev/tty) >& test.out
+    ./splain < test.out
+
+Because you just moved the existing B<stdout> to somewhere else.
+
+If you don't want to modify your source code, but still have on-the-fly
+warnings, do this:
+
+    exec 3>&1; perl -w test.pl 2>&1 1>&3 3>&- | splain 1>&2 3>&- 
+
+Nifty, eh?
+
+If you want to control warnings on the fly, do something like this.
+Make sure you do the C<use> first, or you won't be able to get
+at the enable() or disable() methods.
+
+    use diagnostics; # checks entire compilation phase 
+	print "\ntime for 1st bogus diags: SQUAWKINGS\n";
+	print BOGUS1 'nada';
+	print "done with 1st bogus\n";
+
+    disable diagnostics; # only turns off runtime warnings
+	print "\ntime for 2nd bogus: (squelched)\n";
+	print BOGUS2 'nada';
+	print "done with 2nd bogus\n";
+
+    enable diagnostics; # turns back on runtime warnings
+	print "\ntime for 3rd bogus: SQUAWKINGS\n";
+	print BOGUS3 'nada';
+	print "done with 3rd bogus\n";
+
+    disable diagnostics;
+	print "\ntime for 4th bogus: (squelched)\n";
+	print BOGUS4 'nada';
+	print "done with 4th bogus\n";
+
+=head1 INTERNALS
+
+Diagnostic messages derive from the F<perldiag.pod> file when available at
+runtime.  Otherwise, they may be embedded in the file itself when the
+splain package is built.   See the F<Makefile> for details.
+
+If an extant $SIG{__WARN__} handler is discovered, it will continue
+to be honored, but only after the diagnostics::splainthis() function 
+(the module's $SIG{__WARN__} interceptor) has had its way with your
+warnings.
+
+There is a $diagnostics::DEBUG variable you may set if you're desperately
+curious what sorts of things are being intercepted.
+
+    BEGIN { $diagnostics::DEBUG = 1 } 
+
+
+=head1 BUGS
+
+Not being able to say "no diagnostics" is annoying, but may not be
+insurmountable.
+
+The C<-pretty> directive is called too late to affect matters.
+You have to do this instead, and I<before> you load the module.
+
+    BEGIN { $diagnostics::PRETTY = 1 } 
+
+I could start up faster by delaying compilation until it should be
+needed, but this gets a "panic: top_level" when using the pragma form
+in Perl 5.001e.
+
+While it's true that this documentation is somewhat subserious, if you use
+a program named I<splain>, you should expect a bit of whimsy.
+
+=head1 AUTHOR
+
+Tom Christiansen <F<tchrist@mox.perl.com>>, 25 June 1995.
+
+=cut
+
+use strict;
+use 5.006;
+use Carp;
+$Carp::Internal{__PACKAGE__.""}++;
+
+our $VERSION = 1.15;
+our $DEBUG;
+our $VERBOSE;
+our $PRETTY;
+our $TRACEONLY = 0;
+our $WARNTRACE = 0;
+
+use Config;
+my($privlib, $archlib) = @Config{qw(privlibexp archlibexp)};
+if ($^O eq 'VMS') {
+    require VMS::Filespec;
+    $privlib = VMS::Filespec::unixify($privlib);
+    $archlib = VMS::Filespec::unixify($archlib);
+}
+my @trypod = (
+	   "$archlib/pod/perldiag.pod",
+	   "$privlib/pod/perldiag-$Config{version}.pod",
+	   "$privlib/pod/perldiag.pod",
+	   "$archlib/pods/perldiag.pod",
+	   "$privlib/pods/perldiag-$Config{version}.pod",
+	   "$privlib/pods/perldiag.pod",
+	  );
+# handy for development testing of new warnings etc
+unshift @trypod, "./pod/perldiag.pod" if -e "pod/perldiag.pod";
+(my $PODFILE) = ((grep { -e } @trypod), $trypod[$#trypod])[0];
+
+if ($^O eq 'MacOS') {
+    # just updir one from each lib dir, we'll find it ...
+    ($PODFILE) = grep { -e } map { "$_:pod:perldiag.pod" } @INC;
+}
+
+
+$DEBUG ||= 0;
+my $WHOAMI = ref bless [];  # nobody's business, prolly not even mine
+
+local $| = 1;
+local $_;
+
+my $standalone;
+my(%HTML_2_Troff, %HTML_2_Latin_1, %HTML_2_ASCII_7);
+
+CONFIG: {
+    our $opt_p = our $opt_d = our $opt_v = our $opt_f = '';
+
+    unless (caller) {
+	$standalone++;
+	require Getopt::Std;
+	Getopt::Std::getopts('pdvf:')
+	    or die "Usage: $0 [-v] [-p] [-f splainpod]";
+	$PODFILE = $opt_f if $opt_f;
+	$DEBUG = 2 if $opt_d;
+	$VERBOSE = $opt_v;
+	$PRETTY = $opt_p;
+    }
+
+    if (open(POD_DIAG, $PODFILE)) {
+	warn "Happy happy podfile from real $PODFILE\n" if $DEBUG;
+	last CONFIG;
+    } 
+
+    if (caller) {
+	INCPATH: {
+	    for my $file ( (map { "$_/$WHOAMI.pm" } @INC), $0) {
+		warn "Checking $file\n" if $DEBUG;
+		if (open(POD_DIAG, $file)) {
+		    while (<POD_DIAG>) {
+			next unless
+			    /^__END__\s*# wish diag dbase were more accessible/;
+			print STDERR "podfile is $file\n" if $DEBUG;
+			last INCPATH;
+		    }
+		}
+	    } 
+	}
+    } else { 
+	print STDERR "podfile is <DATA>\n" if $DEBUG;
+	*POD_DIAG = *main::DATA;
+    }
+}
+if (eof(POD_DIAG)) { 
+    die "couldn't find diagnostic data in $PODFILE @INC $0";
+}
+
+
+%HTML_2_Troff = (
+    'amp'	=>	'&',	#   ampersand
+    'lt'	=>	'<',	#   left chevron, less-than
+    'gt'	=>	'>',	#   right chevron, greater-than
+    'quot'	=>	'"',	#   double quote
+
+    "Aacute"	=>	"A\\*'",	#   capital A, acute accent
+    # etc
+
+);
+
+%HTML_2_Latin_1 = (
+    'amp'	=>	'&',	#   ampersand
+    'lt'	=>	'<',	#   left chevron, less-than
+    'gt'	=>	'>',	#   right chevron, greater-than
+    'quot'	=>	'"',	#   double quote
+
+    "Aacute"	=>	"\xC1"	#   capital A, acute accent
+
+    # etc
+);
+
+%HTML_2_ASCII_7 = (
+    'amp'	=>	'&',	#   ampersand
+    'lt'	=>	'<',	#   left chevron, less-than
+    'gt'	=>	'>',	#   right chevron, greater-than
+    'quot'	=>	'"',	#   double quote
+
+    "Aacute"	=>	"A"	#   capital A, acute accent
+    # etc
+);
+
+our %HTML_Escapes;
+*HTML_Escapes = do {
+    if ($standalone) {
+	$PRETTY ? \%HTML_2_Latin_1 : \%HTML_2_ASCII_7; 
+    } else {
+	\%HTML_2_Latin_1; 
+    }
+}; 
+
+*THITHER = $standalone ? *STDOUT : *STDERR;
+
+my %transfmt = (); 
+my $transmo = <<EOFUNC;
+sub transmo {
+    #local \$^W = 0;  # recursive warnings we do NOT need!
+    study;
+EOFUNC
+
+my %msg;
+{
+    print STDERR "FINISHING COMPILATION for $_\n" if $DEBUG;
+    local $/ = '';
+    local $_;
+    my $header;
+    my $for_item;
+    while (<POD_DIAG>) {
+
+	unescape();
+	if ($PRETTY) {
+	    sub noop   { return $_[0] }  # spensive for a noop
+	    sub bold   { my $str =$_[0];  $str =~ s/(.)/$1\b$1/g; return $str; } 
+	    sub italic { my $str = $_[0]; $str =~ s/(.)/_\b$1/g;  return $str; } 
+	    s/C<<< (.*?) >>>|C<< (.*?) >>|[BC]<(.*?)>/bold($+)/ges;
+	    s/[LIF]<(.*?)>/italic($1)/ges;
+	} else {
+	    s/C<<< (.*?) >>>|C<< (.*?) >>|[BC]<(.*?)>/$+/gs;
+	    s/[LIF]<(.*?)>/$1/gs;
+	} 
+	unless (/^=/) {
+	    if (defined $header) { 
+		if ( $header eq 'DESCRIPTION' && 
+		    (   /Optional warnings are enabled/ 
+		     || /Some of these messages are generic./
+		    ) )
+		{
+		    next;
+		}
+		s/^/    /gm;
+		$msg{$header} .= $_;
+	 	undef $for_item;	
+	    }
+	    next;
+	} 
+	unless ( s/=item (.*?)\s*\z//) {
+
+	    if ( s/=head1\sDESCRIPTION//) {
+		$msg{$header = 'DESCRIPTION'} = '';
+		undef $for_item;
+	    }
+	    elsif( s/^=for\s+diagnostics\s*\n(.*?)\s*\z// ) {
+		$for_item = $1;
+	    } 
+	    next;
+	}
+
+	if( $for_item ) { $header = $for_item; undef $for_item } 
+	else {
+	    $header = $1;
+	    while( $header =~ /[;,]\z/ ) {
+		<POD_DIAG> =~ /^\s*(.*?)\s*\z/;
+		$header .= ' '.$1;
+	    }
+	}
+
+	# strip formatting directives from =item line
+	$header =~ s/[A-Z]<(.*?)>/$1/g;
+
+        my @toks = split( /(%l?[dx]|%c|%(?:\.\d+)?s)/, $header );
+	if (@toks > 1) {
+            my $conlen = 0;
+            for my $i (0..$#toks){
+                if( $i % 2 ){
+                    if(      $toks[$i] eq '%c' ){
+                        $toks[$i] = '.';
+                    } elsif( $toks[$i] eq '%d' ){
+                        $toks[$i] = '\d+';
+                    } elsif( $toks[$i] eq '%s' ){
+                        $toks[$i] = $i == $#toks ? '.*' : '.*?';
+                    } elsif( $toks[$i] =~ '%.(\d+)s' ){
+                        $toks[$i] = ".{$1}";
+                     } elsif( $toks[$i] =~ '^%l*x$' ){
+                        $toks[$i] = '[\da-f]+';
+                   }
+                } elsif( length( $toks[$i] ) ){
+                    $toks[$i] =~ s/^.*$/\Q$&\E/;
+                    $conlen += length( $toks[$i] );
+                }
+            }  
+            my $lhs = join( '', @toks );
+	    $transfmt{$header}{pat} =
+              "    s{^$lhs}\n     {\Q$header\E}s\n\t&& return 1;\n";
+            $transfmt{$header}{len} = $conlen;
+	} else {
+            $transfmt{$header}{pat} =
+	      "    m{^\Q$header\E} && return 1;\n";
+            $transfmt{$header}{len} = length( $header );
+	} 
+
+	print STDERR "$WHOAMI: Duplicate entry: \"$header\"\n"
+	    if $msg{$header};
+
+	$msg{$header} = '';
+    } 
+
+
+    close POD_DIAG unless *main::DATA eq *POD_DIAG;
+
+    die "No diagnostics?" unless %msg;
+
+    # Apply patterns in order of decreasing sum of lengths of fixed parts
+    # Seems the best way of hitting the right one.
+    for my $hdr ( sort { $transfmt{$b}{len} <=> $transfmt{$a}{len} }
+                  keys %transfmt ){
+        $transmo .= $transfmt{$hdr}{pat};
+    }
+    $transmo .= "    return 0;\n}\n";
+    print STDERR $transmo if $DEBUG;
+    eval $transmo;
+    die $@ if $@;
+}
+
+if ($standalone) {
+    if (!@ARGV and -t STDIN) { print STDERR "$0: Reading from STDIN\n" } 
+    while (defined (my $error = <>)) {
+	splainthis($error) || print THITHER $error;
+    } 
+    exit;
+} 
+
+my $olddie;
+my $oldwarn;
+
+sub import {
+    shift;
+    $^W = 1; # yup, clobbered the global variable; 
+	     # tough, if you want diags, you want diags.
+    return if defined $SIG{__WARN__} && ($SIG{__WARN__} eq \&warn_trap);
+
+    for (@_) {
+
+	/^-d(ebug)?$/ 	   	&& do {
+				    $DEBUG++;
+				    next;
+				   };
+
+	/^-v(erbose)?$/ 	&& do {
+				    $VERBOSE++;
+				    next;
+				   };
+
+	/^-p(retty)?$/ 		&& do {
+				    print STDERR "$0: I'm afraid it's too late for prettiness.\n";
+				    $PRETTY++;
+				    next;
+			       };
+
+	/^-t(race)?$/ 		&& do {
+				    $TRACEONLY++;
+				    next;
+			       };
+	/^-w(arntrace)?$/ 		&& do {
+				    $WARNTRACE++;
+				    next;
+			       };
+
+	warn "Unknown flag: $_";
+    } 
+
+    $oldwarn = $SIG{__WARN__};
+    $olddie = $SIG{__DIE__};
+    $SIG{__WARN__} = \&warn_trap;
+    $SIG{__DIE__} = \&death_trap;
+} 
+
+sub enable { &import }
+
+sub disable {
+    shift;
+    return unless $SIG{__WARN__} eq \&warn_trap;
+    $SIG{__WARN__} = $oldwarn || '';
+    $SIG{__DIE__} = $olddie || '';
+} 
+
+sub warn_trap {
+    my $warning = $_[0];
+    if (caller eq $WHOAMI or !splainthis($warning)) {
+	if ($WARNTRACE) {
+	    print STDERR Carp::longmess($warning);
+	} else {
+	    print STDERR $warning;
+	}
+    } 
+    goto &$oldwarn if defined $oldwarn and $oldwarn and $oldwarn ne \&warn_trap;
+};
+
+sub death_trap {
+    my $exception = $_[0];
+
+    # See if we are coming from anywhere within an eval. If so we don't
+    # want to explain the exception because it's going to get caught.
+    my $in_eval = 0;
+    my $i = 0;
+    while (my $caller = (caller($i++))[3]) {
+      if ($caller eq '(eval)') {
+	$in_eval = 1;
+	last;
+      }
+    }
+
+    splainthis($exception) unless $in_eval;
+    if (caller eq $WHOAMI) { print STDERR "INTERNAL EXCEPTION: $exception"; } 
+    &$olddie if defined $olddie and $olddie and $olddie ne \&death_trap;
+
+    return if $in_eval;
+
+    # We don't want to unset these if we're coming from an eval because
+    # then we've turned off diagnostics.
+
+    # Switch off our die/warn handlers so we don't wind up in our own
+    # traps.
+    $SIG{__DIE__} = $SIG{__WARN__} = '';
+
+    # Have carp skip over death_trap() when showing the stack trace.
+    local($Carp::CarpLevel) = 1;
+
+    confess "Uncaught exception from user code:\n\t$exception";
+	# up we go; where we stop, nobody knows, but i think we die now
+	# but i'm deeply afraid of the &$olddie guy reraising and us getting
+	# into an indirect recursion loop
+};
+
+my %exact_duplicate;
+my %old_diag;
+my $count;
+my $wantspace;
+sub splainthis {
+    return 0 if $TRACEONLY;
+    local $_ = shift;
+    local $\;
+    ### &finish_compilation unless %msg;
+    s/\.?\n+$//;
+    my $orig = $_;
+    # return unless defined;
+
+    # get rid of the where-are-we-in-input part
+    s/, <.*?> (?:line|chunk).*$//;
+
+    # Discard 1st " at <file> line <no>" and all text beyond
+    # but be aware of messsages containing " at this-or-that"
+    my $real = 0;
+    my @secs = split( / at / );
+    $_ = $secs[0];
+    for my $i ( 1..$#secs ){
+        if( $secs[$i] =~ /.+? (?:line|chunk) \d+/ ){
+            $real = 1;
+            last;
+        } else {
+            $_ .= ' at ' . $secs[$i];
+	}
+    }
+    
+    # remove parenthesis occurring at the end of some messages 
+    s/^\((.*)\)$/$1/;
+
+    if ($exact_duplicate{$orig}++) {
+	return &transmo;
+    } else {
+	return 0 unless &transmo;
+    }
+
+    $orig = shorten($orig);
+    if ($old_diag{$_}) {
+	autodescribe();
+	print THITHER "$orig (#$old_diag{$_})\n";
+	$wantspace = 1;
+    } else {
+	autodescribe();
+	$old_diag{$_} = ++$count;
+	print THITHER "\n" if $wantspace;
+	$wantspace = 0;
+	print THITHER "$orig (#$old_diag{$_})\n";
+	if ($msg{$_}) {
+	    print THITHER $msg{$_};
+	} else {
+	    if (0 and $standalone) { 
+		print THITHER "    **** Error #$old_diag{$_} ",
+			($real ? "is" : "appears to be"),
+			" an unknown diagnostic message.\n\n";
+	    }
+	    return 0;
+	} 
+    }
+    return 1;
+} 
+
+sub autodescribe {
+    if ($VERBOSE and not $count) {
+	print THITHER &{$PRETTY ? \&bold : \&noop}("DESCRIPTION OF DIAGNOSTICS"),
+		"\n$msg{DESCRIPTION}\n";
+    } 
+} 
+
+sub unescape { 
+    s {
+            E<  
+            ( [A-Za-z]+ )       
+            >   
+    } { 
+         do {   
+             exists $HTML_Escapes{$1}
+                ? do { $HTML_Escapes{$1} }
+                : do {
+                    warn "Unknown escape: E<$1> in $_";
+                    "E<$1>";
+                } 
+         } 
+    }egx;
+}
+
+sub shorten {
+    my $line = $_[0];
+    if (length($line) > 79 and index($line, "\n") == -1) {
+	my $space_place = rindex($line, ' ', 79);
+	if ($space_place != -1) {
+	    substr($line, $space_place, 1) = "\n\t";
+	} 
+    } 
+    return $line;
+} 
+
+
+1 unless $standalone;  # or it'll complain about itself
+__END__ # wish diag dbase were more accessible
Index: /for-distributions/trunk/bin/windows/perl/lib/dotsh.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/dotsh.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/dotsh.pl	(revision 14489)
@@ -0,0 +1,74 @@
+#
+#   @(#)dotsh.pl                                               03/19/94
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+#
+#   Author: Charles Collins
+#
+#   Description:
+#      This routine takes a shell script and 'dots' it into the current perl
+#      environment. This makes it possible to use existing system scripts
+#      to alter environment variables on the fly.
+#
+#   Usage:
+#      &dotsh ('ShellScript', 'DependentVariable(s)');
+#
+#         where
+#
+#      'ShellScript' is the full name of the shell script to be dotted
+#
+#      'DependentVariable(s)' is an optional list of shell variables in the
+#         form VARIABLE=VALUE,VARIABLE=VALUE,... that 'ShellScript' is
+#         dependent upon. These variables MUST be defined using shell syntax.
+#
+#   Example:
+#      &dotsh ('/foo/bar', 'arg1');
+#      &dotsh ('/foo/bar');
+#      &dotsh ('/foo/bar arg1 ... argN');
+#
+sub dotsh {
+   local(@sh) = @_;
+   local($tmp,$key,$shell,$command,$args,$vars) = '';
+   local(*dotsh);
+   undef *dotsh;
+   $dotsh = shift(@sh);
+   @dotsh = split (/\s/, $dotsh);
+   $command = shift (@dotsh);
+   $args = join (" ", @dotsh);
+   $vars = join ("\n", @sh);
+   open (_SH_ENV, "$command") || die "Could not open $dotsh!\n";
+   chop($_ = <_SH_ENV>);
+   $shell = "$1 -c" if ($_ =~ /^\#\!\s*(\S+(\/sh|\/ksh|\/zsh|\/csh))\s*$/);
+   close (_SH_ENV);
+   if (!$shell) {
+      if ($ENV{'SHELL'} =~ /\/sh$|\/ksh$|\/zsh$|\/bash$|\/csh$/) {
+	 $shell = "$ENV{'SHELL'} -c";
+      } else {
+	 print "SHELL not recognized!\nUsing /bin/sh...\n";
+	 $shell = "/bin/sh -c";
+      }
+   }
+   if (length($vars) > 0) {
+      open (_SH_ENV, "$shell \"$vars && . $command $args && set \" |") || die;
+   } else {
+      open (_SH_ENV, "$shell \". $command $args && set \" |") || die;
+   }
+
+   while (<_SH_ENV>) {
+       chop;
+       m/^([^=]*)=(.*)/s;
+       $ENV{$1} = $2;
+   }
+   close (_SH_ENV);
+
+   foreach $key (keys(%ENV)) {
+       $tmp .= "\$$key = \$ENV{'$key'};" if $key =~ /^[A-Za-z]\w*$/;
+   }
+   eval $tmp;
+}
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/dumpvar.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/dumpvar.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/dumpvar.pl	(revision 14489)
@@ -0,0 +1,535 @@
+require 5.002;			# For (defined ref)
+package dumpvar;
+
+# Needed for PrettyPrinter only:
+
+# require 5.001;  # Well, it coredumps anyway undef DB in 5.000 (not now)
+
+# translate control chars to ^X - Randal Schwartz
+# Modifications to print types by Peter Gordon v1.0
+
+# Ilya Zakharevich -- patches after 5.001 (and some before ;-)
+
+# Won't dump symbol tables and contents of debugged files by default
+
+$winsize = 80 unless defined $winsize;
+
+
+# Defaults
+
+# $globPrint = 1;
+$printUndef = 1 unless defined $printUndef;
+$tick = "auto" unless defined $tick;
+$unctrl = 'quote' unless defined $unctrl;
+$subdump = 1;
+$dumpReused = 0 unless defined $dumpReused;
+$bareStringify = 1 unless defined $bareStringify;
+
+sub main::dumpValue {
+  local %address;
+  local $^W=0;
+  (print "undef\n"), return unless defined $_[0];
+  (print &stringify($_[0]), "\n"), return unless ref $_[0];
+  push @_, -1 if @_ == 1;
+  dumpvar::unwrap($_[0], 0, $_[1]);
+}
+
+# This one is good for variable names:
+
+sub unctrl {
+	local($_) = @_;
+	local($v) ; 
+
+	return \$_ if ref \$_ eq "GLOB";
+	s/([\001-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+	$_;
+}
+
+sub uniescape {
+    join("",
+	 map { $_ > 255 ? sprintf("\\x{%04X}", $_) : chr($_) }
+	     unpack("U*", $_[0]));
+}
+
+sub stringify {
+	local($_,$noticks) = @_;
+	local($v) ; 
+	my $tick = $tick;
+
+	return 'undef' unless defined $_ or not $printUndef;
+	return $_ . "" if ref \$_ eq 'GLOB';
+	$_ = &{'overload::StrVal'}($_) 
+	  if $bareStringify and ref $_ 
+	    and %overload:: and defined &{'overload::StrVal'};
+	
+	if ($tick eq 'auto') {
+	  if (/[\000-\011\013-\037\177]/) {
+	    $tick = '"';
+	  }else {
+	    $tick = "'";
+	  }
+	}
+	if ($tick eq "'") {
+	  s/([\'\\])/\\$1/g;
+	} elsif ($unctrl eq 'unctrl') {
+	  s/([\"\\])/\\$1/g ;
+	  s/([\000-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+	  # uniescape?
+	  s/([\200-\377])/'\\0x'.sprintf('%2X',ord($1))/eg 
+	    if $quoteHighBit;
+	} elsif ($unctrl eq 'quote') {
+	  s/([\"\\\$\@])/\\$1/g if $tick eq '"';
+	  s/\033/\\e/g;
+	  s/([\000-\037\177])/'\\c'._escaped_ord($1)/eg;
+	}
+	$_ = uniescape($_);
+	s/([\200-\377])/'\\'.sprintf('%3o',ord($1))/eg if $quoteHighBit;
+	($noticks || /^\d+(\.\d*)?\Z/) 
+	  ? $_ 
+	  : $tick . $_ . $tick;
+}
+
+# Ensure a resulting \ is escaped to be \\
+sub _escaped_ord {
+    my $chr = shift;
+    $chr = chr(ord($chr)^64);
+    $chr =~ s{\\}{\\\\}g;
+    return $chr;
+}
+
+sub ShortArray {
+  my $tArrayDepth = $#{$_[0]} ; 
+  $tArrayDepth = $#{$_[0]} < $arrayDepth-1 ? $#{$_[0]} : $arrayDepth-1 
+    unless  $arrayDepth eq '' ; 
+  my $shortmore = "";
+  $shortmore = " ..." if $tArrayDepth < $#{$_[0]} ;
+  if (!grep(ref $_, @{$_[0]})) {
+    $short = "0..$#{$_[0]}  '" . 
+      join("' '", @{$_[0]}[0..$tArrayDepth]) . "'$shortmore";
+    return $short if length $short <= $compactDump;
+  }
+  undef;
+}
+
+sub DumpElem {
+  my $short = &stringify($_[0], ref $_[0]);
+  if ($veryCompact && ref $_[0]
+      && (ref $_[0] eq 'ARRAY' and !grep(ref $_, @{$_[0]}) )) {
+    my $end = "0..$#{$v}  '" . 
+      join("' '", @{$_[0]}[0..$tArrayDepth]) . "'$shortmore";
+  } elsif ($veryCompact && ref $_[0]
+      && (ref $_[0] eq 'HASH') and !grep(ref $_, values %{$_[0]})) {
+    my $end = 1;
+	  $short = $sp . "0..$#{$v}  '" . 
+	    join("' '", @{$v}[0..$tArrayDepth]) . "'$shortmore";
+  } else {
+    print "$short\n";
+    unwrap($_[0],$_[1],$_[2]) if ref $_[0];
+  }
+}
+
+sub unwrap {
+    return if $DB::signal;
+    local($v) = shift ; 
+    local($s) = shift ; # extra no of spaces
+    local($m) = shift ; # maximum recursion depth
+    return if $m == 0;
+    local(%v,@v,$sp,$value,$key,@sortKeys,$more,$shortmore,$short) ;
+    local($tHashDepth,$tArrayDepth) ;
+
+    $sp = " " x $s ;
+    $s += 3 ; 
+
+    # Check for reused addresses
+    if (ref $v) { 
+      my $val = $v;
+      $val = &{'overload::StrVal'}($v) 
+	if %overload:: and defined &{'overload::StrVal'};
+      # Match type and address.                      
+      # Unblessed references will look like TYPE(0x...)
+      # Blessed references will look like Class=TYPE(0x...)
+      ($start_part, $val) = split /=/,$val;
+      $val = $start_part unless defined $val;
+      ($item_type, $address) = 
+        $val =~ /([^\(]+)        # Keep stuff that's     
+                                 # not an open paren
+                 \(              # Skip open paren
+                 (0x[0-9a-f]+)   # Save the address
+                 \)              # Skip close paren
+                 $/x;            # Should be at end now
+
+      if (!$dumpReused && defined $address) { 
+	$address{$address}++ ;
+	if ( $address{$address} > 1 ) { 
+	  print "${sp}-> REUSED_ADDRESS\n" ; 
+	  return ; 
+	} 
+      }
+    } elsif (ref \$v eq 'GLOB') {
+      # This is a raw glob. Special handling for that.
+      $address = "$v" . "";	# To avoid a bug with globs
+      $address{$address}++ ;
+      if ( $address{$address} > 1 ) { 
+	print "${sp}*DUMPED_GLOB*\n" ; 
+	return ; 
+      } 
+    }
+
+    if (ref $v eq 'Regexp') {
+      # Reformat the regexp to look the standard way.
+      my $re = "$v";
+      $re =~ s,/,\\/,g;
+      print "$sp-> qr/$re/\n";
+      return;
+    }
+
+    if ( $item_type eq 'HASH' ) { 
+        # Hash ref or hash-based object.
+	my @sortKeys = sort keys(%$v) ;
+	undef $more ; 
+	$tHashDepth = $#sortKeys ; 
+	$tHashDepth = $#sortKeys < $hashDepth-1 ? $#sortKeys : $hashDepth-1
+	  unless $hashDepth eq '' ; 
+	$more = "....\n" if $tHashDepth < $#sortKeys ; 
+	$shortmore = "";
+	$shortmore = ", ..." if $tHashDepth < $#sortKeys ; 
+	$#sortKeys = $tHashDepth ; 
+	if ($compactDump && !grep(ref $_, values %{$v})) {
+	  #$short = $sp . 
+	  #  (join ', ', 
+# Next row core dumps during require from DB on 5.000, even with map {"_"}
+	  #   map {&stringify($_) . " => " . &stringify($v->{$_})} 
+	  #   @sortKeys) . "'$shortmore";
+	  $short = $sp;
+	  my @keys;
+	  for (@sortKeys) {
+	    push @keys, &stringify($_) . " => " . &stringify($v->{$_});
+	  }
+	  $short .= join ', ', @keys;
+	  $short .= $shortmore;
+	  (print "$short\n"), return if length $short <= $compactDump;
+	}
+	for $key (@sortKeys) {
+	    return if $DB::signal;
+	    $value = $ {$v}{$key} ;
+	    print "$sp", &stringify($key), " => ";
+	    DumpElem $value, $s, $m-1;
+	}
+	print "$sp  empty hash\n" unless @sortKeys;
+	print "$sp$more" if defined $more ;
+    } elsif ( $item_type eq 'ARRAY' ) { 
+        # Array ref or array-based object. Also: undef.
+        # See how big the array is.
+	$tArrayDepth = $#{$v} ; 
+	undef $more ; 
+        # Bigger than the max?
+	$tArrayDepth = $#{$v} < $arrayDepth-1 ? $#{$v} : $arrayDepth-1 
+	  if defined $arrayDepth && $arrayDepth ne '';
+        # Yep. Don't show it all.
+	$more = "....\n" if $tArrayDepth < $#{$v} ; 
+	$shortmore = "";
+	$shortmore = " ..." if $tArrayDepth < $#{$v} ;
+
+	if ($compactDump && !grep(ref $_, @{$v})) {
+	  if ($#$v >= 0) {
+	    $short = $sp . "0..$#{$v}  " . 
+	      join(" ", 
+		   map {exists $v->[$_] ? stringify $v->[$_] : "empty"} ($[..$tArrayDepth)
+		  ) . "$shortmore";
+	  } else {
+	    $short = $sp . "empty array";
+	  }
+	  (print "$short\n"), return if length $short <= $compactDump;
+	}
+	#if ($compactDump && $short = ShortArray($v)) {
+	#  print "$short\n";
+	#  return;
+	#}
+	for $num ($[ .. $tArrayDepth) {
+	    return if $DB::signal;
+	    print "$sp$num  ";
+	    if (exists $v->[$num]) {
+                if (defined $v->[$num]) {
+	          DumpElem $v->[$num], $s, $m-1;
+                } 
+                else {
+                  print "undef\n";
+                }
+	    } else {
+	    	print "empty slot\n";
+	    }
+	}
+	print "$sp  empty array\n" unless @$v;
+	print "$sp$more" if defined $more ;  
+    } elsif ( $item_type eq 'SCALAR' ) { 
+            unless (defined $$v) {
+              print "$sp-> undef\n";
+              return;
+            }
+	    print "$sp-> ";
+	    DumpElem $$v, $s, $m-1;
+    } elsif ( $item_type eq 'REF' ) { 
+	    print "$sp-> $$v\n";
+            return unless defined $$v;
+	    unwrap($$v, $s+3, $m-1);
+    } elsif ( $item_type eq 'CODE' ) { 
+            # Code object or reference.
+	    print "$sp-> ";
+	    dumpsub (0, $v);
+    } elsif ( $item_type eq 'GLOB' ) {
+      # Glob object or reference.
+      print "$sp-> ",&stringify($$v,1),"\n";
+      if ($globPrint) {
+	$s += 3;
+       dumpglob($s, "{$$v}", $$v, 1, $m-1);
+      } elsif (defined ($fileno = fileno($v))) {
+	print( (' ' x ($s+3)) .  "FileHandle({$$v}) => fileno($fileno)\n" );
+      }
+    } elsif (ref \$v eq 'GLOB') {
+      # Raw glob (again?)
+      if ($globPrint) {
+       dumpglob($s, "{$v}", $v, 1, $m-1) if $globPrint;
+      } elsif (defined ($fileno = fileno(\$v))) {
+	print( (' ' x $s) .  "FileHandle({$v}) => fileno($fileno)\n" );
+      }
+    }
+}
+
+sub matchlex {
+  (my $var = $_[0]) =~ s/.//;
+  $var eq $_[1] or 
+    ($_[1] =~ /^([!~])(.)([\x00-\xff]*)/) and 
+      ($1 eq '!') ^ (eval { $var =~ /$2$3/ });
+}
+
+sub matchvar {
+  $_[0] eq $_[1] or 
+    ($_[1] =~ /^([!~])(.)([\x00-\xff]*)/) and 
+      ($1 eq '!') ^ (eval {($_[2] . "::" . $_[0]) =~ /$2$3/});
+}
+
+sub compactDump {
+  $compactDump = shift if @_;
+  $compactDump = 6*80-1 if $compactDump and $compactDump < 2;
+  $compactDump;
+}
+
+sub veryCompact {
+  $veryCompact = shift if @_;
+  compactDump(1) if !$compactDump and $veryCompact;
+  $veryCompact;
+}
+
+sub unctrlSet {
+  if (@_) {
+    my $in = shift;
+    if ($in eq 'unctrl' or $in eq 'quote') {
+      $unctrl = $in;
+    } else {
+      print "Unknown value for `unctrl'.\n";
+    }
+  }
+  $unctrl;
+}
+
+sub quote {
+  if (@_ and $_[0] eq '"') {
+    $tick = '"';
+    $unctrl = 'quote';
+  } elsif (@_ and $_[0] eq 'auto') {
+    $tick = 'auto';
+    $unctrl = 'quote';
+  } elsif (@_) {		# Need to set
+    $tick = "'";
+    $unctrl = 'unctrl';
+  }
+  $tick;
+}
+
+sub dumpglob {
+    return if $DB::signal;
+    my ($off,$key, $val, $all, $m) = @_;
+    local(*entry) = $val;
+    my $fileno;
+    if (($key !~ /^_</ or $dumpDBFiles) and defined $entry) {
+      print( (' ' x $off) . "\$", &unctrl($key), " = " );
+      DumpElem $entry, 3+$off, $m;
+    }
+    if (($key !~ /^_</ or $dumpDBFiles) and @entry) {
+      print( (' ' x $off) . "\@$key = (\n" );
+      unwrap(\@entry,3+$off,$m) ;
+      print( (' ' x $off) .  ")\n" );
+    }
+    if ($key ne "main::" && $key ne "DB::" && %entry
+	&& ($dumpPackages or $key !~ /::$/)
+	&& ($key !~ /^_</ or $dumpDBFiles)
+	&& !($package eq "dumpvar" and $key eq "stab")) {
+      print( (' ' x $off) . "\%$key = (\n" );
+      unwrap(\%entry,3+$off,$m) ;
+      print( (' ' x $off) .  ")\n" );
+    }
+    if (defined ($fileno = fileno(*entry))) {
+      print( (' ' x $off) .  "FileHandle($key) => fileno($fileno)\n" );
+    }
+    if ($all) {
+      if (defined &entry) {
+	dumpsub($off, $key);
+      }
+    }
+}
+
+sub dumplex {
+  return if $DB::signal;
+  my ($key, $val, $m, @vars) = @_;
+  return if @vars && !grep( matchlex($key, $_), @vars );
+  local %address;
+  my $off = 0;  # It reads better this way
+  my $fileno;
+  if (UNIVERSAL::isa($val,'ARRAY')) {
+    print( (' ' x $off) . "$key = (\n" );
+    unwrap($val,3+$off,$m) ;
+    print( (' ' x $off) .  ")\n" );
+  }
+  elsif (UNIVERSAL::isa($val,'HASH')) {
+    print( (' ' x $off) . "$key = (\n" );
+    unwrap($val,3+$off,$m) ;
+    print( (' ' x $off) .  ")\n" );
+  }
+  elsif (UNIVERSAL::isa($val,'IO')) {
+    print( (' ' x $off) .  "FileHandle($key) => fileno($fileno)\n" );
+  }
+  #  No lexical subroutines yet...
+  #  elsif (UNIVERSAL::isa($val,'CODE')) {
+  #    dumpsub($off, $$val);
+  #  }
+  else {
+    print( (' ' x $off) . &unctrl($key), " = " );
+    DumpElem $$val, 3+$off, $m;
+  }
+}
+
+sub CvGV_name_or_bust {
+  my $in = shift;
+  return if $skipCvGV;		# Backdoor to avoid problems if XS broken...
+  $in = \&$in;			# Hard reference...
+  eval {require Devel::Peek; 1} or return;
+  my $gv = Devel::Peek::CvGV($in) or return;
+  *$gv{PACKAGE} . '::' . *$gv{NAME};
+}
+
+sub dumpsub {
+    my ($off,$sub) = @_;
+    my $ini = $sub;
+    my $s;
+    $sub = $1 if $sub =~ /^\{\*(.*)\}$/;
+    my $subref = defined $1 ? \&$sub : \&$ini;
+    my $place = $DB::sub{$sub} || (($s = $subs{"$subref"}) && $DB::sub{$s})
+      || (($s = CvGV_name_or_bust($subref)) && $DB::sub{$s})
+      || ($subdump && ($s = findsubs("$subref")) && $DB::sub{$s});
+    $place = '???' unless defined $place;
+    $s = $sub unless defined $s;
+    print( (' ' x $off) .  "&$s in $place\n" );
+}
+
+sub findsubs {
+  return undef unless %DB::sub;
+  my ($addr, $name, $loc);
+  while (($name, $loc) = each %DB::sub) {
+    $addr = \&$name;
+    $subs{"$addr"} = $name;
+  }
+  $subdump = 0;
+  $subs{ shift() };
+}
+
+sub main::dumpvar {
+    my ($package,$m,@vars) = @_;
+    local(%address,$key,$val,$^W);
+    $package .= "::" unless $package =~ /::$/;
+    *stab = *{"main::"};
+    while ($package =~ /(\w+?::)/g){
+      *stab = $ {stab}{$1};
+    }
+    local $TotalStrings = 0;
+    local $Strings = 0;
+    local $CompleteTotal = 0;
+    while (($key,$val) = each(%stab)) {
+      return if $DB::signal;
+      next if @vars && !grep( matchvar($key, $_), @vars );
+      if ($usageOnly) {
+	globUsage(\$val, $key)
+	  if ($package ne 'dumpvar' or $key ne 'stab')
+	     and ref(\$val) eq 'GLOB';
+      } else {
+       dumpglob(0,$key, $val, 0, $m);
+      }
+    }
+    if ($usageOnly) {
+      print "String space: $TotalStrings bytes in $Strings strings.\n";
+      $CompleteTotal += $TotalStrings;
+      print "Grand total = $CompleteTotal bytes (1 level deep) + overhead.\n";
+    }
+}
+
+sub scalarUsage {
+  my $size = length($_[0]);
+  $TotalStrings += $size;
+  $Strings++;
+  $size;
+}
+
+sub arrayUsage {		# array ref, name
+  my $size = 0;
+  map {$size += scalarUsage($_)} @{$_[0]};
+  my $len = @{$_[0]};
+  print "\@$_[1] = $len item", ($len > 1 ? "s" : ""),
+    " (data: $size bytes)\n"
+      if defined $_[1];
+  $CompleteTotal +=  $size;
+  $size;
+}
+
+sub hashUsage {		# hash ref, name
+  my @keys = keys %{$_[0]};
+  my @values = values %{$_[0]};
+  my $keys = arrayUsage \@keys;
+  my $values = arrayUsage \@values;
+  my $len = @keys;
+  my $total = $keys + $values;
+  print "\%$_[1] = $len item", ($len > 1 ? "s" : ""),
+    " (keys: $keys; values: $values; total: $total bytes)\n"
+      if defined $_[1];
+  $total;
+}
+
+sub globUsage {			# glob ref, name
+  local *name = *{$_[0]};
+  $total = 0;
+  $total += scalarUsage $name if defined $name;
+  $total += arrayUsage \@name, $_[1] if @name;
+  $total += hashUsage \%name, $_[1] if %name and $_[1] ne "main::" 
+    and $_[1] ne "DB::";   #and !($package eq "dumpvar" and $key eq "stab"));
+  $total;
+}
+
+sub packageUsage {
+  my ($package,@vars) = @_;
+  $package .= "::" unless $package =~ /::$/;
+  local *stab = *{"main::"};
+  while ($package =~ /(\w+?::)/g){
+    *stab = $ {stab}{$1};
+  }
+  local $TotalStrings = 0;
+  local $CompleteTotal = 0;
+  my ($key,$val);
+  while (($key,$val) = each(%stab)) {
+    next if @vars && !grep($key eq $_,@vars);
+    globUsage \$val, $key unless $package eq 'dumpvar' and $key eq 'stab';
+  }
+  print "String space: $TotalStrings.\n";
+  $CompleteTotal += $TotalStrings;
+  print "\nGrand total = $CompleteTotal bytes\n";
+}
+
+1;
+
Index: /for-distributions/trunk/bin/windows/perl/lib/encoding.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/encoding.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/encoding.pm	(revision 14489)
@@ -0,0 +1,634 @@
+# $Id: encoding.pm,v 2.2 2005/09/08 14:17:17 dankogai Exp dankogai $
+package encoding;
+our $VERSION = do { my @r = (q$Revision: 2.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+
+use Encode;
+use strict;
+
+sub DEBUG () { 0 }
+
+BEGIN {
+    if (ord("A") == 193) {
+	require Carp;
+	Carp::croak("encoding: pragma does not support EBCDIC platforms");
+    }
+}
+
+our $HAS_PERLIO = 0;
+eval { require PerlIO::encoding };
+unless ($@){
+    $HAS_PERLIO = (PerlIO::encoding->VERSION >= 0.02);
+}
+
+sub _exception{
+    my $name = shift;
+    $] > 5.008 and return 0;               # 5.8.1 or higher then no
+    my %utfs = map {$_=>1}
+	qw(utf8 UCS-2BE UCS-2LE UTF-16 UTF-16BE UTF-16LE
+	   UTF-32 UTF-32BE UTF-32LE);
+    $utfs{$name} or return 0;               # UTFs or no
+    require Config; Config->import(); our %Config;
+    return $Config{perl_patchlevel} ? 0 : 1 # maintperl then no
+}
+
+sub in_locale { $^H & ($locale::hint_bits || 0)}
+
+sub _get_locale_encoding {
+    my $locale_encoding;
+
+    # I18N::Langinfo isn't available everywhere
+    eval {
+	require I18N::Langinfo;
+	I18N::Langinfo->import(qw(langinfo CODESET));
+	$locale_encoding = langinfo(CODESET());
+    };
+    
+    my $country_language;
+
+    no warnings 'uninitialized';
+
+    if (not $locale_encoding && in_locale()) {
+	if ($ENV{LC_ALL} =~ /^([^.]+)\.([^.]+)$/) {
+	    ($country_language, $locale_encoding) = ($1, $2);
+	} elsif ($ENV{LANG} =~ /^([^.]+)\.([^.]+)$/) {
+	    ($country_language, $locale_encoding) = ($1, $2);
+	}
+	# LANGUAGE affects only LC_MESSAGES only on glibc
+    } elsif (not $locale_encoding) {
+	if ($ENV{LC_ALL} =~ /\butf-?8\b/i ||
+	    $ENV{LANG}   =~ /\butf-?8\b/i) {
+	    $locale_encoding = 'utf8';
+	}
+	# Could do more heuristics based on the country and language
+	# parts of LC_ALL and LANG (the parts before the dot (if any)),
+	# since we have Locale::Country and Locale::Language available.
+	# TODO: get a database of Language -> Encoding mappings
+	# (the Estonian database at http://www.eki.ee/letter/
+	# would be excellent!) --jhi
+    }
+    if (defined $locale_encoding &&
+	lc($locale_encoding) eq 'euc' &&
+	defined $country_language) {
+	if ($country_language =~ /^ja_JP|japan(?:ese)?$/i) {
+	    $locale_encoding = 'euc-jp';
+	} elsif ($country_language =~ /^ko_KR|korean?$/i) {
+	    $locale_encoding = 'euc-kr';
+	} elsif ($country_language =~ /^zh_CN|chin(?:a|ese)?$/i) {
+	    $locale_encoding = 'euc-cn';
+	} elsif ($country_language =~ /^zh_TW|taiwan(?:ese)?$/i) {
+	    $locale_encoding = 'euc-tw';
+	} else {
+	    require Carp;
+	    Carp::croak("encoding: Locale encoding '$locale_encoding' too ambiguous");
+	}
+    }
+
+    return $locale_encoding;
+}
+
+sub import {
+    my $class = shift;
+    my $name  = shift;
+    if ($name eq ':_get_locale_encoding') { # used by lib/open.pm
+	my $caller = caller();
+        {
+	    no strict 'refs';
+	    *{"${caller}::_get_locale_encoding"} = \&_get_locale_encoding;
+	}
+	return;
+    }
+    $name = _get_locale_encoding() if $name eq ':locale';
+    my %arg = @_;
+    $name = $ENV{PERL_ENCODING} unless defined $name;
+    my $enc = find_encoding($name);
+    unless (defined $enc) {
+	require Carp;
+	Carp::croak("encoding: Unknown encoding '$name'");
+    }
+    $name = $enc->name; # canonize
+    unless ($arg{Filter}) {
+	DEBUG and warn "_exception($name) = ", _exception($name);
+	_exception($name) or ${^ENCODING} = $enc;
+	$HAS_PERLIO or return 1;
+    }else{
+	defined(${^ENCODING}) and undef ${^ENCODING};
+	# implicitly 'use utf8'
+	require utf8; # to fetch $utf8::hint_bits;
+	$^H |= $utf8::hint_bits;
+	eval {
+	    require Filter::Util::Call ;
+	    Filter::Util::Call->import ;
+	    filter_add(sub{
+			   my $status = filter_read();
+                           if ($status > 0){
+			       $_ = $enc->decode($_, 1);
+			       DEBUG and warn $_;
+			   }
+			   $status ;
+		       });
+	};
+        $@ eq '' and DEBUG and warn "Filter installed";
+    }
+    defined ${^UNICODE} and ${^UNICODE} != 0 and return 1;
+    for my $h (qw(STDIN STDOUT)){
+	if ($arg{$h}){
+	    unless (defined find_encoding($arg{$h})) {
+		require Carp;
+		Carp::croak("encoding: Unknown encoding for $h, '$arg{$h}'");
+	    }
+	    eval { binmode($h, ":raw :encoding($arg{$h})") };
+	}else{
+	    unless (exists $arg{$h}){
+		eval { 
+		    no warnings 'uninitialized';
+		    binmode($h, ":raw :encoding($name)");
+		};
+	    }
+	}
+	if ($@){
+	    require Carp;
+	    Carp::croak($@);
+	}
+    }
+    return 1; # I doubt if we need it, though
+}
+
+sub unimport{
+    no warnings;
+    undef ${^ENCODING};
+    if ($HAS_PERLIO){
+	binmode(STDIN,  ":raw");
+	binmode(STDOUT, ":raw");
+    }else{
+	binmode(STDIN);
+	binmode(STDOUT);
+    }
+    if ($INC{"Filter/Util/Call.pm"}){
+	eval { filter_del() };
+    }
+}
+
+1;
+__END__
+
+=pod
+
+=head1 NAME
+
+encoding - allows you to write your script in non-ascii or non-utf8
+
+=head1 SYNOPSIS
+
+  use encoding "greek";  # Perl like Greek to you?
+  use encoding "euc-jp"; # Jperl!
+
+  # or you can even do this if your shell supports your native encoding
+
+  perl -Mencoding=latin2 -e '...' # Feeling centrally European?
+  perl -Mencoding=euc-kr -e '...' # Or Korean?
+
+  # more control
+
+  # A simple euc-cn => utf-8 converter
+  use encoding "euc-cn", STDOUT => "utf8";  while(<>){print};
+
+  # "no encoding;" supported (but not scoped!)
+  no encoding;
+
+  # an alternate way, Filter
+  use encoding "euc-jp", Filter=>1;
+  # now you can use kanji identifiers -- in euc-jp!
+
+  # switch on locale -
+  # note that this probably means that unless you have a complete control
+  # over the environments the application is ever going to be run, you should
+  # NOT use the feature of encoding pragma allowing you to write your script
+  # in any recognized encoding because changing locale settings will wreck
+  # the script; you can of course still use the other features of the pragma.
+  use encoding ':locale';
+
+=head1 ABSTRACT
+
+Let's start with a bit of history: Perl 5.6.0 introduced Unicode
+support.  You could apply C<substr()> and regexes even to complex CJK
+characters -- so long as the script was written in UTF-8.  But back
+then, text editors that supported UTF-8 were still rare and many users
+instead chose to write scripts in legacy encodings, giving up a whole
+new feature of Perl 5.6.
+
+Rewind to the future: starting from perl 5.8.0 with the B<encoding>
+pragma, you can write your script in any encoding you like (so long
+as the C<Encode> module supports it) and still enjoy Unicode support.
+This pragma achieves that by doing the following:
+
+=over
+
+=item *
+
+Internally converts all literals (C<q//,qq//,qr//,qw///, qx//>) from
+the encoding specified to utf8.  In Perl 5.8.1 and later, literals in
+C<tr///> and C<DATA> pseudo-filehandle are also converted.
+
+=item *
+
+Changing PerlIO layers of C<STDIN> and C<STDOUT> to the encoding
+ specified.
+
+=back
+
+=head2 Literal Conversions
+
+You can write code in EUC-JP as follows:
+
+  my $Rakuda = "\xF1\xD1\xF1\xCC"; # Camel in Kanji
+               #<-char-><-char->   # 4 octets
+  s/\bCamel\b/$Rakuda/;
+
+And with C<use encoding "euc-jp"> in effect, it is the same thing as
+the code in UTF-8:
+
+  my $Rakuda = "\x{99F1}\x{99DD}"; # two Unicode Characters
+  s/\bCamel\b/$Rakuda/;
+
+=head2 PerlIO layers for C<STD(IN|OUT)>
+
+The B<encoding> pragma also modifies the filehandle layers of
+STDIN and STDOUT to the specified encoding.  Therefore,
+
+  use encoding "euc-jp";
+  my $message = "Camel is the symbol of perl.\n";
+  my $Rakuda = "\xF1\xD1\xF1\xCC"; # Camel in Kanji
+  $message =~ s/\bCamel\b/$Rakuda/;
+  print $message;
+
+Will print "\xF1\xD1\xF1\xCC is the symbol of perl.\n",
+not "\x{99F1}\x{99DD} is the symbol of perl.\n".
+
+You can override this by giving extra arguments; see below.
+
+=head2 Implicit upgrading for byte strings
+
+By default, if strings operating under byte semantics and strings
+with Unicode character data are concatenated, the new string will
+be created by decoding the byte strings as I<ISO 8859-1 (Latin-1)>.
+
+The B<encoding> pragma changes this to use the specified encoding
+instead.  For example:
+
+    use encoding 'utf8';
+    my $string = chr(20000); # a Unicode string
+    utf8::encode($string);   # now it's a UTF-8 encoded byte string
+    # concatenate with another Unicode string
+    print length($string . chr(20000));
+
+Will print C<2>, because C<$string> is upgraded as UTF-8.  Without
+C<use encoding 'utf8';>, it will print C<4> instead, since C<$string>
+is three octets when interpreted as Latin-1.
+
+=head1 FEATURES THAT REQUIRE 5.8.1
+
+Some of the features offered by this pragma requires perl 5.8.1.  Most
+of these are done by Inaba Hiroto.  Any other features and changes
+are good for 5.8.0.
+
+=over
+
+=item "NON-EUC" doublebyte encodings
+
+Because perl needs to parse script before applying this pragma, such
+encodings as Shift_JIS and Big-5 that may contain '\' (BACKSLASH;
+\x5c) in the second byte fails because the second byte may
+accidentally escape the quoting character that follows.  Perl 5.8.1
+or later fixes this problem.
+
+=item tr// 
+
+C<tr//> was overlooked by Perl 5 porters when they released perl 5.8.0
+See the section below for details.
+
+=item DATA pseudo-filehandle
+
+Another feature that was overlooked was C<DATA>. 
+
+=back
+
+=head1 USAGE
+
+=over 4
+
+=item use encoding [I<ENCNAME>] ;
+
+Sets the script encoding to I<ENCNAME>.  And unless ${^UNICODE} 
+exists and non-zero, PerlIO layers of STDIN and STDOUT are set to
+":encoding(I<ENCNAME>)".
+
+Note that STDERR WILL NOT be changed.
+
+Also note that non-STD file handles remain unaffected.  Use C<use
+open> or C<binmode> to change layers of those.
+
+If no encoding is specified, the environment variable L<PERL_ENCODING>
+is consulted.  If no encoding can be found, the error C<Unknown encoding
+'I<ENCNAME>'> will be thrown.
+
+=item use encoding I<ENCNAME> [ STDIN =E<gt> I<ENCNAME_IN> ...] ;
+
+You can also individually set encodings of STDIN and STDOUT via the
+C<< STDIN => I<ENCNAME> >> form.  In this case, you cannot omit the
+first I<ENCNAME>.  C<< STDIN => undef >> turns the IO transcoding
+completely off.
+
+When ${^UNICODE} exists and non-zero, these options will completely
+ignored.  ${^UNICODE} is a variable introduced in perl 5.8.1.  See
+L<perlrun> see L<perlvar/"${^UNICODE}"> and L<perlrun/"-C"> for
+details (perl 5.8.1 and later).
+
+=item use encoding I<ENCNAME> Filter=E<gt>1;
+
+This turns the encoding pragma into a source filter.  While the
+default approach just decodes interpolated literals (in qq() and
+qr()), this will apply a source filter to the entire source code.  See
+L</"The Filter Option"> below for details.
+
+=item no encoding;
+
+Unsets the script encoding. The layers of STDIN, STDOUT are
+reset to ":raw" (the default unprocessed raw stream of bytes).
+
+=back
+
+=head1 The Filter Option
+
+The magic of C<use encoding> is not applied to the names of
+identifiers.  In order to make C<${"\x{4eba}"}++> ($human++, where human
+is a single Han ideograph) work, you still need to write your script
+in UTF-8 -- or use a source filter.  That's what 'Filter=>1' does.
+
+What does this mean?  Your source code behaves as if it is written in
+UTF-8 with 'use utf8' in effect.  So even if your editor only supports
+Shift_JIS, for example, you can still try examples in Chapter 15 of
+C<Programming Perl, 3rd Ed.>.  For instance, you can use UTF-8
+identifiers.
+
+This option is significantly slower and (as of this writing) non-ASCII
+identifiers are not very stable WITHOUT this option and with the
+source code written in UTF-8.
+
+=head2 Filter-related changes at Encode version 1.87
+
+=over
+
+=item *
+
+The Filter option now sets STDIN and STDOUT like non-filter options.
+And C<< STDIN=>I<ENCODING> >> and C<< STDOUT=>I<ENCODING> >> work like
+non-filter version.
+
+=item *
+
+C<use utf8> is implicitly declared so you no longer have to C<use
+utf8> to C<${"\x{4eba}"}++>.
+
+=back
+
+=head1 CAVEATS
+
+=head2 NOT SCOPED
+
+The pragma is a per script, not a per block lexical.  Only the last
+C<use encoding> or C<no encoding> matters, and it affects 
+B<the whole script>.  However, the <no encoding> pragma is supported and 
+B<use encoding> can appear as many times as you want in a given script. 
+The multiple use of this pragma is discouraged.
+
+By the same reason, the use this pragma inside modules is also
+discouraged (though not as strongly discouraged as the case above.  
+See below).
+
+If you still have to write a module with this pragma, be very careful
+of the load order.  See the codes below;
+
+  # called module
+  package Module_IN_BAR;
+  use encoding "bar";
+  # stuff in "bar" encoding here
+  1;
+
+  # caller script
+  use encoding "foo"
+  use Module_IN_BAR;
+  # surprise! use encoding "bar" is in effect.
+
+The best way to avoid this oddity is to use this pragma RIGHT AFTER
+other modules are loaded.  i.e.
+
+  use Module_IN_BAR;
+  use encoding "foo";
+
+=head2 DO NOT MIX MULTIPLE ENCODINGS
+
+Notice that only literals (string or regular expression) having only
+legacy code points are affected: if you mix data like this
+
+	\xDF\x{100}
+
+the data is assumed to be in (Latin 1 and) Unicode, not in your native
+encoding.  In other words, this will match in "greek":
+
+	"\xDF" =~ /\x{3af}/
+
+but this will not
+
+	"\xDF\x{100}" =~ /\x{3af}\x{100}/
+
+since the C<\xDF> (ISO 8859-7 GREEK SMALL LETTER IOTA WITH TONOS) on
+the left will B<not> be upgraded to C<\x{3af}> (Unicode GREEK SMALL
+LETTER IOTA WITH TONOS) because of the C<\x{100}> on the left.  You
+should not be mixing your legacy data and Unicode in the same string.
+
+This pragma also affects encoding of the 0x80..0xFF code point range:
+normally characters in that range are left as eight-bit bytes (unless
+they are combined with characters with code points 0x100 or larger,
+in which case all characters need to become UTF-8 encoded), but if
+the C<encoding> pragma is present, even the 0x80..0xFF range always
+gets UTF-8 encoded.
+
+After all, the best thing about this pragma is that you don't have to
+resort to \x{....} just to spell your name in a native encoding.
+So feel free to put your strings in your encoding in quotes and
+regexes.
+
+=head2 tr/// with ranges
+
+The B<encoding> pragma works by decoding string literals in
+C<q//,qq//,qr//,qw///, qx//> and so forth.  In perl 5.8.0, this
+does not apply to C<tr///>.  Therefore,
+
+  use encoding 'euc-jp';
+  #....
+  $kana =~ tr/\xA4\xA1-\xA4\xF3/\xA5\xA1-\xA5\xF3/;
+  #           -------- -------- -------- --------
+
+Does not work as
+
+  $kana =~ tr/\x{3041}-\x{3093}/\x{30a1}-\x{30f3}/;
+
+=over
+
+=item Legend of characters above
+
+  utf8     euc-jp   charnames::viacode()
+  -----------------------------------------
+  \x{3041} \xA4\xA1 HIRAGANA LETTER SMALL A
+  \x{3093} \xA4\xF3 HIRAGANA LETTER N
+  \x{30a1} \xA5\xA1 KATAKANA LETTER SMALL A
+  \x{30f3} \xA5\xF3 KATAKANA LETTER N
+
+=back
+
+This counterintuitive behavior has been fixed in perl 5.8.1.
+
+=head3 workaround to tr///;
+
+In perl 5.8.0, you can work around as follows;
+
+  use encoding 'euc-jp';
+  #  ....
+  eval qq{ \$kana =~ tr/\xA4\xA1-\xA4\xF3/\xA5\xA1-\xA5\xF3/ };
+
+Note the C<tr//> expression is surrounded by C<qq{}>.  The idea behind
+is the same as classic idiom that makes C<tr///> 'interpolate'.
+
+   tr/$from/$to/;            # wrong!
+   eval qq{ tr/$from/$to/ }; # workaround.
+
+Nevertheless, in case of B<encoding> pragma even C<q//> is affected so
+C<tr///> not being decoded was obviously against the will of Perl5
+Porters so it has been fixed in Perl 5.8.1 or later.
+
+=head1 EXAMPLE - Greekperl
+
+    use encoding "iso 8859-7";
+
+    # \xDF in ISO 8859-7 (Greek) is \x{3af} in Unicode.
+
+    $a = "\xDF";
+    $b = "\x{100}";
+
+    printf "%#x\n", ord($a); # will print 0x3af, not 0xdf
+
+    $c = $a . $b;
+
+    # $c will be "\x{3af}\x{100}", not "\x{df}\x{100}".
+
+    # chr() is affected, and ...
+
+    print "mega\n"  if ord(chr(0xdf)) == 0x3af;
+
+    # ... ord() is affected by the encoding pragma ...
+
+    print "tera\n" if ord(pack("C", 0xdf)) == 0x3af;
+
+    # ... as are eq and cmp ...
+
+    print "peta\n" if "\x{3af}" eq  pack("C", 0xdf);
+    print "exa\n"  if "\x{3af}" cmp pack("C", 0xdf) == 0;
+
+    # ... but pack/unpack C are not affected, in case you still
+    # want to go back to your native encoding
+
+    print "zetta\n" if unpack("C", (pack("C", 0xdf))) == 0xdf;
+
+=head1 KNOWN PROBLEMS
+
+=over
+
+=item literals in regex that are longer than 127 bytes
+
+For native multibyte encodings (either fixed or variable length),
+the current implementation of the regular expressions may introduce
+recoding errors for regular expression literals longer than 127 bytes.
+
+=item EBCDIC
+
+The encoding pragma is not supported on EBCDIC platforms.
+(Porters who are willing and able to remove this limitation are
+welcome.)
+
+=item format
+
+This pragma doesn't work well with format because PerlIO does not
+get along very well with it.  When format contains non-ascii
+characters it prints funny or gets "wide character warnings".
+To understand it, try the code below.
+
+  # Save this one in utf8
+  # replace *non-ascii* with a non-ascii string
+  my $camel;
+  format STDOUT =
+  *non-ascii*@>>>>>>>
+  $camel
+  .
+  $camel = "*non-ascii*";
+  binmode(STDOUT=>':encoding(utf8)'); # bang!
+  write;              # funny 
+  print $camel, "\n"; # fine
+
+Without binmode this happens to work but without binmode, print()
+fails instead of write().
+
+At any rate, the very use of format is questionable when it comes to
+unicode characters since you have to consider such things as character
+width (i.e. double-width for ideographs) and directions (i.e. BIDI for
+Arabic and Hebrew).
+
+=back
+
+=head2 The Logic of :locale
+
+The logic of C<:locale> is as follows:
+
+=over 4
+
+=item 1.
+
+If the platform supports the langinfo(CODESET) interface, the codeset
+returned is used as the default encoding for the open pragma.
+
+=item 2.
+
+If 1. didn't work but we are under the locale pragma, the environment
+variables LC_ALL and LANG (in that order) are matched for encodings
+(the part after C<.>, if any), and if any found, that is used 
+as the default encoding for the open pragma.
+
+=item 3.
+
+If 1. and 2. didn't work, the environment variables LC_ALL and LANG
+(in that order) are matched for anything looking like UTF-8, and if
+any found, C<:utf8> is used as the default encoding for the open
+pragma.
+
+=back
+
+If your locale environment variables (LC_ALL, LC_CTYPE, LANG)
+contain the strings 'UTF-8' or 'UTF8' (case-insensitive matching),
+the default encoding of your STDIN, STDOUT, and STDERR, and of
+B<any subsequent file open>, is UTF-8.
+
+=head1 HISTORY
+
+This pragma first appeared in Perl 5.8.0.  For features that require 
+5.8.1 and better, see above.
+
+The C<:locale> subpragma was implemented in 2.01, or Perl 5.8.6.
+
+=head1 SEE ALSO
+
+L<perlunicode>, L<Encode>, L<open>, L<Filter::Util::Call>,
+
+Ch. 15 of C<Programming Perl (3rd Edition)>
+by Larry Wall, Tom Christiansen, Jon Orwant;
+O'Reilly & Associates; ISBN 0-596-00027-8
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/exceptions.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/exceptions.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/exceptions.pl	(revision 14489)
@@ -0,0 +1,61 @@
+# exceptions.pl
+# tchrist@convex.com
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# 
+# Here's a little code I use for exception handling.  It's really just
+# glorfied eval/die.  The way to use use it is when you might otherwise
+# exit, use &throw to raise an exception.  The first enclosing &catch
+# handler looks at the exception and decides whether it can catch this kind
+# (catch takes a list of regexps to catch), and if so, it returns the one it
+# caught.  If it *can't* catch it, then it will reraise the exception
+# for someone else to possibly see, or to die otherwise.
+# 
+# I use oddly named variables in order to make darn sure I don't conflict 
+# with my caller.  I also hide in my own package, and eval the code in his.
+# 
+# The EXCEPTION: prefix is so you can tell whether it's a user-raised
+# exception or a perl-raised one (eval error).
+# 
+# --tom
+#
+# examples:
+#	if (&catch('/$user_input/', 'regexp', 'syntax error') {
+#		warn "oops try again";
+#		redo;
+#	}
+#
+#	if ($error = &catch('&subroutine()')) { # catches anything
+#
+#	&throw('bad input') if /^$/;
+
+sub catch {
+    package exception;
+    local($__code__, @__exceptions__) = @_;
+    local($__package__) = caller;
+    local($__exception__);
+
+    eval "package $__package__; $__code__";
+    if ($__exception__ = &'thrown) {
+	for (@__exceptions__) {
+	    return $__exception__ if /$__exception__/;
+	} 
+	&'throw($__exception__);
+    } 
+} 
+
+sub throw {
+    local($exception) = @_;
+    die "EXCEPTION: $exception\n";
+} 
+
+sub thrown {
+    $@ =~ /^(EXCEPTION: )+(.+)/ && $2;
+} 
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/fastcwd.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/fastcwd.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/fastcwd.pl	(revision 14489)
@@ -0,0 +1,43 @@
+# By John Bazik
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Cwd
+#
+# Usage: $cwd = &fastcwd;
+#
+# This is a faster version of getcwd.  It's also more dangerous because
+# you might chdir out of a directory that you can't chdir back into.
+
+sub fastcwd {
+	local($odev, $oino, $cdev, $cino, $tdev, $tino);
+	local(@path, $path);
+	local(*DIR);
+
+	($cdev, $cino) = stat('.');
+	for (;;) {
+		($odev, $oino) = ($cdev, $cino);
+		chdir('..');
+		($cdev, $cino) = stat('.');
+		last if $odev == $cdev && $oino == $cino;
+		opendir(DIR, '.');
+		for (;;) {
+			$_ = readdir(DIR);
+			next if $_ eq '.';
+			next if $_ eq '..';
+
+			last unless $_;
+			($tdev, $tino) = lstat($_);
+			last unless $tdev != $odev || $tino != $oino;
+		}
+		closedir(DIR);
+		unshift(@path, $_);
+	}
+	chdir($path = '/' . join('/', @path));
+	$path;
+}
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/fields.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/fields.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/fields.pm	(revision 14489)
@@ -0,0 +1,319 @@
+package fields;
+
+require 5.005;
+use strict;
+no strict 'refs';
+unless( eval q{require warnings::register; warnings::register->import} ) {
+    *warnings::warnif = sub { 
+        require Carp;
+        Carp::carp(@_);
+    }
+}
+use vars qw(%attr $VERSION);
+
+$VERSION = '2.03';
+
+# constant.pm is slow
+sub PUBLIC     () { 2**0  }
+sub PRIVATE    () { 2**1  }
+sub INHERITED  () { 2**2  }
+sub PROTECTED  () { 2**3  }
+
+
+# The %attr hash holds the attributes of the currently assigned fields
+# per class.  The hash is indexed by class names and the hash value is
+# an array reference.  The first element in the array is the lowest field
+# number not belonging to a base class.  The remaining elements' indices
+# are the field numbers.  The values are integer bit masks, or undef
+# in the case of base class private fields (which occupy a slot but are
+# otherwise irrelevant to the class).
+
+sub import {
+    my $class = shift;
+    return unless @_;
+    my $package = caller(0);
+    # avoid possible typo warnings
+    %{"$package\::FIELDS"} = () unless %{"$package\::FIELDS"};
+    my $fields = \%{"$package\::FIELDS"};
+    my $fattr = ($attr{$package} ||= [1]);
+    my $next = @$fattr;
+
+    # Quiet pseudo-hash deprecation warning for uses of fields::new.
+    bless \%{"$package\::FIELDS"}, 'pseudohash';
+
+    if ($next > $fattr->[0]
+	and ($fields->{$_[0]} || 0) >= $fattr->[0])
+    {
+	# There are already fields not belonging to base classes.
+	# Looks like a possible module reload...
+	$next = $fattr->[0];
+    }
+    foreach my $f (@_) {
+	my $fno = $fields->{$f};
+
+	# Allow the module to be reloaded so long as field positions
+	# have not changed.
+	if ($fno and $fno != $next) {
+	    require Carp;
+            if ($fno < $fattr->[0]) {
+              if ($] < 5.006001) {
+                warn("Hides field '$f' in base class") if $^W;
+              } else {
+                warnings::warnif("Hides field '$f' in base class") ;
+              }
+            } else {
+                Carp::croak("Field name '$f' already in use");
+            }
+	}
+	$fields->{$f} = $next;
+        $fattr->[$next] = ($f =~ /^_/) ? PRIVATE : PUBLIC;
+	$next += 1;
+    }
+    if (@$fattr > $next) {
+	# Well, we gave them the benefit of the doubt by guessing the
+	# module was reloaded, but they appear to be declaring fields
+	# in more than one place.  We can't be sure (without some extra
+	# bookkeeping) that the rest of the fields will be declared or
+	# have the same positions, so punt.
+	require Carp;
+	Carp::croak ("Reloaded module must declare all fields at once");
+    }
+}
+
+sub inherit {
+    require base;
+    goto &base::inherit_fields;
+}
+
+sub _dump  # sometimes useful for debugging
+{
+    for my $pkg (sort keys %attr) {
+	print "\n$pkg";
+	if (@{"$pkg\::ISA"}) {
+	    print " (", join(", ", @{"$pkg\::ISA"}), ")";
+	}
+	print "\n";
+	my $fields = \%{"$pkg\::FIELDS"};
+	for my $f (sort {$fields->{$a} <=> $fields->{$b}} keys %$fields) {
+	    my $no = $fields->{$f};
+	    print "   $no: $f";
+	    my $fattr = $attr{$pkg}[$no];
+	    if (defined $fattr) {
+		my @a;
+		push(@a, "public")    if $fattr & PUBLIC;
+		push(@a, "private")   if $fattr & PRIVATE;
+		push(@a, "inherited") if $fattr & INHERITED;
+		print "\t(", join(", ", @a), ")";
+	    }
+	    print "\n";
+	}
+    }
+}
+
+if ($] < 5.009) {
+  *new = sub {
+    my $class = shift;
+    $class = ref $class if ref $class;
+    return bless [\%{$class . "::FIELDS"}], $class;
+  }
+} else {
+  *new = sub {
+    my $class = shift;
+    $class = ref $class if ref $class;
+    require Hash::Util;
+    my $self = bless {}, $class;
+
+    # The lock_keys() prototype won't work since we require Hash::Util :(
+    &Hash::Util::lock_keys(\%$self, keys %{$class.'::FIELDS'});
+    return $self;
+  }
+}
+
+sub phash {
+    die "Pseudo-hashes have been removed from Perl" if $] >= 5.009;
+    my $h;
+    my $v;
+    if (@_) {
+       if (ref $_[0] eq 'ARRAY') {
+           my $a = shift;
+           @$h{@$a} = 1 .. @$a;
+           if (@_) {
+               $v = shift;
+               unless (! @_ and ref $v eq 'ARRAY') {
+                   require Carp;
+                   Carp::croak ("Expected at most two array refs\n");
+               }
+           }
+       }
+       else {
+           if (@_ % 2) {
+               require Carp;
+               Carp::croak ("Odd number of elements initializing pseudo-hash\n");
+           }
+           my $i = 0;
+           @$h{grep ++$i % 2, @_} = 1 .. @_ / 2;
+           $i = 0;
+           $v = [grep $i++ % 2, @_];
+       }
+    }
+    else {
+       $h = {};
+       $v = [];
+    }
+    [ $h, @$v ];
+
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+fields - compile-time class fields
+
+=head1 SYNOPSIS
+
+    {
+        package Foo;
+        use fields qw(foo bar _Foo_private);
+	sub new {
+	    my Foo $self = shift;
+	    unless (ref $self) {
+		$self = fields::new($self);
+		$self->{_Foo_private} = "this is Foo's secret";
+	    }
+	    $self->{foo} = 10;
+	    $self->{bar} = 20;
+	    return $self;
+	}
+    }
+
+    my $var = Foo->new;
+    $var->{foo} = 42;
+
+    # this will generate an error
+    $var->{zap} = 42;
+
+    # subclassing
+    {
+        package Bar;
+        use base 'Foo';
+        use fields qw(baz _Bar_private);	# not shared with Foo
+	sub new {
+	    my $class = shift;
+	    my $self = fields::new($class);
+	    $self->SUPER::new();		# init base fields
+	    $self->{baz} = 10;			# init own fields
+	    $self->{_Bar_private} = "this is Bar's secret";
+	    return $self;
+	}
+    }
+
+=head1 DESCRIPTION
+
+The C<fields> pragma enables compile-time verified class fields.
+
+NOTE: The current implementation keeps the declared fields in the %FIELDS
+hash of the calling package, but this may change in future versions.
+Do B<not> update the %FIELDS hash directly, because it must be created
+at compile-time for it to be fully useful, as is done by this pragma.
+
+B<Only valid for perl before 5.9.0:>
+
+If a typed lexical variable holding a reference is used to access a
+hash element and a package with the same name as the type has
+declared class fields using this pragma, then the operation is
+turned into an array access at compile time.
+
+
+The related C<base> pragma will combine fields from base classes and any
+fields declared using the C<fields> pragma.  This enables field
+inheritance to work properly.
+
+Field names that start with an underscore character are made private to
+the class and are not visible to subclasses.  Inherited fields can be
+overridden but will generate a warning if used together with the C<-w>
+switch.
+
+B<Only valid for perls before 5.9.0:>
+
+The effect of all this is that you can have objects with named
+fields which are as compact and as fast arrays to access. This only
+works as long as the objects are accessed through properly typed
+variables. If the objects are not typed, access is only checked at
+run time.
+
+
+The following functions are supported:
+
+=over 4
+
+=item new
+
+B< perl before 5.9.0: > fields::new() creates and blesses a
+pseudo-hash comprised of the fields declared using the C<fields>
+pragma into the specified class.
+
+B< perl 5.9.0 and higher: > fields::new() creates and blesses a
+restricted-hash comprised of the fields declared using the C<fields>
+pragma into the specified class.
+
+This function is usable with or without pseudo-hashes.  It is the
+recommended way to construct a fields-based object.
+
+This makes it possible to write a constructor like this:
+
+    package Critter::Sounds;
+    use fields qw(cat dog bird);
+
+    sub new {
+	my $self = shift;
+	$self = fields::new($self) unless ref $self;
+	$self->{cat} = 'meow';				# scalar element
+	@$self{'dog','bird'} = ('bark','tweet');	# slice
+	return $self;
+    }
+
+=item phash
+
+B< before perl 5.9.0: > 
+
+fields::phash() can be used to create and initialize a plain (unblessed)
+pseudo-hash.  This function should always be used instead of creating
+pseudo-hashes directly.
+
+If the first argument is a reference to an array, the pseudo-hash will
+be created with keys from that array.  If a second argument is supplied,
+it must also be a reference to an array whose elements will be used as
+the values.  If the second array contains less elements than the first,
+the trailing elements of the pseudo-hash will not be initialized.
+This makes it particularly useful for creating a pseudo-hash from
+subroutine arguments:
+
+    sub dogtag {
+       my $tag = fields::phash([qw(name rank ser_num)], [@_]);
+    }
+
+fields::phash() also accepts a list of key-value pairs that will
+be used to construct the pseudo hash.  Examples:
+
+    my $tag = fields::phash(name => "Joe",
+                            rank => "captain",
+                            ser_num => 42);
+
+    my $pseudohash = fields::phash(%args);
+
+B< perl 5.9.0 and higher: >
+
+Pseudo-hashes have been removed from Perl as of 5.10.  Consider using
+restricted hashes or fields::new() instead.  Using fields::phash()
+will cause an error.
+
+=back
+
+=head1 SEE ALSO
+
+L<base>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/filetest.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/filetest.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/filetest.pm	(revision 14489)
@@ -0,0 +1,71 @@
+package filetest;
+
+our $VERSION = '1.01';
+
+=head1 NAME
+
+filetest - Perl pragma to control the filetest permission operators
+
+=head1 SYNOPSIS
+
+    $can_perhaps_read = -r "file";	# use the mode bits
+    {
+        use filetest 'access';		# intuit harder
+        $can_really_read = -r "file";
+    }
+    $can_perhaps_read = -r "file";	# use the mode bits again
+
+=head1 DESCRIPTION
+
+This pragma tells the compiler to change the behaviour of the filetest
+permission operators, C<-r> C<-w> C<-x> C<-R> C<-W> C<-X>
+(see L<perlfunc>).
+
+The default behaviour is to use the mode bits as returned by the stat()
+family of calls.  This, however, may not be the right thing to do if
+for example various ACL (access control lists) schemes are in use.
+For such environments, C<use filetest> may help the permission
+operators to return results more consistent with other tools.
+
+Each "use filetest" or "no filetest" affects statements to the end of
+the enclosing block.
+
+There may be a slight performance decrease in the filetests
+when C<use filetest> is in effect, because in some systems
+the extended functionality needs to be emulated.
+
+B<NOTE>: using the file tests for security purposes is a lost cause
+from the start: there is a window open for race conditions (who is to
+say that the permissions will not change between the test and the real
+operation?).  Therefore if you are serious about security, just try
+the real operation and test for its success - think in terms of atomic
+operations.
+
+=head2 subpragma access
+
+Currently only one subpragma, C<access> is implemented.  It enables
+(or disables) the use of access() or similar system calls.  This
+extended filetest functionality is used only when the argument of the
+operators is a filename, not when it is a filehandle.
+
+=cut
+
+$filetest::hint_bits = 0x00400000; # HINT_FILETEST_ACCESS
+
+sub import {
+    if ( $_[1] eq 'access' ) {
+	$^H |= $filetest::hint_bits;
+    } else {
+	die "filetest: the only implemented subpragma is 'access'.\n";
+    }
+}
+
+sub unimport {
+    if ( $_[1] eq 'access' ) {
+	$^H &= ~$filetest::hint_bits;
+    } else {
+	die "filetest: the only implemented subpragma is 'access'.\n";
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/find.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/find.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/find.pl	(revision 14489)
@@ -0,0 +1,47 @@
+# Usage:
+#	require "find.pl";
+#
+#	&find('/foo','/bar');
+#
+#	sub wanted { ... }
+#		where wanted does whatever you want.  $dir contains the
+#		current directory name, and $_ the current filename within
+#		that directory.  $name contains "$dir/$_".  You are cd'ed
+#		to $dir when the function is called.  The function may
+#		set $prune to prune the tree.
+#
+# This library is primarily for find2perl, which, when fed
+#
+#   find2perl / -name .nfs\* -mtime +7 -exec rm -f {} \; -o -fstype nfs -prune
+#
+# spits out something like this
+#
+#	sub wanted {
+#	    /^\.nfs.*$/ &&
+#	    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
+#	    int(-M _) > 7 &&
+#	    unlink($_)
+#	    ||
+#	    ($nlink || (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_))) &&
+#	    $dev < 0 &&
+#	    ($prune = 1);
+#	}
+#
+# Set the variable $dont_use_nlink if you're using AFS, since AFS cheats.
+
+use File::Find ();
+
+*name		= *File::Find::name;
+*prune		= *File::Find::prune;
+*dir		= *File::Find::dir;
+*topdir		= *File::Find::topdir;
+*topdev		= *File::Find::topdev;
+*topino		= *File::Find::topino;
+*topmode	= *File::Find::topmode;
+*topnlink	= *File::Find::topnlink;
+
+sub find {
+    &File::Find::find(\&wanted, @_);
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/finddepth.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/finddepth.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/finddepth.pl	(revision 14489)
@@ -0,0 +1,46 @@
+# Usage:
+#	require "finddepth.pl";
+#
+#	&finddepth('/foo','/bar');
+#
+#	sub wanted { ... }
+#		where wanted does whatever you want.  $dir contains the
+#		current directory name, and $_ the current filename within
+#		that directory.  $name contains "$dir/$_".  You are cd'ed
+#		to $dir when the function is called.  The function may
+#		set $prune to prune the tree.
+#
+# This library is primarily for find2perl, which, when fed
+#
+#   find2perl / -name .nfs\* -mtime +7 -exec rm -f {} \; -o -fstype nfs -prune
+#
+# spits out something like this
+#
+#	sub wanted {
+#	    /^\.nfs.*$/ &&
+#	    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
+#	    int(-M _) > 7 &&
+#	    unlink($_)
+#	    ||
+#	    ($nlink || (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_))) &&
+#	    $dev < 0 &&
+#	    ($prune = 1);
+#	}
+
+
+use File::Find ();
+
+*name		= *File::Find::name;
+*prune		= *File::Find::prune;
+*dir		= *File::Find::dir;
+*topdir		= *File::Find::topdir;
+*topdev		= *File::Find::topdev;
+*topino		= *File::Find::topino;
+*topmode	= *File::Find::topmode;
+*topnlink	= *File::Find::topnlink;
+
+sub finddepth {
+    &File::Find::finddepth(\&wanted, @_);
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/flush.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/flush.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/flush.pl	(revision 14489)
@@ -0,0 +1,32 @@
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: IO::Handle
+#
+;# Usage: &flush(FILEHANDLE)
+;# flushes the named filehandle
+
+;# Usage: &printflush(FILEHANDLE, "prompt: ")
+;# prints arguments and flushes filehandle
+
+sub flush {
+    local($old) = select(shift);
+    $| = 1;
+    print "";
+    $| = 0;
+    select($old);
+}
+
+sub printflush {
+    local($old) = select(shift);
+    $| = 1;
+    print @_;
+    $| = 0;
+    select($old);
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/getcwd.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/getcwd.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/getcwd.pl	(revision 14489)
@@ -0,0 +1,71 @@
+# By Brandon S. Allbery
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Cwd
+#
+#
+# Usage: $cwd = &getcwd;
+
+sub getcwd
+{
+    local($dotdots, $cwd, @pst, @cst, $dir, @tst);
+
+    unless (@cst = stat('.'))
+    {
+	warn "stat(.): $!";
+	return '';
+    }
+    $cwd = '';
+    do
+    {
+	$dotdots .= '/' if $dotdots;
+	$dotdots .= '..';
+	@pst = @cst;
+	unless (opendir(getcwd'PARENT, $dotdots))			#'))
+	{
+	    warn "opendir($dotdots): $!";
+	    return '';
+	}
+	unless (@cst = stat($dotdots))
+	{
+	    warn "stat($dotdots): $!";
+	    closedir(getcwd'PARENT);					#');
+	    return '';
+	}
+	if ($pst[$[] == $cst[$[] && $pst[$[ + 1] == $cst[$[ + 1])
+	{
+	    $dir = '';
+	}
+	else
+	{
+	    do
+	    {
+		unless (defined ($dir = readdir(getcwd'PARENT)))        #'))
+		{
+		    warn "readdir($dotdots): $!";
+		    closedir(getcwd'PARENT);				#');
+		    return '';
+		}
+		unless (@tst = lstat("$dotdots/$dir"))
+		{
+		    # warn "lstat($dotdots/$dir): $!";
+		    # closedir(getcwd'PARENT);				#');
+		    # return '';
+		}
+	    }
+	    while ($dir eq '.' || $dir eq '..' || $tst[$[] != $pst[$[] ||
+		   $tst[$[ + 1] != $pst[$[ + 1]);
+	}
+	$cwd = "$dir/$cwd";
+	closedir(getcwd'PARENT);					#');
+    } while ($dir ne '');
+    chop($cwd);
+    $cwd;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/getopt.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/getopt.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/getopt.pl	(revision 14489)
@@ -0,0 +1,49 @@
+;# $RCSfile: getopt.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:23:58 $
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternatives: Getopt::Long or Getopt::Std
+#
+;# Process single-character switches with switch clustering.  Pass one argument
+;# which is a string containing all switches that take an argument.  For each
+;# switch found, sets $opt_x (where x is the switch name) to the value of the
+;# argument, or 1 if no argument.  Switches which take an argument don't care
+;# whether there is a space between the switch and the argument.
+
+;# Usage:
+;#	do Getopt('oDI');  # -o, -D & -I take arg.  Sets opt_* as a side effect.
+
+sub Getopt {
+    local($argumentative) = @_;
+    local($_,$first,$rest);
+    local($[) = 0;
+
+    while (@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) {
+	($first,$rest) = ($1,$2);
+	if (index($argumentative,$first) >= $[) {
+	    if ($rest ne '') {
+		shift(@ARGV);
+	    }
+	    else {
+		shift(@ARGV);
+		$rest = shift(@ARGV);
+	    }
+	    ${"opt_$first"} = $rest;
+	}
+	else {
+	    ${"opt_$first"} = 1;
+	    if ($rest ne '') {
+		$ARGV[0] = "-$rest";
+	    }
+	    else {
+		shift(@ARGV);
+	    }
+	}
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/getopts.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/getopts.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/getopts.pl	(revision 14489)
@@ -0,0 +1,66 @@
+;# getopts.pl - a better getopt.pl
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternatives: Getopt::Long  or  Getopt::Std
+#
+;# Usage:
+;#      do Getopts('a:bc');  # -a takes arg. -b & -c not. Sets opt_* as a
+;#                           #  side effect.
+
+sub Getopts {
+    local($argumentative) = @_;
+    local(@args,$_,$first,$rest);
+    local($errs) = 0;
+    local($[) = 0;
+
+    @args = split( / */, $argumentative );
+    while(@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) {
+		($first,$rest) = ($1,$2);
+		$pos = index($argumentative,$first);
+		if($pos >= $[) {
+			if($args[$pos+1] eq ':') {
+				shift(@ARGV);
+				if($rest eq '') {
+					++$errs unless(@ARGV);
+					$rest = shift(@ARGV);
+				}
+				eval "
+				push(\@opt_$first, \$rest);
+				if (!defined \$opt_$first or \$opt_$first eq '') {
+					\$opt_$first = \$rest;
+				}
+				else {
+					\$opt_$first .= ' ' . \$rest;
+				}
+				";
+			}
+			else {
+				eval "\$opt_$first = 1";
+				if($rest eq '') {
+					shift(@ARGV);
+				}
+				else {
+					$ARGV[0] = "-$rest";
+				}
+			}
+		}
+		else {
+			print STDERR "Unknown option: $first\n";
+			++$errs;
+			if($rest ne '') {
+				$ARGV[0] = "-$rest";
+			}
+			else {
+				shift(@ARGV);
+			}
+		}
+	}
+    $errs == 0;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/hostname.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/hostname.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/hostname.pl	(revision 14489)
@@ -0,0 +1,31 @@
+# From: asherman@fmrco.com (Aaron Sherman)
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Sys::Hostname
+#
+sub hostname
+{
+	local(*P,@tmp,$hostname,$_);
+	if (open(P,"hostname 2>&1 |") && (@tmp = <P>) && close(P))
+	{
+		chop($hostname = $tmp[$#tmp]);
+	}
+	elsif (open(P,"uname -n 2>&1 |") && (@tmp = <P>) && close(P))
+	{
+		chop($hostname = $tmp[$#tmp]);
+	}
+	else
+	{
+		die "$0: Cannot get hostname from 'hostname' or 'uname -n'\n";
+	}
+	@tmp = ();
+	close P; # Just in case we failed in an odd spot....
+	$hostname;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/if.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/if.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/if.pm	(revision 14489)
@@ -0,0 +1,56 @@
+package if;
+
+$VERSION = '0.05';
+
+sub work {
+  my $method = shift() ? 'import' : 'unimport';
+  die "Too few arguments to `use if' (some code returning an empty list in list context?)"
+    unless @_ >= 2;
+  return unless shift;		# CONDITION
+
+  my $p = $_[0];		# PACKAGE
+  (my $file = "$p.pm") =~ s!::!/!g;
+  require $file;		# Works even if $_[0] is a keyword (like open)
+  my $m = $p->can($method);
+  goto &$m if $m;
+}
+
+sub import   { shift; unshift @_, 1; goto &work }
+sub unimport { shift; unshift @_, 0; goto &work }
+
+1;
+__END__
+
+=head1 NAME
+
+if - C<use> a Perl module if a condition holds
+
+=head1 SYNOPSIS
+
+  use if CONDITION, MODULE => ARGUMENTS;
+
+=head1 DESCRIPTION
+
+The construct
+
+  use if CONDITION, MODULE => ARGUMENTS;
+
+has no effect unless C<CONDITION> is true.  In this case the effect is
+the same as of
+
+  use MODULE ARGUMENTS;
+
+Above C<< => >> provides necessary quoting of C<MODULE>.  If not used (e.g.,
+no ARGUMENTS to give), you'd better quote C<MODULE> yourselves.
+
+=head1 BUGS
+
+The current implementation does not allow specification of the
+required version of the module.
+
+=head1 AUTHOR
+
+Ilya Zakharevich L<mailto:perl-module-if@ilyaz.org>.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/importenv.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/importenv.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/importenv.pl	(revision 14489)
@@ -0,0 +1,16 @@
+;# $RCSfile: importenv.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:24:02 $
+
+;# This file, when interpreted, pulls the environment into normal variables.
+;# Usage:
+;#	require 'importenv.pl';
+;# or
+;#	#include <importenv.pl>
+
+local($tmp,$key) = '';
+
+foreach $key (keys(%ENV)) {
+    $tmp .= "\$$key = \$ENV{'$key'};" if $key =~ /^[A-Za-z]\w*$/;
+}
+eval $tmp;
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/integer.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/integer.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/integer.pm	(revision 14489)
@@ -0,0 +1,93 @@
+package integer;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+integer - Perl pragma to use integer arithmetic instead of floating point
+
+=head1 SYNOPSIS
+
+    use integer;
+    $x = 10/3;
+    # $x is now 3, not 3.33333333333333333
+
+=head1 DESCRIPTION
+
+This tells the compiler to use integer operations from here to the end
+of the enclosing BLOCK.  On many machines, this doesn't matter a great
+deal for most computations, but on those without floating point
+hardware, it can make a big difference in performance.
+
+Note that this only affects how most of the arithmetic and relational
+B<operators> handle their operands and results, and B<not> how all
+numbers everywhere are treated.  Specifically, C<use integer;> has the
+effect that before computing the results of the arithmetic operators
+(+, -, *, /, %, +=, -=, *=, /=, %=, and unary minus), the comparison
+operators (<, <=, >, >=, ==, !=, <=>), and the bitwise operators (|, &,
+^, <<, >>, |=, &=, ^=, <<=, >>=), the operands have their fractional
+portions truncated (or floored), and the result will have its
+fractional portion truncated as well.  In addition, the range of
+operands and results is restricted to that of familiar two's complement
+integers, i.e., -(2**31) .. (2**31-1) on 32-bit architectures, and
+-(2**63) .. (2**63-1) on 64-bit architectures.  For example, this code
+
+    use integer;
+    $x = 5.8;
+    $y = 2.5;
+    $z = 2.7;
+    $a = 2**31 - 1;  # Largest positive integer on 32-bit machines
+    $, = ", ";
+    print $x, -$x, $x + $y, $x - $y, $x / $y, $x * $y, $y == $z, $a, $a + 1;
+
+will print:  5.8, -5, 7, 3, 2, 10, 1, 2147483647, -2147483648
+
+Note that $x is still printed as having its true non-integer value of
+5.8 since it wasn't operated on.  And note too the wrap-around from the
+largest positive integer to the largest negative one.   Also, arguments
+passed to functions and the values returned by them are B<not> affected
+by C<use integer;>.  E.g.,
+
+    srand(1.5);
+    $, = ", ";
+    print sin(.5), cos(.5), atan2(1,2), sqrt(2), rand(10);
+
+will give the same result with or without C<use integer;>  The power
+operator C<**> is also not affected, so that 2 ** .5 is always the
+square root of 2.  Now, it so happens that the pre- and post- increment
+and decrement operators, ++ and --, are not affected by C<use integer;>
+either.  Some may rightly consider this to be a bug -- but at least it's
+a long-standing one.
+
+Finally, C<use integer;> also has an additional affect on the bitwise
+operators.  Normally, the operands and results are treated as
+B<unsigned> integers, but with C<use integer;> the operands and results
+are B<signed>.  This means, among other things, that ~0 is -1, and -2 &
+-5 is -6.
+
+Internally, native integer arithmetic (as provided by your C compiler)
+is used.  This means that Perl's own semantics for arithmetic
+operations may not be preserved.  One common source of trouble is the
+modulus of negative numbers, which Perl does one way, but your hardware
+may do another.
+
+    % perl -le 'print (4 % -3)'
+    -2
+    % perl -Minteger -le 'print (4 % -3)'
+    1
+
+See L<perlmodlib/"Pragmatic Modules">, L<perlop/"Integer Arithmetic">
+
+=cut
+
+$integer::hint_bits = 0x1;
+
+sub import {
+    $^H |= $integer::hint_bits;
+}
+
+sub unimport {
+    $^H &= ~$integer::hint_bits;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/less.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/less.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/less.pm	(revision 14489)
@@ -0,0 +1,25 @@
+package less;
+
+our $VERSION = '0.01';
+
+=head1 NAME
+
+less - perl pragma to request less of something from the compiler
+
+=head1 SYNOPSIS
+
+    use less;  # unimplemented
+
+=head1 DESCRIPTION
+
+Currently unimplemented, this may someday be a compiler directive
+to make certain trade-offs, such as perhaps
+
+    use less 'memory';
+    use less 'CPU';
+    use less 'fat';
+
+
+=cut
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/lib.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/lib.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/lib.pm	(revision 14489)
@@ -0,0 +1,206 @@
+package lib;
+
+# THIS FILE IS AUTOMATICALLY GENERATED FROM lib_pm.PL.
+# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN BY THE NEXT PERL BUILD.
+
+use Config;
+
+use strict;
+
+my $archname         = $Config{archname};
+my $version          = $Config{version};
+my @inc_version_list = reverse split / /, $Config{inc_version_list};
+
+
+our @ORIG_INC = @INC;	# take a handy copy of 'original' value
+our $VERSION = '0.5565';
+my $Is_MacOS = $^O eq 'MacOS';
+my $Mac_FS;
+if ($Is_MacOS) {
+	require File::Spec;
+	$Mac_FS = eval { require Mac::FileSpec::Unixish };
+}
+
+sub import {
+    shift;
+
+    my %names;
+    foreach (reverse @_) {
+	my $path = $_;		# we'll be modifying it, so break the alias
+	if ($path eq '') {
+	    require Carp;
+	    Carp::carp("Empty compile time value given to use lib");
+	}
+
+	$path = _nativize($path);
+
+	if (-e $path && ! -d _) {
+	    require Carp;
+	    Carp::carp("Parameter to use lib must be directory, not file");
+	}
+	unshift(@INC, $path);
+	# Add any previous version directories we found at configure time
+	foreach my $incver (@inc_version_list)
+	{
+	    my $dir = $Is_MacOS
+		? File::Spec->catdir( $path, $incver )
+		: "$path/$incver";
+	    unshift(@INC, $dir) if -d $dir;
+	}
+	# Put a corresponding archlib directory in front of $path if it
+	# looks like $path has an archlib directory below it.
+	my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir)
+	    = _get_dirs($path);
+	unshift(@INC, $arch_dir)         if -d $arch_auto_dir;
+	unshift(@INC, $version_dir)      if -d $version_dir;
+	unshift(@INC, $version_arch_dir) if -d $version_arch_dir;
+    }
+
+    # remove trailing duplicates
+    @INC = grep { ++$names{$_} == 1 } @INC;
+    return;
+}
+
+
+sub unimport {
+    shift;
+
+    my %names;
+    foreach (@_) {
+	my $path = _nativize($_);
+
+	my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir)
+	    = _get_dirs($path);
+	++$names{$path};
+	++$names{$arch_dir}         if -d $arch_auto_dir;
+	++$names{$version_dir}      if -d $version_dir;
+	++$names{$version_arch_dir} if -d $version_arch_dir;
+    }
+
+    # Remove ALL instances of each named directory.
+    @INC = grep { !exists $names{$_} } @INC;
+    return;
+}
+
+sub _get_dirs {
+    my($dir) = @_;
+    my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir);
+
+    # we could use this for all platforms in the future, but leave it
+    # Mac-only for now, until there is more time for testing it.
+    if ($Is_MacOS) {
+	$arch_auto_dir    = File::Spec->catdir( $dir, $archname, 'auto' );
+	$arch_dir         = File::Spec->catdir( $dir, $archname, );
+	$version_dir      = File::Spec->catdir( $dir, $version );
+	$version_arch_dir = File::Spec->catdir( $dir, $version, $archname );
+    } else {
+	$arch_auto_dir    = "$dir/$archname/auto";
+	$arch_dir         = "$dir/$archname";
+	$version_dir      = "$dir/$version";
+	$version_arch_dir = "$dir/$version/$archname";
+    }
+    return($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir);
+}
+
+sub _nativize {
+    my($dir) = @_;
+
+    if ($Is_MacOS && $Mac_FS && ! -d $dir) {
+	$dir = Mac::FileSpec::Unixish::nativize($dir);
+	$dir .= ":" unless $dir =~ /:$/;
+    }
+
+    return $dir;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+lib - manipulate @INC at compile time
+
+=head1 SYNOPSIS
+
+    use lib LIST;
+
+    no lib LIST;
+
+=head1 DESCRIPTION
+
+This is a small simple module which simplifies the manipulation of @INC
+at compile time.
+
+It is typically used to add extra directories to perl's search path so
+that later C<use> or C<require> statements will find modules which are
+not located on perl's default search path.
+
+=head2 Adding directories to @INC
+
+The parameters to C<use lib> are added to the start of the perl search
+path. Saying
+
+    use lib LIST;
+
+is I<almost> the same as saying
+
+    BEGIN { unshift(@INC, LIST) }
+
+For each directory in LIST (called $dir here) the lib module also
+checks to see if a directory called $dir/$archname/auto exists.
+If so the $dir/$archname directory is assumed to be a corresponding
+architecture specific directory and is added to @INC in front of $dir.
+
+To avoid memory leaks, all trailing duplicate entries in @INC are
+removed.
+
+=head2 Deleting directories from @INC
+
+You should normally only add directories to @INC.  If you need to
+delete directories from @INC take care to only delete those which you
+added yourself or which you are certain are not needed by other modules
+in your script.  Other modules may have added directories which they
+need for correct operation.
+
+The C<no lib> statement deletes all instances of each named directory
+from @INC.
+
+For each directory in LIST (called $dir here) the lib module also
+checks to see if a directory called $dir/$archname/auto exists.
+If so the $dir/$archname directory is assumed to be a corresponding
+architecture specific directory and is also deleted from @INC.
+
+=head2 Restoring original @INC
+
+When the lib module is first loaded it records the current value of @INC
+in an array C<@lib::ORIG_INC>. To restore @INC to that value you
+can say
+
+    @INC = @lib::ORIG_INC;
+
+=head1 CAVEATS
+
+In order to keep lib.pm small and simple, it only works with Unix
+filepaths.  This doesn't mean it only works on Unix, but non-Unix
+users must first translate their file paths to Unix conventions.
+
+    # VMS users wanting to put [.stuff.moo] into 
+    # their @INC would write
+    use lib 'stuff/moo';
+
+=head1 NOTES
+
+In the future, this module will likely use File::Spec for determining
+paths, as it does now for Mac OS (where Unix-style or Mac-style paths
+work, and Unix-style paths are converted properly to Mac-style paths
+before being added to @INC).
+
+=head1 SEE ALSO
+
+FindBin - optional module which deals with paths relative to the source file.
+
+=head1 AUTHOR
+
+Tim Bunce, 2nd June 1995.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/locale.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/locale.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/locale.pm	(revision 14489)
@@ -0,0 +1,40 @@
+package locale;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+locale - Perl pragma to use and avoid POSIX locales for built-in operations
+
+=head1 SYNOPSIS
+
+    @x = sort @y;	# ASCII sorting order
+    {
+        use locale;
+        @x = sort @y;   # Locale-defined sorting order
+    }
+    @x = sort @y;	# ASCII sorting order again
+
+=head1 DESCRIPTION
+
+This pragma tells the compiler to enable (or disable) the use of POSIX
+locales for built-in operations (LC_CTYPE for regular expressions, and
+LC_COLLATE for string comparison).  Each "use locale" or "no locale"
+affects statements to the end of the enclosing BLOCK.
+
+See L<perllocale> for more detailed information on how Perl supports
+locales.
+
+=cut
+
+$locale::hint_bits = 0x4;
+
+sub import {
+    $^H |= $locale::hint_bits;
+}
+
+sub unimport {
+    $^H &= ~$locale::hint_bits;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/look.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/look.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/look.pl	(revision 14489)
@@ -0,0 +1,50 @@
+;# Usage: &look(*FILEHANDLE,$key,$dict,$fold)
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+;# Sets file position in FILEHANDLE to be first line greater than or equal
+;# (stringwise) to $key.  Pass flags for dictionary order and case folding.
+
+sub look {
+    local(*FH,$key,$dict,$fold) = @_;
+    local($max,$min,$mid,$_);
+    local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
+       $blksize,$blocks) = stat(FH);
+    $blksize = 8192 unless $blksize;
+    $key =~ s/[^\w\s]//g if $dict;
+    $key = lc $key if $fold;
+    $max = int($size / $blksize);
+    while ($max - $min > 1) {
+	$mid = int(($max + $min) / 2);
+	seek(FH,$mid * $blksize,0);
+	$_ = <FH> if $mid;		# probably a partial line
+	$_ = <FH>;
+	chop;
+	s/[^\w\s]//g if $dict;
+	$_ = lc $_ if $fold;
+	if ($_ lt $key) {
+	    $min = $mid;
+	}
+	else {
+	    $max = $mid;
+	}
+    }
+    $min *= $blksize;
+    seek(FH,$min,0);
+    <FH> if $min;
+    while (<FH>) {
+	chop;
+	s/[^\w\s]//g if $dict;
+	$_ = lc $_ if $fold;
+	last if $_ ge $key;
+	$min = tell(FH);
+    }
+    seek(FH,$min,0);
+    $min;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/newgetopt.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/newgetopt.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/newgetopt.pl	(revision 14489)
@@ -0,0 +1,75 @@
+# $Id: newgetopt.pl,v 1.18 2001-09-21 15:34:59+02 jv Exp $
+
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+# It is now just a wrapper around the Getopt::Long module.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Getopt::Long
+
+{   package newgetopt;
+
+    # Values for $order. See GNU getopt.c for details.
+    $REQUIRE_ORDER = 0;
+    $PERMUTE = 1;
+    $RETURN_IN_ORDER = 2;
+
+    # Handle POSIX compliancy.
+    if ( defined $ENV{"POSIXLY_CORRECT"} ) {
+	$autoabbrev = 0;	# no automatic abbrev of options (???)
+	$getopt_compat = 0;	# disallow '+' to start options
+	$option_start = "(--|-)";
+	$order = $REQUIRE_ORDER;
+	$bundling = 0;
+	$passthrough = 0;
+    }
+    else {
+	$autoabbrev = 1;	# automatic abbrev of options
+	$getopt_compat = 1;	# allow '+' to start options
+	$option_start = "(--|-|\\+)";
+	$order = $PERMUTE;
+	$bundling = 0;
+	$passthrough = 0;
+    }
+
+    # Other configurable settings.
+    $debug = 0;			# for debugging
+    $ignorecase = 1;		# ignore case when matching options
+    $argv_end = "--";		# don't change this!
+}
+
+use Getopt::Long;
+
+################ Subroutines ################
+
+sub NGetOpt {
+
+    $Getopt::Long::debug = $newgetopt::debug 
+	if defined $newgetopt::debug;
+    $Getopt::Long::autoabbrev = $newgetopt::autoabbrev 
+	if defined $newgetopt::autoabbrev;
+    $Getopt::Long::getopt_compat = $newgetopt::getopt_compat 
+	if defined $newgetopt::getopt_compat;
+    $Getopt::Long::option_start = $newgetopt::option_start 
+	if defined $newgetopt::option_start;
+    $Getopt::Long::order = $newgetopt::order 
+	if defined $newgetopt::order;
+    $Getopt::Long::bundling = $newgetopt::bundling 
+	if defined $newgetopt::bundling;
+    $Getopt::Long::ignorecase = $newgetopt::ignorecase 
+	if defined $newgetopt::ignorecase;
+    $Getopt::Long::ignorecase = $newgetopt::ignorecase 
+	if defined $newgetopt::ignorecase;
+    $Getopt::Long::passthrough = $newgetopt::passthrough 
+	if defined $newgetopt::passthrough;
+
+    &GetOptions;
+}
+
+################ Package return ################
+
+1;
+
+################ End of newgetopt.pl ################
Index: /for-distributions/trunk/bin/windows/perl/lib/open.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/open.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/open.pm	(revision 14489)
@@ -0,0 +1,266 @@
+package open;
+use warnings;
+use Carp;
+$open::hint_bits = 0x20000; # HINT_LOCALIZE_HH
+
+our $VERSION = '1.05';
+
+require 5.008001; # for PerlIO::get_layers()
+
+my $locale_encoding;
+
+sub _get_encname {
+    return ($1, Encode::resolve_alias($1)) if $_[0] =~ /^:?encoding\((.+)\)$/;
+    return;
+}
+
+sub _drop_oldenc {
+    # If by the time we arrive here there already is at the top of the
+    # perlio layer stack an encoding identical to what we would like
+    # to push via this open pragma, we will pop away the old encoding
+    # (+utf8) so that we can push ourselves in place (this is easier
+    # than ignoring pushing ourselves because of the way how ${^OPEN}
+    # works).  So we are looking for something like
+    #
+    #   stdio encoding(xxx) utf8
+    #
+    # in the existing layer stack, and in the new stack chunk for
+    #
+    #   :encoding(xxx)
+    #
+    # If we find a match, we pop the old stack (once, since
+    # the utf8 is just a flag on the encoding layer)
+    my ($h, @new) = @_;
+    return unless @new >= 1 && $new[-1] =~ /^:encoding\(.+\)$/;
+    my @old = PerlIO::get_layers($h);
+    return unless @old >= 3 &&
+	          $old[-1] eq 'utf8' &&
+                  $old[-2] =~ /^encoding\(.+\)$/;
+    require Encode;
+    my ($loname, $lcname) = _get_encname($old[-2]);
+    unless (defined $lcname) { # Should we trust get_layers()?
+	require Carp;
+	Carp::croak("open: Unknown encoding '$loname'");
+    }
+    my ($voname, $vcname) = _get_encname($new[-1]);
+    unless (defined $vcname) {
+	require Carp;
+	Carp::croak("open: Unknown encoding '$voname'");
+    }
+    if ($lcname eq $vcname) {
+	binmode($h, ":pop"); # utf8 is part of the encoding layer
+    }
+}
+
+sub import {
+    my ($class,@args) = @_;
+    croak("open: needs explicit list of PerlIO layers") unless @args;
+    my $std;
+    $^H |= $open::hint_bits;
+    my ($in,$out) = split(/\0/,(${^OPEN} || "\0"), -1);
+    while (@args) {
+	my $type = shift(@args);
+	my $dscp;
+	if ($type =~ /^:?(utf8|locale|encoding\(.+\))$/) {
+	    $type = 'IO';
+	    $dscp = ":$1";
+	} elsif ($type eq ':std') {
+	    $std = 1;
+	    next;
+	} else {
+	    $dscp = shift(@args) || '';
+	}
+	my @val;
+	foreach my $layer (split(/\s+/,$dscp)) {
+            $layer =~ s/^://;
+	    if ($layer eq 'locale') {
+		require Encode;
+		require encoding;
+		$locale_encoding = encoding::_get_locale_encoding()
+		    unless defined $locale_encoding;
+		(warnings::warnif("layer", "Cannot figure out an encoding to use"), last)
+		    unless defined $locale_encoding;
+		if ($locale_encoding =~ /^utf-?8$/i) {
+		    $layer = "utf8";
+		} else {
+		    $layer = "encoding($locale_encoding)";
+		}
+		$std = 1;
+	    } else {
+		my $target = $layer;		# the layer name itself
+		$target =~ s/^(\w+)\(.+\)$/$1/;	# strip parameters
+
+		unless(PerlIO::Layer::->find($target,1)) {
+		    warnings::warnif("layer", "Unknown PerlIO layer '$target'");
+		}
+	    }
+	    push(@val,":$layer");
+	    if ($layer =~ /^(crlf|raw)$/) {
+		$^H{"open_$type"} = $layer;
+	    }
+	}
+	if ($type eq 'IN') {
+	    _drop_oldenc(*STDIN, @val);
+	    $in  = join(' ', @val);
+	}
+	elsif ($type eq 'OUT') {
+	    _drop_oldenc(*STDOUT, @val);
+	    $out = join(' ', @val);
+	}
+	elsif ($type eq 'IO') {
+	    _drop_oldenc(*STDIN,  @val);
+	    _drop_oldenc(*STDOUT, @val);
+	    $in = $out = join(' ', @val);
+	}
+	else {
+	    croak "Unknown PerlIO layer class '$type'";
+	}
+    }
+    ${^OPEN} = join("\0", $in, $out);
+    if ($std) {
+	if ($in) {
+	    if ($in =~ /:utf8\b/) {
+		    binmode(STDIN,  ":utf8");
+		} elsif ($in =~ /(\w+\(.+\))/) {
+		    binmode(STDIN,  ":$1");
+		}
+	}
+	if ($out) {
+	    if ($out =~ /:utf8\b/) {
+		binmode(STDOUT,  ":utf8");
+		binmode(STDERR,  ":utf8");
+	    } elsif ($out =~ /(\w+\(.+\))/) {
+		binmode(STDOUT,  ":$1");
+		binmode(STDERR,  ":$1");
+	    }
+	}
+    }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+open - perl pragma to set default PerlIO layers for input and output
+
+=head1 SYNOPSIS
+
+    use open IN  => ":crlf", OUT => ":bytes";
+    use open OUT => ':utf8';
+    use open IO  => ":encoding(iso-8859-7)";
+
+    use open IO  => ':locale';
+
+    use open ':utf8';
+    use open ':locale';
+    use open ':encoding(iso-8859-7)';
+
+    use open ':std';
+
+=head1 DESCRIPTION
+
+Full-fledged support for I/O layers is now implemented provided
+Perl is configured to use PerlIO as its IO system (which is now the
+default).
+
+The C<open> pragma serves as one of the interfaces to declare default
+"layers" (also known as "disciplines") for all I/O. Any two-argument
+open(), readpipe() (aka qx//) and similar operators found within the
+lexical scope of this pragma will use the declared defaults.
+Even three-argument opens may be affected by this pragma
+when they don't specify IO layers in MODE.
+
+With the C<IN> subpragma you can declare the default layers
+of input streams, and with the C<OUT> subpragma you can declare
+the default layers of output streams.  With the C<IO>  subpragma
+you can control both input and output streams simultaneously.
+
+If you have a legacy encoding, you can use the C<:encoding(...)> tag.
+
+If you want to set your encoding layers based on your
+locale environment variables, you can use the C<:locale> tag.
+For example:
+
+    $ENV{LANG} = 'ru_RU.KOI8-R';
+    # the :locale will probe the locale environment variables like LANG
+    use open OUT => ':locale';
+    open(O, ">koi8");
+    print O chr(0x430); # Unicode CYRILLIC SMALL LETTER A = KOI8-R 0xc1
+    close O;
+    open(I, "<koi8");
+    printf "%#x\n", ord(<I>), "\n"; # this should print 0xc1
+    close I;
+
+These are equivalent
+
+    use open ':utf8';
+    use open IO => ':utf8';
+
+as are these
+
+    use open ':locale';
+    use open IO => ':locale';
+
+and these
+
+    use open ':encoding(iso-8859-7)';
+    use open IO => ':encoding(iso-8859-7)';
+
+The matching of encoding names is loose: case does not matter, and
+many encodings have several aliases.  See L<Encode::Supported> for
+details and the list of supported locales.
+
+Note that C<:utf8> PerlIO layer must always be specified exactly like
+that, it is not subject to the loose matching of encoding names.
+
+When open() is given an explicit list of layers (with the three-arg
+syntax), they override the list declared using this pragma.
+
+The C<:std> subpragma on its own has no effect, but if combined with
+the C<:utf8> or C<:encoding> subpragmas, it converts the standard
+filehandles (STDIN, STDOUT, STDERR) to comply with encoding selected
+for input/output handles.  For example, if both input and out are
+chosen to be C<:utf8>, a C<:std> will mean that STDIN, STDOUT, and
+STDERR are also in C<:utf8>.  On the other hand, if only output is
+chosen to be in C<< :encoding(koi8r) >>, a C<:std> will cause only the
+STDOUT and STDERR to be in C<koi8r>.  The C<:locale> subpragma
+implicitly turns on C<:std>.
+
+The logic of C<:locale> is described in full in L<encoding>,
+but in short it is first trying nl_langinfo(CODESET) and then
+guessing from the LC_ALL and LANG locale environment variables.
+
+Directory handles may also support PerlIO layers in the future.
+
+=head1 NONPERLIO FUNCTIONALITY
+
+If Perl is not built to use PerlIO as its IO system then only the two
+pseudo-layers C<:bytes> and C<:crlf> are available.
+
+The C<:bytes> layer corresponds to "binary mode" and the C<:crlf>
+layer corresponds to "text mode" on platforms that distinguish
+between the two modes when opening files (which is many DOS-like
+platforms, including Windows).  These two layers are no-ops on
+platforms where binmode() is a no-op, but perform their functions
+everywhere if PerlIO is enabled.
+
+=head1 IMPLEMENTATION DETAILS
+
+There is a class method in C<PerlIO::Layer> C<find> which is
+implemented as XS code.  It is called by C<import> to validate the
+layers:
+
+   PerlIO::Layer::->find("perlio")
+
+The return value (if defined) is a Perl object, of class
+C<PerlIO::Layer> which is created by the C code in F<perlio.c>.  As
+yet there is nothing useful you can do with the object at the perl
+level.
+
+=head1 SEE ALSO
+
+L<perlfunc/"binmode">, L<perlfunc/"open">, L<perlunicode>, L<PerlIO>,
+L<encoding>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/open2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/open2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/open2.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# This is a compatibility interface to IPC::Open2.  New programs should
+# do
+#
+#     use IPC::Open2;
+#
+# instead of
+#
+#     require 'open2.pl';
+
+package main;
+use IPC::Open2 'open2';
+1
Index: /for-distributions/trunk/bin/windows/perl/lib/open3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/open3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/open3.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# This is a compatibility interface to IPC::Open3.  New programs should
+# do
+#
+#     use IPC::Open3;
+#
+# instead of
+#
+#     require 'open3.pl';
+
+package main;
+use IPC::Open3 'open3';
+1
Index: /for-distributions/trunk/bin/windows/perl/lib/ops.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/ops.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/ops.pm	(revision 14489)
@@ -0,0 +1,47 @@
+package ops;
+
+our $VERSION = '1.01';
+
+use Opcode qw(opmask_add opset invert_opset);
+
+sub import {
+    shift;
+    # Not that unimport is the preferred form since import's don't
+	# accumulate well owing to the 'only ever add opmask' rule.
+	# E.g., perl -Mops=:set1 -Mops=:setb is unlikely to do as expected.
+    opmask_add(invert_opset opset(@_)) if @_;
+}
+
+sub unimport {
+    shift;
+    opmask_add(opset(@_)) if @_;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ops - Perl pragma to restrict unsafe operations when compiling
+
+=head1 SYNOPSIS  
+
+  perl -Mops=:default ...    # only allow reasonably safe operations
+
+  perl -M-ops=system ...     # disable the 'system' opcode
+
+=head1 DESCRIPTION
+
+Since the ops pragma currently has an irreversible global effect, it is
+only of significant practical use with the C<-M> option on the command line.
+
+See the L<Opcode> module for information about opcodes, optags, opmasks
+and important information about safety.
+
+=head1 SEE ALSO
+
+Opcode(3), Safe(3), perlrun(3)
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/overload.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/overload.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/overload.pm	(revision 14489)
@@ -0,0 +1,1434 @@
+package overload;
+
+our $VERSION = '1.04';
+
+$overload::hint_bits = 0x20000; # HINT_LOCALIZE_HH
+
+sub nil {}
+
+sub OVERLOAD {
+  $package = shift;
+  my %arg = @_;
+  my ($sub, $fb);
+  $ {$package . "::OVERLOAD"}{dummy}++; # Register with magic by touching.
+  *{$package . "::()"} = \&nil; # Make it findable via fetchmethod.
+  for (keys %arg) {
+    if ($_ eq 'fallback') {
+      $fb = $arg{$_};
+    } else {
+      $sub = $arg{$_};
+      if (not ref $sub and $sub !~ /::/) {
+	$ {$package . "::(" . $_} = $sub;
+	$sub = \&nil;
+      }
+      #print STDERR "Setting `$ {'package'}::\cO$_' to \\&`$sub'.\n";
+      *{$package . "::(" . $_} = \&{ $sub };
+    }
+  }
+  ${$package . "::()"} = $fb; # Make it findable too (fallback only).
+}
+
+sub import {
+  $package = (caller())[0];
+  # *{$package . "::OVERLOAD"} = \&OVERLOAD;
+  shift;
+  $package->overload::OVERLOAD(@_);
+}
+
+sub unimport {
+  $package = (caller())[0];
+  ${$package . "::OVERLOAD"}{dummy}++; # Upgrade the table
+  shift;
+  for (@_) {
+    if ($_ eq 'fallback') {
+      undef $ {$package . "::()"};
+    } else {
+      delete $ {$package . "::"}{"(" . $_};
+    }
+  }
+}
+
+sub Overloaded {
+  my $package = shift;
+  $package = ref $package if ref $package;
+  $package->can('()');
+}
+
+sub ov_method {
+  my $globref = shift;
+  return undef unless $globref;
+  my $sub = \&{*$globref};
+  return $sub if $sub ne \&nil;
+  return shift->can($ {*$globref});
+}
+
+sub OverloadedStringify {
+  my $package = shift;
+  $package = ref $package if ref $package;
+  #$package->can('(""')
+  ov_method mycan($package, '(""'), $package
+    or ov_method mycan($package, '(0+'), $package
+    or ov_method mycan($package, '(bool'), $package
+    or ov_method mycan($package, '(nomethod'), $package;
+}
+
+sub Method {
+  my $package = shift;
+  $package = ref $package if ref $package;
+  #my $meth = $package->can('(' . shift);
+  ov_method mycan($package, '(' . shift), $package;
+  #return $meth if $meth ne \&nil;
+  #return $ {*{$meth}};
+}
+
+sub AddrRef {
+  my $package = ref $_[0];
+  return "$_[0]" unless $package;
+
+	require Scalar::Util;
+	my $class = Scalar::Util::blessed($_[0]);
+	my $class_prefix = defined($class) ? "$class=" : "";
+	my $type = Scalar::Util::reftype($_[0]);
+	my $addr = Scalar::Util::refaddr($_[0]);
+	return sprintf("$class_prefix$type(0x%x)", $addr);
+}
+
+*StrVal = *AddrRef;
+
+sub mycan {				# Real can would leave stubs.
+  my ($package, $meth) = @_;
+  return \*{$package . "::$meth"} if defined &{$package . "::$meth"};
+  my $p;
+  foreach $p (@{$package . "::ISA"}) {
+    my $out = mycan($p, $meth);
+    return $out if $out;
+  }
+  return undef;
+}
+
+%constants = (
+	      'integer'	  =>  0x1000, # HINT_NEW_INTEGER
+	      'float'	  =>  0x2000, # HINT_NEW_FLOAT
+	      'binary'	  =>  0x4000, # HINT_NEW_BINARY
+	      'q'	  =>  0x8000, # HINT_NEW_STRING
+	      'qr'	  => 0x10000, # HINT_NEW_RE
+	     );
+
+%ops = ( with_assign	  => "+ - * / % ** << >> x .",
+	 assign		  => "+= -= *= /= %= **= <<= >>= x= .=",
+	 num_comparison	  => "< <= >  >= == !=",
+	 '3way_comparison'=> "<=> cmp",
+	 str_comparison	  => "lt le gt ge eq ne",
+	 binary		  => "& | ^",
+	 unary		  => "neg ! ~",
+	 mutators	  => '++ --',
+	 func		  => "atan2 cos sin exp abs log sqrt int",
+	 conversion	  => 'bool "" 0+',
+	 iterators	  => '<>',
+	 dereferencing	  => '${} @{} %{} &{} *{}',
+	 special	  => 'nomethod fallback =');
+
+use warnings::register;
+sub constant {
+  # Arguments: what, sub
+  while (@_) {
+    if (@_ == 1) {
+        warnings::warnif ("Odd number of arguments for overload::constant");
+        last;
+    }
+    elsif (!exists $constants {$_ [0]}) {
+        warnings::warnif ("`$_[0]' is not an overloadable type");
+    }
+    elsif (!ref $_ [1] || "$_[1]" !~ /CODE\(0x[\da-f]+\)$/) {
+        # Can't use C<ref $_[1] eq "CODE"> above as code references can be
+        # blessed, and C<ref> would return the package the ref is blessed into.
+        if (warnings::enabled) {
+            $_ [1] = "undef" unless defined $_ [1];
+            warnings::warn ("`$_[1]' is not a code reference");
+        }
+    }
+    else {
+        $^H{$_[0]} = $_[1];
+        $^H |= $constants{$_[0]} | $overload::hint_bits;
+    }
+    shift, shift;
+  }
+}
+
+sub remove_constant {
+  # Arguments: what, sub
+  while (@_) {
+    delete $^H{$_[0]};
+    $^H &= ~ $constants{$_[0]};
+    shift, shift;
+  }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+overload - Package for overloading Perl operations
+
+=head1 SYNOPSIS
+
+    package SomeThing;
+
+    use overload
+	'+' => \&myadd,
+	'-' => \&mysub;
+	# etc
+    ...
+
+    package main;
+    $a = new SomeThing 57;
+    $b=5+$a;
+    ...
+    if (overload::Overloaded $b) {...}
+    ...
+    $strval = overload::StrVal $b;
+
+=head1 DESCRIPTION
+
+=head2 Declaration of overloaded functions
+
+The compilation directive
+
+    package Number;
+    use overload
+	"+" => \&add,
+	"*=" => "muas";
+
+declares function Number::add() for addition, and method muas() in
+the "class" C<Number> (or one of its base classes)
+for the assignment form C<*=> of multiplication.
+
+Arguments of this directive come in (key, value) pairs.  Legal values
+are values legal inside a C<&{ ... }> call, so the name of a
+subroutine, a reference to a subroutine, or an anonymous subroutine
+will all work.  Note that values specified as strings are
+interpreted as methods, not subroutines.  Legal keys are listed below.
+
+The subroutine C<add> will be called to execute C<$a+$b> if $a
+is a reference to an object blessed into the package C<Number>, or if $a is
+not an object from a package with defined mathemagic addition, but $b is a
+reference to a C<Number>.  It can also be called in other situations, like
+C<$a+=7>, or C<$a++>.  See L<MAGIC AUTOGENERATION>.  (Mathemagical
+methods refer to methods triggered by an overloaded mathematical
+operator.)
+
+Since overloading respects inheritance via the @ISA hierarchy, the
+above declaration would also trigger overloading of C<+> and C<*=> in
+all the packages which inherit from C<Number>.
+
+=head2 Calling Conventions for Binary Operations
+
+The functions specified in the C<use overload ...> directive are called
+with three (in one particular case with four, see L<Last Resort>)
+arguments.  If the corresponding operation is binary, then the first
+two arguments are the two arguments of the operation.  However, due to
+general object calling conventions, the first argument should always be
+an object in the package, so in the situation of C<7+$a>, the
+order of the arguments is interchanged.  It probably does not matter
+when implementing the addition method, but whether the arguments
+are reversed is vital to the subtraction method.  The method can
+query this information by examining the third argument, which can take
+three different values:
+
+=over 7
+
+=item FALSE
+
+the order of arguments is as in the current operation.
+
+=item TRUE
+
+the arguments are reversed.
+
+=item C<undef>
+
+the current operation is an assignment variant (as in
+C<$a+=7>), but the usual function is called instead.  This additional
+information can be used to generate some optimizations.  Compare
+L<Calling Conventions for Mutators>.
+
+=back
+
+=head2 Calling Conventions for Unary Operations
+
+Unary operation are considered binary operations with the second
+argument being C<undef>.  Thus the functions that overloads C<{"++"}>
+is called with arguments C<($a,undef,'')> when $a++ is executed.
+
+=head2 Calling Conventions for Mutators
+
+Two types of mutators have different calling conventions:
+
+=over
+
+=item C<++> and C<-->
+
+The routines which implement these operators are expected to actually
+I<mutate> their arguments.  So, assuming that $obj is a reference to a
+number,
+
+  sub incr { my $n = $ {$_[0]}; ++$n; $_[0] = bless \$n}
+
+is an appropriate implementation of overloaded C<++>.  Note that
+
+  sub incr { ++$ {$_[0]} ; shift }
+
+is OK if used with preincrement and with postincrement. (In the case
+of postincrement a copying will be performed, see L<Copy Constructor>.)
+
+=item C<x=> and other assignment versions
+
+There is nothing special about these methods.  They may change the
+value of their arguments, and may leave it as is.  The result is going
+to be assigned to the value in the left-hand-side if different from
+this value.
+
+This allows for the same method to be used as overloaded C<+=> and
+C<+>.  Note that this is I<allowed>, but not recommended, since by the
+semantic of L<"Fallback"> Perl will call the method for C<+> anyway,
+if C<+=> is not overloaded.
+
+=back
+
+B<Warning.>  Due to the presence of assignment versions of operations,
+routines which may be called in assignment context may create
+self-referential structures.  Currently Perl will not free self-referential
+structures until cycles are C<explicitly> broken.  You may get problems
+when traversing your structures too.
+
+Say,
+
+  use overload '+' => sub { bless [ \$_[0], \$_[1] ] };
+
+is asking for trouble, since for code C<$obj += $foo> the subroutine
+is called as C<$obj = add($obj, $foo, undef)>, or C<$obj = [\$obj,
+\$foo]>.  If using such a subroutine is an important optimization, one
+can overload C<+=> explicitly by a non-"optimized" version, or switch
+to non-optimized version if C<not defined $_[2]> (see
+L<Calling Conventions for Binary Operations>).
+
+Even if no I<explicit> assignment-variants of operators are present in
+the script, they may be generated by the optimizer.  Say, C<",$obj,"> or
+C<',' . $obj . ','> may be both optimized to
+
+  my $tmp = ',' . $obj;    $tmp .= ',';
+
+=head2 Overloadable Operations
+
+The following symbols can be specified in C<use overload> directive:
+
+=over 5
+
+=item * I<Arithmetic operations>
+
+    "+", "+=", "-", "-=", "*", "*=", "/", "/=", "%", "%=",
+    "**", "**=", "<<", "<<=", ">>", ">>=", "x", "x=", ".", ".=",
+
+For these operations a substituted non-assignment variant can be called if
+the assignment variant is not available.  Methods for operations C<+>,
+C<->, C<+=>, and C<-=> can be called to automatically generate
+increment and decrement methods.  The operation C<-> can be used to
+autogenerate missing methods for unary minus or C<abs>.
+
+See L<"MAGIC AUTOGENERATION">, L<"Calling Conventions for Mutators"> and
+L<"Calling Conventions for Binary Operations">) for details of these
+substitutions.
+
+=item * I<Comparison operations>
+
+    "<",  "<=", ">",  ">=", "==", "!=", "<=>",
+    "lt", "le", "gt", "ge", "eq", "ne", "cmp",
+
+If the corresponding "spaceship" variant is available, it can be
+used to substitute for the missing operation.  During C<sort>ing
+arrays, C<cmp> is used to compare values subject to C<use overload>.
+
+=item * I<Bit operations>
+
+    "&", "^", "|", "neg", "!", "~",
+
+C<neg> stands for unary minus.  If the method for C<neg> is not
+specified, it can be autogenerated using the method for
+subtraction. If the method for C<!> is not specified, it can be
+autogenerated using the methods for C<bool>, or C<"">, or C<0+>.
+
+=item * I<Increment and decrement>
+
+    "++", "--",
+
+If undefined, addition and subtraction methods can be
+used instead.  These operations are called both in prefix and
+postfix form.
+
+=item * I<Transcendental functions>
+
+    "atan2", "cos", "sin", "exp", "abs", "log", "sqrt", "int"
+
+If C<abs> is unavailable, it can be autogenerated using methods
+for "E<lt>" or "E<lt>=E<gt>" combined with either unary minus or subtraction.
+
+Note that traditionally the Perl function L<int> rounds to 0, thus for
+floating-point-like types one should follow the same semantic.  If
+C<int> is unavailable, it can be autogenerated using the overloading of
+C<0+>.
+
+=item * I<Boolean, string and numeric conversion>
+
+    'bool', '""', '0+',
+
+If one or two of these operations are not overloaded, the remaining ones can
+be used instead.  C<bool> is used in the flow control operators
+(like C<while>) and for the ternary C<?:> operation.  These functions can
+return any arbitrary Perl value.  If the corresponding operation for this value
+is overloaded too, that operation will be called again with this value.
+
+As a special case if the overload returns the object itself then it will
+be used directly. An overloaded conversion returning the object is
+probably a bug, because you're likely to get something that looks like
+C<YourPackage=HASH(0x8172b34)>.
+
+=item * I<Iteration>
+
+    "<>"
+
+If not overloaded, the argument will be converted to a filehandle or
+glob (which may require a stringification).  The same overloading
+happens both for the I<read-filehandle> syntax C<E<lt>$varE<gt>> and
+I<globbing> syntax C<E<lt>${var}E<gt>>.
+
+B<BUGS> Even in list context, the iterator is currently called only
+once and with scalar context.
+
+=item * I<Dereferencing>
+
+    '${}', '@{}', '%{}', '&{}', '*{}'.
+
+If not overloaded, the argument will be dereferenced I<as is>, thus
+should be of correct type.  These functions should return a reference
+of correct type, or another object with overloaded dereferencing.
+
+As a special case if the overload returns the object itself then it
+will be used directly (provided it is the correct type).
+
+The dereference operators must be specified explicitly they will not be passed to
+"nomethod".
+
+=item * I<Special>
+
+    "nomethod", "fallback", "=",
+
+see L<SPECIAL SYMBOLS FOR C<use overload>>.
+
+=back
+
+See L<"Fallback"> for an explanation of when a missing method can be
+autogenerated.
+
+A computer-readable form of the above table is available in the hash
+%overload::ops, with values being space-separated lists of names:
+
+ with_assign	  => '+ - * / % ** << >> x .',
+ assign		  => '+= -= *= /= %= **= <<= >>= x= .=',
+ num_comparison	  => '< <= > >= == !=',
+ '3way_comparison'=> '<=> cmp',
+ str_comparison	  => 'lt le gt ge eq ne',
+ binary		  => '& | ^',
+ unary		  => 'neg ! ~',
+ mutators	  => '++ --',
+ func		  => 'atan2 cos sin exp abs log sqrt',
+ conversion	  => 'bool "" 0+',
+ iterators	  => '<>',
+ dereferencing	  => '${} @{} %{} &{} *{}',
+ special	  => 'nomethod fallback ='
+
+=head2 Inheritance and overloading
+
+Inheritance interacts with overloading in two ways.
+
+=over
+
+=item Strings as values of C<use overload> directive
+
+If C<value> in
+
+  use overload key => value;
+
+is a string, it is interpreted as a method name.
+
+=item Overloading of an operation is inherited by derived classes
+
+Any class derived from an overloaded class is also overloaded.  The
+set of overloaded methods is the union of overloaded methods of all
+the ancestors. If some method is overloaded in several ancestor, then
+which description will be used is decided by the usual inheritance
+rules:
+
+If C<A> inherits from C<B> and C<C> (in this order), C<B> overloads
+C<+> with C<\&D::plus_sub>, and C<C> overloads C<+> by C<"plus_meth">,
+then the subroutine C<D::plus_sub> will be called to implement
+operation C<+> for an object in package C<A>.
+
+=back
+
+Note that since the value of the C<fallback> key is not a subroutine,
+its inheritance is not governed by the above rules.  In the current
+implementation, the value of C<fallback> in the first overloaded
+ancestor is used, but this is accidental and subject to change.
+
+=head1 SPECIAL SYMBOLS FOR C<use overload>
+
+Three keys are recognized by Perl that are not covered by the above
+description.
+
+=head2 Last Resort
+
+C<"nomethod"> should be followed by a reference to a function of four
+parameters.  If defined, it is called when the overloading mechanism
+cannot find a method for some operation.  The first three arguments of
+this function coincide with the arguments for the corresponding method if
+it were found, the fourth argument is the symbol
+corresponding to the missing method.  If several methods are tried,
+the last one is used.  Say, C<1-$a> can be equivalent to
+
+	&nomethodMethod($a,1,1,"-")
+
+if the pair C<"nomethod" =E<gt> "nomethodMethod"> was specified in the
+C<use overload> directive.
+
+The C<"nomethod"> mechanism is I<not> used for the dereference operators
+( ${} @{} %{} &{} *{} ).
+
+
+If some operation cannot be resolved, and there is no function
+assigned to C<"nomethod">, then an exception will be raised via die()--
+unless C<"fallback"> was specified as a key in C<use overload> directive.
+
+
+=head2 Fallback
+
+The key C<"fallback"> governs what to do if a method for a particular
+operation is not found.  Three different cases are possible depending on
+the value of C<"fallback">:
+
+=over 16
+
+=item * C<undef>
+
+Perl tries to use a
+substituted method (see L<MAGIC AUTOGENERATION>).  If this fails, it
+then tries to calls C<"nomethod"> value; if missing, an exception
+will be raised.
+
+=item * TRUE
+
+The same as for the C<undef> value, but no exception is raised.  Instead,
+it silently reverts to what it would have done were there no C<use overload>
+present.
+
+=item * defined, but FALSE
+
+No autogeneration is tried.  Perl tries to call
+C<"nomethod"> value, and if this is missing, raises an exception.
+
+=back
+
+B<Note.> C<"fallback"> inheritance via @ISA is not carved in stone
+yet, see L<"Inheritance and overloading">.
+
+=head2 Copy Constructor
+
+The value for C<"="> is a reference to a function with three
+arguments, i.e., it looks like the other values in C<use
+overload>. However, it does not overload the Perl assignment
+operator. This would go against Camel hair.
+
+This operation is called in the situations when a mutator is applied
+to a reference that shares its object with some other reference, such
+as
+
+	$a=$b;
+	++$a;
+
+To make this change $a and not change $b, a copy of C<$$a> is made,
+and $a is assigned a reference to this new object.  This operation is
+done during execution of the C<++$a>, and not during the assignment,
+(so before the increment C<$$a> coincides with C<$$b>).  This is only
+done if C<++> is expressed via a method for C<'++'> or C<'+='> (or
+C<nomethod>).  Note that if this operation is expressed via C<'+'>
+a nonmutator, i.e., as in
+
+	$a=$b;
+	$a=$a+1;
+
+then C<$a> does not reference a new copy of C<$$a>, since $$a does not
+appear as lvalue when the above code is executed.
+
+If the copy constructor is required during the execution of some mutator,
+but a method for C<'='> was not specified, it can be autogenerated as a
+string copy if the object is a plain scalar.
+
+=over 5
+
+=item B<Example>
+
+The actually executed code for
+
+	$a=$b;
+        Something else which does not modify $a or $b....
+	++$a;
+
+may be
+
+	$a=$b;
+        Something else which does not modify $a or $b....
+	$a = $a->clone(undef,"");
+        $a->incr(undef,"");
+
+if $b was mathemagical, and C<'++'> was overloaded with C<\&incr>,
+C<'='> was overloaded with C<\&clone>.
+
+=back
+
+Same behaviour is triggered by C<$b = $a++>, which is consider a synonym for
+C<$b = $a; ++$a>.
+
+=head1 MAGIC AUTOGENERATION
+
+If a method for an operation is not found, and the value for  C<"fallback"> is
+TRUE or undefined, Perl tries to autogenerate a substitute method for
+the missing operation based on the defined operations.  Autogenerated method
+substitutions are possible for the following operations:
+
+=over 16
+
+=item I<Assignment forms of arithmetic operations>
+
+C<$a+=$b> can use the method for C<"+"> if the method for C<"+=">
+is not defined.
+
+=item I<Conversion operations>
+
+String, numeric, and boolean conversion are calculated in terms of one
+another if not all of them are defined.
+
+=item I<Increment and decrement>
+
+The C<++$a> operation can be expressed in terms of C<$a+=1> or C<$a+1>,
+and C<$a--> in terms of C<$a-=1> and C<$a-1>.
+
+=item C<abs($a)>
+
+can be expressed in terms of C<$aE<lt>0> and C<-$a> (or C<0-$a>).
+
+=item I<Unary minus>
+
+can be expressed in terms of subtraction.
+
+=item I<Negation>
+
+C<!> and C<not> can be expressed in terms of boolean conversion, or
+string or numerical conversion.
+
+=item I<Concatenation>
+
+can be expressed in terms of string conversion.
+
+=item I<Comparison operations>
+
+can be expressed in terms of its "spaceship" counterpart: either
+C<E<lt>=E<gt>> or C<cmp>:
+
+    <, >, <=, >=, ==, != 	in terms of <=>
+    lt, gt, le, ge, eq, ne 	in terms of cmp
+
+=item I<Iterator>
+
+    <>				in terms of builtin operations
+
+=item I<Dereferencing>
+
+    ${} @{} %{} &{} *{}		in terms of builtin operations
+
+=item I<Copy operator>
+
+can be expressed in terms of an assignment to the dereferenced value, if this
+value is a scalar and not a reference.
+
+=back
+
+=head1 Losing overloading
+
+The restriction for the comparison operation is that even if, for example,
+`C<cmp>' should return a blessed reference, the autogenerated `C<lt>'
+function will produce only a standard logical value based on the
+numerical value of the result of `C<cmp>'.  In particular, a working
+numeric conversion is needed in this case (possibly expressed in terms of
+other conversions).
+
+Similarly, C<.=>  and C<x=> operators lose their mathemagical properties
+if the string conversion substitution is applied.
+
+When you chop() a mathemagical object it is promoted to a string and its
+mathemagical properties are lost.  The same can happen with other
+operations as well.
+
+=head1 Run-time Overloading
+
+Since all C<use> directives are executed at compile-time, the only way to
+change overloading during run-time is to
+
+    eval 'use overload "+" => \&addmethod';
+
+You can also use
+
+    eval 'no overload "+", "--", "<="';
+
+though the use of these constructs during run-time is questionable.
+
+=head1 Public functions
+
+Package C<overload.pm> provides the following public functions:
+
+=over 5
+
+=item overload::StrVal(arg)
+
+Gives string value of C<arg> as in absence of stringify overloading. If you
+are using this to get the address of a reference (useful for checking if two
+references point to the same thing) then you may be better off using
+C<Scalar::Util::refaddr()>, which is faster.
+
+=item overload::Overloaded(arg)
+
+Returns true if C<arg> is subject to overloading of some operations.
+
+=item overload::Method(obj,op)
+
+Returns C<undef> or a reference to the method that implements C<op>.
+
+=back
+
+=head1 Overloading constants
+
+For some applications, the Perl parser mangles constants too much.
+It is possible to hook into this process via C<overload::constant()>
+and C<overload::remove_constant()> functions.
+
+These functions take a hash as an argument.  The recognized keys of this hash
+are:
+
+=over 8
+
+=item integer
+
+to overload integer constants,
+
+=item float
+
+to overload floating point constants,
+
+=item binary
+
+to overload octal and hexadecimal constants,
+
+=item q
+
+to overload C<q>-quoted strings, constant pieces of C<qq>- and C<qx>-quoted
+strings and here-documents,
+
+=item qr
+
+to overload constant pieces of regular expressions.
+
+=back
+
+The corresponding values are references to functions which take three arguments:
+the first one is the I<initial> string form of the constant, the second one
+is how Perl interprets this constant, the third one is how the constant is used.
+Note that the initial string form does not
+contain string delimiters, and has backslashes in backslash-delimiter
+combinations stripped (thus the value of delimiter is not relevant for
+processing of this string).  The return value of this function is how this
+constant is going to be interpreted by Perl.  The third argument is undefined
+unless for overloaded C<q>- and C<qr>- constants, it is C<q> in single-quote
+context (comes from strings, regular expressions, and single-quote HERE
+documents), it is C<tr> for arguments of C<tr>/C<y> operators,
+it is C<s> for right-hand side of C<s>-operator, and it is C<qq> otherwise.
+
+Since an expression C<"ab$cd,,"> is just a shortcut for C<'ab' . $cd . ',,'>,
+it is expected that overloaded constant strings are equipped with reasonable
+overloaded catenation operator, otherwise absurd results will result.
+Similarly, negative numbers are considered as negations of positive constants.
+
+Note that it is probably meaningless to call the functions overload::constant()
+and overload::remove_constant() from anywhere but import() and unimport() methods.
+From these methods they may be called as
+
+	sub import {
+	  shift;
+	  return unless @_;
+	  die "unknown import: @_" unless @_ == 1 and $_[0] eq ':constant';
+	  overload::constant integer => sub {Math::BigInt->new(shift)};
+	}
+
+B<BUGS> Currently overloaded-ness of constants does not propagate
+into C<eval '...'>.
+
+=head1 IMPLEMENTATION
+
+What follows is subject to change RSN.
+
+The table of methods for all operations is cached in magic for the
+symbol table hash for the package.  The cache is invalidated during
+processing of C<use overload>, C<no overload>, new function
+definitions, and changes in @ISA. However, this invalidation remains
+unprocessed until the next C<bless>ing into the package. Hence if you
+want to change overloading structure dynamically, you'll need an
+additional (fake) C<bless>ing to update the table.
+
+(Every SVish thing has a magic queue, and magic is an entry in that
+queue.  This is how a single variable may participate in multiple
+forms of magic simultaneously.  For instance, environment variables
+regularly have two forms at once: their %ENV magic and their taint
+magic. However, the magic which implements overloading is applied to
+the stashes, which are rarely used directly, thus should not slow down
+Perl.)
+
+If an object belongs to a package using overload, it carries a special
+flag.  Thus the only speed penalty during arithmetic operations without
+overloading is the checking of this flag.
+
+In fact, if C<use overload> is not present, there is almost no overhead
+for overloadable operations, so most programs should not suffer
+measurable performance penalties.  A considerable effort was made to
+minimize the overhead when overload is used in some package, but the
+arguments in question do not belong to packages using overload.  When
+in doubt, test your speed with C<use overload> and without it.  So far
+there have been no reports of substantial speed degradation if Perl is
+compiled with optimization turned on.
+
+There is no size penalty for data if overload is not used. The only
+size penalty if overload is used in some package is that I<all> the
+packages acquire a magic during the next C<bless>ing into the
+package. This magic is three-words-long for packages without
+overloading, and carries the cache table if the package is overloaded.
+
+Copying (C<$a=$b>) is shallow; however, a one-level-deep copying is
+carried out before any operation that can imply an assignment to the
+object $a (or $b) refers to, like C<$a++>.  You can override this
+behavior by defining your own copy constructor (see L<"Copy Constructor">).
+
+It is expected that arguments to methods that are not explicitly supposed
+to be changed are constant (but this is not enforced).
+
+=head1 Metaphor clash
+
+One may wonder why the semantic of overloaded C<=> is so counter intuitive.
+If it I<looks> counter intuitive to you, you are subject to a metaphor
+clash.
+
+Here is a Perl object metaphor:
+
+I<  object is a reference to blessed data>
+
+and an arithmetic metaphor:
+
+I<  object is a thing by itself>.
+
+The I<main> problem of overloading C<=> is the fact that these metaphors
+imply different actions on the assignment C<$a = $b> if $a and $b are
+objects.  Perl-think implies that $a becomes a reference to whatever
+$b was referencing.  Arithmetic-think implies that the value of "object"
+$a is changed to become the value of the object $b, preserving the fact
+that $a and $b are separate entities.
+
+The difference is not relevant in the absence of mutators.  After
+a Perl-way assignment an operation which mutates the data referenced by $a
+would change the data referenced by $b too.  Effectively, after
+C<$a = $b> values of $a and $b become I<indistinguishable>.
+
+On the other hand, anyone who has used algebraic notation knows the
+expressive power of the arithmetic metaphor.  Overloading works hard
+to enable this metaphor while preserving the Perlian way as far as
+possible.  Since it is not possible to freely mix two contradicting
+metaphors, overloading allows the arithmetic way to write things I<as
+far as all the mutators are called via overloaded access only>.  The
+way it is done is described in L<Copy Constructor>.
+
+If some mutator methods are directly applied to the overloaded values,
+one may need to I<explicitly unlink> other values which references the
+same value:
+
+    $a = new Data 23;
+    ...
+    $b = $a;		# $b is "linked" to $a
+    ...
+    $a = $a->clone;	# Unlink $b from $a
+    $a->increment_by(4);
+
+Note that overloaded access makes this transparent:
+
+    $a = new Data 23;
+    $b = $a;		# $b is "linked" to $a
+    $a += 4;		# would unlink $b automagically
+
+However, it would not make
+
+    $a = new Data 23;
+    $a = 4;		# Now $a is a plain 4, not 'Data'
+
+preserve "objectness" of $a.  But Perl I<has> a way to make assignments
+to an object do whatever you want.  It is just not the overload, but
+tie()ing interface (see L<perlfunc/tie>).  Adding a FETCH() method
+which returns the object itself, and STORE() method which changes the
+value of the object, one can reproduce the arithmetic metaphor in its
+completeness, at least for variables which were tie()d from the start.
+
+(Note that a workaround for a bug may be needed, see L<"BUGS">.)
+
+=head1 Cookbook
+
+Please add examples to what follows!
+
+=head2 Two-face scalars
+
+Put this in F<two_face.pm> in your Perl library directory:
+
+  package two_face;		# Scalars with separate string and
+                                # numeric values.
+  sub new { my $p = shift; bless [@_], $p }
+  use overload '""' => \&str, '0+' => \&num, fallback => 1;
+  sub num {shift->[1]}
+  sub str {shift->[0]}
+
+Use it as follows:
+
+  require two_face;
+  my $seven = new two_face ("vii", 7);
+  printf "seven=$seven, seven=%d, eight=%d\n", $seven, $seven+1;
+  print "seven contains `i'\n" if $seven =~ /i/;
+
+(The second line creates a scalar which has both a string value, and a
+numeric value.)  This prints:
+
+  seven=vii, seven=7, eight=8
+  seven contains `i'
+
+=head2 Two-face references
+
+Suppose you want to create an object which is accessible as both an
+array reference and a hash reference, similar to the
+L<pseudo-hash|perlref/"Pseudo-hashes: Using an array as a hash">
+builtin Perl type.  Let's make it better than a pseudo-hash by
+allowing index 0 to be treated as a normal element.
+
+  package two_refs;
+  use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} };
+  sub new {
+    my $p = shift;
+    bless \ [@_], $p;
+  }
+  sub gethash {
+    my %h;
+    my $self = shift;
+    tie %h, ref $self, $self;
+    \%h;
+  }
+
+  sub TIEHASH { my $p = shift; bless \ shift, $p }
+  my %fields;
+  my $i = 0;
+  $fields{$_} = $i++ foreach qw{zero one two three};
+  sub STORE {
+    my $self = ${shift()};
+    my $key = $fields{shift()};
+    defined $key or die "Out of band access";
+    $$self->[$key] = shift;
+  }
+  sub FETCH {
+    my $self = ${shift()};
+    my $key = $fields{shift()};
+    defined $key or die "Out of band access";
+    $$self->[$key];
+  }
+
+Now one can access an object using both the array and hash syntax:
+
+  my $bar = new two_refs 3,4,5,6;
+  $bar->[2] = 11;
+  $bar->{two} == 11 or die 'bad hash fetch';
+
+Note several important features of this example.  First of all, the
+I<actual> type of $bar is a scalar reference, and we do not overload
+the scalar dereference.  Thus we can get the I<actual> non-overloaded
+contents of $bar by just using C<$$bar> (what we do in functions which
+overload dereference).  Similarly, the object returned by the
+TIEHASH() method is a scalar reference.
+
+Second, we create a new tied hash each time the hash syntax is used.
+This allows us not to worry about a possibility of a reference loop,
+which would lead to a memory leak.
+
+Both these problems can be cured.  Say, if we want to overload hash
+dereference on a reference to an object which is I<implemented> as a
+hash itself, the only problem one has to circumvent is how to access
+this I<actual> hash (as opposed to the I<virtual> hash exhibited by the
+overloaded dereference operator).  Here is one possible fetching routine:
+
+  sub access_hash {
+    my ($self, $key) = (shift, shift);
+    my $class = ref $self;
+    bless $self, 'overload::dummy'; # Disable overloading of %{}
+    my $out = $self->{$key};
+    bless $self, $class;	# Restore overloading
+    $out;
+  }
+
+To remove creation of the tied hash on each access, one may an extra
+level of indirection which allows a non-circular structure of references:
+
+  package two_refs1;
+  use overload '%{}' => sub { ${shift()}->[1] },
+               '@{}' => sub { ${shift()}->[0] };
+  sub new {
+    my $p = shift;
+    my $a = [@_];
+    my %h;
+    tie %h, $p, $a;
+    bless \ [$a, \%h], $p;
+  }
+  sub gethash {
+    my %h;
+    my $self = shift;
+    tie %h, ref $self, $self;
+    \%h;
+  }
+
+  sub TIEHASH { my $p = shift; bless \ shift, $p }
+  my %fields;
+  my $i = 0;
+  $fields{$_} = $i++ foreach qw{zero one two three};
+  sub STORE {
+    my $a = ${shift()};
+    my $key = $fields{shift()};
+    defined $key or die "Out of band access";
+    $a->[$key] = shift;
+  }
+  sub FETCH {
+    my $a = ${shift()};
+    my $key = $fields{shift()};
+    defined $key or die "Out of band access";
+    $a->[$key];
+  }
+
+Now if $baz is overloaded like this, then C<$baz> is a reference to a
+reference to the intermediate array, which keeps a reference to an
+actual array, and the access hash.  The tie()ing object for the access
+hash is a reference to a reference to the actual array, so
+
+=over
+
+=item *
+
+There are no loops of references.
+
+=item *
+
+Both "objects" which are blessed into the class C<two_refs1> are
+references to a reference to an array, thus references to a I<scalar>.
+Thus the accessor expression C<$$foo-E<gt>[$ind]> involves no
+overloaded operations.
+
+=back
+
+=head2 Symbolic calculator
+
+Put this in F<symbolic.pm> in your Perl library directory:
+
+  package symbolic;		# Primitive symbolic calculator
+  use overload nomethod => \&wrap;
+
+  sub new { shift; bless ['n', @_] }
+  sub wrap {
+    my ($obj, $other, $inv, $meth) = @_;
+    ($obj, $other) = ($other, $obj) if $inv;
+    bless [$meth, $obj, $other];
+  }
+
+This module is very unusual as overloaded modules go: it does not
+provide any usual overloaded operators, instead it provides the L<Last
+Resort> operator C<nomethod>.  In this example the corresponding
+subroutine returns an object which encapsulates operations done over
+the objects: C<new symbolic 3> contains C<['n', 3]>, C<2 + new
+symbolic 3> contains C<['+', 2, ['n', 3]]>.
+
+Here is an example of the script which "calculates" the side of
+circumscribed octagon using the above package:
+
+  require symbolic;
+  my $iter = 1;			# 2**($iter+2) = 8
+  my $side = new symbolic 1;
+  my $cnt = $iter;
+
+  while ($cnt--) {
+    $side = (sqrt(1 + $side**2) - 1)/$side;
+  }
+  print "OK\n";
+
+The value of $side is
+
+  ['/', ['-', ['sqrt', ['+', 1, ['**', ['n', 1], 2]],
+	               undef], 1], ['n', 1]]
+
+Note that while we obtained this value using a nice little script,
+there is no simple way to I<use> this value.  In fact this value may
+be inspected in debugger (see L<perldebug>), but ony if
+C<bareStringify> B<O>ption is set, and not via C<p> command.
+
+If one attempts to print this value, then the overloaded operator
+C<""> will be called, which will call C<nomethod> operator.  The
+result of this operator will be stringified again, but this result is
+again of type C<symbolic>, which will lead to an infinite loop.
+
+Add a pretty-printer method to the module F<symbolic.pm>:
+
+  sub pretty {
+    my ($meth, $a, $b) = @{+shift};
+    $a = 'u' unless defined $a;
+    $b = 'u' unless defined $b;
+    $a = $a->pretty if ref $a;
+    $b = $b->pretty if ref $b;
+    "[$meth $a $b]";
+  }
+
+Now one can finish the script by
+
+  print "side = ", $side->pretty, "\n";
+
+The method C<pretty> is doing object-to-string conversion, so it
+is natural to overload the operator C<""> using this method.  However,
+inside such a method it is not necessary to pretty-print the
+I<components> $a and $b of an object.  In the above subroutine
+C<"[$meth $a $b]"> is a catenation of some strings and components $a
+and $b.  If these components use overloading, the catenation operator
+will look for an overloaded operator C<.>; if not present, it will
+look for an overloaded operator C<"">.  Thus it is enough to use
+
+  use overload nomethod => \&wrap, '""' => \&str;
+  sub str {
+    my ($meth, $a, $b) = @{+shift};
+    $a = 'u' unless defined $a;
+    $b = 'u' unless defined $b;
+    "[$meth $a $b]";
+  }
+
+Now one can change the last line of the script to
+
+  print "side = $side\n";
+
+which outputs
+
+  side = [/ [- [sqrt [+ 1 [** [n 1 u] 2]] u] 1] [n 1 u]]
+
+and one can inspect the value in debugger using all the possible
+methods.
+
+Something is still amiss: consider the loop variable $cnt of the
+script.  It was a number, not an object.  We cannot make this value of
+type C<symbolic>, since then the loop will not terminate.
+
+Indeed, to terminate the cycle, the $cnt should become false.
+However, the operator C<bool> for checking falsity is overloaded (this
+time via overloaded C<"">), and returns a long string, thus any object
+of type C<symbolic> is true.  To overcome this, we need a way to
+compare an object to 0.  In fact, it is easier to write a numeric
+conversion routine.
+
+Here is the text of F<symbolic.pm> with such a routine added (and
+slightly modified str()):
+
+  package symbolic;		# Primitive symbolic calculator
+  use overload
+    nomethod => \&wrap, '""' => \&str, '0+' => \&num;
+
+  sub new { shift; bless ['n', @_] }
+  sub wrap {
+    my ($obj, $other, $inv, $meth) = @_;
+    ($obj, $other) = ($other, $obj) if $inv;
+    bless [$meth, $obj, $other];
+  }
+  sub str {
+    my ($meth, $a, $b) = @{+shift};
+    $a = 'u' unless defined $a;
+    if (defined $b) {
+      "[$meth $a $b]";
+    } else {
+      "[$meth $a]";
+    }
+  }
+  my %subr = ( n => sub {$_[0]},
+	       sqrt => sub {sqrt $_[0]},
+	       '-' => sub {shift() - shift()},
+	       '+' => sub {shift() + shift()},
+	       '/' => sub {shift() / shift()},
+	       '*' => sub {shift() * shift()},
+	       '**' => sub {shift() ** shift()},
+	     );
+  sub num {
+    my ($meth, $a, $b) = @{+shift};
+    my $subr = $subr{$meth}
+      or die "Do not know how to ($meth) in symbolic";
+    $a = $a->num if ref $a eq __PACKAGE__;
+    $b = $b->num if ref $b eq __PACKAGE__;
+    $subr->($a,$b);
+  }
+
+All the work of numeric conversion is done in %subr and num().  Of
+course, %subr is not complete, it contains only operators used in the
+example below.  Here is the extra-credit question: why do we need an
+explicit recursion in num()?  (Answer is at the end of this section.)
+
+Use this module like this:
+
+  require symbolic;
+  my $iter = new symbolic 2;	# 16-gon
+  my $side = new symbolic 1;
+  my $cnt = $iter;
+
+  while ($cnt) {
+    $cnt = $cnt - 1;		# Mutator `--' not implemented
+    $side = (sqrt(1 + $side**2) - 1)/$side;
+  }
+  printf "%s=%f\n", $side, $side;
+  printf "pi=%f\n", $side*(2**($iter+2));
+
+It prints (without so many line breaks)
+
+  [/ [- [sqrt [+ 1 [** [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1]
+			  [n 1]] 2]]] 1]
+     [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] [n 1]]]=0.198912
+  pi=3.182598
+
+The above module is very primitive.  It does not implement
+mutator methods (C<++>, C<-=> and so on), does not do deep copying
+(not required without mutators!), and implements only those arithmetic
+operations which are used in the example.
+
+To implement most arithmetic operations is easy; one should just use
+the tables of operations, and change the code which fills %subr to
+
+  my %subr = ( 'n' => sub {$_[0]} );
+  foreach my $op (split " ", $overload::ops{with_assign}) {
+    $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
+  }
+  my @bins = qw(binary 3way_comparison num_comparison str_comparison);
+  foreach my $op (split " ", "@overload::ops{ @bins }") {
+    $subr{$op} = eval "sub {shift() $op shift()}";
+  }
+  foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
+    print "defining `$op'\n";
+    $subr{$op} = eval "sub {$op shift()}";
+  }
+
+Due to L<Calling Conventions for Mutators>, we do not need anything
+special to make C<+=> and friends work, except filling C<+=> entry of
+%subr, and defining a copy constructor (needed since Perl has no
+way to know that the implementation of C<'+='> does not mutate
+the argument, compare L<Copy Constructor>).
+
+To implement a copy constructor, add C<< '=' => \&cpy >> to C<use overload>
+line, and code (this code assumes that mutators change things one level
+deep only, so recursive copying is not needed):
+
+  sub cpy {
+    my $self = shift;
+    bless [@$self], ref $self;
+  }
+
+To make C<++> and C<--> work, we need to implement actual mutators,
+either directly, or in C<nomethod>.  We continue to do things inside
+C<nomethod>, thus add
+
+    if ($meth eq '++' or $meth eq '--') {
+      @$obj = ($meth, (bless [@$obj]), 1); # Avoid circular reference
+      return $obj;
+    }
+
+after the first line of wrap().  This is not a most effective
+implementation, one may consider
+
+  sub inc { $_[0] = bless ['++', shift, 1]; }
+
+instead.
+
+As a final remark, note that one can fill %subr by
+
+  my %subr = ( 'n' => sub {$_[0]} );
+  foreach my $op (split " ", $overload::ops{with_assign}) {
+    $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
+  }
+  my @bins = qw(binary 3way_comparison num_comparison str_comparison);
+  foreach my $op (split " ", "@overload::ops{ @bins }") {
+    $subr{$op} = eval "sub {shift() $op shift()}";
+  }
+  foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
+    $subr{$op} = eval "sub {$op shift()}";
+  }
+  $subr{'++'} = $subr{'+'};
+  $subr{'--'} = $subr{'-'};
+
+This finishes implementation of a primitive symbolic calculator in
+50 lines of Perl code.  Since the numeric values of subexpressions
+are not cached, the calculator is very slow.
+
+Here is the answer for the exercise: In the case of str(), we need no
+explicit recursion since the overloaded C<.>-operator will fall back
+to an existing overloaded operator C<"">.  Overloaded arithmetic
+operators I<do not> fall back to numeric conversion if C<fallback> is
+not explicitly requested.  Thus without an explicit recursion num()
+would convert C<['+', $a, $b]> to C<$a + $b>, which would just rebuild
+the argument of num().
+
+If you wonder why defaults for conversion are different for str() and
+num(), note how easy it was to write the symbolic calculator.  This
+simplicity is due to an appropriate choice of defaults.  One extra
+note: due to the explicit recursion num() is more fragile than sym():
+we need to explicitly check for the type of $a and $b.  If components
+$a and $b happen to be of some related type, this may lead to problems.
+
+=head2 I<Really> symbolic calculator
+
+One may wonder why we call the above calculator symbolic.  The reason
+is that the actual calculation of the value of expression is postponed
+until the value is I<used>.
+
+To see it in action, add a method
+
+  sub STORE {
+    my $obj = shift;
+    $#$obj = 1;
+    @$obj->[0,1] = ('=', shift);
+  }
+
+to the package C<symbolic>.  After this change one can do
+
+  my $a = new symbolic 3;
+  my $b = new symbolic 4;
+  my $c = sqrt($a**2 + $b**2);
+
+and the numeric value of $c becomes 5.  However, after calling
+
+  $a->STORE(12);  $b->STORE(5);
+
+the numeric value of $c becomes 13.  There is no doubt now that the module
+symbolic provides a I<symbolic> calculator indeed.
+
+To hide the rough edges under the hood, provide a tie()d interface to the
+package C<symbolic> (compare with L<Metaphor clash>).  Add methods
+
+  sub TIESCALAR { my $pack = shift; $pack->new(@_) }
+  sub FETCH { shift }
+  sub nop {  }		# Around a bug
+
+(the bug is described in L<"BUGS">).  One can use this new interface as
+
+  tie $a, 'symbolic', 3;
+  tie $b, 'symbolic', 4;
+  $a->nop;  $b->nop;	# Around a bug
+
+  my $c = sqrt($a**2 + $b**2);
+
+Now numeric value of $c is 5.  After C<$a = 12; $b = 5> the numeric value
+of $c becomes 13.  To insulate the user of the module add a method
+
+  sub vars { my $p = shift; tie($_, $p), $_->nop foreach @_; }
+
+Now
+
+  my ($a, $b);
+  symbolic->vars($a, $b);
+  my $c = sqrt($a**2 + $b**2);
+
+  $a = 3; $b = 4;
+  printf "c5  %s=%f\n", $c, $c;
+
+  $a = 12; $b = 5;
+  printf "c13  %s=%f\n", $c, $c;
+
+shows that the numeric value of $c follows changes to the values of $a
+and $b.
+
+=head1 AUTHOR
+
+Ilya Zakharevich E<lt>F<ilya@math.mps.ohio-state.edu>E<gt>.
+
+=head1 DIAGNOSTICS
+
+When Perl is run with the B<-Do> switch or its equivalent, overloading
+induces diagnostic messages.
+
+Using the C<m> command of Perl debugger (see L<perldebug>) one can
+deduce which operations are overloaded (and which ancestor triggers
+this overloading). Say, if C<eq> is overloaded, then the method C<(eq>
+is shown by debugger. The method C<()> corresponds to the C<fallback>
+key (in fact a presence of this method shows that this package has
+overloading enabled, and it is what is used by the C<Overloaded>
+function of module C<overload>).
+
+The module might issue the following warnings:
+
+=over 4
+
+=item Odd number of arguments for overload::constant
+
+(W) The call to overload::constant contained an odd number of arguments.
+The arguments should come in pairs.
+
+=item `%s' is not an overloadable type
+
+(W) You tried to overload a constant type the overload package is unaware of.
+
+=item `%s' is not a code reference
+
+(W) The second (fourth, sixth, ...) argument of overload::constant needs
+to be a code reference. Either an anonymous subroutine, or a reference
+to a subroutine.
+
+=back
+
+=head1 BUGS
+
+Because it is used for overloading, the per-package hash %OVERLOAD now
+has a special meaning in Perl. The symbol table is filled with names
+looking like line-noise.
+
+For the purpose of inheritance every overloaded package behaves as if
+C<fallback> is present (possibly undefined). This may create
+interesting effects if some package is not overloaded, but inherits
+from two overloaded packages.
+
+Relation between overloading and tie()ing is broken.  Overloading is
+triggered or not basing on the I<previous> class of tie()d value.
+
+This happens because the presence of overloading is checked too early,
+before any tie()d access is attempted.  If the FETCH()ed class of the
+tie()d value does not change, a simple workaround is to access the value
+immediately after tie()ing, so that after this call the I<previous> class
+coincides with the current one.
+
+B<Needed:> a way to fix this without a speed penalty.
+
+Barewords are not covered by overloaded string constants.
+
+This document is confusing.  There are grammos and misleading language
+used in places.  It would seem a total rewrite is needed.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/perl5db.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/perl5db.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/perl5db.pl	(revision 14489)
@@ -0,0 +1,9428 @@
+
+=head1 NAME 
+
+perl5db.pl - the perl debugger
+
+=head1 SYNOPSIS
+
+    perl -d  your_Perl_script
+
+=head1 DESCRIPTION
+
+C<perl5db.pl> is the perl debugger. It is loaded automatically by Perl when
+you invoke a script with C<perl -d>. This documentation tries to outline the
+structure and services provided by C<perl5db.pl>, and to describe how you
+can use them.
+
+=head1 GENERAL NOTES
+
+The debugger can look pretty forbidding to many Perl programmers. There are
+a number of reasons for this, many stemming out of the debugger's history.
+
+When the debugger was first written, Perl didn't have a lot of its nicer
+features - no references, no lexical variables, no closures, no object-oriented
+programming. So a lot of the things one would normally have done using such
+features was done using global variables, globs and the C<local()> operator 
+in creative ways.
+
+Some of these have survived into the current debugger; a few of the more
+interesting and still-useful idioms are noted in this section, along with notes
+on the comments themselves.
+
+=head2 Why not use more lexicals?
+
+Experienced Perl programmers will note that the debugger code tends to use
+mostly package globals rather than lexically-scoped variables. This is done
+to allow a significant amount of control of the debugger from outside the
+debugger itself.       
+
+Unfortunately, though the variables are accessible, they're not well
+documented, so it's generally been a decision that hasn't made a lot of
+difference to most users. Where appropriate, comments have been added to
+make variables more accessible and usable, with the understanding that these
+I<are> debugger internals, and are therefore subject to change. Future
+development should probably attempt to replace the globals with a well-defined
+API, but for now, the variables are what we've got.
+
+=head2 Automated variable stacking via C<local()>
+
+As you may recall from reading C<perlfunc>, the C<local()> operator makes a 
+temporary copy of a variable in the current scope. When the scope ends, the
+old copy is restored. This is often used in the debugger to handle the 
+automatic stacking of variables during recursive calls:
+
+     sub foo {
+        local $some_global++;
+
+        # Do some stuff, then ...
+        return;
+     }
+
+What happens is that on entry to the subroutine, C<$some_global> is localized,
+then altered. When the subroutine returns, Perl automatically undoes the 
+localization, restoring the previous value. Voila, automatic stack management.
+
+The debugger uses this trick a I<lot>. Of particular note is C<DB::eval>, 
+which lets the debugger get control inside of C<eval>'ed code. The debugger
+localizes a saved copy of C<$@> inside the subroutine, which allows it to
+keep C<$@> safe until it C<DB::eval> returns, at which point the previous
+value of C<$@> is restored. This makes it simple (well, I<simpler>) to keep 
+track of C<$@> inside C<eval>s which C<eval> other C<eval's>.
+
+In any case, watch for this pattern. It occurs fairly often.
+
+=head2 The C<^> trick
+
+This is used to cleverly reverse the sense of a logical test depending on 
+the value of an auxiliary variable. For instance, the debugger's C<S>
+(search for subroutines by pattern) allows you to negate the pattern 
+like this:
+
+   # Find all non-'foo' subs:
+   S !/foo/      
+
+Boolean algebra states that the truth table for XOR looks like this:
+
+=over 4
+
+=item * 0 ^ 0 = 0 
+
+(! not present and no match) --> false, don't print
+
+=item * 0 ^ 1 = 1 
+
+(! not present and matches) --> true, print
+
+=item * 1 ^ 0 = 1 
+
+(! present and no match) --> true, print
+
+=item * 1 ^ 1 = 0 
+
+(! present and matches) --> false, don't print
+
+=back
+
+As you can see, the first pair applies when C<!> isn't supplied, and
+the second pair applies when it is. The XOR simply allows us to
+compact a more complicated if-then-elseif-else into a more elegant 
+(but perhaps overly clever) single test. After all, it needed this
+explanation...
+
+=head2 FLAGS, FLAGS, FLAGS
+
+There is a certain C programming legacy in the debugger. Some variables,
+such as C<$single>, C<$trace>, and C<$frame>, have I<magical> values composed
+of 1, 2, 4, etc. (powers of 2) OR'ed together. This allows several pieces
+of state to be stored independently in a single scalar. 
+
+A test like
+
+    if ($scalar & 4) ...
+
+is checking to see if the appropriate bit is on. Since each bit can be 
+"addressed" independently in this way, C<$scalar> is acting sort of like
+an array of bits. Obviously, since the contents of C<$scalar> are just a 
+bit-pattern, we can save and restore it easily (it will just look like
+a number).
+
+The problem, is of course, that this tends to leave magic numbers scattered
+all over your program whenever a bit is set, cleared, or checked. So why do 
+it?
+
+=over 4
+
+=item *
+
+First, doing an arithmetical or bitwise operation on a scalar is
+just about the fastest thing you can do in Perl: C<use constant> actually
+creates a subroutine call, and array and hash lookups are much slower. Is
+this over-optimization at the expense of readability? Possibly, but the 
+debugger accesses these  variables a I<lot>. Any rewrite of the code will
+probably have to benchmark alternate implementations and see which is the
+best balance of readability and speed, and then document how it actually 
+works.
+
+=item *
+
+Second, it's very easy to serialize a scalar number. This is done in 
+the restart code; the debugger state variables are saved in C<%ENV> and then
+restored when the debugger is restarted. Having them be just numbers makes
+this trivial. 
+
+=item *
+
+Third, some of these variables are being shared with the Perl core 
+smack in the middle of the interpreter's execution loop. It's much faster for 
+a C program (like the interpreter) to check a bit in a scalar than to access 
+several different variables (or a Perl array).
+
+=back
+
+=head2 What are those C<XXX> comments for?
+
+Any comment containing C<XXX> means that the comment is either somewhat
+speculative - it's not exactly clear what a given variable or chunk of 
+code is doing, or that it is incomplete - the basics may be clear, but the
+subtleties are not completely documented.
+
+Send in a patch if you can clear up, fill out, or clarify an C<XXX>.
+
+=head1 DATA STRUCTURES MAINTAINED BY CORE         
+
+There are a number of special data structures provided to the debugger by
+the Perl interpreter.
+
+The array C<@{$main::{'_<'.$filename}}> (aliased locally to C<@dbline> via glob
+assignment) contains the text from C<$filename>, with each element
+corresponding to a single line of C<$filename>.
+
+The hash C<%{'_<'.$filename}> (aliased locally to C<%dbline> via glob 
+assignment) contains breakpoints and actions.  The keys are line numbers; 
+you can set individual values, but not the whole hash. The Perl interpreter 
+uses this hash to determine where breakpoints have been set. Any true value is
+considered to be a breakpoint; C<perl5db.pl> uses C<$break_condition\0$action>.
+Values are magical in numeric context: 1 if the line is breakable, 0 if not.
+
+The scalar C<${"_<$filename"}> simply contains the string C<_<$filename>.
+This is also the case for evaluated strings that contain subroutines, or
+which are currently being executed.  The $filename for C<eval>ed strings looks
+like C<(eval 34)> or C<(re_eval 19)>.
+
+=head1 DEBUGGER STARTUP
+
+When C<perl5db.pl> starts, it reads an rcfile (C<perl5db.ini> for
+non-interactive sessions, C<.perldb> for interactive ones) that can set a number
+of options. In addition, this file may define a subroutine C<&afterinit>
+that will be executed (in the debugger's context) after the debugger has 
+initialized itself.
+
+Next, it checks the C<PERLDB_OPTS> environment variable and treats its 
+contents as the argument of a C<o> command in the debugger.
+
+=head2 STARTUP-ONLY OPTIONS
+
+The following options can only be specified at startup.
+To set them in your rcfile, add a call to
+C<&parse_options("optionName=new_value")>.
+
+=over 4
+
+=item * TTY 
+
+the TTY to use for debugging i/o.
+
+=item * noTTY 
+
+if set, goes in NonStop mode.  On interrupt, if TTY is not set,
+uses the value of noTTY or F<$HOME/.perldbtty$$> to find TTY using
+Term::Rendezvous.  Current variant is to have the name of TTY in this
+file.
+
+=item * ReadLine 
+
+If false, a dummy  ReadLine is used, so you can debug
+ReadLine applications.
+
+=item * NonStop 
+
+if true, no i/o is performed until interrupt.
+
+=item * LineInfo 
+
+file or pipe to print line number info to.  If it is a
+pipe, a short "emacs like" message is used.
+
+=item * RemotePort 
+
+host:port to connect to on remote host for remote debugging.
+
+=back
+
+=head3 SAMPLE RCFILE
+
+ &parse_options("NonStop=1 LineInfo=db.out");
+  sub afterinit { $trace = 1; }
+
+The script will run without human intervention, putting trace
+information into C<db.out>.  (If you interrupt it, you had better
+reset C<LineInfo> to something I<interactive>!)
+
+=head1 INTERNALS DESCRIPTION
+
+=head2 DEBUGGER INTERFACE VARIABLES
+
+Perl supplies the values for C<%sub>.  It effectively inserts
+a C<&DB::DB();> in front of each place that can have a
+breakpoint. At each subroutine call, it calls C<&DB::sub> with
+C<$DB::sub> set to the called subroutine. It also inserts a C<BEGIN
+{require 'perl5db.pl'}> before the first line.
+
+After each C<require>d file is compiled, but before it is executed, a
+call to C<&DB::postponed($main::{'_<'.$filename})> is done. C<$filename>
+is the expanded name of the C<require>d file (as found via C<%INC>).
+
+=head3 IMPORTANT INTERNAL VARIABLES
+
+=head4 C<$CreateTTY>
+
+Used to control when the debugger will attempt to acquire another TTY to be
+used for input. 
+
+=over   
+
+=item * 1 -  on C<fork()>
+
+=item * 2 - debugger is started inside debugger
+
+=item * 4 -  on startup
+
+=back
+
+=head4 C<$doret>
+
+The value -2 indicates that no return value should be printed.
+Any other positive value causes C<DB::sub> to print return values.
+
+=head4 C<$evalarg>
+
+The item to be eval'ed by C<DB::eval>. Used to prevent messing with the current
+contents of C<@_> when C<DB::eval> is called.
+
+=head4 C<$frame>
+
+Determines what messages (if any) will get printed when a subroutine (or eval)
+is entered or exited. 
+
+=over 4
+
+=item * 0 -  No enter/exit messages
+
+=item * 1 - Print I<entering> messages on subroutine entry
+
+=item * 2 - Adds exit messages on subroutine exit. If no other flag is on, acts like 1+2.
+
+=item * 4 - Extended messages: C<< <in|out> I<context>=I<fully-qualified sub name> from I<file>:I<line> >>. If no other flag is on, acts like 1+4.
+
+=item * 8 - Adds parameter information to messages, and overloaded stringify and tied FETCH is enabled on the printed arguments. Ignored if C<4> is not on.
+
+=item * 16 - Adds C<I<context> return from I<subname>: I<value>> messages on subroutine/eval exit. Ignored if C<4> is is not on.
+
+=back
+
+To get everything, use C<$frame=30> (or C<o f=30> as a debugger command).
+The debugger internally juggles the value of C<$frame> during execution to
+protect external modules that the debugger uses from getting traced.
+
+=head4 C<$level>
+
+Tracks current debugger nesting level. Used to figure out how many 
+C<E<lt>E<gt>> pairs to surround the line number with when the debugger 
+outputs a prompt. Also used to help determine if the program has finished
+during command parsing.
+
+=head4 C<$onetimeDump>
+
+Controls what (if anything) C<DB::eval()> will print after evaluating an
+expression.
+
+=over 4
+
+=item * C<undef> - don't print anything
+
+=item * C<dump> - use C<dumpvar.pl> to display the value returned
+
+=item * C<methods> - print the methods callable on the first item returned
+
+=back
+
+=head4 C<$onetimeDumpDepth>
+
+Controls how far down C<dumpvar.pl> will go before printing C<...> while
+dumping a structure. Numeric. If C<undef>, print all levels.
+
+=head4 C<$signal>
+
+Used to track whether or not an C<INT> signal has been detected. C<DB::DB()>,
+which is called before every statement, checks this and puts the user into
+command mode if it finds C<$signal> set to a true value.
+
+=head4 C<$single>
+
+Controls behavior during single-stepping. Stacked in C<@stack> on entry to
+each subroutine; popped again at the end of each subroutine.
+
+=over 4 
+
+=item * 0 - run continuously.
+
+=item * 1 - single-step, go into subs. The C<s> command.
+
+=item * 2 - single-step, don't go into subs. The C<n> command.
+
+=item * 4 - print current sub depth (turned on to force this when C<too much
+recursion> occurs.
+
+=back
+
+=head4 C<$trace>
+
+Controls the output of trace information. 
+
+=over 4
+
+=item * 1 - The C<t> command was entered to turn on tracing (every line executed is printed)
+
+=item * 2 - watch expressions are active
+
+=item * 4 - user defined a C<watchfunction()> in C<afterinit()>
+
+=back
+
+=head4 C<$slave_editor>
+
+1 if C<LINEINFO> was directed to a pipe; 0 otherwise.
+
+=head4 C<@cmdfhs>
+
+Stack of filehandles that C<DB::readline()> will read commands from.
+Manipulated by the debugger's C<source> command and C<DB::readline()> itself.
+
+=head4 C<@dbline>
+
+Local alias to the magical line array, C<@{$main::{'_<'.$filename}}> , 
+supplied by the Perl interpreter to the debugger. Contains the source.
+
+=head4 C<@old_watch>
+
+Previous values of watch expressions. First set when the expression is
+entered; reset whenever the watch expression changes.
+
+=head4 C<@saved>
+
+Saves important globals (C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>, C<$\>, C<$^W>)
+so that the debugger can substitute safe values while it's running, and
+restore them when it returns control.
+
+=head4 C<@stack>
+
+Saves the current value of C<$single> on entry to a subroutine.
+Manipulated by the C<c> command to turn off tracing in all subs above the
+current one.
+
+=head4 C<@to_watch>
+
+The 'watch' expressions: to be evaluated before each line is executed.
+
+=head4 C<@typeahead>
+
+The typeahead buffer, used by C<DB::readline>.
+
+=head4 C<%alias>
+
+Command aliases. Stored as character strings to be substituted for a command
+entered.
+
+=head4 C<%break_on_load>
+
+Keys are file names, values are 1 (break when this file is loaded) or undef
+(don't break when it is loaded).
+
+=head4 C<%dbline>
+
+Keys are line numbers, values are C<condition\0action>. If used in numeric
+context, values are 0 if not breakable, 1 if breakable, no matter what is
+in the actual hash entry.
+
+=head4 C<%had_breakpoints>
+
+Keys are file names; values are bitfields:
+
+=over 4 
+
+=item * 1 - file has a breakpoint in it.
+
+=item * 2 - file has an action in it.
+
+=back
+
+A zero or undefined value means this file has neither.
+
+=head4 C<%option>
+
+Stores the debugger options. These are character string values.
+
+=head4 C<%postponed>
+
+Saves breakpoints for code that hasn't been compiled yet.
+Keys are subroutine names, values are:
+
+=over 4
+
+=item * C<compile> - break when this sub is compiled
+
+=item * C<< break +0 if <condition> >> - break (conditionally) at the start of this routine. The condition will be '1' if no condition was specified.
+
+=back
+
+=head4 C<%postponed_file>
+
+This hash keeps track of breakpoints that need to be set for files that have
+not yet been compiled. Keys are filenames; values are references to hashes.
+Each of these hashes is keyed by line number, and its values are breakpoint
+definitions (C<condition\0action>).
+
+=head1 DEBUGGER INITIALIZATION
+
+The debugger's initialization actually jumps all over the place inside this
+package. This is because there are several BEGIN blocks (which of course 
+execute immediately) spread through the code. Why is that? 
+
+The debugger needs to be able to change some things and set some things up 
+before the debugger code is compiled; most notably, the C<$deep> variable that
+C<DB::sub> uses to tell when a program has recursed deeply. In addition, the
+debugger has to turn off warnings while the debugger code is compiled, but then
+restore them to their original setting before the program being debugged begins
+executing.
+
+The first C<BEGIN> block simply turns off warnings by saving the current
+setting of C<$^W> and then setting it to zero. The second one initializes
+the debugger variables that are needed before the debugger begins executing.
+The third one puts C<$^X> back to its former value. 
+
+We'll detail the second C<BEGIN> block later; just remember that if you need
+to initialize something before the debugger starts really executing, that's
+where it has to go.
+
+=cut
+
+package DB;
+
+use IO::Handle;
+
+# Debugger for Perl 5.00x; perl5db.pl patch level:
+$VERSION = 1.28;
+
+$header = "perl5db.pl version $VERSION";
+
+=head1 DEBUGGER ROUTINES
+
+=head2 C<DB::eval()>
+
+This function replaces straight C<eval()> inside the debugger; it simplifies
+the process of evaluating code in the user's context.
+
+The code to be evaluated is passed via the package global variable 
+C<$DB::evalarg>; this is done to avoid fiddling with the contents of C<@_>.
+
+Before we do the C<eval()>, we preserve the current settings of C<$trace>,
+C<$single>, C<$^D> and C<$usercontext>.  The latter contains the
+preserved values of C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>, C<$\>, C<$^W> and the
+user's current package, grabbed when C<DB::DB> got control.  This causes the
+proper context to be used when the eval is actually done.  Afterward, we
+restore C<$trace>, C<$single>, and C<$^D>.
+
+Next we need to handle C<$@> without getting confused. We save C<$@> in a
+local lexical, localize C<$saved[0]> (which is where C<save()> will put 
+C<$@>), and then call C<save()> to capture C<$@>, C<$!>, C<$^E>, C<$,>, 
+C<$/>, C<$\>, and C<$^W>) and set C<$,>, C<$/>, C<$\>, and C<$^W> to values
+considered sane by the debugger. If there was an C<eval()> error, we print 
+it on the debugger's output. If C<$onetimedump> is defined, we call 
+C<dumpit> if it's set to 'dump', or C<methods> if it's set to 
+'methods'. Setting it to something else causes the debugger to do the eval 
+but not print the result - handy if you want to do something else with it 
+(the "watch expressions" code does this to get the value of the watch
+expression but not show it unless it matters).
+
+In any case, we then return the list of output from C<eval> to the caller, 
+and unwinding restores the former version of C<$@> in C<@saved> as well 
+(the localization of C<$saved[0]> goes away at the end of this scope).
+
+=head3 Parameters and variables influencing execution of DB::eval()
+
+C<DB::eval> isn't parameterized in the standard way; this is to keep the
+debugger's calls to C<DB::eval()> from mucking with C<@_>, among other things.
+The variables listed below influence C<DB::eval()>'s execution directly. 
+
+=over 4
+
+=item C<$evalarg> - the thing to actually be eval'ed
+
+=item C<$trace> - Current state of execution tracing
+
+=item C<$single> - Current state of single-stepping
+
+=item C<$onetimeDump> - what is to be displayed after the evaluation 
+
+=item C<$onetimeDumpDepth> - how deep C<dumpit()> should go when dumping results
+
+=back
+
+The following variables are altered by C<DB::eval()> during its execution. They
+are "stacked" via C<local()>, enabling recursive calls to C<DB::eval()>. 
+
+=over 4
+
+=item C<@res> - used to capture output from actual C<eval>.
+
+=item C<$otrace> - saved value of C<$trace>.
+
+=item C<$osingle> - saved value of C<$single>.      
+
+=item C<$od> - saved value of C<$^D>.
+
+=item C<$saved[0]> - saved value of C<$@>.
+
+=item $\ - for output of C<$@> if there is an evaluation error.      
+
+=back
+
+=head3 The problem of lexicals
+
+The context of C<DB::eval()> presents us with some problems. Obviously,
+we want to be 'sandboxed' away from the debugger's internals when we do
+the eval, but we need some way to control how punctuation variables and
+debugger globals are used. 
+
+We can't use local, because the code inside C<DB::eval> can see localized
+variables; and we can't use C<my> either for the same reason. The code
+in this routine compromises and uses C<my>.
+
+After this routine is over, we don't have user code executing in the debugger's
+context, so we can use C<my> freely.
+
+=cut
+
+############################################## Begin lexical danger zone
+
+# 'my' variables used here could leak into (that is, be visible in)
+# the context that the code being evaluated is executing in. This means that
+# the code could modify the debugger's variables.
+#
+# Fiddling with the debugger's context could be Bad. We insulate things as
+# much as we can.
+
+sub eval {
+
+    # 'my' would make it visible from user code
+    #    but so does local! --tchrist
+    # Remember: this localizes @DB::res, not @main::res.
+    local @res;
+    {
+
+        # Try to keep the user code from messing  with us. Save these so that
+        # even if the eval'ed code changes them, we can put them back again.
+        # Needed because the user could refer directly to the debugger's
+        # package globals (and any 'my' variables in this containing scope)
+        # inside the eval(), and we want to try to stay safe.
+        local $otrace  = $trace;
+        local $osingle = $single;
+        local $od      = $^D;
+
+        # Untaint the incoming eval() argument.
+        { ($evalarg) = $evalarg =~ /(.*)/s; }
+
+        # $usercontext built in DB::DB near the comment
+        # "set up the context for DB::eval ..."
+        # Evaluate and save any results.
+        @res = eval "$usercontext $evalarg;\n";  # '\n' for nice recursive debug
+
+        # Restore those old values.
+        $trace  = $otrace;
+        $single = $osingle;
+        $^D     = $od;
+    }
+
+    # Save the current value of $@, and preserve it in the debugger's copy
+    # of the saved precious globals.
+    my $at = $@;
+
+    # Since we're only saving $@, we only have to localize the array element
+    # that it will be stored in.
+    local $saved[0];    # Preserve the old value of $@
+    eval { &DB::save };
+
+    # Now see whether we need to report an error back to the user.
+    if ($at) {
+        local $\ = '';
+        print $OUT $at;
+    }
+
+    # Display as required by the caller. $onetimeDump and $onetimedumpDepth
+    # are package globals.
+    elsif ($onetimeDump) {
+        if ( $onetimeDump eq 'dump' ) {
+            local $option{dumpDepth} = $onetimedumpDepth
+              if defined $onetimedumpDepth;
+            dumpit( $OUT, \@res );
+        }
+        elsif ( $onetimeDump eq 'methods' ) {
+            methods( $res[0] );
+        }
+    } ## end elsif ($onetimeDump)
+    @res;
+} ## end sub eval
+
+############################################## End lexical danger zone
+
+# After this point it is safe to introduce lexicals.
+# The code being debugged will be executing in its own context, and
+# can't see the inside of the debugger.
+#
+# However, one should not overdo it: leave as much control from outside as
+# possible. If you make something a lexical, it's not going to be addressable
+# from outside the debugger even if you know its name.
+
+# This file is automatically included if you do perl -d.
+# It's probably not useful to include this yourself.
+#
+# Before venturing further into these twisty passages, it is
+# wise to read the perldebguts man page or risk the ire of dragons.
+#
+# (It should be noted that perldebguts will tell you a lot about
+# the underlying mechanics of how the debugger interfaces into the
+# Perl interpreter, but not a lot about the debugger itself. The new
+# comments in this code try to address this problem.)
+
+# Note that no subroutine call is possible until &DB::sub is defined
+# (for subroutines defined outside of the package DB). In fact the same is
+# true if $deep is not defined.
+
+# Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich)
+
+# modified Perl debugger, to be run from Emacs in perldb-mode
+# Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990
+# Johan Vromans -- upgrade to 4.0 pl 10
+# Ilya Zakharevich -- patches after 5.001 (and some before ;-)
+
+# (We have made efforts to  clarify the comments in the change log
+# in other places; some of them may seem somewhat obscure as they
+# were originally written, and explaining them away from the code
+# in question seems conterproductive.. -JM)
+
+########################################################################
+# Changes: 0.94
+#   + A lot of things changed after 0.94. First of all, core now informs
+#     debugger about entry into XSUBs, overloaded operators, tied operations,
+#     BEGIN and END. Handy with `O f=2'.
+#   + This can make debugger a little bit too verbose, please be patient
+#     and report your problems promptly.
+#   + Now the option frame has 3 values: 0,1,2. XXX Document!
+#   + Note that if DESTROY returns a reference to the object (or object),
+#     the deletion of data may be postponed until the next function call,
+#     due to the need to examine the return value.
+#
+# Changes: 0.95
+#   + `v' command shows versions.
+#
+# Changes: 0.96
+#   + `v' command shows version of readline.
+#     primitive completion works (dynamic variables, subs for `b' and `l',
+#     options). Can `p %var'
+#   + Better help (`h <' now works). New commands <<, >>, {, {{.
+#     {dump|print}_trace() coded (to be able to do it from <<cmd).
+#   + `c sub' documented.
+#   + At last enough magic combined to stop after the end of debuggee.
+#   + !! should work now (thanks to Emacs bracket matching an extra
+#     `]' in a regexp is caught).
+#   + `L', `D' and `A' span files now (as documented).
+#   + Breakpoints in `require'd code are possible (used in `R').
+#   +  Some additional words on internal work of debugger.
+#   + `b load filename' implemented.
+#   + `b postpone subr' implemented.
+#   + now only `q' exits debugger (overwritable on $inhibit_exit).
+#   + When restarting debugger breakpoints/actions persist.
+#   + Buglet: When restarting debugger only one breakpoint/action per
+#             autoloaded function persists.
+#
+# Changes: 0.97: NonStop will not stop in at_exit().
+#   + Option AutoTrace implemented.
+#   + Trace printed differently if frames are printed too.
+#   + new `inhibitExit' option.
+#   + printing of a very long statement interruptible.
+# Changes: 0.98: New command `m' for printing possible methods
+#   + 'l -' is a synonym for `-'.
+#   + Cosmetic bugs in printing stack trace.
+#   +  `frame' & 8 to print "expanded args" in stack trace.
+#   + Can list/break in imported subs.
+#   + new `maxTraceLen' option.
+#   + frame & 4 and frame & 8 granted.
+#   + new command `m'
+#   + nonstoppable lines do not have `:' near the line number.
+#   + `b compile subname' implemented.
+#   + Will not use $` any more.
+#   + `-' behaves sane now.
+# Changes: 0.99: Completion for `f', `m'.
+#   +  `m' will remove duplicate names instead of duplicate functions.
+#   + `b load' strips trailing whitespace.
+#     completion ignores leading `|'; takes into account current package
+#     when completing a subroutine name (same for `l').
+# Changes: 1.07: Many fixed by tchrist 13-March-2000
+#   BUG FIXES:
+#   + Added bare minimal security checks on perldb rc files, plus
+#     comments on what else is needed.
+#   + Fixed the ornaments that made "|h" completely unusable.
+#     They are not used in print_help if they will hurt.  Strip pod
+#     if we're paging to less.
+#   + Fixed mis-formatting of help messages caused by ornaments
+#     to restore Larry's original formatting.
+#   + Fixed many other formatting errors.  The code is still suboptimal,
+#     and needs a lot of work at restructuring.  It's also misindented
+#     in many places.
+#   + Fixed bug where trying to look at an option like your pager
+#     shows "1".
+#   + Fixed some $? processing.  Note: if you use csh or tcsh, you will
+#     lose.  You should consider shell escapes not using their shell,
+#     or else not caring about detailed status.  This should really be
+#     unified into one place, too.
+#   + Fixed bug where invisible trailing whitespace on commands hoses you,
+#     tricking Perl into thinking you weren't calling a debugger command!
+#   + Fixed bug where leading whitespace on commands hoses you.  (One
+#     suggests a leading semicolon or any other irrelevant non-whitespace
+#     to indicate literal Perl code.)
+#   + Fixed bugs that ate warnings due to wrong selected handle.
+#   + Fixed a precedence bug on signal stuff.
+#   + Fixed some unseemly wording.
+#   + Fixed bug in help command trying to call perl method code.
+#   + Fixed to call dumpvar from exception handler.  SIGPIPE killed us.
+#   ENHANCEMENTS:
+#   + Added some comments.  This code is still nasty spaghetti.
+#   + Added message if you clear your pre/post command stacks which was
+#     very easy to do if you just typed a bare >, <, or {.  (A command
+#     without an argument should *never* be a destructive action; this
+#     API is fundamentally screwed up; likewise option setting, which
+#     is equally buggered.)
+#   + Added command stack dump on argument of "?" for >, <, or {.
+#   + Added a semi-built-in doc viewer command that calls man with the
+#     proper %Config::Config path (and thus gets caching, man -k, etc),
+#     or else perldoc on obstreperous platforms.
+#   + Added to and rearranged the help information.
+#   + Detected apparent misuse of { ... } to declare a block; this used
+#     to work but now is a command, and mysteriously gave no complaint.
+#
+# Changes: 1.08: Apr 25, 2001  Jon Eveland <jweveland@yahoo.com>
+#   BUG FIX:
+#   + This patch to perl5db.pl cleans up formatting issues on the help
+#     summary (h h) screen in the debugger.  Mostly columnar alignment
+#     issues, plus converted the printed text to use all spaces, since
+#     tabs don't seem to help much here.
+#
+# Changes: 1.09: May 19, 2001  Ilya Zakharevich <ilya@math.ohio-state.edu>
+#   Minor bugs corrected;
+#   + Support for auto-creation of new TTY window on startup, either
+#     unconditionally, or if started as a kid of another debugger session;
+#   + New `O'ption CreateTTY
+#       I<CreateTTY>      bits control attempts to create a new TTY on events:
+#                         1: on fork()
+#                         2: debugger is started inside debugger
+#                         4: on startup
+#   + Code to auto-create a new TTY window on OS/2 (currently one
+#     extra window per session - need named pipes to have more...);
+#   + Simplified interface for custom createTTY functions (with a backward
+#     compatibility hack); now returns the TTY name to use; return of ''
+#     means that the function reset the I/O handles itself;
+#   + Better message on the semantic of custom createTTY function;
+#   + Convert the existing code to create a TTY into a custom createTTY
+#     function;
+#   + Consistent support for TTY names of the form "TTYin,TTYout";
+#   + Switch line-tracing output too to the created TTY window;
+#   + make `b fork' DWIM with CORE::GLOBAL::fork;
+#   + High-level debugger API cmd_*():
+#      cmd_b_load($filenamepart)            # b load filenamepart
+#      cmd_b_line($lineno [, $cond])        # b lineno [cond]
+#      cmd_b_sub($sub [, $cond])            # b sub [cond]
+#      cmd_stop()                           # Control-C
+#      cmd_d($lineno)                       # d lineno (B)
+#      The cmd_*() API returns FALSE on failure; in this case it outputs
+#      the error message to the debugging output.
+#   + Low-level debugger API
+#      break_on_load($filename)             # b load filename
+#      @files = report_break_on_load()      # List files with load-breakpoints
+#      breakable_line_in_filename($name, $from [, $to])
+#                                           # First breakable line in the
+#                                           # range $from .. $to.  $to defaults
+#                                           # to $from, and may be less than
+#                                           # $to
+#      breakable_line($from [, $to])        # Same for the current file
+#      break_on_filename_line($name, $lineno [, $cond])
+#                                           # Set breakpoint,$cond defaults to
+#                                           # 1
+#      break_on_filename_line_range($name, $from, $to [, $cond])
+#                                           # As above, on the first
+#                                           # breakable line in range
+#      break_on_line($lineno [, $cond])     # As above, in the current file
+#      break_subroutine($sub [, $cond])     # break on the first breakable line
+#      ($name, $from, $to) = subroutine_filename_lines($sub)
+#                                           # The range of lines of the text
+#      The low-level API returns TRUE on success, and die()s on failure.
+#
+# Changes: 1.10: May 23, 2001  Daniel Lewart <d-lewart@uiuc.edu>
+#   BUG FIXES:
+#   + Fixed warnings generated by "perl -dWe 42"
+#   + Corrected spelling errors
+#   + Squeezed Help (h) output into 80 columns
+#
+# Changes: 1.11: May 24, 2001  David Dyck <dcd@tc.fluke.com>
+#   + Made "x @INC" work like it used to
+#
+# Changes: 1.12: May 24, 2001  Daniel Lewart <d-lewart@uiuc.edu>
+#   + Fixed warnings generated by "O" (Show debugger options)
+#   + Fixed warnings generated by "p 42" (Print expression)
+# Changes: 1.13: Jun 19, 2001 Scott.L.Miller@compaq.com
+#   + Added windowSize option
+# Changes: 1.14: Oct  9, 2001 multiple
+#   + Clean up after itself on VMS (Charles Lane in 12385)
+#   + Adding "@ file" syntax (Peter Scott in 12014)
+#   + Debug reloading selfloaded stuff (Ilya Zakharevich in 11457)
+#   + $^S and other debugger fixes (Ilya Zakharevich in 11120)
+#   + Forgot a my() declaration (Ilya Zakharevich in 11085)
+# Changes: 1.15: Nov  6, 2001 Michael G Schwern <schwern@pobox.com>
+#   + Updated 1.14 change log
+#   + Added *dbline explainatory comments
+#   + Mentioning perldebguts man page
+# Changes: 1.16: Feb 15, 2002 Mark-Jason Dominus <mjd@plover.com>
+#   + $onetimeDump improvements
+# Changes: 1.17: Feb 20, 2002 Richard Foley <richard.foley@rfi.net>
+#   Moved some code to cmd_[.]()'s for clarity and ease of handling,
+#   rationalised the following commands and added cmd_wrapper() to
+#   enable switching between old and frighteningly consistent new
+#   behaviours for diehards: 'o CommandSet=pre580' (sigh...)
+#     a(add),       A(del)            # action expr   (added del by line)
+#   + b(add),       B(del)            # break  [line] (was b,D)
+#   + w(add),       W(del)            # watch  expr   (was W,W)
+#                                     # added del by expr
+#   + h(summary), h h(long)           # help (hh)     (was h h,h)
+#   + m(methods),   M(modules)        # ...           (was m,v)
+#   + o(option)                       # lc            (was O)
+#   + v(view code), V(view Variables) # ...           (was w,V)
+# Changes: 1.18: Mar 17, 2002 Richard Foley <richard.foley@rfi.net>
+#   + fixed missing cmd_O bug
+# Changes: 1.19: Mar 29, 2002 Spider Boardman
+#   + Added missing local()s -- DB::DB is called recursively.
+# Changes: 1.20: Feb 17, 2003 Richard Foley <richard.foley@rfi.net>
+#   + pre'n'post commands no longer trashed with no args
+#   + watch val joined out of eval()
+# Changes: 1.21: Jun 04, 2003 Joe McMahon <mcmahon@ibiblio.org>
+#   + Added comments and reformatted source. No bug fixes/enhancements.
+#   + Includes cleanup by Robin Barker and Jarkko Hietaniemi.
+# Changes: 1.22  Jun 09, 2003 Alex Vandiver <alexmv@MIT.EDU>
+#   + Flush stdout/stderr before the debugger prompt is printed.
+# Changes: 1.23: Dec 21, 2003 Dominique Quatravaux
+#   + Fix a side-effect of bug #24674 in the perl debugger ("odd taint bug")
+# Changes: 1.24: Mar 03, 2004 Richard Foley <richard.foley@rfi.net>
+#   + Added command to save all debugger commands for sourcing later.
+#   + Added command to display parent inheritance tree of given class.
+#   + Fixed minor newline in history bug.
+# Changes: 1.25: Apr 17, 2004 Richard Foley <richard.foley@rfi.net>
+#   + Fixed option bug (setting invalid options + not recognising valid short forms)
+# Changes: 1.26: Apr 22, 2004 Richard Foley <richard.foley@rfi.net>
+#   + unfork the 5.8.x and 5.9.x debuggers.
+#   + whitespace and assertions call cleanup across versions 
+#   + H * deletes (resets) history
+#   + i now handles Class + blessed objects
+# Changes: 1.27: May 09, 2004 Richard Foley <richard.foley@rfi.net>
+#   + updated pod page references - clunky.
+#   + removed windowid restriction for forking into an xterm.
+#   + more whitespace again.
+#   + wrapped restart and enabled rerun [-n] (go back n steps) command.
+# Changes: 1.28: Oct 12, 2004 Richard Foley <richard.foley@rfi.net>
+#   + Added threads support (inc. e and E commands)
+####################################################################
+
+=head1 DEBUGGER INITIALIZATION
+
+The debugger starts up in phases.
+
+=head2 BASIC SETUP
+
+First, it initializes the environment it wants to run in: turning off
+warnings during its own compilation, defining variables which it will need
+to avoid warnings later, setting itself up to not exit when the program
+terminates, and defaulting to printing return values for the C<r> command.
+
+=cut
+
+# Needed for the statement after exec():
+#
+# This BEGIN block is simply used to switch off warnings during debugger
+# compiliation. Probably it would be better practice to fix the warnings,
+# but this is how it's done at the moment.
+
+BEGIN {
+    $ini_warn = $^W;
+    $^W       = 0;
+}    # Switch compilation warnings off until another BEGIN.
+
+# test if assertions are supported and actived:
+BEGIN {
+    $ini_assertion = eval "sub asserting_test : assertion {1}; 1";
+
+    # $ini_assertion = undef => assertions unsupported,
+    #        "       = 1     => assertions supported
+    # print "\$ini_assertion=$ini_assertion\n";
+}
+
+local ($^W) = 0;    # Switch run-time warnings off during init.
+
+=head2 THREADS SUPPORT
+
+If we are running under a threaded Perl, we require threads and threads::shared
+if the environment variable C<PERL5DB_THREADED> is set, to enable proper
+threaded debugger control.  C<-dt> can also be used to set this.
+
+Each new thread will be announced and the debugger prompt will always inform
+you of each new thread created.  It will also indicate the thread id in which
+we are currently running within the prompt like this:
+
+	[tid] DB<$i>
+
+Where C<[tid]> is an integer thread id and C<$i> is the familiar debugger
+command prompt.  The prompt will show: C<[0]> when running under threads, but
+not actually in a thread.  C<[tid]> is consistent with C<gdb> usage.
+
+While running under threads, when you set or delete a breakpoint (etc.), this
+will apply to all threads, not just the currently running one.  When you are 
+in a currently executing thread, you will stay there until it completes.  With
+the current implementation it is not currently possible to hop from one thread
+to another.
+
+The C<e> and C<E> commands are currently fairly minimal - see C<h e> and C<h E>.
+
+Note that threading support was built into the debugger as of Perl version
+C<5.8.6> and debugger version C<1.2.8>.
+
+=cut
+
+BEGIN {
+  # ensure we can share our non-threaded variables or no-op
+  if ($ENV{PERL5DB_THREADED}) {
+	require threads;
+	require threads::shared;
+	import threads::shared qw(share);
+	$DBGR;
+	share(\$DBGR);
+	lock($DBGR);
+	print "Threads support enabled\n";
+  } else {
+	*lock  = sub(*) {};
+	*share = sub(*) {};
+  }
+}
+
+# This would probably be better done with "use vars", but that wasn't around
+# when this code was originally written. (Neither was "use strict".) And on
+# the principle of not fiddling with something that was working, this was
+# left alone.
+warn(               # Do not ;-)
+    # These variables control the execution of 'dumpvar.pl'.
+    $dumpvar::hashDepth,
+    $dumpvar::arrayDepth,
+    $dumpvar::dumpDBFiles,
+    $dumpvar::dumpPackages,
+    $dumpvar::quoteHighBit,
+    $dumpvar::printUndef,
+    $dumpvar::globPrint,
+    $dumpvar::usageOnly,
+
+    # used to save @ARGV and extract any debugger-related flags.
+    @ARGS,
+
+    # used to control die() reporting in diesignal()
+    $Carp::CarpLevel,
+
+    # used to prevent multiple entries to diesignal()
+    # (if for instance diesignal() itself dies)
+    $panic,
+
+    # used to prevent the debugger from running nonstop
+    # after a restart
+    $second_time,
+  )
+  if 0;
+
+foreach my $k (keys (%INC)) {
+	&share(\$main::{'_<'.$filename});
+};
+
+# Command-line + PERLLIB:
+# Save the contents of @INC before they are modified elsewhere.
+@ini_INC = @INC;
+
+# This was an attempt to clear out the previous values of various
+# trapped errors. Apparently it didn't help. XXX More info needed!
+# $prevwarn = $prevdie = $prevbus = $prevsegv = ''; # Does not help?!
+
+# We set these variables to safe values. We don't want to blindly turn
+# off warnings, because other packages may still want them.
+$trace = $signal = $single = 0;    # Uninitialized warning suppression
+                                   # (local $^W cannot help - other packages!).
+
+# Default to not exiting when program finishes; print the return
+# value when the 'r' command is used to return from a subroutine.
+$inhibit_exit = $option{PrintRet} = 1;
+
+=head1 OPTION PROCESSING
+
+The debugger's options are actually spread out over the debugger itself and 
+C<dumpvar.pl>; some of these are variables to be set, while others are 
+subs to be called with a value. To try to make this a little easier to
+manage, the debugger uses a few data structures to define what options
+are legal and how they are to be processed.
+
+First, the C<@options> array defines the I<names> of all the options that
+are to be accepted.
+
+=cut
+
+@options = qw(
+  CommandSet
+  hashDepth    arrayDepth    dumpDepth
+  DumpDBFiles  DumpPackages  DumpReused
+  compactDump  veryCompact   quote
+  HighBit      undefPrint    globPrint
+  PrintRet     UsageOnly     frame
+  AutoTrace    TTY           noTTY
+  ReadLine     NonStop       LineInfo
+  maxTraceLen  recallCommand ShellBang
+  pager        tkRunning     ornaments
+  signalLevel  warnLevel     dieLevel
+  inhibit_exit ImmediateStop bareStringify
+  CreateTTY    RemotePort    windowSize
+  DollarCaretP OnlyAssertions WarnAssertions
+);
+
+@RememberOnROptions = qw(DollarCaretP OnlyAssertions);
+
+=pod
+
+Second, C<optionVars> lists the variables that each option uses to save its
+state.
+
+=cut
+
+%optionVars = (
+    hashDepth     => \$dumpvar::hashDepth,
+    arrayDepth    => \$dumpvar::arrayDepth,
+    CommandSet    => \$CommandSet,
+    DumpDBFiles   => \$dumpvar::dumpDBFiles,
+    DumpPackages  => \$dumpvar::dumpPackages,
+    DumpReused    => \$dumpvar::dumpReused,
+    HighBit       => \$dumpvar::quoteHighBit,
+    undefPrint    => \$dumpvar::printUndef,
+    globPrint     => \$dumpvar::globPrint,
+    UsageOnly     => \$dumpvar::usageOnly,
+    CreateTTY     => \$CreateTTY,
+    bareStringify => \$dumpvar::bareStringify,
+    frame         => \$frame,
+    AutoTrace     => \$trace,
+    inhibit_exit  => \$inhibit_exit,
+    maxTraceLen   => \$maxtrace,
+    ImmediateStop => \$ImmediateStop,
+    RemotePort    => \$remoteport,
+    windowSize    => \$window,
+    WarnAssertions => \$warnassertions,
+);
+
+=pod
+
+Third, C<%optionAction> defines the subroutine to be called to process each
+option.
+
+=cut 
+
+%optionAction = (
+    compactDump   => \&dumpvar::compactDump,
+    veryCompact   => \&dumpvar::veryCompact,
+    quote         => \&dumpvar::quote,
+    TTY           => \&TTY,
+    noTTY         => \&noTTY,
+    ReadLine      => \&ReadLine,
+    NonStop       => \&NonStop,
+    LineInfo      => \&LineInfo,
+    recallCommand => \&recallCommand,
+    ShellBang     => \&shellBang,
+    pager         => \&pager,
+    signalLevel   => \&signalLevel,
+    warnLevel     => \&warnLevel,
+    dieLevel      => \&dieLevel,
+    tkRunning     => \&tkRunning,
+    ornaments     => \&ornaments,
+    RemotePort    => \&RemotePort,
+    DollarCaretP  => \&DollarCaretP,
+    OnlyAssertions=> \&OnlyAssertions,
+);
+
+=pod
+
+Last, the C<%optionRequire> notes modules that must be C<require>d if an
+option is used.
+
+=cut
+
+# Note that this list is not complete: several options not listed here
+# actually require that dumpvar.pl be loaded for them to work, but are
+# not in the table. A subsequent patch will correct this problem; for
+# the moment, we're just recommenting, and we are NOT going to change
+# function.
+%optionRequire = (
+    compactDump => 'dumpvar.pl',
+    veryCompact => 'dumpvar.pl',
+    quote       => 'dumpvar.pl',
+);
+
+=pod
+
+There are a number of initialization-related variables which can be set
+by putting code to set them in a BEGIN block in the C<PERL5DB> environment
+variable. These are:
+
+=over 4
+
+=item C<$rl> - readline control XXX needs more explanation
+
+=item C<$warnLevel> - whether or not debugger takes over warning handling
+
+=item C<$dieLevel> - whether or not debugger takes over die handling
+
+=item C<$signalLevel> - whether or not debugger takes over signal handling
+
+=item C<$pre> - preprompt actions (array reference)
+
+=item C<$post> - postprompt actions (array reference)
+
+=item C<$pretype>
+
+=item C<$CreateTTY> - whether or not to create a new TTY for this debugger
+
+=item C<$CommandSet> - which command set to use (defaults to new, documented set)
+
+=back
+
+=cut
+
+# These guys may be defined in $ENV{PERL5DB} :
+$rl          = 1     unless defined $rl;
+$warnLevel   = 1     unless defined $warnLevel;
+$dieLevel    = 1     unless defined $dieLevel;
+$signalLevel = 1     unless defined $signalLevel;
+$pre         = []    unless defined $pre;
+$post        = []    unless defined $post;
+$pretype     = []    unless defined $pretype;
+$CreateTTY   = 3     unless defined $CreateTTY;
+$CommandSet  = '580' unless defined $CommandSet;
+
+share($rl);
+share($warnLevel);
+share($dieLevel);
+share($signalLevel);
+share($pre);
+share($post);
+share($pretype);
+share($rl);
+share($CreateTTY);
+share($CommandSet);
+
+=pod
+
+The default C<die>, C<warn>, and C<signal> handlers are set up.
+
+=cut
+
+warnLevel($warnLevel);
+dieLevel($dieLevel);
+signalLevel($signalLevel);
+
+=pod
+
+The pager to be used is needed next. We try to get it from the
+environment first.  if it's not defined there, we try to find it in
+the Perl C<Config.pm>.  If it's not there, we default to C<more>. We
+then call the C<pager()> function to save the pager name.
+
+=cut
+
+# This routine makes sure $pager is set up so that '|' can use it.
+pager(
+
+    # If PAGER is defined in the environment, use it.
+    defined $ENV{PAGER}
+    ? $ENV{PAGER}
+
+      # If not, see if Config.pm defines it.
+    : eval { require Config }
+      && defined $Config::Config{pager}
+    ? $Config::Config{pager}
+
+      # If not, fall back to 'more'.
+    : 'more'
+  )
+  unless defined $pager;
+
+=pod
+
+We set up the command to be used to access the man pages, the command
+recall character (C<!> unless otherwise defined) and the shell escape
+character (C<!> unless otherwise defined). Yes, these do conflict, and
+neither works in the debugger at the moment.
+
+=cut
+
+setman();
+
+# Set up defaults for command recall and shell escape (note:
+# these currently don't work in linemode debugging).
+&recallCommand("!") unless defined $prc;
+&shellBang("!")     unless defined $psh;
+
+=pod
+
+We then set up the gigantic string containing the debugger help.
+We also set the limit on the number of arguments we'll display during a
+trace.
+
+=cut
+
+sethelp();
+
+# If we didn't get a default for the length of eval/stack trace args,
+# set it here.
+$maxtrace = 400 unless defined $maxtrace;
+
+=head2 SETTING UP THE DEBUGGER GREETING
+
+The debugger I<greeting> helps to inform the user how many debuggers are
+running, and whether the current debugger is the primary or a child.
+
+If we are the primary, we just hang onto our pid so we'll have it when
+or if we start a child debugger. If we are a child, we'll set things up
+so we'll have a unique greeting and so the parent will give us our own
+TTY later.
+
+We save the current contents of the C<PERLDB_PIDS> environment variable
+because we mess around with it. We'll also need to hang onto it because
+we'll need it if we restart.
+
+Child debuggers make a label out of the current PID structure recorded in
+PERLDB_PIDS plus the new PID. They also mark themselves as not having a TTY
+yet so the parent will give them one later via C<resetterm()>.
+
+=cut
+
+# Save the current contents of the environment; we're about to
+# much with it. We'll need this if we have to restart.
+$ini_pids = $ENV{PERLDB_PIDS};
+
+if ( defined $ENV{PERLDB_PIDS} ) {
+
+    # We're a child. Make us a label out of the current PID structure
+    # recorded in PERLDB_PIDS plus our (new) PID. Mark us as not having
+    # a term yet so the parent will give us one later via resetterm().
+    $pids = "[$ENV{PERLDB_PIDS}]";
+    $ENV{PERLDB_PIDS} .= "->$$";
+    $term_pid = -1;
+} ## end if (defined $ENV{PERLDB_PIDS...
+else {
+
+    # We're the parent PID. Initialize PERLDB_PID in case we end up with a
+    # child debugger, and mark us as the parent, so we'll know to set up
+    # more TTY's is we have to.
+    $ENV{PERLDB_PIDS} = "$$";
+    $pids             = "{pid=$$}";
+    $term_pid         = $$;
+}
+
+$pidprompt = '';
+
+# Sets up $emacs as a synonym for $slave_editor.
+*emacs = $slave_editor if $slave_editor;    # May be used in afterinit()...
+
+=head2 READING THE RC FILE
+
+The debugger will read a file of initialization options if supplied. If    
+running interactively, this is C<.perldb>; if not, it's C<perldb.ini>.
+
+=cut      
+
+# As noted, this test really doesn't check accurately that the debugger
+# is running at a terminal or not.
+
+if ( -e "/dev/tty" ) {                      # this is the wrong metric!
+    $rcfile = ".perldb";
+}
+else {
+    $rcfile = "perldb.ini";
+}
+
+=pod
+
+The debugger does a safety test of the file to be read. It must be owned
+either by the current user or root, and must only be writable by the owner.
+
+=cut
+
+# This wraps a safety test around "do" to read and evaluate the init file.
+#
+# This isn't really safe, because there's a race
+# between checking and opening.  The solution is to
+# open and fstat the handle, but then you have to read and
+# eval the contents.  But then the silly thing gets
+# your lexical scope, which is unfortunate at best.
+sub safe_do {
+    my $file = shift;
+
+    # Just exactly what part of the word "CORE::" don't you understand?
+    local $SIG{__WARN__};
+    local $SIG{__DIE__};
+
+    unless ( is_safe_file($file) ) {
+        CORE::warn <<EO_GRIPE;
+perldb: Must not source insecure rcfile $file.
+        You or the superuser must be the owner, and it must not 
+        be writable by anyone but its owner.
+EO_GRIPE
+        return;
+    } ## end unless (is_safe_file($file...
+
+    do $file;
+    CORE::warn("perldb: couldn't parse $file: $@") if $@;
+} ## end sub safe_do
+
+# This is the safety test itself.
+#
+# Verifies that owner is either real user or superuser and that no
+# one but owner may write to it.  This function is of limited use
+# when called on a path instead of upon a handle, because there are
+# no guarantees that filename (by dirent) whose file (by ino) is
+# eventually accessed is the same as the one tested.
+# Assumes that the file's existence is not in doubt.
+sub is_safe_file {
+    my $path = shift;
+    stat($path) || return;    # mysteriously vaporized
+    my ( $dev, $ino, $mode, $nlink, $uid, $gid ) = stat(_);
+
+    return 0 if $uid != 0 && $uid != $<;
+    return 0 if $mode & 022;
+    return 1;
+} ## end sub is_safe_file
+
+# If the rcfile (whichever one we decided was the right one to read)
+# exists, we safely do it.
+if ( -f $rcfile ) {
+    safe_do("./$rcfile");
+}
+
+# If there isn't one here, try the user's home directory.
+elsif ( defined $ENV{HOME} && -f "$ENV{HOME}/$rcfile" ) {
+    safe_do("$ENV{HOME}/$rcfile");
+}
+
+# Else try the login directory.
+elsif ( defined $ENV{LOGDIR} && -f "$ENV{LOGDIR}/$rcfile" ) {
+    safe_do("$ENV{LOGDIR}/$rcfile");
+}
+
+# If the PERLDB_OPTS variable has options in it, parse those out next.
+if ( defined $ENV{PERLDB_OPTS} ) {
+    parse_options( $ENV{PERLDB_OPTS} );
+}
+
+=pod
+
+The last thing we do during initialization is determine which subroutine is
+to be used to obtain a new terminal when a new debugger is started. Right now,
+the debugger only handles X Windows and OS/2.
+
+=cut
+
+# Set up the get_fork_TTY subroutine to be aliased to the proper routine.
+# Works if you're running an xterm or xterm-like window, or you're on
+# OS/2. This may need some expansion: for instance, this doesn't handle
+# OS X Terminal windows.
+
+if (
+    not defined &get_fork_TTY    # no routine exists,
+    and defined $ENV{TERM}       # and we know what kind
+                                 # of terminal this is,
+    and $ENV{TERM} eq 'xterm'    # and it's an xterm,
+#   and defined $ENV{WINDOWID}   # and we know what window this is, <- wrong metric
+    and defined $ENV{DISPLAY}    # and what display it's on,
+  )
+{
+    *get_fork_TTY = \&xterm_get_fork_TTY;    # use the xterm version
+} ## end if (not defined &get_fork_TTY...
+elsif ( $^O eq 'os2' ) {                     # If this is OS/2,
+    *get_fork_TTY = \&os2_get_fork_TTY;      # use the OS/2 version
+}
+
+# untaint $^O, which may have been tainted by the last statement.
+# see bug [perl #24674]
+$^O =~ m/^(.*)\z/;
+$^O = $1;
+
+# Here begin the unreadable code.  It needs fixing.
+
+=head2 RESTART PROCESSING
+
+This section handles the restart command. When the C<R> command is invoked, it
+tries to capture all of the state it can into environment variables, and
+then sets C<PERLDB_RESTART>. When we start executing again, we check to see
+if C<PERLDB_RESTART> is there; if so, we reload all the information that
+the R command stuffed into the environment variables.
+
+  PERLDB_RESTART   - flag only, contains no restart data itself.       
+  PERLDB_HIST      - command history, if it's available
+  PERLDB_ON_LOAD   - breakpoints set by the rc file
+  PERLDB_POSTPONE  - subs that have been loaded/not executed, and have actions
+  PERLDB_VISITED   - files that had breakpoints
+  PERLDB_FILE_...  - breakpoints for a file
+  PERLDB_OPT       - active options
+  PERLDB_INC       - the original @INC
+  PERLDB_PRETYPE   - preprompt debugger actions
+  PERLDB_PRE       - preprompt Perl code
+  PERLDB_POST      - post-prompt Perl code
+  PERLDB_TYPEAHEAD - typeahead captured by readline()
+
+We chug through all these variables and plug the values saved in them
+back into the appropriate spots in the debugger.
+
+=cut
+
+if ( exists $ENV{PERLDB_RESTART} ) {
+
+    # We're restarting, so we don't need the flag that says to restart anymore.
+    delete $ENV{PERLDB_RESTART};
+
+    # $restart = 1;
+    @hist          = get_list('PERLDB_HIST');
+    %break_on_load = get_list("PERLDB_ON_LOAD");
+    %postponed     = get_list("PERLDB_POSTPONE");
+
+	share(@hist);
+	share(@truehist);
+	share(%break_on_load);
+	share(%postponed);
+
+    # restore breakpoints/actions
+    my @had_breakpoints = get_list("PERLDB_VISITED");
+    for ( 0 .. $#had_breakpoints ) {
+        my %pf = get_list("PERLDB_FILE_$_");
+        $postponed_file{ $had_breakpoints[$_] } = \%pf if %pf;
+    }
+
+    # restore options
+    my %opt = get_list("PERLDB_OPT");
+    my ( $opt, $val );
+    while ( ( $opt, $val ) = each %opt ) {
+        $val =~ s/[\\\']/\\$1/g;
+        parse_options("$opt'$val'");
+    }
+
+    # restore original @INC
+    @INC     = get_list("PERLDB_INC");
+    @ini_INC = @INC;
+
+    # return pre/postprompt actions and typeahead buffer
+    $pretype   = [ get_list("PERLDB_PRETYPE") ];
+    $pre       = [ get_list("PERLDB_PRE") ];
+    $post      = [ get_list("PERLDB_POST") ];
+    @typeahead = get_list( "PERLDB_TYPEAHEAD", @typeahead );
+} ## end if (exists $ENV{PERLDB_RESTART...
+
+=head2 SETTING UP THE TERMINAL
+
+Now, we'll decide how the debugger is going to interact with the user.
+If there's no TTY, we set the debugger to run non-stop; there's not going
+to be anyone there to enter commands.
+
+=cut
+
+if ($notty) {
+    $runnonstop = 1;
+	share($runnonstop);
+}
+
+=pod
+
+If there is a TTY, we have to determine who it belongs to before we can
+proceed. If this is a slave editor or graphical debugger (denoted by
+the first command-line switch being '-emacs'), we shift this off and
+set C<$rl> to 0 (XXX ostensibly to do straight reads).
+
+=cut
+
+else {
+
+    # Is Perl being run from a slave editor or graphical debugger?
+    # If so, don't use readline, and set $slave_editor = 1.
+    $slave_editor =
+      ( ( defined $main::ARGV[0] ) and ( $main::ARGV[0] eq '-emacs' ) );
+    $rl = 0, shift(@main::ARGV) if $slave_editor;
+
+    #require Term::ReadLine;
+
+=pod
+
+We then determine what the console should be on various systems:
+
+=over 4
+
+=item * Cygwin - We use C<stdin> instead of a separate device.
+
+=cut
+
+    if ( $^O eq 'cygwin' ) {
+
+        # /dev/tty is binary. use stdin for textmode
+        undef $console;
+    }
+
+=item * Unix - use C</dev/tty>.
+
+=cut
+
+    elsif ( -e "/dev/tty" ) {
+        $console = "/dev/tty";
+    }
+
+=item * Windows or MSDOS - use C<con>.
+
+=cut
+
+    elsif ( $^O eq 'dos' or -e "con" or $^O eq 'MSWin32' ) {
+        $console = "con";
+    }
+
+=item * MacOS - use C<Dev:Console:Perl Debug> if this is the MPW version; C<Dev:
+Console> if not.
+
+Note that Mac OS X returns C<darwin>, not C<MacOS>. Also note that the debugger doesn't do anything special for C<darwin>. Maybe it should.
+
+=cut
+
+    elsif ( $^O eq 'MacOS' ) {
+        if ( $MacPerl::Version !~ /MPW/ ) {
+            $console =
+              "Dev:Console:Perl Debug";    # Separate window for application
+        }
+        else {
+            $console = "Dev:Console";
+        }
+    } ## end elsif ($^O eq 'MacOS')
+
+=item * VMS - use C<sys$command>.
+
+=cut
+
+    else {
+
+        # everything else is ...
+        $console = "sys\$command";
+    }
+
+=pod
+
+=back
+
+Several other systems don't use a specific console. We C<undef $console>
+for those (Windows using a slave editor/graphical debugger, NetWare, OS/2
+with a slave editor, Epoc).
+
+=cut
+
+    if ( ( $^O eq 'MSWin32' ) and ( $slave_editor or defined $ENV{EMACS} ) ) {
+
+        # /dev/tty is binary. use stdin for textmode
+        $console = undef;
+    }
+
+    if ( $^O eq 'NetWare' ) {
+
+        # /dev/tty is binary. use stdin for textmode
+        $console = undef;
+    }
+
+    # In OS/2, we need to use STDIN to get textmode too, even though
+    # it pretty much looks like Unix otherwise.
+    if ( defined $ENV{OS2_SHELL} and ( $slave_editor or $ENV{WINDOWID} ) )
+    {    # In OS/2
+        $console = undef;
+    }
+
+    # EPOC also falls into the 'got to use STDIN' camp.
+    if ( $^O eq 'epoc' ) {
+        $console = undef;
+    }
+
+=pod
+
+If there is a TTY hanging around from a parent, we use that as the console.
+
+=cut
+
+    $console = $tty if defined $tty;
+
+=head2 SOCKET HANDLING   
+
+The debugger is capable of opening a socket and carrying out a debugging
+session over the socket.
+
+If C<RemotePort> was defined in the options, the debugger assumes that it
+should try to start a debugging session on that port. It builds the socket
+and then tries to connect the input and output filehandles to it.
+
+=cut
+
+    # Handle socket stuff.
+
+    if ( defined $remoteport ) {
+
+        # If RemotePort was defined in the options, connect input and output
+        # to the socket.
+        require IO::Socket;
+        $OUT = new IO::Socket::INET(
+            Timeout  => '10',
+            PeerAddr => $remoteport,
+            Proto    => 'tcp',
+        );
+        if ( !$OUT ) { die "Unable to connect to remote host: $remoteport\n"; }
+        $IN = $OUT;
+    } ## end if (defined $remoteport)
+
+=pod
+
+If no C<RemotePort> was defined, and we want to create a TTY on startup,
+this is probably a situation where multiple debuggers are running (for example,
+a backticked command that starts up another debugger). We create a new IN and
+OUT filehandle, and do the necessary mojo to create a new TTY if we know how
+and if we can.
+
+=cut
+
+    # Non-socket.
+    else {
+
+        # Two debuggers running (probably a system or a backtick that invokes
+        # the debugger itself under the running one). create a new IN and OUT
+        # filehandle, and do the necessary mojo to create a new tty if we
+        # know how, and we can.
+        create_IN_OUT(4) if $CreateTTY & 4;
+        if ($console) {
+
+            # If we have a console, check to see if there are separate ins and
+            # outs to open. (They are assumed identiical if not.)
+
+            my ( $i, $o ) = split /,/, $console;
+            $o = $i unless defined $o;
+
+            # read/write on in, or just read, or read on STDIN.
+            open( IN,      "+<$i" )
+              || open( IN, "<$i" )
+              || open( IN, "<&STDIN" );
+
+            # read/write/create/clobber out, or write/create/clobber out,
+            # or merge with STDERR, or merge with STDOUT.
+                 open( OUT, "+>$o" )
+              || open( OUT, ">$o" )
+              || open( OUT, ">&STDERR" )
+              || open( OUT, ">&STDOUT" );    # so we don't dongle stdout
+
+        } ## end if ($console)
+        elsif ( not defined $console ) {
+
+            # No console. Open STDIN.
+            open( IN, "<&STDIN" );
+
+            # merge with STDERR, or with STDOUT.
+            open( OUT,      ">&STDERR" )
+              || open( OUT, ">&STDOUT" );    # so we don't dongle stdout
+            $console = 'STDIN/OUT';
+        } ## end elsif (not defined $console)
+
+        # Keep copies of the filehandles so that when the pager runs, it
+        # can close standard input without clobbering ours.
+        $IN = \*IN, $OUT = \*OUT if $console or not defined $console;
+    } ## end elsif (from if(defined $remoteport))
+
+    # Unbuffer DB::OUT. We need to see responses right away.
+    my $previous = select($OUT);
+    $| = 1;                                  # for DB::OUT
+    select($previous);
+
+    # Line info goes to debugger output unless pointed elsewhere.
+    # Pointing elsewhere makes it possible for slave editors to
+    # keep track of file and position. We have both a filehandle
+    # and a I/O description to keep track of.
+    $LINEINFO = $OUT     unless defined $LINEINFO;
+    $lineinfo = $console unless defined $lineinfo;
+	# share($LINEINFO); # <- unable to share globs
+	share($lineinfo);   # 
+
+=pod
+
+To finish initialization, we show the debugger greeting,
+and then call the C<afterinit()> subroutine if there is one.
+
+=cut
+
+    # Show the debugger greeting.
+    $header =~ s/.Header: ([^,]+),v(\s+\S+\s+\S+).*$/$1$2/;
+    unless ($runnonstop) {
+        local $\ = '';
+        local $, = '';
+        if ( $term_pid eq '-1' ) {
+            print $OUT "\nDaughter DB session started...\n";
+        }
+        else {
+            print $OUT "\nLoading DB routines from $header\n";
+            print $OUT (
+                "Editor support ",
+                $slave_editor ? "enabled" : "available", ".\n"
+            );
+            print $OUT
+"\nEnter h or `h h' for help, or `$doccmd perldebug' for more help.\n\n";
+        } ## end else [ if ($term_pid eq '-1')
+    } ## end unless ($runnonstop)
+} ## end else [ if ($notty)
+
+# XXX This looks like a bug to me.
+# Why copy to @ARGS and then futz with @args?
+@ARGS = @ARGV;
+for (@args) {
+    # Make sure backslashes before single quotes are stripped out, and
+    # keep args unless they are numeric (XXX why?)
+    # s/\'/\\\'/g;                      # removed while not justified understandably
+    # s/(.*)/'$1'/ unless /^-?[\d.]+$/; # ditto
+}
+
+# If there was an afterinit() sub defined, call it. It will get
+# executed in our scope, so it can fiddle with debugger globals.
+if ( defined &afterinit ) {    # May be defined in $rcfile
+    &afterinit();
+}
+
+# Inform us about "Stack dump during die enabled ..." in dieLevel().
+$I_m_init = 1;
+
+############################################################ Subroutines
+
+=head1 SUBROUTINES
+
+=head2 DB
+
+This gigantic subroutine is the heart of the debugger. Called before every
+statement, its job is to determine if a breakpoint has been reached, and
+stop if so; read commands from the user, parse them, and execute
+them, and hen send execution off to the next statement.
+
+Note that the order in which the commands are processed is very important;
+some commands earlier in the loop will actually alter the C<$cmd> variable
+to create other commands to be executed later. This is all highly I<optimized>
+but can be confusing. Check the comments for each C<$cmd ... && do {}> to
+see what's happening in any given command.
+
+=cut
+
+sub DB {
+
+    # lock the debugger and get the thread id for the prompt
+	lock($DBGR);
+	my $tid;
+	if ($ENV{PERL5DB_THREADED}) {
+		$tid = eval { "[".threads->self->tid."]" };
+	}
+
+    # Check for whether we should be running continuously or not.
+    # _After_ the perl program is compiled, $single is set to 1:
+    if ( $single and not $second_time++ ) {
+
+        # Options say run non-stop. Run until we get an interrupt.
+        if ($runnonstop) {    # Disable until signal
+                # If there's any call stack in place, turn off single
+                # stepping into subs throughout the stack.
+            for ( $i = 0 ; $i <= $stack_depth ; ) {
+                $stack[ $i++ ] &= ~1;
+            }
+
+            # And we are now no longer in single-step mode.
+            $single = 0;
+
+            # If we simply returned at this point, we wouldn't get
+            # the trace info. Fall on through.
+            # return;
+        } ## end if ($runnonstop)
+
+        elsif ($ImmediateStop) {
+
+            # We are supposed to stop here; XXX probably a break.
+            $ImmediateStop = 0;    # We've processed it; turn it off
+            $signal        = 1;    # Simulate an interrupt to force
+                                   # us into the command loop
+        }
+    } ## end if ($single and not $second_time...
+
+    # If we're in single-step mode, or an interrupt (real or fake)
+    # has occurred, turn off non-stop mode.
+    $runnonstop = 0 if $single or $signal;
+
+    # Preserve current values of $@, $!, $^E, $,, $/, $\, $^W.
+    # The code being debugged may have altered them.
+    &save;
+
+    # Since DB::DB gets called after every line, we can use caller() to
+    # figure out where we last were executing. Sneaky, eh? This works because
+    # caller is returning all the extra information when called from the
+    # debugger.
+    local ( $package, $filename, $line ) = caller;
+    local $filename_ini = $filename;
+
+    # set up the context for DB::eval, so it can properly execute
+    # code on behalf of the user. We add the package in so that the
+    # code is eval'ed in the proper package (not in the debugger!).
+    local $usercontext =
+      '($@, $!, $^E, $,, $/, $\, $^W) = @saved;' . "package $package;";
+
+    # Create an alias to the active file magical array to simplify
+    # the code here.
+    local (*dbline) = $main::{ '_<' . $filename };
+
+    # we need to check for pseudofiles on Mac OS (these are files
+    # not attached to a filename, but instead stored in Dev:Pseudo)
+    if ( $^O eq 'MacOS' && $#dbline < 0 ) {
+        $filename_ini = $filename = 'Dev:Pseudo';
+        *dbline = $main::{ '_<' . $filename };
+    }
+
+    # Last line in the program.
+    local $max = $#dbline;
+
+    # if we have something here, see if we should break.
+    if ( $dbline{$line}
+        && ( ( $stop, $action ) = split( /\0/, $dbline{$line} ) ) )
+    {
+
+        # Stop if the stop criterion says to just stop.
+        if ( $stop eq '1' ) {
+            $signal |= 1;
+        }
+
+        # It's a conditional stop; eval it in the user's context and
+        # see if we should stop. If so, remove the one-time sigil.
+        elsif ($stop) {
+            $evalarg = "\$DB::signal |= 1 if do {$stop}";
+            &eval;
+            $dbline{$line} =~ s/;9($|\0)/$1/;
+        }
+    } ## end if ($dbline{$line} && ...
+
+    # Preserve the current stop-or-not, and see if any of the W
+    # (watch expressions) has changed.
+    my $was_signal = $signal;
+
+    # If we have any watch expressions ...
+    if ( $trace & 2 ) {
+        for ( my $n = 0 ; $n <= $#to_watch ; $n++ ) {
+            $evalarg = $to_watch[$n];
+            local $onetimeDump;    # Tell DB::eval() to not output results
+
+            # Fix context DB::eval() wants to return an array, but
+            # we need a scalar here.
+            my ($val) = join( "', '", &eval );
+            $val = ( ( defined $val ) ? "'$val'" : 'undef' );
+
+            # Did it change?
+            if ( $val ne $old_watch[$n] ) {
+
+                # Yep! Show the difference, and fake an interrupt.
+                $signal = 1;
+                print $OUT <<EOP;
+Watchpoint $n:\t$to_watch[$n] changed:
+    old value:\t$old_watch[$n]
+    new value:\t$val
+EOP
+                $old_watch[$n] = $val;
+            } ## end if ($val ne $old_watch...
+        } ## end for (my $n = 0 ; $n <= ...
+    } ## end if ($trace & 2)
+
+=head2 C<watchfunction()>
+
+C<watchfunction()> is a function that can be defined by the user; it is a
+function which will be run on each entry to C<DB::DB>; it gets the 
+current package, filename, and line as its parameters.
+
+The watchfunction can do anything it likes; it is executing in the 
+debugger's context, so it has access to all of the debugger's internal
+data structures and functions.
+
+C<watchfunction()> can control the debugger's actions. Any of the following
+will cause the debugger to return control to the user's program after
+C<watchfunction()> executes:
+
+=over 4 
+
+=item *
+
+Returning a false value from the C<watchfunction()> itself.
+
+=item *
+
+Altering C<$single> to a false value.
+
+=item *
+
+Altering C<$signal> to a false value.
+
+=item *
+
+Turning off the C<4> bit in C<$trace> (this also disables the
+check for C<watchfunction()>. This can be done with
+
+    $trace &= ~4;
+
+=back
+
+=cut
+
+    # If there's a user-defined DB::watchfunction, call it with the
+    # current package, filename, and line. The function executes in
+    # the DB:: package.
+    if ( $trace & 4 ) {    # User-installed watch
+        return
+          if watchfunction( $package, $filename, $line )
+          and not $single
+          and not $was_signal
+          and not( $trace & ~4 );
+    } ## end if ($trace & 4)
+
+    # Pick up any alteration to $signal in the watchfunction, and
+    # turn off the signal now.
+    $was_signal = $signal;
+    $signal     = 0;
+
+=head2 GETTING READY TO EXECUTE COMMANDS
+
+The debugger decides to take control if single-step mode is on, the
+C<t> command was entered, or the user generated a signal. If the program
+has fallen off the end, we set things up so that entering further commands
+won't cause trouble, and we say that the program is over.
+
+=cut
+
+    # Check to see if we should grab control ($single true,
+    # trace set appropriately, or we got a signal).
+    if ( $single || ( $trace & 1 ) || $was_signal ) {
+
+        # Yes, grab control.
+        if ($slave_editor) {
+
+            # Tell the editor to update its position.
+            $position = "\032\032$filename:$line:0\n";
+            print_lineinfo($position);
+        }
+
+=pod
+
+Special check: if we're in package C<DB::fake>, we've gone through the 
+C<END> block at least once. We set up everything so that we can continue
+to enter commands and have a valid context to be in.
+
+=cut
+
+        elsif ( $package eq 'DB::fake' ) {
+
+            # Fallen off the end already.
+            $term || &setterm;
+            print_help(<<EOP);
+Debugged program terminated.  Use B<q> to quit or B<R> to restart,
+  use B<o> I<inhibit_exit> to avoid stopping after program termination,
+  B<h q>, B<h R> or B<h o> to get additional info.  
+EOP
+
+            # Set the DB::eval context appropriately.
+            $package     = 'main';
+            $usercontext =
+                '($@, $!, $^E, $,, $/, $\, $^W) = @saved;'
+              . "package $package;";    # this won't let them modify, alas
+        } ## end elsif ($package eq 'DB::fake')
+
+=pod
+
+If the program hasn't finished executing, we scan forward to the
+next executable line, print that out, build the prompt from the file and line
+number information, and print that.   
+
+=cut
+
+        else {
+
+            # Still somewhere in the midst of execution. Set up the
+            #  debugger prompt.
+            $sub =~ s/\'/::/;    # Swap Perl 4 package separators (') to
+                                 # Perl 5 ones (sorry, we don't print Klingon
+                                 #module names)
+
+            $prefix = $sub =~ /::/ ? "" : "${'package'}::";
+            $prefix .= "$sub($filename:";
+            $after = ( $dbline[$line] =~ /\n$/ ? '' : "\n" );
+
+            # Break up the prompt if it's really long.
+            if ( length($prefix) > 30 ) {
+                $position = "$prefix$line):\n$line:\t$dbline[$line]$after";
+                $prefix   = "";
+                $infix    = ":\t";
+            }
+            else {
+                $infix    = "):\t";
+                $position = "$prefix$line$infix$dbline[$line]$after";
+            }
+
+            # Print current line info, indenting if necessary.
+            if ($frame) {
+                print_lineinfo( ' ' x $stack_depth,
+                    "$line:\t$dbline[$line]$after" );
+            }
+            else {
+                print_lineinfo($position);
+            }
+
+            # Scan forward, stopping at either the end or the next
+            # unbreakable line.
+            for ( $i = $line + 1 ; $i <= $max && $dbline[$i] == 0 ; ++$i )
+            {    #{ vi
+
+                # Drop out on null statements, block closers, and comments.
+                last if $dbline[$i] =~ /^\s*[\;\}\#\n]/;
+
+                # Drop out if the user interrupted us.
+                last if $signal;
+
+                # Append a newline if the line doesn't have one. Can happen
+                # in eval'ed text, for instance.
+                $after = ( $dbline[$i] =~ /\n$/ ? '' : "\n" );
+
+                # Next executable line.
+                $incr_pos = "$prefix$i$infix$dbline[$i]$after";
+                $position .= $incr_pos;
+                if ($frame) {
+
+                    # Print it indented if tracing is on.
+                    print_lineinfo( ' ' x $stack_depth,
+                        "$i:\t$dbline[$i]$after" );
+                }
+                else {
+                    print_lineinfo($incr_pos);
+                }
+            } ## end for ($i = $line + 1 ; $i...
+        } ## end else [ if ($slave_editor)
+    } ## end if ($single || ($trace...
+
+=pod
+
+If there's an action to be executed for the line we stopped at, execute it.
+If there are any preprompt actions, execute those as well.      
+
+=cut
+
+    # If there's an action, do it now.
+    $evalarg = $action, &eval if $action;
+
+    # Are we nested another level (e.g., did we evaluate a function
+    # that had a breakpoint in it at the debugger prompt)?
+    if ( $single || $was_signal ) {
+
+        # Yes, go down a level.
+        local $level = $level + 1;
+
+        # Do any pre-prompt actions.
+        foreach $evalarg (@$pre) {
+            &eval;
+        }
+
+        # Complain about too much recursion if we passed the limit.
+        print $OUT $stack_depth . " levels deep in subroutine calls!\n"
+          if $single & 4;
+
+        # The line we're currently on. Set $incr to -1 to stay here
+        # until we get a command that tells us to advance.
+        $start = $line;
+        $incr  = -1;      # for backward motion.
+
+        # Tack preprompt debugger actions ahead of any actual input.
+        @typeahead = ( @$pretype, @typeahead );
+
+=head2 WHERE ARE WE?
+
+XXX Relocate this section?
+
+The debugger normally shows the line corresponding to the current line of
+execution. Sometimes, though, we want to see the next line, or to move elsewhere
+in the file. This is done via the C<$incr>, C<$start>, and C<$max> variables.
+
+C<$incr> controls by how many lines the I<current> line should move forward
+after a command is executed. If set to -1, this indicates that the I<current>
+line shouldn't change.
+
+C<$start> is the I<current> line. It is used for things like knowing where to
+move forwards or backwards from when doing an C<L> or C<-> command.
+
+C<$max> tells the debugger where the last line of the current file is. It's
+used to terminate loops most often.
+
+=head2 THE COMMAND LOOP
+
+Most of C<DB::DB> is actually a command parsing and dispatch loop. It comes
+in two parts:
+
+=over 4
+
+=item *
+
+The outer part of the loop, starting at the C<CMD> label. This loop
+reads a command and then executes it.
+
+=item *
+
+The inner part of the loop, starting at the C<PIPE> label. This part
+is wholly contained inside the C<CMD> block and only executes a command.
+Used to handle commands running inside a pager.
+
+=back
+
+So why have two labels to restart the loop? Because sometimes, it's easier to
+have a command I<generate> another command and then re-execute the loop to do
+the new command. This is faster, but perhaps a bit more convoluted.
+
+=cut
+
+        # The big command dispatch loop. It keeps running until the
+        # user yields up control again.
+        #
+        # If we have a terminal for input, and we get something back
+        # from readline(), keep on processing.
+      CMD:
+        while (
+
+            # We have a terminal, or can get one ...
+            ( $term || &setterm ),
+
+            # ... and it belogs to this PID or we get one for this PID ...
+            ( $term_pid == $$ or resetterm(1) ),
+
+            # ... and we got a line of command input ...
+            defined(
+                $cmd = &readline(
+                        "$pidprompt $tid DB"
+                      . ( '<' x $level )
+                      . ( $#hist + 1 )
+                      . ( '>' x $level ) . " "
+                )
+            )
+          )
+        {
+
+			share($cmd);
+            # ... try to execute the input as debugger commands.
+
+            # Don't stop running.
+            $single = 0;
+
+            # No signal is active.
+            $signal = 0;
+
+            # Handle continued commands (ending with \):
+            $cmd =~ s/\\$/\n/ && do {
+                $cmd .= &readline("  cont: ");
+                redo CMD;
+            };
+
+=head4 The null command
+
+A newline entered by itself means I<re-execute the last command>. We grab the
+command out of C<$laststep> (where it was recorded previously), and copy it
+back into C<$cmd> to be executed below. If there wasn't any previous command,
+we'll do nothing below (no command will match). If there was, we also save it
+in the command history and fall through to allow the command parsing to pick
+it up.
+
+=cut
+
+            # Empty input means repeat the last command.
+            $cmd =~ /^$/ && ( $cmd = $laststep );
+            chomp($cmd);    # get rid of the annoying extra newline
+            push( @hist, $cmd ) if length($cmd) > 1;
+            push( @truehist, $cmd );
+			share(@hist);
+			share(@truehist);
+
+            # This is a restart point for commands that didn't arrive
+            # via direct user input. It allows us to 'redo PIPE' to
+            # re-execute command processing without reading a new command.
+          PIPE: {
+                $cmd =~ s/^\s+//s;    # trim annoying leading whitespace
+                $cmd =~ s/\s+$//s;    # trim annoying trailing whitespace
+                ($i) = split( /\s+/, $cmd );
+
+=head3 COMMAND ALIASES
+
+The debugger can create aliases for commands (these are stored in the
+C<%alias> hash). Before a command is executed, the command loop looks it up
+in the alias hash and substitutes the contents of the alias for the command,
+completely replacing it.
+
+=cut
+
+                # See if there's an alias for the command, and set it up if so.
+                if ( $alias{$i} ) {
+
+                    # Squelch signal handling; we want to keep control here
+                    # if something goes loco during the alias eval.
+                    local $SIG{__DIE__};
+                    local $SIG{__WARN__};
+
+                    # This is a command, so we eval it in the DEBUGGER's
+                    # scope! Otherwise, we can't see the special debugger
+                    # variables, or get to the debugger's subs. (Well, we
+                    # _could_, but why make it even more complicated?)
+                    eval "\$cmd =~ $alias{$i}";
+                    if ($@) {
+                        local $\ = '';
+                        print $OUT "Couldn't evaluate `$i' alias: $@";
+                        next CMD;
+                    }
+                } ## end if ($alias{$i})
+
+=head3 MAIN-LINE COMMANDS
+
+All of these commands work up to and after the program being debugged has
+terminated. 
+
+=head4 C<q> - quit
+
+Quit the debugger. This entails setting the C<$fall_off_end> flag, so we don't 
+try to execute further, cleaning any restart-related stuff out of the
+environment, and executing with the last value of C<$?>.
+
+=cut
+
+                $cmd =~ /^q$/ && do {
+                    $fall_off_end = 1;
+                    clean_ENV();
+                    exit $?;
+                };
+
+=head4 C<t> - trace
+
+Turn tracing on or off. Inverts the appropriate bit in C<$trace> (q.v.).
+
+=cut
+
+                $cmd =~ /^t$/ && do {
+                    $trace ^= 1;
+                    local $\ = '';
+                    print $OUT "Trace = "
+                      . ( ( $trace & 1 ) ? "on" : "off" ) . "\n";
+                    next CMD;
+                };
+
+=head4 C<S> - list subroutines matching/not matching a pattern
+
+Walks through C<%sub>, checking to see whether or not to print the name.
+
+=cut
+
+                $cmd =~ /^S(\s+(!)?(.+))?$/ && do {
+
+                    $Srev     = defined $2;     # Reverse scan?
+                    $Spatt    = $3;             # The pattern (if any) to use.
+                    $Snocheck = !defined $1;    # No args - print all subs.
+
+                    # Need to make these sane here.
+                    local $\ = '';
+                    local $, = '';
+
+                    # Search through the debugger's magical hash of subs.
+                    # If $nocheck is true, just print the sub name.
+                    # Otherwise, check it against the pattern. We then use
+                    # the XOR trick to reverse the condition as required.
+                    foreach $subname ( sort( keys %sub ) ) {
+                        if ( $Snocheck or $Srev ^ ( $subname =~ /$Spatt/ ) ) {
+                            print $OUT $subname, "\n";
+                        }
+                    }
+                    next CMD;
+                };
+
+=head4 C<X> - list variables in current package
+
+Since the C<V> command actually processes this, just change this to the 
+appropriate C<V> command and fall through.
+
+=cut
+
+                $cmd =~ s/^X\b/V $package/;
+
+=head4 C<V> - list variables
+
+Uses C<dumpvar.pl> to dump out the current values for selected variables. 
+
+=cut
+
+                # Bare V commands get the currently-being-debugged package
+                # added.
+                $cmd =~ /^V$/ && do {
+                    $cmd = "V $package";
+                };
+
+                # V - show variables in package.
+                $cmd =~ /^V\b\s*(\S+)\s*(.*)/ && do {
+
+                    # Save the currently selected filehandle and
+                    # force output to debugger's filehandle (dumpvar
+                    # just does "print" for output).
+                    local ($savout) = select($OUT);
+
+                    # Grab package name and variables to dump.
+                    $packname = $1;
+                    @vars     = split( ' ', $2 );
+
+                    # If main::dumpvar isn't here, get it.
+                    do 'dumpvar.pl' unless defined &main::dumpvar;
+                    if ( defined &main::dumpvar ) {
+
+                        # We got it. Turn off subroutine entry/exit messages
+                        # for the moment, along with return values.
+                        local $frame = 0;
+                        local $doret = -2;
+
+                        # must detect sigpipe failures  - not catching
+                        # then will cause the debugger to die.
+                        eval {
+                            &main::dumpvar(
+                                $packname,
+                                defined $option{dumpDepth}
+                                ? $option{dumpDepth}
+                                : -1,    # assume -1 unless specified
+                                @vars
+                            );
+                        };
+
+                        # The die doesn't need to include the $@, because
+                        # it will automatically get propagated for us.
+                        if ($@) {
+                            die unless $@ =~ /dumpvar print failed/;
+                        }
+                    } ## end if (defined &main::dumpvar)
+                    else {
+
+                        # Couldn't load dumpvar.
+                        print $OUT "dumpvar.pl not available.\n";
+                    }
+
+                    # Restore the output filehandle, and go round again.
+                    select($savout);
+                    next CMD;
+                };
+
+=head4 C<x> - evaluate and print an expression
+
+Hands the expression off to C<DB::eval>, setting it up to print the value
+via C<dumpvar.pl> instead of just printing it directly.
+
+=cut
+
+                $cmd =~ s/^x\b/ / && do {    # Remainder gets done by DB::eval()
+                    $onetimeDump = 'dump';    # main::dumpvar shows the output
+
+                    # handle special  "x 3 blah" syntax XXX propagate
+                    # doc back to special variables.
+                    if ( $cmd =~ s/^\s*(\d+)(?=\s)/ / ) {
+                        $onetimedumpDepth = $1;
+                    }
+                };
+
+=head4 C<m> - print methods
+
+Just uses C<DB::methods> to determine what methods are available.
+
+=cut
+
+                $cmd =~ s/^m\s+([\w:]+)\s*$/ / && do {
+                    methods($1);
+                    next CMD;
+                };
+
+                # m expr - set up DB::eval to do the work
+                $cmd =~ s/^m\b/ / && do {    # Rest gets done by DB::eval()
+                    $onetimeDump = 'methods';   #  method output gets used there
+                };
+
+=head4 C<f> - switch files
+
+=cut
+
+                $cmd =~ /^f\b\s*(.*)/ && do {
+                    $file = $1;
+                    $file =~ s/\s+$//;
+
+                    # help for no arguments (old-style was return from sub).
+                    if ( !$file ) {
+                        print $OUT
+                          "The old f command is now the r command.\n";    # hint
+                        print $OUT "The new f command switches filenames.\n";
+                        next CMD;
+                    } ## end if (!$file)
+
+                    # if not in magic file list, try a close match.
+                    if ( !defined $main::{ '_<' . $file } ) {
+                        if ( ($try) = grep( m#^_<.*$file#, keys %main:: ) ) {
+                            {
+                                $try = substr( $try, 2 );
+                                print $OUT "Choosing $try matching `$file':\n";
+                                $file = $try;
+                            }
+                        } ## end if (($try) = grep(m#^_<.*$file#...
+                    } ## end if (!defined $main::{ ...
+
+                    # If not successfully switched now, we failed.
+                    if ( !defined $main::{ '_<' . $file } ) {
+                        print $OUT "No file matching `$file' is loaded.\n";
+                        next CMD;
+                    }
+
+                    # We switched, so switch the debugger internals around.
+                    elsif ( $file ne $filename ) {
+                        *dbline   = $main::{ '_<' . $file };
+                        $max      = $#dbline;
+                        $filename = $file;
+                        $start    = 1;
+                        $cmd      = "l";
+                    } ## end elsif ($file ne $filename)
+
+                    # We didn't switch; say we didn't.
+                    else {
+                        print $OUT "Already in $file.\n";
+                        next CMD;
+                    }
+                };
+
+=head4 C<.> - return to last-executed line.
+
+We set C<$incr> to -1 to indicate that the debugger shouldn't move ahead,
+and then we look up the line in the magical C<%dbline> hash.
+
+=cut
+
+                # . command.
+                $cmd =~ /^\.$/ && do {
+                    $incr = -1;    # stay at current line
+
+                    # Reset everything to the old location.
+                    $start    = $line;
+                    $filename = $filename_ini;
+                    *dbline   = $main::{ '_<' . $filename };
+                    $max      = $#dbline;
+
+                    # Now where are we?
+                    print_lineinfo($position);
+                    next CMD;
+                };
+
+=head4 C<-> - back one window
+
+We change C<$start> to be one window back; if we go back past the first line,
+we set it to be the first line. We ser C<$incr> to put us back at the
+currently-executing line, and then put a C<l $start +> (list one window from
+C<$start>) in C<$cmd> to be executed later.
+
+=cut
+
+                # - - back a window.
+                $cmd =~ /^-$/ && do {
+
+                    # back up by a window; go to 1 if back too far.
+                    $start -= $incr + $window + 1;
+                    $start = 1 if $start <= 0;
+                    $incr  = $window - 1;
+
+                    # Generate and execute a "l +" command (handled below).
+                    $cmd = 'l ' . ($start) . '+';
+                };
+
+=head3 PRE-580 COMMANDS VS. NEW COMMANDS: C<a, A, b, B, h, l, L, M, o, O, P, v, w, W, E<lt>, E<lt>E<lt>, {, {{>
+
+In Perl 5.8.0, a realignment of the commands was done to fix up a number of
+problems, most notably that the default case of several commands destroying
+the user's work in setting watchpoints, actions, etc. We wanted, however, to
+retain the old commands for those who were used to using them or who preferred
+them. At this point, we check for the new commands and call C<cmd_wrapper> to
+deal with them instead of processing them in-line.
+
+=cut
+
+                # All of these commands were remapped in perl 5.8.0;
+                # we send them off to the secondary dispatcher (see below).
+                $cmd =~ /^([aAbBeEhilLMoOPvwW]\b|[<>\{]{1,2})\s*(.*)/so && do {
+                    &cmd_wrapper( $1, $2, $line );
+                    next CMD;
+                };
+
+=head4 C<y> - List lexicals in higher scope
+
+Uses C<PadWalker> to find the lexicals supplied as arguments in a scope    
+above the current one and then displays then using C<dumpvar.pl>.
+
+=cut
+
+                $cmd =~ /^y(?:\s+(\d*)\s*(.*))?$/ && do {
+
+                    # See if we've got the necessary support.
+                    eval { require PadWalker; PadWalker->VERSION(0.08) }
+                      or &warn(
+                        $@ =~ /locate/
+                        ? "PadWalker module not found - please install\n"
+                        : $@
+                      )
+                      and next CMD;
+
+                    # Load up dumpvar if we don't have it. If we can, that is.
+                    do 'dumpvar.pl' unless defined &main::dumpvar;
+                    defined &main::dumpvar
+                      or print $OUT "dumpvar.pl not available.\n"
+                      and next CMD;
+
+                    # Got all the modules we need. Find them and print them.
+                    my @vars = split( ' ', $2 || '' );
+
+                    # Find the pad.
+                    my $h = eval { PadWalker::peek_my( ( $1 || 0 ) + 1 ) };
+
+                    # Oops. Can't find it.
+                    $@ and $@ =~ s/ at .*//, &warn($@), next CMD;
+
+                    # Show the desired vars with dumplex().
+                    my $savout = select($OUT);
+
+                    # Have dumplex dump the lexicals.
+                    dumpvar::dumplex( $_, $h->{$_},
+                        defined $option{dumpDepth} ? $option{dumpDepth} : -1,
+                        @vars )
+                      for sort keys %$h;
+                    select($savout);
+                    next CMD;
+                };
+
+=head3 COMMANDS NOT WORKING AFTER PROGRAM ENDS
+
+All of the commands below this point don't work after the program being
+debugged has ended. All of them check to see if the program has ended; this
+allows the commands to be relocated without worrying about a 'line of
+demarcation' above which commands can be entered anytime, and below which
+they can't.
+
+=head4 C<n> - single step, but don't trace down into subs
+
+Done by setting C<$single> to 2, which forces subs to execute straight through
+when entered (see C<DB::sub>). We also save the C<n> command in C<$laststep>,
+so a null command knows what to re-execute. 
+
+=cut
+
+                # n - next
+                $cmd =~ /^n$/ && do {
+                    end_report(), next CMD if $finished and $level <= 1;
+
+                    # Single step, but don't enter subs.
+                    $single = 2;
+
+                    # Save for empty command (repeat last).
+                    $laststep = $cmd;
+                    last CMD;
+                };
+
+=head4 C<s> - single-step, entering subs
+
+Sets C<$single> to 1, which causes C<DB::sub> to continue tracing inside     
+subs. Also saves C<s> as C<$lastcmd>.
+
+=cut
+
+                # s - single step.
+                $cmd =~ /^s$/ && do {
+
+                    # Get out and restart the command loop if program
+                    # has finished.
+                    end_report(), next CMD if $finished and $level <= 1;
+
+                    # Single step should enter subs.
+                    $single = 1;
+
+                    # Save for empty command (repeat last).
+                    $laststep = $cmd;
+                    last CMD;
+                };
+
+=head4 C<c> - run continuously, setting an optional breakpoint
+
+Most of the code for this command is taken up with locating the optional
+breakpoint, which is either a subroutine name or a line number. We set
+the appropriate one-time-break in C<@dbline> and then turn off single-stepping
+in this and all call levels above this one.
+
+=cut
+
+                # c - start continuous execution.
+                $cmd =~ /^c\b\s*([\w:]*)\s*$/ && do {
+
+                    # Hey, show's over. The debugged program finished
+                    # executing already.
+                    end_report(), next CMD if $finished and $level <= 1;
+
+                    # Capture the place to put a one-time break.
+                    $subname = $i = $1;
+
+                    #  Probably not needed, since we finish an interactive
+                    #  sub-session anyway...
+                    # local $filename = $filename;
+                    # local *dbline = *dbline; # XXX Would this work?!
+                    #
+                    # The above question wonders if localizing the alias
+                    # to the magic array works or not. Since it's commented
+                    # out, we'll just leave that to speculation for now.
+
+                    # If the "subname" isn't all digits, we'll assume it
+                    # is a subroutine name, and try to find it.
+                    if ( $subname =~ /\D/ ) {    # subroutine name
+                            # Qualify it to the current package unless it's
+                            # already qualified.
+                        $subname = $package . "::" . $subname
+                          unless $subname =~ /::/;
+
+                        # find_sub will return "file:line_number" corresponding
+                        # to where the subroutine is defined; we call find_sub,
+                        # break up the return value, and assign it in one
+                        # operation.
+                        ( $file, $i ) = ( find_sub($subname) =~ /^(.*):(.*)$/ );
+
+                        # Force the line number to be numeric.
+                        $i += 0;
+
+                        # If we got a line number, we found the sub.
+                        if ($i) {
+
+                            # Switch all the debugger's internals around so
+                            # we're actually working with that file.
+                            $filename = $file;
+                            *dbline   = $main::{ '_<' . $filename };
+
+                            # Mark that there's a breakpoint in this file.
+                            $had_breakpoints{$filename} |= 1;
+
+                            # Scan forward to the first executable line
+                            # after the 'sub whatever' line.
+                            $max = $#dbline;
+                            ++$i while $dbline[$i] == 0 && $i < $max;
+                        } ## end if ($i)
+
+                        # We didn't find a sub by that name.
+                        else {
+                            print $OUT "Subroutine $subname not found.\n";
+                            next CMD;
+                        }
+                    } ## end if ($subname =~ /\D/)
+
+                    # At this point, either the subname was all digits (an
+                    # absolute line-break request) or we've scanned through
+                    # the code following the definition of the sub, looking
+                    # for an executable, which we may or may not have found.
+                    #
+                    # If $i (which we set $subname from) is non-zero, we
+                    # got a request to break at some line somewhere. On
+                    # one hand, if there wasn't any real subroutine name
+                    # involved, this will be a request to break in the current
+                    # file at the specified line, so we have to check to make
+                    # sure that the line specified really is breakable.
+                    #
+                    # On the other hand, if there was a subname supplied, the
+                    # preceding block has moved us to the proper file and
+                    # location within that file, and then scanned forward
+                    # looking for the next executable line. We have to make
+                    # sure that one was found.
+                    #
+                    # On the gripping hand, we can't do anything unless the
+                    # current value of $i points to a valid breakable line.
+                    # Check that.
+                    if ($i) {
+
+                        # Breakable?
+                        if ( $dbline[$i] == 0 ) {
+                            print $OUT "Line $i not breakable.\n";
+                            next CMD;
+                        }
+
+                        # Yes. Set up the one-time-break sigil.
+                        $dbline{$i} =~ s/($|\0)/;9$1/;  # add one-time-only b.p.
+                    } ## end if ($i)
+
+                    # Turn off stack tracing from here up.
+                    for ( $i = 0 ; $i <= $stack_depth ; ) {
+                        $stack[ $i++ ] &= ~1;
+                    }
+                    last CMD;
+                };
+
+=head4 C<r> - return from a subroutine
+
+For C<r> to work properly, the debugger has to stop execution again
+immediately after the return is executed. This is done by forcing
+single-stepping to be on in the call level above the current one. If
+we are printing return values when a C<r> is executed, set C<$doret>
+appropriately, and force us out of the command loop.
+
+=cut
+
+                # r - return from the current subroutine.
+                $cmd =~ /^r$/ && do {
+
+                    # Can't do anythign if the program's over.
+                    end_report(), next CMD if $finished and $level <= 1;
+
+                    # Turn on stack trace.
+                    $stack[$stack_depth] |= 1;
+
+                    # Print return value unless the stack is empty.
+                    $doret = $option{PrintRet} ? $stack_depth - 1 : -2;
+                    last CMD;
+                };
+
+=head4 C<T> - stack trace
+
+Just calls C<DB::print_trace>.
+
+=cut
+
+                $cmd =~ /^T$/ && do {
+                    print_trace( $OUT, 1 );    # skip DB
+                    next CMD;
+                };
+
+=head4 C<w> - List window around current line.
+
+Just calls C<DB::cmd_w>.
+
+=cut
+
+                $cmd =~ /^w\b\s*(.*)/s && do { &cmd_w( 'w', $1 ); next CMD; };
+
+=head4 C<W> - watch-expression processing.
+
+Just calls C<DB::cmd_W>. 
+
+=cut
+
+                $cmd =~ /^W\b\s*(.*)/s && do { &cmd_W( 'W', $1 ); next CMD; };
+
+=head4 C</> - search forward for a string in the source
+
+We take the argument and treat it as a pattern. If it turns out to be a 
+bad one, we return the error we got from trying to C<eval> it and exit.
+If not, we create some code to do the search and C<eval> it so it can't 
+mess us up.
+
+=cut
+
+                $cmd =~ /^\/(.*)$/ && do {
+
+                    # The pattern as a string.
+                    $inpat = $1;
+
+                    # Remove the final slash.
+                    $inpat =~ s:([^\\])/$:$1:;
+
+                    # If the pattern isn't null ...
+                    if ( $inpat ne "" ) {
+
+                        # Turn of warn and die procesing for a bit.
+                        local $SIG{__DIE__};
+                        local $SIG{__WARN__};
+
+                        # Create the pattern.
+                        eval '$inpat =~ m' . "\a$inpat\a";
+                        if ( $@ ne "" ) {
+
+                            # Oops. Bad pattern. No biscuit.
+                            # Print the eval error and go back for more
+                            # commands.
+                            print $OUT "$@";
+                            next CMD;
+                        }
+                        $pat = $inpat;
+                    } ## end if ($inpat ne "")
+
+                    # Set up to stop on wrap-around.
+                    $end = $start;
+
+                    # Don't move off the current line.
+                    $incr = -1;
+
+                    # Done in eval so nothing breaks if the pattern
+                    # does something weird.
+                    eval '
+                        for (;;) {
+                            # Move ahead one line.
+                            ++$start;
+
+                            # Wrap if we pass the last line.
+                            $start = 1 if ($start > $max);
+
+                            # Stop if we have gotten back to this line again,
+                            last if ($start == $end);
+
+                            # A hit! (Note, though, that we are doing
+                            # case-insensitive matching. Maybe a qr//
+                            # expression would be better, so the user could
+                            # do case-sensitive matching if desired.
+                            if ($dbline[$start] =~ m' . "\a$pat\a" . 'i) {
+                                if ($slave_editor) {
+                                    # Handle proper escaping in the slave.
+                                    print $OUT "\032\032$filename:$start:0\n";
+                                } 
+                                else {
+                                    # Just print the line normally.
+                                    print $OUT "$start:\t",$dbline[$start],"\n";
+                                }
+                                # And quit since we found something.
+                                last;
+                            }
+                         } ';
+
+                    # If we wrapped, there never was a match.
+                    print $OUT "/$pat/: not found\n" if ( $start == $end );
+                    next CMD;
+                };
+
+=head4 C<?> - search backward for a string in the source
+
+Same as for C</>, except the loop runs backwards.
+
+=cut
+
+                # ? - backward pattern search.
+                $cmd =~ /^\?(.*)$/ && do {
+
+                    # Get the pattern, remove trailing question mark.
+                    $inpat = $1;
+                    $inpat =~ s:([^\\])\?$:$1:;
+
+                    # If we've got one ...
+                    if ( $inpat ne "" ) {
+
+                        # Turn off die & warn handlers.
+                        local $SIG{__DIE__};
+                        local $SIG{__WARN__};
+                        eval '$inpat =~ m' . "\a$inpat\a";
+
+                        if ( $@ ne "" ) {
+
+                            # Ouch. Not good. Print the error.
+                            print $OUT $@;
+                            next CMD;
+                        }
+                        $pat = $inpat;
+                    } ## end if ($inpat ne "")
+
+                    # Where we are now is where to stop after wraparound.
+                    $end = $start;
+
+                    # Don't move away from this line.
+                    $incr = -1;
+
+                    # Search inside the eval to prevent pattern badness
+                    # from killing us.
+                    eval '
+                        for (;;) {
+                            # Back up a line.
+                            --$start;
+
+                            # Wrap if we pass the first line.
+
+                            $start = $max if ($start <= 0);
+
+                            # Quit if we get back where we started,
+                            last if ($start == $end);
+
+                            # Match?
+                            if ($dbline[$start] =~ m' . "\a$pat\a" . 'i) {
+                                if ($slave_editor) {
+                                    # Yep, follow slave editor requirements.
+                                    print $OUT "\032\032$filename:$start:0\n";
+                                } 
+                                else {
+                                    # Yep, just print normally.
+                                    print $OUT "$start:\t",$dbline[$start],"\n";
+                                }
+
+                                # Found, so done.
+                                last;
+                            }
+                        } ';
+
+                    # Say we failed if the loop never found anything,
+                    print $OUT "?$pat?: not found\n" if ( $start == $end );
+                    next CMD;
+                };
+
+=head4 C<$rc> - Recall command
+
+Manages the commands in C<@hist> (which is created if C<Term::ReadLine> reports
+that the terminal supports history). It find the the command required, puts it
+into C<$cmd>, and redoes the loop to execute it.
+
+=cut
+
+                # $rc - recall command.
+                $cmd =~ /^$rc+\s*(-)?(\d+)?$/ && do {
+
+                    # No arguments, take one thing off history.
+                    pop(@hist) if length($cmd) > 1;
+
+                    # Relative (- found)?
+                    #  Y - index back from most recent (by 1 if bare minus)
+                    #  N - go to that particular command slot or the last
+                    #      thing if nothing following.
+                    $i = $1 ? ( $#hist - ( $2 || 1 ) ) : ( $2 || $#hist );
+
+                    # Pick out the command desired.
+                    $cmd = $hist[$i];
+
+                    # Print the command to be executed and restart the loop
+                    # with that command in the buffer.
+                    print $OUT $cmd, "\n";
+                    redo CMD;
+                };
+
+=head4 C<$sh$sh> - C<system()> command
+
+Calls the C<DB::system()> to handle the command. This keeps the C<STDIN> and
+C<STDOUT> from getting messed up.
+
+=cut
+
+                # $sh$sh - run a shell command (if it's all ASCII).
+                # Can't run shell commands with Unicode in the debugger, hmm.
+                $cmd =~ /^$sh$sh\s*([\x00-\xff]*)/ && do {
+
+                    # System it.
+                    &system($1);
+                    next CMD;
+                };
+
+=head4 C<$rc I<pattern> $rc> - Search command history
+
+Another command to manipulate C<@hist>: this one searches it with a pattern.
+If a command is found, it is placed in C<$cmd> and executed via C<redo>.
+
+=cut
+
+                # $rc pattern $rc - find a command in the history.
+                $cmd =~ /^$rc([^$rc].*)$/ && do {
+
+                    # Create the pattern to use.
+                    $pat = "^$1";
+
+                    # Toss off last entry if length is >1 (and it always is).
+                    pop(@hist) if length($cmd) > 1;
+
+                    # Look backward through the history.
+                    for ( $i = $#hist ; $i ; --$i ) {
+
+                        # Stop if we find it.
+                        last if $hist[$i] =~ /$pat/;
+                    }
+
+                    if ( !$i ) {
+
+                        # Never found it.
+                        print $OUT "No such command!\n\n";
+                        next CMD;
+                    }
+
+                    # Found it. Put it in the buffer, print it, and process it.
+                    $cmd = $hist[$i];
+                    print $OUT $cmd, "\n";
+                    redo CMD;
+                };
+
+=head4 C<$sh> - Invoke a shell     
+
+Uses C<DB::system> to invoke a shell.
+
+=cut
+
+                # $sh - start a shell.
+                $cmd =~ /^$sh$/ && do {
+
+                    # Run the user's shell. If none defined, run Bourne.
+                    # We resume execution when the shell terminates.
+                    &system( $ENV{SHELL} || "/bin/sh" );
+                    next CMD;
+                };
+
+=head4 C<$sh I<command>> - Force execution of a command in a shell
+
+Like the above, but the command is passed to the shell. Again, we use
+C<DB::system> to avoid problems with C<STDIN> and C<STDOUT>.
+
+=cut
+
+                # $sh command - start a shell and run a command in it.
+                $cmd =~ /^$sh\s*([\x00-\xff]*)/ && do {
+
+                    # XXX: using csh or tcsh destroys sigint retvals!
+                    #&system($1);  # use this instead
+
+                    # use the user's shell, or Bourne if none defined.
+                    &system( $ENV{SHELL} || "/bin/sh", "-c", $1 );
+                    next CMD;
+                };
+
+=head4 C<H> - display commands in history
+
+Prints the contents of C<@hist> (if any).
+
+=cut
+
+                $cmd =~ /^H\b\s*\*/ && do {
+                    @hist = @truehist = ();
+                    print $OUT "History cleansed\n";
+                    next CMD;
+                };
+
+                $cmd =~ /^H\b\s*(-(\d+))?/ && do {
+
+                    # Anything other than negative numbers is ignored by
+                    # the (incorrect) pattern, so this test does nothing.
+                    $end = $2 ? ( $#hist - $2 ) : 0;
+
+                    # Set to the minimum if less than zero.
+                    $hist = 0 if $hist < 0;
+
+                    # Start at the end of the array.
+                    # Stay in while we're still above the ending value.
+                    # Tick back by one each time around the loop.
+                    for ( $i = $#hist ; $i > $end ; $i-- ) {
+
+                        # Print the command  unless it has no arguments.
+                        print $OUT "$i: ", $hist[$i], "\n"
+                          unless $hist[$i] =~ /^.?$/;
+                    }
+                    next CMD;
+                };
+
+=head4 C<man, doc, perldoc> - look up documentation
+
+Just calls C<runman()> to print the appropriate document.
+
+=cut
+
+                # man, perldoc, doc - show manual pages.
+                $cmd =~ /^(?:man|(?:perl)?doc)\b(?:\s+([^(]*))?$/ && do {
+                    runman($1);
+                    next CMD;
+                };
+
+=head4 C<p> - print
+
+Builds a C<print EXPR> expression in the C<$cmd>; this will get executed at
+the bottom of the loop.
+
+=cut
+
+                # p - print (no args): print $_.
+                $cmd =~ s/^p$/print {\$DB::OUT} \$_/;
+
+                # p - print the given expression.
+                $cmd =~ s/^p\b/print {\$DB::OUT} /;
+
+=head4 C<=> - define command alias
+
+Manipulates C<%alias> to add or list command aliases.
+
+=cut
+
+                # = - set up a command alias.
+                $cmd =~ s/^=\s*// && do {
+                    my @keys;
+                    if ( length $cmd == 0 ) {
+
+                        # No args, get current aliases.
+                        @keys = sort keys %alias;
+                    }
+                    elsif ( my ( $k, $v ) = ( $cmd =~ /^(\S+)\s+(\S.*)/ ) ) {
+
+                        # Creating a new alias. $k is alias name, $v is
+                        # alias value.
+
+                        # can't use $_ or kill //g state
+                        for my $x ( $k, $v ) {
+
+                            # Escape "alarm" characters.
+                            $x =~ s/\a/\\a/g;
+                        }
+
+                        # Substitute key for value, using alarm chars
+                        # as separators (which is why we escaped them in
+                        # the command).
+                        $alias{$k} = "s\a$k\a$v\a";
+
+                        # Turn off standard warn and die behavior.
+                        local $SIG{__DIE__};
+                        local $SIG{__WARN__};
+
+                        # Is it valid Perl?
+                        unless ( eval "sub { s\a$k\a$v\a }; 1" ) {
+
+                            # Nope. Bad alias. Say so and get out.
+                            print $OUT "Can't alias $k to $v: $@\n";
+                            delete $alias{$k};
+                            next CMD;
+                        }
+
+                        # We'll only list the new one.
+                        @keys = ($k);
+                    } ## end elsif (my ($k, $v) = ($cmd...
+
+                    # The argument is the alias to list.
+                    else {
+                        @keys = ($cmd);
+                    }
+
+                    # List aliases.
+                    for my $k (@keys) {
+
+                        # Messy metaquoting: Trim the substiution code off.
+                        # We use control-G as the delimiter because it's not
+                        # likely to appear in the alias.
+                        if ( ( my $v = $alias{$k} ) =~ ss\a$k\a(.*)\a$1 ) {
+
+                            # Print the alias.
+                            print $OUT "$k\t= $1\n";
+                        }
+                        elsif ( defined $alias{$k} ) {
+
+                            # Couldn't trim it off; just print the alias code.
+                            print $OUT "$k\t$alias{$k}\n";
+                        }
+                        else {
+
+                            # No such, dude.
+                            print "No alias for $k\n";
+                        }
+                    } ## end for my $k (@keys)
+                    next CMD;
+                };
+
+=head4 C<source> - read commands from a file.
+
+Opens a lexical filehandle and stacks it on C<@cmdfhs>; C<DB::readline> will
+pick it up.
+
+=cut
+
+                # source - read commands from a file (or pipe!) and execute.
+                $cmd =~ /^source\s+(.*\S)/ && do {
+                    if ( open my $fh, $1 ) {
+
+                        # Opened OK; stick it in the list of file handles.
+                        push @cmdfhs, $fh;
+                    }
+                    else {
+
+                        # Couldn't open it.
+                        &warn("Can't execute `$1': $!\n");
+                    }
+                    next CMD;
+                };
+
+=head4 C<save> - send current history to a file
+
+Takes the complete history, (not the shrunken version you see with C<H>),
+and saves it to the given filename, so it can be replayed using C<source>.
+
+Note that all C<^(save|source)>'s are commented out with a view to minimise recursion.
+
+=cut
+
+                # save source - write commands to a file for later use
+                $cmd =~ /^save\s*(.*)$/ && do {
+                    my $file = $1 || '.perl5dbrc';    # default?
+                    if ( open my $fh, "> $file" ) {
+
+                       # chomp to remove extraneous newlines from source'd files
+                        chomp( my @truelist =
+                              map { m/^\s*(save|source)/ ? "#$_" : $_ }
+                              @truehist );
+                        print $fh join( "\n", @truelist );
+                        print "commands saved in $file\n";
+                    }
+                    else {
+                        &warn("Can't save debugger commands in '$1': $!\n");
+                    }
+                    next CMD;
+                };
+
+=head4 C<R> - restart
+
+Restart the debugger session. 
+
+=head4 C<rerun> - rerun the current session
+
+Return to any given position in the B<true>-history list
+
+=cut
+
+                # R - restart execution.
+                # rerun - controlled restart execution.
+                $cmd =~ /^(R|rerun\s*(.*))$/ && do {
+                    my @args = ($1 eq 'R' ? restart() : rerun($2));
+
+                    # Close all non-system fds for a clean restart.  A more
+                    # correct method would be to close all fds that were not
+                    # open when the process started, but this seems to be
+                    # hard.  See "debugger 'R'estart and open database
+                    # connections" on p5p.
+
+                    my $max_fd = 1024; # default if POSIX can't be loaded
+                    if (eval { require POSIX }) {
+                        $max_fd = POSIX::sysconf(POSIX::_SC_OPEN_MAX());
+                    }
+
+                    if (defined $max_fd) {
+                        foreach ($^F+1 .. $max_fd-1) {
+                            next unless open FD_TO_CLOSE, "<&=$_";
+                            close(FD_TO_CLOSE);
+                        }
+                    }
+
+                    # And run Perl again.  We use exec() to keep the
+                    # PID stable (and that way $ini_pids is still valid).
+                    exec(@args) || print $OUT "exec failed: $!\n";
+
+                    last CMD;
+                };
+
+=head4 C<|, ||> - pipe output through the pager.
+
+For C<|>, we save C<OUT> (the debugger's output filehandle) and C<STDOUT>
+(the program's standard output). For C<||>, we only save C<OUT>. We open a
+pipe to the pager (restoring the output filehandles if this fails). If this
+is the C<|> command, we also set up a C<SIGPIPE> handler which will simply 
+set C<$signal>, sending us back into the debugger.
+
+We then trim off the pipe symbols and C<redo> the command loop at the
+C<PIPE> label, causing us to evaluate the command in C<$cmd> without
+reading another.
+
+=cut
+
+                # || - run command in the pager, with output to DB::OUT.
+                $cmd =~ /^\|\|?\s*[^|]/ && do {
+                    if ( $pager =~ /^\|/ ) {
+
+                        # Default pager is into a pipe. Redirect I/O.
+                        open( SAVEOUT, ">&STDOUT" )
+                          || &warn("Can't save STDOUT");
+                        open( STDOUT, ">&OUT" )
+                          || &warn("Can't redirect STDOUT");
+                    } ## end if ($pager =~ /^\|/)
+                    else {
+
+                        # Not into a pipe. STDOUT is safe.
+                        open( SAVEOUT, ">&OUT" ) || &warn("Can't save DB::OUT");
+                    }
+
+                    # Fix up environment to record we have less if so.
+                    fix_less();
+
+                    unless ( $piped = open( OUT, $pager ) ) {
+
+                        # Couldn't open pipe to pager.
+                        &warn("Can't pipe output to `$pager'");
+                        if ( $pager =~ /^\|/ ) {
+
+                            # Redirect I/O back again.
+                            open( OUT, ">&STDOUT" )    # XXX: lost message
+                              || &warn("Can't restore DB::OUT");
+                            open( STDOUT, ">&SAVEOUT" )
+                              || &warn("Can't restore STDOUT");
+                            close(SAVEOUT);
+                        } ## end if ($pager =~ /^\|/)
+                        else {
+
+                            # Redirect I/O. STDOUT already safe.
+                            open( OUT, ">&STDOUT" )    # XXX: lost message
+                              || &warn("Can't restore DB::OUT");
+                        }
+                        next CMD;
+                    } ## end unless ($piped = open(OUT,...
+
+                    # Set up broken-pipe handler if necessary.
+                    $SIG{PIPE} = \&DB::catch
+                      if $pager =~ /^\|/
+                      && ( "" eq $SIG{PIPE} || "DEFAULT" eq $SIG{PIPE} );
+
+                    # Save current filehandle, unbuffer out, and put it back.
+                    $selected = select(OUT);
+                    $|        = 1;
+
+                    # Don't put it back if pager was a pipe.
+                    select($selected), $selected = "" unless $cmd =~ /^\|\|/;
+
+                    # Trim off the pipe symbols and run the command now.
+                    $cmd =~ s/^\|+\s*//;
+                    redo PIPE;
+                };
+
+=head3 END OF COMMAND PARSING
+
+Anything left in C<$cmd> at this point is a Perl expression that we want to 
+evaluate. We'll always evaluate in the user's context, and fully qualify 
+any variables we might want to address in the C<DB> package.
+
+=cut
+
+                # t - turn trace on.
+                $cmd =~ s/^t\s/\$DB::trace |= 1;\n/;
+
+                # s - single-step. Remember the last command was 's'.
+                $cmd =~ s/^s\s/\$DB::single = 1;\n/ && do { $laststep = 's' };
+
+                # n - single-step, but not into subs. Remember last command
+                # was 'n'.
+                $cmd =~ s/^n\s/\$DB::single = 2;\n/ && do { $laststep = 'n' };
+
+            }    # PIPE:
+
+            # Make sure the flag that says "the debugger's running" is
+            # still on, to make sure we get control again.
+            $evalarg = "\$^D = \$^D | \$DB::db_stop;\n$cmd";
+
+            # Run *our* eval that executes in the caller's context.
+            &eval;
+
+            # Turn off the one-time-dump stuff now.
+            if ($onetimeDump) {
+                $onetimeDump      = undef;
+                $onetimedumpDepth = undef;
+            }
+            elsif ( $term_pid == $$ ) {
+                STDOUT->flush();
+                STDERR->flush();
+
+                # XXX If this is the master pid, print a newline.
+                print $OUT "\n";
+            }
+        } ## end while (($term || &setterm...
+
+=head3 POST-COMMAND PROCESSING
+
+After each command, we check to see if the command output was piped anywhere.
+If so, we go through the necessary code to unhook the pipe and go back to
+our standard filehandles for input and output.
+
+=cut
+
+        continue {    # CMD:
+
+            # At the end of every command:
+            if ($piped) {
+
+                # Unhook the pipe mechanism now.
+                if ( $pager =~ /^\|/ ) {
+
+                    # No error from the child.
+                    $? = 0;
+
+                    # we cannot warn here: the handle is missing --tchrist
+                    close(OUT) || print SAVEOUT "\nCan't close DB::OUT\n";
+
+                    # most of the $? crud was coping with broken cshisms
+                    # $? is explicitly set to 0, so this never runs.
+                    if ($?) {
+                        print SAVEOUT "Pager `$pager' failed: ";
+                        if ( $? == -1 ) {
+                            print SAVEOUT "shell returned -1\n";
+                        }
+                        elsif ( $? >> 8 ) {
+                            print SAVEOUT ( $? & 127 )
+                              ? " (SIG#" . ( $? & 127 ) . ")"
+                              : "", ( $? & 128 ) ? " -- core dumped" : "", "\n";
+                        }
+                        else {
+                            print SAVEOUT "status ", ( $? >> 8 ), "\n";
+                        }
+                    } ## end if ($?)
+
+                    # Reopen filehandle for our output (if we can) and
+                    # restore STDOUT (if we can).
+                    open( OUT, ">&STDOUT" ) || &warn("Can't restore DB::OUT");
+                    open( STDOUT, ">&SAVEOUT" )
+                      || &warn("Can't restore STDOUT");
+
+                    # Turn off pipe exception handler if necessary.
+                    $SIG{PIPE} = "DEFAULT" if $SIG{PIPE} eq \&DB::catch;
+
+                    # Will stop ignoring SIGPIPE if done like nohup(1)
+                    # does SIGINT but Perl doesn't give us a choice.
+                } ## end if ($pager =~ /^\|/)
+                else {
+
+                    # Non-piped "pager". Just restore STDOUT.
+                    open( OUT, ">&SAVEOUT" ) || &warn("Can't restore DB::OUT");
+                }
+
+                # Close filehandle pager was using, restore the normal one
+                # if necessary,
+                close(SAVEOUT);
+                select($selected), $selected = "" unless $selected eq "";
+
+                # No pipes now.
+                $piped = "";
+            } ## end if ($piped)
+        }    # CMD:
+
+=head3 COMMAND LOOP TERMINATION
+
+When commands have finished executing, we come here. If the user closed the
+input filehandle, we turn on C<$fall_off_end> to emulate a C<q> command. We
+evaluate any post-prompt items. We restore C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>,
+C<$\>, and C<$^W>, and return a null list as expected by the Perl interpreter.
+The interpreter will then execute the next line and then return control to us
+again.
+
+=cut
+
+        # No more commands? Quit.
+        $fall_off_end = 1 unless defined $cmd;    # Emulate `q' on EOF
+
+        # Evaluate post-prompt commands.
+        foreach $evalarg (@$post) {
+            &eval;
+        }
+    }    # if ($single || $signal)
+
+    # Put the user's globals back where you found them.
+    ( $@, $!, $^E, $,, $/, $\, $^W ) = @saved;
+    ();
+} ## end sub DB
+
+# The following code may be executed now:
+# BEGIN {warn 4}
+
+=head2 sub
+
+C<sub> is called whenever a subroutine call happens in the program being 
+debugged. The variable C<$DB::sub> contains the name of the subroutine
+being called.
+
+The core function of this subroutine is to actually call the sub in the proper
+context, capturing its output. This of course causes C<DB::DB> to get called
+again, repeating until the subroutine ends and returns control to C<DB::sub>
+again. Once control returns, C<DB::sub> figures out whether or not to dump the
+return value, and returns its captured copy of the return value as its own
+return value. The value then feeds back into the program being debugged as if
+C<DB::sub> hadn't been there at all.
+
+C<sub> does all the work of printing the subroutine entry and exit messages
+enabled by setting C<$frame>. It notes what sub the autoloader got called for,
+and also prints the return value if needed (for the C<r> command and if 
+the 16 bit is set in C<$frame>).
+
+It also tracks the subroutine call depth by saving the current setting of
+C<$single> in the C<@stack> package global; if this exceeds the value in
+C<$deep>, C<sub> automatically turns on printing of the current depth by
+setting the C<4> bit in C<$single>. In any case, it keeps the current setting
+of stop/don't stop on entry to subs set as it currently is set.
+
+=head3 C<caller()> support
+
+If C<caller()> is called from the package C<DB>, it provides some
+additional data, in the following order:
+
+=over 4
+
+=item * C<$package>
+
+The package name the sub was in
+
+=item * C<$filename>
+
+The filename it was defined in
+
+=item * C<$line>
+
+The line number it was defined on
+
+=item * C<$subroutine>
+
+The subroutine name; C<(eval)> if an C<eval>().
+
+=item * C<$hasargs>
+
+1 if it has arguments, 0 if not
+
+=item * C<$wantarray>
+
+1 if array context, 0 if scalar context
+
+=item * C<$evaltext>
+
+The C<eval>() text, if any (undefined for C<eval BLOCK>)
+
+=item * C<$is_require>
+
+frame was created by a C<use> or C<require> statement
+
+=item * C<$hints>
+
+pragma information; subject to change between versions
+
+=item * C<$bitmask>
+
+pragma information; subject to change between versions
+
+=item * C<@DB::args>
+
+arguments with which the subroutine was invoked
+
+=back
+
+=cut
+
+sub sub {
+
+	# lock ourselves under threads
+	lock($DBGR);
+
+    # Whether or not the autoloader was running, a scalar to put the
+    # sub's return value in (if needed), and an array to put the sub's
+    # return value in (if needed).
+    my ( $al, $ret, @ret ) = "";
+	if ($sub =~ /^threads::new$/ && $ENV{PERL5DB_THREADED}) {
+		print "creating new thread\n"; 
+	}
+
+    # If the last ten characters are C'::AUTOLOAD', note we've traced
+    # into AUTOLOAD for $sub.
+    if ( length($sub) > 10 && substr( $sub, -10, 10 ) eq '::AUTOLOAD' ) {
+        $al = " for $$sub";
+    }
+
+    # We stack the stack pointer and then increment it to protect us
+    # from a situation that might unwind a whole bunch of call frames
+    # at once. Localizing the stack pointer means that it will automatically
+    # unwind the same amount when multiple stack frames are unwound.
+    local $stack_depth = $stack_depth + 1;    # Protect from non-local exits
+
+    # Expand @stack.
+    $#stack = $stack_depth;
+
+    # Save current single-step setting.
+    $stack[-1] = $single;
+
+    # Turn off all flags except single-stepping.
+    $single &= 1;
+
+    # If we've gotten really deeply recursed, turn on the flag that will
+    # make us stop with the 'deep recursion' message.
+    $single |= 4 if $stack_depth == $deep;
+
+    # If frame messages are on ...
+    (
+        $frame & 4    # Extended frame entry message
+        ? (
+            print_lineinfo( ' ' x ( $stack_depth - 1 ), "in  " ),
+
+            # Why -1? But it works! :-(
+            # Because print_trace will call add 1 to it and then call
+            # dump_trace; this results in our skipping -1+1 = 0 stack frames
+            # in dump_trace.
+            print_trace( $LINEINFO, -1, 1, 1, "$sub$al" )
+          )
+        : print_lineinfo( ' ' x ( $stack_depth - 1 ), "entering $sub$al\n" )
+
+          # standard frame entry message
+      )
+      if $frame;
+
+    # Determine the sub's return type,and capture approppriately.
+    if (wantarray) {
+
+        # Called in array context. call sub and capture output.
+        # DB::DB will recursively get control again if appropriate; we'll come
+        # back here when the sub is finished.
+        if ($assertion) {
+            $assertion = 0;
+            eval { @ret = &$sub; };
+            if ($@) {
+                print $OUT $@;
+                $signal = 1 unless $warnassertions;
+            }
+        }
+        else {
+            @ret = &$sub;
+        }
+
+        # Pop the single-step value back off the stack.
+        $single |= $stack[ $stack_depth-- ];
+
+        # Check for exit trace messages...
+        (
+            $frame & 4    # Extended exit message
+            ? (
+                print_lineinfo( ' ' x $stack_depth, "out " ),
+                print_trace( $LINEINFO, -1, 1, 1, "$sub$al" )
+              )
+            : print_lineinfo( ' ' x $stack_depth, "exited $sub$al\n" )
+
+              # Standard exit message
+          )
+          if $frame & 2;
+
+        # Print the return info if we need to.
+        if ( $doret eq $stack_depth or $frame & 16 ) {
+
+            # Turn off output record separator.
+            local $\ = '';
+            my $fh = ( $doret eq $stack_depth ? $OUT : $LINEINFO );
+
+            # Indent if we're printing because of $frame tracing.
+            print $fh ' ' x $stack_depth if $frame & 16;
+
+            # Print the return value.
+            print $fh "list context return from $sub:\n";
+            dumpit( $fh, \@ret );
+
+            # And don't print it again.
+            $doret = -2;
+        } ## end if ($doret eq $stack_depth...
+            # And we have to return the return value now.
+        @ret;
+    } ## end if (wantarray)
+
+    # Scalar context.
+    else {
+        if ($assertion) {
+            $assertion = 0;
+            eval {
+
+                # Save the value if it's wanted at all.
+                $ret = &$sub;
+            };
+            if ($@) {
+                print $OUT $@;
+                $signal = 1 unless $warnassertions;
+            }
+            $ret = undef unless defined wantarray;
+        }
+        else {
+            if ( defined wantarray ) {
+
+                # Save the value if it's wanted at all.
+                $ret = &$sub;
+            }
+            else {
+
+                # Void return, explicitly.
+                &$sub;
+                undef $ret;
+            }
+        }    # if assertion
+
+        # Pop the single-step value off the stack.
+        $single |= $stack[ $stack_depth-- ];
+
+        # If we're doing exit messages...
+        (
+            $frame & 4    # Extended messsages
+            ? (
+                print_lineinfo( ' ' x $stack_depth, "out " ),
+                print_trace( $LINEINFO, -1, 1, 1, "$sub$al" )
+              )
+            : print_lineinfo( ' ' x $stack_depth, "exited $sub$al\n" )
+
+              # Standard messages
+          )
+          if $frame & 2;
+
+        # If we are supposed to show the return value... same as before.
+        if ( $doret eq $stack_depth or $frame & 16 and defined wantarray ) {
+            local $\ = '';
+            my $fh = ( $doret eq $stack_depth ? $OUT : $LINEINFO );
+            print $fh ( ' ' x $stack_depth ) if $frame & 16;
+            print $fh (
+                defined wantarray
+                ? "scalar context return from $sub: "
+                : "void context return from $sub\n"
+            );
+            dumpit( $fh, $ret ) if defined wantarray;
+            $doret = -2;
+        } ## end if ($doret eq $stack_depth...
+
+        # Return the appropriate scalar value.
+        $ret;
+    } ## end else [ if (wantarray)
+} ## end sub sub
+
+=head1 EXTENDED COMMAND HANDLING AND THE COMMAND API
+
+In Perl 5.8.0, there was a major realignment of the commands and what they did,
+Most of the changes were to systematize the command structure and to eliminate
+commands that threw away user input without checking.
+
+The following sections describe the code added to make it easy to support 
+multiple command sets with conflicting command names. This section is a start 
+at unifying all command processing to make it simpler to develop commands.
+
+Note that all the cmd_[a-zA-Z] subroutines require the command name, a line 
+number, and C<$dbline> (the current line) as arguments.
+
+Support functions in this section which have multiple modes of failure C<die> 
+on error; the rest simply return a false value.
+
+The user-interface functions (all of the C<cmd_*> functions) just output
+error messages.
+
+=head2 C<%set>
+
+The C<%set> hash defines the mapping from command letter to subroutine
+name suffix. 
+
+C<%set> is a two-level hash, indexed by set name and then by command name.
+Note that trying to set the CommandSet to C<foobar> simply results in the
+5.8.0 command set being used, since there's no top-level entry for C<foobar>.
+
+=cut 
+
+### The API section
+
+my %set = (    #
+    'pre580' => {
+        'a' => 'pre580_a',
+        'A' => 'pre580_null',
+        'b' => 'pre580_b',
+        'B' => 'pre580_null',
+        'd' => 'pre580_null',
+        'D' => 'pre580_D',
+        'h' => 'pre580_h',
+        'M' => 'pre580_null',
+        'O' => 'o',
+        'o' => 'pre580_null',
+        'v' => 'M',
+        'w' => 'v',
+        'W' => 'pre580_W',
+    },
+    'pre590' => {
+        '<'  => 'pre590_prepost',
+        '<<' => 'pre590_prepost',
+        '>'  => 'pre590_prepost',
+        '>>' => 'pre590_prepost',
+        '{'  => 'pre590_prepost',
+        '{{' => 'pre590_prepost',
+    },
+);
+
+=head2 C<cmd_wrapper()> (API)
+
+C<cmd_wrapper()> allows the debugger to switch command sets 
+depending on the value of the C<CommandSet> option. 
+
+It tries to look up the command in the C<%set> package-level I<lexical>
+(which means external entities can't fiddle with it) and create the name of 
+the sub to call based on the value found in the hash (if it's there). I<All> 
+of the commands to be handled in a set have to be added to C<%set>; if they 
+aren't found, the 5.8.0 equivalent is called (if there is one).
+
+This code uses symbolic references. 
+
+=cut
+
+sub cmd_wrapper {
+    my $cmd      = shift;
+    my $line     = shift;
+    my $dblineno = shift;
+
+    # Assemble the command subroutine's name by looking up the
+    # command set and command name in %set. If we can't find it,
+    # default to the older version of the command.
+    my $call = 'cmd_'
+      . ( $set{$CommandSet}{$cmd}
+          || ( $cmd =~ /^[<>{]+/o ? 'prepost' : $cmd ) );
+
+    # Call the command subroutine, call it by name.
+    return &$call( $cmd, $line, $dblineno );
+} ## end sub cmd_wrapper
+
+=head3 C<cmd_a> (command)
+
+The C<a> command handles pre-execution actions. These are associated with a
+particular line, so they're stored in C<%dbline>. We default to the current 
+line if none is specified. 
+
+=cut
+
+sub cmd_a {
+    my $cmd    = shift;
+    my $line   = shift || '';    # [.|line] expr
+    my $dbline = shift;
+
+    # If it's dot (here), or not all digits,  use the current line.
+    $line =~ s/^(\.|(?:[^\d]))/$dbline/;
+
+    # Should be a line number followed by an expression.
+    if ( $line =~ /^\s*(\d*)\s*(\S.+)/ ) {
+        my ( $lineno, $expr ) = ( $1, $2 );
+
+        # If we have an expression ...
+        if ( length $expr ) {
+
+            # ... but the line isn't breakable, complain.
+            if ( $dbline[$lineno] == 0 ) {
+                print $OUT
+                  "Line $lineno($dbline[$lineno]) does not have an action?\n";
+            }
+            else {
+
+                # It's executable. Record that the line has an action.
+                $had_breakpoints{$filename} |= 2;
+
+                # Remove any action, temp breakpoint, etc.
+                $dbline{$lineno} =~ s/\0[^\0]*//;
+
+                # Add the action to the line.
+                $dbline{$lineno} .= "\0" . action($expr);
+            }
+        } ## end if (length $expr)
+    } ## end if ($line =~ /^\s*(\d*)\s*(\S.+)/)
+    else {
+
+        # Syntax wrong.
+        print $OUT
+          "Adding an action requires an optional lineno and an expression\n"
+          ;    # hint
+    }
+} ## end sub cmd_a
+
+=head3 C<cmd_A> (command)
+
+Delete actions. Similar to above, except the delete code is in a separate
+subroutine, C<delete_action>.
+
+=cut
+
+sub cmd_A {
+    my $cmd    = shift;
+    my $line   = shift || '';
+    my $dbline = shift;
+
+    # Dot is this line.
+    $line =~ s/^\./$dbline/;
+
+    # Call delete_action with a null param to delete them all.
+    # The '1' forces the eval to be true. It'll be false only
+    # if delete_action blows up for some reason, in which case
+    # we print $@ and get out.
+    if ( $line eq '*' ) {
+        eval { &delete_action(); 1 } or print $OUT $@ and return;
+    }
+
+    # There's a real line  number. Pass it to delete_action.
+    # Error trapping is as above.
+    elsif ( $line =~ /^(\S.*)/ ) {
+        eval { &delete_action($1); 1 } or print $OUT $@ and return;
+    }
+
+    # Swing and a miss. Bad syntax.
+    else {
+        print $OUT
+          "Deleting an action requires a line number, or '*' for all\n" ; # hint
+    }
+} ## end sub cmd_A
+
+=head3 C<delete_action> (API)
+
+C<delete_action> accepts either a line number or C<undef>. If a line number
+is specified, we check for the line being executable (if it's not, it 
+couldn't have had an  action). If it is, we just take the action off (this
+will get any kind of an action, including breakpoints).
+
+=cut
+
+sub delete_action {
+    my $i = shift;
+    if ( defined($i) ) {
+
+        # Can there be one?
+        die "Line $i has no action .\n" if $dbline[$i] == 0;
+
+        # Nuke whatever's there.
+        $dbline{$i} =~ s/\0[^\0]*//;    # \^a
+        delete $dbline{$i} if $dbline{$i} eq '';
+    }
+    else {
+        print $OUT "Deleting all actions...\n";
+        for my $file ( keys %had_breakpoints ) {
+            local *dbline = $main::{ '_<' . $file };
+            my $max = $#dbline;
+            my $was;
+            for ( $i = 1 ; $i <= $max ; $i++ ) {
+                if ( defined $dbline{$i} ) {
+                    $dbline{$i} =~ s/\0[^\0]*//;
+                    delete $dbline{$i} if $dbline{$i} eq '';
+                }
+                unless ( $had_breakpoints{$file} &= ~2 ) {
+                    delete $had_breakpoints{$file};
+                }
+            } ## end for ($i = 1 ; $i <= $max...
+        } ## end for my $file (keys %had_breakpoints)
+    } ## end else [ if (defined($i))
+} ## end sub delete_action
+
+=head3 C<cmd_b> (command)
+
+Set breakpoints. Since breakpoints can be set in so many places, in so many
+ways, conditionally or not, the breakpoint code is kind of complex. Mostly,
+we try to parse the command type, and then shuttle it off to an appropriate
+subroutine to actually do the work of setting the breakpoint in the right
+place.
+
+=cut
+
+sub cmd_b {
+    my $cmd    = shift;
+    my $line   = shift;    # [.|line] [cond]
+    my $dbline = shift;
+
+    # Make . the current line number if it's there..
+    $line =~ s/^\./$dbline/;
+
+    # No line number, no condition. Simple break on current line.
+    if ( $line =~ /^\s*$/ ) {
+        &cmd_b_line( $dbline, 1 );
+    }
+
+    # Break on load for a file.
+    elsif ( $line =~ /^load\b\s*(.*)/ ) {
+        my $file = $1;
+        $file =~ s/\s+$//;
+        &cmd_b_load($file);
+    }
+
+    # b compile|postpone <some sub> [<condition>]
+    # The interpreter actually traps this one for us; we just put the
+    # necessary condition in the %postponed hash.
+    elsif ( $line =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ ) {
+
+        # Capture the condition if there is one. Make it true if none.
+        my $cond = length $3 ? $3 : '1';
+
+        # Save the sub name and set $break to 1 if $1 was 'postpone', 0
+        # if it was 'compile'.
+        my ( $subname, $break ) = ( $2, $1 eq 'postpone' );
+
+        # De-Perl4-ify the name - ' separators to ::.
+        $subname =~ s/\'/::/g;
+
+        # Qualify it into the current package unless it's already qualified.
+        $subname = "${'package'}::" . $subname unless $subname =~ /::/;
+
+        # Add main if it starts with ::.
+        $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
+
+        # Save the break type for this sub.
+        $postponed{$subname} = $break ? "break +0 if $cond" : "compile";
+    } ## end elsif ($line =~ ...
+
+    # b <sub name> [<condition>]
+    elsif ( $line =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) {
+
+        #
+        $subname = $1;
+        $cond = length $2 ? $2 : '1';
+        &cmd_b_sub( $subname, $cond );
+    }
+
+    # b <line> [<condition>].
+    elsif ( $line =~ /^(\d*)\s*(.*)/ ) {
+
+        # Capture the line. If none, it's the current line.
+        $line = $1 || $dbline;
+
+        # If there's no condition, make it '1'.
+        $cond = length $2 ? $2 : '1';
+
+        # Break on line.
+        &cmd_b_line( $line, $cond );
+    }
+
+    # Line didn't make sense.
+    else {
+        print "confused by line($line)?\n";
+    }
+} ## end sub cmd_b
+
+=head3 C<break_on_load> (API)
+
+We want to break when this file is loaded. Mark this file in the
+C<%break_on_load> hash, and note that it has a breakpoint in 
+C<%had_breakpoints>.
+
+=cut
+
+sub break_on_load {
+    my $file = shift;
+    $break_on_load{$file} = 1;
+    $had_breakpoints{$file} |= 1;
+}
+
+=head3 C<report_break_on_load> (API)
+
+Gives us an array of filenames that are set to break on load. Note that 
+only files with break-on-load are in here, so simply showing the keys
+suffices.
+
+=cut
+
+sub report_break_on_load {
+    sort keys %break_on_load;
+}
+
+=head3 C<cmd_b_load> (command)
+
+We take the file passed in and try to find it in C<%INC> (which maps modules
+to files they came from). We mark those files for break-on-load via 
+C<break_on_load> and then report that it was done.
+
+=cut
+
+sub cmd_b_load {
+    my $file = shift;
+    my @files;
+
+    # This is a block because that way we can use a redo inside it
+    # even without there being any looping structure at all outside it.
+    {
+
+        # Save short name and full path if found.
+        push @files, $file;
+        push @files, $::INC{$file} if $::INC{$file};
+
+        # Tack on .pm and do it again unless there was a '.' in the name
+        # already.
+        $file .= '.pm', redo unless $file =~ /\./;
+    }
+
+    # Do the real work here.
+    break_on_load($_) for @files;
+
+    # All the files that have break-on-load breakpoints.
+    @files = report_break_on_load;
+
+    # Normalize for the purposes of our printing this.
+    local $\ = '';
+    local $" = ' ';
+    print $OUT "Will stop on load of `@files'.\n";
+} ## end sub cmd_b_load
+
+=head3 C<$filename_error> (API package global)
+
+Several of the functions we need to implement in the API need to work both
+on the current file and on other files. We don't want to duplicate code, so
+C<$filename_error> is used to contain the name of the file that's being 
+worked on (if it's not the current one).
+
+We can now build functions in pairs: the basic function works on the current
+file, and uses C<$filename_error> as part of its error message. Since this is
+initialized to C<"">, no filename will appear when we are working on the
+current file.
+
+The second function is a wrapper which does the following:
+
+=over 4 
+
+=item *
+
+Localizes C<$filename_error> and sets it to the name of the file to be processed.
+
+=item *
+
+Localizes the C<*dbline> glob and reassigns it to point to the file we want to process. 
+
+=item *
+
+Calls the first function. 
+
+The first function works on the I<current> file (i.e., the one we changed to),
+and prints C<$filename_error> in the error message (the name of the other file)
+if it needs to. When the functions return, C<*dbline> is restored to point
+to the actual current file (the one we're executing in) and
+C<$filename_error> is restored to C<"">. This restores everything to
+the way it was before the second function was called at all.
+
+See the comments in C<breakable_line> and C<breakable_line_in_file> for more
+details.
+
+=back
+
+=cut
+
+$filename_error = '';
+
+=head3 breakable_line(from, to) (API)
+
+The subroutine decides whether or not a line in the current file is breakable.
+It walks through C<@dbline> within the range of lines specified, looking for
+the first line that is breakable.
+
+If C<$to> is greater than C<$from>, the search moves forwards, finding the 
+first line I<after> C<$to> that's breakable, if there is one.
+
+If C<$from> is greater than C<$to>, the search goes I<backwards>, finding the
+first line I<before> C<$to> that's breakable, if there is one.
+
+=cut
+
+sub breakable_line {
+
+    my ( $from, $to ) = @_;
+
+    # $i is the start point. (Where are the FORTRAN programs of yesteryear?)
+    my $i = $from;
+
+    # If there are at least 2 arguments, we're trying to search a range.
+    if ( @_ >= 2 ) {
+
+        # $delta is positive for a forward search, negative for a backward one.
+        my $delta = $from < $to ? +1 : -1;
+
+        # Keep us from running off the ends of the file.
+        my $limit = $delta > 0 ? $#dbline : 1;
+
+        # Clever test. If you're a mathematician, it's obvious why this
+        # test works. If not:
+        # If $delta is positive (going forward), $limit will be $#dbline.
+        #    If $to is less than $limit, ($limit - $to) will be positive, times
+        #    $delta of 1 (positive), so the result is > 0 and we should use $to
+        #    as the stopping point.
+        #
+        #    If $to is greater than $limit, ($limit - $to) is negative,
+        #    times $delta of 1 (positive), so the result is < 0 and we should
+        #    use $limit ($#dbline) as the stopping point.
+        #
+        # If $delta is negative (going backward), $limit will be 1.
+        #    If $to is zero, ($limit - $to) will be 1, times $delta of -1
+        #    (negative) so the result is > 0, and we use $to as the stopping
+        #    point.
+        #
+        #    If $to is less than zero, ($limit - $to) will be positive,
+        #    times $delta of -1 (negative), so the result is not > 0, and
+        #    we use $limit (1) as the stopping point.
+        #
+        #    If $to is 1, ($limit - $to) will zero, times $delta of -1
+        #    (negative), still giving zero; the result is not > 0, and
+        #    we use $limit (1) as the stopping point.
+        #
+        #    if $to is >1, ($limit - $to) will be negative, times $delta of -1
+        #    (negative), giving a positive (>0) value, so we'll set $limit to
+        #    $to.
+
+        $limit = $to if ( $limit - $to ) * $delta > 0;
+
+        # The real search loop.
+        # $i starts at $from (the point we want to start searching from).
+        # We move through @dbline in the appropriate direction (determined
+        # by $delta: either -1 (back) or +1 (ahead).
+        # We stay in as long as we haven't hit an executable line
+        # ($dbline[$i] == 0 means not executable) and we haven't reached
+        # the limit yet (test similar to the above).
+        $i += $delta while $dbline[$i] == 0 and ( $limit - $i ) * $delta > 0;
+
+    } ## end if (@_ >= 2)
+
+    # If $i points to a line that is executable, return that.
+    return $i unless $dbline[$i] == 0;
+
+    # Format the message and print it: no breakable lines in range.
+    my ( $pl, $upto ) = ( '', '' );
+    ( $pl, $upto ) = ( 's', "..$to" ) if @_ >= 2 and $from != $to;
+
+    # If there's a filename in filename_error, we'll see it.
+    # If not, not.
+    die "Line$pl $from$upto$filename_error not breakable\n";
+} ## end sub breakable_line
+
+=head3 breakable_line_in_filename(file, from, to) (API)
+
+Like C<breakable_line>, but look in another file.
+
+=cut
+
+sub breakable_line_in_filename {
+
+    # Capture the file name.
+    my ($f) = shift;
+
+    # Swap the magic line array over there temporarily.
+    local *dbline = $main::{ '_<' . $f };
+
+    # If there's an error, it's in this other file.
+    local $filename_error = " of `$f'";
+
+    # Find the breakable line.
+    breakable_line(@_);
+
+    # *dbline and $filename_error get restored when this block ends.
+
+} ## end sub breakable_line_in_filename
+
+=head3 break_on_line(lineno, [condition]) (API)
+
+Adds a breakpoint with the specified condition (or 1 if no condition was 
+specified) to the specified line. Dies if it can't.
+
+=cut
+
+sub break_on_line {
+    my ( $i, $cond ) = @_;
+
+    # Always true if no condition supplied.
+    $cond = 1 unless @_ >= 2;
+
+    my $inii  = $i;
+    my $after = '';
+    my $pl    = '';
+
+    # Woops, not a breakable line. $filename_error allows us to say
+    # if it was in a different file.
+    die "Line $i$filename_error not breakable.\n" if $dbline[$i] == 0;
+
+    # Mark this file as having breakpoints in it.
+    $had_breakpoints{$filename} |= 1;
+
+    # If there is an action or condition here already ...
+    if ( $dbline{$i} ) {
+
+        # ... swap this condition for the existing one.
+        $dbline{$i} =~ s/^[^\0]*/$cond/;
+    }
+    else {
+
+        # Nothing here - just add the condition.
+        $dbline{$i} = $cond;
+    }
+} ## end sub break_on_line
+
+=head3 cmd_b_line(line, [condition]) (command)
+
+Wrapper for C<break_on_line>. Prints the failure message if it 
+doesn't work.
+
+=cut 
+
+sub cmd_b_line {
+    eval { break_on_line(@_); 1 } or do {
+        local $\ = '';
+        print $OUT $@ and return;
+    };
+} ## end sub cmd_b_line
+
+=head3 break_on_filename_line(file, line, [condition]) (API)
+
+Switches to the file specified and then calls C<break_on_line> to set 
+the breakpoint.
+
+=cut
+
+sub break_on_filename_line {
+    my ( $f, $i, $cond ) = @_;
+
+    # Always true if condition left off.
+    $cond = 1 unless @_ >= 3;
+
+    # Switch the magical hash temporarily.
+    local *dbline = $main::{ '_<' . $f };
+
+    # Localize the variables that break_on_line uses to make its message.
+    local $filename_error = " of `$f'";
+    local $filename       = $f;
+
+    # Add the breakpoint.
+    break_on_line( $i, $cond );
+} ## end sub break_on_filename_line
+
+=head3 break_on_filename_line_range(file, from, to, [condition]) (API)
+
+Switch to another file, search the range of lines specified for an 
+executable one, and put a breakpoint on the first one you find.
+
+=cut
+
+sub break_on_filename_line_range {
+    my ( $f, $from, $to, $cond ) = @_;
+
+    # Find a breakable line if there is one.
+    my $i = breakable_line_in_filename( $f, $from, $to );
+
+    # Always true if missing.
+    $cond = 1 unless @_ >= 3;
+
+    # Add the breakpoint.
+    break_on_filename_line( $f, $i, $cond );
+} ## end sub break_on_filename_line_range
+
+=head3 subroutine_filename_lines(subname, [condition]) (API)
+
+Search for a subroutine within a given file. The condition is ignored.
+Uses C<find_sub> to locate the desired subroutine.
+
+=cut
+
+sub subroutine_filename_lines {
+    my ( $subname, $cond ) = @_;
+
+    # Returned value from find_sub() is fullpathname:startline-endline.
+    # The match creates the list (fullpathname, start, end). Falling off
+    # the end of the subroutine returns this implicitly.
+    find_sub($subname) =~ /^(.*):(\d+)-(\d+)$/;
+} ## end sub subroutine_filename_lines
+
+=head3 break_subroutine(subname) (API)
+
+Places a break on the first line possible in the specified subroutine. Uses
+C<subroutine_filename_lines> to find the subroutine, and 
+C<break_on_filename_line_range> to place the break.
+
+=cut
+
+sub break_subroutine {
+    my $subname = shift;
+
+    # Get filename, start, and end.
+    my ( $file, $s, $e ) = subroutine_filename_lines($subname)
+      or die "Subroutine $subname not found.\n";
+
+    # Null condition changes to '1' (always true).
+    $cond = 1 unless @_ >= 2;
+
+    # Put a break the first place possible in the range of lines
+    # that make up this subroutine.
+    break_on_filename_line_range( $file, $s, $e, @_ );
+} ## end sub break_subroutine
+
+=head3 cmd_b_sub(subname, [condition]) (command)
+
+We take the incoming subroutine name and fully-qualify it as best we can.
+
+=over 4
+
+=item 1. If it's already fully-qualified, leave it alone. 
+
+=item 2. Try putting it in the current package.
+
+=item 3. If it's not there, try putting it in CORE::GLOBAL if it exists there.
+
+=item 4. If it starts with '::', put it in 'main::'.
+
+=back
+
+After all this cleanup, we call C<break_subroutine> to try to set the 
+breakpoint.
+
+=cut
+
+sub cmd_b_sub {
+    my ( $subname, $cond ) = @_;
+
+    # Add always-true condition if we have none.
+    $cond = 1 unless @_ >= 2;
+
+    # If the subname isn't a code reference, qualify it so that
+    # break_subroutine() will work right.
+    unless ( ref $subname eq 'CODE' ) {
+
+        # Not Perl4.
+        $subname =~ s/\'/::/g;
+        my $s = $subname;
+
+        # Put it in this package unless it's already qualified.
+        $subname = "${'package'}::" . $subname
+          unless $subname =~ /::/;
+
+        # Requalify it into CORE::GLOBAL if qualifying it into this
+        # package resulted in its not being defined, but only do so
+        # if it really is in CORE::GLOBAL.
+        $subname = "CORE::GLOBAL::$s"
+          if not defined &$subname
+          and $s !~ /::/
+          and defined &{"CORE::GLOBAL::$s"};
+
+        # Put it in package 'main' if it has a leading ::.
+        $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
+
+    } ## end unless (ref $subname eq 'CODE')
+
+    # Try to set the breakpoint.
+    eval { break_subroutine( $subname, $cond ); 1 } or do {
+        local $\ = '';
+        print $OUT $@ and return;
+      }
+} ## end sub cmd_b_sub
+
+=head3 C<cmd_B> - delete breakpoint(s) (command)
+
+The command mostly parses the command line and tries to turn the argument
+into a line spec. If it can't, it uses the current line. It then calls
+C<delete_breakpoint> to actually do the work.
+
+If C<*> is  specified, C<cmd_B> calls C<delete_breakpoint> with no arguments,
+thereby deleting all the breakpoints.
+
+=cut
+
+sub cmd_B {
+    my $cmd = shift;
+
+    # No line spec? Use dbline.
+    # If there is one, use it if it's non-zero, or wipe it out if it is.
+    my $line   = ( $_[0] =~ /^\./ ) ? $dbline : shift || '';
+    my $dbline = shift;
+
+    # If the line was dot, make the line the current one.
+    $line =~ s/^\./$dbline/;
+
+    # If it's * we're deleting all the breakpoints.
+    if ( $line eq '*' ) {
+        eval { &delete_breakpoint(); 1 } or print $OUT $@ and return;
+    }
+
+    # If there is a line spec, delete the breakpoint on that line.
+    elsif ( $line =~ /^(\S.*)/ ) {
+        eval { &delete_breakpoint( $line || $dbline ); 1 } or do {
+            local $\ = '';
+            print $OUT $@ and return;
+        };
+    } ## end elsif ($line =~ /^(\S.*)/)
+
+    # No line spec.
+    else {
+        print $OUT
+          "Deleting a breakpoint requires a line number, or '*' for all\n"
+          ;    # hint
+    }
+} ## end sub cmd_B
+
+=head3 delete_breakpoint([line]) (API)
+
+This actually does the work of deleting either a single breakpoint, or all
+of them.
+
+For a single line, we look for it in C<@dbline>. If it's nonbreakable, we
+just drop out with a message saying so. If it is, we remove the condition
+part of the 'condition\0action' that says there's a breakpoint here. If,
+after we've done that, there's nothing left, we delete the corresponding
+line in C<%dbline> to signal that no action needs to be taken for this line.
+
+For all breakpoints, we iterate through the keys of C<%had_breakpoints>, 
+which lists all currently-loaded files which have breakpoints. We then look
+at each line in each of these files, temporarily switching the C<%dbline>
+and C<@dbline> structures to point to the files in question, and do what
+we did in the single line case: delete the condition in C<@dbline>, and
+delete the key in C<%dbline> if nothing's left.
+
+We then wholesale delete C<%postponed>, C<%postponed_file>, and 
+C<%break_on_load>, because these structures contain breakpoints for files
+and code that haven't been loaded yet. We can just kill these off because there
+are no magical debugger structures associated with them.
+
+=cut
+
+sub delete_breakpoint {
+    my $i = shift;
+
+    # If we got a line, delete just that one.
+    if ( defined($i) ) {
+
+        # Woops. This line wasn't breakable at all.
+        die "Line $i not breakable.\n" if $dbline[$i] == 0;
+
+        # Kill the condition, but leave any action.
+        $dbline{$i} =~ s/^[^\0]*//;
+
+        # Remove the entry entirely if there's no action left.
+        delete $dbline{$i} if $dbline{$i} eq '';
+    }
+
+    # No line; delete them all.
+    else {
+        print $OUT "Deleting all breakpoints...\n";
+
+        # %had_breakpoints lists every file that had at least one
+        # breakpoint in it.
+        for my $file ( keys %had_breakpoints ) {
+
+            # Switch to the desired file temporarily.
+            local *dbline = $main::{ '_<' . $file };
+
+            my $max = $#dbline;
+            my $was;
+
+            # For all lines in this file ...
+            for ( $i = 1 ; $i <= $max ; $i++ ) {
+
+                # If there's a breakpoint or action on this line ...
+                if ( defined $dbline{$i} ) {
+
+                    # ... remove the breakpoint.
+                    $dbline{$i} =~ s/^[^\0]+//;
+                    if ( $dbline{$i} =~ s/^\0?$// ) {
+
+                        # Remove the entry altogether if no action is there.
+                        delete $dbline{$i};
+                    }
+                } ## end if (defined $dbline{$i...
+            } ## end for ($i = 1 ; $i <= $max...
+
+            # If, after we turn off the "there were breakpoints in this file"
+            # bit, the entry in %had_breakpoints for this file is zero,
+            # we should remove this file from the hash.
+            if ( not $had_breakpoints{$file} &= ~1 ) {
+                delete $had_breakpoints{$file};
+            }
+        } ## end for my $file (keys %had_breakpoints)
+
+        # Kill off all the other breakpoints that are waiting for files that
+        # haven't been loaded yet.
+        undef %postponed;
+        undef %postponed_file;
+        undef %break_on_load;
+    } ## end else [ if (defined($i))
+} ## end sub delete_breakpoint
+
+=head3 cmd_stop (command)
+
+This is meant to be part of the new command API, but it isn't called or used
+anywhere else in the debugger. XXX It is probably meant for use in development
+of new commands.
+
+=cut
+
+sub cmd_stop {    # As on ^C, but not signal-safy.
+    $signal = 1;
+}
+
+=head3 C<cmd_e> - threads
+
+Display the current thread id:
+
+	e
+
+This could be how (when implemented) to send commands to this thread id (e cmd)
+or that thread id (e tid cmd).
+
+=cut
+
+sub cmd_e {
+    my $cmd  = shift;
+    my $line = shift;
+	unless (exists($INC{'threads.pm'})) {
+		print "threads not loaded($ENV{PERL5DB_THREADED})
+		please run the debugger with PERL5DB_THREADED=1 set in the environment\n";
+	} else {
+		my $tid = threads->self->tid;
+		print "thread id: $tid\n";
+	}
+} ## end sub cmd_e
+
+=head3 C<cmd_E> - list of thread ids
+
+Display the list of available thread ids:
+
+	E
+
+This could be used (when implemented) to send commands to all threads (E cmd).
+
+=cut
+
+sub cmd_E {
+    my $cmd  = shift;
+    my $line = shift;
+	unless (exists($INC{'threads.pm'})) { 
+		print "threads not loaded($ENV{PERL5DB_THREADED})
+		please run the debugger with PERL5DB_THREADED=1 set in the environment\n";
+	} else {
+		my $tid = threads->self->tid;
+		print "thread ids: ".join(', ', 
+			map { ($tid == $_->tid ? '<'.$_->tid.'>' : $_->tid) } threads->list
+		)."\n"; 
+	}
+} ## end sub cmd_E
+
+=head3 C<cmd_h> - help command (command)
+
+Does the work of either
+
+=over 4
+
+=item *
+
+Showing all the debugger help
+
+=item *
+
+Showing help for a specific command
+
+=back
+
+=cut
+
+sub cmd_h {
+    my $cmd = shift;
+
+    # If we have no operand, assume null.
+    my $line = shift || '';
+
+    # 'h h'. Print the long-format help.
+    if ( $line =~ /^h\s*/ ) {
+        print_help($help);
+    }
+
+    # 'h <something>'. Search for the command and print only its help.
+    elsif ( $line =~ /^(\S.*)$/ ) {
+
+        # support long commands; otherwise bogus errors
+        # happen when you ask for h on <CR> for example
+        my $asked = $1;    # the command requested
+                           # (for proper error message)
+
+        my $qasked = quotemeta($asked);    # for searching; we don't
+                                           # want to use it as a pattern.
+                                           # XXX: finds CR but not <CR>
+
+        # Search the help string for the command.
+        if (
+            $help =~ /^                    # Start of a line
+                      <?                   # Optional '<'
+                      (?:[IB]<)            # Optional markup
+                      $qasked              # The requested command
+                     /mx
+          )
+        {
+
+            # It's there; pull it out and print it.
+            while (
+                $help =~ /^
+                              (<?            # Optional '<'
+                                 (?:[IB]<)   # Optional markup
+                                 $qasked     # The command
+                                 ([\s\S]*?)  # Description line(s)
+                              \n)            # End of last description line
+                              (?!\s)         # Next line not starting with 
+                                             # whitespace
+                             /mgx
+              )
+            {
+                print_help($1);
+            }
+        }
+
+        # Not found; not a debugger command.
+        else {
+            print_help("B<$asked> is not a debugger command.\n");
+        }
+    } ## end elsif ($line =~ /^(\S.*)$/)
+
+    # 'h' - print the summary help.
+    else {
+        print_help($summary);
+    }
+} ## end sub cmd_h
+
+=head3 C<cmd_i> - inheritance display
+
+Display the (nested) parentage of the module or object given.
+
+=cut
+
+sub cmd_i {
+    my $cmd  = shift;
+    my $line = shift;
+    eval { require Class::ISA };
+    if ($@) {
+        &warn( $@ =~ /locate/
+            ? "Class::ISA module not found - please install\n"
+            : $@ );
+    }
+    else {
+      ISA:
+        foreach my $isa ( split( /\s+/, $line ) ) {
+            $evalarg = $isa;
+            ($isa) = &eval;
+            no strict 'refs';
+            print join(
+                ', ',
+                map {    # snaffled unceremoniously from Class::ISA
+                    "$_"
+                      . (
+                        defined( ${"$_\::VERSION"} )
+                        ? ' ' . ${"$_\::VERSION"}
+                        : undef )
+                  } Class::ISA::self_and_super_path(ref($isa) || $isa)
+            );
+            print "\n";
+        }
+    }
+} ## end sub cmd_i
+
+=head3 C<cmd_l> - list lines (command)
+
+Most of the command is taken up with transforming all the different line
+specification syntaxes into 'start-stop'. After that is done, the command
+runs a loop over C<@dbline> for the specified range of lines. It handles 
+the printing of each line and any markers (C<==E<gt>> for current line,
+C<b> for break on this line, C<a> for action on this line, C<:> for this
+line breakable). 
+
+We save the last line listed in the C<$start> global for further listing
+later.
+
+=cut
+
+sub cmd_l {
+    my $current_line = $line;
+    my $cmd  = shift;
+    my $line = shift;
+
+    # If this is '-something', delete any spaces after the dash.
+    $line =~ s/^-\s*$/-/;
+
+    # If the line is '$something', assume this is a scalar containing a
+    # line number.
+    if ( $line =~ /^(\$.*)/s ) {
+
+        # Set up for DB::eval() - evaluate in *user* context.
+        $evalarg = $1;
+        # $evalarg = $2;
+        my ($s) = &eval;
+
+        # Ooops. Bad scalar.
+        print( $OUT "Error: $@\n" ), next CMD if $@;
+
+        # Good scalar. If it's a reference, find what it points to.
+        $s = CvGV_name($s);
+        print( $OUT "Interpreted as: $1 $s\n" );
+        $line = "$1 $s";
+
+        # Call self recursively to really do the command.
+        &cmd_l( 'l', $s );
+    } ## end if ($line =~ /^(\$.*)/s)
+
+    # l name. Try to find a sub by that name.
+    elsif ( $line =~ /^([\':A-Za-z_][\':\w]*(\[.*\])?)/s ) {
+        my $s = $subname = $1;
+
+        # De-Perl4.
+        $subname =~ s/\'/::/;
+
+        # Put it in this package unless it starts with ::.
+        $subname = $package . "::" . $subname unless $subname =~ /::/;
+
+        # Put it in CORE::GLOBAL if t doesn't start with :: and
+        # it doesn't live in this package and it lives in CORE::GLOBAL.
+        $subname = "CORE::GLOBAL::$s"
+          if not defined &$subname
+          and $s !~ /::/
+          and defined &{"CORE::GLOBAL::$s"};
+
+        # Put leading '::' names into 'main::'.
+        $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
+
+        # Get name:start-stop from find_sub, and break this up at
+        # colons.
+        @pieces = split( /:/, find_sub($subname) || $sub{$subname} );
+
+        # Pull off start-stop.
+        $subrange = pop @pieces;
+
+        # If the name contained colons, the split broke it up.
+        # Put it back together.
+        $file = join( ':', @pieces );
+
+        # If we're not in that file, switch over to it.
+        if ( $file ne $filename ) {
+            print $OUT "Switching to file '$file'.\n"
+              unless $slave_editor;
+
+            # Switch debugger's magic structures.
+            *dbline   = $main::{ '_<' . $file };
+            $max      = $#dbline;
+            $filename = $file;
+        } ## end if ($file ne $filename)
+
+        # Subrange is 'start-stop'. If this is less than a window full,
+        # swap it to 'start+', which will list a window from the start point.
+        if ($subrange) {
+            if ( eval($subrange) < -$window ) {
+                $subrange =~ s/-.*/+/;
+            }
+
+            # Call self recursively to list the range.
+            $line = $subrange;
+            &cmd_l( 'l', $subrange );
+        } ## end if ($subrange)
+
+        # Couldn't find it.
+        else {
+            print $OUT "Subroutine $subname not found.\n";
+        }
+    } ## end elsif ($line =~ /^([\':A-Za-z_][\':\w]*(\[.*\])?)/s)
+
+    # Bare 'l' command.
+    elsif ( $line =~ /^\s*$/ ) {
+
+        # Compute new range to list.
+        $incr = $window - 1;
+        $line = $start . '-' . ( $start + $incr );
+
+        # Recurse to do it.
+        &cmd_l( 'l', $line );
+    }
+
+    # l [start]+number_of_lines
+    elsif ( $line =~ /^(\d*)\+(\d*)$/ ) {
+
+        # Don't reset start for 'l +nnn'.
+        $start = $1 if $1;
+
+        # Increment for list. Use window size if not specified.
+        # (Allows 'l +' to work.)
+        $incr = $2;
+        $incr = $window - 1 unless $incr;
+
+        # Create a line range we'll understand, and recurse to do it.
+        $line = $start . '-' . ( $start + $incr );
+        &cmd_l( 'l', $line );
+    } ## end elsif ($line =~ /^(\d*)\+(\d*)$/)
+
+    # l start-stop or l start,stop
+    elsif ( $line =~ /^((-?[\d\$\.]+)([-,]([\d\$\.]+))?)?/ ) {
+
+        # Determine end point; use end of file if not specified.
+        $end = ( !defined $2 ) ? $max : ( $4 ? $4 : $2 );
+
+        # Go on to the end, and then stop.
+        $end = $max if $end > $max;
+
+        # Determine start line.
+        $i    = $2;
+        $i    = $line if $i eq '.';
+        $i    = 1 if $i < 1;
+        $incr = $end - $i;
+
+        # If we're running under a slave editor, force it to show the lines.
+        if ($slave_editor) {
+            print $OUT "\032\032$filename:$i:0\n";
+            $i = $end;
+        }
+
+        # We're doing it ourselves. We want to show the line and special
+        # markers for:
+        # - the current line in execution
+        # - whether a line is breakable or not
+        # - whether a line has a break or not
+        # - whether a line has an action or not
+        else {
+            for ( ; $i <= $end ; $i++ ) {
+
+                # Check for breakpoints and actions.
+                my ( $stop, $action );
+                ( $stop, $action ) = split( /\0/, $dbline{$i} )
+                  if $dbline{$i};
+
+                # ==> if this is the current line in execution,
+                # : if it's breakable.
+                $arrow =
+                  ( $i == $current_line and $filename eq $filename_ini )
+                  ? '==>'
+                  : ( $dbline[$i] + 0 ? ':' : ' ' );
+
+                # Add break and action indicators.
+                $arrow .= 'b' if $stop;
+                $arrow .= 'a' if $action;
+
+                # Print the line.
+                print $OUT "$i$arrow\t", $dbline[$i];
+
+                # Move on to the next line. Drop out on an interrupt.
+                $i++, last if $signal;
+            } ## end for (; $i <= $end ; $i++)
+
+            # Line the prompt up; print a newline if the last line listed
+            # didn't have a newline.
+            print $OUT "\n" unless $dbline[ $i - 1 ] =~ /\n$/;
+        } ## end else [ if ($slave_editor)
+
+        # Save the point we last listed to in case another relative 'l'
+        # command is desired. Don't let it run off the end.
+        $start = $i;
+        $start = $max if $start > $max;
+    } ## end elsif ($line =~ /^((-?[\d\$\.]+)([-,]([\d\$\.]+))?)?/)
+} ## end sub cmd_l
+
+=head3 C<cmd_L> - list breakpoints, actions, and watch expressions (command)
+
+To list breakpoints, the command has to look determine where all of them are
+first. It starts a C<%had_breakpoints>, which tells us what all files have
+breakpoints and/or actions. For each file, we switch the C<*dbline> glob (the 
+magic source and breakpoint data structures) to the file, and then look 
+through C<%dbline> for lines with breakpoints and/or actions, listing them 
+out. We look through C<%postponed> not-yet-compiled subroutines that have 
+breakpoints, and through C<%postponed_file> for not-yet-C<require>'d files 
+that have breakpoints.
+
+Watchpoints are simpler: we just list the entries in C<@to_watch>.
+
+=cut
+
+sub cmd_L {
+    my $cmd = shift;
+
+    # If no argument, list everything. Pre-5.8.0 version always lists
+    # everything
+    my $arg = shift || 'abw';
+    $arg = 'abw' unless $CommandSet eq '580';    # sigh...
+
+    # See what is wanted.
+    my $action_wanted = ( $arg =~ /a/ ) ? 1 : 0;
+    my $break_wanted  = ( $arg =~ /b/ ) ? 1 : 0;
+    my $watch_wanted  = ( $arg =~ /w/ ) ? 1 : 0;
+
+    # Breaks and actions are found together, so we look in the same place
+    # for both.
+    if ( $break_wanted or $action_wanted ) {
+
+        # Look in all the files with breakpoints...
+        for my $file ( keys %had_breakpoints ) {
+
+            # Temporary switch to this file.
+            local *dbline = $main::{ '_<' . $file };
+
+            # Set up to look through the whole file.
+            my $max = $#dbline;
+            my $was;    # Flag: did we print something
+                        # in this file?
+
+            # For each line in the file ...
+            for ( $i = 1 ; $i <= $max ; $i++ ) {
+
+                # We've got something on this line.
+                if ( defined $dbline{$i} ) {
+
+                    # Print the header if we haven't.
+                    print $OUT "$file:\n" unless $was++;
+
+                    # Print the line.
+                    print $OUT " $i:\t", $dbline[$i];
+
+                    # Pull out the condition and the action.
+                    ( $stop, $action ) = split( /\0/, $dbline{$i} );
+
+                    # Print the break if there is one and it's wanted.
+                    print $OUT "   break if (", $stop, ")\n"
+                      if $stop
+                      and $break_wanted;
+
+                    # Print the action if there is one and it's wanted.
+                    print $OUT "   action:  ", $action, "\n"
+                      if $action
+                      and $action_wanted;
+
+                    # Quit if the user hit interrupt.
+                    last if $signal;
+                } ## end if (defined $dbline{$i...
+            } ## end for ($i = 1 ; $i <= $max...
+        } ## end for my $file (keys %had_breakpoints)
+    } ## end if ($break_wanted or $action_wanted)
+
+    # Look for breaks in not-yet-compiled subs:
+    if ( %postponed and $break_wanted ) {
+        print $OUT "Postponed breakpoints in subroutines:\n";
+        my $subname;
+        for $subname ( keys %postponed ) {
+            print $OUT " $subname\t$postponed{$subname}\n";
+            last if $signal;
+        }
+    } ## end if (%postponed and $break_wanted)
+
+    # Find files that have not-yet-loaded breaks:
+    my @have = map {    # Combined keys
+        keys %{ $postponed_file{$_} }
+    } keys %postponed_file;
+
+    # If there are any, list them.
+    if ( @have and ( $break_wanted or $action_wanted ) ) {
+        print $OUT "Postponed breakpoints in files:\n";
+        my ( $file, $line );
+
+        for $file ( keys %postponed_file ) {
+            my $db = $postponed_file{$file};
+            print $OUT " $file:\n";
+            for $line ( sort { $a <=> $b } keys %$db ) {
+                print $OUT "  $line:\n";
+                my ( $stop, $action ) = split( /\0/, $$db{$line} );
+                print $OUT "    break if (", $stop, ")\n"
+                  if $stop
+                  and $break_wanted;
+                print $OUT "    action:  ", $action, "\n"
+                  if $action
+                  and $action_wanted;
+                last if $signal;
+            } ## end for $line (sort { $a <=>...
+            last if $signal;
+        } ## end for $file (keys %postponed_file)
+    } ## end if (@have and ($break_wanted...
+    if ( %break_on_load and $break_wanted ) {
+        print $OUT "Breakpoints on load:\n";
+        my $file;
+        for $file ( keys %break_on_load ) {
+            print $OUT " $file\n";
+            last if $signal;
+        }
+    } ## end if (%break_on_load and...
+    if ($watch_wanted) {
+        if ( $trace & 2 ) {
+            print $OUT "Watch-expressions:\n" if @to_watch;
+            for my $expr (@to_watch) {
+                print $OUT " $expr\n";
+                last if $signal;
+            }
+        } ## end if ($trace & 2)
+    } ## end if ($watch_wanted)
+} ## end sub cmd_L
+
+=head3 C<cmd_M> - list modules (command)
+
+Just call C<list_modules>.
+
+=cut
+
+sub cmd_M {
+    &list_modules();
+}
+
+=head3 C<cmd_o> - options (command)
+
+If this is just C<o> by itself, we list the current settings via 
+C<dump_option>. If there's a nonblank value following it, we pass that on to
+C<parse_options> for processing.
+
+=cut
+
+sub cmd_o {
+    my $cmd = shift;
+    my $opt = shift || '';    # opt[=val]
+
+    # Nonblank. Try to parse and process.
+    if ( $opt =~ /^(\S.*)/ ) {
+        &parse_options($1);
+    }
+
+    # Blank. List the current option settings.
+    else {
+        for (@options) {
+            &dump_option($_);
+        }
+    }
+} ## end sub cmd_o
+
+=head3 C<cmd_O> - nonexistent in 5.8.x (command)
+
+Advises the user that the O command has been renamed.
+
+=cut
+
+sub cmd_O {
+    print $OUT "The old O command is now the o command.\n";             # hint
+    print $OUT "Use 'h' to get current command help synopsis or\n";     #
+    print $OUT "use 'o CommandSet=pre580' to revert to old usage\n";    #
+}
+
+=head3 C<cmd_v> - view window (command)
+
+Uses the C<$preview> variable set in the second C<BEGIN> block (q.v.) to
+move back a few lines to list the selected line in context. Uses C<cmd_l>
+to do the actual listing after figuring out the range of line to request.
+
+=cut 
+
+sub cmd_v {
+    my $cmd  = shift;
+    my $line = shift;
+
+    # Extract the line to list around. (Astute readers will have noted that
+    # this pattern will match whether or not a numeric line is specified,
+    # which means that we'll always enter this loop (though a non-numeric
+    # argument results in no action at all)).
+    if ( $line =~ /^(\d*)$/ ) {
+
+        # Total number of lines to list (a windowful).
+        $incr = $window - 1;
+
+        # Set the start to the argument given (if there was one).
+        $start = $1 if $1;
+
+        # Back up by the context amount.
+        $start -= $preview;
+
+        # Put together a linespec that cmd_l will like.
+        $line = $start . '-' . ( $start + $incr );
+
+        # List the lines.
+        &cmd_l( 'l', $line );
+    } ## end if ($line =~ /^(\d*)$/)
+} ## end sub cmd_v
+
+=head3 C<cmd_w> - add a watch expression (command)
+
+The 5.8 version of this command adds a watch expression if one is specified;
+it does nothing if entered with no operands.
+
+We extract the expression, save it, evaluate it in the user's context, and
+save the value. We'll re-evaluate it each time the debugger passes a line,
+and will stop (see the code at the top of the command loop) if the value
+of any of the expressions changes.
+
+=cut
+
+sub cmd_w {
+    my $cmd = shift;
+
+    # Null expression if no arguments.
+    my $expr = shift || '';
+
+    # If expression is not null ...
+    if ( $expr =~ /^(\S.*)/ ) {
+
+        # ... save it.
+        push @to_watch, $expr;
+
+        # Parameterize DB::eval and call it to get the expression's value
+        # in the user's context. This version can handle expressions which
+        # return a list value.
+        $evalarg = $expr;
+        my ($val) = join( ' ', &eval );
+        $val = ( defined $val ) ? "'$val'" : 'undef';
+
+        # Save the current value of the expression.
+        push @old_watch, $val;
+
+        # We are now watching expressions.
+        $trace |= 2;
+    } ## end if ($expr =~ /^(\S.*)/)
+
+    # You have to give one to get one.
+    else {
+        print $OUT "Adding a watch-expression requires an expression\n";  # hint
+    }
+} ## end sub cmd_w
+
+=head3 C<cmd_W> - delete watch expressions (command)
+
+This command accepts either a watch expression to be removed from the list
+of watch expressions, or C<*> to delete them all.
+
+If C<*> is specified, we simply empty the watch expression list and the 
+watch expression value list. We also turn off the bit that says we've got 
+watch expressions.
+
+If an expression (or partial expression) is specified, we pattern-match
+through the expressions and remove the ones that match. We also discard
+the corresponding values. If no watch expressions are left, we turn off 
+the I<watching expressions> bit.
+
+=cut
+
+sub cmd_W {
+    my $cmd  = shift;
+    my $expr = shift || '';
+
+    # Delete them all.
+    if ( $expr eq '*' ) {
+
+        # Not watching now.
+        $trace &= ~2;
+
+        print $OUT "Deleting all watch expressions ...\n";
+
+        # And all gone.
+        @to_watch = @old_watch = ();
+    }
+
+    # Delete one of them.
+    elsif ( $expr =~ /^(\S.*)/ ) {
+
+        # Where we are in the list.
+        my $i_cnt = 0;
+
+        # For each expression ...
+        foreach (@to_watch) {
+            my $val = $to_watch[$i_cnt];
+
+            # Does this one match the command argument?
+            if ( $val eq $expr ) {    # =~ m/^\Q$i$/) {
+                                      # Yes. Turn it off, and its value too.
+                splice( @to_watch,  $i_cnt, 1 );
+                splice( @old_watch, $i_cnt, 1 );
+            }
+            $i_cnt++;
+        } ## end foreach (@to_watch)
+
+        # We don't bother to turn watching off because
+        #  a) we don't want to stop calling watchfunction() it it exists
+        #  b) foreach over a null list doesn't do anything anyway
+
+    } ## end elsif ($expr =~ /^(\S.*)/)
+
+    # No command arguments entered.
+    else {
+        print $OUT
+          "Deleting a watch-expression requires an expression, or '*' for all\n"
+          ;    # hint
+    }
+} ## end sub cmd_W
+
+### END of the API section
+
+=head1 SUPPORT ROUTINES
+
+These are general support routines that are used in a number of places
+throughout the debugger.
+
+=over 4
+
+=item cmd_P
+
+Something to do with assertions
+
+=back
+
+=cut
+
+sub cmd_P {
+    unless ($ini_assertion) {
+        print $OUT "Assertions not supported in this Perl interpreter\n";
+    } else {
+        if ( $cmd =~ /^.\b\s*([+-]?)\s*(~?)\s*(\w+(\s*\|\s*\w+)*)\s*$/ ) {
+            my ( $how, $neg, $flags ) = ( $1, $2, $3 );
+            my $acu = parse_DollarCaretP_flags($flags);
+            if ( defined $acu ) {
+                $acu = ~$acu if $neg;
+                if ( $how eq '+' ) { $^P |= $acu }
+                elsif ( $how eq '-' ) { $^P &= ~$acu }
+                else { $^P = $acu }
+            }
+
+            # else { print $OUT "undefined acu\n" }
+        }
+        my $expanded = expand_DollarCaretP_flags($^P);
+        print $OUT "Internal Perl debugger flags:\n\$^P=$expanded\n";
+        $expanded;
+    }
+}
+
+=head2 save
+
+save() saves the user's versions of globals that would mess us up in C<@saved>,
+and installs the versions we like better. 
+
+=cut
+
+sub save {
+
+    # Save eval failure, command failure, extended OS error, output field
+    # separator, input record separator, output record separator and
+    # the warning setting.
+    @saved = ( $@, $!, $^E, $,, $/, $\, $^W );
+
+    $,  = "";      # output field separator is null string
+    $/  = "\n";    # input record separator is newline
+    $\  = "";      # output record separator is null string
+    $^W = 0;       # warnings are off
+} ## end sub save
+
+=head2 C<print_lineinfo> - show where we are now
+
+print_lineinfo prints whatever it is that it is handed; it prints it to the
+C<$LINEINFO> filehandle instead of just printing it to STDOUT. This allows
+us to feed line information to a slave editor without messing up the 
+debugger output.
+
+=cut
+
+sub print_lineinfo {
+
+    # Make the terminal sensible if we're not the primary debugger.
+    resetterm(1) if $LINEINFO eq $OUT and $term_pid != $$;
+    local $\ = '';
+    local $, = '';
+    print $LINEINFO @_;
+} ## end sub print_lineinfo
+
+=head2 C<postponed_sub>
+
+Handles setting postponed breakpoints in subroutines once they're compiled.
+For breakpoints, we use C<DB::find_sub> to locate the source file and line
+range for the subroutine, then mark the file as having a breakpoint,
+temporarily switch the C<*dbline> glob over to the source file, and then 
+search the given range of lines to find a breakable line. If we find one,
+we set the breakpoint on it, deleting the breakpoint from C<%postponed>.
+
+=cut 
+
+# The following takes its argument via $evalarg to preserve current @_
+
+sub postponed_sub {
+
+    # Get the subroutine name.
+    my $subname = shift;
+
+    # If this is a 'break +<n> if <condition>' ...
+    if ( $postponed{$subname} =~ s/^break\s([+-]?\d+)\s+if\s// ) {
+
+        # If there's no offset, use '+0'.
+        my $offset = $1 || 0;
+
+        # find_sub's value is 'fullpath-filename:start-stop'. It's
+        # possible that the filename might have colons in it too.
+        my ( $file, $i ) = ( find_sub($subname) =~ /^(.*):(\d+)-.*$/ );
+        if ($i) {
+
+            # We got the start line. Add the offset '+<n>' from
+            # $postponed{subname}.
+            $i += $offset;
+
+            # Switch to the file this sub is in, temporarily.
+            local *dbline = $main::{ '_<' . $file };
+
+            # No warnings, please.
+            local $^W = 0;    # != 0 is magical below
+
+            # This file's got a breakpoint in it.
+            $had_breakpoints{$file} |= 1;
+
+            # Last line in file.
+            my $max = $#dbline;
+
+            # Search forward until we hit a breakable line or get to
+            # the end of the file.
+            ++$i until $dbline[$i] != 0 or $i >= $max;
+
+            # Copy the breakpoint in and delete it from %postponed.
+            $dbline{$i} = delete $postponed{$subname};
+        } ## end if ($i)
+
+        # find_sub didn't find the sub.
+        else {
+            local $\ = '';
+            print $OUT "Subroutine $subname not found.\n";
+        }
+        return;
+    } ## end if ($postponed{$subname...
+    elsif ( $postponed{$subname} eq 'compile' ) { $signal = 1 }
+
+    #print $OUT "In postponed_sub for `$subname'.\n";
+} ## end sub postponed_sub
+
+=head2 C<postponed>
+
+Called after each required file is compiled, but before it is executed;
+also called if the name of a just-compiled subroutine is a key of 
+C<%postponed>. Propagates saved breakpoints (from C<b compile>, C<b load>,
+etc.) into the just-compiled code.
+
+If this is a C<require>'d file, the incoming parameter is the glob 
+C<*{"_<$filename"}>, with C<$filename> the name of the C<require>'d file.
+
+If it's a subroutine, the incoming parameter is the subroutine name.
+
+=cut
+
+sub postponed {
+
+    # If there's a break, process it.
+    if ($ImmediateStop) {
+
+        # Right, we've stopped. Turn it off.
+        $ImmediateStop = 0;
+
+        # Enter the command loop when DB::DB gets called.
+        $signal = 1;
+    }
+
+    # If this is a subroutine, let postponed_sub() deal with it.
+    return &postponed_sub unless ref \$_[0] eq 'GLOB';
+
+    # Not a subroutine. Deal with the file.
+    local *dbline = shift;
+    my $filename = $dbline;
+    $filename =~ s/^_<//;
+    local $\ = '';
+    $signal = 1, print $OUT "'$filename' loaded...\n"
+      if $break_on_load{$filename};
+    print_lineinfo( ' ' x $stack_depth, "Package $filename.\n" ) if $frame;
+
+    # Do we have any breakpoints to put in this file?
+    return unless $postponed_file{$filename};
+
+    # Yes. Mark this file as having breakpoints.
+    $had_breakpoints{$filename} |= 1;
+
+    # "Cannot be done: unsufficient magic" - we can't just put the
+    # breakpoints saved in %postponed_file into %dbline by assigning
+    # the whole hash; we have to do it one item at a time for the
+    # breakpoints to be set properly.
+    #%dbline = %{$postponed_file{$filename}};
+
+    # Set the breakpoints, one at a time.
+    my $key;
+
+    for $key ( keys %{ $postponed_file{$filename} } ) {
+
+        # Stash the saved breakpoint into the current file's magic line array.
+        $dbline{$key} = ${ $postponed_file{$filename} }{$key};
+    }
+
+    # This file's been compiled; discard the stored breakpoints.
+    delete $postponed_file{$filename};
+
+} ## end sub postponed
+
+=head2 C<dumpit>
+
+C<dumpit> is the debugger's wrapper around dumpvar.pl. 
+
+It gets a filehandle (to which C<dumpvar.pl>'s output will be directed) and
+a reference to a variable (the thing to be dumped) as its input. 
+
+The incoming filehandle is selected for output (C<dumpvar.pl> is printing to
+the currently-selected filehandle, thank you very much). The current
+values of the package globals C<$single> and C<$trace> are backed up in 
+lexicals, and they are turned off (this keeps the debugger from trying
+to single-step through C<dumpvar.pl> (I think.)). C<$frame> is localized to
+preserve its current value and it is set to zero to prevent entry/exit
+messages from printing, and C<$doret> is localized as well and set to -2 to 
+prevent return values from being shown.
+
+C<dumpit()> then checks to see if it needs to load C<dumpvar.pl> and 
+tries to load it (note: if you have a C<dumpvar.pl>  ahead of the 
+installed version in C<@INC>, yours will be used instead. Possible security 
+problem?).
+
+It then checks to see if the subroutine C<main::dumpValue> is now defined
+(it should have been defined by C<dumpvar.pl>). If it has, C<dumpit()> 
+localizes the globals necessary for things to be sane when C<main::dumpValue()>
+is called, and picks up the variable to be dumped from the parameter list. 
+
+It checks the package global C<%options> to see if there's a C<dumpDepth> 
+specified. If not, -1 is assumed; if so, the supplied value gets passed on to 
+C<dumpvar.pl>. This tells C<dumpvar.pl> where to leave off when dumping a 
+structure: -1 means dump everything.
+
+C<dumpValue()> is then called if possible; if not, C<dumpit()>just prints a 
+warning.
+
+In either case, C<$single>, C<$trace>, C<$frame>, and C<$doret> are restored
+and we then return to the caller.
+
+=cut
+
+sub dumpit {
+
+    # Save the current output filehandle and switch to the one
+    # passed in as the first parameter.
+    local ($savout) = select(shift);
+
+    # Save current settings of $single and $trace, and then turn them off.
+    my $osingle = $single;
+    my $otrace  = $trace;
+    $single = $trace = 0;
+
+    # XXX Okay, what do $frame and $doret do, again?
+    local $frame = 0;
+    local $doret = -2;
+
+    # Load dumpvar.pl unless we've already got the sub we need from it.
+    unless ( defined &main::dumpValue ) {
+        do 'dumpvar.pl';
+    }
+
+    # If the load succeeded (or we already had dumpvalue()), go ahead
+    # and dump things.
+    if ( defined &main::dumpValue ) {
+        local $\ = '';
+        local $, = '';
+        local $" = ' ';
+        my $v = shift;
+        my $maxdepth = shift || $option{dumpDepth};
+        $maxdepth = -1 unless defined $maxdepth;    # -1 means infinite depth
+        &main::dumpValue( $v, $maxdepth );
+    } ## end if (defined &main::dumpValue)
+
+    # Oops, couldn't load dumpvar.pl.
+    else {
+        local $\ = '';
+        print $OUT "dumpvar.pl not available.\n";
+    }
+
+    # Reset $single and $trace to their old values.
+    $single = $osingle;
+    $trace  = $otrace;
+
+    # Restore the old filehandle.
+    select($savout);
+} ## end sub dumpit
+
+=head2 C<print_trace>
+
+C<print_trace>'s job is to print a stack trace. It does this via the 
+C<dump_trace> routine, which actually does all the ferreting-out of the
+stack trace data. C<print_trace> takes care of formatting it nicely and
+printing it to the proper filehandle.
+
+Parameters:
+
+=over 4
+
+=item *
+
+The filehandle to print to.
+
+=item *
+
+How many frames to skip before starting trace.
+
+=item *
+
+How many frames to print.
+
+=item *
+
+A flag: if true, print a I<short> trace without filenames, line numbers, or arguments
+
+=back
+
+The original comment below seems to be noting that the traceback may not be
+correct if this routine is called in a tied method.
+
+=cut
+
+# Tied method do not create a context, so may get wrong message:
+
+sub print_trace {
+    local $\ = '';
+    my $fh = shift;
+
+    # If this is going to a slave editor, but we're not the primary
+    # debugger, reset it first.
+    resetterm(1)
+      if $fh        eq $LINEINFO    # slave editor
+      and $LINEINFO eq $OUT         # normal output
+      and $term_pid != $$;          # not the primary
+
+    # Collect the actual trace information to be formatted.
+    # This is an array of hashes of subroutine call info.
+    my @sub = dump_trace( $_[0] + 1, $_[1] );
+
+    # Grab the "short report" flag from @_.
+    my $short = $_[2];              # Print short report, next one for sub name
+
+    # Run through the traceback info, format it, and print it.
+    my $s;
+    for ( $i = 0 ; $i <= $#sub ; $i++ ) {
+
+        # Drop out if the user has lost interest and hit control-C.
+        last if $signal;
+
+        # Set the separator so arrys print nice.
+        local $" = ', ';
+
+        # Grab and stringify the arguments if they are there.
+        my $args =
+          defined $sub[$i]{args}
+          ? "(@{ $sub[$i]{args} })"
+          : '';
+
+        # Shorten them up if $maxtrace says they're too long.
+        $args = ( substr $args, 0, $maxtrace - 3 ) . '...'
+          if length $args > $maxtrace;
+
+        # Get the file name.
+        my $file = $sub[$i]{file};
+
+        # Put in a filename header if short is off.
+        $file = $file eq '-e' ? $file : "file `$file'" unless $short;
+
+        # Get the actual sub's name, and shorten to $maxtrace's requirement.
+        $s = $sub[$i]{sub};
+        $s = ( substr $s, 0, $maxtrace - 3 ) . '...' if length $s > $maxtrace;
+
+        # Short report uses trimmed file and sub names.
+        if ($short) {
+            my $sub = @_ >= 4 ? $_[3] : $s;
+            print $fh "$sub[$i]{context}=$sub$args from $file:$sub[$i]{line}\n";
+        } ## end if ($short)
+
+        # Non-short report includes full names.
+        else {
+            print $fh "$sub[$i]{context} = $s$args"
+              . " called from $file"
+              . " line $sub[$i]{line}\n";
+        }
+    } ## end for ($i = 0 ; $i <= $#sub...
+} ## end sub print_trace
+
+=head2 dump_trace(skip[,count])
+
+Actually collect the traceback information available via C<caller()>. It does
+some filtering and cleanup of the data, but mostly it just collects it to
+make C<print_trace()>'s job easier.
+
+C<skip> defines the number of stack frames to be skipped, working backwards
+from the most current. C<count> determines the total number of frames to 
+be returned; all of them (well, the first 10^9) are returned if C<count>
+is omitted.
+
+This routine returns a list of hashes, from most-recent to least-recent
+stack frame. Each has the following keys and values:
+
+=over 4
+
+=item * C<context> - C<.> (null), C<$> (scalar), or C<@> (array)
+
+=item * C<sub> - subroutine name, or C<eval> information
+
+=item * C<args> - undef, or a reference to an array of arguments
+
+=item * C<file> - the file in which this item was defined (if any)
+
+=item * C<line> - the line on which it was defined
+
+=back
+
+=cut
+
+sub dump_trace {
+
+    # How many levels to skip.
+    my $skip = shift;
+
+    # How many levels to show. (1e9 is a cheap way of saying "all of them";
+    # it's unlikely that we'll have more than a billion stack frames. If you
+    # do, you've got an awfully big machine...)
+    my $count = shift || 1e9;
+
+    # We increment skip because caller(1) is the first level *back* from
+    # the current one.  Add $skip to the count of frames so we have a
+    # simple stop criterion, counting from $skip to $count+$skip.
+    $skip++;
+    $count += $skip;
+
+    # These variables are used to capture output from caller();
+    my ( $p, $file, $line, $sub, $h, $context );
+
+    my ( $e, $r, @a, @sub, $args );
+
+    # XXX Okay... why'd we do that?
+    my $nothard = not $frame & 8;
+    local $frame = 0;
+
+    # Do not want to trace this.
+    my $otrace = $trace;
+    $trace = 0;
+
+    # Start out at the skip count.
+    # If we haven't reached the number of frames requested, and caller() is
+    # still returning something, stay in the loop. (If we pass the requested
+    # number of stack frames, or we run out - caller() returns nothing - we
+    # quit.
+    # Up the stack frame index to go back one more level each time.
+    for (
+        $i = $skip ;
+        $i < $count
+        and ( $p, $file, $line, $sub, $h, $context, $e, $r ) = caller($i) ;
+        $i++
+      )
+    {
+
+        # Go through the arguments and save them for later.
+        @a = ();
+        for $arg (@args) {
+            my $type;
+            if ( not defined $arg ) {    # undefined parameter
+                push @a, "undef";
+            }
+
+            elsif ( $nothard and tied $arg ) {    # tied parameter
+                push @a, "tied";
+            }
+            elsif ( $nothard and $type = ref $arg ) {    # reference
+                push @a, "ref($type)";
+            }
+            else {                                       # can be stringified
+                local $_ =
+                  "$arg";    # Safe to stringify now - should not call f().
+
+                # Backslash any single-quotes or backslashes.
+                s/([\'\\])/\\$1/g;
+
+                # Single-quote it unless it's a number or a colon-separated
+                # name.
+                s/(.*)/'$1'/s
+                  unless /^(?: -?[\d.]+ | \*[\w:]* )$/x;
+
+                # Turn high-bit characters into meta-whatever.
+                s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
+
+                # Turn control characters into ^-whatever.
+                s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
+
+                push( @a, $_ );
+            } ## end else [ if (not defined $arg)
+        } ## end for $arg (@args)
+
+        # If context is true, this is array (@)context.
+        # If context is false, this is scalar ($) context.
+        # If neither, context isn't defined. (This is apparently a 'can't
+        # happen' trap.)
+        $context = $context ? '@' : ( defined $context ? "\$" : '.' );
+
+        # if the sub has args ($h true), make an anonymous array of the
+        # dumped args.
+        $args = $h ? [@a] : undef;
+
+        # remove trailing newline-whitespace-semicolon-end of line sequence
+        # from the eval text, if any.
+        $e =~ s/\n\s*\;\s*\Z// if $e;
+
+        # Escape backslashed single-quotes again if necessary.
+        $e =~ s/([\\\'])/\\$1/g if $e;
+
+        # if the require flag is true, the eval text is from a require.
+        if ($r) {
+            $sub = "require '$e'";
+        }
+
+        # if it's false, the eval text is really from an eval.
+        elsif ( defined $r ) {
+            $sub = "eval '$e'";
+        }
+
+        # If the sub is '(eval)', this is a block eval, meaning we don't
+        # know what the eval'ed text actually was.
+        elsif ( $sub eq '(eval)' ) {
+            $sub = "eval {...}";
+        }
+
+        # Stick the collected information into @sub as an anonymous hash.
+        push(
+            @sub,
+            {
+                context => $context,
+                sub     => $sub,
+                args    => $args,
+                file    => $file,
+                line    => $line
+            }
+        );
+
+        # Stop processing frames if the user hit control-C.
+        last if $signal;
+    } ## end for ($i = $skip ; $i < ...
+
+    # Restore the trace value again.
+    $trace = $otrace;
+    @sub;
+} ## end sub dump_trace
+
+=head2 C<action()>
+
+C<action()> takes input provided as the argument to an add-action command,
+either pre- or post-, and makes sure it's a complete command. It doesn't do
+any fancy parsing; it just keeps reading input until it gets a string
+without a trailing backslash.
+
+=cut
+
+sub action {
+    my $action = shift;
+
+    while ( $action =~ s/\\$// ) {
+
+        # We have a backslash on the end. Read more.
+        $action .= &gets;
+    } ## end while ($action =~ s/\\$//)
+
+    # Return the assembled action.
+    $action;
+} ## end sub action
+
+=head2 unbalanced
+
+This routine mostly just packages up a regular expression to be used
+to check that the thing it's being matched against has properly-matched
+curly braces.
+
+Of note is the definition of the C<$balanced_brace_re> global via C<||=>, which
+speeds things up by only creating the qr//'ed expression once; if it's 
+already defined, we don't try to define it again. A speed hack.
+
+=cut
+
+sub unbalanced {
+
+    # I hate using globals!
+    $balanced_brace_re ||= qr{ 
+        ^ \{
+             (?:
+                 (?> [^{}] + )              # Non-parens without backtracking
+                |
+                 (??{ $balanced_brace_re }) # Group with matching parens
+              ) *
+          \} $
+   }x;
+    return $_[0] !~ m/$balanced_brace_re/;
+} ## end sub unbalanced
+
+=head2 C<gets()>
+
+C<gets()> is a primitive (very primitive) routine to read continuations.
+It was devised for reading continuations for actions.
+it just reads more input with C<readline()> and returns it.
+
+=cut
+
+sub gets {
+    &readline("cont: ");
+}
+
+=head2 C<DB::system()> - handle calls to<system()> without messing up the debugger
+
+The C<system()> function assumes that it can just go ahead and use STDIN and
+STDOUT, but under the debugger, we want it to use the debugger's input and 
+outout filehandles. 
+
+C<DB::system()> socks away the program's STDIN and STDOUT, and then substitutes
+the debugger's IN and OUT filehandles for them. It does the C<system()> call,
+and then puts everything back again.
+
+=cut
+
+sub system {
+
+    # We save, change, then restore STDIN and STDOUT to avoid fork() since
+    # some non-Unix systems can do system() but have problems with fork().
+    open( SAVEIN,  "<&STDIN" )  || &warn("Can't save STDIN");
+    open( SAVEOUT, ">&STDOUT" ) || &warn("Can't save STDOUT");
+    open( STDIN,   "<&IN" )     || &warn("Can't redirect STDIN");
+    open( STDOUT,  ">&OUT" )    || &warn("Can't redirect STDOUT");
+
+    # XXX: using csh or tcsh destroys sigint retvals!
+    system(@_);
+    open( STDIN,  "<&SAVEIN" )  || &warn("Can't restore STDIN");
+    open( STDOUT, ">&SAVEOUT" ) || &warn("Can't restore STDOUT");
+    close(SAVEIN);
+    close(SAVEOUT);
+
+    # most of the $? crud was coping with broken cshisms
+    if ( $? >> 8 ) {
+        &warn( "(Command exited ", ( $? >> 8 ), ")\n" );
+    }
+    elsif ($?) {
+        &warn(
+            "(Command died of SIG#",
+            ( $? & 127 ),
+            ( ( $? & 128 ) ? " -- core dumped" : "" ),
+            ")", "\n"
+        );
+    } ## end elsif ($?)
+
+    return $?;
+
+} ## end sub system
+
+=head1 TTY MANAGEMENT
+
+The subs here do some of the terminal management for multiple debuggers.
+
+=head2 setterm
+
+Top-level function called when we want to set up a new terminal for use
+by the debugger.
+
+If the C<noTTY> debugger option was set, we'll either use the terminal
+supplied (the value of the C<noTTY> option), or we'll use C<Term::Rendezvous>
+to find one. If we're a forked debugger, we call C<resetterm> to try to 
+get a whole new terminal if we can. 
+
+In either case, we set up the terminal next. If the C<ReadLine> option was
+true, we'll get a C<Term::ReadLine> object for the current terminal and save
+the appropriate attributes. We then 
+
+=cut
+
+sub setterm {
+
+    # Load Term::Readline, but quietly; don't debug it and don't trace it.
+    local $frame = 0;
+    local $doret = -2;
+    eval { require Term::ReadLine } or die $@;
+
+    # If noTTY is set, but we have a TTY name, go ahead and hook up to it.
+    if ($notty) {
+        if ($tty) {
+            my ( $i, $o ) = split $tty, /,/;
+            $o = $i unless defined $o;
+            open( IN,  "<$i" ) or die "Cannot open TTY `$i' for read: $!";
+            open( OUT, ">$o" ) or die "Cannot open TTY `$o' for write: $!";
+            $IN  = \*IN;
+            $OUT = \*OUT;
+            my $sel = select($OUT);
+            $| = 1;
+            select($sel);
+        } ## end if ($tty)
+
+        # We don't have a TTY - try to find one via Term::Rendezvous.
+        else {
+            eval "require Term::Rendezvous;" or die;
+
+            # See if we have anything to pass to Term::Rendezvous.
+            # Use $HOME/.perldbtty$$ if not.
+            my $rv = $ENV{PERLDB_NOTTY} || "$ENV{HOME}/.perldbtty$$";
+
+            # Rendezvous and get the filehandles.
+            my $term_rv = new Term::Rendezvous $rv;
+            $IN  = $term_rv->IN;
+            $OUT = $term_rv->OUT;
+        } ## end else [ if ($tty)
+    } ## end if ($notty)
+
+    # We're a daughter debugger. Try to fork off another TTY.
+    if ( $term_pid eq '-1' ) {    # In a TTY with another debugger
+        resetterm(2);
+    }
+
+    # If we shouldn't use Term::ReadLine, don't.
+    if ( !$rl ) {
+        $term = new Term::ReadLine::Stub 'perldb', $IN, $OUT;
+    }
+
+    # We're using Term::ReadLine. Get all the attributes for this terminal.
+    else {
+        $term = new Term::ReadLine 'perldb', $IN, $OUT;
+
+        $rl_attribs = $term->Attribs;
+        $rl_attribs->{basic_word_break_characters} .= '-:+/*,[])}'
+          if defined $rl_attribs->{basic_word_break_characters}
+          and index( $rl_attribs->{basic_word_break_characters}, ":" ) == -1;
+        $rl_attribs->{special_prefixes} = '$@&%';
+        $rl_attribs->{completer_word_break_characters} .= '$@&%';
+        $rl_attribs->{completion_function} = \&db_complete;
+    } ## end else [ if (!$rl)
+
+    # Set up the LINEINFO filehandle.
+    $LINEINFO = $OUT     unless defined $LINEINFO;
+    $lineinfo = $console unless defined $lineinfo;
+
+    $term->MinLine(2);
+
+    if ( $term->Features->{setHistory} and "@hist" ne "?" ) {
+        $term->SetHistory(@hist);
+    }
+
+    # XXX Ornaments are turned on unconditionally, which is not
+    # always a good thing.
+    ornaments($ornaments) if defined $ornaments;
+    $term_pid = $$;
+} ## end sub setterm
+
+=head1 GET_FORK_TTY EXAMPLE FUNCTIONS
+
+When the process being debugged forks, or the process invokes a command
+via C<system()> which starts a new debugger, we need to be able to get a new
+C<IN> and C<OUT> filehandle for the new debugger. Otherwise, the two processes
+fight over the terminal, and you can never quite be sure who's going to get the
+input you're typing.
+
+C<get_fork_TTY> is a glob-aliased function which calls the real function that 
+is tasked with doing all the necessary operating system mojo to get a new 
+TTY (and probably another window) and to direct the new debugger to read and
+write there.
+
+The debugger provides C<get_fork_TTY> functions which work for X Windows and
+OS/2. Other systems are not supported. You are encouraged to write 
+C<get_fork_TTY> functions which work for I<your> platform and contribute them.
+
+=head3 C<xterm_get_fork_TTY>
+
+This function provides the C<get_fork_TTY> function for X windows. If a 
+program running under the debugger forks, a new <xterm> window is opened and
+the subsidiary debugger is directed there.
+
+The C<open()> call is of particular note here. We have the new C<xterm>
+we're spawning route file number 3 to STDOUT, and then execute the C<tty> 
+command (which prints the device name of the TTY we'll want to use for input 
+and output to STDOUT, then C<sleep> for a very long time, routing this output
+to file number 3. This way we can simply read from the <XT> filehandle (which
+is STDOUT from the I<commands> we ran) to get the TTY we want to use. 
+
+Only works if C<xterm> is in your path and C<$ENV{DISPLAY}>, etc. are 
+properly set up.
+
+=cut
+
+sub xterm_get_fork_TTY {
+    ( my $name = $0 ) =~ s,^.*[/\\],,s;
+    open XT,
+qq[3>&1 xterm -title "Daughter Perl debugger $pids $name" -e sh -c 'tty 1>&3;\
+ sleep 10000000' |];
+
+    # Get the output from 'tty' and clean it up a little.
+    my $tty = <XT>;
+    chomp $tty;
+
+    $pidprompt = '';    # Shown anyway in titlebar
+
+    # There's our new TTY.
+    return $tty;
+} ## end sub xterm_get_fork_TTY
+
+=head3 C<os2_get_fork_TTY>
+
+XXX It behooves an OS/2 expert to write the necessary documentation for this!
+
+=cut
+
+# This example function resets $IN, $OUT itself
+sub os2_get_fork_TTY {
+    local $^F = 40;    # XXXX Fixme!
+    local $\  = '';
+    my ( $in1, $out1, $in2, $out2 );
+
+    # Having -d in PERL5OPT would lead to a disaster...
+    local $ENV{PERL5OPT} = $ENV{PERL5OPT} if $ENV{PERL5OPT};
+    $ENV{PERL5OPT} =~ s/(?:^|(?<=\s))-d\b//  if $ENV{PERL5OPT};
+    $ENV{PERL5OPT} =~ s/(?:^|(?<=\s))-d\B/-/ if $ENV{PERL5OPT};
+    print $OUT "Making kid PERL5OPT->`$ENV{PERL5OPT}'.\n" if $ENV{PERL5OPT};
+    local $ENV{PERL5LIB} = $ENV{PERL5LIB} ? $ENV{PERL5LIB} : $ENV{PERLLIB};
+    $ENV{PERL5LIB} = '' unless defined $ENV{PERL5LIB};
+    $ENV{PERL5LIB} = join ';', @ini_INC, split /;/, $ENV{PERL5LIB};
+    ( my $name = $0 ) =~ s,^.*[/\\],,s;
+    my @args;
+
+    if (
+            pipe $in1, $out1
+        and pipe $in2, $out2
+
+        # system P_SESSION will fail if there is another process
+        # in the same session with a "dependent" asynchronous child session.
+        and @args = (
+            $rl, fileno $in1, fileno $out2, "Daughter Perl debugger $pids $name"
+        )
+        and (
+            ( $kpid = CORE::system 4, $^X, '-we',
+                <<'ES', @args ) >= 0    # P_SESSION
+END {sleep 5 unless $loaded}
+BEGIN {open STDIN,  '</dev/con' or warn "reopen stdin: $!"}
+use OS2::Process;
+
+my ($rl, $in) = (shift, shift);        # Read from $in and pass through
+set_title pop;
+system P_NOWAIT, $^X, '-we', <<EOS or die "Cannot start a grandkid";
+  open IN, '<&=$in' or die "open <&=$in: \$!";
+  \$| = 1; print while sysread IN, \$_, 1<<16;
+EOS
+
+my $out = shift;
+open OUT, ">&=$out" or die "Cannot open &=$out for writing: $!";
+select OUT;    $| = 1;
+require Term::ReadKey if $rl;
+Term::ReadKey::ReadMode(4) if $rl; # Nodelay on kbd.  Pipe is automatically nodelay...
+print while sysread STDIN, $_, 1<<($rl ? 16 : 0);
+ES
+            or warn "system P_SESSION: $!, $^E" and 0
+        )
+        and close $in1
+        and close $out2
+      )
+    {
+        $pidprompt = '';    # Shown anyway in titlebar
+        reset_IN_OUT( $in2, $out1 );
+        $tty = '*reset*';
+        return '';          # Indicate that reset_IN_OUT is called
+    } ## end if (pipe $in1, $out1 and...
+    return;
+} ## end sub os2_get_fork_TTY
+
+=head2 C<create_IN_OUT($flags)>
+
+Create a new pair of filehandles, pointing to a new TTY. If impossible,
+try to diagnose why.
+
+Flags are:
+
+=over 4
+
+=item * 1 - Don't know how to create a new TTY.
+
+=item * 2 - Debugger has forked, but we can't get a new TTY.
+
+=item * 4 - standard debugger startup is happening.
+
+=back
+
+=cut
+
+sub create_IN_OUT {    # Create a window with IN/OUT handles redirected there
+
+    # If we know how to get a new TTY, do it! $in will have
+    # the TTY name if get_fork_TTY works.
+    my $in = &get_fork_TTY if defined &get_fork_TTY;
+
+    # It used to be that
+    $in = $fork_TTY if defined $fork_TTY;    # Backward compatibility
+
+    if ( not defined $in ) {
+        my $why = shift;
+
+        # We don't know how.
+        print_help(<<EOP) if $why == 1;
+I<#########> Forked, but do not know how to create a new B<TTY>. I<#########>
+EOP
+
+        # Forked debugger.
+        print_help(<<EOP) if $why == 2;
+I<#########> Daughter session, do not know how to change a B<TTY>. I<#########>
+  This may be an asynchronous session, so the parent debugger may be active.
+EOP
+
+        # Note that both debuggers are fighting over the same input.
+        print_help(<<EOP) if $why != 4;
+  Since two debuggers fight for the same TTY, input is severely entangled.
+
+EOP
+        print_help(<<EOP);
+  I know how to switch the output to a different window in xterms
+  and OS/2 consoles only.  For a manual switch, put the name of the created I<TTY>
+  in B<\$DB::fork_TTY>, or define a function B<DB::get_fork_TTY()> returning this.
+
+  On I<UNIX>-like systems one can get the name of a I<TTY> for the given window
+  by typing B<tty>, and disconnect the I<shell> from I<TTY> by B<sleep 1000000>.
+
+EOP
+    } ## end if (not defined $in)
+    elsif ( $in ne '' ) {
+        TTY($in);
+    }
+    else {
+        $console = '';    # Indicate no need to open-from-the-console
+    }
+    undef $fork_TTY;
+} ## end sub create_IN_OUT
+
+=head2 C<resetterm>
+
+Handles rejiggering the prompt when we've forked off a new debugger.
+
+If the new debugger happened because of a C<system()> that invoked a 
+program under the debugger, the arrow between the old pid and the new
+in the prompt has I<two> dashes instead of one.
+
+We take the current list of pids and add this one to the end. If there
+isn't any list yet, we make one up out of the initial pid associated with 
+the terminal and our new pid, sticking an arrow (either one-dashed or 
+two dashed) in between them.
+
+If C<CreateTTY> is off, or C<resetterm> was called with no arguments,
+we don't try to create a new IN and OUT filehandle. Otherwise, we go ahead
+and try to do that.
+
+=cut
+
+sub resetterm {    # We forked, so we need a different TTY
+
+    # Needs to be passed to create_IN_OUT() as well.
+    my $in = shift;
+
+    # resetterm(2): got in here because of a system() starting a debugger.
+    # resetterm(1): just forked.
+    my $systemed = $in > 1 ? '-' : '';
+
+    # If there's already a list of pids, add this to the end.
+    if ($pids) {
+        $pids =~ s/\]/$systemed->$$]/;
+    }
+
+    # No pid list. Time to make one.
+    else {
+        $pids = "[$term_pid->$$]";
+    }
+
+    # The prompt we're going to be using for this debugger.
+    $pidprompt = $pids;
+
+    # We now 0wnz this terminal.
+    $term_pid = $$;
+
+    # Just return if we're not supposed to try to create a new TTY.
+    return unless $CreateTTY & $in;
+
+    # Try to create a new IN/OUT pair.
+    create_IN_OUT($in);
+} ## end sub resetterm
+
+=head2 C<readline>
+
+First, we handle stuff in the typeahead buffer. If there is any, we shift off
+the next line, print a message saying we got it, add it to the terminal
+history (if possible), and return it.
+
+If there's nothing in the typeahead buffer, check the command filehandle stack.
+If there are any filehandles there, read from the last one, and return the line
+if we got one. If not, we pop the filehandle off and close it, and try the
+next one up the stack.
+
+If we've emptied the filehandle stack, we check to see if we've got a socket 
+open, and we read that and return it if we do. If we don't, we just call the 
+core C<readline()> and return its value.
+
+=cut
+
+sub readline {
+
+    # Localize to prevent it from being smashed in the program being debugged.
+    local $.;
+
+    # Pull a line out of the typeahead if there's stuff there.
+    if (@typeahead) {
+
+        # How many lines left.
+        my $left = @typeahead;
+
+        # Get the next line.
+        my $got = shift @typeahead;
+
+        # Print a message saying we got input from the typeahead.
+        local $\ = '';
+        print $OUT "auto(-$left)", shift, $got, "\n";
+
+        # Add it to the terminal history (if possible).
+        $term->AddHistory($got)
+          if length($got) > 1
+          and defined $term->Features->{addHistory};
+        return $got;
+    } ## end if (@typeahead)
+
+    # We really need to read some input. Turn off entry/exit trace and
+    # return value printing.
+    local $frame = 0;
+    local $doret = -2;
+
+    # If there are stacked filehandles to read from ...
+    while (@cmdfhs) {
+
+        # Read from the last one in the stack.
+        my $line = CORE::readline( $cmdfhs[-1] );
+
+        # If we got a line ...
+        defined $line
+          ? ( print $OUT ">> $line" and return $line )    # Echo and return
+          : close pop @cmdfhs;                            # Pop and close
+    } ## end while (@cmdfhs)
+
+    # Nothing on the filehandle stack. Socket?
+    if ( ref $OUT and UNIVERSAL::isa( $OUT, 'IO::Socket::INET' ) ) {
+
+        # Send anyting we have to send.
+        $OUT->write( join( '', @_ ) );
+
+        # Receive anything there is to receive.
+        my $stuff;
+        $IN->recv( $stuff, 2048 );    # XXX "what's wrong with sysread?"
+                                      # XXX Don't know. You tell me.
+
+        # What we got.
+        $stuff;
+    } ## end if (ref $OUT and UNIVERSAL::isa...
+
+    # No socket. Just read from the terminal.
+    else {
+        $term->readline(@_);
+    }
+} ## end sub readline
+
+=head1 OPTIONS SUPPORT ROUTINES
+
+These routines handle listing and setting option values.
+
+=head2 C<dump_option> - list the current value of an option setting
+
+This routine uses C<option_val> to look up the value for an option.
+It cleans up escaped single-quotes and then displays the option and
+its value.
+
+=cut
+
+sub dump_option {
+    my ( $opt, $val ) = @_;
+    $val = option_val( $opt, 'N/A' );
+    $val =~ s/([\\\'])/\\$1/g;
+    printf $OUT "%20s = '%s'\n", $opt, $val;
+} ## end sub dump_option
+
+sub options2remember {
+    foreach my $k (@RememberOnROptions) {
+        $option{$k} = option_val( $k, 'N/A' );
+    }
+    return %option;
+}
+
+=head2 C<option_val> - find the current value of an option
+
+This can't just be a simple hash lookup because of the indirect way that
+the option values are stored. Some are retrieved by calling a subroutine,
+some are just variables.
+
+You must supply a default value to be used in case the option isn't set.
+
+=cut
+
+sub option_val {
+    my ( $opt, $default ) = @_;
+    my $val;
+
+    # Does this option exist, and is it a variable?
+    # If so, retrieve the value via the value in %optionVars.
+    if (    defined $optionVars{$opt}
+        and defined ${ $optionVars{$opt} } )
+    {
+        $val = ${ $optionVars{$opt} };
+    }
+
+    # Does this option exist, and it's a subroutine?
+    # If so, call the subroutine via the ref in %optionAction
+    # and capture the value.
+    elsif ( defined $optionAction{$opt}
+        and defined &{ $optionAction{$opt} } )
+    {
+        $val = &{ $optionAction{$opt} }();
+    }
+
+    # If there's an action or variable for the supplied option,
+    # but no value was set, use the default.
+    elsif (defined $optionAction{$opt} and not defined $option{$opt}
+        or defined $optionVars{$opt} and not defined ${ $optionVars{$opt} } )
+    {
+        $val = $default;
+    }
+
+    # Otherwise, do the simple hash lookup.
+    else {
+        $val = $option{$opt};
+    }
+
+    # If the value isn't defined, use the default.
+    # Then return whatever the value is.
+    $val = $default unless defined $val;
+    $val;
+} ## end sub option_val
+
+=head2 C<parse_options>
+
+Handles the parsing and execution of option setting/displaying commands.
+
+An option entered by itself is assumed to be I<set me to 1> (the default value)
+if the option is a boolean one. If not, the user is prompted to enter a valid
+value or to query the current value (via C<option? >).
+
+If C<option=value> is entered, we try to extract a quoted string from the
+value (if it is quoted). If it's not, we just use the whole value as-is.
+
+We load any modules required to service this option, and then we set it: if
+it just gets stuck in a variable, we do that; if there's a subroutine to 
+handle setting the option, we call that.
+
+Finally, if we're running in interactive mode, we display the effect of the
+user's command back to the terminal, skipping this if we're setting things
+during initialization.
+
+=cut
+
+sub parse_options {
+    local ($_) = @_;
+    local $\ = '';
+
+    # These options need a value. Don't allow them to be clobbered by accident.
+    my %opt_needs_val = map { ( $_ => 1 ) } qw{
+      dumpDepth arrayDepth hashDepth LineInfo maxTraceLen ornaments windowSize
+      pager quote ReadLine recallCommand RemotePort ShellBang TTY CommandSet
+    };
+
+    while (length) {
+        my $val_defaulted;
+
+        # Clean off excess leading whitespace.
+        s/^\s+// && next;
+
+        # Options are always all word characters, followed by a non-word
+        # separator.
+        s/^(\w+)(\W?)// or print( $OUT "Invalid option `$_'\n" ), last;
+        my ( $opt, $sep ) = ( $1, $2 );
+
+        # Make sure that such an option exists.
+        my $matches = grep( /^\Q$opt/ && ( $option = $_ ), @options )
+          || grep( /^\Q$opt/i && ( $option = $_ ), @options );
+
+        print( $OUT "Unknown option `$opt'\n" ), next unless $matches;
+        print( $OUT "Ambiguous option `$opt'\n" ), next if $matches > 1;
+        my $val;
+
+        # '?' as separator means query, but must have whitespace after it.
+        if ( "?" eq $sep ) {
+            print( $OUT "Option query `$opt?' followed by non-space `$_'\n" ),
+              last
+              if /^\S/;
+
+            #&dump_option($opt);
+        } ## end if ("?" eq $sep)
+
+        # Separator is whitespace (or just a carriage return).
+        # They're going for a default, which we assume is 1.
+        elsif ( $sep !~ /\S/ ) {
+            $val_defaulted = 1;
+            $val           = "1";   #  this is an evil default; make 'em set it!
+        }
+
+        # Separator is =. Trying to set a value.
+        elsif ( $sep eq "=" ) {
+
+            # If quoted, extract a quoted string.
+            if (s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x) {
+                my $quote = $1;
+                ( $val = $2 ) =~ s/\\([$quote\\])/$1/g;
+            }
+
+            # Not quoted. Use the whole thing. Warn about 'option='.
+            else {
+                s/^(\S*)//;
+                $val = $1;
+                print OUT qq(Option better cleared using $opt=""\n)
+                  unless length $val;
+            } ## end else [ if (s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x)
+
+        } ## end elsif ($sep eq "=")
+
+        # "Quoted" with [], <>, or {}.
+        else {    #{ to "let some poor schmuck bounce on the % key in B<vi>."
+            my ($end) =
+              "\\" . substr( ")]>}$sep", index( "([<{", $sep ), 1 );    #}
+            s/^(([^\\$end]|\\[\\$end])*)$end($|\s+)//
+              or print( $OUT "Unclosed option value `$opt$sep$_'\n" ), last;
+            ( $val = $1 ) =~ s/\\([\\$end])/$1/g;
+        } ## end else [ if ("?" eq $sep)
+
+        # Exclude non-booleans from getting set to 1 by default.
+        if ( $opt_needs_val{$option} && $val_defaulted ) {
+            my $cmd = ( $CommandSet eq '580' ) ? 'o' : 'O';
+            print $OUT
+"Option `$opt' is non-boolean.  Use `$cmd $option=VAL' to set, `$cmd $option?' to query\n";
+            next;
+        } ## end if ($opt_needs_val{$option...
+
+        # Save the option value.
+        $option{$option} = $val if defined $val;
+
+        # Load any module that this option requires.
+        eval qq{
+                local \$frame = 0; 
+                local \$doret = -2; 
+                require '$optionRequire{$option}';
+                1;
+               } || die    # XXX: shouldn't happen
+          if defined $optionRequire{$option}
+          && defined $val;
+
+        # Set it.
+        # Stick it in the proper variable if it goes in a variable.
+        ${ $optionVars{$option} } = $val
+          if defined $optionVars{$option}
+          && defined $val;
+
+        # Call the appropriate sub if it gets set via sub.
+        &{ $optionAction{$option} }($val)
+          if defined $optionAction{$option}
+          && defined &{ $optionAction{$option} }
+          && defined $val;
+
+        # Not initialization - echo the value we set it to.
+        dump_option($option) unless $OUT eq \*STDERR;
+    } ## end while (length)
+} ## end sub parse_options
+
+=head1 RESTART SUPPORT
+
+These routines are used to store (and restore) lists of items in environment 
+variables during a restart.
+
+=head2 set_list
+
+Set_list packages up items to be stored in a set of environment variables
+(VAR_n, containing the number of items, and VAR_0, VAR_1, etc., containing
+the values). Values outside the standard ASCII charset are stored by encoding
+then as hexadecimal values.
+
+=cut
+
+sub set_list {
+    my ( $stem, @list ) = @_;
+    my $val;
+
+    # VAR_n: how many we have. Scalar assignment gets the number of items.
+    $ENV{"${stem}_n"} = @list;
+
+    # Grab each item in the list, escape the backslashes, encode the non-ASCII
+    # as hex, and then save in the appropriate VAR_0, VAR_1, etc.
+    for $i ( 0 .. $#list ) {
+        $val = $list[$i];
+        $val =~ s/\\/\\\\/g;
+        $val =~ s/([\0-\37\177\200-\377])/"\\0x" . unpack('H2',$1)/eg;
+        $ENV{"${stem}_$i"} = $val;
+    } ## end for $i (0 .. $#list)
+} ## end sub set_list
+
+=head2 get_list
+
+Reverse the set_list operation: grab VAR_n to see how many we should be getting
+back, and then pull VAR_0, VAR_1. etc. back out.
+
+=cut 
+
+sub get_list {
+    my $stem = shift;
+    my @list;
+    my $n = delete $ENV{"${stem}_n"};
+    my $val;
+    for $i ( 0 .. $n - 1 ) {
+        $val = delete $ENV{"${stem}_$i"};
+        $val =~ s/\\((\\)|0x(..))/ $2 ? $2 : pack('H2', $3) /ge;
+        push @list, $val;
+    }
+    @list;
+} ## end sub get_list
+
+=head1 MISCELLANEOUS SIGNAL AND I/O MANAGEMENT
+
+=head2 catch()
+
+The C<catch()> subroutine is the essence of fast and low-impact. We simply
+set an already-existing global scalar variable to a constant value. This 
+avoids allocating any memory possibly in the middle of something that will
+get all confused if we do, particularly under I<unsafe signals>.
+
+=cut
+
+sub catch {
+    $signal = 1;
+    return;    # Put nothing on the stack - malloc/free land!
+}
+
+=head2 C<warn()>
+
+C<warn> emits a warning, by joining together its arguments and printing
+them, with couple of fillips.
+
+If the composited message I<doesn't> end with a newline, we automatically 
+add C<$!> and a newline to the end of the message. The subroutine expects $OUT 
+to be set to the filehandle to be used to output warnings; it makes no 
+assumptions about what filehandles are available.
+
+=cut
+
+sub warn {
+    my ($msg) = join( "", @_ );
+    $msg .= ": $!\n" unless $msg =~ /\n$/;
+    local $\ = '';
+    print $OUT $msg;
+} ## end sub warn
+
+=head1 INITIALIZATION TTY SUPPORT
+
+=head2 C<reset_IN_OUT>
+
+This routine handles restoring the debugger's input and output filehandles
+after we've tried and failed to move them elsewhere.  In addition, it assigns 
+the debugger's output filehandle to $LINEINFO if it was already open there.
+
+=cut
+
+sub reset_IN_OUT {
+    my $switch_li = $LINEINFO eq $OUT;
+
+    # If there's a term and it's able to get a new tty, try to get one.
+    if ( $term and $term->Features->{newTTY} ) {
+        ( $IN, $OUT ) = ( shift, shift );
+        $term->newTTY( $IN, $OUT );
+    }
+
+    # This term can't get a new tty now. Better luck later.
+    elsif ($term) {
+        &warn("Too late to set IN/OUT filehandles, enabled on next `R'!\n");
+    }
+
+    # Set the filehndles up as they were.
+    else {
+        ( $IN, $OUT ) = ( shift, shift );
+    }
+
+    # Unbuffer the output filehandle.
+    my $o = select $OUT;
+    $| = 1;
+    select $o;
+
+    # Point LINEINFO to the same output filehandle if it was there before.
+    $LINEINFO = $OUT if $switch_li;
+} ## end sub reset_IN_OUT
+
+=head1 OPTION SUPPORT ROUTINES
+
+The following routines are used to process some of the more complicated 
+debugger options.
+
+=head2 C<TTY>
+
+Sets the input and output filehandles to the specified files or pipes.
+If the terminal supports switching, we go ahead and do it. If not, and
+there's already a terminal in place, we save the information to take effect
+on restart.
+
+If there's no terminal yet (for instance, during debugger initialization),
+we go ahead and set C<$console> and C<$tty> to the file indicated.
+
+=cut
+
+sub TTY {
+    if ( @_ and $term and $term->Features->{newTTY} ) {
+
+        # This terminal supports switching to a new TTY.
+        # Can be a list of two files, or on string containing both names,
+        # comma-separated.
+        # XXX Should this perhaps be an assignment from @_?
+        my ( $in, $out ) = shift;
+        if ( $in =~ /,/ ) {
+
+            # Split list apart if supplied.
+            ( $in, $out ) = split /,/, $in, 2;
+        }
+        else {
+
+            # Use the same file for both input and output.
+            $out = $in;
+        }
+
+        # Open file onto the debugger's filehandles, if you can.
+        open IN,  $in     or die "cannot open `$in' for read: $!";
+        open OUT, ">$out" or die "cannot open `$out' for write: $!";
+
+        # Swap to the new filehandles.
+        reset_IN_OUT( \*IN, \*OUT );
+
+        # Save the setting for later.
+        return $tty = $in;
+    } ## end if (@_ and $term and $term...
+
+    # Terminal doesn't support new TTY, or doesn't support readline.
+    # Can't do it now, try restarting.
+    &warn("Too late to set TTY, enabled on next `R'!\n") if $term and @_;
+
+    # Useful if done through PERLDB_OPTS:
+    $console = $tty = shift if @_;
+
+    # Return whatever the TTY is.
+    $tty or $console;
+} ## end sub TTY
+
+=head2 C<noTTY>
+
+Sets the C<$notty> global, controlling whether or not the debugger tries to
+get a terminal to read from. If called after a terminal is already in place,
+we save the value to use it if we're restarted.
+
+=cut
+
+sub noTTY {
+    if ($term) {
+        &warn("Too late to set noTTY, enabled on next `R'!\n") if @_;
+    }
+    $notty = shift if @_;
+    $notty;
+} ## end sub noTTY
+
+=head2 C<ReadLine>
+
+Sets the C<$rl> option variable. If 0, we use C<Term::ReadLine::Stub> 
+(essentially, no C<readline> processing on this I<terminal>). Otherwise, we
+use C<Term::ReadLine>. Can't be changed after a terminal's in place; we save
+the value in case a restart is done so we can change it then.
+
+=cut
+
+sub ReadLine {
+    if ($term) {
+        &warn("Too late to set ReadLine, enabled on next `R'!\n") if @_;
+    }
+    $rl = shift if @_;
+    $rl;
+} ## end sub ReadLine
+
+=head2 C<RemotePort>
+
+Sets the port that the debugger will try to connect to when starting up.
+If the terminal's already been set up, we can't do it, but we remember the
+setting in case the user does a restart.
+
+=cut
+
+sub RemotePort {
+    if ($term) {
+        &warn("Too late to set RemotePort, enabled on next 'R'!\n") if @_;
+    }
+    $remoteport = shift if @_;
+    $remoteport;
+} ## end sub RemotePort
+
+=head2 C<tkRunning>
+
+Checks with the terminal to see if C<Tk> is running, and returns true or
+false. Returns false if the current terminal doesn't support C<readline>.
+
+=cut
+
+sub tkRunning {
+    if ( ${ $term->Features }{tkRunning} ) {
+        return $term->tkRunning(@_);
+    }
+    else {
+        local $\ = '';
+        print $OUT "tkRunning not supported by current ReadLine package.\n";
+        0;
+    }
+} ## end sub tkRunning
+
+=head2 C<NonStop>
+
+Sets nonstop mode. If a terminal's already been set up, it's too late; the
+debugger remembers the setting in case you restart, though.
+
+=cut
+
+sub NonStop {
+    if ($term) {
+        &warn("Too late to set up NonStop mode, enabled on next `R'!\n")
+          if @_;
+    }
+    $runnonstop = shift if @_;
+    $runnonstop;
+} ## end sub NonStop
+
+sub DollarCaretP {
+    if ($term) {
+        &warn("Some flag changes could not take effect until next 'R'!\n")
+          if @_;
+    }
+    $^P = parse_DollarCaretP_flags(shift) if @_;
+    expand_DollarCaretP_flags($^P);
+}
+
+sub OnlyAssertions {
+    if ($term) {
+        &warn("Too late to set up OnlyAssertions mode, enabled on next 'R'!\n")
+          if @_;
+    }
+    if (@_) {
+        unless ( defined $ini_assertion ) {
+            if ($term) {
+                &warn("Current Perl interpreter doesn't support assertions");
+            }
+            return 0;
+        }
+        if (shift) {
+            unless ($ini_assertion) {
+                print "Assertions will be active on next 'R'!\n";
+                $ini_assertion = 1;
+            }
+            $^P &= ~$DollarCaretP_flags{PERLDBf_SUB};
+            $^P |= $DollarCaretP_flags{PERLDBf_ASSERTION};
+        }
+        else {
+            $^P |= $DollarCaretP_flags{PERLDBf_SUB};
+        }
+    }
+    !( $^P & $DollarCaretP_flags{PERLDBf_SUB} ) || 0;
+}
+
+=head2 C<pager>
+
+Set up the C<$pager> variable. Adds a pipe to the front unless there's one
+there already.
+
+=cut
+
+sub pager {
+    if (@_) {
+        $pager = shift;
+        $pager = "|" . $pager unless $pager =~ /^(\+?\>|\|)/;
+    }
+    $pager;
+} ## end sub pager
+
+=head2 C<shellBang>
+
+Sets the shell escape command, and generates a printable copy to be used 
+in the help.
+
+=cut
+
+sub shellBang {
+
+    # If we got an argument, meta-quote it, and add '\b' if it
+    # ends in a word character.
+    if (@_) {
+        $sh = quotemeta shift;
+        $sh .= "\\b" if $sh =~ /\w$/;
+    }
+
+    # Generate the printable version for the help:
+    $psh = $sh;    # copy it
+    $psh =~ s/\\b$//;        # Take off trailing \b if any
+    $psh =~ s/\\(.)/$1/g;    # De-escape
+    $psh;                    # return the printable version
+} ## end sub shellBang
+
+=head2 C<ornaments>
+
+If the terminal has its own ornaments, fetch them. Otherwise accept whatever
+was passed as the argument. (This means you can't override the terminal's
+ornaments.)
+
+=cut 
+
+sub ornaments {
+    if ( defined $term ) {
+
+        # We don't want to show warning backtraces, but we do want die() ones.
+        local ( $warnLevel, $dieLevel ) = ( 0, 1 );
+
+        # No ornaments if the terminal doesn't support them.
+        return '' unless $term->Features->{ornaments};
+        eval { $term->ornaments(@_) } || '';
+    }
+
+    # Use what was passed in if we can't determine it ourselves.
+    else {
+        $ornaments = shift;
+    }
+} ## end sub ornaments
+
+=head2 C<recallCommand>
+
+Sets the recall command, and builds a printable version which will appear in
+the help text.
+
+=cut
+
+sub recallCommand {
+
+    # If there is input, metaquote it. Add '\b' if it ends with a word
+    # character.
+    if (@_) {
+        $rc = quotemeta shift;
+        $rc .= "\\b" if $rc =~ /\w$/;
+    }
+
+    # Build it into a printable version.
+    $prc = $rc;    # Copy it
+    $prc =~ s/\\b$//;        # Remove trailing \b
+    $prc =~ s/\\(.)/$1/g;    # Remove escapes
+    $prc;                    # Return the printable version
+} ## end sub recallCommand
+
+=head2 C<LineInfo> - where the line number information goes
+
+Called with no arguments, returns the file or pipe that line info should go to.
+
+Called with an argument (a file or a pipe), it opens that onto the 
+C<LINEINFO> filehandle, unbuffers the filehandle, and then returns the 
+file or pipe again to the caller.
+
+=cut
+
+sub LineInfo {
+    return $lineinfo unless @_;
+    $lineinfo = shift;
+
+    #  If this is a valid "thing to be opened for output", tack a
+    # '>' onto the front.
+    my $stream = ( $lineinfo =~ /^(\+?\>|\|)/ ) ? $lineinfo : ">$lineinfo";
+
+    # If this is a pipe, the stream points to a slave editor.
+    $slave_editor = ( $stream =~ /^\|/ );
+
+    # Open it up and unbuffer it.
+    open( LINEINFO, "$stream" ) || &warn("Cannot open `$stream' for write");
+    $LINEINFO = \*LINEINFO;
+    my $save = select($LINEINFO);
+    $| = 1;
+    select($save);
+
+    # Hand the file or pipe back again.
+    $lineinfo;
+} ## end sub LineInfo
+
+=head1 COMMAND SUPPORT ROUTINES
+
+These subroutines provide functionality for various commands.
+
+=head2 C<list_modules>
+
+For the C<M> command: list modules loaded and their versions.
+Essentially just runs through the keys in %INC, picks each package's
+C<$VERSION> variable, gets the file name, and formats the information
+for output.
+
+=cut
+
+sub list_modules {    # versions
+    my %version;
+    my $file;
+
+    # keys are the "as-loaded" name, values are the fully-qualified path
+    # to the file itself.
+    for ( keys %INC ) {
+        $file = $_;                                # get the module name
+        s,\.p[lm]$,,i;                             # remove '.pl' or '.pm'
+        s,/,::,g;                                  # change '/' to '::'
+        s/^perl5db$/DB/;                           # Special case: debugger
+                                                   # moves to package DB
+        s/^Term::ReadLine::readline$/readline/;    # simplify readline
+
+        # If the package has a $VERSION package global (as all good packages
+        # should!) decode it and save as partial message.
+        if ( defined ${ $_ . '::VERSION' } ) {
+            $version{$file} = "${ $_ . '::VERSION' } from ";
+        }
+
+        # Finish up the message with the file the package came from.
+        $version{$file} .= $INC{$file};
+    } ## end for (keys %INC)
+
+    # Hey, dumpit() formats a hash nicely, so why not use it?
+    dumpit( $OUT, \%version );
+} ## end sub list_modules
+
+=head2 C<sethelp()>
+
+Sets up the monster string used to format and print the help.
+
+=head3 HELP MESSAGE FORMAT
+
+The help message is a peculiar format unto itself; it mixes C<pod> I<ornaments>
+(C<< B<> >> C<< I<> >>) with tabs to come up with a format that's fairly
+easy to parse and portable, but which still allows the help to be a little
+nicer than just plain text.
+
+Essentially, you define the command name (usually marked up with C<< B<> >>
+and C<< I<> >>), followed by a tab, and then the descriptive text, ending in a
+newline. The descriptive text can also be marked up in the same way. If you
+need to continue the descriptive text to another line, start that line with
+just tabs and then enter the marked-up text.
+
+If you are modifying the help text, I<be careful>. The help-string parser is 
+not very sophisticated, and if you don't follow these rules it will mangle the 
+help beyond hope until you fix the string.
+
+=cut
+
+sub sethelp {
+
+    # XXX: make sure there are tabs between the command and explanation,
+    #      or print_help will screw up your formatting if you have
+    #      eeevil ornaments enabled.  This is an insane mess.
+
+    $help = "
+Help is currently only available for the new 5.8 command set. 
+No help is available for the old command set. 
+We assume you know what you're doing if you switch to it.
+
+B<T>        Stack trace.
+B<s> [I<expr>]    Single step [in I<expr>].
+B<n> [I<expr>]    Next, steps over subroutine calls [in I<expr>].
+<B<CR>>        Repeat last B<n> or B<s> command.
+B<r>        Return from current subroutine.
+B<c> [I<line>|I<sub>]    Continue; optionally inserts a one-time-only breakpoint
+        at the specified position.
+B<l> I<min>B<+>I<incr>    List I<incr>+1 lines starting at I<min>.
+B<l> I<min>B<->I<max>    List lines I<min> through I<max>.
+B<l> I<line>        List single I<line>.
+B<l> I<subname>    List first window of lines from subroutine.
+B<l> I<\$var>        List first window of lines from subroutine referenced by I<\$var>.
+B<l>        List next window of lines.
+B<->        List previous window of lines.
+B<v> [I<line>]    View window around I<line>.
+B<.>        Return to the executed line.
+B<f> I<filename>    Switch to viewing I<filename>. File must be already loaded.
+        I<filename> may be either the full name of the file, or a regular
+        expression matching the full file name:
+        B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file.
+        Evals (with saved bodies) are considered to be filenames:
+        B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval
+        (in the order of execution).
+B</>I<pattern>B</>    Search forwards for I<pattern>; final B</> is optional.
+B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
+B<L> [I<a|b|w>]        List actions and or breakpoints and or watch-expressions.
+B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
+B<t>        Toggle trace mode.
+B<t> I<expr>        Trace through execution of I<expr>.
+B<b>        Sets breakpoint on current line)
+B<b> [I<line>] [I<condition>]
+        Set breakpoint; I<line> defaults to the current execution line;
+        I<condition> breaks if it evaluates to true, defaults to '1'.
+B<b> I<subname> [I<condition>]
+        Set breakpoint at first line of subroutine.
+B<b> I<\$var>        Set breakpoint at first line of subroutine referenced by I<\$var>.
+B<b> B<load> I<filename> Set breakpoint on 'require'ing the given file.
+B<b> B<postpone> I<subname> [I<condition>]
+        Set breakpoint at first line of subroutine after 
+        it is compiled.
+B<b> B<compile> I<subname>
+        Stop after the subroutine is compiled.
+B<B> [I<line>]    Delete the breakpoint for I<line>.
+B<B> I<*>             Delete all breakpoints.
+B<a> [I<line>] I<command>
+        Set an action to be done before the I<line> is executed;
+        I<line> defaults to the current execution line.
+        Sequence is: check for breakpoint/watchpoint, print line
+        if necessary, do action, prompt user if necessary,
+        execute line.
+B<a>        Does nothing
+B<A> [I<line>]    Delete the action for I<line>.
+B<A> I<*>             Delete all actions.
+B<w> I<expr>        Add a global watch-expression.
+B<w>             Does nothing
+B<W> I<expr>        Delete a global watch-expression.
+B<W> I<*>             Delete all watch-expressions.
+B<V> [I<pkg> [I<vars>]]    List some (default all) variables in package (default current).
+        Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
+B<X> [I<vars>]    Same as \"B<V> I<currentpackage> [I<vars>]\".
+B<x> I<expr>        Evals expression in list context, dumps the result.
+B<m> I<expr>        Evals expression in list context, prints methods callable
+        on the first element of the result.
+B<m> I<class>        Prints methods callable via the given class.
+B<M>        Show versions of loaded modules.
+B<i> I<class>       Prints nested parents of given class.
+B<e>         Display current thread id.
+B<E>         Display all thread ids the current one will be identified: <n>.
+B<y> [I<n> [I<Vars>]]   List lexicals in higher scope <n>.  Vars same as B<V>.
+B<P> Something to do with assertions...
+
+B<<> ?            List Perl commands to run before each prompt.
+B<<> I<expr>        Define Perl command to run before each prompt.
+B<<<> I<expr>        Add to the list of Perl commands to run before each prompt.
+B<< *>                Delete the list of perl commands to run before each prompt.
+B<>> ?            List Perl commands to run after each prompt.
+B<>> I<expr>        Define Perl command to run after each prompt.
+B<>>B<>> I<expr>        Add to the list of Perl commands to run after each prompt.
+B<>>B< *>        Delete the list of Perl commands to run after each prompt.
+B<{> I<db_command>    Define debugger command to run before each prompt.
+B<{> ?            List debugger commands to run before each prompt.
+B<{{> I<db_command>    Add to the list of debugger commands to run before each prompt.
+B<{ *>             Delete the list of debugger commands to run before each prompt.
+B<$prc> I<number>    Redo a previous command (default previous command).
+B<$prc> I<-number>    Redo number'th-to-last command.
+B<$prc> I<pattern>    Redo last command that started with I<pattern>.
+        See 'B<O> I<recallCommand>' too.
+B<$psh$psh> I<cmd>      Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)"
+      . (
+        $rc eq $sh
+        ? ""
+        : "
+B<$psh> [I<cmd>] Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")."
+      ) . "
+        See 'B<O> I<shellBang>' too.
+B<source> I<file>     Execute I<file> containing debugger commands (may nest).
+B<save> I<file>       Save current debugger session (actual history) to I<file>.
+B<rerun>           Rerun session to current position.
+B<rerun> I<n>         Rerun session to numbered command.
+B<rerun> I<-n>        Rerun session to number'th-to-last command.
+B<H> I<-number>    Display last number commands (default all).
+B<H> I<*>          Delete complete history.
+B<p> I<expr>        Same as \"I<print {DB::OUT} expr>\" in current package.
+B<|>I<dbcmd>        Run debugger command, piping DB::OUT to current pager.
+B<||>I<dbcmd>        Same as B<|>I<dbcmd> but DB::OUT is temporarilly select()ed as well.
+B<\=> [I<alias> I<value>]    Define a command alias, or list current aliases.
+I<command>        Execute as a perl statement in current package.
+B<R>        Pure-man-restart of debugger, some of debugger state
+        and command-line options may be lost.
+        Currently the following settings are preserved:
+        history, breakpoints and actions, debugger B<O>ptions 
+        and the following command-line options: I<-w>, I<-I>, I<-e>.
+
+B<o> [I<opt>] ...    Set boolean option to true
+B<o> [I<opt>B<?>]    Query options
+B<o> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ... 
+        Set options.  Use quotes in spaces in value.
+    I<recallCommand>, I<ShellBang>    chars used to recall command or spawn shell;
+    I<pager>            program for output of \"|cmd\";
+    I<tkRunning>            run Tk while prompting (with ReadLine);
+    I<signalLevel> I<warnLevel> I<dieLevel>    level of verbosity;
+    I<inhibit_exit>        Allows stepping off the end of the script.
+    I<ImmediateStop>        Debugger should stop as early as possible.
+    I<RemotePort>            Remote hostname:port for remote debugging
+  The following options affect what happens with B<V>, B<X>, and B<x> commands:
+    I<arrayDepth>, I<hashDepth>     print only first N elements ('' for all);
+    I<compactDump>, I<veryCompact>     change style of array and hash dump;
+    I<globPrint>             whether to print contents of globs;
+    I<DumpDBFiles>         dump arrays holding debugged files;
+    I<DumpPackages>         dump symbol tables of packages;
+    I<DumpReused>             dump contents of \"reused\" addresses;
+    I<quote>, I<HighBit>, I<undefPrint>     change style of string dump;
+    I<bareStringify>         Do not print the overload-stringified value;
+  Other options include:
+    I<PrintRet>        affects printing of return value after B<r> command,
+    I<frame>        affects printing messages on subroutine entry/exit.
+    I<AutoTrace>    affects printing messages on possible breaking points.
+    I<maxTraceLen>    gives max length of evals/args listed in stack trace.
+    I<ornaments>     affects screen appearance of the command line.
+    I<CreateTTY>     bits control attempts to create a new TTY on events:
+            1: on fork()    2: debugger is started inside debugger
+            4: on startup
+    During startup options are initialized from \$ENV{PERLDB_OPTS}.
+    You can put additional initialization options I<TTY>, I<noTTY>,
+    I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use
+    `B<R>' after you set them).
+
+B<q> or B<^D>        Quit. Set B<\$DB::finished = 0> to debug global destruction.
+B<h>        Summary of debugger commands.
+B<h> [I<db_command>]    Get help [on a specific debugger command], enter B<|h> to page.
+B<h h>        Long help for debugger commands
+B<$doccmd> I<manpage>    Runs the external doc viewer B<$doccmd> command on the 
+        named Perl I<manpage>, or on B<$doccmd> itself if omitted.
+        Set B<\$DB::doccmd> to change viewer.
+
+Type `|h h' for a paged display if this was too hard to read.
+
+";    # Fix balance of vi % matching: }}}}
+
+    #  note: tabs in the following section are not-so-helpful
+    $summary = <<"END_SUM";
+I<List/search source lines:>               I<Control script execution:>
+  B<l> [I<ln>|I<sub>]  List source code            B<T>           Stack trace
+  B<-> or B<.>      List previous/current line  B<s> [I<expr>]    Single step [in expr]
+  B<v> [I<line>]    View around line            B<n> [I<expr>]    Next, steps over subs
+  B<f> I<filename>  View source in file         <B<CR>/B<Enter>>  Repeat last B<n> or B<s>
+  B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
+  B<M>           Show module versions        B<c> [I<ln>|I<sub>]  Continue until position
+I<Debugger controls:>                        B<L>           List break/watch/actions
+  B<o> [...]     Set debugger options        B<t> [I<expr>]    Toggle trace [trace expr]
+  B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
+  B<$prc> [I<N>|I<pat>]   Redo a previous command     B<B> I<ln|*>      Delete a/all breakpoints
+  B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  Do cmd before line
+  B<=> [I<a> I<val>]   Define/list an alias        B<A> I<ln|*>      Delete a/all actions
+  B<h> [I<db_cmd>]  Get help on command         B<w> I<expr>      Add a watch expression
+  B<h h>         Complete help page          B<W> I<expr|*>    Delete a/all watch exprs
+  B<|>[B<|>]I<db_cmd>  Send output to pager        B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
+  B<q> or B<^D>     Quit                        B<R>           Attempt a restart
+I<Data Examination:>     B<expr>     Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
+  B<x>|B<m> I<expr>       Evals expr in list context, dumps the result or lists methods.
+  B<p> I<expr>         Print expression (uses script's current package).
+  B<S> [[B<!>]I<pat>]     List subroutine names [not] matching pattern
+  B<V> [I<Pk> [I<Vars>]]  List Variables in Package.  Vars can be ~pattern or !pattern.
+  B<X> [I<Vars>]       Same as \"B<V> I<current_package> [I<Vars>]\".  B<i> I<class> inheritance tree.
+  B<y> [I<n> [I<Vars>]]   List lexicals in higher scope <n>.  Vars same as B<V>.
+  B<e>     Display thread id     B<E> Display all thread ids.
+For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs.
+END_SUM
+
+    # ')}}; # Fix balance of vi % matching
+
+    # and this is really numb...
+    $pre580_help = "
+B<T>        Stack trace.
+B<s> [I<expr>]    Single step [in I<expr>].
+B<n> [I<expr>]    Next, steps over subroutine calls [in I<expr>].
+B<CR>>        Repeat last B<n> or B<s> command.
+B<r>        Return from current subroutine.
+B<c> [I<line>|I<sub>]    Continue; optionally inserts a one-time-only breakpoint
+        at the specified position.
+B<l> I<min>B<+>I<incr>    List I<incr>+1 lines starting at I<min>.
+B<l> I<min>B<->I<max>    List lines I<min> through I<max>.
+B<l> I<line>        List single I<line>.
+B<l> I<subname>    List first window of lines from subroutine.
+B<l> I<\$var>        List first window of lines from subroutine referenced by I<\$var>.
+B<l>        List next window of lines.
+B<->        List previous window of lines.
+B<w> [I<line>]    List window around I<line>.
+B<.>        Return to the executed line.
+B<f> I<filename>    Switch to viewing I<filename>. File must be already loaded.
+        I<filename> may be either the full name of the file, or a regular
+        expression matching the full file name:
+        B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file.
+        Evals (with saved bodies) are considered to be filenames:
+        B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval
+        (in the order of execution).
+B</>I<pattern>B</>    Search forwards for I<pattern>; final B</> is optional.
+B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
+B<L>        List all breakpoints and actions.
+B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
+B<t>        Toggle trace mode.
+B<t> I<expr>        Trace through execution of I<expr>.
+B<b> [I<line>] [I<condition>]
+        Set breakpoint; I<line> defaults to the current execution line;
+        I<condition> breaks if it evaluates to true, defaults to '1'.
+B<b> I<subname> [I<condition>]
+        Set breakpoint at first line of subroutine.
+B<b> I<\$var>        Set breakpoint at first line of subroutine referenced by I<\$var>.
+B<b> B<load> I<filename> Set breakpoint on `require'ing the given file.
+B<b> B<postpone> I<subname> [I<condition>]
+        Set breakpoint at first line of subroutine after 
+        it is compiled.
+B<b> B<compile> I<subname>
+        Stop after the subroutine is compiled.
+B<d> [I<line>]    Delete the breakpoint for I<line>.
+B<D>        Delete all breakpoints.
+B<a> [I<line>] I<command>
+        Set an action to be done before the I<line> is executed;
+        I<line> defaults to the current execution line.
+        Sequence is: check for breakpoint/watchpoint, print line
+        if necessary, do action, prompt user if necessary,
+        execute line.
+B<a> [I<line>]    Delete the action for I<line>.
+B<A>        Delete all actions.
+B<W> I<expr>        Add a global watch-expression.
+B<W>        Delete all watch-expressions.
+B<V> [I<pkg> [I<vars>]]    List some (default all) variables in package (default current).
+        Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
+B<X> [I<vars>]    Same as \"B<V> I<currentpackage> [I<vars>]\".
+B<x> I<expr>        Evals expression in list context, dumps the result.
+B<m> I<expr>        Evals expression in list context, prints methods callable
+        on the first element of the result.
+B<m> I<class>        Prints methods callable via the given class.
+
+B<<> ?            List Perl commands to run before each prompt.
+B<<> I<expr>        Define Perl command to run before each prompt.
+B<<<> I<expr>        Add to the list of Perl commands to run before each prompt.
+B<>> ?            List Perl commands to run after each prompt.
+B<>> I<expr>        Define Perl command to run after each prompt.
+B<>>B<>> I<expr>        Add to the list of Perl commands to run after each prompt.
+B<{> I<db_command>    Define debugger command to run before each prompt.
+B<{> ?            List debugger commands to run before each prompt.
+B<{{> I<db_command>    Add to the list of debugger commands to run before each prompt.
+B<$prc> I<number>    Redo a previous command (default previous command).
+B<$prc> I<-number>    Redo number'th-to-last command.
+B<$prc> I<pattern>    Redo last command that started with I<pattern>.
+        See 'B<O> I<recallCommand>' too.
+B<$psh$psh> I<cmd>      Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)"
+      . (
+        $rc eq $sh
+        ? ""
+        : "
+B<$psh> [I<cmd>]     Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")."
+      ) . "
+        See 'B<O> I<shellBang>' too.
+B<source> I<file>        Execute I<file> containing debugger commands (may nest).
+B<H> I<-number>    Display last number commands (default all).
+B<p> I<expr>        Same as \"I<print {DB::OUT} expr>\" in current package.
+B<|>I<dbcmd>        Run debugger command, piping DB::OUT to current pager.
+B<||>I<dbcmd>        Same as B<|>I<dbcmd> but DB::OUT is temporarilly select()ed as well.
+B<\=> [I<alias> I<value>]    Define a command alias, or list current aliases.
+I<command>        Execute as a perl statement in current package.
+B<v>        Show versions of loaded modules.
+B<R>        Pure-man-restart of debugger, some of debugger state
+        and command-line options may be lost.
+        Currently the following settings are preserved:
+        history, breakpoints and actions, debugger B<O>ptions 
+        and the following command-line options: I<-w>, I<-I>, I<-e>.
+
+B<O> [I<opt>] ...    Set boolean option to true
+B<O> [I<opt>B<?>]    Query options
+B<O> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ... 
+        Set options.  Use quotes in spaces in value.
+    I<recallCommand>, I<ShellBang>    chars used to recall command or spawn shell;
+    I<pager>            program for output of \"|cmd\";
+    I<tkRunning>            run Tk while prompting (with ReadLine);
+    I<signalLevel> I<warnLevel> I<dieLevel>    level of verbosity;
+    I<inhibit_exit>        Allows stepping off the end of the script.
+    I<ImmediateStop>        Debugger should stop as early as possible.
+    I<RemotePort>            Remote hostname:port for remote debugging
+  The following options affect what happens with B<V>, B<X>, and B<x> commands:
+    I<arrayDepth>, I<hashDepth>     print only first N elements ('' for all);
+    I<compactDump>, I<veryCompact>     change style of array and hash dump;
+    I<globPrint>             whether to print contents of globs;
+    I<DumpDBFiles>         dump arrays holding debugged files;
+    I<DumpPackages>         dump symbol tables of packages;
+    I<DumpReused>             dump contents of \"reused\" addresses;
+    I<quote>, I<HighBit>, I<undefPrint>     change style of string dump;
+    I<bareStringify>         Do not print the overload-stringified value;
+  Other options include:
+    I<PrintRet>        affects printing of return value after B<r> command,
+    I<frame>        affects printing messages on subroutine entry/exit.
+    I<AutoTrace>    affects printing messages on possible breaking points.
+    I<maxTraceLen>    gives max length of evals/args listed in stack trace.
+    I<ornaments>     affects screen appearance of the command line.
+    I<CreateTTY>     bits control attempts to create a new TTY on events:
+            1: on fork()    2: debugger is started inside debugger
+            4: on startup
+    During startup options are initialized from \$ENV{PERLDB_OPTS}.
+    You can put additional initialization options I<TTY>, I<noTTY>,
+    I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use
+    `B<R>' after you set them).
+
+B<q> or B<^D>        Quit. Set B<\$DB::finished = 0> to debug global destruction.
+B<h> [I<db_command>]    Get help [on a specific debugger command], enter B<|h> to page.
+B<h h>        Summary of debugger commands.
+B<$doccmd> I<manpage>    Runs the external doc viewer B<$doccmd> command on the 
+        named Perl I<manpage>, or on B<$doccmd> itself if omitted.
+        Set B<\$DB::doccmd> to change viewer.
+
+Type `|h' for a paged display if this was too hard to read.
+
+";    # Fix balance of vi % matching: }}}}
+
+    #  note: tabs in the following section are not-so-helpful
+    $pre580_summary = <<"END_SUM";
+I<List/search source lines:>               I<Control script execution:>
+  B<l> [I<ln>|I<sub>]  List source code            B<T>           Stack trace
+  B<-> or B<.>      List previous/current line  B<s> [I<expr>]    Single step [in expr]
+  B<w> [I<line>]    List around line            B<n> [I<expr>]    Next, steps over subs
+  B<f> I<filename>  View source in file         <B<CR>/B<Enter>>  Repeat last B<n> or B<s>
+  B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
+  B<v>           Show versions of modules    B<c> [I<ln>|I<sub>]  Continue until position
+I<Debugger controls:>                        B<L>           List break/watch/actions
+  B<O> [...]     Set debugger options        B<t> [I<expr>]    Toggle trace [trace expr]
+  B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
+  B<$prc> [I<N>|I<pat>]   Redo a previous command     B<d> [I<ln>] or B<D> Delete a/all breakpoints
+  B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  Do cmd before line
+  B<=> [I<a> I<val>]   Define/list an alias        B<W> I<expr>      Add a watch expression
+  B<h> [I<db_cmd>]  Get help on command         B<A> or B<W>      Delete all actions/watch
+  B<|>[B<|>]I<db_cmd>  Send output to pager        B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
+  B<q> or B<^D>     Quit                        B<R>           Attempt a restart
+I<Data Examination:>     B<expr>     Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
+  B<x>|B<m> I<expr>       Evals expr in list context, dumps the result or lists methods.
+  B<p> I<expr>         Print expression (uses script's current package).
+  B<S> [[B<!>]I<pat>]     List subroutine names [not] matching pattern
+  B<V> [I<Pk> [I<Vars>]]  List Variables in Package.  Vars can be ~pattern or !pattern.
+  B<X> [I<Vars>]       Same as \"B<V> I<current_package> [I<Vars>]\".
+  B<y> [I<n> [I<Vars>]]   List lexicals in higher scope <n>.  Vars same as B<V>.
+For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs.
+END_SUM
+
+    # ')}}; # Fix balance of vi % matching
+
+} ## end sub sethelp
+
+=head2 C<print_help()>
+
+Most of what C<print_help> does is just text formatting. It finds the
+C<B> and C<I> ornaments, cleans them off, and substitutes the proper
+terminal control characters to simulate them (courtesy of 
+C<Term::ReadLine::TermCap>).
+
+=cut
+
+sub print_help {
+    local $_ = shift;
+
+    # Restore proper alignment destroyed by eeevil I<> and B<>
+    # ornaments: A pox on both their houses!
+    #
+    # A help command will have everything up to and including
+    # the first tab sequence padded into a field 16 (or if indented 20)
+    # wide.  If it's wider than that, an extra space will be added.
+    s{
+        ^                       # only matters at start of line
+          ( \040{4} | \t )*     # some subcommands are indented
+          ( < ?                 # so <CR> works
+            [BI] < [^\t\n] + )  # find an eeevil ornament
+          ( \t+ )               # original separation, discarded
+          ( .* )                # this will now start (no earlier) than 
+                                # column 16
+    } {
+        my($leadwhite, $command, $midwhite, $text) = ($1, $2, $3, $4);
+        my $clean = $command;
+        $clean =~ s/[BI]<([^>]*)>/$1/g;  
+
+        # replace with this whole string:
+        ($leadwhite ? " " x 4 : "")
+      . $command
+      . ((" " x (16 + ($leadwhite ? 4 : 0) - length($clean))) || " ")
+      . $text;
+
+    }mgex;
+
+    s{                          # handle bold ornaments
+       B < ( [^>] + | > ) >
+    } {
+          $Term::ReadLine::TermCap::rl_term_set[2] 
+        . $1
+        . $Term::ReadLine::TermCap::rl_term_set[3]
+    }gex;
+
+    s{                         # handle italic ornaments
+       I < ( [^>] + | > ) >
+    } {
+          $Term::ReadLine::TermCap::rl_term_set[0] 
+        . $1
+        . $Term::ReadLine::TermCap::rl_term_set[1]
+    }gex;
+
+    local $\ = '';
+    print $OUT $_;
+} ## end sub print_help
+
+=head2 C<fix_less> 
+
+This routine does a lot of gyrations to be sure that the pager is C<less>.
+It checks for C<less> masquerading as C<more> and records the result in
+C<$ENV{LESS}> so we don't have to go through doing the stats again.
+
+=cut
+
+sub fix_less {
+
+    # We already know if this is set.
+    return if defined $ENV{LESS} && $ENV{LESS} =~ /r/;
+
+    # Pager is less for sure.
+    my $is_less = $pager =~ /\bless\b/;
+    if ( $pager =~ /\bmore\b/ ) {
+
+        # Nope, set to more. See what's out there.
+        my @st_more = stat('/usr/bin/more');
+        my @st_less = stat('/usr/bin/less');
+
+        # is it really less, pretending to be more?
+             $is_less = @st_more
+          && @st_less
+          && $st_more[0] == $st_less[0]
+          && $st_more[1] == $st_less[1];
+    } ## end if ($pager =~ /\bmore\b/)
+
+    # changes environment!
+    # 'r' added so we don't do (slow) stats again.
+    $ENV{LESS} .= 'r' if $is_less;
+} ## end sub fix_less
+
+=head1 DIE AND WARN MANAGEMENT
+
+=head2 C<diesignal>
+
+C<diesignal> is a just-drop-dead C<die> handler. It's most useful when trying
+to debug a debugger problem.
+
+It does its best to report the error that occurred, and then forces the
+program, debugger, and everything to die.
+
+=cut
+
+sub diesignal {
+
+    # No entry/exit messages.
+    local $frame = 0;
+
+    # No return value prints.
+    local $doret = -2;
+
+    # set the abort signal handling to the default (just terminate).
+    $SIG{'ABRT'} = 'DEFAULT';
+
+    # If we enter the signal handler recursively, kill myself with an
+    # abort signal (so we just terminate).
+    kill 'ABRT', $$ if $panic++;
+
+    # If we can show detailed info, do so.
+    if ( defined &Carp::longmess ) {
+
+        # Don't recursively enter the warn handler, since we're carping.
+        local $SIG{__WARN__} = '';
+
+        # Skip two levels before reporting traceback: we're skipping
+        # mydie and confess.
+        local $Carp::CarpLevel = 2;    # mydie + confess
+
+        # Tell us all about it.
+        &warn( Carp::longmess("Signal @_") );
+    }
+
+    # No Carp. Tell us about the signal as best we can.
+    else {
+        local $\ = '';
+        print $DB::OUT "Got signal @_\n";
+    }
+
+    # Drop dead.
+    kill 'ABRT', $$;
+} ## end sub diesignal
+
+=head2 C<dbwarn>
+
+The debugger's own default C<$SIG{__WARN__}> handler. We load C<Carp> to
+be able to get a stack trace, and output the warning message vi C<DB::dbwarn()>.
+
+=cut
+
+sub dbwarn {
+
+    # No entry/exit trace.
+    local $frame = 0;
+
+    # No return value printing.
+    local $doret = -2;
+
+    # Turn off warn and die handling to prevent recursive entries to this
+    # routine.
+    local $SIG{__WARN__} = '';
+    local $SIG{__DIE__}  = '';
+
+    # Load Carp if we can. If $^S is false (current thing being compiled isn't
+    # done yet), we may not be able to do a require.
+    eval { require Carp }
+      if defined $^S;    # If error/warning during compilation,
+                         # require may be broken.
+
+    # Use the core warn() unless Carp loaded OK.
+    CORE::warn( @_,
+        "\nCannot print stack trace, load with -MCarp option to see stack" ),
+      return
+      unless defined &Carp::longmess;
+
+    # Save the current values of $single and $trace, and then turn them off.
+    my ( $mysingle, $mytrace ) = ( $single, $trace );
+    $single = 0;
+    $trace  = 0;
+
+    # We can call Carp::longmess without its being "debugged" (which we
+    # don't want - we just want to use it!). Capture this for later.
+    my $mess = Carp::longmess(@_);
+
+    # Restore $single and $trace to their original values.
+    ( $single, $trace ) = ( $mysingle, $mytrace );
+
+    # Use the debugger's own special way of printing warnings to print
+    # the stack trace message.
+    &warn($mess);
+} ## end sub dbwarn
+
+=head2 C<dbdie>
+
+The debugger's own C<$SIG{__DIE__}> handler. Handles providing a stack trace
+by loading C<Carp> and calling C<Carp::longmess()> to get it. We turn off 
+single stepping and tracing during the call to C<Carp::longmess> to avoid 
+debugging it - we just want to use it.
+
+If C<dieLevel> is zero, we let the program being debugged handle the
+exceptions. If it's 1, you get backtraces for any exception. If it's 2,
+the debugger takes over all exception handling, printing a backtrace and
+displaying the exception via its C<dbwarn()> routine. 
+
+=cut
+
+sub dbdie {
+    local $frame         = 0;
+    local $doret         = -2;
+    local $SIG{__DIE__}  = '';
+    local $SIG{__WARN__} = '';
+    my $i      = 0;
+    my $ineval = 0;
+    my $sub;
+    if ( $dieLevel > 2 ) {
+        local $SIG{__WARN__} = \&dbwarn;
+        &warn(@_);    # Yell no matter what
+        return;
+    }
+    if ( $dieLevel < 2 ) {
+        die @_ if $^S;    # in eval propagate
+    }
+
+    # The code used to check $^S to see if compiliation of the current thing
+    # hadn't finished. We don't do it anymore, figuring eval is pretty stable.
+    eval { require Carp };
+
+    die( @_,
+        "\nCannot print stack trace, load with -MCarp option to see stack" )
+      unless defined &Carp::longmess;
+
+    # We do not want to debug this chunk (automatic disabling works
+    # inside DB::DB, but not in Carp). Save $single and $trace, turn them off,
+    # get the stack trace from Carp::longmess (if possible), restore $signal
+    # and $trace, and then die with the stack trace.
+    my ( $mysingle, $mytrace ) = ( $single, $trace );
+    $single = 0;
+    $trace  = 0;
+    my $mess = "@_";
+    {
+
+        package Carp;    # Do not include us in the list
+        eval { $mess = Carp::longmess(@_); };
+    }
+    ( $single, $trace ) = ( $mysingle, $mytrace );
+    die $mess;
+} ## end sub dbdie
+
+=head2 C<warnlevel()>
+
+Set the C<$DB::warnLevel> variable that stores the value of the
+C<warnLevel> option. Calling C<warnLevel()> with a positive value
+results in the debugger taking over all warning handlers. Setting
+C<warnLevel> to zero leaves any warning handlers set up by the program
+being debugged in place.
+
+=cut
+
+sub warnLevel {
+    if (@_) {
+        $prevwarn = $SIG{__WARN__} unless $warnLevel;
+        $warnLevel = shift;
+        if ($warnLevel) {
+            $SIG{__WARN__} = \&DB::dbwarn;
+        }
+        elsif ($prevwarn) {
+            $SIG{__WARN__} = $prevwarn;
+        }
+    } ## end if (@_)
+    $warnLevel;
+} ## end sub warnLevel
+
+=head2 C<dielevel>
+
+Similar to C<warnLevel>. Non-zero values for C<dieLevel> result in the 
+C<DB::dbdie()> function overriding any other C<die()> handler. Setting it to
+zero lets you use your own C<die()> handler.
+
+=cut
+
+sub dieLevel {
+    local $\ = '';
+    if (@_) {
+        $prevdie = $SIG{__DIE__} unless $dieLevel;
+        $dieLevel = shift;
+        if ($dieLevel) {
+
+            # Always set it to dbdie() for non-zero values.
+            $SIG{__DIE__} = \&DB::dbdie;    # if $dieLevel < 2;
+
+            # No longer exists, so don't try  to use it.
+            #$SIG{__DIE__} = \&DB::diehard if $dieLevel >= 2;
+
+            # If we've finished initialization, mention that stack dumps
+            # are enabled, If dieLevel is 1, we won't stack dump if we die
+            # in an eval().
+            print $OUT "Stack dump during die enabled",
+              ( $dieLevel == 1 ? " outside of evals" : "" ), ".\n"
+              if $I_m_init;
+
+            # XXX This is probably obsolete, given that diehard() is gone.
+            print $OUT "Dump printed too.\n" if $dieLevel > 2;
+        } ## end if ($dieLevel)
+
+        # Put the old one back if there was one.
+        elsif ($prevdie) {
+            $SIG{__DIE__} = $prevdie;
+            print $OUT "Default die handler restored.\n";
+        }
+    } ## end if (@_)
+    $dieLevel;
+} ## end sub dieLevel
+
+=head2 C<signalLevel>
+
+Number three in a series: set C<signalLevel> to zero to keep your own
+signal handler for C<SIGSEGV> and/or C<SIGBUS>. Otherwise, the debugger 
+takes over and handles them with C<DB::diesignal()>.
+
+=cut
+
+sub signalLevel {
+    if (@_) {
+        $prevsegv = $SIG{SEGV} unless $signalLevel;
+        $prevbus  = $SIG{BUS}  unless $signalLevel;
+        $signalLevel = shift;
+        if ($signalLevel) {
+            $SIG{SEGV} = \&DB::diesignal;
+            $SIG{BUS}  = \&DB::diesignal;
+        }
+        else {
+            $SIG{SEGV} = $prevsegv;
+            $SIG{BUS}  = $prevbus;
+        }
+    } ## end if (@_)
+    $signalLevel;
+} ## end sub signalLevel
+
+=head1 SUBROUTINE DECODING SUPPORT
+
+These subroutines are used during the C<x> and C<X> commands to try to
+produce as much information as possible about a code reference. They use
+L<Devel::Peek> to try to find the glob in which this code reference lives
+(if it does) - this allows us to actually code references which correspond
+to named subroutines (including those aliased via glob assignment).
+
+=head2 C<CvGV_name()>
+
+Wrapper for C<CvGV_name_or_bust>; tries to get the name of a reference
+via that routine. If this fails, return the reference again (when the
+reference is stringified, it'll come out as C<SOMETHING(0x...)>).
+
+=cut
+
+sub CvGV_name {
+    my $in   = shift;
+    my $name = CvGV_name_or_bust($in);
+    defined $name ? $name : $in;
+}
+
+=head2 C<CvGV_name_or_bust> I<coderef>
+
+Calls L<Devel::Peek> to try to find the glob the ref lives in; returns
+C<undef> if L<Devel::Peek> can't be loaded, or if C<Devel::Peek::CvGV> can't
+find a glob for this ref.
+
+Returns C<< I<package>::I<glob name> >> if the code ref is found in a glob.
+
+=cut
+
+sub CvGV_name_or_bust {
+    my $in = shift;
+    return if $skipCvGV;    # Backdoor to avoid problems if XS broken...
+    return unless ref $in;
+    $in = \&$in;            # Hard reference...
+    eval { require Devel::Peek; 1 } or return;
+    my $gv = Devel::Peek::CvGV($in) or return;
+    *$gv{PACKAGE} . '::' . *$gv{NAME};
+} ## end sub CvGV_name_or_bust
+
+=head2 C<find_sub>
+
+A utility routine used in various places; finds the file where a subroutine 
+was defined, and returns that filename and a line-number range.
+
+Tries to use C<@sub> first; if it can't find it there, it tries building a
+reference to the subroutine and uses C<CvGV_name_or_bust> to locate it,
+loading it into C<@sub> as a side effect (XXX I think). If it can't find it
+this way, it brute-force searches C<%sub>, checking for identical references.
+
+=cut
+
+sub find_sub {
+    my $subr = shift;
+    $sub{$subr} or do {
+        return unless defined &$subr;
+        my $name = CvGV_name_or_bust($subr);
+        my $data;
+        $data = $sub{$name} if defined $name;
+        return $data if defined $data;
+
+        # Old stupid way...
+        $subr = \&$subr;    # Hard reference
+        my $s;
+        for ( keys %sub ) {
+            $s = $_, last if $subr eq \&$_;
+        }
+        $sub{$s} if $s;
+      } ## end do
+} ## end sub find_sub
+
+=head2 C<methods>
+
+A subroutine that uses the utility function C<methods_via> to find all the
+methods in the class corresponding to the current reference and in 
+C<UNIVERSAL>.
+
+=cut
+
+sub methods {
+
+    # Figure out the class - either this is the class or it's a reference
+    # to something blessed into that class.
+    my $class = shift;
+    $class = ref $class if ref $class;
+
+    local %seen;
+
+    # Show the methods that this class has.
+    methods_via( $class, '', 1 );
+
+    # Show the methods that UNIVERSAL has.
+    methods_via( 'UNIVERSAL', 'UNIVERSAL', 0 );
+} ## end sub methods
+
+=head2 C<methods_via($class, $prefix, $crawl_upward)>
+
+C<methods_via> does the work of crawling up the C<@ISA> tree and reporting
+all the parent class methods. C<$class> is the name of the next class to
+try; C<$prefix> is the message prefix, which gets built up as we go up the
+C<@ISA> tree to show parentage; C<$crawl_upward> is 1 if we should try to go
+higher in the C<@ISA> tree, 0 if we should stop.
+
+=cut
+
+sub methods_via {
+
+    # If we've processed this class already, just quit.
+    my $class = shift;
+    return if $seen{$class}++;
+
+    # This is a package that is contributing the methods we're about to print.
+    my $prefix  = shift;
+    my $prepend = $prefix ? "via $prefix: " : '';
+
+    my $name;
+    for $name (
+
+        # Keep if this is a defined subroutine in this class.
+        grep { defined &{ ${"${class}::"}{$_} } }
+
+        # Extract from all the symbols in this class.
+        sort keys %{"${class}::"}
+      )
+    {
+
+        # If we printed this already, skip it.
+        next if $seen{$name}++;
+
+        # Print the new method name.
+        local $\ = '';
+        local $, = '';
+        print $DB::OUT "$prepend$name\n";
+    } ## end for $name (grep { defined...
+
+    # If the $crawl_upward argument is false, just quit here.
+    return unless shift;
+
+    # $crawl_upward true: keep going up the tree.
+    # Find all the classes this one is a subclass of.
+    for $name ( @{"${class}::ISA"} ) {
+
+        # Set up the new prefix.
+        $prepend = $prefix ? $prefix . " -> $name" : $name;
+
+        # Crawl up the tree and keep trying to crawl up.
+        methods_via( $name, $prepend, 1 );
+    }
+} ## end sub methods_via
+
+=head2 C<setman> - figure out which command to use to show documentation
+
+Just checks the contents of C<$^O> and sets the C<$doccmd> global accordingly.
+
+=cut
+
+sub setman {
+    $doccmd = $^O !~ /^(?:MSWin32|VMS|os2|dos|amigaos|riscos|MacOS|NetWare)\z/s
+      ? "man"         # O Happy Day!
+      : "perldoc";    # Alas, poor unfortunates
+} ## end sub setman
+
+=head2 C<runman> - run the appropriate command to show documentation
+
+Accepts a man page name; runs the appropriate command to display it (set up
+during debugger initialization). Uses C<DB::system> to avoid mucking up the
+program's STDIN and STDOUT.
+
+=cut
+
+sub runman {
+    my $page = shift;
+    unless ($page) {
+        &system("$doccmd $doccmd");
+        return;
+    }
+
+    # this way user can override, like with $doccmd="man -Mwhatever"
+    # or even just "man " to disable the path check.
+    unless ( $doccmd eq 'man' ) {
+        &system("$doccmd $page");
+        return;
+    }
+
+    $page = 'perl' if lc($page) eq 'help';
+
+    require Config;
+    my $man1dir = $Config::Config{'man1dir'};
+    my $man3dir = $Config::Config{'man3dir'};
+    for ( $man1dir, $man3dir ) { s#/[^/]*\z## if /\S/ }
+    my $manpath = '';
+    $manpath .= "$man1dir:" if $man1dir =~ /\S/;
+    $manpath .= "$man3dir:" if $man3dir =~ /\S/ && $man1dir ne $man3dir;
+    chop $manpath if $manpath;
+
+    # harmless if missing, I figure
+    my $oldpath = $ENV{MANPATH};
+    $ENV{MANPATH} = $manpath if $manpath;
+    my $nopathopt = $^O =~ /dunno what goes here/;
+    if (
+        CORE::system(
+            $doccmd,
+
+            # I just *know* there are men without -M
+            ( ( $manpath && !$nopathopt ) ? ( "-M", $manpath ) : () ),
+            split ' ', $page
+        )
+      )
+    {
+        unless ( $page =~ /^perl\w/ ) {
+# do it this way because its easier to slurp in to keep up to date - clunky though.
+my @pods = qw(
+    5004delta
+    5005delta
+    561delta
+    56delta
+    570delta
+    571delta
+    572delta
+    573delta
+    58delta
+    581delta
+    582delta
+    583delta
+    584delta
+    590delta
+    591delta
+    592delta
+    aix
+    amiga
+    apio
+    api
+    apollo
+    artistic
+    beos
+    book
+    boot
+    bot
+    bs2000
+    call
+    ce
+    cheat
+    clib
+    cn
+    compile
+    cygwin
+    data
+    dbmfilter
+    debguts
+    debtut
+    debug
+    delta
+    dgux
+    diag
+    doc
+    dos
+    dsc
+    ebcdic
+    embed
+    epoc
+    faq1
+    faq2
+    faq3
+    faq4
+    faq5
+    faq6
+    faq7
+    faq8
+    faq9
+    faq
+    filter
+    fork
+    form
+    freebsd
+    func
+    gpl
+    guts
+    hack
+    hist
+    hpux
+    hurd
+    intern
+    intro
+    iol
+    ipc
+    irix
+    jp
+    ko
+    lexwarn
+    locale
+    lol
+    machten
+    macos
+    macosx
+    mint
+    modinstall
+    modlib
+    mod
+    modstyle
+    mpeix
+    netware
+    newmod
+    number
+    obj
+    opentut
+    op
+    os2
+    os390
+    os400
+    othrtut
+    packtut
+    plan9
+    pod
+    podspec
+    port
+    qnx
+    ref
+    reftut
+    re
+    requick
+    reref
+    retut
+    run
+    sec
+    solaris
+    style
+    sub
+    syn
+    thrtut
+    tie
+    toc
+    todo
+    tooc
+    toot
+    trap
+    tru64
+    tw
+    unicode
+    uniintro
+    util
+    uts
+    var
+    vmesa
+    vms
+    vos
+    win32
+    xs
+    xstut
+);
+            if (grep { $page eq $_ } @pods) {
+                $page =~ s/^/perl/;
+                CORE::system( $doccmd,
+                    ( ( $manpath && !$nopathopt ) ? ( "-M", $manpath ) : () ),
+                    $page );
+            } ## end if (grep { $page eq $_...
+        } ## end unless ($page =~ /^perl\w/)
+    } ## end if (CORE::system($doccmd...
+    if ( defined $oldpath ) {
+        $ENV{MANPATH} = $manpath;
+    }
+    else {
+        delete $ENV{MANPATH};
+    }
+} ## end sub runman
+
+#use Carp;                          # This did break, left for debugging
+
+=head1 DEBUGGER INITIALIZATION - THE SECOND BEGIN BLOCK
+
+Because of the way the debugger interface to the Perl core is designed, any
+debugger package globals that C<DB::sub()> requires have to be defined before
+any subroutines can be called. These are defined in the second C<BEGIN> block.
+
+This block sets things up so that (basically) the world is sane
+before the debugger starts executing. We set up various variables that the
+debugger has to have set up before the Perl core starts running:
+
+=over 4 
+
+=item *
+
+The debugger's own filehandles (copies of STD and STDOUT for now).
+
+=item *
+
+Characters for shell escapes, the recall command, and the history command.
+
+=item *
+
+The maximum recursion depth.
+
+=item *
+
+The size of a C<w> command's window.
+
+=item *
+
+The before-this-line context to be printed in a C<v> (view a window around this line) command.
+
+=item *
+
+The fact that we're not in a sub at all right now.
+
+=item *
+
+The default SIGINT handler for the debugger.
+
+=item *
+
+The appropriate value of the flag in C<$^D> that says the debugger is running
+
+=item *
+
+The current debugger recursion level
+
+=item *
+
+The list of postponed items and the C<$single> stack (XXX define this)
+
+=item *
+
+That we want no return values and no subroutine entry/exit trace.
+
+=back
+
+=cut
+
+# The following BEGIN is very handy if debugger goes havoc, debugging debugger?
+
+BEGIN {    # This does not compile, alas. (XXX eh?)
+    $IN  = \*STDIN;     # For bugs before DB::OUT has been opened
+    $OUT = \*STDERR;    # For errors before DB::OUT has been opened
+
+    # Define characters used by command parsing.
+    $sh       = '!';      # Shell escape (does not work)
+    $rc       = ',';      # Recall command (does not work)
+    @hist     = ('?');    # Show history (does not work)
+    @truehist = ();       # Can be saved for replay (per session)
+
+    # This defines the point at which you get the 'deep recursion'
+    # warning. It MUST be defined or the debugger will not load.
+    $deep = 100;
+
+    # Number of lines around the current one that are shown in the
+    # 'w' command.
+    $window = 10;
+
+    # How much before-the-current-line context the 'v' command should
+    # use in calculating the start of the window it will display.
+    $preview = 3;
+
+    # We're not in any sub yet, but we need this to be a defined value.
+    $sub = '';
+
+    # Set up the debugger's interrupt handler. It simply sets a flag
+    # ($signal) that DB::DB() will check before each command is executed.
+    $SIG{INT} = \&DB::catch;
+
+    # The following lines supposedly, if uncommented, allow the debugger to
+    # debug itself. Perhaps we can try that someday.
+    # This may be enabled to debug debugger:
+    #$warnLevel = 1 unless defined $warnLevel;
+    #$dieLevel = 1 unless defined $dieLevel;
+    #$signalLevel = 1 unless defined $signalLevel;
+
+    # This is the flag that says "a debugger is running, please call
+    # DB::DB and DB::sub". We will turn it on forcibly before we try to
+    # execute anything in the user's context, because we always want to
+    # get control back.
+    $db_stop = 0;          # Compiler warning ...
+    $db_stop = 1 << 30;    # ... because this is only used in an eval() later.
+
+    # This variable records how many levels we're nested in debugging. Used
+    # Used in the debugger prompt, and in determining whether it's all over or
+    # not.
+    $level = 0;            # Level of recursive debugging
+
+    # "Triggers bug (?) in perl if we postpone this until runtime."
+    # XXX No details on this yet, or whether we should fix the bug instead
+    # of work around it. Stay tuned.
+    @postponed = @stack = (0);
+
+    # Used to track the current stack depth using the auto-stacked-variable
+    # trick.
+    $stack_depth = 0;      # Localized repeatedly; simple way to track $#stack
+
+    # Don't print return values on exiting a subroutine.
+    $doret = -2;
+
+    # No extry/exit tracing.
+    $frame = 0;
+
+} ## end BEGIN
+
+BEGIN { $^W = $ini_warn; }    # Switch warnings back
+
+=head1 READLINE SUPPORT - COMPLETION FUNCTION
+
+=head2 db_complete
+
+C<readline> support - adds command completion to basic C<readline>. 
+
+Returns a list of possible completions to C<readline> when invoked. C<readline>
+will print the longest common substring following the text already entered. 
+
+If there is only a single possible completion, C<readline> will use it in full.
+
+This code uses C<map> and C<grep> heavily to create lists of possible 
+completion. Think LISP in this section.
+
+=cut
+
+sub db_complete {
+
+    # Specific code for b c l V m f O, &blah, $blah, @blah, %blah
+    # $text is the text to be completed.
+    # $line is the incoming line typed by the user.
+    # $start is the start of the text to be completed in the incoming line.
+    my ( $text, $line, $start ) = @_;
+
+    # Save the initial text.
+    # The search pattern is current package, ::, extract the next qualifier
+    # Prefix and pack are set to undef.
+    my ( $itext, $search, $prefix, $pack ) =
+      ( $text, "^\Q${'package'}::\E([^:]+)\$" );
+
+=head3 C<b postpone|compile> 
+
+=over 4
+
+=item *
+
+Find all the subroutines that might match in this package
+
+=item *
+
+Add C<postpone>, C<load>, and C<compile> as possibles (we may be completing the keyword itself)
+
+=item *
+
+Include all the rest of the subs that are known
+
+=item *
+
+C<grep> out the ones that match the text we have so far
+
+=item *
+
+Return this as the list of possible completions
+
+=back
+
+=cut 
+
+    return sort grep /^\Q$text/, ( keys %sub ),
+      qw(postpone load compile),    # subroutines
+      ( map { /$search/ ? ($1) : () } keys %sub )
+      if ( substr $line, 0, $start ) =~ /^\|*[blc]\s+((postpone|compile)\s+)?$/;
+
+=head3 C<b load>
+
+Get all the possible files from C<@INC> as it currently stands and
+select the ones that match the text so far.
+
+=cut
+
+    return sort grep /^\Q$text/, values %INC    # files
+      if ( substr $line, 0, $start ) =~ /^\|*b\s+load\s+$/;
+
+=head3  C<V> (list variable) and C<m> (list modules)
+
+There are two entry points for these commands:
+
+=head4 Unqualified package names
+
+Get the top-level packages and grab everything that matches the text
+so far. For each match, recursively complete the partial packages to
+get all possible matching packages. Return this sorted list.
+
+=cut
+
+    return sort map { ( $_, db_complete( $_ . "::", "V ", 2 ) ) }
+      grep /^\Q$text/, map { /^(.*)::$/ ? ($1) : () } keys %::    # top-packages
+      if ( substr $line, 0, $start ) =~ /^\|*[Vm]\s+$/ and $text =~ /^\w*$/;
+
+=head4 Qualified package names
+
+Take a partially-qualified package and find all subpackages for it
+by getting all the subpackages for the package so far, matching all
+the subpackages against the text, and discarding all of them which 
+start with 'main::'. Return this list.
+
+=cut
+
+    return sort map { ( $_, db_complete( $_ . "::", "V ", 2 ) ) }
+      grep !/^main::/, grep /^\Q$text/,
+      map { /^(.*)::$/ ? ( $prefix . "::$1" ) : () } keys %{ $prefix . '::' }
+      if ( substr $line, 0, $start ) =~ /^\|*[Vm]\s+$/
+      and $text =~ /^(.*[^:])::?(\w*)$/
+      and $prefix = $1;
+
+=head3 C<f> - switch files
+
+Here, we want to get a fully-qualified filename for the C<f> command.
+Possibilities are:
+
+=over 4
+
+=item 1. The original source file itself
+
+=item 2. A file from C<@INC>
+
+=item 3. An C<eval> (the debugger gets a C<(eval N)> fake file for each C<eval>).
+
+=back
+
+=cut
+
+    if ( $line =~ /^\|*f\s+(.*)/ ) {    # Loaded files
+           # We might possibly want to switch to an eval (which has a "filename"
+           # like '(eval 9)'), so we may need to clean up the completion text
+           # before proceeding.
+        $prefix = length($1) - length($text);
+        $text   = $1;
+
+=pod
+
+Under the debugger, source files are represented as C<_E<lt>/fullpath/to/file> 
+(C<eval>s are C<_E<lt>(eval NNN)>) keys in C<%main::>. We pull all of these 
+out of C<%main::>, add the initial source file, and extract the ones that 
+match the completion text so far.
+
+=cut
+
+        return sort
+          map { substr $_, 2 + $prefix } grep /^_<\Q$text/, ( keys %main:: ),
+          $0;
+    } ## end if ($line =~ /^\|*f\s+(.*)/)
+
+=head3 Subroutine name completion
+
+We look through all of the defined subs (the keys of C<%sub>) and
+return both all the possible matches to the subroutine name plus
+all the matches qualified to the current package.
+
+=cut
+
+    if ( ( substr $text, 0, 1 ) eq '&' ) {    # subroutines
+        $text = substr $text, 1;
+        $prefix = "&";
+        return sort map "$prefix$_", grep /^\Q$text/, ( keys %sub ),
+          (
+            map { /$search/ ? ($1) : () }
+              keys %sub
+          );
+    } ## end if ((substr $text, 0, ...
+
+=head3  Scalar, array, and hash completion: partially qualified package
+
+Much like the above, except we have to do a little more cleanup:
+
+=cut
+
+    if ( $text =~ /^[\$@%](.*)::(.*)/ ) {    # symbols in a package
+
+=pod
+
+=over 4 
+
+=item *
+
+Determine the package that the symbol is in. Put it in C<::> (effectively C<main::>) if no package is specified.
+
+=cut
+
+        $pack = ( $1 eq 'main' ? '' : $1 ) . '::';
+
+=pod
+
+=item *
+
+Figure out the prefix vs. what needs completing.
+
+=cut
+
+        $prefix = ( substr $text, 0, 1 ) . $1 . '::';
+        $text   = $2;
+
+=pod
+
+=item *
+
+Look through all the symbols in the package. C<grep> out all the possible hashes/arrays/scalars, and then C<grep> the possible matches out of those. C<map> the prefix onto all the possibilities.
+
+=cut
+
+        my @out = map "$prefix$_", grep /^\Q$text/, grep /^_?[a-zA-Z]/,
+          keys %$pack;
+
+=pod
+
+=item *
+
+If there's only one hit, and it's a package qualifier, and it's not equal to the initial text, re-complete it using the symbol we actually found.
+
+=cut
+
+        if ( @out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext ) {
+            return db_complete( $out[0], $line, $start );
+        }
+
+        # Return the list of possibles.
+        return sort @out;
+
+    } ## end if ($text =~ /^[\$@%](.*)::(.*)/)
+
+=pod
+
+=back
+
+=head3 Symbol completion: current package or package C<main>.
+
+=cut
+
+    if ( $text =~ /^[\$@%]/ ) {    # symbols (in $package + packages in main)
+
+=pod
+
+=over 4
+
+=item *
+
+If it's C<main>, delete main to just get C<::> leading.
+
+=cut
+
+        $pack = ( $package eq 'main' ? '' : $package ) . '::';
+
+=pod
+
+=item *
+
+We set the prefix to the item's sigil, and trim off the sigil to get the text to be completed.
+
+=cut
+
+        $prefix = substr $text, 0, 1;
+        $text   = substr $text, 1;
+
+=pod
+
+=item *
+
+If the package is C<::> (C<main>), create an empty list; if it's something else, create a list of all the packages known.  Append whichever list to a list of all the possible symbols in the current package. C<grep> out the matches to the text entered so far, then C<map> the prefix back onto the symbols.
+
+=cut
+
+        my @out = map "$prefix$_", grep /^\Q$text/,
+          ( grep /^_?[a-zA-Z]/, keys %$pack ),
+          ( $pack eq '::' ? () : ( grep /::$/, keys %:: ) );
+
+=item *
+
+If there's only one hit, it's a package qualifier, and it's not equal to the initial text, recomplete using this symbol.
+
+=back
+
+=cut
+
+        if ( @out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext ) {
+            return db_complete( $out[0], $line, $start );
+        }
+
+        # Return the list of possibles.
+        return sort @out;
+    } ## end if ($text =~ /^[\$@%]/)
+
+=head3 Options 
+
+We use C<option_val()> to look up the current value of the option. If there's
+only a single value, we complete the command in such a way that it is a 
+complete command for setting the option in question. If there are multiple
+possible values, we generate a command consisting of the option plus a trailing
+question mark, which, if executed, will list the current value of the option.
+
+=cut
+
+    if ( ( substr $line, 0, $start ) =~ /^\|*[oO]\b.*\s$/ )
+    {    # Options after space
+           # We look for the text to be matched in the list of possible options,
+           # and fetch the current value.
+        my @out = grep /^\Q$text/, @options;
+        my $val = option_val( $out[0], undef );
+
+        # Set up a 'query option's value' command.
+        my $out = '? ';
+        if ( not defined $val or $val =~ /[\n\r]/ ) {
+
+            # There's really nothing else we can do.
+        }
+
+        # We have a value. Create a proper option-setting command.
+        elsif ( $val =~ /\s/ ) {
+
+            # XXX This may be an extraneous variable.
+            my $found;
+
+            # We'll want to quote the string (because of the embedded
+            # whtespace), but we want to make sure we don't end up with
+            # mismatched quote characters. We try several possibilities.
+            foreach $l ( split //, qq/\"\'\#\|/ ) {
+
+                # If we didn't find this quote character in the value,
+                # quote it using this quote character.
+                $out = "$l$val$l ", last if ( index $val, $l ) == -1;
+            }
+        } ## end elsif ($val =~ /\s/)
+
+        # Don't need any quotes.
+        else {
+            $out = "=$val ";
+        }
+
+        # If there were multiple possible values, return '? ', which
+        # makes the command into a query command. If there was just one,
+        # have readline append that.
+        $rl_attribs->{completer_terminator_character} =
+          ( @out == 1 ? $out : '? ' );
+
+        # Return list of possibilities.
+        return sort @out;
+    } ## end if ((substr $line, 0, ...
+
+=head3 Filename completion
+
+For entering filenames. We simply call C<readline>'s C<filename_list()>
+method with the completion text to get the possible completions.
+
+=cut
+
+    return $term->filename_list($text);    # filenames
+
+} ## end sub db_complete
+
+=head1 MISCELLANEOUS SUPPORT FUNCTIONS
+
+Functions that possibly ought to be somewhere else.
+
+=head2 end_report
+
+Say we're done.
+
+=cut
+
+sub end_report {
+    local $\ = '';
+    print $OUT "Use `q' to quit or `R' to restart.  `h q' for details.\n";
+}
+
+=head2 clean_ENV
+
+If we have $ini_pids, save it in the environment; else remove it from the
+environment. Used by the C<R> (restart) command.
+
+=cut
+
+sub clean_ENV {
+    if ( defined($ini_pids) ) {
+        $ENV{PERLDB_PIDS} = $ini_pids;
+    }
+    else {
+        delete( $ENV{PERLDB_PIDS} );
+    }
+} ## end sub clean_ENV
+
+# PERLDBf_... flag names from perl.h
+our ( %DollarCaretP_flags, %DollarCaretP_flags_r );
+
+BEGIN {
+    %DollarCaretP_flags = (
+        PERLDBf_SUB       => 0x01,     # Debug sub enter/exit
+        PERLDBf_LINE      => 0x02,     # Keep line #
+        PERLDBf_NOOPT     => 0x04,     # Switch off optimizations
+        PERLDBf_INTER     => 0x08,     # Preserve more data
+        PERLDBf_SUBLINE   => 0x10,     # Keep subr source lines
+        PERLDBf_SINGLE    => 0x20,     # Start with single-step on
+        PERLDBf_NONAME    => 0x40,     # For _SUB: no name of the subr
+        PERLDBf_GOTO      => 0x80,     # Report goto: call DB::goto
+        PERLDBf_NAMEEVAL  => 0x100,    # Informative names for evals
+        PERLDBf_NAMEANON  => 0x200,    # Informative names for anon subs
+        PERLDBf_ASSERTION => 0x400,    # Debug assertion subs enter/exit
+        PERLDB_ALL        => 0x33f,    # No _NONAME, _GOTO, _ASSERTION
+    );
+
+    %DollarCaretP_flags_r = reverse %DollarCaretP_flags;
+}
+
+sub parse_DollarCaretP_flags {
+    my $flags = shift;
+    $flags =~ s/^\s+//;
+    $flags =~ s/\s+$//;
+    my $acu = 0;
+    foreach my $f ( split /\s*\|\s*/, $flags ) {
+        my $value;
+        if ( $f =~ /^0x([[:xdigit:]]+)$/ ) {
+            $value = hex $1;
+        }
+        elsif ( $f =~ /^(\d+)$/ ) {
+            $value = int $1;
+        }
+        elsif ( $f =~ /^DEFAULT$/i ) {
+            $value = $DollarCaretP_flags{PERLDB_ALL};
+        }
+        else {
+            $f =~ /^(?:PERLDBf_)?(.*)$/i;
+            $value = $DollarCaretP_flags{ 'PERLDBf_' . uc($1) };
+            unless ( defined $value ) {
+                print $OUT (
+                    "Unrecognized \$^P flag '$f'!\n",
+                    "Acceptable flags are: "
+                      . join( ', ', sort keys %DollarCaretP_flags ),
+                    ", and hexadecimal and decimal numbers.\n"
+                );
+                return undef;
+            }
+        }
+        $acu |= $value;
+    }
+    $acu;
+}
+
+sub expand_DollarCaretP_flags {
+    my $DollarCaretP = shift;
+    my @bits         = (
+        map {
+            my $n = ( 1 << $_ );
+            ( $DollarCaretP & $n )
+              ? ( $DollarCaretP_flags_r{$n}
+                  || sprintf( '0x%x', $n ) )
+              : ()
+          } 0 .. 31
+    );
+    return @bits ? join( '|', @bits ) : 0;
+}
+
+=over 4
+
+=item rerun
+
+Rerun the current session to:
+
+    rerun        current position
+
+    rerun 4      command number 4
+
+    rerun -4     current command minus 4 (go back 4 steps)
+
+Whether this always makes sense, in the current context is unknowable, and is
+in part left as a useful exersize for the reader.  This sub returns the
+appropriate arguments to rerun the current session.
+
+=cut
+
+sub rerun {
+    my $i = shift; 
+    my @args;
+    pop(@truehist);                      # strim
+    unless (defined $truehist[$i]) {
+        print "Unable to return to non-existent command: $i\n";
+    } else {
+        $#truehist = ($i < 0 ? $#truehist + $i : $i > 0 ? $i : $#truehist);
+        my @temp = @truehist;            # store
+        push(@DB::typeahead, @truehist); # saved
+        @truehist = @hist = ();          # flush
+        @args = &restart();              # setup
+        &get_list("PERLDB_HIST");        # clean
+        &set_list("PERLDB_HIST", @temp); # reset
+    }
+    return @args;
+}
+
+=item restart
+
+Restarting the debugger is a complex operation that occurs in several phases.
+First, we try to reconstruct the command line that was used to invoke Perl
+and the debugger.
+
+=cut
+
+sub restart {
+    # I may not be able to resurrect you, but here goes ...
+    print $OUT
+"Warning: some settings and command-line options may be lost!\n";
+    my ( @script, @flags, $cl );
+
+    # If warn was on before, turn it on again.
+    push @flags, '-w' if $ini_warn;
+    if ( $ini_assertion and @{^ASSERTING} ) {
+        push @flags,
+          ( map { /\:\^\(\?\:(.*)\)\$\)/ ? "-A$1" : "-A$_" }
+              @{^ASSERTING} );
+    }
+
+    # Rebuild the -I flags that were on the initial
+    # command line.
+    for (@ini_INC) {
+        push @flags, '-I', $_;
+    }
+
+    # Turn on taint if it was on before.
+    push @flags, '-T' if ${^TAINT};
+
+    # Arrange for setting the old INC:
+    # Save the current @init_INC in the environment.
+    set_list( "PERLDB_INC", @ini_INC );
+
+    # If this was a perl one-liner, go to the "file"
+    # corresponding to the one-liner read all the lines
+    # out of it (except for the first one, which is going
+    # to be added back on again when 'perl -d' runs: that's
+    # the 'require perl5db.pl;' line), and add them back on
+    # to the command line to be executed.
+    if ( $0 eq '-e' ) {
+        for ( 1 .. $#{'::_<-e'} ) {  # The first line is PERL5DB
+            chomp( $cl = ${'::_<-e'}[$_] );
+            push @script, '-e', $cl;
+        }
+    } ## end if ($0 eq '-e')
+
+    # Otherwise we just reuse the original name we had
+    # before.
+    else {
+        @script = $0;
+    }
+
+=pod
+
+After the command line  has been reconstructed, the next step is to save
+the debugger's status in environment variables. The C<DB::set_list> routine
+is used to save aggregate variables (both hashes and arrays); scalars are
+just popped into environment variables directly.
+
+=cut
+
+    # If the terminal supported history, grab it and
+    # save that in the environment.
+    set_list( "PERLDB_HIST",
+          $term->Features->{getHistory}
+        ? $term->GetHistory
+        : @hist );
+
+    # Find all the files that were visited during this
+    # session (i.e., the debugger had magic hashes
+    # corresponding to them) and stick them in the environment.
+    my @had_breakpoints = keys %had_breakpoints;
+    set_list( "PERLDB_VISITED", @had_breakpoints );
+
+    # Save the debugger options we chose.
+    set_list( "PERLDB_OPT", %option );
+    # set_list( "PERLDB_OPT", options2remember() );
+
+    # Save the break-on-loads.
+    set_list( "PERLDB_ON_LOAD", %break_on_load );
+
+=pod 
+
+The most complex part of this is the saving of all of the breakpoints. They
+can live in an awful lot of places, and we have to go through all of them,
+find the breakpoints, and then save them in the appropriate environment
+variable via C<DB::set_list>.
+
+=cut
+
+    # Go through all the breakpoints and make sure they're
+    # still valid.
+    my @hard;
+    for ( 0 .. $#had_breakpoints ) {
+
+        # We were in this file.
+        my $file = $had_breakpoints[$_];
+
+        # Grab that file's magic line hash.
+        *dbline = $main::{ '_<' . $file };
+
+        # Skip out if it doesn't exist, or if the breakpoint
+        # is in a postponed file (we'll do postponed ones
+        # later).
+        next unless %dbline or $postponed_file{$file};
+
+        # In an eval. This is a little harder, so we'll
+        # do more processing on that below.
+        ( push @hard, $file ), next
+          if $file =~ /^\(\w*eval/;
+
+        # XXX I have no idea what this is doing. Yet.
+        my @add;
+        @add = %{ $postponed_file{$file} }
+          if $postponed_file{$file};
+
+        # Save the list of all the breakpoints for this file.
+        set_list( "PERLDB_FILE_$_", %dbline, @add );
+    } ## end for (0 .. $#had_breakpoints)
+
+    # The breakpoint was inside an eval. This is a little
+    # more difficult. XXX and I don't understand it.
+    for (@hard) {
+        # Get over to the eval in question.
+        *dbline = $main::{ '_<' . $_ };
+        my ( $quoted, $sub, %subs, $line ) = quotemeta $_;
+        for $sub ( keys %sub ) {
+            next unless $sub{$sub} =~ /^$quoted:(\d+)-(\d+)$/;
+            $subs{$sub} = [ $1, $2 ];
+        }
+        unless (%subs) {
+            print $OUT
+              "No subroutines in $_, ignoring breakpoints.\n";
+            next;
+        }
+      LINES: for $line ( keys %dbline ) {
+
+            # One breakpoint per sub only:
+            my ( $offset, $sub, $found );
+          SUBS: for $sub ( keys %subs ) {
+                if (
+                    $subs{$sub}->[1] >=
+                    $line    # Not after the subroutine
+                    and (
+                        not defined $offset    # Not caught
+                        or $offset < 0
+                    )
+                  )
+                {                              # or badly caught
+                    $found  = $sub;
+                    $offset = $line - $subs{$sub}->[0];
+                    $offset = "+$offset", last SUBS
+                      if $offset >= 0;
+                } ## end if ($subs{$sub}->[1] >=...
+            } ## end for $sub (keys %subs)
+            if ( defined $offset ) {
+                $postponed{$found} =
+                  "break $offset if $dbline{$line}";
+            }
+            else {
+                print $OUT
+"Breakpoint in $_:$line ignored: after all the subroutines.\n";
+            }
+        } ## end for $line (keys %dbline)
+    } ## end for (@hard)
+
+    # Save the other things that don't need to be
+    # processed.
+    set_list( "PERLDB_POSTPONE",  %postponed );
+    set_list( "PERLDB_PRETYPE",   @$pretype );
+    set_list( "PERLDB_PRE",       @$pre );
+    set_list( "PERLDB_POST",      @$post );
+    set_list( "PERLDB_TYPEAHEAD", @typeahead );
+
+    # We are oficially restarting.
+    $ENV{PERLDB_RESTART} = 1;
+
+    # We are junking all child debuggers.
+    delete $ENV{PERLDB_PIDS};    # Restore ini state
+
+    # Set this back to the initial pid.
+    $ENV{PERLDB_PIDS} = $ini_pids if defined $ini_pids;
+
+=pod 
+
+After all the debugger status has been saved, we take the command we built up
+and then return it, so we can C<exec()> it. The debugger will spot the
+C<PERLDB_RESTART> environment variable and realize it needs to reload its state
+from the environment.
+
+=cut
+
+    # And run Perl again. Add the "-d" flag, all the
+    # flags we built up, the script (whether a one-liner
+    # or a file), add on the -emacs flag for a slave editor,
+    # and then the old arguments. 
+
+    return ($^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS);
+
+};  # end restart
+
+=back
+
+=head1 END PROCESSING - THE C<END> BLOCK
+
+Come here at the very end of processing. We want to go into a 
+loop where we allow the user to enter commands and interact with the 
+debugger, but we don't want anything else to execute. 
+
+First we set the C<$finished> variable, so that some commands that
+shouldn't be run after the end of program quit working.
+
+We then figure out whether we're truly done (as in the user entered a C<q>
+command, or we finished execution while running nonstop). If we aren't,
+we set C<$single> to 1 (causing the debugger to get control again).
+
+We then call C<DB::fake::at_exit()>, which returns the C<Use 'q' to quit ...>
+message and returns control to the debugger. Repeat.
+
+When the user finally enters a C<q> command, C<$fall_off_end> is set to
+1 and the C<END> block simply exits with C<$single> set to 0 (don't 
+break, run to completion.).
+
+=cut
+
+END {
+    $finished = 1 if $inhibit_exit;    # So that some commands may be disabled.
+    $fall_off_end = 1 unless $inhibit_exit;
+
+    # Do not stop in at_exit() and destructors on exit:
+    $DB::single = !$fall_off_end && !$runnonstop;
+    DB::fake::at_exit() unless $fall_off_end or $runnonstop;
+} ## end END
+
+=head1 PRE-5.8 COMMANDS
+
+Some of the commands changed function quite a bit in the 5.8 command 
+realignment, so much so that the old code had to be replaced completely.
+Because we wanted to retain the option of being able to go back to the
+former command set, we moved the old code off to this section.
+
+There's an awful lot of duplicated code here. We've duplicated the 
+comments to keep things clear.
+
+=head2 Null command
+
+Does nothing. Used to I<turn off> commands.
+
+=cut
+
+sub cmd_pre580_null {
+
+    # do nothing...
+}
+
+=head2 Old C<a> command.
+
+This version added actions if you supplied them, and deleted them
+if you didn't.
+
+=cut
+
+sub cmd_pre580_a {
+    my $xcmd = shift;
+    my $cmd  = shift;
+
+    # Argument supplied. Add the action.
+    if ( $cmd =~ /^(\d*)\s*(.*)/ ) {
+
+        # If the line isn't there, use the current line.
+        $i = $1 || $line;
+        $j = $2;
+
+        # If there is an action ...
+        if ( length $j ) {
+
+            # ... but the line isn't breakable, skip it.
+            if ( $dbline[$i] == 0 ) {
+                print $OUT "Line $i may not have an action.\n";
+            }
+            else {
+
+                # ... and the line is breakable:
+                # Mark that there's an action in this file.
+                $had_breakpoints{$filename} |= 2;
+
+                # Delete any current action.
+                $dbline{$i} =~ s/\0[^\0]*//;
+
+                # Add the new action, continuing the line as needed.
+                $dbline{$i} .= "\0" . action($j);
+            }
+        } ## end if (length $j)
+
+        # No action supplied.
+        else {
+
+            # Delete the action.
+            $dbline{$i} =~ s/\0[^\0]*//;
+
+            # Mark as having no break or action if nothing's left.
+            delete $dbline{$i} if $dbline{$i} eq '';
+        }
+    } ## end if ($cmd =~ /^(\d*)\s*(.*)/)
+} ## end sub cmd_pre580_a
+
+=head2 Old C<b> command 
+
+Add breakpoints.
+
+=cut
+
+sub cmd_pre580_b {
+    my $xcmd   = shift;
+    my $cmd    = shift;
+    my $dbline = shift;
+
+    # Break on load.
+    if ( $cmd =~ /^load\b\s*(.*)/ ) {
+        my $file = $1;
+        $file =~ s/\s+$//;
+        &cmd_b_load($file);
+    }
+
+    # b compile|postpone <some sub> [<condition>]
+    # The interpreter actually traps this one for us; we just put the
+    # necessary condition in the %postponed hash.
+    elsif ( $cmd =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ ) {
+
+        # Capture the condition if there is one. Make it true if none.
+        my $cond = length $3 ? $3 : '1';
+
+        # Save the sub name and set $break to 1 if $1 was 'postpone', 0
+        # if it was 'compile'.
+        my ( $subname, $break ) = ( $2, $1 eq 'postpone' );
+
+        # De-Perl4-ify the name - ' separators to ::.
+        $subname =~ s/\'/::/g;
+
+        # Qualify it into the current package unless it's already qualified.
+        $subname = "${'package'}::" . $subname
+          unless $subname =~ /::/;
+
+        # Add main if it starts with ::.
+        $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
+
+        # Save the break type for this sub.
+        $postponed{$subname} = $break ? "break +0 if $cond" : "compile";
+    } ## end elsif ($cmd =~ ...
+
+    # b <sub name> [<condition>]
+    elsif ( $cmd =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) {
+        my $subname = $1;
+        my $cond = length $2 ? $2 : '1';
+        &cmd_b_sub( $subname, $cond );
+    }
+
+    # b <line> [<condition>].
+    elsif ( $cmd =~ /^(\d*)\s*(.*)/ ) {
+        my $i = $1 || $dbline;
+        my $cond = length $2 ? $2 : '1';
+        &cmd_b_line( $i, $cond );
+    }
+} ## end sub cmd_pre580_b
+
+=head2 Old C<D> command.
+
+Delete all breakpoints unconditionally.
+
+=cut
+
+sub cmd_pre580_D {
+    my $xcmd = shift;
+    my $cmd  = shift;
+    if ( $cmd =~ /^\s*$/ ) {
+        print $OUT "Deleting all breakpoints...\n";
+
+        # %had_breakpoints lists every file that had at least one
+        # breakpoint in it.
+        my $file;
+        for $file ( keys %had_breakpoints ) {
+
+            # Switch to the desired file temporarily.
+            local *dbline = $main::{ '_<' . $file };
+
+            my $max = $#dbline;
+            my $was;
+
+            # For all lines in this file ...
+            for ( $i = 1 ; $i <= $max ; $i++ ) {
+
+                # If there's a breakpoint or action on this line ...
+                if ( defined $dbline{$i} ) {
+
+                    # ... remove the breakpoint.
+                    $dbline{$i} =~ s/^[^\0]+//;
+                    if ( $dbline{$i} =~ s/^\0?$// ) {
+
+                        # Remove the entry altogether if no action is there.
+                        delete $dbline{$i};
+                    }
+                } ## end if (defined $dbline{$i...
+            } ## end for ($i = 1 ; $i <= $max...
+
+            # If, after we turn off the "there were breakpoints in this file"
+            # bit, the entry in %had_breakpoints for this file is zero,
+            # we should remove this file from the hash.
+            if ( not $had_breakpoints{$file} &= ~1 ) {
+                delete $had_breakpoints{$file};
+            }
+        } ## end for $file (keys %had_breakpoints)
+
+        # Kill off all the other breakpoints that are waiting for files that
+        # haven't been loaded yet.
+        undef %postponed;
+        undef %postponed_file;
+        undef %break_on_load;
+    } ## end if ($cmd =~ /^\s*$/)
+} ## end sub cmd_pre580_D
+
+=head2 Old C<h> command
+
+Print help. Defaults to printing the long-form help; the 5.8 version 
+prints the summary by default.
+
+=cut
+
+sub cmd_pre580_h {
+    my $xcmd = shift;
+    my $cmd  = shift;
+
+    # Print the *right* help, long format.
+    if ( $cmd =~ /^\s*$/ ) {
+        print_help($pre580_help);
+    }
+
+    # 'h h' - explicitly-requested summary.
+    elsif ( $cmd =~ /^h\s*/ ) {
+        print_help($pre580_summary);
+    }
+
+    # Find and print a command's help.
+    elsif ( $cmd =~ /^h\s+(\S.*)$/ ) {
+        my $asked  = $1;                   # for proper errmsg
+        my $qasked = quotemeta($asked);    # for searching
+                                           # XXX: finds CR but not <CR>
+        if (
+            $pre580_help =~ /^
+                              <?           # Optional '<'
+                              (?:[IB]<)    # Optional markup
+                              $qasked      # The command name
+                            /mx
+          )
+        {
+
+            while (
+                $pre580_help =~ /^
+                                  (             # The command help:
+                                   <?           # Optional '<'
+                                   (?:[IB]<)    # Optional markup
+                                   $qasked      # The command name
+                                   ([\s\S]*?)   # Lines starting with tabs
+                                   \n           # Final newline
+                                  )
+                                  (?!\s)/mgx
+              )    # Line not starting with space
+                   # (Next command's help)
+            {
+                print_help($1);
+            }
+        } ## end if ($pre580_help =~ /^<?(?:[IB]<)$qasked/m)
+
+        # Help not found.
+        else {
+            print_help("B<$asked> is not a debugger command.\n");
+        }
+    } ## end elsif ($cmd =~ /^h\s+(\S.*)$/)
+} ## end sub cmd_pre580_h
+
+=head2 Old C<W> command
+
+C<W E<lt>exprE<gt>> adds a watch expression, C<W> deletes them all.
+
+=cut
+
+sub cmd_pre580_W {
+    my $xcmd = shift;
+    my $cmd  = shift;
+
+    # Delete all watch expressions.
+    if ( $cmd =~ /^$/ ) {
+
+        # No watching is going on.
+        $trace &= ~2;
+
+        # Kill all the watch expressions and values.
+        @to_watch = @old_watch = ();
+    }
+
+    # Add a watch expression.
+    elsif ( $cmd =~ /^(.*)/s ) {
+
+        # add it to the list to be watched.
+        push @to_watch, $1;
+
+        # Get the current value of the expression.
+        # Doesn't handle expressions returning list values!
+        $evalarg = $1;
+        my ($val) = &eval;
+        $val = ( defined $val ) ? "'$val'" : 'undef';
+
+        # Save it.
+        push @old_watch, $val;
+
+        # We're watching stuff.
+        $trace |= 2;
+
+    } ## end elsif ($cmd =~ /^(.*)/s)
+} ## end sub cmd_pre580_W
+
+=head1 PRE-AND-POST-PROMPT COMMANDS AND ACTIONS
+
+The debugger used to have a bunch of nearly-identical code to handle 
+the pre-and-post-prompt action commands. C<cmd_pre590_prepost> and
+C<cmd_prepost> unify all this into one set of code to handle the 
+appropriate actions.
+
+=head2 C<cmd_pre590_prepost>
+
+A small wrapper around C<cmd_prepost>; it makes sure that the default doesn't
+do something destructive. In pre 5.8 debuggers, the default action was to
+delete all the actions.
+
+=cut
+
+sub cmd_pre590_prepost {
+    my $cmd    = shift;
+    my $line   = shift || '*';
+    my $dbline = shift;
+
+    return &cmd_prepost( $cmd, $line, $dbline );
+} ## end sub cmd_pre590_prepost
+
+=head2 C<cmd_prepost>
+
+Actually does all the handling for C<E<lt>>, C<E<gt>>, C<{{>, C<{>, etc.
+Since the lists of actions are all held in arrays that are pointed to by
+references anyway, all we have to do is pick the right array reference and
+then use generic code to all, delete, or list actions.
+
+=cut
+
+sub cmd_prepost {
+    my $cmd = shift;
+
+    # No action supplied defaults to 'list'.
+    my $line = shift || '?';
+
+    # Figure out what to put in the prompt.
+    my $which = '';
+
+    # Make sure we have some array or another to address later.
+    # This means that if ssome reason the tests fail, we won't be
+    # trying to stash actions or delete them from the wrong place.
+    my $aref = [];
+
+    # < - Perl code to run before prompt.
+    if ( $cmd =~ /^\</o ) {
+        $which = 'pre-perl';
+        $aref  = $pre;
+    }
+
+    # > - Perl code to run after prompt.
+    elsif ( $cmd =~ /^\>/o ) {
+        $which = 'post-perl';
+        $aref  = $post;
+    }
+
+    # { - first check for properly-balanced braces.
+    elsif ( $cmd =~ /^\{/o ) {
+        if ( $cmd =~ /^\{.*\}$/o && unbalanced( substr( $cmd, 1 ) ) ) {
+            print $OUT
+"$cmd is now a debugger command\nuse `;$cmd' if you mean Perl code\n";
+        }
+
+        # Properly balanced. Pre-prompt debugger actions.
+        else {
+            $which = 'pre-debugger';
+            $aref  = $pretype;
+        }
+    } ## end elsif ( $cmd =~ /^\{/o )
+
+    # Did we find something that makes sense?
+    unless ($which) {
+        print $OUT "Confused by command: $cmd\n";
+    }
+
+    # Yes.
+    else {
+
+        # List actions.
+        if ( $line =~ /^\s*\?\s*$/o ) {
+            unless (@$aref) {
+
+                # Nothing there. Complain.
+                print $OUT "No $which actions.\n";
+            }
+            else {
+
+                # List the actions in the selected list.
+                print $OUT "$which commands:\n";
+                foreach my $action (@$aref) {
+                    print $OUT "\t$cmd -- $action\n";
+                }
+            } ## end else
+        } ## end if ( $line =~ /^\s*\?\s*$/o)
+
+        # Might be a delete.
+        else {
+            if ( length($cmd) == 1 ) {
+                if ( $line =~ /^\s*\*\s*$/o ) {
+
+                    # It's a delete. Get rid of the old actions in the
+                    # selected list..
+                    @$aref = ();
+                    print $OUT "All $cmd actions cleared.\n";
+                }
+                else {
+
+                    # Replace all the actions. (This is a <, >, or {).
+                    @$aref = action($line);
+                }
+            } ## end if ( length($cmd) == 1)
+            elsif ( length($cmd) == 2 ) {
+
+                # Add the action to the line. (This is a <<, >>, or {{).
+                push @$aref, action($line);
+            }
+            else {
+
+                # <<<, >>>>, {{{{{{ ... something not a command.
+                print $OUT
+                  "Confused by strange length of $which command($cmd)...\n";
+            }
+        } ## end else [ if ( $line =~ /^\s*\?\s*$/o)
+    } ## end else
+} ## end sub cmd_prepost
+
+=head1 C<DB::fake>
+
+Contains the C<at_exit> routine that the debugger uses to issue the
+C<Debugged program terminated ...> message after the program completes. See
+the C<END> block documentation for more details.
+
+=cut
+
+package DB::fake;
+
+sub at_exit {
+    "Debugged program terminated.  Use `q' to quit or `R' to restart.";
+}
+
+package DB;    # Do not trace this 1; below!
+
+1;
+
+
Index: /for-distributions/trunk/bin/windows/perl/lib/perllocal.pod
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/perllocal.pod	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/perllocal.pod	(revision 14489)
@@ -0,0 +1,44 @@
+=head2 Wed Aug  2 14:34:13 2006: C<Module> L<XML::Parser|XML::Parser>
+
+=over 4
+
+=item *
+
+C<installed into: c:\shaoqunWu\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.34>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
+=head2 Wed Aug  2 15:04:58 2006: C<Module> L<XML::Parser|XML::Parser>
+
+=over 4
+
+=item *
+
+C<installed into: c:\shaoqunWu\perl\lib>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 2.34>
+
+=item *
+
+C<EXE_FILES: >
+
+=back
+
Index: /for-distributions/trunk/bin/windows/perl/lib/pwd.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/pwd.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/pwd.pl	(revision 14489)
@@ -0,0 +1,67 @@
+;# pwd.pl - keeps track of current working directory in PWD environment var
+;#
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Cwd
+#
+;# $RCSfile: pwd.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:24:11 $
+;#
+;# $Log:	pwd.pl,v $
+;#
+;# Usage:
+;#	require "pwd.pl";
+;#	&initpwd;
+;#	...
+;#	&chdir($newdir);
+
+package pwd;
+
+sub main'initpwd {
+    if ($ENV{'PWD'}) {
+	local($dd,$di) = stat('.');
+	local($pd,$pi) = stat($ENV{'PWD'});
+	if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
+	    chop($ENV{'PWD'} = `pwd`);
+	}
+    }
+    else {
+	chop($ENV{'PWD'} = `pwd`);
+    }
+    if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|) {
+	local($pd,$pi) = stat($2);
+	local($dd,$di) = stat($1);
+	if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
+	    $ENV{'PWD'}="$2$3";
+	}
+    }
+}
+
+sub main'chdir {
+    local($newdir) = shift;
+    $newdir =~ s|/{2,}|/|g;
+    if (chdir $newdir) {
+	if ($newdir =~ m#^/#) {
+	    $ENV{'PWD'} = $newdir;
+	}
+	else {
+	    local(@curdir) = split(m#/#,$ENV{'PWD'});
+	    @curdir = '' unless @curdir;
+	    foreach $component (split(m#/#, $newdir)) {
+		next if $component eq '.';
+		pop(@curdir),next if $component eq '..';
+		push(@curdir,$component);
+	    }
+	    $ENV{'PWD'} = join('/',@curdir) || '/';
+	}
+    }
+    else {
+	0;
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/re.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/re.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/re.pm	(revision 14489)
@@ -0,0 +1,134 @@
+package re;
+
+our $VERSION = 0.05;
+
+=head1 NAME
+
+re - Perl pragma to alter regular expression behaviour
+
+=head1 SYNOPSIS
+
+    use re 'taint';
+    ($x) = ($^X =~ /^(.*)$/s);     # $x is tainted here
+
+    $pat = '(?{ $foo = 1 })';
+    use re 'eval';
+    /foo${pat}bar/;		   # won't fail (when not under -T switch)
+
+    {
+	no re 'taint';		   # the default
+	($x) = ($^X =~ /^(.*)$/s); # $x is not tainted here
+
+	no re 'eval';		   # the default
+	/foo${pat}bar/;		   # disallowed (with or without -T switch)
+    }
+
+    use re 'debug';		   # NOT lexically scoped (as others are)
+    /^(.*)$/s;			   # output debugging info during
+    				   #     compile and run time
+
+    use re 'debugcolor';	   # same as 'debug', but with colored output
+    ...
+
+(We use $^X in these examples because it's tainted by default.)
+
+=head1 DESCRIPTION
+
+When C<use re 'taint'> is in effect, and a tainted string is the target
+of a regex, the regex memories (or values returned by the m// operator
+in list context) are tainted.  This feature is useful when regex operations
+on tainted data aren't meant to extract safe substrings, but to perform
+other transformations.
+
+When C<use re 'eval'> is in effect, a regex is allowed to contain
+C<(?{ ... })> zero-width assertions even if regular expression contains
+variable interpolation.  That is normally disallowed, since it is a
+potential security risk.  Note that this pragma is ignored when the regular
+expression is obtained from tainted data, i.e.  evaluation is always
+disallowed with tainted regular expressions.  See L<perlre/(?{ code })>.
+
+For the purpose of this pragma, interpolation of precompiled regular
+expressions (i.e., the result of C<qr//>) is I<not> considered variable
+interpolation.  Thus:
+
+    /foo${pat}bar/
+
+I<is> allowed if $pat is a precompiled regular expression, even
+if $pat contains C<(?{ ... })> assertions.
+
+When C<use re 'debug'> is in effect, perl emits debugging messages when
+compiling and using regular expressions.  The output is the same as that
+obtained by running a C<-DDEBUGGING>-enabled perl interpreter with the
+B<-Dr> switch. It may be quite voluminous depending on the complexity
+of the match.  Using C<debugcolor> instead of C<debug> enables a
+form of output that can be used to get a colorful display on terminals
+that understand termcap color sequences.  Set C<$ENV{PERL_RE_TC}> to a
+comma-separated list of C<termcap> properties to use for highlighting
+strings on/off, pre-point part on/off.
+See L<perldebug/"Debugging regular expressions"> for additional info.
+
+The directive C<use re 'debug'> is I<not lexically scoped>, as the
+other directives are.  It has both compile-time and run-time effects.
+
+See L<perlmodlib/Pragmatic Modules>.
+
+=cut
+
+# N.B. File::Basename contains a literal for 'taint' as a fallback.  If
+# taint is changed here, File::Basename must be updated as well.
+my %bitmask = (
+taint		=> 0x00100000, # HINT_RE_TAINT
+eval		=> 0x00200000, # HINT_RE_EVAL
+);
+
+sub setcolor {
+ eval {				# Ignore errors
+  require Term::Cap;
+
+  my $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning.
+  my $props = $ENV{PERL_RE_TC} || 'md,me,so,se,us,ue';
+  my @props = split /,/, $props;
+  my $colors = join "\t", map {$terminal->Tputs($_,1)} @props;
+
+  $colors =~ s/\0//g;
+  $ENV{PERL_RE_COLORS} = $colors;
+ };
+}
+
+sub bits {
+    my $on = shift;
+    my $bits = 0;
+    unless (@_) {
+	require Carp;
+	Carp::carp("Useless use of \"re\" pragma");
+    }
+    foreach my $s (@_){
+      if ($s eq 'debug' or $s eq 'debugcolor') {
+ 	  setcolor() if $s eq 'debugcolor';
+	  require XSLoader;
+	  XSLoader::load('re');
+	  install() if $on;
+	  uninstall() unless $on;
+	  next;
+      }
+      if (exists $bitmask{$s}) {
+	  $bits |= $bitmask{$s};
+      } else {
+	  require Carp;
+	  Carp::carp("Unknown \"re\" subpragma '$s' (known ones are: @{[join(', ', map {qq('$_')} 'debug', 'debugcolor', sort keys %bitmask)]})");
+      }
+    }
+    $bits;
+}
+
+sub import {
+    shift;
+    $^H |= bits(1, @_);
+}
+
+sub unimport {
+    shift;
+    $^H &= ~ bits(0, @_);
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/shellwords.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/shellwords.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/shellwords.pl	(revision 14489)
@@ -0,0 +1,14 @@
+;# shellwords.pl
+;#
+;# Usage:
+;#	require 'shellwords.pl';
+;#	@words = shellwords($line);
+;#	or
+;#	@words = shellwords(@lines);
+;#	or
+;#	@words = shellwords();		# defaults to $_ (and clobbers it)
+
+require Text::ParseWords;
+*shellwords = \&Text::ParseWords::old_shellwords;
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/sigtrap.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/sigtrap.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/sigtrap.pm	(revision 14489)
@@ -0,0 +1,289 @@
+package sigtrap;
+
+=head1 NAME
+
+sigtrap - Perl pragma to enable simple signal handling
+
+=cut
+
+use Carp;
+
+$VERSION = 1.02;
+$Verbose ||= 0;
+
+sub import {
+    my $pkg = shift;
+    my $handler = \&handler_traceback;
+    my $saw_sig = 0;
+    my $untrapped = 0;
+    local $_;
+
+  Arg_loop:
+    while (@_) {
+	$_ = shift;
+	if (/^[A-Z][A-Z0-9]*$/) {
+	    $saw_sig++;
+	    unless ($untrapped and $SIG{$_} and $SIG{$_} ne 'DEFAULT') {
+		print "Installing handler $handler for $_\n" if $Verbose;
+		$SIG{$_} = $handler;
+	    }
+	}
+	elsif ($_ eq 'normal-signals') {
+	    unshift @_, grep(exists $SIG{$_}, qw(HUP INT PIPE TERM));
+	}
+	elsif ($_ eq 'error-signals') {
+	    unshift @_, grep(exists $SIG{$_},
+			     qw(ABRT BUS EMT FPE ILL QUIT SEGV SYS TRAP));
+	}
+	elsif ($_ eq 'old-interface-signals') {
+	    unshift @_,
+	    grep(exists $SIG{$_},
+		 qw(ABRT BUS EMT FPE ILL PIPE QUIT SEGV SYS TERM TRAP));
+	}
+    	elsif ($_ eq 'stack-trace') {
+	    $handler = \&handler_traceback;
+	}
+	elsif ($_ eq 'die') {
+	    $handler = \&handler_die;
+	}
+	elsif ($_ eq 'handler') {
+	    @_ or croak "No argument specified after 'handler'";
+	    $handler = shift;
+	    unless (ref $handler or $handler eq 'IGNORE'
+			or $handler eq 'DEFAULT') {
+    	    	require Symbol;
+		$handler = Symbol::qualify($handler, (caller)[0]);
+	    }
+	}
+	elsif ($_ eq 'untrapped') {
+	    $untrapped = 1;
+	}
+	elsif ($_ eq 'any') {
+	    $untrapped = 0;
+	}
+	elsif ($_ =~ /^\d/) {
+	    $VERSION >= $_ or croak "sigtrap.pm version $_ required,"
+		    	    	    	. " but this is only version $VERSION";
+	}
+	else {
+	    croak "Unrecognized argument $_";
+	}
+    }
+    unless ($saw_sig) {
+	@_ = qw(old-interface-signals);
+	goto Arg_loop;
+    }
+}
+
+sub handler_die {
+    croak "Caught a SIG$_[0]";
+}
+
+sub handler_traceback {
+    package DB;		# To get subroutine args.
+    $SIG{'ABRT'} = DEFAULT;
+    kill 'ABRT', $$ if $panic++;
+    syswrite(STDERR, 'Caught a SIG', 12);
+    syswrite(STDERR, $_[0], length($_[0]));
+    syswrite(STDERR, ' at ', 4);
+    ($pack,$file,$line) = caller;
+    syswrite(STDERR, $file, length($file));
+    syswrite(STDERR, ' line ', 6);
+    syswrite(STDERR, $line, length($line));
+    syswrite(STDERR, "\n", 1);
+
+    # Now go for broke.
+    for ($i = 1; ($p,$f,$l,$s,$h,$w,$e,$r) = caller($i); $i++) {
+        @a = ();
+	for $arg (@args) {
+	    $_ = "$arg";
+	    s/([\'\\])/\\$1/g;
+	    s/([^\0]*)/'$1'/
+	      unless /^(?: -?[\d.]+ | \*[\w:]* )$/x;
+	    s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
+	    s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
+	    push(@a, $_);
+	}
+	$w = $w ? '@ = ' : '$ = ';
+	$a = $h ? '(' . join(', ', @a) . ')' : '';
+	$e =~ s/\n\s*\;\s*\Z// if $e;
+	$e =~ s/[\\\']/\\$1/g if $e;
+	if ($r) {
+	    $s = "require '$e'";
+	} elsif (defined $r) {
+	    $s = "eval '$e'";
+	} elsif ($s eq '(eval)') {
+	    $s = "eval {...}";
+	}
+	$f = "file `$f'" unless $f eq '-e';
+	$mess = "$w$s$a called from $f line $l\n";
+	syswrite(STDERR, $mess, length($mess));
+    }
+    kill 'ABRT', $$;
+}
+
+1;
+
+__END__
+
+=head1 SYNOPSIS
+
+    use sigtrap;
+    use sigtrap qw(stack-trace old-interface-signals);	# equivalent
+    use sigtrap qw(BUS SEGV PIPE ABRT);
+    use sigtrap qw(die INT QUIT);
+    use sigtrap qw(die normal-signals);
+    use sigtrap qw(die untrapped normal-signals);
+    use sigtrap qw(die untrapped normal-signals
+		    stack-trace any error-signals);
+    use sigtrap 'handler' => \&my_handler, 'normal-signals';
+    use sigtrap qw(handler my_handler normal-signals
+    	    	    stack-trace error-signals);
+
+=head1 DESCRIPTION
+
+The B<sigtrap> pragma is a simple interface to installing signal
+handlers.  You can have it install one of two handlers supplied by
+B<sigtrap> itself (one which provides a Perl stack trace and one which
+simply C<die()>s), or alternately you can supply your own handler for it
+to install.  It can be told only to install a handler for signals which
+are either untrapped or ignored.  It has a couple of lists of signals to
+trap, plus you can supply your own list of signals.
+
+The arguments passed to the C<use> statement which invokes B<sigtrap>
+are processed in order.  When a signal name or the name of one of
+B<sigtrap>'s signal lists is encountered a handler is immediately
+installed, when an option is encountered it affects subsequently
+installed handlers.
+
+=head1 OPTIONS
+
+=head2 SIGNAL HANDLERS
+
+These options affect which handler will be used for subsequently
+installed signals.
+
+=over 4
+
+=item B<stack-trace>
+
+The handler used for subsequently installed signals outputs a Perl stack
+trace to STDERR and then tries to dump core.  This is the default signal
+handler.
+
+=item B<die>
+
+The handler used for subsequently installed signals calls C<die>
+(actually C<croak>) with a message indicating which signal was caught.
+
+=item B<handler> I<your-handler>
+
+I<your-handler> will be used as the handler for subsequently installed
+signals.  I<your-handler> can be any value which is valid as an
+assignment to an element of C<%SIG>.
+
+=back
+
+=head2 SIGNAL LISTS
+
+B<sigtrap> has a few built-in lists of signals to trap.  They are:
+
+=over 4
+
+=item B<normal-signals>
+
+These are the signals which a program might normally expect to encounter
+and which by default cause it to terminate.  They are HUP, INT, PIPE and
+TERM.
+
+=item B<error-signals>
+
+These signals usually indicate a serious problem with the Perl
+interpreter or with your script.  They are ABRT, BUS, EMT, FPE, ILL,
+QUIT, SEGV, SYS and TRAP.
+
+=item B<old-interface-signals>
+
+These are the signals which were trapped by default by the old
+B<sigtrap> interface, they are ABRT, BUS, EMT, FPE, ILL, PIPE, QUIT,
+SEGV, SYS, TERM, and TRAP.  If no signals or signals lists are passed to
+B<sigtrap>, this list is used.
+
+=back
+
+For each of these three lists, the collection of signals set to be
+trapped is checked before trapping; if your architecture does not
+implement a particular signal, it will not be trapped but rather
+silently ignored.
+
+=head2 OTHER
+
+=over 4
+
+=item B<untrapped>
+
+This token tells B<sigtrap> to install handlers only for subsequently
+listed signals which aren't already trapped or ignored.
+
+=item B<any>
+
+This token tells B<sigtrap> to install handlers for all subsequently
+listed signals.  This is the default behavior.
+
+=item I<signal>
+
+Any argument which looks like a signal name (that is,
+C</^[A-Z][A-Z0-9]*$/>) indicates that B<sigtrap> should install a
+handler for that name.
+
+=item I<number>
+
+Require that at least version I<number> of B<sigtrap> is being used.
+
+=back
+
+=head1 EXAMPLES
+
+Provide a stack trace for the old-interface-signals:
+
+    use sigtrap;
+
+Ditto:
+
+    use sigtrap qw(stack-trace old-interface-signals);
+
+Provide a stack trace on the 4 listed signals only:
+
+    use sigtrap qw(BUS SEGV PIPE ABRT);
+
+Die on INT or QUIT:
+
+    use sigtrap qw(die INT QUIT);
+
+Die on HUP, INT, PIPE or TERM:
+
+    use sigtrap qw(die normal-signals);
+
+Die on HUP, INT, PIPE or TERM, except don't change the behavior for
+signals which are already trapped or ignored:
+
+    use sigtrap qw(die untrapped normal-signals);
+
+Die on receipt one of an of the B<normal-signals> which is currently
+B<untrapped>, provide a stack trace on receipt of B<any> of the
+B<error-signals>:
+
+    use sigtrap qw(die untrapped normal-signals
+		    stack-trace any error-signals);
+
+Install my_handler() as the handler for the B<normal-signals>:
+
+    use sigtrap 'handler', \&my_handler, 'normal-signals';
+
+Install my_handler() as the handler for the normal-signals, provide a
+Perl stack trace on receipt of one of the error-signals:
+
+    use sigtrap qw(handler my_handler normal-signals
+    	    	    stack-trace error-signals);
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/sort.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/sort.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/sort.pm	(revision 14489)
@@ -0,0 +1,201 @@
+package sort;
+
+our $VERSION = '1.02';
+
+# Currently the hints for pp_sort are stored in the global variable
+# $sort::hints. An improvement would be to store them in $^H{SORT} and have
+# this information available somewhere in the listop OP_SORT, to allow lexical
+# scoping of this pragma. -- rgs 2002-04-30
+
+our $hints	       = 0;
+
+$sort::quicksort_bit   = 0x00000001;
+$sort::mergesort_bit   = 0x00000002;
+$sort::sort_bits       = 0x000000FF; # allow 256 different ones
+$sort::stable_bit      = 0x00000100;
+
+use strict;
+
+sub import {
+    shift;
+    if (@_ == 0) {
+	require Carp;
+	Carp::croak("sort pragma requires arguments");
+    }
+    local $_;
+    no warnings 'uninitialized';	# bitops would warn
+    while ($_ = shift(@_)) {
+	if (/^_q(?:uick)?sort$/) {
+	    $hints &= ~$sort::sort_bits;
+	    $hints |=  $sort::quicksort_bit;
+	} elsif ($_ eq '_mergesort') {
+	    $hints &= ~$sort::sort_bits;
+	    $hints |=  $sort::mergesort_bit;
+	} elsif ($_ eq 'stable') {
+	    $hints |=  $sort::stable_bit;
+	} elsif ($_ eq 'defaults') {
+	    $hints =   0;
+	} else {
+	    require Carp;
+	    Carp::croak("sort: unknown subpragma '$_'");
+	}
+    }
+}
+
+sub unimport {
+    shift;
+    if (@_ == 0) {
+	require Carp;
+	Carp::croak("sort pragma requires arguments");
+    }
+    local $_;
+    no warnings 'uninitialized';	# bitops would warn
+    while ($_ = shift(@_)) {
+	if (/^_q(?:uick)?sort$/) {
+	    $hints &= ~$sort::sort_bits;
+	} elsif ($_ eq '_mergesort') {
+	    $hints &= ~$sort::sort_bits;
+	} elsif ($_ eq 'stable') {
+	    $hints &= ~$sort::stable_bit;
+	} else {
+	    require Carp;
+	    Carp::croak("sort: unknown subpragma '$_'");
+	}
+    }
+}
+
+sub current {
+    my @sort;
+    if ($hints) {
+	push @sort, 'quicksort' if $hints & $sort::quicksort_bit;
+	push @sort, 'mergesort' if $hints & $sort::mergesort_bit;
+	push @sort, 'stable'    if $hints & $sort::stable_bit;
+    }
+    push @sort, 'mergesort' unless @sort;
+    join(' ', @sort);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+sort - perl pragma to control sort() behaviour
+
+=head1 SYNOPSIS
+
+    use sort 'stable';		# guarantee stability
+    use sort '_quicksort';	# use a quicksort algorithm
+    use sort '_mergesort';	# use a mergesort algorithm
+    use sort 'defaults';	# revert to default behavior
+    no  sort 'stable';		# stability not important
+
+    use sort '_qsort';		# alias for quicksort
+
+    my $current = sort::current();	# identify prevailing algorithm
+
+=head1 DESCRIPTION
+
+With the C<sort> pragma you can control the behaviour of the builtin
+C<sort()> function.
+
+In Perl versions 5.6 and earlier the quicksort algorithm was used to
+implement C<sort()>, but in Perl 5.8 a mergesort algorithm was also made
+available, mainly to guarantee worst case O(N log N) behaviour:
+the worst case of quicksort is O(N**2).  In Perl 5.8 and later,
+quicksort defends against quadratic behaviour by shuffling large
+arrays before sorting.
+
+A stable sort means that for records that compare equal, the original
+input ordering is preserved.  Mergesort is stable, quicksort is not.
+Stability will matter only if elements that compare equal can be
+distinguished in some other way.  That means that simple numerical
+and lexical sorts do not profit from stability, since equal elements
+are indistinguishable.  However, with a comparison such as
+
+   { substr($a, 0, 3) cmp substr($b, 0, 3) }
+
+stability might matter because elements that compare equal on the
+first 3 characters may be distinguished based on subsequent characters.
+In Perl 5.8 and later, quicksort can be stabilized, but doing so will
+add overhead, so it should only be done if it matters.
+
+The best algorithm depends on many things.  On average, mergesort
+does fewer comparisons than quicksort, so it may be better when
+complicated comparison routines are used.  Mergesort also takes
+advantage of pre-existing order, so it would be favored for using
+C<sort()> to merge several sorted arrays.  On the other hand, quicksort
+is often faster for small arrays, and on arrays of a few distinct
+values, repeated many times.  You can force the
+choice of algorithm with this pragma, but this feels heavy-handed,
+so the subpragmas beginning with a C<_> may not persist beyond Perl 5.8.
+The default algorithm is mergesort, which will be stable even if
+you do not explicitly demand it.
+But the stability of the default sort is a side-effect that could
+change in later versions.  If stability is important, be sure to
+say so with a
+
+  use sort 'stable';
+
+The C<no sort> pragma doesn't
+I<forbid> what follows, it just leaves the choice open.  Thus, after
+
+  no sort qw(_mergesort stable);
+
+a mergesort, which happens to be stable, will be employed anyway.
+Note that
+
+  no sort "_quicksort";
+  no sort "_mergesort";
+
+have exactly the same effect, leaving the choice of sort algorithm open.
+
+=head1 CAVEATS
+
+This pragma is not lexically scoped: its effect is global to the program
+it appears in.  That means the following will probably not do what you
+expect, because I<both> pragmas take effect at compile time, before
+I<either> C<sort()> happens.
+
+  { use sort "_quicksort";
+    print sort::current . "\n";
+    @a = sort @b;
+  }
+  { use sort "stable";
+    print sort::current . "\n";
+    @c = sort @d;
+  }
+  # prints:
+  # quicksort stable
+  # quicksort stable
+
+You can achieve the effect you probably wanted by using C<eval()>
+to defer the pragmas until run time.  Use the quoted argument
+form of C<eval()>, I<not> the BLOCK form, as in
+
+  eval { use sort "_quicksort" }; # WRONG
+
+or the effect will still be at compile time.
+Reset to default options before selecting other subpragmas
+(in case somebody carelessly left them on) and after sorting,
+as a courtesy to others.
+
+  { eval 'use sort qw(defaults _quicksort)'; # force quicksort
+    eval 'no sort "stable"';      # stability not wanted
+    print sort::current . "\n";
+    @a = sort @b;
+    eval 'use sort "defaults"';   # clean up, for others
+  }
+  { eval 'use sort qw(defaults stable)';     # force stability
+    print sort::current . "\n";
+    @c = sort @d;
+    eval 'use sort "defaults"';   # clean up, for others
+  }
+  # prints:
+  # quicksort
+  # stable
+
+Scoping for this pragma may change in future versions.
+
+=cut
+
Index: /for-distributions/trunk/bin/windows/perl/lib/stat.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/stat.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/stat.pl	(revision 14489)
@@ -0,0 +1,31 @@
+;# $RCSfile: stat.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:24:13 $
+
+;# Usage:
+;#	require 'stat.pl';
+;#	@ary = stat(foo);
+;#	$st_dev = @ary[$ST_DEV];
+;#
+$ST_DEV =	0 + $[;
+$ST_INO =	1 + $[;
+$ST_MODE =	2 + $[;
+$ST_NLINK =	3 + $[;
+$ST_UID =	4 + $[;
+$ST_GID =	5 + $[;
+$ST_RDEV =	6 + $[;
+$ST_SIZE =	7 + $[;
+$ST_ATIME =	8 + $[;
+$ST_MTIME =	9 + $[;
+$ST_CTIME =	10 + $[;
+$ST_BLKSIZE =	11 + $[;
+$ST_BLOCKS =	12 + $[;
+
+;# Usage:
+;#	require 'stat.pl';
+;#	do Stat('foo');		# sets st_* as a side effect
+;#
+sub Stat {
+    ($st_dev,$st_ino,$st_mode,$st_nlink,$st_uid,$st_gid,$st_rdev,$st_size,
+	$st_atime,$st_mtime,$st_ctime,$st_blksize,$st_blocks) = stat(shift(@_));
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/strict.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/strict.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/strict.pm	(revision 14489)
@@ -0,0 +1,136 @@
+package strict;
+
+$strict::VERSION = "1.03";
+
+my %bitmask = (
+refs => 0x00000002,
+subs => 0x00000200,
+vars => 0x00000400
+);
+
+sub bits {
+    my $bits = 0;
+    my @wrong;
+    foreach my $s (@_) {
+	push @wrong, $s unless exists $bitmask{$s};
+        $bits |= $bitmask{$s} || 0;
+    }
+    if (@wrong) {
+        require Carp;
+        Carp::croak("Unknown 'strict' tag(s) '@wrong'");
+    }
+    $bits;
+}
+
+my $default_bits = bits(qw(refs subs vars));
+
+sub import {
+    shift;
+    $^H |= @_ ? bits(@_) : $default_bits;
+}
+
+sub unimport {
+    shift;
+    $^H &= ~ (@_ ? bits(@_) : $default_bits);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+strict - Perl pragma to restrict unsafe constructs
+
+=head1 SYNOPSIS
+
+    use strict;
+
+    use strict "vars";
+    use strict "refs";
+    use strict "subs";
+
+    use strict;
+    no strict "vars";
+
+=head1 DESCRIPTION
+
+If no import list is supplied, all possible restrictions are assumed.
+(This is the safest mode to operate in, but is sometimes too strict for
+casual programming.)  Currently, there are three possible things to be
+strict about:  "subs", "vars", and "refs".
+
+=over 6
+
+=item C<strict refs>
+
+This generates a runtime error if you 
+use symbolic references (see L<perlref>).
+
+    use strict 'refs';
+    $ref = \$foo;
+    print $$ref;	# ok
+    $ref = "foo";
+    print $$ref;	# runtime error; normally ok
+    $file = "STDOUT";
+    print $file "Hi!";	# error; note: no comma after $file
+
+There is one exception to this rule:
+
+    $bar = \&{'foo'};
+    &$bar;
+
+is allowed so that C<goto &$AUTOLOAD> would not break under stricture.
+
+
+=item C<strict vars>
+
+This generates a compile-time error if you access a variable that wasn't
+declared via C<our> or C<use vars>,
+localized via C<my()>, or wasn't fully qualified.  Because this is to avoid
+variable suicide problems and subtle dynamic scoping issues, a merely
+local() variable isn't good enough.  See L<perlfunc/my> and
+L<perlfunc/local>.
+
+    use strict 'vars';
+    $X::foo = 1;	 # ok, fully qualified
+    my $foo = 10;	 # ok, my() var
+    local $foo = 9;	 # blows up
+
+    package Cinna;
+    our $bar;			# Declares $bar in current package
+    $bar = 'HgS';		# ok, global declared via pragma
+
+The local() generated a compile-time error because you just touched a global
+name without fully qualifying it.
+
+Because of their special use by sort(), the variables $a and $b are
+exempted from this check.
+
+=item C<strict subs>
+
+This disables the poetry optimization, generating a compile-time error if
+you try to use a bareword identifier that's not a subroutine, unless it
+is a simple identifier (no colons) and that it appears in curly braces or
+on the left hand side of the C<< => >> symbol.
+
+    use strict 'subs';
+    $SIG{PIPE} = Plumber;   	# blows up
+    $SIG{PIPE} = "Plumber"; 	# just fine: quoted string is always ok
+    $SIG{PIPE} = \&Plumber; 	# preferred form
+
+=back
+
+See L<perlmodlib/Pragmatic Modules>.
+
+=head1 HISTORY
+
+C<strict 'subs'>, with Perl 5.6.1, erroneously permitted to use an unquoted
+compound identifier (e.g. C<Foo::Bar>) as a hash key (before C<< => >> or
+inside curlies), but without forcing it always to a literal string.
+
+Starting with Perl 5.8.1 strict is strict about its restrictions:
+if unknown restrictions are used, the strict pragma will abort with
+
+    Unknown 'strict' tag(s) '...'
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/subs.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/subs.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/subs.pm	(revision 14489)
@@ -0,0 +1,40 @@
+package subs;
+
+our $VERSION = '1.00';
+
+=head1 NAME
+
+subs - Perl pragma to predeclare sub names
+
+=head1 SYNOPSIS
+
+    use subs qw(frob);
+    frob 3..10;
+
+=head1 DESCRIPTION
+
+This will predeclare all the subroutine whose names are 
+in the list, allowing you to use them without parentheses
+even before they're declared.
+
+Unlike pragmas that affect the C<$^H> hints variable, the C<use vars> and
+C<use subs> declarations are not BLOCK-scoped.  They are thus effective
+for the entire file in which they appear.  You may not rescind such
+declarations with C<no vars> or C<no subs>.
+
+See L<perlmodlib/Pragmatic Modules> and L<strict/strict subs>.
+
+=cut
+
+require 5.000;
+
+sub import {
+    my $callpack = caller;
+    my $pack = shift;
+    my @imports = @_;
+    foreach $sym (@imports) {
+	*{"${callpack}::$sym"} = \&{"${callpack}::$sym"};
+    }
+};
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/syslog.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/syslog.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/syslog.pl	(revision 14489)
@@ -0,0 +1,199 @@
+#
+# syslog.pl
+#
+# $Log:	syslog.pl,v $
+# 
+# tom christiansen <tchrist@convex.com>
+# modified to use sockets by Larry Wall <lwall@jpl-devvax.jpl.nasa.gov>
+# NOTE: openlog now takes three arguments, just like openlog(3)
+#
+# call syslog() with a string priority and a list of printf() args
+# like syslog(3)
+#
+#  usage: require 'syslog.pl';
+#
+#  then (put these all in a script to test function)
+#		
+#
+#	do openlog($program,'cons,pid','user');
+#	do syslog('info','this is another test');
+#	do syslog('mail|warning','this is a better test: %d', time);
+#	do closelog();
+#	
+#	do syslog('debug','this is the last test');
+#	do openlog("$program $$",'ndelay','user');
+#	do syslog('notice','fooprogram: this is really done');
+#
+#	$! = 55;
+#	do syslog('info','problem was %m'); # %m == $! in syslog(3)
+
+package syslog;
+
+use warnings::register;
+
+$host = 'localhost' unless $host;	# set $syslog'host to change
+
+if ($] >= 5 && warnings::enabled()) {
+    warnings::warn("You should 'use Sys::Syslog' instead; continuing");
+} 
+
+require 'syslog.ph';
+
+ eval 'use Socket; 1' 			||
+     eval { require "socket.ph" } 	||
+     require "sys/socket.ph";
+
+$maskpri = &LOG_UPTO(&LOG_DEBUG);
+
+sub main'openlog {
+    ($ident, $logopt, $facility) = @_;  # package vars
+    $lo_pid = $logopt =~ /\bpid\b/;
+    $lo_ndelay = $logopt =~ /\bndelay\b/;
+    $lo_cons = $logopt =~ /\bcons\b/;
+    $lo_nowait = $logopt =~ /\bnowait\b/;
+    &connect if $lo_ndelay;
+} 
+
+sub main'closelog {
+    $facility = $ident = '';
+    &disconnect;
+} 
+
+sub main'setlogmask {
+    local($oldmask) = $maskpri;
+    $maskpri = shift;
+    $oldmask;
+}
+ 
+sub main'syslog {
+    local($priority) = shift;
+    local($mask) = shift;
+    local($message, $whoami);
+    local(@words, $num, $numpri, $numfac, $sum);
+    local($facility) = $facility;	# may need to change temporarily.
+
+    die "syslog: expected both priority and mask" unless $mask && $priority;
+
+    @words = split(/\W+/, $priority, 2);# Allow "level" or "level|facility".
+    undef $numpri;
+    undef $numfac;
+    foreach (@words) {
+	$num = &xlate($_);		# Translate word to number.
+	if (/^kern$/ || $num < 0) {
+	    die "syslog: invalid level/facility: $_\n";
+	}
+	elsif ($num <= &LOG_PRIMASK) {
+	    die "syslog: too many levels given: $_\n" if defined($numpri);
+	    $numpri = $num;
+	    return 0 unless &LOG_MASK($numpri) & $maskpri;
+	}
+	else {
+	    die "syslog: too many facilities given: $_\n" if defined($numfac);
+	    $facility = $_;
+	    $numfac = $num;
+	}
+    }
+
+    die "syslog: level must be given\n" unless defined($numpri);
+
+    if (!defined($numfac)) {	# Facility not specified in this call.
+	$facility = 'user' unless $facility;
+	$numfac = &xlate($facility);
+    }
+
+    &connect unless $connected;
+
+    $whoami = $ident;
+
+    if (!$ident && $mask =~ /^(\S.*):\s?(.*)/) {
+	$whoami = $1;
+	$mask = $2;
+    } 
+
+    unless ($whoami) {
+	($whoami = getlogin) ||
+	    ($whoami = getpwuid($<)) ||
+		($whoami = 'syslog');
+    }
+
+    $whoami .= "[$$]" if $lo_pid;
+
+    $mask =~ s/%m/$!/g;
+    $mask .= "\n" unless $mask =~ /\n$/;
+    $message = sprintf ($mask, @_);
+
+    $sum = $numpri + $numfac;
+    unless (send(SYSLOG,"<$sum>$whoami: $message",0)) {
+	if ($lo_cons) {
+	    if ($pid = fork) {
+		unless ($lo_nowait) {
+		    do {$died = wait;} until $died == $pid || $died < 0;
+		}
+	    }
+	    else {
+		open(CONS,">/dev/console");
+		print CONS "<$facility.$priority>$whoami: $message\r";
+		exit if defined $pid;		# if fork failed, we're parent
+		close CONS;
+	    }
+	}
+    }
+}
+
+sub xlate {
+    local($name) = @_;
+    $name = uc $name;
+    $name = "LOG_$name" unless $name =~ /^LOG_/;
+    $name = "syslog'$name";
+    defined &$name ? &$name : -1;
+}
+
+sub connect {
+    $pat = 'S n C4 x8';
+
+    $af_unix = &AF_UNIX;
+    $af_inet = &AF_INET;
+
+    $stream = &SOCK_STREAM;
+    $datagram = &SOCK_DGRAM;
+
+    ($name,$aliases,$proto) = getprotobyname('udp');
+    $udp = $proto;
+
+    ($name,$aliases,$port,$proto) = getservbyname('syslog','udp');
+    $syslog = $port;
+
+    if (chop($myname = `hostname`)) {
+	($name,$aliases,$addrtype,$length,@addrs) = gethostbyname($myname);
+	die "Can't lookup $myname\n" unless $name;
+	@bytes = unpack("C4",$addrs[0]);
+    }
+    else {
+	@bytes = (0,0,0,0);
+    }
+    $this = pack($pat, $af_inet, 0, @bytes);
+
+    if ($host =~ /^\d+\./) {
+	@bytes = split(/\./,$host);
+    }
+    else {
+	($name,$aliases,$addrtype,$length,@addrs) = gethostbyname($host);
+	die "Can't lookup $host\n" unless $name;
+	@bytes = unpack("C4",$addrs[0]);
+    }
+    $that = pack($pat,$af_inet,$syslog,@bytes);
+
+    socket(SYSLOG,$af_inet,$datagram,$udp) || die "socket: $!\n";
+    bind(SYSLOG,$this) || die "bind: $!\n";
+    connect(SYSLOG,$that) || die "connect: $!\n";
+
+    local($old) = select(SYSLOG); $| = 1; select($old);
+    $connected = 1;
+}
+
+sub disconnect {
+    close SYSLOG;
+    $connected = 0;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/tainted.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/tainted.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/tainted.pl	(revision 14489)
@@ -0,0 +1,9 @@
+# This subroutine returns true if its argument is tainted, false otherwise.
+
+sub tainted {
+    local($@);
+    eval { kill 0 * $_[0] };
+    $@ =~ /^Insecure/;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/termcap.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/termcap.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/termcap.pl	(revision 14489)
@@ -0,0 +1,178 @@
+;# $RCSfile: termcap.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:24:16 $
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Term::Cap
+#
+;#
+;# Usage:
+;#	require 'ioctl.pl';
+;#	ioctl(TTY,$TIOCGETP,$foo);
+;#	($ispeed,$ospeed) = unpack('cc',$foo);
+;#	require 'termcap.pl';
+;#	&Tgetent('vt100');	# sets $TC{'cm'}, etc.
+;#	&Tputs(&Tgoto($TC{'cm'},$col,$row), 0, 'FILEHANDLE');
+;#	&Tputs($TC{'dl'},$affcnt,'FILEHANDLE');
+;#
+sub Tgetent {
+    local($TERM) = @_;
+    local($TERMCAP,$_,$entry,$loop,$field);
+
+    # warn "Tgetent: no ospeed set" unless $ospeed;
+    foreach $key (keys %TC) {
+	delete $TC{$key};
+    }
+    $TERM = $ENV{'TERM'} unless $TERM;
+    $TERM =~ s/(\W)/\\$1/g;
+    $TERMCAP = $ENV{'TERMCAP'};
+    $TERMCAP = '/etc/termcap' unless $TERMCAP;
+    if ($TERMCAP !~ m:^/:) {
+	if ($TERMCAP !~ /(^|\|)$TERM[:\|]/) {
+	    $TERMCAP = '/etc/termcap';
+	}
+    }
+    if ($TERMCAP =~ m:^/:) {
+	$entry = '';
+	do {
+	    $loop = "
+	    open(TERMCAP,'<$TERMCAP') || die \"Can't open $TERMCAP\";
+	    while (<TERMCAP>) {
+		next if /^#/;
+		next if /^\t/;
+		if (/(^|\\|)${TERM}[:\\|]/) {
+		    chop;
+		    while (chop eq '\\\\') {
+			\$_ .= <TERMCAP>;
+			chop;
+		    }
+		    \$_ .= ':';
+		    last;
+		}
+	    }
+	    close TERMCAP;
+	    \$entry .= \$_;
+	    ";
+	    eval $loop;
+	} while s/:tc=([^:]+):/:/ && ($TERM = $1);
+	$TERMCAP = $entry;
+    }
+
+    foreach $field (split(/:[\s:\\]*/,$TERMCAP)) {
+	if ($field =~ /^\w\w$/) {
+	    $TC{$field} = 1;
+	}
+	elsif ($field =~ /^(\w\w)#(.*)/) {
+	    $TC{$1} = $2 if $TC{$1} eq '';
+	}
+	elsif ($field =~ /^(\w\w)=(.*)/) {
+	    $entry = $1;
+	    $_ = $2;
+	    s/\\E/\033/g;
+	    s/\\(200)/pack('c',0)/eg;			# NUL character
+	    s/\\(0\d\d)/pack('c',oct($1))/eg;	# octal
+	    s/\\(0x[0-9A-Fa-f][0-9A-Fa-f])/pack('c',hex($1))/eg;	# hex
+	    s/\\(\d\d\d)/pack('c',$1 & 0177)/eg;
+	    s/\\n/\n/g;
+	    s/\\r/\r/g;
+	    s/\\t/\t/g;
+	    s/\\b/\b/g;
+	    s/\\f/\f/g;
+	    s/\\\^/\377/g;
+	    s/\^\?/\177/g;
+	    s/\^(.)/pack('c',ord($1) & 31)/eg;
+	    s/\\(.)/$1/g;
+	    s/\377/^/g;
+	    $TC{$entry} = $_ if $TC{$entry} eq '';
+	}
+    }
+    $TC{'pc'} = "\0" if $TC{'pc'} eq '';
+    $TC{'bc'} = "\b" if $TC{'bc'} eq '';
+}
+
+@Tputs = (0,200,133.3,90.9,74.3,66.7,50,33.3,16.7,8.3,5.5,4.1,2,1,.5,.2);
+
+sub Tputs {
+    local($string,$affcnt,$FH) = @_;
+    local($ms);
+    if ($string =~ /(^[\d.]+)(\*?)(.*)$/) {
+	$ms = $1;
+	$ms *= $affcnt if $2;
+	$string = $3;
+	$decr = $Tputs[$ospeed];
+	if ($decr > .1) {
+	    $ms += $decr / 2;
+	    $string .= $TC{'pc'} x ($ms / $decr);
+	}
+    }
+    print $FH $string if $FH;
+    $string;
+}
+
+sub Tgoto {
+    local($string) = shift(@_);
+    local($result) = '';
+    local($after) = '';
+    local($code,$tmp) = @_;
+    local(@tmp);
+    @tmp = ($tmp,$code);
+    local($online) = 0;
+    while ($string =~ /^([^%]*)%(.)(.*)/) {
+	$result .= $1;
+	$code = $2;
+	$string = $3;
+	if ($code eq 'd') {
+	    $result .= sprintf("%d",shift(@tmp));
+	}
+	elsif ($code eq '.') {
+	    $tmp = shift(@tmp);
+	    if ($tmp == 0 || $tmp == 4 || $tmp == 10) {
+		if ($online) {
+		    ++$tmp, $after .= $TC{'up'} if $TC{'up'};
+		}
+		else {
+		    ++$tmp, $after .= $TC{'bc'};
+		}
+	    }
+	    $result .= sprintf("%c",$tmp);
+	    $online = !$online;
+	}
+	elsif ($code eq '+') {
+	    $result .= sprintf("%c",shift(@tmp)+ord($string));
+	    $string = substr($string,1,99);
+	    $online = !$online;
+	}
+	elsif ($code eq 'r') {
+	    ($code,$tmp) = @tmp;
+	    @tmp = ($tmp,$code);
+	    $online = !$online;
+	}
+	elsif ($code eq '>') {
+	    ($code,$tmp,$string) = unpack("CCa99",$string);
+	    if ($tmp[$[] > $code) {
+		$tmp[$[] += $tmp;
+	    }
+	}
+	elsif ($code eq '2') {
+	    $result .= sprintf("%02d",shift(@tmp));
+	    $online = !$online;
+	}
+	elsif ($code eq '3') {
+	    $result .= sprintf("%03d",shift(@tmp));
+	    $online = !$online;
+	}
+	elsif ($code eq 'i') {
+	    ($code,$tmp) = @tmp;
+	    @tmp = ($code+1,$tmp+1);
+	}
+	else {
+	    return "OOPS";
+	}
+    }
+    $result . $string . $after;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/threads.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/threads.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/threads.pm	(revision 14489)
@@ -0,0 +1,298 @@
+package threads;
+
+use 5.008;
+use strict;
+use warnings;
+use Config;
+
+BEGIN {
+    unless ($Config{useithreads}) {
+	my @caller = caller(2);
+        die <<EOF;
+$caller[1] line $caller[2]:
+
+This Perl hasn't been configured and built properly for the threads
+module to work.  (The 'useithreads' configuration option hasn't been used.)
+
+Having threads support requires all of Perl and all of the XS modules in
+the Perl installation to be rebuilt, it is not just a question of adding
+the threads module.  (In other words, threaded and non-threaded Perls
+are binary incompatible.)
+
+If you want to the use the threads module, please contact the people
+who built your Perl.
+
+Cannot continue, aborting.
+EOF
+    }
+}
+
+use overload
+    '==' => \&equal,
+    'fallback' => 1;
+
+BEGIN {
+    warn "Warning, threads::shared has already been loaded. ".
+       "To enable shared variables for these modules 'use threads' ".
+       "must be called before any of those modules are loaded\n"
+               if($threads::shared::threads_shared);
+}
+
+require Exporter;
+require DynaLoader;
+
+our @ISA = qw(Exporter DynaLoader);
+
+our %EXPORT_TAGS = ( all => [qw(yield)]);
+
+our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+
+our @EXPORT = qw(
+async	
+);
+our $VERSION = '1.07';
+
+
+# || 0 to ensure compatibility with previous versions
+sub equal { ($_[0]->tid == $_[1]->tid) || 0 }
+
+# use "goto" trick to avoid pad problems from 5.8.1 (fixed in 5.8.2)
+# should also be faster
+sub async (&;@) { unshift @_,'threads'; goto &new }
+
+sub object {
+    return undef unless @_ > 1;
+    foreach (threads->list) {
+        return $_ if $_->tid == $_[1];
+    }
+    return undef;
+}
+
+$threads::threads = 1;
+
+bootstrap threads $VERSION;
+
+# why document 'new' then use 'create' in the tests!
+*create = \&new;
+
+# Preloaded methods go here.
+
+1;
+__END__
+
+=head1 NAME
+
+threads - Perl extension allowing use of interpreter based threads from perl
+
+=head1 SYNOPSIS
+
+    use threads;
+
+    sub start_thread {
+	print "Thread started\n";
+    }
+
+    my $thread  = threads->create("start_thread","argument");
+    my $thread2 = $thread->create(sub { print "I am a thread"},"argument");
+    my $thread3 = async { foreach (@files) { ... } };
+
+    $thread->join();
+    $thread->detach();
+
+    $thread = threads->self();
+    $thread = threads->object( $tid );
+
+    $thread->tid();
+    threads->tid();
+    threads->self->tid();
+
+    threads->yield();
+
+    threads->list();
+
+=head1 DESCRIPTION
+
+Perl 5.6 introduced something called interpreter threads.  Interpreter
+threads are different from "5005threads" (the thread model of Perl
+5.005) by creating a new perl interpreter per thread and not sharing
+any data or state between threads by default.
+
+Prior to perl 5.8 this has only been available to people embedding
+perl and for emulating fork() on windows.
+
+The threads API is loosely based on the old Thread.pm API. It is very
+important to note that variables are not shared between threads, all
+variables are per default thread local.  To use shared variables one
+must use threads::shared.
+
+It is also important to note that you must enable threads by doing
+C<use threads> as early as possible in the script itself and that it
+is not possible to enable threading inside an C<eval "">, C<do>,
+C<require>, or C<use>.  In particular, if you are intending to share
+variables with threads::shared, you must C<use threads> before you
+C<use threads::shared> and C<threads> will emit a warning if you do
+it the other way around.
+
+=over
+
+=item $thread = threads->create(function, LIST)
+
+This will create a new thread with the entry point function and give
+it LIST as parameters.  It will return the corresponding threads
+object, or C<undef> if thread creation failed. The new() method is an
+alias for create().
+
+=item $thread->join
+
+This will wait for the corresponding thread to join. When the thread
+finishes, join() will return the return values of the entry point
+function. If the thread has been detached, an error will be thrown.
+
+The context (void, scalar or list) of the thread creation is also the
+context for join().  This means that if you intend to return an array
+from a thread, you must use C<my ($thread) = threads->new(...)>, and
+that if you intend to return a scalar, you must use C<my $thread = ...>.
+
+If the program exits without all other threads having been either
+joined or detached, then a warning will be issued. (A program exits
+either because one of its threads explicitly calls exit(), or in the
+case of the main thread, reaches the end of the main program file.)
+
+
+=item $thread->detach
+
+Will make the thread unjoinable, and cause any eventual return value
+to be discarded.
+
+=item threads->self
+
+This will return the thread object for the current thread.
+
+=item $thread->tid
+
+This will return the id of the thread.  Thread IDs are integers, with
+the main thread in a program being 0.  Currently Perl assigns a unique
+tid to every thread ever created in your program, assigning the first
+thread to be created a tid of 1, and increasing the tid by 1 for each
+new thread that's created.
+
+NB the class method C<< threads->tid() >> is a quick way to get the
+current thread id if you don't have your thread object handy.
+
+=item threads->object( tid )
+
+This will return the thread object for the thread associated with the
+specified tid.  Returns undef if there is no thread associated with the tid
+or no tid is specified or the specified tid is undef.
+
+=item threads->yield();
+
+This is a suggestion to the OS to let this thread yield CPU time to other
+threads.  What actually happens is highly dependent upon the underlying
+thread implementation.
+
+You may do C<use threads qw(yield)> then use just a bare C<yield> in your
+code.
+
+=item threads->list();
+
+This will return a list of all non joined, non detached threads.
+
+=item async BLOCK;
+
+C<async> creates a thread to execute the block immediately following
+it.  This block is treated as an anonymous sub, and so must have a
+semi-colon after the closing brace. Like C<< threads->new >>, C<async>
+returns a thread object.
+
+=back
+
+=head1 WARNINGS
+
+=over 4
+
+=item A thread exited while %d other threads were still running
+
+A thread (not necessarily the main thread) exited while there were
+still other threads running.  Usually it's a good idea to first collect
+the return values of the created threads by joining them, and only then
+exit from the main thread.
+
+=back
+
+=head1 TODO
+
+The current implementation of threads has been an attempt to get
+a correct threading system working that could be built on, 
+and optimized, in newer versions of perl.
+
+Currently the overhead of creating a thread is rather large,
+also the cost of returning values can be large. These are areas
+were there most likely will be work done to optimize what data
+that needs to be cloned.
+
+=head1 BUGS
+
+=over
+
+=item Parent-Child threads.
+
+On some platforms it might not be possible to destroy "parent"
+threads while there are still existing child "threads".
+
+This will possibly be fixed in later versions of perl.
+
+=item tid is I32
+
+The thread id is a 32 bit integer, it can potentially overflow.
+This might be fixed in a later version of perl.
+
+=item Returning objects
+
+When you return an object the entire stash that the object is blessed
+as well.  This will lead to a large memory usage.  The ideal situation
+would be to detect the original stash if it existed.
+
+=item Creating threads inside BEGIN blocks
+
+Creating threads inside BEGIN blocks (or during the compilation phase
+in general) does not work.  (In Windows, trying to use fork() inside
+BEGIN blocks is an equally losing proposition, since it has been
+implemented in very much the same way as threads.)
+
+=item PERL_OLD_SIGNALS are not threadsafe, will not be.
+
+If your Perl has been built with PERL_OLD_SIGNALS (one has
+to explicitly add that symbol to ccflags, see C<perl -V>),
+signal handling is not threadsafe.
+
+=back
+
+=head1 AUTHOR and COPYRIGHT
+
+Arthur Bergman E<lt>sky at nanisky.comE<gt>
+
+threads is released under the same license as Perl.
+
+Thanks to
+
+Richard Soderberg E<lt>perl at crystalflame.netE<gt>
+Helping me out tons, trying to find reasons for races and other weird bugs!
+
+Simon Cozens E<lt>simon at brecon.co.ukE<gt>
+Being there to answer zillions of annoying questions
+
+Rocco Caputo E<lt>troc at netrus.netE<gt>
+
+Vipul Ved Prakash E<lt>mail at vipul.netE<gt>
+Helping with debugging.
+
+please join perl-ithreads@perl.org for more information
+
+=head1 SEE ALSO
+
+L<threads::shared>, L<perlthrtut>, 
+L<http://www.perl.com/pub/a/2002/06/11/threads.html>,
+L<perlcall>, L<perlembed>, L<perlguts>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/threads/shared.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/threads/shared.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/threads/shared.pm	(revision 14489)
@@ -0,0 +1,269 @@
+package threads::shared;
+
+use 5.008;
+use strict;
+use warnings;
+BEGIN {
+    require Exporter;
+    our @ISA = qw(Exporter);
+    our @EXPORT = qw(share cond_wait cond_timedwait cond_broadcast cond_signal);
+    our $VERSION = '0.94';
+
+    if ($threads::threads) {
+	*cond_wait = \&cond_wait_enabled;
+	*cond_timedwait = \&cond_timedwait_enabled;
+	*cond_signal = \&cond_signal_enabled;
+	*cond_broadcast = \&cond_broadcast_enabled;
+	require XSLoader;
+	XSLoader::load('threads::shared',$VERSION);
+	push @EXPORT,'bless';
+    }
+    else {
+
+# String eval is generally evil, but we don't want these subs to exist at all
+# if threads are loaded successfully.  Vivifying them conditionally this way
+# saves on average about 4K of memory per thread.
+
+        eval <<'EOD';
+sub cond_wait      (\[$@%];\[$@%])  { undef }
+sub cond_timedwait (\[$@%]$;\[$@%]) { undef }
+sub cond_signal    (\[$@%])         { undef }
+sub cond_broadcast (\[$@%])         { undef }
+sub share          (\[$@%])         { return $_[0] }
+EOD
+    }
+}
+
+$threads::shared::threads_shared = 1;
+
+sub threads::shared::tie::SPLICE
+{
+ die "Splice not implemented for shared arrays";
+}
+
+__END__
+
+=head1 NAME
+
+threads::shared - Perl extension for sharing data structures between threads
+
+=head1 SYNOPSIS
+
+  use threads;
+  use threads::shared;
+
+  my $var : shared;
+  $var = $scalar_value;
+  $var = $shared_ref_value;
+  $var = &share($simple_unshared_ref_value);
+  $var = &share(new Foo);
+
+  my($scalar, @array, %hash);
+  share($scalar);
+  share(@array);
+  share(%hash);
+  my $bar = &share([]);
+  $hash{bar} = &share({});
+
+  { lock(%hash); ...  }
+
+  cond_wait($scalar);
+  cond_timedwait($scalar, time() + 30);
+  cond_broadcast(@array);
+  cond_signal(%hash);
+
+  my $lockvar : shared;
+  # condition var != lock var
+  cond_wait($var, $lockvar);
+  cond_timedwait($var, time()+30, $lockvar);
+
+=head1 DESCRIPTION
+
+By default, variables are private to each thread, and each newly created
+thread gets a private copy of each existing variable.  This module allows
+you to share variables across different threads (and pseudoforks on Win32).
+It is used together with the threads module.
+
+=head1 EXPORT
+
+C<share>, C<cond_wait>, C<cond_timedwait>, C<cond_signal>, C<cond_broadcast>
+
+Note that if this module is imported when C<threads> has not yet been
+loaded, then these functions all become no-ops. This makes it possible
+to write modules that will work in both threaded and non-threaded
+environments.
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item share VARIABLE
+
+C<share> takes a value and marks it as shared. You can share a scalar,
+array, hash, scalar ref, array ref or hash ref.  C<share> will return
+the shared rvalue but always as a reference.
+
+C<share> will traverse up references exactly I<one> level.
+C<share(\$a)> is equivalent to C<share($a)>, while C<share(\\$a)> is not.
+This means that you must create nested shared data structures by first
+creating individual shared leaf notes, then adding them to a shared hash
+or array.
+
+A variable can also be marked as shared at compile time by using the
+C<shared> attribute: C<my $var : shared>.
+
+If you want to share a newly created reference unfortunately you
+need to use C<&share([])> and C<&share({})> syntax due to problems
+with Perl's prototyping.
+
+The only values that can be assigned to a shared scalar are other scalar
+values, or shared refs, eg
+
+    my $var : shared;
+    $var = 1;              # ok
+    $var = &share([]);     # ok
+    $var = [];             # error
+    $var = A->new;         # error
+    $var = &share(A->new); # ok as long as the A object is not nested
+
+Note that it is often not wise to share an object unless the class itself
+has been written to support sharing; for example, an object's destructor
+may get called multiple times, one for each thread's scope exit.
+
+=item lock VARIABLE
+
+C<lock> places a lock on a variable until the lock goes out of scope.
+If the variable is locked by another thread, the C<lock> call will
+block until it's available. C<lock> is recursive, so multiple calls
+to C<lock> are safe -- the variable will remain locked until the
+outermost lock on the variable goes out of scope.
+
+If a container object, such as a hash or array, is locked, all the
+elements of that container are not locked. For example, if a thread
+does a C<lock @a>, any other thread doing a C<lock($a[12])> won't block.
+
+C<lock> will traverse up references exactly I<one> level.
+C<lock(\$a)> is equivalent to C<lock($a)>, while C<lock(\\$a)> is not.
+
+Note that you cannot explicitly unlock a variable; you can only wait
+for the lock to go out of scope. If you need more fine-grained
+control, see L<Thread::Semaphore>.
+
+=item cond_wait VARIABLE
+
+=item cond_wait CONDVAR, LOCKVAR
+
+The C<cond_wait> function takes a B<locked> variable as a parameter,
+unlocks the variable, and blocks until another thread does a
+C<cond_signal> or C<cond_broadcast> for that same locked variable.
+The variable that C<cond_wait> blocked on is relocked after the
+C<cond_wait> is satisfied.  If there are multiple threads
+C<cond_wait>ing on the same variable, all but one will reblock waiting
+to reacquire the lock on the variable. (So if you're only using
+C<cond_wait> for synchronisation, give up the lock as soon as
+possible). The two actions of unlocking the variable and entering the
+blocked wait state are atomic, the two actions of exiting from the
+blocked wait state and relocking the variable are not.
+
+In its second form, C<cond_wait> takes a shared, B<unlocked> variable
+followed by a shared, B<locked> variable.  The second variable is
+unlocked and thread execution suspended until another thread signals
+the first variable.
+
+It is important to note that the variable can be notified even if
+no thread C<cond_signal> or C<cond_broadcast> on the variable.
+It is therefore important to check the value of the variable and
+go back to waiting if the requirement is not fulfilled.  For example,
+to pause until a shared counter drops to zero:
+
+    { lock($counter); cond_wait($count) until $counter == 0; }
+
+=item cond_timedwait VARIABLE, ABS_TIMEOUT
+
+=item cond_timedwait CONDVAR, ABS_TIMEOUT, LOCKVAR
+
+In its two-argument form, C<cond_timedwait> takes a B<locked> variable
+and an absolute timeout as parameters, unlocks the variable, and blocks
+until the timeout is reached or another thread signals the variable.  A
+false value is returned if the timeout is reached, and a true value
+otherwise.  In either case, the variable is re-locked upon return.
+
+Like C<cond_wait>, this function may take a shared, B<locked> variable
+as an additional parameter; in this case the first parameter is an
+B<unlocked> condition variable protected by a distinct lock variable.
+
+Again like C<cond_wait>, waking up and reacquiring the lock are not
+atomic, and you should always check your desired condition after this
+function returns.  Since the timeout is an absolute value, however, it
+does not have to be recalculated with each pass:
+
+    lock($var);
+    my $abs = time() + 15;
+    until ($ok = desired_condition($var)) {
+      last if !cond_timedwait($var, $abs);
+    }
+    # we got it if $ok, otherwise we timed out!
+
+=item cond_signal VARIABLE
+
+The C<cond_signal> function takes a B<locked> variable as a parameter
+and unblocks one thread that's C<cond_wait>ing on that variable. If
+more than one thread is blocked in a C<cond_wait> on that variable,
+only one (and which one is indeterminate) will be unblocked.
+
+If there are no threads blocked in a C<cond_wait> on the variable,
+the signal is discarded. By always locking before signaling, you can
+(with care), avoid signaling before another thread has entered cond_wait().
+
+C<cond_signal> will normally generate a warning if you attempt to use it
+on an unlocked variable. On the rare occasions where doing this may be
+sensible, you can skip the warning with
+
+    { no warnings 'threads'; cond_signal($foo) }
+
+=item cond_broadcast VARIABLE
+
+The C<cond_broadcast> function works similarly to C<cond_signal>.
+C<cond_broadcast>, though, will unblock B<all> the threads that are
+blocked in a C<cond_wait> on the locked variable, rather than only one.
+
+=back
+
+=head1 NOTES
+
+threads::shared is designed to disable itself silently if threads are
+not available. If you want access to threads, you must C<use threads>
+before you C<use threads::shared>.  threads will emit a warning if you
+use it after threads::shared.
+
+=head1 BUGS
+
+C<bless> is not supported on shared references. In the current version,
+C<bless> will only bless the thread local reference and the blessing
+will not propagate to the other threads. This is expected to be
+implemented in a future version of Perl.
+
+Does not support splice on arrays!
+
+Taking references to the elements of shared arrays and hashes does not
+autovivify the elements, and neither does slicing a shared array/hash
+over non-existent indices/keys autovivify the elements.
+
+share() allows you to C<< share $hashref->{key} >> without giving any error
+message.  But the C<< $hashref->{key} >> is B<not> shared, causing the error
+"locking can only be used on shared values" to occur when you attempt to
+C<< lock $hasref->{key} >>.
+
+=head1 AUTHOR
+
+Arthur Bergman E<lt>arthur at contiller.seE<gt>
+
+threads::shared is released under the same license as Perl
+
+Documentation borrowed from the old Thread.pm
+
+=head1 SEE ALSO
+
+L<threads>, L<perlthrtut>, L<http://www.perl.com/pub/a/2002/06/11/threads.html>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/timelocal.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/timelocal.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/timelocal.pl	(revision 14489)
@@ -0,0 +1,18 @@
+;# timelocal.pl
+;#
+;# Usage:
+;#	$time = timelocal($sec,$min,$hours,$mday,$mon,$year);
+;#	$time = timegm($sec,$min,$hours,$mday,$mon,$year);
+
+;# This file has been superseded by the Time::Local library module.
+;# It is implemented as a call to that module for backwards compatibility
+;# with code written for perl4; new code should use Time::Local directly.
+
+;# The current implementation shares with the original the questionable
+;# behavior of defining the timelocal() and timegm() functions in the
+;# namespace of whatever package was current when the first instance of
+;# C<require 'timelocal.pl';> was executed in a program.
+
+use Time::Local;
+
+*timelocal::cheat = \&Time::Local::cheat;
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/ArabicShaping.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/ArabicShaping.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/ArabicShaping.txt	(revision 14489)
@@ -0,0 +1,299 @@
+# ArabicShaping-4.1.0.txt
+# Date: 2005-03-17, 15:21:00 PST [KW]
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# This file defines the shaping classes for Arabic and Syriac
+# positional shaping, repeating in machine readable form the
+# information printed in Tables 8-3, 8-7, 8-8, 8-11, 8-12, and
+# 8-13 of The Unicode Standard, Version 4.0.
+#
+# See sections 8.2 and 8.3 of The Unicode Standard, Version 4.0
+# for more information.
+#
+# Each line contains four fields, separated by a semicolon.
+#
+# Field 0: the code point, in 4-digit hexadecimal
+#   form, of an Arabic or Syriac character.
+# Field 1: gives a short schematic name for that character,
+#   abbreviated from the normative Unicode character name.
+# Field 2: defines the joining type (property name: Joining_Type)
+#   R Right_Joining
+#   L Left_Joining
+#   D Dual_Joining
+#   C Join_Causing
+#   U Non_Joining
+#   T Transparent
+#       See the Arabic block description for more information on these types.
+# Field 3: defines the joining group (property name: Joining_Group)
+#
+# The values of the joining group are based schematically on character
+# names. Where a schematic character name consists of two or more parts separated
+# by spaces, the formal Joining_Group property value, as specified in
+# PropertyValueAliases.txt, consists of the same name parts joined by
+# underscores. Hence, the entry:
+#
+#   0629; TEH MARBUTA; R; TEH MARBUTA
+#
+# corresponds to [Joining_Group = Teh_Marbuta].
+#
+# Note: For historical reasons, the property value [Joining_Group = Hamza_On_Heh_Goal]
+#   is anachronistically named. It used to apply to both of the following characters
+#   in earlier versions of the standard:
+#
+#   U+06C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+#   U+06C3 ARABIC LETTER TEH MARBUTA GOAL
+#
+#   However, it currently applies only to U+06C3, and *not* to U+06C2.
+#   To avoid destabilizing existing Joining_Group property aliases, the
+#   value Hamza_On_Heh_Goal has not been changed, despite the fact that it
+#   no longer applies to Hamza On Heh Goal, but only to Teh Marbuta Goal.
+#
+# Note: Code points that are not explicitly listed in this file are
+# either of joining type T or U:
+#
+# - Those that not explicitly listed that are of General Category Mn, Me, or Cf
+#   have joining type T.
+# - All others not explicitly listed have type U.
+#
+# For an explicit listing of characters of joining type T, see
+# the derived property file DerivedJoiningType.txt.
+#
+# There are currently no characters of type L defined in Unicode.
+#
+# #############################################################
+ 
+# Unicode; Schematic Name; Joining Type; Joining Group
+
+# Arabic characters
+
+0600; ARABIC NUMBER SIGN; U; No_Joining_Group
+0601; ARABIC SIGN SANAH; U; No_Joining_Group
+0602; ARABIC FOOTNOTE MARKER; U; No_Joining_Group
+0603; ARABIC SIGN SAFHA; U; No_Joining_Group
+060B; AFGHANI SIGN; U; No_Joining_Group
+0621; HAMZA; U; No_Joining_Group
+0622; MADDA ON ALEF; R; ALEF
+0623; HAMZA ON ALEF; R; ALEF
+0624; HAMZA ON WAW; R; WAW
+0625; HAMZA UNDER ALEF; R; ALEF
+0626; HAMZA ON YEH; D; YEH
+0627; ALEF; R; ALEF
+0628; BEH; D; BEH
+0629; TEH MARBUTA; R; TEH MARBUTA
+062A; TEH; D; BEH
+062B; THEH; D; BEH
+062C; JEEM; D; HAH
+062D; HAH; D; HAH
+062E; KHAH; D; HAH
+062F; DAL; R; DAL
+0630; THAL; R; DAL
+0631; REH; R; REH
+0632; ZAIN; R; REH
+0633; SEEN; D; SEEN
+0634; SHEEN; D; SEEN
+0635; SAD; D; SAD
+0636; DAD; D; SAD
+0637; TAH; D; TAH
+0638; ZAH; D; TAH
+0639; AIN; D; AIN
+063A; GHAIN; D; AIN
+0640; TATWEEL; C; No_Joining_Group
+0641; FEH; D; FEH
+0642; QAF; D; QAF
+0643; KAF; D; KAF
+0644; LAM; D; LAM
+0645; MEEM; D; MEEM
+0646; NOON; D; NOON
+0647; HEH; D; HEH
+0648; WAW; R; WAW
+0649; ALEF MAKSURA; D; YEH
+064A; YEH; D; YEH
+066E; DOTLESS BEH; D; BEH
+066F; DOTLESS QAF; D; QAF
+0671; HAMZAT WASL ON ALEF; R; ALEF
+0672; WAVY HAMZA ON ALEF; R; ALEF
+0673; WAVY HAMZA UNDER ALEF; R; ALEF
+0674; HIGH HAMZA; U; No_Joining_Group
+0675; HIGH HAMZA ALEF; R; ALEF
+0676; HIGH HAMZA WAW; R; WAW
+0677; HIGH HAMZA WAW WITH DAMMA; R; WAW
+0678; HIGH HAMZA YEH; D; YEH
+0679; TEH WITH SMALL TAH; D; BEH
+067A; TEH WITH 2 DOTS VERTICAL ABOVE; D; BEH
+067B; BEH WITH 2 DOTS VERTICAL BELOW; D; BEH
+067C; TEH WITH RING; D; BEH
+067D; TEH WITH 3 DOTS ABOVE DOWNWARD; D; BEH
+067E; TEH WITH 3 DOTS BELOW; D; BEH
+067F; TEH WITH 4 DOTS ABOVE; D; BEH
+0680; BEH WITH 4 DOTS BELOW; D; BEH
+0681; HAMZA ON HAH; D; HAH
+0682; HAH WITH 2 DOTS VERTICAL ABOVE; D; HAH
+0683; HAH WITH MIDDLE 2 DOTS; D; HAH
+0684; HAH WITH MIDDLE 2 DOTS VERTICAL; D; HAH
+0685; HAH WITH 3 DOTS ABOVE; D; HAH
+0686; HAH WITH MIDDLE 3 DOTS DOWNWARD; D; HAH
+0687; HAH WITH MIDDLE 4 DOTS; D; HAH
+0688; DAL WITH SMALL TAH; R; DAL
+0689; DAL WITH RING; R; DAL
+068A; DAL WITH DOT BELOW; R; DAL
+068B; DAL WITH DOT BELOW AND SMALL TAH; R; DAL
+068C; DAL WITH 2 DOTS ABOVE; R; DAL
+068D; DAL WITH 2 DOTS BELOW; R; DAL
+068E; DAL WITH 3 DOTS ABOVE; R; DAL
+068F; DAL WITH 3 DOTS ABOVE DOWNWARD; R; DAL
+0690; DAL WITH 4 DOTS ABOVE; R; DAL
+0691; REH WITH SMALL TAH; R; REH
+0692; REH WITH SMALL V; R; REH
+0693; REH WITH RING; R; REH
+0694; REH WITH DOT BELOW; R; REH
+0695; REH WITH SMALL V BELOW; R; REH
+0696; REH WITH DOT BELOW AND DOT ABOVE; R; REH
+0697; REH WITH 2 DOTS ABOVE; R; REH
+0698; REH WITH 3 DOTS ABOVE; R; REH
+0699; REH WITH 4 DOTS ABOVE; R; REH
+069A; SEEN WITH DOT BELOW AND DOT ABOVE; D; SEEN
+069B; SEEN WITH 3 DOTS BELOW; D; SEEN
+069C; SEEN WITH 3 DOTS BELOW AND 3 DOTS ABOVE; D; SEEN
+069D; SAD WITH 2 DOTS BELOW; D; SAD
+069E; SAD WITH 3 DOTS ABOVE; D; SAD
+069F; TAH WITH 3 DOTS ABOVE; D; TAH
+06A0; AIN WITH 3 DOTS ABOVE; D; AIN
+06A1; DOTLESS FEH; D; FEH
+06A2; FEH WITH DOT MOVED BELOW; D; FEH
+06A3; FEH WITH DOT BELOW; D; FEH
+06A4; FEH WITH 3 DOTS ABOVE; D; FEH
+06A5; FEH WITH 3 DOTS BELOW; D; FEH
+06A6; FEH WITH 4 DOTS ABOVE; D; FEH
+06A7; QAF WITH DOT ABOVE; D; QAF
+06A8; QAF WITH 3 DOTS ABOVE; D; QAF
+06A9; KEHEH; D; GAF
+06AA; SWASH KAF; D; SWASH KAF
+06AB; KAF WITH RING; D; GAF
+06AC; KAF WITH DOT ABOVE; D; KAF
+06AD; KAF WITH 3 DOTS ABOVE; D; KAF
+06AE; KAF WITH 3 DOTS BELOW; D; KAF
+06AF; GAF; D; GAF
+06B0; GAF WITH RING; D; GAF
+06B1; GAF WITH 2 DOTS ABOVE; D; GAF
+06B2; GAF WITH 2 DOTS BELOW; D; GAF
+06B3; GAF WITH 2 DOTS VERTICAL BELOW; D; GAF
+06B4; GAF WITH 3 DOTS ABOVE; D; GAF
+06B5; LAM WITH SMALL V; D; LAM
+06B6; LAM WITH DOT ABOVE; D; LAM
+06B7; LAM WITH 3 DOTS ABOVE; D; LAM
+06B8; LAM WITH 3 DOTS BELOW; D; LAM
+06B9; NOON WITH DOT BELOW; D; NOON
+06BA; DOTLESS NOON; D; NOON
+06BB; DOTLESS NOON WITH SMALL TAH; D; NOON
+06BC; NOON WITH RING; D; NOON
+06BD; NOON WITH 3 DOTS ABOVE; D; NOON
+06BE; KNOTTED HEH; D; KNOTTED HEH
+06BF; HAH WITH MIDDLE 3 DOTS DOWNWARD AND DOT ABOVE; D; HAH
+06C0; HAMZA ON HEH; R; TEH MARBUTA
+06C1; HEH GOAL; D; HEH GOAL
+06C2; HAMZA ON HEH GOAL; D; HEH GOAL
+06C3; TEH MARBUTA GOAL; R; HAMZA ON HEH GOAL
+06C4; WAW WITH RING; R; WAW
+06C5; WAW WITH BAR; R; WAW
+06C6; WAW WITH SMALL V; R; WAW
+06C7; WAW WITH DAMMA; R; WAW
+06C8; WAW WITH ALEF ABOVE; R; WAW
+06C9; WAW WITH INVERTED SMALL V; R; WAW
+06CA; WAW WITH 2 DOTS ABOVE; R; WAW
+06CB; WAW WITH 3 DOTS ABOVE; R; WAW
+06CC; DOTLESS YEH; D; YEH
+06CD; YEH WITH TAIL; R; YEH WITH TAIL
+06CE; YEH WITH SMALL V; D; YEH
+06CF; WAW WITH DOT ABOVE; R; WAW
+06D0; YEH WITH 2 DOTS VERTICAL BELOW; D; YEH
+06D1; YEH WITH 3 DOTS BELOW; D; YEH
+06D2; YEH BARREE; R; YEH BARREE
+06D3; HAMZA ON YEH BARREE; R; YEH BARREE
+06D5; AE; R; TEH MARBUTA
+06DD; ARABIC END OF AYAH; U; No_Joining_Group
+06EE; DAL WITH INVERTED V; R; DAL
+06EF; REH WITH INVERTED V; R; REH
+06FA; SEEN WITH DOT BELOW AND 3 DOTS ABOVE; D; SEEN
+06FB; DAD WITH DOT BELOW; D; SAD
+06FC; GHAIN WITH DOT BELOW; D; AIN
+06FF; HEH WITH INVERTED V; D; KNOTTED HEH
+
+# Syriac characters
+
+0710; ALAPH; R; ALAPH
+0712; BETH; D; BETH
+0713; GAMAL; D; GAMAL
+0714; GAMAL GARSHUNI; D; GAMAL
+0715; DALATH; R; DALATH RISH
+0716; DOTLESS DALATH RISH; R; DALATH RISH
+0717; HE; R; HE
+0718; WAW; R; SYRIAC WAW
+0719; ZAIN; R; ZAIN
+071A; HETH; D; HETH
+071B; TETH; D; TETH
+071C; TETH GARSHUNI; D; TETH
+071D; YUDH; D; YUDH
+071E; YUDH HE; R; YUDH HE
+071F; KAPH; D; KAPH
+0720; LAMADH; D; LAMADH
+0721; MIM; D; MIM
+0722; NUN; D; NUN
+0723; SEMKATH; D; SEMKATH
+0724; FINAL SEMKATH; D; FINAL SEMKATH
+0725; E; D; E
+0726; PE; D; PE
+0727; REVERSED PE; D; REVERSED PE
+0728; SADHE; R; SADHE
+0729; QAPH; D; QAPH
+072A; RISH; R; DALATH RISH
+072B; SHIN; D; SHIN
+072C; TAW; R; TAW
+072D; PERSIAN BHETH; D; BETH
+072E; PERSIAN GHAMAL; D; GAMAL
+072F; PERSIAN DHALATH; R; DALATH RISH
+074D; SOGDIAN ZHAIN; R; ZHAIN
+074E; SOGDIAN KHAPH; D; KHAPH
+074F; SOGDIAN FE; D; FE
+
+# Arabic supplement characters
+
+0750; BEH WITH 3 DOTS HORIZONTALLY BELOW; D; BEH
+0751; BEH WITH DOT BELOW AND 3 DOTS ABOVE; D; BEH
+0752; BEH WITH 3 DOTS POINTING UPWARDS BELOW; D; BEH
+0753; BEH WITH 3 DOTS POINTING UPWARDS BELOW AND 2 DOTS ABOVE; D; BEH
+0754; BEH WITH 2 DOTS BELOW AND DOT ABOVE; D; BEH
+0755; BEH WITH INVERTED SMALL V BELOW; D; BEH
+0756; BEH WITH SMALL V; D; BEH
+0757; HAH WITH 2 DOTS ABOVE; D; HAH
+0758; HAH WITH 3 DOTS POINTING UPWARDS BELOW; D; HAH
+0759; DAL WITH 2 DOTS VERTICALLY BELOW AND SMALL TAH; R; DAL
+075A; DAL WITH INVERTED SMALL V BELOW; R; DAL
+075B; REH WITH STROKE; R; REH
+075C; SEEN WITH 4 DOTS ABOVE; D; SEEN
+075D; AIN WITH 2 DOTS ABOVE; D; AIN
+075E; AIN WITH 3 DOTS POINTING DOWNWARDS ABOVE; D; AIN
+075F; AIN WITH 2 DOTS VERTICALLY ABOVE; D; AIN
+0760; FEH WITH 2 DOTS BELOW; D; FEH
+0761; FEH WITH 3 DOTS POINTING UPWARDS BELOW; D; FEH
+0762; KEHEH WITH DOT ABOVE; D; GAF
+0763; KEHEH WITH 3 DOTS ABOVE; D; GAF
+0764; KEHEH WITH 3 DOTS POINTING UPWARDS BELOW; D; GAF
+0765; MEEM WITH DOT ABOVE; D; MEEM
+0766; MEEM WITH DOT BELOW; D; MEEM
+0767; NOON WITH 2 DOTS BELOW; D; NOON
+0768; NOON WITH SMALL TAH; D; NOON
+0769; NOON WITH SMALL V; D; NOON
+076A; LAM WITH BAR; D; LAM
+076B; REH WITH 2 DOTS VERTICALLY ABOVE; R; REH
+076C; REH WITH HAMZA ABOVE; R; REH
+076D; SEEN WITH 2 DOTS VERTICALLY ABOVE; D; SEEN
+
+# Other
+
+200D; ZERO WIDTH JOINER; C; No_Joining_Group
+200C; ZERO WIDTH NON-JOINER; U; No_Joining_Group
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/BidiMirroring.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/BidiMirroring.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/BidiMirroring.txt	(revision 14489)
@@ -0,0 +1,550 @@
+# BidiMirroring-4.1.0.txt
+# Date: 2005-03-17, 15:21:00 PST [KW]
+#
+# Bidi_Mirroring_Glyph Property
+# 
+# This file is an informative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# This data file lists characters that have the mirrored property
+# where there is another Unicode character that typically has a glyph
+# that is the mirror image of the original character's glyph.
+# The repertoire covered by the file is Unicode 4.1.0.
+# 
+# The file contains a list of lines with mappings from one code point
+# to another one for character-based mirroring.
+# Note that for "real" mirroring, a rendering engine needs to select
+# appropriate alternative glyphs, and that many Unicode characters do not
+# have a mirror-image Unicode character.
+# 
+# Each mapping line contains two fields, separated by a semicolon (';').
+# Each of the two fields contains a code point represented as a
+# variable-length hexadecimal value with 4 to 6 digits.
+# A comment indicates where the characters are "BEST FIT" mirroring.
+# 
+# Code points with the "mirrored" property but no appropriate mirrors are
+# listed as comments at the end of the file.
+# 
+# For information on bidi mirroring, see UAX #9: Bidirectional Algorithm,
+# at http://www.unicode.org/unicode/reports/tr9/
+# 
+# This file was originally created by Markus Scherer.
+# Extended for Unicode 3.2, 4.0, and 4.1 by Ken Whistler.
+# 
+# ############################################################
+
+0028; 0029 # LEFT PARENTHESIS
+0029; 0028 # RIGHT PARENTHESIS
+003C; 003E # LESS-THAN SIGN
+003E; 003C # GREATER-THAN SIGN
+005B; 005D # LEFT SQUARE BRACKET
+005D; 005B # RIGHT SQUARE BRACKET
+007B; 007D # LEFT CURLY BRACKET
+007D; 007B # RIGHT CURLY BRACKET
+00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+2039; 203A # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A; 2039 # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+2045; 2046 # LEFT SQUARE BRACKET WITH QUILL
+2046; 2045 # RIGHT SQUARE BRACKET WITH QUILL
+207D; 207E # SUPERSCRIPT LEFT PARENTHESIS
+207E; 207D # SUPERSCRIPT RIGHT PARENTHESIS
+208D; 208E # SUBSCRIPT LEFT PARENTHESIS
+208E; 208D # SUBSCRIPT RIGHT PARENTHESIS
+2208; 220B # ELEMENT OF
+2209; 220C # NOT AN ELEMENT OF
+220A; 220D # SMALL ELEMENT OF
+220B; 2208 # CONTAINS AS MEMBER
+220C; 2209 # DOES NOT CONTAIN AS MEMBER
+220D; 220A # SMALL CONTAINS AS MEMBER
+2215; 29F5 # DIVISION SLASH
+223C; 223D # TILDE OPERATOR
+223D; 223C # REVERSED TILDE
+2243; 22CD # ASYMPTOTICALLY EQUAL TO
+2252; 2253 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253; 2252 # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254; 2255 # COLON EQUALS
+2255; 2254 # EQUALS COLON
+2264; 2265 # LESS-THAN OR EQUAL TO
+2265; 2264 # GREATER-THAN OR EQUAL TO
+2266; 2267 # LESS-THAN OVER EQUAL TO
+2267; 2266 # GREATER-THAN OVER EQUAL TO
+2268; 2269 # [BEST FIT] LESS-THAN BUT NOT EQUAL TO
+2269; 2268 # [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
+226A; 226B # MUCH LESS-THAN
+226B; 226A # MUCH GREATER-THAN
+226E; 226F # [BEST FIT] NOT LESS-THAN
+226F; 226E # [BEST FIT] NOT GREATER-THAN
+2270; 2271 # [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
+2271; 2270 # [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
+2272; 2273 # [BEST FIT] LESS-THAN OR EQUIVALENT TO
+2273; 2272 # [BEST FIT] GREATER-THAN OR EQUIVALENT TO
+2274; 2275 # [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
+2275; 2274 # [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276; 2277 # LESS-THAN OR GREATER-THAN
+2277; 2276 # GREATER-THAN OR LESS-THAN
+2278; 2279 # NEITHER LESS-THAN NOR GREATER-THAN
+2279; 2278 # NEITHER GREATER-THAN NOR LESS-THAN
+227A; 227B # PRECEDES
+227B; 227A # SUCCEEDS
+227C; 227D # PRECEDES OR EQUAL TO
+227D; 227C # SUCCEEDS OR EQUAL TO
+227E; 227F # [BEST FIT] PRECEDES OR EQUIVALENT TO
+227F; 227E # [BEST FIT] SUCCEEDS OR EQUIVALENT TO
+2280; 2281 # [BEST FIT] DOES NOT PRECEDE
+2281; 2280 # [BEST FIT] DOES NOT SUCCEED
+2282; 2283 # SUBSET OF
+2283; 2282 # SUPERSET OF
+2284; 2285 # [BEST FIT] NOT A SUBSET OF
+2285; 2284 # [BEST FIT] NOT A SUPERSET OF
+2286; 2287 # SUBSET OF OR EQUAL TO
+2287; 2286 # SUPERSET OF OR EQUAL TO
+2288; 2289 # [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
+2289; 2288 # [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
+228A; 228B # [BEST FIT] SUBSET OF WITH NOT EQUAL TO
+228B; 228A # [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
+228F; 2290 # SQUARE IMAGE OF
+2290; 228F # SQUARE ORIGINAL OF
+2291; 2292 # SQUARE IMAGE OF OR EQUAL TO
+2292; 2291 # SQUARE ORIGINAL OF OR EQUAL TO
+2298; 29B8 # CIRCLED DIVISION SLASH
+22A2; 22A3 # RIGHT TACK
+22A3; 22A2 # LEFT TACK
+22A6; 2ADE # ASSERTION
+22A8; 2AE4 # TRUE
+22A9; 2AE3 # FORCES
+22AB; 2AE5 # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0; 22B1 # PRECEDES UNDER RELATION
+22B1; 22B0 # SUCCEEDS UNDER RELATION
+22B2; 22B3 # NORMAL SUBGROUP OF
+22B3; 22B2 # CONTAINS AS NORMAL SUBGROUP
+22B4; 22B5 # NORMAL SUBGROUP OF OR EQUAL TO
+22B5; 22B4 # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6; 22B7 # ORIGINAL OF
+22B7; 22B6 # IMAGE OF
+22C9; 22CA # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA; 22C9 # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB; 22CC # LEFT SEMIDIRECT PRODUCT
+22CC; 22CB # RIGHT SEMIDIRECT PRODUCT
+22CD; 2243 # REVERSED TILDE EQUALS
+22D0; 22D1 # DOUBLE SUBSET
+22D1; 22D0 # DOUBLE SUPERSET
+22D6; 22D7 # LESS-THAN WITH DOT
+22D7; 22D6 # GREATER-THAN WITH DOT
+22D8; 22D9 # VERY MUCH LESS-THAN
+22D9; 22D8 # VERY MUCH GREATER-THAN
+22DA; 22DB # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB; 22DA # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC; 22DD # EQUAL TO OR LESS-THAN
+22DD; 22DC # EQUAL TO OR GREATER-THAN
+22DE; 22DF # EQUAL TO OR PRECEDES
+22DF; 22DE # EQUAL TO OR SUCCEEDS
+22E0; 22E1 # [BEST FIT] DOES NOT PRECEDE OR EQUAL
+22E1; 22E0 # [BEST FIT] DOES NOT SUCCEED OR EQUAL
+22E2; 22E3 # [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
+22E3; 22E2 # [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4; 22E5 # [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
+22E5; 22E4 # [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6; 22E7 # [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
+22E7; 22E6 # [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
+22E8; 22E9 # [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
+22E9; 22E8 # [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
+22EA; 22EB # [BEST FIT] NOT NORMAL SUBGROUP OF
+22EB; 22EA # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC; 22ED # [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED; 22EC # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22F0; 22F1 # UP RIGHT DIAGONAL ELLIPSIS
+22F1; 22F0 # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2; 22FA # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3; 22FB # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4; 22FC # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F6; 22FD # ELEMENT OF WITH OVERBAR
+22F7; 22FE # SMALL ELEMENT OF WITH OVERBAR
+22FA; 22F2 # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB; 22F3 # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC; 22F4 # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD; 22F6 # CONTAINS WITH OVERBAR
+22FE; 22F7 # SMALL CONTAINS WITH OVERBAR
+2308; 2309 # LEFT CEILING
+2309; 2308 # RIGHT CEILING
+230A; 230B # LEFT FLOOR
+230B; 230A # RIGHT FLOOR
+2329; 232A # LEFT-POINTING ANGLE BRACKET
+232A; 2329 # RIGHT-POINTING ANGLE BRACKET
+2768; 2769 # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769; 2768 # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A; 276B # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B; 276A # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C; 276D # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D; 276C # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E; 276F # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F; 276E # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770; 2771 # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771; 2770 # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772; 2773 # LIGHT LEFT TORTOISE SHELL BRACKET
+2773; 2772 # LIGHT RIGHT TORTOISE SHELL BRACKET
+2774; 2775 # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775; 2774 # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+27C3; 27C4 # OPEN SUBSET
+27C4; 27C3 # OPEN SUPERSET
+27C5; 27C6 # LEFT S-SHAPED BAG DELIMITER
+27C6; 27C5 # RIGHT S-SHAPED BAG DELIMITER
+27D5; 27D6 # LEFT OUTER JOIN
+27D6; 27D5 # RIGHT OUTER JOIN
+27DD; 27DE # LONG RIGHT TACK
+27DE; 27DD # LONG LEFT TACK
+27E2; 27E3 # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3; 27E2 # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4; 27E5 # WHITE SQUARE WITH LEFTWARDS TICK
+27E5; 27E4 # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6; 27E7 # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7; 27E6 # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8; 27E9 # MATHEMATICAL LEFT ANGLE BRACKET
+27E9; 27E8 # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA; 27EB # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB; 27EA # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+2983; 2984 # LEFT WHITE CURLY BRACKET
+2984; 2983 # RIGHT WHITE CURLY BRACKET
+2985; 2986 # LEFT WHITE PARENTHESIS
+2986; 2985 # RIGHT WHITE PARENTHESIS
+2987; 2988 # Z NOTATION LEFT IMAGE BRACKET
+2988; 2987 # Z NOTATION RIGHT IMAGE BRACKET
+2989; 298A # Z NOTATION LEFT BINDING BRACKET
+298A; 2989 # Z NOTATION RIGHT BINDING BRACKET
+298B; 298C # LEFT SQUARE BRACKET WITH UNDERBAR
+298C; 298B # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D; 2990 # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E; 298F # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F; 298E # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990; 298D # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991; 2992 # LEFT ANGLE BRACKET WITH DOT
+2992; 2991 # RIGHT ANGLE BRACKET WITH DOT
+2993; 2994 # LEFT ARC LESS-THAN BRACKET
+2994; 2993 # RIGHT ARC GREATER-THAN BRACKET
+2995; 2996 # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996; 2995 # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997; 2998 # LEFT BLACK TORTOISE SHELL BRACKET
+2998; 2997 # RIGHT BLACK TORTOISE SHELL BRACKET
+29B8; 2298 # CIRCLED REVERSE SOLIDUS
+29C0; 29C1 # CIRCLED LESS-THAN
+29C1; 29C0 # CIRCLED GREATER-THAN
+29C4; 29C5 # SQUARED RISING DIAGONAL SLASH
+29C5; 29C4 # SQUARED FALLING DIAGONAL SLASH
+29CF; 29D0 # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0; 29CF # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1; 29D2 # BOWTIE WITH LEFT HALF BLACK
+29D2; 29D1 # BOWTIE WITH RIGHT HALF BLACK
+29D4; 29D5 # TIMES WITH LEFT HALF BLACK
+29D5; 29D4 # TIMES WITH RIGHT HALF BLACK
+29D8; 29D9 # LEFT WIGGLY FENCE
+29D9; 29D8 # RIGHT WIGGLY FENCE
+29DA; 29DB # LEFT DOUBLE WIGGLY FENCE
+29DB; 29DA # RIGHT DOUBLE WIGGLY FENCE
+29F5; 2215 # REVERSE SOLIDUS OPERATOR
+29F8; 29F9 # BIG SOLIDUS
+29F9; 29F8 # BIG REVERSE SOLIDUS
+29FC; 29FD # LEFT-POINTING CURVED ANGLE BRACKET
+29FD; 29FC # RIGHT-POINTING CURVED ANGLE BRACKET
+2A2B; 2A2C # MINUS SIGN WITH FALLING DOTS
+2A2C; 2A2B # MINUS SIGN WITH RISING DOTS
+2A2D; 2A2E # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E; 2A2D # PLUS SIGN IN RIGHT HALF CIRCLE
+2A34; 2A35 # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35; 2A34 # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A3C; 2A3D # INTERIOR PRODUCT
+2A3D; 2A3C # RIGHTHAND INTERIOR PRODUCT
+2A64; 2A65 # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65; 2A64 # Z NOTATION RANGE ANTIRESTRICTION
+2A79; 2A7A # LESS-THAN WITH CIRCLE INSIDE
+2A7A; 2A79 # GREATER-THAN WITH CIRCLE INSIDE
+2A7D; 2A7E # LESS-THAN OR SLANTED EQUAL TO
+2A7E; 2A7D # GREATER-THAN OR SLANTED EQUAL TO
+2A7F; 2A80 # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80; 2A7F # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81; 2A82 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82; 2A81 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83; 2A84 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84; 2A83 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A8B; 2A8C # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C; 2A8B # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A91; 2A92 # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92; 2A91 # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93; 2A94 # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94; 2A93 # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95; 2A96 # SLANTED EQUAL TO OR LESS-THAN
+2A96; 2A95 # SLANTED EQUAL TO OR GREATER-THAN
+2A97; 2A98 # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98; 2A97 # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99; 2A9A # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A; 2A99 # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B; 2A9C # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C; 2A9B # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2AA1; 2AA2 # DOUBLE NESTED LESS-THAN
+2AA2; 2AA1 # DOUBLE NESTED GREATER-THAN
+2AA6; 2AA7 # LESS-THAN CLOSED BY CURVE
+2AA7; 2AA6 # GREATER-THAN CLOSED BY CURVE
+2AA8; 2AA9 # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9; 2AA8 # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA; 2AAB # SMALLER THAN
+2AAB; 2AAA # LARGER THAN
+2AAC; 2AAD # SMALLER THAN OR EQUAL TO
+2AAD; 2AAC # LARGER THAN OR EQUAL TO
+2AAF; 2AB0 # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0; 2AAF # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB3; 2AB4 # PRECEDES ABOVE EQUALS SIGN
+2AB4; 2AB3 # SUCCEEDS ABOVE EQUALS SIGN
+2ABB; 2ABC # DOUBLE PRECEDES
+2ABC; 2ABB # DOUBLE SUCCEEDS
+2ABD; 2ABE # SUBSET WITH DOT
+2ABE; 2ABD # SUPERSET WITH DOT
+2ABF; 2AC0 # SUBSET WITH PLUS SIGN BELOW
+2AC0; 2ABF # SUPERSET WITH PLUS SIGN BELOW
+2AC1; 2AC2 # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2; 2AC1 # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3; 2AC4 # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4; 2AC3 # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5; 2AC6 # SUBSET OF ABOVE EQUALS SIGN
+2AC6; 2AC5 # SUPERSET OF ABOVE EQUALS SIGN
+2ACD; 2ACE # SQUARE LEFT OPEN BOX OPERATOR
+2ACE; 2ACD # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF; 2AD0 # CLOSED SUBSET
+2AD0; 2ACF # CLOSED SUPERSET
+2AD1; 2AD2 # CLOSED SUBSET OR EQUAL TO
+2AD2; 2AD1 # CLOSED SUPERSET OR EQUAL TO
+2AD3; 2AD4 # SUBSET ABOVE SUPERSET
+2AD4; 2AD3 # SUPERSET ABOVE SUBSET
+2AD5; 2AD6 # SUBSET ABOVE SUBSET
+2AD6; 2AD5 # SUPERSET ABOVE SUPERSET
+2ADE; 22A6 # SHORT LEFT TACK
+2AE3; 22A9 # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4; 22A8 # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5; 22AB # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AEC; 2AED # DOUBLE STROKE NOT SIGN
+2AED; 2AEC # REVERSED DOUBLE STROKE NOT SIGN
+2AF7; 2AF8 # TRIPLE NESTED LESS-THAN
+2AF8; 2AF7 # TRIPLE NESTED GREATER-THAN
+2AF9; 2AFA # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA; 2AF9 # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2E02; 2E03 # LEFT SUBSTITUTION BRACKET
+2E03; 2E02 # RIGHT SUBSTITUTION BRACKET
+2E04; 2E05 # LEFT DOTTED SUBSTITUTION BRACKET
+2E05; 2E04 # RIGHT DOTTED SUBSTITUTION BRACKET
+2E09; 2E0A # LEFT TRANSPOSITION BRACKET
+2E0A; 2E09 # RIGHT TRANSPOSITION BRACKET
+2E0C; 2E0D # LEFT RAISED OMISSION BRACKET
+2E0D; 2E0C # RIGHT RAISED OMISSION BRACKET
+2E1C; 2E1D # LEFT LOW PARAPHRASE BRACKET
+2E1D; 2E1C # RIGHT LOW PARAPHRASE BRACKET
+3008; 3009 # LEFT ANGLE BRACKET
+3009; 3008 # RIGHT ANGLE BRACKET
+300A; 300B # LEFT DOUBLE ANGLE BRACKET
+300B; 300A # RIGHT DOUBLE ANGLE BRACKET
+300C; 300D # [BEST FIT] LEFT CORNER BRACKET
+300D; 300C # [BEST FIT] RIGHT CORNER BRACKET
+300E; 300F # [BEST FIT] LEFT WHITE CORNER BRACKET
+300F; 300E # [BEST FIT] RIGHT WHITE CORNER BRACKET
+3010; 3011 # LEFT BLACK LENTICULAR BRACKET
+3011; 3010 # RIGHT BLACK LENTICULAR BRACKET
+3014; 3015 # LEFT TORTOISE SHELL BRACKET
+3015; 3014 # RIGHT TORTOISE SHELL BRACKET
+3016; 3017 # LEFT WHITE LENTICULAR BRACKET
+3017; 3016 # RIGHT WHITE LENTICULAR BRACKET
+3018; 3019 # LEFT WHITE TORTOISE SHELL BRACKET
+3019; 3018 # RIGHT WHITE TORTOISE SHELL BRACKET
+301A; 301B # LEFT WHITE SQUARE BRACKET
+301B; 301A # RIGHT WHITE SQUARE BRACKET
+FF08; FF09 # FULLWIDTH LEFT PARENTHESIS
+FF09; FF08 # FULLWIDTH RIGHT PARENTHESIS
+FF1C; FF1E # FULLWIDTH LESS-THAN SIGN
+FF1E; FF1C # FULLWIDTH GREATER-THAN SIGN
+FF3B; FF3D # FULLWIDTH LEFT SQUARE BRACKET
+FF3D; FF3B # FULLWIDTH RIGHT SQUARE BRACKET
+FF5B; FF5D # FULLWIDTH LEFT CURLY BRACKET
+FF5D; FF5B # FULLWIDTH RIGHT CURLY BRACKET
+FF5F; FF60 # FULLWIDTH LEFT WHITE PARENTHESIS
+FF60; FF5F # FULLWIDTH RIGHT WHITE PARENTHESIS
+FF62; FF63 # [BEST FIT] HALFWIDTH LEFT CORNER BRACKET
+FF63; FF62 # [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET
+
+# The following characters have no appropriate mirroring character.
+# For these characters it is up to the rendering system
+#   to provide mirrored glyphs.
+
+# 2140; DOUBLE-STRUCK N-ARY SUMMATION
+# 2201; COMPLEMENT
+# 2202; PARTIAL DIFFERENTIAL
+# 2203; THERE EXISTS
+# 2204; THERE DOES NOT EXIST
+# 2211; N-ARY SUMMATION
+# 2216; SET MINUS
+# 221A; SQUARE ROOT
+# 221B; CUBE ROOT
+# 221C; FOURTH ROOT
+# 221D; PROPORTIONAL TO
+# 221F; RIGHT ANGLE
+# 2220; ANGLE
+# 2221; MEASURED ANGLE
+# 2222; SPHERICAL ANGLE
+# 2224; DOES NOT DIVIDE
+# 2226; NOT PARALLEL TO
+# 222B; INTEGRAL
+# 222C; DOUBLE INTEGRAL
+# 222D; TRIPLE INTEGRAL
+# 222E; CONTOUR INTEGRAL
+# 222F; SURFACE INTEGRAL
+# 2230; VOLUME INTEGRAL
+# 2231; CLOCKWISE INTEGRAL
+# 2232; CLOCKWISE CONTOUR INTEGRAL
+# 2233; ANTICLOCKWISE CONTOUR INTEGRAL
+# 2239; EXCESS
+# 223B; HOMOTHETIC
+# 223E; INVERTED LAZY S
+# 223F; SINE WAVE
+# 2240; WREATH PRODUCT
+# 2241; NOT TILDE
+# 2242; MINUS TILDE
+# 2244; NOT ASYMPTOTICALLY EQUAL TO
+# 2245; APPROXIMATELY EQUAL TO
+# 2246; APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+# 2247; NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+# 2248; ALMOST EQUAL TO
+# 2249; NOT ALMOST EQUAL TO
+# 224A; ALMOST EQUAL OR EQUAL TO
+# 224B; TRIPLE TILDE
+# 224C; ALL EQUAL TO
+# 225F; QUESTIONED EQUAL TO
+# 2260; NOT EQUAL TO
+# 2262; NOT IDENTICAL TO
+# 228C; MULTISET
+# 22A7; MODELS
+# 22AA; TRIPLE VERTICAL BAR RIGHT TURNSTILE
+# 22AC; DOES NOT PROVE
+# 22AD; NOT TRUE
+# 22AE; DOES NOT FORCE
+# 22AF; NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+# 22B8; MULTIMAP
+# 22BE; RIGHT ANGLE WITH ARC
+# 22BF; RIGHT TRIANGLE
+# 22F5; ELEMENT OF WITH DOT ABOVE
+# 22F8; ELEMENT OF WITH UNDERBAR
+# 22F9; ELEMENT OF WITH TWO HORIZONTAL STROKES
+# 22FF; Z NOTATION BAG MEMBERSHIP
+# 2320; TOP HALF INTEGRAL
+# 2321; BOTTOM HALF INTEGRAL
+# 27C0; THREE DIMENSIONAL ANGLE
+# 27D3; LOWER RIGHT CORNER WITH DOT
+# 27D4; UPPER LEFT CORNER WITH DOT
+# 27DC; LEFT MULTIMAP
+# 299B; MEASURED ANGLE OPENING LEFT
+# 299C; RIGHT ANGLE VARIANT WITH SQUARE
+# 299D; MEASURED RIGHT ANGLE WITH DOT
+# 299E; ANGLE WITH S INSIDE
+# 299F; ACUTE ANGLE
+# 29A0; SPHERICAL ANGLE OPENING LEFT
+# 29A1; SPHERICAL ANGLE OPENING UP
+# 29A2; TURNED ANGLE
+# 29A3; REVERSED ANGLE
+# 29A4; ANGLE WITH UNDERBAR
+# 29A5; REVERSED ANGLE WITH UNDERBAR
+# 29A6; OBLIQUE ANGLE OPENING UP
+# 29A7; OBLIQUE ANGLE OPENING DOWN
+# 29A8; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+# 29A9; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+# 29AA; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+# 29AB; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+# 29AC; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+# 29AD; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+# 29AE; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+# 29AF; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+# 29C2; CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+# 29C3; CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+# 29C9; TWO JOINED SQUARES
+# 29CE; RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+# 29DC; INCOMPLETE INFINITY
+# 29E1; INCREASES AS
+# 29E3; EQUALS SIGN AND SLANTED PARALLEL
+# 29E4; EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+# 29E5; IDENTICAL TO AND SLANTED PARALLEL
+# 29E8; DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+# 29E9; DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+# 29F4; RULE-DELAYED
+# 29F6; SOLIDUS WITH OVERBAR
+# 29F7; REVERSE SOLIDUS WITH HORIZONTAL STROKE
+# 2A0A; MODULO TWO SUM
+# 2A0B; SUMMATION WITH INTEGRAL
+# 2A0C; QUADRUPLE INTEGRAL OPERATOR
+# 2A0D; FINITE PART INTEGRAL
+# 2A0E; INTEGRAL WITH DOUBLE STROKE
+# 2A0F; INTEGRAL AVERAGE WITH SLASH
+# 2A10; CIRCULATION FUNCTION
+# 2A11; ANTICLOCKWISE INTEGRATION
+# 2A12; LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+# 2A13; LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+# 2A14; LINE INTEGRATION NOT INCLUDING THE POLE
+# 2A15; INTEGRAL AROUND A POINT OPERATOR
+# 2A16; QUATERNION INTEGRAL OPERATOR
+# 2A17; INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+# 2A18; INTEGRAL WITH TIMES SIGN
+# 2A19; INTEGRAL WITH INTERSECTION
+# 2A1A; INTEGRAL WITH UNION
+# 2A1B; INTEGRAL WITH OVERBAR
+# 2A1C; INTEGRAL WITH UNDERBAR
+# 2A1E; LARGE LEFT TRIANGLE OPERATOR
+# 2A1F; Z NOTATION SCHEMA COMPOSITION
+# 2A20; Z NOTATION SCHEMA PIPING
+# 2A21; Z NOTATION SCHEMA PROJECTION
+# 2A24; PLUS SIGN WITH TILDE ABOVE
+# 2A26; PLUS SIGN WITH TILDE BELOW
+# 2A29; MINUS SIGN WITH COMMA ABOVE
+# 2A3E; Z NOTATION RELATIONAL COMPOSITION
+# 2A57; SLOPING LARGE OR
+# 2A58; SLOPING LARGE AND
+# 2A6A; TILDE OPERATOR WITH DOT ABOVE
+# 2A6B; TILDE OPERATOR WITH RISING DOTS
+# 2A6C; SIMILAR MINUS SIMILAR
+# 2A6D; CONGRUENT WITH DOT ABOVE
+# 2A6F; ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+# 2A70; APPROXIMATELY EQUAL OR EQUAL TO
+# 2A73; EQUALS SIGN ABOVE TILDE OPERATOR
+# 2A74; DOUBLE COLON EQUAL
+# 2A7B; LESS-THAN WITH QUESTION MARK ABOVE
+# 2A7C; GREATER-THAN WITH QUESTION MARK ABOVE
+# 2A85; LESS-THAN OR APPROXIMATE
+# 2A86; GREATER-THAN OR APPROXIMATE
+# 2A87; LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+# 2A88; GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+# 2A89; LESS-THAN AND NOT APPROXIMATE
+# 2A8A; GREATER-THAN AND NOT APPROXIMATE
+# 2A8D; LESS-THAN ABOVE SIMILAR OR EQUAL
+# 2A8E; GREATER-THAN ABOVE SIMILAR OR EQUAL
+# 2A8F; LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+# 2A90; GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+# 2A9D; SIMILAR OR LESS-THAN
+# 2A9E; SIMILAR OR GREATER-THAN
+# 2A9F; SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+# 2AA0; SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+# 2AA3; DOUBLE NESTED LESS-THAN WITH UNDERBAR
+# 2AB1; PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+# 2AB2; SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+# 2AB5; PRECEDES ABOVE NOT EQUAL TO
+# 2AB6; SUCCEEDS ABOVE NOT EQUAL TO
+# 2AB7; PRECEDES ABOVE ALMOST EQUAL TO
+# 2AB8; SUCCEEDS ABOVE ALMOST EQUAL TO
+# 2AB9; PRECEDES ABOVE NOT ALMOST EQUAL TO
+# 2ABA; SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+# 2AC7; SUBSET OF ABOVE TILDE OPERATOR
+# 2AC8; SUPERSET OF ABOVE TILDE OPERATOR
+# 2AC9; SUBSET OF ABOVE ALMOST EQUAL TO
+# 2ACA; SUPERSET OF ABOVE ALMOST EQUAL TO
+# 2ACB; SUBSET OF ABOVE NOT EQUAL TO
+# 2ACC; SUPERSET OF ABOVE NOT EQUAL TO
+# 2ADC; FORKING
+# 2AE2; VERTICAL BAR TRIPLE RIGHT TURNSTILE
+# 2AE6; LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+# 2AEE; DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+# 2AF3; PARALLEL WITH TILDE OPERATOR
+# 2AFB; TRIPLE SOLIDUS BINARY RELATION
+# 2AFD; DOUBLE SOLIDUS OPERATOR
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/Blocks.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/Blocks.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/Blocks.txt	(revision 14489)
@@ -0,0 +1,172 @@
+# Blocks-4.1.0.txt
+# Date: 2005-1-31, 16:50 [KW]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# Note:   The casing of block names is not normative.
+#         For example, "Basic Latin" and "BASIC LATIN" are equivalent.
+#
+# Format:
+# Start Code..End Code; Block Name
+
+# ================================================
+
+# Note:   When comparing block names, casing, whitespace, hyphens,
+#         and underbars are ignored.
+#         For example, "Latin Extended-A" and "latin extended a" are equivalent.
+#         For more information on the comparison of property values, 
+#            see UCD.html.
+#
+#  All code points not explicitly listed for Block
+#  have the value No_Block.
+
+# Property:	Block
+
+0000..007F; Basic Latin
+0080..00FF; Latin-1 Supplement
+0100..017F; Latin Extended-A
+0180..024F; Latin Extended-B
+0250..02AF; IPA Extensions
+02B0..02FF; Spacing Modifier Letters
+0300..036F; Combining Diacritical Marks
+0370..03FF; Greek and Coptic
+0400..04FF; Cyrillic
+0500..052F; Cyrillic Supplement
+0530..058F; Armenian
+0590..05FF; Hebrew
+0600..06FF; Arabic
+0700..074F; Syriac
+0750..077F; Arabic Supplement
+0780..07BF; Thaana
+0900..097F; Devanagari
+0980..09FF; Bengali
+0A00..0A7F; Gurmukhi
+0A80..0AFF; Gujarati
+0B00..0B7F; Oriya
+0B80..0BFF; Tamil
+0C00..0C7F; Telugu
+0C80..0CFF; Kannada
+0D00..0D7F; Malayalam
+0D80..0DFF; Sinhala
+0E00..0E7F; Thai
+0E80..0EFF; Lao
+0F00..0FFF; Tibetan
+1000..109F; Myanmar
+10A0..10FF; Georgian
+1100..11FF; Hangul Jamo
+1200..137F; Ethiopic
+1380..139F; Ethiopic Supplement
+13A0..13FF; Cherokee
+1400..167F; Unified Canadian Aboriginal Syllabics
+1680..169F; Ogham
+16A0..16FF; Runic
+1700..171F; Tagalog
+1720..173F; Hanunoo
+1740..175F; Buhid
+1760..177F; Tagbanwa
+1780..17FF; Khmer
+1800..18AF; Mongolian
+1900..194F; Limbu
+1950..197F; Tai Le
+1980..19DF; New Tai Lue
+19E0..19FF; Khmer Symbols
+1A00..1A1F; Buginese
+1D00..1D7F; Phonetic Extensions
+1D80..1DBF; Phonetic Extensions Supplement
+1DC0..1DFF; Combining Diacritical Marks Supplement
+1E00..1EFF; Latin Extended Additional
+1F00..1FFF; Greek Extended
+2000..206F; General Punctuation
+2070..209F; Superscripts and Subscripts
+20A0..20CF; Currency Symbols
+20D0..20FF; Combining Diacritical Marks for Symbols
+2100..214F; Letterlike Symbols
+2150..218F; Number Forms
+2190..21FF; Arrows
+2200..22FF; Mathematical Operators
+2300..23FF; Miscellaneous Technical
+2400..243F; Control Pictures
+2440..245F; Optical Character Recognition
+2460..24FF; Enclosed Alphanumerics
+2500..257F; Box Drawing
+2580..259F; Block Elements
+25A0..25FF; Geometric Shapes
+2600..26FF; Miscellaneous Symbols
+2700..27BF; Dingbats
+27C0..27EF; Miscellaneous Mathematical Symbols-A
+27F0..27FF; Supplemental Arrows-A
+2800..28FF; Braille Patterns
+2900..297F; Supplemental Arrows-B
+2980..29FF; Miscellaneous Mathematical Symbols-B
+2A00..2AFF; Supplemental Mathematical Operators
+2B00..2BFF; Miscellaneous Symbols and Arrows
+2C00..2C5F; Glagolitic
+2C80..2CFF; Coptic
+2D00..2D2F; Georgian Supplement
+2D30..2D7F; Tifinagh
+2D80..2DDF; Ethiopic Extended
+2E00..2E7F; Supplemental Punctuation
+2E80..2EFF; CJK Radicals Supplement
+2F00..2FDF; Kangxi Radicals
+2FF0..2FFF; Ideographic Description Characters
+3000..303F; CJK Symbols and Punctuation
+3040..309F; Hiragana
+30A0..30FF; Katakana
+3100..312F; Bopomofo
+3130..318F; Hangul Compatibility Jamo
+3190..319F; Kanbun
+31A0..31BF; Bopomofo Extended
+31C0..31EF; CJK Strokes
+31F0..31FF; Katakana Phonetic Extensions
+3200..32FF; Enclosed CJK Letters and Months
+3300..33FF; CJK Compatibility
+3400..4DBF; CJK Unified Ideographs Extension A
+4DC0..4DFF; Yijing Hexagram Symbols
+4E00..9FFF; CJK Unified Ideographs
+A000..A48F; Yi Syllables
+A490..A4CF; Yi Radicals
+A700..A71F; Modifier Tone Letters
+A800..A82F; Syloti Nagri
+AC00..D7AF; Hangul Syllables
+D800..DB7F; High Surrogates
+DB80..DBFF; High Private Use Surrogates
+DC00..DFFF; Low Surrogates
+E000..F8FF; Private Use Area
+F900..FAFF; CJK Compatibility Ideographs
+FB00..FB4F; Alphabetic Presentation Forms
+FB50..FDFF; Arabic Presentation Forms-A
+FE00..FE0F; Variation Selectors
+FE10..FE1F; Vertical Forms
+FE20..FE2F; Combining Half Marks
+FE30..FE4F; CJK Compatibility Forms
+FE50..FE6F; Small Form Variants
+FE70..FEFF; Arabic Presentation Forms-B
+FF00..FFEF; Halfwidth and Fullwidth Forms
+FFF0..FFFF; Specials
+10000..1007F; Linear B Syllabary
+10080..100FF; Linear B Ideograms
+10100..1013F; Aegean Numbers
+10140..1018F; Ancient Greek Numbers
+10300..1032F; Old Italic
+10330..1034F; Gothic
+10380..1039F; Ugaritic
+103A0..103DF; Old Persian
+10400..1044F; Deseret
+10450..1047F; Shavian
+10480..104AF; Osmanya
+10800..1083F; Cypriot Syllabary
+10A00..10A5F; Kharoshthi
+1D000..1D0FF; Byzantine Musical Symbols
+1D100..1D1FF; Musical Symbols
+1D200..1D24F; Ancient Greek Musical Notation
+1D300..1D35F; Tai Xuan Jing Symbols
+1D400..1D7FF; Mathematical Alphanumeric Symbols
+20000..2A6DF; CJK Unified Ideographs Extension B
+2F800..2FA1F; CJK Compatibility Ideographs Supplement
+E0000..E007F; Tags
+E0100..E01EF; Variation Selectors Supplement
+F0000..FFFFF; Supplementary Private Use Area-A
+100000..10FFFF; Supplementary Private Use Area-B
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/Canonical.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/Canonical.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/Canonical.pl	(revision 14489)
@@ -0,0 +1,1042 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+##
+## Data in this file used by ../utf8_heavy.pl
+##
+
+## Mapping from lc(canonical name) to filename in ./lib
+%utf8::Canonical = (
+
+ # InAegeanNumbers
+   aegeannumbers			    => 'InAegean',
+
+   alphabetic				    => 'Alphabet',
+
+ # InAlphabeticPresentationForms
+   alphabeticpresentationforms		    => 'InAlphab',
+
+ # InAncientGreekMusicalNotation
+   ancientgreekmusicalnotation		    => 'InAncie2',
+
+ # InAncientGreekNumbers
+   ancientgreeknumbers			    => 'InAncien',
+
+   arabic				    => 'Arab',
+
+ # InArabicPresentationFormsA
+   arabicpresentationformsa		    => 'InArabi4',
+
+ # InArabicPresentationFormsB
+   arabicpresentationformsb		    => 'InArabi3',
+
+ # InArabicSupplement
+   arabicsupplement			    => 'InArabi2',
+
+   armenian				    => 'Armn',
+
+ # InArrows
+   arrows				    => 'InArrows',
+
+ # AsciiHexDigit
+   asciihexdigit			    => 'AsciiHex',
+
+ # InBasicLatin
+   basiclatin				    => 'InBasicL',
+
+   bengali				    => 'Beng',
+
+ # BidiControl
+   bidicontrol				    => 'BidiCont',
+
+ # InBlockElements
+   blockelements			    => 'InBlockE',
+
+   bopomofo				    => 'Bopo',
+
+ # InBopomofoExtended
+   bopomofoextended			    => 'InBopom2',
+
+ # InBoxDrawing
+   boxdrawing				    => 'InBoxDra',
+
+   braille				    => 'Brai',
+
+ # InBraillePatterns
+   braillepatterns			    => 'InBraill',
+
+   buginese				    => 'Bugi',
+   buhid				    => 'Buhd',
+
+ # InByzantineMusicalSymbols
+   byzantinemusicalsymbols		    => 'InByzant',
+
+ # CanadianAboriginal
+   canadianaboriginal			    => 'Canadian',
+
+ # CasedLetter
+   casedletter				    => 'LC',
+
+   cherokee				    => 'Cher',
+
+ # InCjkCompatibility
+   cjkcompatibility			    => 'InCjkCom',
+
+ # InCjkCompatibilityForms
+   cjkcompatibilityforms		    => 'InCjkCo2',
+
+ # InCjkCompatibilityIdeographs
+   cjkcompatibilityideographs		    => 'InCjkCo3',
+
+ # InCjkCompatibilityIdeographsSupplement
+   cjkcompatibilityideographssupplement     => 'InCjkCo4',
+
+ # InCjkRadicalsSupplement
+   cjkradicalssupplement		    => 'InCjkRad',
+
+ # InCjkStrokes
+   cjkstrokes				    => 'InCjkStr',
+
+ # InCjkSymbolsAndPunctuation
+   cjksymbolsandpunctuation		    => 'InCjkSym',
+
+ # InCjkUnifiedIdeographs
+   cjkunifiedideographs 		    => 'InCjkUni',
+
+ # InCjkUnifiedIdeographsExtensionA
+   cjkunifiedideographsextensiona	    => 'InCjkUn3',
+
+ # InCjkUnifiedIdeographsExtensionB
+   cjkunifiedideographsextensionb	    => 'InCjkUn2',
+
+ # ClosePunctuation
+   closepunctuation			    => 'Pe',
+
+ # InCombiningDiacriticalMarks
+   combiningdiacriticalmarks		    => 'InCombi2',
+
+ # InCombiningDiacriticalMarksForSymbols
+   combiningdiacriticalmarksforsymbols	    => 'InCombi4',
+
+ # InCombiningDiacriticalMarksSupplement
+   combiningdiacriticalmarkssupplement	    => 'InCombi3',
+
+ # InCombiningHalfMarks
+   combininghalfmarks			    => 'InCombin',
+
+   common				    => 'Zyyy',
+
+ # ConnectorPunctuation
+   connectorpunctuation 		    => 'Pc',
+
+   control				    => 'Cc',
+
+ # InControlPictures
+   controlpictures			    => 'InContro',
+
+   coptic				    => 'Copt',
+
+ # CurrencySymbol
+   currencysymbol			    => 'Sc',
+
+ # InCurrencySymbols
+   currencysymbols			    => 'InCurren',
+
+   cypriot				    => 'Cprt',
+
+ # InCypriotSyllabary
+   cypriotsyllabary			    => 'InCyprio',
+
+   cyrillic				    => 'Cyrl',
+
+ # InCyrillicSupplement
+   cyrillicsupplement			    => 'InCyril2',
+
+   dash 				    => 'Dash2',
+
+ # DashPunctuation
+   dashpunctuation			    => 'Pd',
+
+ # DecimalNumber
+   decimalnumber			    => 'Nd',
+
+   deprecated				    => 'Deprecat',
+   deseret				    => 'Dsrt',
+   devanagari				    => 'Deva',
+   diacritic				    => 'Diacriti',
+
+ # InDingbats
+   dingbats				    => 'InDingba',
+
+ # InEnclosedAlphanumerics
+   enclosedalphanumerics		    => 'InEnclos',
+
+ # InEnclosedCjkLettersAndMonths
+   enclosedcjklettersandmonths		    => 'InEnclo2',
+
+ # EnclosingMark
+   enclosingmark			    => 'Me',
+
+   ethiopic				    => 'Ethi',
+
+ # InEthiopicExtended
+   ethiopicextended			    => 'InEthio2',
+
+ # InEthiopicSupplement
+   ethiopicsupplement			    => 'InEthio3',
+
+   extender				    => 'Extender',
+
+ # FinalPunctuation
+   finalpunctuation			    => 'Pf',
+
+   format				    => 'Cf',
+
+ # InGeneralPunctuation
+   generalpunctuation			    => 'InGenera',
+
+ # InGeometricShapes
+   geometricshapes			    => 'InGeomet',
+
+   georgian				    => 'Geor',
+
+ # InGeorgianSupplement
+   georgiansupplement			    => 'InGeorg2',
+
+   glagolitic				    => 'Glag',
+   gothic				    => 'Goth',
+
+ # GraphemeLink
+   graphemelink 			    => 'Grapheme',
+
+   greek				    => 'Grek',
+
+ # InGreekAndCoptic
+   greekandcoptic			    => 'InGreekA',
+
+ # InGreekExtended
+   greekextended			    => 'InGreekE',
+
+   gujarati				    => 'Gujr',
+   gurmukhi				    => 'Guru',
+
+ # InHalfwidthAndFullwidthForms
+   halfwidthandfullwidthforms		    => 'InHalfwi',
+
+   han					    => 'Hani',
+   hangul				    => 'Hang',
+
+ # InHangulCompatibilityJamo
+   hangulcompatibilityjamo		    => 'InHangu3',
+
+ # InHangulJamo
+   hanguljamo				    => 'InHangul',
+
+ # InHangulSyllables
+   hangulsyllables			    => 'InHangu2',
+
+   hanunoo				    => 'Hano',
+   hebrew				    => 'Hebr',
+
+ # HexDigit
+   hexdigit				    => 'HexDigit',
+
+ # InHighPrivateUseSurrogates
+   highprivateusesurrogates		    => 'InHighPr',
+
+ # InHighSurrogates
+   highsurrogates			    => 'InHighSu',
+
+   hiragana				    => 'Hira',
+   hyphen				    => 'Hyphen2',
+
+ # IdContinue
+   idcontinue				    => 'IdContin',
+
+   ideographic				    => 'Ideograp',
+
+ # InIdeographicDescriptionCharacters
+   ideographicdescriptioncharacters	    => 'InIdeogr',
+
+ # IdsBinaryOperator
+   idsbinaryoperator			    => 'IdsBinar',
+
+ # IdStart
+   idstart				    => 'IdStart',
+
+ # IdsTrinaryOperator
+   idstrinaryoperator			    => 'IdsTrina',
+
+ # InAegeanNumbers
+   inaegeannumbers			    => 'InAegean',
+
+ # InAlphabeticPresentationForms
+   inalphabeticpresentationforms	    => 'InAlphab',
+
+ # InAncientGreekMusicalNotation
+   inancientgreekmusicalnotation	    => 'InAncie2',
+
+ # InAncientGreekNumbers
+   inancientgreeknumbers		    => 'InAncien',
+
+ # InArabic
+   inarabic				    => 'InArabic',
+
+ # InArabicPresentationFormsA
+   inarabicpresentationformsa		    => 'InArabi4',
+
+ # InArabicPresentationFormsB
+   inarabicpresentationformsb		    => 'InArabi3',
+
+ # InArabicSupplement
+   inarabicsupplement			    => 'InArabi2',
+
+ # InArmenian
+   inarmenian				    => 'InArmeni',
+
+ # InArrows
+   inarrows				    => 'InArrows',
+
+ # InBasicLatin
+   inbasiclatin 			    => 'InBasicL',
+
+ # InBengali
+   inbengali				    => 'InBengal',
+
+ # InBlockElements
+   inblockelements			    => 'InBlockE',
+
+ # InBopomofo
+   inbopomofo				    => 'InBopomo',
+
+ # InBopomofoExtended
+   inbopomofoextended			    => 'InBopom2',
+
+ # InBoxDrawing
+   inboxdrawing 			    => 'InBoxDra',
+
+ # InBraillePatterns
+   inbraillepatterns			    => 'InBraill',
+
+ # InBuginese
+   inbuginese				    => 'InBugine',
+
+ # InBuhid
+   inbuhid				    => 'InBuhid',
+
+ # InByzantineMusicalSymbols
+   inbyzantinemusicalsymbols		    => 'InByzant',
+
+ # InCherokee
+   incherokee				    => 'InCherok',
+
+ # InCjkCompatibility
+   incjkcompatibility			    => 'InCjkCom',
+
+ # InCjkCompatibilityForms
+   incjkcompatibilityforms		    => 'InCjkCo2',
+
+ # InCjkCompatibilityIdeographs
+   incjkcompatibilityideographs 	    => 'InCjkCo3',
+
+ # InCjkCompatibilityIdeographsSupplement
+   incjkcompatibilityideographssupplement   => 'InCjkCo4',
+
+ # InCjkRadicalsSupplement
+   incjkradicalssupplement		    => 'InCjkRad',
+
+ # InCjkStrokes
+   incjkstrokes 			    => 'InCjkStr',
+
+ # InCjkSymbolsAndPunctuation
+   incjksymbolsandpunctuation		    => 'InCjkSym',
+
+ # InCjkUnifiedIdeographs
+   incjkunifiedideographs		    => 'InCjkUni',
+
+ # InCjkUnifiedIdeographsExtensionA
+   incjkunifiedideographsextensiona	    => 'InCjkUn3',
+
+ # InCjkUnifiedIdeographsExtensionB
+   incjkunifiedideographsextensionb	    => 'InCjkUn2',
+
+ # InCombiningDiacriticalMarks
+   incombiningdiacriticalmarks		    => 'InCombi2',
+
+ # InCombiningDiacriticalMarksForSymbols
+   incombiningdiacriticalmarksforsymbols    => 'InCombi4',
+
+ # InCombiningDiacriticalMarksSupplement
+   incombiningdiacriticalmarkssupplement    => 'InCombi3',
+
+ # InCombiningHalfMarks
+   incombininghalfmarks 		    => 'InCombin',
+
+ # InControlPictures
+   incontrolpictures			    => 'InContro',
+
+ # InCoptic
+   incoptic				    => 'InCoptic',
+
+ # InCurrencySymbols
+   incurrencysymbols			    => 'InCurren',
+
+ # InCypriotSyllabary
+   incypriotsyllabary			    => 'InCyprio',
+
+ # InCyrillic
+   incyrillic				    => 'InCyrill',
+
+ # InCyrillicSupplement
+   incyrillicsupplement 		    => 'InCyril2',
+
+ # InDeseret
+   indeseret				    => 'InDesere',
+
+ # InDevanagari
+   indevanagari 			    => 'InDevana',
+
+ # InDingbats
+   indingbats				    => 'InDingba',
+
+ # InEnclosedAlphanumerics
+   inenclosedalphanumerics		    => 'InEnclos',
+
+ # InEnclosedCjkLettersAndMonths
+   inenclosedcjklettersandmonths	    => 'InEnclo2',
+
+ # InEthiopic
+   inethiopic				    => 'InEthiop',
+
+ # InEthiopicExtended
+   inethiopicextended			    => 'InEthio2',
+
+ # InEthiopicSupplement
+   inethiopicsupplement 		    => 'InEthio3',
+
+ # InGeneralPunctuation
+   ingeneralpunctuation 		    => 'InGenera',
+
+ # InGeometricShapes
+   ingeometricshapes			    => 'InGeomet',
+
+ # InGeorgian
+   ingeorgian				    => 'InGeorgi',
+
+ # InGeorgianSupplement
+   ingeorgiansupplement 		    => 'InGeorg2',
+
+ # InGlagolitic
+   inglagolitic 			    => 'InGlagol',
+
+ # InGothic
+   ingothic				    => 'InGothic',
+
+ # InGreekAndCoptic
+   ingreekandcoptic			    => 'InGreekA',
+
+ # InGreekExtended
+   ingreekextended			    => 'InGreekE',
+
+ # InGujarati
+   ingujarati				    => 'InGujara',
+
+ # InGurmukhi
+   ingurmukhi				    => 'InGurmuk',
+
+ # InHalfwidthAndFullwidthForms
+   inhalfwidthandfullwidthforms 	    => 'InHalfwi',
+
+ # InHangulCompatibilityJamo
+   inhangulcompatibilityjamo		    => 'InHangu3',
+
+ # InHangulJamo
+   inhanguljamo 			    => 'InHangul',
+
+ # InHangulSyllables
+   inhangulsyllables			    => 'InHangu2',
+
+ # InHanunoo
+   inhanunoo				    => 'InHanuno',
+
+ # InHebrew
+   inhebrew				    => 'InHebrew',
+
+   inherited				    => 'Qaai',
+
+ # InHighPrivateUseSurrogates
+   inhighprivateusesurrogates		    => 'InHighPr',
+
+ # InHighSurrogates
+   inhighsurrogates			    => 'InHighSu',
+
+ # InHiragana
+   inhiragana				    => 'InHiraga',
+
+ # InIdeographicDescriptionCharacters
+   inideographicdescriptioncharacters	    => 'InIdeogr',
+
+ # InIpaExtensions
+   inipaextensions			    => 'InIpaExt',
+
+ # InitialPunctuation
+   initialpunctuation			    => 'Pi',
+
+ # InKanbun
+   inkanbun				    => 'InKanbun',
+
+ # InKangxiRadicals
+   inkangxiradicals			    => 'InKangxi',
+
+ # InKannada
+   inkannada				    => 'InKannad',
+
+ # InKatakana
+   inkatakana				    => 'InKataka',
+
+ # InKatakanaPhoneticExtensions
+   inkatakanaphoneticextensions 	    => 'InKatak2',
+
+ # InKharoshthi
+   inkharoshthi 			    => 'InKharos',
+
+ # InKhmer
+   inkhmer				    => 'InKhmer',
+
+ # InKhmerSymbols
+   inkhmersymbols			    => 'InKhmerS',
+
+ # InLao
+   inlao				    => 'InLao',
+
+ # InLatin1Supplement
+   inlatin1supplement			    => 'InLatin1',
+
+ # InLatinExtendedA
+   inlatinextendeda			    => 'InLatin2',
+
+ # InLatinExtendedAdditional
+   inlatinextendedadditional		    => 'InLatin3',
+
+ # InLatinExtendedB
+   inlatinextendedb			    => 'InLatinE',
+
+ # InLetterlikeSymbols
+   inletterlikesymbols			    => 'InLetter',
+
+ # InLimbu
+   inlimbu				    => 'InLimbu',
+
+ # InLinearBIdeograms
+   inlinearbideograms			    => 'InLinear',
+
+ # InLinearBSyllabary
+   inlinearbsyllabary			    => 'InLinea2',
+
+ # InLowSurrogates
+   inlowsurrogates			    => 'InLowSur',
+
+ # InMalayalam
+   inmalayalam				    => 'InMalaya',
+
+ # InMathematicalAlphanumericSymbols
+   inmathematicalalphanumericsymbols	    => 'InMathe2',
+
+ # InMathematicalOperators
+   inmathematicaloperators		    => 'InMathem',
+
+ # InMiscellaneousMathematicalSymbolsA
+   inmiscellaneousmathematicalsymbolsa	    => 'InMisce4',
+
+ # InMiscellaneousMathematicalSymbolsB
+   inmiscellaneousmathematicalsymbolsb	    => 'InMisce5',
+
+ # InMiscellaneousSymbols
+   inmiscellaneoussymbols		    => 'InMiscel',
+
+ # InMiscellaneousSymbolsAndArrows
+   inmiscellaneoussymbolsandarrows	    => 'InMisce3',
+
+ # InMiscellaneousTechnical
+   inmiscellaneoustechnical		    => 'InMisce2',
+
+ # InModifierToneLetters
+   inmodifiertoneletters		    => 'InModifi',
+
+ # InMongolian
+   inmongolian				    => 'InMongol',
+
+ # InMusicalSymbols
+   inmusicalsymbols			    => 'InMusica',
+
+ # InMyanmar
+   inmyanmar				    => 'InMyanma',
+
+ # InNewTaiLue
+   innewtailue				    => 'InNewTai',
+
+ # InNumberForms
+   innumberforms			    => 'InNumber',
+
+ # InOgham
+   inogham				    => 'InOgham',
+
+ # InOldItalic
+   inolditalic				    => 'InOldIta',
+
+ # InOldPersian
+   inoldpersian 			    => 'InOldPer',
+
+ # InOpticalCharacterRecognition
+   inopticalcharacterrecognition	    => 'InOptica',
+
+ # InOriya
+   inoriya				    => 'InOriya',
+
+ # InOsmanya
+   inosmanya				    => 'InOsmany',
+
+ # InPhoneticExtensions
+   inphoneticextensions 		    => 'InPhonet',
+
+ # InPhoneticExtensionsSupplement
+   inphoneticextensionssupplement	    => 'InPhone2',
+
+ # InPrivateUseArea
+   inprivateusearea			    => 'InPrivat',
+
+ # InRunic
+   inrunic				    => 'InRunic',
+
+ # InShavian
+   inshavian				    => 'InShavia',
+
+ # InSinhala
+   insinhala				    => 'InSinhal',
+
+ # InSmallFormVariants
+   insmallformvariants			    => 'InSmallF',
+
+ # InSpacingModifierLetters
+   inspacingmodifierletters		    => 'InSpacin',
+
+ # InSpecials
+   inspecials				    => 'InSpecia',
+
+ # InSuperscriptsAndSubscripts
+   insuperscriptsandsubscripts		    => 'InSupers',
+
+ # InSupplementalArrowsA
+   insupplementalarrowsa		    => 'InSuppl2',
+
+ # InSupplementalArrowsB
+   insupplementalarrowsb		    => 'InSupple',
+
+ # InSupplementalMathematicalOperators
+   insupplementalmathematicaloperators	    => 'InSuppl6',
+
+ # InSupplementalPunctuation
+   insupplementalpunctuation		    => 'InSuppl3',
+
+ # InSupplementaryPrivateUseAreaA
+   insupplementaryprivateuseareaa	    => 'InSuppl4',
+
+ # InSupplementaryPrivateUseAreaB
+   insupplementaryprivateuseareab	    => 'InSuppl5',
+
+ # InSylotiNagri
+   insylotinagri			    => 'InSyloti',
+
+ # InSyriac
+   insyriac				    => 'InSyriac',
+
+ # InTagalog
+   intagalog				    => 'InTagalo',
+
+ # InTagbanwa
+   intagbanwa				    => 'InTagban',
+
+ # InTags
+   intags				    => 'InTags',
+
+ # InTaiLe
+   intaile				    => 'InTaiLe',
+
+ # InTaiXuanJingSymbols
+   intaixuanjingsymbols 		    => 'InTaiXua',
+
+ # InTamil
+   intamil				    => 'InTamil',
+
+ # InTelugu
+   intelugu				    => 'InTelugu',
+
+ # InThaana
+   inthaana				    => 'InThaana',
+
+ # InThai
+   inthai				    => 'InThai',
+
+ # InTibetan
+   intibetan				    => 'InTibeta',
+
+ # InTifinagh
+   intifinagh				    => 'InTifina',
+
+ # InUgaritic
+   inugaritic				    => 'InUgarit',
+
+ # InUnifiedCanadianAboriginalSyllabics
+   inunifiedcanadianaboriginalsyllabics     => 'InUnifie',
+
+ # InVariationSelectors
+   invariationselectors 		    => 'InVariat',
+
+ # InVariationSelectorsSupplement
+   invariationselectorssupplement	    => 'InVaria2',
+
+ # InVerticalForms
+   inverticalforms			    => 'InVertic',
+
+ # InYijingHexagramSymbols
+   inyijinghexagramsymbols		    => 'InYijing',
+
+ # InYiRadicals
+   inyiradicals 			    => 'InYiRadi',
+
+ # InYiSyllables
+   inyisyllables			    => 'InYiSyll',
+
+ # InIpaExtensions
+   ipaextensions			    => 'InIpaExt',
+
+ # JoinControl
+   joincontrol				    => 'JoinCont',
+
+ # InKanbun
+   kanbun				    => 'InKanbun',
+
+ # InKangxiRadicals
+   kangxiradicals			    => 'InKangxi',
+
+   kannada				    => 'Knda',
+   katakana				    => 'Kana',
+
+ # InKatakanaPhoneticExtensions
+   katakanaphoneticextensions		    => 'InKatak2',
+
+   kharoshthi				    => 'Khar',
+   khmer				    => 'Khmr',
+
+ # InKhmerSymbols
+   khmersymbols 			    => 'InKhmerS',
+
+   lao					    => 'Laoo',
+   latin				    => 'Latn',
+
+ # InLatin1Supplement
+   latin1supplement			    => 'InLatin1',
+
+ # InLatinExtendedA
+   latinextendeda			    => 'InLatin2',
+
+ # InLatinExtendedAdditional
+   latinextendedadditional		    => 'InLatin3',
+
+ # InLatinExtendedB
+   latinextendedb			    => 'InLatinE',
+
+   letter				    => 'L',
+
+ # InLetterlikeSymbols
+   letterlikesymbols			    => 'InLetter',
+
+ # LetterNumber
+   letternumber 			    => 'Nl',
+
+   limbu				    => 'Limb',
+
+ # LinearB
+   linearb				    => 'LinearB',
+
+ # InLinearBIdeograms
+   linearbideograms			    => 'InLinear',
+
+ # InLinearBSyllabary
+   linearbsyllabary			    => 'InLinea2',
+
+ # LineSeparator
+   lineseparator			    => 'Zl',
+
+ # LogicalOrderException
+   logicalorderexception		    => 'LogicalO',
+
+   lowercase				    => 'Lowercas',
+
+ # LowercaseLetter
+   lowercaseletter			    => 'Ll',
+
+ # InLowSurrogates
+   lowsurrogates			    => 'InLowSur',
+
+   malayalam				    => 'Mlym',
+   mark 				    => 'M',
+   math 				    => 'Math',
+
+ # InMathematicalAlphanumericSymbols
+   mathematicalalphanumericsymbols	    => 'InMathe2',
+
+ # InMathematicalOperators
+   mathematicaloperators		    => 'InMathem',
+
+ # MathSymbol
+   mathsymbol				    => 'Sm',
+
+ # InMiscellaneousMathematicalSymbolsA
+   miscellaneousmathematicalsymbolsa	    => 'InMisce4',
+
+ # InMiscellaneousMathematicalSymbolsB
+   miscellaneousmathematicalsymbolsb	    => 'InMisce5',
+
+ # InMiscellaneousSymbols
+   miscellaneoussymbols 		    => 'InMiscel',
+
+ # InMiscellaneousSymbolsAndArrows
+   miscellaneoussymbolsandarrows	    => 'InMisce3',
+
+ # InMiscellaneousTechnical
+   miscellaneoustechnical		    => 'InMisce2',
+
+ # ModifierLetter
+   modifierletter			    => 'Lm',
+
+ # ModifierSymbol
+   modifiersymbol			    => 'Sk',
+
+ # InModifierToneLetters
+   modifiertoneletters			    => 'InModifi',
+
+   mongolian				    => 'Mong',
+
+ # InMusicalSymbols
+   musicalsymbols			    => 'InMusica',
+
+   myanmar				    => 'Mymr',
+
+ # NewTaiLue
+   newtailue				    => 'NewTaiLu',
+
+ # NoncharacterCodePoint
+   noncharactercodepoint		    => 'Nonchara',
+
+ # NonspacingMark
+   nonspacingmark			    => 'Mn',
+
+   number				    => 'N',
+
+ # InNumberForms
+   numberforms				    => 'InNumber',
+
+   ogham				    => 'Ogam',
+
+ # OldItalic
+   olditalic				    => 'OldItali',
+
+ # OldPersian
+   oldpersian				    => 'OldPersi',
+
+ # OpenPunctuation
+   openpunctuation			    => 'Ps',
+
+ # InOpticalCharacterRecognition
+   opticalcharacterrecognition		    => 'InOptica',
+
+   oriya				    => 'Orya',
+   osmanya				    => 'Osma',
+   other				    => 'C',
+
+ # OtherAlphabetic
+   otheralphabetic			    => 'OtherAlp',
+
+ # OtherDefaultIgnorableCodePoint
+   otherdefaultignorablecodepoint	    => 'OtherDef',
+
+ # OtherGraphemeExtend
+   othergraphemeextend			    => 'OtherGra',
+
+ # OtherIdContinue
+   otheridcontinue			    => 'OtherIdC',
+
+ # OtherIdStart
+   otheridstart 			    => 'OtherIdS',
+
+ # OtherLetter
+   otherletter				    => 'Lo',
+
+ # OtherLowercase
+   otherlowercase			    => 'OtherLow',
+
+ # OtherMath
+   othermath				    => 'OtherMat',
+
+ # OtherNumber
+   othernumber				    => 'No',
+
+ # OtherPunctuation
+   otherpunctuation			    => 'Po',
+
+ # OtherSymbol
+   othersymbol				    => 'So',
+
+ # OtherUppercase
+   otheruppercase			    => 'OtherUpp',
+
+ # ParagraphSeparator
+   paragraphseparator			    => 'Zp',
+
+ # PatternSyntax
+   patternsyntax			    => 'PatternS',
+
+ # PatternWhiteSpace
+   patternwhitespace			    => 'PatternW',
+
+ # InPhoneticExtensions
+   phoneticextensions			    => 'InPhonet',
+
+ # InPhoneticExtensionsSupplement
+   phoneticextensionssupplement 	    => 'InPhone2',
+
+ # PrivateUse
+   privateuse				    => 'Co',
+
+ # InPrivateUseArea
+   privateusearea			    => 'InPrivat',
+
+   punctuation				    => 'P',
+
+ # QuotationMark
+   quotationmark			    => 'Quotatio',
+
+   radical				    => 'Radical2',
+   runic				    => 'Runr',
+   separator				    => 'Z',
+   shavian				    => 'Shaw',
+   sinhala				    => 'Sinh',
+
+ # InSmallFormVariants
+   smallformvariants			    => 'InSmallF',
+
+ # SoftDotted
+   softdotted				    => 'SoftDott',
+
+ # SpaceSeparator
+   spaceseparator			    => 'Zs',
+
+ # SpacingMark
+   spacingmark				    => 'Mc',
+
+ # InSpacingModifierLetters
+   spacingmodifierletters		    => 'InSpacin',
+
+ # InSpecials
+   specials				    => 'InSpecia',
+
+   sterm				    => 'Sterm2',
+
+ # InSuperscriptsAndSubscripts
+   superscriptsandsubscripts		    => 'InSupers',
+
+ # InSupplementalArrowsA
+   supplementalarrowsa			    => 'InSuppl2',
+
+ # InSupplementalArrowsB
+   supplementalarrowsb			    => 'InSupple',
+
+ # InSupplementalMathematicalOperators
+   supplementalmathematicaloperators	    => 'InSuppl6',
+
+ # InSupplementalPunctuation
+   supplementalpunctuation		    => 'InSuppl3',
+
+ # InSupplementaryPrivateUseAreaA
+   supplementaryprivateuseareaa 	    => 'InSuppl4',
+
+ # InSupplementaryPrivateUseAreaB
+   supplementaryprivateuseareab 	    => 'InSuppl5',
+
+   surrogate				    => 'Cs',
+
+ # SylotiNagri
+   sylotinagri				    => 'SylotiNa',
+
+   symbol				    => 'S',
+   syriac				    => 'Syrc',
+   tagalog				    => 'Tglg',
+   tagbanwa				    => 'Tagb',
+
+ # InTags
+   tags 				    => 'InTags',
+
+ # TaiLe
+   taile				    => 'TaiLe',
+
+ # InTaiXuanJingSymbols
+   taixuanjingsymbols			    => 'InTaiXua',
+
+   tamil				    => 'Taml',
+   telugu				    => 'Telu',
+
+ # TerminalPunctuation
+   terminalpunctuation			    => 'Terminal',
+
+   thaana				    => 'Thaa',
+   thai 				    => 'Thai',
+   tibetan				    => 'Tibt',
+   tifinagh				    => 'Tfng',
+
+ # TitlecaseLetter
+   titlecaseletter			    => 'Lt',
+
+   ugaritic				    => 'Ugar',
+   unassigned				    => 'Cn',
+
+ # InUnifiedCanadianAboriginalSyllabics
+   unifiedcanadianaboriginalsyllabics	    => 'InUnifie',
+
+ # UnifiedIdeograph
+   unifiedideograph			    => 'UnifiedI',
+
+   uppercase				    => 'Uppercas',
+
+ # UppercaseLetter
+   uppercaseletter			    => 'Lu',
+
+ # VariationSelector
+   variationselector			    => 'Variatio',
+
+ # InVariationSelectors
+   variationselectors			    => 'InVariat',
+
+ # InVariationSelectorsSupplement
+   variationselectorssupplement 	    => 'InVaria2',
+
+ # InVerticalForms
+   verticalforms			    => 'InVertic',
+
+ # WhiteSpace
+   whitespace				    => 'WhiteSpa',
+
+   yi					    => 'Yiii',
+
+ # InYijingHexagramSymbols
+   yijinghexagramsymbols		    => 'InYijing',
+
+ # InYiRadicals
+   yiradicals				    => 'InYiRadi',
+
+ # InYiSyllables
+   yisyllables				    => 'InYiSyll',
+
+);
+1
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/CaseFolding.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/CaseFolding.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/CaseFolding.txt	(revision 14489)
@@ -0,0 +1,1064 @@
+# CaseFolding-4.1.0.txt
+# Date: 2005-03-26, 00:24:43 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# Case Folding Properties
+#
+# This file is a supplement to the UnicodeData file.
+# It provides a case folding mapping generated from the Unicode Character Database.
+# If all characters are mapped according to the full mapping below, then
+# case differences (according to UnicodeData.txt and SpecialCasing.txt)
+# are eliminated.
+#
+# The data supports both implementations that require simple case foldings
+# (where string lengths don't change), and implementations that allow full case folding
+# (where string lengths may grow). Note that where they can be supported, the
+# full case foldings are superior: for example, they allow "MASSE" and "MaÃe" to match.
+#
+# All code points not listed in this file map to themselves.
+#
+# NOTE: case folding does not preserve normalization formats!
+#
+# For information on case folding, see
+# UTR #21 Case Mappings, at http://www.unicode.org/unicode/reports/tr21/
+#
+# ================================================================================
+# Format
+# ================================================================================
+# The entries in this file are in the following machine-readable format:
+#
+# <code>; <status>; <mapping>; # <name>
+#
+# The status field is:
+# C: common case folding, common mappings shared by both simple and full mappings.
+# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces.
+# S: simple case folding, mappings to single characters where different from F.
+# T: special case for uppercase I and dotted uppercase I
+#    - For non-Turkic languages, this mapping is normally not used.
+#    - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters.
+#      Note that the Turkic mappings do not maintain canonical equivalence without additional processing.
+#      See the discussions of case mapping in the Unicode Standard for more information.
+#
+# Usage:
+#  A. To do a simple case folding, use the mappings with status C + S.
+#  B. To do a full case folding, use the mappings with status C + F.
+#
+#    The mappings with status T can be used or omitted depending on the desired case-folding
+#    behavior. (The default option is to exclude them.)
+#
+# =================================================================
+
+0041; C; 0061; # LATIN CAPITAL LETTER A
+0042; C; 0062; # LATIN CAPITAL LETTER B
+0043; C; 0063; # LATIN CAPITAL LETTER C
+0044; C; 0064; # LATIN CAPITAL LETTER D
+0045; C; 0065; # LATIN CAPITAL LETTER E
+0046; C; 0066; # LATIN CAPITAL LETTER F
+0047; C; 0067; # LATIN CAPITAL LETTER G
+0048; C; 0068; # LATIN CAPITAL LETTER H
+0049; C; 0069; # LATIN CAPITAL LETTER I
+0049; T; 0131; # LATIN CAPITAL LETTER I
+004A; C; 006A; # LATIN CAPITAL LETTER J
+004B; C; 006B; # LATIN CAPITAL LETTER K
+004C; C; 006C; # LATIN CAPITAL LETTER L
+004D; C; 006D; # LATIN CAPITAL LETTER M
+004E; C; 006E; # LATIN CAPITAL LETTER N
+004F; C; 006F; # LATIN CAPITAL LETTER O
+0050; C; 0070; # LATIN CAPITAL LETTER P
+0051; C; 0071; # LATIN CAPITAL LETTER Q
+0052; C; 0072; # LATIN CAPITAL LETTER R
+0053; C; 0073; # LATIN CAPITAL LETTER S
+0054; C; 0074; # LATIN CAPITAL LETTER T
+0055; C; 0075; # LATIN CAPITAL LETTER U
+0056; C; 0076; # LATIN CAPITAL LETTER V
+0057; C; 0077; # LATIN CAPITAL LETTER W
+0058; C; 0078; # LATIN CAPITAL LETTER X
+0059; C; 0079; # LATIN CAPITAL LETTER Y
+005A; C; 007A; # LATIN CAPITAL LETTER Z
+00B5; C; 03BC; # MICRO SIGN
+00C0; C; 00E0; # LATIN CAPITAL LETTER A WITH GRAVE
+00C1; C; 00E1; # LATIN CAPITAL LETTER A WITH ACUTE
+00C2; C; 00E2; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3; C; 00E3; # LATIN CAPITAL LETTER A WITH TILDE
+00C4; C; 00E4; # LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5; C; 00E5; # LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6; C; 00E6; # LATIN CAPITAL LETTER AE
+00C7; C; 00E7; # LATIN CAPITAL LETTER C WITH CEDILLA
+00C8; C; 00E8; # LATIN CAPITAL LETTER E WITH GRAVE
+00C9; C; 00E9; # LATIN CAPITAL LETTER E WITH ACUTE
+00CA; C; 00EA; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB; C; 00EB; # LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC; C; 00EC; # LATIN CAPITAL LETTER I WITH GRAVE
+00CD; C; 00ED; # LATIN CAPITAL LETTER I WITH ACUTE
+00CE; C; 00EE; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF; C; 00EF; # LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0; C; 00F0; # LATIN CAPITAL LETTER ETH
+00D1; C; 00F1; # LATIN CAPITAL LETTER N WITH TILDE
+00D2; C; 00F2; # LATIN CAPITAL LETTER O WITH GRAVE
+00D3; C; 00F3; # LATIN CAPITAL LETTER O WITH ACUTE
+00D4; C; 00F4; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5; C; 00F5; # LATIN CAPITAL LETTER O WITH TILDE
+00D6; C; 00F6; # LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8; C; 00F8; # LATIN CAPITAL LETTER O WITH STROKE
+00D9; C; 00F9; # LATIN CAPITAL LETTER U WITH GRAVE
+00DA; C; 00FA; # LATIN CAPITAL LETTER U WITH ACUTE
+00DB; C; 00FB; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC; C; 00FC; # LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD; C; 00FD; # LATIN CAPITAL LETTER Y WITH ACUTE
+00DE; C; 00FE; # LATIN CAPITAL LETTER THORN
+00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S
+0100; C; 0101; # LATIN CAPITAL LETTER A WITH MACRON
+0102; C; 0103; # LATIN CAPITAL LETTER A WITH BREVE
+0104; C; 0105; # LATIN CAPITAL LETTER A WITH OGONEK
+0106; C; 0107; # LATIN CAPITAL LETTER C WITH ACUTE
+0108; C; 0109; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+010A; C; 010B; # LATIN CAPITAL LETTER C WITH DOT ABOVE
+010C; C; 010D; # LATIN CAPITAL LETTER C WITH CARON
+010E; C; 010F; # LATIN CAPITAL LETTER D WITH CARON
+0110; C; 0111; # LATIN CAPITAL LETTER D WITH STROKE
+0112; C; 0113; # LATIN CAPITAL LETTER E WITH MACRON
+0114; C; 0115; # LATIN CAPITAL LETTER E WITH BREVE
+0116; C; 0117; # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0118; C; 0119; # LATIN CAPITAL LETTER E WITH OGONEK
+011A; C; 011B; # LATIN CAPITAL LETTER E WITH CARON
+011C; C; 011D; # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011E; C; 011F; # LATIN CAPITAL LETTER G WITH BREVE
+0120; C; 0121; # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0122; C; 0123; # LATIN CAPITAL LETTER G WITH CEDILLA
+0124; C; 0125; # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0126; C; 0127; # LATIN CAPITAL LETTER H WITH STROKE
+0128; C; 0129; # LATIN CAPITAL LETTER I WITH TILDE
+012A; C; 012B; # LATIN CAPITAL LETTER I WITH MACRON
+012C; C; 012D; # LATIN CAPITAL LETTER I WITH BREVE
+012E; C; 012F; # LATIN CAPITAL LETTER I WITH OGONEK
+0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0132; C; 0133; # LATIN CAPITAL LIGATURE IJ
+0134; C; 0135; # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0136; C; 0137; # LATIN CAPITAL LETTER K WITH CEDILLA
+0139; C; 013A; # LATIN CAPITAL LETTER L WITH ACUTE
+013B; C; 013C; # LATIN CAPITAL LETTER L WITH CEDILLA
+013D; C; 013E; # LATIN CAPITAL LETTER L WITH CARON
+013F; C; 0140; # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0141; C; 0142; # LATIN CAPITAL LETTER L WITH STROKE
+0143; C; 0144; # LATIN CAPITAL LETTER N WITH ACUTE
+0145; C; 0146; # LATIN CAPITAL LETTER N WITH CEDILLA
+0147; C; 0148; # LATIN CAPITAL LETTER N WITH CARON
+0149; F; 02BC 006E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A; C; 014B; # LATIN CAPITAL LETTER ENG
+014C; C; 014D; # LATIN CAPITAL LETTER O WITH MACRON
+014E; C; 014F; # LATIN CAPITAL LETTER O WITH BREVE
+0150; C; 0151; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0152; C; 0153; # LATIN CAPITAL LIGATURE OE
+0154; C; 0155; # LATIN CAPITAL LETTER R WITH ACUTE
+0156; C; 0157; # LATIN CAPITAL LETTER R WITH CEDILLA
+0158; C; 0159; # LATIN CAPITAL LETTER R WITH CARON
+015A; C; 015B; # LATIN CAPITAL LETTER S WITH ACUTE
+015C; C; 015D; # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015E; C; 015F; # LATIN CAPITAL LETTER S WITH CEDILLA
+0160; C; 0161; # LATIN CAPITAL LETTER S WITH CARON
+0162; C; 0163; # LATIN CAPITAL LETTER T WITH CEDILLA
+0164; C; 0165; # LATIN CAPITAL LETTER T WITH CARON
+0166; C; 0167; # LATIN CAPITAL LETTER T WITH STROKE
+0168; C; 0169; # LATIN CAPITAL LETTER U WITH TILDE
+016A; C; 016B; # LATIN CAPITAL LETTER U WITH MACRON
+016C; C; 016D; # LATIN CAPITAL LETTER U WITH BREVE
+016E; C; 016F; # LATIN CAPITAL LETTER U WITH RING ABOVE
+0170; C; 0171; # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0172; C; 0173; # LATIN CAPITAL LETTER U WITH OGONEK
+0174; C; 0175; # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0176; C; 0177; # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0178; C; 00FF; # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179; C; 017A; # LATIN CAPITAL LETTER Z WITH ACUTE
+017B; C; 017C; # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017D; C; 017E; # LATIN CAPITAL LETTER Z WITH CARON
+017F; C; 0073; # LATIN SMALL LETTER LONG S
+0181; C; 0253; # LATIN CAPITAL LETTER B WITH HOOK
+0182; C; 0183; # LATIN CAPITAL LETTER B WITH TOPBAR
+0184; C; 0185; # LATIN CAPITAL LETTER TONE SIX
+0186; C; 0254; # LATIN CAPITAL LETTER OPEN O
+0187; C; 0188; # LATIN CAPITAL LETTER C WITH HOOK
+0189; C; 0256; # LATIN CAPITAL LETTER AFRICAN D
+018A; C; 0257; # LATIN CAPITAL LETTER D WITH HOOK
+018B; C; 018C; # LATIN CAPITAL LETTER D WITH TOPBAR
+018E; C; 01DD; # LATIN CAPITAL LETTER REVERSED E
+018F; C; 0259; # LATIN CAPITAL LETTER SCHWA
+0190; C; 025B; # LATIN CAPITAL LETTER OPEN E
+0191; C; 0192; # LATIN CAPITAL LETTER F WITH HOOK
+0193; C; 0260; # LATIN CAPITAL LETTER G WITH HOOK
+0194; C; 0263; # LATIN CAPITAL LETTER GAMMA
+0196; C; 0269; # LATIN CAPITAL LETTER IOTA
+0197; C; 0268; # LATIN CAPITAL LETTER I WITH STROKE
+0198; C; 0199; # LATIN CAPITAL LETTER K WITH HOOK
+019C; C; 026F; # LATIN CAPITAL LETTER TURNED M
+019D; C; 0272; # LATIN CAPITAL LETTER N WITH LEFT HOOK
+019F; C; 0275; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0; C; 01A1; # LATIN CAPITAL LETTER O WITH HORN
+01A2; C; 01A3; # LATIN CAPITAL LETTER OI
+01A4; C; 01A5; # LATIN CAPITAL LETTER P WITH HOOK
+01A6; C; 0280; # LATIN LETTER YR
+01A7; C; 01A8; # LATIN CAPITAL LETTER TONE TWO
+01A9; C; 0283; # LATIN CAPITAL LETTER ESH
+01AC; C; 01AD; # LATIN CAPITAL LETTER T WITH HOOK
+01AE; C; 0288; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF; C; 01B0; # LATIN CAPITAL LETTER U WITH HORN
+01B1; C; 028A; # LATIN CAPITAL LETTER UPSILON
+01B2; C; 028B; # LATIN CAPITAL LETTER V WITH HOOK
+01B3; C; 01B4; # LATIN CAPITAL LETTER Y WITH HOOK
+01B5; C; 01B6; # LATIN CAPITAL LETTER Z WITH STROKE
+01B7; C; 0292; # LATIN CAPITAL LETTER EZH
+01B8; C; 01B9; # LATIN CAPITAL LETTER EZH REVERSED
+01BC; C; 01BD; # LATIN CAPITAL LETTER TONE FIVE
+01C4; C; 01C6; # LATIN CAPITAL LETTER DZ WITH CARON
+01C5; C; 01C6; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C7; C; 01C9; # LATIN CAPITAL LETTER LJ
+01C8; C; 01C9; # LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01CA; C; 01CC; # LATIN CAPITAL LETTER NJ
+01CB; C; 01CC; # LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CD; C; 01CE; # LATIN CAPITAL LETTER A WITH CARON
+01CF; C; 01D0; # LATIN CAPITAL LETTER I WITH CARON
+01D1; C; 01D2; # LATIN CAPITAL LETTER O WITH CARON
+01D3; C; 01D4; # LATIN CAPITAL LETTER U WITH CARON
+01D5; C; 01D6; # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D7; C; 01D8; # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D9; C; 01DA; # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DB; C; 01DC; # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DE; C; 01DF; # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01E0; C; 01E1; # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E2; C; 01E3; # LATIN CAPITAL LETTER AE WITH MACRON
+01E4; C; 01E5; # LATIN CAPITAL LETTER G WITH STROKE
+01E6; C; 01E7; # LATIN CAPITAL LETTER G WITH CARON
+01E8; C; 01E9; # LATIN CAPITAL LETTER K WITH CARON
+01EA; C; 01EB; # LATIN CAPITAL LETTER O WITH OGONEK
+01EC; C; 01ED; # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01EE; C; 01EF; # LATIN CAPITAL LETTER EZH WITH CARON
+01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON
+01F1; C; 01F3; # LATIN CAPITAL LETTER DZ
+01F2; C; 01F3; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F4; C; 01F5; # LATIN CAPITAL LETTER G WITH ACUTE
+01F6; C; 0195; # LATIN CAPITAL LETTER HWAIR
+01F7; C; 01BF; # LATIN CAPITAL LETTER WYNN
+01F8; C; 01F9; # LATIN CAPITAL LETTER N WITH GRAVE
+01FA; C; 01FB; # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FC; C; 01FD; # LATIN CAPITAL LETTER AE WITH ACUTE
+01FE; C; 01FF; # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+0200; C; 0201; # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0202; C; 0203; # LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0204; C; 0205; # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0206; C; 0207; # LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0208; C; 0209; # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+020A; C; 020B; # LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020C; C; 020D; # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020E; C; 020F; # LATIN CAPITAL LETTER O WITH INVERTED BREVE
+0210; C; 0211; # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0212; C; 0213; # LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0214; C; 0215; # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0216; C; 0217; # LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0218; C; 0219; # LATIN CAPITAL LETTER S WITH COMMA BELOW
+021A; C; 021B; # LATIN CAPITAL LETTER T WITH COMMA BELOW
+021C; C; 021D; # LATIN CAPITAL LETTER YOGH
+021E; C; 021F; # LATIN CAPITAL LETTER H WITH CARON
+0220; C; 019E; # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0222; C; 0223; # LATIN CAPITAL LETTER OU
+0224; C; 0225; # LATIN CAPITAL LETTER Z WITH HOOK
+0226; C; 0227; # LATIN CAPITAL LETTER A WITH DOT ABOVE
+0228; C; 0229; # LATIN CAPITAL LETTER E WITH CEDILLA
+022A; C; 022B; # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022C; C; 022D; # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022E; C; 022F; # LATIN CAPITAL LETTER O WITH DOT ABOVE
+0230; C; 0231; # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0232; C; 0233; # LATIN CAPITAL LETTER Y WITH MACRON
+023B; C; 023C; # LATIN CAPITAL LETTER C WITH STROKE
+023D; C; 019A; # LATIN CAPITAL LETTER L WITH BAR
+0241; C; 0294; # LATIN CAPITAL LETTER GLOTTAL STOP
+0345; C; 03B9; # COMBINING GREEK YPOGEGRAMMENI
+0386; C; 03AC; # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388; C; 03AD; # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389; C; 03AE; # GREEK CAPITAL LETTER ETA WITH TONOS
+038A; C; 03AF; # GREEK CAPITAL LETTER IOTA WITH TONOS
+038C; C; 03CC; # GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E; C; 03CD; # GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F; C; 03CE; # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391; C; 03B1; # GREEK CAPITAL LETTER ALPHA
+0392; C; 03B2; # GREEK CAPITAL LETTER BETA
+0393; C; 03B3; # GREEK CAPITAL LETTER GAMMA
+0394; C; 03B4; # GREEK CAPITAL LETTER DELTA
+0395; C; 03B5; # GREEK CAPITAL LETTER EPSILON
+0396; C; 03B6; # GREEK CAPITAL LETTER ZETA
+0397; C; 03B7; # GREEK CAPITAL LETTER ETA
+0398; C; 03B8; # GREEK CAPITAL LETTER THETA
+0399; C; 03B9; # GREEK CAPITAL LETTER IOTA
+039A; C; 03BA; # GREEK CAPITAL LETTER KAPPA
+039B; C; 03BB; # GREEK CAPITAL LETTER LAMDA
+039C; C; 03BC; # GREEK CAPITAL LETTER MU
+039D; C; 03BD; # GREEK CAPITAL LETTER NU
+039E; C; 03BE; # GREEK CAPITAL LETTER XI
+039F; C; 03BF; # GREEK CAPITAL LETTER OMICRON
+03A0; C; 03C0; # GREEK CAPITAL LETTER PI
+03A1; C; 03C1; # GREEK CAPITAL LETTER RHO
+03A3; C; 03C3; # GREEK CAPITAL LETTER SIGMA
+03A4; C; 03C4; # GREEK CAPITAL LETTER TAU
+03A5; C; 03C5; # GREEK CAPITAL LETTER UPSILON
+03A6; C; 03C6; # GREEK CAPITAL LETTER PHI
+03A7; C; 03C7; # GREEK CAPITAL LETTER CHI
+03A8; C; 03C8; # GREEK CAPITAL LETTER PSI
+03A9; C; 03C9; # GREEK CAPITAL LETTER OMEGA
+03AA; C; 03CA; # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB; C; 03CB; # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03B0; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03C2; C; 03C3; # GREEK SMALL LETTER FINAL SIGMA
+03D0; C; 03B2; # GREEK BETA SYMBOL
+03D1; C; 03B8; # GREEK THETA SYMBOL
+03D5; C; 03C6; # GREEK PHI SYMBOL
+03D6; C; 03C0; # GREEK PI SYMBOL
+03D8; C; 03D9; # GREEK LETTER ARCHAIC KOPPA
+03DA; C; 03DB; # GREEK LETTER STIGMA
+03DC; C; 03DD; # GREEK LETTER DIGAMMA
+03DE; C; 03DF; # GREEK LETTER KOPPA
+03E0; C; 03E1; # GREEK LETTER SAMPI
+03E2; C; 03E3; # COPTIC CAPITAL LETTER SHEI
+03E4; C; 03E5; # COPTIC CAPITAL LETTER FEI
+03E6; C; 03E7; # COPTIC CAPITAL LETTER KHEI
+03E8; C; 03E9; # COPTIC CAPITAL LETTER HORI
+03EA; C; 03EB; # COPTIC CAPITAL LETTER GANGIA
+03EC; C; 03ED; # COPTIC CAPITAL LETTER SHIMA
+03EE; C; 03EF; # COPTIC CAPITAL LETTER DEI
+03F0; C; 03BA; # GREEK KAPPA SYMBOL
+03F1; C; 03C1; # GREEK RHO SYMBOL
+03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL
+03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL
+03F7; C; 03F8; # GREEK CAPITAL LETTER SHO
+03F9; C; 03F2; # GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA; C; 03FB; # GREEK CAPITAL LETTER SAN
+0400; C; 0450; # CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401; C; 0451; # CYRILLIC CAPITAL LETTER IO
+0402; C; 0452; # CYRILLIC CAPITAL LETTER DJE
+0403; C; 0453; # CYRILLIC CAPITAL LETTER GJE
+0404; C; 0454; # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405; C; 0455; # CYRILLIC CAPITAL LETTER DZE
+0406; C; 0456; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407; C; 0457; # CYRILLIC CAPITAL LETTER YI
+0408; C; 0458; # CYRILLIC CAPITAL LETTER JE
+0409; C; 0459; # CYRILLIC CAPITAL LETTER LJE
+040A; C; 045A; # CYRILLIC CAPITAL LETTER NJE
+040B; C; 045B; # CYRILLIC CAPITAL LETTER TSHE
+040C; C; 045C; # CYRILLIC CAPITAL LETTER KJE
+040D; C; 045D; # CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E; C; 045E; # CYRILLIC CAPITAL LETTER SHORT U
+040F; C; 045F; # CYRILLIC CAPITAL LETTER DZHE
+0410; C; 0430; # CYRILLIC CAPITAL LETTER A
+0411; C; 0431; # CYRILLIC CAPITAL LETTER BE
+0412; C; 0432; # CYRILLIC CAPITAL LETTER VE
+0413; C; 0433; # CYRILLIC CAPITAL LETTER GHE
+0414; C; 0434; # CYRILLIC CAPITAL LETTER DE
+0415; C; 0435; # CYRILLIC CAPITAL LETTER IE
+0416; C; 0436; # CYRILLIC CAPITAL LETTER ZHE
+0417; C; 0437; # CYRILLIC CAPITAL LETTER ZE
+0418; C; 0438; # CYRILLIC CAPITAL LETTER I
+0419; C; 0439; # CYRILLIC CAPITAL LETTER SHORT I
+041A; C; 043A; # CYRILLIC CAPITAL LETTER KA
+041B; C; 043B; # CYRILLIC CAPITAL LETTER EL
+041C; C; 043C; # CYRILLIC CAPITAL LETTER EM
+041D; C; 043D; # CYRILLIC CAPITAL LETTER EN
+041E; C; 043E; # CYRILLIC CAPITAL LETTER O
+041F; C; 043F; # CYRILLIC CAPITAL LETTER PE
+0420; C; 0440; # CYRILLIC CAPITAL LETTER ER
+0421; C; 0441; # CYRILLIC CAPITAL LETTER ES
+0422; C; 0442; # CYRILLIC CAPITAL LETTER TE
+0423; C; 0443; # CYRILLIC CAPITAL LETTER U
+0424; C; 0444; # CYRILLIC CAPITAL LETTER EF
+0425; C; 0445; # CYRILLIC CAPITAL LETTER HA
+0426; C; 0446; # CYRILLIC CAPITAL LETTER TSE
+0427; C; 0447; # CYRILLIC CAPITAL LETTER CHE
+0428; C; 0448; # CYRILLIC CAPITAL LETTER SHA
+0429; C; 0449; # CYRILLIC CAPITAL LETTER SHCHA
+042A; C; 044A; # CYRILLIC CAPITAL LETTER HARD SIGN
+042B; C; 044B; # CYRILLIC CAPITAL LETTER YERU
+042C; C; 044C; # CYRILLIC CAPITAL LETTER SOFT SIGN
+042D; C; 044D; # CYRILLIC CAPITAL LETTER E
+042E; C; 044E; # CYRILLIC CAPITAL LETTER YU
+042F; C; 044F; # CYRILLIC CAPITAL LETTER YA
+0460; C; 0461; # CYRILLIC CAPITAL LETTER OMEGA
+0462; C; 0463; # CYRILLIC CAPITAL LETTER YAT
+0464; C; 0465; # CYRILLIC CAPITAL LETTER IOTIFIED E
+0466; C; 0467; # CYRILLIC CAPITAL LETTER LITTLE YUS
+0468; C; 0469; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+046A; C; 046B; # CYRILLIC CAPITAL LETTER BIG YUS
+046C; C; 046D; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046E; C; 046F; # CYRILLIC CAPITAL LETTER KSI
+0470; C; 0471; # CYRILLIC CAPITAL LETTER PSI
+0472; C; 0473; # CYRILLIC CAPITAL LETTER FITA
+0474; C; 0475; # CYRILLIC CAPITAL LETTER IZHITSA
+0476; C; 0477; # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478; C; 0479; # CYRILLIC CAPITAL LETTER UK
+047A; C; 047B; # CYRILLIC CAPITAL LETTER ROUND OMEGA
+047C; C; 047D; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047E; C; 047F; # CYRILLIC CAPITAL LETTER OT
+0480; C; 0481; # CYRILLIC CAPITAL LETTER KOPPA
+048A; C; 048B; # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048C; C; 048D; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048E; C; 048F; # CYRILLIC CAPITAL LETTER ER WITH TICK
+0490; C; 0491; # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0492; C; 0493; # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0494; C; 0495; # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0496; C; 0497; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0498; C; 0499; # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+049A; C; 049B; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049C; C; 049D; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049E; C; 049F; # CYRILLIC CAPITAL LETTER KA WITH STROKE
+04A0; C; 04A1; # CYRILLIC CAPITAL LETTER BASHKIR KA
+04A2; C; 04A3; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A4; C; 04A5; # CYRILLIC CAPITAL LIGATURE EN GHE
+04A6; C; 04A7; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A8; C; 04A9; # CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04AA; C; 04AB; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AC; C; 04AD; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AE; C; 04AF; # CYRILLIC CAPITAL LETTER STRAIGHT U
+04B0; C; 04B1; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B2; C; 04B3; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B4; C; 04B5; # CYRILLIC CAPITAL LIGATURE TE TSE
+04B6; C; 04B7; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B8; C; 04B9; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04BA; C; 04BB; # CYRILLIC CAPITAL LETTER SHHA
+04BC; C; 04BD; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BE; C; 04BF; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04C1; C; 04C2; # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C3; C; 04C4; # CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C5; C; 04C6; # CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C7; C; 04C8; # CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C9; C; 04CA; # CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CB; C; 04CC; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CD; C; 04CE; # CYRILLIC CAPITAL LETTER EM WITH TAIL
+04D0; C; 04D1; # CYRILLIC CAPITAL LETTER A WITH BREVE
+04D2; C; 04D3; # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D4; C; 04D5; # CYRILLIC CAPITAL LIGATURE A IE
+04D6; C; 04D7; # CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D8; C; 04D9; # CYRILLIC CAPITAL LETTER SCHWA
+04DA; C; 04DB; # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DC; C; 04DD; # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DE; C; 04DF; # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04E0; C; 04E1; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E2; C; 04E3; # CYRILLIC CAPITAL LETTER I WITH MACRON
+04E4; C; 04E5; # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E6; C; 04E7; # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E8; C; 04E9; # CYRILLIC CAPITAL LETTER BARRED O
+04EA; C; 04EB; # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EC; C; 04ED; # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04EE; C; 04EF; # CYRILLIC CAPITAL LETTER U WITH MACRON
+04F0; C; 04F1; # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F2; C; 04F3; # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F4; C; 04F5; # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F6; C; 04F7; # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F8; C; 04F9; # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+0500; C; 0501; # CYRILLIC CAPITAL LETTER KOMI DE
+0502; C; 0503; # CYRILLIC CAPITAL LETTER KOMI DJE
+0504; C; 0505; # CYRILLIC CAPITAL LETTER KOMI ZJE
+0506; C; 0507; # CYRILLIC CAPITAL LETTER KOMI DZJE
+0508; C; 0509; # CYRILLIC CAPITAL LETTER KOMI LJE
+050A; C; 050B; # CYRILLIC CAPITAL LETTER KOMI NJE
+050C; C; 050D; # CYRILLIC CAPITAL LETTER KOMI SJE
+050E; C; 050F; # CYRILLIC CAPITAL LETTER KOMI TJE
+0531; C; 0561; # ARMENIAN CAPITAL LETTER AYB
+0532; C; 0562; # ARMENIAN CAPITAL LETTER BEN
+0533; C; 0563; # ARMENIAN CAPITAL LETTER GIM
+0534; C; 0564; # ARMENIAN CAPITAL LETTER DA
+0535; C; 0565; # ARMENIAN CAPITAL LETTER ECH
+0536; C; 0566; # ARMENIAN CAPITAL LETTER ZA
+0537; C; 0567; # ARMENIAN CAPITAL LETTER EH
+0538; C; 0568; # ARMENIAN CAPITAL LETTER ET
+0539; C; 0569; # ARMENIAN CAPITAL LETTER TO
+053A; C; 056A; # ARMENIAN CAPITAL LETTER ZHE
+053B; C; 056B; # ARMENIAN CAPITAL LETTER INI
+053C; C; 056C; # ARMENIAN CAPITAL LETTER LIWN
+053D; C; 056D; # ARMENIAN CAPITAL LETTER XEH
+053E; C; 056E; # ARMENIAN CAPITAL LETTER CA
+053F; C; 056F; # ARMENIAN CAPITAL LETTER KEN
+0540; C; 0570; # ARMENIAN CAPITAL LETTER HO
+0541; C; 0571; # ARMENIAN CAPITAL LETTER JA
+0542; C; 0572; # ARMENIAN CAPITAL LETTER GHAD
+0543; C; 0573; # ARMENIAN CAPITAL LETTER CHEH
+0544; C; 0574; # ARMENIAN CAPITAL LETTER MEN
+0545; C; 0575; # ARMENIAN CAPITAL LETTER YI
+0546; C; 0576; # ARMENIAN CAPITAL LETTER NOW
+0547; C; 0577; # ARMENIAN CAPITAL LETTER SHA
+0548; C; 0578; # ARMENIAN CAPITAL LETTER VO
+0549; C; 0579; # ARMENIAN CAPITAL LETTER CHA
+054A; C; 057A; # ARMENIAN CAPITAL LETTER PEH
+054B; C; 057B; # ARMENIAN CAPITAL LETTER JHEH
+054C; C; 057C; # ARMENIAN CAPITAL LETTER RA
+054D; C; 057D; # ARMENIAN CAPITAL LETTER SEH
+054E; C; 057E; # ARMENIAN CAPITAL LETTER VEW
+054F; C; 057F; # ARMENIAN CAPITAL LETTER TIWN
+0550; C; 0580; # ARMENIAN CAPITAL LETTER REH
+0551; C; 0581; # ARMENIAN CAPITAL LETTER CO
+0552; C; 0582; # ARMENIAN CAPITAL LETTER YIWN
+0553; C; 0583; # ARMENIAN CAPITAL LETTER PIWR
+0554; C; 0584; # ARMENIAN CAPITAL LETTER KEH
+0555; C; 0585; # ARMENIAN CAPITAL LETTER OH
+0556; C; 0586; # ARMENIAN CAPITAL LETTER FEH
+0587; F; 0565 0582; # ARMENIAN SMALL LIGATURE ECH YIWN
+10A0; C; 2D00; # GEORGIAN CAPITAL LETTER AN
+10A1; C; 2D01; # GEORGIAN CAPITAL LETTER BAN
+10A2; C; 2D02; # GEORGIAN CAPITAL LETTER GAN
+10A3; C; 2D03; # GEORGIAN CAPITAL LETTER DON
+10A4; C; 2D04; # GEORGIAN CAPITAL LETTER EN
+10A5; C; 2D05; # GEORGIAN CAPITAL LETTER VIN
+10A6; C; 2D06; # GEORGIAN CAPITAL LETTER ZEN
+10A7; C; 2D07; # GEORGIAN CAPITAL LETTER TAN
+10A8; C; 2D08; # GEORGIAN CAPITAL LETTER IN
+10A9; C; 2D09; # GEORGIAN CAPITAL LETTER KAN
+10AA; C; 2D0A; # GEORGIAN CAPITAL LETTER LAS
+10AB; C; 2D0B; # GEORGIAN CAPITAL LETTER MAN
+10AC; C; 2D0C; # GEORGIAN CAPITAL LETTER NAR
+10AD; C; 2D0D; # GEORGIAN CAPITAL LETTER ON
+10AE; C; 2D0E; # GEORGIAN CAPITAL LETTER PAR
+10AF; C; 2D0F; # GEORGIAN CAPITAL LETTER ZHAR
+10B0; C; 2D10; # GEORGIAN CAPITAL LETTER RAE
+10B1; C; 2D11; # GEORGIAN CAPITAL LETTER SAN
+10B2; C; 2D12; # GEORGIAN CAPITAL LETTER TAR
+10B3; C; 2D13; # GEORGIAN CAPITAL LETTER UN
+10B4; C; 2D14; # GEORGIAN CAPITAL LETTER PHAR
+10B5; C; 2D15; # GEORGIAN CAPITAL LETTER KHAR
+10B6; C; 2D16; # GEORGIAN CAPITAL LETTER GHAN
+10B7; C; 2D17; # GEORGIAN CAPITAL LETTER QAR
+10B8; C; 2D18; # GEORGIAN CAPITAL LETTER SHIN
+10B9; C; 2D19; # GEORGIAN CAPITAL LETTER CHIN
+10BA; C; 2D1A; # GEORGIAN CAPITAL LETTER CAN
+10BB; C; 2D1B; # GEORGIAN CAPITAL LETTER JIL
+10BC; C; 2D1C; # GEORGIAN CAPITAL LETTER CIL
+10BD; C; 2D1D; # GEORGIAN CAPITAL LETTER CHAR
+10BE; C; 2D1E; # GEORGIAN CAPITAL LETTER XAN
+10BF; C; 2D1F; # GEORGIAN CAPITAL LETTER JHAN
+10C0; C; 2D20; # GEORGIAN CAPITAL LETTER HAE
+10C1; C; 2D21; # GEORGIAN CAPITAL LETTER HE
+10C2; C; 2D22; # GEORGIAN CAPITAL LETTER HIE
+10C3; C; 2D23; # GEORGIAN CAPITAL LETTER WE
+10C4; C; 2D24; # GEORGIAN CAPITAL LETTER HAR
+10C5; C; 2D25; # GEORGIAN CAPITAL LETTER HOE
+1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW
+1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW
+1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW
+1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW
+1E10; C; 1E11; # LATIN CAPITAL LETTER D WITH CEDILLA
+1E12; C; 1E13; # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E14; C; 1E15; # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E16; C; 1E17; # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E18; C; 1E19; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E1A; C; 1E1B; # LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1C; C; 1E1D; # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1E; C; 1E1F; # LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E20; C; 1E21; # LATIN CAPITAL LETTER G WITH MACRON
+1E22; C; 1E23; # LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E24; C; 1E25; # LATIN CAPITAL LETTER H WITH DOT BELOW
+1E26; C; 1E27; # LATIN CAPITAL LETTER H WITH DIAERESIS
+1E28; C; 1E29; # LATIN CAPITAL LETTER H WITH CEDILLA
+1E2A; C; 1E2B; # LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2C; C; 1E2D; # LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2E; C; 1E2F; # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E30; C; 1E31; # LATIN CAPITAL LETTER K WITH ACUTE
+1E32; C; 1E33; # LATIN CAPITAL LETTER K WITH DOT BELOW
+1E34; C; 1E35; # LATIN CAPITAL LETTER K WITH LINE BELOW
+1E36; C; 1E37; # LATIN CAPITAL LETTER L WITH DOT BELOW
+1E38; C; 1E39; # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E3A; C; 1E3B; # LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3C; C; 1E3D; # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3E; C; 1E3F; # LATIN CAPITAL LETTER M WITH ACUTE
+1E40; C; 1E41; # LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E42; C; 1E43; # LATIN CAPITAL LETTER M WITH DOT BELOW
+1E44; C; 1E45; # LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E46; C; 1E47; # LATIN CAPITAL LETTER N WITH DOT BELOW
+1E48; C; 1E49; # LATIN CAPITAL LETTER N WITH LINE BELOW
+1E4A; C; 1E4B; # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4C; C; 1E4D; # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4E; C; 1E4F; # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E50; C; 1E51; # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E52; C; 1E53; # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E54; C; 1E55; # LATIN CAPITAL LETTER P WITH ACUTE
+1E56; C; 1E57; # LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E58; C; 1E59; # LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E5A; C; 1E5B; # LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5C; C; 1E5D; # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5E; C; 1E5F; # LATIN CAPITAL LETTER R WITH LINE BELOW
+1E60; C; 1E61; # LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E62; C; 1E63; # LATIN CAPITAL LETTER S WITH DOT BELOW
+1E64; C; 1E65; # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E66; C; 1E67; # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E68; C; 1E69; # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A; C; 1E6B; # LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6C; C; 1E6D; # LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6E; C; 1E6F; # LATIN CAPITAL LETTER T WITH LINE BELOW
+1E70; C; 1E71; # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E72; C; 1E73; # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E74; C; 1E75; # LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E76; C; 1E77; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E78; C; 1E79; # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E7A; C; 1E7B; # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7C; C; 1E7D; # LATIN CAPITAL LETTER V WITH TILDE
+1E7E; C; 1E7F; # LATIN CAPITAL LETTER V WITH DOT BELOW
+1E80; C; 1E81; # LATIN CAPITAL LETTER W WITH GRAVE
+1E82; C; 1E83; # LATIN CAPITAL LETTER W WITH ACUTE
+1E84; C; 1E85; # LATIN CAPITAL LETTER W WITH DIAERESIS
+1E86; C; 1E87; # LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E88; C; 1E89; # LATIN CAPITAL LETTER W WITH DOT BELOW
+1E8A; C; 1E8B; # LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8C; C; 1E8D; # LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8E; C; 1E8F; # LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E90; C; 1E91; # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E92; C; 1E93; # LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E94; C; 1E95; # LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E96; F; 0068 0331; # LATIN SMALL LETTER H WITH LINE BELOW
+1E97; F; 0074 0308; # LATIN SMALL LETTER T WITH DIAERESIS
+1E98; F; 0077 030A; # LATIN SMALL LETTER W WITH RING ABOVE
+1E99; F; 0079 030A; # LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A; F; 0061 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B; C; 1E61; # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0; C; 1EA1; # LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA2; C; 1EA3; # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA4; C; 1EA5; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6; C; 1EA7; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8; C; 1EA9; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA; C; 1EAB; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC; C; 1EAD; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE; C; 1EAF; # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EB0; C; 1EB1; # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB2; C; 1EB3; # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4; C; 1EB5; # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB6; C; 1EB7; # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB8; C; 1EB9; # LATIN CAPITAL LETTER E WITH DOT BELOW
+1EBA; C; 1EBB; # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBC; C; 1EBD; # LATIN CAPITAL LETTER E WITH TILDE
+1EBE; C; 1EBF; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0; C; 1EC1; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2; C; 1EC3; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4; C; 1EC5; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6; C; 1EC7; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8; C; 1EC9; # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1ECA; C; 1ECB; # LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECC; C; 1ECD; # LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECE; C; 1ECF; # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ED0; C; 1ED1; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2; C; 1ED3; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4; C; 1ED5; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6; C; 1ED7; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8; C; 1ED9; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA; C; 1EDB; # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDC; C; 1EDD; # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDE; C; 1EDF; # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EE0; C; 1EE1; # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE2; C; 1EE3; # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE4; C; 1EE5; # LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE6; C; 1EE7; # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE8; C; 1EE9; # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EEA; C; 1EEB; # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEC; C; 1EED; # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EEE; C; 1EEF; # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EF0; C; 1EF1; # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF2; C; 1EF3; # LATIN CAPITAL LETTER Y WITH GRAVE
+1EF4; C; 1EF5; # LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF6; C; 1EF7; # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF8; C; 1EF9; # LATIN CAPITAL LETTER Y WITH TILDE
+1F08; C; 1F00; # GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09; C; 1F01; # GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A; C; 1F02; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B; C; 1F03; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C; C; 1F04; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D; C; 1F05; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E; C; 1F06; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F; C; 1F07; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F18; C; 1F10; # GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19; C; 1F11; # GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A; C; 1F12; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B; C; 1F13; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C; C; 1F14; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D; C; 1F15; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F28; C; 1F20; # GREEK CAPITAL LETTER ETA WITH PSILI
+1F29; C; 1F21; # GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A; C; 1F22; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B; C; 1F23; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C; C; 1F24; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D; C; 1F25; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E; C; 1F26; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F; C; 1F27; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F38; C; 1F30; # GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39; C; 1F31; # GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A; C; 1F32; # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B; C; 1F33; # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C; C; 1F34; # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D; C; 1F35; # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E; C; 1F36; # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F; C; 1F37; # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F48; C; 1F40; # GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49; C; 1F41; # GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A; C; 1F42; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B; C; 1F43; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C; C; 1F44; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D; C; 1F45; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50; F; 03C5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI
+1F52; F; 03C5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F54; F; 03C5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F56; F; 03C5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F59; C; 1F51; # GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B; C; 1F53; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D; C; 1F55; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F; C; 1F57; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F68; C; 1F60; # GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69; C; 1F61; # GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A; C; 1F62; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B; C; 1F63; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C; C; 1F64; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D; C; 1F65; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E; C; 1F66; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F; C; 1F67; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F80; F; 1F00 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81; F; 1F01 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82; F; 1F02 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83; F; 1F03 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84; F; 1F04 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85; F; 1F05 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86; F; 1F06 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87; F; 1F07 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88; F; 1F00 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F88; S; 1F80; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89; F; 1F01 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F89; S; 1F81; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A; F; 1F02 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8A; S; 1F82; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B; F; 1F03 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8B; S; 1F83; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C; F; 1F04 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8C; S; 1F84; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D; F; 1F05 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8D; S; 1F85; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E; F; 1F06 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8E; S; 1F86; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F; F; 1F07 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F; S; 1F87; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90; F; 1F20 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91; F; 1F21 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92; F; 1F22 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93; F; 1F23 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94; F; 1F24 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95; F; 1F25 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96; F; 1F26 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97; F; 1F27 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98; F; 1F20 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F98; S; 1F90; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99; F; 1F21 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F99; S; 1F91; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A; F; 1F22 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9A; S; 1F92; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B; F; 1F23 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9B; S; 1F93; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C; F; 1F24 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9C; S; 1F94; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D; F; 1F25 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9D; S; 1F95; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E; F; 1F26 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9E; S; 1F96; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F; F; 1F27 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F; S; 1F97; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0; F; 1F60 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1; F; 1F61 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2; F; 1F62 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3; F; 1F63 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4; F; 1F64 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5; F; 1F65 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6; F; 1F66 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7; F; 1F67 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8; F; 1F60 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA8; S; 1FA0; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9; F; 1F61 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FA9; S; 1FA1; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA; F; 1F62 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAA; S; 1FA2; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB; F; 1F63 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAB; S; 1FA3; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC; F; 1F64 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAC; S; 1FA4; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD; F; 1F65 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAD; S; 1FA5; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE; F; 1F66 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAE; S; 1FA6; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF; F; 1F67 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF; S; 1FA7; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB2; F; 1F70 03B9; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3; F; 03B1 03B9; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4; F; 03AC 03B9; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6; F; 03B1 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7; F; 03B1 0342 03B9; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8; C; 1FB0; # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9; C; 1FB1; # GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA; C; 1F70; # GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB; C; 1F71; # GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC; F; 03B1 03B9; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBC; S; 1FB3; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE; C; 03B9; # GREEK PROSGEGRAMMENI
+1FC2; F; 1F74 03B9; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3; F; 03B7 03B9; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4; F; 03AE 03B9; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6; F; 03B7 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7; F; 03B7 0342 03B9; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8; C; 1F72; # GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9; C; 1F73; # GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA; C; 1F74; # GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB; C; 1F75; # GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC; F; 03B7 03B9; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCC; S; 1FC3; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD2; F; 03B9 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6; F; 03B9 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7; F; 03B9 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8; C; 1FD0; # GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9; C; 1FD1; # GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA; C; 1F76; # GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB; C; 1F77; # GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE2; F; 03C5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4; F; 03C1 0313; # GREEK SMALL LETTER RHO WITH PSILI
+1FE6; F; 03C5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7; F; 03C5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8; C; 1FE0; # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9; C; 1FE1; # GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA; C; 1F7A; # GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB; C; 1F7B; # GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC; C; 1FE5; # GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2; F; 1F7C 03B9; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3; F; 03C9 03B9; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4; F; 03CE 03B9; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6; F; 03C9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7; F; 03C9 0342 03B9; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8; C; 1F78; # GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9; C; 1F79; # GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA; C; 1F7C; # GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB; C; 1F7D; # GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC; F; 03C9 03B9; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFC; S; 1FF3; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2126; C; 03C9; # OHM SIGN
+212A; C; 006B; # KELVIN SIGN
+212B; C; 00E5; # ANGSTROM SIGN
+2160; C; 2170; # ROMAN NUMERAL ONE
+2161; C; 2171; # ROMAN NUMERAL TWO
+2162; C; 2172; # ROMAN NUMERAL THREE
+2163; C; 2173; # ROMAN NUMERAL FOUR
+2164; C; 2174; # ROMAN NUMERAL FIVE
+2165; C; 2175; # ROMAN NUMERAL SIX
+2166; C; 2176; # ROMAN NUMERAL SEVEN
+2167; C; 2177; # ROMAN NUMERAL EIGHT
+2168; C; 2178; # ROMAN NUMERAL NINE
+2169; C; 2179; # ROMAN NUMERAL TEN
+216A; C; 217A; # ROMAN NUMERAL ELEVEN
+216B; C; 217B; # ROMAN NUMERAL TWELVE
+216C; C; 217C; # ROMAN NUMERAL FIFTY
+216D; C; 217D; # ROMAN NUMERAL ONE HUNDRED
+216E; C; 217E; # ROMAN NUMERAL FIVE HUNDRED
+216F; C; 217F; # ROMAN NUMERAL ONE THOUSAND
+24B6; C; 24D0; # CIRCLED LATIN CAPITAL LETTER A
+24B7; C; 24D1; # CIRCLED LATIN CAPITAL LETTER B
+24B8; C; 24D2; # CIRCLED LATIN CAPITAL LETTER C
+24B9; C; 24D3; # CIRCLED LATIN CAPITAL LETTER D
+24BA; C; 24D4; # CIRCLED LATIN CAPITAL LETTER E
+24BB; C; 24D5; # CIRCLED LATIN CAPITAL LETTER F
+24BC; C; 24D6; # CIRCLED LATIN CAPITAL LETTER G
+24BD; C; 24D7; # CIRCLED LATIN CAPITAL LETTER H
+24BE; C; 24D8; # CIRCLED LATIN CAPITAL LETTER I
+24BF; C; 24D9; # CIRCLED LATIN CAPITAL LETTER J
+24C0; C; 24DA; # CIRCLED LATIN CAPITAL LETTER K
+24C1; C; 24DB; # CIRCLED LATIN CAPITAL LETTER L
+24C2; C; 24DC; # CIRCLED LATIN CAPITAL LETTER M
+24C3; C; 24DD; # CIRCLED LATIN CAPITAL LETTER N
+24C4; C; 24DE; # CIRCLED LATIN CAPITAL LETTER O
+24C5; C; 24DF; # CIRCLED LATIN CAPITAL LETTER P
+24C6; C; 24E0; # CIRCLED LATIN CAPITAL LETTER Q
+24C7; C; 24E1; # CIRCLED LATIN CAPITAL LETTER R
+24C8; C; 24E2; # CIRCLED LATIN CAPITAL LETTER S
+24C9; C; 24E3; # CIRCLED LATIN CAPITAL LETTER T
+24CA; C; 24E4; # CIRCLED LATIN CAPITAL LETTER U
+24CB; C; 24E5; # CIRCLED LATIN CAPITAL LETTER V
+24CC; C; 24E6; # CIRCLED LATIN CAPITAL LETTER W
+24CD; C; 24E7; # CIRCLED LATIN CAPITAL LETTER X
+24CE; C; 24E8; # CIRCLED LATIN CAPITAL LETTER Y
+24CF; C; 24E9; # CIRCLED LATIN CAPITAL LETTER Z
+2C00; C; 2C30; # GLAGOLITIC CAPITAL LETTER AZU
+2C01; C; 2C31; # GLAGOLITIC CAPITAL LETTER BUKY
+2C02; C; 2C32; # GLAGOLITIC CAPITAL LETTER VEDE
+2C03; C; 2C33; # GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C04; C; 2C34; # GLAGOLITIC CAPITAL LETTER DOBRO
+2C05; C; 2C35; # GLAGOLITIC CAPITAL LETTER YESTU
+2C06; C; 2C36; # GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C07; C; 2C37; # GLAGOLITIC CAPITAL LETTER DZELO
+2C08; C; 2C38; # GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C09; C; 2C39; # GLAGOLITIC CAPITAL LETTER IZHE
+2C0A; C; 2C3A; # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C0B; C; 2C3B; # GLAGOLITIC CAPITAL LETTER I
+2C0C; C; 2C3C; # GLAGOLITIC CAPITAL LETTER DJERVI
+2C0D; C; 2C3D; # GLAGOLITIC CAPITAL LETTER KAKO
+2C0E; C; 2C3E; # GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C0F; C; 2C3F; # GLAGOLITIC CAPITAL LETTER MYSLITE
+2C10; C; 2C40; # GLAGOLITIC CAPITAL LETTER NASHI
+2C11; C; 2C41; # GLAGOLITIC CAPITAL LETTER ONU
+2C12; C; 2C42; # GLAGOLITIC CAPITAL LETTER POKOJI
+2C13; C; 2C43; # GLAGOLITIC CAPITAL LETTER RITSI
+2C14; C; 2C44; # GLAGOLITIC CAPITAL LETTER SLOVO
+2C15; C; 2C45; # GLAGOLITIC CAPITAL LETTER TVRIDO
+2C16; C; 2C46; # GLAGOLITIC CAPITAL LETTER UKU
+2C17; C; 2C47; # GLAGOLITIC CAPITAL LETTER FRITU
+2C18; C; 2C48; # GLAGOLITIC CAPITAL LETTER HERU
+2C19; C; 2C49; # GLAGOLITIC CAPITAL LETTER OTU
+2C1A; C; 2C4A; # GLAGOLITIC CAPITAL LETTER PE
+2C1B; C; 2C4B; # GLAGOLITIC CAPITAL LETTER SHTA
+2C1C; C; 2C4C; # GLAGOLITIC CAPITAL LETTER TSI
+2C1D; C; 2C4D; # GLAGOLITIC CAPITAL LETTER CHRIVI
+2C1E; C; 2C4E; # GLAGOLITIC CAPITAL LETTER SHA
+2C1F; C; 2C4F; # GLAGOLITIC CAPITAL LETTER YERU
+2C20; C; 2C50; # GLAGOLITIC CAPITAL LETTER YERI
+2C21; C; 2C51; # GLAGOLITIC CAPITAL LETTER YATI
+2C22; C; 2C52; # GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C23; C; 2C53; # GLAGOLITIC CAPITAL LETTER YU
+2C24; C; 2C54; # GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C25; C; 2C55; # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C26; C; 2C56; # GLAGOLITIC CAPITAL LETTER YO
+2C27; C; 2C57; # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C28; C; 2C58; # GLAGOLITIC CAPITAL LETTER BIG YUS
+2C29; C; 2C59; # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C2A; C; 2C5A; # GLAGOLITIC CAPITAL LETTER FITA
+2C2B; C; 2C5B; # GLAGOLITIC CAPITAL LETTER IZHITSA
+2C2C; C; 2C5C; # GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C2D; C; 2C5D; # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C2E; C; 2C5E; # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C80; C; 2C81; # COPTIC CAPITAL LETTER ALFA
+2C82; C; 2C83; # COPTIC CAPITAL LETTER VIDA
+2C84; C; 2C85; # COPTIC CAPITAL LETTER GAMMA
+2C86; C; 2C87; # COPTIC CAPITAL LETTER DALDA
+2C88; C; 2C89; # COPTIC CAPITAL LETTER EIE
+2C8A; C; 2C8B; # COPTIC CAPITAL LETTER SOU
+2C8C; C; 2C8D; # COPTIC CAPITAL LETTER ZATA
+2C8E; C; 2C8F; # COPTIC CAPITAL LETTER HATE
+2C90; C; 2C91; # COPTIC CAPITAL LETTER THETHE
+2C92; C; 2C93; # COPTIC CAPITAL LETTER IAUDA
+2C94; C; 2C95; # COPTIC CAPITAL LETTER KAPA
+2C96; C; 2C97; # COPTIC CAPITAL LETTER LAULA
+2C98; C; 2C99; # COPTIC CAPITAL LETTER MI
+2C9A; C; 2C9B; # COPTIC CAPITAL LETTER NI
+2C9C; C; 2C9D; # COPTIC CAPITAL LETTER KSI
+2C9E; C; 2C9F; # COPTIC CAPITAL LETTER O
+2CA0; C; 2CA1; # COPTIC CAPITAL LETTER PI
+2CA2; C; 2CA3; # COPTIC CAPITAL LETTER RO
+2CA4; C; 2CA5; # COPTIC CAPITAL LETTER SIMA
+2CA6; C; 2CA7; # COPTIC CAPITAL LETTER TAU
+2CA8; C; 2CA9; # COPTIC CAPITAL LETTER UA
+2CAA; C; 2CAB; # COPTIC CAPITAL LETTER FI
+2CAC; C; 2CAD; # COPTIC CAPITAL LETTER KHI
+2CAE; C; 2CAF; # COPTIC CAPITAL LETTER PSI
+2CB0; C; 2CB1; # COPTIC CAPITAL LETTER OOU
+2CB2; C; 2CB3; # COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB4; C; 2CB5; # COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB6; C; 2CB7; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB8; C; 2CB9; # COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CBA; C; 2CBB; # COPTIC CAPITAL LETTER DIALECT-P NI
+2CBC; C; 2CBD; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBE; C; 2CBF; # COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CC0; C; 2CC1; # COPTIC CAPITAL LETTER SAMPI
+2CC2; C; 2CC3; # COPTIC CAPITAL LETTER CROSSED SHEI
+2CC4; C; 2CC5; # COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC6; C; 2CC7; # COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC8; C; 2CC9; # COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CCA; C; 2CCB; # COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCC; C; 2CCD; # COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCE; C; 2CCF; # COPTIC CAPITAL LETTER OLD COPTIC HA
+2CD0; C; 2CD1; # COPTIC CAPITAL LETTER L-SHAPED HA
+2CD2; C; 2CD3; # COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD4; C; 2CD5; # COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD6; C; 2CD7; # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD8; C; 2CD9; # COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CDA; C; 2CDB; # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDC; C; 2CDD; # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDE; C; 2CDF; # COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CE0; C; 2CE1; # COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE2; C; 2CE3; # COPTIC CAPITAL LETTER OLD NUBIAN WAU
+FB00; F; 0066 0066; # LATIN SMALL LIGATURE FF
+FB01; F; 0066 0069; # LATIN SMALL LIGATURE FI
+FB02; F; 0066 006C; # LATIN SMALL LIGATURE FL
+FB03; F; 0066 0066 0069; # LATIN SMALL LIGATURE FFI
+FB04; F; 0066 0066 006C; # LATIN SMALL LIGATURE FFL
+FB05; F; 0073 0074; # LATIN SMALL LIGATURE LONG S T
+FB06; F; 0073 0074; # LATIN SMALL LIGATURE ST
+FB13; F; 0574 0576; # ARMENIAN SMALL LIGATURE MEN NOW
+FB14; F; 0574 0565; # ARMENIAN SMALL LIGATURE MEN ECH
+FB15; F; 0574 056B; # ARMENIAN SMALL LIGATURE MEN INI
+FB16; F; 057E 0576; # ARMENIAN SMALL LIGATURE VEW NOW
+FB17; F; 0574 056D; # ARMENIAN SMALL LIGATURE MEN XEH
+FF21; C; FF41; # FULLWIDTH LATIN CAPITAL LETTER A
+FF22; C; FF42; # FULLWIDTH LATIN CAPITAL LETTER B
+FF23; C; FF43; # FULLWIDTH LATIN CAPITAL LETTER C
+FF24; C; FF44; # FULLWIDTH LATIN CAPITAL LETTER D
+FF25; C; FF45; # FULLWIDTH LATIN CAPITAL LETTER E
+FF26; C; FF46; # FULLWIDTH LATIN CAPITAL LETTER F
+FF27; C; FF47; # FULLWIDTH LATIN CAPITAL LETTER G
+FF28; C; FF48; # FULLWIDTH LATIN CAPITAL LETTER H
+FF29; C; FF49; # FULLWIDTH LATIN CAPITAL LETTER I
+FF2A; C; FF4A; # FULLWIDTH LATIN CAPITAL LETTER J
+FF2B; C; FF4B; # FULLWIDTH LATIN CAPITAL LETTER K
+FF2C; C; FF4C; # FULLWIDTH LATIN CAPITAL LETTER L
+FF2D; C; FF4D; # FULLWIDTH LATIN CAPITAL LETTER M
+FF2E; C; FF4E; # FULLWIDTH LATIN CAPITAL LETTER N
+FF2F; C; FF4F; # FULLWIDTH LATIN CAPITAL LETTER O
+FF30; C; FF50; # FULLWIDTH LATIN CAPITAL LETTER P
+FF31; C; FF51; # FULLWIDTH LATIN CAPITAL LETTER Q
+FF32; C; FF52; # FULLWIDTH LATIN CAPITAL LETTER R
+FF33; C; FF53; # FULLWIDTH LATIN CAPITAL LETTER S
+FF34; C; FF54; # FULLWIDTH LATIN CAPITAL LETTER T
+FF35; C; FF55; # FULLWIDTH LATIN CAPITAL LETTER U
+FF36; C; FF56; # FULLWIDTH LATIN CAPITAL LETTER V
+FF37; C; FF57; # FULLWIDTH LATIN CAPITAL LETTER W
+FF38; C; FF58; # FULLWIDTH LATIN CAPITAL LETTER X
+FF39; C; FF59; # FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z
+10400; C; 10428; # DESERET CAPITAL LETTER LONG I
+10401; C; 10429; # DESERET CAPITAL LETTER LONG E
+10402; C; 1042A; # DESERET CAPITAL LETTER LONG A
+10403; C; 1042B; # DESERET CAPITAL LETTER LONG AH
+10404; C; 1042C; # DESERET CAPITAL LETTER LONG O
+10405; C; 1042D; # DESERET CAPITAL LETTER LONG OO
+10406; C; 1042E; # DESERET CAPITAL LETTER SHORT I
+10407; C; 1042F; # DESERET CAPITAL LETTER SHORT E
+10408; C; 10430; # DESERET CAPITAL LETTER SHORT A
+10409; C; 10431; # DESERET CAPITAL LETTER SHORT AH
+1040A; C; 10432; # DESERET CAPITAL LETTER SHORT O
+1040B; C; 10433; # DESERET CAPITAL LETTER SHORT OO
+1040C; C; 10434; # DESERET CAPITAL LETTER AY
+1040D; C; 10435; # DESERET CAPITAL LETTER OW
+1040E; C; 10436; # DESERET CAPITAL LETTER WU
+1040F; C; 10437; # DESERET CAPITAL LETTER YEE
+10410; C; 10438; # DESERET CAPITAL LETTER H
+10411; C; 10439; # DESERET CAPITAL LETTER PEE
+10412; C; 1043A; # DESERET CAPITAL LETTER BEE
+10413; C; 1043B; # DESERET CAPITAL LETTER TEE
+10414; C; 1043C; # DESERET CAPITAL LETTER DEE
+10415; C; 1043D; # DESERET CAPITAL LETTER CHEE
+10416; C; 1043E; # DESERET CAPITAL LETTER JEE
+10417; C; 1043F; # DESERET CAPITAL LETTER KAY
+10418; C; 10440; # DESERET CAPITAL LETTER GAY
+10419; C; 10441; # DESERET CAPITAL LETTER EF
+1041A; C; 10442; # DESERET CAPITAL LETTER VEE
+1041B; C; 10443; # DESERET CAPITAL LETTER ETH
+1041C; C; 10444; # DESERET CAPITAL LETTER THEE
+1041D; C; 10445; # DESERET CAPITAL LETTER ES
+1041E; C; 10446; # DESERET CAPITAL LETTER ZEE
+1041F; C; 10447; # DESERET CAPITAL LETTER ESH
+10420; C; 10448; # DESERET CAPITAL LETTER ZHEE
+10421; C; 10449; # DESERET CAPITAL LETTER ER
+10422; C; 1044A; # DESERET CAPITAL LETTER EL
+10423; C; 1044B; # DESERET CAPITAL LETTER EM
+10424; C; 1044C; # DESERET CAPITAL LETTER EN
+10425; C; 1044D; # DESERET CAPITAL LETTER ENG
+10426; C; 1044E; # DESERET CAPITAL LETTER OI
+10427; C; 1044F; # DESERET CAPITAL LETTER EW
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/CombiningClass.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/CombiningClass.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/CombiningClass.pl	(revision 14489)
@@ -0,0 +1,203 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+return <<'END';
+0300	0314	230
+0315		232
+0316	0319	220
+031A		232
+031B		216
+031C	0320	220
+0321	0322	202
+0323	0326	220
+0327	0328	202
+0329	0333	220
+0334	0338	1
+0339	033C	220
+033D	0344	230
+0345		240
+0346		230
+0347	0349	220
+034A	034C	230
+034D	034E	220
+0350	0352	230
+0353	0356	220
+0357		230
+0358		232
+0359	035A	220
+035B		230
+035C		233
+035D	035E	234
+035F		233
+0360	0361	234
+0362		233
+0363	036F	230
+0483	0486	230
+0591		220
+0592	0595	230
+0596		220
+0597	0599	230
+059A		222
+059B		220
+059C	05A1	230
+05A2	05A7	220
+05A8	05A9	230
+05AA		220
+05AB	05AC	230
+05AD		222
+05AE		228
+05AF		230
+05B0		10
+05B1		11
+05B2		12
+05B3		13
+05B4		14
+05B5		15
+05B6		16
+05B7		17
+05B8		18
+05B9		19
+05BB		20
+05BC		21
+05BD		22
+05BF		23
+05C1		24
+05C2		25
+05C4		230
+05C5		220
+05C7		18
+0610	0615	230
+064B		27
+064C		28
+064D		29
+064E		30
+064F		31
+0650		32
+0651		33
+0652		34
+0653	0654	230
+0655	0656	220
+0657	065B	230
+065C		220
+065D	065E	230
+0670		35
+06D6	06DC	230
+06DF	06E2	230
+06E3		220
+06E4		230
+06E7	06E8	230
+06EA		220
+06EB	06EC	230
+06ED		220
+0711		36
+0730		230
+0731		220
+0732	0733	230
+0734		220
+0735	0736	230
+0737	0739	220
+073A		230
+073B	073C	220
+073D		230
+073E		220
+073F	0741	230
+0742		220
+0743		230
+0744		220
+0745		230
+0746		220
+0747		230
+0748		220
+0749	074A	230
+093C		7
+094D		9
+0951		230
+0952		220
+0953	0954	230
+09BC		7
+09CD		9
+0A3C		7
+0A4D		9
+0ABC		7
+0ACD		9
+0B3C		7
+0B4D		9
+0BCD		9
+0C4D		9
+0C55		84
+0C56		91
+0CBC		7
+0CCD		9
+0D4D		9
+0DCA		9
+0E38	0E39	103
+0E3A		9
+0E48	0E4B	107
+0EB8	0EB9	118
+0EC8	0ECB	122
+0F18	0F19	220
+0F35		220
+0F37		220
+0F39		216
+0F71		129
+0F72		130
+0F74		132
+0F7A	0F7D	130
+0F80		130
+0F82	0F83	230
+0F84		9
+0F86	0F87	230
+0FC6		220
+1037		7
+1039		9
+135F		230
+1714		9
+1734		9
+17D2		9
+17DD		230
+18A9		228
+1939		222
+193A		230
+193B		220
+1A17		230
+1A18		220
+1DC0	1DC1	230
+1DC2		220
+1DC3		230
+20D0	20D1	230
+20D2	20D3	1
+20D4	20D7	230
+20D8	20DA	1
+20DB	20DC	230
+20E1		230
+20E5	20E6	1
+20E7		230
+20E8		220
+20E9		230
+20EA	20EB	1
+302A		218
+302B		228
+302C		232
+302D		222
+302E	302F	224
+3099	309A	8
+A806		9
+FB1E		26
+FE20	FE23	230
+10A0D		220
+10A0F		230
+10A38		230
+10A39		1
+10A3A		220
+10A3F		9
+1D165	1D166	216
+1D167	1D169	1
+1D16D		226
+1D16E	1D172	216
+1D17B	1D182	220
+1D185	1D189	230
+1D18A	1D18B	220
+1D1AA	1D1AD	230
+1D242	1D244	230
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/CompositionExclusions.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/CompositionExclusions.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/CompositionExclusions.txt	(revision 14489)
@@ -0,0 +1,179 @@
+# CompositionExclusions-4.1.0.txt
+# Date: 2005-03-17, 15:21:00 PST [KW]
+#
+# This file lists the characters from the UAX #15 Composition Exclusion Table.
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# For more information, see
+# http://www.unicode.org/unicode/reports/tr15/#Primary Exclusion List Table
+# ================================================
+
+# (1) Script Specifics
+# This list of characters cannot be derived from the UnicodeData file.
+# ================================================
+
+0958    #  DEVANAGARI LETTER QA
+0959    #  DEVANAGARI LETTER KHHA
+095A    #  DEVANAGARI LETTER GHHA
+095B    #  DEVANAGARI LETTER ZA
+095C    #  DEVANAGARI LETTER DDDHA
+095D    #  DEVANAGARI LETTER RHA
+095E    #  DEVANAGARI LETTER FA
+095F    #  DEVANAGARI LETTER YYA
+09DC    #  BENGALI LETTER RRA
+09DD    #  BENGALI LETTER RHA
+09DF    #  BENGALI LETTER YYA
+0A33    #  GURMUKHI LETTER LLA
+0A36    #  GURMUKHI LETTER SHA
+0A59    #  GURMUKHI LETTER KHHA
+0A5A    #  GURMUKHI LETTER GHHA
+0A5B    #  GURMUKHI LETTER ZA
+0A5E    #  GURMUKHI LETTER FA
+0B5C    #  ORIYA LETTER RRA
+0B5D    #  ORIYA LETTER RHA
+0F43    #  TIBETAN LETTER GHA
+0F4D    #  TIBETAN LETTER DDHA
+0F52    #  TIBETAN LETTER DHA
+0F57    #  TIBETAN LETTER BHA
+0F5C    #  TIBETAN LETTER DZHA
+0F69    #  TIBETAN LETTER KSSA
+0F76    #  TIBETAN VOWEL SIGN VOCALIC R
+0F78    #  TIBETAN VOWEL SIGN VOCALIC L
+0F93    #  TIBETAN SUBJOINED LETTER GHA
+0F9D    #  TIBETAN SUBJOINED LETTER DDHA
+0FA2    #  TIBETAN SUBJOINED LETTER DHA
+0FA7    #  TIBETAN SUBJOINED LETTER BHA
+0FAC    #  TIBETAN SUBJOINED LETTER DZHA
+0FB9    #  TIBETAN SUBJOINED LETTER KSSA
+FB1D    #  HEBREW LETTER YOD WITH HIRIQ
+FB1F    #  HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB2A    #  HEBREW LETTER SHIN WITH SHIN DOT
+FB2B    #  HEBREW LETTER SHIN WITH SIN DOT
+FB2C    #  HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D    #  HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E    #  HEBREW LETTER ALEF WITH PATAH
+FB2F    #  HEBREW LETTER ALEF WITH QAMATS
+FB30    #  HEBREW LETTER ALEF WITH MAPIQ
+FB31    #  HEBREW LETTER BET WITH DAGESH
+FB32    #  HEBREW LETTER GIMEL WITH DAGESH
+FB33    #  HEBREW LETTER DALET WITH DAGESH
+FB34    #  HEBREW LETTER HE WITH MAPIQ
+FB35    #  HEBREW LETTER VAV WITH DAGESH
+FB36    #  HEBREW LETTER ZAYIN WITH DAGESH
+FB38    #  HEBREW LETTER TET WITH DAGESH
+FB39    #  HEBREW LETTER YOD WITH DAGESH
+FB3A    #  HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B    #  HEBREW LETTER KAF WITH DAGESH
+FB3C    #  HEBREW LETTER LAMED WITH DAGESH
+FB3E    #  HEBREW LETTER MEM WITH DAGESH
+FB40    #  HEBREW LETTER NUN WITH DAGESH
+FB41    #  HEBREW LETTER SAMEKH WITH DAGESH
+FB43    #  HEBREW LETTER FINAL PE WITH DAGESH
+FB44    #  HEBREW LETTER PE WITH DAGESH
+FB46    #  HEBREW LETTER TSADI WITH DAGESH
+FB47    #  HEBREW LETTER QOF WITH DAGESH
+FB48    #  HEBREW LETTER RESH WITH DAGESH
+FB49    #  HEBREW LETTER SHIN WITH DAGESH
+FB4A    #  HEBREW LETTER TAV WITH DAGESH
+FB4B    #  HEBREW LETTER VAV WITH HOLAM
+FB4C    #  HEBREW LETTER BET WITH RAFE
+FB4D    #  HEBREW LETTER KAF WITH RAFE
+FB4E    #  HEBREW LETTER PE WITH RAFE
+
+# Total code points: 67
+
+# ================================================
+# (2) Post Composition Version precomposed characters
+# These characters cannot be derived solely from the UnicodeData.txt file
+# in this version of Unicode.
+# ================================================
+
+2ADC    #  FORKING
+1D15E   #  MUSICAL SYMBOL HALF NOTE
+1D15F   #  MUSICAL SYMBOL QUARTER NOTE
+1D160   #  MUSICAL SYMBOL EIGHTH NOTE
+1D161   #  MUSICAL SYMBOL SIXTEENTH NOTE
+1D162   #  MUSICAL SYMBOL THIRTY-SECOND NOTE
+1D163   #  MUSICAL SYMBOL SIXTY-FOURTH NOTE
+1D164   #  MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D1BB   #  MUSICAL SYMBOL MINIMA
+1D1BC   #  MUSICAL SYMBOL MINIMA BLACK
+1D1BD   #  MUSICAL SYMBOL SEMIMINIMA WHITE
+1D1BE   #  MUSICAL SYMBOL SEMIMINIMA BLACK
+1D1BF   #  MUSICAL SYMBOL FUSA WHITE
+1D1C0   #  MUSICAL SYMBOL FUSA BLACK
+
+# Total code points: 14
+
+# ================================================
+# (3) Singleton Decompositions
+# These characters can be derived from the UnicodeData file
+# by including all characters whose canonical decomposition
+# consists of a single character.
+# These characters are simply quoted here for reference.
+# ================================================
+
+# 0340..0341       [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK
+# 0343                 COMBINING GREEK KORONIS
+# 0374                 GREEK NUMERAL SIGN
+# 037E                 GREEK QUESTION MARK
+# 0387                 GREEK ANO TELEIA
+# 1F71                 GREEK SMALL LETTER ALPHA WITH OXIA
+# 1F73                 GREEK SMALL LETTER EPSILON WITH OXIA
+# 1F75                 GREEK SMALL LETTER ETA WITH OXIA
+# 1F77                 GREEK SMALL LETTER IOTA WITH OXIA
+# 1F79                 GREEK SMALL LETTER OMICRON WITH OXIA
+# 1F7B                 GREEK SMALL LETTER UPSILON WITH OXIA
+# 1F7D                 GREEK SMALL LETTER OMEGA WITH OXIA
+# 1FBB                 GREEK CAPITAL LETTER ALPHA WITH OXIA
+# 1FBE                 GREEK PROSGEGRAMMENI
+# 1FC9                 GREEK CAPITAL LETTER EPSILON WITH OXIA
+# 1FCB                 GREEK CAPITAL LETTER ETA WITH OXIA
+# 1FD3                 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+# 1FDB                 GREEK CAPITAL LETTER IOTA WITH OXIA
+# 1FE3                 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+# 1FEB                 GREEK CAPITAL LETTER UPSILON WITH OXIA
+# 1FEE..1FEF       [2] GREEK DIALYTIKA AND OXIA..GREEK VARIA
+# 1FF9                 GREEK CAPITAL LETTER OMICRON WITH OXIA
+# 1FFB                 GREEK CAPITAL LETTER OMEGA WITH OXIA
+# 1FFD                 GREEK OXIA
+# 2000..2001       [2] EN QUAD..EM QUAD
+# 2126                 OHM SIGN
+# 212A..212B       [2] KELVIN SIGN..ANGSTROM SIGN
+# 2329                 LEFT-POINTING ANGLE BRACKET
+# 232A                 RIGHT-POINTING ANGLE BRACKET
+# F900..FA0D     [270] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA0D
+# FA10                 CJK COMPATIBILITY IDEOGRAPH-FA10
+# FA12                 CJK COMPATIBILITY IDEOGRAPH-FA12
+# FA15..FA1E      [10] CJK COMPATIBILITY IDEOGRAPH-FA15..CJK COMPATIBILITY IDEOGRAPH-FA1E
+# FA20                 CJK COMPATIBILITY IDEOGRAPH-FA20
+# FA22                 CJK COMPATIBILITY IDEOGRAPH-FA22
+# FA25..FA26       [2] CJK COMPATIBILITY IDEOGRAPH-FA25..CJK COMPATIBILITY IDEOGRAPH-FA26
+# FA2A..FA2D       [4] CJK COMPATIBILITY IDEOGRAPH-FA2A..CJK COMPATIBILITY IDEOGRAPH-FA2D
+# FA30..FA6A      [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A
+# FA70..FAD9     [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+# 2F800..2FA1D   [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 924
+
+# ================================================
+# (4) Non-Starter Decompositions
+# These characters can be derived from the UnicodeData file
+# by including all characters whose canonical decomposition consists
+# of a sequence of characters, the first of which has a non-zero
+# combining class.
+# These characters are simply quoted here for reference.
+# ================================================
+
+# 0344                 COMBINING GREEK DIALYTIKA TONOS
+# 0F73                 TIBETAN VOWEL SIGN II
+# 0F75                 TIBETAN VOWEL SIGN UU
+# 0F81                 TIBETAN VOWEL SIGN REVERSED II
+
+# Total code points: 4
+
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/Decomposition.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/Decomposition.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/Decomposition.pl	(revision 14489)
@@ -0,0 +1,5366 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+return <<'END';
+00A0		<noBreak> 0020
+00A8		<compat> 0020 0308
+00AA		<super> 0061
+00AF		<compat> 0020 0304
+00B2		<super> 0032
+00B3		<super> 0033
+00B4		<compat> 0020 0301
+00B5		<compat> 03BC
+00B8		<compat> 0020 0327
+00B9		<super> 0031
+00BA		<super> 006F
+00BC		<fraction> 0031 2044 0034
+00BD		<fraction> 0031 2044 0032
+00BE		<fraction> 0033 2044 0034
+00C0		0041 0300
+00C1		0041 0301
+00C2		0041 0302
+00C3		0041 0303
+00C4		0041 0308
+00C5		0041 030A
+00C7		0043 0327
+00C8		0045 0300
+00C9		0045 0301
+00CA		0045 0302
+00CB		0045 0308
+00CC		0049 0300
+00CD		0049 0301
+00CE		0049 0302
+00CF		0049 0308
+00D1		004E 0303
+00D2		004F 0300
+00D3		004F 0301
+00D4		004F 0302
+00D5		004F 0303
+00D6		004F 0308
+00D9		0055 0300
+00DA		0055 0301
+00DB		0055 0302
+00DC		0055 0308
+00DD		0059 0301
+00E0		0061 0300
+00E1		0061 0301
+00E2		0061 0302
+00E3		0061 0303
+00E4		0061 0308
+00E5		0061 030A
+00E7		0063 0327
+00E8		0065 0300
+00E9		0065 0301
+00EA		0065 0302
+00EB		0065 0308
+00EC		0069 0300
+00ED		0069 0301
+00EE		0069 0302
+00EF		0069 0308
+00F1		006E 0303
+00F2		006F 0300
+00F3		006F 0301
+00F4		006F 0302
+00F5		006F 0303
+00F6		006F 0308
+00F9		0075 0300
+00FA		0075 0301
+00FB		0075 0302
+00FC		0075 0308
+00FD		0079 0301
+00FF		0079 0308
+0100		0041 0304
+0101		0061 0304
+0102		0041 0306
+0103		0061 0306
+0104		0041 0328
+0105		0061 0328
+0106		0043 0301
+0107		0063 0301
+0108		0043 0302
+0109		0063 0302
+010A		0043 0307
+010B		0063 0307
+010C		0043 030C
+010D		0063 030C
+010E		0044 030C
+010F		0064 030C
+0112		0045 0304
+0113		0065 0304
+0114		0045 0306
+0115		0065 0306
+0116		0045 0307
+0117		0065 0307
+0118		0045 0328
+0119		0065 0328
+011A		0045 030C
+011B		0065 030C
+011C		0047 0302
+011D		0067 0302
+011E		0047 0306
+011F		0067 0306
+0120		0047 0307
+0121		0067 0307
+0122		0047 0327
+0123		0067 0327
+0124		0048 0302
+0125		0068 0302
+0128		0049 0303
+0129		0069 0303
+012A		0049 0304
+012B		0069 0304
+012C		0049 0306
+012D		0069 0306
+012E		0049 0328
+012F		0069 0328
+0130		0049 0307
+0132		<compat> 0049 004A
+0133		<compat> 0069 006A
+0134		004A 0302
+0135		006A 0302
+0136		004B 0327
+0137		006B 0327
+0139		004C 0301
+013A		006C 0301
+013B		004C 0327
+013C		006C 0327
+013D		004C 030C
+013E		006C 030C
+013F		<compat> 004C 00B7
+0140		<compat> 006C 00B7
+0143		004E 0301
+0144		006E 0301
+0145		004E 0327
+0146		006E 0327
+0147		004E 030C
+0148		006E 030C
+0149		<compat> 02BC 006E
+014C		004F 0304
+014D		006F 0304
+014E		004F 0306
+014F		006F 0306
+0150		004F 030B
+0151		006F 030B
+0154		0052 0301
+0155		0072 0301
+0156		0052 0327
+0157		0072 0327
+0158		0052 030C
+0159		0072 030C
+015A		0053 0301
+015B		0073 0301
+015C		0053 0302
+015D		0073 0302
+015E		0053 0327
+015F		0073 0327
+0160		0053 030C
+0161		0073 030C
+0162		0054 0327
+0163		0074 0327
+0164		0054 030C
+0165		0074 030C
+0168		0055 0303
+0169		0075 0303
+016A		0055 0304
+016B		0075 0304
+016C		0055 0306
+016D		0075 0306
+016E		0055 030A
+016F		0075 030A
+0170		0055 030B
+0171		0075 030B
+0172		0055 0328
+0173		0075 0328
+0174		0057 0302
+0175		0077 0302
+0176		0059 0302
+0177		0079 0302
+0178		0059 0308
+0179		005A 0301
+017A		007A 0301
+017B		005A 0307
+017C		007A 0307
+017D		005A 030C
+017E		007A 030C
+017F		<compat> 0073
+01A0		004F 031B
+01A1		006F 031B
+01AF		0055 031B
+01B0		0075 031B
+01C4		<compat> 0044 017D
+01C5		<compat> 0044 017E
+01C6		<compat> 0064 017E
+01C7		<compat> 004C 004A
+01C8		<compat> 004C 006A
+01C9		<compat> 006C 006A
+01CA		<compat> 004E 004A
+01CB		<compat> 004E 006A
+01CC		<compat> 006E 006A
+01CD		0041 030C
+01CE		0061 030C
+01CF		0049 030C
+01D0		0069 030C
+01D1		004F 030C
+01D2		006F 030C
+01D3		0055 030C
+01D4		0075 030C
+01D5		00DC 0304
+01D6		00FC 0304
+01D7		00DC 0301
+01D8		00FC 0301
+01D9		00DC 030C
+01DA		00FC 030C
+01DB		00DC 0300
+01DC		00FC 0300
+01DE		00C4 0304
+01DF		00E4 0304
+01E0		0226 0304
+01E1		0227 0304
+01E2		00C6 0304
+01E3		00E6 0304
+01E6		0047 030C
+01E7		0067 030C
+01E8		004B 030C
+01E9		006B 030C
+01EA		004F 0328
+01EB		006F 0328
+01EC		01EA 0304
+01ED		01EB 0304
+01EE		01B7 030C
+01EF		0292 030C
+01F0		006A 030C
+01F1		<compat> 0044 005A
+01F2		<compat> 0044 007A
+01F3		<compat> 0064 007A
+01F4		0047 0301
+01F5		0067 0301
+01F8		004E 0300
+01F9		006E 0300
+01FA		00C5 0301
+01FB		00E5 0301
+01FC		00C6 0301
+01FD		00E6 0301
+01FE		00D8 0301
+01FF		00F8 0301
+0200		0041 030F
+0201		0061 030F
+0202		0041 0311
+0203		0061 0311
+0204		0045 030F
+0205		0065 030F
+0206		0045 0311
+0207		0065 0311
+0208		0049 030F
+0209		0069 030F
+020A		0049 0311
+020B		0069 0311
+020C		004F 030F
+020D		006F 030F
+020E		004F 0311
+020F		006F 0311
+0210		0052 030F
+0211		0072 030F
+0212		0052 0311
+0213		0072 0311
+0214		0055 030F
+0215		0075 030F
+0216		0055 0311
+0217		0075 0311
+0218		0053 0326
+0219		0073 0326
+021A		0054 0326
+021B		0074 0326
+021E		0048 030C
+021F		0068 030C
+0226		0041 0307
+0227		0061 0307
+0228		0045 0327
+0229		0065 0327
+022A		00D6 0304
+022B		00F6 0304
+022C		00D5 0304
+022D		00F5 0304
+022E		004F 0307
+022F		006F 0307
+0230		022E 0304
+0231		022F 0304
+0232		0059 0304
+0233		0079 0304
+02B0		<super> 0068
+02B1		<super> 0266
+02B2		<super> 006A
+02B3		<super> 0072
+02B4		<super> 0279
+02B5		<super> 027B
+02B6		<super> 0281
+02B7		<super> 0077
+02B8		<super> 0079
+02D8		<compat> 0020 0306
+02D9		<compat> 0020 0307
+02DA		<compat> 0020 030A
+02DB		<compat> 0020 0328
+02DC		<compat> 0020 0303
+02DD		<compat> 0020 030B
+02E0		<super> 0263
+02E1		<super> 006C
+02E2		<super> 0073
+02E3		<super> 0078
+02E4		<super> 0295
+0340		0300
+0341		0301
+0343		0313
+0344		0308 0301
+0374		02B9
+037A		<compat> 0020 0345
+037E		003B
+0384		<compat> 0020 0301
+0385		00A8 0301
+0386		0391 0301
+0387		00B7
+0388		0395 0301
+0389		0397 0301
+038A		0399 0301
+038C		039F 0301
+038E		03A5 0301
+038F		03A9 0301
+0390		03CA 0301
+03AA		0399 0308
+03AB		03A5 0308
+03AC		03B1 0301
+03AD		03B5 0301
+03AE		03B7 0301
+03AF		03B9 0301
+03B0		03CB 0301
+03CA		03B9 0308
+03CB		03C5 0308
+03CC		03BF 0301
+03CD		03C5 0301
+03CE		03C9 0301
+03D0		<compat> 03B2
+03D1		<compat> 03B8
+03D2		<compat> 03A5
+03D3		03D2 0301
+03D4		03D2 0308
+03D5		<compat> 03C6
+03D6		<compat> 03C0
+03F0		<compat> 03BA
+03F1		<compat> 03C1
+03F2		<compat> 03C2
+03F4		<compat> 0398
+03F5		<compat> 03B5
+03F9		<compat> 03A3
+0400		0415 0300
+0401		0415 0308
+0403		0413 0301
+0407		0406 0308
+040C		041A 0301
+040D		0418 0300
+040E		0423 0306
+0419		0418 0306
+0439		0438 0306
+0450		0435 0300
+0451		0435 0308
+0453		0433 0301
+0457		0456 0308
+045C		043A 0301
+045D		0438 0300
+045E		0443 0306
+0476		0474 030F
+0477		0475 030F
+04C1		0416 0306
+04C2		0436 0306
+04D0		0410 0306
+04D1		0430 0306
+04D2		0410 0308
+04D3		0430 0308
+04D6		0415 0306
+04D7		0435 0306
+04DA		04D8 0308
+04DB		04D9 0308
+04DC		0416 0308
+04DD		0436 0308
+04DE		0417 0308
+04DF		0437 0308
+04E2		0418 0304
+04E3		0438 0304
+04E4		0418 0308
+04E5		0438 0308
+04E6		041E 0308
+04E7		043E 0308
+04EA		04E8 0308
+04EB		04E9 0308
+04EC		042D 0308
+04ED		044D 0308
+04EE		0423 0304
+04EF		0443 0304
+04F0		0423 0308
+04F1		0443 0308
+04F2		0423 030B
+04F3		0443 030B
+04F4		0427 0308
+04F5		0447 0308
+04F8		042B 0308
+04F9		044B 0308
+0587		<compat> 0565 0582
+0622		0627 0653
+0623		0627 0654
+0624		0648 0654
+0625		0627 0655
+0626		064A 0654
+0675		<compat> 0627 0674
+0676		<compat> 0648 0674
+0677		<compat> 06C7 0674
+0678		<compat> 064A 0674
+06C0		06D5 0654
+06C2		06C1 0654
+06D3		06D2 0654
+0929		0928 093C
+0931		0930 093C
+0934		0933 093C
+0958		0915 093C
+0959		0916 093C
+095A		0917 093C
+095B		091C 093C
+095C		0921 093C
+095D		0922 093C
+095E		092B 093C
+095F		092F 093C
+09CB		09C7 09BE
+09CC		09C7 09D7
+09DC		09A1 09BC
+09DD		09A2 09BC
+09DF		09AF 09BC
+0A33		0A32 0A3C
+0A36		0A38 0A3C
+0A59		0A16 0A3C
+0A5A		0A17 0A3C
+0A5B		0A1C 0A3C
+0A5E		0A2B 0A3C
+0B48		0B47 0B56
+0B4B		0B47 0B3E
+0B4C		0B47 0B57
+0B5C		0B21 0B3C
+0B5D		0B22 0B3C
+0B94		0B92 0BD7
+0BCA		0BC6 0BBE
+0BCB		0BC7 0BBE
+0BCC		0BC6 0BD7
+0C48		0C46 0C56
+0CC0		0CBF 0CD5
+0CC7		0CC6 0CD5
+0CC8		0CC6 0CD6
+0CCA		0CC6 0CC2
+0CCB		0CCA 0CD5
+0D4A		0D46 0D3E
+0D4B		0D47 0D3E
+0D4C		0D46 0D57
+0DDA		0DD9 0DCA
+0DDC		0DD9 0DCF
+0DDD		0DDC 0DCA
+0DDE		0DD9 0DDF
+0E33		<compat> 0E4D 0E32
+0EB3		<compat> 0ECD 0EB2
+0EDC		<compat> 0EAB 0E99
+0EDD		<compat> 0EAB 0EA1
+0F0C		<noBreak> 0F0B
+0F43		0F42 0FB7
+0F4D		0F4C 0FB7
+0F52		0F51 0FB7
+0F57		0F56 0FB7
+0F5C		0F5B 0FB7
+0F69		0F40 0FB5
+0F73		0F71 0F72
+0F75		0F71 0F74
+0F76		0FB2 0F80
+0F77		<compat> 0FB2 0F81
+0F78		0FB3 0F80
+0F79		<compat> 0FB3 0F81
+0F81		0F71 0F80
+0F93		0F92 0FB7
+0F9D		0F9C 0FB7
+0FA2		0FA1 0FB7
+0FA7		0FA6 0FB7
+0FAC		0FAB 0FB7
+0FB9		0F90 0FB5
+1026		1025 102E
+10FC		<super> 10DC
+1D2C		<super> 0041
+1D2D		<super> 00C6
+1D2E		<super> 0042
+1D30		<super> 0044
+1D31		<super> 0045
+1D32		<super> 018E
+1D33		<super> 0047
+1D34		<super> 0048
+1D35		<super> 0049
+1D36		<super> 004A
+1D37		<super> 004B
+1D38		<super> 004C
+1D39		<super> 004D
+1D3A		<super> 004E
+1D3C		<super> 004F
+1D3D		<super> 0222
+1D3E		<super> 0050
+1D3F		<super> 0052
+1D40		<super> 0054
+1D41		<super> 0055
+1D42		<super> 0057
+1D43		<super> 0061
+1D44		<super> 0250
+1D45		<super> 0251
+1D46		<super> 1D02
+1D47		<super> 0062
+1D48		<super> 0064
+1D49		<super> 0065
+1D4A		<super> 0259
+1D4B		<super> 025B
+1D4C		<super> 025C
+1D4D		<super> 0067
+1D4F		<super> 006B
+1D50		<super> 006D
+1D51		<super> 014B
+1D52		<super> 006F
+1D53		<super> 0254
+1D54		<super> 1D16
+1D55		<super> 1D17
+1D56		<super> 0070
+1D57		<super> 0074
+1D58		<super> 0075
+1D59		<super> 1D1D
+1D5A		<super> 026F
+1D5B		<super> 0076
+1D5C		<super> 1D25
+1D5D		<super> 03B2
+1D5E		<super> 03B3
+1D5F		<super> 03B4
+1D60		<super> 03C6
+1D61		<super> 03C7
+1D62		<sub> 0069
+1D63		<sub> 0072
+1D64		<sub> 0075
+1D65		<sub> 0076
+1D66		<sub> 03B2
+1D67		<sub> 03B3
+1D68		<sub> 03C1
+1D69		<sub> 03C6
+1D6A		<sub> 03C7
+1D78		<super> 043D
+1D9B		<super> 0252
+1D9C		<super> 0063
+1D9D		<super> 0255
+1D9E		<super> 00F0
+1D9F		<super> 025C
+1DA0		<super> 0066
+1DA1		<super> 025F
+1DA2		<super> 0261
+1DA3		<super> 0265
+1DA4		<super> 0268
+1DA5		<super> 0269
+1DA6		<super> 026A
+1DA7		<super> 1D7B
+1DA8		<super> 029D
+1DA9		<super> 026D
+1DAA		<super> 1D85
+1DAB		<super> 029F
+1DAC		<super> 0271
+1DAD		<super> 0270
+1DAE		<super> 0272
+1DAF		<super> 0273
+1DB0		<super> 0274
+1DB1		<super> 0275
+1DB2		<super> 0278
+1DB3		<super> 0282
+1DB4		<super> 0283
+1DB5		<super> 01AB
+1DB6		<super> 0289
+1DB7		<super> 028A
+1DB8		<super> 1D1C
+1DB9		<super> 028B
+1DBA		<super> 028C
+1DBB		<super> 007A
+1DBC		<super> 0290
+1DBD		<super> 0291
+1DBE		<super> 0292
+1DBF		<super> 03B8
+1E00		0041 0325
+1E01		0061 0325
+1E02		0042 0307
+1E03		0062 0307
+1E04		0042 0323
+1E05		0062 0323
+1E06		0042 0331
+1E07		0062 0331
+1E08		00C7 0301
+1E09		00E7 0301
+1E0A		0044 0307
+1E0B		0064 0307
+1E0C		0044 0323
+1E0D		0064 0323
+1E0E		0044 0331
+1E0F		0064 0331
+1E10		0044 0327
+1E11		0064 0327
+1E12		0044 032D
+1E13		0064 032D
+1E14		0112 0300
+1E15		0113 0300
+1E16		0112 0301
+1E17		0113 0301
+1E18		0045 032D
+1E19		0065 032D
+1E1A		0045 0330
+1E1B		0065 0330
+1E1C		0228 0306
+1E1D		0229 0306
+1E1E		0046 0307
+1E1F		0066 0307
+1E20		0047 0304
+1E21		0067 0304
+1E22		0048 0307
+1E23		0068 0307
+1E24		0048 0323
+1E25		0068 0323
+1E26		0048 0308
+1E27		0068 0308
+1E28		0048 0327
+1E29		0068 0327
+1E2A		0048 032E
+1E2B		0068 032E
+1E2C		0049 0330
+1E2D		0069 0330
+1E2E		00CF 0301
+1E2F		00EF 0301
+1E30		004B 0301
+1E31		006B 0301
+1E32		004B 0323
+1E33		006B 0323
+1E34		004B 0331
+1E35		006B 0331
+1E36		004C 0323
+1E37		006C 0323
+1E38		1E36 0304
+1E39		1E37 0304
+1E3A		004C 0331
+1E3B		006C 0331
+1E3C		004C 032D
+1E3D		006C 032D
+1E3E		004D 0301
+1E3F		006D 0301
+1E40		004D 0307
+1E41		006D 0307
+1E42		004D 0323
+1E43		006D 0323
+1E44		004E 0307
+1E45		006E 0307
+1E46		004E 0323
+1E47		006E 0323
+1E48		004E 0331
+1E49		006E 0331
+1E4A		004E 032D
+1E4B		006E 032D
+1E4C		00D5 0301
+1E4D		00F5 0301
+1E4E		00D5 0308
+1E4F		00F5 0308
+1E50		014C 0300
+1E51		014D 0300
+1E52		014C 0301
+1E53		014D 0301
+1E54		0050 0301
+1E55		0070 0301
+1E56		0050 0307
+1E57		0070 0307
+1E58		0052 0307
+1E59		0072 0307
+1E5A		0052 0323
+1E5B		0072 0323
+1E5C		1E5A 0304
+1E5D		1E5B 0304
+1E5E		0052 0331
+1E5F		0072 0331
+1E60		0053 0307
+1E61		0073 0307
+1E62		0053 0323
+1E63		0073 0323
+1E64		015A 0307
+1E65		015B 0307
+1E66		0160 0307
+1E67		0161 0307
+1E68		1E62 0307
+1E69		1E63 0307
+1E6A		0054 0307
+1E6B		0074 0307
+1E6C		0054 0323
+1E6D		0074 0323
+1E6E		0054 0331
+1E6F		0074 0331
+1E70		0054 032D
+1E71		0074 032D
+1E72		0055 0324
+1E73		0075 0324
+1E74		0055 0330
+1E75		0075 0330
+1E76		0055 032D
+1E77		0075 032D
+1E78		0168 0301
+1E79		0169 0301
+1E7A		016A 0308
+1E7B		016B 0308
+1E7C		0056 0303
+1E7D		0076 0303
+1E7E		0056 0323
+1E7F		0076 0323
+1E80		0057 0300
+1E81		0077 0300
+1E82		0057 0301
+1E83		0077 0301
+1E84		0057 0308
+1E85		0077 0308
+1E86		0057 0307
+1E87		0077 0307
+1E88		0057 0323
+1E89		0077 0323
+1E8A		0058 0307
+1E8B		0078 0307
+1E8C		0058 0308
+1E8D		0078 0308
+1E8E		0059 0307
+1E8F		0079 0307
+1E90		005A 0302
+1E91		007A 0302
+1E92		005A 0323
+1E93		007A 0323
+1E94		005A 0331
+1E95		007A 0331
+1E96		0068 0331
+1E97		0074 0308
+1E98		0077 030A
+1E99		0079 030A
+1E9A		<compat> 0061 02BE
+1E9B		017F 0307
+1EA0		0041 0323
+1EA1		0061 0323
+1EA2		0041 0309
+1EA3		0061 0309
+1EA4		00C2 0301
+1EA5		00E2 0301
+1EA6		00C2 0300
+1EA7		00E2 0300
+1EA8		00C2 0309
+1EA9		00E2 0309
+1EAA		00C2 0303
+1EAB		00E2 0303
+1EAC		1EA0 0302
+1EAD		1EA1 0302
+1EAE		0102 0301
+1EAF		0103 0301
+1EB0		0102 0300
+1EB1		0103 0300
+1EB2		0102 0309
+1EB3		0103 0309
+1EB4		0102 0303
+1EB5		0103 0303
+1EB6		1EA0 0306
+1EB7		1EA1 0306
+1EB8		0045 0323
+1EB9		0065 0323
+1EBA		0045 0309
+1EBB		0065 0309
+1EBC		0045 0303
+1EBD		0065 0303
+1EBE		00CA 0301
+1EBF		00EA 0301
+1EC0		00CA 0300
+1EC1		00EA 0300
+1EC2		00CA 0309
+1EC3		00EA 0309
+1EC4		00CA 0303
+1EC5		00EA 0303
+1EC6		1EB8 0302
+1EC7		1EB9 0302
+1EC8		0049 0309
+1EC9		0069 0309
+1ECA		0049 0323
+1ECB		0069 0323
+1ECC		004F 0323
+1ECD		006F 0323
+1ECE		004F 0309
+1ECF		006F 0309
+1ED0		00D4 0301
+1ED1		00F4 0301
+1ED2		00D4 0300
+1ED3		00F4 0300
+1ED4		00D4 0309
+1ED5		00F4 0309
+1ED6		00D4 0303
+1ED7		00F4 0303
+1ED8		1ECC 0302
+1ED9		1ECD 0302
+1EDA		01A0 0301
+1EDB		01A1 0301
+1EDC		01A0 0300
+1EDD		01A1 0300
+1EDE		01A0 0309
+1EDF		01A1 0309
+1EE0		01A0 0303
+1EE1		01A1 0303
+1EE2		01A0 0323
+1EE3		01A1 0323
+1EE4		0055 0323
+1EE5		0075 0323
+1EE6		0055 0309
+1EE7		0075 0309
+1EE8		01AF 0301
+1EE9		01B0 0301
+1EEA		01AF 0300
+1EEB		01B0 0300
+1EEC		01AF 0309
+1EED		01B0 0309
+1EEE		01AF 0303
+1EEF		01B0 0303
+1EF0		01AF 0323
+1EF1		01B0 0323
+1EF2		0059 0300
+1EF3		0079 0300
+1EF4		0059 0323
+1EF5		0079 0323
+1EF6		0059 0309
+1EF7		0079 0309
+1EF8		0059 0303
+1EF9		0079 0303
+1F00		03B1 0313
+1F01		03B1 0314
+1F02		1F00 0300
+1F03		1F01 0300
+1F04		1F00 0301
+1F05		1F01 0301
+1F06		1F00 0342
+1F07		1F01 0342
+1F08		0391 0313
+1F09		0391 0314
+1F0A		1F08 0300
+1F0B		1F09 0300
+1F0C		1F08 0301
+1F0D		1F09 0301
+1F0E		1F08 0342
+1F0F		1F09 0342
+1F10		03B5 0313
+1F11		03B5 0314
+1F12		1F10 0300
+1F13		1F11 0300
+1F14		1F10 0301
+1F15		1F11 0301
+1F18		0395 0313
+1F19		0395 0314
+1F1A		1F18 0300
+1F1B		1F19 0300
+1F1C		1F18 0301
+1F1D		1F19 0301
+1F20		03B7 0313
+1F21		03B7 0314
+1F22		1F20 0300
+1F23		1F21 0300
+1F24		1F20 0301
+1F25		1F21 0301
+1F26		1F20 0342
+1F27		1F21 0342
+1F28		0397 0313
+1F29		0397 0314
+1F2A		1F28 0300
+1F2B		1F29 0300
+1F2C		1F28 0301
+1F2D		1F29 0301
+1F2E		1F28 0342
+1F2F		1F29 0342
+1F30		03B9 0313
+1F31		03B9 0314
+1F32		1F30 0300
+1F33		1F31 0300
+1F34		1F30 0301
+1F35		1F31 0301
+1F36		1F30 0342
+1F37		1F31 0342
+1F38		0399 0313
+1F39		0399 0314
+1F3A		1F38 0300
+1F3B		1F39 0300
+1F3C		1F38 0301
+1F3D		1F39 0301
+1F3E		1F38 0342
+1F3F		1F39 0342
+1F40		03BF 0313
+1F41		03BF 0314
+1F42		1F40 0300
+1F43		1F41 0300
+1F44		1F40 0301
+1F45		1F41 0301
+1F48		039F 0313
+1F49		039F 0314
+1F4A		1F48 0300
+1F4B		1F49 0300
+1F4C		1F48 0301
+1F4D		1F49 0301
+1F50		03C5 0313
+1F51		03C5 0314
+1F52		1F50 0300
+1F53		1F51 0300
+1F54		1F50 0301
+1F55		1F51 0301
+1F56		1F50 0342
+1F57		1F51 0342
+1F59		03A5 0314
+1F5B		1F59 0300
+1F5D		1F59 0301
+1F5F		1F59 0342
+1F60		03C9 0313
+1F61		03C9 0314
+1F62		1F60 0300
+1F63		1F61 0300
+1F64		1F60 0301
+1F65		1F61 0301
+1F66		1F60 0342
+1F67		1F61 0342
+1F68		03A9 0313
+1F69		03A9 0314
+1F6A		1F68 0300
+1F6B		1F69 0300
+1F6C		1F68 0301
+1F6D		1F69 0301
+1F6E		1F68 0342
+1F6F		1F69 0342
+1F70		03B1 0300
+1F71		03AC
+1F72		03B5 0300
+1F73		03AD
+1F74		03B7 0300
+1F75		03AE
+1F76		03B9 0300
+1F77		03AF
+1F78		03BF 0300
+1F79		03CC
+1F7A		03C5 0300
+1F7B		03CD
+1F7C		03C9 0300
+1F7D		03CE
+1F80		1F00 0345
+1F81		1F01 0345
+1F82		1F02 0345
+1F83		1F03 0345
+1F84		1F04 0345
+1F85		1F05 0345
+1F86		1F06 0345
+1F87		1F07 0345
+1F88		1F08 0345
+1F89		1F09 0345
+1F8A		1F0A 0345
+1F8B		1F0B 0345
+1F8C		1F0C 0345
+1F8D		1F0D 0345
+1F8E		1F0E 0345
+1F8F		1F0F 0345
+1F90		1F20 0345
+1F91		1F21 0345
+1F92		1F22 0345
+1F93		1F23 0345
+1F94		1F24 0345
+1F95		1F25 0345
+1F96		1F26 0345
+1F97		1F27 0345
+1F98		1F28 0345
+1F99		1F29 0345
+1F9A		1F2A 0345
+1F9B		1F2B 0345
+1F9C		1F2C 0345
+1F9D		1F2D 0345
+1F9E		1F2E 0345
+1F9F		1F2F 0345
+1FA0		1F60 0345
+1FA1		1F61 0345
+1FA2		1F62 0345
+1FA3		1F63 0345
+1FA4		1F64 0345
+1FA5		1F65 0345
+1FA6		1F66 0345
+1FA7		1F67 0345
+1FA8		1F68 0345
+1FA9		1F69 0345
+1FAA		1F6A 0345
+1FAB		1F6B 0345
+1FAC		1F6C 0345
+1FAD		1F6D 0345
+1FAE		1F6E 0345
+1FAF		1F6F 0345
+1FB0		03B1 0306
+1FB1		03B1 0304
+1FB2		1F70 0345
+1FB3		03B1 0345
+1FB4		03AC 0345
+1FB6		03B1 0342
+1FB7		1FB6 0345
+1FB8		0391 0306
+1FB9		0391 0304
+1FBA		0391 0300
+1FBB		0386
+1FBC		0391 0345
+1FBD		<compat> 0020 0313
+1FBE		03B9
+1FBF		<compat> 0020 0313
+1FC0		<compat> 0020 0342
+1FC1		00A8 0342
+1FC2		1F74 0345
+1FC3		03B7 0345
+1FC4		03AE 0345
+1FC6		03B7 0342
+1FC7		1FC6 0345
+1FC8		0395 0300
+1FC9		0388
+1FCA		0397 0300
+1FCB		0389
+1FCC		0397 0345
+1FCD		1FBF 0300
+1FCE		1FBF 0301
+1FCF		1FBF 0342
+1FD0		03B9 0306
+1FD1		03B9 0304
+1FD2		03CA 0300
+1FD3		0390
+1FD6		03B9 0342
+1FD7		03CA 0342
+1FD8		0399 0306
+1FD9		0399 0304
+1FDA		0399 0300
+1FDB		038A
+1FDD		1FFE 0300
+1FDE		1FFE 0301
+1FDF		1FFE 0342
+1FE0		03C5 0306
+1FE1		03C5 0304
+1FE2		03CB 0300
+1FE3		03B0
+1FE4		03C1 0313
+1FE5		03C1 0314
+1FE6		03C5 0342
+1FE7		03CB 0342
+1FE8		03A5 0306
+1FE9		03A5 0304
+1FEA		03A5 0300
+1FEB		038E
+1FEC		03A1 0314
+1FED		00A8 0300
+1FEE		0385
+1FEF		0060
+1FF2		1F7C 0345
+1FF3		03C9 0345
+1FF4		03CE 0345
+1FF6		03C9 0342
+1FF7		1FF6 0345
+1FF8		039F 0300
+1FF9		038C
+1FFA		03A9 0300
+1FFB		038F
+1FFC		03A9 0345
+1FFD		00B4
+1FFE		<compat> 0020 0314
+2000		2002
+2001		2003
+2002	2006	<compat> 0020
+2007		<noBreak> 0020
+2008	200A	<compat> 0020
+2011		<noBreak> 2010
+2017		<compat> 0020 0333
+2024		<compat> 002E
+2025		<compat> 002E 002E
+2026		<compat> 002E 002E 002E
+202F		<noBreak> 0020
+2033		<compat> 2032 2032
+2034		<compat> 2032 2032 2032
+2036		<compat> 2035 2035
+2037		<compat> 2035 2035 2035
+203C		<compat> 0021 0021
+203E		<compat> 0020 0305
+2047		<compat> 003F 003F
+2048		<compat> 003F 0021
+2049		<compat> 0021 003F
+2057		<compat> 2032 2032 2032 2032
+205F		<compat> 0020
+2070		<super> 0030
+2071		<super> 0069
+2074		<super> 0034
+2075		<super> 0035
+2076		<super> 0036
+2077		<super> 0037
+2078		<super> 0038
+2079		<super> 0039
+207A		<super> 002B
+207B		<super> 2212
+207C		<super> 003D
+207D		<super> 0028
+207E		<super> 0029
+207F		<super> 006E
+2080		<sub> 0030
+2081		<sub> 0031
+2082		<sub> 0032
+2083		<sub> 0033
+2084		<sub> 0034
+2085		<sub> 0035
+2086		<sub> 0036
+2087		<sub> 0037
+2088		<sub> 0038
+2089		<sub> 0039
+208A		<sub> 002B
+208B		<sub> 2212
+208C		<sub> 003D
+208D		<sub> 0028
+208E		<sub> 0029
+2090		<sub> 0061
+2091		<sub> 0065
+2092		<sub> 006F
+2093		<sub> 0078
+2094		<sub> 0259
+20A8		<compat> 0052 0073
+2100		<compat> 0061 002F 0063
+2101		<compat> 0061 002F 0073
+2102		<font> 0043
+2103		<compat> 00B0 0043
+2105		<compat> 0063 002F 006F
+2106		<compat> 0063 002F 0075
+2107		<compat> 0190
+2109		<compat> 00B0 0046
+210A		<font> 0067
+210B	210D	<font> 0048
+210E		<font> 0068
+210F		<font> 0127
+2110	2111	<font> 0049
+2112		<font> 004C
+2113		<font> 006C
+2115		<font> 004E
+2116		<compat> 004E 006F
+2119		<font> 0050
+211A		<font> 0051
+211B	211D	<font> 0052
+2120		<super> 0053 004D
+2121		<compat> 0054 0045 004C
+2122		<super> 0054 004D
+2124		<font> 005A
+2126		03A9
+2128		<font> 005A
+212A		004B
+212B		00C5
+212C		<font> 0042
+212D		<font> 0043
+212F		<font> 0065
+2130		<font> 0045
+2131		<font> 0046
+2133		<font> 004D
+2134		<font> 006F
+2135		<compat> 05D0
+2136		<compat> 05D1
+2137		<compat> 05D2
+2138		<compat> 05D3
+2139		<font> 0069
+213B		<compat> 0046 0041 0058
+213C		<font> 03C0
+213D		<font> 03B3
+213E		<font> 0393
+213F		<font> 03A0
+2140		<font> 2211
+2145		<font> 0044
+2146		<font> 0064
+2147		<font> 0065
+2148		<font> 0069
+2149		<font> 006A
+2153		<fraction> 0031 2044 0033
+2154		<fraction> 0032 2044 0033
+2155		<fraction> 0031 2044 0035
+2156		<fraction> 0032 2044 0035
+2157		<fraction> 0033 2044 0035
+2158		<fraction> 0034 2044 0035
+2159		<fraction> 0031 2044 0036
+215A		<fraction> 0035 2044 0036
+215B		<fraction> 0031 2044 0038
+215C		<fraction> 0033 2044 0038
+215D		<fraction> 0035 2044 0038
+215E		<fraction> 0037 2044 0038
+215F		<fraction> 0031 2044
+2160		<compat> 0049
+2161		<compat> 0049 0049
+2162		<compat> 0049 0049 0049
+2163		<compat> 0049 0056
+2164		<compat> 0056
+2165		<compat> 0056 0049
+2166		<compat> 0056 0049 0049
+2167		<compat> 0056 0049 0049 0049
+2168		<compat> 0049 0058
+2169		<compat> 0058
+216A		<compat> 0058 0049
+216B		<compat> 0058 0049 0049
+216C		<compat> 004C
+216D		<compat> 0043
+216E		<compat> 0044
+216F		<compat> 004D
+2170		<compat> 0069
+2171		<compat> 0069 0069
+2172		<compat> 0069 0069 0069
+2173		<compat> 0069 0076
+2174		<compat> 0076
+2175		<compat> 0076 0069
+2176		<compat> 0076 0069 0069
+2177		<compat> 0076 0069 0069 0069
+2178		<compat> 0069 0078
+2179		<compat> 0078
+217A		<compat> 0078 0069
+217B		<compat> 0078 0069 0069
+217C		<compat> 006C
+217D		<compat> 0063
+217E		<compat> 0064
+217F		<compat> 006D
+219A		2190 0338
+219B		2192 0338
+21AE		2194 0338
+21CD		21D0 0338
+21CE		21D4 0338
+21CF		21D2 0338
+2204		2203 0338
+2209		2208 0338
+220C		220B 0338
+2224		2223 0338
+2226		2225 0338
+222C		<compat> 222B 222B
+222D		<compat> 222B 222B 222B
+222F		<compat> 222E 222E
+2230		<compat> 222E 222E 222E
+2241		223C 0338
+2244		2243 0338
+2247		2245 0338
+2249		2248 0338
+2260		003D 0338
+2262		2261 0338
+226D		224D 0338
+226E		003C 0338
+226F		003E 0338
+2270		2264 0338
+2271		2265 0338
+2274		2272 0338
+2275		2273 0338
+2278		2276 0338
+2279		2277 0338
+2280		227A 0338
+2281		227B 0338
+2284		2282 0338
+2285		2283 0338
+2288		2286 0338
+2289		2287 0338
+22AC		22A2 0338
+22AD		22A8 0338
+22AE		22A9 0338
+22AF		22AB 0338
+22E0		227C 0338
+22E1		227D 0338
+22E2		2291 0338
+22E3		2292 0338
+22EA		22B2 0338
+22EB		22B3 0338
+22EC		22B4 0338
+22ED		22B5 0338
+2329		3008
+232A		3009
+2460		<circle> 0031
+2461		<circle> 0032
+2462		<circle> 0033
+2463		<circle> 0034
+2464		<circle> 0035
+2465		<circle> 0036
+2466		<circle> 0037
+2467		<circle> 0038
+2468		<circle> 0039
+2469		<circle> 0031 0030
+246A		<circle> 0031 0031
+246B		<circle> 0031 0032
+246C		<circle> 0031 0033
+246D		<circle> 0031 0034
+246E		<circle> 0031 0035
+246F		<circle> 0031 0036
+2470		<circle> 0031 0037
+2471		<circle> 0031 0038
+2472		<circle> 0031 0039
+2473		<circle> 0032 0030
+2474		<compat> 0028 0031 0029
+2475		<compat> 0028 0032 0029
+2476		<compat> 0028 0033 0029
+2477		<compat> 0028 0034 0029
+2478		<compat> 0028 0035 0029
+2479		<compat> 0028 0036 0029
+247A		<compat> 0028 0037 0029
+247B		<compat> 0028 0038 0029
+247C		<compat> 0028 0039 0029
+247D		<compat> 0028 0031 0030 0029
+247E		<compat> 0028 0031 0031 0029
+247F		<compat> 0028 0031 0032 0029
+2480		<compat> 0028 0031 0033 0029
+2481		<compat> 0028 0031 0034 0029
+2482		<compat> 0028 0031 0035 0029
+2483		<compat> 0028 0031 0036 0029
+2484		<compat> 0028 0031 0037 0029
+2485		<compat> 0028 0031 0038 0029
+2486		<compat> 0028 0031 0039 0029
+2487		<compat> 0028 0032 0030 0029
+2488		<compat> 0031 002E
+2489		<compat> 0032 002E
+248A		<compat> 0033 002E
+248B		<compat> 0034 002E
+248C		<compat> 0035 002E
+248D		<compat> 0036 002E
+248E		<compat> 0037 002E
+248F		<compat> 0038 002E
+2490		<compat> 0039 002E
+2491		<compat> 0031 0030 002E
+2492		<compat> 0031 0031 002E
+2493		<compat> 0031 0032 002E
+2494		<compat> 0031 0033 002E
+2495		<compat> 0031 0034 002E
+2496		<compat> 0031 0035 002E
+2497		<compat> 0031 0036 002E
+2498		<compat> 0031 0037 002E
+2499		<compat> 0031 0038 002E
+249A		<compat> 0031 0039 002E
+249B		<compat> 0032 0030 002E
+249C		<compat> 0028 0061 0029
+249D		<compat> 0028 0062 0029
+249E		<compat> 0028 0063 0029
+249F		<compat> 0028 0064 0029
+24A0		<compat> 0028 0065 0029
+24A1		<compat> 0028 0066 0029
+24A2		<compat> 0028 0067 0029
+24A3		<compat> 0028 0068 0029
+24A4		<compat> 0028 0069 0029
+24A5		<compat> 0028 006A 0029
+24A6		<compat> 0028 006B 0029
+24A7		<compat> 0028 006C 0029
+24A8		<compat> 0028 006D 0029
+24A9		<compat> 0028 006E 0029
+24AA		<compat> 0028 006F 0029
+24AB		<compat> 0028 0070 0029
+24AC		<compat> 0028 0071 0029
+24AD		<compat> 0028 0072 0029
+24AE		<compat> 0028 0073 0029
+24AF		<compat> 0028 0074 0029
+24B0		<compat> 0028 0075 0029
+24B1		<compat> 0028 0076 0029
+24B2		<compat> 0028 0077 0029
+24B3		<compat> 0028 0078 0029
+24B4		<compat> 0028 0079 0029
+24B5		<compat> 0028 007A 0029
+24B6		<circle> 0041
+24B7		<circle> 0042
+24B8		<circle> 0043
+24B9		<circle> 0044
+24BA		<circle> 0045
+24BB		<circle> 0046
+24BC		<circle> 0047
+24BD		<circle> 0048
+24BE		<circle> 0049
+24BF		<circle> 004A
+24C0		<circle> 004B
+24C1		<circle> 004C
+24C2		<circle> 004D
+24C3		<circle> 004E
+24C4		<circle> 004F
+24C5		<circle> 0050
+24C6		<circle> 0051
+24C7		<circle> 0052
+24C8		<circle> 0053
+24C9		<circle> 0054
+24CA		<circle> 0055
+24CB		<circle> 0056
+24CC		<circle> 0057
+24CD		<circle> 0058
+24CE		<circle> 0059
+24CF		<circle> 005A
+24D0		<circle> 0061
+24D1		<circle> 0062
+24D2		<circle> 0063
+24D3		<circle> 0064
+24D4		<circle> 0065
+24D5		<circle> 0066
+24D6		<circle> 0067
+24D7		<circle> 0068
+24D8		<circle> 0069
+24D9		<circle> 006A
+24DA		<circle> 006B
+24DB		<circle> 006C
+24DC		<circle> 006D
+24DD		<circle> 006E
+24DE		<circle> 006F
+24DF		<circle> 0070
+24E0		<circle> 0071
+24E1		<circle> 0072
+24E2		<circle> 0073
+24E3		<circle> 0074
+24E4		<circle> 0075
+24E5		<circle> 0076
+24E6		<circle> 0077
+24E7		<circle> 0078
+24E8		<circle> 0079
+24E9		<circle> 007A
+24EA		<circle> 0030
+2A0C		<compat> 222B 222B 222B 222B
+2A74		<compat> 003A 003A 003D
+2A75		<compat> 003D 003D
+2A76		<compat> 003D 003D 003D
+2ADC		2ADD 0338
+2D6F		<super> 2D61
+2E9F		<compat> 6BCD
+2EF3		<compat> 9F9F
+2F00		<compat> 4E00
+2F01		<compat> 4E28
+2F02		<compat> 4E36
+2F03		<compat> 4E3F
+2F04		<compat> 4E59
+2F05		<compat> 4E85
+2F06		<compat> 4E8C
+2F07		<compat> 4EA0
+2F08		<compat> 4EBA
+2F09		<compat> 513F
+2F0A		<compat> 5165
+2F0B		<compat> 516B
+2F0C		<compat> 5182
+2F0D		<compat> 5196
+2F0E		<compat> 51AB
+2F0F		<compat> 51E0
+2F10		<compat> 51F5
+2F11		<compat> 5200
+2F12		<compat> 529B
+2F13		<compat> 52F9
+2F14		<compat> 5315
+2F15		<compat> 531A
+2F16		<compat> 5338
+2F17		<compat> 5341
+2F18		<compat> 535C
+2F19		<compat> 5369
+2F1A		<compat> 5382
+2F1B		<compat> 53B6
+2F1C		<compat> 53C8
+2F1D		<compat> 53E3
+2F1E		<compat> 56D7
+2F1F		<compat> 571F
+2F20		<compat> 58EB
+2F21		<compat> 5902
+2F22		<compat> 590A
+2F23		<compat> 5915
+2F24		<compat> 5927
+2F25		<compat> 5973
+2F26		<compat> 5B50
+2F27		<compat> 5B80
+2F28		<compat> 5BF8
+2F29		<compat> 5C0F
+2F2A		<compat> 5C22
+2F2B		<compat> 5C38
+2F2C		<compat> 5C6E
+2F2D		<compat> 5C71
+2F2E		<compat> 5DDB
+2F2F		<compat> 5DE5
+2F30		<compat> 5DF1
+2F31		<compat> 5DFE
+2F32		<compat> 5E72
+2F33		<compat> 5E7A
+2F34		<compat> 5E7F
+2F35		<compat> 5EF4
+2F36		<compat> 5EFE
+2F37		<compat> 5F0B
+2F38		<compat> 5F13
+2F39		<compat> 5F50
+2F3A		<compat> 5F61
+2F3B		<compat> 5F73
+2F3C		<compat> 5FC3
+2F3D		<compat> 6208
+2F3E		<compat> 6236
+2F3F		<compat> 624B
+2F40		<compat> 652F
+2F41		<compat> 6534
+2F42		<compat> 6587
+2F43		<compat> 6597
+2F44		<compat> 65A4
+2F45		<compat> 65B9
+2F46		<compat> 65E0
+2F47		<compat> 65E5
+2F48		<compat> 66F0
+2F49		<compat> 6708
+2F4A		<compat> 6728
+2F4B		<compat> 6B20
+2F4C		<compat> 6B62
+2F4D		<compat> 6B79
+2F4E		<compat> 6BB3
+2F4F		<compat> 6BCB
+2F50		<compat> 6BD4
+2F51		<compat> 6BDB
+2F52		<compat> 6C0F
+2F53		<compat> 6C14
+2F54		<compat> 6C34
+2F55		<compat> 706B
+2F56		<compat> 722A
+2F57		<compat> 7236
+2F58		<compat> 723B
+2F59		<compat> 723F
+2F5A		<compat> 7247
+2F5B		<compat> 7259
+2F5C		<compat> 725B
+2F5D		<compat> 72AC
+2F5E		<compat> 7384
+2F5F		<compat> 7389
+2F60		<compat> 74DC
+2F61		<compat> 74E6
+2F62		<compat> 7518
+2F63		<compat> 751F
+2F64		<compat> 7528
+2F65		<compat> 7530
+2F66		<compat> 758B
+2F67		<compat> 7592
+2F68		<compat> 7676
+2F69		<compat> 767D
+2F6A		<compat> 76AE
+2F6B		<compat> 76BF
+2F6C		<compat> 76EE
+2F6D		<compat> 77DB
+2F6E		<compat> 77E2
+2F6F		<compat> 77F3
+2F70		<compat> 793A
+2F71		<compat> 79B8
+2F72		<compat> 79BE
+2F73		<compat> 7A74
+2F74		<compat> 7ACB
+2F75		<compat> 7AF9
+2F76		<compat> 7C73
+2F77		<compat> 7CF8
+2F78		<compat> 7F36
+2F79		<compat> 7F51
+2F7A		<compat> 7F8A
+2F7B		<compat> 7FBD
+2F7C		<compat> 8001
+2F7D		<compat> 800C
+2F7E		<compat> 8012
+2F7F		<compat> 8033
+2F80		<compat> 807F
+2F81		<compat> 8089
+2F82		<compat> 81E3
+2F83		<compat> 81EA
+2F84		<compat> 81F3
+2F85		<compat> 81FC
+2F86		<compat> 820C
+2F87		<compat> 821B
+2F88		<compat> 821F
+2F89		<compat> 826E
+2F8A		<compat> 8272
+2F8B		<compat> 8278
+2F8C		<compat> 864D
+2F8D		<compat> 866B
+2F8E		<compat> 8840
+2F8F		<compat> 884C
+2F90		<compat> 8863
+2F91		<compat> 897E
+2F92		<compat> 898B
+2F93		<compat> 89D2
+2F94		<compat> 8A00
+2F95		<compat> 8C37
+2F96		<compat> 8C46
+2F97		<compat> 8C55
+2F98		<compat> 8C78
+2F99		<compat> 8C9D
+2F9A		<compat> 8D64
+2F9B		<compat> 8D70
+2F9C		<compat> 8DB3
+2F9D		<compat> 8EAB
+2F9E		<compat> 8ECA
+2F9F		<compat> 8F9B
+2FA0		<compat> 8FB0
+2FA1		<compat> 8FB5
+2FA2		<compat> 9091
+2FA3		<compat> 9149
+2FA4		<compat> 91C6
+2FA5		<compat> 91CC
+2FA6		<compat> 91D1
+2FA7		<compat> 9577
+2FA8		<compat> 9580
+2FA9		<compat> 961C
+2FAA		<compat> 96B6
+2FAB		<compat> 96B9
+2FAC		<compat> 96E8
+2FAD		<compat> 9751
+2FAE		<compat> 975E
+2FAF		<compat> 9762
+2FB0		<compat> 9769
+2FB1		<compat> 97CB
+2FB2		<compat> 97ED
+2FB3		<compat> 97F3
+2FB4		<compat> 9801
+2FB5		<compat> 98A8
+2FB6		<compat> 98DB
+2FB7		<compat> 98DF
+2FB8		<compat> 9996
+2FB9		<compat> 9999
+2FBA		<compat> 99AC
+2FBB		<compat> 9AA8
+2FBC		<compat> 9AD8
+2FBD		<compat> 9ADF
+2FBE		<compat> 9B25
+2FBF		<compat> 9B2F
+2FC0		<compat> 9B32
+2FC1		<compat> 9B3C
+2FC2		<compat> 9B5A
+2FC3		<compat> 9CE5
+2FC4		<compat> 9E75
+2FC5		<compat> 9E7F
+2FC6		<compat> 9EA5
+2FC7		<compat> 9EBB
+2FC8		<compat> 9EC3
+2FC9		<compat> 9ECD
+2FCA		<compat> 9ED1
+2FCB		<compat> 9EF9
+2FCC		<compat> 9EFD
+2FCD		<compat> 9F0E
+2FCE		<compat> 9F13
+2FCF		<compat> 9F20
+2FD0		<compat> 9F3B
+2FD1		<compat> 9F4A
+2FD2		<compat> 9F52
+2FD3		<compat> 9F8D
+2FD4		<compat> 9F9C
+2FD5		<compat> 9FA0
+3000		<wide> 0020
+3036		<compat> 3012
+3038		<compat> 5341
+3039		<compat> 5344
+303A		<compat> 5345
+304C		304B 3099
+304E		304D 3099
+3050		304F 3099
+3052		3051 3099
+3054		3053 3099
+3056		3055 3099
+3058		3057 3099
+305A		3059 3099
+305C		305B 3099
+305E		305D 3099
+3060		305F 3099
+3062		3061 3099
+3065		3064 3099
+3067		3066 3099
+3069		3068 3099
+3070		306F 3099
+3071		306F 309A
+3073		3072 3099
+3074		3072 309A
+3076		3075 3099
+3077		3075 309A
+3079		3078 3099
+307A		3078 309A
+307C		307B 3099
+307D		307B 309A
+3094		3046 3099
+309B		<compat> 0020 3099
+309C		<compat> 0020 309A
+309E		309D 3099
+309F		<vertical> 3088 308A
+30AC		30AB 3099
+30AE		30AD 3099
+30B0		30AF 3099
+30B2		30B1 3099
+30B4		30B3 3099
+30B6		30B5 3099
+30B8		30B7 3099
+30BA		30B9 3099
+30BC		30BB 3099
+30BE		30BD 3099
+30C0		30BF 3099
+30C2		30C1 3099
+30C5		30C4 3099
+30C7		30C6 3099
+30C9		30C8 3099
+30D0		30CF 3099
+30D1		30CF 309A
+30D3		30D2 3099
+30D4		30D2 309A
+30D6		30D5 3099
+30D7		30D5 309A
+30D9		30D8 3099
+30DA		30D8 309A
+30DC		30DB 3099
+30DD		30DB 309A
+30F4		30A6 3099
+30F7		30EF 3099
+30F8		30F0 3099
+30F9		30F1 3099
+30FA		30F2 3099
+30FE		30FD 3099
+30FF		<vertical> 30B3 30C8
+3131		<compat> 1100
+3132		<compat> 1101
+3133		<compat> 11AA
+3134		<compat> 1102
+3135		<compat> 11AC
+3136		<compat> 11AD
+3137		<compat> 1103
+3138		<compat> 1104
+3139		<compat> 1105
+313A		<compat> 11B0
+313B		<compat> 11B1
+313C		<compat> 11B2
+313D		<compat> 11B3
+313E		<compat> 11B4
+313F		<compat> 11B5
+3140		<compat> 111A
+3141		<compat> 1106
+3142		<compat> 1107
+3143		<compat> 1108
+3144		<compat> 1121
+3145		<compat> 1109
+3146		<compat> 110A
+3147		<compat> 110B
+3148		<compat> 110C
+3149		<compat> 110D
+314A		<compat> 110E
+314B		<compat> 110F
+314C		<compat> 1110
+314D		<compat> 1111
+314E		<compat> 1112
+314F		<compat> 1161
+3150		<compat> 1162
+3151		<compat> 1163
+3152		<compat> 1164
+3153		<compat> 1165
+3154		<compat> 1166
+3155		<compat> 1167
+3156		<compat> 1168
+3157		<compat> 1169
+3158		<compat> 116A
+3159		<compat> 116B
+315A		<compat> 116C
+315B		<compat> 116D
+315C		<compat> 116E
+315D		<compat> 116F
+315E		<compat> 1170
+315F		<compat> 1171
+3160		<compat> 1172
+3161		<compat> 1173
+3162		<compat> 1174
+3163		<compat> 1175
+3164		<compat> 1160
+3165		<compat> 1114
+3166		<compat> 1115
+3167		<compat> 11C7
+3168		<compat> 11C8
+3169		<compat> 11CC
+316A		<compat> 11CE
+316B		<compat> 11D3
+316C		<compat> 11D7
+316D		<compat> 11D9
+316E		<compat> 111C
+316F		<compat> 11DD
+3170		<compat> 11DF
+3171		<compat> 111D
+3172		<compat> 111E
+3173		<compat> 1120
+3174		<compat> 1122
+3175		<compat> 1123
+3176		<compat> 1127
+3177		<compat> 1129
+3178		<compat> 112B
+3179		<compat> 112C
+317A		<compat> 112D
+317B		<compat> 112E
+317C		<compat> 112F
+317D		<compat> 1132
+317E		<compat> 1136
+317F		<compat> 1140
+3180		<compat> 1147
+3181		<compat> 114C
+3182		<compat> 11F1
+3183		<compat> 11F2
+3184		<compat> 1157
+3185		<compat> 1158
+3186		<compat> 1159
+3187		<compat> 1184
+3188		<compat> 1185
+3189		<compat> 1188
+318A		<compat> 1191
+318B		<compat> 1192
+318C		<compat> 1194
+318D		<compat> 119E
+318E		<compat> 11A1
+3192		<super> 4E00
+3193		<super> 4E8C
+3194		<super> 4E09
+3195		<super> 56DB
+3196		<super> 4E0A
+3197		<super> 4E2D
+3198		<super> 4E0B
+3199		<super> 7532
+319A		<super> 4E59
+319B		<super> 4E19
+319C		<super> 4E01
+319D		<super> 5929
+319E		<super> 5730
+319F		<super> 4EBA
+3200		<compat> 0028 1100 0029
+3201		<compat> 0028 1102 0029
+3202		<compat> 0028 1103 0029
+3203		<compat> 0028 1105 0029
+3204		<compat> 0028 1106 0029
+3205		<compat> 0028 1107 0029
+3206		<compat> 0028 1109 0029
+3207		<compat> 0028 110B 0029
+3208		<compat> 0028 110C 0029
+3209		<compat> 0028 110E 0029
+320A		<compat> 0028 110F 0029
+320B		<compat> 0028 1110 0029
+320C		<compat> 0028 1111 0029
+320D		<compat> 0028 1112 0029
+320E		<compat> 0028 1100 1161 0029
+320F		<compat> 0028 1102 1161 0029
+3210		<compat> 0028 1103 1161 0029
+3211		<compat> 0028 1105 1161 0029
+3212		<compat> 0028 1106 1161 0029
+3213		<compat> 0028 1107 1161 0029
+3214		<compat> 0028 1109 1161 0029
+3215		<compat> 0028 110B 1161 0029
+3216		<compat> 0028 110C 1161 0029
+3217		<compat> 0028 110E 1161 0029
+3218		<compat> 0028 110F 1161 0029
+3219		<compat> 0028 1110 1161 0029
+321A		<compat> 0028 1111 1161 0029
+321B		<compat> 0028 1112 1161 0029
+321C		<compat> 0028 110C 116E 0029
+321D		<compat> 0028 110B 1169 110C 1165 11AB 0029
+321E		<compat> 0028 110B 1169 1112 116E 0029
+3220		<compat> 0028 4E00 0029
+3221		<compat> 0028 4E8C 0029
+3222		<compat> 0028 4E09 0029
+3223		<compat> 0028 56DB 0029
+3224		<compat> 0028 4E94 0029
+3225		<compat> 0028 516D 0029
+3226		<compat> 0028 4E03 0029
+3227		<compat> 0028 516B 0029
+3228		<compat> 0028 4E5D 0029
+3229		<compat> 0028 5341 0029
+322A		<compat> 0028 6708 0029
+322B		<compat> 0028 706B 0029
+322C		<compat> 0028 6C34 0029
+322D		<compat> 0028 6728 0029
+322E		<compat> 0028 91D1 0029
+322F		<compat> 0028 571F 0029
+3230		<compat> 0028 65E5 0029
+3231		<compat> 0028 682A 0029
+3232		<compat> 0028 6709 0029
+3233		<compat> 0028 793E 0029
+3234		<compat> 0028 540D 0029
+3235		<compat> 0028 7279 0029
+3236		<compat> 0028 8CA1 0029
+3237		<compat> 0028 795D 0029
+3238		<compat> 0028 52B4 0029
+3239		<compat> 0028 4EE3 0029
+323A		<compat> 0028 547C 0029
+323B		<compat> 0028 5B66 0029
+323C		<compat> 0028 76E3 0029
+323D		<compat> 0028 4F01 0029
+323E		<compat> 0028 8CC7 0029
+323F		<compat> 0028 5354 0029
+3240		<compat> 0028 796D 0029
+3241		<compat> 0028 4F11 0029
+3242		<compat> 0028 81EA 0029
+3243		<compat> 0028 81F3 0029
+3250		<square> 0050 0054 0045
+3251		<circle> 0032 0031
+3252		<circle> 0032 0032
+3253		<circle> 0032 0033
+3254		<circle> 0032 0034
+3255		<circle> 0032 0035
+3256		<circle> 0032 0036
+3257		<circle> 0032 0037
+3258		<circle> 0032 0038
+3259		<circle> 0032 0039
+325A		<circle> 0033 0030
+325B		<circle> 0033 0031
+325C		<circle> 0033 0032
+325D		<circle> 0033 0033
+325E		<circle> 0033 0034
+325F		<circle> 0033 0035
+3260		<circle> 1100
+3261		<circle> 1102
+3262		<circle> 1103
+3263		<circle> 1105
+3264		<circle> 1106
+3265		<circle> 1107
+3266		<circle> 1109
+3267		<circle> 110B
+3268		<circle> 110C
+3269		<circle> 110E
+326A		<circle> 110F
+326B		<circle> 1110
+326C		<circle> 1111
+326D		<circle> 1112
+326E		<circle> 1100 1161
+326F		<circle> 1102 1161
+3270		<circle> 1103 1161
+3271		<circle> 1105 1161
+3272		<circle> 1106 1161
+3273		<circle> 1107 1161
+3274		<circle> 1109 1161
+3275		<circle> 110B 1161
+3276		<circle> 110C 1161
+3277		<circle> 110E 1161
+3278		<circle> 110F 1161
+3279		<circle> 1110 1161
+327A		<circle> 1111 1161
+327B		<circle> 1112 1161
+327C		<circle> 110E 1161 11B7 1100 1169
+327D		<circle> 110C 116E 110B 1174
+327E		<circle> 110B 116E
+3280		<circle> 4E00
+3281		<circle> 4E8C
+3282		<circle> 4E09
+3283		<circle> 56DB
+3284		<circle> 4E94
+3285		<circle> 516D
+3286		<circle> 4E03
+3287		<circle> 516B
+3288		<circle> 4E5D
+3289		<circle> 5341
+328A		<circle> 6708
+328B		<circle> 706B
+328C		<circle> 6C34
+328D		<circle> 6728
+328E		<circle> 91D1
+328F		<circle> 571F
+3290		<circle> 65E5
+3291		<circle> 682A
+3292		<circle> 6709
+3293		<circle> 793E
+3294		<circle> 540D
+3295		<circle> 7279
+3296		<circle> 8CA1
+3297		<circle> 795D
+3298		<circle> 52B4
+3299		<circle> 79D8
+329A		<circle> 7537
+329B		<circle> 5973
+329C		<circle> 9069
+329D		<circle> 512A
+329E		<circle> 5370
+329F		<circle> 6CE8
+32A0		<circle> 9805
+32A1		<circle> 4F11
+32A2		<circle> 5199
+32A3		<circle> 6B63
+32A4		<circle> 4E0A
+32A5		<circle> 4E2D
+32A6		<circle> 4E0B
+32A7		<circle> 5DE6
+32A8		<circle> 53F3
+32A9		<circle> 533B
+32AA		<circle> 5B97
+32AB		<circle> 5B66
+32AC		<circle> 76E3
+32AD		<circle> 4F01
+32AE		<circle> 8CC7
+32AF		<circle> 5354
+32B0		<circle> 591C
+32B1		<circle> 0033 0036
+32B2		<circle> 0033 0037
+32B3		<circle> 0033 0038
+32B4		<circle> 0033 0039
+32B5		<circle> 0034 0030
+32B6		<circle> 0034 0031
+32B7		<circle> 0034 0032
+32B8		<circle> 0034 0033
+32B9		<circle> 0034 0034
+32BA		<circle> 0034 0035
+32BB		<circle> 0034 0036
+32BC		<circle> 0034 0037
+32BD		<circle> 0034 0038
+32BE		<circle> 0034 0039
+32BF		<circle> 0035 0030
+32C0		<compat> 0031 6708
+32C1		<compat> 0032 6708
+32C2		<compat> 0033 6708
+32C3		<compat> 0034 6708
+32C4		<compat> 0035 6708
+32C5		<compat> 0036 6708
+32C6		<compat> 0037 6708
+32C7		<compat> 0038 6708
+32C8		<compat> 0039 6708
+32C9		<compat> 0031 0030 6708
+32CA		<compat> 0031 0031 6708
+32CB		<compat> 0031 0032 6708
+32CC		<square> 0048 0067
+32CD		<square> 0065 0072 0067
+32CE		<square> 0065 0056
+32CF		<square> 004C 0054 0044
+32D0		<circle> 30A2
+32D1		<circle> 30A4
+32D2		<circle> 30A6
+32D3		<circle> 30A8
+32D4		<circle> 30AA
+32D5		<circle> 30AB
+32D6		<circle> 30AD
+32D7		<circle> 30AF
+32D8		<circle> 30B1
+32D9		<circle> 30B3
+32DA		<circle> 30B5
+32DB		<circle> 30B7
+32DC		<circle> 30B9
+32DD		<circle> 30BB
+32DE		<circle> 30BD
+32DF		<circle> 30BF
+32E0		<circle> 30C1
+32E1		<circle> 30C4
+32E2		<circle> 30C6
+32E3		<circle> 30C8
+32E4		<circle> 30CA
+32E5		<circle> 30CB
+32E6		<circle> 30CC
+32E7		<circle> 30CD
+32E8		<circle> 30CE
+32E9		<circle> 30CF
+32EA		<circle> 30D2
+32EB		<circle> 30D5
+32EC		<circle> 30D8
+32ED		<circle> 30DB
+32EE		<circle> 30DE
+32EF		<circle> 30DF
+32F0		<circle> 30E0
+32F1		<circle> 30E1
+32F2		<circle> 30E2
+32F3		<circle> 30E4
+32F4		<circle> 30E6
+32F5		<circle> 30E8
+32F6		<circle> 30E9
+32F7		<circle> 30EA
+32F8		<circle> 30EB
+32F9		<circle> 30EC
+32FA		<circle> 30ED
+32FB		<circle> 30EF
+32FC		<circle> 30F0
+32FD		<circle> 30F1
+32FE		<circle> 30F2
+3300		<square> 30A2 30D1 30FC 30C8
+3301		<square> 30A2 30EB 30D5 30A1
+3302		<square> 30A2 30F3 30DA 30A2
+3303		<square> 30A2 30FC 30EB
+3304		<square> 30A4 30CB 30F3 30B0
+3305		<square> 30A4 30F3 30C1
+3306		<square> 30A6 30A9 30F3
+3307		<square> 30A8 30B9 30AF 30FC 30C9
+3308		<square> 30A8 30FC 30AB 30FC
+3309		<square> 30AA 30F3 30B9
+330A		<square> 30AA 30FC 30E0
+330B		<square> 30AB 30A4 30EA
+330C		<square> 30AB 30E9 30C3 30C8
+330D		<square> 30AB 30ED 30EA 30FC
+330E		<square> 30AC 30ED 30F3
+330F		<square> 30AC 30F3 30DE
+3310		<square> 30AE 30AC
+3311		<square> 30AE 30CB 30FC
+3312		<square> 30AD 30E5 30EA 30FC
+3313		<square> 30AE 30EB 30C0 30FC
+3314		<square> 30AD 30ED
+3315		<square> 30AD 30ED 30B0 30E9 30E0
+3316		<square> 30AD 30ED 30E1 30FC 30C8 30EB
+3317		<square> 30AD 30ED 30EF 30C3 30C8
+3318		<square> 30B0 30E9 30E0
+3319		<square> 30B0 30E9 30E0 30C8 30F3
+331A		<square> 30AF 30EB 30BC 30A4 30ED
+331B		<square> 30AF 30ED 30FC 30CD
+331C		<square> 30B1 30FC 30B9
+331D		<square> 30B3 30EB 30CA
+331E		<square> 30B3 30FC 30DD
+331F		<square> 30B5 30A4 30AF 30EB
+3320		<square> 30B5 30F3 30C1 30FC 30E0
+3321		<square> 30B7 30EA 30F3 30B0
+3322		<square> 30BB 30F3 30C1
+3323		<square> 30BB 30F3 30C8
+3324		<square> 30C0 30FC 30B9
+3325		<square> 30C7 30B7
+3326		<square> 30C9 30EB
+3327		<square> 30C8 30F3
+3328		<square> 30CA 30CE
+3329		<square> 30CE 30C3 30C8
+332A		<square> 30CF 30A4 30C4
+332B		<square> 30D1 30FC 30BB 30F3 30C8
+332C		<square> 30D1 30FC 30C4
+332D		<square> 30D0 30FC 30EC 30EB
+332E		<square> 30D4 30A2 30B9 30C8 30EB
+332F		<square> 30D4 30AF 30EB
+3330		<square> 30D4 30B3
+3331		<square> 30D3 30EB
+3332		<square> 30D5 30A1 30E9 30C3 30C9
+3333		<square> 30D5 30A3 30FC 30C8
+3334		<square> 30D6 30C3 30B7 30A7 30EB
+3335		<square> 30D5 30E9 30F3
+3336		<square> 30D8 30AF 30BF 30FC 30EB
+3337		<square> 30DA 30BD
+3338		<square> 30DA 30CB 30D2
+3339		<square> 30D8 30EB 30C4
+333A		<square> 30DA 30F3 30B9
+333B		<square> 30DA 30FC 30B8
+333C		<square> 30D9 30FC 30BF
+333D		<square> 30DD 30A4 30F3 30C8
+333E		<square> 30DC 30EB 30C8
+333F		<square> 30DB 30F3
+3340		<square> 30DD 30F3 30C9
+3341		<square> 30DB 30FC 30EB
+3342		<square> 30DB 30FC 30F3
+3343		<square> 30DE 30A4 30AF 30ED
+3344		<square> 30DE 30A4 30EB
+3345		<square> 30DE 30C3 30CF
+3346		<square> 30DE 30EB 30AF
+3347		<square> 30DE 30F3 30B7 30E7 30F3
+3348		<square> 30DF 30AF 30ED 30F3
+3349		<square> 30DF 30EA
+334A		<square> 30DF 30EA 30D0 30FC 30EB
+334B		<square> 30E1 30AC
+334C		<square> 30E1 30AC 30C8 30F3
+334D		<square> 30E1 30FC 30C8 30EB
+334E		<square> 30E4 30FC 30C9
+334F		<square> 30E4 30FC 30EB
+3350		<square> 30E6 30A2 30F3
+3351		<square> 30EA 30C3 30C8 30EB
+3352		<square> 30EA 30E9
+3353		<square> 30EB 30D4 30FC
+3354		<square> 30EB 30FC 30D6 30EB
+3355		<square> 30EC 30E0
+3356		<square> 30EC 30F3 30C8 30B2 30F3
+3357		<square> 30EF 30C3 30C8
+3358		<compat> 0030 70B9
+3359		<compat> 0031 70B9
+335A		<compat> 0032 70B9
+335B		<compat> 0033 70B9
+335C		<compat> 0034 70B9
+335D		<compat> 0035 70B9
+335E		<compat> 0036 70B9
+335F		<compat> 0037 70B9
+3360		<compat> 0038 70B9
+3361		<compat> 0039 70B9
+3362		<compat> 0031 0030 70B9
+3363		<compat> 0031 0031 70B9
+3364		<compat> 0031 0032 70B9
+3365		<compat> 0031 0033 70B9
+3366		<compat> 0031 0034 70B9
+3367		<compat> 0031 0035 70B9
+3368		<compat> 0031 0036 70B9
+3369		<compat> 0031 0037 70B9
+336A		<compat> 0031 0038 70B9
+336B		<compat> 0031 0039 70B9
+336C		<compat> 0032 0030 70B9
+336D		<compat> 0032 0031 70B9
+336E		<compat> 0032 0032 70B9
+336F		<compat> 0032 0033 70B9
+3370		<compat> 0032 0034 70B9
+3371		<square> 0068 0050 0061
+3372		<square> 0064 0061
+3373		<square> 0041 0055
+3374		<square> 0062 0061 0072
+3375		<square> 006F 0056
+3376		<square> 0070 0063
+3377		<square> 0064 006D
+3378		<square> 0064 006D 00B2
+3379		<square> 0064 006D 00B3
+337A		<square> 0049 0055
+337B		<square> 5E73 6210
+337C		<square> 662D 548C
+337D		<square> 5927 6B63
+337E		<square> 660E 6CBB
+337F		<square> 682A 5F0F 4F1A 793E
+3380		<square> 0070 0041
+3381		<square> 006E 0041
+3382		<square> 03BC 0041
+3383		<square> 006D 0041
+3384		<square> 006B 0041
+3385		<square> 004B 0042
+3386		<square> 004D 0042
+3387		<square> 0047 0042
+3388		<square> 0063 0061 006C
+3389		<square> 006B 0063 0061 006C
+338A		<square> 0070 0046
+338B		<square> 006E 0046
+338C		<square> 03BC 0046
+338D		<square> 03BC 0067
+338E		<square> 006D 0067
+338F		<square> 006B 0067
+3390		<square> 0048 007A
+3391		<square> 006B 0048 007A
+3392		<square> 004D 0048 007A
+3393		<square> 0047 0048 007A
+3394		<square> 0054 0048 007A
+3395		<square> 03BC 2113
+3396		<square> 006D 2113
+3397		<square> 0064 2113
+3398		<square> 006B 2113
+3399		<square> 0066 006D
+339A		<square> 006E 006D
+339B		<square> 03BC 006D
+339C		<square> 006D 006D
+339D		<square> 0063 006D
+339E		<square> 006B 006D
+339F		<square> 006D 006D 00B2
+33A0		<square> 0063 006D 00B2
+33A1		<square> 006D 00B2
+33A2		<square> 006B 006D 00B2
+33A3		<square> 006D 006D 00B3
+33A4		<square> 0063 006D 00B3
+33A5		<square> 006D 00B3
+33A6		<square> 006B 006D 00B3
+33A7		<square> 006D 2215 0073
+33A8		<square> 006D 2215 0073 00B2
+33A9		<square> 0050 0061
+33AA		<square> 006B 0050 0061
+33AB		<square> 004D 0050 0061
+33AC		<square> 0047 0050 0061
+33AD		<square> 0072 0061 0064
+33AE		<square> 0072 0061 0064 2215 0073
+33AF		<square> 0072 0061 0064 2215 0073 00B2
+33B0		<square> 0070 0073
+33B1		<square> 006E 0073
+33B2		<square> 03BC 0073
+33B3		<square> 006D 0073
+33B4		<square> 0070 0056
+33B5		<square> 006E 0056
+33B6		<square> 03BC 0056
+33B7		<square> 006D 0056
+33B8		<square> 006B 0056
+33B9		<square> 004D 0056
+33BA		<square> 0070 0057
+33BB		<square> 006E 0057
+33BC		<square> 03BC 0057
+33BD		<square> 006D 0057
+33BE		<square> 006B 0057
+33BF		<square> 004D 0057
+33C0		<square> 006B 03A9
+33C1		<square> 004D 03A9
+33C2		<square> 0061 002E 006D 002E
+33C3		<square> 0042 0071
+33C4		<square> 0063 0063
+33C5		<square> 0063 0064
+33C6		<square> 0043 2215 006B 0067
+33C7		<square> 0043 006F 002E
+33C8		<square> 0064 0042
+33C9		<square> 0047 0079
+33CA		<square> 0068 0061
+33CB		<square> 0048 0050
+33CC		<square> 0069 006E
+33CD		<square> 004B 004B
+33CE		<square> 004B 004D
+33CF		<square> 006B 0074
+33D0		<square> 006C 006D
+33D1		<square> 006C 006E
+33D2		<square> 006C 006F 0067
+33D3		<square> 006C 0078
+33D4		<square> 006D 0062
+33D5		<square> 006D 0069 006C
+33D6		<square> 006D 006F 006C
+33D7		<square> 0050 0048
+33D8		<square> 0070 002E 006D 002E
+33D9		<square> 0050 0050 004D
+33DA		<square> 0050 0052
+33DB		<square> 0073 0072
+33DC		<square> 0053 0076
+33DD		<square> 0057 0062
+33DE		<square> 0056 2215 006D
+33DF		<square> 0041 2215 006D
+33E0		<compat> 0031 65E5
+33E1		<compat> 0032 65E5
+33E2		<compat> 0033 65E5
+33E3		<compat> 0034 65E5
+33E4		<compat> 0035 65E5
+33E5		<compat> 0036 65E5
+33E6		<compat> 0037 65E5
+33E7		<compat> 0038 65E5
+33E8		<compat> 0039 65E5
+33E9		<compat> 0031 0030 65E5
+33EA		<compat> 0031 0031 65E5
+33EB		<compat> 0031 0032 65E5
+33EC		<compat> 0031 0033 65E5
+33ED		<compat> 0031 0034 65E5
+33EE		<compat> 0031 0035 65E5
+33EF		<compat> 0031 0036 65E5
+33F0		<compat> 0031 0037 65E5
+33F1		<compat> 0031 0038 65E5
+33F2		<compat> 0031 0039 65E5
+33F3		<compat> 0032 0030 65E5
+33F4		<compat> 0032 0031 65E5
+33F5		<compat> 0032 0032 65E5
+33F6		<compat> 0032 0033 65E5
+33F7		<compat> 0032 0034 65E5
+33F8		<compat> 0032 0035 65E5
+33F9		<compat> 0032 0036 65E5
+33FA		<compat> 0032 0037 65E5
+33FB		<compat> 0032 0038 65E5
+33FC		<compat> 0032 0039 65E5
+33FD		<compat> 0033 0030 65E5
+33FE		<compat> 0033 0031 65E5
+33FF		<square> 0067 0061 006C
+F900		8C48
+F901		66F4
+F902		8ECA
+F903		8CC8
+F904		6ED1
+F905		4E32
+F906		53E5
+F907	F908	9F9C
+F909		5951
+F90A		91D1
+F90B		5587
+F90C		5948
+F90D		61F6
+F90E		7669
+F90F		7F85
+F910		863F
+F911		87BA
+F912		88F8
+F913		908F
+F914		6A02
+F915		6D1B
+F916		70D9
+F917		73DE
+F918		843D
+F919		916A
+F91A		99F1
+F91B		4E82
+F91C		5375
+F91D		6B04
+F91E		721B
+F91F		862D
+F920		9E1E
+F921		5D50
+F922		6FEB
+F923		85CD
+F924		8964
+F925		62C9
+F926		81D8
+F927		881F
+F928		5ECA
+F929		6717
+F92A		6D6A
+F92B		72FC
+F92C		90CE
+F92D		4F86
+F92E		51B7
+F92F		52DE
+F930		64C4
+F931		6AD3
+F932		7210
+F933		76E7
+F934		8001
+F935		8606
+F936		865C
+F937		8DEF
+F938		9732
+F939		9B6F
+F93A		9DFA
+F93B		788C
+F93C		797F
+F93D		7DA0
+F93E		83C9
+F93F		9304
+F940		9E7F
+F941		8AD6
+F942		58DF
+F943		5F04
+F944		7C60
+F945		807E
+F946		7262
+F947		78CA
+F948		8CC2
+F949		96F7
+F94A		58D8
+F94B		5C62
+F94C		6A13
+F94D		6DDA
+F94E		6F0F
+F94F		7D2F
+F950		7E37
+F951		964B
+F952		52D2
+F953		808B
+F954		51DC
+F955		51CC
+F956		7A1C
+F957		7DBE
+F958		83F1
+F959		9675
+F95A		8B80
+F95B		62CF
+F95C		6A02
+F95D		8AFE
+F95E		4E39
+F95F		5BE7
+F960		6012
+F961		7387
+F962		7570
+F963		5317
+F964		78FB
+F965		4FBF
+F966		5FA9
+F967		4E0D
+F968		6CCC
+F969		6578
+F96A		7D22
+F96B		53C3
+F96C		585E
+F96D		7701
+F96E		8449
+F96F		8AAA
+F970		6BBA
+F971		8FB0
+F972		6C88
+F973		62FE
+F974		82E5
+F975		63A0
+F976		7565
+F977		4EAE
+F978		5169
+F979		51C9
+F97A		6881
+F97B		7CE7
+F97C		826F
+F97D		8AD2
+F97E		91CF
+F97F		52F5
+F980		5442
+F981		5973
+F982		5EEC
+F983		65C5
+F984		6FFE
+F985		792A
+F986		95AD
+F987		9A6A
+F988		9E97
+F989		9ECE
+F98A		529B
+F98B		66C6
+F98C		6B77
+F98D		8F62
+F98E		5E74
+F98F		6190
+F990		6200
+F991		649A
+F992		6F23
+F993		7149
+F994		7489
+F995		79CA
+F996		7DF4
+F997		806F
+F998		8F26
+F999		84EE
+F99A		9023
+F99B		934A
+F99C		5217
+F99D		52A3
+F99E		54BD
+F99F		70C8
+F9A0		88C2
+F9A1		8AAA
+F9A2		5EC9
+F9A3		5FF5
+F9A4		637B
+F9A5		6BAE
+F9A6		7C3E
+F9A7		7375
+F9A8		4EE4
+F9A9		56F9
+F9AA		5BE7
+F9AB		5DBA
+F9AC		601C
+F9AD		73B2
+F9AE		7469
+F9AF		7F9A
+F9B0		8046
+F9B1		9234
+F9B2		96F6
+F9B3		9748
+F9B4		9818
+F9B5		4F8B
+F9B6		79AE
+F9B7		91B4
+F9B8		96B8
+F9B9		60E1
+F9BA		4E86
+F9BB		50DA
+F9BC		5BEE
+F9BD		5C3F
+F9BE		6599
+F9BF		6A02
+F9C0		71CE
+F9C1		7642
+F9C2		84FC
+F9C3		907C
+F9C4		9F8D
+F9C5		6688
+F9C6		962E
+F9C7		5289
+F9C8		677B
+F9C9		67F3
+F9CA		6D41
+F9CB		6E9C
+F9CC		7409
+F9CD		7559
+F9CE		786B
+F9CF		7D10
+F9D0		985E
+F9D1		516D
+F9D2		622E
+F9D3		9678
+F9D4		502B
+F9D5		5D19
+F9D6		6DEA
+F9D7		8F2A
+F9D8		5F8B
+F9D9		6144
+F9DA		6817
+F9DB		7387
+F9DC		9686
+F9DD		5229
+F9DE		540F
+F9DF		5C65
+F9E0		6613
+F9E1		674E
+F9E2		68A8
+F9E3		6CE5
+F9E4		7406
+F9E5		75E2
+F9E6		7F79
+F9E7		88CF
+F9E8		88E1
+F9E9		91CC
+F9EA		96E2
+F9EB		533F
+F9EC		6EBA
+F9ED		541D
+F9EE		71D0
+F9EF		7498
+F9F0		85FA
+F9F1		96A3
+F9F2		9C57
+F9F3		9E9F
+F9F4		6797
+F9F5		6DCB
+F9F6		81E8
+F9F7		7ACB
+F9F8		7B20
+F9F9		7C92
+F9FA		72C0
+F9FB		7099
+F9FC		8B58
+F9FD		4EC0
+F9FE		8336
+F9FF		523A
+FA00		5207
+FA01		5EA6
+FA02		62D3
+FA03		7CD6
+FA04		5B85
+FA05		6D1E
+FA06		66B4
+FA07		8F3B
+FA08		884C
+FA09		964D
+FA0A		898B
+FA0B		5ED3
+FA0C		5140
+FA0D		55C0
+FA10		585A
+FA12		6674
+FA15		51DE
+FA16		732A
+FA17		76CA
+FA18		793C
+FA19		795E
+FA1A		7965
+FA1B		798F
+FA1C		9756
+FA1D		7CBE
+FA1E		7FBD
+FA20		8612
+FA22		8AF8
+FA25		9038
+FA26		90FD
+FA2A		98EF
+FA2B		98FC
+FA2C		9928
+FA2D		9DB4
+FA30		4FAE
+FA31		50E7
+FA32		514D
+FA33		52C9
+FA34		52E4
+FA35		5351
+FA36		559D
+FA37		5606
+FA38		5668
+FA39		5840
+FA3A		58A8
+FA3B		5C64
+FA3C		5C6E
+FA3D		6094
+FA3E		6168
+FA3F		618E
+FA40		61F2
+FA41		654F
+FA42		65E2
+FA43		6691
+FA44		6885
+FA45		6D77
+FA46		6E1A
+FA47		6F22
+FA48		716E
+FA49		722B
+FA4A		7422
+FA4B		7891
+FA4C		793E
+FA4D		7949
+FA4E		7948
+FA4F		7950
+FA50		7956
+FA51		795D
+FA52		798D
+FA53		798E
+FA54		7A40
+FA55		7A81
+FA56		7BC0
+FA57		7DF4
+FA58		7E09
+FA59		7E41
+FA5A		7F72
+FA5B		8005
+FA5C		81ED
+FA5D	FA5E	8279
+FA5F		8457
+FA60		8910
+FA61		8996
+FA62		8B01
+FA63		8B39
+FA64		8CD3
+FA65		8D08
+FA66		8FB6
+FA67		9038
+FA68		96E3
+FA69		97FF
+FA6A		983B
+FA70		4E26
+FA71		51B5
+FA72		5168
+FA73		4F80
+FA74		5145
+FA75		5180
+FA76		52C7
+FA77		52FA
+FA78		559D
+FA79		5555
+FA7A		5599
+FA7B		55E2
+FA7C		585A
+FA7D		58B3
+FA7E		5944
+FA7F		5954
+FA80		5A62
+FA81		5B28
+FA82		5ED2
+FA83		5ED9
+FA84		5F69
+FA85		5FAD
+FA86		60D8
+FA87		614E
+FA88		6108
+FA89		618E
+FA8A		6160
+FA8B		61F2
+FA8C		6234
+FA8D		63C4
+FA8E		641C
+FA8F		6452
+FA90		6556
+FA91		6674
+FA92		6717
+FA93		671B
+FA94		6756
+FA95		6B79
+FA96		6BBA
+FA97		6D41
+FA98		6EDB
+FA99		6ECB
+FA9A		6F22
+FA9B		701E
+FA9C		716E
+FA9D		77A7
+FA9E		7235
+FA9F		72AF
+FAA0		732A
+FAA1		7471
+FAA2		7506
+FAA3		753B
+FAA4		761D
+FAA5		761F
+FAA6		76CA
+FAA7		76DB
+FAA8		76F4
+FAA9		774A
+FAAA		7740
+FAAB		78CC
+FAAC		7AB1
+FAAD		7BC0
+FAAE		7C7B
+FAAF		7D5B
+FAB0		7DF4
+FAB1		7F3E
+FAB2		8005
+FAB3		8352
+FAB4		83EF
+FAB5		8779
+FAB6		8941
+FAB7		8986
+FAB8		8996
+FAB9		8ABF
+FABA		8AF8
+FABB		8ACB
+FABC		8B01
+FABD		8AFE
+FABE		8AED
+FABF		8B39
+FAC0		8B8A
+FAC1		8D08
+FAC2		8F38
+FAC3		9072
+FAC4		9199
+FAC5		9276
+FAC6		967C
+FAC7		96E3
+FAC8		9756
+FAC9		97DB
+FACA		97FF
+FACB		980B
+FACC		983B
+FACD		9B12
+FACE		9F9C
+FACF		2284A
+FAD0		22844
+FAD1		233D5
+FAD2		3B9D
+FAD3		4018
+FAD4		4039
+FAD5		25249
+FAD6		25CD0
+FAD7		27ED3
+FAD8		9F43
+FAD9		9F8E
+FB00		<compat> 0066 0066
+FB01		<compat> 0066 0069
+FB02		<compat> 0066 006C
+FB03		<compat> 0066 0066 0069
+FB04		<compat> 0066 0066 006C
+FB05		<compat> 017F 0074
+FB06		<compat> 0073 0074
+FB13		<compat> 0574 0576
+FB14		<compat> 0574 0565
+FB15		<compat> 0574 056B
+FB16		<compat> 057E 0576
+FB17		<compat> 0574 056D
+FB1D		05D9 05B4
+FB1F		05F2 05B7
+FB20		<font> 05E2
+FB21		<font> 05D0
+FB22		<font> 05D3
+FB23		<font> 05D4
+FB24		<font> 05DB
+FB25		<font> 05DC
+FB26		<font> 05DD
+FB27		<font> 05E8
+FB28		<font> 05EA
+FB29		<font> 002B
+FB2A		05E9 05C1
+FB2B		05E9 05C2
+FB2C		FB49 05C1
+FB2D		FB49 05C2
+FB2E		05D0 05B7
+FB2F		05D0 05B8
+FB30		05D0 05BC
+FB31		05D1 05BC
+FB32		05D2 05BC
+FB33		05D3 05BC
+FB34		05D4 05BC
+FB35		05D5 05BC
+FB36		05D6 05BC
+FB38		05D8 05BC
+FB39		05D9 05BC
+FB3A		05DA 05BC
+FB3B		05DB 05BC
+FB3C		05DC 05BC
+FB3E		05DE 05BC
+FB40		05E0 05BC
+FB41		05E1 05BC
+FB43		05E3 05BC
+FB44		05E4 05BC
+FB46		05E6 05BC
+FB47		05E7 05BC
+FB48		05E8 05BC
+FB49		05E9 05BC
+FB4A		05EA 05BC
+FB4B		05D5 05B9
+FB4C		05D1 05BF
+FB4D		05DB 05BF
+FB4E		05E4 05BF
+FB4F		<compat> 05D0 05DC
+FB50		<isolated> 0671
+FB51		<final> 0671
+FB52		<isolated> 067B
+FB53		<final> 067B
+FB54		<initial> 067B
+FB55		<medial> 067B
+FB56		<isolated> 067E
+FB57		<final> 067E
+FB58		<initial> 067E
+FB59		<medial> 067E
+FB5A		<isolated> 0680
+FB5B		<final> 0680
+FB5C		<initial> 0680
+FB5D		<medial> 0680
+FB5E		<isolated> 067A
+FB5F		<final> 067A
+FB60		<initial> 067A
+FB61		<medial> 067A
+FB62		<isolated> 067F
+FB63		<final> 067F
+FB64		<initial> 067F
+FB65		<medial> 067F
+FB66		<isolated> 0679
+FB67		<final> 0679
+FB68		<initial> 0679
+FB69		<medial> 0679
+FB6A		<isolated> 06A4
+FB6B		<final> 06A4
+FB6C		<initial> 06A4
+FB6D		<medial> 06A4
+FB6E		<isolated> 06A6
+FB6F		<final> 06A6
+FB70		<initial> 06A6
+FB71		<medial> 06A6
+FB72		<isolated> 0684
+FB73		<final> 0684
+FB74		<initial> 0684
+FB75		<medial> 0684
+FB76		<isolated> 0683
+FB77		<final> 0683
+FB78		<initial> 0683
+FB79		<medial> 0683
+FB7A		<isolated> 0686
+FB7B		<final> 0686
+FB7C		<initial> 0686
+FB7D		<medial> 0686
+FB7E		<isolated> 0687
+FB7F		<final> 0687
+FB80		<initial> 0687
+FB81		<medial> 0687
+FB82		<isolated> 068D
+FB83		<final> 068D
+FB84		<isolated> 068C
+FB85		<final> 068C
+FB86		<isolated> 068E
+FB87		<final> 068E
+FB88		<isolated> 0688
+FB89		<final> 0688
+FB8A		<isolated> 0698
+FB8B		<final> 0698
+FB8C		<isolated> 0691
+FB8D		<final> 0691
+FB8E		<isolated> 06A9
+FB8F		<final> 06A9
+FB90		<initial> 06A9
+FB91		<medial> 06A9
+FB92		<isolated> 06AF
+FB93		<final> 06AF
+FB94		<initial> 06AF
+FB95		<medial> 06AF
+FB96		<isolated> 06B3
+FB97		<final> 06B3
+FB98		<initial> 06B3
+FB99		<medial> 06B3
+FB9A		<isolated> 06B1
+FB9B		<final> 06B1
+FB9C		<initial> 06B1
+FB9D		<medial> 06B1
+FB9E		<isolated> 06BA
+FB9F		<final> 06BA
+FBA0		<isolated> 06BB
+FBA1		<final> 06BB
+FBA2		<initial> 06BB
+FBA3		<medial> 06BB
+FBA4		<isolated> 06C0
+FBA5		<final> 06C0
+FBA6		<isolated> 06C1
+FBA7		<final> 06C1
+FBA8		<initial> 06C1
+FBA9		<medial> 06C1
+FBAA		<isolated> 06BE
+FBAB		<final> 06BE
+FBAC		<initial> 06BE
+FBAD		<medial> 06BE
+FBAE		<isolated> 06D2
+FBAF		<final> 06D2
+FBB0		<isolated> 06D3
+FBB1		<final> 06D3
+FBD3		<isolated> 06AD
+FBD4		<final> 06AD
+FBD5		<initial> 06AD
+FBD6		<medial> 06AD
+FBD7		<isolated> 06C7
+FBD8		<final> 06C7
+FBD9		<isolated> 06C6
+FBDA		<final> 06C6
+FBDB		<isolated> 06C8
+FBDC		<final> 06C8
+FBDD		<isolated> 0677
+FBDE		<isolated> 06CB
+FBDF		<final> 06CB
+FBE0		<isolated> 06C5
+FBE1		<final> 06C5
+FBE2		<isolated> 06C9
+FBE3		<final> 06C9
+FBE4		<isolated> 06D0
+FBE5		<final> 06D0
+FBE6		<initial> 06D0
+FBE7		<medial> 06D0
+FBE8		<initial> 0649
+FBE9		<medial> 0649
+FBEA		<isolated> 0626 0627
+FBEB		<final> 0626 0627
+FBEC		<isolated> 0626 06D5
+FBED		<final> 0626 06D5
+FBEE		<isolated> 0626 0648
+FBEF		<final> 0626 0648
+FBF0		<isolated> 0626 06C7
+FBF1		<final> 0626 06C7
+FBF2		<isolated> 0626 06C6
+FBF3		<final> 0626 06C6
+FBF4		<isolated> 0626 06C8
+FBF5		<final> 0626 06C8
+FBF6		<isolated> 0626 06D0
+FBF7		<final> 0626 06D0
+FBF8		<initial> 0626 06D0
+FBF9		<isolated> 0626 0649
+FBFA		<final> 0626 0649
+FBFB		<initial> 0626 0649
+FBFC		<isolated> 06CC
+FBFD		<final> 06CC
+FBFE		<initial> 06CC
+FBFF		<medial> 06CC
+FC00		<isolated> 0626 062C
+FC01		<isolated> 0626 062D
+FC02		<isolated> 0626 0645
+FC03		<isolated> 0626 0649
+FC04		<isolated> 0626 064A
+FC05		<isolated> 0628 062C
+FC06		<isolated> 0628 062D
+FC07		<isolated> 0628 062E
+FC08		<isolated> 0628 0645
+FC09		<isolated> 0628 0649
+FC0A		<isolated> 0628 064A
+FC0B		<isolated> 062A 062C
+FC0C		<isolated> 062A 062D
+FC0D		<isolated> 062A 062E
+FC0E		<isolated> 062A 0645
+FC0F		<isolated> 062A 0649
+FC10		<isolated> 062A 064A
+FC11		<isolated> 062B 062C
+FC12		<isolated> 062B 0645
+FC13		<isolated> 062B 0649
+FC14		<isolated> 062B 064A
+FC15		<isolated> 062C 062D
+FC16		<isolated> 062C 0645
+FC17		<isolated> 062D 062C
+FC18		<isolated> 062D 0645
+FC19		<isolated> 062E 062C
+FC1A		<isolated> 062E 062D
+FC1B		<isolated> 062E 0645
+FC1C		<isolated> 0633 062C
+FC1D		<isolated> 0633 062D
+FC1E		<isolated> 0633 062E
+FC1F		<isolated> 0633 0645
+FC20		<isolated> 0635 062D
+FC21		<isolated> 0635 0645
+FC22		<isolated> 0636 062C
+FC23		<isolated> 0636 062D
+FC24		<isolated> 0636 062E
+FC25		<isolated> 0636 0645
+FC26		<isolated> 0637 062D
+FC27		<isolated> 0637 0645
+FC28		<isolated> 0638 0645
+FC29		<isolated> 0639 062C
+FC2A		<isolated> 0639 0645
+FC2B		<isolated> 063A 062C
+FC2C		<isolated> 063A 0645
+FC2D		<isolated> 0641 062C
+FC2E		<isolated> 0641 062D
+FC2F		<isolated> 0641 062E
+FC30		<isolated> 0641 0645
+FC31		<isolated> 0641 0649
+FC32		<isolated> 0641 064A
+FC33		<isolated> 0642 062D
+FC34		<isolated> 0642 0645
+FC35		<isolated> 0642 0649
+FC36		<isolated> 0642 064A
+FC37		<isolated> 0643 0627
+FC38		<isolated> 0643 062C
+FC39		<isolated> 0643 062D
+FC3A		<isolated> 0643 062E
+FC3B		<isolated> 0643 0644
+FC3C		<isolated> 0643 0645
+FC3D		<isolated> 0643 0649
+FC3E		<isolated> 0643 064A
+FC3F		<isolated> 0644 062C
+FC40		<isolated> 0644 062D
+FC41		<isolated> 0644 062E
+FC42		<isolated> 0644 0645
+FC43		<isolated> 0644 0649
+FC44		<isolated> 0644 064A
+FC45		<isolated> 0645 062C
+FC46		<isolated> 0645 062D
+FC47		<isolated> 0645 062E
+FC48		<isolated> 0645 0645
+FC49		<isolated> 0645 0649
+FC4A		<isolated> 0645 064A
+FC4B		<isolated> 0646 062C
+FC4C		<isolated> 0646 062D
+FC4D		<isolated> 0646 062E
+FC4E		<isolated> 0646 0645
+FC4F		<isolated> 0646 0649
+FC50		<isolated> 0646 064A
+FC51		<isolated> 0647 062C
+FC52		<isolated> 0647 0645
+FC53		<isolated> 0647 0649
+FC54		<isolated> 0647 064A
+FC55		<isolated> 064A 062C
+FC56		<isolated> 064A 062D
+FC57		<isolated> 064A 062E
+FC58		<isolated> 064A 0645
+FC59		<isolated> 064A 0649
+FC5A		<isolated> 064A 064A
+FC5B		<isolated> 0630 0670
+FC5C		<isolated> 0631 0670
+FC5D		<isolated> 0649 0670
+FC5E		<isolated> 0020 064C 0651
+FC5F		<isolated> 0020 064D 0651
+FC60		<isolated> 0020 064E 0651
+FC61		<isolated> 0020 064F 0651
+FC62		<isolated> 0020 0650 0651
+FC63		<isolated> 0020 0651 0670
+FC64		<final> 0626 0631
+FC65		<final> 0626 0632
+FC66		<final> 0626 0645
+FC67		<final> 0626 0646
+FC68		<final> 0626 0649
+FC69		<final> 0626 064A
+FC6A		<final> 0628 0631
+FC6B		<final> 0628 0632
+FC6C		<final> 0628 0645
+FC6D		<final> 0628 0646
+FC6E		<final> 0628 0649
+FC6F		<final> 0628 064A
+FC70		<final> 062A 0631
+FC71		<final> 062A 0632
+FC72		<final> 062A 0645
+FC73		<final> 062A 0646
+FC74		<final> 062A 0649
+FC75		<final> 062A 064A
+FC76		<final> 062B 0631
+FC77		<final> 062B 0632
+FC78		<final> 062B 0645
+FC79		<final> 062B 0646
+FC7A		<final> 062B 0649
+FC7B		<final> 062B 064A
+FC7C		<final> 0641 0649
+FC7D		<final> 0641 064A
+FC7E		<final> 0642 0649
+FC7F		<final> 0642 064A
+FC80		<final> 0643 0627
+FC81		<final> 0643 0644
+FC82		<final> 0643 0645
+FC83		<final> 0643 0649
+FC84		<final> 0643 064A
+FC85		<final> 0644 0645
+FC86		<final> 0644 0649
+FC87		<final> 0644 064A
+FC88		<final> 0645 0627
+FC89		<final> 0645 0645
+FC8A		<final> 0646 0631
+FC8B		<final> 0646 0632
+FC8C		<final> 0646 0645
+FC8D		<final> 0646 0646
+FC8E		<final> 0646 0649
+FC8F		<final> 0646 064A
+FC90		<final> 0649 0670
+FC91		<final> 064A 0631
+FC92		<final> 064A 0632
+FC93		<final> 064A 0645
+FC94		<final> 064A 0646
+FC95		<final> 064A 0649
+FC96		<final> 064A 064A
+FC97		<initial> 0626 062C
+FC98		<initial> 0626 062D
+FC99		<initial> 0626 062E
+FC9A		<initial> 0626 0645
+FC9B		<initial> 0626 0647
+FC9C		<initial> 0628 062C
+FC9D		<initial> 0628 062D
+FC9E		<initial> 0628 062E
+FC9F		<initial> 0628 0645
+FCA0		<initial> 0628 0647
+FCA1		<initial> 062A 062C
+FCA2		<initial> 062A 062D
+FCA3		<initial> 062A 062E
+FCA4		<initial> 062A 0645
+FCA5		<initial> 062A 0647
+FCA6		<initial> 062B 0645
+FCA7		<initial> 062C 062D
+FCA8		<initial> 062C 0645
+FCA9		<initial> 062D 062C
+FCAA		<initial> 062D 0645
+FCAB		<initial> 062E 062C
+FCAC		<initial> 062E 0645
+FCAD		<initial> 0633 062C
+FCAE		<initial> 0633 062D
+FCAF		<initial> 0633 062E
+FCB0		<initial> 0633 0645
+FCB1		<initial> 0635 062D
+FCB2		<initial> 0635 062E
+FCB3		<initial> 0635 0645
+FCB4		<initial> 0636 062C
+FCB5		<initial> 0636 062D
+FCB6		<initial> 0636 062E
+FCB7		<initial> 0636 0645
+FCB8		<initial> 0637 062D
+FCB9		<initial> 0638 0645
+FCBA		<initial> 0639 062C
+FCBB		<initial> 0639 0645
+FCBC		<initial> 063A 062C
+FCBD		<initial> 063A 0645
+FCBE		<initial> 0641 062C
+FCBF		<initial> 0641 062D
+FCC0		<initial> 0641 062E
+FCC1		<initial> 0641 0645
+FCC2		<initial> 0642 062D
+FCC3		<initial> 0642 0645
+FCC4		<initial> 0643 062C
+FCC5		<initial> 0643 062D
+FCC6		<initial> 0643 062E
+FCC7		<initial> 0643 0644
+FCC8		<initial> 0643 0645
+FCC9		<initial> 0644 062C
+FCCA		<initial> 0644 062D
+FCCB		<initial> 0644 062E
+FCCC		<initial> 0644 0645
+FCCD		<initial> 0644 0647
+FCCE		<initial> 0645 062C
+FCCF		<initial> 0645 062D
+FCD0		<initial> 0645 062E
+FCD1		<initial> 0645 0645
+FCD2		<initial> 0646 062C
+FCD3		<initial> 0646 062D
+FCD4		<initial> 0646 062E
+FCD5		<initial> 0646 0645
+FCD6		<initial> 0646 0647
+FCD7		<initial> 0647 062C
+FCD8		<initial> 0647 0645
+FCD9		<initial> 0647 0670
+FCDA		<initial> 064A 062C
+FCDB		<initial> 064A 062D
+FCDC		<initial> 064A 062E
+FCDD		<initial> 064A 0645
+FCDE		<initial> 064A 0647
+FCDF		<medial> 0626 0645
+FCE0		<medial> 0626 0647
+FCE1		<medial> 0628 0645
+FCE2		<medial> 0628 0647
+FCE3		<medial> 062A 0645
+FCE4		<medial> 062A 0647
+FCE5		<medial> 062B 0645
+FCE6		<medial> 062B 0647
+FCE7		<medial> 0633 0645
+FCE8		<medial> 0633 0647
+FCE9		<medial> 0634 0645
+FCEA		<medial> 0634 0647
+FCEB		<medial> 0643 0644
+FCEC		<medial> 0643 0645
+FCED		<medial> 0644 0645
+FCEE		<medial> 0646 0645
+FCEF		<medial> 0646 0647
+FCF0		<medial> 064A 0645
+FCF1		<medial> 064A 0647
+FCF2		<medial> 0640 064E 0651
+FCF3		<medial> 0640 064F 0651
+FCF4		<medial> 0640 0650 0651
+FCF5		<isolated> 0637 0649
+FCF6		<isolated> 0637 064A
+FCF7		<isolated> 0639 0649
+FCF8		<isolated> 0639 064A
+FCF9		<isolated> 063A 0649
+FCFA		<isolated> 063A 064A
+FCFB		<isolated> 0633 0649
+FCFC		<isolated> 0633 064A
+FCFD		<isolated> 0634 0649
+FCFE		<isolated> 0634 064A
+FCFF		<isolated> 062D 0649
+FD00		<isolated> 062D 064A
+FD01		<isolated> 062C 0649
+FD02		<isolated> 062C 064A
+FD03		<isolated> 062E 0649
+FD04		<isolated> 062E 064A
+FD05		<isolated> 0635 0649
+FD06		<isolated> 0635 064A
+FD07		<isolated> 0636 0649
+FD08		<isolated> 0636 064A
+FD09		<isolated> 0634 062C
+FD0A		<isolated> 0634 062D
+FD0B		<isolated> 0634 062E
+FD0C		<isolated> 0634 0645
+FD0D		<isolated> 0634 0631
+FD0E		<isolated> 0633 0631
+FD0F		<isolated> 0635 0631
+FD10		<isolated> 0636 0631
+FD11		<final> 0637 0649
+FD12		<final> 0637 064A
+FD13		<final> 0639 0649
+FD14		<final> 0639 064A
+FD15		<final> 063A 0649
+FD16		<final> 063A 064A
+FD17		<final> 0633 0649
+FD18		<final> 0633 064A
+FD19		<final> 0634 0649
+FD1A		<final> 0634 064A
+FD1B		<final> 062D 0649
+FD1C		<final> 062D 064A
+FD1D		<final> 062C 0649
+FD1E		<final> 062C 064A
+FD1F		<final> 062E 0649
+FD20		<final> 062E 064A
+FD21		<final> 0635 0649
+FD22		<final> 0635 064A
+FD23		<final> 0636 0649
+FD24		<final> 0636 064A
+FD25		<final> 0634 062C
+FD26		<final> 0634 062D
+FD27		<final> 0634 062E
+FD28		<final> 0634 0645
+FD29		<final> 0634 0631
+FD2A		<final> 0633 0631
+FD2B		<final> 0635 0631
+FD2C		<final> 0636 0631
+FD2D		<initial> 0634 062C
+FD2E		<initial> 0634 062D
+FD2F		<initial> 0634 062E
+FD30		<initial> 0634 0645
+FD31		<initial> 0633 0647
+FD32		<initial> 0634 0647
+FD33		<initial> 0637 0645
+FD34		<medial> 0633 062C
+FD35		<medial> 0633 062D
+FD36		<medial> 0633 062E
+FD37		<medial> 0634 062C
+FD38		<medial> 0634 062D
+FD39		<medial> 0634 062E
+FD3A		<medial> 0637 0645
+FD3B		<medial> 0638 0645
+FD3C		<final> 0627 064B
+FD3D		<isolated> 0627 064B
+FD50		<initial> 062A 062C 0645
+FD51		<final> 062A 062D 062C
+FD52		<initial> 062A 062D 062C
+FD53		<initial> 062A 062D 0645
+FD54		<initial> 062A 062E 0645
+FD55		<initial> 062A 0645 062C
+FD56		<initial> 062A 0645 062D
+FD57		<initial> 062A 0645 062E
+FD58		<final> 062C 0645 062D
+FD59		<initial> 062C 0645 062D
+FD5A		<final> 062D 0645 064A
+FD5B		<final> 062D 0645 0649
+FD5C		<initial> 0633 062D 062C
+FD5D		<initial> 0633 062C 062D
+FD5E		<final> 0633 062C 0649
+FD5F		<final> 0633 0645 062D
+FD60		<initial> 0633 0645 062D
+FD61		<initial> 0633 0645 062C
+FD62		<final> 0633 0645 0645
+FD63		<initial> 0633 0645 0645
+FD64		<final> 0635 062D 062D
+FD65		<initial> 0635 062D 062D
+FD66		<final> 0635 0645 0645
+FD67		<final> 0634 062D 0645
+FD68		<initial> 0634 062D 0645
+FD69		<final> 0634 062C 064A
+FD6A		<final> 0634 0645 062E
+FD6B		<initial> 0634 0645 062E
+FD6C		<final> 0634 0645 0645
+FD6D		<initial> 0634 0645 0645
+FD6E		<final> 0636 062D 0649
+FD6F		<final> 0636 062E 0645
+FD70		<initial> 0636 062E 0645
+FD71		<final> 0637 0645 062D
+FD72		<initial> 0637 0645 062D
+FD73		<initial> 0637 0645 0645
+FD74		<final> 0637 0645 064A
+FD75		<final> 0639 062C 0645
+FD76		<final> 0639 0645 0645
+FD77		<initial> 0639 0645 0645
+FD78		<final> 0639 0645 0649
+FD79		<final> 063A 0645 0645
+FD7A		<final> 063A 0645 064A
+FD7B		<final> 063A 0645 0649
+FD7C		<final> 0641 062E 0645
+FD7D		<initial> 0641 062E 0645
+FD7E		<final> 0642 0645 062D
+FD7F		<final> 0642 0645 0645
+FD80		<final> 0644 062D 0645
+FD81		<final> 0644 062D 064A
+FD82		<final> 0644 062D 0649
+FD83		<initial> 0644 062C 062C
+FD84		<final> 0644 062C 062C
+FD85		<final> 0644 062E 0645
+FD86		<initial> 0644 062E 0645
+FD87		<final> 0644 0645 062D
+FD88		<initial> 0644 0645 062D
+FD89		<initial> 0645 062D 062C
+FD8A		<initial> 0645 062D 0645
+FD8B		<final> 0645 062D 064A
+FD8C		<initial> 0645 062C 062D
+FD8D		<initial> 0645 062C 0645
+FD8E		<initial> 0645 062E 062C
+FD8F		<initial> 0645 062E 0645
+FD92		<initial> 0645 062C 062E
+FD93		<initial> 0647 0645 062C
+FD94		<initial> 0647 0645 0645
+FD95		<initial> 0646 062D 0645
+FD96		<final> 0646 062D 0649
+FD97		<final> 0646 062C 0645
+FD98		<initial> 0646 062C 0645
+FD99		<final> 0646 062C 0649
+FD9A		<final> 0646 0645 064A
+FD9B		<final> 0646 0645 0649
+FD9C		<final> 064A 0645 0645
+FD9D		<initial> 064A 0645 0645
+FD9E		<final> 0628 062E 064A
+FD9F		<final> 062A 062C 064A
+FDA0		<final> 062A 062C 0649
+FDA1		<final> 062A 062E 064A
+FDA2		<final> 062A 062E 0649
+FDA3		<final> 062A 0645 064A
+FDA4		<final> 062A 0645 0649
+FDA5		<final> 062C 0645 064A
+FDA6		<final> 062C 062D 0649
+FDA7		<final> 062C 0645 0649
+FDA8		<final> 0633 062E 0649
+FDA9		<final> 0635 062D 064A
+FDAA		<final> 0634 062D 064A
+FDAB		<final> 0636 062D 064A
+FDAC		<final> 0644 062C 064A
+FDAD		<final> 0644 0645 064A
+FDAE		<final> 064A 062D 064A
+FDAF		<final> 064A 062C 064A
+FDB0		<final> 064A 0645 064A
+FDB1		<final> 0645 0645 064A
+FDB2		<final> 0642 0645 064A
+FDB3		<final> 0646 062D 064A
+FDB4		<initial> 0642 0645 062D
+FDB5		<initial> 0644 062D 0645
+FDB6		<final> 0639 0645 064A
+FDB7		<final> 0643 0645 064A
+FDB8		<initial> 0646 062C 062D
+FDB9		<final> 0645 062E 064A
+FDBA		<initial> 0644 062C 0645
+FDBB		<final> 0643 0645 0645
+FDBC		<final> 0644 062C 0645
+FDBD		<final> 0646 062C 062D
+FDBE		<final> 062C 062D 064A
+FDBF		<final> 062D 062C 064A
+FDC0		<final> 0645 062C 064A
+FDC1		<final> 0641 0645 064A
+FDC2		<final> 0628 062D 064A
+FDC3		<initial> 0643 0645 0645
+FDC4		<initial> 0639 062C 0645
+FDC5		<initial> 0635 0645 0645
+FDC6		<final> 0633 062E 064A
+FDC7		<final> 0646 062C 064A
+FDF0		<isolated> 0635 0644 06D2
+FDF1		<isolated> 0642 0644 06D2
+FDF2		<isolated> 0627 0644 0644 0647
+FDF3		<isolated> 0627 0643 0628 0631
+FDF4		<isolated> 0645 062D 0645 062F
+FDF5		<isolated> 0635 0644 0639 0645
+FDF6		<isolated> 0631 0633 0648 0644
+FDF7		<isolated> 0639 0644 064A 0647
+FDF8		<isolated> 0648 0633 0644 0645
+FDF9		<isolated> 0635 0644 0649
+FDFA		<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645
+FDFB		<isolated> 062C 0644 0020 062C 0644 0627 0644 0647
+FDFC		<isolated> 0631 06CC 0627 0644
+FE10		<vertical> 002C
+FE11		<vertical> 3001
+FE12		<vertical> 3002
+FE13		<vertical> 003A
+FE14		<vertical> 003B
+FE15		<vertical> 0021
+FE16		<vertical> 003F
+FE17		<vertical> 3016
+FE18		<vertical> 3017
+FE19		<vertical> 2026
+FE30		<vertical> 2025
+FE31		<vertical> 2014
+FE32		<vertical> 2013
+FE33	FE34	<vertical> 005F
+FE35		<vertical> 0028
+FE36		<vertical> 0029
+FE37		<vertical> 007B
+FE38		<vertical> 007D
+FE39		<vertical> 3014
+FE3A		<vertical> 3015
+FE3B		<vertical> 3010
+FE3C		<vertical> 3011
+FE3D		<vertical> 300A
+FE3E		<vertical> 300B
+FE3F		<vertical> 3008
+FE40		<vertical> 3009
+FE41		<vertical> 300C
+FE42		<vertical> 300D
+FE43		<vertical> 300E
+FE44		<vertical> 300F
+FE47		<vertical> 005B
+FE48		<vertical> 005D
+FE49	FE4C	<compat> 203E
+FE4D	FE4F	<compat> 005F
+FE50		<small> 002C
+FE51		<small> 3001
+FE52		<small> 002E
+FE54		<small> 003B
+FE55		<small> 003A
+FE56		<small> 003F
+FE57		<small> 0021
+FE58		<small> 2014
+FE59		<small> 0028
+FE5A		<small> 0029
+FE5B		<small> 007B
+FE5C		<small> 007D
+FE5D		<small> 3014
+FE5E		<small> 3015
+FE5F		<small> 0023
+FE60		<small> 0026
+FE61		<small> 002A
+FE62		<small> 002B
+FE63		<small> 002D
+FE64		<small> 003C
+FE65		<small> 003E
+FE66		<small> 003D
+FE68		<small> 005C
+FE69		<small> 0024
+FE6A		<small> 0025
+FE6B		<small> 0040
+FE70		<isolated> 0020 064B
+FE71		<medial> 0640 064B
+FE72		<isolated> 0020 064C
+FE74		<isolated> 0020 064D
+FE76		<isolated> 0020 064E
+FE77		<medial> 0640 064E
+FE78		<isolated> 0020 064F
+FE79		<medial> 0640 064F
+FE7A		<isolated> 0020 0650
+FE7B		<medial> 0640 0650
+FE7C		<isolated> 0020 0651
+FE7D		<medial> 0640 0651
+FE7E		<isolated> 0020 0652
+FE7F		<medial> 0640 0652
+FE80		<isolated> 0621
+FE81		<isolated> 0622
+FE82		<final> 0622
+FE83		<isolated> 0623
+FE84		<final> 0623
+FE85		<isolated> 0624
+FE86		<final> 0624
+FE87		<isolated> 0625
+FE88		<final> 0625
+FE89		<isolated> 0626
+FE8A		<final> 0626
+FE8B		<initial> 0626
+FE8C		<medial> 0626
+FE8D		<isolated> 0627
+FE8E		<final> 0627
+FE8F		<isolated> 0628
+FE90		<final> 0628
+FE91		<initial> 0628
+FE92		<medial> 0628
+FE93		<isolated> 0629
+FE94		<final> 0629
+FE95		<isolated> 062A
+FE96		<final> 062A
+FE97		<initial> 062A
+FE98		<medial> 062A
+FE99		<isolated> 062B
+FE9A		<final> 062B
+FE9B		<initial> 062B
+FE9C		<medial> 062B
+FE9D		<isolated> 062C
+FE9E		<final> 062C
+FE9F		<initial> 062C
+FEA0		<medial> 062C
+FEA1		<isolated> 062D
+FEA2		<final> 062D
+FEA3		<initial> 062D
+FEA4		<medial> 062D
+FEA5		<isolated> 062E
+FEA6		<final> 062E
+FEA7		<initial> 062E
+FEA8		<medial> 062E
+FEA9		<isolated> 062F
+FEAA		<final> 062F
+FEAB		<isolated> 0630
+FEAC		<final> 0630
+FEAD		<isolated> 0631
+FEAE		<final> 0631
+FEAF		<isolated> 0632
+FEB0		<final> 0632
+FEB1		<isolated> 0633
+FEB2		<final> 0633
+FEB3		<initial> 0633
+FEB4		<medial> 0633
+FEB5		<isolated> 0634
+FEB6		<final> 0634
+FEB7		<initial> 0634
+FEB8		<medial> 0634
+FEB9		<isolated> 0635
+FEBA		<final> 0635
+FEBB		<initial> 0635
+FEBC		<medial> 0635
+FEBD		<isolated> 0636
+FEBE		<final> 0636
+FEBF		<initial> 0636
+FEC0		<medial> 0636
+FEC1		<isolated> 0637
+FEC2		<final> 0637
+FEC3		<initial> 0637
+FEC4		<medial> 0637
+FEC5		<isolated> 0638
+FEC6		<final> 0638
+FEC7		<initial> 0638
+FEC8		<medial> 0638
+FEC9		<isolated> 0639
+FECA		<final> 0639
+FECB		<initial> 0639
+FECC		<medial> 0639
+FECD		<isolated> 063A
+FECE		<final> 063A
+FECF		<initial> 063A
+FED0		<medial> 063A
+FED1		<isolated> 0641
+FED2		<final> 0641
+FED3		<initial> 0641
+FED4		<medial> 0641
+FED5		<isolated> 0642
+FED6		<final> 0642
+FED7		<initial> 0642
+FED8		<medial> 0642
+FED9		<isolated> 0643
+FEDA		<final> 0643
+FEDB		<initial> 0643
+FEDC		<medial> 0643
+FEDD		<isolated> 0644
+FEDE		<final> 0644
+FEDF		<initial> 0644
+FEE0		<medial> 0644
+FEE1		<isolated> 0645
+FEE2		<final> 0645
+FEE3		<initial> 0645
+FEE4		<medial> 0645
+FEE5		<isolated> 0646
+FEE6		<final> 0646
+FEE7		<initial> 0646
+FEE8		<medial> 0646
+FEE9		<isolated> 0647
+FEEA		<final> 0647
+FEEB		<initial> 0647
+FEEC		<medial> 0647
+FEED		<isolated> 0648
+FEEE		<final> 0648
+FEEF		<isolated> 0649
+FEF0		<final> 0649
+FEF1		<isolated> 064A
+FEF2		<final> 064A
+FEF3		<initial> 064A
+FEF4		<medial> 064A
+FEF5		<isolated> 0644 0622
+FEF6		<final> 0644 0622
+FEF7		<isolated> 0644 0623
+FEF8		<final> 0644 0623
+FEF9		<isolated> 0644 0625
+FEFA		<final> 0644 0625
+FEFB		<isolated> 0644 0627
+FEFC		<final> 0644 0627
+FF01		<wide> 0021
+FF02		<wide> 0022
+FF03		<wide> 0023
+FF04		<wide> 0024
+FF05		<wide> 0025
+FF06		<wide> 0026
+FF07		<wide> 0027
+FF08		<wide> 0028
+FF09		<wide> 0029
+FF0A		<wide> 002A
+FF0B		<wide> 002B
+FF0C		<wide> 002C
+FF0D		<wide> 002D
+FF0E		<wide> 002E
+FF0F		<wide> 002F
+FF10		<wide> 0030
+FF11		<wide> 0031
+FF12		<wide> 0032
+FF13		<wide> 0033
+FF14		<wide> 0034
+FF15		<wide> 0035
+FF16		<wide> 0036
+FF17		<wide> 0037
+FF18		<wide> 0038
+FF19		<wide> 0039
+FF1A		<wide> 003A
+FF1B		<wide> 003B
+FF1C		<wide> 003C
+FF1D		<wide> 003D
+FF1E		<wide> 003E
+FF1F		<wide> 003F
+FF20		<wide> 0040
+FF21		<wide> 0041
+FF22		<wide> 0042
+FF23		<wide> 0043
+FF24		<wide> 0044
+FF25		<wide> 0045
+FF26		<wide> 0046
+FF27		<wide> 0047
+FF28		<wide> 0048
+FF29		<wide> 0049
+FF2A		<wide> 004A
+FF2B		<wide> 004B
+FF2C		<wide> 004C
+FF2D		<wide> 004D
+FF2E		<wide> 004E
+FF2F		<wide> 004F
+FF30		<wide> 0050
+FF31		<wide> 0051
+FF32		<wide> 0052
+FF33		<wide> 0053
+FF34		<wide> 0054
+FF35		<wide> 0055
+FF36		<wide> 0056
+FF37		<wide> 0057
+FF38		<wide> 0058
+FF39		<wide> 0059
+FF3A		<wide> 005A
+FF3B		<wide> 005B
+FF3C		<wide> 005C
+FF3D		<wide> 005D
+FF3E		<wide> 005E
+FF3F		<wide> 005F
+FF40		<wide> 0060
+FF41		<wide> 0061
+FF42		<wide> 0062
+FF43		<wide> 0063
+FF44		<wide> 0064
+FF45		<wide> 0065
+FF46		<wide> 0066
+FF47		<wide> 0067
+FF48		<wide> 0068
+FF49		<wide> 0069
+FF4A		<wide> 006A
+FF4B		<wide> 006B
+FF4C		<wide> 006C
+FF4D		<wide> 006D
+FF4E		<wide> 006E
+FF4F		<wide> 006F
+FF50		<wide> 0070
+FF51		<wide> 0071
+FF52		<wide> 0072
+FF53		<wide> 0073
+FF54		<wide> 0074
+FF55		<wide> 0075
+FF56		<wide> 0076
+FF57		<wide> 0077
+FF58		<wide> 0078
+FF59		<wide> 0079
+FF5A		<wide> 007A
+FF5B		<wide> 007B
+FF5C		<wide> 007C
+FF5D		<wide> 007D
+FF5E		<wide> 007E
+FF5F		<wide> 2985
+FF60		<wide> 2986
+FF61		<narrow> 3002
+FF62		<narrow> 300C
+FF63		<narrow> 300D
+FF64		<narrow> 3001
+FF65		<narrow> 30FB
+FF66		<narrow> 30F2
+FF67		<narrow> 30A1
+FF68		<narrow> 30A3
+FF69		<narrow> 30A5
+FF6A		<narrow> 30A7
+FF6B		<narrow> 30A9
+FF6C		<narrow> 30E3
+FF6D		<narrow> 30E5
+FF6E		<narrow> 30E7
+FF6F		<narrow> 30C3
+FF70		<narrow> 30FC
+FF71		<narrow> 30A2
+FF72		<narrow> 30A4
+FF73		<narrow> 30A6
+FF74		<narrow> 30A8
+FF75		<narrow> 30AA
+FF76		<narrow> 30AB
+FF77		<narrow> 30AD
+FF78		<narrow> 30AF
+FF79		<narrow> 30B1
+FF7A		<narrow> 30B3
+FF7B		<narrow> 30B5
+FF7C		<narrow> 30B7
+FF7D		<narrow> 30B9
+FF7E		<narrow> 30BB
+FF7F		<narrow> 30BD
+FF80		<narrow> 30BF
+FF81		<narrow> 30C1
+FF82		<narrow> 30C4
+FF83		<narrow> 30C6
+FF84		<narrow> 30C8
+FF85		<narrow> 30CA
+FF86		<narrow> 30CB
+FF87		<narrow> 30CC
+FF88		<narrow> 30CD
+FF89		<narrow> 30CE
+FF8A		<narrow> 30CF
+FF8B		<narrow> 30D2
+FF8C		<narrow> 30D5
+FF8D		<narrow> 30D8
+FF8E		<narrow> 30DB
+FF8F		<narrow> 30DE
+FF90		<narrow> 30DF
+FF91		<narrow> 30E0
+FF92		<narrow> 30E1
+FF93		<narrow> 30E2
+FF94		<narrow> 30E4
+FF95		<narrow> 30E6
+FF96		<narrow> 30E8
+FF97		<narrow> 30E9
+FF98		<narrow> 30EA
+FF99		<narrow> 30EB
+FF9A		<narrow> 30EC
+FF9B		<narrow> 30ED
+FF9C		<narrow> 30EF
+FF9D		<narrow> 30F3
+FF9E		<narrow> 3099
+FF9F		<narrow> 309A
+FFA0		<narrow> 3164
+FFA1		<narrow> 3131
+FFA2		<narrow> 3132
+FFA3		<narrow> 3133
+FFA4		<narrow> 3134
+FFA5		<narrow> 3135
+FFA6		<narrow> 3136
+FFA7		<narrow> 3137
+FFA8		<narrow> 3138
+FFA9		<narrow> 3139
+FFAA		<narrow> 313A
+FFAB		<narrow> 313B
+FFAC		<narrow> 313C
+FFAD		<narrow> 313D
+FFAE		<narrow> 313E
+FFAF		<narrow> 313F
+FFB0		<narrow> 3140
+FFB1		<narrow> 3141
+FFB2		<narrow> 3142
+FFB3		<narrow> 3143
+FFB4		<narrow> 3144
+FFB5		<narrow> 3145
+FFB6		<narrow> 3146
+FFB7		<narrow> 3147
+FFB8		<narrow> 3148
+FFB9		<narrow> 3149
+FFBA		<narrow> 314A
+FFBB		<narrow> 314B
+FFBC		<narrow> 314C
+FFBD		<narrow> 314D
+FFBE		<narrow> 314E
+FFC2		<narrow> 314F
+FFC3		<narrow> 3150
+FFC4		<narrow> 3151
+FFC5		<narrow> 3152
+FFC6		<narrow> 3153
+FFC7		<narrow> 3154
+FFCA		<narrow> 3155
+FFCB		<narrow> 3156
+FFCC		<narrow> 3157
+FFCD		<narrow> 3158
+FFCE		<narrow> 3159
+FFCF		<narrow> 315A
+FFD2		<narrow> 315B
+FFD3		<narrow> 315C
+FFD4		<narrow> 315D
+FFD5		<narrow> 315E
+FFD6		<narrow> 315F
+FFD7		<narrow> 3160
+FFDA		<narrow> 3161
+FFDB		<narrow> 3162
+FFDC		<narrow> 3163
+FFE0		<wide> 00A2
+FFE1		<wide> 00A3
+FFE2		<wide> 00AC
+FFE3		<wide> 00AF
+FFE4		<wide> 00A6
+FFE5		<wide> 00A5
+FFE6		<wide> 20A9
+FFE8		<narrow> 2502
+FFE9		<narrow> 2190
+FFEA		<narrow> 2191
+FFEB		<narrow> 2192
+FFEC		<narrow> 2193
+FFED		<narrow> 25A0
+FFEE		<narrow> 25CB
+1D15E		1D157 1D165
+1D15F		1D158 1D165
+1D160		1D15F 1D16E
+1D161		1D15F 1D16F
+1D162		1D15F 1D170
+1D163		1D15F 1D171
+1D164		1D15F 1D172
+1D1BB		1D1B9 1D165
+1D1BC		1D1BA 1D165
+1D1BD		1D1BB 1D16E
+1D1BE		1D1BC 1D16E
+1D1BF		1D1BB 1D16F
+1D1C0		1D1BC 1D16F
+1D400		<font> 0041
+1D401		<font> 0042
+1D402		<font> 0043
+1D403		<font> 0044
+1D404		<font> 0045
+1D405		<font> 0046
+1D406		<font> 0047
+1D407		<font> 0048
+1D408		<font> 0049
+1D409		<font> 004A
+1D40A		<font> 004B
+1D40B		<font> 004C
+1D40C		<font> 004D
+1D40D		<font> 004E
+1D40E		<font> 004F
+1D40F		<font> 0050
+1D410		<font> 0051
+1D411		<font> 0052
+1D412		<font> 0053
+1D413		<font> 0054
+1D414		<font> 0055
+1D415		<font> 0056
+1D416		<font> 0057
+1D417		<font> 0058
+1D418		<font> 0059
+1D419		<font> 005A
+1D41A		<font> 0061
+1D41B		<font> 0062
+1D41C		<font> 0063
+1D41D		<font> 0064
+1D41E		<font> 0065
+1D41F		<font> 0066
+1D420		<font> 0067
+1D421		<font> 0068
+1D422		<font> 0069
+1D423		<font> 006A
+1D424		<font> 006B
+1D425		<font> 006C
+1D426		<font> 006D
+1D427		<font> 006E
+1D428		<font> 006F
+1D429		<font> 0070
+1D42A		<font> 0071
+1D42B		<font> 0072
+1D42C		<font> 0073
+1D42D		<font> 0074
+1D42E		<font> 0075
+1D42F		<font> 0076
+1D430		<font> 0077
+1D431		<font> 0078
+1D432		<font> 0079
+1D433		<font> 007A
+1D434		<font> 0041
+1D435		<font> 0042
+1D436		<font> 0043
+1D437		<font> 0044
+1D438		<font> 0045
+1D439		<font> 0046
+1D43A		<font> 0047
+1D43B		<font> 0048
+1D43C		<font> 0049
+1D43D		<font> 004A
+1D43E		<font> 004B
+1D43F		<font> 004C
+1D440		<font> 004D
+1D441		<font> 004E
+1D442		<font> 004F
+1D443		<font> 0050
+1D444		<font> 0051
+1D445		<font> 0052
+1D446		<font> 0053
+1D447		<font> 0054
+1D448		<font> 0055
+1D449		<font> 0056
+1D44A		<font> 0057
+1D44B		<font> 0058
+1D44C		<font> 0059
+1D44D		<font> 005A
+1D44E		<font> 0061
+1D44F		<font> 0062
+1D450		<font> 0063
+1D451		<font> 0064
+1D452		<font> 0065
+1D453		<font> 0066
+1D454		<font> 0067
+1D456		<font> 0069
+1D457		<font> 006A
+1D458		<font> 006B
+1D459		<font> 006C
+1D45A		<font> 006D
+1D45B		<font> 006E
+1D45C		<font> 006F
+1D45D		<font> 0070
+1D45E		<font> 0071
+1D45F		<font> 0072
+1D460		<font> 0073
+1D461		<font> 0074
+1D462		<font> 0075
+1D463		<font> 0076
+1D464		<font> 0077
+1D465		<font> 0078
+1D466		<font> 0079
+1D467		<font> 007A
+1D468		<font> 0041
+1D469		<font> 0042
+1D46A		<font> 0043
+1D46B		<font> 0044
+1D46C		<font> 0045
+1D46D		<font> 0046
+1D46E		<font> 0047
+1D46F		<font> 0048
+1D470		<font> 0049
+1D471		<font> 004A
+1D472		<font> 004B
+1D473		<font> 004C
+1D474		<font> 004D
+1D475		<font> 004E
+1D476		<font> 004F
+1D477		<font> 0050
+1D478		<font> 0051
+1D479		<font> 0052
+1D47A		<font> 0053
+1D47B		<font> 0054
+1D47C		<font> 0055
+1D47D		<font> 0056
+1D47E		<font> 0057
+1D47F		<font> 0058
+1D480		<font> 0059
+1D481		<font> 005A
+1D482		<font> 0061
+1D483		<font> 0062
+1D484		<font> 0063
+1D485		<font> 0064
+1D486		<font> 0065
+1D487		<font> 0066
+1D488		<font> 0067
+1D489		<font> 0068
+1D48A		<font> 0069
+1D48B		<font> 006A
+1D48C		<font> 006B
+1D48D		<font> 006C
+1D48E		<font> 006D
+1D48F		<font> 006E
+1D490		<font> 006F
+1D491		<font> 0070
+1D492		<font> 0071
+1D493		<font> 0072
+1D494		<font> 0073
+1D495		<font> 0074
+1D496		<font> 0075
+1D497		<font> 0076
+1D498		<font> 0077
+1D499		<font> 0078
+1D49A		<font> 0079
+1D49B		<font> 007A
+1D49C		<font> 0041
+1D49E		<font> 0043
+1D49F		<font> 0044
+1D4A2		<font> 0047
+1D4A5		<font> 004A
+1D4A6		<font> 004B
+1D4A9		<font> 004E
+1D4AA		<font> 004F
+1D4AB		<font> 0050
+1D4AC		<font> 0051
+1D4AE		<font> 0053
+1D4AF		<font> 0054
+1D4B0		<font> 0055
+1D4B1		<font> 0056
+1D4B2		<font> 0057
+1D4B3		<font> 0058
+1D4B4		<font> 0059
+1D4B5		<font> 005A
+1D4B6		<font> 0061
+1D4B7		<font> 0062
+1D4B8		<font> 0063
+1D4B9		<font> 0064
+1D4BB		<font> 0066
+1D4BD		<font> 0068
+1D4BE		<font> 0069
+1D4BF		<font> 006A
+1D4C0		<font> 006B
+1D4C1		<font> 006C
+1D4C2		<font> 006D
+1D4C3		<font> 006E
+1D4C5		<font> 0070
+1D4C6		<font> 0071
+1D4C7		<font> 0072
+1D4C8		<font> 0073
+1D4C9		<font> 0074
+1D4CA		<font> 0075
+1D4CB		<font> 0076
+1D4CC		<font> 0077
+1D4CD		<font> 0078
+1D4CE		<font> 0079
+1D4CF		<font> 007A
+1D4D0		<font> 0041
+1D4D1		<font> 0042
+1D4D2		<font> 0043
+1D4D3		<font> 0044
+1D4D4		<font> 0045
+1D4D5		<font> 0046
+1D4D6		<font> 0047
+1D4D7		<font> 0048
+1D4D8		<font> 0049
+1D4D9		<font> 004A
+1D4DA		<font> 004B
+1D4DB		<font> 004C
+1D4DC		<font> 004D
+1D4DD		<font> 004E
+1D4DE		<font> 004F
+1D4DF		<font> 0050
+1D4E0		<font> 0051
+1D4E1		<font> 0052
+1D4E2		<font> 0053
+1D4E3		<font> 0054
+1D4E4		<font> 0055
+1D4E5		<font> 0056
+1D4E6		<font> 0057
+1D4E7		<font> 0058
+1D4E8		<font> 0059
+1D4E9		<font> 005A
+1D4EA		<font> 0061
+1D4EB		<font> 0062
+1D4EC		<font> 0063
+1D4ED		<font> 0064
+1D4EE		<font> 0065
+1D4EF		<font> 0066
+1D4F0		<font> 0067
+1D4F1		<font> 0068
+1D4F2		<font> 0069
+1D4F3		<font> 006A
+1D4F4		<font> 006B
+1D4F5		<font> 006C
+1D4F6		<font> 006D
+1D4F7		<font> 006E
+1D4F8		<font> 006F
+1D4F9		<font> 0070
+1D4FA		<font> 0071
+1D4FB		<font> 0072
+1D4FC		<font> 0073
+1D4FD		<font> 0074
+1D4FE		<font> 0075
+1D4FF		<font> 0076
+1D500		<font> 0077
+1D501		<font> 0078
+1D502		<font> 0079
+1D503		<font> 007A
+1D504		<font> 0041
+1D505		<font> 0042
+1D507		<font> 0044
+1D508		<font> 0045
+1D509		<font> 0046
+1D50A		<font> 0047
+1D50D		<font> 004A
+1D50E		<font> 004B
+1D50F		<font> 004C
+1D510		<font> 004D
+1D511		<font> 004E
+1D512		<font> 004F
+1D513		<font> 0050
+1D514		<font> 0051
+1D516		<font> 0053
+1D517		<font> 0054
+1D518		<font> 0055
+1D519		<font> 0056
+1D51A		<font> 0057
+1D51B		<font> 0058
+1D51C		<font> 0059
+1D51E		<font> 0061
+1D51F		<font> 0062
+1D520		<font> 0063
+1D521		<font> 0064
+1D522		<font> 0065
+1D523		<font> 0066
+1D524		<font> 0067
+1D525		<font> 0068
+1D526		<font> 0069
+1D527		<font> 006A
+1D528		<font> 006B
+1D529		<font> 006C
+1D52A		<font> 006D
+1D52B		<font> 006E
+1D52C		<font> 006F
+1D52D		<font> 0070
+1D52E		<font> 0071
+1D52F		<font> 0072
+1D530		<font> 0073
+1D531		<font> 0074
+1D532		<font> 0075
+1D533		<font> 0076
+1D534		<font> 0077
+1D535		<font> 0078
+1D536		<font> 0079
+1D537		<font> 007A
+1D538		<font> 0041
+1D539		<font> 0042
+1D53B		<font> 0044
+1D53C		<font> 0045
+1D53D		<font> 0046
+1D53E		<font> 0047
+1D540		<font> 0049
+1D541		<font> 004A
+1D542		<font> 004B
+1D543		<font> 004C
+1D544		<font> 004D
+1D546		<font> 004F
+1D54A		<font> 0053
+1D54B		<font> 0054
+1D54C		<font> 0055
+1D54D		<font> 0056
+1D54E		<font> 0057
+1D54F		<font> 0058
+1D550		<font> 0059
+1D552		<font> 0061
+1D553		<font> 0062
+1D554		<font> 0063
+1D555		<font> 0064
+1D556		<font> 0065
+1D557		<font> 0066
+1D558		<font> 0067
+1D559		<font> 0068
+1D55A		<font> 0069
+1D55B		<font> 006A
+1D55C		<font> 006B
+1D55D		<font> 006C
+1D55E		<font> 006D
+1D55F		<font> 006E
+1D560		<font> 006F
+1D561		<font> 0070
+1D562		<font> 0071
+1D563		<font> 0072
+1D564		<font> 0073
+1D565		<font> 0074
+1D566		<font> 0075
+1D567		<font> 0076
+1D568		<font> 0077
+1D569		<font> 0078
+1D56A		<font> 0079
+1D56B		<font> 007A
+1D56C		<font> 0041
+1D56D		<font> 0042
+1D56E		<font> 0043
+1D56F		<font> 0044
+1D570		<font> 0045
+1D571		<font> 0046
+1D572		<font> 0047
+1D573		<font> 0048
+1D574		<font> 0049
+1D575		<font> 004A
+1D576		<font> 004B
+1D577		<font> 004C
+1D578		<font> 004D
+1D579		<font> 004E
+1D57A		<font> 004F
+1D57B		<font> 0050
+1D57C		<font> 0051
+1D57D		<font> 0052
+1D57E		<font> 0053
+1D57F		<font> 0054
+1D580		<font> 0055
+1D581		<font> 0056
+1D582		<font> 0057
+1D583		<font> 0058
+1D584		<font> 0059
+1D585		<font> 005A
+1D586		<font> 0061
+1D587		<font> 0062
+1D588		<font> 0063
+1D589		<font> 0064
+1D58A		<font> 0065
+1D58B		<font> 0066
+1D58C		<font> 0067
+1D58D		<font> 0068
+1D58E		<font> 0069
+1D58F		<font> 006A
+1D590		<font> 006B
+1D591		<font> 006C
+1D592		<font> 006D
+1D593		<font> 006E
+1D594		<font> 006F
+1D595		<font> 0070
+1D596		<font> 0071
+1D597		<font> 0072
+1D598		<font> 0073
+1D599		<font> 0074
+1D59A		<font> 0075
+1D59B		<font> 0076
+1D59C		<font> 0077
+1D59D		<font> 0078
+1D59E		<font> 0079
+1D59F		<font> 007A
+1D5A0		<font> 0041
+1D5A1		<font> 0042
+1D5A2		<font> 0043
+1D5A3		<font> 0044
+1D5A4		<font> 0045
+1D5A5		<font> 0046
+1D5A6		<font> 0047
+1D5A7		<font> 0048
+1D5A8		<font> 0049
+1D5A9		<font> 004A
+1D5AA		<font> 004B
+1D5AB		<font> 004C
+1D5AC		<font> 004D
+1D5AD		<font> 004E
+1D5AE		<font> 004F
+1D5AF		<font> 0050
+1D5B0		<font> 0051
+1D5B1		<font> 0052
+1D5B2		<font> 0053
+1D5B3		<font> 0054
+1D5B4		<font> 0055
+1D5B5		<font> 0056
+1D5B6		<font> 0057
+1D5B7		<font> 0058
+1D5B8		<font> 0059
+1D5B9		<font> 005A
+1D5BA		<font> 0061
+1D5BB		<font> 0062
+1D5BC		<font> 0063
+1D5BD		<font> 0064
+1D5BE		<font> 0065
+1D5BF		<font> 0066
+1D5C0		<font> 0067
+1D5C1		<font> 0068
+1D5C2		<font> 0069
+1D5C3		<font> 006A
+1D5C4		<font> 006B
+1D5C5		<font> 006C
+1D5C6		<font> 006D
+1D5C7		<font> 006E
+1D5C8		<font> 006F
+1D5C9		<font> 0070
+1D5CA		<font> 0071
+1D5CB		<font> 0072
+1D5CC		<font> 0073
+1D5CD		<font> 0074
+1D5CE		<font> 0075
+1D5CF		<font> 0076
+1D5D0		<font> 0077
+1D5D1		<font> 0078
+1D5D2		<font> 0079
+1D5D3		<font> 007A
+1D5D4		<font> 0041
+1D5D5		<font> 0042
+1D5D6		<font> 0043
+1D5D7		<font> 0044
+1D5D8		<font> 0045
+1D5D9		<font> 0046
+1D5DA		<font> 0047
+1D5DB		<font> 0048
+1D5DC		<font> 0049
+1D5DD		<font> 004A
+1D5DE		<font> 004B
+1D5DF		<font> 004C
+1D5E0		<font> 004D
+1D5E1		<font> 004E
+1D5E2		<font> 004F
+1D5E3		<font> 0050
+1D5E4		<font> 0051
+1D5E5		<font> 0052
+1D5E6		<font> 0053
+1D5E7		<font> 0054
+1D5E8		<font> 0055
+1D5E9		<font> 0056
+1D5EA		<font> 0057
+1D5EB		<font> 0058
+1D5EC		<font> 0059
+1D5ED		<font> 005A
+1D5EE		<font> 0061
+1D5EF		<font> 0062
+1D5F0		<font> 0063
+1D5F1		<font> 0064
+1D5F2		<font> 0065
+1D5F3		<font> 0066
+1D5F4		<font> 0067
+1D5F5		<font> 0068
+1D5F6		<font> 0069
+1D5F7		<font> 006A
+1D5F8		<font> 006B
+1D5F9		<font> 006C
+1D5FA		<font> 006D
+1D5FB		<font> 006E
+1D5FC		<font> 006F
+1D5FD		<font> 0070
+1D5FE		<font> 0071
+1D5FF		<font> 0072
+1D600		<font> 0073
+1D601		<font> 0074
+1D602		<font> 0075
+1D603		<font> 0076
+1D604		<font> 0077
+1D605		<font> 0078
+1D606		<font> 0079
+1D607		<font> 007A
+1D608		<font> 0041
+1D609		<font> 0042
+1D60A		<font> 0043
+1D60B		<font> 0044
+1D60C		<font> 0045
+1D60D		<font> 0046
+1D60E		<font> 0047
+1D60F		<font> 0048
+1D610		<font> 0049
+1D611		<font> 004A
+1D612		<font> 004B
+1D613		<font> 004C
+1D614		<font> 004D
+1D615		<font> 004E
+1D616		<font> 004F
+1D617		<font> 0050
+1D618		<font> 0051
+1D619		<font> 0052
+1D61A		<font> 0053
+1D61B		<font> 0054
+1D61C		<font> 0055
+1D61D		<font> 0056
+1D61E		<font> 0057
+1D61F		<font> 0058
+1D620		<font> 0059
+1D621		<font> 005A
+1D622		<font> 0061
+1D623		<font> 0062
+1D624		<font> 0063
+1D625		<font> 0064
+1D626		<font> 0065
+1D627		<font> 0066
+1D628		<font> 0067
+1D629		<font> 0068
+1D62A		<font> 0069
+1D62B		<font> 006A
+1D62C		<font> 006B
+1D62D		<font> 006C
+1D62E		<font> 006D
+1D62F		<font> 006E
+1D630		<font> 006F
+1D631		<font> 0070
+1D632		<font> 0071
+1D633		<font> 0072
+1D634		<font> 0073
+1D635		<font> 0074
+1D636		<font> 0075
+1D637		<font> 0076
+1D638		<font> 0077
+1D639		<font> 0078
+1D63A		<font> 0079
+1D63B		<font> 007A
+1D63C		<font> 0041
+1D63D		<font> 0042
+1D63E		<font> 0043
+1D63F		<font> 0044
+1D640		<font> 0045
+1D641		<font> 0046
+1D642		<font> 0047
+1D643		<font> 0048
+1D644		<font> 0049
+1D645		<font> 004A
+1D646		<font> 004B
+1D647		<font> 004C
+1D648		<font> 004D
+1D649		<font> 004E
+1D64A		<font> 004F
+1D64B		<font> 0050
+1D64C		<font> 0051
+1D64D		<font> 0052
+1D64E		<font> 0053
+1D64F		<font> 0054
+1D650		<font> 0055
+1D651		<font> 0056
+1D652		<font> 0057
+1D653		<font> 0058
+1D654		<font> 0059
+1D655		<font> 005A
+1D656		<font> 0061
+1D657		<font> 0062
+1D658		<font> 0063
+1D659		<font> 0064
+1D65A		<font> 0065
+1D65B		<font> 0066
+1D65C		<font> 0067
+1D65D		<font> 0068
+1D65E		<font> 0069
+1D65F		<font> 006A
+1D660		<font> 006B
+1D661		<font> 006C
+1D662		<font> 006D
+1D663		<font> 006E
+1D664		<font> 006F
+1D665		<font> 0070
+1D666		<font> 0071
+1D667		<font> 0072
+1D668		<font> 0073
+1D669		<font> 0074
+1D66A		<font> 0075
+1D66B		<font> 0076
+1D66C		<font> 0077
+1D66D		<font> 0078
+1D66E		<font> 0079
+1D66F		<font> 007A
+1D670		<font> 0041
+1D671		<font> 0042
+1D672		<font> 0043
+1D673		<font> 0044
+1D674		<font> 0045
+1D675		<font> 0046
+1D676		<font> 0047
+1D677		<font> 0048
+1D678		<font> 0049
+1D679		<font> 004A
+1D67A		<font> 004B
+1D67B		<font> 004C
+1D67C		<font> 004D
+1D67D		<font> 004E
+1D67E		<font> 004F
+1D67F		<font> 0050
+1D680		<font> 0051
+1D681		<font> 0052
+1D682		<font> 0053
+1D683		<font> 0054
+1D684		<font> 0055
+1D685		<font> 0056
+1D686		<font> 0057
+1D687		<font> 0058
+1D688		<font> 0059
+1D689		<font> 005A
+1D68A		<font> 0061
+1D68B		<font> 0062
+1D68C		<font> 0063
+1D68D		<font> 0064
+1D68E		<font> 0065
+1D68F		<font> 0066
+1D690		<font> 0067
+1D691		<font> 0068
+1D692		<font> 0069
+1D693		<font> 006A
+1D694		<font> 006B
+1D695		<font> 006C
+1D696		<font> 006D
+1D697		<font> 006E
+1D698		<font> 006F
+1D699		<font> 0070
+1D69A		<font> 0071
+1D69B		<font> 0072
+1D69C		<font> 0073
+1D69D		<font> 0074
+1D69E		<font> 0075
+1D69F		<font> 0076
+1D6A0		<font> 0077
+1D6A1		<font> 0078
+1D6A2		<font> 0079
+1D6A3		<font> 007A
+1D6A4		<font> 0131
+1D6A5		<font> 0237
+1D6A8		<font> 0391
+1D6A9		<font> 0392
+1D6AA		<font> 0393
+1D6AB		<font> 0394
+1D6AC		<font> 0395
+1D6AD		<font> 0396
+1D6AE		<font> 0397
+1D6AF		<font> 0398
+1D6B0		<font> 0399
+1D6B1		<font> 039A
+1D6B2		<font> 039B
+1D6B3		<font> 039C
+1D6B4		<font> 039D
+1D6B5		<font> 039E
+1D6B6		<font> 039F
+1D6B7		<font> 03A0
+1D6B8		<font> 03A1
+1D6B9		<font> 03F4
+1D6BA		<font> 03A3
+1D6BB		<font> 03A4
+1D6BC		<font> 03A5
+1D6BD		<font> 03A6
+1D6BE		<font> 03A7
+1D6BF		<font> 03A8
+1D6C0		<font> 03A9
+1D6C1		<font> 2207
+1D6C2		<font> 03B1
+1D6C3		<font> 03B2
+1D6C4		<font> 03B3
+1D6C5		<font> 03B4
+1D6C6		<font> 03B5
+1D6C7		<font> 03B6
+1D6C8		<font> 03B7
+1D6C9		<font> 03B8
+1D6CA		<font> 03B9
+1D6CB		<font> 03BA
+1D6CC		<font> 03BB
+1D6CD		<font> 03BC
+1D6CE		<font> 03BD
+1D6CF		<font> 03BE
+1D6D0		<font> 03BF
+1D6D1		<font> 03C0
+1D6D2		<font> 03C1
+1D6D3		<font> 03C2
+1D6D4		<font> 03C3
+1D6D5		<font> 03C4
+1D6D6		<font> 03C5
+1D6D7		<font> 03C6
+1D6D8		<font> 03C7
+1D6D9		<font> 03C8
+1D6DA		<font> 03C9
+1D6DB		<font> 2202
+1D6DC		<font> 03F5
+1D6DD		<font> 03D1
+1D6DE		<font> 03F0
+1D6DF		<font> 03D5
+1D6E0		<font> 03F1
+1D6E1		<font> 03D6
+1D6E2		<font> 0391
+1D6E3		<font> 0392
+1D6E4		<font> 0393
+1D6E5		<font> 0394
+1D6E6		<font> 0395
+1D6E7		<font> 0396
+1D6E8		<font> 0397
+1D6E9		<font> 0398
+1D6EA		<font> 0399
+1D6EB		<font> 039A
+1D6EC		<font> 039B
+1D6ED		<font> 039C
+1D6EE		<font> 039D
+1D6EF		<font> 039E
+1D6F0		<font> 039F
+1D6F1		<font> 03A0
+1D6F2		<font> 03A1
+1D6F3		<font> 03F4
+1D6F4		<font> 03A3
+1D6F5		<font> 03A4
+1D6F6		<font> 03A5
+1D6F7		<font> 03A6
+1D6F8		<font> 03A7
+1D6F9		<font> 03A8
+1D6FA		<font> 03A9
+1D6FB		<font> 2207
+1D6FC		<font> 03B1
+1D6FD		<font> 03B2
+1D6FE		<font> 03B3
+1D6FF		<font> 03B4
+1D700		<font> 03B5
+1D701		<font> 03B6
+1D702		<font> 03B7
+1D703		<font> 03B8
+1D704		<font> 03B9
+1D705		<font> 03BA
+1D706		<font> 03BB
+1D707		<font> 03BC
+1D708		<font> 03BD
+1D709		<font> 03BE
+1D70A		<font> 03BF
+1D70B		<font> 03C0
+1D70C		<font> 03C1
+1D70D		<font> 03C2
+1D70E		<font> 03C3
+1D70F		<font> 03C4
+1D710		<font> 03C5
+1D711		<font> 03C6
+1D712		<font> 03C7
+1D713		<font> 03C8
+1D714		<font> 03C9
+1D715		<font> 2202
+1D716		<font> 03F5
+1D717		<font> 03D1
+1D718		<font> 03F0
+1D719		<font> 03D5
+1D71A		<font> 03F1
+1D71B		<font> 03D6
+1D71C		<font> 0391
+1D71D		<font> 0392
+1D71E		<font> 0393
+1D71F		<font> 0394
+1D720		<font> 0395
+1D721		<font> 0396
+1D722		<font> 0397
+1D723		<font> 0398
+1D724		<font> 0399
+1D725		<font> 039A
+1D726		<font> 039B
+1D727		<font> 039C
+1D728		<font> 039D
+1D729		<font> 039E
+1D72A		<font> 039F
+1D72B		<font> 03A0
+1D72C		<font> 03A1
+1D72D		<font> 03F4
+1D72E		<font> 03A3
+1D72F		<font> 03A4
+1D730		<font> 03A5
+1D731		<font> 03A6
+1D732		<font> 03A7
+1D733		<font> 03A8
+1D734		<font> 03A9
+1D735		<font> 2207
+1D736		<font> 03B1
+1D737		<font> 03B2
+1D738		<font> 03B3
+1D739		<font> 03B4
+1D73A		<font> 03B5
+1D73B		<font> 03B6
+1D73C		<font> 03B7
+1D73D		<font> 03B8
+1D73E		<font> 03B9
+1D73F		<font> 03BA
+1D740		<font> 03BB
+1D741		<font> 03BC
+1D742		<font> 03BD
+1D743		<font> 03BE
+1D744		<font> 03BF
+1D745		<font> 03C0
+1D746		<font> 03C1
+1D747		<font> 03C2
+1D748		<font> 03C3
+1D749		<font> 03C4
+1D74A		<font> 03C5
+1D74B		<font> 03C6
+1D74C		<font> 03C7
+1D74D		<font> 03C8
+1D74E		<font> 03C9
+1D74F		<font> 2202
+1D750		<font> 03F5
+1D751		<font> 03D1
+1D752		<font> 03F0
+1D753		<font> 03D5
+1D754		<font> 03F1
+1D755		<font> 03D6
+1D756		<font> 0391
+1D757		<font> 0392
+1D758		<font> 0393
+1D759		<font> 0394
+1D75A		<font> 0395
+1D75B		<font> 0396
+1D75C		<font> 0397
+1D75D		<font> 0398
+1D75E		<font> 0399
+1D75F		<font> 039A
+1D760		<font> 039B
+1D761		<font> 039C
+1D762		<font> 039D
+1D763		<font> 039E
+1D764		<font> 039F
+1D765		<font> 03A0
+1D766		<font> 03A1
+1D767		<font> 03F4
+1D768		<font> 03A3
+1D769		<font> 03A4
+1D76A		<font> 03A5
+1D76B		<font> 03A6
+1D76C		<font> 03A7
+1D76D		<font> 03A8
+1D76E		<font> 03A9
+1D76F		<font> 2207
+1D770		<font> 03B1
+1D771		<font> 03B2
+1D772		<font> 03B3
+1D773		<font> 03B4
+1D774		<font> 03B5
+1D775		<font> 03B6
+1D776		<font> 03B7
+1D777		<font> 03B8
+1D778		<font> 03B9
+1D779		<font> 03BA
+1D77A		<font> 03BB
+1D77B		<font> 03BC
+1D77C		<font> 03BD
+1D77D		<font> 03BE
+1D77E		<font> 03BF
+1D77F		<font> 03C0
+1D780		<font> 03C1
+1D781		<font> 03C2
+1D782		<font> 03C3
+1D783		<font> 03C4
+1D784		<font> 03C5
+1D785		<font> 03C6
+1D786		<font> 03C7
+1D787		<font> 03C8
+1D788		<font> 03C9
+1D789		<font> 2202
+1D78A		<font> 03F5
+1D78B		<font> 03D1
+1D78C		<font> 03F0
+1D78D		<font> 03D5
+1D78E		<font> 03F1
+1D78F		<font> 03D6
+1D790		<font> 0391
+1D791		<font> 0392
+1D792		<font> 0393
+1D793		<font> 0394
+1D794		<font> 0395
+1D795		<font> 0396
+1D796		<font> 0397
+1D797		<font> 0398
+1D798		<font> 0399
+1D799		<font> 039A
+1D79A		<font> 039B
+1D79B		<font> 039C
+1D79C		<font> 039D
+1D79D		<font> 039E
+1D79E		<font> 039F
+1D79F		<font> 03A0
+1D7A0		<font> 03A1
+1D7A1		<font> 03F4
+1D7A2		<font> 03A3
+1D7A3		<font> 03A4
+1D7A4		<font> 03A5
+1D7A5		<font> 03A6
+1D7A6		<font> 03A7
+1D7A7		<font> 03A8
+1D7A8		<font> 03A9
+1D7A9		<font> 2207
+1D7AA		<font> 03B1
+1D7AB		<font> 03B2
+1D7AC		<font> 03B3
+1D7AD		<font> 03B4
+1D7AE		<font> 03B5
+1D7AF		<font> 03B6
+1D7B0		<font> 03B7
+1D7B1		<font> 03B8
+1D7B2		<font> 03B9
+1D7B3		<font> 03BA
+1D7B4		<font> 03BB
+1D7B5		<font> 03BC
+1D7B6		<font> 03BD
+1D7B7		<font> 03BE
+1D7B8		<font> 03BF
+1D7B9		<font> 03C0
+1D7BA		<font> 03C1
+1D7BB		<font> 03C2
+1D7BC		<font> 03C3
+1D7BD		<font> 03C4
+1D7BE		<font> 03C5
+1D7BF		<font> 03C6
+1D7C0		<font> 03C7
+1D7C1		<font> 03C8
+1D7C2		<font> 03C9
+1D7C3		<font> 2202
+1D7C4		<font> 03F5
+1D7C5		<font> 03D1
+1D7C6		<font> 03F0
+1D7C7		<font> 03D5
+1D7C8		<font> 03F1
+1D7C9		<font> 03D6
+1D7CE		<font> 0030
+1D7CF		<font> 0031
+1D7D0		<font> 0032
+1D7D1		<font> 0033
+1D7D2		<font> 0034
+1D7D3		<font> 0035
+1D7D4		<font> 0036
+1D7D5		<font> 0037
+1D7D6		<font> 0038
+1D7D7		<font> 0039
+1D7D8		<font> 0030
+1D7D9		<font> 0031
+1D7DA		<font> 0032
+1D7DB		<font> 0033
+1D7DC		<font> 0034
+1D7DD		<font> 0035
+1D7DE		<font> 0036
+1D7DF		<font> 0037
+1D7E0		<font> 0038
+1D7E1		<font> 0039
+1D7E2		<font> 0030
+1D7E3		<font> 0031
+1D7E4		<font> 0032
+1D7E5		<font> 0033
+1D7E6		<font> 0034
+1D7E7		<font> 0035
+1D7E8		<font> 0036
+1D7E9		<font> 0037
+1D7EA		<font> 0038
+1D7EB		<font> 0039
+1D7EC		<font> 0030
+1D7ED		<font> 0031
+1D7EE		<font> 0032
+1D7EF		<font> 0033
+1D7F0		<font> 0034
+1D7F1		<font> 0035
+1D7F2		<font> 0036
+1D7F3		<font> 0037
+1D7F4		<font> 0038
+1D7F5		<font> 0039
+1D7F6		<font> 0030
+1D7F7		<font> 0031
+1D7F8		<font> 0032
+1D7F9		<font> 0033
+1D7FA		<font> 0034
+1D7FB		<font> 0035
+1D7FC		<font> 0036
+1D7FD		<font> 0037
+1D7FE		<font> 0038
+1D7FF		<font> 0039
+2F800		4E3D
+2F801		4E38
+2F802		4E41
+2F803		20122
+2F804		4F60
+2F805		4FAE
+2F806		4FBB
+2F807		5002
+2F808		507A
+2F809		5099
+2F80A		50E7
+2F80B		50CF
+2F80C		349E
+2F80D		2063A
+2F80E		514D
+2F80F		5154
+2F810		5164
+2F811		5177
+2F812		2051C
+2F813		34B9
+2F814		5167
+2F815		518D
+2F816		2054B
+2F817		5197
+2F818		51A4
+2F819		4ECC
+2F81A		51AC
+2F81B		51B5
+2F81C		291DF
+2F81D		51F5
+2F81E		5203
+2F81F		34DF
+2F820		523B
+2F821		5246
+2F822		5272
+2F823		5277
+2F824		3515
+2F825		52C7
+2F826		52C9
+2F827		52E4
+2F828		52FA
+2F829		5305
+2F82A		5306
+2F82B		5317
+2F82C		5349
+2F82D		5351
+2F82E		535A
+2F82F		5373
+2F830		537D
+2F831	2F833	537F
+2F834		20A2C
+2F835		7070
+2F836		53CA
+2F837		53DF
+2F838		20B63
+2F839		53EB
+2F83A		53F1
+2F83B		5406
+2F83C		549E
+2F83D		5438
+2F83E		5448
+2F83F		5468
+2F840		54A2
+2F841		54F6
+2F842		5510
+2F843		5553
+2F844		5563
+2F845	2F846	5584
+2F847		5599
+2F848		55AB
+2F849		55B3
+2F84A		55C2
+2F84B		5716
+2F84C		5606
+2F84D		5717
+2F84E		5651
+2F84F		5674
+2F850		5207
+2F851		58EE
+2F852		57CE
+2F853		57F4
+2F854		580D
+2F855		578B
+2F856		5832
+2F857		5831
+2F858		58AC
+2F859		214E4
+2F85A		58F2
+2F85B		58F7
+2F85C		5906
+2F85D		591A
+2F85E		5922
+2F85F		5962
+2F860		216A8
+2F861		216EA
+2F862		59EC
+2F863		5A1B
+2F864		5A27
+2F865		59D8
+2F866		5A66
+2F867		36EE
+2F868		36FC
+2F869		5B08
+2F86A	2F86B	5B3E
+2F86C		219C8
+2F86D		5BC3
+2F86E		5BD8
+2F86F		5BE7
+2F870		5BF3
+2F871		21B18
+2F872		5BFF
+2F873		5C06
+2F874		5F53
+2F875		5C22
+2F876		3781
+2F877		5C60
+2F878		5C6E
+2F879		5CC0
+2F87A		5C8D
+2F87B		21DE4
+2F87C		5D43
+2F87D		21DE6
+2F87E		5D6E
+2F87F		5D6B
+2F880		5D7C
+2F881		5DE1
+2F882		5DE2
+2F883		382F
+2F884		5DFD
+2F885		5E28
+2F886		5E3D
+2F887		5E69
+2F888		3862
+2F889		22183
+2F88A		387C
+2F88B		5EB0
+2F88C		5EB3
+2F88D		5EB6
+2F88E		5ECA
+2F88F		2A392
+2F890		5EFE
+2F891	2F892	22331
+2F893		8201
+2F894	2F895	5F22
+2F896		38C7
+2F897		232B8
+2F898		261DA
+2F899		5F62
+2F89A		5F6B
+2F89B		38E3
+2F89C		5F9A
+2F89D		5FCD
+2F89E		5FD7
+2F89F		5FF9
+2F8A0		6081
+2F8A1		393A
+2F8A2		391C
+2F8A3		6094
+2F8A4		226D4
+2F8A5		60C7
+2F8A6		6148
+2F8A7		614C
+2F8A8		614E
+2F8A9		614C
+2F8AA		617A
+2F8AB		618E
+2F8AC		61B2
+2F8AD		61A4
+2F8AE		61AF
+2F8AF		61DE
+2F8B0		61F2
+2F8B1		61F6
+2F8B2		6210
+2F8B3		621B
+2F8B4		625D
+2F8B5		62B1
+2F8B6		62D4
+2F8B7		6350
+2F8B8		22B0C
+2F8B9		633D
+2F8BA		62FC
+2F8BB		6368
+2F8BC		6383
+2F8BD		63E4
+2F8BE		22BF1
+2F8BF		6422
+2F8C0		63C5
+2F8C1		63A9
+2F8C2		3A2E
+2F8C3		6469
+2F8C4		647E
+2F8C5		649D
+2F8C6		6477
+2F8C7		3A6C
+2F8C8		654F
+2F8C9		656C
+2F8CA		2300A
+2F8CB		65E3
+2F8CC		66F8
+2F8CD		6649
+2F8CE		3B19
+2F8CF		6691
+2F8D0		3B08
+2F8D1		3AE4
+2F8D2		5192
+2F8D3		5195
+2F8D4		6700
+2F8D5		669C
+2F8D6		80AD
+2F8D7		43D9
+2F8D8		6717
+2F8D9		671B
+2F8DA		6721
+2F8DB		675E
+2F8DC		6753
+2F8DD		233C3
+2F8DE		3B49
+2F8DF		67FA
+2F8E0		6785
+2F8E1		6852
+2F8E2		6885
+2F8E3		2346D
+2F8E4		688E
+2F8E5		681F
+2F8E6		6914
+2F8E7		3B9D
+2F8E8		6942
+2F8E9		69A3
+2F8EA		69EA
+2F8EB		6AA8
+2F8EC		236A3
+2F8ED		6ADB
+2F8EE		3C18
+2F8EF		6B21
+2F8F0		238A7
+2F8F1		6B54
+2F8F2		3C4E
+2F8F3		6B72
+2F8F4		6B9F
+2F8F5		6BBA
+2F8F6		6BBB
+2F8F7		23A8D
+2F8F8		21D0B
+2F8F9		23AFA
+2F8FA		6C4E
+2F8FB		23CBC
+2F8FC		6CBF
+2F8FD		6CCD
+2F8FE		6C67
+2F8FF		6D16
+2F900		6D3E
+2F901		6D77
+2F902		6D41
+2F903		6D69
+2F904		6D78
+2F905		6D85
+2F906		23D1E
+2F907		6D34
+2F908		6E2F
+2F909		6E6E
+2F90A		3D33
+2F90B		6ECB
+2F90C		6EC7
+2F90D		23ED1
+2F90E		6DF9
+2F90F		6F6E
+2F910		23F5E
+2F911		23F8E
+2F912		6FC6
+2F913		7039
+2F914		701E
+2F915		701B
+2F916		3D96
+2F917		704A
+2F918		707D
+2F919		7077
+2F91A		70AD
+2F91B		20525
+2F91C		7145
+2F91D		24263
+2F91E		719C
+2F91F		243AB
+2F920		7228
+2F921		7235
+2F922		7250
+2F923		24608
+2F924		7280
+2F925		7295
+2F926		24735
+2F927		24814
+2F928		737A
+2F929		738B
+2F92A		3EAC
+2F92B		73A5
+2F92C	2F92D	3EB8
+2F92E		7447
+2F92F		745C
+2F930		7471
+2F931		7485
+2F932		74CA
+2F933		3F1B
+2F934		7524
+2F935		24C36
+2F936		753E
+2F937		24C92
+2F938		7570
+2F939		2219F
+2F93A		7610
+2F93B		24FA1
+2F93C		24FB8
+2F93D		25044
+2F93E		3FFC
+2F93F		4008
+2F940		76F4
+2F941		250F3
+2F942		250F2
+2F943		25119
+2F944		25133
+2F945		771E
+2F946	2F947	771F
+2F948		774A
+2F949		4039
+2F94A		778B
+2F94B		4046
+2F94C		4096
+2F94D		2541D
+2F94E		784E
+2F94F		788C
+2F950		78CC
+2F951		40E3
+2F952		25626
+2F953		7956
+2F954		2569A
+2F955		256C5
+2F956		798F
+2F957		79EB
+2F958		412F
+2F959		7A40
+2F95A		7A4A
+2F95B		7A4F
+2F95C		2597C
+2F95D	2F95E	25AA7
+2F95F		7AEE
+2F960		4202
+2F961		25BAB
+2F962		7BC6
+2F963		7BC9
+2F964		4227
+2F965		25C80
+2F966		7CD2
+2F967		42A0
+2F968		7CE8
+2F969		7CE3
+2F96A		7D00
+2F96B		25F86
+2F96C		7D63
+2F96D		4301
+2F96E		7DC7
+2F96F		7E02
+2F970		7E45
+2F971		4334
+2F972		26228
+2F973		26247
+2F974		4359
+2F975		262D9
+2F976		7F7A
+2F977		2633E
+2F978		7F95
+2F979		7FFA
+2F97A		8005
+2F97B		264DA
+2F97C		26523
+2F97D		8060
+2F97E		265A8
+2F97F		8070
+2F980		2335F
+2F981		43D5
+2F982		80B2
+2F983		8103
+2F984		440B
+2F985		813E
+2F986		5AB5
+2F987		267A7
+2F988		267B5
+2F989		23393
+2F98A		2339C
+2F98B		8201
+2F98C		8204
+2F98D		8F9E
+2F98E		446B
+2F98F		8291
+2F990		828B
+2F991		829D
+2F992		52B3
+2F993		82B1
+2F994		82B3
+2F995		82BD
+2F996		82E6
+2F997		26B3C
+2F998		82E5
+2F999		831D
+2F99A		8363
+2F99B		83AD
+2F99C		8323
+2F99D		83BD
+2F99E		83E7
+2F99F		8457
+2F9A0		8353
+2F9A1		83CA
+2F9A2		83CC
+2F9A3		83DC
+2F9A4		26C36
+2F9A5		26D6B
+2F9A6		26CD5
+2F9A7		452B
+2F9A8		84F1
+2F9A9		84F3
+2F9AA		8516
+2F9AB		273CA
+2F9AC		8564
+2F9AD		26F2C
+2F9AE		455D
+2F9AF		4561
+2F9B0		26FB1
+2F9B1		270D2
+2F9B2		456B
+2F9B3		8650
+2F9B4		865C
+2F9B5		8667
+2F9B6		8669
+2F9B7		86A9
+2F9B8		8688
+2F9B9		870E
+2F9BA		86E2
+2F9BB		8779
+2F9BC		8728
+2F9BD		876B
+2F9BE		8786
+2F9BF		45D7
+2F9C0		87E1
+2F9C1		8801
+2F9C2		45F9
+2F9C3		8860
+2F9C4		8863
+2F9C5		27667
+2F9C6		88D7
+2F9C7		88DE
+2F9C8		4635
+2F9C9		88FA
+2F9CA		34BB
+2F9CB		278AE
+2F9CC		27966
+2F9CD		46BE
+2F9CE		46C7
+2F9CF		8AA0
+2F9D0		8AED
+2F9D1		8B8A
+2F9D2		8C55
+2F9D3		27CA8
+2F9D4		8CAB
+2F9D5		8CC1
+2F9D6		8D1B
+2F9D7		8D77
+2F9D8		27F2F
+2F9D9		20804
+2F9DA		8DCB
+2F9DB		8DBC
+2F9DC		8DF0
+2F9DD		208DE
+2F9DE		8ED4
+2F9DF		8F38
+2F9E0		285D2
+2F9E1		285ED
+2F9E2		9094
+2F9E3		90F1
+2F9E4		9111
+2F9E5		2872E
+2F9E6		911B
+2F9E7		9238
+2F9E8		92D7
+2F9E9		92D8
+2F9EA		927C
+2F9EB		93F9
+2F9EC		9415
+2F9ED		28BFA
+2F9EE		958B
+2F9EF		4995
+2F9F0		95B7
+2F9F1		28D77
+2F9F2		49E6
+2F9F3		96C3
+2F9F4		5DB2
+2F9F5		9723
+2F9F6		29145
+2F9F7		2921A
+2F9F8		4A6E
+2F9F9		4A76
+2F9FA		97E0
+2F9FB		2940A
+2F9FC		4AB2
+2F9FD		29496
+2F9FE	2F9FF	980B
+2FA00		9829
+2FA01		295B6
+2FA02		98E2
+2FA03		4B33
+2FA04		9929
+2FA05		99A7
+2FA06		99C2
+2FA07		99FE
+2FA08		4BCE
+2FA09		29B30
+2FA0A		9B12
+2FA0B		9C40
+2FA0C		9CFD
+2FA0D		4CCE
+2FA0E		4CED
+2FA0F		9D67
+2FA10		2A0CE
+2FA11		4CF8
+2FA12		2A105
+2FA13		2A20E
+2FA14		2A291
+2FA15		9EBB
+2FA16		4D56
+2FA17		9EF9
+2FA18		9EFE
+2FA19		9F05
+2FA1A		9F0F
+2FA1B		9F16
+2FA1C		9F3B
+2FA1D		2A600
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/EastAsianWidth.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/EastAsianWidth.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/EastAsianWidth.txt	(revision 14489)
@@ -0,0 +1,16368 @@
+# EastAsianWidth-4.1.0.txt
+# Date: 2005-03-17, 15:21:00 PST [KW]
+#
+# East Asian Width Properties
+#
+# This file is an informative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# The format is two fields separated by a semicolon.
+# Field 0: Unicode value
+# Field 1: East Asian Width property, consisting of one of the following values:
+#         "N", "A", "H", "W", "F", "Na"
+#  - All code points, assigned or unassigned, that are not listed 
+#         explicitly are given the value "N".
+#  - Characters ranges are specified as for other property files in
+#         the Unicode Character Database.
+#
+# The Unicode name of each character is provided in a comment for help
+# in identifying the characters.
+#
+# See UAX #11: East Asian Character Width, for more information.
+0000;N # <control>
+0001;N # <control>
+0002;N # <control>
+0003;N # <control>
+0004;N # <control>
+0005;N # <control>
+0006;N # <control>
+0007;N # <control>
+0008;N # <control>
+0009;N # <control>
+000A;N # <control>
+000B;N # <control>
+000C;N # <control>
+000D;N # <control>
+000E;N # <control>
+000F;N # <control>
+0010;N # <control>
+0011;N # <control>
+0012;N # <control>
+0013;N # <control>
+0014;N # <control>
+0015;N # <control>
+0016;N # <control>
+0017;N # <control>
+0018;N # <control>
+0019;N # <control>
+001A;N # <control>
+001B;N # <control>
+001C;N # <control>
+001D;N # <control>
+001E;N # <control>
+001F;N # <control>
+0020;Na # SPACE
+0021;Na # EXCLAMATION MARK
+0022;Na # QUOTATION MARK
+0023;Na # NUMBER SIGN
+0024;Na # DOLLAR SIGN
+0025;Na # PERCENT SIGN
+0026;Na # AMPERSAND
+0027;Na # APOSTROPHE
+0028;Na # LEFT PARENTHESIS
+0029;Na # RIGHT PARENTHESIS
+002A;Na # ASTERISK
+002B;Na # PLUS SIGN
+002C;Na # COMMA
+002D;Na # HYPHEN-MINUS
+002E;Na # FULL STOP
+002F;Na # SOLIDUS
+0030;Na # DIGIT ZERO
+0031;Na # DIGIT ONE
+0032;Na # DIGIT TWO
+0033;Na # DIGIT THREE
+0034;Na # DIGIT FOUR
+0035;Na # DIGIT FIVE
+0036;Na # DIGIT SIX
+0037;Na # DIGIT SEVEN
+0038;Na # DIGIT EIGHT
+0039;Na # DIGIT NINE
+003A;Na # COLON
+003B;Na # SEMICOLON
+003C;Na # LESS-THAN SIGN
+003D;Na # EQUALS SIGN
+003E;Na # GREATER-THAN SIGN
+003F;Na # QUESTION MARK
+0040;Na # COMMERCIAL AT
+0041;Na # LATIN CAPITAL LETTER A
+0042;Na # LATIN CAPITAL LETTER B
+0043;Na # LATIN CAPITAL LETTER C
+0044;Na # LATIN CAPITAL LETTER D
+0045;Na # LATIN CAPITAL LETTER E
+0046;Na # LATIN CAPITAL LETTER F
+0047;Na # LATIN CAPITAL LETTER G
+0048;Na # LATIN CAPITAL LETTER H
+0049;Na # LATIN CAPITAL LETTER I
+004A;Na # LATIN CAPITAL LETTER J
+004B;Na # LATIN CAPITAL LETTER K
+004C;Na # LATIN CAPITAL LETTER L
+004D;Na # LATIN CAPITAL LETTER M
+004E;Na # LATIN CAPITAL LETTER N
+004F;Na # LATIN CAPITAL LETTER O
+0050;Na # LATIN CAPITAL LETTER P
+0051;Na # LATIN CAPITAL LETTER Q
+0052;Na # LATIN CAPITAL LETTER R
+0053;Na # LATIN CAPITAL LETTER S
+0054;Na # LATIN CAPITAL LETTER T
+0055;Na # LATIN CAPITAL LETTER U
+0056;Na # LATIN CAPITAL LETTER V
+0057;Na # LATIN CAPITAL LETTER W
+0058;Na # LATIN CAPITAL LETTER X
+0059;Na # LATIN CAPITAL LETTER Y
+005A;Na # LATIN CAPITAL LETTER Z
+005B;Na # LEFT SQUARE BRACKET
+005C;Na # REVERSE SOLIDUS
+005D;Na # RIGHT SQUARE BRACKET
+005E;Na # CIRCUMFLEX ACCENT
+005F;Na # LOW LINE
+0060;Na # GRAVE ACCENT
+0061;Na # LATIN SMALL LETTER A
+0062;Na # LATIN SMALL LETTER B
+0063;Na # LATIN SMALL LETTER C
+0064;Na # LATIN SMALL LETTER D
+0065;Na # LATIN SMALL LETTER E
+0066;Na # LATIN SMALL LETTER F
+0067;Na # LATIN SMALL LETTER G
+0068;Na # LATIN SMALL LETTER H
+0069;Na # LATIN SMALL LETTER I
+006A;Na # LATIN SMALL LETTER J
+006B;Na # LATIN SMALL LETTER K
+006C;Na # LATIN SMALL LETTER L
+006D;Na # LATIN SMALL LETTER M
+006E;Na # LATIN SMALL LETTER N
+006F;Na # LATIN SMALL LETTER O
+0070;Na # LATIN SMALL LETTER P
+0071;Na # LATIN SMALL LETTER Q
+0072;Na # LATIN SMALL LETTER R
+0073;Na # LATIN SMALL LETTER S
+0074;Na # LATIN SMALL LETTER T
+0075;Na # LATIN SMALL LETTER U
+0076;Na # LATIN SMALL LETTER V
+0077;Na # LATIN SMALL LETTER W
+0078;Na # LATIN SMALL LETTER X
+0079;Na # LATIN SMALL LETTER Y
+007A;Na # LATIN SMALL LETTER Z
+007B;Na # LEFT CURLY BRACKET
+007C;Na # VERTICAL LINE
+007D;Na # RIGHT CURLY BRACKET
+007E;Na # TILDE
+007F;N # <control>
+0080;N # <control>
+0081;N # <control>
+0082;N # <control>
+0083;N # <control>
+0084;N # <control>
+0085;N # <control>
+0086;N # <control>
+0087;N # <control>
+0088;N # <control>
+0089;N # <control>
+008A;N # <control>
+008B;N # <control>
+008C;N # <control>
+008D;N # <control>
+008E;N # <control>
+008F;N # <control>
+0090;N # <control>
+0091;N # <control>
+0092;N # <control>
+0093;N # <control>
+0094;N # <control>
+0095;N # <control>
+0096;N # <control>
+0097;N # <control>
+0098;N # <control>
+0099;N # <control>
+009A;N # <control>
+009B;N # <control>
+009C;N # <control>
+009D;N # <control>
+009E;N # <control>
+009F;N # <control>
+00A0;N # NO-BREAK SPACE
+00A1;A # INVERTED EXCLAMATION MARK
+00A2;Na # CENT SIGN
+00A3;Na # POUND SIGN
+00A4;A # CURRENCY SIGN
+00A5;Na # YEN SIGN
+00A6;Na # BROKEN BAR
+00A7;A # SECTION SIGN
+00A8;A # DIAERESIS
+00A9;N # COPYRIGHT SIGN
+00AA;A # FEMININE ORDINAL INDICATOR
+00AB;N # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC;Na # NOT SIGN
+00AD;A # SOFT HYPHEN
+00AE;A # REGISTERED SIGN
+00AF;Na # MACRON
+00B0;A # DEGREE SIGN
+00B1;A # PLUS-MINUS SIGN
+00B2;A # SUPERSCRIPT TWO
+00B3;A # SUPERSCRIPT THREE
+00B4;A # ACUTE ACCENT
+00B5;N # MICRO SIGN
+00B6;A # PILCROW SIGN
+00B7;A # MIDDLE DOT
+00B8;A # CEDILLA
+00B9;A # SUPERSCRIPT ONE
+00BA;A # MASCULINE ORDINAL INDICATOR
+00BB;N # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC;A # VULGAR FRACTION ONE QUARTER
+00BD;A # VULGAR FRACTION ONE HALF
+00BE;A # VULGAR FRACTION THREE QUARTERS
+00BF;A # INVERTED QUESTION MARK
+00C0;N # LATIN CAPITAL LETTER A WITH GRAVE
+00C1;N # LATIN CAPITAL LETTER A WITH ACUTE
+00C2;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3;N # LATIN CAPITAL LETTER A WITH TILDE
+00C4;N # LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5;N # LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6;A # LATIN CAPITAL LETTER AE
+00C7;N # LATIN CAPITAL LETTER C WITH CEDILLA
+00C8;N # LATIN CAPITAL LETTER E WITH GRAVE
+00C9;N # LATIN CAPITAL LETTER E WITH ACUTE
+00CA;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB;N # LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC;N # LATIN CAPITAL LETTER I WITH GRAVE
+00CD;N # LATIN CAPITAL LETTER I WITH ACUTE
+00CE;N # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF;N # LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0;A # LATIN CAPITAL LETTER ETH
+00D1;N # LATIN CAPITAL LETTER N WITH TILDE
+00D2;N # LATIN CAPITAL LETTER O WITH GRAVE
+00D3;N # LATIN CAPITAL LETTER O WITH ACUTE
+00D4;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5;N # LATIN CAPITAL LETTER O WITH TILDE
+00D6;N # LATIN CAPITAL LETTER O WITH DIAERESIS
+00D7;A # MULTIPLICATION SIGN
+00D8;A # LATIN CAPITAL LETTER O WITH STROKE
+00D9;N # LATIN CAPITAL LETTER U WITH GRAVE
+00DA;N # LATIN CAPITAL LETTER U WITH ACUTE
+00DB;N # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC;N # LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD;N # LATIN CAPITAL LETTER Y WITH ACUTE
+00DE;A # LATIN CAPITAL LETTER THORN
+00DF;A # LATIN SMALL LETTER SHARP S
+00E0;A # LATIN SMALL LETTER A WITH GRAVE
+00E1;A # LATIN SMALL LETTER A WITH ACUTE
+00E2;N # LATIN SMALL LETTER A WITH CIRCUMFLEX
+00E3;N # LATIN SMALL LETTER A WITH TILDE
+00E4;N # LATIN SMALL LETTER A WITH DIAERESIS
+00E5;N # LATIN SMALL LETTER A WITH RING ABOVE
+00E6;A # LATIN SMALL LETTER AE
+00E7;N # LATIN SMALL LETTER C WITH CEDILLA
+00E8;A # LATIN SMALL LETTER E WITH GRAVE
+00E9;A # LATIN SMALL LETTER E WITH ACUTE
+00EA;A # LATIN SMALL LETTER E WITH CIRCUMFLEX
+00EB;N # LATIN SMALL LETTER E WITH DIAERESIS
+00EC;A # LATIN SMALL LETTER I WITH GRAVE
+00ED;A # LATIN SMALL LETTER I WITH ACUTE
+00EE;N # LATIN SMALL LETTER I WITH CIRCUMFLEX
+00EF;N # LATIN SMALL LETTER I WITH DIAERESIS
+00F0;A # LATIN SMALL LETTER ETH
+00F1;N # LATIN SMALL LETTER N WITH TILDE
+00F2;A # LATIN SMALL LETTER O WITH GRAVE
+00F3;A # LATIN SMALL LETTER O WITH ACUTE
+00F4;N # LATIN SMALL LETTER O WITH CIRCUMFLEX
+00F5;N # LATIN SMALL LETTER O WITH TILDE
+00F6;N # LATIN SMALL LETTER O WITH DIAERESIS
+00F7;A # DIVISION SIGN
+00F8;A # LATIN SMALL LETTER O WITH STROKE
+00F9;A # LATIN SMALL LETTER U WITH GRAVE
+00FA;A # LATIN SMALL LETTER U WITH ACUTE
+00FB;N # LATIN SMALL LETTER U WITH CIRCUMFLEX
+00FC;A # LATIN SMALL LETTER U WITH DIAERESIS
+00FD;N # LATIN SMALL LETTER Y WITH ACUTE
+00FE;A # LATIN SMALL LETTER THORN
+00FF;N # LATIN SMALL LETTER Y WITH DIAERESIS
+0100;N # LATIN CAPITAL LETTER A WITH MACRON
+0101;A # LATIN SMALL LETTER A WITH MACRON
+0102;N # LATIN CAPITAL LETTER A WITH BREVE
+0103;N # LATIN SMALL LETTER A WITH BREVE
+0104;N # LATIN CAPITAL LETTER A WITH OGONEK
+0105;N # LATIN SMALL LETTER A WITH OGONEK
+0106;N # LATIN CAPITAL LETTER C WITH ACUTE
+0107;N # LATIN SMALL LETTER C WITH ACUTE
+0108;N # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0109;N # LATIN SMALL LETTER C WITH CIRCUMFLEX
+010A;N # LATIN CAPITAL LETTER C WITH DOT ABOVE
+010B;N # LATIN SMALL LETTER C WITH DOT ABOVE
+010C;N # LATIN CAPITAL LETTER C WITH CARON
+010D;N # LATIN SMALL LETTER C WITH CARON
+010E;N # LATIN CAPITAL LETTER D WITH CARON
+010F;N # LATIN SMALL LETTER D WITH CARON
+0110;N # LATIN CAPITAL LETTER D WITH STROKE
+0111;A # LATIN SMALL LETTER D WITH STROKE
+0112;N # LATIN CAPITAL LETTER E WITH MACRON
+0113;A # LATIN SMALL LETTER E WITH MACRON
+0114;N # LATIN CAPITAL LETTER E WITH BREVE
+0115;N # LATIN SMALL LETTER E WITH BREVE
+0116;N # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0117;N # LATIN SMALL LETTER E WITH DOT ABOVE
+0118;N # LATIN CAPITAL LETTER E WITH OGONEK
+0119;N # LATIN SMALL LETTER E WITH OGONEK
+011A;N # LATIN CAPITAL LETTER E WITH CARON
+011B;A # LATIN SMALL LETTER E WITH CARON
+011C;N # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011D;N # LATIN SMALL LETTER G WITH CIRCUMFLEX
+011E;N # LATIN CAPITAL LETTER G WITH BREVE
+011F;N # LATIN SMALL LETTER G WITH BREVE
+0120;N # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0121;N # LATIN SMALL LETTER G WITH DOT ABOVE
+0122;N # LATIN CAPITAL LETTER G WITH CEDILLA
+0123;N # LATIN SMALL LETTER G WITH CEDILLA
+0124;N # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0125;N # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0126;A # LATIN CAPITAL LETTER H WITH STROKE
+0127;A # LATIN SMALL LETTER H WITH STROKE
+0128;N # LATIN CAPITAL LETTER I WITH TILDE
+0129;N # LATIN SMALL LETTER I WITH TILDE
+012A;N # LATIN CAPITAL LETTER I WITH MACRON
+012B;A # LATIN SMALL LETTER I WITH MACRON
+012C;N # LATIN CAPITAL LETTER I WITH BREVE
+012D;N # LATIN SMALL LETTER I WITH BREVE
+012E;N # LATIN CAPITAL LETTER I WITH OGONEK
+012F;N # LATIN SMALL LETTER I WITH OGONEK
+0130;N # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131;A # LATIN SMALL LETTER DOTLESS I
+0132;A # LATIN CAPITAL LIGATURE IJ
+0133;A # LATIN SMALL LIGATURE IJ
+0134;N # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0135;N # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0136;N # LATIN CAPITAL LETTER K WITH CEDILLA
+0137;N # LATIN SMALL LETTER K WITH CEDILLA
+0138;A # LATIN SMALL LETTER KRA
+0139;N # LATIN CAPITAL LETTER L WITH ACUTE
+013A;N # LATIN SMALL LETTER L WITH ACUTE
+013B;N # LATIN CAPITAL LETTER L WITH CEDILLA
+013C;N # LATIN SMALL LETTER L WITH CEDILLA
+013D;N # LATIN CAPITAL LETTER L WITH CARON
+013E;N # LATIN SMALL LETTER L WITH CARON
+013F;A # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0140;A # LATIN SMALL LETTER L WITH MIDDLE DOT
+0141;A # LATIN CAPITAL LETTER L WITH STROKE
+0142;A # LATIN SMALL LETTER L WITH STROKE
+0143;N # LATIN CAPITAL LETTER N WITH ACUTE
+0144;A # LATIN SMALL LETTER N WITH ACUTE
+0145;N # LATIN CAPITAL LETTER N WITH CEDILLA
+0146;N # LATIN SMALL LETTER N WITH CEDILLA
+0147;N # LATIN CAPITAL LETTER N WITH CARON
+0148;A # LATIN SMALL LETTER N WITH CARON
+0149;A # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A;A # LATIN CAPITAL LETTER ENG
+014B;A # LATIN SMALL LETTER ENG
+014C;N # LATIN CAPITAL LETTER O WITH MACRON
+014D;A # LATIN SMALL LETTER O WITH MACRON
+014E;N # LATIN CAPITAL LETTER O WITH BREVE
+014F;N # LATIN SMALL LETTER O WITH BREVE
+0150;N # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0151;N # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0152;A # LATIN CAPITAL LIGATURE OE
+0153;A # LATIN SMALL LIGATURE OE
+0154;N # LATIN CAPITAL LETTER R WITH ACUTE
+0155;N # LATIN SMALL LETTER R WITH ACUTE
+0156;N # LATIN CAPITAL LETTER R WITH CEDILLA
+0157;N # LATIN SMALL LETTER R WITH CEDILLA
+0158;N # LATIN CAPITAL LETTER R WITH CARON
+0159;N # LATIN SMALL LETTER R WITH CARON
+015A;N # LATIN CAPITAL LETTER S WITH ACUTE
+015B;N # LATIN SMALL LETTER S WITH ACUTE
+015C;N # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015D;N # LATIN SMALL LETTER S WITH CIRCUMFLEX
+015E;N # LATIN CAPITAL LETTER S WITH CEDILLA
+015F;N # LATIN SMALL LETTER S WITH CEDILLA
+0160;N # LATIN CAPITAL LETTER S WITH CARON
+0161;N # LATIN SMALL LETTER S WITH CARON
+0162;N # LATIN CAPITAL LETTER T WITH CEDILLA
+0163;N # LATIN SMALL LETTER T WITH CEDILLA
+0164;N # LATIN CAPITAL LETTER T WITH CARON
+0165;N # LATIN SMALL LETTER T WITH CARON
+0166;A # LATIN CAPITAL LETTER T WITH STROKE
+0167;A # LATIN SMALL LETTER T WITH STROKE
+0168;N # LATIN CAPITAL LETTER U WITH TILDE
+0169;N # LATIN SMALL LETTER U WITH TILDE
+016A;N # LATIN CAPITAL LETTER U WITH MACRON
+016B;A # LATIN SMALL LETTER U WITH MACRON
+016C;N # LATIN CAPITAL LETTER U WITH BREVE
+016D;N # LATIN SMALL LETTER U WITH BREVE
+016E;N # LATIN CAPITAL LETTER U WITH RING ABOVE
+016F;N # LATIN SMALL LETTER U WITH RING ABOVE
+0170;N # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0171;N # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0172;N # LATIN CAPITAL LETTER U WITH OGONEK
+0173;N # LATIN SMALL LETTER U WITH OGONEK
+0174;N # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0175;N # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0176;N # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0177;N # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0178;N # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179;N # LATIN CAPITAL LETTER Z WITH ACUTE
+017A;N # LATIN SMALL LETTER Z WITH ACUTE
+017B;N # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017C;N # LATIN SMALL LETTER Z WITH DOT ABOVE
+017D;N # LATIN CAPITAL LETTER Z WITH CARON
+017E;N # LATIN SMALL LETTER Z WITH CARON
+017F;N # LATIN SMALL LETTER LONG S
+0180;N # LATIN SMALL LETTER B WITH STROKE
+0181;N # LATIN CAPITAL LETTER B WITH HOOK
+0182;N # LATIN CAPITAL LETTER B WITH TOPBAR
+0183;N # LATIN SMALL LETTER B WITH TOPBAR
+0184;N # LATIN CAPITAL LETTER TONE SIX
+0185;N # LATIN SMALL LETTER TONE SIX
+0186;N # LATIN CAPITAL LETTER OPEN O
+0187;N # LATIN CAPITAL LETTER C WITH HOOK
+0188;N # LATIN SMALL LETTER C WITH HOOK
+0189;N # LATIN CAPITAL LETTER AFRICAN D
+018A;N # LATIN CAPITAL LETTER D WITH HOOK
+018B;N # LATIN CAPITAL LETTER D WITH TOPBAR
+018C;N # LATIN SMALL LETTER D WITH TOPBAR
+018D;N # LATIN SMALL LETTER TURNED DELTA
+018E;N # LATIN CAPITAL LETTER REVERSED E
+018F;N # LATIN CAPITAL LETTER SCHWA
+0190;N # LATIN CAPITAL LETTER OPEN E
+0191;N # LATIN CAPITAL LETTER F WITH HOOK
+0192;N # LATIN SMALL LETTER F WITH HOOK
+0193;N # LATIN CAPITAL LETTER G WITH HOOK
+0194;N # LATIN CAPITAL LETTER GAMMA
+0195;N # LATIN SMALL LETTER HV
+0196;N # LATIN CAPITAL LETTER IOTA
+0197;N # LATIN CAPITAL LETTER I WITH STROKE
+0198;N # LATIN CAPITAL LETTER K WITH HOOK
+0199;N # LATIN SMALL LETTER K WITH HOOK
+019A;N # LATIN SMALL LETTER L WITH BAR
+019B;N # LATIN SMALL LETTER LAMBDA WITH STROKE
+019C;N # LATIN CAPITAL LETTER TURNED M
+019D;N # LATIN CAPITAL LETTER N WITH LEFT HOOK
+019E;N # LATIN SMALL LETTER N WITH LONG RIGHT LEG
+019F;N # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0;N # LATIN CAPITAL LETTER O WITH HORN
+01A1;N # LATIN SMALL LETTER O WITH HORN
+01A2;N # LATIN CAPITAL LETTER OI
+01A3;N # LATIN SMALL LETTER OI
+01A4;N # LATIN CAPITAL LETTER P WITH HOOK
+01A5;N # LATIN SMALL LETTER P WITH HOOK
+01A6;N # LATIN LETTER YR
+01A7;N # LATIN CAPITAL LETTER TONE TWO
+01A8;N # LATIN SMALL LETTER TONE TWO
+01A9;N # LATIN CAPITAL LETTER ESH
+01AA;N # LATIN LETTER REVERSED ESH LOOP
+01AB;N # LATIN SMALL LETTER T WITH PALATAL HOOK
+01AC;N # LATIN CAPITAL LETTER T WITH HOOK
+01AD;N # LATIN SMALL LETTER T WITH HOOK
+01AE;N # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF;N # LATIN CAPITAL LETTER U WITH HORN
+01B0;N # LATIN SMALL LETTER U WITH HORN
+01B1;N # LATIN CAPITAL LETTER UPSILON
+01B2;N # LATIN CAPITAL LETTER V WITH HOOK
+01B3;N # LATIN CAPITAL LETTER Y WITH HOOK
+01B4;N # LATIN SMALL LETTER Y WITH HOOK
+01B5;N # LATIN CAPITAL LETTER Z WITH STROKE
+01B6;N # LATIN SMALL LETTER Z WITH STROKE
+01B7;N # LATIN CAPITAL LETTER EZH
+01B8;N # LATIN CAPITAL LETTER EZH REVERSED
+01B9;N # LATIN SMALL LETTER EZH REVERSED
+01BA;N # LATIN SMALL LETTER EZH WITH TAIL
+01BB;N # LATIN LETTER TWO WITH STROKE
+01BC;N # LATIN CAPITAL LETTER TONE FIVE
+01BD;N # LATIN SMALL LETTER TONE FIVE
+01BE;N # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+01BF;N # LATIN LETTER WYNN
+01C0;N # LATIN LETTER DENTAL CLICK
+01C1;N # LATIN LETTER LATERAL CLICK
+01C2;N # LATIN LETTER ALVEOLAR CLICK
+01C3;N # LATIN LETTER RETROFLEX CLICK
+01C4;N # LATIN CAPITAL LETTER DZ WITH CARON
+01C5;N # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C6;N # LATIN SMALL LETTER DZ WITH CARON
+01C7;N # LATIN CAPITAL LETTER LJ
+01C8;N # LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01C9;N # LATIN SMALL LETTER LJ
+01CA;N # LATIN CAPITAL LETTER NJ
+01CB;N # LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CC;N # LATIN SMALL LETTER NJ
+01CD;N # LATIN CAPITAL LETTER A WITH CARON
+01CE;A # LATIN SMALL LETTER A WITH CARON
+01CF;N # LATIN CAPITAL LETTER I WITH CARON
+01D0;A # LATIN SMALL LETTER I WITH CARON
+01D1;N # LATIN CAPITAL LETTER O WITH CARON
+01D2;A # LATIN SMALL LETTER O WITH CARON
+01D3;N # LATIN CAPITAL LETTER U WITH CARON
+01D4;A # LATIN SMALL LETTER U WITH CARON
+01D5;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D6;A # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D7;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D8;A # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D9;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DA;A # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DB;N # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DC;A # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DD;N # LATIN SMALL LETTER TURNED E
+01DE;N # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01DF;N # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E0;N # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E1;N # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E2;N # LATIN CAPITAL LETTER AE WITH MACRON
+01E3;N # LATIN SMALL LETTER AE WITH MACRON
+01E4;N # LATIN CAPITAL LETTER G WITH STROKE
+01E5;N # LATIN SMALL LETTER G WITH STROKE
+01E6;N # LATIN CAPITAL LETTER G WITH CARON
+01E7;N # LATIN SMALL LETTER G WITH CARON
+01E8;N # LATIN CAPITAL LETTER K WITH CARON
+01E9;N # LATIN SMALL LETTER K WITH CARON
+01EA;N # LATIN CAPITAL LETTER O WITH OGONEK
+01EB;N # LATIN SMALL LETTER O WITH OGONEK
+01EC;N # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01ED;N # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EE;N # LATIN CAPITAL LETTER EZH WITH CARON
+01EF;N # LATIN SMALL LETTER EZH WITH CARON
+01F0;N # LATIN SMALL LETTER J WITH CARON
+01F1;N # LATIN CAPITAL LETTER DZ
+01F2;N # LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F3;N # LATIN SMALL LETTER DZ
+01F4;N # LATIN CAPITAL LETTER G WITH ACUTE
+01F5;N # LATIN SMALL LETTER G WITH ACUTE
+01F6;N # LATIN CAPITAL LETTER HWAIR
+01F7;N # LATIN CAPITAL LETTER WYNN
+01F8;N # LATIN CAPITAL LETTER N WITH GRAVE
+01F9;N # LATIN SMALL LETTER N WITH GRAVE
+01FA;N # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FB;N # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FC;N # LATIN CAPITAL LETTER AE WITH ACUTE
+01FD;N # LATIN SMALL LETTER AE WITH ACUTE
+01FE;N # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+01FF;N # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0200;N # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0201;N # LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0202;N # LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0203;N # LATIN SMALL LETTER A WITH INVERTED BREVE
+0204;N # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0205;N # LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0206;N # LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0207;N # LATIN SMALL LETTER E WITH INVERTED BREVE
+0208;N # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+0209;N # LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020A;N # LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020B;N # LATIN SMALL LETTER I WITH INVERTED BREVE
+020C;N # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020D;N # LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020E;N # LATIN CAPITAL LETTER O WITH INVERTED BREVE
+020F;N # LATIN SMALL LETTER O WITH INVERTED BREVE
+0210;N # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0211;N # LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0212;N # LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0213;N # LATIN SMALL LETTER R WITH INVERTED BREVE
+0214;N # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0215;N # LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0216;N # LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0217;N # LATIN SMALL LETTER U WITH INVERTED BREVE
+0218;N # LATIN CAPITAL LETTER S WITH COMMA BELOW
+0219;N # LATIN SMALL LETTER S WITH COMMA BELOW
+021A;N # LATIN CAPITAL LETTER T WITH COMMA BELOW
+021B;N # LATIN SMALL LETTER T WITH COMMA BELOW
+021C;N # LATIN CAPITAL LETTER YOGH
+021D;N # LATIN SMALL LETTER YOGH
+021E;N # LATIN CAPITAL LETTER H WITH CARON
+021F;N # LATIN SMALL LETTER H WITH CARON
+0220;N # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0221;N # LATIN SMALL LETTER D WITH CURL
+0222;N # LATIN CAPITAL LETTER OU
+0223;N # LATIN SMALL LETTER OU
+0224;N # LATIN CAPITAL LETTER Z WITH HOOK
+0225;N # LATIN SMALL LETTER Z WITH HOOK
+0226;N # LATIN CAPITAL LETTER A WITH DOT ABOVE
+0227;N # LATIN SMALL LETTER A WITH DOT ABOVE
+0228;N # LATIN CAPITAL LETTER E WITH CEDILLA
+0229;N # LATIN SMALL LETTER E WITH CEDILLA
+022A;N # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022B;N # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022C;N # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022D;N # LATIN SMALL LETTER O WITH TILDE AND MACRON
+022E;N # LATIN CAPITAL LETTER O WITH DOT ABOVE
+022F;N # LATIN SMALL LETTER O WITH DOT ABOVE
+0230;N # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0231;N # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0232;N # LATIN CAPITAL LETTER Y WITH MACRON
+0233;N # LATIN SMALL LETTER Y WITH MACRON
+0234;N # LATIN SMALL LETTER L WITH CURL
+0235;N # LATIN SMALL LETTER N WITH CURL
+0236;N # LATIN SMALL LETTER T WITH CURL
+0237;N # LATIN SMALL LETTER DOTLESS J
+0238;N # LATIN SMALL LETTER DB DIGRAPH
+0239;N # LATIN SMALL LETTER QP DIGRAPH
+023A;N # LATIN CAPITAL LETTER A WITH STROKE
+023B;N # LATIN CAPITAL LETTER C WITH STROKE
+023C;N # LATIN SMALL LETTER C WITH STROKE
+023D;N # LATIN CAPITAL LETTER L WITH BAR
+023E;N # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+023F;N # LATIN SMALL LETTER S WITH SWASH TAIL
+0240;N # LATIN SMALL LETTER Z WITH SWASH TAIL
+0241;N # LATIN CAPITAL LETTER GLOTTAL STOP
+0250;N # LATIN SMALL LETTER TURNED A
+0251;A # LATIN SMALL LETTER ALPHA
+0252;N # LATIN SMALL LETTER TURNED ALPHA
+0253;N # LATIN SMALL LETTER B WITH HOOK
+0254;N # LATIN SMALL LETTER OPEN O
+0255;N # LATIN SMALL LETTER C WITH CURL
+0256;N # LATIN SMALL LETTER D WITH TAIL
+0257;N # LATIN SMALL LETTER D WITH HOOK
+0258;N # LATIN SMALL LETTER REVERSED E
+0259;N # LATIN SMALL LETTER SCHWA
+025A;N # LATIN SMALL LETTER SCHWA WITH HOOK
+025B;N # LATIN SMALL LETTER OPEN E
+025C;N # LATIN SMALL LETTER REVERSED OPEN E
+025D;N # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E;N # LATIN SMALL LETTER CLOSED REVERSED OPEN E
+025F;N # LATIN SMALL LETTER DOTLESS J WITH STROKE
+0260;N # LATIN SMALL LETTER G WITH HOOK
+0261;A # LATIN SMALL LETTER SCRIPT G
+0262;N # LATIN LETTER SMALL CAPITAL G
+0263;N # LATIN SMALL LETTER GAMMA
+0264;N # LATIN SMALL LETTER RAMS HORN
+0265;N # LATIN SMALL LETTER TURNED H
+0266;N # LATIN SMALL LETTER H WITH HOOK
+0267;N # LATIN SMALL LETTER HENG WITH HOOK
+0268;N # LATIN SMALL LETTER I WITH STROKE
+0269;N # LATIN SMALL LETTER IOTA
+026A;N # LATIN LETTER SMALL CAPITAL I
+026B;N # LATIN SMALL LETTER L WITH MIDDLE TILDE
+026C;N # LATIN SMALL LETTER L WITH BELT
+026D;N # LATIN SMALL LETTER L WITH RETROFLEX HOOK
+026E;N # LATIN SMALL LETTER LEZH
+026F;N # LATIN SMALL LETTER TURNED M
+0270;N # LATIN SMALL LETTER TURNED M WITH LONG LEG
+0271;N # LATIN SMALL LETTER M WITH HOOK
+0272;N # LATIN SMALL LETTER N WITH LEFT HOOK
+0273;N # LATIN SMALL LETTER N WITH RETROFLEX HOOK
+0274;N # LATIN LETTER SMALL CAPITAL N
+0275;N # LATIN SMALL LETTER BARRED O
+0276;N # LATIN LETTER SMALL CAPITAL OE
+0277;N # LATIN SMALL LETTER CLOSED OMEGA
+0278;N # LATIN SMALL LETTER PHI
+0279;N # LATIN SMALL LETTER TURNED R
+027A;N # LATIN SMALL LETTER TURNED R WITH LONG LEG
+027B;N # LATIN SMALL LETTER TURNED R WITH HOOK
+027C;N # LATIN SMALL LETTER R WITH LONG LEG
+027D;N # LATIN SMALL LETTER R WITH TAIL
+027E;N # LATIN SMALL LETTER R WITH FISHHOOK
+027F;N # LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0280;N # LATIN LETTER SMALL CAPITAL R
+0281;N # LATIN LETTER SMALL CAPITAL INVERTED R
+0282;N # LATIN SMALL LETTER S WITH HOOK
+0283;N # LATIN SMALL LETTER ESH
+0284;N # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+0285;N # LATIN SMALL LETTER SQUAT REVERSED ESH
+0286;N # LATIN SMALL LETTER ESH WITH CURL
+0287;N # LATIN SMALL LETTER TURNED T
+0288;N # LATIN SMALL LETTER T WITH RETROFLEX HOOK
+0289;N # LATIN SMALL LETTER U BAR
+028A;N # LATIN SMALL LETTER UPSILON
+028B;N # LATIN SMALL LETTER V WITH HOOK
+028C;N # LATIN SMALL LETTER TURNED V
+028D;N # LATIN SMALL LETTER TURNED W
+028E;N # LATIN SMALL LETTER TURNED Y
+028F;N # LATIN LETTER SMALL CAPITAL Y
+0290;N # LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+0291;N # LATIN SMALL LETTER Z WITH CURL
+0292;N # LATIN SMALL LETTER EZH
+0293;N # LATIN SMALL LETTER EZH WITH CURL
+0294;N # LATIN LETTER GLOTTAL STOP
+0295;N # LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+0296;N # LATIN LETTER INVERTED GLOTTAL STOP
+0297;N # LATIN LETTER STRETCHED C
+0298;N # LATIN LETTER BILABIAL CLICK
+0299;N # LATIN LETTER SMALL CAPITAL B
+029A;N # LATIN SMALL LETTER CLOSED OPEN E
+029B;N # LATIN LETTER SMALL CAPITAL G WITH HOOK
+029C;N # LATIN LETTER SMALL CAPITAL H
+029D;N # LATIN SMALL LETTER J WITH CROSSED-TAIL
+029E;N # LATIN SMALL LETTER TURNED K
+029F;N # LATIN LETTER SMALL CAPITAL L
+02A0;N # LATIN SMALL LETTER Q WITH HOOK
+02A1;N # LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2;N # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+02A3;N # LATIN SMALL LETTER DZ DIGRAPH
+02A4;N # LATIN SMALL LETTER DEZH DIGRAPH
+02A5;N # LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+02A6;N # LATIN SMALL LETTER TS DIGRAPH
+02A7;N # LATIN SMALL LETTER TESH DIGRAPH
+02A8;N # LATIN SMALL LETTER TC DIGRAPH WITH CURL
+02A9;N # LATIN SMALL LETTER FENG DIGRAPH
+02AA;N # LATIN SMALL LETTER LS DIGRAPH
+02AB;N # LATIN SMALL LETTER LZ DIGRAPH
+02AC;N # LATIN LETTER BILABIAL PERCUSSIVE
+02AD;N # LATIN LETTER BIDENTAL PERCUSSIVE
+02AE;N # LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF;N # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0;N # MODIFIER LETTER SMALL H
+02B1;N # MODIFIER LETTER SMALL H WITH HOOK
+02B2;N # MODIFIER LETTER SMALL J
+02B3;N # MODIFIER LETTER SMALL R
+02B4;N # MODIFIER LETTER SMALL TURNED R
+02B5;N # MODIFIER LETTER SMALL TURNED R WITH HOOK
+02B6;N # MODIFIER LETTER SMALL CAPITAL INVERTED R
+02B7;N # MODIFIER LETTER SMALL W
+02B8;N # MODIFIER LETTER SMALL Y
+02B9;N # MODIFIER LETTER PRIME
+02BA;N # MODIFIER LETTER DOUBLE PRIME
+02BB;N # MODIFIER LETTER TURNED COMMA
+02BC;N # MODIFIER LETTER APOSTROPHE
+02BD;N # MODIFIER LETTER REVERSED COMMA
+02BE;N # MODIFIER LETTER RIGHT HALF RING
+02BF;N # MODIFIER LETTER LEFT HALF RING
+02C0;N # MODIFIER LETTER GLOTTAL STOP
+02C1;N # MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2;N # MODIFIER LETTER LEFT ARROWHEAD
+02C3;N # MODIFIER LETTER RIGHT ARROWHEAD
+02C4;A # MODIFIER LETTER UP ARROWHEAD
+02C5;N # MODIFIER LETTER DOWN ARROWHEAD
+02C6;N # MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7;A # CARON
+02C8;N # MODIFIER LETTER VERTICAL LINE
+02C9;A # MODIFIER LETTER MACRON
+02CA;A # MODIFIER LETTER ACUTE ACCENT
+02CB;A # MODIFIER LETTER GRAVE ACCENT
+02CC;N # MODIFIER LETTER LOW VERTICAL LINE
+02CD;A # MODIFIER LETTER LOW MACRON
+02CE;N # MODIFIER LETTER LOW GRAVE ACCENT
+02CF;N # MODIFIER LETTER LOW ACUTE ACCENT
+02D0;A # MODIFIER LETTER TRIANGULAR COLON
+02D1;N # MODIFIER LETTER HALF TRIANGULAR COLON
+02D2;N # MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3;N # MODIFIER LETTER CENTRED LEFT HALF RING
+02D4;N # MODIFIER LETTER UP TACK
+02D5;N # MODIFIER LETTER DOWN TACK
+02D6;N # MODIFIER LETTER PLUS SIGN
+02D7;N # MODIFIER LETTER MINUS SIGN
+02D8;A # BREVE
+02D9;A # DOT ABOVE
+02DA;A # RING ABOVE
+02DB;A # OGONEK
+02DC;N # SMALL TILDE
+02DD;A # DOUBLE ACUTE ACCENT
+02DE;N # MODIFIER LETTER RHOTIC HOOK
+02DF;A # MODIFIER LETTER CROSS ACCENT
+02E0;N # MODIFIER LETTER SMALL GAMMA
+02E1;N # MODIFIER LETTER SMALL L
+02E2;N # MODIFIER LETTER SMALL S
+02E3;N # MODIFIER LETTER SMALL X
+02E4;N # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5;N # MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6;N # MODIFIER LETTER HIGH TONE BAR
+02E7;N # MODIFIER LETTER MID TONE BAR
+02E8;N # MODIFIER LETTER LOW TONE BAR
+02E9;N # MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA;N # MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB;N # MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC;N # MODIFIER LETTER VOICING
+02ED;N # MODIFIER LETTER UNASPIRATED
+02EE;N # MODIFIER LETTER DOUBLE APOSTROPHE
+02EF;N # MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0;N # MODIFIER LETTER LOW UP ARROWHEAD
+02F1;N # MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2;N # MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3;N # MODIFIER LETTER LOW RING
+02F4;N # MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5;N # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6;N # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7;N # MODIFIER LETTER LOW TILDE
+02F8;N # MODIFIER LETTER RAISED COLON
+02F9;N # MODIFIER LETTER BEGIN HIGH TONE
+02FA;N # MODIFIER LETTER END HIGH TONE
+02FB;N # MODIFIER LETTER BEGIN LOW TONE
+02FC;N # MODIFIER LETTER END LOW TONE
+02FD;N # MODIFIER LETTER SHELF
+02FE;N # MODIFIER LETTER OPEN SHELF
+02FF;N # MODIFIER LETTER LOW LEFT ARROW
+0300;A # COMBINING GRAVE ACCENT
+0301;A # COMBINING ACUTE ACCENT
+0302;A # COMBINING CIRCUMFLEX ACCENT
+0303;A # COMBINING TILDE
+0304;A # COMBINING MACRON
+0305;A # COMBINING OVERLINE
+0306;A # COMBINING BREVE
+0307;A # COMBINING DOT ABOVE
+0308;A # COMBINING DIAERESIS
+0309;A # COMBINING HOOK ABOVE
+030A;A # COMBINING RING ABOVE
+030B;A # COMBINING DOUBLE ACUTE ACCENT
+030C;A # COMBINING CARON
+030D;A # COMBINING VERTICAL LINE ABOVE
+030E;A # COMBINING DOUBLE VERTICAL LINE ABOVE
+030F;A # COMBINING DOUBLE GRAVE ACCENT
+0310;A # COMBINING CANDRABINDU
+0311;A # COMBINING INVERTED BREVE
+0312;A # COMBINING TURNED COMMA ABOVE
+0313;A # COMBINING COMMA ABOVE
+0314;A # COMBINING REVERSED COMMA ABOVE
+0315;A # COMBINING COMMA ABOVE RIGHT
+0316;A # COMBINING GRAVE ACCENT BELOW
+0317;A # COMBINING ACUTE ACCENT BELOW
+0318;A # COMBINING LEFT TACK BELOW
+0319;A # COMBINING RIGHT TACK BELOW
+031A;A # COMBINING LEFT ANGLE ABOVE
+031B;A # COMBINING HORN
+031C;A # COMBINING LEFT HALF RING BELOW
+031D;A # COMBINING UP TACK BELOW
+031E;A # COMBINING DOWN TACK BELOW
+031F;A # COMBINING PLUS SIGN BELOW
+0320;A # COMBINING MINUS SIGN BELOW
+0321;A # COMBINING PALATALIZED HOOK BELOW
+0322;A # COMBINING RETROFLEX HOOK BELOW
+0323;A # COMBINING DOT BELOW
+0324;A # COMBINING DIAERESIS BELOW
+0325;A # COMBINING RING BELOW
+0326;A # COMBINING COMMA BELOW
+0327;A # COMBINING CEDILLA
+0328;A # COMBINING OGONEK
+0329;A # COMBINING VERTICAL LINE BELOW
+032A;A # COMBINING BRIDGE BELOW
+032B;A # COMBINING INVERTED DOUBLE ARCH BELOW
+032C;A # COMBINING CARON BELOW
+032D;A # COMBINING CIRCUMFLEX ACCENT BELOW
+032E;A # COMBINING BREVE BELOW
+032F;A # COMBINING INVERTED BREVE BELOW
+0330;A # COMBINING TILDE BELOW
+0331;A # COMBINING MACRON BELOW
+0332;A # COMBINING LOW LINE
+0333;A # COMBINING DOUBLE LOW LINE
+0334;A # COMBINING TILDE OVERLAY
+0335;A # COMBINING SHORT STROKE OVERLAY
+0336;A # COMBINING LONG STROKE OVERLAY
+0337;A # COMBINING SHORT SOLIDUS OVERLAY
+0338;A # COMBINING LONG SOLIDUS OVERLAY
+0339;A # COMBINING RIGHT HALF RING BELOW
+033A;A # COMBINING INVERTED BRIDGE BELOW
+033B;A # COMBINING SQUARE BELOW
+033C;A # COMBINING SEAGULL BELOW
+033D;A # COMBINING X ABOVE
+033E;A # COMBINING VERTICAL TILDE
+033F;A # COMBINING DOUBLE OVERLINE
+0340;A # COMBINING GRAVE TONE MARK
+0341;A # COMBINING ACUTE TONE MARK
+0342;A # COMBINING GREEK PERISPOMENI
+0343;A # COMBINING GREEK KORONIS
+0344;A # COMBINING GREEK DIALYTIKA TONOS
+0345;A # COMBINING GREEK YPOGEGRAMMENI
+0346;A # COMBINING BRIDGE ABOVE
+0347;A # COMBINING EQUALS SIGN BELOW
+0348;A # COMBINING DOUBLE VERTICAL LINE BELOW
+0349;A # COMBINING LEFT ANGLE BELOW
+034A;A # COMBINING NOT TILDE ABOVE
+034B;A # COMBINING HOMOTHETIC ABOVE
+034C;A # COMBINING ALMOST EQUAL TO ABOVE
+034D;A # COMBINING LEFT RIGHT ARROW BELOW
+034E;A # COMBINING UPWARDS ARROW BELOW
+034F;A # COMBINING GRAPHEME JOINER
+0350;A # COMBINING RIGHT ARROWHEAD ABOVE
+0351;A # COMBINING LEFT HALF RING ABOVE
+0352;A # COMBINING FERMATA
+0353;A # COMBINING X BELOW
+0354;A # COMBINING LEFT ARROWHEAD BELOW
+0355;A # COMBINING RIGHT ARROWHEAD BELOW
+0356;A # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357;A # COMBINING RIGHT HALF RING ABOVE
+0358;A # COMBINING DOT ABOVE RIGHT
+0359;A # COMBINING ASTERISK BELOW
+035A;A # COMBINING DOUBLE RING BELOW
+035B;A # COMBINING ZIGZAG ABOVE
+035C;A # COMBINING DOUBLE BREVE BELOW
+035D;A # COMBINING DOUBLE BREVE
+035E;A # COMBINING DOUBLE MACRON
+035F;A # COMBINING DOUBLE MACRON BELOW
+0360;A # COMBINING DOUBLE TILDE
+0361;A # COMBINING DOUBLE INVERTED BREVE
+0362;A # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0363;A # COMBINING LATIN SMALL LETTER A
+0364;A # COMBINING LATIN SMALL LETTER E
+0365;A # COMBINING LATIN SMALL LETTER I
+0366;A # COMBINING LATIN SMALL LETTER O
+0367;A # COMBINING LATIN SMALL LETTER U
+0368;A # COMBINING LATIN SMALL LETTER C
+0369;A # COMBINING LATIN SMALL LETTER D
+036A;A # COMBINING LATIN SMALL LETTER H
+036B;A # COMBINING LATIN SMALL LETTER M
+036C;A # COMBINING LATIN SMALL LETTER R
+036D;A # COMBINING LATIN SMALL LETTER T
+036E;A # COMBINING LATIN SMALL LETTER V
+036F;A # COMBINING LATIN SMALL LETTER X
+0374;N # GREEK NUMERAL SIGN
+0375;N # GREEK LOWER NUMERAL SIGN
+037A;N # GREEK YPOGEGRAMMENI
+037E;N # GREEK QUESTION MARK
+0384;N # GREEK TONOS
+0385;N # GREEK DIALYTIKA TONOS
+0386;N # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387;N # GREEK ANO TELEIA
+0388;N # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389;N # GREEK CAPITAL LETTER ETA WITH TONOS
+038A;N # GREEK CAPITAL LETTER IOTA WITH TONOS
+038C;N # GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E;N # GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F;N # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391;A # GREEK CAPITAL LETTER ALPHA
+0392;A # GREEK CAPITAL LETTER BETA
+0393;A # GREEK CAPITAL LETTER GAMMA
+0394;A # GREEK CAPITAL LETTER DELTA
+0395;A # GREEK CAPITAL LETTER EPSILON
+0396;A # GREEK CAPITAL LETTER ZETA
+0397;A # GREEK CAPITAL LETTER ETA
+0398;A # GREEK CAPITAL LETTER THETA
+0399;A # GREEK CAPITAL LETTER IOTA
+039A;A # GREEK CAPITAL LETTER KAPPA
+039B;A # GREEK CAPITAL LETTER LAMDA
+039C;A # GREEK CAPITAL LETTER MU
+039D;A # GREEK CAPITAL LETTER NU
+039E;A # GREEK CAPITAL LETTER XI
+039F;A # GREEK CAPITAL LETTER OMICRON
+03A0;A # GREEK CAPITAL LETTER PI
+03A1;A # GREEK CAPITAL LETTER RHO
+03A3;A # GREEK CAPITAL LETTER SIGMA
+03A4;A # GREEK CAPITAL LETTER TAU
+03A5;A # GREEK CAPITAL LETTER UPSILON
+03A6;A # GREEK CAPITAL LETTER PHI
+03A7;A # GREEK CAPITAL LETTER CHI
+03A8;A # GREEK CAPITAL LETTER PSI
+03A9;A # GREEK CAPITAL LETTER OMEGA
+03AA;N # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB;N # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03AC;N # GREEK SMALL LETTER ALPHA WITH TONOS
+03AD;N # GREEK SMALL LETTER EPSILON WITH TONOS
+03AE;N # GREEK SMALL LETTER ETA WITH TONOS
+03AF;N # GREEK SMALL LETTER IOTA WITH TONOS
+03B0;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03B1;A # GREEK SMALL LETTER ALPHA
+03B2;A # GREEK SMALL LETTER BETA
+03B3;A # GREEK SMALL LETTER GAMMA
+03B4;A # GREEK SMALL LETTER DELTA
+03B5;A # GREEK SMALL LETTER EPSILON
+03B6;A # GREEK SMALL LETTER ZETA
+03B7;A # GREEK SMALL LETTER ETA
+03B8;A # GREEK SMALL LETTER THETA
+03B9;A # GREEK SMALL LETTER IOTA
+03BA;A # GREEK SMALL LETTER KAPPA
+03BB;A # GREEK SMALL LETTER LAMDA
+03BC;A # GREEK SMALL LETTER MU
+03BD;A # GREEK SMALL LETTER NU
+03BE;A # GREEK SMALL LETTER XI
+03BF;A # GREEK SMALL LETTER OMICRON
+03C0;A # GREEK SMALL LETTER PI
+03C1;A # GREEK SMALL LETTER RHO
+03C2;N # GREEK SMALL LETTER FINAL SIGMA
+03C3;A # GREEK SMALL LETTER SIGMA
+03C4;A # GREEK SMALL LETTER TAU
+03C5;A # GREEK SMALL LETTER UPSILON
+03C6;A # GREEK SMALL LETTER PHI
+03C7;A # GREEK SMALL LETTER CHI
+03C8;A # GREEK SMALL LETTER PSI
+03C9;A # GREEK SMALL LETTER OMEGA
+03CA;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+03CB;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+03CC;N # GREEK SMALL LETTER OMICRON WITH TONOS
+03CD;N # GREEK SMALL LETTER UPSILON WITH TONOS
+03CE;N # GREEK SMALL LETTER OMEGA WITH TONOS
+03D0;N # GREEK BETA SYMBOL
+03D1;N # GREEK THETA SYMBOL
+03D2;N # GREEK UPSILON WITH HOOK SYMBOL
+03D3;N # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+03D4;N # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+03D5;N # GREEK PHI SYMBOL
+03D6;N # GREEK PI SYMBOL
+03D7;N # GREEK KAI SYMBOL
+03D8;N # GREEK LETTER ARCHAIC KOPPA
+03D9;N # GREEK SMALL LETTER ARCHAIC KOPPA
+03DA;N # GREEK LETTER STIGMA
+03DB;N # GREEK SMALL LETTER STIGMA
+03DC;N # GREEK LETTER DIGAMMA
+03DD;N # GREEK SMALL LETTER DIGAMMA
+03DE;N # GREEK LETTER KOPPA
+03DF;N # GREEK SMALL LETTER KOPPA
+03E0;N # GREEK LETTER SAMPI
+03E1;N # GREEK SMALL LETTER SAMPI
+03E2;N # COPTIC CAPITAL LETTER SHEI
+03E3;N # COPTIC SMALL LETTER SHEI
+03E4;N # COPTIC CAPITAL LETTER FEI
+03E5;N # COPTIC SMALL LETTER FEI
+03E6;N # COPTIC CAPITAL LETTER KHEI
+03E7;N # COPTIC SMALL LETTER KHEI
+03E8;N # COPTIC CAPITAL LETTER HORI
+03E9;N # COPTIC SMALL LETTER HORI
+03EA;N # COPTIC CAPITAL LETTER GANGIA
+03EB;N # COPTIC SMALL LETTER GANGIA
+03EC;N # COPTIC CAPITAL LETTER SHIMA
+03ED;N # COPTIC SMALL LETTER SHIMA
+03EE;N # COPTIC CAPITAL LETTER DEI
+03EF;N # COPTIC SMALL LETTER DEI
+03F0;N # GREEK KAPPA SYMBOL
+03F1;N # GREEK RHO SYMBOL
+03F2;N # GREEK LUNATE SIGMA SYMBOL
+03F3;N # GREEK LETTER YOT
+03F4;N # GREEK CAPITAL THETA SYMBOL
+03F5;N # GREEK LUNATE EPSILON SYMBOL
+03F6;N # GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7;N # GREEK CAPITAL LETTER SHO
+03F8;N # GREEK SMALL LETTER SHO
+03F9;N # GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA;N # GREEK CAPITAL LETTER SAN
+03FB;N # GREEK SMALL LETTER SAN
+03FC;N # GREEK RHO WITH STROKE SYMBOL
+03FD;N # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+03FE;N # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+03FF;N # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0400;N # CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401;A # CYRILLIC CAPITAL LETTER IO
+0402;N # CYRILLIC CAPITAL LETTER DJE
+0403;N # CYRILLIC CAPITAL LETTER GJE
+0404;N # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405;N # CYRILLIC CAPITAL LETTER DZE
+0406;N # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407;N # CYRILLIC CAPITAL LETTER YI
+0408;N # CYRILLIC CAPITAL LETTER JE
+0409;N # CYRILLIC CAPITAL LETTER LJE
+040A;N # CYRILLIC CAPITAL LETTER NJE
+040B;N # CYRILLIC CAPITAL LETTER TSHE
+040C;N # CYRILLIC CAPITAL LETTER KJE
+040D;N # CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E;N # CYRILLIC CAPITAL LETTER SHORT U
+040F;N # CYRILLIC CAPITAL LETTER DZHE
+0410;A # CYRILLIC CAPITAL LETTER A
+0411;A # CYRILLIC CAPITAL LETTER BE
+0412;A # CYRILLIC CAPITAL LETTER VE
+0413;A # CYRILLIC CAPITAL LETTER GHE
+0414;A # CYRILLIC CAPITAL LETTER DE
+0415;A # CYRILLIC CAPITAL LETTER IE
+0416;A # CYRILLIC CAPITAL LETTER ZHE
+0417;A # CYRILLIC CAPITAL LETTER ZE
+0418;A # CYRILLIC CAPITAL LETTER I
+0419;A # CYRILLIC CAPITAL LETTER SHORT I
+041A;A # CYRILLIC CAPITAL LETTER KA
+041B;A # CYRILLIC CAPITAL LETTER EL
+041C;A # CYRILLIC CAPITAL LETTER EM
+041D;A # CYRILLIC CAPITAL LETTER EN
+041E;A # CYRILLIC CAPITAL LETTER O
+041F;A # CYRILLIC CAPITAL LETTER PE
+0420;A # CYRILLIC CAPITAL LETTER ER
+0421;A # CYRILLIC CAPITAL LETTER ES
+0422;A # CYRILLIC CAPITAL LETTER TE
+0423;A # CYRILLIC CAPITAL LETTER U
+0424;A # CYRILLIC CAPITAL LETTER EF
+0425;A # CYRILLIC CAPITAL LETTER HA
+0426;A # CYRILLIC CAPITAL LETTER TSE
+0427;A # CYRILLIC CAPITAL LETTER CHE
+0428;A # CYRILLIC CAPITAL LETTER SHA
+0429;A # CYRILLIC CAPITAL LETTER SHCHA
+042A;A # CYRILLIC CAPITAL LETTER HARD SIGN
+042B;A # CYRILLIC CAPITAL LETTER YERU
+042C;A # CYRILLIC CAPITAL LETTER SOFT SIGN
+042D;A # CYRILLIC CAPITAL LETTER E
+042E;A # CYRILLIC CAPITAL LETTER YU
+042F;A # CYRILLIC CAPITAL LETTER YA
+0430;A # CYRILLIC SMALL LETTER A
+0431;A # CYRILLIC SMALL LETTER BE
+0432;A # CYRILLIC SMALL LETTER VE
+0433;A # CYRILLIC SMALL LETTER GHE
+0434;A # CYRILLIC SMALL LETTER DE
+0435;A # CYRILLIC SMALL LETTER IE
+0436;A # CYRILLIC SMALL LETTER ZHE
+0437;A # CYRILLIC SMALL LETTER ZE
+0438;A # CYRILLIC SMALL LETTER I
+0439;A # CYRILLIC SMALL LETTER SHORT I
+043A;A # CYRILLIC SMALL LETTER KA
+043B;A # CYRILLIC SMALL LETTER EL
+043C;A # CYRILLIC SMALL LETTER EM
+043D;A # CYRILLIC SMALL LETTER EN
+043E;A # CYRILLIC SMALL LETTER O
+043F;A # CYRILLIC SMALL LETTER PE
+0440;A # CYRILLIC SMALL LETTER ER
+0441;A # CYRILLIC SMALL LETTER ES
+0442;A # CYRILLIC SMALL LETTER TE
+0443;A # CYRILLIC SMALL LETTER U
+0444;A # CYRILLIC SMALL LETTER EF
+0445;A # CYRILLIC SMALL LETTER HA
+0446;A # CYRILLIC SMALL LETTER TSE
+0447;A # CYRILLIC SMALL LETTER CHE
+0448;A # CYRILLIC SMALL LETTER SHA
+0449;A # CYRILLIC SMALL LETTER SHCHA
+044A;A # CYRILLIC SMALL LETTER HARD SIGN
+044B;A # CYRILLIC SMALL LETTER YERU
+044C;A # CYRILLIC SMALL LETTER SOFT SIGN
+044D;A # CYRILLIC SMALL LETTER E
+044E;A # CYRILLIC SMALL LETTER YU
+044F;A # CYRILLIC SMALL LETTER YA
+0450;N # CYRILLIC SMALL LETTER IE WITH GRAVE
+0451;A # CYRILLIC SMALL LETTER IO
+0452;N # CYRILLIC SMALL LETTER DJE
+0453;N # CYRILLIC SMALL LETTER GJE
+0454;N # CYRILLIC SMALL LETTER UKRAINIAN IE
+0455;N # CYRILLIC SMALL LETTER DZE
+0456;N # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0457;N # CYRILLIC SMALL LETTER YI
+0458;N # CYRILLIC SMALL LETTER JE
+0459;N # CYRILLIC SMALL LETTER LJE
+045A;N # CYRILLIC SMALL LETTER NJE
+045B;N # CYRILLIC SMALL LETTER TSHE
+045C;N # CYRILLIC SMALL LETTER KJE
+045D;N # CYRILLIC SMALL LETTER I WITH GRAVE
+045E;N # CYRILLIC SMALL LETTER SHORT U
+045F;N # CYRILLIC SMALL LETTER DZHE
+0460;N # CYRILLIC CAPITAL LETTER OMEGA
+0461;N # CYRILLIC SMALL LETTER OMEGA
+0462;N # CYRILLIC CAPITAL LETTER YAT
+0463;N # CYRILLIC SMALL LETTER YAT
+0464;N # CYRILLIC CAPITAL LETTER IOTIFIED E
+0465;N # CYRILLIC SMALL LETTER IOTIFIED E
+0466;N # CYRILLIC CAPITAL LETTER LITTLE YUS
+0467;N # CYRILLIC SMALL LETTER LITTLE YUS
+0468;N # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469;N # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A;N # CYRILLIC CAPITAL LETTER BIG YUS
+046B;N # CYRILLIC SMALL LETTER BIG YUS
+046C;N # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D;N # CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E;N # CYRILLIC CAPITAL LETTER KSI
+046F;N # CYRILLIC SMALL LETTER KSI
+0470;N # CYRILLIC CAPITAL LETTER PSI
+0471;N # CYRILLIC SMALL LETTER PSI
+0472;N # CYRILLIC CAPITAL LETTER FITA
+0473;N # CYRILLIC SMALL LETTER FITA
+0474;N # CYRILLIC CAPITAL LETTER IZHITSA
+0475;N # CYRILLIC SMALL LETTER IZHITSA
+0476;N # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0477;N # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478;N # CYRILLIC CAPITAL LETTER UK
+0479;N # CYRILLIC SMALL LETTER UK
+047A;N # CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B;N # CYRILLIC SMALL LETTER ROUND OMEGA
+047C;N # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D;N # CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E;N # CYRILLIC CAPITAL LETTER OT
+047F;N # CYRILLIC SMALL LETTER OT
+0480;N # CYRILLIC CAPITAL LETTER KOPPA
+0481;N # CYRILLIC SMALL LETTER KOPPA
+0482;N # CYRILLIC THOUSANDS SIGN
+0483;N # COMBINING CYRILLIC TITLO
+0484;N # COMBINING CYRILLIC PALATALIZATION
+0485;N # COMBINING CYRILLIC DASIA PNEUMATA
+0486;N # COMBINING CYRILLIC PSILI PNEUMATA
+0488;N # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489;N # COMBINING CYRILLIC MILLIONS SIGN
+048A;N # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048B;N # CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048C;N # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D;N # CYRILLIC SMALL LETTER SEMISOFT SIGN
+048E;N # CYRILLIC CAPITAL LETTER ER WITH TICK
+048F;N # CYRILLIC SMALL LETTER ER WITH TICK
+0490;N # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491;N # CYRILLIC SMALL LETTER GHE WITH UPTURN
+0492;N # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493;N # CYRILLIC SMALL LETTER GHE WITH STROKE
+0494;N # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495;N # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0496;N # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497;N # CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0498;N # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499;N # CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049A;N # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B;N # CYRILLIC SMALL LETTER KA WITH DESCENDER
+049C;N # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D;N # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049E;N # CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F;N # CYRILLIC SMALL LETTER KA WITH STROKE
+04A0;N # CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1;N # CYRILLIC SMALL LETTER BASHKIR KA
+04A2;N # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3;N # CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A4;N # CYRILLIC CAPITAL LIGATURE EN GHE
+04A5;N # CYRILLIC SMALL LIGATURE EN GHE
+04A6;N # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A7;N # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A8;N # CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9;N # CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA;N # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB;N # CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AC;N # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD;N # CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AE;N # CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF;N # CYRILLIC SMALL LETTER STRAIGHT U
+04B0;N # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1;N # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B2;N # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3;N # CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B4;N # CYRILLIC CAPITAL LIGATURE TE TSE
+04B5;N # CYRILLIC SMALL LIGATURE TE TSE
+04B6;N # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7;N # CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B8;N # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9;N # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BA;N # CYRILLIC CAPITAL LETTER SHHA
+04BB;N # CYRILLIC SMALL LETTER SHHA
+04BC;N # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD;N # CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE;N # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF;N # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0;N # CYRILLIC LETTER PALOCHKA
+04C1;N # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C2;N # CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C3;N # CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4;N # CYRILLIC SMALL LETTER KA WITH HOOK
+04C5;N # CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C6;N # CYRILLIC SMALL LETTER EL WITH TAIL
+04C7;N # CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8;N # CYRILLIC SMALL LETTER EN WITH HOOK
+04C9;N # CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CA;N # CYRILLIC SMALL LETTER EN WITH TAIL
+04CB;N # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC;N # CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CD;N # CYRILLIC CAPITAL LETTER EM WITH TAIL
+04CE;N # CYRILLIC SMALL LETTER EM WITH TAIL
+04D0;N # CYRILLIC CAPITAL LETTER A WITH BREVE
+04D1;N # CYRILLIC SMALL LETTER A WITH BREVE
+04D2;N # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D3;N # CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D4;N # CYRILLIC CAPITAL LIGATURE A IE
+04D5;N # CYRILLIC SMALL LIGATURE A IE
+04D6;N # CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D7;N # CYRILLIC SMALL LETTER IE WITH BREVE
+04D8;N # CYRILLIC CAPITAL LETTER SCHWA
+04D9;N # CYRILLIC SMALL LETTER SCHWA
+04DA;N # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DB;N # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DC;N # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DD;N # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DE;N # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04DF;N # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E0;N # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1;N # CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E2;N # CYRILLIC CAPITAL LETTER I WITH MACRON
+04E3;N # CYRILLIC SMALL LETTER I WITH MACRON
+04E4;N # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E5;N # CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E6;N # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E7;N # CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E8;N # CYRILLIC CAPITAL LETTER BARRED O
+04E9;N # CYRILLIC SMALL LETTER BARRED O
+04EA;N # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EB;N # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EC;N # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04ED;N # CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EE;N # CYRILLIC CAPITAL LETTER U WITH MACRON
+04EF;N # CYRILLIC SMALL LETTER U WITH MACRON
+04F0;N # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F1;N # CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F2;N # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F3;N # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F4;N # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F5;N # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F6;N # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F7;N # CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F8;N # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04F9;N # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+0500;N # CYRILLIC CAPITAL LETTER KOMI DE
+0501;N # CYRILLIC SMALL LETTER KOMI DE
+0502;N # CYRILLIC CAPITAL LETTER KOMI DJE
+0503;N # CYRILLIC SMALL LETTER KOMI DJE
+0504;N # CYRILLIC CAPITAL LETTER KOMI ZJE
+0505;N # CYRILLIC SMALL LETTER KOMI ZJE
+0506;N # CYRILLIC CAPITAL LETTER KOMI DZJE
+0507;N # CYRILLIC SMALL LETTER KOMI DZJE
+0508;N # CYRILLIC CAPITAL LETTER KOMI LJE
+0509;N # CYRILLIC SMALL LETTER KOMI LJE
+050A;N # CYRILLIC CAPITAL LETTER KOMI NJE
+050B;N # CYRILLIC SMALL LETTER KOMI NJE
+050C;N # CYRILLIC CAPITAL LETTER KOMI SJE
+050D;N # CYRILLIC SMALL LETTER KOMI SJE
+050E;N # CYRILLIC CAPITAL LETTER KOMI TJE
+050F;N # CYRILLIC SMALL LETTER KOMI TJE
+0531;N # ARMENIAN CAPITAL LETTER AYB
+0532;N # ARMENIAN CAPITAL LETTER BEN
+0533;N # ARMENIAN CAPITAL LETTER GIM
+0534;N # ARMENIAN CAPITAL LETTER DA
+0535;N # ARMENIAN CAPITAL LETTER ECH
+0536;N # ARMENIAN CAPITAL LETTER ZA
+0537;N # ARMENIAN CAPITAL LETTER EH
+0538;N # ARMENIAN CAPITAL LETTER ET
+0539;N # ARMENIAN CAPITAL LETTER TO
+053A;N # ARMENIAN CAPITAL LETTER ZHE
+053B;N # ARMENIAN CAPITAL LETTER INI
+053C;N # ARMENIAN CAPITAL LETTER LIWN
+053D;N # ARMENIAN CAPITAL LETTER XEH
+053E;N # ARMENIAN CAPITAL LETTER CA
+053F;N # ARMENIAN CAPITAL LETTER KEN
+0540;N # ARMENIAN CAPITAL LETTER HO
+0541;N # ARMENIAN CAPITAL LETTER JA
+0542;N # ARMENIAN CAPITAL LETTER GHAD
+0543;N # ARMENIAN CAPITAL LETTER CHEH
+0544;N # ARMENIAN CAPITAL LETTER MEN
+0545;N # ARMENIAN CAPITAL LETTER YI
+0546;N # ARMENIAN CAPITAL LETTER NOW
+0547;N # ARMENIAN CAPITAL LETTER SHA
+0548;N # ARMENIAN CAPITAL LETTER VO
+0549;N # ARMENIAN CAPITAL LETTER CHA
+054A;N # ARMENIAN CAPITAL LETTER PEH
+054B;N # ARMENIAN CAPITAL LETTER JHEH
+054C;N # ARMENIAN CAPITAL LETTER RA
+054D;N # ARMENIAN CAPITAL LETTER SEH
+054E;N # ARMENIAN CAPITAL LETTER VEW
+054F;N # ARMENIAN CAPITAL LETTER TIWN
+0550;N # ARMENIAN CAPITAL LETTER REH
+0551;N # ARMENIAN CAPITAL LETTER CO
+0552;N # ARMENIAN CAPITAL LETTER YIWN
+0553;N # ARMENIAN CAPITAL LETTER PIWR
+0554;N # ARMENIAN CAPITAL LETTER KEH
+0555;N # ARMENIAN CAPITAL LETTER OH
+0556;N # ARMENIAN CAPITAL LETTER FEH
+0559;N # ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A;N # ARMENIAN APOSTROPHE
+055B;N # ARMENIAN EMPHASIS MARK
+055C;N # ARMENIAN EXCLAMATION MARK
+055D;N # ARMENIAN COMMA
+055E;N # ARMENIAN QUESTION MARK
+055F;N # ARMENIAN ABBREVIATION MARK
+0561;N # ARMENIAN SMALL LETTER AYB
+0562;N # ARMENIAN SMALL LETTER BEN
+0563;N # ARMENIAN SMALL LETTER GIM
+0564;N # ARMENIAN SMALL LETTER DA
+0565;N # ARMENIAN SMALL LETTER ECH
+0566;N # ARMENIAN SMALL LETTER ZA
+0567;N # ARMENIAN SMALL LETTER EH
+0568;N # ARMENIAN SMALL LETTER ET
+0569;N # ARMENIAN SMALL LETTER TO
+056A;N # ARMENIAN SMALL LETTER ZHE
+056B;N # ARMENIAN SMALL LETTER INI
+056C;N # ARMENIAN SMALL LETTER LIWN
+056D;N # ARMENIAN SMALL LETTER XEH
+056E;N # ARMENIAN SMALL LETTER CA
+056F;N # ARMENIAN SMALL LETTER KEN
+0570;N # ARMENIAN SMALL LETTER HO
+0571;N # ARMENIAN SMALL LETTER JA
+0572;N # ARMENIAN SMALL LETTER GHAD
+0573;N # ARMENIAN SMALL LETTER CHEH
+0574;N # ARMENIAN SMALL LETTER MEN
+0575;N # ARMENIAN SMALL LETTER YI
+0576;N # ARMENIAN SMALL LETTER NOW
+0577;N # ARMENIAN SMALL LETTER SHA
+0578;N # ARMENIAN SMALL LETTER VO
+0579;N # ARMENIAN SMALL LETTER CHA
+057A;N # ARMENIAN SMALL LETTER PEH
+057B;N # ARMENIAN SMALL LETTER JHEH
+057C;N # ARMENIAN SMALL LETTER RA
+057D;N # ARMENIAN SMALL LETTER SEH
+057E;N # ARMENIAN SMALL LETTER VEW
+057F;N # ARMENIAN SMALL LETTER TIWN
+0580;N # ARMENIAN SMALL LETTER REH
+0581;N # ARMENIAN SMALL LETTER CO
+0582;N # ARMENIAN SMALL LETTER YIWN
+0583;N # ARMENIAN SMALL LETTER PIWR
+0584;N # ARMENIAN SMALL LETTER KEH
+0585;N # ARMENIAN SMALL LETTER OH
+0586;N # ARMENIAN SMALL LETTER FEH
+0587;N # ARMENIAN SMALL LIGATURE ECH YIWN
+0589;N # ARMENIAN FULL STOP
+058A;N # ARMENIAN HYPHEN
+0591;N # HEBREW ACCENT ETNAHTA
+0592;N # HEBREW ACCENT SEGOL
+0593;N # HEBREW ACCENT SHALSHELET
+0594;N # HEBREW ACCENT ZAQEF QATAN
+0595;N # HEBREW ACCENT ZAQEF GADOL
+0596;N # HEBREW ACCENT TIPEHA
+0597;N # HEBREW ACCENT REVIA
+0598;N # HEBREW ACCENT ZARQA
+0599;N # HEBREW ACCENT PASHTA
+059A;N # HEBREW ACCENT YETIV
+059B;N # HEBREW ACCENT TEVIR
+059C;N # HEBREW ACCENT GERESH
+059D;N # HEBREW ACCENT GERESH MUQDAM
+059E;N # HEBREW ACCENT GERSHAYIM
+059F;N # HEBREW ACCENT QARNEY PARA
+05A0;N # HEBREW ACCENT TELISHA GEDOLA
+05A1;N # HEBREW ACCENT PAZER
+05A2;N # HEBREW ACCENT ATNAH HAFUKH
+05A3;N # HEBREW ACCENT MUNAH
+05A4;N # HEBREW ACCENT MAHAPAKH
+05A5;N # HEBREW ACCENT MERKHA
+05A6;N # HEBREW ACCENT MERKHA KEFULA
+05A7;N # HEBREW ACCENT DARGA
+05A8;N # HEBREW ACCENT QADMA
+05A9;N # HEBREW ACCENT TELISHA QETANA
+05AA;N # HEBREW ACCENT YERAH BEN YOMO
+05AB;N # HEBREW ACCENT OLE
+05AC;N # HEBREW ACCENT ILUY
+05AD;N # HEBREW ACCENT DEHI
+05AE;N # HEBREW ACCENT ZINOR
+05AF;N # HEBREW MARK MASORA CIRCLE
+05B0;N # HEBREW POINT SHEVA
+05B1;N # HEBREW POINT HATAF SEGOL
+05B2;N # HEBREW POINT HATAF PATAH
+05B3;N # HEBREW POINT HATAF QAMATS
+05B4;N # HEBREW POINT HIRIQ
+05B5;N # HEBREW POINT TSERE
+05B6;N # HEBREW POINT SEGOL
+05B7;N # HEBREW POINT PATAH
+05B8;N # HEBREW POINT QAMATS
+05B9;N # HEBREW POINT HOLAM
+05BB;N # HEBREW POINT QUBUTS
+05BC;N # HEBREW POINT DAGESH OR MAPIQ
+05BD;N # HEBREW POINT METEG
+05BE;N # HEBREW PUNCTUATION MAQAF
+05BF;N # HEBREW POINT RAFE
+05C0;N # HEBREW PUNCTUATION PASEQ
+05C1;N # HEBREW POINT SHIN DOT
+05C2;N # HEBREW POINT SIN DOT
+05C3;N # HEBREW PUNCTUATION SOF PASUQ
+05C4;N # HEBREW MARK UPPER DOT
+05C5;N # HEBREW MARK LOWER DOT
+05C6;N # HEBREW PUNCTUATION NUN HAFUKHA
+05C7;N # HEBREW POINT QAMATS QATAN
+05D0;N # HEBREW LETTER ALEF
+05D1;N # HEBREW LETTER BET
+05D2;N # HEBREW LETTER GIMEL
+05D3;N # HEBREW LETTER DALET
+05D4;N # HEBREW LETTER HE
+05D5;N # HEBREW LETTER VAV
+05D6;N # HEBREW LETTER ZAYIN
+05D7;N # HEBREW LETTER HET
+05D8;N # HEBREW LETTER TET
+05D9;N # HEBREW LETTER YOD
+05DA;N # HEBREW LETTER FINAL KAF
+05DB;N # HEBREW LETTER KAF
+05DC;N # HEBREW LETTER LAMED
+05DD;N # HEBREW LETTER FINAL MEM
+05DE;N # HEBREW LETTER MEM
+05DF;N # HEBREW LETTER FINAL NUN
+05E0;N # HEBREW LETTER NUN
+05E1;N # HEBREW LETTER SAMEKH
+05E2;N # HEBREW LETTER AYIN
+05E3;N # HEBREW LETTER FINAL PE
+05E4;N # HEBREW LETTER PE
+05E5;N # HEBREW LETTER FINAL TSADI
+05E6;N # HEBREW LETTER TSADI
+05E7;N # HEBREW LETTER QOF
+05E8;N # HEBREW LETTER RESH
+05E9;N # HEBREW LETTER SHIN
+05EA;N # HEBREW LETTER TAV
+05F0;N # HEBREW LIGATURE YIDDISH DOUBLE VAV
+05F1;N # HEBREW LIGATURE YIDDISH VAV YOD
+05F2;N # HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3;N # HEBREW PUNCTUATION GERESH
+05F4;N # HEBREW PUNCTUATION GERSHAYIM
+0600;N # ARABIC NUMBER SIGN
+0601;N # ARABIC SIGN SANAH
+0602;N # ARABIC FOOTNOTE MARKER
+0603;N # ARABIC SIGN SAFHA
+060B;N # AFGHANI SIGN
+060C;N # ARABIC COMMA
+060D;N # ARABIC DATE SEPARATOR
+060E;N # ARABIC POETIC VERSE SIGN
+060F;N # ARABIC SIGN MISRA
+0610;N # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611;N # ARABIC SIGN ALAYHE ASSALLAM
+0612;N # ARABIC SIGN RAHMATULLAH ALAYHE
+0613;N # ARABIC SIGN RADI ALLAHOU ANHU
+0614;N # ARABIC SIGN TAKHALLUS
+0615;N # ARABIC SMALL HIGH TAH
+061B;N # ARABIC SEMICOLON
+061E;N # ARABIC TRIPLE DOT PUNCTUATION MARK
+061F;N # ARABIC QUESTION MARK
+0621;N # ARABIC LETTER HAMZA
+0622;N # ARABIC LETTER ALEF WITH MADDA ABOVE
+0623;N # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0624;N # ARABIC LETTER WAW WITH HAMZA ABOVE
+0625;N # ARABIC LETTER ALEF WITH HAMZA BELOW
+0626;N # ARABIC LETTER YEH WITH HAMZA ABOVE
+0627;N # ARABIC LETTER ALEF
+0628;N # ARABIC LETTER BEH
+0629;N # ARABIC LETTER TEH MARBUTA
+062A;N # ARABIC LETTER TEH
+062B;N # ARABIC LETTER THEH
+062C;N # ARABIC LETTER JEEM
+062D;N # ARABIC LETTER HAH
+062E;N # ARABIC LETTER KHAH
+062F;N # ARABIC LETTER DAL
+0630;N # ARABIC LETTER THAL
+0631;N # ARABIC LETTER REH
+0632;N # ARABIC LETTER ZAIN
+0633;N # ARABIC LETTER SEEN
+0634;N # ARABIC LETTER SHEEN
+0635;N # ARABIC LETTER SAD
+0636;N # ARABIC LETTER DAD
+0637;N # ARABIC LETTER TAH
+0638;N # ARABIC LETTER ZAH
+0639;N # ARABIC LETTER AIN
+063A;N # ARABIC LETTER GHAIN
+0640;N # ARABIC TATWEEL
+0641;N # ARABIC LETTER FEH
+0642;N # ARABIC LETTER QAF
+0643;N # ARABIC LETTER KAF
+0644;N # ARABIC LETTER LAM
+0645;N # ARABIC LETTER MEEM
+0646;N # ARABIC LETTER NOON
+0647;N # ARABIC LETTER HEH
+0648;N # ARABIC LETTER WAW
+0649;N # ARABIC LETTER ALEF MAKSURA
+064A;N # ARABIC LETTER YEH
+064B;N # ARABIC FATHATAN
+064C;N # ARABIC DAMMATAN
+064D;N # ARABIC KASRATAN
+064E;N # ARABIC FATHA
+064F;N # ARABIC DAMMA
+0650;N # ARABIC KASRA
+0651;N # ARABIC SHADDA
+0652;N # ARABIC SUKUN
+0653;N # ARABIC MADDAH ABOVE
+0654;N # ARABIC HAMZA ABOVE
+0655;N # ARABIC HAMZA BELOW
+0656;N # ARABIC SUBSCRIPT ALEF
+0657;N # ARABIC INVERTED DAMMA
+0658;N # ARABIC MARK NOON GHUNNA
+0659;N # ARABIC ZWARAKAY
+065A;N # ARABIC VOWEL SIGN SMALL V ABOVE
+065B;N # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+065C;N # ARABIC VOWEL SIGN DOT BELOW
+065D;N # ARABIC REVERSED DAMMA
+065E;N # ARABIC FATHA WITH TWO DOTS
+0660;N # ARABIC-INDIC DIGIT ZERO
+0661;N # ARABIC-INDIC DIGIT ONE
+0662;N # ARABIC-INDIC DIGIT TWO
+0663;N # ARABIC-INDIC DIGIT THREE
+0664;N # ARABIC-INDIC DIGIT FOUR
+0665;N # ARABIC-INDIC DIGIT FIVE
+0666;N # ARABIC-INDIC DIGIT SIX
+0667;N # ARABIC-INDIC DIGIT SEVEN
+0668;N # ARABIC-INDIC DIGIT EIGHT
+0669;N # ARABIC-INDIC DIGIT NINE
+066A;N # ARABIC PERCENT SIGN
+066B;N # ARABIC DECIMAL SEPARATOR
+066C;N # ARABIC THOUSANDS SEPARATOR
+066D;N # ARABIC FIVE POINTED STAR
+066E;N # ARABIC LETTER DOTLESS BEH
+066F;N # ARABIC LETTER DOTLESS QAF
+0670;N # ARABIC LETTER SUPERSCRIPT ALEF
+0671;N # ARABIC LETTER ALEF WASLA
+0672;N # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0673;N # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0674;N # ARABIC LETTER HIGH HAMZA
+0675;N # ARABIC LETTER HIGH HAMZA ALEF
+0676;N # ARABIC LETTER HIGH HAMZA WAW
+0677;N # ARABIC LETTER U WITH HAMZA ABOVE
+0678;N # ARABIC LETTER HIGH HAMZA YEH
+0679;N # ARABIC LETTER TTEH
+067A;N # ARABIC LETTER TTEHEH
+067B;N # ARABIC LETTER BEEH
+067C;N # ARABIC LETTER TEH WITH RING
+067D;N # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067E;N # ARABIC LETTER PEH
+067F;N # ARABIC LETTER TEHEH
+0680;N # ARABIC LETTER BEHEH
+0681;N # ARABIC LETTER HAH WITH HAMZA ABOVE
+0682;N # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0683;N # ARABIC LETTER NYEH
+0684;N # ARABIC LETTER DYEH
+0685;N # ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0686;N # ARABIC LETTER TCHEH
+0687;N # ARABIC LETTER TCHEHEH
+0688;N # ARABIC LETTER DDAL
+0689;N # ARABIC LETTER DAL WITH RING
+068A;N # ARABIC LETTER DAL WITH DOT BELOW
+068B;N # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C;N # ARABIC LETTER DAHAL
+068D;N # ARABIC LETTER DDAHAL
+068E;N # ARABIC LETTER DUL
+068F;N # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690;N # ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+0691;N # ARABIC LETTER RREH
+0692;N # ARABIC LETTER REH WITH SMALL V
+0693;N # ARABIC LETTER REH WITH RING
+0694;N # ARABIC LETTER REH WITH DOT BELOW
+0695;N # ARABIC LETTER REH WITH SMALL V BELOW
+0696;N # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697;N # ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698;N # ARABIC LETTER JEH
+0699;N # ARABIC LETTER REH WITH FOUR DOTS ABOVE
+069A;N # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B;N # ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C;N # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+069D;N # ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E;N # ARABIC LETTER SAD WITH THREE DOTS ABOVE
+069F;N # ARABIC LETTER TAH WITH THREE DOTS ABOVE
+06A0;N # ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06A1;N # ARABIC LETTER DOTLESS FEH
+06A2;N # ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3;N # ARABIC LETTER FEH WITH DOT BELOW
+06A4;N # ARABIC LETTER VEH
+06A5;N # ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6;N # ARABIC LETTER PEHEH
+06A7;N # ARABIC LETTER QAF WITH DOT ABOVE
+06A8;N # ARABIC LETTER QAF WITH THREE DOTS ABOVE
+06A9;N # ARABIC LETTER KEHEH
+06AA;N # ARABIC LETTER SWASH KAF
+06AB;N # ARABIC LETTER KAF WITH RING
+06AC;N # ARABIC LETTER KAF WITH DOT ABOVE
+06AD;N # ARABIC LETTER NG
+06AE;N # ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF;N # ARABIC LETTER GAF
+06B0;N # ARABIC LETTER GAF WITH RING
+06B1;N # ARABIC LETTER NGOEH
+06B2;N # ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3;N # ARABIC LETTER GUEH
+06B4;N # ARABIC LETTER GAF WITH THREE DOTS ABOVE
+06B5;N # ARABIC LETTER LAM WITH SMALL V
+06B6;N # ARABIC LETTER LAM WITH DOT ABOVE
+06B7;N # ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8;N # ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9;N # ARABIC LETTER NOON WITH DOT BELOW
+06BA;N # ARABIC LETTER NOON GHUNNA
+06BB;N # ARABIC LETTER RNOON
+06BC;N # ARABIC LETTER NOON WITH RING
+06BD;N # ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06BE;N # ARABIC LETTER HEH DOACHASHMEE
+06BF;N # ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0;N # ARABIC LETTER HEH WITH YEH ABOVE
+06C1;N # ARABIC LETTER HEH GOAL
+06C2;N # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06C3;N # ARABIC LETTER TEH MARBUTA GOAL
+06C4;N # ARABIC LETTER WAW WITH RING
+06C5;N # ARABIC LETTER KIRGHIZ OE
+06C6;N # ARABIC LETTER OE
+06C7;N # ARABIC LETTER U
+06C8;N # ARABIC LETTER YU
+06C9;N # ARABIC LETTER KIRGHIZ YU
+06CA;N # ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB;N # ARABIC LETTER VE
+06CC;N # ARABIC LETTER FARSI YEH
+06CD;N # ARABIC LETTER YEH WITH TAIL
+06CE;N # ARABIC LETTER YEH WITH SMALL V
+06CF;N # ARABIC LETTER WAW WITH DOT ABOVE
+06D0;N # ARABIC LETTER E
+06D1;N # ARABIC LETTER YEH WITH THREE DOTS BELOW
+06D2;N # ARABIC LETTER YEH BARREE
+06D3;N # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4;N # ARABIC FULL STOP
+06D5;N # ARABIC LETTER AE
+06D6;N # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7;N # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8;N # ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9;N # ARABIC SMALL HIGH LAM ALEF
+06DA;N # ARABIC SMALL HIGH JEEM
+06DB;N # ARABIC SMALL HIGH THREE DOTS
+06DC;N # ARABIC SMALL HIGH SEEN
+06DD;N # ARABIC END OF AYAH
+06DE;N # ARABIC START OF RUB EL HIZB
+06DF;N # ARABIC SMALL HIGH ROUNDED ZERO
+06E0;N # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1;N # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2;N # ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3;N # ARABIC SMALL LOW SEEN
+06E4;N # ARABIC SMALL HIGH MADDA
+06E5;N # ARABIC SMALL WAW
+06E6;N # ARABIC SMALL YEH
+06E7;N # ARABIC SMALL HIGH YEH
+06E8;N # ARABIC SMALL HIGH NOON
+06E9;N # ARABIC PLACE OF SAJDAH
+06EA;N # ARABIC EMPTY CENTRE LOW STOP
+06EB;N # ARABIC EMPTY CENTRE HIGH STOP
+06EC;N # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED;N # ARABIC SMALL LOW MEEM
+06EE;N # ARABIC LETTER DAL WITH INVERTED V
+06EF;N # ARABIC LETTER REH WITH INVERTED V
+06F0;N # EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1;N # EXTENDED ARABIC-INDIC DIGIT ONE
+06F2;N # EXTENDED ARABIC-INDIC DIGIT TWO
+06F3;N # EXTENDED ARABIC-INDIC DIGIT THREE
+06F4;N # EXTENDED ARABIC-INDIC DIGIT FOUR
+06F5;N # EXTENDED ARABIC-INDIC DIGIT FIVE
+06F6;N # EXTENDED ARABIC-INDIC DIGIT SIX
+06F7;N # EXTENDED ARABIC-INDIC DIGIT SEVEN
+06F8;N # EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9;N # EXTENDED ARABIC-INDIC DIGIT NINE
+06FA;N # ARABIC LETTER SHEEN WITH DOT BELOW
+06FB;N # ARABIC LETTER DAD WITH DOT BELOW
+06FC;N # ARABIC LETTER GHAIN WITH DOT BELOW
+06FD;N # ARABIC SIGN SINDHI AMPERSAND
+06FE;N # ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF;N # ARABIC LETTER HEH WITH INVERTED V
+0700;N # SYRIAC END OF PARAGRAPH
+0701;N # SYRIAC SUPRALINEAR FULL STOP
+0702;N # SYRIAC SUBLINEAR FULL STOP
+0703;N # SYRIAC SUPRALINEAR COLON
+0704;N # SYRIAC SUBLINEAR COLON
+0705;N # SYRIAC HORIZONTAL COLON
+0706;N # SYRIAC COLON SKEWED LEFT
+0707;N # SYRIAC COLON SKEWED RIGHT
+0708;N # SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709;N # SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A;N # SYRIAC CONTRACTION
+070B;N # SYRIAC HARKLEAN OBELUS
+070C;N # SYRIAC HARKLEAN METOBELUS
+070D;N # SYRIAC HARKLEAN ASTERISCUS
+070F;N # SYRIAC ABBREVIATION MARK
+0710;N # SYRIAC LETTER ALAPH
+0711;N # SYRIAC LETTER SUPERSCRIPT ALAPH
+0712;N # SYRIAC LETTER BETH
+0713;N # SYRIAC LETTER GAMAL
+0714;N # SYRIAC LETTER GAMAL GARSHUNI
+0715;N # SYRIAC LETTER DALATH
+0716;N # SYRIAC LETTER DOTLESS DALATH RISH
+0717;N # SYRIAC LETTER HE
+0718;N # SYRIAC LETTER WAW
+0719;N # SYRIAC LETTER ZAIN
+071A;N # SYRIAC LETTER HETH
+071B;N # SYRIAC LETTER TETH
+071C;N # SYRIAC LETTER TETH GARSHUNI
+071D;N # SYRIAC LETTER YUDH
+071E;N # SYRIAC LETTER YUDH HE
+071F;N # SYRIAC LETTER KAPH
+0720;N # SYRIAC LETTER LAMADH
+0721;N # SYRIAC LETTER MIM
+0722;N # SYRIAC LETTER NUN
+0723;N # SYRIAC LETTER SEMKATH
+0724;N # SYRIAC LETTER FINAL SEMKATH
+0725;N # SYRIAC LETTER E
+0726;N # SYRIAC LETTER PE
+0727;N # SYRIAC LETTER REVERSED PE
+0728;N # SYRIAC LETTER SADHE
+0729;N # SYRIAC LETTER QAPH
+072A;N # SYRIAC LETTER RISH
+072B;N # SYRIAC LETTER SHIN
+072C;N # SYRIAC LETTER TAW
+072D;N # SYRIAC LETTER PERSIAN BHETH
+072E;N # SYRIAC LETTER PERSIAN GHAMAL
+072F;N # SYRIAC LETTER PERSIAN DHALATH
+0730;N # SYRIAC PTHAHA ABOVE
+0731;N # SYRIAC PTHAHA BELOW
+0732;N # SYRIAC PTHAHA DOTTED
+0733;N # SYRIAC ZQAPHA ABOVE
+0734;N # SYRIAC ZQAPHA BELOW
+0735;N # SYRIAC ZQAPHA DOTTED
+0736;N # SYRIAC RBASA ABOVE
+0737;N # SYRIAC RBASA BELOW
+0738;N # SYRIAC DOTTED ZLAMA HORIZONTAL
+0739;N # SYRIAC DOTTED ZLAMA ANGULAR
+073A;N # SYRIAC HBASA ABOVE
+073B;N # SYRIAC HBASA BELOW
+073C;N # SYRIAC HBASA-ESASA DOTTED
+073D;N # SYRIAC ESASA ABOVE
+073E;N # SYRIAC ESASA BELOW
+073F;N # SYRIAC RWAHA
+0740;N # SYRIAC FEMININE DOT
+0741;N # SYRIAC QUSHSHAYA
+0742;N # SYRIAC RUKKAKHA
+0743;N # SYRIAC TWO VERTICAL DOTS ABOVE
+0744;N # SYRIAC TWO VERTICAL DOTS BELOW
+0745;N # SYRIAC THREE DOTS ABOVE
+0746;N # SYRIAC THREE DOTS BELOW
+0747;N # SYRIAC OBLIQUE LINE ABOVE
+0748;N # SYRIAC OBLIQUE LINE BELOW
+0749;N # SYRIAC MUSIC
+074A;N # SYRIAC BARREKH
+074D;N # SYRIAC LETTER SOGDIAN ZHAIN
+074E;N # SYRIAC LETTER SOGDIAN KHAPH
+074F;N # SYRIAC LETTER SOGDIAN FE
+0750;N # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751;N # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752;N # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753;N # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754;N # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755;N # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756;N # ARABIC LETTER BEH WITH SMALL V
+0757;N # ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758;N # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+0759;N # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+075A;N # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+075B;N # ARABIC LETTER REH WITH STROKE
+075C;N # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+075D;N # ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E;N # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F;N # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0760;N # ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761;N # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+0762;N # ARABIC LETTER KEHEH WITH DOT ABOVE
+0763;N # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+0764;N # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0765;N # ARABIC LETTER MEEM WITH DOT ABOVE
+0766;N # ARABIC LETTER MEEM WITH DOT BELOW
+0767;N # ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768;N # ARABIC LETTER NOON WITH SMALL TAH
+0769;N # ARABIC LETTER NOON WITH SMALL V
+076A;N # ARABIC LETTER LAM WITH BAR
+076B;N # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+076C;N # ARABIC LETTER REH WITH HAMZA ABOVE
+076D;N # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+0780;N # THAANA LETTER HAA
+0781;N # THAANA LETTER SHAVIYANI
+0782;N # THAANA LETTER NOONU
+0783;N # THAANA LETTER RAA
+0784;N # THAANA LETTER BAA
+0785;N # THAANA LETTER LHAVIYANI
+0786;N # THAANA LETTER KAAFU
+0787;N # THAANA LETTER ALIFU
+0788;N # THAANA LETTER VAAVU
+0789;N # THAANA LETTER MEEMU
+078A;N # THAANA LETTER FAAFU
+078B;N # THAANA LETTER DHAALU
+078C;N # THAANA LETTER THAA
+078D;N # THAANA LETTER LAAMU
+078E;N # THAANA LETTER GAAFU
+078F;N # THAANA LETTER GNAVIYANI
+0790;N # THAANA LETTER SEENU
+0791;N # THAANA LETTER DAVIYANI
+0792;N # THAANA LETTER ZAVIYANI
+0793;N # THAANA LETTER TAVIYANI
+0794;N # THAANA LETTER YAA
+0795;N # THAANA LETTER PAVIYANI
+0796;N # THAANA LETTER JAVIYANI
+0797;N # THAANA LETTER CHAVIYANI
+0798;N # THAANA LETTER TTAA
+0799;N # THAANA LETTER HHAA
+079A;N # THAANA LETTER KHAA
+079B;N # THAANA LETTER THAALU
+079C;N # THAANA LETTER ZAA
+079D;N # THAANA LETTER SHEENU
+079E;N # THAANA LETTER SAADHU
+079F;N # THAANA LETTER DAADHU
+07A0;N # THAANA LETTER TO
+07A1;N # THAANA LETTER ZO
+07A2;N # THAANA LETTER AINU
+07A3;N # THAANA LETTER GHAINU
+07A4;N # THAANA LETTER QAAFU
+07A5;N # THAANA LETTER WAAVU
+07A6;N # THAANA ABAFILI
+07A7;N # THAANA AABAAFILI
+07A8;N # THAANA IBIFILI
+07A9;N # THAANA EEBEEFILI
+07AA;N # THAANA UBUFILI
+07AB;N # THAANA OOBOOFILI
+07AC;N # THAANA EBEFILI
+07AD;N # THAANA EYBEYFILI
+07AE;N # THAANA OBOFILI
+07AF;N # THAANA OABOAFILI
+07B0;N # THAANA SUKUN
+07B1;N # THAANA LETTER NAA
+0901;N # DEVANAGARI SIGN CANDRABINDU
+0902;N # DEVANAGARI SIGN ANUSVARA
+0903;N # DEVANAGARI SIGN VISARGA
+0904;N # DEVANAGARI LETTER SHORT A
+0905;N # DEVANAGARI LETTER A
+0906;N # DEVANAGARI LETTER AA
+0907;N # DEVANAGARI LETTER I
+0908;N # DEVANAGARI LETTER II
+0909;N # DEVANAGARI LETTER U
+090A;N # DEVANAGARI LETTER UU
+090B;N # DEVANAGARI LETTER VOCALIC R
+090C;N # DEVANAGARI LETTER VOCALIC L
+090D;N # DEVANAGARI LETTER CANDRA E
+090E;N # DEVANAGARI LETTER SHORT E
+090F;N # DEVANAGARI LETTER E
+0910;N # DEVANAGARI LETTER AI
+0911;N # DEVANAGARI LETTER CANDRA O
+0912;N # DEVANAGARI LETTER SHORT O
+0913;N # DEVANAGARI LETTER O
+0914;N # DEVANAGARI LETTER AU
+0915;N # DEVANAGARI LETTER KA
+0916;N # DEVANAGARI LETTER KHA
+0917;N # DEVANAGARI LETTER GA
+0918;N # DEVANAGARI LETTER GHA
+0919;N # DEVANAGARI LETTER NGA
+091A;N # DEVANAGARI LETTER CA
+091B;N # DEVANAGARI LETTER CHA
+091C;N # DEVANAGARI LETTER JA
+091D;N # DEVANAGARI LETTER JHA
+091E;N # DEVANAGARI LETTER NYA
+091F;N # DEVANAGARI LETTER TTA
+0920;N # DEVANAGARI LETTER TTHA
+0921;N # DEVANAGARI LETTER DDA
+0922;N # DEVANAGARI LETTER DDHA
+0923;N # DEVANAGARI LETTER NNA
+0924;N # DEVANAGARI LETTER TA
+0925;N # DEVANAGARI LETTER THA
+0926;N # DEVANAGARI LETTER DA
+0927;N # DEVANAGARI LETTER DHA
+0928;N # DEVANAGARI LETTER NA
+0929;N # DEVANAGARI LETTER NNNA
+092A;N # DEVANAGARI LETTER PA
+092B;N # DEVANAGARI LETTER PHA
+092C;N # DEVANAGARI LETTER BA
+092D;N # DEVANAGARI LETTER BHA
+092E;N # DEVANAGARI LETTER MA
+092F;N # DEVANAGARI LETTER YA
+0930;N # DEVANAGARI LETTER RA
+0931;N # DEVANAGARI LETTER RRA
+0932;N # DEVANAGARI LETTER LA
+0933;N # DEVANAGARI LETTER LLA
+0934;N # DEVANAGARI LETTER LLLA
+0935;N # DEVANAGARI LETTER VA
+0936;N # DEVANAGARI LETTER SHA
+0937;N # DEVANAGARI LETTER SSA
+0938;N # DEVANAGARI LETTER SA
+0939;N # DEVANAGARI LETTER HA
+093C;N # DEVANAGARI SIGN NUKTA
+093D;N # DEVANAGARI SIGN AVAGRAHA
+093E;N # DEVANAGARI VOWEL SIGN AA
+093F;N # DEVANAGARI VOWEL SIGN I
+0940;N # DEVANAGARI VOWEL SIGN II
+0941;N # DEVANAGARI VOWEL SIGN U
+0942;N # DEVANAGARI VOWEL SIGN UU
+0943;N # DEVANAGARI VOWEL SIGN VOCALIC R
+0944;N # DEVANAGARI VOWEL SIGN VOCALIC RR
+0945;N # DEVANAGARI VOWEL SIGN CANDRA E
+0946;N # DEVANAGARI VOWEL SIGN SHORT E
+0947;N # DEVANAGARI VOWEL SIGN E
+0948;N # DEVANAGARI VOWEL SIGN AI
+0949;N # DEVANAGARI VOWEL SIGN CANDRA O
+094A;N # DEVANAGARI VOWEL SIGN SHORT O
+094B;N # DEVANAGARI VOWEL SIGN O
+094C;N # DEVANAGARI VOWEL SIGN AU
+094D;N # DEVANAGARI SIGN VIRAMA
+0950;N # DEVANAGARI OM
+0951;N # DEVANAGARI STRESS SIGN UDATTA
+0952;N # DEVANAGARI STRESS SIGN ANUDATTA
+0953;N # DEVANAGARI GRAVE ACCENT
+0954;N # DEVANAGARI ACUTE ACCENT
+0958;N # DEVANAGARI LETTER QA
+0959;N # DEVANAGARI LETTER KHHA
+095A;N # DEVANAGARI LETTER GHHA
+095B;N # DEVANAGARI LETTER ZA
+095C;N # DEVANAGARI LETTER DDDHA
+095D;N # DEVANAGARI LETTER RHA
+095E;N # DEVANAGARI LETTER FA
+095F;N # DEVANAGARI LETTER YYA
+0960;N # DEVANAGARI LETTER VOCALIC RR
+0961;N # DEVANAGARI LETTER VOCALIC LL
+0962;N # DEVANAGARI VOWEL SIGN VOCALIC L
+0963;N # DEVANAGARI VOWEL SIGN VOCALIC LL
+0964;N # DEVANAGARI DANDA
+0965;N # DEVANAGARI DOUBLE DANDA
+0966;N # DEVANAGARI DIGIT ZERO
+0967;N # DEVANAGARI DIGIT ONE
+0968;N # DEVANAGARI DIGIT TWO
+0969;N # DEVANAGARI DIGIT THREE
+096A;N # DEVANAGARI DIGIT FOUR
+096B;N # DEVANAGARI DIGIT FIVE
+096C;N # DEVANAGARI DIGIT SIX
+096D;N # DEVANAGARI DIGIT SEVEN
+096E;N # DEVANAGARI DIGIT EIGHT
+096F;N # DEVANAGARI DIGIT NINE
+0970;N # DEVANAGARI ABBREVIATION SIGN
+097D;N # DEVANAGARI LETTER GLOTTAL STOP
+0981;N # BENGALI SIGN CANDRABINDU
+0982;N # BENGALI SIGN ANUSVARA
+0983;N # BENGALI SIGN VISARGA
+0985;N # BENGALI LETTER A
+0986;N # BENGALI LETTER AA
+0987;N # BENGALI LETTER I
+0988;N # BENGALI LETTER II
+0989;N # BENGALI LETTER U
+098A;N # BENGALI LETTER UU
+098B;N # BENGALI LETTER VOCALIC R
+098C;N # BENGALI LETTER VOCALIC L
+098F;N # BENGALI LETTER E
+0990;N # BENGALI LETTER AI
+0993;N # BENGALI LETTER O
+0994;N # BENGALI LETTER AU
+0995;N # BENGALI LETTER KA
+0996;N # BENGALI LETTER KHA
+0997;N # BENGALI LETTER GA
+0998;N # BENGALI LETTER GHA
+0999;N # BENGALI LETTER NGA
+099A;N # BENGALI LETTER CA
+099B;N # BENGALI LETTER CHA
+099C;N # BENGALI LETTER JA
+099D;N # BENGALI LETTER JHA
+099E;N # BENGALI LETTER NYA
+099F;N # BENGALI LETTER TTA
+09A0;N # BENGALI LETTER TTHA
+09A1;N # BENGALI LETTER DDA
+09A2;N # BENGALI LETTER DDHA
+09A3;N # BENGALI LETTER NNA
+09A4;N # BENGALI LETTER TA
+09A5;N # BENGALI LETTER THA
+09A6;N # BENGALI LETTER DA
+09A7;N # BENGALI LETTER DHA
+09A8;N # BENGALI LETTER NA
+09AA;N # BENGALI LETTER PA
+09AB;N # BENGALI LETTER PHA
+09AC;N # BENGALI LETTER BA
+09AD;N # BENGALI LETTER BHA
+09AE;N # BENGALI LETTER MA
+09AF;N # BENGALI LETTER YA
+09B0;N # BENGALI LETTER RA
+09B2;N # BENGALI LETTER LA
+09B6;N # BENGALI LETTER SHA
+09B7;N # BENGALI LETTER SSA
+09B8;N # BENGALI LETTER SA
+09B9;N # BENGALI LETTER HA
+09BC;N # BENGALI SIGN NUKTA
+09BD;N # BENGALI SIGN AVAGRAHA
+09BE;N # BENGALI VOWEL SIGN AA
+09BF;N # BENGALI VOWEL SIGN I
+09C0;N # BENGALI VOWEL SIGN II
+09C1;N # BENGALI VOWEL SIGN U
+09C2;N # BENGALI VOWEL SIGN UU
+09C3;N # BENGALI VOWEL SIGN VOCALIC R
+09C4;N # BENGALI VOWEL SIGN VOCALIC RR
+09C7;N # BENGALI VOWEL SIGN E
+09C8;N # BENGALI VOWEL SIGN AI
+09CB;N # BENGALI VOWEL SIGN O
+09CC;N # BENGALI VOWEL SIGN AU
+09CD;N # BENGALI SIGN VIRAMA
+09CE;N # BENGALI LETTER KHANDA TA
+09D7;N # BENGALI AU LENGTH MARK
+09DC;N # BENGALI LETTER RRA
+09DD;N # BENGALI LETTER RHA
+09DF;N # BENGALI LETTER YYA
+09E0;N # BENGALI LETTER VOCALIC RR
+09E1;N # BENGALI LETTER VOCALIC LL
+09E2;N # BENGALI VOWEL SIGN VOCALIC L
+09E3;N # BENGALI VOWEL SIGN VOCALIC LL
+09E6;N # BENGALI DIGIT ZERO
+09E7;N # BENGALI DIGIT ONE
+09E8;N # BENGALI DIGIT TWO
+09E9;N # BENGALI DIGIT THREE
+09EA;N # BENGALI DIGIT FOUR
+09EB;N # BENGALI DIGIT FIVE
+09EC;N # BENGALI DIGIT SIX
+09ED;N # BENGALI DIGIT SEVEN
+09EE;N # BENGALI DIGIT EIGHT
+09EF;N # BENGALI DIGIT NINE
+09F0;N # BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09F1;N # BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2;N # BENGALI RUPEE MARK
+09F3;N # BENGALI RUPEE SIGN
+09F4;N # BENGALI CURRENCY NUMERATOR ONE
+09F5;N # BENGALI CURRENCY NUMERATOR TWO
+09F6;N # BENGALI CURRENCY NUMERATOR THREE
+09F7;N # BENGALI CURRENCY NUMERATOR FOUR
+09F8;N # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9;N # BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA;N # BENGALI ISSHAR
+0A01;N # GURMUKHI SIGN ADAK BINDI
+0A02;N # GURMUKHI SIGN BINDI
+0A03;N # GURMUKHI SIGN VISARGA
+0A05;N # GURMUKHI LETTER A
+0A06;N # GURMUKHI LETTER AA
+0A07;N # GURMUKHI LETTER I
+0A08;N # GURMUKHI LETTER II
+0A09;N # GURMUKHI LETTER U
+0A0A;N # GURMUKHI LETTER UU
+0A0F;N # GURMUKHI LETTER EE
+0A10;N # GURMUKHI LETTER AI
+0A13;N # GURMUKHI LETTER OO
+0A14;N # GURMUKHI LETTER AU
+0A15;N # GURMUKHI LETTER KA
+0A16;N # GURMUKHI LETTER KHA
+0A17;N # GURMUKHI LETTER GA
+0A18;N # GURMUKHI LETTER GHA
+0A19;N # GURMUKHI LETTER NGA
+0A1A;N # GURMUKHI LETTER CA
+0A1B;N # GURMUKHI LETTER CHA
+0A1C;N # GURMUKHI LETTER JA
+0A1D;N # GURMUKHI LETTER JHA
+0A1E;N # GURMUKHI LETTER NYA
+0A1F;N # GURMUKHI LETTER TTA
+0A20;N # GURMUKHI LETTER TTHA
+0A21;N # GURMUKHI LETTER DDA
+0A22;N # GURMUKHI LETTER DDHA
+0A23;N # GURMUKHI LETTER NNA
+0A24;N # GURMUKHI LETTER TA
+0A25;N # GURMUKHI LETTER THA
+0A26;N # GURMUKHI LETTER DA
+0A27;N # GURMUKHI LETTER DHA
+0A28;N # GURMUKHI LETTER NA
+0A2A;N # GURMUKHI LETTER PA
+0A2B;N # GURMUKHI LETTER PHA
+0A2C;N # GURMUKHI LETTER BA
+0A2D;N # GURMUKHI LETTER BHA
+0A2E;N # GURMUKHI LETTER MA
+0A2F;N # GURMUKHI LETTER YA
+0A30;N # GURMUKHI LETTER RA
+0A32;N # GURMUKHI LETTER LA
+0A33;N # GURMUKHI LETTER LLA
+0A35;N # GURMUKHI LETTER VA
+0A36;N # GURMUKHI LETTER SHA
+0A38;N # GURMUKHI LETTER SA
+0A39;N # GURMUKHI LETTER HA
+0A3C;N # GURMUKHI SIGN NUKTA
+0A3E;N # GURMUKHI VOWEL SIGN AA
+0A3F;N # GURMUKHI VOWEL SIGN I
+0A40;N # GURMUKHI VOWEL SIGN II
+0A41;N # GURMUKHI VOWEL SIGN U
+0A42;N # GURMUKHI VOWEL SIGN UU
+0A47;N # GURMUKHI VOWEL SIGN EE
+0A48;N # GURMUKHI VOWEL SIGN AI
+0A4B;N # GURMUKHI VOWEL SIGN OO
+0A4C;N # GURMUKHI VOWEL SIGN AU
+0A4D;N # GURMUKHI SIGN VIRAMA
+0A59;N # GURMUKHI LETTER KHHA
+0A5A;N # GURMUKHI LETTER GHHA
+0A5B;N # GURMUKHI LETTER ZA
+0A5C;N # GURMUKHI LETTER RRA
+0A5E;N # GURMUKHI LETTER FA
+0A66;N # GURMUKHI DIGIT ZERO
+0A67;N # GURMUKHI DIGIT ONE
+0A68;N # GURMUKHI DIGIT TWO
+0A69;N # GURMUKHI DIGIT THREE
+0A6A;N # GURMUKHI DIGIT FOUR
+0A6B;N # GURMUKHI DIGIT FIVE
+0A6C;N # GURMUKHI DIGIT SIX
+0A6D;N # GURMUKHI DIGIT SEVEN
+0A6E;N # GURMUKHI DIGIT EIGHT
+0A6F;N # GURMUKHI DIGIT NINE
+0A70;N # GURMUKHI TIPPI
+0A71;N # GURMUKHI ADDAK
+0A72;N # GURMUKHI IRI
+0A73;N # GURMUKHI URA
+0A74;N # GURMUKHI EK ONKAR
+0A81;N # GUJARATI SIGN CANDRABINDU
+0A82;N # GUJARATI SIGN ANUSVARA
+0A83;N # GUJARATI SIGN VISARGA
+0A85;N # GUJARATI LETTER A
+0A86;N # GUJARATI LETTER AA
+0A87;N # GUJARATI LETTER I
+0A88;N # GUJARATI LETTER II
+0A89;N # GUJARATI LETTER U
+0A8A;N # GUJARATI LETTER UU
+0A8B;N # GUJARATI LETTER VOCALIC R
+0A8C;N # GUJARATI LETTER VOCALIC L
+0A8D;N # GUJARATI VOWEL CANDRA E
+0A8F;N # GUJARATI LETTER E
+0A90;N # GUJARATI LETTER AI
+0A91;N # GUJARATI VOWEL CANDRA O
+0A93;N # GUJARATI LETTER O
+0A94;N # GUJARATI LETTER AU
+0A95;N # GUJARATI LETTER KA
+0A96;N # GUJARATI LETTER KHA
+0A97;N # GUJARATI LETTER GA
+0A98;N # GUJARATI LETTER GHA
+0A99;N # GUJARATI LETTER NGA
+0A9A;N # GUJARATI LETTER CA
+0A9B;N # GUJARATI LETTER CHA
+0A9C;N # GUJARATI LETTER JA
+0A9D;N # GUJARATI LETTER JHA
+0A9E;N # GUJARATI LETTER NYA
+0A9F;N # GUJARATI LETTER TTA
+0AA0;N # GUJARATI LETTER TTHA
+0AA1;N # GUJARATI LETTER DDA
+0AA2;N # GUJARATI LETTER DDHA
+0AA3;N # GUJARATI LETTER NNA
+0AA4;N # GUJARATI LETTER TA
+0AA5;N # GUJARATI LETTER THA
+0AA6;N # GUJARATI LETTER DA
+0AA7;N # GUJARATI LETTER DHA
+0AA8;N # GUJARATI LETTER NA
+0AAA;N # GUJARATI LETTER PA
+0AAB;N # GUJARATI LETTER PHA
+0AAC;N # GUJARATI LETTER BA
+0AAD;N # GUJARATI LETTER BHA
+0AAE;N # GUJARATI LETTER MA
+0AAF;N # GUJARATI LETTER YA
+0AB0;N # GUJARATI LETTER RA
+0AB2;N # GUJARATI LETTER LA
+0AB3;N # GUJARATI LETTER LLA
+0AB5;N # GUJARATI LETTER VA
+0AB6;N # GUJARATI LETTER SHA
+0AB7;N # GUJARATI LETTER SSA
+0AB8;N # GUJARATI LETTER SA
+0AB9;N # GUJARATI LETTER HA
+0ABC;N # GUJARATI SIGN NUKTA
+0ABD;N # GUJARATI SIGN AVAGRAHA
+0ABE;N # GUJARATI VOWEL SIGN AA
+0ABF;N # GUJARATI VOWEL SIGN I
+0AC0;N # GUJARATI VOWEL SIGN II
+0AC1;N # GUJARATI VOWEL SIGN U
+0AC2;N # GUJARATI VOWEL SIGN UU
+0AC3;N # GUJARATI VOWEL SIGN VOCALIC R
+0AC4;N # GUJARATI VOWEL SIGN VOCALIC RR
+0AC5;N # GUJARATI VOWEL SIGN CANDRA E
+0AC7;N # GUJARATI VOWEL SIGN E
+0AC8;N # GUJARATI VOWEL SIGN AI
+0AC9;N # GUJARATI VOWEL SIGN CANDRA O
+0ACB;N # GUJARATI VOWEL SIGN O
+0ACC;N # GUJARATI VOWEL SIGN AU
+0ACD;N # GUJARATI SIGN VIRAMA
+0AD0;N # GUJARATI OM
+0AE0;N # GUJARATI LETTER VOCALIC RR
+0AE1;N # GUJARATI LETTER VOCALIC LL
+0AE2;N # GUJARATI VOWEL SIGN VOCALIC L
+0AE3;N # GUJARATI VOWEL SIGN VOCALIC LL
+0AE6;N # GUJARATI DIGIT ZERO
+0AE7;N # GUJARATI DIGIT ONE
+0AE8;N # GUJARATI DIGIT TWO
+0AE9;N # GUJARATI DIGIT THREE
+0AEA;N # GUJARATI DIGIT FOUR
+0AEB;N # GUJARATI DIGIT FIVE
+0AEC;N # GUJARATI DIGIT SIX
+0AED;N # GUJARATI DIGIT SEVEN
+0AEE;N # GUJARATI DIGIT EIGHT
+0AEF;N # GUJARATI DIGIT NINE
+0AF1;N # GUJARATI RUPEE SIGN
+0B01;N # ORIYA SIGN CANDRABINDU
+0B02;N # ORIYA SIGN ANUSVARA
+0B03;N # ORIYA SIGN VISARGA
+0B05;N # ORIYA LETTER A
+0B06;N # ORIYA LETTER AA
+0B07;N # ORIYA LETTER I
+0B08;N # ORIYA LETTER II
+0B09;N # ORIYA LETTER U
+0B0A;N # ORIYA LETTER UU
+0B0B;N # ORIYA LETTER VOCALIC R
+0B0C;N # ORIYA LETTER VOCALIC L
+0B0F;N # ORIYA LETTER E
+0B10;N # ORIYA LETTER AI
+0B13;N # ORIYA LETTER O
+0B14;N # ORIYA LETTER AU
+0B15;N # ORIYA LETTER KA
+0B16;N # ORIYA LETTER KHA
+0B17;N # ORIYA LETTER GA
+0B18;N # ORIYA LETTER GHA
+0B19;N # ORIYA LETTER NGA
+0B1A;N # ORIYA LETTER CA
+0B1B;N # ORIYA LETTER CHA
+0B1C;N # ORIYA LETTER JA
+0B1D;N # ORIYA LETTER JHA
+0B1E;N # ORIYA LETTER NYA
+0B1F;N # ORIYA LETTER TTA
+0B20;N # ORIYA LETTER TTHA
+0B21;N # ORIYA LETTER DDA
+0B22;N # ORIYA LETTER DDHA
+0B23;N # ORIYA LETTER NNA
+0B24;N # ORIYA LETTER TA
+0B25;N # ORIYA LETTER THA
+0B26;N # ORIYA LETTER DA
+0B27;N # ORIYA LETTER DHA
+0B28;N # ORIYA LETTER NA
+0B2A;N # ORIYA LETTER PA
+0B2B;N # ORIYA LETTER PHA
+0B2C;N # ORIYA LETTER BA
+0B2D;N # ORIYA LETTER BHA
+0B2E;N # ORIYA LETTER MA
+0B2F;N # ORIYA LETTER YA
+0B30;N # ORIYA LETTER RA
+0B32;N # ORIYA LETTER LA
+0B33;N # ORIYA LETTER LLA
+0B35;N # ORIYA LETTER VA
+0B36;N # ORIYA LETTER SHA
+0B37;N # ORIYA LETTER SSA
+0B38;N # ORIYA LETTER SA
+0B39;N # ORIYA LETTER HA
+0B3C;N # ORIYA SIGN NUKTA
+0B3D;N # ORIYA SIGN AVAGRAHA
+0B3E;N # ORIYA VOWEL SIGN AA
+0B3F;N # ORIYA VOWEL SIGN I
+0B40;N # ORIYA VOWEL SIGN II
+0B41;N # ORIYA VOWEL SIGN U
+0B42;N # ORIYA VOWEL SIGN UU
+0B43;N # ORIYA VOWEL SIGN VOCALIC R
+0B47;N # ORIYA VOWEL SIGN E
+0B48;N # ORIYA VOWEL SIGN AI
+0B4B;N # ORIYA VOWEL SIGN O
+0B4C;N # ORIYA VOWEL SIGN AU
+0B4D;N # ORIYA SIGN VIRAMA
+0B56;N # ORIYA AI LENGTH MARK
+0B57;N # ORIYA AU LENGTH MARK
+0B5C;N # ORIYA LETTER RRA
+0B5D;N # ORIYA LETTER RHA
+0B5F;N # ORIYA LETTER YYA
+0B60;N # ORIYA LETTER VOCALIC RR
+0B61;N # ORIYA LETTER VOCALIC LL
+0B66;N # ORIYA DIGIT ZERO
+0B67;N # ORIYA DIGIT ONE
+0B68;N # ORIYA DIGIT TWO
+0B69;N # ORIYA DIGIT THREE
+0B6A;N # ORIYA DIGIT FOUR
+0B6B;N # ORIYA DIGIT FIVE
+0B6C;N # ORIYA DIGIT SIX
+0B6D;N # ORIYA DIGIT SEVEN
+0B6E;N # ORIYA DIGIT EIGHT
+0B6F;N # ORIYA DIGIT NINE
+0B70;N # ORIYA ISSHAR
+0B71;N # ORIYA LETTER WA
+0B82;N # TAMIL SIGN ANUSVARA
+0B83;N # TAMIL SIGN VISARGA
+0B85;N # TAMIL LETTER A
+0B86;N # TAMIL LETTER AA
+0B87;N # TAMIL LETTER I
+0B88;N # TAMIL LETTER II
+0B89;N # TAMIL LETTER U
+0B8A;N # TAMIL LETTER UU
+0B8E;N # TAMIL LETTER E
+0B8F;N # TAMIL LETTER EE
+0B90;N # TAMIL LETTER AI
+0B92;N # TAMIL LETTER O
+0B93;N # TAMIL LETTER OO
+0B94;N # TAMIL LETTER AU
+0B95;N # TAMIL LETTER KA
+0B99;N # TAMIL LETTER NGA
+0B9A;N # TAMIL LETTER CA
+0B9C;N # TAMIL LETTER JA
+0B9E;N # TAMIL LETTER NYA
+0B9F;N # TAMIL LETTER TTA
+0BA3;N # TAMIL LETTER NNA
+0BA4;N # TAMIL LETTER TA
+0BA8;N # TAMIL LETTER NA
+0BA9;N # TAMIL LETTER NNNA
+0BAA;N # TAMIL LETTER PA
+0BAE;N # TAMIL LETTER MA
+0BAF;N # TAMIL LETTER YA
+0BB0;N # TAMIL LETTER RA
+0BB1;N # TAMIL LETTER RRA
+0BB2;N # TAMIL LETTER LA
+0BB3;N # TAMIL LETTER LLA
+0BB4;N # TAMIL LETTER LLLA
+0BB5;N # TAMIL LETTER VA
+0BB6;N # TAMIL LETTER SHA
+0BB7;N # TAMIL LETTER SSA
+0BB8;N # TAMIL LETTER SA
+0BB9;N # TAMIL LETTER HA
+0BBE;N # TAMIL VOWEL SIGN AA
+0BBF;N # TAMIL VOWEL SIGN I
+0BC0;N # TAMIL VOWEL SIGN II
+0BC1;N # TAMIL VOWEL SIGN U
+0BC2;N # TAMIL VOWEL SIGN UU
+0BC6;N # TAMIL VOWEL SIGN E
+0BC7;N # TAMIL VOWEL SIGN EE
+0BC8;N # TAMIL VOWEL SIGN AI
+0BCA;N # TAMIL VOWEL SIGN O
+0BCB;N # TAMIL VOWEL SIGN OO
+0BCC;N # TAMIL VOWEL SIGN AU
+0BCD;N # TAMIL SIGN VIRAMA
+0BD7;N # TAMIL AU LENGTH MARK
+0BE6;N # TAMIL DIGIT ZERO
+0BE7;N # TAMIL DIGIT ONE
+0BE8;N # TAMIL DIGIT TWO
+0BE9;N # TAMIL DIGIT THREE
+0BEA;N # TAMIL DIGIT FOUR
+0BEB;N # TAMIL DIGIT FIVE
+0BEC;N # TAMIL DIGIT SIX
+0BED;N # TAMIL DIGIT SEVEN
+0BEE;N # TAMIL DIGIT EIGHT
+0BEF;N # TAMIL DIGIT NINE
+0BF0;N # TAMIL NUMBER TEN
+0BF1;N # TAMIL NUMBER ONE HUNDRED
+0BF2;N # TAMIL NUMBER ONE THOUSAND
+0BF3;N # TAMIL DAY SIGN
+0BF4;N # TAMIL MONTH SIGN
+0BF5;N # TAMIL YEAR SIGN
+0BF6;N # TAMIL DEBIT SIGN
+0BF7;N # TAMIL CREDIT SIGN
+0BF8;N # TAMIL AS ABOVE SIGN
+0BF9;N # TAMIL RUPEE SIGN
+0BFA;N # TAMIL NUMBER SIGN
+0C01;N # TELUGU SIGN CANDRABINDU
+0C02;N # TELUGU SIGN ANUSVARA
+0C03;N # TELUGU SIGN VISARGA
+0C05;N # TELUGU LETTER A
+0C06;N # TELUGU LETTER AA
+0C07;N # TELUGU LETTER I
+0C08;N # TELUGU LETTER II
+0C09;N # TELUGU LETTER U
+0C0A;N # TELUGU LETTER UU
+0C0B;N # TELUGU LETTER VOCALIC R
+0C0C;N # TELUGU LETTER VOCALIC L
+0C0E;N # TELUGU LETTER E
+0C0F;N # TELUGU LETTER EE
+0C10;N # TELUGU LETTER AI
+0C12;N # TELUGU LETTER O
+0C13;N # TELUGU LETTER OO
+0C14;N # TELUGU LETTER AU
+0C15;N # TELUGU LETTER KA
+0C16;N # TELUGU LETTER KHA
+0C17;N # TELUGU LETTER GA
+0C18;N # TELUGU LETTER GHA
+0C19;N # TELUGU LETTER NGA
+0C1A;N # TELUGU LETTER CA
+0C1B;N # TELUGU LETTER CHA
+0C1C;N # TELUGU LETTER JA
+0C1D;N # TELUGU LETTER JHA
+0C1E;N # TELUGU LETTER NYA
+0C1F;N # TELUGU LETTER TTA
+0C20;N # TELUGU LETTER TTHA
+0C21;N # TELUGU LETTER DDA
+0C22;N # TELUGU LETTER DDHA
+0C23;N # TELUGU LETTER NNA
+0C24;N # TELUGU LETTER TA
+0C25;N # TELUGU LETTER THA
+0C26;N # TELUGU LETTER DA
+0C27;N # TELUGU LETTER DHA
+0C28;N # TELUGU LETTER NA
+0C2A;N # TELUGU LETTER PA
+0C2B;N # TELUGU LETTER PHA
+0C2C;N # TELUGU LETTER BA
+0C2D;N # TELUGU LETTER BHA
+0C2E;N # TELUGU LETTER MA
+0C2F;N # TELUGU LETTER YA
+0C30;N # TELUGU LETTER RA
+0C31;N # TELUGU LETTER RRA
+0C32;N # TELUGU LETTER LA
+0C33;N # TELUGU LETTER LLA
+0C35;N # TELUGU LETTER VA
+0C36;N # TELUGU LETTER SHA
+0C37;N # TELUGU LETTER SSA
+0C38;N # TELUGU LETTER SA
+0C39;N # TELUGU LETTER HA
+0C3E;N # TELUGU VOWEL SIGN AA
+0C3F;N # TELUGU VOWEL SIGN I
+0C40;N # TELUGU VOWEL SIGN II
+0C41;N # TELUGU VOWEL SIGN U
+0C42;N # TELUGU VOWEL SIGN UU
+0C43;N # TELUGU VOWEL SIGN VOCALIC R
+0C44;N # TELUGU VOWEL SIGN VOCALIC RR
+0C46;N # TELUGU VOWEL SIGN E
+0C47;N # TELUGU VOWEL SIGN EE
+0C48;N # TELUGU VOWEL SIGN AI
+0C4A;N # TELUGU VOWEL SIGN O
+0C4B;N # TELUGU VOWEL SIGN OO
+0C4C;N # TELUGU VOWEL SIGN AU
+0C4D;N # TELUGU SIGN VIRAMA
+0C55;N # TELUGU LENGTH MARK
+0C56;N # TELUGU AI LENGTH MARK
+0C60;N # TELUGU LETTER VOCALIC RR
+0C61;N # TELUGU LETTER VOCALIC LL
+0C66;N # TELUGU DIGIT ZERO
+0C67;N # TELUGU DIGIT ONE
+0C68;N # TELUGU DIGIT TWO
+0C69;N # TELUGU DIGIT THREE
+0C6A;N # TELUGU DIGIT FOUR
+0C6B;N # TELUGU DIGIT FIVE
+0C6C;N # TELUGU DIGIT SIX
+0C6D;N # TELUGU DIGIT SEVEN
+0C6E;N # TELUGU DIGIT EIGHT
+0C6F;N # TELUGU DIGIT NINE
+0C82;N # KANNADA SIGN ANUSVARA
+0C83;N # KANNADA SIGN VISARGA
+0C85;N # KANNADA LETTER A
+0C86;N # KANNADA LETTER AA
+0C87;N # KANNADA LETTER I
+0C88;N # KANNADA LETTER II
+0C89;N # KANNADA LETTER U
+0C8A;N # KANNADA LETTER UU
+0C8B;N # KANNADA LETTER VOCALIC R
+0C8C;N # KANNADA LETTER VOCALIC L
+0C8E;N # KANNADA LETTER E
+0C8F;N # KANNADA LETTER EE
+0C90;N # KANNADA LETTER AI
+0C92;N # KANNADA LETTER O
+0C93;N # KANNADA LETTER OO
+0C94;N # KANNADA LETTER AU
+0C95;N # KANNADA LETTER KA
+0C96;N # KANNADA LETTER KHA
+0C97;N # KANNADA LETTER GA
+0C98;N # KANNADA LETTER GHA
+0C99;N # KANNADA LETTER NGA
+0C9A;N # KANNADA LETTER CA
+0C9B;N # KANNADA LETTER CHA
+0C9C;N # KANNADA LETTER JA
+0C9D;N # KANNADA LETTER JHA
+0C9E;N # KANNADA LETTER NYA
+0C9F;N # KANNADA LETTER TTA
+0CA0;N # KANNADA LETTER TTHA
+0CA1;N # KANNADA LETTER DDA
+0CA2;N # KANNADA LETTER DDHA
+0CA3;N # KANNADA LETTER NNA
+0CA4;N # KANNADA LETTER TA
+0CA5;N # KANNADA LETTER THA
+0CA6;N # KANNADA LETTER DA
+0CA7;N # KANNADA LETTER DHA
+0CA8;N # KANNADA LETTER NA
+0CAA;N # KANNADA LETTER PA
+0CAB;N # KANNADA LETTER PHA
+0CAC;N # KANNADA LETTER BA
+0CAD;N # KANNADA LETTER BHA
+0CAE;N # KANNADA LETTER MA
+0CAF;N # KANNADA LETTER YA
+0CB0;N # KANNADA LETTER RA
+0CB1;N # KANNADA LETTER RRA
+0CB2;N # KANNADA LETTER LA
+0CB3;N # KANNADA LETTER LLA
+0CB5;N # KANNADA LETTER VA
+0CB6;N # KANNADA LETTER SHA
+0CB7;N # KANNADA LETTER SSA
+0CB8;N # KANNADA LETTER SA
+0CB9;N # KANNADA LETTER HA
+0CBC;N # KANNADA SIGN NUKTA
+0CBD;N # KANNADA SIGN AVAGRAHA
+0CBE;N # KANNADA VOWEL SIGN AA
+0CBF;N # KANNADA VOWEL SIGN I
+0CC0;N # KANNADA VOWEL SIGN II
+0CC1;N # KANNADA VOWEL SIGN U
+0CC2;N # KANNADA VOWEL SIGN UU
+0CC3;N # KANNADA VOWEL SIGN VOCALIC R
+0CC4;N # KANNADA VOWEL SIGN VOCALIC RR
+0CC6;N # KANNADA VOWEL SIGN E
+0CC7;N # KANNADA VOWEL SIGN EE
+0CC8;N # KANNADA VOWEL SIGN AI
+0CCA;N # KANNADA VOWEL SIGN O
+0CCB;N # KANNADA VOWEL SIGN OO
+0CCC;N # KANNADA VOWEL SIGN AU
+0CCD;N # KANNADA SIGN VIRAMA
+0CD5;N # KANNADA LENGTH MARK
+0CD6;N # KANNADA AI LENGTH MARK
+0CDE;N # KANNADA LETTER FA
+0CE0;N # KANNADA LETTER VOCALIC RR
+0CE1;N # KANNADA LETTER VOCALIC LL
+0CE6;N # KANNADA DIGIT ZERO
+0CE7;N # KANNADA DIGIT ONE
+0CE8;N # KANNADA DIGIT TWO
+0CE9;N # KANNADA DIGIT THREE
+0CEA;N # KANNADA DIGIT FOUR
+0CEB;N # KANNADA DIGIT FIVE
+0CEC;N # KANNADA DIGIT SIX
+0CED;N # KANNADA DIGIT SEVEN
+0CEE;N # KANNADA DIGIT EIGHT
+0CEF;N # KANNADA DIGIT NINE
+0D02;N # MALAYALAM SIGN ANUSVARA
+0D03;N # MALAYALAM SIGN VISARGA
+0D05;N # MALAYALAM LETTER A
+0D06;N # MALAYALAM LETTER AA
+0D07;N # MALAYALAM LETTER I
+0D08;N # MALAYALAM LETTER II
+0D09;N # MALAYALAM LETTER U
+0D0A;N # MALAYALAM LETTER UU
+0D0B;N # MALAYALAM LETTER VOCALIC R
+0D0C;N # MALAYALAM LETTER VOCALIC L
+0D0E;N # MALAYALAM LETTER E
+0D0F;N # MALAYALAM LETTER EE
+0D10;N # MALAYALAM LETTER AI
+0D12;N # MALAYALAM LETTER O
+0D13;N # MALAYALAM LETTER OO
+0D14;N # MALAYALAM LETTER AU
+0D15;N # MALAYALAM LETTER KA
+0D16;N # MALAYALAM LETTER KHA
+0D17;N # MALAYALAM LETTER GA
+0D18;N # MALAYALAM LETTER GHA
+0D19;N # MALAYALAM LETTER NGA
+0D1A;N # MALAYALAM LETTER CA
+0D1B;N # MALAYALAM LETTER CHA
+0D1C;N # MALAYALAM LETTER JA
+0D1D;N # MALAYALAM LETTER JHA
+0D1E;N # MALAYALAM LETTER NYA
+0D1F;N # MALAYALAM LETTER TTA
+0D20;N # MALAYALAM LETTER TTHA
+0D21;N # MALAYALAM LETTER DDA
+0D22;N # MALAYALAM LETTER DDHA
+0D23;N # MALAYALAM LETTER NNA
+0D24;N # MALAYALAM LETTER TA
+0D25;N # MALAYALAM LETTER THA
+0D26;N # MALAYALAM LETTER DA
+0D27;N # MALAYALAM LETTER DHA
+0D28;N # MALAYALAM LETTER NA
+0D2A;N # MALAYALAM LETTER PA
+0D2B;N # MALAYALAM LETTER PHA
+0D2C;N # MALAYALAM LETTER BA
+0D2D;N # MALAYALAM LETTER BHA
+0D2E;N # MALAYALAM LETTER MA
+0D2F;N # MALAYALAM LETTER YA
+0D30;N # MALAYALAM LETTER RA
+0D31;N # MALAYALAM LETTER RRA
+0D32;N # MALAYALAM LETTER LA
+0D33;N # MALAYALAM LETTER LLA
+0D34;N # MALAYALAM LETTER LLLA
+0D35;N # MALAYALAM LETTER VA
+0D36;N # MALAYALAM LETTER SHA
+0D37;N # MALAYALAM LETTER SSA
+0D38;N # MALAYALAM LETTER SA
+0D39;N # MALAYALAM LETTER HA
+0D3E;N # MALAYALAM VOWEL SIGN AA
+0D3F;N # MALAYALAM VOWEL SIGN I
+0D40;N # MALAYALAM VOWEL SIGN II
+0D41;N # MALAYALAM VOWEL SIGN U
+0D42;N # MALAYALAM VOWEL SIGN UU
+0D43;N # MALAYALAM VOWEL SIGN VOCALIC R
+0D46;N # MALAYALAM VOWEL SIGN E
+0D47;N # MALAYALAM VOWEL SIGN EE
+0D48;N # MALAYALAM VOWEL SIGN AI
+0D4A;N # MALAYALAM VOWEL SIGN O
+0D4B;N # MALAYALAM VOWEL SIGN OO
+0D4C;N # MALAYALAM VOWEL SIGN AU
+0D4D;N # MALAYALAM SIGN VIRAMA
+0D57;N # MALAYALAM AU LENGTH MARK
+0D60;N # MALAYALAM LETTER VOCALIC RR
+0D61;N # MALAYALAM LETTER VOCALIC LL
+0D66;N # MALAYALAM DIGIT ZERO
+0D67;N # MALAYALAM DIGIT ONE
+0D68;N # MALAYALAM DIGIT TWO
+0D69;N # MALAYALAM DIGIT THREE
+0D6A;N # MALAYALAM DIGIT FOUR
+0D6B;N # MALAYALAM DIGIT FIVE
+0D6C;N # MALAYALAM DIGIT SIX
+0D6D;N # MALAYALAM DIGIT SEVEN
+0D6E;N # MALAYALAM DIGIT EIGHT
+0D6F;N # MALAYALAM DIGIT NINE
+0D82;N # SINHALA SIGN ANUSVARAYA
+0D83;N # SINHALA SIGN VISARGAYA
+0D85;N # SINHALA LETTER AYANNA
+0D86;N # SINHALA LETTER AAYANNA
+0D87;N # SINHALA LETTER AEYANNA
+0D88;N # SINHALA LETTER AEEYANNA
+0D89;N # SINHALA LETTER IYANNA
+0D8A;N # SINHALA LETTER IIYANNA
+0D8B;N # SINHALA LETTER UYANNA
+0D8C;N # SINHALA LETTER UUYANNA
+0D8D;N # SINHALA LETTER IRUYANNA
+0D8E;N # SINHALA LETTER IRUUYANNA
+0D8F;N # SINHALA LETTER ILUYANNA
+0D90;N # SINHALA LETTER ILUUYANNA
+0D91;N # SINHALA LETTER EYANNA
+0D92;N # SINHALA LETTER EEYANNA
+0D93;N # SINHALA LETTER AIYANNA
+0D94;N # SINHALA LETTER OYANNA
+0D95;N # SINHALA LETTER OOYANNA
+0D96;N # SINHALA LETTER AUYANNA
+0D9A;N # SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B;N # SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C;N # SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D;N # SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E;N # SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F;N # SINHALA LETTER SANYAKA GAYANNA
+0DA0;N # SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1;N # SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2;N # SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3;N # SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4;N # SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5;N # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6;N # SINHALA LETTER SANYAKA JAYANNA
+0DA7;N # SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8;N # SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9;N # SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA;N # SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB;N # SINHALA LETTER MUURDHAJA NAYANNA
+0DAC;N # SINHALA LETTER SANYAKA DDAYANNA
+0DAD;N # SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE;N # SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF;N # SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0;N # SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1;N # SINHALA LETTER DANTAJA NAYANNA
+0DB3;N # SINHALA LETTER SANYAKA DAYANNA
+0DB4;N # SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5;N # SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6;N # SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7;N # SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8;N # SINHALA LETTER MAYANNA
+0DB9;N # SINHALA LETTER AMBA BAYANNA
+0DBA;N # SINHALA LETTER YAYANNA
+0DBB;N # SINHALA LETTER RAYANNA
+0DBD;N # SINHALA LETTER DANTAJA LAYANNA
+0DC0;N # SINHALA LETTER VAYANNA
+0DC1;N # SINHALA LETTER TAALUJA SAYANNA
+0DC2;N # SINHALA LETTER MUURDHAJA SAYANNA
+0DC3;N # SINHALA LETTER DANTAJA SAYANNA
+0DC4;N # SINHALA LETTER HAYANNA
+0DC5;N # SINHALA LETTER MUURDHAJA LAYANNA
+0DC6;N # SINHALA LETTER FAYANNA
+0DCA;N # SINHALA SIGN AL-LAKUNA
+0DCF;N # SINHALA VOWEL SIGN AELA-PILLA
+0DD0;N # SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1;N # SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2;N # SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3;N # SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4;N # SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6;N # SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8;N # SINHALA VOWEL SIGN GAETTA-PILLA
+0DD9;N # SINHALA VOWEL SIGN KOMBUVA
+0DDA;N # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB;N # SINHALA VOWEL SIGN KOMBU DEKA
+0DDC;N # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD;N # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE;N # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DDF;N # SINHALA VOWEL SIGN GAYANUKITTA
+0DF2;N # SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DF3;N # SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4;N # SINHALA PUNCTUATION KUNDDALIYA
+0E01;N # THAI CHARACTER KO KAI
+0E02;N # THAI CHARACTER KHO KHAI
+0E03;N # THAI CHARACTER KHO KHUAT
+0E04;N # THAI CHARACTER KHO KHWAI
+0E05;N # THAI CHARACTER KHO KHON
+0E06;N # THAI CHARACTER KHO RAKHANG
+0E07;N # THAI CHARACTER NGO NGU
+0E08;N # THAI CHARACTER CHO CHAN
+0E09;N # THAI CHARACTER CHO CHING
+0E0A;N # THAI CHARACTER CHO CHANG
+0E0B;N # THAI CHARACTER SO SO
+0E0C;N # THAI CHARACTER CHO CHOE
+0E0D;N # THAI CHARACTER YO YING
+0E0E;N # THAI CHARACTER DO CHADA
+0E0F;N # THAI CHARACTER TO PATAK
+0E10;N # THAI CHARACTER THO THAN
+0E11;N # THAI CHARACTER THO NANGMONTHO
+0E12;N # THAI CHARACTER THO PHUTHAO
+0E13;N # THAI CHARACTER NO NEN
+0E14;N # THAI CHARACTER DO DEK
+0E15;N # THAI CHARACTER TO TAO
+0E16;N # THAI CHARACTER THO THUNG
+0E17;N # THAI CHARACTER THO THAHAN
+0E18;N # THAI CHARACTER THO THONG
+0E19;N # THAI CHARACTER NO NU
+0E1A;N # THAI CHARACTER BO BAIMAI
+0E1B;N # THAI CHARACTER PO PLA
+0E1C;N # THAI CHARACTER PHO PHUNG
+0E1D;N # THAI CHARACTER FO FA
+0E1E;N # THAI CHARACTER PHO PHAN
+0E1F;N # THAI CHARACTER FO FAN
+0E20;N # THAI CHARACTER PHO SAMPHAO
+0E21;N # THAI CHARACTER MO MA
+0E22;N # THAI CHARACTER YO YAK
+0E23;N # THAI CHARACTER RO RUA
+0E24;N # THAI CHARACTER RU
+0E25;N # THAI CHARACTER LO LING
+0E26;N # THAI CHARACTER LU
+0E27;N # THAI CHARACTER WO WAEN
+0E28;N # THAI CHARACTER SO SALA
+0E29;N # THAI CHARACTER SO RUSI
+0E2A;N # THAI CHARACTER SO SUA
+0E2B;N # THAI CHARACTER HO HIP
+0E2C;N # THAI CHARACTER LO CHULA
+0E2D;N # THAI CHARACTER O ANG
+0E2E;N # THAI CHARACTER HO NOKHUK
+0E2F;N # THAI CHARACTER PAIYANNOI
+0E30;N # THAI CHARACTER SARA A
+0E31;N # THAI CHARACTER MAI HAN-AKAT
+0E32;N # THAI CHARACTER SARA AA
+0E33;N # THAI CHARACTER SARA AM
+0E34;N # THAI CHARACTER SARA I
+0E35;N # THAI CHARACTER SARA II
+0E36;N # THAI CHARACTER SARA UE
+0E37;N # THAI CHARACTER SARA UEE
+0E38;N # THAI CHARACTER SARA U
+0E39;N # THAI CHARACTER SARA UU
+0E3A;N # THAI CHARACTER PHINTHU
+0E3F;N # THAI CURRENCY SYMBOL BAHT
+0E40;N # THAI CHARACTER SARA E
+0E41;N # THAI CHARACTER SARA AE
+0E42;N # THAI CHARACTER SARA O
+0E43;N # THAI CHARACTER SARA AI MAIMUAN
+0E44;N # THAI CHARACTER SARA AI MAIMALAI
+0E45;N # THAI CHARACTER LAKKHANGYAO
+0E46;N # THAI CHARACTER MAIYAMOK
+0E47;N # THAI CHARACTER MAITAIKHU
+0E48;N # THAI CHARACTER MAI EK
+0E49;N # THAI CHARACTER MAI THO
+0E4A;N # THAI CHARACTER MAI TRI
+0E4B;N # THAI CHARACTER MAI CHATTAWA
+0E4C;N # THAI CHARACTER THANTHAKHAT
+0E4D;N # THAI CHARACTER NIKHAHIT
+0E4E;N # THAI CHARACTER YAMAKKAN
+0E4F;N # THAI CHARACTER FONGMAN
+0E50;N # THAI DIGIT ZERO
+0E51;N # THAI DIGIT ONE
+0E52;N # THAI DIGIT TWO
+0E53;N # THAI DIGIT THREE
+0E54;N # THAI DIGIT FOUR
+0E55;N # THAI DIGIT FIVE
+0E56;N # THAI DIGIT SIX
+0E57;N # THAI DIGIT SEVEN
+0E58;N # THAI DIGIT EIGHT
+0E59;N # THAI DIGIT NINE
+0E5A;N # THAI CHARACTER ANGKHANKHU
+0E5B;N # THAI CHARACTER KHOMUT
+0E81;N # LAO LETTER KO
+0E82;N # LAO LETTER KHO SUNG
+0E84;N # LAO LETTER KHO TAM
+0E87;N # LAO LETTER NGO
+0E88;N # LAO LETTER CO
+0E8A;N # LAO LETTER SO TAM
+0E8D;N # LAO LETTER NYO
+0E94;N # LAO LETTER DO
+0E95;N # LAO LETTER TO
+0E96;N # LAO LETTER THO SUNG
+0E97;N # LAO LETTER THO TAM
+0E99;N # LAO LETTER NO
+0E9A;N # LAO LETTER BO
+0E9B;N # LAO LETTER PO
+0E9C;N # LAO LETTER PHO SUNG
+0E9D;N # LAO LETTER FO TAM
+0E9E;N # LAO LETTER PHO TAM
+0E9F;N # LAO LETTER FO SUNG
+0EA1;N # LAO LETTER MO
+0EA2;N # LAO LETTER YO
+0EA3;N # LAO LETTER LO LING
+0EA5;N # LAO LETTER LO LOOT
+0EA7;N # LAO LETTER WO
+0EAA;N # LAO LETTER SO SUNG
+0EAB;N # LAO LETTER HO SUNG
+0EAD;N # LAO LETTER O
+0EAE;N # LAO LETTER HO TAM
+0EAF;N # LAO ELLIPSIS
+0EB0;N # LAO VOWEL SIGN A
+0EB1;N # LAO VOWEL SIGN MAI KAN
+0EB2;N # LAO VOWEL SIGN AA
+0EB3;N # LAO VOWEL SIGN AM
+0EB4;N # LAO VOWEL SIGN I
+0EB5;N # LAO VOWEL SIGN II
+0EB6;N # LAO VOWEL SIGN Y
+0EB7;N # LAO VOWEL SIGN YY
+0EB8;N # LAO VOWEL SIGN U
+0EB9;N # LAO VOWEL SIGN UU
+0EBB;N # LAO VOWEL SIGN MAI KON
+0EBC;N # LAO SEMIVOWEL SIGN LO
+0EBD;N # LAO SEMIVOWEL SIGN NYO
+0EC0;N # LAO VOWEL SIGN E
+0EC1;N # LAO VOWEL SIGN EI
+0EC2;N # LAO VOWEL SIGN O
+0EC3;N # LAO VOWEL SIGN AY
+0EC4;N # LAO VOWEL SIGN AI
+0EC6;N # LAO KO LA
+0EC8;N # LAO TONE MAI EK
+0EC9;N # LAO TONE MAI THO
+0ECA;N # LAO TONE MAI TI
+0ECB;N # LAO TONE MAI CATAWA
+0ECC;N # LAO CANCELLATION MARK
+0ECD;N # LAO NIGGAHITA
+0ED0;N # LAO DIGIT ZERO
+0ED1;N # LAO DIGIT ONE
+0ED2;N # LAO DIGIT TWO
+0ED3;N # LAO DIGIT THREE
+0ED4;N # LAO DIGIT FOUR
+0ED5;N # LAO DIGIT FIVE
+0ED6;N # LAO DIGIT SIX
+0ED7;N # LAO DIGIT SEVEN
+0ED8;N # LAO DIGIT EIGHT
+0ED9;N # LAO DIGIT NINE
+0EDC;N # LAO HO NO
+0EDD;N # LAO HO MO
+0F00;N # TIBETAN SYLLABLE OM
+0F01;N # TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02;N # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03;N # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04;N # TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05;N # TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06;N # TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07;N # TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08;N # TIBETAN MARK SBRUL SHAD
+0F09;N # TIBETAN MARK BSKUR YIG MGO
+0F0A;N # TIBETAN MARK BKA- SHOG YIG MGO
+0F0B;N # TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C;N # TIBETAN MARK DELIMITER TSHEG BSTAR
+0F0D;N # TIBETAN MARK SHAD
+0F0E;N # TIBETAN MARK NYIS SHAD
+0F0F;N # TIBETAN MARK TSHEG SHAD
+0F10;N # TIBETAN MARK NYIS TSHEG SHAD
+0F11;N # TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12;N # TIBETAN MARK RGYA GRAM SHAD
+0F13;N # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14;N # TIBETAN MARK GTER TSHEG
+0F15;N # TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16;N # TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17;N # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18;N # TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19;N # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A;N # TIBETAN SIGN RDEL DKAR GCIG
+0F1B;N # TIBETAN SIGN RDEL DKAR GNYIS
+0F1C;N # TIBETAN SIGN RDEL DKAR GSUM
+0F1D;N # TIBETAN SIGN RDEL NAG GCIG
+0F1E;N # TIBETAN SIGN RDEL NAG GNYIS
+0F1F;N # TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20;N # TIBETAN DIGIT ZERO
+0F21;N # TIBETAN DIGIT ONE
+0F22;N # TIBETAN DIGIT TWO
+0F23;N # TIBETAN DIGIT THREE
+0F24;N # TIBETAN DIGIT FOUR
+0F25;N # TIBETAN DIGIT FIVE
+0F26;N # TIBETAN DIGIT SIX
+0F27;N # TIBETAN DIGIT SEVEN
+0F28;N # TIBETAN DIGIT EIGHT
+0F29;N # TIBETAN DIGIT NINE
+0F2A;N # TIBETAN DIGIT HALF ONE
+0F2B;N # TIBETAN DIGIT HALF TWO
+0F2C;N # TIBETAN DIGIT HALF THREE
+0F2D;N # TIBETAN DIGIT HALF FOUR
+0F2E;N # TIBETAN DIGIT HALF FIVE
+0F2F;N # TIBETAN DIGIT HALF SIX
+0F30;N # TIBETAN DIGIT HALF SEVEN
+0F31;N # TIBETAN DIGIT HALF EIGHT
+0F32;N # TIBETAN DIGIT HALF NINE
+0F33;N # TIBETAN DIGIT HALF ZERO
+0F34;N # TIBETAN MARK BSDUS RTAGS
+0F35;N # TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36;N # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37;N # TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38;N # TIBETAN MARK CHE MGO
+0F39;N # TIBETAN MARK TSA -PHRU
+0F3A;N # TIBETAN MARK GUG RTAGS GYON
+0F3B;N # TIBETAN MARK GUG RTAGS GYAS
+0F3C;N # TIBETAN MARK ANG KHANG GYON
+0F3D;N # TIBETAN MARK ANG KHANG GYAS
+0F3E;N # TIBETAN SIGN YAR TSHES
+0F3F;N # TIBETAN SIGN MAR TSHES
+0F40;N # TIBETAN LETTER KA
+0F41;N # TIBETAN LETTER KHA
+0F42;N # TIBETAN LETTER GA
+0F43;N # TIBETAN LETTER GHA
+0F44;N # TIBETAN LETTER NGA
+0F45;N # TIBETAN LETTER CA
+0F46;N # TIBETAN LETTER CHA
+0F47;N # TIBETAN LETTER JA
+0F49;N # TIBETAN LETTER NYA
+0F4A;N # TIBETAN LETTER TTA
+0F4B;N # TIBETAN LETTER TTHA
+0F4C;N # TIBETAN LETTER DDA
+0F4D;N # TIBETAN LETTER DDHA
+0F4E;N # TIBETAN LETTER NNA
+0F4F;N # TIBETAN LETTER TA
+0F50;N # TIBETAN LETTER THA
+0F51;N # TIBETAN LETTER DA
+0F52;N # TIBETAN LETTER DHA
+0F53;N # TIBETAN LETTER NA
+0F54;N # TIBETAN LETTER PA
+0F55;N # TIBETAN LETTER PHA
+0F56;N # TIBETAN LETTER BA
+0F57;N # TIBETAN LETTER BHA
+0F58;N # TIBETAN LETTER MA
+0F59;N # TIBETAN LETTER TSA
+0F5A;N # TIBETAN LETTER TSHA
+0F5B;N # TIBETAN LETTER DZA
+0F5C;N # TIBETAN LETTER DZHA
+0F5D;N # TIBETAN LETTER WA
+0F5E;N # TIBETAN LETTER ZHA
+0F5F;N # TIBETAN LETTER ZA
+0F60;N # TIBETAN LETTER -A
+0F61;N # TIBETAN LETTER YA
+0F62;N # TIBETAN LETTER RA
+0F63;N # TIBETAN LETTER LA
+0F64;N # TIBETAN LETTER SHA
+0F65;N # TIBETAN LETTER SSA
+0F66;N # TIBETAN LETTER SA
+0F67;N # TIBETAN LETTER HA
+0F68;N # TIBETAN LETTER A
+0F69;N # TIBETAN LETTER KSSA
+0F6A;N # TIBETAN LETTER FIXED-FORM RA
+0F71;N # TIBETAN VOWEL SIGN AA
+0F72;N # TIBETAN VOWEL SIGN I
+0F73;N # TIBETAN VOWEL SIGN II
+0F74;N # TIBETAN VOWEL SIGN U
+0F75;N # TIBETAN VOWEL SIGN UU
+0F76;N # TIBETAN VOWEL SIGN VOCALIC R
+0F77;N # TIBETAN VOWEL SIGN VOCALIC RR
+0F78;N # TIBETAN VOWEL SIGN VOCALIC L
+0F79;N # TIBETAN VOWEL SIGN VOCALIC LL
+0F7A;N # TIBETAN VOWEL SIGN E
+0F7B;N # TIBETAN VOWEL SIGN EE
+0F7C;N # TIBETAN VOWEL SIGN O
+0F7D;N # TIBETAN VOWEL SIGN OO
+0F7E;N # TIBETAN SIGN RJES SU NGA RO
+0F7F;N # TIBETAN SIGN RNAM BCAD
+0F80;N # TIBETAN VOWEL SIGN REVERSED I
+0F81;N # TIBETAN VOWEL SIGN REVERSED II
+0F82;N # TIBETAN SIGN NYI ZLA NAA DA
+0F83;N # TIBETAN SIGN SNA LDAN
+0F84;N # TIBETAN MARK HALANTA
+0F85;N # TIBETAN MARK PALUTA
+0F86;N # TIBETAN SIGN LCI RTAGS
+0F87;N # TIBETAN SIGN YANG RTAGS
+0F88;N # TIBETAN SIGN LCE TSA CAN
+0F89;N # TIBETAN SIGN MCHU CAN
+0F8A;N # TIBETAN SIGN GRU CAN RGYINGS
+0F8B;N # TIBETAN SIGN GRU MED RGYINGS
+0F90;N # TIBETAN SUBJOINED LETTER KA
+0F91;N # TIBETAN SUBJOINED LETTER KHA
+0F92;N # TIBETAN SUBJOINED LETTER GA
+0F93;N # TIBETAN SUBJOINED LETTER GHA
+0F94;N # TIBETAN SUBJOINED LETTER NGA
+0F95;N # TIBETAN SUBJOINED LETTER CA
+0F96;N # TIBETAN SUBJOINED LETTER CHA
+0F97;N # TIBETAN SUBJOINED LETTER JA
+0F99;N # TIBETAN SUBJOINED LETTER NYA
+0F9A;N # TIBETAN SUBJOINED LETTER TTA
+0F9B;N # TIBETAN SUBJOINED LETTER TTHA
+0F9C;N # TIBETAN SUBJOINED LETTER DDA
+0F9D;N # TIBETAN SUBJOINED LETTER DDHA
+0F9E;N # TIBETAN SUBJOINED LETTER NNA
+0F9F;N # TIBETAN SUBJOINED LETTER TA
+0FA0;N # TIBETAN SUBJOINED LETTER THA
+0FA1;N # TIBETAN SUBJOINED LETTER DA
+0FA2;N # TIBETAN SUBJOINED LETTER DHA
+0FA3;N # TIBETAN SUBJOINED LETTER NA
+0FA4;N # TIBETAN SUBJOINED LETTER PA
+0FA5;N # TIBETAN SUBJOINED LETTER PHA
+0FA6;N # TIBETAN SUBJOINED LETTER BA
+0FA7;N # TIBETAN SUBJOINED LETTER BHA
+0FA8;N # TIBETAN SUBJOINED LETTER MA
+0FA9;N # TIBETAN SUBJOINED LETTER TSA
+0FAA;N # TIBETAN SUBJOINED LETTER TSHA
+0FAB;N # TIBETAN SUBJOINED LETTER DZA
+0FAC;N # TIBETAN SUBJOINED LETTER DZHA
+0FAD;N # TIBETAN SUBJOINED LETTER WA
+0FAE;N # TIBETAN SUBJOINED LETTER ZHA
+0FAF;N # TIBETAN SUBJOINED LETTER ZA
+0FB0;N # TIBETAN SUBJOINED LETTER -A
+0FB1;N # TIBETAN SUBJOINED LETTER YA
+0FB2;N # TIBETAN SUBJOINED LETTER RA
+0FB3;N # TIBETAN SUBJOINED LETTER LA
+0FB4;N # TIBETAN SUBJOINED LETTER SHA
+0FB5;N # TIBETAN SUBJOINED LETTER SSA
+0FB6;N # TIBETAN SUBJOINED LETTER SA
+0FB7;N # TIBETAN SUBJOINED LETTER HA
+0FB8;N # TIBETAN SUBJOINED LETTER A
+0FB9;N # TIBETAN SUBJOINED LETTER KSSA
+0FBA;N # TIBETAN SUBJOINED LETTER FIXED-FORM WA
+0FBB;N # TIBETAN SUBJOINED LETTER FIXED-FORM YA
+0FBC;N # TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE;N # TIBETAN KU RU KHA
+0FBF;N # TIBETAN KU RU KHA BZHI MIG CAN
+0FC0;N # TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1;N # TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2;N # TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3;N # TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4;N # TIBETAN SYMBOL DRIL BU
+0FC5;N # TIBETAN SYMBOL RDO RJE
+0FC6;N # TIBETAN SYMBOL PADMA GDAN
+0FC7;N # TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8;N # TIBETAN SYMBOL PHUR PA
+0FC9;N # TIBETAN SYMBOL NOR BU
+0FCA;N # TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB;N # TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC;N # TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCF;N # TIBETAN SIGN RDEL NAG GSUM
+0FD0;N # TIBETAN MARK BSKA- SHOG GI MGO RGYAN
+0FD1;N # TIBETAN MARK MNYAM YIG GI MGO RGYAN
+1000;N # MYANMAR LETTER KA
+1001;N # MYANMAR LETTER KHA
+1002;N # MYANMAR LETTER GA
+1003;N # MYANMAR LETTER GHA
+1004;N # MYANMAR LETTER NGA
+1005;N # MYANMAR LETTER CA
+1006;N # MYANMAR LETTER CHA
+1007;N # MYANMAR LETTER JA
+1008;N # MYANMAR LETTER JHA
+1009;N # MYANMAR LETTER NYA
+100A;N # MYANMAR LETTER NNYA
+100B;N # MYANMAR LETTER TTA
+100C;N # MYANMAR LETTER TTHA
+100D;N # MYANMAR LETTER DDA
+100E;N # MYANMAR LETTER DDHA
+100F;N # MYANMAR LETTER NNA
+1010;N # MYANMAR LETTER TA
+1011;N # MYANMAR LETTER THA
+1012;N # MYANMAR LETTER DA
+1013;N # MYANMAR LETTER DHA
+1014;N # MYANMAR LETTER NA
+1015;N # MYANMAR LETTER PA
+1016;N # MYANMAR LETTER PHA
+1017;N # MYANMAR LETTER BA
+1018;N # MYANMAR LETTER BHA
+1019;N # MYANMAR LETTER MA
+101A;N # MYANMAR LETTER YA
+101B;N # MYANMAR LETTER RA
+101C;N # MYANMAR LETTER LA
+101D;N # MYANMAR LETTER WA
+101E;N # MYANMAR LETTER SA
+101F;N # MYANMAR LETTER HA
+1020;N # MYANMAR LETTER LLA
+1021;N # MYANMAR LETTER A
+1023;N # MYANMAR LETTER I
+1024;N # MYANMAR LETTER II
+1025;N # MYANMAR LETTER U
+1026;N # MYANMAR LETTER UU
+1027;N # MYANMAR LETTER E
+1029;N # MYANMAR LETTER O
+102A;N # MYANMAR LETTER AU
+102C;N # MYANMAR VOWEL SIGN AA
+102D;N # MYANMAR VOWEL SIGN I
+102E;N # MYANMAR VOWEL SIGN II
+102F;N # MYANMAR VOWEL SIGN U
+1030;N # MYANMAR VOWEL SIGN UU
+1031;N # MYANMAR VOWEL SIGN E
+1032;N # MYANMAR VOWEL SIGN AI
+1036;N # MYANMAR SIGN ANUSVARA
+1037;N # MYANMAR SIGN DOT BELOW
+1038;N # MYANMAR SIGN VISARGA
+1039;N # MYANMAR SIGN VIRAMA
+1040;N # MYANMAR DIGIT ZERO
+1041;N # MYANMAR DIGIT ONE
+1042;N # MYANMAR DIGIT TWO
+1043;N # MYANMAR DIGIT THREE
+1044;N # MYANMAR DIGIT FOUR
+1045;N # MYANMAR DIGIT FIVE
+1046;N # MYANMAR DIGIT SIX
+1047;N # MYANMAR DIGIT SEVEN
+1048;N # MYANMAR DIGIT EIGHT
+1049;N # MYANMAR DIGIT NINE
+104A;N # MYANMAR SIGN LITTLE SECTION
+104B;N # MYANMAR SIGN SECTION
+104C;N # MYANMAR SYMBOL LOCATIVE
+104D;N # MYANMAR SYMBOL COMPLETED
+104E;N # MYANMAR SYMBOL AFOREMENTIONED
+104F;N # MYANMAR SYMBOL GENITIVE
+1050;N # MYANMAR LETTER SHA
+1051;N # MYANMAR LETTER SSA
+1052;N # MYANMAR LETTER VOCALIC R
+1053;N # MYANMAR LETTER VOCALIC RR
+1054;N # MYANMAR LETTER VOCALIC L
+1055;N # MYANMAR LETTER VOCALIC LL
+1056;N # MYANMAR VOWEL SIGN VOCALIC R
+1057;N # MYANMAR VOWEL SIGN VOCALIC RR
+1058;N # MYANMAR VOWEL SIGN VOCALIC L
+1059;N # MYANMAR VOWEL SIGN VOCALIC LL
+10A0;N # GEORGIAN CAPITAL LETTER AN
+10A1;N # GEORGIAN CAPITAL LETTER BAN
+10A2;N # GEORGIAN CAPITAL LETTER GAN
+10A3;N # GEORGIAN CAPITAL LETTER DON
+10A4;N # GEORGIAN CAPITAL LETTER EN
+10A5;N # GEORGIAN CAPITAL LETTER VIN
+10A6;N # GEORGIAN CAPITAL LETTER ZEN
+10A7;N # GEORGIAN CAPITAL LETTER TAN
+10A8;N # GEORGIAN CAPITAL LETTER IN
+10A9;N # GEORGIAN CAPITAL LETTER KAN
+10AA;N # GEORGIAN CAPITAL LETTER LAS
+10AB;N # GEORGIAN CAPITAL LETTER MAN
+10AC;N # GEORGIAN CAPITAL LETTER NAR
+10AD;N # GEORGIAN CAPITAL LETTER ON
+10AE;N # GEORGIAN CAPITAL LETTER PAR
+10AF;N # GEORGIAN CAPITAL LETTER ZHAR
+10B0;N # GEORGIAN CAPITAL LETTER RAE
+10B1;N # GEORGIAN CAPITAL LETTER SAN
+10B2;N # GEORGIAN CAPITAL LETTER TAR
+10B3;N # GEORGIAN CAPITAL LETTER UN
+10B4;N # GEORGIAN CAPITAL LETTER PHAR
+10B5;N # GEORGIAN CAPITAL LETTER KHAR
+10B6;N # GEORGIAN CAPITAL LETTER GHAN
+10B7;N # GEORGIAN CAPITAL LETTER QAR
+10B8;N # GEORGIAN CAPITAL LETTER SHIN
+10B9;N # GEORGIAN CAPITAL LETTER CHIN
+10BA;N # GEORGIAN CAPITAL LETTER CAN
+10BB;N # GEORGIAN CAPITAL LETTER JIL
+10BC;N # GEORGIAN CAPITAL LETTER CIL
+10BD;N # GEORGIAN CAPITAL LETTER CHAR
+10BE;N # GEORGIAN CAPITAL LETTER XAN
+10BF;N # GEORGIAN CAPITAL LETTER JHAN
+10C0;N # GEORGIAN CAPITAL LETTER HAE
+10C1;N # GEORGIAN CAPITAL LETTER HE
+10C2;N # GEORGIAN CAPITAL LETTER HIE
+10C3;N # GEORGIAN CAPITAL LETTER WE
+10C4;N # GEORGIAN CAPITAL LETTER HAR
+10C5;N # GEORGIAN CAPITAL LETTER HOE
+10D0;N # GEORGIAN LETTER AN
+10D1;N # GEORGIAN LETTER BAN
+10D2;N # GEORGIAN LETTER GAN
+10D3;N # GEORGIAN LETTER DON
+10D4;N # GEORGIAN LETTER EN
+10D5;N # GEORGIAN LETTER VIN
+10D6;N # GEORGIAN LETTER ZEN
+10D7;N # GEORGIAN LETTER TAN
+10D8;N # GEORGIAN LETTER IN
+10D9;N # GEORGIAN LETTER KAN
+10DA;N # GEORGIAN LETTER LAS
+10DB;N # GEORGIAN LETTER MAN
+10DC;N # GEORGIAN LETTER NAR
+10DD;N # GEORGIAN LETTER ON
+10DE;N # GEORGIAN LETTER PAR
+10DF;N # GEORGIAN LETTER ZHAR
+10E0;N # GEORGIAN LETTER RAE
+10E1;N # GEORGIAN LETTER SAN
+10E2;N # GEORGIAN LETTER TAR
+10E3;N # GEORGIAN LETTER UN
+10E4;N # GEORGIAN LETTER PHAR
+10E5;N # GEORGIAN LETTER KHAR
+10E6;N # GEORGIAN LETTER GHAN
+10E7;N # GEORGIAN LETTER QAR
+10E8;N # GEORGIAN LETTER SHIN
+10E9;N # GEORGIAN LETTER CHIN
+10EA;N # GEORGIAN LETTER CAN
+10EB;N # GEORGIAN LETTER JIL
+10EC;N # GEORGIAN LETTER CIL
+10ED;N # GEORGIAN LETTER CHAR
+10EE;N # GEORGIAN LETTER XAN
+10EF;N # GEORGIAN LETTER JHAN
+10F0;N # GEORGIAN LETTER HAE
+10F1;N # GEORGIAN LETTER HE
+10F2;N # GEORGIAN LETTER HIE
+10F3;N # GEORGIAN LETTER WE
+10F4;N # GEORGIAN LETTER HAR
+10F5;N # GEORGIAN LETTER HOE
+10F6;N # GEORGIAN LETTER FI
+10F7;N # GEORGIAN LETTER YN
+10F8;N # GEORGIAN LETTER ELIFI
+10F9;N # GEORGIAN LETTER TURNED GAN
+10FA;N # GEORGIAN LETTER AIN
+10FB;N # GEORGIAN PARAGRAPH SEPARATOR
+10FC;N # MODIFIER LETTER GEORGIAN NAR
+1100;W # HANGUL CHOSEONG KIYEOK
+1101;W # HANGUL CHOSEONG SSANGKIYEOK
+1102;W # HANGUL CHOSEONG NIEUN
+1103;W # HANGUL CHOSEONG TIKEUT
+1104;W # HANGUL CHOSEONG SSANGTIKEUT
+1105;W # HANGUL CHOSEONG RIEUL
+1106;W # HANGUL CHOSEONG MIEUM
+1107;W # HANGUL CHOSEONG PIEUP
+1108;W # HANGUL CHOSEONG SSANGPIEUP
+1109;W # HANGUL CHOSEONG SIOS
+110A;W # HANGUL CHOSEONG SSANGSIOS
+110B;W # HANGUL CHOSEONG IEUNG
+110C;W # HANGUL CHOSEONG CIEUC
+110D;W # HANGUL CHOSEONG SSANGCIEUC
+110E;W # HANGUL CHOSEONG CHIEUCH
+110F;W # HANGUL CHOSEONG KHIEUKH
+1110;W # HANGUL CHOSEONG THIEUTH
+1111;W # HANGUL CHOSEONG PHIEUPH
+1112;W # HANGUL CHOSEONG HIEUH
+1113;W # HANGUL CHOSEONG NIEUN-KIYEOK
+1114;W # HANGUL CHOSEONG SSANGNIEUN
+1115;W # HANGUL CHOSEONG NIEUN-TIKEUT
+1116;W # HANGUL CHOSEONG NIEUN-PIEUP
+1117;W # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118;W # HANGUL CHOSEONG RIEUL-NIEUN
+1119;W # HANGUL CHOSEONG SSANGRIEUL
+111A;W # HANGUL CHOSEONG RIEUL-HIEUH
+111B;W # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C;W # HANGUL CHOSEONG MIEUM-PIEUP
+111D;W # HANGUL CHOSEONG KAPYEOUNMIEUM
+111E;W # HANGUL CHOSEONG PIEUP-KIYEOK
+111F;W # HANGUL CHOSEONG PIEUP-NIEUN
+1120;W # HANGUL CHOSEONG PIEUP-TIKEUT
+1121;W # HANGUL CHOSEONG PIEUP-SIOS
+1122;W # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123;W # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124;W # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125;W # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126;W # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127;W # HANGUL CHOSEONG PIEUP-CIEUC
+1128;W # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129;W # HANGUL CHOSEONG PIEUP-THIEUTH
+112A;W # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B;W # HANGUL CHOSEONG KAPYEOUNPIEUP
+112C;W # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D;W # HANGUL CHOSEONG SIOS-KIYEOK
+112E;W # HANGUL CHOSEONG SIOS-NIEUN
+112F;W # HANGUL CHOSEONG SIOS-TIKEUT
+1130;W # HANGUL CHOSEONG SIOS-RIEUL
+1131;W # HANGUL CHOSEONG SIOS-MIEUM
+1132;W # HANGUL CHOSEONG SIOS-PIEUP
+1133;W # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134;W # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135;W # HANGUL CHOSEONG SIOS-IEUNG
+1136;W # HANGUL CHOSEONG SIOS-CIEUC
+1137;W # HANGUL CHOSEONG SIOS-CHIEUCH
+1138;W # HANGUL CHOSEONG SIOS-KHIEUKH
+1139;W # HANGUL CHOSEONG SIOS-THIEUTH
+113A;W # HANGUL CHOSEONG SIOS-PHIEUPH
+113B;W # HANGUL CHOSEONG SIOS-HIEUH
+113C;W # HANGUL CHOSEONG CHITUEUMSIOS
+113D;W # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E;W # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F;W # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140;W # HANGUL CHOSEONG PANSIOS
+1141;W # HANGUL CHOSEONG IEUNG-KIYEOK
+1142;W # HANGUL CHOSEONG IEUNG-TIKEUT
+1143;W # HANGUL CHOSEONG IEUNG-MIEUM
+1144;W # HANGUL CHOSEONG IEUNG-PIEUP
+1145;W # HANGUL CHOSEONG IEUNG-SIOS
+1146;W # HANGUL CHOSEONG IEUNG-PANSIOS
+1147;W # HANGUL CHOSEONG SSANGIEUNG
+1148;W # HANGUL CHOSEONG IEUNG-CIEUC
+1149;W # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A;W # HANGUL CHOSEONG IEUNG-THIEUTH
+114B;W # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C;W # HANGUL CHOSEONG YESIEUNG
+114D;W # HANGUL CHOSEONG CIEUC-IEUNG
+114E;W # HANGUL CHOSEONG CHITUEUMCIEUC
+114F;W # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150;W # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151;W # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152;W # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153;W # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154;W # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155;W # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156;W # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157;W # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158;W # HANGUL CHOSEONG SSANGHIEUH
+1159;W # HANGUL CHOSEONG YEORINHIEUH
+115F;W # HANGUL CHOSEONG FILLER
+1160;N # HANGUL JUNGSEONG FILLER
+1161;N # HANGUL JUNGSEONG A
+1162;N # HANGUL JUNGSEONG AE
+1163;N # HANGUL JUNGSEONG YA
+1164;N # HANGUL JUNGSEONG YAE
+1165;N # HANGUL JUNGSEONG EO
+1166;N # HANGUL JUNGSEONG E
+1167;N # HANGUL JUNGSEONG YEO
+1168;N # HANGUL JUNGSEONG YE
+1169;N # HANGUL JUNGSEONG O
+116A;N # HANGUL JUNGSEONG WA
+116B;N # HANGUL JUNGSEONG WAE
+116C;N # HANGUL JUNGSEONG OE
+116D;N # HANGUL JUNGSEONG YO
+116E;N # HANGUL JUNGSEONG U
+116F;N # HANGUL JUNGSEONG WEO
+1170;N # HANGUL JUNGSEONG WE
+1171;N # HANGUL JUNGSEONG WI
+1172;N # HANGUL JUNGSEONG YU
+1173;N # HANGUL JUNGSEONG EU
+1174;N # HANGUL JUNGSEONG YI
+1175;N # HANGUL JUNGSEONG I
+1176;N # HANGUL JUNGSEONG A-O
+1177;N # HANGUL JUNGSEONG A-U
+1178;N # HANGUL JUNGSEONG YA-O
+1179;N # HANGUL JUNGSEONG YA-YO
+117A;N # HANGUL JUNGSEONG EO-O
+117B;N # HANGUL JUNGSEONG EO-U
+117C;N # HANGUL JUNGSEONG EO-EU
+117D;N # HANGUL JUNGSEONG YEO-O
+117E;N # HANGUL JUNGSEONG YEO-U
+117F;N # HANGUL JUNGSEONG O-EO
+1180;N # HANGUL JUNGSEONG O-E
+1181;N # HANGUL JUNGSEONG O-YE
+1182;N # HANGUL JUNGSEONG O-O
+1183;N # HANGUL JUNGSEONG O-U
+1184;N # HANGUL JUNGSEONG YO-YA
+1185;N # HANGUL JUNGSEONG YO-YAE
+1186;N # HANGUL JUNGSEONG YO-YEO
+1187;N # HANGUL JUNGSEONG YO-O
+1188;N # HANGUL JUNGSEONG YO-I
+1189;N # HANGUL JUNGSEONG U-A
+118A;N # HANGUL JUNGSEONG U-AE
+118B;N # HANGUL JUNGSEONG U-EO-EU
+118C;N # HANGUL JUNGSEONG U-YE
+118D;N # HANGUL JUNGSEONG U-U
+118E;N # HANGUL JUNGSEONG YU-A
+118F;N # HANGUL JUNGSEONG YU-EO
+1190;N # HANGUL JUNGSEONG YU-E
+1191;N # HANGUL JUNGSEONG YU-YEO
+1192;N # HANGUL JUNGSEONG YU-YE
+1193;N # HANGUL JUNGSEONG YU-U
+1194;N # HANGUL JUNGSEONG YU-I
+1195;N # HANGUL JUNGSEONG EU-U
+1196;N # HANGUL JUNGSEONG EU-EU
+1197;N # HANGUL JUNGSEONG YI-U
+1198;N # HANGUL JUNGSEONG I-A
+1199;N # HANGUL JUNGSEONG I-YA
+119A;N # HANGUL JUNGSEONG I-O
+119B;N # HANGUL JUNGSEONG I-U
+119C;N # HANGUL JUNGSEONG I-EU
+119D;N # HANGUL JUNGSEONG I-ARAEA
+119E;N # HANGUL JUNGSEONG ARAEA
+119F;N # HANGUL JUNGSEONG ARAEA-EO
+11A0;N # HANGUL JUNGSEONG ARAEA-U
+11A1;N # HANGUL JUNGSEONG ARAEA-I
+11A2;N # HANGUL JUNGSEONG SSANGARAEA
+11A8;N # HANGUL JONGSEONG KIYEOK
+11A9;N # HANGUL JONGSEONG SSANGKIYEOK
+11AA;N # HANGUL JONGSEONG KIYEOK-SIOS
+11AB;N # HANGUL JONGSEONG NIEUN
+11AC;N # HANGUL JONGSEONG NIEUN-CIEUC
+11AD;N # HANGUL JONGSEONG NIEUN-HIEUH
+11AE;N # HANGUL JONGSEONG TIKEUT
+11AF;N # HANGUL JONGSEONG RIEUL
+11B0;N # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1;N # HANGUL JONGSEONG RIEUL-MIEUM
+11B2;N # HANGUL JONGSEONG RIEUL-PIEUP
+11B3;N # HANGUL JONGSEONG RIEUL-SIOS
+11B4;N # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5;N # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6;N # HANGUL JONGSEONG RIEUL-HIEUH
+11B7;N # HANGUL JONGSEONG MIEUM
+11B8;N # HANGUL JONGSEONG PIEUP
+11B9;N # HANGUL JONGSEONG PIEUP-SIOS
+11BA;N # HANGUL JONGSEONG SIOS
+11BB;N # HANGUL JONGSEONG SSANGSIOS
+11BC;N # HANGUL JONGSEONG IEUNG
+11BD;N # HANGUL JONGSEONG CIEUC
+11BE;N # HANGUL JONGSEONG CHIEUCH
+11BF;N # HANGUL JONGSEONG KHIEUKH
+11C0;N # HANGUL JONGSEONG THIEUTH
+11C1;N # HANGUL JONGSEONG PHIEUPH
+11C2;N # HANGUL JONGSEONG HIEUH
+11C3;N # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4;N # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5;N # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6;N # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7;N # HANGUL JONGSEONG NIEUN-SIOS
+11C8;N # HANGUL JONGSEONG NIEUN-PANSIOS
+11C9;N # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA;N # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB;N # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC;N # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD;N # HANGUL JONGSEONG RIEUL-NIEUN
+11CE;N # HANGUL JONGSEONG RIEUL-TIKEUT
+11CF;N # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0;N # HANGUL JONGSEONG SSANGRIEUL
+11D1;N # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2;N # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3;N # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4;N # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5;N # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6;N # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7;N # HANGUL JONGSEONG RIEUL-PANSIOS
+11D8;N # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9;N # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA;N # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB;N # HANGUL JONGSEONG MIEUM-RIEUL
+11DC;N # HANGUL JONGSEONG MIEUM-PIEUP
+11DD;N # HANGUL JONGSEONG MIEUM-SIOS
+11DE;N # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF;N # HANGUL JONGSEONG MIEUM-PANSIOS
+11E0;N # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1;N # HANGUL JONGSEONG MIEUM-HIEUH
+11E2;N # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3;N # HANGUL JONGSEONG PIEUP-RIEUL
+11E4;N # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5;N # HANGUL JONGSEONG PIEUP-HIEUH
+11E6;N # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7;N # HANGUL JONGSEONG SIOS-KIYEOK
+11E8;N # HANGUL JONGSEONG SIOS-TIKEUT
+11E9;N # HANGUL JONGSEONG SIOS-RIEUL
+11EA;N # HANGUL JONGSEONG SIOS-PIEUP
+11EB;N # HANGUL JONGSEONG PANSIOS
+11EC;N # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED;N # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE;N # HANGUL JONGSEONG SSANGIEUNG
+11EF;N # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0;N # HANGUL JONGSEONG YESIEUNG
+11F1;N # HANGUL JONGSEONG YESIEUNG-SIOS
+11F2;N # HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3;N # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4;N # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5;N # HANGUL JONGSEONG HIEUH-NIEUN
+11F6;N # HANGUL JONGSEONG HIEUH-RIEUL
+11F7;N # HANGUL JONGSEONG HIEUH-MIEUM
+11F8;N # HANGUL JONGSEONG HIEUH-PIEUP
+11F9;N # HANGUL JONGSEONG YEORINHIEUH
+1200;N # ETHIOPIC SYLLABLE HA
+1201;N # ETHIOPIC SYLLABLE HU
+1202;N # ETHIOPIC SYLLABLE HI
+1203;N # ETHIOPIC SYLLABLE HAA
+1204;N # ETHIOPIC SYLLABLE HEE
+1205;N # ETHIOPIC SYLLABLE HE
+1206;N # ETHIOPIC SYLLABLE HO
+1207;N # ETHIOPIC SYLLABLE HOA
+1208;N # ETHIOPIC SYLLABLE LA
+1209;N # ETHIOPIC SYLLABLE LU
+120A;N # ETHIOPIC SYLLABLE LI
+120B;N # ETHIOPIC SYLLABLE LAA
+120C;N # ETHIOPIC SYLLABLE LEE
+120D;N # ETHIOPIC SYLLABLE LE
+120E;N # ETHIOPIC SYLLABLE LO
+120F;N # ETHIOPIC SYLLABLE LWA
+1210;N # ETHIOPIC SYLLABLE HHA
+1211;N # ETHIOPIC SYLLABLE HHU
+1212;N # ETHIOPIC SYLLABLE HHI
+1213;N # ETHIOPIC SYLLABLE HHAA
+1214;N # ETHIOPIC SYLLABLE HHEE
+1215;N # ETHIOPIC SYLLABLE HHE
+1216;N # ETHIOPIC SYLLABLE HHO
+1217;N # ETHIOPIC SYLLABLE HHWA
+1218;N # ETHIOPIC SYLLABLE MA
+1219;N # ETHIOPIC SYLLABLE MU
+121A;N # ETHIOPIC SYLLABLE MI
+121B;N # ETHIOPIC SYLLABLE MAA
+121C;N # ETHIOPIC SYLLABLE MEE
+121D;N # ETHIOPIC SYLLABLE ME
+121E;N # ETHIOPIC SYLLABLE MO
+121F;N # ETHIOPIC SYLLABLE MWA
+1220;N # ETHIOPIC SYLLABLE SZA
+1221;N # ETHIOPIC SYLLABLE SZU
+1222;N # ETHIOPIC SYLLABLE SZI
+1223;N # ETHIOPIC SYLLABLE SZAA
+1224;N # ETHIOPIC SYLLABLE SZEE
+1225;N # ETHIOPIC SYLLABLE SZE
+1226;N # ETHIOPIC SYLLABLE SZO
+1227;N # ETHIOPIC SYLLABLE SZWA
+1228;N # ETHIOPIC SYLLABLE RA
+1229;N # ETHIOPIC SYLLABLE RU
+122A;N # ETHIOPIC SYLLABLE RI
+122B;N # ETHIOPIC SYLLABLE RAA
+122C;N # ETHIOPIC SYLLABLE REE
+122D;N # ETHIOPIC SYLLABLE RE
+122E;N # ETHIOPIC SYLLABLE RO
+122F;N # ETHIOPIC SYLLABLE RWA
+1230;N # ETHIOPIC SYLLABLE SA
+1231;N # ETHIOPIC SYLLABLE SU
+1232;N # ETHIOPIC SYLLABLE SI
+1233;N # ETHIOPIC SYLLABLE SAA
+1234;N # ETHIOPIC SYLLABLE SEE
+1235;N # ETHIOPIC SYLLABLE SE
+1236;N # ETHIOPIC SYLLABLE SO
+1237;N # ETHIOPIC SYLLABLE SWA
+1238;N # ETHIOPIC SYLLABLE SHA
+1239;N # ETHIOPIC SYLLABLE SHU
+123A;N # ETHIOPIC SYLLABLE SHI
+123B;N # ETHIOPIC SYLLABLE SHAA
+123C;N # ETHIOPIC SYLLABLE SHEE
+123D;N # ETHIOPIC SYLLABLE SHE
+123E;N # ETHIOPIC SYLLABLE SHO
+123F;N # ETHIOPIC SYLLABLE SHWA
+1240;N # ETHIOPIC SYLLABLE QA
+1241;N # ETHIOPIC SYLLABLE QU
+1242;N # ETHIOPIC SYLLABLE QI
+1243;N # ETHIOPIC SYLLABLE QAA
+1244;N # ETHIOPIC SYLLABLE QEE
+1245;N # ETHIOPIC SYLLABLE QE
+1246;N # ETHIOPIC SYLLABLE QO
+1247;N # ETHIOPIC SYLLABLE QOA
+1248;N # ETHIOPIC SYLLABLE QWA
+124A;N # ETHIOPIC SYLLABLE QWI
+124B;N # ETHIOPIC SYLLABLE QWAA
+124C;N # ETHIOPIC SYLLABLE QWEE
+124D;N # ETHIOPIC SYLLABLE QWE
+1250;N # ETHIOPIC SYLLABLE QHA
+1251;N # ETHIOPIC SYLLABLE QHU
+1252;N # ETHIOPIC SYLLABLE QHI
+1253;N # ETHIOPIC SYLLABLE QHAA
+1254;N # ETHIOPIC SYLLABLE QHEE
+1255;N # ETHIOPIC SYLLABLE QHE
+1256;N # ETHIOPIC SYLLABLE QHO
+1258;N # ETHIOPIC SYLLABLE QHWA
+125A;N # ETHIOPIC SYLLABLE QHWI
+125B;N # ETHIOPIC SYLLABLE QHWAA
+125C;N # ETHIOPIC SYLLABLE QHWEE
+125D;N # ETHIOPIC SYLLABLE QHWE
+1260;N # ETHIOPIC SYLLABLE BA
+1261;N # ETHIOPIC SYLLABLE BU
+1262;N # ETHIOPIC SYLLABLE BI
+1263;N # ETHIOPIC SYLLABLE BAA
+1264;N # ETHIOPIC SYLLABLE BEE
+1265;N # ETHIOPIC SYLLABLE BE
+1266;N # ETHIOPIC SYLLABLE BO
+1267;N # ETHIOPIC SYLLABLE BWA
+1268;N # ETHIOPIC SYLLABLE VA
+1269;N # ETHIOPIC SYLLABLE VU
+126A;N # ETHIOPIC SYLLABLE VI
+126B;N # ETHIOPIC SYLLABLE VAA
+126C;N # ETHIOPIC SYLLABLE VEE
+126D;N # ETHIOPIC SYLLABLE VE
+126E;N # ETHIOPIC SYLLABLE VO
+126F;N # ETHIOPIC SYLLABLE VWA
+1270;N # ETHIOPIC SYLLABLE TA
+1271;N # ETHIOPIC SYLLABLE TU
+1272;N # ETHIOPIC SYLLABLE TI
+1273;N # ETHIOPIC SYLLABLE TAA
+1274;N # ETHIOPIC SYLLABLE TEE
+1275;N # ETHIOPIC SYLLABLE TE
+1276;N # ETHIOPIC SYLLABLE TO
+1277;N # ETHIOPIC SYLLABLE TWA
+1278;N # ETHIOPIC SYLLABLE CA
+1279;N # ETHIOPIC SYLLABLE CU
+127A;N # ETHIOPIC SYLLABLE CI
+127B;N # ETHIOPIC SYLLABLE CAA
+127C;N # ETHIOPIC SYLLABLE CEE
+127D;N # ETHIOPIC SYLLABLE CE
+127E;N # ETHIOPIC SYLLABLE CO
+127F;N # ETHIOPIC SYLLABLE CWA
+1280;N # ETHIOPIC SYLLABLE XA
+1281;N # ETHIOPIC SYLLABLE XU
+1282;N # ETHIOPIC SYLLABLE XI
+1283;N # ETHIOPIC SYLLABLE XAA
+1284;N # ETHIOPIC SYLLABLE XEE
+1285;N # ETHIOPIC SYLLABLE XE
+1286;N # ETHIOPIC SYLLABLE XO
+1287;N # ETHIOPIC SYLLABLE XOA
+1288;N # ETHIOPIC SYLLABLE XWA
+128A;N # ETHIOPIC SYLLABLE XWI
+128B;N # ETHIOPIC SYLLABLE XWAA
+128C;N # ETHIOPIC SYLLABLE XWEE
+128D;N # ETHIOPIC SYLLABLE XWE
+1290;N # ETHIOPIC SYLLABLE NA
+1291;N # ETHIOPIC SYLLABLE NU
+1292;N # ETHIOPIC SYLLABLE NI
+1293;N # ETHIOPIC SYLLABLE NAA
+1294;N # ETHIOPIC SYLLABLE NEE
+1295;N # ETHIOPIC SYLLABLE NE
+1296;N # ETHIOPIC SYLLABLE NO
+1297;N # ETHIOPIC SYLLABLE NWA
+1298;N # ETHIOPIC SYLLABLE NYA
+1299;N # ETHIOPIC SYLLABLE NYU
+129A;N # ETHIOPIC SYLLABLE NYI
+129B;N # ETHIOPIC SYLLABLE NYAA
+129C;N # ETHIOPIC SYLLABLE NYEE
+129D;N # ETHIOPIC SYLLABLE NYE
+129E;N # ETHIOPIC SYLLABLE NYO
+129F;N # ETHIOPIC SYLLABLE NYWA
+12A0;N # ETHIOPIC SYLLABLE GLOTTAL A
+12A1;N # ETHIOPIC SYLLABLE GLOTTAL U
+12A2;N # ETHIOPIC SYLLABLE GLOTTAL I
+12A3;N # ETHIOPIC SYLLABLE GLOTTAL AA
+12A4;N # ETHIOPIC SYLLABLE GLOTTAL EE
+12A5;N # ETHIOPIC SYLLABLE GLOTTAL E
+12A6;N # ETHIOPIC SYLLABLE GLOTTAL O
+12A7;N # ETHIOPIC SYLLABLE GLOTTAL WA
+12A8;N # ETHIOPIC SYLLABLE KA
+12A9;N # ETHIOPIC SYLLABLE KU
+12AA;N # ETHIOPIC SYLLABLE KI
+12AB;N # ETHIOPIC SYLLABLE KAA
+12AC;N # ETHIOPIC SYLLABLE KEE
+12AD;N # ETHIOPIC SYLLABLE KE
+12AE;N # ETHIOPIC SYLLABLE KO
+12AF;N # ETHIOPIC SYLLABLE KOA
+12B0;N # ETHIOPIC SYLLABLE KWA
+12B2;N # ETHIOPIC SYLLABLE KWI
+12B3;N # ETHIOPIC SYLLABLE KWAA
+12B4;N # ETHIOPIC SYLLABLE KWEE
+12B5;N # ETHIOPIC SYLLABLE KWE
+12B8;N # ETHIOPIC SYLLABLE KXA
+12B9;N # ETHIOPIC SYLLABLE KXU
+12BA;N # ETHIOPIC SYLLABLE KXI
+12BB;N # ETHIOPIC SYLLABLE KXAA
+12BC;N # ETHIOPIC SYLLABLE KXEE
+12BD;N # ETHIOPIC SYLLABLE KXE
+12BE;N # ETHIOPIC SYLLABLE KXO
+12C0;N # ETHIOPIC SYLLABLE KXWA
+12C2;N # ETHIOPIC SYLLABLE KXWI
+12C3;N # ETHIOPIC SYLLABLE KXWAA
+12C4;N # ETHIOPIC SYLLABLE KXWEE
+12C5;N # ETHIOPIC SYLLABLE KXWE
+12C8;N # ETHIOPIC SYLLABLE WA
+12C9;N # ETHIOPIC SYLLABLE WU
+12CA;N # ETHIOPIC SYLLABLE WI
+12CB;N # ETHIOPIC SYLLABLE WAA
+12CC;N # ETHIOPIC SYLLABLE WEE
+12CD;N # ETHIOPIC SYLLABLE WE
+12CE;N # ETHIOPIC SYLLABLE WO
+12CF;N # ETHIOPIC SYLLABLE WOA
+12D0;N # ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1;N # ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2;N # ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3;N # ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4;N # ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5;N # ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6;N # ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8;N # ETHIOPIC SYLLABLE ZA
+12D9;N # ETHIOPIC SYLLABLE ZU
+12DA;N # ETHIOPIC SYLLABLE ZI
+12DB;N # ETHIOPIC SYLLABLE ZAA
+12DC;N # ETHIOPIC SYLLABLE ZEE
+12DD;N # ETHIOPIC SYLLABLE ZE
+12DE;N # ETHIOPIC SYLLABLE ZO
+12DF;N # ETHIOPIC SYLLABLE ZWA
+12E0;N # ETHIOPIC SYLLABLE ZHA
+12E1;N # ETHIOPIC SYLLABLE ZHU
+12E2;N # ETHIOPIC SYLLABLE ZHI
+12E3;N # ETHIOPIC SYLLABLE ZHAA
+12E4;N # ETHIOPIC SYLLABLE ZHEE
+12E5;N # ETHIOPIC SYLLABLE ZHE
+12E6;N # ETHIOPIC SYLLABLE ZHO
+12E7;N # ETHIOPIC SYLLABLE ZHWA
+12E8;N # ETHIOPIC SYLLABLE YA
+12E9;N # ETHIOPIC SYLLABLE YU
+12EA;N # ETHIOPIC SYLLABLE YI
+12EB;N # ETHIOPIC SYLLABLE YAA
+12EC;N # ETHIOPIC SYLLABLE YEE
+12ED;N # ETHIOPIC SYLLABLE YE
+12EE;N # ETHIOPIC SYLLABLE YO
+12EF;N # ETHIOPIC SYLLABLE YOA
+12F0;N # ETHIOPIC SYLLABLE DA
+12F1;N # ETHIOPIC SYLLABLE DU
+12F2;N # ETHIOPIC SYLLABLE DI
+12F3;N # ETHIOPIC SYLLABLE DAA
+12F4;N # ETHIOPIC SYLLABLE DEE
+12F5;N # ETHIOPIC SYLLABLE DE
+12F6;N # ETHIOPIC SYLLABLE DO
+12F7;N # ETHIOPIC SYLLABLE DWA
+12F8;N # ETHIOPIC SYLLABLE DDA
+12F9;N # ETHIOPIC SYLLABLE DDU
+12FA;N # ETHIOPIC SYLLABLE DDI
+12FB;N # ETHIOPIC SYLLABLE DDAA
+12FC;N # ETHIOPIC SYLLABLE DDEE
+12FD;N # ETHIOPIC SYLLABLE DDE
+12FE;N # ETHIOPIC SYLLABLE DDO
+12FF;N # ETHIOPIC SYLLABLE DDWA
+1300;N # ETHIOPIC SYLLABLE JA
+1301;N # ETHIOPIC SYLLABLE JU
+1302;N # ETHIOPIC SYLLABLE JI
+1303;N # ETHIOPIC SYLLABLE JAA
+1304;N # ETHIOPIC SYLLABLE JEE
+1305;N # ETHIOPIC SYLLABLE JE
+1306;N # ETHIOPIC SYLLABLE JO
+1307;N # ETHIOPIC SYLLABLE JWA
+1308;N # ETHIOPIC SYLLABLE GA
+1309;N # ETHIOPIC SYLLABLE GU
+130A;N # ETHIOPIC SYLLABLE GI
+130B;N # ETHIOPIC SYLLABLE GAA
+130C;N # ETHIOPIC SYLLABLE GEE
+130D;N # ETHIOPIC SYLLABLE GE
+130E;N # ETHIOPIC SYLLABLE GO
+130F;N # ETHIOPIC SYLLABLE GOA
+1310;N # ETHIOPIC SYLLABLE GWA
+1312;N # ETHIOPIC SYLLABLE GWI
+1313;N # ETHIOPIC SYLLABLE GWAA
+1314;N # ETHIOPIC SYLLABLE GWEE
+1315;N # ETHIOPIC SYLLABLE GWE
+1318;N # ETHIOPIC SYLLABLE GGA
+1319;N # ETHIOPIC SYLLABLE GGU
+131A;N # ETHIOPIC SYLLABLE GGI
+131B;N # ETHIOPIC SYLLABLE GGAA
+131C;N # ETHIOPIC SYLLABLE GGEE
+131D;N # ETHIOPIC SYLLABLE GGE
+131E;N # ETHIOPIC SYLLABLE GGO
+131F;N # ETHIOPIC SYLLABLE GGWAA
+1320;N # ETHIOPIC SYLLABLE THA
+1321;N # ETHIOPIC SYLLABLE THU
+1322;N # ETHIOPIC SYLLABLE THI
+1323;N # ETHIOPIC SYLLABLE THAA
+1324;N # ETHIOPIC SYLLABLE THEE
+1325;N # ETHIOPIC SYLLABLE THE
+1326;N # ETHIOPIC SYLLABLE THO
+1327;N # ETHIOPIC SYLLABLE THWA
+1328;N # ETHIOPIC SYLLABLE CHA
+1329;N # ETHIOPIC SYLLABLE CHU
+132A;N # ETHIOPIC SYLLABLE CHI
+132B;N # ETHIOPIC SYLLABLE CHAA
+132C;N # ETHIOPIC SYLLABLE CHEE
+132D;N # ETHIOPIC SYLLABLE CHE
+132E;N # ETHIOPIC SYLLABLE CHO
+132F;N # ETHIOPIC SYLLABLE CHWA
+1330;N # ETHIOPIC SYLLABLE PHA
+1331;N # ETHIOPIC SYLLABLE PHU
+1332;N # ETHIOPIC SYLLABLE PHI
+1333;N # ETHIOPIC SYLLABLE PHAA
+1334;N # ETHIOPIC SYLLABLE PHEE
+1335;N # ETHIOPIC SYLLABLE PHE
+1336;N # ETHIOPIC SYLLABLE PHO
+1337;N # ETHIOPIC SYLLABLE PHWA
+1338;N # ETHIOPIC SYLLABLE TSA
+1339;N # ETHIOPIC SYLLABLE TSU
+133A;N # ETHIOPIC SYLLABLE TSI
+133B;N # ETHIOPIC SYLLABLE TSAA
+133C;N # ETHIOPIC SYLLABLE TSEE
+133D;N # ETHIOPIC SYLLABLE TSE
+133E;N # ETHIOPIC SYLLABLE TSO
+133F;N # ETHIOPIC SYLLABLE TSWA
+1340;N # ETHIOPIC SYLLABLE TZA
+1341;N # ETHIOPIC SYLLABLE TZU
+1342;N # ETHIOPIC SYLLABLE TZI
+1343;N # ETHIOPIC SYLLABLE TZAA
+1344;N # ETHIOPIC SYLLABLE TZEE
+1345;N # ETHIOPIC SYLLABLE TZE
+1346;N # ETHIOPIC SYLLABLE TZO
+1347;N # ETHIOPIC SYLLABLE TZOA
+1348;N # ETHIOPIC SYLLABLE FA
+1349;N # ETHIOPIC SYLLABLE FU
+134A;N # ETHIOPIC SYLLABLE FI
+134B;N # ETHIOPIC SYLLABLE FAA
+134C;N # ETHIOPIC SYLLABLE FEE
+134D;N # ETHIOPIC SYLLABLE FE
+134E;N # ETHIOPIC SYLLABLE FO
+134F;N # ETHIOPIC SYLLABLE FWA
+1350;N # ETHIOPIC SYLLABLE PA
+1351;N # ETHIOPIC SYLLABLE PU
+1352;N # ETHIOPIC SYLLABLE PI
+1353;N # ETHIOPIC SYLLABLE PAA
+1354;N # ETHIOPIC SYLLABLE PEE
+1355;N # ETHIOPIC SYLLABLE PE
+1356;N # ETHIOPIC SYLLABLE PO
+1357;N # ETHIOPIC SYLLABLE PWA
+1358;N # ETHIOPIC SYLLABLE RYA
+1359;N # ETHIOPIC SYLLABLE MYA
+135A;N # ETHIOPIC SYLLABLE FYA
+135F;N # ETHIOPIC COMBINING GEMINATION MARK
+1360;N # ETHIOPIC SECTION MARK
+1361;N # ETHIOPIC WORDSPACE
+1362;N # ETHIOPIC FULL STOP
+1363;N # ETHIOPIC COMMA
+1364;N # ETHIOPIC SEMICOLON
+1365;N # ETHIOPIC COLON
+1366;N # ETHIOPIC PREFACE COLON
+1367;N # ETHIOPIC QUESTION MARK
+1368;N # ETHIOPIC PARAGRAPH SEPARATOR
+1369;N # ETHIOPIC DIGIT ONE
+136A;N # ETHIOPIC DIGIT TWO
+136B;N # ETHIOPIC DIGIT THREE
+136C;N # ETHIOPIC DIGIT FOUR
+136D;N # ETHIOPIC DIGIT FIVE
+136E;N # ETHIOPIC DIGIT SIX
+136F;N # ETHIOPIC DIGIT SEVEN
+1370;N # ETHIOPIC DIGIT EIGHT
+1371;N # ETHIOPIC DIGIT NINE
+1372;N # ETHIOPIC NUMBER TEN
+1373;N # ETHIOPIC NUMBER TWENTY
+1374;N # ETHIOPIC NUMBER THIRTY
+1375;N # ETHIOPIC NUMBER FORTY
+1376;N # ETHIOPIC NUMBER FIFTY
+1377;N # ETHIOPIC NUMBER SIXTY
+1378;N # ETHIOPIC NUMBER SEVENTY
+1379;N # ETHIOPIC NUMBER EIGHTY
+137A;N # ETHIOPIC NUMBER NINETY
+137B;N # ETHIOPIC NUMBER HUNDRED
+137C;N # ETHIOPIC NUMBER TEN THOUSAND
+1380;N # ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381;N # ETHIOPIC SYLLABLE MWI
+1382;N # ETHIOPIC SYLLABLE MWEE
+1383;N # ETHIOPIC SYLLABLE MWE
+1384;N # ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385;N # ETHIOPIC SYLLABLE BWI
+1386;N # ETHIOPIC SYLLABLE BWEE
+1387;N # ETHIOPIC SYLLABLE BWE
+1388;N # ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389;N # ETHIOPIC SYLLABLE FWI
+138A;N # ETHIOPIC SYLLABLE FWEE
+138B;N # ETHIOPIC SYLLABLE FWE
+138C;N # ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D;N # ETHIOPIC SYLLABLE PWI
+138E;N # ETHIOPIC SYLLABLE PWEE
+138F;N # ETHIOPIC SYLLABLE PWE
+1390;N # ETHIOPIC TONAL MARK YIZET
+1391;N # ETHIOPIC TONAL MARK DERET
+1392;N # ETHIOPIC TONAL MARK RIKRIK
+1393;N # ETHIOPIC TONAL MARK SHORT RIKRIK
+1394;N # ETHIOPIC TONAL MARK DIFAT
+1395;N # ETHIOPIC TONAL MARK KENAT
+1396;N # ETHIOPIC TONAL MARK CHIRET
+1397;N # ETHIOPIC TONAL MARK HIDET
+1398;N # ETHIOPIC TONAL MARK DERET-HIDET
+1399;N # ETHIOPIC TONAL MARK KURT
+13A0;N # CHEROKEE LETTER A
+13A1;N # CHEROKEE LETTER E
+13A2;N # CHEROKEE LETTER I
+13A3;N # CHEROKEE LETTER O
+13A4;N # CHEROKEE LETTER U
+13A5;N # CHEROKEE LETTER V
+13A6;N # CHEROKEE LETTER GA
+13A7;N # CHEROKEE LETTER KA
+13A8;N # CHEROKEE LETTER GE
+13A9;N # CHEROKEE LETTER GI
+13AA;N # CHEROKEE LETTER GO
+13AB;N # CHEROKEE LETTER GU
+13AC;N # CHEROKEE LETTER GV
+13AD;N # CHEROKEE LETTER HA
+13AE;N # CHEROKEE LETTER HE
+13AF;N # CHEROKEE LETTER HI
+13B0;N # CHEROKEE LETTER HO
+13B1;N # CHEROKEE LETTER HU
+13B2;N # CHEROKEE LETTER HV
+13B3;N # CHEROKEE LETTER LA
+13B4;N # CHEROKEE LETTER LE
+13B5;N # CHEROKEE LETTER LI
+13B6;N # CHEROKEE LETTER LO
+13B7;N # CHEROKEE LETTER LU
+13B8;N # CHEROKEE LETTER LV
+13B9;N # CHEROKEE LETTER MA
+13BA;N # CHEROKEE LETTER ME
+13BB;N # CHEROKEE LETTER MI
+13BC;N # CHEROKEE LETTER MO
+13BD;N # CHEROKEE LETTER MU
+13BE;N # CHEROKEE LETTER NA
+13BF;N # CHEROKEE LETTER HNA
+13C0;N # CHEROKEE LETTER NAH
+13C1;N # CHEROKEE LETTER NE
+13C2;N # CHEROKEE LETTER NI
+13C3;N # CHEROKEE LETTER NO
+13C4;N # CHEROKEE LETTER NU
+13C5;N # CHEROKEE LETTER NV
+13C6;N # CHEROKEE LETTER QUA
+13C7;N # CHEROKEE LETTER QUE
+13C8;N # CHEROKEE LETTER QUI
+13C9;N # CHEROKEE LETTER QUO
+13CA;N # CHEROKEE LETTER QUU
+13CB;N # CHEROKEE LETTER QUV
+13CC;N # CHEROKEE LETTER SA
+13CD;N # CHEROKEE LETTER S
+13CE;N # CHEROKEE LETTER SE
+13CF;N # CHEROKEE LETTER SI
+13D0;N # CHEROKEE LETTER SO
+13D1;N # CHEROKEE LETTER SU
+13D2;N # CHEROKEE LETTER SV
+13D3;N # CHEROKEE LETTER DA
+13D4;N # CHEROKEE LETTER TA
+13D5;N # CHEROKEE LETTER DE
+13D6;N # CHEROKEE LETTER TE
+13D7;N # CHEROKEE LETTER DI
+13D8;N # CHEROKEE LETTER TI
+13D9;N # CHEROKEE LETTER DO
+13DA;N # CHEROKEE LETTER DU
+13DB;N # CHEROKEE LETTER DV
+13DC;N # CHEROKEE LETTER DLA
+13DD;N # CHEROKEE LETTER TLA
+13DE;N # CHEROKEE LETTER TLE
+13DF;N # CHEROKEE LETTER TLI
+13E0;N # CHEROKEE LETTER TLO
+13E1;N # CHEROKEE LETTER TLU
+13E2;N # CHEROKEE LETTER TLV
+13E3;N # CHEROKEE LETTER TSA
+13E4;N # CHEROKEE LETTER TSE
+13E5;N # CHEROKEE LETTER TSI
+13E6;N # CHEROKEE LETTER TSO
+13E7;N # CHEROKEE LETTER TSU
+13E8;N # CHEROKEE LETTER TSV
+13E9;N # CHEROKEE LETTER WA
+13EA;N # CHEROKEE LETTER WE
+13EB;N # CHEROKEE LETTER WI
+13EC;N # CHEROKEE LETTER WO
+13ED;N # CHEROKEE LETTER WU
+13EE;N # CHEROKEE LETTER WV
+13EF;N # CHEROKEE LETTER YA
+13F0;N # CHEROKEE LETTER YE
+13F1;N # CHEROKEE LETTER YI
+13F2;N # CHEROKEE LETTER YO
+13F3;N # CHEROKEE LETTER YU
+13F4;N # CHEROKEE LETTER YV
+1401;N # CANADIAN SYLLABICS E
+1402;N # CANADIAN SYLLABICS AAI
+1403;N # CANADIAN SYLLABICS I
+1404;N # CANADIAN SYLLABICS II
+1405;N # CANADIAN SYLLABICS O
+1406;N # CANADIAN SYLLABICS OO
+1407;N # CANADIAN SYLLABICS Y-CREE OO
+1408;N # CANADIAN SYLLABICS CARRIER EE
+1409;N # CANADIAN SYLLABICS CARRIER I
+140A;N # CANADIAN SYLLABICS A
+140B;N # CANADIAN SYLLABICS AA
+140C;N # CANADIAN SYLLABICS WE
+140D;N # CANADIAN SYLLABICS WEST-CREE WE
+140E;N # CANADIAN SYLLABICS WI
+140F;N # CANADIAN SYLLABICS WEST-CREE WI
+1410;N # CANADIAN SYLLABICS WII
+1411;N # CANADIAN SYLLABICS WEST-CREE WII
+1412;N # CANADIAN SYLLABICS WO
+1413;N # CANADIAN SYLLABICS WEST-CREE WO
+1414;N # CANADIAN SYLLABICS WOO
+1415;N # CANADIAN SYLLABICS WEST-CREE WOO
+1416;N # CANADIAN SYLLABICS NASKAPI WOO
+1417;N # CANADIAN SYLLABICS WA
+1418;N # CANADIAN SYLLABICS WEST-CREE WA
+1419;N # CANADIAN SYLLABICS WAA
+141A;N # CANADIAN SYLLABICS WEST-CREE WAA
+141B;N # CANADIAN SYLLABICS NASKAPI WAA
+141C;N # CANADIAN SYLLABICS AI
+141D;N # CANADIAN SYLLABICS Y-CREE W
+141E;N # CANADIAN SYLLABICS GLOTTAL STOP
+141F;N # CANADIAN SYLLABICS FINAL ACUTE
+1420;N # CANADIAN SYLLABICS FINAL GRAVE
+1421;N # CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422;N # CANADIAN SYLLABICS FINAL TOP HALF RING
+1423;N # CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424;N # CANADIAN SYLLABICS FINAL RING
+1425;N # CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426;N # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427;N # CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428;N # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429;N # CANADIAN SYLLABICS FINAL PLUS
+142A;N # CANADIAN SYLLABICS FINAL DOWN TACK
+142B;N # CANADIAN SYLLABICS EN
+142C;N # CANADIAN SYLLABICS IN
+142D;N # CANADIAN SYLLABICS ON
+142E;N # CANADIAN SYLLABICS AN
+142F;N # CANADIAN SYLLABICS PE
+1430;N # CANADIAN SYLLABICS PAAI
+1431;N # CANADIAN SYLLABICS PI
+1432;N # CANADIAN SYLLABICS PII
+1433;N # CANADIAN SYLLABICS PO
+1434;N # CANADIAN SYLLABICS POO
+1435;N # CANADIAN SYLLABICS Y-CREE POO
+1436;N # CANADIAN SYLLABICS CARRIER HEE
+1437;N # CANADIAN SYLLABICS CARRIER HI
+1438;N # CANADIAN SYLLABICS PA
+1439;N # CANADIAN SYLLABICS PAA
+143A;N # CANADIAN SYLLABICS PWE
+143B;N # CANADIAN SYLLABICS WEST-CREE PWE
+143C;N # CANADIAN SYLLABICS PWI
+143D;N # CANADIAN SYLLABICS WEST-CREE PWI
+143E;N # CANADIAN SYLLABICS PWII
+143F;N # CANADIAN SYLLABICS WEST-CREE PWII
+1440;N # CANADIAN SYLLABICS PWO
+1441;N # CANADIAN SYLLABICS WEST-CREE PWO
+1442;N # CANADIAN SYLLABICS PWOO
+1443;N # CANADIAN SYLLABICS WEST-CREE PWOO
+1444;N # CANADIAN SYLLABICS PWA
+1445;N # CANADIAN SYLLABICS WEST-CREE PWA
+1446;N # CANADIAN SYLLABICS PWAA
+1447;N # CANADIAN SYLLABICS WEST-CREE PWAA
+1448;N # CANADIAN SYLLABICS Y-CREE PWAA
+1449;N # CANADIAN SYLLABICS P
+144A;N # CANADIAN SYLLABICS WEST-CREE P
+144B;N # CANADIAN SYLLABICS CARRIER H
+144C;N # CANADIAN SYLLABICS TE
+144D;N # CANADIAN SYLLABICS TAAI
+144E;N # CANADIAN SYLLABICS TI
+144F;N # CANADIAN SYLLABICS TII
+1450;N # CANADIAN SYLLABICS TO
+1451;N # CANADIAN SYLLABICS TOO
+1452;N # CANADIAN SYLLABICS Y-CREE TOO
+1453;N # CANADIAN SYLLABICS CARRIER DEE
+1454;N # CANADIAN SYLLABICS CARRIER DI
+1455;N # CANADIAN SYLLABICS TA
+1456;N # CANADIAN SYLLABICS TAA
+1457;N # CANADIAN SYLLABICS TWE
+1458;N # CANADIAN SYLLABICS WEST-CREE TWE
+1459;N # CANADIAN SYLLABICS TWI
+145A;N # CANADIAN SYLLABICS WEST-CREE TWI
+145B;N # CANADIAN SYLLABICS TWII
+145C;N # CANADIAN SYLLABICS WEST-CREE TWII
+145D;N # CANADIAN SYLLABICS TWO
+145E;N # CANADIAN SYLLABICS WEST-CREE TWO
+145F;N # CANADIAN SYLLABICS TWOO
+1460;N # CANADIAN SYLLABICS WEST-CREE TWOO
+1461;N # CANADIAN SYLLABICS TWA
+1462;N # CANADIAN SYLLABICS WEST-CREE TWA
+1463;N # CANADIAN SYLLABICS TWAA
+1464;N # CANADIAN SYLLABICS WEST-CREE TWAA
+1465;N # CANADIAN SYLLABICS NASKAPI TWAA
+1466;N # CANADIAN SYLLABICS T
+1467;N # CANADIAN SYLLABICS TTE
+1468;N # CANADIAN SYLLABICS TTI
+1469;N # CANADIAN SYLLABICS TTO
+146A;N # CANADIAN SYLLABICS TTA
+146B;N # CANADIAN SYLLABICS KE
+146C;N # CANADIAN SYLLABICS KAAI
+146D;N # CANADIAN SYLLABICS KI
+146E;N # CANADIAN SYLLABICS KII
+146F;N # CANADIAN SYLLABICS KO
+1470;N # CANADIAN SYLLABICS KOO
+1471;N # CANADIAN SYLLABICS Y-CREE KOO
+1472;N # CANADIAN SYLLABICS KA
+1473;N # CANADIAN SYLLABICS KAA
+1474;N # CANADIAN SYLLABICS KWE
+1475;N # CANADIAN SYLLABICS WEST-CREE KWE
+1476;N # CANADIAN SYLLABICS KWI
+1477;N # CANADIAN SYLLABICS WEST-CREE KWI
+1478;N # CANADIAN SYLLABICS KWII
+1479;N # CANADIAN SYLLABICS WEST-CREE KWII
+147A;N # CANADIAN SYLLABICS KWO
+147B;N # CANADIAN SYLLABICS WEST-CREE KWO
+147C;N # CANADIAN SYLLABICS KWOO
+147D;N # CANADIAN SYLLABICS WEST-CREE KWOO
+147E;N # CANADIAN SYLLABICS KWA
+147F;N # CANADIAN SYLLABICS WEST-CREE KWA
+1480;N # CANADIAN SYLLABICS KWAA
+1481;N # CANADIAN SYLLABICS WEST-CREE KWAA
+1482;N # CANADIAN SYLLABICS NASKAPI KWAA
+1483;N # CANADIAN SYLLABICS K
+1484;N # CANADIAN SYLLABICS KW
+1485;N # CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486;N # CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487;N # CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488;N # CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489;N # CANADIAN SYLLABICS CE
+148A;N # CANADIAN SYLLABICS CAAI
+148B;N # CANADIAN SYLLABICS CI
+148C;N # CANADIAN SYLLABICS CII
+148D;N # CANADIAN SYLLABICS CO
+148E;N # CANADIAN SYLLABICS COO
+148F;N # CANADIAN SYLLABICS Y-CREE COO
+1490;N # CANADIAN SYLLABICS CA
+1491;N # CANADIAN SYLLABICS CAA
+1492;N # CANADIAN SYLLABICS CWE
+1493;N # CANADIAN SYLLABICS WEST-CREE CWE
+1494;N # CANADIAN SYLLABICS CWI
+1495;N # CANADIAN SYLLABICS WEST-CREE CWI
+1496;N # CANADIAN SYLLABICS CWII
+1497;N # CANADIAN SYLLABICS WEST-CREE CWII
+1498;N # CANADIAN SYLLABICS CWO
+1499;N # CANADIAN SYLLABICS WEST-CREE CWO
+149A;N # CANADIAN SYLLABICS CWOO
+149B;N # CANADIAN SYLLABICS WEST-CREE CWOO
+149C;N # CANADIAN SYLLABICS CWA
+149D;N # CANADIAN SYLLABICS WEST-CREE CWA
+149E;N # CANADIAN SYLLABICS CWAA
+149F;N # CANADIAN SYLLABICS WEST-CREE CWAA
+14A0;N # CANADIAN SYLLABICS NASKAPI CWAA
+14A1;N # CANADIAN SYLLABICS C
+14A2;N # CANADIAN SYLLABICS SAYISI TH
+14A3;N # CANADIAN SYLLABICS ME
+14A4;N # CANADIAN SYLLABICS MAAI
+14A5;N # CANADIAN SYLLABICS MI
+14A6;N # CANADIAN SYLLABICS MII
+14A7;N # CANADIAN SYLLABICS MO
+14A8;N # CANADIAN SYLLABICS MOO
+14A9;N # CANADIAN SYLLABICS Y-CREE MOO
+14AA;N # CANADIAN SYLLABICS MA
+14AB;N # CANADIAN SYLLABICS MAA
+14AC;N # CANADIAN SYLLABICS MWE
+14AD;N # CANADIAN SYLLABICS WEST-CREE MWE
+14AE;N # CANADIAN SYLLABICS MWI
+14AF;N # CANADIAN SYLLABICS WEST-CREE MWI
+14B0;N # CANADIAN SYLLABICS MWII
+14B1;N # CANADIAN SYLLABICS WEST-CREE MWII
+14B2;N # CANADIAN SYLLABICS MWO
+14B3;N # CANADIAN SYLLABICS WEST-CREE MWO
+14B4;N # CANADIAN SYLLABICS MWOO
+14B5;N # CANADIAN SYLLABICS WEST-CREE MWOO
+14B6;N # CANADIAN SYLLABICS MWA
+14B7;N # CANADIAN SYLLABICS WEST-CREE MWA
+14B8;N # CANADIAN SYLLABICS MWAA
+14B9;N # CANADIAN SYLLABICS WEST-CREE MWAA
+14BA;N # CANADIAN SYLLABICS NASKAPI MWAA
+14BB;N # CANADIAN SYLLABICS M
+14BC;N # CANADIAN SYLLABICS WEST-CREE M
+14BD;N # CANADIAN SYLLABICS MH
+14BE;N # CANADIAN SYLLABICS ATHAPASCAN M
+14BF;N # CANADIAN SYLLABICS SAYISI M
+14C0;N # CANADIAN SYLLABICS NE
+14C1;N # CANADIAN SYLLABICS NAAI
+14C2;N # CANADIAN SYLLABICS NI
+14C3;N # CANADIAN SYLLABICS NII
+14C4;N # CANADIAN SYLLABICS NO
+14C5;N # CANADIAN SYLLABICS NOO
+14C6;N # CANADIAN SYLLABICS Y-CREE NOO
+14C7;N # CANADIAN SYLLABICS NA
+14C8;N # CANADIAN SYLLABICS NAA
+14C9;N # CANADIAN SYLLABICS NWE
+14CA;N # CANADIAN SYLLABICS WEST-CREE NWE
+14CB;N # CANADIAN SYLLABICS NWA
+14CC;N # CANADIAN SYLLABICS WEST-CREE NWA
+14CD;N # CANADIAN SYLLABICS NWAA
+14CE;N # CANADIAN SYLLABICS WEST-CREE NWAA
+14CF;N # CANADIAN SYLLABICS NASKAPI NWAA
+14D0;N # CANADIAN SYLLABICS N
+14D1;N # CANADIAN SYLLABICS CARRIER NG
+14D2;N # CANADIAN SYLLABICS NH
+14D3;N # CANADIAN SYLLABICS LE
+14D4;N # CANADIAN SYLLABICS LAAI
+14D5;N # CANADIAN SYLLABICS LI
+14D6;N # CANADIAN SYLLABICS LII
+14D7;N # CANADIAN SYLLABICS LO
+14D8;N # CANADIAN SYLLABICS LOO
+14D9;N # CANADIAN SYLLABICS Y-CREE LOO
+14DA;N # CANADIAN SYLLABICS LA
+14DB;N # CANADIAN SYLLABICS LAA
+14DC;N # CANADIAN SYLLABICS LWE
+14DD;N # CANADIAN SYLLABICS WEST-CREE LWE
+14DE;N # CANADIAN SYLLABICS LWI
+14DF;N # CANADIAN SYLLABICS WEST-CREE LWI
+14E0;N # CANADIAN SYLLABICS LWII
+14E1;N # CANADIAN SYLLABICS WEST-CREE LWII
+14E2;N # CANADIAN SYLLABICS LWO
+14E3;N # CANADIAN SYLLABICS WEST-CREE LWO
+14E4;N # CANADIAN SYLLABICS LWOO
+14E5;N # CANADIAN SYLLABICS WEST-CREE LWOO
+14E6;N # CANADIAN SYLLABICS LWA
+14E7;N # CANADIAN SYLLABICS WEST-CREE LWA
+14E8;N # CANADIAN SYLLABICS LWAA
+14E9;N # CANADIAN SYLLABICS WEST-CREE LWAA
+14EA;N # CANADIAN SYLLABICS L
+14EB;N # CANADIAN SYLLABICS WEST-CREE L
+14EC;N # CANADIAN SYLLABICS MEDIAL L
+14ED;N # CANADIAN SYLLABICS SE
+14EE;N # CANADIAN SYLLABICS SAAI
+14EF;N # CANADIAN SYLLABICS SI
+14F0;N # CANADIAN SYLLABICS SII
+14F1;N # CANADIAN SYLLABICS SO
+14F2;N # CANADIAN SYLLABICS SOO
+14F3;N # CANADIAN SYLLABICS Y-CREE SOO
+14F4;N # CANADIAN SYLLABICS SA
+14F5;N # CANADIAN SYLLABICS SAA
+14F6;N # CANADIAN SYLLABICS SWE
+14F7;N # CANADIAN SYLLABICS WEST-CREE SWE
+14F8;N # CANADIAN SYLLABICS SWI
+14F9;N # CANADIAN SYLLABICS WEST-CREE SWI
+14FA;N # CANADIAN SYLLABICS SWII
+14FB;N # CANADIAN SYLLABICS WEST-CREE SWII
+14FC;N # CANADIAN SYLLABICS SWO
+14FD;N # CANADIAN SYLLABICS WEST-CREE SWO
+14FE;N # CANADIAN SYLLABICS SWOO
+14FF;N # CANADIAN SYLLABICS WEST-CREE SWOO
+1500;N # CANADIAN SYLLABICS SWA
+1501;N # CANADIAN SYLLABICS WEST-CREE SWA
+1502;N # CANADIAN SYLLABICS SWAA
+1503;N # CANADIAN SYLLABICS WEST-CREE SWAA
+1504;N # CANADIAN SYLLABICS NASKAPI SWAA
+1505;N # CANADIAN SYLLABICS S
+1506;N # CANADIAN SYLLABICS ATHAPASCAN S
+1507;N # CANADIAN SYLLABICS SW
+1508;N # CANADIAN SYLLABICS BLACKFOOT S
+1509;N # CANADIAN SYLLABICS MOOSE-CREE SK
+150A;N # CANADIAN SYLLABICS NASKAPI SKW
+150B;N # CANADIAN SYLLABICS NASKAPI S-W
+150C;N # CANADIAN SYLLABICS NASKAPI SPWA
+150D;N # CANADIAN SYLLABICS NASKAPI STWA
+150E;N # CANADIAN SYLLABICS NASKAPI SKWA
+150F;N # CANADIAN SYLLABICS NASKAPI SCWA
+1510;N # CANADIAN SYLLABICS SHE
+1511;N # CANADIAN SYLLABICS SHI
+1512;N # CANADIAN SYLLABICS SHII
+1513;N # CANADIAN SYLLABICS SHO
+1514;N # CANADIAN SYLLABICS SHOO
+1515;N # CANADIAN SYLLABICS SHA
+1516;N # CANADIAN SYLLABICS SHAA
+1517;N # CANADIAN SYLLABICS SHWE
+1518;N # CANADIAN SYLLABICS WEST-CREE SHWE
+1519;N # CANADIAN SYLLABICS SHWI
+151A;N # CANADIAN SYLLABICS WEST-CREE SHWI
+151B;N # CANADIAN SYLLABICS SHWII
+151C;N # CANADIAN SYLLABICS WEST-CREE SHWII
+151D;N # CANADIAN SYLLABICS SHWO
+151E;N # CANADIAN SYLLABICS WEST-CREE SHWO
+151F;N # CANADIAN SYLLABICS SHWOO
+1520;N # CANADIAN SYLLABICS WEST-CREE SHWOO
+1521;N # CANADIAN SYLLABICS SHWA
+1522;N # CANADIAN SYLLABICS WEST-CREE SHWA
+1523;N # CANADIAN SYLLABICS SHWAA
+1524;N # CANADIAN SYLLABICS WEST-CREE SHWAA
+1525;N # CANADIAN SYLLABICS SH
+1526;N # CANADIAN SYLLABICS YE
+1527;N # CANADIAN SYLLABICS YAAI
+1528;N # CANADIAN SYLLABICS YI
+1529;N # CANADIAN SYLLABICS YII
+152A;N # CANADIAN SYLLABICS YO
+152B;N # CANADIAN SYLLABICS YOO
+152C;N # CANADIAN SYLLABICS Y-CREE YOO
+152D;N # CANADIAN SYLLABICS YA
+152E;N # CANADIAN SYLLABICS YAA
+152F;N # CANADIAN SYLLABICS YWE
+1530;N # CANADIAN SYLLABICS WEST-CREE YWE
+1531;N # CANADIAN SYLLABICS YWI
+1532;N # CANADIAN SYLLABICS WEST-CREE YWI
+1533;N # CANADIAN SYLLABICS YWII
+1534;N # CANADIAN SYLLABICS WEST-CREE YWII
+1535;N # CANADIAN SYLLABICS YWO
+1536;N # CANADIAN SYLLABICS WEST-CREE YWO
+1537;N # CANADIAN SYLLABICS YWOO
+1538;N # CANADIAN SYLLABICS WEST-CREE YWOO
+1539;N # CANADIAN SYLLABICS YWA
+153A;N # CANADIAN SYLLABICS WEST-CREE YWA
+153B;N # CANADIAN SYLLABICS YWAA
+153C;N # CANADIAN SYLLABICS WEST-CREE YWAA
+153D;N # CANADIAN SYLLABICS NASKAPI YWAA
+153E;N # CANADIAN SYLLABICS Y
+153F;N # CANADIAN SYLLABICS BIBLE-CREE Y
+1540;N # CANADIAN SYLLABICS WEST-CREE Y
+1541;N # CANADIAN SYLLABICS SAYISI YI
+1542;N # CANADIAN SYLLABICS RE
+1543;N # CANADIAN SYLLABICS R-CREE RE
+1544;N # CANADIAN SYLLABICS WEST-CREE LE
+1545;N # CANADIAN SYLLABICS RAAI
+1546;N # CANADIAN SYLLABICS RI
+1547;N # CANADIAN SYLLABICS RII
+1548;N # CANADIAN SYLLABICS RO
+1549;N # CANADIAN SYLLABICS ROO
+154A;N # CANADIAN SYLLABICS WEST-CREE LO
+154B;N # CANADIAN SYLLABICS RA
+154C;N # CANADIAN SYLLABICS RAA
+154D;N # CANADIAN SYLLABICS WEST-CREE LA
+154E;N # CANADIAN SYLLABICS RWAA
+154F;N # CANADIAN SYLLABICS WEST-CREE RWAA
+1550;N # CANADIAN SYLLABICS R
+1551;N # CANADIAN SYLLABICS WEST-CREE R
+1552;N # CANADIAN SYLLABICS MEDIAL R
+1553;N # CANADIAN SYLLABICS FE
+1554;N # CANADIAN SYLLABICS FAAI
+1555;N # CANADIAN SYLLABICS FI
+1556;N # CANADIAN SYLLABICS FII
+1557;N # CANADIAN SYLLABICS FO
+1558;N # CANADIAN SYLLABICS FOO
+1559;N # CANADIAN SYLLABICS FA
+155A;N # CANADIAN SYLLABICS FAA
+155B;N # CANADIAN SYLLABICS FWAA
+155C;N # CANADIAN SYLLABICS WEST-CREE FWAA
+155D;N # CANADIAN SYLLABICS F
+155E;N # CANADIAN SYLLABICS THE
+155F;N # CANADIAN SYLLABICS N-CREE THE
+1560;N # CANADIAN SYLLABICS THI
+1561;N # CANADIAN SYLLABICS N-CREE THI
+1562;N # CANADIAN SYLLABICS THII
+1563;N # CANADIAN SYLLABICS N-CREE THII
+1564;N # CANADIAN SYLLABICS THO
+1565;N # CANADIAN SYLLABICS THOO
+1566;N # CANADIAN SYLLABICS THA
+1567;N # CANADIAN SYLLABICS THAA
+1568;N # CANADIAN SYLLABICS THWAA
+1569;N # CANADIAN SYLLABICS WEST-CREE THWAA
+156A;N # CANADIAN SYLLABICS TH
+156B;N # CANADIAN SYLLABICS TTHE
+156C;N # CANADIAN SYLLABICS TTHI
+156D;N # CANADIAN SYLLABICS TTHO
+156E;N # CANADIAN SYLLABICS TTHA
+156F;N # CANADIAN SYLLABICS TTH
+1570;N # CANADIAN SYLLABICS TYE
+1571;N # CANADIAN SYLLABICS TYI
+1572;N # CANADIAN SYLLABICS TYO
+1573;N # CANADIAN SYLLABICS TYA
+1574;N # CANADIAN SYLLABICS NUNAVIK HE
+1575;N # CANADIAN SYLLABICS NUNAVIK HI
+1576;N # CANADIAN SYLLABICS NUNAVIK HII
+1577;N # CANADIAN SYLLABICS NUNAVIK HO
+1578;N # CANADIAN SYLLABICS NUNAVIK HOO
+1579;N # CANADIAN SYLLABICS NUNAVIK HA
+157A;N # CANADIAN SYLLABICS NUNAVIK HAA
+157B;N # CANADIAN SYLLABICS NUNAVIK H
+157C;N # CANADIAN SYLLABICS NUNAVUT H
+157D;N # CANADIAN SYLLABICS HK
+157E;N # CANADIAN SYLLABICS QAAI
+157F;N # CANADIAN SYLLABICS QI
+1580;N # CANADIAN SYLLABICS QII
+1581;N # CANADIAN SYLLABICS QO
+1582;N # CANADIAN SYLLABICS QOO
+1583;N # CANADIAN SYLLABICS QA
+1584;N # CANADIAN SYLLABICS QAA
+1585;N # CANADIAN SYLLABICS Q
+1586;N # CANADIAN SYLLABICS TLHE
+1587;N # CANADIAN SYLLABICS TLHI
+1588;N # CANADIAN SYLLABICS TLHO
+1589;N # CANADIAN SYLLABICS TLHA
+158A;N # CANADIAN SYLLABICS WEST-CREE RE
+158B;N # CANADIAN SYLLABICS WEST-CREE RI
+158C;N # CANADIAN SYLLABICS WEST-CREE RO
+158D;N # CANADIAN SYLLABICS WEST-CREE RA
+158E;N # CANADIAN SYLLABICS NGAAI
+158F;N # CANADIAN SYLLABICS NGI
+1590;N # CANADIAN SYLLABICS NGII
+1591;N # CANADIAN SYLLABICS NGO
+1592;N # CANADIAN SYLLABICS NGOO
+1593;N # CANADIAN SYLLABICS NGA
+1594;N # CANADIAN SYLLABICS NGAA
+1595;N # CANADIAN SYLLABICS NG
+1596;N # CANADIAN SYLLABICS NNG
+1597;N # CANADIAN SYLLABICS SAYISI SHE
+1598;N # CANADIAN SYLLABICS SAYISI SHI
+1599;N # CANADIAN SYLLABICS SAYISI SHO
+159A;N # CANADIAN SYLLABICS SAYISI SHA
+159B;N # CANADIAN SYLLABICS WOODS-CREE THE
+159C;N # CANADIAN SYLLABICS WOODS-CREE THI
+159D;N # CANADIAN SYLLABICS WOODS-CREE THO
+159E;N # CANADIAN SYLLABICS WOODS-CREE THA
+159F;N # CANADIAN SYLLABICS WOODS-CREE TH
+15A0;N # CANADIAN SYLLABICS LHI
+15A1;N # CANADIAN SYLLABICS LHII
+15A2;N # CANADIAN SYLLABICS LHO
+15A3;N # CANADIAN SYLLABICS LHOO
+15A4;N # CANADIAN SYLLABICS LHA
+15A5;N # CANADIAN SYLLABICS LHAA
+15A6;N # CANADIAN SYLLABICS LH
+15A7;N # CANADIAN SYLLABICS TH-CREE THE
+15A8;N # CANADIAN SYLLABICS TH-CREE THI
+15A9;N # CANADIAN SYLLABICS TH-CREE THII
+15AA;N # CANADIAN SYLLABICS TH-CREE THO
+15AB;N # CANADIAN SYLLABICS TH-CREE THOO
+15AC;N # CANADIAN SYLLABICS TH-CREE THA
+15AD;N # CANADIAN SYLLABICS TH-CREE THAA
+15AE;N # CANADIAN SYLLABICS TH-CREE TH
+15AF;N # CANADIAN SYLLABICS AIVILIK B
+15B0;N # CANADIAN SYLLABICS BLACKFOOT E
+15B1;N # CANADIAN SYLLABICS BLACKFOOT I
+15B2;N # CANADIAN SYLLABICS BLACKFOOT O
+15B3;N # CANADIAN SYLLABICS BLACKFOOT A
+15B4;N # CANADIAN SYLLABICS BLACKFOOT WE
+15B5;N # CANADIAN SYLLABICS BLACKFOOT WI
+15B6;N # CANADIAN SYLLABICS BLACKFOOT WO
+15B7;N # CANADIAN SYLLABICS BLACKFOOT WA
+15B8;N # CANADIAN SYLLABICS BLACKFOOT NE
+15B9;N # CANADIAN SYLLABICS BLACKFOOT NI
+15BA;N # CANADIAN SYLLABICS BLACKFOOT NO
+15BB;N # CANADIAN SYLLABICS BLACKFOOT NA
+15BC;N # CANADIAN SYLLABICS BLACKFOOT KE
+15BD;N # CANADIAN SYLLABICS BLACKFOOT KI
+15BE;N # CANADIAN SYLLABICS BLACKFOOT KO
+15BF;N # CANADIAN SYLLABICS BLACKFOOT KA
+15C0;N # CANADIAN SYLLABICS SAYISI HE
+15C1;N # CANADIAN SYLLABICS SAYISI HI
+15C2;N # CANADIAN SYLLABICS SAYISI HO
+15C3;N # CANADIAN SYLLABICS SAYISI HA
+15C4;N # CANADIAN SYLLABICS CARRIER GHU
+15C5;N # CANADIAN SYLLABICS CARRIER GHO
+15C6;N # CANADIAN SYLLABICS CARRIER GHE
+15C7;N # CANADIAN SYLLABICS CARRIER GHEE
+15C8;N # CANADIAN SYLLABICS CARRIER GHI
+15C9;N # CANADIAN SYLLABICS CARRIER GHA
+15CA;N # CANADIAN SYLLABICS CARRIER RU
+15CB;N # CANADIAN SYLLABICS CARRIER RO
+15CC;N # CANADIAN SYLLABICS CARRIER RE
+15CD;N # CANADIAN SYLLABICS CARRIER REE
+15CE;N # CANADIAN SYLLABICS CARRIER RI
+15CF;N # CANADIAN SYLLABICS CARRIER RA
+15D0;N # CANADIAN SYLLABICS CARRIER WU
+15D1;N # CANADIAN SYLLABICS CARRIER WO
+15D2;N # CANADIAN SYLLABICS CARRIER WE
+15D3;N # CANADIAN SYLLABICS CARRIER WEE
+15D4;N # CANADIAN SYLLABICS CARRIER WI
+15D5;N # CANADIAN SYLLABICS CARRIER WA
+15D6;N # CANADIAN SYLLABICS CARRIER HWU
+15D7;N # CANADIAN SYLLABICS CARRIER HWO
+15D8;N # CANADIAN SYLLABICS CARRIER HWE
+15D9;N # CANADIAN SYLLABICS CARRIER HWEE
+15DA;N # CANADIAN SYLLABICS CARRIER HWI
+15DB;N # CANADIAN SYLLABICS CARRIER HWA
+15DC;N # CANADIAN SYLLABICS CARRIER THU
+15DD;N # CANADIAN SYLLABICS CARRIER THO
+15DE;N # CANADIAN SYLLABICS CARRIER THE
+15DF;N # CANADIAN SYLLABICS CARRIER THEE
+15E0;N # CANADIAN SYLLABICS CARRIER THI
+15E1;N # CANADIAN SYLLABICS CARRIER THA
+15E2;N # CANADIAN SYLLABICS CARRIER TTU
+15E3;N # CANADIAN SYLLABICS CARRIER TTO
+15E4;N # CANADIAN SYLLABICS CARRIER TTE
+15E5;N # CANADIAN SYLLABICS CARRIER TTEE
+15E6;N # CANADIAN SYLLABICS CARRIER TTI
+15E7;N # CANADIAN SYLLABICS CARRIER TTA
+15E8;N # CANADIAN SYLLABICS CARRIER PU
+15E9;N # CANADIAN SYLLABICS CARRIER PO
+15EA;N # CANADIAN SYLLABICS CARRIER PE
+15EB;N # CANADIAN SYLLABICS CARRIER PEE
+15EC;N # CANADIAN SYLLABICS CARRIER PI
+15ED;N # CANADIAN SYLLABICS CARRIER PA
+15EE;N # CANADIAN SYLLABICS CARRIER P
+15EF;N # CANADIAN SYLLABICS CARRIER GU
+15F0;N # CANADIAN SYLLABICS CARRIER GO
+15F1;N # CANADIAN SYLLABICS CARRIER GE
+15F2;N # CANADIAN SYLLABICS CARRIER GEE
+15F3;N # CANADIAN SYLLABICS CARRIER GI
+15F4;N # CANADIAN SYLLABICS CARRIER GA
+15F5;N # CANADIAN SYLLABICS CARRIER KHU
+15F6;N # CANADIAN SYLLABICS CARRIER KHO
+15F7;N # CANADIAN SYLLABICS CARRIER KHE
+15F8;N # CANADIAN SYLLABICS CARRIER KHEE
+15F9;N # CANADIAN SYLLABICS CARRIER KHI
+15FA;N # CANADIAN SYLLABICS CARRIER KHA
+15FB;N # CANADIAN SYLLABICS CARRIER KKU
+15FC;N # CANADIAN SYLLABICS CARRIER KKO
+15FD;N # CANADIAN SYLLABICS CARRIER KKE
+15FE;N # CANADIAN SYLLABICS CARRIER KKEE
+15FF;N # CANADIAN SYLLABICS CARRIER KKI
+1600;N # CANADIAN SYLLABICS CARRIER KKA
+1601;N # CANADIAN SYLLABICS CARRIER KK
+1602;N # CANADIAN SYLLABICS CARRIER NU
+1603;N # CANADIAN SYLLABICS CARRIER NO
+1604;N # CANADIAN SYLLABICS CARRIER NE
+1605;N # CANADIAN SYLLABICS CARRIER NEE
+1606;N # CANADIAN SYLLABICS CARRIER NI
+1607;N # CANADIAN SYLLABICS CARRIER NA
+1608;N # CANADIAN SYLLABICS CARRIER MU
+1609;N # CANADIAN SYLLABICS CARRIER MO
+160A;N # CANADIAN SYLLABICS CARRIER ME
+160B;N # CANADIAN SYLLABICS CARRIER MEE
+160C;N # CANADIAN SYLLABICS CARRIER MI
+160D;N # CANADIAN SYLLABICS CARRIER MA
+160E;N # CANADIAN SYLLABICS CARRIER YU
+160F;N # CANADIAN SYLLABICS CARRIER YO
+1610;N # CANADIAN SYLLABICS CARRIER YE
+1611;N # CANADIAN SYLLABICS CARRIER YEE
+1612;N # CANADIAN SYLLABICS CARRIER YI
+1613;N # CANADIAN SYLLABICS CARRIER YA
+1614;N # CANADIAN SYLLABICS CARRIER JU
+1615;N # CANADIAN SYLLABICS SAYISI JU
+1616;N # CANADIAN SYLLABICS CARRIER JO
+1617;N # CANADIAN SYLLABICS CARRIER JE
+1618;N # CANADIAN SYLLABICS CARRIER JEE
+1619;N # CANADIAN SYLLABICS CARRIER JI
+161A;N # CANADIAN SYLLABICS SAYISI JI
+161B;N # CANADIAN SYLLABICS CARRIER JA
+161C;N # CANADIAN SYLLABICS CARRIER JJU
+161D;N # CANADIAN SYLLABICS CARRIER JJO
+161E;N # CANADIAN SYLLABICS CARRIER JJE
+161F;N # CANADIAN SYLLABICS CARRIER JJEE
+1620;N # CANADIAN SYLLABICS CARRIER JJI
+1621;N # CANADIAN SYLLABICS CARRIER JJA
+1622;N # CANADIAN SYLLABICS CARRIER LU
+1623;N # CANADIAN SYLLABICS CARRIER LO
+1624;N # CANADIAN SYLLABICS CARRIER LE
+1625;N # CANADIAN SYLLABICS CARRIER LEE
+1626;N # CANADIAN SYLLABICS CARRIER LI
+1627;N # CANADIAN SYLLABICS CARRIER LA
+1628;N # CANADIAN SYLLABICS CARRIER DLU
+1629;N # CANADIAN SYLLABICS CARRIER DLO
+162A;N # CANADIAN SYLLABICS CARRIER DLE
+162B;N # CANADIAN SYLLABICS CARRIER DLEE
+162C;N # CANADIAN SYLLABICS CARRIER DLI
+162D;N # CANADIAN SYLLABICS CARRIER DLA
+162E;N # CANADIAN SYLLABICS CARRIER LHU
+162F;N # CANADIAN SYLLABICS CARRIER LHO
+1630;N # CANADIAN SYLLABICS CARRIER LHE
+1631;N # CANADIAN SYLLABICS CARRIER LHEE
+1632;N # CANADIAN SYLLABICS CARRIER LHI
+1633;N # CANADIAN SYLLABICS CARRIER LHA
+1634;N # CANADIAN SYLLABICS CARRIER TLHU
+1635;N # CANADIAN SYLLABICS CARRIER TLHO
+1636;N # CANADIAN SYLLABICS CARRIER TLHE
+1637;N # CANADIAN SYLLABICS CARRIER TLHEE
+1638;N # CANADIAN SYLLABICS CARRIER TLHI
+1639;N # CANADIAN SYLLABICS CARRIER TLHA
+163A;N # CANADIAN SYLLABICS CARRIER TLU
+163B;N # CANADIAN SYLLABICS CARRIER TLO
+163C;N # CANADIAN SYLLABICS CARRIER TLE
+163D;N # CANADIAN SYLLABICS CARRIER TLEE
+163E;N # CANADIAN SYLLABICS CARRIER TLI
+163F;N # CANADIAN SYLLABICS CARRIER TLA
+1640;N # CANADIAN SYLLABICS CARRIER ZU
+1641;N # CANADIAN SYLLABICS CARRIER ZO
+1642;N # CANADIAN SYLLABICS CARRIER ZE
+1643;N # CANADIAN SYLLABICS CARRIER ZEE
+1644;N # CANADIAN SYLLABICS CARRIER ZI
+1645;N # CANADIAN SYLLABICS CARRIER ZA
+1646;N # CANADIAN SYLLABICS CARRIER Z
+1647;N # CANADIAN SYLLABICS CARRIER INITIAL Z
+1648;N # CANADIAN SYLLABICS CARRIER DZU
+1649;N # CANADIAN SYLLABICS CARRIER DZO
+164A;N # CANADIAN SYLLABICS CARRIER DZE
+164B;N # CANADIAN SYLLABICS CARRIER DZEE
+164C;N # CANADIAN SYLLABICS CARRIER DZI
+164D;N # CANADIAN SYLLABICS CARRIER DZA
+164E;N # CANADIAN SYLLABICS CARRIER SU
+164F;N # CANADIAN SYLLABICS CARRIER SO
+1650;N # CANADIAN SYLLABICS CARRIER SE
+1651;N # CANADIAN SYLLABICS CARRIER SEE
+1652;N # CANADIAN SYLLABICS CARRIER SI
+1653;N # CANADIAN SYLLABICS CARRIER SA
+1654;N # CANADIAN SYLLABICS CARRIER SHU
+1655;N # CANADIAN SYLLABICS CARRIER SHO
+1656;N # CANADIAN SYLLABICS CARRIER SHE
+1657;N # CANADIAN SYLLABICS CARRIER SHEE
+1658;N # CANADIAN SYLLABICS CARRIER SHI
+1659;N # CANADIAN SYLLABICS CARRIER SHA
+165A;N # CANADIAN SYLLABICS CARRIER SH
+165B;N # CANADIAN SYLLABICS CARRIER TSU
+165C;N # CANADIAN SYLLABICS CARRIER TSO
+165D;N # CANADIAN SYLLABICS CARRIER TSE
+165E;N # CANADIAN SYLLABICS CARRIER TSEE
+165F;N # CANADIAN SYLLABICS CARRIER TSI
+1660;N # CANADIAN SYLLABICS CARRIER TSA
+1661;N # CANADIAN SYLLABICS CARRIER CHU
+1662;N # CANADIAN SYLLABICS CARRIER CHO
+1663;N # CANADIAN SYLLABICS CARRIER CHE
+1664;N # CANADIAN SYLLABICS CARRIER CHEE
+1665;N # CANADIAN SYLLABICS CARRIER CHI
+1666;N # CANADIAN SYLLABICS CARRIER CHA
+1667;N # CANADIAN SYLLABICS CARRIER TTSU
+1668;N # CANADIAN SYLLABICS CARRIER TTSO
+1669;N # CANADIAN SYLLABICS CARRIER TTSE
+166A;N # CANADIAN SYLLABICS CARRIER TTSEE
+166B;N # CANADIAN SYLLABICS CARRIER TTSI
+166C;N # CANADIAN SYLLABICS CARRIER TTSA
+166D;N # CANADIAN SYLLABICS CHI SIGN
+166E;N # CANADIAN SYLLABICS FULL STOP
+166F;N # CANADIAN SYLLABICS QAI
+1670;N # CANADIAN SYLLABICS NGAI
+1671;N # CANADIAN SYLLABICS NNGI
+1672;N # CANADIAN SYLLABICS NNGII
+1673;N # CANADIAN SYLLABICS NNGO
+1674;N # CANADIAN SYLLABICS NNGOO
+1675;N # CANADIAN SYLLABICS NNGA
+1676;N # CANADIAN SYLLABICS NNGAA
+1680;N # OGHAM SPACE MARK
+1681;N # OGHAM LETTER BEITH
+1682;N # OGHAM LETTER LUIS
+1683;N # OGHAM LETTER FEARN
+1684;N # OGHAM LETTER SAIL
+1685;N # OGHAM LETTER NION
+1686;N # OGHAM LETTER UATH
+1687;N # OGHAM LETTER DAIR
+1688;N # OGHAM LETTER TINNE
+1689;N # OGHAM LETTER COLL
+168A;N # OGHAM LETTER CEIRT
+168B;N # OGHAM LETTER MUIN
+168C;N # OGHAM LETTER GORT
+168D;N # OGHAM LETTER NGEADAL
+168E;N # OGHAM LETTER STRAIF
+168F;N # OGHAM LETTER RUIS
+1690;N # OGHAM LETTER AILM
+1691;N # OGHAM LETTER ONN
+1692;N # OGHAM LETTER UR
+1693;N # OGHAM LETTER EADHADH
+1694;N # OGHAM LETTER IODHADH
+1695;N # OGHAM LETTER EABHADH
+1696;N # OGHAM LETTER OR
+1697;N # OGHAM LETTER UILLEANN
+1698;N # OGHAM LETTER IFIN
+1699;N # OGHAM LETTER EAMHANCHOLL
+169A;N # OGHAM LETTER PEITH
+169B;N # OGHAM FEATHER MARK
+169C;N # OGHAM REVERSED FEATHER MARK
+16A0;N # RUNIC LETTER FEHU FEOH FE F
+16A1;N # RUNIC LETTER V
+16A2;N # RUNIC LETTER URUZ UR U
+16A3;N # RUNIC LETTER YR
+16A4;N # RUNIC LETTER Y
+16A5;N # RUNIC LETTER W
+16A6;N # RUNIC LETTER THURISAZ THURS THORN
+16A7;N # RUNIC LETTER ETH
+16A8;N # RUNIC LETTER ANSUZ A
+16A9;N # RUNIC LETTER OS O
+16AA;N # RUNIC LETTER AC A
+16AB;N # RUNIC LETTER AESC
+16AC;N # RUNIC LETTER LONG-BRANCH-OSS O
+16AD;N # RUNIC LETTER SHORT-TWIG-OSS O
+16AE;N # RUNIC LETTER O
+16AF;N # RUNIC LETTER OE
+16B0;N # RUNIC LETTER ON
+16B1;N # RUNIC LETTER RAIDO RAD REID R
+16B2;N # RUNIC LETTER KAUNA
+16B3;N # RUNIC LETTER CEN
+16B4;N # RUNIC LETTER KAUN K
+16B5;N # RUNIC LETTER G
+16B6;N # RUNIC LETTER ENG
+16B7;N # RUNIC LETTER GEBO GYFU G
+16B8;N # RUNIC LETTER GAR
+16B9;N # RUNIC LETTER WUNJO WYNN W
+16BA;N # RUNIC LETTER HAGLAZ H
+16BB;N # RUNIC LETTER HAEGL H
+16BC;N # RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD;N # RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE;N # RUNIC LETTER NAUDIZ NYD NAUD N
+16BF;N # RUNIC LETTER SHORT-TWIG-NAUD N
+16C0;N # RUNIC LETTER DOTTED-N
+16C1;N # RUNIC LETTER ISAZ IS ISS I
+16C2;N # RUNIC LETTER E
+16C3;N # RUNIC LETTER JERAN J
+16C4;N # RUNIC LETTER GER
+16C5;N # RUNIC LETTER LONG-BRANCH-AR AE
+16C6;N # RUNIC LETTER SHORT-TWIG-AR A
+16C7;N # RUNIC LETTER IWAZ EOH
+16C8;N # RUNIC LETTER PERTHO PEORTH P
+16C9;N # RUNIC LETTER ALGIZ EOLHX
+16CA;N # RUNIC LETTER SOWILO S
+16CB;N # RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC;N # RUNIC LETTER SHORT-TWIG-SOL S
+16CD;N # RUNIC LETTER C
+16CE;N # RUNIC LETTER Z
+16CF;N # RUNIC LETTER TIWAZ TIR TYR T
+16D0;N # RUNIC LETTER SHORT-TWIG-TYR T
+16D1;N # RUNIC LETTER D
+16D2;N # RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3;N # RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4;N # RUNIC LETTER DOTTED-P
+16D5;N # RUNIC LETTER OPEN-P
+16D6;N # RUNIC LETTER EHWAZ EH E
+16D7;N # RUNIC LETTER MANNAZ MAN M
+16D8;N # RUNIC LETTER LONG-BRANCH-MADR M
+16D9;N # RUNIC LETTER SHORT-TWIG-MADR M
+16DA;N # RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB;N # RUNIC LETTER DOTTED-L
+16DC;N # RUNIC LETTER INGWAZ
+16DD;N # RUNIC LETTER ING
+16DE;N # RUNIC LETTER DAGAZ DAEG D
+16DF;N # RUNIC LETTER OTHALAN ETHEL O
+16E0;N # RUNIC LETTER EAR
+16E1;N # RUNIC LETTER IOR
+16E2;N # RUNIC LETTER CWEORTH
+16E3;N # RUNIC LETTER CALC
+16E4;N # RUNIC LETTER CEALC
+16E5;N # RUNIC LETTER STAN
+16E6;N # RUNIC LETTER LONG-BRANCH-YR
+16E7;N # RUNIC LETTER SHORT-TWIG-YR
+16E8;N # RUNIC LETTER ICELANDIC-YR
+16E9;N # RUNIC LETTER Q
+16EA;N # RUNIC LETTER X
+16EB;N # RUNIC SINGLE PUNCTUATION
+16EC;N # RUNIC MULTIPLE PUNCTUATION
+16ED;N # RUNIC CROSS PUNCTUATION
+16EE;N # RUNIC ARLAUG SYMBOL
+16EF;N # RUNIC TVIMADUR SYMBOL
+16F0;N # RUNIC BELGTHOR SYMBOL
+1700;N # TAGALOG LETTER A
+1701;N # TAGALOG LETTER I
+1702;N # TAGALOG LETTER U
+1703;N # TAGALOG LETTER KA
+1704;N # TAGALOG LETTER GA
+1705;N # TAGALOG LETTER NGA
+1706;N # TAGALOG LETTER TA
+1707;N # TAGALOG LETTER DA
+1708;N # TAGALOG LETTER NA
+1709;N # TAGALOG LETTER PA
+170A;N # TAGALOG LETTER BA
+170B;N # TAGALOG LETTER MA
+170C;N # TAGALOG LETTER YA
+170E;N # TAGALOG LETTER LA
+170F;N # TAGALOG LETTER WA
+1710;N # TAGALOG LETTER SA
+1711;N # TAGALOG LETTER HA
+1712;N # TAGALOG VOWEL SIGN I
+1713;N # TAGALOG VOWEL SIGN U
+1714;N # TAGALOG SIGN VIRAMA
+1720;N # HANUNOO LETTER A
+1721;N # HANUNOO LETTER I
+1722;N # HANUNOO LETTER U
+1723;N # HANUNOO LETTER KA
+1724;N # HANUNOO LETTER GA
+1725;N # HANUNOO LETTER NGA
+1726;N # HANUNOO LETTER TA
+1727;N # HANUNOO LETTER DA
+1728;N # HANUNOO LETTER NA
+1729;N # HANUNOO LETTER PA
+172A;N # HANUNOO LETTER BA
+172B;N # HANUNOO LETTER MA
+172C;N # HANUNOO LETTER YA
+172D;N # HANUNOO LETTER RA
+172E;N # HANUNOO LETTER LA
+172F;N # HANUNOO LETTER WA
+1730;N # HANUNOO LETTER SA
+1731;N # HANUNOO LETTER HA
+1732;N # HANUNOO VOWEL SIGN I
+1733;N # HANUNOO VOWEL SIGN U
+1734;N # HANUNOO SIGN PAMUDPOD
+1735;N # PHILIPPINE SINGLE PUNCTUATION
+1736;N # PHILIPPINE DOUBLE PUNCTUATION
+1740;N # BUHID LETTER A
+1741;N # BUHID LETTER I
+1742;N # BUHID LETTER U
+1743;N # BUHID LETTER KA
+1744;N # BUHID LETTER GA
+1745;N # BUHID LETTER NGA
+1746;N # BUHID LETTER TA
+1747;N # BUHID LETTER DA
+1748;N # BUHID LETTER NA
+1749;N # BUHID LETTER PA
+174A;N # BUHID LETTER BA
+174B;N # BUHID LETTER MA
+174C;N # BUHID LETTER YA
+174D;N # BUHID LETTER RA
+174E;N # BUHID LETTER LA
+174F;N # BUHID LETTER WA
+1750;N # BUHID LETTER SA
+1751;N # BUHID LETTER HA
+1752;N # BUHID VOWEL SIGN I
+1753;N # BUHID VOWEL SIGN U
+1760;N # TAGBANWA LETTER A
+1761;N # TAGBANWA LETTER I
+1762;N # TAGBANWA LETTER U
+1763;N # TAGBANWA LETTER KA
+1764;N # TAGBANWA LETTER GA
+1765;N # TAGBANWA LETTER NGA
+1766;N # TAGBANWA LETTER TA
+1767;N # TAGBANWA LETTER DA
+1768;N # TAGBANWA LETTER NA
+1769;N # TAGBANWA LETTER PA
+176A;N # TAGBANWA LETTER BA
+176B;N # TAGBANWA LETTER MA
+176C;N # TAGBANWA LETTER YA
+176E;N # TAGBANWA LETTER LA
+176F;N # TAGBANWA LETTER WA
+1770;N # TAGBANWA LETTER SA
+1772;N # TAGBANWA VOWEL SIGN I
+1773;N # TAGBANWA VOWEL SIGN U
+1780;N # KHMER LETTER KA
+1781;N # KHMER LETTER KHA
+1782;N # KHMER LETTER KO
+1783;N # KHMER LETTER KHO
+1784;N # KHMER LETTER NGO
+1785;N # KHMER LETTER CA
+1786;N # KHMER LETTER CHA
+1787;N # KHMER LETTER CO
+1788;N # KHMER LETTER CHO
+1789;N # KHMER LETTER NYO
+178A;N # KHMER LETTER DA
+178B;N # KHMER LETTER TTHA
+178C;N # KHMER LETTER DO
+178D;N # KHMER LETTER TTHO
+178E;N # KHMER LETTER NNO
+178F;N # KHMER LETTER TA
+1790;N # KHMER LETTER THA
+1791;N # KHMER LETTER TO
+1792;N # KHMER LETTER THO
+1793;N # KHMER LETTER NO
+1794;N # KHMER LETTER BA
+1795;N # KHMER LETTER PHA
+1796;N # KHMER LETTER PO
+1797;N # KHMER LETTER PHO
+1798;N # KHMER LETTER MO
+1799;N # KHMER LETTER YO
+179A;N # KHMER LETTER RO
+179B;N # KHMER LETTER LO
+179C;N # KHMER LETTER VO
+179D;N # KHMER LETTER SHA
+179E;N # KHMER LETTER SSO
+179F;N # KHMER LETTER SA
+17A0;N # KHMER LETTER HA
+17A1;N # KHMER LETTER LA
+17A2;N # KHMER LETTER QA
+17A3;N # KHMER INDEPENDENT VOWEL QAQ
+17A4;N # KHMER INDEPENDENT VOWEL QAA
+17A5;N # KHMER INDEPENDENT VOWEL QI
+17A6;N # KHMER INDEPENDENT VOWEL QII
+17A7;N # KHMER INDEPENDENT VOWEL QU
+17A8;N # KHMER INDEPENDENT VOWEL QUK
+17A9;N # KHMER INDEPENDENT VOWEL QUU
+17AA;N # KHMER INDEPENDENT VOWEL QUUV
+17AB;N # KHMER INDEPENDENT VOWEL RY
+17AC;N # KHMER INDEPENDENT VOWEL RYY
+17AD;N # KHMER INDEPENDENT VOWEL LY
+17AE;N # KHMER INDEPENDENT VOWEL LYY
+17AF;N # KHMER INDEPENDENT VOWEL QE
+17B0;N # KHMER INDEPENDENT VOWEL QAI
+17B1;N # KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2;N # KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3;N # KHMER INDEPENDENT VOWEL QAU
+17B4;N # KHMER VOWEL INHERENT AQ
+17B5;N # KHMER VOWEL INHERENT AA
+17B6;N # KHMER VOWEL SIGN AA
+17B7;N # KHMER VOWEL SIGN I
+17B8;N # KHMER VOWEL SIGN II
+17B9;N # KHMER VOWEL SIGN Y
+17BA;N # KHMER VOWEL SIGN YY
+17BB;N # KHMER VOWEL SIGN U
+17BC;N # KHMER VOWEL SIGN UU
+17BD;N # KHMER VOWEL SIGN UA
+17BE;N # KHMER VOWEL SIGN OE
+17BF;N # KHMER VOWEL SIGN YA
+17C0;N # KHMER VOWEL SIGN IE
+17C1;N # KHMER VOWEL SIGN E
+17C2;N # KHMER VOWEL SIGN AE
+17C3;N # KHMER VOWEL SIGN AI
+17C4;N # KHMER VOWEL SIGN OO
+17C5;N # KHMER VOWEL SIGN AU
+17C6;N # KHMER SIGN NIKAHIT
+17C7;N # KHMER SIGN REAHMUK
+17C8;N # KHMER SIGN YUUKALEAPINTU
+17C9;N # KHMER SIGN MUUSIKATOAN
+17CA;N # KHMER SIGN TRIISAP
+17CB;N # KHMER SIGN BANTOC
+17CC;N # KHMER SIGN ROBAT
+17CD;N # KHMER SIGN TOANDAKHIAT
+17CE;N # KHMER SIGN KAKABAT
+17CF;N # KHMER SIGN AHSDA
+17D0;N # KHMER SIGN SAMYOK SANNYA
+17D1;N # KHMER SIGN VIRIAM
+17D2;N # KHMER SIGN COENG
+17D3;N # KHMER SIGN BATHAMASAT
+17D4;N # KHMER SIGN KHAN
+17D5;N # KHMER SIGN BARIYOOSAN
+17D6;N # KHMER SIGN CAMNUC PII KUUH
+17D7;N # KHMER SIGN LEK TOO
+17D8;N # KHMER SIGN BEYYAL
+17D9;N # KHMER SIGN PHNAEK MUAN
+17DA;N # KHMER SIGN KOOMUUT
+17DB;N # KHMER CURRENCY SYMBOL RIEL
+17DC;N # KHMER SIGN AVAKRAHASANYA
+17DD;N # KHMER SIGN ATTHACAN
+17E0;N # KHMER DIGIT ZERO
+17E1;N # KHMER DIGIT ONE
+17E2;N # KHMER DIGIT TWO
+17E3;N # KHMER DIGIT THREE
+17E4;N # KHMER DIGIT FOUR
+17E5;N # KHMER DIGIT FIVE
+17E6;N # KHMER DIGIT SIX
+17E7;N # KHMER DIGIT SEVEN
+17E8;N # KHMER DIGIT EIGHT
+17E9;N # KHMER DIGIT NINE
+17F0;N # KHMER SYMBOL LEK ATTAK SON
+17F1;N # KHMER SYMBOL LEK ATTAK MUOY
+17F2;N # KHMER SYMBOL LEK ATTAK PII
+17F3;N # KHMER SYMBOL LEK ATTAK BEI
+17F4;N # KHMER SYMBOL LEK ATTAK BUON
+17F5;N # KHMER SYMBOL LEK ATTAK PRAM
+17F6;N # KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7;N # KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8;N # KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9;N # KHMER SYMBOL LEK ATTAK PRAM-BUON
+1800;N # MONGOLIAN BIRGA
+1801;N # MONGOLIAN ELLIPSIS
+1802;N # MONGOLIAN COMMA
+1803;N # MONGOLIAN FULL STOP
+1804;N # MONGOLIAN COLON
+1805;N # MONGOLIAN FOUR DOTS
+1806;N # MONGOLIAN TODO SOFT HYPHEN
+1807;N # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808;N # MONGOLIAN MANCHU COMMA
+1809;N # MONGOLIAN MANCHU FULL STOP
+180A;N # MONGOLIAN NIRUGU
+180B;N # MONGOLIAN FREE VARIATION SELECTOR ONE
+180C;N # MONGOLIAN FREE VARIATION SELECTOR TWO
+180D;N # MONGOLIAN FREE VARIATION SELECTOR THREE
+180E;N # MONGOLIAN VOWEL SEPARATOR
+1810;N # MONGOLIAN DIGIT ZERO
+1811;N # MONGOLIAN DIGIT ONE
+1812;N # MONGOLIAN DIGIT TWO
+1813;N # MONGOLIAN DIGIT THREE
+1814;N # MONGOLIAN DIGIT FOUR
+1815;N # MONGOLIAN DIGIT FIVE
+1816;N # MONGOLIAN DIGIT SIX
+1817;N # MONGOLIAN DIGIT SEVEN
+1818;N # MONGOLIAN DIGIT EIGHT
+1819;N # MONGOLIAN DIGIT NINE
+1820;N # MONGOLIAN LETTER A
+1821;N # MONGOLIAN LETTER E
+1822;N # MONGOLIAN LETTER I
+1823;N # MONGOLIAN LETTER O
+1824;N # MONGOLIAN LETTER U
+1825;N # MONGOLIAN LETTER OE
+1826;N # MONGOLIAN LETTER UE
+1827;N # MONGOLIAN LETTER EE
+1828;N # MONGOLIAN LETTER NA
+1829;N # MONGOLIAN LETTER ANG
+182A;N # MONGOLIAN LETTER BA
+182B;N # MONGOLIAN LETTER PA
+182C;N # MONGOLIAN LETTER QA
+182D;N # MONGOLIAN LETTER GA
+182E;N # MONGOLIAN LETTER MA
+182F;N # MONGOLIAN LETTER LA
+1830;N # MONGOLIAN LETTER SA
+1831;N # MONGOLIAN LETTER SHA
+1832;N # MONGOLIAN LETTER TA
+1833;N # MONGOLIAN LETTER DA
+1834;N # MONGOLIAN LETTER CHA
+1835;N # MONGOLIAN LETTER JA
+1836;N # MONGOLIAN LETTER YA
+1837;N # MONGOLIAN LETTER RA
+1838;N # MONGOLIAN LETTER WA
+1839;N # MONGOLIAN LETTER FA
+183A;N # MONGOLIAN LETTER KA
+183B;N # MONGOLIAN LETTER KHA
+183C;N # MONGOLIAN LETTER TSA
+183D;N # MONGOLIAN LETTER ZA
+183E;N # MONGOLIAN LETTER HAA
+183F;N # MONGOLIAN LETTER ZRA
+1840;N # MONGOLIAN LETTER LHA
+1841;N # MONGOLIAN LETTER ZHI
+1842;N # MONGOLIAN LETTER CHI
+1843;N # MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844;N # MONGOLIAN LETTER TODO E
+1845;N # MONGOLIAN LETTER TODO I
+1846;N # MONGOLIAN LETTER TODO O
+1847;N # MONGOLIAN LETTER TODO U
+1848;N # MONGOLIAN LETTER TODO OE
+1849;N # MONGOLIAN LETTER TODO UE
+184A;N # MONGOLIAN LETTER TODO ANG
+184B;N # MONGOLIAN LETTER TODO BA
+184C;N # MONGOLIAN LETTER TODO PA
+184D;N # MONGOLIAN LETTER TODO QA
+184E;N # MONGOLIAN LETTER TODO GA
+184F;N # MONGOLIAN LETTER TODO MA
+1850;N # MONGOLIAN LETTER TODO TA
+1851;N # MONGOLIAN LETTER TODO DA
+1852;N # MONGOLIAN LETTER TODO CHA
+1853;N # MONGOLIAN LETTER TODO JA
+1854;N # MONGOLIAN LETTER TODO TSA
+1855;N # MONGOLIAN LETTER TODO YA
+1856;N # MONGOLIAN LETTER TODO WA
+1857;N # MONGOLIAN LETTER TODO KA
+1858;N # MONGOLIAN LETTER TODO GAA
+1859;N # MONGOLIAN LETTER TODO HAA
+185A;N # MONGOLIAN LETTER TODO JIA
+185B;N # MONGOLIAN LETTER TODO NIA
+185C;N # MONGOLIAN LETTER TODO DZA
+185D;N # MONGOLIAN LETTER SIBE E
+185E;N # MONGOLIAN LETTER SIBE I
+185F;N # MONGOLIAN LETTER SIBE IY
+1860;N # MONGOLIAN LETTER SIBE UE
+1861;N # MONGOLIAN LETTER SIBE U
+1862;N # MONGOLIAN LETTER SIBE ANG
+1863;N # MONGOLIAN LETTER SIBE KA
+1864;N # MONGOLIAN LETTER SIBE GA
+1865;N # MONGOLIAN LETTER SIBE HA
+1866;N # MONGOLIAN LETTER SIBE PA
+1867;N # MONGOLIAN LETTER SIBE SHA
+1868;N # MONGOLIAN LETTER SIBE TA
+1869;N # MONGOLIAN LETTER SIBE DA
+186A;N # MONGOLIAN LETTER SIBE JA
+186B;N # MONGOLIAN LETTER SIBE FA
+186C;N # MONGOLIAN LETTER SIBE GAA
+186D;N # MONGOLIAN LETTER SIBE HAA
+186E;N # MONGOLIAN LETTER SIBE TSA
+186F;N # MONGOLIAN LETTER SIBE ZA
+1870;N # MONGOLIAN LETTER SIBE RAA
+1871;N # MONGOLIAN LETTER SIBE CHA
+1872;N # MONGOLIAN LETTER SIBE ZHA
+1873;N # MONGOLIAN LETTER MANCHU I
+1874;N # MONGOLIAN LETTER MANCHU KA
+1875;N # MONGOLIAN LETTER MANCHU RA
+1876;N # MONGOLIAN LETTER MANCHU FA
+1877;N # MONGOLIAN LETTER MANCHU ZHA
+1880;N # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881;N # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882;N # MONGOLIAN LETTER ALI GALI DAMARU
+1883;N # MONGOLIAN LETTER ALI GALI UBADAMA
+1884;N # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885;N # MONGOLIAN LETTER ALI GALI BALUDA
+1886;N # MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887;N # MONGOLIAN LETTER ALI GALI A
+1888;N # MONGOLIAN LETTER ALI GALI I
+1889;N # MONGOLIAN LETTER ALI GALI KA
+188A;N # MONGOLIAN LETTER ALI GALI NGA
+188B;N # MONGOLIAN LETTER ALI GALI CA
+188C;N # MONGOLIAN LETTER ALI GALI TTA
+188D;N # MONGOLIAN LETTER ALI GALI TTHA
+188E;N # MONGOLIAN LETTER ALI GALI DDA
+188F;N # MONGOLIAN LETTER ALI GALI NNA
+1890;N # MONGOLIAN LETTER ALI GALI TA
+1891;N # MONGOLIAN LETTER ALI GALI DA
+1892;N # MONGOLIAN LETTER ALI GALI PA
+1893;N # MONGOLIAN LETTER ALI GALI PHA
+1894;N # MONGOLIAN LETTER ALI GALI SSA
+1895;N # MONGOLIAN LETTER ALI GALI ZHA
+1896;N # MONGOLIAN LETTER ALI GALI ZA
+1897;N # MONGOLIAN LETTER ALI GALI AH
+1898;N # MONGOLIAN LETTER TODO ALI GALI TA
+1899;N # MONGOLIAN LETTER TODO ALI GALI ZHA
+189A;N # MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B;N # MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C;N # MONGOLIAN LETTER MANCHU ALI GALI CA
+189D;N # MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E;N # MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F;N # MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0;N # MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1;N # MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2;N # MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3;N # MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4;N # MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5;N # MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6;N # MONGOLIAN LETTER ALI GALI HALF U
+18A7;N # MONGOLIAN LETTER ALI GALI HALF YA
+18A8;N # MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9;N # MONGOLIAN LETTER ALI GALI DAGALGA
+1900;N # LIMBU VOWEL-CARRIER LETTER
+1901;N # LIMBU LETTER KA
+1902;N # LIMBU LETTER KHA
+1903;N # LIMBU LETTER GA
+1904;N # LIMBU LETTER GHA
+1905;N # LIMBU LETTER NGA
+1906;N # LIMBU LETTER CA
+1907;N # LIMBU LETTER CHA
+1908;N # LIMBU LETTER JA
+1909;N # LIMBU LETTER JHA
+190A;N # LIMBU LETTER YAN
+190B;N # LIMBU LETTER TA
+190C;N # LIMBU LETTER THA
+190D;N # LIMBU LETTER DA
+190E;N # LIMBU LETTER DHA
+190F;N # LIMBU LETTER NA
+1910;N # LIMBU LETTER PA
+1911;N # LIMBU LETTER PHA
+1912;N # LIMBU LETTER BA
+1913;N # LIMBU LETTER BHA
+1914;N # LIMBU LETTER MA
+1915;N # LIMBU LETTER YA
+1916;N # LIMBU LETTER RA
+1917;N # LIMBU LETTER LA
+1918;N # LIMBU LETTER WA
+1919;N # LIMBU LETTER SHA
+191A;N # LIMBU LETTER SSA
+191B;N # LIMBU LETTER SA
+191C;N # LIMBU LETTER HA
+1920;N # LIMBU VOWEL SIGN A
+1921;N # LIMBU VOWEL SIGN I
+1922;N # LIMBU VOWEL SIGN U
+1923;N # LIMBU VOWEL SIGN EE
+1924;N # LIMBU VOWEL SIGN AI
+1925;N # LIMBU VOWEL SIGN OO
+1926;N # LIMBU VOWEL SIGN AU
+1927;N # LIMBU VOWEL SIGN E
+1928;N # LIMBU VOWEL SIGN O
+1929;N # LIMBU SUBJOINED LETTER YA
+192A;N # LIMBU SUBJOINED LETTER RA
+192B;N # LIMBU SUBJOINED LETTER WA
+1930;N # LIMBU SMALL LETTER KA
+1931;N # LIMBU SMALL LETTER NGA
+1932;N # LIMBU SMALL LETTER ANUSVARA
+1933;N # LIMBU SMALL LETTER TA
+1934;N # LIMBU SMALL LETTER NA
+1935;N # LIMBU SMALL LETTER PA
+1936;N # LIMBU SMALL LETTER MA
+1937;N # LIMBU SMALL LETTER RA
+1938;N # LIMBU SMALL LETTER LA
+1939;N # LIMBU SIGN MUKPHRENG
+193A;N # LIMBU SIGN KEMPHRENG
+193B;N # LIMBU SIGN SA-I
+1940;N # LIMBU SIGN LOO
+1944;N # LIMBU EXCLAMATION MARK
+1945;N # LIMBU QUESTION MARK
+1946;N # LIMBU DIGIT ZERO
+1947;N # LIMBU DIGIT ONE
+1948;N # LIMBU DIGIT TWO
+1949;N # LIMBU DIGIT THREE
+194A;N # LIMBU DIGIT FOUR
+194B;N # LIMBU DIGIT FIVE
+194C;N # LIMBU DIGIT SIX
+194D;N # LIMBU DIGIT SEVEN
+194E;N # LIMBU DIGIT EIGHT
+194F;N # LIMBU DIGIT NINE
+1950;N # TAI LE LETTER KA
+1951;N # TAI LE LETTER XA
+1952;N # TAI LE LETTER NGA
+1953;N # TAI LE LETTER TSA
+1954;N # TAI LE LETTER SA
+1955;N # TAI LE LETTER YA
+1956;N # TAI LE LETTER TA
+1957;N # TAI LE LETTER THA
+1958;N # TAI LE LETTER LA
+1959;N # TAI LE LETTER PA
+195A;N # TAI LE LETTER PHA
+195B;N # TAI LE LETTER MA
+195C;N # TAI LE LETTER FA
+195D;N # TAI LE LETTER VA
+195E;N # TAI LE LETTER HA
+195F;N # TAI LE LETTER QA
+1960;N # TAI LE LETTER KHA
+1961;N # TAI LE LETTER TSHA
+1962;N # TAI LE LETTER NA
+1963;N # TAI LE LETTER A
+1964;N # TAI LE LETTER I
+1965;N # TAI LE LETTER EE
+1966;N # TAI LE LETTER EH
+1967;N # TAI LE LETTER U
+1968;N # TAI LE LETTER OO
+1969;N # TAI LE LETTER O
+196A;N # TAI LE LETTER UE
+196B;N # TAI LE LETTER E
+196C;N # TAI LE LETTER AUE
+196D;N # TAI LE LETTER AI
+1970;N # TAI LE LETTER TONE-2
+1971;N # TAI LE LETTER TONE-3
+1972;N # TAI LE LETTER TONE-4
+1973;N # TAI LE LETTER TONE-5
+1974;N # TAI LE LETTER TONE-6
+1980;N # NEW TAI LUE LETTER HIGH QA
+1981;N # NEW TAI LUE LETTER LOW QA
+1982;N # NEW TAI LUE LETTER HIGH KA
+1983;N # NEW TAI LUE LETTER HIGH XA
+1984;N # NEW TAI LUE LETTER HIGH NGA
+1985;N # NEW TAI LUE LETTER LOW KA
+1986;N # NEW TAI LUE LETTER LOW XA
+1987;N # NEW TAI LUE LETTER LOW NGA
+1988;N # NEW TAI LUE LETTER HIGH TSA
+1989;N # NEW TAI LUE LETTER HIGH SA
+198A;N # NEW TAI LUE LETTER HIGH YA
+198B;N # NEW TAI LUE LETTER LOW TSA
+198C;N # NEW TAI LUE LETTER LOW SA
+198D;N # NEW TAI LUE LETTER LOW YA
+198E;N # NEW TAI LUE LETTER HIGH TA
+198F;N # NEW TAI LUE LETTER HIGH THA
+1990;N # NEW TAI LUE LETTER HIGH NA
+1991;N # NEW TAI LUE LETTER LOW TA
+1992;N # NEW TAI LUE LETTER LOW THA
+1993;N # NEW TAI LUE LETTER LOW NA
+1994;N # NEW TAI LUE LETTER HIGH PA
+1995;N # NEW TAI LUE LETTER HIGH PHA
+1996;N # NEW TAI LUE LETTER HIGH MA
+1997;N # NEW TAI LUE LETTER LOW PA
+1998;N # NEW TAI LUE LETTER LOW PHA
+1999;N # NEW TAI LUE LETTER LOW MA
+199A;N # NEW TAI LUE LETTER HIGH FA
+199B;N # NEW TAI LUE LETTER HIGH VA
+199C;N # NEW TAI LUE LETTER HIGH LA
+199D;N # NEW TAI LUE LETTER LOW FA
+199E;N # NEW TAI LUE LETTER LOW VA
+199F;N # NEW TAI LUE LETTER LOW LA
+19A0;N # NEW TAI LUE LETTER HIGH HA
+19A1;N # NEW TAI LUE LETTER HIGH DA
+19A2;N # NEW TAI LUE LETTER HIGH BA
+19A3;N # NEW TAI LUE LETTER LOW HA
+19A4;N # NEW TAI LUE LETTER LOW DA
+19A5;N # NEW TAI LUE LETTER LOW BA
+19A6;N # NEW TAI LUE LETTER HIGH KVA
+19A7;N # NEW TAI LUE LETTER HIGH XVA
+19A8;N # NEW TAI LUE LETTER LOW KVA
+19A9;N # NEW TAI LUE LETTER LOW XVA
+19B0;N # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1;N # NEW TAI LUE VOWEL SIGN AA
+19B2;N # NEW TAI LUE VOWEL SIGN II
+19B3;N # NEW TAI LUE VOWEL SIGN U
+19B4;N # NEW TAI LUE VOWEL SIGN UU
+19B5;N # NEW TAI LUE VOWEL SIGN E
+19B6;N # NEW TAI LUE VOWEL SIGN AE
+19B7;N # NEW TAI LUE VOWEL SIGN O
+19B8;N # NEW TAI LUE VOWEL SIGN OA
+19B9;N # NEW TAI LUE VOWEL SIGN UE
+19BA;N # NEW TAI LUE VOWEL SIGN AY
+19BB;N # NEW TAI LUE VOWEL SIGN AAY
+19BC;N # NEW TAI LUE VOWEL SIGN UY
+19BD;N # NEW TAI LUE VOWEL SIGN OY
+19BE;N # NEW TAI LUE VOWEL SIGN OAY
+19BF;N # NEW TAI LUE VOWEL SIGN UEY
+19C0;N # NEW TAI LUE VOWEL SIGN IY
+19C1;N # NEW TAI LUE LETTER FINAL V
+19C2;N # NEW TAI LUE LETTER FINAL NG
+19C3;N # NEW TAI LUE LETTER FINAL N
+19C4;N # NEW TAI LUE LETTER FINAL M
+19C5;N # NEW TAI LUE LETTER FINAL K
+19C6;N # NEW TAI LUE LETTER FINAL D
+19C7;N # NEW TAI LUE LETTER FINAL B
+19C8;N # NEW TAI LUE TONE MARK-1
+19C9;N # NEW TAI LUE TONE MARK-2
+19D0;N # NEW TAI LUE DIGIT ZERO
+19D1;N # NEW TAI LUE DIGIT ONE
+19D2;N # NEW TAI LUE DIGIT TWO
+19D3;N # NEW TAI LUE DIGIT THREE
+19D4;N # NEW TAI LUE DIGIT FOUR
+19D5;N # NEW TAI LUE DIGIT FIVE
+19D6;N # NEW TAI LUE DIGIT SIX
+19D7;N # NEW TAI LUE DIGIT SEVEN
+19D8;N # NEW TAI LUE DIGIT EIGHT
+19D9;N # NEW TAI LUE DIGIT NINE
+19DE;N # NEW TAI LUE SIGN LAE
+19DF;N # NEW TAI LUE SIGN LAEV
+19E0;N # KHMER SYMBOL PATHAMASAT
+19E1;N # KHMER SYMBOL MUOY KOET
+19E2;N # KHMER SYMBOL PII KOET
+19E3;N # KHMER SYMBOL BEI KOET
+19E4;N # KHMER SYMBOL BUON KOET
+19E5;N # KHMER SYMBOL PRAM KOET
+19E6;N # KHMER SYMBOL PRAM-MUOY KOET
+19E7;N # KHMER SYMBOL PRAM-PII KOET
+19E8;N # KHMER SYMBOL PRAM-BEI KOET
+19E9;N # KHMER SYMBOL PRAM-BUON KOET
+19EA;N # KHMER SYMBOL DAP KOET
+19EB;N # KHMER SYMBOL DAP-MUOY KOET
+19EC;N # KHMER SYMBOL DAP-PII KOET
+19ED;N # KHMER SYMBOL DAP-BEI KOET
+19EE;N # KHMER SYMBOL DAP-BUON KOET
+19EF;N # KHMER SYMBOL DAP-PRAM KOET
+19F0;N # KHMER SYMBOL TUTEYASAT
+19F1;N # KHMER SYMBOL MUOY ROC
+19F2;N # KHMER SYMBOL PII ROC
+19F3;N # KHMER SYMBOL BEI ROC
+19F4;N # KHMER SYMBOL BUON ROC
+19F5;N # KHMER SYMBOL PRAM ROC
+19F6;N # KHMER SYMBOL PRAM-MUOY ROC
+19F7;N # KHMER SYMBOL PRAM-PII ROC
+19F8;N # KHMER SYMBOL PRAM-BEI ROC
+19F9;N # KHMER SYMBOL PRAM-BUON ROC
+19FA;N # KHMER SYMBOL DAP ROC
+19FB;N # KHMER SYMBOL DAP-MUOY ROC
+19FC;N # KHMER SYMBOL DAP-PII ROC
+19FD;N # KHMER SYMBOL DAP-BEI ROC
+19FE;N # KHMER SYMBOL DAP-BUON ROC
+19FF;N # KHMER SYMBOL DAP-PRAM ROC
+1A00;N # BUGINESE LETTER KA
+1A01;N # BUGINESE LETTER GA
+1A02;N # BUGINESE LETTER NGA
+1A03;N # BUGINESE LETTER NGKA
+1A04;N # BUGINESE LETTER PA
+1A05;N # BUGINESE LETTER BA
+1A06;N # BUGINESE LETTER MA
+1A07;N # BUGINESE LETTER MPA
+1A08;N # BUGINESE LETTER TA
+1A09;N # BUGINESE LETTER DA
+1A0A;N # BUGINESE LETTER NA
+1A0B;N # BUGINESE LETTER NRA
+1A0C;N # BUGINESE LETTER CA
+1A0D;N # BUGINESE LETTER JA
+1A0E;N # BUGINESE LETTER NYA
+1A0F;N # BUGINESE LETTER NYCA
+1A10;N # BUGINESE LETTER YA
+1A11;N # BUGINESE LETTER RA
+1A12;N # BUGINESE LETTER LA
+1A13;N # BUGINESE LETTER VA
+1A14;N # BUGINESE LETTER SA
+1A15;N # BUGINESE LETTER A
+1A16;N # BUGINESE LETTER HA
+1A17;N # BUGINESE VOWEL SIGN I
+1A18;N # BUGINESE VOWEL SIGN U
+1A19;N # BUGINESE VOWEL SIGN E
+1A1A;N # BUGINESE VOWEL SIGN O
+1A1B;N # BUGINESE VOWEL SIGN AE
+1A1E;N # BUGINESE PALLAWA
+1A1F;N # BUGINESE END OF SECTION
+1D00;N # LATIN LETTER SMALL CAPITAL A
+1D01;N # LATIN LETTER SMALL CAPITAL AE
+1D02;N # LATIN SMALL LETTER TURNED AE
+1D03;N # LATIN LETTER SMALL CAPITAL BARRED B
+1D04;N # LATIN LETTER SMALL CAPITAL C
+1D05;N # LATIN LETTER SMALL CAPITAL D
+1D06;N # LATIN LETTER SMALL CAPITAL ETH
+1D07;N # LATIN LETTER SMALL CAPITAL E
+1D08;N # LATIN SMALL LETTER TURNED OPEN E
+1D09;N # LATIN SMALL LETTER TURNED I
+1D0A;N # LATIN LETTER SMALL CAPITAL J
+1D0B;N # LATIN LETTER SMALL CAPITAL K
+1D0C;N # LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D;N # LATIN LETTER SMALL CAPITAL M
+1D0E;N # LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F;N # LATIN LETTER SMALL CAPITAL O
+1D10;N # LATIN LETTER SMALL CAPITAL OPEN O
+1D11;N # LATIN SMALL LETTER SIDEWAYS O
+1D12;N # LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13;N # LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14;N # LATIN SMALL LETTER TURNED OE
+1D15;N # LATIN LETTER SMALL CAPITAL OU
+1D16;N # LATIN SMALL LETTER TOP HALF O
+1D17;N # LATIN SMALL LETTER BOTTOM HALF O
+1D18;N # LATIN LETTER SMALL CAPITAL P
+1D19;N # LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A;N # LATIN LETTER SMALL CAPITAL TURNED R
+1D1B;N # LATIN LETTER SMALL CAPITAL T
+1D1C;N # LATIN LETTER SMALL CAPITAL U
+1D1D;N # LATIN SMALL LETTER SIDEWAYS U
+1D1E;N # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D1F;N # LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20;N # LATIN LETTER SMALL CAPITAL V
+1D21;N # LATIN LETTER SMALL CAPITAL W
+1D22;N # LATIN LETTER SMALL CAPITAL Z
+1D23;N # LATIN LETTER SMALL CAPITAL EZH
+1D24;N # LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25;N # LATIN LETTER AIN
+1D26;N # GREEK LETTER SMALL CAPITAL GAMMA
+1D27;N # GREEK LETTER SMALL CAPITAL LAMDA
+1D28;N # GREEK LETTER SMALL CAPITAL PI
+1D29;N # GREEK LETTER SMALL CAPITAL RHO
+1D2A;N # GREEK LETTER SMALL CAPITAL PSI
+1D2B;N # CYRILLIC LETTER SMALL CAPITAL EL
+1D2C;N # MODIFIER LETTER CAPITAL A
+1D2D;N # MODIFIER LETTER CAPITAL AE
+1D2E;N # MODIFIER LETTER CAPITAL B
+1D2F;N # MODIFIER LETTER CAPITAL BARRED B
+1D30;N # MODIFIER LETTER CAPITAL D
+1D31;N # MODIFIER LETTER CAPITAL E
+1D32;N # MODIFIER LETTER CAPITAL REVERSED E
+1D33;N # MODIFIER LETTER CAPITAL G
+1D34;N # MODIFIER LETTER CAPITAL H
+1D35;N # MODIFIER LETTER CAPITAL I
+1D36;N # MODIFIER LETTER CAPITAL J
+1D37;N # MODIFIER LETTER CAPITAL K
+1D38;N # MODIFIER LETTER CAPITAL L
+1D39;N # MODIFIER LETTER CAPITAL M
+1D3A;N # MODIFIER LETTER CAPITAL N
+1D3B;N # MODIFIER LETTER CAPITAL REVERSED N
+1D3C;N # MODIFIER LETTER CAPITAL O
+1D3D;N # MODIFIER LETTER CAPITAL OU
+1D3E;N # MODIFIER LETTER CAPITAL P
+1D3F;N # MODIFIER LETTER CAPITAL R
+1D40;N # MODIFIER LETTER CAPITAL T
+1D41;N # MODIFIER LETTER CAPITAL U
+1D42;N # MODIFIER LETTER CAPITAL W
+1D43;N # MODIFIER LETTER SMALL A
+1D44;N # MODIFIER LETTER SMALL TURNED A
+1D45;N # MODIFIER LETTER SMALL ALPHA
+1D46;N # MODIFIER LETTER SMALL TURNED AE
+1D47;N # MODIFIER LETTER SMALL B
+1D48;N # MODIFIER LETTER SMALL D
+1D49;N # MODIFIER LETTER SMALL E
+1D4A;N # MODIFIER LETTER SMALL SCHWA
+1D4B;N # MODIFIER LETTER SMALL OPEN E
+1D4C;N # MODIFIER LETTER SMALL TURNED OPEN E
+1D4D;N # MODIFIER LETTER SMALL G
+1D4E;N # MODIFIER LETTER SMALL TURNED I
+1D4F;N # MODIFIER LETTER SMALL K
+1D50;N # MODIFIER LETTER SMALL M
+1D51;N # MODIFIER LETTER SMALL ENG
+1D52;N # MODIFIER LETTER SMALL O
+1D53;N # MODIFIER LETTER SMALL OPEN O
+1D54;N # MODIFIER LETTER SMALL TOP HALF O
+1D55;N # MODIFIER LETTER SMALL BOTTOM HALF O
+1D56;N # MODIFIER LETTER SMALL P
+1D57;N # MODIFIER LETTER SMALL T
+1D58;N # MODIFIER LETTER SMALL U
+1D59;N # MODIFIER LETTER SMALL SIDEWAYS U
+1D5A;N # MODIFIER LETTER SMALL TURNED M
+1D5B;N # MODIFIER LETTER SMALL V
+1D5C;N # MODIFIER LETTER SMALL AIN
+1D5D;N # MODIFIER LETTER SMALL BETA
+1D5E;N # MODIFIER LETTER SMALL GREEK GAMMA
+1D5F;N # MODIFIER LETTER SMALL DELTA
+1D60;N # MODIFIER LETTER SMALL GREEK PHI
+1D61;N # MODIFIER LETTER SMALL CHI
+1D62;N # LATIN SUBSCRIPT SMALL LETTER I
+1D63;N # LATIN SUBSCRIPT SMALL LETTER R
+1D64;N # LATIN SUBSCRIPT SMALL LETTER U
+1D65;N # LATIN SUBSCRIPT SMALL LETTER V
+1D66;N # GREEK SUBSCRIPT SMALL LETTER BETA
+1D67;N # GREEK SUBSCRIPT SMALL LETTER GAMMA
+1D68;N # GREEK SUBSCRIPT SMALL LETTER RHO
+1D69;N # GREEK SUBSCRIPT SMALL LETTER PHI
+1D6A;N # GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B;N # LATIN SMALL LETTER UE
+1D6C;N # LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D6D;N # LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D6E;N # LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D6F;N # LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D70;N # LATIN SMALL LETTER N WITH MIDDLE TILDE
+1D71;N # LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D72;N # LATIN SMALL LETTER R WITH MIDDLE TILDE
+1D73;N # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+1D74;N # LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D75;N # LATIN SMALL LETTER T WITH MIDDLE TILDE
+1D76;N # LATIN SMALL LETTER Z WITH MIDDLE TILDE
+1D77;N # LATIN SMALL LETTER TURNED G
+1D78;N # MODIFIER LETTER CYRILLIC EN
+1D79;N # LATIN SMALL LETTER INSULAR G
+1D7A;N # LATIN SMALL LETTER TH WITH STRIKETHROUGH
+1D7B;N # LATIN SMALL CAPITAL LETTER I WITH STROKE
+1D7C;N # LATIN SMALL LETTER IOTA WITH STROKE
+1D7D;N # LATIN SMALL LETTER P WITH STROKE
+1D7E;N # LATIN SMALL CAPITAL LETTER U WITH STROKE
+1D7F;N # LATIN SMALL LETTER UPSILON WITH STROKE
+1D80;N # LATIN SMALL LETTER B WITH PALATAL HOOK
+1D81;N # LATIN SMALL LETTER D WITH PALATAL HOOK
+1D82;N # LATIN SMALL LETTER F WITH PALATAL HOOK
+1D83;N # LATIN SMALL LETTER G WITH PALATAL HOOK
+1D84;N # LATIN SMALL LETTER K WITH PALATAL HOOK
+1D85;N # LATIN SMALL LETTER L WITH PALATAL HOOK
+1D86;N # LATIN SMALL LETTER M WITH PALATAL HOOK
+1D87;N # LATIN SMALL LETTER N WITH PALATAL HOOK
+1D88;N # LATIN SMALL LETTER P WITH PALATAL HOOK
+1D89;N # LATIN SMALL LETTER R WITH PALATAL HOOK
+1D8A;N # LATIN SMALL LETTER S WITH PALATAL HOOK
+1D8B;N # LATIN SMALL LETTER ESH WITH PALATAL HOOK
+1D8C;N # LATIN SMALL LETTER V WITH PALATAL HOOK
+1D8D;N # LATIN SMALL LETTER X WITH PALATAL HOOK
+1D8E;N # LATIN SMALL LETTER Z WITH PALATAL HOOK
+1D8F;N # LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D90;N # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+1D91;N # LATIN SMALL LETTER D WITH HOOK AND TAIL
+1D92;N # LATIN SMALL LETTER E WITH RETROFLEX HOOK
+1D93;N # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+1D94;N # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+1D95;N # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+1D96;N # LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1D97;N # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+1D98;N # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+1D99;N # LATIN SMALL LETTER U WITH RETROFLEX HOOK
+1D9A;N # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B;N # MODIFIER LETTER SMALL TURNED ALPHA
+1D9C;N # MODIFIER LETTER SMALL C
+1D9D;N # MODIFIER LETTER SMALL C WITH CURL
+1D9E;N # MODIFIER LETTER SMALL ETH
+1D9F;N # MODIFIER LETTER SMALL REVERSED OPEN E
+1DA0;N # MODIFIER LETTER SMALL F
+1DA1;N # MODIFIER LETTER SMALL DOTLESS J WITH STROKE
+1DA2;N # MODIFIER LETTER SMALL SCRIPT G
+1DA3;N # MODIFIER LETTER SMALL TURNED H
+1DA4;N # MODIFIER LETTER SMALL I WITH STROKE
+1DA5;N # MODIFIER LETTER SMALL IOTA
+1DA6;N # MODIFIER LETTER SMALL CAPITAL I
+1DA7;N # MODIFIER LETTER SMALL CAPITAL I WITH STROKE
+1DA8;N # MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+1DA9;N # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK
+1DAA;N # MODIFIER LETTER SMALL L WITH PALATAL HOOK
+1DAB;N # MODIFIER LETTER SMALL CAPITAL L
+1DAC;N # MODIFIER LETTER SMALL M WITH HOOK
+1DAD;N # MODIFIER LETTER SMALL TURNED M WITH LONG LEG
+1DAE;N # MODIFIER LETTER SMALL N WITH LEFT HOOK
+1DAF;N # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK
+1DB0;N # MODIFIER LETTER SMALL CAPITAL N
+1DB1;N # MODIFIER LETTER SMALL BARRED O
+1DB2;N # MODIFIER LETTER SMALL PHI
+1DB3;N # MODIFIER LETTER SMALL S WITH HOOK
+1DB4;N # MODIFIER LETTER SMALL ESH
+1DB5;N # MODIFIER LETTER SMALL T WITH PALATAL HOOK
+1DB6;N # MODIFIER LETTER SMALL U BAR
+1DB7;N # MODIFIER LETTER SMALL UPSILON
+1DB8;N # MODIFIER LETTER SMALL CAPITAL U
+1DB9;N # MODIFIER LETTER SMALL V WITH HOOK
+1DBA;N # MODIFIER LETTER SMALL TURNED V
+1DBB;N # MODIFIER LETTER SMALL Z
+1DBC;N # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK
+1DBD;N # MODIFIER LETTER SMALL Z WITH CURL
+1DBE;N # MODIFIER LETTER SMALL EZH
+1DBF;N # MODIFIER LETTER SMALL THETA
+1DC0;N # COMBINING DOTTED GRAVE ACCENT
+1DC1;N # COMBINING DOTTED ACUTE ACCENT
+1DC2;N # COMBINING SNAKE BELOW
+1DC3;N # COMBINING SUSPENSION MARK
+1E00;N # LATIN CAPITAL LETTER A WITH RING BELOW
+1E01;N # LATIN SMALL LETTER A WITH RING BELOW
+1E02;N # LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E03;N # LATIN SMALL LETTER B WITH DOT ABOVE
+1E04;N # LATIN CAPITAL LETTER B WITH DOT BELOW
+1E05;N # LATIN SMALL LETTER B WITH DOT BELOW
+1E06;N # LATIN CAPITAL LETTER B WITH LINE BELOW
+1E07;N # LATIN SMALL LETTER B WITH LINE BELOW
+1E08;N # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E09;N # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0A;N # LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0B;N # LATIN SMALL LETTER D WITH DOT ABOVE
+1E0C;N # LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0D;N # LATIN SMALL LETTER D WITH DOT BELOW
+1E0E;N # LATIN CAPITAL LETTER D WITH LINE BELOW
+1E0F;N # LATIN SMALL LETTER D WITH LINE BELOW
+1E10;N # LATIN CAPITAL LETTER D WITH CEDILLA
+1E11;N # LATIN SMALL LETTER D WITH CEDILLA
+1E12;N # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E13;N # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E14;N # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E15;N # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E16;N # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E17;N # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E18;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E19;N # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1A;N # LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1B;N # LATIN SMALL LETTER E WITH TILDE BELOW
+1E1C;N # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1D;N # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1E;N # LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E1F;N # LATIN SMALL LETTER F WITH DOT ABOVE
+1E20;N # LATIN CAPITAL LETTER G WITH MACRON
+1E21;N # LATIN SMALL LETTER G WITH MACRON
+1E22;N # LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E23;N # LATIN SMALL LETTER H WITH DOT ABOVE
+1E24;N # LATIN CAPITAL LETTER H WITH DOT BELOW
+1E25;N # LATIN SMALL LETTER H WITH DOT BELOW
+1E26;N # LATIN CAPITAL LETTER H WITH DIAERESIS
+1E27;N # LATIN SMALL LETTER H WITH DIAERESIS
+1E28;N # LATIN CAPITAL LETTER H WITH CEDILLA
+1E29;N # LATIN SMALL LETTER H WITH CEDILLA
+1E2A;N # LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2B;N # LATIN SMALL LETTER H WITH BREVE BELOW
+1E2C;N # LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2D;N # LATIN SMALL LETTER I WITH TILDE BELOW
+1E2E;N # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E2F;N # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E30;N # LATIN CAPITAL LETTER K WITH ACUTE
+1E31;N # LATIN SMALL LETTER K WITH ACUTE
+1E32;N # LATIN CAPITAL LETTER K WITH DOT BELOW
+1E33;N # LATIN SMALL LETTER K WITH DOT BELOW
+1E34;N # LATIN CAPITAL LETTER K WITH LINE BELOW
+1E35;N # LATIN SMALL LETTER K WITH LINE BELOW
+1E36;N # LATIN CAPITAL LETTER L WITH DOT BELOW
+1E37;N # LATIN SMALL LETTER L WITH DOT BELOW
+1E38;N # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E39;N # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3A;N # LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3B;N # LATIN SMALL LETTER L WITH LINE BELOW
+1E3C;N # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3D;N # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3E;N # LATIN CAPITAL LETTER M WITH ACUTE
+1E3F;N # LATIN SMALL LETTER M WITH ACUTE
+1E40;N # LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E41;N # LATIN SMALL LETTER M WITH DOT ABOVE
+1E42;N # LATIN CAPITAL LETTER M WITH DOT BELOW
+1E43;N # LATIN SMALL LETTER M WITH DOT BELOW
+1E44;N # LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E45;N # LATIN SMALL LETTER N WITH DOT ABOVE
+1E46;N # LATIN CAPITAL LETTER N WITH DOT BELOW
+1E47;N # LATIN SMALL LETTER N WITH DOT BELOW
+1E48;N # LATIN CAPITAL LETTER N WITH LINE BELOW
+1E49;N # LATIN SMALL LETTER N WITH LINE BELOW
+1E4A;N # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4B;N # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4C;N # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4D;N # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4E;N # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E4F;N # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E50;N # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E51;N # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E52;N # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E53;N # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E54;N # LATIN CAPITAL LETTER P WITH ACUTE
+1E55;N # LATIN SMALL LETTER P WITH ACUTE
+1E56;N # LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E57;N # LATIN SMALL LETTER P WITH DOT ABOVE
+1E58;N # LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E59;N # LATIN SMALL LETTER R WITH DOT ABOVE
+1E5A;N # LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5B;N # LATIN SMALL LETTER R WITH DOT BELOW
+1E5C;N # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5D;N # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5E;N # LATIN CAPITAL LETTER R WITH LINE BELOW
+1E5F;N # LATIN SMALL LETTER R WITH LINE BELOW
+1E60;N # LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E61;N # LATIN SMALL LETTER S WITH DOT ABOVE
+1E62;N # LATIN CAPITAL LETTER S WITH DOT BELOW
+1E63;N # LATIN SMALL LETTER S WITH DOT BELOW
+1E64;N # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E65;N # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E66;N # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E67;N # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E68;N # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E69;N # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A;N # LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6B;N # LATIN SMALL LETTER T WITH DOT ABOVE
+1E6C;N # LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6D;N # LATIN SMALL LETTER T WITH DOT BELOW
+1E6E;N # LATIN CAPITAL LETTER T WITH LINE BELOW
+1E6F;N # LATIN SMALL LETTER T WITH LINE BELOW
+1E70;N # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E71;N # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E72;N # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E73;N # LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E74;N # LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E75;N # LATIN SMALL LETTER U WITH TILDE BELOW
+1E76;N # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E77;N # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E78;N # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E79;N # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7A;N # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7B;N # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7C;N # LATIN CAPITAL LETTER V WITH TILDE
+1E7D;N # LATIN SMALL LETTER V WITH TILDE
+1E7E;N # LATIN CAPITAL LETTER V WITH DOT BELOW
+1E7F;N # LATIN SMALL LETTER V WITH DOT BELOW
+1E80;N # LATIN CAPITAL LETTER W WITH GRAVE
+1E81;N # LATIN SMALL LETTER W WITH GRAVE
+1E82;N # LATIN CAPITAL LETTER W WITH ACUTE
+1E83;N # LATIN SMALL LETTER W WITH ACUTE
+1E84;N # LATIN CAPITAL LETTER W WITH DIAERESIS
+1E85;N # LATIN SMALL LETTER W WITH DIAERESIS
+1E86;N # LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E87;N # LATIN SMALL LETTER W WITH DOT ABOVE
+1E88;N # LATIN CAPITAL LETTER W WITH DOT BELOW
+1E89;N # LATIN SMALL LETTER W WITH DOT BELOW
+1E8A;N # LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8B;N # LATIN SMALL LETTER X WITH DOT ABOVE
+1E8C;N # LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8D;N # LATIN SMALL LETTER X WITH DIAERESIS
+1E8E;N # LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E8F;N # LATIN SMALL LETTER Y WITH DOT ABOVE
+1E90;N # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E91;N # LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E92;N # LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E93;N # LATIN SMALL LETTER Z WITH DOT BELOW
+1E94;N # LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E95;N # LATIN SMALL LETTER Z WITH LINE BELOW
+1E96;N # LATIN SMALL LETTER H WITH LINE BELOW
+1E97;N # LATIN SMALL LETTER T WITH DIAERESIS
+1E98;N # LATIN SMALL LETTER W WITH RING ABOVE
+1E99;N # LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A;N # LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B;N # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0;N # LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA1;N # LATIN SMALL LETTER A WITH DOT BELOW
+1EA2;N # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA3;N # LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA4;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA5;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA7;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EA9;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAB;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC;N # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAD;N # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE;N # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EAF;N # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB0;N # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB1;N # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB2;N # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB3;N # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4;N # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB5;N # LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB6;N # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB7;N # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB8;N # LATIN CAPITAL LETTER E WITH DOT BELOW
+1EB9;N # LATIN SMALL LETTER E WITH DOT BELOW
+1EBA;N # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBB;N # LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBC;N # LATIN CAPITAL LETTER E WITH TILDE
+1EBD;N # LATIN SMALL LETTER E WITH TILDE
+1EBE;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EBF;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC1;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC3;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC5;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6;N # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC7;N # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8;N # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1EC9;N # LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECA;N # LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECB;N # LATIN SMALL LETTER I WITH DOT BELOW
+1ECC;N # LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECD;N # LATIN SMALL LETTER O WITH DOT BELOW
+1ECE;N # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ECF;N # LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED0;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED1;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED3;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED5;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED7;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8;N # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1ED9;N # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA;N # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDB;N # LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDC;N # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDD;N # LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDE;N # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EDF;N # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE0;N # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE1;N # LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE2;N # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE3;N # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE4;N # LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE5;N # LATIN SMALL LETTER U WITH DOT BELOW
+1EE6;N # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE7;N # LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE8;N # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EE9;N # LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEA;N # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEB;N # LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EEC;N # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EED;N # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEE;N # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EEF;N # LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF0;N # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF1;N # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF2;N # LATIN CAPITAL LETTER Y WITH GRAVE
+1EF3;N # LATIN SMALL LETTER Y WITH GRAVE
+1EF4;N # LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF5;N # LATIN SMALL LETTER Y WITH DOT BELOW
+1EF6;N # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF7;N # LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF8;N # LATIN CAPITAL LETTER Y WITH TILDE
+1EF9;N # LATIN SMALL LETTER Y WITH TILDE
+1F00;N # GREEK SMALL LETTER ALPHA WITH PSILI
+1F01;N # GREEK SMALL LETTER ALPHA WITH DASIA
+1F02;N # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+1F03;N # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+1F04;N # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+1F05;N # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+1F06;N # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F07;N # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F08;N # GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09;N # GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10;N # GREEK SMALL LETTER EPSILON WITH PSILI
+1F11;N # GREEK SMALL LETTER EPSILON WITH DASIA
+1F12;N # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+1F13;N # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+1F14;N # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+1F15;N # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18;N # GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19;N # GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A;N # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B;N # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C;N # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D;N # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20;N # GREEK SMALL LETTER ETA WITH PSILI
+1F21;N # GREEK SMALL LETTER ETA WITH DASIA
+1F22;N # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+1F23;N # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+1F24;N # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+1F25;N # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+1F26;N # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+1F27;N # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F28;N # GREEK CAPITAL LETTER ETA WITH PSILI
+1F29;N # GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A;N # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B;N # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C;N # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D;N # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E;N # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F;N # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30;N # GREEK SMALL LETTER IOTA WITH PSILI
+1F31;N # GREEK SMALL LETTER IOTA WITH DASIA
+1F32;N # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+1F33;N # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+1F34;N # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+1F35;N # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+1F36;N # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F37;N # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F38;N # GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39;N # GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A;N # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B;N # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C;N # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D;N # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E;N # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F;N # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40;N # GREEK SMALL LETTER OMICRON WITH PSILI
+1F41;N # GREEK SMALL LETTER OMICRON WITH DASIA
+1F42;N # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+1F43;N # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+1F44;N # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+1F45;N # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48;N # GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49;N # GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A;N # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B;N # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C;N # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D;N # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50;N # GREEK SMALL LETTER UPSILON WITH PSILI
+1F51;N # GREEK SMALL LETTER UPSILON WITH DASIA
+1F52;N # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F53;N # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+1F54;N # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F55;N # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+1F56;N # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F57;N # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59;N # GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B;N # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D;N # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F;N # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60;N # GREEK SMALL LETTER OMEGA WITH PSILI
+1F61;N # GREEK SMALL LETTER OMEGA WITH DASIA
+1F62;N # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+1F63;N # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+1F64;N # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+1F65;N # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+1F66;N # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F67;N # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F68;N # GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69;N # GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70;N # GREEK SMALL LETTER ALPHA WITH VARIA
+1F71;N # GREEK SMALL LETTER ALPHA WITH OXIA
+1F72;N # GREEK SMALL LETTER EPSILON WITH VARIA
+1F73;N # GREEK SMALL LETTER EPSILON WITH OXIA
+1F74;N # GREEK SMALL LETTER ETA WITH VARIA
+1F75;N # GREEK SMALL LETTER ETA WITH OXIA
+1F76;N # GREEK SMALL LETTER IOTA WITH VARIA
+1F77;N # GREEK SMALL LETTER IOTA WITH OXIA
+1F78;N # GREEK SMALL LETTER OMICRON WITH VARIA
+1F79;N # GREEK SMALL LETTER OMICRON WITH OXIA
+1F7A;N # GREEK SMALL LETTER UPSILON WITH VARIA
+1F7B;N # GREEK SMALL LETTER UPSILON WITH OXIA
+1F7C;N # GREEK SMALL LETTER OMEGA WITH VARIA
+1F7D;N # GREEK SMALL LETTER OMEGA WITH OXIA
+1F80;N # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81;N # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82;N # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83;N # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84;N # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85;N # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86;N # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87;N # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E;N # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F;N # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90;N # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91;N # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92;N # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93;N # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94;N # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95;N # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96;N # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97;N # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98;N # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99;N # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A;N # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B;N # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C;N # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D;N # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E;N # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F;N # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0;N # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1;N # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2;N # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3;N # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4;N # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5;N # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6;N # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7;N # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE;N # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF;N # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB0;N # GREEK SMALL LETTER ALPHA WITH VRACHY
+1FB1;N # GREEK SMALL LETTER ALPHA WITH MACRON
+1FB2;N # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3;N # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4;N # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6;N # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7;N # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8;N # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9;N # GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA;N # GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB;N # GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC;N # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD;N # GREEK KORONIS
+1FBE;N # GREEK PROSGEGRAMMENI
+1FBF;N # GREEK PSILI
+1FC0;N # GREEK PERISPOMENI
+1FC1;N # GREEK DIALYTIKA AND PERISPOMENI
+1FC2;N # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3;N # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4;N # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6;N # GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7;N # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8;N # GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9;N # GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA;N # GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB;N # GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC;N # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD;N # GREEK PSILI AND VARIA
+1FCE;N # GREEK PSILI AND OXIA
+1FCF;N # GREEK PSILI AND PERISPOMENI
+1FD0;N # GREEK SMALL LETTER IOTA WITH VRACHY
+1FD1;N # GREEK SMALL LETTER IOTA WITH MACRON
+1FD2;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6;N # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7;N # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8;N # GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9;N # GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA;N # GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB;N # GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD;N # GREEK DASIA AND VARIA
+1FDE;N # GREEK DASIA AND OXIA
+1FDF;N # GREEK DASIA AND PERISPOMENI
+1FE0;N # GREEK SMALL LETTER UPSILON WITH VRACHY
+1FE1;N # GREEK SMALL LETTER UPSILON WITH MACRON
+1FE2;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4;N # GREEK SMALL LETTER RHO WITH PSILI
+1FE5;N # GREEK SMALL LETTER RHO WITH DASIA
+1FE6;N # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7;N # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8;N # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9;N # GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA;N # GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB;N # GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC;N # GREEK CAPITAL LETTER RHO WITH DASIA
+1FED;N # GREEK DIALYTIKA AND VARIA
+1FEE;N # GREEK DIALYTIKA AND OXIA
+1FEF;N # GREEK VARIA
+1FF2;N # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3;N # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4;N # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6;N # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7;N # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8;N # GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9;N # GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA;N # GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB;N # GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC;N # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD;N # GREEK OXIA
+1FFE;N # GREEK DASIA
+2000;N # EN QUAD
+2001;N # EM QUAD
+2002;N # EN SPACE
+2003;N # EM SPACE
+2004;N # THREE-PER-EM SPACE
+2005;N # FOUR-PER-EM SPACE
+2006;N # SIX-PER-EM SPACE
+2007;N # FIGURE SPACE
+2008;N # PUNCTUATION SPACE
+2009;N # THIN SPACE
+200A;N # HAIR SPACE
+200B;N # ZERO WIDTH SPACE
+200C;N # ZERO WIDTH NON-JOINER
+200D;N # ZERO WIDTH JOINER
+200E;N # LEFT-TO-RIGHT MARK
+200F;N # RIGHT-TO-LEFT MARK
+2010;A # HYPHEN
+2011;N # NON-BREAKING HYPHEN
+2012;N # FIGURE DASH
+2013;A # EN DASH
+2014;A # EM DASH
+2015;A # HORIZONTAL BAR
+2016;A # DOUBLE VERTICAL LINE
+2017;N # DOUBLE LOW LINE
+2018;A # LEFT SINGLE QUOTATION MARK
+2019;A # RIGHT SINGLE QUOTATION MARK
+201A;N # SINGLE LOW-9 QUOTATION MARK
+201B;N # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C;A # LEFT DOUBLE QUOTATION MARK
+201D;A # RIGHT DOUBLE QUOTATION MARK
+201E;N # DOUBLE LOW-9 QUOTATION MARK
+201F;N # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020;A # DAGGER
+2021;A # DOUBLE DAGGER
+2022;A # BULLET
+2023;N # TRIANGULAR BULLET
+2024;A # ONE DOT LEADER
+2025;A # TWO DOT LEADER
+2026;A # HORIZONTAL ELLIPSIS
+2027;A # HYPHENATION POINT
+2028;N # LINE SEPARATOR
+2029;N # PARAGRAPH SEPARATOR
+202A;N # LEFT-TO-RIGHT EMBEDDING
+202B;N # RIGHT-TO-LEFT EMBEDDING
+202C;N # POP DIRECTIONAL FORMATTING
+202D;N # LEFT-TO-RIGHT OVERRIDE
+202E;N # RIGHT-TO-LEFT OVERRIDE
+202F;N # NARROW NO-BREAK SPACE
+2030;A # PER MILLE SIGN
+2031;N # PER TEN THOUSAND SIGN
+2032;A # PRIME
+2033;A # DOUBLE PRIME
+2034;N # TRIPLE PRIME
+2035;A # REVERSED PRIME
+2036;N # REVERSED DOUBLE PRIME
+2037;N # REVERSED TRIPLE PRIME
+2038;N # CARET
+2039;N # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A;N # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B;A # REFERENCE MARK
+203C;N # DOUBLE EXCLAMATION MARK
+203D;N # INTERROBANG
+203E;A # OVERLINE
+203F;N # UNDERTIE
+2040;N # CHARACTER TIE
+2041;N # CARET INSERTION POINT
+2042;N # ASTERISM
+2043;N # HYPHEN BULLET
+2044;N # FRACTION SLASH
+2045;N # LEFT SQUARE BRACKET WITH QUILL
+2046;N # RIGHT SQUARE BRACKET WITH QUILL
+2047;N # DOUBLE QUESTION MARK
+2048;N # QUESTION EXCLAMATION MARK
+2049;N # EXCLAMATION QUESTION MARK
+204A;N # TIRONIAN SIGN ET
+204B;N # REVERSED PILCROW SIGN
+204C;N # BLACK LEFTWARDS BULLET
+204D;N # BLACK RIGHTWARDS BULLET
+204E;N # LOW ASTERISK
+204F;N # REVERSED SEMICOLON
+2050;N # CLOSE UP
+2051;N # TWO ASTERISKS ALIGNED VERTICALLY
+2052;N # COMMERCIAL MINUS SIGN
+2053;N # SWUNG DASH
+2054;N # INVERTED UNDERTIE
+2055;N # FLOWER PUNCTUATION MARK
+2056;N # THREE DOT PUNCTUATION
+2057;N # QUADRUPLE PRIME
+2058;N # FOUR DOT PUNCTUATION
+2059;N # FIVE DOT PUNCTUATION
+205A;N # TWO DOT PUNCTUATION
+205B;N # FOUR DOT MARK
+205C;N # DOTTED CROSS
+205D;N # TRICOLON
+205E;N # VERTICAL FOUR DOTS
+205F;N # MEDIUM MATHEMATICAL SPACE
+2060;N # WORD JOINER
+2061;N # FUNCTION APPLICATION
+2062;N # INVISIBLE TIMES
+2063;N # INVISIBLE SEPARATOR
+206A;N # INHIBIT SYMMETRIC SWAPPING
+206B;N # ACTIVATE SYMMETRIC SWAPPING
+206C;N # INHIBIT ARABIC FORM SHAPING
+206D;N # ACTIVATE ARABIC FORM SHAPING
+206E;N # NATIONAL DIGIT SHAPES
+206F;N # NOMINAL DIGIT SHAPES
+2070;N # SUPERSCRIPT ZERO
+2071;N # SUPERSCRIPT LATIN SMALL LETTER I
+2074;A # SUPERSCRIPT FOUR
+2075;N # SUPERSCRIPT FIVE
+2076;N # SUPERSCRIPT SIX
+2077;N # SUPERSCRIPT SEVEN
+2078;N # SUPERSCRIPT EIGHT
+2079;N # SUPERSCRIPT NINE
+207A;N # SUPERSCRIPT PLUS SIGN
+207B;N # SUPERSCRIPT MINUS
+207C;N # SUPERSCRIPT EQUALS SIGN
+207D;N # SUPERSCRIPT LEFT PARENTHESIS
+207E;N # SUPERSCRIPT RIGHT PARENTHESIS
+207F;A # SUPERSCRIPT LATIN SMALL LETTER N
+2080;N # SUBSCRIPT ZERO
+2081;A # SUBSCRIPT ONE
+2082;A # SUBSCRIPT TWO
+2083;A # SUBSCRIPT THREE
+2084;A # SUBSCRIPT FOUR
+2085;N # SUBSCRIPT FIVE
+2086;N # SUBSCRIPT SIX
+2087;N # SUBSCRIPT SEVEN
+2088;N # SUBSCRIPT EIGHT
+2089;N # SUBSCRIPT NINE
+208A;N # SUBSCRIPT PLUS SIGN
+208B;N # SUBSCRIPT MINUS
+208C;N # SUBSCRIPT EQUALS SIGN
+208D;N # SUBSCRIPT LEFT PARENTHESIS
+208E;N # SUBSCRIPT RIGHT PARENTHESIS
+2090;N # LATIN SUBSCRIPT SMALL LETTER A
+2091;N # LATIN SUBSCRIPT SMALL LETTER E
+2092;N # LATIN SUBSCRIPT SMALL LETTER O
+2093;N # LATIN SUBSCRIPT SMALL LETTER X
+2094;N # LATIN SUBSCRIPT SMALL LETTER SCHWA
+20A0;N # EURO-CURRENCY SIGN
+20A1;N # COLON SIGN
+20A2;N # CRUZEIRO SIGN
+20A3;N # FRENCH FRANC SIGN
+20A4;N # LIRA SIGN
+20A5;N # MILL SIGN
+20A6;N # NAIRA SIGN
+20A7;N # PESETA SIGN
+20A8;N # RUPEE SIGN
+20A9;H # WON SIGN
+20AA;N # NEW SHEQEL SIGN
+20AB;N # DONG SIGN
+20AC;A # EURO SIGN
+20AD;N # KIP SIGN
+20AE;N # TUGRIK SIGN
+20AF;N # DRACHMA SIGN
+20B0;N # GERMAN PENNY SIGN
+20B1;N # PESO SIGN
+20B2;N # GUARANI SIGN
+20B3;N # AUSTRAL SIGN
+20B4;N # HRYVNIA SIGN
+20B5;N # CEDI SIGN
+20D0;N # COMBINING LEFT HARPOON ABOVE
+20D1;N # COMBINING RIGHT HARPOON ABOVE
+20D2;N # COMBINING LONG VERTICAL LINE OVERLAY
+20D3;N # COMBINING SHORT VERTICAL LINE OVERLAY
+20D4;N # COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5;N # COMBINING CLOCKWISE ARROW ABOVE
+20D6;N # COMBINING LEFT ARROW ABOVE
+20D7;N # COMBINING RIGHT ARROW ABOVE
+20D8;N # COMBINING RING OVERLAY
+20D9;N # COMBINING CLOCKWISE RING OVERLAY
+20DA;N # COMBINING ANTICLOCKWISE RING OVERLAY
+20DB;N # COMBINING THREE DOTS ABOVE
+20DC;N # COMBINING FOUR DOTS ABOVE
+20DD;N # COMBINING ENCLOSING CIRCLE
+20DE;N # COMBINING ENCLOSING SQUARE
+20DF;N # COMBINING ENCLOSING DIAMOND
+20E0;N # COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1;N # COMBINING LEFT RIGHT ARROW ABOVE
+20E2;N # COMBINING ENCLOSING SCREEN
+20E3;N # COMBINING ENCLOSING KEYCAP
+20E4;N # COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5;N # COMBINING REVERSE SOLIDUS OVERLAY
+20E6;N # COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20E7;N # COMBINING ANNUITY SYMBOL
+20E8;N # COMBINING TRIPLE UNDERDOT
+20E9;N # COMBINING WIDE BRIDGE ABOVE
+20EA;N # COMBINING LEFTWARDS ARROW OVERLAY
+20EB;N # COMBINING LONG DOUBLE SOLIDUS OVERLAY
+2100;N # ACCOUNT OF
+2101;N # ADDRESSED TO THE SUBJECT
+2102;N # DOUBLE-STRUCK CAPITAL C
+2103;A # DEGREE CELSIUS
+2104;N # CENTRE LINE SYMBOL
+2105;A # CARE OF
+2106;N # CADA UNA
+2107;N # EULER CONSTANT
+2108;N # SCRUPLE
+2109;A # DEGREE FAHRENHEIT
+210A;N # SCRIPT SMALL G
+210B;N # SCRIPT CAPITAL H
+210C;N # BLACK-LETTER CAPITAL H
+210D;N # DOUBLE-STRUCK CAPITAL H
+210E;N # PLANCK CONSTANT
+210F;N # PLANCK CONSTANT OVER TWO PI
+2110;N # SCRIPT CAPITAL I
+2111;N # BLACK-LETTER CAPITAL I
+2112;N # SCRIPT CAPITAL L
+2113;A # SCRIPT SMALL L
+2114;N # L B BAR SYMBOL
+2115;N # DOUBLE-STRUCK CAPITAL N
+2116;A # NUMERO SIGN
+2117;N # SOUND RECORDING COPYRIGHT
+2118;N # SCRIPT CAPITAL P
+2119;N # DOUBLE-STRUCK CAPITAL P
+211A;N # DOUBLE-STRUCK CAPITAL Q
+211B;N # SCRIPT CAPITAL R
+211C;N # BLACK-LETTER CAPITAL R
+211D;N # DOUBLE-STRUCK CAPITAL R
+211E;N # PRESCRIPTION TAKE
+211F;N # RESPONSE
+2120;N # SERVICE MARK
+2121;A # TELEPHONE SIGN
+2122;A # TRADE MARK SIGN
+2123;N # VERSICLE
+2124;N # DOUBLE-STRUCK CAPITAL Z
+2125;N # OUNCE SIGN
+2126;A # OHM SIGN
+2127;N # INVERTED OHM SIGN
+2128;N # BLACK-LETTER CAPITAL Z
+2129;N # TURNED GREEK SMALL LETTER IOTA
+212A;N # KELVIN SIGN
+212B;A # ANGSTROM SIGN
+212C;N # SCRIPT CAPITAL B
+212D;N # BLACK-LETTER CAPITAL C
+212E;N # ESTIMATED SYMBOL
+212F;N # SCRIPT SMALL E
+2130;N # SCRIPT CAPITAL E
+2131;N # SCRIPT CAPITAL F
+2132;N # TURNED CAPITAL F
+2133;N # SCRIPT CAPITAL M
+2134;N # SCRIPT SMALL O
+2135;N # ALEF SYMBOL
+2136;N # BET SYMBOL
+2137;N # GIMEL SYMBOL
+2138;N # DALET SYMBOL
+2139;N # INFORMATION SOURCE
+213A;N # ROTATED CAPITAL Q
+213B;N # FACSIMILE SIGN
+213C;N # DOUBLE-STRUCK SMALL PI
+213D;N # DOUBLE-STRUCK SMALL GAMMA
+213E;N # DOUBLE-STRUCK CAPITAL GAMMA
+213F;N # DOUBLE-STRUCK CAPITAL PI
+2140;N # DOUBLE-STRUCK N-ARY SUMMATION
+2141;N # TURNED SANS-SERIF CAPITAL G
+2142;N # TURNED SANS-SERIF CAPITAL L
+2143;N # REVERSED SANS-SERIF CAPITAL L
+2144;N # TURNED SANS-SERIF CAPITAL Y
+2145;N # DOUBLE-STRUCK ITALIC CAPITAL D
+2146;N # DOUBLE-STRUCK ITALIC SMALL D
+2147;N # DOUBLE-STRUCK ITALIC SMALL E
+2148;N # DOUBLE-STRUCK ITALIC SMALL I
+2149;N # DOUBLE-STRUCK ITALIC SMALL J
+214A;N # PROPERTY LINE
+214B;N # TURNED AMPERSAND
+214C;N # PER SIGN
+2153;A # VULGAR FRACTION ONE THIRD
+2154;A # VULGAR FRACTION TWO THIRDS
+2155;N # VULGAR FRACTION ONE FIFTH
+2156;N # VULGAR FRACTION TWO FIFTHS
+2157;N # VULGAR FRACTION THREE FIFTHS
+2158;N # VULGAR FRACTION FOUR FIFTHS
+2159;N # VULGAR FRACTION ONE SIXTH
+215A;N # VULGAR FRACTION FIVE SIXTHS
+215B;A # VULGAR FRACTION ONE EIGHTH
+215C;A # VULGAR FRACTION THREE EIGHTHS
+215D;A # VULGAR FRACTION FIVE EIGHTHS
+215E;A # VULGAR FRACTION SEVEN EIGHTHS
+215F;N # FRACTION NUMERATOR ONE
+2160;A # ROMAN NUMERAL ONE
+2161;A # ROMAN NUMERAL TWO
+2162;A # ROMAN NUMERAL THREE
+2163;A # ROMAN NUMERAL FOUR
+2164;A # ROMAN NUMERAL FIVE
+2165;A # ROMAN NUMERAL SIX
+2166;A # ROMAN NUMERAL SEVEN
+2167;A # ROMAN NUMERAL EIGHT
+2168;A # ROMAN NUMERAL NINE
+2169;A # ROMAN NUMERAL TEN
+216A;A # ROMAN NUMERAL ELEVEN
+216B;A # ROMAN NUMERAL TWELVE
+216C;N # ROMAN NUMERAL FIFTY
+216D;N # ROMAN NUMERAL ONE HUNDRED
+216E;N # ROMAN NUMERAL FIVE HUNDRED
+216F;N # ROMAN NUMERAL ONE THOUSAND
+2170;A # SMALL ROMAN NUMERAL ONE
+2171;A # SMALL ROMAN NUMERAL TWO
+2172;A # SMALL ROMAN NUMERAL THREE
+2173;A # SMALL ROMAN NUMERAL FOUR
+2174;A # SMALL ROMAN NUMERAL FIVE
+2175;A # SMALL ROMAN NUMERAL SIX
+2176;A # SMALL ROMAN NUMERAL SEVEN
+2177;A # SMALL ROMAN NUMERAL EIGHT
+2178;A # SMALL ROMAN NUMERAL NINE
+2179;A # SMALL ROMAN NUMERAL TEN
+217A;N # SMALL ROMAN NUMERAL ELEVEN
+217B;N # SMALL ROMAN NUMERAL TWELVE
+217C;N # SMALL ROMAN NUMERAL FIFTY
+217D;N # SMALL ROMAN NUMERAL ONE HUNDRED
+217E;N # SMALL ROMAN NUMERAL FIVE HUNDRED
+217F;N # SMALL ROMAN NUMERAL ONE THOUSAND
+2180;N # ROMAN NUMERAL ONE THOUSAND C D
+2181;N # ROMAN NUMERAL FIVE THOUSAND
+2182;N # ROMAN NUMERAL TEN THOUSAND
+2183;N # ROMAN NUMERAL REVERSED ONE HUNDRED
+2190;A # LEFTWARDS ARROW
+2191;A # UPWARDS ARROW
+2192;A # RIGHTWARDS ARROW
+2193;A # DOWNWARDS ARROW
+2194;A # LEFT RIGHT ARROW
+2195;A # UP DOWN ARROW
+2196;A # NORTH WEST ARROW
+2197;A # NORTH EAST ARROW
+2198;A # SOUTH EAST ARROW
+2199;A # SOUTH WEST ARROW
+219A;N # LEFTWARDS ARROW WITH STROKE
+219B;N # RIGHTWARDS ARROW WITH STROKE
+219C;N # LEFTWARDS WAVE ARROW
+219D;N # RIGHTWARDS WAVE ARROW
+219E;N # LEFTWARDS TWO HEADED ARROW
+219F;N # UPWARDS TWO HEADED ARROW
+21A0;N # RIGHTWARDS TWO HEADED ARROW
+21A1;N # DOWNWARDS TWO HEADED ARROW
+21A2;N # LEFTWARDS ARROW WITH TAIL
+21A3;N # RIGHTWARDS ARROW WITH TAIL
+21A4;N # LEFTWARDS ARROW FROM BAR
+21A5;N # UPWARDS ARROW FROM BAR
+21A6;N # RIGHTWARDS ARROW FROM BAR
+21A7;N # DOWNWARDS ARROW FROM BAR
+21A8;N # UP DOWN ARROW WITH BASE
+21A9;N # LEFTWARDS ARROW WITH HOOK
+21AA;N # RIGHTWARDS ARROW WITH HOOK
+21AB;N # LEFTWARDS ARROW WITH LOOP
+21AC;N # RIGHTWARDS ARROW WITH LOOP
+21AD;N # LEFT RIGHT WAVE ARROW
+21AE;N # LEFT RIGHT ARROW WITH STROKE
+21AF;N # DOWNWARDS ZIGZAG ARROW
+21B0;N # UPWARDS ARROW WITH TIP LEFTWARDS
+21B1;N # UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2;N # DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3;N # DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4;N # RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5;N # DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6;N # ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7;N # CLOCKWISE TOP SEMICIRCLE ARROW
+21B8;A # NORTH WEST ARROW TO LONG BAR
+21B9;A # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA;N # ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB;N # CLOCKWISE OPEN CIRCLE ARROW
+21BC;N # LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD;N # LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE;N # UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF;N # UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0;N # RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1;N # RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2;N # DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3;N # DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4;N # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5;N # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6;N # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7;N # LEFTWARDS PAIRED ARROWS
+21C8;N # UPWARDS PAIRED ARROWS
+21C9;N # RIGHTWARDS PAIRED ARROWS
+21CA;N # DOWNWARDS PAIRED ARROWS
+21CB;N # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC;N # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD;N # LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE;N # LEFT RIGHT DOUBLE ARROW WITH STROKE
+21CF;N # RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0;N # LEFTWARDS DOUBLE ARROW
+21D1;N # UPWARDS DOUBLE ARROW
+21D2;A # RIGHTWARDS DOUBLE ARROW
+21D3;N # DOWNWARDS DOUBLE ARROW
+21D4;A # LEFT RIGHT DOUBLE ARROW
+21D5;N # UP DOWN DOUBLE ARROW
+21D6;N # NORTH WEST DOUBLE ARROW
+21D7;N # NORTH EAST DOUBLE ARROW
+21D8;N # SOUTH EAST DOUBLE ARROW
+21D9;N # SOUTH WEST DOUBLE ARROW
+21DA;N # LEFTWARDS TRIPLE ARROW
+21DB;N # RIGHTWARDS TRIPLE ARROW
+21DC;N # LEFTWARDS SQUIGGLE ARROW
+21DD;N # RIGHTWARDS SQUIGGLE ARROW
+21DE;N # UPWARDS ARROW WITH DOUBLE STROKE
+21DF;N # DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0;N # LEFTWARDS DASHED ARROW
+21E1;N # UPWARDS DASHED ARROW
+21E2;N # RIGHTWARDS DASHED ARROW
+21E3;N # DOWNWARDS DASHED ARROW
+21E4;N # LEFTWARDS ARROW TO BAR
+21E5;N # RIGHTWARDS ARROW TO BAR
+21E6;N # LEFTWARDS WHITE ARROW
+21E7;A # UPWARDS WHITE ARROW
+21E8;N # RIGHTWARDS WHITE ARROW
+21E9;N # DOWNWARDS WHITE ARROW
+21EA;N # UPWARDS WHITE ARROW FROM BAR
+21EB;N # UPWARDS WHITE ARROW ON PEDESTAL
+21EC;N # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED;N # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE;N # UPWARDS WHITE DOUBLE ARROW
+21EF;N # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0;N # RIGHTWARDS WHITE ARROW FROM WALL
+21F1;N # NORTH WEST ARROW TO CORNER
+21F2;N # SOUTH EAST ARROW TO CORNER
+21F3;N # UP DOWN WHITE ARROW
+21F4;N # RIGHT ARROW WITH SMALL CIRCLE
+21F5;N # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6;N # THREE RIGHTWARDS ARROWS
+21F7;N # LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8;N # RIGHTWARDS ARROW WITH VERTICAL STROKE
+21F9;N # LEFT RIGHT ARROW WITH VERTICAL STROKE
+21FA;N # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB;N # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FC;N # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+21FD;N # LEFTWARDS OPEN-HEADED ARROW
+21FE;N # RIGHTWARDS OPEN-HEADED ARROW
+21FF;N # LEFT RIGHT OPEN-HEADED ARROW
+2200;A # FOR ALL
+2201;N # COMPLEMENT
+2202;A # PARTIAL DIFFERENTIAL
+2203;A # THERE EXISTS
+2204;N # THERE DOES NOT EXIST
+2205;N # EMPTY SET
+2206;N # INCREMENT
+2207;A # NABLA
+2208;A # ELEMENT OF
+2209;N # NOT AN ELEMENT OF
+220A;N # SMALL ELEMENT OF
+220B;A # CONTAINS AS MEMBER
+220C;N # DOES NOT CONTAIN AS MEMBER
+220D;N # SMALL CONTAINS AS MEMBER
+220E;N # END OF PROOF
+220F;A # N-ARY PRODUCT
+2210;N # N-ARY COPRODUCT
+2211;A # N-ARY SUMMATION
+2212;N # MINUS SIGN
+2213;N # MINUS-OR-PLUS SIGN
+2214;N # DOT PLUS
+2215;A # DIVISION SLASH
+2216;N # SET MINUS
+2217;N # ASTERISK OPERATOR
+2218;N # RING OPERATOR
+2219;N # BULLET OPERATOR
+221A;A # SQUARE ROOT
+221B;N # CUBE ROOT
+221C;N # FOURTH ROOT
+221D;A # PROPORTIONAL TO
+221E;A # INFINITY
+221F;A # RIGHT ANGLE
+2220;A # ANGLE
+2221;N # MEASURED ANGLE
+2222;N # SPHERICAL ANGLE
+2223;A # DIVIDES
+2224;N # DOES NOT DIVIDE
+2225;A # PARALLEL TO
+2226;N # NOT PARALLEL TO
+2227;A # LOGICAL AND
+2228;A # LOGICAL OR
+2229;A # INTERSECTION
+222A;A # UNION
+222B;A # INTEGRAL
+222C;A # DOUBLE INTEGRAL
+222D;N # TRIPLE INTEGRAL
+222E;A # CONTOUR INTEGRAL
+222F;N # SURFACE INTEGRAL
+2230;N # VOLUME INTEGRAL
+2231;N # CLOCKWISE INTEGRAL
+2232;N # CLOCKWISE CONTOUR INTEGRAL
+2233;N # ANTICLOCKWISE CONTOUR INTEGRAL
+2234;A # THEREFORE
+2235;A # BECAUSE
+2236;A # RATIO
+2237;A # PROPORTION
+2238;N # DOT MINUS
+2239;N # EXCESS
+223A;N # GEOMETRIC PROPORTION
+223B;N # HOMOTHETIC
+223C;A # TILDE OPERATOR
+223D;A # REVERSED TILDE
+223E;N # INVERTED LAZY S
+223F;N # SINE WAVE
+2240;N # WREATH PRODUCT
+2241;N # NOT TILDE
+2242;N # MINUS TILDE
+2243;N # ASYMPTOTICALLY EQUAL TO
+2244;N # NOT ASYMPTOTICALLY EQUAL TO
+2245;N # APPROXIMATELY EQUAL TO
+2246;N # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247;N # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+2248;A # ALMOST EQUAL TO
+2249;N # NOT ALMOST EQUAL TO
+224A;N # ALMOST EQUAL OR EQUAL TO
+224B;N # TRIPLE TILDE
+224C;A # ALL EQUAL TO
+224D;N # EQUIVALENT TO
+224E;N # GEOMETRICALLY EQUIVALENT TO
+224F;N # DIFFERENCE BETWEEN
+2250;N # APPROACHES THE LIMIT
+2251;N # GEOMETRICALLY EQUAL TO
+2252;A # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253;N # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254;N # COLON EQUALS
+2255;N # EQUALS COLON
+2256;N # RING IN EQUAL TO
+2257;N # RING EQUAL TO
+2258;N # CORRESPONDS TO
+2259;N # ESTIMATES
+225A;N # EQUIANGULAR TO
+225B;N # STAR EQUALS
+225C;N # DELTA EQUAL TO
+225D;N # EQUAL TO BY DEFINITION
+225E;N # MEASURED BY
+225F;N # QUESTIONED EQUAL TO
+2260;A # NOT EQUAL TO
+2261;A # IDENTICAL TO
+2262;N # NOT IDENTICAL TO
+2263;N # STRICTLY EQUIVALENT TO
+2264;A # LESS-THAN OR EQUAL TO
+2265;A # GREATER-THAN OR EQUAL TO
+2266;A # LESS-THAN OVER EQUAL TO
+2267;A # GREATER-THAN OVER EQUAL TO
+2268;N # LESS-THAN BUT NOT EQUAL TO
+2269;N # GREATER-THAN BUT NOT EQUAL TO
+226A;A # MUCH LESS-THAN
+226B;A # MUCH GREATER-THAN
+226C;N # BETWEEN
+226D;N # NOT EQUIVALENT TO
+226E;A # NOT LESS-THAN
+226F;A # NOT GREATER-THAN
+2270;N # NEITHER LESS-THAN NOR EQUAL TO
+2271;N # NEITHER GREATER-THAN NOR EQUAL TO
+2272;N # LESS-THAN OR EQUIVALENT TO
+2273;N # GREATER-THAN OR EQUIVALENT TO
+2274;N # NEITHER LESS-THAN NOR EQUIVALENT TO
+2275;N # NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276;N # LESS-THAN OR GREATER-THAN
+2277;N # GREATER-THAN OR LESS-THAN
+2278;N # NEITHER LESS-THAN NOR GREATER-THAN
+2279;N # NEITHER GREATER-THAN NOR LESS-THAN
+227A;N # PRECEDES
+227B;N # SUCCEEDS
+227C;N # PRECEDES OR EQUAL TO
+227D;N # SUCCEEDS OR EQUAL TO
+227E;N # PRECEDES OR EQUIVALENT TO
+227F;N # SUCCEEDS OR EQUIVALENT TO
+2280;N # DOES NOT PRECEDE
+2281;N # DOES NOT SUCCEED
+2282;A # SUBSET OF
+2283;A # SUPERSET OF
+2284;N # NOT A SUBSET OF
+2285;N # NOT A SUPERSET OF
+2286;A # SUBSET OF OR EQUAL TO
+2287;A # SUPERSET OF OR EQUAL TO
+2288;N # NEITHER A SUBSET OF NOR EQUAL TO
+2289;N # NEITHER A SUPERSET OF NOR EQUAL TO
+228A;N # SUBSET OF WITH NOT EQUAL TO
+228B;N # SUPERSET OF WITH NOT EQUAL TO
+228C;N # MULTISET
+228D;N # MULTISET MULTIPLICATION
+228E;N # MULTISET UNION
+228F;N # SQUARE IMAGE OF
+2290;N # SQUARE ORIGINAL OF
+2291;N # SQUARE IMAGE OF OR EQUAL TO
+2292;N # SQUARE ORIGINAL OF OR EQUAL TO
+2293;N # SQUARE CAP
+2294;N # SQUARE CUP
+2295;A # CIRCLED PLUS
+2296;N # CIRCLED MINUS
+2297;N # CIRCLED TIMES
+2298;N # CIRCLED DIVISION SLASH
+2299;A # CIRCLED DOT OPERATOR
+229A;N # CIRCLED RING OPERATOR
+229B;N # CIRCLED ASTERISK OPERATOR
+229C;N # CIRCLED EQUALS
+229D;N # CIRCLED DASH
+229E;N # SQUARED PLUS
+229F;N # SQUARED MINUS
+22A0;N # SQUARED TIMES
+22A1;N # SQUARED DOT OPERATOR
+22A2;N # RIGHT TACK
+22A3;N # LEFT TACK
+22A4;N # DOWN TACK
+22A5;A # UP TACK
+22A6;N # ASSERTION
+22A7;N # MODELS
+22A8;N # TRUE
+22A9;N # FORCES
+22AA;N # TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB;N # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC;N # DOES NOT PROVE
+22AD;N # NOT TRUE
+22AE;N # DOES NOT FORCE
+22AF;N # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0;N # PRECEDES UNDER RELATION
+22B1;N # SUCCEEDS UNDER RELATION
+22B2;N # NORMAL SUBGROUP OF
+22B3;N # CONTAINS AS NORMAL SUBGROUP
+22B4;N # NORMAL SUBGROUP OF OR EQUAL TO
+22B5;N # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6;N # ORIGINAL OF
+22B7;N # IMAGE OF
+22B8;N # MULTIMAP
+22B9;N # HERMITIAN CONJUGATE MATRIX
+22BA;N # INTERCALATE
+22BB;N # XOR
+22BC;N # NAND
+22BD;N # NOR
+22BE;N # RIGHT ANGLE WITH ARC
+22BF;A # RIGHT TRIANGLE
+22C0;N # N-ARY LOGICAL AND
+22C1;N # N-ARY LOGICAL OR
+22C2;N # N-ARY INTERSECTION
+22C3;N # N-ARY UNION
+22C4;N # DIAMOND OPERATOR
+22C5;N # DOT OPERATOR
+22C6;N # STAR OPERATOR
+22C7;N # DIVISION TIMES
+22C8;N # BOWTIE
+22C9;N # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA;N # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB;N # LEFT SEMIDIRECT PRODUCT
+22CC;N # RIGHT SEMIDIRECT PRODUCT
+22CD;N # REVERSED TILDE EQUALS
+22CE;N # CURLY LOGICAL OR
+22CF;N # CURLY LOGICAL AND
+22D0;N # DOUBLE SUBSET
+22D1;N # DOUBLE SUPERSET
+22D2;N # DOUBLE INTERSECTION
+22D3;N # DOUBLE UNION
+22D4;N # PITCHFORK
+22D5;N # EQUAL AND PARALLEL TO
+22D6;N # LESS-THAN WITH DOT
+22D7;N # GREATER-THAN WITH DOT
+22D8;N # VERY MUCH LESS-THAN
+22D9;N # VERY MUCH GREATER-THAN
+22DA;N # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB;N # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC;N # EQUAL TO OR LESS-THAN
+22DD;N # EQUAL TO OR GREATER-THAN
+22DE;N # EQUAL TO OR PRECEDES
+22DF;N # EQUAL TO OR SUCCEEDS
+22E0;N # DOES NOT PRECEDE OR EQUAL
+22E1;N # DOES NOT SUCCEED OR EQUAL
+22E2;N # NOT SQUARE IMAGE OF OR EQUAL TO
+22E3;N # NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4;N # SQUARE IMAGE OF OR NOT EQUAL TO
+22E5;N # SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6;N # LESS-THAN BUT NOT EQUIVALENT TO
+22E7;N # GREATER-THAN BUT NOT EQUIVALENT TO
+22E8;N # PRECEDES BUT NOT EQUIVALENT TO
+22E9;N # SUCCEEDS BUT NOT EQUIVALENT TO
+22EA;N # NOT NORMAL SUBGROUP OF
+22EB;N # DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC;N # NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED;N # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22EE;N # VERTICAL ELLIPSIS
+22EF;N # MIDLINE HORIZONTAL ELLIPSIS
+22F0;N # UP RIGHT DIAGONAL ELLIPSIS
+22F1;N # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2;N # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3;N # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4;N # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5;N # ELEMENT OF WITH DOT ABOVE
+22F6;N # ELEMENT OF WITH OVERBAR
+22F7;N # SMALL ELEMENT OF WITH OVERBAR
+22F8;N # ELEMENT OF WITH UNDERBAR
+22F9;N # ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA;N # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB;N # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC;N # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD;N # CONTAINS WITH OVERBAR
+22FE;N # SMALL CONTAINS WITH OVERBAR
+22FF;N # Z NOTATION BAG MEMBERSHIP
+2300;N # DIAMETER SIGN
+2301;N # ELECTRIC ARROW
+2302;N # HOUSE
+2303;N # UP ARROWHEAD
+2304;N # DOWN ARROWHEAD
+2305;N # PROJECTIVE
+2306;N # PERSPECTIVE
+2307;N # WAVY LINE
+2308;N # LEFT CEILING
+2309;N # RIGHT CEILING
+230A;N # LEFT FLOOR
+230B;N # RIGHT FLOOR
+230C;N # BOTTOM RIGHT CROP
+230D;N # BOTTOM LEFT CROP
+230E;N # TOP RIGHT CROP
+230F;N # TOP LEFT CROP
+2310;N # REVERSED NOT SIGN
+2311;N # SQUARE LOZENGE
+2312;A # ARC
+2313;N # SEGMENT
+2314;N # SECTOR
+2315;N # TELEPHONE RECORDER
+2316;N # POSITION INDICATOR
+2317;N # VIEWDATA SQUARE
+2318;N # PLACE OF INTEREST SIGN
+2319;N # TURNED NOT SIGN
+231A;N # WATCH
+231B;N # HOURGLASS
+231C;N # TOP LEFT CORNER
+231D;N # TOP RIGHT CORNER
+231E;N # BOTTOM LEFT CORNER
+231F;N # BOTTOM RIGHT CORNER
+2320;N # TOP HALF INTEGRAL
+2321;N # BOTTOM HALF INTEGRAL
+2322;N # FROWN
+2323;N # SMILE
+2324;N # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325;N # OPTION KEY
+2326;N # ERASE TO THE RIGHT
+2327;N # X IN A RECTANGLE BOX
+2328;N # KEYBOARD
+2329;W # LEFT-POINTING ANGLE BRACKET
+232A;W # RIGHT-POINTING ANGLE BRACKET
+232B;N # ERASE TO THE LEFT
+232C;N # BENZENE RING
+232D;N # CYLINDRICITY
+232E;N # ALL AROUND-PROFILE
+232F;N # SYMMETRY
+2330;N # TOTAL RUNOUT
+2331;N # DIMENSION ORIGIN
+2332;N # CONICAL TAPER
+2333;N # SLOPE
+2334;N # COUNTERBORE
+2335;N # COUNTERSINK
+2336;N # APL FUNCTIONAL SYMBOL I-BEAM
+2337;N # APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338;N # APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339;N # APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A;N # APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B;N # APL FUNCTIONAL SYMBOL QUAD JOT
+233C;N # APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D;N # APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E;N # APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F;N # APL FUNCTIONAL SYMBOL SLASH BAR
+2340;N # APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341;N # APL FUNCTIONAL SYMBOL QUAD SLASH
+2342;N # APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343;N # APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344;N # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345;N # APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346;N # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347;N # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348;N # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349;N # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A;N # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B;N # APL FUNCTIONAL SYMBOL DELTA STILE
+234C;N # APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D;N # APL FUNCTIONAL SYMBOL QUAD DELTA
+234E;N # APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F;N # APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350;N # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351;N # APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352;N # APL FUNCTIONAL SYMBOL DEL STILE
+2353;N # APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354;N # APL FUNCTIONAL SYMBOL QUAD DEL
+2355;N # APL FUNCTIONAL SYMBOL UP TACK JOT
+2356;N # APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357;N # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358;N # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359;N # APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A;N # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B;N # APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C;N # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D;N # APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E;N # APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F;N # APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360;N # APL FUNCTIONAL SYMBOL QUAD COLON
+2361;N # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362;N # APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363;N # APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364;N # APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365;N # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366;N # APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367;N # APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368;N # APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369;N # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A;N # APL FUNCTIONAL SYMBOL COMMA BAR
+236B;N # APL FUNCTIONAL SYMBOL DEL TILDE
+236C;N # APL FUNCTIONAL SYMBOL ZILDE
+236D;N # APL FUNCTIONAL SYMBOL STILE TILDE
+236E;N # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F;N # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370;N # APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371;N # APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372;N # APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373;N # APL FUNCTIONAL SYMBOL IOTA
+2374;N # APL FUNCTIONAL SYMBOL RHO
+2375;N # APL FUNCTIONAL SYMBOL OMEGA
+2376;N # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377;N # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378;N # APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379;N # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A;N # APL FUNCTIONAL SYMBOL ALPHA
+237B;N # NOT CHECK MARK
+237C;N # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D;N # SHOULDERED OPEN BOX
+237E;N # BELL SYMBOL
+237F;N # VERTICAL LINE WITH MIDDLE DOT
+2380;N # INSERTION SYMBOL
+2381;N # CONTINUOUS UNDERLINE SYMBOL
+2382;N # DISCONTINUOUS UNDERLINE SYMBOL
+2383;N # EMPHASIS SYMBOL
+2384;N # COMPOSITION SYMBOL
+2385;N # WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386;N # ENTER SYMBOL
+2387;N # ALTERNATIVE KEY SYMBOL
+2388;N # HELM SYMBOL
+2389;N # CIRCLED HORIZONTAL BAR WITH NOTCH
+238A;N # CIRCLED TRIANGLE DOWN
+238B;N # BROKEN CIRCLE WITH NORTHWEST ARROW
+238C;N # UNDO SYMBOL
+238D;N # MONOSTABLE SYMBOL
+238E;N # HYSTERESIS SYMBOL
+238F;N # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390;N # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391;N # PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392;N # PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393;N # DIRECT CURRENT SYMBOL FORM TWO
+2394;N # SOFTWARE-FUNCTION SYMBOL
+2395;N # APL FUNCTIONAL SYMBOL QUAD
+2396;N # DECIMAL SEPARATOR KEY SYMBOL
+2397;N # PREVIOUS PAGE
+2398;N # NEXT PAGE
+2399;N # PRINT SCREEN SYMBOL
+239A;N # CLEAR SCREEN SYMBOL
+239B;N # LEFT PARENTHESIS UPPER HOOK
+239C;N # LEFT PARENTHESIS EXTENSION
+239D;N # LEFT PARENTHESIS LOWER HOOK
+239E;N # RIGHT PARENTHESIS UPPER HOOK
+239F;N # RIGHT PARENTHESIS EXTENSION
+23A0;N # RIGHT PARENTHESIS LOWER HOOK
+23A1;N # LEFT SQUARE BRACKET UPPER CORNER
+23A2;N # LEFT SQUARE BRACKET EXTENSION
+23A3;N # LEFT SQUARE BRACKET LOWER CORNER
+23A4;N # RIGHT SQUARE BRACKET UPPER CORNER
+23A5;N # RIGHT SQUARE BRACKET EXTENSION
+23A6;N # RIGHT SQUARE BRACKET LOWER CORNER
+23A7;N # LEFT CURLY BRACKET UPPER HOOK
+23A8;N # LEFT CURLY BRACKET MIDDLE PIECE
+23A9;N # LEFT CURLY BRACKET LOWER HOOK
+23AA;N # CURLY BRACKET EXTENSION
+23AB;N # RIGHT CURLY BRACKET UPPER HOOK
+23AC;N # RIGHT CURLY BRACKET MIDDLE PIECE
+23AD;N # RIGHT CURLY BRACKET LOWER HOOK
+23AE;N # INTEGRAL EXTENSION
+23AF;N # HORIZONTAL LINE EXTENSION
+23B0;N # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+23B1;N # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+23B2;N # SUMMATION TOP
+23B3;N # SUMMATION BOTTOM
+23B4;N # TOP SQUARE BRACKET
+23B5;N # BOTTOM SQUARE BRACKET
+23B6;N # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7;N # RADICAL SYMBOL BOTTOM
+23B8;N # LEFT VERTICAL BOX LINE
+23B9;N # RIGHT VERTICAL BOX LINE
+23BA;N # HORIZONTAL SCAN LINE-1
+23BB;N # HORIZONTAL SCAN LINE-3
+23BC;N # HORIZONTAL SCAN LINE-7
+23BD;N # HORIZONTAL SCAN LINE-9
+23BE;N # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+23BF;N # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+23C0;N # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3;N # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6;N # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9;N # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+23CA;N # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+23CB;N # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+23CC;N # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+23CD;N # SQUARE FOOT
+23CE;N # RETURN SYMBOL
+23CF;N # EJECT SYMBOL
+23D0;N # VERTICAL LINE EXTENSION
+23D1;N # METRICAL BREVE
+23D2;N # METRICAL LONG OVER SHORT
+23D3;N # METRICAL SHORT OVER LONG
+23D4;N # METRICAL LONG OVER TWO SHORTS
+23D5;N # METRICAL TWO SHORTS OVER LONG
+23D6;N # METRICAL TWO SHORTS JOINED
+23D7;N # METRICAL TRISEME
+23D8;N # METRICAL TETRASEME
+23D9;N # METRICAL PENTASEME
+23DA;N # EARTH GROUND
+23DB;N # FUSE
+2400;N # SYMBOL FOR NULL
+2401;N # SYMBOL FOR START OF HEADING
+2402;N # SYMBOL FOR START OF TEXT
+2403;N # SYMBOL FOR END OF TEXT
+2404;N # SYMBOL FOR END OF TRANSMISSION
+2405;N # SYMBOL FOR ENQUIRY
+2406;N # SYMBOL FOR ACKNOWLEDGE
+2407;N # SYMBOL FOR BELL
+2408;N # SYMBOL FOR BACKSPACE
+2409;N # SYMBOL FOR HORIZONTAL TABULATION
+240A;N # SYMBOL FOR LINE FEED
+240B;N # SYMBOL FOR VERTICAL TABULATION
+240C;N # SYMBOL FOR FORM FEED
+240D;N # SYMBOL FOR CARRIAGE RETURN
+240E;N # SYMBOL FOR SHIFT OUT
+240F;N # SYMBOL FOR SHIFT IN
+2410;N # SYMBOL FOR DATA LINK ESCAPE
+2411;N # SYMBOL FOR DEVICE CONTROL ONE
+2412;N # SYMBOL FOR DEVICE CONTROL TWO
+2413;N # SYMBOL FOR DEVICE CONTROL THREE
+2414;N # SYMBOL FOR DEVICE CONTROL FOUR
+2415;N # SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416;N # SYMBOL FOR SYNCHRONOUS IDLE
+2417;N # SYMBOL FOR END OF TRANSMISSION BLOCK
+2418;N # SYMBOL FOR CANCEL
+2419;N # SYMBOL FOR END OF MEDIUM
+241A;N # SYMBOL FOR SUBSTITUTE
+241B;N # SYMBOL FOR ESCAPE
+241C;N # SYMBOL FOR FILE SEPARATOR
+241D;N # SYMBOL FOR GROUP SEPARATOR
+241E;N # SYMBOL FOR RECORD SEPARATOR
+241F;N # SYMBOL FOR UNIT SEPARATOR
+2420;N # SYMBOL FOR SPACE
+2421;N # SYMBOL FOR DELETE
+2422;N # BLANK SYMBOL
+2423;N # OPEN BOX
+2424;N # SYMBOL FOR NEWLINE
+2425;N # SYMBOL FOR DELETE FORM TWO
+2426;N # SYMBOL FOR SUBSTITUTE FORM TWO
+2440;N # OCR HOOK
+2441;N # OCR CHAIR
+2442;N # OCR FORK
+2443;N # OCR INVERTED FORK
+2444;N # OCR BELT BUCKLE
+2445;N # OCR BOW TIE
+2446;N # OCR BRANCH BANK IDENTIFICATION
+2447;N # OCR AMOUNT OF CHECK
+2448;N # OCR DASH
+2449;N # OCR CUSTOMER ACCOUNT NUMBER
+244A;N # OCR DOUBLE BACKSLASH
+2460;A # CIRCLED DIGIT ONE
+2461;A # CIRCLED DIGIT TWO
+2462;A # CIRCLED DIGIT THREE
+2463;A # CIRCLED DIGIT FOUR
+2464;A # CIRCLED DIGIT FIVE
+2465;A # CIRCLED DIGIT SIX
+2466;A # CIRCLED DIGIT SEVEN
+2467;A # CIRCLED DIGIT EIGHT
+2468;A # CIRCLED DIGIT NINE
+2469;A # CIRCLED NUMBER TEN
+246A;A # CIRCLED NUMBER ELEVEN
+246B;A # CIRCLED NUMBER TWELVE
+246C;A # CIRCLED NUMBER THIRTEEN
+246D;A # CIRCLED NUMBER FOURTEEN
+246E;A # CIRCLED NUMBER FIFTEEN
+246F;A # CIRCLED NUMBER SIXTEEN
+2470;A # CIRCLED NUMBER SEVENTEEN
+2471;A # CIRCLED NUMBER EIGHTEEN
+2472;A # CIRCLED NUMBER NINETEEN
+2473;A # CIRCLED NUMBER TWENTY
+2474;A # PARENTHESIZED DIGIT ONE
+2475;A # PARENTHESIZED DIGIT TWO
+2476;A # PARENTHESIZED DIGIT THREE
+2477;A # PARENTHESIZED DIGIT FOUR
+2478;A # PARENTHESIZED DIGIT FIVE
+2479;A # PARENTHESIZED DIGIT SIX
+247A;A # PARENTHESIZED DIGIT SEVEN
+247B;A # PARENTHESIZED DIGIT EIGHT
+247C;A # PARENTHESIZED DIGIT NINE
+247D;A # PARENTHESIZED NUMBER TEN
+247E;A # PARENTHESIZED NUMBER ELEVEN
+247F;A # PARENTHESIZED NUMBER TWELVE
+2480;A # PARENTHESIZED NUMBER THIRTEEN
+2481;A # PARENTHESIZED NUMBER FOURTEEN
+2482;A # PARENTHESIZED NUMBER FIFTEEN
+2483;A # PARENTHESIZED NUMBER SIXTEEN
+2484;A # PARENTHESIZED NUMBER SEVENTEEN
+2485;A # PARENTHESIZED NUMBER EIGHTEEN
+2486;A # PARENTHESIZED NUMBER NINETEEN
+2487;A # PARENTHESIZED NUMBER TWENTY
+2488;A # DIGIT ONE FULL STOP
+2489;A # DIGIT TWO FULL STOP
+248A;A # DIGIT THREE FULL STOP
+248B;A # DIGIT FOUR FULL STOP
+248C;A # DIGIT FIVE FULL STOP
+248D;A # DIGIT SIX FULL STOP
+248E;A # DIGIT SEVEN FULL STOP
+248F;A # DIGIT EIGHT FULL STOP
+2490;A # DIGIT NINE FULL STOP
+2491;A # NUMBER TEN FULL STOP
+2492;A # NUMBER ELEVEN FULL STOP
+2493;A # NUMBER TWELVE FULL STOP
+2494;A # NUMBER THIRTEEN FULL STOP
+2495;A # NUMBER FOURTEEN FULL STOP
+2496;A # NUMBER FIFTEEN FULL STOP
+2497;A # NUMBER SIXTEEN FULL STOP
+2498;A # NUMBER SEVENTEEN FULL STOP
+2499;A # NUMBER EIGHTEEN FULL STOP
+249A;A # NUMBER NINETEEN FULL STOP
+249B;A # NUMBER TWENTY FULL STOP
+249C;A # PARENTHESIZED LATIN SMALL LETTER A
+249D;A # PARENTHESIZED LATIN SMALL LETTER B
+249E;A # PARENTHESIZED LATIN SMALL LETTER C
+249F;A # PARENTHESIZED LATIN SMALL LETTER D
+24A0;A # PARENTHESIZED LATIN SMALL LETTER E
+24A1;A # PARENTHESIZED LATIN SMALL LETTER F
+24A2;A # PARENTHESIZED LATIN SMALL LETTER G
+24A3;A # PARENTHESIZED LATIN SMALL LETTER H
+24A4;A # PARENTHESIZED LATIN SMALL LETTER I
+24A5;A # PARENTHESIZED LATIN SMALL LETTER J
+24A6;A # PARENTHESIZED LATIN SMALL LETTER K
+24A7;A # PARENTHESIZED LATIN SMALL LETTER L
+24A8;A # PARENTHESIZED LATIN SMALL LETTER M
+24A9;A # PARENTHESIZED LATIN SMALL LETTER N
+24AA;A # PARENTHESIZED LATIN SMALL LETTER O
+24AB;A # PARENTHESIZED LATIN SMALL LETTER P
+24AC;A # PARENTHESIZED LATIN SMALL LETTER Q
+24AD;A # PARENTHESIZED LATIN SMALL LETTER R
+24AE;A # PARENTHESIZED LATIN SMALL LETTER S
+24AF;A # PARENTHESIZED LATIN SMALL LETTER T
+24B0;A # PARENTHESIZED LATIN SMALL LETTER U
+24B1;A # PARENTHESIZED LATIN SMALL LETTER V
+24B2;A # PARENTHESIZED LATIN SMALL LETTER W
+24B3;A # PARENTHESIZED LATIN SMALL LETTER X
+24B4;A # PARENTHESIZED LATIN SMALL LETTER Y
+24B5;A # PARENTHESIZED LATIN SMALL LETTER Z
+24B6;A # CIRCLED LATIN CAPITAL LETTER A
+24B7;A # CIRCLED LATIN CAPITAL LETTER B
+24B8;A # CIRCLED LATIN CAPITAL LETTER C
+24B9;A # CIRCLED LATIN CAPITAL LETTER D
+24BA;A # CIRCLED LATIN CAPITAL LETTER E
+24BB;A # CIRCLED LATIN CAPITAL LETTER F
+24BC;A # CIRCLED LATIN CAPITAL LETTER G
+24BD;A # CIRCLED LATIN CAPITAL LETTER H
+24BE;A # CIRCLED LATIN CAPITAL LETTER I
+24BF;A # CIRCLED LATIN CAPITAL LETTER J
+24C0;A # CIRCLED LATIN CAPITAL LETTER K
+24C1;A # CIRCLED LATIN CAPITAL LETTER L
+24C2;A # CIRCLED LATIN CAPITAL LETTER M
+24C3;A # CIRCLED LATIN CAPITAL LETTER N
+24C4;A # CIRCLED LATIN CAPITAL LETTER O
+24C5;A # CIRCLED LATIN CAPITAL LETTER P
+24C6;A # CIRCLED LATIN CAPITAL LETTER Q
+24C7;A # CIRCLED LATIN CAPITAL LETTER R
+24C8;A # CIRCLED LATIN CAPITAL LETTER S
+24C9;A # CIRCLED LATIN CAPITAL LETTER T
+24CA;A # CIRCLED LATIN CAPITAL LETTER U
+24CB;A # CIRCLED LATIN CAPITAL LETTER V
+24CC;A # CIRCLED LATIN CAPITAL LETTER W
+24CD;A # CIRCLED LATIN CAPITAL LETTER X
+24CE;A # CIRCLED LATIN CAPITAL LETTER Y
+24CF;A # CIRCLED LATIN CAPITAL LETTER Z
+24D0;A # CIRCLED LATIN SMALL LETTER A
+24D1;A # CIRCLED LATIN SMALL LETTER B
+24D2;A # CIRCLED LATIN SMALL LETTER C
+24D3;A # CIRCLED LATIN SMALL LETTER D
+24D4;A # CIRCLED LATIN SMALL LETTER E
+24D5;A # CIRCLED LATIN SMALL LETTER F
+24D6;A # CIRCLED LATIN SMALL LETTER G
+24D7;A # CIRCLED LATIN SMALL LETTER H
+24D8;A # CIRCLED LATIN SMALL LETTER I
+24D9;A # CIRCLED LATIN SMALL LETTER J
+24DA;A # CIRCLED LATIN SMALL LETTER K
+24DB;A # CIRCLED LATIN SMALL LETTER L
+24DC;A # CIRCLED LATIN SMALL LETTER M
+24DD;A # CIRCLED LATIN SMALL LETTER N
+24DE;A # CIRCLED LATIN SMALL LETTER O
+24DF;A # CIRCLED LATIN SMALL LETTER P
+24E0;A # CIRCLED LATIN SMALL LETTER Q
+24E1;A # CIRCLED LATIN SMALL LETTER R
+24E2;A # CIRCLED LATIN SMALL LETTER S
+24E3;A # CIRCLED LATIN SMALL LETTER T
+24E4;A # CIRCLED LATIN SMALL LETTER U
+24E5;A # CIRCLED LATIN SMALL LETTER V
+24E6;A # CIRCLED LATIN SMALL LETTER W
+24E7;A # CIRCLED LATIN SMALL LETTER X
+24E8;A # CIRCLED LATIN SMALL LETTER Y
+24E9;A # CIRCLED LATIN SMALL LETTER Z
+24EA;N # CIRCLED DIGIT ZERO
+24EB;A # NEGATIVE CIRCLED NUMBER ELEVEN
+24EC;A # NEGATIVE CIRCLED NUMBER TWELVE
+24ED;A # NEGATIVE CIRCLED NUMBER THIRTEEN
+24EE;A # NEGATIVE CIRCLED NUMBER FOURTEEN
+24EF;A # NEGATIVE CIRCLED NUMBER FIFTEEN
+24F0;A # NEGATIVE CIRCLED NUMBER SIXTEEN
+24F1;A # NEGATIVE CIRCLED NUMBER SEVENTEEN
+24F2;A # NEGATIVE CIRCLED NUMBER EIGHTEEN
+24F3;A # NEGATIVE CIRCLED NUMBER NINETEEN
+24F4;A # NEGATIVE CIRCLED NUMBER TWENTY
+24F5;A # DOUBLE CIRCLED DIGIT ONE
+24F6;A # DOUBLE CIRCLED DIGIT TWO
+24F7;A # DOUBLE CIRCLED DIGIT THREE
+24F8;A # DOUBLE CIRCLED DIGIT FOUR
+24F9;A # DOUBLE CIRCLED DIGIT FIVE
+24FA;A # DOUBLE CIRCLED DIGIT SIX
+24FB;A # DOUBLE CIRCLED DIGIT SEVEN
+24FC;A # DOUBLE CIRCLED DIGIT EIGHT
+24FD;A # DOUBLE CIRCLED DIGIT NINE
+24FE;A # DOUBLE CIRCLED NUMBER TEN
+24FF;A # NEGATIVE CIRCLED DIGIT ZERO
+2500;A # BOX DRAWINGS LIGHT HORIZONTAL
+2501;A # BOX DRAWINGS HEAVY HORIZONTAL
+2502;A # BOX DRAWINGS LIGHT VERTICAL
+2503;A # BOX DRAWINGS HEAVY VERTICAL
+2504;A # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505;A # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506;A # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507;A # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508;A # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509;A # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A;A # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B;A # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C;A # BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D;A # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E;A # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F;A # BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510;A # BOX DRAWINGS LIGHT DOWN AND LEFT
+2511;A # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512;A # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513;A # BOX DRAWINGS HEAVY DOWN AND LEFT
+2514;A # BOX DRAWINGS LIGHT UP AND RIGHT
+2515;A # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516;A # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517;A # BOX DRAWINGS HEAVY UP AND RIGHT
+2518;A # BOX DRAWINGS LIGHT UP AND LEFT
+2519;A # BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A;A # BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B;A # BOX DRAWINGS HEAVY UP AND LEFT
+251C;A # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D;A # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E;A # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F;A # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520;A # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521;A # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522;A # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523;A # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524;A # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525;A # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526;A # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527;A # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528;A # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529;A # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A;A # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B;A # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C;A # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D;A # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E;A # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F;A # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530;A # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531;A # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532;A # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533;A # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534;A # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535;A # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536;A # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537;A # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538;A # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539;A # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A;A # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B;A # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C;A # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D;A # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E;A # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F;A # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540;A # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541;A # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542;A # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543;A # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544;A # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545;A # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546;A # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547;A # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548;A # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549;A # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A;A # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B;A # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C;N # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D;N # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E;N # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F;N # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550;A # BOX DRAWINGS DOUBLE HORIZONTAL
+2551;A # BOX DRAWINGS DOUBLE VERTICAL
+2552;A # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553;A # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554;A # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555;A # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556;A # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557;A # BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558;A # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559;A # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A;A # BOX DRAWINGS DOUBLE UP AND RIGHT
+255B;A # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C;A # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D;A # BOX DRAWINGS DOUBLE UP AND LEFT
+255E;A # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F;A # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560;A # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561;A # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562;A # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563;A # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564;A # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565;A # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566;A # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567;A # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568;A # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569;A # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A;A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B;A # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C;A # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D;A # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E;A # BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F;A # BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570;A # BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571;A # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572;A # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573;A # BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574;N # BOX DRAWINGS LIGHT LEFT
+2575;N # BOX DRAWINGS LIGHT UP
+2576;N # BOX DRAWINGS LIGHT RIGHT
+2577;N # BOX DRAWINGS LIGHT DOWN
+2578;N # BOX DRAWINGS HEAVY LEFT
+2579;N # BOX DRAWINGS HEAVY UP
+257A;N # BOX DRAWINGS HEAVY RIGHT
+257B;N # BOX DRAWINGS HEAVY DOWN
+257C;N # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D;N # BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E;N # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F;N # BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580;A # UPPER HALF BLOCK
+2581;A # LOWER ONE EIGHTH BLOCK
+2582;A # LOWER ONE QUARTER BLOCK
+2583;A # LOWER THREE EIGHTHS BLOCK
+2584;A # LOWER HALF BLOCK
+2585;A # LOWER FIVE EIGHTHS BLOCK
+2586;A # LOWER THREE QUARTERS BLOCK
+2587;A # LOWER SEVEN EIGHTHS BLOCK
+2588;A # FULL BLOCK
+2589;A # LEFT SEVEN EIGHTHS BLOCK
+258A;A # LEFT THREE QUARTERS BLOCK
+258B;A # LEFT FIVE EIGHTHS BLOCK
+258C;A # LEFT HALF BLOCK
+258D;A # LEFT THREE EIGHTHS BLOCK
+258E;A # LEFT ONE QUARTER BLOCK
+258F;A # LEFT ONE EIGHTH BLOCK
+2590;N # RIGHT HALF BLOCK
+2591;N # LIGHT SHADE
+2592;A # MEDIUM SHADE
+2593;A # DARK SHADE
+2594;A # UPPER ONE EIGHTH BLOCK
+2595;A # RIGHT ONE EIGHTH BLOCK
+2596;N # QUADRANT LOWER LEFT
+2597;N # QUADRANT LOWER RIGHT
+2598;N # QUADRANT UPPER LEFT
+2599;N # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A;N # QUADRANT UPPER LEFT AND LOWER RIGHT
+259B;N # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C;N # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D;N # QUADRANT UPPER RIGHT
+259E;N # QUADRANT UPPER RIGHT AND LOWER LEFT
+259F;N # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0;A # BLACK SQUARE
+25A1;A # WHITE SQUARE
+25A2;N # WHITE SQUARE WITH ROUNDED CORNERS
+25A3;A # WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4;A # SQUARE WITH HORIZONTAL FILL
+25A5;A # SQUARE WITH VERTICAL FILL
+25A6;A # SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7;A # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8;A # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9;A # SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA;N # BLACK SMALL SQUARE
+25AB;N # WHITE SMALL SQUARE
+25AC;N # BLACK RECTANGLE
+25AD;N # WHITE RECTANGLE
+25AE;N # BLACK VERTICAL RECTANGLE
+25AF;N # WHITE VERTICAL RECTANGLE
+25B0;N # BLACK PARALLELOGRAM
+25B1;N # WHITE PARALLELOGRAM
+25B2;A # BLACK UP-POINTING TRIANGLE
+25B3;A # WHITE UP-POINTING TRIANGLE
+25B4;N # BLACK UP-POINTING SMALL TRIANGLE
+25B5;N # WHITE UP-POINTING SMALL TRIANGLE
+25B6;A # BLACK RIGHT-POINTING TRIANGLE
+25B7;A # WHITE RIGHT-POINTING TRIANGLE
+25B8;N # BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9;N # WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA;N # BLACK RIGHT-POINTING POINTER
+25BB;N # WHITE RIGHT-POINTING POINTER
+25BC;A # BLACK DOWN-POINTING TRIANGLE
+25BD;A # WHITE DOWN-POINTING TRIANGLE
+25BE;N # BLACK DOWN-POINTING SMALL TRIANGLE
+25BF;N # WHITE DOWN-POINTING SMALL TRIANGLE
+25C0;A # BLACK LEFT-POINTING TRIANGLE
+25C1;A # WHITE LEFT-POINTING TRIANGLE
+25C2;N # BLACK LEFT-POINTING SMALL TRIANGLE
+25C3;N # WHITE LEFT-POINTING SMALL TRIANGLE
+25C4;N # BLACK LEFT-POINTING POINTER
+25C5;N # WHITE LEFT-POINTING POINTER
+25C6;A # BLACK DIAMOND
+25C7;A # WHITE DIAMOND
+25C8;A # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9;N # FISHEYE
+25CA;N # LOZENGE
+25CB;A # WHITE CIRCLE
+25CC;N # DOTTED CIRCLE
+25CD;N # CIRCLE WITH VERTICAL FILL
+25CE;A # BULLSEYE
+25CF;A # BLACK CIRCLE
+25D0;A # CIRCLE WITH LEFT HALF BLACK
+25D1;A # CIRCLE WITH RIGHT HALF BLACK
+25D2;N # CIRCLE WITH LOWER HALF BLACK
+25D3;N # CIRCLE WITH UPPER HALF BLACK
+25D4;N # CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5;N # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6;N # LEFT HALF BLACK CIRCLE
+25D7;N # RIGHT HALF BLACK CIRCLE
+25D8;N # INVERSE BULLET
+25D9;N # INVERSE WHITE CIRCLE
+25DA;N # UPPER HALF INVERSE WHITE CIRCLE
+25DB;N # LOWER HALF INVERSE WHITE CIRCLE
+25DC;N # UPPER LEFT QUADRANT CIRCULAR ARC
+25DD;N # UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE;N # LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF;N # LOWER LEFT QUADRANT CIRCULAR ARC
+25E0;N # UPPER HALF CIRCLE
+25E1;N # LOWER HALF CIRCLE
+25E2;A # BLACK LOWER RIGHT TRIANGLE
+25E3;A # BLACK LOWER LEFT TRIANGLE
+25E4;A # BLACK UPPER LEFT TRIANGLE
+25E5;A # BLACK UPPER RIGHT TRIANGLE
+25E6;N # WHITE BULLET
+25E7;N # SQUARE WITH LEFT HALF BLACK
+25E8;N # SQUARE WITH RIGHT HALF BLACK
+25E9;N # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA;N # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB;N # WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC;N # WHITE UP-POINTING TRIANGLE WITH DOT
+25ED;N # UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE;N # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF;A # LARGE CIRCLE
+25F0;N # WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1;N # WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2;N # WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3;N # WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4;N # WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5;N # WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6;N # WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7;N # WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8;N # UPPER LEFT TRIANGLE
+25F9;N # UPPER RIGHT TRIANGLE
+25FA;N # LOWER LEFT TRIANGLE
+25FB;N # WHITE MEDIUM SQUARE
+25FC;N # BLACK MEDIUM SQUARE
+25FD;N # WHITE MEDIUM SMALL SQUARE
+25FE;N # BLACK MEDIUM SMALL SQUARE
+25FF;N # LOWER RIGHT TRIANGLE
+2600;N # BLACK SUN WITH RAYS
+2601;N # CLOUD
+2602;N # UMBRELLA
+2603;N # SNOWMAN
+2604;N # COMET
+2605;A # BLACK STAR
+2606;A # WHITE STAR
+2607;N # LIGHTNING
+2608;N # THUNDERSTORM
+2609;A # SUN
+260A;N # ASCENDING NODE
+260B;N # DESCENDING NODE
+260C;N # CONJUNCTION
+260D;N # OPPOSITION
+260E;A # BLACK TELEPHONE
+260F;A # WHITE TELEPHONE
+2610;N # BALLOT BOX
+2611;N # BALLOT BOX WITH CHECK
+2612;N # BALLOT BOX WITH X
+2613;N # SALTIRE
+2614;A # UMBRELLA WITH RAIN DROPS
+2615;A # HOT BEVERAGE
+2616;N # WHITE SHOGI PIECE
+2617;N # BLACK SHOGI PIECE
+2618;N # SHAMROCK
+2619;N # REVERSED ROTATED FLORAL HEART BULLET
+261A;N # BLACK LEFT POINTING INDEX
+261B;N # BLACK RIGHT POINTING INDEX
+261C;A # WHITE LEFT POINTING INDEX
+261D;N # WHITE UP POINTING INDEX
+261E;A # WHITE RIGHT POINTING INDEX
+261F;N # WHITE DOWN POINTING INDEX
+2620;N # SKULL AND CROSSBONES
+2621;N # CAUTION SIGN
+2622;N # RADIOACTIVE SIGN
+2623;N # BIOHAZARD SIGN
+2624;N # CADUCEUS
+2625;N # ANKH
+2626;N # ORTHODOX CROSS
+2627;N # CHI RHO
+2628;N # CROSS OF LORRAINE
+2629;N # CROSS OF JERUSALEM
+262A;N # STAR AND CRESCENT
+262B;N # FARSI SYMBOL
+262C;N # ADI SHAKTI
+262D;N # HAMMER AND SICKLE
+262E;N # PEACE SYMBOL
+262F;N # YIN YANG
+2630;N # TRIGRAM FOR HEAVEN
+2631;N # TRIGRAM FOR LAKE
+2632;N # TRIGRAM FOR FIRE
+2633;N # TRIGRAM FOR THUNDER
+2634;N # TRIGRAM FOR WIND
+2635;N # TRIGRAM FOR WATER
+2636;N # TRIGRAM FOR MOUNTAIN
+2637;N # TRIGRAM FOR EARTH
+2638;N # WHEEL OF DHARMA
+2639;N # WHITE FROWNING FACE
+263A;N # WHITE SMILING FACE
+263B;N # BLACK SMILING FACE
+263C;N # WHITE SUN WITH RAYS
+263D;N # FIRST QUARTER MOON
+263E;N # LAST QUARTER MOON
+263F;N # MERCURY
+2640;A # FEMALE SIGN
+2641;N # EARTH
+2642;A # MALE SIGN
+2643;N # JUPITER
+2644;N # SATURN
+2645;N # URANUS
+2646;N # NEPTUNE
+2647;N # PLUTO
+2648;N # ARIES
+2649;N # TAURUS
+264A;N # GEMINI
+264B;N # CANCER
+264C;N # LEO
+264D;N # VIRGO
+264E;N # LIBRA
+264F;N # SCORPIUS
+2650;N # SAGITTARIUS
+2651;N # CAPRICORN
+2652;N # AQUARIUS
+2653;N # PISCES
+2654;N # WHITE CHESS KING
+2655;N # WHITE CHESS QUEEN
+2656;N # WHITE CHESS ROOK
+2657;N # WHITE CHESS BISHOP
+2658;N # WHITE CHESS KNIGHT
+2659;N # WHITE CHESS PAWN
+265A;N # BLACK CHESS KING
+265B;N # BLACK CHESS QUEEN
+265C;N # BLACK CHESS ROOK
+265D;N # BLACK CHESS BISHOP
+265E;N # BLACK CHESS KNIGHT
+265F;N # BLACK CHESS PAWN
+2660;A # BLACK SPADE SUIT
+2661;A # WHITE HEART SUIT
+2662;N # WHITE DIAMOND SUIT
+2663;A # BLACK CLUB SUIT
+2664;A # WHITE SPADE SUIT
+2665;A # BLACK HEART SUIT
+2666;N # BLACK DIAMOND SUIT
+2667;A # WHITE CLUB SUIT
+2668;A # HOT SPRINGS
+2669;A # QUARTER NOTE
+266A;A # EIGHTH NOTE
+266B;N # BEAMED EIGHTH NOTES
+266C;A # BEAMED SIXTEENTH NOTES
+266D;A # MUSIC FLAT SIGN
+266E;N # MUSIC NATURAL SIGN
+266F;A # MUSIC SHARP SIGN
+2670;N # WEST SYRIAC CROSS
+2671;N # EAST SYRIAC CROSS
+2672;N # UNIVERSAL RECYCLING SYMBOL
+2673;N # RECYCLING SYMBOL FOR TYPE-1 PLASTICS
+2674;N # RECYCLING SYMBOL FOR TYPE-2 PLASTICS
+2675;N # RECYCLING SYMBOL FOR TYPE-3 PLASTICS
+2676;N # RECYCLING SYMBOL FOR TYPE-4 PLASTICS
+2677;N # RECYCLING SYMBOL FOR TYPE-5 PLASTICS
+2678;N # RECYCLING SYMBOL FOR TYPE-6 PLASTICS
+2679;N # RECYCLING SYMBOL FOR TYPE-7 PLASTICS
+267A;N # RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B;N # BLACK UNIVERSAL RECYCLING SYMBOL
+267C;N # RECYCLED PAPER SYMBOL
+267D;N # PARTIALLY-RECYCLED PAPER SYMBOL
+267E;N # PERMANENT PAPER SIGN
+267F;N # WHEELCHAIR SYMBOL
+2680;N # DIE FACE-1
+2681;N # DIE FACE-2
+2682;N # DIE FACE-3
+2683;N # DIE FACE-4
+2684;N # DIE FACE-5
+2685;N # DIE FACE-6
+2686;N # WHITE CIRCLE WITH DOT RIGHT
+2687;N # WHITE CIRCLE WITH TWO DOTS
+2688;N # BLACK CIRCLE WITH WHITE DOT RIGHT
+2689;N # BLACK CIRCLE WITH TWO WHITE DOTS
+268A;N # MONOGRAM FOR YANG
+268B;N # MONOGRAM FOR YIN
+268C;N # DIGRAM FOR GREATER YANG
+268D;N # DIGRAM FOR LESSER YIN
+268E;N # DIGRAM FOR LESSER YANG
+268F;N # DIGRAM FOR GREATER YIN
+2690;N # WHITE FLAG
+2691;N # BLACK FLAG
+2692;N # HAMMER AND PICK
+2693;N # ANCHOR
+2694;N # CROSSED SWORDS
+2695;N # STAFF OF AESCULAPIUS
+2696;N # SCALES
+2697;N # ALEMBIC
+2698;N # FLOWER
+2699;N # GEAR
+269A;N # STAFF OF HERMES
+269B;N # ATOM SYMBOL
+269C;N # FLEUR-DE-LIS
+26A0;N # WARNING SIGN
+26A1;N # HIGH VOLTAGE SIGN
+26A2;N # DOUBLED FEMALE SIGN
+26A3;N # DOUBLED MALE SIGN
+26A4;N # INTERLOCKED FEMALE AND MALE SIGN
+26A5;N # MALE AND FEMALE SIGN
+26A6;N # MALE WITH STROKE SIGN
+26A7;N # MALE WITH STROKE AND MALE AND FEMALE SIGN
+26A8;N # VERTICAL MALE WITH STROKE SIGN
+26A9;N # HORIZONTAL MALE WITH STROKE SIGN
+26AA;N # MEDIUM WHITE CIRCLE
+26AB;N # MEDIUM BLACK CIRCLE
+26AC;N # MEDIUM SMALL WHITE CIRCLE
+26AD;N # MARRIAGE SYMBOL
+26AE;N # DIVORCE SYMBOL
+26AF;N # UNMARRIED PARTNERSHIP SYMBOL
+26B0;N # COFFIN
+26B1;N # FUNERAL URN
+2701;N # UPPER BLADE SCISSORS
+2702;N # BLACK SCISSORS
+2703;N # LOWER BLADE SCISSORS
+2704;N # WHITE SCISSORS
+2706;N # TELEPHONE LOCATION SIGN
+2707;N # TAPE DRIVE
+2708;N # AIRPLANE
+2709;N # ENVELOPE
+270C;N # VICTORY HAND
+270D;N # WRITING HAND
+270E;N # LOWER RIGHT PENCIL
+270F;N # PENCIL
+2710;N # UPPER RIGHT PENCIL
+2711;N # WHITE NIB
+2712;N # BLACK NIB
+2713;N # CHECK MARK
+2714;N # HEAVY CHECK MARK
+2715;N # MULTIPLICATION X
+2716;N # HEAVY MULTIPLICATION X
+2717;N # BALLOT X
+2718;N # HEAVY BALLOT X
+2719;N # OUTLINED GREEK CROSS
+271A;N # HEAVY GREEK CROSS
+271B;N # OPEN CENTRE CROSS
+271C;N # HEAVY OPEN CENTRE CROSS
+271D;N # LATIN CROSS
+271E;N # SHADOWED WHITE LATIN CROSS
+271F;N # OUTLINED LATIN CROSS
+2720;N # MALTESE CROSS
+2721;N # STAR OF DAVID
+2722;N # FOUR TEARDROP-SPOKED ASTERISK
+2723;N # FOUR BALLOON-SPOKED ASTERISK
+2724;N # HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725;N # FOUR CLUB-SPOKED ASTERISK
+2726;N # BLACK FOUR POINTED STAR
+2727;N # WHITE FOUR POINTED STAR
+2729;N # STRESS OUTLINED WHITE STAR
+272A;N # CIRCLED WHITE STAR
+272B;N # OPEN CENTRE BLACK STAR
+272C;N # BLACK CENTRE WHITE STAR
+272D;N # OUTLINED BLACK STAR
+272E;N # HEAVY OUTLINED BLACK STAR
+272F;N # PINWHEEL STAR
+2730;N # SHADOWED WHITE STAR
+2731;N # HEAVY ASTERISK
+2732;N # OPEN CENTRE ASTERISK
+2733;N # EIGHT SPOKED ASTERISK
+2734;N # EIGHT POINTED BLACK STAR
+2735;N # EIGHT POINTED PINWHEEL STAR
+2736;N # SIX POINTED BLACK STAR
+2737;N # EIGHT POINTED RECTILINEAR BLACK STAR
+2738;N # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739;N # TWELVE POINTED BLACK STAR
+273A;N # SIXTEEN POINTED ASTERISK
+273B;N # TEARDROP-SPOKED ASTERISK
+273C;N # OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D;A # HEAVY TEARDROP-SPOKED ASTERISK
+273E;N # SIX PETALLED BLACK AND WHITE FLORETTE
+273F;N # BLACK FLORETTE
+2740;N # WHITE FLORETTE
+2741;N # EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742;N # CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743;N # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744;N # SNOWFLAKE
+2745;N # TIGHT TRIFOLIATE SNOWFLAKE
+2746;N # HEAVY CHEVRON SNOWFLAKE
+2747;N # SPARKLE
+2748;N # HEAVY SPARKLE
+2749;N # BALLOON-SPOKED ASTERISK
+274A;N # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B;N # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D;N # SHADOWED WHITE CIRCLE
+274F;N # LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750;N # UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751;N # LOWER RIGHT SHADOWED WHITE SQUARE
+2752;N # UPPER RIGHT SHADOWED WHITE SQUARE
+2756;N # BLACK DIAMOND MINUS WHITE X
+2758;N # LIGHT VERTICAL BAR
+2759;N # MEDIUM VERTICAL BAR
+275A;N # HEAVY VERTICAL BAR
+275B;N # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C;N # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D;N # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E;N # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761;N # CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762;N # HEAVY EXCLAMATION MARK ORNAMENT
+2763;N # HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764;N # HEAVY BLACK HEART
+2765;N # ROTATED HEAVY BLACK HEART BULLET
+2766;N # FLORAL HEART
+2767;N # ROTATED FLORAL HEART BULLET
+2768;N # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769;N # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A;N # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B;N # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C;N # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D;N # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E;N # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F;N # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770;N # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771;N # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772;N # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773;N # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774;N # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775;N # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776;A # DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777;A # DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778;A # DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779;A # DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A;A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B;A # DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C;A # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D;A # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E;A # DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F;A # DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780;N # DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781;N # DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782;N # DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783;N # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784;N # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785;N # DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786;N # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787;N # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788;N # DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789;N # DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793;N # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794;N # HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798;N # HEAVY SOUTH EAST ARROW
+2799;N # HEAVY RIGHTWARDS ARROW
+279A;N # HEAVY NORTH EAST ARROW
+279B;N # DRAFTING POINT RIGHTWARDS ARROW
+279C;N # HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D;N # TRIANGLE-HEADED RIGHTWARDS ARROW
+279E;N # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F;N # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0;N # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1;N # BLACK RIGHTWARDS ARROW
+27A2;N # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3;N # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4;N # BLACK RIGHTWARDS ARROWHEAD
+27A5;N # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6;N # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7;N # SQUAT BLACK RIGHTWARDS ARROW
+27A8;N # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9;N # RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA;N # LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB;N # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC;N # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD;N # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE;N # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF;N # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1;N # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2;N # CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3;N # WHITE-FEATHERED RIGHTWARDS ARROW
+27B4;N # BLACK-FEATHERED SOUTH EAST ARROW
+27B5;N # BLACK-FEATHERED RIGHTWARDS ARROW
+27B6;N # BLACK-FEATHERED NORTH EAST ARROW
+27B7;N # HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8;N # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9;N # HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA;N # TEARDROP-BARBED RIGHTWARDS ARROW
+27BB;N # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC;N # WEDGE-TAILED RIGHTWARDS ARROW
+27BD;N # HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE;N # OPEN-OUTLINED RIGHTWARDS ARROW
+27C0;N # THREE DIMENSIONAL ANGLE
+27C1;N # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+27C2;N # PERPENDICULAR
+27C3;N # OPEN SUBSET
+27C4;N # OPEN SUPERSET
+27C5;N # LEFT S-SHAPED BAG DELIMITER
+27C6;N # RIGHT S-SHAPED BAG DELIMITER
+27D0;N # WHITE DIAMOND WITH CENTRED DOT
+27D1;N # AND WITH DOT
+27D2;N # ELEMENT OF OPENING UPWARDS
+27D3;N # LOWER RIGHT CORNER WITH DOT
+27D4;N # UPPER LEFT CORNER WITH DOT
+27D5;N # LEFT OUTER JOIN
+27D6;N # RIGHT OUTER JOIN
+27D7;N # FULL OUTER JOIN
+27D8;N # LARGE UP TACK
+27D9;N # LARGE DOWN TACK
+27DA;N # LEFT AND RIGHT DOUBLE TURNSTILE
+27DB;N # LEFT AND RIGHT TACK
+27DC;N # LEFT MULTIMAP
+27DD;N # LONG RIGHT TACK
+27DE;N # LONG LEFT TACK
+27DF;N # UP TACK WITH CIRCLE ABOVE
+27E0;N # LOZENGE DIVIDED BY HORIZONTAL RULE
+27E1;N # WHITE CONCAVE-SIDED DIAMOND
+27E2;N # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3;N # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4;N # WHITE SQUARE WITH LEFTWARDS TICK
+27E5;N # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6;Na # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7;Na # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8;Na # MATHEMATICAL LEFT ANGLE BRACKET
+27E9;Na # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA;Na # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB;Na # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27F0;N # UPWARDS QUADRUPLE ARROW
+27F1;N # DOWNWARDS QUADRUPLE ARROW
+27F2;N # ANTICLOCKWISE GAPPED CIRCLE ARROW
+27F3;N # CLOCKWISE GAPPED CIRCLE ARROW
+27F4;N # RIGHT ARROW WITH CIRCLED PLUS
+27F5;N # LONG LEFTWARDS ARROW
+27F6;N # LONG RIGHTWARDS ARROW
+27F7;N # LONG LEFT RIGHT ARROW
+27F8;N # LONG LEFTWARDS DOUBLE ARROW
+27F9;N # LONG RIGHTWARDS DOUBLE ARROW
+27FA;N # LONG LEFT RIGHT DOUBLE ARROW
+27FB;N # LONG LEFTWARDS ARROW FROM BAR
+27FC;N # LONG RIGHTWARDS ARROW FROM BAR
+27FD;N # LONG LEFTWARDS DOUBLE ARROW FROM BAR
+27FE;N # LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+27FF;N # LONG RIGHTWARDS SQUIGGLE ARROW
+2800;N # BRAILLE PATTERN BLANK
+2801;N # BRAILLE PATTERN DOTS-1
+2802;N # BRAILLE PATTERN DOTS-2
+2803;N # BRAILLE PATTERN DOTS-12
+2804;N # BRAILLE PATTERN DOTS-3
+2805;N # BRAILLE PATTERN DOTS-13
+2806;N # BRAILLE PATTERN DOTS-23
+2807;N # BRAILLE PATTERN DOTS-123
+2808;N # BRAILLE PATTERN DOTS-4
+2809;N # BRAILLE PATTERN DOTS-14
+280A;N # BRAILLE PATTERN DOTS-24
+280B;N # BRAILLE PATTERN DOTS-124
+280C;N # BRAILLE PATTERN DOTS-34
+280D;N # BRAILLE PATTERN DOTS-134
+280E;N # BRAILLE PATTERN DOTS-234
+280F;N # BRAILLE PATTERN DOTS-1234
+2810;N # BRAILLE PATTERN DOTS-5
+2811;N # BRAILLE PATTERN DOTS-15
+2812;N # BRAILLE PATTERN DOTS-25
+2813;N # BRAILLE PATTERN DOTS-125
+2814;N # BRAILLE PATTERN DOTS-35
+2815;N # BRAILLE PATTERN DOTS-135
+2816;N # BRAILLE PATTERN DOTS-235
+2817;N # BRAILLE PATTERN DOTS-1235
+2818;N # BRAILLE PATTERN DOTS-45
+2819;N # BRAILLE PATTERN DOTS-145
+281A;N # BRAILLE PATTERN DOTS-245
+281B;N # BRAILLE PATTERN DOTS-1245
+281C;N # BRAILLE PATTERN DOTS-345
+281D;N # BRAILLE PATTERN DOTS-1345
+281E;N # BRAILLE PATTERN DOTS-2345
+281F;N # BRAILLE PATTERN DOTS-12345
+2820;N # BRAILLE PATTERN DOTS-6
+2821;N # BRAILLE PATTERN DOTS-16
+2822;N # BRAILLE PATTERN DOTS-26
+2823;N # BRAILLE PATTERN DOTS-126
+2824;N # BRAILLE PATTERN DOTS-36
+2825;N # BRAILLE PATTERN DOTS-136
+2826;N # BRAILLE PATTERN DOTS-236
+2827;N # BRAILLE PATTERN DOTS-1236
+2828;N # BRAILLE PATTERN DOTS-46
+2829;N # BRAILLE PATTERN DOTS-146
+282A;N # BRAILLE PATTERN DOTS-246
+282B;N # BRAILLE PATTERN DOTS-1246
+282C;N # BRAILLE PATTERN DOTS-346
+282D;N # BRAILLE PATTERN DOTS-1346
+282E;N # BRAILLE PATTERN DOTS-2346
+282F;N # BRAILLE PATTERN DOTS-12346
+2830;N # BRAILLE PATTERN DOTS-56
+2831;N # BRAILLE PATTERN DOTS-156
+2832;N # BRAILLE PATTERN DOTS-256
+2833;N # BRAILLE PATTERN DOTS-1256
+2834;N # BRAILLE PATTERN DOTS-356
+2835;N # BRAILLE PATTERN DOTS-1356
+2836;N # BRAILLE PATTERN DOTS-2356
+2837;N # BRAILLE PATTERN DOTS-12356
+2838;N # BRAILLE PATTERN DOTS-456
+2839;N # BRAILLE PATTERN DOTS-1456
+283A;N # BRAILLE PATTERN DOTS-2456
+283B;N # BRAILLE PATTERN DOTS-12456
+283C;N # BRAILLE PATTERN DOTS-3456
+283D;N # BRAILLE PATTERN DOTS-13456
+283E;N # BRAILLE PATTERN DOTS-23456
+283F;N # BRAILLE PATTERN DOTS-123456
+2840;N # BRAILLE PATTERN DOTS-7
+2841;N # BRAILLE PATTERN DOTS-17
+2842;N # BRAILLE PATTERN DOTS-27
+2843;N # BRAILLE PATTERN DOTS-127
+2844;N # BRAILLE PATTERN DOTS-37
+2845;N # BRAILLE PATTERN DOTS-137
+2846;N # BRAILLE PATTERN DOTS-237
+2847;N # BRAILLE PATTERN DOTS-1237
+2848;N # BRAILLE PATTERN DOTS-47
+2849;N # BRAILLE PATTERN DOTS-147
+284A;N # BRAILLE PATTERN DOTS-247
+284B;N # BRAILLE PATTERN DOTS-1247
+284C;N # BRAILLE PATTERN DOTS-347
+284D;N # BRAILLE PATTERN DOTS-1347
+284E;N # BRAILLE PATTERN DOTS-2347
+284F;N # BRAILLE PATTERN DOTS-12347
+2850;N # BRAILLE PATTERN DOTS-57
+2851;N # BRAILLE PATTERN DOTS-157
+2852;N # BRAILLE PATTERN DOTS-257
+2853;N # BRAILLE PATTERN DOTS-1257
+2854;N # BRAILLE PATTERN DOTS-357
+2855;N # BRAILLE PATTERN DOTS-1357
+2856;N # BRAILLE PATTERN DOTS-2357
+2857;N # BRAILLE PATTERN DOTS-12357
+2858;N # BRAILLE PATTERN DOTS-457
+2859;N # BRAILLE PATTERN DOTS-1457
+285A;N # BRAILLE PATTERN DOTS-2457
+285B;N # BRAILLE PATTERN DOTS-12457
+285C;N # BRAILLE PATTERN DOTS-3457
+285D;N # BRAILLE PATTERN DOTS-13457
+285E;N # BRAILLE PATTERN DOTS-23457
+285F;N # BRAILLE PATTERN DOTS-123457
+2860;N # BRAILLE PATTERN DOTS-67
+2861;N # BRAILLE PATTERN DOTS-167
+2862;N # BRAILLE PATTERN DOTS-267
+2863;N # BRAILLE PATTERN DOTS-1267
+2864;N # BRAILLE PATTERN DOTS-367
+2865;N # BRAILLE PATTERN DOTS-1367
+2866;N # BRAILLE PATTERN DOTS-2367
+2867;N # BRAILLE PATTERN DOTS-12367
+2868;N # BRAILLE PATTERN DOTS-467
+2869;N # BRAILLE PATTERN DOTS-1467
+286A;N # BRAILLE PATTERN DOTS-2467
+286B;N # BRAILLE PATTERN DOTS-12467
+286C;N # BRAILLE PATTERN DOTS-3467
+286D;N # BRAILLE PATTERN DOTS-13467
+286E;N # BRAILLE PATTERN DOTS-23467
+286F;N # BRAILLE PATTERN DOTS-123467
+2870;N # BRAILLE PATTERN DOTS-567
+2871;N # BRAILLE PATTERN DOTS-1567
+2872;N # BRAILLE PATTERN DOTS-2567
+2873;N # BRAILLE PATTERN DOTS-12567
+2874;N # BRAILLE PATTERN DOTS-3567
+2875;N # BRAILLE PATTERN DOTS-13567
+2876;N # BRAILLE PATTERN DOTS-23567
+2877;N # BRAILLE PATTERN DOTS-123567
+2878;N # BRAILLE PATTERN DOTS-4567
+2879;N # BRAILLE PATTERN DOTS-14567
+287A;N # BRAILLE PATTERN DOTS-24567
+287B;N # BRAILLE PATTERN DOTS-124567
+287C;N # BRAILLE PATTERN DOTS-34567
+287D;N # BRAILLE PATTERN DOTS-134567
+287E;N # BRAILLE PATTERN DOTS-234567
+287F;N # BRAILLE PATTERN DOTS-1234567
+2880;N # BRAILLE PATTERN DOTS-8
+2881;N # BRAILLE PATTERN DOTS-18
+2882;N # BRAILLE PATTERN DOTS-28
+2883;N # BRAILLE PATTERN DOTS-128
+2884;N # BRAILLE PATTERN DOTS-38
+2885;N # BRAILLE PATTERN DOTS-138
+2886;N # BRAILLE PATTERN DOTS-238
+2887;N # BRAILLE PATTERN DOTS-1238
+2888;N # BRAILLE PATTERN DOTS-48
+2889;N # BRAILLE PATTERN DOTS-148
+288A;N # BRAILLE PATTERN DOTS-248
+288B;N # BRAILLE PATTERN DOTS-1248
+288C;N # BRAILLE PATTERN DOTS-348
+288D;N # BRAILLE PATTERN DOTS-1348
+288E;N # BRAILLE PATTERN DOTS-2348
+288F;N # BRAILLE PATTERN DOTS-12348
+2890;N # BRAILLE PATTERN DOTS-58
+2891;N # BRAILLE PATTERN DOTS-158
+2892;N # BRAILLE PATTERN DOTS-258
+2893;N # BRAILLE PATTERN DOTS-1258
+2894;N # BRAILLE PATTERN DOTS-358
+2895;N # BRAILLE PATTERN DOTS-1358
+2896;N # BRAILLE PATTERN DOTS-2358
+2897;N # BRAILLE PATTERN DOTS-12358
+2898;N # BRAILLE PATTERN DOTS-458
+2899;N # BRAILLE PATTERN DOTS-1458
+289A;N # BRAILLE PATTERN DOTS-2458
+289B;N # BRAILLE PATTERN DOTS-12458
+289C;N # BRAILLE PATTERN DOTS-3458
+289D;N # BRAILLE PATTERN DOTS-13458
+289E;N # BRAILLE PATTERN DOTS-23458
+289F;N # BRAILLE PATTERN DOTS-123458
+28A0;N # BRAILLE PATTERN DOTS-68
+28A1;N # BRAILLE PATTERN DOTS-168
+28A2;N # BRAILLE PATTERN DOTS-268
+28A3;N # BRAILLE PATTERN DOTS-1268
+28A4;N # BRAILLE PATTERN DOTS-368
+28A5;N # BRAILLE PATTERN DOTS-1368
+28A6;N # BRAILLE PATTERN DOTS-2368
+28A7;N # BRAILLE PATTERN DOTS-12368
+28A8;N # BRAILLE PATTERN DOTS-468
+28A9;N # BRAILLE PATTERN DOTS-1468
+28AA;N # BRAILLE PATTERN DOTS-2468
+28AB;N # BRAILLE PATTERN DOTS-12468
+28AC;N # BRAILLE PATTERN DOTS-3468
+28AD;N # BRAILLE PATTERN DOTS-13468
+28AE;N # BRAILLE PATTERN DOTS-23468
+28AF;N # BRAILLE PATTERN DOTS-123468
+28B0;N # BRAILLE PATTERN DOTS-568
+28B1;N # BRAILLE PATTERN DOTS-1568
+28B2;N # BRAILLE PATTERN DOTS-2568
+28B3;N # BRAILLE PATTERN DOTS-12568
+28B4;N # BRAILLE PATTERN DOTS-3568
+28B5;N # BRAILLE PATTERN DOTS-13568
+28B6;N # BRAILLE PATTERN DOTS-23568
+28B7;N # BRAILLE PATTERN DOTS-123568
+28B8;N # BRAILLE PATTERN DOTS-4568
+28B9;N # BRAILLE PATTERN DOTS-14568
+28BA;N # BRAILLE PATTERN DOTS-24568
+28BB;N # BRAILLE PATTERN DOTS-124568
+28BC;N # BRAILLE PATTERN DOTS-34568
+28BD;N # BRAILLE PATTERN DOTS-134568
+28BE;N # BRAILLE PATTERN DOTS-234568
+28BF;N # BRAILLE PATTERN DOTS-1234568
+28C0;N # BRAILLE PATTERN DOTS-78
+28C1;N # BRAILLE PATTERN DOTS-178
+28C2;N # BRAILLE PATTERN DOTS-278
+28C3;N # BRAILLE PATTERN DOTS-1278
+28C4;N # BRAILLE PATTERN DOTS-378
+28C5;N # BRAILLE PATTERN DOTS-1378
+28C6;N # BRAILLE PATTERN DOTS-2378
+28C7;N # BRAILLE PATTERN DOTS-12378
+28C8;N # BRAILLE PATTERN DOTS-478
+28C9;N # BRAILLE PATTERN DOTS-1478
+28CA;N # BRAILLE PATTERN DOTS-2478
+28CB;N # BRAILLE PATTERN DOTS-12478
+28CC;N # BRAILLE PATTERN DOTS-3478
+28CD;N # BRAILLE PATTERN DOTS-13478
+28CE;N # BRAILLE PATTERN DOTS-23478
+28CF;N # BRAILLE PATTERN DOTS-123478
+28D0;N # BRAILLE PATTERN DOTS-578
+28D1;N # BRAILLE PATTERN DOTS-1578
+28D2;N # BRAILLE PATTERN DOTS-2578
+28D3;N # BRAILLE PATTERN DOTS-12578
+28D4;N # BRAILLE PATTERN DOTS-3578
+28D5;N # BRAILLE PATTERN DOTS-13578
+28D6;N # BRAILLE PATTERN DOTS-23578
+28D7;N # BRAILLE PATTERN DOTS-123578
+28D8;N # BRAILLE PATTERN DOTS-4578
+28D9;N # BRAILLE PATTERN DOTS-14578
+28DA;N # BRAILLE PATTERN DOTS-24578
+28DB;N # BRAILLE PATTERN DOTS-124578
+28DC;N # BRAILLE PATTERN DOTS-34578
+28DD;N # BRAILLE PATTERN DOTS-134578
+28DE;N # BRAILLE PATTERN DOTS-234578
+28DF;N # BRAILLE PATTERN DOTS-1234578
+28E0;N # BRAILLE PATTERN DOTS-678
+28E1;N # BRAILLE PATTERN DOTS-1678
+28E2;N # BRAILLE PATTERN DOTS-2678
+28E3;N # BRAILLE PATTERN DOTS-12678
+28E4;N # BRAILLE PATTERN DOTS-3678
+28E5;N # BRAILLE PATTERN DOTS-13678
+28E6;N # BRAILLE PATTERN DOTS-23678
+28E7;N # BRAILLE PATTERN DOTS-123678
+28E8;N # BRAILLE PATTERN DOTS-4678
+28E9;N # BRAILLE PATTERN DOTS-14678
+28EA;N # BRAILLE PATTERN DOTS-24678
+28EB;N # BRAILLE PATTERN DOTS-124678
+28EC;N # BRAILLE PATTERN DOTS-34678
+28ED;N # BRAILLE PATTERN DOTS-134678
+28EE;N # BRAILLE PATTERN DOTS-234678
+28EF;N # BRAILLE PATTERN DOTS-1234678
+28F0;N # BRAILLE PATTERN DOTS-5678
+28F1;N # BRAILLE PATTERN DOTS-15678
+28F2;N # BRAILLE PATTERN DOTS-25678
+28F3;N # BRAILLE PATTERN DOTS-125678
+28F4;N # BRAILLE PATTERN DOTS-35678
+28F5;N # BRAILLE PATTERN DOTS-135678
+28F6;N # BRAILLE PATTERN DOTS-235678
+28F7;N # BRAILLE PATTERN DOTS-1235678
+28F8;N # BRAILLE PATTERN DOTS-45678
+28F9;N # BRAILLE PATTERN DOTS-145678
+28FA;N # BRAILLE PATTERN DOTS-245678
+28FB;N # BRAILLE PATTERN DOTS-1245678
+28FC;N # BRAILLE PATTERN DOTS-345678
+28FD;N # BRAILLE PATTERN DOTS-1345678
+28FE;N # BRAILLE PATTERN DOTS-2345678
+28FF;N # BRAILLE PATTERN DOTS-12345678
+2900;N # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2901;N # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2902;N # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903;N # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904;N # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905;N # RIGHTWARDS TWO-HEADED ARROW FROM BAR
+2906;N # LEFTWARDS DOUBLE ARROW FROM BAR
+2907;N # RIGHTWARDS DOUBLE ARROW FROM BAR
+2908;N # DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909;N # UPWARDS ARROW WITH HORIZONTAL STROKE
+290A;N # UPWARDS TRIPLE ARROW
+290B;N # DOWNWARDS TRIPLE ARROW
+290C;N # LEFTWARDS DOUBLE DASH ARROW
+290D;N # RIGHTWARDS DOUBLE DASH ARROW
+290E;N # LEFTWARDS TRIPLE DASH ARROW
+290F;N # RIGHTWARDS TRIPLE DASH ARROW
+2910;N # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911;N # RIGHTWARDS ARROW WITH DOTTED STEM
+2912;N # UPWARDS ARROW TO BAR
+2913;N # DOWNWARDS ARROW TO BAR
+2914;N # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2915;N # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2916;N # RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+2917;N # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2918;N # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2919;N # LEFTWARDS ARROW-TAIL
+291A;N # RIGHTWARDS ARROW-TAIL
+291B;N # LEFTWARDS DOUBLE ARROW-TAIL
+291C;N # RIGHTWARDS DOUBLE ARROW-TAIL
+291D;N # LEFTWARDS ARROW TO BLACK DIAMOND
+291E;N # RIGHTWARDS ARROW TO BLACK DIAMOND
+291F;N # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920;N # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921;N # NORTH WEST AND SOUTH EAST ARROW
+2922;N # NORTH EAST AND SOUTH WEST ARROW
+2923;N # NORTH WEST ARROW WITH HOOK
+2924;N # NORTH EAST ARROW WITH HOOK
+2925;N # SOUTH EAST ARROW WITH HOOK
+2926;N # SOUTH WEST ARROW WITH HOOK
+2927;N # NORTH WEST ARROW AND NORTH EAST ARROW
+2928;N # NORTH EAST ARROW AND SOUTH EAST ARROW
+2929;N # SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A;N # SOUTH WEST ARROW AND NORTH WEST ARROW
+292B;N # RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C;N # FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D;N # SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E;N # NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F;N # FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930;N # RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931;N # NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932;N # NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933;N # WAVE ARROW POINTING DIRECTLY RIGHT
+2934;N # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935;N # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936;N # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937;N # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938;N # RIGHT-SIDE ARC CLOCKWISE ARROW
+2939;N # LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A;N # TOP ARC ANTICLOCKWISE ARROW
+293B;N # BOTTOM ARC ANTICLOCKWISE ARROW
+293C;N # TOP ARC CLOCKWISE ARROW WITH MINUS
+293D;N # TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E;N # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F;N # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940;N # ANTICLOCKWISE CLOSED CIRCLE ARROW
+2941;N # CLOCKWISE CLOSED CIRCLE ARROW
+2942;N # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943;N # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944;N # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945;N # RIGHTWARDS ARROW WITH PLUS BELOW
+2946;N # LEFTWARDS ARROW WITH PLUS BELOW
+2947;N # RIGHTWARDS ARROW THROUGH X
+2948;N # LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949;N # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A;N # LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B;N # LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C;N # UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D;N # UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E;N # LEFT BARB UP RIGHT BARB UP HARPOON
+294F;N # UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950;N # LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951;N # UP BARB LEFT DOWN BARB LEFT HARPOON
+2952;N # LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953;N # RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954;N # UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955;N # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956;N # LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957;N # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958;N # UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959;N # DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A;N # LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B;N # RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C;N # UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D;N # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E;N # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F;N # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960;N # UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961;N # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962;N # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963;N # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964;N # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965;N # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966;N # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967;N # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968;N # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969;N # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A;N # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B;N # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C;N # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D;N # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E;N # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F;N # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970;N # RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+2971;N # EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972;N # TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973;N # LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974;N # RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975;N # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976;N # LESS-THAN ABOVE LEFTWARDS ARROW
+2977;N # LEFTWARDS ARROW THROUGH LESS-THAN
+2978;N # GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979;N # SUBSET ABOVE RIGHTWARDS ARROW
+297A;N # LEFTWARDS ARROW THROUGH SUBSET
+297B;N # SUPERSET ABOVE LEFTWARDS ARROW
+297C;N # LEFT FISH TAIL
+297D;N # RIGHT FISH TAIL
+297E;N # UP FISH TAIL
+297F;N # DOWN FISH TAIL
+2980;N # TRIPLE VERTICAL BAR DELIMITER
+2981;N # Z NOTATION SPOT
+2982;N # Z NOTATION TYPE COLON
+2983;N # LEFT WHITE CURLY BRACKET
+2984;N # RIGHT WHITE CURLY BRACKET
+2985;Na # LEFT WHITE PARENTHESIS
+2986;Na # RIGHT WHITE PARENTHESIS
+2987;N # Z NOTATION LEFT IMAGE BRACKET
+2988;N # Z NOTATION RIGHT IMAGE BRACKET
+2989;N # Z NOTATION LEFT BINDING BRACKET
+298A;N # Z NOTATION RIGHT BINDING BRACKET
+298B;N # LEFT SQUARE BRACKET WITH UNDERBAR
+298C;N # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D;N # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E;N # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F;N # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990;N # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991;N # LEFT ANGLE BRACKET WITH DOT
+2992;N # RIGHT ANGLE BRACKET WITH DOT
+2993;N # LEFT ARC LESS-THAN BRACKET
+2994;N # RIGHT ARC GREATER-THAN BRACKET
+2995;N # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996;N # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997;N # LEFT BLACK TORTOISE SHELL BRACKET
+2998;N # RIGHT BLACK TORTOISE SHELL BRACKET
+2999;N # DOTTED FENCE
+299A;N # VERTICAL ZIGZAG LINE
+299B;N # MEASURED ANGLE OPENING LEFT
+299C;N # RIGHT ANGLE VARIANT WITH SQUARE
+299D;N # MEASURED RIGHT ANGLE WITH DOT
+299E;N # ANGLE WITH S INSIDE
+299F;N # ACUTE ANGLE
+29A0;N # SPHERICAL ANGLE OPENING LEFT
+29A1;N # SPHERICAL ANGLE OPENING UP
+29A2;N # TURNED ANGLE
+29A3;N # REVERSED ANGLE
+29A4;N # ANGLE WITH UNDERBAR
+29A5;N # REVERSED ANGLE WITH UNDERBAR
+29A6;N # OBLIQUE ANGLE OPENING UP
+29A7;N # OBLIQUE ANGLE OPENING DOWN
+29A8;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF;N # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+29B0;N # REVERSED EMPTY SET
+29B1;N # EMPTY SET WITH OVERBAR
+29B2;N # EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3;N # EMPTY SET WITH RIGHT ARROW ABOVE
+29B4;N # EMPTY SET WITH LEFT ARROW ABOVE
+29B5;N # CIRCLE WITH HORIZONTAL BAR
+29B6;N # CIRCLED VERTICAL BAR
+29B7;N # CIRCLED PARALLEL
+29B8;N # CIRCLED REVERSE SOLIDUS
+29B9;N # CIRCLED PERPENDICULAR
+29BA;N # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB;N # CIRCLE WITH SUPERIMPOSED X
+29BC;N # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD;N # UP ARROW THROUGH CIRCLE
+29BE;N # CIRCLED WHITE BULLET
+29BF;N # CIRCLED BULLET
+29C0;N # CIRCLED LESS-THAN
+29C1;N # CIRCLED GREATER-THAN
+29C2;N # CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3;N # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+29C4;N # SQUARED RISING DIAGONAL SLASH
+29C5;N # SQUARED FALLING DIAGONAL SLASH
+29C6;N # SQUARED ASTERISK
+29C7;N # SQUARED SMALL CIRCLE
+29C8;N # SQUARED SQUARE
+29C9;N # TWO JOINED SQUARES
+29CA;N # TRIANGLE WITH DOT ABOVE
+29CB;N # TRIANGLE WITH UNDERBAR
+29CC;N # S IN TRIANGLE
+29CD;N # TRIANGLE WITH SERIFS AT BOTTOM
+29CE;N # RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF;N # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0;N # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1;N # BOWTIE WITH LEFT HALF BLACK
+29D2;N # BOWTIE WITH RIGHT HALF BLACK
+29D3;N # BLACK BOWTIE
+29D4;N # TIMES WITH LEFT HALF BLACK
+29D5;N # TIMES WITH RIGHT HALF BLACK
+29D6;N # WHITE HOURGLASS
+29D7;N # BLACK HOURGLASS
+29D8;N # LEFT WIGGLY FENCE
+29D9;N # RIGHT WIGGLY FENCE
+29DA;N # LEFT DOUBLE WIGGLY FENCE
+29DB;N # RIGHT DOUBLE WIGGLY FENCE
+29DC;N # INCOMPLETE INFINITY
+29DD;N # TIE OVER INFINITY
+29DE;N # INFINITY NEGATED WITH VERTICAL BAR
+29DF;N # DOUBLE-ENDED MULTIMAP
+29E0;N # SQUARE WITH CONTOURED OUTLINE
+29E1;N # INCREASES AS
+29E2;N # SHUFFLE PRODUCT
+29E3;N # EQUALS SIGN AND SLANTED PARALLEL
+29E4;N # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5;N # IDENTICAL TO AND SLANTED PARALLEL
+29E6;N # GLEICH STARK
+29E7;N # THERMODYNAMIC
+29E8;N # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+29E9;N # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+29EA;N # BLACK DIAMOND WITH DOWN ARROW
+29EB;N # BLACK LOZENGE
+29EC;N # WHITE CIRCLE WITH DOWN ARROW
+29ED;N # BLACK CIRCLE WITH DOWN ARROW
+29EE;N # ERROR-BARRED WHITE SQUARE
+29EF;N # ERROR-BARRED BLACK SQUARE
+29F0;N # ERROR-BARRED WHITE DIAMOND
+29F1;N # ERROR-BARRED BLACK DIAMOND
+29F2;N # ERROR-BARRED WHITE CIRCLE
+29F3;N # ERROR-BARRED BLACK CIRCLE
+29F4;N # RULE-DELAYED
+29F5;N # REVERSE SOLIDUS OPERATOR
+29F6;N # SOLIDUS WITH OVERBAR
+29F7;N # REVERSE SOLIDUS WITH HORIZONTAL STROKE
+29F8;N # BIG SOLIDUS
+29F9;N # BIG REVERSE SOLIDUS
+29FA;N # DOUBLE PLUS
+29FB;N # TRIPLE PLUS
+29FC;N # LEFT-POINTING CURVED ANGLE BRACKET
+29FD;N # RIGHT-POINTING CURVED ANGLE BRACKET
+29FE;N # TINY
+29FF;N # MINY
+2A00;N # N-ARY CIRCLED DOT OPERATOR
+2A01;N # N-ARY CIRCLED PLUS OPERATOR
+2A02;N # N-ARY CIRCLED TIMES OPERATOR
+2A03;N # N-ARY UNION OPERATOR WITH DOT
+2A04;N # N-ARY UNION OPERATOR WITH PLUS
+2A05;N # N-ARY SQUARE INTERSECTION OPERATOR
+2A06;N # N-ARY SQUARE UNION OPERATOR
+2A07;N # TWO LOGICAL AND OPERATOR
+2A08;N # TWO LOGICAL OR OPERATOR
+2A09;N # N-ARY TIMES OPERATOR
+2A0A;N # MODULO TWO SUM
+2A0B;N # SUMMATION WITH INTEGRAL
+2A0C;N # QUADRUPLE INTEGRAL OPERATOR
+2A0D;N # FINITE PART INTEGRAL
+2A0E;N # INTEGRAL WITH DOUBLE STROKE
+2A0F;N # INTEGRAL AVERAGE WITH SLASH
+2A10;N # CIRCULATION FUNCTION
+2A11;N # ANTICLOCKWISE INTEGRATION
+2A12;N # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13;N # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14;N # LINE INTEGRATION NOT INCLUDING THE POLE
+2A15;N # INTEGRAL AROUND A POINT OPERATOR
+2A16;N # QUATERNION INTEGRAL OPERATOR
+2A17;N # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18;N # INTEGRAL WITH TIMES SIGN
+2A19;N # INTEGRAL WITH INTERSECTION
+2A1A;N # INTEGRAL WITH UNION
+2A1B;N # INTEGRAL WITH OVERBAR
+2A1C;N # INTEGRAL WITH UNDERBAR
+2A1D;N # JOIN
+2A1E;N # LARGE LEFT TRIANGLE OPERATOR
+2A1F;N # Z NOTATION SCHEMA COMPOSITION
+2A20;N # Z NOTATION SCHEMA PIPING
+2A21;N # Z NOTATION SCHEMA PROJECTION
+2A22;N # PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23;N # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24;N # PLUS SIGN WITH TILDE ABOVE
+2A25;N # PLUS SIGN WITH DOT BELOW
+2A26;N # PLUS SIGN WITH TILDE BELOW
+2A27;N # PLUS SIGN WITH SUBSCRIPT TWO
+2A28;N # PLUS SIGN WITH BLACK TRIANGLE
+2A29;N # MINUS SIGN WITH COMMA ABOVE
+2A2A;N # MINUS SIGN WITH DOT BELOW
+2A2B;N # MINUS SIGN WITH FALLING DOTS
+2A2C;N # MINUS SIGN WITH RISING DOTS
+2A2D;N # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E;N # PLUS SIGN IN RIGHT HALF CIRCLE
+2A2F;N # VECTOR OR CROSS PRODUCT
+2A30;N # MULTIPLICATION SIGN WITH DOT ABOVE
+2A31;N # MULTIPLICATION SIGN WITH UNDERBAR
+2A32;N # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33;N # SMASH PRODUCT
+2A34;N # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35;N # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36;N # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37;N # MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38;N # CIRCLED DIVISION SIGN
+2A39;N # PLUS SIGN IN TRIANGLE
+2A3A;N # MINUS SIGN IN TRIANGLE
+2A3B;N # MULTIPLICATION SIGN IN TRIANGLE
+2A3C;N # INTERIOR PRODUCT
+2A3D;N # RIGHTHAND INTERIOR PRODUCT
+2A3E;N # Z NOTATION RELATIONAL COMPOSITION
+2A3F;N # AMALGAMATION OR COPRODUCT
+2A40;N # INTERSECTION WITH DOT
+2A41;N # UNION WITH MINUS SIGN
+2A42;N # UNION WITH OVERBAR
+2A43;N # INTERSECTION WITH OVERBAR
+2A44;N # INTERSECTION WITH LOGICAL AND
+2A45;N # UNION WITH LOGICAL OR
+2A46;N # UNION ABOVE INTERSECTION
+2A47;N # INTERSECTION ABOVE UNION
+2A48;N # UNION ABOVE BAR ABOVE INTERSECTION
+2A49;N # INTERSECTION ABOVE BAR ABOVE UNION
+2A4A;N # UNION BESIDE AND JOINED WITH UNION
+2A4B;N # INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C;N # CLOSED UNION WITH SERIFS
+2A4D;N # CLOSED INTERSECTION WITH SERIFS
+2A4E;N # DOUBLE SQUARE INTERSECTION
+2A4F;N # DOUBLE SQUARE UNION
+2A50;N # CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+2A51;N # LOGICAL AND WITH DOT ABOVE
+2A52;N # LOGICAL OR WITH DOT ABOVE
+2A53;N # DOUBLE LOGICAL AND
+2A54;N # DOUBLE LOGICAL OR
+2A55;N # TWO INTERSECTING LOGICAL AND
+2A56;N # TWO INTERSECTING LOGICAL OR
+2A57;N # SLOPING LARGE OR
+2A58;N # SLOPING LARGE AND
+2A59;N # LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A;N # LOGICAL AND WITH MIDDLE STEM
+2A5B;N # LOGICAL OR WITH MIDDLE STEM
+2A5C;N # LOGICAL AND WITH HORIZONTAL DASH
+2A5D;N # LOGICAL OR WITH HORIZONTAL DASH
+2A5E;N # LOGICAL AND WITH DOUBLE OVERBAR
+2A5F;N # LOGICAL AND WITH UNDERBAR
+2A60;N # LOGICAL AND WITH DOUBLE UNDERBAR
+2A61;N # SMALL VEE WITH UNDERBAR
+2A62;N # LOGICAL OR WITH DOUBLE OVERBAR
+2A63;N # LOGICAL OR WITH DOUBLE UNDERBAR
+2A64;N # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65;N # Z NOTATION RANGE ANTIRESTRICTION
+2A66;N # EQUALS SIGN WITH DOT BELOW
+2A67;N # IDENTICAL WITH DOT ABOVE
+2A68;N # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+2A69;N # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A;N # TILDE OPERATOR WITH DOT ABOVE
+2A6B;N # TILDE OPERATOR WITH RISING DOTS
+2A6C;N # SIMILAR MINUS SIMILAR
+2A6D;N # CONGRUENT WITH DOT ABOVE
+2A6E;N # EQUALS WITH ASTERISK
+2A6F;N # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70;N # APPROXIMATELY EQUAL OR EQUAL TO
+2A71;N # EQUALS SIGN ABOVE PLUS SIGN
+2A72;N # PLUS SIGN ABOVE EQUALS SIGN
+2A73;N # EQUALS SIGN ABOVE TILDE OPERATOR
+2A74;N # DOUBLE COLON EQUAL
+2A75;N # TWO CONSECUTIVE EQUALS SIGNS
+2A76;N # THREE CONSECUTIVE EQUALS SIGNS
+2A77;N # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78;N # EQUIVALENT WITH FOUR DOTS ABOVE
+2A79;N # LESS-THAN WITH CIRCLE INSIDE
+2A7A;N # GREATER-THAN WITH CIRCLE INSIDE
+2A7B;N # LESS-THAN WITH QUESTION MARK ABOVE
+2A7C;N # GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D;N # LESS-THAN OR SLANTED EQUAL TO
+2A7E;N # GREATER-THAN OR SLANTED EQUAL TO
+2A7F;N # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80;N # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81;N # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82;N # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83;N # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84;N # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85;N # LESS-THAN OR APPROXIMATE
+2A86;N # GREATER-THAN OR APPROXIMATE
+2A87;N # LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+2A88;N # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+2A89;N # LESS-THAN AND NOT APPROXIMATE
+2A8A;N # GREATER-THAN AND NOT APPROXIMATE
+2A8B;N # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C;N # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A8D;N # LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E;N # GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F;N # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90;N # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91;N # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92;N # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93;N # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94;N # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95;N # SLANTED EQUAL TO OR LESS-THAN
+2A96;N # SLANTED EQUAL TO OR GREATER-THAN
+2A97;N # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98;N # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99;N # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A;N # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B;N # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C;N # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D;N # SIMILAR OR LESS-THAN
+2A9E;N # SIMILAR OR GREATER-THAN
+2A9F;N # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0;N # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1;N # DOUBLE NESTED LESS-THAN
+2AA2;N # DOUBLE NESTED GREATER-THAN
+2AA3;N # DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4;N # GREATER-THAN OVERLAPPING LESS-THAN
+2AA5;N # GREATER-THAN BESIDE LESS-THAN
+2AA6;N # LESS-THAN CLOSED BY CURVE
+2AA7;N # GREATER-THAN CLOSED BY CURVE
+2AA8;N # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9;N # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA;N # SMALLER THAN
+2AAB;N # LARGER THAN
+2AAC;N # SMALLER THAN OR EQUAL TO
+2AAD;N # LARGER THAN OR EQUAL TO
+2AAE;N # EQUALS SIGN WITH BUMPY ABOVE
+2AAF;N # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0;N # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB1;N # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2;N # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3;N # PRECEDES ABOVE EQUALS SIGN
+2AB4;N # SUCCEEDS ABOVE EQUALS SIGN
+2AB5;N # PRECEDES ABOVE NOT EQUAL TO
+2AB6;N # SUCCEEDS ABOVE NOT EQUAL TO
+2AB7;N # PRECEDES ABOVE ALMOST EQUAL TO
+2AB8;N # SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9;N # PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA;N # SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB;N # DOUBLE PRECEDES
+2ABC;N # DOUBLE SUCCEEDS
+2ABD;N # SUBSET WITH DOT
+2ABE;N # SUPERSET WITH DOT
+2ABF;N # SUBSET WITH PLUS SIGN BELOW
+2AC0;N # SUPERSET WITH PLUS SIGN BELOW
+2AC1;N # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2;N # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3;N # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4;N # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5;N # SUBSET OF ABOVE EQUALS SIGN
+2AC6;N # SUPERSET OF ABOVE EQUALS SIGN
+2AC7;N # SUBSET OF ABOVE TILDE OPERATOR
+2AC8;N # SUPERSET OF ABOVE TILDE OPERATOR
+2AC9;N # SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA;N # SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB;N # SUBSET OF ABOVE NOT EQUAL TO
+2ACC;N # SUPERSET OF ABOVE NOT EQUAL TO
+2ACD;N # SQUARE LEFT OPEN BOX OPERATOR
+2ACE;N # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF;N # CLOSED SUBSET
+2AD0;N # CLOSED SUPERSET
+2AD1;N # CLOSED SUBSET OR EQUAL TO
+2AD2;N # CLOSED SUPERSET OR EQUAL TO
+2AD3;N # SUBSET ABOVE SUPERSET
+2AD4;N # SUPERSET ABOVE SUBSET
+2AD5;N # SUBSET ABOVE SUBSET
+2AD6;N # SUPERSET ABOVE SUPERSET
+2AD7;N # SUPERSET BESIDE SUBSET
+2AD8;N # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+2AD9;N # ELEMENT OF OPENING DOWNWARDS
+2ADA;N # PITCHFORK WITH TEE TOP
+2ADB;N # TRANSVERSAL INTERSECTION
+2ADC;N # FORKING
+2ADD;N # NONFORKING
+2ADE;N # SHORT LEFT TACK
+2ADF;N # SHORT DOWN TACK
+2AE0;N # SHORT UP TACK
+2AE1;N # PERPENDICULAR WITH S
+2AE2;N # VERTICAL BAR TRIPLE RIGHT TURNSTILE
+2AE3;N # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4;N # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5;N # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6;N # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+2AE7;N # SHORT DOWN TACK WITH OVERBAR
+2AE8;N # SHORT UP TACK WITH UNDERBAR
+2AE9;N # SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA;N # DOUBLE DOWN TACK
+2AEB;N # DOUBLE UP TACK
+2AEC;N # DOUBLE STROKE NOT SIGN
+2AED;N # REVERSED DOUBLE STROKE NOT SIGN
+2AEE;N # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+2AEF;N # VERTICAL LINE WITH CIRCLE ABOVE
+2AF0;N # VERTICAL LINE WITH CIRCLE BELOW
+2AF1;N # DOWN TACK WITH CIRCLE BELOW
+2AF2;N # PARALLEL WITH HORIZONTAL STROKE
+2AF3;N # PARALLEL WITH TILDE OPERATOR
+2AF4;N # TRIPLE VERTICAL BAR BINARY RELATION
+2AF5;N # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+2AF6;N # TRIPLE COLON OPERATOR
+2AF7;N # TRIPLE NESTED LESS-THAN
+2AF8;N # TRIPLE NESTED GREATER-THAN
+2AF9;N # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA;N # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2AFB;N # TRIPLE SOLIDUS BINARY RELATION
+2AFC;N # LARGE TRIPLE VERTICAL BAR OPERATOR
+2AFD;N # DOUBLE SOLIDUS OPERATOR
+2AFE;N # WHITE VERTICAL BAR
+2AFF;N # N-ARY WHITE VERTICAL BAR
+2B00;N # NORTH EAST WHITE ARROW
+2B01;N # NORTH WEST WHITE ARROW
+2B02;N # SOUTH EAST WHITE ARROW
+2B03;N # SOUTH WEST WHITE ARROW
+2B04;N # LEFT RIGHT WHITE ARROW
+2B05;N # LEFTWARDS BLACK ARROW
+2B06;N # UPWARDS BLACK ARROW
+2B07;N # DOWNWARDS BLACK ARROW
+2B08;N # NORTH EAST BLACK ARROW
+2B09;N # NORTH WEST BLACK ARROW
+2B0A;N # SOUTH EAST BLACK ARROW
+2B0B;N # SOUTH WEST BLACK ARROW
+2B0C;N # LEFT RIGHT BLACK ARROW
+2B0D;N # UP DOWN BLACK ARROW
+2B0E;N # RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F;N # RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10;N # LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11;N # LEFTWARDS ARROW WITH TIP UPWARDS
+2B12;N # SQUARE WITH TOP HALF BLACK
+2B13;N # SQUARE WITH BOTTOM HALF BLACK
+2C00;N # GLAGOLITIC CAPITAL LETTER AZU
+2C01;N # GLAGOLITIC CAPITAL LETTER BUKY
+2C02;N # GLAGOLITIC CAPITAL LETTER VEDE
+2C03;N # GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C04;N # GLAGOLITIC CAPITAL LETTER DOBRO
+2C05;N # GLAGOLITIC CAPITAL LETTER YESTU
+2C06;N # GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C07;N # GLAGOLITIC CAPITAL LETTER DZELO
+2C08;N # GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C09;N # GLAGOLITIC CAPITAL LETTER IZHE
+2C0A;N # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C0B;N # GLAGOLITIC CAPITAL LETTER I
+2C0C;N # GLAGOLITIC CAPITAL LETTER DJERVI
+2C0D;N # GLAGOLITIC CAPITAL LETTER KAKO
+2C0E;N # GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C0F;N # GLAGOLITIC CAPITAL LETTER MYSLITE
+2C10;N # GLAGOLITIC CAPITAL LETTER NASHI
+2C11;N # GLAGOLITIC CAPITAL LETTER ONU
+2C12;N # GLAGOLITIC CAPITAL LETTER POKOJI
+2C13;N # GLAGOLITIC CAPITAL LETTER RITSI
+2C14;N # GLAGOLITIC CAPITAL LETTER SLOVO
+2C15;N # GLAGOLITIC CAPITAL LETTER TVRIDO
+2C16;N # GLAGOLITIC CAPITAL LETTER UKU
+2C17;N # GLAGOLITIC CAPITAL LETTER FRITU
+2C18;N # GLAGOLITIC CAPITAL LETTER HERU
+2C19;N # GLAGOLITIC CAPITAL LETTER OTU
+2C1A;N # GLAGOLITIC CAPITAL LETTER PE
+2C1B;N # GLAGOLITIC CAPITAL LETTER SHTA
+2C1C;N # GLAGOLITIC CAPITAL LETTER TSI
+2C1D;N # GLAGOLITIC CAPITAL LETTER CHRIVI
+2C1E;N # GLAGOLITIC CAPITAL LETTER SHA
+2C1F;N # GLAGOLITIC CAPITAL LETTER YERU
+2C20;N # GLAGOLITIC CAPITAL LETTER YERI
+2C21;N # GLAGOLITIC CAPITAL LETTER YATI
+2C22;N # GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C23;N # GLAGOLITIC CAPITAL LETTER YU
+2C24;N # GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C25;N # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C26;N # GLAGOLITIC CAPITAL LETTER YO
+2C27;N # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C28;N # GLAGOLITIC CAPITAL LETTER BIG YUS
+2C29;N # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C2A;N # GLAGOLITIC CAPITAL LETTER FITA
+2C2B;N # GLAGOLITIC CAPITAL LETTER IZHITSA
+2C2C;N # GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C2D;N # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C2E;N # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30;N # GLAGOLITIC SMALL LETTER AZU
+2C31;N # GLAGOLITIC SMALL LETTER BUKY
+2C32;N # GLAGOLITIC SMALL LETTER VEDE
+2C33;N # GLAGOLITIC SMALL LETTER GLAGOLI
+2C34;N # GLAGOLITIC SMALL LETTER DOBRO
+2C35;N # GLAGOLITIC SMALL LETTER YESTU
+2C36;N # GLAGOLITIC SMALL LETTER ZHIVETE
+2C37;N # GLAGOLITIC SMALL LETTER DZELO
+2C38;N # GLAGOLITIC SMALL LETTER ZEMLJA
+2C39;N # GLAGOLITIC SMALL LETTER IZHE
+2C3A;N # GLAGOLITIC SMALL LETTER INITIAL IZHE
+2C3B;N # GLAGOLITIC SMALL LETTER I
+2C3C;N # GLAGOLITIC SMALL LETTER DJERVI
+2C3D;N # GLAGOLITIC SMALL LETTER KAKO
+2C3E;N # GLAGOLITIC SMALL LETTER LJUDIJE
+2C3F;N # GLAGOLITIC SMALL LETTER MYSLITE
+2C40;N # GLAGOLITIC SMALL LETTER NASHI
+2C41;N # GLAGOLITIC SMALL LETTER ONU
+2C42;N # GLAGOLITIC SMALL LETTER POKOJI
+2C43;N # GLAGOLITIC SMALL LETTER RITSI
+2C44;N # GLAGOLITIC SMALL LETTER SLOVO
+2C45;N # GLAGOLITIC SMALL LETTER TVRIDO
+2C46;N # GLAGOLITIC SMALL LETTER UKU
+2C47;N # GLAGOLITIC SMALL LETTER FRITU
+2C48;N # GLAGOLITIC SMALL LETTER HERU
+2C49;N # GLAGOLITIC SMALL LETTER OTU
+2C4A;N # GLAGOLITIC SMALL LETTER PE
+2C4B;N # GLAGOLITIC SMALL LETTER SHTA
+2C4C;N # GLAGOLITIC SMALL LETTER TSI
+2C4D;N # GLAGOLITIC SMALL LETTER CHRIVI
+2C4E;N # GLAGOLITIC SMALL LETTER SHA
+2C4F;N # GLAGOLITIC SMALL LETTER YERU
+2C50;N # GLAGOLITIC SMALL LETTER YERI
+2C51;N # GLAGOLITIC SMALL LETTER YATI
+2C52;N # GLAGOLITIC SMALL LETTER SPIDERY HA
+2C53;N # GLAGOLITIC SMALL LETTER YU
+2C54;N # GLAGOLITIC SMALL LETTER SMALL YUS
+2C55;N # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C56;N # GLAGOLITIC SMALL LETTER YO
+2C57;N # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C58;N # GLAGOLITIC SMALL LETTER BIG YUS
+2C59;N # GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C5A;N # GLAGOLITIC SMALL LETTER FITA
+2C5B;N # GLAGOLITIC SMALL LETTER IZHITSA
+2C5C;N # GLAGOLITIC SMALL LETTER SHTAPIC
+2C5D;N # GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C5E;N # GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C80;N # COPTIC CAPITAL LETTER ALFA
+2C81;N # COPTIC SMALL LETTER ALFA
+2C82;N # COPTIC CAPITAL LETTER VIDA
+2C83;N # COPTIC SMALL LETTER VIDA
+2C84;N # COPTIC CAPITAL LETTER GAMMA
+2C85;N # COPTIC SMALL LETTER GAMMA
+2C86;N # COPTIC CAPITAL LETTER DALDA
+2C87;N # COPTIC SMALL LETTER DALDA
+2C88;N # COPTIC CAPITAL LETTER EIE
+2C89;N # COPTIC SMALL LETTER EIE
+2C8A;N # COPTIC CAPITAL LETTER SOU
+2C8B;N # COPTIC SMALL LETTER SOU
+2C8C;N # COPTIC CAPITAL LETTER ZATA
+2C8D;N # COPTIC SMALL LETTER ZATA
+2C8E;N # COPTIC CAPITAL LETTER HATE
+2C8F;N # COPTIC SMALL LETTER HATE
+2C90;N # COPTIC CAPITAL LETTER THETHE
+2C91;N # COPTIC SMALL LETTER THETHE
+2C92;N # COPTIC CAPITAL LETTER IAUDA
+2C93;N # COPTIC SMALL LETTER IAUDA
+2C94;N # COPTIC CAPITAL LETTER KAPA
+2C95;N # COPTIC SMALL LETTER KAPA
+2C96;N # COPTIC CAPITAL LETTER LAULA
+2C97;N # COPTIC SMALL LETTER LAULA
+2C98;N # COPTIC CAPITAL LETTER MI
+2C99;N # COPTIC SMALL LETTER MI
+2C9A;N # COPTIC CAPITAL LETTER NI
+2C9B;N # COPTIC SMALL LETTER NI
+2C9C;N # COPTIC CAPITAL LETTER KSI
+2C9D;N # COPTIC SMALL LETTER KSI
+2C9E;N # COPTIC CAPITAL LETTER O
+2C9F;N # COPTIC SMALL LETTER O
+2CA0;N # COPTIC CAPITAL LETTER PI
+2CA1;N # COPTIC SMALL LETTER PI
+2CA2;N # COPTIC CAPITAL LETTER RO
+2CA3;N # COPTIC SMALL LETTER RO
+2CA4;N # COPTIC CAPITAL LETTER SIMA
+2CA5;N # COPTIC SMALL LETTER SIMA
+2CA6;N # COPTIC CAPITAL LETTER TAU
+2CA7;N # COPTIC SMALL LETTER TAU
+2CA8;N # COPTIC CAPITAL LETTER UA
+2CA9;N # COPTIC SMALL LETTER UA
+2CAA;N # COPTIC CAPITAL LETTER FI
+2CAB;N # COPTIC SMALL LETTER FI
+2CAC;N # COPTIC CAPITAL LETTER KHI
+2CAD;N # COPTIC SMALL LETTER KHI
+2CAE;N # COPTIC CAPITAL LETTER PSI
+2CAF;N # COPTIC SMALL LETTER PSI
+2CB0;N # COPTIC CAPITAL LETTER OOU
+2CB1;N # COPTIC SMALL LETTER OOU
+2CB2;N # COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB3;N # COPTIC SMALL LETTER DIALECT-P ALEF
+2CB4;N # COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB5;N # COPTIC SMALL LETTER OLD COPTIC AIN
+2CB6;N # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB7;N # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB8;N # COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CB9;N # COPTIC SMALL LETTER DIALECT-P KAPA
+2CBA;N # COPTIC CAPITAL LETTER DIALECT-P NI
+2CBB;N # COPTIC SMALL LETTER DIALECT-P NI
+2CBC;N # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBD;N # COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBE;N # COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CBF;N # COPTIC SMALL LETTER OLD COPTIC OOU
+2CC0;N # COPTIC CAPITAL LETTER SAMPI
+2CC1;N # COPTIC SMALL LETTER SAMPI
+2CC2;N # COPTIC CAPITAL LETTER CROSSED SHEI
+2CC3;N # COPTIC SMALL LETTER CROSSED SHEI
+2CC4;N # COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC5;N # COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC6;N # COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC7;N # COPTIC SMALL LETTER OLD COPTIC ESH
+2CC8;N # COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CC9;N # COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCA;N # COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCB;N # COPTIC SMALL LETTER DIALECT-P HORI
+2CCC;N # COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCD;N # COPTIC SMALL LETTER OLD COPTIC HORI
+2CCE;N # COPTIC CAPITAL LETTER OLD COPTIC HA
+2CCF;N # COPTIC SMALL LETTER OLD COPTIC HA
+2CD0;N # COPTIC CAPITAL LETTER L-SHAPED HA
+2CD1;N # COPTIC SMALL LETTER L-SHAPED HA
+2CD2;N # COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD3;N # COPTIC SMALL LETTER OLD COPTIC HEI
+2CD4;N # COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD5;N # COPTIC SMALL LETTER OLD COPTIC HAT
+2CD6;N # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD7;N # COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD8;N # COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CD9;N # COPTIC SMALL LETTER OLD COPTIC DJA
+2CDA;N # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDB;N # COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDC;N # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDD;N # COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDE;N # COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CDF;N # COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE0;N # COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE1;N # COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE2;N # COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CE3;N # COPTIC SMALL LETTER OLD NUBIAN WAU
+2CE4;N # COPTIC SYMBOL KAI
+2CE5;N # COPTIC SYMBOL MI RO
+2CE6;N # COPTIC SYMBOL PI RO
+2CE7;N # COPTIC SYMBOL STAUROS
+2CE8;N # COPTIC SYMBOL TAU RO
+2CE9;N # COPTIC SYMBOL KHI RO
+2CEA;N # COPTIC SYMBOL SHIMA SIMA
+2CF9;N # COPTIC OLD NUBIAN FULL STOP
+2CFA;N # COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB;N # COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC;N # COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD;N # COPTIC FRACTION ONE HALF
+2CFE;N # COPTIC FULL STOP
+2CFF;N # COPTIC MORPHOLOGICAL DIVIDER
+2D00;N # GEORGIAN SMALL LETTER AN
+2D01;N # GEORGIAN SMALL LETTER BAN
+2D02;N # GEORGIAN SMALL LETTER GAN
+2D03;N # GEORGIAN SMALL LETTER DON
+2D04;N # GEORGIAN SMALL LETTER EN
+2D05;N # GEORGIAN SMALL LETTER VIN
+2D06;N # GEORGIAN SMALL LETTER ZEN
+2D07;N # GEORGIAN SMALL LETTER TAN
+2D08;N # GEORGIAN SMALL LETTER IN
+2D09;N # GEORGIAN SMALL LETTER KAN
+2D0A;N # GEORGIAN SMALL LETTER LAS
+2D0B;N # GEORGIAN SMALL LETTER MAN
+2D0C;N # GEORGIAN SMALL LETTER NAR
+2D0D;N # GEORGIAN SMALL LETTER ON
+2D0E;N # GEORGIAN SMALL LETTER PAR
+2D0F;N # GEORGIAN SMALL LETTER ZHAR
+2D10;N # GEORGIAN SMALL LETTER RAE
+2D11;N # GEORGIAN SMALL LETTER SAN
+2D12;N # GEORGIAN SMALL LETTER TAR
+2D13;N # GEORGIAN SMALL LETTER UN
+2D14;N # GEORGIAN SMALL LETTER PHAR
+2D15;N # GEORGIAN SMALL LETTER KHAR
+2D16;N # GEORGIAN SMALL LETTER GHAN
+2D17;N # GEORGIAN SMALL LETTER QAR
+2D18;N # GEORGIAN SMALL LETTER SHIN
+2D19;N # GEORGIAN SMALL LETTER CHIN
+2D1A;N # GEORGIAN SMALL LETTER CAN
+2D1B;N # GEORGIAN SMALL LETTER JIL
+2D1C;N # GEORGIAN SMALL LETTER CIL
+2D1D;N # GEORGIAN SMALL LETTER CHAR
+2D1E;N # GEORGIAN SMALL LETTER XAN
+2D1F;N # GEORGIAN SMALL LETTER JHAN
+2D20;N # GEORGIAN SMALL LETTER HAE
+2D21;N # GEORGIAN SMALL LETTER HE
+2D22;N # GEORGIAN SMALL LETTER HIE
+2D23;N # GEORGIAN SMALL LETTER WE
+2D24;N # GEORGIAN SMALL LETTER HAR
+2D25;N # GEORGIAN SMALL LETTER HOE
+2D30;N # TIFINAGH LETTER YA
+2D31;N # TIFINAGH LETTER YAB
+2D32;N # TIFINAGH LETTER YABH
+2D33;N # TIFINAGH LETTER YAG
+2D34;N # TIFINAGH LETTER YAGHH
+2D35;N # TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36;N # TIFINAGH LETTER YAJ
+2D37;N # TIFINAGH LETTER YAD
+2D38;N # TIFINAGH LETTER YADH
+2D39;N # TIFINAGH LETTER YADD
+2D3A;N # TIFINAGH LETTER YADDH
+2D3B;N # TIFINAGH LETTER YEY
+2D3C;N # TIFINAGH LETTER YAF
+2D3D;N # TIFINAGH LETTER YAK
+2D3E;N # TIFINAGH LETTER TUAREG YAK
+2D3F;N # TIFINAGH LETTER YAKHH
+2D40;N # TIFINAGH LETTER YAH
+2D41;N # TIFINAGH LETTER BERBER ACADEMY YAH
+2D42;N # TIFINAGH LETTER TUAREG YAH
+2D43;N # TIFINAGH LETTER YAHH
+2D44;N # TIFINAGH LETTER YAA
+2D45;N # TIFINAGH LETTER YAKH
+2D46;N # TIFINAGH LETTER TUAREG YAKH
+2D47;N # TIFINAGH LETTER YAQ
+2D48;N # TIFINAGH LETTER TUAREG YAQ
+2D49;N # TIFINAGH LETTER YI
+2D4A;N # TIFINAGH LETTER YAZH
+2D4B;N # TIFINAGH LETTER AHAGGAR YAZH
+2D4C;N # TIFINAGH LETTER TUAREG YAZH
+2D4D;N # TIFINAGH LETTER YAL
+2D4E;N # TIFINAGH LETTER YAM
+2D4F;N # TIFINAGH LETTER YAN
+2D50;N # TIFINAGH LETTER TUAREG YAGN
+2D51;N # TIFINAGH LETTER TUAREG YANG
+2D52;N # TIFINAGH LETTER YAP
+2D53;N # TIFINAGH LETTER YU
+2D54;N # TIFINAGH LETTER YAR
+2D55;N # TIFINAGH LETTER YARR
+2D56;N # TIFINAGH LETTER YAGH
+2D57;N # TIFINAGH LETTER TUAREG YAGH
+2D58;N # TIFINAGH LETTER AYER YAGH
+2D59;N # TIFINAGH LETTER YAS
+2D5A;N # TIFINAGH LETTER YASS
+2D5B;N # TIFINAGH LETTER YASH
+2D5C;N # TIFINAGH LETTER YAT
+2D5D;N # TIFINAGH LETTER YATH
+2D5E;N # TIFINAGH LETTER YACH
+2D5F;N # TIFINAGH LETTER YATT
+2D60;N # TIFINAGH LETTER YAV
+2D61;N # TIFINAGH LETTER YAW
+2D62;N # TIFINAGH LETTER YAY
+2D63;N # TIFINAGH LETTER YAZ
+2D64;N # TIFINAGH LETTER TAWELLEMET YAZ
+2D65;N # TIFINAGH LETTER YAZZ
+2D6F;N # TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80;N # ETHIOPIC SYLLABLE LOA
+2D81;N # ETHIOPIC SYLLABLE MOA
+2D82;N # ETHIOPIC SYLLABLE ROA
+2D83;N # ETHIOPIC SYLLABLE SOA
+2D84;N # ETHIOPIC SYLLABLE SHOA
+2D85;N # ETHIOPIC SYLLABLE BOA
+2D86;N # ETHIOPIC SYLLABLE TOA
+2D87;N # ETHIOPIC SYLLABLE COA
+2D88;N # ETHIOPIC SYLLABLE NOA
+2D89;N # ETHIOPIC SYLLABLE NYOA
+2D8A;N # ETHIOPIC SYLLABLE GLOTTAL OA
+2D8B;N # ETHIOPIC SYLLABLE ZOA
+2D8C;N # ETHIOPIC SYLLABLE DOA
+2D8D;N # ETHIOPIC SYLLABLE DDOA
+2D8E;N # ETHIOPIC SYLLABLE JOA
+2D8F;N # ETHIOPIC SYLLABLE THOA
+2D90;N # ETHIOPIC SYLLABLE CHOA
+2D91;N # ETHIOPIC SYLLABLE PHOA
+2D92;N # ETHIOPIC SYLLABLE POA
+2D93;N # ETHIOPIC SYLLABLE GGWA
+2D94;N # ETHIOPIC SYLLABLE GGWI
+2D95;N # ETHIOPIC SYLLABLE GGWEE
+2D96;N # ETHIOPIC SYLLABLE GGWE
+2DA0;N # ETHIOPIC SYLLABLE SSA
+2DA1;N # ETHIOPIC SYLLABLE SSU
+2DA2;N # ETHIOPIC SYLLABLE SSI
+2DA3;N # ETHIOPIC SYLLABLE SSAA
+2DA4;N # ETHIOPIC SYLLABLE SSEE
+2DA5;N # ETHIOPIC SYLLABLE SSE
+2DA6;N # ETHIOPIC SYLLABLE SSO
+2DA8;N # ETHIOPIC SYLLABLE CCA
+2DA9;N # ETHIOPIC SYLLABLE CCU
+2DAA;N # ETHIOPIC SYLLABLE CCI
+2DAB;N # ETHIOPIC SYLLABLE CCAA
+2DAC;N # ETHIOPIC SYLLABLE CCEE
+2DAD;N # ETHIOPIC SYLLABLE CCE
+2DAE;N # ETHIOPIC SYLLABLE CCO
+2DB0;N # ETHIOPIC SYLLABLE ZZA
+2DB1;N # ETHIOPIC SYLLABLE ZZU
+2DB2;N # ETHIOPIC SYLLABLE ZZI
+2DB3;N # ETHIOPIC SYLLABLE ZZAA
+2DB4;N # ETHIOPIC SYLLABLE ZZEE
+2DB5;N # ETHIOPIC SYLLABLE ZZE
+2DB6;N # ETHIOPIC SYLLABLE ZZO
+2DB8;N # ETHIOPIC SYLLABLE CCHA
+2DB9;N # ETHIOPIC SYLLABLE CCHU
+2DBA;N # ETHIOPIC SYLLABLE CCHI
+2DBB;N # ETHIOPIC SYLLABLE CCHAA
+2DBC;N # ETHIOPIC SYLLABLE CCHEE
+2DBD;N # ETHIOPIC SYLLABLE CCHE
+2DBE;N # ETHIOPIC SYLLABLE CCHO
+2DC0;N # ETHIOPIC SYLLABLE QYA
+2DC1;N # ETHIOPIC SYLLABLE QYU
+2DC2;N # ETHIOPIC SYLLABLE QYI
+2DC3;N # ETHIOPIC SYLLABLE QYAA
+2DC4;N # ETHIOPIC SYLLABLE QYEE
+2DC5;N # ETHIOPIC SYLLABLE QYE
+2DC6;N # ETHIOPIC SYLLABLE QYO
+2DC8;N # ETHIOPIC SYLLABLE KYA
+2DC9;N # ETHIOPIC SYLLABLE KYU
+2DCA;N # ETHIOPIC SYLLABLE KYI
+2DCB;N # ETHIOPIC SYLLABLE KYAA
+2DCC;N # ETHIOPIC SYLLABLE KYEE
+2DCD;N # ETHIOPIC SYLLABLE KYE
+2DCE;N # ETHIOPIC SYLLABLE KYO
+2DD0;N # ETHIOPIC SYLLABLE XYA
+2DD1;N # ETHIOPIC SYLLABLE XYU
+2DD2;N # ETHIOPIC SYLLABLE XYI
+2DD3;N # ETHIOPIC SYLLABLE XYAA
+2DD4;N # ETHIOPIC SYLLABLE XYEE
+2DD5;N # ETHIOPIC SYLLABLE XYE
+2DD6;N # ETHIOPIC SYLLABLE XYO
+2DD8;N # ETHIOPIC SYLLABLE GYA
+2DD9;N # ETHIOPIC SYLLABLE GYU
+2DDA;N # ETHIOPIC SYLLABLE GYI
+2DDB;N # ETHIOPIC SYLLABLE GYAA
+2DDC;N # ETHIOPIC SYLLABLE GYEE
+2DDD;N # ETHIOPIC SYLLABLE GYE
+2DDE;N # ETHIOPIC SYLLABLE GYO
+2E00;N # RIGHT ANGLE SUBSTITUTION MARKER
+2E01;N # RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02;N # LEFT SUBSTITUTION BRACKET
+2E03;N # RIGHT SUBSTITUTION BRACKET
+2E04;N # LEFT DOTTED SUBSTITUTION BRACKET
+2E05;N # RIGHT DOTTED SUBSTITUTION BRACKET
+2E06;N # RAISED INTERPOLATION MARKER
+2E07;N # RAISED DOTTED INTERPOLATION MARKER
+2E08;N # DOTTED TRANSPOSITION MARKER
+2E09;N # LEFT TRANSPOSITION BRACKET
+2E0A;N # RIGHT TRANSPOSITION BRACKET
+2E0B;N # RAISED SQUARE
+2E0C;N # LEFT RAISED OMISSION BRACKET
+2E0D;N # RIGHT RAISED OMISSION BRACKET
+2E0E;N # EDITORIAL CORONIS
+2E0F;N # PARAGRAPHOS
+2E10;N # FORKED PARAGRAPHOS
+2E11;N # REVERSED FORKED PARAGRAPHOS
+2E12;N # HYPODIASTOLE
+2E13;N # DOTTED OBELOS
+2E14;N # DOWNWARDS ANCORA
+2E15;N # UPWARDS ANCORA
+2E16;N # DOTTED RIGHT-POINTING ANGLE
+2E17;N # DOUBLE OBLIQUE HYPHEN
+2E1C;N # LEFT LOW PARAPHRASE BRACKET
+2E1D;N # RIGHT LOW PARAPHRASE BRACKET
+2E80;W # CJK RADICAL REPEAT
+2E81;W # CJK RADICAL CLIFF
+2E82;W # CJK RADICAL SECOND ONE
+2E83;W # CJK RADICAL SECOND TWO
+2E84;W # CJK RADICAL SECOND THREE
+2E85;W # CJK RADICAL PERSON
+2E86;W # CJK RADICAL BOX
+2E87;W # CJK RADICAL TABLE
+2E88;W # CJK RADICAL KNIFE ONE
+2E89;W # CJK RADICAL KNIFE TWO
+2E8A;W # CJK RADICAL DIVINATION
+2E8B;W # CJK RADICAL SEAL
+2E8C;W # CJK RADICAL SMALL ONE
+2E8D;W # CJK RADICAL SMALL TWO
+2E8E;W # CJK RADICAL LAME ONE
+2E8F;W # CJK RADICAL LAME TWO
+2E90;W # CJK RADICAL LAME THREE
+2E91;W # CJK RADICAL LAME FOUR
+2E92;W # CJK RADICAL SNAKE
+2E93;W # CJK RADICAL THREAD
+2E94;W # CJK RADICAL SNOUT ONE
+2E95;W # CJK RADICAL SNOUT TWO
+2E96;W # CJK RADICAL HEART ONE
+2E97;W # CJK RADICAL HEART TWO
+2E98;W # CJK RADICAL HAND
+2E99;W # CJK RADICAL RAP
+2E9B;W # CJK RADICAL CHOKE
+2E9C;W # CJK RADICAL SUN
+2E9D;W # CJK RADICAL MOON
+2E9E;W # CJK RADICAL DEATH
+2E9F;W # CJK RADICAL MOTHER
+2EA0;W # CJK RADICAL CIVILIAN
+2EA1;W # CJK RADICAL WATER ONE
+2EA2;W # CJK RADICAL WATER TWO
+2EA3;W # CJK RADICAL FIRE
+2EA4;W # CJK RADICAL PAW ONE
+2EA5;W # CJK RADICAL PAW TWO
+2EA6;W # CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+2EA7;W # CJK RADICAL COW
+2EA8;W # CJK RADICAL DOG
+2EA9;W # CJK RADICAL JADE
+2EAA;W # CJK RADICAL BOLT OF CLOTH
+2EAB;W # CJK RADICAL EYE
+2EAC;W # CJK RADICAL SPIRIT ONE
+2EAD;W # CJK RADICAL SPIRIT TWO
+2EAE;W # CJK RADICAL BAMBOO
+2EAF;W # CJK RADICAL SILK
+2EB0;W # CJK RADICAL C-SIMPLIFIED SILK
+2EB1;W # CJK RADICAL NET ONE
+2EB2;W # CJK RADICAL NET TWO
+2EB3;W # CJK RADICAL NET THREE
+2EB4;W # CJK RADICAL NET FOUR
+2EB5;W # CJK RADICAL MESH
+2EB6;W # CJK RADICAL SHEEP
+2EB7;W # CJK RADICAL RAM
+2EB8;W # CJK RADICAL EWE
+2EB9;W # CJK RADICAL OLD
+2EBA;W # CJK RADICAL BRUSH ONE
+2EBB;W # CJK RADICAL BRUSH TWO
+2EBC;W # CJK RADICAL MEAT
+2EBD;W # CJK RADICAL MORTAR
+2EBE;W # CJK RADICAL GRASS ONE
+2EBF;W # CJK RADICAL GRASS TWO
+2EC0;W # CJK RADICAL GRASS THREE
+2EC1;W # CJK RADICAL TIGER
+2EC2;W # CJK RADICAL CLOTHES
+2EC3;W # CJK RADICAL WEST ONE
+2EC4;W # CJK RADICAL WEST TWO
+2EC5;W # CJK RADICAL C-SIMPLIFIED SEE
+2EC6;W # CJK RADICAL SIMPLIFIED HORN
+2EC7;W # CJK RADICAL HORN
+2EC8;W # CJK RADICAL C-SIMPLIFIED SPEECH
+2EC9;W # CJK RADICAL C-SIMPLIFIED SHELL
+2ECA;W # CJK RADICAL FOOT
+2ECB;W # CJK RADICAL C-SIMPLIFIED CART
+2ECC;W # CJK RADICAL SIMPLIFIED WALK
+2ECD;W # CJK RADICAL WALK ONE
+2ECE;W # CJK RADICAL WALK TWO
+2ECF;W # CJK RADICAL CITY
+2ED0;W # CJK RADICAL C-SIMPLIFIED GOLD
+2ED1;W # CJK RADICAL LONG ONE
+2ED2;W # CJK RADICAL LONG TWO
+2ED3;W # CJK RADICAL C-SIMPLIFIED LONG
+2ED4;W # CJK RADICAL C-SIMPLIFIED GATE
+2ED5;W # CJK RADICAL MOUND ONE
+2ED6;W # CJK RADICAL MOUND TWO
+2ED7;W # CJK RADICAL RAIN
+2ED8;W # CJK RADICAL BLUE
+2ED9;W # CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+2EDA;W # CJK RADICAL C-SIMPLIFIED LEAF
+2EDB;W # CJK RADICAL C-SIMPLIFIED WIND
+2EDC;W # CJK RADICAL C-SIMPLIFIED FLY
+2EDD;W # CJK RADICAL EAT ONE
+2EDE;W # CJK RADICAL EAT TWO
+2EDF;W # CJK RADICAL EAT THREE
+2EE0;W # CJK RADICAL C-SIMPLIFIED EAT
+2EE1;W # CJK RADICAL HEAD
+2EE2;W # CJK RADICAL C-SIMPLIFIED HORSE
+2EE3;W # CJK RADICAL BONE
+2EE4;W # CJK RADICAL GHOST
+2EE5;W # CJK RADICAL C-SIMPLIFIED FISH
+2EE6;W # CJK RADICAL C-SIMPLIFIED BIRD
+2EE7;W # CJK RADICAL C-SIMPLIFIED SALT
+2EE8;W # CJK RADICAL SIMPLIFIED WHEAT
+2EE9;W # CJK RADICAL SIMPLIFIED YELLOW
+2EEA;W # CJK RADICAL C-SIMPLIFIED FROG
+2EEB;W # CJK RADICAL J-SIMPLIFIED EVEN
+2EEC;W # CJK RADICAL C-SIMPLIFIED EVEN
+2EED;W # CJK RADICAL J-SIMPLIFIED TOOTH
+2EEE;W # CJK RADICAL C-SIMPLIFIED TOOTH
+2EEF;W # CJK RADICAL J-SIMPLIFIED DRAGON
+2EF0;W # CJK RADICAL C-SIMPLIFIED DRAGON
+2EF1;W # CJK RADICAL TURTLE
+2EF2;W # CJK RADICAL J-SIMPLIFIED TURTLE
+2EF3;W # CJK RADICAL C-SIMPLIFIED TURTLE
+2F00;W # KANGXI RADICAL ONE
+2F01;W # KANGXI RADICAL LINE
+2F02;W # KANGXI RADICAL DOT
+2F03;W # KANGXI RADICAL SLASH
+2F04;W # KANGXI RADICAL SECOND
+2F05;W # KANGXI RADICAL HOOK
+2F06;W # KANGXI RADICAL TWO
+2F07;W # KANGXI RADICAL LID
+2F08;W # KANGXI RADICAL MAN
+2F09;W # KANGXI RADICAL LEGS
+2F0A;W # KANGXI RADICAL ENTER
+2F0B;W # KANGXI RADICAL EIGHT
+2F0C;W # KANGXI RADICAL DOWN BOX
+2F0D;W # KANGXI RADICAL COVER
+2F0E;W # KANGXI RADICAL ICE
+2F0F;W # KANGXI RADICAL TABLE
+2F10;W # KANGXI RADICAL OPEN BOX
+2F11;W # KANGXI RADICAL KNIFE
+2F12;W # KANGXI RADICAL POWER
+2F13;W # KANGXI RADICAL WRAP
+2F14;W # KANGXI RADICAL SPOON
+2F15;W # KANGXI RADICAL RIGHT OPEN BOX
+2F16;W # KANGXI RADICAL HIDING ENCLOSURE
+2F17;W # KANGXI RADICAL TEN
+2F18;W # KANGXI RADICAL DIVINATION
+2F19;W # KANGXI RADICAL SEAL
+2F1A;W # KANGXI RADICAL CLIFF
+2F1B;W # KANGXI RADICAL PRIVATE
+2F1C;W # KANGXI RADICAL AGAIN
+2F1D;W # KANGXI RADICAL MOUTH
+2F1E;W # KANGXI RADICAL ENCLOSURE
+2F1F;W # KANGXI RADICAL EARTH
+2F20;W # KANGXI RADICAL SCHOLAR
+2F21;W # KANGXI RADICAL GO
+2F22;W # KANGXI RADICAL GO SLOWLY
+2F23;W # KANGXI RADICAL EVENING
+2F24;W # KANGXI RADICAL BIG
+2F25;W # KANGXI RADICAL WOMAN
+2F26;W # KANGXI RADICAL CHILD
+2F27;W # KANGXI RADICAL ROOF
+2F28;W # KANGXI RADICAL INCH
+2F29;W # KANGXI RADICAL SMALL
+2F2A;W # KANGXI RADICAL LAME
+2F2B;W # KANGXI RADICAL CORPSE
+2F2C;W # KANGXI RADICAL SPROUT
+2F2D;W # KANGXI RADICAL MOUNTAIN
+2F2E;W # KANGXI RADICAL RIVER
+2F2F;W # KANGXI RADICAL WORK
+2F30;W # KANGXI RADICAL ONESELF
+2F31;W # KANGXI RADICAL TURBAN
+2F32;W # KANGXI RADICAL DRY
+2F33;W # KANGXI RADICAL SHORT THREAD
+2F34;W # KANGXI RADICAL DOTTED CLIFF
+2F35;W # KANGXI RADICAL LONG STRIDE
+2F36;W # KANGXI RADICAL TWO HANDS
+2F37;W # KANGXI RADICAL SHOOT
+2F38;W # KANGXI RADICAL BOW
+2F39;W # KANGXI RADICAL SNOUT
+2F3A;W # KANGXI RADICAL BRISTLE
+2F3B;W # KANGXI RADICAL STEP
+2F3C;W # KANGXI RADICAL HEART
+2F3D;W # KANGXI RADICAL HALBERD
+2F3E;W # KANGXI RADICAL DOOR
+2F3F;W # KANGXI RADICAL HAND
+2F40;W # KANGXI RADICAL BRANCH
+2F41;W # KANGXI RADICAL RAP
+2F42;W # KANGXI RADICAL SCRIPT
+2F43;W # KANGXI RADICAL DIPPER
+2F44;W # KANGXI RADICAL AXE
+2F45;W # KANGXI RADICAL SQUARE
+2F46;W # KANGXI RADICAL NOT
+2F47;W # KANGXI RADICAL SUN
+2F48;W # KANGXI RADICAL SAY
+2F49;W # KANGXI RADICAL MOON
+2F4A;W # KANGXI RADICAL TREE
+2F4B;W # KANGXI RADICAL LACK
+2F4C;W # KANGXI RADICAL STOP
+2F4D;W # KANGXI RADICAL DEATH
+2F4E;W # KANGXI RADICAL WEAPON
+2F4F;W # KANGXI RADICAL DO NOT
+2F50;W # KANGXI RADICAL COMPARE
+2F51;W # KANGXI RADICAL FUR
+2F52;W # KANGXI RADICAL CLAN
+2F53;W # KANGXI RADICAL STEAM
+2F54;W # KANGXI RADICAL WATER
+2F55;W # KANGXI RADICAL FIRE
+2F56;W # KANGXI RADICAL CLAW
+2F57;W # KANGXI RADICAL FATHER
+2F58;W # KANGXI RADICAL DOUBLE X
+2F59;W # KANGXI RADICAL HALF TREE TRUNK
+2F5A;W # KANGXI RADICAL SLICE
+2F5B;W # KANGXI RADICAL FANG
+2F5C;W # KANGXI RADICAL COW
+2F5D;W # KANGXI RADICAL DOG
+2F5E;W # KANGXI RADICAL PROFOUND
+2F5F;W # KANGXI RADICAL JADE
+2F60;W # KANGXI RADICAL MELON
+2F61;W # KANGXI RADICAL TILE
+2F62;W # KANGXI RADICAL SWEET
+2F63;W # KANGXI RADICAL LIFE
+2F64;W # KANGXI RADICAL USE
+2F65;W # KANGXI RADICAL FIELD
+2F66;W # KANGXI RADICAL BOLT OF CLOTH
+2F67;W # KANGXI RADICAL SICKNESS
+2F68;W # KANGXI RADICAL DOTTED TENT
+2F69;W # KANGXI RADICAL WHITE
+2F6A;W # KANGXI RADICAL SKIN
+2F6B;W # KANGXI RADICAL DISH
+2F6C;W # KANGXI RADICAL EYE
+2F6D;W # KANGXI RADICAL SPEAR
+2F6E;W # KANGXI RADICAL ARROW
+2F6F;W # KANGXI RADICAL STONE
+2F70;W # KANGXI RADICAL SPIRIT
+2F71;W # KANGXI RADICAL TRACK
+2F72;W # KANGXI RADICAL GRAIN
+2F73;W # KANGXI RADICAL CAVE
+2F74;W # KANGXI RADICAL STAND
+2F75;W # KANGXI RADICAL BAMBOO
+2F76;W # KANGXI RADICAL RICE
+2F77;W # KANGXI RADICAL SILK
+2F78;W # KANGXI RADICAL JAR
+2F79;W # KANGXI RADICAL NET
+2F7A;W # KANGXI RADICAL SHEEP
+2F7B;W # KANGXI RADICAL FEATHER
+2F7C;W # KANGXI RADICAL OLD
+2F7D;W # KANGXI RADICAL AND
+2F7E;W # KANGXI RADICAL PLOW
+2F7F;W # KANGXI RADICAL EAR
+2F80;W # KANGXI RADICAL BRUSH
+2F81;W # KANGXI RADICAL MEAT
+2F82;W # KANGXI RADICAL MINISTER
+2F83;W # KANGXI RADICAL SELF
+2F84;W # KANGXI RADICAL ARRIVE
+2F85;W # KANGXI RADICAL MORTAR
+2F86;W # KANGXI RADICAL TONGUE
+2F87;W # KANGXI RADICAL OPPOSE
+2F88;W # KANGXI RADICAL BOAT
+2F89;W # KANGXI RADICAL STOPPING
+2F8A;W # KANGXI RADICAL COLOR
+2F8B;W # KANGXI RADICAL GRASS
+2F8C;W # KANGXI RADICAL TIGER
+2F8D;W # KANGXI RADICAL INSECT
+2F8E;W # KANGXI RADICAL BLOOD
+2F8F;W # KANGXI RADICAL WALK ENCLOSURE
+2F90;W # KANGXI RADICAL CLOTHES
+2F91;W # KANGXI RADICAL WEST
+2F92;W # KANGXI RADICAL SEE
+2F93;W # KANGXI RADICAL HORN
+2F94;W # KANGXI RADICAL SPEECH
+2F95;W # KANGXI RADICAL VALLEY
+2F96;W # KANGXI RADICAL BEAN
+2F97;W # KANGXI RADICAL PIG
+2F98;W # KANGXI RADICAL BADGER
+2F99;W # KANGXI RADICAL SHELL
+2F9A;W # KANGXI RADICAL RED
+2F9B;W # KANGXI RADICAL RUN
+2F9C;W # KANGXI RADICAL FOOT
+2F9D;W # KANGXI RADICAL BODY
+2F9E;W # KANGXI RADICAL CART
+2F9F;W # KANGXI RADICAL BITTER
+2FA0;W # KANGXI RADICAL MORNING
+2FA1;W # KANGXI RADICAL WALK
+2FA2;W # KANGXI RADICAL CITY
+2FA3;W # KANGXI RADICAL WINE
+2FA4;W # KANGXI RADICAL DISTINGUISH
+2FA5;W # KANGXI RADICAL VILLAGE
+2FA6;W # KANGXI RADICAL GOLD
+2FA7;W # KANGXI RADICAL LONG
+2FA8;W # KANGXI RADICAL GATE
+2FA9;W # KANGXI RADICAL MOUND
+2FAA;W # KANGXI RADICAL SLAVE
+2FAB;W # KANGXI RADICAL SHORT TAILED BIRD
+2FAC;W # KANGXI RADICAL RAIN
+2FAD;W # KANGXI RADICAL BLUE
+2FAE;W # KANGXI RADICAL WRONG
+2FAF;W # KANGXI RADICAL FACE
+2FB0;W # KANGXI RADICAL LEATHER
+2FB1;W # KANGXI RADICAL TANNED LEATHER
+2FB2;W # KANGXI RADICAL LEEK
+2FB3;W # KANGXI RADICAL SOUND
+2FB4;W # KANGXI RADICAL LEAF
+2FB5;W # KANGXI RADICAL WIND
+2FB6;W # KANGXI RADICAL FLY
+2FB7;W # KANGXI RADICAL EAT
+2FB8;W # KANGXI RADICAL HEAD
+2FB9;W # KANGXI RADICAL FRAGRANT
+2FBA;W # KANGXI RADICAL HORSE
+2FBB;W # KANGXI RADICAL BONE
+2FBC;W # KANGXI RADICAL TALL
+2FBD;W # KANGXI RADICAL HAIR
+2FBE;W # KANGXI RADICAL FIGHT
+2FBF;W # KANGXI RADICAL SACRIFICIAL WINE
+2FC0;W # KANGXI RADICAL CAULDRON
+2FC1;W # KANGXI RADICAL GHOST
+2FC2;W # KANGXI RADICAL FISH
+2FC3;W # KANGXI RADICAL BIRD
+2FC4;W # KANGXI RADICAL SALT
+2FC5;W # KANGXI RADICAL DEER
+2FC6;W # KANGXI RADICAL WHEAT
+2FC7;W # KANGXI RADICAL HEMP
+2FC8;W # KANGXI RADICAL YELLOW
+2FC9;W # KANGXI RADICAL MILLET
+2FCA;W # KANGXI RADICAL BLACK
+2FCB;W # KANGXI RADICAL EMBROIDERY
+2FCC;W # KANGXI RADICAL FROG
+2FCD;W # KANGXI RADICAL TRIPOD
+2FCE;W # KANGXI RADICAL DRUM
+2FCF;W # KANGXI RADICAL RAT
+2FD0;W # KANGXI RADICAL NOSE
+2FD1;W # KANGXI RADICAL EVEN
+2FD2;W # KANGXI RADICAL TOOTH
+2FD3;W # KANGXI RADICAL DRAGON
+2FD4;W # KANGXI RADICAL TURTLE
+2FD5;W # KANGXI RADICAL FLUTE
+2FF0;W # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1;W # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2;W # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3;W # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4;W # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA;W # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB;W # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000;F # IDEOGRAPHIC SPACE
+3001;W # IDEOGRAPHIC COMMA
+3002;W # IDEOGRAPHIC FULL STOP
+3003;W # DITTO MARK
+3004;W # JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005;W # IDEOGRAPHIC ITERATION MARK
+3006;W # IDEOGRAPHIC CLOSING MARK
+3007;W # IDEOGRAPHIC NUMBER ZERO
+3008;W # LEFT ANGLE BRACKET
+3009;W # RIGHT ANGLE BRACKET
+300A;W # LEFT DOUBLE ANGLE BRACKET
+300B;W # RIGHT DOUBLE ANGLE BRACKET
+300C;W # LEFT CORNER BRACKET
+300D;W # RIGHT CORNER BRACKET
+300E;W # LEFT WHITE CORNER BRACKET
+300F;W # RIGHT WHITE CORNER BRACKET
+3010;W # LEFT BLACK LENTICULAR BRACKET
+3011;W # RIGHT BLACK LENTICULAR BRACKET
+3012;W # POSTAL MARK
+3013;W # GETA MARK
+3014;W # LEFT TORTOISE SHELL BRACKET
+3015;W # RIGHT TORTOISE SHELL BRACKET
+3016;W # LEFT WHITE LENTICULAR BRACKET
+3017;W # RIGHT WHITE LENTICULAR BRACKET
+3018;W # LEFT WHITE TORTOISE SHELL BRACKET
+3019;W # RIGHT WHITE TORTOISE SHELL BRACKET
+301A;W # LEFT WHITE SQUARE BRACKET
+301B;W # RIGHT WHITE SQUARE BRACKET
+301C;W # WAVE DASH
+301D;W # REVERSED DOUBLE PRIME QUOTATION MARK
+301E;W # DOUBLE PRIME QUOTATION MARK
+301F;W # LOW DOUBLE PRIME QUOTATION MARK
+3020;W # POSTAL MARK FACE
+3021;W # HANGZHOU NUMERAL ONE
+3022;W # HANGZHOU NUMERAL TWO
+3023;W # HANGZHOU NUMERAL THREE
+3024;W # HANGZHOU NUMERAL FOUR
+3025;W # HANGZHOU NUMERAL FIVE
+3026;W # HANGZHOU NUMERAL SIX
+3027;W # HANGZHOU NUMERAL SEVEN
+3028;W # HANGZHOU NUMERAL EIGHT
+3029;W # HANGZHOU NUMERAL NINE
+302A;W # IDEOGRAPHIC LEVEL TONE MARK
+302B;W # IDEOGRAPHIC RISING TONE MARK
+302C;W # IDEOGRAPHIC DEPARTING TONE MARK
+302D;W # IDEOGRAPHIC ENTERING TONE MARK
+302E;W # HANGUL SINGLE DOT TONE MARK
+302F;W # HANGUL DOUBLE DOT TONE MARK
+3030;W # WAVY DASH
+3031;W # VERTICAL KANA REPEAT MARK
+3032;W # VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+3033;W # VERTICAL KANA REPEAT MARK UPPER HALF
+3034;W # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+3035;W # VERTICAL KANA REPEAT MARK LOWER HALF
+3036;W # CIRCLED POSTAL MARK
+3037;W # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038;W # HANGZHOU NUMERAL TEN
+3039;W # HANGZHOU NUMERAL TWENTY
+303A;W # HANGZHOU NUMERAL THIRTY
+303B;W # VERTICAL IDEOGRAPHIC ITERATION MARK
+303C;W # MASU MARK
+303D;W # PART ALTERNATION MARK
+303E;W # IDEOGRAPHIC VARIATION INDICATOR
+303F;N # IDEOGRAPHIC HALF FILL SPACE
+3041;W # HIRAGANA LETTER SMALL A
+3042;W # HIRAGANA LETTER A
+3043;W # HIRAGANA LETTER SMALL I
+3044;W # HIRAGANA LETTER I
+3045;W # HIRAGANA LETTER SMALL U
+3046;W # HIRAGANA LETTER U
+3047;W # HIRAGANA LETTER SMALL E
+3048;W # HIRAGANA LETTER E
+3049;W # HIRAGANA LETTER SMALL O
+304A;W # HIRAGANA LETTER O
+304B;W # HIRAGANA LETTER KA
+304C;W # HIRAGANA LETTER GA
+304D;W # HIRAGANA LETTER KI
+304E;W # HIRAGANA LETTER GI
+304F;W # HIRAGANA LETTER KU
+3050;W # HIRAGANA LETTER GU
+3051;W # HIRAGANA LETTER KE
+3052;W # HIRAGANA LETTER GE
+3053;W # HIRAGANA LETTER KO
+3054;W # HIRAGANA LETTER GO
+3055;W # HIRAGANA LETTER SA
+3056;W # HIRAGANA LETTER ZA
+3057;W # HIRAGANA LETTER SI
+3058;W # HIRAGANA LETTER ZI
+3059;W # HIRAGANA LETTER SU
+305A;W # HIRAGANA LETTER ZU
+305B;W # HIRAGANA LETTER SE
+305C;W # HIRAGANA LETTER ZE
+305D;W # HIRAGANA LETTER SO
+305E;W # HIRAGANA LETTER ZO
+305F;W # HIRAGANA LETTER TA
+3060;W # HIRAGANA LETTER DA
+3061;W # HIRAGANA LETTER TI
+3062;W # HIRAGANA LETTER DI
+3063;W # HIRAGANA LETTER SMALL TU
+3064;W # HIRAGANA LETTER TU
+3065;W # HIRAGANA LETTER DU
+3066;W # HIRAGANA LETTER TE
+3067;W # HIRAGANA LETTER DE
+3068;W # HIRAGANA LETTER TO
+3069;W # HIRAGANA LETTER DO
+306A;W # HIRAGANA LETTER NA
+306B;W # HIRAGANA LETTER NI
+306C;W # HIRAGANA LETTER NU
+306D;W # HIRAGANA LETTER NE
+306E;W # HIRAGANA LETTER NO
+306F;W # HIRAGANA LETTER HA
+3070;W # HIRAGANA LETTER BA
+3071;W # HIRAGANA LETTER PA
+3072;W # HIRAGANA LETTER HI
+3073;W # HIRAGANA LETTER BI
+3074;W # HIRAGANA LETTER PI
+3075;W # HIRAGANA LETTER HU
+3076;W # HIRAGANA LETTER BU
+3077;W # HIRAGANA LETTER PU
+3078;W # HIRAGANA LETTER HE
+3079;W # HIRAGANA LETTER BE
+307A;W # HIRAGANA LETTER PE
+307B;W # HIRAGANA LETTER HO
+307C;W # HIRAGANA LETTER BO
+307D;W # HIRAGANA LETTER PO
+307E;W # HIRAGANA LETTER MA
+307F;W # HIRAGANA LETTER MI
+3080;W # HIRAGANA LETTER MU
+3081;W # HIRAGANA LETTER ME
+3082;W # HIRAGANA LETTER MO
+3083;W # HIRAGANA LETTER SMALL YA
+3084;W # HIRAGANA LETTER YA
+3085;W # HIRAGANA LETTER SMALL YU
+3086;W # HIRAGANA LETTER YU
+3087;W # HIRAGANA LETTER SMALL YO
+3088;W # HIRAGANA LETTER YO
+3089;W # HIRAGANA LETTER RA
+308A;W # HIRAGANA LETTER RI
+308B;W # HIRAGANA LETTER RU
+308C;W # HIRAGANA LETTER RE
+308D;W # HIRAGANA LETTER RO
+308E;W # HIRAGANA LETTER SMALL WA
+308F;W # HIRAGANA LETTER WA
+3090;W # HIRAGANA LETTER WI
+3091;W # HIRAGANA LETTER WE
+3092;W # HIRAGANA LETTER WO
+3093;W # HIRAGANA LETTER N
+3094;W # HIRAGANA LETTER VU
+3095;W # HIRAGANA LETTER SMALL KA
+3096;W # HIRAGANA LETTER SMALL KE
+3099;W # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A;W # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B;W # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C;W # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D;W # HIRAGANA ITERATION MARK
+309E;W # HIRAGANA VOICED ITERATION MARK
+309F;W # HIRAGANA DIGRAPH YORI
+30A0;W # KATAKANA-HIRAGANA DOUBLE HYPHEN
+30A1;W # KATAKANA LETTER SMALL A
+30A2;W # KATAKANA LETTER A
+30A3;W # KATAKANA LETTER SMALL I
+30A4;W # KATAKANA LETTER I
+30A5;W # KATAKANA LETTER SMALL U
+30A6;W # KATAKANA LETTER U
+30A7;W # KATAKANA LETTER SMALL E
+30A8;W # KATAKANA LETTER E
+30A9;W # KATAKANA LETTER SMALL O
+30AA;W # KATAKANA LETTER O
+30AB;W # KATAKANA LETTER KA
+30AC;W # KATAKANA LETTER GA
+30AD;W # KATAKANA LETTER KI
+30AE;W # KATAKANA LETTER GI
+30AF;W # KATAKANA LETTER KU
+30B0;W # KATAKANA LETTER GU
+30B1;W # KATAKANA LETTER KE
+30B2;W # KATAKANA LETTER GE
+30B3;W # KATAKANA LETTER KO
+30B4;W # KATAKANA LETTER GO
+30B5;W # KATAKANA LETTER SA
+30B6;W # KATAKANA LETTER ZA
+30B7;W # KATAKANA LETTER SI
+30B8;W # KATAKANA LETTER ZI
+30B9;W # KATAKANA LETTER SU
+30BA;W # KATAKANA LETTER ZU
+30BB;W # KATAKANA LETTER SE
+30BC;W # KATAKANA LETTER ZE
+30BD;W # KATAKANA LETTER SO
+30BE;W # KATAKANA LETTER ZO
+30BF;W # KATAKANA LETTER TA
+30C0;W # KATAKANA LETTER DA
+30C1;W # KATAKANA LETTER TI
+30C2;W # KATAKANA LETTER DI
+30C3;W # KATAKANA LETTER SMALL TU
+30C4;W # KATAKANA LETTER TU
+30C5;W # KATAKANA LETTER DU
+30C6;W # KATAKANA LETTER TE
+30C7;W # KATAKANA LETTER DE
+30C8;W # KATAKANA LETTER TO
+30C9;W # KATAKANA LETTER DO
+30CA;W # KATAKANA LETTER NA
+30CB;W # KATAKANA LETTER NI
+30CC;W # KATAKANA LETTER NU
+30CD;W # KATAKANA LETTER NE
+30CE;W # KATAKANA LETTER NO
+30CF;W # KATAKANA LETTER HA
+30D0;W # KATAKANA LETTER BA
+30D1;W # KATAKANA LETTER PA
+30D2;W # KATAKANA LETTER HI
+30D3;W # KATAKANA LETTER BI
+30D4;W # KATAKANA LETTER PI
+30D5;W # KATAKANA LETTER HU
+30D6;W # KATAKANA LETTER BU
+30D7;W # KATAKANA LETTER PU
+30D8;W # KATAKANA LETTER HE
+30D9;W # KATAKANA LETTER BE
+30DA;W # KATAKANA LETTER PE
+30DB;W # KATAKANA LETTER HO
+30DC;W # KATAKANA LETTER BO
+30DD;W # KATAKANA LETTER PO
+30DE;W # KATAKANA LETTER MA
+30DF;W # KATAKANA LETTER MI
+30E0;W # KATAKANA LETTER MU
+30E1;W # KATAKANA LETTER ME
+30E2;W # KATAKANA LETTER MO
+30E3;W # KATAKANA LETTER SMALL YA
+30E4;W # KATAKANA LETTER YA
+30E5;W # KATAKANA LETTER SMALL YU
+30E6;W # KATAKANA LETTER YU
+30E7;W # KATAKANA LETTER SMALL YO
+30E8;W # KATAKANA LETTER YO
+30E9;W # KATAKANA LETTER RA
+30EA;W # KATAKANA LETTER RI
+30EB;W # KATAKANA LETTER RU
+30EC;W # KATAKANA LETTER RE
+30ED;W # KATAKANA LETTER RO
+30EE;W # KATAKANA LETTER SMALL WA
+30EF;W # KATAKANA LETTER WA
+30F0;W # KATAKANA LETTER WI
+30F1;W # KATAKANA LETTER WE
+30F2;W # KATAKANA LETTER WO
+30F3;W # KATAKANA LETTER N
+30F4;W # KATAKANA LETTER VU
+30F5;W # KATAKANA LETTER SMALL KA
+30F6;W # KATAKANA LETTER SMALL KE
+30F7;W # KATAKANA LETTER VA
+30F8;W # KATAKANA LETTER VI
+30F9;W # KATAKANA LETTER VE
+30FA;W # KATAKANA LETTER VO
+30FB;W # KATAKANA MIDDLE DOT
+30FC;W # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD;W # KATAKANA ITERATION MARK
+30FE;W # KATAKANA VOICED ITERATION MARK
+30FF;W # KATAKANA DIGRAPH KOTO
+3105;W # BOPOMOFO LETTER B
+3106;W # BOPOMOFO LETTER P
+3107;W # BOPOMOFO LETTER M
+3108;W # BOPOMOFO LETTER F
+3109;W # BOPOMOFO LETTER D
+310A;W # BOPOMOFO LETTER T
+310B;W # BOPOMOFO LETTER N
+310C;W # BOPOMOFO LETTER L
+310D;W # BOPOMOFO LETTER G
+310E;W # BOPOMOFO LETTER K
+310F;W # BOPOMOFO LETTER H
+3110;W # BOPOMOFO LETTER J
+3111;W # BOPOMOFO LETTER Q
+3112;W # BOPOMOFO LETTER X
+3113;W # BOPOMOFO LETTER ZH
+3114;W # BOPOMOFO LETTER CH
+3115;W # BOPOMOFO LETTER SH
+3116;W # BOPOMOFO LETTER R
+3117;W # BOPOMOFO LETTER Z
+3118;W # BOPOMOFO LETTER C
+3119;W # BOPOMOFO LETTER S
+311A;W # BOPOMOFO LETTER A
+311B;W # BOPOMOFO LETTER O
+311C;W # BOPOMOFO LETTER E
+311D;W # BOPOMOFO LETTER EH
+311E;W # BOPOMOFO LETTER AI
+311F;W # BOPOMOFO LETTER EI
+3120;W # BOPOMOFO LETTER AU
+3121;W # BOPOMOFO LETTER OU
+3122;W # BOPOMOFO LETTER AN
+3123;W # BOPOMOFO LETTER EN
+3124;W # BOPOMOFO LETTER ANG
+3125;W # BOPOMOFO LETTER ENG
+3126;W # BOPOMOFO LETTER ER
+3127;W # BOPOMOFO LETTER I
+3128;W # BOPOMOFO LETTER U
+3129;W # BOPOMOFO LETTER IU
+312A;W # BOPOMOFO LETTER V
+312B;W # BOPOMOFO LETTER NG
+312C;W # BOPOMOFO LETTER GN
+3131;W # HANGUL LETTER KIYEOK
+3132;W # HANGUL LETTER SSANGKIYEOK
+3133;W # HANGUL LETTER KIYEOK-SIOS
+3134;W # HANGUL LETTER NIEUN
+3135;W # HANGUL LETTER NIEUN-CIEUC
+3136;W # HANGUL LETTER NIEUN-HIEUH
+3137;W # HANGUL LETTER TIKEUT
+3138;W # HANGUL LETTER SSANGTIKEUT
+3139;W # HANGUL LETTER RIEUL
+313A;W # HANGUL LETTER RIEUL-KIYEOK
+313B;W # HANGUL LETTER RIEUL-MIEUM
+313C;W # HANGUL LETTER RIEUL-PIEUP
+313D;W # HANGUL LETTER RIEUL-SIOS
+313E;W # HANGUL LETTER RIEUL-THIEUTH
+313F;W # HANGUL LETTER RIEUL-PHIEUPH
+3140;W # HANGUL LETTER RIEUL-HIEUH
+3141;W # HANGUL LETTER MIEUM
+3142;W # HANGUL LETTER PIEUP
+3143;W # HANGUL LETTER SSANGPIEUP
+3144;W # HANGUL LETTER PIEUP-SIOS
+3145;W # HANGUL LETTER SIOS
+3146;W # HANGUL LETTER SSANGSIOS
+3147;W # HANGUL LETTER IEUNG
+3148;W # HANGUL LETTER CIEUC
+3149;W # HANGUL LETTER SSANGCIEUC
+314A;W # HANGUL LETTER CHIEUCH
+314B;W # HANGUL LETTER KHIEUKH
+314C;W # HANGUL LETTER THIEUTH
+314D;W # HANGUL LETTER PHIEUPH
+314E;W # HANGUL LETTER HIEUH
+314F;W # HANGUL LETTER A
+3150;W # HANGUL LETTER AE
+3151;W # HANGUL LETTER YA
+3152;W # HANGUL LETTER YAE
+3153;W # HANGUL LETTER EO
+3154;W # HANGUL LETTER E
+3155;W # HANGUL LETTER YEO
+3156;W # HANGUL LETTER YE
+3157;W # HANGUL LETTER O
+3158;W # HANGUL LETTER WA
+3159;W # HANGUL LETTER WAE
+315A;W # HANGUL LETTER OE
+315B;W # HANGUL LETTER YO
+315C;W # HANGUL LETTER U
+315D;W # HANGUL LETTER WEO
+315E;W # HANGUL LETTER WE
+315F;W # HANGUL LETTER WI
+3160;W # HANGUL LETTER YU
+3161;W # HANGUL LETTER EU
+3162;W # HANGUL LETTER YI
+3163;W # HANGUL LETTER I
+3164;W # HANGUL FILLER
+3165;W # HANGUL LETTER SSANGNIEUN
+3166;W # HANGUL LETTER NIEUN-TIKEUT
+3167;W # HANGUL LETTER NIEUN-SIOS
+3168;W # HANGUL LETTER NIEUN-PANSIOS
+3169;W # HANGUL LETTER RIEUL-KIYEOK-SIOS
+316A;W # HANGUL LETTER RIEUL-TIKEUT
+316B;W # HANGUL LETTER RIEUL-PIEUP-SIOS
+316C;W # HANGUL LETTER RIEUL-PANSIOS
+316D;W # HANGUL LETTER RIEUL-YEORINHIEUH
+316E;W # HANGUL LETTER MIEUM-PIEUP
+316F;W # HANGUL LETTER MIEUM-SIOS
+3170;W # HANGUL LETTER MIEUM-PANSIOS
+3171;W # HANGUL LETTER KAPYEOUNMIEUM
+3172;W # HANGUL LETTER PIEUP-KIYEOK
+3173;W # HANGUL LETTER PIEUP-TIKEUT
+3174;W # HANGUL LETTER PIEUP-SIOS-KIYEOK
+3175;W # HANGUL LETTER PIEUP-SIOS-TIKEUT
+3176;W # HANGUL LETTER PIEUP-CIEUC
+3177;W # HANGUL LETTER PIEUP-THIEUTH
+3178;W # HANGUL LETTER KAPYEOUNPIEUP
+3179;W # HANGUL LETTER KAPYEOUNSSANGPIEUP
+317A;W # HANGUL LETTER SIOS-KIYEOK
+317B;W # HANGUL LETTER SIOS-NIEUN
+317C;W # HANGUL LETTER SIOS-TIKEUT
+317D;W # HANGUL LETTER SIOS-PIEUP
+317E;W # HANGUL LETTER SIOS-CIEUC
+317F;W # HANGUL LETTER PANSIOS
+3180;W # HANGUL LETTER SSANGIEUNG
+3181;W # HANGUL LETTER YESIEUNG
+3182;W # HANGUL LETTER YESIEUNG-SIOS
+3183;W # HANGUL LETTER YESIEUNG-PANSIOS
+3184;W # HANGUL LETTER KAPYEOUNPHIEUPH
+3185;W # HANGUL LETTER SSANGHIEUH
+3186;W # HANGUL LETTER YEORINHIEUH
+3187;W # HANGUL LETTER YO-YA
+3188;W # HANGUL LETTER YO-YAE
+3189;W # HANGUL LETTER YO-I
+318A;W # HANGUL LETTER YU-YEO
+318B;W # HANGUL LETTER YU-YE
+318C;W # HANGUL LETTER YU-I
+318D;W # HANGUL LETTER ARAEA
+318E;W # HANGUL LETTER ARAEAE
+3190;W # IDEOGRAPHIC ANNOTATION LINKING MARK
+3191;W # IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192;W # IDEOGRAPHIC ANNOTATION ONE MARK
+3193;W # IDEOGRAPHIC ANNOTATION TWO MARK
+3194;W # IDEOGRAPHIC ANNOTATION THREE MARK
+3195;W # IDEOGRAPHIC ANNOTATION FOUR MARK
+3196;W # IDEOGRAPHIC ANNOTATION TOP MARK
+3197;W # IDEOGRAPHIC ANNOTATION MIDDLE MARK
+3198;W # IDEOGRAPHIC ANNOTATION BOTTOM MARK
+3199;W # IDEOGRAPHIC ANNOTATION FIRST MARK
+319A;W # IDEOGRAPHIC ANNOTATION SECOND MARK
+319B;W # IDEOGRAPHIC ANNOTATION THIRD MARK
+319C;W # IDEOGRAPHIC ANNOTATION FOURTH MARK
+319D;W # IDEOGRAPHIC ANNOTATION HEAVEN MARK
+319E;W # IDEOGRAPHIC ANNOTATION EARTH MARK
+319F;W # IDEOGRAPHIC ANNOTATION MAN MARK
+31A0;W # BOPOMOFO LETTER BU
+31A1;W # BOPOMOFO LETTER ZI
+31A2;W # BOPOMOFO LETTER JI
+31A3;W # BOPOMOFO LETTER GU
+31A4;W # BOPOMOFO LETTER EE
+31A5;W # BOPOMOFO LETTER ENN
+31A6;W # BOPOMOFO LETTER OO
+31A7;W # BOPOMOFO LETTER ONN
+31A8;W # BOPOMOFO LETTER IR
+31A9;W # BOPOMOFO LETTER ANN
+31AA;W # BOPOMOFO LETTER INN
+31AB;W # BOPOMOFO LETTER UNN
+31AC;W # BOPOMOFO LETTER IM
+31AD;W # BOPOMOFO LETTER NGG
+31AE;W # BOPOMOFO LETTER AINN
+31AF;W # BOPOMOFO LETTER AUNN
+31B0;W # BOPOMOFO LETTER AM
+31B1;W # BOPOMOFO LETTER OM
+31B2;W # BOPOMOFO LETTER ONG
+31B3;W # BOPOMOFO LETTER INNN
+31B4;W # BOPOMOFO FINAL LETTER P
+31B5;W # BOPOMOFO FINAL LETTER T
+31B6;W # BOPOMOFO FINAL LETTER K
+31B7;W # BOPOMOFO FINAL LETTER H
+31C0;W # CJK STROKE T
+31C1;W # CJK STROKE WG
+31C2;W # CJK STROKE XG
+31C3;W # CJK STROKE BXG
+31C4;W # CJK STROKE SW
+31C5;W # CJK STROKE HZZ
+31C6;W # CJK STROKE HZG
+31C7;W # CJK STROKE HP
+31C8;W # CJK STROKE HZWG
+31C9;W # CJK STROKE SZWG
+31CA;W # CJK STROKE HZT
+31CB;W # CJK STROKE HZZP
+31CC;W # CJK STROKE HPWG
+31CD;W # CJK STROKE HZW
+31CE;W # CJK STROKE HZZZ
+31CF;W # CJK STROKE N
+31F0;W # KATAKANA LETTER SMALL KU
+31F1;W # KATAKANA LETTER SMALL SI
+31F2;W # KATAKANA LETTER SMALL SU
+31F3;W # KATAKANA LETTER SMALL TO
+31F4;W # KATAKANA LETTER SMALL NU
+31F5;W # KATAKANA LETTER SMALL HA
+31F6;W # KATAKANA LETTER SMALL HI
+31F7;W # KATAKANA LETTER SMALL HU
+31F8;W # KATAKANA LETTER SMALL HE
+31F9;W # KATAKANA LETTER SMALL HO
+31FA;W # KATAKANA LETTER SMALL MU
+31FB;W # KATAKANA LETTER SMALL RA
+31FC;W # KATAKANA LETTER SMALL RI
+31FD;W # KATAKANA LETTER SMALL RU
+31FE;W # KATAKANA LETTER SMALL RE
+31FF;W # KATAKANA LETTER SMALL RO
+3200;W # PARENTHESIZED HANGUL KIYEOK
+3201;W # PARENTHESIZED HANGUL NIEUN
+3202;W # PARENTHESIZED HANGUL TIKEUT
+3203;W # PARENTHESIZED HANGUL RIEUL
+3204;W # PARENTHESIZED HANGUL MIEUM
+3205;W # PARENTHESIZED HANGUL PIEUP
+3206;W # PARENTHESIZED HANGUL SIOS
+3207;W # PARENTHESIZED HANGUL IEUNG
+3208;W # PARENTHESIZED HANGUL CIEUC
+3209;W # PARENTHESIZED HANGUL CHIEUCH
+320A;W # PARENTHESIZED HANGUL KHIEUKH
+320B;W # PARENTHESIZED HANGUL THIEUTH
+320C;W # PARENTHESIZED HANGUL PHIEUPH
+320D;W # PARENTHESIZED HANGUL HIEUH
+320E;W # PARENTHESIZED HANGUL KIYEOK A
+320F;W # PARENTHESIZED HANGUL NIEUN A
+3210;W # PARENTHESIZED HANGUL TIKEUT A
+3211;W # PARENTHESIZED HANGUL RIEUL A
+3212;W # PARENTHESIZED HANGUL MIEUM A
+3213;W # PARENTHESIZED HANGUL PIEUP A
+3214;W # PARENTHESIZED HANGUL SIOS A
+3215;W # PARENTHESIZED HANGUL IEUNG A
+3216;W # PARENTHESIZED HANGUL CIEUC A
+3217;W # PARENTHESIZED HANGUL CHIEUCH A
+3218;W # PARENTHESIZED HANGUL KHIEUKH A
+3219;W # PARENTHESIZED HANGUL THIEUTH A
+321A;W # PARENTHESIZED HANGUL PHIEUPH A
+321B;W # PARENTHESIZED HANGUL HIEUH A
+321C;W # PARENTHESIZED HANGUL CIEUC U
+321D;W # PARENTHESIZED KOREAN CHARACTER OJEON
+321E;W # PARENTHESIZED KOREAN CHARACTER O HU
+3220;W # PARENTHESIZED IDEOGRAPH ONE
+3221;W # PARENTHESIZED IDEOGRAPH TWO
+3222;W # PARENTHESIZED IDEOGRAPH THREE
+3223;W # PARENTHESIZED IDEOGRAPH FOUR
+3224;W # PARENTHESIZED IDEOGRAPH FIVE
+3225;W # PARENTHESIZED IDEOGRAPH SIX
+3226;W # PARENTHESIZED IDEOGRAPH SEVEN
+3227;W # PARENTHESIZED IDEOGRAPH EIGHT
+3228;W # PARENTHESIZED IDEOGRAPH NINE
+3229;W # PARENTHESIZED IDEOGRAPH TEN
+322A;W # PARENTHESIZED IDEOGRAPH MOON
+322B;W # PARENTHESIZED IDEOGRAPH FIRE
+322C;W # PARENTHESIZED IDEOGRAPH WATER
+322D;W # PARENTHESIZED IDEOGRAPH WOOD
+322E;W # PARENTHESIZED IDEOGRAPH METAL
+322F;W # PARENTHESIZED IDEOGRAPH EARTH
+3230;W # PARENTHESIZED IDEOGRAPH SUN
+3231;W # PARENTHESIZED IDEOGRAPH STOCK
+3232;W # PARENTHESIZED IDEOGRAPH HAVE
+3233;W # PARENTHESIZED IDEOGRAPH SOCIETY
+3234;W # PARENTHESIZED IDEOGRAPH NAME
+3235;W # PARENTHESIZED IDEOGRAPH SPECIAL
+3236;W # PARENTHESIZED IDEOGRAPH FINANCIAL
+3237;W # PARENTHESIZED IDEOGRAPH CONGRATULATION
+3238;W # PARENTHESIZED IDEOGRAPH LABOR
+3239;W # PARENTHESIZED IDEOGRAPH REPRESENT
+323A;W # PARENTHESIZED IDEOGRAPH CALL
+323B;W # PARENTHESIZED IDEOGRAPH STUDY
+323C;W # PARENTHESIZED IDEOGRAPH SUPERVISE
+323D;W # PARENTHESIZED IDEOGRAPH ENTERPRISE
+323E;W # PARENTHESIZED IDEOGRAPH RESOURCE
+323F;W # PARENTHESIZED IDEOGRAPH ALLIANCE
+3240;W # PARENTHESIZED IDEOGRAPH FESTIVAL
+3241;W # PARENTHESIZED IDEOGRAPH REST
+3242;W # PARENTHESIZED IDEOGRAPH SELF
+3243;W # PARENTHESIZED IDEOGRAPH REACH
+3250;W # PARTNERSHIP SIGN
+3251;W # CIRCLED NUMBER TWENTY ONE
+3252;W # CIRCLED NUMBER TWENTY TWO
+3253;W # CIRCLED NUMBER TWENTY THREE
+3254;W # CIRCLED NUMBER TWENTY FOUR
+3255;W # CIRCLED NUMBER TWENTY FIVE
+3256;W # CIRCLED NUMBER TWENTY SIX
+3257;W # CIRCLED NUMBER TWENTY SEVEN
+3258;W # CIRCLED NUMBER TWENTY EIGHT
+3259;W # CIRCLED NUMBER TWENTY NINE
+325A;W # CIRCLED NUMBER THIRTY
+325B;W # CIRCLED NUMBER THIRTY ONE
+325C;W # CIRCLED NUMBER THIRTY TWO
+325D;W # CIRCLED NUMBER THIRTY THREE
+325E;W # CIRCLED NUMBER THIRTY FOUR
+325F;W # CIRCLED NUMBER THIRTY FIVE
+3260;W # CIRCLED HANGUL KIYEOK
+3261;W # CIRCLED HANGUL NIEUN
+3262;W # CIRCLED HANGUL TIKEUT
+3263;W # CIRCLED HANGUL RIEUL
+3264;W # CIRCLED HANGUL MIEUM
+3265;W # CIRCLED HANGUL PIEUP
+3266;W # CIRCLED HANGUL SIOS
+3267;W # CIRCLED HANGUL IEUNG
+3268;W # CIRCLED HANGUL CIEUC
+3269;W # CIRCLED HANGUL CHIEUCH
+326A;W # CIRCLED HANGUL KHIEUKH
+326B;W # CIRCLED HANGUL THIEUTH
+326C;W # CIRCLED HANGUL PHIEUPH
+326D;W # CIRCLED HANGUL HIEUH
+326E;W # CIRCLED HANGUL KIYEOK A
+326F;W # CIRCLED HANGUL NIEUN A
+3270;W # CIRCLED HANGUL TIKEUT A
+3271;W # CIRCLED HANGUL RIEUL A
+3272;W # CIRCLED HANGUL MIEUM A
+3273;W # CIRCLED HANGUL PIEUP A
+3274;W # CIRCLED HANGUL SIOS A
+3275;W # CIRCLED HANGUL IEUNG A
+3276;W # CIRCLED HANGUL CIEUC A
+3277;W # CIRCLED HANGUL CHIEUCH A
+3278;W # CIRCLED HANGUL KHIEUKH A
+3279;W # CIRCLED HANGUL THIEUTH A
+327A;W # CIRCLED HANGUL PHIEUPH A
+327B;W # CIRCLED HANGUL HIEUH A
+327C;W # CIRCLED KOREAN CHARACTER CHAMKO
+327D;W # CIRCLED KOREAN CHARACTER JUEUI
+327E;W # CIRCLED HANGUL IEUNG U
+327F;W # KOREAN STANDARD SYMBOL
+3280;W # CIRCLED IDEOGRAPH ONE
+3281;W # CIRCLED IDEOGRAPH TWO
+3282;W # CIRCLED IDEOGRAPH THREE
+3283;W # CIRCLED IDEOGRAPH FOUR
+3284;W # CIRCLED IDEOGRAPH FIVE
+3285;W # CIRCLED IDEOGRAPH SIX
+3286;W # CIRCLED IDEOGRAPH SEVEN
+3287;W # CIRCLED IDEOGRAPH EIGHT
+3288;W # CIRCLED IDEOGRAPH NINE
+3289;W # CIRCLED IDEOGRAPH TEN
+328A;W # CIRCLED IDEOGRAPH MOON
+328B;W # CIRCLED IDEOGRAPH FIRE
+328C;W # CIRCLED IDEOGRAPH WATER
+328D;W # CIRCLED IDEOGRAPH WOOD
+328E;W # CIRCLED IDEOGRAPH METAL
+328F;W # CIRCLED IDEOGRAPH EARTH
+3290;W # CIRCLED IDEOGRAPH SUN
+3291;W # CIRCLED IDEOGRAPH STOCK
+3292;W # CIRCLED IDEOGRAPH HAVE
+3293;W # CIRCLED IDEOGRAPH SOCIETY
+3294;W # CIRCLED IDEOGRAPH NAME
+3295;W # CIRCLED IDEOGRAPH SPECIAL
+3296;W # CIRCLED IDEOGRAPH FINANCIAL
+3297;W # CIRCLED IDEOGRAPH CONGRATULATION
+3298;W # CIRCLED IDEOGRAPH LABOR
+3299;W # CIRCLED IDEOGRAPH SECRET
+329A;W # CIRCLED IDEOGRAPH MALE
+329B;W # CIRCLED IDEOGRAPH FEMALE
+329C;W # CIRCLED IDEOGRAPH SUITABLE
+329D;W # CIRCLED IDEOGRAPH EXCELLENT
+329E;W # CIRCLED IDEOGRAPH PRINT
+329F;W # CIRCLED IDEOGRAPH ATTENTION
+32A0;W # CIRCLED IDEOGRAPH ITEM
+32A1;W # CIRCLED IDEOGRAPH REST
+32A2;W # CIRCLED IDEOGRAPH COPY
+32A3;W # CIRCLED IDEOGRAPH CORRECT
+32A4;W # CIRCLED IDEOGRAPH HIGH
+32A5;W # CIRCLED IDEOGRAPH CENTRE
+32A6;W # CIRCLED IDEOGRAPH LOW
+32A7;W # CIRCLED IDEOGRAPH LEFT
+32A8;W # CIRCLED IDEOGRAPH RIGHT
+32A9;W # CIRCLED IDEOGRAPH MEDICINE
+32AA;W # CIRCLED IDEOGRAPH RELIGION
+32AB;W # CIRCLED IDEOGRAPH STUDY
+32AC;W # CIRCLED IDEOGRAPH SUPERVISE
+32AD;W # CIRCLED IDEOGRAPH ENTERPRISE
+32AE;W # CIRCLED IDEOGRAPH RESOURCE
+32AF;W # CIRCLED IDEOGRAPH ALLIANCE
+32B0;W # CIRCLED IDEOGRAPH NIGHT
+32B1;W # CIRCLED NUMBER THIRTY SIX
+32B2;W # CIRCLED NUMBER THIRTY SEVEN
+32B3;W # CIRCLED NUMBER THIRTY EIGHT
+32B4;W # CIRCLED NUMBER THIRTY NINE
+32B5;W # CIRCLED NUMBER FORTY
+32B6;W # CIRCLED NUMBER FORTY ONE
+32B7;W # CIRCLED NUMBER FORTY TWO
+32B8;W # CIRCLED NUMBER FORTY THREE
+32B9;W # CIRCLED NUMBER FORTY FOUR
+32BA;W # CIRCLED NUMBER FORTY FIVE
+32BB;W # CIRCLED NUMBER FORTY SIX
+32BC;W # CIRCLED NUMBER FORTY SEVEN
+32BD;W # CIRCLED NUMBER FORTY EIGHT
+32BE;W # CIRCLED NUMBER FORTY NINE
+32BF;W # CIRCLED NUMBER FIFTY
+32C0;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+32C1;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+32C2;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+32C3;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+32C4;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+32C5;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+32C6;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+32C7;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+32C8;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+32C9;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+32CA;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+32CB;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32CC;W # SQUARE HG
+32CD;W # SQUARE ERG
+32CE;W # SQUARE EV
+32CF;W # LIMITED LIABILITY SIGN
+32D0;W # CIRCLED KATAKANA A
+32D1;W # CIRCLED KATAKANA I
+32D2;W # CIRCLED KATAKANA U
+32D3;W # CIRCLED KATAKANA E
+32D4;W # CIRCLED KATAKANA O
+32D5;W # CIRCLED KATAKANA KA
+32D6;W # CIRCLED KATAKANA KI
+32D7;W # CIRCLED KATAKANA KU
+32D8;W # CIRCLED KATAKANA KE
+32D9;W # CIRCLED KATAKANA KO
+32DA;W # CIRCLED KATAKANA SA
+32DB;W # CIRCLED KATAKANA SI
+32DC;W # CIRCLED KATAKANA SU
+32DD;W # CIRCLED KATAKANA SE
+32DE;W # CIRCLED KATAKANA SO
+32DF;W # CIRCLED KATAKANA TA
+32E0;W # CIRCLED KATAKANA TI
+32E1;W # CIRCLED KATAKANA TU
+32E2;W # CIRCLED KATAKANA TE
+32E3;W # CIRCLED KATAKANA TO
+32E4;W # CIRCLED KATAKANA NA
+32E5;W # CIRCLED KATAKANA NI
+32E6;W # CIRCLED KATAKANA NU
+32E7;W # CIRCLED KATAKANA NE
+32E8;W # CIRCLED KATAKANA NO
+32E9;W # CIRCLED KATAKANA HA
+32EA;W # CIRCLED KATAKANA HI
+32EB;W # CIRCLED KATAKANA HU
+32EC;W # CIRCLED KATAKANA HE
+32ED;W # CIRCLED KATAKANA HO
+32EE;W # CIRCLED KATAKANA MA
+32EF;W # CIRCLED KATAKANA MI
+32F0;W # CIRCLED KATAKANA MU
+32F1;W # CIRCLED KATAKANA ME
+32F2;W # CIRCLED KATAKANA MO
+32F3;W # CIRCLED KATAKANA YA
+32F4;W # CIRCLED KATAKANA YU
+32F5;W # CIRCLED KATAKANA YO
+32F6;W # CIRCLED KATAKANA RA
+32F7;W # CIRCLED KATAKANA RI
+32F8;W # CIRCLED KATAKANA RU
+32F9;W # CIRCLED KATAKANA RE
+32FA;W # CIRCLED KATAKANA RO
+32FB;W # CIRCLED KATAKANA WA
+32FC;W # CIRCLED KATAKANA WI
+32FD;W # CIRCLED KATAKANA WE
+32FE;W # CIRCLED KATAKANA WO
+3300;W # SQUARE APAATO
+3301;W # SQUARE ARUHUA
+3302;W # SQUARE ANPEA
+3303;W # SQUARE AARU
+3304;W # SQUARE ININGU
+3305;W # SQUARE INTI
+3306;W # SQUARE UON
+3307;W # SQUARE ESUKUUDO
+3308;W # SQUARE EEKAA
+3309;W # SQUARE ONSU
+330A;W # SQUARE OOMU
+330B;W # SQUARE KAIRI
+330C;W # SQUARE KARATTO
+330D;W # SQUARE KARORII
+330E;W # SQUARE GARON
+330F;W # SQUARE GANMA
+3310;W # SQUARE GIGA
+3311;W # SQUARE GINII
+3312;W # SQUARE KYURII
+3313;W # SQUARE GIRUDAA
+3314;W # SQUARE KIRO
+3315;W # SQUARE KIROGURAMU
+3316;W # SQUARE KIROMEETORU
+3317;W # SQUARE KIROWATTO
+3318;W # SQUARE GURAMU
+3319;W # SQUARE GURAMUTON
+331A;W # SQUARE KURUZEIRO
+331B;W # SQUARE KUROONE
+331C;W # SQUARE KEESU
+331D;W # SQUARE KORUNA
+331E;W # SQUARE KOOPO
+331F;W # SQUARE SAIKURU
+3320;W # SQUARE SANTIIMU
+3321;W # SQUARE SIRINGU
+3322;W # SQUARE SENTI
+3323;W # SQUARE SENTO
+3324;W # SQUARE DAASU
+3325;W # SQUARE DESI
+3326;W # SQUARE DORU
+3327;W # SQUARE TON
+3328;W # SQUARE NANO
+3329;W # SQUARE NOTTO
+332A;W # SQUARE HAITU
+332B;W # SQUARE PAASENTO
+332C;W # SQUARE PAATU
+332D;W # SQUARE BAARERU
+332E;W # SQUARE PIASUTORU
+332F;W # SQUARE PIKURU
+3330;W # SQUARE PIKO
+3331;W # SQUARE BIRU
+3332;W # SQUARE HUARADDO
+3333;W # SQUARE HUIITO
+3334;W # SQUARE BUSSYERU
+3335;W # SQUARE HURAN
+3336;W # SQUARE HEKUTAARU
+3337;W # SQUARE PESO
+3338;W # SQUARE PENIHI
+3339;W # SQUARE HERUTU
+333A;W # SQUARE PENSU
+333B;W # SQUARE PEEZI
+333C;W # SQUARE BEETA
+333D;W # SQUARE POINTO
+333E;W # SQUARE BORUTO
+333F;W # SQUARE HON
+3340;W # SQUARE PONDO
+3341;W # SQUARE HOORU
+3342;W # SQUARE HOON
+3343;W # SQUARE MAIKURO
+3344;W # SQUARE MAIRU
+3345;W # SQUARE MAHHA
+3346;W # SQUARE MARUKU
+3347;W # SQUARE MANSYON
+3348;W # SQUARE MIKURON
+3349;W # SQUARE MIRI
+334A;W # SQUARE MIRIBAARU
+334B;W # SQUARE MEGA
+334C;W # SQUARE MEGATON
+334D;W # SQUARE MEETORU
+334E;W # SQUARE YAADO
+334F;W # SQUARE YAARU
+3350;W # SQUARE YUAN
+3351;W # SQUARE RITTORU
+3352;W # SQUARE RIRA
+3353;W # SQUARE RUPII
+3354;W # SQUARE RUUBURU
+3355;W # SQUARE REMU
+3356;W # SQUARE RENTOGEN
+3357;W # SQUARE WATTO
+3358;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+3359;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+335A;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+335B;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+335C;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+335D;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+335E;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+335F;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+3360;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+3361;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+3362;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+3363;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+3364;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+3365;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+3366;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+3367;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+3368;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+3369;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+336A;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+336B;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+336C;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+336D;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+336E;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+336F;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+3370;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+3371;W # SQUARE HPA
+3372;W # SQUARE DA
+3373;W # SQUARE AU
+3374;W # SQUARE BAR
+3375;W # SQUARE OV
+3376;W # SQUARE PC
+3377;W # SQUARE DM
+3378;W # SQUARE DM SQUARED
+3379;W # SQUARE DM CUBED
+337A;W # SQUARE IU
+337B;W # SQUARE ERA NAME HEISEI
+337C;W # SQUARE ERA NAME SYOUWA
+337D;W # SQUARE ERA NAME TAISYOU
+337E;W # SQUARE ERA NAME MEIZI
+337F;W # SQUARE CORPORATION
+3380;W # SQUARE PA AMPS
+3381;W # SQUARE NA
+3382;W # SQUARE MU A
+3383;W # SQUARE MA
+3384;W # SQUARE KA
+3385;W # SQUARE KB
+3386;W # SQUARE MB
+3387;W # SQUARE GB
+3388;W # SQUARE CAL
+3389;W # SQUARE KCAL
+338A;W # SQUARE PF
+338B;W # SQUARE NF
+338C;W # SQUARE MU F
+338D;W # SQUARE MU G
+338E;W # SQUARE MG
+338F;W # SQUARE KG
+3390;W # SQUARE HZ
+3391;W # SQUARE KHZ
+3392;W # SQUARE MHZ
+3393;W # SQUARE GHZ
+3394;W # SQUARE THZ
+3395;W # SQUARE MU L
+3396;W # SQUARE ML
+3397;W # SQUARE DL
+3398;W # SQUARE KL
+3399;W # SQUARE FM
+339A;W # SQUARE NM
+339B;W # SQUARE MU M
+339C;W # SQUARE MM
+339D;W # SQUARE CM
+339E;W # SQUARE KM
+339F;W # SQUARE MM SQUARED
+33A0;W # SQUARE CM SQUARED
+33A1;W # SQUARE M SQUARED
+33A2;W # SQUARE KM SQUARED
+33A3;W # SQUARE MM CUBED
+33A4;W # SQUARE CM CUBED
+33A5;W # SQUARE M CUBED
+33A6;W # SQUARE KM CUBED
+33A7;W # SQUARE M OVER S
+33A8;W # SQUARE M OVER S SQUARED
+33A9;W # SQUARE PA
+33AA;W # SQUARE KPA
+33AB;W # SQUARE MPA
+33AC;W # SQUARE GPA
+33AD;W # SQUARE RAD
+33AE;W # SQUARE RAD OVER S
+33AF;W # SQUARE RAD OVER S SQUARED
+33B0;W # SQUARE PS
+33B1;W # SQUARE NS
+33B2;W # SQUARE MU S
+33B3;W # SQUARE MS
+33B4;W # SQUARE PV
+33B5;W # SQUARE NV
+33B6;W # SQUARE MU V
+33B7;W # SQUARE MV
+33B8;W # SQUARE KV
+33B9;W # SQUARE MV MEGA
+33BA;W # SQUARE PW
+33BB;W # SQUARE NW
+33BC;W # SQUARE MU W
+33BD;W # SQUARE MW
+33BE;W # SQUARE KW
+33BF;W # SQUARE MW MEGA
+33C0;W # SQUARE K OHM
+33C1;W # SQUARE M OHM
+33C2;W # SQUARE AM
+33C3;W # SQUARE BQ
+33C4;W # SQUARE CC
+33C5;W # SQUARE CD
+33C6;W # SQUARE C OVER KG
+33C7;W # SQUARE CO
+33C8;W # SQUARE DB
+33C9;W # SQUARE GY
+33CA;W # SQUARE HA
+33CB;W # SQUARE HP
+33CC;W # SQUARE IN
+33CD;W # SQUARE KK
+33CE;W # SQUARE KM CAPITAL
+33CF;W # SQUARE KT
+33D0;W # SQUARE LM
+33D1;W # SQUARE LN
+33D2;W # SQUARE LOG
+33D3;W # SQUARE LX
+33D4;W # SQUARE MB SMALL
+33D5;W # SQUARE MIL
+33D6;W # SQUARE MOL
+33D7;W # SQUARE PH
+33D8;W # SQUARE PM
+33D9;W # SQUARE PPM
+33DA;W # SQUARE PR
+33DB;W # SQUARE SR
+33DC;W # SQUARE SV
+33DD;W # SQUARE WB
+33DE;W # SQUARE V OVER M
+33DF;W # SQUARE A OVER M
+33E0;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+33E1;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+33E2;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+33E3;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+33E4;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+33E5;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+33E6;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+33E7;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+33E8;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+33E9;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+33EA;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+33EB;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+33EC;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+33ED;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+33EE;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+33EF;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+33F0;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+33F1;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+33F2;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+33F3;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+33F4;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+33F5;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+33F6;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+33F7;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+33F8;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+33F9;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+33FA;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+33FB;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+33FC;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+33FD;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+33FE;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+33FF;W # SQUARE GAL
+3400..4DB5;W # <CJK Ideograph Extension A, First>..<CJK Ideograph Extension A, Last>
+4DC0;N # HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1;N # HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2;N # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3;N # HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4;N # HEXAGRAM FOR WAITING
+4DC5;N # HEXAGRAM FOR CONFLICT
+4DC6;N # HEXAGRAM FOR THE ARMY
+4DC7;N # HEXAGRAM FOR HOLDING TOGETHER
+4DC8;N # HEXAGRAM FOR SMALL TAMING
+4DC9;N # HEXAGRAM FOR TREADING
+4DCA;N # HEXAGRAM FOR PEACE
+4DCB;N # HEXAGRAM FOR STANDSTILL
+4DCC;N # HEXAGRAM FOR FELLOWSHIP
+4DCD;N # HEXAGRAM FOR GREAT POSSESSION
+4DCE;N # HEXAGRAM FOR MODESTY
+4DCF;N # HEXAGRAM FOR ENTHUSIASM
+4DD0;N # HEXAGRAM FOR FOLLOWING
+4DD1;N # HEXAGRAM FOR WORK ON THE DECAYED
+4DD2;N # HEXAGRAM FOR APPROACH
+4DD3;N # HEXAGRAM FOR CONTEMPLATION
+4DD4;N # HEXAGRAM FOR BITING THROUGH
+4DD5;N # HEXAGRAM FOR GRACE
+4DD6;N # HEXAGRAM FOR SPLITTING APART
+4DD7;N # HEXAGRAM FOR RETURN
+4DD8;N # HEXAGRAM FOR INNOCENCE
+4DD9;N # HEXAGRAM FOR GREAT TAMING
+4DDA;N # HEXAGRAM FOR MOUTH CORNERS
+4DDB;N # HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC;N # HEXAGRAM FOR THE ABYSMAL WATER
+4DDD;N # HEXAGRAM FOR THE CLINGING FIRE
+4DDE;N # HEXAGRAM FOR INFLUENCE
+4DDF;N # HEXAGRAM FOR DURATION
+4DE0;N # HEXAGRAM FOR RETREAT
+4DE1;N # HEXAGRAM FOR GREAT POWER
+4DE2;N # HEXAGRAM FOR PROGRESS
+4DE3;N # HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4;N # HEXAGRAM FOR THE FAMILY
+4DE5;N # HEXAGRAM FOR OPPOSITION
+4DE6;N # HEXAGRAM FOR OBSTRUCTION
+4DE7;N # HEXAGRAM FOR DELIVERANCE
+4DE8;N # HEXAGRAM FOR DECREASE
+4DE9;N # HEXAGRAM FOR INCREASE
+4DEA;N # HEXAGRAM FOR BREAKTHROUGH
+4DEB;N # HEXAGRAM FOR COMING TO MEET
+4DEC;N # HEXAGRAM FOR GATHERING TOGETHER
+4DED;N # HEXAGRAM FOR PUSHING UPWARD
+4DEE;N # HEXAGRAM FOR OPPRESSION
+4DEF;N # HEXAGRAM FOR THE WELL
+4DF0;N # HEXAGRAM FOR REVOLUTION
+4DF1;N # HEXAGRAM FOR THE CAULDRON
+4DF2;N # HEXAGRAM FOR THE AROUSING THUNDER
+4DF3;N # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4;N # HEXAGRAM FOR DEVELOPMENT
+4DF5;N # HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6;N # HEXAGRAM FOR ABUNDANCE
+4DF7;N # HEXAGRAM FOR THE WANDERER
+4DF8;N # HEXAGRAM FOR THE GENTLE WIND
+4DF9;N # HEXAGRAM FOR THE JOYOUS LAKE
+4DFA;N # HEXAGRAM FOR DISPERSION
+4DFB;N # HEXAGRAM FOR LIMITATION
+4DFC;N # HEXAGRAM FOR INNER TRUTH
+4DFD;N # HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE;N # HEXAGRAM FOR AFTER COMPLETION
+4DFF;N # HEXAGRAM FOR BEFORE COMPLETION
+4E00..9FBB;W # <CJK Ideograph, First>..<CJK Ideograph, Last>
+A000;W # YI SYLLABLE IT
+A001;W # YI SYLLABLE IX
+A002;W # YI SYLLABLE I
+A003;W # YI SYLLABLE IP
+A004;W # YI SYLLABLE IET
+A005;W # YI SYLLABLE IEX
+A006;W # YI SYLLABLE IE
+A007;W # YI SYLLABLE IEP
+A008;W # YI SYLLABLE AT
+A009;W # YI SYLLABLE AX
+A00A;W # YI SYLLABLE A
+A00B;W # YI SYLLABLE AP
+A00C;W # YI SYLLABLE UOX
+A00D;W # YI SYLLABLE UO
+A00E;W # YI SYLLABLE UOP
+A00F;W # YI SYLLABLE OT
+A010;W # YI SYLLABLE OX
+A011;W # YI SYLLABLE O
+A012;W # YI SYLLABLE OP
+A013;W # YI SYLLABLE EX
+A014;W # YI SYLLABLE E
+A015;W # YI SYLLABLE WU
+A016;W # YI SYLLABLE BIT
+A017;W # YI SYLLABLE BIX
+A018;W # YI SYLLABLE BI
+A019;W # YI SYLLABLE BIP
+A01A;W # YI SYLLABLE BIET
+A01B;W # YI SYLLABLE BIEX
+A01C;W # YI SYLLABLE BIE
+A01D;W # YI SYLLABLE BIEP
+A01E;W # YI SYLLABLE BAT
+A01F;W # YI SYLLABLE BAX
+A020;W # YI SYLLABLE BA
+A021;W # YI SYLLABLE BAP
+A022;W # YI SYLLABLE BUOX
+A023;W # YI SYLLABLE BUO
+A024;W # YI SYLLABLE BUOP
+A025;W # YI SYLLABLE BOT
+A026;W # YI SYLLABLE BOX
+A027;W # YI SYLLABLE BO
+A028;W # YI SYLLABLE BOP
+A029;W # YI SYLLABLE BEX
+A02A;W # YI SYLLABLE BE
+A02B;W # YI SYLLABLE BEP
+A02C;W # YI SYLLABLE BUT
+A02D;W # YI SYLLABLE BUX
+A02E;W # YI SYLLABLE BU
+A02F;W # YI SYLLABLE BUP
+A030;W # YI SYLLABLE BURX
+A031;W # YI SYLLABLE BUR
+A032;W # YI SYLLABLE BYT
+A033;W # YI SYLLABLE BYX
+A034;W # YI SYLLABLE BY
+A035;W # YI SYLLABLE BYP
+A036;W # YI SYLLABLE BYRX
+A037;W # YI SYLLABLE BYR
+A038;W # YI SYLLABLE PIT
+A039;W # YI SYLLABLE PIX
+A03A;W # YI SYLLABLE PI
+A03B;W # YI SYLLABLE PIP
+A03C;W # YI SYLLABLE PIEX
+A03D;W # YI SYLLABLE PIE
+A03E;W # YI SYLLABLE PIEP
+A03F;W # YI SYLLABLE PAT
+A040;W # YI SYLLABLE PAX
+A041;W # YI SYLLABLE PA
+A042;W # YI SYLLABLE PAP
+A043;W # YI SYLLABLE PUOX
+A044;W # YI SYLLABLE PUO
+A045;W # YI SYLLABLE PUOP
+A046;W # YI SYLLABLE POT
+A047;W # YI SYLLABLE POX
+A048;W # YI SYLLABLE PO
+A049;W # YI SYLLABLE POP
+A04A;W # YI SYLLABLE PUT
+A04B;W # YI SYLLABLE PUX
+A04C;W # YI SYLLABLE PU
+A04D;W # YI SYLLABLE PUP
+A04E;W # YI SYLLABLE PURX
+A04F;W # YI SYLLABLE PUR
+A050;W # YI SYLLABLE PYT
+A051;W # YI SYLLABLE PYX
+A052;W # YI SYLLABLE PY
+A053;W # YI SYLLABLE PYP
+A054;W # YI SYLLABLE PYRX
+A055;W # YI SYLLABLE PYR
+A056;W # YI SYLLABLE BBIT
+A057;W # YI SYLLABLE BBIX
+A058;W # YI SYLLABLE BBI
+A059;W # YI SYLLABLE BBIP
+A05A;W # YI SYLLABLE BBIET
+A05B;W # YI SYLLABLE BBIEX
+A05C;W # YI SYLLABLE BBIE
+A05D;W # YI SYLLABLE BBIEP
+A05E;W # YI SYLLABLE BBAT
+A05F;W # YI SYLLABLE BBAX
+A060;W # YI SYLLABLE BBA
+A061;W # YI SYLLABLE BBAP
+A062;W # YI SYLLABLE BBUOX
+A063;W # YI SYLLABLE BBUO
+A064;W # YI SYLLABLE BBUOP
+A065;W # YI SYLLABLE BBOT
+A066;W # YI SYLLABLE BBOX
+A067;W # YI SYLLABLE BBO
+A068;W # YI SYLLABLE BBOP
+A069;W # YI SYLLABLE BBEX
+A06A;W # YI SYLLABLE BBE
+A06B;W # YI SYLLABLE BBEP
+A06C;W # YI SYLLABLE BBUT
+A06D;W # YI SYLLABLE BBUX
+A06E;W # YI SYLLABLE BBU
+A06F;W # YI SYLLABLE BBUP
+A070;W # YI SYLLABLE BBURX
+A071;W # YI SYLLABLE BBUR
+A072;W # YI SYLLABLE BBYT
+A073;W # YI SYLLABLE BBYX
+A074;W # YI SYLLABLE BBY
+A075;W # YI SYLLABLE BBYP
+A076;W # YI SYLLABLE NBIT
+A077;W # YI SYLLABLE NBIX
+A078;W # YI SYLLABLE NBI
+A079;W # YI SYLLABLE NBIP
+A07A;W # YI SYLLABLE NBIEX
+A07B;W # YI SYLLABLE NBIE
+A07C;W # YI SYLLABLE NBIEP
+A07D;W # YI SYLLABLE NBAT
+A07E;W # YI SYLLABLE NBAX
+A07F;W # YI SYLLABLE NBA
+A080;W # YI SYLLABLE NBAP
+A081;W # YI SYLLABLE NBOT
+A082;W # YI SYLLABLE NBOX
+A083;W # YI SYLLABLE NBO
+A084;W # YI SYLLABLE NBOP
+A085;W # YI SYLLABLE NBUT
+A086;W # YI SYLLABLE NBUX
+A087;W # YI SYLLABLE NBU
+A088;W # YI SYLLABLE NBUP
+A089;W # YI SYLLABLE NBURX
+A08A;W # YI SYLLABLE NBUR
+A08B;W # YI SYLLABLE NBYT
+A08C;W # YI SYLLABLE NBYX
+A08D;W # YI SYLLABLE NBY
+A08E;W # YI SYLLABLE NBYP
+A08F;W # YI SYLLABLE NBYRX
+A090;W # YI SYLLABLE NBYR
+A091;W # YI SYLLABLE HMIT
+A092;W # YI SYLLABLE HMIX
+A093;W # YI SYLLABLE HMI
+A094;W # YI SYLLABLE HMIP
+A095;W # YI SYLLABLE HMIEX
+A096;W # YI SYLLABLE HMIE
+A097;W # YI SYLLABLE HMIEP
+A098;W # YI SYLLABLE HMAT
+A099;W # YI SYLLABLE HMAX
+A09A;W # YI SYLLABLE HMA
+A09B;W # YI SYLLABLE HMAP
+A09C;W # YI SYLLABLE HMUOX
+A09D;W # YI SYLLABLE HMUO
+A09E;W # YI SYLLABLE HMUOP
+A09F;W # YI SYLLABLE HMOT
+A0A0;W # YI SYLLABLE HMOX
+A0A1;W # YI SYLLABLE HMO
+A0A2;W # YI SYLLABLE HMOP
+A0A3;W # YI SYLLABLE HMUT
+A0A4;W # YI SYLLABLE HMUX
+A0A5;W # YI SYLLABLE HMU
+A0A6;W # YI SYLLABLE HMUP
+A0A7;W # YI SYLLABLE HMURX
+A0A8;W # YI SYLLABLE HMUR
+A0A9;W # YI SYLLABLE HMYX
+A0AA;W # YI SYLLABLE HMY
+A0AB;W # YI SYLLABLE HMYP
+A0AC;W # YI SYLLABLE HMYRX
+A0AD;W # YI SYLLABLE HMYR
+A0AE;W # YI SYLLABLE MIT
+A0AF;W # YI SYLLABLE MIX
+A0B0;W # YI SYLLABLE MI
+A0B1;W # YI SYLLABLE MIP
+A0B2;W # YI SYLLABLE MIEX
+A0B3;W # YI SYLLABLE MIE
+A0B4;W # YI SYLLABLE MIEP
+A0B5;W # YI SYLLABLE MAT
+A0B6;W # YI SYLLABLE MAX
+A0B7;W # YI SYLLABLE MA
+A0B8;W # YI SYLLABLE MAP
+A0B9;W # YI SYLLABLE MUOT
+A0BA;W # YI SYLLABLE MUOX
+A0BB;W # YI SYLLABLE MUO
+A0BC;W # YI SYLLABLE MUOP
+A0BD;W # YI SYLLABLE MOT
+A0BE;W # YI SYLLABLE MOX
+A0BF;W # YI SYLLABLE MO
+A0C0;W # YI SYLLABLE MOP
+A0C1;W # YI SYLLABLE MEX
+A0C2;W # YI SYLLABLE ME
+A0C3;W # YI SYLLABLE MUT
+A0C4;W # YI SYLLABLE MUX
+A0C5;W # YI SYLLABLE MU
+A0C6;W # YI SYLLABLE MUP
+A0C7;W # YI SYLLABLE MURX
+A0C8;W # YI SYLLABLE MUR
+A0C9;W # YI SYLLABLE MYT
+A0CA;W # YI SYLLABLE MYX
+A0CB;W # YI SYLLABLE MY
+A0CC;W # YI SYLLABLE MYP
+A0CD;W # YI SYLLABLE FIT
+A0CE;W # YI SYLLABLE FIX
+A0CF;W # YI SYLLABLE FI
+A0D0;W # YI SYLLABLE FIP
+A0D1;W # YI SYLLABLE FAT
+A0D2;W # YI SYLLABLE FAX
+A0D3;W # YI SYLLABLE FA
+A0D4;W # YI SYLLABLE FAP
+A0D5;W # YI SYLLABLE FOX
+A0D6;W # YI SYLLABLE FO
+A0D7;W # YI SYLLABLE FOP
+A0D8;W # YI SYLLABLE FUT
+A0D9;W # YI SYLLABLE FUX
+A0DA;W # YI SYLLABLE FU
+A0DB;W # YI SYLLABLE FUP
+A0DC;W # YI SYLLABLE FURX
+A0DD;W # YI SYLLABLE FUR
+A0DE;W # YI SYLLABLE FYT
+A0DF;W # YI SYLLABLE FYX
+A0E0;W # YI SYLLABLE FY
+A0E1;W # YI SYLLABLE FYP
+A0E2;W # YI SYLLABLE VIT
+A0E3;W # YI SYLLABLE VIX
+A0E4;W # YI SYLLABLE VI
+A0E5;W # YI SYLLABLE VIP
+A0E6;W # YI SYLLABLE VIET
+A0E7;W # YI SYLLABLE VIEX
+A0E8;W # YI SYLLABLE VIE
+A0E9;W # YI SYLLABLE VIEP
+A0EA;W # YI SYLLABLE VAT
+A0EB;W # YI SYLLABLE VAX
+A0EC;W # YI SYLLABLE VA
+A0ED;W # YI SYLLABLE VAP
+A0EE;W # YI SYLLABLE VOT
+A0EF;W # YI SYLLABLE VOX
+A0F0;W # YI SYLLABLE VO
+A0F1;W # YI SYLLABLE VOP
+A0F2;W # YI SYLLABLE VEX
+A0F3;W # YI SYLLABLE VEP
+A0F4;W # YI SYLLABLE VUT
+A0F5;W # YI SYLLABLE VUX
+A0F6;W # YI SYLLABLE VU
+A0F7;W # YI SYLLABLE VUP
+A0F8;W # YI SYLLABLE VURX
+A0F9;W # YI SYLLABLE VUR
+A0FA;W # YI SYLLABLE VYT
+A0FB;W # YI SYLLABLE VYX
+A0FC;W # YI SYLLABLE VY
+A0FD;W # YI SYLLABLE VYP
+A0FE;W # YI SYLLABLE VYRX
+A0FF;W # YI SYLLABLE VYR
+A100;W # YI SYLLABLE DIT
+A101;W # YI SYLLABLE DIX
+A102;W # YI SYLLABLE DI
+A103;W # YI SYLLABLE DIP
+A104;W # YI SYLLABLE DIEX
+A105;W # YI SYLLABLE DIE
+A106;W # YI SYLLABLE DIEP
+A107;W # YI SYLLABLE DAT
+A108;W # YI SYLLABLE DAX
+A109;W # YI SYLLABLE DA
+A10A;W # YI SYLLABLE DAP
+A10B;W # YI SYLLABLE DUOX
+A10C;W # YI SYLLABLE DUO
+A10D;W # YI SYLLABLE DOT
+A10E;W # YI SYLLABLE DOX
+A10F;W # YI SYLLABLE DO
+A110;W # YI SYLLABLE DOP
+A111;W # YI SYLLABLE DEX
+A112;W # YI SYLLABLE DE
+A113;W # YI SYLLABLE DEP
+A114;W # YI SYLLABLE DUT
+A115;W # YI SYLLABLE DUX
+A116;W # YI SYLLABLE DU
+A117;W # YI SYLLABLE DUP
+A118;W # YI SYLLABLE DURX
+A119;W # YI SYLLABLE DUR
+A11A;W # YI SYLLABLE TIT
+A11B;W # YI SYLLABLE TIX
+A11C;W # YI SYLLABLE TI
+A11D;W # YI SYLLABLE TIP
+A11E;W # YI SYLLABLE TIEX
+A11F;W # YI SYLLABLE TIE
+A120;W # YI SYLLABLE TIEP
+A121;W # YI SYLLABLE TAT
+A122;W # YI SYLLABLE TAX
+A123;W # YI SYLLABLE TA
+A124;W # YI SYLLABLE TAP
+A125;W # YI SYLLABLE TUOT
+A126;W # YI SYLLABLE TUOX
+A127;W # YI SYLLABLE TUO
+A128;W # YI SYLLABLE TUOP
+A129;W # YI SYLLABLE TOT
+A12A;W # YI SYLLABLE TOX
+A12B;W # YI SYLLABLE TO
+A12C;W # YI SYLLABLE TOP
+A12D;W # YI SYLLABLE TEX
+A12E;W # YI SYLLABLE TE
+A12F;W # YI SYLLABLE TEP
+A130;W # YI SYLLABLE TUT
+A131;W # YI SYLLABLE TUX
+A132;W # YI SYLLABLE TU
+A133;W # YI SYLLABLE TUP
+A134;W # YI SYLLABLE TURX
+A135;W # YI SYLLABLE TUR
+A136;W # YI SYLLABLE DDIT
+A137;W # YI SYLLABLE DDIX
+A138;W # YI SYLLABLE DDI
+A139;W # YI SYLLABLE DDIP
+A13A;W # YI SYLLABLE DDIEX
+A13B;W # YI SYLLABLE DDIE
+A13C;W # YI SYLLABLE DDIEP
+A13D;W # YI SYLLABLE DDAT
+A13E;W # YI SYLLABLE DDAX
+A13F;W # YI SYLLABLE DDA
+A140;W # YI SYLLABLE DDAP
+A141;W # YI SYLLABLE DDUOX
+A142;W # YI SYLLABLE DDUO
+A143;W # YI SYLLABLE DDUOP
+A144;W # YI SYLLABLE DDOT
+A145;W # YI SYLLABLE DDOX
+A146;W # YI SYLLABLE DDO
+A147;W # YI SYLLABLE DDOP
+A148;W # YI SYLLABLE DDEX
+A149;W # YI SYLLABLE DDE
+A14A;W # YI SYLLABLE DDEP
+A14B;W # YI SYLLABLE DDUT
+A14C;W # YI SYLLABLE DDUX
+A14D;W # YI SYLLABLE DDU
+A14E;W # YI SYLLABLE DDUP
+A14F;W # YI SYLLABLE DDURX
+A150;W # YI SYLLABLE DDUR
+A151;W # YI SYLLABLE NDIT
+A152;W # YI SYLLABLE NDIX
+A153;W # YI SYLLABLE NDI
+A154;W # YI SYLLABLE NDIP
+A155;W # YI SYLLABLE NDIEX
+A156;W # YI SYLLABLE NDIE
+A157;W # YI SYLLABLE NDAT
+A158;W # YI SYLLABLE NDAX
+A159;W # YI SYLLABLE NDA
+A15A;W # YI SYLLABLE NDAP
+A15B;W # YI SYLLABLE NDOT
+A15C;W # YI SYLLABLE NDOX
+A15D;W # YI SYLLABLE NDO
+A15E;W # YI SYLLABLE NDOP
+A15F;W # YI SYLLABLE NDEX
+A160;W # YI SYLLABLE NDE
+A161;W # YI SYLLABLE NDEP
+A162;W # YI SYLLABLE NDUT
+A163;W # YI SYLLABLE NDUX
+A164;W # YI SYLLABLE NDU
+A165;W # YI SYLLABLE NDUP
+A166;W # YI SYLLABLE NDURX
+A167;W # YI SYLLABLE NDUR
+A168;W # YI SYLLABLE HNIT
+A169;W # YI SYLLABLE HNIX
+A16A;W # YI SYLLABLE HNI
+A16B;W # YI SYLLABLE HNIP
+A16C;W # YI SYLLABLE HNIET
+A16D;W # YI SYLLABLE HNIEX
+A16E;W # YI SYLLABLE HNIE
+A16F;W # YI SYLLABLE HNIEP
+A170;W # YI SYLLABLE HNAT
+A171;W # YI SYLLABLE HNAX
+A172;W # YI SYLLABLE HNA
+A173;W # YI SYLLABLE HNAP
+A174;W # YI SYLLABLE HNUOX
+A175;W # YI SYLLABLE HNUO
+A176;W # YI SYLLABLE HNOT
+A177;W # YI SYLLABLE HNOX
+A178;W # YI SYLLABLE HNOP
+A179;W # YI SYLLABLE HNEX
+A17A;W # YI SYLLABLE HNE
+A17B;W # YI SYLLABLE HNEP
+A17C;W # YI SYLLABLE HNUT
+A17D;W # YI SYLLABLE NIT
+A17E;W # YI SYLLABLE NIX
+A17F;W # YI SYLLABLE NI
+A180;W # YI SYLLABLE NIP
+A181;W # YI SYLLABLE NIEX
+A182;W # YI SYLLABLE NIE
+A183;W # YI SYLLABLE NIEP
+A184;W # YI SYLLABLE NAX
+A185;W # YI SYLLABLE NA
+A186;W # YI SYLLABLE NAP
+A187;W # YI SYLLABLE NUOX
+A188;W # YI SYLLABLE NUO
+A189;W # YI SYLLABLE NUOP
+A18A;W # YI SYLLABLE NOT
+A18B;W # YI SYLLABLE NOX
+A18C;W # YI SYLLABLE NO
+A18D;W # YI SYLLABLE NOP
+A18E;W # YI SYLLABLE NEX
+A18F;W # YI SYLLABLE NE
+A190;W # YI SYLLABLE NEP
+A191;W # YI SYLLABLE NUT
+A192;W # YI SYLLABLE NUX
+A193;W # YI SYLLABLE NU
+A194;W # YI SYLLABLE NUP
+A195;W # YI SYLLABLE NURX
+A196;W # YI SYLLABLE NUR
+A197;W # YI SYLLABLE HLIT
+A198;W # YI SYLLABLE HLIX
+A199;W # YI SYLLABLE HLI
+A19A;W # YI SYLLABLE HLIP
+A19B;W # YI SYLLABLE HLIEX
+A19C;W # YI SYLLABLE HLIE
+A19D;W # YI SYLLABLE HLIEP
+A19E;W # YI SYLLABLE HLAT
+A19F;W # YI SYLLABLE HLAX
+A1A0;W # YI SYLLABLE HLA
+A1A1;W # YI SYLLABLE HLAP
+A1A2;W # YI SYLLABLE HLUOX
+A1A3;W # YI SYLLABLE HLUO
+A1A4;W # YI SYLLABLE HLUOP
+A1A5;W # YI SYLLABLE HLOX
+A1A6;W # YI SYLLABLE HLO
+A1A7;W # YI SYLLABLE HLOP
+A1A8;W # YI SYLLABLE HLEX
+A1A9;W # YI SYLLABLE HLE
+A1AA;W # YI SYLLABLE HLEP
+A1AB;W # YI SYLLABLE HLUT
+A1AC;W # YI SYLLABLE HLUX
+A1AD;W # YI SYLLABLE HLU
+A1AE;W # YI SYLLABLE HLUP
+A1AF;W # YI SYLLABLE HLURX
+A1B0;W # YI SYLLABLE HLUR
+A1B1;W # YI SYLLABLE HLYT
+A1B2;W # YI SYLLABLE HLYX
+A1B3;W # YI SYLLABLE HLY
+A1B4;W # YI SYLLABLE HLYP
+A1B5;W # YI SYLLABLE HLYRX
+A1B6;W # YI SYLLABLE HLYR
+A1B7;W # YI SYLLABLE LIT
+A1B8;W # YI SYLLABLE LIX
+A1B9;W # YI SYLLABLE LI
+A1BA;W # YI SYLLABLE LIP
+A1BB;W # YI SYLLABLE LIET
+A1BC;W # YI SYLLABLE LIEX
+A1BD;W # YI SYLLABLE LIE
+A1BE;W # YI SYLLABLE LIEP
+A1BF;W # YI SYLLABLE LAT
+A1C0;W # YI SYLLABLE LAX
+A1C1;W # YI SYLLABLE LA
+A1C2;W # YI SYLLABLE LAP
+A1C3;W # YI SYLLABLE LUOT
+A1C4;W # YI SYLLABLE LUOX
+A1C5;W # YI SYLLABLE LUO
+A1C6;W # YI SYLLABLE LUOP
+A1C7;W # YI SYLLABLE LOT
+A1C8;W # YI SYLLABLE LOX
+A1C9;W # YI SYLLABLE LO
+A1CA;W # YI SYLLABLE LOP
+A1CB;W # YI SYLLABLE LEX
+A1CC;W # YI SYLLABLE LE
+A1CD;W # YI SYLLABLE LEP
+A1CE;W # YI SYLLABLE LUT
+A1CF;W # YI SYLLABLE LUX
+A1D0;W # YI SYLLABLE LU
+A1D1;W # YI SYLLABLE LUP
+A1D2;W # YI SYLLABLE LURX
+A1D3;W # YI SYLLABLE LUR
+A1D4;W # YI SYLLABLE LYT
+A1D5;W # YI SYLLABLE LYX
+A1D6;W # YI SYLLABLE LY
+A1D7;W # YI SYLLABLE LYP
+A1D8;W # YI SYLLABLE LYRX
+A1D9;W # YI SYLLABLE LYR
+A1DA;W # YI SYLLABLE GIT
+A1DB;W # YI SYLLABLE GIX
+A1DC;W # YI SYLLABLE GI
+A1DD;W # YI SYLLABLE GIP
+A1DE;W # YI SYLLABLE GIET
+A1DF;W # YI SYLLABLE GIEX
+A1E0;W # YI SYLLABLE GIE
+A1E1;W # YI SYLLABLE GIEP
+A1E2;W # YI SYLLABLE GAT
+A1E3;W # YI SYLLABLE GAX
+A1E4;W # YI SYLLABLE GA
+A1E5;W # YI SYLLABLE GAP
+A1E6;W # YI SYLLABLE GUOT
+A1E7;W # YI SYLLABLE GUOX
+A1E8;W # YI SYLLABLE GUO
+A1E9;W # YI SYLLABLE GUOP
+A1EA;W # YI SYLLABLE GOT
+A1EB;W # YI SYLLABLE GOX
+A1EC;W # YI SYLLABLE GO
+A1ED;W # YI SYLLABLE GOP
+A1EE;W # YI SYLLABLE GET
+A1EF;W # YI SYLLABLE GEX
+A1F0;W # YI SYLLABLE GE
+A1F1;W # YI SYLLABLE GEP
+A1F2;W # YI SYLLABLE GUT
+A1F3;W # YI SYLLABLE GUX
+A1F4;W # YI SYLLABLE GU
+A1F5;W # YI SYLLABLE GUP
+A1F6;W # YI SYLLABLE GURX
+A1F7;W # YI SYLLABLE GUR
+A1F8;W # YI SYLLABLE KIT
+A1F9;W # YI SYLLABLE KIX
+A1FA;W # YI SYLLABLE KI
+A1FB;W # YI SYLLABLE KIP
+A1FC;W # YI SYLLABLE KIEX
+A1FD;W # YI SYLLABLE KIE
+A1FE;W # YI SYLLABLE KIEP
+A1FF;W # YI SYLLABLE KAT
+A200;W # YI SYLLABLE KAX
+A201;W # YI SYLLABLE KA
+A202;W # YI SYLLABLE KAP
+A203;W # YI SYLLABLE KUOX
+A204;W # YI SYLLABLE KUO
+A205;W # YI SYLLABLE KUOP
+A206;W # YI SYLLABLE KOT
+A207;W # YI SYLLABLE KOX
+A208;W # YI SYLLABLE KO
+A209;W # YI SYLLABLE KOP
+A20A;W # YI SYLLABLE KET
+A20B;W # YI SYLLABLE KEX
+A20C;W # YI SYLLABLE KE
+A20D;W # YI SYLLABLE KEP
+A20E;W # YI SYLLABLE KUT
+A20F;W # YI SYLLABLE KUX
+A210;W # YI SYLLABLE KU
+A211;W # YI SYLLABLE KUP
+A212;W # YI SYLLABLE KURX
+A213;W # YI SYLLABLE KUR
+A214;W # YI SYLLABLE GGIT
+A215;W # YI SYLLABLE GGIX
+A216;W # YI SYLLABLE GGI
+A217;W # YI SYLLABLE GGIEX
+A218;W # YI SYLLABLE GGIE
+A219;W # YI SYLLABLE GGIEP
+A21A;W # YI SYLLABLE GGAT
+A21B;W # YI SYLLABLE GGAX
+A21C;W # YI SYLLABLE GGA
+A21D;W # YI SYLLABLE GGAP
+A21E;W # YI SYLLABLE GGUOT
+A21F;W # YI SYLLABLE GGUOX
+A220;W # YI SYLLABLE GGUO
+A221;W # YI SYLLABLE GGUOP
+A222;W # YI SYLLABLE GGOT
+A223;W # YI SYLLABLE GGOX
+A224;W # YI SYLLABLE GGO
+A225;W # YI SYLLABLE GGOP
+A226;W # YI SYLLABLE GGET
+A227;W # YI SYLLABLE GGEX
+A228;W # YI SYLLABLE GGE
+A229;W # YI SYLLABLE GGEP
+A22A;W # YI SYLLABLE GGUT
+A22B;W # YI SYLLABLE GGUX
+A22C;W # YI SYLLABLE GGU
+A22D;W # YI SYLLABLE GGUP
+A22E;W # YI SYLLABLE GGURX
+A22F;W # YI SYLLABLE GGUR
+A230;W # YI SYLLABLE MGIEX
+A231;W # YI SYLLABLE MGIE
+A232;W # YI SYLLABLE MGAT
+A233;W # YI SYLLABLE MGAX
+A234;W # YI SYLLABLE MGA
+A235;W # YI SYLLABLE MGAP
+A236;W # YI SYLLABLE MGUOX
+A237;W # YI SYLLABLE MGUO
+A238;W # YI SYLLABLE MGUOP
+A239;W # YI SYLLABLE MGOT
+A23A;W # YI SYLLABLE MGOX
+A23B;W # YI SYLLABLE MGO
+A23C;W # YI SYLLABLE MGOP
+A23D;W # YI SYLLABLE MGEX
+A23E;W # YI SYLLABLE MGE
+A23F;W # YI SYLLABLE MGEP
+A240;W # YI SYLLABLE MGUT
+A241;W # YI SYLLABLE MGUX
+A242;W # YI SYLLABLE MGU
+A243;W # YI SYLLABLE MGUP
+A244;W # YI SYLLABLE MGURX
+A245;W # YI SYLLABLE MGUR
+A246;W # YI SYLLABLE HXIT
+A247;W # YI SYLLABLE HXIX
+A248;W # YI SYLLABLE HXI
+A249;W # YI SYLLABLE HXIP
+A24A;W # YI SYLLABLE HXIET
+A24B;W # YI SYLLABLE HXIEX
+A24C;W # YI SYLLABLE HXIE
+A24D;W # YI SYLLABLE HXIEP
+A24E;W # YI SYLLABLE HXAT
+A24F;W # YI SYLLABLE HXAX
+A250;W # YI SYLLABLE HXA
+A251;W # YI SYLLABLE HXAP
+A252;W # YI SYLLABLE HXUOT
+A253;W # YI SYLLABLE HXUOX
+A254;W # YI SYLLABLE HXUO
+A255;W # YI SYLLABLE HXUOP
+A256;W # YI SYLLABLE HXOT
+A257;W # YI SYLLABLE HXOX
+A258;W # YI SYLLABLE HXO
+A259;W # YI SYLLABLE HXOP
+A25A;W # YI SYLLABLE HXEX
+A25B;W # YI SYLLABLE HXE
+A25C;W # YI SYLLABLE HXEP
+A25D;W # YI SYLLABLE NGIEX
+A25E;W # YI SYLLABLE NGIE
+A25F;W # YI SYLLABLE NGIEP
+A260;W # YI SYLLABLE NGAT
+A261;W # YI SYLLABLE NGAX
+A262;W # YI SYLLABLE NGA
+A263;W # YI SYLLABLE NGAP
+A264;W # YI SYLLABLE NGUOT
+A265;W # YI SYLLABLE NGUOX
+A266;W # YI SYLLABLE NGUO
+A267;W # YI SYLLABLE NGOT
+A268;W # YI SYLLABLE NGOX
+A269;W # YI SYLLABLE NGO
+A26A;W # YI SYLLABLE NGOP
+A26B;W # YI SYLLABLE NGEX
+A26C;W # YI SYLLABLE NGE
+A26D;W # YI SYLLABLE NGEP
+A26E;W # YI SYLLABLE HIT
+A26F;W # YI SYLLABLE HIEX
+A270;W # YI SYLLABLE HIE
+A271;W # YI SYLLABLE HAT
+A272;W # YI SYLLABLE HAX
+A273;W # YI SYLLABLE HA
+A274;W # YI SYLLABLE HAP
+A275;W # YI SYLLABLE HUOT
+A276;W # YI SYLLABLE HUOX
+A277;W # YI SYLLABLE HUO
+A278;W # YI SYLLABLE HUOP
+A279;W # YI SYLLABLE HOT
+A27A;W # YI SYLLABLE HOX
+A27B;W # YI SYLLABLE HO
+A27C;W # YI SYLLABLE HOP
+A27D;W # YI SYLLABLE HEX
+A27E;W # YI SYLLABLE HE
+A27F;W # YI SYLLABLE HEP
+A280;W # YI SYLLABLE WAT
+A281;W # YI SYLLABLE WAX
+A282;W # YI SYLLABLE WA
+A283;W # YI SYLLABLE WAP
+A284;W # YI SYLLABLE WUOX
+A285;W # YI SYLLABLE WUO
+A286;W # YI SYLLABLE WUOP
+A287;W # YI SYLLABLE WOX
+A288;W # YI SYLLABLE WO
+A289;W # YI SYLLABLE WOP
+A28A;W # YI SYLLABLE WEX
+A28B;W # YI SYLLABLE WE
+A28C;W # YI SYLLABLE WEP
+A28D;W # YI SYLLABLE ZIT
+A28E;W # YI SYLLABLE ZIX
+A28F;W # YI SYLLABLE ZI
+A290;W # YI SYLLABLE ZIP
+A291;W # YI SYLLABLE ZIEX
+A292;W # YI SYLLABLE ZIE
+A293;W # YI SYLLABLE ZIEP
+A294;W # YI SYLLABLE ZAT
+A295;W # YI SYLLABLE ZAX
+A296;W # YI SYLLABLE ZA
+A297;W # YI SYLLABLE ZAP
+A298;W # YI SYLLABLE ZUOX
+A299;W # YI SYLLABLE ZUO
+A29A;W # YI SYLLABLE ZUOP
+A29B;W # YI SYLLABLE ZOT
+A29C;W # YI SYLLABLE ZOX
+A29D;W # YI SYLLABLE ZO
+A29E;W # YI SYLLABLE ZOP
+A29F;W # YI SYLLABLE ZEX
+A2A0;W # YI SYLLABLE ZE
+A2A1;W # YI SYLLABLE ZEP
+A2A2;W # YI SYLLABLE ZUT
+A2A3;W # YI SYLLABLE ZUX
+A2A4;W # YI SYLLABLE ZU
+A2A5;W # YI SYLLABLE ZUP
+A2A6;W # YI SYLLABLE ZURX
+A2A7;W # YI SYLLABLE ZUR
+A2A8;W # YI SYLLABLE ZYT
+A2A9;W # YI SYLLABLE ZYX
+A2AA;W # YI SYLLABLE ZY
+A2AB;W # YI SYLLABLE ZYP
+A2AC;W # YI SYLLABLE ZYRX
+A2AD;W # YI SYLLABLE ZYR
+A2AE;W # YI SYLLABLE CIT
+A2AF;W # YI SYLLABLE CIX
+A2B0;W # YI SYLLABLE CI
+A2B1;W # YI SYLLABLE CIP
+A2B2;W # YI SYLLABLE CIET
+A2B3;W # YI SYLLABLE CIEX
+A2B4;W # YI SYLLABLE CIE
+A2B5;W # YI SYLLABLE CIEP
+A2B6;W # YI SYLLABLE CAT
+A2B7;W # YI SYLLABLE CAX
+A2B8;W # YI SYLLABLE CA
+A2B9;W # YI SYLLABLE CAP
+A2BA;W # YI SYLLABLE CUOX
+A2BB;W # YI SYLLABLE CUO
+A2BC;W # YI SYLLABLE CUOP
+A2BD;W # YI SYLLABLE COT
+A2BE;W # YI SYLLABLE COX
+A2BF;W # YI SYLLABLE CO
+A2C0;W # YI SYLLABLE COP
+A2C1;W # YI SYLLABLE CEX
+A2C2;W # YI SYLLABLE CE
+A2C3;W # YI SYLLABLE CEP
+A2C4;W # YI SYLLABLE CUT
+A2C5;W # YI SYLLABLE CUX
+A2C6;W # YI SYLLABLE CU
+A2C7;W # YI SYLLABLE CUP
+A2C8;W # YI SYLLABLE CURX
+A2C9;W # YI SYLLABLE CUR
+A2CA;W # YI SYLLABLE CYT
+A2CB;W # YI SYLLABLE CYX
+A2CC;W # YI SYLLABLE CY
+A2CD;W # YI SYLLABLE CYP
+A2CE;W # YI SYLLABLE CYRX
+A2CF;W # YI SYLLABLE CYR
+A2D0;W # YI SYLLABLE ZZIT
+A2D1;W # YI SYLLABLE ZZIX
+A2D2;W # YI SYLLABLE ZZI
+A2D3;W # YI SYLLABLE ZZIP
+A2D4;W # YI SYLLABLE ZZIET
+A2D5;W # YI SYLLABLE ZZIEX
+A2D6;W # YI SYLLABLE ZZIE
+A2D7;W # YI SYLLABLE ZZIEP
+A2D8;W # YI SYLLABLE ZZAT
+A2D9;W # YI SYLLABLE ZZAX
+A2DA;W # YI SYLLABLE ZZA
+A2DB;W # YI SYLLABLE ZZAP
+A2DC;W # YI SYLLABLE ZZOX
+A2DD;W # YI SYLLABLE ZZO
+A2DE;W # YI SYLLABLE ZZOP
+A2DF;W # YI SYLLABLE ZZEX
+A2E0;W # YI SYLLABLE ZZE
+A2E1;W # YI SYLLABLE ZZEP
+A2E2;W # YI SYLLABLE ZZUX
+A2E3;W # YI SYLLABLE ZZU
+A2E4;W # YI SYLLABLE ZZUP
+A2E5;W # YI SYLLABLE ZZURX
+A2E6;W # YI SYLLABLE ZZUR
+A2E7;W # YI SYLLABLE ZZYT
+A2E8;W # YI SYLLABLE ZZYX
+A2E9;W # YI SYLLABLE ZZY
+A2EA;W # YI SYLLABLE ZZYP
+A2EB;W # YI SYLLABLE ZZYRX
+A2EC;W # YI SYLLABLE ZZYR
+A2ED;W # YI SYLLABLE NZIT
+A2EE;W # YI SYLLABLE NZIX
+A2EF;W # YI SYLLABLE NZI
+A2F0;W # YI SYLLABLE NZIP
+A2F1;W # YI SYLLABLE NZIEX
+A2F2;W # YI SYLLABLE NZIE
+A2F3;W # YI SYLLABLE NZIEP
+A2F4;W # YI SYLLABLE NZAT
+A2F5;W # YI SYLLABLE NZAX
+A2F6;W # YI SYLLABLE NZA
+A2F7;W # YI SYLLABLE NZAP
+A2F8;W # YI SYLLABLE NZUOX
+A2F9;W # YI SYLLABLE NZUO
+A2FA;W # YI SYLLABLE NZOX
+A2FB;W # YI SYLLABLE NZOP
+A2FC;W # YI SYLLABLE NZEX
+A2FD;W # YI SYLLABLE NZE
+A2FE;W # YI SYLLABLE NZUX
+A2FF;W # YI SYLLABLE NZU
+A300;W # YI SYLLABLE NZUP
+A301;W # YI SYLLABLE NZURX
+A302;W # YI SYLLABLE NZUR
+A303;W # YI SYLLABLE NZYT
+A304;W # YI SYLLABLE NZYX
+A305;W # YI SYLLABLE NZY
+A306;W # YI SYLLABLE NZYP
+A307;W # YI SYLLABLE NZYRX
+A308;W # YI SYLLABLE NZYR
+A309;W # YI SYLLABLE SIT
+A30A;W # YI SYLLABLE SIX
+A30B;W # YI SYLLABLE SI
+A30C;W # YI SYLLABLE SIP
+A30D;W # YI SYLLABLE SIEX
+A30E;W # YI SYLLABLE SIE
+A30F;W # YI SYLLABLE SIEP
+A310;W # YI SYLLABLE SAT
+A311;W # YI SYLLABLE SAX
+A312;W # YI SYLLABLE SA
+A313;W # YI SYLLABLE SAP
+A314;W # YI SYLLABLE SUOX
+A315;W # YI SYLLABLE SUO
+A316;W # YI SYLLABLE SUOP
+A317;W # YI SYLLABLE SOT
+A318;W # YI SYLLABLE SOX
+A319;W # YI SYLLABLE SO
+A31A;W # YI SYLLABLE SOP
+A31B;W # YI SYLLABLE SEX
+A31C;W # YI SYLLABLE SE
+A31D;W # YI SYLLABLE SEP
+A31E;W # YI SYLLABLE SUT
+A31F;W # YI SYLLABLE SUX
+A320;W # YI SYLLABLE SU
+A321;W # YI SYLLABLE SUP
+A322;W # YI SYLLABLE SURX
+A323;W # YI SYLLABLE SUR
+A324;W # YI SYLLABLE SYT
+A325;W # YI SYLLABLE SYX
+A326;W # YI SYLLABLE SY
+A327;W # YI SYLLABLE SYP
+A328;W # YI SYLLABLE SYRX
+A329;W # YI SYLLABLE SYR
+A32A;W # YI SYLLABLE SSIT
+A32B;W # YI SYLLABLE SSIX
+A32C;W # YI SYLLABLE SSI
+A32D;W # YI SYLLABLE SSIP
+A32E;W # YI SYLLABLE SSIEX
+A32F;W # YI SYLLABLE SSIE
+A330;W # YI SYLLABLE SSIEP
+A331;W # YI SYLLABLE SSAT
+A332;W # YI SYLLABLE SSAX
+A333;W # YI SYLLABLE SSA
+A334;W # YI SYLLABLE SSAP
+A335;W # YI SYLLABLE SSOT
+A336;W # YI SYLLABLE SSOX
+A337;W # YI SYLLABLE SSO
+A338;W # YI SYLLABLE SSOP
+A339;W # YI SYLLABLE SSEX
+A33A;W # YI SYLLABLE SSE
+A33B;W # YI SYLLABLE SSEP
+A33C;W # YI SYLLABLE SSUT
+A33D;W # YI SYLLABLE SSUX
+A33E;W # YI SYLLABLE SSU
+A33F;W # YI SYLLABLE SSUP
+A340;W # YI SYLLABLE SSYT
+A341;W # YI SYLLABLE SSYX
+A342;W # YI SYLLABLE SSY
+A343;W # YI SYLLABLE SSYP
+A344;W # YI SYLLABLE SSYRX
+A345;W # YI SYLLABLE SSYR
+A346;W # YI SYLLABLE ZHAT
+A347;W # YI SYLLABLE ZHAX
+A348;W # YI SYLLABLE ZHA
+A349;W # YI SYLLABLE ZHAP
+A34A;W # YI SYLLABLE ZHUOX
+A34B;W # YI SYLLABLE ZHUO
+A34C;W # YI SYLLABLE ZHUOP
+A34D;W # YI SYLLABLE ZHOT
+A34E;W # YI SYLLABLE ZHOX
+A34F;W # YI SYLLABLE ZHO
+A350;W # YI SYLLABLE ZHOP
+A351;W # YI SYLLABLE ZHET
+A352;W # YI SYLLABLE ZHEX
+A353;W # YI SYLLABLE ZHE
+A354;W # YI SYLLABLE ZHEP
+A355;W # YI SYLLABLE ZHUT
+A356;W # YI SYLLABLE ZHUX
+A357;W # YI SYLLABLE ZHU
+A358;W # YI SYLLABLE ZHUP
+A359;W # YI SYLLABLE ZHURX
+A35A;W # YI SYLLABLE ZHUR
+A35B;W # YI SYLLABLE ZHYT
+A35C;W # YI SYLLABLE ZHYX
+A35D;W # YI SYLLABLE ZHY
+A35E;W # YI SYLLABLE ZHYP
+A35F;W # YI SYLLABLE ZHYRX
+A360;W # YI SYLLABLE ZHYR
+A361;W # YI SYLLABLE CHAT
+A362;W # YI SYLLABLE CHAX
+A363;W # YI SYLLABLE CHA
+A364;W # YI SYLLABLE CHAP
+A365;W # YI SYLLABLE CHUOT
+A366;W # YI SYLLABLE CHUOX
+A367;W # YI SYLLABLE CHUO
+A368;W # YI SYLLABLE CHUOP
+A369;W # YI SYLLABLE CHOT
+A36A;W # YI SYLLABLE CHOX
+A36B;W # YI SYLLABLE CHO
+A36C;W # YI SYLLABLE CHOP
+A36D;W # YI SYLLABLE CHET
+A36E;W # YI SYLLABLE CHEX
+A36F;W # YI SYLLABLE CHE
+A370;W # YI SYLLABLE CHEP
+A371;W # YI SYLLABLE CHUX
+A372;W # YI SYLLABLE CHU
+A373;W # YI SYLLABLE CHUP
+A374;W # YI SYLLABLE CHURX
+A375;W # YI SYLLABLE CHUR
+A376;W # YI SYLLABLE CHYT
+A377;W # YI SYLLABLE CHYX
+A378;W # YI SYLLABLE CHY
+A379;W # YI SYLLABLE CHYP
+A37A;W # YI SYLLABLE CHYRX
+A37B;W # YI SYLLABLE CHYR
+A37C;W # YI SYLLABLE RRAX
+A37D;W # YI SYLLABLE RRA
+A37E;W # YI SYLLABLE RRUOX
+A37F;W # YI SYLLABLE RRUO
+A380;W # YI SYLLABLE RROT
+A381;W # YI SYLLABLE RROX
+A382;W # YI SYLLABLE RRO
+A383;W # YI SYLLABLE RROP
+A384;W # YI SYLLABLE RRET
+A385;W # YI SYLLABLE RREX
+A386;W # YI SYLLABLE RRE
+A387;W # YI SYLLABLE RREP
+A388;W # YI SYLLABLE RRUT
+A389;W # YI SYLLABLE RRUX
+A38A;W # YI SYLLABLE RRU
+A38B;W # YI SYLLABLE RRUP
+A38C;W # YI SYLLABLE RRURX
+A38D;W # YI SYLLABLE RRUR
+A38E;W # YI SYLLABLE RRYT
+A38F;W # YI SYLLABLE RRYX
+A390;W # YI SYLLABLE RRY
+A391;W # YI SYLLABLE RRYP
+A392;W # YI SYLLABLE RRYRX
+A393;W # YI SYLLABLE RRYR
+A394;W # YI SYLLABLE NRAT
+A395;W # YI SYLLABLE NRAX
+A396;W # YI SYLLABLE NRA
+A397;W # YI SYLLABLE NRAP
+A398;W # YI SYLLABLE NROX
+A399;W # YI SYLLABLE NRO
+A39A;W # YI SYLLABLE NROP
+A39B;W # YI SYLLABLE NRET
+A39C;W # YI SYLLABLE NREX
+A39D;W # YI SYLLABLE NRE
+A39E;W # YI SYLLABLE NREP
+A39F;W # YI SYLLABLE NRUT
+A3A0;W # YI SYLLABLE NRUX
+A3A1;W # YI SYLLABLE NRU
+A3A2;W # YI SYLLABLE NRUP
+A3A3;W # YI SYLLABLE NRURX
+A3A4;W # YI SYLLABLE NRUR
+A3A5;W # YI SYLLABLE NRYT
+A3A6;W # YI SYLLABLE NRYX
+A3A7;W # YI SYLLABLE NRY
+A3A8;W # YI SYLLABLE NRYP
+A3A9;W # YI SYLLABLE NRYRX
+A3AA;W # YI SYLLABLE NRYR
+A3AB;W # YI SYLLABLE SHAT
+A3AC;W # YI SYLLABLE SHAX
+A3AD;W # YI SYLLABLE SHA
+A3AE;W # YI SYLLABLE SHAP
+A3AF;W # YI SYLLABLE SHUOX
+A3B0;W # YI SYLLABLE SHUO
+A3B1;W # YI SYLLABLE SHUOP
+A3B2;W # YI SYLLABLE SHOT
+A3B3;W # YI SYLLABLE SHOX
+A3B4;W # YI SYLLABLE SHO
+A3B5;W # YI SYLLABLE SHOP
+A3B6;W # YI SYLLABLE SHET
+A3B7;W # YI SYLLABLE SHEX
+A3B8;W # YI SYLLABLE SHE
+A3B9;W # YI SYLLABLE SHEP
+A3BA;W # YI SYLLABLE SHUT
+A3BB;W # YI SYLLABLE SHUX
+A3BC;W # YI SYLLABLE SHU
+A3BD;W # YI SYLLABLE SHUP
+A3BE;W # YI SYLLABLE SHURX
+A3BF;W # YI SYLLABLE SHUR
+A3C0;W # YI SYLLABLE SHYT
+A3C1;W # YI SYLLABLE SHYX
+A3C2;W # YI SYLLABLE SHY
+A3C3;W # YI SYLLABLE SHYP
+A3C4;W # YI SYLLABLE SHYRX
+A3C5;W # YI SYLLABLE SHYR
+A3C6;W # YI SYLLABLE RAT
+A3C7;W # YI SYLLABLE RAX
+A3C8;W # YI SYLLABLE RA
+A3C9;W # YI SYLLABLE RAP
+A3CA;W # YI SYLLABLE RUOX
+A3CB;W # YI SYLLABLE RUO
+A3CC;W # YI SYLLABLE RUOP
+A3CD;W # YI SYLLABLE ROT
+A3CE;W # YI SYLLABLE ROX
+A3CF;W # YI SYLLABLE RO
+A3D0;W # YI SYLLABLE ROP
+A3D1;W # YI SYLLABLE REX
+A3D2;W # YI SYLLABLE RE
+A3D3;W # YI SYLLABLE REP
+A3D4;W # YI SYLLABLE RUT
+A3D5;W # YI SYLLABLE RUX
+A3D6;W # YI SYLLABLE RU
+A3D7;W # YI SYLLABLE RUP
+A3D8;W # YI SYLLABLE RURX
+A3D9;W # YI SYLLABLE RUR
+A3DA;W # YI SYLLABLE RYT
+A3DB;W # YI SYLLABLE RYX
+A3DC;W # YI SYLLABLE RY
+A3DD;W # YI SYLLABLE RYP
+A3DE;W # YI SYLLABLE RYRX
+A3DF;W # YI SYLLABLE RYR
+A3E0;W # YI SYLLABLE JIT
+A3E1;W # YI SYLLABLE JIX
+A3E2;W # YI SYLLABLE JI
+A3E3;W # YI SYLLABLE JIP
+A3E4;W # YI SYLLABLE JIET
+A3E5;W # YI SYLLABLE JIEX
+A3E6;W # YI SYLLABLE JIE
+A3E7;W # YI SYLLABLE JIEP
+A3E8;W # YI SYLLABLE JUOT
+A3E9;W # YI SYLLABLE JUOX
+A3EA;W # YI SYLLABLE JUO
+A3EB;W # YI SYLLABLE JUOP
+A3EC;W # YI SYLLABLE JOT
+A3ED;W # YI SYLLABLE JOX
+A3EE;W # YI SYLLABLE JO
+A3EF;W # YI SYLLABLE JOP
+A3F0;W # YI SYLLABLE JUT
+A3F1;W # YI SYLLABLE JUX
+A3F2;W # YI SYLLABLE JU
+A3F3;W # YI SYLLABLE JUP
+A3F4;W # YI SYLLABLE JURX
+A3F5;W # YI SYLLABLE JUR
+A3F6;W # YI SYLLABLE JYT
+A3F7;W # YI SYLLABLE JYX
+A3F8;W # YI SYLLABLE JY
+A3F9;W # YI SYLLABLE JYP
+A3FA;W # YI SYLLABLE JYRX
+A3FB;W # YI SYLLABLE JYR
+A3FC;W # YI SYLLABLE QIT
+A3FD;W # YI SYLLABLE QIX
+A3FE;W # YI SYLLABLE QI
+A3FF;W # YI SYLLABLE QIP
+A400;W # YI SYLLABLE QIET
+A401;W # YI SYLLABLE QIEX
+A402;W # YI SYLLABLE QIE
+A403;W # YI SYLLABLE QIEP
+A404;W # YI SYLLABLE QUOT
+A405;W # YI SYLLABLE QUOX
+A406;W # YI SYLLABLE QUO
+A407;W # YI SYLLABLE QUOP
+A408;W # YI SYLLABLE QOT
+A409;W # YI SYLLABLE QOX
+A40A;W # YI SYLLABLE QO
+A40B;W # YI SYLLABLE QOP
+A40C;W # YI SYLLABLE QUT
+A40D;W # YI SYLLABLE QUX
+A40E;W # YI SYLLABLE QU
+A40F;W # YI SYLLABLE QUP
+A410;W # YI SYLLABLE QURX
+A411;W # YI SYLLABLE QUR
+A412;W # YI SYLLABLE QYT
+A413;W # YI SYLLABLE QYX
+A414;W # YI SYLLABLE QY
+A415;W # YI SYLLABLE QYP
+A416;W # YI SYLLABLE QYRX
+A417;W # YI SYLLABLE QYR
+A418;W # YI SYLLABLE JJIT
+A419;W # YI SYLLABLE JJIX
+A41A;W # YI SYLLABLE JJI
+A41B;W # YI SYLLABLE JJIP
+A41C;W # YI SYLLABLE JJIET
+A41D;W # YI SYLLABLE JJIEX
+A41E;W # YI SYLLABLE JJIE
+A41F;W # YI SYLLABLE JJIEP
+A420;W # YI SYLLABLE JJUOX
+A421;W # YI SYLLABLE JJUO
+A422;W # YI SYLLABLE JJUOP
+A423;W # YI SYLLABLE JJOT
+A424;W # YI SYLLABLE JJOX
+A425;W # YI SYLLABLE JJO
+A426;W # YI SYLLABLE JJOP
+A427;W # YI SYLLABLE JJUT
+A428;W # YI SYLLABLE JJUX
+A429;W # YI SYLLABLE JJU
+A42A;W # YI SYLLABLE JJUP
+A42B;W # YI SYLLABLE JJURX
+A42C;W # YI SYLLABLE JJUR
+A42D;W # YI SYLLABLE JJYT
+A42E;W # YI SYLLABLE JJYX
+A42F;W # YI SYLLABLE JJY
+A430;W # YI SYLLABLE JJYP
+A431;W # YI SYLLABLE NJIT
+A432;W # YI SYLLABLE NJIX
+A433;W # YI SYLLABLE NJI
+A434;W # YI SYLLABLE NJIP
+A435;W # YI SYLLABLE NJIET
+A436;W # YI SYLLABLE NJIEX
+A437;W # YI SYLLABLE NJIE
+A438;W # YI SYLLABLE NJIEP
+A439;W # YI SYLLABLE NJUOX
+A43A;W # YI SYLLABLE NJUO
+A43B;W # YI SYLLABLE NJOT
+A43C;W # YI SYLLABLE NJOX
+A43D;W # YI SYLLABLE NJO
+A43E;W # YI SYLLABLE NJOP
+A43F;W # YI SYLLABLE NJUX
+A440;W # YI SYLLABLE NJU
+A441;W # YI SYLLABLE NJUP
+A442;W # YI SYLLABLE NJURX
+A443;W # YI SYLLABLE NJUR
+A444;W # YI SYLLABLE NJYT
+A445;W # YI SYLLABLE NJYX
+A446;W # YI SYLLABLE NJY
+A447;W # YI SYLLABLE NJYP
+A448;W # YI SYLLABLE NJYRX
+A449;W # YI SYLLABLE NJYR
+A44A;W # YI SYLLABLE NYIT
+A44B;W # YI SYLLABLE NYIX
+A44C;W # YI SYLLABLE NYI
+A44D;W # YI SYLLABLE NYIP
+A44E;W # YI SYLLABLE NYIET
+A44F;W # YI SYLLABLE NYIEX
+A450;W # YI SYLLABLE NYIE
+A451;W # YI SYLLABLE NYIEP
+A452;W # YI SYLLABLE NYUOX
+A453;W # YI SYLLABLE NYUO
+A454;W # YI SYLLABLE NYUOP
+A455;W # YI SYLLABLE NYOT
+A456;W # YI SYLLABLE NYOX
+A457;W # YI SYLLABLE NYO
+A458;W # YI SYLLABLE NYOP
+A459;W # YI SYLLABLE NYUT
+A45A;W # YI SYLLABLE NYUX
+A45B;W # YI SYLLABLE NYU
+A45C;W # YI SYLLABLE NYUP
+A45D;W # YI SYLLABLE XIT
+A45E;W # YI SYLLABLE XIX
+A45F;W # YI SYLLABLE XI
+A460;W # YI SYLLABLE XIP
+A461;W # YI SYLLABLE XIET
+A462;W # YI SYLLABLE XIEX
+A463;W # YI SYLLABLE XIE
+A464;W # YI SYLLABLE XIEP
+A465;W # YI SYLLABLE XUOX
+A466;W # YI SYLLABLE XUO
+A467;W # YI SYLLABLE XOT
+A468;W # YI SYLLABLE XOX
+A469;W # YI SYLLABLE XO
+A46A;W # YI SYLLABLE XOP
+A46B;W # YI SYLLABLE XYT
+A46C;W # YI SYLLABLE XYX
+A46D;W # YI SYLLABLE XY
+A46E;W # YI SYLLABLE XYP
+A46F;W # YI SYLLABLE XYRX
+A470;W # YI SYLLABLE XYR
+A471;W # YI SYLLABLE YIT
+A472;W # YI SYLLABLE YIX
+A473;W # YI SYLLABLE YI
+A474;W # YI SYLLABLE YIP
+A475;W # YI SYLLABLE YIET
+A476;W # YI SYLLABLE YIEX
+A477;W # YI SYLLABLE YIE
+A478;W # YI SYLLABLE YIEP
+A479;W # YI SYLLABLE YUOT
+A47A;W # YI SYLLABLE YUOX
+A47B;W # YI SYLLABLE YUO
+A47C;W # YI SYLLABLE YUOP
+A47D;W # YI SYLLABLE YOT
+A47E;W # YI SYLLABLE YOX
+A47F;W # YI SYLLABLE YO
+A480;W # YI SYLLABLE YOP
+A481;W # YI SYLLABLE YUT
+A482;W # YI SYLLABLE YUX
+A483;W # YI SYLLABLE YU
+A484;W # YI SYLLABLE YUP
+A485;W # YI SYLLABLE YURX
+A486;W # YI SYLLABLE YUR
+A487;W # YI SYLLABLE YYT
+A488;W # YI SYLLABLE YYX
+A489;W # YI SYLLABLE YY
+A48A;W # YI SYLLABLE YYP
+A48B;W # YI SYLLABLE YYRX
+A48C;W # YI SYLLABLE YYR
+A490;W # YI RADICAL QOT
+A491;W # YI RADICAL LI
+A492;W # YI RADICAL KIT
+A493;W # YI RADICAL NYIP
+A494;W # YI RADICAL CYP
+A495;W # YI RADICAL SSI
+A496;W # YI RADICAL GGOP
+A497;W # YI RADICAL GEP
+A498;W # YI RADICAL MI
+A499;W # YI RADICAL HXIT
+A49A;W # YI RADICAL LYR
+A49B;W # YI RADICAL BBUT
+A49C;W # YI RADICAL MOP
+A49D;W # YI RADICAL YO
+A49E;W # YI RADICAL PUT
+A49F;W # YI RADICAL HXUO
+A4A0;W # YI RADICAL TAT
+A4A1;W # YI RADICAL GA
+A4A2;W # YI RADICAL ZUP
+A4A3;W # YI RADICAL CYT
+A4A4;W # YI RADICAL DDUR
+A4A5;W # YI RADICAL BUR
+A4A6;W # YI RADICAL GGUO
+A4A7;W # YI RADICAL NYOP
+A4A8;W # YI RADICAL TU
+A4A9;W # YI RADICAL OP
+A4AA;W # YI RADICAL JJUT
+A4AB;W # YI RADICAL ZOT
+A4AC;W # YI RADICAL PYT
+A4AD;W # YI RADICAL HMO
+A4AE;W # YI RADICAL YIT
+A4AF;W # YI RADICAL VUR
+A4B0;W # YI RADICAL SHY
+A4B1;W # YI RADICAL VEP
+A4B2;W # YI RADICAL ZA
+A4B3;W # YI RADICAL JO
+A4B4;W # YI RADICAL NZUP
+A4B5;W # YI RADICAL JJY
+A4B6;W # YI RADICAL GOT
+A4B7;W # YI RADICAL JJIE
+A4B8;W # YI RADICAL WO
+A4B9;W # YI RADICAL DU
+A4BA;W # YI RADICAL SHUR
+A4BB;W # YI RADICAL LIE
+A4BC;W # YI RADICAL CY
+A4BD;W # YI RADICAL CUOP
+A4BE;W # YI RADICAL CIP
+A4BF;W # YI RADICAL HXOP
+A4C0;W # YI RADICAL SHAT
+A4C1;W # YI RADICAL ZUR
+A4C2;W # YI RADICAL SHOP
+A4C3;W # YI RADICAL CHE
+A4C4;W # YI RADICAL ZZIET
+A4C5;W # YI RADICAL NBIE
+A4C6;W # YI RADICAL KE
+A700;N # MODIFIER LETTER CHINESE TONE YIN PING
+A701;N # MODIFIER LETTER CHINESE TONE YANG PING
+A702;N # MODIFIER LETTER CHINESE TONE YIN SHANG
+A703;N # MODIFIER LETTER CHINESE TONE YANG SHANG
+A704;N # MODIFIER LETTER CHINESE TONE YIN QU
+A705;N # MODIFIER LETTER CHINESE TONE YANG QU
+A706;N # MODIFIER LETTER CHINESE TONE YIN RU
+A707;N # MODIFIER LETTER CHINESE TONE YANG RU
+A708;N # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709;N # MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A;N # MODIFIER LETTER MID DOTTED TONE BAR
+A70B;N # MODIFIER LETTER LOW DOTTED TONE BAR
+A70C;N # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D;N # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E;N # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F;N # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710;N # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711;N # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+A712;N # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713;N # MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714;N # MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715;N # MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716;N # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A800;N # SYLOTI NAGRI LETTER A
+A801;N # SYLOTI NAGRI LETTER I
+A802;N # SYLOTI NAGRI SIGN DVISVARA
+A803;N # SYLOTI NAGRI LETTER U
+A804;N # SYLOTI NAGRI LETTER E
+A805;N # SYLOTI NAGRI LETTER O
+A806;N # SYLOTI NAGRI SIGN HASANTA
+A807;N # SYLOTI NAGRI LETTER KO
+A808;N # SYLOTI NAGRI LETTER KHO
+A809;N # SYLOTI NAGRI LETTER GO
+A80A;N # SYLOTI NAGRI LETTER GHO
+A80B;N # SYLOTI NAGRI SIGN ANUSVARA
+A80C;N # SYLOTI NAGRI LETTER CO
+A80D;N # SYLOTI NAGRI LETTER CHO
+A80E;N # SYLOTI NAGRI LETTER JO
+A80F;N # SYLOTI NAGRI LETTER JHO
+A810;N # SYLOTI NAGRI LETTER TTO
+A811;N # SYLOTI NAGRI LETTER TTHO
+A812;N # SYLOTI NAGRI LETTER DDO
+A813;N # SYLOTI NAGRI LETTER DDHO
+A814;N # SYLOTI NAGRI LETTER TO
+A815;N # SYLOTI NAGRI LETTER THO
+A816;N # SYLOTI NAGRI LETTER DO
+A817;N # SYLOTI NAGRI LETTER DHO
+A818;N # SYLOTI NAGRI LETTER NO
+A819;N # SYLOTI NAGRI LETTER PO
+A81A;N # SYLOTI NAGRI LETTER PHO
+A81B;N # SYLOTI NAGRI LETTER BO
+A81C;N # SYLOTI NAGRI LETTER BHO
+A81D;N # SYLOTI NAGRI LETTER MO
+A81E;N # SYLOTI NAGRI LETTER RO
+A81F;N # SYLOTI NAGRI LETTER LO
+A820;N # SYLOTI NAGRI LETTER RRO
+A821;N # SYLOTI NAGRI LETTER SO
+A822;N # SYLOTI NAGRI LETTER HO
+A823;N # SYLOTI NAGRI VOWEL SIGN A
+A824;N # SYLOTI NAGRI VOWEL SIGN I
+A825;N # SYLOTI NAGRI VOWEL SIGN U
+A826;N # SYLOTI NAGRI VOWEL SIGN E
+A827;N # SYLOTI NAGRI VOWEL SIGN OO
+A828;N # SYLOTI NAGRI POETRY MARK-1
+A829;N # SYLOTI NAGRI POETRY MARK-2
+A82A;N # SYLOTI NAGRI POETRY MARK-3
+A82B;N # SYLOTI NAGRI POETRY MARK-4
+AC00..D7A3;W # <Hangul Syllable, First>..<Hangul Syllable, Last>
+D800..DB7F;N # <Non Private Use High Surrogate, First>..<Non Private Use High Surrogate, Last>
+DB80..DBFF;N # <Private Use High Surrogate, First>..<Private Use High Surrogate, Last>
+DC00..DFFF;N # <Low Surrogate, First>..<Low Surrogate, Last>
+E000..F8FF;A # <Private Use, First>..<Private Use, Last>
+F900;W # CJK COMPATIBILITY IDEOGRAPH-F900
+F901;W # CJK COMPATIBILITY IDEOGRAPH-F901
+F902;W # CJK COMPATIBILITY IDEOGRAPH-F902
+F903;W # CJK COMPATIBILITY IDEOGRAPH-F903
+F904;W # CJK COMPATIBILITY IDEOGRAPH-F904
+F905;W # CJK COMPATIBILITY IDEOGRAPH-F905
+F906;W # CJK COMPATIBILITY IDEOGRAPH-F906
+F907;W # CJK COMPATIBILITY IDEOGRAPH-F907
+F908;W # CJK COMPATIBILITY IDEOGRAPH-F908
+F909;W # CJK COMPATIBILITY IDEOGRAPH-F909
+F90A;W # CJK COMPATIBILITY IDEOGRAPH-F90A
+F90B;W # CJK COMPATIBILITY IDEOGRAPH-F90B
+F90C;W # CJK COMPATIBILITY IDEOGRAPH-F90C
+F90D;W # CJK COMPATIBILITY IDEOGRAPH-F90D
+F90E;W # CJK COMPATIBILITY IDEOGRAPH-F90E
+F90F;W # CJK COMPATIBILITY IDEOGRAPH-F90F
+F910;W # CJK COMPATIBILITY IDEOGRAPH-F910
+F911;W # CJK COMPATIBILITY IDEOGRAPH-F911
+F912;W # CJK COMPATIBILITY IDEOGRAPH-F912
+F913;W # CJK COMPATIBILITY IDEOGRAPH-F913
+F914;W # CJK COMPATIBILITY IDEOGRAPH-F914
+F915;W # CJK COMPATIBILITY IDEOGRAPH-F915
+F916;W # CJK COMPATIBILITY IDEOGRAPH-F916
+F917;W # CJK COMPATIBILITY IDEOGRAPH-F917
+F918;W # CJK COMPATIBILITY IDEOGRAPH-F918
+F919;W # CJK COMPATIBILITY IDEOGRAPH-F919
+F91A;W # CJK COMPATIBILITY IDEOGRAPH-F91A
+F91B;W # CJK COMPATIBILITY IDEOGRAPH-F91B
+F91C;W # CJK COMPATIBILITY IDEOGRAPH-F91C
+F91D;W # CJK COMPATIBILITY IDEOGRAPH-F91D
+F91E;W # CJK COMPATIBILITY IDEOGRAPH-F91E
+F91F;W # CJK COMPATIBILITY IDEOGRAPH-F91F
+F920;W # CJK COMPATIBILITY IDEOGRAPH-F920
+F921;W # CJK COMPATIBILITY IDEOGRAPH-F921
+F922;W # CJK COMPATIBILITY IDEOGRAPH-F922
+F923;W # CJK COMPATIBILITY IDEOGRAPH-F923
+F924;W # CJK COMPATIBILITY IDEOGRAPH-F924
+F925;W # CJK COMPATIBILITY IDEOGRAPH-F925
+F926;W # CJK COMPATIBILITY IDEOGRAPH-F926
+F927;W # CJK COMPATIBILITY IDEOGRAPH-F927
+F928;W # CJK COMPATIBILITY IDEOGRAPH-F928
+F929;W # CJK COMPATIBILITY IDEOGRAPH-F929
+F92A;W # CJK COMPATIBILITY IDEOGRAPH-F92A
+F92B;W # CJK COMPATIBILITY IDEOGRAPH-F92B
+F92C;W # CJK COMPATIBILITY IDEOGRAPH-F92C
+F92D;W # CJK COMPATIBILITY IDEOGRAPH-F92D
+F92E;W # CJK COMPATIBILITY IDEOGRAPH-F92E
+F92F;W # CJK COMPATIBILITY IDEOGRAPH-F92F
+F930;W # CJK COMPATIBILITY IDEOGRAPH-F930
+F931;W # CJK COMPATIBILITY IDEOGRAPH-F931
+F932;W # CJK COMPATIBILITY IDEOGRAPH-F932
+F933;W # CJK COMPATIBILITY IDEOGRAPH-F933
+F934;W # CJK COMPATIBILITY IDEOGRAPH-F934
+F935;W # CJK COMPATIBILITY IDEOGRAPH-F935
+F936;W # CJK COMPATIBILITY IDEOGRAPH-F936
+F937;W # CJK COMPATIBILITY IDEOGRAPH-F937
+F938;W # CJK COMPATIBILITY IDEOGRAPH-F938
+F939;W # CJK COMPATIBILITY IDEOGRAPH-F939
+F93A;W # CJK COMPATIBILITY IDEOGRAPH-F93A
+F93B;W # CJK COMPATIBILITY IDEOGRAPH-F93B
+F93C;W # CJK COMPATIBILITY IDEOGRAPH-F93C
+F93D;W # CJK COMPATIBILITY IDEOGRAPH-F93D
+F93E;W # CJK COMPATIBILITY IDEOGRAPH-F93E
+F93F;W # CJK COMPATIBILITY IDEOGRAPH-F93F
+F940;W # CJK COMPATIBILITY IDEOGRAPH-F940
+F941;W # CJK COMPATIBILITY IDEOGRAPH-F941
+F942;W # CJK COMPATIBILITY IDEOGRAPH-F942
+F943;W # CJK COMPATIBILITY IDEOGRAPH-F943
+F944;W # CJK COMPATIBILITY IDEOGRAPH-F944
+F945;W # CJK COMPATIBILITY IDEOGRAPH-F945
+F946;W # CJK COMPATIBILITY IDEOGRAPH-F946
+F947;W # CJK COMPATIBILITY IDEOGRAPH-F947
+F948;W # CJK COMPATIBILITY IDEOGRAPH-F948
+F949;W # CJK COMPATIBILITY IDEOGRAPH-F949
+F94A;W # CJK COMPATIBILITY IDEOGRAPH-F94A
+F94B;W # CJK COMPATIBILITY IDEOGRAPH-F94B
+F94C;W # CJK COMPATIBILITY IDEOGRAPH-F94C
+F94D;W # CJK COMPATIBILITY IDEOGRAPH-F94D
+F94E;W # CJK COMPATIBILITY IDEOGRAPH-F94E
+F94F;W # CJK COMPATIBILITY IDEOGRAPH-F94F
+F950;W # CJK COMPATIBILITY IDEOGRAPH-F950
+F951;W # CJK COMPATIBILITY IDEOGRAPH-F951
+F952;W # CJK COMPATIBILITY IDEOGRAPH-F952
+F953;W # CJK COMPATIBILITY IDEOGRAPH-F953
+F954;W # CJK COMPATIBILITY IDEOGRAPH-F954
+F955;W # CJK COMPATIBILITY IDEOGRAPH-F955
+F956;W # CJK COMPATIBILITY IDEOGRAPH-F956
+F957;W # CJK COMPATIBILITY IDEOGRAPH-F957
+F958;W # CJK COMPATIBILITY IDEOGRAPH-F958
+F959;W # CJK COMPATIBILITY IDEOGRAPH-F959
+F95A;W # CJK COMPATIBILITY IDEOGRAPH-F95A
+F95B;W # CJK COMPATIBILITY IDEOGRAPH-F95B
+F95C;W # CJK COMPATIBILITY IDEOGRAPH-F95C
+F95D;W # CJK COMPATIBILITY IDEOGRAPH-F95D
+F95E;W # CJK COMPATIBILITY IDEOGRAPH-F95E
+F95F;W # CJK COMPATIBILITY IDEOGRAPH-F95F
+F960;W # CJK COMPATIBILITY IDEOGRAPH-F960
+F961;W # CJK COMPATIBILITY IDEOGRAPH-F961
+F962;W # CJK COMPATIBILITY IDEOGRAPH-F962
+F963;W # CJK COMPATIBILITY IDEOGRAPH-F963
+F964;W # CJK COMPATIBILITY IDEOGRAPH-F964
+F965;W # CJK COMPATIBILITY IDEOGRAPH-F965
+F966;W # CJK COMPATIBILITY IDEOGRAPH-F966
+F967;W # CJK COMPATIBILITY IDEOGRAPH-F967
+F968;W # CJK COMPATIBILITY IDEOGRAPH-F968
+F969;W # CJK COMPATIBILITY IDEOGRAPH-F969
+F96A;W # CJK COMPATIBILITY IDEOGRAPH-F96A
+F96B;W # CJK COMPATIBILITY IDEOGRAPH-F96B
+F96C;W # CJK COMPATIBILITY IDEOGRAPH-F96C
+F96D;W # CJK COMPATIBILITY IDEOGRAPH-F96D
+F96E;W # CJK COMPATIBILITY IDEOGRAPH-F96E
+F96F;W # CJK COMPATIBILITY IDEOGRAPH-F96F
+F970;W # CJK COMPATIBILITY IDEOGRAPH-F970
+F971;W # CJK COMPATIBILITY IDEOGRAPH-F971
+F972;W # CJK COMPATIBILITY IDEOGRAPH-F972
+F973;W # CJK COMPATIBILITY IDEOGRAPH-F973
+F974;W # CJK COMPATIBILITY IDEOGRAPH-F974
+F975;W # CJK COMPATIBILITY IDEOGRAPH-F975
+F976;W # CJK COMPATIBILITY IDEOGRAPH-F976
+F977;W # CJK COMPATIBILITY IDEOGRAPH-F977
+F978;W # CJK COMPATIBILITY IDEOGRAPH-F978
+F979;W # CJK COMPATIBILITY IDEOGRAPH-F979
+F97A;W # CJK COMPATIBILITY IDEOGRAPH-F97A
+F97B;W # CJK COMPATIBILITY IDEOGRAPH-F97B
+F97C;W # CJK COMPATIBILITY IDEOGRAPH-F97C
+F97D;W # CJK COMPATIBILITY IDEOGRAPH-F97D
+F97E;W # CJK COMPATIBILITY IDEOGRAPH-F97E
+F97F;W # CJK COMPATIBILITY IDEOGRAPH-F97F
+F980;W # CJK COMPATIBILITY IDEOGRAPH-F980
+F981;W # CJK COMPATIBILITY IDEOGRAPH-F981
+F982;W # CJK COMPATIBILITY IDEOGRAPH-F982
+F983;W # CJK COMPATIBILITY IDEOGRAPH-F983
+F984;W # CJK COMPATIBILITY IDEOGRAPH-F984
+F985;W # CJK COMPATIBILITY IDEOGRAPH-F985
+F986;W # CJK COMPATIBILITY IDEOGRAPH-F986
+F987;W # CJK COMPATIBILITY IDEOGRAPH-F987
+F988;W # CJK COMPATIBILITY IDEOGRAPH-F988
+F989;W # CJK COMPATIBILITY IDEOGRAPH-F989
+F98A;W # CJK COMPATIBILITY IDEOGRAPH-F98A
+F98B;W # CJK COMPATIBILITY IDEOGRAPH-F98B
+F98C;W # CJK COMPATIBILITY IDEOGRAPH-F98C
+F98D;W # CJK COMPATIBILITY IDEOGRAPH-F98D
+F98E;W # CJK COMPATIBILITY IDEOGRAPH-F98E
+F98F;W # CJK COMPATIBILITY IDEOGRAPH-F98F
+F990;W # CJK COMPATIBILITY IDEOGRAPH-F990
+F991;W # CJK COMPATIBILITY IDEOGRAPH-F991
+F992;W # CJK COMPATIBILITY IDEOGRAPH-F992
+F993;W # CJK COMPATIBILITY IDEOGRAPH-F993
+F994;W # CJK COMPATIBILITY IDEOGRAPH-F994
+F995;W # CJK COMPATIBILITY IDEOGRAPH-F995
+F996;W # CJK COMPATIBILITY IDEOGRAPH-F996
+F997;W # CJK COMPATIBILITY IDEOGRAPH-F997
+F998;W # CJK COMPATIBILITY IDEOGRAPH-F998
+F999;W # CJK COMPATIBILITY IDEOGRAPH-F999
+F99A;W # CJK COMPATIBILITY IDEOGRAPH-F99A
+F99B;W # CJK COMPATIBILITY IDEOGRAPH-F99B
+F99C;W # CJK COMPATIBILITY IDEOGRAPH-F99C
+F99D;W # CJK COMPATIBILITY IDEOGRAPH-F99D
+F99E;W # CJK COMPATIBILITY IDEOGRAPH-F99E
+F99F;W # CJK COMPATIBILITY IDEOGRAPH-F99F
+F9A0;W # CJK COMPATIBILITY IDEOGRAPH-F9A0
+F9A1;W # CJK COMPATIBILITY IDEOGRAPH-F9A1
+F9A2;W # CJK COMPATIBILITY IDEOGRAPH-F9A2
+F9A3;W # CJK COMPATIBILITY IDEOGRAPH-F9A3
+F9A4;W # CJK COMPATIBILITY IDEOGRAPH-F9A4
+F9A5;W # CJK COMPATIBILITY IDEOGRAPH-F9A5
+F9A6;W # CJK COMPATIBILITY IDEOGRAPH-F9A6
+F9A7;W # CJK COMPATIBILITY IDEOGRAPH-F9A7
+F9A8;W # CJK COMPATIBILITY IDEOGRAPH-F9A8
+F9A9;W # CJK COMPATIBILITY IDEOGRAPH-F9A9
+F9AA;W # CJK COMPATIBILITY IDEOGRAPH-F9AA
+F9AB;W # CJK COMPATIBILITY IDEOGRAPH-F9AB
+F9AC;W # CJK COMPATIBILITY IDEOGRAPH-F9AC
+F9AD;W # CJK COMPATIBILITY IDEOGRAPH-F9AD
+F9AE;W # CJK COMPATIBILITY IDEOGRAPH-F9AE
+F9AF;W # CJK COMPATIBILITY IDEOGRAPH-F9AF
+F9B0;W # CJK COMPATIBILITY IDEOGRAPH-F9B0
+F9B1;W # CJK COMPATIBILITY IDEOGRAPH-F9B1
+F9B2;W # CJK COMPATIBILITY IDEOGRAPH-F9B2
+F9B3;W # CJK COMPATIBILITY IDEOGRAPH-F9B3
+F9B4;W # CJK COMPATIBILITY IDEOGRAPH-F9B4
+F9B5;W # CJK COMPATIBILITY IDEOGRAPH-F9B5
+F9B6;W # CJK COMPATIBILITY IDEOGRAPH-F9B6
+F9B7;W # CJK COMPATIBILITY IDEOGRAPH-F9B7
+F9B8;W # CJK COMPATIBILITY IDEOGRAPH-F9B8
+F9B9;W # CJK COMPATIBILITY IDEOGRAPH-F9B9
+F9BA;W # CJK COMPATIBILITY IDEOGRAPH-F9BA
+F9BB;W # CJK COMPATIBILITY IDEOGRAPH-F9BB
+F9BC;W # CJK COMPATIBILITY IDEOGRAPH-F9BC
+F9BD;W # CJK COMPATIBILITY IDEOGRAPH-F9BD
+F9BE;W # CJK COMPATIBILITY IDEOGRAPH-F9BE
+F9BF;W # CJK COMPATIBILITY IDEOGRAPH-F9BF
+F9C0;W # CJK COMPATIBILITY IDEOGRAPH-F9C0
+F9C1;W # CJK COMPATIBILITY IDEOGRAPH-F9C1
+F9C2;W # CJK COMPATIBILITY IDEOGRAPH-F9C2
+F9C3;W # CJK COMPATIBILITY IDEOGRAPH-F9C3
+F9C4;W # CJK COMPATIBILITY IDEOGRAPH-F9C4
+F9C5;W # CJK COMPATIBILITY IDEOGRAPH-F9C5
+F9C6;W # CJK COMPATIBILITY IDEOGRAPH-F9C6
+F9C7;W # CJK COMPATIBILITY IDEOGRAPH-F9C7
+F9C8;W # CJK COMPATIBILITY IDEOGRAPH-F9C8
+F9C9;W # CJK COMPATIBILITY IDEOGRAPH-F9C9
+F9CA;W # CJK COMPATIBILITY IDEOGRAPH-F9CA
+F9CB;W # CJK COMPATIBILITY IDEOGRAPH-F9CB
+F9CC;W # CJK COMPATIBILITY IDEOGRAPH-F9CC
+F9CD;W # CJK COMPATIBILITY IDEOGRAPH-F9CD
+F9CE;W # CJK COMPATIBILITY IDEOGRAPH-F9CE
+F9CF;W # CJK COMPATIBILITY IDEOGRAPH-F9CF
+F9D0;W # CJK COMPATIBILITY IDEOGRAPH-F9D0
+F9D1;W # CJK COMPATIBILITY IDEOGRAPH-F9D1
+F9D2;W # CJK COMPATIBILITY IDEOGRAPH-F9D2
+F9D3;W # CJK COMPATIBILITY IDEOGRAPH-F9D3
+F9D4;W # CJK COMPATIBILITY IDEOGRAPH-F9D4
+F9D5;W # CJK COMPATIBILITY IDEOGRAPH-F9D5
+F9D6;W # CJK COMPATIBILITY IDEOGRAPH-F9D6
+F9D7;W # CJK COMPATIBILITY IDEOGRAPH-F9D7
+F9D8;W # CJK COMPATIBILITY IDEOGRAPH-F9D8
+F9D9;W # CJK COMPATIBILITY IDEOGRAPH-F9D9
+F9DA;W # CJK COMPATIBILITY IDEOGRAPH-F9DA
+F9DB;W # CJK COMPATIBILITY IDEOGRAPH-F9DB
+F9DC;W # CJK COMPATIBILITY IDEOGRAPH-F9DC
+F9DD;W # CJK COMPATIBILITY IDEOGRAPH-F9DD
+F9DE;W # CJK COMPATIBILITY IDEOGRAPH-F9DE
+F9DF;W # CJK COMPATIBILITY IDEOGRAPH-F9DF
+F9E0;W # CJK COMPATIBILITY IDEOGRAPH-F9E0
+F9E1;W # CJK COMPATIBILITY IDEOGRAPH-F9E1
+F9E2;W # CJK COMPATIBILITY IDEOGRAPH-F9E2
+F9E3;W # CJK COMPATIBILITY IDEOGRAPH-F9E3
+F9E4;W # CJK COMPATIBILITY IDEOGRAPH-F9E4
+F9E5;W # CJK COMPATIBILITY IDEOGRAPH-F9E5
+F9E6;W # CJK COMPATIBILITY IDEOGRAPH-F9E6
+F9E7;W # CJK COMPATIBILITY IDEOGRAPH-F9E7
+F9E8;W # CJK COMPATIBILITY IDEOGRAPH-F9E8
+F9E9;W # CJK COMPATIBILITY IDEOGRAPH-F9E9
+F9EA;W # CJK COMPATIBILITY IDEOGRAPH-F9EA
+F9EB;W # CJK COMPATIBILITY IDEOGRAPH-F9EB
+F9EC;W # CJK COMPATIBILITY IDEOGRAPH-F9EC
+F9ED;W # CJK COMPATIBILITY IDEOGRAPH-F9ED
+F9EE;W # CJK COMPATIBILITY IDEOGRAPH-F9EE
+F9EF;W # CJK COMPATIBILITY IDEOGRAPH-F9EF
+F9F0;W # CJK COMPATIBILITY IDEOGRAPH-F9F0
+F9F1;W # CJK COMPATIBILITY IDEOGRAPH-F9F1
+F9F2;W # CJK COMPATIBILITY IDEOGRAPH-F9F2
+F9F3;W # CJK COMPATIBILITY IDEOGRAPH-F9F3
+F9F4;W # CJK COMPATIBILITY IDEOGRAPH-F9F4
+F9F5;W # CJK COMPATIBILITY IDEOGRAPH-F9F5
+F9F6;W # CJK COMPATIBILITY IDEOGRAPH-F9F6
+F9F7;W # CJK COMPATIBILITY IDEOGRAPH-F9F7
+F9F8;W # CJK COMPATIBILITY IDEOGRAPH-F9F8
+F9F9;W # CJK COMPATIBILITY IDEOGRAPH-F9F9
+F9FA;W # CJK COMPATIBILITY IDEOGRAPH-F9FA
+F9FB;W # CJK COMPATIBILITY IDEOGRAPH-F9FB
+F9FC;W # CJK COMPATIBILITY IDEOGRAPH-F9FC
+F9FD;W # CJK COMPATIBILITY IDEOGRAPH-F9FD
+F9FE;W # CJK COMPATIBILITY IDEOGRAPH-F9FE
+F9FF;W # CJK COMPATIBILITY IDEOGRAPH-F9FF
+FA00;W # CJK COMPATIBILITY IDEOGRAPH-FA00
+FA01;W # CJK COMPATIBILITY IDEOGRAPH-FA01
+FA02;W # CJK COMPATIBILITY IDEOGRAPH-FA02
+FA03;W # CJK COMPATIBILITY IDEOGRAPH-FA03
+FA04;W # CJK COMPATIBILITY IDEOGRAPH-FA04
+FA05;W # CJK COMPATIBILITY IDEOGRAPH-FA05
+FA06;W # CJK COMPATIBILITY IDEOGRAPH-FA06
+FA07;W # CJK COMPATIBILITY IDEOGRAPH-FA07
+FA08;W # CJK COMPATIBILITY IDEOGRAPH-FA08
+FA09;W # CJK COMPATIBILITY IDEOGRAPH-FA09
+FA0A;W # CJK COMPATIBILITY IDEOGRAPH-FA0A
+FA0B;W # CJK COMPATIBILITY IDEOGRAPH-FA0B
+FA0C;W # CJK COMPATIBILITY IDEOGRAPH-FA0C
+FA0D;W # CJK COMPATIBILITY IDEOGRAPH-FA0D
+FA0E;W # CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F;W # CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA10;W # CJK COMPATIBILITY IDEOGRAPH-FA10
+FA11;W # CJK COMPATIBILITY IDEOGRAPH-FA11
+FA12;W # CJK COMPATIBILITY IDEOGRAPH-FA12
+FA13;W # CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14;W # CJK COMPATIBILITY IDEOGRAPH-FA14
+FA15;W # CJK COMPATIBILITY IDEOGRAPH-FA15
+FA16;W # CJK COMPATIBILITY IDEOGRAPH-FA16
+FA17;W # CJK COMPATIBILITY IDEOGRAPH-FA17
+FA18;W # CJK COMPATIBILITY IDEOGRAPH-FA18
+FA19;W # CJK COMPATIBILITY IDEOGRAPH-FA19
+FA1A;W # CJK COMPATIBILITY IDEOGRAPH-FA1A
+FA1B;W # CJK COMPATIBILITY IDEOGRAPH-FA1B
+FA1C;W # CJK COMPATIBILITY IDEOGRAPH-FA1C
+FA1D;W # CJK COMPATIBILITY IDEOGRAPH-FA1D
+FA1E;W # CJK COMPATIBILITY IDEOGRAPH-FA1E
+FA1F;W # CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA20;W # CJK COMPATIBILITY IDEOGRAPH-FA20
+FA21;W # CJK COMPATIBILITY IDEOGRAPH-FA21
+FA22;W # CJK COMPATIBILITY IDEOGRAPH-FA22
+FA23;W # CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24;W # CJK COMPATIBILITY IDEOGRAPH-FA24
+FA25;W # CJK COMPATIBILITY IDEOGRAPH-FA25
+FA26;W # CJK COMPATIBILITY IDEOGRAPH-FA26
+FA27;W # CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28;W # CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29;W # CJK COMPATIBILITY IDEOGRAPH-FA29
+FA2A;W # CJK COMPATIBILITY IDEOGRAPH-FA2A
+FA2B;W # CJK COMPATIBILITY IDEOGRAPH-FA2B
+FA2C;W # CJK COMPATIBILITY IDEOGRAPH-FA2C
+FA2D;W # CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30;W # CJK COMPATIBILITY IDEOGRAPH-FA30
+FA31;W # CJK COMPATIBILITY IDEOGRAPH-FA31
+FA32;W # CJK COMPATIBILITY IDEOGRAPH-FA32
+FA33;W # CJK COMPATIBILITY IDEOGRAPH-FA33
+FA34;W # CJK COMPATIBILITY IDEOGRAPH-FA34
+FA35;W # CJK COMPATIBILITY IDEOGRAPH-FA35
+FA36;W # CJK COMPATIBILITY IDEOGRAPH-FA36
+FA37;W # CJK COMPATIBILITY IDEOGRAPH-FA37
+FA38;W # CJK COMPATIBILITY IDEOGRAPH-FA38
+FA39;W # CJK COMPATIBILITY IDEOGRAPH-FA39
+FA3A;W # CJK COMPATIBILITY IDEOGRAPH-FA3A
+FA3B;W # CJK COMPATIBILITY IDEOGRAPH-FA3B
+FA3C;W # CJK COMPATIBILITY IDEOGRAPH-FA3C
+FA3D;W # CJK COMPATIBILITY IDEOGRAPH-FA3D
+FA3E;W # CJK COMPATIBILITY IDEOGRAPH-FA3E
+FA3F;W # CJK COMPATIBILITY IDEOGRAPH-FA3F
+FA40;W # CJK COMPATIBILITY IDEOGRAPH-FA40
+FA41;W # CJK COMPATIBILITY IDEOGRAPH-FA41
+FA42;W # CJK COMPATIBILITY IDEOGRAPH-FA42
+FA43;W # CJK COMPATIBILITY IDEOGRAPH-FA43
+FA44;W # CJK COMPATIBILITY IDEOGRAPH-FA44
+FA45;W # CJK COMPATIBILITY IDEOGRAPH-FA45
+FA46;W # CJK COMPATIBILITY IDEOGRAPH-FA46
+FA47;W # CJK COMPATIBILITY IDEOGRAPH-FA47
+FA48;W # CJK COMPATIBILITY IDEOGRAPH-FA48
+FA49;W # CJK COMPATIBILITY IDEOGRAPH-FA49
+FA4A;W # CJK COMPATIBILITY IDEOGRAPH-FA4A
+FA4B;W # CJK COMPATIBILITY IDEOGRAPH-FA4B
+FA4C;W # CJK COMPATIBILITY IDEOGRAPH-FA4C
+FA4D;W # CJK COMPATIBILITY IDEOGRAPH-FA4D
+FA4E;W # CJK COMPATIBILITY IDEOGRAPH-FA4E
+FA4F;W # CJK COMPATIBILITY IDEOGRAPH-FA4F
+FA50;W # CJK COMPATIBILITY IDEOGRAPH-FA50
+FA51;W # CJK COMPATIBILITY IDEOGRAPH-FA51
+FA52;W # CJK COMPATIBILITY IDEOGRAPH-FA52
+FA53;W # CJK COMPATIBILITY IDEOGRAPH-FA53
+FA54;W # CJK COMPATIBILITY IDEOGRAPH-FA54
+FA55;W # CJK COMPATIBILITY IDEOGRAPH-FA55
+FA56;W # CJK COMPATIBILITY IDEOGRAPH-FA56
+FA57;W # CJK COMPATIBILITY IDEOGRAPH-FA57
+FA58;W # CJK COMPATIBILITY IDEOGRAPH-FA58
+FA59;W # CJK COMPATIBILITY IDEOGRAPH-FA59
+FA5A;W # CJK COMPATIBILITY IDEOGRAPH-FA5A
+FA5B;W # CJK COMPATIBILITY IDEOGRAPH-FA5B
+FA5C;W # CJK COMPATIBILITY IDEOGRAPH-FA5C
+FA5D;W # CJK COMPATIBILITY IDEOGRAPH-FA5D
+FA5E;W # CJK COMPATIBILITY IDEOGRAPH-FA5E
+FA5F;W # CJK COMPATIBILITY IDEOGRAPH-FA5F
+FA60;W # CJK COMPATIBILITY IDEOGRAPH-FA60
+FA61;W # CJK COMPATIBILITY IDEOGRAPH-FA61
+FA62;W # CJK COMPATIBILITY IDEOGRAPH-FA62
+FA63;W # CJK COMPATIBILITY IDEOGRAPH-FA63
+FA64;W # CJK COMPATIBILITY IDEOGRAPH-FA64
+FA65;W # CJK COMPATIBILITY IDEOGRAPH-FA65
+FA66;W # CJK COMPATIBILITY IDEOGRAPH-FA66
+FA67;W # CJK COMPATIBILITY IDEOGRAPH-FA67
+FA68;W # CJK COMPATIBILITY IDEOGRAPH-FA68
+FA69;W # CJK COMPATIBILITY IDEOGRAPH-FA69
+FA6A;W # CJK COMPATIBILITY IDEOGRAPH-FA6A
+FA70;W # CJK COMPATIBILITY IDEOGRAPH-FA70
+FA71;W # CJK COMPATIBILITY IDEOGRAPH-FA71
+FA72;W # CJK COMPATIBILITY IDEOGRAPH-FA72
+FA73;W # CJK COMPATIBILITY IDEOGRAPH-FA73
+FA74;W # CJK COMPATIBILITY IDEOGRAPH-FA74
+FA75;W # CJK COMPATIBILITY IDEOGRAPH-FA75
+FA76;W # CJK COMPATIBILITY IDEOGRAPH-FA76
+FA77;W # CJK COMPATIBILITY IDEOGRAPH-FA77
+FA78;W # CJK COMPATIBILITY IDEOGRAPH-FA78
+FA79;W # CJK COMPATIBILITY IDEOGRAPH-FA79
+FA7A;W # CJK COMPATIBILITY IDEOGRAPH-FA7A
+FA7B;W # CJK COMPATIBILITY IDEOGRAPH-FA7B
+FA7C;W # CJK COMPATIBILITY IDEOGRAPH-FA7C
+FA7D;W # CJK COMPATIBILITY IDEOGRAPH-FA7D
+FA7E;W # CJK COMPATIBILITY IDEOGRAPH-FA7E
+FA7F;W # CJK COMPATIBILITY IDEOGRAPH-FA7F
+FA80;W # CJK COMPATIBILITY IDEOGRAPH-FA80
+FA81;W # CJK COMPATIBILITY IDEOGRAPH-FA81
+FA82;W # CJK COMPATIBILITY IDEOGRAPH-FA82
+FA83;W # CJK COMPATIBILITY IDEOGRAPH-FA83
+FA84;W # CJK COMPATIBILITY IDEOGRAPH-FA84
+FA85;W # CJK COMPATIBILITY IDEOGRAPH-FA85
+FA86;W # CJK COMPATIBILITY IDEOGRAPH-FA86
+FA87;W # CJK COMPATIBILITY IDEOGRAPH-FA87
+FA88;W # CJK COMPATIBILITY IDEOGRAPH-FA88
+FA89;W # CJK COMPATIBILITY IDEOGRAPH-FA89
+FA8A;W # CJK COMPATIBILITY IDEOGRAPH-FA8A
+FA8B;W # CJK COMPATIBILITY IDEOGRAPH-FA8B
+FA8C;W # CJK COMPATIBILITY IDEOGRAPH-FA8C
+FA8D;W # CJK COMPATIBILITY IDEOGRAPH-FA8D
+FA8E;W # CJK COMPATIBILITY IDEOGRAPH-FA8E
+FA8F;W # CJK COMPATIBILITY IDEOGRAPH-FA8F
+FA90;W # CJK COMPATIBILITY IDEOGRAPH-FA90
+FA91;W # CJK COMPATIBILITY IDEOGRAPH-FA91
+FA92;W # CJK COMPATIBILITY IDEOGRAPH-FA92
+FA93;W # CJK COMPATIBILITY IDEOGRAPH-FA93
+FA94;W # CJK COMPATIBILITY IDEOGRAPH-FA94
+FA95;W # CJK COMPATIBILITY IDEOGRAPH-FA95
+FA96;W # CJK COMPATIBILITY IDEOGRAPH-FA96
+FA97;W # CJK COMPATIBILITY IDEOGRAPH-FA97
+FA98;W # CJK COMPATIBILITY IDEOGRAPH-FA98
+FA99;W # CJK COMPATIBILITY IDEOGRAPH-FA99
+FA9A;W # CJK COMPATIBILITY IDEOGRAPH-FA9A
+FA9B;W # CJK COMPATIBILITY IDEOGRAPH-FA9B
+FA9C;W # CJK COMPATIBILITY IDEOGRAPH-FA9C
+FA9D;W # CJK COMPATIBILITY IDEOGRAPH-FA9D
+FA9E;W # CJK COMPATIBILITY IDEOGRAPH-FA9E
+FA9F;W # CJK COMPATIBILITY IDEOGRAPH-FA9F
+FAA0;W # CJK COMPATIBILITY IDEOGRAPH-FAA0
+FAA1;W # CJK COMPATIBILITY IDEOGRAPH-FAA1
+FAA2;W # CJK COMPATIBILITY IDEOGRAPH-FAA2
+FAA3;W # CJK COMPATIBILITY IDEOGRAPH-FAA3
+FAA4;W # CJK COMPATIBILITY IDEOGRAPH-FAA4
+FAA5;W # CJK COMPATIBILITY IDEOGRAPH-FAA5
+FAA6;W # CJK COMPATIBILITY IDEOGRAPH-FAA6
+FAA7;W # CJK COMPATIBILITY IDEOGRAPH-FAA7
+FAA8;W # CJK COMPATIBILITY IDEOGRAPH-FAA8
+FAA9;W # CJK COMPATIBILITY IDEOGRAPH-FAA9
+FAAA;W # CJK COMPATIBILITY IDEOGRAPH-FAAA
+FAAB;W # CJK COMPATIBILITY IDEOGRAPH-FAAB
+FAAC;W # CJK COMPATIBILITY IDEOGRAPH-FAAC
+FAAD;W # CJK COMPATIBILITY IDEOGRAPH-FAAD
+FAAE;W # CJK COMPATIBILITY IDEOGRAPH-FAAE
+FAAF;W # CJK COMPATIBILITY IDEOGRAPH-FAAF
+FAB0;W # CJK COMPATIBILITY IDEOGRAPH-FAB0
+FAB1;W # CJK COMPATIBILITY IDEOGRAPH-FAB1
+FAB2;W # CJK COMPATIBILITY IDEOGRAPH-FAB2
+FAB3;W # CJK COMPATIBILITY IDEOGRAPH-FAB3
+FAB4;W # CJK COMPATIBILITY IDEOGRAPH-FAB4
+FAB5;W # CJK COMPATIBILITY IDEOGRAPH-FAB5
+FAB6;W # CJK COMPATIBILITY IDEOGRAPH-FAB6
+FAB7;W # CJK COMPATIBILITY IDEOGRAPH-FAB7
+FAB8;W # CJK COMPATIBILITY IDEOGRAPH-FAB8
+FAB9;W # CJK COMPATIBILITY IDEOGRAPH-FAB9
+FABA;W # CJK COMPATIBILITY IDEOGRAPH-FABA
+FABB;W # CJK COMPATIBILITY IDEOGRAPH-FABB
+FABC;W # CJK COMPATIBILITY IDEOGRAPH-FABC
+FABD;W # CJK COMPATIBILITY IDEOGRAPH-FABD
+FABE;W # CJK COMPATIBILITY IDEOGRAPH-FABE
+FABF;W # CJK COMPATIBILITY IDEOGRAPH-FABF
+FAC0;W # CJK COMPATIBILITY IDEOGRAPH-FAC0
+FAC1;W # CJK COMPATIBILITY IDEOGRAPH-FAC1
+FAC2;W # CJK COMPATIBILITY IDEOGRAPH-FAC2
+FAC3;W # CJK COMPATIBILITY IDEOGRAPH-FAC3
+FAC4;W # CJK COMPATIBILITY IDEOGRAPH-FAC4
+FAC5;W # CJK COMPATIBILITY IDEOGRAPH-FAC5
+FAC6;W # CJK COMPATIBILITY IDEOGRAPH-FAC6
+FAC7;W # CJK COMPATIBILITY IDEOGRAPH-FAC7
+FAC8;W # CJK COMPATIBILITY IDEOGRAPH-FAC8
+FAC9;W # CJK COMPATIBILITY IDEOGRAPH-FAC9
+FACA;W # CJK COMPATIBILITY IDEOGRAPH-FACA
+FACB;W # CJK COMPATIBILITY IDEOGRAPH-FACB
+FACC;W # CJK COMPATIBILITY IDEOGRAPH-FACC
+FACD;W # CJK COMPATIBILITY IDEOGRAPH-FACD
+FACE;W # CJK COMPATIBILITY IDEOGRAPH-FACE
+FACF;W # CJK COMPATIBILITY IDEOGRAPH-FACF
+FAD0;W # CJK COMPATIBILITY IDEOGRAPH-FAD0
+FAD1;W # CJK COMPATIBILITY IDEOGRAPH-FAD1
+FAD2;W # CJK COMPATIBILITY IDEOGRAPH-FAD2
+FAD3;W # CJK COMPATIBILITY IDEOGRAPH-FAD3
+FAD4;W # CJK COMPATIBILITY IDEOGRAPH-FAD4
+FAD5;W # CJK COMPATIBILITY IDEOGRAPH-FAD5
+FAD6;W # CJK COMPATIBILITY IDEOGRAPH-FAD6
+FAD7;W # CJK COMPATIBILITY IDEOGRAPH-FAD7
+FAD8;W # CJK COMPATIBILITY IDEOGRAPH-FAD8
+FAD9;W # CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00;N # LATIN SMALL LIGATURE FF
+FB01;N # LATIN SMALL LIGATURE FI
+FB02;N # LATIN SMALL LIGATURE FL
+FB03;N # LATIN SMALL LIGATURE FFI
+FB04;N # LATIN SMALL LIGATURE FFL
+FB05;N # LATIN SMALL LIGATURE LONG S T
+FB06;N # LATIN SMALL LIGATURE ST
+FB13;N # ARMENIAN SMALL LIGATURE MEN NOW
+FB14;N # ARMENIAN SMALL LIGATURE MEN ECH
+FB15;N # ARMENIAN SMALL LIGATURE MEN INI
+FB16;N # ARMENIAN SMALL LIGATURE VEW NOW
+FB17;N # ARMENIAN SMALL LIGATURE MEN XEH
+FB1D;N # HEBREW LETTER YOD WITH HIRIQ
+FB1E;N # HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F;N # HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB20;N # HEBREW LETTER ALTERNATIVE AYIN
+FB21;N # HEBREW LETTER WIDE ALEF
+FB22;N # HEBREW LETTER WIDE DALET
+FB23;N # HEBREW LETTER WIDE HE
+FB24;N # HEBREW LETTER WIDE KAF
+FB25;N # HEBREW LETTER WIDE LAMED
+FB26;N # HEBREW LETTER WIDE FINAL MEM
+FB27;N # HEBREW LETTER WIDE RESH
+FB28;N # HEBREW LETTER WIDE TAV
+FB29;N # HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A;N # HEBREW LETTER SHIN WITH SHIN DOT
+FB2B;N # HEBREW LETTER SHIN WITH SIN DOT
+FB2C;N # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D;N # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E;N # HEBREW LETTER ALEF WITH PATAH
+FB2F;N # HEBREW LETTER ALEF WITH QAMATS
+FB30;N # HEBREW LETTER ALEF WITH MAPIQ
+FB31;N # HEBREW LETTER BET WITH DAGESH
+FB32;N # HEBREW LETTER GIMEL WITH DAGESH
+FB33;N # HEBREW LETTER DALET WITH DAGESH
+FB34;N # HEBREW LETTER HE WITH MAPIQ
+FB35;N # HEBREW LETTER VAV WITH DAGESH
+FB36;N # HEBREW LETTER ZAYIN WITH DAGESH
+FB38;N # HEBREW LETTER TET WITH DAGESH
+FB39;N # HEBREW LETTER YOD WITH DAGESH
+FB3A;N # HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B;N # HEBREW LETTER KAF WITH DAGESH
+FB3C;N # HEBREW LETTER LAMED WITH DAGESH
+FB3E;N # HEBREW LETTER MEM WITH DAGESH
+FB40;N # HEBREW LETTER NUN WITH DAGESH
+FB41;N # HEBREW LETTER SAMEKH WITH DAGESH
+FB43;N # HEBREW LETTER FINAL PE WITH DAGESH
+FB44;N # HEBREW LETTER PE WITH DAGESH
+FB46;N # HEBREW LETTER TSADI WITH DAGESH
+FB47;N # HEBREW LETTER QOF WITH DAGESH
+FB48;N # HEBREW LETTER RESH WITH DAGESH
+FB49;N # HEBREW LETTER SHIN WITH DAGESH
+FB4A;N # HEBREW LETTER TAV WITH DAGESH
+FB4B;N # HEBREW LETTER VAV WITH HOLAM
+FB4C;N # HEBREW LETTER BET WITH RAFE
+FB4D;N # HEBREW LETTER KAF WITH RAFE
+FB4E;N # HEBREW LETTER PE WITH RAFE
+FB4F;N # HEBREW LIGATURE ALEF LAMED
+FB50;N # ARABIC LETTER ALEF WASLA ISOLATED FORM
+FB51;N # ARABIC LETTER ALEF WASLA FINAL FORM
+FB52;N # ARABIC LETTER BEEH ISOLATED FORM
+FB53;N # ARABIC LETTER BEEH FINAL FORM
+FB54;N # ARABIC LETTER BEEH INITIAL FORM
+FB55;N # ARABIC LETTER BEEH MEDIAL FORM
+FB56;N # ARABIC LETTER PEH ISOLATED FORM
+FB57;N # ARABIC LETTER PEH FINAL FORM
+FB58;N # ARABIC LETTER PEH INITIAL FORM
+FB59;N # ARABIC LETTER PEH MEDIAL FORM
+FB5A;N # ARABIC LETTER BEHEH ISOLATED FORM
+FB5B;N # ARABIC LETTER BEHEH FINAL FORM
+FB5C;N # ARABIC LETTER BEHEH INITIAL FORM
+FB5D;N # ARABIC LETTER BEHEH MEDIAL FORM
+FB5E;N # ARABIC LETTER TTEHEH ISOLATED FORM
+FB5F;N # ARABIC LETTER TTEHEH FINAL FORM
+FB60;N # ARABIC LETTER TTEHEH INITIAL FORM
+FB61;N # ARABIC LETTER TTEHEH MEDIAL FORM
+FB62;N # ARABIC LETTER TEHEH ISOLATED FORM
+FB63;N # ARABIC LETTER TEHEH FINAL FORM
+FB64;N # ARABIC LETTER TEHEH INITIAL FORM
+FB65;N # ARABIC LETTER TEHEH MEDIAL FORM
+FB66;N # ARABIC LETTER TTEH ISOLATED FORM
+FB67;N # ARABIC LETTER TTEH FINAL FORM
+FB68;N # ARABIC LETTER TTEH INITIAL FORM
+FB69;N # ARABIC LETTER TTEH MEDIAL FORM
+FB6A;N # ARABIC LETTER VEH ISOLATED FORM
+FB6B;N # ARABIC LETTER VEH FINAL FORM
+FB6C;N # ARABIC LETTER VEH INITIAL FORM
+FB6D;N # ARABIC LETTER VEH MEDIAL FORM
+FB6E;N # ARABIC LETTER PEHEH ISOLATED FORM
+FB6F;N # ARABIC LETTER PEHEH FINAL FORM
+FB70;N # ARABIC LETTER PEHEH INITIAL FORM
+FB71;N # ARABIC LETTER PEHEH MEDIAL FORM
+FB72;N # ARABIC LETTER DYEH ISOLATED FORM
+FB73;N # ARABIC LETTER DYEH FINAL FORM
+FB74;N # ARABIC LETTER DYEH INITIAL FORM
+FB75;N # ARABIC LETTER DYEH MEDIAL FORM
+FB76;N # ARABIC LETTER NYEH ISOLATED FORM
+FB77;N # ARABIC LETTER NYEH FINAL FORM
+FB78;N # ARABIC LETTER NYEH INITIAL FORM
+FB79;N # ARABIC LETTER NYEH MEDIAL FORM
+FB7A;N # ARABIC LETTER TCHEH ISOLATED FORM
+FB7B;N # ARABIC LETTER TCHEH FINAL FORM
+FB7C;N # ARABIC LETTER TCHEH INITIAL FORM
+FB7D;N # ARABIC LETTER TCHEH MEDIAL FORM
+FB7E;N # ARABIC LETTER TCHEHEH ISOLATED FORM
+FB7F;N # ARABIC LETTER TCHEHEH FINAL FORM
+FB80;N # ARABIC LETTER TCHEHEH INITIAL FORM
+FB81;N # ARABIC LETTER TCHEHEH MEDIAL FORM
+FB82;N # ARABIC LETTER DDAHAL ISOLATED FORM
+FB83;N # ARABIC LETTER DDAHAL FINAL FORM
+FB84;N # ARABIC LETTER DAHAL ISOLATED FORM
+FB85;N # ARABIC LETTER DAHAL FINAL FORM
+FB86;N # ARABIC LETTER DUL ISOLATED FORM
+FB87;N # ARABIC LETTER DUL FINAL FORM
+FB88;N # ARABIC LETTER DDAL ISOLATED FORM
+FB89;N # ARABIC LETTER DDAL FINAL FORM
+FB8A;N # ARABIC LETTER JEH ISOLATED FORM
+FB8B;N # ARABIC LETTER JEH FINAL FORM
+FB8C;N # ARABIC LETTER RREH ISOLATED FORM
+FB8D;N # ARABIC LETTER RREH FINAL FORM
+FB8E;N # ARABIC LETTER KEHEH ISOLATED FORM
+FB8F;N # ARABIC LETTER KEHEH FINAL FORM
+FB90;N # ARABIC LETTER KEHEH INITIAL FORM
+FB91;N # ARABIC LETTER KEHEH MEDIAL FORM
+FB92;N # ARABIC LETTER GAF ISOLATED FORM
+FB93;N # ARABIC LETTER GAF FINAL FORM
+FB94;N # ARABIC LETTER GAF INITIAL FORM
+FB95;N # ARABIC LETTER GAF MEDIAL FORM
+FB96;N # ARABIC LETTER GUEH ISOLATED FORM
+FB97;N # ARABIC LETTER GUEH FINAL FORM
+FB98;N # ARABIC LETTER GUEH INITIAL FORM
+FB99;N # ARABIC LETTER GUEH MEDIAL FORM
+FB9A;N # ARABIC LETTER NGOEH ISOLATED FORM
+FB9B;N # ARABIC LETTER NGOEH FINAL FORM
+FB9C;N # ARABIC LETTER NGOEH INITIAL FORM
+FB9D;N # ARABIC LETTER NGOEH MEDIAL FORM
+FB9E;N # ARABIC LETTER NOON GHUNNA ISOLATED FORM
+FB9F;N # ARABIC LETTER NOON GHUNNA FINAL FORM
+FBA0;N # ARABIC LETTER RNOON ISOLATED FORM
+FBA1;N # ARABIC LETTER RNOON FINAL FORM
+FBA2;N # ARABIC LETTER RNOON INITIAL FORM
+FBA3;N # ARABIC LETTER RNOON MEDIAL FORM
+FBA4;N # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+FBA5;N # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+FBA6;N # ARABIC LETTER HEH GOAL ISOLATED FORM
+FBA7;N # ARABIC LETTER HEH GOAL FINAL FORM
+FBA8;N # ARABIC LETTER HEH GOAL INITIAL FORM
+FBA9;N # ARABIC LETTER HEH GOAL MEDIAL FORM
+FBAA;N # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+FBAB;N # ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+FBAC;N # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+FBAD;N # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+FBAE;N # ARABIC LETTER YEH BARREE ISOLATED FORM
+FBAF;N # ARABIC LETTER YEH BARREE FINAL FORM
+FBB0;N # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+FBB1;N # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3;N # ARABIC LETTER NG ISOLATED FORM
+FBD4;N # ARABIC LETTER NG FINAL FORM
+FBD5;N # ARABIC LETTER NG INITIAL FORM
+FBD6;N # ARABIC LETTER NG MEDIAL FORM
+FBD7;N # ARABIC LETTER U ISOLATED FORM
+FBD8;N # ARABIC LETTER U FINAL FORM
+FBD9;N # ARABIC LETTER OE ISOLATED FORM
+FBDA;N # ARABIC LETTER OE FINAL FORM
+FBDB;N # ARABIC LETTER YU ISOLATED FORM
+FBDC;N # ARABIC LETTER YU FINAL FORM
+FBDD;N # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+FBDE;N # ARABIC LETTER VE ISOLATED FORM
+FBDF;N # ARABIC LETTER VE FINAL FORM
+FBE0;N # ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+FBE1;N # ARABIC LETTER KIRGHIZ OE FINAL FORM
+FBE2;N # ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+FBE3;N # ARABIC LETTER KIRGHIZ YU FINAL FORM
+FBE4;N # ARABIC LETTER E ISOLATED FORM
+FBE5;N # ARABIC LETTER E FINAL FORM
+FBE6;N # ARABIC LETTER E INITIAL FORM
+FBE7;N # ARABIC LETTER E MEDIAL FORM
+FBE8;N # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+FBE9;N # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+FBEA;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+FBEB;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+FBEC;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+FBED;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+FBEE;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+FBEF;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+FBF0;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+FBF1;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+FBF2;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+FBF3;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+FBF4;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+FBF5;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+FBF6;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+FBF7;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+FBF8;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+FBF9;N # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FBFA;N # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FBFB;N # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+FBFC;N # ARABIC LETTER FARSI YEH ISOLATED FORM
+FBFD;N # ARABIC LETTER FARSI YEH FINAL FORM
+FBFE;N # ARABIC LETTER FARSI YEH INITIAL FORM
+FBFF;N # ARABIC LETTER FARSI YEH MEDIAL FORM
+FC00;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+FC01;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+FC02;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+FC03;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FC04;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+FC05;N # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+FC06;N # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+FC07;N # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+FC08;N # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+FC09;N # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+FC0A;N # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+FC0B;N # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+FC0C;N # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+FC0D;N # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+FC0E;N # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+FC0F;N # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+FC10;N # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+FC11;N # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+FC12;N # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+FC13;N # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+FC14;N # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+FC15;N # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+FC16;N # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+FC17;N # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+FC18;N # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+FC19;N # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+FC1A;N # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+FC1B;N # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+FC1C;N # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+FC1D;N # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+FC1E;N # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+FC1F;N # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+FC20;N # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+FC21;N # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+FC22;N # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+FC23;N # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+FC24;N # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+FC25;N # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+FC26;N # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+FC27;N # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+FC28;N # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+FC29;N # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+FC2A;N # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+FC2B;N # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+FC2C;N # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+FC2D;N # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+FC2E;N # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+FC2F;N # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+FC30;N # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+FC31;N # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+FC32;N # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+FC33;N # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+FC34;N # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+FC35;N # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+FC36;N # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+FC37;N # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+FC38;N # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+FC39;N # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+FC3A;N # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+FC3B;N # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+FC3C;N # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+FC3D;N # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+FC3E;N # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+FC3F;N # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+FC40;N # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+FC41;N # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+FC42;N # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+FC43;N # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+FC44;N # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+FC45;N # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+FC46;N # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+FC47;N # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+FC48;N # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+FC49;N # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+FC4A;N # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+FC4B;N # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+FC4C;N # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+FC4D;N # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+FC4E;N # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+FC4F;N # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+FC50;N # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+FC51;N # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+FC52;N # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+FC53;N # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+FC54;N # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+FC55;N # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+FC56;N # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+FC57;N # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+FC58;N # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+FC59;N # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+FC5A;N # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+FC5B;N # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5C;N # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5D;N # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5E;N # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+FC5F;N # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+FC60;N # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+FC61;N # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+FC62;N # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+FC63;N # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC64;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+FC65;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+FC66;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+FC67;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+FC68;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FC69;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+FC6A;N # ARABIC LIGATURE BEH WITH REH FINAL FORM
+FC6B;N # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+FC6C;N # ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+FC6D;N # ARABIC LIGATURE BEH WITH NOON FINAL FORM
+FC6E;N # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+FC6F;N # ARABIC LIGATURE BEH WITH YEH FINAL FORM
+FC70;N # ARABIC LIGATURE TEH WITH REH FINAL FORM
+FC71;N # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+FC72;N # ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+FC73;N # ARABIC LIGATURE TEH WITH NOON FINAL FORM
+FC74;N # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+FC75;N # ARABIC LIGATURE TEH WITH YEH FINAL FORM
+FC76;N # ARABIC LIGATURE THEH WITH REH FINAL FORM
+FC77;N # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+FC78;N # ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+FC79;N # ARABIC LIGATURE THEH WITH NOON FINAL FORM
+FC7A;N # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+FC7B;N # ARABIC LIGATURE THEH WITH YEH FINAL FORM
+FC7C;N # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+FC7D;N # ARABIC LIGATURE FEH WITH YEH FINAL FORM
+FC7E;N # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+FC7F;N # ARABIC LIGATURE QAF WITH YEH FINAL FORM
+FC80;N # ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+FC81;N # ARABIC LIGATURE KAF WITH LAM FINAL FORM
+FC82;N # ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+FC83;N # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+FC84;N # ARABIC LIGATURE KAF WITH YEH FINAL FORM
+FC85;N # ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+FC86;N # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+FC87;N # ARABIC LIGATURE LAM WITH YEH FINAL FORM
+FC88;N # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+FC89;N # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+FC8A;N # ARABIC LIGATURE NOON WITH REH FINAL FORM
+FC8B;N # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+FC8C;N # ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+FC8D;N # ARABIC LIGATURE NOON WITH NOON FINAL FORM
+FC8E;N # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+FC8F;N # ARABIC LIGATURE NOON WITH YEH FINAL FORM
+FC90;N # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+FC91;N # ARABIC LIGATURE YEH WITH REH FINAL FORM
+FC92;N # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+FC93;N # ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+FC94;N # ARABIC LIGATURE YEH WITH NOON FINAL FORM
+FC95;N # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+FC96;N # ARABIC LIGATURE YEH WITH YEH FINAL FORM
+FC97;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+FC98;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+FC99;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+FC9A;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+FC9B;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+FC9C;N # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+FC9D;N # ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+FC9E;N # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+FC9F;N # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+FCA0;N # ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+FCA1;N # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+FCA2;N # ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+FCA3;N # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+FCA4;N # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+FCA5;N # ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+FCA6;N # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+FCA7;N # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+FCA8;N # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+FCA9;N # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+FCAA;N # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+FCAB;N # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+FCAC;N # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+FCAD;N # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+FCAE;N # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+FCAF;N # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+FCB0;N # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+FCB1;N # ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+FCB2;N # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+FCB3;N # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+FCB4;N # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+FCB5;N # ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+FCB6;N # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+FCB7;N # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+FCB8;N # ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+FCB9;N # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+FCBA;N # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+FCBB;N # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+FCBC;N # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+FCBD;N # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+FCBE;N # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+FCBF;N # ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+FCC0;N # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+FCC1;N # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+FCC2;N # ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+FCC3;N # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+FCC4;N # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+FCC5;N # ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+FCC6;N # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+FCC7;N # ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+FCC8;N # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+FCC9;N # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+FCCA;N # ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+FCCB;N # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+FCCC;N # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+FCCD;N # ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+FCCE;N # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+FCCF;N # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+FCD0;N # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+FCD1;N # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+FCD2;N # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+FCD3;N # ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+FCD4;N # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+FCD5;N # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+FCD6;N # ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+FCD7;N # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+FCD8;N # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+FCD9;N # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+FCDA;N # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+FCDB;N # ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+FCDC;N # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+FCDD;N # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+FCDE;N # ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+FCDF;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+FCE0;N # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+FCE1;N # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+FCE2;N # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+FCE3;N # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+FCE4;N # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+FCE5;N # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+FCE6;N # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+FCE7;N # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+FCE8;N # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+FCE9;N # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+FCEA;N # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+FCEB;N # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+FCEC;N # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+FCED;N # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+FCEE;N # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+FCEF;N # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+FCF0;N # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+FCF1;N # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+FCF2;N # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+FCF3;N # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+FCF4;N # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+FCF5;N # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+FCF6;N # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+FCF7;N # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+FCF8;N # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+FCF9;N # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+FCFA;N # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+FCFB;N # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFC;N # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+FCFD;N # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFE;N # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+FCFF;N # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+FD00;N # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+FD01;N # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+FD02;N # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+FD03;N # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+FD04;N # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+FD05;N # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+FD06;N # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+FD07;N # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+FD08;N # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+FD09;N # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+FD0A;N # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+FD0B;N # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+FD0C;N # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+FD0D;N # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+FD0E;N # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+FD0F;N # ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+FD10;N # ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+FD11;N # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+FD12;N # ARABIC LIGATURE TAH WITH YEH FINAL FORM
+FD13;N # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+FD14;N # ARABIC LIGATURE AIN WITH YEH FINAL FORM
+FD15;N # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+FD16;N # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+FD17;N # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+FD18;N # ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+FD19;N # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+FD1A;N # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+FD1B;N # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+FD1C;N # ARABIC LIGATURE HAH WITH YEH FINAL FORM
+FD1D;N # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+FD1E;N # ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+FD1F;N # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+FD20;N # ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+FD21;N # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+FD22;N # ARABIC LIGATURE SAD WITH YEH FINAL FORM
+FD23;N # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+FD24;N # ARABIC LIGATURE DAD WITH YEH FINAL FORM
+FD25;N # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+FD26;N # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+FD27;N # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+FD28;N # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+FD29;N # ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+FD2A;N # ARABIC LIGATURE SEEN WITH REH FINAL FORM
+FD2B;N # ARABIC LIGATURE SAD WITH REH FINAL FORM
+FD2C;N # ARABIC LIGATURE DAD WITH REH FINAL FORM
+FD2D;N # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+FD2E;N # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+FD2F;N # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+FD30;N # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+FD31;N # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+FD32;N # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+FD33;N # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+FD34;N # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+FD35;N # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+FD36;N # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+FD37;N # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+FD38;N # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+FD39;N # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+FD3A;N # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+FD3B;N # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+FD3C;N # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+FD3D;N # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD3E;N # ORNATE LEFT PARENTHESIS
+FD3F;N # ORNATE RIGHT PARENTHESIS
+FD50;N # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+FD51;N # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+FD52;N # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+FD53;N # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+FD54;N # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+FD55;N # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+FD56;N # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+FD57;N # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+FD58;N # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+FD59;N # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+FD5A;N # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+FD5B;N # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD5C;N # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+FD5D;N # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+FD5E;N # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD5F;N # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+FD60;N # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+FD61;N # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+FD62;N # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+FD63;N # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+FD64;N # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+FD65;N # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+FD66;N # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+FD67;N # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+FD68;N # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+FD69;N # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+FD6A;N # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+FD6B;N # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+FD6C;N # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+FD6D;N # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+FD6E;N # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD6F;N # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+FD70;N # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+FD71;N # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+FD72;N # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+FD73;N # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+FD74;N # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+FD75;N # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+FD76;N # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+FD77;N # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+FD78;N # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD79;N # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+FD7A;N # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+FD7B;N # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD7C;N # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+FD7D;N # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+FD7E;N # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+FD7F;N # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+FD80;N # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+FD81;N # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+FD82;N # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD83;N # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+FD84;N # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+FD85;N # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+FD86;N # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+FD87;N # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+FD88;N # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+FD89;N # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+FD8A;N # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+FD8B;N # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+FD8C;N # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+FD8D;N # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+FD8E;N # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+FD8F;N # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92;N # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+FD93;N # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+FD94;N # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+FD95;N # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+FD96;N # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD97;N # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+FD98;N # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+FD99;N # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD9A;N # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+FD9B;N # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD9C;N # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+FD9D;N # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+FD9E;N # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+FD9F;N # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+FDA0;N # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FDA1;N # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+FDA2;N # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA3;N # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+FDA4;N # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA5;N # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+FDA6;N # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FDA7;N # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA8;N # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA9;N # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+FDAA;N # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+FDAB;N # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+FDAC;N # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+FDAD;N # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+FDAE;N # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+FDAF;N # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+FDB0;N # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+FDB1;N # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+FDB2;N # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+FDB3;N # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+FDB4;N # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+FDB5;N # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+FDB6;N # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+FDB7;N # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+FDB8;N # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+FDB9;N # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+FDBA;N # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+FDBB;N # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+FDBC;N # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+FDBD;N # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+FDBE;N # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+FDBF;N # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+FDC0;N # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+FDC1;N # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+FDC2;N # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+FDC3;N # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+FDC4;N # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+FDC5;N # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+FDC6;N # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+FDC7;N # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0;N # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF1;N # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF2;N # ARABIC LIGATURE ALLAH ISOLATED FORM
+FDF3;N # ARABIC LIGATURE AKBAR ISOLATED FORM
+FDF4;N # ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+FDF5;N # ARABIC LIGATURE SALAM ISOLATED FORM
+FDF6;N # ARABIC LIGATURE RASOUL ISOLATED FORM
+FDF7;N # ARABIC LIGATURE ALAYHE ISOLATED FORM
+FDF8;N # ARABIC LIGATURE WASALLAM ISOLATED FORM
+FDF9;N # ARABIC LIGATURE SALLA ISOLATED FORM
+FDFA;N # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+FDFB;N # ARABIC LIGATURE JALLAJALALOUHOU
+FDFC;N # RIAL SIGN
+FDFD;N # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE00;A # VARIATION SELECTOR-1
+FE01;A # VARIATION SELECTOR-2
+FE02;A # VARIATION SELECTOR-3
+FE03;A # VARIATION SELECTOR-4
+FE04;A # VARIATION SELECTOR-5
+FE05;A # VARIATION SELECTOR-6
+FE06;A # VARIATION SELECTOR-7
+FE07;A # VARIATION SELECTOR-8
+FE08;A # VARIATION SELECTOR-9
+FE09;A # VARIATION SELECTOR-10
+FE0A;A # VARIATION SELECTOR-11
+FE0B;A # VARIATION SELECTOR-12
+FE0C;A # VARIATION SELECTOR-13
+FE0D;A # VARIATION SELECTOR-14
+FE0E;A # VARIATION SELECTOR-15
+FE0F;A # VARIATION SELECTOR-16
+FE10;W # PRESENTATION FORM FOR VERTICAL COMMA
+FE11;W # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
+FE12;W # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP
+FE13;W # PRESENTATION FORM FOR VERTICAL COLON
+FE14;W # PRESENTATION FORM FOR VERTICAL SEMICOLON
+FE15;W # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
+FE16;W # PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17;W # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18;W # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19;W # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE20;N # COMBINING LIGATURE LEFT HALF
+FE21;N # COMBINING LIGATURE RIGHT HALF
+FE22;N # COMBINING DOUBLE TILDE LEFT HALF
+FE23;N # COMBINING DOUBLE TILDE RIGHT HALF
+FE30;W # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31;W # PRESENTATION FORM FOR VERTICAL EM DASH
+FE32;W # PRESENTATION FORM FOR VERTICAL EN DASH
+FE33;W # PRESENTATION FORM FOR VERTICAL LOW LINE
+FE34;W # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35;W # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36;W # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37;W # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38;W # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39;W # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A;W # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B;W # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C;W # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D;W # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E;W # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F;W # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40;W # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41;W # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42;W # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43;W # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44;W # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45;W # SESAME DOT
+FE46;W # WHITE SESAME DOT
+FE47;W # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48;W # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49;W # DASHED OVERLINE
+FE4A;W # CENTRELINE OVERLINE
+FE4B;W # WAVY OVERLINE
+FE4C;W # DOUBLE WAVY OVERLINE
+FE4D;W # DASHED LOW LINE
+FE4E;W # CENTRELINE LOW LINE
+FE4F;W # WAVY LOW LINE
+FE50;W # SMALL COMMA
+FE51;W # SMALL IDEOGRAPHIC COMMA
+FE52;W # SMALL FULL STOP
+FE54;W # SMALL SEMICOLON
+FE55;W # SMALL COLON
+FE56;W # SMALL QUESTION MARK
+FE57;W # SMALL EXCLAMATION MARK
+FE58;W # SMALL EM DASH
+FE59;W # SMALL LEFT PARENTHESIS
+FE5A;W # SMALL RIGHT PARENTHESIS
+FE5B;W # SMALL LEFT CURLY BRACKET
+FE5C;W # SMALL RIGHT CURLY BRACKET
+FE5D;W # SMALL LEFT TORTOISE SHELL BRACKET
+FE5E;W # SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F;W # SMALL NUMBER SIGN
+FE60;W # SMALL AMPERSAND
+FE61;W # SMALL ASTERISK
+FE62;W # SMALL PLUS SIGN
+FE63;W # SMALL HYPHEN-MINUS
+FE64;W # SMALL LESS-THAN SIGN
+FE65;W # SMALL GREATER-THAN SIGN
+FE66;W # SMALL EQUALS SIGN
+FE68;W # SMALL REVERSE SOLIDUS
+FE69;W # SMALL DOLLAR SIGN
+FE6A;W # SMALL PERCENT SIGN
+FE6B;W # SMALL COMMERCIAL AT
+FE70;N # ARABIC FATHATAN ISOLATED FORM
+FE71;N # ARABIC TATWEEL WITH FATHATAN ABOVE
+FE72;N # ARABIC DAMMATAN ISOLATED FORM
+FE73;N # ARABIC TAIL FRAGMENT
+FE74;N # ARABIC KASRATAN ISOLATED FORM
+FE76;N # ARABIC FATHA ISOLATED FORM
+FE77;N # ARABIC FATHA MEDIAL FORM
+FE78;N # ARABIC DAMMA ISOLATED FORM
+FE79;N # ARABIC DAMMA MEDIAL FORM
+FE7A;N # ARABIC KASRA ISOLATED FORM
+FE7B;N # ARABIC KASRA MEDIAL FORM
+FE7C;N # ARABIC SHADDA ISOLATED FORM
+FE7D;N # ARABIC SHADDA MEDIAL FORM
+FE7E;N # ARABIC SUKUN ISOLATED FORM
+FE7F;N # ARABIC SUKUN MEDIAL FORM
+FE80;N # ARABIC LETTER HAMZA ISOLATED FORM
+FE81;N # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+FE82;N # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+FE83;N # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+FE84;N # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+FE85;N # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+FE86;N # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+FE87;N # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+FE88;N # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+FE89;N # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+FE8A;N # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+FE8B;N # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+FE8C;N # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+FE8D;N # ARABIC LETTER ALEF ISOLATED FORM
+FE8E;N # ARABIC LETTER ALEF FINAL FORM
+FE8F;N # ARABIC LETTER BEH ISOLATED FORM
+FE90;N # ARABIC LETTER BEH FINAL FORM
+FE91;N # ARABIC LETTER BEH INITIAL FORM
+FE92;N # ARABIC LETTER BEH MEDIAL FORM
+FE93;N # ARABIC LETTER TEH MARBUTA ISOLATED FORM
+FE94;N # ARABIC LETTER TEH MARBUTA FINAL FORM
+FE95;N # ARABIC LETTER TEH ISOLATED FORM
+FE96;N # ARABIC LETTER TEH FINAL FORM
+FE97;N # ARABIC LETTER TEH INITIAL FORM
+FE98;N # ARABIC LETTER TEH MEDIAL FORM
+FE99;N # ARABIC LETTER THEH ISOLATED FORM
+FE9A;N # ARABIC LETTER THEH FINAL FORM
+FE9B;N # ARABIC LETTER THEH INITIAL FORM
+FE9C;N # ARABIC LETTER THEH MEDIAL FORM
+FE9D;N # ARABIC LETTER JEEM ISOLATED FORM
+FE9E;N # ARABIC LETTER JEEM FINAL FORM
+FE9F;N # ARABIC LETTER JEEM INITIAL FORM
+FEA0;N # ARABIC LETTER JEEM MEDIAL FORM
+FEA1;N # ARABIC LETTER HAH ISOLATED FORM
+FEA2;N # ARABIC LETTER HAH FINAL FORM
+FEA3;N # ARABIC LETTER HAH INITIAL FORM
+FEA4;N # ARABIC LETTER HAH MEDIAL FORM
+FEA5;N # ARABIC LETTER KHAH ISOLATED FORM
+FEA6;N # ARABIC LETTER KHAH FINAL FORM
+FEA7;N # ARABIC LETTER KHAH INITIAL FORM
+FEA8;N # ARABIC LETTER KHAH MEDIAL FORM
+FEA9;N # ARABIC LETTER DAL ISOLATED FORM
+FEAA;N # ARABIC LETTER DAL FINAL FORM
+FEAB;N # ARABIC LETTER THAL ISOLATED FORM
+FEAC;N # ARABIC LETTER THAL FINAL FORM
+FEAD;N # ARABIC LETTER REH ISOLATED FORM
+FEAE;N # ARABIC LETTER REH FINAL FORM
+FEAF;N # ARABIC LETTER ZAIN ISOLATED FORM
+FEB0;N # ARABIC LETTER ZAIN FINAL FORM
+FEB1;N # ARABIC LETTER SEEN ISOLATED FORM
+FEB2;N # ARABIC LETTER SEEN FINAL FORM
+FEB3;N # ARABIC LETTER SEEN INITIAL FORM
+FEB4;N # ARABIC LETTER SEEN MEDIAL FORM
+FEB5;N # ARABIC LETTER SHEEN ISOLATED FORM
+FEB6;N # ARABIC LETTER SHEEN FINAL FORM
+FEB7;N # ARABIC LETTER SHEEN INITIAL FORM
+FEB8;N # ARABIC LETTER SHEEN MEDIAL FORM
+FEB9;N # ARABIC LETTER SAD ISOLATED FORM
+FEBA;N # ARABIC LETTER SAD FINAL FORM
+FEBB;N # ARABIC LETTER SAD INITIAL FORM
+FEBC;N # ARABIC LETTER SAD MEDIAL FORM
+FEBD;N # ARABIC LETTER DAD ISOLATED FORM
+FEBE;N # ARABIC LETTER DAD FINAL FORM
+FEBF;N # ARABIC LETTER DAD INITIAL FORM
+FEC0;N # ARABIC LETTER DAD MEDIAL FORM
+FEC1;N # ARABIC LETTER TAH ISOLATED FORM
+FEC2;N # ARABIC LETTER TAH FINAL FORM
+FEC3;N # ARABIC LETTER TAH INITIAL FORM
+FEC4;N # ARABIC LETTER TAH MEDIAL FORM
+FEC5;N # ARABIC LETTER ZAH ISOLATED FORM
+FEC6;N # ARABIC LETTER ZAH FINAL FORM
+FEC7;N # ARABIC LETTER ZAH INITIAL FORM
+FEC8;N # ARABIC LETTER ZAH MEDIAL FORM
+FEC9;N # ARABIC LETTER AIN ISOLATED FORM
+FECA;N # ARABIC LETTER AIN FINAL FORM
+FECB;N # ARABIC LETTER AIN INITIAL FORM
+FECC;N # ARABIC LETTER AIN MEDIAL FORM
+FECD;N # ARABIC LETTER GHAIN ISOLATED FORM
+FECE;N # ARABIC LETTER GHAIN FINAL FORM
+FECF;N # ARABIC LETTER GHAIN INITIAL FORM
+FED0;N # ARABIC LETTER GHAIN MEDIAL FORM
+FED1;N # ARABIC LETTER FEH ISOLATED FORM
+FED2;N # ARABIC LETTER FEH FINAL FORM
+FED3;N # ARABIC LETTER FEH INITIAL FORM
+FED4;N # ARABIC LETTER FEH MEDIAL FORM
+FED5;N # ARABIC LETTER QAF ISOLATED FORM
+FED6;N # ARABIC LETTER QAF FINAL FORM
+FED7;N # ARABIC LETTER QAF INITIAL FORM
+FED8;N # ARABIC LETTER QAF MEDIAL FORM
+FED9;N # ARABIC LETTER KAF ISOLATED FORM
+FEDA;N # ARABIC LETTER KAF FINAL FORM
+FEDB;N # ARABIC LETTER KAF INITIAL FORM
+FEDC;N # ARABIC LETTER KAF MEDIAL FORM
+FEDD;N # ARABIC LETTER LAM ISOLATED FORM
+FEDE;N # ARABIC LETTER LAM FINAL FORM
+FEDF;N # ARABIC LETTER LAM INITIAL FORM
+FEE0;N # ARABIC LETTER LAM MEDIAL FORM
+FEE1;N # ARABIC LETTER MEEM ISOLATED FORM
+FEE2;N # ARABIC LETTER MEEM FINAL FORM
+FEE3;N # ARABIC LETTER MEEM INITIAL FORM
+FEE4;N # ARABIC LETTER MEEM MEDIAL FORM
+FEE5;N # ARABIC LETTER NOON ISOLATED FORM
+FEE6;N # ARABIC LETTER NOON FINAL FORM
+FEE7;N # ARABIC LETTER NOON INITIAL FORM
+FEE8;N # ARABIC LETTER NOON MEDIAL FORM
+FEE9;N # ARABIC LETTER HEH ISOLATED FORM
+FEEA;N # ARABIC LETTER HEH FINAL FORM
+FEEB;N # ARABIC LETTER HEH INITIAL FORM
+FEEC;N # ARABIC LETTER HEH MEDIAL FORM
+FEED;N # ARABIC LETTER WAW ISOLATED FORM
+FEEE;N # ARABIC LETTER WAW FINAL FORM
+FEEF;N # ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+FEF0;N # ARABIC LETTER ALEF MAKSURA FINAL FORM
+FEF1;N # ARABIC LETTER YEH ISOLATED FORM
+FEF2;N # ARABIC LETTER YEH FINAL FORM
+FEF3;N # ARABIC LETTER YEH INITIAL FORM
+FEF4;N # ARABIC LETTER YEH MEDIAL FORM
+FEF5;N # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+FEF6;N # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+FEF7;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+FEF8;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+FEF9;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+FEFA;N # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+FEFB;N # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+FEFC;N # ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFF;N # ZERO WIDTH NO-BREAK SPACE
+FF01;F # FULLWIDTH EXCLAMATION MARK
+FF02;F # FULLWIDTH QUOTATION MARK
+FF03;F # FULLWIDTH NUMBER SIGN
+FF04;F # FULLWIDTH DOLLAR SIGN
+FF05;F # FULLWIDTH PERCENT SIGN
+FF06;F # FULLWIDTH AMPERSAND
+FF07;F # FULLWIDTH APOSTROPHE
+FF08;F # FULLWIDTH LEFT PARENTHESIS
+FF09;F # FULLWIDTH RIGHT PARENTHESIS
+FF0A;F # FULLWIDTH ASTERISK
+FF0B;F # FULLWIDTH PLUS SIGN
+FF0C;F # FULLWIDTH COMMA
+FF0D;F # FULLWIDTH HYPHEN-MINUS
+FF0E;F # FULLWIDTH FULL STOP
+FF0F;F # FULLWIDTH SOLIDUS
+FF10;F # FULLWIDTH DIGIT ZERO
+FF11;F # FULLWIDTH DIGIT ONE
+FF12;F # FULLWIDTH DIGIT TWO
+FF13;F # FULLWIDTH DIGIT THREE
+FF14;F # FULLWIDTH DIGIT FOUR
+FF15;F # FULLWIDTH DIGIT FIVE
+FF16;F # FULLWIDTH DIGIT SIX
+FF17;F # FULLWIDTH DIGIT SEVEN
+FF18;F # FULLWIDTH DIGIT EIGHT
+FF19;F # FULLWIDTH DIGIT NINE
+FF1A;F # FULLWIDTH COLON
+FF1B;F # FULLWIDTH SEMICOLON
+FF1C;F # FULLWIDTH LESS-THAN SIGN
+FF1D;F # FULLWIDTH EQUALS SIGN
+FF1E;F # FULLWIDTH GREATER-THAN SIGN
+FF1F;F # FULLWIDTH QUESTION MARK
+FF20;F # FULLWIDTH COMMERCIAL AT
+FF21;F # FULLWIDTH LATIN CAPITAL LETTER A
+FF22;F # FULLWIDTH LATIN CAPITAL LETTER B
+FF23;F # FULLWIDTH LATIN CAPITAL LETTER C
+FF24;F # FULLWIDTH LATIN CAPITAL LETTER D
+FF25;F # FULLWIDTH LATIN CAPITAL LETTER E
+FF26;F # FULLWIDTH LATIN CAPITAL LETTER F
+FF27;F # FULLWIDTH LATIN CAPITAL LETTER G
+FF28;F # FULLWIDTH LATIN CAPITAL LETTER H
+FF29;F # FULLWIDTH LATIN CAPITAL LETTER I
+FF2A;F # FULLWIDTH LATIN CAPITAL LETTER J
+FF2B;F # FULLWIDTH LATIN CAPITAL LETTER K
+FF2C;F # FULLWIDTH LATIN CAPITAL LETTER L
+FF2D;F # FULLWIDTH LATIN CAPITAL LETTER M
+FF2E;F # FULLWIDTH LATIN CAPITAL LETTER N
+FF2F;F # FULLWIDTH LATIN CAPITAL LETTER O
+FF30;F # FULLWIDTH LATIN CAPITAL LETTER P
+FF31;F # FULLWIDTH LATIN CAPITAL LETTER Q
+FF32;F # FULLWIDTH LATIN CAPITAL LETTER R
+FF33;F # FULLWIDTH LATIN CAPITAL LETTER S
+FF34;F # FULLWIDTH LATIN CAPITAL LETTER T
+FF35;F # FULLWIDTH LATIN CAPITAL LETTER U
+FF36;F # FULLWIDTH LATIN CAPITAL LETTER V
+FF37;F # FULLWIDTH LATIN CAPITAL LETTER W
+FF38;F # FULLWIDTH LATIN CAPITAL LETTER X
+FF39;F # FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A;F # FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B;F # FULLWIDTH LEFT SQUARE BRACKET
+FF3C;F # FULLWIDTH REVERSE SOLIDUS
+FF3D;F # FULLWIDTH RIGHT SQUARE BRACKET
+FF3E;F # FULLWIDTH CIRCUMFLEX ACCENT
+FF3F;F # FULLWIDTH LOW LINE
+FF40;F # FULLWIDTH GRAVE ACCENT
+FF41;F # FULLWIDTH LATIN SMALL LETTER A
+FF42;F # FULLWIDTH LATIN SMALL LETTER B
+FF43;F # FULLWIDTH LATIN SMALL LETTER C
+FF44;F # FULLWIDTH LATIN SMALL LETTER D
+FF45;F # FULLWIDTH LATIN SMALL LETTER E
+FF46;F # FULLWIDTH LATIN SMALL LETTER F
+FF47;F # FULLWIDTH LATIN SMALL LETTER G
+FF48;F # FULLWIDTH LATIN SMALL LETTER H
+FF49;F # FULLWIDTH LATIN SMALL LETTER I
+FF4A;F # FULLWIDTH LATIN SMALL LETTER J
+FF4B;F # FULLWIDTH LATIN SMALL LETTER K
+FF4C;F # FULLWIDTH LATIN SMALL LETTER L
+FF4D;F # FULLWIDTH LATIN SMALL LETTER M
+FF4E;F # FULLWIDTH LATIN SMALL LETTER N
+FF4F;F # FULLWIDTH LATIN SMALL LETTER O
+FF50;F # FULLWIDTH LATIN SMALL LETTER P
+FF51;F # FULLWIDTH LATIN SMALL LETTER Q
+FF52;F # FULLWIDTH LATIN SMALL LETTER R
+FF53;F # FULLWIDTH LATIN SMALL LETTER S
+FF54;F # FULLWIDTH LATIN SMALL LETTER T
+FF55;F # FULLWIDTH LATIN SMALL LETTER U
+FF56;F # FULLWIDTH LATIN SMALL LETTER V
+FF57;F # FULLWIDTH LATIN SMALL LETTER W
+FF58;F # FULLWIDTH LATIN SMALL LETTER X
+FF59;F # FULLWIDTH LATIN SMALL LETTER Y
+FF5A;F # FULLWIDTH LATIN SMALL LETTER Z
+FF5B;F # FULLWIDTH LEFT CURLY BRACKET
+FF5C;F # FULLWIDTH VERTICAL LINE
+FF5D;F # FULLWIDTH RIGHT CURLY BRACKET
+FF5E;F # FULLWIDTH TILDE
+FF5F;F # FULLWIDTH LEFT WHITE PARENTHESIS
+FF60;F # FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61;H # HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62;H # HALFWIDTH LEFT CORNER BRACKET
+FF63;H # HALFWIDTH RIGHT CORNER BRACKET
+FF64;H # HALFWIDTH IDEOGRAPHIC COMMA
+FF65;H # HALFWIDTH KATAKANA MIDDLE DOT
+FF66;H # HALFWIDTH KATAKANA LETTER WO
+FF67;H # HALFWIDTH KATAKANA LETTER SMALL A
+FF68;H # HALFWIDTH KATAKANA LETTER SMALL I
+FF69;H # HALFWIDTH KATAKANA LETTER SMALL U
+FF6A;H # HALFWIDTH KATAKANA LETTER SMALL E
+FF6B;H # HALFWIDTH KATAKANA LETTER SMALL O
+FF6C;H # HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D;H # HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E;H # HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F;H # HALFWIDTH KATAKANA LETTER SMALL TU
+FF70;H # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71;H # HALFWIDTH KATAKANA LETTER A
+FF72;H # HALFWIDTH KATAKANA LETTER I
+FF73;H # HALFWIDTH KATAKANA LETTER U
+FF74;H # HALFWIDTH KATAKANA LETTER E
+FF75;H # HALFWIDTH KATAKANA LETTER O
+FF76;H # HALFWIDTH KATAKANA LETTER KA
+FF77;H # HALFWIDTH KATAKANA LETTER KI
+FF78;H # HALFWIDTH KATAKANA LETTER KU
+FF79;H # HALFWIDTH KATAKANA LETTER KE
+FF7A;H # HALFWIDTH KATAKANA LETTER KO
+FF7B;H # HALFWIDTH KATAKANA LETTER SA
+FF7C;H # HALFWIDTH KATAKANA LETTER SI
+FF7D;H # HALFWIDTH KATAKANA LETTER SU
+FF7E;H # HALFWIDTH KATAKANA LETTER SE
+FF7F;H # HALFWIDTH KATAKANA LETTER SO
+FF80;H # HALFWIDTH KATAKANA LETTER TA
+FF81;H # HALFWIDTH KATAKANA LETTER TI
+FF82;H # HALFWIDTH KATAKANA LETTER TU
+FF83;H # HALFWIDTH KATAKANA LETTER TE
+FF84;H # HALFWIDTH KATAKANA LETTER TO
+FF85;H # HALFWIDTH KATAKANA LETTER NA
+FF86;H # HALFWIDTH KATAKANA LETTER NI
+FF87;H # HALFWIDTH KATAKANA LETTER NU
+FF88;H # HALFWIDTH KATAKANA LETTER NE
+FF89;H # HALFWIDTH KATAKANA LETTER NO
+FF8A;H # HALFWIDTH KATAKANA LETTER HA
+FF8B;H # HALFWIDTH KATAKANA LETTER HI
+FF8C;H # HALFWIDTH KATAKANA LETTER HU
+FF8D;H # HALFWIDTH KATAKANA LETTER HE
+FF8E;H # HALFWIDTH KATAKANA LETTER HO
+FF8F;H # HALFWIDTH KATAKANA LETTER MA
+FF90;H # HALFWIDTH KATAKANA LETTER MI
+FF91;H # HALFWIDTH KATAKANA LETTER MU
+FF92;H # HALFWIDTH KATAKANA LETTER ME
+FF93;H # HALFWIDTH KATAKANA LETTER MO
+FF94;H # HALFWIDTH KATAKANA LETTER YA
+FF95;H # HALFWIDTH KATAKANA LETTER YU
+FF96;H # HALFWIDTH KATAKANA LETTER YO
+FF97;H # HALFWIDTH KATAKANA LETTER RA
+FF98;H # HALFWIDTH KATAKANA LETTER RI
+FF99;H # HALFWIDTH KATAKANA LETTER RU
+FF9A;H # HALFWIDTH KATAKANA LETTER RE
+FF9B;H # HALFWIDTH KATAKANA LETTER RO
+FF9C;H # HALFWIDTH KATAKANA LETTER WA
+FF9D;H # HALFWIDTH KATAKANA LETTER N
+FF9E;H # HALFWIDTH KATAKANA VOICED SOUND MARK
+FF9F;H # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0;H # HALFWIDTH HANGUL FILLER
+FFA1;H # HALFWIDTH HANGUL LETTER KIYEOK
+FFA2;H # HALFWIDTH HANGUL LETTER SSANGKIYEOK
+FFA3;H # HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+FFA4;H # HALFWIDTH HANGUL LETTER NIEUN
+FFA5;H # HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+FFA6;H # HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+FFA7;H # HALFWIDTH HANGUL LETTER TIKEUT
+FFA8;H # HALFWIDTH HANGUL LETTER SSANGTIKEUT
+FFA9;H # HALFWIDTH HANGUL LETTER RIEUL
+FFAA;H # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+FFAB;H # HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+FFAC;H # HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+FFAD;H # HALFWIDTH HANGUL LETTER RIEUL-SIOS
+FFAE;H # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+FFAF;H # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+FFB0;H # HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+FFB1;H # HALFWIDTH HANGUL LETTER MIEUM
+FFB2;H # HALFWIDTH HANGUL LETTER PIEUP
+FFB3;H # HALFWIDTH HANGUL LETTER SSANGPIEUP
+FFB4;H # HALFWIDTH HANGUL LETTER PIEUP-SIOS
+FFB5;H # HALFWIDTH HANGUL LETTER SIOS
+FFB6;H # HALFWIDTH HANGUL LETTER SSANGSIOS
+FFB7;H # HALFWIDTH HANGUL LETTER IEUNG
+FFB8;H # HALFWIDTH HANGUL LETTER CIEUC
+FFB9;H # HALFWIDTH HANGUL LETTER SSANGCIEUC
+FFBA;H # HALFWIDTH HANGUL LETTER CHIEUCH
+FFBB;H # HALFWIDTH HANGUL LETTER KHIEUKH
+FFBC;H # HALFWIDTH HANGUL LETTER THIEUTH
+FFBD;H # HALFWIDTH HANGUL LETTER PHIEUPH
+FFBE;H # HALFWIDTH HANGUL LETTER HIEUH
+FFC2;H # HALFWIDTH HANGUL LETTER A
+FFC3;H # HALFWIDTH HANGUL LETTER AE
+FFC4;H # HALFWIDTH HANGUL LETTER YA
+FFC5;H # HALFWIDTH HANGUL LETTER YAE
+FFC6;H # HALFWIDTH HANGUL LETTER EO
+FFC7;H # HALFWIDTH HANGUL LETTER E
+FFCA;H # HALFWIDTH HANGUL LETTER YEO
+FFCB;H # HALFWIDTH HANGUL LETTER YE
+FFCC;H # HALFWIDTH HANGUL LETTER O
+FFCD;H # HALFWIDTH HANGUL LETTER WA
+FFCE;H # HALFWIDTH HANGUL LETTER WAE
+FFCF;H # HALFWIDTH HANGUL LETTER OE
+FFD2;H # HALFWIDTH HANGUL LETTER YO
+FFD3;H # HALFWIDTH HANGUL LETTER U
+FFD4;H # HALFWIDTH HANGUL LETTER WEO
+FFD5;H # HALFWIDTH HANGUL LETTER WE
+FFD6;H # HALFWIDTH HANGUL LETTER WI
+FFD7;H # HALFWIDTH HANGUL LETTER YU
+FFDA;H # HALFWIDTH HANGUL LETTER EU
+FFDB;H # HALFWIDTH HANGUL LETTER YI
+FFDC;H # HALFWIDTH HANGUL LETTER I
+FFE0;F # FULLWIDTH CENT SIGN
+FFE1;F # FULLWIDTH POUND SIGN
+FFE2;F # FULLWIDTH NOT SIGN
+FFE3;F # FULLWIDTH MACRON
+FFE4;F # FULLWIDTH BROKEN BAR
+FFE5;F # FULLWIDTH YEN SIGN
+FFE6;F # FULLWIDTH WON SIGN
+FFE8;H # HALFWIDTH FORMS LIGHT VERTICAL
+FFE9;H # HALFWIDTH LEFTWARDS ARROW
+FFEA;H # HALFWIDTH UPWARDS ARROW
+FFEB;H # HALFWIDTH RIGHTWARDS ARROW
+FFEC;H # HALFWIDTH DOWNWARDS ARROW
+FFED;H # HALFWIDTH BLACK SQUARE
+FFEE;H # HALFWIDTH WHITE CIRCLE
+FFF9;N # INTERLINEAR ANNOTATION ANCHOR
+FFFA;N # INTERLINEAR ANNOTATION SEPARATOR
+FFFB;N # INTERLINEAR ANNOTATION TERMINATOR
+FFFC;N # OBJECT REPLACEMENT CHARACTER
+FFFD;A # REPLACEMENT CHARACTER
+10000;N # LINEAR B SYLLABLE B008 A
+10001;N # LINEAR B SYLLABLE B038 E
+10002;N # LINEAR B SYLLABLE B028 I
+10003;N # LINEAR B SYLLABLE B061 O
+10004;N # LINEAR B SYLLABLE B010 U
+10005;N # LINEAR B SYLLABLE B001 DA
+10006;N # LINEAR B SYLLABLE B045 DE
+10007;N # LINEAR B SYLLABLE B007 DI
+10008;N # LINEAR B SYLLABLE B014 DO
+10009;N # LINEAR B SYLLABLE B051 DU
+1000A;N # LINEAR B SYLLABLE B057 JA
+1000B;N # LINEAR B SYLLABLE B046 JE
+1000D;N # LINEAR B SYLLABLE B036 JO
+1000E;N # LINEAR B SYLLABLE B065 JU
+1000F;N # LINEAR B SYLLABLE B077 KA
+10010;N # LINEAR B SYLLABLE B044 KE
+10011;N # LINEAR B SYLLABLE B067 KI
+10012;N # LINEAR B SYLLABLE B070 KO
+10013;N # LINEAR B SYLLABLE B081 KU
+10014;N # LINEAR B SYLLABLE B080 MA
+10015;N # LINEAR B SYLLABLE B013 ME
+10016;N # LINEAR B SYLLABLE B073 MI
+10017;N # LINEAR B SYLLABLE B015 MO
+10018;N # LINEAR B SYLLABLE B023 MU
+10019;N # LINEAR B SYLLABLE B006 NA
+1001A;N # LINEAR B SYLLABLE B024 NE
+1001B;N # LINEAR B SYLLABLE B030 NI
+1001C;N # LINEAR B SYLLABLE B052 NO
+1001D;N # LINEAR B SYLLABLE B055 NU
+1001E;N # LINEAR B SYLLABLE B003 PA
+1001F;N # LINEAR B SYLLABLE B072 PE
+10020;N # LINEAR B SYLLABLE B039 PI
+10021;N # LINEAR B SYLLABLE B011 PO
+10022;N # LINEAR B SYLLABLE B050 PU
+10023;N # LINEAR B SYLLABLE B016 QA
+10024;N # LINEAR B SYLLABLE B078 QE
+10025;N # LINEAR B SYLLABLE B021 QI
+10026;N # LINEAR B SYLLABLE B032 QO
+10028;N # LINEAR B SYLLABLE B060 RA
+10029;N # LINEAR B SYLLABLE B027 RE
+1002A;N # LINEAR B SYLLABLE B053 RI
+1002B;N # LINEAR B SYLLABLE B002 RO
+1002C;N # LINEAR B SYLLABLE B026 RU
+1002D;N # LINEAR B SYLLABLE B031 SA
+1002E;N # LINEAR B SYLLABLE B009 SE
+1002F;N # LINEAR B SYLLABLE B041 SI
+10030;N # LINEAR B SYLLABLE B012 SO
+10031;N # LINEAR B SYLLABLE B058 SU
+10032;N # LINEAR B SYLLABLE B059 TA
+10033;N # LINEAR B SYLLABLE B004 TE
+10034;N # LINEAR B SYLLABLE B037 TI
+10035;N # LINEAR B SYLLABLE B005 TO
+10036;N # LINEAR B SYLLABLE B069 TU
+10037;N # LINEAR B SYLLABLE B054 WA
+10038;N # LINEAR B SYLLABLE B075 WE
+10039;N # LINEAR B SYLLABLE B040 WI
+1003A;N # LINEAR B SYLLABLE B042 WO
+1003C;N # LINEAR B SYLLABLE B017 ZA
+1003D;N # LINEAR B SYLLABLE B074 ZE
+1003F;N # LINEAR B SYLLABLE B020 ZO
+10040;N # LINEAR B SYLLABLE B025 A2
+10041;N # LINEAR B SYLLABLE B043 A3
+10042;N # LINEAR B SYLLABLE B085 AU
+10043;N # LINEAR B SYLLABLE B071 DWE
+10044;N # LINEAR B SYLLABLE B090 DWO
+10045;N # LINEAR B SYLLABLE B048 NWA
+10046;N # LINEAR B SYLLABLE B029 PU2
+10047;N # LINEAR B SYLLABLE B062 PTE
+10048;N # LINEAR B SYLLABLE B076 RA2
+10049;N # LINEAR B SYLLABLE B033 RA3
+1004A;N # LINEAR B SYLLABLE B068 RO2
+1004B;N # LINEAR B SYLLABLE B066 TA2
+1004C;N # LINEAR B SYLLABLE B087 TWE
+1004D;N # LINEAR B SYLLABLE B091 TWO
+10050;N # LINEAR B SYMBOL B018
+10051;N # LINEAR B SYMBOL B019
+10052;N # LINEAR B SYMBOL B022
+10053;N # LINEAR B SYMBOL B034
+10054;N # LINEAR B SYMBOL B047
+10055;N # LINEAR B SYMBOL B049
+10056;N # LINEAR B SYMBOL B056
+10057;N # LINEAR B SYMBOL B063
+10058;N # LINEAR B SYMBOL B064
+10059;N # LINEAR B SYMBOL B079
+1005A;N # LINEAR B SYMBOL B082
+1005B;N # LINEAR B SYMBOL B083
+1005C;N # LINEAR B SYMBOL B086
+1005D;N # LINEAR B SYMBOL B089
+10080;N # LINEAR B IDEOGRAM B100 MAN
+10081;N # LINEAR B IDEOGRAM B102 WOMAN
+10082;N # LINEAR B IDEOGRAM B104 DEER
+10083;N # LINEAR B IDEOGRAM B105 EQUID
+10084;N # LINEAR B IDEOGRAM B105F MARE
+10085;N # LINEAR B IDEOGRAM B105M STALLION
+10086;N # LINEAR B IDEOGRAM B106F EWE
+10087;N # LINEAR B IDEOGRAM B106M RAM
+10088;N # LINEAR B IDEOGRAM B107F SHE-GOAT
+10089;N # LINEAR B IDEOGRAM B107M HE-GOAT
+1008A;N # LINEAR B IDEOGRAM B108F SOW
+1008B;N # LINEAR B IDEOGRAM B108M BOAR
+1008C;N # LINEAR B IDEOGRAM B109F COW
+1008D;N # LINEAR B IDEOGRAM B109M BULL
+1008E;N # LINEAR B IDEOGRAM B120 WHEAT
+1008F;N # LINEAR B IDEOGRAM B121 BARLEY
+10090;N # LINEAR B IDEOGRAM B122 OLIVE
+10091;N # LINEAR B IDEOGRAM B123 SPICE
+10092;N # LINEAR B IDEOGRAM B125 CYPERUS
+10093;N # LINEAR B MONOGRAM B127 KAPO
+10094;N # LINEAR B MONOGRAM B128 KANAKO
+10095;N # LINEAR B IDEOGRAM B130 OIL
+10096;N # LINEAR B IDEOGRAM B131 WINE
+10097;N # LINEAR B IDEOGRAM B132
+10098;N # LINEAR B MONOGRAM B133 AREPA
+10099;N # LINEAR B MONOGRAM B135 MERI
+1009A;N # LINEAR B IDEOGRAM B140 BRONZE
+1009B;N # LINEAR B IDEOGRAM B141 GOLD
+1009C;N # LINEAR B IDEOGRAM B142
+1009D;N # LINEAR B IDEOGRAM B145 WOOL
+1009E;N # LINEAR B IDEOGRAM B146
+1009F;N # LINEAR B IDEOGRAM B150
+100A0;N # LINEAR B IDEOGRAM B151 HORN
+100A1;N # LINEAR B IDEOGRAM B152
+100A2;N # LINEAR B IDEOGRAM B153
+100A3;N # LINEAR B IDEOGRAM B154
+100A4;N # LINEAR B MONOGRAM B156 TURO2
+100A5;N # LINEAR B IDEOGRAM B157
+100A6;N # LINEAR B IDEOGRAM B158
+100A7;N # LINEAR B IDEOGRAM B159 CLOTH
+100A8;N # LINEAR B IDEOGRAM B160
+100A9;N # LINEAR B IDEOGRAM B161
+100AA;N # LINEAR B IDEOGRAM B162 GARMENT
+100AB;N # LINEAR B IDEOGRAM B163 ARMOUR
+100AC;N # LINEAR B IDEOGRAM B164
+100AD;N # LINEAR B IDEOGRAM B165
+100AE;N # LINEAR B IDEOGRAM B166
+100AF;N # LINEAR B IDEOGRAM B167
+100B0;N # LINEAR B IDEOGRAM B168
+100B1;N # LINEAR B IDEOGRAM B169
+100B2;N # LINEAR B IDEOGRAM B170
+100B3;N # LINEAR B IDEOGRAM B171
+100B4;N # LINEAR B IDEOGRAM B172
+100B5;N # LINEAR B IDEOGRAM B173 MONTH
+100B6;N # LINEAR B IDEOGRAM B174
+100B7;N # LINEAR B IDEOGRAM B176 TREE
+100B8;N # LINEAR B IDEOGRAM B177
+100B9;N # LINEAR B IDEOGRAM B178
+100BA;N # LINEAR B IDEOGRAM B179
+100BB;N # LINEAR B IDEOGRAM B180
+100BC;N # LINEAR B IDEOGRAM B181
+100BD;N # LINEAR B IDEOGRAM B182
+100BE;N # LINEAR B IDEOGRAM B183
+100BF;N # LINEAR B IDEOGRAM B184
+100C0;N # LINEAR B IDEOGRAM B185
+100C1;N # LINEAR B IDEOGRAM B189
+100C2;N # LINEAR B IDEOGRAM B190
+100C3;N # LINEAR B IDEOGRAM B191 HELMET
+100C4;N # LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5;N # LINEAR B IDEOGRAM B225 BATHTUB
+100C6;N # LINEAR B IDEOGRAM B230 SPEAR
+100C7;N # LINEAR B IDEOGRAM B231 ARROW
+100C8;N # LINEAR B IDEOGRAM B232
+100C9;N # LINEAR B IDEOGRAM B233 SWORD
+100CA;N # LINEAR B IDEOGRAM B234
+100CB;N # LINEAR B IDEOGRAM B236
+100CC;N # LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD;N # LINEAR B IDEOGRAM B241 CHARIOT
+100CE;N # LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF;N # LINEAR B IDEOGRAM B243 WHEEL
+100D0;N # LINEAR B IDEOGRAM B245
+100D1;N # LINEAR B IDEOGRAM B246
+100D2;N # LINEAR B MONOGRAM B247 DIPTE
+100D3;N # LINEAR B IDEOGRAM B248
+100D4;N # LINEAR B IDEOGRAM B249
+100D5;N # LINEAR B IDEOGRAM B251
+100D6;N # LINEAR B IDEOGRAM B252
+100D7;N # LINEAR B IDEOGRAM B253
+100D8;N # LINEAR B IDEOGRAM B254 DART
+100D9;N # LINEAR B IDEOGRAM B255
+100DA;N # LINEAR B IDEOGRAM B256
+100DB;N # LINEAR B IDEOGRAM B257
+100DC;N # LINEAR B IDEOGRAM B258
+100DD;N # LINEAR B IDEOGRAM B259
+100DE;N # LINEAR B IDEOGRAM VESSEL B155
+100DF;N # LINEAR B IDEOGRAM VESSEL B200
+100E0;N # LINEAR B IDEOGRAM VESSEL B201
+100E1;N # LINEAR B IDEOGRAM VESSEL B202
+100E2;N # LINEAR B IDEOGRAM VESSEL B203
+100E3;N # LINEAR B IDEOGRAM VESSEL B204
+100E4;N # LINEAR B IDEOGRAM VESSEL B205
+100E5;N # LINEAR B IDEOGRAM VESSEL B206
+100E6;N # LINEAR B IDEOGRAM VESSEL B207
+100E7;N # LINEAR B IDEOGRAM VESSEL B208
+100E8;N # LINEAR B IDEOGRAM VESSEL B209
+100E9;N # LINEAR B IDEOGRAM VESSEL B210
+100EA;N # LINEAR B IDEOGRAM VESSEL B211
+100EB;N # LINEAR B IDEOGRAM VESSEL B212
+100EC;N # LINEAR B IDEOGRAM VESSEL B213
+100ED;N # LINEAR B IDEOGRAM VESSEL B214
+100EE;N # LINEAR B IDEOGRAM VESSEL B215
+100EF;N # LINEAR B IDEOGRAM VESSEL B216
+100F0;N # LINEAR B IDEOGRAM VESSEL B217
+100F1;N # LINEAR B IDEOGRAM VESSEL B218
+100F2;N # LINEAR B IDEOGRAM VESSEL B219
+100F3;N # LINEAR B IDEOGRAM VESSEL B221
+100F4;N # LINEAR B IDEOGRAM VESSEL B222
+100F5;N # LINEAR B IDEOGRAM VESSEL B226
+100F6;N # LINEAR B IDEOGRAM VESSEL B227
+100F7;N # LINEAR B IDEOGRAM VESSEL B228
+100F8;N # LINEAR B IDEOGRAM VESSEL B229
+100F9;N # LINEAR B IDEOGRAM VESSEL B250
+100FA;N # LINEAR B IDEOGRAM VESSEL B305
+10100;N # AEGEAN WORD SEPARATOR LINE
+10101;N # AEGEAN WORD SEPARATOR DOT
+10102;N # AEGEAN CHECK MARK
+10107;N # AEGEAN NUMBER ONE
+10108;N # AEGEAN NUMBER TWO
+10109;N # AEGEAN NUMBER THREE
+1010A;N # AEGEAN NUMBER FOUR
+1010B;N # AEGEAN NUMBER FIVE
+1010C;N # AEGEAN NUMBER SIX
+1010D;N # AEGEAN NUMBER SEVEN
+1010E;N # AEGEAN NUMBER EIGHT
+1010F;N # AEGEAN NUMBER NINE
+10110;N # AEGEAN NUMBER TEN
+10111;N # AEGEAN NUMBER TWENTY
+10112;N # AEGEAN NUMBER THIRTY
+10113;N # AEGEAN NUMBER FORTY
+10114;N # AEGEAN NUMBER FIFTY
+10115;N # AEGEAN NUMBER SIXTY
+10116;N # AEGEAN NUMBER SEVENTY
+10117;N # AEGEAN NUMBER EIGHTY
+10118;N # AEGEAN NUMBER NINETY
+10119;N # AEGEAN NUMBER ONE HUNDRED
+1011A;N # AEGEAN NUMBER TWO HUNDRED
+1011B;N # AEGEAN NUMBER THREE HUNDRED
+1011C;N # AEGEAN NUMBER FOUR HUNDRED
+1011D;N # AEGEAN NUMBER FIVE HUNDRED
+1011E;N # AEGEAN NUMBER SIX HUNDRED
+1011F;N # AEGEAN NUMBER SEVEN HUNDRED
+10120;N # AEGEAN NUMBER EIGHT HUNDRED
+10121;N # AEGEAN NUMBER NINE HUNDRED
+10122;N # AEGEAN NUMBER ONE THOUSAND
+10123;N # AEGEAN NUMBER TWO THOUSAND
+10124;N # AEGEAN NUMBER THREE THOUSAND
+10125;N # AEGEAN NUMBER FOUR THOUSAND
+10126;N # AEGEAN NUMBER FIVE THOUSAND
+10127;N # AEGEAN NUMBER SIX THOUSAND
+10128;N # AEGEAN NUMBER SEVEN THOUSAND
+10129;N # AEGEAN NUMBER EIGHT THOUSAND
+1012A;N # AEGEAN NUMBER NINE THOUSAND
+1012B;N # AEGEAN NUMBER TEN THOUSAND
+1012C;N # AEGEAN NUMBER TWENTY THOUSAND
+1012D;N # AEGEAN NUMBER THIRTY THOUSAND
+1012E;N # AEGEAN NUMBER FORTY THOUSAND
+1012F;N # AEGEAN NUMBER FIFTY THOUSAND
+10130;N # AEGEAN NUMBER SIXTY THOUSAND
+10131;N # AEGEAN NUMBER SEVENTY THOUSAND
+10132;N # AEGEAN NUMBER EIGHTY THOUSAND
+10133;N # AEGEAN NUMBER NINETY THOUSAND
+10137;N # AEGEAN WEIGHT BASE UNIT
+10138;N # AEGEAN WEIGHT FIRST SUBUNIT
+10139;N # AEGEAN WEIGHT SECOND SUBUNIT
+1013A;N # AEGEAN WEIGHT THIRD SUBUNIT
+1013B;N # AEGEAN WEIGHT FOURTH SUBUNIT
+1013C;N # AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D;N # AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E;N # AEGEAN MEASURE SECOND SUBUNIT
+1013F;N # AEGEAN MEASURE THIRD SUBUNIT
+10140;N # GREEK ACROPHONIC ATTIC ONE QUARTER
+10141;N # GREEK ACROPHONIC ATTIC ONE HALF
+10142;N # GREEK ACROPHONIC ATTIC ONE DRACHMA
+10143;N # GREEK ACROPHONIC ATTIC FIVE
+10144;N # GREEK ACROPHONIC ATTIC FIFTY
+10145;N # GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146;N # GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147;N # GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10148;N # GREEK ACROPHONIC ATTIC FIVE TALENTS
+10149;N # GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A;N # GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B;N # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C;N # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D;N # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E;N # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+1014F;N # GREEK ACROPHONIC ATTIC FIVE STATERS
+10150;N # GREEK ACROPHONIC ATTIC TEN STATERS
+10151;N # GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152;N # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153;N # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154;N # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155;N # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156;N # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157;N # GREEK ACROPHONIC ATTIC TEN MNAS
+10158;N # GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159;N # GREEK ACROPHONIC THESPIAN ONE
+1015A;N # GREEK ACROPHONIC HERMIONIAN ONE
+1015B;N # GREEK ACROPHONIC EPIDAUREAN TWO
+1015C;N # GREEK ACROPHONIC THESPIAN TWO
+1015D;N # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E;N # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+1015F;N # GREEK ACROPHONIC TROEZENIAN FIVE
+10160;N # GREEK ACROPHONIC TROEZENIAN TEN
+10161;N # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162;N # GREEK ACROPHONIC HERMIONIAN TEN
+10163;N # GREEK ACROPHONIC MESSENIAN TEN
+10164;N # GREEK ACROPHONIC THESPIAN TEN
+10165;N # GREEK ACROPHONIC THESPIAN THIRTY
+10166;N # GREEK ACROPHONIC TROEZENIAN FIFTY
+10167;N # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168;N # GREEK ACROPHONIC HERMIONIAN FIFTY
+10169;N # GREEK ACROPHONIC THESPIAN FIFTY
+1016A;N # GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B;N # GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C;N # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D;N # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E;N # GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F;N # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170;N # GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171;N # GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172;N # GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10173;N # GREEK ACROPHONIC DELPHIC FIVE MNAS
+10174;N # GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175;N # GREEK ONE HALF SIGN
+10176;N # GREEK ONE HALF SIGN ALTERNATE FORM
+10177;N # GREEK TWO THIRDS SIGN
+10178;N # GREEK THREE QUARTERS SIGN
+10179;N # GREEK YEAR SIGN
+1017A;N # GREEK TALENT SIGN
+1017B;N # GREEK DRACHMA SIGN
+1017C;N # GREEK OBOL SIGN
+1017D;N # GREEK TWO OBOLS SIGN
+1017E;N # GREEK THREE OBOLS SIGN
+1017F;N # GREEK FOUR OBOLS SIGN
+10180;N # GREEK FIVE OBOLS SIGN
+10181;N # GREEK METRETES SIGN
+10182;N # GREEK KYATHOS BASE SIGN
+10183;N # GREEK LITRA SIGN
+10184;N # GREEK OUNKIA SIGN
+10185;N # GREEK XESTES SIGN
+10186;N # GREEK ARTABE SIGN
+10187;N # GREEK AROURA SIGN
+10188;N # GREEK GRAMMA SIGN
+10189;N # GREEK TRYBLION BASE SIGN
+1018A;N # GREEK ZERO SIGN
+10300;N # OLD ITALIC LETTER A
+10301;N # OLD ITALIC LETTER BE
+10302;N # OLD ITALIC LETTER KE
+10303;N # OLD ITALIC LETTER DE
+10304;N # OLD ITALIC LETTER E
+10305;N # OLD ITALIC LETTER VE
+10306;N # OLD ITALIC LETTER ZE
+10307;N # OLD ITALIC LETTER HE
+10308;N # OLD ITALIC LETTER THE
+10309;N # OLD ITALIC LETTER I
+1030A;N # OLD ITALIC LETTER KA
+1030B;N # OLD ITALIC LETTER EL
+1030C;N # OLD ITALIC LETTER EM
+1030D;N # OLD ITALIC LETTER EN
+1030E;N # OLD ITALIC LETTER ESH
+1030F;N # OLD ITALIC LETTER O
+10310;N # OLD ITALIC LETTER PE
+10311;N # OLD ITALIC LETTER SHE
+10312;N # OLD ITALIC LETTER KU
+10313;N # OLD ITALIC LETTER ER
+10314;N # OLD ITALIC LETTER ES
+10315;N # OLD ITALIC LETTER TE
+10316;N # OLD ITALIC LETTER U
+10317;N # OLD ITALIC LETTER EKS
+10318;N # OLD ITALIC LETTER PHE
+10319;N # OLD ITALIC LETTER KHE
+1031A;N # OLD ITALIC LETTER EF
+1031B;N # OLD ITALIC LETTER ERS
+1031C;N # OLD ITALIC LETTER CHE
+1031D;N # OLD ITALIC LETTER II
+1031E;N # OLD ITALIC LETTER UU
+10320;N # OLD ITALIC NUMERAL ONE
+10321;N # OLD ITALIC NUMERAL FIVE
+10322;N # OLD ITALIC NUMERAL TEN
+10323;N # OLD ITALIC NUMERAL FIFTY
+10330;N # GOTHIC LETTER AHSA
+10331;N # GOTHIC LETTER BAIRKAN
+10332;N # GOTHIC LETTER GIBA
+10333;N # GOTHIC LETTER DAGS
+10334;N # GOTHIC LETTER AIHVUS
+10335;N # GOTHIC LETTER QAIRTHRA
+10336;N # GOTHIC LETTER IUJA
+10337;N # GOTHIC LETTER HAGL
+10338;N # GOTHIC LETTER THIUTH
+10339;N # GOTHIC LETTER EIS
+1033A;N # GOTHIC LETTER KUSMA
+1033B;N # GOTHIC LETTER LAGUS
+1033C;N # GOTHIC LETTER MANNA
+1033D;N # GOTHIC LETTER NAUTHS
+1033E;N # GOTHIC LETTER JER
+1033F;N # GOTHIC LETTER URUS
+10340;N # GOTHIC LETTER PAIRTHRA
+10341;N # GOTHIC LETTER NINETY
+10342;N # GOTHIC LETTER RAIDA
+10343;N # GOTHIC LETTER SAUIL
+10344;N # GOTHIC LETTER TEIWS
+10345;N # GOTHIC LETTER WINJA
+10346;N # GOTHIC LETTER FAIHU
+10347;N # GOTHIC LETTER IGGWS
+10348;N # GOTHIC LETTER HWAIR
+10349;N # GOTHIC LETTER OTHAL
+1034A;N # GOTHIC LETTER NINE HUNDRED
+10380;N # UGARITIC LETTER ALPA
+10381;N # UGARITIC LETTER BETA
+10382;N # UGARITIC LETTER GAMLA
+10383;N # UGARITIC LETTER KHA
+10384;N # UGARITIC LETTER DELTA
+10385;N # UGARITIC LETTER HO
+10386;N # UGARITIC LETTER WO
+10387;N # UGARITIC LETTER ZETA
+10388;N # UGARITIC LETTER HOTA
+10389;N # UGARITIC LETTER TET
+1038A;N # UGARITIC LETTER YOD
+1038B;N # UGARITIC LETTER KAF
+1038C;N # UGARITIC LETTER SHIN
+1038D;N # UGARITIC LETTER LAMDA
+1038E;N # UGARITIC LETTER MEM
+1038F;N # UGARITIC LETTER DHAL
+10390;N # UGARITIC LETTER NUN
+10391;N # UGARITIC LETTER ZU
+10392;N # UGARITIC LETTER SAMKA
+10393;N # UGARITIC LETTER AIN
+10394;N # UGARITIC LETTER PU
+10395;N # UGARITIC LETTER SADE
+10396;N # UGARITIC LETTER QOPA
+10397;N # UGARITIC LETTER RASHA
+10398;N # UGARITIC LETTER THANNA
+10399;N # UGARITIC LETTER GHAIN
+1039A;N # UGARITIC LETTER TO
+1039B;N # UGARITIC LETTER I
+1039C;N # UGARITIC LETTER U
+1039D;N # UGARITIC LETTER SSU
+1039F;N # UGARITIC WORD DIVIDER
+103A0;N # OLD PERSIAN SIGN A
+103A1;N # OLD PERSIAN SIGN I
+103A2;N # OLD PERSIAN SIGN U
+103A3;N # OLD PERSIAN SIGN KA
+103A4;N # OLD PERSIAN SIGN KU
+103A5;N # OLD PERSIAN SIGN GA
+103A6;N # OLD PERSIAN SIGN GU
+103A7;N # OLD PERSIAN SIGN XA
+103A8;N # OLD PERSIAN SIGN CA
+103A9;N # OLD PERSIAN SIGN JA
+103AA;N # OLD PERSIAN SIGN JI
+103AB;N # OLD PERSIAN SIGN TA
+103AC;N # OLD PERSIAN SIGN TU
+103AD;N # OLD PERSIAN SIGN DA
+103AE;N # OLD PERSIAN SIGN DI
+103AF;N # OLD PERSIAN SIGN DU
+103B0;N # OLD PERSIAN SIGN THA
+103B1;N # OLD PERSIAN SIGN PA
+103B2;N # OLD PERSIAN SIGN BA
+103B3;N # OLD PERSIAN SIGN FA
+103B4;N # OLD PERSIAN SIGN NA
+103B5;N # OLD PERSIAN SIGN NU
+103B6;N # OLD PERSIAN SIGN MA
+103B7;N # OLD PERSIAN SIGN MI
+103B8;N # OLD PERSIAN SIGN MU
+103B9;N # OLD PERSIAN SIGN YA
+103BA;N # OLD PERSIAN SIGN VA
+103BB;N # OLD PERSIAN SIGN VI
+103BC;N # OLD PERSIAN SIGN RA
+103BD;N # OLD PERSIAN SIGN RU
+103BE;N # OLD PERSIAN SIGN LA
+103BF;N # OLD PERSIAN SIGN SA
+103C0;N # OLD PERSIAN SIGN ZA
+103C1;N # OLD PERSIAN SIGN SHA
+103C2;N # OLD PERSIAN SIGN SSA
+103C3;N # OLD PERSIAN SIGN HA
+103C8;N # OLD PERSIAN SIGN AURAMAZDAA
+103C9;N # OLD PERSIAN SIGN AURAMAZDAA-2
+103CA;N # OLD PERSIAN SIGN AURAMAZDAAHA
+103CB;N # OLD PERSIAN SIGN XSHAAYATHIYA
+103CC;N # OLD PERSIAN SIGN DAHYAAUSH
+103CD;N # OLD PERSIAN SIGN DAHYAAUSH-2
+103CE;N # OLD PERSIAN SIGN BAGA
+103CF;N # OLD PERSIAN SIGN BUUMISH
+103D0;N # OLD PERSIAN WORD DIVIDER
+103D1;N # OLD PERSIAN NUMBER ONE
+103D2;N # OLD PERSIAN NUMBER TWO
+103D3;N # OLD PERSIAN NUMBER TEN
+103D4;N # OLD PERSIAN NUMBER TWENTY
+103D5;N # OLD PERSIAN NUMBER HUNDRED
+10400;N # DESERET CAPITAL LETTER LONG I
+10401;N # DESERET CAPITAL LETTER LONG E
+10402;N # DESERET CAPITAL LETTER LONG A
+10403;N # DESERET CAPITAL LETTER LONG AH
+10404;N # DESERET CAPITAL LETTER LONG O
+10405;N # DESERET CAPITAL LETTER LONG OO
+10406;N # DESERET CAPITAL LETTER SHORT I
+10407;N # DESERET CAPITAL LETTER SHORT E
+10408;N # DESERET CAPITAL LETTER SHORT A
+10409;N # DESERET CAPITAL LETTER SHORT AH
+1040A;N # DESERET CAPITAL LETTER SHORT O
+1040B;N # DESERET CAPITAL LETTER SHORT OO
+1040C;N # DESERET CAPITAL LETTER AY
+1040D;N # DESERET CAPITAL LETTER OW
+1040E;N # DESERET CAPITAL LETTER WU
+1040F;N # DESERET CAPITAL LETTER YEE
+10410;N # DESERET CAPITAL LETTER H
+10411;N # DESERET CAPITAL LETTER PEE
+10412;N # DESERET CAPITAL LETTER BEE
+10413;N # DESERET CAPITAL LETTER TEE
+10414;N # DESERET CAPITAL LETTER DEE
+10415;N # DESERET CAPITAL LETTER CHEE
+10416;N # DESERET CAPITAL LETTER JEE
+10417;N # DESERET CAPITAL LETTER KAY
+10418;N # DESERET CAPITAL LETTER GAY
+10419;N # DESERET CAPITAL LETTER EF
+1041A;N # DESERET CAPITAL LETTER VEE
+1041B;N # DESERET CAPITAL LETTER ETH
+1041C;N # DESERET CAPITAL LETTER THEE
+1041D;N # DESERET CAPITAL LETTER ES
+1041E;N # DESERET CAPITAL LETTER ZEE
+1041F;N # DESERET CAPITAL LETTER ESH
+10420;N # DESERET CAPITAL LETTER ZHEE
+10421;N # DESERET CAPITAL LETTER ER
+10422;N # DESERET CAPITAL LETTER EL
+10423;N # DESERET CAPITAL LETTER EM
+10424;N # DESERET CAPITAL LETTER EN
+10425;N # DESERET CAPITAL LETTER ENG
+10426;N # DESERET CAPITAL LETTER OI
+10427;N # DESERET CAPITAL LETTER EW
+10428;N # DESERET SMALL LETTER LONG I
+10429;N # DESERET SMALL LETTER LONG E
+1042A;N # DESERET SMALL LETTER LONG A
+1042B;N # DESERET SMALL LETTER LONG AH
+1042C;N # DESERET SMALL LETTER LONG O
+1042D;N # DESERET SMALL LETTER LONG OO
+1042E;N # DESERET SMALL LETTER SHORT I
+1042F;N # DESERET SMALL LETTER SHORT E
+10430;N # DESERET SMALL LETTER SHORT A
+10431;N # DESERET SMALL LETTER SHORT AH
+10432;N # DESERET SMALL LETTER SHORT O
+10433;N # DESERET SMALL LETTER SHORT OO
+10434;N # DESERET SMALL LETTER AY
+10435;N # DESERET SMALL LETTER OW
+10436;N # DESERET SMALL LETTER WU
+10437;N # DESERET SMALL LETTER YEE
+10438;N # DESERET SMALL LETTER H
+10439;N # DESERET SMALL LETTER PEE
+1043A;N # DESERET SMALL LETTER BEE
+1043B;N # DESERET SMALL LETTER TEE
+1043C;N # DESERET SMALL LETTER DEE
+1043D;N # DESERET SMALL LETTER CHEE
+1043E;N # DESERET SMALL LETTER JEE
+1043F;N # DESERET SMALL LETTER KAY
+10440;N # DESERET SMALL LETTER GAY
+10441;N # DESERET SMALL LETTER EF
+10442;N # DESERET SMALL LETTER VEE
+10443;N # DESERET SMALL LETTER ETH
+10444;N # DESERET SMALL LETTER THEE
+10445;N # DESERET SMALL LETTER ES
+10446;N # DESERET SMALL LETTER ZEE
+10447;N # DESERET SMALL LETTER ESH
+10448;N # DESERET SMALL LETTER ZHEE
+10449;N # DESERET SMALL LETTER ER
+1044A;N # DESERET SMALL LETTER EL
+1044B;N # DESERET SMALL LETTER EM
+1044C;N # DESERET SMALL LETTER EN
+1044D;N # DESERET SMALL LETTER ENG
+1044E;N # DESERET SMALL LETTER OI
+1044F;N # DESERET SMALL LETTER EW
+10450;N # SHAVIAN LETTER PEEP
+10451;N # SHAVIAN LETTER TOT
+10452;N # SHAVIAN LETTER KICK
+10453;N # SHAVIAN LETTER FEE
+10454;N # SHAVIAN LETTER THIGH
+10455;N # SHAVIAN LETTER SO
+10456;N # SHAVIAN LETTER SURE
+10457;N # SHAVIAN LETTER CHURCH
+10458;N # SHAVIAN LETTER YEA
+10459;N # SHAVIAN LETTER HUNG
+1045A;N # SHAVIAN LETTER BIB
+1045B;N # SHAVIAN LETTER DEAD
+1045C;N # SHAVIAN LETTER GAG
+1045D;N # SHAVIAN LETTER VOW
+1045E;N # SHAVIAN LETTER THEY
+1045F;N # SHAVIAN LETTER ZOO
+10460;N # SHAVIAN LETTER MEASURE
+10461;N # SHAVIAN LETTER JUDGE
+10462;N # SHAVIAN LETTER WOE
+10463;N # SHAVIAN LETTER HA-HA
+10464;N # SHAVIAN LETTER LOLL
+10465;N # SHAVIAN LETTER MIME
+10466;N # SHAVIAN LETTER IF
+10467;N # SHAVIAN LETTER EGG
+10468;N # SHAVIAN LETTER ASH
+10469;N # SHAVIAN LETTER ADO
+1046A;N # SHAVIAN LETTER ON
+1046B;N # SHAVIAN LETTER WOOL
+1046C;N # SHAVIAN LETTER OUT
+1046D;N # SHAVIAN LETTER AH
+1046E;N # SHAVIAN LETTER ROAR
+1046F;N # SHAVIAN LETTER NUN
+10470;N # SHAVIAN LETTER EAT
+10471;N # SHAVIAN LETTER AGE
+10472;N # SHAVIAN LETTER ICE
+10473;N # SHAVIAN LETTER UP
+10474;N # SHAVIAN LETTER OAK
+10475;N # SHAVIAN LETTER OOZE
+10476;N # SHAVIAN LETTER OIL
+10477;N # SHAVIAN LETTER AWE
+10478;N # SHAVIAN LETTER ARE
+10479;N # SHAVIAN LETTER OR
+1047A;N # SHAVIAN LETTER AIR
+1047B;N # SHAVIAN LETTER ERR
+1047C;N # SHAVIAN LETTER ARRAY
+1047D;N # SHAVIAN LETTER EAR
+1047E;N # SHAVIAN LETTER IAN
+1047F;N # SHAVIAN LETTER YEW
+10480;N # OSMANYA LETTER ALEF
+10481;N # OSMANYA LETTER BA
+10482;N # OSMANYA LETTER TA
+10483;N # OSMANYA LETTER JA
+10484;N # OSMANYA LETTER XA
+10485;N # OSMANYA LETTER KHA
+10486;N # OSMANYA LETTER DEEL
+10487;N # OSMANYA LETTER RA
+10488;N # OSMANYA LETTER SA
+10489;N # OSMANYA LETTER SHIIN
+1048A;N # OSMANYA LETTER DHA
+1048B;N # OSMANYA LETTER CAYN
+1048C;N # OSMANYA LETTER GA
+1048D;N # OSMANYA LETTER FA
+1048E;N # OSMANYA LETTER QAAF
+1048F;N # OSMANYA LETTER KAAF
+10490;N # OSMANYA LETTER LAAN
+10491;N # OSMANYA LETTER MIIN
+10492;N # OSMANYA LETTER NUUN
+10493;N # OSMANYA LETTER WAW
+10494;N # OSMANYA LETTER HA
+10495;N # OSMANYA LETTER YA
+10496;N # OSMANYA LETTER A
+10497;N # OSMANYA LETTER E
+10498;N # OSMANYA LETTER I
+10499;N # OSMANYA LETTER O
+1049A;N # OSMANYA LETTER U
+1049B;N # OSMANYA LETTER AA
+1049C;N # OSMANYA LETTER EE
+1049D;N # OSMANYA LETTER OO
+104A0;N # OSMANYA DIGIT ZERO
+104A1;N # OSMANYA DIGIT ONE
+104A2;N # OSMANYA DIGIT TWO
+104A3;N # OSMANYA DIGIT THREE
+104A4;N # OSMANYA DIGIT FOUR
+104A5;N # OSMANYA DIGIT FIVE
+104A6;N # OSMANYA DIGIT SIX
+104A7;N # OSMANYA DIGIT SEVEN
+104A8;N # OSMANYA DIGIT EIGHT
+104A9;N # OSMANYA DIGIT NINE
+10800;N # CYPRIOT SYLLABLE A
+10801;N # CYPRIOT SYLLABLE E
+10802;N # CYPRIOT SYLLABLE I
+10803;N # CYPRIOT SYLLABLE O
+10804;N # CYPRIOT SYLLABLE U
+10805;N # CYPRIOT SYLLABLE JA
+10808;N # CYPRIOT SYLLABLE JO
+1080A;N # CYPRIOT SYLLABLE KA
+1080B;N # CYPRIOT SYLLABLE KE
+1080C;N # CYPRIOT SYLLABLE KI
+1080D;N # CYPRIOT SYLLABLE KO
+1080E;N # CYPRIOT SYLLABLE KU
+1080F;N # CYPRIOT SYLLABLE LA
+10810;N # CYPRIOT SYLLABLE LE
+10811;N # CYPRIOT SYLLABLE LI
+10812;N # CYPRIOT SYLLABLE LO
+10813;N # CYPRIOT SYLLABLE LU
+10814;N # CYPRIOT SYLLABLE MA
+10815;N # CYPRIOT SYLLABLE ME
+10816;N # CYPRIOT SYLLABLE MI
+10817;N # CYPRIOT SYLLABLE MO
+10818;N # CYPRIOT SYLLABLE MU
+10819;N # CYPRIOT SYLLABLE NA
+1081A;N # CYPRIOT SYLLABLE NE
+1081B;N # CYPRIOT SYLLABLE NI
+1081C;N # CYPRIOT SYLLABLE NO
+1081D;N # CYPRIOT SYLLABLE NU
+1081E;N # CYPRIOT SYLLABLE PA
+1081F;N # CYPRIOT SYLLABLE PE
+10820;N # CYPRIOT SYLLABLE PI
+10821;N # CYPRIOT SYLLABLE PO
+10822;N # CYPRIOT SYLLABLE PU
+10823;N # CYPRIOT SYLLABLE RA
+10824;N # CYPRIOT SYLLABLE RE
+10825;N # CYPRIOT SYLLABLE RI
+10826;N # CYPRIOT SYLLABLE RO
+10827;N # CYPRIOT SYLLABLE RU
+10828;N # CYPRIOT SYLLABLE SA
+10829;N # CYPRIOT SYLLABLE SE
+1082A;N # CYPRIOT SYLLABLE SI
+1082B;N # CYPRIOT SYLLABLE SO
+1082C;N # CYPRIOT SYLLABLE SU
+1082D;N # CYPRIOT SYLLABLE TA
+1082E;N # CYPRIOT SYLLABLE TE
+1082F;N # CYPRIOT SYLLABLE TI
+10830;N # CYPRIOT SYLLABLE TO
+10831;N # CYPRIOT SYLLABLE TU
+10832;N # CYPRIOT SYLLABLE WA
+10833;N # CYPRIOT SYLLABLE WE
+10834;N # CYPRIOT SYLLABLE WI
+10835;N # CYPRIOT SYLLABLE WO
+10837;N # CYPRIOT SYLLABLE XA
+10838;N # CYPRIOT SYLLABLE XE
+1083C;N # CYPRIOT SYLLABLE ZA
+1083F;N # CYPRIOT SYLLABLE ZO
+10A00;N # KHAROSHTHI LETTER A
+10A01;N # KHAROSHTHI VOWEL SIGN I
+10A02;N # KHAROSHTHI VOWEL SIGN U
+10A03;N # KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05;N # KHAROSHTHI VOWEL SIGN E
+10A06;N # KHAROSHTHI VOWEL SIGN O
+10A0C;N # KHAROSHTHI VOWEL LENGTH MARK
+10A0D;N # KHAROSHTHI SIGN DOUBLE RING BELOW
+10A0E;N # KHAROSHTHI SIGN ANUSVARA
+10A0F;N # KHAROSHTHI SIGN VISARGA
+10A10;N # KHAROSHTHI LETTER KA
+10A11;N # KHAROSHTHI LETTER KHA
+10A12;N # KHAROSHTHI LETTER GA
+10A13;N # KHAROSHTHI LETTER GHA
+10A15;N # KHAROSHTHI LETTER CA
+10A16;N # KHAROSHTHI LETTER CHA
+10A17;N # KHAROSHTHI LETTER JA
+10A19;N # KHAROSHTHI LETTER NYA
+10A1A;N # KHAROSHTHI LETTER TTA
+10A1B;N # KHAROSHTHI LETTER TTHA
+10A1C;N # KHAROSHTHI LETTER DDA
+10A1D;N # KHAROSHTHI LETTER DDHA
+10A1E;N # KHAROSHTHI LETTER NNA
+10A1F;N # KHAROSHTHI LETTER TA
+10A20;N # KHAROSHTHI LETTER THA
+10A21;N # KHAROSHTHI LETTER DA
+10A22;N # KHAROSHTHI LETTER DHA
+10A23;N # KHAROSHTHI LETTER NA
+10A24;N # KHAROSHTHI LETTER PA
+10A25;N # KHAROSHTHI LETTER PHA
+10A26;N # KHAROSHTHI LETTER BA
+10A27;N # KHAROSHTHI LETTER BHA
+10A28;N # KHAROSHTHI LETTER MA
+10A29;N # KHAROSHTHI LETTER YA
+10A2A;N # KHAROSHTHI LETTER RA
+10A2B;N # KHAROSHTHI LETTER LA
+10A2C;N # KHAROSHTHI LETTER VA
+10A2D;N # KHAROSHTHI LETTER SHA
+10A2E;N # KHAROSHTHI LETTER SSA
+10A2F;N # KHAROSHTHI LETTER SA
+10A30;N # KHAROSHTHI LETTER ZA
+10A31;N # KHAROSHTHI LETTER HA
+10A32;N # KHAROSHTHI LETTER KKA
+10A33;N # KHAROSHTHI LETTER TTTHA
+10A38;N # KHAROSHTHI SIGN BAR ABOVE
+10A39;N # KHAROSHTHI SIGN CAUDA
+10A3A;N # KHAROSHTHI SIGN DOT BELOW
+10A3F;N # KHAROSHTHI VIRAMA
+10A40;N # KHAROSHTHI DIGIT ONE
+10A41;N # KHAROSHTHI DIGIT TWO
+10A42;N # KHAROSHTHI DIGIT THREE
+10A43;N # KHAROSHTHI DIGIT FOUR
+10A44;N # KHAROSHTHI NUMBER TEN
+10A45;N # KHAROSHTHI NUMBER TWENTY
+10A46;N # KHAROSHTHI NUMBER ONE HUNDRED
+10A47;N # KHAROSHTHI NUMBER ONE THOUSAND
+10A50;N # KHAROSHTHI PUNCTUATION DOT
+10A51;N # KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52;N # KHAROSHTHI PUNCTUATION CIRCLE
+10A53;N # KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54;N # KHAROSHTHI PUNCTUATION MANGALAM
+10A55;N # KHAROSHTHI PUNCTUATION LOTUS
+10A56;N # KHAROSHTHI PUNCTUATION DANDA
+10A57;N # KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58;N # KHAROSHTHI PUNCTUATION LINES
+1D000;N # BYZANTINE MUSICAL SYMBOL PSILI
+1D001;N # BYZANTINE MUSICAL SYMBOL DASEIA
+1D002;N # BYZANTINE MUSICAL SYMBOL PERISPOMENI
+1D003;N # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004;N # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005;N # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006;N # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007;N # BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008;N # BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009;N # BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A;N # BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B;N # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C;N # BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D;N # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E;N # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F;N # BYZANTINE MUSICAL SYMBOL TELEIA
+1D010;N # BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011;N # BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012;N # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013;N # BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014;N # BYZANTINE MUSICAL SYMBOL THITA
+1D015;N # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016;N # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017;N # BYZANTINE MUSICAL SYMBOL PSILON
+1D018;N # BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019;N # BYZANTINE MUSICAL SYMBOL VATHY
+1D01A;N # BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B;N # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C;N # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D;N # BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E;N # BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F;N # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020;N # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021;N # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022;N # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023;N # BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024;N # BYZANTINE MUSICAL SYMBOL KLASMA
+1D025;N # BYZANTINE MUSICAL SYMBOL REVMA
+1D026;N # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027;N # BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028;N # BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029;N # BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A;N # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B;N # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C;N # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D;N # BYZANTINE MUSICAL SYMBOL THEMA
+1D02E;N # BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F;N # BYZANTINE MUSICAL SYMBOL DYO
+1D030;N # BYZANTINE MUSICAL SYMBOL TRIA
+1D031;N # BYZANTINE MUSICAL SYMBOL TESSERA
+1D032;N # BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033;N # BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034;N # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035;N # BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036;N # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037;N # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038;N # BYZANTINE MUSICAL SYMBOL PELASTON
+1D039;N # BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A;N # BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B;N # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C;N # BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D;N # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E;N # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F;N # BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040;N # BYZANTINE MUSICAL SYMBOL NANA
+1D041;N # BYZANTINE MUSICAL SYMBOL PETASMA
+1D042;N # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043;N # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044;N # BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045;N # BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+1D046;N # BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047;N # BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048;N # BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049;N # BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A;N # BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B;N # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C;N # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D;N # BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E;N # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F;N # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050;N # BYZANTINE MUSICAL SYMBOL YPSILI
+1D051;N # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052;N # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053;N # BYZANTINE MUSICAL SYMBOL YPORROI
+1D054;N # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055;N # BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056;N # BYZANTINE MUSICAL SYMBOL CHAMILI
+1D057;N # BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058;N # BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059;N # BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A;N # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B;N # BYZANTINE MUSICAL SYMBOL OMALON
+1D05C;N # BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D;N # BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E;N # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F;N # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060;N # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061;N # BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062;N # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063;N # BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064;N # BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065;N # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066;N # BYZANTINE MUSICAL SYMBOL SYRMA
+1D067;N # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068;N # BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069;N # BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A;N # BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B;N # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C;N # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D;N # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E;N # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F;N # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070;N # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071;N # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072;N # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073;N # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074;N # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075;N # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076;N # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077;N # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078;N # BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079;N # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A;N # BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B;N # BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C;N # BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D;N # BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E;N # BYZANTINE MUSICAL SYMBOL STAVROS
+1D07F;N # BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080;N # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081;N # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082;N # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083;N # BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084;N # BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085;N # BYZANTINE MUSICAL SYMBOL APLI
+1D086;N # BYZANTINE MUSICAL SYMBOL DIPLI
+1D087;N # BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088;N # BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089;N # BYZANTINE MUSICAL SYMBOL KORONIS
+1D08A;N # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B;N # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C;N # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D;N # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E;N # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+1D08F;N # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090;N # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091;N # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092;N # BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093;N # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094;N # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095;N # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096;N # BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097;N # BYZANTINE MUSICAL SYMBOL ARGON
+1D098;N # BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099;N # BYZANTINE MUSICAL SYMBOL DIARGON
+1D09A;N # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B;N # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C;N # BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D;N # BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E;N # BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F;N # BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0;N # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1;N # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+1D0A2;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3;N # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4;N # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5;N # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9;N # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA;N # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC;N # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD;N # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE;N # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF;N # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0;N # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1;N # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3;N # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4;N # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+1D0B5;N # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6;N # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7;N # BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8;N # BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9;N # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC;N # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE;N # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2;N # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3;N # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4;N # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5;N # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+1D0C6;N # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7;N # BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8;N # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9;N # BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA;N # BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB;N # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC;N # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD;N # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE;N # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF;N # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0;N # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1;N # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2;N # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3;N # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4;N # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5;N # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6;N # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7;N # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8;N # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9;N # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA;N # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB;N # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC;N # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD;N # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1;N # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5;N # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6;N # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7;N # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8;N # BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9;N # BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA;N # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB;N # BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC;N # BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED;N # BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE;N # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF;N # BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+1D0F0;N # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1;N # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2;N # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3;N # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4;N # BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5;N # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100;N # MUSICAL SYMBOL SINGLE BARLINE
+1D101;N # MUSICAL SYMBOL DOUBLE BARLINE
+1D102;N # MUSICAL SYMBOL FINAL BARLINE
+1D103;N # MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104;N # MUSICAL SYMBOL DASHED BARLINE
+1D105;N # MUSICAL SYMBOL SHORT BARLINE
+1D106;N # MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107;N # MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108;N # MUSICAL SYMBOL REPEAT DOTS
+1D109;N # MUSICAL SYMBOL DAL SEGNO
+1D10A;N # MUSICAL SYMBOL DA CAPO
+1D10B;N # MUSICAL SYMBOL SEGNO
+1D10C;N # MUSICAL SYMBOL CODA
+1D10D;N # MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E;N # MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F;N # MUSICAL SYMBOL REPEATED FIGURE-3
+1D110;N # MUSICAL SYMBOL FERMATA
+1D111;N # MUSICAL SYMBOL FERMATA BELOW
+1D112;N # MUSICAL SYMBOL BREATH MARK
+1D113;N # MUSICAL SYMBOL CAESURA
+1D114;N # MUSICAL SYMBOL BRACE
+1D115;N # MUSICAL SYMBOL BRACKET
+1D116;N # MUSICAL SYMBOL ONE-LINE STAFF
+1D117;N # MUSICAL SYMBOL TWO-LINE STAFF
+1D118;N # MUSICAL SYMBOL THREE-LINE STAFF
+1D119;N # MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A;N # MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B;N # MUSICAL SYMBOL SIX-LINE STAFF
+1D11C;N # MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D;N # MUSICAL SYMBOL FOUR-STRING FRETBOARD
+1D11E;N # MUSICAL SYMBOL G CLEF
+1D11F;N # MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120;N # MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121;N # MUSICAL SYMBOL C CLEF
+1D122;N # MUSICAL SYMBOL F CLEF
+1D123;N # MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124;N # MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125;N # MUSICAL SYMBOL DRUM CLEF-1
+1D126;N # MUSICAL SYMBOL DRUM CLEF-2
+1D12A;N # MUSICAL SYMBOL DOUBLE SHARP
+1D12B;N # MUSICAL SYMBOL DOUBLE FLAT
+1D12C;N # MUSICAL SYMBOL FLAT UP
+1D12D;N # MUSICAL SYMBOL FLAT DOWN
+1D12E;N # MUSICAL SYMBOL NATURAL UP
+1D12F;N # MUSICAL SYMBOL NATURAL DOWN
+1D130;N # MUSICAL SYMBOL SHARP UP
+1D131;N # MUSICAL SYMBOL SHARP DOWN
+1D132;N # MUSICAL SYMBOL QUARTER TONE SHARP
+1D133;N # MUSICAL SYMBOL QUARTER TONE FLAT
+1D134;N # MUSICAL SYMBOL COMMON TIME
+1D135;N # MUSICAL SYMBOL CUT TIME
+1D136;N # MUSICAL SYMBOL OTTAVA ALTA
+1D137;N # MUSICAL SYMBOL OTTAVA BASSA
+1D138;N # MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139;N # MUSICAL SYMBOL QUINDICESIMA BASSA
+1D13A;N # MUSICAL SYMBOL MULTI REST
+1D13B;N # MUSICAL SYMBOL WHOLE REST
+1D13C;N # MUSICAL SYMBOL HALF REST
+1D13D;N # MUSICAL SYMBOL QUARTER REST
+1D13E;N # MUSICAL SYMBOL EIGHTH REST
+1D13F;N # MUSICAL SYMBOL SIXTEENTH REST
+1D140;N # MUSICAL SYMBOL THIRTY-SECOND REST
+1D141;N # MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142;N # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+1D143;N # MUSICAL SYMBOL X NOTEHEAD
+1D144;N # MUSICAL SYMBOL PLUS NOTEHEAD
+1D145;N # MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146;N # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147;N # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151;N # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152;N # MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153;N # MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154;N # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155;N # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156;N # MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157;N # MUSICAL SYMBOL VOID NOTEHEAD
+1D158;N # MUSICAL SYMBOL NOTEHEAD BLACK
+1D159;N # MUSICAL SYMBOL NULL NOTEHEAD
+1D15A;N # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B;N # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+1D15C;N # MUSICAL SYMBOL BREVE
+1D15D;N # MUSICAL SYMBOL WHOLE NOTE
+1D15E;N # MUSICAL SYMBOL HALF NOTE
+1D15F;N # MUSICAL SYMBOL QUARTER NOTE
+1D160;N # MUSICAL SYMBOL EIGHTH NOTE
+1D161;N # MUSICAL SYMBOL SIXTEENTH NOTE
+1D162;N # MUSICAL SYMBOL THIRTY-SECOND NOTE
+1D163;N # MUSICAL SYMBOL SIXTY-FOURTH NOTE
+1D164;N # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165;N # MUSICAL SYMBOL COMBINING STEM
+1D166;N # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167;N # MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168;N # MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169;N # MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A;N # MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B;N # MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C;N # MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D;N # MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D16E;N # MUSICAL SYMBOL COMBINING FLAG-1
+1D16F;N # MUSICAL SYMBOL COMBINING FLAG-2
+1D170;N # MUSICAL SYMBOL COMBINING FLAG-3
+1D171;N # MUSICAL SYMBOL COMBINING FLAG-4
+1D172;N # MUSICAL SYMBOL COMBINING FLAG-5
+1D173;N # MUSICAL SYMBOL BEGIN BEAM
+1D174;N # MUSICAL SYMBOL END BEAM
+1D175;N # MUSICAL SYMBOL BEGIN TIE
+1D176;N # MUSICAL SYMBOL END TIE
+1D177;N # MUSICAL SYMBOL BEGIN SLUR
+1D178;N # MUSICAL SYMBOL END SLUR
+1D179;N # MUSICAL SYMBOL BEGIN PHRASE
+1D17A;N # MUSICAL SYMBOL END PHRASE
+1D17B;N # MUSICAL SYMBOL COMBINING ACCENT
+1D17C;N # MUSICAL SYMBOL COMBINING STACCATO
+1D17D;N # MUSICAL SYMBOL COMBINING TENUTO
+1D17E;N # MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F;N # MUSICAL SYMBOL COMBINING MARCATO
+1D180;N # MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181;N # MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182;N # MUSICAL SYMBOL COMBINING LOURE
+1D183;N # MUSICAL SYMBOL ARPEGGIATO UP
+1D184;N # MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185;N # MUSICAL SYMBOL COMBINING DOIT
+1D186;N # MUSICAL SYMBOL COMBINING RIP
+1D187;N # MUSICAL SYMBOL COMBINING FLIP
+1D188;N # MUSICAL SYMBOL COMBINING SMEAR
+1D189;N # MUSICAL SYMBOL COMBINING BEND
+1D18A;N # MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B;N # MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C;N # MUSICAL SYMBOL RINFORZANDO
+1D18D;N # MUSICAL SYMBOL SUBITO
+1D18E;N # MUSICAL SYMBOL Z
+1D18F;N # MUSICAL SYMBOL PIANO
+1D190;N # MUSICAL SYMBOL MEZZO
+1D191;N # MUSICAL SYMBOL FORTE
+1D192;N # MUSICAL SYMBOL CRESCENDO
+1D193;N # MUSICAL SYMBOL DECRESCENDO
+1D194;N # MUSICAL SYMBOL GRACE NOTE SLASH
+1D195;N # MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196;N # MUSICAL SYMBOL TR
+1D197;N # MUSICAL SYMBOL TURN
+1D198;N # MUSICAL SYMBOL INVERTED TURN
+1D199;N # MUSICAL SYMBOL TURN SLASH
+1D19A;N # MUSICAL SYMBOL TURN UP
+1D19B;N # MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C;N # MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D;N # MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E;N # MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F;N # MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0;N # MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1;N # MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2;N # MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3;N # MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4;N # MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5;N # MUSICAL SYMBOL ORNAMENT STROKE-11
+1D1A6;N # MUSICAL SYMBOL HAUPTSTIMME
+1D1A7;N # MUSICAL SYMBOL NEBENSTIMME
+1D1A8;N # MUSICAL SYMBOL END OF STIMME
+1D1A9;N # MUSICAL SYMBOL DEGREE SLASH
+1D1AA;N # MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB;N # MUSICAL SYMBOL COMBINING UP BOW
+1D1AC;N # MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD;N # MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE;N # MUSICAL SYMBOL PEDAL MARK
+1D1AF;N # MUSICAL SYMBOL PEDAL UP MARK
+1D1B0;N # MUSICAL SYMBOL HALF PEDAL MARK
+1D1B1;N # MUSICAL SYMBOL GLISSANDO UP
+1D1B2;N # MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3;N # MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4;N # MUSICAL SYMBOL DAMP
+1D1B5;N # MUSICAL SYMBOL DAMP ALL
+1D1B6;N # MUSICAL SYMBOL MAXIMA
+1D1B7;N # MUSICAL SYMBOL LONGA
+1D1B8;N # MUSICAL SYMBOL BREVIS
+1D1B9;N # MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA;N # MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB;N # MUSICAL SYMBOL MINIMA
+1D1BC;N # MUSICAL SYMBOL MINIMA BLACK
+1D1BD;N # MUSICAL SYMBOL SEMIMINIMA WHITE
+1D1BE;N # MUSICAL SYMBOL SEMIMINIMA BLACK
+1D1BF;N # MUSICAL SYMBOL FUSA WHITE
+1D1C0;N # MUSICAL SYMBOL FUSA BLACK
+1D1C1;N # MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2;N # MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3;N # MUSICAL SYMBOL BREVIS REST
+1D1C4;N # MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5;N # MUSICAL SYMBOL MINIMA REST
+1D1C6;N # MUSICAL SYMBOL SEMIMINIMA REST
+1D1C7;N # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8;N # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9;N # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE;N # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+1D1CF;N # MUSICAL SYMBOL CROIX
+1D1D0;N # MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1;N # MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2;N # MUSICAL SYMBOL SQUARE B
+1D1D3;N # MUSICAL SYMBOL VIRGA
+1D1D4;N # MUSICAL SYMBOL PODATUS
+1D1D5;N # MUSICAL SYMBOL CLIVIS
+1D1D6;N # MUSICAL SYMBOL SCANDICUS
+1D1D7;N # MUSICAL SYMBOL CLIMACUS
+1D1D8;N # MUSICAL SYMBOL TORCULUS
+1D1D9;N # MUSICAL SYMBOL PORRECTUS
+1D1DA;N # MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB;N # MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC;N # MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD;N # MUSICAL SYMBOL PES SUBPUNCTIS
+1D200;N # GREEK VOCAL NOTATION SYMBOL-1
+1D201;N # GREEK VOCAL NOTATION SYMBOL-2
+1D202;N # GREEK VOCAL NOTATION SYMBOL-3
+1D203;N # GREEK VOCAL NOTATION SYMBOL-4
+1D204;N # GREEK VOCAL NOTATION SYMBOL-5
+1D205;N # GREEK VOCAL NOTATION SYMBOL-6
+1D206;N # GREEK VOCAL NOTATION SYMBOL-7
+1D207;N # GREEK VOCAL NOTATION SYMBOL-8
+1D208;N # GREEK VOCAL NOTATION SYMBOL-9
+1D209;N # GREEK VOCAL NOTATION SYMBOL-10
+1D20A;N # GREEK VOCAL NOTATION SYMBOL-11
+1D20B;N # GREEK VOCAL NOTATION SYMBOL-12
+1D20C;N # GREEK VOCAL NOTATION SYMBOL-13
+1D20D;N # GREEK VOCAL NOTATION SYMBOL-14
+1D20E;N # GREEK VOCAL NOTATION SYMBOL-15
+1D20F;N # GREEK VOCAL NOTATION SYMBOL-16
+1D210;N # GREEK VOCAL NOTATION SYMBOL-17
+1D211;N # GREEK VOCAL NOTATION SYMBOL-18
+1D212;N # GREEK VOCAL NOTATION SYMBOL-19
+1D213;N # GREEK VOCAL NOTATION SYMBOL-20
+1D214;N # GREEK VOCAL NOTATION SYMBOL-21
+1D215;N # GREEK VOCAL NOTATION SYMBOL-22
+1D216;N # GREEK VOCAL NOTATION SYMBOL-23
+1D217;N # GREEK VOCAL NOTATION SYMBOL-24
+1D218;N # GREEK VOCAL NOTATION SYMBOL-50
+1D219;N # GREEK VOCAL NOTATION SYMBOL-51
+1D21A;N # GREEK VOCAL NOTATION SYMBOL-52
+1D21B;N # GREEK VOCAL NOTATION SYMBOL-53
+1D21C;N # GREEK VOCAL NOTATION SYMBOL-54
+1D21D;N # GREEK INSTRUMENTAL NOTATION SYMBOL-1
+1D21E;N # GREEK INSTRUMENTAL NOTATION SYMBOL-2
+1D21F;N # GREEK INSTRUMENTAL NOTATION SYMBOL-4
+1D220;N # GREEK INSTRUMENTAL NOTATION SYMBOL-5
+1D221;N # GREEK INSTRUMENTAL NOTATION SYMBOL-7
+1D222;N # GREEK INSTRUMENTAL NOTATION SYMBOL-8
+1D223;N # GREEK INSTRUMENTAL NOTATION SYMBOL-11
+1D224;N # GREEK INSTRUMENTAL NOTATION SYMBOL-12
+1D225;N # GREEK INSTRUMENTAL NOTATION SYMBOL-13
+1D226;N # GREEK INSTRUMENTAL NOTATION SYMBOL-14
+1D227;N # GREEK INSTRUMENTAL NOTATION SYMBOL-17
+1D228;N # GREEK INSTRUMENTAL NOTATION SYMBOL-18
+1D229;N # GREEK INSTRUMENTAL NOTATION SYMBOL-19
+1D22A;N # GREEK INSTRUMENTAL NOTATION SYMBOL-23
+1D22B;N # GREEK INSTRUMENTAL NOTATION SYMBOL-24
+1D22C;N # GREEK INSTRUMENTAL NOTATION SYMBOL-25
+1D22D;N # GREEK INSTRUMENTAL NOTATION SYMBOL-26
+1D22E;N # GREEK INSTRUMENTAL NOTATION SYMBOL-27
+1D22F;N # GREEK INSTRUMENTAL NOTATION SYMBOL-29
+1D230;N # GREEK INSTRUMENTAL NOTATION SYMBOL-30
+1D231;N # GREEK INSTRUMENTAL NOTATION SYMBOL-32
+1D232;N # GREEK INSTRUMENTAL NOTATION SYMBOL-36
+1D233;N # GREEK INSTRUMENTAL NOTATION SYMBOL-37
+1D234;N # GREEK INSTRUMENTAL NOTATION SYMBOL-38
+1D235;N # GREEK INSTRUMENTAL NOTATION SYMBOL-39
+1D236;N # GREEK INSTRUMENTAL NOTATION SYMBOL-40
+1D237;N # GREEK INSTRUMENTAL NOTATION SYMBOL-42
+1D238;N # GREEK INSTRUMENTAL NOTATION SYMBOL-43
+1D239;N # GREEK INSTRUMENTAL NOTATION SYMBOL-45
+1D23A;N # GREEK INSTRUMENTAL NOTATION SYMBOL-47
+1D23B;N # GREEK INSTRUMENTAL NOTATION SYMBOL-48
+1D23C;N # GREEK INSTRUMENTAL NOTATION SYMBOL-49
+1D23D;N # GREEK INSTRUMENTAL NOTATION SYMBOL-50
+1D23E;N # GREEK INSTRUMENTAL NOTATION SYMBOL-51
+1D23F;N # GREEK INSTRUMENTAL NOTATION SYMBOL-52
+1D240;N # GREEK INSTRUMENTAL NOTATION SYMBOL-53
+1D241;N # GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242;N # COMBINING GREEK MUSICAL TRISEME
+1D243;N # COMBINING GREEK MUSICAL TETRASEME
+1D244;N # COMBINING GREEK MUSICAL PENTASEME
+1D245;N # GREEK MUSICAL LEIMMA
+1D300;N # MONOGRAM FOR EARTH
+1D301;N # DIGRAM FOR HEAVENLY EARTH
+1D302;N # DIGRAM FOR HUMAN EARTH
+1D303;N # DIGRAM FOR EARTHLY HEAVEN
+1D304;N # DIGRAM FOR EARTHLY HUMAN
+1D305;N # DIGRAM FOR EARTH
+1D306;N # TETRAGRAM FOR CENTRE
+1D307;N # TETRAGRAM FOR FULL CIRCLE
+1D308;N # TETRAGRAM FOR MIRED
+1D309;N # TETRAGRAM FOR BARRIER
+1D30A;N # TETRAGRAM FOR KEEPING SMALL
+1D30B;N # TETRAGRAM FOR CONTRARIETY
+1D30C;N # TETRAGRAM FOR ASCENT
+1D30D;N # TETRAGRAM FOR OPPOSITION
+1D30E;N # TETRAGRAM FOR BRANCHING OUT
+1D30F;N # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310;N # TETRAGRAM FOR DIVERGENCE
+1D311;N # TETRAGRAM FOR YOUTHFULNESS
+1D312;N # TETRAGRAM FOR INCREASE
+1D313;N # TETRAGRAM FOR PENETRATION
+1D314;N # TETRAGRAM FOR REACH
+1D315;N # TETRAGRAM FOR CONTACT
+1D316;N # TETRAGRAM FOR HOLDING BACK
+1D317;N # TETRAGRAM FOR WAITING
+1D318;N # TETRAGRAM FOR FOLLOWING
+1D319;N # TETRAGRAM FOR ADVANCE
+1D31A;N # TETRAGRAM FOR RELEASE
+1D31B;N # TETRAGRAM FOR RESISTANCE
+1D31C;N # TETRAGRAM FOR EASE
+1D31D;N # TETRAGRAM FOR JOY
+1D31E;N # TETRAGRAM FOR CONTENTION
+1D31F;N # TETRAGRAM FOR ENDEAVOUR
+1D320;N # TETRAGRAM FOR DUTIES
+1D321;N # TETRAGRAM FOR CHANGE
+1D322;N # TETRAGRAM FOR DECISIVENESS
+1D323;N # TETRAGRAM FOR BOLD RESOLUTION
+1D324;N # TETRAGRAM FOR PACKING
+1D325;N # TETRAGRAM FOR LEGION
+1D326;N # TETRAGRAM FOR CLOSENESS
+1D327;N # TETRAGRAM FOR KINSHIP
+1D328;N # TETRAGRAM FOR GATHERING
+1D329;N # TETRAGRAM FOR STRENGTH
+1D32A;N # TETRAGRAM FOR PURITY
+1D32B;N # TETRAGRAM FOR FULLNESS
+1D32C;N # TETRAGRAM FOR RESIDENCE
+1D32D;N # TETRAGRAM FOR LAW OR MODEL
+1D32E;N # TETRAGRAM FOR RESPONSE
+1D32F;N # TETRAGRAM FOR GOING TO MEET
+1D330;N # TETRAGRAM FOR ENCOUNTERS
+1D331;N # TETRAGRAM FOR STOVE
+1D332;N # TETRAGRAM FOR GREATNESS
+1D333;N # TETRAGRAM FOR ENLARGEMENT
+1D334;N # TETRAGRAM FOR PATTERN
+1D335;N # TETRAGRAM FOR RITUAL
+1D336;N # TETRAGRAM FOR FLIGHT
+1D337;N # TETRAGRAM FOR VASTNESS OR WASTING
+1D338;N # TETRAGRAM FOR CONSTANCY
+1D339;N # TETRAGRAM FOR MEASURE
+1D33A;N # TETRAGRAM FOR ETERNITY
+1D33B;N # TETRAGRAM FOR UNITY
+1D33C;N # TETRAGRAM FOR DIMINISHMENT
+1D33D;N # TETRAGRAM FOR CLOSED MOUTH
+1D33E;N # TETRAGRAM FOR GUARDEDNESS
+1D33F;N # TETRAGRAM FOR GATHERING IN
+1D340;N # TETRAGRAM FOR MASSING
+1D341;N # TETRAGRAM FOR ACCUMULATION
+1D342;N # TETRAGRAM FOR EMBELLISHMENT
+1D343;N # TETRAGRAM FOR DOUBT
+1D344;N # TETRAGRAM FOR WATCH
+1D345;N # TETRAGRAM FOR SINKING
+1D346;N # TETRAGRAM FOR INNER
+1D347;N # TETRAGRAM FOR DEPARTURE
+1D348;N # TETRAGRAM FOR DARKENING
+1D349;N # TETRAGRAM FOR DIMMING
+1D34A;N # TETRAGRAM FOR EXHAUSTION
+1D34B;N # TETRAGRAM FOR SEVERANCE
+1D34C;N # TETRAGRAM FOR STOPPAGE
+1D34D;N # TETRAGRAM FOR HARDNESS
+1D34E;N # TETRAGRAM FOR COMPLETION
+1D34F;N # TETRAGRAM FOR CLOSURE
+1D350;N # TETRAGRAM FOR FAILURE
+1D351;N # TETRAGRAM FOR AGGRAVATION
+1D352;N # TETRAGRAM FOR COMPLIANCE
+1D353;N # TETRAGRAM FOR ON THE VERGE
+1D354;N # TETRAGRAM FOR DIFFICULTIES
+1D355;N # TETRAGRAM FOR LABOURING
+1D356;N # TETRAGRAM FOR FOSTERING
+1D400;N # MATHEMATICAL BOLD CAPITAL A
+1D401;N # MATHEMATICAL BOLD CAPITAL B
+1D402;N # MATHEMATICAL BOLD CAPITAL C
+1D403;N # MATHEMATICAL BOLD CAPITAL D
+1D404;N # MATHEMATICAL BOLD CAPITAL E
+1D405;N # MATHEMATICAL BOLD CAPITAL F
+1D406;N # MATHEMATICAL BOLD CAPITAL G
+1D407;N # MATHEMATICAL BOLD CAPITAL H
+1D408;N # MATHEMATICAL BOLD CAPITAL I
+1D409;N # MATHEMATICAL BOLD CAPITAL J
+1D40A;N # MATHEMATICAL BOLD CAPITAL K
+1D40B;N # MATHEMATICAL BOLD CAPITAL L
+1D40C;N # MATHEMATICAL BOLD CAPITAL M
+1D40D;N # MATHEMATICAL BOLD CAPITAL N
+1D40E;N # MATHEMATICAL BOLD CAPITAL O
+1D40F;N # MATHEMATICAL BOLD CAPITAL P
+1D410;N # MATHEMATICAL BOLD CAPITAL Q
+1D411;N # MATHEMATICAL BOLD CAPITAL R
+1D412;N # MATHEMATICAL BOLD CAPITAL S
+1D413;N # MATHEMATICAL BOLD CAPITAL T
+1D414;N # MATHEMATICAL BOLD CAPITAL U
+1D415;N # MATHEMATICAL BOLD CAPITAL V
+1D416;N # MATHEMATICAL BOLD CAPITAL W
+1D417;N # MATHEMATICAL BOLD CAPITAL X
+1D418;N # MATHEMATICAL BOLD CAPITAL Y
+1D419;N # MATHEMATICAL BOLD CAPITAL Z
+1D41A;N # MATHEMATICAL BOLD SMALL A
+1D41B;N # MATHEMATICAL BOLD SMALL B
+1D41C;N # MATHEMATICAL BOLD SMALL C
+1D41D;N # MATHEMATICAL BOLD SMALL D
+1D41E;N # MATHEMATICAL BOLD SMALL E
+1D41F;N # MATHEMATICAL BOLD SMALL F
+1D420;N # MATHEMATICAL BOLD SMALL G
+1D421;N # MATHEMATICAL BOLD SMALL H
+1D422;N # MATHEMATICAL BOLD SMALL I
+1D423;N # MATHEMATICAL BOLD SMALL J
+1D424;N # MATHEMATICAL BOLD SMALL K
+1D425;N # MATHEMATICAL BOLD SMALL L
+1D426;N # MATHEMATICAL BOLD SMALL M
+1D427;N # MATHEMATICAL BOLD SMALL N
+1D428;N # MATHEMATICAL BOLD SMALL O
+1D429;N # MATHEMATICAL BOLD SMALL P
+1D42A;N # MATHEMATICAL BOLD SMALL Q
+1D42B;N # MATHEMATICAL BOLD SMALL R
+1D42C;N # MATHEMATICAL BOLD SMALL S
+1D42D;N # MATHEMATICAL BOLD SMALL T
+1D42E;N # MATHEMATICAL BOLD SMALL U
+1D42F;N # MATHEMATICAL BOLD SMALL V
+1D430;N # MATHEMATICAL BOLD SMALL W
+1D431;N # MATHEMATICAL BOLD SMALL X
+1D432;N # MATHEMATICAL BOLD SMALL Y
+1D433;N # MATHEMATICAL BOLD SMALL Z
+1D434;N # MATHEMATICAL ITALIC CAPITAL A
+1D435;N # MATHEMATICAL ITALIC CAPITAL B
+1D436;N # MATHEMATICAL ITALIC CAPITAL C
+1D437;N # MATHEMATICAL ITALIC CAPITAL D
+1D438;N # MATHEMATICAL ITALIC CAPITAL E
+1D439;N # MATHEMATICAL ITALIC CAPITAL F
+1D43A;N # MATHEMATICAL ITALIC CAPITAL G
+1D43B;N # MATHEMATICAL ITALIC CAPITAL H
+1D43C;N # MATHEMATICAL ITALIC CAPITAL I
+1D43D;N # MATHEMATICAL ITALIC CAPITAL J
+1D43E;N # MATHEMATICAL ITALIC CAPITAL K
+1D43F;N # MATHEMATICAL ITALIC CAPITAL L
+1D440;N # MATHEMATICAL ITALIC CAPITAL M
+1D441;N # MATHEMATICAL ITALIC CAPITAL N
+1D442;N # MATHEMATICAL ITALIC CAPITAL O
+1D443;N # MATHEMATICAL ITALIC CAPITAL P
+1D444;N # MATHEMATICAL ITALIC CAPITAL Q
+1D445;N # MATHEMATICAL ITALIC CAPITAL R
+1D446;N # MATHEMATICAL ITALIC CAPITAL S
+1D447;N # MATHEMATICAL ITALIC CAPITAL T
+1D448;N # MATHEMATICAL ITALIC CAPITAL U
+1D449;N # MATHEMATICAL ITALIC CAPITAL V
+1D44A;N # MATHEMATICAL ITALIC CAPITAL W
+1D44B;N # MATHEMATICAL ITALIC CAPITAL X
+1D44C;N # MATHEMATICAL ITALIC CAPITAL Y
+1D44D;N # MATHEMATICAL ITALIC CAPITAL Z
+1D44E;N # MATHEMATICAL ITALIC SMALL A
+1D44F;N # MATHEMATICAL ITALIC SMALL B
+1D450;N # MATHEMATICAL ITALIC SMALL C
+1D451;N # MATHEMATICAL ITALIC SMALL D
+1D452;N # MATHEMATICAL ITALIC SMALL E
+1D453;N # MATHEMATICAL ITALIC SMALL F
+1D454;N # MATHEMATICAL ITALIC SMALL G
+1D456;N # MATHEMATICAL ITALIC SMALL I
+1D457;N # MATHEMATICAL ITALIC SMALL J
+1D458;N # MATHEMATICAL ITALIC SMALL K
+1D459;N # MATHEMATICAL ITALIC SMALL L
+1D45A;N # MATHEMATICAL ITALIC SMALL M
+1D45B;N # MATHEMATICAL ITALIC SMALL N
+1D45C;N # MATHEMATICAL ITALIC SMALL O
+1D45D;N # MATHEMATICAL ITALIC SMALL P
+1D45E;N # MATHEMATICAL ITALIC SMALL Q
+1D45F;N # MATHEMATICAL ITALIC SMALL R
+1D460;N # MATHEMATICAL ITALIC SMALL S
+1D461;N # MATHEMATICAL ITALIC SMALL T
+1D462;N # MATHEMATICAL ITALIC SMALL U
+1D463;N # MATHEMATICAL ITALIC SMALL V
+1D464;N # MATHEMATICAL ITALIC SMALL W
+1D465;N # MATHEMATICAL ITALIC SMALL X
+1D466;N # MATHEMATICAL ITALIC SMALL Y
+1D467;N # MATHEMATICAL ITALIC SMALL Z
+1D468;N # MATHEMATICAL BOLD ITALIC CAPITAL A
+1D469;N # MATHEMATICAL BOLD ITALIC CAPITAL B
+1D46A;N # MATHEMATICAL BOLD ITALIC CAPITAL C
+1D46B;N # MATHEMATICAL BOLD ITALIC CAPITAL D
+1D46C;N # MATHEMATICAL BOLD ITALIC CAPITAL E
+1D46D;N # MATHEMATICAL BOLD ITALIC CAPITAL F
+1D46E;N # MATHEMATICAL BOLD ITALIC CAPITAL G
+1D46F;N # MATHEMATICAL BOLD ITALIC CAPITAL H
+1D470;N # MATHEMATICAL BOLD ITALIC CAPITAL I
+1D471;N # MATHEMATICAL BOLD ITALIC CAPITAL J
+1D472;N # MATHEMATICAL BOLD ITALIC CAPITAL K
+1D473;N # MATHEMATICAL BOLD ITALIC CAPITAL L
+1D474;N # MATHEMATICAL BOLD ITALIC CAPITAL M
+1D475;N # MATHEMATICAL BOLD ITALIC CAPITAL N
+1D476;N # MATHEMATICAL BOLD ITALIC CAPITAL O
+1D477;N # MATHEMATICAL BOLD ITALIC CAPITAL P
+1D478;N # MATHEMATICAL BOLD ITALIC CAPITAL Q
+1D479;N # MATHEMATICAL BOLD ITALIC CAPITAL R
+1D47A;N # MATHEMATICAL BOLD ITALIC CAPITAL S
+1D47B;N # MATHEMATICAL BOLD ITALIC CAPITAL T
+1D47C;N # MATHEMATICAL BOLD ITALIC CAPITAL U
+1D47D;N # MATHEMATICAL BOLD ITALIC CAPITAL V
+1D47E;N # MATHEMATICAL BOLD ITALIC CAPITAL W
+1D47F;N # MATHEMATICAL BOLD ITALIC CAPITAL X
+1D480;N # MATHEMATICAL BOLD ITALIC CAPITAL Y
+1D481;N # MATHEMATICAL BOLD ITALIC CAPITAL Z
+1D482;N # MATHEMATICAL BOLD ITALIC SMALL A
+1D483;N # MATHEMATICAL BOLD ITALIC SMALL B
+1D484;N # MATHEMATICAL BOLD ITALIC SMALL C
+1D485;N # MATHEMATICAL BOLD ITALIC SMALL D
+1D486;N # MATHEMATICAL BOLD ITALIC SMALL E
+1D487;N # MATHEMATICAL BOLD ITALIC SMALL F
+1D488;N # MATHEMATICAL BOLD ITALIC SMALL G
+1D489;N # MATHEMATICAL BOLD ITALIC SMALL H
+1D48A;N # MATHEMATICAL BOLD ITALIC SMALL I
+1D48B;N # MATHEMATICAL BOLD ITALIC SMALL J
+1D48C;N # MATHEMATICAL BOLD ITALIC SMALL K
+1D48D;N # MATHEMATICAL BOLD ITALIC SMALL L
+1D48E;N # MATHEMATICAL BOLD ITALIC SMALL M
+1D48F;N # MATHEMATICAL BOLD ITALIC SMALL N
+1D490;N # MATHEMATICAL BOLD ITALIC SMALL O
+1D491;N # MATHEMATICAL BOLD ITALIC SMALL P
+1D492;N # MATHEMATICAL BOLD ITALIC SMALL Q
+1D493;N # MATHEMATICAL BOLD ITALIC SMALL R
+1D494;N # MATHEMATICAL BOLD ITALIC SMALL S
+1D495;N # MATHEMATICAL BOLD ITALIC SMALL T
+1D496;N # MATHEMATICAL BOLD ITALIC SMALL U
+1D497;N # MATHEMATICAL BOLD ITALIC SMALL V
+1D498;N # MATHEMATICAL BOLD ITALIC SMALL W
+1D499;N # MATHEMATICAL BOLD ITALIC SMALL X
+1D49A;N # MATHEMATICAL BOLD ITALIC SMALL Y
+1D49B;N # MATHEMATICAL BOLD ITALIC SMALL Z
+1D49C;N # MATHEMATICAL SCRIPT CAPITAL A
+1D49E;N # MATHEMATICAL SCRIPT CAPITAL C
+1D49F;N # MATHEMATICAL SCRIPT CAPITAL D
+1D4A2;N # MATHEMATICAL SCRIPT CAPITAL G
+1D4A5;N # MATHEMATICAL SCRIPT CAPITAL J
+1D4A6;N # MATHEMATICAL SCRIPT CAPITAL K
+1D4A9;N # MATHEMATICAL SCRIPT CAPITAL N
+1D4AA;N # MATHEMATICAL SCRIPT CAPITAL O
+1D4AB;N # MATHEMATICAL SCRIPT CAPITAL P
+1D4AC;N # MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE;N # MATHEMATICAL SCRIPT CAPITAL S
+1D4AF;N # MATHEMATICAL SCRIPT CAPITAL T
+1D4B0;N # MATHEMATICAL SCRIPT CAPITAL U
+1D4B1;N # MATHEMATICAL SCRIPT CAPITAL V
+1D4B2;N # MATHEMATICAL SCRIPT CAPITAL W
+1D4B3;N # MATHEMATICAL SCRIPT CAPITAL X
+1D4B4;N # MATHEMATICAL SCRIPT CAPITAL Y
+1D4B5;N # MATHEMATICAL SCRIPT CAPITAL Z
+1D4B6;N # MATHEMATICAL SCRIPT SMALL A
+1D4B7;N # MATHEMATICAL SCRIPT SMALL B
+1D4B8;N # MATHEMATICAL SCRIPT SMALL C
+1D4B9;N # MATHEMATICAL SCRIPT SMALL D
+1D4BB;N # MATHEMATICAL SCRIPT SMALL F
+1D4BD;N # MATHEMATICAL SCRIPT SMALL H
+1D4BE;N # MATHEMATICAL SCRIPT SMALL I
+1D4BF;N # MATHEMATICAL SCRIPT SMALL J
+1D4C0;N # MATHEMATICAL SCRIPT SMALL K
+1D4C1;N # MATHEMATICAL SCRIPT SMALL L
+1D4C2;N # MATHEMATICAL SCRIPT SMALL M
+1D4C3;N # MATHEMATICAL SCRIPT SMALL N
+1D4C5;N # MATHEMATICAL SCRIPT SMALL P
+1D4C6;N # MATHEMATICAL SCRIPT SMALL Q
+1D4C7;N # MATHEMATICAL SCRIPT SMALL R
+1D4C8;N # MATHEMATICAL SCRIPT SMALL S
+1D4C9;N # MATHEMATICAL SCRIPT SMALL T
+1D4CA;N # MATHEMATICAL SCRIPT SMALL U
+1D4CB;N # MATHEMATICAL SCRIPT SMALL V
+1D4CC;N # MATHEMATICAL SCRIPT SMALL W
+1D4CD;N # MATHEMATICAL SCRIPT SMALL X
+1D4CE;N # MATHEMATICAL SCRIPT SMALL Y
+1D4CF;N # MATHEMATICAL SCRIPT SMALL Z
+1D4D0;N # MATHEMATICAL BOLD SCRIPT CAPITAL A
+1D4D1;N # MATHEMATICAL BOLD SCRIPT CAPITAL B
+1D4D2;N # MATHEMATICAL BOLD SCRIPT CAPITAL C
+1D4D3;N # MATHEMATICAL BOLD SCRIPT CAPITAL D
+1D4D4;N # MATHEMATICAL BOLD SCRIPT CAPITAL E
+1D4D5;N # MATHEMATICAL BOLD SCRIPT CAPITAL F
+1D4D6;N # MATHEMATICAL BOLD SCRIPT CAPITAL G
+1D4D7;N # MATHEMATICAL BOLD SCRIPT CAPITAL H
+1D4D8;N # MATHEMATICAL BOLD SCRIPT CAPITAL I
+1D4D9;N # MATHEMATICAL BOLD SCRIPT CAPITAL J
+1D4DA;N # MATHEMATICAL BOLD SCRIPT CAPITAL K
+1D4DB;N # MATHEMATICAL BOLD SCRIPT CAPITAL L
+1D4DC;N # MATHEMATICAL BOLD SCRIPT CAPITAL M
+1D4DD;N # MATHEMATICAL BOLD SCRIPT CAPITAL N
+1D4DE;N # MATHEMATICAL BOLD SCRIPT CAPITAL O
+1D4DF;N # MATHEMATICAL BOLD SCRIPT CAPITAL P
+1D4E0;N # MATHEMATICAL BOLD SCRIPT CAPITAL Q
+1D4E1;N # MATHEMATICAL BOLD SCRIPT CAPITAL R
+1D4E2;N # MATHEMATICAL BOLD SCRIPT CAPITAL S
+1D4E3;N # MATHEMATICAL BOLD SCRIPT CAPITAL T
+1D4E4;N # MATHEMATICAL BOLD SCRIPT CAPITAL U
+1D4E5;N # MATHEMATICAL BOLD SCRIPT CAPITAL V
+1D4E6;N # MATHEMATICAL BOLD SCRIPT CAPITAL W
+1D4E7;N # MATHEMATICAL BOLD SCRIPT CAPITAL X
+1D4E8;N # MATHEMATICAL BOLD SCRIPT CAPITAL Y
+1D4E9;N # MATHEMATICAL BOLD SCRIPT CAPITAL Z
+1D4EA;N # MATHEMATICAL BOLD SCRIPT SMALL A
+1D4EB;N # MATHEMATICAL BOLD SCRIPT SMALL B
+1D4EC;N # MATHEMATICAL BOLD SCRIPT SMALL C
+1D4ED;N # MATHEMATICAL BOLD SCRIPT SMALL D
+1D4EE;N # MATHEMATICAL BOLD SCRIPT SMALL E
+1D4EF;N # MATHEMATICAL BOLD SCRIPT SMALL F
+1D4F0;N # MATHEMATICAL BOLD SCRIPT SMALL G
+1D4F1;N # MATHEMATICAL BOLD SCRIPT SMALL H
+1D4F2;N # MATHEMATICAL BOLD SCRIPT SMALL I
+1D4F3;N # MATHEMATICAL BOLD SCRIPT SMALL J
+1D4F4;N # MATHEMATICAL BOLD SCRIPT SMALL K
+1D4F5;N # MATHEMATICAL BOLD SCRIPT SMALL L
+1D4F6;N # MATHEMATICAL BOLD SCRIPT SMALL M
+1D4F7;N # MATHEMATICAL BOLD SCRIPT SMALL N
+1D4F8;N # MATHEMATICAL BOLD SCRIPT SMALL O
+1D4F9;N # MATHEMATICAL BOLD SCRIPT SMALL P
+1D4FA;N # MATHEMATICAL BOLD SCRIPT SMALL Q
+1D4FB;N # MATHEMATICAL BOLD SCRIPT SMALL R
+1D4FC;N # MATHEMATICAL BOLD SCRIPT SMALL S
+1D4FD;N # MATHEMATICAL BOLD SCRIPT SMALL T
+1D4FE;N # MATHEMATICAL BOLD SCRIPT SMALL U
+1D4FF;N # MATHEMATICAL BOLD SCRIPT SMALL V
+1D500;N # MATHEMATICAL BOLD SCRIPT SMALL W
+1D501;N # MATHEMATICAL BOLD SCRIPT SMALL X
+1D502;N # MATHEMATICAL BOLD SCRIPT SMALL Y
+1D503;N # MATHEMATICAL BOLD SCRIPT SMALL Z
+1D504;N # MATHEMATICAL FRAKTUR CAPITAL A
+1D505;N # MATHEMATICAL FRAKTUR CAPITAL B
+1D507;N # MATHEMATICAL FRAKTUR CAPITAL D
+1D508;N # MATHEMATICAL FRAKTUR CAPITAL E
+1D509;N # MATHEMATICAL FRAKTUR CAPITAL F
+1D50A;N # MATHEMATICAL FRAKTUR CAPITAL G
+1D50D;N # MATHEMATICAL FRAKTUR CAPITAL J
+1D50E;N # MATHEMATICAL FRAKTUR CAPITAL K
+1D50F;N # MATHEMATICAL FRAKTUR CAPITAL L
+1D510;N # MATHEMATICAL FRAKTUR CAPITAL M
+1D511;N # MATHEMATICAL FRAKTUR CAPITAL N
+1D512;N # MATHEMATICAL FRAKTUR CAPITAL O
+1D513;N # MATHEMATICAL FRAKTUR CAPITAL P
+1D514;N # MATHEMATICAL FRAKTUR CAPITAL Q
+1D516;N # MATHEMATICAL FRAKTUR CAPITAL S
+1D517;N # MATHEMATICAL FRAKTUR CAPITAL T
+1D518;N # MATHEMATICAL FRAKTUR CAPITAL U
+1D519;N # MATHEMATICAL FRAKTUR CAPITAL V
+1D51A;N # MATHEMATICAL FRAKTUR CAPITAL W
+1D51B;N # MATHEMATICAL FRAKTUR CAPITAL X
+1D51C;N # MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E;N # MATHEMATICAL FRAKTUR SMALL A
+1D51F;N # MATHEMATICAL FRAKTUR SMALL B
+1D520;N # MATHEMATICAL FRAKTUR SMALL C
+1D521;N # MATHEMATICAL FRAKTUR SMALL D
+1D522;N # MATHEMATICAL FRAKTUR SMALL E
+1D523;N # MATHEMATICAL FRAKTUR SMALL F
+1D524;N # MATHEMATICAL FRAKTUR SMALL G
+1D525;N # MATHEMATICAL FRAKTUR SMALL H
+1D526;N # MATHEMATICAL FRAKTUR SMALL I
+1D527;N # MATHEMATICAL FRAKTUR SMALL J
+1D528;N # MATHEMATICAL FRAKTUR SMALL K
+1D529;N # MATHEMATICAL FRAKTUR SMALL L
+1D52A;N # MATHEMATICAL FRAKTUR SMALL M
+1D52B;N # MATHEMATICAL FRAKTUR SMALL N
+1D52C;N # MATHEMATICAL FRAKTUR SMALL O
+1D52D;N # MATHEMATICAL FRAKTUR SMALL P
+1D52E;N # MATHEMATICAL FRAKTUR SMALL Q
+1D52F;N # MATHEMATICAL FRAKTUR SMALL R
+1D530;N # MATHEMATICAL FRAKTUR SMALL S
+1D531;N # MATHEMATICAL FRAKTUR SMALL T
+1D532;N # MATHEMATICAL FRAKTUR SMALL U
+1D533;N # MATHEMATICAL FRAKTUR SMALL V
+1D534;N # MATHEMATICAL FRAKTUR SMALL W
+1D535;N # MATHEMATICAL FRAKTUR SMALL X
+1D536;N # MATHEMATICAL FRAKTUR SMALL Y
+1D537;N # MATHEMATICAL FRAKTUR SMALL Z
+1D538;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+1D539;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+1D53C;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+1D53D;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+1D53E;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+1D541;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+1D542;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+1D543;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+1D544;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+1D54B;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+1D54C;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+1D54D;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+1D54E;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+1D54F;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+1D550;N # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552;N # MATHEMATICAL DOUBLE-STRUCK SMALL A
+1D553;N # MATHEMATICAL DOUBLE-STRUCK SMALL B
+1D554;N # MATHEMATICAL DOUBLE-STRUCK SMALL C
+1D555;N # MATHEMATICAL DOUBLE-STRUCK SMALL D
+1D556;N # MATHEMATICAL DOUBLE-STRUCK SMALL E
+1D557;N # MATHEMATICAL DOUBLE-STRUCK SMALL F
+1D558;N # MATHEMATICAL DOUBLE-STRUCK SMALL G
+1D559;N # MATHEMATICAL DOUBLE-STRUCK SMALL H
+1D55A;N # MATHEMATICAL DOUBLE-STRUCK SMALL I
+1D55B;N # MATHEMATICAL DOUBLE-STRUCK SMALL J
+1D55C;N # MATHEMATICAL DOUBLE-STRUCK SMALL K
+1D55D;N # MATHEMATICAL DOUBLE-STRUCK SMALL L
+1D55E;N # MATHEMATICAL DOUBLE-STRUCK SMALL M
+1D55F;N # MATHEMATICAL DOUBLE-STRUCK SMALL N
+1D560;N # MATHEMATICAL DOUBLE-STRUCK SMALL O
+1D561;N # MATHEMATICAL DOUBLE-STRUCK SMALL P
+1D562;N # MATHEMATICAL DOUBLE-STRUCK SMALL Q
+1D563;N # MATHEMATICAL DOUBLE-STRUCK SMALL R
+1D564;N # MATHEMATICAL DOUBLE-STRUCK SMALL S
+1D565;N # MATHEMATICAL DOUBLE-STRUCK SMALL T
+1D566;N # MATHEMATICAL DOUBLE-STRUCK SMALL U
+1D567;N # MATHEMATICAL DOUBLE-STRUCK SMALL V
+1D568;N # MATHEMATICAL DOUBLE-STRUCK SMALL W
+1D569;N # MATHEMATICAL DOUBLE-STRUCK SMALL X
+1D56A;N # MATHEMATICAL DOUBLE-STRUCK SMALL Y
+1D56B;N # MATHEMATICAL DOUBLE-STRUCK SMALL Z
+1D56C;N # MATHEMATICAL BOLD FRAKTUR CAPITAL A
+1D56D;N # MATHEMATICAL BOLD FRAKTUR CAPITAL B
+1D56E;N # MATHEMATICAL BOLD FRAKTUR CAPITAL C
+1D56F;N # MATHEMATICAL BOLD FRAKTUR CAPITAL D
+1D570;N # MATHEMATICAL BOLD FRAKTUR CAPITAL E
+1D571;N # MATHEMATICAL BOLD FRAKTUR CAPITAL F
+1D572;N # MATHEMATICAL BOLD FRAKTUR CAPITAL G
+1D573;N # MATHEMATICAL BOLD FRAKTUR CAPITAL H
+1D574;N # MATHEMATICAL BOLD FRAKTUR CAPITAL I
+1D575;N # MATHEMATICAL BOLD FRAKTUR CAPITAL J
+1D576;N # MATHEMATICAL BOLD FRAKTUR CAPITAL K
+1D577;N # MATHEMATICAL BOLD FRAKTUR CAPITAL L
+1D578;N # MATHEMATICAL BOLD FRAKTUR CAPITAL M
+1D579;N # MATHEMATICAL BOLD FRAKTUR CAPITAL N
+1D57A;N # MATHEMATICAL BOLD FRAKTUR CAPITAL O
+1D57B;N # MATHEMATICAL BOLD FRAKTUR CAPITAL P
+1D57C;N # MATHEMATICAL BOLD FRAKTUR CAPITAL Q
+1D57D;N # MATHEMATICAL BOLD FRAKTUR CAPITAL R
+1D57E;N # MATHEMATICAL BOLD FRAKTUR CAPITAL S
+1D57F;N # MATHEMATICAL BOLD FRAKTUR CAPITAL T
+1D580;N # MATHEMATICAL BOLD FRAKTUR CAPITAL U
+1D581;N # MATHEMATICAL BOLD FRAKTUR CAPITAL V
+1D582;N # MATHEMATICAL BOLD FRAKTUR CAPITAL W
+1D583;N # MATHEMATICAL BOLD FRAKTUR CAPITAL X
+1D584;N # MATHEMATICAL BOLD FRAKTUR CAPITAL Y
+1D585;N # MATHEMATICAL BOLD FRAKTUR CAPITAL Z
+1D586;N # MATHEMATICAL BOLD FRAKTUR SMALL A
+1D587;N # MATHEMATICAL BOLD FRAKTUR SMALL B
+1D588;N # MATHEMATICAL BOLD FRAKTUR SMALL C
+1D589;N # MATHEMATICAL BOLD FRAKTUR SMALL D
+1D58A;N # MATHEMATICAL BOLD FRAKTUR SMALL E
+1D58B;N # MATHEMATICAL BOLD FRAKTUR SMALL F
+1D58C;N # MATHEMATICAL BOLD FRAKTUR SMALL G
+1D58D;N # MATHEMATICAL BOLD FRAKTUR SMALL H
+1D58E;N # MATHEMATICAL BOLD FRAKTUR SMALL I
+1D58F;N # MATHEMATICAL BOLD FRAKTUR SMALL J
+1D590;N # MATHEMATICAL BOLD FRAKTUR SMALL K
+1D591;N # MATHEMATICAL BOLD FRAKTUR SMALL L
+1D592;N # MATHEMATICAL BOLD FRAKTUR SMALL M
+1D593;N # MATHEMATICAL BOLD FRAKTUR SMALL N
+1D594;N # MATHEMATICAL BOLD FRAKTUR SMALL O
+1D595;N # MATHEMATICAL BOLD FRAKTUR SMALL P
+1D596;N # MATHEMATICAL BOLD FRAKTUR SMALL Q
+1D597;N # MATHEMATICAL BOLD FRAKTUR SMALL R
+1D598;N # MATHEMATICAL BOLD FRAKTUR SMALL S
+1D599;N # MATHEMATICAL BOLD FRAKTUR SMALL T
+1D59A;N # MATHEMATICAL BOLD FRAKTUR SMALL U
+1D59B;N # MATHEMATICAL BOLD FRAKTUR SMALL V
+1D59C;N # MATHEMATICAL BOLD FRAKTUR SMALL W
+1D59D;N # MATHEMATICAL BOLD FRAKTUR SMALL X
+1D59E;N # MATHEMATICAL BOLD FRAKTUR SMALL Y
+1D59F;N # MATHEMATICAL BOLD FRAKTUR SMALL Z
+1D5A0;N # MATHEMATICAL SANS-SERIF CAPITAL A
+1D5A1;N # MATHEMATICAL SANS-SERIF CAPITAL B
+1D5A2;N # MATHEMATICAL SANS-SERIF CAPITAL C
+1D5A3;N # MATHEMATICAL SANS-SERIF CAPITAL D
+1D5A4;N # MATHEMATICAL SANS-SERIF CAPITAL E
+1D5A5;N # MATHEMATICAL SANS-SERIF CAPITAL F
+1D5A6;N # MATHEMATICAL SANS-SERIF CAPITAL G
+1D5A7;N # MATHEMATICAL SANS-SERIF CAPITAL H
+1D5A8;N # MATHEMATICAL SANS-SERIF CAPITAL I
+1D5A9;N # MATHEMATICAL SANS-SERIF CAPITAL J
+1D5AA;N # MATHEMATICAL SANS-SERIF CAPITAL K
+1D5AB;N # MATHEMATICAL SANS-SERIF CAPITAL L
+1D5AC;N # MATHEMATICAL SANS-SERIF CAPITAL M
+1D5AD;N # MATHEMATICAL SANS-SERIF CAPITAL N
+1D5AE;N # MATHEMATICAL SANS-SERIF CAPITAL O
+1D5AF;N # MATHEMATICAL SANS-SERIF CAPITAL P
+1D5B0;N # MATHEMATICAL SANS-SERIF CAPITAL Q
+1D5B1;N # MATHEMATICAL SANS-SERIF CAPITAL R
+1D5B2;N # MATHEMATICAL SANS-SERIF CAPITAL S
+1D5B3;N # MATHEMATICAL SANS-SERIF CAPITAL T
+1D5B4;N # MATHEMATICAL SANS-SERIF CAPITAL U
+1D5B5;N # MATHEMATICAL SANS-SERIF CAPITAL V
+1D5B6;N # MATHEMATICAL SANS-SERIF CAPITAL W
+1D5B7;N # MATHEMATICAL SANS-SERIF CAPITAL X
+1D5B8;N # MATHEMATICAL SANS-SERIF CAPITAL Y
+1D5B9;N # MATHEMATICAL SANS-SERIF CAPITAL Z
+1D5BA;N # MATHEMATICAL SANS-SERIF SMALL A
+1D5BB;N # MATHEMATICAL SANS-SERIF SMALL B
+1D5BC;N # MATHEMATICAL SANS-SERIF SMALL C
+1D5BD;N # MATHEMATICAL SANS-SERIF SMALL D
+1D5BE;N # MATHEMATICAL SANS-SERIF SMALL E
+1D5BF;N # MATHEMATICAL SANS-SERIF SMALL F
+1D5C0;N # MATHEMATICAL SANS-SERIF SMALL G
+1D5C1;N # MATHEMATICAL SANS-SERIF SMALL H
+1D5C2;N # MATHEMATICAL SANS-SERIF SMALL I
+1D5C3;N # MATHEMATICAL SANS-SERIF SMALL J
+1D5C4;N # MATHEMATICAL SANS-SERIF SMALL K
+1D5C5;N # MATHEMATICAL SANS-SERIF SMALL L
+1D5C6;N # MATHEMATICAL SANS-SERIF SMALL M
+1D5C7;N # MATHEMATICAL SANS-SERIF SMALL N
+1D5C8;N # MATHEMATICAL SANS-SERIF SMALL O
+1D5C9;N # MATHEMATICAL SANS-SERIF SMALL P
+1D5CA;N # MATHEMATICAL SANS-SERIF SMALL Q
+1D5CB;N # MATHEMATICAL SANS-SERIF SMALL R
+1D5CC;N # MATHEMATICAL SANS-SERIF SMALL S
+1D5CD;N # MATHEMATICAL SANS-SERIF SMALL T
+1D5CE;N # MATHEMATICAL SANS-SERIF SMALL U
+1D5CF;N # MATHEMATICAL SANS-SERIF SMALL V
+1D5D0;N # MATHEMATICAL SANS-SERIF SMALL W
+1D5D1;N # MATHEMATICAL SANS-SERIF SMALL X
+1D5D2;N # MATHEMATICAL SANS-SERIF SMALL Y
+1D5D3;N # MATHEMATICAL SANS-SERIF SMALL Z
+1D5D4;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+1D5D5;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL B
+1D5D6;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL C
+1D5D7;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL D
+1D5D8;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL E
+1D5D9;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL F
+1D5DA;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL G
+1D5DB;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL H
+1D5DC;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL I
+1D5DD;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL J
+1D5DE;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL K
+1D5DF;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL L
+1D5E0;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL M
+1D5E1;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL N
+1D5E2;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL O
+1D5E3;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL P
+1D5E4;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q
+1D5E5;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL R
+1D5E6;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL S
+1D5E7;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL T
+1D5E8;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL U
+1D5E9;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL V
+1D5EA;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL W
+1D5EB;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL X
+1D5EC;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y
+1D5ED;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
+1D5EE;N # MATHEMATICAL SANS-SERIF BOLD SMALL A
+1D5EF;N # MATHEMATICAL SANS-SERIF BOLD SMALL B
+1D5F0;N # MATHEMATICAL SANS-SERIF BOLD SMALL C
+1D5F1;N # MATHEMATICAL SANS-SERIF BOLD SMALL D
+1D5F2;N # MATHEMATICAL SANS-SERIF BOLD SMALL E
+1D5F3;N # MATHEMATICAL SANS-SERIF BOLD SMALL F
+1D5F4;N # MATHEMATICAL SANS-SERIF BOLD SMALL G
+1D5F5;N # MATHEMATICAL SANS-SERIF BOLD SMALL H
+1D5F6;N # MATHEMATICAL SANS-SERIF BOLD SMALL I
+1D5F7;N # MATHEMATICAL SANS-SERIF BOLD SMALL J
+1D5F8;N # MATHEMATICAL SANS-SERIF BOLD SMALL K
+1D5F9;N # MATHEMATICAL SANS-SERIF BOLD SMALL L
+1D5FA;N # MATHEMATICAL SANS-SERIF BOLD SMALL M
+1D5FB;N # MATHEMATICAL SANS-SERIF BOLD SMALL N
+1D5FC;N # MATHEMATICAL SANS-SERIF BOLD SMALL O
+1D5FD;N # MATHEMATICAL SANS-SERIF BOLD SMALL P
+1D5FE;N # MATHEMATICAL SANS-SERIF BOLD SMALL Q
+1D5FF;N # MATHEMATICAL SANS-SERIF BOLD SMALL R
+1D600;N # MATHEMATICAL SANS-SERIF BOLD SMALL S
+1D601;N # MATHEMATICAL SANS-SERIF BOLD SMALL T
+1D602;N # MATHEMATICAL SANS-SERIF BOLD SMALL U
+1D603;N # MATHEMATICAL SANS-SERIF BOLD SMALL V
+1D604;N # MATHEMATICAL SANS-SERIF BOLD SMALL W
+1D605;N # MATHEMATICAL SANS-SERIF BOLD SMALL X
+1D606;N # MATHEMATICAL SANS-SERIF BOLD SMALL Y
+1D607;N # MATHEMATICAL SANS-SERIF BOLD SMALL Z
+1D608;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
+1D609;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B
+1D60A;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C
+1D60B;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D
+1D60C;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E
+1D60D;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F
+1D60E;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G
+1D60F;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H
+1D610;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
+1D611;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J
+1D612;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K
+1D613;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L
+1D614;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M
+1D615;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N
+1D616;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O
+1D617;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P
+1D618;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q
+1D619;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R
+1D61A;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S
+1D61B;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T
+1D61C;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U
+1D61D;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V
+1D61E;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W
+1D61F;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X
+1D620;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y
+1D621;N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
+1D622;N # MATHEMATICAL SANS-SERIF ITALIC SMALL A
+1D623;N # MATHEMATICAL SANS-SERIF ITALIC SMALL B
+1D624;N # MATHEMATICAL SANS-SERIF ITALIC SMALL C
+1D625;N # MATHEMATICAL SANS-SERIF ITALIC SMALL D
+1D626;N # MATHEMATICAL SANS-SERIF ITALIC SMALL E
+1D627;N # MATHEMATICAL SANS-SERIF ITALIC SMALL F
+1D628;N # MATHEMATICAL SANS-SERIF ITALIC SMALL G
+1D629;N # MATHEMATICAL SANS-SERIF ITALIC SMALL H
+1D62A;N # MATHEMATICAL SANS-SERIF ITALIC SMALL I
+1D62B;N # MATHEMATICAL SANS-SERIF ITALIC SMALL J
+1D62C;N # MATHEMATICAL SANS-SERIF ITALIC SMALL K
+1D62D;N # MATHEMATICAL SANS-SERIF ITALIC SMALL L
+1D62E;N # MATHEMATICAL SANS-SERIF ITALIC SMALL M
+1D62F;N # MATHEMATICAL SANS-SERIF ITALIC SMALL N
+1D630;N # MATHEMATICAL SANS-SERIF ITALIC SMALL O
+1D631;N # MATHEMATICAL SANS-SERIF ITALIC SMALL P
+1D632;N # MATHEMATICAL SANS-SERIF ITALIC SMALL Q
+1D633;N # MATHEMATICAL SANS-SERIF ITALIC SMALL R
+1D634;N # MATHEMATICAL SANS-SERIF ITALIC SMALL S
+1D635;N # MATHEMATICAL SANS-SERIF ITALIC SMALL T
+1D636;N # MATHEMATICAL SANS-SERIF ITALIC SMALL U
+1D637;N # MATHEMATICAL SANS-SERIF ITALIC SMALL V
+1D638;N # MATHEMATICAL SANS-SERIF ITALIC SMALL W
+1D639;N # MATHEMATICAL SANS-SERIF ITALIC SMALL X
+1D63A;N # MATHEMATICAL SANS-SERIF ITALIC SMALL Y
+1D63B;N # MATHEMATICAL SANS-SERIF ITALIC SMALL Z
+1D63C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
+1D63D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B
+1D63E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C
+1D63F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D
+1D640;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E
+1D641;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F
+1D642;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G
+1D643;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H
+1D644;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
+1D645;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J
+1D646;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K
+1D647;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L
+1D648;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M
+1D649;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N
+1D64A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O
+1D64B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P
+1D64C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q
+1D64D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R
+1D64E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S
+1D64F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T
+1D650;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U
+1D651;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V
+1D652;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W
+1D653;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X
+1D654;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y
+1D655;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
+1D656;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A
+1D657;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B
+1D658;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C
+1D659;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D
+1D65A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E
+1D65B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F
+1D65C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G
+1D65D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H
+1D65E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I
+1D65F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+1D660;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K
+1D661;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
+1D662;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M
+1D663;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N
+1D664;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O
+1D665;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P
+1D666;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q
+1D667;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R
+1D668;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S
+1D669;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T
+1D66A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U
+1D66B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V
+1D66C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W
+1D66D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X
+1D66E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y
+1D66F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
+1D670;N # MATHEMATICAL MONOSPACE CAPITAL A
+1D671;N # MATHEMATICAL MONOSPACE CAPITAL B
+1D672;N # MATHEMATICAL MONOSPACE CAPITAL C
+1D673;N # MATHEMATICAL MONOSPACE CAPITAL D
+1D674;N # MATHEMATICAL MONOSPACE CAPITAL E
+1D675;N # MATHEMATICAL MONOSPACE CAPITAL F
+1D676;N # MATHEMATICAL MONOSPACE CAPITAL G
+1D677;N # MATHEMATICAL MONOSPACE CAPITAL H
+1D678;N # MATHEMATICAL MONOSPACE CAPITAL I
+1D679;N # MATHEMATICAL MONOSPACE CAPITAL J
+1D67A;N # MATHEMATICAL MONOSPACE CAPITAL K
+1D67B;N # MATHEMATICAL MONOSPACE CAPITAL L
+1D67C;N # MATHEMATICAL MONOSPACE CAPITAL M
+1D67D;N # MATHEMATICAL MONOSPACE CAPITAL N
+1D67E;N # MATHEMATICAL MONOSPACE CAPITAL O
+1D67F;N # MATHEMATICAL MONOSPACE CAPITAL P
+1D680;N # MATHEMATICAL MONOSPACE CAPITAL Q
+1D681;N # MATHEMATICAL MONOSPACE CAPITAL R
+1D682;N # MATHEMATICAL MONOSPACE CAPITAL S
+1D683;N # MATHEMATICAL MONOSPACE CAPITAL T
+1D684;N # MATHEMATICAL MONOSPACE CAPITAL U
+1D685;N # MATHEMATICAL MONOSPACE CAPITAL V
+1D686;N # MATHEMATICAL MONOSPACE CAPITAL W
+1D687;N # MATHEMATICAL MONOSPACE CAPITAL X
+1D688;N # MATHEMATICAL MONOSPACE CAPITAL Y
+1D689;N # MATHEMATICAL MONOSPACE CAPITAL Z
+1D68A;N # MATHEMATICAL MONOSPACE SMALL A
+1D68B;N # MATHEMATICAL MONOSPACE SMALL B
+1D68C;N # MATHEMATICAL MONOSPACE SMALL C
+1D68D;N # MATHEMATICAL MONOSPACE SMALL D
+1D68E;N # MATHEMATICAL MONOSPACE SMALL E
+1D68F;N # MATHEMATICAL MONOSPACE SMALL F
+1D690;N # MATHEMATICAL MONOSPACE SMALL G
+1D691;N # MATHEMATICAL MONOSPACE SMALL H
+1D692;N # MATHEMATICAL MONOSPACE SMALL I
+1D693;N # MATHEMATICAL MONOSPACE SMALL J
+1D694;N # MATHEMATICAL MONOSPACE SMALL K
+1D695;N # MATHEMATICAL MONOSPACE SMALL L
+1D696;N # MATHEMATICAL MONOSPACE SMALL M
+1D697;N # MATHEMATICAL MONOSPACE SMALL N
+1D698;N # MATHEMATICAL MONOSPACE SMALL O
+1D699;N # MATHEMATICAL MONOSPACE SMALL P
+1D69A;N # MATHEMATICAL MONOSPACE SMALL Q
+1D69B;N # MATHEMATICAL MONOSPACE SMALL R
+1D69C;N # MATHEMATICAL MONOSPACE SMALL S
+1D69D;N # MATHEMATICAL MONOSPACE SMALL T
+1D69E;N # MATHEMATICAL MONOSPACE SMALL U
+1D69F;N # MATHEMATICAL MONOSPACE SMALL V
+1D6A0;N # MATHEMATICAL MONOSPACE SMALL W
+1D6A1;N # MATHEMATICAL MONOSPACE SMALL X
+1D6A2;N # MATHEMATICAL MONOSPACE SMALL Y
+1D6A3;N # MATHEMATICAL MONOSPACE SMALL Z
+1D6A4;N # MATHEMATICAL ITALIC SMALL DOTLESS I
+1D6A5;N # MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8;N # MATHEMATICAL BOLD CAPITAL ALPHA
+1D6A9;N # MATHEMATICAL BOLD CAPITAL BETA
+1D6AA;N # MATHEMATICAL BOLD CAPITAL GAMMA
+1D6AB;N # MATHEMATICAL BOLD CAPITAL DELTA
+1D6AC;N # MATHEMATICAL BOLD CAPITAL EPSILON
+1D6AD;N # MATHEMATICAL BOLD CAPITAL ZETA
+1D6AE;N # MATHEMATICAL BOLD CAPITAL ETA
+1D6AF;N # MATHEMATICAL BOLD CAPITAL THETA
+1D6B0;N # MATHEMATICAL BOLD CAPITAL IOTA
+1D6B1;N # MATHEMATICAL BOLD CAPITAL KAPPA
+1D6B2;N # MATHEMATICAL BOLD CAPITAL LAMDA
+1D6B3;N # MATHEMATICAL BOLD CAPITAL MU
+1D6B4;N # MATHEMATICAL BOLD CAPITAL NU
+1D6B5;N # MATHEMATICAL BOLD CAPITAL XI
+1D6B6;N # MATHEMATICAL BOLD CAPITAL OMICRON
+1D6B7;N # MATHEMATICAL BOLD CAPITAL PI
+1D6B8;N # MATHEMATICAL BOLD CAPITAL RHO
+1D6B9;N # MATHEMATICAL BOLD CAPITAL THETA SYMBOL
+1D6BA;N # MATHEMATICAL BOLD CAPITAL SIGMA
+1D6BB;N # MATHEMATICAL BOLD CAPITAL TAU
+1D6BC;N # MATHEMATICAL BOLD CAPITAL UPSILON
+1D6BD;N # MATHEMATICAL BOLD CAPITAL PHI
+1D6BE;N # MATHEMATICAL BOLD CAPITAL CHI
+1D6BF;N # MATHEMATICAL BOLD CAPITAL PSI
+1D6C0;N # MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1;N # MATHEMATICAL BOLD NABLA
+1D6C2;N # MATHEMATICAL BOLD SMALL ALPHA
+1D6C3;N # MATHEMATICAL BOLD SMALL BETA
+1D6C4;N # MATHEMATICAL BOLD SMALL GAMMA
+1D6C5;N # MATHEMATICAL BOLD SMALL DELTA
+1D6C6;N # MATHEMATICAL BOLD SMALL EPSILON
+1D6C7;N # MATHEMATICAL BOLD SMALL ZETA
+1D6C8;N # MATHEMATICAL BOLD SMALL ETA
+1D6C9;N # MATHEMATICAL BOLD SMALL THETA
+1D6CA;N # MATHEMATICAL BOLD SMALL IOTA
+1D6CB;N # MATHEMATICAL BOLD SMALL KAPPA
+1D6CC;N # MATHEMATICAL BOLD SMALL LAMDA
+1D6CD;N # MATHEMATICAL BOLD SMALL MU
+1D6CE;N # MATHEMATICAL BOLD SMALL NU
+1D6CF;N # MATHEMATICAL BOLD SMALL XI
+1D6D0;N # MATHEMATICAL BOLD SMALL OMICRON
+1D6D1;N # MATHEMATICAL BOLD SMALL PI
+1D6D2;N # MATHEMATICAL BOLD SMALL RHO
+1D6D3;N # MATHEMATICAL BOLD SMALL FINAL SIGMA
+1D6D4;N # MATHEMATICAL BOLD SMALL SIGMA
+1D6D5;N # MATHEMATICAL BOLD SMALL TAU
+1D6D6;N # MATHEMATICAL BOLD SMALL UPSILON
+1D6D7;N # MATHEMATICAL BOLD SMALL PHI
+1D6D8;N # MATHEMATICAL BOLD SMALL CHI
+1D6D9;N # MATHEMATICAL BOLD SMALL PSI
+1D6DA;N # MATHEMATICAL BOLD SMALL OMEGA
+1D6DB;N # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC;N # MATHEMATICAL BOLD EPSILON SYMBOL
+1D6DD;N # MATHEMATICAL BOLD THETA SYMBOL
+1D6DE;N # MATHEMATICAL BOLD KAPPA SYMBOL
+1D6DF;N # MATHEMATICAL BOLD PHI SYMBOL
+1D6E0;N # MATHEMATICAL BOLD RHO SYMBOL
+1D6E1;N # MATHEMATICAL BOLD PI SYMBOL
+1D6E2;N # MATHEMATICAL ITALIC CAPITAL ALPHA
+1D6E3;N # MATHEMATICAL ITALIC CAPITAL BETA
+1D6E4;N # MATHEMATICAL ITALIC CAPITAL GAMMA
+1D6E5;N # MATHEMATICAL ITALIC CAPITAL DELTA
+1D6E6;N # MATHEMATICAL ITALIC CAPITAL EPSILON
+1D6E7;N # MATHEMATICAL ITALIC CAPITAL ZETA
+1D6E8;N # MATHEMATICAL ITALIC CAPITAL ETA
+1D6E9;N # MATHEMATICAL ITALIC CAPITAL THETA
+1D6EA;N # MATHEMATICAL ITALIC CAPITAL IOTA
+1D6EB;N # MATHEMATICAL ITALIC CAPITAL KAPPA
+1D6EC;N # MATHEMATICAL ITALIC CAPITAL LAMDA
+1D6ED;N # MATHEMATICAL ITALIC CAPITAL MU
+1D6EE;N # MATHEMATICAL ITALIC CAPITAL NU
+1D6EF;N # MATHEMATICAL ITALIC CAPITAL XI
+1D6F0;N # MATHEMATICAL ITALIC CAPITAL OMICRON
+1D6F1;N # MATHEMATICAL ITALIC CAPITAL PI
+1D6F2;N # MATHEMATICAL ITALIC CAPITAL RHO
+1D6F3;N # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL
+1D6F4;N # MATHEMATICAL ITALIC CAPITAL SIGMA
+1D6F5;N # MATHEMATICAL ITALIC CAPITAL TAU
+1D6F6;N # MATHEMATICAL ITALIC CAPITAL UPSILON
+1D6F7;N # MATHEMATICAL ITALIC CAPITAL PHI
+1D6F8;N # MATHEMATICAL ITALIC CAPITAL CHI
+1D6F9;N # MATHEMATICAL ITALIC CAPITAL PSI
+1D6FA;N # MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB;N # MATHEMATICAL ITALIC NABLA
+1D6FC;N # MATHEMATICAL ITALIC SMALL ALPHA
+1D6FD;N # MATHEMATICAL ITALIC SMALL BETA
+1D6FE;N # MATHEMATICAL ITALIC SMALL GAMMA
+1D6FF;N # MATHEMATICAL ITALIC SMALL DELTA
+1D700;N # MATHEMATICAL ITALIC SMALL EPSILON
+1D701;N # MATHEMATICAL ITALIC SMALL ZETA
+1D702;N # MATHEMATICAL ITALIC SMALL ETA
+1D703;N # MATHEMATICAL ITALIC SMALL THETA
+1D704;N # MATHEMATICAL ITALIC SMALL IOTA
+1D705;N # MATHEMATICAL ITALIC SMALL KAPPA
+1D706;N # MATHEMATICAL ITALIC SMALL LAMDA
+1D707;N # MATHEMATICAL ITALIC SMALL MU
+1D708;N # MATHEMATICAL ITALIC SMALL NU
+1D709;N # MATHEMATICAL ITALIC SMALL XI
+1D70A;N # MATHEMATICAL ITALIC SMALL OMICRON
+1D70B;N # MATHEMATICAL ITALIC SMALL PI
+1D70C;N # MATHEMATICAL ITALIC SMALL RHO
+1D70D;N # MATHEMATICAL ITALIC SMALL FINAL SIGMA
+1D70E;N # MATHEMATICAL ITALIC SMALL SIGMA
+1D70F;N # MATHEMATICAL ITALIC SMALL TAU
+1D710;N # MATHEMATICAL ITALIC SMALL UPSILON
+1D711;N # MATHEMATICAL ITALIC SMALL PHI
+1D712;N # MATHEMATICAL ITALIC SMALL CHI
+1D713;N # MATHEMATICAL ITALIC SMALL PSI
+1D714;N # MATHEMATICAL ITALIC SMALL OMEGA
+1D715;N # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716;N # MATHEMATICAL ITALIC EPSILON SYMBOL
+1D717;N # MATHEMATICAL ITALIC THETA SYMBOL
+1D718;N # MATHEMATICAL ITALIC KAPPA SYMBOL
+1D719;N # MATHEMATICAL ITALIC PHI SYMBOL
+1D71A;N # MATHEMATICAL ITALIC RHO SYMBOL
+1D71B;N # MATHEMATICAL ITALIC PI SYMBOL
+1D71C;N # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA
+1D71D;N # MATHEMATICAL BOLD ITALIC CAPITAL BETA
+1D71E;N # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA
+1D71F;N # MATHEMATICAL BOLD ITALIC CAPITAL DELTA
+1D720;N # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON
+1D721;N # MATHEMATICAL BOLD ITALIC CAPITAL ZETA
+1D722;N # MATHEMATICAL BOLD ITALIC CAPITAL ETA
+1D723;N # MATHEMATICAL BOLD ITALIC CAPITAL THETA
+1D724;N # MATHEMATICAL BOLD ITALIC CAPITAL IOTA
+1D725;N # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA
+1D726;N # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA
+1D727;N # MATHEMATICAL BOLD ITALIC CAPITAL MU
+1D728;N # MATHEMATICAL BOLD ITALIC CAPITAL NU
+1D729;N # MATHEMATICAL BOLD ITALIC CAPITAL XI
+1D72A;N # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON
+1D72B;N # MATHEMATICAL BOLD ITALIC CAPITAL PI
+1D72C;N # MATHEMATICAL BOLD ITALIC CAPITAL RHO
+1D72D;N # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL
+1D72E;N # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA
+1D72F;N # MATHEMATICAL BOLD ITALIC CAPITAL TAU
+1D730;N # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON
+1D731;N # MATHEMATICAL BOLD ITALIC CAPITAL PHI
+1D732;N # MATHEMATICAL BOLD ITALIC CAPITAL CHI
+1D733;N # MATHEMATICAL BOLD ITALIC CAPITAL PSI
+1D734;N # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735;N # MATHEMATICAL BOLD ITALIC NABLA
+1D736;N # MATHEMATICAL BOLD ITALIC SMALL ALPHA
+1D737;N # MATHEMATICAL BOLD ITALIC SMALL BETA
+1D738;N # MATHEMATICAL BOLD ITALIC SMALL GAMMA
+1D739;N # MATHEMATICAL BOLD ITALIC SMALL DELTA
+1D73A;N # MATHEMATICAL BOLD ITALIC SMALL EPSILON
+1D73B;N # MATHEMATICAL BOLD ITALIC SMALL ZETA
+1D73C;N # MATHEMATICAL BOLD ITALIC SMALL ETA
+1D73D;N # MATHEMATICAL BOLD ITALIC SMALL THETA
+1D73E;N # MATHEMATICAL BOLD ITALIC SMALL IOTA
+1D73F;N # MATHEMATICAL BOLD ITALIC SMALL KAPPA
+1D740;N # MATHEMATICAL BOLD ITALIC SMALL LAMDA
+1D741;N # MATHEMATICAL BOLD ITALIC SMALL MU
+1D742;N # MATHEMATICAL BOLD ITALIC SMALL NU
+1D743;N # MATHEMATICAL BOLD ITALIC SMALL XI
+1D744;N # MATHEMATICAL BOLD ITALIC SMALL OMICRON
+1D745;N # MATHEMATICAL BOLD ITALIC SMALL PI
+1D746;N # MATHEMATICAL BOLD ITALIC SMALL RHO
+1D747;N # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA
+1D748;N # MATHEMATICAL BOLD ITALIC SMALL SIGMA
+1D749;N # MATHEMATICAL BOLD ITALIC SMALL TAU
+1D74A;N # MATHEMATICAL BOLD ITALIC SMALL UPSILON
+1D74B;N # MATHEMATICAL BOLD ITALIC SMALL PHI
+1D74C;N # MATHEMATICAL BOLD ITALIC SMALL CHI
+1D74D;N # MATHEMATICAL BOLD ITALIC SMALL PSI
+1D74E;N # MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F;N # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750;N # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL
+1D751;N # MATHEMATICAL BOLD ITALIC THETA SYMBOL
+1D752;N # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL
+1D753;N # MATHEMATICAL BOLD ITALIC PHI SYMBOL
+1D754;N # MATHEMATICAL BOLD ITALIC RHO SYMBOL
+1D755;N # MATHEMATICAL BOLD ITALIC PI SYMBOL
+1D756;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA
+1D757;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA
+1D758;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA
+1D759;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA
+1D75A;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON
+1D75B;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA
+1D75C;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA
+1D75D;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA
+1D75E;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
+1D75F;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA
+1D760;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA
+1D761;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU
+1D762;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU
+1D763;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI
+1D764;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON
+1D765;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI
+1D766;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO
+1D767;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL
+1D768;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA
+1D769;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU
+1D76A;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON
+1D76B;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI
+1D76C;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI
+1D76D;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI
+1D76E;N # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F;N # MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770;N # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA
+1D771;N # MATHEMATICAL SANS-SERIF BOLD SMALL BETA
+1D772;N # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA
+1D773;N # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA
+1D774;N # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON
+1D775;N # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA
+1D776;N # MATHEMATICAL SANS-SERIF BOLD SMALL ETA
+1D777;N # MATHEMATICAL SANS-SERIF BOLD SMALL THETA
+1D778;N # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA
+1D779;N # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA
+1D77A;N # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA
+1D77B;N # MATHEMATICAL SANS-SERIF BOLD SMALL MU
+1D77C;N # MATHEMATICAL SANS-SERIF BOLD SMALL NU
+1D77D;N # MATHEMATICAL SANS-SERIF BOLD SMALL XI
+1D77E;N # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON
+1D77F;N # MATHEMATICAL SANS-SERIF BOLD SMALL PI
+1D780;N # MATHEMATICAL SANS-SERIF BOLD SMALL RHO
+1D781;N # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA
+1D782;N # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA
+1D783;N # MATHEMATICAL SANS-SERIF BOLD SMALL TAU
+1D784;N # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON
+1D785;N # MATHEMATICAL SANS-SERIF BOLD SMALL PHI
+1D786;N # MATHEMATICAL SANS-SERIF BOLD SMALL CHI
+1D787;N # MATHEMATICAL SANS-SERIF BOLD SMALL PSI
+1D788;N # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789;N # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A;N # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL
+1D78B;N # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL
+1D78C;N # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL
+1D78D;N # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL
+1D78E;N # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL
+1D78F;N # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
+1D790;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA
+1D791;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA
+1D792;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA
+1D793;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA
+1D794;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON
+1D795;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA
+1D796;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA
+1D797;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA
+1D798;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
+1D799;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA
+1D79A;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA
+1D79B;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU
+1D79C;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU
+1D79D;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI
+1D79E;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON
+1D79F;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI
+1D7A0;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO
+1D7A1;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL
+1D7A2;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA
+1D7A3;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU
+1D7A4;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON
+1D7A5;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI
+1D7A6;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI
+1D7A7;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI
+1D7A8;N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9;N # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA
+1D7AB;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA
+1D7AC;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA
+1D7AD;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA
+1D7AE;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON
+1D7AF;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA
+1D7B0;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA
+1D7B1;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA
+1D7B2;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA
+1D7B3;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA
+1D7B4;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA
+1D7B5;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU
+1D7B6;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU
+1D7B7;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI
+1D7B8;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON
+1D7B9;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI
+1D7BA;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO
+1D7BB;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA
+1D7BC;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA
+1D7BD;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU
+1D7BE;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON
+1D7BF;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI
+1D7C0;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI
+1D7C1;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI
+1D7C2;N # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3;N # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4;N # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL
+1D7C5;N # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL
+1D7C6;N # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL
+1D7C7;N # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL
+1D7C8;N # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL
+1D7C9;N # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+1D7CE;N # MATHEMATICAL BOLD DIGIT ZERO
+1D7CF;N # MATHEMATICAL BOLD DIGIT ONE
+1D7D0;N # MATHEMATICAL BOLD DIGIT TWO
+1D7D1;N # MATHEMATICAL BOLD DIGIT THREE
+1D7D2;N # MATHEMATICAL BOLD DIGIT FOUR
+1D7D3;N # MATHEMATICAL BOLD DIGIT FIVE
+1D7D4;N # MATHEMATICAL BOLD DIGIT SIX
+1D7D5;N # MATHEMATICAL BOLD DIGIT SEVEN
+1D7D6;N # MATHEMATICAL BOLD DIGIT EIGHT
+1D7D7;N # MATHEMATICAL BOLD DIGIT NINE
+1D7D8;N # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
+1D7D9;N # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
+1D7DA;N # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
+1D7DB;N # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
+1D7DC;N # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
+1D7DD;N # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
+1D7DE;N # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
+1D7DF;N # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
+1D7E0;N # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
+1D7E1;N # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
+1D7E2;N # MATHEMATICAL SANS-SERIF DIGIT ZERO
+1D7E3;N # MATHEMATICAL SANS-SERIF DIGIT ONE
+1D7E4;N # MATHEMATICAL SANS-SERIF DIGIT TWO
+1D7E5;N # MATHEMATICAL SANS-SERIF DIGIT THREE
+1D7E6;N # MATHEMATICAL SANS-SERIF DIGIT FOUR
+1D7E7;N # MATHEMATICAL SANS-SERIF DIGIT FIVE
+1D7E8;N # MATHEMATICAL SANS-SERIF DIGIT SIX
+1D7E9;N # MATHEMATICAL SANS-SERIF DIGIT SEVEN
+1D7EA;N # MATHEMATICAL SANS-SERIF DIGIT EIGHT
+1D7EB;N # MATHEMATICAL SANS-SERIF DIGIT NINE
+1D7EC;N # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
+1D7ED;N # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
+1D7EE;N # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
+1D7EF;N # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
+1D7F0;N # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
+1D7F1;N # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
+1D7F2;N # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
+1D7F3;N # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
+1D7F4;N # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
+1D7F5;N # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
+1D7F6;N # MATHEMATICAL MONOSPACE DIGIT ZERO
+1D7F7;N # MATHEMATICAL MONOSPACE DIGIT ONE
+1D7F8;N # MATHEMATICAL MONOSPACE DIGIT TWO
+1D7F9;N # MATHEMATICAL MONOSPACE DIGIT THREE
+1D7FA;N # MATHEMATICAL MONOSPACE DIGIT FOUR
+1D7FB;N # MATHEMATICAL MONOSPACE DIGIT FIVE
+1D7FC;N # MATHEMATICAL MONOSPACE DIGIT SIX
+1D7FD;N # MATHEMATICAL MONOSPACE DIGIT SEVEN
+1D7FE;N # MATHEMATICAL MONOSPACE DIGIT EIGHT
+1D7FF;N # MATHEMATICAL MONOSPACE DIGIT NINE
+20000..2A6D6;W # <CJK Ideograph Extension B, First>..<CJK Ideograph Extension B, Last>
+2A6D7..2F7FF;W # <reserved>
+2F800;W # CJK COMPATIBILITY IDEOGRAPH-2F800
+2F801;W # CJK COMPATIBILITY IDEOGRAPH-2F801
+2F802;W # CJK COMPATIBILITY IDEOGRAPH-2F802
+2F803;W # CJK COMPATIBILITY IDEOGRAPH-2F803
+2F804;W # CJK COMPATIBILITY IDEOGRAPH-2F804
+2F805;W # CJK COMPATIBILITY IDEOGRAPH-2F805
+2F806;W # CJK COMPATIBILITY IDEOGRAPH-2F806
+2F807;W # CJK COMPATIBILITY IDEOGRAPH-2F807
+2F808;W # CJK COMPATIBILITY IDEOGRAPH-2F808
+2F809;W # CJK COMPATIBILITY IDEOGRAPH-2F809
+2F80A;W # CJK COMPATIBILITY IDEOGRAPH-2F80A
+2F80B;W # CJK COMPATIBILITY IDEOGRAPH-2F80B
+2F80C;W # CJK COMPATIBILITY IDEOGRAPH-2F80C
+2F80D;W # CJK COMPATIBILITY IDEOGRAPH-2F80D
+2F80E;W # CJK COMPATIBILITY IDEOGRAPH-2F80E
+2F80F;W # CJK COMPATIBILITY IDEOGRAPH-2F80F
+2F810;W # CJK COMPATIBILITY IDEOGRAPH-2F810
+2F811;W # CJK COMPATIBILITY IDEOGRAPH-2F811
+2F812;W # CJK COMPATIBILITY IDEOGRAPH-2F812
+2F813;W # CJK COMPATIBILITY IDEOGRAPH-2F813
+2F814;W # CJK COMPATIBILITY IDEOGRAPH-2F814
+2F815;W # CJK COMPATIBILITY IDEOGRAPH-2F815
+2F816;W # CJK COMPATIBILITY IDEOGRAPH-2F816
+2F817;W # CJK COMPATIBILITY IDEOGRAPH-2F817
+2F818;W # CJK COMPATIBILITY IDEOGRAPH-2F818
+2F819;W # CJK COMPATIBILITY IDEOGRAPH-2F819
+2F81A;W # CJK COMPATIBILITY IDEOGRAPH-2F81A
+2F81B;W # CJK COMPATIBILITY IDEOGRAPH-2F81B
+2F81C;W # CJK COMPATIBILITY IDEOGRAPH-2F81C
+2F81D;W # CJK COMPATIBILITY IDEOGRAPH-2F81D
+2F81E;W # CJK COMPATIBILITY IDEOGRAPH-2F81E
+2F81F;W # CJK COMPATIBILITY IDEOGRAPH-2F81F
+2F820;W # CJK COMPATIBILITY IDEOGRAPH-2F820
+2F821;W # CJK COMPATIBILITY IDEOGRAPH-2F821
+2F822;W # CJK COMPATIBILITY IDEOGRAPH-2F822
+2F823;W # CJK COMPATIBILITY IDEOGRAPH-2F823
+2F824;W # CJK COMPATIBILITY IDEOGRAPH-2F824
+2F825;W # CJK COMPATIBILITY IDEOGRAPH-2F825
+2F826;W # CJK COMPATIBILITY IDEOGRAPH-2F826
+2F827;W # CJK COMPATIBILITY IDEOGRAPH-2F827
+2F828;W # CJK COMPATIBILITY IDEOGRAPH-2F828
+2F829;W # CJK COMPATIBILITY IDEOGRAPH-2F829
+2F82A;W # CJK COMPATIBILITY IDEOGRAPH-2F82A
+2F82B;W # CJK COMPATIBILITY IDEOGRAPH-2F82B
+2F82C;W # CJK COMPATIBILITY IDEOGRAPH-2F82C
+2F82D;W # CJK COMPATIBILITY IDEOGRAPH-2F82D
+2F82E;W # CJK COMPATIBILITY IDEOGRAPH-2F82E
+2F82F;W # CJK COMPATIBILITY IDEOGRAPH-2F82F
+2F830;W # CJK COMPATIBILITY IDEOGRAPH-2F830
+2F831;W # CJK COMPATIBILITY IDEOGRAPH-2F831
+2F832;W # CJK COMPATIBILITY IDEOGRAPH-2F832
+2F833;W # CJK COMPATIBILITY IDEOGRAPH-2F833
+2F834;W # CJK COMPATIBILITY IDEOGRAPH-2F834
+2F835;W # CJK COMPATIBILITY IDEOGRAPH-2F835
+2F836;W # CJK COMPATIBILITY IDEOGRAPH-2F836
+2F837;W # CJK COMPATIBILITY IDEOGRAPH-2F837
+2F838;W # CJK COMPATIBILITY IDEOGRAPH-2F838
+2F839;W # CJK COMPATIBILITY IDEOGRAPH-2F839
+2F83A;W # CJK COMPATIBILITY IDEOGRAPH-2F83A
+2F83B;W # CJK COMPATIBILITY IDEOGRAPH-2F83B
+2F83C;W # CJK COMPATIBILITY IDEOGRAPH-2F83C
+2F83D;W # CJK COMPATIBILITY IDEOGRAPH-2F83D
+2F83E;W # CJK COMPATIBILITY IDEOGRAPH-2F83E
+2F83F;W # CJK COMPATIBILITY IDEOGRAPH-2F83F
+2F840;W # CJK COMPATIBILITY IDEOGRAPH-2F840
+2F841;W # CJK COMPATIBILITY IDEOGRAPH-2F841
+2F842;W # CJK COMPATIBILITY IDEOGRAPH-2F842
+2F843;W # CJK COMPATIBILITY IDEOGRAPH-2F843
+2F844;W # CJK COMPATIBILITY IDEOGRAPH-2F844
+2F845;W # CJK COMPATIBILITY IDEOGRAPH-2F845
+2F846;W # CJK COMPATIBILITY IDEOGRAPH-2F846
+2F847;W # CJK COMPATIBILITY IDEOGRAPH-2F847
+2F848;W # CJK COMPATIBILITY IDEOGRAPH-2F848
+2F849;W # CJK COMPATIBILITY IDEOGRAPH-2F849
+2F84A;W # CJK COMPATIBILITY IDEOGRAPH-2F84A
+2F84B;W # CJK COMPATIBILITY IDEOGRAPH-2F84B
+2F84C;W # CJK COMPATIBILITY IDEOGRAPH-2F84C
+2F84D;W # CJK COMPATIBILITY IDEOGRAPH-2F84D
+2F84E;W # CJK COMPATIBILITY IDEOGRAPH-2F84E
+2F84F;W # CJK COMPATIBILITY IDEOGRAPH-2F84F
+2F850;W # CJK COMPATIBILITY IDEOGRAPH-2F850
+2F851;W # CJK COMPATIBILITY IDEOGRAPH-2F851
+2F852;W # CJK COMPATIBILITY IDEOGRAPH-2F852
+2F853;W # CJK COMPATIBILITY IDEOGRAPH-2F853
+2F854;W # CJK COMPATIBILITY IDEOGRAPH-2F854
+2F855;W # CJK COMPATIBILITY IDEOGRAPH-2F855
+2F856;W # CJK COMPATIBILITY IDEOGRAPH-2F856
+2F857;W # CJK COMPATIBILITY IDEOGRAPH-2F857
+2F858;W # CJK COMPATIBILITY IDEOGRAPH-2F858
+2F859;W # CJK COMPATIBILITY IDEOGRAPH-2F859
+2F85A;W # CJK COMPATIBILITY IDEOGRAPH-2F85A
+2F85B;W # CJK COMPATIBILITY IDEOGRAPH-2F85B
+2F85C;W # CJK COMPATIBILITY IDEOGRAPH-2F85C
+2F85D;W # CJK COMPATIBILITY IDEOGRAPH-2F85D
+2F85E;W # CJK COMPATIBILITY IDEOGRAPH-2F85E
+2F85F;W # CJK COMPATIBILITY IDEOGRAPH-2F85F
+2F860;W # CJK COMPATIBILITY IDEOGRAPH-2F860
+2F861;W # CJK COMPATIBILITY IDEOGRAPH-2F861
+2F862;W # CJK COMPATIBILITY IDEOGRAPH-2F862
+2F863;W # CJK COMPATIBILITY IDEOGRAPH-2F863
+2F864;W # CJK COMPATIBILITY IDEOGRAPH-2F864
+2F865;W # CJK COMPATIBILITY IDEOGRAPH-2F865
+2F866;W # CJK COMPATIBILITY IDEOGRAPH-2F866
+2F867;W # CJK COMPATIBILITY IDEOGRAPH-2F867
+2F868;W # CJK COMPATIBILITY IDEOGRAPH-2F868
+2F869;W # CJK COMPATIBILITY IDEOGRAPH-2F869
+2F86A;W # CJK COMPATIBILITY IDEOGRAPH-2F86A
+2F86B;W # CJK COMPATIBILITY IDEOGRAPH-2F86B
+2F86C;W # CJK COMPATIBILITY IDEOGRAPH-2F86C
+2F86D;W # CJK COMPATIBILITY IDEOGRAPH-2F86D
+2F86E;W # CJK COMPATIBILITY IDEOGRAPH-2F86E
+2F86F;W # CJK COMPATIBILITY IDEOGRAPH-2F86F
+2F870;W # CJK COMPATIBILITY IDEOGRAPH-2F870
+2F871;W # CJK COMPATIBILITY IDEOGRAPH-2F871
+2F872;W # CJK COMPATIBILITY IDEOGRAPH-2F872
+2F873;W # CJK COMPATIBILITY IDEOGRAPH-2F873
+2F874;W # CJK COMPATIBILITY IDEOGRAPH-2F874
+2F875;W # CJK COMPATIBILITY IDEOGRAPH-2F875
+2F876;W # CJK COMPATIBILITY IDEOGRAPH-2F876
+2F877;W # CJK COMPATIBILITY IDEOGRAPH-2F877
+2F878;W # CJK COMPATIBILITY IDEOGRAPH-2F878
+2F879;W # CJK COMPATIBILITY IDEOGRAPH-2F879
+2F87A;W # CJK COMPATIBILITY IDEOGRAPH-2F87A
+2F87B;W # CJK COMPATIBILITY IDEOGRAPH-2F87B
+2F87C;W # CJK COMPATIBILITY IDEOGRAPH-2F87C
+2F87D;W # CJK COMPATIBILITY IDEOGRAPH-2F87D
+2F87E;W # CJK COMPATIBILITY IDEOGRAPH-2F87E
+2F87F;W # CJK COMPATIBILITY IDEOGRAPH-2F87F
+2F880;W # CJK COMPATIBILITY IDEOGRAPH-2F880
+2F881;W # CJK COMPATIBILITY IDEOGRAPH-2F881
+2F882;W # CJK COMPATIBILITY IDEOGRAPH-2F882
+2F883;W # CJK COMPATIBILITY IDEOGRAPH-2F883
+2F884;W # CJK COMPATIBILITY IDEOGRAPH-2F884
+2F885;W # CJK COMPATIBILITY IDEOGRAPH-2F885
+2F886;W # CJK COMPATIBILITY IDEOGRAPH-2F886
+2F887;W # CJK COMPATIBILITY IDEOGRAPH-2F887
+2F888;W # CJK COMPATIBILITY IDEOGRAPH-2F888
+2F889;W # CJK COMPATIBILITY IDEOGRAPH-2F889
+2F88A;W # CJK COMPATIBILITY IDEOGRAPH-2F88A
+2F88B;W # CJK COMPATIBILITY IDEOGRAPH-2F88B
+2F88C;W # CJK COMPATIBILITY IDEOGRAPH-2F88C
+2F88D;W # CJK COMPATIBILITY IDEOGRAPH-2F88D
+2F88E;W # CJK COMPATIBILITY IDEOGRAPH-2F88E
+2F88F;W # CJK COMPATIBILITY IDEOGRAPH-2F88F
+2F890;W # CJK COMPATIBILITY IDEOGRAPH-2F890
+2F891;W # CJK COMPATIBILITY IDEOGRAPH-2F891
+2F892;W # CJK COMPATIBILITY IDEOGRAPH-2F892
+2F893;W # CJK COMPATIBILITY IDEOGRAPH-2F893
+2F894;W # CJK COMPATIBILITY IDEOGRAPH-2F894
+2F895;W # CJK COMPATIBILITY IDEOGRAPH-2F895
+2F896;W # CJK COMPATIBILITY IDEOGRAPH-2F896
+2F897;W # CJK COMPATIBILITY IDEOGRAPH-2F897
+2F898;W # CJK COMPATIBILITY IDEOGRAPH-2F898
+2F899;W # CJK COMPATIBILITY IDEOGRAPH-2F899
+2F89A;W # CJK COMPATIBILITY IDEOGRAPH-2F89A
+2F89B;W # CJK COMPATIBILITY IDEOGRAPH-2F89B
+2F89C;W # CJK COMPATIBILITY IDEOGRAPH-2F89C
+2F89D;W # CJK COMPATIBILITY IDEOGRAPH-2F89D
+2F89E;W # CJK COMPATIBILITY IDEOGRAPH-2F89E
+2F89F;W # CJK COMPATIBILITY IDEOGRAPH-2F89F
+2F8A0;W # CJK COMPATIBILITY IDEOGRAPH-2F8A0
+2F8A1;W # CJK COMPATIBILITY IDEOGRAPH-2F8A1
+2F8A2;W # CJK COMPATIBILITY IDEOGRAPH-2F8A2
+2F8A3;W # CJK COMPATIBILITY IDEOGRAPH-2F8A3
+2F8A4;W # CJK COMPATIBILITY IDEOGRAPH-2F8A4
+2F8A5;W # CJK COMPATIBILITY IDEOGRAPH-2F8A5
+2F8A6;W # CJK COMPATIBILITY IDEOGRAPH-2F8A6
+2F8A7;W # CJK COMPATIBILITY IDEOGRAPH-2F8A7
+2F8A8;W # CJK COMPATIBILITY IDEOGRAPH-2F8A8
+2F8A9;W # CJK COMPATIBILITY IDEOGRAPH-2F8A9
+2F8AA;W # CJK COMPATIBILITY IDEOGRAPH-2F8AA
+2F8AB;W # CJK COMPATIBILITY IDEOGRAPH-2F8AB
+2F8AC;W # CJK COMPATIBILITY IDEOGRAPH-2F8AC
+2F8AD;W # CJK COMPATIBILITY IDEOGRAPH-2F8AD
+2F8AE;W # CJK COMPATIBILITY IDEOGRAPH-2F8AE
+2F8AF;W # CJK COMPATIBILITY IDEOGRAPH-2F8AF
+2F8B0;W # CJK COMPATIBILITY IDEOGRAPH-2F8B0
+2F8B1;W # CJK COMPATIBILITY IDEOGRAPH-2F8B1
+2F8B2;W # CJK COMPATIBILITY IDEOGRAPH-2F8B2
+2F8B3;W # CJK COMPATIBILITY IDEOGRAPH-2F8B3
+2F8B4;W # CJK COMPATIBILITY IDEOGRAPH-2F8B4
+2F8B5;W # CJK COMPATIBILITY IDEOGRAPH-2F8B5
+2F8B6;W # CJK COMPATIBILITY IDEOGRAPH-2F8B6
+2F8B7;W # CJK COMPATIBILITY IDEOGRAPH-2F8B7
+2F8B8;W # CJK COMPATIBILITY IDEOGRAPH-2F8B8
+2F8B9;W # CJK COMPATIBILITY IDEOGRAPH-2F8B9
+2F8BA;W # CJK COMPATIBILITY IDEOGRAPH-2F8BA
+2F8BB;W # CJK COMPATIBILITY IDEOGRAPH-2F8BB
+2F8BC;W # CJK COMPATIBILITY IDEOGRAPH-2F8BC
+2F8BD;W # CJK COMPATIBILITY IDEOGRAPH-2F8BD
+2F8BE;W # CJK COMPATIBILITY IDEOGRAPH-2F8BE
+2F8BF;W # CJK COMPATIBILITY IDEOGRAPH-2F8BF
+2F8C0;W # CJK COMPATIBILITY IDEOGRAPH-2F8C0
+2F8C1;W # CJK COMPATIBILITY IDEOGRAPH-2F8C1
+2F8C2;W # CJK COMPATIBILITY IDEOGRAPH-2F8C2
+2F8C3;W # CJK COMPATIBILITY IDEOGRAPH-2F8C3
+2F8C4;W # CJK COMPATIBILITY IDEOGRAPH-2F8C4
+2F8C5;W # CJK COMPATIBILITY IDEOGRAPH-2F8C5
+2F8C6;W # CJK COMPATIBILITY IDEOGRAPH-2F8C6
+2F8C7;W # CJK COMPATIBILITY IDEOGRAPH-2F8C7
+2F8C8;W # CJK COMPATIBILITY IDEOGRAPH-2F8C8
+2F8C9;W # CJK COMPATIBILITY IDEOGRAPH-2F8C9
+2F8CA;W # CJK COMPATIBILITY IDEOGRAPH-2F8CA
+2F8CB;W # CJK COMPATIBILITY IDEOGRAPH-2F8CB
+2F8CC;W # CJK COMPATIBILITY IDEOGRAPH-2F8CC
+2F8CD;W # CJK COMPATIBILITY IDEOGRAPH-2F8CD
+2F8CE;W # CJK COMPATIBILITY IDEOGRAPH-2F8CE
+2F8CF;W # CJK COMPATIBILITY IDEOGRAPH-2F8CF
+2F8D0;W # CJK COMPATIBILITY IDEOGRAPH-2F8D0
+2F8D1;W # CJK COMPATIBILITY IDEOGRAPH-2F8D1
+2F8D2;W # CJK COMPATIBILITY IDEOGRAPH-2F8D2
+2F8D3;W # CJK COMPATIBILITY IDEOGRAPH-2F8D3
+2F8D4;W # CJK COMPATIBILITY IDEOGRAPH-2F8D4
+2F8D5;W # CJK COMPATIBILITY IDEOGRAPH-2F8D5
+2F8D6;W # CJK COMPATIBILITY IDEOGRAPH-2F8D6
+2F8D7;W # CJK COMPATIBILITY IDEOGRAPH-2F8D7
+2F8D8;W # CJK COMPATIBILITY IDEOGRAPH-2F8D8
+2F8D9;W # CJK COMPATIBILITY IDEOGRAPH-2F8D9
+2F8DA;W # CJK COMPATIBILITY IDEOGRAPH-2F8DA
+2F8DB;W # CJK COMPATIBILITY IDEOGRAPH-2F8DB
+2F8DC;W # CJK COMPATIBILITY IDEOGRAPH-2F8DC
+2F8DD;W # CJK COMPATIBILITY IDEOGRAPH-2F8DD
+2F8DE;W # CJK COMPATIBILITY IDEOGRAPH-2F8DE
+2F8DF;W # CJK COMPATIBILITY IDEOGRAPH-2F8DF
+2F8E0;W # CJK COMPATIBILITY IDEOGRAPH-2F8E0
+2F8E1;W # CJK COMPATIBILITY IDEOGRAPH-2F8E1
+2F8E2;W # CJK COMPATIBILITY IDEOGRAPH-2F8E2
+2F8E3;W # CJK COMPATIBILITY IDEOGRAPH-2F8E3
+2F8E4;W # CJK COMPATIBILITY IDEOGRAPH-2F8E4
+2F8E5;W # CJK COMPATIBILITY IDEOGRAPH-2F8E5
+2F8E6;W # CJK COMPATIBILITY IDEOGRAPH-2F8E6
+2F8E7;W # CJK COMPATIBILITY IDEOGRAPH-2F8E7
+2F8E8;W # CJK COMPATIBILITY IDEOGRAPH-2F8E8
+2F8E9;W # CJK COMPATIBILITY IDEOGRAPH-2F8E9
+2F8EA;W # CJK COMPATIBILITY IDEOGRAPH-2F8EA
+2F8EB;W # CJK COMPATIBILITY IDEOGRAPH-2F8EB
+2F8EC;W # CJK COMPATIBILITY IDEOGRAPH-2F8EC
+2F8ED;W # CJK COMPATIBILITY IDEOGRAPH-2F8ED
+2F8EE;W # CJK COMPATIBILITY IDEOGRAPH-2F8EE
+2F8EF;W # CJK COMPATIBILITY IDEOGRAPH-2F8EF
+2F8F0;W # CJK COMPATIBILITY IDEOGRAPH-2F8F0
+2F8F1;W # CJK COMPATIBILITY IDEOGRAPH-2F8F1
+2F8F2;W # CJK COMPATIBILITY IDEOGRAPH-2F8F2
+2F8F3;W # CJK COMPATIBILITY IDEOGRAPH-2F8F3
+2F8F4;W # CJK COMPATIBILITY IDEOGRAPH-2F8F4
+2F8F5;W # CJK COMPATIBILITY IDEOGRAPH-2F8F5
+2F8F6;W # CJK COMPATIBILITY IDEOGRAPH-2F8F6
+2F8F7;W # CJK COMPATIBILITY IDEOGRAPH-2F8F7
+2F8F8;W # CJK COMPATIBILITY IDEOGRAPH-2F8F8
+2F8F9;W # CJK COMPATIBILITY IDEOGRAPH-2F8F9
+2F8FA;W # CJK COMPATIBILITY IDEOGRAPH-2F8FA
+2F8FB;W # CJK COMPATIBILITY IDEOGRAPH-2F8FB
+2F8FC;W # CJK COMPATIBILITY IDEOGRAPH-2F8FC
+2F8FD;W # CJK COMPATIBILITY IDEOGRAPH-2F8FD
+2F8FE;W # CJK COMPATIBILITY IDEOGRAPH-2F8FE
+2F8FF;W # CJK COMPATIBILITY IDEOGRAPH-2F8FF
+2F900;W # CJK COMPATIBILITY IDEOGRAPH-2F900
+2F901;W # CJK COMPATIBILITY IDEOGRAPH-2F901
+2F902;W # CJK COMPATIBILITY IDEOGRAPH-2F902
+2F903;W # CJK COMPATIBILITY IDEOGRAPH-2F903
+2F904;W # CJK COMPATIBILITY IDEOGRAPH-2F904
+2F905;W # CJK COMPATIBILITY IDEOGRAPH-2F905
+2F906;W # CJK COMPATIBILITY IDEOGRAPH-2F906
+2F907;W # CJK COMPATIBILITY IDEOGRAPH-2F907
+2F908;W # CJK COMPATIBILITY IDEOGRAPH-2F908
+2F909;W # CJK COMPATIBILITY IDEOGRAPH-2F909
+2F90A;W # CJK COMPATIBILITY IDEOGRAPH-2F90A
+2F90B;W # CJK COMPATIBILITY IDEOGRAPH-2F90B
+2F90C;W # CJK COMPATIBILITY IDEOGRAPH-2F90C
+2F90D;W # CJK COMPATIBILITY IDEOGRAPH-2F90D
+2F90E;W # CJK COMPATIBILITY IDEOGRAPH-2F90E
+2F90F;W # CJK COMPATIBILITY IDEOGRAPH-2F90F
+2F910;W # CJK COMPATIBILITY IDEOGRAPH-2F910
+2F911;W # CJK COMPATIBILITY IDEOGRAPH-2F911
+2F912;W # CJK COMPATIBILITY IDEOGRAPH-2F912
+2F913;W # CJK COMPATIBILITY IDEOGRAPH-2F913
+2F914;W # CJK COMPATIBILITY IDEOGRAPH-2F914
+2F915;W # CJK COMPATIBILITY IDEOGRAPH-2F915
+2F916;W # CJK COMPATIBILITY IDEOGRAPH-2F916
+2F917;W # CJK COMPATIBILITY IDEOGRAPH-2F917
+2F918;W # CJK COMPATIBILITY IDEOGRAPH-2F918
+2F919;W # CJK COMPATIBILITY IDEOGRAPH-2F919
+2F91A;W # CJK COMPATIBILITY IDEOGRAPH-2F91A
+2F91B;W # CJK COMPATIBILITY IDEOGRAPH-2F91B
+2F91C;W # CJK COMPATIBILITY IDEOGRAPH-2F91C
+2F91D;W # CJK COMPATIBILITY IDEOGRAPH-2F91D
+2F91E;W # CJK COMPATIBILITY IDEOGRAPH-2F91E
+2F91F;W # CJK COMPATIBILITY IDEOGRAPH-2F91F
+2F920;W # CJK COMPATIBILITY IDEOGRAPH-2F920
+2F921;W # CJK COMPATIBILITY IDEOGRAPH-2F921
+2F922;W # CJK COMPATIBILITY IDEOGRAPH-2F922
+2F923;W # CJK COMPATIBILITY IDEOGRAPH-2F923
+2F924;W # CJK COMPATIBILITY IDEOGRAPH-2F924
+2F925;W # CJK COMPATIBILITY IDEOGRAPH-2F925
+2F926;W # CJK COMPATIBILITY IDEOGRAPH-2F926
+2F927;W # CJK COMPATIBILITY IDEOGRAPH-2F927
+2F928;W # CJK COMPATIBILITY IDEOGRAPH-2F928
+2F929;W # CJK COMPATIBILITY IDEOGRAPH-2F929
+2F92A;W # CJK COMPATIBILITY IDEOGRAPH-2F92A
+2F92B;W # CJK COMPATIBILITY IDEOGRAPH-2F92B
+2F92C;W # CJK COMPATIBILITY IDEOGRAPH-2F92C
+2F92D;W # CJK COMPATIBILITY IDEOGRAPH-2F92D
+2F92E;W # CJK COMPATIBILITY IDEOGRAPH-2F92E
+2F92F;W # CJK COMPATIBILITY IDEOGRAPH-2F92F
+2F930;W # CJK COMPATIBILITY IDEOGRAPH-2F930
+2F931;W # CJK COMPATIBILITY IDEOGRAPH-2F931
+2F932;W # CJK COMPATIBILITY IDEOGRAPH-2F932
+2F933;W # CJK COMPATIBILITY IDEOGRAPH-2F933
+2F934;W # CJK COMPATIBILITY IDEOGRAPH-2F934
+2F935;W # CJK COMPATIBILITY IDEOGRAPH-2F935
+2F936;W # CJK COMPATIBILITY IDEOGRAPH-2F936
+2F937;W # CJK COMPATIBILITY IDEOGRAPH-2F937
+2F938;W # CJK COMPATIBILITY IDEOGRAPH-2F938
+2F939;W # CJK COMPATIBILITY IDEOGRAPH-2F939
+2F93A;W # CJK COMPATIBILITY IDEOGRAPH-2F93A
+2F93B;W # CJK COMPATIBILITY IDEOGRAPH-2F93B
+2F93C;W # CJK COMPATIBILITY IDEOGRAPH-2F93C
+2F93D;W # CJK COMPATIBILITY IDEOGRAPH-2F93D
+2F93E;W # CJK COMPATIBILITY IDEOGRAPH-2F93E
+2F93F;W # CJK COMPATIBILITY IDEOGRAPH-2F93F
+2F940;W # CJK COMPATIBILITY IDEOGRAPH-2F940
+2F941;W # CJK COMPATIBILITY IDEOGRAPH-2F941
+2F942;W # CJK COMPATIBILITY IDEOGRAPH-2F942
+2F943;W # CJK COMPATIBILITY IDEOGRAPH-2F943
+2F944;W # CJK COMPATIBILITY IDEOGRAPH-2F944
+2F945;W # CJK COMPATIBILITY IDEOGRAPH-2F945
+2F946;W # CJK COMPATIBILITY IDEOGRAPH-2F946
+2F947;W # CJK COMPATIBILITY IDEOGRAPH-2F947
+2F948;W # CJK COMPATIBILITY IDEOGRAPH-2F948
+2F949;W # CJK COMPATIBILITY IDEOGRAPH-2F949
+2F94A;W # CJK COMPATIBILITY IDEOGRAPH-2F94A
+2F94B;W # CJK COMPATIBILITY IDEOGRAPH-2F94B
+2F94C;W # CJK COMPATIBILITY IDEOGRAPH-2F94C
+2F94D;W # CJK COMPATIBILITY IDEOGRAPH-2F94D
+2F94E;W # CJK COMPATIBILITY IDEOGRAPH-2F94E
+2F94F;W # CJK COMPATIBILITY IDEOGRAPH-2F94F
+2F950;W # CJK COMPATIBILITY IDEOGRAPH-2F950
+2F951;W # CJK COMPATIBILITY IDEOGRAPH-2F951
+2F952;W # CJK COMPATIBILITY IDEOGRAPH-2F952
+2F953;W # CJK COMPATIBILITY IDEOGRAPH-2F953
+2F954;W # CJK COMPATIBILITY IDEOGRAPH-2F954
+2F955;W # CJK COMPATIBILITY IDEOGRAPH-2F955
+2F956;W # CJK COMPATIBILITY IDEOGRAPH-2F956
+2F957;W # CJK COMPATIBILITY IDEOGRAPH-2F957
+2F958;W # CJK COMPATIBILITY IDEOGRAPH-2F958
+2F959;W # CJK COMPATIBILITY IDEOGRAPH-2F959
+2F95A;W # CJK COMPATIBILITY IDEOGRAPH-2F95A
+2F95B;W # CJK COMPATIBILITY IDEOGRAPH-2F95B
+2F95C;W # CJK COMPATIBILITY IDEOGRAPH-2F95C
+2F95D;W # CJK COMPATIBILITY IDEOGRAPH-2F95D
+2F95E;W # CJK COMPATIBILITY IDEOGRAPH-2F95E
+2F95F;W # CJK COMPATIBILITY IDEOGRAPH-2F95F
+2F960;W # CJK COMPATIBILITY IDEOGRAPH-2F960
+2F961;W # CJK COMPATIBILITY IDEOGRAPH-2F961
+2F962;W # CJK COMPATIBILITY IDEOGRAPH-2F962
+2F963;W # CJK COMPATIBILITY IDEOGRAPH-2F963
+2F964;W # CJK COMPATIBILITY IDEOGRAPH-2F964
+2F965;W # CJK COMPATIBILITY IDEOGRAPH-2F965
+2F966;W # CJK COMPATIBILITY IDEOGRAPH-2F966
+2F967;W # CJK COMPATIBILITY IDEOGRAPH-2F967
+2F968;W # CJK COMPATIBILITY IDEOGRAPH-2F968
+2F969;W # CJK COMPATIBILITY IDEOGRAPH-2F969
+2F96A;W # CJK COMPATIBILITY IDEOGRAPH-2F96A
+2F96B;W # CJK COMPATIBILITY IDEOGRAPH-2F96B
+2F96C;W # CJK COMPATIBILITY IDEOGRAPH-2F96C
+2F96D;W # CJK COMPATIBILITY IDEOGRAPH-2F96D
+2F96E;W # CJK COMPATIBILITY IDEOGRAPH-2F96E
+2F96F;W # CJK COMPATIBILITY IDEOGRAPH-2F96F
+2F970;W # CJK COMPATIBILITY IDEOGRAPH-2F970
+2F971;W # CJK COMPATIBILITY IDEOGRAPH-2F971
+2F972;W # CJK COMPATIBILITY IDEOGRAPH-2F972
+2F973;W # CJK COMPATIBILITY IDEOGRAPH-2F973
+2F974;W # CJK COMPATIBILITY IDEOGRAPH-2F974
+2F975;W # CJK COMPATIBILITY IDEOGRAPH-2F975
+2F976;W # CJK COMPATIBILITY IDEOGRAPH-2F976
+2F977;W # CJK COMPATIBILITY IDEOGRAPH-2F977
+2F978;W # CJK COMPATIBILITY IDEOGRAPH-2F978
+2F979;W # CJK COMPATIBILITY IDEOGRAPH-2F979
+2F97A;W # CJK COMPATIBILITY IDEOGRAPH-2F97A
+2F97B;W # CJK COMPATIBILITY IDEOGRAPH-2F97B
+2F97C;W # CJK COMPATIBILITY IDEOGRAPH-2F97C
+2F97D;W # CJK COMPATIBILITY IDEOGRAPH-2F97D
+2F97E;W # CJK COMPATIBILITY IDEOGRAPH-2F97E
+2F97F;W # CJK COMPATIBILITY IDEOGRAPH-2F97F
+2F980;W # CJK COMPATIBILITY IDEOGRAPH-2F980
+2F981;W # CJK COMPATIBILITY IDEOGRAPH-2F981
+2F982;W # CJK COMPATIBILITY IDEOGRAPH-2F982
+2F983;W # CJK COMPATIBILITY IDEOGRAPH-2F983
+2F984;W # CJK COMPATIBILITY IDEOGRAPH-2F984
+2F985;W # CJK COMPATIBILITY IDEOGRAPH-2F985
+2F986;W # CJK COMPATIBILITY IDEOGRAPH-2F986
+2F987;W # CJK COMPATIBILITY IDEOGRAPH-2F987
+2F988;W # CJK COMPATIBILITY IDEOGRAPH-2F988
+2F989;W # CJK COMPATIBILITY IDEOGRAPH-2F989
+2F98A;W # CJK COMPATIBILITY IDEOGRAPH-2F98A
+2F98B;W # CJK COMPATIBILITY IDEOGRAPH-2F98B
+2F98C;W # CJK COMPATIBILITY IDEOGRAPH-2F98C
+2F98D;W # CJK COMPATIBILITY IDEOGRAPH-2F98D
+2F98E;W # CJK COMPATIBILITY IDEOGRAPH-2F98E
+2F98F;W # CJK COMPATIBILITY IDEOGRAPH-2F98F
+2F990;W # CJK COMPATIBILITY IDEOGRAPH-2F990
+2F991;W # CJK COMPATIBILITY IDEOGRAPH-2F991
+2F992;W # CJK COMPATIBILITY IDEOGRAPH-2F992
+2F993;W # CJK COMPATIBILITY IDEOGRAPH-2F993
+2F994;W # CJK COMPATIBILITY IDEOGRAPH-2F994
+2F995;W # CJK COMPATIBILITY IDEOGRAPH-2F995
+2F996;W # CJK COMPATIBILITY IDEOGRAPH-2F996
+2F997;W # CJK COMPATIBILITY IDEOGRAPH-2F997
+2F998;W # CJK COMPATIBILITY IDEOGRAPH-2F998
+2F999;W # CJK COMPATIBILITY IDEOGRAPH-2F999
+2F99A;W # CJK COMPATIBILITY IDEOGRAPH-2F99A
+2F99B;W # CJK COMPATIBILITY IDEOGRAPH-2F99B
+2F99C;W # CJK COMPATIBILITY IDEOGRAPH-2F99C
+2F99D;W # CJK COMPATIBILITY IDEOGRAPH-2F99D
+2F99E;W # CJK COMPATIBILITY IDEOGRAPH-2F99E
+2F99F;W # CJK COMPATIBILITY IDEOGRAPH-2F99F
+2F9A0;W # CJK COMPATIBILITY IDEOGRAPH-2F9A0
+2F9A1;W # CJK COMPATIBILITY IDEOGRAPH-2F9A1
+2F9A2;W # CJK COMPATIBILITY IDEOGRAPH-2F9A2
+2F9A3;W # CJK COMPATIBILITY IDEOGRAPH-2F9A3
+2F9A4;W # CJK COMPATIBILITY IDEOGRAPH-2F9A4
+2F9A5;W # CJK COMPATIBILITY IDEOGRAPH-2F9A5
+2F9A6;W # CJK COMPATIBILITY IDEOGRAPH-2F9A6
+2F9A7;W # CJK COMPATIBILITY IDEOGRAPH-2F9A7
+2F9A8;W # CJK COMPATIBILITY IDEOGRAPH-2F9A8
+2F9A9;W # CJK COMPATIBILITY IDEOGRAPH-2F9A9
+2F9AA;W # CJK COMPATIBILITY IDEOGRAPH-2F9AA
+2F9AB;W # CJK COMPATIBILITY IDEOGRAPH-2F9AB
+2F9AC;W # CJK COMPATIBILITY IDEOGRAPH-2F9AC
+2F9AD;W # CJK COMPATIBILITY IDEOGRAPH-2F9AD
+2F9AE;W # CJK COMPATIBILITY IDEOGRAPH-2F9AE
+2F9AF;W # CJK COMPATIBILITY IDEOGRAPH-2F9AF
+2F9B0;W # CJK COMPATIBILITY IDEOGRAPH-2F9B0
+2F9B1;W # CJK COMPATIBILITY IDEOGRAPH-2F9B1
+2F9B2;W # CJK COMPATIBILITY IDEOGRAPH-2F9B2
+2F9B3;W # CJK COMPATIBILITY IDEOGRAPH-2F9B3
+2F9B4;W # CJK COMPATIBILITY IDEOGRAPH-2F9B4
+2F9B5;W # CJK COMPATIBILITY IDEOGRAPH-2F9B5
+2F9B6;W # CJK COMPATIBILITY IDEOGRAPH-2F9B6
+2F9B7;W # CJK COMPATIBILITY IDEOGRAPH-2F9B7
+2F9B8;W # CJK COMPATIBILITY IDEOGRAPH-2F9B8
+2F9B9;W # CJK COMPATIBILITY IDEOGRAPH-2F9B9
+2F9BA;W # CJK COMPATIBILITY IDEOGRAPH-2F9BA
+2F9BB;W # CJK COMPATIBILITY IDEOGRAPH-2F9BB
+2F9BC;W # CJK COMPATIBILITY IDEOGRAPH-2F9BC
+2F9BD;W # CJK COMPATIBILITY IDEOGRAPH-2F9BD
+2F9BE;W # CJK COMPATIBILITY IDEOGRAPH-2F9BE
+2F9BF;W # CJK COMPATIBILITY IDEOGRAPH-2F9BF
+2F9C0;W # CJK COMPATIBILITY IDEOGRAPH-2F9C0
+2F9C1;W # CJK COMPATIBILITY IDEOGRAPH-2F9C1
+2F9C2;W # CJK COMPATIBILITY IDEOGRAPH-2F9C2
+2F9C3;W # CJK COMPATIBILITY IDEOGRAPH-2F9C3
+2F9C4;W # CJK COMPATIBILITY IDEOGRAPH-2F9C4
+2F9C5;W # CJK COMPATIBILITY IDEOGRAPH-2F9C5
+2F9C6;W # CJK COMPATIBILITY IDEOGRAPH-2F9C6
+2F9C7;W # CJK COMPATIBILITY IDEOGRAPH-2F9C7
+2F9C8;W # CJK COMPATIBILITY IDEOGRAPH-2F9C8
+2F9C9;W # CJK COMPATIBILITY IDEOGRAPH-2F9C9
+2F9CA;W # CJK COMPATIBILITY IDEOGRAPH-2F9CA
+2F9CB;W # CJK COMPATIBILITY IDEOGRAPH-2F9CB
+2F9CC;W # CJK COMPATIBILITY IDEOGRAPH-2F9CC
+2F9CD;W # CJK COMPATIBILITY IDEOGRAPH-2F9CD
+2F9CE;W # CJK COMPATIBILITY IDEOGRAPH-2F9CE
+2F9CF;W # CJK COMPATIBILITY IDEOGRAPH-2F9CF
+2F9D0;W # CJK COMPATIBILITY IDEOGRAPH-2F9D0
+2F9D1;W # CJK COMPATIBILITY IDEOGRAPH-2F9D1
+2F9D2;W # CJK COMPATIBILITY IDEOGRAPH-2F9D2
+2F9D3;W # CJK COMPATIBILITY IDEOGRAPH-2F9D3
+2F9D4;W # CJK COMPATIBILITY IDEOGRAPH-2F9D4
+2F9D5;W # CJK COMPATIBILITY IDEOGRAPH-2F9D5
+2F9D6;W # CJK COMPATIBILITY IDEOGRAPH-2F9D6
+2F9D7;W # CJK COMPATIBILITY IDEOGRAPH-2F9D7
+2F9D8;W # CJK COMPATIBILITY IDEOGRAPH-2F9D8
+2F9D9;W # CJK COMPATIBILITY IDEOGRAPH-2F9D9
+2F9DA;W # CJK COMPATIBILITY IDEOGRAPH-2F9DA
+2F9DB;W # CJK COMPATIBILITY IDEOGRAPH-2F9DB
+2F9DC;W # CJK COMPATIBILITY IDEOGRAPH-2F9DC
+2F9DD;W # CJK COMPATIBILITY IDEOGRAPH-2F9DD
+2F9DE;W # CJK COMPATIBILITY IDEOGRAPH-2F9DE
+2F9DF;W # CJK COMPATIBILITY IDEOGRAPH-2F9DF
+2F9E0;W # CJK COMPATIBILITY IDEOGRAPH-2F9E0
+2F9E1;W # CJK COMPATIBILITY IDEOGRAPH-2F9E1
+2F9E2;W # CJK COMPATIBILITY IDEOGRAPH-2F9E2
+2F9E3;W # CJK COMPATIBILITY IDEOGRAPH-2F9E3
+2F9E4;W # CJK COMPATIBILITY IDEOGRAPH-2F9E4
+2F9E5;W # CJK COMPATIBILITY IDEOGRAPH-2F9E5
+2F9E6;W # CJK COMPATIBILITY IDEOGRAPH-2F9E6
+2F9E7;W # CJK COMPATIBILITY IDEOGRAPH-2F9E7
+2F9E8;W # CJK COMPATIBILITY IDEOGRAPH-2F9E8
+2F9E9;W # CJK COMPATIBILITY IDEOGRAPH-2F9E9
+2F9EA;W # CJK COMPATIBILITY IDEOGRAPH-2F9EA
+2F9EB;W # CJK COMPATIBILITY IDEOGRAPH-2F9EB
+2F9EC;W # CJK COMPATIBILITY IDEOGRAPH-2F9EC
+2F9ED;W # CJK COMPATIBILITY IDEOGRAPH-2F9ED
+2F9EE;W # CJK COMPATIBILITY IDEOGRAPH-2F9EE
+2F9EF;W # CJK COMPATIBILITY IDEOGRAPH-2F9EF
+2F9F0;W # CJK COMPATIBILITY IDEOGRAPH-2F9F0
+2F9F1;W # CJK COMPATIBILITY IDEOGRAPH-2F9F1
+2F9F2;W # CJK COMPATIBILITY IDEOGRAPH-2F9F2
+2F9F3;W # CJK COMPATIBILITY IDEOGRAPH-2F9F3
+2F9F4;W # CJK COMPATIBILITY IDEOGRAPH-2F9F4
+2F9F5;W # CJK COMPATIBILITY IDEOGRAPH-2F9F5
+2F9F6;W # CJK COMPATIBILITY IDEOGRAPH-2F9F6
+2F9F7;W # CJK COMPATIBILITY IDEOGRAPH-2F9F7
+2F9F8;W # CJK COMPATIBILITY IDEOGRAPH-2F9F8
+2F9F9;W # CJK COMPATIBILITY IDEOGRAPH-2F9F9
+2F9FA;W # CJK COMPATIBILITY IDEOGRAPH-2F9FA
+2F9FB;W # CJK COMPATIBILITY IDEOGRAPH-2F9FB
+2F9FC;W # CJK COMPATIBILITY IDEOGRAPH-2F9FC
+2F9FD;W # CJK COMPATIBILITY IDEOGRAPH-2F9FD
+2F9FE;W # CJK COMPATIBILITY IDEOGRAPH-2F9FE
+2F9FF;W # CJK COMPATIBILITY IDEOGRAPH-2F9FF
+2FA00;W # CJK COMPATIBILITY IDEOGRAPH-2FA00
+2FA01;W # CJK COMPATIBILITY IDEOGRAPH-2FA01
+2FA02;W # CJK COMPATIBILITY IDEOGRAPH-2FA02
+2FA03;W # CJK COMPATIBILITY IDEOGRAPH-2FA03
+2FA04;W # CJK COMPATIBILITY IDEOGRAPH-2FA04
+2FA05;W # CJK COMPATIBILITY IDEOGRAPH-2FA05
+2FA06;W # CJK COMPATIBILITY IDEOGRAPH-2FA06
+2FA07;W # CJK COMPATIBILITY IDEOGRAPH-2FA07
+2FA08;W # CJK COMPATIBILITY IDEOGRAPH-2FA08
+2FA09;W # CJK COMPATIBILITY IDEOGRAPH-2FA09
+2FA0A;W # CJK COMPATIBILITY IDEOGRAPH-2FA0A
+2FA0B;W # CJK COMPATIBILITY IDEOGRAPH-2FA0B
+2FA0C;W # CJK COMPATIBILITY IDEOGRAPH-2FA0C
+2FA0D;W # CJK COMPATIBILITY IDEOGRAPH-2FA0D
+2FA0E;W # CJK COMPATIBILITY IDEOGRAPH-2FA0E
+2FA0F;W # CJK COMPATIBILITY IDEOGRAPH-2FA0F
+2FA10;W # CJK COMPATIBILITY IDEOGRAPH-2FA10
+2FA11;W # CJK COMPATIBILITY IDEOGRAPH-2FA11
+2FA12;W # CJK COMPATIBILITY IDEOGRAPH-2FA12
+2FA13;W # CJK COMPATIBILITY IDEOGRAPH-2FA13
+2FA14;W # CJK COMPATIBILITY IDEOGRAPH-2FA14
+2FA15;W # CJK COMPATIBILITY IDEOGRAPH-2FA15
+2FA16;W # CJK COMPATIBILITY IDEOGRAPH-2FA16
+2FA17;W # CJK COMPATIBILITY IDEOGRAPH-2FA17
+2FA18;W # CJK COMPATIBILITY IDEOGRAPH-2FA18
+2FA19;W # CJK COMPATIBILITY IDEOGRAPH-2FA19
+2FA1A;W # CJK COMPATIBILITY IDEOGRAPH-2FA1A
+2FA1B;W # CJK COMPATIBILITY IDEOGRAPH-2FA1B
+2FA1C;W # CJK COMPATIBILITY IDEOGRAPH-2FA1C
+2FA1D;W # CJK COMPATIBILITY IDEOGRAPH-2FA1D
+2FA1E..2FFFD;W # <reserved>
+30000..3FFFD;W # <reserved>
+E0001;N # LANGUAGE TAG
+E0020;N # TAG SPACE
+E0021;N # TAG EXCLAMATION MARK
+E0022;N # TAG QUOTATION MARK
+E0023;N # TAG NUMBER SIGN
+E0024;N # TAG DOLLAR SIGN
+E0025;N # TAG PERCENT SIGN
+E0026;N # TAG AMPERSAND
+E0027;N # TAG APOSTROPHE
+E0028;N # TAG LEFT PARENTHESIS
+E0029;N # TAG RIGHT PARENTHESIS
+E002A;N # TAG ASTERISK
+E002B;N # TAG PLUS SIGN
+E002C;N # TAG COMMA
+E002D;N # TAG HYPHEN-MINUS
+E002E;N # TAG FULL STOP
+E002F;N # TAG SOLIDUS
+E0030;N # TAG DIGIT ZERO
+E0031;N # TAG DIGIT ONE
+E0032;N # TAG DIGIT TWO
+E0033;N # TAG DIGIT THREE
+E0034;N # TAG DIGIT FOUR
+E0035;N # TAG DIGIT FIVE
+E0036;N # TAG DIGIT SIX
+E0037;N # TAG DIGIT SEVEN
+E0038;N # TAG DIGIT EIGHT
+E0039;N # TAG DIGIT NINE
+E003A;N # TAG COLON
+E003B;N # TAG SEMICOLON
+E003C;N # TAG LESS-THAN SIGN
+E003D;N # TAG EQUALS SIGN
+E003E;N # TAG GREATER-THAN SIGN
+E003F;N # TAG QUESTION MARK
+E0040;N # TAG COMMERCIAL AT
+E0041;N # TAG LATIN CAPITAL LETTER A
+E0042;N # TAG LATIN CAPITAL LETTER B
+E0043;N # TAG LATIN CAPITAL LETTER C
+E0044;N # TAG LATIN CAPITAL LETTER D
+E0045;N # TAG LATIN CAPITAL LETTER E
+E0046;N # TAG LATIN CAPITAL LETTER F
+E0047;N # TAG LATIN CAPITAL LETTER G
+E0048;N # TAG LATIN CAPITAL LETTER H
+E0049;N # TAG LATIN CAPITAL LETTER I
+E004A;N # TAG LATIN CAPITAL LETTER J
+E004B;N # TAG LATIN CAPITAL LETTER K
+E004C;N # TAG LATIN CAPITAL LETTER L
+E004D;N # TAG LATIN CAPITAL LETTER M
+E004E;N # TAG LATIN CAPITAL LETTER N
+E004F;N # TAG LATIN CAPITAL LETTER O
+E0050;N # TAG LATIN CAPITAL LETTER P
+E0051;N # TAG LATIN CAPITAL LETTER Q
+E0052;N # TAG LATIN CAPITAL LETTER R
+E0053;N # TAG LATIN CAPITAL LETTER S
+E0054;N # TAG LATIN CAPITAL LETTER T
+E0055;N # TAG LATIN CAPITAL LETTER U
+E0056;N # TAG LATIN CAPITAL LETTER V
+E0057;N # TAG LATIN CAPITAL LETTER W
+E0058;N # TAG LATIN CAPITAL LETTER X
+E0059;N # TAG LATIN CAPITAL LETTER Y
+E005A;N # TAG LATIN CAPITAL LETTER Z
+E005B;N # TAG LEFT SQUARE BRACKET
+E005C;N # TAG REVERSE SOLIDUS
+E005D;N # TAG RIGHT SQUARE BRACKET
+E005E;N # TAG CIRCUMFLEX ACCENT
+E005F;N # TAG LOW LINE
+E0060;N # TAG GRAVE ACCENT
+E0061;N # TAG LATIN SMALL LETTER A
+E0062;N # TAG LATIN SMALL LETTER B
+E0063;N # TAG LATIN SMALL LETTER C
+E0064;N # TAG LATIN SMALL LETTER D
+E0065;N # TAG LATIN SMALL LETTER E
+E0066;N # TAG LATIN SMALL LETTER F
+E0067;N # TAG LATIN SMALL LETTER G
+E0068;N # TAG LATIN SMALL LETTER H
+E0069;N # TAG LATIN SMALL LETTER I
+E006A;N # TAG LATIN SMALL LETTER J
+E006B;N # TAG LATIN SMALL LETTER K
+E006C;N # TAG LATIN SMALL LETTER L
+E006D;N # TAG LATIN SMALL LETTER M
+E006E;N # TAG LATIN SMALL LETTER N
+E006F;N # TAG LATIN SMALL LETTER O
+E0070;N # TAG LATIN SMALL LETTER P
+E0071;N # TAG LATIN SMALL LETTER Q
+E0072;N # TAG LATIN SMALL LETTER R
+E0073;N # TAG LATIN SMALL LETTER S
+E0074;N # TAG LATIN SMALL LETTER T
+E0075;N # TAG LATIN SMALL LETTER U
+E0076;N # TAG LATIN SMALL LETTER V
+E0077;N # TAG LATIN SMALL LETTER W
+E0078;N # TAG LATIN SMALL LETTER X
+E0079;N # TAG LATIN SMALL LETTER Y
+E007A;N # TAG LATIN SMALL LETTER Z
+E007B;N # TAG LEFT CURLY BRACKET
+E007C;N # TAG VERTICAL LINE
+E007D;N # TAG RIGHT CURLY BRACKET
+E007E;N # TAG TILDE
+E007F;N # CANCEL TAG
+E0100;A # VARIATION SELECTOR-17
+E0101;A # VARIATION SELECTOR-18
+E0102;A # VARIATION SELECTOR-19
+E0103;A # VARIATION SELECTOR-20
+E0104;A # VARIATION SELECTOR-21
+E0105;A # VARIATION SELECTOR-22
+E0106;A # VARIATION SELECTOR-23
+E0107;A # VARIATION SELECTOR-24
+E0108;A # VARIATION SELECTOR-25
+E0109;A # VARIATION SELECTOR-26
+E010A;A # VARIATION SELECTOR-27
+E010B;A # VARIATION SELECTOR-28
+E010C;A # VARIATION SELECTOR-29
+E010D;A # VARIATION SELECTOR-30
+E010E;A # VARIATION SELECTOR-31
+E010F;A # VARIATION SELECTOR-32
+E0110;A # VARIATION SELECTOR-33
+E0111;A # VARIATION SELECTOR-34
+E0112;A # VARIATION SELECTOR-35
+E0113;A # VARIATION SELECTOR-36
+E0114;A # VARIATION SELECTOR-37
+E0115;A # VARIATION SELECTOR-38
+E0116;A # VARIATION SELECTOR-39
+E0117;A # VARIATION SELECTOR-40
+E0118;A # VARIATION SELECTOR-41
+E0119;A # VARIATION SELECTOR-42
+E011A;A # VARIATION SELECTOR-43
+E011B;A # VARIATION SELECTOR-44
+E011C;A # VARIATION SELECTOR-45
+E011D;A # VARIATION SELECTOR-46
+E011E;A # VARIATION SELECTOR-47
+E011F;A # VARIATION SELECTOR-48
+E0120;A # VARIATION SELECTOR-49
+E0121;A # VARIATION SELECTOR-50
+E0122;A # VARIATION SELECTOR-51
+E0123;A # VARIATION SELECTOR-52
+E0124;A # VARIATION SELECTOR-53
+E0125;A # VARIATION SELECTOR-54
+E0126;A # VARIATION SELECTOR-55
+E0127;A # VARIATION SELECTOR-56
+E0128;A # VARIATION SELECTOR-57
+E0129;A # VARIATION SELECTOR-58
+E012A;A # VARIATION SELECTOR-59
+E012B;A # VARIATION SELECTOR-60
+E012C;A # VARIATION SELECTOR-61
+E012D;A # VARIATION SELECTOR-62
+E012E;A # VARIATION SELECTOR-63
+E012F;A # VARIATION SELECTOR-64
+E0130;A # VARIATION SELECTOR-65
+E0131;A # VARIATION SELECTOR-66
+E0132;A # VARIATION SELECTOR-67
+E0133;A # VARIATION SELECTOR-68
+E0134;A # VARIATION SELECTOR-69
+E0135;A # VARIATION SELECTOR-70
+E0136;A # VARIATION SELECTOR-71
+E0137;A # VARIATION SELECTOR-72
+E0138;A # VARIATION SELECTOR-73
+E0139;A # VARIATION SELECTOR-74
+E013A;A # VARIATION SELECTOR-75
+E013B;A # VARIATION SELECTOR-76
+E013C;A # VARIATION SELECTOR-77
+E013D;A # VARIATION SELECTOR-78
+E013E;A # VARIATION SELECTOR-79
+E013F;A # VARIATION SELECTOR-80
+E0140;A # VARIATION SELECTOR-81
+E0141;A # VARIATION SELECTOR-82
+E0142;A # VARIATION SELECTOR-83
+E0143;A # VARIATION SELECTOR-84
+E0144;A # VARIATION SELECTOR-85
+E0145;A # VARIATION SELECTOR-86
+E0146;A # VARIATION SELECTOR-87
+E0147;A # VARIATION SELECTOR-88
+E0148;A # VARIATION SELECTOR-89
+E0149;A # VARIATION SELECTOR-90
+E014A;A # VARIATION SELECTOR-91
+E014B;A # VARIATION SELECTOR-92
+E014C;A # VARIATION SELECTOR-93
+E014D;A # VARIATION SELECTOR-94
+E014E;A # VARIATION SELECTOR-95
+E014F;A # VARIATION SELECTOR-96
+E0150;A # VARIATION SELECTOR-97
+E0151;A # VARIATION SELECTOR-98
+E0152;A # VARIATION SELECTOR-99
+E0153;A # VARIATION SELECTOR-100
+E0154;A # VARIATION SELECTOR-101
+E0155;A # VARIATION SELECTOR-102
+E0156;A # VARIATION SELECTOR-103
+E0157;A # VARIATION SELECTOR-104
+E0158;A # VARIATION SELECTOR-105
+E0159;A # VARIATION SELECTOR-106
+E015A;A # VARIATION SELECTOR-107
+E015B;A # VARIATION SELECTOR-108
+E015C;A # VARIATION SELECTOR-109
+E015D;A # VARIATION SELECTOR-110
+E015E;A # VARIATION SELECTOR-111
+E015F;A # VARIATION SELECTOR-112
+E0160;A # VARIATION SELECTOR-113
+E0161;A # VARIATION SELECTOR-114
+E0162;A # VARIATION SELECTOR-115
+E0163;A # VARIATION SELECTOR-116
+E0164;A # VARIATION SELECTOR-117
+E0165;A # VARIATION SELECTOR-118
+E0166;A # VARIATION SELECTOR-119
+E0167;A # VARIATION SELECTOR-120
+E0168;A # VARIATION SELECTOR-121
+E0169;A # VARIATION SELECTOR-122
+E016A;A # VARIATION SELECTOR-123
+E016B;A # VARIATION SELECTOR-124
+E016C;A # VARIATION SELECTOR-125
+E016D;A # VARIATION SELECTOR-126
+E016E;A # VARIATION SELECTOR-127
+E016F;A # VARIATION SELECTOR-128
+E0170;A # VARIATION SELECTOR-129
+E0171;A # VARIATION SELECTOR-130
+E0172;A # VARIATION SELECTOR-131
+E0173;A # VARIATION SELECTOR-132
+E0174;A # VARIATION SELECTOR-133
+E0175;A # VARIATION SELECTOR-134
+E0176;A # VARIATION SELECTOR-135
+E0177;A # VARIATION SELECTOR-136
+E0178;A # VARIATION SELECTOR-137
+E0179;A # VARIATION SELECTOR-138
+E017A;A # VARIATION SELECTOR-139
+E017B;A # VARIATION SELECTOR-140
+E017C;A # VARIATION SELECTOR-141
+E017D;A # VARIATION SELECTOR-142
+E017E;A # VARIATION SELECTOR-143
+E017F;A # VARIATION SELECTOR-144
+E0180;A # VARIATION SELECTOR-145
+E0181;A # VARIATION SELECTOR-146
+E0182;A # VARIATION SELECTOR-147
+E0183;A # VARIATION SELECTOR-148
+E0184;A # VARIATION SELECTOR-149
+E0185;A # VARIATION SELECTOR-150
+E0186;A # VARIATION SELECTOR-151
+E0187;A # VARIATION SELECTOR-152
+E0188;A # VARIATION SELECTOR-153
+E0189;A # VARIATION SELECTOR-154
+E018A;A # VARIATION SELECTOR-155
+E018B;A # VARIATION SELECTOR-156
+E018C;A # VARIATION SELECTOR-157
+E018D;A # VARIATION SELECTOR-158
+E018E;A # VARIATION SELECTOR-159
+E018F;A # VARIATION SELECTOR-160
+E0190;A # VARIATION SELECTOR-161
+E0191;A # VARIATION SELECTOR-162
+E0192;A # VARIATION SELECTOR-163
+E0193;A # VARIATION SELECTOR-164
+E0194;A # VARIATION SELECTOR-165
+E0195;A # VARIATION SELECTOR-166
+E0196;A # VARIATION SELECTOR-167
+E0197;A # VARIATION SELECTOR-168
+E0198;A # VARIATION SELECTOR-169
+E0199;A # VARIATION SELECTOR-170
+E019A;A # VARIATION SELECTOR-171
+E019B;A # VARIATION SELECTOR-172
+E019C;A # VARIATION SELECTOR-173
+E019D;A # VARIATION SELECTOR-174
+E019E;A # VARIATION SELECTOR-175
+E019F;A # VARIATION SELECTOR-176
+E01A0;A # VARIATION SELECTOR-177
+E01A1;A # VARIATION SELECTOR-178
+E01A2;A # VARIATION SELECTOR-179
+E01A3;A # VARIATION SELECTOR-180
+E01A4;A # VARIATION SELECTOR-181
+E01A5;A # VARIATION SELECTOR-182
+E01A6;A # VARIATION SELECTOR-183
+E01A7;A # VARIATION SELECTOR-184
+E01A8;A # VARIATION SELECTOR-185
+E01A9;A # VARIATION SELECTOR-186
+E01AA;A # VARIATION SELECTOR-187
+E01AB;A # VARIATION SELECTOR-188
+E01AC;A # VARIATION SELECTOR-189
+E01AD;A # VARIATION SELECTOR-190
+E01AE;A # VARIATION SELECTOR-191
+E01AF;A # VARIATION SELECTOR-192
+E01B0;A # VARIATION SELECTOR-193
+E01B1;A # VARIATION SELECTOR-194
+E01B2;A # VARIATION SELECTOR-195
+E01B3;A # VARIATION SELECTOR-196
+E01B4;A # VARIATION SELECTOR-197
+E01B5;A # VARIATION SELECTOR-198
+E01B6;A # VARIATION SELECTOR-199
+E01B7;A # VARIATION SELECTOR-200
+E01B8;A # VARIATION SELECTOR-201
+E01B9;A # VARIATION SELECTOR-202
+E01BA;A # VARIATION SELECTOR-203
+E01BB;A # VARIATION SELECTOR-204
+E01BC;A # VARIATION SELECTOR-205
+E01BD;A # VARIATION SELECTOR-206
+E01BE;A # VARIATION SELECTOR-207
+E01BF;A # VARIATION SELECTOR-208
+E01C0;A # VARIATION SELECTOR-209
+E01C1;A # VARIATION SELECTOR-210
+E01C2;A # VARIATION SELECTOR-211
+E01C3;A # VARIATION SELECTOR-212
+E01C4;A # VARIATION SELECTOR-213
+E01C5;A # VARIATION SELECTOR-214
+E01C6;A # VARIATION SELECTOR-215
+E01C7;A # VARIATION SELECTOR-216
+E01C8;A # VARIATION SELECTOR-217
+E01C9;A # VARIATION SELECTOR-218
+E01CA;A # VARIATION SELECTOR-219
+E01CB;A # VARIATION SELECTOR-220
+E01CC;A # VARIATION SELECTOR-221
+E01CD;A # VARIATION SELECTOR-222
+E01CE;A # VARIATION SELECTOR-223
+E01CF;A # VARIATION SELECTOR-224
+E01D0;A # VARIATION SELECTOR-225
+E01D1;A # VARIATION SELECTOR-226
+E01D2;A # VARIATION SELECTOR-227
+E01D3;A # VARIATION SELECTOR-228
+E01D4;A # VARIATION SELECTOR-229
+E01D5;A # VARIATION SELECTOR-230
+E01D6;A # VARIATION SELECTOR-231
+E01D7;A # VARIATION SELECTOR-232
+E01D8;A # VARIATION SELECTOR-233
+E01D9;A # VARIATION SELECTOR-234
+E01DA;A # VARIATION SELECTOR-235
+E01DB;A # VARIATION SELECTOR-236
+E01DC;A # VARIATION SELECTOR-237
+E01DD;A # VARIATION SELECTOR-238
+E01DE;A # VARIATION SELECTOR-239
+E01DF;A # VARIATION SELECTOR-240
+E01E0;A # VARIATION SELECTOR-241
+E01E1;A # VARIATION SELECTOR-242
+E01E2;A # VARIATION SELECTOR-243
+E01E3;A # VARIATION SELECTOR-244
+E01E4;A # VARIATION SELECTOR-245
+E01E5;A # VARIATION SELECTOR-246
+E01E6;A # VARIATION SELECTOR-247
+E01E7;A # VARIATION SELECTOR-248
+E01E8;A # VARIATION SELECTOR-249
+E01E9;A # VARIATION SELECTOR-250
+E01EA;A # VARIATION SELECTOR-251
+E01EB;A # VARIATION SELECTOR-252
+E01EC;A # VARIATION SELECTOR-253
+E01ED;A # VARIATION SELECTOR-254
+E01EE;A # VARIATION SELECTOR-255
+E01EF;A # VARIATION SELECTOR-256
+F0000..FFFFD;A # <Plane 15 Private Use, First>..<Plane 15 Private Use, Last>
+100000..10FFFD;A # <Plane 16 Private Use, First>..<Plane 16 Private Use, Last>
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/Exact.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/Exact.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/Exact.pl	(revision 14489)
@@ -0,0 +1,73 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+##
+## Data in this file used by ../utf8_heavy.pl
+##
+
+## Mapping from name to filename in ./lib/gc_sc
+%utf8::Exact = (
+ ASCII		=> 'ASCII',
+ All		=> 'Any',
+ Alnum		=> 'Alnum',
+ Alpha		=> 'Alpha',
+ Any		=> 'Any',
+ Assigned	=> 'Assigned',
+ Blank		=> 'Blank',
+ C		=> 'C',
+ Cc		=> 'Cc',
+ Cf		=> 'Cf',
+ Cn		=> 'Cn',
+ Cntrl		=> 'Cntrl',
+ Co		=> 'Co',
+ Cs		=> 'Cs',
+ Digit		=> 'Digit',
+ Graph		=> 'Graph',
+ InGreek	=> 'InGreekA',
+ L		=> 'L',
+ LC		=> 'LC',
+ Ll		=> 'Ll',
+ Lm		=> 'Lm',
+ Lo		=> 'Lo',
+ Lower		=> 'Lower',
+ Lt		=> 'Lt',
+ Lu		=> 'Lu',
+ M		=> 'M',
+ Mc		=> 'Mc',
+ Me		=> 'Me',
+ Mn		=> 'Mn',
+ N		=> 'N',
+ Nd		=> 'Nd',
+ Nl		=> 'Nl',
+ No		=> 'No',
+ P		=> 'P',
+ Pc		=> 'Pc',
+ Pd		=> 'Pd',
+ Pe		=> 'Pe',
+ Pf		=> 'Pf',
+ Pi		=> 'Pi',
+ Po		=> 'Po',
+ Print		=> 'Print',
+ Ps		=> 'Ps',
+ Punct		=> 'Punct',
+ S		=> 'S',
+ Sc		=> 'Sc',
+ Sk		=> 'Sk',
+ Sm		=> 'Sm',
+ So		=> 'So',
+ Space		=> 'Space',
+ SpacePerl	=> 'SpacePer',
+ Title		=> 'Title',
+ Upper		=> 'Upper',
+ Word		=> 'Word',
+ XDigit 	=> 'XDigit',
+ Z		=> 'Z',
+ Zl		=> 'Zl',
+ Zp		=> 'Zp',
+ Zs		=> 'Zs',
+ _CanonDCIJ	=> '_CanonDC',
+ _CaseIgnorable  => '_CaseIgn',
+ _CombAbove	=> '_CombAbo',
+);
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/HangulSyllableType.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/HangulSyllableType.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/HangulSyllableType.txt	(revision 14489)
@@ -0,0 +1,851 @@
+# HangulSyllableType-4.1.0.txt
+# Date: 2004-12-11, 05:44:43 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+
+# ================================================
+
+# Property:	Hangul_Syllable_Type
+
+#  All code points not explicitly listed for Hangul_Syllable_Type
+#  have the value Not_Applicable (NA).
+
+# ================================================
+
+# Hangul_Syllable_Type=Leading_Jamo
+
+1100..1159    ; L # Lo  [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH
+115F          ; L # Lo       HANGUL CHOSEONG FILLER
+
+# Total code points: 91
+
+# ================================================
+
+# Hangul_Syllable_Type=Vowel_Jamo
+
+1160..11A2    ; V # Lo  [67] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA
+
+# Total code points: 67
+
+# ================================================
+
+# Hangul_Syllable_Type=Trailing_Jamo
+
+11A8..11F9    ; T # Lo  [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH
+
+# Total code points: 82
+
+# ================================================
+
+# Hangul_Syllable_Type=LV_Syllable
+
+AC00          ; LV # Lo       HANGUL SYLLABLE GA
+AC1C          ; LV # Lo       HANGUL SYLLABLE GAE
+AC38          ; LV # Lo       HANGUL SYLLABLE GYA
+AC54          ; LV # Lo       HANGUL SYLLABLE GYAE
+AC70          ; LV # Lo       HANGUL SYLLABLE GEO
+AC8C          ; LV # Lo       HANGUL SYLLABLE GE
+ACA8          ; LV # Lo       HANGUL SYLLABLE GYEO
+ACC4          ; LV # Lo       HANGUL SYLLABLE GYE
+ACE0          ; LV # Lo       HANGUL SYLLABLE GO
+ACFC          ; LV # Lo       HANGUL SYLLABLE GWA
+AD18          ; LV # Lo       HANGUL SYLLABLE GWAE
+AD34          ; LV # Lo       HANGUL SYLLABLE GOE
+AD50          ; LV # Lo       HANGUL SYLLABLE GYO
+AD6C          ; LV # Lo       HANGUL SYLLABLE GU
+AD88          ; LV # Lo       HANGUL SYLLABLE GWEO
+ADA4          ; LV # Lo       HANGUL SYLLABLE GWE
+ADC0          ; LV # Lo       HANGUL SYLLABLE GWI
+ADDC          ; LV # Lo       HANGUL SYLLABLE GYU
+ADF8          ; LV # Lo       HANGUL SYLLABLE GEU
+AE14          ; LV # Lo       HANGUL SYLLABLE GYI
+AE30          ; LV # Lo       HANGUL SYLLABLE GI
+AE4C          ; LV # Lo       HANGUL SYLLABLE GGA
+AE68          ; LV # Lo       HANGUL SYLLABLE GGAE
+AE84          ; LV # Lo       HANGUL SYLLABLE GGYA
+AEA0          ; LV # Lo       HANGUL SYLLABLE GGYAE
+AEBC          ; LV # Lo       HANGUL SYLLABLE GGEO
+AED8          ; LV # Lo       HANGUL SYLLABLE GGE
+AEF4          ; LV # Lo       HANGUL SYLLABLE GGYEO
+AF10          ; LV # Lo       HANGUL SYLLABLE GGYE
+AF2C          ; LV # Lo       HANGUL SYLLABLE GGO
+AF48          ; LV # Lo       HANGUL SYLLABLE GGWA
+AF64          ; LV # Lo       HANGUL SYLLABLE GGWAE
+AF80          ; LV # Lo       HANGUL SYLLABLE GGOE
+AF9C          ; LV # Lo       HANGUL SYLLABLE GGYO
+AFB8          ; LV # Lo       HANGUL SYLLABLE GGU
+AFD4          ; LV # Lo       HANGUL SYLLABLE GGWEO
+AFF0          ; LV # Lo       HANGUL SYLLABLE GGWE
+B00C          ; LV # Lo       HANGUL SYLLABLE GGWI
+B028          ; LV # Lo       HANGUL SYLLABLE GGYU
+B044          ; LV # Lo       HANGUL SYLLABLE GGEU
+B060          ; LV # Lo       HANGUL SYLLABLE GGYI
+B07C          ; LV # Lo       HANGUL SYLLABLE GGI
+B098          ; LV # Lo       HANGUL SYLLABLE NA
+B0B4          ; LV # Lo       HANGUL SYLLABLE NAE
+B0D0          ; LV # Lo       HANGUL SYLLABLE NYA
+B0EC          ; LV # Lo       HANGUL SYLLABLE NYAE
+B108          ; LV # Lo       HANGUL SYLLABLE NEO
+B124          ; LV # Lo       HANGUL SYLLABLE NE
+B140          ; LV # Lo       HANGUL SYLLABLE NYEO
+B15C          ; LV # Lo       HANGUL SYLLABLE NYE
+B178          ; LV # Lo       HANGUL SYLLABLE NO
+B194          ; LV # Lo       HANGUL SYLLABLE NWA
+B1B0          ; LV # Lo       HANGUL SYLLABLE NWAE
+B1CC          ; LV # Lo       HANGUL SYLLABLE NOE
+B1E8          ; LV # Lo       HANGUL SYLLABLE NYO
+B204          ; LV # Lo       HANGUL SYLLABLE NU
+B220          ; LV # Lo       HANGUL SYLLABLE NWEO
+B23C          ; LV # Lo       HANGUL SYLLABLE NWE
+B258          ; LV # Lo       HANGUL SYLLABLE NWI
+B274          ; LV # Lo       HANGUL SYLLABLE NYU
+B290          ; LV # Lo       HANGUL SYLLABLE NEU
+B2AC          ; LV # Lo       HANGUL SYLLABLE NYI
+B2C8          ; LV # Lo       HANGUL SYLLABLE NI
+B2E4          ; LV # Lo       HANGUL SYLLABLE DA
+B300          ; LV # Lo       HANGUL SYLLABLE DAE
+B31C          ; LV # Lo       HANGUL SYLLABLE DYA
+B338          ; LV # Lo       HANGUL SYLLABLE DYAE
+B354          ; LV # Lo       HANGUL SYLLABLE DEO
+B370          ; LV # Lo       HANGUL SYLLABLE DE
+B38C          ; LV # Lo       HANGUL SYLLABLE DYEO
+B3A8          ; LV # Lo       HANGUL SYLLABLE DYE
+B3C4          ; LV # Lo       HANGUL SYLLABLE DO
+B3E0          ; LV # Lo       HANGUL SYLLABLE DWA
+B3FC          ; LV # Lo       HANGUL SYLLABLE DWAE
+B418          ; LV # Lo       HANGUL SYLLABLE DOE
+B434          ; LV # Lo       HANGUL SYLLABLE DYO
+B450          ; LV # Lo       HANGUL SYLLABLE DU
+B46C          ; LV # Lo       HANGUL SYLLABLE DWEO
+B488          ; LV # Lo       HANGUL SYLLABLE DWE
+B4A4          ; LV # Lo       HANGUL SYLLABLE DWI
+B4C0          ; LV # Lo       HANGUL SYLLABLE DYU
+B4DC          ; LV # Lo       HANGUL SYLLABLE DEU
+B4F8          ; LV # Lo       HANGUL SYLLABLE DYI
+B514          ; LV # Lo       HANGUL SYLLABLE DI
+B530          ; LV # Lo       HANGUL SYLLABLE DDA
+B54C          ; LV # Lo       HANGUL SYLLABLE DDAE
+B568          ; LV # Lo       HANGUL SYLLABLE DDYA
+B584          ; LV # Lo       HANGUL SYLLABLE DDYAE
+B5A0          ; LV # Lo       HANGUL SYLLABLE DDEO
+B5BC          ; LV # Lo       HANGUL SYLLABLE DDE
+B5D8          ; LV # Lo       HANGUL SYLLABLE DDYEO
+B5F4          ; LV # Lo       HANGUL SYLLABLE DDYE
+B610          ; LV # Lo       HANGUL SYLLABLE DDO
+B62C          ; LV # Lo       HANGUL SYLLABLE DDWA
+B648          ; LV # Lo       HANGUL SYLLABLE DDWAE
+B664          ; LV # Lo       HANGUL SYLLABLE DDOE
+B680          ; LV # Lo       HANGUL SYLLABLE DDYO
+B69C          ; LV # Lo       HANGUL SYLLABLE DDU
+B6B8          ; LV # Lo       HANGUL SYLLABLE DDWEO
+B6D4          ; LV # Lo       HANGUL SYLLABLE DDWE
+B6F0          ; LV # Lo       HANGUL SYLLABLE DDWI
+B70C          ; LV # Lo       HANGUL SYLLABLE DDYU
+B728          ; LV # Lo       HANGUL SYLLABLE DDEU
+B744          ; LV # Lo       HANGUL SYLLABLE DDYI
+B760          ; LV # Lo       HANGUL SYLLABLE DDI
+B77C          ; LV # Lo       HANGUL SYLLABLE RA
+B798          ; LV # Lo       HANGUL SYLLABLE RAE
+B7B4          ; LV # Lo       HANGUL SYLLABLE RYA
+B7D0          ; LV # Lo       HANGUL SYLLABLE RYAE
+B7EC          ; LV # Lo       HANGUL SYLLABLE REO
+B808          ; LV # Lo       HANGUL SYLLABLE RE
+B824          ; LV # Lo       HANGUL SYLLABLE RYEO
+B840          ; LV # Lo       HANGUL SYLLABLE RYE
+B85C          ; LV # Lo       HANGUL SYLLABLE RO
+B878          ; LV # Lo       HANGUL SYLLABLE RWA
+B894          ; LV # Lo       HANGUL SYLLABLE RWAE
+B8B0          ; LV # Lo       HANGUL SYLLABLE ROE
+B8CC          ; LV # Lo       HANGUL SYLLABLE RYO
+B8E8          ; LV # Lo       HANGUL SYLLABLE RU
+B904          ; LV # Lo       HANGUL SYLLABLE RWEO
+B920          ; LV # Lo       HANGUL SYLLABLE RWE
+B93C          ; LV # Lo       HANGUL SYLLABLE RWI
+B958          ; LV # Lo       HANGUL SYLLABLE RYU
+B974          ; LV # Lo       HANGUL SYLLABLE REU
+B990          ; LV # Lo       HANGUL SYLLABLE RYI
+B9AC          ; LV # Lo       HANGUL SYLLABLE RI
+B9C8          ; LV # Lo       HANGUL SYLLABLE MA
+B9E4          ; LV # Lo       HANGUL SYLLABLE MAE
+BA00          ; LV # Lo       HANGUL SYLLABLE MYA
+BA1C          ; LV # Lo       HANGUL SYLLABLE MYAE
+BA38          ; LV # Lo       HANGUL SYLLABLE MEO
+BA54          ; LV # Lo       HANGUL SYLLABLE ME
+BA70          ; LV # Lo       HANGUL SYLLABLE MYEO
+BA8C          ; LV # Lo       HANGUL SYLLABLE MYE
+BAA8          ; LV # Lo       HANGUL SYLLABLE MO
+BAC4          ; LV # Lo       HANGUL SYLLABLE MWA
+BAE0          ; LV # Lo       HANGUL SYLLABLE MWAE
+BAFC          ; LV # Lo       HANGUL SYLLABLE MOE
+BB18          ; LV # Lo       HANGUL SYLLABLE MYO
+BB34          ; LV # Lo       HANGUL SYLLABLE MU
+BB50          ; LV # Lo       HANGUL SYLLABLE MWEO
+BB6C          ; LV # Lo       HANGUL SYLLABLE MWE
+BB88          ; LV # Lo       HANGUL SYLLABLE MWI
+BBA4          ; LV # Lo       HANGUL SYLLABLE MYU
+BBC0          ; LV # Lo       HANGUL SYLLABLE MEU
+BBDC          ; LV # Lo       HANGUL SYLLABLE MYI
+BBF8          ; LV # Lo       HANGUL SYLLABLE MI
+BC14          ; LV # Lo       HANGUL SYLLABLE BA
+BC30          ; LV # Lo       HANGUL SYLLABLE BAE
+BC4C          ; LV # Lo       HANGUL SYLLABLE BYA
+BC68          ; LV # Lo       HANGUL SYLLABLE BYAE
+BC84          ; LV # Lo       HANGUL SYLLABLE BEO
+BCA0          ; LV # Lo       HANGUL SYLLABLE BE
+BCBC          ; LV # Lo       HANGUL SYLLABLE BYEO
+BCD8          ; LV # Lo       HANGUL SYLLABLE BYE
+BCF4          ; LV # Lo       HANGUL SYLLABLE BO
+BD10          ; LV # Lo       HANGUL SYLLABLE BWA
+BD2C          ; LV # Lo       HANGUL SYLLABLE BWAE
+BD48          ; LV # Lo       HANGUL SYLLABLE BOE
+BD64          ; LV # Lo       HANGUL SYLLABLE BYO
+BD80          ; LV # Lo       HANGUL SYLLABLE BU
+BD9C          ; LV # Lo       HANGUL SYLLABLE BWEO
+BDB8          ; LV # Lo       HANGUL SYLLABLE BWE
+BDD4          ; LV # Lo       HANGUL SYLLABLE BWI
+BDF0          ; LV # Lo       HANGUL SYLLABLE BYU
+BE0C          ; LV # Lo       HANGUL SYLLABLE BEU
+BE28          ; LV # Lo       HANGUL SYLLABLE BYI
+BE44          ; LV # Lo       HANGUL SYLLABLE BI
+BE60          ; LV # Lo       HANGUL SYLLABLE BBA
+BE7C          ; LV # Lo       HANGUL SYLLABLE BBAE
+BE98          ; LV # Lo       HANGUL SYLLABLE BBYA
+BEB4          ; LV # Lo       HANGUL SYLLABLE BBYAE
+BED0          ; LV # Lo       HANGUL SYLLABLE BBEO
+BEEC          ; LV # Lo       HANGUL SYLLABLE BBE
+BF08          ; LV # Lo       HANGUL SYLLABLE BBYEO
+BF24          ; LV # Lo       HANGUL SYLLABLE BBYE
+BF40          ; LV # Lo       HANGUL SYLLABLE BBO
+BF5C          ; LV # Lo       HANGUL SYLLABLE BBWA
+BF78          ; LV # Lo       HANGUL SYLLABLE BBWAE
+BF94          ; LV # Lo       HANGUL SYLLABLE BBOE
+BFB0          ; LV # Lo       HANGUL SYLLABLE BBYO
+BFCC          ; LV # Lo       HANGUL SYLLABLE BBU
+BFE8          ; LV # Lo       HANGUL SYLLABLE BBWEO
+C004          ; LV # Lo       HANGUL SYLLABLE BBWE
+C020          ; LV # Lo       HANGUL SYLLABLE BBWI
+C03C          ; LV # Lo       HANGUL SYLLABLE BBYU
+C058          ; LV # Lo       HANGUL SYLLABLE BBEU
+C074          ; LV # Lo       HANGUL SYLLABLE BBYI
+C090          ; LV # Lo       HANGUL SYLLABLE BBI
+C0AC          ; LV # Lo       HANGUL SYLLABLE SA
+C0C8          ; LV # Lo       HANGUL SYLLABLE SAE
+C0E4          ; LV # Lo       HANGUL SYLLABLE SYA
+C100          ; LV # Lo       HANGUL SYLLABLE SYAE
+C11C          ; LV # Lo       HANGUL SYLLABLE SEO
+C138          ; LV # Lo       HANGUL SYLLABLE SE
+C154          ; LV # Lo       HANGUL SYLLABLE SYEO
+C170          ; LV # Lo       HANGUL SYLLABLE SYE
+C18C          ; LV # Lo       HANGUL SYLLABLE SO
+C1A8          ; LV # Lo       HANGUL SYLLABLE SWA
+C1C4          ; LV # Lo       HANGUL SYLLABLE SWAE
+C1E0          ; LV # Lo       HANGUL SYLLABLE SOE
+C1FC          ; LV # Lo       HANGUL SYLLABLE SYO
+C218          ; LV # Lo       HANGUL SYLLABLE SU
+C234          ; LV # Lo       HANGUL SYLLABLE SWEO
+C250          ; LV # Lo       HANGUL SYLLABLE SWE
+C26C          ; LV # Lo       HANGUL SYLLABLE SWI
+C288          ; LV # Lo       HANGUL SYLLABLE SYU
+C2A4          ; LV # Lo       HANGUL SYLLABLE SEU
+C2C0          ; LV # Lo       HANGUL SYLLABLE SYI
+C2DC          ; LV # Lo       HANGUL SYLLABLE SI
+C2F8          ; LV # Lo       HANGUL SYLLABLE SSA
+C314          ; LV # Lo       HANGUL SYLLABLE SSAE
+C330          ; LV # Lo       HANGUL SYLLABLE SSYA
+C34C          ; LV # Lo       HANGUL SYLLABLE SSYAE
+C368          ; LV # Lo       HANGUL SYLLABLE SSEO
+C384          ; LV # Lo       HANGUL SYLLABLE SSE
+C3A0          ; LV # Lo       HANGUL SYLLABLE SSYEO
+C3BC          ; LV # Lo       HANGUL SYLLABLE SSYE
+C3D8          ; LV # Lo       HANGUL SYLLABLE SSO
+C3F4          ; LV # Lo       HANGUL SYLLABLE SSWA
+C410          ; LV # Lo       HANGUL SYLLABLE SSWAE
+C42C          ; LV # Lo       HANGUL SYLLABLE SSOE
+C448          ; LV # Lo       HANGUL SYLLABLE SSYO
+C464          ; LV # Lo       HANGUL SYLLABLE SSU
+C480          ; LV # Lo       HANGUL SYLLABLE SSWEO
+C49C          ; LV # Lo       HANGUL SYLLABLE SSWE
+C4B8          ; LV # Lo       HANGUL SYLLABLE SSWI
+C4D4          ; LV # Lo       HANGUL SYLLABLE SSYU
+C4F0          ; LV # Lo       HANGUL SYLLABLE SSEU
+C50C          ; LV # Lo       HANGUL SYLLABLE SSYI
+C528          ; LV # Lo       HANGUL SYLLABLE SSI
+C544          ; LV # Lo       HANGUL SYLLABLE A
+C560          ; LV # Lo       HANGUL SYLLABLE AE
+C57C          ; LV # Lo       HANGUL SYLLABLE YA
+C598          ; LV # Lo       HANGUL SYLLABLE YAE
+C5B4          ; LV # Lo       HANGUL SYLLABLE EO
+C5D0          ; LV # Lo       HANGUL SYLLABLE E
+C5EC          ; LV # Lo       HANGUL SYLLABLE YEO
+C608          ; LV # Lo       HANGUL SYLLABLE YE
+C624          ; LV # Lo       HANGUL SYLLABLE O
+C640          ; LV # Lo       HANGUL SYLLABLE WA
+C65C          ; LV # Lo       HANGUL SYLLABLE WAE
+C678          ; LV # Lo       HANGUL SYLLABLE OE
+C694          ; LV # Lo       HANGUL SYLLABLE YO
+C6B0          ; LV # Lo       HANGUL SYLLABLE U
+C6CC          ; LV # Lo       HANGUL SYLLABLE WEO
+C6E8          ; LV # Lo       HANGUL SYLLABLE WE
+C704          ; LV # Lo       HANGUL SYLLABLE WI
+C720          ; LV # Lo       HANGUL SYLLABLE YU
+C73C          ; LV # Lo       HANGUL SYLLABLE EU
+C758          ; LV # Lo       HANGUL SYLLABLE YI
+C774          ; LV # Lo       HANGUL SYLLABLE I
+C790          ; LV # Lo       HANGUL SYLLABLE JA
+C7AC          ; LV # Lo       HANGUL SYLLABLE JAE
+C7C8          ; LV # Lo       HANGUL SYLLABLE JYA
+C7E4          ; LV # Lo       HANGUL SYLLABLE JYAE
+C800          ; LV # Lo       HANGUL SYLLABLE JEO
+C81C          ; LV # Lo       HANGUL SYLLABLE JE
+C838          ; LV # Lo       HANGUL SYLLABLE JYEO
+C854          ; LV # Lo       HANGUL SYLLABLE JYE
+C870          ; LV # Lo       HANGUL SYLLABLE JO
+C88C          ; LV # Lo       HANGUL SYLLABLE JWA
+C8A8          ; LV # Lo       HANGUL SYLLABLE JWAE
+C8C4          ; LV # Lo       HANGUL SYLLABLE JOE
+C8E0          ; LV # Lo       HANGUL SYLLABLE JYO
+C8FC          ; LV # Lo       HANGUL SYLLABLE JU
+C918          ; LV # Lo       HANGUL SYLLABLE JWEO
+C934          ; LV # Lo       HANGUL SYLLABLE JWE
+C950          ; LV # Lo       HANGUL SYLLABLE JWI
+C96C          ; LV # Lo       HANGUL SYLLABLE JYU
+C988          ; LV # Lo       HANGUL SYLLABLE JEU
+C9A4          ; LV # Lo       HANGUL SYLLABLE JYI
+C9C0          ; LV # Lo       HANGUL SYLLABLE JI
+C9DC          ; LV # Lo       HANGUL SYLLABLE JJA
+C9F8          ; LV # Lo       HANGUL SYLLABLE JJAE
+CA14          ; LV # Lo       HANGUL SYLLABLE JJYA
+CA30          ; LV # Lo       HANGUL SYLLABLE JJYAE
+CA4C          ; LV # Lo       HANGUL SYLLABLE JJEO
+CA68          ; LV # Lo       HANGUL SYLLABLE JJE
+CA84          ; LV # Lo       HANGUL SYLLABLE JJYEO
+CAA0          ; LV # Lo       HANGUL SYLLABLE JJYE
+CABC          ; LV # Lo       HANGUL SYLLABLE JJO
+CAD8          ; LV # Lo       HANGUL SYLLABLE JJWA
+CAF4          ; LV # Lo       HANGUL SYLLABLE JJWAE
+CB10          ; LV # Lo       HANGUL SYLLABLE JJOE
+CB2C          ; LV # Lo       HANGUL SYLLABLE JJYO
+CB48          ; LV # Lo       HANGUL SYLLABLE JJU
+CB64          ; LV # Lo       HANGUL SYLLABLE JJWEO
+CB80          ; LV # Lo       HANGUL SYLLABLE JJWE
+CB9C          ; LV # Lo       HANGUL SYLLABLE JJWI
+CBB8          ; LV # Lo       HANGUL SYLLABLE JJYU
+CBD4          ; LV # Lo       HANGUL SYLLABLE JJEU
+CBF0          ; LV # Lo       HANGUL SYLLABLE JJYI
+CC0C          ; LV # Lo       HANGUL SYLLABLE JJI
+CC28          ; LV # Lo       HANGUL SYLLABLE CA
+CC44          ; LV # Lo       HANGUL SYLLABLE CAE
+CC60          ; LV # Lo       HANGUL SYLLABLE CYA
+CC7C          ; LV # Lo       HANGUL SYLLABLE CYAE
+CC98          ; LV # Lo       HANGUL SYLLABLE CEO
+CCB4          ; LV # Lo       HANGUL SYLLABLE CE
+CCD0          ; LV # Lo       HANGUL SYLLABLE CYEO
+CCEC          ; LV # Lo       HANGUL SYLLABLE CYE
+CD08          ; LV # Lo       HANGUL SYLLABLE CO
+CD24          ; LV # Lo       HANGUL SYLLABLE CWA
+CD40          ; LV # Lo       HANGUL SYLLABLE CWAE
+CD5C          ; LV # Lo       HANGUL SYLLABLE COE
+CD78          ; LV # Lo       HANGUL SYLLABLE CYO
+CD94          ; LV # Lo       HANGUL SYLLABLE CU
+CDB0          ; LV # Lo       HANGUL SYLLABLE CWEO
+CDCC          ; LV # Lo       HANGUL SYLLABLE CWE
+CDE8          ; LV # Lo       HANGUL SYLLABLE CWI
+CE04          ; LV # Lo       HANGUL SYLLABLE CYU
+CE20          ; LV # Lo       HANGUL SYLLABLE CEU
+CE3C          ; LV # Lo       HANGUL SYLLABLE CYI
+CE58          ; LV # Lo       HANGUL SYLLABLE CI
+CE74          ; LV # Lo       HANGUL SYLLABLE KA
+CE90          ; LV # Lo       HANGUL SYLLABLE KAE
+CEAC          ; LV # Lo       HANGUL SYLLABLE KYA
+CEC8          ; LV # Lo       HANGUL SYLLABLE KYAE
+CEE4          ; LV # Lo       HANGUL SYLLABLE KEO
+CF00          ; LV # Lo       HANGUL SYLLABLE KE
+CF1C          ; LV # Lo       HANGUL SYLLABLE KYEO
+CF38          ; LV # Lo       HANGUL SYLLABLE KYE
+CF54          ; LV # Lo       HANGUL SYLLABLE KO
+CF70          ; LV # Lo       HANGUL SYLLABLE KWA
+CF8C          ; LV # Lo       HANGUL SYLLABLE KWAE
+CFA8          ; LV # Lo       HANGUL SYLLABLE KOE
+CFC4          ; LV # Lo       HANGUL SYLLABLE KYO
+CFE0          ; LV # Lo       HANGUL SYLLABLE KU
+CFFC          ; LV # Lo       HANGUL SYLLABLE KWEO
+D018          ; LV # Lo       HANGUL SYLLABLE KWE
+D034          ; LV # Lo       HANGUL SYLLABLE KWI
+D050          ; LV # Lo       HANGUL SYLLABLE KYU
+D06C          ; LV # Lo       HANGUL SYLLABLE KEU
+D088          ; LV # Lo       HANGUL SYLLABLE KYI
+D0A4          ; LV # Lo       HANGUL SYLLABLE KI
+D0C0          ; LV # Lo       HANGUL SYLLABLE TA
+D0DC          ; LV # Lo       HANGUL SYLLABLE TAE
+D0F8          ; LV # Lo       HANGUL SYLLABLE TYA
+D114          ; LV # Lo       HANGUL SYLLABLE TYAE
+D130          ; LV # Lo       HANGUL SYLLABLE TEO
+D14C          ; LV # Lo       HANGUL SYLLABLE TE
+D168          ; LV # Lo       HANGUL SYLLABLE TYEO
+D184          ; LV # Lo       HANGUL SYLLABLE TYE
+D1A0          ; LV # Lo       HANGUL SYLLABLE TO
+D1BC          ; LV # Lo       HANGUL SYLLABLE TWA
+D1D8          ; LV # Lo       HANGUL SYLLABLE TWAE
+D1F4          ; LV # Lo       HANGUL SYLLABLE TOE
+D210          ; LV # Lo       HANGUL SYLLABLE TYO
+D22C          ; LV # Lo       HANGUL SYLLABLE TU
+D248          ; LV # Lo       HANGUL SYLLABLE TWEO
+D264          ; LV # Lo       HANGUL SYLLABLE TWE
+D280          ; LV # Lo       HANGUL SYLLABLE TWI
+D29C          ; LV # Lo       HANGUL SYLLABLE TYU
+D2B8          ; LV # Lo       HANGUL SYLLABLE TEU
+D2D4          ; LV # Lo       HANGUL SYLLABLE TYI
+D2F0          ; LV # Lo       HANGUL SYLLABLE TI
+D30C          ; LV # Lo       HANGUL SYLLABLE PA
+D328          ; LV # Lo       HANGUL SYLLABLE PAE
+D344          ; LV # Lo       HANGUL SYLLABLE PYA
+D360          ; LV # Lo       HANGUL SYLLABLE PYAE
+D37C          ; LV # Lo       HANGUL SYLLABLE PEO
+D398          ; LV # Lo       HANGUL SYLLABLE PE
+D3B4          ; LV # Lo       HANGUL SYLLABLE PYEO
+D3D0          ; LV # Lo       HANGUL SYLLABLE PYE
+D3EC          ; LV # Lo       HANGUL SYLLABLE PO
+D408          ; LV # Lo       HANGUL SYLLABLE PWA
+D424          ; LV # Lo       HANGUL SYLLABLE PWAE
+D440          ; LV # Lo       HANGUL SYLLABLE POE
+D45C          ; LV # Lo       HANGUL SYLLABLE PYO
+D478          ; LV # Lo       HANGUL SYLLABLE PU
+D494          ; LV # Lo       HANGUL SYLLABLE PWEO
+D4B0          ; LV # Lo       HANGUL SYLLABLE PWE
+D4CC          ; LV # Lo       HANGUL SYLLABLE PWI
+D4E8          ; LV # Lo       HANGUL SYLLABLE PYU
+D504          ; LV # Lo       HANGUL SYLLABLE PEU
+D520          ; LV # Lo       HANGUL SYLLABLE PYI
+D53C          ; LV # Lo       HANGUL SYLLABLE PI
+D558          ; LV # Lo       HANGUL SYLLABLE HA
+D574          ; LV # Lo       HANGUL SYLLABLE HAE
+D590          ; LV # Lo       HANGUL SYLLABLE HYA
+D5AC          ; LV # Lo       HANGUL SYLLABLE HYAE
+D5C8          ; LV # Lo       HANGUL SYLLABLE HEO
+D5E4          ; LV # Lo       HANGUL SYLLABLE HE
+D600          ; LV # Lo       HANGUL SYLLABLE HYEO
+D61C          ; LV # Lo       HANGUL SYLLABLE HYE
+D638          ; LV # Lo       HANGUL SYLLABLE HO
+D654          ; LV # Lo       HANGUL SYLLABLE HWA
+D670          ; LV # Lo       HANGUL SYLLABLE HWAE
+D68C          ; LV # Lo       HANGUL SYLLABLE HOE
+D6A8          ; LV # Lo       HANGUL SYLLABLE HYO
+D6C4          ; LV # Lo       HANGUL SYLLABLE HU
+D6E0          ; LV # Lo       HANGUL SYLLABLE HWEO
+D6FC          ; LV # Lo       HANGUL SYLLABLE HWE
+D718          ; LV # Lo       HANGUL SYLLABLE HWI
+D734          ; LV # Lo       HANGUL SYLLABLE HYU
+D750          ; LV # Lo       HANGUL SYLLABLE HEU
+D76C          ; LV # Lo       HANGUL SYLLABLE HYI
+D788          ; LV # Lo       HANGUL SYLLABLE HI
+
+# Total code points: 399
+
+# ================================================
+
+# Hangul_Syllable_Type=LVT_Syllable
+
+AC01..AC1B    ; LVT # Lo  [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH
+AC1D..AC37    ; LVT # Lo  [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH
+AC39..AC53    ; LVT # Lo  [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH
+AC55..AC6F    ; LVT # Lo  [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH
+AC71..AC8B    ; LVT # Lo  [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH
+AC8D..ACA7    ; LVT # Lo  [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH
+ACA9..ACC3    ; LVT # Lo  [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH
+ACC5..ACDF    ; LVT # Lo  [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH
+ACE1..ACFB    ; LVT # Lo  [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH
+ACFD..AD17    ; LVT # Lo  [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH
+AD19..AD33    ; LVT # Lo  [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH
+AD35..AD4F    ; LVT # Lo  [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH
+AD51..AD6B    ; LVT # Lo  [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH
+AD6D..AD87    ; LVT # Lo  [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH
+AD89..ADA3    ; LVT # Lo  [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH
+ADA5..ADBF    ; LVT # Lo  [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH
+ADC1..ADDB    ; LVT # Lo  [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH
+ADDD..ADF7    ; LVT # Lo  [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH
+ADF9..AE13    ; LVT # Lo  [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH
+AE15..AE2F    ; LVT # Lo  [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH
+AE31..AE4B    ; LVT # Lo  [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH
+AE4D..AE67    ; LVT # Lo  [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH
+AE69..AE83    ; LVT # Lo  [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH
+AE85..AE9F    ; LVT # Lo  [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH
+AEA1..AEBB    ; LVT # Lo  [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH
+AEBD..AED7    ; LVT # Lo  [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH
+AED9..AEF3    ; LVT # Lo  [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH
+AEF5..AF0F    ; LVT # Lo  [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH
+AF11..AF2B    ; LVT # Lo  [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH
+AF2D..AF47    ; LVT # Lo  [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH
+AF49..AF63    ; LVT # Lo  [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH
+AF65..AF7F    ; LVT # Lo  [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH
+AF81..AF9B    ; LVT # Lo  [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH
+AF9D..AFB7    ; LVT # Lo  [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH
+AFB9..AFD3    ; LVT # Lo  [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH
+AFD5..AFEF    ; LVT # Lo  [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH
+AFF1..B00B    ; LVT # Lo  [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH
+B00D..B027    ; LVT # Lo  [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH
+B029..B043    ; LVT # Lo  [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH
+B045..B05F    ; LVT # Lo  [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH
+B061..B07B    ; LVT # Lo  [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH
+B07D..B097    ; LVT # Lo  [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH
+B099..B0B3    ; LVT # Lo  [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH
+B0B5..B0CF    ; LVT # Lo  [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH
+B0D1..B0EB    ; LVT # Lo  [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH
+B0ED..B107    ; LVT # Lo  [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH
+B109..B123    ; LVT # Lo  [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH
+B125..B13F    ; LVT # Lo  [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH
+B141..B15B    ; LVT # Lo  [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH
+B15D..B177    ; LVT # Lo  [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH
+B179..B193    ; LVT # Lo  [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH
+B195..B1AF    ; LVT # Lo  [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH
+B1B1..B1CB    ; LVT # Lo  [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH
+B1CD..B1E7    ; LVT # Lo  [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH
+B1E9..B203    ; LVT # Lo  [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH
+B205..B21F    ; LVT # Lo  [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH
+B221..B23B    ; LVT # Lo  [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH
+B23D..B257    ; LVT # Lo  [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH
+B259..B273    ; LVT # Lo  [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH
+B275..B28F    ; LVT # Lo  [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH
+B291..B2AB    ; LVT # Lo  [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH
+B2AD..B2C7    ; LVT # Lo  [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH
+B2C9..B2E3    ; LVT # Lo  [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH
+B2E5..B2FF    ; LVT # Lo  [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH
+B301..B31B    ; LVT # Lo  [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH
+B31D..B337    ; LVT # Lo  [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH
+B339..B353    ; LVT # Lo  [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH
+B355..B36F    ; LVT # Lo  [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH
+B371..B38B    ; LVT # Lo  [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH
+B38D..B3A7    ; LVT # Lo  [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH
+B3A9..B3C3    ; LVT # Lo  [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH
+B3C5..B3DF    ; LVT # Lo  [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH
+B3E1..B3FB    ; LVT # Lo  [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH
+B3FD..B417    ; LVT # Lo  [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH
+B419..B433    ; LVT # Lo  [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH
+B435..B44F    ; LVT # Lo  [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH
+B451..B46B    ; LVT # Lo  [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH
+B46D..B487    ; LVT # Lo  [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH
+B489..B4A3    ; LVT # Lo  [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH
+B4A5..B4BF    ; LVT # Lo  [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH
+B4C1..B4DB    ; LVT # Lo  [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH
+B4DD..B4F7    ; LVT # Lo  [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH
+B4F9..B513    ; LVT # Lo  [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH
+B515..B52F    ; LVT # Lo  [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH
+B531..B54B    ; LVT # Lo  [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH
+B54D..B567    ; LVT # Lo  [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH
+B569..B583    ; LVT # Lo  [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH
+B585..B59F    ; LVT # Lo  [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH
+B5A1..B5BB    ; LVT # Lo  [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH
+B5BD..B5D7    ; LVT # Lo  [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH
+B5D9..B5F3    ; LVT # Lo  [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH
+B5F5..B60F    ; LVT # Lo  [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH
+B611..B62B    ; LVT # Lo  [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH
+B62D..B647    ; LVT # Lo  [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH
+B649..B663    ; LVT # Lo  [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH
+B665..B67F    ; LVT # Lo  [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH
+B681..B69B    ; LVT # Lo  [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH
+B69D..B6B7    ; LVT # Lo  [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH
+B6B9..B6D3    ; LVT # Lo  [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH
+B6D5..B6EF    ; LVT # Lo  [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH
+B6F1..B70B    ; LVT # Lo  [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH
+B70D..B727    ; LVT # Lo  [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH
+B729..B743    ; LVT # Lo  [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH
+B745..B75F    ; LVT # Lo  [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH
+B761..B77B    ; LVT # Lo  [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH
+B77D..B797    ; LVT # Lo  [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH
+B799..B7B3    ; LVT # Lo  [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH
+B7B5..B7CF    ; LVT # Lo  [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH
+B7D1..B7EB    ; LVT # Lo  [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH
+B7ED..B807    ; LVT # Lo  [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH
+B809..B823    ; LVT # Lo  [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH
+B825..B83F    ; LVT # Lo  [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH
+B841..B85B    ; LVT # Lo  [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH
+B85D..B877    ; LVT # Lo  [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH
+B879..B893    ; LVT # Lo  [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH
+B895..B8AF    ; LVT # Lo  [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH
+B8B1..B8CB    ; LVT # Lo  [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH
+B8CD..B8E7    ; LVT # Lo  [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH
+B8E9..B903    ; LVT # Lo  [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH
+B905..B91F    ; LVT # Lo  [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH
+B921..B93B    ; LVT # Lo  [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH
+B93D..B957    ; LVT # Lo  [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH
+B959..B973    ; LVT # Lo  [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH
+B975..B98F    ; LVT # Lo  [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH
+B991..B9AB    ; LVT # Lo  [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH
+B9AD..B9C7    ; LVT # Lo  [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH
+B9C9..B9E3    ; LVT # Lo  [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH
+B9E5..B9FF    ; LVT # Lo  [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH
+BA01..BA1B    ; LVT # Lo  [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH
+BA1D..BA37    ; LVT # Lo  [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH
+BA39..BA53    ; LVT # Lo  [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH
+BA55..BA6F    ; LVT # Lo  [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH
+BA71..BA8B    ; LVT # Lo  [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH
+BA8D..BAA7    ; LVT # Lo  [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH
+BAA9..BAC3    ; LVT # Lo  [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH
+BAC5..BADF    ; LVT # Lo  [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH
+BAE1..BAFB    ; LVT # Lo  [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH
+BAFD..BB17    ; LVT # Lo  [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH
+BB19..BB33    ; LVT # Lo  [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH
+BB35..BB4F    ; LVT # Lo  [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH
+BB51..BB6B    ; LVT # Lo  [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH
+BB6D..BB87    ; LVT # Lo  [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH
+BB89..BBA3    ; LVT # Lo  [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH
+BBA5..BBBF    ; LVT # Lo  [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH
+BBC1..BBDB    ; LVT # Lo  [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH
+BBDD..BBF7    ; LVT # Lo  [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH
+BBF9..BC13    ; LVT # Lo  [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH
+BC15..BC2F    ; LVT # Lo  [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH
+BC31..BC4B    ; LVT # Lo  [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH
+BC4D..BC67    ; LVT # Lo  [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH
+BC69..BC83    ; LVT # Lo  [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH
+BC85..BC9F    ; LVT # Lo  [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH
+BCA1..BCBB    ; LVT # Lo  [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH
+BCBD..BCD7    ; LVT # Lo  [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH
+BCD9..BCF3    ; LVT # Lo  [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH
+BCF5..BD0F    ; LVT # Lo  [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH
+BD11..BD2B    ; LVT # Lo  [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH
+BD2D..BD47    ; LVT # Lo  [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH
+BD49..BD63    ; LVT # Lo  [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH
+BD65..BD7F    ; LVT # Lo  [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH
+BD81..BD9B    ; LVT # Lo  [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH
+BD9D..BDB7    ; LVT # Lo  [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH
+BDB9..BDD3    ; LVT # Lo  [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH
+BDD5..BDEF    ; LVT # Lo  [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH
+BDF1..BE0B    ; LVT # Lo  [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH
+BE0D..BE27    ; LVT # Lo  [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH
+BE29..BE43    ; LVT # Lo  [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH
+BE45..BE5F    ; LVT # Lo  [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH
+BE61..BE7B    ; LVT # Lo  [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH
+BE7D..BE97    ; LVT # Lo  [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH
+BE99..BEB3    ; LVT # Lo  [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH
+BEB5..BECF    ; LVT # Lo  [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH
+BED1..BEEB    ; LVT # Lo  [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH
+BEED..BF07    ; LVT # Lo  [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH
+BF09..BF23    ; LVT # Lo  [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH
+BF25..BF3F    ; LVT # Lo  [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH
+BF41..BF5B    ; LVT # Lo  [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH
+BF5D..BF77    ; LVT # Lo  [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH
+BF79..BF93    ; LVT # Lo  [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH
+BF95..BFAF    ; LVT # Lo  [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH
+BFB1..BFCB    ; LVT # Lo  [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH
+BFCD..BFE7    ; LVT # Lo  [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH
+BFE9..C003    ; LVT # Lo  [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH
+C005..C01F    ; LVT # Lo  [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH
+C021..C03B    ; LVT # Lo  [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH
+C03D..C057    ; LVT # Lo  [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH
+C059..C073    ; LVT # Lo  [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH
+C075..C08F    ; LVT # Lo  [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH
+C091..C0AB    ; LVT # Lo  [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH
+C0AD..C0C7    ; LVT # Lo  [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH
+C0C9..C0E3    ; LVT # Lo  [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH
+C0E5..C0FF    ; LVT # Lo  [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH
+C101..C11B    ; LVT # Lo  [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH
+C11D..C137    ; LVT # Lo  [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH
+C139..C153    ; LVT # Lo  [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH
+C155..C16F    ; LVT # Lo  [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH
+C171..C18B    ; LVT # Lo  [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH
+C18D..C1A7    ; LVT # Lo  [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH
+C1A9..C1C3    ; LVT # Lo  [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH
+C1C5..C1DF    ; LVT # Lo  [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH
+C1E1..C1FB    ; LVT # Lo  [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH
+C1FD..C217    ; LVT # Lo  [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH
+C219..C233    ; LVT # Lo  [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH
+C235..C24F    ; LVT # Lo  [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH
+C251..C26B    ; LVT # Lo  [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH
+C26D..C287    ; LVT # Lo  [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH
+C289..C2A3    ; LVT # Lo  [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH
+C2A5..C2BF    ; LVT # Lo  [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH
+C2C1..C2DB    ; LVT # Lo  [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH
+C2DD..C2F7    ; LVT # Lo  [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH
+C2F9..C313    ; LVT # Lo  [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH
+C315..C32F    ; LVT # Lo  [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH
+C331..C34B    ; LVT # Lo  [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH
+C34D..C367    ; LVT # Lo  [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH
+C369..C383    ; LVT # Lo  [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH
+C385..C39F    ; LVT # Lo  [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH
+C3A1..C3BB    ; LVT # Lo  [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH
+C3BD..C3D7    ; LVT # Lo  [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH
+C3D9..C3F3    ; LVT # Lo  [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH
+C3F5..C40F    ; LVT # Lo  [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH
+C411..C42B    ; LVT # Lo  [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH
+C42D..C447    ; LVT # Lo  [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH
+C449..C463    ; LVT # Lo  [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH
+C465..C47F    ; LVT # Lo  [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH
+C481..C49B    ; LVT # Lo  [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH
+C49D..C4B7    ; LVT # Lo  [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH
+C4B9..C4D3    ; LVT # Lo  [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH
+C4D5..C4EF    ; LVT # Lo  [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH
+C4F1..C50B    ; LVT # Lo  [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH
+C50D..C527    ; LVT # Lo  [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH
+C529..C543    ; LVT # Lo  [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH
+C545..C55F    ; LVT # Lo  [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH
+C561..C57B    ; LVT # Lo  [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH
+C57D..C597    ; LVT # Lo  [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH
+C599..C5B3    ; LVT # Lo  [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH
+C5B5..C5CF    ; LVT # Lo  [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH
+C5D1..C5EB    ; LVT # Lo  [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH
+C5ED..C607    ; LVT # Lo  [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH
+C609..C623    ; LVT # Lo  [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH
+C625..C63F    ; LVT # Lo  [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH
+C641..C65B    ; LVT # Lo  [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH
+C65D..C677    ; LVT # Lo  [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH
+C679..C693    ; LVT # Lo  [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH
+C695..C6AF    ; LVT # Lo  [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH
+C6B1..C6CB    ; LVT # Lo  [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH
+C6CD..C6E7    ; LVT # Lo  [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH
+C6E9..C703    ; LVT # Lo  [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH
+C705..C71F    ; LVT # Lo  [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH
+C721..C73B    ; LVT # Lo  [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH
+C73D..C757    ; LVT # Lo  [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH
+C759..C773    ; LVT # Lo  [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH
+C775..C78F    ; LVT # Lo  [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH
+C791..C7AB    ; LVT # Lo  [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH
+C7AD..C7C7    ; LVT # Lo  [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH
+C7C9..C7E3    ; LVT # Lo  [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH
+C7E5..C7FF    ; LVT # Lo  [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH
+C801..C81B    ; LVT # Lo  [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH
+C81D..C837    ; LVT # Lo  [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH
+C839..C853    ; LVT # Lo  [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH
+C855..C86F    ; LVT # Lo  [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH
+C871..C88B    ; LVT # Lo  [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH
+C88D..C8A7    ; LVT # Lo  [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH
+C8A9..C8C3    ; LVT # Lo  [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH
+C8C5..C8DF    ; LVT # Lo  [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH
+C8E1..C8FB    ; LVT # Lo  [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH
+C8FD..C917    ; LVT # Lo  [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH
+C919..C933    ; LVT # Lo  [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH
+C935..C94F    ; LVT # Lo  [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH
+C951..C96B    ; LVT # Lo  [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH
+C96D..C987    ; LVT # Lo  [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH
+C989..C9A3    ; LVT # Lo  [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH
+C9A5..C9BF    ; LVT # Lo  [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH
+C9C1..C9DB    ; LVT # Lo  [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH
+C9DD..C9F7    ; LVT # Lo  [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH
+C9F9..CA13    ; LVT # Lo  [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH
+CA15..CA2F    ; LVT # Lo  [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH
+CA31..CA4B    ; LVT # Lo  [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH
+CA4D..CA67    ; LVT # Lo  [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH
+CA69..CA83    ; LVT # Lo  [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH
+CA85..CA9F    ; LVT # Lo  [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH
+CAA1..CABB    ; LVT # Lo  [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH
+CABD..CAD7    ; LVT # Lo  [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH
+CAD9..CAF3    ; LVT # Lo  [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH
+CAF5..CB0F    ; LVT # Lo  [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH
+CB11..CB2B    ; LVT # Lo  [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH
+CB2D..CB47    ; LVT # Lo  [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH
+CB49..CB63    ; LVT # Lo  [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH
+CB65..CB7F    ; LVT # Lo  [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH
+CB81..CB9B    ; LVT # Lo  [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH
+CB9D..CBB7    ; LVT # Lo  [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH
+CBB9..CBD3    ; LVT # Lo  [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH
+CBD5..CBEF    ; LVT # Lo  [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH
+CBF1..CC0B    ; LVT # Lo  [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH
+CC0D..CC27    ; LVT # Lo  [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH
+CC29..CC43    ; LVT # Lo  [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH
+CC45..CC5F    ; LVT # Lo  [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH
+CC61..CC7B    ; LVT # Lo  [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH
+CC7D..CC97    ; LVT # Lo  [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH
+CC99..CCB3    ; LVT # Lo  [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH
+CCB5..CCCF    ; LVT # Lo  [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH
+CCD1..CCEB    ; LVT # Lo  [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH
+CCED..CD07    ; LVT # Lo  [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH
+CD09..CD23    ; LVT # Lo  [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH
+CD25..CD3F    ; LVT # Lo  [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH
+CD41..CD5B    ; LVT # Lo  [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH
+CD5D..CD77    ; LVT # Lo  [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH
+CD79..CD93    ; LVT # Lo  [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH
+CD95..CDAF    ; LVT # Lo  [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH
+CDB1..CDCB    ; LVT # Lo  [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH
+CDCD..CDE7    ; LVT # Lo  [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH
+CDE9..CE03    ; LVT # Lo  [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH
+CE05..CE1F    ; LVT # Lo  [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH
+CE21..CE3B    ; LVT # Lo  [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH
+CE3D..CE57    ; LVT # Lo  [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH
+CE59..CE73    ; LVT # Lo  [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH
+CE75..CE8F    ; LVT # Lo  [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH
+CE91..CEAB    ; LVT # Lo  [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH
+CEAD..CEC7    ; LVT # Lo  [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH
+CEC9..CEE3    ; LVT # Lo  [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH
+CEE5..CEFF    ; LVT # Lo  [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH
+CF01..CF1B    ; LVT # Lo  [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH
+CF1D..CF37    ; LVT # Lo  [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH
+CF39..CF53    ; LVT # Lo  [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH
+CF55..CF6F    ; LVT # Lo  [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH
+CF71..CF8B    ; LVT # Lo  [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH
+CF8D..CFA7    ; LVT # Lo  [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH
+CFA9..CFC3    ; LVT # Lo  [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH
+CFC5..CFDF    ; LVT # Lo  [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH
+CFE1..CFFB    ; LVT # Lo  [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH
+CFFD..D017    ; LVT # Lo  [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH
+D019..D033    ; LVT # Lo  [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH
+D035..D04F    ; LVT # Lo  [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH
+D051..D06B    ; LVT # Lo  [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH
+D06D..D087    ; LVT # Lo  [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH
+D089..D0A3    ; LVT # Lo  [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH
+D0A5..D0BF    ; LVT # Lo  [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH
+D0C1..D0DB    ; LVT # Lo  [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH
+D0DD..D0F7    ; LVT # Lo  [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH
+D0F9..D113    ; LVT # Lo  [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH
+D115..D12F    ; LVT # Lo  [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH
+D131..D14B    ; LVT # Lo  [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH
+D14D..D167    ; LVT # Lo  [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH
+D169..D183    ; LVT # Lo  [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH
+D185..D19F    ; LVT # Lo  [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH
+D1A1..D1BB    ; LVT # Lo  [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH
+D1BD..D1D7    ; LVT # Lo  [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH
+D1D9..D1F3    ; LVT # Lo  [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH
+D1F5..D20F    ; LVT # Lo  [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH
+D211..D22B    ; LVT # Lo  [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH
+D22D..D247    ; LVT # Lo  [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH
+D249..D263    ; LVT # Lo  [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH
+D265..D27F    ; LVT # Lo  [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH
+D281..D29B    ; LVT # Lo  [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH
+D29D..D2B7    ; LVT # Lo  [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH
+D2B9..D2D3    ; LVT # Lo  [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH
+D2D5..D2EF    ; LVT # Lo  [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH
+D2F1..D30B    ; LVT # Lo  [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH
+D30D..D327    ; LVT # Lo  [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH
+D329..D343    ; LVT # Lo  [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH
+D345..D35F    ; LVT # Lo  [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH
+D361..D37B    ; LVT # Lo  [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH
+D37D..D397    ; LVT # Lo  [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH
+D399..D3B3    ; LVT # Lo  [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH
+D3B5..D3CF    ; LVT # Lo  [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH
+D3D1..D3EB    ; LVT # Lo  [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH
+D3ED..D407    ; LVT # Lo  [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH
+D409..D423    ; LVT # Lo  [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH
+D425..D43F    ; LVT # Lo  [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH
+D441..D45B    ; LVT # Lo  [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH
+D45D..D477    ; LVT # Lo  [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH
+D479..D493    ; LVT # Lo  [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH
+D495..D4AF    ; LVT # Lo  [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH
+D4B1..D4CB    ; LVT # Lo  [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH
+D4CD..D4E7    ; LVT # Lo  [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH
+D4E9..D503    ; LVT # Lo  [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH
+D505..D51F    ; LVT # Lo  [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH
+D521..D53B    ; LVT # Lo  [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH
+D53D..D557    ; LVT # Lo  [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH
+D559..D573    ; LVT # Lo  [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH
+D575..D58F    ; LVT # Lo  [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH
+D591..D5AB    ; LVT # Lo  [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH
+D5AD..D5C7    ; LVT # Lo  [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH
+D5C9..D5E3    ; LVT # Lo  [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH
+D5E5..D5FF    ; LVT # Lo  [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH
+D601..D61B    ; LVT # Lo  [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH
+D61D..D637    ; LVT # Lo  [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH
+D639..D653    ; LVT # Lo  [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH
+D655..D66F    ; LVT # Lo  [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH
+D671..D68B    ; LVT # Lo  [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH
+D68D..D6A7    ; LVT # Lo  [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH
+D6A9..D6C3    ; LVT # Lo  [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH
+D6C5..D6DF    ; LVT # Lo  [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH
+D6E1..D6FB    ; LVT # Lo  [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH
+D6FD..D717    ; LVT # Lo  [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH
+D719..D733    ; LVT # Lo  [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH
+D735..D74F    ; LVT # Lo  [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH
+D751..D76B    ; LVT # Lo  [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH
+D76D..D787    ; LVT # Lo  [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH
+D789..D7A3    ; LVT # Lo  [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH
+
+# Total code points: 10773
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/Index.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/Index.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/Index.txt	(revision 14489)
@@ -0,0 +1,4307 @@
+8859-1 (Latin-1), Based on ISO	00A0
+8859-2, -3, -4, -9 (European Latin), Based on ISO	0100
+8859-5 (Cyrillic), Based on ISO	0400
+8859-6 (Arabic), Based on ISO	0600
+8859-7 (Greek), Based on ISO	0370
+8859-8 (Hebrew), Based on ISO	05D0
+A, COMBINING LATIN SMALL LETTER	0363
+a, latin small letter script	0251
+A, LATIN SMALL LETTER TURNED	0250
+ABBREVIATION MARK, ARMENIAN	055F
+ABBREVIATION MARK, SYRIAC	070F
+ABBREVIATION SIGN, DEVANAGARI	0970
+Abbreviations, Squared Latin	3371
+Aboriginal Syllabics, Unified Canadian	1400
+above, cedilla	0312
+ABOVE, COMBINING ALMOST EQUAL TO	034C
+ABOVE, COMBINING BRIDGE	0346
+ABOVE, COMBINING CLOCKWISE ARROW	20D5
+ABOVE, COMBINING COMMA	0313
+ABOVE, COMBINING DOT	0307
+ABOVE, COMBINING DOUBLE VERTICAL LINE	030E
+ABOVE, COMBINING FOUR DOTS	20DC
+ABOVE, COMBINING HOMOTHETIC	034B
+ABOVE, COMBINING HOOK	0309
+ABOVE, COMBINING LEFT ANGLE	031A
+ABOVE, COMBINING LEFT ARROW	20D6
+ABOVE, COMBINING LEFT HARPOON	20D0
+ABOVE, COMBINING LEFT RIGHT ARROW	20E1
+ABOVE, COMBINING NOT TILDE	034A
+ABOVE, COMBINING REVERSED COMMA	0314
+ABOVE, COMBINING RING	030A
+ABOVE, COMBINING THREE DOTS	20DB
+ABOVE, COMBINING TURNED COMMA	0312
+ABOVE, COMBINING VERTICAL LINE	030D
+ABOVE, COMBINING WIDE BRIDGE	20E9
+ABOVE, COMBINING X	033D
+ABOVE, DOT	02D9
+above, double dot	0308
+ABOVE, RING	02DA
+above, vee	030C
+ABOVE RIGHT, COMBINING COMMA	0315
+absolute continuity	2AA1
+ACCENT, ACUTE	00B4
+ACCENT, ALMOST EQUAL TO WITH CIRCUMFLEX	2A6F
+ACCENT, CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX	2A36
+ACCENT, CIRCUMFLEX	005E
+ACCENT, COMBINING ACUTE	0301
+ACCENT, COMBINING CIRCUMFLEX	0302
+ACCENT, COMBINING DOUBLE ACUTE	030B
+ACCENT, COMBINING DOUBLE GRAVE	030F
+ACCENT, COMBINING GRAVE	0300
+ACCENT, DOUBLE ACUTE	02DD
+ACCENT, GRAVE	0060
+ACCENT, MODIFIER LETTER ACUTE	02CA
+ACCENT, MODIFIER LETTER CIRCUMFLEX	02C6
+ACCENT, MODIFIER LETTER CROSS	02DF
+ACCENT, MODIFIER LETTER GRAVE	02CB
+ACCENT, MODIFIER LETTER LOW ACUTE	02CF
+ACCENT, MODIFIER LETTER LOW GRAVE	02CE
+accent, swedish grave	02DF
+ACCENT ABOVE, PLUS SIGN WITH CIRCUMFLEX	2A23
+ACCENT BELOW, COMBINING ACUTE	0317
+ACCENT BELOW, COMBINING CIRCUMFLEX	032D
+ACCENT BELOW, COMBINING GRAVE	0316
+ACCOUNT OF	2100
+acknowledge	0006
+acknowledge, graphic for negative	237B
+acknowledge, negative	0015
+ACKNOWLEDGE, SYMBOL FOR	2406
+ACKNOWLEDGE, SYMBOL FOR NEGATIVE	2415
+ACTIVATE ARABIC FORM SHAPING	206D
+ACTIVATE SYMMETRIC SWAPPING	206B
+actuarial bend	20E7
+acute, spacing	00B4
+ACUTE ACCENT	00B4
+ACUTE ACCENT, COMBINING	0301
+ACUTE ACCENT, COMBINING DOUBLE	030B
+ACUTE ACCENT, DEVANAGARI	0954
+ACUTE ACCENT, DOUBLE	02DD
+ACUTE ACCENT, MODIFIER LETTER	02CA
+ACUTE ACCENT, MODIFIER LETTER LOW	02CF
+ACUTE ACCENT BELOW, COMBINING	0317
+ACUTE ANGLE	299F
+ACUTE TONE MARK, COMBINING	0341
+ADDRESSED TO THE SUBJECT	2101
+Addu dialect, consonant for	0780
+AE, LATIN SMALL LETTER	00E6
+Aegean Numbers	10100
+AEGEAN CHECK MARK	10102
+AEGEAN WORD SEPARATOR DOT	10101
+AEGEAN WORD SEPARATOR LINE	10100
+Ainu, Phonetic Extensions For	31F0
+AIRPLANE	2708
+aldus leaf	2766
+ALEF SYMBOL	2135
+ALL, FOR	2200
+ALL AROUND-PROFILE	232E
+ALL EQUAL TO	224C
+ALMOST EQUAL TO	2248
+ALMOST EQUAL TO, PRECEDES ABOVE	2AB7
+ALMOST EQUAL TO, PRECEDES ABOVE NOT	2AB9
+ALMOST EQUAL TO, SUBSET OF ABOVE	2AC9
+ALMOST EQUAL TO, SUCCEEDS ABOVE	2AB8
+ALMOST EQUAL TO, SUCCEEDS ABOVE NOT	2ABA
+ALMOST EQUAL TO, SUPERSET OF ABOVE	2ACA
+ALMOST EQUAL TO ABOVE, COMBINING	034C
+ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT	2A6F
+ALPHA, LATIN SMALL LETTER	0251
+ALPHA, LATIN SMALL LETTER TURNED	0252
+Alphabetic Presentation Forms	FB00
+Alphanumerics, Enclosed	2460
+alternating current	223F
+ALTERNATION MARK, PART	303D
+ALTERNATIVE KEY SYMBOL	2387
+ALVEOLAR CLICK, LATIN LETTER	01C2
+always (modal operator)	25FB
+always (modal operator), was	27E4
+always be (modal operator), will	27E5
+AMALGAMATION OR COPRODUCT	2A3F
+AMPERSAND	0026
+AMPERSAND, TURNED	214B
+AND, CURLY LOGICAL	22CF
+AND, LOGICAL	2227
+AND, N-ARY LOGICAL	22C0
+andrew's, cross st.	2613
+Ands and Ors, Logical	2A51
+ANGLE	2220
+ANGLE, ACUTE	299F
+ANGLE, MEASURED	2221
+ANGLE, RIGHT	221F
+ANGLE, SPHERICAL	2222
+ANGLE, TURNED	29A2
+ANGLE ABOVE, COMBINING LEFT	031A
+angle arc	2222
+ANGLE BELOW, COMBINING LEFT	0349
+ANGLE BRACKET, LEFT	3008
+ANGLE BRACKET, LEFT DOUBLE	300A
+ANGLE BRACKET, LEFT-POINTING	2329
+ANGLE BRACKET, MATHEMATICAL LEFT	27E8
+ANGLE BRACKET, MATHEMATICAL LEFT DOUBLE	27EA
+ANGLE BRACKET, RIGHT-POINTING	232A
+ANGLE OPENING LEFT, SPHERICAL	29A0
+ANGLE OPENING UP, SPHERICAL	29A1
+ANGLE QUOTATION MARK, LEFT-POINTING DOUBLE	00AB
+ANGLE QUOTATION MARK, RIGHT-POINTING DOUBLE	00BB
+ANGLE QUOTATION MARK, SINGLE LEFT-POINTING	2039
+ANGLE QUOTATION MARK, SINGLE RIGHT-POINTING	203A
+Angle Quotation Marks, Ornamental	276E
+ANGLE WITH ARC, RIGHT	22BE
+ANGLE WITH DOWNWARDS ZIGZAG ARROW, RIGHT	237C
+angled dash	00AC
+Angles and Measured Angles	299B
+ANGSTROM SIGN	212B
+ANKH	2625
+Annotation, Interlinear	FFF9
+Annotation, Kanbun Ideographic	3190
+Annotation Signs, Koranic	06D6
+ANNUITY SYMBOL, COMBINING	20E7
+ano teleia	00B7
+ANTICLOCKWISE INTEGRATION	2A11
+ANTICLOCKWISE-ROTATED DIVISION SIGN, CIRCLED	29BC
+ANTIRESTRICTION, Z NOTATION DOMAIN	2A64
+ANTIRESTRICTION, Z NOTATION RANGE	2A65
+APL	2336
+APL Functional Symbols	2336
+apl jot	2218
+apl overbar	00AF
+apl quote	0022
+apl stile	2223
+apl tilde	223C
+apl upstile	2308
+APOSTROPHE	0027
+apostrophe	02BC
+apostrophe	2019
+APOSTROPHE, ARMENIAN	055A
+APOSTROPHE, MODIFIER LETTER	02BC
+APOSTROPHE, MODIFIER LETTER DOUBLE	02EE
+apostrophe-quote	0027
+APPLICATION, FUNCTION	2061
+application program command	009F
+APPROACHES THE LIMIT	2250
+APPROXIMATE, GREATER-THAN AND NOT	2A8A
+APPROXIMATE, GREATER-THAN OR	2A86
+APPROXIMATE, LESS-THAN AND NOT	2A89
+APPROXIMATE, LESS-THAN OR	2A85
+APPROXIMATELY EQUAL OR EQUAL TO	2A70
+APPROXIMATELY EQUAL TO	2245
+approximately equal to	2257
+AQUARIUS	2652
+Arabic	0600
+Arabic, Extended	0671
+ARABIC COMMA	060C
+ARABIC DECIMAL SEPARATOR	066B
+ARABIC END OF AYAH	06DD
+ARABIC FIVE POINTED STAR	066D
+ARABIC FOOTNOTE MARKER	0602
+ARABIC FORM SHAPING, ACTIVATE	206D
+ARABIC FORM SHAPING, INHIBIT	206C
+ARABIC FULL STOP	06D4
+Arabic Honorifics	0610
+ARABIC LETTER DOTLESS BEH	066E
+ARABIC LETTER DOTLESS QAF	066F
+Arabic Letters	0627
+ARABIC NUMBER SIGN	0600
+ARABIC PERCENT SIGN	066A
+Arabic Points	064B
+Arabic Presentation Forms-A	FB50
+Arabic Presentation Forms-B	FE70
+ARABIC QUESTION MARK	061F
+ARABIC SEMICOLON	061B
+ARABIC SIGN SAFHA	0603
+ARABIC SIGN SANAH	0601
+Arabic Poetic Marks	0610
+Arabic Subtending Marks	0600
+ARABIC TAIL FRAGMENT	FE73
+ARABIC THOUSANDS SEPARATOR	066C
+Arabic-Indic Digits	0660
+Arabic-Indic Digits for Persian and Urdu, Eastern	06F0
+ARC	2312
+arc, angle	2222
+ARC, RIGHT ANGLE WITH	22BE
+ARCH BELOW, COMBINING INVERTED DOUBLE	032B
+Arcs	25DC
+area, end of guarded	0097
+area, end of selected	0087
+area, start of guarded	0096
+area, start of selected	0086
+ARIES	2648
+Armenian	0530
+ARMENIAN ABBREVIATION MARK	055F
+ARMENIAN APOSTROPHE	055A
+Armenian Capital Letters	0531
+ARMENIAN COMMA	055D
+ARMENIAN EMPHASIS MARK	055B
+ARMENIAN EXCLAMATION MARK	055C
+ARMENIAN FULL STOP	0589
+ARMENIAN HYPHEN	058A
+Armenian Ligatures	FB13
+ARMENIAN QUESTION MARK	055E
+Armenian Small Letters	0561
+ARROW, BLACK CIRCLE WITH DOWN	29ED
+ARROW, BLACK DIAMOND WITH DOWN	29EA
+arrow, colon right	29F4
+ARROW, ELECTRIC	2301
+ARROW, RIGHT ANGLE WITH DOWNWARDS ZIGZAG	237C
+ARROW, WHITE CIRCLE WITH DOWN	29EC
+ARROW ABOVE, COMBINING CLOCKWISE	20D5
+ARROW ABOVE, COMBINING LEFT	20D6
+ARROW ABOVE, COMBINING LEFT RIGHT	20E1
+ARROW BELOW, COMBINING DOUBLE RIGHTWARDS	0362
+ARROW BELOW, COMBINING LEFT RIGHT	034D
+ARROW BELOW, COMBINING UPWARDS	034E
+Arrow Dingbats	2794
+ARROW OVERLAY, COMBINING LEFTWARDS	20EA
+ARROW THROUGH CIRCLE, UP	29BD
+ARROW WITH HOOK, INTEGRAL WITH LEFTWARDS	2A17
+ARROWHEAD, UP	2303
+Arrowheads, Modifier Letter	02C2
+Arrows	2190
+Arrows, Long	27F5
+Arrows, Other White and Black	2B00
+arrows extension	23AF
+Arrows-A, Supplemental	27F0
+Arrows-B, Supplemental	2900
+ASCENDING NODE	260A
+ASCII	0020
+ASCII C0 Control Codes	0000
+ASCII Digits	0030
+ASCII Variants, Fullwidth	FF01
+ash	00E6
+ASSERTION	22A6
+ASTERISK	002A
+ASTERISK, EQUALS WITH	2A6E
+ASTERISK, LOW	204E
+ASTERISK, SQUARED	29C6
+Asterisk Dingbats	2722
+ASTERISK OPERATOR	2217
+ASTERISK OPERATOR, CIRCLED	229B
+ASTERISKS ALIGNED VERTICALLY, TWO	2051
+Asterisks and Snowflakes, Stars, 	2721
+ASTERISM	2042
+Astrological Symbols	263D
+asymptotic to	2248
+ASYMPTOTICALLY EQUAL TO	2243
+AT, COMMERCIAL	0040
+AVERAGE WITH SLASH, INTEGRAL	2A0F
+AYAH, ARABIC END OF	06DD
+B, LATIN LETTER SMALL CAPITAL	0299
+B, SCRIPT CAPITAL	212C
+baby gamma, latin small letter	0264
+backslash	005C
+BACKSLASH, COMBINING ENCLOSING CIRCLE	20E0
+backspace	0008
+BACKSPACE, SYMBOL FOR	2408
+backward difference	2207
+bag bracket, z notation left	27E6
+BAG MEMBERSHIP, Z NOTATION	22FF
+bag subtraction, z notation	2A41
+BAHT, THAI CURRENCY SYMBOL	0E3F
+BALLOT BOX	2610
+BALLOT BOX WITH CHECK	2611
+BALLOT BOX WITH X	2612
+BALLOT X	2717
+BALLOT X, HEAVY	2718
+bang	0021
+bar, broken vertical	00A6
+BAR, CIRCLED VERTICAL	29B6
+BAR, HORIZONTAL	2015
+BAR, N-ARY WHITE VERTICAL	2AFF
+bar, vertical	007C
+BAR, WHITE VERTICAL	2AFE
+BAR BINARY RELATION, TRIPLE VERTICAL	2AF4
+BAR DELIMITER, TRIPLE VERTICAL	2980
+Bar Dingbats, Vertical	2758
+BAR OPERATOR, LARGE TRIPLE VERTICAL	2AFC
+Bar Symbols, Error	29EE
+BAR WITH DOUBLE VERTICAL STROKE, TRIPLE HORIZONTAL	2A68
+BAR WITH HORIZONTAL STROKE, TRIPLE VERTICAL	2AF5
+BAR WITH TRIPLE VERTICAL STROKE, TRIPLE HORIZONTAL	2A69
+barred o, latin capital letter	019F
+BARRED O, LATIN SMALL LETTER	0275
+Basic Latin, C0 Controls and	0000
+Basic Russian Alphabet	0410
+BEAMED EIGHTH NOTES	266B
+BEAMED SIXTEENTH NOTES	266C
+BECAUSE	2235
+beginning of line	2310
+bell	0007
+BELL, SYMBOL FOR	2407
+BELL SYMBOL	237E
+BELOW, COMBINING ACUTE ACCENT	0317
+BELOW, COMBINING BREVE	032E
+BELOW, COMBINING BRIDGE	032A
+BELOW, COMBINING CARON	032C
+BELOW, COMBINING CIRCUMFLEX ACCENT	032D
+BELOW, COMBINING COMMA	0326
+BELOW, COMBINING DIAERESIS	0324
+BELOW, COMBINING DOT	0323
+BELOW, COMBINING DOUBLE RIGHTWARDS ARROW	0362
+BELOW, COMBINING DOUBLE VERTICAL LINE	0348
+BELOW, COMBINING EQUALS SIGN	0347
+BELOW, COMBINING GRAVE ACCENT	0316
+BELOW, COMBINING INVERTED BREVE	032F
+BELOW, COMBINING INVERTED BRIDGE	033A
+BELOW, COMBINING INVERTED DOUBLE ARCH	032B
+BELOW, COMBINING LEFT ANGLE	0349
+BELOW, COMBINING LEFT HALF RING	031C
+BELOW, COMBINING LEFT RIGHT ARROW	034D
+BELOW, COMBINING LEFT TACK	0318
+BELOW, COMBINING MACRON	0331
+BELOW, COMBINING MINUS SIGN	0320
+BELOW, COMBINING PALATALIZED HOOK	0321
+BELOW, COMBINING PLUS SIGN	031F
+BELOW, COMBINING RETROFLEX HOOK	0322
+BELOW, COMBINING RIGHT HALF RING	0339
+BELOW, COMBINING RING	0325
+BELOW, COMBINING SEAGULL	033C
+BELOW, COMBINING SQUARE	033B
+BELOW, COMBINING TILDE	0330
+BELOW, COMBINING UP TACK	031D
+BELOW, COMBINING UPWARDS ARROW	034E
+BELOW, COMBINING VERTICAL LINE	0329
+below, greek non-spacing iota	0345
+bend, actuarial	20E7
+Bengali	0980
+Bengali Currency Signs	09F2
+Bengali Digits	09E6
+Bengali Letters	0985
+BENGALI RUPEE MARK	09F2
+BENGALI RUPEE SIGN	09F3
+BENZENE RING	232C
+bernoulli function	212C
+BET SYMBOL	2136
+Betty BOOP	263A
+BETWEEN	226C
+BEVERAGE, HOT	2615
+BIDENTAL PERCUSSIVE, LATIN LETTER	02AD
+Bidirectional Formatting Controls	202A
+Big 5, Duplicates from	FA0C
+BIG REVERSE SOLIDUS	29F9
+BIG SOLIDUS	29F8
+bijection, z notation	2917
+bijective mapping	2916
+BILABIAL CLICK, LATIN LETTER	0298
+BILABIAL PERCUSSIVE, LATIN LETTER	02AC
+BINARY RELATION, TRIPLE SOLIDUS	2AFB
+BINARY RELATION, TRIPLE VERTICAL BAR	2AF4
+BIOHAZARD SIGN	2623
+BLACK, BOWTIE WITH LEFT HALF	29D1
+BLACK, BOWTIE WITH RIGHT HALF	29D2
+BLACK, DOWN-POINTING TRIANGLE WITH LEFT HALF	29E8
+BLACK, DOWN-POINTING TRIANGLE WITH RIGHT HALF	29E9
+BLACK, TIMES WITH LEFT HALF	29D4
+BLACK, TIMES WITH RIGHT HALF	29D5
+BLACK BOWTIE	29D3
+BLACK CIRCLE WITH DOWN ARROW	29ED
+BLACK CIRCLE WITH TWO WHITE DOTS	2689
+BLACK CIRCLE WITH WHITE DOT RIGHT	2688
+Black Circled Numbers, White On	24EB
+BLACK DIAMOND WITH DOWN ARROW	29EA
+BLACK FLAG	2691
+BLACK HOURGLASS	29D7
+BLACK LEFT POINTING INDEX	261A
+BLACK LEFTWARDS BULLET	204C
+BLACK LENTICULAR BRACKET, LEFT	3010
+BLACK LOZENGE	29EB
+BLACK MEDIUM SMALL SQUARE	25FE
+BLACK MEDIUM SQUARE	25FC
+BLACK NIB	2712
+BLACK PARALLELOGRAM	25B0
+BLACK SCISSORS	2702
+BLACK SHOGI PIECE	2617
+black small circle	2022
+BLACK SMILING FACE	263B
+BLACK STAR	2605
+BLACK SUN WITH RAYS	2600
+BLACK TELEPHONE	260E
+BLACK TRIANGLE, PLUS SIGN WITH	2A28
+BLACK UNIVERSAL RECYCLING SYMBOL	267B
+BLACK-LETTER CAPITAL C	212D
+BLACK-LETTER CAPITAL H	210C
+BLACK-LETTER CAPITAL I	2111
+BLACK-LETTER CAPITAL R	211C
+BLACK-LETTER CAPITAL Z	2128
+BLANK SYMBOL	2422
+block, end of transmission	0017
+BLOCK, SYMBOL FOR END OF TRANSMISSION	2417
+Block Elements	2580
+bom	FEFF
+Bopomofo, Chinese	3100
+Bopomofo Extended for Minnan and Hakka, Chinese	31A0
+BOWTIE	22C8
+bowtie, large	2A1D
+Bowtie Symbols	29D1
+BOX, BALLOT	2610
+BOX, OPEN	2423
+BOX, SHOULDERED OPEN	237D
+BOX, X IN A RECTANGLE	2327
+Box Drawing	2500
+BOX LINE, LEFT VERTICAL	23B8
+BOX LINE, RIGHT VERTICAL	23B9
+BOX OPERATOR, SQUARE LEFT OPEN	2ACD
+BOX OPERATOR, SQUARE RIGHT OPEN	2ACE
+BOX WITH CHECK, BALLOT	2611
+BOX WITH X, BALLOT	2612
+bra	27E6
+brace, closing	007D
+brace, opening	007B
+bracket, z notation left bag	27E6
+bracket, closing curly	007D
+bracket, closing square	005D
+BRACKET, LEFT ANGLE	3008
+BRACKET, LEFT BLACK LENTICULAR	3010
+BRACKET, LEFT CORNER	300C
+BRACKET, LEFT CURLY	007B
+BRACKET, LEFT DOUBLE ANGLE	300A
+BRACKET, LEFT SQUARE	005B
+BRACKET, LEFT TORTOISE SHELL	3014
+BRACKET, LEFT WHITE CORNER	300E
+BRACKET, LEFT WHITE LENTICULAR	3016
+BRACKET, LEFT WHITE SQUARE	301A
+BRACKET, LEFT WHITE TORTOISE SHELL	3018
+BRACKET, LEFT-POINTING ANGLE	2329
+bracket, opening curly	007B
+bracket, opening square	005B
+BRACKET, RIGHT CURLY	007D
+BRACKET, RIGHT SQUARE	005D
+Bracket Pieces	239B
+Bracket Pieces	23B0
+BRACKET WITH QUILL, LEFT SQUARE	2045
+Brackets	2983
+Brackets, CJK Angle	3008
+Brackets, Corner	2308
+Brackets, CJK Corner	300C
+Brackets, CJK	3010
+Brackets, CJK	3014
+Brackets, Fullwidth	FF5F
+Brackets, Mathematical	27E6
+Brackets, Ornamental	2768
+Brackets, Ornamental	2770
+Brackets, Vertical	23B4
+Braille Patterns	2800
+brazilian currency	20A2
+break here, no	0083
+break permitted here	0082
+breathing, rough	0314
+breathing, smooth	0313
+BREVE	02D8
+BREVE, COMBINING	0306
+BREVE, COMBINING DOUBLE INVERTED	0361
+BREVE, COMBINING INVERTED	0311
+BREVE BELOW, COMBINING	032E
+BREVE BELOW, COMBINING INVERTED	032F
+BRIDGE ABOVE, COMBINING	0346
+BRIDGE ABOVE, COMBINING WIDE	20E9
+BRIDGE BELOW, COMBINING	032A
+BRIDGE BELOW, COMBINING INVERTED	033A
+broken vertical bar	00A6
+Buhid	1740
+BULLET	2022
+BULLET, BLACK LEFTWARDS	204C
+BULLET, HYPHEN	2043
+BULLET, REVERSED ROTATED FLORAL HEART	2619
+bullet, tainome (japanese, a kind of)	25C9
+BULLET, TRIANGULAR	2023
+BULLET, WHITE	25E6
+BULLET OPERATOR	2219
+BULLSEYE	25CE
+bullseye, latin letter	0298
+BUMPY ABOVE, EQUALS SIGN WITH	2AAE
+BY, MEASURED	225E
+by definition, equal to	225C
+BY DEFINITION, EQUAL TO	225D
+byte order mark	FEFF
+C, BLACK-LETTER CAPITAL	212D
+C, COMBINING LATIN SMALL LETTER	0368
+C, DOUBLE-STRUCK CAPITAL	2102
+C, LATIN LETTER STRETCHED	0297
+C0 Controls and Basic Latin	0000
+C1 Controls and Latin-1 Supplement	0080
+CADA UNA	2106
+CADUCEUS	2624
+Canadian Aboriginal Syllabics, Unified	1400
+cancel	0018
+CANCEL, SYMBOL FOR	2418
+cancel character	0094
+CANCER	264B
+CANDRABINDU, COMBINING	0310
+Cantillation Marks, Hebrew	0591
+cap	2229
+CAP, SQUARE	2293
+Capital Letters, Armenian	0531
+Capital Letters, Cyrillic	0401
+Capital Letters, Georgian	10A0
+Capital Letters, Greek	0391
+Capital Letters, Latin	0041
+CAPRICORN	2651
+caps lock	21EA
+caps lock	21EC
+Card Suits, Playing	2660
+cardinal (countable), first transfinite	2135
+cardinal (functions of a real variable), third transfinite	2137
+cardinal (the continuum), second transfinite	2136
+CARE OF	2105
+caret	028C
+CARET	2038
+CARET INSERTION POINT	2041
+CARON	02C7
+CARON, COMBINING	030C
+CARON BELOW, COMBINING	032C
+carriage return	000D
+carriage return	21B5
+CARRIAGE RETURN, SYMBOL FOR	240D
+CAUTION SIGN	2621
+CEDILLA	00B8
+CEDILLA, COMBINING	0327
+cedilla, spacing	00B8
+cedilla above	0312
+CEILING, LEFT	2308
+CELSIUS, DEGREE	2103
+CENT SIGN	00A2
+centigrade, degrees	2103
+CENTRE LINE SYMBOL	2104
+CENTRED LEFT HALF RING, MODIFIER LETTER	02D3
+CENTRELINE LOW LINE	FE4E
+CENTRELINE OVERLINE	FE4A
+cgj	034F
+character introducer, single	009A
+character tabulation set	0088
+character tabulation with justification	0089
+CHARACTER TIE	2040
+Chart Components, Form and	2500
+CHECK, BALLOT BOX WITH	2611
+CHECK MARK	2713
+CHECK MARK, AEGEAN	10102
+CHECK MARK, HEAVY	2714
+CHECK MARK, NOT	237B
+Cherokee	13A0
+Chess Pieces	2654
+Chess Symbols, Japanese	2616
+chevrons	00AB
+CHI RHO	2627
+Chinese Bopomofo	3100
+Chinese Bopomofo Extended for Minnan and Hakka	31A0
+choice, dijkstra	2AFE
+choice, n-ary dijkstra	2AFF
+CIRCLE, BLACK	25CF
+circle, black small	2022
+CIRCLE, COMBINING ENCLOSING	20DD
+CIRCLE, DOTTED	25CC
+circle, jis composition	20DD
+CIRCLE, LARGE	25EF
+CIRCLE, MULTIPLICATION SIGN IN DOUBLE	2A37
+CIRCLE, MULTIPLICATION SIGN IN LEFT HALF	2A34
+CIRCLE, MULTIPLICATION SIGN IN RIGHT HALF	2A35
+CIRCLE, PLUS SIGN IN LEFT HALF	2A2D
+CIRCLE, PLUS SIGN IN RIGHT HALF	2A2E
+CIRCLE, SQUARED SMALL	29C7
+CIRCLE ABOVE, PLUS SIGN WITH SMALL	2A22
+CIRCLE ABOVE, UP TACK WITH	27DF
+CIRCLE ABOVE, VERTICAL LINE WITH	2AEF
+CIRCLE BACKSLASH, COMBINING ENCLOSING	20E0
+CIRCLE BELOW, DOWN TACK WITH	2AF1
+CIRCLE BELOW, VERTICAL LINE WITH	2AF0
+CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR	29BA
+CIRCLE INSIDE, GREATER-THAN WITH	2A7A
+CIRCLE INSIDE, LESS-THAN WITH	2A79
+Circle Symbols	29B5
+CIRCLE WITH DOT RIGHT, WHITE	2686
+CIRCLE WITH DOWN ARROW, BLACK	29ED
+CIRCLE WITH DOWN ARROW, WHITE	29EC
+CIRCLE WITH TWO DOTS, WHITE	2687
+CIRCLE WITH TWO WHITE DOTS, BLACK	2689
+CIRCLE WITH WHITE DOT RIGHT, BLACK	2688
+CIRCLED ASTERISK OPERATOR	229B
+CIRCLED DASH	229D
+CIRCLED DIGIT ZERO	24EA
+Circled Digits, Dingbat	2776
+CIRCLED DIVISION SIGN	2A38
+CIRCLED DIVISION SLASH	2298
+CIRCLED DOT OPERATOR	2299
+CIRCLED DOT OPERATOR, N-ARY	2A00
+CIRCLED EQUALS	229C
+Circled Ideographs	3280
+Circled Inverse Numbers	2776
+Circled Japanese Katakana	32D0
+Circled Korean Hangul Elements	3260
+Circled Korean Hangul Syllables	326E
+Circled Latin Letters	24B6
+CIRCLED MINUS	2296
+CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT	2A36
+Circled Numbers	2460
+Circled Numbers	3251
+Circled Numbers	32B1
+Circled Numbers, Double	24F5
+Circled Numbers, White On Black	24EB
+CIRCLED PLUS	2295
+CIRCLED PLUS OPERATOR, N-ARY	2A01
+CIRCLED POSTAL MARK	3036
+CIRCLED RING OPERATOR	229A
+CIRCLED TIMES	2297
+CIRCLED TIMES OPERATOR, N-ARY	2A02
+Circles	25CB
+CIRCULATION FUNCTION	2A10
+circumflex, spacing	005E
+CIRCUMFLEX ACCENT	005E
+CIRCUMFLEX ACCENT, ALMOST EQUAL TO WITH	2A6F
+CIRCUMFLEX ACCENT, CIRCLED MULTIPLICATION SIGN WITH	2A36
+CIRCUMFLEX ACCENT, COMBINING	0302
+CIRCUMFLEX ACCENT, MODIFIER LETTER	02C6
+CIRCUMFLEX ACCENT ABOVE, PLUS SIGN WITH	2A23
+CIRCUMFLEX ACCENT BELOW, COMBINING	032D
+CJK Compatibility	3300
+CJK Compatibility Forms	FE30
+CJK Compatibility Ideographs	F900
+CJK Compatibility Ideographs, IBM	FA0E
+CJK Ideographs Area	3400
+CJK Letters and Ideographs, Enclosed	3200
+CJK Phonetics and Symbols Area	2E00
+CJK Radicals Supplement	2E80
+CJK Symbols and Punctuation	3000
+CJK Unified Ideographs	4E00
+CJK Unified Ideographs Extension A	3400
+clear key	2327
+CLEAR SCREEN SYMBOL	239A
+clear weather	2600
+CLICK, LATIN LETTER ALVEOLAR	01C2
+CLICK, LATIN LETTER BILABIAL	0298
+CLICK, LATIN LETTER DENTAL	01C0
+CLICK, LATIN LETTER LATERAL	01C1
+CLICK, LATIN LETTER RETROFLEX	01C3
+CLOCKWISE ARROW ABOVE, COMBINING	20D5
+CLOCKWISE CONTOUR INTEGRAL	2232
+CLOCKWISE INTEGRAL	2231
+CLOCKWISE RING OVERLAY, COMBINING	20D9
+clone	2104
+Clones of Diacritics, Spacing	02D8
+CLOSE UP	2050
+closed epsilon, latin small letter	029A
+CLOSED INTERSECTION WITH SERIFS	2A4D
+CLOSED OMEGA, LATIN SMALL LETTER	0277
+CLOSED OPEN E, LATIN SMALL LETTER	029A
+closed reversed epsilon, latin small letter	025E
+CLOSED REVERSED OPEN E, LATIN SMALL LETTER	025E
+CLOSED SUBSET	2ACF
+CLOSED SUBSET OR EQUAL TO	2AD1
+CLOSED SUPERSET	2AD0
+CLOSED SUPERSET OR EQUAL TO	2AD2
+CLOSED UNION WITH SERIFS	2A4C
+CLOSED UNION WITH SERIFS AND SMASH PRODUCT	2A50
+closing brace	007D
+closing curly bracket	007D
+CLOSING MARK, IDEOGRAPHIC	3006
+closing parenthesis	0029
+closing square bracket	005D
+CLOUD	2601
+cloudy weather	2601
+Codes, Process Internal	FDD0
+coffee	2615
+COLON	003A
+COLON, ETHIOPIC	1365
+COLON, MODIFIER LETTER HALF TRIANGULAR	02D1
+COLON, MODIFIER LETTER TRIANGULAR	02D0
+COLON, MONGOLIAN	1804
+COLON, Z NOTATION TYPE	2982
+COLON EQUAL, DOUBLE	2A74
+COLON EQUALS	2254
+COLON OPERATOR, TRIPLE	2AF6
+colon right arrow	29F4
+COLON SIGN	20A1
+COMBINING ACUTE ACCENT	0301
+COMBINING ACUTE ACCENT BELOW	0317
+COMBINING ACUTE TONE MARK	0341
+COMBINING ALMOST EQUAL TO ABOVE	034C
+Combining Alphabet, Korean Hangul Jamo	1100
+COMBINING ANNUITY SYMBOL	20E7
+COMBINING BREVE	0306
+COMBINING BREVE BELOW	032E
+COMBINING BRIDGE ABOVE	0346
+COMBINING BRIDGE BELOW	032A
+COMBINING CANDRABINDU	0310
+COMBINING CARON	030C
+COMBINING CARON BELOW	032C
+COMBINING CEDILLA	0327
+Combining Characters, Cyrillic	0483
+COMBINING CIRCUMFLEX ACCENT	0302
+COMBINING CIRCUMFLEX ACCENT BELOW	032D
+COMBINING CLOCKWISE ARROW ABOVE	20D5
+COMBINING CLOCKWISE RING OVERLAY	20D9
+COMBINING COMMA ABOVE	0313
+COMBINING COMMA ABOVE RIGHT	0315
+COMBINING COMMA BELOW	0326
+Combining Diacritical Marks	0300
+Combining Diacritical Marks for Symbols	20D0
+COMBINING DIAERESIS	0308
+COMBINING DIAERESIS BELOW	0324
+COMBINING DOT ABOVE	0307
+COMBINING DOT BELOW	0323
+COMBINING DOUBLE ACUTE ACCENT	030B
+COMBINING DOUBLE GRAVE ACCENT	030F
+COMBINING DOUBLE INVERTED BREVE	0361
+COMBINING DOUBLE LOW LINE	0333
+COMBINING DOUBLE OVERLINE	033F
+COMBINING DOUBLE RIGHTWARDS ARROW BELOW	0362
+COMBINING DOUBLE TILDE	0360
+COMBINING DOUBLE TILDE LEFT HALF	FE22
+COMBINING DOUBLE VERTICAL LINE ABOVE	030E
+COMBINING DOUBLE VERTICAL LINE BELOW	0348
+COMBINING DOUBLE VERTICAL STROKE OVERLAY	20E6
+COMBINING DOWN TACK BELOW	031E
+COMBINING ENCLOSING CIRCLE	20DD
+COMBINING ENCLOSING CIRCLE BACKSLASH	20E0
+COMBINING ENCLOSING DIAMOND	20DF
+COMBINING ENCLOSING KEYCAP	20E3
+COMBINING ENCLOSING SCREEN	20E2
+COMBINING ENCLOSING SQUARE	20DE
+COMBINING ENCLOSING UPWARD POINTING TRIANGLE	20E4
+COMBINING EQUALS SIGN BELOW	0347
+COMBINING FOUR DOTS ABOVE	20DC
+COMBINING GRAPHEME JOINER	034F
+COMBINING GRAVE ACCENT	0300
+COMBINING GRAVE ACCENT BELOW	0316
+COMBINING GRAVE TONE MARK	0340
+COMBINING GREEK DIALYTIKA TONOS	0344
+COMBINING GREEK KORONIS	0343
+COMBINING GREEK PERISPOMENI	0342
+COMBINING GREEK YPOGEGRAMMENI	0345
+combining hacek	030C
+Combining Half Marks	FE20
+COMBINING HOMOTHETIC ABOVE	034B
+COMBINING HOOK ABOVE	0309
+COMBINING HORN	031B
+COMBINING INVERTED BREVE	0311
+COMBINING INVERTED BREVE BELOW	032F
+COMBINING INVERTED BRIDGE BELOW	033A
+COMBINING INVERTED DOUBLE ARCH BELOW	032B
+COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK	3099
+Combining Latin Small Letters	0363
+COMBINING LEFT ANGLE ABOVE	031A
+COMBINING LEFT ANGLE BELOW	0349
+COMBINING LEFT ARROW ABOVE	20D6
+COMBINING LEFT HALF RING BELOW	031C
+COMBINING LEFT HARPOON ABOVE	20D0
+COMBINING LEFT RIGHT ARROW ABOVE	20E1
+COMBINING LEFT RIGHT ARROW BELOW	034D
+COMBINING LEFT TACK BELOW	0318
+COMBINING LEFTWARDS ARROW OVERLAY	20EA
+COMBINING LIGATURE LEFT HALF	FE20
+COMBINING LONG SOLIDUS OVERLAY	0338
+COMBINING LONG STROKE OVERLAY	0336
+COMBINING LONG VERTICAL LINE OVERLAY	20D2
+COMBINING LOW LINE	0332
+COMBINING MACRON	0304
+COMBINING MACRON BELOW	0331
+COMBINING MINUS SIGN BELOW	0320
+COMBINING NOT TILDE ABOVE	034A
+COMBINING OGONEK	0328
+COMBINING OVERLINE	0305
+COMBINING PALATALIZED HOOK BELOW	0321
+COMBINING PLUS SIGN BELOW	031F
+COMBINING RETROFLEX HOOK BELOW	0322
+COMBINING REVERSE SOLIDUS OVERLAY	20E5
+COMBINING REVERSED COMMA ABOVE	0314
+COMBINING RIGHT HALF RING BELOW	0339
+COMBINING RING ABOVE	030A
+COMBINING RING BELOW	0325
+COMBINING RING OVERLAY	20D8
+COMBINING SEAGULL BELOW	033C
+COMBINING SHORT SOLIDUS OVERLAY	0337
+COMBINING SHORT STROKE OVERLAY	0335
+COMBINING SHORT VERTICAL LINE OVERLAY	20D3
+COMBINING SQUARE BELOW	033B
+COMBINING THREE DOTS ABOVE	20DB
+COMBINING TILDE	0303
+COMBINING TILDE BELOW	0330
+COMBINING TILDE OVERLAY	0334
+COMBINING TRIPLE UNDERDOT	20E8
+COMBINING TURNED COMMA ABOVE	0312
+COMBINING UP TACK BELOW	031D
+COMBINING UPWARDS ARROW BELOW	034E
+COMBINING VERTICAL LINE ABOVE	030D
+COMBINING VERTICAL LINE BELOW	0329
+COMBINING VERTICAL TILDE	033E
+COMBINING WIDE BRIDGE ABOVE	20E9
+COMBINING X ABOVE	033D
+COMET	2604
+COMMA	002C
+COMMA, ARABIC	060C
+COMMA, ARMENIAN	055D
+COMMA, ETHIOPIC	1363
+comma, georgian	00B7
+COMMA, IDEOGRAPHIC	3001
+comma, invisible	2063
+COMMA, MODIFIER LETTER REVERSED	02BD
+COMMA, MODIFIER LETTER TURNED	02BB
+COMMA, MONGOLIAN	1802
+COMMA ABOVE, COMBINING	0313
+COMMA ABOVE, COMBINING REVERSED	0314
+COMMA ABOVE, COMBINING TURNED	0312
+COMMA ABOVE, MINUS SIGN WITH	2A29
+COMMA ABOVE RIGHT, COMBINING	0315
+COMMA BELOW, COMBINING	0326
+comma quotation mark, double	201D
+comma quotation mark, double reversed	201F
+comma quotation mark, double turned	201C
+comma quotation mark, low double	201E
+comma quotation mark, low single	201A
+comma quotation mark, single	2019
+comma quotation mark, single reversed	201B
+comma quotation mark, single turned	2018
+command, application program	009F
+command, operating system	009D
+command key	2318
+COMMERCIAL AT	0040
+COMMERCIAL MINUS SIGN	2052
+compass	263C
+Compatibility, CJK	3300
+Compatibility and Specials Area	F900
+Compatibility Forms, CJK	FE30
+Compatibility Ideographs, CJK	F900
+Compatibility Ideographs, IBM CJK	FA0E
+Compatibility Jamo, Korean Hangul	3130
+COMPLEMENT	2201
+complex numbers, the set of	2102
+component, radial	27DF
+Components, Form and Chart	2500
+composite function	2218
+COMPOSITION, Z NOTATION RELATIONAL	2A3E
+COMPOSITION, Z NOTATION SCHEMA	2A1F
+composition circle, jis	20DD
+COMPOSITION SYMBOL	2384
+concatenation, z notation sequence	2040
+CONCAVE-SIDED DIAMOND, WHITE	27E1
+CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK, WHITE	27E2
+CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK, WHITE	27E3
+conductance	2127
+CONGRUENT WITH DOT ABOVE	2A6D
+CONICAL TAPER	2332
+CONJUGATE MATRIX, HERMITIAN	22B9
+conjunction	2227
+CONJUNCTION	260C
+CONSECUTIVE EQUALS SIGNS, THREE	2A76
+CONSECUTIVE EQUALS SIGNS, TWO	2A75
+consonant for Addu dialect	0780
+CONTAINS AS MEMBER	220B
+CONTAINS AS MEMBER, SMALL	220D
+CONTAINS AS NORMAL SUBGROUP	22B3
+CONTAINS WITH LONG HORIZONTAL STROKE	22FA
+CONTAINS WITH OVERBAR	22FD
+CONTAINS WITH OVERBAR, SMALL	22FE
+CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE	22FB
+CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE, SMALL	22FC
+continuity, absolute	2AA1
+CONTINUOUS UNDERLINE SYMBOL	2381
+continuum, second transfinite cardinal	2136
+CONTOUR INTEGRAL	222E
+CONTOUR INTEGRAL, CLOCKWISE	2232
+CONTOURED OUTLINE, SQUARE WITH	29E0
+contraction operator	20E9
+control, graphic for	2388
+Control, Syriac Format	070F
+Control Code Graphics	25F0
+Control Codes, ASCII C0	0000
+Control Codes, C1	0080
+Control Codes, Graphic Pictures for	2400
+Control Codes, Graphics for	237B
+control sequence introducer	009B
+control string, device	0090
+Controls, Bidirectional Formatting	202A
+Controls, Mongolian Format	180B
+Controls and Basic Latin, C0	0000
+Controls and Latin-1 Supplement, C1	0080
+COPRODUCT, AMALGAMATION OR	2A3F
+COPRODUCT, N-ARY	2210
+Coptic, Greek and	0370
+Coptic-unique Letters	03E2
+COPYRIGHT, SOUND RECORDING	2117
+COPYRIGHT SIGN	00A9
+CORNER, TOP LEFT	231C
+CORNER BRACKET, LEFT	300C
+CORNER BRACKET, LEFT WHITE	300E
+Corner brackets	2308
+Corner brackets, CJK	300C
+CORNER WITH DOT, LOWER RIGHT	27D3
+CORNER WITH DOT, UPPER LEFT	27D4
+corners, Quine	231C
+CORPORATION, SQUARE	337F
+CORRESPONDS TO	2258
+corresponds to	2259
+costa rican currency	20A1
+countable, first transfinite cardinal	2135
+COUNTERBORE	2334
+COUNTERSINK	2335
+cr	000D
+CRESCENT, STAR AND	262A
+Croatian, Additions for Slovenian and	0200
+Croatian Digraphs Matching Serbian Cyrillic Letters	01C4
+CROP, TOP LEFT	230F
+CROSS, EAST SYRIAC	2671
+CROSS, LATIN	271D
+cross, long	2020
+CROSS, MALTESE	2720
+CROSS, ORTHODOX	2626
+cross, st. andrew's	2613
+CROSS, WEST SYRIAC	2670
+CROSS ACCENT, MODIFIER LETTER	02DF
+Cross Dingbats	2719
+CROSS OF JERUSALEM	2629
+CROSS OF LORRAINE	2628
+CROSS PRODUCT, VECTOR OR	2A2F
+cross ratio	211E
+CROSSBONES, SKULL AND	2620
+crosshatch	0023
+CRUZEIRO SIGN	20A2
+CUBE ROOT	221B
+cubed	00B3
+cup	222A
+CUP, SQUARE	2294
+curly bracket, closing	007D
+CURLY BRACKET, LEFT	007B
+curly bracket, opening	007B
+CURLY BRACKET, RIGHT	007D
+CURLY LOGICAL AND	22CF
+CURLY LOGICAL OR	22CE
+currency, brazilian	20A2
+currency, costa rican	20A1
+currency, el salvadorian	20A1
+currency, euro european	20AC
+currency, french	20A3
+currency, greek	20AF
+currency, hebrew	20AA
+currency, indian	20A8
+currency, iranian	FDFC
+currency, israeli	20AA
+currency, italian	20A4
+currency, korean	20A9
+currency, laotian	20AD
+currency, mongolian	20AE
+currency, nigerian	20A6
+currency, phillipine	20B1
+currency, spanish	20A7
+currency, turkish	20A4
+currency, vietnamese	20AB
+CURRENCY SIGN	00A4
+Currency Signs, Bengali	09F2
+currency symbol, florin	0192
+CURRENCY SYMBOL BAHT, THAI	0E3F
+Currency Symbols	20A0
+current, alternating	223F
+CURRENT SYMBOL FORM TWO, DIRECT	2393
+cycle	223C
+CYLINDRICITY	232D
+Cypriot Syllabary	10800
+Cyrillic	0400
+Cyrillic, Extended	048C
+Cyrillic Capital Letters	0401
+Cyrillic Combining Characters	0483
+Cyrillic Extensions	0450
+Cyrillic Historic Letters	0460
+Cyrillic Komi Letters	0500
+Cyrillic Small Letters	0430
+Cyrillic Supplementary	0500
+D, COMBINING LATIN SMALL LETTER	0369
+D, DOUBLE-STRUCK ITALIC CAPITAL	2145
+D, DOUBLE-STRUCK ITALIC SMALL	2146
+D, LATIN CAPITAL LETTER AFRICAN	0189
+d retroflex hook, latin small letter	0256
+D WITH TAIL, LATIN SMALL LETTER	0256
+DAGGER	2020
+DAGGER, DOUBLE	2021
+d'alembertian	29E0
+DALET SYMBOL	2138
+DANDA, DEVANAGARI	0964
+DANDA, DEVANAGARI DOUBLE	0965
+dash, angled	00AC
+DASH, CIRCLED	229D
+DASH, EM	2014
+DASH, EN	2013
+DASH, FIGURE	2012
+dash, long	2015
+dash, quotation	2015
+DASH, SWUNG	2053
+DASH, WAVE	301C
+DASH, WAVY	3030
+DASHED LOW LINE	FE4D
+DASHED OVERLINE	FE49
+Dashes	2010
+dasia	0314
+data link escape	0010
+DATA LINK ESCAPE, SYMBOL FOR	2410
+Database Theory Operators	27D5
+DAVID, STAR OF	2721
+Days, Telegraph Symbols for	33E0
+DAY SIGN, TAMIL	0BF3
+decimal point	002E
+decimal separator	002C
+DECIMAL SEPARATOR, ARABIC	066B
+DECIMAL SEPARATOR KEY SYMBOL	2396
+deergh viram	0965
+definition, equal to by	225C
+DEFINITION, EQUAL TO BY	225D
+DEGREE CELSIUS	2103
+DEGREE FAHRENHEIT	2109
+DEGREE SIGN	00B0
+degrees centigrade	2103
+degrees kelvin	212A
+del	2207
+delete	007F
+DELETE, SYMBOL FOR	2421
+delete, undoable	2425
+DELETE FORM TWO, SYMBOL FOR	2425
+delete to the left key	232B
+delete to the right key	2326
+DELIMITER, TRIPLE VERTICAL BAR	2980
+DELTA, LATIN SMALL LETTER TURNED	018D
+DELTA EQUAL TO	225C
+DENTAL CLICK, LATIN LETTER	01C0
+Dentistry Notation Symbols	23BE
+depth symbol	21A7
+derivative	0307
+derivative, double	0308
+derivative, fourth	20DC
+derivative, third	20DB
+DESCENDING NODE	260B
+Description Characters, Ideographic	2FF0
+Devanagari	0900
+DEVANAGARI DANDA	0964
+Devanagari Digits	0966
+DEVANAGARI DOUBLE DANDA	0965
+Devanagari Letters	0905
+DEVANAGARI OM	0950
+device control four	0014
+DEVICE CONTROL FOUR, SYMBOL FOR	2414
+device control one	0011
+DEVICE CONTROL ONE, SYMBOL FOR	2411
+device control string	0090
+device control three	0013
+DEVICE CONTROL THREE, SYMBOL FOR	2413
+device control two	0012
+DEVICE CONTROL TWO, SYMBOL FOR	2412
+DHARMA, WHEEL OF	2638
+Diacritic-vowel Combinations, Pinyin	01CD
+Diacritical Marks, Combining	0300
+Diacritical Marks for Symbols, Combining	20D0
+Diacritics, Double	0360
+Diacritics, Enclosing	20DD
+Diacritics, Medieval Superscript Letter	0363
+Diacritics, Overstruck	0334
+Diacritics, Spacing Clones of	02D8
+Diacritics for Greek	0342
+Diacritics for IPA	0346
+DIAERESIS	00A8
+DIAERESIS, COMBINING	0308
+diaeresis, greek capital letter upsilon hook	03D4
+diaeresis, spacing	00A8
+DIAERESIS AND HOOK SYMBOL, GREEK UPSILON WITH	03D4
+DIAERESIS BELOW, COMBINING	0324
+DIAGONAL ELLIPSIS, UP RIGHT	22F0
+DIAGONAL SLASH, SQUARED FALLING	29C5
+DIAGONAL SLASH, SQUARED RISING	29C4
+dialytika	0308
+DIALYTIKA TONOS, COMBINING GREEK	0344
+DIAMETER SIGN	2300
+diameter symbol	2205
+DIAMOND, COMBINING ENCLOSING	20DF
+DIAMOND, WHITE CONCAVE-SIDED	27E1
+DIAMOND OPERATOR	22C4
+DIAMOND WITH CENTRED DOT, WHITE	27D0
+DIAMOND WITH DOWN ARROW, BLACK	29EA
+DIAMOND WITH LEFTWARDS TICK, WHITE CONCAVE-SIDED	27E2
+DIAMOND WITH RIGHTWARDS TICK, WHITE CONCAVE-SIDED	27E3
+Diamonds	25C6
+Dice	2680
+diesis	2021
+difference, backward	2207
+difference, forward	2206
+difference, sum or positive 	2A26
+difference, symmetric	2238
+difference, symmetric	2296
+difference between	223C
+DIFFERENCE BETWEEN	224F
+difference or sum, positive	2A24
+DIFFERENTIAL, PARTIAL	2202
+DIGIT SHAPES, NATIONAL	206E
+DIGIT SHAPES, NOMINAL	206F
+Digits, Arabic-Indic	0660
+Digits, ASCII	0030
+Digits, Bengali	09E6
+Digits, Devanagari	0966
+Digits, Dingbat Circled	2776
+Digits, Ethiopic	1369
+Digits, Gujarati	0AE6
+Digits, Gurmukhi	0A66
+Digits, Kannada	0CE6
+Digits, Khmer	17E0
+Digits, Lao	0ED0
+Digits, Malayalam	0D66
+Digits, Mongolian	1810
+Digits, Myanmar	1040
+Digits, Oriya	0B66
+Digits, Osmanya	104A0
+Digits, Subscript	2080
+Digits, Superscript	2070
+Digits, Tamil	0BE7
+Digits, Telugu	0C66
+Digits, Thai	0E50
+Digits, Tibetan	0F20
+Digits for Persian and Urdu, Eastern Arabic-Indic	06F0
+DIGRAPH KOTO, KATAKANA	30FF
+DIGRAPH YORI, HIRAGANA	309F
+Digraphs, Phonetic	02A3
+Digraphs, Yiddish	05F0
+Digraphs Matching Serbian Cyrillic Letters, Croatian	01C4
+Digram Symbols, Yijing Monogram and	268A
+Digram Symbols, Tai Xuan Jing	1D301
+dijkstra choice	2AFE
+dijkstra choice, n-ary	2AFF
+DIMENSION ORIGIN	2331
+Dingbat Circled Digits	2776
+Dingbats	2700
+Dingbats, Arrow	2794
+Dingbats, Asterisk	2722
+Dingbats, Cross	2719
+Dingbats, Drop-Shadowed	274D
+Dingbats, Hazard	2620
+Dingbats, Heart	2763
+Dingbats, Miscellaneous	2600
+Dingbats, Music	2669
+Dingbats, Pencil	270E
+Dingbats, Pointing Index Finger	261A
+Dingbats, Quotation Mark	275B
+Dingbats, Scissors	2701
+Dingbats, Snowflake	2744
+Dingbats, Star	2726
+Dingbats, Vertical Bar	2758
+Dingbats, Warning	2620
+Dingbats, Weather	2600
+Dingbats, Zapf	2700
+Dingbats Series 100, ITC Zapf	2700
+DIRECT CURRENT SYMBOL FORM TWO	2393
+direct product	2299
+direct sum	2295
+DIRECTIONAL FORMATTING, POP	202C
+Directional Formatting Controls	202A
+DISCONTINUOUS UNDERLINE SYMBOL	2382
+discretionary hyphen	00AD
+disjunction	2228
+DITTO MARK	3003
+DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR, CIRCLE	29BA
+DIVIDED BY HORIZONTAL RULE, LOZENGE	27E0
+DIVIDED BY VERTICAL BAR, CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF	29BA
+DIVIDES	2223
+Divination Lore, Khmer Symbols for	17F0
+DIVISION SIGN	00F7
+DIVISION SIGN, CIRCLED	2A38
+DIVISION SIGN, CIRCLED ANTICLOCKWISE-ROTATED	29BC
+Division Sign Operators, Multiplication and	2A2F
+DIVISION SLASH	2215
+DIVISION SLASH, CIRCLED	2298
+DIVISION TIMES	22C7
+DOES NOT DIVIDE WITH REVERSED NEGATION SLASH	2AEE
+does not yield	22A3
+DOLLAR SIGN	0024
+DOMAIN ANTIRESTRICTION, Z NOTATION	2A64
+DONG SIGN	20AB
+dot	002E
+DOT, AEGEAN LINE SEPARATOR	10101
+dot, greek middle	00B7
+DOT, KATAKANA MIDDLE	30FB
+DOT, MIDDLE	00B7
+DOT, SESAME	FE45
+DOT, WHITE SESAME	FE46
+DOT ABOVE	02D9
+DOT ABOVE, COMBINING	0307
+dot above, double	0308
+DOT ABOVE, LATIN CAPITAL LETTER I WITH	0130
+DOT BELOW, COMBINING	0323
+DOT MINUS	2238
+DOT OPERATOR	22C5
+DOT OPERATOR, CIRCLED	2299
+DOT OPERATOR, N-ARY CIRCLED	2A00
+DOT OPERATOR, SQUARED	22A1
+DOT PLUS	2214
+DOTLESS BEH, ARABIC LETTER	066E
+DOTLESS I, LATIN SMALL LETTER	0131
+DOTLESS QAF, ARABIC LETTER	066F
+DOTS ABOVE, COMBINING FOUR	20DC
+DOTS ABOVE, COMBINING THREE	20DB
+DOTTED CIRCLE	25CC
+DOTTED FENCE	2999
+DOUBLE ACUTE ACCENT	02DD
+DOUBLE ACUTE ACCENT, COMBINING	030B
+DOUBLE ANGLE BRACKET, LEFT	300A
+DOUBLE ANGLE QUOTATION MARK, LEFT-POINTING	00AB
+DOUBLE ANGLE QUOTATION MARK, RIGHT-POINTING	00BB
+DOUBLE APOSTROPHE, MODIFIER LETTER	02EE
+DOUBLE ARCH BELOW, COMBINING INVERTED	032B
+double bar, latin letter pipe	01C2
+DOUBLE CIRCLE, MULTIPLICATION SIGN IN	2A37
+Double Circled Numbers	24F5
+DOUBLE COLON EQUAL	2A74
+double comma quotation mark	201D
+double comma quotation mark, low	201E
+DOUBLE DAGGER	2021
+DOUBLE DANDA, DEVANAGARI	0965
+double derivative	0308
+Double Diacritics	0360
+double dot above	0308
+DOUBLE DOWN TACK	2AEA
+DOUBLE EXCLAMATION MARK	203C
+DOUBLE GRAVE ACCENT, COMBINING	030F
+DOUBLE HIGH-REVERSED-9 QUOTATION MARK	201F
+DOUBLE HYPHEN, KATAKANA-HIRAGANA	30A0
+DOUBLE INTEGRAL	222C
+DOUBLE INTERSECTION	22D2
+DOUBLE INVERTED BREVE, COMBINING	0361
+DOUBLE LEFT TURNSTILE, DOUBLE VERTICAL BAR	2AE5
+DOUBLE LEFT TURNSTILE, VERTICAL BAR	2AE4
+DOUBLE LOGICAL AND	2A53
+DOUBLE LOGICAL OR	2A54
+DOUBLE LOW LINE	2017
+DOUBLE LOW LINE, COMBINING	0333
+DOUBLE LOW-9 QUOTATION MARK	201E
+DOUBLE NESTED GREATER-THAN	2AA2
+DOUBLE NESTED LESS-THAN	2AA1
+DOUBLE NESTED LESS-THAN WITH UNDERBAR	2AA3
+double obelisk	2021
+DOUBLE OVERBAR, LOGICAL AND WITH	2A5E
+DOUBLE OVERBAR, LOGICAL OR WITH	2A62
+DOUBLE OVERLINE, COMBINING	033F
+double pipe	01C1
+DOUBLE PLUS	29FA
+DOUBLE PRECEDES	2ABB
+DOUBLE PRIME	2033
+DOUBLE PRIME, MODIFIER LETTER	02BA
+DOUBLE PRIME, REVERSED	2036
+DOUBLE PRIME QUOTATION MARK	301E
+DOUBLE PRIME QUOTATION MARK, LOW	301F
+DOUBLE PRIME QUOTATION MARK, REVERSED	301D
+DOUBLE PUNCTUATION, PHILIPPINE	1736
+Double punctuation for vertical text	2047
+DOUBLE QUESTION MARK	2047
+DOUBLE QUOTATION MARK, LEFT	201C
+DOUBLE QUOTATION MARK, RIGHT	201D
+double reversed comma quotation mark	201F
+DOUBLE RIGHTWARDS ARROW BELOW, COMBINING	0362
+DOUBLE SOLIDUS OPERATOR	2AFD
+DOUBLE SQUARE INTERSECTION	2A4E
+DOUBLE SQUARE UNION	2A4F
+DOUBLE STROKE, INTEGRAL WITH	2A0E
+DOUBLE STROKE NOT SIGN	2AEC
+DOUBLE STROKE NOT SIGN, REVERSED	2AED
+DOUBLE SUBSET	22D0
+DOUBLE SUCCEEDS	2ABC
+DOUBLE SUPERSET	22D1
+DOUBLE TILDE, COMBINING	0360
+DOUBLE TILDE LEFT HALF, COMBINING	FE22
+double turned comma quotation mark	201C
+DOUBLE TURNSTILE, LEFT AND RIGHT	27DA
+DOUBLE UNDERBAR, LOGICAL AND WITH	2A60
+DOUBLE UNDERBAR, LOGICAL OR WITH	2A63
+double underline	0333
+double underscore	0333
+double underscore, spacing	2017
+DOUBLE UNION	22D3
+DOUBLE UP TACK	2AEB
+DOUBLE VERTICAL, LONG DASH FROM LEFT MEMBER OF	2AE6
+DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE	2AE5
+DOUBLE VERTICAL BAR LEFT TURNSTILE	2AE3
+DOUBLE VERTICAL LINE	2016
+DOUBLE VERTICAL LINE ABOVE, COMBINING	030E
+DOUBLE VERTICAL LINE BELOW, COMBINING	0348
+DOUBLE VERTICAL STROKE, RIGHTWARDS ARROW WITH TAIL WITH	2915
+DOUBLE VERTICAL STROKE, TRIPLE HORIZONTAL BAR WITH	2A68
+DOUBLE VERTICAL STROKE OVERLAY, COMBINING	20E6
+DOUBLE WAVY OVERLINE	FE4C
+DOUBLE WIGGLY FENCE, LEFT	29DA
+DOUBLE WIGGLY FENCE, RIGHT	29DB
+double-barred pipe	01C2
+DOUBLE-ENDED MULTIMAP	29DF
+DOUBLE-STRUCK CAPITAL C	2102
+DOUBLE-STRUCK CAPITAL H	210D
+DOUBLE-STRUCK CAPITAL N	2115
+DOUBLE-STRUCK CAPITAL P	2119
+DOUBLE-STRUCK CAPITAL Q	211A
+DOUBLE-STRUCK CAPITAL R	211D
+DOUBLE-STRUCK CAPITAL Z	2124
+Double-struck Greek Letters	213D
+Double-Struck Italic Mathematical Symbols	2145
+DOUBLE-STRUCK N-ARY SUMMATION	2140
+down, page	21DF
+DOWN TACK	22A4
+DOWN TACK BELOW, COMBINING	031E
+DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK	29E8
+DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK	29E9
+DRACHMA SIGN	20AF
+Drafting Symbols	232D
+dram	0292
+drop	264F
+Duplicates from Big 5	FA0C
+E, COMBINING LATIN SMALL LETTER	0364
+E, DOUBLE-STRUCK ITALIC SMALL	2147
+E, LATIN CAPITAL LETTER OPEN	0190
+E, LATIN CAPITAL LETTER REVERSED	018E
+e, latin capital letter turned	018E
+E, LATIN SMALL LETTER CLOSED OPEN	029A
+E, LATIN SMALL LETTER CLOSED REVERSED OPEN	025E
+E, LATIN SMALL LETTER OPEN	025B
+E, LATIN SMALL LETTER REVERSED	0258
+E, LATIN SMALL LETTER REVERSED OPEN	025C
+E, LATIN SMALL LETTER TURNED	01DD
+E, SCRIPT CAPITAL	2130
+E, SCRIPT SMALL	212F
+EARTH	2641
+Eastern Arabic-Indic Digits for Persian and Urdu	06F0
+ecu	20A0
+EIGHTH NOTE	266A
+EIGHTH NOTES, BEAMED	266B
+Eighths, Fractions	215B
+EJECT SYMBOL	23CF
+EK ONKAR, GURMUKHI	0A74
+el salvadorian currency	20A1
+ELECTRIC ARROW	2301
+electro-magnetic force, emf	2130
+electrolysis	21AF
+Electrotechnical Symbols from IR 181	238D
+element, unique	2129
+ELEMENT OF	2208
+ELEMENT OF, NOT AN	2209
+ELEMENT OF, SMALL	220A
+ELEMENT OF OPENING DOWNWARDS	2AD9
+ELEMENT OF OPENING UPWARDS	27D2
+ELEMENT OF WITH DOT ABOVE	22F5
+ELEMENT OF WITH LONG HORIZONTAL STROKE	22F2
+ELEMENT OF WITH OVERBAR	22F6
+ELEMENT OF WITH OVERBAR, SMALL	22F7
+ELEMENT OF WITH TWO HORIZONTAL STROKES	22F9
+ELEMENT OF WITH UNDERBAR	22F8
+ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE	22F3
+ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE, SMALL	22F4
+ell, mathematical symbol	2113
+ELLIPSIS, HORIZONTAL	2026
+ELLIPSIS, MIDLINE HORIZONTAL	22EF
+ELLIPSIS, UP RIGHT DIAGONAL	22F0
+ELLIPSIS, VERTICAL	22EE
+elliptic function, weierstrass	2118
+EM DASH	2014
+EM QUAD	2001
+EM SPACE	2003
+EMBEDDING, LEFT-TO-RIGHT	202A
+EMBEDDING, RIGHT-TO-LEFT	202B
+emf	2130
+EMPHASIS MARK, ARMENIAN	055B
+Emphasis Marks, Sidelining	FE45
+EMPHASIS SYMBOL	2383
+EMPTY SET	2205
+Empty Sets	29B0
+EN DASH	2013
+EN QUAD	2000
+EN SPACE	2002
+Enclosed Alphanumerics	2460
+Enclosed CJK Letters and Ideographs	3200
+ENCLOSING CIRCLE, COMBINING	20DD
+ENCLOSING CIRCLE BACKSLASH, COMBINING	20E0
+Enclosing Diacritics	20DD
+ENCLOSING DIAMOND, COMBINING	20DF
+ENCLOSING KEYCAP, COMBINING	20E3
+ENCLOSING SCREEN, COMBINING	20E2
+ENCLOSING SQUARE, COMBINING	20DE
+ENCLOSING UPWARD POINTING TRIANGLE, COMBINING	20E4
+end	21F2
+end of guarded area	0097
+end of medium	0019
+end of medium, graphic for	237F
+END OF MEDIUM, SYMBOL FOR	2419
+END OF PROOF	220E
+end of selected area	0087
+end of text	0003
+END OF TEXT, SYMBOL FOR	2403
+end of transmission	0004
+end of transmission, graphic for	2301
+END OF TRANSMISSION, SYMBOL FOR	2404
+end of transmission block	0017
+END OF TRANSMISSION BLOCK, SYMBOL FOR	2417
+ENG, LATIN SMALL LETTER	014B
+enotikon, greek	203F
+enquiry	0005
+ENQUIRY, SYMBOL FOR	2405
+enter key	2324
+ENTER SYMBOL	2386
+ENVELOPE	2709
+epsilon, latin capital letter	0190
+epsilon, latin small letter	025B
+epsilon, latin small letter closed	029A
+epsilon, latin small letter closed reversed	025E
+epsilon, reversed straight	03F6
+epsilon, reversed straight	220D
+epsilon, straight	03F5
+epsilon, straight	220A
+EPSILON SYMBOL, GREEK LUNATE	03F5
+EPSILON SYMBOL, GREEK REVERSED LUNATE	03F6
+EQUAL, DOUBLE COLON	2A74
+EQUAL, GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE	2A92
+EQUAL, GREATER-THAN ABOVE SIMILAR OR	2A8E
+EQUAL, GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED	2A94
+EQUAL, GREATER-THAN CLOSED BY CURVE ABOVE SLANTED	2AA9
+EQUAL, LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE	2A91
+EQUAL, LESS-THAN ABOVE SIMILAR OR	2A8D
+EQUAL, LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED	2A93
+EQUAL, LESS-THAN CLOSED BY CURVE ABOVE SLANTED	2AA8
+EQUAL ABOVE GREATER-THAN, LESS-THAN ABOVE DOUBLE-LINE	2A8B
+EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL, LESS-THAN ABOVE SLANTED	2A93
+EQUAL ABOVE LESS-THAN, GREATER-THAN ABOVE DOUBLE-LINE	2A8C
+EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL, GREATER-THAN ABOVE SLANTED	2A94
+EQUAL OR EQUAL TO, APPROXIMATELY	2A70
+EQUAL TO, ALL	224C
+EQUAL TO, ALMOST	2248
+EQUAL TO, APPROXIMATELY	2245
+equal to, approximately	2257
+EQUAL TO, APPROXIMATELY EQUAL OR	2A70
+EQUAL TO, ASYMPTOTICALLY	2243
+EQUAL TO, CLOSED SUBSET OR	2AD1
+EQUAL TO, CLOSED SUPERSET OR	2AD2
+EQUAL TO, DELTA	225C
+EQUAL TO, DOUBLE-LINE SLANTED GREATER-THAN OR	2AFA
+EQUAL TO, DOUBLE-LINE SLANTED LESS-THAN OR	2AF9
+EQUAL TO, GEOMETRICALLY	2251
+EQUAL TO, GREATER-THAN AND SINGLE-LINE NOT	2A88
+EQUAL TO, GREATER-THAN OR	2265
+EQUAL TO, GREATER-THAN OR SLANTED	2A7E
+EQUAL TO, LARGER THAN OR	2AAD
+EQUAL TO, LESS-THAN AND SINGLE-LINE NOT	2A87
+EQUAL TO, LESS-THAN OR	2264
+EQUAL TO, LESS-THAN OR SLANTED	2A7D
+EQUAL TO, NOT	2260
+EQUAL TO, PRECEDES ABOVE ALMOST	2AB7
+EQUAL TO, PRECEDES ABOVE NOT	2AB5
+EQUAL TO, PRECEDES ABOVE NOT ALMOST	2AB9
+EQUAL TO, PRECEDES ABOVE SINGLE-LINE NOT	2AB1
+EQUAL TO, QUESTIONED	225F
+EQUAL TO, RING	2257
+EQUAL TO, RING IN	2256
+EQUAL TO, SMALLER THAN OR	2AAC
+EQUAL TO, SUBSET OF ABOVE ALMOST	2AC9
+EQUAL TO, SUBSET OF ABOVE NOT	2ACB
+EQUAL TO, SUCCEEDS ABOVE ALMOST	2AB8
+EQUAL TO, SUCCEEDS ABOVE NOT	2AB6
+EQUAL TO, SUCCEEDS ABOVE NOT ALMOST	2ABA
+EQUAL TO, SUCCEEDS ABOVE SINGLE-LINE NOT	2AB2
+EQUAL TO, SUPERSET OF ABOVE ALMOST	2ACA
+EQUAL TO, SUPERSET OF ABOVE NOT	2ACC
+EQUAL TO ABOVE, COMBINING ALMOST	034C
+equal to by definition	225C
+EQUAL TO BY DEFINITION	225D
+EQUAL TO OR GREATER-THAN, DOUBLE-LINE	2A9A
+EQUAL TO OR GREATER-THAN, DOUBLE-LINE SLANTED	2A9C
+EQUAL TO OR GREATER-THAN, SLANTED	2A96
+EQUAL TO OR GREATER-THAN WITH DOT INSIDE, SLANTED	2A98
+EQUAL TO OR LESS-THAN, DOUBLE-LINE	2A99
+EQUAL TO OR LESS-THAN, DOUBLE-LINE SLANTED	2A9B
+EQUAL TO OR LESS-THAN, SLANTED	2A95
+EQUAL TO OR LESS-THAN WITH DOT INSIDE, SLANTED	2A97
+EQUAL TO WITH CIRCUMFLEX ACCENT, ALMOST	2A6F
+EQUAL TO WITH DOT ABOVE, GREATER-THAN OR SLANTED	2A82
+EQUAL TO WITH DOT ABOVE, LESS-THAN OR SLANTED	2A81
+EQUAL TO WITH DOT ABOVE, SUBSET OF OR	2AC3
+EQUAL TO WITH DOT ABOVE, SUPERSET OF OR	2AC4
+EQUAL TO WITH DOT ABOVE LEFT, GREATER-THAN OR SLANTED	2A84
+EQUAL TO WITH DOT ABOVE RIGHT, LESS-THAN OR SLANTED	2A83
+EQUAL TO WITH DOT INSIDE, GREATER-THAN OR SLANTED	2A80
+EQUAL TO WITH DOT INSIDE, LESS-THAN OR SLANTED	2A7F
+EQUALS, CIRCLED	229C
+EQUALS, REVERSED TILDE	22CD
+EQUALS, STAR	225B
+EQUALS COLON	2255
+EQUALS SIGN	003D
+EQUALS SIGN, PLUS SIGN ABOVE	2A72
+EQUALS SIGN, PRECEDES ABOVE	2AB3
+EQUALS SIGN, PRECEDES ABOVE SINGLE-LINE	2AAF
+EQUALS SIGN, SIMILAR ABOVE GREATER-THAN ABOVE	2AA0
+EQUALS SIGN, SIMILAR ABOVE LESS-THAN ABOVE	2A9F
+EQUALS SIGN, SUBSCRIPT	208C
+EQUALS SIGN, SUBSET OF ABOVE	2AC5
+EQUALS SIGN, SUCCEEDS ABOVE	2AB4
+EQUALS SIGN, SUCCEEDS ABOVE SINGLE-LINE	2AB0
+EQUALS SIGN, SUPERSCRIPT	207C
+EQUALS SIGN, SUPERSET OF ABOVE	2AC6
+EQUALS SIGN ABOVE PLUS SIGN	2A71
+EQUALS SIGN ABOVE TILDE OPERATOR	2A73
+EQUALS SIGN AND SLANTED PARALLEL	29E3
+EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE	29E4
+EQUALS SIGN BELOW, COMBINING	0347
+EQUALS SIGN WITH BUMPY ABOVE	2AAE
+EQUALS SIGN WITH DOT BELOW	2A66
+EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW	2A77
+EQUALS SIGNS, THREE CONSECUTIVE	2A76
+EQUALS SIGNS, TWO CONSECUTIVE	2A75
+EQUALS WITH ASTERISK	2A6E
+equiangular	225C
+EQUIANGULAR TO	225A
+equivalent, tautological	29E6
+EQUIVALENT TO	224D
+EQUIVALENT TO, GEOMETRICALLY	224E
+EQUIVALENT TO, STRICTLY	2263
+EQUIVALENT WITH FOUR DOTS ABOVE	2A78
+Era Names, Japanese	337B
+ERASE TO THE LEFT	232B
+ERASE TO THE RIGHT	2326
+error	212F
+Error Bar Symbols	29EE
+escape	001B
+escape, data link	0010
+ESCAPE, SYMBOL FOR	241B
+ESCAPE, SYMBOL FOR DATA LINK	2410
+escudo	0024
+ESH, LATIN CAPITAL LETTER	01A9
+ESH, LATIN SMALL LETTER	0283
+ESH, LATIN SMALL LETTER SQUAT REVERSED	0285
+ESH LOOP, LATIN LETTER REVERSED	01AA
+ESTIMATED SYMBOL	212E
+ESTIMATES	2259
+eszett	00DF
+ET, TIRONIAN SIGN	204A
+ETH, LATIN SMALL LETTER	00F0
+ethel	0153
+Ethiopic	1200
+ETHIOPIC COLON	1365
+ETHIOPIC COMMA	1363
+Ethiopic Digits	1369
+ETHIOPIC FULL STOP	1362
+ETHIOPIC QUESTION MARK	1367
+ETHIOPIC SEMICOLON	1364
+ETHIOPIC WORDSPACE	1361
+EULER CONSTANT	2107
+EURO SIGN	20AC
+European Latin	0100
+european paragraph sign	00A7
+european section sign	00B6
+EXCESS	2239
+EXCLAMATION MARK	0021
+EXCLAMATION MARK, ARMENIAN	055C
+EXCLAMATION MARK, DOUBLE	203C
+EXCLAMATION MARK, INVERTED	00A1
+exclamation mark, latin letter	01C3
+EXCLAMATION MARK, QUESTION	2048
+EXCLAMATION MARK ORNAMENT, HEAVY	2762
+EXCLAMATION QUESTION MARK	2049
+EXISTS, THERE	2203
+Extended Additional, Latin	1E00
+Extended Arabic	0671
+Extended Cyrillic	048C
+Extended for Minnan and Hakka, Chinese Bopomofo	31A0
+Extended Greek	1F00
+Extended-A, Latin	0100
+Extended-B, Latin	0180
+extension, arrows	23AF
+EXTENSION, HORIZONTAL LINE	23AF
+EXTENSION, INTEGRAL	23AE
+EXTENSION, VERTICAL LINE	23D0
+Extension A, CJK Unified Ideographs	3400
+Extensions, Cyrillic	0450
+Extensions, IPA	0250
+Extensions, Katakana Phonetic	31F0
+Extensions, Special Characters	23AE
+Extensions for Sanskrit and Tibetan, Mongolian	1880
+Extensions for Vietnamese, Latin	1EA0
+EZH, LATIN CAPITAL LETTER	01B7
+EZH, LATIN SMALL LETTER	0292
+EZH REVERSED, LATIN SMALL LETTER	01B9
+F, SCRIPT CAPITAL	2131
+F, TURNED CAPITAL	2132
+F WITH HOOK, LATIN SMALL LETTER	0192
+FACE, BLACK SMILING	263B
+FACE, POSTAL MARK	3020
+FACE, WHITE FROWNING	2639
+FACE, WHITE SMILING	263A
+FACSIMILE SIGN	213B
+factorial	0021
+FAHRENHEIT, DEGREE	2109
+FALLING DIAGONAL SLASH, SQUARED	29C5
+FALLING DOTS, MINUS SIGN WITH	2A2B
+feet	2032
+FEMALE SIGN	2640
+FEMININE ORDINAL INDICATOR	00AA
+FENCE, DOTTED	2999
+FENCE, LEFT DOUBLE WIGGLY	29DA
+FENCE, LEFT WIGGLY	29D8
+FENCE, RIGHT DOUBLE WIGGLY	29DB
+FENCE, RIGHT WIGGLY	29D9
+Fences	2999
+Fences	29D8
+Fifths, Fractions	2155
+FIGURE DASH	2012
+FIGURE SPACE	2007
+file separator	001C
+FILE SEPARATOR, SYMBOL FOR	241C
+Finger Dingbats, Pointing Index	261A
+finite function, z notation	20E6
+finite function, z notation	21FB
+finite injection, z notation	2915
+FINITE PART INTEGRAL	2A0D
+finite relation, z notation	21FC
+finite surjection, z notation	2901
+finite surjective injection, z notation	2918
+FIRST QUARTER MOON	263D
+first transfinite cardinal (countable)	2135
+Fish Tails	297C
+FISHEYE	25C9
+fist	261E
+FIVE, LATIN SMALL LETTER TONE	01BD
+FIVE POINTED STAR, ARABIC	066D
+FLAG, BLACK	2691
+FLAT SIGN, MUSIC	266D
+FLOOR, LEFT	230A
+FLORAL HEART BULLET, REVERSED ROTATED	2619
+florin currency symbol	0192
+folder	0192
+FOOT, SQUARE	23CD
+FOONOTE MARKER, ARABIC	0602
+FOR ALL	2200
+FORCES	22A9
+FORKING	2ADC
+Forks	2AD9
+Form and Chart Components	2500
+form feed	000C
+form feed	21A1
+FORM FEED, SYMBOL FOR	240C
+Format Control, Syriac	070F
+Format Controls, Mongolian	180B
+FORMATTING, POP DIRECTIONAL	202C
+Formatting Characters	200C
+Formatting Characters	2028
+Formatting Controls, Bidirectional	202A
+forward difference	2206
+FOUR DOTS ABOVE, COMBINING	20DC
+FOUR-PER-EM SPACE	2005
+fourier transform	2131
+fourth derivative	20DC
+FOURTH ROOT	221C
+fourth transfinite cardinal	2138
+Fourths, Fractions	00BC
+FRACTION NUMERATOR ONE	215F
+FRACTION ONE HALF, VULGAR	00BD
+FRACTION ONE QUARTER, VULGAR	00BC
+FRACTION SLASH	2044
+FRACTION THREE QUARTERS, VULGAR	00BE
+Fractions	2153
+FRAGMENT, ARABIC TAIL	FE73
+framus, white	29D6
+FRANC SIGN, FRENCH	20A3
+FRICATIVE, LATIN LETTER PHARYNGEAL VOICED	0295
+FROWN	2322
+FROWNING FACE, WHITE	2639
+FULL BLOCK	2588
+FULL OUTER JOIN	27D7
+FULL STOP	002E
+FULL STOP, ARABIC	06D4
+FULL STOP, ARMENIAN	0589
+FULL STOP, ETHIOPIC	1362
+full stop, georgian	0589
+FULL STOP, IDEOGRAPHIC	3002
+FULL STOP, MONGOLIAN	1803
+Fullwidth ASCII Variants	FF01
+Fullwidth Brackets	FF5F
+Fullwidth Forms, Halfwidth and	FF00
+Fullwidth Symbol Variants	FFE0
+FUNCTION, CIRCULATION	2A10
+function, gamma	0393
+function, z notation finite	20E6
+function, z notation finite	21FB
+function, z notation partial	21F8
+FUNCTION APPLICATION	2061
+function symbol	0192
+fvs	180B
+G, LATIN LETTER SMALL CAPITAL	0262
+G, LATIN SMALL LETTER SCRIPT	0261
+G, SCRIPT SMALL	210A
+G, TURNED SANS-SERIF CAPITAL	2141
+game	2141
+GAMMA, DOUBLE-STRUCK CAPITAL	213E
+GAMMA, DOUBLE-STRUCK SMALL	213D
+GAMMA, LATIN CAPITAL LETTER	0194
+GAMMA, LATIN SMALL LETTER	0263
+gamma, latin small letter baby	0264
+GAMMA, MODIFIER LETTER SMALL	02E0
+gamma function	0393
+GB 2312 (Chinese), Based on	3100
+GEMINI	264A
+General Punctuation	2000
+General Scripts Area	0000
+GENERIC MATERIALS, RECYCLING SYMBOL FOR	267A
+Generic punctuation for Philippine scripts	1735
+GEOMETRIC PROPORTION	223A
+Geometric Shapes	25A0
+GEOMETRICALLY EQUAL TO	2251
+GEOMETRICALLY EQUIVALENT TO	224E
+Georgian	10A0
+Georgian Capital Letters	10A0
+georgian comma	00B7
+georgian full stop	0589
+GEORGIAN PARAGRAPH SEPARATOR	10FB
+Georgian Small Letters	10D0
+german mark	2133
+GERMAN PENNY SIGN	20B0
+GETA MARK	3013
+GIMEL SYMBOL	2137
+GLEICH STARK	29E6
+glottal stop	02BC
+GLOTTAL STOP, LATIN LETTER	0294
+GLOTTAL STOP, LATIN LETTER INVERTED	0296
+glottal stop, latin letter reversed	0295
+GLOTTAL STOP, MODIFIER LETTER	02C0
+GLOTTAL STOP, MODIFIER LETTER REVERSED	02C1
+GLOTTAL STOP, MODIFIER LETTER SMALL REVERSED	02E4
+Go Markers	2686
+Golden Number Runes	16EE
+GRAPHEME JOINER, COMBINING	034F
+Graphic Characters, Terminal	23B7
+Graphic Characters, Terminal	2596
+Graphic Pictures for Control Codes	2400
+Graphics, Control Code	25F0
+Graphics, Scan Lines For Terminal	23BA
+Graphics for Control Codes	237B
+grave, spacing	0060
+GRAVE ACCENT	0060
+GRAVE ACCENT, COMBINING	0300
+GRAVE ACCENT, COMBINING DOUBLE	030F
+GRAVE ACCENT, DEVANAGARI	0953
+GRAVE ACCENT, MODIFIER LETTER	02CB
+GRAVE ACCENT, MODIFIER LETTER LOW	02CE
+grave accent, swedish	02DF
+GRAVE ACCENT BELOW, COMBINING	0316
+GRAVE TONE MARK, COMBINING	0340
+GREATER-THAN, CIRCLED	29C1
+GREATER-THAN, DOUBLE NESTED	2AA2
+GREATER-THAN, DOUBLE-LINE EQUAL TO OR	2A9A
+GREATER-THAN, DOUBLE-LINE SLANTED EQUAL TO OR	2A9C
+GREATER-THAN, LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE	2A8B
+GREATER-THAN, LESS-THAN ABOVE SIMILAR ABOVE	2A8F
+GREATER-THAN, MUCH	226B
+GREATER-THAN, SIMILAR OR	2A9E
+GREATER-THAN, SLANTED EQUAL TO OR	2A96
+GREATER-THAN, TRIPLE NESTED	2AF8
+GREATER-THAN, VERY MUCH	22D9
+GREATER-THAN ABOVE DOUBLE-LINE EQUAL, LESS-THAN ABOVE	2A91
+GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN	2A8C
+GREATER-THAN ABOVE EQUALS SIGN, SIMILAR ABOVE	2AA0
+GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL	2A92
+GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN	2A90
+GREATER-THAN ABOVE SIMILAR OR EQUAL	2A8E
+GREATER-THAN ABOVE SLANTED EQUAL, LESS-THAN ABOVE SLANTED EQUAL ABOVE	2A93
+GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL	2A94
+GREATER-THAN AND NOT APPROXIMATE	2A8A
+GREATER-THAN AND SINGLE-LINE NOT EQUAL TO	2A88
+GREATER-THAN BESIDE LESS-THAN	2AA5
+GREATER-THAN CLOSED BY CURVE	2AA7
+GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL	2AA9
+GREATER-THAN OR APPROXIMATE	2A86
+GREATER-THAN OR EQUAL TO	2265
+GREATER-THAN OR EQUAL TO, DOUBLE-LINE SLANTED	2AFA
+GREATER-THAN OR SLANTED EQUAL TO	2A7E
+GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE	2A82
+GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT	2A84
+GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE	2A80
+GREATER-THAN OVERLAPPING LESS-THAN	2AA4
+GREATER-THAN SIGN	003E
+GREATER-THAN WITH CIRCLE INSIDE	2A7A
+GREATER-THAN WITH DOT INSIDE, SLANTED EQUAL TO OR	2A98
+GREATER-THAN WITH QUESTION MARK ABOVE	2A7C
+Greek, Diacritics for	0342
+Greek, Extended	1F00
+Greek and Coptic	0370
+Greek Capital Letters	0391
+greek currency	20AF
+GREEK DIALYTIKA TONOS, COMBINING	0344
+greek enotikon	203F
+GREEK KORONIS, COMBINING	0343
+greek middle dot	00B7
+greek non-spacing iota below	0345
+GREEK PERISPOMENI, COMBINING	0342
+GREEK QUESTION MARK	037E
+GREEK SMALL LETTER IOTA, TURNED	2129
+Greek Small Letters	03B1
+Greek Symbols	03D0
+GREEK YPOGEGRAMMENI, COMBINING	0345
+group lock	21F0
+group separator	001D
+GROUP SEPARATOR, SYMBOL FOR	241D
+guarded area, end of	0097
+guarded area, start of	0096
+gui icons	231A
+guillemet, left pointing	00AB
+guillemet, left pointing single	2039
+guillemet, right pointing	00BB
+guillemet, right pointing single	203A
+Gujarati	0A80
+Gujarati Digits	0AE6
+Gujarati Letters	0A85
+GUJARATI RUPEE SIGN	0AF1
+Gurmukhi	0A00
+Gurmukhi Digits	0A66
+Gurmukhi Letters	0A05
+H, BLACK-LETTER CAPITAL	210C
+H, COMBINING LATIN SMALL LETTER	036A
+H, DOUBLE-STRUCK CAPITAL	210D
+H, LATIN LETTER SMALL CAPITAL	029C
+H, LATIN SMALL LETTER TURNED	0265
+H, MODIFIER LETTER SMALL	02B0
+H, SCRIPT CAPITAL	210B
+hacek, combining	030C
+hacek, modifier letter	02C7
+HAIR SPACE	200A
+Hakka, Chinese Bopomofo Extended for Minnan and	31A0
+halant, bengali	09CD
+halant, devanagari	094D
+HALF, COMBINING DOUBLE TILDE LEFT	FE22
+HALF, COMBINING LIGATURE LEFT	FE20
+HALF, VULGAR FRACTION ONE	00BD
+HALF CIRCLE, MULTIPLICATION SIGN IN LEFT	2A34
+HALF CIRCLE, MULTIPLICATION SIGN IN RIGHT	2A35
+HALF CIRCLE, PLUS SIGN IN LEFT	2A2D
+HALF CIRCLE, PLUS SIGN IN RIGHT	2A2E
+HALF FILL SPACE, IDEOGRAPHIC	303F
+HALF INTEGRAL, TOP	2320
+Half Marks, Combining	FE20
+HALF RING, MODIFIER LETTER CENTRED LEFT	02D3
+HALF RING, MODIFIER LETTER LEFT	02BF
+HALF RING BELOW, COMBINING LEFT	031C
+HALF RING BELOW, COMBINING RIGHT	0339
+HALF TRIANGULAR COLON, MODIFIER LETTER	02D1
+Halfwidth and Fullwidth Forms	FF00
+Halfwidth Japanese Katakana Variants	FF61
+Halfwidth Korean Hangul Variants	FFA0
+hamiltonian function	210B
+HAMMER AND SICKLE	262D
+Han Ideographs	4E00
+HAND, VICTORY	270C
+HAND, WRITING	270D
+Hand Symbols, Pointing	261A
+Hangul, Based on KS C 5601 (Korean)	3130
+HANGUL CHOSEONG FILLER	115F
+Hangul Compatibility Jamo, Korean	3130
+Hangul Elements, Circled Korean	3260
+Hangul Elements, Parenthesized Korean	3200
+HANGUL FILLER	3164
+Hangul Jamo Combining Alphabet, Korean	1100
+HANGUL JUNGSEONG FILLER	1160
+Hangul Syllables, Circled Korean	326E
+Hangul Syllables, Parenthesized Korean	320E
+Hangul Syllables Area, Korean	AC00
+Hangul Variants, Halfwidth Korean	FFA0
+Hangzhou-style Numerals	3021
+Hanunoo	1720
+HANUNOO SIGN PAMUDPOD	1734
+Hanunóo-specific punctuation	1734
+HARPOON ABOVE, COMBINING LEFT	20D0
+hasant	09CD
+hash	0023
+hat	0302
+hat	2229
+have a nice day!	263A
+Hazard Dingbats	2620
+heading, start of	0001
+HEADING, SYMBOL FOR START OF	2401
+Heart Ornaments	2763
+HEAVY BALLOT X	2718
+HEAVY CHECK MARK	2714
+HEAVY MULTIPLICATION X	2716
+Hebrew	0590
+Hebrew Cantillation Marks	0591
+hebrew currency	20AA
+Hebrew Letters	05D0
+Hebrew Points	05B0
+Hebrew Presentation Forms	FB1D
+HELM SYMBOL	2388
+HERMITIAN CONJUGATE MATRIX	22B9
+Hexagram Symbols, Yijing	4DC0
+hiding, z notation schema	29F9
+High Surrogates	D800
+HIGH VOLTAGE SIGN	26A1
+HIGH-REVERSED-9 QUOTATION MARK, DOUBLE	201F
+HIGH-REVERSED-9 QUOTATION MARK, SINGLE	201B
+higher rank than	227B
+hilbert space	210C
+Hiragana, Based on JIS X 0208 (Japanese)	3040
+HIRAGANA DIGRAPH YORI	309F
+HIRAGANA ITERATION MARK	309D
+histogram marker	25AE
+Historic Letters, Cyrillic	0460
+home	21B8
+home	21F1
+HOMOTHETIC	223B
+HOMOTHETIC ABOVE, COMBINING	034B
+Honorific Signs, Arabic	0610
+HOOK, MODIFIER LETTER RHOTIC	02DE
+hook, nasal	0328
+HOOK ABOVE, COMBINING	0309
+HOOK BELOW, COMBINING PALATALIZED	0321
+HOOK BELOW, COMBINING RETROFLEX	0322
+HORIZONTAL BAR	2015
+HORIZONTAL BAR, CIRCLE WITH	29B5
+HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE, TRIPLE	2A68
+HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE, TRIPLE	2A69
+HORIZONTAL ELLIPSIS	2026
+HORIZONTAL ELLIPSIS, MIDLINE	22EF
+HORIZONTAL LINE EXTENSION	23AF
+HORIZONTAL RULE, LOZENGE DIVIDED BY	27E0
+horizontal tabulation	0009
+HORIZONTAL TABULATION, SYMBOL FOR	2409
+HORN, COMBINING	031B
+HORN, LATIN SMALL LETTER RAMS	0264
+HOT BEVERAGE	2615
+HOT SPRINGS	2668
+HOURGLASS	231B
+HOURGLASS, BLACK	29D7
+HOURGLASS, WHITE	29D6
+Hours, Telegraph Symbols for	3358
+HOUSE	2302
+HV, LATIN SMALL LETTER	0195
+HWAIR, LATIN CAPITAL LETTER	01F6
+HYPHEN	2010
+HYPHEN, ARMENIAN	058A
+hyphen, discretionary	00AD
+HYPHEN, KATAKANA-HIRAGANA DOUBLE	30A0
+HYPHEN, NON-BREAKING	2011
+HYPHEN, SOFT	00AD
+HYPHEN BULLET	2043
+hyphen or minus sign	002D
+HYPHEN-MINUS	002D
+HYPHENATION POINT	2027
+hyphus	002D
+HYSTERESIS SYMBOL	238E
+I, BLACK-LETTER CAPITAL	2111
+I, COMBINING LATIN SMALL LETTER	0365
+I, DOUBLE-STRUCK ITALIC SMALL	2148
+I, LATIN LETTER SMALL CAPITAL	026A
+I, LATIN SMALL LETTER DOTLESS	0131
+I, SCRIPT CAPITAL	2110
+I, SUPERSCRIPT LATIN SMALL LETTER	2071
+I WITH DOT ABOVE, LATIN CAPITAL LETTER	0130
+IBM CJK Compatibility Ideographs	FA0E
+icons, gui	231A
+identical and parallel to	2A68
+IDENTICAL TO	2261
+IDENTICAL TO AND SLANTED PARALLEL	29E5
+IDENTICAL WITH DOT ABOVE	2A67
+Ideographic Annotation, Japanese Kanbun	3190
+IDEOGRAPHIC CLOSING MARK	3006
+IDEOGRAPHIC COMMA	3001
+Ideographic Description Characters	2FF0
+IDEOGRAPHIC FULL STOP	3002
+IDEOGRAPHIC HALF FILL SPACE	303F
+IDEOGRAPHIC ITERATION MARK	3005
+IDEOGRAPHIC ITERATION MARK, VERTICAL	303B
+IDEOGRAPHIC NUMBER ZERO	3007
+IDEOGRAPHIC SPACE	3000
+Ideographic Tone Marks	302A
+Ideographs, Circled	3280
+Ideographs, CJK Compatibility	F900
+Ideographs, CJK Unified	4E00
+Ideographs, Enclosed CJK Letters and	3200
+Ideographs, Han	4E00
+Ideographs, IBM CJK Compatibility	FA0E
+Ideographs, Parenthesized	3220
+Ideographs Area, CJK	3400
+Ideographs Extension A, CJK Unified	3400
+IDLE, SYMBOL FOR SYNCHRONOUS	2416
+idle, synchronous	0016
+IJ, LATIN SMALL LIGATURE	0133
+IMAGE OF	22B7
+IMAGE OF, SQUARE	228F
+imaginary part	2111
+implies	22A2
+inches	2033
+included in set	2282
+includes in set	2283
+INCOMPLETE INFINITY	29DC
+incorporated, japanese	337F
+INCREASES AS	29E1
+INCREMENT	2206
+independence	2AEB
+independent	2ADD
+independent, not	2ADC
+index	0084
+Index Finger Dingbats, Pointing	261A
+indian currency	20A8
+inferior order to, of	2134
+INFINITY	221E
+INFINITY, INCOMPLETE	29DC
+INFINITY, TIE OVER	29DD
+INFINITY NEGATED WITH VERTICAL BAR	29DE
+INFORMATION SOURCE	2139
+INHIBIT ARABIC FORM SHAPING	206C
+INHIBIT SYMMETRIC SWAPPING	206A
+injection, z notation finite	2915
+injection, z notation finite surjective	2918
+injection, z notation partial	2914
+injection, z notation surjective	2917
+INSERTION POINT, CARET	2041
+INSERTION SYMBOL	2380
+integers, the set of	2124
+INTEGRAL	222B
+INTEGRAL, CLOCKWISE	2231
+INTEGRAL, CLOCKWISE CONTOUR	2232
+INTEGRAL, CONTOUR	222E
+INTEGRAL, DOUBLE	222C
+integral, riemann	211B
+INTEGRAL, SURFACE	222F
+INTEGRAL, TOP HALF	2320
+INTEGRAL, TRIPLE	222D
+INTEGRAL, VOLUME	2230
+Integrals, Summations and	2A0A
+INTERCALATE	22BA
+INTERIOR PRODUCT	2A3C
+INTERIOR PRODUCT, RIGHTHAND	2A3D
+interleave	2AF4
+Interlinear Annotation	FFF9
+Internal Codes, Process	FDD0
+International Phonetic Alphabet	0250
+INTERROBANG	203D
+INTERSECTION	2229
+INTERSECTION, DOUBLE	22D2
+INTERSECTION, INTEGRAL WITH	2A19
+INTERSECTION, N-ARY	22C2
+intersection, proper	22D4
+INTERSECTION, TRANSVERSAL	2ADB
+INTERSECTION OPERATOR, N-ARY SQUARE	2A05
+INTERSECTION WITH DOT	2A40
+Intersections and Unions	2A40
+introducer, control sequence	009B
+introducer, single character	009A
+Inverse Numbers, Circled	2776
+INVERTED BREVE, COMBINING	0311
+INVERTED BREVE, COMBINING DOUBLE	0361
+INVERTED BREVE BELOW, COMBINING	032F
+INVERTED BRIDGE BELOW, COMBINING	033A
+INVERTED DOUBLE ARCH BELOW, COMBINING	032B
+INVERTED EXCLAMATION MARK	00A1
+INVERTED GLOTTAL STOP, LATIN LETTER	0296
+INVERTED LAZY S	223E
+INVERTED OHM SIGN	2127
+INVERTED QUESTION MARK	00BF
+INVERTED R, LATIN LETTER SMALL CAPITAL	0281
+INVERTED R, MODIFIER LETTER SMALL CAPITAL	02B6
+INVERTED UNDERTIE	2054
+Invisible Operators	2063
+IOTA, LATIN CAPITAL LETTER	0196
+IOTA, LATIN SMALL LETTER	0269
+IOTA, TURNED GREEK SMALL LETTER	2129
+iota below, greek non-spacing	0345
+IPA, Diacritics for	0346
+IPA Extensions	0250
+IR 181, Electrotechnical Symbols from	238D
+iran, symbol of	262B
+irish punt	00A3
+ISCII 1988 (Devanagari), Based on	0901
+ISO 8859-1 (Latin-1), Based on	00A0
+ISO 8859-2, -3, -4, -9 (European Latin), Based on	0100
+ISO 8859-5 (Cyrillic), Based on	0400
+ISO 8859-6 (Arabic), Based on	0600
+ISO 8859-7 (Greek), Based on	0370
+ISO 8859-8 (Hebrew), Based on	05D0
+ISO 9995-7, Keyboard Symbols from	2380
+ISO 9995-7, Keyboard Symbols from	2396
+israeli currency	20AA
+italian currency	20A4
+Italic Mathematical Symbols, Double-Struck	2145
+ITC Zapf Dingbats Series 100	2700
+ITERATION MARK, HIRAGANA	309D
+ITERATION MARK, IDEOGRAPHIC	3005
+ITERATION MARK, KATAKANA	30FD
+ITERATION MARK, VERTICAL IDEOGRAPHIC	303B
+ivy leaf	2767
+J, DOUBLE-STRUCK ITALIC SMALL	2149
+J, MODIFIER LETTER SMALL	02B2
+jack	2749
+Jamo, Korean Hangul Compatibility	3130
+Jamo Combining Alphabet, Korean Hangul	1100
+Japanese Chess Symbols	2616
+Japanese Era Names	337B
+Japanese Hiragana	3040
+japanese incorporated	337F
+JAPANESE INDUSTRIAL STANDARD SYMBOL	3004
+Japanese Kanbun (Ideographic Annotation)	3190
+Japanese Katakana	30A0
+Japanese Katakana, Circled	32D0
+Japanese Katakana Variants, Halfwidth	FF61
+Japanese Katakana Words, Squared	3300
+japanese kome	203B
+JERUSALEM, CROSS OF	2629
+jis composition circle	20DD
+JIS X 0208, Based on	3040
+JIS X 0213 Compatibility Ideographs	FA30
+JOIN	2A1D
+JOIN, FULL OUTER	27D7
+JOIN, LEFT OUTER	27D5
+JOIN, RIGHT OUTER	27D6
+JOINER, COMBINING GRAPHEME	034F
+JOINER, WORD	2060
+JOINER, ZERO WIDTH	200D
+jot, apl	2218
+JUPITER	2643
+justification, character tabulation with	0089
+K, LATIN SMALL LETTER TURNED	029E
+kabusiki-gaisya	337F
+Kana Repeat Marks	3031
+Kanbun (Ideographic Annotation), Japanese	3190
+Kangxi Radicals	2F00
+Kannada	0C80
+Kannada Digits	0CE6
+Kannada Letters	0C85
+Katakana, Circled Japanese	32D0
+Katakana, Japanese	30A0
+KATAKANA DIGRAPH KOTO	30FF
+KATAKANA ITERATION MARK	30FD
+KATAKANA MIDDLE DOT	30FB
+Katakana Phonetic Extensions	31F0
+Katakana Variants, Halfwidth Japanese	FF61
+Katakana Words, Squared Japanese	3300
+KATAKANA-HIRAGANA DOUBLE HYPHEN	30A0
+KATAKANA-HIRAGANA PROLONGED SOUND MARK	30FC
+KATAKANA-HIRAGANA VOICED SOUND MARK	309B
+KATAKANA-HIRAGANA VOICED SOUND MARK, COMBINING	3099
+KELVIN SIGN	212A
+ket	27E7
+key, clear	2327
+key, command	2318
+key, delete to the left	232B
+key, delete to the right	2326
+key, enter	2324
+KEY, OPTION	2325
+KEY SYMBOL, ALTERNATIVE	2387
+KEY SYMBOL, DECIMAL SEPARATOR	2396
+KEYBOARD	2328
+Keyboard Symbols	2324
+Keyboard Symbols from ISO 9995-7	2380
+Keyboard Symbols from ISO 9995-7	2396
+Keyboard and UI Symbols	23CE
+KEYCAP, COMBINING ENCLOSING	20E3
+Khmer	1780
+Khmer Digits	17E0
+Khmer Lunar Date Symbols	19E0
+Khmer Symbols	19E0
+Khmer Symbols for Divination Lore	17F0
+KIP SIGN	20AD
+kome, japanese	203B
+Komi Letters, Cyrillic	0500
+Koranic Annotation Signs	06D6
+korean currency	20A9
+Korean Hangul Compatibility Jamo	3130
+Korean Hangul Elements, Circled	3260
+Korean Hangul Elements, Parenthesized	3200
+Korean Hangul Jamo Combining Alphabet	1100
+Korean Hangul Syllables, Circled	326E
+Korean Hangul Syllables, Parenthesized	320E
+Korean Hangul Syllables Area	AC00
+Korean Hangul Variants, Halfwidth	FFA0
+KOREAN STANDARD SYMBOL	327F
+KORONIS, COMBINING GREEK	0343
+KOTO, KATAKANA DIGRAPH	30FF
+KRA, LATIN SMALL LETTER	0138
+KS C 5601 (Korean Hangul), Based on	3130
+L, LATIN LETTER SMALL CAPITAL	029F
+L, MODIFIER LETTER SMALL	02E1
+L, REVERSED SANS-SERIF CAPITAL	2143
+L, SCRIPT CAPITAL	2112
+L, SCRIPT SMALL	2113
+L, TURNED SANS-SERIF CAPITAL	2142
+L B BAR SYMBOL	2114
+L WITH MIDDLE DOT, LATIN SMALL LETTER	0140
+L WITH MIDDLE TILDE, LATIN SMALL LETTER	026B
+lambda bar, latin letter	019B
+Lao	0E80
+Lao Digits	0ED0
+Lao Letters	0E81
+laotian currency	20AD
+laplace operator	2206
+laplace operator	2207
+laplace symbol	2112
+LARGE AND, SLOPING	2A58
+large bowtie	2A1D
+LARGE DOWN TACK	27D9
+LARGE LEFT TRIANGLE OPERATOR	2A1E
+LARGE OR, SLOPING	2A57
+LARGE TRIPLE VERTICAL BAR OPERATOR	2AFC
+LARGE UP TACK	27D8
+LARGER THAN	2AAB
+LARGER THAN OR EQUAL TO	2AAD
+LAST QUARTER MOON	263E
+LATERAL CLICK, LATIN LETTER	01C1
+Latin, Based on ISO 8859-2, -3, -4, -9 (European)	0100
+Latin, C0 Controls and Basic	0000
+Latin, European	0100
+Latin Abbreviations, Squared	3371
+LATIN CAPITAL LETTER N WITH LONG RIGHT LEG	0220
+Latin Capital Letters	0041
+LATIN CROSS	271D
+Latin Extended Additional	1E00
+Latin Extended-A	0100
+Latin Extended-B	0180
+Latin Extensions for Vietnamese	1EA0
+Latin Letters, Circled	24B6
+Latin Letters, Parenthesized	249C
+Latin Letters, Phonetic Modifiers Derived from	02B0
+Latin Ligatures	FB00
+Latin Small Letters	0061
+Latin Small Letters, Combining	0363
+Latin-1, ISO 8859-1 aka	00A0
+Latin-1 Supplement, C1 Controls and	0080
+lazy s	223D
+LAZY S, INVERTED	223E
+LEADER, ONE DOT	2024
+leader, three dot	2026
+LEADER, TWO DOT	2025
+leaf, aldus	2766
+leaf, ivy	2767
+LEFT-TO-RIGHT EMBEDDING	202A
+LEFT-TO-RIGHT MARK	200E
+LEFT-TO-RIGHT OVERRIDE	202D
+leftward tab	21E4
+LEG, LATIN CAPITAL LETTER N WITH LONG RIGHT	0220
+LENTICULAR BRACKET, LEFT BLACK	3010
+LENTICULAR BRACKET, LEFT WHITE	3016
+LEO	264C
+LESS-THAN, CIRCLED	29C0
+LESS-THAN, DOUBLE NESTED	2AA1
+LESS-THAN, DOUBLE-LINE EQUAL TO OR	2A99
+LESS-THAN, DOUBLE-LINE SLANTED EQUAL TO OR	2A9B
+LESS-THAN, GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE	2A8C
+LESS-THAN, GREATER-THAN ABOVE SIMILAR ABOVE	2A90
+LESS-THAN, GREATER-THAN BESIDE	2AA5
+LESS-THAN, GREATER-THAN OVERLAPPING	2AA4
+LESS-THAN, MUCH	226A
+LESS-THAN, SIMILAR OR	2A9D
+LESS-THAN, SLANTED EQUAL TO OR	2A95
+LESS-THAN, TRIPLE NESTED	2AF7
+LESS-THAN, VERY MUCH	22D8
+LESS-THAN ABOVE DOUBLE-LINE EQUAL, GREATER-THAN ABOVE	2A92
+LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN	2A8B
+LESS-THAN ABOVE EQUALS SIGN, SIMILAR ABOVE	2A9F
+LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL	2A91
+LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN	2A8F
+LESS-THAN ABOVE SIMILAR OR EQUAL	2A8D
+LESS-THAN ABOVE SLANTED EQUAL, GREATER-THAN ABOVE SLANTED EQUAL ABOVE	2A94
+LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL	2A93
+LESS-THAN AND NOT APPROXIMATE	2A89
+LESS-THAN AND SINGLE-LINE NOT EQUAL TO	2A87
+LESS-THAN CLOSED BY CURVE	2AA6
+LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL	2AA8
+LESS-THAN OR APPROXIMATE	2A85
+LESS-THAN OR EQUAL TO	2264
+LESS-THAN OR EQUAL TO, DOUBLE-LINE SLANTED	2AF9
+LESS-THAN OR SLANTED EQUAL TO	2A7D
+LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE	2A81
+LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT	2A83
+LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE	2A7F
+LESS-THAN SIGN	003C
+LESS-THAN WITH CIRCLE INSIDE	2A79
+LESS-THAN WITH DOT INSIDE, SLANTED EQUAL TO OR	2A97
+LESS-THAN WITH QUESTION MARK ABOVE	2A7B
+LESS-THAN WITH UNDERBAR, DOUBLE NESTED	2AA3
+Letterlike Symbols	2100
+level 2 lock	21EB
+level 3 lock	21EF
+level 3 select	21EE
+LEZH, LATIN SMALL LETTER	026E
+lf	000A
+LIABILITY SIGN, LIMITED	32CF
+LIBRA	264E
+ligature ae, latin small	00E6
+LIGATURE IJ, LATIN SMALL	0133
+LIGATURE LEFT HALF, COMBINING	FE20
+LIGATURE OE, LATIN SMALL	0153
+ligature tie	0361
+Ligatures, Armenian	FB13
+Ligatures, Latin	FB00
+LIGHTNING	2607
+LIMIT, APPROACHES THE	2250
+Limbu	1900
+Limbu Digits	1946
+LIMITED LIABILITY SIGN	32CF
+LINE, AEGEAN WORD SEPARATOR	10100
+line, beginning of	2310
+LINE, CENTRELINE LOW	FE4E
+LINE, COMBINING DOUBLE LOW	0333
+LINE, COMBINING LOW	0332
+LINE, DASHED LOW	FE4D
+LINE, DOUBLE LOW	2017
+LINE, DOUBLE VERTICAL	2016
+LINE, LOW	005F
+LINE, MODIFIER LETTER LOW VERTICAL	02CC
+LINE, MODIFIER LETTER VERTICAL	02C8
+line, new	21B5
+line, next	0085
+LINE, VERTICAL	007C
+LINE, WAVY	2307
+LINE, WAVY LOW	FE4F
+LINE ABOVE, COMBINING DOUBLE VERTICAL	030E
+LINE ABOVE, COMBINING VERTICAL	030D
+LINE BELOW, COMBINING DOUBLE VERTICAL	0348
+LINE BELOW, COMBINING VERTICAL	0329
+line down, partial	008B
+line feed	000A
+line feed	21B4
+line feed, reverse	008D
+LINE FEED, SYMBOL FOR	240A
+line marker	2319
+LINE OVERLAY, COMBINING LONG VERTICAL	20D2
+LINE OVERLAY, COMBINING SHORT VERTICAL	20D3
+LINE SEPARATOR	2028
+LINE SYMBOL, CENTRE	2104
+line tabulation set	008A
+line up, partial	008C
+LINE WITH MIDDLE DOT, VERTICAL	237F
+Linear B Ideograms	10080
+Linear B Syllabary	10000
+Lines For Terminal Graphics, Scan	23BA
+Lira, Italian	00A3
+LIRA SIGN	20A4
+liter	2113
+Livonian, Additions for	022A
+LOCATION SIGN, TELEPHONE	2706
+lock, caps	21EA
+lock, caps	21EC
+lock, group	21F0
+lock, level 2	21EB
+lock, level 3	21EF
+lock, numerics	21ED
+Logic Operators, Modal	27E0
+LOGICAL AND	2227
+LOGICAL AND, CURLY	22CF
+LOGICAL AND, INTERSECTION WITH	2A44
+LOGICAL AND, N-ARY	22C0
+LOGICAL AND OPERATOR, TWO	2A07
+Logical Ands and Ors	2A51
+LOGICAL OR	2228
+LOGICAL OR, CURLY	22CE
+LOGICAL OR, N-ARY	22C1
+LOGICAL OR, UNION WITH	2A45
+LOGICAL OR OPERATOR, TWO	2A08
+long	0304
+Long Arrows	27F5
+long cross	2020
+long dash	2015
+LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL	2AE6
+LONG HORIZONTAL STROKE, CONTAINS WITH	22FA
+LONG HORIZONTAL STROKE, ELEMENT OF WITH	22F2
+LONG LEFT TACK	27DE
+LONG RIGHT LEG, LATIN CAPITAL LETTER N WITH	0220
+LONG RIGHT TACK	27DD
+LONG S, LATIN SMALL LETTER	017F
+long slash overlay	0338
+LONG SOLIDUS OVERLAY, COMBINING	0338
+LONG STROKE OVERLAY, COMBINING	0336
+LONG VERTICAL LINE OVERLAY, COMBINING	20D2
+LORRAINE, CROSS OF	2628
+LOW ACUTE ACCENT, MODIFIER LETTER	02CF
+LOW ASTERISK	204E
+low double comma quotation mark	201E
+LOW DOUBLE PRIME QUOTATION MARK	301F
+LOW GRAVE ACCENT, MODIFIER LETTER	02CE
+LOW LINE	005F
+LOW LINE, CENTRELINE	FE4E
+LOW LINE, COMBINING	0332
+LOW LINE, COMBINING DOUBLE	0333
+LOW LINE, DASHED	FE4D
+LOW LINE, DOUBLE	2017
+LOW LINE, WAVY	FE4F
+LOW MACRON, MODIFIER LETTER	02CD
+low single comma quotation mark	201A
+Low Surrogates	DC00
+LOW VERTICAL LINE, MODIFIER LETTER	02CC
+LOW-9 QUOTATION MARK, DOUBLE	201E
+LOW-9 QUOTATION MARK, SINGLE	201A
+lower rank than	227A
+LOZENGE	25CA
+LOZENGE, BLACK	29EB
+LOZENGE, SQUARE	2311
+LOZENGE DIVIDED BY HORIZONTAL RULE	27E0
+lre	202A
+lrm	200E
+lro	202D
+M, COMBINING LATIN SMALL LETTER	036B
+M, LATIN CAPITAL LETTER TURNED	019C
+M, LATIN SMALL LETTER TURNED	026F
+M, SCRIPT CAPITAL	2133
+m-matrix	2133
+MACRON	00AF
+MACRON, COMBINING	0304
+MACRON, MODIFIER LETTER	02C9
+MACRON, MODIFIER LETTER LOW	02CD
+macron, spacing	00AF
+MACRON BELOW, COMBINING	0331
+Malayalam	0D00
+Malayalam Digits	0D66
+Malayalam Letters	0D05
+MALE SIGN	2642
+MALTESE CROSS	2720
+Manchu Letters, Mongolian	1873
+Map Markers	2690
+mapping, bijective	2916
+maps from	27FB
+maps from	2906
+maps to	27FC
+maps to	2905
+maps to	2907
+mark, german	2133
+marker, histogram	25AE
+Markers, Go	2686
+Markers, Map	2690
+mars	2642
+MASCULINE ORDINAL INDICATOR	00BA
+MASU MARK	303C
+MATERIALS, RECYCLING SYMBOL FOR GENERIC	267A
+Mathematical Brackets	27E6
+Mathematical Operators	2200
+Mathematical Operators, Supplemental	2A00
+MATHEMATICAL SPACE, MEDIUM	205F
+Mathematical Symbols, Double-Struck Italic	2145
+Mathematical Symbols-A, Miscellaneous	27C0
+Mathematical Symbols-B, Miscellaneous	2980
+MATRIX, HERMITIAN CONJUGATE	22B9
+MEASURED ANGLE	2221
+Measured Angles, Angles and	299B
+MEASURED BY	225E
+Medieval Superscript Letter Diacritics	0363
+medium, end of	0019
+MEDIUM, SYMBOL FOR END OF	2419
+MEDIUM MATHEMATICAL SPACE	205F
+MEDIUM SMALL SQUARE, BLACK	25FE
+MEDIUM SMALL SQUARE, WHITE	25FD
+MEDIUM SQUARE, BLACK	25FC
+MEDIUM SQUARE, WHITE	25FB
+MEMBER, CONTAINS AS	220B
+MEMBER, SMALL CONTAINS AS	220D
+MEMBER OF DOUBLE VERTICAL, LONG DASH FROM LEFT	2AE6
+MEMBERSHIP, Z NOTATION BAG	22FF
+MERCURY	263F
+merge	2A07
+message, privacy	009E
+message waiting	0095
+mho	2127
+MICRO SIGN	00B5
+mid space	2005
+MIDDLE DOT	00B7
+middle dot, greek	00B7
+MIDDLE DOT, KATAKANA	30FB
+MIDDLE DOT, LATIN SMALL LETTER L WITH	0140
+MIDDLE DOT, VERTICAL LINE WITH	237F
+MIDDLE TILDE, LATIN CAPITAL LETTER O WITH	019F
+MIDDLE TILDE, LATIN SMALL LETTER L WITH	026B
+MIDLINE HORIZONTAL ELLIPSIS	22EF
+midpoint	00B7
+MILL SIGN	20A5
+MILLE SIGN, PER	2030
+milreis	0024
+minim	264F
+minim (alternate glyph)	264D
+Minnan and Hakka, Chinese Bopomofo Extended for	31A0
+MINUS, CIRCLED	2296
+MINUS, DOT	2238
+MINUS, SET	2216
+MINUS, SQUARED	229F
+MINUS, SUBSCRIPT	208B
+MINUS, SUPERSCRIPT	207B
+MINUS SIGN	2212
+MINUS SIGN, COMMERCIAL	2052
+minus sign, hyphen or	002D
+MINUS SIGN, MODIFIER LETTER	02D7
+MINUS SIGN, UNION WITH	2A41
+MINUS SIGN BELOW, COMBINING	0320
+MINUS SIGN IN TRIANGLE	2A3A
+Minus Sign Operators, Plus and	2A22
+MINUS SIMILAR, SIMILAR	2A6C
+MINUS TILDE	2242
+MINUS-OR-PLUS SIGN	2213
+minutes	2032
+MINY	29FF
+Miscellaneous Mathematical Symbols-A	27C0
+Miscellaneous Mathematical Symbols-B	2980
+Miscellaneous Symbols	2600
+Miscellaneous Symbols and Arrows	2B00
+Miscellaneous Technical	2300
+MISRA, ARABIC SIGN	060F
+mmsp	205F
+Modal Logic Operators	27E0
+MODELS	22A7
+Modifier Letters, Spacing	02B0
+MODULO TWO SUM	2A0A
+Mongolian	1800
+MONGOLIAN COLON	1804
+MONGOLIAN COMMA	1802
+mongolian currency	20AE
+Mongolian Digits	1810
+Mongolian Extensions for Sanskrit and Tibetan	1880
+Mongolian Format Controls	180B
+MONGOLIAN FULL STOP	1803
+Mongolian Manchu Letters	1873
+Mongolian Sibe Letters	185D
+Mongolian Todo Letters	1843
+Monogram and Digram Symbols, Yijing	268C
+Monogram Symbol, Tai Xuan Jing	1D300
+MONOSTABLE SYMBOL	238D
+MONTH SIGN, TAMIL	0BF4
+Months, Enclosed CJK Letters and	3200
+Months, Telegraph Symbols for	32C0
+MOON, FIRST QUARTER	263D
+MOON, LAST QUARTER	263E
+most positive	223E
+MUCH GREATER-THAN	226B
+MUCH GREATER-THAN, VERY	22D9
+MUCH LESS-THAN	226A
+MUCH LESS-THAN, VERY	22D8
+MULTIMAP	22B8
+MULTIMAP, DOUBLE-ENDED	29DF
+MULTIMAP, LEFT	27DC
+MULTIPLICATION, MULTISET	228D
+Multiplication and Division Sign Operators	2A2F
+MULTIPLICATION SIGN	00D7
+MULTIPLICATION SIGN BELOW, SUBSET WITH	2AC1
+MULTIPLICATION SIGN BELOW, SUPERSET WITH	2AC2
+MULTIPLICATION X	2715
+MULTIPLICATION X, HEAVY	2716
+MULTISET	228C
+MULTISET MULTIPLICATION	228D
+MULTISET UNION	228E
+MUSIC FLAT SIGN	266D
+MUSIC NATURAL SIGN	266E
+MUSIC SHARP SIGN	266F
+Musical Symbols	2669
+mutton	2003
+mutton quad	2001
+mvs	180E
+Myanmar	1000
+Myanmar Digits	1040
+N, DOUBLE-STRUCK CAPITAL	2115
+N, LATIN LETTER SMALL CAPITAL	0274
+N WITH LONG RIGHT LEG, LATIN CAPITAL LETTER	0220
+N-ARY COPRODUCT	2210
+n-ary dijkstra choice	2AFF
+N-ARY INTERSECTION	22C2
+N-ARY LOGICAL AND	22C0
+N-ARY LOGICAL OR	22C1
+N-ary Operators	2A00
+N-ARY PRODUCT	220F
+N-ARY SUMMATION	2211
+N-ARY SUMMATION, DOUBLE-STRUCK	2140
+N-ARY UNION	22C3
+N-ARY WHITE VERTICAL BAR	2AFF
+NABLA	2207
+NAIRA SIGN	20A6
+NAND	22BC
+nang	0323
+NARROW NO-BREAK SPACE	202F
+nasal hook	0328
+NATIONAL DIGIT SHAPES	206E
+natural number	2115
+NATURAL SIGN, MUSIC	266E
+nbsp	0080
+necessarily satisfies	2AF1
+NEGATED WITH VERTICAL BAR, INFINITY	29DE
+negation	20D3
+NEGATION SLASH, DOES NOT DIVIDE WITH REVERSED	2AEE
+negative acknowledge	0015
+negative acknowledge, graphic for	237B
+NEGATIVE ACKNOWLEDGE, SYMBOL FOR	2415
+NEPTUNE	2646
+never (modal operator)	27E1
+never (modal operator), was	27E2
+never be (modal operator), will	27E3
+new line	21B5
+NEW SHEQEL SIGN	20AA
+NEWLINE, SYMBOL FOR	2424
+next line	0085
+NEXT PAGE	2398
+NIB, BLACK	2712
+nigerian currency	20A6
+nim-addition	2A27
+nnbsp	202F
+no break here	0083
+no break space, graphic for	237D
+NO-BREAK SPACE	00A0
+NO-BREAK SPACE, NARROW	202F
+NO-BREAK SPACE, ZERO WIDTH	FEFF
+NODE, ASCENDING	260A
+NODE, DESCENDING	260B
+NOMINAL DIGIT SHAPES	206F
+NON-BREAKING HYPHEN	2011
+non-breaking space	00A0
+NON-JOINER, ZERO WIDTH	200C
+non-theorem	22A3
+Noncharacters	FDD0
+Noncharacters	FFFE
+Noncharacters	1FFFE
+Noncharacters	2FFFE
+Noncharacters	3FFFE
+Noncharacters	4FFFE
+Noncharacters	5FFFE
+Noncharacters	6FFFE
+Noncharacters	7FFFE
+Noncharacters	8FFFE
+Noncharacters	9FFFE
+Noncharacters	AFFFE
+Noncharacters	BFFFE
+Noncharacters	CFFFE
+Noncharacters	DFFFE
+Noncharacters	EFFFE
+Noncharacters	FFFFE
+Noncharacters	10FFFE
+NONFORKING	2ADD
+NOR	22BD
+NORMAL SUBGROUP, CONTAINS AS	22B3
+NORMAL SUBGROUP OF	22B2
+not	223C
+Not a Character	FFFE
+Not a Character	FFFF
+NOT ALMOST EQUAL TO, PRECEDES ABOVE	2AB9
+NOT ALMOST EQUAL TO, SUCCEEDS ABOVE	2ABA
+NOT AN ELEMENT OF	2209
+NOT APPROXIMATE, GREATER-THAN AND	2A8A
+NOT APPROXIMATE, LESS-THAN AND	2A89
+NOT CHECK MARK	237B
+NOT DIVIDE WITH REVERSED NEGATION SLASH, DOES	2AEE
+NOT EQUAL TO	2260
+NOT EQUAL TO, GREATER-THAN AND SINGLE-LINE	2A88
+NOT EQUAL TO, LESS-THAN AND SINGLE-LINE	2A87
+NOT EQUAL TO, PRECEDES ABOVE	2AB5
+NOT EQUAL TO, PRECEDES ABOVE SINGLE-LINE	2AB1
+NOT EQUAL TO, SUBSET OF ABOVE	2ACB
+NOT EQUAL TO, SUCCEEDS ABOVE	2AB6
+NOT EQUAL TO, SUCCEEDS ABOVE SINGLE-LINE	2AB2
+NOT EQUAL TO, SUPERSET OF ABOVE	2ACC
+not independent	2ADC
+NOT SIGN	00AC
+NOT SIGN, DOUBLE STROKE	2AEC
+NOT SIGN, REVERSED	2310
+NOT SIGN, REVERSED DOUBLE STROKE	2AED
+NOT SIGN, TURNED	2319
+NOT TILDE ABOVE, COMBINING	034A
+not yield, does	22A3
+NOTE, EIGHTH	266A
+NOTE, QUARTER	2669
+NOTES, BEAMED EIGHTH	266B
+NOTES, BEAMED SIXTEENTH	266C
+null	0000
+NULL, SYMBOL FOR	2400
+null set	2205
+number, natural	2115
+Number Forms	2150
+Number Runes, Golden	16EE
+NUMBER SIGN	0023
+NUBMER SIGN, ARABIC	0600
+NUMBER SIGN, TAMIl	0BFA
+number symbol, real	210A
+NUMBER ZERO, IDEOGRAPHIC	3007
+Numbers, Aegean	10100
+Numbers, Circled	2460
+Numbers, Circled	3251
+Numbers, Circled	32B1
+Numbers, Circled Inverse	2776
+Numbers, Double Circled	24F5
+Numbers, Parenthesized	2474
+numbers, the set of complex	2102
+numbers, the set of rational	211A
+numbers, the set of real	211D
+Numbers, White On Black Circled	24EB
+Numbers Period	2488
+Numerals, Hangzhou-style	3021
+Numerals, Old Italic	10320
+Numerals, Roman	2160
+NUMERATOR ONE, FRACTION	215F
+numerics lock	21ED
+NUMERO SIGN	2116
+nut	2002
+O, COMBINING LATIN SMALL LETTER	0366
+o, latin capital letter barred	019F
+O, LATIN CAPITAL LETTER OPEN	0186
+O, LATIN SMALL LETTER BARRED	0275
+O, LATIN SMALL LETTER OPEN	0254
+O, SCRIPT SMALL	2134
+o bar	019F
+o bar	0275
+o e, latin small letter	0153
+O WITH MIDDLE TILDE, LATIN CAPITAL LETTER	019F
+obelisk	2020
+obelisk, double	2021
+OBJECT REPLACEMENT CHARACTER	FFFC
+OCR, Optical Character Recognition	2440
+octothorpe	0023
+OE, LATIN LETTER SMALL CAPITAL	0276
+OE, LATIN SMALL LIGATURE	0153
+Ogham	1680
+OGHAM SPACE MARK	1680
+OGONEK	02DB
+OGONEK, COMBINING	0328
+OHM SIGN	2126
+OHM SIGN, INVERTED	2127
+OI, LATIN SMALL LETTER	01A3
+OM, DEVANAGARI	0950
+OMEGA, LATIN SMALL LETTER CLOSED	0277
+ONE, FRACTION NUMERATOR	215F
+ONE, SUPERSCRIPT	00B9
+ONE DOT LEADER	2024
+ONE HALF, VULGAR FRACTION	00BD
+ONE QUARTER, VULGAR FRACTION	00BC
+OPEN BOX	2423
+OPEN BOX, SHOULDERED	237D
+OPEN E, LATIN CAPITAL LETTER	0190
+OPEN E, LATIN SMALL LETTER	025B
+OPEN E, LATIN SMALL LETTER CLOSED	029A
+OPEN E, LATIN SMALL LETTER CLOSED REVERSED	025E
+OPEN E, LATIN SMALL LETTER REVERSED	025C
+OPEN O, LATIN CAPITAL LETTER	0186
+OPEN O, LATIN SMALL LETTER	0254
+opening brace	007B
+opening curly bracket	007B
+opening parenthesis	0028
+opening square bracket	005B
+operating system command	009D
+OPERATOR, ASTERISK	2217
+OPERATOR, BULLET	2219
+OPERATOR, CIRCLED ASTERISK	229B
+OPERATOR, CIRCLED DOT	2299
+OPERATOR, CIRCLED RING	229A
+OPERATOR, DIAMOND	22C4
+OPERATOR, DOT	22C5
+OPERATOR, RING	2218
+OPERATOR, SQUARED DOT	22A1
+OPERATOR, STAR	22C6
+OPERATOR, TILDE	223C
+Operators, Database Theory	27D5
+Operators, Invisible	2063
+Operators, Mathematical	2200
+Operators, Modal Logic	27E0
+Operators, Multiplication and Division Sign	2A2F
+Operators, N-Ary	2A00
+Operators, Plus and Minus Sign	2A22
+Operators, Relational	2A66
+Operators, Specialized plus sign	29FA
+Operators, Supplemental Mathematical	2A00
+Operators, Vertical Line	2AEE
+OPPOSITION	260D
+Optical Character Recognition (OCR)	2440
+OPTION KEY	2325
+OR, CURLY LOGICAL	22CE
+OR, DOUBLE LOGICAL	2A54
+OR, LOGICAL	2228
+OR, N-ARY LOGICAL	22C1
+OR, SLOPING LARGE	2A57
+OR, TWO INTERSECTING LOGICAL	2A56
+OR, UNION WITH LOGICAL	2A45
+OR OPERATOR, TWO LOGICAL	2A08
+OR WITH DOT ABOVE, LOGICAL	2A52
+OR WITH DOUBLE OVERBAR, LOGICAL	2A62
+OR WITH DOUBLE UNDERBAR, LOGICAL	2A63
+OR WITH HORIZONTAL DASH, LOGICAL	2A5D
+OR WITH MIDDLE STEM, LOGICAL	2A5B
+order	2134
+ORDINAL INDICATOR, FEMININE	00AA
+ORDINAL INDICATOR, MASCULINE	00BA
+ordinarily satisfies	2AE2
+ORIGIN, DIMENSION	2331
+ORIGINAL OF	22B6
+ORIGINAL OF, SQUARE	2290
+Oriya	0B00
+Oriya Digits	0B66
+Oriya Letters	0B05
+Ornamental Angle Quotation Marks	276E
+Ornamental Brackets	2768
+Ornamental Brackets	2770
+Ornaments, Heart	2763
+Ornaments, Punctuation	275B
+ORNATE LEFT PARENTHESIS	FD3E
+ors, logical ands and	2A51
+ORTHODOX CROSS	2626
+orthogonal to	22A5
+Osmanya	10480
+Osmanya Digits	104A0
+OU, LATIN SMALL LETTER	0223
+OUNCE SIGN	2125
+OUTER JOIN, FULL	27D7
+OUTER JOIN, LEFT	27D5
+OUTER JOIN, RIGHT	27D6
+OUTLINE, SQUARE WITH CONTOURED	29E0
+OVER INFINITY, TIE	29DD
+OVER TOP SQUARE BRACKET, BOTTOM SQUARE BRACKET	23B6
+overbar, apl	00AF
+OVERLAPPING LESS-THAN, GREATER-THAN	2AA4
+OVERLAPPING LOGICAL AND, LOGICAL OR	2A59
+OVERLAY, COMBINING CLOCKWISE RING	20D9
+OVERLAY, COMBINING DOUBLE VERTICAL STROKE	20E6
+OVERLAY, COMBINING LEFTWARDS ARROW	20EA
+OVERLAY, COMBINING LONG SOLIDUS	0338
+OVERLAY, COMBINING LONG STROKE	0336
+OVERLAY, COMBINING LONG VERTICAL LINE	20D2
+OVERLAY, COMBINING REVERSE SOLIDUS	20E5
+OVERLAY, COMBINING RING	20D8
+OVERLAY, COMBINING SHORT SOLIDUS	0337
+OVERLAY, COMBINING SHORT STROKE	0335
+OVERLAY, COMBINING SHORT VERTICAL LINE	20D3
+OVERLAY, COMBINING TILDE	0334
+overlay, long slash	0338
+overlay, short slash	0337
+overline	00AF
+OVERLINE	203E
+OVERLINE, CENTRELINE	FE4A
+OVERLINE, COMBINING	0305
+OVERLINE, COMBINING DOUBLE	033F
+OVERLINE, DASHED	FE49
+OVERLINE, DOUBLE WAVY	FE4C
+OVERLINE, WAVY	FE4B
+OVERRIDE, LEFT-TO-RIGHT	202D
+OVERRIDE, RIGHT-TO-LEFT	202E
+overscore	0305
+overscore, spacing	203E
+Overscores and Underscores	FE49
+Overstruck Diacritics	0334
+oxia	0301
+P, DOUBLE-STRUCK CAPITAL	2119
+P, SCRIPT CAPITAL	2118
+PAGE, NEXT	2398
+PAGE, PREVIOUS	2397
+page down	21DF
+page up	21DE
+PALATALIZED HOOK BELOW, COMBINING	0321
+PAMUDPOD, HANUNOO SIGN	1734
+PAPER SYMBOL, PARTIALLY-RECYCLED	267D
+PAPER SYMBOL, RECYCLED	267C
+PARAGRAPH SEPARATOR	2029
+PARAGRAPH SEPARATOR, GEORGIAN	10FB
+paragraph separator, urdu	203B
+paragraph sign	00B6
+paragraph sign, european	00A7
+PARAGRAPH SIGN ORNAMENT, CURVED STEM	2761
+PARALLEL, CIRCLED	29B7
+PARALLEL, EQUALS SIGN AND SLANTED	29E3
+PARALLEL, IDENTICAL TO AND SLANTED	29E5
+PARALLEL TO	2225
+parallel to, identical and	2A68
+PARALLEL WITH HORIZONTAL STROKE	2AF2
+PARALLEL WITH TILDE ABOVE, EQUALS SIGN AND SLANTED	29E4
+PARALLEL WITH TILDE OPERATOR	2AF3
+PARALLELOGRAM, BLACK	25B0
+parenthesis, closing	0029
+PARENTHESIS, LEFT	0028
+parenthesis, opening	0028
+PARENTHESIS, ORNATE LEFT	FD3E
+PARENTHESIS, RIGHT	0029
+PARENTHESIS, SUBSCRIPT LEFT	208D
+PARENTHESIS, SUPERSCRIPT LEFT	207D
+Parenthesized Ideographs	3220
+Parenthesized Korean Hangul Elements	3200
+Parenthesized Korean Hangul Syllables	320E
+Parenthesized Latin Letters	249C
+Parenthesized Numbers	2474
+PART ALTERNATION MARK	303D
+PART INTEGRAL, FINITE	2A0D
+parted rule	00A6
+PARTIAL DIFFERENTIAL	2202
+partial function, z notation	21F8
+partial injection, z notation	2914
+partial line down	008B
+partial line up	008C
+partial relation, z notation	21F9
+partial surjection, z notation	2900
+PARTIALLY-RECYCLED PAPER SYMBOL	267D
+PARTNERSHIP SIGN	3250
+Parts, Summation Sign	23B2
+pdf	202C
+PEACE SYMBOL	262E
+PENCIL, UPPER RIGHT	2710
+Pencil Dingbats	270E
+PENNY SIGN, GERMAN	20B0
+per	2118
+PER MILLE SIGN	2030
+PER TEN THOUSAND SIGN	2031
+PERCENT SIGN	0025
+PERCENT SIGN, ARABIC	066A
+PERCUSSIVE, LATIN LETTER BIDENTAL	02AD
+PERCUSSIVE, LATIN LETTER BILABIAL	02AC
+period	002E
+PERISPOMENI, COMBINING GREEK	0342
+perpendicular	22A5
+PERPENDICULAR, CIRCLED	29B9
+PERPENDICULAR WITH S	2AE1
+Persian and Urdu, Eastern Arabic-Indic Digits for	06F0
+PERSPECTIVE	2306
+PESETA SIGN	20A7
+PESO SIGN	20B1
+PHARYNGEAL VOICED FRICATIVE, LATIN LETTER	0295
+PHI, LATIN SMALL LETTER	0278
+Philippine Scripts, Generic Punctuation For	1735
+Phonetic Alphabet, International	0250
+Phonetic Extensions	1D00
+Phonetic Extensions, Katakana	31F0
+Phonetic Extensions, non-IPA	1D00
+Phonetic Extensions for Ainu	31F0
+Phonetic Modifiers Derived from Latin Letters	02B0
+Phonetics and Symbols Area, CJK	2E00
+phonorecord sign	2117
+PI, DOUBLE-STRUCK CAPITAL	213F
+pi, mathematical constant	03C0
+Pictures for Control Codes, Graphic	2400
+Pieces, Bracket	239B
+Pieces, Bracket	23B0
+PILCROW SIGN	00B6
+PILCROW SIGN, REVERSED	204B
+Pinyin Diacritic-vowel Combinations	01CD
+pipe	01C0
+pipe, double	01C1
+pipe, double-barred	01C2
+PIPING, Z NOTATION SCHEMA	2A20
+PISCES	2653
+PITCHFORK	22D4
+PITCHFORK WITH TEE TOP	2ADA
+PLACE OF INTEREST SIGN	2318
+plaintiff	226C
+PLANCK CONSTANT	210E
+PLANCK CONSTANT OVER TWO PI	210F
+Planet Symbols	263F
+Playing Card Suits	2660
+PLUS, CIRCLED	2295
+PLUS, DOT	2214
+PLUS, DOUBLE	29FA
+PLUS, N-ARY UNION OPERATOR WITH	2A04
+PLUS, SQUARED	229E
+PLUS, TRIPLE	29FB
+Plus and Minus Sign Operators	2A22
+PLUS OPERATOR, N-ARY CIRCLED	2A01
+PLUS SIGN	002B
+PLUS SIGN, EQUALS SIGN ABOVE	2A71
+PLUS SIGN, MODIFIER LETTER	02D6
+PLUS SIGN, SUBSCRIPT	208A
+PLUS SIGN, SUPERSCRIPT	207A
+PLUS SIGN ABOVE EQUALS SIGN	2A72
+PLUS SIGN BELOW, COMBINING	031F
+PLUS SIGN BELOW, SUBSET WITH	2ABF
+PLUS SIGN BELOW, SUPERSET WITH	2AC0
+PLUS SIGN IN LEFT HALF CIRCLE	2A2D
+PLUS SIGN IN RIGHT HALF CIRCLE	2A2E
+PLUS SIGN IN TRIANGLE	2A39
+Plus Sign Operators, Specialized	29FA
+PLUS-MINUS SIGN	00B1
+PLUTO	2647
+POETIC VERSE SIGN, ARABIC	060E
+POINT OPERATOR, INTEGRAL AROUND A	2A15
+Pointers	25BA
+Points, Arabic	064B
+Points, Hebrew	05B0
+poison	2620
+Political Symbols, Religious and	2626
+POP DIRECTIONAL FORMATTING	202C
+POSITION INDICATOR	2316
+positive, most	223E
+positive difference, sum or	2A26
+positive difference or sum	2A24
+POSTAL MARK	3012
+POSTAL MARK, CIRCLED	3036
+POSTAL MARK FACE	3020
+pound sign	0023
+POUND SIGN	00A3
+pound sterling	00A3
+pounds	2114
+power set	2118
+PRECEDES	227A
+PRECEDES, DOUBLE	2ABB
+PRECEDES ABOVE ALMOST EQUAL TO	2AB7
+PRECEDES ABOVE EQUALS SIGN	2AB3
+PRECEDES ABOVE NOT ALMOST EQUAL TO	2AB9
+PRECEDES ABOVE NOT EQUAL TO	2AB5
+PRECEDES ABOVE SINGLE-LINE EQUALS SIGN	2AAF
+PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO	2AB1
+PRECEDES UNDER RELATION	22B0
+PRESCRIPTION TAKE	211E
+Presentation Forms, Alphabetic	FB00
+Presentation Forms, Hebrew	FB1D
+Presentation Forms-A, Arabic	FB50
+Presentation Forms-B, Arabic	FE70
+PREVIOUS PAGE	2397
+PRIME	2032
+PRIME, DOUBLE	2033
+PRIME, MODIFIER LETTER	02B9
+PRIME, MODIFIER LETTER DOUBLE	02BA
+PRIME, QUADRUPLE	2057
+PRIME, REVERSED	2035
+PRIME, REVERSED DOUBLE	2036
+PRIME, REVERSED TRIPLE	2037
+PRIME, TRIPLE	2034
+PRIME QUOTATION MARK, DOUBLE	301E
+PRIME QUOTATION MARK, LOW DOUBLE	301F
+PRIME QUOTATION MARK, REVERSED DOUBLE	301D
+PRINT SCREEN SYMBOL	2399
+privacy message	009E
+Private Use Area	E000
+Private Use Area-A, Supplementary	F0000
+Private Use Area-B, Supplementary	100000
+private use one	0091
+private use two	0092
+PRODUCT, CLOSED UNION WITH SERIFS AND SMASH	2A50
+product, direct	2299
+PRODUCT, INTERIOR	2A3C
+PRODUCT, LEFT SEMIDIRECT	22CB
+PRODUCT, N-ARY	220F
+PRODUCT, RIGHTHAND INTERIOR	2A3D
+PRODUCT, SHUFFLE	29E2
+PRODUCT, SMASH	2A33
+product, tensor	2297
+PRODUCT, VECTOR OR CROSS	2A2F
+PRODUCT, WREATH	2240
+PRODUCT WITH BOTTOM CLOSED, SEMIDIRECT	2A32
+PROFILE, ALL AROUND-	232E
+prohibition	20E0
+PROJECTION, Z NOTATION SCHEMA	2A21
+PROJECTIVE	2305
+PROOF, END OF	220E
+PROPERTY LINE	214A
+PROPORTION	2237
+PROPORTION, GEOMETRIC	223A
+PROPORTIONAL TO	221D
+proportional to, varies with	223C
+proves	22A2
+psili	0313
+published	2117
+pullback	27D3
+Punctuation, CJK Symbols and	3000
+Punctuation, General	2000
+Punctuation, Hanunóo-Specific	1734
+Punctuation, Katakana	30A0
+PUNCTUATION, PHILIPPINE DOUBLE	1736
+PUNCTUATION, PHILIPPINE SINGLE	1735
+Punctuation For Philippine Scripts, Generic	1735
+Punctuation For Vertical Text, Double	2047
+Punctuation Ornaments	275B
+PUNCTUATION SPACE	2008
+punt, irish	00A3
+purna viram	0964
+pushout	27D4
+Q, DOUBLE-STRUCK CAPITAL	211A
+Q, ROTATED CAPITAL	213A
+QAF, ARABIC LETTER DOTLESS	066F
+qed	220E
+QUAD, EM	2001
+QUAD, EN	2000
+quad, mutton	2001
+Quadrants	2596
+quadrature	25A1
+QUADRUPLE INTEGRAL OPERATOR	2A0C
+QUADRUPLE PRIME	2057
+quantic	226C
+QUARTER MOON, FIRST	263D
+QUARTER MOON, LAST	263E
+QUARTER NOTE	2669
+Quarters, Fractions	00BC
+QUATERNION INTEGRAL OPERATOR	2A16
+QUESTION EXCLAMATION MARK	2048
+QUESTION MARK	003F
+QUESTION MARK, ARABIC	061F
+QUESTION MARK, ARMENIAN	055E
+QUESTION MARK, DOUBLE	2047
+QUESTION MARK, ETHIOPIC	1367
+QUESTION MARK, EXCLAMATION	2049
+QUESTION MARK, GREEK	037E
+QUESTION MARK, INVERTED	00BF
+QUESTION MARK ABOVE, GREATER-THAN WITH	2A7C
+QUESTION MARK ABOVE, LESS-THAN WITH	2A7B
+QUESTIONED EQUAL TO	225F
+QUILL, LEFT SQUARE BRACKET WITH	2045
+Quine Corners	231C
+quotation dash	2015
+QUOTATION MARK	0022
+quotation mark, double comma	201D
+QUOTATION MARK, DOUBLE HIGH-REVERSED-9	201F
+QUOTATION MARK, DOUBLE LOW-9	201E
+QUOTATION MARK, DOUBLE PRIME	301E
+quotation mark, double reversed comma	201F
+quotation mark, double turned comma	201C
+QUOTATION MARK, LEFT DOUBLE	201C
+QUOTATION MARK, LEFT SINGLE	2018
+QUOTATION MARK, LEFT-POINTING DOUBLE ANGLE	00AB
+quotation mark, low double comma	201E
+QUOTATION MARK, LOW DOUBLE PRIME	301F
+quotation mark, low single comma	201A
+QUOTATION MARK, REVERSED DOUBLE PRIME	301D
+QUOTATION MARK, RIGHT DOUBLE	201D
+QUOTATION MARK, RIGHT SINGLE	2019
+QUOTATION MARK, RIGHT-POINTING DOUBLE ANGLE	00BB
+quotation mark, single comma	2019
+QUOTATION MARK, SINGLE HIGH-REVERSED-9	201B
+QUOTATION MARK, SINGLE LEFT-POINTING ANGLE	2039
+QUOTATION MARK, SINGLE LOW-9	201A
+quotation mark, single reversed comma	201B
+QUOTATION MARK, SINGLE RIGHT-POINTING ANGLE	203A
+quotation mark, single turned comma	2018
+Quotation Mark Ornaments	275B
+Quotation Marks, Ornamental Angle	276E
+quote, apl	0022
+R, BLACK-LETTER CAPITAL	211C
+R, COMBINING LATIN SMALL LETTER	036C
+R, DOUBLE-STRUCK CAPITAL	211D
+R, LATIN LETTER SMALL CAPITAL	0280
+R, LATIN LETTER SMALL CAPITAL INVERTED	0281
+R, LATIN SMALL LETTER TURNED	0279
+R, MODIFIER LETTER SMALL	02B3
+R, MODIFIER LETTER SMALL CAPITAL INVERTED	02B6
+R, MODIFIER LETTER SMALL TURNED	02B4
+R, SCRIPT CAPITAL	211B
+radial component	27DF
+radical sign	221A
+Radicals, Kangxi	2F00
+Radicals, Yi	A490
+Radicals Supplement, CJK	2E80
+RADIOACTIVE SIGN	2622
+RAIN DROPS, UMBRELLA WITH	2614
+rainy weather	2602
+RAMS HORN, LATIN SMALL LETTER	0264
+RANGE ANTIRESTRICTION, Z NOTATION	2A65
+RATIO	2236
+ratio, cross	211E
+rational numbers, the set of	211A
+real number symbol	210A
+real numbers, the set of	211D
+real part	211C
+recipe	211E
+record separator	001E
+RECORD SEPARATOR, SYMBOL FOR	241E
+RECORDER, TELEPHONE	2315
+RECORDING COPYRIGHT, SOUND	2117
+Rectangles	25AC
+RECTANGULAR PATH AROUND POLE, LINE INTEGRATION WITH	2A12
+RECYCLED PAPER SYMBOL	267C
+RECYCLING SYMBOL, BLACK UNIVERSAL	267B
+RECYCLING SYMBOL, UNIVERSAL	2672
+RECYCLING SYMBOL FOR GENERIC MATERIALS	267A
+Recycling Symbols	2672
+Recycling Symbols For Plastics	2673
+reduces to	22A6
+reducible	22A2
+REFERENCE MARK	203B
+registered trade mark sign	00AE
+RELATION, TRIPLE SOLIDUS BINARY	2AFB
+RELATION, TRIPLE VERTICAL BAR BINARY	2AF4
+relation, z notation finite	21FC
+relation, z notation partial	21F9
+RELATIONAL COMPOSITION, Z NOTATION	2A3E
+Relational Operators	2A66
+Relations	29E3
+Relations	2AF7
+Relations, Subset and superset	2ABD
+Religious and Political Symbols	2626
+Repeat Marks, Kana	3031
+REPLACEMENT CHARACTER	FFFD
+REPLACEMENT CHARACTER, OBJECT	FFFC
+resistance	2126
+RESPONSE	211F
+results in	22A8
+RETROFLEX CLICK, LATIN LETTER	01C3
+retroflex hook, latin small letter d	0256
+RETROFLEX HOOK BELOW, COMBINING	0322
+return, carriage	000D
+return, carriage	21B5
+RETURN, SYMBOL FOR CARRIAGE	240D
+RETURN SYMBOL	23CE
+reverse line feed	008D
+REVERSE SOLIDUS	005C
+REVERSE SOLIDUS, BIG	29F9
+REVERSE SOLIDUS, CIRCLED	29B8
+REVERSE SOLIDUS OPERATOR	29F5
+REVERSE SOLIDUS OVERLAY, COMBINING	20E5
+REVERSE SOLIDUS WITH HORIZONTAL STROKE	29F7
+reverse turnstile	22A3
+REVERSED, LATIN SMALL LETTER EZH	01B9
+REVERSED COMMA, MODIFIER LETTER	02BD
+REVERSED COMMA ABOVE, COMBINING	0314
+reversed comma quotation mark, double	201F
+reversed comma quotation mark, single	201B
+REVERSED DOUBLE PRIME	2036
+REVERSED DOUBLE PRIME QUOTATION MARK	301D
+REVERSED DOUBLE STROKE NOT SIGN	2AED
+REVERSED E, LATIN CAPITAL LETTER	018E
+REVERSED E, LATIN SMALL LETTER	0258
+reversed epsilon, latin small letter closed	025E
+REVERSED ESH, LATIN SMALL LETTER SQUAT	0285
+REVERSED ESH LOOP, LATIN LETTER	01AA
+reversed glottal stop, latin letter	0295
+REVERSED GLOTTAL STOP, MODIFIER LETTER	02C1
+REVERSED GLOTTAL STOP, MODIFIER LETTER SMALL	02E4
+REVERSED NEGATION SLASH, DOES NOT DIVIDE WITH	2AEE
+REVERSED NOT SIGN	2310
+REVERSED OPEN E, LATIN SMALL LETTER	025C
+REVERSED OPEN E, LATIN SMALL LETTER CLOSED	025E
+REVERSED PILCROW SIGN	204B
+REVERSED PRIME	2035
+REVERSED SANS-SERIF CAPITAL L	2143
+REVERSED SEMICOLON	204F
+reversed straight epsilon	220D
+REVERSED TILDE	223D
+REVERSED TILDE EQUALS	22CD
+REVERSED TRIPLE PRIME	2037
+RHOTIC HOOK, MODIFIER LETTER	02DE
+riemann integral	211B
+RIGHT ANGLE	221F
+RIGHT ANGLE WITH ARC	22BE
+RIGHT TRIANGLE	22BF
+RIGHT-TO-LEFT EMBEDDING	202B
+RIGHT-TO-LEFT MARK	200F
+RIGHT-TO-LEFT OVERRIDE	202E
+RIGHTHAND INTERIOR PRODUCT	2A3D
+RING, BENZENE	232C
+RING, MODIFIER LETTER CENTRED LEFT HALF	02D3
+RING, MODIFIER LETTER LEFT HALF	02BF
+RING ABOVE	02DA
+RING ABOVE, COMBINING	030A
+RING BELOW, COMBINING	0325
+RING BELOW, COMBINING LEFT HALF	031C
+RING BELOW, COMBINING RIGHT HALF	0339
+RING EQUAL TO	2257
+RING IN EQUAL TO	2256
+RING OPERATOR	2218
+RING OPERATOR, CIRCLED	229A
+RING OVERLAY, COMBINING	20D8
+RING OVERLAY, COMBINING CLOCKWISE	20D9
+RISING DIAGONAL SLASH, SQUARED	29C4
+RISING DOTS, MINUS SIGN WITH	2A2C
+RISING DOTS, TILDE OPERATOR WITH	2A6B
+rle	202B
+rlm	200F
+rlo	202E
+Roman Numerals	2160
+Romanian, Additions for	0218
+ROOT, CUBE	221B
+ROOT, FOURTH	221C
+ROOT, SQUARE	221A
+ROTATED CAPITAL Q	213A
+rotation	20D5
+rough breathing	0314
+RULE, LOZENGE DIVIDED BY HORIZONTAL	27E0
+rule, parted	00A6
+RULE-DELAYED	29F4
+Runes, Golden Number	16EE
+Runic	16A0
+RUNOUT, TOTAL	2330
+RUPEE MARK, BENGALI	09F2
+RUPEE SIGN	20A8
+RUPEE SIGN, BENGALI	09F3
+RUPEE SIGN, GUJARATI	0AF1
+RUPEE SIGN, TAMIL	0BF9
+Russian Alphabet, Basic	0410
+S, INVERTED LAZY	223E
+S, LATIN SMALL LETTER LONG	017F
+S, LATIN SMALL LETTER SHARP	00DF
+s, lazy	223D
+S, MODIFIER LETTER SMALL	02E2
+S, PERPENDICULAR WITH	2AE1
+S IN TRIANGLE	29CC
+SAFHA, ARABIC SIGN	0603
+SAGITTARIUS	2650
+SALTIRE	2613
+sam	070F
+SANAH, ARABIC SIGN	0601
+SANS-SERIF CAPITAL G, TURNED	2141
+SANS-SERIF CAPITAL L, REVERSED	2143
+SANS-SERIF CAPITAL L, TURNED	2142
+SANS-SERIF CAPITAL Y, TURNED	2144
+Sanskrit and Tibetan, Mongolian Extensions for	1880
+satisfies	22A8
+satisfies, necessarily	2AF1
+satisfies, ordinarily	2AE2
+SATURN	2644
+SCHEMA COMPOSITION, Z NOTATION	2A1F
+schema hiding, z notation	29F9
+SCHEMA PIPING, Z NOTATION	2A20
+SCHEMA PROJECTION, Z NOTATION	2A21
+SCHWA, LATIN CAPITAL LETTER	018F
+SCHWA, LATIN SMALL LETTER	0259
+Scissors Dingbats	2701
+SCORPIUS	264F
+SCREEN, COMBINING ENCLOSING	20E2
+script a, latin small letter	0251
+SCRIPT CAPITAL B	212C
+SCRIPT CAPITAL E	2130
+SCRIPT CAPITAL F	2131
+SCRIPT CAPITAL H	210B
+SCRIPT CAPITAL I	2110
+SCRIPT CAPITAL L	2112
+SCRIPT CAPITAL M	2133
+SCRIPT CAPITAL P	2118
+SCRIPT CAPITAL R	211B
+script f, latin small letter	0192
+SCRIPT G, LATIN SMALL LETTER	0261
+SCRIPT SMALL E	212F
+SCRIPT SMALL G	210A
+SCRIPT SMALL L	2113
+SCRIPT SMALL O	2134
+script v, latin capital letter	01B2
+script v, latin small letter	028B
+Scripts Area, General	0000
+scrolling	21F3
+SCRUPLE	2108
+SEAGULL BELOW, COMBINING	033C
+second transfinite cardinal (the continuum)	2136
+seconds	2033
+SECTION SIGN	00A7
+section sign, european	00B6
+SECTOR	2314
+SEGMENT	2313
+selected area, end of	0087
+selected area, start of	0086
+Selectors, Variation	FE00
+SEMICIRCULAR PATH AROUND POLE, LINE INTEGRATION WITH	2A13
+SEMICOLON	003B
+SEMICOLON, ARABIC	061B
+SEMICOLON, ETHIOPIC	1364
+SEMICOLON, REVERSED	204F
+SEMIDIRECT PRODUCT, LEFT	22CB
+SEMIDIRECT PRODUCT WITH BOTTOM CLOSED	2A32
+SEPARATOR DOT, AEGEAN WORD	10101
+SEPARATOR LINE, AEGEAN WORD 	10100
+SEPARATOR, ARABIC DECIMAL	066B
+SEPARATOR, ARABIC THOUSANDS	066C
+separator, decimal	002C
+separator, devanagari phrase	0964
+separator, file	001C
+SEPARATOR, GEORGIAN PARAGRAPH	10FB
+separator, group	001D
+SEPARATOR, INVISIBLE	2063
+SEPARATOR, LINE	2028
+SEPARATOR, PARAGRAPH	2029
+separator, record	001E
+SEPARATOR, SYMBOL FOR FILE	241C
+SEPARATOR, SYMBOL FOR GROUP	241D
+SEPARATOR, SYMBOL FOR RECORD	241E
+SEPARATOR, SYMBOL FOR UNIT	241F
+separator, unit	001F
+separator, urdu paragraph	203B
+SEPARATOR KEY SYMBOL, DECIMAL	2396
+sequence concatenation, z notation	2040
+sequence introducer, control	009B
+Serbian Cyrillic Letters, Croatian Digraphs Matching	01C4
+SERIFS, CLOSED INTERSECTION WITH	2A4D
+SERIFS, CLOSED UNION WITH	2A4C
+SERIFS AND SMASH PRODUCT, CLOSED UNION WITH	2A50
+SERIFS AT BOTTOM, TRIANGLE WITH	29CD
+SERVICE MARK	2120
+SESAME DOT	FE45
+SESAME DOT, WHITE	FE46
+SET, EMPTY	2205
+set, included in	2282
+set, includes in	2283
+set, null	2205
+set, power	2118
+SET MINUS	2216
+set of complex numbers, the	2102
+set of integers, the	2124
+set of rational numbers, the	211A
+set of real numbers, the	211D
+set transmit state	0093
+Sets, Empty	29B0
+sextile	2736
+Shade Characters	2591
+shamrock	2663
+Shapes, Geometric	25A0
+SHARP S, LATIN SMALL LETTER	00DF
+SHARP SIGN, MUSIC	266F
+Shavian	10450
+SHEQEL SIGN, NEW	20AA
+shift	21E7
+shift in	000F
+SHIFT IN, SYMBOL FOR	240F
+shift out	000E
+SHIFT OUT, SYMBOL FOR	240E
+shilling	002F
+SHOGI PIECE, BLACK	2617
+SHOGI PIECE, WHITE	2616
+short	0306
+SHORT DOWN TACK	2ADF
+SHORT DOWN TACK, SHORT UP TACK ABOVE	2AE9
+SHORT DOWN TACK WITH OVERBAR	2AE7
+SHORT I WITH TAIL, CYRILLIC CAPITAL LETTER	048A
+SHORT I WITH TAIL, CYRILLIC SMALL LETTER	048B
+SHORT LEFT TACK	2ADE
+short slash overlay	0337
+SHORT SOLIDUS OVERLAY, COMBINING	0337
+SHORT STROKE OVERLAY, COMBINING	0335
+SHORT UP TACK	2AE0
+SHORT UP TACK ABOVE SHORT DOWN TACK	2AE9
+SHORT UP TACK WITH UNDERBAR	2AE8
+SHORT VERTICAL LINE OVERLAY, COMBINING	20D3
+SHOULDERED OPEN BOX	237D
+SHUFFLE PRODUCT	29E2
+shy	00AD
+Sibe Letters, Mongolian	185D
+Sidelining Emphasis Marks	FE45
+SIMILAR, SIMILAR MINUS	2A6C
+SIMILAR ABOVE GREATER-THAN, LESS-THAN ABOVE	2A8F
+SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN	2AA0
+SIMILAR ABOVE LESS-THAN, GREATER-THAN ABOVE	2A90
+SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN	2A9F
+SIMILAR MINUS SIMILAR	2A6C
+SIMILAR OR EQUAL, GREATER-THAN ABOVE	2A8E
+SIMILAR OR EQUAL, LESS-THAN ABOVE	2A8D
+SIMILAR OR GREATER-THAN	2A9E
+SIMILAR OR LESS-THAN	2A9D
+similar to	223C
+SINE WAVE	223F
+single character introducer	009A
+single comma quotation mark	2019
+single comma quotation mark, low	201A
+single guillemet, left pointing	2039
+single guillemet, right pointing	203A
+SINGLE HIGH-REVERSED-9 QUOTATION MARK	201B
+SINGLE LEFT-POINTING ANGLE QUOTATION MARK	2039
+SINGLE LOW-9 QUOTATION MARK	201A
+SINGLE PUNCTUATION, PHILIPPINE	1735
+SINGLE QUOTATION MARK, LEFT	2018
+SINGLE QUOTATION MARK, RIGHT	2019
+single reversed comma quotation mark	201B
+SINGLE RIGHT-POINTING ANGLE QUOTATION MARK	203A
+single shift three	008F
+single shift two	008E
+single turned comma quotation mark	2018
+Sinhala	0D80
+SIX-PER-EM SPACE	2006
+SIXTEENTH NOTES, BEAMED	266C
+Sixths, Fractions	2159
+SKULL AND CROSSBONES	2620
+slash	002F
+SLASH, CIRCLED DIVISION	2298
+SLASH, DIVISION	2215
+SLASH, DOES NOT DIVIDE WITH REVERSED NEGATION	2AEE
+SLASH, FRACTION	2044
+SLASH, INTEGRAL AVERAGE WITH	2A0F
+SLASH, SQUARED FALLING DIAGONAL	29C5
+SLASH, SQUARED RISING DIAGONAL	29C4
+slash overlay, long	0338
+slash overlay, short	0337
+SLOPE	2333
+SLOPING LARGE AND	2A58
+SLOPING LARGE OR	2A57
+Slovenian and Croatian, Additions for	0200
+SMALL CAPITAL B, LATIN LETTER	0299
+SMALL CAPITAL G, LATIN LETTER	0262
+SMALL CAPITAL H, LATIN LETTER	029C
+SMALL CAPITAL I, LATIN LETTER	026A
+SMALL CAPITAL INVERTED R, LATIN LETTER	0281
+SMALL CAPITAL INVERTED R, MODIFIER LETTER	02B6
+SMALL CAPITAL L, LATIN LETTER	029F
+SMALL CAPITAL N, LATIN LETTER	0274
+SMALL CAPITAL OE, LATIN LETTER	0276
+SMALL CAPITAL R, LATIN LETTER	0280
+SMALL CAPITAL Y, LATIN LETTER	028F
+small circle, black	2022
+SMALL CIRCLE, SQUARED	29C7
+SMALL CIRCLE ABOVE, PLUS SIGN WITH	2A22
+SMALL CIRCLE TO THE RIGHT, CIRCLE WITH	29C2
+SMALL CONTAINS AS MEMBER	220D
+SMALL CONTAINS WITH OVERBAR	22FE
+SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE	22FC
+SMALL D, DOUBLE-STRUCK ITALIC	2146
+SMALL E, DOUBLE-STRUCK ITALIC	2147
+SMALL ELEMENT OF	220A
+SMALL ELEMENT OF WITH OVERBAR	22F7
+SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE	22F4
+Small Form Variants	FE50
+SMALL GAMMA, DOUBLE-STRUCK	213D
+SMALL I, DOUBLE-STRUCK ITALIC	2148
+SMALL J, DOUBLE-STRUCK ITALIC	2149
+Small Letters, Armenian	0561
+Small Letters, Combining Latin	0363
+Small Letters, Cyrillic	0430
+Small Letters, Georgian	10D0
+Small Letters, Greek	03B1
+Small Letters, Latin	0061
+SMALL SQUARE, BLACK MEDIUM	25FE
+SMALL SQUARE, WHITE MEDIUM	25FD
+SMALL VEE WITH UNDERBAR	2A61
+SMALLER THAN	2AAA
+SMALLER THAN OR EQUAL TO	2AAC
+SMASH PRODUCT	2A33
+SMASH PRODUCT, CLOSED UNION WITH SERIFS AND	2A50
+SMILE	2323
+SMILING FACE, BLACK	263B
+SMILING FACE, WHITE	263A
+smooth breathing	0313
+Snowflake Dingbats	2744
+Snowflakes, Stars, Asterisks and	2721
+SNOWMAN	2603
+snowy weather	2603
+SOFT HYPHEN	00AD
+SOFTWARE-FUNCTION SYMBOL	2394
+solid	2588
+SOLIDUS	002F
+solidus	2044
+SOLIDUS, BIG	29F8
+SOLIDUS, BIG REVERSE	29F9
+SOLIDUS, CIRCLED REVERSE	29B8
+SOLIDUS, REVERSE	005C
+SOLIDUS BINARY RELATION, TRIPLE	2AFB
+SOLIDUS OPERATOR, DOUBLE	2AFD
+SOLIDUS OPERATOR, REVERSE	29F5
+SOLIDUS OVERLAY, COMBINING LONG	0338
+SOLIDUS OVERLAY, COMBINING REVERSE	20E5
+SOLIDUS OVERLAY, COMBINING SHORT	0337
+SOLIDUS WITH HORIZONTAL STROKE, REVERSE	29F7
+SOLIDUS WITH OVERBAR	29F6
+SOUND RECORDING COPYRIGHT	2117
+SOURCE, INFORMATION	2139
+SPACE	0020
+SPACE, EM	2003
+SPACE, EN	2002
+SPACE, FIGURE	2007
+SPACE, FOUR-PER-EM	2005
+space, graphic for	2422
+space, graphic for	2423
+space, graphic for no break	237D
+SPACE, HAIR	200A
+SPACE, IDEOGRAPHIC	3000
+SPACE, MEDIUM MATHEMATICAL	205F
+space, mid	2005
+SPACE, NARROW NO-BREAK	202F
+SPACE, NO-BREAK	00A0
+SPACE, PUNCTUATION	2008
+SPACE, SIX-PER-EM	2006
+SPACE, SYMBOL FOR	2420
+space, thick	2004
+SPACE, THIN	2009
+SPACE, THREE-PER-EM	2004
+SPACE, ZERO WIDTH	200B
+SPACE, ZERO WIDTH NO-BREAK	FEFF
+SPACE MARK, OGHAM	1680
+Spaces	2000
+spacing acute	00B4
+spacing cedilla	00B8
+spacing circumflex	005E
+Spacing Clones of Diacritics	02D8
+spacing diaeresis	00A8
+spacing double underscore	2017
+spacing grave	0060
+spacing macron	00AF
+Spacing Modifier Letters	02B0
+spacing overscore	203E
+spacing underscore	005F
+spanish currency	20A7
+Special character extensions	23AE
+Specialized plus sign operators	29FA
+Specials	FFF0
+Specials Area, Compatibility and	F900
+SPHERICAL ANGLE	2222
+SPHERICAL ANGLE OPENING LEFT	29A0
+SPHERICAL ANGLE OPENING UP	29A1
+SPOT, Z NOTATION	2981
+SQUARE, BLACK MEDIUM	25FC
+SQUARE, BLACK MEDIUM SMALL	25FE
+SQUARE, COMBINING ENCLOSING	20DE
+SQUARE, VIEWDATA	2317
+SQUARE, WHITE MEDIUM	25FB
+SQUARE, WHITE MEDIUM SMALL	25FD
+SQUARE BELOW, COMBINING	033B
+square bracket, closing	005D
+SQUARE BRACKET, LEFT	005B
+SQUARE BRACKET, LEFT WHITE	301A
+square bracket, opening	005B
+SQUARE BRACKET, RIGHT	005D
+SQUARE BRACKET WITH QUILL, LEFT	2045
+SQUARE CAP	2293
+SQUARE CORPORATION	337F
+SQUARE CUP	2294
+SQUARE FOOT	23CD
+SQUARE IMAGE OF	228F
+SQUARE INTERSECTION, DOUBLE	2A4E
+SQUARE INTERSECTION OPERATOR, N-ARY	2A05
+SQUARE LEFT OPEN BOX OPERATOR	2ACD
+SQUARE LOZENGE	2311
+SQUARE ORIGINAL OF	2290
+SQUARE RIGHT OPEN BOX OPERATOR	2ACE
+SQUARE ROOT	221A
+Square Symbols	29C4
+SQUARE UNION, DOUBLE	2A4F
+SQUARE UNION OPERATOR, N-ARY	2A06
+SQUARE WITH CONTOURED OUTLINE	29E0
+SQUARE WITH LEFTWARDS TICK, WHITE	27E4
+SQUARE WITH RIGHTWARDS TICK, WHITE	27E5
+squared	00B2
+SQUARED DOT OPERATOR	22A1
+Squared Japanese Katakana Words	3300
+Squared Latin Abbreviations	3371
+SQUARED MINUS	229F
+SQUARED PLUS	229E
+SQUARED TIMES	22A0
+Squares	25A0
+SQUAT REVERSED ESH, LATIN SMALL LETTER	0285
+st. andrew's cross	2613
+star	002A
+STAR, ARABIC FIVE POINTED	066D
+STAR, BLACK	2605
+STAR AND CRESCENT	262A
+Star Dingbats	2726
+STAR EQUALS	225B
+STAR OF DAVID	2721
+STAR OPERATOR	22C6
+starburst	273A
+STARK, GLEICH	29E6
+Stars, Asterisks and Snowflakes	2721
+start of guarded area	0096
+start of heading	0001
+START OF HEADING, SYMBOL FOR	2401
+start of selected area	0086
+start of string	0098
+start of text	0002
+START OF TEXT, SYMBOL FOR	2402
+statement is true	22A8
+sterling, pound	00A3
+stile, apl	2223
+straight epsilon	220A
+straight epsilon, reversed	220D
+stress mark	0301
+STRETCHED C, LATIN LETTER	0297
+STRICTLY EQUIVALENT TO	2263
+string, device control	0090
+string, start of	0098
+string terminator	009C
+STROKE OVERLAY, COMBINING LONG	0336
+STROKE OVERLAY, COMBINING SHORT	0335
+SUBGROUP, CONTAINS AS NORMAL	22B3
+SUBGROUP OF, NORMAL	22B2
+subscript, iota	0345
+Subscript Digits	2080
+SUBSCRIPT EQUALS SIGN	208C
+SUBSCRIPT LEFT PARENTHESIS	208D
+SUBSCRIPT MINUS	208B
+SUBSCRIPT PLUS SIGN	208A
+SUBSCRIPT TWO, PLUS SIGN WITH	2A27
+Subscripts	2080
+SUBSET, DOUBLE	22D0
+Subset and Superset Relations	2ABD
+SUBSET OF	2282
+substitute	001A
+SUBSTITUTE, SYMBOL FOR	241A
+SUBSTITUTE FORM TWO, SYMBOL FOR	2426
+Subtending Marks, Arabic	0600
+subtraction, z notation bag	2A41
+SUCCEEDS	227B
+SUCCEEDS, DOUBLE	2ABC
+SUCCEEDS ABOVE ALMOST EQUAL TO	2AB8
+SUCCEEDS ABOVE EQUALS SIGN	2AB4
+SUCCEEDS ABOVE NOT ALMOST EQUAL TO	2ABA
+SUCCEEDS ABOVE NOT EQUAL TO	2AB6
+SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN	2AB0
+SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO	2AB2
+SUCCEEDS UNDER RELATION	22B1
+such that	220B
+such that	2223
+Suits, Playing Card	2660
+sum, direct	2295
+SUM, MODULO TWO	2A0A
+sum, positive difference or	2A24
+sum or positive difference	2A26
+SUMMATION, DOUBLE-STRUCK N-ARY	2140
+SUMMATION, N-ARY	2211
+SUMMATION BOTTOM	23B3
+Summation Sign Parts	23B2
+SUMMATION TOP	23B2
+Summations and Integrals	2A0A
+SUN	2609
+SUN WITH RAYS, BLACK	2600
+SUPERIMPOSED X, CIRCLE WITH	29BB
+SUPERSCRIPT ALEF, ARABIC LETTER	0670
+Superscript Digits	2070
+SUPERSCRIPT EQUALS SIGN	207C
+SUPERSCRIPT LATIN SMALL LETTER I	2071
+SUPERSCRIPT LEFT PARENTHESIS	207D
+Superscript Letter Diacritics, Medieval	0363
+SUPERSCRIPT MINUS	207B
+SUPERSCRIPT ONE	00B9
+SUPERSCRIPT PLUS SIGN	207A
+SUPERSCRIPT THREE	00B3
+SUPERSCRIPT TWO	00B2
+SUPERSCRIPT ZERO	2070
+Superscripts	2070
+Superscripts and Subscripts	2070
+SUPERSET, DOUBLE	22D1
+SUPERSET OF	2283
+Superset Relations, Subset and	2ABD
+Supplemental Arrows-A	27F0
+Supplemental Arrows-B	2900
+Supplemental Mathematical Operators	2A00
+Supplementary, Cyrillic	0500
+Supplementary Private Use Area-A	F0000
+Supplementary Private Use Area-B	100000
+SURFACE INTEGRAL	222F
+surjection, z notation finite	2901
+surjection, z notation partial	2900
+surjective injection, z notation	2917
+surjective injection, z notation finite	2918
+Surrogates, High	D800
+Surrogates, Low	DC00
+Surrogates Area	D800
+swedish grave accent	02DF
+SWUNG DASH	2053
+Syllabics, Unified Canadian Aboriginal	1400
+Syllables, Yi	A000
+Syllables Area, Korean Hangul	AC00
+Symbol Variants, Fullwidth	FFE0
+Symbols, Bowtie	29D1
+Symbols, Circle	29B5
+Symbols, Combining Diacritical Marks for	20D0
+Symbols, Dentistry Notation	23BE
+Symbols, Double-Struck Italic Mathematical	2145
+Symbols, Error Bar	29EE
+Symbols, Greek	03D0
+Symbols, Japanese Chess	2616
+Symbols, Letterlike	2100
+Symbols, Miscellaneous	2600
+Symbols, Recycling	2672
+Symbols, Square	29C4
+Symbols, Triangle	29CA
+Symbols and Arrows, Miscellaneous	2B00
+Symbols and Punctuation, CJK	3000
+Symbols Area	2000
+Symbols Area, CJK Phonetics and	2E00
+Symbols for Control Codes, Graphic	2400
+Symbols For Plastics, Recycling	2673
+Symbols-A, Miscellaneous Mathematical	27C0
+Symbols-B, Miscellaneous Mathematical	2980
+symmetric difference	2238
+symmetric difference	2296
+SYMMETRIC SWAPPING, ACTIVATE	206B
+SYMMETRIC SWAPPING, INHIBIT	206A
+SYMMETRY	232F
+synchronous idle	0016
+SYNCHRONOUS IDLE, SYMBOL FOR	2416
+Syriac	0700
+SYRIAC ABBREVIATION MARK	070F
+SYRIAC CROSS, EAST	2671
+SYRIAC CROSS, WEST	2670
+Syriac Format Control	070F
+T, COMBINING LATIN SMALL LETTER	036D
+T, LATIN SMALL LETTER TURNED	0287
+tab	0009
+tab, leftward	21E4
+tab, rightward	21E5
+tab, symbol for	2409
+tab with shift tab	21B9
+tabulation, horizontal	0009
+TABULATION, SYMBOL FOR HORIZONTAL	2409
+TABULATION, SYMBOL FOR VERTICAL	240B
+tabulation, vertical	000B
+tabulation set, character	0088
+tabulation set, line	008A
+tabulation with justification, character	0089
+TACK, LEFT	22A3
+TACK, MODIFIER LETTER UP	02D4
+TACK, RIGHT	22A2
+TACK, UP	22A5
+TACK BELOW, COMBINING LEFT	0318
+TACK BELOW, COMBINING UP	031D
+Tacks and Turnstiles	27D8
+Tacks and Turnstiles	2ADE
+Tagalog	1700
+TAGALOG SIGN VIRAMA	1714
+Tagbanwa	1760
+Tai Le	1950
+Tai Xuan Jing Symbols	1D300
+TAIL FRAGMENT, ARABIC	FE73
+Tails, Fish	297C
+tainome (japanese, a kind of bullet)	25C9
+TAKE, PRESCRIPTION	211E
+Tamil	0B80
+Tamil Digits	0BE7
+Tamil Letters	0B85
+TAMIL RUPEE SIGN	0BF9
+TAMIL NUMBER SIGN	0BFA
+Tamil Symbols	0BF3
+TAPE DRIVE	2707
+TAPER, CONICAL	2332
+TAURUS	2649
+tautological equivalent	29E6
+tautology	22A8
+tea	2615
+Technical, Miscellaneous	2300
+TEE TOP, PITCHFORK WITH	2ADA
+Telegraph Symbols for Days	33E0
+Telegraph Symbols for Hours	3358
+Telegraph Symbols for Months	32C0
+TELEPHONE, BLACK	260E
+TELEPHONE LOCATION SIGN	2706
+TELEPHONE RECORDER	2315
+TELEPHONE SIGN	2121
+Telugu	0C00
+Telugu Digits	0C66
+Telugu Letters	0C05
+TEN THOUSAND SIGN, PER	2031
+tensor	20E1
+tensor product	2297
+Terminal graphic characters	23B7
+Terminal Graphic Characters	2596
+Terminal Graphics, Scan Lines For	23BA
+terminator, string	009C
+Tetragram Symbols, Tai Xuan Jing	1D306
+text, end of	0003
+text, start of	0002
+TEXT, SYMBOL FOR END OF	2403
+TEXT, SYMBOL FOR START OF	2402
+Thaana	0780
+Thai	0E00
+THAI CURRENCY SYMBOL BAHT	0E3F
+Thai Digits	0E50
+Thai Letters	0E01
+THERE EXISTS	2203
+THEREFORE	2234
+THERMODYNAMIC	29E7
+thick space	2004
+THIN SPACE	2009
+third derivative	20DB
+third transfinite cardinal (functions of a real variable)	2137
+Thirds, Fractions	2153
+THORN, LATIN CAPITAL LETTER	00DE
+THORN, LATIN SMALL LETTER	00FE
+THOUSANDS SEPARATOR, ARABIC	066C
+THOUSANDS SIGN, CYRILLIC	0482
+THREE, SUPERSCRIPT	00B3
+three dot leader	2026
+THREE DOTS ABOVE, COMBINING	20DB
+THREE QUARTERS, VULGAR FRACTION	00BE
+THREE-PER-EM SPACE	2004
+THUNDERSTORM	2608
+Tibetan	0F00
+Tibetan, Mongolian Extensions for Sanskrit and	1880
+Tibetan Digits	0F20
+Tibetan Letters	0F40
+TICK, WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS	27E2
+TICK, WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS	27E3
+TICK, WHITE SQUARE WITH LEFTWARDS	27E4
+TICK, WHITE SQUARE WITH RIGHTWARDS	27E5
+TIE, CHARACTER	2040
+tie, ligature	0361
+TIE OVER INFINITY	29DD
+TILDE	007E
+tilde, apl	223C
+TILDE, COMBINING	0303
+TILDE, COMBINING DOUBLE	0360
+TILDE, COMBINING VERTICAL	033E
+TILDE, MINUS	2242
+TILDE, REVERSED	223D
+TILDE, SMALL	02DC
+TILDE, TRIPLE	224B
+TILDE ABOVE, COMBINING NOT	034A
+TILDE BELOW, COMBINING	0330
+TILDE EQUALS, REVERSED	22CD
+TILDE LEFT HALF, COMBINING DOUBLE	FE22
+TILDE OPERATOR	223C
+TILDE OPERATOR, EQUALS SIGN ABOVE	2A73
+TILDE OPERATOR, PARALLEL WITH	2AF3
+TILDE OPERATOR, SUBSET OF ABOVE	2AC7
+TILDE OPERATOR, SUPERSET OF ABOVE	2AC8
+TILDE OPERATOR WITH DOT ABOVE	2A6A
+TILDE OPERATOR WITH RISING DOTS	2A6B
+TILDE OVERLAY, COMBINING	0334
+TIMES, CIRCLED	2297
+TIMES, DIVISION	22C7
+TIMES, INVISIBLE	2062
+TIMES, SQUARED	22A0
+TIMES OPERATOR, N-ARY	2A09
+TIMES OPERATOR, N-ARY CIRCLED	2A02
+TIMES SIGN, INTEGRAL WITH	2A18
+TIMES WITH LEFT HALF BLACK	29D4
+TIMES WITH RIGHT HALF BLACK	29D5
+TINY	29FE
+TIRONIAN SIGN ET	204A
+TIS 620-2529 (Thai), Based on	0E01
+Todo Letters, Mongolian	1843
+Tone Bar Letters	02E5
+TONE FIVE, LATIN SMALL LETTER	01BD
+TONE MARK, COMBINING ACUTE	0341
+TONE MARK, COMBINING GRAVE	0340
+Tone Marks, Ideographic	302A
+Tone Marks, Vietnamese	0340
+TONE SIX, LATIN SMALL LETTER	0185
+TONE TWO, LATIN SMALL LETTER	01A8
+tonos	0301
+TONOS, COMBINING GREEK DIALYTIKA	0344
+TOP HALF INTEGRAL	2320
+TOP LEFT CORNER	231C
+TOP LEFT CROP	230F
+TORTOISE SHELL BRACKET, LEFT	3014
+TORTOISE SHELL BRACKET, LEFT WHITE	3018
+TOTAL RUNOUT	2330
+TRADE MARK SIGN	2122
+trade mark sign, registered	00AE
+transfinite cardinal, fourth	2138
+transfinite cardinal (countable), first	2135
+transfinite cardinal (functions of a real variable), third	2137
+transfinite cardinal (the continuum), second	2136
+transmission, end of	0004
+transmission, graphic for end of	2301
+TRANSMISSION, SYMBOL FOR END OF	2404
+transmission block, end of	0017
+TRANSMISSION BLOCK, SYMBOL FOR END OF	2417
+transmit state, set	0093
+TRANSVERSAL INTERSECTION	2ADB
+TRIANGLE, COMBINING ENCLOSING UPWARD POINTING	20E4
+TRIANGLE, LOWER LEFT	25FA
+TRIANGLE, LOWER RIGHT	25FF
+TRIANGLE, MINUS SIGN IN	2A3A
+TRIANGLE, MULTIPLICATION SIGN IN	2A3B
+TRIANGLE, PLUS SIGN IN	2A39
+TRIANGLE, PLUS SIGN WITH BLACK	2A28
+TRIANGLE, RIGHT	22BF
+TRIANGLE, UPPER LEFT	25F8
+TRIANGLE, UPPER RIGHT	25F9
+TRIANGLE, VERTICAL BAR BESIDE RIGHT	29D0
+TRIANGLE OPERATOR, LARGE LEFT	2A1E
+Triangle symbols	29CA
+TRIANGLE WITH LEFT HALF BLACK, DOWN-POINTING	29E8
+TRIANGLE WITH RIGHT HALF BLACK, DOWN-POINTING	29E9
+Triangles	25B2
+TRIANGULAR BULLET	2023
+TRIANGULAR COLON, MODIFIER LETTER	02D0
+TRIANGULAR COLON, MODIFIER LETTER HALF	02D1
+Trigram Symbols, Yijing	2630
+trine	25B3
+TRIPLE COLON OPERATOR	2AF6
+TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE	2A68
+TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE	2A69
+TRIPLE INTEGRAL	222D
+TRIPLE NESTED GREATER-THAN	2AF8
+TRIPLE NESTED LESS-THAN	2AF7
+TRIPLE PLUS	29FB
+TRIPLE PRIME	2034
+TRIPLE PRIME, REVERSED	2037
+TRIPLE RIGHT TURNSTILE, VERTICAL BAR	2AE2
+TRIPLE SOLIDUS BINARY RELATION	2AFB
+TRIPLE TILDE	224B
+TRIPLE UNDERDOT, COMBINING	20E8
+TRIPLE VERTICAL BAR BINARY RELATION	2AF4
+TRIPLE VERTICAL BAR DELIMITER	2980
+TRIPLE VERTICAL BAR OPERATOR, LARGE	2AFC
+TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE	2AF5
+TRIPLE VERTICAL STROKE, TRIPLE HORIZONTAL BAR WITH	2A69
+TRUE	22A8
+TUGRIK SIGN	20AE
+turbofan	274B
+turkish currency	20A4
+TURNED A, LATIN SMALL LETTER	0250
+TURNED ALPHA, LATIN SMALL LETTER	0252
+TURNED AMPERSAND	214B
+TURNED ANGLE	29A2
+TURNED CAPITAL F	2132
+TURNED COMMA, MODIFIER LETTER	02BB
+TURNED COMMA ABOVE, COMBINING	0312
+turned comma quotation mark, double	201C
+turned comma quotation mark, single	2018
+TURNED DELTA, LATIN SMALL LETTER	018D
+turned e, latin capital letter	018E
+TURNED E, LATIN SMALL LETTER	01DD
+TURNED GREEK SMALL LETTER IOTA	2129
+TURNED H, LATIN SMALL LETTER	0265
+TURNED K, LATIN SMALL LETTER	029E
+TURNED M, LATIN CAPITAL LETTER	019C
+TURNED M, LATIN SMALL LETTER	026F
+TURNED NOT SIGN	2319
+turned question mark	00BF
+TURNED R, LATIN SMALL LETTER	0279
+TURNED R, MODIFIER LETTER SMALL	02B4
+TURNED SANS-SERIF CAPITAL G	2141
+TURNED SANS-SERIF CAPITAL L	2142
+TURNED SANS-SERIF CAPITAL Y	2144
+TURNED T, LATIN SMALL LETTER	0287
+TURNED V, LATIN SMALL LETTER	028C
+TURNED W, LATIN SMALL LETTER	028D
+TURNED Y, LATIN SMALL LETTER	028E
+turnstile	22A2
+turnstile, reverse	22A3
+Turnstiles, Tacks and	27D8
+Turnstiles, Tacks and	2ADE
+TWO, SUPERSCRIPT	00B2
+TWO DOT LEADER	2025
+TWO-HEADED ARROW FROM BAR, RIGHTWARDS	2905
+TWO-HEADED ARROW WITH TAIL, RIGHTWARDS	2916
+TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE, RIGHTWARDS	2917
+TYPE COLON, Z NOTATION	2982
+U, COMBINING LATIN SMALL LETTER	0367
+Ugaritic	10380
+UMBRELLA	2602
+UMBRELLA WITH RAIN DROPS	2614
+umlaut	0308
+UNASPIRATED, MODIFIER LETTER	02ED
+UNDERDOT, COMBINING TRIPLE	20E8
+underline	0332
+underline, double	0333
+UNDERLINE SYMBOL, CONTINUOUS	2381
+UNDERLINE SYMBOL, DISCONTINUOUS	2382
+underscore	0332
+underscore, double	0333
+underscore, spacing	005F
+underscore, spacing double	2017
+Underscores, Overscores and	FE49
+UNDERTIE	203F
+UNDERTIE, INVERTED	2054
+UNDO SYMBOL	238C
+undoable delete	2425
+UNION	222A
+UNION, DOUBLE	22D3
+UNION, DOUBLE SQUARE	2A4F
+UNION, INTEGRAL WITH	2A1A
+UNION, INTERSECTION ABOVE	2A47
+UNION, INTERSECTION ABOVE BAR ABOVE	2A49
+UNION, MULTISET	228E
+UNION, N-ARY	22C3
+UNION, UNION BESIDE AND JOINED WITH	2A4A
+UNION ABOVE BAR ABOVE INTERSECTION	2A48
+UNION ABOVE INTERSECTION	2A46
+UNION BESIDE AND JOINED WITH UNION	2A4A
+UNION OPERATOR, N-ARY SQUARE	2A06
+UNION OPERATOR WITH DOT, N-ARY	2A03
+UNION OPERATOR WITH PLUS, N-ARY	2A04
+UNION WITH LOGICAL OR	2A45
+UNION WITH MINUS SIGN	2A41
+UNION WITH OVERBAR	2A42
+UNION WITH SERIFS, CLOSED	2A4C
+UNION WITH SERIFS AND SMASH PRODUCT, CLOSED	2A50
+Unions, Intersections and	2A40
+unique element	2129
+unit separator	001F
+UNIT SEPARATOR, SYMBOL FOR	241F
+UNIVERSAL RECYCLING SYMBOL	2672
+UNIVERSAL RECYCLING SYMBOL, BLACK	267B
+up, page	21DE
+UP ARROWHEAD	2303
+UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS	2324
+UP RIGHT DIAGONAL ELLIPSIS	22F0
+UP TACK	22A5
+UP TACK, MODIFIER LETTER	02D4
+UP TACK BELOW, COMBINING	031D
+UPA Modifiers	02EF
+UPPER BLADE SCISSORS	2701
+UPPER RIGHT PENCIL	2710
+UPSILON, LATIN CAPITAL LETTER	01B1
+UPSILON, LATIN SMALL LETTER	028A
+upstile, apl	2308
+UPWARDS ARROW BELOW, COMBINING	034E
+URANUS	2645
+Urdu, Eastern Arabic-Indic Digits for Persian and	06F0
+urdu paragraph separator	203B
+V, COMBINING LATIN SMALL LETTER	036E
+v, latin capital letter script	01B2
+v, latin small letter script	028B
+V, LATIN SMALL LETTER TURNED	028C
+V WITH HOOK, LATIN CAPITAL LETTER	01B2
+valentine	2665
+valid	22A8
+varia	0300
+Variation Selectors	FE00
+Variation Selectors Supplement	E0100
+varies with (proportional to)	223C
+vector	20D0
+vector	20D6
+VECTOR OR CROSS PRODUCT	2A2F
+vector pointing into page	2295
+vector pointing into page	2297
+vector pointing out of page	2299
+vee	2228
+vee above	030C
+VEE WITH UNDERBAR, SMALL	2A61
+venus	2640
+VERSICLE	2123
+VERTICAL, LONG DASH FROM LEFT MEMBER OF DOUBLE	2AE6
+vertical bar	007C
+vertical bar, broken	00A6
+VERTICAL BAR, CIRCLED	29B6
+VERTICAL BAR, N-ARY WHITE	2AFF
+VERTICAL BAR, WHITE	2AFE
+VERTICAL BAR BINARY RELATION, TRIPLE	2AF4
+VERTICAL BAR DELIMITER, TRIPLE	2980
+Vertical Bar Dingbats	2758
+VERTICAL BAR OPERATOR, LARGE TRIPLE	2AFC
+VERTICAL BAR WITH HORIZONTAL STROKE, TRIPLE	2AF5
+vertical bowtie	29D6
+VERTICAL BOX LINE, LEFT	23B8
+VERTICAL BOX LINE, RIGHT	23B9
+Vertical brackets	23B4
+VERTICAL ELLIPSIS	22EE
+VERTICAL IDEOGRAPHIC ITERATION MARK	303B
+VERTICAL KANA REPEAT MARK	3031
+VERTICAL LINE	007C
+VERTICAL LINE, DOUBLE	2016
+VERTICAL LINE, MODIFIER LETTER	02C8
+VERTICAL LINE, MODIFIER LETTER LOW	02CC
+VERTICAL LINE ABOVE, COMBINING	030D
+VERTICAL LINE ABOVE, COMBINING DOUBLE	030E
+VERTICAL LINE BELOW, COMBINING	0329
+VERTICAL LINE BELOW, COMBINING DOUBLE	0348
+VERTICAL LINE EXTENSION	23D0
+Vertical Line Operators	2AEE
+VERTICAL LINE OVERLAY, COMBINING LONG	20D2
+VERTICAL LINE OVERLAY, COMBINING SHORT	20D3
+VERTICAL LINE WITH CIRCLE ABOVE	2AEF
+VERTICAL LINE WITH CIRCLE BELOW	2AF0
+VERTICAL LINE WITH MIDDLE DOT	237F
+VERTICAL STROKE OVERLAY, COMBINING DOUBLE	20E6
+vertical tabulation	000B
+VERTICAL TABULATION, SYMBOL FOR	240B
+Vertical Text, Double Punctuation For	2047
+VERTICAL TILDE, COMBINING	033E
+Vertical Variants, Glyphs for	FE30
+VERTICAL ZIGZAG LINE	299A
+VERY MUCH GREATER-THAN	22D9
+VERY MUCH LESS-THAN	22D8
+VICTORY HAND	270C
+Vietnamese, Latin Extensions for	1EA0
+vietnamese currency	20AB
+Vietnamese Tone Marks	0340
+VIEWDATA SQUARE	2317
+vinculum	0305
+viram, deergh	0965
+viram, purna	0964
+VIRAMA, BENGALI SIGN	09CD
+VIRAMA, DEVANAGARI SIGN	094D
+VIRAMA, GUJARATI SIGN	0ACD
+VIRAMA, GURMUKHI SIGN	0A4D
+VIRAMA, KANNADA SIGN	0CCD
+VIRAMA, MALAYALAM SIGN	0D4D
+VIRAMA, ORIYA SIGN	0B4D
+VIRAMA, TAGALOG SIGN	1714
+VIRAMA, TAMIL SIGN	0BCD
+VIRAMA, TELUGU SIGN	0C4D
+VIRGO	264D
+virgule	002F
+VOICED FRICATIVE, LATIN LETTER PHARYNGEAL	0295
+VOICED SOUND MARK, COMBINING KATAKANA-HIRAGANA	3099
+VOICED SOUND MARK, KATAKANA-HIRAGANA	309B
+VOICING, MODIFIER LETTER	02EC
+VOLUME INTEGRAL	2230
+VOLTAGE SIGN, HIGH	26A1
+vrachy	0306
+VS1	FE00
+W, LATIN SMALL LETTER TURNED	028D
+W, MODIFIER LETTER SMALL	02B7
+WARNING SIGN	26A0
+Warning Signs	2620
+Warning Signs	26A0
+WATCH	231A
+WAVE, SINE	223F
+WAVE DASH	301C
+WAVY DASH	3030
+WAVY LINE	2307
+WAVY LOW LINE	FE4F
+WAVY OVERLINE	FE4B
+WAVY OVERLINE, DOUBLE	FE4C
+Weather and Astrological Symbols	2600
+wedge	028C
+wedge	2227
+weierstrass elliptic function	2118
+WHEEL OF DHARMA	2638
+WHITE BULLET, CIRCLED	29BE
+WHITE CIRCLE WITH DOT RIGHT	2686
+WHITE CIRCLE WITH DOWN ARROW	29EC
+WHITE CIRCLE WITH TWO DOTS	2687
+WHITE CONCAVE-SIDED DIAMOND	27E1
+WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK	27E2
+WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK	27E3
+WHITE DIAMOND WITH CENTRED DOT	27D0
+WHITE DOT RIGHT, BLACK CIRCLE WITH	2688
+WHITE DOTS, BLACK CIRCLE WITH TWO	2689
+WHITE FLAG	2690
+white framus	29D6
+WHITE HOURGLASS	29D6
+WHITE MEDIUM SMALL SQUARE	25FD
+WHITE MEDIUM SQUARE	25FB
+White On Black Circled Numbers	24EB
+WHITE SESAME DOT	FE46
+WHITE SHOGI PIECE	2616
+WHITE SQUARE WITH LEFTWARDS TICK	27E4
+WHITE SQUARE WITH RIGHTWARDS TICK	27E5
+WHITE VERTICAL BAR	2AFE
+WHITE VERTICAL BAR, N-ARY	2AFF
+WIDE BRIDGE ABOVE, COMBINING	20E9
+WIGGLY FENCE, LEFT	29D8
+WIGGLY FENCE, LEFT DOUBLE	29DA
+WIGGLY FENCE, RIGHT	29D9
+WIGGLY FENCE, RIGHT DOUBLE	29DB
+wj	2060
+WON SIGN	20A9
+WORD DIVIDER, UGARITIC	1039F
+WORD JOINER	2060
+Word Separators, Aegean	10100
+Words, Squared Japanese Katakana	3300
+WORDSPACE, ETHIOPIC	1361
+WREATH PRODUCT	2240
+WRITING HAND	270D
+WYNN, LATIN CAPITAL LETTER	01F7
+WYNN, LATIN LETTER	01BF
+X, BALLOT	2717
+X, BALLOT BOX WITH	2612
+X, CIRCLE WITH SUPERIMPOSED	29BB
+X, COMBINING LATIN SMALL LETTER	036F
+X, HEAVY BALLOT	2718
+X, HEAVY MULTIPLICATION	2716
+X, MODIFIER LETTER SMALL	02E3
+X, MULTIPLICATION	2715
+X ABOVE, COMBINING	033D
+X IN A RECTANGLE BOX	2327
+XOR	22BB
+Y, LATIN LETTER SMALL CAPITAL	028F
+Y, LATIN SMALL LETTER TURNED	028E
+Y, MODIFIER LETTER SMALL	02B8
+Y, TURNED SANS-SERIF CAPITAL	2144
+YANG, YIN	262F
+YEN SIGN	00A5
+Yi Radicals	A490
+Yi Syllables	A000
+Yiddish Digraphs	05F0
+yields	22A2
+Yijing Monogram and Digram Symbols	268A
+Yijing Hexagram Symbols	4DC0
+Yijing Trigram Symbols	2630
+YIN YANG	262F
+yogh, latin capital letter	01B7
+YOGH, LATIN SMALL LETTER	021D
+yogh, latin small letter	0292
+YPOGEGRAMMENI, COMBINING GREEK	0345
+YR, LATIN LETTER	01A6
+yuan sign	00A5
+Z, BLACK-LETTER CAPITAL	2128
+Z, DOUBLE-STRUCK CAPITAL	2124
+Z NOTATION BAG MEMBERSHIP	22FF
+z notation bag subtraction	2A41
+z notation bijection	2917
+Z Notation Binding Brackets	2989
+Z NOTATION DOMAIN ANTIRESTRICTION	2A64
+z notation finite function	20E6
+z notation finite function	21FB
+z notation finite injection	2915
+z notation finite relation	21FC
+z notation finite surjection	2901
+z notation finite surjective injection	2918
+Z Notation Image Brackets	2987
+z notation left bag bracket	27E6
+z notation partial function	21F8
+z notation partial injection	2914
+z notation partial relation	21F9
+z notation partial surjection	2900
+Z NOTATION RANGE ANTIRESTRICTION	2A65
+Z NOTATION RELATIONAL COMPOSITION	2A3E
+Z NOTATION SCHEMA COMPOSITION	2A1F
+z notation schema hiding	29F9
+Z NOTATION SCHEMA PIPING	2A20
+Z NOTATION SCHEMA PROJECTION	2A21
+z notations sequence concatenation	2040
+Z NOTATION SPOT	2981
+z notation surjective injection	2917
+Z NOTATION TYPE COLON	2982
+Zapf Dingbats Series 100, ITC	2700
+ZERO, CIRCLED DIGIT	24EA
+ZERO, IDEOGRAPHIC NUMBER	3007
+ZERO, SUPERSCRIPT	2070
+ZERO WIDTH JOINER	200D
+ZERO WIDTH NO-BREAK SPACE	FEFF
+ZERO WIDTH NON-JOINER	200C
+ZERO WIDTH SPACE	200B
+ZIGZAG ARROW, RIGHT ANGLE WITH DOWNWARDS	237C
+ZIGZAG LINE, VERTICAL	299A
+Zodiacal Symbols	2648
+zwj	200D
+zwnbsp	FEFF
+zwnj	200C
+zwsp	200B
+	
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/Jamo.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/Jamo.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/Jamo.txt	(revision 14489)
@@ -0,0 +1,92 @@
+# Jamo-4.1.0.txt
+# Date: 2004-12-09, 17:48 PST [KW]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2004 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# This file defines the Jamo Short Name property.
+#
+# See Section 3.12 of The Unicode Standard, Version 4.0
+# for more information.
+#
+# Each line contains two fields, separated by a semicolon.
+#
+# The first field gives the code point, in 4-digit hexadecimal
+# form, of a combining jamo character that participates in
+# the algorithmic determination Hangul syllable character names.
+# The second field gives the Jamo Short Name as a one-, two-,
+# or three-character ASCII string (or in one case, for U+110B,
+# the null string).
+#
+# #############################################################
+ 
+1100; G   # HANGUL CHOSEONG KIYEOK
+1101; GG  # HANGUL CHOSEONG SSANGKIYEOK
+1102; N   # HANGUL CHOSEONG NIEUN
+1103; D   # HANGUL CHOSEONG TIKEUT
+1104; DD  # HANGUL CHOSEONG SSANGTIKEUT
+1105; R   # HANGUL CHOSEONG RIEUL
+1106; M   # HANGUL CHOSEONG MIEUM
+1107; B   # HANGUL CHOSEONG PIEUP
+1108; BB  # HANGUL CHOSEONG SSANGPIEUP
+1109; S   # HANGUL CHOSEONG SIOS
+110A; SS  # HANGUL CHOSEONG SSANGSIOS
+110B;     # HANGUL CHOSEONG IEUNG
+110C; J   # HANGUL CHOSEONG CIEUC
+110D; JJ  # HANGUL CHOSEONG SSANGCIEUC
+110E; C   # HANGUL CHOSEONG CHIEUCH
+110F; K   # HANGUL CHOSEONG KHIEUKH
+1110; T   # HANGUL CHOSEONG THIEUTH
+1111; P   # HANGUL CHOSEONG PHIEUPH
+1112; H   # HANGUL CHOSEONG HIEUH
+1161; A   # HANGUL JUNGSEONG A
+1162; AE  # HANGUL JUNGSEONG AE
+1163; YA  # HANGUL JUNGSEONG YA
+1164; YAE # HANGUL JUNGSEONG YAE
+1165; EO  # HANGUL JUNGSEONG EO
+1166; E   # HANGUL JUNGSEONG E
+1167; YEO # HANGUL JUNGSEONG YEO
+1168; YE  # HANGUL JUNGSEONG YE
+1169; O   # HANGUL JUNGSEONG O
+116A; WA  # HANGUL JUNGSEONG WA
+116B; WAE # HANGUL JUNGSEONG WAE
+116C; OE  # HANGUL JUNGSEONG OE
+116D; YO  # HANGUL JUNGSEONG YO
+116E; U   # HANGUL JUNGSEONG U
+116F; WEO # HANGUL JUNGSEONG WEO
+1170; WE  # HANGUL JUNGSEONG WE
+1171; WI  # HANGUL JUNGSEONG WI
+1172; YU  # HANGUL JUNGSEONG YU
+1173; EU  # HANGUL JUNGSEONG EU
+1174; YI  # HANGUL JUNGSEONG YI
+1175; I   # HANGUL JUNGSEONG I
+11A8; G   # HANGUL JONGSEONG KIYEOK
+11A9; GG  # HANGUL JONGSEONG SSANGKIYEOK
+11AA; GS  # HANGUL JONGSEONG KIYEOK-SIOS
+11AB; N   # HANGUL JONGSEONG NIEUN
+11AC; NJ  # HANGUL JONGSEONG NIEUN-CIEUC
+11AD; NH  # HANGUL JONGSEONG NIEUN-HIEUH
+11AE; D   # HANGUL JONGSEONG TIKEUT
+11AF; L   # HANGUL JONGSEONG RIEUL
+11B0; LG  # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1; LM  # HANGUL JONGSEONG RIEUL-MIEUM
+11B2; LB  # HANGUL JONGSEONG RIEUL-PIEUP
+11B3; LS  # HANGUL JONGSEONG RIEUL-SIOS
+11B4; LT  # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5; LP  # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6; LH  # HANGUL JONGSEONG RIEUL-HIEUH
+11B7; M   # HANGUL JONGSEONG MIEUM
+11B8; B   # HANGUL JONGSEONG PIEUP
+11B9; BS  # HANGUL JONGSEONG PIEUP-SIOS
+11BA; S   # HANGUL JONGSEONG SIOS
+11BB; SS  # HANGUL JONGSEONG SSANGSIOS
+11BC; NG  # HANGUL JONGSEONG IEUNG
+11BD; J   # HANGUL JONGSEONG CIEUC
+11BE; C   # HANGUL JONGSEONG CHIEUCH
+11BF; K   # HANGUL JONGSEONG KHIEUKH
+11C0; T   # HANGUL JONGSEONG THIEUTH
+11C1; P   # HANGUL JONGSEONG PHIEUPH
+11C2; H   # HANGUL JONGSEONG HIEUH
+
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/LineBreak.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/LineBreak.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/LineBreak.txt	(revision 14489)
@@ -0,0 +1,17169 @@
+# LineBreak-4.1.0.txt
+# Date: 2005-03-17, 15:21:00 PST [KW]
+#
+# Line Break Properties
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+# It contains both normative and informative data.
+#
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# The format is two fields separated by a semicolon.
+# Field 0: Unicode value
+# Field 1: LineBreak property, consisting of one of the following values:
+#   Normative:
+#         "BK", "CR", "LF", "CM", "SG", "GL", "CB", "SP", "ZW",
+#         "NL", "WJ", "JL", "JV", "JT", "H2", "H3"
+#   Informative:
+#         "XX", "OP", "CL", "QU", "NS", "EX", "SY",
+#         "IS", "PR", "PO", "NU", "AL", "ID", "IN", "HY",
+#         "BB", "BA", "SA", "AI", "B2"
+#  - All code points, assigned and unassigned, that are not listed 
+#         explicitly are given the value "XX".
+#  - Characters ranges are specified as for other property files in
+#         the Unicode Character Database.
+#
+# The Unicode name of each character is provided in a comment for help
+# in identifying the characters.
+#
+# See UAX #14: Line Breaking Properties, for more information
+0000;CM # <control>
+0001;CM # <control>
+0002;CM # <control>
+0003;CM # <control>
+0004;CM # <control>
+0005;CM # <control>
+0006;CM # <control>
+0007;CM # <control>
+0008;CM # <control>
+0009;BA # <control>
+000A;LF # <control>
+000B;CM # <control>
+000C;BK # <control>
+000D;CR # <control>
+000E;CM # <control>
+000F;CM # <control>
+0010;CM # <control>
+0011;CM # <control>
+0012;CM # <control>
+0013;CM # <control>
+0014;CM # <control>
+0015;CM # <control>
+0016;CM # <control>
+0017;CM # <control>
+0018;CM # <control>
+0019;CM # <control>
+001A;CM # <control>
+001B;CM # <control>
+001C;CM # <control>
+001D;CM # <control>
+001E;CM # <control>
+001F;CM # <control>
+0020;SP # SPACE
+0021;EX # EXCLAMATION MARK
+0022;QU # QUOTATION MARK
+0023;AL # NUMBER SIGN
+0024;PR # DOLLAR SIGN
+0025;PO # PERCENT SIGN
+0026;AL # AMPERSAND
+0027;QU # APOSTROPHE
+0028;OP # LEFT PARENTHESIS
+0029;CL # RIGHT PARENTHESIS
+002A;AL # ASTERISK
+002B;PR # PLUS SIGN
+002C;IS # COMMA
+002D;HY # HYPHEN-MINUS
+002E;IS # FULL STOP
+002F;SY # SOLIDUS
+0030;NU # DIGIT ZERO
+0031;NU # DIGIT ONE
+0032;NU # DIGIT TWO
+0033;NU # DIGIT THREE
+0034;NU # DIGIT FOUR
+0035;NU # DIGIT FIVE
+0036;NU # DIGIT SIX
+0037;NU # DIGIT SEVEN
+0038;NU # DIGIT EIGHT
+0039;NU # DIGIT NINE
+003A;IS # COLON
+003B;IS # SEMICOLON
+003C;AL # LESS-THAN SIGN
+003D;AL # EQUALS SIGN
+003E;AL # GREATER-THAN SIGN
+003F;EX # QUESTION MARK
+0040;AL # COMMERCIAL AT
+0041;AL # LATIN CAPITAL LETTER A
+0042;AL # LATIN CAPITAL LETTER B
+0043;AL # LATIN CAPITAL LETTER C
+0044;AL # LATIN CAPITAL LETTER D
+0045;AL # LATIN CAPITAL LETTER E
+0046;AL # LATIN CAPITAL LETTER F
+0047;AL # LATIN CAPITAL LETTER G
+0048;AL # LATIN CAPITAL LETTER H
+0049;AL # LATIN CAPITAL LETTER I
+004A;AL # LATIN CAPITAL LETTER J
+004B;AL # LATIN CAPITAL LETTER K
+004C;AL # LATIN CAPITAL LETTER L
+004D;AL # LATIN CAPITAL LETTER M
+004E;AL # LATIN CAPITAL LETTER N
+004F;AL # LATIN CAPITAL LETTER O
+0050;AL # LATIN CAPITAL LETTER P
+0051;AL # LATIN CAPITAL LETTER Q
+0052;AL # LATIN CAPITAL LETTER R
+0053;AL # LATIN CAPITAL LETTER S
+0054;AL # LATIN CAPITAL LETTER T
+0055;AL # LATIN CAPITAL LETTER U
+0056;AL # LATIN CAPITAL LETTER V
+0057;AL # LATIN CAPITAL LETTER W
+0058;AL # LATIN CAPITAL LETTER X
+0059;AL # LATIN CAPITAL LETTER Y
+005A;AL # LATIN CAPITAL LETTER Z
+005B;OP # LEFT SQUARE BRACKET
+005C;PR # REVERSE SOLIDUS
+005D;CL # RIGHT SQUARE BRACKET
+005E;AL # CIRCUMFLEX ACCENT
+005F;AL # LOW LINE
+0060;AL # GRAVE ACCENT
+0061;AL # LATIN SMALL LETTER A
+0062;AL # LATIN SMALL LETTER B
+0063;AL # LATIN SMALL LETTER C
+0064;AL # LATIN SMALL LETTER D
+0065;AL # LATIN SMALL LETTER E
+0066;AL # LATIN SMALL LETTER F
+0067;AL # LATIN SMALL LETTER G
+0068;AL # LATIN SMALL LETTER H
+0069;AL # LATIN SMALL LETTER I
+006A;AL # LATIN SMALL LETTER J
+006B;AL # LATIN SMALL LETTER K
+006C;AL # LATIN SMALL LETTER L
+006D;AL # LATIN SMALL LETTER M
+006E;AL # LATIN SMALL LETTER N
+006F;AL # LATIN SMALL LETTER O
+0070;AL # LATIN SMALL LETTER P
+0071;AL # LATIN SMALL LETTER Q
+0072;AL # LATIN SMALL LETTER R
+0073;AL # LATIN SMALL LETTER S
+0074;AL # LATIN SMALL LETTER T
+0075;AL # LATIN SMALL LETTER U
+0076;AL # LATIN SMALL LETTER V
+0077;AL # LATIN SMALL LETTER W
+0078;AL # LATIN SMALL LETTER X
+0079;AL # LATIN SMALL LETTER Y
+007A;AL # LATIN SMALL LETTER Z
+007B;OP # LEFT CURLY BRACKET
+007C;BA # VERTICAL LINE
+007D;CL # RIGHT CURLY BRACKET
+007E;AL # TILDE
+007F;CM # <control>
+0080;CM # <control>
+0081;CM # <control>
+0082;CM # <control>
+0083;CM # <control>
+0084;CM # <control>
+0085;NL # <control>
+0086;CM # <control>
+0087;CM # <control>
+0088;CM # <control>
+0089;CM # <control>
+008A;CM # <control>
+008B;CM # <control>
+008C;CM # <control>
+008D;CM # <control>
+008E;CM # <control>
+008F;CM # <control>
+0090;CM # <control>
+0091;CM # <control>
+0092;CM # <control>
+0093;CM # <control>
+0094;CM # <control>
+0095;CM # <control>
+0096;CM # <control>
+0097;CM # <control>
+0098;CM # <control>
+0099;CM # <control>
+009A;CM # <control>
+009B;CM # <control>
+009C;CM # <control>
+009D;CM # <control>
+009E;CM # <control>
+009F;CM # <control>
+00A0;GL # NO-BREAK SPACE
+00A1;AI # INVERTED EXCLAMATION MARK
+00A2;PO # CENT SIGN
+00A3;PR # POUND SIGN
+00A4;PR # CURRENCY SIGN
+00A5;PR # YEN SIGN
+00A6;AL # BROKEN BAR
+00A7;AI # SECTION SIGN
+00A8;AI # DIAERESIS
+00A9;AL # COPYRIGHT SIGN
+00AA;AI # FEMININE ORDINAL INDICATOR
+00AB;QU # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC;AL # NOT SIGN
+00AD;BA # SOFT HYPHEN
+00AE;AL # REGISTERED SIGN
+00AF;AL # MACRON
+00B0;PO # DEGREE SIGN
+00B1;PR # PLUS-MINUS SIGN
+00B2;AI # SUPERSCRIPT TWO
+00B3;AI # SUPERSCRIPT THREE
+00B4;BB # ACUTE ACCENT
+00B5;AL # MICRO SIGN
+00B6;AI # PILCROW SIGN
+00B7;AI # MIDDLE DOT
+00B8;AI # CEDILLA
+00B9;AI # SUPERSCRIPT ONE
+00BA;AI # MASCULINE ORDINAL INDICATOR
+00BB;QU # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC;AI # VULGAR FRACTION ONE QUARTER
+00BD;AI # VULGAR FRACTION ONE HALF
+00BE;AI # VULGAR FRACTION THREE QUARTERS
+00BF;AI # INVERTED QUESTION MARK
+00C0;AL # LATIN CAPITAL LETTER A WITH GRAVE
+00C1;AL # LATIN CAPITAL LETTER A WITH ACUTE
+00C2;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3;AL # LATIN CAPITAL LETTER A WITH TILDE
+00C4;AL # LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5;AL # LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6;AL # LATIN CAPITAL LETTER AE
+00C7;AL # LATIN CAPITAL LETTER C WITH CEDILLA
+00C8;AL # LATIN CAPITAL LETTER E WITH GRAVE
+00C9;AL # LATIN CAPITAL LETTER E WITH ACUTE
+00CA;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB;AL # LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC;AL # LATIN CAPITAL LETTER I WITH GRAVE
+00CD;AL # LATIN CAPITAL LETTER I WITH ACUTE
+00CE;AL # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF;AL # LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0;AL # LATIN CAPITAL LETTER ETH
+00D1;AL # LATIN CAPITAL LETTER N WITH TILDE
+00D2;AL # LATIN CAPITAL LETTER O WITH GRAVE
+00D3;AL # LATIN CAPITAL LETTER O WITH ACUTE
+00D4;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5;AL # LATIN CAPITAL LETTER O WITH TILDE
+00D6;AL # LATIN CAPITAL LETTER O WITH DIAERESIS
+00D7;AI # MULTIPLICATION SIGN
+00D8;AL # LATIN CAPITAL LETTER O WITH STROKE
+00D9;AL # LATIN CAPITAL LETTER U WITH GRAVE
+00DA;AL # LATIN CAPITAL LETTER U WITH ACUTE
+00DB;AL # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC;AL # LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD;AL # LATIN CAPITAL LETTER Y WITH ACUTE
+00DE;AL # LATIN CAPITAL LETTER THORN
+00DF;AL # LATIN SMALL LETTER SHARP S
+00E0;AL # LATIN SMALL LETTER A WITH GRAVE
+00E1;AL # LATIN SMALL LETTER A WITH ACUTE
+00E2;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX
+00E3;AL # LATIN SMALL LETTER A WITH TILDE
+00E4;AL # LATIN SMALL LETTER A WITH DIAERESIS
+00E5;AL # LATIN SMALL LETTER A WITH RING ABOVE
+00E6;AL # LATIN SMALL LETTER AE
+00E7;AL # LATIN SMALL LETTER C WITH CEDILLA
+00E8;AL # LATIN SMALL LETTER E WITH GRAVE
+00E9;AL # LATIN SMALL LETTER E WITH ACUTE
+00EA;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX
+00EB;AL # LATIN SMALL LETTER E WITH DIAERESIS
+00EC;AL # LATIN SMALL LETTER I WITH GRAVE
+00ED;AL # LATIN SMALL LETTER I WITH ACUTE
+00EE;AL # LATIN SMALL LETTER I WITH CIRCUMFLEX
+00EF;AL # LATIN SMALL LETTER I WITH DIAERESIS
+00F0;AL # LATIN SMALL LETTER ETH
+00F1;AL # LATIN SMALL LETTER N WITH TILDE
+00F2;AL # LATIN SMALL LETTER O WITH GRAVE
+00F3;AL # LATIN SMALL LETTER O WITH ACUTE
+00F4;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX
+00F5;AL # LATIN SMALL LETTER O WITH TILDE
+00F6;AL # LATIN SMALL LETTER O WITH DIAERESIS
+00F7;AI # DIVISION SIGN
+00F8;AL # LATIN SMALL LETTER O WITH STROKE
+00F9;AL # LATIN SMALL LETTER U WITH GRAVE
+00FA;AL # LATIN SMALL LETTER U WITH ACUTE
+00FB;AL # LATIN SMALL LETTER U WITH CIRCUMFLEX
+00FC;AL # LATIN SMALL LETTER U WITH DIAERESIS
+00FD;AL # LATIN SMALL LETTER Y WITH ACUTE
+00FE;AL # LATIN SMALL LETTER THORN
+00FF;AL # LATIN SMALL LETTER Y WITH DIAERESIS
+0100;AL # LATIN CAPITAL LETTER A WITH MACRON
+0101;AL # LATIN SMALL LETTER A WITH MACRON
+0102;AL # LATIN CAPITAL LETTER A WITH BREVE
+0103;AL # LATIN SMALL LETTER A WITH BREVE
+0104;AL # LATIN CAPITAL LETTER A WITH OGONEK
+0105;AL # LATIN SMALL LETTER A WITH OGONEK
+0106;AL # LATIN CAPITAL LETTER C WITH ACUTE
+0107;AL # LATIN SMALL LETTER C WITH ACUTE
+0108;AL # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0109;AL # LATIN SMALL LETTER C WITH CIRCUMFLEX
+010A;AL # LATIN CAPITAL LETTER C WITH DOT ABOVE
+010B;AL # LATIN SMALL LETTER C WITH DOT ABOVE
+010C;AL # LATIN CAPITAL LETTER C WITH CARON
+010D;AL # LATIN SMALL LETTER C WITH CARON
+010E;AL # LATIN CAPITAL LETTER D WITH CARON
+010F;AL # LATIN SMALL LETTER D WITH CARON
+0110;AL # LATIN CAPITAL LETTER D WITH STROKE
+0111;AL # LATIN SMALL LETTER D WITH STROKE
+0112;AL # LATIN CAPITAL LETTER E WITH MACRON
+0113;AL # LATIN SMALL LETTER E WITH MACRON
+0114;AL # LATIN CAPITAL LETTER E WITH BREVE
+0115;AL # LATIN SMALL LETTER E WITH BREVE
+0116;AL # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0117;AL # LATIN SMALL LETTER E WITH DOT ABOVE
+0118;AL # LATIN CAPITAL LETTER E WITH OGONEK
+0119;AL # LATIN SMALL LETTER E WITH OGONEK
+011A;AL # LATIN CAPITAL LETTER E WITH CARON
+011B;AL # LATIN SMALL LETTER E WITH CARON
+011C;AL # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011D;AL # LATIN SMALL LETTER G WITH CIRCUMFLEX
+011E;AL # LATIN CAPITAL LETTER G WITH BREVE
+011F;AL # LATIN SMALL LETTER G WITH BREVE
+0120;AL # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0121;AL # LATIN SMALL LETTER G WITH DOT ABOVE
+0122;AL # LATIN CAPITAL LETTER G WITH CEDILLA
+0123;AL # LATIN SMALL LETTER G WITH CEDILLA
+0124;AL # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0125;AL # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0126;AL # LATIN CAPITAL LETTER H WITH STROKE
+0127;AL # LATIN SMALL LETTER H WITH STROKE
+0128;AL # LATIN CAPITAL LETTER I WITH TILDE
+0129;AL # LATIN SMALL LETTER I WITH TILDE
+012A;AL # LATIN CAPITAL LETTER I WITH MACRON
+012B;AL # LATIN SMALL LETTER I WITH MACRON
+012C;AL # LATIN CAPITAL LETTER I WITH BREVE
+012D;AL # LATIN SMALL LETTER I WITH BREVE
+012E;AL # LATIN CAPITAL LETTER I WITH OGONEK
+012F;AL # LATIN SMALL LETTER I WITH OGONEK
+0130;AL # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131;AL # LATIN SMALL LETTER DOTLESS I
+0132;AL # LATIN CAPITAL LIGATURE IJ
+0133;AL # LATIN SMALL LIGATURE IJ
+0134;AL # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0135;AL # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0136;AL # LATIN CAPITAL LETTER K WITH CEDILLA
+0137;AL # LATIN SMALL LETTER K WITH CEDILLA
+0138;AL # LATIN SMALL LETTER KRA
+0139;AL # LATIN CAPITAL LETTER L WITH ACUTE
+013A;AL # LATIN SMALL LETTER L WITH ACUTE
+013B;AL # LATIN CAPITAL LETTER L WITH CEDILLA
+013C;AL # LATIN SMALL LETTER L WITH CEDILLA
+013D;AL # LATIN CAPITAL LETTER L WITH CARON
+013E;AL # LATIN SMALL LETTER L WITH CARON
+013F;AL # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0140;AL # LATIN SMALL LETTER L WITH MIDDLE DOT
+0141;AL # LATIN CAPITAL LETTER L WITH STROKE
+0142;AL # LATIN SMALL LETTER L WITH STROKE
+0143;AL # LATIN CAPITAL LETTER N WITH ACUTE
+0144;AL # LATIN SMALL LETTER N WITH ACUTE
+0145;AL # LATIN CAPITAL LETTER N WITH CEDILLA
+0146;AL # LATIN SMALL LETTER N WITH CEDILLA
+0147;AL # LATIN CAPITAL LETTER N WITH CARON
+0148;AL # LATIN SMALL LETTER N WITH CARON
+0149;AL # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A;AL # LATIN CAPITAL LETTER ENG
+014B;AL # LATIN SMALL LETTER ENG
+014C;AL # LATIN CAPITAL LETTER O WITH MACRON
+014D;AL # LATIN SMALL LETTER O WITH MACRON
+014E;AL # LATIN CAPITAL LETTER O WITH BREVE
+014F;AL # LATIN SMALL LETTER O WITH BREVE
+0150;AL # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0151;AL # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0152;AL # LATIN CAPITAL LIGATURE OE
+0153;AL # LATIN SMALL LIGATURE OE
+0154;AL # LATIN CAPITAL LETTER R WITH ACUTE
+0155;AL # LATIN SMALL LETTER R WITH ACUTE
+0156;AL # LATIN CAPITAL LETTER R WITH CEDILLA
+0157;AL # LATIN SMALL LETTER R WITH CEDILLA
+0158;AL # LATIN CAPITAL LETTER R WITH CARON
+0159;AL # LATIN SMALL LETTER R WITH CARON
+015A;AL # LATIN CAPITAL LETTER S WITH ACUTE
+015B;AL # LATIN SMALL LETTER S WITH ACUTE
+015C;AL # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015D;AL # LATIN SMALL LETTER S WITH CIRCUMFLEX
+015E;AL # LATIN CAPITAL LETTER S WITH CEDILLA
+015F;AL # LATIN SMALL LETTER S WITH CEDILLA
+0160;AL # LATIN CAPITAL LETTER S WITH CARON
+0161;AL # LATIN SMALL LETTER S WITH CARON
+0162;AL # LATIN CAPITAL LETTER T WITH CEDILLA
+0163;AL # LATIN SMALL LETTER T WITH CEDILLA
+0164;AL # LATIN CAPITAL LETTER T WITH CARON
+0165;AL # LATIN SMALL LETTER T WITH CARON
+0166;AL # LATIN CAPITAL LETTER T WITH STROKE
+0167;AL # LATIN SMALL LETTER T WITH STROKE
+0168;AL # LATIN CAPITAL LETTER U WITH TILDE
+0169;AL # LATIN SMALL LETTER U WITH TILDE
+016A;AL # LATIN CAPITAL LETTER U WITH MACRON
+016B;AL # LATIN SMALL LETTER U WITH MACRON
+016C;AL # LATIN CAPITAL LETTER U WITH BREVE
+016D;AL # LATIN SMALL LETTER U WITH BREVE
+016E;AL # LATIN CAPITAL LETTER U WITH RING ABOVE
+016F;AL # LATIN SMALL LETTER U WITH RING ABOVE
+0170;AL # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0171;AL # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0172;AL # LATIN CAPITAL LETTER U WITH OGONEK
+0173;AL # LATIN SMALL LETTER U WITH OGONEK
+0174;AL # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0175;AL # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0176;AL # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0177;AL # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0178;AL # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179;AL # LATIN CAPITAL LETTER Z WITH ACUTE
+017A;AL # LATIN SMALL LETTER Z WITH ACUTE
+017B;AL # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017C;AL # LATIN SMALL LETTER Z WITH DOT ABOVE
+017D;AL # LATIN CAPITAL LETTER Z WITH CARON
+017E;AL # LATIN SMALL LETTER Z WITH CARON
+017F;AL # LATIN SMALL LETTER LONG S
+0180;AL # LATIN SMALL LETTER B WITH STROKE
+0181;AL # LATIN CAPITAL LETTER B WITH HOOK
+0182;AL # LATIN CAPITAL LETTER B WITH TOPBAR
+0183;AL # LATIN SMALL LETTER B WITH TOPBAR
+0184;AL # LATIN CAPITAL LETTER TONE SIX
+0185;AL # LATIN SMALL LETTER TONE SIX
+0186;AL # LATIN CAPITAL LETTER OPEN O
+0187;AL # LATIN CAPITAL LETTER C WITH HOOK
+0188;AL # LATIN SMALL LETTER C WITH HOOK
+0189;AL # LATIN CAPITAL LETTER AFRICAN D
+018A;AL # LATIN CAPITAL LETTER D WITH HOOK
+018B;AL # LATIN CAPITAL LETTER D WITH TOPBAR
+018C;AL # LATIN SMALL LETTER D WITH TOPBAR
+018D;AL # LATIN SMALL LETTER TURNED DELTA
+018E;AL # LATIN CAPITAL LETTER REVERSED E
+018F;AL # LATIN CAPITAL LETTER SCHWA
+0190;AL # LATIN CAPITAL LETTER OPEN E
+0191;AL # LATIN CAPITAL LETTER F WITH HOOK
+0192;AL # LATIN SMALL LETTER F WITH HOOK
+0193;AL # LATIN CAPITAL LETTER G WITH HOOK
+0194;AL # LATIN CAPITAL LETTER GAMMA
+0195;AL # LATIN SMALL LETTER HV
+0196;AL # LATIN CAPITAL LETTER IOTA
+0197;AL # LATIN CAPITAL LETTER I WITH STROKE
+0198;AL # LATIN CAPITAL LETTER K WITH HOOK
+0199;AL # LATIN SMALL LETTER K WITH HOOK
+019A;AL # LATIN SMALL LETTER L WITH BAR
+019B;AL # LATIN SMALL LETTER LAMBDA WITH STROKE
+019C;AL # LATIN CAPITAL LETTER TURNED M
+019D;AL # LATIN CAPITAL LETTER N WITH LEFT HOOK
+019E;AL # LATIN SMALL LETTER N WITH LONG RIGHT LEG
+019F;AL # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0;AL # LATIN CAPITAL LETTER O WITH HORN
+01A1;AL # LATIN SMALL LETTER O WITH HORN
+01A2;AL # LATIN CAPITAL LETTER OI
+01A3;AL # LATIN SMALL LETTER OI
+01A4;AL # LATIN CAPITAL LETTER P WITH HOOK
+01A5;AL # LATIN SMALL LETTER P WITH HOOK
+01A6;AL # LATIN LETTER YR
+01A7;AL # LATIN CAPITAL LETTER TONE TWO
+01A8;AL # LATIN SMALL LETTER TONE TWO
+01A9;AL # LATIN CAPITAL LETTER ESH
+01AA;AL # LATIN LETTER REVERSED ESH LOOP
+01AB;AL # LATIN SMALL LETTER T WITH PALATAL HOOK
+01AC;AL # LATIN CAPITAL LETTER T WITH HOOK
+01AD;AL # LATIN SMALL LETTER T WITH HOOK
+01AE;AL # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF;AL # LATIN CAPITAL LETTER U WITH HORN
+01B0;AL # LATIN SMALL LETTER U WITH HORN
+01B1;AL # LATIN CAPITAL LETTER UPSILON
+01B2;AL # LATIN CAPITAL LETTER V WITH HOOK
+01B3;AL # LATIN CAPITAL LETTER Y WITH HOOK
+01B4;AL # LATIN SMALL LETTER Y WITH HOOK
+01B5;AL # LATIN CAPITAL LETTER Z WITH STROKE
+01B6;AL # LATIN SMALL LETTER Z WITH STROKE
+01B7;AL # LATIN CAPITAL LETTER EZH
+01B8;AL # LATIN CAPITAL LETTER EZH REVERSED
+01B9;AL # LATIN SMALL LETTER EZH REVERSED
+01BA;AL # LATIN SMALL LETTER EZH WITH TAIL
+01BB;AL # LATIN LETTER TWO WITH STROKE
+01BC;AL # LATIN CAPITAL LETTER TONE FIVE
+01BD;AL # LATIN SMALL LETTER TONE FIVE
+01BE;AL # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+01BF;AL # LATIN LETTER WYNN
+01C0;AL # LATIN LETTER DENTAL CLICK
+01C1;AL # LATIN LETTER LATERAL CLICK
+01C2;AL # LATIN LETTER ALVEOLAR CLICK
+01C3;AL # LATIN LETTER RETROFLEX CLICK
+01C4;AL # LATIN CAPITAL LETTER DZ WITH CARON
+01C5;AL # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C6;AL # LATIN SMALL LETTER DZ WITH CARON
+01C7;AL # LATIN CAPITAL LETTER LJ
+01C8;AL # LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01C9;AL # LATIN SMALL LETTER LJ
+01CA;AL # LATIN CAPITAL LETTER NJ
+01CB;AL # LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CC;AL # LATIN SMALL LETTER NJ
+01CD;AL # LATIN CAPITAL LETTER A WITH CARON
+01CE;AL # LATIN SMALL LETTER A WITH CARON
+01CF;AL # LATIN CAPITAL LETTER I WITH CARON
+01D0;AL # LATIN SMALL LETTER I WITH CARON
+01D1;AL # LATIN CAPITAL LETTER O WITH CARON
+01D2;AL # LATIN SMALL LETTER O WITH CARON
+01D3;AL # LATIN CAPITAL LETTER U WITH CARON
+01D4;AL # LATIN SMALL LETTER U WITH CARON
+01D5;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D6;AL # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D7;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D8;AL # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D9;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DA;AL # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DB;AL # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DC;AL # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DD;AL # LATIN SMALL LETTER TURNED E
+01DE;AL # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01DF;AL # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E0;AL # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E1;AL # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E2;AL # LATIN CAPITAL LETTER AE WITH MACRON
+01E3;AL # LATIN SMALL LETTER AE WITH MACRON
+01E4;AL # LATIN CAPITAL LETTER G WITH STROKE
+01E5;AL # LATIN SMALL LETTER G WITH STROKE
+01E6;AL # LATIN CAPITAL LETTER G WITH CARON
+01E7;AL # LATIN SMALL LETTER G WITH CARON
+01E8;AL # LATIN CAPITAL LETTER K WITH CARON
+01E9;AL # LATIN SMALL LETTER K WITH CARON
+01EA;AL # LATIN CAPITAL LETTER O WITH OGONEK
+01EB;AL # LATIN SMALL LETTER O WITH OGONEK
+01EC;AL # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01ED;AL # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EE;AL # LATIN CAPITAL LETTER EZH WITH CARON
+01EF;AL # LATIN SMALL LETTER EZH WITH CARON
+01F0;AL # LATIN SMALL LETTER J WITH CARON
+01F1;AL # LATIN CAPITAL LETTER DZ
+01F2;AL # LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F3;AL # LATIN SMALL LETTER DZ
+01F4;AL # LATIN CAPITAL LETTER G WITH ACUTE
+01F5;AL # LATIN SMALL LETTER G WITH ACUTE
+01F6;AL # LATIN CAPITAL LETTER HWAIR
+01F7;AL # LATIN CAPITAL LETTER WYNN
+01F8;AL # LATIN CAPITAL LETTER N WITH GRAVE
+01F9;AL # LATIN SMALL LETTER N WITH GRAVE
+01FA;AL # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FB;AL # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FC;AL # LATIN CAPITAL LETTER AE WITH ACUTE
+01FD;AL # LATIN SMALL LETTER AE WITH ACUTE
+01FE;AL # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+01FF;AL # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0200;AL # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0201;AL # LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0202;AL # LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0203;AL # LATIN SMALL LETTER A WITH INVERTED BREVE
+0204;AL # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0205;AL # LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0206;AL # LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0207;AL # LATIN SMALL LETTER E WITH INVERTED BREVE
+0208;AL # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+0209;AL # LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020A;AL # LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020B;AL # LATIN SMALL LETTER I WITH INVERTED BREVE
+020C;AL # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020D;AL # LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020E;AL # LATIN CAPITAL LETTER O WITH INVERTED BREVE
+020F;AL # LATIN SMALL LETTER O WITH INVERTED BREVE
+0210;AL # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0211;AL # LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0212;AL # LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0213;AL # LATIN SMALL LETTER R WITH INVERTED BREVE
+0214;AL # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0215;AL # LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0216;AL # LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0217;AL # LATIN SMALL LETTER U WITH INVERTED BREVE
+0218;AL # LATIN CAPITAL LETTER S WITH COMMA BELOW
+0219;AL # LATIN SMALL LETTER S WITH COMMA BELOW
+021A;AL # LATIN CAPITAL LETTER T WITH COMMA BELOW
+021B;AL # LATIN SMALL LETTER T WITH COMMA BELOW
+021C;AL # LATIN CAPITAL LETTER YOGH
+021D;AL # LATIN SMALL LETTER YOGH
+021E;AL # LATIN CAPITAL LETTER H WITH CARON
+021F;AL # LATIN SMALL LETTER H WITH CARON
+0220;AL # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0221;AL # LATIN SMALL LETTER D WITH CURL
+0222;AL # LATIN CAPITAL LETTER OU
+0223;AL # LATIN SMALL LETTER OU
+0224;AL # LATIN CAPITAL LETTER Z WITH HOOK
+0225;AL # LATIN SMALL LETTER Z WITH HOOK
+0226;AL # LATIN CAPITAL LETTER A WITH DOT ABOVE
+0227;AL # LATIN SMALL LETTER A WITH DOT ABOVE
+0228;AL # LATIN CAPITAL LETTER E WITH CEDILLA
+0229;AL # LATIN SMALL LETTER E WITH CEDILLA
+022A;AL # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022B;AL # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022C;AL # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022D;AL # LATIN SMALL LETTER O WITH TILDE AND MACRON
+022E;AL # LATIN CAPITAL LETTER O WITH DOT ABOVE
+022F;AL # LATIN SMALL LETTER O WITH DOT ABOVE
+0230;AL # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0231;AL # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0232;AL # LATIN CAPITAL LETTER Y WITH MACRON
+0233;AL # LATIN SMALL LETTER Y WITH MACRON
+0234;AL # LATIN SMALL LETTER L WITH CURL
+0235;AL # LATIN SMALL LETTER N WITH CURL
+0236;AL # LATIN SMALL LETTER T WITH CURL
+0237;AL # LATIN SMALL LETTER DOTLESS J
+0238;AL # LATIN SMALL LETTER DB DIGRAPH
+0239;AL # LATIN SMALL LETTER QP DIGRAPH
+023A;AL # LATIN CAPITAL LETTER A WITH STROKE
+023B;AL # LATIN CAPITAL LETTER C WITH STROKE
+023C;AL # LATIN SMALL LETTER C WITH STROKE
+023D;AL # LATIN CAPITAL LETTER L WITH BAR
+023E;AL # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+023F;AL # LATIN SMALL LETTER S WITH SWASH TAIL
+0240;AL # LATIN SMALL LETTER Z WITH SWASH TAIL
+0241;AL # LATIN CAPITAL LETTER GLOTTAL STOP
+0250;AL # LATIN SMALL LETTER TURNED A
+0251;AL # LATIN SMALL LETTER ALPHA
+0252;AL # LATIN SMALL LETTER TURNED ALPHA
+0253;AL # LATIN SMALL LETTER B WITH HOOK
+0254;AL # LATIN SMALL LETTER OPEN O
+0255;AL # LATIN SMALL LETTER C WITH CURL
+0256;AL # LATIN SMALL LETTER D WITH TAIL
+0257;AL # LATIN SMALL LETTER D WITH HOOK
+0258;AL # LATIN SMALL LETTER REVERSED E
+0259;AL # LATIN SMALL LETTER SCHWA
+025A;AL # LATIN SMALL LETTER SCHWA WITH HOOK
+025B;AL # LATIN SMALL LETTER OPEN E
+025C;AL # LATIN SMALL LETTER REVERSED OPEN E
+025D;AL # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E;AL # LATIN SMALL LETTER CLOSED REVERSED OPEN E
+025F;AL # LATIN SMALL LETTER DOTLESS J WITH STROKE
+0260;AL # LATIN SMALL LETTER G WITH HOOK
+0261;AL # LATIN SMALL LETTER SCRIPT G
+0262;AL # LATIN LETTER SMALL CAPITAL G
+0263;AL # LATIN SMALL LETTER GAMMA
+0264;AL # LATIN SMALL LETTER RAMS HORN
+0265;AL # LATIN SMALL LETTER TURNED H
+0266;AL # LATIN SMALL LETTER H WITH HOOK
+0267;AL # LATIN SMALL LETTER HENG WITH HOOK
+0268;AL # LATIN SMALL LETTER I WITH STROKE
+0269;AL # LATIN SMALL LETTER IOTA
+026A;AL # LATIN LETTER SMALL CAPITAL I
+026B;AL # LATIN SMALL LETTER L WITH MIDDLE TILDE
+026C;AL # LATIN SMALL LETTER L WITH BELT
+026D;AL # LATIN SMALL LETTER L WITH RETROFLEX HOOK
+026E;AL # LATIN SMALL LETTER LEZH
+026F;AL # LATIN SMALL LETTER TURNED M
+0270;AL # LATIN SMALL LETTER TURNED M WITH LONG LEG
+0271;AL # LATIN SMALL LETTER M WITH HOOK
+0272;AL # LATIN SMALL LETTER N WITH LEFT HOOK
+0273;AL # LATIN SMALL LETTER N WITH RETROFLEX HOOK
+0274;AL # LATIN LETTER SMALL CAPITAL N
+0275;AL # LATIN SMALL LETTER BARRED O
+0276;AL # LATIN LETTER SMALL CAPITAL OE
+0277;AL # LATIN SMALL LETTER CLOSED OMEGA
+0278;AL # LATIN SMALL LETTER PHI
+0279;AL # LATIN SMALL LETTER TURNED R
+027A;AL # LATIN SMALL LETTER TURNED R WITH LONG LEG
+027B;AL # LATIN SMALL LETTER TURNED R WITH HOOK
+027C;AL # LATIN SMALL LETTER R WITH LONG LEG
+027D;AL # LATIN SMALL LETTER R WITH TAIL
+027E;AL # LATIN SMALL LETTER R WITH FISHHOOK
+027F;AL # LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0280;AL # LATIN LETTER SMALL CAPITAL R
+0281;AL # LATIN LETTER SMALL CAPITAL INVERTED R
+0282;AL # LATIN SMALL LETTER S WITH HOOK
+0283;AL # LATIN SMALL LETTER ESH
+0284;AL # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+0285;AL # LATIN SMALL LETTER SQUAT REVERSED ESH
+0286;AL # LATIN SMALL LETTER ESH WITH CURL
+0287;AL # LATIN SMALL LETTER TURNED T
+0288;AL # LATIN SMALL LETTER T WITH RETROFLEX HOOK
+0289;AL # LATIN SMALL LETTER U BAR
+028A;AL # LATIN SMALL LETTER UPSILON
+028B;AL # LATIN SMALL LETTER V WITH HOOK
+028C;AL # LATIN SMALL LETTER TURNED V
+028D;AL # LATIN SMALL LETTER TURNED W
+028E;AL # LATIN SMALL LETTER TURNED Y
+028F;AL # LATIN LETTER SMALL CAPITAL Y
+0290;AL # LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+0291;AL # LATIN SMALL LETTER Z WITH CURL
+0292;AL # LATIN SMALL LETTER EZH
+0293;AL # LATIN SMALL LETTER EZH WITH CURL
+0294;AL # LATIN LETTER GLOTTAL STOP
+0295;AL # LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+0296;AL # LATIN LETTER INVERTED GLOTTAL STOP
+0297;AL # LATIN LETTER STRETCHED C
+0298;AL # LATIN LETTER BILABIAL CLICK
+0299;AL # LATIN LETTER SMALL CAPITAL B
+029A;AL # LATIN SMALL LETTER CLOSED OPEN E
+029B;AL # LATIN LETTER SMALL CAPITAL G WITH HOOK
+029C;AL # LATIN LETTER SMALL CAPITAL H
+029D;AL # LATIN SMALL LETTER J WITH CROSSED-TAIL
+029E;AL # LATIN SMALL LETTER TURNED K
+029F;AL # LATIN LETTER SMALL CAPITAL L
+02A0;AL # LATIN SMALL LETTER Q WITH HOOK
+02A1;AL # LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2;AL # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+02A3;AL # LATIN SMALL LETTER DZ DIGRAPH
+02A4;AL # LATIN SMALL LETTER DEZH DIGRAPH
+02A5;AL # LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+02A6;AL # LATIN SMALL LETTER TS DIGRAPH
+02A7;AL # LATIN SMALL LETTER TESH DIGRAPH
+02A8;AL # LATIN SMALL LETTER TC DIGRAPH WITH CURL
+02A9;AL # LATIN SMALL LETTER FENG DIGRAPH
+02AA;AL # LATIN SMALL LETTER LS DIGRAPH
+02AB;AL # LATIN SMALL LETTER LZ DIGRAPH
+02AC;AL # LATIN LETTER BILABIAL PERCUSSIVE
+02AD;AL # LATIN LETTER BIDENTAL PERCUSSIVE
+02AE;AL # LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF;AL # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0;AL # MODIFIER LETTER SMALL H
+02B1;AL # MODIFIER LETTER SMALL H WITH HOOK
+02B2;AL # MODIFIER LETTER SMALL J
+02B3;AL # MODIFIER LETTER SMALL R
+02B4;AL # MODIFIER LETTER SMALL TURNED R
+02B5;AL # MODIFIER LETTER SMALL TURNED R WITH HOOK
+02B6;AL # MODIFIER LETTER SMALL CAPITAL INVERTED R
+02B7;AL # MODIFIER LETTER SMALL W
+02B8;AL # MODIFIER LETTER SMALL Y
+02B9;AL # MODIFIER LETTER PRIME
+02BA;AL # MODIFIER LETTER DOUBLE PRIME
+02BB;AL # MODIFIER LETTER TURNED COMMA
+02BC;AL # MODIFIER LETTER APOSTROPHE
+02BD;AL # MODIFIER LETTER REVERSED COMMA
+02BE;AL # MODIFIER LETTER RIGHT HALF RING
+02BF;AL # MODIFIER LETTER LEFT HALF RING
+02C0;AL # MODIFIER LETTER GLOTTAL STOP
+02C1;AL # MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2;AL # MODIFIER LETTER LEFT ARROWHEAD
+02C3;AL # MODIFIER LETTER RIGHT ARROWHEAD
+02C4;AL # MODIFIER LETTER UP ARROWHEAD
+02C5;AL # MODIFIER LETTER DOWN ARROWHEAD
+02C6;AL # MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7;AI # CARON
+02C8;BB # MODIFIER LETTER VERTICAL LINE
+02C9;AI # MODIFIER LETTER MACRON
+02CA;AI # MODIFIER LETTER ACUTE ACCENT
+02CB;AI # MODIFIER LETTER GRAVE ACCENT
+02CC;BB # MODIFIER LETTER LOW VERTICAL LINE
+02CD;AI # MODIFIER LETTER LOW MACRON
+02CE;AL # MODIFIER LETTER LOW GRAVE ACCENT
+02CF;AL # MODIFIER LETTER LOW ACUTE ACCENT
+02D0;AI # MODIFIER LETTER TRIANGULAR COLON
+02D1;AL # MODIFIER LETTER HALF TRIANGULAR COLON
+02D2;AL # MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3;AL # MODIFIER LETTER CENTRED LEFT HALF RING
+02D4;AL # MODIFIER LETTER UP TACK
+02D5;AL # MODIFIER LETTER DOWN TACK
+02D6;AL # MODIFIER LETTER PLUS SIGN
+02D7;AL # MODIFIER LETTER MINUS SIGN
+02D8;AI # BREVE
+02D9;AI # DOT ABOVE
+02DA;AI # RING ABOVE
+02DB;AI # OGONEK
+02DC;AL # SMALL TILDE
+02DD;AI # DOUBLE ACUTE ACCENT
+02DE;AL # MODIFIER LETTER RHOTIC HOOK
+02DF;AL # MODIFIER LETTER CROSS ACCENT
+02E0;AL # MODIFIER LETTER SMALL GAMMA
+02E1;AL # MODIFIER LETTER SMALL L
+02E2;AL # MODIFIER LETTER SMALL S
+02E3;AL # MODIFIER LETTER SMALL X
+02E4;AL # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5;AL # MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6;AL # MODIFIER LETTER HIGH TONE BAR
+02E7;AL # MODIFIER LETTER MID TONE BAR
+02E8;AL # MODIFIER LETTER LOW TONE BAR
+02E9;AL # MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA;AL # MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB;AL # MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC;AL # MODIFIER LETTER VOICING
+02ED;AL # MODIFIER LETTER UNASPIRATED
+02EE;AL # MODIFIER LETTER DOUBLE APOSTROPHE
+02EF;AL # MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0;AL # MODIFIER LETTER LOW UP ARROWHEAD
+02F1;AL # MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2;AL # MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3;AL # MODIFIER LETTER LOW RING
+02F4;AL # MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5;AL # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6;AL # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7;AL # MODIFIER LETTER LOW TILDE
+02F8;AL # MODIFIER LETTER RAISED COLON
+02F9;AL # MODIFIER LETTER BEGIN HIGH TONE
+02FA;AL # MODIFIER LETTER END HIGH TONE
+02FB;AL # MODIFIER LETTER BEGIN LOW TONE
+02FC;AL # MODIFIER LETTER END LOW TONE
+02FD;AL # MODIFIER LETTER SHELF
+02FE;AL # MODIFIER LETTER OPEN SHELF
+02FF;AL # MODIFIER LETTER LOW LEFT ARROW
+0300;CM # COMBINING GRAVE ACCENT
+0301;CM # COMBINING ACUTE ACCENT
+0302;CM # COMBINING CIRCUMFLEX ACCENT
+0303;CM # COMBINING TILDE
+0304;CM # COMBINING MACRON
+0305;CM # COMBINING OVERLINE
+0306;CM # COMBINING BREVE
+0307;CM # COMBINING DOT ABOVE
+0308;CM # COMBINING DIAERESIS
+0309;CM # COMBINING HOOK ABOVE
+030A;CM # COMBINING RING ABOVE
+030B;CM # COMBINING DOUBLE ACUTE ACCENT
+030C;CM # COMBINING CARON
+030D;CM # COMBINING VERTICAL LINE ABOVE
+030E;CM # COMBINING DOUBLE VERTICAL LINE ABOVE
+030F;CM # COMBINING DOUBLE GRAVE ACCENT
+0310;CM # COMBINING CANDRABINDU
+0311;CM # COMBINING INVERTED BREVE
+0312;CM # COMBINING TURNED COMMA ABOVE
+0313;CM # COMBINING COMMA ABOVE
+0314;CM # COMBINING REVERSED COMMA ABOVE
+0315;CM # COMBINING COMMA ABOVE RIGHT
+0316;CM # COMBINING GRAVE ACCENT BELOW
+0317;CM # COMBINING ACUTE ACCENT BELOW
+0318;CM # COMBINING LEFT TACK BELOW
+0319;CM # COMBINING RIGHT TACK BELOW
+031A;CM # COMBINING LEFT ANGLE ABOVE
+031B;CM # COMBINING HORN
+031C;CM # COMBINING LEFT HALF RING BELOW
+031D;CM # COMBINING UP TACK BELOW
+031E;CM # COMBINING DOWN TACK BELOW
+031F;CM # COMBINING PLUS SIGN BELOW
+0320;CM # COMBINING MINUS SIGN BELOW
+0321;CM # COMBINING PALATALIZED HOOK BELOW
+0322;CM # COMBINING RETROFLEX HOOK BELOW
+0323;CM # COMBINING DOT BELOW
+0324;CM # COMBINING DIAERESIS BELOW
+0325;CM # COMBINING RING BELOW
+0326;CM # COMBINING COMMA BELOW
+0327;CM # COMBINING CEDILLA
+0328;CM # COMBINING OGONEK
+0329;CM # COMBINING VERTICAL LINE BELOW
+032A;CM # COMBINING BRIDGE BELOW
+032B;CM # COMBINING INVERTED DOUBLE ARCH BELOW
+032C;CM # COMBINING CARON BELOW
+032D;CM # COMBINING CIRCUMFLEX ACCENT BELOW
+032E;CM # COMBINING BREVE BELOW
+032F;CM # COMBINING INVERTED BREVE BELOW
+0330;CM # COMBINING TILDE BELOW
+0331;CM # COMBINING MACRON BELOW
+0332;CM # COMBINING LOW LINE
+0333;CM # COMBINING DOUBLE LOW LINE
+0334;CM # COMBINING TILDE OVERLAY
+0335;CM # COMBINING SHORT STROKE OVERLAY
+0336;CM # COMBINING LONG STROKE OVERLAY
+0337;CM # COMBINING SHORT SOLIDUS OVERLAY
+0338;CM # COMBINING LONG SOLIDUS OVERLAY
+0339;CM # COMBINING RIGHT HALF RING BELOW
+033A;CM # COMBINING INVERTED BRIDGE BELOW
+033B;CM # COMBINING SQUARE BELOW
+033C;CM # COMBINING SEAGULL BELOW
+033D;CM # COMBINING X ABOVE
+033E;CM # COMBINING VERTICAL TILDE
+033F;CM # COMBINING DOUBLE OVERLINE
+0340;CM # COMBINING GRAVE TONE MARK
+0341;CM # COMBINING ACUTE TONE MARK
+0342;CM # COMBINING GREEK PERISPOMENI
+0343;CM # COMBINING GREEK KORONIS
+0344;CM # COMBINING GREEK DIALYTIKA TONOS
+0345;CM # COMBINING GREEK YPOGEGRAMMENI
+0346;CM # COMBINING BRIDGE ABOVE
+0347;CM # COMBINING EQUALS SIGN BELOW
+0348;CM # COMBINING DOUBLE VERTICAL LINE BELOW
+0349;CM # COMBINING LEFT ANGLE BELOW
+034A;CM # COMBINING NOT TILDE ABOVE
+034B;CM # COMBINING HOMOTHETIC ABOVE
+034C;CM # COMBINING ALMOST EQUAL TO ABOVE
+034D;CM # COMBINING LEFT RIGHT ARROW BELOW
+034E;CM # COMBINING UPWARDS ARROW BELOW
+034F;GL # COMBINING GRAPHEME JOINER
+0350;CM # COMBINING RIGHT ARROWHEAD ABOVE
+0351;CM # COMBINING LEFT HALF RING ABOVE
+0352;CM # COMBINING FERMATA
+0353;CM # COMBINING X BELOW
+0354;CM # COMBINING LEFT ARROWHEAD BELOW
+0355;CM # COMBINING RIGHT ARROWHEAD BELOW
+0356;CM # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357;CM # COMBINING RIGHT HALF RING ABOVE
+0358;CM # COMBINING DOT ABOVE RIGHT
+0359;CM # COMBINING ASTERISK BELOW
+035A;CM # COMBINING DOUBLE RING BELOW
+035B;CM # COMBINING ZIGZAG ABOVE
+035C;CM # COMBINING DOUBLE BREVE BELOW
+035D;GL # COMBINING DOUBLE BREVE
+035E;GL # COMBINING DOUBLE MACRON
+035F;GL # COMBINING DOUBLE MACRON BELOW
+0360;GL # COMBINING DOUBLE TILDE
+0361;GL # COMBINING DOUBLE INVERTED BREVE
+0362;GL # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0363;CM # COMBINING LATIN SMALL LETTER A
+0364;CM # COMBINING LATIN SMALL LETTER E
+0365;CM # COMBINING LATIN SMALL LETTER I
+0366;CM # COMBINING LATIN SMALL LETTER O
+0367;CM # COMBINING LATIN SMALL LETTER U
+0368;CM # COMBINING LATIN SMALL LETTER C
+0369;CM # COMBINING LATIN SMALL LETTER D
+036A;CM # COMBINING LATIN SMALL LETTER H
+036B;CM # COMBINING LATIN SMALL LETTER M
+036C;CM # COMBINING LATIN SMALL LETTER R
+036D;CM # COMBINING LATIN SMALL LETTER T
+036E;CM # COMBINING LATIN SMALL LETTER V
+036F;CM # COMBINING LATIN SMALL LETTER X
+0374;AL # GREEK NUMERAL SIGN
+0375;AL # GREEK LOWER NUMERAL SIGN
+037A;AL # GREEK YPOGEGRAMMENI
+037E;IS # GREEK QUESTION MARK
+0384;AL # GREEK TONOS
+0385;AL # GREEK DIALYTIKA TONOS
+0386;AL # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387;AL # GREEK ANO TELEIA
+0388;AL # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389;AL # GREEK CAPITAL LETTER ETA WITH TONOS
+038A;AL # GREEK CAPITAL LETTER IOTA WITH TONOS
+038C;AL # GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E;AL # GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F;AL # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391;AL # GREEK CAPITAL LETTER ALPHA
+0392;AL # GREEK CAPITAL LETTER BETA
+0393;AL # GREEK CAPITAL LETTER GAMMA
+0394;AL # GREEK CAPITAL LETTER DELTA
+0395;AL # GREEK CAPITAL LETTER EPSILON
+0396;AL # GREEK CAPITAL LETTER ZETA
+0397;AL # GREEK CAPITAL LETTER ETA
+0398;AL # GREEK CAPITAL LETTER THETA
+0399;AL # GREEK CAPITAL LETTER IOTA
+039A;AL # GREEK CAPITAL LETTER KAPPA
+039B;AL # GREEK CAPITAL LETTER LAMDA
+039C;AL # GREEK CAPITAL LETTER MU
+039D;AL # GREEK CAPITAL LETTER NU
+039E;AL # GREEK CAPITAL LETTER XI
+039F;AL # GREEK CAPITAL LETTER OMICRON
+03A0;AL # GREEK CAPITAL LETTER PI
+03A1;AL # GREEK CAPITAL LETTER RHO
+03A3;AL # GREEK CAPITAL LETTER SIGMA
+03A4;AL # GREEK CAPITAL LETTER TAU
+03A5;AL # GREEK CAPITAL LETTER UPSILON
+03A6;AL # GREEK CAPITAL LETTER PHI
+03A7;AL # GREEK CAPITAL LETTER CHI
+03A8;AL # GREEK CAPITAL LETTER PSI
+03A9;AL # GREEK CAPITAL LETTER OMEGA
+03AA;AL # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB;AL # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03AC;AL # GREEK SMALL LETTER ALPHA WITH TONOS
+03AD;AL # GREEK SMALL LETTER EPSILON WITH TONOS
+03AE;AL # GREEK SMALL LETTER ETA WITH TONOS
+03AF;AL # GREEK SMALL LETTER IOTA WITH TONOS
+03B0;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03B1;AL # GREEK SMALL LETTER ALPHA
+03B2;AL # GREEK SMALL LETTER BETA
+03B3;AL # GREEK SMALL LETTER GAMMA
+03B4;AL # GREEK SMALL LETTER DELTA
+03B5;AL # GREEK SMALL LETTER EPSILON
+03B6;AL # GREEK SMALL LETTER ZETA
+03B7;AL # GREEK SMALL LETTER ETA
+03B8;AL # GREEK SMALL LETTER THETA
+03B9;AL # GREEK SMALL LETTER IOTA
+03BA;AL # GREEK SMALL LETTER KAPPA
+03BB;AL # GREEK SMALL LETTER LAMDA
+03BC;AL # GREEK SMALL LETTER MU
+03BD;AL # GREEK SMALL LETTER NU
+03BE;AL # GREEK SMALL LETTER XI
+03BF;AL # GREEK SMALL LETTER OMICRON
+03C0;AL # GREEK SMALL LETTER PI
+03C1;AL # GREEK SMALL LETTER RHO
+03C2;AL # GREEK SMALL LETTER FINAL SIGMA
+03C3;AL # GREEK SMALL LETTER SIGMA
+03C4;AL # GREEK SMALL LETTER TAU
+03C5;AL # GREEK SMALL LETTER UPSILON
+03C6;AL # GREEK SMALL LETTER PHI
+03C7;AL # GREEK SMALL LETTER CHI
+03C8;AL # GREEK SMALL LETTER PSI
+03C9;AL # GREEK SMALL LETTER OMEGA
+03CA;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+03CB;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+03CC;AL # GREEK SMALL LETTER OMICRON WITH TONOS
+03CD;AL # GREEK SMALL LETTER UPSILON WITH TONOS
+03CE;AL # GREEK SMALL LETTER OMEGA WITH TONOS
+03D0;AL # GREEK BETA SYMBOL
+03D1;AL # GREEK THETA SYMBOL
+03D2;AL # GREEK UPSILON WITH HOOK SYMBOL
+03D3;AL # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+03D4;AL # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+03D5;AL # GREEK PHI SYMBOL
+03D6;AL # GREEK PI SYMBOL
+03D7;AL # GREEK KAI SYMBOL
+03D8;AL # GREEK LETTER ARCHAIC KOPPA
+03D9;AL # GREEK SMALL LETTER ARCHAIC KOPPA
+03DA;AL # GREEK LETTER STIGMA
+03DB;AL # GREEK SMALL LETTER STIGMA
+03DC;AL # GREEK LETTER DIGAMMA
+03DD;AL # GREEK SMALL LETTER DIGAMMA
+03DE;AL # GREEK LETTER KOPPA
+03DF;AL # GREEK SMALL LETTER KOPPA
+03E0;AL # GREEK LETTER SAMPI
+03E1;AL # GREEK SMALL LETTER SAMPI
+03E2;AL # COPTIC CAPITAL LETTER SHEI
+03E3;AL # COPTIC SMALL LETTER SHEI
+03E4;AL # COPTIC CAPITAL LETTER FEI
+03E5;AL # COPTIC SMALL LETTER FEI
+03E6;AL # COPTIC CAPITAL LETTER KHEI
+03E7;AL # COPTIC SMALL LETTER KHEI
+03E8;AL # COPTIC CAPITAL LETTER HORI
+03E9;AL # COPTIC SMALL LETTER HORI
+03EA;AL # COPTIC CAPITAL LETTER GANGIA
+03EB;AL # COPTIC SMALL LETTER GANGIA
+03EC;AL # COPTIC CAPITAL LETTER SHIMA
+03ED;AL # COPTIC SMALL LETTER SHIMA
+03EE;AL # COPTIC CAPITAL LETTER DEI
+03EF;AL # COPTIC SMALL LETTER DEI
+03F0;AL # GREEK KAPPA SYMBOL
+03F1;AL # GREEK RHO SYMBOL
+03F2;AL # GREEK LUNATE SIGMA SYMBOL
+03F3;AL # GREEK LETTER YOT
+03F4;AL # GREEK CAPITAL THETA SYMBOL
+03F5;AL # GREEK LUNATE EPSILON SYMBOL
+03F6;AL # GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7;AL # GREEK CAPITAL LETTER SHO
+03F8;AL # GREEK SMALL LETTER SHO
+03F9;AL # GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA;AL # GREEK CAPITAL LETTER SAN
+03FB;AL # GREEK SMALL LETTER SAN
+03FC;AL # GREEK RHO WITH STROKE SYMBOL
+03FD;AL # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+03FE;AL # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+03FF;AL # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0400;AL # CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401;AL # CYRILLIC CAPITAL LETTER IO
+0402;AL # CYRILLIC CAPITAL LETTER DJE
+0403;AL # CYRILLIC CAPITAL LETTER GJE
+0404;AL # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405;AL # CYRILLIC CAPITAL LETTER DZE
+0406;AL # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407;AL # CYRILLIC CAPITAL LETTER YI
+0408;AL # CYRILLIC CAPITAL LETTER JE
+0409;AL # CYRILLIC CAPITAL LETTER LJE
+040A;AL # CYRILLIC CAPITAL LETTER NJE
+040B;AL # CYRILLIC CAPITAL LETTER TSHE
+040C;AL # CYRILLIC CAPITAL LETTER KJE
+040D;AL # CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E;AL # CYRILLIC CAPITAL LETTER SHORT U
+040F;AL # CYRILLIC CAPITAL LETTER DZHE
+0410;AL # CYRILLIC CAPITAL LETTER A
+0411;AL # CYRILLIC CAPITAL LETTER BE
+0412;AL # CYRILLIC CAPITAL LETTER VE
+0413;AL # CYRILLIC CAPITAL LETTER GHE
+0414;AL # CYRILLIC CAPITAL LETTER DE
+0415;AL # CYRILLIC CAPITAL LETTER IE
+0416;AL # CYRILLIC CAPITAL LETTER ZHE
+0417;AL # CYRILLIC CAPITAL LETTER ZE
+0418;AL # CYRILLIC CAPITAL LETTER I
+0419;AL # CYRILLIC CAPITAL LETTER SHORT I
+041A;AL # CYRILLIC CAPITAL LETTER KA
+041B;AL # CYRILLIC CAPITAL LETTER EL
+041C;AL # CYRILLIC CAPITAL LETTER EM
+041D;AL # CYRILLIC CAPITAL LETTER EN
+041E;AL # CYRILLIC CAPITAL LETTER O
+041F;AL # CYRILLIC CAPITAL LETTER PE
+0420;AL # CYRILLIC CAPITAL LETTER ER
+0421;AL # CYRILLIC CAPITAL LETTER ES
+0422;AL # CYRILLIC CAPITAL LETTER TE
+0423;AL # CYRILLIC CAPITAL LETTER U
+0424;AL # CYRILLIC CAPITAL LETTER EF
+0425;AL # CYRILLIC CAPITAL LETTER HA
+0426;AL # CYRILLIC CAPITAL LETTER TSE
+0427;AL # CYRILLIC CAPITAL LETTER CHE
+0428;AL # CYRILLIC CAPITAL LETTER SHA
+0429;AL # CYRILLIC CAPITAL LETTER SHCHA
+042A;AL # CYRILLIC CAPITAL LETTER HARD SIGN
+042B;AL # CYRILLIC CAPITAL LETTER YERU
+042C;AL # CYRILLIC CAPITAL LETTER SOFT SIGN
+042D;AL # CYRILLIC CAPITAL LETTER E
+042E;AL # CYRILLIC CAPITAL LETTER YU
+042F;AL # CYRILLIC CAPITAL LETTER YA
+0430;AL # CYRILLIC SMALL LETTER A
+0431;AL # CYRILLIC SMALL LETTER BE
+0432;AL # CYRILLIC SMALL LETTER VE
+0433;AL # CYRILLIC SMALL LETTER GHE
+0434;AL # CYRILLIC SMALL LETTER DE
+0435;AL # CYRILLIC SMALL LETTER IE
+0436;AL # CYRILLIC SMALL LETTER ZHE
+0437;AL # CYRILLIC SMALL LETTER ZE
+0438;AL # CYRILLIC SMALL LETTER I
+0439;AL # CYRILLIC SMALL LETTER SHORT I
+043A;AL # CYRILLIC SMALL LETTER KA
+043B;AL # CYRILLIC SMALL LETTER EL
+043C;AL # CYRILLIC SMALL LETTER EM
+043D;AL # CYRILLIC SMALL LETTER EN
+043E;AL # CYRILLIC SMALL LETTER O
+043F;AL # CYRILLIC SMALL LETTER PE
+0440;AL # CYRILLIC SMALL LETTER ER
+0441;AL # CYRILLIC SMALL LETTER ES
+0442;AL # CYRILLIC SMALL LETTER TE
+0443;AL # CYRILLIC SMALL LETTER U
+0444;AL # CYRILLIC SMALL LETTER EF
+0445;AL # CYRILLIC SMALL LETTER HA
+0446;AL # CYRILLIC SMALL LETTER TSE
+0447;AL # CYRILLIC SMALL LETTER CHE
+0448;AL # CYRILLIC SMALL LETTER SHA
+0449;AL # CYRILLIC SMALL LETTER SHCHA
+044A;AL # CYRILLIC SMALL LETTER HARD SIGN
+044B;AL # CYRILLIC SMALL LETTER YERU
+044C;AL # CYRILLIC SMALL LETTER SOFT SIGN
+044D;AL # CYRILLIC SMALL LETTER E
+044E;AL # CYRILLIC SMALL LETTER YU
+044F;AL # CYRILLIC SMALL LETTER YA
+0450;AL # CYRILLIC SMALL LETTER IE WITH GRAVE
+0451;AL # CYRILLIC SMALL LETTER IO
+0452;AL # CYRILLIC SMALL LETTER DJE
+0453;AL # CYRILLIC SMALL LETTER GJE
+0454;AL # CYRILLIC SMALL LETTER UKRAINIAN IE
+0455;AL # CYRILLIC SMALL LETTER DZE
+0456;AL # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0457;AL # CYRILLIC SMALL LETTER YI
+0458;AL # CYRILLIC SMALL LETTER JE
+0459;AL # CYRILLIC SMALL LETTER LJE
+045A;AL # CYRILLIC SMALL LETTER NJE
+045B;AL # CYRILLIC SMALL LETTER TSHE
+045C;AL # CYRILLIC SMALL LETTER KJE
+045D;AL # CYRILLIC SMALL LETTER I WITH GRAVE
+045E;AL # CYRILLIC SMALL LETTER SHORT U
+045F;AL # CYRILLIC SMALL LETTER DZHE
+0460;AL # CYRILLIC CAPITAL LETTER OMEGA
+0461;AL # CYRILLIC SMALL LETTER OMEGA
+0462;AL # CYRILLIC CAPITAL LETTER YAT
+0463;AL # CYRILLIC SMALL LETTER YAT
+0464;AL # CYRILLIC CAPITAL LETTER IOTIFIED E
+0465;AL # CYRILLIC SMALL LETTER IOTIFIED E
+0466;AL # CYRILLIC CAPITAL LETTER LITTLE YUS
+0467;AL # CYRILLIC SMALL LETTER LITTLE YUS
+0468;AL # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469;AL # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A;AL # CYRILLIC CAPITAL LETTER BIG YUS
+046B;AL # CYRILLIC SMALL LETTER BIG YUS
+046C;AL # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D;AL # CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E;AL # CYRILLIC CAPITAL LETTER KSI
+046F;AL # CYRILLIC SMALL LETTER KSI
+0470;AL # CYRILLIC CAPITAL LETTER PSI
+0471;AL # CYRILLIC SMALL LETTER PSI
+0472;AL # CYRILLIC CAPITAL LETTER FITA
+0473;AL # CYRILLIC SMALL LETTER FITA
+0474;AL # CYRILLIC CAPITAL LETTER IZHITSA
+0475;AL # CYRILLIC SMALL LETTER IZHITSA
+0476;AL # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0477;AL # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478;AL # CYRILLIC CAPITAL LETTER UK
+0479;AL # CYRILLIC SMALL LETTER UK
+047A;AL # CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B;AL # CYRILLIC SMALL LETTER ROUND OMEGA
+047C;AL # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D;AL # CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E;AL # CYRILLIC CAPITAL LETTER OT
+047F;AL # CYRILLIC SMALL LETTER OT
+0480;AL # CYRILLIC CAPITAL LETTER KOPPA
+0481;AL # CYRILLIC SMALL LETTER KOPPA
+0482;AL # CYRILLIC THOUSANDS SIGN
+0483;CM # COMBINING CYRILLIC TITLO
+0484;CM # COMBINING CYRILLIC PALATALIZATION
+0485;CM # COMBINING CYRILLIC DASIA PNEUMATA
+0486;CM # COMBINING CYRILLIC PSILI PNEUMATA
+0488;CM # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489;CM # COMBINING CYRILLIC MILLIONS SIGN
+048A;AL # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048B;AL # CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048C;AL # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D;AL # CYRILLIC SMALL LETTER SEMISOFT SIGN
+048E;AL # CYRILLIC CAPITAL LETTER ER WITH TICK
+048F;AL # CYRILLIC SMALL LETTER ER WITH TICK
+0490;AL # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491;AL # CYRILLIC SMALL LETTER GHE WITH UPTURN
+0492;AL # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493;AL # CYRILLIC SMALL LETTER GHE WITH STROKE
+0494;AL # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495;AL # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0496;AL # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497;AL # CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0498;AL # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499;AL # CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049A;AL # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B;AL # CYRILLIC SMALL LETTER KA WITH DESCENDER
+049C;AL # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D;AL # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049E;AL # CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F;AL # CYRILLIC SMALL LETTER KA WITH STROKE
+04A0;AL # CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1;AL # CYRILLIC SMALL LETTER BASHKIR KA
+04A2;AL # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3;AL # CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A4;AL # CYRILLIC CAPITAL LIGATURE EN GHE
+04A5;AL # CYRILLIC SMALL LIGATURE EN GHE
+04A6;AL # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A7;AL # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A8;AL # CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9;AL # CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA;AL # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB;AL # CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AC;AL # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD;AL # CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AE;AL # CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF;AL # CYRILLIC SMALL LETTER STRAIGHT U
+04B0;AL # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1;AL # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B2;AL # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3;AL # CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B4;AL # CYRILLIC CAPITAL LIGATURE TE TSE
+04B5;AL # CYRILLIC SMALL LIGATURE TE TSE
+04B6;AL # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7;AL # CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B8;AL # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9;AL # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BA;AL # CYRILLIC CAPITAL LETTER SHHA
+04BB;AL # CYRILLIC SMALL LETTER SHHA
+04BC;AL # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD;AL # CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE;AL # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF;AL # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0;AL # CYRILLIC LETTER PALOCHKA
+04C1;AL # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C2;AL # CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C3;AL # CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4;AL # CYRILLIC SMALL LETTER KA WITH HOOK
+04C5;AL # CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C6;AL # CYRILLIC SMALL LETTER EL WITH TAIL
+04C7;AL # CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8;AL # CYRILLIC SMALL LETTER EN WITH HOOK
+04C9;AL # CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CA;AL # CYRILLIC SMALL LETTER EN WITH TAIL
+04CB;AL # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC;AL # CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CD;AL # CYRILLIC CAPITAL LETTER EM WITH TAIL
+04CE;AL # CYRILLIC SMALL LETTER EM WITH TAIL
+04D0;AL # CYRILLIC CAPITAL LETTER A WITH BREVE
+04D1;AL # CYRILLIC SMALL LETTER A WITH BREVE
+04D2;AL # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D3;AL # CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D4;AL # CYRILLIC CAPITAL LIGATURE A IE
+04D5;AL # CYRILLIC SMALL LIGATURE A IE
+04D6;AL # CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D7;AL # CYRILLIC SMALL LETTER IE WITH BREVE
+04D8;AL # CYRILLIC CAPITAL LETTER SCHWA
+04D9;AL # CYRILLIC SMALL LETTER SCHWA
+04DA;AL # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DB;AL # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DC;AL # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DD;AL # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DE;AL # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04DF;AL # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E0;AL # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1;AL # CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E2;AL # CYRILLIC CAPITAL LETTER I WITH MACRON
+04E3;AL # CYRILLIC SMALL LETTER I WITH MACRON
+04E4;AL # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E5;AL # CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E6;AL # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E7;AL # CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E8;AL # CYRILLIC CAPITAL LETTER BARRED O
+04E9;AL # CYRILLIC SMALL LETTER BARRED O
+04EA;AL # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EB;AL # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EC;AL # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04ED;AL # CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EE;AL # CYRILLIC CAPITAL LETTER U WITH MACRON
+04EF;AL # CYRILLIC SMALL LETTER U WITH MACRON
+04F0;AL # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F1;AL # CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F2;AL # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F3;AL # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F4;AL # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F5;AL # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F6;AL # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F7;AL # CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F8;AL # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04F9;AL # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+0500;AL # CYRILLIC CAPITAL LETTER KOMI DE
+0501;AL # CYRILLIC SMALL LETTER KOMI DE
+0502;AL # CYRILLIC CAPITAL LETTER KOMI DJE
+0503;AL # CYRILLIC SMALL LETTER KOMI DJE
+0504;AL # CYRILLIC CAPITAL LETTER KOMI ZJE
+0505;AL # CYRILLIC SMALL LETTER KOMI ZJE
+0506;AL # CYRILLIC CAPITAL LETTER KOMI DZJE
+0507;AL # CYRILLIC SMALL LETTER KOMI DZJE
+0508;AL # CYRILLIC CAPITAL LETTER KOMI LJE
+0509;AL # CYRILLIC SMALL LETTER KOMI LJE
+050A;AL # CYRILLIC CAPITAL LETTER KOMI NJE
+050B;AL # CYRILLIC SMALL LETTER KOMI NJE
+050C;AL # CYRILLIC CAPITAL LETTER KOMI SJE
+050D;AL # CYRILLIC SMALL LETTER KOMI SJE
+050E;AL # CYRILLIC CAPITAL LETTER KOMI TJE
+050F;AL # CYRILLIC SMALL LETTER KOMI TJE
+0531;AL # ARMENIAN CAPITAL LETTER AYB
+0532;AL # ARMENIAN CAPITAL LETTER BEN
+0533;AL # ARMENIAN CAPITAL LETTER GIM
+0534;AL # ARMENIAN CAPITAL LETTER DA
+0535;AL # ARMENIAN CAPITAL LETTER ECH
+0536;AL # ARMENIAN CAPITAL LETTER ZA
+0537;AL # ARMENIAN CAPITAL LETTER EH
+0538;AL # ARMENIAN CAPITAL LETTER ET
+0539;AL # ARMENIAN CAPITAL LETTER TO
+053A;AL # ARMENIAN CAPITAL LETTER ZHE
+053B;AL # ARMENIAN CAPITAL LETTER INI
+053C;AL # ARMENIAN CAPITAL LETTER LIWN
+053D;AL # ARMENIAN CAPITAL LETTER XEH
+053E;AL # ARMENIAN CAPITAL LETTER CA
+053F;AL # ARMENIAN CAPITAL LETTER KEN
+0540;AL # ARMENIAN CAPITAL LETTER HO
+0541;AL # ARMENIAN CAPITAL LETTER JA
+0542;AL # ARMENIAN CAPITAL LETTER GHAD
+0543;AL # ARMENIAN CAPITAL LETTER CHEH
+0544;AL # ARMENIAN CAPITAL LETTER MEN
+0545;AL # ARMENIAN CAPITAL LETTER YI
+0546;AL # ARMENIAN CAPITAL LETTER NOW
+0547;AL # ARMENIAN CAPITAL LETTER SHA
+0548;AL # ARMENIAN CAPITAL LETTER VO
+0549;AL # ARMENIAN CAPITAL LETTER CHA
+054A;AL # ARMENIAN CAPITAL LETTER PEH
+054B;AL # ARMENIAN CAPITAL LETTER JHEH
+054C;AL # ARMENIAN CAPITAL LETTER RA
+054D;AL # ARMENIAN CAPITAL LETTER SEH
+054E;AL # ARMENIAN CAPITAL LETTER VEW
+054F;AL # ARMENIAN CAPITAL LETTER TIWN
+0550;AL # ARMENIAN CAPITAL LETTER REH
+0551;AL # ARMENIAN CAPITAL LETTER CO
+0552;AL # ARMENIAN CAPITAL LETTER YIWN
+0553;AL # ARMENIAN CAPITAL LETTER PIWR
+0554;AL # ARMENIAN CAPITAL LETTER KEH
+0555;AL # ARMENIAN CAPITAL LETTER OH
+0556;AL # ARMENIAN CAPITAL LETTER FEH
+0559;AL # ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A;AL # ARMENIAN APOSTROPHE
+055B;AL # ARMENIAN EMPHASIS MARK
+055C;AL # ARMENIAN EXCLAMATION MARK
+055D;AL # ARMENIAN COMMA
+055E;AL # ARMENIAN QUESTION MARK
+055F;AL # ARMENIAN ABBREVIATION MARK
+0561;AL # ARMENIAN SMALL LETTER AYB
+0562;AL # ARMENIAN SMALL LETTER BEN
+0563;AL # ARMENIAN SMALL LETTER GIM
+0564;AL # ARMENIAN SMALL LETTER DA
+0565;AL # ARMENIAN SMALL LETTER ECH
+0566;AL # ARMENIAN SMALL LETTER ZA
+0567;AL # ARMENIAN SMALL LETTER EH
+0568;AL # ARMENIAN SMALL LETTER ET
+0569;AL # ARMENIAN SMALL LETTER TO
+056A;AL # ARMENIAN SMALL LETTER ZHE
+056B;AL # ARMENIAN SMALL LETTER INI
+056C;AL # ARMENIAN SMALL LETTER LIWN
+056D;AL # ARMENIAN SMALL LETTER XEH
+056E;AL # ARMENIAN SMALL LETTER CA
+056F;AL # ARMENIAN SMALL LETTER KEN
+0570;AL # ARMENIAN SMALL LETTER HO
+0571;AL # ARMENIAN SMALL LETTER JA
+0572;AL # ARMENIAN SMALL LETTER GHAD
+0573;AL # ARMENIAN SMALL LETTER CHEH
+0574;AL # ARMENIAN SMALL LETTER MEN
+0575;AL # ARMENIAN SMALL LETTER YI
+0576;AL # ARMENIAN SMALL LETTER NOW
+0577;AL # ARMENIAN SMALL LETTER SHA
+0578;AL # ARMENIAN SMALL LETTER VO
+0579;AL # ARMENIAN SMALL LETTER CHA
+057A;AL # ARMENIAN SMALL LETTER PEH
+057B;AL # ARMENIAN SMALL LETTER JHEH
+057C;AL # ARMENIAN SMALL LETTER RA
+057D;AL # ARMENIAN SMALL LETTER SEH
+057E;AL # ARMENIAN SMALL LETTER VEW
+057F;AL # ARMENIAN SMALL LETTER TIWN
+0580;AL # ARMENIAN SMALL LETTER REH
+0581;AL # ARMENIAN SMALL LETTER CO
+0582;AL # ARMENIAN SMALL LETTER YIWN
+0583;AL # ARMENIAN SMALL LETTER PIWR
+0584;AL # ARMENIAN SMALL LETTER KEH
+0585;AL # ARMENIAN SMALL LETTER OH
+0586;AL # ARMENIAN SMALL LETTER FEH
+0587;AL # ARMENIAN SMALL LIGATURE ECH YIWN
+0589;IS # ARMENIAN FULL STOP
+058A;BA # ARMENIAN HYPHEN
+0591;CM # HEBREW ACCENT ETNAHTA
+0592;CM # HEBREW ACCENT SEGOL
+0593;CM # HEBREW ACCENT SHALSHELET
+0594;CM # HEBREW ACCENT ZAQEF QATAN
+0595;CM # HEBREW ACCENT ZAQEF GADOL
+0596;CM # HEBREW ACCENT TIPEHA
+0597;CM # HEBREW ACCENT REVIA
+0598;CM # HEBREW ACCENT ZARQA
+0599;CM # HEBREW ACCENT PASHTA
+059A;CM # HEBREW ACCENT YETIV
+059B;CM # HEBREW ACCENT TEVIR
+059C;CM # HEBREW ACCENT GERESH
+059D;CM # HEBREW ACCENT GERESH MUQDAM
+059E;CM # HEBREW ACCENT GERSHAYIM
+059F;CM # HEBREW ACCENT QARNEY PARA
+05A0;CM # HEBREW ACCENT TELISHA GEDOLA
+05A1;CM # HEBREW ACCENT PAZER
+05A2;CM # HEBREW ACCENT ATNAH HAFUKH
+05A3;CM # HEBREW ACCENT MUNAH
+05A4;CM # HEBREW ACCENT MAHAPAKH
+05A5;CM # HEBREW ACCENT MERKHA
+05A6;CM # HEBREW ACCENT MERKHA KEFULA
+05A7;CM # HEBREW ACCENT DARGA
+05A8;CM # HEBREW ACCENT QADMA
+05A9;CM # HEBREW ACCENT TELISHA QETANA
+05AA;CM # HEBREW ACCENT YERAH BEN YOMO
+05AB;CM # HEBREW ACCENT OLE
+05AC;CM # HEBREW ACCENT ILUY
+05AD;CM # HEBREW ACCENT DEHI
+05AE;CM # HEBREW ACCENT ZINOR
+05AF;CM # HEBREW MARK MASORA CIRCLE
+05B0;CM # HEBREW POINT SHEVA
+05B1;CM # HEBREW POINT HATAF SEGOL
+05B2;CM # HEBREW POINT HATAF PATAH
+05B3;CM # HEBREW POINT HATAF QAMATS
+05B4;CM # HEBREW POINT HIRIQ
+05B5;CM # HEBREW POINT TSERE
+05B6;CM # HEBREW POINT SEGOL
+05B7;CM # HEBREW POINT PATAH
+05B8;CM # HEBREW POINT QAMATS
+05B9;CM # HEBREW POINT HOLAM
+05BB;CM # HEBREW POINT QUBUTS
+05BC;CM # HEBREW POINT DAGESH OR MAPIQ
+05BD;CM # HEBREW POINT METEG
+05BE;AL # HEBREW PUNCTUATION MAQAF
+05BF;CM # HEBREW POINT RAFE
+05C0;AL # HEBREW PUNCTUATION PASEQ
+05C1;CM # HEBREW POINT SHIN DOT
+05C2;CM # HEBREW POINT SIN DOT
+05C3;AL # HEBREW PUNCTUATION SOF PASUQ
+05C4;CM # HEBREW MARK UPPER DOT
+05C5;CM # HEBREW MARK LOWER DOT
+05C6;EX # HEBREW PUNCTUATION NUN HAFUKHA
+05C7;CM # HEBREW POINT QAMATS QATAN
+05D0;AL # HEBREW LETTER ALEF
+05D1;AL # HEBREW LETTER BET
+05D2;AL # HEBREW LETTER GIMEL
+05D3;AL # HEBREW LETTER DALET
+05D4;AL # HEBREW LETTER HE
+05D5;AL # HEBREW LETTER VAV
+05D6;AL # HEBREW LETTER ZAYIN
+05D7;AL # HEBREW LETTER HET
+05D8;AL # HEBREW LETTER TET
+05D9;AL # HEBREW LETTER YOD
+05DA;AL # HEBREW LETTER FINAL KAF
+05DB;AL # HEBREW LETTER KAF
+05DC;AL # HEBREW LETTER LAMED
+05DD;AL # HEBREW LETTER FINAL MEM
+05DE;AL # HEBREW LETTER MEM
+05DF;AL # HEBREW LETTER FINAL NUN
+05E0;AL # HEBREW LETTER NUN
+05E1;AL # HEBREW LETTER SAMEKH
+05E2;AL # HEBREW LETTER AYIN
+05E3;AL # HEBREW LETTER FINAL PE
+05E4;AL # HEBREW LETTER PE
+05E5;AL # HEBREW LETTER FINAL TSADI
+05E6;AL # HEBREW LETTER TSADI
+05E7;AL # HEBREW LETTER QOF
+05E8;AL # HEBREW LETTER RESH
+05E9;AL # HEBREW LETTER SHIN
+05EA;AL # HEBREW LETTER TAV
+05F0;AL # HEBREW LIGATURE YIDDISH DOUBLE VAV
+05F1;AL # HEBREW LIGATURE YIDDISH VAV YOD
+05F2;AL # HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3;AL # HEBREW PUNCTUATION GERESH
+05F4;AL # HEBREW PUNCTUATION GERSHAYIM
+0600;AL # ARABIC NUMBER SIGN
+0601;AL # ARABIC SIGN SANAH
+0602;AL # ARABIC FOOTNOTE MARKER
+0603;AL # ARABIC SIGN SAFHA
+060B;PO # AFGHANI SIGN
+060C;EX # ARABIC COMMA
+060D;IS # ARABIC DATE SEPARATOR
+060E;AL # ARABIC POETIC VERSE SIGN
+060F;AL # ARABIC SIGN MISRA
+0610;CM # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611;CM # ARABIC SIGN ALAYHE ASSALLAM
+0612;CM # ARABIC SIGN RAHMATULLAH ALAYHE
+0613;CM # ARABIC SIGN RADI ALLAHOU ANHU
+0614;CM # ARABIC SIGN TAKHALLUS
+0615;CM # ARABIC SMALL HIGH TAH
+061B;EX # ARABIC SEMICOLON
+061E;EX # ARABIC TRIPLE DOT PUNCTUATION MARK
+061F;EX # ARABIC QUESTION MARK
+0621;AL # ARABIC LETTER HAMZA
+0622;AL # ARABIC LETTER ALEF WITH MADDA ABOVE
+0623;AL # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0624;AL # ARABIC LETTER WAW WITH HAMZA ABOVE
+0625;AL # ARABIC LETTER ALEF WITH HAMZA BELOW
+0626;AL # ARABIC LETTER YEH WITH HAMZA ABOVE
+0627;AL # ARABIC LETTER ALEF
+0628;AL # ARABIC LETTER BEH
+0629;AL # ARABIC LETTER TEH MARBUTA
+062A;AL # ARABIC LETTER TEH
+062B;AL # ARABIC LETTER THEH
+062C;AL # ARABIC LETTER JEEM
+062D;AL # ARABIC LETTER HAH
+062E;AL # ARABIC LETTER KHAH
+062F;AL # ARABIC LETTER DAL
+0630;AL # ARABIC LETTER THAL
+0631;AL # ARABIC LETTER REH
+0632;AL # ARABIC LETTER ZAIN
+0633;AL # ARABIC LETTER SEEN
+0634;AL # ARABIC LETTER SHEEN
+0635;AL # ARABIC LETTER SAD
+0636;AL # ARABIC LETTER DAD
+0637;AL # ARABIC LETTER TAH
+0638;AL # ARABIC LETTER ZAH
+0639;AL # ARABIC LETTER AIN
+063A;AL # ARABIC LETTER GHAIN
+0640;AL # ARABIC TATWEEL
+0641;AL # ARABIC LETTER FEH
+0642;AL # ARABIC LETTER QAF
+0643;AL # ARABIC LETTER KAF
+0644;AL # ARABIC LETTER LAM
+0645;AL # ARABIC LETTER MEEM
+0646;AL # ARABIC LETTER NOON
+0647;AL # ARABIC LETTER HEH
+0648;AL # ARABIC LETTER WAW
+0649;AL # ARABIC LETTER ALEF MAKSURA
+064A;AL # ARABIC LETTER YEH
+064B;CM # ARABIC FATHATAN
+064C;CM # ARABIC DAMMATAN
+064D;CM # ARABIC KASRATAN
+064E;CM # ARABIC FATHA
+064F;CM # ARABIC DAMMA
+0650;CM # ARABIC KASRA
+0651;CM # ARABIC SHADDA
+0652;CM # ARABIC SUKUN
+0653;CM # ARABIC MADDAH ABOVE
+0654;CM # ARABIC HAMZA ABOVE
+0655;CM # ARABIC HAMZA BELOW
+0656;CM # ARABIC SUBSCRIPT ALEF
+0657;CM # ARABIC INVERTED DAMMA
+0658;CM # ARABIC MARK NOON GHUNNA
+0659;CM # ARABIC ZWARAKAY
+065A;CM # ARABIC VOWEL SIGN SMALL V ABOVE
+065B;CM # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+065C;CM # ARABIC VOWEL SIGN DOT BELOW
+065D;CM # ARABIC REVERSED DAMMA
+065E;CM # ARABIC FATHA WITH TWO DOTS
+0660;NU # ARABIC-INDIC DIGIT ZERO
+0661;NU # ARABIC-INDIC DIGIT ONE
+0662;NU # ARABIC-INDIC DIGIT TWO
+0663;NU # ARABIC-INDIC DIGIT THREE
+0664;NU # ARABIC-INDIC DIGIT FOUR
+0665;NU # ARABIC-INDIC DIGIT FIVE
+0666;NU # ARABIC-INDIC DIGIT SIX
+0667;NU # ARABIC-INDIC DIGIT SEVEN
+0668;NU # ARABIC-INDIC DIGIT EIGHT
+0669;NU # ARABIC-INDIC DIGIT NINE
+066A;EX # ARABIC PERCENT SIGN
+066B;NU # ARABIC DECIMAL SEPARATOR
+066C;NU # ARABIC THOUSANDS SEPARATOR
+066D;AL # ARABIC FIVE POINTED STAR
+066E;AL # ARABIC LETTER DOTLESS BEH
+066F;AL # ARABIC LETTER DOTLESS QAF
+0670;CM # ARABIC LETTER SUPERSCRIPT ALEF
+0671;AL # ARABIC LETTER ALEF WASLA
+0672;AL # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0673;AL # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0674;AL # ARABIC LETTER HIGH HAMZA
+0675;AL # ARABIC LETTER HIGH HAMZA ALEF
+0676;AL # ARABIC LETTER HIGH HAMZA WAW
+0677;AL # ARABIC LETTER U WITH HAMZA ABOVE
+0678;AL # ARABIC LETTER HIGH HAMZA YEH
+0679;AL # ARABIC LETTER TTEH
+067A;AL # ARABIC LETTER TTEHEH
+067B;AL # ARABIC LETTER BEEH
+067C;AL # ARABIC LETTER TEH WITH RING
+067D;AL # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067E;AL # ARABIC LETTER PEH
+067F;AL # ARABIC LETTER TEHEH
+0680;AL # ARABIC LETTER BEHEH
+0681;AL # ARABIC LETTER HAH WITH HAMZA ABOVE
+0682;AL # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0683;AL # ARABIC LETTER NYEH
+0684;AL # ARABIC LETTER DYEH
+0685;AL # ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0686;AL # ARABIC LETTER TCHEH
+0687;AL # ARABIC LETTER TCHEHEH
+0688;AL # ARABIC LETTER DDAL
+0689;AL # ARABIC LETTER DAL WITH RING
+068A;AL # ARABIC LETTER DAL WITH DOT BELOW
+068B;AL # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C;AL # ARABIC LETTER DAHAL
+068D;AL # ARABIC LETTER DDAHAL
+068E;AL # ARABIC LETTER DUL
+068F;AL # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690;AL # ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+0691;AL # ARABIC LETTER RREH
+0692;AL # ARABIC LETTER REH WITH SMALL V
+0693;AL # ARABIC LETTER REH WITH RING
+0694;AL # ARABIC LETTER REH WITH DOT BELOW
+0695;AL # ARABIC LETTER REH WITH SMALL V BELOW
+0696;AL # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697;AL # ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698;AL # ARABIC LETTER JEH
+0699;AL # ARABIC LETTER REH WITH FOUR DOTS ABOVE
+069A;AL # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B;AL # ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C;AL # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+069D;AL # ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E;AL # ARABIC LETTER SAD WITH THREE DOTS ABOVE
+069F;AL # ARABIC LETTER TAH WITH THREE DOTS ABOVE
+06A0;AL # ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06A1;AL # ARABIC LETTER DOTLESS FEH
+06A2;AL # ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3;AL # ARABIC LETTER FEH WITH DOT BELOW
+06A4;AL # ARABIC LETTER VEH
+06A5;AL # ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6;AL # ARABIC LETTER PEHEH
+06A7;AL # ARABIC LETTER QAF WITH DOT ABOVE
+06A8;AL # ARABIC LETTER QAF WITH THREE DOTS ABOVE
+06A9;AL # ARABIC LETTER KEHEH
+06AA;AL # ARABIC LETTER SWASH KAF
+06AB;AL # ARABIC LETTER KAF WITH RING
+06AC;AL # ARABIC LETTER KAF WITH DOT ABOVE
+06AD;AL # ARABIC LETTER NG
+06AE;AL # ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF;AL # ARABIC LETTER GAF
+06B0;AL # ARABIC LETTER GAF WITH RING
+06B1;AL # ARABIC LETTER NGOEH
+06B2;AL # ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3;AL # ARABIC LETTER GUEH
+06B4;AL # ARABIC LETTER GAF WITH THREE DOTS ABOVE
+06B5;AL # ARABIC LETTER LAM WITH SMALL V
+06B6;AL # ARABIC LETTER LAM WITH DOT ABOVE
+06B7;AL # ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8;AL # ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9;AL # ARABIC LETTER NOON WITH DOT BELOW
+06BA;AL # ARABIC LETTER NOON GHUNNA
+06BB;AL # ARABIC LETTER RNOON
+06BC;AL # ARABIC LETTER NOON WITH RING
+06BD;AL # ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06BE;AL # ARABIC LETTER HEH DOACHASHMEE
+06BF;AL # ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0;AL # ARABIC LETTER HEH WITH YEH ABOVE
+06C1;AL # ARABIC LETTER HEH GOAL
+06C2;AL # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06C3;AL # ARABIC LETTER TEH MARBUTA GOAL
+06C4;AL # ARABIC LETTER WAW WITH RING
+06C5;AL # ARABIC LETTER KIRGHIZ OE
+06C6;AL # ARABIC LETTER OE
+06C7;AL # ARABIC LETTER U
+06C8;AL # ARABIC LETTER YU
+06C9;AL # ARABIC LETTER KIRGHIZ YU
+06CA;AL # ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB;AL # ARABIC LETTER VE
+06CC;AL # ARABIC LETTER FARSI YEH
+06CD;AL # ARABIC LETTER YEH WITH TAIL
+06CE;AL # ARABIC LETTER YEH WITH SMALL V
+06CF;AL # ARABIC LETTER WAW WITH DOT ABOVE
+06D0;AL # ARABIC LETTER E
+06D1;AL # ARABIC LETTER YEH WITH THREE DOTS BELOW
+06D2;AL # ARABIC LETTER YEH BARREE
+06D3;AL # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4;EX # ARABIC FULL STOP
+06D5;AL # ARABIC LETTER AE
+06D6;CM # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7;CM # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8;CM # ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9;CM # ARABIC SMALL HIGH LAM ALEF
+06DA;CM # ARABIC SMALL HIGH JEEM
+06DB;CM # ARABIC SMALL HIGH THREE DOTS
+06DC;CM # ARABIC SMALL HIGH SEEN
+06DD;AL # ARABIC END OF AYAH
+06DE;CM # ARABIC START OF RUB EL HIZB
+06DF;CM # ARABIC SMALL HIGH ROUNDED ZERO
+06E0;CM # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1;CM # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2;CM # ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3;CM # ARABIC SMALL LOW SEEN
+06E4;CM # ARABIC SMALL HIGH MADDA
+06E5;AL # ARABIC SMALL WAW
+06E6;AL # ARABIC SMALL YEH
+06E7;CM # ARABIC SMALL HIGH YEH
+06E8;CM # ARABIC SMALL HIGH NOON
+06E9;AL # ARABIC PLACE OF SAJDAH
+06EA;CM # ARABIC EMPTY CENTRE LOW STOP
+06EB;CM # ARABIC EMPTY CENTRE HIGH STOP
+06EC;CM # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED;CM # ARABIC SMALL LOW MEEM
+06EE;AL # ARABIC LETTER DAL WITH INVERTED V
+06EF;AL # ARABIC LETTER REH WITH INVERTED V
+06F0;NU # EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1;NU # EXTENDED ARABIC-INDIC DIGIT ONE
+06F2;NU # EXTENDED ARABIC-INDIC DIGIT TWO
+06F3;NU # EXTENDED ARABIC-INDIC DIGIT THREE
+06F4;NU # EXTENDED ARABIC-INDIC DIGIT FOUR
+06F5;NU # EXTENDED ARABIC-INDIC DIGIT FIVE
+06F6;NU # EXTENDED ARABIC-INDIC DIGIT SIX
+06F7;NU # EXTENDED ARABIC-INDIC DIGIT SEVEN
+06F8;NU # EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9;NU # EXTENDED ARABIC-INDIC DIGIT NINE
+06FA;AL # ARABIC LETTER SHEEN WITH DOT BELOW
+06FB;AL # ARABIC LETTER DAD WITH DOT BELOW
+06FC;AL # ARABIC LETTER GHAIN WITH DOT BELOW
+06FD;AL # ARABIC SIGN SINDHI AMPERSAND
+06FE;AL # ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF;AL # ARABIC LETTER HEH WITH INVERTED V
+0700;AL # SYRIAC END OF PARAGRAPH
+0701;AL # SYRIAC SUPRALINEAR FULL STOP
+0702;AL # SYRIAC SUBLINEAR FULL STOP
+0703;AL # SYRIAC SUPRALINEAR COLON
+0704;AL # SYRIAC SUBLINEAR COLON
+0705;AL # SYRIAC HORIZONTAL COLON
+0706;AL # SYRIAC COLON SKEWED LEFT
+0707;AL # SYRIAC COLON SKEWED RIGHT
+0708;AL # SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709;AL # SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A;AL # SYRIAC CONTRACTION
+070B;AL # SYRIAC HARKLEAN OBELUS
+070C;AL # SYRIAC HARKLEAN METOBELUS
+070D;AL # SYRIAC HARKLEAN ASTERISCUS
+070F;AL # SYRIAC ABBREVIATION MARK
+0710;AL # SYRIAC LETTER ALAPH
+0711;CM # SYRIAC LETTER SUPERSCRIPT ALAPH
+0712;AL # SYRIAC LETTER BETH
+0713;AL # SYRIAC LETTER GAMAL
+0714;AL # SYRIAC LETTER GAMAL GARSHUNI
+0715;AL # SYRIAC LETTER DALATH
+0716;AL # SYRIAC LETTER DOTLESS DALATH RISH
+0717;AL # SYRIAC LETTER HE
+0718;AL # SYRIAC LETTER WAW
+0719;AL # SYRIAC LETTER ZAIN
+071A;AL # SYRIAC LETTER HETH
+071B;AL # SYRIAC LETTER TETH
+071C;AL # SYRIAC LETTER TETH GARSHUNI
+071D;AL # SYRIAC LETTER YUDH
+071E;AL # SYRIAC LETTER YUDH HE
+071F;AL # SYRIAC LETTER KAPH
+0720;AL # SYRIAC LETTER LAMADH
+0721;AL # SYRIAC LETTER MIM
+0722;AL # SYRIAC LETTER NUN
+0723;AL # SYRIAC LETTER SEMKATH
+0724;AL # SYRIAC LETTER FINAL SEMKATH
+0725;AL # SYRIAC LETTER E
+0726;AL # SYRIAC LETTER PE
+0727;AL # SYRIAC LETTER REVERSED PE
+0728;AL # SYRIAC LETTER SADHE
+0729;AL # SYRIAC LETTER QAPH
+072A;AL # SYRIAC LETTER RISH
+072B;AL # SYRIAC LETTER SHIN
+072C;AL # SYRIAC LETTER TAW
+072D;AL # SYRIAC LETTER PERSIAN BHETH
+072E;AL # SYRIAC LETTER PERSIAN GHAMAL
+072F;AL # SYRIAC LETTER PERSIAN DHALATH
+0730;CM # SYRIAC PTHAHA ABOVE
+0731;CM # SYRIAC PTHAHA BELOW
+0732;CM # SYRIAC PTHAHA DOTTED
+0733;CM # SYRIAC ZQAPHA ABOVE
+0734;CM # SYRIAC ZQAPHA BELOW
+0735;CM # SYRIAC ZQAPHA DOTTED
+0736;CM # SYRIAC RBASA ABOVE
+0737;CM # SYRIAC RBASA BELOW
+0738;CM # SYRIAC DOTTED ZLAMA HORIZONTAL
+0739;CM # SYRIAC DOTTED ZLAMA ANGULAR
+073A;CM # SYRIAC HBASA ABOVE
+073B;CM # SYRIAC HBASA BELOW
+073C;CM # SYRIAC HBASA-ESASA DOTTED
+073D;CM # SYRIAC ESASA ABOVE
+073E;CM # SYRIAC ESASA BELOW
+073F;CM # SYRIAC RWAHA
+0740;CM # SYRIAC FEMININE DOT
+0741;CM # SYRIAC QUSHSHAYA
+0742;CM # SYRIAC RUKKAKHA
+0743;CM # SYRIAC TWO VERTICAL DOTS ABOVE
+0744;CM # SYRIAC TWO VERTICAL DOTS BELOW
+0745;CM # SYRIAC THREE DOTS ABOVE
+0746;CM # SYRIAC THREE DOTS BELOW
+0747;CM # SYRIAC OBLIQUE LINE ABOVE
+0748;CM # SYRIAC OBLIQUE LINE BELOW
+0749;CM # SYRIAC MUSIC
+074A;CM # SYRIAC BARREKH
+074D;AL # SYRIAC LETTER SOGDIAN ZHAIN
+074E;AL # SYRIAC LETTER SOGDIAN KHAPH
+074F;AL # SYRIAC LETTER SOGDIAN FE
+0750;AL # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751;AL # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752;AL # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753;AL # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754;AL # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755;AL # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756;AL # ARABIC LETTER BEH WITH SMALL V
+0757;AL # ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758;AL # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+0759;AL # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+075A;AL # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+075B;AL # ARABIC LETTER REH WITH STROKE
+075C;AL # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+075D;AL # ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E;AL # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F;AL # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0760;AL # ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761;AL # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+0762;AL # ARABIC LETTER KEHEH WITH DOT ABOVE
+0763;AL # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+0764;AL # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0765;AL # ARABIC LETTER MEEM WITH DOT ABOVE
+0766;AL # ARABIC LETTER MEEM WITH DOT BELOW
+0767;AL # ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768;AL # ARABIC LETTER NOON WITH SMALL TAH
+0769;AL # ARABIC LETTER NOON WITH SMALL V
+076A;AL # ARABIC LETTER LAM WITH BAR
+076B;AL # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+076C;AL # ARABIC LETTER REH WITH HAMZA ABOVE
+076D;AL # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+0780;AL # THAANA LETTER HAA
+0781;AL # THAANA LETTER SHAVIYANI
+0782;AL # THAANA LETTER NOONU
+0783;AL # THAANA LETTER RAA
+0784;AL # THAANA LETTER BAA
+0785;AL # THAANA LETTER LHAVIYANI
+0786;AL # THAANA LETTER KAAFU
+0787;AL # THAANA LETTER ALIFU
+0788;AL # THAANA LETTER VAAVU
+0789;AL # THAANA LETTER MEEMU
+078A;AL # THAANA LETTER FAAFU
+078B;AL # THAANA LETTER DHAALU
+078C;AL # THAANA LETTER THAA
+078D;AL # THAANA LETTER LAAMU
+078E;AL # THAANA LETTER GAAFU
+078F;AL # THAANA LETTER GNAVIYANI
+0790;AL # THAANA LETTER SEENU
+0791;AL # THAANA LETTER DAVIYANI
+0792;AL # THAANA LETTER ZAVIYANI
+0793;AL # THAANA LETTER TAVIYANI
+0794;AL # THAANA LETTER YAA
+0795;AL # THAANA LETTER PAVIYANI
+0796;AL # THAANA LETTER JAVIYANI
+0797;AL # THAANA LETTER CHAVIYANI
+0798;AL # THAANA LETTER TTAA
+0799;AL # THAANA LETTER HHAA
+079A;AL # THAANA LETTER KHAA
+079B;AL # THAANA LETTER THAALU
+079C;AL # THAANA LETTER ZAA
+079D;AL # THAANA LETTER SHEENU
+079E;AL # THAANA LETTER SAADHU
+079F;AL # THAANA LETTER DAADHU
+07A0;AL # THAANA LETTER TO
+07A1;AL # THAANA LETTER ZO
+07A2;AL # THAANA LETTER AINU
+07A3;AL # THAANA LETTER GHAINU
+07A4;AL # THAANA LETTER QAAFU
+07A5;AL # THAANA LETTER WAAVU
+07A6;CM # THAANA ABAFILI
+07A7;CM # THAANA AABAAFILI
+07A8;CM # THAANA IBIFILI
+07A9;CM # THAANA EEBEEFILI
+07AA;CM # THAANA UBUFILI
+07AB;CM # THAANA OOBOOFILI
+07AC;CM # THAANA EBEFILI
+07AD;CM # THAANA EYBEYFILI
+07AE;CM # THAANA OBOFILI
+07AF;CM # THAANA OABOAFILI
+07B0;CM # THAANA SUKUN
+07B1;AL # THAANA LETTER NAA
+0901;CM # DEVANAGARI SIGN CANDRABINDU
+0902;CM # DEVANAGARI SIGN ANUSVARA
+0903;CM # DEVANAGARI SIGN VISARGA
+0904;AL # DEVANAGARI LETTER SHORT A
+0905;AL # DEVANAGARI LETTER A
+0906;AL # DEVANAGARI LETTER AA
+0907;AL # DEVANAGARI LETTER I
+0908;AL # DEVANAGARI LETTER II
+0909;AL # DEVANAGARI LETTER U
+090A;AL # DEVANAGARI LETTER UU
+090B;AL # DEVANAGARI LETTER VOCALIC R
+090C;AL # DEVANAGARI LETTER VOCALIC L
+090D;AL # DEVANAGARI LETTER CANDRA E
+090E;AL # DEVANAGARI LETTER SHORT E
+090F;AL # DEVANAGARI LETTER E
+0910;AL # DEVANAGARI LETTER AI
+0911;AL # DEVANAGARI LETTER CANDRA O
+0912;AL # DEVANAGARI LETTER SHORT O
+0913;AL # DEVANAGARI LETTER O
+0914;AL # DEVANAGARI LETTER AU
+0915;AL # DEVANAGARI LETTER KA
+0916;AL # DEVANAGARI LETTER KHA
+0917;AL # DEVANAGARI LETTER GA
+0918;AL # DEVANAGARI LETTER GHA
+0919;AL # DEVANAGARI LETTER NGA
+091A;AL # DEVANAGARI LETTER CA
+091B;AL # DEVANAGARI LETTER CHA
+091C;AL # DEVANAGARI LETTER JA
+091D;AL # DEVANAGARI LETTER JHA
+091E;AL # DEVANAGARI LETTER NYA
+091F;AL # DEVANAGARI LETTER TTA
+0920;AL # DEVANAGARI LETTER TTHA
+0921;AL # DEVANAGARI LETTER DDA
+0922;AL # DEVANAGARI LETTER DDHA
+0923;AL # DEVANAGARI LETTER NNA
+0924;AL # DEVANAGARI LETTER TA
+0925;AL # DEVANAGARI LETTER THA
+0926;AL # DEVANAGARI LETTER DA
+0927;AL # DEVANAGARI LETTER DHA
+0928;AL # DEVANAGARI LETTER NA
+0929;AL # DEVANAGARI LETTER NNNA
+092A;AL # DEVANAGARI LETTER PA
+092B;AL # DEVANAGARI LETTER PHA
+092C;AL # DEVANAGARI LETTER BA
+092D;AL # DEVANAGARI LETTER BHA
+092E;AL # DEVANAGARI LETTER MA
+092F;AL # DEVANAGARI LETTER YA
+0930;AL # DEVANAGARI LETTER RA
+0931;AL # DEVANAGARI LETTER RRA
+0932;AL # DEVANAGARI LETTER LA
+0933;AL # DEVANAGARI LETTER LLA
+0934;AL # DEVANAGARI LETTER LLLA
+0935;AL # DEVANAGARI LETTER VA
+0936;AL # DEVANAGARI LETTER SHA
+0937;AL # DEVANAGARI LETTER SSA
+0938;AL # DEVANAGARI LETTER SA
+0939;AL # DEVANAGARI LETTER HA
+093C;CM # DEVANAGARI SIGN NUKTA
+093D;AL # DEVANAGARI SIGN AVAGRAHA
+093E;CM # DEVANAGARI VOWEL SIGN AA
+093F;CM # DEVANAGARI VOWEL SIGN I
+0940;CM # DEVANAGARI VOWEL SIGN II
+0941;CM # DEVANAGARI VOWEL SIGN U
+0942;CM # DEVANAGARI VOWEL SIGN UU
+0943;CM # DEVANAGARI VOWEL SIGN VOCALIC R
+0944;CM # DEVANAGARI VOWEL SIGN VOCALIC RR
+0945;CM # DEVANAGARI VOWEL SIGN CANDRA E
+0946;CM # DEVANAGARI VOWEL SIGN SHORT E
+0947;CM # DEVANAGARI VOWEL SIGN E
+0948;CM # DEVANAGARI VOWEL SIGN AI
+0949;CM # DEVANAGARI VOWEL SIGN CANDRA O
+094A;CM # DEVANAGARI VOWEL SIGN SHORT O
+094B;CM # DEVANAGARI VOWEL SIGN O
+094C;CM # DEVANAGARI VOWEL SIGN AU
+094D;CM # DEVANAGARI SIGN VIRAMA
+0950;AL # DEVANAGARI OM
+0951;CM # DEVANAGARI STRESS SIGN UDATTA
+0952;CM # DEVANAGARI STRESS SIGN ANUDATTA
+0953;CM # DEVANAGARI GRAVE ACCENT
+0954;CM # DEVANAGARI ACUTE ACCENT
+0958;AL # DEVANAGARI LETTER QA
+0959;AL # DEVANAGARI LETTER KHHA
+095A;AL # DEVANAGARI LETTER GHHA
+095B;AL # DEVANAGARI LETTER ZA
+095C;AL # DEVANAGARI LETTER DDDHA
+095D;AL # DEVANAGARI LETTER RHA
+095E;AL # DEVANAGARI LETTER FA
+095F;AL # DEVANAGARI LETTER YYA
+0960;AL # DEVANAGARI LETTER VOCALIC RR
+0961;AL # DEVANAGARI LETTER VOCALIC LL
+0962;CM # DEVANAGARI VOWEL SIGN VOCALIC L
+0963;CM # DEVANAGARI VOWEL SIGN VOCALIC LL
+0964;BA # DEVANAGARI DANDA
+0965;BA # DEVANAGARI DOUBLE DANDA
+0966;NU # DEVANAGARI DIGIT ZERO
+0967;NU # DEVANAGARI DIGIT ONE
+0968;NU # DEVANAGARI DIGIT TWO
+0969;NU # DEVANAGARI DIGIT THREE
+096A;NU # DEVANAGARI DIGIT FOUR
+096B;NU # DEVANAGARI DIGIT FIVE
+096C;NU # DEVANAGARI DIGIT SIX
+096D;NU # DEVANAGARI DIGIT SEVEN
+096E;NU # DEVANAGARI DIGIT EIGHT
+096F;NU # DEVANAGARI DIGIT NINE
+0970;AL # DEVANAGARI ABBREVIATION SIGN
+097D;AL # DEVANAGARI LETTER GLOTTAL STOP
+0981;CM # BENGALI SIGN CANDRABINDU
+0982;CM # BENGALI SIGN ANUSVARA
+0983;CM # BENGALI SIGN VISARGA
+0985;AL # BENGALI LETTER A
+0986;AL # BENGALI LETTER AA
+0987;AL # BENGALI LETTER I
+0988;AL # BENGALI LETTER II
+0989;AL # BENGALI LETTER U
+098A;AL # BENGALI LETTER UU
+098B;AL # BENGALI LETTER VOCALIC R
+098C;AL # BENGALI LETTER VOCALIC L
+098F;AL # BENGALI LETTER E
+0990;AL # BENGALI LETTER AI
+0993;AL # BENGALI LETTER O
+0994;AL # BENGALI LETTER AU
+0995;AL # BENGALI LETTER KA
+0996;AL # BENGALI LETTER KHA
+0997;AL # BENGALI LETTER GA
+0998;AL # BENGALI LETTER GHA
+0999;AL # BENGALI LETTER NGA
+099A;AL # BENGALI LETTER CA
+099B;AL # BENGALI LETTER CHA
+099C;AL # BENGALI LETTER JA
+099D;AL # BENGALI LETTER JHA
+099E;AL # BENGALI LETTER NYA
+099F;AL # BENGALI LETTER TTA
+09A0;AL # BENGALI LETTER TTHA
+09A1;AL # BENGALI LETTER DDA
+09A2;AL # BENGALI LETTER DDHA
+09A3;AL # BENGALI LETTER NNA
+09A4;AL # BENGALI LETTER TA
+09A5;AL # BENGALI LETTER THA
+09A6;AL # BENGALI LETTER DA
+09A7;AL # BENGALI LETTER DHA
+09A8;AL # BENGALI LETTER NA
+09AA;AL # BENGALI LETTER PA
+09AB;AL # BENGALI LETTER PHA
+09AC;AL # BENGALI LETTER BA
+09AD;AL # BENGALI LETTER BHA
+09AE;AL # BENGALI LETTER MA
+09AF;AL # BENGALI LETTER YA
+09B0;AL # BENGALI LETTER RA
+09B2;AL # BENGALI LETTER LA
+09B6;AL # BENGALI LETTER SHA
+09B7;AL # BENGALI LETTER SSA
+09B8;AL # BENGALI LETTER SA
+09B9;AL # BENGALI LETTER HA
+09BC;CM # BENGALI SIGN NUKTA
+09BD;AL # BENGALI SIGN AVAGRAHA
+09BE;CM # BENGALI VOWEL SIGN AA
+09BF;CM # BENGALI VOWEL SIGN I
+09C0;CM # BENGALI VOWEL SIGN II
+09C1;CM # BENGALI VOWEL SIGN U
+09C2;CM # BENGALI VOWEL SIGN UU
+09C3;CM # BENGALI VOWEL SIGN VOCALIC R
+09C4;CM # BENGALI VOWEL SIGN VOCALIC RR
+09C7;CM # BENGALI VOWEL SIGN E
+09C8;CM # BENGALI VOWEL SIGN AI
+09CB;CM # BENGALI VOWEL SIGN O
+09CC;CM # BENGALI VOWEL SIGN AU
+09CD;CM # BENGALI SIGN VIRAMA
+09CE;AL # BENGALI LETTER KHANDA TA
+09D7;CM # BENGALI AU LENGTH MARK
+09DC;AL # BENGALI LETTER RRA
+09DD;AL # BENGALI LETTER RHA
+09DF;AL # BENGALI LETTER YYA
+09E0;AL # BENGALI LETTER VOCALIC RR
+09E1;AL # BENGALI LETTER VOCALIC LL
+09E2;CM # BENGALI VOWEL SIGN VOCALIC L
+09E3;CM # BENGALI VOWEL SIGN VOCALIC LL
+09E6;NU # BENGALI DIGIT ZERO
+09E7;NU # BENGALI DIGIT ONE
+09E8;NU # BENGALI DIGIT TWO
+09E9;NU # BENGALI DIGIT THREE
+09EA;NU # BENGALI DIGIT FOUR
+09EB;NU # BENGALI DIGIT FIVE
+09EC;NU # BENGALI DIGIT SIX
+09ED;NU # BENGALI DIGIT SEVEN
+09EE;NU # BENGALI DIGIT EIGHT
+09EF;NU # BENGALI DIGIT NINE
+09F0;AL # BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09F1;AL # BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2;PR # BENGALI RUPEE MARK
+09F3;PR # BENGALI RUPEE SIGN
+09F4;AL # BENGALI CURRENCY NUMERATOR ONE
+09F5;AL # BENGALI CURRENCY NUMERATOR TWO
+09F6;AL # BENGALI CURRENCY NUMERATOR THREE
+09F7;AL # BENGALI CURRENCY NUMERATOR FOUR
+09F8;AL # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9;AL # BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA;AL # BENGALI ISSHAR
+0A01;CM # GURMUKHI SIGN ADAK BINDI
+0A02;CM # GURMUKHI SIGN BINDI
+0A03;CM # GURMUKHI SIGN VISARGA
+0A05;AL # GURMUKHI LETTER A
+0A06;AL # GURMUKHI LETTER AA
+0A07;AL # GURMUKHI LETTER I
+0A08;AL # GURMUKHI LETTER II
+0A09;AL # GURMUKHI LETTER U
+0A0A;AL # GURMUKHI LETTER UU
+0A0F;AL # GURMUKHI LETTER EE
+0A10;AL # GURMUKHI LETTER AI
+0A13;AL # GURMUKHI LETTER OO
+0A14;AL # GURMUKHI LETTER AU
+0A15;AL # GURMUKHI LETTER KA
+0A16;AL # GURMUKHI LETTER KHA
+0A17;AL # GURMUKHI LETTER GA
+0A18;AL # GURMUKHI LETTER GHA
+0A19;AL # GURMUKHI LETTER NGA
+0A1A;AL # GURMUKHI LETTER CA
+0A1B;AL # GURMUKHI LETTER CHA
+0A1C;AL # GURMUKHI LETTER JA
+0A1D;AL # GURMUKHI LETTER JHA
+0A1E;AL # GURMUKHI LETTER NYA
+0A1F;AL # GURMUKHI LETTER TTA
+0A20;AL # GURMUKHI LETTER TTHA
+0A21;AL # GURMUKHI LETTER DDA
+0A22;AL # GURMUKHI LETTER DDHA
+0A23;AL # GURMUKHI LETTER NNA
+0A24;AL # GURMUKHI LETTER TA
+0A25;AL # GURMUKHI LETTER THA
+0A26;AL # GURMUKHI LETTER DA
+0A27;AL # GURMUKHI LETTER DHA
+0A28;AL # GURMUKHI LETTER NA
+0A2A;AL # GURMUKHI LETTER PA
+0A2B;AL # GURMUKHI LETTER PHA
+0A2C;AL # GURMUKHI LETTER BA
+0A2D;AL # GURMUKHI LETTER BHA
+0A2E;AL # GURMUKHI LETTER MA
+0A2F;AL # GURMUKHI LETTER YA
+0A30;AL # GURMUKHI LETTER RA
+0A32;AL # GURMUKHI LETTER LA
+0A33;AL # GURMUKHI LETTER LLA
+0A35;AL # GURMUKHI LETTER VA
+0A36;AL # GURMUKHI LETTER SHA
+0A38;AL # GURMUKHI LETTER SA
+0A39;AL # GURMUKHI LETTER HA
+0A3C;CM # GURMUKHI SIGN NUKTA
+0A3E;CM # GURMUKHI VOWEL SIGN AA
+0A3F;CM # GURMUKHI VOWEL SIGN I
+0A40;CM # GURMUKHI VOWEL SIGN II
+0A41;CM # GURMUKHI VOWEL SIGN U
+0A42;CM # GURMUKHI VOWEL SIGN UU
+0A47;CM # GURMUKHI VOWEL SIGN EE
+0A48;CM # GURMUKHI VOWEL SIGN AI
+0A4B;CM # GURMUKHI VOWEL SIGN OO
+0A4C;CM # GURMUKHI VOWEL SIGN AU
+0A4D;CM # GURMUKHI SIGN VIRAMA
+0A59;AL # GURMUKHI LETTER KHHA
+0A5A;AL # GURMUKHI LETTER GHHA
+0A5B;AL # GURMUKHI LETTER ZA
+0A5C;AL # GURMUKHI LETTER RRA
+0A5E;AL # GURMUKHI LETTER FA
+0A66;NU # GURMUKHI DIGIT ZERO
+0A67;NU # GURMUKHI DIGIT ONE
+0A68;NU # GURMUKHI DIGIT TWO
+0A69;NU # GURMUKHI DIGIT THREE
+0A6A;NU # GURMUKHI DIGIT FOUR
+0A6B;NU # GURMUKHI DIGIT FIVE
+0A6C;NU # GURMUKHI DIGIT SIX
+0A6D;NU # GURMUKHI DIGIT SEVEN
+0A6E;NU # GURMUKHI DIGIT EIGHT
+0A6F;NU # GURMUKHI DIGIT NINE
+0A70;CM # GURMUKHI TIPPI
+0A71;CM # GURMUKHI ADDAK
+0A72;AL # GURMUKHI IRI
+0A73;AL # GURMUKHI URA
+0A74;AL # GURMUKHI EK ONKAR
+0A81;CM # GUJARATI SIGN CANDRABINDU
+0A82;CM # GUJARATI SIGN ANUSVARA
+0A83;CM # GUJARATI SIGN VISARGA
+0A85;AL # GUJARATI LETTER A
+0A86;AL # GUJARATI LETTER AA
+0A87;AL # GUJARATI LETTER I
+0A88;AL # GUJARATI LETTER II
+0A89;AL # GUJARATI LETTER U
+0A8A;AL # GUJARATI LETTER UU
+0A8B;AL # GUJARATI LETTER VOCALIC R
+0A8C;AL # GUJARATI LETTER VOCALIC L
+0A8D;AL # GUJARATI VOWEL CANDRA E
+0A8F;AL # GUJARATI LETTER E
+0A90;AL # GUJARATI LETTER AI
+0A91;AL # GUJARATI VOWEL CANDRA O
+0A93;AL # GUJARATI LETTER O
+0A94;AL # GUJARATI LETTER AU
+0A95;AL # GUJARATI LETTER KA
+0A96;AL # GUJARATI LETTER KHA
+0A97;AL # GUJARATI LETTER GA
+0A98;AL # GUJARATI LETTER GHA
+0A99;AL # GUJARATI LETTER NGA
+0A9A;AL # GUJARATI LETTER CA
+0A9B;AL # GUJARATI LETTER CHA
+0A9C;AL # GUJARATI LETTER JA
+0A9D;AL # GUJARATI LETTER JHA
+0A9E;AL # GUJARATI LETTER NYA
+0A9F;AL # GUJARATI LETTER TTA
+0AA0;AL # GUJARATI LETTER TTHA
+0AA1;AL # GUJARATI LETTER DDA
+0AA2;AL # GUJARATI LETTER DDHA
+0AA3;AL # GUJARATI LETTER NNA
+0AA4;AL # GUJARATI LETTER TA
+0AA5;AL # GUJARATI LETTER THA
+0AA6;AL # GUJARATI LETTER DA
+0AA7;AL # GUJARATI LETTER DHA
+0AA8;AL # GUJARATI LETTER NA
+0AAA;AL # GUJARATI LETTER PA
+0AAB;AL # GUJARATI LETTER PHA
+0AAC;AL # GUJARATI LETTER BA
+0AAD;AL # GUJARATI LETTER BHA
+0AAE;AL # GUJARATI LETTER MA
+0AAF;AL # GUJARATI LETTER YA
+0AB0;AL # GUJARATI LETTER RA
+0AB2;AL # GUJARATI LETTER LA
+0AB3;AL # GUJARATI LETTER LLA
+0AB5;AL # GUJARATI LETTER VA
+0AB6;AL # GUJARATI LETTER SHA
+0AB7;AL # GUJARATI LETTER SSA
+0AB8;AL # GUJARATI LETTER SA
+0AB9;AL # GUJARATI LETTER HA
+0ABC;CM # GUJARATI SIGN NUKTA
+0ABD;AL # GUJARATI SIGN AVAGRAHA
+0ABE;CM # GUJARATI VOWEL SIGN AA
+0ABF;CM # GUJARATI VOWEL SIGN I
+0AC0;CM # GUJARATI VOWEL SIGN II
+0AC1;CM # GUJARATI VOWEL SIGN U
+0AC2;CM # GUJARATI VOWEL SIGN UU
+0AC3;CM # GUJARATI VOWEL SIGN VOCALIC R
+0AC4;CM # GUJARATI VOWEL SIGN VOCALIC RR
+0AC5;CM # GUJARATI VOWEL SIGN CANDRA E
+0AC7;CM # GUJARATI VOWEL SIGN E
+0AC8;CM # GUJARATI VOWEL SIGN AI
+0AC9;CM # GUJARATI VOWEL SIGN CANDRA O
+0ACB;CM # GUJARATI VOWEL SIGN O
+0ACC;CM # GUJARATI VOWEL SIGN AU
+0ACD;CM # GUJARATI SIGN VIRAMA
+0AD0;AL # GUJARATI OM
+0AE0;AL # GUJARATI LETTER VOCALIC RR
+0AE1;AL # GUJARATI LETTER VOCALIC LL
+0AE2;CM # GUJARATI VOWEL SIGN VOCALIC L
+0AE3;CM # GUJARATI VOWEL SIGN VOCALIC LL
+0AE6;NU # GUJARATI DIGIT ZERO
+0AE7;NU # GUJARATI DIGIT ONE
+0AE8;NU # GUJARATI DIGIT TWO
+0AE9;NU # GUJARATI DIGIT THREE
+0AEA;NU # GUJARATI DIGIT FOUR
+0AEB;NU # GUJARATI DIGIT FIVE
+0AEC;NU # GUJARATI DIGIT SIX
+0AED;NU # GUJARATI DIGIT SEVEN
+0AEE;NU # GUJARATI DIGIT EIGHT
+0AEF;NU # GUJARATI DIGIT NINE
+0AF1;PR # GUJARATI RUPEE SIGN
+0B01;CM # ORIYA SIGN CANDRABINDU
+0B02;CM # ORIYA SIGN ANUSVARA
+0B03;CM # ORIYA SIGN VISARGA
+0B05;AL # ORIYA LETTER A
+0B06;AL # ORIYA LETTER AA
+0B07;AL # ORIYA LETTER I
+0B08;AL # ORIYA LETTER II
+0B09;AL # ORIYA LETTER U
+0B0A;AL # ORIYA LETTER UU
+0B0B;AL # ORIYA LETTER VOCALIC R
+0B0C;AL # ORIYA LETTER VOCALIC L
+0B0F;AL # ORIYA LETTER E
+0B10;AL # ORIYA LETTER AI
+0B13;AL # ORIYA LETTER O
+0B14;AL # ORIYA LETTER AU
+0B15;AL # ORIYA LETTER KA
+0B16;AL # ORIYA LETTER KHA
+0B17;AL # ORIYA LETTER GA
+0B18;AL # ORIYA LETTER GHA
+0B19;AL # ORIYA LETTER NGA
+0B1A;AL # ORIYA LETTER CA
+0B1B;AL # ORIYA LETTER CHA
+0B1C;AL # ORIYA LETTER JA
+0B1D;AL # ORIYA LETTER JHA
+0B1E;AL # ORIYA LETTER NYA
+0B1F;AL # ORIYA LETTER TTA
+0B20;AL # ORIYA LETTER TTHA
+0B21;AL # ORIYA LETTER DDA
+0B22;AL # ORIYA LETTER DDHA
+0B23;AL # ORIYA LETTER NNA
+0B24;AL # ORIYA LETTER TA
+0B25;AL # ORIYA LETTER THA
+0B26;AL # ORIYA LETTER DA
+0B27;AL # ORIYA LETTER DHA
+0B28;AL # ORIYA LETTER NA
+0B2A;AL # ORIYA LETTER PA
+0B2B;AL # ORIYA LETTER PHA
+0B2C;AL # ORIYA LETTER BA
+0B2D;AL # ORIYA LETTER BHA
+0B2E;AL # ORIYA LETTER MA
+0B2F;AL # ORIYA LETTER YA
+0B30;AL # ORIYA LETTER RA
+0B32;AL # ORIYA LETTER LA
+0B33;AL # ORIYA LETTER LLA
+0B35;AL # ORIYA LETTER VA
+0B36;AL # ORIYA LETTER SHA
+0B37;AL # ORIYA LETTER SSA
+0B38;AL # ORIYA LETTER SA
+0B39;AL # ORIYA LETTER HA
+0B3C;CM # ORIYA SIGN NUKTA
+0B3D;AL # ORIYA SIGN AVAGRAHA
+0B3E;CM # ORIYA VOWEL SIGN AA
+0B3F;CM # ORIYA VOWEL SIGN I
+0B40;CM # ORIYA VOWEL SIGN II
+0B41;CM # ORIYA VOWEL SIGN U
+0B42;CM # ORIYA VOWEL SIGN UU
+0B43;CM # ORIYA VOWEL SIGN VOCALIC R
+0B47;CM # ORIYA VOWEL SIGN E
+0B48;CM # ORIYA VOWEL SIGN AI
+0B4B;CM # ORIYA VOWEL SIGN O
+0B4C;CM # ORIYA VOWEL SIGN AU
+0B4D;CM # ORIYA SIGN VIRAMA
+0B56;CM # ORIYA AI LENGTH MARK
+0B57;CM # ORIYA AU LENGTH MARK
+0B5C;AL # ORIYA LETTER RRA
+0B5D;AL # ORIYA LETTER RHA
+0B5F;AL # ORIYA LETTER YYA
+0B60;AL # ORIYA LETTER VOCALIC RR
+0B61;AL # ORIYA LETTER VOCALIC LL
+0B66;NU # ORIYA DIGIT ZERO
+0B67;NU # ORIYA DIGIT ONE
+0B68;NU # ORIYA DIGIT TWO
+0B69;NU # ORIYA DIGIT THREE
+0B6A;NU # ORIYA DIGIT FOUR
+0B6B;NU # ORIYA DIGIT FIVE
+0B6C;NU # ORIYA DIGIT SIX
+0B6D;NU # ORIYA DIGIT SEVEN
+0B6E;NU # ORIYA DIGIT EIGHT
+0B6F;NU # ORIYA DIGIT NINE
+0B70;AL # ORIYA ISSHAR
+0B71;AL # ORIYA LETTER WA
+0B82;CM # TAMIL SIGN ANUSVARA
+0B83;AL # TAMIL SIGN VISARGA
+0B85;AL # TAMIL LETTER A
+0B86;AL # TAMIL LETTER AA
+0B87;AL # TAMIL LETTER I
+0B88;AL # TAMIL LETTER II
+0B89;AL # TAMIL LETTER U
+0B8A;AL # TAMIL LETTER UU
+0B8E;AL # TAMIL LETTER E
+0B8F;AL # TAMIL LETTER EE
+0B90;AL # TAMIL LETTER AI
+0B92;AL # TAMIL LETTER O
+0B93;AL # TAMIL LETTER OO
+0B94;AL # TAMIL LETTER AU
+0B95;AL # TAMIL LETTER KA
+0B99;AL # TAMIL LETTER NGA
+0B9A;AL # TAMIL LETTER CA
+0B9C;AL # TAMIL LETTER JA
+0B9E;AL # TAMIL LETTER NYA
+0B9F;AL # TAMIL LETTER TTA
+0BA3;AL # TAMIL LETTER NNA
+0BA4;AL # TAMIL LETTER TA
+0BA8;AL # TAMIL LETTER NA
+0BA9;AL # TAMIL LETTER NNNA
+0BAA;AL # TAMIL LETTER PA
+0BAE;AL # TAMIL LETTER MA
+0BAF;AL # TAMIL LETTER YA
+0BB0;AL # TAMIL LETTER RA
+0BB1;AL # TAMIL LETTER RRA
+0BB2;AL # TAMIL LETTER LA
+0BB3;AL # TAMIL LETTER LLA
+0BB4;AL # TAMIL LETTER LLLA
+0BB5;AL # TAMIL LETTER VA
+0BB6;AL # TAMIL LETTER SHA
+0BB7;AL # TAMIL LETTER SSA
+0BB8;AL # TAMIL LETTER SA
+0BB9;AL # TAMIL LETTER HA
+0BBE;CM # TAMIL VOWEL SIGN AA
+0BBF;CM # TAMIL VOWEL SIGN I
+0BC0;CM # TAMIL VOWEL SIGN II
+0BC1;CM # TAMIL VOWEL SIGN U
+0BC2;CM # TAMIL VOWEL SIGN UU
+0BC6;CM # TAMIL VOWEL SIGN E
+0BC7;CM # TAMIL VOWEL SIGN EE
+0BC8;CM # TAMIL VOWEL SIGN AI
+0BCA;CM # TAMIL VOWEL SIGN O
+0BCB;CM # TAMIL VOWEL SIGN OO
+0BCC;CM # TAMIL VOWEL SIGN AU
+0BCD;CM # TAMIL SIGN VIRAMA
+0BD7;CM # TAMIL AU LENGTH MARK
+0BE6;NU # TAMIL DIGIT ZERO
+0BE7;NU # TAMIL DIGIT ONE
+0BE8;NU # TAMIL DIGIT TWO
+0BE9;NU # TAMIL DIGIT THREE
+0BEA;NU # TAMIL DIGIT FOUR
+0BEB;NU # TAMIL DIGIT FIVE
+0BEC;NU # TAMIL DIGIT SIX
+0BED;NU # TAMIL DIGIT SEVEN
+0BEE;NU # TAMIL DIGIT EIGHT
+0BEF;NU # TAMIL DIGIT NINE
+0BF0;AL # TAMIL NUMBER TEN
+0BF1;AL # TAMIL NUMBER ONE HUNDRED
+0BF2;AL # TAMIL NUMBER ONE THOUSAND
+0BF3;AL # TAMIL DAY SIGN
+0BF4;AL # TAMIL MONTH SIGN
+0BF5;AL # TAMIL YEAR SIGN
+0BF6;AL # TAMIL DEBIT SIGN
+0BF7;AL # TAMIL CREDIT SIGN
+0BF8;AL # TAMIL AS ABOVE SIGN
+0BF9;PR # TAMIL RUPEE SIGN
+0BFA;AL # TAMIL NUMBER SIGN
+0C01;CM # TELUGU SIGN CANDRABINDU
+0C02;CM # TELUGU SIGN ANUSVARA
+0C03;CM # TELUGU SIGN VISARGA
+0C05;AL # TELUGU LETTER A
+0C06;AL # TELUGU LETTER AA
+0C07;AL # TELUGU LETTER I
+0C08;AL # TELUGU LETTER II
+0C09;AL # TELUGU LETTER U
+0C0A;AL # TELUGU LETTER UU
+0C0B;AL # TELUGU LETTER VOCALIC R
+0C0C;AL # TELUGU LETTER VOCALIC L
+0C0E;AL # TELUGU LETTER E
+0C0F;AL # TELUGU LETTER EE
+0C10;AL # TELUGU LETTER AI
+0C12;AL # TELUGU LETTER O
+0C13;AL # TELUGU LETTER OO
+0C14;AL # TELUGU LETTER AU
+0C15;AL # TELUGU LETTER KA
+0C16;AL # TELUGU LETTER KHA
+0C17;AL # TELUGU LETTER GA
+0C18;AL # TELUGU LETTER GHA
+0C19;AL # TELUGU LETTER NGA
+0C1A;AL # TELUGU LETTER CA
+0C1B;AL # TELUGU LETTER CHA
+0C1C;AL # TELUGU LETTER JA
+0C1D;AL # TELUGU LETTER JHA
+0C1E;AL # TELUGU LETTER NYA
+0C1F;AL # TELUGU LETTER TTA
+0C20;AL # TELUGU LETTER TTHA
+0C21;AL # TELUGU LETTER DDA
+0C22;AL # TELUGU LETTER DDHA
+0C23;AL # TELUGU LETTER NNA
+0C24;AL # TELUGU LETTER TA
+0C25;AL # TELUGU LETTER THA
+0C26;AL # TELUGU LETTER DA
+0C27;AL # TELUGU LETTER DHA
+0C28;AL # TELUGU LETTER NA
+0C2A;AL # TELUGU LETTER PA
+0C2B;AL # TELUGU LETTER PHA
+0C2C;AL # TELUGU LETTER BA
+0C2D;AL # TELUGU LETTER BHA
+0C2E;AL # TELUGU LETTER MA
+0C2F;AL # TELUGU LETTER YA
+0C30;AL # TELUGU LETTER RA
+0C31;AL # TELUGU LETTER RRA
+0C32;AL # TELUGU LETTER LA
+0C33;AL # TELUGU LETTER LLA
+0C35;AL # TELUGU LETTER VA
+0C36;AL # TELUGU LETTER SHA
+0C37;AL # TELUGU LETTER SSA
+0C38;AL # TELUGU LETTER SA
+0C39;AL # TELUGU LETTER HA
+0C3E;CM # TELUGU VOWEL SIGN AA
+0C3F;CM # TELUGU VOWEL SIGN I
+0C40;CM # TELUGU VOWEL SIGN II
+0C41;CM # TELUGU VOWEL SIGN U
+0C42;CM # TELUGU VOWEL SIGN UU
+0C43;CM # TELUGU VOWEL SIGN VOCALIC R
+0C44;CM # TELUGU VOWEL SIGN VOCALIC RR
+0C46;CM # TELUGU VOWEL SIGN E
+0C47;CM # TELUGU VOWEL SIGN EE
+0C48;CM # TELUGU VOWEL SIGN AI
+0C4A;CM # TELUGU VOWEL SIGN O
+0C4B;CM # TELUGU VOWEL SIGN OO
+0C4C;CM # TELUGU VOWEL SIGN AU
+0C4D;CM # TELUGU SIGN VIRAMA
+0C55;CM # TELUGU LENGTH MARK
+0C56;CM # TELUGU AI LENGTH MARK
+0C60;AL # TELUGU LETTER VOCALIC RR
+0C61;AL # TELUGU LETTER VOCALIC LL
+0C66;NU # TELUGU DIGIT ZERO
+0C67;NU # TELUGU DIGIT ONE
+0C68;NU # TELUGU DIGIT TWO
+0C69;NU # TELUGU DIGIT THREE
+0C6A;NU # TELUGU DIGIT FOUR
+0C6B;NU # TELUGU DIGIT FIVE
+0C6C;NU # TELUGU DIGIT SIX
+0C6D;NU # TELUGU DIGIT SEVEN
+0C6E;NU # TELUGU DIGIT EIGHT
+0C6F;NU # TELUGU DIGIT NINE
+0C82;CM # KANNADA SIGN ANUSVARA
+0C83;CM # KANNADA SIGN VISARGA
+0C85;AL # KANNADA LETTER A
+0C86;AL # KANNADA LETTER AA
+0C87;AL # KANNADA LETTER I
+0C88;AL # KANNADA LETTER II
+0C89;AL # KANNADA LETTER U
+0C8A;AL # KANNADA LETTER UU
+0C8B;AL # KANNADA LETTER VOCALIC R
+0C8C;AL # KANNADA LETTER VOCALIC L
+0C8E;AL # KANNADA LETTER E
+0C8F;AL # KANNADA LETTER EE
+0C90;AL # KANNADA LETTER AI
+0C92;AL # KANNADA LETTER O
+0C93;AL # KANNADA LETTER OO
+0C94;AL # KANNADA LETTER AU
+0C95;AL # KANNADA LETTER KA
+0C96;AL # KANNADA LETTER KHA
+0C97;AL # KANNADA LETTER GA
+0C98;AL # KANNADA LETTER GHA
+0C99;AL # KANNADA LETTER NGA
+0C9A;AL # KANNADA LETTER CA
+0C9B;AL # KANNADA LETTER CHA
+0C9C;AL # KANNADA LETTER JA
+0C9D;AL # KANNADA LETTER JHA
+0C9E;AL # KANNADA LETTER NYA
+0C9F;AL # KANNADA LETTER TTA
+0CA0;AL # KANNADA LETTER TTHA
+0CA1;AL # KANNADA LETTER DDA
+0CA2;AL # KANNADA LETTER DDHA
+0CA3;AL # KANNADA LETTER NNA
+0CA4;AL # KANNADA LETTER TA
+0CA5;AL # KANNADA LETTER THA
+0CA6;AL # KANNADA LETTER DA
+0CA7;AL # KANNADA LETTER DHA
+0CA8;AL # KANNADA LETTER NA
+0CAA;AL # KANNADA LETTER PA
+0CAB;AL # KANNADA LETTER PHA
+0CAC;AL # KANNADA LETTER BA
+0CAD;AL # KANNADA LETTER BHA
+0CAE;AL # KANNADA LETTER MA
+0CAF;AL # KANNADA LETTER YA
+0CB0;AL # KANNADA LETTER RA
+0CB1;AL # KANNADA LETTER RRA
+0CB2;AL # KANNADA LETTER LA
+0CB3;AL # KANNADA LETTER LLA
+0CB5;AL # KANNADA LETTER VA
+0CB6;AL # KANNADA LETTER SHA
+0CB7;AL # KANNADA LETTER SSA
+0CB8;AL # KANNADA LETTER SA
+0CB9;AL # KANNADA LETTER HA
+0CBC;CM # KANNADA SIGN NUKTA
+0CBD;AL # KANNADA SIGN AVAGRAHA
+0CBE;CM # KANNADA VOWEL SIGN AA
+0CBF;CM # KANNADA VOWEL SIGN I
+0CC0;CM # KANNADA VOWEL SIGN II
+0CC1;CM # KANNADA VOWEL SIGN U
+0CC2;CM # KANNADA VOWEL SIGN UU
+0CC3;CM # KANNADA VOWEL SIGN VOCALIC R
+0CC4;CM # KANNADA VOWEL SIGN VOCALIC RR
+0CC6;CM # KANNADA VOWEL SIGN E
+0CC7;CM # KANNADA VOWEL SIGN EE
+0CC8;CM # KANNADA VOWEL SIGN AI
+0CCA;CM # KANNADA VOWEL SIGN O
+0CCB;CM # KANNADA VOWEL SIGN OO
+0CCC;CM # KANNADA VOWEL SIGN AU
+0CCD;CM # KANNADA SIGN VIRAMA
+0CD5;CM # KANNADA LENGTH MARK
+0CD6;CM # KANNADA AI LENGTH MARK
+0CDE;AL # KANNADA LETTER FA
+0CE0;AL # KANNADA LETTER VOCALIC RR
+0CE1;AL # KANNADA LETTER VOCALIC LL
+0CE6;NU # KANNADA DIGIT ZERO
+0CE7;NU # KANNADA DIGIT ONE
+0CE8;NU # KANNADA DIGIT TWO
+0CE9;NU # KANNADA DIGIT THREE
+0CEA;NU # KANNADA DIGIT FOUR
+0CEB;NU # KANNADA DIGIT FIVE
+0CEC;NU # KANNADA DIGIT SIX
+0CED;NU # KANNADA DIGIT SEVEN
+0CEE;NU # KANNADA DIGIT EIGHT
+0CEF;NU # KANNADA DIGIT NINE
+0D02;CM # MALAYALAM SIGN ANUSVARA
+0D03;CM # MALAYALAM SIGN VISARGA
+0D05;AL # MALAYALAM LETTER A
+0D06;AL # MALAYALAM LETTER AA
+0D07;AL # MALAYALAM LETTER I
+0D08;AL # MALAYALAM LETTER II
+0D09;AL # MALAYALAM LETTER U
+0D0A;AL # MALAYALAM LETTER UU
+0D0B;AL # MALAYALAM LETTER VOCALIC R
+0D0C;AL # MALAYALAM LETTER VOCALIC L
+0D0E;AL # MALAYALAM LETTER E
+0D0F;AL # MALAYALAM LETTER EE
+0D10;AL # MALAYALAM LETTER AI
+0D12;AL # MALAYALAM LETTER O
+0D13;AL # MALAYALAM LETTER OO
+0D14;AL # MALAYALAM LETTER AU
+0D15;AL # MALAYALAM LETTER KA
+0D16;AL # MALAYALAM LETTER KHA
+0D17;AL # MALAYALAM LETTER GA
+0D18;AL # MALAYALAM LETTER GHA
+0D19;AL # MALAYALAM LETTER NGA
+0D1A;AL # MALAYALAM LETTER CA
+0D1B;AL # MALAYALAM LETTER CHA
+0D1C;AL # MALAYALAM LETTER JA
+0D1D;AL # MALAYALAM LETTER JHA
+0D1E;AL # MALAYALAM LETTER NYA
+0D1F;AL # MALAYALAM LETTER TTA
+0D20;AL # MALAYALAM LETTER TTHA
+0D21;AL # MALAYALAM LETTER DDA
+0D22;AL # MALAYALAM LETTER DDHA
+0D23;AL # MALAYALAM LETTER NNA
+0D24;AL # MALAYALAM LETTER TA
+0D25;AL # MALAYALAM LETTER THA
+0D26;AL # MALAYALAM LETTER DA
+0D27;AL # MALAYALAM LETTER DHA
+0D28;AL # MALAYALAM LETTER NA
+0D2A;AL # MALAYALAM LETTER PA
+0D2B;AL # MALAYALAM LETTER PHA
+0D2C;AL # MALAYALAM LETTER BA
+0D2D;AL # MALAYALAM LETTER BHA
+0D2E;AL # MALAYALAM LETTER MA
+0D2F;AL # MALAYALAM LETTER YA
+0D30;AL # MALAYALAM LETTER RA
+0D31;AL # MALAYALAM LETTER RRA
+0D32;AL # MALAYALAM LETTER LA
+0D33;AL # MALAYALAM LETTER LLA
+0D34;AL # MALAYALAM LETTER LLLA
+0D35;AL # MALAYALAM LETTER VA
+0D36;AL # MALAYALAM LETTER SHA
+0D37;AL # MALAYALAM LETTER SSA
+0D38;AL # MALAYALAM LETTER SA
+0D39;AL # MALAYALAM LETTER HA
+0D3E;CM # MALAYALAM VOWEL SIGN AA
+0D3F;CM # MALAYALAM VOWEL SIGN I
+0D40;CM # MALAYALAM VOWEL SIGN II
+0D41;CM # MALAYALAM VOWEL SIGN U
+0D42;CM # MALAYALAM VOWEL SIGN UU
+0D43;CM # MALAYALAM VOWEL SIGN VOCALIC R
+0D46;CM # MALAYALAM VOWEL SIGN E
+0D47;CM # MALAYALAM VOWEL SIGN EE
+0D48;CM # MALAYALAM VOWEL SIGN AI
+0D4A;CM # MALAYALAM VOWEL SIGN O
+0D4B;CM # MALAYALAM VOWEL SIGN OO
+0D4C;CM # MALAYALAM VOWEL SIGN AU
+0D4D;CM # MALAYALAM SIGN VIRAMA
+0D57;CM # MALAYALAM AU LENGTH MARK
+0D60;AL # MALAYALAM LETTER VOCALIC RR
+0D61;AL # MALAYALAM LETTER VOCALIC LL
+0D66;NU # MALAYALAM DIGIT ZERO
+0D67;NU # MALAYALAM DIGIT ONE
+0D68;NU # MALAYALAM DIGIT TWO
+0D69;NU # MALAYALAM DIGIT THREE
+0D6A;NU # MALAYALAM DIGIT FOUR
+0D6B;NU # MALAYALAM DIGIT FIVE
+0D6C;NU # MALAYALAM DIGIT SIX
+0D6D;NU # MALAYALAM DIGIT SEVEN
+0D6E;NU # MALAYALAM DIGIT EIGHT
+0D6F;NU # MALAYALAM DIGIT NINE
+0D82;CM # SINHALA SIGN ANUSVARAYA
+0D83;CM # SINHALA SIGN VISARGAYA
+0D85;AL # SINHALA LETTER AYANNA
+0D86;AL # SINHALA LETTER AAYANNA
+0D87;AL # SINHALA LETTER AEYANNA
+0D88;AL # SINHALA LETTER AEEYANNA
+0D89;AL # SINHALA LETTER IYANNA
+0D8A;AL # SINHALA LETTER IIYANNA
+0D8B;AL # SINHALA LETTER UYANNA
+0D8C;AL # SINHALA LETTER UUYANNA
+0D8D;AL # SINHALA LETTER IRUYANNA
+0D8E;AL # SINHALA LETTER IRUUYANNA
+0D8F;AL # SINHALA LETTER ILUYANNA
+0D90;AL # SINHALA LETTER ILUUYANNA
+0D91;AL # SINHALA LETTER EYANNA
+0D92;AL # SINHALA LETTER EEYANNA
+0D93;AL # SINHALA LETTER AIYANNA
+0D94;AL # SINHALA LETTER OYANNA
+0D95;AL # SINHALA LETTER OOYANNA
+0D96;AL # SINHALA LETTER AUYANNA
+0D9A;AL # SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B;AL # SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C;AL # SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D;AL # SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E;AL # SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F;AL # SINHALA LETTER SANYAKA GAYANNA
+0DA0;AL # SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1;AL # SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2;AL # SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3;AL # SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4;AL # SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5;AL # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6;AL # SINHALA LETTER SANYAKA JAYANNA
+0DA7;AL # SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8;AL # SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9;AL # SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA;AL # SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB;AL # SINHALA LETTER MUURDHAJA NAYANNA
+0DAC;AL # SINHALA LETTER SANYAKA DDAYANNA
+0DAD;AL # SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE;AL # SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF;AL # SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0;AL # SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1;AL # SINHALA LETTER DANTAJA NAYANNA
+0DB3;AL # SINHALA LETTER SANYAKA DAYANNA
+0DB4;AL # SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5;AL # SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6;AL # SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7;AL # SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8;AL # SINHALA LETTER MAYANNA
+0DB9;AL # SINHALA LETTER AMBA BAYANNA
+0DBA;AL # SINHALA LETTER YAYANNA
+0DBB;AL # SINHALA LETTER RAYANNA
+0DBD;AL # SINHALA LETTER DANTAJA LAYANNA
+0DC0;AL # SINHALA LETTER VAYANNA
+0DC1;AL # SINHALA LETTER TAALUJA SAYANNA
+0DC2;AL # SINHALA LETTER MUURDHAJA SAYANNA
+0DC3;AL # SINHALA LETTER DANTAJA SAYANNA
+0DC4;AL # SINHALA LETTER HAYANNA
+0DC5;AL # SINHALA LETTER MUURDHAJA LAYANNA
+0DC6;AL # SINHALA LETTER FAYANNA
+0DCA;CM # SINHALA SIGN AL-LAKUNA
+0DCF;CM # SINHALA VOWEL SIGN AELA-PILLA
+0DD0;CM # SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1;CM # SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2;CM # SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3;CM # SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4;CM # SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6;CM # SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8;CM # SINHALA VOWEL SIGN GAETTA-PILLA
+0DD9;CM # SINHALA VOWEL SIGN KOMBUVA
+0DDA;CM # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB;CM # SINHALA VOWEL SIGN KOMBU DEKA
+0DDC;CM # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD;CM # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE;CM # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DDF;CM # SINHALA VOWEL SIGN GAYANUKITTA
+0DF2;CM # SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DF3;CM # SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4;AL # SINHALA PUNCTUATION KUNDDALIYA
+0E01;SA # THAI CHARACTER KO KAI
+0E02;SA # THAI CHARACTER KHO KHAI
+0E03;SA # THAI CHARACTER KHO KHUAT
+0E04;SA # THAI CHARACTER KHO KHWAI
+0E05;SA # THAI CHARACTER KHO KHON
+0E06;SA # THAI CHARACTER KHO RAKHANG
+0E07;SA # THAI CHARACTER NGO NGU
+0E08;SA # THAI CHARACTER CHO CHAN
+0E09;SA # THAI CHARACTER CHO CHING
+0E0A;SA # THAI CHARACTER CHO CHANG
+0E0B;SA # THAI CHARACTER SO SO
+0E0C;SA # THAI CHARACTER CHO CHOE
+0E0D;SA # THAI CHARACTER YO YING
+0E0E;SA # THAI CHARACTER DO CHADA
+0E0F;SA # THAI CHARACTER TO PATAK
+0E10;SA # THAI CHARACTER THO THAN
+0E11;SA # THAI CHARACTER THO NANGMONTHO
+0E12;SA # THAI CHARACTER THO PHUTHAO
+0E13;SA # THAI CHARACTER NO NEN
+0E14;SA # THAI CHARACTER DO DEK
+0E15;SA # THAI CHARACTER TO TAO
+0E16;SA # THAI CHARACTER THO THUNG
+0E17;SA # THAI CHARACTER THO THAHAN
+0E18;SA # THAI CHARACTER THO THONG
+0E19;SA # THAI CHARACTER NO NU
+0E1A;SA # THAI CHARACTER BO BAIMAI
+0E1B;SA # THAI CHARACTER PO PLA
+0E1C;SA # THAI CHARACTER PHO PHUNG
+0E1D;SA # THAI CHARACTER FO FA
+0E1E;SA # THAI CHARACTER PHO PHAN
+0E1F;SA # THAI CHARACTER FO FAN
+0E20;SA # THAI CHARACTER PHO SAMPHAO
+0E21;SA # THAI CHARACTER MO MA
+0E22;SA # THAI CHARACTER YO YAK
+0E23;SA # THAI CHARACTER RO RUA
+0E24;SA # THAI CHARACTER RU
+0E25;SA # THAI CHARACTER LO LING
+0E26;SA # THAI CHARACTER LU
+0E27;SA # THAI CHARACTER WO WAEN
+0E28;SA # THAI CHARACTER SO SALA
+0E29;SA # THAI CHARACTER SO RUSI
+0E2A;SA # THAI CHARACTER SO SUA
+0E2B;SA # THAI CHARACTER HO HIP
+0E2C;SA # THAI CHARACTER LO CHULA
+0E2D;SA # THAI CHARACTER O ANG
+0E2E;SA # THAI CHARACTER HO NOKHUK
+0E2F;SA # THAI CHARACTER PAIYANNOI
+0E30;SA # THAI CHARACTER SARA A
+0E31;CM # THAI CHARACTER MAI HAN-AKAT
+0E32;SA # THAI CHARACTER SARA AA
+0E33;SA # THAI CHARACTER SARA AM
+0E34;CM # THAI CHARACTER SARA I
+0E35;CM # THAI CHARACTER SARA II
+0E36;CM # THAI CHARACTER SARA UE
+0E37;CM # THAI CHARACTER SARA UEE
+0E38;CM # THAI CHARACTER SARA U
+0E39;CM # THAI CHARACTER SARA UU
+0E3A;CM # THAI CHARACTER PHINTHU
+0E3F;PR # THAI CURRENCY SYMBOL BAHT
+0E40;SA # THAI CHARACTER SARA E
+0E41;SA # THAI CHARACTER SARA AE
+0E42;SA # THAI CHARACTER SARA O
+0E43;SA # THAI CHARACTER SARA AI MAIMUAN
+0E44;SA # THAI CHARACTER SARA AI MAIMALAI
+0E45;SA # THAI CHARACTER LAKKHANGYAO
+0E46;SA # THAI CHARACTER MAIYAMOK
+0E47;CM # THAI CHARACTER MAITAIKHU
+0E48;CM # THAI CHARACTER MAI EK
+0E49;CM # THAI CHARACTER MAI THO
+0E4A;CM # THAI CHARACTER MAI TRI
+0E4B;CM # THAI CHARACTER MAI CHATTAWA
+0E4C;CM # THAI CHARACTER THANTHAKHAT
+0E4D;CM # THAI CHARACTER NIKHAHIT
+0E4E;CM # THAI CHARACTER YAMAKKAN
+0E4F;AL # THAI CHARACTER FONGMAN
+0E50;NU # THAI DIGIT ZERO
+0E51;NU # THAI DIGIT ONE
+0E52;NU # THAI DIGIT TWO
+0E53;NU # THAI DIGIT THREE
+0E54;NU # THAI DIGIT FOUR
+0E55;NU # THAI DIGIT FIVE
+0E56;NU # THAI DIGIT SIX
+0E57;NU # THAI DIGIT SEVEN
+0E58;NU # THAI DIGIT EIGHT
+0E59;NU # THAI DIGIT NINE
+0E5A;BA # THAI CHARACTER ANGKHANKHU
+0E5B;BA # THAI CHARACTER KHOMUT
+0E81;SA # LAO LETTER KO
+0E82;SA # LAO LETTER KHO SUNG
+0E84;SA # LAO LETTER KHO TAM
+0E87;SA # LAO LETTER NGO
+0E88;SA # LAO LETTER CO
+0E8A;SA # LAO LETTER SO TAM
+0E8D;SA # LAO LETTER NYO
+0E94;SA # LAO LETTER DO
+0E95;SA # LAO LETTER TO
+0E96;SA # LAO LETTER THO SUNG
+0E97;SA # LAO LETTER THO TAM
+0E99;SA # LAO LETTER NO
+0E9A;SA # LAO LETTER BO
+0E9B;SA # LAO LETTER PO
+0E9C;SA # LAO LETTER PHO SUNG
+0E9D;SA # LAO LETTER FO TAM
+0E9E;SA # LAO LETTER PHO TAM
+0E9F;SA # LAO LETTER FO SUNG
+0EA1;SA # LAO LETTER MO
+0EA2;SA # LAO LETTER YO
+0EA3;SA # LAO LETTER LO LING
+0EA5;SA # LAO LETTER LO LOOT
+0EA7;SA # LAO LETTER WO
+0EAA;SA # LAO LETTER SO SUNG
+0EAB;SA # LAO LETTER HO SUNG
+0EAD;SA # LAO LETTER O
+0EAE;SA # LAO LETTER HO TAM
+0EAF;SA # LAO ELLIPSIS
+0EB0;SA # LAO VOWEL SIGN A
+0EB1;CM # LAO VOWEL SIGN MAI KAN
+0EB2;SA # LAO VOWEL SIGN AA
+0EB3;SA # LAO VOWEL SIGN AM
+0EB4;CM # LAO VOWEL SIGN I
+0EB5;CM # LAO VOWEL SIGN II
+0EB6;CM # LAO VOWEL SIGN Y
+0EB7;CM # LAO VOWEL SIGN YY
+0EB8;CM # LAO VOWEL SIGN U
+0EB9;CM # LAO VOWEL SIGN UU
+0EBB;CM # LAO VOWEL SIGN MAI KON
+0EBC;CM # LAO SEMIVOWEL SIGN LO
+0EBD;SA # LAO SEMIVOWEL SIGN NYO
+0EC0;SA # LAO VOWEL SIGN E
+0EC1;SA # LAO VOWEL SIGN EI
+0EC2;SA # LAO VOWEL SIGN O
+0EC3;SA # LAO VOWEL SIGN AY
+0EC4;SA # LAO VOWEL SIGN AI
+0EC6;SA # LAO KO LA
+0EC8;CM # LAO TONE MAI EK
+0EC9;CM # LAO TONE MAI THO
+0ECA;CM # LAO TONE MAI TI
+0ECB;CM # LAO TONE MAI CATAWA
+0ECC;CM # LAO CANCELLATION MARK
+0ECD;CM # LAO NIGGAHITA
+0ED0;NU # LAO DIGIT ZERO
+0ED1;NU # LAO DIGIT ONE
+0ED2;NU # LAO DIGIT TWO
+0ED3;NU # LAO DIGIT THREE
+0ED4;NU # LAO DIGIT FOUR
+0ED5;NU # LAO DIGIT FIVE
+0ED6;NU # LAO DIGIT SIX
+0ED7;NU # LAO DIGIT SEVEN
+0ED8;NU # LAO DIGIT EIGHT
+0ED9;NU # LAO DIGIT NINE
+0EDC;SA # LAO HO NO
+0EDD;SA # LAO HO MO
+0F00;AL # TIBETAN SYLLABLE OM
+0F01;BB # TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02;BB # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03;BB # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04;BB # TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05;AL # TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06;BB # TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07;BB # TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08;GL # TIBETAN MARK SBRUL SHAD
+0F09;BB # TIBETAN MARK BSKUR YIG MGO
+0F0A;BB # TIBETAN MARK BKA- SHOG YIG MGO
+0F0B;BA # TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C;GL # TIBETAN MARK DELIMITER TSHEG BSTAR
+0F0D;EX # TIBETAN MARK SHAD
+0F0E;EX # TIBETAN MARK NYIS SHAD
+0F0F;EX # TIBETAN MARK TSHEG SHAD
+0F10;EX # TIBETAN MARK NYIS TSHEG SHAD
+0F11;EX # TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12;GL # TIBETAN MARK RGYA GRAM SHAD
+0F13;AL # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14;EX # TIBETAN MARK GTER TSHEG
+0F15;AL # TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16;AL # TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17;AL # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18;CM # TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19;CM # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A;AL # TIBETAN SIGN RDEL DKAR GCIG
+0F1B;AL # TIBETAN SIGN RDEL DKAR GNYIS
+0F1C;AL # TIBETAN SIGN RDEL DKAR GSUM
+0F1D;AL # TIBETAN SIGN RDEL NAG GCIG
+0F1E;AL # TIBETAN SIGN RDEL NAG GNYIS
+0F1F;AL # TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20;NU # TIBETAN DIGIT ZERO
+0F21;NU # TIBETAN DIGIT ONE
+0F22;NU # TIBETAN DIGIT TWO
+0F23;NU # TIBETAN DIGIT THREE
+0F24;NU # TIBETAN DIGIT FOUR
+0F25;NU # TIBETAN DIGIT FIVE
+0F26;NU # TIBETAN DIGIT SIX
+0F27;NU # TIBETAN DIGIT SEVEN
+0F28;NU # TIBETAN DIGIT EIGHT
+0F29;NU # TIBETAN DIGIT NINE
+0F2A;AL # TIBETAN DIGIT HALF ONE
+0F2B;AL # TIBETAN DIGIT HALF TWO
+0F2C;AL # TIBETAN DIGIT HALF THREE
+0F2D;AL # TIBETAN DIGIT HALF FOUR
+0F2E;AL # TIBETAN DIGIT HALF FIVE
+0F2F;AL # TIBETAN DIGIT HALF SIX
+0F30;AL # TIBETAN DIGIT HALF SEVEN
+0F31;AL # TIBETAN DIGIT HALF EIGHT
+0F32;AL # TIBETAN DIGIT HALF NINE
+0F33;AL # TIBETAN DIGIT HALF ZERO
+0F34;BA # TIBETAN MARK BSDUS RTAGS
+0F35;CM # TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36;AL # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37;CM # TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38;AL # TIBETAN MARK CHE MGO
+0F39;CM # TIBETAN MARK TSA -PHRU
+0F3A;OP # TIBETAN MARK GUG RTAGS GYON
+0F3B;CL # TIBETAN MARK GUG RTAGS GYAS
+0F3C;OP # TIBETAN MARK ANG KHANG GYON
+0F3D;CL # TIBETAN MARK ANG KHANG GYAS
+0F3E;CM # TIBETAN SIGN YAR TSHES
+0F3F;CM # TIBETAN SIGN MAR TSHES
+0F40;AL # TIBETAN LETTER KA
+0F41;AL # TIBETAN LETTER KHA
+0F42;AL # TIBETAN LETTER GA
+0F43;AL # TIBETAN LETTER GHA
+0F44;AL # TIBETAN LETTER NGA
+0F45;AL # TIBETAN LETTER CA
+0F46;AL # TIBETAN LETTER CHA
+0F47;AL # TIBETAN LETTER JA
+0F49;AL # TIBETAN LETTER NYA
+0F4A;AL # TIBETAN LETTER TTA
+0F4B;AL # TIBETAN LETTER TTHA
+0F4C;AL # TIBETAN LETTER DDA
+0F4D;AL # TIBETAN LETTER DDHA
+0F4E;AL # TIBETAN LETTER NNA
+0F4F;AL # TIBETAN LETTER TA
+0F50;AL # TIBETAN LETTER THA
+0F51;AL # TIBETAN LETTER DA
+0F52;AL # TIBETAN LETTER DHA
+0F53;AL # TIBETAN LETTER NA
+0F54;AL # TIBETAN LETTER PA
+0F55;AL # TIBETAN LETTER PHA
+0F56;AL # TIBETAN LETTER BA
+0F57;AL # TIBETAN LETTER BHA
+0F58;AL # TIBETAN LETTER MA
+0F59;AL # TIBETAN LETTER TSA
+0F5A;AL # TIBETAN LETTER TSHA
+0F5B;AL # TIBETAN LETTER DZA
+0F5C;AL # TIBETAN LETTER DZHA
+0F5D;AL # TIBETAN LETTER WA
+0F5E;AL # TIBETAN LETTER ZHA
+0F5F;AL # TIBETAN LETTER ZA
+0F60;AL # TIBETAN LETTER -A
+0F61;AL # TIBETAN LETTER YA
+0F62;AL # TIBETAN LETTER RA
+0F63;AL # TIBETAN LETTER LA
+0F64;AL # TIBETAN LETTER SHA
+0F65;AL # TIBETAN LETTER SSA
+0F66;AL # TIBETAN LETTER SA
+0F67;AL # TIBETAN LETTER HA
+0F68;AL # TIBETAN LETTER A
+0F69;AL # TIBETAN LETTER KSSA
+0F6A;AL # TIBETAN LETTER FIXED-FORM RA
+0F71;CM # TIBETAN VOWEL SIGN AA
+0F72;CM # TIBETAN VOWEL SIGN I
+0F73;CM # TIBETAN VOWEL SIGN II
+0F74;CM # TIBETAN VOWEL SIGN U
+0F75;CM # TIBETAN VOWEL SIGN UU
+0F76;CM # TIBETAN VOWEL SIGN VOCALIC R
+0F77;CM # TIBETAN VOWEL SIGN VOCALIC RR
+0F78;CM # TIBETAN VOWEL SIGN VOCALIC L
+0F79;CM # TIBETAN VOWEL SIGN VOCALIC LL
+0F7A;CM # TIBETAN VOWEL SIGN E
+0F7B;CM # TIBETAN VOWEL SIGN EE
+0F7C;CM # TIBETAN VOWEL SIGN O
+0F7D;CM # TIBETAN VOWEL SIGN OO
+0F7E;CM # TIBETAN SIGN RJES SU NGA RO
+0F7F;BA # TIBETAN SIGN RNAM BCAD
+0F80;CM # TIBETAN VOWEL SIGN REVERSED I
+0F81;CM # TIBETAN VOWEL SIGN REVERSED II
+0F82;CM # TIBETAN SIGN NYI ZLA NAA DA
+0F83;CM # TIBETAN SIGN SNA LDAN
+0F84;CM # TIBETAN MARK HALANTA
+0F85;BA # TIBETAN MARK PALUTA
+0F86;CM # TIBETAN SIGN LCI RTAGS
+0F87;CM # TIBETAN SIGN YANG RTAGS
+0F88;AL # TIBETAN SIGN LCE TSA CAN
+0F89;AL # TIBETAN SIGN MCHU CAN
+0F8A;AL # TIBETAN SIGN GRU CAN RGYINGS
+0F8B;AL # TIBETAN SIGN GRU MED RGYINGS
+0F90;CM # TIBETAN SUBJOINED LETTER KA
+0F91;CM # TIBETAN SUBJOINED LETTER KHA
+0F92;CM # TIBETAN SUBJOINED LETTER GA
+0F93;CM # TIBETAN SUBJOINED LETTER GHA
+0F94;CM # TIBETAN SUBJOINED LETTER NGA
+0F95;CM # TIBETAN SUBJOINED LETTER CA
+0F96;CM # TIBETAN SUBJOINED LETTER CHA
+0F97;CM # TIBETAN SUBJOINED LETTER JA
+0F99;CM # TIBETAN SUBJOINED LETTER NYA
+0F9A;CM # TIBETAN SUBJOINED LETTER TTA
+0F9B;CM # TIBETAN SUBJOINED LETTER TTHA
+0F9C;CM # TIBETAN SUBJOINED LETTER DDA
+0F9D;CM # TIBETAN SUBJOINED LETTER DDHA
+0F9E;CM # TIBETAN SUBJOINED LETTER NNA
+0F9F;CM # TIBETAN SUBJOINED LETTER TA
+0FA0;CM # TIBETAN SUBJOINED LETTER THA
+0FA1;CM # TIBETAN SUBJOINED LETTER DA
+0FA2;CM # TIBETAN SUBJOINED LETTER DHA
+0FA3;CM # TIBETAN SUBJOINED LETTER NA
+0FA4;CM # TIBETAN SUBJOINED LETTER PA
+0FA5;CM # TIBETAN SUBJOINED LETTER PHA
+0FA6;CM # TIBETAN SUBJOINED LETTER BA
+0FA7;CM # TIBETAN SUBJOINED LETTER BHA
+0FA8;CM # TIBETAN SUBJOINED LETTER MA
+0FA9;CM # TIBETAN SUBJOINED LETTER TSA
+0FAA;CM # TIBETAN SUBJOINED LETTER TSHA
+0FAB;CM # TIBETAN SUBJOINED LETTER DZA
+0FAC;CM # TIBETAN SUBJOINED LETTER DZHA
+0FAD;CM # TIBETAN SUBJOINED LETTER WA
+0FAE;CM # TIBETAN SUBJOINED LETTER ZHA
+0FAF;CM # TIBETAN SUBJOINED LETTER ZA
+0FB0;CM # TIBETAN SUBJOINED LETTER -A
+0FB1;CM # TIBETAN SUBJOINED LETTER YA
+0FB2;CM # TIBETAN SUBJOINED LETTER RA
+0FB3;CM # TIBETAN SUBJOINED LETTER LA
+0FB4;CM # TIBETAN SUBJOINED LETTER SHA
+0FB5;CM # TIBETAN SUBJOINED LETTER SSA
+0FB6;CM # TIBETAN SUBJOINED LETTER SA
+0FB7;CM # TIBETAN SUBJOINED LETTER HA
+0FB8;CM # TIBETAN SUBJOINED LETTER A
+0FB9;CM # TIBETAN SUBJOINED LETTER KSSA
+0FBA;CM # TIBETAN SUBJOINED LETTER FIXED-FORM WA
+0FBB;CM # TIBETAN SUBJOINED LETTER FIXED-FORM YA
+0FBC;CM # TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE;BA # TIBETAN KU RU KHA
+0FBF;BA # TIBETAN KU RU KHA BZHI MIG CAN
+0FC0;AL # TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1;AL # TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2;AL # TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3;AL # TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4;AL # TIBETAN SYMBOL DRIL BU
+0FC5;AL # TIBETAN SYMBOL RDO RJE
+0FC6;CM # TIBETAN SYMBOL PADMA GDAN
+0FC7;AL # TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8;AL # TIBETAN SYMBOL PHUR PA
+0FC9;AL # TIBETAN SYMBOL NOR BU
+0FCA;AL # TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB;AL # TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC;AL # TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCF;AL # TIBETAN SIGN RDEL NAG GSUM
+0FD0;BB # TIBETAN MARK BSKA- SHOG GI MGO RGYAN
+0FD1;BB # TIBETAN MARK MNYAM YIG GI MGO RGYAN
+1000;SA # MYANMAR LETTER KA
+1001;SA # MYANMAR LETTER KHA
+1002;SA # MYANMAR LETTER GA
+1003;SA # MYANMAR LETTER GHA
+1004;SA # MYANMAR LETTER NGA
+1005;SA # MYANMAR LETTER CA
+1006;SA # MYANMAR LETTER CHA
+1007;SA # MYANMAR LETTER JA
+1008;SA # MYANMAR LETTER JHA
+1009;SA # MYANMAR LETTER NYA
+100A;SA # MYANMAR LETTER NNYA
+100B;SA # MYANMAR LETTER TTA
+100C;SA # MYANMAR LETTER TTHA
+100D;SA # MYANMAR LETTER DDA
+100E;SA # MYANMAR LETTER DDHA
+100F;SA # MYANMAR LETTER NNA
+1010;SA # MYANMAR LETTER TA
+1011;SA # MYANMAR LETTER THA
+1012;SA # MYANMAR LETTER DA
+1013;SA # MYANMAR LETTER DHA
+1014;SA # MYANMAR LETTER NA
+1015;SA # MYANMAR LETTER PA
+1016;SA # MYANMAR LETTER PHA
+1017;SA # MYANMAR LETTER BA
+1018;SA # MYANMAR LETTER BHA
+1019;SA # MYANMAR LETTER MA
+101A;SA # MYANMAR LETTER YA
+101B;SA # MYANMAR LETTER RA
+101C;SA # MYANMAR LETTER LA
+101D;SA # MYANMAR LETTER WA
+101E;SA # MYANMAR LETTER SA
+101F;SA # MYANMAR LETTER HA
+1020;SA # MYANMAR LETTER LLA
+1021;SA # MYANMAR LETTER A
+1023;SA # MYANMAR LETTER I
+1024;SA # MYANMAR LETTER II
+1025;SA # MYANMAR LETTER U
+1026;SA # MYANMAR LETTER UU
+1027;SA # MYANMAR LETTER E
+1029;SA # MYANMAR LETTER O
+102A;SA # MYANMAR LETTER AU
+102C;CM # MYANMAR VOWEL SIGN AA
+102D;CM # MYANMAR VOWEL SIGN I
+102E;CM # MYANMAR VOWEL SIGN II
+102F;CM # MYANMAR VOWEL SIGN U
+1030;CM # MYANMAR VOWEL SIGN UU
+1031;CM # MYANMAR VOWEL SIGN E
+1032;CM # MYANMAR VOWEL SIGN AI
+1036;CM # MYANMAR SIGN ANUSVARA
+1037;CM # MYANMAR SIGN DOT BELOW
+1038;CM # MYANMAR SIGN VISARGA
+1039;CM # MYANMAR SIGN VIRAMA
+1040;NU # MYANMAR DIGIT ZERO
+1041;NU # MYANMAR DIGIT ONE
+1042;NU # MYANMAR DIGIT TWO
+1043;NU # MYANMAR DIGIT THREE
+1044;NU # MYANMAR DIGIT FOUR
+1045;NU # MYANMAR DIGIT FIVE
+1046;NU # MYANMAR DIGIT SIX
+1047;NU # MYANMAR DIGIT SEVEN
+1048;NU # MYANMAR DIGIT EIGHT
+1049;NU # MYANMAR DIGIT NINE
+104A;BA # MYANMAR SIGN LITTLE SECTION
+104B;BA # MYANMAR SIGN SECTION
+104C;AL # MYANMAR SYMBOL LOCATIVE
+104D;AL # MYANMAR SYMBOL COMPLETED
+104E;AL # MYANMAR SYMBOL AFOREMENTIONED
+104F;AL # MYANMAR SYMBOL GENITIVE
+1050;SA # MYANMAR LETTER SHA
+1051;SA # MYANMAR LETTER SSA
+1052;SA # MYANMAR LETTER VOCALIC R
+1053;SA # MYANMAR LETTER VOCALIC RR
+1054;SA # MYANMAR LETTER VOCALIC L
+1055;SA # MYANMAR LETTER VOCALIC LL
+1056;CM # MYANMAR VOWEL SIGN VOCALIC R
+1057;CM # MYANMAR VOWEL SIGN VOCALIC RR
+1058;CM # MYANMAR VOWEL SIGN VOCALIC L
+1059;CM # MYANMAR VOWEL SIGN VOCALIC LL
+10A0;AL # GEORGIAN CAPITAL LETTER AN
+10A1;AL # GEORGIAN CAPITAL LETTER BAN
+10A2;AL # GEORGIAN CAPITAL LETTER GAN
+10A3;AL # GEORGIAN CAPITAL LETTER DON
+10A4;AL # GEORGIAN CAPITAL LETTER EN
+10A5;AL # GEORGIAN CAPITAL LETTER VIN
+10A6;AL # GEORGIAN CAPITAL LETTER ZEN
+10A7;AL # GEORGIAN CAPITAL LETTER TAN
+10A8;AL # GEORGIAN CAPITAL LETTER IN
+10A9;AL # GEORGIAN CAPITAL LETTER KAN
+10AA;AL # GEORGIAN CAPITAL LETTER LAS
+10AB;AL # GEORGIAN CAPITAL LETTER MAN
+10AC;AL # GEORGIAN CAPITAL LETTER NAR
+10AD;AL # GEORGIAN CAPITAL LETTER ON
+10AE;AL # GEORGIAN CAPITAL LETTER PAR
+10AF;AL # GEORGIAN CAPITAL LETTER ZHAR
+10B0;AL # GEORGIAN CAPITAL LETTER RAE
+10B1;AL # GEORGIAN CAPITAL LETTER SAN
+10B2;AL # GEORGIAN CAPITAL LETTER TAR
+10B3;AL # GEORGIAN CAPITAL LETTER UN
+10B4;AL # GEORGIAN CAPITAL LETTER PHAR
+10B5;AL # GEORGIAN CAPITAL LETTER KHAR
+10B6;AL # GEORGIAN CAPITAL LETTER GHAN
+10B7;AL # GEORGIAN CAPITAL LETTER QAR
+10B8;AL # GEORGIAN CAPITAL LETTER SHIN
+10B9;AL # GEORGIAN CAPITAL LETTER CHIN
+10BA;AL # GEORGIAN CAPITAL LETTER CAN
+10BB;AL # GEORGIAN CAPITAL LETTER JIL
+10BC;AL # GEORGIAN CAPITAL LETTER CIL
+10BD;AL # GEORGIAN CAPITAL LETTER CHAR
+10BE;AL # GEORGIAN CAPITAL LETTER XAN
+10BF;AL # GEORGIAN CAPITAL LETTER JHAN
+10C0;AL # GEORGIAN CAPITAL LETTER HAE
+10C1;AL # GEORGIAN CAPITAL LETTER HE
+10C2;AL # GEORGIAN CAPITAL LETTER HIE
+10C3;AL # GEORGIAN CAPITAL LETTER WE
+10C4;AL # GEORGIAN CAPITAL LETTER HAR
+10C5;AL # GEORGIAN CAPITAL LETTER HOE
+10D0;AL # GEORGIAN LETTER AN
+10D1;AL # GEORGIAN LETTER BAN
+10D2;AL # GEORGIAN LETTER GAN
+10D3;AL # GEORGIAN LETTER DON
+10D4;AL # GEORGIAN LETTER EN
+10D5;AL # GEORGIAN LETTER VIN
+10D6;AL # GEORGIAN LETTER ZEN
+10D7;AL # GEORGIAN LETTER TAN
+10D8;AL # GEORGIAN LETTER IN
+10D9;AL # GEORGIAN LETTER KAN
+10DA;AL # GEORGIAN LETTER LAS
+10DB;AL # GEORGIAN LETTER MAN
+10DC;AL # GEORGIAN LETTER NAR
+10DD;AL # GEORGIAN LETTER ON
+10DE;AL # GEORGIAN LETTER PAR
+10DF;AL # GEORGIAN LETTER ZHAR
+10E0;AL # GEORGIAN LETTER RAE
+10E1;AL # GEORGIAN LETTER SAN
+10E2;AL # GEORGIAN LETTER TAR
+10E3;AL # GEORGIAN LETTER UN
+10E4;AL # GEORGIAN LETTER PHAR
+10E5;AL # GEORGIAN LETTER KHAR
+10E6;AL # GEORGIAN LETTER GHAN
+10E7;AL # GEORGIAN LETTER QAR
+10E8;AL # GEORGIAN LETTER SHIN
+10E9;AL # GEORGIAN LETTER CHIN
+10EA;AL # GEORGIAN LETTER CAN
+10EB;AL # GEORGIAN LETTER JIL
+10EC;AL # GEORGIAN LETTER CIL
+10ED;AL # GEORGIAN LETTER CHAR
+10EE;AL # GEORGIAN LETTER XAN
+10EF;AL # GEORGIAN LETTER JHAN
+10F0;AL # GEORGIAN LETTER HAE
+10F1;AL # GEORGIAN LETTER HE
+10F2;AL # GEORGIAN LETTER HIE
+10F3;AL # GEORGIAN LETTER WE
+10F4;AL # GEORGIAN LETTER HAR
+10F5;AL # GEORGIAN LETTER HOE
+10F6;AL # GEORGIAN LETTER FI
+10F7;AL # GEORGIAN LETTER YN
+10F8;AL # GEORGIAN LETTER ELIFI
+10F9;AL # GEORGIAN LETTER TURNED GAN
+10FA;AL # GEORGIAN LETTER AIN
+10FB;AL # GEORGIAN PARAGRAPH SEPARATOR
+10FC;AL # MODIFIER LETTER GEORGIAN NAR
+1100;JL # HANGUL CHOSEONG KIYEOK
+1101;JL # HANGUL CHOSEONG SSANGKIYEOK
+1102;JL # HANGUL CHOSEONG NIEUN
+1103;JL # HANGUL CHOSEONG TIKEUT
+1104;JL # HANGUL CHOSEONG SSANGTIKEUT
+1105;JL # HANGUL CHOSEONG RIEUL
+1106;JL # HANGUL CHOSEONG MIEUM
+1107;JL # HANGUL CHOSEONG PIEUP
+1108;JL # HANGUL CHOSEONG SSANGPIEUP
+1109;JL # HANGUL CHOSEONG SIOS
+110A;JL # HANGUL CHOSEONG SSANGSIOS
+110B;JL # HANGUL CHOSEONG IEUNG
+110C;JL # HANGUL CHOSEONG CIEUC
+110D;JL # HANGUL CHOSEONG SSANGCIEUC
+110E;JL # HANGUL CHOSEONG CHIEUCH
+110F;JL # HANGUL CHOSEONG KHIEUKH
+1110;JL # HANGUL CHOSEONG THIEUTH
+1111;JL # HANGUL CHOSEONG PHIEUPH
+1112;JL # HANGUL CHOSEONG HIEUH
+1113;JL # HANGUL CHOSEONG NIEUN-KIYEOK
+1114;JL # HANGUL CHOSEONG SSANGNIEUN
+1115;JL # HANGUL CHOSEONG NIEUN-TIKEUT
+1116;JL # HANGUL CHOSEONG NIEUN-PIEUP
+1117;JL # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118;JL # HANGUL CHOSEONG RIEUL-NIEUN
+1119;JL # HANGUL CHOSEONG SSANGRIEUL
+111A;JL # HANGUL CHOSEONG RIEUL-HIEUH
+111B;JL # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C;JL # HANGUL CHOSEONG MIEUM-PIEUP
+111D;JL # HANGUL CHOSEONG KAPYEOUNMIEUM
+111E;JL # HANGUL CHOSEONG PIEUP-KIYEOK
+111F;JL # HANGUL CHOSEONG PIEUP-NIEUN
+1120;JL # HANGUL CHOSEONG PIEUP-TIKEUT
+1121;JL # HANGUL CHOSEONG PIEUP-SIOS
+1122;JL # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123;JL # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124;JL # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125;JL # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126;JL # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127;JL # HANGUL CHOSEONG PIEUP-CIEUC
+1128;JL # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129;JL # HANGUL CHOSEONG PIEUP-THIEUTH
+112A;JL # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B;JL # HANGUL CHOSEONG KAPYEOUNPIEUP
+112C;JL # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D;JL # HANGUL CHOSEONG SIOS-KIYEOK
+112E;JL # HANGUL CHOSEONG SIOS-NIEUN
+112F;JL # HANGUL CHOSEONG SIOS-TIKEUT
+1130;JL # HANGUL CHOSEONG SIOS-RIEUL
+1131;JL # HANGUL CHOSEONG SIOS-MIEUM
+1132;JL # HANGUL CHOSEONG SIOS-PIEUP
+1133;JL # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134;JL # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135;JL # HANGUL CHOSEONG SIOS-IEUNG
+1136;JL # HANGUL CHOSEONG SIOS-CIEUC
+1137;JL # HANGUL CHOSEONG SIOS-CHIEUCH
+1138;JL # HANGUL CHOSEONG SIOS-KHIEUKH
+1139;JL # HANGUL CHOSEONG SIOS-THIEUTH
+113A;JL # HANGUL CHOSEONG SIOS-PHIEUPH
+113B;JL # HANGUL CHOSEONG SIOS-HIEUH
+113C;JL # HANGUL CHOSEONG CHITUEUMSIOS
+113D;JL # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E;JL # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F;JL # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140;JL # HANGUL CHOSEONG PANSIOS
+1141;JL # HANGUL CHOSEONG IEUNG-KIYEOK
+1142;JL # HANGUL CHOSEONG IEUNG-TIKEUT
+1143;JL # HANGUL CHOSEONG IEUNG-MIEUM
+1144;JL # HANGUL CHOSEONG IEUNG-PIEUP
+1145;JL # HANGUL CHOSEONG IEUNG-SIOS
+1146;JL # HANGUL CHOSEONG IEUNG-PANSIOS
+1147;JL # HANGUL CHOSEONG SSANGIEUNG
+1148;JL # HANGUL CHOSEONG IEUNG-CIEUC
+1149;JL # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A;JL # HANGUL CHOSEONG IEUNG-THIEUTH
+114B;JL # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C;JL # HANGUL CHOSEONG YESIEUNG
+114D;JL # HANGUL CHOSEONG CIEUC-IEUNG
+114E;JL # HANGUL CHOSEONG CHITUEUMCIEUC
+114F;JL # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150;JL # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151;JL # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152;JL # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153;JL # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154;JL # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155;JL # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156;JL # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157;JL # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158;JL # HANGUL CHOSEONG SSANGHIEUH
+1159;JL # HANGUL CHOSEONG YEORINHIEUH
+115F;JL # HANGUL CHOSEONG FILLER
+1160;JV # HANGUL JUNGSEONG FILLER
+1161;JV # HANGUL JUNGSEONG A
+1162;JV # HANGUL JUNGSEONG AE
+1163;JV # HANGUL JUNGSEONG YA
+1164;JV # HANGUL JUNGSEONG YAE
+1165;JV # HANGUL JUNGSEONG EO
+1166;JV # HANGUL JUNGSEONG E
+1167;JV # HANGUL JUNGSEONG YEO
+1168;JV # HANGUL JUNGSEONG YE
+1169;JV # HANGUL JUNGSEONG O
+116A;JV # HANGUL JUNGSEONG WA
+116B;JV # HANGUL JUNGSEONG WAE
+116C;JV # HANGUL JUNGSEONG OE
+116D;JV # HANGUL JUNGSEONG YO
+116E;JV # HANGUL JUNGSEONG U
+116F;JV # HANGUL JUNGSEONG WEO
+1170;JV # HANGUL JUNGSEONG WE
+1171;JV # HANGUL JUNGSEONG WI
+1172;JV # HANGUL JUNGSEONG YU
+1173;JV # HANGUL JUNGSEONG EU
+1174;JV # HANGUL JUNGSEONG YI
+1175;JV # HANGUL JUNGSEONG I
+1176;JV # HANGUL JUNGSEONG A-O
+1177;JV # HANGUL JUNGSEONG A-U
+1178;JV # HANGUL JUNGSEONG YA-O
+1179;JV # HANGUL JUNGSEONG YA-YO
+117A;JV # HANGUL JUNGSEONG EO-O
+117B;JV # HANGUL JUNGSEONG EO-U
+117C;JV # HANGUL JUNGSEONG EO-EU
+117D;JV # HANGUL JUNGSEONG YEO-O
+117E;JV # HANGUL JUNGSEONG YEO-U
+117F;JV # HANGUL JUNGSEONG O-EO
+1180;JV # HANGUL JUNGSEONG O-E
+1181;JV # HANGUL JUNGSEONG O-YE
+1182;JV # HANGUL JUNGSEONG O-O
+1183;JV # HANGUL JUNGSEONG O-U
+1184;JV # HANGUL JUNGSEONG YO-YA
+1185;JV # HANGUL JUNGSEONG YO-YAE
+1186;JV # HANGUL JUNGSEONG YO-YEO
+1187;JV # HANGUL JUNGSEONG YO-O
+1188;JV # HANGUL JUNGSEONG YO-I
+1189;JV # HANGUL JUNGSEONG U-A
+118A;JV # HANGUL JUNGSEONG U-AE
+118B;JV # HANGUL JUNGSEONG U-EO-EU
+118C;JV # HANGUL JUNGSEONG U-YE
+118D;JV # HANGUL JUNGSEONG U-U
+118E;JV # HANGUL JUNGSEONG YU-A
+118F;JV # HANGUL JUNGSEONG YU-EO
+1190;JV # HANGUL JUNGSEONG YU-E
+1191;JV # HANGUL JUNGSEONG YU-YEO
+1192;JV # HANGUL JUNGSEONG YU-YE
+1193;JV # HANGUL JUNGSEONG YU-U
+1194;JV # HANGUL JUNGSEONG YU-I
+1195;JV # HANGUL JUNGSEONG EU-U
+1196;JV # HANGUL JUNGSEONG EU-EU
+1197;JV # HANGUL JUNGSEONG YI-U
+1198;JV # HANGUL JUNGSEONG I-A
+1199;JV # HANGUL JUNGSEONG I-YA
+119A;JV # HANGUL JUNGSEONG I-O
+119B;JV # HANGUL JUNGSEONG I-U
+119C;JV # HANGUL JUNGSEONG I-EU
+119D;JV # HANGUL JUNGSEONG I-ARAEA
+119E;JV # HANGUL JUNGSEONG ARAEA
+119F;JV # HANGUL JUNGSEONG ARAEA-EO
+11A0;JV # HANGUL JUNGSEONG ARAEA-U
+11A1;JV # HANGUL JUNGSEONG ARAEA-I
+11A2;JV # HANGUL JUNGSEONG SSANGARAEA
+11A8;JT # HANGUL JONGSEONG KIYEOK
+11A9;JT # HANGUL JONGSEONG SSANGKIYEOK
+11AA;JT # HANGUL JONGSEONG KIYEOK-SIOS
+11AB;JT # HANGUL JONGSEONG NIEUN
+11AC;JT # HANGUL JONGSEONG NIEUN-CIEUC
+11AD;JT # HANGUL JONGSEONG NIEUN-HIEUH
+11AE;JT # HANGUL JONGSEONG TIKEUT
+11AF;JT # HANGUL JONGSEONG RIEUL
+11B0;JT # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1;JT # HANGUL JONGSEONG RIEUL-MIEUM
+11B2;JT # HANGUL JONGSEONG RIEUL-PIEUP
+11B3;JT # HANGUL JONGSEONG RIEUL-SIOS
+11B4;JT # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5;JT # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6;JT # HANGUL JONGSEONG RIEUL-HIEUH
+11B7;JT # HANGUL JONGSEONG MIEUM
+11B8;JT # HANGUL JONGSEONG PIEUP
+11B9;JT # HANGUL JONGSEONG PIEUP-SIOS
+11BA;JT # HANGUL JONGSEONG SIOS
+11BB;JT # HANGUL JONGSEONG SSANGSIOS
+11BC;JT # HANGUL JONGSEONG IEUNG
+11BD;JT # HANGUL JONGSEONG CIEUC
+11BE;JT # HANGUL JONGSEONG CHIEUCH
+11BF;JT # HANGUL JONGSEONG KHIEUKH
+11C0;JT # HANGUL JONGSEONG THIEUTH
+11C1;JT # HANGUL JONGSEONG PHIEUPH
+11C2;JT # HANGUL JONGSEONG HIEUH
+11C3;JT # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4;JT # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5;JT # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6;JT # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7;JT # HANGUL JONGSEONG NIEUN-SIOS
+11C8;JT # HANGUL JONGSEONG NIEUN-PANSIOS
+11C9;JT # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA;JT # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB;JT # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC;JT # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD;JT # HANGUL JONGSEONG RIEUL-NIEUN
+11CE;JT # HANGUL JONGSEONG RIEUL-TIKEUT
+11CF;JT # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0;JT # HANGUL JONGSEONG SSANGRIEUL
+11D1;JT # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2;JT # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3;JT # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4;JT # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5;JT # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6;JT # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7;JT # HANGUL JONGSEONG RIEUL-PANSIOS
+11D8;JT # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9;JT # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA;JT # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB;JT # HANGUL JONGSEONG MIEUM-RIEUL
+11DC;JT # HANGUL JONGSEONG MIEUM-PIEUP
+11DD;JT # HANGUL JONGSEONG MIEUM-SIOS
+11DE;JT # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF;JT # HANGUL JONGSEONG MIEUM-PANSIOS
+11E0;JT # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1;JT # HANGUL JONGSEONG MIEUM-HIEUH
+11E2;JT # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3;JT # HANGUL JONGSEONG PIEUP-RIEUL
+11E4;JT # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5;JT # HANGUL JONGSEONG PIEUP-HIEUH
+11E6;JT # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7;JT # HANGUL JONGSEONG SIOS-KIYEOK
+11E8;JT # HANGUL JONGSEONG SIOS-TIKEUT
+11E9;JT # HANGUL JONGSEONG SIOS-RIEUL
+11EA;JT # HANGUL JONGSEONG SIOS-PIEUP
+11EB;JT # HANGUL JONGSEONG PANSIOS
+11EC;JT # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED;JT # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE;JT # HANGUL JONGSEONG SSANGIEUNG
+11EF;JT # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0;JT # HANGUL JONGSEONG YESIEUNG
+11F1;JT # HANGUL JONGSEONG YESIEUNG-SIOS
+11F2;JT # HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3;JT # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4;JT # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5;JT # HANGUL JONGSEONG HIEUH-NIEUN
+11F6;JT # HANGUL JONGSEONG HIEUH-RIEUL
+11F7;JT # HANGUL JONGSEONG HIEUH-MIEUM
+11F8;JT # HANGUL JONGSEONG HIEUH-PIEUP
+11F9;JT # HANGUL JONGSEONG YEORINHIEUH
+1200;AL # ETHIOPIC SYLLABLE HA
+1201;AL # ETHIOPIC SYLLABLE HU
+1202;AL # ETHIOPIC SYLLABLE HI
+1203;AL # ETHIOPIC SYLLABLE HAA
+1204;AL # ETHIOPIC SYLLABLE HEE
+1205;AL # ETHIOPIC SYLLABLE HE
+1206;AL # ETHIOPIC SYLLABLE HO
+1207;AL # ETHIOPIC SYLLABLE HOA
+1208;AL # ETHIOPIC SYLLABLE LA
+1209;AL # ETHIOPIC SYLLABLE LU
+120A;AL # ETHIOPIC SYLLABLE LI
+120B;AL # ETHIOPIC SYLLABLE LAA
+120C;AL # ETHIOPIC SYLLABLE LEE
+120D;AL # ETHIOPIC SYLLABLE LE
+120E;AL # ETHIOPIC SYLLABLE LO
+120F;AL # ETHIOPIC SYLLABLE LWA
+1210;AL # ETHIOPIC SYLLABLE HHA
+1211;AL # ETHIOPIC SYLLABLE HHU
+1212;AL # ETHIOPIC SYLLABLE HHI
+1213;AL # ETHIOPIC SYLLABLE HHAA
+1214;AL # ETHIOPIC SYLLABLE HHEE
+1215;AL # ETHIOPIC SYLLABLE HHE
+1216;AL # ETHIOPIC SYLLABLE HHO
+1217;AL # ETHIOPIC SYLLABLE HHWA
+1218;AL # ETHIOPIC SYLLABLE MA
+1219;AL # ETHIOPIC SYLLABLE MU
+121A;AL # ETHIOPIC SYLLABLE MI
+121B;AL # ETHIOPIC SYLLABLE MAA
+121C;AL # ETHIOPIC SYLLABLE MEE
+121D;AL # ETHIOPIC SYLLABLE ME
+121E;AL # ETHIOPIC SYLLABLE MO
+121F;AL # ETHIOPIC SYLLABLE MWA
+1220;AL # ETHIOPIC SYLLABLE SZA
+1221;AL # ETHIOPIC SYLLABLE SZU
+1222;AL # ETHIOPIC SYLLABLE SZI
+1223;AL # ETHIOPIC SYLLABLE SZAA
+1224;AL # ETHIOPIC SYLLABLE SZEE
+1225;AL # ETHIOPIC SYLLABLE SZE
+1226;AL # ETHIOPIC SYLLABLE SZO
+1227;AL # ETHIOPIC SYLLABLE SZWA
+1228;AL # ETHIOPIC SYLLABLE RA
+1229;AL # ETHIOPIC SYLLABLE RU
+122A;AL # ETHIOPIC SYLLABLE RI
+122B;AL # ETHIOPIC SYLLABLE RAA
+122C;AL # ETHIOPIC SYLLABLE REE
+122D;AL # ETHIOPIC SYLLABLE RE
+122E;AL # ETHIOPIC SYLLABLE RO
+122F;AL # ETHIOPIC SYLLABLE RWA
+1230;AL # ETHIOPIC SYLLABLE SA
+1231;AL # ETHIOPIC SYLLABLE SU
+1232;AL # ETHIOPIC SYLLABLE SI
+1233;AL # ETHIOPIC SYLLABLE SAA
+1234;AL # ETHIOPIC SYLLABLE SEE
+1235;AL # ETHIOPIC SYLLABLE SE
+1236;AL # ETHIOPIC SYLLABLE SO
+1237;AL # ETHIOPIC SYLLABLE SWA
+1238;AL # ETHIOPIC SYLLABLE SHA
+1239;AL # ETHIOPIC SYLLABLE SHU
+123A;AL # ETHIOPIC SYLLABLE SHI
+123B;AL # ETHIOPIC SYLLABLE SHAA
+123C;AL # ETHIOPIC SYLLABLE SHEE
+123D;AL # ETHIOPIC SYLLABLE SHE
+123E;AL # ETHIOPIC SYLLABLE SHO
+123F;AL # ETHIOPIC SYLLABLE SHWA
+1240;AL # ETHIOPIC SYLLABLE QA
+1241;AL # ETHIOPIC SYLLABLE QU
+1242;AL # ETHIOPIC SYLLABLE QI
+1243;AL # ETHIOPIC SYLLABLE QAA
+1244;AL # ETHIOPIC SYLLABLE QEE
+1245;AL # ETHIOPIC SYLLABLE QE
+1246;AL # ETHIOPIC SYLLABLE QO
+1247;AL # ETHIOPIC SYLLABLE QOA
+1248;AL # ETHIOPIC SYLLABLE QWA
+124A;AL # ETHIOPIC SYLLABLE QWI
+124B;AL # ETHIOPIC SYLLABLE QWAA
+124C;AL # ETHIOPIC SYLLABLE QWEE
+124D;AL # ETHIOPIC SYLLABLE QWE
+1250;AL # ETHIOPIC SYLLABLE QHA
+1251;AL # ETHIOPIC SYLLABLE QHU
+1252;AL # ETHIOPIC SYLLABLE QHI
+1253;AL # ETHIOPIC SYLLABLE QHAA
+1254;AL # ETHIOPIC SYLLABLE QHEE
+1255;AL # ETHIOPIC SYLLABLE QHE
+1256;AL # ETHIOPIC SYLLABLE QHO
+1258;AL # ETHIOPIC SYLLABLE QHWA
+125A;AL # ETHIOPIC SYLLABLE QHWI
+125B;AL # ETHIOPIC SYLLABLE QHWAA
+125C;AL # ETHIOPIC SYLLABLE QHWEE
+125D;AL # ETHIOPIC SYLLABLE QHWE
+1260;AL # ETHIOPIC SYLLABLE BA
+1261;AL # ETHIOPIC SYLLABLE BU
+1262;AL # ETHIOPIC SYLLABLE BI
+1263;AL # ETHIOPIC SYLLABLE BAA
+1264;AL # ETHIOPIC SYLLABLE BEE
+1265;AL # ETHIOPIC SYLLABLE BE
+1266;AL # ETHIOPIC SYLLABLE BO
+1267;AL # ETHIOPIC SYLLABLE BWA
+1268;AL # ETHIOPIC SYLLABLE VA
+1269;AL # ETHIOPIC SYLLABLE VU
+126A;AL # ETHIOPIC SYLLABLE VI
+126B;AL # ETHIOPIC SYLLABLE VAA
+126C;AL # ETHIOPIC SYLLABLE VEE
+126D;AL # ETHIOPIC SYLLABLE VE
+126E;AL # ETHIOPIC SYLLABLE VO
+126F;AL # ETHIOPIC SYLLABLE VWA
+1270;AL # ETHIOPIC SYLLABLE TA
+1271;AL # ETHIOPIC SYLLABLE TU
+1272;AL # ETHIOPIC SYLLABLE TI
+1273;AL # ETHIOPIC SYLLABLE TAA
+1274;AL # ETHIOPIC SYLLABLE TEE
+1275;AL # ETHIOPIC SYLLABLE TE
+1276;AL # ETHIOPIC SYLLABLE TO
+1277;AL # ETHIOPIC SYLLABLE TWA
+1278;AL # ETHIOPIC SYLLABLE CA
+1279;AL # ETHIOPIC SYLLABLE CU
+127A;AL # ETHIOPIC SYLLABLE CI
+127B;AL # ETHIOPIC SYLLABLE CAA
+127C;AL # ETHIOPIC SYLLABLE CEE
+127D;AL # ETHIOPIC SYLLABLE CE
+127E;AL # ETHIOPIC SYLLABLE CO
+127F;AL # ETHIOPIC SYLLABLE CWA
+1280;AL # ETHIOPIC SYLLABLE XA
+1281;AL # ETHIOPIC SYLLABLE XU
+1282;AL # ETHIOPIC SYLLABLE XI
+1283;AL # ETHIOPIC SYLLABLE XAA
+1284;AL # ETHIOPIC SYLLABLE XEE
+1285;AL # ETHIOPIC SYLLABLE XE
+1286;AL # ETHIOPIC SYLLABLE XO
+1287;AL # ETHIOPIC SYLLABLE XOA
+1288;AL # ETHIOPIC SYLLABLE XWA
+128A;AL # ETHIOPIC SYLLABLE XWI
+128B;AL # ETHIOPIC SYLLABLE XWAA
+128C;AL # ETHIOPIC SYLLABLE XWEE
+128D;AL # ETHIOPIC SYLLABLE XWE
+1290;AL # ETHIOPIC SYLLABLE NA
+1291;AL # ETHIOPIC SYLLABLE NU
+1292;AL # ETHIOPIC SYLLABLE NI
+1293;AL # ETHIOPIC SYLLABLE NAA
+1294;AL # ETHIOPIC SYLLABLE NEE
+1295;AL # ETHIOPIC SYLLABLE NE
+1296;AL # ETHIOPIC SYLLABLE NO
+1297;AL # ETHIOPIC SYLLABLE NWA
+1298;AL # ETHIOPIC SYLLABLE NYA
+1299;AL # ETHIOPIC SYLLABLE NYU
+129A;AL # ETHIOPIC SYLLABLE NYI
+129B;AL # ETHIOPIC SYLLABLE NYAA
+129C;AL # ETHIOPIC SYLLABLE NYEE
+129D;AL # ETHIOPIC SYLLABLE NYE
+129E;AL # ETHIOPIC SYLLABLE NYO
+129F;AL # ETHIOPIC SYLLABLE NYWA
+12A0;AL # ETHIOPIC SYLLABLE GLOTTAL A
+12A1;AL # ETHIOPIC SYLLABLE GLOTTAL U
+12A2;AL # ETHIOPIC SYLLABLE GLOTTAL I
+12A3;AL # ETHIOPIC SYLLABLE GLOTTAL AA
+12A4;AL # ETHIOPIC SYLLABLE GLOTTAL EE
+12A5;AL # ETHIOPIC SYLLABLE GLOTTAL E
+12A6;AL # ETHIOPIC SYLLABLE GLOTTAL O
+12A7;AL # ETHIOPIC SYLLABLE GLOTTAL WA
+12A8;AL # ETHIOPIC SYLLABLE KA
+12A9;AL # ETHIOPIC SYLLABLE KU
+12AA;AL # ETHIOPIC SYLLABLE KI
+12AB;AL # ETHIOPIC SYLLABLE KAA
+12AC;AL # ETHIOPIC SYLLABLE KEE
+12AD;AL # ETHIOPIC SYLLABLE KE
+12AE;AL # ETHIOPIC SYLLABLE KO
+12AF;AL # ETHIOPIC SYLLABLE KOA
+12B0;AL # ETHIOPIC SYLLABLE KWA
+12B2;AL # ETHIOPIC SYLLABLE KWI
+12B3;AL # ETHIOPIC SYLLABLE KWAA
+12B4;AL # ETHIOPIC SYLLABLE KWEE
+12B5;AL # ETHIOPIC SYLLABLE KWE
+12B8;AL # ETHIOPIC SYLLABLE KXA
+12B9;AL # ETHIOPIC SYLLABLE KXU
+12BA;AL # ETHIOPIC SYLLABLE KXI
+12BB;AL # ETHIOPIC SYLLABLE KXAA
+12BC;AL # ETHIOPIC SYLLABLE KXEE
+12BD;AL # ETHIOPIC SYLLABLE KXE
+12BE;AL # ETHIOPIC SYLLABLE KXO
+12C0;AL # ETHIOPIC SYLLABLE KXWA
+12C2;AL # ETHIOPIC SYLLABLE KXWI
+12C3;AL # ETHIOPIC SYLLABLE KXWAA
+12C4;AL # ETHIOPIC SYLLABLE KXWEE
+12C5;AL # ETHIOPIC SYLLABLE KXWE
+12C8;AL # ETHIOPIC SYLLABLE WA
+12C9;AL # ETHIOPIC SYLLABLE WU
+12CA;AL # ETHIOPIC SYLLABLE WI
+12CB;AL # ETHIOPIC SYLLABLE WAA
+12CC;AL # ETHIOPIC SYLLABLE WEE
+12CD;AL # ETHIOPIC SYLLABLE WE
+12CE;AL # ETHIOPIC SYLLABLE WO
+12CF;AL # ETHIOPIC SYLLABLE WOA
+12D0;AL # ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1;AL # ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2;AL # ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3;AL # ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4;AL # ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5;AL # ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6;AL # ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8;AL # ETHIOPIC SYLLABLE ZA
+12D9;AL # ETHIOPIC SYLLABLE ZU
+12DA;AL # ETHIOPIC SYLLABLE ZI
+12DB;AL # ETHIOPIC SYLLABLE ZAA
+12DC;AL # ETHIOPIC SYLLABLE ZEE
+12DD;AL # ETHIOPIC SYLLABLE ZE
+12DE;AL # ETHIOPIC SYLLABLE ZO
+12DF;AL # ETHIOPIC SYLLABLE ZWA
+12E0;AL # ETHIOPIC SYLLABLE ZHA
+12E1;AL # ETHIOPIC SYLLABLE ZHU
+12E2;AL # ETHIOPIC SYLLABLE ZHI
+12E3;AL # ETHIOPIC SYLLABLE ZHAA
+12E4;AL # ETHIOPIC SYLLABLE ZHEE
+12E5;AL # ETHIOPIC SYLLABLE ZHE
+12E6;AL # ETHIOPIC SYLLABLE ZHO
+12E7;AL # ETHIOPIC SYLLABLE ZHWA
+12E8;AL # ETHIOPIC SYLLABLE YA
+12E9;AL # ETHIOPIC SYLLABLE YU
+12EA;AL # ETHIOPIC SYLLABLE YI
+12EB;AL # ETHIOPIC SYLLABLE YAA
+12EC;AL # ETHIOPIC SYLLABLE YEE
+12ED;AL # ETHIOPIC SYLLABLE YE
+12EE;AL # ETHIOPIC SYLLABLE YO
+12EF;AL # ETHIOPIC SYLLABLE YOA
+12F0;AL # ETHIOPIC SYLLABLE DA
+12F1;AL # ETHIOPIC SYLLABLE DU
+12F2;AL # ETHIOPIC SYLLABLE DI
+12F3;AL # ETHIOPIC SYLLABLE DAA
+12F4;AL # ETHIOPIC SYLLABLE DEE
+12F5;AL # ETHIOPIC SYLLABLE DE
+12F6;AL # ETHIOPIC SYLLABLE DO
+12F7;AL # ETHIOPIC SYLLABLE DWA
+12F8;AL # ETHIOPIC SYLLABLE DDA
+12F9;AL # ETHIOPIC SYLLABLE DDU
+12FA;AL # ETHIOPIC SYLLABLE DDI
+12FB;AL # ETHIOPIC SYLLABLE DDAA
+12FC;AL # ETHIOPIC SYLLABLE DDEE
+12FD;AL # ETHIOPIC SYLLABLE DDE
+12FE;AL # ETHIOPIC SYLLABLE DDO
+12FF;AL # ETHIOPIC SYLLABLE DDWA
+1300;AL # ETHIOPIC SYLLABLE JA
+1301;AL # ETHIOPIC SYLLABLE JU
+1302;AL # ETHIOPIC SYLLABLE JI
+1303;AL # ETHIOPIC SYLLABLE JAA
+1304;AL # ETHIOPIC SYLLABLE JEE
+1305;AL # ETHIOPIC SYLLABLE JE
+1306;AL # ETHIOPIC SYLLABLE JO
+1307;AL # ETHIOPIC SYLLABLE JWA
+1308;AL # ETHIOPIC SYLLABLE GA
+1309;AL # ETHIOPIC SYLLABLE GU
+130A;AL # ETHIOPIC SYLLABLE GI
+130B;AL # ETHIOPIC SYLLABLE GAA
+130C;AL # ETHIOPIC SYLLABLE GEE
+130D;AL # ETHIOPIC SYLLABLE GE
+130E;AL # ETHIOPIC SYLLABLE GO
+130F;AL # ETHIOPIC SYLLABLE GOA
+1310;AL # ETHIOPIC SYLLABLE GWA
+1312;AL # ETHIOPIC SYLLABLE GWI
+1313;AL # ETHIOPIC SYLLABLE GWAA
+1314;AL # ETHIOPIC SYLLABLE GWEE
+1315;AL # ETHIOPIC SYLLABLE GWE
+1318;AL # ETHIOPIC SYLLABLE GGA
+1319;AL # ETHIOPIC SYLLABLE GGU
+131A;AL # ETHIOPIC SYLLABLE GGI
+131B;AL # ETHIOPIC SYLLABLE GGAA
+131C;AL # ETHIOPIC SYLLABLE GGEE
+131D;AL # ETHIOPIC SYLLABLE GGE
+131E;AL # ETHIOPIC SYLLABLE GGO
+131F;AL # ETHIOPIC SYLLABLE GGWAA
+1320;AL # ETHIOPIC SYLLABLE THA
+1321;AL # ETHIOPIC SYLLABLE THU
+1322;AL # ETHIOPIC SYLLABLE THI
+1323;AL # ETHIOPIC SYLLABLE THAA
+1324;AL # ETHIOPIC SYLLABLE THEE
+1325;AL # ETHIOPIC SYLLABLE THE
+1326;AL # ETHIOPIC SYLLABLE THO
+1327;AL # ETHIOPIC SYLLABLE THWA
+1328;AL # ETHIOPIC SYLLABLE CHA
+1329;AL # ETHIOPIC SYLLABLE CHU
+132A;AL # ETHIOPIC SYLLABLE CHI
+132B;AL # ETHIOPIC SYLLABLE CHAA
+132C;AL # ETHIOPIC SYLLABLE CHEE
+132D;AL # ETHIOPIC SYLLABLE CHE
+132E;AL # ETHIOPIC SYLLABLE CHO
+132F;AL # ETHIOPIC SYLLABLE CHWA
+1330;AL # ETHIOPIC SYLLABLE PHA
+1331;AL # ETHIOPIC SYLLABLE PHU
+1332;AL # ETHIOPIC SYLLABLE PHI
+1333;AL # ETHIOPIC SYLLABLE PHAA
+1334;AL # ETHIOPIC SYLLABLE PHEE
+1335;AL # ETHIOPIC SYLLABLE PHE
+1336;AL # ETHIOPIC SYLLABLE PHO
+1337;AL # ETHIOPIC SYLLABLE PHWA
+1338;AL # ETHIOPIC SYLLABLE TSA
+1339;AL # ETHIOPIC SYLLABLE TSU
+133A;AL # ETHIOPIC SYLLABLE TSI
+133B;AL # ETHIOPIC SYLLABLE TSAA
+133C;AL # ETHIOPIC SYLLABLE TSEE
+133D;AL # ETHIOPIC SYLLABLE TSE
+133E;AL # ETHIOPIC SYLLABLE TSO
+133F;AL # ETHIOPIC SYLLABLE TSWA
+1340;AL # ETHIOPIC SYLLABLE TZA
+1341;AL # ETHIOPIC SYLLABLE TZU
+1342;AL # ETHIOPIC SYLLABLE TZI
+1343;AL # ETHIOPIC SYLLABLE TZAA
+1344;AL # ETHIOPIC SYLLABLE TZEE
+1345;AL # ETHIOPIC SYLLABLE TZE
+1346;AL # ETHIOPIC SYLLABLE TZO
+1347;AL # ETHIOPIC SYLLABLE TZOA
+1348;AL # ETHIOPIC SYLLABLE FA
+1349;AL # ETHIOPIC SYLLABLE FU
+134A;AL # ETHIOPIC SYLLABLE FI
+134B;AL # ETHIOPIC SYLLABLE FAA
+134C;AL # ETHIOPIC SYLLABLE FEE
+134D;AL # ETHIOPIC SYLLABLE FE
+134E;AL # ETHIOPIC SYLLABLE FO
+134F;AL # ETHIOPIC SYLLABLE FWA
+1350;AL # ETHIOPIC SYLLABLE PA
+1351;AL # ETHIOPIC SYLLABLE PU
+1352;AL # ETHIOPIC SYLLABLE PI
+1353;AL # ETHIOPIC SYLLABLE PAA
+1354;AL # ETHIOPIC SYLLABLE PEE
+1355;AL # ETHIOPIC SYLLABLE PE
+1356;AL # ETHIOPIC SYLLABLE PO
+1357;AL # ETHIOPIC SYLLABLE PWA
+1358;AL # ETHIOPIC SYLLABLE RYA
+1359;AL # ETHIOPIC SYLLABLE MYA
+135A;AL # ETHIOPIC SYLLABLE FYA
+135F;CM # ETHIOPIC COMBINING GEMINATION MARK
+1360;AL # ETHIOPIC SECTION MARK
+1361;BA # ETHIOPIC WORDSPACE
+1362;AL # ETHIOPIC FULL STOP
+1363;AL # ETHIOPIC COMMA
+1364;AL # ETHIOPIC SEMICOLON
+1365;AL # ETHIOPIC COLON
+1366;AL # ETHIOPIC PREFACE COLON
+1367;AL # ETHIOPIC QUESTION MARK
+1368;AL # ETHIOPIC PARAGRAPH SEPARATOR
+1369;AL # ETHIOPIC DIGIT ONE
+136A;AL # ETHIOPIC DIGIT TWO
+136B;AL # ETHIOPIC DIGIT THREE
+136C;AL # ETHIOPIC DIGIT FOUR
+136D;AL # ETHIOPIC DIGIT FIVE
+136E;AL # ETHIOPIC DIGIT SIX
+136F;AL # ETHIOPIC DIGIT SEVEN
+1370;AL # ETHIOPIC DIGIT EIGHT
+1371;AL # ETHIOPIC DIGIT NINE
+1372;AL # ETHIOPIC NUMBER TEN
+1373;AL # ETHIOPIC NUMBER TWENTY
+1374;AL # ETHIOPIC NUMBER THIRTY
+1375;AL # ETHIOPIC NUMBER FORTY
+1376;AL # ETHIOPIC NUMBER FIFTY
+1377;AL # ETHIOPIC NUMBER SIXTY
+1378;AL # ETHIOPIC NUMBER SEVENTY
+1379;AL # ETHIOPIC NUMBER EIGHTY
+137A;AL # ETHIOPIC NUMBER NINETY
+137B;AL # ETHIOPIC NUMBER HUNDRED
+137C;AL # ETHIOPIC NUMBER TEN THOUSAND
+1380;AL # ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381;AL # ETHIOPIC SYLLABLE MWI
+1382;AL # ETHIOPIC SYLLABLE MWEE
+1383;AL # ETHIOPIC SYLLABLE MWE
+1384;AL # ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385;AL # ETHIOPIC SYLLABLE BWI
+1386;AL # ETHIOPIC SYLLABLE BWEE
+1387;AL # ETHIOPIC SYLLABLE BWE
+1388;AL # ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389;AL # ETHIOPIC SYLLABLE FWI
+138A;AL # ETHIOPIC SYLLABLE FWEE
+138B;AL # ETHIOPIC SYLLABLE FWE
+138C;AL # ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D;AL # ETHIOPIC SYLLABLE PWI
+138E;AL # ETHIOPIC SYLLABLE PWEE
+138F;AL # ETHIOPIC SYLLABLE PWE
+1390;AL # ETHIOPIC TONAL MARK YIZET
+1391;AL # ETHIOPIC TONAL MARK DERET
+1392;AL # ETHIOPIC TONAL MARK RIKRIK
+1393;AL # ETHIOPIC TONAL MARK SHORT RIKRIK
+1394;AL # ETHIOPIC TONAL MARK DIFAT
+1395;AL # ETHIOPIC TONAL MARK KENAT
+1396;AL # ETHIOPIC TONAL MARK CHIRET
+1397;AL # ETHIOPIC TONAL MARK HIDET
+1398;AL # ETHIOPIC TONAL MARK DERET-HIDET
+1399;AL # ETHIOPIC TONAL MARK KURT
+13A0;AL # CHEROKEE LETTER A
+13A1;AL # CHEROKEE LETTER E
+13A2;AL # CHEROKEE LETTER I
+13A3;AL # CHEROKEE LETTER O
+13A4;AL # CHEROKEE LETTER U
+13A5;AL # CHEROKEE LETTER V
+13A6;AL # CHEROKEE LETTER GA
+13A7;AL # CHEROKEE LETTER KA
+13A8;AL # CHEROKEE LETTER GE
+13A9;AL # CHEROKEE LETTER GI
+13AA;AL # CHEROKEE LETTER GO
+13AB;AL # CHEROKEE LETTER GU
+13AC;AL # CHEROKEE LETTER GV
+13AD;AL # CHEROKEE LETTER HA
+13AE;AL # CHEROKEE LETTER HE
+13AF;AL # CHEROKEE LETTER HI
+13B0;AL # CHEROKEE LETTER HO
+13B1;AL # CHEROKEE LETTER HU
+13B2;AL # CHEROKEE LETTER HV
+13B3;AL # CHEROKEE LETTER LA
+13B4;AL # CHEROKEE LETTER LE
+13B5;AL # CHEROKEE LETTER LI
+13B6;AL # CHEROKEE LETTER LO
+13B7;AL # CHEROKEE LETTER LU
+13B8;AL # CHEROKEE LETTER LV
+13B9;AL # CHEROKEE LETTER MA
+13BA;AL # CHEROKEE LETTER ME
+13BB;AL # CHEROKEE LETTER MI
+13BC;AL # CHEROKEE LETTER MO
+13BD;AL # CHEROKEE LETTER MU
+13BE;AL # CHEROKEE LETTER NA
+13BF;AL # CHEROKEE LETTER HNA
+13C0;AL # CHEROKEE LETTER NAH
+13C1;AL # CHEROKEE LETTER NE
+13C2;AL # CHEROKEE LETTER NI
+13C3;AL # CHEROKEE LETTER NO
+13C4;AL # CHEROKEE LETTER NU
+13C5;AL # CHEROKEE LETTER NV
+13C6;AL # CHEROKEE LETTER QUA
+13C7;AL # CHEROKEE LETTER QUE
+13C8;AL # CHEROKEE LETTER QUI
+13C9;AL # CHEROKEE LETTER QUO
+13CA;AL # CHEROKEE LETTER QUU
+13CB;AL # CHEROKEE LETTER QUV
+13CC;AL # CHEROKEE LETTER SA
+13CD;AL # CHEROKEE LETTER S
+13CE;AL # CHEROKEE LETTER SE
+13CF;AL # CHEROKEE LETTER SI
+13D0;AL # CHEROKEE LETTER SO
+13D1;AL # CHEROKEE LETTER SU
+13D2;AL # CHEROKEE LETTER SV
+13D3;AL # CHEROKEE LETTER DA
+13D4;AL # CHEROKEE LETTER TA
+13D5;AL # CHEROKEE LETTER DE
+13D6;AL # CHEROKEE LETTER TE
+13D7;AL # CHEROKEE LETTER DI
+13D8;AL # CHEROKEE LETTER TI
+13D9;AL # CHEROKEE LETTER DO
+13DA;AL # CHEROKEE LETTER DU
+13DB;AL # CHEROKEE LETTER DV
+13DC;AL # CHEROKEE LETTER DLA
+13DD;AL # CHEROKEE LETTER TLA
+13DE;AL # CHEROKEE LETTER TLE
+13DF;AL # CHEROKEE LETTER TLI
+13E0;AL # CHEROKEE LETTER TLO
+13E1;AL # CHEROKEE LETTER TLU
+13E2;AL # CHEROKEE LETTER TLV
+13E3;AL # CHEROKEE LETTER TSA
+13E4;AL # CHEROKEE LETTER TSE
+13E5;AL # CHEROKEE LETTER TSI
+13E6;AL # CHEROKEE LETTER TSO
+13E7;AL # CHEROKEE LETTER TSU
+13E8;AL # CHEROKEE LETTER TSV
+13E9;AL # CHEROKEE LETTER WA
+13EA;AL # CHEROKEE LETTER WE
+13EB;AL # CHEROKEE LETTER WI
+13EC;AL # CHEROKEE LETTER WO
+13ED;AL # CHEROKEE LETTER WU
+13EE;AL # CHEROKEE LETTER WV
+13EF;AL # CHEROKEE LETTER YA
+13F0;AL # CHEROKEE LETTER YE
+13F1;AL # CHEROKEE LETTER YI
+13F2;AL # CHEROKEE LETTER YO
+13F3;AL # CHEROKEE LETTER YU
+13F4;AL # CHEROKEE LETTER YV
+1401;AL # CANADIAN SYLLABICS E
+1402;AL # CANADIAN SYLLABICS AAI
+1403;AL # CANADIAN SYLLABICS I
+1404;AL # CANADIAN SYLLABICS II
+1405;AL # CANADIAN SYLLABICS O
+1406;AL # CANADIAN SYLLABICS OO
+1407;AL # CANADIAN SYLLABICS Y-CREE OO
+1408;AL # CANADIAN SYLLABICS CARRIER EE
+1409;AL # CANADIAN SYLLABICS CARRIER I
+140A;AL # CANADIAN SYLLABICS A
+140B;AL # CANADIAN SYLLABICS AA
+140C;AL # CANADIAN SYLLABICS WE
+140D;AL # CANADIAN SYLLABICS WEST-CREE WE
+140E;AL # CANADIAN SYLLABICS WI
+140F;AL # CANADIAN SYLLABICS WEST-CREE WI
+1410;AL # CANADIAN SYLLABICS WII
+1411;AL # CANADIAN SYLLABICS WEST-CREE WII
+1412;AL # CANADIAN SYLLABICS WO
+1413;AL # CANADIAN SYLLABICS WEST-CREE WO
+1414;AL # CANADIAN SYLLABICS WOO
+1415;AL # CANADIAN SYLLABICS WEST-CREE WOO
+1416;AL # CANADIAN SYLLABICS NASKAPI WOO
+1417;AL # CANADIAN SYLLABICS WA
+1418;AL # CANADIAN SYLLABICS WEST-CREE WA
+1419;AL # CANADIAN SYLLABICS WAA
+141A;AL # CANADIAN SYLLABICS WEST-CREE WAA
+141B;AL # CANADIAN SYLLABICS NASKAPI WAA
+141C;AL # CANADIAN SYLLABICS AI
+141D;AL # CANADIAN SYLLABICS Y-CREE W
+141E;AL # CANADIAN SYLLABICS GLOTTAL STOP
+141F;AL # CANADIAN SYLLABICS FINAL ACUTE
+1420;AL # CANADIAN SYLLABICS FINAL GRAVE
+1421;AL # CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422;AL # CANADIAN SYLLABICS FINAL TOP HALF RING
+1423;AL # CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424;AL # CANADIAN SYLLABICS FINAL RING
+1425;AL # CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426;AL # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427;AL # CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428;AL # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429;AL # CANADIAN SYLLABICS FINAL PLUS
+142A;AL # CANADIAN SYLLABICS FINAL DOWN TACK
+142B;AL # CANADIAN SYLLABICS EN
+142C;AL # CANADIAN SYLLABICS IN
+142D;AL # CANADIAN SYLLABICS ON
+142E;AL # CANADIAN SYLLABICS AN
+142F;AL # CANADIAN SYLLABICS PE
+1430;AL # CANADIAN SYLLABICS PAAI
+1431;AL # CANADIAN SYLLABICS PI
+1432;AL # CANADIAN SYLLABICS PII
+1433;AL # CANADIAN SYLLABICS PO
+1434;AL # CANADIAN SYLLABICS POO
+1435;AL # CANADIAN SYLLABICS Y-CREE POO
+1436;AL # CANADIAN SYLLABICS CARRIER HEE
+1437;AL # CANADIAN SYLLABICS CARRIER HI
+1438;AL # CANADIAN SYLLABICS PA
+1439;AL # CANADIAN SYLLABICS PAA
+143A;AL # CANADIAN SYLLABICS PWE
+143B;AL # CANADIAN SYLLABICS WEST-CREE PWE
+143C;AL # CANADIAN SYLLABICS PWI
+143D;AL # CANADIAN SYLLABICS WEST-CREE PWI
+143E;AL # CANADIAN SYLLABICS PWII
+143F;AL # CANADIAN SYLLABICS WEST-CREE PWII
+1440;AL # CANADIAN SYLLABICS PWO
+1441;AL # CANADIAN SYLLABICS WEST-CREE PWO
+1442;AL # CANADIAN SYLLABICS PWOO
+1443;AL # CANADIAN SYLLABICS WEST-CREE PWOO
+1444;AL # CANADIAN SYLLABICS PWA
+1445;AL # CANADIAN SYLLABICS WEST-CREE PWA
+1446;AL # CANADIAN SYLLABICS PWAA
+1447;AL # CANADIAN SYLLABICS WEST-CREE PWAA
+1448;AL # CANADIAN SYLLABICS Y-CREE PWAA
+1449;AL # CANADIAN SYLLABICS P
+144A;AL # CANADIAN SYLLABICS WEST-CREE P
+144B;AL # CANADIAN SYLLABICS CARRIER H
+144C;AL # CANADIAN SYLLABICS TE
+144D;AL # CANADIAN SYLLABICS TAAI
+144E;AL # CANADIAN SYLLABICS TI
+144F;AL # CANADIAN SYLLABICS TII
+1450;AL # CANADIAN SYLLABICS TO
+1451;AL # CANADIAN SYLLABICS TOO
+1452;AL # CANADIAN SYLLABICS Y-CREE TOO
+1453;AL # CANADIAN SYLLABICS CARRIER DEE
+1454;AL # CANADIAN SYLLABICS CARRIER DI
+1455;AL # CANADIAN SYLLABICS TA
+1456;AL # CANADIAN SYLLABICS TAA
+1457;AL # CANADIAN SYLLABICS TWE
+1458;AL # CANADIAN SYLLABICS WEST-CREE TWE
+1459;AL # CANADIAN SYLLABICS TWI
+145A;AL # CANADIAN SYLLABICS WEST-CREE TWI
+145B;AL # CANADIAN SYLLABICS TWII
+145C;AL # CANADIAN SYLLABICS WEST-CREE TWII
+145D;AL # CANADIAN SYLLABICS TWO
+145E;AL # CANADIAN SYLLABICS WEST-CREE TWO
+145F;AL # CANADIAN SYLLABICS TWOO
+1460;AL # CANADIAN SYLLABICS WEST-CREE TWOO
+1461;AL # CANADIAN SYLLABICS TWA
+1462;AL # CANADIAN SYLLABICS WEST-CREE TWA
+1463;AL # CANADIAN SYLLABICS TWAA
+1464;AL # CANADIAN SYLLABICS WEST-CREE TWAA
+1465;AL # CANADIAN SYLLABICS NASKAPI TWAA
+1466;AL # CANADIAN SYLLABICS T
+1467;AL # CANADIAN SYLLABICS TTE
+1468;AL # CANADIAN SYLLABICS TTI
+1469;AL # CANADIAN SYLLABICS TTO
+146A;AL # CANADIAN SYLLABICS TTA
+146B;AL # CANADIAN SYLLABICS KE
+146C;AL # CANADIAN SYLLABICS KAAI
+146D;AL # CANADIAN SYLLABICS KI
+146E;AL # CANADIAN SYLLABICS KII
+146F;AL # CANADIAN SYLLABICS KO
+1470;AL # CANADIAN SYLLABICS KOO
+1471;AL # CANADIAN SYLLABICS Y-CREE KOO
+1472;AL # CANADIAN SYLLABICS KA
+1473;AL # CANADIAN SYLLABICS KAA
+1474;AL # CANADIAN SYLLABICS KWE
+1475;AL # CANADIAN SYLLABICS WEST-CREE KWE
+1476;AL # CANADIAN SYLLABICS KWI
+1477;AL # CANADIAN SYLLABICS WEST-CREE KWI
+1478;AL # CANADIAN SYLLABICS KWII
+1479;AL # CANADIAN SYLLABICS WEST-CREE KWII
+147A;AL # CANADIAN SYLLABICS KWO
+147B;AL # CANADIAN SYLLABICS WEST-CREE KWO
+147C;AL # CANADIAN SYLLABICS KWOO
+147D;AL # CANADIAN SYLLABICS WEST-CREE KWOO
+147E;AL # CANADIAN SYLLABICS KWA
+147F;AL # CANADIAN SYLLABICS WEST-CREE KWA
+1480;AL # CANADIAN SYLLABICS KWAA
+1481;AL # CANADIAN SYLLABICS WEST-CREE KWAA
+1482;AL # CANADIAN SYLLABICS NASKAPI KWAA
+1483;AL # CANADIAN SYLLABICS K
+1484;AL # CANADIAN SYLLABICS KW
+1485;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488;AL # CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489;AL # CANADIAN SYLLABICS CE
+148A;AL # CANADIAN SYLLABICS CAAI
+148B;AL # CANADIAN SYLLABICS CI
+148C;AL # CANADIAN SYLLABICS CII
+148D;AL # CANADIAN SYLLABICS CO
+148E;AL # CANADIAN SYLLABICS COO
+148F;AL # CANADIAN SYLLABICS Y-CREE COO
+1490;AL # CANADIAN SYLLABICS CA
+1491;AL # CANADIAN SYLLABICS CAA
+1492;AL # CANADIAN SYLLABICS CWE
+1493;AL # CANADIAN SYLLABICS WEST-CREE CWE
+1494;AL # CANADIAN SYLLABICS CWI
+1495;AL # CANADIAN SYLLABICS WEST-CREE CWI
+1496;AL # CANADIAN SYLLABICS CWII
+1497;AL # CANADIAN SYLLABICS WEST-CREE CWII
+1498;AL # CANADIAN SYLLABICS CWO
+1499;AL # CANADIAN SYLLABICS WEST-CREE CWO
+149A;AL # CANADIAN SYLLABICS CWOO
+149B;AL # CANADIAN SYLLABICS WEST-CREE CWOO
+149C;AL # CANADIAN SYLLABICS CWA
+149D;AL # CANADIAN SYLLABICS WEST-CREE CWA
+149E;AL # CANADIAN SYLLABICS CWAA
+149F;AL # CANADIAN SYLLABICS WEST-CREE CWAA
+14A0;AL # CANADIAN SYLLABICS NASKAPI CWAA
+14A1;AL # CANADIAN SYLLABICS C
+14A2;AL # CANADIAN SYLLABICS SAYISI TH
+14A3;AL # CANADIAN SYLLABICS ME
+14A4;AL # CANADIAN SYLLABICS MAAI
+14A5;AL # CANADIAN SYLLABICS MI
+14A6;AL # CANADIAN SYLLABICS MII
+14A7;AL # CANADIAN SYLLABICS MO
+14A8;AL # CANADIAN SYLLABICS MOO
+14A9;AL # CANADIAN SYLLABICS Y-CREE MOO
+14AA;AL # CANADIAN SYLLABICS MA
+14AB;AL # CANADIAN SYLLABICS MAA
+14AC;AL # CANADIAN SYLLABICS MWE
+14AD;AL # CANADIAN SYLLABICS WEST-CREE MWE
+14AE;AL # CANADIAN SYLLABICS MWI
+14AF;AL # CANADIAN SYLLABICS WEST-CREE MWI
+14B0;AL # CANADIAN SYLLABICS MWII
+14B1;AL # CANADIAN SYLLABICS WEST-CREE MWII
+14B2;AL # CANADIAN SYLLABICS MWO
+14B3;AL # CANADIAN SYLLABICS WEST-CREE MWO
+14B4;AL # CANADIAN SYLLABICS MWOO
+14B5;AL # CANADIAN SYLLABICS WEST-CREE MWOO
+14B6;AL # CANADIAN SYLLABICS MWA
+14B7;AL # CANADIAN SYLLABICS WEST-CREE MWA
+14B8;AL # CANADIAN SYLLABICS MWAA
+14B9;AL # CANADIAN SYLLABICS WEST-CREE MWAA
+14BA;AL # CANADIAN SYLLABICS NASKAPI MWAA
+14BB;AL # CANADIAN SYLLABICS M
+14BC;AL # CANADIAN SYLLABICS WEST-CREE M
+14BD;AL # CANADIAN SYLLABICS MH
+14BE;AL # CANADIAN SYLLABICS ATHAPASCAN M
+14BF;AL # CANADIAN SYLLABICS SAYISI M
+14C0;AL # CANADIAN SYLLABICS NE
+14C1;AL # CANADIAN SYLLABICS NAAI
+14C2;AL # CANADIAN SYLLABICS NI
+14C3;AL # CANADIAN SYLLABICS NII
+14C4;AL # CANADIAN SYLLABICS NO
+14C5;AL # CANADIAN SYLLABICS NOO
+14C6;AL # CANADIAN SYLLABICS Y-CREE NOO
+14C7;AL # CANADIAN SYLLABICS NA
+14C8;AL # CANADIAN SYLLABICS NAA
+14C9;AL # CANADIAN SYLLABICS NWE
+14CA;AL # CANADIAN SYLLABICS WEST-CREE NWE
+14CB;AL # CANADIAN SYLLABICS NWA
+14CC;AL # CANADIAN SYLLABICS WEST-CREE NWA
+14CD;AL # CANADIAN SYLLABICS NWAA
+14CE;AL # CANADIAN SYLLABICS WEST-CREE NWAA
+14CF;AL # CANADIAN SYLLABICS NASKAPI NWAA
+14D0;AL # CANADIAN SYLLABICS N
+14D1;AL # CANADIAN SYLLABICS CARRIER NG
+14D2;AL # CANADIAN SYLLABICS NH
+14D3;AL # CANADIAN SYLLABICS LE
+14D4;AL # CANADIAN SYLLABICS LAAI
+14D5;AL # CANADIAN SYLLABICS LI
+14D6;AL # CANADIAN SYLLABICS LII
+14D7;AL # CANADIAN SYLLABICS LO
+14D8;AL # CANADIAN SYLLABICS LOO
+14D9;AL # CANADIAN SYLLABICS Y-CREE LOO
+14DA;AL # CANADIAN SYLLABICS LA
+14DB;AL # CANADIAN SYLLABICS LAA
+14DC;AL # CANADIAN SYLLABICS LWE
+14DD;AL # CANADIAN SYLLABICS WEST-CREE LWE
+14DE;AL # CANADIAN SYLLABICS LWI
+14DF;AL # CANADIAN SYLLABICS WEST-CREE LWI
+14E0;AL # CANADIAN SYLLABICS LWII
+14E1;AL # CANADIAN SYLLABICS WEST-CREE LWII
+14E2;AL # CANADIAN SYLLABICS LWO
+14E3;AL # CANADIAN SYLLABICS WEST-CREE LWO
+14E4;AL # CANADIAN SYLLABICS LWOO
+14E5;AL # CANADIAN SYLLABICS WEST-CREE LWOO
+14E6;AL # CANADIAN SYLLABICS LWA
+14E7;AL # CANADIAN SYLLABICS WEST-CREE LWA
+14E8;AL # CANADIAN SYLLABICS LWAA
+14E9;AL # CANADIAN SYLLABICS WEST-CREE LWAA
+14EA;AL # CANADIAN SYLLABICS L
+14EB;AL # CANADIAN SYLLABICS WEST-CREE L
+14EC;AL # CANADIAN SYLLABICS MEDIAL L
+14ED;AL # CANADIAN SYLLABICS SE
+14EE;AL # CANADIAN SYLLABICS SAAI
+14EF;AL # CANADIAN SYLLABICS SI
+14F0;AL # CANADIAN SYLLABICS SII
+14F1;AL # CANADIAN SYLLABICS SO
+14F2;AL # CANADIAN SYLLABICS SOO
+14F3;AL # CANADIAN SYLLABICS Y-CREE SOO
+14F4;AL # CANADIAN SYLLABICS SA
+14F5;AL # CANADIAN SYLLABICS SAA
+14F6;AL # CANADIAN SYLLABICS SWE
+14F7;AL # CANADIAN SYLLABICS WEST-CREE SWE
+14F8;AL # CANADIAN SYLLABICS SWI
+14F9;AL # CANADIAN SYLLABICS WEST-CREE SWI
+14FA;AL # CANADIAN SYLLABICS SWII
+14FB;AL # CANADIAN SYLLABICS WEST-CREE SWII
+14FC;AL # CANADIAN SYLLABICS SWO
+14FD;AL # CANADIAN SYLLABICS WEST-CREE SWO
+14FE;AL # CANADIAN SYLLABICS SWOO
+14FF;AL # CANADIAN SYLLABICS WEST-CREE SWOO
+1500;AL # CANADIAN SYLLABICS SWA
+1501;AL # CANADIAN SYLLABICS WEST-CREE SWA
+1502;AL # CANADIAN SYLLABICS SWAA
+1503;AL # CANADIAN SYLLABICS WEST-CREE SWAA
+1504;AL # CANADIAN SYLLABICS NASKAPI SWAA
+1505;AL # CANADIAN SYLLABICS S
+1506;AL # CANADIAN SYLLABICS ATHAPASCAN S
+1507;AL # CANADIAN SYLLABICS SW
+1508;AL # CANADIAN SYLLABICS BLACKFOOT S
+1509;AL # CANADIAN SYLLABICS MOOSE-CREE SK
+150A;AL # CANADIAN SYLLABICS NASKAPI SKW
+150B;AL # CANADIAN SYLLABICS NASKAPI S-W
+150C;AL # CANADIAN SYLLABICS NASKAPI SPWA
+150D;AL # CANADIAN SYLLABICS NASKAPI STWA
+150E;AL # CANADIAN SYLLABICS NASKAPI SKWA
+150F;AL # CANADIAN SYLLABICS NASKAPI SCWA
+1510;AL # CANADIAN SYLLABICS SHE
+1511;AL # CANADIAN SYLLABICS SHI
+1512;AL # CANADIAN SYLLABICS SHII
+1513;AL # CANADIAN SYLLABICS SHO
+1514;AL # CANADIAN SYLLABICS SHOO
+1515;AL # CANADIAN SYLLABICS SHA
+1516;AL # CANADIAN SYLLABICS SHAA
+1517;AL # CANADIAN SYLLABICS SHWE
+1518;AL # CANADIAN SYLLABICS WEST-CREE SHWE
+1519;AL # CANADIAN SYLLABICS SHWI
+151A;AL # CANADIAN SYLLABICS WEST-CREE SHWI
+151B;AL # CANADIAN SYLLABICS SHWII
+151C;AL # CANADIAN SYLLABICS WEST-CREE SHWII
+151D;AL # CANADIAN SYLLABICS SHWO
+151E;AL # CANADIAN SYLLABICS WEST-CREE SHWO
+151F;AL # CANADIAN SYLLABICS SHWOO
+1520;AL # CANADIAN SYLLABICS WEST-CREE SHWOO
+1521;AL # CANADIAN SYLLABICS SHWA
+1522;AL # CANADIAN SYLLABICS WEST-CREE SHWA
+1523;AL # CANADIAN SYLLABICS SHWAA
+1524;AL # CANADIAN SYLLABICS WEST-CREE SHWAA
+1525;AL # CANADIAN SYLLABICS SH
+1526;AL # CANADIAN SYLLABICS YE
+1527;AL # CANADIAN SYLLABICS YAAI
+1528;AL # CANADIAN SYLLABICS YI
+1529;AL # CANADIAN SYLLABICS YII
+152A;AL # CANADIAN SYLLABICS YO
+152B;AL # CANADIAN SYLLABICS YOO
+152C;AL # CANADIAN SYLLABICS Y-CREE YOO
+152D;AL # CANADIAN SYLLABICS YA
+152E;AL # CANADIAN SYLLABICS YAA
+152F;AL # CANADIAN SYLLABICS YWE
+1530;AL # CANADIAN SYLLABICS WEST-CREE YWE
+1531;AL # CANADIAN SYLLABICS YWI
+1532;AL # CANADIAN SYLLABICS WEST-CREE YWI
+1533;AL # CANADIAN SYLLABICS YWII
+1534;AL # CANADIAN SYLLABICS WEST-CREE YWII
+1535;AL # CANADIAN SYLLABICS YWO
+1536;AL # CANADIAN SYLLABICS WEST-CREE YWO
+1537;AL # CANADIAN SYLLABICS YWOO
+1538;AL # CANADIAN SYLLABICS WEST-CREE YWOO
+1539;AL # CANADIAN SYLLABICS YWA
+153A;AL # CANADIAN SYLLABICS WEST-CREE YWA
+153B;AL # CANADIAN SYLLABICS YWAA
+153C;AL # CANADIAN SYLLABICS WEST-CREE YWAA
+153D;AL # CANADIAN SYLLABICS NASKAPI YWAA
+153E;AL # CANADIAN SYLLABICS Y
+153F;AL # CANADIAN SYLLABICS BIBLE-CREE Y
+1540;AL # CANADIAN SYLLABICS WEST-CREE Y
+1541;AL # CANADIAN SYLLABICS SAYISI YI
+1542;AL # CANADIAN SYLLABICS RE
+1543;AL # CANADIAN SYLLABICS R-CREE RE
+1544;AL # CANADIAN SYLLABICS WEST-CREE LE
+1545;AL # CANADIAN SYLLABICS RAAI
+1546;AL # CANADIAN SYLLABICS RI
+1547;AL # CANADIAN SYLLABICS RII
+1548;AL # CANADIAN SYLLABICS RO
+1549;AL # CANADIAN SYLLABICS ROO
+154A;AL # CANADIAN SYLLABICS WEST-CREE LO
+154B;AL # CANADIAN SYLLABICS RA
+154C;AL # CANADIAN SYLLABICS RAA
+154D;AL # CANADIAN SYLLABICS WEST-CREE LA
+154E;AL # CANADIAN SYLLABICS RWAA
+154F;AL # CANADIAN SYLLABICS WEST-CREE RWAA
+1550;AL # CANADIAN SYLLABICS R
+1551;AL # CANADIAN SYLLABICS WEST-CREE R
+1552;AL # CANADIAN SYLLABICS MEDIAL R
+1553;AL # CANADIAN SYLLABICS FE
+1554;AL # CANADIAN SYLLABICS FAAI
+1555;AL # CANADIAN SYLLABICS FI
+1556;AL # CANADIAN SYLLABICS FII
+1557;AL # CANADIAN SYLLABICS FO
+1558;AL # CANADIAN SYLLABICS FOO
+1559;AL # CANADIAN SYLLABICS FA
+155A;AL # CANADIAN SYLLABICS FAA
+155B;AL # CANADIAN SYLLABICS FWAA
+155C;AL # CANADIAN SYLLABICS WEST-CREE FWAA
+155D;AL # CANADIAN SYLLABICS F
+155E;AL # CANADIAN SYLLABICS THE
+155F;AL # CANADIAN SYLLABICS N-CREE THE
+1560;AL # CANADIAN SYLLABICS THI
+1561;AL # CANADIAN SYLLABICS N-CREE THI
+1562;AL # CANADIAN SYLLABICS THII
+1563;AL # CANADIAN SYLLABICS N-CREE THII
+1564;AL # CANADIAN SYLLABICS THO
+1565;AL # CANADIAN SYLLABICS THOO
+1566;AL # CANADIAN SYLLABICS THA
+1567;AL # CANADIAN SYLLABICS THAA
+1568;AL # CANADIAN SYLLABICS THWAA
+1569;AL # CANADIAN SYLLABICS WEST-CREE THWAA
+156A;AL # CANADIAN SYLLABICS TH
+156B;AL # CANADIAN SYLLABICS TTHE
+156C;AL # CANADIAN SYLLABICS TTHI
+156D;AL # CANADIAN SYLLABICS TTHO
+156E;AL # CANADIAN SYLLABICS TTHA
+156F;AL # CANADIAN SYLLABICS TTH
+1570;AL # CANADIAN SYLLABICS TYE
+1571;AL # CANADIAN SYLLABICS TYI
+1572;AL # CANADIAN SYLLABICS TYO
+1573;AL # CANADIAN SYLLABICS TYA
+1574;AL # CANADIAN SYLLABICS NUNAVIK HE
+1575;AL # CANADIAN SYLLABICS NUNAVIK HI
+1576;AL # CANADIAN SYLLABICS NUNAVIK HII
+1577;AL # CANADIAN SYLLABICS NUNAVIK HO
+1578;AL # CANADIAN SYLLABICS NUNAVIK HOO
+1579;AL # CANADIAN SYLLABICS NUNAVIK HA
+157A;AL # CANADIAN SYLLABICS NUNAVIK HAA
+157B;AL # CANADIAN SYLLABICS NUNAVIK H
+157C;AL # CANADIAN SYLLABICS NUNAVUT H
+157D;AL # CANADIAN SYLLABICS HK
+157E;AL # CANADIAN SYLLABICS QAAI
+157F;AL # CANADIAN SYLLABICS QI
+1580;AL # CANADIAN SYLLABICS QII
+1581;AL # CANADIAN SYLLABICS QO
+1582;AL # CANADIAN SYLLABICS QOO
+1583;AL # CANADIAN SYLLABICS QA
+1584;AL # CANADIAN SYLLABICS QAA
+1585;AL # CANADIAN SYLLABICS Q
+1586;AL # CANADIAN SYLLABICS TLHE
+1587;AL # CANADIAN SYLLABICS TLHI
+1588;AL # CANADIAN SYLLABICS TLHO
+1589;AL # CANADIAN SYLLABICS TLHA
+158A;AL # CANADIAN SYLLABICS WEST-CREE RE
+158B;AL # CANADIAN SYLLABICS WEST-CREE RI
+158C;AL # CANADIAN SYLLABICS WEST-CREE RO
+158D;AL # CANADIAN SYLLABICS WEST-CREE RA
+158E;AL # CANADIAN SYLLABICS NGAAI
+158F;AL # CANADIAN SYLLABICS NGI
+1590;AL # CANADIAN SYLLABICS NGII
+1591;AL # CANADIAN SYLLABICS NGO
+1592;AL # CANADIAN SYLLABICS NGOO
+1593;AL # CANADIAN SYLLABICS NGA
+1594;AL # CANADIAN SYLLABICS NGAA
+1595;AL # CANADIAN SYLLABICS NG
+1596;AL # CANADIAN SYLLABICS NNG
+1597;AL # CANADIAN SYLLABICS SAYISI SHE
+1598;AL # CANADIAN SYLLABICS SAYISI SHI
+1599;AL # CANADIAN SYLLABICS SAYISI SHO
+159A;AL # CANADIAN SYLLABICS SAYISI SHA
+159B;AL # CANADIAN SYLLABICS WOODS-CREE THE
+159C;AL # CANADIAN SYLLABICS WOODS-CREE THI
+159D;AL # CANADIAN SYLLABICS WOODS-CREE THO
+159E;AL # CANADIAN SYLLABICS WOODS-CREE THA
+159F;AL # CANADIAN SYLLABICS WOODS-CREE TH
+15A0;AL # CANADIAN SYLLABICS LHI
+15A1;AL # CANADIAN SYLLABICS LHII
+15A2;AL # CANADIAN SYLLABICS LHO
+15A3;AL # CANADIAN SYLLABICS LHOO
+15A4;AL # CANADIAN SYLLABICS LHA
+15A5;AL # CANADIAN SYLLABICS LHAA
+15A6;AL # CANADIAN SYLLABICS LH
+15A7;AL # CANADIAN SYLLABICS TH-CREE THE
+15A8;AL # CANADIAN SYLLABICS TH-CREE THI
+15A9;AL # CANADIAN SYLLABICS TH-CREE THII
+15AA;AL # CANADIAN SYLLABICS TH-CREE THO
+15AB;AL # CANADIAN SYLLABICS TH-CREE THOO
+15AC;AL # CANADIAN SYLLABICS TH-CREE THA
+15AD;AL # CANADIAN SYLLABICS TH-CREE THAA
+15AE;AL # CANADIAN SYLLABICS TH-CREE TH
+15AF;AL # CANADIAN SYLLABICS AIVILIK B
+15B0;AL # CANADIAN SYLLABICS BLACKFOOT E
+15B1;AL # CANADIAN SYLLABICS BLACKFOOT I
+15B2;AL # CANADIAN SYLLABICS BLACKFOOT O
+15B3;AL # CANADIAN SYLLABICS BLACKFOOT A
+15B4;AL # CANADIAN SYLLABICS BLACKFOOT WE
+15B5;AL # CANADIAN SYLLABICS BLACKFOOT WI
+15B6;AL # CANADIAN SYLLABICS BLACKFOOT WO
+15B7;AL # CANADIAN SYLLABICS BLACKFOOT WA
+15B8;AL # CANADIAN SYLLABICS BLACKFOOT NE
+15B9;AL # CANADIAN SYLLABICS BLACKFOOT NI
+15BA;AL # CANADIAN SYLLABICS BLACKFOOT NO
+15BB;AL # CANADIAN SYLLABICS BLACKFOOT NA
+15BC;AL # CANADIAN SYLLABICS BLACKFOOT KE
+15BD;AL # CANADIAN SYLLABICS BLACKFOOT KI
+15BE;AL # CANADIAN SYLLABICS BLACKFOOT KO
+15BF;AL # CANADIAN SYLLABICS BLACKFOOT KA
+15C0;AL # CANADIAN SYLLABICS SAYISI HE
+15C1;AL # CANADIAN SYLLABICS SAYISI HI
+15C2;AL # CANADIAN SYLLABICS SAYISI HO
+15C3;AL # CANADIAN SYLLABICS SAYISI HA
+15C4;AL # CANADIAN SYLLABICS CARRIER GHU
+15C5;AL # CANADIAN SYLLABICS CARRIER GHO
+15C6;AL # CANADIAN SYLLABICS CARRIER GHE
+15C7;AL # CANADIAN SYLLABICS CARRIER GHEE
+15C8;AL # CANADIAN SYLLABICS CARRIER GHI
+15C9;AL # CANADIAN SYLLABICS CARRIER GHA
+15CA;AL # CANADIAN SYLLABICS CARRIER RU
+15CB;AL # CANADIAN SYLLABICS CARRIER RO
+15CC;AL # CANADIAN SYLLABICS CARRIER RE
+15CD;AL # CANADIAN SYLLABICS CARRIER REE
+15CE;AL # CANADIAN SYLLABICS CARRIER RI
+15CF;AL # CANADIAN SYLLABICS CARRIER RA
+15D0;AL # CANADIAN SYLLABICS CARRIER WU
+15D1;AL # CANADIAN SYLLABICS CARRIER WO
+15D2;AL # CANADIAN SYLLABICS CARRIER WE
+15D3;AL # CANADIAN SYLLABICS CARRIER WEE
+15D4;AL # CANADIAN SYLLABICS CARRIER WI
+15D5;AL # CANADIAN SYLLABICS CARRIER WA
+15D6;AL # CANADIAN SYLLABICS CARRIER HWU
+15D7;AL # CANADIAN SYLLABICS CARRIER HWO
+15D8;AL # CANADIAN SYLLABICS CARRIER HWE
+15D9;AL # CANADIAN SYLLABICS CARRIER HWEE
+15DA;AL # CANADIAN SYLLABICS CARRIER HWI
+15DB;AL # CANADIAN SYLLABICS CARRIER HWA
+15DC;AL # CANADIAN SYLLABICS CARRIER THU
+15DD;AL # CANADIAN SYLLABICS CARRIER THO
+15DE;AL # CANADIAN SYLLABICS CARRIER THE
+15DF;AL # CANADIAN SYLLABICS CARRIER THEE
+15E0;AL # CANADIAN SYLLABICS CARRIER THI
+15E1;AL # CANADIAN SYLLABICS CARRIER THA
+15E2;AL # CANADIAN SYLLABICS CARRIER TTU
+15E3;AL # CANADIAN SYLLABICS CARRIER TTO
+15E4;AL # CANADIAN SYLLABICS CARRIER TTE
+15E5;AL # CANADIAN SYLLABICS CARRIER TTEE
+15E6;AL # CANADIAN SYLLABICS CARRIER TTI
+15E7;AL # CANADIAN SYLLABICS CARRIER TTA
+15E8;AL # CANADIAN SYLLABICS CARRIER PU
+15E9;AL # CANADIAN SYLLABICS CARRIER PO
+15EA;AL # CANADIAN SYLLABICS CARRIER PE
+15EB;AL # CANADIAN SYLLABICS CARRIER PEE
+15EC;AL # CANADIAN SYLLABICS CARRIER PI
+15ED;AL # CANADIAN SYLLABICS CARRIER PA
+15EE;AL # CANADIAN SYLLABICS CARRIER P
+15EF;AL # CANADIAN SYLLABICS CARRIER GU
+15F0;AL # CANADIAN SYLLABICS CARRIER GO
+15F1;AL # CANADIAN SYLLABICS CARRIER GE
+15F2;AL # CANADIAN SYLLABICS CARRIER GEE
+15F3;AL # CANADIAN SYLLABICS CARRIER GI
+15F4;AL # CANADIAN SYLLABICS CARRIER GA
+15F5;AL # CANADIAN SYLLABICS CARRIER KHU
+15F6;AL # CANADIAN SYLLABICS CARRIER KHO
+15F7;AL # CANADIAN SYLLABICS CARRIER KHE
+15F8;AL # CANADIAN SYLLABICS CARRIER KHEE
+15F9;AL # CANADIAN SYLLABICS CARRIER KHI
+15FA;AL # CANADIAN SYLLABICS CARRIER KHA
+15FB;AL # CANADIAN SYLLABICS CARRIER KKU
+15FC;AL # CANADIAN SYLLABICS CARRIER KKO
+15FD;AL # CANADIAN SYLLABICS CARRIER KKE
+15FE;AL # CANADIAN SYLLABICS CARRIER KKEE
+15FF;AL # CANADIAN SYLLABICS CARRIER KKI
+1600;AL # CANADIAN SYLLABICS CARRIER KKA
+1601;AL # CANADIAN SYLLABICS CARRIER KK
+1602;AL # CANADIAN SYLLABICS CARRIER NU
+1603;AL # CANADIAN SYLLABICS CARRIER NO
+1604;AL # CANADIAN SYLLABICS CARRIER NE
+1605;AL # CANADIAN SYLLABICS CARRIER NEE
+1606;AL # CANADIAN SYLLABICS CARRIER NI
+1607;AL # CANADIAN SYLLABICS CARRIER NA
+1608;AL # CANADIAN SYLLABICS CARRIER MU
+1609;AL # CANADIAN SYLLABICS CARRIER MO
+160A;AL # CANADIAN SYLLABICS CARRIER ME
+160B;AL # CANADIAN SYLLABICS CARRIER MEE
+160C;AL # CANADIAN SYLLABICS CARRIER MI
+160D;AL # CANADIAN SYLLABICS CARRIER MA
+160E;AL # CANADIAN SYLLABICS CARRIER YU
+160F;AL # CANADIAN SYLLABICS CARRIER YO
+1610;AL # CANADIAN SYLLABICS CARRIER YE
+1611;AL # CANADIAN SYLLABICS CARRIER YEE
+1612;AL # CANADIAN SYLLABICS CARRIER YI
+1613;AL # CANADIAN SYLLABICS CARRIER YA
+1614;AL # CANADIAN SYLLABICS CARRIER JU
+1615;AL # CANADIAN SYLLABICS SAYISI JU
+1616;AL # CANADIAN SYLLABICS CARRIER JO
+1617;AL # CANADIAN SYLLABICS CARRIER JE
+1618;AL # CANADIAN SYLLABICS CARRIER JEE
+1619;AL # CANADIAN SYLLABICS CARRIER JI
+161A;AL # CANADIAN SYLLABICS SAYISI JI
+161B;AL # CANADIAN SYLLABICS CARRIER JA
+161C;AL # CANADIAN SYLLABICS CARRIER JJU
+161D;AL # CANADIAN SYLLABICS CARRIER JJO
+161E;AL # CANADIAN SYLLABICS CARRIER JJE
+161F;AL # CANADIAN SYLLABICS CARRIER JJEE
+1620;AL # CANADIAN SYLLABICS CARRIER JJI
+1621;AL # CANADIAN SYLLABICS CARRIER JJA
+1622;AL # CANADIAN SYLLABICS CARRIER LU
+1623;AL # CANADIAN SYLLABICS CARRIER LO
+1624;AL # CANADIAN SYLLABICS CARRIER LE
+1625;AL # CANADIAN SYLLABICS CARRIER LEE
+1626;AL # CANADIAN SYLLABICS CARRIER LI
+1627;AL # CANADIAN SYLLABICS CARRIER LA
+1628;AL # CANADIAN SYLLABICS CARRIER DLU
+1629;AL # CANADIAN SYLLABICS CARRIER DLO
+162A;AL # CANADIAN SYLLABICS CARRIER DLE
+162B;AL # CANADIAN SYLLABICS CARRIER DLEE
+162C;AL # CANADIAN SYLLABICS CARRIER DLI
+162D;AL # CANADIAN SYLLABICS CARRIER DLA
+162E;AL # CANADIAN SYLLABICS CARRIER LHU
+162F;AL # CANADIAN SYLLABICS CARRIER LHO
+1630;AL # CANADIAN SYLLABICS CARRIER LHE
+1631;AL # CANADIAN SYLLABICS CARRIER LHEE
+1632;AL # CANADIAN SYLLABICS CARRIER LHI
+1633;AL # CANADIAN SYLLABICS CARRIER LHA
+1634;AL # CANADIAN SYLLABICS CARRIER TLHU
+1635;AL # CANADIAN SYLLABICS CARRIER TLHO
+1636;AL # CANADIAN SYLLABICS CARRIER TLHE
+1637;AL # CANADIAN SYLLABICS CARRIER TLHEE
+1638;AL # CANADIAN SYLLABICS CARRIER TLHI
+1639;AL # CANADIAN SYLLABICS CARRIER TLHA
+163A;AL # CANADIAN SYLLABICS CARRIER TLU
+163B;AL # CANADIAN SYLLABICS CARRIER TLO
+163C;AL # CANADIAN SYLLABICS CARRIER TLE
+163D;AL # CANADIAN SYLLABICS CARRIER TLEE
+163E;AL # CANADIAN SYLLABICS CARRIER TLI
+163F;AL # CANADIAN SYLLABICS CARRIER TLA
+1640;AL # CANADIAN SYLLABICS CARRIER ZU
+1641;AL # CANADIAN SYLLABICS CARRIER ZO
+1642;AL # CANADIAN SYLLABICS CARRIER ZE
+1643;AL # CANADIAN SYLLABICS CARRIER ZEE
+1644;AL # CANADIAN SYLLABICS CARRIER ZI
+1645;AL # CANADIAN SYLLABICS CARRIER ZA
+1646;AL # CANADIAN SYLLABICS CARRIER Z
+1647;AL # CANADIAN SYLLABICS CARRIER INITIAL Z
+1648;AL # CANADIAN SYLLABICS CARRIER DZU
+1649;AL # CANADIAN SYLLABICS CARRIER DZO
+164A;AL # CANADIAN SYLLABICS CARRIER DZE
+164B;AL # CANADIAN SYLLABICS CARRIER DZEE
+164C;AL # CANADIAN SYLLABICS CARRIER DZI
+164D;AL # CANADIAN SYLLABICS CARRIER DZA
+164E;AL # CANADIAN SYLLABICS CARRIER SU
+164F;AL # CANADIAN SYLLABICS CARRIER SO
+1650;AL # CANADIAN SYLLABICS CARRIER SE
+1651;AL # CANADIAN SYLLABICS CARRIER SEE
+1652;AL # CANADIAN SYLLABICS CARRIER SI
+1653;AL # CANADIAN SYLLABICS CARRIER SA
+1654;AL # CANADIAN SYLLABICS CARRIER SHU
+1655;AL # CANADIAN SYLLABICS CARRIER SHO
+1656;AL # CANADIAN SYLLABICS CARRIER SHE
+1657;AL # CANADIAN SYLLABICS CARRIER SHEE
+1658;AL # CANADIAN SYLLABICS CARRIER SHI
+1659;AL # CANADIAN SYLLABICS CARRIER SHA
+165A;AL # CANADIAN SYLLABICS CARRIER SH
+165B;AL # CANADIAN SYLLABICS CARRIER TSU
+165C;AL # CANADIAN SYLLABICS CARRIER TSO
+165D;AL # CANADIAN SYLLABICS CARRIER TSE
+165E;AL # CANADIAN SYLLABICS CARRIER TSEE
+165F;AL # CANADIAN SYLLABICS CARRIER TSI
+1660;AL # CANADIAN SYLLABICS CARRIER TSA
+1661;AL # CANADIAN SYLLABICS CARRIER CHU
+1662;AL # CANADIAN SYLLABICS CARRIER CHO
+1663;AL # CANADIAN SYLLABICS CARRIER CHE
+1664;AL # CANADIAN SYLLABICS CARRIER CHEE
+1665;AL # CANADIAN SYLLABICS CARRIER CHI
+1666;AL # CANADIAN SYLLABICS CARRIER CHA
+1667;AL # CANADIAN SYLLABICS CARRIER TTSU
+1668;AL # CANADIAN SYLLABICS CARRIER TTSO
+1669;AL # CANADIAN SYLLABICS CARRIER TTSE
+166A;AL # CANADIAN SYLLABICS CARRIER TTSEE
+166B;AL # CANADIAN SYLLABICS CARRIER TTSI
+166C;AL # CANADIAN SYLLABICS CARRIER TTSA
+166D;AL # CANADIAN SYLLABICS CHI SIGN
+166E;AL # CANADIAN SYLLABICS FULL STOP
+166F;AL # CANADIAN SYLLABICS QAI
+1670;AL # CANADIAN SYLLABICS NGAI
+1671;AL # CANADIAN SYLLABICS NNGI
+1672;AL # CANADIAN SYLLABICS NNGII
+1673;AL # CANADIAN SYLLABICS NNGO
+1674;AL # CANADIAN SYLLABICS NNGOO
+1675;AL # CANADIAN SYLLABICS NNGA
+1676;AL # CANADIAN SYLLABICS NNGAA
+1680;BA # OGHAM SPACE MARK
+1681;AL # OGHAM LETTER BEITH
+1682;AL # OGHAM LETTER LUIS
+1683;AL # OGHAM LETTER FEARN
+1684;AL # OGHAM LETTER SAIL
+1685;AL # OGHAM LETTER NION
+1686;AL # OGHAM LETTER UATH
+1687;AL # OGHAM LETTER DAIR
+1688;AL # OGHAM LETTER TINNE
+1689;AL # OGHAM LETTER COLL
+168A;AL # OGHAM LETTER CEIRT
+168B;AL # OGHAM LETTER MUIN
+168C;AL # OGHAM LETTER GORT
+168D;AL # OGHAM LETTER NGEADAL
+168E;AL # OGHAM LETTER STRAIF
+168F;AL # OGHAM LETTER RUIS
+1690;AL # OGHAM LETTER AILM
+1691;AL # OGHAM LETTER ONN
+1692;AL # OGHAM LETTER UR
+1693;AL # OGHAM LETTER EADHADH
+1694;AL # OGHAM LETTER IODHADH
+1695;AL # OGHAM LETTER EABHADH
+1696;AL # OGHAM LETTER OR
+1697;AL # OGHAM LETTER UILLEANN
+1698;AL # OGHAM LETTER IFIN
+1699;AL # OGHAM LETTER EAMHANCHOLL
+169A;AL # OGHAM LETTER PEITH
+169B;OP # OGHAM FEATHER MARK
+169C;CL # OGHAM REVERSED FEATHER MARK
+16A0;AL # RUNIC LETTER FEHU FEOH FE F
+16A1;AL # RUNIC LETTER V
+16A2;AL # RUNIC LETTER URUZ UR U
+16A3;AL # RUNIC LETTER YR
+16A4;AL # RUNIC LETTER Y
+16A5;AL # RUNIC LETTER W
+16A6;AL # RUNIC LETTER THURISAZ THURS THORN
+16A7;AL # RUNIC LETTER ETH
+16A8;AL # RUNIC LETTER ANSUZ A
+16A9;AL # RUNIC LETTER OS O
+16AA;AL # RUNIC LETTER AC A
+16AB;AL # RUNIC LETTER AESC
+16AC;AL # RUNIC LETTER LONG-BRANCH-OSS O
+16AD;AL # RUNIC LETTER SHORT-TWIG-OSS O
+16AE;AL # RUNIC LETTER O
+16AF;AL # RUNIC LETTER OE
+16B0;AL # RUNIC LETTER ON
+16B1;AL # RUNIC LETTER RAIDO RAD REID R
+16B2;AL # RUNIC LETTER KAUNA
+16B3;AL # RUNIC LETTER CEN
+16B4;AL # RUNIC LETTER KAUN K
+16B5;AL # RUNIC LETTER G
+16B6;AL # RUNIC LETTER ENG
+16B7;AL # RUNIC LETTER GEBO GYFU G
+16B8;AL # RUNIC LETTER GAR
+16B9;AL # RUNIC LETTER WUNJO WYNN W
+16BA;AL # RUNIC LETTER HAGLAZ H
+16BB;AL # RUNIC LETTER HAEGL H
+16BC;AL # RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD;AL # RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE;AL # RUNIC LETTER NAUDIZ NYD NAUD N
+16BF;AL # RUNIC LETTER SHORT-TWIG-NAUD N
+16C0;AL # RUNIC LETTER DOTTED-N
+16C1;AL # RUNIC LETTER ISAZ IS ISS I
+16C2;AL # RUNIC LETTER E
+16C3;AL # RUNIC LETTER JERAN J
+16C4;AL # RUNIC LETTER GER
+16C5;AL # RUNIC LETTER LONG-BRANCH-AR AE
+16C6;AL # RUNIC LETTER SHORT-TWIG-AR A
+16C7;AL # RUNIC LETTER IWAZ EOH
+16C8;AL # RUNIC LETTER PERTHO PEORTH P
+16C9;AL # RUNIC LETTER ALGIZ EOLHX
+16CA;AL # RUNIC LETTER SOWILO S
+16CB;AL # RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC;AL # RUNIC LETTER SHORT-TWIG-SOL S
+16CD;AL # RUNIC LETTER C
+16CE;AL # RUNIC LETTER Z
+16CF;AL # RUNIC LETTER TIWAZ TIR TYR T
+16D0;AL # RUNIC LETTER SHORT-TWIG-TYR T
+16D1;AL # RUNIC LETTER D
+16D2;AL # RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3;AL # RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4;AL # RUNIC LETTER DOTTED-P
+16D5;AL # RUNIC LETTER OPEN-P
+16D6;AL # RUNIC LETTER EHWAZ EH E
+16D7;AL # RUNIC LETTER MANNAZ MAN M
+16D8;AL # RUNIC LETTER LONG-BRANCH-MADR M
+16D9;AL # RUNIC LETTER SHORT-TWIG-MADR M
+16DA;AL # RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB;AL # RUNIC LETTER DOTTED-L
+16DC;AL # RUNIC LETTER INGWAZ
+16DD;AL # RUNIC LETTER ING
+16DE;AL # RUNIC LETTER DAGAZ DAEG D
+16DF;AL # RUNIC LETTER OTHALAN ETHEL O
+16E0;AL # RUNIC LETTER EAR
+16E1;AL # RUNIC LETTER IOR
+16E2;AL # RUNIC LETTER CWEORTH
+16E3;AL # RUNIC LETTER CALC
+16E4;AL # RUNIC LETTER CEALC
+16E5;AL # RUNIC LETTER STAN
+16E6;AL # RUNIC LETTER LONG-BRANCH-YR
+16E7;AL # RUNIC LETTER SHORT-TWIG-YR
+16E8;AL # RUNIC LETTER ICELANDIC-YR
+16E9;AL # RUNIC LETTER Q
+16EA;AL # RUNIC LETTER X
+16EB;BA # RUNIC SINGLE PUNCTUATION
+16EC;BA # RUNIC MULTIPLE PUNCTUATION
+16ED;BA # RUNIC CROSS PUNCTUATION
+16EE;AL # RUNIC ARLAUG SYMBOL
+16EF;AL # RUNIC TVIMADUR SYMBOL
+16F0;AL # RUNIC BELGTHOR SYMBOL
+1700;AL # TAGALOG LETTER A
+1701;AL # TAGALOG LETTER I
+1702;AL # TAGALOG LETTER U
+1703;AL # TAGALOG LETTER KA
+1704;AL # TAGALOG LETTER GA
+1705;AL # TAGALOG LETTER NGA
+1706;AL # TAGALOG LETTER TA
+1707;AL # TAGALOG LETTER DA
+1708;AL # TAGALOG LETTER NA
+1709;AL # TAGALOG LETTER PA
+170A;AL # TAGALOG LETTER BA
+170B;AL # TAGALOG LETTER MA
+170C;AL # TAGALOG LETTER YA
+170E;AL # TAGALOG LETTER LA
+170F;AL # TAGALOG LETTER WA
+1710;AL # TAGALOG LETTER SA
+1711;AL # TAGALOG LETTER HA
+1712;CM # TAGALOG VOWEL SIGN I
+1713;CM # TAGALOG VOWEL SIGN U
+1714;CM # TAGALOG SIGN VIRAMA
+1720;AL # HANUNOO LETTER A
+1721;AL # HANUNOO LETTER I
+1722;AL # HANUNOO LETTER U
+1723;AL # HANUNOO LETTER KA
+1724;AL # HANUNOO LETTER GA
+1725;AL # HANUNOO LETTER NGA
+1726;AL # HANUNOO LETTER TA
+1727;AL # HANUNOO LETTER DA
+1728;AL # HANUNOO LETTER NA
+1729;AL # HANUNOO LETTER PA
+172A;AL # HANUNOO LETTER BA
+172B;AL # HANUNOO LETTER MA
+172C;AL # HANUNOO LETTER YA
+172D;AL # HANUNOO LETTER RA
+172E;AL # HANUNOO LETTER LA
+172F;AL # HANUNOO LETTER WA
+1730;AL # HANUNOO LETTER SA
+1731;AL # HANUNOO LETTER HA
+1732;CM # HANUNOO VOWEL SIGN I
+1733;CM # HANUNOO VOWEL SIGN U
+1734;CM # HANUNOO SIGN PAMUDPOD
+1735;AL # PHILIPPINE SINGLE PUNCTUATION
+1736;AL # PHILIPPINE DOUBLE PUNCTUATION
+1740;AL # BUHID LETTER A
+1741;AL # BUHID LETTER I
+1742;AL # BUHID LETTER U
+1743;AL # BUHID LETTER KA
+1744;AL # BUHID LETTER GA
+1745;AL # BUHID LETTER NGA
+1746;AL # BUHID LETTER TA
+1747;AL # BUHID LETTER DA
+1748;AL # BUHID LETTER NA
+1749;AL # BUHID LETTER PA
+174A;AL # BUHID LETTER BA
+174B;AL # BUHID LETTER MA
+174C;AL # BUHID LETTER YA
+174D;AL # BUHID LETTER RA
+174E;AL # BUHID LETTER LA
+174F;AL # BUHID LETTER WA
+1750;AL # BUHID LETTER SA
+1751;AL # BUHID LETTER HA
+1752;CM # BUHID VOWEL SIGN I
+1753;CM # BUHID VOWEL SIGN U
+1760;AL # TAGBANWA LETTER A
+1761;AL # TAGBANWA LETTER I
+1762;AL # TAGBANWA LETTER U
+1763;AL # TAGBANWA LETTER KA
+1764;AL # TAGBANWA LETTER GA
+1765;AL # TAGBANWA LETTER NGA
+1766;AL # TAGBANWA LETTER TA
+1767;AL # TAGBANWA LETTER DA
+1768;AL # TAGBANWA LETTER NA
+1769;AL # TAGBANWA LETTER PA
+176A;AL # TAGBANWA LETTER BA
+176B;AL # TAGBANWA LETTER MA
+176C;AL # TAGBANWA LETTER YA
+176E;AL # TAGBANWA LETTER LA
+176F;AL # TAGBANWA LETTER WA
+1770;AL # TAGBANWA LETTER SA
+1772;CM # TAGBANWA VOWEL SIGN I
+1773;CM # TAGBANWA VOWEL SIGN U
+1780;SA # KHMER LETTER KA
+1781;SA # KHMER LETTER KHA
+1782;SA # KHMER LETTER KO
+1783;SA # KHMER LETTER KHO
+1784;SA # KHMER LETTER NGO
+1785;SA # KHMER LETTER CA
+1786;SA # KHMER LETTER CHA
+1787;SA # KHMER LETTER CO
+1788;SA # KHMER LETTER CHO
+1789;SA # KHMER LETTER NYO
+178A;SA # KHMER LETTER DA
+178B;SA # KHMER LETTER TTHA
+178C;SA # KHMER LETTER DO
+178D;SA # KHMER LETTER TTHO
+178E;SA # KHMER LETTER NNO
+178F;SA # KHMER LETTER TA
+1790;SA # KHMER LETTER THA
+1791;SA # KHMER LETTER TO
+1792;SA # KHMER LETTER THO
+1793;SA # KHMER LETTER NO
+1794;SA # KHMER LETTER BA
+1795;SA # KHMER LETTER PHA
+1796;SA # KHMER LETTER PO
+1797;SA # KHMER LETTER PHO
+1798;SA # KHMER LETTER MO
+1799;SA # KHMER LETTER YO
+179A;SA # KHMER LETTER RO
+179B;SA # KHMER LETTER LO
+179C;SA # KHMER LETTER VO
+179D;SA # KHMER LETTER SHA
+179E;SA # KHMER LETTER SSO
+179F;SA # KHMER LETTER SA
+17A0;SA # KHMER LETTER HA
+17A1;SA # KHMER LETTER LA
+17A2;SA # KHMER LETTER QA
+17A3;SA # KHMER INDEPENDENT VOWEL QAQ
+17A4;SA # KHMER INDEPENDENT VOWEL QAA
+17A5;SA # KHMER INDEPENDENT VOWEL QI
+17A6;SA # KHMER INDEPENDENT VOWEL QII
+17A7;SA # KHMER INDEPENDENT VOWEL QU
+17A8;SA # KHMER INDEPENDENT VOWEL QUK
+17A9;SA # KHMER INDEPENDENT VOWEL QUU
+17AA;SA # KHMER INDEPENDENT VOWEL QUUV
+17AB;SA # KHMER INDEPENDENT VOWEL RY
+17AC;SA # KHMER INDEPENDENT VOWEL RYY
+17AD;SA # KHMER INDEPENDENT VOWEL LY
+17AE;SA # KHMER INDEPENDENT VOWEL LYY
+17AF;SA # KHMER INDEPENDENT VOWEL QE
+17B0;SA # KHMER INDEPENDENT VOWEL QAI
+17B1;SA # KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2;SA # KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3;SA # KHMER INDEPENDENT VOWEL QAU
+17B4;SA # KHMER VOWEL INHERENT AQ
+17B5;SA # KHMER VOWEL INHERENT AA
+17B6;CM # KHMER VOWEL SIGN AA
+17B7;CM # KHMER VOWEL SIGN I
+17B8;CM # KHMER VOWEL SIGN II
+17B9;CM # KHMER VOWEL SIGN Y
+17BA;CM # KHMER VOWEL SIGN YY
+17BB;CM # KHMER VOWEL SIGN U
+17BC;CM # KHMER VOWEL SIGN UU
+17BD;CM # KHMER VOWEL SIGN UA
+17BE;CM # KHMER VOWEL SIGN OE
+17BF;CM # KHMER VOWEL SIGN YA
+17C0;CM # KHMER VOWEL SIGN IE
+17C1;CM # KHMER VOWEL SIGN E
+17C2;CM # KHMER VOWEL SIGN AE
+17C3;CM # KHMER VOWEL SIGN AI
+17C4;CM # KHMER VOWEL SIGN OO
+17C5;CM # KHMER VOWEL SIGN AU
+17C6;CM # KHMER SIGN NIKAHIT
+17C7;CM # KHMER SIGN REAHMUK
+17C8;CM # KHMER SIGN YUUKALEAPINTU
+17C9;CM # KHMER SIGN MUUSIKATOAN
+17CA;CM # KHMER SIGN TRIISAP
+17CB;CM # KHMER SIGN BANTOC
+17CC;CM # KHMER SIGN ROBAT
+17CD;CM # KHMER SIGN TOANDAKHIAT
+17CE;CM # KHMER SIGN KAKABAT
+17CF;CM # KHMER SIGN AHSDA
+17D0;CM # KHMER SIGN SAMYOK SANNYA
+17D1;CM # KHMER SIGN VIRIAM
+17D2;CM # KHMER SIGN COENG
+17D3;CM # KHMER SIGN BATHAMASAT
+17D4;BA # KHMER SIGN KHAN
+17D5;BA # KHMER SIGN BARIYOOSAN
+17D6;NS # KHMER SIGN CAMNUC PII KUUH
+17D7;NS # KHMER SIGN LEK TOO
+17D8;BA # KHMER SIGN BEYYAL
+17D9;NS # KHMER SIGN PHNAEK MUAN
+17DA;BA # KHMER SIGN KOOMUUT
+17DB;PR # KHMER CURRENCY SYMBOL RIEL
+17DC;AL # KHMER SIGN AVAKRAHASANYA
+17DD;CM # KHMER SIGN ATTHACAN
+17E0;NU # KHMER DIGIT ZERO
+17E1;NU # KHMER DIGIT ONE
+17E2;NU # KHMER DIGIT TWO
+17E3;NU # KHMER DIGIT THREE
+17E4;NU # KHMER DIGIT FOUR
+17E5;NU # KHMER DIGIT FIVE
+17E6;NU # KHMER DIGIT SIX
+17E7;NU # KHMER DIGIT SEVEN
+17E8;NU # KHMER DIGIT EIGHT
+17E9;NU # KHMER DIGIT NINE
+17F0;AL # KHMER SYMBOL LEK ATTAK SON
+17F1;AL # KHMER SYMBOL LEK ATTAK MUOY
+17F2;AL # KHMER SYMBOL LEK ATTAK PII
+17F3;AL # KHMER SYMBOL LEK ATTAK BEI
+17F4;AL # KHMER SYMBOL LEK ATTAK BUON
+17F5;AL # KHMER SYMBOL LEK ATTAK PRAM
+17F6;AL # KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7;AL # KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8;AL # KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9;AL # KHMER SYMBOL LEK ATTAK PRAM-BUON
+1800;AL # MONGOLIAN BIRGA
+1801;AL # MONGOLIAN ELLIPSIS
+1802;BA # MONGOLIAN COMMA
+1803;BA # MONGOLIAN FULL STOP
+1804;BA # MONGOLIAN COLON
+1805;BA # MONGOLIAN FOUR DOTS
+1806;BB # MONGOLIAN TODO SOFT HYPHEN
+1807;AL # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808;BA # MONGOLIAN MANCHU COMMA
+1809;BA # MONGOLIAN MANCHU FULL STOP
+180A;AL # MONGOLIAN NIRUGU
+180B;CM # MONGOLIAN FREE VARIATION SELECTOR ONE
+180C;CM # MONGOLIAN FREE VARIATION SELECTOR TWO
+180D;CM # MONGOLIAN FREE VARIATION SELECTOR THREE
+180E;GL # MONGOLIAN VOWEL SEPARATOR
+1810;NU # MONGOLIAN DIGIT ZERO
+1811;NU # MONGOLIAN DIGIT ONE
+1812;NU # MONGOLIAN DIGIT TWO
+1813;NU # MONGOLIAN DIGIT THREE
+1814;NU # MONGOLIAN DIGIT FOUR
+1815;NU # MONGOLIAN DIGIT FIVE
+1816;NU # MONGOLIAN DIGIT SIX
+1817;NU # MONGOLIAN DIGIT SEVEN
+1818;NU # MONGOLIAN DIGIT EIGHT
+1819;NU # MONGOLIAN DIGIT NINE
+1820;AL # MONGOLIAN LETTER A
+1821;AL # MONGOLIAN LETTER E
+1822;AL # MONGOLIAN LETTER I
+1823;AL # MONGOLIAN LETTER O
+1824;AL # MONGOLIAN LETTER U
+1825;AL # MONGOLIAN LETTER OE
+1826;AL # MONGOLIAN LETTER UE
+1827;AL # MONGOLIAN LETTER EE
+1828;AL # MONGOLIAN LETTER NA
+1829;AL # MONGOLIAN LETTER ANG
+182A;AL # MONGOLIAN LETTER BA
+182B;AL # MONGOLIAN LETTER PA
+182C;AL # MONGOLIAN LETTER QA
+182D;AL # MONGOLIAN LETTER GA
+182E;AL # MONGOLIAN LETTER MA
+182F;AL # MONGOLIAN LETTER LA
+1830;AL # MONGOLIAN LETTER SA
+1831;AL # MONGOLIAN LETTER SHA
+1832;AL # MONGOLIAN LETTER TA
+1833;AL # MONGOLIAN LETTER DA
+1834;AL # MONGOLIAN LETTER CHA
+1835;AL # MONGOLIAN LETTER JA
+1836;AL # MONGOLIAN LETTER YA
+1837;AL # MONGOLIAN LETTER RA
+1838;AL # MONGOLIAN LETTER WA
+1839;AL # MONGOLIAN LETTER FA
+183A;AL # MONGOLIAN LETTER KA
+183B;AL # MONGOLIAN LETTER KHA
+183C;AL # MONGOLIAN LETTER TSA
+183D;AL # MONGOLIAN LETTER ZA
+183E;AL # MONGOLIAN LETTER HAA
+183F;AL # MONGOLIAN LETTER ZRA
+1840;AL # MONGOLIAN LETTER LHA
+1841;AL # MONGOLIAN LETTER ZHI
+1842;AL # MONGOLIAN LETTER CHI
+1843;AL # MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844;AL # MONGOLIAN LETTER TODO E
+1845;AL # MONGOLIAN LETTER TODO I
+1846;AL # MONGOLIAN LETTER TODO O
+1847;AL # MONGOLIAN LETTER TODO U
+1848;AL # MONGOLIAN LETTER TODO OE
+1849;AL # MONGOLIAN LETTER TODO UE
+184A;AL # MONGOLIAN LETTER TODO ANG
+184B;AL # MONGOLIAN LETTER TODO BA
+184C;AL # MONGOLIAN LETTER TODO PA
+184D;AL # MONGOLIAN LETTER TODO QA
+184E;AL # MONGOLIAN LETTER TODO GA
+184F;AL # MONGOLIAN LETTER TODO MA
+1850;AL # MONGOLIAN LETTER TODO TA
+1851;AL # MONGOLIAN LETTER TODO DA
+1852;AL # MONGOLIAN LETTER TODO CHA
+1853;AL # MONGOLIAN LETTER TODO JA
+1854;AL # MONGOLIAN LETTER TODO TSA
+1855;AL # MONGOLIAN LETTER TODO YA
+1856;AL # MONGOLIAN LETTER TODO WA
+1857;AL # MONGOLIAN LETTER TODO KA
+1858;AL # MONGOLIAN LETTER TODO GAA
+1859;AL # MONGOLIAN LETTER TODO HAA
+185A;AL # MONGOLIAN LETTER TODO JIA
+185B;AL # MONGOLIAN LETTER TODO NIA
+185C;AL # MONGOLIAN LETTER TODO DZA
+185D;AL # MONGOLIAN LETTER SIBE E
+185E;AL # MONGOLIAN LETTER SIBE I
+185F;AL # MONGOLIAN LETTER SIBE IY
+1860;AL # MONGOLIAN LETTER SIBE UE
+1861;AL # MONGOLIAN LETTER SIBE U
+1862;AL # MONGOLIAN LETTER SIBE ANG
+1863;AL # MONGOLIAN LETTER SIBE KA
+1864;AL # MONGOLIAN LETTER SIBE GA
+1865;AL # MONGOLIAN LETTER SIBE HA
+1866;AL # MONGOLIAN LETTER SIBE PA
+1867;AL # MONGOLIAN LETTER SIBE SHA
+1868;AL # MONGOLIAN LETTER SIBE TA
+1869;AL # MONGOLIAN LETTER SIBE DA
+186A;AL # MONGOLIAN LETTER SIBE JA
+186B;AL # MONGOLIAN LETTER SIBE FA
+186C;AL # MONGOLIAN LETTER SIBE GAA
+186D;AL # MONGOLIAN LETTER SIBE HAA
+186E;AL # MONGOLIAN LETTER SIBE TSA
+186F;AL # MONGOLIAN LETTER SIBE ZA
+1870;AL # MONGOLIAN LETTER SIBE RAA
+1871;AL # MONGOLIAN LETTER SIBE CHA
+1872;AL # MONGOLIAN LETTER SIBE ZHA
+1873;AL # MONGOLIAN LETTER MANCHU I
+1874;AL # MONGOLIAN LETTER MANCHU KA
+1875;AL # MONGOLIAN LETTER MANCHU RA
+1876;AL # MONGOLIAN LETTER MANCHU FA
+1877;AL # MONGOLIAN LETTER MANCHU ZHA
+1880;AL # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881;AL # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882;AL # MONGOLIAN LETTER ALI GALI DAMARU
+1883;AL # MONGOLIAN LETTER ALI GALI UBADAMA
+1884;AL # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885;AL # MONGOLIAN LETTER ALI GALI BALUDA
+1886;AL # MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887;AL # MONGOLIAN LETTER ALI GALI A
+1888;AL # MONGOLIAN LETTER ALI GALI I
+1889;AL # MONGOLIAN LETTER ALI GALI KA
+188A;AL # MONGOLIAN LETTER ALI GALI NGA
+188B;AL # MONGOLIAN LETTER ALI GALI CA
+188C;AL # MONGOLIAN LETTER ALI GALI TTA
+188D;AL # MONGOLIAN LETTER ALI GALI TTHA
+188E;AL # MONGOLIAN LETTER ALI GALI DDA
+188F;AL # MONGOLIAN LETTER ALI GALI NNA
+1890;AL # MONGOLIAN LETTER ALI GALI TA
+1891;AL # MONGOLIAN LETTER ALI GALI DA
+1892;AL # MONGOLIAN LETTER ALI GALI PA
+1893;AL # MONGOLIAN LETTER ALI GALI PHA
+1894;AL # MONGOLIAN LETTER ALI GALI SSA
+1895;AL # MONGOLIAN LETTER ALI GALI ZHA
+1896;AL # MONGOLIAN LETTER ALI GALI ZA
+1897;AL # MONGOLIAN LETTER ALI GALI AH
+1898;AL # MONGOLIAN LETTER TODO ALI GALI TA
+1899;AL # MONGOLIAN LETTER TODO ALI GALI ZHA
+189A;AL # MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B;AL # MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C;AL # MONGOLIAN LETTER MANCHU ALI GALI CA
+189D;AL # MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E;AL # MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F;AL # MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0;AL # MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1;AL # MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2;AL # MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3;AL # MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4;AL # MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5;AL # MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6;AL # MONGOLIAN LETTER ALI GALI HALF U
+18A7;AL # MONGOLIAN LETTER ALI GALI HALF YA
+18A8;AL # MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9;CM # MONGOLIAN LETTER ALI GALI DAGALGA
+1900;AL # LIMBU VOWEL-CARRIER LETTER
+1901;AL # LIMBU LETTER KA
+1902;AL # LIMBU LETTER KHA
+1903;AL # LIMBU LETTER GA
+1904;AL # LIMBU LETTER GHA
+1905;AL # LIMBU LETTER NGA
+1906;AL # LIMBU LETTER CA
+1907;AL # LIMBU LETTER CHA
+1908;AL # LIMBU LETTER JA
+1909;AL # LIMBU LETTER JHA
+190A;AL # LIMBU LETTER YAN
+190B;AL # LIMBU LETTER TA
+190C;AL # LIMBU LETTER THA
+190D;AL # LIMBU LETTER DA
+190E;AL # LIMBU LETTER DHA
+190F;AL # LIMBU LETTER NA
+1910;AL # LIMBU LETTER PA
+1911;AL # LIMBU LETTER PHA
+1912;AL # LIMBU LETTER BA
+1913;AL # LIMBU LETTER BHA
+1914;AL # LIMBU LETTER MA
+1915;AL # LIMBU LETTER YA
+1916;AL # LIMBU LETTER RA
+1917;AL # LIMBU LETTER LA
+1918;AL # LIMBU LETTER WA
+1919;AL # LIMBU LETTER SHA
+191A;AL # LIMBU LETTER SSA
+191B;AL # LIMBU LETTER SA
+191C;AL # LIMBU LETTER HA
+1920;CM # LIMBU VOWEL SIGN A
+1921;CM # LIMBU VOWEL SIGN I
+1922;CM # LIMBU VOWEL SIGN U
+1923;CM # LIMBU VOWEL SIGN EE
+1924;CM # LIMBU VOWEL SIGN AI
+1925;CM # LIMBU VOWEL SIGN OO
+1926;CM # LIMBU VOWEL SIGN AU
+1927;CM # LIMBU VOWEL SIGN E
+1928;CM # LIMBU VOWEL SIGN O
+1929;CM # LIMBU SUBJOINED LETTER YA
+192A;CM # LIMBU SUBJOINED LETTER RA
+192B;CM # LIMBU SUBJOINED LETTER WA
+1930;CM # LIMBU SMALL LETTER KA
+1931;CM # LIMBU SMALL LETTER NGA
+1932;CM # LIMBU SMALL LETTER ANUSVARA
+1933;CM # LIMBU SMALL LETTER TA
+1934;CM # LIMBU SMALL LETTER NA
+1935;CM # LIMBU SMALL LETTER PA
+1936;CM # LIMBU SMALL LETTER MA
+1937;CM # LIMBU SMALL LETTER RA
+1938;CM # LIMBU SMALL LETTER LA
+1939;CM # LIMBU SIGN MUKPHRENG
+193A;CM # LIMBU SIGN KEMPHRENG
+193B;CM # LIMBU SIGN SA-I
+1940;AL # LIMBU SIGN LOO
+1944;EX # LIMBU EXCLAMATION MARK
+1945;EX # LIMBU QUESTION MARK
+1946;NU # LIMBU DIGIT ZERO
+1947;NU # LIMBU DIGIT ONE
+1948;NU # LIMBU DIGIT TWO
+1949;NU # LIMBU DIGIT THREE
+194A;NU # LIMBU DIGIT FOUR
+194B;NU # LIMBU DIGIT FIVE
+194C;NU # LIMBU DIGIT SIX
+194D;NU # LIMBU DIGIT SEVEN
+194E;NU # LIMBU DIGIT EIGHT
+194F;NU # LIMBU DIGIT NINE
+1950;AL # TAI LE LETTER KA
+1951;AL # TAI LE LETTER XA
+1952;AL # TAI LE LETTER NGA
+1953;AL # TAI LE LETTER TSA
+1954;AL # TAI LE LETTER SA
+1955;AL # TAI LE LETTER YA
+1956;AL # TAI LE LETTER TA
+1957;AL # TAI LE LETTER THA
+1958;AL # TAI LE LETTER LA
+1959;AL # TAI LE LETTER PA
+195A;AL # TAI LE LETTER PHA
+195B;AL # TAI LE LETTER MA
+195C;AL # TAI LE LETTER FA
+195D;AL # TAI LE LETTER VA
+195E;AL # TAI LE LETTER HA
+195F;AL # TAI LE LETTER QA
+1960;AL # TAI LE LETTER KHA
+1961;AL # TAI LE LETTER TSHA
+1962;AL # TAI LE LETTER NA
+1963;AL # TAI LE LETTER A
+1964;AL # TAI LE LETTER I
+1965;AL # TAI LE LETTER EE
+1966;AL # TAI LE LETTER EH
+1967;AL # TAI LE LETTER U
+1968;AL # TAI LE LETTER OO
+1969;AL # TAI LE LETTER O
+196A;AL # TAI LE LETTER UE
+196B;AL # TAI LE LETTER E
+196C;AL # TAI LE LETTER AUE
+196D;AL # TAI LE LETTER AI
+1970;AL # TAI LE LETTER TONE-2
+1971;AL # TAI LE LETTER TONE-3
+1972;AL # TAI LE LETTER TONE-4
+1973;AL # TAI LE LETTER TONE-5
+1974;AL # TAI LE LETTER TONE-6
+1980;AL # NEW TAI LUE LETTER HIGH QA
+1981;AL # NEW TAI LUE LETTER LOW QA
+1982;AL # NEW TAI LUE LETTER HIGH KA
+1983;AL # NEW TAI LUE LETTER HIGH XA
+1984;AL # NEW TAI LUE LETTER HIGH NGA
+1985;AL # NEW TAI LUE LETTER LOW KA
+1986;AL # NEW TAI LUE LETTER LOW XA
+1987;AL # NEW TAI LUE LETTER LOW NGA
+1988;AL # NEW TAI LUE LETTER HIGH TSA
+1989;AL # NEW TAI LUE LETTER HIGH SA
+198A;AL # NEW TAI LUE LETTER HIGH YA
+198B;AL # NEW TAI LUE LETTER LOW TSA
+198C;AL # NEW TAI LUE LETTER LOW SA
+198D;AL # NEW TAI LUE LETTER LOW YA
+198E;AL # NEW TAI LUE LETTER HIGH TA
+198F;AL # NEW TAI LUE LETTER HIGH THA
+1990;AL # NEW TAI LUE LETTER HIGH NA
+1991;AL # NEW TAI LUE LETTER LOW TA
+1992;AL # NEW TAI LUE LETTER LOW THA
+1993;AL # NEW TAI LUE LETTER LOW NA
+1994;AL # NEW TAI LUE LETTER HIGH PA
+1995;AL # NEW TAI LUE LETTER HIGH PHA
+1996;AL # NEW TAI LUE LETTER HIGH MA
+1997;AL # NEW TAI LUE LETTER LOW PA
+1998;AL # NEW TAI LUE LETTER LOW PHA
+1999;AL # NEW TAI LUE LETTER LOW MA
+199A;AL # NEW TAI LUE LETTER HIGH FA
+199B;AL # NEW TAI LUE LETTER HIGH VA
+199C;AL # NEW TAI LUE LETTER HIGH LA
+199D;AL # NEW TAI LUE LETTER LOW FA
+199E;AL # NEW TAI LUE LETTER LOW VA
+199F;AL # NEW TAI LUE LETTER LOW LA
+19A0;AL # NEW TAI LUE LETTER HIGH HA
+19A1;AL # NEW TAI LUE LETTER HIGH DA
+19A2;AL # NEW TAI LUE LETTER HIGH BA
+19A3;AL # NEW TAI LUE LETTER LOW HA
+19A4;AL # NEW TAI LUE LETTER LOW DA
+19A5;AL # NEW TAI LUE LETTER LOW BA
+19A6;AL # NEW TAI LUE LETTER HIGH KVA
+19A7;AL # NEW TAI LUE LETTER HIGH XVA
+19A8;AL # NEW TAI LUE LETTER LOW KVA
+19A9;AL # NEW TAI LUE LETTER LOW XVA
+19B0;CM # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1;CM # NEW TAI LUE VOWEL SIGN AA
+19B2;CM # NEW TAI LUE VOWEL SIGN II
+19B3;CM # NEW TAI LUE VOWEL SIGN U
+19B4;CM # NEW TAI LUE VOWEL SIGN UU
+19B5;CM # NEW TAI LUE VOWEL SIGN E
+19B6;CM # NEW TAI LUE VOWEL SIGN AE
+19B7;CM # NEW TAI LUE VOWEL SIGN O
+19B8;CM # NEW TAI LUE VOWEL SIGN OA
+19B9;CM # NEW TAI LUE VOWEL SIGN UE
+19BA;CM # NEW TAI LUE VOWEL SIGN AY
+19BB;CM # NEW TAI LUE VOWEL SIGN AAY
+19BC;CM # NEW TAI LUE VOWEL SIGN UY
+19BD;CM # NEW TAI LUE VOWEL SIGN OY
+19BE;CM # NEW TAI LUE VOWEL SIGN OAY
+19BF;CM # NEW TAI LUE VOWEL SIGN UEY
+19C0;CM # NEW TAI LUE VOWEL SIGN IY
+19C1;AL # NEW TAI LUE LETTER FINAL V
+19C2;AL # NEW TAI LUE LETTER FINAL NG
+19C3;AL # NEW TAI LUE LETTER FINAL N
+19C4;AL # NEW TAI LUE LETTER FINAL M
+19C5;AL # NEW TAI LUE LETTER FINAL K
+19C6;AL # NEW TAI LUE LETTER FINAL D
+19C7;AL # NEW TAI LUE LETTER FINAL B
+19C8;CM # NEW TAI LUE TONE MARK-1
+19C9;CM # NEW TAI LUE TONE MARK-2
+19D0;NU # NEW TAI LUE DIGIT ZERO
+19D1;NU # NEW TAI LUE DIGIT ONE
+19D2;NU # NEW TAI LUE DIGIT TWO
+19D3;NU # NEW TAI LUE DIGIT THREE
+19D4;NU # NEW TAI LUE DIGIT FOUR
+19D5;NU # NEW TAI LUE DIGIT FIVE
+19D6;NU # NEW TAI LUE DIGIT SIX
+19D7;NU # NEW TAI LUE DIGIT SEVEN
+19D8;NU # NEW TAI LUE DIGIT EIGHT
+19D9;NU # NEW TAI LUE DIGIT NINE
+19DE;AL # NEW TAI LUE SIGN LAE
+19DF;AL # NEW TAI LUE SIGN LAEV
+19E0;AL # KHMER SYMBOL PATHAMASAT
+19E1;AL # KHMER SYMBOL MUOY KOET
+19E2;AL # KHMER SYMBOL PII KOET
+19E3;AL # KHMER SYMBOL BEI KOET
+19E4;AL # KHMER SYMBOL BUON KOET
+19E5;AL # KHMER SYMBOL PRAM KOET
+19E6;AL # KHMER SYMBOL PRAM-MUOY KOET
+19E7;AL # KHMER SYMBOL PRAM-PII KOET
+19E8;AL # KHMER SYMBOL PRAM-BEI KOET
+19E9;AL # KHMER SYMBOL PRAM-BUON KOET
+19EA;AL # KHMER SYMBOL DAP KOET
+19EB;AL # KHMER SYMBOL DAP-MUOY KOET
+19EC;AL # KHMER SYMBOL DAP-PII KOET
+19ED;AL # KHMER SYMBOL DAP-BEI KOET
+19EE;AL # KHMER SYMBOL DAP-BUON KOET
+19EF;AL # KHMER SYMBOL DAP-PRAM KOET
+19F0;AL # KHMER SYMBOL TUTEYASAT
+19F1;AL # KHMER SYMBOL MUOY ROC
+19F2;AL # KHMER SYMBOL PII ROC
+19F3;AL # KHMER SYMBOL BEI ROC
+19F4;AL # KHMER SYMBOL BUON ROC
+19F5;AL # KHMER SYMBOL PRAM ROC
+19F6;AL # KHMER SYMBOL PRAM-MUOY ROC
+19F7;AL # KHMER SYMBOL PRAM-PII ROC
+19F8;AL # KHMER SYMBOL PRAM-BEI ROC
+19F9;AL # KHMER SYMBOL PRAM-BUON ROC
+19FA;AL # KHMER SYMBOL DAP ROC
+19FB;AL # KHMER SYMBOL DAP-MUOY ROC
+19FC;AL # KHMER SYMBOL DAP-PII ROC
+19FD;AL # KHMER SYMBOL DAP-BEI ROC
+19FE;AL # KHMER SYMBOL DAP-BUON ROC
+19FF;AL # KHMER SYMBOL DAP-PRAM ROC
+1A00;AL # BUGINESE LETTER KA
+1A01;AL # BUGINESE LETTER GA
+1A02;AL # BUGINESE LETTER NGA
+1A03;AL # BUGINESE LETTER NGKA
+1A04;AL # BUGINESE LETTER PA
+1A05;AL # BUGINESE LETTER BA
+1A06;AL # BUGINESE LETTER MA
+1A07;AL # BUGINESE LETTER MPA
+1A08;AL # BUGINESE LETTER TA
+1A09;AL # BUGINESE LETTER DA
+1A0A;AL # BUGINESE LETTER NA
+1A0B;AL # BUGINESE LETTER NRA
+1A0C;AL # BUGINESE LETTER CA
+1A0D;AL # BUGINESE LETTER JA
+1A0E;AL # BUGINESE LETTER NYA
+1A0F;AL # BUGINESE LETTER NYCA
+1A10;AL # BUGINESE LETTER YA
+1A11;AL # BUGINESE LETTER RA
+1A12;AL # BUGINESE LETTER LA
+1A13;AL # BUGINESE LETTER VA
+1A14;AL # BUGINESE LETTER SA
+1A15;AL # BUGINESE LETTER A
+1A16;AL # BUGINESE LETTER HA
+1A17;CM # BUGINESE VOWEL SIGN I
+1A18;CM # BUGINESE VOWEL SIGN U
+1A19;CM # BUGINESE VOWEL SIGN E
+1A1A;CM # BUGINESE VOWEL SIGN O
+1A1B;CM # BUGINESE VOWEL SIGN AE
+1A1E;BA # BUGINESE PALLAWA
+1A1F;AL # BUGINESE END OF SECTION
+1D00;AL # LATIN LETTER SMALL CAPITAL A
+1D01;AL # LATIN LETTER SMALL CAPITAL AE
+1D02;AL # LATIN SMALL LETTER TURNED AE
+1D03;AL # LATIN LETTER SMALL CAPITAL BARRED B
+1D04;AL # LATIN LETTER SMALL CAPITAL C
+1D05;AL # LATIN LETTER SMALL CAPITAL D
+1D06;AL # LATIN LETTER SMALL CAPITAL ETH
+1D07;AL # LATIN LETTER SMALL CAPITAL E
+1D08;AL # LATIN SMALL LETTER TURNED OPEN E
+1D09;AL # LATIN SMALL LETTER TURNED I
+1D0A;AL # LATIN LETTER SMALL CAPITAL J
+1D0B;AL # LATIN LETTER SMALL CAPITAL K
+1D0C;AL # LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D;AL # LATIN LETTER SMALL CAPITAL M
+1D0E;AL # LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F;AL # LATIN LETTER SMALL CAPITAL O
+1D10;AL # LATIN LETTER SMALL CAPITAL OPEN O
+1D11;AL # LATIN SMALL LETTER SIDEWAYS O
+1D12;AL # LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13;AL # LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14;AL # LATIN SMALL LETTER TURNED OE
+1D15;AL # LATIN LETTER SMALL CAPITAL OU
+1D16;AL # LATIN SMALL LETTER TOP HALF O
+1D17;AL # LATIN SMALL LETTER BOTTOM HALF O
+1D18;AL # LATIN LETTER SMALL CAPITAL P
+1D19;AL # LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A;AL # LATIN LETTER SMALL CAPITAL TURNED R
+1D1B;AL # LATIN LETTER SMALL CAPITAL T
+1D1C;AL # LATIN LETTER SMALL CAPITAL U
+1D1D;AL # LATIN SMALL LETTER SIDEWAYS U
+1D1E;AL # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D1F;AL # LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20;AL # LATIN LETTER SMALL CAPITAL V
+1D21;AL # LATIN LETTER SMALL CAPITAL W
+1D22;AL # LATIN LETTER SMALL CAPITAL Z
+1D23;AL # LATIN LETTER SMALL CAPITAL EZH
+1D24;AL # LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25;AL # LATIN LETTER AIN
+1D26;AL # GREEK LETTER SMALL CAPITAL GAMMA
+1D27;AL # GREEK LETTER SMALL CAPITAL LAMDA
+1D28;AL # GREEK LETTER SMALL CAPITAL PI
+1D29;AL # GREEK LETTER SMALL CAPITAL RHO
+1D2A;AL # GREEK LETTER SMALL CAPITAL PSI
+1D2B;AL # CYRILLIC LETTER SMALL CAPITAL EL
+1D2C;AL # MODIFIER LETTER CAPITAL A
+1D2D;AL # MODIFIER LETTER CAPITAL AE
+1D2E;AL # MODIFIER LETTER CAPITAL B
+1D2F;AL # MODIFIER LETTER CAPITAL BARRED B
+1D30;AL # MODIFIER LETTER CAPITAL D
+1D31;AL # MODIFIER LETTER CAPITAL E
+1D32;AL # MODIFIER LETTER CAPITAL REVERSED E
+1D33;AL # MODIFIER LETTER CAPITAL G
+1D34;AL # MODIFIER LETTER CAPITAL H
+1D35;AL # MODIFIER LETTER CAPITAL I
+1D36;AL # MODIFIER LETTER CAPITAL J
+1D37;AL # MODIFIER LETTER CAPITAL K
+1D38;AL # MODIFIER LETTER CAPITAL L
+1D39;AL # MODIFIER LETTER CAPITAL M
+1D3A;AL # MODIFIER LETTER CAPITAL N
+1D3B;AL # MODIFIER LETTER CAPITAL REVERSED N
+1D3C;AL # MODIFIER LETTER CAPITAL O
+1D3D;AL # MODIFIER LETTER CAPITAL OU
+1D3E;AL # MODIFIER LETTER CAPITAL P
+1D3F;AL # MODIFIER LETTER CAPITAL R
+1D40;AL # MODIFIER LETTER CAPITAL T
+1D41;AL # MODIFIER LETTER CAPITAL U
+1D42;AL # MODIFIER LETTER CAPITAL W
+1D43;AL # MODIFIER LETTER SMALL A
+1D44;AL # MODIFIER LETTER SMALL TURNED A
+1D45;AL # MODIFIER LETTER SMALL ALPHA
+1D46;AL # MODIFIER LETTER SMALL TURNED AE
+1D47;AL # MODIFIER LETTER SMALL B
+1D48;AL # MODIFIER LETTER SMALL D
+1D49;AL # MODIFIER LETTER SMALL E
+1D4A;AL # MODIFIER LETTER SMALL SCHWA
+1D4B;AL # MODIFIER LETTER SMALL OPEN E
+1D4C;AL # MODIFIER LETTER SMALL TURNED OPEN E
+1D4D;AL # MODIFIER LETTER SMALL G
+1D4E;AL # MODIFIER LETTER SMALL TURNED I
+1D4F;AL # MODIFIER LETTER SMALL K
+1D50;AL # MODIFIER LETTER SMALL M
+1D51;AL # MODIFIER LETTER SMALL ENG
+1D52;AL # MODIFIER LETTER SMALL O
+1D53;AL # MODIFIER LETTER SMALL OPEN O
+1D54;AL # MODIFIER LETTER SMALL TOP HALF O
+1D55;AL # MODIFIER LETTER SMALL BOTTOM HALF O
+1D56;AL # MODIFIER LETTER SMALL P
+1D57;AL # MODIFIER LETTER SMALL T
+1D58;AL # MODIFIER LETTER SMALL U
+1D59;AL # MODIFIER LETTER SMALL SIDEWAYS U
+1D5A;AL # MODIFIER LETTER SMALL TURNED M
+1D5B;AL # MODIFIER LETTER SMALL V
+1D5C;AL # MODIFIER LETTER SMALL AIN
+1D5D;AL # MODIFIER LETTER SMALL BETA
+1D5E;AL # MODIFIER LETTER SMALL GREEK GAMMA
+1D5F;AL # MODIFIER LETTER SMALL DELTA
+1D60;AL # MODIFIER LETTER SMALL GREEK PHI
+1D61;AL # MODIFIER LETTER SMALL CHI
+1D62;AL # LATIN SUBSCRIPT SMALL LETTER I
+1D63;AL # LATIN SUBSCRIPT SMALL LETTER R
+1D64;AL # LATIN SUBSCRIPT SMALL LETTER U
+1D65;AL # LATIN SUBSCRIPT SMALL LETTER V
+1D66;AL # GREEK SUBSCRIPT SMALL LETTER BETA
+1D67;AL # GREEK SUBSCRIPT SMALL LETTER GAMMA
+1D68;AL # GREEK SUBSCRIPT SMALL LETTER RHO
+1D69;AL # GREEK SUBSCRIPT SMALL LETTER PHI
+1D6A;AL # GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B;AL # LATIN SMALL LETTER UE
+1D6C;AL # LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D6D;AL # LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D6E;AL # LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D6F;AL # LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D70;AL # LATIN SMALL LETTER N WITH MIDDLE TILDE
+1D71;AL # LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D72;AL # LATIN SMALL LETTER R WITH MIDDLE TILDE
+1D73;AL # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+1D74;AL # LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D75;AL # LATIN SMALL LETTER T WITH MIDDLE TILDE
+1D76;AL # LATIN SMALL LETTER Z WITH MIDDLE TILDE
+1D77;AL # LATIN SMALL LETTER TURNED G
+1D78;AL # MODIFIER LETTER CYRILLIC EN
+1D79;AL # LATIN SMALL LETTER INSULAR G
+1D7A;AL # LATIN SMALL LETTER TH WITH STRIKETHROUGH
+1D7B;AL # LATIN SMALL CAPITAL LETTER I WITH STROKE
+1D7C;AL # LATIN SMALL LETTER IOTA WITH STROKE
+1D7D;AL # LATIN SMALL LETTER P WITH STROKE
+1D7E;AL # LATIN SMALL CAPITAL LETTER U WITH STROKE
+1D7F;AL # LATIN SMALL LETTER UPSILON WITH STROKE
+1D80;AL # LATIN SMALL LETTER B WITH PALATAL HOOK
+1D81;AL # LATIN SMALL LETTER D WITH PALATAL HOOK
+1D82;AL # LATIN SMALL LETTER F WITH PALATAL HOOK
+1D83;AL # LATIN SMALL LETTER G WITH PALATAL HOOK
+1D84;AL # LATIN SMALL LETTER K WITH PALATAL HOOK
+1D85;AL # LATIN SMALL LETTER L WITH PALATAL HOOK
+1D86;AL # LATIN SMALL LETTER M WITH PALATAL HOOK
+1D87;AL # LATIN SMALL LETTER N WITH PALATAL HOOK
+1D88;AL # LATIN SMALL LETTER P WITH PALATAL HOOK
+1D89;AL # LATIN SMALL LETTER R WITH PALATAL HOOK
+1D8A;AL # LATIN SMALL LETTER S WITH PALATAL HOOK
+1D8B;AL # LATIN SMALL LETTER ESH WITH PALATAL HOOK
+1D8C;AL # LATIN SMALL LETTER V WITH PALATAL HOOK
+1D8D;AL # LATIN SMALL LETTER X WITH PALATAL HOOK
+1D8E;AL # LATIN SMALL LETTER Z WITH PALATAL HOOK
+1D8F;AL # LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D90;AL # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+1D91;AL # LATIN SMALL LETTER D WITH HOOK AND TAIL
+1D92;AL # LATIN SMALL LETTER E WITH RETROFLEX HOOK
+1D93;AL # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+1D94;AL # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+1D95;AL # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+1D96;AL # LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1D97;AL # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+1D98;AL # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+1D99;AL # LATIN SMALL LETTER U WITH RETROFLEX HOOK
+1D9A;AL # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B;AL # MODIFIER LETTER SMALL TURNED ALPHA
+1D9C;AL # MODIFIER LETTER SMALL C
+1D9D;AL # MODIFIER LETTER SMALL C WITH CURL
+1D9E;AL # MODIFIER LETTER SMALL ETH
+1D9F;AL # MODIFIER LETTER SMALL REVERSED OPEN E
+1DA0;AL # MODIFIER LETTER SMALL F
+1DA1;AL # MODIFIER LETTER SMALL DOTLESS J WITH STROKE
+1DA2;AL # MODIFIER LETTER SMALL SCRIPT G
+1DA3;AL # MODIFIER LETTER SMALL TURNED H
+1DA4;AL # MODIFIER LETTER SMALL I WITH STROKE
+1DA5;AL # MODIFIER LETTER SMALL IOTA
+1DA6;AL # MODIFIER LETTER SMALL CAPITAL I
+1DA7;AL # MODIFIER LETTER SMALL CAPITAL I WITH STROKE
+1DA8;AL # MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+1DA9;AL # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK
+1DAA;AL # MODIFIER LETTER SMALL L WITH PALATAL HOOK
+1DAB;AL # MODIFIER LETTER SMALL CAPITAL L
+1DAC;AL # MODIFIER LETTER SMALL M WITH HOOK
+1DAD;AL # MODIFIER LETTER SMALL TURNED M WITH LONG LEG
+1DAE;AL # MODIFIER LETTER SMALL N WITH LEFT HOOK
+1DAF;AL # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK
+1DB0;AL # MODIFIER LETTER SMALL CAPITAL N
+1DB1;AL # MODIFIER LETTER SMALL BARRED O
+1DB2;AL # MODIFIER LETTER SMALL PHI
+1DB3;AL # MODIFIER LETTER SMALL S WITH HOOK
+1DB4;AL # MODIFIER LETTER SMALL ESH
+1DB5;AL # MODIFIER LETTER SMALL T WITH PALATAL HOOK
+1DB6;AL # MODIFIER LETTER SMALL U BAR
+1DB7;AL # MODIFIER LETTER SMALL UPSILON
+1DB8;AL # MODIFIER LETTER SMALL CAPITAL U
+1DB9;AL # MODIFIER LETTER SMALL V WITH HOOK
+1DBA;AL # MODIFIER LETTER SMALL TURNED V
+1DBB;AL # MODIFIER LETTER SMALL Z
+1DBC;AL # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK
+1DBD;AL # MODIFIER LETTER SMALL Z WITH CURL
+1DBE;AL # MODIFIER LETTER SMALL EZH
+1DBF;AL # MODIFIER LETTER SMALL THETA
+1DC0;CM # COMBINING DOTTED GRAVE ACCENT
+1DC1;CM # COMBINING DOTTED ACUTE ACCENT
+1DC2;CM # COMBINING SNAKE BELOW
+1DC3;CM # COMBINING SUSPENSION MARK
+1E00;AL # LATIN CAPITAL LETTER A WITH RING BELOW
+1E01;AL # LATIN SMALL LETTER A WITH RING BELOW
+1E02;AL # LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E03;AL # LATIN SMALL LETTER B WITH DOT ABOVE
+1E04;AL # LATIN CAPITAL LETTER B WITH DOT BELOW
+1E05;AL # LATIN SMALL LETTER B WITH DOT BELOW
+1E06;AL # LATIN CAPITAL LETTER B WITH LINE BELOW
+1E07;AL # LATIN SMALL LETTER B WITH LINE BELOW
+1E08;AL # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E09;AL # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0A;AL # LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0B;AL # LATIN SMALL LETTER D WITH DOT ABOVE
+1E0C;AL # LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0D;AL # LATIN SMALL LETTER D WITH DOT BELOW
+1E0E;AL # LATIN CAPITAL LETTER D WITH LINE BELOW
+1E0F;AL # LATIN SMALL LETTER D WITH LINE BELOW
+1E10;AL # LATIN CAPITAL LETTER D WITH CEDILLA
+1E11;AL # LATIN SMALL LETTER D WITH CEDILLA
+1E12;AL # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E13;AL # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E14;AL # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E15;AL # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E16;AL # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E17;AL # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E18;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E19;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1A;AL # LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1B;AL # LATIN SMALL LETTER E WITH TILDE BELOW
+1E1C;AL # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1D;AL # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1E;AL # LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E1F;AL # LATIN SMALL LETTER F WITH DOT ABOVE
+1E20;AL # LATIN CAPITAL LETTER G WITH MACRON
+1E21;AL # LATIN SMALL LETTER G WITH MACRON
+1E22;AL # LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E23;AL # LATIN SMALL LETTER H WITH DOT ABOVE
+1E24;AL # LATIN CAPITAL LETTER H WITH DOT BELOW
+1E25;AL # LATIN SMALL LETTER H WITH DOT BELOW
+1E26;AL # LATIN CAPITAL LETTER H WITH DIAERESIS
+1E27;AL # LATIN SMALL LETTER H WITH DIAERESIS
+1E28;AL # LATIN CAPITAL LETTER H WITH CEDILLA
+1E29;AL # LATIN SMALL LETTER H WITH CEDILLA
+1E2A;AL # LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2B;AL # LATIN SMALL LETTER H WITH BREVE BELOW
+1E2C;AL # LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2D;AL # LATIN SMALL LETTER I WITH TILDE BELOW
+1E2E;AL # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E2F;AL # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E30;AL # LATIN CAPITAL LETTER K WITH ACUTE
+1E31;AL # LATIN SMALL LETTER K WITH ACUTE
+1E32;AL # LATIN CAPITAL LETTER K WITH DOT BELOW
+1E33;AL # LATIN SMALL LETTER K WITH DOT BELOW
+1E34;AL # LATIN CAPITAL LETTER K WITH LINE BELOW
+1E35;AL # LATIN SMALL LETTER K WITH LINE BELOW
+1E36;AL # LATIN CAPITAL LETTER L WITH DOT BELOW
+1E37;AL # LATIN SMALL LETTER L WITH DOT BELOW
+1E38;AL # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E39;AL # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3A;AL # LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3B;AL # LATIN SMALL LETTER L WITH LINE BELOW
+1E3C;AL # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3D;AL # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3E;AL # LATIN CAPITAL LETTER M WITH ACUTE
+1E3F;AL # LATIN SMALL LETTER M WITH ACUTE
+1E40;AL # LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E41;AL # LATIN SMALL LETTER M WITH DOT ABOVE
+1E42;AL # LATIN CAPITAL LETTER M WITH DOT BELOW
+1E43;AL # LATIN SMALL LETTER M WITH DOT BELOW
+1E44;AL # LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E45;AL # LATIN SMALL LETTER N WITH DOT ABOVE
+1E46;AL # LATIN CAPITAL LETTER N WITH DOT BELOW
+1E47;AL # LATIN SMALL LETTER N WITH DOT BELOW
+1E48;AL # LATIN CAPITAL LETTER N WITH LINE BELOW
+1E49;AL # LATIN SMALL LETTER N WITH LINE BELOW
+1E4A;AL # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4B;AL # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4C;AL # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4D;AL # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4E;AL # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E4F;AL # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E50;AL # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E51;AL # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E52;AL # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E53;AL # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E54;AL # LATIN CAPITAL LETTER P WITH ACUTE
+1E55;AL # LATIN SMALL LETTER P WITH ACUTE
+1E56;AL # LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E57;AL # LATIN SMALL LETTER P WITH DOT ABOVE
+1E58;AL # LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E59;AL # LATIN SMALL LETTER R WITH DOT ABOVE
+1E5A;AL # LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5B;AL # LATIN SMALL LETTER R WITH DOT BELOW
+1E5C;AL # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5D;AL # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5E;AL # LATIN CAPITAL LETTER R WITH LINE BELOW
+1E5F;AL # LATIN SMALL LETTER R WITH LINE BELOW
+1E60;AL # LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E61;AL # LATIN SMALL LETTER S WITH DOT ABOVE
+1E62;AL # LATIN CAPITAL LETTER S WITH DOT BELOW
+1E63;AL # LATIN SMALL LETTER S WITH DOT BELOW
+1E64;AL # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E65;AL # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E66;AL # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E67;AL # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E68;AL # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E69;AL # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A;AL # LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6B;AL # LATIN SMALL LETTER T WITH DOT ABOVE
+1E6C;AL # LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6D;AL # LATIN SMALL LETTER T WITH DOT BELOW
+1E6E;AL # LATIN CAPITAL LETTER T WITH LINE BELOW
+1E6F;AL # LATIN SMALL LETTER T WITH LINE BELOW
+1E70;AL # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E71;AL # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E72;AL # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E73;AL # LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E74;AL # LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E75;AL # LATIN SMALL LETTER U WITH TILDE BELOW
+1E76;AL # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E77;AL # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E78;AL # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E79;AL # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7A;AL # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7B;AL # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7C;AL # LATIN CAPITAL LETTER V WITH TILDE
+1E7D;AL # LATIN SMALL LETTER V WITH TILDE
+1E7E;AL # LATIN CAPITAL LETTER V WITH DOT BELOW
+1E7F;AL # LATIN SMALL LETTER V WITH DOT BELOW
+1E80;AL # LATIN CAPITAL LETTER W WITH GRAVE
+1E81;AL # LATIN SMALL LETTER W WITH GRAVE
+1E82;AL # LATIN CAPITAL LETTER W WITH ACUTE
+1E83;AL # LATIN SMALL LETTER W WITH ACUTE
+1E84;AL # LATIN CAPITAL LETTER W WITH DIAERESIS
+1E85;AL # LATIN SMALL LETTER W WITH DIAERESIS
+1E86;AL # LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E87;AL # LATIN SMALL LETTER W WITH DOT ABOVE
+1E88;AL # LATIN CAPITAL LETTER W WITH DOT BELOW
+1E89;AL # LATIN SMALL LETTER W WITH DOT BELOW
+1E8A;AL # LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8B;AL # LATIN SMALL LETTER X WITH DOT ABOVE
+1E8C;AL # LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8D;AL # LATIN SMALL LETTER X WITH DIAERESIS
+1E8E;AL # LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E8F;AL # LATIN SMALL LETTER Y WITH DOT ABOVE
+1E90;AL # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E91;AL # LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E92;AL # LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E93;AL # LATIN SMALL LETTER Z WITH DOT BELOW
+1E94;AL # LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E95;AL # LATIN SMALL LETTER Z WITH LINE BELOW
+1E96;AL # LATIN SMALL LETTER H WITH LINE BELOW
+1E97;AL # LATIN SMALL LETTER T WITH DIAERESIS
+1E98;AL # LATIN SMALL LETTER W WITH RING ABOVE
+1E99;AL # LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A;AL # LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B;AL # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0;AL # LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA1;AL # LATIN SMALL LETTER A WITH DOT BELOW
+1EA2;AL # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA3;AL # LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA4;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA5;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA7;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EA9;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAB;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC;AL # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAD;AL # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE;AL # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EAF;AL # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB0;AL # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB1;AL # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB2;AL # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB3;AL # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4;AL # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB5;AL # LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB6;AL # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB7;AL # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB8;AL # LATIN CAPITAL LETTER E WITH DOT BELOW
+1EB9;AL # LATIN SMALL LETTER E WITH DOT BELOW
+1EBA;AL # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBB;AL # LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBC;AL # LATIN CAPITAL LETTER E WITH TILDE
+1EBD;AL # LATIN SMALL LETTER E WITH TILDE
+1EBE;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EBF;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC1;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC3;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC5;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6;AL # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC7;AL # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8;AL # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1EC9;AL # LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECA;AL # LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECB;AL # LATIN SMALL LETTER I WITH DOT BELOW
+1ECC;AL # LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECD;AL # LATIN SMALL LETTER O WITH DOT BELOW
+1ECE;AL # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ECF;AL # LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED0;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED1;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED3;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED5;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED7;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8;AL # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1ED9;AL # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA;AL # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDB;AL # LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDC;AL # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDD;AL # LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDE;AL # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EDF;AL # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE0;AL # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE1;AL # LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE2;AL # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE3;AL # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE4;AL # LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE5;AL # LATIN SMALL LETTER U WITH DOT BELOW
+1EE6;AL # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE7;AL # LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE8;AL # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EE9;AL # LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEA;AL # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEB;AL # LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EEC;AL # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EED;AL # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEE;AL # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EEF;AL # LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF0;AL # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF1;AL # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF2;AL # LATIN CAPITAL LETTER Y WITH GRAVE
+1EF3;AL # LATIN SMALL LETTER Y WITH GRAVE
+1EF4;AL # LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF5;AL # LATIN SMALL LETTER Y WITH DOT BELOW
+1EF6;AL # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF7;AL # LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF8;AL # LATIN CAPITAL LETTER Y WITH TILDE
+1EF9;AL # LATIN SMALL LETTER Y WITH TILDE
+1F00;AL # GREEK SMALL LETTER ALPHA WITH PSILI
+1F01;AL # GREEK SMALL LETTER ALPHA WITH DASIA
+1F02;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+1F03;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+1F04;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+1F05;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+1F06;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F07;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F08;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10;AL # GREEK SMALL LETTER EPSILON WITH PSILI
+1F11;AL # GREEK SMALL LETTER EPSILON WITH DASIA
+1F12;AL # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+1F13;AL # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+1F14;AL # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+1F15;AL # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18;AL # GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19;AL # GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A;AL # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B;AL # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C;AL # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D;AL # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20;AL # GREEK SMALL LETTER ETA WITH PSILI
+1F21;AL # GREEK SMALL LETTER ETA WITH DASIA
+1F22;AL # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+1F23;AL # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+1F24;AL # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+1F25;AL # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+1F26;AL # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+1F27;AL # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F28;AL # GREEK CAPITAL LETTER ETA WITH PSILI
+1F29;AL # GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30;AL # GREEK SMALL LETTER IOTA WITH PSILI
+1F31;AL # GREEK SMALL LETTER IOTA WITH DASIA
+1F32;AL # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+1F33;AL # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+1F34;AL # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+1F35;AL # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+1F36;AL # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F37;AL # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F38;AL # GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39;AL # GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A;AL # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B;AL # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C;AL # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D;AL # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E;AL # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F;AL # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40;AL # GREEK SMALL LETTER OMICRON WITH PSILI
+1F41;AL # GREEK SMALL LETTER OMICRON WITH DASIA
+1F42;AL # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+1F43;AL # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+1F44;AL # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+1F45;AL # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48;AL # GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49;AL # GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A;AL # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B;AL # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C;AL # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D;AL # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50;AL # GREEK SMALL LETTER UPSILON WITH PSILI
+1F51;AL # GREEK SMALL LETTER UPSILON WITH DASIA
+1F52;AL # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F53;AL # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+1F54;AL # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F55;AL # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+1F56;AL # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F57;AL # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F;AL # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60;AL # GREEK SMALL LETTER OMEGA WITH PSILI
+1F61;AL # GREEK SMALL LETTER OMEGA WITH DASIA
+1F62;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+1F63;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+1F64;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+1F65;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+1F66;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F67;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F68;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70;AL # GREEK SMALL LETTER ALPHA WITH VARIA
+1F71;AL # GREEK SMALL LETTER ALPHA WITH OXIA
+1F72;AL # GREEK SMALL LETTER EPSILON WITH VARIA
+1F73;AL # GREEK SMALL LETTER EPSILON WITH OXIA
+1F74;AL # GREEK SMALL LETTER ETA WITH VARIA
+1F75;AL # GREEK SMALL LETTER ETA WITH OXIA
+1F76;AL # GREEK SMALL LETTER IOTA WITH VARIA
+1F77;AL # GREEK SMALL LETTER IOTA WITH OXIA
+1F78;AL # GREEK SMALL LETTER OMICRON WITH VARIA
+1F79;AL # GREEK SMALL LETTER OMICRON WITH OXIA
+1F7A;AL # GREEK SMALL LETTER UPSILON WITH VARIA
+1F7B;AL # GREEK SMALL LETTER UPSILON WITH OXIA
+1F7C;AL # GREEK SMALL LETTER OMEGA WITH VARIA
+1F7D;AL # GREEK SMALL LETTER OMEGA WITH OXIA
+1F80;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86;AL # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87;AL # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E;AL # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F;AL # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90;AL # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91;AL # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92;AL # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93;AL # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94;AL # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95;AL # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96;AL # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97;AL # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E;AL # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F;AL # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6;AL # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7;AL # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE;AL # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF;AL # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB0;AL # GREEK SMALL LETTER ALPHA WITH VRACHY
+1FB1;AL # GREEK SMALL LETTER ALPHA WITH MACRON
+1FB2;AL # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3;AL # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4;AL # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6;AL # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7;AL # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8;AL # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9;AL # GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA;AL # GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB;AL # GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC;AL # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD;AL # GREEK KORONIS
+1FBE;AL # GREEK PROSGEGRAMMENI
+1FBF;AL # GREEK PSILI
+1FC0;AL # GREEK PERISPOMENI
+1FC1;AL # GREEK DIALYTIKA AND PERISPOMENI
+1FC2;AL # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3;AL # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4;AL # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6;AL # GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7;AL # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8;AL # GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9;AL # GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA;AL # GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB;AL # GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC;AL # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD;AL # GREEK PSILI AND VARIA
+1FCE;AL # GREEK PSILI AND OXIA
+1FCF;AL # GREEK PSILI AND PERISPOMENI
+1FD0;AL # GREEK SMALL LETTER IOTA WITH VRACHY
+1FD1;AL # GREEK SMALL LETTER IOTA WITH MACRON
+1FD2;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6;AL # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7;AL # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8;AL # GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9;AL # GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA;AL # GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB;AL # GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD;AL # GREEK DASIA AND VARIA
+1FDE;AL # GREEK DASIA AND OXIA
+1FDF;AL # GREEK DASIA AND PERISPOMENI
+1FE0;AL # GREEK SMALL LETTER UPSILON WITH VRACHY
+1FE1;AL # GREEK SMALL LETTER UPSILON WITH MACRON
+1FE2;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4;AL # GREEK SMALL LETTER RHO WITH PSILI
+1FE5;AL # GREEK SMALL LETTER RHO WITH DASIA
+1FE6;AL # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7;AL # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8;AL # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9;AL # GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA;AL # GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB;AL # GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC;AL # GREEK CAPITAL LETTER RHO WITH DASIA
+1FED;AL # GREEK DIALYTIKA AND VARIA
+1FEE;AL # GREEK DIALYTIKA AND OXIA
+1FEF;AL # GREEK VARIA
+1FF2;AL # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3;AL # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4;AL # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6;AL # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7;AL # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8;AL # GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9;AL # GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA;AL # GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB;AL # GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC;AL # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD;AL # GREEK OXIA
+1FFE;AL # GREEK DASIA
+2000;BA # EN QUAD
+2001;BA # EM QUAD
+2002;BA # EN SPACE
+2003;BA # EM SPACE
+2004;BA # THREE-PER-EM SPACE
+2005;BA # FOUR-PER-EM SPACE
+2006;BA # SIX-PER-EM SPACE
+2007;GL # FIGURE SPACE
+2008;BA # PUNCTUATION SPACE
+2009;BA # THIN SPACE
+200A;BA # HAIR SPACE
+200B;ZW # ZERO WIDTH SPACE
+200C;CM # ZERO WIDTH NON-JOINER
+200D;CM # ZERO WIDTH JOINER
+200E;CM # LEFT-TO-RIGHT MARK
+200F;CM # RIGHT-TO-LEFT MARK
+2010;BA # HYPHEN
+2011;GL # NON-BREAKING HYPHEN
+2012;BA # FIGURE DASH
+2013;BA # EN DASH
+2014;B2 # EM DASH
+2015;AI # HORIZONTAL BAR
+2016;AI # DOUBLE VERTICAL LINE
+2017;AL # DOUBLE LOW LINE
+2018;QU # LEFT SINGLE QUOTATION MARK
+2019;QU # RIGHT SINGLE QUOTATION MARK
+201A;OP # SINGLE LOW-9 QUOTATION MARK
+201B;QU # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C;QU # LEFT DOUBLE QUOTATION MARK
+201D;QU # RIGHT DOUBLE QUOTATION MARK
+201E;OP # DOUBLE LOW-9 QUOTATION MARK
+201F;QU # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020;AI # DAGGER
+2021;AI # DOUBLE DAGGER
+2022;AL # BULLET
+2023;AL # TRIANGULAR BULLET
+2024;IN # ONE DOT LEADER
+2025;IN # TWO DOT LEADER
+2026;IN # HORIZONTAL ELLIPSIS
+2027;BA # HYPHENATION POINT
+2028;BK # LINE SEPARATOR
+2029;BK # PARAGRAPH SEPARATOR
+202A;CM # LEFT-TO-RIGHT EMBEDDING
+202B;CM # RIGHT-TO-LEFT EMBEDDING
+202C;CM # POP DIRECTIONAL FORMATTING
+202D;CM # LEFT-TO-RIGHT OVERRIDE
+202E;CM # RIGHT-TO-LEFT OVERRIDE
+202F;GL # NARROW NO-BREAK SPACE
+2030;PO # PER MILLE SIGN
+2031;PO # PER TEN THOUSAND SIGN
+2032;PO # PRIME
+2033;PO # DOUBLE PRIME
+2034;PO # TRIPLE PRIME
+2035;PO # REVERSED PRIME
+2036;PO # REVERSED DOUBLE PRIME
+2037;PO # REVERSED TRIPLE PRIME
+2038;AL # CARET
+2039;QU # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A;QU # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B;AI # REFERENCE MARK
+203C;NS # DOUBLE EXCLAMATION MARK
+203D;AL # INTERROBANG
+203E;AL # OVERLINE
+203F;AL # UNDERTIE
+2040;AL # CHARACTER TIE
+2041;AL # CARET INSERTION POINT
+2042;AL # ASTERISM
+2043;AL # HYPHEN BULLET
+2044;IS # FRACTION SLASH
+2045;OP # LEFT SQUARE BRACKET WITH QUILL
+2046;CL # RIGHT SQUARE BRACKET WITH QUILL
+2047;AL # DOUBLE QUESTION MARK
+2048;AL # QUESTION EXCLAMATION MARK
+2049;AL # EXCLAMATION QUESTION MARK
+204A;AL # TIRONIAN SIGN ET
+204B;AL # REVERSED PILCROW SIGN
+204C;AL # BLACK LEFTWARDS BULLET
+204D;AL # BLACK RIGHTWARDS BULLET
+204E;AL # LOW ASTERISK
+204F;AL # REVERSED SEMICOLON
+2050;AL # CLOSE UP
+2051;AL # TWO ASTERISKS ALIGNED VERTICALLY
+2052;AL # COMMERCIAL MINUS SIGN
+2053;AL # SWUNG DASH
+2054;AL # INVERTED UNDERTIE
+2055;AL # FLOWER PUNCTUATION MARK
+2056;BA # THREE DOT PUNCTUATION
+2057;AL # QUADRUPLE PRIME
+2058;BA # FOUR DOT PUNCTUATION
+2059;BA # FIVE DOT PUNCTUATION
+205A;BA # TWO DOT PUNCTUATION
+205B;BA # FOUR DOT MARK
+205C;AL # DOTTED CROSS
+205D;BA # TRICOLON
+205E;BA # VERTICAL FOUR DOTS
+205F;BA # MEDIUM MATHEMATICAL SPACE
+2060;WJ # WORD JOINER
+2061;AL # FUNCTION APPLICATION
+2062;AL # INVISIBLE TIMES
+2063;AL # INVISIBLE SEPARATOR
+206A;CM # INHIBIT SYMMETRIC SWAPPING
+206B;CM # ACTIVATE SYMMETRIC SWAPPING
+206C;CM # INHIBIT ARABIC FORM SHAPING
+206D;CM # ACTIVATE ARABIC FORM SHAPING
+206E;CM # NATIONAL DIGIT SHAPES
+206F;CM # NOMINAL DIGIT SHAPES
+2070;AL # SUPERSCRIPT ZERO
+2071;AL # SUPERSCRIPT LATIN SMALL LETTER I
+2074;AI # SUPERSCRIPT FOUR
+2075;AL # SUPERSCRIPT FIVE
+2076;AL # SUPERSCRIPT SIX
+2077;AL # SUPERSCRIPT SEVEN
+2078;AL # SUPERSCRIPT EIGHT
+2079;AL # SUPERSCRIPT NINE
+207A;AL # SUPERSCRIPT PLUS SIGN
+207B;AL # SUPERSCRIPT MINUS
+207C;AL # SUPERSCRIPT EQUALS SIGN
+207D;OP # SUPERSCRIPT LEFT PARENTHESIS
+207E;CL # SUPERSCRIPT RIGHT PARENTHESIS
+207F;AI # SUPERSCRIPT LATIN SMALL LETTER N
+2080;AL # SUBSCRIPT ZERO
+2081;AI # SUBSCRIPT ONE
+2082;AI # SUBSCRIPT TWO
+2083;AI # SUBSCRIPT THREE
+2084;AI # SUBSCRIPT FOUR
+2085;AL # SUBSCRIPT FIVE
+2086;AL # SUBSCRIPT SIX
+2087;AL # SUBSCRIPT SEVEN
+2088;AL # SUBSCRIPT EIGHT
+2089;AL # SUBSCRIPT NINE
+208A;AL # SUBSCRIPT PLUS SIGN
+208B;AL # SUBSCRIPT MINUS
+208C;AL # SUBSCRIPT EQUALS SIGN
+208D;OP # SUBSCRIPT LEFT PARENTHESIS
+208E;CL # SUBSCRIPT RIGHT PARENTHESIS
+2090;AL # LATIN SUBSCRIPT SMALL LETTER A
+2091;AL # LATIN SUBSCRIPT SMALL LETTER E
+2092;AL # LATIN SUBSCRIPT SMALL LETTER O
+2093;AL # LATIN SUBSCRIPT SMALL LETTER X
+2094;AL # LATIN SUBSCRIPT SMALL LETTER SCHWA
+20A0;PR # EURO-CURRENCY SIGN
+20A1;PR # COLON SIGN
+20A2;PR # CRUZEIRO SIGN
+20A3;PR # FRENCH FRANC SIGN
+20A4;PR # LIRA SIGN
+20A5;PR # MILL SIGN
+20A6;PR # NAIRA SIGN
+20A7;PO # PESETA SIGN
+20A8;PR # RUPEE SIGN
+20A9;PR # WON SIGN
+20AA;PR # NEW SHEQEL SIGN
+20AB;PR # DONG SIGN
+20AC;PR # EURO SIGN
+20AD;PR # KIP SIGN
+20AE;PR # TUGRIK SIGN
+20AF;PR # DRACHMA SIGN
+20B0;PR # GERMAN PENNY SIGN
+20B1;PR # PESO SIGN
+20B2;PR # GUARANI SIGN
+20B3;PR # AUSTRAL SIGN
+20B4;PR # HRYVNIA SIGN
+20B5;PR # CEDI SIGN
+20D0;CM # COMBINING LEFT HARPOON ABOVE
+20D1;CM # COMBINING RIGHT HARPOON ABOVE
+20D2;CM # COMBINING LONG VERTICAL LINE OVERLAY
+20D3;CM # COMBINING SHORT VERTICAL LINE OVERLAY
+20D4;CM # COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5;CM # COMBINING CLOCKWISE ARROW ABOVE
+20D6;CM # COMBINING LEFT ARROW ABOVE
+20D7;CM # COMBINING RIGHT ARROW ABOVE
+20D8;CM # COMBINING RING OVERLAY
+20D9;CM # COMBINING CLOCKWISE RING OVERLAY
+20DA;CM # COMBINING ANTICLOCKWISE RING OVERLAY
+20DB;CM # COMBINING THREE DOTS ABOVE
+20DC;CM # COMBINING FOUR DOTS ABOVE
+20DD;CM # COMBINING ENCLOSING CIRCLE
+20DE;CM # COMBINING ENCLOSING SQUARE
+20DF;CM # COMBINING ENCLOSING DIAMOND
+20E0;CM # COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1;CM # COMBINING LEFT RIGHT ARROW ABOVE
+20E2;CM # COMBINING ENCLOSING SCREEN
+20E3;CM # COMBINING ENCLOSING KEYCAP
+20E4;CM # COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5;CM # COMBINING REVERSE SOLIDUS OVERLAY
+20E6;CM # COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20E7;CM # COMBINING ANNUITY SYMBOL
+20E8;CM # COMBINING TRIPLE UNDERDOT
+20E9;CM # COMBINING WIDE BRIDGE ABOVE
+20EA;CM # COMBINING LEFTWARDS ARROW OVERLAY
+20EB;CM # COMBINING LONG DOUBLE SOLIDUS OVERLAY
+2100;AL # ACCOUNT OF
+2101;AL # ADDRESSED TO THE SUBJECT
+2102;AL # DOUBLE-STRUCK CAPITAL C
+2103;PO # DEGREE CELSIUS
+2104;AL # CENTRE LINE SYMBOL
+2105;AI # CARE OF
+2106;AL # CADA UNA
+2107;AL # EULER CONSTANT
+2108;AL # SCRUPLE
+2109;PO # DEGREE FAHRENHEIT
+210A;AL # SCRIPT SMALL G
+210B;AL # SCRIPT CAPITAL H
+210C;AL # BLACK-LETTER CAPITAL H
+210D;AL # DOUBLE-STRUCK CAPITAL H
+210E;AL # PLANCK CONSTANT
+210F;AL # PLANCK CONSTANT OVER TWO PI
+2110;AL # SCRIPT CAPITAL I
+2111;AL # BLACK-LETTER CAPITAL I
+2112;AL # SCRIPT CAPITAL L
+2113;AI # SCRIPT SMALL L
+2114;AL # L B BAR SYMBOL
+2115;AL # DOUBLE-STRUCK CAPITAL N
+2116;PR # NUMERO SIGN
+2117;AL # SOUND RECORDING COPYRIGHT
+2118;AL # SCRIPT CAPITAL P
+2119;AL # DOUBLE-STRUCK CAPITAL P
+211A;AL # DOUBLE-STRUCK CAPITAL Q
+211B;AL # SCRIPT CAPITAL R
+211C;AL # BLACK-LETTER CAPITAL R
+211D;AL # DOUBLE-STRUCK CAPITAL R
+211E;AL # PRESCRIPTION TAKE
+211F;AL # RESPONSE
+2120;AL # SERVICE MARK
+2121;AI # TELEPHONE SIGN
+2122;AI # TRADE MARK SIGN
+2123;AL # VERSICLE
+2124;AL # DOUBLE-STRUCK CAPITAL Z
+2125;AL # OUNCE SIGN
+2126;AL # OHM SIGN
+2127;AL # INVERTED OHM SIGN
+2128;AL # BLACK-LETTER CAPITAL Z
+2129;AL # TURNED GREEK SMALL LETTER IOTA
+212A;AL # KELVIN SIGN
+212B;AI # ANGSTROM SIGN
+212C;AL # SCRIPT CAPITAL B
+212D;AL # BLACK-LETTER CAPITAL C
+212E;AL # ESTIMATED SYMBOL
+212F;AL # SCRIPT SMALL E
+2130;AL # SCRIPT CAPITAL E
+2131;AL # SCRIPT CAPITAL F
+2132;AL # TURNED CAPITAL F
+2133;AL # SCRIPT CAPITAL M
+2134;AL # SCRIPT SMALL O
+2135;AL # ALEF SYMBOL
+2136;AL # BET SYMBOL
+2137;AL # GIMEL SYMBOL
+2138;AL # DALET SYMBOL
+2139;AL # INFORMATION SOURCE
+213A;AL # ROTATED CAPITAL Q
+213B;AL # FACSIMILE SIGN
+213C;AL # DOUBLE-STRUCK SMALL PI
+213D;AL # DOUBLE-STRUCK SMALL GAMMA
+213E;AL # DOUBLE-STRUCK CAPITAL GAMMA
+213F;AL # DOUBLE-STRUCK CAPITAL PI
+2140;AL # DOUBLE-STRUCK N-ARY SUMMATION
+2141;AL # TURNED SANS-SERIF CAPITAL G
+2142;AL # TURNED SANS-SERIF CAPITAL L
+2143;AL # REVERSED SANS-SERIF CAPITAL L
+2144;AL # TURNED SANS-SERIF CAPITAL Y
+2145;AL # DOUBLE-STRUCK ITALIC CAPITAL D
+2146;AL # DOUBLE-STRUCK ITALIC SMALL D
+2147;AL # DOUBLE-STRUCK ITALIC SMALL E
+2148;AL # DOUBLE-STRUCK ITALIC SMALL I
+2149;AL # DOUBLE-STRUCK ITALIC SMALL J
+214A;AL # PROPERTY LINE
+214B;AL # TURNED AMPERSAND
+214C;AL # PER SIGN
+2153;AL # VULGAR FRACTION ONE THIRD
+2154;AI # VULGAR FRACTION TWO THIRDS
+2155;AI # VULGAR FRACTION ONE FIFTH
+2156;AL # VULGAR FRACTION TWO FIFTHS
+2157;AL # VULGAR FRACTION THREE FIFTHS
+2158;AL # VULGAR FRACTION FOUR FIFTHS
+2159;AL # VULGAR FRACTION ONE SIXTH
+215A;AL # VULGAR FRACTION FIVE SIXTHS
+215B;AI # VULGAR FRACTION ONE EIGHTH
+215C;AL # VULGAR FRACTION THREE EIGHTHS
+215D;AL # VULGAR FRACTION FIVE EIGHTHS
+215E;AI # VULGAR FRACTION SEVEN EIGHTHS
+215F;AL # FRACTION NUMERATOR ONE
+2160;AI # ROMAN NUMERAL ONE
+2161;AI # ROMAN NUMERAL TWO
+2162;AI # ROMAN NUMERAL THREE
+2163;AI # ROMAN NUMERAL FOUR
+2164;AI # ROMAN NUMERAL FIVE
+2165;AI # ROMAN NUMERAL SIX
+2166;AI # ROMAN NUMERAL SEVEN
+2167;AI # ROMAN NUMERAL EIGHT
+2168;AI # ROMAN NUMERAL NINE
+2169;AI # ROMAN NUMERAL TEN
+216A;AI # ROMAN NUMERAL ELEVEN
+216B;AI # ROMAN NUMERAL TWELVE
+216C;AL # ROMAN NUMERAL FIFTY
+216D;AL # ROMAN NUMERAL ONE HUNDRED
+216E;AL # ROMAN NUMERAL FIVE HUNDRED
+216F;AL # ROMAN NUMERAL ONE THOUSAND
+2170;AI # SMALL ROMAN NUMERAL ONE
+2171;AI # SMALL ROMAN NUMERAL TWO
+2172;AI # SMALL ROMAN NUMERAL THREE
+2173;AI # SMALL ROMAN NUMERAL FOUR
+2174;AI # SMALL ROMAN NUMERAL FIVE
+2175;AI # SMALL ROMAN NUMERAL SIX
+2176;AI # SMALL ROMAN NUMERAL SEVEN
+2177;AI # SMALL ROMAN NUMERAL EIGHT
+2178;AI # SMALL ROMAN NUMERAL NINE
+2179;AI # SMALL ROMAN NUMERAL TEN
+217A;AL # SMALL ROMAN NUMERAL ELEVEN
+217B;AL # SMALL ROMAN NUMERAL TWELVE
+217C;AL # SMALL ROMAN NUMERAL FIFTY
+217D;AL # SMALL ROMAN NUMERAL ONE HUNDRED
+217E;AL # SMALL ROMAN NUMERAL FIVE HUNDRED
+217F;AL # SMALL ROMAN NUMERAL ONE THOUSAND
+2180;AL # ROMAN NUMERAL ONE THOUSAND C D
+2181;AL # ROMAN NUMERAL FIVE THOUSAND
+2182;AL # ROMAN NUMERAL TEN THOUSAND
+2183;AL # ROMAN NUMERAL REVERSED ONE HUNDRED
+2190;AI # LEFTWARDS ARROW
+2191;AI # UPWARDS ARROW
+2192;AI # RIGHTWARDS ARROW
+2193;AI # DOWNWARDS ARROW
+2194;AI # LEFT RIGHT ARROW
+2195;AI # UP DOWN ARROW
+2196;AI # NORTH WEST ARROW
+2197;AI # NORTH EAST ARROW
+2198;AI # SOUTH EAST ARROW
+2199;AI # SOUTH WEST ARROW
+219A;AL # LEFTWARDS ARROW WITH STROKE
+219B;AL # RIGHTWARDS ARROW WITH STROKE
+219C;AL # LEFTWARDS WAVE ARROW
+219D;AL # RIGHTWARDS WAVE ARROW
+219E;AL # LEFTWARDS TWO HEADED ARROW
+219F;AL # UPWARDS TWO HEADED ARROW
+21A0;AL # RIGHTWARDS TWO HEADED ARROW
+21A1;AL # DOWNWARDS TWO HEADED ARROW
+21A2;AL # LEFTWARDS ARROW WITH TAIL
+21A3;AL # RIGHTWARDS ARROW WITH TAIL
+21A4;AL # LEFTWARDS ARROW FROM BAR
+21A5;AL # UPWARDS ARROW FROM BAR
+21A6;AL # RIGHTWARDS ARROW FROM BAR
+21A7;AL # DOWNWARDS ARROW FROM BAR
+21A8;AL # UP DOWN ARROW WITH BASE
+21A9;AL # LEFTWARDS ARROW WITH HOOK
+21AA;AL # RIGHTWARDS ARROW WITH HOOK
+21AB;AL # LEFTWARDS ARROW WITH LOOP
+21AC;AL # RIGHTWARDS ARROW WITH LOOP
+21AD;AL # LEFT RIGHT WAVE ARROW
+21AE;AL # LEFT RIGHT ARROW WITH STROKE
+21AF;AL # DOWNWARDS ZIGZAG ARROW
+21B0;AL # UPWARDS ARROW WITH TIP LEFTWARDS
+21B1;AL # UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2;AL # DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3;AL # DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4;AL # RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5;AL # DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6;AL # ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7;AL # CLOCKWISE TOP SEMICIRCLE ARROW
+21B8;AL # NORTH WEST ARROW TO LONG BAR
+21B9;AL # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA;AL # ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB;AL # CLOCKWISE OPEN CIRCLE ARROW
+21BC;AL # LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD;AL # LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE;AL # UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF;AL # UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0;AL # RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1;AL # RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2;AL # DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3;AL # DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4;AL # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5;AL # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6;AL # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7;AL # LEFTWARDS PAIRED ARROWS
+21C8;AL # UPWARDS PAIRED ARROWS
+21C9;AL # RIGHTWARDS PAIRED ARROWS
+21CA;AL # DOWNWARDS PAIRED ARROWS
+21CB;AL # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC;AL # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD;AL # LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE;AL # LEFT RIGHT DOUBLE ARROW WITH STROKE
+21CF;AL # RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0;AL # LEFTWARDS DOUBLE ARROW
+21D1;AL # UPWARDS DOUBLE ARROW
+21D2;AI # RIGHTWARDS DOUBLE ARROW
+21D3;AL # DOWNWARDS DOUBLE ARROW
+21D4;AI # LEFT RIGHT DOUBLE ARROW
+21D5;AL # UP DOWN DOUBLE ARROW
+21D6;AL # NORTH WEST DOUBLE ARROW
+21D7;AL # NORTH EAST DOUBLE ARROW
+21D8;AL # SOUTH EAST DOUBLE ARROW
+21D9;AL # SOUTH WEST DOUBLE ARROW
+21DA;AL # LEFTWARDS TRIPLE ARROW
+21DB;AL # RIGHTWARDS TRIPLE ARROW
+21DC;AL # LEFTWARDS SQUIGGLE ARROW
+21DD;AL # RIGHTWARDS SQUIGGLE ARROW
+21DE;AL # UPWARDS ARROW WITH DOUBLE STROKE
+21DF;AL # DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0;AL # LEFTWARDS DASHED ARROW
+21E1;AL # UPWARDS DASHED ARROW
+21E2;AL # RIGHTWARDS DASHED ARROW
+21E3;AL # DOWNWARDS DASHED ARROW
+21E4;AL # LEFTWARDS ARROW TO BAR
+21E5;AL # RIGHTWARDS ARROW TO BAR
+21E6;AL # LEFTWARDS WHITE ARROW
+21E7;AL # UPWARDS WHITE ARROW
+21E8;AL # RIGHTWARDS WHITE ARROW
+21E9;AL # DOWNWARDS WHITE ARROW
+21EA;AL # UPWARDS WHITE ARROW FROM BAR
+21EB;AL # UPWARDS WHITE ARROW ON PEDESTAL
+21EC;AL # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED;AL # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE;AL # UPWARDS WHITE DOUBLE ARROW
+21EF;AL # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0;AL # RIGHTWARDS WHITE ARROW FROM WALL
+21F1;AL # NORTH WEST ARROW TO CORNER
+21F2;AL # SOUTH EAST ARROW TO CORNER
+21F3;AL # UP DOWN WHITE ARROW
+21F4;AL # RIGHT ARROW WITH SMALL CIRCLE
+21F5;AL # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6;AL # THREE RIGHTWARDS ARROWS
+21F7;AL # LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8;AL # RIGHTWARDS ARROW WITH VERTICAL STROKE
+21F9;AL # LEFT RIGHT ARROW WITH VERTICAL STROKE
+21FA;AL # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB;AL # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FC;AL # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+21FD;AL # LEFTWARDS OPEN-HEADED ARROW
+21FE;AL # RIGHTWARDS OPEN-HEADED ARROW
+21FF;AL # LEFT RIGHT OPEN-HEADED ARROW
+2200;AI # FOR ALL
+2201;AL # COMPLEMENT
+2202;AI # PARTIAL DIFFERENTIAL
+2203;AI # THERE EXISTS
+2204;AL # THERE DOES NOT EXIST
+2205;AL # EMPTY SET
+2206;AL # INCREMENT
+2207;AI # NABLA
+2208;AI # ELEMENT OF
+2209;AL # NOT AN ELEMENT OF
+220A;AL # SMALL ELEMENT OF
+220B;AI # CONTAINS AS MEMBER
+220C;AL # DOES NOT CONTAIN AS MEMBER
+220D;AL # SMALL CONTAINS AS MEMBER
+220E;AL # END OF PROOF
+220F;AI # N-ARY PRODUCT
+2210;AL # N-ARY COPRODUCT
+2211;AI # N-ARY SUMMATION
+2212;PR # MINUS SIGN
+2213;PR # MINUS-OR-PLUS SIGN
+2214;AL # DOT PLUS
+2215;AI # DIVISION SLASH
+2216;AL # SET MINUS
+2217;AL # ASTERISK OPERATOR
+2218;AL # RING OPERATOR
+2219;AL # BULLET OPERATOR
+221A;AI # SQUARE ROOT
+221B;AL # CUBE ROOT
+221C;AL # FOURTH ROOT
+221D;AI # PROPORTIONAL TO
+221E;AI # INFINITY
+221F;AI # RIGHT ANGLE
+2220;AI # ANGLE
+2221;AL # MEASURED ANGLE
+2222;AL # SPHERICAL ANGLE
+2223;AI # DIVIDES
+2224;AL # DOES NOT DIVIDE
+2225;AI # PARALLEL TO
+2226;AL # NOT PARALLEL TO
+2227;AI # LOGICAL AND
+2228;AI # LOGICAL OR
+2229;AI # INTERSECTION
+222A;AI # UNION
+222B;AI # INTEGRAL
+222C;AI # DOUBLE INTEGRAL
+222D;AL # TRIPLE INTEGRAL
+222E;AI # CONTOUR INTEGRAL
+222F;AL # SURFACE INTEGRAL
+2230;AL # VOLUME INTEGRAL
+2231;AL # CLOCKWISE INTEGRAL
+2232;AL # CLOCKWISE CONTOUR INTEGRAL
+2233;AL # ANTICLOCKWISE CONTOUR INTEGRAL
+2234;AI # THEREFORE
+2235;AI # BECAUSE
+2236;AI # RATIO
+2237;AI # PROPORTION
+2238;AL # DOT MINUS
+2239;AL # EXCESS
+223A;AL # GEOMETRIC PROPORTION
+223B;AL # HOMOTHETIC
+223C;AI # TILDE OPERATOR
+223D;AI # REVERSED TILDE
+223E;AL # INVERTED LAZY S
+223F;AL # SINE WAVE
+2240;AL # WREATH PRODUCT
+2241;AL # NOT TILDE
+2242;AL # MINUS TILDE
+2243;AL # ASYMPTOTICALLY EQUAL TO
+2244;AL # NOT ASYMPTOTICALLY EQUAL TO
+2245;AL # APPROXIMATELY EQUAL TO
+2246;AL # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247;AL # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+2248;AI # ALMOST EQUAL TO
+2249;AL # NOT ALMOST EQUAL TO
+224A;AL # ALMOST EQUAL OR EQUAL TO
+224B;AL # TRIPLE TILDE
+224C;AI # ALL EQUAL TO
+224D;AL # EQUIVALENT TO
+224E;AL # GEOMETRICALLY EQUIVALENT TO
+224F;AL # DIFFERENCE BETWEEN
+2250;AL # APPROACHES THE LIMIT
+2251;AL # GEOMETRICALLY EQUAL TO
+2252;AI # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253;AL # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254;AL # COLON EQUALS
+2255;AL # EQUALS COLON
+2256;AL # RING IN EQUAL TO
+2257;AL # RING EQUAL TO
+2258;AL # CORRESPONDS TO
+2259;AL # ESTIMATES
+225A;AL # EQUIANGULAR TO
+225B;AL # STAR EQUALS
+225C;AL # DELTA EQUAL TO
+225D;AL # EQUAL TO BY DEFINITION
+225E;AL # MEASURED BY
+225F;AL # QUESTIONED EQUAL TO
+2260;AI # NOT EQUAL TO
+2261;AI # IDENTICAL TO
+2262;AL # NOT IDENTICAL TO
+2263;AL # STRICTLY EQUIVALENT TO
+2264;AI # LESS-THAN OR EQUAL TO
+2265;AI # GREATER-THAN OR EQUAL TO
+2266;AI # LESS-THAN OVER EQUAL TO
+2267;AI # GREATER-THAN OVER EQUAL TO
+2268;AL # LESS-THAN BUT NOT EQUAL TO
+2269;AL # GREATER-THAN BUT NOT EQUAL TO
+226A;AI # MUCH LESS-THAN
+226B;AI # MUCH GREATER-THAN
+226C;AL # BETWEEN
+226D;AL # NOT EQUIVALENT TO
+226E;AI # NOT LESS-THAN
+226F;AI # NOT GREATER-THAN
+2270;AL # NEITHER LESS-THAN NOR EQUAL TO
+2271;AL # NEITHER GREATER-THAN NOR EQUAL TO
+2272;AL # LESS-THAN OR EQUIVALENT TO
+2273;AL # GREATER-THAN OR EQUIVALENT TO
+2274;AL # NEITHER LESS-THAN NOR EQUIVALENT TO
+2275;AL # NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276;AL # LESS-THAN OR GREATER-THAN
+2277;AL # GREATER-THAN OR LESS-THAN
+2278;AL # NEITHER LESS-THAN NOR GREATER-THAN
+2279;AL # NEITHER GREATER-THAN NOR LESS-THAN
+227A;AL # PRECEDES
+227B;AL # SUCCEEDS
+227C;AL # PRECEDES OR EQUAL TO
+227D;AL # SUCCEEDS OR EQUAL TO
+227E;AL # PRECEDES OR EQUIVALENT TO
+227F;AL # SUCCEEDS OR EQUIVALENT TO
+2280;AL # DOES NOT PRECEDE
+2281;AL # DOES NOT SUCCEED
+2282;AI # SUBSET OF
+2283;AI # SUPERSET OF
+2284;AL # NOT A SUBSET OF
+2285;AL # NOT A SUPERSET OF
+2286;AI # SUBSET OF OR EQUAL TO
+2287;AI # SUPERSET OF OR EQUAL TO
+2288;AL # NEITHER A SUBSET OF NOR EQUAL TO
+2289;AL # NEITHER A SUPERSET OF NOR EQUAL TO
+228A;AL # SUBSET OF WITH NOT EQUAL TO
+228B;AL # SUPERSET OF WITH NOT EQUAL TO
+228C;AL # MULTISET
+228D;AL # MULTISET MULTIPLICATION
+228E;AL # MULTISET UNION
+228F;AL # SQUARE IMAGE OF
+2290;AL # SQUARE ORIGINAL OF
+2291;AL # SQUARE IMAGE OF OR EQUAL TO
+2292;AL # SQUARE ORIGINAL OF OR EQUAL TO
+2293;AL # SQUARE CAP
+2294;AL # SQUARE CUP
+2295;AI # CIRCLED PLUS
+2296;AL # CIRCLED MINUS
+2297;AL # CIRCLED TIMES
+2298;AL # CIRCLED DIVISION SLASH
+2299;AI # CIRCLED DOT OPERATOR
+229A;AL # CIRCLED RING OPERATOR
+229B;AL # CIRCLED ASTERISK OPERATOR
+229C;AL # CIRCLED EQUALS
+229D;AL # CIRCLED DASH
+229E;AL # SQUARED PLUS
+229F;AL # SQUARED MINUS
+22A0;AL # SQUARED TIMES
+22A1;AL # SQUARED DOT OPERATOR
+22A2;AL # RIGHT TACK
+22A3;AL # LEFT TACK
+22A4;AL # DOWN TACK
+22A5;AI # UP TACK
+22A6;AL # ASSERTION
+22A7;AL # MODELS
+22A8;AL # TRUE
+22A9;AL # FORCES
+22AA;AL # TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB;AL # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC;AL # DOES NOT PROVE
+22AD;AL # NOT TRUE
+22AE;AL # DOES NOT FORCE
+22AF;AL # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0;AL # PRECEDES UNDER RELATION
+22B1;AL # SUCCEEDS UNDER RELATION
+22B2;AL # NORMAL SUBGROUP OF
+22B3;AL # CONTAINS AS NORMAL SUBGROUP
+22B4;AL # NORMAL SUBGROUP OF OR EQUAL TO
+22B5;AL # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6;AL # ORIGINAL OF
+22B7;AL # IMAGE OF
+22B8;AL # MULTIMAP
+22B9;AL # HERMITIAN CONJUGATE MATRIX
+22BA;AL # INTERCALATE
+22BB;AL # XOR
+22BC;AL # NAND
+22BD;AL # NOR
+22BE;AL # RIGHT ANGLE WITH ARC
+22BF;AI # RIGHT TRIANGLE
+22C0;AL # N-ARY LOGICAL AND
+22C1;AL # N-ARY LOGICAL OR
+22C2;AL # N-ARY INTERSECTION
+22C3;AL # N-ARY UNION
+22C4;AL # DIAMOND OPERATOR
+22C5;AL # DOT OPERATOR
+22C6;AL # STAR OPERATOR
+22C7;AL # DIVISION TIMES
+22C8;AL # BOWTIE
+22C9;AL # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA;AL # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB;AL # LEFT SEMIDIRECT PRODUCT
+22CC;AL # RIGHT SEMIDIRECT PRODUCT
+22CD;AL # REVERSED TILDE EQUALS
+22CE;AL # CURLY LOGICAL OR
+22CF;AL # CURLY LOGICAL AND
+22D0;AL # DOUBLE SUBSET
+22D1;AL # DOUBLE SUPERSET
+22D2;AL # DOUBLE INTERSECTION
+22D3;AL # DOUBLE UNION
+22D4;AL # PITCHFORK
+22D5;AL # EQUAL AND PARALLEL TO
+22D6;AL # LESS-THAN WITH DOT
+22D7;AL # GREATER-THAN WITH DOT
+22D8;AL # VERY MUCH LESS-THAN
+22D9;AL # VERY MUCH GREATER-THAN
+22DA;AL # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB;AL # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC;AL # EQUAL TO OR LESS-THAN
+22DD;AL # EQUAL TO OR GREATER-THAN
+22DE;AL # EQUAL TO OR PRECEDES
+22DF;AL # EQUAL TO OR SUCCEEDS
+22E0;AL # DOES NOT PRECEDE OR EQUAL
+22E1;AL # DOES NOT SUCCEED OR EQUAL
+22E2;AL # NOT SQUARE IMAGE OF OR EQUAL TO
+22E3;AL # NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4;AL # SQUARE IMAGE OF OR NOT EQUAL TO
+22E5;AL # SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6;AL # LESS-THAN BUT NOT EQUIVALENT TO
+22E7;AL # GREATER-THAN BUT NOT EQUIVALENT TO
+22E8;AL # PRECEDES BUT NOT EQUIVALENT TO
+22E9;AL # SUCCEEDS BUT NOT EQUIVALENT TO
+22EA;AL # NOT NORMAL SUBGROUP OF
+22EB;AL # DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC;AL # NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED;AL # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22EE;AL # VERTICAL ELLIPSIS
+22EF;AL # MIDLINE HORIZONTAL ELLIPSIS
+22F0;AL # UP RIGHT DIAGONAL ELLIPSIS
+22F1;AL # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2;AL # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3;AL # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4;AL # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5;AL # ELEMENT OF WITH DOT ABOVE
+22F6;AL # ELEMENT OF WITH OVERBAR
+22F7;AL # SMALL ELEMENT OF WITH OVERBAR
+22F8;AL # ELEMENT OF WITH UNDERBAR
+22F9;AL # ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA;AL # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB;AL # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC;AL # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD;AL # CONTAINS WITH OVERBAR
+22FE;AL # SMALL CONTAINS WITH OVERBAR
+22FF;AL # Z NOTATION BAG MEMBERSHIP
+2300;AL # DIAMETER SIGN
+2301;AL # ELECTRIC ARROW
+2302;AL # HOUSE
+2303;AL # UP ARROWHEAD
+2304;AL # DOWN ARROWHEAD
+2305;AL # PROJECTIVE
+2306;AL # PERSPECTIVE
+2307;AL # WAVY LINE
+2308;AL # LEFT CEILING
+2309;AL # RIGHT CEILING
+230A;AL # LEFT FLOOR
+230B;AL # RIGHT FLOOR
+230C;AL # BOTTOM RIGHT CROP
+230D;AL # BOTTOM LEFT CROP
+230E;AL # TOP RIGHT CROP
+230F;AL # TOP LEFT CROP
+2310;AL # REVERSED NOT SIGN
+2311;AL # SQUARE LOZENGE
+2312;AI # ARC
+2313;AL # SEGMENT
+2314;AL # SECTOR
+2315;AL # TELEPHONE RECORDER
+2316;AL # POSITION INDICATOR
+2317;AL # VIEWDATA SQUARE
+2318;AL # PLACE OF INTEREST SIGN
+2319;AL # TURNED NOT SIGN
+231A;AL # WATCH
+231B;AL # HOURGLASS
+231C;AL # TOP LEFT CORNER
+231D;AL # TOP RIGHT CORNER
+231E;AL # BOTTOM LEFT CORNER
+231F;AL # BOTTOM RIGHT CORNER
+2320;AL # TOP HALF INTEGRAL
+2321;AL # BOTTOM HALF INTEGRAL
+2322;AL # FROWN
+2323;AL # SMILE
+2324;AL # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325;AL # OPTION KEY
+2326;AL # ERASE TO THE RIGHT
+2327;AL # X IN A RECTANGLE BOX
+2328;AL # KEYBOARD
+2329;OP # LEFT-POINTING ANGLE BRACKET
+232A;CL # RIGHT-POINTING ANGLE BRACKET
+232B;AL # ERASE TO THE LEFT
+232C;AL # BENZENE RING
+232D;AL # CYLINDRICITY
+232E;AL # ALL AROUND-PROFILE
+232F;AL # SYMMETRY
+2330;AL # TOTAL RUNOUT
+2331;AL # DIMENSION ORIGIN
+2332;AL # CONICAL TAPER
+2333;AL # SLOPE
+2334;AL # COUNTERBORE
+2335;AL # COUNTERSINK
+2336;AL # APL FUNCTIONAL SYMBOL I-BEAM
+2337;AL # APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338;AL # APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339;AL # APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A;AL # APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B;AL # APL FUNCTIONAL SYMBOL QUAD JOT
+233C;AL # APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D;AL # APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E;AL # APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F;AL # APL FUNCTIONAL SYMBOL SLASH BAR
+2340;AL # APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341;AL # APL FUNCTIONAL SYMBOL QUAD SLASH
+2342;AL # APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343;AL # APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344;AL # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345;AL # APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346;AL # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347;AL # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348;AL # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349;AL # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A;AL # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B;AL # APL FUNCTIONAL SYMBOL DELTA STILE
+234C;AL # APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D;AL # APL FUNCTIONAL SYMBOL QUAD DELTA
+234E;AL # APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F;AL # APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350;AL # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351;AL # APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352;AL # APL FUNCTIONAL SYMBOL DEL STILE
+2353;AL # APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354;AL # APL FUNCTIONAL SYMBOL QUAD DEL
+2355;AL # APL FUNCTIONAL SYMBOL UP TACK JOT
+2356;AL # APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357;AL # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358;AL # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359;AL # APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A;AL # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B;AL # APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C;AL # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D;AL # APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E;AL # APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F;AL # APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360;AL # APL FUNCTIONAL SYMBOL QUAD COLON
+2361;AL # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362;AL # APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363;AL # APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364;AL # APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365;AL # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366;AL # APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367;AL # APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368;AL # APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369;AL # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A;AL # APL FUNCTIONAL SYMBOL COMMA BAR
+236B;AL # APL FUNCTIONAL SYMBOL DEL TILDE
+236C;AL # APL FUNCTIONAL SYMBOL ZILDE
+236D;AL # APL FUNCTIONAL SYMBOL STILE TILDE
+236E;AL # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F;AL # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370;AL # APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371;AL # APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372;AL # APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373;AL # APL FUNCTIONAL SYMBOL IOTA
+2374;AL # APL FUNCTIONAL SYMBOL RHO
+2375;AL # APL FUNCTIONAL SYMBOL OMEGA
+2376;AL # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377;AL # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378;AL # APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379;AL # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A;AL # APL FUNCTIONAL SYMBOL ALPHA
+237B;AL # NOT CHECK MARK
+237C;AL # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D;AL # SHOULDERED OPEN BOX
+237E;AL # BELL SYMBOL
+237F;AL # VERTICAL LINE WITH MIDDLE DOT
+2380;AL # INSERTION SYMBOL
+2381;AL # CONTINUOUS UNDERLINE SYMBOL
+2382;AL # DISCONTINUOUS UNDERLINE SYMBOL
+2383;AL # EMPHASIS SYMBOL
+2384;AL # COMPOSITION SYMBOL
+2385;AL # WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386;AL # ENTER SYMBOL
+2387;AL # ALTERNATIVE KEY SYMBOL
+2388;AL # HELM SYMBOL
+2389;AL # CIRCLED HORIZONTAL BAR WITH NOTCH
+238A;AL # CIRCLED TRIANGLE DOWN
+238B;AL # BROKEN CIRCLE WITH NORTHWEST ARROW
+238C;AL # UNDO SYMBOL
+238D;AL # MONOSTABLE SYMBOL
+238E;AL # HYSTERESIS SYMBOL
+238F;AL # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390;AL # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391;AL # PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392;AL # PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393;AL # DIRECT CURRENT SYMBOL FORM TWO
+2394;AL # SOFTWARE-FUNCTION SYMBOL
+2395;AL # APL FUNCTIONAL SYMBOL QUAD
+2396;AL # DECIMAL SEPARATOR KEY SYMBOL
+2397;AL # PREVIOUS PAGE
+2398;AL # NEXT PAGE
+2399;AL # PRINT SCREEN SYMBOL
+239A;AL # CLEAR SCREEN SYMBOL
+239B;AL # LEFT PARENTHESIS UPPER HOOK
+239C;AL # LEFT PARENTHESIS EXTENSION
+239D;AL # LEFT PARENTHESIS LOWER HOOK
+239E;AL # RIGHT PARENTHESIS UPPER HOOK
+239F;AL # RIGHT PARENTHESIS EXTENSION
+23A0;AL # RIGHT PARENTHESIS LOWER HOOK
+23A1;AL # LEFT SQUARE BRACKET UPPER CORNER
+23A2;AL # LEFT SQUARE BRACKET EXTENSION
+23A3;AL # LEFT SQUARE BRACKET LOWER CORNER
+23A4;AL # RIGHT SQUARE BRACKET UPPER CORNER
+23A5;AL # RIGHT SQUARE BRACKET EXTENSION
+23A6;AL # RIGHT SQUARE BRACKET LOWER CORNER
+23A7;AL # LEFT CURLY BRACKET UPPER HOOK
+23A8;AL # LEFT CURLY BRACKET MIDDLE PIECE
+23A9;AL # LEFT CURLY BRACKET LOWER HOOK
+23AA;AL # CURLY BRACKET EXTENSION
+23AB;AL # RIGHT CURLY BRACKET UPPER HOOK
+23AC;AL # RIGHT CURLY BRACKET MIDDLE PIECE
+23AD;AL # RIGHT CURLY BRACKET LOWER HOOK
+23AE;AL # INTEGRAL EXTENSION
+23AF;AL # HORIZONTAL LINE EXTENSION
+23B0;AL # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+23B1;AL # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+23B2;AL # SUMMATION TOP
+23B3;AL # SUMMATION BOTTOM
+23B4;OP # TOP SQUARE BRACKET
+23B5;CL # BOTTOM SQUARE BRACKET
+23B6;QU # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7;AL # RADICAL SYMBOL BOTTOM
+23B8;AL # LEFT VERTICAL BOX LINE
+23B9;AL # RIGHT VERTICAL BOX LINE
+23BA;AL # HORIZONTAL SCAN LINE-1
+23BB;AL # HORIZONTAL SCAN LINE-3
+23BC;AL # HORIZONTAL SCAN LINE-7
+23BD;AL # HORIZONTAL SCAN LINE-9
+23BE;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+23BF;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+23C0;AL # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3;AL # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9;AL # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+23CA;AL # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+23CB;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+23CC;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+23CD;AL # SQUARE FOOT
+23CE;AL # RETURN SYMBOL
+23CF;AL # EJECT SYMBOL
+23D0;AL # VERTICAL LINE EXTENSION
+23D1;AL # METRICAL BREVE
+23D2;AL # METRICAL LONG OVER SHORT
+23D3;AL # METRICAL SHORT OVER LONG
+23D4;AL # METRICAL LONG OVER TWO SHORTS
+23D5;AL # METRICAL TWO SHORTS OVER LONG
+23D6;AL # METRICAL TWO SHORTS JOINED
+23D7;AL # METRICAL TRISEME
+23D8;AL # METRICAL TETRASEME
+23D9;AL # METRICAL PENTASEME
+23DA;AL # EARTH GROUND
+23DB;AL # FUSE
+2400;AL # SYMBOL FOR NULL
+2401;AL # SYMBOL FOR START OF HEADING
+2402;AL # SYMBOL FOR START OF TEXT
+2403;AL # SYMBOL FOR END OF TEXT
+2404;AL # SYMBOL FOR END OF TRANSMISSION
+2405;AL # SYMBOL FOR ENQUIRY
+2406;AL # SYMBOL FOR ACKNOWLEDGE
+2407;AL # SYMBOL FOR BELL
+2408;AL # SYMBOL FOR BACKSPACE
+2409;AL # SYMBOL FOR HORIZONTAL TABULATION
+240A;AL # SYMBOL FOR LINE FEED
+240B;AL # SYMBOL FOR VERTICAL TABULATION
+240C;AL # SYMBOL FOR FORM FEED
+240D;AL # SYMBOL FOR CARRIAGE RETURN
+240E;AL # SYMBOL FOR SHIFT OUT
+240F;AL # SYMBOL FOR SHIFT IN
+2410;AL # SYMBOL FOR DATA LINK ESCAPE
+2411;AL # SYMBOL FOR DEVICE CONTROL ONE
+2412;AL # SYMBOL FOR DEVICE CONTROL TWO
+2413;AL # SYMBOL FOR DEVICE CONTROL THREE
+2414;AL # SYMBOL FOR DEVICE CONTROL FOUR
+2415;AL # SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416;AL # SYMBOL FOR SYNCHRONOUS IDLE
+2417;AL # SYMBOL FOR END OF TRANSMISSION BLOCK
+2418;AL # SYMBOL FOR CANCEL
+2419;AL # SYMBOL FOR END OF MEDIUM
+241A;AL # SYMBOL FOR SUBSTITUTE
+241B;AL # SYMBOL FOR ESCAPE
+241C;AL # SYMBOL FOR FILE SEPARATOR
+241D;AL # SYMBOL FOR GROUP SEPARATOR
+241E;AL # SYMBOL FOR RECORD SEPARATOR
+241F;AL # SYMBOL FOR UNIT SEPARATOR
+2420;AL # SYMBOL FOR SPACE
+2421;AL # SYMBOL FOR DELETE
+2422;AL # BLANK SYMBOL
+2423;AL # OPEN BOX
+2424;AL # SYMBOL FOR NEWLINE
+2425;AL # SYMBOL FOR DELETE FORM TWO
+2426;AL # SYMBOL FOR SUBSTITUTE FORM TWO
+2440;AL # OCR HOOK
+2441;AL # OCR CHAIR
+2442;AL # OCR FORK
+2443;AL # OCR INVERTED FORK
+2444;AL # OCR BELT BUCKLE
+2445;AL # OCR BOW TIE
+2446;AL # OCR BRANCH BANK IDENTIFICATION
+2447;AL # OCR AMOUNT OF CHECK
+2448;AL # OCR DASH
+2449;AL # OCR CUSTOMER ACCOUNT NUMBER
+244A;AL # OCR DOUBLE BACKSLASH
+2460;AI # CIRCLED DIGIT ONE
+2461;AI # CIRCLED DIGIT TWO
+2462;AI # CIRCLED DIGIT THREE
+2463;AI # CIRCLED DIGIT FOUR
+2464;AI # CIRCLED DIGIT FIVE
+2465;AI # CIRCLED DIGIT SIX
+2466;AI # CIRCLED DIGIT SEVEN
+2467;AI # CIRCLED DIGIT EIGHT
+2468;AI # CIRCLED DIGIT NINE
+2469;AI # CIRCLED NUMBER TEN
+246A;AI # CIRCLED NUMBER ELEVEN
+246B;AI # CIRCLED NUMBER TWELVE
+246C;AI # CIRCLED NUMBER THIRTEEN
+246D;AI # CIRCLED NUMBER FOURTEEN
+246E;AI # CIRCLED NUMBER FIFTEEN
+246F;AI # CIRCLED NUMBER SIXTEEN
+2470;AI # CIRCLED NUMBER SEVENTEEN
+2471;AI # CIRCLED NUMBER EIGHTEEN
+2472;AI # CIRCLED NUMBER NINETEEN
+2473;AI # CIRCLED NUMBER TWENTY
+2474;AI # PARENTHESIZED DIGIT ONE
+2475;AI # PARENTHESIZED DIGIT TWO
+2476;AI # PARENTHESIZED DIGIT THREE
+2477;AI # PARENTHESIZED DIGIT FOUR
+2478;AI # PARENTHESIZED DIGIT FIVE
+2479;AI # PARENTHESIZED DIGIT SIX
+247A;AI # PARENTHESIZED DIGIT SEVEN
+247B;AI # PARENTHESIZED DIGIT EIGHT
+247C;AI # PARENTHESIZED DIGIT NINE
+247D;AI # PARENTHESIZED NUMBER TEN
+247E;AI # PARENTHESIZED NUMBER ELEVEN
+247F;AI # PARENTHESIZED NUMBER TWELVE
+2480;AI # PARENTHESIZED NUMBER THIRTEEN
+2481;AI # PARENTHESIZED NUMBER FOURTEEN
+2482;AI # PARENTHESIZED NUMBER FIFTEEN
+2483;AI # PARENTHESIZED NUMBER SIXTEEN
+2484;AI # PARENTHESIZED NUMBER SEVENTEEN
+2485;AI # PARENTHESIZED NUMBER EIGHTEEN
+2486;AI # PARENTHESIZED NUMBER NINETEEN
+2487;AI # PARENTHESIZED NUMBER TWENTY
+2488;AI # DIGIT ONE FULL STOP
+2489;AI # DIGIT TWO FULL STOP
+248A;AI # DIGIT THREE FULL STOP
+248B;AI # DIGIT FOUR FULL STOP
+248C;AI # DIGIT FIVE FULL STOP
+248D;AI # DIGIT SIX FULL STOP
+248E;AI # DIGIT SEVEN FULL STOP
+248F;AI # DIGIT EIGHT FULL STOP
+2490;AI # DIGIT NINE FULL STOP
+2491;AI # NUMBER TEN FULL STOP
+2492;AI # NUMBER ELEVEN FULL STOP
+2493;AI # NUMBER TWELVE FULL STOP
+2494;AI # NUMBER THIRTEEN FULL STOP
+2495;AI # NUMBER FOURTEEN FULL STOP
+2496;AI # NUMBER FIFTEEN FULL STOP
+2497;AI # NUMBER SIXTEEN FULL STOP
+2498;AI # NUMBER SEVENTEEN FULL STOP
+2499;AI # NUMBER EIGHTEEN FULL STOP
+249A;AI # NUMBER NINETEEN FULL STOP
+249B;AI # NUMBER TWENTY FULL STOP
+249C;AI # PARENTHESIZED LATIN SMALL LETTER A
+249D;AI # PARENTHESIZED LATIN SMALL LETTER B
+249E;AI # PARENTHESIZED LATIN SMALL LETTER C
+249F;AI # PARENTHESIZED LATIN SMALL LETTER D
+24A0;AI # PARENTHESIZED LATIN SMALL LETTER E
+24A1;AI # PARENTHESIZED LATIN SMALL LETTER F
+24A2;AI # PARENTHESIZED LATIN SMALL LETTER G
+24A3;AI # PARENTHESIZED LATIN SMALL LETTER H
+24A4;AI # PARENTHESIZED LATIN SMALL LETTER I
+24A5;AI # PARENTHESIZED LATIN SMALL LETTER J
+24A6;AI # PARENTHESIZED LATIN SMALL LETTER K
+24A7;AI # PARENTHESIZED LATIN SMALL LETTER L
+24A8;AI # PARENTHESIZED LATIN SMALL LETTER M
+24A9;AI # PARENTHESIZED LATIN SMALL LETTER N
+24AA;AI # PARENTHESIZED LATIN SMALL LETTER O
+24AB;AI # PARENTHESIZED LATIN SMALL LETTER P
+24AC;AI # PARENTHESIZED LATIN SMALL LETTER Q
+24AD;AI # PARENTHESIZED LATIN SMALL LETTER R
+24AE;AI # PARENTHESIZED LATIN SMALL LETTER S
+24AF;AI # PARENTHESIZED LATIN SMALL LETTER T
+24B0;AI # PARENTHESIZED LATIN SMALL LETTER U
+24B1;AI # PARENTHESIZED LATIN SMALL LETTER V
+24B2;AI # PARENTHESIZED LATIN SMALL LETTER W
+24B3;AI # PARENTHESIZED LATIN SMALL LETTER X
+24B4;AI # PARENTHESIZED LATIN SMALL LETTER Y
+24B5;AI # PARENTHESIZED LATIN SMALL LETTER Z
+24B6;AI # CIRCLED LATIN CAPITAL LETTER A
+24B7;AI # CIRCLED LATIN CAPITAL LETTER B
+24B8;AI # CIRCLED LATIN CAPITAL LETTER C
+24B9;AI # CIRCLED LATIN CAPITAL LETTER D
+24BA;AI # CIRCLED LATIN CAPITAL LETTER E
+24BB;AI # CIRCLED LATIN CAPITAL LETTER F
+24BC;AI # CIRCLED LATIN CAPITAL LETTER G
+24BD;AI # CIRCLED LATIN CAPITAL LETTER H
+24BE;AI # CIRCLED LATIN CAPITAL LETTER I
+24BF;AI # CIRCLED LATIN CAPITAL LETTER J
+24C0;AI # CIRCLED LATIN CAPITAL LETTER K
+24C1;AI # CIRCLED LATIN CAPITAL LETTER L
+24C2;AI # CIRCLED LATIN CAPITAL LETTER M
+24C3;AI # CIRCLED LATIN CAPITAL LETTER N
+24C4;AI # CIRCLED LATIN CAPITAL LETTER O
+24C5;AI # CIRCLED LATIN CAPITAL LETTER P
+24C6;AI # CIRCLED LATIN CAPITAL LETTER Q
+24C7;AI # CIRCLED LATIN CAPITAL LETTER R
+24C8;AI # CIRCLED LATIN CAPITAL LETTER S
+24C9;AI # CIRCLED LATIN CAPITAL LETTER T
+24CA;AI # CIRCLED LATIN CAPITAL LETTER U
+24CB;AI # CIRCLED LATIN CAPITAL LETTER V
+24CC;AI # CIRCLED LATIN CAPITAL LETTER W
+24CD;AI # CIRCLED LATIN CAPITAL LETTER X
+24CE;AI # CIRCLED LATIN CAPITAL LETTER Y
+24CF;AI # CIRCLED LATIN CAPITAL LETTER Z
+24D0;AI # CIRCLED LATIN SMALL LETTER A
+24D1;AI # CIRCLED LATIN SMALL LETTER B
+24D2;AI # CIRCLED LATIN SMALL LETTER C
+24D3;AI # CIRCLED LATIN SMALL LETTER D
+24D4;AI # CIRCLED LATIN SMALL LETTER E
+24D5;AI # CIRCLED LATIN SMALL LETTER F
+24D6;AI # CIRCLED LATIN SMALL LETTER G
+24D7;AI # CIRCLED LATIN SMALL LETTER H
+24D8;AI # CIRCLED LATIN SMALL LETTER I
+24D9;AI # CIRCLED LATIN SMALL LETTER J
+24DA;AI # CIRCLED LATIN SMALL LETTER K
+24DB;AI # CIRCLED LATIN SMALL LETTER L
+24DC;AI # CIRCLED LATIN SMALL LETTER M
+24DD;AI # CIRCLED LATIN SMALL LETTER N
+24DE;AI # CIRCLED LATIN SMALL LETTER O
+24DF;AI # CIRCLED LATIN SMALL LETTER P
+24E0;AI # CIRCLED LATIN SMALL LETTER Q
+24E1;AI # CIRCLED LATIN SMALL LETTER R
+24E2;AI # CIRCLED LATIN SMALL LETTER S
+24E3;AI # CIRCLED LATIN SMALL LETTER T
+24E4;AI # CIRCLED LATIN SMALL LETTER U
+24E5;AI # CIRCLED LATIN SMALL LETTER V
+24E6;AI # CIRCLED LATIN SMALL LETTER W
+24E7;AI # CIRCLED LATIN SMALL LETTER X
+24E8;AI # CIRCLED LATIN SMALL LETTER Y
+24E9;AI # CIRCLED LATIN SMALL LETTER Z
+24EA;AI # CIRCLED DIGIT ZERO
+24EB;AI # NEGATIVE CIRCLED NUMBER ELEVEN
+24EC;AI # NEGATIVE CIRCLED NUMBER TWELVE
+24ED;AI # NEGATIVE CIRCLED NUMBER THIRTEEN
+24EE;AI # NEGATIVE CIRCLED NUMBER FOURTEEN
+24EF;AI # NEGATIVE CIRCLED NUMBER FIFTEEN
+24F0;AI # NEGATIVE CIRCLED NUMBER SIXTEEN
+24F1;AI # NEGATIVE CIRCLED NUMBER SEVENTEEN
+24F2;AI # NEGATIVE CIRCLED NUMBER EIGHTEEN
+24F3;AI # NEGATIVE CIRCLED NUMBER NINETEEN
+24F4;AI # NEGATIVE CIRCLED NUMBER TWENTY
+24F5;AI # DOUBLE CIRCLED DIGIT ONE
+24F6;AI # DOUBLE CIRCLED DIGIT TWO
+24F7;AI # DOUBLE CIRCLED DIGIT THREE
+24F8;AI # DOUBLE CIRCLED DIGIT FOUR
+24F9;AI # DOUBLE CIRCLED DIGIT FIVE
+24FA;AI # DOUBLE CIRCLED DIGIT SIX
+24FB;AI # DOUBLE CIRCLED DIGIT SEVEN
+24FC;AI # DOUBLE CIRCLED DIGIT EIGHT
+24FD;AI # DOUBLE CIRCLED DIGIT NINE
+24FE;AI # DOUBLE CIRCLED NUMBER TEN
+24FF;AL # NEGATIVE CIRCLED DIGIT ZERO
+2500;AI # BOX DRAWINGS LIGHT HORIZONTAL
+2501;AI # BOX DRAWINGS HEAVY HORIZONTAL
+2502;AI # BOX DRAWINGS LIGHT VERTICAL
+2503;AI # BOX DRAWINGS HEAVY VERTICAL
+2504;AI # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505;AI # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506;AI # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507;AI # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508;AI # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509;AI # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A;AI # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B;AI # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C;AI # BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D;AI # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E;AI # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F;AI # BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510;AI # BOX DRAWINGS LIGHT DOWN AND LEFT
+2511;AI # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512;AI # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513;AI # BOX DRAWINGS HEAVY DOWN AND LEFT
+2514;AI # BOX DRAWINGS LIGHT UP AND RIGHT
+2515;AI # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516;AI # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517;AI # BOX DRAWINGS HEAVY UP AND RIGHT
+2518;AI # BOX DRAWINGS LIGHT UP AND LEFT
+2519;AI # BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A;AI # BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B;AI # BOX DRAWINGS HEAVY UP AND LEFT
+251C;AI # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D;AI # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E;AI # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F;AI # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520;AI # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521;AI # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522;AI # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523;AI # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524;AI # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525;AI # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526;AI # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527;AI # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528;AI # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529;AI # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A;AI # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B;AI # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C;AI # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D;AI # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E;AI # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F;AI # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530;AI # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531;AI # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532;AI # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533;AI # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534;AI # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535;AI # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536;AI # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537;AI # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538;AI # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539;AI # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A;AI # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B;AI # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C;AI # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D;AI # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E;AI # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F;AI # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540;AI # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541;AI # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542;AI # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543;AI # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544;AI # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545;AI # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546;AI # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547;AI # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548;AI # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549;AI # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A;AI # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B;AI # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C;AL # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D;AL # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E;AL # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F;AL # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550;AI # BOX DRAWINGS DOUBLE HORIZONTAL
+2551;AI # BOX DRAWINGS DOUBLE VERTICAL
+2552;AI # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553;AI # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554;AI # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555;AI # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556;AI # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557;AI # BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558;AI # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559;AI # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A;AI # BOX DRAWINGS DOUBLE UP AND RIGHT
+255B;AI # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C;AI # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D;AI # BOX DRAWINGS DOUBLE UP AND LEFT
+255E;AI # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F;AI # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560;AI # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561;AI # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562;AI # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563;AI # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564;AI # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565;AI # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566;AI # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567;AI # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568;AI # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569;AI # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A;AI # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B;AI # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C;AI # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D;AI # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E;AI # BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F;AI # BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570;AI # BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571;AI # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572;AI # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573;AI # BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574;AI # BOX DRAWINGS LIGHT LEFT
+2575;AL # BOX DRAWINGS LIGHT UP
+2576;AL # BOX DRAWINGS LIGHT RIGHT
+2577;AL # BOX DRAWINGS LIGHT DOWN
+2578;AL # BOX DRAWINGS HEAVY LEFT
+2579;AL # BOX DRAWINGS HEAVY UP
+257A;AL # BOX DRAWINGS HEAVY RIGHT
+257B;AL # BOX DRAWINGS HEAVY DOWN
+257C;AL # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D;AL # BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E;AL # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F;AL # BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580;AI # UPPER HALF BLOCK
+2581;AI # LOWER ONE EIGHTH BLOCK
+2582;AI # LOWER ONE QUARTER BLOCK
+2583;AI # LOWER THREE EIGHTHS BLOCK
+2584;AI # LOWER HALF BLOCK
+2585;AI # LOWER FIVE EIGHTHS BLOCK
+2586;AI # LOWER THREE QUARTERS BLOCK
+2587;AI # LOWER SEVEN EIGHTHS BLOCK
+2588;AI # FULL BLOCK
+2589;AI # LEFT SEVEN EIGHTHS BLOCK
+258A;AI # LEFT THREE QUARTERS BLOCK
+258B;AI # LEFT FIVE EIGHTHS BLOCK
+258C;AI # LEFT HALF BLOCK
+258D;AI # LEFT THREE EIGHTHS BLOCK
+258E;AI # LEFT ONE QUARTER BLOCK
+258F;AI # LEFT ONE EIGHTH BLOCK
+2590;AL # RIGHT HALF BLOCK
+2591;AL # LIGHT SHADE
+2592;AI # MEDIUM SHADE
+2593;AI # DARK SHADE
+2594;AI # UPPER ONE EIGHTH BLOCK
+2595;AI # RIGHT ONE EIGHTH BLOCK
+2596;AL # QUADRANT LOWER LEFT
+2597;AL # QUADRANT LOWER RIGHT
+2598;AL # QUADRANT UPPER LEFT
+2599;AL # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A;AL # QUADRANT UPPER LEFT AND LOWER RIGHT
+259B;AL # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C;AL # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D;AL # QUADRANT UPPER RIGHT
+259E;AL # QUADRANT UPPER RIGHT AND LOWER LEFT
+259F;AL # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0;AI # BLACK SQUARE
+25A1;AI # WHITE SQUARE
+25A2;AL # WHITE SQUARE WITH ROUNDED CORNERS
+25A3;AI # WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4;AI # SQUARE WITH HORIZONTAL FILL
+25A5;AI # SQUARE WITH VERTICAL FILL
+25A6;AI # SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7;AI # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8;AI # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9;AI # SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA;AL # BLACK SMALL SQUARE
+25AB;AL # WHITE SMALL SQUARE
+25AC;AL # BLACK RECTANGLE
+25AD;AL # WHITE RECTANGLE
+25AE;AL # BLACK VERTICAL RECTANGLE
+25AF;AL # WHITE VERTICAL RECTANGLE
+25B0;AL # BLACK PARALLELOGRAM
+25B1;AL # WHITE PARALLELOGRAM
+25B2;AI # BLACK UP-POINTING TRIANGLE
+25B3;AI # WHITE UP-POINTING TRIANGLE
+25B4;AL # BLACK UP-POINTING SMALL TRIANGLE
+25B5;AL # WHITE UP-POINTING SMALL TRIANGLE
+25B6;AI # BLACK RIGHT-POINTING TRIANGLE
+25B7;AI # WHITE RIGHT-POINTING TRIANGLE
+25B8;AL # BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9;AL # WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA;AL # BLACK RIGHT-POINTING POINTER
+25BB;AL # WHITE RIGHT-POINTING POINTER
+25BC;AI # BLACK DOWN-POINTING TRIANGLE
+25BD;AI # WHITE DOWN-POINTING TRIANGLE
+25BE;AL # BLACK DOWN-POINTING SMALL TRIANGLE
+25BF;AL # WHITE DOWN-POINTING SMALL TRIANGLE
+25C0;AI # BLACK LEFT-POINTING TRIANGLE
+25C1;AI # WHITE LEFT-POINTING TRIANGLE
+25C2;AL # BLACK LEFT-POINTING SMALL TRIANGLE
+25C3;AL # WHITE LEFT-POINTING SMALL TRIANGLE
+25C4;AL # BLACK LEFT-POINTING POINTER
+25C5;AL # WHITE LEFT-POINTING POINTER
+25C6;AI # BLACK DIAMOND
+25C7;AI # WHITE DIAMOND
+25C8;AI # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9;AL # FISHEYE
+25CA;AL # LOZENGE
+25CB;AI # WHITE CIRCLE
+25CC;AL # DOTTED CIRCLE
+25CD;AL # CIRCLE WITH VERTICAL FILL
+25CE;AI # BULLSEYE
+25CF;AI # BLACK CIRCLE
+25D0;AI # CIRCLE WITH LEFT HALF BLACK
+25D1;AI # CIRCLE WITH RIGHT HALF BLACK
+25D2;AL # CIRCLE WITH LOWER HALF BLACK
+25D3;AL # CIRCLE WITH UPPER HALF BLACK
+25D4;AL # CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5;AL # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6;AL # LEFT HALF BLACK CIRCLE
+25D7;AL # RIGHT HALF BLACK CIRCLE
+25D8;AL # INVERSE BULLET
+25D9;AL # INVERSE WHITE CIRCLE
+25DA;AL # UPPER HALF INVERSE WHITE CIRCLE
+25DB;AL # LOWER HALF INVERSE WHITE CIRCLE
+25DC;AL # UPPER LEFT QUADRANT CIRCULAR ARC
+25DD;AL # UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE;AL # LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF;AL # LOWER LEFT QUADRANT CIRCULAR ARC
+25E0;AL # UPPER HALF CIRCLE
+25E1;AL # LOWER HALF CIRCLE
+25E2;AI # BLACK LOWER RIGHT TRIANGLE
+25E3;AI # BLACK LOWER LEFT TRIANGLE
+25E4;AI # BLACK UPPER LEFT TRIANGLE
+25E5;AI # BLACK UPPER RIGHT TRIANGLE
+25E6;AL # WHITE BULLET
+25E7;AL # SQUARE WITH LEFT HALF BLACK
+25E8;AL # SQUARE WITH RIGHT HALF BLACK
+25E9;AL # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA;AL # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB;AL # WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC;AL # WHITE UP-POINTING TRIANGLE WITH DOT
+25ED;AL # UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE;AL # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF;AI # LARGE CIRCLE
+25F0;AL # WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1;AL # WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2;AL # WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3;AL # WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4;AL # WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5;AL # WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6;AL # WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7;AL # WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8;AL # UPPER LEFT TRIANGLE
+25F9;AL # UPPER RIGHT TRIANGLE
+25FA;AL # LOWER LEFT TRIANGLE
+25FB;AL # WHITE MEDIUM SQUARE
+25FC;AL # BLACK MEDIUM SQUARE
+25FD;AL # WHITE MEDIUM SMALL SQUARE
+25FE;AL # BLACK MEDIUM SMALL SQUARE
+25FF;AL # LOWER RIGHT TRIANGLE
+2600;AL # BLACK SUN WITH RAYS
+2601;AL # CLOUD
+2602;AL # UMBRELLA
+2603;AL # SNOWMAN
+2604;AL # COMET
+2605;AI # BLACK STAR
+2606;AI # WHITE STAR
+2607;AL # LIGHTNING
+2608;AL # THUNDERSTORM
+2609;AI # SUN
+260A;AL # ASCENDING NODE
+260B;AL # DESCENDING NODE
+260C;AL # CONJUNCTION
+260D;AL # OPPOSITION
+260E;AI # BLACK TELEPHONE
+260F;AI # WHITE TELEPHONE
+2610;AL # BALLOT BOX
+2611;AL # BALLOT BOX WITH CHECK
+2612;AL # BALLOT BOX WITH X
+2613;AL # SALTIRE
+2614;AI # UMBRELLA WITH RAIN DROPS
+2615;AI # HOT BEVERAGE
+2616;AI # WHITE SHOGI PIECE
+2617;AI # BLACK SHOGI PIECE
+2618;AL # SHAMROCK
+2619;AL # REVERSED ROTATED FLORAL HEART BULLET
+261A;AL # BLACK LEFT POINTING INDEX
+261B;AL # BLACK RIGHT POINTING INDEX
+261C;AI # WHITE LEFT POINTING INDEX
+261D;AL # WHITE UP POINTING INDEX
+261E;AI # WHITE RIGHT POINTING INDEX
+261F;AL # WHITE DOWN POINTING INDEX
+2620;AL # SKULL AND CROSSBONES
+2621;AL # CAUTION SIGN
+2622;AL # RADIOACTIVE SIGN
+2623;AL # BIOHAZARD SIGN
+2624;AL # CADUCEUS
+2625;AL # ANKH
+2626;AL # ORTHODOX CROSS
+2627;AL # CHI RHO
+2628;AL # CROSS OF LORRAINE
+2629;AL # CROSS OF JERUSALEM
+262A;AL # STAR AND CRESCENT
+262B;AL # FARSI SYMBOL
+262C;AL # ADI SHAKTI
+262D;AL # HAMMER AND SICKLE
+262E;AL # PEACE SYMBOL
+262F;AL # YIN YANG
+2630;AL # TRIGRAM FOR HEAVEN
+2631;AL # TRIGRAM FOR LAKE
+2632;AL # TRIGRAM FOR FIRE
+2633;AL # TRIGRAM FOR THUNDER
+2634;AL # TRIGRAM FOR WIND
+2635;AL # TRIGRAM FOR WATER
+2636;AL # TRIGRAM FOR MOUNTAIN
+2637;AL # TRIGRAM FOR EARTH
+2638;AL # WHEEL OF DHARMA
+2639;AL # WHITE FROWNING FACE
+263A;AL # WHITE SMILING FACE
+263B;AL # BLACK SMILING FACE
+263C;AL # WHITE SUN WITH RAYS
+263D;AL # FIRST QUARTER MOON
+263E;AL # LAST QUARTER MOON
+263F;AL # MERCURY
+2640;AI # FEMALE SIGN
+2641;AL # EARTH
+2642;AI # MALE SIGN
+2643;AL # JUPITER
+2644;AL # SATURN
+2645;AL # URANUS
+2646;AL # NEPTUNE
+2647;AL # PLUTO
+2648;AL # ARIES
+2649;AL # TAURUS
+264A;AL # GEMINI
+264B;AL # CANCER
+264C;AL # LEO
+264D;AL # VIRGO
+264E;AL # LIBRA
+264F;AL # SCORPIUS
+2650;AL # SAGITTARIUS
+2651;AL # CAPRICORN
+2652;AL # AQUARIUS
+2653;AL # PISCES
+2654;AL # WHITE CHESS KING
+2655;AL # WHITE CHESS QUEEN
+2656;AL # WHITE CHESS ROOK
+2657;AL # WHITE CHESS BISHOP
+2658;AL # WHITE CHESS KNIGHT
+2659;AL # WHITE CHESS PAWN
+265A;AL # BLACK CHESS KING
+265B;AL # BLACK CHESS QUEEN
+265C;AL # BLACK CHESS ROOK
+265D;AL # BLACK CHESS BISHOP
+265E;AL # BLACK CHESS KNIGHT
+265F;AL # BLACK CHESS PAWN
+2660;AI # BLACK SPADE SUIT
+2661;AI # WHITE HEART SUIT
+2662;AL # WHITE DIAMOND SUIT
+2663;AI # BLACK CLUB SUIT
+2664;AI # WHITE SPADE SUIT
+2665;AI # BLACK HEART SUIT
+2666;AL # BLACK DIAMOND SUIT
+2667;AI # WHITE CLUB SUIT
+2668;AI # HOT SPRINGS
+2669;AI # QUARTER NOTE
+266A;AI # EIGHTH NOTE
+266B;AL # BEAMED EIGHTH NOTES
+266C;AI # BEAMED SIXTEENTH NOTES
+266D;AI # MUSIC FLAT SIGN
+266E;AL # MUSIC NATURAL SIGN
+266F;AI # MUSIC SHARP SIGN
+2670;AL # WEST SYRIAC CROSS
+2671;AL # EAST SYRIAC CROSS
+2672;AL # UNIVERSAL RECYCLING SYMBOL
+2673;AL # RECYCLING SYMBOL FOR TYPE-1 PLASTICS
+2674;AL # RECYCLING SYMBOL FOR TYPE-2 PLASTICS
+2675;AL # RECYCLING SYMBOL FOR TYPE-3 PLASTICS
+2676;AL # RECYCLING SYMBOL FOR TYPE-4 PLASTICS
+2677;AL # RECYCLING SYMBOL FOR TYPE-5 PLASTICS
+2678;AL # RECYCLING SYMBOL FOR TYPE-6 PLASTICS
+2679;AL # RECYCLING SYMBOL FOR TYPE-7 PLASTICS
+267A;AL # RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B;AL # BLACK UNIVERSAL RECYCLING SYMBOL
+267C;AL # RECYCLED PAPER SYMBOL
+267D;AL # PARTIALLY-RECYCLED PAPER SYMBOL
+267E;AL # PERMANENT PAPER SIGN
+267F;AL # WHEELCHAIR SYMBOL
+2680;AL # DIE FACE-1
+2681;AL # DIE FACE-2
+2682;AL # DIE FACE-3
+2683;AL # DIE FACE-4
+2684;AL # DIE FACE-5
+2685;AL # DIE FACE-6
+2686;AL # WHITE CIRCLE WITH DOT RIGHT
+2687;AL # WHITE CIRCLE WITH TWO DOTS
+2688;AL # BLACK CIRCLE WITH WHITE DOT RIGHT
+2689;AL # BLACK CIRCLE WITH TWO WHITE DOTS
+268A;AL # MONOGRAM FOR YANG
+268B;AL # MONOGRAM FOR YIN
+268C;AL # DIGRAM FOR GREATER YANG
+268D;AL # DIGRAM FOR LESSER YIN
+268E;AL # DIGRAM FOR LESSER YANG
+268F;AL # DIGRAM FOR GREATER YIN
+2690;AL # WHITE FLAG
+2691;AL # BLACK FLAG
+2692;AL # HAMMER AND PICK
+2693;AL # ANCHOR
+2694;AL # CROSSED SWORDS
+2695;AL # STAFF OF AESCULAPIUS
+2696;AL # SCALES
+2697;AL # ALEMBIC
+2698;AL # FLOWER
+2699;AL # GEAR
+269A;AL # STAFF OF HERMES
+269B;AL # ATOM SYMBOL
+269C;AL # FLEUR-DE-LIS
+26A0;AL # WARNING SIGN
+26A1;AL # HIGH VOLTAGE SIGN
+26A2;AL # DOUBLED FEMALE SIGN
+26A3;AL # DOUBLED MALE SIGN
+26A4;AL # INTERLOCKED FEMALE AND MALE SIGN
+26A5;AL # MALE AND FEMALE SIGN
+26A6;AL # MALE WITH STROKE SIGN
+26A7;AL # MALE WITH STROKE AND MALE AND FEMALE SIGN
+26A8;AL # VERTICAL MALE WITH STROKE SIGN
+26A9;AL # HORIZONTAL MALE WITH STROKE SIGN
+26AA;AL # MEDIUM WHITE CIRCLE
+26AB;AL # MEDIUM BLACK CIRCLE
+26AC;AL # MEDIUM SMALL WHITE CIRCLE
+26AD;AL # MARRIAGE SYMBOL
+26AE;AL # DIVORCE SYMBOL
+26AF;AL # UNMARRIED PARTNERSHIP SYMBOL
+26B0;AL # COFFIN
+26B1;AL # FUNERAL URN
+2701;AL # UPPER BLADE SCISSORS
+2702;AL # BLACK SCISSORS
+2703;AL # LOWER BLADE SCISSORS
+2704;AL # WHITE SCISSORS
+2706;AL # TELEPHONE LOCATION SIGN
+2707;AL # TAPE DRIVE
+2708;AL # AIRPLANE
+2709;AL # ENVELOPE
+270C;AL # VICTORY HAND
+270D;AL # WRITING HAND
+270E;AL # LOWER RIGHT PENCIL
+270F;AL # PENCIL
+2710;AL # UPPER RIGHT PENCIL
+2711;AL # WHITE NIB
+2712;AL # BLACK NIB
+2713;AL # CHECK MARK
+2714;AL # HEAVY CHECK MARK
+2715;AL # MULTIPLICATION X
+2716;AL # HEAVY MULTIPLICATION X
+2717;AL # BALLOT X
+2718;AL # HEAVY BALLOT X
+2719;AL # OUTLINED GREEK CROSS
+271A;AL # HEAVY GREEK CROSS
+271B;AL # OPEN CENTRE CROSS
+271C;AL # HEAVY OPEN CENTRE CROSS
+271D;AL # LATIN CROSS
+271E;AL # SHADOWED WHITE LATIN CROSS
+271F;AL # OUTLINED LATIN CROSS
+2720;AL # MALTESE CROSS
+2721;AL # STAR OF DAVID
+2722;AL # FOUR TEARDROP-SPOKED ASTERISK
+2723;AL # FOUR BALLOON-SPOKED ASTERISK
+2724;AL # HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725;AL # FOUR CLUB-SPOKED ASTERISK
+2726;AL # BLACK FOUR POINTED STAR
+2727;AL # WHITE FOUR POINTED STAR
+2729;AL # STRESS OUTLINED WHITE STAR
+272A;AL # CIRCLED WHITE STAR
+272B;AL # OPEN CENTRE BLACK STAR
+272C;AL # BLACK CENTRE WHITE STAR
+272D;AL # OUTLINED BLACK STAR
+272E;AL # HEAVY OUTLINED BLACK STAR
+272F;AL # PINWHEEL STAR
+2730;AL # SHADOWED WHITE STAR
+2731;AL # HEAVY ASTERISK
+2732;AL # OPEN CENTRE ASTERISK
+2733;AL # EIGHT SPOKED ASTERISK
+2734;AL # EIGHT POINTED BLACK STAR
+2735;AL # EIGHT POINTED PINWHEEL STAR
+2736;AL # SIX POINTED BLACK STAR
+2737;AL # EIGHT POINTED RECTILINEAR BLACK STAR
+2738;AL # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739;AL # TWELVE POINTED BLACK STAR
+273A;AL # SIXTEEN POINTED ASTERISK
+273B;AL # TEARDROP-SPOKED ASTERISK
+273C;AL # OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D;AL # HEAVY TEARDROP-SPOKED ASTERISK
+273E;AL # SIX PETALLED BLACK AND WHITE FLORETTE
+273F;AL # BLACK FLORETTE
+2740;AL # WHITE FLORETTE
+2741;AL # EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742;AL # CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743;AL # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744;AL # SNOWFLAKE
+2745;AL # TIGHT TRIFOLIATE SNOWFLAKE
+2746;AL # HEAVY CHEVRON SNOWFLAKE
+2747;AL # SPARKLE
+2748;AL # HEAVY SPARKLE
+2749;AL # BALLOON-SPOKED ASTERISK
+274A;AL # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B;AL # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D;AL # SHADOWED WHITE CIRCLE
+274F;AL # LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750;AL # UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751;AL # LOWER RIGHT SHADOWED WHITE SQUARE
+2752;AL # UPPER RIGHT SHADOWED WHITE SQUARE
+2756;AL # BLACK DIAMOND MINUS WHITE X
+2758;AL # LIGHT VERTICAL BAR
+2759;AL # MEDIUM VERTICAL BAR
+275A;AL # HEAVY VERTICAL BAR
+275B;QU # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C;QU # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D;QU # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E;QU # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761;AL # CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762;EX # HEAVY EXCLAMATION MARK ORNAMENT
+2763;EX # HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764;AL # HEAVY BLACK HEART
+2765;AL # ROTATED HEAVY BLACK HEART BULLET
+2766;AL # FLORAL HEART
+2767;AL # ROTATED FLORAL HEART BULLET
+2768;OP # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769;CL # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A;OP # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B;CL # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C;OP # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D;CL # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E;OP # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F;CL # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770;OP # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771;CL # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772;OP # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773;CL # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774;OP # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775;CL # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776;AI # DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777;AI # DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778;AI # DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779;AI # DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A;AI # DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B;AI # DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C;AI # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D;AI # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E;AI # DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F;AI # DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780;AI # DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781;AI # DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782;AI # DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783;AI # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784;AI # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785;AI # DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786;AI # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787;AI # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788;AI # DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789;AI # DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793;AI # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794;AL # HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798;AL # HEAVY SOUTH EAST ARROW
+2799;AL # HEAVY RIGHTWARDS ARROW
+279A;AL # HEAVY NORTH EAST ARROW
+279B;AL # DRAFTING POINT RIGHTWARDS ARROW
+279C;AL # HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D;AL # TRIANGLE-HEADED RIGHTWARDS ARROW
+279E;AL # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F;AL # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0;AL # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1;AL # BLACK RIGHTWARDS ARROW
+27A2;AL # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3;AL # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4;AL # BLACK RIGHTWARDS ARROWHEAD
+27A5;AL # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6;AL # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7;AL # SQUAT BLACK RIGHTWARDS ARROW
+27A8;AL # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9;AL # RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA;AL # LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB;AL # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC;AL # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD;AL # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE;AL # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF;AL # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1;AL # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2;AL # CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3;AL # WHITE-FEATHERED RIGHTWARDS ARROW
+27B4;AL # BLACK-FEATHERED SOUTH EAST ARROW
+27B5;AL # BLACK-FEATHERED RIGHTWARDS ARROW
+27B6;AL # BLACK-FEATHERED NORTH EAST ARROW
+27B7;AL # HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8;AL # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9;AL # HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA;AL # TEARDROP-BARBED RIGHTWARDS ARROW
+27BB;AL # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC;AL # WEDGE-TAILED RIGHTWARDS ARROW
+27BD;AL # HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE;AL # OPEN-OUTLINED RIGHTWARDS ARROW
+27C0;AL # THREE DIMENSIONAL ANGLE
+27C1;AL # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+27C2;AL # PERPENDICULAR
+27C3;AL # OPEN SUBSET
+27C4;AL # OPEN SUPERSET
+27C5;OP # LEFT S-SHAPED BAG DELIMITER
+27C6;CL # RIGHT S-SHAPED BAG DELIMITER
+27D0;AL # WHITE DIAMOND WITH CENTRED DOT
+27D1;AL # AND WITH DOT
+27D2;AL # ELEMENT OF OPENING UPWARDS
+27D3;AL # LOWER RIGHT CORNER WITH DOT
+27D4;AL # UPPER LEFT CORNER WITH DOT
+27D5;AL # LEFT OUTER JOIN
+27D6;AL # RIGHT OUTER JOIN
+27D7;AL # FULL OUTER JOIN
+27D8;AL # LARGE UP TACK
+27D9;AL # LARGE DOWN TACK
+27DA;AL # LEFT AND RIGHT DOUBLE TURNSTILE
+27DB;AL # LEFT AND RIGHT TACK
+27DC;AL # LEFT MULTIMAP
+27DD;AL # LONG RIGHT TACK
+27DE;AL # LONG LEFT TACK
+27DF;AL # UP TACK WITH CIRCLE ABOVE
+27E0;AL # LOZENGE DIVIDED BY HORIZONTAL RULE
+27E1;AL # WHITE CONCAVE-SIDED DIAMOND
+27E2;AL # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3;AL # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4;AL # WHITE SQUARE WITH LEFTWARDS TICK
+27E5;AL # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6;OP # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7;CL # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8;OP # MATHEMATICAL LEFT ANGLE BRACKET
+27E9;CL # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA;OP # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB;CL # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27F0;AL # UPWARDS QUADRUPLE ARROW
+27F1;AL # DOWNWARDS QUADRUPLE ARROW
+27F2;AL # ANTICLOCKWISE GAPPED CIRCLE ARROW
+27F3;AL # CLOCKWISE GAPPED CIRCLE ARROW
+27F4;AL # RIGHT ARROW WITH CIRCLED PLUS
+27F5;AL # LONG LEFTWARDS ARROW
+27F6;AL # LONG RIGHTWARDS ARROW
+27F7;AL # LONG LEFT RIGHT ARROW
+27F8;AL # LONG LEFTWARDS DOUBLE ARROW
+27F9;AL # LONG RIGHTWARDS DOUBLE ARROW
+27FA;AL # LONG LEFT RIGHT DOUBLE ARROW
+27FB;AL # LONG LEFTWARDS ARROW FROM BAR
+27FC;AL # LONG RIGHTWARDS ARROW FROM BAR
+27FD;AL # LONG LEFTWARDS DOUBLE ARROW FROM BAR
+27FE;AL # LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+27FF;AL # LONG RIGHTWARDS SQUIGGLE ARROW
+2800;AL # BRAILLE PATTERN BLANK
+2801;AL # BRAILLE PATTERN DOTS-1
+2802;AL # BRAILLE PATTERN DOTS-2
+2803;AL # BRAILLE PATTERN DOTS-12
+2804;AL # BRAILLE PATTERN DOTS-3
+2805;AL # BRAILLE PATTERN DOTS-13
+2806;AL # BRAILLE PATTERN DOTS-23
+2807;AL # BRAILLE PATTERN DOTS-123
+2808;AL # BRAILLE PATTERN DOTS-4
+2809;AL # BRAILLE PATTERN DOTS-14
+280A;AL # BRAILLE PATTERN DOTS-24
+280B;AL # BRAILLE PATTERN DOTS-124
+280C;AL # BRAILLE PATTERN DOTS-34
+280D;AL # BRAILLE PATTERN DOTS-134
+280E;AL # BRAILLE PATTERN DOTS-234
+280F;AL # BRAILLE PATTERN DOTS-1234
+2810;AL # BRAILLE PATTERN DOTS-5
+2811;AL # BRAILLE PATTERN DOTS-15
+2812;AL # BRAILLE PATTERN DOTS-25
+2813;AL # BRAILLE PATTERN DOTS-125
+2814;AL # BRAILLE PATTERN DOTS-35
+2815;AL # BRAILLE PATTERN DOTS-135
+2816;AL # BRAILLE PATTERN DOTS-235
+2817;AL # BRAILLE PATTERN DOTS-1235
+2818;AL # BRAILLE PATTERN DOTS-45
+2819;AL # BRAILLE PATTERN DOTS-145
+281A;AL # BRAILLE PATTERN DOTS-245
+281B;AL # BRAILLE PATTERN DOTS-1245
+281C;AL # BRAILLE PATTERN DOTS-345
+281D;AL # BRAILLE PATTERN DOTS-1345
+281E;AL # BRAILLE PATTERN DOTS-2345
+281F;AL # BRAILLE PATTERN DOTS-12345
+2820;AL # BRAILLE PATTERN DOTS-6
+2821;AL # BRAILLE PATTERN DOTS-16
+2822;AL # BRAILLE PATTERN DOTS-26
+2823;AL # BRAILLE PATTERN DOTS-126
+2824;AL # BRAILLE PATTERN DOTS-36
+2825;AL # BRAILLE PATTERN DOTS-136
+2826;AL # BRAILLE PATTERN DOTS-236
+2827;AL # BRAILLE PATTERN DOTS-1236
+2828;AL # BRAILLE PATTERN DOTS-46
+2829;AL # BRAILLE PATTERN DOTS-146
+282A;AL # BRAILLE PATTERN DOTS-246
+282B;AL # BRAILLE PATTERN DOTS-1246
+282C;AL # BRAILLE PATTERN DOTS-346
+282D;AL # BRAILLE PATTERN DOTS-1346
+282E;AL # BRAILLE PATTERN DOTS-2346
+282F;AL # BRAILLE PATTERN DOTS-12346
+2830;AL # BRAILLE PATTERN DOTS-56
+2831;AL # BRAILLE PATTERN DOTS-156
+2832;AL # BRAILLE PATTERN DOTS-256
+2833;AL # BRAILLE PATTERN DOTS-1256
+2834;AL # BRAILLE PATTERN DOTS-356
+2835;AL # BRAILLE PATTERN DOTS-1356
+2836;AL # BRAILLE PATTERN DOTS-2356
+2837;AL # BRAILLE PATTERN DOTS-12356
+2838;AL # BRAILLE PATTERN DOTS-456
+2839;AL # BRAILLE PATTERN DOTS-1456
+283A;AL # BRAILLE PATTERN DOTS-2456
+283B;AL # BRAILLE PATTERN DOTS-12456
+283C;AL # BRAILLE PATTERN DOTS-3456
+283D;AL # BRAILLE PATTERN DOTS-13456
+283E;AL # BRAILLE PATTERN DOTS-23456
+283F;AL # BRAILLE PATTERN DOTS-123456
+2840;AL # BRAILLE PATTERN DOTS-7
+2841;AL # BRAILLE PATTERN DOTS-17
+2842;AL # BRAILLE PATTERN DOTS-27
+2843;AL # BRAILLE PATTERN DOTS-127
+2844;AL # BRAILLE PATTERN DOTS-37
+2845;AL # BRAILLE PATTERN DOTS-137
+2846;AL # BRAILLE PATTERN DOTS-237
+2847;AL # BRAILLE PATTERN DOTS-1237
+2848;AL # BRAILLE PATTERN DOTS-47
+2849;AL # BRAILLE PATTERN DOTS-147
+284A;AL # BRAILLE PATTERN DOTS-247
+284B;AL # BRAILLE PATTERN DOTS-1247
+284C;AL # BRAILLE PATTERN DOTS-347
+284D;AL # BRAILLE PATTERN DOTS-1347
+284E;AL # BRAILLE PATTERN DOTS-2347
+284F;AL # BRAILLE PATTERN DOTS-12347
+2850;AL # BRAILLE PATTERN DOTS-57
+2851;AL # BRAILLE PATTERN DOTS-157
+2852;AL # BRAILLE PATTERN DOTS-257
+2853;AL # BRAILLE PATTERN DOTS-1257
+2854;AL # BRAILLE PATTERN DOTS-357
+2855;AL # BRAILLE PATTERN DOTS-1357
+2856;AL # BRAILLE PATTERN DOTS-2357
+2857;AL # BRAILLE PATTERN DOTS-12357
+2858;AL # BRAILLE PATTERN DOTS-457
+2859;AL # BRAILLE PATTERN DOTS-1457
+285A;AL # BRAILLE PATTERN DOTS-2457
+285B;AL # BRAILLE PATTERN DOTS-12457
+285C;AL # BRAILLE PATTERN DOTS-3457
+285D;AL # BRAILLE PATTERN DOTS-13457
+285E;AL # BRAILLE PATTERN DOTS-23457
+285F;AL # BRAILLE PATTERN DOTS-123457
+2860;AL # BRAILLE PATTERN DOTS-67
+2861;AL # BRAILLE PATTERN DOTS-167
+2862;AL # BRAILLE PATTERN DOTS-267
+2863;AL # BRAILLE PATTERN DOTS-1267
+2864;AL # BRAILLE PATTERN DOTS-367
+2865;AL # BRAILLE PATTERN DOTS-1367
+2866;AL # BRAILLE PATTERN DOTS-2367
+2867;AL # BRAILLE PATTERN DOTS-12367
+2868;AL # BRAILLE PATTERN DOTS-467
+2869;AL # BRAILLE PATTERN DOTS-1467
+286A;AL # BRAILLE PATTERN DOTS-2467
+286B;AL # BRAILLE PATTERN DOTS-12467
+286C;AL # BRAILLE PATTERN DOTS-3467
+286D;AL # BRAILLE PATTERN DOTS-13467
+286E;AL # BRAILLE PATTERN DOTS-23467
+286F;AL # BRAILLE PATTERN DOTS-123467
+2870;AL # BRAILLE PATTERN DOTS-567
+2871;AL # BRAILLE PATTERN DOTS-1567
+2872;AL # BRAILLE PATTERN DOTS-2567
+2873;AL # BRAILLE PATTERN DOTS-12567
+2874;AL # BRAILLE PATTERN DOTS-3567
+2875;AL # BRAILLE PATTERN DOTS-13567
+2876;AL # BRAILLE PATTERN DOTS-23567
+2877;AL # BRAILLE PATTERN DOTS-123567
+2878;AL # BRAILLE PATTERN DOTS-4567
+2879;AL # BRAILLE PATTERN DOTS-14567
+287A;AL # BRAILLE PATTERN DOTS-24567
+287B;AL # BRAILLE PATTERN DOTS-124567
+287C;AL # BRAILLE PATTERN DOTS-34567
+287D;AL # BRAILLE PATTERN DOTS-134567
+287E;AL # BRAILLE PATTERN DOTS-234567
+287F;AL # BRAILLE PATTERN DOTS-1234567
+2880;AL # BRAILLE PATTERN DOTS-8
+2881;AL # BRAILLE PATTERN DOTS-18
+2882;AL # BRAILLE PATTERN DOTS-28
+2883;AL # BRAILLE PATTERN DOTS-128
+2884;AL # BRAILLE PATTERN DOTS-38
+2885;AL # BRAILLE PATTERN DOTS-138
+2886;AL # BRAILLE PATTERN DOTS-238
+2887;AL # BRAILLE PATTERN DOTS-1238
+2888;AL # BRAILLE PATTERN DOTS-48
+2889;AL # BRAILLE PATTERN DOTS-148
+288A;AL # BRAILLE PATTERN DOTS-248
+288B;AL # BRAILLE PATTERN DOTS-1248
+288C;AL # BRAILLE PATTERN DOTS-348
+288D;AL # BRAILLE PATTERN DOTS-1348
+288E;AL # BRAILLE PATTERN DOTS-2348
+288F;AL # BRAILLE PATTERN DOTS-12348
+2890;AL # BRAILLE PATTERN DOTS-58
+2891;AL # BRAILLE PATTERN DOTS-158
+2892;AL # BRAILLE PATTERN DOTS-258
+2893;AL # BRAILLE PATTERN DOTS-1258
+2894;AL # BRAILLE PATTERN DOTS-358
+2895;AL # BRAILLE PATTERN DOTS-1358
+2896;AL # BRAILLE PATTERN DOTS-2358
+2897;AL # BRAILLE PATTERN DOTS-12358
+2898;AL # BRAILLE PATTERN DOTS-458
+2899;AL # BRAILLE PATTERN DOTS-1458
+289A;AL # BRAILLE PATTERN DOTS-2458
+289B;AL # BRAILLE PATTERN DOTS-12458
+289C;AL # BRAILLE PATTERN DOTS-3458
+289D;AL # BRAILLE PATTERN DOTS-13458
+289E;AL # BRAILLE PATTERN DOTS-23458
+289F;AL # BRAILLE PATTERN DOTS-123458
+28A0;AL # BRAILLE PATTERN DOTS-68
+28A1;AL # BRAILLE PATTERN DOTS-168
+28A2;AL # BRAILLE PATTERN DOTS-268
+28A3;AL # BRAILLE PATTERN DOTS-1268
+28A4;AL # BRAILLE PATTERN DOTS-368
+28A5;AL # BRAILLE PATTERN DOTS-1368
+28A6;AL # BRAILLE PATTERN DOTS-2368
+28A7;AL # BRAILLE PATTERN DOTS-12368
+28A8;AL # BRAILLE PATTERN DOTS-468
+28A9;AL # BRAILLE PATTERN DOTS-1468
+28AA;AL # BRAILLE PATTERN DOTS-2468
+28AB;AL # BRAILLE PATTERN DOTS-12468
+28AC;AL # BRAILLE PATTERN DOTS-3468
+28AD;AL # BRAILLE PATTERN DOTS-13468
+28AE;AL # BRAILLE PATTERN DOTS-23468
+28AF;AL # BRAILLE PATTERN DOTS-123468
+28B0;AL # BRAILLE PATTERN DOTS-568
+28B1;AL # BRAILLE PATTERN DOTS-1568
+28B2;AL # BRAILLE PATTERN DOTS-2568
+28B3;AL # BRAILLE PATTERN DOTS-12568
+28B4;AL # BRAILLE PATTERN DOTS-3568
+28B5;AL # BRAILLE PATTERN DOTS-13568
+28B6;AL # BRAILLE PATTERN DOTS-23568
+28B7;AL # BRAILLE PATTERN DOTS-123568
+28B8;AL # BRAILLE PATTERN DOTS-4568
+28B9;AL # BRAILLE PATTERN DOTS-14568
+28BA;AL # BRAILLE PATTERN DOTS-24568
+28BB;AL # BRAILLE PATTERN DOTS-124568
+28BC;AL # BRAILLE PATTERN DOTS-34568
+28BD;AL # BRAILLE PATTERN DOTS-134568
+28BE;AL # BRAILLE PATTERN DOTS-234568
+28BF;AL # BRAILLE PATTERN DOTS-1234568
+28C0;AL # BRAILLE PATTERN DOTS-78
+28C1;AL # BRAILLE PATTERN DOTS-178
+28C2;AL # BRAILLE PATTERN DOTS-278
+28C3;AL # BRAILLE PATTERN DOTS-1278
+28C4;AL # BRAILLE PATTERN DOTS-378
+28C5;AL # BRAILLE PATTERN DOTS-1378
+28C6;AL # BRAILLE PATTERN DOTS-2378
+28C7;AL # BRAILLE PATTERN DOTS-12378
+28C8;AL # BRAILLE PATTERN DOTS-478
+28C9;AL # BRAILLE PATTERN DOTS-1478
+28CA;AL # BRAILLE PATTERN DOTS-2478
+28CB;AL # BRAILLE PATTERN DOTS-12478
+28CC;AL # BRAILLE PATTERN DOTS-3478
+28CD;AL # BRAILLE PATTERN DOTS-13478
+28CE;AL # BRAILLE PATTERN DOTS-23478
+28CF;AL # BRAILLE PATTERN DOTS-123478
+28D0;AL # BRAILLE PATTERN DOTS-578
+28D1;AL # BRAILLE PATTERN DOTS-1578
+28D2;AL # BRAILLE PATTERN DOTS-2578
+28D3;AL # BRAILLE PATTERN DOTS-12578
+28D4;AL # BRAILLE PATTERN DOTS-3578
+28D5;AL # BRAILLE PATTERN DOTS-13578
+28D6;AL # BRAILLE PATTERN DOTS-23578
+28D7;AL # BRAILLE PATTERN DOTS-123578
+28D8;AL # BRAILLE PATTERN DOTS-4578
+28D9;AL # BRAILLE PATTERN DOTS-14578
+28DA;AL # BRAILLE PATTERN DOTS-24578
+28DB;AL # BRAILLE PATTERN DOTS-124578
+28DC;AL # BRAILLE PATTERN DOTS-34578
+28DD;AL # BRAILLE PATTERN DOTS-134578
+28DE;AL # BRAILLE PATTERN DOTS-234578
+28DF;AL # BRAILLE PATTERN DOTS-1234578
+28E0;AL # BRAILLE PATTERN DOTS-678
+28E1;AL # BRAILLE PATTERN DOTS-1678
+28E2;AL # BRAILLE PATTERN DOTS-2678
+28E3;AL # BRAILLE PATTERN DOTS-12678
+28E4;AL # BRAILLE PATTERN DOTS-3678
+28E5;AL # BRAILLE PATTERN DOTS-13678
+28E6;AL # BRAILLE PATTERN DOTS-23678
+28E7;AL # BRAILLE PATTERN DOTS-123678
+28E8;AL # BRAILLE PATTERN DOTS-4678
+28E9;AL # BRAILLE PATTERN DOTS-14678
+28EA;AL # BRAILLE PATTERN DOTS-24678
+28EB;AL # BRAILLE PATTERN DOTS-124678
+28EC;AL # BRAILLE PATTERN DOTS-34678
+28ED;AL # BRAILLE PATTERN DOTS-134678
+28EE;AL # BRAILLE PATTERN DOTS-234678
+28EF;AL # BRAILLE PATTERN DOTS-1234678
+28F0;AL # BRAILLE PATTERN DOTS-5678
+28F1;AL # BRAILLE PATTERN DOTS-15678
+28F2;AL # BRAILLE PATTERN DOTS-25678
+28F3;AL # BRAILLE PATTERN DOTS-125678
+28F4;AL # BRAILLE PATTERN DOTS-35678
+28F5;AL # BRAILLE PATTERN DOTS-135678
+28F6;AL # BRAILLE PATTERN DOTS-235678
+28F7;AL # BRAILLE PATTERN DOTS-1235678
+28F8;AL # BRAILLE PATTERN DOTS-45678
+28F9;AL # BRAILLE PATTERN DOTS-145678
+28FA;AL # BRAILLE PATTERN DOTS-245678
+28FB;AL # BRAILLE PATTERN DOTS-1245678
+28FC;AL # BRAILLE PATTERN DOTS-345678
+28FD;AL # BRAILLE PATTERN DOTS-1345678
+28FE;AL # BRAILLE PATTERN DOTS-2345678
+28FF;AL # BRAILLE PATTERN DOTS-12345678
+2900;AL # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2901;AL # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2902;AL # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903;AL # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904;AL # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905;AL # RIGHTWARDS TWO-HEADED ARROW FROM BAR
+2906;AL # LEFTWARDS DOUBLE ARROW FROM BAR
+2907;AL # RIGHTWARDS DOUBLE ARROW FROM BAR
+2908;AL # DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909;AL # UPWARDS ARROW WITH HORIZONTAL STROKE
+290A;AL # UPWARDS TRIPLE ARROW
+290B;AL # DOWNWARDS TRIPLE ARROW
+290C;AL # LEFTWARDS DOUBLE DASH ARROW
+290D;AL # RIGHTWARDS DOUBLE DASH ARROW
+290E;AL # LEFTWARDS TRIPLE DASH ARROW
+290F;AL # RIGHTWARDS TRIPLE DASH ARROW
+2910;AL # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911;AL # RIGHTWARDS ARROW WITH DOTTED STEM
+2912;AL # UPWARDS ARROW TO BAR
+2913;AL # DOWNWARDS ARROW TO BAR
+2914;AL # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2915;AL # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2916;AL # RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+2917;AL # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2918;AL # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2919;AL # LEFTWARDS ARROW-TAIL
+291A;AL # RIGHTWARDS ARROW-TAIL
+291B;AL # LEFTWARDS DOUBLE ARROW-TAIL
+291C;AL # RIGHTWARDS DOUBLE ARROW-TAIL
+291D;AL # LEFTWARDS ARROW TO BLACK DIAMOND
+291E;AL # RIGHTWARDS ARROW TO BLACK DIAMOND
+291F;AL # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920;AL # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921;AL # NORTH WEST AND SOUTH EAST ARROW
+2922;AL # NORTH EAST AND SOUTH WEST ARROW
+2923;AL # NORTH WEST ARROW WITH HOOK
+2924;AL # NORTH EAST ARROW WITH HOOK
+2925;AL # SOUTH EAST ARROW WITH HOOK
+2926;AL # SOUTH WEST ARROW WITH HOOK
+2927;AL # NORTH WEST ARROW AND NORTH EAST ARROW
+2928;AL # NORTH EAST ARROW AND SOUTH EAST ARROW
+2929;AL # SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A;AL # SOUTH WEST ARROW AND NORTH WEST ARROW
+292B;AL # RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C;AL # FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D;AL # SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E;AL # NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F;AL # FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930;AL # RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931;AL # NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932;AL # NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933;AL # WAVE ARROW POINTING DIRECTLY RIGHT
+2934;AL # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935;AL # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936;AL # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937;AL # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938;AL # RIGHT-SIDE ARC CLOCKWISE ARROW
+2939;AL # LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A;AL # TOP ARC ANTICLOCKWISE ARROW
+293B;AL # BOTTOM ARC ANTICLOCKWISE ARROW
+293C;AL # TOP ARC CLOCKWISE ARROW WITH MINUS
+293D;AL # TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E;AL # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F;AL # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940;AL # ANTICLOCKWISE CLOSED CIRCLE ARROW
+2941;AL # CLOCKWISE CLOSED CIRCLE ARROW
+2942;AL # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943;AL # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944;AL # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945;AL # RIGHTWARDS ARROW WITH PLUS BELOW
+2946;AL # LEFTWARDS ARROW WITH PLUS BELOW
+2947;AL # RIGHTWARDS ARROW THROUGH X
+2948;AL # LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949;AL # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A;AL # LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B;AL # LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C;AL # UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D;AL # UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E;AL # LEFT BARB UP RIGHT BARB UP HARPOON
+294F;AL # UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950;AL # LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951;AL # UP BARB LEFT DOWN BARB LEFT HARPOON
+2952;AL # LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953;AL # RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954;AL # UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955;AL # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956;AL # LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957;AL # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958;AL # UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959;AL # DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A;AL # LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B;AL # RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C;AL # UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D;AL # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E;AL # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F;AL # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960;AL # UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961;AL # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962;AL # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963;AL # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964;AL # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965;AL # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966;AL # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967;AL # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968;AL # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969;AL # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A;AL # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B;AL # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C;AL # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D;AL # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E;AL # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F;AL # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970;AL # RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+2971;AL # EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972;AL # TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973;AL # LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974;AL # RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975;AL # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976;AL # LESS-THAN ABOVE LEFTWARDS ARROW
+2977;AL # LEFTWARDS ARROW THROUGH LESS-THAN
+2978;AL # GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979;AL # SUBSET ABOVE RIGHTWARDS ARROW
+297A;AL # LEFTWARDS ARROW THROUGH SUBSET
+297B;AL # SUPERSET ABOVE LEFTWARDS ARROW
+297C;AL # LEFT FISH TAIL
+297D;AL # RIGHT FISH TAIL
+297E;AL # UP FISH TAIL
+297F;AL # DOWN FISH TAIL
+2980;AL # TRIPLE VERTICAL BAR DELIMITER
+2981;AL # Z NOTATION SPOT
+2982;AL # Z NOTATION TYPE COLON
+2983;OP # LEFT WHITE CURLY BRACKET
+2984;CL # RIGHT WHITE CURLY BRACKET
+2985;OP # LEFT WHITE PARENTHESIS
+2986;CL # RIGHT WHITE PARENTHESIS
+2987;OP # Z NOTATION LEFT IMAGE BRACKET
+2988;CL # Z NOTATION RIGHT IMAGE BRACKET
+2989;OP # Z NOTATION LEFT BINDING BRACKET
+298A;CL # Z NOTATION RIGHT BINDING BRACKET
+298B;OP # LEFT SQUARE BRACKET WITH UNDERBAR
+298C;CL # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D;OP # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E;CL # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F;OP # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990;CL # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991;OP # LEFT ANGLE BRACKET WITH DOT
+2992;CL # RIGHT ANGLE BRACKET WITH DOT
+2993;OP # LEFT ARC LESS-THAN BRACKET
+2994;CL # RIGHT ARC GREATER-THAN BRACKET
+2995;OP # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996;CL # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997;OP # LEFT BLACK TORTOISE SHELL BRACKET
+2998;CL # RIGHT BLACK TORTOISE SHELL BRACKET
+2999;AL # DOTTED FENCE
+299A;AL # VERTICAL ZIGZAG LINE
+299B;AL # MEASURED ANGLE OPENING LEFT
+299C;AL # RIGHT ANGLE VARIANT WITH SQUARE
+299D;AL # MEASURED RIGHT ANGLE WITH DOT
+299E;AL # ANGLE WITH S INSIDE
+299F;AL # ACUTE ANGLE
+29A0;AL # SPHERICAL ANGLE OPENING LEFT
+29A1;AL # SPHERICAL ANGLE OPENING UP
+29A2;AL # TURNED ANGLE
+29A3;AL # REVERSED ANGLE
+29A4;AL # ANGLE WITH UNDERBAR
+29A5;AL # REVERSED ANGLE WITH UNDERBAR
+29A6;AL # OBLIQUE ANGLE OPENING UP
+29A7;AL # OBLIQUE ANGLE OPENING DOWN
+29A8;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF;AL # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+29B0;AL # REVERSED EMPTY SET
+29B1;AL # EMPTY SET WITH OVERBAR
+29B2;AL # EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3;AL # EMPTY SET WITH RIGHT ARROW ABOVE
+29B4;AL # EMPTY SET WITH LEFT ARROW ABOVE
+29B5;AL # CIRCLE WITH HORIZONTAL BAR
+29B6;AL # CIRCLED VERTICAL BAR
+29B7;AL # CIRCLED PARALLEL
+29B8;AL # CIRCLED REVERSE SOLIDUS
+29B9;AL # CIRCLED PERPENDICULAR
+29BA;AL # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB;AL # CIRCLE WITH SUPERIMPOSED X
+29BC;AL # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD;AL # UP ARROW THROUGH CIRCLE
+29BE;AL # CIRCLED WHITE BULLET
+29BF;AL # CIRCLED BULLET
+29C0;AL # CIRCLED LESS-THAN
+29C1;AL # CIRCLED GREATER-THAN
+29C2;AL # CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3;AL # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+29C4;AL # SQUARED RISING DIAGONAL SLASH
+29C5;AL # SQUARED FALLING DIAGONAL SLASH
+29C6;AL # SQUARED ASTERISK
+29C7;AL # SQUARED SMALL CIRCLE
+29C8;AL # SQUARED SQUARE
+29C9;AL # TWO JOINED SQUARES
+29CA;AL # TRIANGLE WITH DOT ABOVE
+29CB;AL # TRIANGLE WITH UNDERBAR
+29CC;AL # S IN TRIANGLE
+29CD;AL # TRIANGLE WITH SERIFS AT BOTTOM
+29CE;AL # RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF;AL # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0;AL # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1;AL # BOWTIE WITH LEFT HALF BLACK
+29D2;AL # BOWTIE WITH RIGHT HALF BLACK
+29D3;AL # BLACK BOWTIE
+29D4;AL # TIMES WITH LEFT HALF BLACK
+29D5;AL # TIMES WITH RIGHT HALF BLACK
+29D6;AL # WHITE HOURGLASS
+29D7;AL # BLACK HOURGLASS
+29D8;OP # LEFT WIGGLY FENCE
+29D9;CL # RIGHT WIGGLY FENCE
+29DA;OP # LEFT DOUBLE WIGGLY FENCE
+29DB;CL # RIGHT DOUBLE WIGGLY FENCE
+29DC;AL # INCOMPLETE INFINITY
+29DD;AL # TIE OVER INFINITY
+29DE;AL # INFINITY NEGATED WITH VERTICAL BAR
+29DF;AL # DOUBLE-ENDED MULTIMAP
+29E0;AL # SQUARE WITH CONTOURED OUTLINE
+29E1;AL # INCREASES AS
+29E2;AL # SHUFFLE PRODUCT
+29E3;AL # EQUALS SIGN AND SLANTED PARALLEL
+29E4;AL # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5;AL # IDENTICAL TO AND SLANTED PARALLEL
+29E6;AL # GLEICH STARK
+29E7;AL # THERMODYNAMIC
+29E8;AL # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+29E9;AL # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+29EA;AL # BLACK DIAMOND WITH DOWN ARROW
+29EB;AL # BLACK LOZENGE
+29EC;AL # WHITE CIRCLE WITH DOWN ARROW
+29ED;AL # BLACK CIRCLE WITH DOWN ARROW
+29EE;AL # ERROR-BARRED WHITE SQUARE
+29EF;AL # ERROR-BARRED BLACK SQUARE
+29F0;AL # ERROR-BARRED WHITE DIAMOND
+29F1;AL # ERROR-BARRED BLACK DIAMOND
+29F2;AL # ERROR-BARRED WHITE CIRCLE
+29F3;AL # ERROR-BARRED BLACK CIRCLE
+29F4;AL # RULE-DELAYED
+29F5;AL # REVERSE SOLIDUS OPERATOR
+29F6;AL # SOLIDUS WITH OVERBAR
+29F7;AL # REVERSE SOLIDUS WITH HORIZONTAL STROKE
+29F8;AL # BIG SOLIDUS
+29F9;AL # BIG REVERSE SOLIDUS
+29FA;AL # DOUBLE PLUS
+29FB;AL # TRIPLE PLUS
+29FC;OP # LEFT-POINTING CURVED ANGLE BRACKET
+29FD;CL # RIGHT-POINTING CURVED ANGLE BRACKET
+29FE;AL # TINY
+29FF;AL # MINY
+2A00;AL # N-ARY CIRCLED DOT OPERATOR
+2A01;AL # N-ARY CIRCLED PLUS OPERATOR
+2A02;AL # N-ARY CIRCLED TIMES OPERATOR
+2A03;AL # N-ARY UNION OPERATOR WITH DOT
+2A04;AL # N-ARY UNION OPERATOR WITH PLUS
+2A05;AL # N-ARY SQUARE INTERSECTION OPERATOR
+2A06;AL # N-ARY SQUARE UNION OPERATOR
+2A07;AL # TWO LOGICAL AND OPERATOR
+2A08;AL # TWO LOGICAL OR OPERATOR
+2A09;AL # N-ARY TIMES OPERATOR
+2A0A;AL # MODULO TWO SUM
+2A0B;AL # SUMMATION WITH INTEGRAL
+2A0C;AL # QUADRUPLE INTEGRAL OPERATOR
+2A0D;AL # FINITE PART INTEGRAL
+2A0E;AL # INTEGRAL WITH DOUBLE STROKE
+2A0F;AL # INTEGRAL AVERAGE WITH SLASH
+2A10;AL # CIRCULATION FUNCTION
+2A11;AL # ANTICLOCKWISE INTEGRATION
+2A12;AL # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13;AL # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14;AL # LINE INTEGRATION NOT INCLUDING THE POLE
+2A15;AL # INTEGRAL AROUND A POINT OPERATOR
+2A16;AL # QUATERNION INTEGRAL OPERATOR
+2A17;AL # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18;AL # INTEGRAL WITH TIMES SIGN
+2A19;AL # INTEGRAL WITH INTERSECTION
+2A1A;AL # INTEGRAL WITH UNION
+2A1B;AL # INTEGRAL WITH OVERBAR
+2A1C;AL # INTEGRAL WITH UNDERBAR
+2A1D;AL # JOIN
+2A1E;AL # LARGE LEFT TRIANGLE OPERATOR
+2A1F;AL # Z NOTATION SCHEMA COMPOSITION
+2A20;AL # Z NOTATION SCHEMA PIPING
+2A21;AL # Z NOTATION SCHEMA PROJECTION
+2A22;AL # PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23;AL # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24;AL # PLUS SIGN WITH TILDE ABOVE
+2A25;AL # PLUS SIGN WITH DOT BELOW
+2A26;AL # PLUS SIGN WITH TILDE BELOW
+2A27;AL # PLUS SIGN WITH SUBSCRIPT TWO
+2A28;AL # PLUS SIGN WITH BLACK TRIANGLE
+2A29;AL # MINUS SIGN WITH COMMA ABOVE
+2A2A;AL # MINUS SIGN WITH DOT BELOW
+2A2B;AL # MINUS SIGN WITH FALLING DOTS
+2A2C;AL # MINUS SIGN WITH RISING DOTS
+2A2D;AL # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E;AL # PLUS SIGN IN RIGHT HALF CIRCLE
+2A2F;AL # VECTOR OR CROSS PRODUCT
+2A30;AL # MULTIPLICATION SIGN WITH DOT ABOVE
+2A31;AL # MULTIPLICATION SIGN WITH UNDERBAR
+2A32;AL # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33;AL # SMASH PRODUCT
+2A34;AL # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35;AL # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36;AL # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37;AL # MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38;AL # CIRCLED DIVISION SIGN
+2A39;AL # PLUS SIGN IN TRIANGLE
+2A3A;AL # MINUS SIGN IN TRIANGLE
+2A3B;AL # MULTIPLICATION SIGN IN TRIANGLE
+2A3C;AL # INTERIOR PRODUCT
+2A3D;AL # RIGHTHAND INTERIOR PRODUCT
+2A3E;AL # Z NOTATION RELATIONAL COMPOSITION
+2A3F;AL # AMALGAMATION OR COPRODUCT
+2A40;AL # INTERSECTION WITH DOT
+2A41;AL # UNION WITH MINUS SIGN
+2A42;AL # UNION WITH OVERBAR
+2A43;AL # INTERSECTION WITH OVERBAR
+2A44;AL # INTERSECTION WITH LOGICAL AND
+2A45;AL # UNION WITH LOGICAL OR
+2A46;AL # UNION ABOVE INTERSECTION
+2A47;AL # INTERSECTION ABOVE UNION
+2A48;AL # UNION ABOVE BAR ABOVE INTERSECTION
+2A49;AL # INTERSECTION ABOVE BAR ABOVE UNION
+2A4A;AL # UNION BESIDE AND JOINED WITH UNION
+2A4B;AL # INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C;AL # CLOSED UNION WITH SERIFS
+2A4D;AL # CLOSED INTERSECTION WITH SERIFS
+2A4E;AL # DOUBLE SQUARE INTERSECTION
+2A4F;AL # DOUBLE SQUARE UNION
+2A50;AL # CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+2A51;AL # LOGICAL AND WITH DOT ABOVE
+2A52;AL # LOGICAL OR WITH DOT ABOVE
+2A53;AL # DOUBLE LOGICAL AND
+2A54;AL # DOUBLE LOGICAL OR
+2A55;AL # TWO INTERSECTING LOGICAL AND
+2A56;AL # TWO INTERSECTING LOGICAL OR
+2A57;AL # SLOPING LARGE OR
+2A58;AL # SLOPING LARGE AND
+2A59;AL # LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A;AL # LOGICAL AND WITH MIDDLE STEM
+2A5B;AL # LOGICAL OR WITH MIDDLE STEM
+2A5C;AL # LOGICAL AND WITH HORIZONTAL DASH
+2A5D;AL # LOGICAL OR WITH HORIZONTAL DASH
+2A5E;AL # LOGICAL AND WITH DOUBLE OVERBAR
+2A5F;AL # LOGICAL AND WITH UNDERBAR
+2A60;AL # LOGICAL AND WITH DOUBLE UNDERBAR
+2A61;AL # SMALL VEE WITH UNDERBAR
+2A62;AL # LOGICAL OR WITH DOUBLE OVERBAR
+2A63;AL # LOGICAL OR WITH DOUBLE UNDERBAR
+2A64;AL # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65;AL # Z NOTATION RANGE ANTIRESTRICTION
+2A66;AL # EQUALS SIGN WITH DOT BELOW
+2A67;AL # IDENTICAL WITH DOT ABOVE
+2A68;AL # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+2A69;AL # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A;AL # TILDE OPERATOR WITH DOT ABOVE
+2A6B;AL # TILDE OPERATOR WITH RISING DOTS
+2A6C;AL # SIMILAR MINUS SIMILAR
+2A6D;AL # CONGRUENT WITH DOT ABOVE
+2A6E;AL # EQUALS WITH ASTERISK
+2A6F;AL # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70;AL # APPROXIMATELY EQUAL OR EQUAL TO
+2A71;AL # EQUALS SIGN ABOVE PLUS SIGN
+2A72;AL # PLUS SIGN ABOVE EQUALS SIGN
+2A73;AL # EQUALS SIGN ABOVE TILDE OPERATOR
+2A74;AL # DOUBLE COLON EQUAL
+2A75;AL # TWO CONSECUTIVE EQUALS SIGNS
+2A76;AL # THREE CONSECUTIVE EQUALS SIGNS
+2A77;AL # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78;AL # EQUIVALENT WITH FOUR DOTS ABOVE
+2A79;AL # LESS-THAN WITH CIRCLE INSIDE
+2A7A;AL # GREATER-THAN WITH CIRCLE INSIDE
+2A7B;AL # LESS-THAN WITH QUESTION MARK ABOVE
+2A7C;AL # GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D;AL # LESS-THAN OR SLANTED EQUAL TO
+2A7E;AL # GREATER-THAN OR SLANTED EQUAL TO
+2A7F;AL # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80;AL # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81;AL # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82;AL # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83;AL # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84;AL # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85;AL # LESS-THAN OR APPROXIMATE
+2A86;AL # GREATER-THAN OR APPROXIMATE
+2A87;AL # LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+2A88;AL # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+2A89;AL # LESS-THAN AND NOT APPROXIMATE
+2A8A;AL # GREATER-THAN AND NOT APPROXIMATE
+2A8B;AL # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C;AL # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A8D;AL # LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E;AL # GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F;AL # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90;AL # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91;AL # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92;AL # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93;AL # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94;AL # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95;AL # SLANTED EQUAL TO OR LESS-THAN
+2A96;AL # SLANTED EQUAL TO OR GREATER-THAN
+2A97;AL # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98;AL # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99;AL # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A;AL # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B;AL # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C;AL # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D;AL # SIMILAR OR LESS-THAN
+2A9E;AL # SIMILAR OR GREATER-THAN
+2A9F;AL # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0;AL # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1;AL # DOUBLE NESTED LESS-THAN
+2AA2;AL # DOUBLE NESTED GREATER-THAN
+2AA3;AL # DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4;AL # GREATER-THAN OVERLAPPING LESS-THAN
+2AA5;AL # GREATER-THAN BESIDE LESS-THAN
+2AA6;AL # LESS-THAN CLOSED BY CURVE
+2AA7;AL # GREATER-THAN CLOSED BY CURVE
+2AA8;AL # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9;AL # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA;AL # SMALLER THAN
+2AAB;AL # LARGER THAN
+2AAC;AL # SMALLER THAN OR EQUAL TO
+2AAD;AL # LARGER THAN OR EQUAL TO
+2AAE;AL # EQUALS SIGN WITH BUMPY ABOVE
+2AAF;AL # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0;AL # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB1;AL # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2;AL # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3;AL # PRECEDES ABOVE EQUALS SIGN
+2AB4;AL # SUCCEEDS ABOVE EQUALS SIGN
+2AB5;AL # PRECEDES ABOVE NOT EQUAL TO
+2AB6;AL # SUCCEEDS ABOVE NOT EQUAL TO
+2AB7;AL # PRECEDES ABOVE ALMOST EQUAL TO
+2AB8;AL # SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9;AL # PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA;AL # SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB;AL # DOUBLE PRECEDES
+2ABC;AL # DOUBLE SUCCEEDS
+2ABD;AL # SUBSET WITH DOT
+2ABE;AL # SUPERSET WITH DOT
+2ABF;AL # SUBSET WITH PLUS SIGN BELOW
+2AC0;AL # SUPERSET WITH PLUS SIGN BELOW
+2AC1;AL # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2;AL # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3;AL # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4;AL # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5;AL # SUBSET OF ABOVE EQUALS SIGN
+2AC6;AL # SUPERSET OF ABOVE EQUALS SIGN
+2AC7;AL # SUBSET OF ABOVE TILDE OPERATOR
+2AC8;AL # SUPERSET OF ABOVE TILDE OPERATOR
+2AC9;AL # SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA;AL # SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB;AL # SUBSET OF ABOVE NOT EQUAL TO
+2ACC;AL # SUPERSET OF ABOVE NOT EQUAL TO
+2ACD;AL # SQUARE LEFT OPEN BOX OPERATOR
+2ACE;AL # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF;AL # CLOSED SUBSET
+2AD0;AL # CLOSED SUPERSET
+2AD1;AL # CLOSED SUBSET OR EQUAL TO
+2AD2;AL # CLOSED SUPERSET OR EQUAL TO
+2AD3;AL # SUBSET ABOVE SUPERSET
+2AD4;AL # SUPERSET ABOVE SUBSET
+2AD5;AL # SUBSET ABOVE SUBSET
+2AD6;AL # SUPERSET ABOVE SUPERSET
+2AD7;AL # SUPERSET BESIDE SUBSET
+2AD8;AL # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+2AD9;AL # ELEMENT OF OPENING DOWNWARDS
+2ADA;AL # PITCHFORK WITH TEE TOP
+2ADB;AL # TRANSVERSAL INTERSECTION
+2ADC;AL # FORKING
+2ADD;AL # NONFORKING
+2ADE;AL # SHORT LEFT TACK
+2ADF;AL # SHORT DOWN TACK
+2AE0;AL # SHORT UP TACK
+2AE1;AL # PERPENDICULAR WITH S
+2AE2;AL # VERTICAL BAR TRIPLE RIGHT TURNSTILE
+2AE3;AL # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4;AL # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5;AL # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6;AL # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+2AE7;AL # SHORT DOWN TACK WITH OVERBAR
+2AE8;AL # SHORT UP TACK WITH UNDERBAR
+2AE9;AL # SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA;AL # DOUBLE DOWN TACK
+2AEB;AL # DOUBLE UP TACK
+2AEC;AL # DOUBLE STROKE NOT SIGN
+2AED;AL # REVERSED DOUBLE STROKE NOT SIGN
+2AEE;AL # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+2AEF;AL # VERTICAL LINE WITH CIRCLE ABOVE
+2AF0;AL # VERTICAL LINE WITH CIRCLE BELOW
+2AF1;AL # DOWN TACK WITH CIRCLE BELOW
+2AF2;AL # PARALLEL WITH HORIZONTAL STROKE
+2AF3;AL # PARALLEL WITH TILDE OPERATOR
+2AF4;AL # TRIPLE VERTICAL BAR BINARY RELATION
+2AF5;AL # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+2AF6;AL # TRIPLE COLON OPERATOR
+2AF7;AL # TRIPLE NESTED LESS-THAN
+2AF8;AL # TRIPLE NESTED GREATER-THAN
+2AF9;AL # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA;AL # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2AFB;AL # TRIPLE SOLIDUS BINARY RELATION
+2AFC;AL # LARGE TRIPLE VERTICAL BAR OPERATOR
+2AFD;AL # DOUBLE SOLIDUS OPERATOR
+2AFE;AL # WHITE VERTICAL BAR
+2AFF;AL # N-ARY WHITE VERTICAL BAR
+2B00;AL # NORTH EAST WHITE ARROW
+2B01;AL # NORTH WEST WHITE ARROW
+2B02;AL # SOUTH EAST WHITE ARROW
+2B03;AL # SOUTH WEST WHITE ARROW
+2B04;AL # LEFT RIGHT WHITE ARROW
+2B05;AL # LEFTWARDS BLACK ARROW
+2B06;AL # UPWARDS BLACK ARROW
+2B07;AL # DOWNWARDS BLACK ARROW
+2B08;AL # NORTH EAST BLACK ARROW
+2B09;AL # NORTH WEST BLACK ARROW
+2B0A;AL # SOUTH EAST BLACK ARROW
+2B0B;AL # SOUTH WEST BLACK ARROW
+2B0C;AL # LEFT RIGHT BLACK ARROW
+2B0D;AL # UP DOWN BLACK ARROW
+2B0E;AL # RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F;AL # RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10;AL # LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11;AL # LEFTWARDS ARROW WITH TIP UPWARDS
+2B12;AL # SQUARE WITH TOP HALF BLACK
+2B13;AL # SQUARE WITH BOTTOM HALF BLACK
+2C00;AL # GLAGOLITIC CAPITAL LETTER AZU
+2C01;AL # GLAGOLITIC CAPITAL LETTER BUKY
+2C02;AL # GLAGOLITIC CAPITAL LETTER VEDE
+2C03;AL # GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C04;AL # GLAGOLITIC CAPITAL LETTER DOBRO
+2C05;AL # GLAGOLITIC CAPITAL LETTER YESTU
+2C06;AL # GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C07;AL # GLAGOLITIC CAPITAL LETTER DZELO
+2C08;AL # GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C09;AL # GLAGOLITIC CAPITAL LETTER IZHE
+2C0A;AL # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C0B;AL # GLAGOLITIC CAPITAL LETTER I
+2C0C;AL # GLAGOLITIC CAPITAL LETTER DJERVI
+2C0D;AL # GLAGOLITIC CAPITAL LETTER KAKO
+2C0E;AL # GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C0F;AL # GLAGOLITIC CAPITAL LETTER MYSLITE
+2C10;AL # GLAGOLITIC CAPITAL LETTER NASHI
+2C11;AL # GLAGOLITIC CAPITAL LETTER ONU
+2C12;AL # GLAGOLITIC CAPITAL LETTER POKOJI
+2C13;AL # GLAGOLITIC CAPITAL LETTER RITSI
+2C14;AL # GLAGOLITIC CAPITAL LETTER SLOVO
+2C15;AL # GLAGOLITIC CAPITAL LETTER TVRIDO
+2C16;AL # GLAGOLITIC CAPITAL LETTER UKU
+2C17;AL # GLAGOLITIC CAPITAL LETTER FRITU
+2C18;AL # GLAGOLITIC CAPITAL LETTER HERU
+2C19;AL # GLAGOLITIC CAPITAL LETTER OTU
+2C1A;AL # GLAGOLITIC CAPITAL LETTER PE
+2C1B;AL # GLAGOLITIC CAPITAL LETTER SHTA
+2C1C;AL # GLAGOLITIC CAPITAL LETTER TSI
+2C1D;AL # GLAGOLITIC CAPITAL LETTER CHRIVI
+2C1E;AL # GLAGOLITIC CAPITAL LETTER SHA
+2C1F;AL # GLAGOLITIC CAPITAL LETTER YERU
+2C20;AL # GLAGOLITIC CAPITAL LETTER YERI
+2C21;AL # GLAGOLITIC CAPITAL LETTER YATI
+2C22;AL # GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C23;AL # GLAGOLITIC CAPITAL LETTER YU
+2C24;AL # GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C25;AL # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C26;AL # GLAGOLITIC CAPITAL LETTER YO
+2C27;AL # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C28;AL # GLAGOLITIC CAPITAL LETTER BIG YUS
+2C29;AL # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C2A;AL # GLAGOLITIC CAPITAL LETTER FITA
+2C2B;AL # GLAGOLITIC CAPITAL LETTER IZHITSA
+2C2C;AL # GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C2D;AL # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C2E;AL # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30;AL # GLAGOLITIC SMALL LETTER AZU
+2C31;AL # GLAGOLITIC SMALL LETTER BUKY
+2C32;AL # GLAGOLITIC SMALL LETTER VEDE
+2C33;AL # GLAGOLITIC SMALL LETTER GLAGOLI
+2C34;AL # GLAGOLITIC SMALL LETTER DOBRO
+2C35;AL # GLAGOLITIC SMALL LETTER YESTU
+2C36;AL # GLAGOLITIC SMALL LETTER ZHIVETE
+2C37;AL # GLAGOLITIC SMALL LETTER DZELO
+2C38;AL # GLAGOLITIC SMALL LETTER ZEMLJA
+2C39;AL # GLAGOLITIC SMALL LETTER IZHE
+2C3A;AL # GLAGOLITIC SMALL LETTER INITIAL IZHE
+2C3B;AL # GLAGOLITIC SMALL LETTER I
+2C3C;AL # GLAGOLITIC SMALL LETTER DJERVI
+2C3D;AL # GLAGOLITIC SMALL LETTER KAKO
+2C3E;AL # GLAGOLITIC SMALL LETTER LJUDIJE
+2C3F;AL # GLAGOLITIC SMALL LETTER MYSLITE
+2C40;AL # GLAGOLITIC SMALL LETTER NASHI
+2C41;AL # GLAGOLITIC SMALL LETTER ONU
+2C42;AL # GLAGOLITIC SMALL LETTER POKOJI
+2C43;AL # GLAGOLITIC SMALL LETTER RITSI
+2C44;AL # GLAGOLITIC SMALL LETTER SLOVO
+2C45;AL # GLAGOLITIC SMALL LETTER TVRIDO
+2C46;AL # GLAGOLITIC SMALL LETTER UKU
+2C47;AL # GLAGOLITIC SMALL LETTER FRITU
+2C48;AL # GLAGOLITIC SMALL LETTER HERU
+2C49;AL # GLAGOLITIC SMALL LETTER OTU
+2C4A;AL # GLAGOLITIC SMALL LETTER PE
+2C4B;AL # GLAGOLITIC SMALL LETTER SHTA
+2C4C;AL # GLAGOLITIC SMALL LETTER TSI
+2C4D;AL # GLAGOLITIC SMALL LETTER CHRIVI
+2C4E;AL # GLAGOLITIC SMALL LETTER SHA
+2C4F;AL # GLAGOLITIC SMALL LETTER YERU
+2C50;AL # GLAGOLITIC SMALL LETTER YERI
+2C51;AL # GLAGOLITIC SMALL LETTER YATI
+2C52;AL # GLAGOLITIC SMALL LETTER SPIDERY HA
+2C53;AL # GLAGOLITIC SMALL LETTER YU
+2C54;AL # GLAGOLITIC SMALL LETTER SMALL YUS
+2C55;AL # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C56;AL # GLAGOLITIC SMALL LETTER YO
+2C57;AL # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C58;AL # GLAGOLITIC SMALL LETTER BIG YUS
+2C59;AL # GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C5A;AL # GLAGOLITIC SMALL LETTER FITA
+2C5B;AL # GLAGOLITIC SMALL LETTER IZHITSA
+2C5C;AL # GLAGOLITIC SMALL LETTER SHTAPIC
+2C5D;AL # GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C5E;AL # GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C80;AL # COPTIC CAPITAL LETTER ALFA
+2C81;AL # COPTIC SMALL LETTER ALFA
+2C82;AL # COPTIC CAPITAL LETTER VIDA
+2C83;AL # COPTIC SMALL LETTER VIDA
+2C84;AL # COPTIC CAPITAL LETTER GAMMA
+2C85;AL # COPTIC SMALL LETTER GAMMA
+2C86;AL # COPTIC CAPITAL LETTER DALDA
+2C87;AL # COPTIC SMALL LETTER DALDA
+2C88;AL # COPTIC CAPITAL LETTER EIE
+2C89;AL # COPTIC SMALL LETTER EIE
+2C8A;AL # COPTIC CAPITAL LETTER SOU
+2C8B;AL # COPTIC SMALL LETTER SOU
+2C8C;AL # COPTIC CAPITAL LETTER ZATA
+2C8D;AL # COPTIC SMALL LETTER ZATA
+2C8E;AL # COPTIC CAPITAL LETTER HATE
+2C8F;AL # COPTIC SMALL LETTER HATE
+2C90;AL # COPTIC CAPITAL LETTER THETHE
+2C91;AL # COPTIC SMALL LETTER THETHE
+2C92;AL # COPTIC CAPITAL LETTER IAUDA
+2C93;AL # COPTIC SMALL LETTER IAUDA
+2C94;AL # COPTIC CAPITAL LETTER KAPA
+2C95;AL # COPTIC SMALL LETTER KAPA
+2C96;AL # COPTIC CAPITAL LETTER LAULA
+2C97;AL # COPTIC SMALL LETTER LAULA
+2C98;AL # COPTIC CAPITAL LETTER MI
+2C99;AL # COPTIC SMALL LETTER MI
+2C9A;AL # COPTIC CAPITAL LETTER NI
+2C9B;AL # COPTIC SMALL LETTER NI
+2C9C;AL # COPTIC CAPITAL LETTER KSI
+2C9D;AL # COPTIC SMALL LETTER KSI
+2C9E;AL # COPTIC CAPITAL LETTER O
+2C9F;AL # COPTIC SMALL LETTER O
+2CA0;AL # COPTIC CAPITAL LETTER PI
+2CA1;AL # COPTIC SMALL LETTER PI
+2CA2;AL # COPTIC CAPITAL LETTER RO
+2CA3;AL # COPTIC SMALL LETTER RO
+2CA4;AL # COPTIC CAPITAL LETTER SIMA
+2CA5;AL # COPTIC SMALL LETTER SIMA
+2CA6;AL # COPTIC CAPITAL LETTER TAU
+2CA7;AL # COPTIC SMALL LETTER TAU
+2CA8;AL # COPTIC CAPITAL LETTER UA
+2CA9;AL # COPTIC SMALL LETTER UA
+2CAA;AL # COPTIC CAPITAL LETTER FI
+2CAB;AL # COPTIC SMALL LETTER FI
+2CAC;AL # COPTIC CAPITAL LETTER KHI
+2CAD;AL # COPTIC SMALL LETTER KHI
+2CAE;AL # COPTIC CAPITAL LETTER PSI
+2CAF;AL # COPTIC SMALL LETTER PSI
+2CB0;AL # COPTIC CAPITAL LETTER OOU
+2CB1;AL # COPTIC SMALL LETTER OOU
+2CB2;AL # COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB3;AL # COPTIC SMALL LETTER DIALECT-P ALEF
+2CB4;AL # COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB5;AL # COPTIC SMALL LETTER OLD COPTIC AIN
+2CB6;AL # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB7;AL # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB8;AL # COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CB9;AL # COPTIC SMALL LETTER DIALECT-P KAPA
+2CBA;AL # COPTIC CAPITAL LETTER DIALECT-P NI
+2CBB;AL # COPTIC SMALL LETTER DIALECT-P NI
+2CBC;AL # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBD;AL # COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBE;AL # COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CBF;AL # COPTIC SMALL LETTER OLD COPTIC OOU
+2CC0;AL # COPTIC CAPITAL LETTER SAMPI
+2CC1;AL # COPTIC SMALL LETTER SAMPI
+2CC2;AL # COPTIC CAPITAL LETTER CROSSED SHEI
+2CC3;AL # COPTIC SMALL LETTER CROSSED SHEI
+2CC4;AL # COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC5;AL # COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC6;AL # COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC7;AL # COPTIC SMALL LETTER OLD COPTIC ESH
+2CC8;AL # COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CC9;AL # COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCA;AL # COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCB;AL # COPTIC SMALL LETTER DIALECT-P HORI
+2CCC;AL # COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCD;AL # COPTIC SMALL LETTER OLD COPTIC HORI
+2CCE;AL # COPTIC CAPITAL LETTER OLD COPTIC HA
+2CCF;AL # COPTIC SMALL LETTER OLD COPTIC HA
+2CD0;AL # COPTIC CAPITAL LETTER L-SHAPED HA
+2CD1;AL # COPTIC SMALL LETTER L-SHAPED HA
+2CD2;AL # COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD3;AL # COPTIC SMALL LETTER OLD COPTIC HEI
+2CD4;AL # COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD5;AL # COPTIC SMALL LETTER OLD COPTIC HAT
+2CD6;AL # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD7;AL # COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD8;AL # COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CD9;AL # COPTIC SMALL LETTER OLD COPTIC DJA
+2CDA;AL # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDB;AL # COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDC;AL # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDD;AL # COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDE;AL # COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CDF;AL # COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE0;AL # COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE1;AL # COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE2;AL # COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CE3;AL # COPTIC SMALL LETTER OLD NUBIAN WAU
+2CE4;AL # COPTIC SYMBOL KAI
+2CE5;AL # COPTIC SYMBOL MI RO
+2CE6;AL # COPTIC SYMBOL PI RO
+2CE7;AL # COPTIC SYMBOL STAUROS
+2CE8;AL # COPTIC SYMBOL TAU RO
+2CE9;AL # COPTIC SYMBOL KHI RO
+2CEA;AL # COPTIC SYMBOL SHIMA SIMA
+2CF9;BA # COPTIC OLD NUBIAN FULL STOP
+2CFA;BA # COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB;BA # COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC;BA # COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD;AL # COPTIC FRACTION ONE HALF
+2CFE;BA # COPTIC FULL STOP
+2CFF;BA # COPTIC MORPHOLOGICAL DIVIDER
+2D00;AL # GEORGIAN SMALL LETTER AN
+2D01;AL # GEORGIAN SMALL LETTER BAN
+2D02;AL # GEORGIAN SMALL LETTER GAN
+2D03;AL # GEORGIAN SMALL LETTER DON
+2D04;AL # GEORGIAN SMALL LETTER EN
+2D05;AL # GEORGIAN SMALL LETTER VIN
+2D06;AL # GEORGIAN SMALL LETTER ZEN
+2D07;AL # GEORGIAN SMALL LETTER TAN
+2D08;AL # GEORGIAN SMALL LETTER IN
+2D09;AL # GEORGIAN SMALL LETTER KAN
+2D0A;AL # GEORGIAN SMALL LETTER LAS
+2D0B;AL # GEORGIAN SMALL LETTER MAN
+2D0C;AL # GEORGIAN SMALL LETTER NAR
+2D0D;AL # GEORGIAN SMALL LETTER ON
+2D0E;AL # GEORGIAN SMALL LETTER PAR
+2D0F;AL # GEORGIAN SMALL LETTER ZHAR
+2D10;AL # GEORGIAN SMALL LETTER RAE
+2D11;AL # GEORGIAN SMALL LETTER SAN
+2D12;AL # GEORGIAN SMALL LETTER TAR
+2D13;AL # GEORGIAN SMALL LETTER UN
+2D14;AL # GEORGIAN SMALL LETTER PHAR
+2D15;AL # GEORGIAN SMALL LETTER KHAR
+2D16;AL # GEORGIAN SMALL LETTER GHAN
+2D17;AL # GEORGIAN SMALL LETTER QAR
+2D18;AL # GEORGIAN SMALL LETTER SHIN
+2D19;AL # GEORGIAN SMALL LETTER CHIN
+2D1A;AL # GEORGIAN SMALL LETTER CAN
+2D1B;AL # GEORGIAN SMALL LETTER JIL
+2D1C;AL # GEORGIAN SMALL LETTER CIL
+2D1D;AL # GEORGIAN SMALL LETTER CHAR
+2D1E;AL # GEORGIAN SMALL LETTER XAN
+2D1F;AL # GEORGIAN SMALL LETTER JHAN
+2D20;AL # GEORGIAN SMALL LETTER HAE
+2D21;AL # GEORGIAN SMALL LETTER HE
+2D22;AL # GEORGIAN SMALL LETTER HIE
+2D23;AL # GEORGIAN SMALL LETTER WE
+2D24;AL # GEORGIAN SMALL LETTER HAR
+2D25;AL # GEORGIAN SMALL LETTER HOE
+2D30;AL # TIFINAGH LETTER YA
+2D31;AL # TIFINAGH LETTER YAB
+2D32;AL # TIFINAGH LETTER YABH
+2D33;AL # TIFINAGH LETTER YAG
+2D34;AL # TIFINAGH LETTER YAGHH
+2D35;AL # TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36;AL # TIFINAGH LETTER YAJ
+2D37;AL # TIFINAGH LETTER YAD
+2D38;AL # TIFINAGH LETTER YADH
+2D39;AL # TIFINAGH LETTER YADD
+2D3A;AL # TIFINAGH LETTER YADDH
+2D3B;AL # TIFINAGH LETTER YEY
+2D3C;AL # TIFINAGH LETTER YAF
+2D3D;AL # TIFINAGH LETTER YAK
+2D3E;AL # TIFINAGH LETTER TUAREG YAK
+2D3F;AL # TIFINAGH LETTER YAKHH
+2D40;AL # TIFINAGH LETTER YAH
+2D41;AL # TIFINAGH LETTER BERBER ACADEMY YAH
+2D42;AL # TIFINAGH LETTER TUAREG YAH
+2D43;AL # TIFINAGH LETTER YAHH
+2D44;AL # TIFINAGH LETTER YAA
+2D45;AL # TIFINAGH LETTER YAKH
+2D46;AL # TIFINAGH LETTER TUAREG YAKH
+2D47;AL # TIFINAGH LETTER YAQ
+2D48;AL # TIFINAGH LETTER TUAREG YAQ
+2D49;AL # TIFINAGH LETTER YI
+2D4A;AL # TIFINAGH LETTER YAZH
+2D4B;AL # TIFINAGH LETTER AHAGGAR YAZH
+2D4C;AL # TIFINAGH LETTER TUAREG YAZH
+2D4D;AL # TIFINAGH LETTER YAL
+2D4E;AL # TIFINAGH LETTER YAM
+2D4F;AL # TIFINAGH LETTER YAN
+2D50;AL # TIFINAGH LETTER TUAREG YAGN
+2D51;AL # TIFINAGH LETTER TUAREG YANG
+2D52;AL # TIFINAGH LETTER YAP
+2D53;AL # TIFINAGH LETTER YU
+2D54;AL # TIFINAGH LETTER YAR
+2D55;AL # TIFINAGH LETTER YARR
+2D56;AL # TIFINAGH LETTER YAGH
+2D57;AL # TIFINAGH LETTER TUAREG YAGH
+2D58;AL # TIFINAGH LETTER AYER YAGH
+2D59;AL # TIFINAGH LETTER YAS
+2D5A;AL # TIFINAGH LETTER YASS
+2D5B;AL # TIFINAGH LETTER YASH
+2D5C;AL # TIFINAGH LETTER YAT
+2D5D;AL # TIFINAGH LETTER YATH
+2D5E;AL # TIFINAGH LETTER YACH
+2D5F;AL # TIFINAGH LETTER YATT
+2D60;AL # TIFINAGH LETTER YAV
+2D61;AL # TIFINAGH LETTER YAW
+2D62;AL # TIFINAGH LETTER YAY
+2D63;AL # TIFINAGH LETTER YAZ
+2D64;AL # TIFINAGH LETTER TAWELLEMET YAZ
+2D65;AL # TIFINAGH LETTER YAZZ
+2D6F;AL # TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80;AL # ETHIOPIC SYLLABLE LOA
+2D81;AL # ETHIOPIC SYLLABLE MOA
+2D82;AL # ETHIOPIC SYLLABLE ROA
+2D83;AL # ETHIOPIC SYLLABLE SOA
+2D84;AL # ETHIOPIC SYLLABLE SHOA
+2D85;AL # ETHIOPIC SYLLABLE BOA
+2D86;AL # ETHIOPIC SYLLABLE TOA
+2D87;AL # ETHIOPIC SYLLABLE COA
+2D88;AL # ETHIOPIC SYLLABLE NOA
+2D89;AL # ETHIOPIC SYLLABLE NYOA
+2D8A;AL # ETHIOPIC SYLLABLE GLOTTAL OA
+2D8B;AL # ETHIOPIC SYLLABLE ZOA
+2D8C;AL # ETHIOPIC SYLLABLE DOA
+2D8D;AL # ETHIOPIC SYLLABLE DDOA
+2D8E;AL # ETHIOPIC SYLLABLE JOA
+2D8F;AL # ETHIOPIC SYLLABLE THOA
+2D90;AL # ETHIOPIC SYLLABLE CHOA
+2D91;AL # ETHIOPIC SYLLABLE PHOA
+2D92;AL # ETHIOPIC SYLLABLE POA
+2D93;AL # ETHIOPIC SYLLABLE GGWA
+2D94;AL # ETHIOPIC SYLLABLE GGWI
+2D95;AL # ETHIOPIC SYLLABLE GGWEE
+2D96;AL # ETHIOPIC SYLLABLE GGWE
+2DA0;AL # ETHIOPIC SYLLABLE SSA
+2DA1;AL # ETHIOPIC SYLLABLE SSU
+2DA2;AL # ETHIOPIC SYLLABLE SSI
+2DA3;AL # ETHIOPIC SYLLABLE SSAA
+2DA4;AL # ETHIOPIC SYLLABLE SSEE
+2DA5;AL # ETHIOPIC SYLLABLE SSE
+2DA6;AL # ETHIOPIC SYLLABLE SSO
+2DA8;AL # ETHIOPIC SYLLABLE CCA
+2DA9;AL # ETHIOPIC SYLLABLE CCU
+2DAA;AL # ETHIOPIC SYLLABLE CCI
+2DAB;AL # ETHIOPIC SYLLABLE CCAA
+2DAC;AL # ETHIOPIC SYLLABLE CCEE
+2DAD;AL # ETHIOPIC SYLLABLE CCE
+2DAE;AL # ETHIOPIC SYLLABLE CCO
+2DB0;AL # ETHIOPIC SYLLABLE ZZA
+2DB1;AL # ETHIOPIC SYLLABLE ZZU
+2DB2;AL # ETHIOPIC SYLLABLE ZZI
+2DB3;AL # ETHIOPIC SYLLABLE ZZAA
+2DB4;AL # ETHIOPIC SYLLABLE ZZEE
+2DB5;AL # ETHIOPIC SYLLABLE ZZE
+2DB6;AL # ETHIOPIC SYLLABLE ZZO
+2DB8;AL # ETHIOPIC SYLLABLE CCHA
+2DB9;AL # ETHIOPIC SYLLABLE CCHU
+2DBA;AL # ETHIOPIC SYLLABLE CCHI
+2DBB;AL # ETHIOPIC SYLLABLE CCHAA
+2DBC;AL # ETHIOPIC SYLLABLE CCHEE
+2DBD;AL # ETHIOPIC SYLLABLE CCHE
+2DBE;AL # ETHIOPIC SYLLABLE CCHO
+2DC0;AL # ETHIOPIC SYLLABLE QYA
+2DC1;AL # ETHIOPIC SYLLABLE QYU
+2DC2;AL # ETHIOPIC SYLLABLE QYI
+2DC3;AL # ETHIOPIC SYLLABLE QYAA
+2DC4;AL # ETHIOPIC SYLLABLE QYEE
+2DC5;AL # ETHIOPIC SYLLABLE QYE
+2DC6;AL # ETHIOPIC SYLLABLE QYO
+2DC8;AL # ETHIOPIC SYLLABLE KYA
+2DC9;AL # ETHIOPIC SYLLABLE KYU
+2DCA;AL # ETHIOPIC SYLLABLE KYI
+2DCB;AL # ETHIOPIC SYLLABLE KYAA
+2DCC;AL # ETHIOPIC SYLLABLE KYEE
+2DCD;AL # ETHIOPIC SYLLABLE KYE
+2DCE;AL # ETHIOPIC SYLLABLE KYO
+2DD0;AL # ETHIOPIC SYLLABLE XYA
+2DD1;AL # ETHIOPIC SYLLABLE XYU
+2DD2;AL # ETHIOPIC SYLLABLE XYI
+2DD3;AL # ETHIOPIC SYLLABLE XYAA
+2DD4;AL # ETHIOPIC SYLLABLE XYEE
+2DD5;AL # ETHIOPIC SYLLABLE XYE
+2DD6;AL # ETHIOPIC SYLLABLE XYO
+2DD8;AL # ETHIOPIC SYLLABLE GYA
+2DD9;AL # ETHIOPIC SYLLABLE GYU
+2DDA;AL # ETHIOPIC SYLLABLE GYI
+2DDB;AL # ETHIOPIC SYLLABLE GYAA
+2DDC;AL # ETHIOPIC SYLLABLE GYEE
+2DDD;AL # ETHIOPIC SYLLABLE GYE
+2DDE;AL # ETHIOPIC SYLLABLE GYO
+2E00;QU # RIGHT ANGLE SUBSTITUTION MARKER
+2E01;QU # RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02;QU # LEFT SUBSTITUTION BRACKET
+2E03;QU # RIGHT SUBSTITUTION BRACKET
+2E04;QU # LEFT DOTTED SUBSTITUTION BRACKET
+2E05;QU # RIGHT DOTTED SUBSTITUTION BRACKET
+2E06;QU # RAISED INTERPOLATION MARKER
+2E07;QU # RAISED DOTTED INTERPOLATION MARKER
+2E08;QU # DOTTED TRANSPOSITION MARKER
+2E09;QU # LEFT TRANSPOSITION BRACKET
+2E0A;QU # RIGHT TRANSPOSITION BRACKET
+2E0B;QU # RAISED SQUARE
+2E0C;QU # LEFT RAISED OMISSION BRACKET
+2E0D;QU # RIGHT RAISED OMISSION BRACKET
+2E0E;BA # EDITORIAL CORONIS
+2E0F;BA # PARAGRAPHOS
+2E10;BA # FORKED PARAGRAPHOS
+2E11;BA # REVERSED FORKED PARAGRAPHOS
+2E12;BA # HYPODIASTOLE
+2E13;BA # DOTTED OBELOS
+2E14;BA # DOWNWARDS ANCORA
+2E15;BA # UPWARDS ANCORA
+2E16;AL # DOTTED RIGHT-POINTING ANGLE
+2E17;BA # DOUBLE OBLIQUE HYPHEN
+2E1C;QU # LEFT LOW PARAPHRASE BRACKET
+2E1D;QU # RIGHT LOW PARAPHRASE BRACKET
+2E80;ID # CJK RADICAL REPEAT
+2E81;ID # CJK RADICAL CLIFF
+2E82;ID # CJK RADICAL SECOND ONE
+2E83;ID # CJK RADICAL SECOND TWO
+2E84;ID # CJK RADICAL SECOND THREE
+2E85;ID # CJK RADICAL PERSON
+2E86;ID # CJK RADICAL BOX
+2E87;ID # CJK RADICAL TABLE
+2E88;ID # CJK RADICAL KNIFE ONE
+2E89;ID # CJK RADICAL KNIFE TWO
+2E8A;ID # CJK RADICAL DIVINATION
+2E8B;ID # CJK RADICAL SEAL
+2E8C;ID # CJK RADICAL SMALL ONE
+2E8D;ID # CJK RADICAL SMALL TWO
+2E8E;ID # CJK RADICAL LAME ONE
+2E8F;ID # CJK RADICAL LAME TWO
+2E90;ID # CJK RADICAL LAME THREE
+2E91;ID # CJK RADICAL LAME FOUR
+2E92;ID # CJK RADICAL SNAKE
+2E93;ID # CJK RADICAL THREAD
+2E94;ID # CJK RADICAL SNOUT ONE
+2E95;ID # CJK RADICAL SNOUT TWO
+2E96;ID # CJK RADICAL HEART ONE
+2E97;ID # CJK RADICAL HEART TWO
+2E98;ID # CJK RADICAL HAND
+2E99;ID # CJK RADICAL RAP
+2E9B;ID # CJK RADICAL CHOKE
+2E9C;ID # CJK RADICAL SUN
+2E9D;ID # CJK RADICAL MOON
+2E9E;ID # CJK RADICAL DEATH
+2E9F;ID # CJK RADICAL MOTHER
+2EA0;ID # CJK RADICAL CIVILIAN
+2EA1;ID # CJK RADICAL WATER ONE
+2EA2;ID # CJK RADICAL WATER TWO
+2EA3;ID # CJK RADICAL FIRE
+2EA4;ID # CJK RADICAL PAW ONE
+2EA5;ID # CJK RADICAL PAW TWO
+2EA6;ID # CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+2EA7;ID # CJK RADICAL COW
+2EA8;ID # CJK RADICAL DOG
+2EA9;ID # CJK RADICAL JADE
+2EAA;ID # CJK RADICAL BOLT OF CLOTH
+2EAB;ID # CJK RADICAL EYE
+2EAC;ID # CJK RADICAL SPIRIT ONE
+2EAD;ID # CJK RADICAL SPIRIT TWO
+2EAE;ID # CJK RADICAL BAMBOO
+2EAF;ID # CJK RADICAL SILK
+2EB0;ID # CJK RADICAL C-SIMPLIFIED SILK
+2EB1;ID # CJK RADICAL NET ONE
+2EB2;ID # CJK RADICAL NET TWO
+2EB3;ID # CJK RADICAL NET THREE
+2EB4;ID # CJK RADICAL NET FOUR
+2EB5;ID # CJK RADICAL MESH
+2EB6;ID # CJK RADICAL SHEEP
+2EB7;ID # CJK RADICAL RAM
+2EB8;ID # CJK RADICAL EWE
+2EB9;ID # CJK RADICAL OLD
+2EBA;ID # CJK RADICAL BRUSH ONE
+2EBB;ID # CJK RADICAL BRUSH TWO
+2EBC;ID # CJK RADICAL MEAT
+2EBD;ID # CJK RADICAL MORTAR
+2EBE;ID # CJK RADICAL GRASS ONE
+2EBF;ID # CJK RADICAL GRASS TWO
+2EC0;ID # CJK RADICAL GRASS THREE
+2EC1;ID # CJK RADICAL TIGER
+2EC2;ID # CJK RADICAL CLOTHES
+2EC3;ID # CJK RADICAL WEST ONE
+2EC4;ID # CJK RADICAL WEST TWO
+2EC5;ID # CJK RADICAL C-SIMPLIFIED SEE
+2EC6;ID # CJK RADICAL SIMPLIFIED HORN
+2EC7;ID # CJK RADICAL HORN
+2EC8;ID # CJK RADICAL C-SIMPLIFIED SPEECH
+2EC9;ID # CJK RADICAL C-SIMPLIFIED SHELL
+2ECA;ID # CJK RADICAL FOOT
+2ECB;ID # CJK RADICAL C-SIMPLIFIED CART
+2ECC;ID # CJK RADICAL SIMPLIFIED WALK
+2ECD;ID # CJK RADICAL WALK ONE
+2ECE;ID # CJK RADICAL WALK TWO
+2ECF;ID # CJK RADICAL CITY
+2ED0;ID # CJK RADICAL C-SIMPLIFIED GOLD
+2ED1;ID # CJK RADICAL LONG ONE
+2ED2;ID # CJK RADICAL LONG TWO
+2ED3;ID # CJK RADICAL C-SIMPLIFIED LONG
+2ED4;ID # CJK RADICAL C-SIMPLIFIED GATE
+2ED5;ID # CJK RADICAL MOUND ONE
+2ED6;ID # CJK RADICAL MOUND TWO
+2ED7;ID # CJK RADICAL RAIN
+2ED8;ID # CJK RADICAL BLUE
+2ED9;ID # CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+2EDA;ID # CJK RADICAL C-SIMPLIFIED LEAF
+2EDB;ID # CJK RADICAL C-SIMPLIFIED WIND
+2EDC;ID # CJK RADICAL C-SIMPLIFIED FLY
+2EDD;ID # CJK RADICAL EAT ONE
+2EDE;ID # CJK RADICAL EAT TWO
+2EDF;ID # CJK RADICAL EAT THREE
+2EE0;ID # CJK RADICAL C-SIMPLIFIED EAT
+2EE1;ID # CJK RADICAL HEAD
+2EE2;ID # CJK RADICAL C-SIMPLIFIED HORSE
+2EE3;ID # CJK RADICAL BONE
+2EE4;ID # CJK RADICAL GHOST
+2EE5;ID # CJK RADICAL C-SIMPLIFIED FISH
+2EE6;ID # CJK RADICAL C-SIMPLIFIED BIRD
+2EE7;ID # CJK RADICAL C-SIMPLIFIED SALT
+2EE8;ID # CJK RADICAL SIMPLIFIED WHEAT
+2EE9;ID # CJK RADICAL SIMPLIFIED YELLOW
+2EEA;ID # CJK RADICAL C-SIMPLIFIED FROG
+2EEB;ID # CJK RADICAL J-SIMPLIFIED EVEN
+2EEC;ID # CJK RADICAL C-SIMPLIFIED EVEN
+2EED;ID # CJK RADICAL J-SIMPLIFIED TOOTH
+2EEE;ID # CJK RADICAL C-SIMPLIFIED TOOTH
+2EEF;ID # CJK RADICAL J-SIMPLIFIED DRAGON
+2EF0;ID # CJK RADICAL C-SIMPLIFIED DRAGON
+2EF1;ID # CJK RADICAL TURTLE
+2EF2;ID # CJK RADICAL J-SIMPLIFIED TURTLE
+2EF3;ID # CJK RADICAL C-SIMPLIFIED TURTLE
+2F00;ID # KANGXI RADICAL ONE
+2F01;ID # KANGXI RADICAL LINE
+2F02;ID # KANGXI RADICAL DOT
+2F03;ID # KANGXI RADICAL SLASH
+2F04;ID # KANGXI RADICAL SECOND
+2F05;ID # KANGXI RADICAL HOOK
+2F06;ID # KANGXI RADICAL TWO
+2F07;ID # KANGXI RADICAL LID
+2F08;ID # KANGXI RADICAL MAN
+2F09;ID # KANGXI RADICAL LEGS
+2F0A;ID # KANGXI RADICAL ENTER
+2F0B;ID # KANGXI RADICAL EIGHT
+2F0C;ID # KANGXI RADICAL DOWN BOX
+2F0D;ID # KANGXI RADICAL COVER
+2F0E;ID # KANGXI RADICAL ICE
+2F0F;ID # KANGXI RADICAL TABLE
+2F10;ID # KANGXI RADICAL OPEN BOX
+2F11;ID # KANGXI RADICAL KNIFE
+2F12;ID # KANGXI RADICAL POWER
+2F13;ID # KANGXI RADICAL WRAP
+2F14;ID # KANGXI RADICAL SPOON
+2F15;ID # KANGXI RADICAL RIGHT OPEN BOX
+2F16;ID # KANGXI RADICAL HIDING ENCLOSURE
+2F17;ID # KANGXI RADICAL TEN
+2F18;ID # KANGXI RADICAL DIVINATION
+2F19;ID # KANGXI RADICAL SEAL
+2F1A;ID # KANGXI RADICAL CLIFF
+2F1B;ID # KANGXI RADICAL PRIVATE
+2F1C;ID # KANGXI RADICAL AGAIN
+2F1D;ID # KANGXI RADICAL MOUTH
+2F1E;ID # KANGXI RADICAL ENCLOSURE
+2F1F;ID # KANGXI RADICAL EARTH
+2F20;ID # KANGXI RADICAL SCHOLAR
+2F21;ID # KANGXI RADICAL GO
+2F22;ID # KANGXI RADICAL GO SLOWLY
+2F23;ID # KANGXI RADICAL EVENING
+2F24;ID # KANGXI RADICAL BIG
+2F25;ID # KANGXI RADICAL WOMAN
+2F26;ID # KANGXI RADICAL CHILD
+2F27;ID # KANGXI RADICAL ROOF
+2F28;ID # KANGXI RADICAL INCH
+2F29;ID # KANGXI RADICAL SMALL
+2F2A;ID # KANGXI RADICAL LAME
+2F2B;ID # KANGXI RADICAL CORPSE
+2F2C;ID # KANGXI RADICAL SPROUT
+2F2D;ID # KANGXI RADICAL MOUNTAIN
+2F2E;ID # KANGXI RADICAL RIVER
+2F2F;ID # KANGXI RADICAL WORK
+2F30;ID # KANGXI RADICAL ONESELF
+2F31;ID # KANGXI RADICAL TURBAN
+2F32;ID # KANGXI RADICAL DRY
+2F33;ID # KANGXI RADICAL SHORT THREAD
+2F34;ID # KANGXI RADICAL DOTTED CLIFF
+2F35;ID # KANGXI RADICAL LONG STRIDE
+2F36;ID # KANGXI RADICAL TWO HANDS
+2F37;ID # KANGXI RADICAL SHOOT
+2F38;ID # KANGXI RADICAL BOW
+2F39;ID # KANGXI RADICAL SNOUT
+2F3A;ID # KANGXI RADICAL BRISTLE
+2F3B;ID # KANGXI RADICAL STEP
+2F3C;ID # KANGXI RADICAL HEART
+2F3D;ID # KANGXI RADICAL HALBERD
+2F3E;ID # KANGXI RADICAL DOOR
+2F3F;ID # KANGXI RADICAL HAND
+2F40;ID # KANGXI RADICAL BRANCH
+2F41;ID # KANGXI RADICAL RAP
+2F42;ID # KANGXI RADICAL SCRIPT
+2F43;ID # KANGXI RADICAL DIPPER
+2F44;ID # KANGXI RADICAL AXE
+2F45;ID # KANGXI RADICAL SQUARE
+2F46;ID # KANGXI RADICAL NOT
+2F47;ID # KANGXI RADICAL SUN
+2F48;ID # KANGXI RADICAL SAY
+2F49;ID # KANGXI RADICAL MOON
+2F4A;ID # KANGXI RADICAL TREE
+2F4B;ID # KANGXI RADICAL LACK
+2F4C;ID # KANGXI RADICAL STOP
+2F4D;ID # KANGXI RADICAL DEATH
+2F4E;ID # KANGXI RADICAL WEAPON
+2F4F;ID # KANGXI RADICAL DO NOT
+2F50;ID # KANGXI RADICAL COMPARE
+2F51;ID # KANGXI RADICAL FUR
+2F52;ID # KANGXI RADICAL CLAN
+2F53;ID # KANGXI RADICAL STEAM
+2F54;ID # KANGXI RADICAL WATER
+2F55;ID # KANGXI RADICAL FIRE
+2F56;ID # KANGXI RADICAL CLAW
+2F57;ID # KANGXI RADICAL FATHER
+2F58;ID # KANGXI RADICAL DOUBLE X
+2F59;ID # KANGXI RADICAL HALF TREE TRUNK
+2F5A;ID # KANGXI RADICAL SLICE
+2F5B;ID # KANGXI RADICAL FANG
+2F5C;ID # KANGXI RADICAL COW
+2F5D;ID # KANGXI RADICAL DOG
+2F5E;ID # KANGXI RADICAL PROFOUND
+2F5F;ID # KANGXI RADICAL JADE
+2F60;ID # KANGXI RADICAL MELON
+2F61;ID # KANGXI RADICAL TILE
+2F62;ID # KANGXI RADICAL SWEET
+2F63;ID # KANGXI RADICAL LIFE
+2F64;ID # KANGXI RADICAL USE
+2F65;ID # KANGXI RADICAL FIELD
+2F66;ID # KANGXI RADICAL BOLT OF CLOTH
+2F67;ID # KANGXI RADICAL SICKNESS
+2F68;ID # KANGXI RADICAL DOTTED TENT
+2F69;ID # KANGXI RADICAL WHITE
+2F6A;ID # KANGXI RADICAL SKIN
+2F6B;ID # KANGXI RADICAL DISH
+2F6C;ID # KANGXI RADICAL EYE
+2F6D;ID # KANGXI RADICAL SPEAR
+2F6E;ID # KANGXI RADICAL ARROW
+2F6F;ID # KANGXI RADICAL STONE
+2F70;ID # KANGXI RADICAL SPIRIT
+2F71;ID # KANGXI RADICAL TRACK
+2F72;ID # KANGXI RADICAL GRAIN
+2F73;ID # KANGXI RADICAL CAVE
+2F74;ID # KANGXI RADICAL STAND
+2F75;ID # KANGXI RADICAL BAMBOO
+2F76;ID # KANGXI RADICAL RICE
+2F77;ID # KANGXI RADICAL SILK
+2F78;ID # KANGXI RADICAL JAR
+2F79;ID # KANGXI RADICAL NET
+2F7A;ID # KANGXI RADICAL SHEEP
+2F7B;ID # KANGXI RADICAL FEATHER
+2F7C;ID # KANGXI RADICAL OLD
+2F7D;ID # KANGXI RADICAL AND
+2F7E;ID # KANGXI RADICAL PLOW
+2F7F;ID # KANGXI RADICAL EAR
+2F80;ID # KANGXI RADICAL BRUSH
+2F81;ID # KANGXI RADICAL MEAT
+2F82;ID # KANGXI RADICAL MINISTER
+2F83;ID # KANGXI RADICAL SELF
+2F84;ID # KANGXI RADICAL ARRIVE
+2F85;ID # KANGXI RADICAL MORTAR
+2F86;ID # KANGXI RADICAL TONGUE
+2F87;ID # KANGXI RADICAL OPPOSE
+2F88;ID # KANGXI RADICAL BOAT
+2F89;ID # KANGXI RADICAL STOPPING
+2F8A;ID # KANGXI RADICAL COLOR
+2F8B;ID # KANGXI RADICAL GRASS
+2F8C;ID # KANGXI RADICAL TIGER
+2F8D;ID # KANGXI RADICAL INSECT
+2F8E;ID # KANGXI RADICAL BLOOD
+2F8F;ID # KANGXI RADICAL WALK ENCLOSURE
+2F90;ID # KANGXI RADICAL CLOTHES
+2F91;ID # KANGXI RADICAL WEST
+2F92;ID # KANGXI RADICAL SEE
+2F93;ID # KANGXI RADICAL HORN
+2F94;ID # KANGXI RADICAL SPEECH
+2F95;ID # KANGXI RADICAL VALLEY
+2F96;ID # KANGXI RADICAL BEAN
+2F97;ID # KANGXI RADICAL PIG
+2F98;ID # KANGXI RADICAL BADGER
+2F99;ID # KANGXI RADICAL SHELL
+2F9A;ID # KANGXI RADICAL RED
+2F9B;ID # KANGXI RADICAL RUN
+2F9C;ID # KANGXI RADICAL FOOT
+2F9D;ID # KANGXI RADICAL BODY
+2F9E;ID # KANGXI RADICAL CART
+2F9F;ID # KANGXI RADICAL BITTER
+2FA0;ID # KANGXI RADICAL MORNING
+2FA1;ID # KANGXI RADICAL WALK
+2FA2;ID # KANGXI RADICAL CITY
+2FA3;ID # KANGXI RADICAL WINE
+2FA4;ID # KANGXI RADICAL DISTINGUISH
+2FA5;ID # KANGXI RADICAL VILLAGE
+2FA6;ID # KANGXI RADICAL GOLD
+2FA7;ID # KANGXI RADICAL LONG
+2FA8;ID # KANGXI RADICAL GATE
+2FA9;ID # KANGXI RADICAL MOUND
+2FAA;ID # KANGXI RADICAL SLAVE
+2FAB;ID # KANGXI RADICAL SHORT TAILED BIRD
+2FAC;ID # KANGXI RADICAL RAIN
+2FAD;ID # KANGXI RADICAL BLUE
+2FAE;ID # KANGXI RADICAL WRONG
+2FAF;ID # KANGXI RADICAL FACE
+2FB0;ID # KANGXI RADICAL LEATHER
+2FB1;ID # KANGXI RADICAL TANNED LEATHER
+2FB2;ID # KANGXI RADICAL LEEK
+2FB3;ID # KANGXI RADICAL SOUND
+2FB4;ID # KANGXI RADICAL LEAF
+2FB5;ID # KANGXI RADICAL WIND
+2FB6;ID # KANGXI RADICAL FLY
+2FB7;ID # KANGXI RADICAL EAT
+2FB8;ID # KANGXI RADICAL HEAD
+2FB9;ID # KANGXI RADICAL FRAGRANT
+2FBA;ID # KANGXI RADICAL HORSE
+2FBB;ID # KANGXI RADICAL BONE
+2FBC;ID # KANGXI RADICAL TALL
+2FBD;ID # KANGXI RADICAL HAIR
+2FBE;ID # KANGXI RADICAL FIGHT
+2FBF;ID # KANGXI RADICAL SACRIFICIAL WINE
+2FC0;ID # KANGXI RADICAL CAULDRON
+2FC1;ID # KANGXI RADICAL GHOST
+2FC2;ID # KANGXI RADICAL FISH
+2FC3;ID # KANGXI RADICAL BIRD
+2FC4;ID # KANGXI RADICAL SALT
+2FC5;ID # KANGXI RADICAL DEER
+2FC6;ID # KANGXI RADICAL WHEAT
+2FC7;ID # KANGXI RADICAL HEMP
+2FC8;ID # KANGXI RADICAL YELLOW
+2FC9;ID # KANGXI RADICAL MILLET
+2FCA;ID # KANGXI RADICAL BLACK
+2FCB;ID # KANGXI RADICAL EMBROIDERY
+2FCC;ID # KANGXI RADICAL FROG
+2FCD;ID # KANGXI RADICAL TRIPOD
+2FCE;ID # KANGXI RADICAL DRUM
+2FCF;ID # KANGXI RADICAL RAT
+2FD0;ID # KANGXI RADICAL NOSE
+2FD1;ID # KANGXI RADICAL EVEN
+2FD2;ID # KANGXI RADICAL TOOTH
+2FD3;ID # KANGXI RADICAL DRAGON
+2FD4;ID # KANGXI RADICAL TURTLE
+2FD5;ID # KANGXI RADICAL FLUTE
+2FF0;ID # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1;ID # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2;ID # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3;ID # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4;ID # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA;ID # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB;ID # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000;ID # IDEOGRAPHIC SPACE
+3001;CL # IDEOGRAPHIC COMMA
+3002;CL # IDEOGRAPHIC FULL STOP
+3003;ID # DITTO MARK
+3004;ID # JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005;NS # IDEOGRAPHIC ITERATION MARK
+3006;ID # IDEOGRAPHIC CLOSING MARK
+3007;ID # IDEOGRAPHIC NUMBER ZERO
+3008;OP # LEFT ANGLE BRACKET
+3009;CL # RIGHT ANGLE BRACKET
+300A;OP # LEFT DOUBLE ANGLE BRACKET
+300B;CL # RIGHT DOUBLE ANGLE BRACKET
+300C;OP # LEFT CORNER BRACKET
+300D;CL # RIGHT CORNER BRACKET
+300E;OP # LEFT WHITE CORNER BRACKET
+300F;CL # RIGHT WHITE CORNER BRACKET
+3010;OP # LEFT BLACK LENTICULAR BRACKET
+3011;CL # RIGHT BLACK LENTICULAR BRACKET
+3012;ID # POSTAL MARK
+3013;ID # GETA MARK
+3014;OP # LEFT TORTOISE SHELL BRACKET
+3015;CL # RIGHT TORTOISE SHELL BRACKET
+3016;OP # LEFT WHITE LENTICULAR BRACKET
+3017;CL # RIGHT WHITE LENTICULAR BRACKET
+3018;OP # LEFT WHITE TORTOISE SHELL BRACKET
+3019;CL # RIGHT WHITE TORTOISE SHELL BRACKET
+301A;OP # LEFT WHITE SQUARE BRACKET
+301B;CL # RIGHT WHITE SQUARE BRACKET
+301C;NS # WAVE DASH
+301D;OP # REVERSED DOUBLE PRIME QUOTATION MARK
+301E;CL # DOUBLE PRIME QUOTATION MARK
+301F;CL # LOW DOUBLE PRIME QUOTATION MARK
+3020;ID # POSTAL MARK FACE
+3021;ID # HANGZHOU NUMERAL ONE
+3022;ID # HANGZHOU NUMERAL TWO
+3023;ID # HANGZHOU NUMERAL THREE
+3024;ID # HANGZHOU NUMERAL FOUR
+3025;ID # HANGZHOU NUMERAL FIVE
+3026;ID # HANGZHOU NUMERAL SIX
+3027;ID # HANGZHOU NUMERAL SEVEN
+3028;ID # HANGZHOU NUMERAL EIGHT
+3029;ID # HANGZHOU NUMERAL NINE
+302A;CM # IDEOGRAPHIC LEVEL TONE MARK
+302B;CM # IDEOGRAPHIC RISING TONE MARK
+302C;CM # IDEOGRAPHIC DEPARTING TONE MARK
+302D;CM # IDEOGRAPHIC ENTERING TONE MARK
+302E;CM # HANGUL SINGLE DOT TONE MARK
+302F;CM # HANGUL DOUBLE DOT TONE MARK
+3030;ID # WAVY DASH
+3031;ID # VERTICAL KANA REPEAT MARK
+3032;ID # VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+3033;ID # VERTICAL KANA REPEAT MARK UPPER HALF
+3034;ID # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+3035;ID # VERTICAL KANA REPEAT MARK LOWER HALF
+3036;ID # CIRCLED POSTAL MARK
+3037;ID # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038;ID # HANGZHOU NUMERAL TEN
+3039;ID # HANGZHOU NUMERAL TWENTY
+303A;ID # HANGZHOU NUMERAL THIRTY
+303B;NS # VERTICAL IDEOGRAPHIC ITERATION MARK
+303C;NS # MASU MARK
+303D;ID # PART ALTERNATION MARK
+303E;ID # IDEOGRAPHIC VARIATION INDICATOR
+303F;ID # IDEOGRAPHIC HALF FILL SPACE
+3041;NS # HIRAGANA LETTER SMALL A
+3042;ID # HIRAGANA LETTER A
+3043;NS # HIRAGANA LETTER SMALL I
+3044;ID # HIRAGANA LETTER I
+3045;NS # HIRAGANA LETTER SMALL U
+3046;ID # HIRAGANA LETTER U
+3047;NS # HIRAGANA LETTER SMALL E
+3048;ID # HIRAGANA LETTER E
+3049;NS # HIRAGANA LETTER SMALL O
+304A;ID # HIRAGANA LETTER O
+304B;ID # HIRAGANA LETTER KA
+304C;ID # HIRAGANA LETTER GA
+304D;ID # HIRAGANA LETTER KI
+304E;ID # HIRAGANA LETTER GI
+304F;ID # HIRAGANA LETTER KU
+3050;ID # HIRAGANA LETTER GU
+3051;ID # HIRAGANA LETTER KE
+3052;ID # HIRAGANA LETTER GE
+3053;ID # HIRAGANA LETTER KO
+3054;ID # HIRAGANA LETTER GO
+3055;ID # HIRAGANA LETTER SA
+3056;ID # HIRAGANA LETTER ZA
+3057;ID # HIRAGANA LETTER SI
+3058;ID # HIRAGANA LETTER ZI
+3059;ID # HIRAGANA LETTER SU
+305A;ID # HIRAGANA LETTER ZU
+305B;ID # HIRAGANA LETTER SE
+305C;ID # HIRAGANA LETTER ZE
+305D;ID # HIRAGANA LETTER SO
+305E;ID # HIRAGANA LETTER ZO
+305F;ID # HIRAGANA LETTER TA
+3060;ID # HIRAGANA LETTER DA
+3061;ID # HIRAGANA LETTER TI
+3062;ID # HIRAGANA LETTER DI
+3063;NS # HIRAGANA LETTER SMALL TU
+3064;ID # HIRAGANA LETTER TU
+3065;ID # HIRAGANA LETTER DU
+3066;ID # HIRAGANA LETTER TE
+3067;ID # HIRAGANA LETTER DE
+3068;ID # HIRAGANA LETTER TO
+3069;ID # HIRAGANA LETTER DO
+306A;ID # HIRAGANA LETTER NA
+306B;ID # HIRAGANA LETTER NI
+306C;ID # HIRAGANA LETTER NU
+306D;ID # HIRAGANA LETTER NE
+306E;ID # HIRAGANA LETTER NO
+306F;ID # HIRAGANA LETTER HA
+3070;ID # HIRAGANA LETTER BA
+3071;ID # HIRAGANA LETTER PA
+3072;ID # HIRAGANA LETTER HI
+3073;ID # HIRAGANA LETTER BI
+3074;ID # HIRAGANA LETTER PI
+3075;ID # HIRAGANA LETTER HU
+3076;ID # HIRAGANA LETTER BU
+3077;ID # HIRAGANA LETTER PU
+3078;ID # HIRAGANA LETTER HE
+3079;ID # HIRAGANA LETTER BE
+307A;ID # HIRAGANA LETTER PE
+307B;ID # HIRAGANA LETTER HO
+307C;ID # HIRAGANA LETTER BO
+307D;ID # HIRAGANA LETTER PO
+307E;ID # HIRAGANA LETTER MA
+307F;ID # HIRAGANA LETTER MI
+3080;ID # HIRAGANA LETTER MU
+3081;ID # HIRAGANA LETTER ME
+3082;ID # HIRAGANA LETTER MO
+3083;NS # HIRAGANA LETTER SMALL YA
+3084;ID # HIRAGANA LETTER YA
+3085;NS # HIRAGANA LETTER SMALL YU
+3086;ID # HIRAGANA LETTER YU
+3087;NS # HIRAGANA LETTER SMALL YO
+3088;ID # HIRAGANA LETTER YO
+3089;ID # HIRAGANA LETTER RA
+308A;ID # HIRAGANA LETTER RI
+308B;ID # HIRAGANA LETTER RU
+308C;ID # HIRAGANA LETTER RE
+308D;ID # HIRAGANA LETTER RO
+308E;NS # HIRAGANA LETTER SMALL WA
+308F;ID # HIRAGANA LETTER WA
+3090;ID # HIRAGANA LETTER WI
+3091;ID # HIRAGANA LETTER WE
+3092;ID # HIRAGANA LETTER WO
+3093;ID # HIRAGANA LETTER N
+3094;ID # HIRAGANA LETTER VU
+3095;NS # HIRAGANA LETTER SMALL KA
+3096;NS # HIRAGANA LETTER SMALL KE
+3099;CM # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A;CM # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B;NS # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C;NS # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D;NS # HIRAGANA ITERATION MARK
+309E;NS # HIRAGANA VOICED ITERATION MARK
+309F;ID # HIRAGANA DIGRAPH YORI
+30A0;NS # KATAKANA-HIRAGANA DOUBLE HYPHEN
+30A1;NS # KATAKANA LETTER SMALL A
+30A2;ID # KATAKANA LETTER A
+30A3;NS # KATAKANA LETTER SMALL I
+30A4;ID # KATAKANA LETTER I
+30A5;NS # KATAKANA LETTER SMALL U
+30A6;ID # KATAKANA LETTER U
+30A7;NS # KATAKANA LETTER SMALL E
+30A8;ID # KATAKANA LETTER E
+30A9;NS # KATAKANA LETTER SMALL O
+30AA;ID # KATAKANA LETTER O
+30AB;ID # KATAKANA LETTER KA
+30AC;ID # KATAKANA LETTER GA
+30AD;ID # KATAKANA LETTER KI
+30AE;ID # KATAKANA LETTER GI
+30AF;ID # KATAKANA LETTER KU
+30B0;ID # KATAKANA LETTER GU
+30B1;ID # KATAKANA LETTER KE
+30B2;ID # KATAKANA LETTER GE
+30B3;ID # KATAKANA LETTER KO
+30B4;ID # KATAKANA LETTER GO
+30B5;ID # KATAKANA LETTER SA
+30B6;ID # KATAKANA LETTER ZA
+30B7;ID # KATAKANA LETTER SI
+30B8;ID # KATAKANA LETTER ZI
+30B9;ID # KATAKANA LETTER SU
+30BA;ID # KATAKANA LETTER ZU
+30BB;ID # KATAKANA LETTER SE
+30BC;ID # KATAKANA LETTER ZE
+30BD;ID # KATAKANA LETTER SO
+30BE;ID # KATAKANA LETTER ZO
+30BF;ID # KATAKANA LETTER TA
+30C0;ID # KATAKANA LETTER DA
+30C1;ID # KATAKANA LETTER TI
+30C2;ID # KATAKANA LETTER DI
+30C3;NS # KATAKANA LETTER SMALL TU
+30C4;ID # KATAKANA LETTER TU
+30C5;ID # KATAKANA LETTER DU
+30C6;ID # KATAKANA LETTER TE
+30C7;ID # KATAKANA LETTER DE
+30C8;ID # KATAKANA LETTER TO
+30C9;ID # KATAKANA LETTER DO
+30CA;ID # KATAKANA LETTER NA
+30CB;ID # KATAKANA LETTER NI
+30CC;ID # KATAKANA LETTER NU
+30CD;ID # KATAKANA LETTER NE
+30CE;ID # KATAKANA LETTER NO
+30CF;ID # KATAKANA LETTER HA
+30D0;ID # KATAKANA LETTER BA
+30D1;ID # KATAKANA LETTER PA
+30D2;ID # KATAKANA LETTER HI
+30D3;ID # KATAKANA LETTER BI
+30D4;ID # KATAKANA LETTER PI
+30D5;ID # KATAKANA LETTER HU
+30D6;ID # KATAKANA LETTER BU
+30D7;ID # KATAKANA LETTER PU
+30D8;ID # KATAKANA LETTER HE
+30D9;ID # KATAKANA LETTER BE
+30DA;ID # KATAKANA LETTER PE
+30DB;ID # KATAKANA LETTER HO
+30DC;ID # KATAKANA LETTER BO
+30DD;ID # KATAKANA LETTER PO
+30DE;ID # KATAKANA LETTER MA
+30DF;ID # KATAKANA LETTER MI
+30E0;ID # KATAKANA LETTER MU
+30E1;ID # KATAKANA LETTER ME
+30E2;ID # KATAKANA LETTER MO
+30E3;NS # KATAKANA LETTER SMALL YA
+30E4;ID # KATAKANA LETTER YA
+30E5;NS # KATAKANA LETTER SMALL YU
+30E6;ID # KATAKANA LETTER YU
+30E7;NS # KATAKANA LETTER SMALL YO
+30E8;ID # KATAKANA LETTER YO
+30E9;ID # KATAKANA LETTER RA
+30EA;ID # KATAKANA LETTER RI
+30EB;ID # KATAKANA LETTER RU
+30EC;ID # KATAKANA LETTER RE
+30ED;ID # KATAKANA LETTER RO
+30EE;NS # KATAKANA LETTER SMALL WA
+30EF;ID # KATAKANA LETTER WA
+30F0;ID # KATAKANA LETTER WI
+30F1;ID # KATAKANA LETTER WE
+30F2;ID # KATAKANA LETTER WO
+30F3;ID # KATAKANA LETTER N
+30F4;ID # KATAKANA LETTER VU
+30F5;NS # KATAKANA LETTER SMALL KA
+30F6;NS # KATAKANA LETTER SMALL KE
+30F7;ID # KATAKANA LETTER VA
+30F8;ID # KATAKANA LETTER VI
+30F9;ID # KATAKANA LETTER VE
+30FA;ID # KATAKANA LETTER VO
+30FB;NS # KATAKANA MIDDLE DOT
+30FC;NS # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD;NS # KATAKANA ITERATION MARK
+30FE;NS # KATAKANA VOICED ITERATION MARK
+30FF;ID # KATAKANA DIGRAPH KOTO
+3105;ID # BOPOMOFO LETTER B
+3106;ID # BOPOMOFO LETTER P
+3107;ID # BOPOMOFO LETTER M
+3108;ID # BOPOMOFO LETTER F
+3109;ID # BOPOMOFO LETTER D
+310A;ID # BOPOMOFO LETTER T
+310B;ID # BOPOMOFO LETTER N
+310C;ID # BOPOMOFO LETTER L
+310D;ID # BOPOMOFO LETTER G
+310E;ID # BOPOMOFO LETTER K
+310F;ID # BOPOMOFO LETTER H
+3110;ID # BOPOMOFO LETTER J
+3111;ID # BOPOMOFO LETTER Q
+3112;ID # BOPOMOFO LETTER X
+3113;ID # BOPOMOFO LETTER ZH
+3114;ID # BOPOMOFO LETTER CH
+3115;ID # BOPOMOFO LETTER SH
+3116;ID # BOPOMOFO LETTER R
+3117;ID # BOPOMOFO LETTER Z
+3118;ID # BOPOMOFO LETTER C
+3119;ID # BOPOMOFO LETTER S
+311A;ID # BOPOMOFO LETTER A
+311B;ID # BOPOMOFO LETTER O
+311C;ID # BOPOMOFO LETTER E
+311D;ID # BOPOMOFO LETTER EH
+311E;ID # BOPOMOFO LETTER AI
+311F;ID # BOPOMOFO LETTER EI
+3120;ID # BOPOMOFO LETTER AU
+3121;ID # BOPOMOFO LETTER OU
+3122;ID # BOPOMOFO LETTER AN
+3123;ID # BOPOMOFO LETTER EN
+3124;ID # BOPOMOFO LETTER ANG
+3125;ID # BOPOMOFO LETTER ENG
+3126;ID # BOPOMOFO LETTER ER
+3127;ID # BOPOMOFO LETTER I
+3128;ID # BOPOMOFO LETTER U
+3129;ID # BOPOMOFO LETTER IU
+312A;ID # BOPOMOFO LETTER V
+312B;ID # BOPOMOFO LETTER NG
+312C;ID # BOPOMOFO LETTER GN
+3131;ID # HANGUL LETTER KIYEOK
+3132;ID # HANGUL LETTER SSANGKIYEOK
+3133;ID # HANGUL LETTER KIYEOK-SIOS
+3134;ID # HANGUL LETTER NIEUN
+3135;ID # HANGUL LETTER NIEUN-CIEUC
+3136;ID # HANGUL LETTER NIEUN-HIEUH
+3137;ID # HANGUL LETTER TIKEUT
+3138;ID # HANGUL LETTER SSANGTIKEUT
+3139;ID # HANGUL LETTER RIEUL
+313A;ID # HANGUL LETTER RIEUL-KIYEOK
+313B;ID # HANGUL LETTER RIEUL-MIEUM
+313C;ID # HANGUL LETTER RIEUL-PIEUP
+313D;ID # HANGUL LETTER RIEUL-SIOS
+313E;ID # HANGUL LETTER RIEUL-THIEUTH
+313F;ID # HANGUL LETTER RIEUL-PHIEUPH
+3140;ID # HANGUL LETTER RIEUL-HIEUH
+3141;ID # HANGUL LETTER MIEUM
+3142;ID # HANGUL LETTER PIEUP
+3143;ID # HANGUL LETTER SSANGPIEUP
+3144;ID # HANGUL LETTER PIEUP-SIOS
+3145;ID # HANGUL LETTER SIOS
+3146;ID # HANGUL LETTER SSANGSIOS
+3147;ID # HANGUL LETTER IEUNG
+3148;ID # HANGUL LETTER CIEUC
+3149;ID # HANGUL LETTER SSANGCIEUC
+314A;ID # HANGUL LETTER CHIEUCH
+314B;ID # HANGUL LETTER KHIEUKH
+314C;ID # HANGUL LETTER THIEUTH
+314D;ID # HANGUL LETTER PHIEUPH
+314E;ID # HANGUL LETTER HIEUH
+314F;ID # HANGUL LETTER A
+3150;ID # HANGUL LETTER AE
+3151;ID # HANGUL LETTER YA
+3152;ID # HANGUL LETTER YAE
+3153;ID # HANGUL LETTER EO
+3154;ID # HANGUL LETTER E
+3155;ID # HANGUL LETTER YEO
+3156;ID # HANGUL LETTER YE
+3157;ID # HANGUL LETTER O
+3158;ID # HANGUL LETTER WA
+3159;ID # HANGUL LETTER WAE
+315A;ID # HANGUL LETTER OE
+315B;ID # HANGUL LETTER YO
+315C;ID # HANGUL LETTER U
+315D;ID # HANGUL LETTER WEO
+315E;ID # HANGUL LETTER WE
+315F;ID # HANGUL LETTER WI
+3160;ID # HANGUL LETTER YU
+3161;ID # HANGUL LETTER EU
+3162;ID # HANGUL LETTER YI
+3163;ID # HANGUL LETTER I
+3164;ID # HANGUL FILLER
+3165;ID # HANGUL LETTER SSANGNIEUN
+3166;ID # HANGUL LETTER NIEUN-TIKEUT
+3167;ID # HANGUL LETTER NIEUN-SIOS
+3168;ID # HANGUL LETTER NIEUN-PANSIOS
+3169;ID # HANGUL LETTER RIEUL-KIYEOK-SIOS
+316A;ID # HANGUL LETTER RIEUL-TIKEUT
+316B;ID # HANGUL LETTER RIEUL-PIEUP-SIOS
+316C;ID # HANGUL LETTER RIEUL-PANSIOS
+316D;ID # HANGUL LETTER RIEUL-YEORINHIEUH
+316E;ID # HANGUL LETTER MIEUM-PIEUP
+316F;ID # HANGUL LETTER MIEUM-SIOS
+3170;ID # HANGUL LETTER MIEUM-PANSIOS
+3171;ID # HANGUL LETTER KAPYEOUNMIEUM
+3172;ID # HANGUL LETTER PIEUP-KIYEOK
+3173;ID # HANGUL LETTER PIEUP-TIKEUT
+3174;ID # HANGUL LETTER PIEUP-SIOS-KIYEOK
+3175;ID # HANGUL LETTER PIEUP-SIOS-TIKEUT
+3176;ID # HANGUL LETTER PIEUP-CIEUC
+3177;ID # HANGUL LETTER PIEUP-THIEUTH
+3178;ID # HANGUL LETTER KAPYEOUNPIEUP
+3179;ID # HANGUL LETTER KAPYEOUNSSANGPIEUP
+317A;ID # HANGUL LETTER SIOS-KIYEOK
+317B;ID # HANGUL LETTER SIOS-NIEUN
+317C;ID # HANGUL LETTER SIOS-TIKEUT
+317D;ID # HANGUL LETTER SIOS-PIEUP
+317E;ID # HANGUL LETTER SIOS-CIEUC
+317F;ID # HANGUL LETTER PANSIOS
+3180;ID # HANGUL LETTER SSANGIEUNG
+3181;ID # HANGUL LETTER YESIEUNG
+3182;ID # HANGUL LETTER YESIEUNG-SIOS
+3183;ID # HANGUL LETTER YESIEUNG-PANSIOS
+3184;ID # HANGUL LETTER KAPYEOUNPHIEUPH
+3185;ID # HANGUL LETTER SSANGHIEUH
+3186;ID # HANGUL LETTER YEORINHIEUH
+3187;ID # HANGUL LETTER YO-YA
+3188;ID # HANGUL LETTER YO-YAE
+3189;ID # HANGUL LETTER YO-I
+318A;ID # HANGUL LETTER YU-YEO
+318B;ID # HANGUL LETTER YU-YE
+318C;ID # HANGUL LETTER YU-I
+318D;ID # HANGUL LETTER ARAEA
+318E;ID # HANGUL LETTER ARAEAE
+3190;ID # IDEOGRAPHIC ANNOTATION LINKING MARK
+3191;ID # IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192;ID # IDEOGRAPHIC ANNOTATION ONE MARK
+3193;ID # IDEOGRAPHIC ANNOTATION TWO MARK
+3194;ID # IDEOGRAPHIC ANNOTATION THREE MARK
+3195;ID # IDEOGRAPHIC ANNOTATION FOUR MARK
+3196;ID # IDEOGRAPHIC ANNOTATION TOP MARK
+3197;ID # IDEOGRAPHIC ANNOTATION MIDDLE MARK
+3198;ID # IDEOGRAPHIC ANNOTATION BOTTOM MARK
+3199;ID # IDEOGRAPHIC ANNOTATION FIRST MARK
+319A;ID # IDEOGRAPHIC ANNOTATION SECOND MARK
+319B;ID # IDEOGRAPHIC ANNOTATION THIRD MARK
+319C;ID # IDEOGRAPHIC ANNOTATION FOURTH MARK
+319D;ID # IDEOGRAPHIC ANNOTATION HEAVEN MARK
+319E;ID # IDEOGRAPHIC ANNOTATION EARTH MARK
+319F;ID # IDEOGRAPHIC ANNOTATION MAN MARK
+31A0;ID # BOPOMOFO LETTER BU
+31A1;ID # BOPOMOFO LETTER ZI
+31A2;ID # BOPOMOFO LETTER JI
+31A3;ID # BOPOMOFO LETTER GU
+31A4;ID # BOPOMOFO LETTER EE
+31A5;ID # BOPOMOFO LETTER ENN
+31A6;ID # BOPOMOFO LETTER OO
+31A7;ID # BOPOMOFO LETTER ONN
+31A8;ID # BOPOMOFO LETTER IR
+31A9;ID # BOPOMOFO LETTER ANN
+31AA;ID # BOPOMOFO LETTER INN
+31AB;ID # BOPOMOFO LETTER UNN
+31AC;ID # BOPOMOFO LETTER IM
+31AD;ID # BOPOMOFO LETTER NGG
+31AE;ID # BOPOMOFO LETTER AINN
+31AF;ID # BOPOMOFO LETTER AUNN
+31B0;ID # BOPOMOFO LETTER AM
+31B1;ID # BOPOMOFO LETTER OM
+31B2;ID # BOPOMOFO LETTER ONG
+31B3;ID # BOPOMOFO LETTER INNN
+31B4;ID # BOPOMOFO FINAL LETTER P
+31B5;ID # BOPOMOFO FINAL LETTER T
+31B6;ID # BOPOMOFO FINAL LETTER K
+31B7;ID # BOPOMOFO FINAL LETTER H
+31C0;ID # CJK STROKE T
+31C1;ID # CJK STROKE WG
+31C2;ID # CJK STROKE XG
+31C3;ID # CJK STROKE BXG
+31C4;ID # CJK STROKE SW
+31C5;ID # CJK STROKE HZZ
+31C6;ID # CJK STROKE HZG
+31C7;ID # CJK STROKE HP
+31C8;ID # CJK STROKE HZWG
+31C9;ID # CJK STROKE SZWG
+31CA;ID # CJK STROKE HZT
+31CB;ID # CJK STROKE HZZP
+31CC;ID # CJK STROKE HPWG
+31CD;ID # CJK STROKE HZW
+31CE;ID # CJK STROKE HZZZ
+31CF;ID # CJK STROKE N
+31F0;NS # KATAKANA LETTER SMALL KU
+31F1;NS # KATAKANA LETTER SMALL SI
+31F2;NS # KATAKANA LETTER SMALL SU
+31F3;NS # KATAKANA LETTER SMALL TO
+31F4;NS # KATAKANA LETTER SMALL NU
+31F5;NS # KATAKANA LETTER SMALL HA
+31F6;NS # KATAKANA LETTER SMALL HI
+31F7;NS # KATAKANA LETTER SMALL HU
+31F8;NS # KATAKANA LETTER SMALL HE
+31F9;NS # KATAKANA LETTER SMALL HO
+31FA;NS # KATAKANA LETTER SMALL MU
+31FB;NS # KATAKANA LETTER SMALL RA
+31FC;NS # KATAKANA LETTER SMALL RI
+31FD;NS # KATAKANA LETTER SMALL RU
+31FE;NS # KATAKANA LETTER SMALL RE
+31FF;NS # KATAKANA LETTER SMALL RO
+3200;ID # PARENTHESIZED HANGUL KIYEOK
+3201;ID # PARENTHESIZED HANGUL NIEUN
+3202;ID # PARENTHESIZED HANGUL TIKEUT
+3203;ID # PARENTHESIZED HANGUL RIEUL
+3204;ID # PARENTHESIZED HANGUL MIEUM
+3205;ID # PARENTHESIZED HANGUL PIEUP
+3206;ID # PARENTHESIZED HANGUL SIOS
+3207;ID # PARENTHESIZED HANGUL IEUNG
+3208;ID # PARENTHESIZED HANGUL CIEUC
+3209;ID # PARENTHESIZED HANGUL CHIEUCH
+320A;ID # PARENTHESIZED HANGUL KHIEUKH
+320B;ID # PARENTHESIZED HANGUL THIEUTH
+320C;ID # PARENTHESIZED HANGUL PHIEUPH
+320D;ID # PARENTHESIZED HANGUL HIEUH
+320E;ID # PARENTHESIZED HANGUL KIYEOK A
+320F;ID # PARENTHESIZED HANGUL NIEUN A
+3210;ID # PARENTHESIZED HANGUL TIKEUT A
+3211;ID # PARENTHESIZED HANGUL RIEUL A
+3212;ID # PARENTHESIZED HANGUL MIEUM A
+3213;ID # PARENTHESIZED HANGUL PIEUP A
+3214;ID # PARENTHESIZED HANGUL SIOS A
+3215;ID # PARENTHESIZED HANGUL IEUNG A
+3216;ID # PARENTHESIZED HANGUL CIEUC A
+3217;ID # PARENTHESIZED HANGUL CHIEUCH A
+3218;ID # PARENTHESIZED HANGUL KHIEUKH A
+3219;ID # PARENTHESIZED HANGUL THIEUTH A
+321A;ID # PARENTHESIZED HANGUL PHIEUPH A
+321B;ID # PARENTHESIZED HANGUL HIEUH A
+321C;ID # PARENTHESIZED HANGUL CIEUC U
+321D;ID # PARENTHESIZED KOREAN CHARACTER OJEON
+321E;ID # PARENTHESIZED KOREAN CHARACTER O HU
+3220;ID # PARENTHESIZED IDEOGRAPH ONE
+3221;ID # PARENTHESIZED IDEOGRAPH TWO
+3222;ID # PARENTHESIZED IDEOGRAPH THREE
+3223;ID # PARENTHESIZED IDEOGRAPH FOUR
+3224;ID # PARENTHESIZED IDEOGRAPH FIVE
+3225;ID # PARENTHESIZED IDEOGRAPH SIX
+3226;ID # PARENTHESIZED IDEOGRAPH SEVEN
+3227;ID # PARENTHESIZED IDEOGRAPH EIGHT
+3228;ID # PARENTHESIZED IDEOGRAPH NINE
+3229;ID # PARENTHESIZED IDEOGRAPH TEN
+322A;ID # PARENTHESIZED IDEOGRAPH MOON
+322B;ID # PARENTHESIZED IDEOGRAPH FIRE
+322C;ID # PARENTHESIZED IDEOGRAPH WATER
+322D;ID # PARENTHESIZED IDEOGRAPH WOOD
+322E;ID # PARENTHESIZED IDEOGRAPH METAL
+322F;ID # PARENTHESIZED IDEOGRAPH EARTH
+3230;ID # PARENTHESIZED IDEOGRAPH SUN
+3231;ID # PARENTHESIZED IDEOGRAPH STOCK
+3232;ID # PARENTHESIZED IDEOGRAPH HAVE
+3233;ID # PARENTHESIZED IDEOGRAPH SOCIETY
+3234;ID # PARENTHESIZED IDEOGRAPH NAME
+3235;ID # PARENTHESIZED IDEOGRAPH SPECIAL
+3236;ID # PARENTHESIZED IDEOGRAPH FINANCIAL
+3237;ID # PARENTHESIZED IDEOGRAPH CONGRATULATION
+3238;ID # PARENTHESIZED IDEOGRAPH LABOR
+3239;ID # PARENTHESIZED IDEOGRAPH REPRESENT
+323A;ID # PARENTHESIZED IDEOGRAPH CALL
+323B;ID # PARENTHESIZED IDEOGRAPH STUDY
+323C;ID # PARENTHESIZED IDEOGRAPH SUPERVISE
+323D;ID # PARENTHESIZED IDEOGRAPH ENTERPRISE
+323E;ID # PARENTHESIZED IDEOGRAPH RESOURCE
+323F;ID # PARENTHESIZED IDEOGRAPH ALLIANCE
+3240;ID # PARENTHESIZED IDEOGRAPH FESTIVAL
+3241;ID # PARENTHESIZED IDEOGRAPH REST
+3242;ID # PARENTHESIZED IDEOGRAPH SELF
+3243;ID # PARENTHESIZED IDEOGRAPH REACH
+3250;ID # PARTNERSHIP SIGN
+3251;ID # CIRCLED NUMBER TWENTY ONE
+3252;ID # CIRCLED NUMBER TWENTY TWO
+3253;ID # CIRCLED NUMBER TWENTY THREE
+3254;ID # CIRCLED NUMBER TWENTY FOUR
+3255;ID # CIRCLED NUMBER TWENTY FIVE
+3256;ID # CIRCLED NUMBER TWENTY SIX
+3257;ID # CIRCLED NUMBER TWENTY SEVEN
+3258;ID # CIRCLED NUMBER TWENTY EIGHT
+3259;ID # CIRCLED NUMBER TWENTY NINE
+325A;ID # CIRCLED NUMBER THIRTY
+325B;ID # CIRCLED NUMBER THIRTY ONE
+325C;ID # CIRCLED NUMBER THIRTY TWO
+325D;ID # CIRCLED NUMBER THIRTY THREE
+325E;ID # CIRCLED NUMBER THIRTY FOUR
+325F;ID # CIRCLED NUMBER THIRTY FIVE
+3260;ID # CIRCLED HANGUL KIYEOK
+3261;ID # CIRCLED HANGUL NIEUN
+3262;ID # CIRCLED HANGUL TIKEUT
+3263;ID # CIRCLED HANGUL RIEUL
+3264;ID # CIRCLED HANGUL MIEUM
+3265;ID # CIRCLED HANGUL PIEUP
+3266;ID # CIRCLED HANGUL SIOS
+3267;ID # CIRCLED HANGUL IEUNG
+3268;ID # CIRCLED HANGUL CIEUC
+3269;ID # CIRCLED HANGUL CHIEUCH
+326A;ID # CIRCLED HANGUL KHIEUKH
+326B;ID # CIRCLED HANGUL THIEUTH
+326C;ID # CIRCLED HANGUL PHIEUPH
+326D;ID # CIRCLED HANGUL HIEUH
+326E;ID # CIRCLED HANGUL KIYEOK A
+326F;ID # CIRCLED HANGUL NIEUN A
+3270;ID # CIRCLED HANGUL TIKEUT A
+3271;ID # CIRCLED HANGUL RIEUL A
+3272;ID # CIRCLED HANGUL MIEUM A
+3273;ID # CIRCLED HANGUL PIEUP A
+3274;ID # CIRCLED HANGUL SIOS A
+3275;ID # CIRCLED HANGUL IEUNG A
+3276;ID # CIRCLED HANGUL CIEUC A
+3277;ID # CIRCLED HANGUL CHIEUCH A
+3278;ID # CIRCLED HANGUL KHIEUKH A
+3279;ID # CIRCLED HANGUL THIEUTH A
+327A;ID # CIRCLED HANGUL PHIEUPH A
+327B;ID # CIRCLED HANGUL HIEUH A
+327C;ID # CIRCLED KOREAN CHARACTER CHAMKO
+327D;ID # CIRCLED KOREAN CHARACTER JUEUI
+327E;ID # CIRCLED HANGUL IEUNG U
+327F;ID # KOREAN STANDARD SYMBOL
+3280;ID # CIRCLED IDEOGRAPH ONE
+3281;ID # CIRCLED IDEOGRAPH TWO
+3282;ID # CIRCLED IDEOGRAPH THREE
+3283;ID # CIRCLED IDEOGRAPH FOUR
+3284;ID # CIRCLED IDEOGRAPH FIVE
+3285;ID # CIRCLED IDEOGRAPH SIX
+3286;ID # CIRCLED IDEOGRAPH SEVEN
+3287;ID # CIRCLED IDEOGRAPH EIGHT
+3288;ID # CIRCLED IDEOGRAPH NINE
+3289;ID # CIRCLED IDEOGRAPH TEN
+328A;ID # CIRCLED IDEOGRAPH MOON
+328B;ID # CIRCLED IDEOGRAPH FIRE
+328C;ID # CIRCLED IDEOGRAPH WATER
+328D;ID # CIRCLED IDEOGRAPH WOOD
+328E;ID # CIRCLED IDEOGRAPH METAL
+328F;ID # CIRCLED IDEOGRAPH EARTH
+3290;ID # CIRCLED IDEOGRAPH SUN
+3291;ID # CIRCLED IDEOGRAPH STOCK
+3292;ID # CIRCLED IDEOGRAPH HAVE
+3293;ID # CIRCLED IDEOGRAPH SOCIETY
+3294;ID # CIRCLED IDEOGRAPH NAME
+3295;ID # CIRCLED IDEOGRAPH SPECIAL
+3296;ID # CIRCLED IDEOGRAPH FINANCIAL
+3297;ID # CIRCLED IDEOGRAPH CONGRATULATION
+3298;ID # CIRCLED IDEOGRAPH LABOR
+3299;ID # CIRCLED IDEOGRAPH SECRET
+329A;ID # CIRCLED IDEOGRAPH MALE
+329B;ID # CIRCLED IDEOGRAPH FEMALE
+329C;ID # CIRCLED IDEOGRAPH SUITABLE
+329D;ID # CIRCLED IDEOGRAPH EXCELLENT
+329E;ID # CIRCLED IDEOGRAPH PRINT
+329F;ID # CIRCLED IDEOGRAPH ATTENTION
+32A0;ID # CIRCLED IDEOGRAPH ITEM
+32A1;ID # CIRCLED IDEOGRAPH REST
+32A2;ID # CIRCLED IDEOGRAPH COPY
+32A3;ID # CIRCLED IDEOGRAPH CORRECT
+32A4;ID # CIRCLED IDEOGRAPH HIGH
+32A5;ID # CIRCLED IDEOGRAPH CENTRE
+32A6;ID # CIRCLED IDEOGRAPH LOW
+32A7;ID # CIRCLED IDEOGRAPH LEFT
+32A8;ID # CIRCLED IDEOGRAPH RIGHT
+32A9;ID # CIRCLED IDEOGRAPH MEDICINE
+32AA;ID # CIRCLED IDEOGRAPH RELIGION
+32AB;ID # CIRCLED IDEOGRAPH STUDY
+32AC;ID # CIRCLED IDEOGRAPH SUPERVISE
+32AD;ID # CIRCLED IDEOGRAPH ENTERPRISE
+32AE;ID # CIRCLED IDEOGRAPH RESOURCE
+32AF;ID # CIRCLED IDEOGRAPH ALLIANCE
+32B0;ID # CIRCLED IDEOGRAPH NIGHT
+32B1;ID # CIRCLED NUMBER THIRTY SIX
+32B2;ID # CIRCLED NUMBER THIRTY SEVEN
+32B3;ID # CIRCLED NUMBER THIRTY EIGHT
+32B4;ID # CIRCLED NUMBER THIRTY NINE
+32B5;ID # CIRCLED NUMBER FORTY
+32B6;ID # CIRCLED NUMBER FORTY ONE
+32B7;ID # CIRCLED NUMBER FORTY TWO
+32B8;ID # CIRCLED NUMBER FORTY THREE
+32B9;ID # CIRCLED NUMBER FORTY FOUR
+32BA;ID # CIRCLED NUMBER FORTY FIVE
+32BB;ID # CIRCLED NUMBER FORTY SIX
+32BC;ID # CIRCLED NUMBER FORTY SEVEN
+32BD;ID # CIRCLED NUMBER FORTY EIGHT
+32BE;ID # CIRCLED NUMBER FORTY NINE
+32BF;ID # CIRCLED NUMBER FIFTY
+32C0;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+32C1;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+32C2;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+32C3;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+32C4;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+32C5;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+32C6;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+32C7;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+32C8;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+32C9;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+32CA;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+32CB;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32CC;ID # SQUARE HG
+32CD;ID # SQUARE ERG
+32CE;ID # SQUARE EV
+32CF;ID # LIMITED LIABILITY SIGN
+32D0;ID # CIRCLED KATAKANA A
+32D1;ID # CIRCLED KATAKANA I
+32D2;ID # CIRCLED KATAKANA U
+32D3;ID # CIRCLED KATAKANA E
+32D4;ID # CIRCLED KATAKANA O
+32D5;ID # CIRCLED KATAKANA KA
+32D6;ID # CIRCLED KATAKANA KI
+32D7;ID # CIRCLED KATAKANA KU
+32D8;ID # CIRCLED KATAKANA KE
+32D9;ID # CIRCLED KATAKANA KO
+32DA;ID # CIRCLED KATAKANA SA
+32DB;ID # CIRCLED KATAKANA SI
+32DC;ID # CIRCLED KATAKANA SU
+32DD;ID # CIRCLED KATAKANA SE
+32DE;ID # CIRCLED KATAKANA SO
+32DF;ID # CIRCLED KATAKANA TA
+32E0;ID # CIRCLED KATAKANA TI
+32E1;ID # CIRCLED KATAKANA TU
+32E2;ID # CIRCLED KATAKANA TE
+32E3;ID # CIRCLED KATAKANA TO
+32E4;ID # CIRCLED KATAKANA NA
+32E5;ID # CIRCLED KATAKANA NI
+32E6;ID # CIRCLED KATAKANA NU
+32E7;ID # CIRCLED KATAKANA NE
+32E8;ID # CIRCLED KATAKANA NO
+32E9;ID # CIRCLED KATAKANA HA
+32EA;ID # CIRCLED KATAKANA HI
+32EB;ID # CIRCLED KATAKANA HU
+32EC;ID # CIRCLED KATAKANA HE
+32ED;ID # CIRCLED KATAKANA HO
+32EE;ID # CIRCLED KATAKANA MA
+32EF;ID # CIRCLED KATAKANA MI
+32F0;ID # CIRCLED KATAKANA MU
+32F1;ID # CIRCLED KATAKANA ME
+32F2;ID # CIRCLED KATAKANA MO
+32F3;ID # CIRCLED KATAKANA YA
+32F4;ID # CIRCLED KATAKANA YU
+32F5;ID # CIRCLED KATAKANA YO
+32F6;ID # CIRCLED KATAKANA RA
+32F7;ID # CIRCLED KATAKANA RI
+32F8;ID # CIRCLED KATAKANA RU
+32F9;ID # CIRCLED KATAKANA RE
+32FA;ID # CIRCLED KATAKANA RO
+32FB;ID # CIRCLED KATAKANA WA
+32FC;ID # CIRCLED KATAKANA WI
+32FD;ID # CIRCLED KATAKANA WE
+32FE;ID # CIRCLED KATAKANA WO
+3300;ID # SQUARE APAATO
+3301;ID # SQUARE ARUHUA
+3302;ID # SQUARE ANPEA
+3303;ID # SQUARE AARU
+3304;ID # SQUARE ININGU
+3305;ID # SQUARE INTI
+3306;ID # SQUARE UON
+3307;ID # SQUARE ESUKUUDO
+3308;ID # SQUARE EEKAA
+3309;ID # SQUARE ONSU
+330A;ID # SQUARE OOMU
+330B;ID # SQUARE KAIRI
+330C;ID # SQUARE KARATTO
+330D;ID # SQUARE KARORII
+330E;ID # SQUARE GARON
+330F;ID # SQUARE GANMA
+3310;ID # SQUARE GIGA
+3311;ID # SQUARE GINII
+3312;ID # SQUARE KYURII
+3313;ID # SQUARE GIRUDAA
+3314;ID # SQUARE KIRO
+3315;ID # SQUARE KIROGURAMU
+3316;ID # SQUARE KIROMEETORU
+3317;ID # SQUARE KIROWATTO
+3318;ID # SQUARE GURAMU
+3319;ID # SQUARE GURAMUTON
+331A;ID # SQUARE KURUZEIRO
+331B;ID # SQUARE KUROONE
+331C;ID # SQUARE KEESU
+331D;ID # SQUARE KORUNA
+331E;ID # SQUARE KOOPO
+331F;ID # SQUARE SAIKURU
+3320;ID # SQUARE SANTIIMU
+3321;ID # SQUARE SIRINGU
+3322;ID # SQUARE SENTI
+3323;ID # SQUARE SENTO
+3324;ID # SQUARE DAASU
+3325;ID # SQUARE DESI
+3326;ID # SQUARE DORU
+3327;ID # SQUARE TON
+3328;ID # SQUARE NANO
+3329;ID # SQUARE NOTTO
+332A;ID # SQUARE HAITU
+332B;ID # SQUARE PAASENTO
+332C;ID # SQUARE PAATU
+332D;ID # SQUARE BAARERU
+332E;ID # SQUARE PIASUTORU
+332F;ID # SQUARE PIKURU
+3330;ID # SQUARE PIKO
+3331;ID # SQUARE BIRU
+3332;ID # SQUARE HUARADDO
+3333;ID # SQUARE HUIITO
+3334;ID # SQUARE BUSSYERU
+3335;ID # SQUARE HURAN
+3336;ID # SQUARE HEKUTAARU
+3337;ID # SQUARE PESO
+3338;ID # SQUARE PENIHI
+3339;ID # SQUARE HERUTU
+333A;ID # SQUARE PENSU
+333B;ID # SQUARE PEEZI
+333C;ID # SQUARE BEETA
+333D;ID # SQUARE POINTO
+333E;ID # SQUARE BORUTO
+333F;ID # SQUARE HON
+3340;ID # SQUARE PONDO
+3341;ID # SQUARE HOORU
+3342;ID # SQUARE HOON
+3343;ID # SQUARE MAIKURO
+3344;ID # SQUARE MAIRU
+3345;ID # SQUARE MAHHA
+3346;ID # SQUARE MARUKU
+3347;ID # SQUARE MANSYON
+3348;ID # SQUARE MIKURON
+3349;ID # SQUARE MIRI
+334A;ID # SQUARE MIRIBAARU
+334B;ID # SQUARE MEGA
+334C;ID # SQUARE MEGATON
+334D;ID # SQUARE MEETORU
+334E;ID # SQUARE YAADO
+334F;ID # SQUARE YAARU
+3350;ID # SQUARE YUAN
+3351;ID # SQUARE RITTORU
+3352;ID # SQUARE RIRA
+3353;ID # SQUARE RUPII
+3354;ID # SQUARE RUUBURU
+3355;ID # SQUARE REMU
+3356;ID # SQUARE RENTOGEN
+3357;ID # SQUARE WATTO
+3358;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+3359;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+335A;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+335B;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+335C;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+335D;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+335E;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+335F;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+3360;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+3361;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+3362;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+3363;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+3364;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+3365;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+3366;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+3367;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+3368;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+3369;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+336A;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+336B;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+336C;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+336D;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+336E;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+336F;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+3370;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+3371;ID # SQUARE HPA
+3372;ID # SQUARE DA
+3373;ID # SQUARE AU
+3374;ID # SQUARE BAR
+3375;ID # SQUARE OV
+3376;ID # SQUARE PC
+3377;ID # SQUARE DM
+3378;ID # SQUARE DM SQUARED
+3379;ID # SQUARE DM CUBED
+337A;ID # SQUARE IU
+337B;ID # SQUARE ERA NAME HEISEI
+337C;ID # SQUARE ERA NAME SYOUWA
+337D;ID # SQUARE ERA NAME TAISYOU
+337E;ID # SQUARE ERA NAME MEIZI
+337F;ID # SQUARE CORPORATION
+3380;ID # SQUARE PA AMPS
+3381;ID # SQUARE NA
+3382;ID # SQUARE MU A
+3383;ID # SQUARE MA
+3384;ID # SQUARE KA
+3385;ID # SQUARE KB
+3386;ID # SQUARE MB
+3387;ID # SQUARE GB
+3388;ID # SQUARE CAL
+3389;ID # SQUARE KCAL
+338A;ID # SQUARE PF
+338B;ID # SQUARE NF
+338C;ID # SQUARE MU F
+338D;ID # SQUARE MU G
+338E;ID # SQUARE MG
+338F;ID # SQUARE KG
+3390;ID # SQUARE HZ
+3391;ID # SQUARE KHZ
+3392;ID # SQUARE MHZ
+3393;ID # SQUARE GHZ
+3394;ID # SQUARE THZ
+3395;ID # SQUARE MU L
+3396;ID # SQUARE ML
+3397;ID # SQUARE DL
+3398;ID # SQUARE KL
+3399;ID # SQUARE FM
+339A;ID # SQUARE NM
+339B;ID # SQUARE MU M
+339C;ID # SQUARE MM
+339D;ID # SQUARE CM
+339E;ID # SQUARE KM
+339F;ID # SQUARE MM SQUARED
+33A0;ID # SQUARE CM SQUARED
+33A1;ID # SQUARE M SQUARED
+33A2;ID # SQUARE KM SQUARED
+33A3;ID # SQUARE MM CUBED
+33A4;ID # SQUARE CM CUBED
+33A5;ID # SQUARE M CUBED
+33A6;ID # SQUARE KM CUBED
+33A7;ID # SQUARE M OVER S
+33A8;ID # SQUARE M OVER S SQUARED
+33A9;ID # SQUARE PA
+33AA;ID # SQUARE KPA
+33AB;ID # SQUARE MPA
+33AC;ID # SQUARE GPA
+33AD;ID # SQUARE RAD
+33AE;ID # SQUARE RAD OVER S
+33AF;ID # SQUARE RAD OVER S SQUARED
+33B0;ID # SQUARE PS
+33B1;ID # SQUARE NS
+33B2;ID # SQUARE MU S
+33B3;ID # SQUARE MS
+33B4;ID # SQUARE PV
+33B5;ID # SQUARE NV
+33B6;ID # SQUARE MU V
+33B7;ID # SQUARE MV
+33B8;ID # SQUARE KV
+33B9;ID # SQUARE MV MEGA
+33BA;ID # SQUARE PW
+33BB;ID # SQUARE NW
+33BC;ID # SQUARE MU W
+33BD;ID # SQUARE MW
+33BE;ID # SQUARE KW
+33BF;ID # SQUARE MW MEGA
+33C0;ID # SQUARE K OHM
+33C1;ID # SQUARE M OHM
+33C2;ID # SQUARE AM
+33C3;ID # SQUARE BQ
+33C4;ID # SQUARE CC
+33C5;ID # SQUARE CD
+33C6;ID # SQUARE C OVER KG
+33C7;ID # SQUARE CO
+33C8;ID # SQUARE DB
+33C9;ID # SQUARE GY
+33CA;ID # SQUARE HA
+33CB;ID # SQUARE HP
+33CC;ID # SQUARE IN
+33CD;ID # SQUARE KK
+33CE;ID # SQUARE KM CAPITAL
+33CF;ID # SQUARE KT
+33D0;ID # SQUARE LM
+33D1;ID # SQUARE LN
+33D2;ID # SQUARE LOG
+33D3;ID # SQUARE LX
+33D4;ID # SQUARE MB SMALL
+33D5;ID # SQUARE MIL
+33D6;ID # SQUARE MOL
+33D7;ID # SQUARE PH
+33D8;ID # SQUARE PM
+33D9;ID # SQUARE PPM
+33DA;ID # SQUARE PR
+33DB;ID # SQUARE SR
+33DC;ID # SQUARE SV
+33DD;ID # SQUARE WB
+33DE;ID # SQUARE V OVER M
+33DF;ID # SQUARE A OVER M
+33E0;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+33E1;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+33E2;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+33E3;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+33E4;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+33E5;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+33E6;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+33E7;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+33E8;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+33E9;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+33EA;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+33EB;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+33EC;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+33ED;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+33EE;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+33EF;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+33F0;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+33F1;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+33F2;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+33F3;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+33F4;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+33F5;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+33F6;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+33F7;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+33F8;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+33F9;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+33FA;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+33FB;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+33FC;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+33FD;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+33FE;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+33FF;ID # SQUARE GAL
+3400..4DB5;ID # <CJK Ideograph Extension A, First>..<CJK Ideograph Extension A, Last>
+4DC0;AL # HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1;AL # HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2;AL # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3;AL # HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4;AL # HEXAGRAM FOR WAITING
+4DC5;AL # HEXAGRAM FOR CONFLICT
+4DC6;AL # HEXAGRAM FOR THE ARMY
+4DC7;AL # HEXAGRAM FOR HOLDING TOGETHER
+4DC8;AL # HEXAGRAM FOR SMALL TAMING
+4DC9;AL # HEXAGRAM FOR TREADING
+4DCA;AL # HEXAGRAM FOR PEACE
+4DCB;AL # HEXAGRAM FOR STANDSTILL
+4DCC;AL # HEXAGRAM FOR FELLOWSHIP
+4DCD;AL # HEXAGRAM FOR GREAT POSSESSION
+4DCE;AL # HEXAGRAM FOR MODESTY
+4DCF;AL # HEXAGRAM FOR ENTHUSIASM
+4DD0;AL # HEXAGRAM FOR FOLLOWING
+4DD1;AL # HEXAGRAM FOR WORK ON THE DECAYED
+4DD2;AL # HEXAGRAM FOR APPROACH
+4DD3;AL # HEXAGRAM FOR CONTEMPLATION
+4DD4;AL # HEXAGRAM FOR BITING THROUGH
+4DD5;AL # HEXAGRAM FOR GRACE
+4DD6;AL # HEXAGRAM FOR SPLITTING APART
+4DD7;AL # HEXAGRAM FOR RETURN
+4DD8;AL # HEXAGRAM FOR INNOCENCE
+4DD9;AL # HEXAGRAM FOR GREAT TAMING
+4DDA;AL # HEXAGRAM FOR MOUTH CORNERS
+4DDB;AL # HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC;AL # HEXAGRAM FOR THE ABYSMAL WATER
+4DDD;AL # HEXAGRAM FOR THE CLINGING FIRE
+4DDE;AL # HEXAGRAM FOR INFLUENCE
+4DDF;AL # HEXAGRAM FOR DURATION
+4DE0;AL # HEXAGRAM FOR RETREAT
+4DE1;AL # HEXAGRAM FOR GREAT POWER
+4DE2;AL # HEXAGRAM FOR PROGRESS
+4DE3;AL # HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4;AL # HEXAGRAM FOR THE FAMILY
+4DE5;AL # HEXAGRAM FOR OPPOSITION
+4DE6;AL # HEXAGRAM FOR OBSTRUCTION
+4DE7;AL # HEXAGRAM FOR DELIVERANCE
+4DE8;AL # HEXAGRAM FOR DECREASE
+4DE9;AL # HEXAGRAM FOR INCREASE
+4DEA;AL # HEXAGRAM FOR BREAKTHROUGH
+4DEB;AL # HEXAGRAM FOR COMING TO MEET
+4DEC;AL # HEXAGRAM FOR GATHERING TOGETHER
+4DED;AL # HEXAGRAM FOR PUSHING UPWARD
+4DEE;AL # HEXAGRAM FOR OPPRESSION
+4DEF;AL # HEXAGRAM FOR THE WELL
+4DF0;AL # HEXAGRAM FOR REVOLUTION
+4DF1;AL # HEXAGRAM FOR THE CAULDRON
+4DF2;AL # HEXAGRAM FOR THE AROUSING THUNDER
+4DF3;AL # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4;AL # HEXAGRAM FOR DEVELOPMENT
+4DF5;AL # HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6;AL # HEXAGRAM FOR ABUNDANCE
+4DF7;AL # HEXAGRAM FOR THE WANDERER
+4DF8;AL # HEXAGRAM FOR THE GENTLE WIND
+4DF9;AL # HEXAGRAM FOR THE JOYOUS LAKE
+4DFA;AL # HEXAGRAM FOR DISPERSION
+4DFB;AL # HEXAGRAM FOR LIMITATION
+4DFC;AL # HEXAGRAM FOR INNER TRUTH
+4DFD;AL # HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE;AL # HEXAGRAM FOR AFTER COMPLETION
+4DFF;AL # HEXAGRAM FOR BEFORE COMPLETION
+4E00..9FBB;ID # <CJK Ideograph, First>..<CJK Ideograph, Last>
+A000;ID # YI SYLLABLE IT
+A001;ID # YI SYLLABLE IX
+A002;ID # YI SYLLABLE I
+A003;ID # YI SYLLABLE IP
+A004;ID # YI SYLLABLE IET
+A005;ID # YI SYLLABLE IEX
+A006;ID # YI SYLLABLE IE
+A007;ID # YI SYLLABLE IEP
+A008;ID # YI SYLLABLE AT
+A009;ID # YI SYLLABLE AX
+A00A;ID # YI SYLLABLE A
+A00B;ID # YI SYLLABLE AP
+A00C;ID # YI SYLLABLE UOX
+A00D;ID # YI SYLLABLE UO
+A00E;ID # YI SYLLABLE UOP
+A00F;ID # YI SYLLABLE OT
+A010;ID # YI SYLLABLE OX
+A011;ID # YI SYLLABLE O
+A012;ID # YI SYLLABLE OP
+A013;ID # YI SYLLABLE EX
+A014;ID # YI SYLLABLE E
+A015;NS # YI SYLLABLE WU
+A016;ID # YI SYLLABLE BIT
+A017;ID # YI SYLLABLE BIX
+A018;ID # YI SYLLABLE BI
+A019;ID # YI SYLLABLE BIP
+A01A;ID # YI SYLLABLE BIET
+A01B;ID # YI SYLLABLE BIEX
+A01C;ID # YI SYLLABLE BIE
+A01D;ID # YI SYLLABLE BIEP
+A01E;ID # YI SYLLABLE BAT
+A01F;ID # YI SYLLABLE BAX
+A020;ID # YI SYLLABLE BA
+A021;ID # YI SYLLABLE BAP
+A022;ID # YI SYLLABLE BUOX
+A023;ID # YI SYLLABLE BUO
+A024;ID # YI SYLLABLE BUOP
+A025;ID # YI SYLLABLE BOT
+A026;ID # YI SYLLABLE BOX
+A027;ID # YI SYLLABLE BO
+A028;ID # YI SYLLABLE BOP
+A029;ID # YI SYLLABLE BEX
+A02A;ID # YI SYLLABLE BE
+A02B;ID # YI SYLLABLE BEP
+A02C;ID # YI SYLLABLE BUT
+A02D;ID # YI SYLLABLE BUX
+A02E;ID # YI SYLLABLE BU
+A02F;ID # YI SYLLABLE BUP
+A030;ID # YI SYLLABLE BURX
+A031;ID # YI SYLLABLE BUR
+A032;ID # YI SYLLABLE BYT
+A033;ID # YI SYLLABLE BYX
+A034;ID # YI SYLLABLE BY
+A035;ID # YI SYLLABLE BYP
+A036;ID # YI SYLLABLE BYRX
+A037;ID # YI SYLLABLE BYR
+A038;ID # YI SYLLABLE PIT
+A039;ID # YI SYLLABLE PIX
+A03A;ID # YI SYLLABLE PI
+A03B;ID # YI SYLLABLE PIP
+A03C;ID # YI SYLLABLE PIEX
+A03D;ID # YI SYLLABLE PIE
+A03E;ID # YI SYLLABLE PIEP
+A03F;ID # YI SYLLABLE PAT
+A040;ID # YI SYLLABLE PAX
+A041;ID # YI SYLLABLE PA
+A042;ID # YI SYLLABLE PAP
+A043;ID # YI SYLLABLE PUOX
+A044;ID # YI SYLLABLE PUO
+A045;ID # YI SYLLABLE PUOP
+A046;ID # YI SYLLABLE POT
+A047;ID # YI SYLLABLE POX
+A048;ID # YI SYLLABLE PO
+A049;ID # YI SYLLABLE POP
+A04A;ID # YI SYLLABLE PUT
+A04B;ID # YI SYLLABLE PUX
+A04C;ID # YI SYLLABLE PU
+A04D;ID # YI SYLLABLE PUP
+A04E;ID # YI SYLLABLE PURX
+A04F;ID # YI SYLLABLE PUR
+A050;ID # YI SYLLABLE PYT
+A051;ID # YI SYLLABLE PYX
+A052;ID # YI SYLLABLE PY
+A053;ID # YI SYLLABLE PYP
+A054;ID # YI SYLLABLE PYRX
+A055;ID # YI SYLLABLE PYR
+A056;ID # YI SYLLABLE BBIT
+A057;ID # YI SYLLABLE BBIX
+A058;ID # YI SYLLABLE BBI
+A059;ID # YI SYLLABLE BBIP
+A05A;ID # YI SYLLABLE BBIET
+A05B;ID # YI SYLLABLE BBIEX
+A05C;ID # YI SYLLABLE BBIE
+A05D;ID # YI SYLLABLE BBIEP
+A05E;ID # YI SYLLABLE BBAT
+A05F;ID # YI SYLLABLE BBAX
+A060;ID # YI SYLLABLE BBA
+A061;ID # YI SYLLABLE BBAP
+A062;ID # YI SYLLABLE BBUOX
+A063;ID # YI SYLLABLE BBUO
+A064;ID # YI SYLLABLE BBUOP
+A065;ID # YI SYLLABLE BBOT
+A066;ID # YI SYLLABLE BBOX
+A067;ID # YI SYLLABLE BBO
+A068;ID # YI SYLLABLE BBOP
+A069;ID # YI SYLLABLE BBEX
+A06A;ID # YI SYLLABLE BBE
+A06B;ID # YI SYLLABLE BBEP
+A06C;ID # YI SYLLABLE BBUT
+A06D;ID # YI SYLLABLE BBUX
+A06E;ID # YI SYLLABLE BBU
+A06F;ID # YI SYLLABLE BBUP
+A070;ID # YI SYLLABLE BBURX
+A071;ID # YI SYLLABLE BBUR
+A072;ID # YI SYLLABLE BBYT
+A073;ID # YI SYLLABLE BBYX
+A074;ID # YI SYLLABLE BBY
+A075;ID # YI SYLLABLE BBYP
+A076;ID # YI SYLLABLE NBIT
+A077;ID # YI SYLLABLE NBIX
+A078;ID # YI SYLLABLE NBI
+A079;ID # YI SYLLABLE NBIP
+A07A;ID # YI SYLLABLE NBIEX
+A07B;ID # YI SYLLABLE NBIE
+A07C;ID # YI SYLLABLE NBIEP
+A07D;ID # YI SYLLABLE NBAT
+A07E;ID # YI SYLLABLE NBAX
+A07F;ID # YI SYLLABLE NBA
+A080;ID # YI SYLLABLE NBAP
+A081;ID # YI SYLLABLE NBOT
+A082;ID # YI SYLLABLE NBOX
+A083;ID # YI SYLLABLE NBO
+A084;ID # YI SYLLABLE NBOP
+A085;ID # YI SYLLABLE NBUT
+A086;ID # YI SYLLABLE NBUX
+A087;ID # YI SYLLABLE NBU
+A088;ID # YI SYLLABLE NBUP
+A089;ID # YI SYLLABLE NBURX
+A08A;ID # YI SYLLABLE NBUR
+A08B;ID # YI SYLLABLE NBYT
+A08C;ID # YI SYLLABLE NBYX
+A08D;ID # YI SYLLABLE NBY
+A08E;ID # YI SYLLABLE NBYP
+A08F;ID # YI SYLLABLE NBYRX
+A090;ID # YI SYLLABLE NBYR
+A091;ID # YI SYLLABLE HMIT
+A092;ID # YI SYLLABLE HMIX
+A093;ID # YI SYLLABLE HMI
+A094;ID # YI SYLLABLE HMIP
+A095;ID # YI SYLLABLE HMIEX
+A096;ID # YI SYLLABLE HMIE
+A097;ID # YI SYLLABLE HMIEP
+A098;ID # YI SYLLABLE HMAT
+A099;ID # YI SYLLABLE HMAX
+A09A;ID # YI SYLLABLE HMA
+A09B;ID # YI SYLLABLE HMAP
+A09C;ID # YI SYLLABLE HMUOX
+A09D;ID # YI SYLLABLE HMUO
+A09E;ID # YI SYLLABLE HMUOP
+A09F;ID # YI SYLLABLE HMOT
+A0A0;ID # YI SYLLABLE HMOX
+A0A1;ID # YI SYLLABLE HMO
+A0A2;ID # YI SYLLABLE HMOP
+A0A3;ID # YI SYLLABLE HMUT
+A0A4;ID # YI SYLLABLE HMUX
+A0A5;ID # YI SYLLABLE HMU
+A0A6;ID # YI SYLLABLE HMUP
+A0A7;ID # YI SYLLABLE HMURX
+A0A8;ID # YI SYLLABLE HMUR
+A0A9;ID # YI SYLLABLE HMYX
+A0AA;ID # YI SYLLABLE HMY
+A0AB;ID # YI SYLLABLE HMYP
+A0AC;ID # YI SYLLABLE HMYRX
+A0AD;ID # YI SYLLABLE HMYR
+A0AE;ID # YI SYLLABLE MIT
+A0AF;ID # YI SYLLABLE MIX
+A0B0;ID # YI SYLLABLE MI
+A0B1;ID # YI SYLLABLE MIP
+A0B2;ID # YI SYLLABLE MIEX
+A0B3;ID # YI SYLLABLE MIE
+A0B4;ID # YI SYLLABLE MIEP
+A0B5;ID # YI SYLLABLE MAT
+A0B6;ID # YI SYLLABLE MAX
+A0B7;ID # YI SYLLABLE MA
+A0B8;ID # YI SYLLABLE MAP
+A0B9;ID # YI SYLLABLE MUOT
+A0BA;ID # YI SYLLABLE MUOX
+A0BB;ID # YI SYLLABLE MUO
+A0BC;ID # YI SYLLABLE MUOP
+A0BD;ID # YI SYLLABLE MOT
+A0BE;ID # YI SYLLABLE MOX
+A0BF;ID # YI SYLLABLE MO
+A0C0;ID # YI SYLLABLE MOP
+A0C1;ID # YI SYLLABLE MEX
+A0C2;ID # YI SYLLABLE ME
+A0C3;ID # YI SYLLABLE MUT
+A0C4;ID # YI SYLLABLE MUX
+A0C5;ID # YI SYLLABLE MU
+A0C6;ID # YI SYLLABLE MUP
+A0C7;ID # YI SYLLABLE MURX
+A0C8;ID # YI SYLLABLE MUR
+A0C9;ID # YI SYLLABLE MYT
+A0CA;ID # YI SYLLABLE MYX
+A0CB;ID # YI SYLLABLE MY
+A0CC;ID # YI SYLLABLE MYP
+A0CD;ID # YI SYLLABLE FIT
+A0CE;ID # YI SYLLABLE FIX
+A0CF;ID # YI SYLLABLE FI
+A0D0;ID # YI SYLLABLE FIP
+A0D1;ID # YI SYLLABLE FAT
+A0D2;ID # YI SYLLABLE FAX
+A0D3;ID # YI SYLLABLE FA
+A0D4;ID # YI SYLLABLE FAP
+A0D5;ID # YI SYLLABLE FOX
+A0D6;ID # YI SYLLABLE FO
+A0D7;ID # YI SYLLABLE FOP
+A0D8;ID # YI SYLLABLE FUT
+A0D9;ID # YI SYLLABLE FUX
+A0DA;ID # YI SYLLABLE FU
+A0DB;ID # YI SYLLABLE FUP
+A0DC;ID # YI SYLLABLE FURX
+A0DD;ID # YI SYLLABLE FUR
+A0DE;ID # YI SYLLABLE FYT
+A0DF;ID # YI SYLLABLE FYX
+A0E0;ID # YI SYLLABLE FY
+A0E1;ID # YI SYLLABLE FYP
+A0E2;ID # YI SYLLABLE VIT
+A0E3;ID # YI SYLLABLE VIX
+A0E4;ID # YI SYLLABLE VI
+A0E5;ID # YI SYLLABLE VIP
+A0E6;ID # YI SYLLABLE VIET
+A0E7;ID # YI SYLLABLE VIEX
+A0E8;ID # YI SYLLABLE VIE
+A0E9;ID # YI SYLLABLE VIEP
+A0EA;ID # YI SYLLABLE VAT
+A0EB;ID # YI SYLLABLE VAX
+A0EC;ID # YI SYLLABLE VA
+A0ED;ID # YI SYLLABLE VAP
+A0EE;ID # YI SYLLABLE VOT
+A0EF;ID # YI SYLLABLE VOX
+A0F0;ID # YI SYLLABLE VO
+A0F1;ID # YI SYLLABLE VOP
+A0F2;ID # YI SYLLABLE VEX
+A0F3;ID # YI SYLLABLE VEP
+A0F4;ID # YI SYLLABLE VUT
+A0F5;ID # YI SYLLABLE VUX
+A0F6;ID # YI SYLLABLE VU
+A0F7;ID # YI SYLLABLE VUP
+A0F8;ID # YI SYLLABLE VURX
+A0F9;ID # YI SYLLABLE VUR
+A0FA;ID # YI SYLLABLE VYT
+A0FB;ID # YI SYLLABLE VYX
+A0FC;ID # YI SYLLABLE VY
+A0FD;ID # YI SYLLABLE VYP
+A0FE;ID # YI SYLLABLE VYRX
+A0FF;ID # YI SYLLABLE VYR
+A100;ID # YI SYLLABLE DIT
+A101;ID # YI SYLLABLE DIX
+A102;ID # YI SYLLABLE DI
+A103;ID # YI SYLLABLE DIP
+A104;ID # YI SYLLABLE DIEX
+A105;ID # YI SYLLABLE DIE
+A106;ID # YI SYLLABLE DIEP
+A107;ID # YI SYLLABLE DAT
+A108;ID # YI SYLLABLE DAX
+A109;ID # YI SYLLABLE DA
+A10A;ID # YI SYLLABLE DAP
+A10B;ID # YI SYLLABLE DUOX
+A10C;ID # YI SYLLABLE DUO
+A10D;ID # YI SYLLABLE DOT
+A10E;ID # YI SYLLABLE DOX
+A10F;ID # YI SYLLABLE DO
+A110;ID # YI SYLLABLE DOP
+A111;ID # YI SYLLABLE DEX
+A112;ID # YI SYLLABLE DE
+A113;ID # YI SYLLABLE DEP
+A114;ID # YI SYLLABLE DUT
+A115;ID # YI SYLLABLE DUX
+A116;ID # YI SYLLABLE DU
+A117;ID # YI SYLLABLE DUP
+A118;ID # YI SYLLABLE DURX
+A119;ID # YI SYLLABLE DUR
+A11A;ID # YI SYLLABLE TIT
+A11B;ID # YI SYLLABLE TIX
+A11C;ID # YI SYLLABLE TI
+A11D;ID # YI SYLLABLE TIP
+A11E;ID # YI SYLLABLE TIEX
+A11F;ID # YI SYLLABLE TIE
+A120;ID # YI SYLLABLE TIEP
+A121;ID # YI SYLLABLE TAT
+A122;ID # YI SYLLABLE TAX
+A123;ID # YI SYLLABLE TA
+A124;ID # YI SYLLABLE TAP
+A125;ID # YI SYLLABLE TUOT
+A126;ID # YI SYLLABLE TUOX
+A127;ID # YI SYLLABLE TUO
+A128;ID # YI SYLLABLE TUOP
+A129;ID # YI SYLLABLE TOT
+A12A;ID # YI SYLLABLE TOX
+A12B;ID # YI SYLLABLE TO
+A12C;ID # YI SYLLABLE TOP
+A12D;ID # YI SYLLABLE TEX
+A12E;ID # YI SYLLABLE TE
+A12F;ID # YI SYLLABLE TEP
+A130;ID # YI SYLLABLE TUT
+A131;ID # YI SYLLABLE TUX
+A132;ID # YI SYLLABLE TU
+A133;ID # YI SYLLABLE TUP
+A134;ID # YI SYLLABLE TURX
+A135;ID # YI SYLLABLE TUR
+A136;ID # YI SYLLABLE DDIT
+A137;ID # YI SYLLABLE DDIX
+A138;ID # YI SYLLABLE DDI
+A139;ID # YI SYLLABLE DDIP
+A13A;ID # YI SYLLABLE DDIEX
+A13B;ID # YI SYLLABLE DDIE
+A13C;ID # YI SYLLABLE DDIEP
+A13D;ID # YI SYLLABLE DDAT
+A13E;ID # YI SYLLABLE DDAX
+A13F;ID # YI SYLLABLE DDA
+A140;ID # YI SYLLABLE DDAP
+A141;ID # YI SYLLABLE DDUOX
+A142;ID # YI SYLLABLE DDUO
+A143;ID # YI SYLLABLE DDUOP
+A144;ID # YI SYLLABLE DDOT
+A145;ID # YI SYLLABLE DDOX
+A146;ID # YI SYLLABLE DDO
+A147;ID # YI SYLLABLE DDOP
+A148;ID # YI SYLLABLE DDEX
+A149;ID # YI SYLLABLE DDE
+A14A;ID # YI SYLLABLE DDEP
+A14B;ID # YI SYLLABLE DDUT
+A14C;ID # YI SYLLABLE DDUX
+A14D;ID # YI SYLLABLE DDU
+A14E;ID # YI SYLLABLE DDUP
+A14F;ID # YI SYLLABLE DDURX
+A150;ID # YI SYLLABLE DDUR
+A151;ID # YI SYLLABLE NDIT
+A152;ID # YI SYLLABLE NDIX
+A153;ID # YI SYLLABLE NDI
+A154;ID # YI SYLLABLE NDIP
+A155;ID # YI SYLLABLE NDIEX
+A156;ID # YI SYLLABLE NDIE
+A157;ID # YI SYLLABLE NDAT
+A158;ID # YI SYLLABLE NDAX
+A159;ID # YI SYLLABLE NDA
+A15A;ID # YI SYLLABLE NDAP
+A15B;ID # YI SYLLABLE NDOT
+A15C;ID # YI SYLLABLE NDOX
+A15D;ID # YI SYLLABLE NDO
+A15E;ID # YI SYLLABLE NDOP
+A15F;ID # YI SYLLABLE NDEX
+A160;ID # YI SYLLABLE NDE
+A161;ID # YI SYLLABLE NDEP
+A162;ID # YI SYLLABLE NDUT
+A163;ID # YI SYLLABLE NDUX
+A164;ID # YI SYLLABLE NDU
+A165;ID # YI SYLLABLE NDUP
+A166;ID # YI SYLLABLE NDURX
+A167;ID # YI SYLLABLE NDUR
+A168;ID # YI SYLLABLE HNIT
+A169;ID # YI SYLLABLE HNIX
+A16A;ID # YI SYLLABLE HNI
+A16B;ID # YI SYLLABLE HNIP
+A16C;ID # YI SYLLABLE HNIET
+A16D;ID # YI SYLLABLE HNIEX
+A16E;ID # YI SYLLABLE HNIE
+A16F;ID # YI SYLLABLE HNIEP
+A170;ID # YI SYLLABLE HNAT
+A171;ID # YI SYLLABLE HNAX
+A172;ID # YI SYLLABLE HNA
+A173;ID # YI SYLLABLE HNAP
+A174;ID # YI SYLLABLE HNUOX
+A175;ID # YI SYLLABLE HNUO
+A176;ID # YI SYLLABLE HNOT
+A177;ID # YI SYLLABLE HNOX
+A178;ID # YI SYLLABLE HNOP
+A179;ID # YI SYLLABLE HNEX
+A17A;ID # YI SYLLABLE HNE
+A17B;ID # YI SYLLABLE HNEP
+A17C;ID # YI SYLLABLE HNUT
+A17D;ID # YI SYLLABLE NIT
+A17E;ID # YI SYLLABLE NIX
+A17F;ID # YI SYLLABLE NI
+A180;ID # YI SYLLABLE NIP
+A181;ID # YI SYLLABLE NIEX
+A182;ID # YI SYLLABLE NIE
+A183;ID # YI SYLLABLE NIEP
+A184;ID # YI SYLLABLE NAX
+A185;ID # YI SYLLABLE NA
+A186;ID # YI SYLLABLE NAP
+A187;ID # YI SYLLABLE NUOX
+A188;ID # YI SYLLABLE NUO
+A189;ID # YI SYLLABLE NUOP
+A18A;ID # YI SYLLABLE NOT
+A18B;ID # YI SYLLABLE NOX
+A18C;ID # YI SYLLABLE NO
+A18D;ID # YI SYLLABLE NOP
+A18E;ID # YI SYLLABLE NEX
+A18F;ID # YI SYLLABLE NE
+A190;ID # YI SYLLABLE NEP
+A191;ID # YI SYLLABLE NUT
+A192;ID # YI SYLLABLE NUX
+A193;ID # YI SYLLABLE NU
+A194;ID # YI SYLLABLE NUP
+A195;ID # YI SYLLABLE NURX
+A196;ID # YI SYLLABLE NUR
+A197;ID # YI SYLLABLE HLIT
+A198;ID # YI SYLLABLE HLIX
+A199;ID # YI SYLLABLE HLI
+A19A;ID # YI SYLLABLE HLIP
+A19B;ID # YI SYLLABLE HLIEX
+A19C;ID # YI SYLLABLE HLIE
+A19D;ID # YI SYLLABLE HLIEP
+A19E;ID # YI SYLLABLE HLAT
+A19F;ID # YI SYLLABLE HLAX
+A1A0;ID # YI SYLLABLE HLA
+A1A1;ID # YI SYLLABLE HLAP
+A1A2;ID # YI SYLLABLE HLUOX
+A1A3;ID # YI SYLLABLE HLUO
+A1A4;ID # YI SYLLABLE HLUOP
+A1A5;ID # YI SYLLABLE HLOX
+A1A6;ID # YI SYLLABLE HLO
+A1A7;ID # YI SYLLABLE HLOP
+A1A8;ID # YI SYLLABLE HLEX
+A1A9;ID # YI SYLLABLE HLE
+A1AA;ID # YI SYLLABLE HLEP
+A1AB;ID # YI SYLLABLE HLUT
+A1AC;ID # YI SYLLABLE HLUX
+A1AD;ID # YI SYLLABLE HLU
+A1AE;ID # YI SYLLABLE HLUP
+A1AF;ID # YI SYLLABLE HLURX
+A1B0;ID # YI SYLLABLE HLUR
+A1B1;ID # YI SYLLABLE HLYT
+A1B2;ID # YI SYLLABLE HLYX
+A1B3;ID # YI SYLLABLE HLY
+A1B4;ID # YI SYLLABLE HLYP
+A1B5;ID # YI SYLLABLE HLYRX
+A1B6;ID # YI SYLLABLE HLYR
+A1B7;ID # YI SYLLABLE LIT
+A1B8;ID # YI SYLLABLE LIX
+A1B9;ID # YI SYLLABLE LI
+A1BA;ID # YI SYLLABLE LIP
+A1BB;ID # YI SYLLABLE LIET
+A1BC;ID # YI SYLLABLE LIEX
+A1BD;ID # YI SYLLABLE LIE
+A1BE;ID # YI SYLLABLE LIEP
+A1BF;ID # YI SYLLABLE LAT
+A1C0;ID # YI SYLLABLE LAX
+A1C1;ID # YI SYLLABLE LA
+A1C2;ID # YI SYLLABLE LAP
+A1C3;ID # YI SYLLABLE LUOT
+A1C4;ID # YI SYLLABLE LUOX
+A1C5;ID # YI SYLLABLE LUO
+A1C6;ID # YI SYLLABLE LUOP
+A1C7;ID # YI SYLLABLE LOT
+A1C8;ID # YI SYLLABLE LOX
+A1C9;ID # YI SYLLABLE LO
+A1CA;ID # YI SYLLABLE LOP
+A1CB;ID # YI SYLLABLE LEX
+A1CC;ID # YI SYLLABLE LE
+A1CD;ID # YI SYLLABLE LEP
+A1CE;ID # YI SYLLABLE LUT
+A1CF;ID # YI SYLLABLE LUX
+A1D0;ID # YI SYLLABLE LU
+A1D1;ID # YI SYLLABLE LUP
+A1D2;ID # YI SYLLABLE LURX
+A1D3;ID # YI SYLLABLE LUR
+A1D4;ID # YI SYLLABLE LYT
+A1D5;ID # YI SYLLABLE LYX
+A1D6;ID # YI SYLLABLE LY
+A1D7;ID # YI SYLLABLE LYP
+A1D8;ID # YI SYLLABLE LYRX
+A1D9;ID # YI SYLLABLE LYR
+A1DA;ID # YI SYLLABLE GIT
+A1DB;ID # YI SYLLABLE GIX
+A1DC;ID # YI SYLLABLE GI
+A1DD;ID # YI SYLLABLE GIP
+A1DE;ID # YI SYLLABLE GIET
+A1DF;ID # YI SYLLABLE GIEX
+A1E0;ID # YI SYLLABLE GIE
+A1E1;ID # YI SYLLABLE GIEP
+A1E2;ID # YI SYLLABLE GAT
+A1E3;ID # YI SYLLABLE GAX
+A1E4;ID # YI SYLLABLE GA
+A1E5;ID # YI SYLLABLE GAP
+A1E6;ID # YI SYLLABLE GUOT
+A1E7;ID # YI SYLLABLE GUOX
+A1E8;ID # YI SYLLABLE GUO
+A1E9;ID # YI SYLLABLE GUOP
+A1EA;ID # YI SYLLABLE GOT
+A1EB;ID # YI SYLLABLE GOX
+A1EC;ID # YI SYLLABLE GO
+A1ED;ID # YI SYLLABLE GOP
+A1EE;ID # YI SYLLABLE GET
+A1EF;ID # YI SYLLABLE GEX
+A1F0;ID # YI SYLLABLE GE
+A1F1;ID # YI SYLLABLE GEP
+A1F2;ID # YI SYLLABLE GUT
+A1F3;ID # YI SYLLABLE GUX
+A1F4;ID # YI SYLLABLE GU
+A1F5;ID # YI SYLLABLE GUP
+A1F6;ID # YI SYLLABLE GURX
+A1F7;ID # YI SYLLABLE GUR
+A1F8;ID # YI SYLLABLE KIT
+A1F9;ID # YI SYLLABLE KIX
+A1FA;ID # YI SYLLABLE KI
+A1FB;ID # YI SYLLABLE KIP
+A1FC;ID # YI SYLLABLE KIEX
+A1FD;ID # YI SYLLABLE KIE
+A1FE;ID # YI SYLLABLE KIEP
+A1FF;ID # YI SYLLABLE KAT
+A200;ID # YI SYLLABLE KAX
+A201;ID # YI SYLLABLE KA
+A202;ID # YI SYLLABLE KAP
+A203;ID # YI SYLLABLE KUOX
+A204;ID # YI SYLLABLE KUO
+A205;ID # YI SYLLABLE KUOP
+A206;ID # YI SYLLABLE KOT
+A207;ID # YI SYLLABLE KOX
+A208;ID # YI SYLLABLE KO
+A209;ID # YI SYLLABLE KOP
+A20A;ID # YI SYLLABLE KET
+A20B;ID # YI SYLLABLE KEX
+A20C;ID # YI SYLLABLE KE
+A20D;ID # YI SYLLABLE KEP
+A20E;ID # YI SYLLABLE KUT
+A20F;ID # YI SYLLABLE KUX
+A210;ID # YI SYLLABLE KU
+A211;ID # YI SYLLABLE KUP
+A212;ID # YI SYLLABLE KURX
+A213;ID # YI SYLLABLE KUR
+A214;ID # YI SYLLABLE GGIT
+A215;ID # YI SYLLABLE GGIX
+A216;ID # YI SYLLABLE GGI
+A217;ID # YI SYLLABLE GGIEX
+A218;ID # YI SYLLABLE GGIE
+A219;ID # YI SYLLABLE GGIEP
+A21A;ID # YI SYLLABLE GGAT
+A21B;ID # YI SYLLABLE GGAX
+A21C;ID # YI SYLLABLE GGA
+A21D;ID # YI SYLLABLE GGAP
+A21E;ID # YI SYLLABLE GGUOT
+A21F;ID # YI SYLLABLE GGUOX
+A220;ID # YI SYLLABLE GGUO
+A221;ID # YI SYLLABLE GGUOP
+A222;ID # YI SYLLABLE GGOT
+A223;ID # YI SYLLABLE GGOX
+A224;ID # YI SYLLABLE GGO
+A225;ID # YI SYLLABLE GGOP
+A226;ID # YI SYLLABLE GGET
+A227;ID # YI SYLLABLE GGEX
+A228;ID # YI SYLLABLE GGE
+A229;ID # YI SYLLABLE GGEP
+A22A;ID # YI SYLLABLE GGUT
+A22B;ID # YI SYLLABLE GGUX
+A22C;ID # YI SYLLABLE GGU
+A22D;ID # YI SYLLABLE GGUP
+A22E;ID # YI SYLLABLE GGURX
+A22F;ID # YI SYLLABLE GGUR
+A230;ID # YI SYLLABLE MGIEX
+A231;ID # YI SYLLABLE MGIE
+A232;ID # YI SYLLABLE MGAT
+A233;ID # YI SYLLABLE MGAX
+A234;ID # YI SYLLABLE MGA
+A235;ID # YI SYLLABLE MGAP
+A236;ID # YI SYLLABLE MGUOX
+A237;ID # YI SYLLABLE MGUO
+A238;ID # YI SYLLABLE MGUOP
+A239;ID # YI SYLLABLE MGOT
+A23A;ID # YI SYLLABLE MGOX
+A23B;ID # YI SYLLABLE MGO
+A23C;ID # YI SYLLABLE MGOP
+A23D;ID # YI SYLLABLE MGEX
+A23E;ID # YI SYLLABLE MGE
+A23F;ID # YI SYLLABLE MGEP
+A240;ID # YI SYLLABLE MGUT
+A241;ID # YI SYLLABLE MGUX
+A242;ID # YI SYLLABLE MGU
+A243;ID # YI SYLLABLE MGUP
+A244;ID # YI SYLLABLE MGURX
+A245;ID # YI SYLLABLE MGUR
+A246;ID # YI SYLLABLE HXIT
+A247;ID # YI SYLLABLE HXIX
+A248;ID # YI SYLLABLE HXI
+A249;ID # YI SYLLABLE HXIP
+A24A;ID # YI SYLLABLE HXIET
+A24B;ID # YI SYLLABLE HXIEX
+A24C;ID # YI SYLLABLE HXIE
+A24D;ID # YI SYLLABLE HXIEP
+A24E;ID # YI SYLLABLE HXAT
+A24F;ID # YI SYLLABLE HXAX
+A250;ID # YI SYLLABLE HXA
+A251;ID # YI SYLLABLE HXAP
+A252;ID # YI SYLLABLE HXUOT
+A253;ID # YI SYLLABLE HXUOX
+A254;ID # YI SYLLABLE HXUO
+A255;ID # YI SYLLABLE HXUOP
+A256;ID # YI SYLLABLE HXOT
+A257;ID # YI SYLLABLE HXOX
+A258;ID # YI SYLLABLE HXO
+A259;ID # YI SYLLABLE HXOP
+A25A;ID # YI SYLLABLE HXEX
+A25B;ID # YI SYLLABLE HXE
+A25C;ID # YI SYLLABLE HXEP
+A25D;ID # YI SYLLABLE NGIEX
+A25E;ID # YI SYLLABLE NGIE
+A25F;ID # YI SYLLABLE NGIEP
+A260;ID # YI SYLLABLE NGAT
+A261;ID # YI SYLLABLE NGAX
+A262;ID # YI SYLLABLE NGA
+A263;ID # YI SYLLABLE NGAP
+A264;ID # YI SYLLABLE NGUOT
+A265;ID # YI SYLLABLE NGUOX
+A266;ID # YI SYLLABLE NGUO
+A267;ID # YI SYLLABLE NGOT
+A268;ID # YI SYLLABLE NGOX
+A269;ID # YI SYLLABLE NGO
+A26A;ID # YI SYLLABLE NGOP
+A26B;ID # YI SYLLABLE NGEX
+A26C;ID # YI SYLLABLE NGE
+A26D;ID # YI SYLLABLE NGEP
+A26E;ID # YI SYLLABLE HIT
+A26F;ID # YI SYLLABLE HIEX
+A270;ID # YI SYLLABLE HIE
+A271;ID # YI SYLLABLE HAT
+A272;ID # YI SYLLABLE HAX
+A273;ID # YI SYLLABLE HA
+A274;ID # YI SYLLABLE HAP
+A275;ID # YI SYLLABLE HUOT
+A276;ID # YI SYLLABLE HUOX
+A277;ID # YI SYLLABLE HUO
+A278;ID # YI SYLLABLE HUOP
+A279;ID # YI SYLLABLE HOT
+A27A;ID # YI SYLLABLE HOX
+A27B;ID # YI SYLLABLE HO
+A27C;ID # YI SYLLABLE HOP
+A27D;ID # YI SYLLABLE HEX
+A27E;ID # YI SYLLABLE HE
+A27F;ID # YI SYLLABLE HEP
+A280;ID # YI SYLLABLE WAT
+A281;ID # YI SYLLABLE WAX
+A282;ID # YI SYLLABLE WA
+A283;ID # YI SYLLABLE WAP
+A284;ID # YI SYLLABLE WUOX
+A285;ID # YI SYLLABLE WUO
+A286;ID # YI SYLLABLE WUOP
+A287;ID # YI SYLLABLE WOX
+A288;ID # YI SYLLABLE WO
+A289;ID # YI SYLLABLE WOP
+A28A;ID # YI SYLLABLE WEX
+A28B;ID # YI SYLLABLE WE
+A28C;ID # YI SYLLABLE WEP
+A28D;ID # YI SYLLABLE ZIT
+A28E;ID # YI SYLLABLE ZIX
+A28F;ID # YI SYLLABLE ZI
+A290;ID # YI SYLLABLE ZIP
+A291;ID # YI SYLLABLE ZIEX
+A292;ID # YI SYLLABLE ZIE
+A293;ID # YI SYLLABLE ZIEP
+A294;ID # YI SYLLABLE ZAT
+A295;ID # YI SYLLABLE ZAX
+A296;ID # YI SYLLABLE ZA
+A297;ID # YI SYLLABLE ZAP
+A298;ID # YI SYLLABLE ZUOX
+A299;ID # YI SYLLABLE ZUO
+A29A;ID # YI SYLLABLE ZUOP
+A29B;ID # YI SYLLABLE ZOT
+A29C;ID # YI SYLLABLE ZOX
+A29D;ID # YI SYLLABLE ZO
+A29E;ID # YI SYLLABLE ZOP
+A29F;ID # YI SYLLABLE ZEX
+A2A0;ID # YI SYLLABLE ZE
+A2A1;ID # YI SYLLABLE ZEP
+A2A2;ID # YI SYLLABLE ZUT
+A2A3;ID # YI SYLLABLE ZUX
+A2A4;ID # YI SYLLABLE ZU
+A2A5;ID # YI SYLLABLE ZUP
+A2A6;ID # YI SYLLABLE ZURX
+A2A7;ID # YI SYLLABLE ZUR
+A2A8;ID # YI SYLLABLE ZYT
+A2A9;ID # YI SYLLABLE ZYX
+A2AA;ID # YI SYLLABLE ZY
+A2AB;ID # YI SYLLABLE ZYP
+A2AC;ID # YI SYLLABLE ZYRX
+A2AD;ID # YI SYLLABLE ZYR
+A2AE;ID # YI SYLLABLE CIT
+A2AF;ID # YI SYLLABLE CIX
+A2B0;ID # YI SYLLABLE CI
+A2B1;ID # YI SYLLABLE CIP
+A2B2;ID # YI SYLLABLE CIET
+A2B3;ID # YI SYLLABLE CIEX
+A2B4;ID # YI SYLLABLE CIE
+A2B5;ID # YI SYLLABLE CIEP
+A2B6;ID # YI SYLLABLE CAT
+A2B7;ID # YI SYLLABLE CAX
+A2B8;ID # YI SYLLABLE CA
+A2B9;ID # YI SYLLABLE CAP
+A2BA;ID # YI SYLLABLE CUOX
+A2BB;ID # YI SYLLABLE CUO
+A2BC;ID # YI SYLLABLE CUOP
+A2BD;ID # YI SYLLABLE COT
+A2BE;ID # YI SYLLABLE COX
+A2BF;ID # YI SYLLABLE CO
+A2C0;ID # YI SYLLABLE COP
+A2C1;ID # YI SYLLABLE CEX
+A2C2;ID # YI SYLLABLE CE
+A2C3;ID # YI SYLLABLE CEP
+A2C4;ID # YI SYLLABLE CUT
+A2C5;ID # YI SYLLABLE CUX
+A2C6;ID # YI SYLLABLE CU
+A2C7;ID # YI SYLLABLE CUP
+A2C8;ID # YI SYLLABLE CURX
+A2C9;ID # YI SYLLABLE CUR
+A2CA;ID # YI SYLLABLE CYT
+A2CB;ID # YI SYLLABLE CYX
+A2CC;ID # YI SYLLABLE CY
+A2CD;ID # YI SYLLABLE CYP
+A2CE;ID # YI SYLLABLE CYRX
+A2CF;ID # YI SYLLABLE CYR
+A2D0;ID # YI SYLLABLE ZZIT
+A2D1;ID # YI SYLLABLE ZZIX
+A2D2;ID # YI SYLLABLE ZZI
+A2D3;ID # YI SYLLABLE ZZIP
+A2D4;ID # YI SYLLABLE ZZIET
+A2D5;ID # YI SYLLABLE ZZIEX
+A2D6;ID # YI SYLLABLE ZZIE
+A2D7;ID # YI SYLLABLE ZZIEP
+A2D8;ID # YI SYLLABLE ZZAT
+A2D9;ID # YI SYLLABLE ZZAX
+A2DA;ID # YI SYLLABLE ZZA
+A2DB;ID # YI SYLLABLE ZZAP
+A2DC;ID # YI SYLLABLE ZZOX
+A2DD;ID # YI SYLLABLE ZZO
+A2DE;ID # YI SYLLABLE ZZOP
+A2DF;ID # YI SYLLABLE ZZEX
+A2E0;ID # YI SYLLABLE ZZE
+A2E1;ID # YI SYLLABLE ZZEP
+A2E2;ID # YI SYLLABLE ZZUX
+A2E3;ID # YI SYLLABLE ZZU
+A2E4;ID # YI SYLLABLE ZZUP
+A2E5;ID # YI SYLLABLE ZZURX
+A2E6;ID # YI SYLLABLE ZZUR
+A2E7;ID # YI SYLLABLE ZZYT
+A2E8;ID # YI SYLLABLE ZZYX
+A2E9;ID # YI SYLLABLE ZZY
+A2EA;ID # YI SYLLABLE ZZYP
+A2EB;ID # YI SYLLABLE ZZYRX
+A2EC;ID # YI SYLLABLE ZZYR
+A2ED;ID # YI SYLLABLE NZIT
+A2EE;ID # YI SYLLABLE NZIX
+A2EF;ID # YI SYLLABLE NZI
+A2F0;ID # YI SYLLABLE NZIP
+A2F1;ID # YI SYLLABLE NZIEX
+A2F2;ID # YI SYLLABLE NZIE
+A2F3;ID # YI SYLLABLE NZIEP
+A2F4;ID # YI SYLLABLE NZAT
+A2F5;ID # YI SYLLABLE NZAX
+A2F6;ID # YI SYLLABLE NZA
+A2F7;ID # YI SYLLABLE NZAP
+A2F8;ID # YI SYLLABLE NZUOX
+A2F9;ID # YI SYLLABLE NZUO
+A2FA;ID # YI SYLLABLE NZOX
+A2FB;ID # YI SYLLABLE NZOP
+A2FC;ID # YI SYLLABLE NZEX
+A2FD;ID # YI SYLLABLE NZE
+A2FE;ID # YI SYLLABLE NZUX
+A2FF;ID # YI SYLLABLE NZU
+A300;ID # YI SYLLABLE NZUP
+A301;ID # YI SYLLABLE NZURX
+A302;ID # YI SYLLABLE NZUR
+A303;ID # YI SYLLABLE NZYT
+A304;ID # YI SYLLABLE NZYX
+A305;ID # YI SYLLABLE NZY
+A306;ID # YI SYLLABLE NZYP
+A307;ID # YI SYLLABLE NZYRX
+A308;ID # YI SYLLABLE NZYR
+A309;ID # YI SYLLABLE SIT
+A30A;ID # YI SYLLABLE SIX
+A30B;ID # YI SYLLABLE SI
+A30C;ID # YI SYLLABLE SIP
+A30D;ID # YI SYLLABLE SIEX
+A30E;ID # YI SYLLABLE SIE
+A30F;ID # YI SYLLABLE SIEP
+A310;ID # YI SYLLABLE SAT
+A311;ID # YI SYLLABLE SAX
+A312;ID # YI SYLLABLE SA
+A313;ID # YI SYLLABLE SAP
+A314;ID # YI SYLLABLE SUOX
+A315;ID # YI SYLLABLE SUO
+A316;ID # YI SYLLABLE SUOP
+A317;ID # YI SYLLABLE SOT
+A318;ID # YI SYLLABLE SOX
+A319;ID # YI SYLLABLE SO
+A31A;ID # YI SYLLABLE SOP
+A31B;ID # YI SYLLABLE SEX
+A31C;ID # YI SYLLABLE SE
+A31D;ID # YI SYLLABLE SEP
+A31E;ID # YI SYLLABLE SUT
+A31F;ID # YI SYLLABLE SUX
+A320;ID # YI SYLLABLE SU
+A321;ID # YI SYLLABLE SUP
+A322;ID # YI SYLLABLE SURX
+A323;ID # YI SYLLABLE SUR
+A324;ID # YI SYLLABLE SYT
+A325;ID # YI SYLLABLE SYX
+A326;ID # YI SYLLABLE SY
+A327;ID # YI SYLLABLE SYP
+A328;ID # YI SYLLABLE SYRX
+A329;ID # YI SYLLABLE SYR
+A32A;ID # YI SYLLABLE SSIT
+A32B;ID # YI SYLLABLE SSIX
+A32C;ID # YI SYLLABLE SSI
+A32D;ID # YI SYLLABLE SSIP
+A32E;ID # YI SYLLABLE SSIEX
+A32F;ID # YI SYLLABLE SSIE
+A330;ID # YI SYLLABLE SSIEP
+A331;ID # YI SYLLABLE SSAT
+A332;ID # YI SYLLABLE SSAX
+A333;ID # YI SYLLABLE SSA
+A334;ID # YI SYLLABLE SSAP
+A335;ID # YI SYLLABLE SSOT
+A336;ID # YI SYLLABLE SSOX
+A337;ID # YI SYLLABLE SSO
+A338;ID # YI SYLLABLE SSOP
+A339;ID # YI SYLLABLE SSEX
+A33A;ID # YI SYLLABLE SSE
+A33B;ID # YI SYLLABLE SSEP
+A33C;ID # YI SYLLABLE SSUT
+A33D;ID # YI SYLLABLE SSUX
+A33E;ID # YI SYLLABLE SSU
+A33F;ID # YI SYLLABLE SSUP
+A340;ID # YI SYLLABLE SSYT
+A341;ID # YI SYLLABLE SSYX
+A342;ID # YI SYLLABLE SSY
+A343;ID # YI SYLLABLE SSYP
+A344;ID # YI SYLLABLE SSYRX
+A345;ID # YI SYLLABLE SSYR
+A346;ID # YI SYLLABLE ZHAT
+A347;ID # YI SYLLABLE ZHAX
+A348;ID # YI SYLLABLE ZHA
+A349;ID # YI SYLLABLE ZHAP
+A34A;ID # YI SYLLABLE ZHUOX
+A34B;ID # YI SYLLABLE ZHUO
+A34C;ID # YI SYLLABLE ZHUOP
+A34D;ID # YI SYLLABLE ZHOT
+A34E;ID # YI SYLLABLE ZHOX
+A34F;ID # YI SYLLABLE ZHO
+A350;ID # YI SYLLABLE ZHOP
+A351;ID # YI SYLLABLE ZHET
+A352;ID # YI SYLLABLE ZHEX
+A353;ID # YI SYLLABLE ZHE
+A354;ID # YI SYLLABLE ZHEP
+A355;ID # YI SYLLABLE ZHUT
+A356;ID # YI SYLLABLE ZHUX
+A357;ID # YI SYLLABLE ZHU
+A358;ID # YI SYLLABLE ZHUP
+A359;ID # YI SYLLABLE ZHURX
+A35A;ID # YI SYLLABLE ZHUR
+A35B;ID # YI SYLLABLE ZHYT
+A35C;ID # YI SYLLABLE ZHYX
+A35D;ID # YI SYLLABLE ZHY
+A35E;ID # YI SYLLABLE ZHYP
+A35F;ID # YI SYLLABLE ZHYRX
+A360;ID # YI SYLLABLE ZHYR
+A361;ID # YI SYLLABLE CHAT
+A362;ID # YI SYLLABLE CHAX
+A363;ID # YI SYLLABLE CHA
+A364;ID # YI SYLLABLE CHAP
+A365;ID # YI SYLLABLE CHUOT
+A366;ID # YI SYLLABLE CHUOX
+A367;ID # YI SYLLABLE CHUO
+A368;ID # YI SYLLABLE CHUOP
+A369;ID # YI SYLLABLE CHOT
+A36A;ID # YI SYLLABLE CHOX
+A36B;ID # YI SYLLABLE CHO
+A36C;ID # YI SYLLABLE CHOP
+A36D;ID # YI SYLLABLE CHET
+A36E;ID # YI SYLLABLE CHEX
+A36F;ID # YI SYLLABLE CHE
+A370;ID # YI SYLLABLE CHEP
+A371;ID # YI SYLLABLE CHUX
+A372;ID # YI SYLLABLE CHU
+A373;ID # YI SYLLABLE CHUP
+A374;ID # YI SYLLABLE CHURX
+A375;ID # YI SYLLABLE CHUR
+A376;ID # YI SYLLABLE CHYT
+A377;ID # YI SYLLABLE CHYX
+A378;ID # YI SYLLABLE CHY
+A379;ID # YI SYLLABLE CHYP
+A37A;ID # YI SYLLABLE CHYRX
+A37B;ID # YI SYLLABLE CHYR
+A37C;ID # YI SYLLABLE RRAX
+A37D;ID # YI SYLLABLE RRA
+A37E;ID # YI SYLLABLE RRUOX
+A37F;ID # YI SYLLABLE RRUO
+A380;ID # YI SYLLABLE RROT
+A381;ID # YI SYLLABLE RROX
+A382;ID # YI SYLLABLE RRO
+A383;ID # YI SYLLABLE RROP
+A384;ID # YI SYLLABLE RRET
+A385;ID # YI SYLLABLE RREX
+A386;ID # YI SYLLABLE RRE
+A387;ID # YI SYLLABLE RREP
+A388;ID # YI SYLLABLE RRUT
+A389;ID # YI SYLLABLE RRUX
+A38A;ID # YI SYLLABLE RRU
+A38B;ID # YI SYLLABLE RRUP
+A38C;ID # YI SYLLABLE RRURX
+A38D;ID # YI SYLLABLE RRUR
+A38E;ID # YI SYLLABLE RRYT
+A38F;ID # YI SYLLABLE RRYX
+A390;ID # YI SYLLABLE RRY
+A391;ID # YI SYLLABLE RRYP
+A392;ID # YI SYLLABLE RRYRX
+A393;ID # YI SYLLABLE RRYR
+A394;ID # YI SYLLABLE NRAT
+A395;ID # YI SYLLABLE NRAX
+A396;ID # YI SYLLABLE NRA
+A397;ID # YI SYLLABLE NRAP
+A398;ID # YI SYLLABLE NROX
+A399;ID # YI SYLLABLE NRO
+A39A;ID # YI SYLLABLE NROP
+A39B;ID # YI SYLLABLE NRET
+A39C;ID # YI SYLLABLE NREX
+A39D;ID # YI SYLLABLE NRE
+A39E;ID # YI SYLLABLE NREP
+A39F;ID # YI SYLLABLE NRUT
+A3A0;ID # YI SYLLABLE NRUX
+A3A1;ID # YI SYLLABLE NRU
+A3A2;ID # YI SYLLABLE NRUP
+A3A3;ID # YI SYLLABLE NRURX
+A3A4;ID # YI SYLLABLE NRUR
+A3A5;ID # YI SYLLABLE NRYT
+A3A6;ID # YI SYLLABLE NRYX
+A3A7;ID # YI SYLLABLE NRY
+A3A8;ID # YI SYLLABLE NRYP
+A3A9;ID # YI SYLLABLE NRYRX
+A3AA;ID # YI SYLLABLE NRYR
+A3AB;ID # YI SYLLABLE SHAT
+A3AC;ID # YI SYLLABLE SHAX
+A3AD;ID # YI SYLLABLE SHA
+A3AE;ID # YI SYLLABLE SHAP
+A3AF;ID # YI SYLLABLE SHUOX
+A3B0;ID # YI SYLLABLE SHUO
+A3B1;ID # YI SYLLABLE SHUOP
+A3B2;ID # YI SYLLABLE SHOT
+A3B3;ID # YI SYLLABLE SHOX
+A3B4;ID # YI SYLLABLE SHO
+A3B5;ID # YI SYLLABLE SHOP
+A3B6;ID # YI SYLLABLE SHET
+A3B7;ID # YI SYLLABLE SHEX
+A3B8;ID # YI SYLLABLE SHE
+A3B9;ID # YI SYLLABLE SHEP
+A3BA;ID # YI SYLLABLE SHUT
+A3BB;ID # YI SYLLABLE SHUX
+A3BC;ID # YI SYLLABLE SHU
+A3BD;ID # YI SYLLABLE SHUP
+A3BE;ID # YI SYLLABLE SHURX
+A3BF;ID # YI SYLLABLE SHUR
+A3C0;ID # YI SYLLABLE SHYT
+A3C1;ID # YI SYLLABLE SHYX
+A3C2;ID # YI SYLLABLE SHY
+A3C3;ID # YI SYLLABLE SHYP
+A3C4;ID # YI SYLLABLE SHYRX
+A3C5;ID # YI SYLLABLE SHYR
+A3C6;ID # YI SYLLABLE RAT
+A3C7;ID # YI SYLLABLE RAX
+A3C8;ID # YI SYLLABLE RA
+A3C9;ID # YI SYLLABLE RAP
+A3CA;ID # YI SYLLABLE RUOX
+A3CB;ID # YI SYLLABLE RUO
+A3CC;ID # YI SYLLABLE RUOP
+A3CD;ID # YI SYLLABLE ROT
+A3CE;ID # YI SYLLABLE ROX
+A3CF;ID # YI SYLLABLE RO
+A3D0;ID # YI SYLLABLE ROP
+A3D1;ID # YI SYLLABLE REX
+A3D2;ID # YI SYLLABLE RE
+A3D3;ID # YI SYLLABLE REP
+A3D4;ID # YI SYLLABLE RUT
+A3D5;ID # YI SYLLABLE RUX
+A3D6;ID # YI SYLLABLE RU
+A3D7;ID # YI SYLLABLE RUP
+A3D8;ID # YI SYLLABLE RURX
+A3D9;ID # YI SYLLABLE RUR
+A3DA;ID # YI SYLLABLE RYT
+A3DB;ID # YI SYLLABLE RYX
+A3DC;ID # YI SYLLABLE RY
+A3DD;ID # YI SYLLABLE RYP
+A3DE;ID # YI SYLLABLE RYRX
+A3DF;ID # YI SYLLABLE RYR
+A3E0;ID # YI SYLLABLE JIT
+A3E1;ID # YI SYLLABLE JIX
+A3E2;ID # YI SYLLABLE JI
+A3E3;ID # YI SYLLABLE JIP
+A3E4;ID # YI SYLLABLE JIET
+A3E5;ID # YI SYLLABLE JIEX
+A3E6;ID # YI SYLLABLE JIE
+A3E7;ID # YI SYLLABLE JIEP
+A3E8;ID # YI SYLLABLE JUOT
+A3E9;ID # YI SYLLABLE JUOX
+A3EA;ID # YI SYLLABLE JUO
+A3EB;ID # YI SYLLABLE JUOP
+A3EC;ID # YI SYLLABLE JOT
+A3ED;ID # YI SYLLABLE JOX
+A3EE;ID # YI SYLLABLE JO
+A3EF;ID # YI SYLLABLE JOP
+A3F0;ID # YI SYLLABLE JUT
+A3F1;ID # YI SYLLABLE JUX
+A3F2;ID # YI SYLLABLE JU
+A3F3;ID # YI SYLLABLE JUP
+A3F4;ID # YI SYLLABLE JURX
+A3F5;ID # YI SYLLABLE JUR
+A3F6;ID # YI SYLLABLE JYT
+A3F7;ID # YI SYLLABLE JYX
+A3F8;ID # YI SYLLABLE JY
+A3F9;ID # YI SYLLABLE JYP
+A3FA;ID # YI SYLLABLE JYRX
+A3FB;ID # YI SYLLABLE JYR
+A3FC;ID # YI SYLLABLE QIT
+A3FD;ID # YI SYLLABLE QIX
+A3FE;ID # YI SYLLABLE QI
+A3FF;ID # YI SYLLABLE QIP
+A400;ID # YI SYLLABLE QIET
+A401;ID # YI SYLLABLE QIEX
+A402;ID # YI SYLLABLE QIE
+A403;ID # YI SYLLABLE QIEP
+A404;ID # YI SYLLABLE QUOT
+A405;ID # YI SYLLABLE QUOX
+A406;ID # YI SYLLABLE QUO
+A407;ID # YI SYLLABLE QUOP
+A408;ID # YI SYLLABLE QOT
+A409;ID # YI SYLLABLE QOX
+A40A;ID # YI SYLLABLE QO
+A40B;ID # YI SYLLABLE QOP
+A40C;ID # YI SYLLABLE QUT
+A40D;ID # YI SYLLABLE QUX
+A40E;ID # YI SYLLABLE QU
+A40F;ID # YI SYLLABLE QUP
+A410;ID # YI SYLLABLE QURX
+A411;ID # YI SYLLABLE QUR
+A412;ID # YI SYLLABLE QYT
+A413;ID # YI SYLLABLE QYX
+A414;ID # YI SYLLABLE QY
+A415;ID # YI SYLLABLE QYP
+A416;ID # YI SYLLABLE QYRX
+A417;ID # YI SYLLABLE QYR
+A418;ID # YI SYLLABLE JJIT
+A419;ID # YI SYLLABLE JJIX
+A41A;ID # YI SYLLABLE JJI
+A41B;ID # YI SYLLABLE JJIP
+A41C;ID # YI SYLLABLE JJIET
+A41D;ID # YI SYLLABLE JJIEX
+A41E;ID # YI SYLLABLE JJIE
+A41F;ID # YI SYLLABLE JJIEP
+A420;ID # YI SYLLABLE JJUOX
+A421;ID # YI SYLLABLE JJUO
+A422;ID # YI SYLLABLE JJUOP
+A423;ID # YI SYLLABLE JJOT
+A424;ID # YI SYLLABLE JJOX
+A425;ID # YI SYLLABLE JJO
+A426;ID # YI SYLLABLE JJOP
+A427;ID # YI SYLLABLE JJUT
+A428;ID # YI SYLLABLE JJUX
+A429;ID # YI SYLLABLE JJU
+A42A;ID # YI SYLLABLE JJUP
+A42B;ID # YI SYLLABLE JJURX
+A42C;ID # YI SYLLABLE JJUR
+A42D;ID # YI SYLLABLE JJYT
+A42E;ID # YI SYLLABLE JJYX
+A42F;ID # YI SYLLABLE JJY
+A430;ID # YI SYLLABLE JJYP
+A431;ID # YI SYLLABLE NJIT
+A432;ID # YI SYLLABLE NJIX
+A433;ID # YI SYLLABLE NJI
+A434;ID # YI SYLLABLE NJIP
+A435;ID # YI SYLLABLE NJIET
+A436;ID # YI SYLLABLE NJIEX
+A437;ID # YI SYLLABLE NJIE
+A438;ID # YI SYLLABLE NJIEP
+A439;ID # YI SYLLABLE NJUOX
+A43A;ID # YI SYLLABLE NJUO
+A43B;ID # YI SYLLABLE NJOT
+A43C;ID # YI SYLLABLE NJOX
+A43D;ID # YI SYLLABLE NJO
+A43E;ID # YI SYLLABLE NJOP
+A43F;ID # YI SYLLABLE NJUX
+A440;ID # YI SYLLABLE NJU
+A441;ID # YI SYLLABLE NJUP
+A442;ID # YI SYLLABLE NJURX
+A443;ID # YI SYLLABLE NJUR
+A444;ID # YI SYLLABLE NJYT
+A445;ID # YI SYLLABLE NJYX
+A446;ID # YI SYLLABLE NJY
+A447;ID # YI SYLLABLE NJYP
+A448;ID # YI SYLLABLE NJYRX
+A449;ID # YI SYLLABLE NJYR
+A44A;ID # YI SYLLABLE NYIT
+A44B;ID # YI SYLLABLE NYIX
+A44C;ID # YI SYLLABLE NYI
+A44D;ID # YI SYLLABLE NYIP
+A44E;ID # YI SYLLABLE NYIET
+A44F;ID # YI SYLLABLE NYIEX
+A450;ID # YI SYLLABLE NYIE
+A451;ID # YI SYLLABLE NYIEP
+A452;ID # YI SYLLABLE NYUOX
+A453;ID # YI SYLLABLE NYUO
+A454;ID # YI SYLLABLE NYUOP
+A455;ID # YI SYLLABLE NYOT
+A456;ID # YI SYLLABLE NYOX
+A457;ID # YI SYLLABLE NYO
+A458;ID # YI SYLLABLE NYOP
+A459;ID # YI SYLLABLE NYUT
+A45A;ID # YI SYLLABLE NYUX
+A45B;ID # YI SYLLABLE NYU
+A45C;ID # YI SYLLABLE NYUP
+A45D;ID # YI SYLLABLE XIT
+A45E;ID # YI SYLLABLE XIX
+A45F;ID # YI SYLLABLE XI
+A460;ID # YI SYLLABLE XIP
+A461;ID # YI SYLLABLE XIET
+A462;ID # YI SYLLABLE XIEX
+A463;ID # YI SYLLABLE XIE
+A464;ID # YI SYLLABLE XIEP
+A465;ID # YI SYLLABLE XUOX
+A466;ID # YI SYLLABLE XUO
+A467;ID # YI SYLLABLE XOT
+A468;ID # YI SYLLABLE XOX
+A469;ID # YI SYLLABLE XO
+A46A;ID # YI SYLLABLE XOP
+A46B;ID # YI SYLLABLE XYT
+A46C;ID # YI SYLLABLE XYX
+A46D;ID # YI SYLLABLE XY
+A46E;ID # YI SYLLABLE XYP
+A46F;ID # YI SYLLABLE XYRX
+A470;ID # YI SYLLABLE XYR
+A471;ID # YI SYLLABLE YIT
+A472;ID # YI SYLLABLE YIX
+A473;ID # YI SYLLABLE YI
+A474;ID # YI SYLLABLE YIP
+A475;ID # YI SYLLABLE YIET
+A476;ID # YI SYLLABLE YIEX
+A477;ID # YI SYLLABLE YIE
+A478;ID # YI SYLLABLE YIEP
+A479;ID # YI SYLLABLE YUOT
+A47A;ID # YI SYLLABLE YUOX
+A47B;ID # YI SYLLABLE YUO
+A47C;ID # YI SYLLABLE YUOP
+A47D;ID # YI SYLLABLE YOT
+A47E;ID # YI SYLLABLE YOX
+A47F;ID # YI SYLLABLE YO
+A480;ID # YI SYLLABLE YOP
+A481;ID # YI SYLLABLE YUT
+A482;ID # YI SYLLABLE YUX
+A483;ID # YI SYLLABLE YU
+A484;ID # YI SYLLABLE YUP
+A485;ID # YI SYLLABLE YURX
+A486;ID # YI SYLLABLE YUR
+A487;ID # YI SYLLABLE YYT
+A488;ID # YI SYLLABLE YYX
+A489;ID # YI SYLLABLE YY
+A48A;ID # YI SYLLABLE YYP
+A48B;ID # YI SYLLABLE YYRX
+A48C;ID # YI SYLLABLE YYR
+A490;ID # YI RADICAL QOT
+A491;ID # YI RADICAL LI
+A492;ID # YI RADICAL KIT
+A493;ID # YI RADICAL NYIP
+A494;ID # YI RADICAL CYP
+A495;ID # YI RADICAL SSI
+A496;ID # YI RADICAL GGOP
+A497;ID # YI RADICAL GEP
+A498;ID # YI RADICAL MI
+A499;ID # YI RADICAL HXIT
+A49A;ID # YI RADICAL LYR
+A49B;ID # YI RADICAL BBUT
+A49C;ID # YI RADICAL MOP
+A49D;ID # YI RADICAL YO
+A49E;ID # YI RADICAL PUT
+A49F;ID # YI RADICAL HXUO
+A4A0;ID # YI RADICAL TAT
+A4A1;ID # YI RADICAL GA
+A4A2;ID # YI RADICAL ZUP
+A4A3;ID # YI RADICAL CYT
+A4A4;ID # YI RADICAL DDUR
+A4A5;ID # YI RADICAL BUR
+A4A6;ID # YI RADICAL GGUO
+A4A7;ID # YI RADICAL NYOP
+A4A8;ID # YI RADICAL TU
+A4A9;ID # YI RADICAL OP
+A4AA;ID # YI RADICAL JJUT
+A4AB;ID # YI RADICAL ZOT
+A4AC;ID # YI RADICAL PYT
+A4AD;ID # YI RADICAL HMO
+A4AE;ID # YI RADICAL YIT
+A4AF;ID # YI RADICAL VUR
+A4B0;ID # YI RADICAL SHY
+A4B1;ID # YI RADICAL VEP
+A4B2;ID # YI RADICAL ZA
+A4B3;ID # YI RADICAL JO
+A4B4;ID # YI RADICAL NZUP
+A4B5;ID # YI RADICAL JJY
+A4B6;ID # YI RADICAL GOT
+A4B7;ID # YI RADICAL JJIE
+A4B8;ID # YI RADICAL WO
+A4B9;ID # YI RADICAL DU
+A4BA;ID # YI RADICAL SHUR
+A4BB;ID # YI RADICAL LIE
+A4BC;ID # YI RADICAL CY
+A4BD;ID # YI RADICAL CUOP
+A4BE;ID # YI RADICAL CIP
+A4BF;ID # YI RADICAL HXOP
+A4C0;ID # YI RADICAL SHAT
+A4C1;ID # YI RADICAL ZUR
+A4C2;ID # YI RADICAL SHOP
+A4C3;ID # YI RADICAL CHE
+A4C4;ID # YI RADICAL ZZIET
+A4C5;ID # YI RADICAL NBIE
+A4C6;ID # YI RADICAL KE
+A700;AL # MODIFIER LETTER CHINESE TONE YIN PING
+A701;AL # MODIFIER LETTER CHINESE TONE YANG PING
+A702;AL # MODIFIER LETTER CHINESE TONE YIN SHANG
+A703;AL # MODIFIER LETTER CHINESE TONE YANG SHANG
+A704;AL # MODIFIER LETTER CHINESE TONE YIN QU
+A705;AL # MODIFIER LETTER CHINESE TONE YANG QU
+A706;AL # MODIFIER LETTER CHINESE TONE YIN RU
+A707;AL # MODIFIER LETTER CHINESE TONE YANG RU
+A708;AL # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709;AL # MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A;AL # MODIFIER LETTER MID DOTTED TONE BAR
+A70B;AL # MODIFIER LETTER LOW DOTTED TONE BAR
+A70C;AL # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D;AL # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E;AL # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F;AL # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710;AL # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711;AL # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+A712;AL # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713;AL # MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714;AL # MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715;AL # MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716;AL # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A800;AL # SYLOTI NAGRI LETTER A
+A801;AL # SYLOTI NAGRI LETTER I
+A802;CM # SYLOTI NAGRI SIGN DVISVARA
+A803;AL # SYLOTI NAGRI LETTER U
+A804;AL # SYLOTI NAGRI LETTER E
+A805;AL # SYLOTI NAGRI LETTER O
+A806;CM # SYLOTI NAGRI SIGN HASANTA
+A807;AL # SYLOTI NAGRI LETTER KO
+A808;AL # SYLOTI NAGRI LETTER KHO
+A809;AL # SYLOTI NAGRI LETTER GO
+A80A;AL # SYLOTI NAGRI LETTER GHO
+A80B;CM # SYLOTI NAGRI SIGN ANUSVARA
+A80C;AL # SYLOTI NAGRI LETTER CO
+A80D;AL # SYLOTI NAGRI LETTER CHO
+A80E;AL # SYLOTI NAGRI LETTER JO
+A80F;AL # SYLOTI NAGRI LETTER JHO
+A810;AL # SYLOTI NAGRI LETTER TTO
+A811;AL # SYLOTI NAGRI LETTER TTHO
+A812;AL # SYLOTI NAGRI LETTER DDO
+A813;AL # SYLOTI NAGRI LETTER DDHO
+A814;AL # SYLOTI NAGRI LETTER TO
+A815;AL # SYLOTI NAGRI LETTER THO
+A816;AL # SYLOTI NAGRI LETTER DO
+A817;AL # SYLOTI NAGRI LETTER DHO
+A818;AL # SYLOTI NAGRI LETTER NO
+A819;AL # SYLOTI NAGRI LETTER PO
+A81A;AL # SYLOTI NAGRI LETTER PHO
+A81B;AL # SYLOTI NAGRI LETTER BO
+A81C;AL # SYLOTI NAGRI LETTER BHO
+A81D;AL # SYLOTI NAGRI LETTER MO
+A81E;AL # SYLOTI NAGRI LETTER RO
+A81F;AL # SYLOTI NAGRI LETTER LO
+A820;AL # SYLOTI NAGRI LETTER RRO
+A821;AL # SYLOTI NAGRI LETTER SO
+A822;AL # SYLOTI NAGRI LETTER HO
+A823;CM # SYLOTI NAGRI VOWEL SIGN A
+A824;CM # SYLOTI NAGRI VOWEL SIGN I
+A825;CM # SYLOTI NAGRI VOWEL SIGN U
+A826;CM # SYLOTI NAGRI VOWEL SIGN E
+A827;CM # SYLOTI NAGRI VOWEL SIGN OO
+A828;AL # SYLOTI NAGRI POETRY MARK-1
+A829;AL # SYLOTI NAGRI POETRY MARK-2
+A82A;AL # SYLOTI NAGRI POETRY MARK-3
+A82B;AL # SYLOTI NAGRI POETRY MARK-4
+AC00;H2 # HANGUL SYLLABLE GA
+AC01..AC1B;H3 # HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH
+AC1C;H2 # HANGUL SYLLABLE GAE
+AC1D..AC37;H3 # HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH
+AC38;H2 # HANGUL SYLLABLE GYA
+AC39..AC53;H3 # HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH
+AC54;H2 # HANGUL SYLLABLE GYAE
+AC55..AC6F;H3 # HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH
+AC70;H2 # HANGUL SYLLABLE GEO
+AC71..AC8B;H3 # HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH
+AC8C;H2 # HANGUL SYLLABLE GE
+AC8D..ACA7;H3 # HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH
+ACA8;H2 # HANGUL SYLLABLE GYEO
+ACA9..ACC3;H3 # HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH
+ACC4;H2 # HANGUL SYLLABLE GYE
+ACC5..ACDF;H3 # HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH
+ACE0;H2 # HANGUL SYLLABLE GO
+ACE1..ACFB;H3 # HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH
+ACFC;H2 # HANGUL SYLLABLE GWA
+ACFD..AD17;H3 # HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH
+AD18;H2 # HANGUL SYLLABLE GWAE
+AD19..AD33;H3 # HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH
+AD34;H2 # HANGUL SYLLABLE GOE
+AD35..AD4F;H3 # HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH
+AD50;H2 # HANGUL SYLLABLE GYO
+AD51..AD6B;H3 # HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH
+AD6C;H2 # HANGUL SYLLABLE GU
+AD6D..AD87;H3 # HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH
+AD88;H2 # HANGUL SYLLABLE GWEO
+AD89..ADA3;H3 # HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH
+ADA4;H2 # HANGUL SYLLABLE GWE
+ADA5..ADBF;H3 # HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH
+ADC0;H2 # HANGUL SYLLABLE GWI
+ADC1..ADDB;H3 # HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH
+ADDC;H2 # HANGUL SYLLABLE GYU
+ADDD..ADF7;H3 # HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH
+ADF8;H2 # HANGUL SYLLABLE GEU
+ADF9..AE13;H3 # HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH
+AE14;H2 # HANGUL SYLLABLE GYI
+AE15..AE2F;H3 # HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH
+AE30;H2 # HANGUL SYLLABLE GI
+AE31..AE4B;H3 # HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH
+AE4C;H2 # HANGUL SYLLABLE GGA
+AE4D..AE67;H3 # HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH
+AE68;H2 # HANGUL SYLLABLE GGAE
+AE69..AE83;H3 # HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH
+AE84;H2 # HANGUL SYLLABLE GGYA
+AE85..AE9F;H3 # HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH
+AEA0;H2 # HANGUL SYLLABLE GGYAE
+AEA1..AEBB;H3 # HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH
+AEBC;H2 # HANGUL SYLLABLE GGEO
+AEBD..AED7;H3 # HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH
+AED8;H2 # HANGUL SYLLABLE GGE
+AED9..AEF3;H3 # HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH
+AEF4;H2 # HANGUL SYLLABLE GGYEO
+AEF5..AF0F;H3 # HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH
+AF10;H2 # HANGUL SYLLABLE GGYE
+AF11..AF2B;H3 # HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH
+AF2C;H2 # HANGUL SYLLABLE GGO
+AF2D..AF47;H3 # HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH
+AF48;H2 # HANGUL SYLLABLE GGWA
+AF49..AF63;H3 # HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH
+AF64;H2 # HANGUL SYLLABLE GGWAE
+AF65..AF7F;H3 # HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH
+AF80;H2 # HANGUL SYLLABLE GGOE
+AF81..AF9B;H3 # HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH
+AF9C;H2 # HANGUL SYLLABLE GGYO
+AF9D..AFB7;H3 # HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH
+AFB8;H2 # HANGUL SYLLABLE GGU
+AFB9..AFD3;H3 # HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH
+AFD4;H2 # HANGUL SYLLABLE GGWEO
+AFD5..AFEF;H3 # HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH
+AFF0;H2 # HANGUL SYLLABLE GGWE
+AFF1..B00B;H3 # HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH
+B00C;H2 # HANGUL SYLLABLE GGWI
+B00D..B027;H3 # HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH
+B028;H2 # HANGUL SYLLABLE GGYU
+B029..B043;H3 # HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH
+B044;H2 # HANGUL SYLLABLE GGEU
+B045..B05F;H3 # HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH
+B060;H2 # HANGUL SYLLABLE GGYI
+B061..B07B;H3 # HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH
+B07C;H2 # HANGUL SYLLABLE GGI
+B07D..B097;H3 # HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH
+B098;H2 # HANGUL SYLLABLE NA
+B099..B0B3;H3 # HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH
+B0B4;H2 # HANGUL SYLLABLE NAE
+B0B5..B0CF;H3 # HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH
+B0D0;H2 # HANGUL SYLLABLE NYA
+B0D1..B0EB;H3 # HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH
+B0EC;H2 # HANGUL SYLLABLE NYAE
+B0ED..B107;H3 # HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH
+B108;H2 # HANGUL SYLLABLE NEO
+B109..B123;H3 # HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH
+B124;H2 # HANGUL SYLLABLE NE
+B125..B13F;H3 # HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH
+B140;H2 # HANGUL SYLLABLE NYEO
+B141..B15B;H3 # HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH
+B15C;H2 # HANGUL SYLLABLE NYE
+B15D..B177;H3 # HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH
+B178;H2 # HANGUL SYLLABLE NO
+B179..B193;H3 # HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH
+B194;H2 # HANGUL SYLLABLE NWA
+B195..B1AF;H3 # HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH
+B1B0;H2 # HANGUL SYLLABLE NWAE
+B1B1..B1CB;H3 # HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH
+B1CC;H2 # HANGUL SYLLABLE NOE
+B1CD..B1E7;H3 # HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH
+B1E8;H2 # HANGUL SYLLABLE NYO
+B1E9..B203;H3 # HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH
+B204;H2 # HANGUL SYLLABLE NU
+B205..B21F;H3 # HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH
+B220;H2 # HANGUL SYLLABLE NWEO
+B221..B23B;H3 # HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH
+B23C;H2 # HANGUL SYLLABLE NWE
+B23D..B257;H3 # HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH
+B258;H2 # HANGUL SYLLABLE NWI
+B259..B273;H3 # HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH
+B274;H2 # HANGUL SYLLABLE NYU
+B275..B28F;H3 # HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH
+B290;H2 # HANGUL SYLLABLE NEU
+B291..B2AB;H3 # HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH
+B2AC;H2 # HANGUL SYLLABLE NYI
+B2AD..B2C7;H3 # HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH
+B2C8;H2 # HANGUL SYLLABLE NI
+B2C9..B2E3;H3 # HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH
+B2E4;H2 # HANGUL SYLLABLE DA
+B2E5..B2FF;H3 # HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH
+B300;H2 # HANGUL SYLLABLE DAE
+B301..B31B;H3 # HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH
+B31C;H2 # HANGUL SYLLABLE DYA
+B31D..B337;H3 # HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH
+B338;H2 # HANGUL SYLLABLE DYAE
+B339..B353;H3 # HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH
+B354;H2 # HANGUL SYLLABLE DEO
+B355..B36F;H3 # HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH
+B370;H2 # HANGUL SYLLABLE DE
+B371..B38B;H3 # HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH
+B38C;H2 # HANGUL SYLLABLE DYEO
+B38D..B3A7;H3 # HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH
+B3A8;H2 # HANGUL SYLLABLE DYE
+B3A9..B3C3;H3 # HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH
+B3C4;H2 # HANGUL SYLLABLE DO
+B3C5..B3DF;H3 # HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH
+B3E0;H2 # HANGUL SYLLABLE DWA
+B3E1..B3FB;H3 # HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH
+B3FC;H2 # HANGUL SYLLABLE DWAE
+B3FD..B417;H3 # HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH
+B418;H2 # HANGUL SYLLABLE DOE
+B419..B433;H3 # HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH
+B434;H2 # HANGUL SYLLABLE DYO
+B435..B44F;H3 # HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH
+B450;H2 # HANGUL SYLLABLE DU
+B451..B46B;H3 # HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH
+B46C;H2 # HANGUL SYLLABLE DWEO
+B46D..B487;H3 # HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH
+B488;H2 # HANGUL SYLLABLE DWE
+B489..B4A3;H3 # HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH
+B4A4;H2 # HANGUL SYLLABLE DWI
+B4A5..B4BF;H3 # HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH
+B4C0;H2 # HANGUL SYLLABLE DYU
+B4C1..B4DB;H3 # HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH
+B4DC;H2 # HANGUL SYLLABLE DEU
+B4DD..B4F7;H3 # HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH
+B4F8;H2 # HANGUL SYLLABLE DYI
+B4F9..B513;H3 # HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH
+B514;H2 # HANGUL SYLLABLE DI
+B515..B52F;H3 # HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH
+B530;H2 # HANGUL SYLLABLE DDA
+B531..B54B;H3 # HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH
+B54C;H2 # HANGUL SYLLABLE DDAE
+B54D..B567;H3 # HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH
+B568;H2 # HANGUL SYLLABLE DDYA
+B569..B583;H3 # HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH
+B584;H2 # HANGUL SYLLABLE DDYAE
+B585..B59F;H3 # HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH
+B5A0;H2 # HANGUL SYLLABLE DDEO
+B5A1..B5BB;H3 # HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH
+B5BC;H2 # HANGUL SYLLABLE DDE
+B5BD..B5D7;H3 # HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH
+B5D8;H2 # HANGUL SYLLABLE DDYEO
+B5D9..B5F3;H3 # HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH
+B5F4;H2 # HANGUL SYLLABLE DDYE
+B5F5..B60F;H3 # HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH
+B610;H2 # HANGUL SYLLABLE DDO
+B611..B62B;H3 # HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH
+B62C;H2 # HANGUL SYLLABLE DDWA
+B62D..B647;H3 # HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH
+B648;H2 # HANGUL SYLLABLE DDWAE
+B649..B663;H3 # HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH
+B664;H2 # HANGUL SYLLABLE DDOE
+B665..B67F;H3 # HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH
+B680;H2 # HANGUL SYLLABLE DDYO
+B681..B69B;H3 # HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH
+B69C;H2 # HANGUL SYLLABLE DDU
+B69D..B6B7;H3 # HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH
+B6B8;H2 # HANGUL SYLLABLE DDWEO
+B6B9..B6D3;H3 # HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH
+B6D4;H2 # HANGUL SYLLABLE DDWE
+B6D5..B6EF;H3 # HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH
+B6F0;H2 # HANGUL SYLLABLE DDWI
+B6F1..B70B;H3 # HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH
+B70C;H2 # HANGUL SYLLABLE DDYU
+B70D..B727;H3 # HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH
+B728;H2 # HANGUL SYLLABLE DDEU
+B729..B743;H3 # HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH
+B744;H2 # HANGUL SYLLABLE DDYI
+B745..B75F;H3 # HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH
+B760;H2 # HANGUL SYLLABLE DDI
+B761..B77B;H3 # HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH
+B77C;H2 # HANGUL SYLLABLE RA
+B77D..B797;H3 # HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH
+B798;H2 # HANGUL SYLLABLE RAE
+B799..B7B3;H3 # HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH
+B7B4;H2 # HANGUL SYLLABLE RYA
+B7B5..B7CF;H3 # HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH
+B7D0;H2 # HANGUL SYLLABLE RYAE
+B7D1..B7EB;H3 # HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH
+B7EC;H2 # HANGUL SYLLABLE REO
+B7ED..B807;H3 # HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH
+B808;H2 # HANGUL SYLLABLE RE
+B809..B823;H3 # HANGUL SYLLABLE REG..HANGUL SYLLABLE REH
+B824;H2 # HANGUL SYLLABLE RYEO
+B825..B83F;H3 # HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH
+B840;H2 # HANGUL SYLLABLE RYE
+B841..B85B;H3 # HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH
+B85C;H2 # HANGUL SYLLABLE RO
+B85D..B877;H3 # HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH
+B878;H2 # HANGUL SYLLABLE RWA
+B879..B893;H3 # HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH
+B894;H2 # HANGUL SYLLABLE RWAE
+B895..B8AF;H3 # HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH
+B8B0;H2 # HANGUL SYLLABLE ROE
+B8B1..B8CB;H3 # HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH
+B8CC;H2 # HANGUL SYLLABLE RYO
+B8CD..B8E7;H3 # HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH
+B8E8;H2 # HANGUL SYLLABLE RU
+B8E9..B903;H3 # HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH
+B904;H2 # HANGUL SYLLABLE RWEO
+B905..B91F;H3 # HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH
+B920;H2 # HANGUL SYLLABLE RWE
+B921..B93B;H3 # HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH
+B93C;H2 # HANGUL SYLLABLE RWI
+B93D..B957;H3 # HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH
+B958;H2 # HANGUL SYLLABLE RYU
+B959..B973;H3 # HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH
+B974;H2 # HANGUL SYLLABLE REU
+B975..B98F;H3 # HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH
+B990;H2 # HANGUL SYLLABLE RYI
+B991..B9AB;H3 # HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH
+B9AC;H2 # HANGUL SYLLABLE RI
+B9AD..B9C7;H3 # HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH
+B9C8;H2 # HANGUL SYLLABLE MA
+B9C9..B9E3;H3 # HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH
+B9E4;H2 # HANGUL SYLLABLE MAE
+B9E5..B9FF;H3 # HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH
+BA00;H2 # HANGUL SYLLABLE MYA
+BA01..BA1B;H3 # HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH
+BA1C;H2 # HANGUL SYLLABLE MYAE
+BA1D..BA37;H3 # HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH
+BA38;H2 # HANGUL SYLLABLE MEO
+BA39..BA53;H3 # HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH
+BA54;H2 # HANGUL SYLLABLE ME
+BA55..BA6F;H3 # HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH
+BA70;H2 # HANGUL SYLLABLE MYEO
+BA71..BA8B;H3 # HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH
+BA8C;H2 # HANGUL SYLLABLE MYE
+BA8D..BAA7;H3 # HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH
+BAA8;H2 # HANGUL SYLLABLE MO
+BAA9..BAC3;H3 # HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH
+BAC4;H2 # HANGUL SYLLABLE MWA
+BAC5..BADF;H3 # HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH
+BAE0;H2 # HANGUL SYLLABLE MWAE
+BAE1..BAFB;H3 # HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH
+BAFC;H2 # HANGUL SYLLABLE MOE
+BAFD..BB17;H3 # HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH
+BB18;H2 # HANGUL SYLLABLE MYO
+BB19..BB33;H3 # HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH
+BB34;H2 # HANGUL SYLLABLE MU
+BB35..BB4F;H3 # HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH
+BB50;H2 # HANGUL SYLLABLE MWEO
+BB51..BB6B;H3 # HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH
+BB6C;H2 # HANGUL SYLLABLE MWE
+BB6D..BB87;H3 # HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH
+BB88;H2 # HANGUL SYLLABLE MWI
+BB89..BBA3;H3 # HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH
+BBA4;H2 # HANGUL SYLLABLE MYU
+BBA5..BBBF;H3 # HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH
+BBC0;H2 # HANGUL SYLLABLE MEU
+BBC1..BBDB;H3 # HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH
+BBDC;H2 # HANGUL SYLLABLE MYI
+BBDD..BBF7;H3 # HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH
+BBF8;H2 # HANGUL SYLLABLE MI
+BBF9..BC13;H3 # HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH
+BC14;H2 # HANGUL SYLLABLE BA
+BC15..BC2F;H3 # HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH
+BC30;H2 # HANGUL SYLLABLE BAE
+BC31..BC4B;H3 # HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH
+BC4C;H2 # HANGUL SYLLABLE BYA
+BC4D..BC67;H3 # HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH
+BC68;H2 # HANGUL SYLLABLE BYAE
+BC69..BC83;H3 # HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH
+BC84;H2 # HANGUL SYLLABLE BEO
+BC85..BC9F;H3 # HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH
+BCA0;H2 # HANGUL SYLLABLE BE
+BCA1..BCBB;H3 # HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH
+BCBC;H2 # HANGUL SYLLABLE BYEO
+BCBD..BCD7;H3 # HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH
+BCD8;H2 # HANGUL SYLLABLE BYE
+BCD9..BCF3;H3 # HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH
+BCF4;H2 # HANGUL SYLLABLE BO
+BCF5..BD0F;H3 # HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH
+BD10;H2 # HANGUL SYLLABLE BWA
+BD11..BD2B;H3 # HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH
+BD2C;H2 # HANGUL SYLLABLE BWAE
+BD2D..BD47;H3 # HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH
+BD48;H2 # HANGUL SYLLABLE BOE
+BD49..BD63;H3 # HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH
+BD64;H2 # HANGUL SYLLABLE BYO
+BD65..BD7F;H3 # HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH
+BD80;H2 # HANGUL SYLLABLE BU
+BD81..BD9B;H3 # HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH
+BD9C;H2 # HANGUL SYLLABLE BWEO
+BD9D..BDB7;H3 # HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH
+BDB8;H2 # HANGUL SYLLABLE BWE
+BDB9..BDD3;H3 # HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH
+BDD4;H2 # HANGUL SYLLABLE BWI
+BDD5..BDEF;H3 # HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH
+BDF0;H2 # HANGUL SYLLABLE BYU
+BDF1..BE0B;H3 # HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH
+BE0C;H2 # HANGUL SYLLABLE BEU
+BE0D..BE27;H3 # HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH
+BE28;H2 # HANGUL SYLLABLE BYI
+BE29..BE43;H3 # HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH
+BE44;H2 # HANGUL SYLLABLE BI
+BE45..BE5F;H3 # HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH
+BE60;H2 # HANGUL SYLLABLE BBA
+BE61..BE7B;H3 # HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH
+BE7C;H2 # HANGUL SYLLABLE BBAE
+BE7D..BE97;H3 # HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH
+BE98;H2 # HANGUL SYLLABLE BBYA
+BE99..BEB3;H3 # HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH
+BEB4;H2 # HANGUL SYLLABLE BBYAE
+BEB5..BECF;H3 # HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH
+BED0;H2 # HANGUL SYLLABLE BBEO
+BED1..BEEB;H3 # HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH
+BEEC;H2 # HANGUL SYLLABLE BBE
+BEED..BF07;H3 # HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH
+BF08;H2 # HANGUL SYLLABLE BBYEO
+BF09..BF23;H3 # HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH
+BF24;H2 # HANGUL SYLLABLE BBYE
+BF25..BF3F;H3 # HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH
+BF40;H2 # HANGUL SYLLABLE BBO
+BF41..BF5B;H3 # HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH
+BF5C;H2 # HANGUL SYLLABLE BBWA
+BF5D..BF77;H3 # HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH
+BF78;H2 # HANGUL SYLLABLE BBWAE
+BF79..BF93;H3 # HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH
+BF94;H2 # HANGUL SYLLABLE BBOE
+BF95..BFAF;H3 # HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH
+BFB0;H2 # HANGUL SYLLABLE BBYO
+BFB1..BFCB;H3 # HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH
+BFCC;H2 # HANGUL SYLLABLE BBU
+BFCD..BFE7;H3 # HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH
+BFE8;H2 # HANGUL SYLLABLE BBWEO
+BFE9..C003;H3 # HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH
+C004;H2 # HANGUL SYLLABLE BBWE
+C005..C01F;H3 # HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH
+C020;H2 # HANGUL SYLLABLE BBWI
+C021..C03B;H3 # HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH
+C03C;H2 # HANGUL SYLLABLE BBYU
+C03D..C057;H3 # HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH
+C058;H2 # HANGUL SYLLABLE BBEU
+C059..C073;H3 # HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH
+C074;H2 # HANGUL SYLLABLE BBYI
+C075..C08F;H3 # HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH
+C090;H2 # HANGUL SYLLABLE BBI
+C091..C0AB;H3 # HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH
+C0AC;H2 # HANGUL SYLLABLE SA
+C0AD..C0C7;H3 # HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH
+C0C8;H2 # HANGUL SYLLABLE SAE
+C0C9..C0E3;H3 # HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH
+C0E4;H2 # HANGUL SYLLABLE SYA
+C0E5..C0FF;H3 # HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH
+C100;H2 # HANGUL SYLLABLE SYAE
+C101..C11B;H3 # HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH
+C11C;H2 # HANGUL SYLLABLE SEO
+C11D..C137;H3 # HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH
+C138;H2 # HANGUL SYLLABLE SE
+C139..C153;H3 # HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH
+C154;H2 # HANGUL SYLLABLE SYEO
+C155..C16F;H3 # HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH
+C170;H2 # HANGUL SYLLABLE SYE
+C171..C18B;H3 # HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH
+C18C;H2 # HANGUL SYLLABLE SO
+C18D..C1A7;H3 # HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH
+C1A8;H2 # HANGUL SYLLABLE SWA
+C1A9..C1C3;H3 # HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH
+C1C4;H2 # HANGUL SYLLABLE SWAE
+C1C5..C1DF;H3 # HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH
+C1E0;H2 # HANGUL SYLLABLE SOE
+C1E1..C1FB;H3 # HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH
+C1FC;H2 # HANGUL SYLLABLE SYO
+C1FD..C217;H3 # HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH
+C218;H2 # HANGUL SYLLABLE SU
+C219..C233;H3 # HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH
+C234;H2 # HANGUL SYLLABLE SWEO
+C235..C24F;H3 # HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH
+C250;H2 # HANGUL SYLLABLE SWE
+C251..C26B;H3 # HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH
+C26C;H2 # HANGUL SYLLABLE SWI
+C26D..C287;H3 # HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH
+C288;H2 # HANGUL SYLLABLE SYU
+C289..C2A3;H3 # HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH
+C2A4;H2 # HANGUL SYLLABLE SEU
+C2A5..C2BF;H3 # HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH
+C2C0;H2 # HANGUL SYLLABLE SYI
+C2C1..C2DB;H3 # HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH
+C2DC;H2 # HANGUL SYLLABLE SI
+C2DD..C2F7;H3 # HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH
+C2F8;H2 # HANGUL SYLLABLE SSA
+C2F9..C313;H3 # HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH
+C314;H2 # HANGUL SYLLABLE SSAE
+C315..C32F;H3 # HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH
+C330;H2 # HANGUL SYLLABLE SSYA
+C331..C34B;H3 # HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH
+C34C;H2 # HANGUL SYLLABLE SSYAE
+C34D..C367;H3 # HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH
+C368;H2 # HANGUL SYLLABLE SSEO
+C369..C383;H3 # HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH
+C384;H2 # HANGUL SYLLABLE SSE
+C385..C39F;H3 # HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH
+C3A0;H2 # HANGUL SYLLABLE SSYEO
+C3A1..C3BB;H3 # HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH
+C3BC;H2 # HANGUL SYLLABLE SSYE
+C3BD..C3D7;H3 # HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH
+C3D8;H2 # HANGUL SYLLABLE SSO
+C3D9..C3F3;H3 # HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH
+C3F4;H2 # HANGUL SYLLABLE SSWA
+C3F5..C40F;H3 # HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH
+C410;H2 # HANGUL SYLLABLE SSWAE
+C411..C42B;H3 # HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH
+C42C;H2 # HANGUL SYLLABLE SSOE
+C42D..C447;H3 # HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH
+C448;H2 # HANGUL SYLLABLE SSYO
+C449..C463;H3 # HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH
+C464;H2 # HANGUL SYLLABLE SSU
+C465..C47F;H3 # HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH
+C480;H2 # HANGUL SYLLABLE SSWEO
+C481..C49B;H3 # HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH
+C49C;H2 # HANGUL SYLLABLE SSWE
+C49D..C4B7;H3 # HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH
+C4B8;H2 # HANGUL SYLLABLE SSWI
+C4B9..C4D3;H3 # HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH
+C4D4;H2 # HANGUL SYLLABLE SSYU
+C4D5..C4EF;H3 # HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH
+C4F0;H2 # HANGUL SYLLABLE SSEU
+C4F1..C50B;H3 # HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH
+C50C;H2 # HANGUL SYLLABLE SSYI
+C50D..C527;H3 # HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH
+C528;H2 # HANGUL SYLLABLE SSI
+C529..C543;H3 # HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH
+C544;H2 # HANGUL SYLLABLE A
+C545..C55F;H3 # HANGUL SYLLABLE AG..HANGUL SYLLABLE AH
+C560;H2 # HANGUL SYLLABLE AE
+C561..C57B;H3 # HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH
+C57C;H2 # HANGUL SYLLABLE YA
+C57D..C597;H3 # HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH
+C598;H2 # HANGUL SYLLABLE YAE
+C599..C5B3;H3 # HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH
+C5B4;H2 # HANGUL SYLLABLE EO
+C5B5..C5CF;H3 # HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH
+C5D0;H2 # HANGUL SYLLABLE E
+C5D1..C5EB;H3 # HANGUL SYLLABLE EG..HANGUL SYLLABLE EH
+C5EC;H2 # HANGUL SYLLABLE YEO
+C5ED..C607;H3 # HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH
+C608;H2 # HANGUL SYLLABLE YE
+C609..C623;H3 # HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH
+C624;H2 # HANGUL SYLLABLE O
+C625..C63F;H3 # HANGUL SYLLABLE OG..HANGUL SYLLABLE OH
+C640;H2 # HANGUL SYLLABLE WA
+C641..C65B;H3 # HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH
+C65C;H2 # HANGUL SYLLABLE WAE
+C65D..C677;H3 # HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH
+C678;H2 # HANGUL SYLLABLE OE
+C679..C693;H3 # HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH
+C694;H2 # HANGUL SYLLABLE YO
+C695..C6AF;H3 # HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH
+C6B0;H2 # HANGUL SYLLABLE U
+C6B1..C6CB;H3 # HANGUL SYLLABLE UG..HANGUL SYLLABLE UH
+C6CC;H2 # HANGUL SYLLABLE WEO
+C6CD..C6E7;H3 # HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH
+C6E8;H2 # HANGUL SYLLABLE WE
+C6E9..C703;H3 # HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH
+C704;H2 # HANGUL SYLLABLE WI
+C705..C71F;H3 # HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH
+C720;H2 # HANGUL SYLLABLE YU
+C721..C73B;H3 # HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH
+C73C;H2 # HANGUL SYLLABLE EU
+C73D..C757;H3 # HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH
+C758;H2 # HANGUL SYLLABLE YI
+C759..C773;H3 # HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH
+C774;H2 # HANGUL SYLLABLE I
+C775..C78F;H3 # HANGUL SYLLABLE IG..HANGUL SYLLABLE IH
+C790;H2 # HANGUL SYLLABLE JA
+C791..C7AB;H3 # HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH
+C7AC;H2 # HANGUL SYLLABLE JAE
+C7AD..C7C7;H3 # HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH
+C7C8;H2 # HANGUL SYLLABLE JYA
+C7C9..C7E3;H3 # HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH
+C7E4;H2 # HANGUL SYLLABLE JYAE
+C7E5..C7FF;H3 # HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH
+C800;H2 # HANGUL SYLLABLE JEO
+C801..C81B;H3 # HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH
+C81C;H2 # HANGUL SYLLABLE JE
+C81D..C837;H3 # HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH
+C838;H2 # HANGUL SYLLABLE JYEO
+C839..C853;H3 # HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH
+C854;H2 # HANGUL SYLLABLE JYE
+C855..C86F;H3 # HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH
+C870;H2 # HANGUL SYLLABLE JO
+C871..C88B;H3 # HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH
+C88C;H2 # HANGUL SYLLABLE JWA
+C88D..C8A7;H3 # HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH
+C8A8;H2 # HANGUL SYLLABLE JWAE
+C8A9..C8C3;H3 # HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH
+C8C4;H2 # HANGUL SYLLABLE JOE
+C8C5..C8DF;H3 # HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH
+C8E0;H2 # HANGUL SYLLABLE JYO
+C8E1..C8FB;H3 # HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH
+C8FC;H2 # HANGUL SYLLABLE JU
+C8FD..C917;H3 # HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH
+C918;H2 # HANGUL SYLLABLE JWEO
+C919..C933;H3 # HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH
+C934;H2 # HANGUL SYLLABLE JWE
+C935..C94F;H3 # HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH
+C950;H2 # HANGUL SYLLABLE JWI
+C951..C96B;H3 # HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH
+C96C;H2 # HANGUL SYLLABLE JYU
+C96D..C987;H3 # HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH
+C988;H2 # HANGUL SYLLABLE JEU
+C989..C9A3;H3 # HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH
+C9A4;H2 # HANGUL SYLLABLE JYI
+C9A5..C9BF;H3 # HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH
+C9C0;H2 # HANGUL SYLLABLE JI
+C9C1..C9DB;H3 # HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH
+C9DC;H2 # HANGUL SYLLABLE JJA
+C9DD..C9F7;H3 # HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH
+C9F8;H2 # HANGUL SYLLABLE JJAE
+C9F9..CA13;H3 # HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH
+CA14;H2 # HANGUL SYLLABLE JJYA
+CA15..CA2F;H3 # HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH
+CA30;H2 # HANGUL SYLLABLE JJYAE
+CA31..CA4B;H3 # HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH
+CA4C;H2 # HANGUL SYLLABLE JJEO
+CA4D..CA67;H3 # HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH
+CA68;H2 # HANGUL SYLLABLE JJE
+CA69..CA83;H3 # HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH
+CA84;H2 # HANGUL SYLLABLE JJYEO
+CA85..CA9F;H3 # HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH
+CAA0;H2 # HANGUL SYLLABLE JJYE
+CAA1..CABB;H3 # HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH
+CABC;H2 # HANGUL SYLLABLE JJO
+CABD..CAD7;H3 # HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH
+CAD8;H2 # HANGUL SYLLABLE JJWA
+CAD9..CAF3;H3 # HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH
+CAF4;H2 # HANGUL SYLLABLE JJWAE
+CAF5..CB0F;H3 # HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH
+CB10;H2 # HANGUL SYLLABLE JJOE
+CB11..CB2B;H3 # HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH
+CB2C;H2 # HANGUL SYLLABLE JJYO
+CB2D..CB47;H3 # HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH
+CB48;H2 # HANGUL SYLLABLE JJU
+CB49..CB63;H3 # HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH
+CB64;H2 # HANGUL SYLLABLE JJWEO
+CB65..CB7F;H3 # HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH
+CB80;H2 # HANGUL SYLLABLE JJWE
+CB81..CB9B;H3 # HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH
+CB9C;H2 # HANGUL SYLLABLE JJWI
+CB9D..CBB7;H3 # HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH
+CBB8;H2 # HANGUL SYLLABLE JJYU
+CBB9..CBD3;H3 # HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH
+CBD4;H2 # HANGUL SYLLABLE JJEU
+CBD5..CBEF;H3 # HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH
+CBF0;H2 # HANGUL SYLLABLE JJYI
+CBF1..CC0B;H3 # HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH
+CC0C;H2 # HANGUL SYLLABLE JJI
+CC0D..CC27;H3 # HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH
+CC28;H2 # HANGUL SYLLABLE CA
+CC29..CC43;H3 # HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH
+CC44;H2 # HANGUL SYLLABLE CAE
+CC45..CC5F;H3 # HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH
+CC60;H2 # HANGUL SYLLABLE CYA
+CC61..CC7B;H3 # HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH
+CC7C;H2 # HANGUL SYLLABLE CYAE
+CC7D..CC97;H3 # HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH
+CC98;H2 # HANGUL SYLLABLE CEO
+CC99..CCB3;H3 # HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH
+CCB4;H2 # HANGUL SYLLABLE CE
+CCB5..CCCF;H3 # HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH
+CCD0;H2 # HANGUL SYLLABLE CYEO
+CCD1..CCEB;H3 # HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH
+CCEC;H2 # HANGUL SYLLABLE CYE
+CCED..CD07;H3 # HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH
+CD08;H2 # HANGUL SYLLABLE CO
+CD09..CD23;H3 # HANGUL SYLLABLE COG..HANGUL SYLLABLE COH
+CD24;H2 # HANGUL SYLLABLE CWA
+CD25..CD3F;H3 # HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH
+CD40;H2 # HANGUL SYLLABLE CWAE
+CD41..CD5B;H3 # HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH
+CD5C;H2 # HANGUL SYLLABLE COE
+CD5D..CD77;H3 # HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH
+CD78;H2 # HANGUL SYLLABLE CYO
+CD79..CD93;H3 # HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH
+CD94;H2 # HANGUL SYLLABLE CU
+CD95..CDAF;H3 # HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH
+CDB0;H2 # HANGUL SYLLABLE CWEO
+CDB1..CDCB;H3 # HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH
+CDCC;H2 # HANGUL SYLLABLE CWE
+CDCD..CDE7;H3 # HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH
+CDE8;H2 # HANGUL SYLLABLE CWI
+CDE9..CE03;H3 # HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH
+CE04;H2 # HANGUL SYLLABLE CYU
+CE05..CE1F;H3 # HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH
+CE20;H2 # HANGUL SYLLABLE CEU
+CE21..CE3B;H3 # HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH
+CE3C;H2 # HANGUL SYLLABLE CYI
+CE3D..CE57;H3 # HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH
+CE58;H2 # HANGUL SYLLABLE CI
+CE59..CE73;H3 # HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH
+CE74;H2 # HANGUL SYLLABLE KA
+CE75..CE8F;H3 # HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH
+CE90;H2 # HANGUL SYLLABLE KAE
+CE91..CEAB;H3 # HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH
+CEAC;H2 # HANGUL SYLLABLE KYA
+CEAD..CEC7;H3 # HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH
+CEC8;H2 # HANGUL SYLLABLE KYAE
+CEC9..CEE3;H3 # HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH
+CEE4;H2 # HANGUL SYLLABLE KEO
+CEE5..CEFF;H3 # HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH
+CF00;H2 # HANGUL SYLLABLE KE
+CF01..CF1B;H3 # HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH
+CF1C;H2 # HANGUL SYLLABLE KYEO
+CF1D..CF37;H3 # HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH
+CF38;H2 # HANGUL SYLLABLE KYE
+CF39..CF53;H3 # HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH
+CF54;H2 # HANGUL SYLLABLE KO
+CF55..CF6F;H3 # HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH
+CF70;H2 # HANGUL SYLLABLE KWA
+CF71..CF8B;H3 # HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH
+CF8C;H2 # HANGUL SYLLABLE KWAE
+CF8D..CFA7;H3 # HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH
+CFA8;H2 # HANGUL SYLLABLE KOE
+CFA9..CFC3;H3 # HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH
+CFC4;H2 # HANGUL SYLLABLE KYO
+CFC5..CFDF;H3 # HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH
+CFE0;H2 # HANGUL SYLLABLE KU
+CFE1..CFFB;H3 # HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH
+CFFC;H2 # HANGUL SYLLABLE KWEO
+CFFD..D017;H3 # HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH
+D018;H2 # HANGUL SYLLABLE KWE
+D019..D033;H3 # HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH
+D034;H2 # HANGUL SYLLABLE KWI
+D035..D04F;H3 # HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH
+D050;H2 # HANGUL SYLLABLE KYU
+D051..D06B;H3 # HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH
+D06C;H2 # HANGUL SYLLABLE KEU
+D06D..D087;H3 # HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH
+D088;H2 # HANGUL SYLLABLE KYI
+D089..D0A3;H3 # HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH
+D0A4;H2 # HANGUL SYLLABLE KI
+D0A5..D0BF;H3 # HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH
+D0C0;H2 # HANGUL SYLLABLE TA
+D0C1..D0DB;H3 # HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH
+D0DC;H2 # HANGUL SYLLABLE TAE
+D0DD..D0F7;H3 # HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH
+D0F8;H2 # HANGUL SYLLABLE TYA
+D0F9..D113;H3 # HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH
+D114;H2 # HANGUL SYLLABLE TYAE
+D115..D12F;H3 # HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH
+D130;H2 # HANGUL SYLLABLE TEO
+D131..D14B;H3 # HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH
+D14C;H2 # HANGUL SYLLABLE TE
+D14D..D167;H3 # HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH
+D168;H2 # HANGUL SYLLABLE TYEO
+D169..D183;H3 # HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH
+D184;H2 # HANGUL SYLLABLE TYE
+D185..D19F;H3 # HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH
+D1A0;H2 # HANGUL SYLLABLE TO
+D1A1..D1BB;H3 # HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH
+D1BC;H2 # HANGUL SYLLABLE TWA
+D1BD..D1D7;H3 # HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH
+D1D8;H2 # HANGUL SYLLABLE TWAE
+D1D9..D1F3;H3 # HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH
+D1F4;H2 # HANGUL SYLLABLE TOE
+D1F5..D20F;H3 # HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH
+D210;H2 # HANGUL SYLLABLE TYO
+D211..D22B;H3 # HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH
+D22C;H2 # HANGUL SYLLABLE TU
+D22D..D247;H3 # HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH
+D248;H2 # HANGUL SYLLABLE TWEO
+D249..D263;H3 # HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH
+D264;H2 # HANGUL SYLLABLE TWE
+D265..D27F;H3 # HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH
+D280;H2 # HANGUL SYLLABLE TWI
+D281..D29B;H3 # HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH
+D29C;H2 # HANGUL SYLLABLE TYU
+D29D..D2B7;H3 # HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH
+D2B8;H2 # HANGUL SYLLABLE TEU
+D2B9..D2D3;H3 # HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH
+D2D4;H2 # HANGUL SYLLABLE TYI
+D2D5..D2EF;H3 # HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH
+D2F0;H2 # HANGUL SYLLABLE TI
+D2F1..D30B;H3 # HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH
+D30C;H2 # HANGUL SYLLABLE PA
+D30D..D327;H3 # HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH
+D328;H2 # HANGUL SYLLABLE PAE
+D329..D343;H3 # HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH
+D344;H2 # HANGUL SYLLABLE PYA
+D345..D35F;H3 # HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH
+D360;H2 # HANGUL SYLLABLE PYAE
+D361..D37B;H3 # HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH
+D37C;H2 # HANGUL SYLLABLE PEO
+D37D..D397;H3 # HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH
+D398;H2 # HANGUL SYLLABLE PE
+D399..D3B3;H3 # HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH
+D3B4;H2 # HANGUL SYLLABLE PYEO
+D3B5..D3CF;H3 # HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH
+D3D0;H2 # HANGUL SYLLABLE PYE
+D3D1..D3EB;H3 # HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH
+D3EC;H2 # HANGUL SYLLABLE PO
+D3ED..D407;H3 # HANGUL SYLLABLE POG..HANGUL SYLLABLE POH
+D408;H2 # HANGUL SYLLABLE PWA
+D409..D423;H3 # HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH
+D424;H2 # HANGUL SYLLABLE PWAE
+D425..D43F;H3 # HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH
+D440;H2 # HANGUL SYLLABLE POE
+D441..D45B;H3 # HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH
+D45C;H2 # HANGUL SYLLABLE PYO
+D45D..D477;H3 # HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH
+D478;H2 # HANGUL SYLLABLE PU
+D479..D493;H3 # HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH
+D494;H2 # HANGUL SYLLABLE PWEO
+D495..D4AF;H3 # HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH
+D4B0;H2 # HANGUL SYLLABLE PWE
+D4B1..D4CB;H3 # HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH
+D4CC;H2 # HANGUL SYLLABLE PWI
+D4CD..D4E7;H3 # HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH
+D4E8;H2 # HANGUL SYLLABLE PYU
+D4E9..D503;H3 # HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH
+D504;H2 # HANGUL SYLLABLE PEU
+D505..D51F;H3 # HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH
+D520;H2 # HANGUL SYLLABLE PYI
+D521..D53B;H3 # HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH
+D53C;H2 # HANGUL SYLLABLE PI
+D53D..D557;H3 # HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH
+D558;H2 # HANGUL SYLLABLE HA
+D559..D573;H3 # HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH
+D574;H2 # HANGUL SYLLABLE HAE
+D575..D58F;H3 # HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH
+D590;H2 # HANGUL SYLLABLE HYA
+D591..D5AB;H3 # HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH
+D5AC;H2 # HANGUL SYLLABLE HYAE
+D5AD..D5C7;H3 # HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH
+D5C8;H2 # HANGUL SYLLABLE HEO
+D5C9..D5E3;H3 # HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH
+D5E4;H2 # HANGUL SYLLABLE HE
+D5E5..D5FF;H3 # HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH
+D600;H2 # HANGUL SYLLABLE HYEO
+D601..D61B;H3 # HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH
+D61C;H2 # HANGUL SYLLABLE HYE
+D61D..D637;H3 # HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH
+D638;H2 # HANGUL SYLLABLE HO
+D639..D653;H3 # HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH
+D654;H2 # HANGUL SYLLABLE HWA
+D655..D66F;H3 # HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH
+D670;H2 # HANGUL SYLLABLE HWAE
+D671..D68B;H3 # HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH
+D68C;H2 # HANGUL SYLLABLE HOE
+D68D..D6A7;H3 # HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH
+D6A8;H2 # HANGUL SYLLABLE HYO
+D6A9..D6C3;H3 # HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH
+D6C4;H2 # HANGUL SYLLABLE HU
+D6C5..D6DF;H3 # HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH
+D6E0;H2 # HANGUL SYLLABLE HWEO
+D6E1..D6FB;H3 # HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH
+D6FC;H2 # HANGUL SYLLABLE HWE
+D6FD..D717;H3 # HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH
+D718;H2 # HANGUL SYLLABLE HWI
+D719..D733;H3 # HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH
+D734;H2 # HANGUL SYLLABLE HYU
+D735..D74F;H3 # HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH
+D750;H2 # HANGUL SYLLABLE HEU
+D751..D76B;H3 # HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH
+D76C;H2 # HANGUL SYLLABLE HYI
+D76D..D787;H3 # HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH
+D788;H2 # HANGUL SYLLABLE HI
+D789..D7A3;H3 # HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH
+D800..DB7F;SG # <Non Private Use High Surrogate, First>..<Non Private Use High Surrogate, Last>
+DB80..DBFF;SG # <Private Use High Surrogate, First>..<Private Use High Surrogate, Last>
+DC00..DFFF;SG # <Low Surrogate, First>..<Low Surrogate, Last>
+E000..F8FF;XX # <Private Use, First>..<Private Use, Last>
+F900;ID # CJK COMPATIBILITY IDEOGRAPH-F900
+F901;ID # CJK COMPATIBILITY IDEOGRAPH-F901
+F902;ID # CJK COMPATIBILITY IDEOGRAPH-F902
+F903;ID # CJK COMPATIBILITY IDEOGRAPH-F903
+F904;ID # CJK COMPATIBILITY IDEOGRAPH-F904
+F905;ID # CJK COMPATIBILITY IDEOGRAPH-F905
+F906;ID # CJK COMPATIBILITY IDEOGRAPH-F906
+F907;ID # CJK COMPATIBILITY IDEOGRAPH-F907
+F908;ID # CJK COMPATIBILITY IDEOGRAPH-F908
+F909;ID # CJK COMPATIBILITY IDEOGRAPH-F909
+F90A;ID # CJK COMPATIBILITY IDEOGRAPH-F90A
+F90B;ID # CJK COMPATIBILITY IDEOGRAPH-F90B
+F90C;ID # CJK COMPATIBILITY IDEOGRAPH-F90C
+F90D;ID # CJK COMPATIBILITY IDEOGRAPH-F90D
+F90E;ID # CJK COMPATIBILITY IDEOGRAPH-F90E
+F90F;ID # CJK COMPATIBILITY IDEOGRAPH-F90F
+F910;ID # CJK COMPATIBILITY IDEOGRAPH-F910
+F911;ID # CJK COMPATIBILITY IDEOGRAPH-F911
+F912;ID # CJK COMPATIBILITY IDEOGRAPH-F912
+F913;ID # CJK COMPATIBILITY IDEOGRAPH-F913
+F914;ID # CJK COMPATIBILITY IDEOGRAPH-F914
+F915;ID # CJK COMPATIBILITY IDEOGRAPH-F915
+F916;ID # CJK COMPATIBILITY IDEOGRAPH-F916
+F917;ID # CJK COMPATIBILITY IDEOGRAPH-F917
+F918;ID # CJK COMPATIBILITY IDEOGRAPH-F918
+F919;ID # CJK COMPATIBILITY IDEOGRAPH-F919
+F91A;ID # CJK COMPATIBILITY IDEOGRAPH-F91A
+F91B;ID # CJK COMPATIBILITY IDEOGRAPH-F91B
+F91C;ID # CJK COMPATIBILITY IDEOGRAPH-F91C
+F91D;ID # CJK COMPATIBILITY IDEOGRAPH-F91D
+F91E;ID # CJK COMPATIBILITY IDEOGRAPH-F91E
+F91F;ID # CJK COMPATIBILITY IDEOGRAPH-F91F
+F920;ID # CJK COMPATIBILITY IDEOGRAPH-F920
+F921;ID # CJK COMPATIBILITY IDEOGRAPH-F921
+F922;ID # CJK COMPATIBILITY IDEOGRAPH-F922
+F923;ID # CJK COMPATIBILITY IDEOGRAPH-F923
+F924;ID # CJK COMPATIBILITY IDEOGRAPH-F924
+F925;ID # CJK COMPATIBILITY IDEOGRAPH-F925
+F926;ID # CJK COMPATIBILITY IDEOGRAPH-F926
+F927;ID # CJK COMPATIBILITY IDEOGRAPH-F927
+F928;ID # CJK COMPATIBILITY IDEOGRAPH-F928
+F929;ID # CJK COMPATIBILITY IDEOGRAPH-F929
+F92A;ID # CJK COMPATIBILITY IDEOGRAPH-F92A
+F92B;ID # CJK COMPATIBILITY IDEOGRAPH-F92B
+F92C;ID # CJK COMPATIBILITY IDEOGRAPH-F92C
+F92D;ID # CJK COMPATIBILITY IDEOGRAPH-F92D
+F92E;ID # CJK COMPATIBILITY IDEOGRAPH-F92E
+F92F;ID # CJK COMPATIBILITY IDEOGRAPH-F92F
+F930;ID # CJK COMPATIBILITY IDEOGRAPH-F930
+F931;ID # CJK COMPATIBILITY IDEOGRAPH-F931
+F932;ID # CJK COMPATIBILITY IDEOGRAPH-F932
+F933;ID # CJK COMPATIBILITY IDEOGRAPH-F933
+F934;ID # CJK COMPATIBILITY IDEOGRAPH-F934
+F935;ID # CJK COMPATIBILITY IDEOGRAPH-F935
+F936;ID # CJK COMPATIBILITY IDEOGRAPH-F936
+F937;ID # CJK COMPATIBILITY IDEOGRAPH-F937
+F938;ID # CJK COMPATIBILITY IDEOGRAPH-F938
+F939;ID # CJK COMPATIBILITY IDEOGRAPH-F939
+F93A;ID # CJK COMPATIBILITY IDEOGRAPH-F93A
+F93B;ID # CJK COMPATIBILITY IDEOGRAPH-F93B
+F93C;ID # CJK COMPATIBILITY IDEOGRAPH-F93C
+F93D;ID # CJK COMPATIBILITY IDEOGRAPH-F93D
+F93E;ID # CJK COMPATIBILITY IDEOGRAPH-F93E
+F93F;ID # CJK COMPATIBILITY IDEOGRAPH-F93F
+F940;ID # CJK COMPATIBILITY IDEOGRAPH-F940
+F941;ID # CJK COMPATIBILITY IDEOGRAPH-F941
+F942;ID # CJK COMPATIBILITY IDEOGRAPH-F942
+F943;ID # CJK COMPATIBILITY IDEOGRAPH-F943
+F944;ID # CJK COMPATIBILITY IDEOGRAPH-F944
+F945;ID # CJK COMPATIBILITY IDEOGRAPH-F945
+F946;ID # CJK COMPATIBILITY IDEOGRAPH-F946
+F947;ID # CJK COMPATIBILITY IDEOGRAPH-F947
+F948;ID # CJK COMPATIBILITY IDEOGRAPH-F948
+F949;ID # CJK COMPATIBILITY IDEOGRAPH-F949
+F94A;ID # CJK COMPATIBILITY IDEOGRAPH-F94A
+F94B;ID # CJK COMPATIBILITY IDEOGRAPH-F94B
+F94C;ID # CJK COMPATIBILITY IDEOGRAPH-F94C
+F94D;ID # CJK COMPATIBILITY IDEOGRAPH-F94D
+F94E;ID # CJK COMPATIBILITY IDEOGRAPH-F94E
+F94F;ID # CJK COMPATIBILITY IDEOGRAPH-F94F
+F950;ID # CJK COMPATIBILITY IDEOGRAPH-F950
+F951;ID # CJK COMPATIBILITY IDEOGRAPH-F951
+F952;ID # CJK COMPATIBILITY IDEOGRAPH-F952
+F953;ID # CJK COMPATIBILITY IDEOGRAPH-F953
+F954;ID # CJK COMPATIBILITY IDEOGRAPH-F954
+F955;ID # CJK COMPATIBILITY IDEOGRAPH-F955
+F956;ID # CJK COMPATIBILITY IDEOGRAPH-F956
+F957;ID # CJK COMPATIBILITY IDEOGRAPH-F957
+F958;ID # CJK COMPATIBILITY IDEOGRAPH-F958
+F959;ID # CJK COMPATIBILITY IDEOGRAPH-F959
+F95A;ID # CJK COMPATIBILITY IDEOGRAPH-F95A
+F95B;ID # CJK COMPATIBILITY IDEOGRAPH-F95B
+F95C;ID # CJK COMPATIBILITY IDEOGRAPH-F95C
+F95D;ID # CJK COMPATIBILITY IDEOGRAPH-F95D
+F95E;ID # CJK COMPATIBILITY IDEOGRAPH-F95E
+F95F;ID # CJK COMPATIBILITY IDEOGRAPH-F95F
+F960;ID # CJK COMPATIBILITY IDEOGRAPH-F960
+F961;ID # CJK COMPATIBILITY IDEOGRAPH-F961
+F962;ID # CJK COMPATIBILITY IDEOGRAPH-F962
+F963;ID # CJK COMPATIBILITY IDEOGRAPH-F963
+F964;ID # CJK COMPATIBILITY IDEOGRAPH-F964
+F965;ID # CJK COMPATIBILITY IDEOGRAPH-F965
+F966;ID # CJK COMPATIBILITY IDEOGRAPH-F966
+F967;ID # CJK COMPATIBILITY IDEOGRAPH-F967
+F968;ID # CJK COMPATIBILITY IDEOGRAPH-F968
+F969;ID # CJK COMPATIBILITY IDEOGRAPH-F969
+F96A;ID # CJK COMPATIBILITY IDEOGRAPH-F96A
+F96B;ID # CJK COMPATIBILITY IDEOGRAPH-F96B
+F96C;ID # CJK COMPATIBILITY IDEOGRAPH-F96C
+F96D;ID # CJK COMPATIBILITY IDEOGRAPH-F96D
+F96E;ID # CJK COMPATIBILITY IDEOGRAPH-F96E
+F96F;ID # CJK COMPATIBILITY IDEOGRAPH-F96F
+F970;ID # CJK COMPATIBILITY IDEOGRAPH-F970
+F971;ID # CJK COMPATIBILITY IDEOGRAPH-F971
+F972;ID # CJK COMPATIBILITY IDEOGRAPH-F972
+F973;ID # CJK COMPATIBILITY IDEOGRAPH-F973
+F974;ID # CJK COMPATIBILITY IDEOGRAPH-F974
+F975;ID # CJK COMPATIBILITY IDEOGRAPH-F975
+F976;ID # CJK COMPATIBILITY IDEOGRAPH-F976
+F977;ID # CJK COMPATIBILITY IDEOGRAPH-F977
+F978;ID # CJK COMPATIBILITY IDEOGRAPH-F978
+F979;ID # CJK COMPATIBILITY IDEOGRAPH-F979
+F97A;ID # CJK COMPATIBILITY IDEOGRAPH-F97A
+F97B;ID # CJK COMPATIBILITY IDEOGRAPH-F97B
+F97C;ID # CJK COMPATIBILITY IDEOGRAPH-F97C
+F97D;ID # CJK COMPATIBILITY IDEOGRAPH-F97D
+F97E;ID # CJK COMPATIBILITY IDEOGRAPH-F97E
+F97F;ID # CJK COMPATIBILITY IDEOGRAPH-F97F
+F980;ID # CJK COMPATIBILITY IDEOGRAPH-F980
+F981;ID # CJK COMPATIBILITY IDEOGRAPH-F981
+F982;ID # CJK COMPATIBILITY IDEOGRAPH-F982
+F983;ID # CJK COMPATIBILITY IDEOGRAPH-F983
+F984;ID # CJK COMPATIBILITY IDEOGRAPH-F984
+F985;ID # CJK COMPATIBILITY IDEOGRAPH-F985
+F986;ID # CJK COMPATIBILITY IDEOGRAPH-F986
+F987;ID # CJK COMPATIBILITY IDEOGRAPH-F987
+F988;ID # CJK COMPATIBILITY IDEOGRAPH-F988
+F989;ID # CJK COMPATIBILITY IDEOGRAPH-F989
+F98A;ID # CJK COMPATIBILITY IDEOGRAPH-F98A
+F98B;ID # CJK COMPATIBILITY IDEOGRAPH-F98B
+F98C;ID # CJK COMPATIBILITY IDEOGRAPH-F98C
+F98D;ID # CJK COMPATIBILITY IDEOGRAPH-F98D
+F98E;ID # CJK COMPATIBILITY IDEOGRAPH-F98E
+F98F;ID # CJK COMPATIBILITY IDEOGRAPH-F98F
+F990;ID # CJK COMPATIBILITY IDEOGRAPH-F990
+F991;ID # CJK COMPATIBILITY IDEOGRAPH-F991
+F992;ID # CJK COMPATIBILITY IDEOGRAPH-F992
+F993;ID # CJK COMPATIBILITY IDEOGRAPH-F993
+F994;ID # CJK COMPATIBILITY IDEOGRAPH-F994
+F995;ID # CJK COMPATIBILITY IDEOGRAPH-F995
+F996;ID # CJK COMPATIBILITY IDEOGRAPH-F996
+F997;ID # CJK COMPATIBILITY IDEOGRAPH-F997
+F998;ID # CJK COMPATIBILITY IDEOGRAPH-F998
+F999;ID # CJK COMPATIBILITY IDEOGRAPH-F999
+F99A;ID # CJK COMPATIBILITY IDEOGRAPH-F99A
+F99B;ID # CJK COMPATIBILITY IDEOGRAPH-F99B
+F99C;ID # CJK COMPATIBILITY IDEOGRAPH-F99C
+F99D;ID # CJK COMPATIBILITY IDEOGRAPH-F99D
+F99E;ID # CJK COMPATIBILITY IDEOGRAPH-F99E
+F99F;ID # CJK COMPATIBILITY IDEOGRAPH-F99F
+F9A0;ID # CJK COMPATIBILITY IDEOGRAPH-F9A0
+F9A1;ID # CJK COMPATIBILITY IDEOGRAPH-F9A1
+F9A2;ID # CJK COMPATIBILITY IDEOGRAPH-F9A2
+F9A3;ID # CJK COMPATIBILITY IDEOGRAPH-F9A3
+F9A4;ID # CJK COMPATIBILITY IDEOGRAPH-F9A4
+F9A5;ID # CJK COMPATIBILITY IDEOGRAPH-F9A5
+F9A6;ID # CJK COMPATIBILITY IDEOGRAPH-F9A6
+F9A7;ID # CJK COMPATIBILITY IDEOGRAPH-F9A7
+F9A8;ID # CJK COMPATIBILITY IDEOGRAPH-F9A8
+F9A9;ID # CJK COMPATIBILITY IDEOGRAPH-F9A9
+F9AA;ID # CJK COMPATIBILITY IDEOGRAPH-F9AA
+F9AB;ID # CJK COMPATIBILITY IDEOGRAPH-F9AB
+F9AC;ID # CJK COMPATIBILITY IDEOGRAPH-F9AC
+F9AD;ID # CJK COMPATIBILITY IDEOGRAPH-F9AD
+F9AE;ID # CJK COMPATIBILITY IDEOGRAPH-F9AE
+F9AF;ID # CJK COMPATIBILITY IDEOGRAPH-F9AF
+F9B0;ID # CJK COMPATIBILITY IDEOGRAPH-F9B0
+F9B1;ID # CJK COMPATIBILITY IDEOGRAPH-F9B1
+F9B2;ID # CJK COMPATIBILITY IDEOGRAPH-F9B2
+F9B3;ID # CJK COMPATIBILITY IDEOGRAPH-F9B3
+F9B4;ID # CJK COMPATIBILITY IDEOGRAPH-F9B4
+F9B5;ID # CJK COMPATIBILITY IDEOGRAPH-F9B5
+F9B6;ID # CJK COMPATIBILITY IDEOGRAPH-F9B6
+F9B7;ID # CJK COMPATIBILITY IDEOGRAPH-F9B7
+F9B8;ID # CJK COMPATIBILITY IDEOGRAPH-F9B8
+F9B9;ID # CJK COMPATIBILITY IDEOGRAPH-F9B9
+F9BA;ID # CJK COMPATIBILITY IDEOGRAPH-F9BA
+F9BB;ID # CJK COMPATIBILITY IDEOGRAPH-F9BB
+F9BC;ID # CJK COMPATIBILITY IDEOGRAPH-F9BC
+F9BD;ID # CJK COMPATIBILITY IDEOGRAPH-F9BD
+F9BE;ID # CJK COMPATIBILITY IDEOGRAPH-F9BE
+F9BF;ID # CJK COMPATIBILITY IDEOGRAPH-F9BF
+F9C0;ID # CJK COMPATIBILITY IDEOGRAPH-F9C0
+F9C1;ID # CJK COMPATIBILITY IDEOGRAPH-F9C1
+F9C2;ID # CJK COMPATIBILITY IDEOGRAPH-F9C2
+F9C3;ID # CJK COMPATIBILITY IDEOGRAPH-F9C3
+F9C4;ID # CJK COMPATIBILITY IDEOGRAPH-F9C4
+F9C5;ID # CJK COMPATIBILITY IDEOGRAPH-F9C5
+F9C6;ID # CJK COMPATIBILITY IDEOGRAPH-F9C6
+F9C7;ID # CJK COMPATIBILITY IDEOGRAPH-F9C7
+F9C8;ID # CJK COMPATIBILITY IDEOGRAPH-F9C8
+F9C9;ID # CJK COMPATIBILITY IDEOGRAPH-F9C9
+F9CA;ID # CJK COMPATIBILITY IDEOGRAPH-F9CA
+F9CB;ID # CJK COMPATIBILITY IDEOGRAPH-F9CB
+F9CC;ID # CJK COMPATIBILITY IDEOGRAPH-F9CC
+F9CD;ID # CJK COMPATIBILITY IDEOGRAPH-F9CD
+F9CE;ID # CJK COMPATIBILITY IDEOGRAPH-F9CE
+F9CF;ID # CJK COMPATIBILITY IDEOGRAPH-F9CF
+F9D0;ID # CJK COMPATIBILITY IDEOGRAPH-F9D0
+F9D1;ID # CJK COMPATIBILITY IDEOGRAPH-F9D1
+F9D2;ID # CJK COMPATIBILITY IDEOGRAPH-F9D2
+F9D3;ID # CJK COMPATIBILITY IDEOGRAPH-F9D3
+F9D4;ID # CJK COMPATIBILITY IDEOGRAPH-F9D4
+F9D5;ID # CJK COMPATIBILITY IDEOGRAPH-F9D5
+F9D6;ID # CJK COMPATIBILITY IDEOGRAPH-F9D6
+F9D7;ID # CJK COMPATIBILITY IDEOGRAPH-F9D7
+F9D8;ID # CJK COMPATIBILITY IDEOGRAPH-F9D8
+F9D9;ID # CJK COMPATIBILITY IDEOGRAPH-F9D9
+F9DA;ID # CJK COMPATIBILITY IDEOGRAPH-F9DA
+F9DB;ID # CJK COMPATIBILITY IDEOGRAPH-F9DB
+F9DC;ID # CJK COMPATIBILITY IDEOGRAPH-F9DC
+F9DD;ID # CJK COMPATIBILITY IDEOGRAPH-F9DD
+F9DE;ID # CJK COMPATIBILITY IDEOGRAPH-F9DE
+F9DF;ID # CJK COMPATIBILITY IDEOGRAPH-F9DF
+F9E0;ID # CJK COMPATIBILITY IDEOGRAPH-F9E0
+F9E1;ID # CJK COMPATIBILITY IDEOGRAPH-F9E1
+F9E2;ID # CJK COMPATIBILITY IDEOGRAPH-F9E2
+F9E3;ID # CJK COMPATIBILITY IDEOGRAPH-F9E3
+F9E4;ID # CJK COMPATIBILITY IDEOGRAPH-F9E4
+F9E5;ID # CJK COMPATIBILITY IDEOGRAPH-F9E5
+F9E6;ID # CJK COMPATIBILITY IDEOGRAPH-F9E6
+F9E7;ID # CJK COMPATIBILITY IDEOGRAPH-F9E7
+F9E8;ID # CJK COMPATIBILITY IDEOGRAPH-F9E8
+F9E9;ID # CJK COMPATIBILITY IDEOGRAPH-F9E9
+F9EA;ID # CJK COMPATIBILITY IDEOGRAPH-F9EA
+F9EB;ID # CJK COMPATIBILITY IDEOGRAPH-F9EB
+F9EC;ID # CJK COMPATIBILITY IDEOGRAPH-F9EC
+F9ED;ID # CJK COMPATIBILITY IDEOGRAPH-F9ED
+F9EE;ID # CJK COMPATIBILITY IDEOGRAPH-F9EE
+F9EF;ID # CJK COMPATIBILITY IDEOGRAPH-F9EF
+F9F0;ID # CJK COMPATIBILITY IDEOGRAPH-F9F0
+F9F1;ID # CJK COMPATIBILITY IDEOGRAPH-F9F1
+F9F2;ID # CJK COMPATIBILITY IDEOGRAPH-F9F2
+F9F3;ID # CJK COMPATIBILITY IDEOGRAPH-F9F3
+F9F4;ID # CJK COMPATIBILITY IDEOGRAPH-F9F4
+F9F5;ID # CJK COMPATIBILITY IDEOGRAPH-F9F5
+F9F6;ID # CJK COMPATIBILITY IDEOGRAPH-F9F6
+F9F7;ID # CJK COMPATIBILITY IDEOGRAPH-F9F7
+F9F8;ID # CJK COMPATIBILITY IDEOGRAPH-F9F8
+F9F9;ID # CJK COMPATIBILITY IDEOGRAPH-F9F9
+F9FA;ID # CJK COMPATIBILITY IDEOGRAPH-F9FA
+F9FB;ID # CJK COMPATIBILITY IDEOGRAPH-F9FB
+F9FC;ID # CJK COMPATIBILITY IDEOGRAPH-F9FC
+F9FD;ID # CJK COMPATIBILITY IDEOGRAPH-F9FD
+F9FE;ID # CJK COMPATIBILITY IDEOGRAPH-F9FE
+F9FF;ID # CJK COMPATIBILITY IDEOGRAPH-F9FF
+FA00;ID # CJK COMPATIBILITY IDEOGRAPH-FA00
+FA01;ID # CJK COMPATIBILITY IDEOGRAPH-FA01
+FA02;ID # CJK COMPATIBILITY IDEOGRAPH-FA02
+FA03;ID # CJK COMPATIBILITY IDEOGRAPH-FA03
+FA04;ID # CJK COMPATIBILITY IDEOGRAPH-FA04
+FA05;ID # CJK COMPATIBILITY IDEOGRAPH-FA05
+FA06;ID # CJK COMPATIBILITY IDEOGRAPH-FA06
+FA07;ID # CJK COMPATIBILITY IDEOGRAPH-FA07
+FA08;ID # CJK COMPATIBILITY IDEOGRAPH-FA08
+FA09;ID # CJK COMPATIBILITY IDEOGRAPH-FA09
+FA0A;ID # CJK COMPATIBILITY IDEOGRAPH-FA0A
+FA0B;ID # CJK COMPATIBILITY IDEOGRAPH-FA0B
+FA0C;ID # CJK COMPATIBILITY IDEOGRAPH-FA0C
+FA0D;ID # CJK COMPATIBILITY IDEOGRAPH-FA0D
+FA0E;ID # CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F;ID # CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA10;ID # CJK COMPATIBILITY IDEOGRAPH-FA10
+FA11;ID # CJK COMPATIBILITY IDEOGRAPH-FA11
+FA12;ID # CJK COMPATIBILITY IDEOGRAPH-FA12
+FA13;ID # CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14;ID # CJK COMPATIBILITY IDEOGRAPH-FA14
+FA15;ID # CJK COMPATIBILITY IDEOGRAPH-FA15
+FA16;ID # CJK COMPATIBILITY IDEOGRAPH-FA16
+FA17;ID # CJK COMPATIBILITY IDEOGRAPH-FA17
+FA18;ID # CJK COMPATIBILITY IDEOGRAPH-FA18
+FA19;ID # CJK COMPATIBILITY IDEOGRAPH-FA19
+FA1A;ID # CJK COMPATIBILITY IDEOGRAPH-FA1A
+FA1B;ID # CJK COMPATIBILITY IDEOGRAPH-FA1B
+FA1C;ID # CJK COMPATIBILITY IDEOGRAPH-FA1C
+FA1D;ID # CJK COMPATIBILITY IDEOGRAPH-FA1D
+FA1E;ID # CJK COMPATIBILITY IDEOGRAPH-FA1E
+FA1F;ID # CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA20;ID # CJK COMPATIBILITY IDEOGRAPH-FA20
+FA21;ID # CJK COMPATIBILITY IDEOGRAPH-FA21
+FA22;ID # CJK COMPATIBILITY IDEOGRAPH-FA22
+FA23;ID # CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24;ID # CJK COMPATIBILITY IDEOGRAPH-FA24
+FA25;ID # CJK COMPATIBILITY IDEOGRAPH-FA25
+FA26;ID # CJK COMPATIBILITY IDEOGRAPH-FA26
+FA27;ID # CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28;ID # CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29;ID # CJK COMPATIBILITY IDEOGRAPH-FA29
+FA2A;ID # CJK COMPATIBILITY IDEOGRAPH-FA2A
+FA2B;ID # CJK COMPATIBILITY IDEOGRAPH-FA2B
+FA2C;ID # CJK COMPATIBILITY IDEOGRAPH-FA2C
+FA2D;ID # CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30;ID # CJK COMPATIBILITY IDEOGRAPH-FA30
+FA31;ID # CJK COMPATIBILITY IDEOGRAPH-FA31
+FA32;ID # CJK COMPATIBILITY IDEOGRAPH-FA32
+FA33;ID # CJK COMPATIBILITY IDEOGRAPH-FA33
+FA34;ID # CJK COMPATIBILITY IDEOGRAPH-FA34
+FA35;ID # CJK COMPATIBILITY IDEOGRAPH-FA35
+FA36;ID # CJK COMPATIBILITY IDEOGRAPH-FA36
+FA37;ID # CJK COMPATIBILITY IDEOGRAPH-FA37
+FA38;ID # CJK COMPATIBILITY IDEOGRAPH-FA38
+FA39;ID # CJK COMPATIBILITY IDEOGRAPH-FA39
+FA3A;ID # CJK COMPATIBILITY IDEOGRAPH-FA3A
+FA3B;ID # CJK COMPATIBILITY IDEOGRAPH-FA3B
+FA3C;ID # CJK COMPATIBILITY IDEOGRAPH-FA3C
+FA3D;ID # CJK COMPATIBILITY IDEOGRAPH-FA3D
+FA3E;ID # CJK COMPATIBILITY IDEOGRAPH-FA3E
+FA3F;ID # CJK COMPATIBILITY IDEOGRAPH-FA3F
+FA40;ID # CJK COMPATIBILITY IDEOGRAPH-FA40
+FA41;ID # CJK COMPATIBILITY IDEOGRAPH-FA41
+FA42;ID # CJK COMPATIBILITY IDEOGRAPH-FA42
+FA43;ID # CJK COMPATIBILITY IDEOGRAPH-FA43
+FA44;ID # CJK COMPATIBILITY IDEOGRAPH-FA44
+FA45;ID # CJK COMPATIBILITY IDEOGRAPH-FA45
+FA46;ID # CJK COMPATIBILITY IDEOGRAPH-FA46
+FA47;ID # CJK COMPATIBILITY IDEOGRAPH-FA47
+FA48;ID # CJK COMPATIBILITY IDEOGRAPH-FA48
+FA49;ID # CJK COMPATIBILITY IDEOGRAPH-FA49
+FA4A;ID # CJK COMPATIBILITY IDEOGRAPH-FA4A
+FA4B;ID # CJK COMPATIBILITY IDEOGRAPH-FA4B
+FA4C;ID # CJK COMPATIBILITY IDEOGRAPH-FA4C
+FA4D;ID # CJK COMPATIBILITY IDEOGRAPH-FA4D
+FA4E;ID # CJK COMPATIBILITY IDEOGRAPH-FA4E
+FA4F;ID # CJK COMPATIBILITY IDEOGRAPH-FA4F
+FA50;ID # CJK COMPATIBILITY IDEOGRAPH-FA50
+FA51;ID # CJK COMPATIBILITY IDEOGRAPH-FA51
+FA52;ID # CJK COMPATIBILITY IDEOGRAPH-FA52
+FA53;ID # CJK COMPATIBILITY IDEOGRAPH-FA53
+FA54;ID # CJK COMPATIBILITY IDEOGRAPH-FA54
+FA55;ID # CJK COMPATIBILITY IDEOGRAPH-FA55
+FA56;ID # CJK COMPATIBILITY IDEOGRAPH-FA56
+FA57;ID # CJK COMPATIBILITY IDEOGRAPH-FA57
+FA58;ID # CJK COMPATIBILITY IDEOGRAPH-FA58
+FA59;ID # CJK COMPATIBILITY IDEOGRAPH-FA59
+FA5A;ID # CJK COMPATIBILITY IDEOGRAPH-FA5A
+FA5B;ID # CJK COMPATIBILITY IDEOGRAPH-FA5B
+FA5C;ID # CJK COMPATIBILITY IDEOGRAPH-FA5C
+FA5D;ID # CJK COMPATIBILITY IDEOGRAPH-FA5D
+FA5E;ID # CJK COMPATIBILITY IDEOGRAPH-FA5E
+FA5F;ID # CJK COMPATIBILITY IDEOGRAPH-FA5F
+FA60;ID # CJK COMPATIBILITY IDEOGRAPH-FA60
+FA61;ID # CJK COMPATIBILITY IDEOGRAPH-FA61
+FA62;ID # CJK COMPATIBILITY IDEOGRAPH-FA62
+FA63;ID # CJK COMPATIBILITY IDEOGRAPH-FA63
+FA64;ID # CJK COMPATIBILITY IDEOGRAPH-FA64
+FA65;ID # CJK COMPATIBILITY IDEOGRAPH-FA65
+FA66;ID # CJK COMPATIBILITY IDEOGRAPH-FA66
+FA67;ID # CJK COMPATIBILITY IDEOGRAPH-FA67
+FA68;ID # CJK COMPATIBILITY IDEOGRAPH-FA68
+FA69;ID # CJK COMPATIBILITY IDEOGRAPH-FA69
+FA6A;ID # CJK COMPATIBILITY IDEOGRAPH-FA6A
+FA70;ID # CJK COMPATIBILITY IDEOGRAPH-FA70
+FA71;ID # CJK COMPATIBILITY IDEOGRAPH-FA71
+FA72;ID # CJK COMPATIBILITY IDEOGRAPH-FA72
+FA73;ID # CJK COMPATIBILITY IDEOGRAPH-FA73
+FA74;ID # CJK COMPATIBILITY IDEOGRAPH-FA74
+FA75;ID # CJK COMPATIBILITY IDEOGRAPH-FA75
+FA76;ID # CJK COMPATIBILITY IDEOGRAPH-FA76
+FA77;ID # CJK COMPATIBILITY IDEOGRAPH-FA77
+FA78;ID # CJK COMPATIBILITY IDEOGRAPH-FA78
+FA79;ID # CJK COMPATIBILITY IDEOGRAPH-FA79
+FA7A;ID # CJK COMPATIBILITY IDEOGRAPH-FA7A
+FA7B;ID # CJK COMPATIBILITY IDEOGRAPH-FA7B
+FA7C;ID # CJK COMPATIBILITY IDEOGRAPH-FA7C
+FA7D;ID # CJK COMPATIBILITY IDEOGRAPH-FA7D
+FA7E;ID # CJK COMPATIBILITY IDEOGRAPH-FA7E
+FA7F;ID # CJK COMPATIBILITY IDEOGRAPH-FA7F
+FA80;ID # CJK COMPATIBILITY IDEOGRAPH-FA80
+FA81;ID # CJK COMPATIBILITY IDEOGRAPH-FA81
+FA82;ID # CJK COMPATIBILITY IDEOGRAPH-FA82
+FA83;ID # CJK COMPATIBILITY IDEOGRAPH-FA83
+FA84;ID # CJK COMPATIBILITY IDEOGRAPH-FA84
+FA85;ID # CJK COMPATIBILITY IDEOGRAPH-FA85
+FA86;ID # CJK COMPATIBILITY IDEOGRAPH-FA86
+FA87;ID # CJK COMPATIBILITY IDEOGRAPH-FA87
+FA88;ID # CJK COMPATIBILITY IDEOGRAPH-FA88
+FA89;ID # CJK COMPATIBILITY IDEOGRAPH-FA89
+FA8A;ID # CJK COMPATIBILITY IDEOGRAPH-FA8A
+FA8B;ID # CJK COMPATIBILITY IDEOGRAPH-FA8B
+FA8C;ID # CJK COMPATIBILITY IDEOGRAPH-FA8C
+FA8D;ID # CJK COMPATIBILITY IDEOGRAPH-FA8D
+FA8E;ID # CJK COMPATIBILITY IDEOGRAPH-FA8E
+FA8F;ID # CJK COMPATIBILITY IDEOGRAPH-FA8F
+FA90;ID # CJK COMPATIBILITY IDEOGRAPH-FA90
+FA91;ID # CJK COMPATIBILITY IDEOGRAPH-FA91
+FA92;ID # CJK COMPATIBILITY IDEOGRAPH-FA92
+FA93;ID # CJK COMPATIBILITY IDEOGRAPH-FA93
+FA94;ID # CJK COMPATIBILITY IDEOGRAPH-FA94
+FA95;ID # CJK COMPATIBILITY IDEOGRAPH-FA95
+FA96;ID # CJK COMPATIBILITY IDEOGRAPH-FA96
+FA97;ID # CJK COMPATIBILITY IDEOGRAPH-FA97
+FA98;ID # CJK COMPATIBILITY IDEOGRAPH-FA98
+FA99;ID # CJK COMPATIBILITY IDEOGRAPH-FA99
+FA9A;ID # CJK COMPATIBILITY IDEOGRAPH-FA9A
+FA9B;ID # CJK COMPATIBILITY IDEOGRAPH-FA9B
+FA9C;ID # CJK COMPATIBILITY IDEOGRAPH-FA9C
+FA9D;ID # CJK COMPATIBILITY IDEOGRAPH-FA9D
+FA9E;ID # CJK COMPATIBILITY IDEOGRAPH-FA9E
+FA9F;ID # CJK COMPATIBILITY IDEOGRAPH-FA9F
+FAA0;ID # CJK COMPATIBILITY IDEOGRAPH-FAA0
+FAA1;ID # CJK COMPATIBILITY IDEOGRAPH-FAA1
+FAA2;ID # CJK COMPATIBILITY IDEOGRAPH-FAA2
+FAA3;ID # CJK COMPATIBILITY IDEOGRAPH-FAA3
+FAA4;ID # CJK COMPATIBILITY IDEOGRAPH-FAA4
+FAA5;ID # CJK COMPATIBILITY IDEOGRAPH-FAA5
+FAA6;ID # CJK COMPATIBILITY IDEOGRAPH-FAA6
+FAA7;ID # CJK COMPATIBILITY IDEOGRAPH-FAA7
+FAA8;ID # CJK COMPATIBILITY IDEOGRAPH-FAA8
+FAA9;ID # CJK COMPATIBILITY IDEOGRAPH-FAA9
+FAAA;ID # CJK COMPATIBILITY IDEOGRAPH-FAAA
+FAAB;ID # CJK COMPATIBILITY IDEOGRAPH-FAAB
+FAAC;ID # CJK COMPATIBILITY IDEOGRAPH-FAAC
+FAAD;ID # CJK COMPATIBILITY IDEOGRAPH-FAAD
+FAAE;ID # CJK COMPATIBILITY IDEOGRAPH-FAAE
+FAAF;ID # CJK COMPATIBILITY IDEOGRAPH-FAAF
+FAB0;ID # CJK COMPATIBILITY IDEOGRAPH-FAB0
+FAB1;ID # CJK COMPATIBILITY IDEOGRAPH-FAB1
+FAB2;ID # CJK COMPATIBILITY IDEOGRAPH-FAB2
+FAB3;ID # CJK COMPATIBILITY IDEOGRAPH-FAB3
+FAB4;ID # CJK COMPATIBILITY IDEOGRAPH-FAB4
+FAB5;ID # CJK COMPATIBILITY IDEOGRAPH-FAB5
+FAB6;ID # CJK COMPATIBILITY IDEOGRAPH-FAB6
+FAB7;ID # CJK COMPATIBILITY IDEOGRAPH-FAB7
+FAB8;ID # CJK COMPATIBILITY IDEOGRAPH-FAB8
+FAB9;ID # CJK COMPATIBILITY IDEOGRAPH-FAB9
+FABA;ID # CJK COMPATIBILITY IDEOGRAPH-FABA
+FABB;ID # CJK COMPATIBILITY IDEOGRAPH-FABB
+FABC;ID # CJK COMPATIBILITY IDEOGRAPH-FABC
+FABD;ID # CJK COMPATIBILITY IDEOGRAPH-FABD
+FABE;ID # CJK COMPATIBILITY IDEOGRAPH-FABE
+FABF;ID # CJK COMPATIBILITY IDEOGRAPH-FABF
+FAC0;ID # CJK COMPATIBILITY IDEOGRAPH-FAC0
+FAC1;ID # CJK COMPATIBILITY IDEOGRAPH-FAC1
+FAC2;ID # CJK COMPATIBILITY IDEOGRAPH-FAC2
+FAC3;ID # CJK COMPATIBILITY IDEOGRAPH-FAC3
+FAC4;ID # CJK COMPATIBILITY IDEOGRAPH-FAC4
+FAC5;ID # CJK COMPATIBILITY IDEOGRAPH-FAC5
+FAC6;ID # CJK COMPATIBILITY IDEOGRAPH-FAC6
+FAC7;ID # CJK COMPATIBILITY IDEOGRAPH-FAC7
+FAC8;ID # CJK COMPATIBILITY IDEOGRAPH-FAC8
+FAC9;ID # CJK COMPATIBILITY IDEOGRAPH-FAC9
+FACA;ID # CJK COMPATIBILITY IDEOGRAPH-FACA
+FACB;ID # CJK COMPATIBILITY IDEOGRAPH-FACB
+FACC;ID # CJK COMPATIBILITY IDEOGRAPH-FACC
+FACD;ID # CJK COMPATIBILITY IDEOGRAPH-FACD
+FACE;ID # CJK COMPATIBILITY IDEOGRAPH-FACE
+FACF;ID # CJK COMPATIBILITY IDEOGRAPH-FACF
+FAD0;ID # CJK COMPATIBILITY IDEOGRAPH-FAD0
+FAD1;ID # CJK COMPATIBILITY IDEOGRAPH-FAD1
+FAD2;ID # CJK COMPATIBILITY IDEOGRAPH-FAD2
+FAD3;ID # CJK COMPATIBILITY IDEOGRAPH-FAD3
+FAD4;ID # CJK COMPATIBILITY IDEOGRAPH-FAD4
+FAD5;ID # CJK COMPATIBILITY IDEOGRAPH-FAD5
+FAD6;ID # CJK COMPATIBILITY IDEOGRAPH-FAD6
+FAD7;ID # CJK COMPATIBILITY IDEOGRAPH-FAD7
+FAD8;ID # CJK COMPATIBILITY IDEOGRAPH-FAD8
+FAD9;ID # CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00;AL # LATIN SMALL LIGATURE FF
+FB01;AL # LATIN SMALL LIGATURE FI
+FB02;AL # LATIN SMALL LIGATURE FL
+FB03;AL # LATIN SMALL LIGATURE FFI
+FB04;AL # LATIN SMALL LIGATURE FFL
+FB05;AL # LATIN SMALL LIGATURE LONG S T
+FB06;AL # LATIN SMALL LIGATURE ST
+FB13;AL # ARMENIAN SMALL LIGATURE MEN NOW
+FB14;AL # ARMENIAN SMALL LIGATURE MEN ECH
+FB15;AL # ARMENIAN SMALL LIGATURE MEN INI
+FB16;AL # ARMENIAN SMALL LIGATURE VEW NOW
+FB17;AL # ARMENIAN SMALL LIGATURE MEN XEH
+FB1D;AL # HEBREW LETTER YOD WITH HIRIQ
+FB1E;CM # HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F;AL # HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB20;AL # HEBREW LETTER ALTERNATIVE AYIN
+FB21;AL # HEBREW LETTER WIDE ALEF
+FB22;AL # HEBREW LETTER WIDE DALET
+FB23;AL # HEBREW LETTER WIDE HE
+FB24;AL # HEBREW LETTER WIDE KAF
+FB25;AL # HEBREW LETTER WIDE LAMED
+FB26;AL # HEBREW LETTER WIDE FINAL MEM
+FB27;AL # HEBREW LETTER WIDE RESH
+FB28;AL # HEBREW LETTER WIDE TAV
+FB29;AL # HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A;AL # HEBREW LETTER SHIN WITH SHIN DOT
+FB2B;AL # HEBREW LETTER SHIN WITH SIN DOT
+FB2C;AL # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D;AL # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E;AL # HEBREW LETTER ALEF WITH PATAH
+FB2F;AL # HEBREW LETTER ALEF WITH QAMATS
+FB30;AL # HEBREW LETTER ALEF WITH MAPIQ
+FB31;AL # HEBREW LETTER BET WITH DAGESH
+FB32;AL # HEBREW LETTER GIMEL WITH DAGESH
+FB33;AL # HEBREW LETTER DALET WITH DAGESH
+FB34;AL # HEBREW LETTER HE WITH MAPIQ
+FB35;AL # HEBREW LETTER VAV WITH DAGESH
+FB36;AL # HEBREW LETTER ZAYIN WITH DAGESH
+FB38;AL # HEBREW LETTER TET WITH DAGESH
+FB39;AL # HEBREW LETTER YOD WITH DAGESH
+FB3A;AL # HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B;AL # HEBREW LETTER KAF WITH DAGESH
+FB3C;AL # HEBREW LETTER LAMED WITH DAGESH
+FB3E;AL # HEBREW LETTER MEM WITH DAGESH
+FB40;AL # HEBREW LETTER NUN WITH DAGESH
+FB41;AL # HEBREW LETTER SAMEKH WITH DAGESH
+FB43;AL # HEBREW LETTER FINAL PE WITH DAGESH
+FB44;AL # HEBREW LETTER PE WITH DAGESH
+FB46;AL # HEBREW LETTER TSADI WITH DAGESH
+FB47;AL # HEBREW LETTER QOF WITH DAGESH
+FB48;AL # HEBREW LETTER RESH WITH DAGESH
+FB49;AL # HEBREW LETTER SHIN WITH DAGESH
+FB4A;AL # HEBREW LETTER TAV WITH DAGESH
+FB4B;AL # HEBREW LETTER VAV WITH HOLAM
+FB4C;AL # HEBREW LETTER BET WITH RAFE
+FB4D;AL # HEBREW LETTER KAF WITH RAFE
+FB4E;AL # HEBREW LETTER PE WITH RAFE
+FB4F;AL # HEBREW LIGATURE ALEF LAMED
+FB50;AL # ARABIC LETTER ALEF WASLA ISOLATED FORM
+FB51;AL # ARABIC LETTER ALEF WASLA FINAL FORM
+FB52;AL # ARABIC LETTER BEEH ISOLATED FORM
+FB53;AL # ARABIC LETTER BEEH FINAL FORM
+FB54;AL # ARABIC LETTER BEEH INITIAL FORM
+FB55;AL # ARABIC LETTER BEEH MEDIAL FORM
+FB56;AL # ARABIC LETTER PEH ISOLATED FORM
+FB57;AL # ARABIC LETTER PEH FINAL FORM
+FB58;AL # ARABIC LETTER PEH INITIAL FORM
+FB59;AL # ARABIC LETTER PEH MEDIAL FORM
+FB5A;AL # ARABIC LETTER BEHEH ISOLATED FORM
+FB5B;AL # ARABIC LETTER BEHEH FINAL FORM
+FB5C;AL # ARABIC LETTER BEHEH INITIAL FORM
+FB5D;AL # ARABIC LETTER BEHEH MEDIAL FORM
+FB5E;AL # ARABIC LETTER TTEHEH ISOLATED FORM
+FB5F;AL # ARABIC LETTER TTEHEH FINAL FORM
+FB60;AL # ARABIC LETTER TTEHEH INITIAL FORM
+FB61;AL # ARABIC LETTER TTEHEH MEDIAL FORM
+FB62;AL # ARABIC LETTER TEHEH ISOLATED FORM
+FB63;AL # ARABIC LETTER TEHEH FINAL FORM
+FB64;AL # ARABIC LETTER TEHEH INITIAL FORM
+FB65;AL # ARABIC LETTER TEHEH MEDIAL FORM
+FB66;AL # ARABIC LETTER TTEH ISOLATED FORM
+FB67;AL # ARABIC LETTER TTEH FINAL FORM
+FB68;AL # ARABIC LETTER TTEH INITIAL FORM
+FB69;AL # ARABIC LETTER TTEH MEDIAL FORM
+FB6A;AL # ARABIC LETTER VEH ISOLATED FORM
+FB6B;AL # ARABIC LETTER VEH FINAL FORM
+FB6C;AL # ARABIC LETTER VEH INITIAL FORM
+FB6D;AL # ARABIC LETTER VEH MEDIAL FORM
+FB6E;AL # ARABIC LETTER PEHEH ISOLATED FORM
+FB6F;AL # ARABIC LETTER PEHEH FINAL FORM
+FB70;AL # ARABIC LETTER PEHEH INITIAL FORM
+FB71;AL # ARABIC LETTER PEHEH MEDIAL FORM
+FB72;AL # ARABIC LETTER DYEH ISOLATED FORM
+FB73;AL # ARABIC LETTER DYEH FINAL FORM
+FB74;AL # ARABIC LETTER DYEH INITIAL FORM
+FB75;AL # ARABIC LETTER DYEH MEDIAL FORM
+FB76;AL # ARABIC LETTER NYEH ISOLATED FORM
+FB77;AL # ARABIC LETTER NYEH FINAL FORM
+FB78;AL # ARABIC LETTER NYEH INITIAL FORM
+FB79;AL # ARABIC LETTER NYEH MEDIAL FORM
+FB7A;AL # ARABIC LETTER TCHEH ISOLATED FORM
+FB7B;AL # ARABIC LETTER TCHEH FINAL FORM
+FB7C;AL # ARABIC LETTER TCHEH INITIAL FORM
+FB7D;AL # ARABIC LETTER TCHEH MEDIAL FORM
+FB7E;AL # ARABIC LETTER TCHEHEH ISOLATED FORM
+FB7F;AL # ARABIC LETTER TCHEHEH FINAL FORM
+FB80;AL # ARABIC LETTER TCHEHEH INITIAL FORM
+FB81;AL # ARABIC LETTER TCHEHEH MEDIAL FORM
+FB82;AL # ARABIC LETTER DDAHAL ISOLATED FORM
+FB83;AL # ARABIC LETTER DDAHAL FINAL FORM
+FB84;AL # ARABIC LETTER DAHAL ISOLATED FORM
+FB85;AL # ARABIC LETTER DAHAL FINAL FORM
+FB86;AL # ARABIC LETTER DUL ISOLATED FORM
+FB87;AL # ARABIC LETTER DUL FINAL FORM
+FB88;AL # ARABIC LETTER DDAL ISOLATED FORM
+FB89;AL # ARABIC LETTER DDAL FINAL FORM
+FB8A;AL # ARABIC LETTER JEH ISOLATED FORM
+FB8B;AL # ARABIC LETTER JEH FINAL FORM
+FB8C;AL # ARABIC LETTER RREH ISOLATED FORM
+FB8D;AL # ARABIC LETTER RREH FINAL FORM
+FB8E;AL # ARABIC LETTER KEHEH ISOLATED FORM
+FB8F;AL # ARABIC LETTER KEHEH FINAL FORM
+FB90;AL # ARABIC LETTER KEHEH INITIAL FORM
+FB91;AL # ARABIC LETTER KEHEH MEDIAL FORM
+FB92;AL # ARABIC LETTER GAF ISOLATED FORM
+FB93;AL # ARABIC LETTER GAF FINAL FORM
+FB94;AL # ARABIC LETTER GAF INITIAL FORM
+FB95;AL # ARABIC LETTER GAF MEDIAL FORM
+FB96;AL # ARABIC LETTER GUEH ISOLATED FORM
+FB97;AL # ARABIC LETTER GUEH FINAL FORM
+FB98;AL # ARABIC LETTER GUEH INITIAL FORM
+FB99;AL # ARABIC LETTER GUEH MEDIAL FORM
+FB9A;AL # ARABIC LETTER NGOEH ISOLATED FORM
+FB9B;AL # ARABIC LETTER NGOEH FINAL FORM
+FB9C;AL # ARABIC LETTER NGOEH INITIAL FORM
+FB9D;AL # ARABIC LETTER NGOEH MEDIAL FORM
+FB9E;AL # ARABIC LETTER NOON GHUNNA ISOLATED FORM
+FB9F;AL # ARABIC LETTER NOON GHUNNA FINAL FORM
+FBA0;AL # ARABIC LETTER RNOON ISOLATED FORM
+FBA1;AL # ARABIC LETTER RNOON FINAL FORM
+FBA2;AL # ARABIC LETTER RNOON INITIAL FORM
+FBA3;AL # ARABIC LETTER RNOON MEDIAL FORM
+FBA4;AL # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+FBA5;AL # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+FBA6;AL # ARABIC LETTER HEH GOAL ISOLATED FORM
+FBA7;AL # ARABIC LETTER HEH GOAL FINAL FORM
+FBA8;AL # ARABIC LETTER HEH GOAL INITIAL FORM
+FBA9;AL # ARABIC LETTER HEH GOAL MEDIAL FORM
+FBAA;AL # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+FBAB;AL # ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+FBAC;AL # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+FBAD;AL # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+FBAE;AL # ARABIC LETTER YEH BARREE ISOLATED FORM
+FBAF;AL # ARABIC LETTER YEH BARREE FINAL FORM
+FBB0;AL # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+FBB1;AL # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3;AL # ARABIC LETTER NG ISOLATED FORM
+FBD4;AL # ARABIC LETTER NG FINAL FORM
+FBD5;AL # ARABIC LETTER NG INITIAL FORM
+FBD6;AL # ARABIC LETTER NG MEDIAL FORM
+FBD7;AL # ARABIC LETTER U ISOLATED FORM
+FBD8;AL # ARABIC LETTER U FINAL FORM
+FBD9;AL # ARABIC LETTER OE ISOLATED FORM
+FBDA;AL # ARABIC LETTER OE FINAL FORM
+FBDB;AL # ARABIC LETTER YU ISOLATED FORM
+FBDC;AL # ARABIC LETTER YU FINAL FORM
+FBDD;AL # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+FBDE;AL # ARABIC LETTER VE ISOLATED FORM
+FBDF;AL # ARABIC LETTER VE FINAL FORM
+FBE0;AL # ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+FBE1;AL # ARABIC LETTER KIRGHIZ OE FINAL FORM
+FBE2;AL # ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+FBE3;AL # ARABIC LETTER KIRGHIZ YU FINAL FORM
+FBE4;AL # ARABIC LETTER E ISOLATED FORM
+FBE5;AL # ARABIC LETTER E FINAL FORM
+FBE6;AL # ARABIC LETTER E INITIAL FORM
+FBE7;AL # ARABIC LETTER E MEDIAL FORM
+FBE8;AL # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+FBE9;AL # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+FBEA;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+FBEB;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+FBEC;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+FBED;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+FBEE;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+FBEF;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+FBF0;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+FBF1;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+FBF2;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+FBF3;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+FBF4;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+FBF5;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+FBF6;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+FBF7;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+FBF8;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+FBF9;AL # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FBFA;AL # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FBFB;AL # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+FBFC;AL # ARABIC LETTER FARSI YEH ISOLATED FORM
+FBFD;AL # ARABIC LETTER FARSI YEH FINAL FORM
+FBFE;AL # ARABIC LETTER FARSI YEH INITIAL FORM
+FBFF;AL # ARABIC LETTER FARSI YEH MEDIAL FORM
+FC00;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+FC01;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+FC02;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+FC03;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FC04;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+FC05;AL # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+FC06;AL # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+FC07;AL # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+FC08;AL # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+FC09;AL # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+FC0A;AL # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+FC0B;AL # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+FC0C;AL # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+FC0D;AL # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+FC0E;AL # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+FC0F;AL # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+FC10;AL # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+FC11;AL # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+FC12;AL # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+FC13;AL # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+FC14;AL # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+FC15;AL # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+FC16;AL # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+FC17;AL # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+FC18;AL # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+FC19;AL # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+FC1A;AL # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+FC1B;AL # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+FC1C;AL # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+FC1D;AL # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+FC1E;AL # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+FC1F;AL # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+FC20;AL # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+FC21;AL # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+FC22;AL # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+FC23;AL # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+FC24;AL # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+FC25;AL # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+FC26;AL # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+FC27;AL # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+FC28;AL # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+FC29;AL # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+FC2A;AL # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+FC2B;AL # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+FC2C;AL # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+FC2D;AL # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+FC2E;AL # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+FC2F;AL # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+FC30;AL # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+FC31;AL # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+FC32;AL # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+FC33;AL # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+FC34;AL # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+FC35;AL # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+FC36;AL # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+FC37;AL # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+FC38;AL # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+FC39;AL # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+FC3A;AL # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+FC3B;AL # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+FC3C;AL # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+FC3D;AL # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+FC3E;AL # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+FC3F;AL # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+FC40;AL # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+FC41;AL # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+FC42;AL # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+FC43;AL # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+FC44;AL # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+FC45;AL # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+FC46;AL # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+FC47;AL # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+FC48;AL # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+FC49;AL # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+FC4A;AL # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+FC4B;AL # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+FC4C;AL # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+FC4D;AL # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+FC4E;AL # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+FC4F;AL # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+FC50;AL # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+FC51;AL # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+FC52;AL # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+FC53;AL # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+FC54;AL # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+FC55;AL # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+FC56;AL # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+FC57;AL # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+FC58;AL # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+FC59;AL # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+FC5A;AL # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+FC5B;AL # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5C;AL # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5D;AL # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5E;AL # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+FC5F;AL # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+FC60;AL # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+FC61;AL # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+FC62;AL # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+FC63;AL # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC64;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+FC65;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+FC66;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+FC67;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+FC68;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FC69;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+FC6A;AL # ARABIC LIGATURE BEH WITH REH FINAL FORM
+FC6B;AL # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+FC6C;AL # ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+FC6D;AL # ARABIC LIGATURE BEH WITH NOON FINAL FORM
+FC6E;AL # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+FC6F;AL # ARABIC LIGATURE BEH WITH YEH FINAL FORM
+FC70;AL # ARABIC LIGATURE TEH WITH REH FINAL FORM
+FC71;AL # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+FC72;AL # ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+FC73;AL # ARABIC LIGATURE TEH WITH NOON FINAL FORM
+FC74;AL # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+FC75;AL # ARABIC LIGATURE TEH WITH YEH FINAL FORM
+FC76;AL # ARABIC LIGATURE THEH WITH REH FINAL FORM
+FC77;AL # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+FC78;AL # ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+FC79;AL # ARABIC LIGATURE THEH WITH NOON FINAL FORM
+FC7A;AL # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+FC7B;AL # ARABIC LIGATURE THEH WITH YEH FINAL FORM
+FC7C;AL # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+FC7D;AL # ARABIC LIGATURE FEH WITH YEH FINAL FORM
+FC7E;AL # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+FC7F;AL # ARABIC LIGATURE QAF WITH YEH FINAL FORM
+FC80;AL # ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+FC81;AL # ARABIC LIGATURE KAF WITH LAM FINAL FORM
+FC82;AL # ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+FC83;AL # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+FC84;AL # ARABIC LIGATURE KAF WITH YEH FINAL FORM
+FC85;AL # ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+FC86;AL # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+FC87;AL # ARABIC LIGATURE LAM WITH YEH FINAL FORM
+FC88;AL # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+FC89;AL # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+FC8A;AL # ARABIC LIGATURE NOON WITH REH FINAL FORM
+FC8B;AL # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+FC8C;AL # ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+FC8D;AL # ARABIC LIGATURE NOON WITH NOON FINAL FORM
+FC8E;AL # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+FC8F;AL # ARABIC LIGATURE NOON WITH YEH FINAL FORM
+FC90;AL # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+FC91;AL # ARABIC LIGATURE YEH WITH REH FINAL FORM
+FC92;AL # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+FC93;AL # ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+FC94;AL # ARABIC LIGATURE YEH WITH NOON FINAL FORM
+FC95;AL # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+FC96;AL # ARABIC LIGATURE YEH WITH YEH FINAL FORM
+FC97;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+FC98;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+FC99;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+FC9A;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+FC9B;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+FC9C;AL # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+FC9D;AL # ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+FC9E;AL # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+FC9F;AL # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+FCA0;AL # ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+FCA1;AL # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+FCA2;AL # ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+FCA3;AL # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+FCA4;AL # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+FCA5;AL # ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+FCA6;AL # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+FCA7;AL # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+FCA8;AL # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+FCA9;AL # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+FCAA;AL # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+FCAB;AL # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+FCAC;AL # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+FCAD;AL # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+FCAE;AL # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+FCAF;AL # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+FCB0;AL # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+FCB1;AL # ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+FCB2;AL # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+FCB3;AL # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+FCB4;AL # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+FCB5;AL # ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+FCB6;AL # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+FCB7;AL # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+FCB8;AL # ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+FCB9;AL # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+FCBA;AL # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+FCBB;AL # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+FCBC;AL # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+FCBD;AL # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+FCBE;AL # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+FCBF;AL # ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+FCC0;AL # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+FCC1;AL # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+FCC2;AL # ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+FCC3;AL # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+FCC4;AL # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+FCC5;AL # ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+FCC6;AL # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+FCC7;AL # ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+FCC8;AL # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+FCC9;AL # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+FCCA;AL # ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+FCCB;AL # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+FCCC;AL # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+FCCD;AL # ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+FCCE;AL # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+FCCF;AL # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+FCD0;AL # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+FCD1;AL # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+FCD2;AL # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+FCD3;AL # ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+FCD4;AL # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+FCD5;AL # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+FCD6;AL # ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+FCD7;AL # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+FCD8;AL # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+FCD9;AL # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+FCDA;AL # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+FCDB;AL # ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+FCDC;AL # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+FCDD;AL # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+FCDE;AL # ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+FCDF;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+FCE0;AL # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+FCE1;AL # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+FCE2;AL # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+FCE3;AL # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+FCE4;AL # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+FCE5;AL # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+FCE6;AL # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+FCE7;AL # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+FCE8;AL # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+FCE9;AL # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+FCEA;AL # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+FCEB;AL # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+FCEC;AL # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+FCED;AL # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+FCEE;AL # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+FCEF;AL # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+FCF0;AL # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+FCF1;AL # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+FCF2;AL # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+FCF3;AL # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+FCF4;AL # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+FCF5;AL # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+FCF6;AL # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+FCF7;AL # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+FCF8;AL # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+FCF9;AL # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+FCFA;AL # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+FCFB;AL # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFC;AL # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+FCFD;AL # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFE;AL # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+FCFF;AL # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+FD00;AL # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+FD01;AL # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+FD02;AL # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+FD03;AL # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+FD04;AL # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+FD05;AL # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+FD06;AL # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+FD07;AL # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+FD08;AL # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+FD09;AL # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+FD0A;AL # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+FD0B;AL # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+FD0C;AL # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+FD0D;AL # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+FD0E;AL # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+FD0F;AL # ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+FD10;AL # ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+FD11;AL # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+FD12;AL # ARABIC LIGATURE TAH WITH YEH FINAL FORM
+FD13;AL # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+FD14;AL # ARABIC LIGATURE AIN WITH YEH FINAL FORM
+FD15;AL # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+FD16;AL # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+FD17;AL # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+FD18;AL # ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+FD19;AL # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+FD1A;AL # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+FD1B;AL # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+FD1C;AL # ARABIC LIGATURE HAH WITH YEH FINAL FORM
+FD1D;AL # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+FD1E;AL # ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+FD1F;AL # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+FD20;AL # ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+FD21;AL # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+FD22;AL # ARABIC LIGATURE SAD WITH YEH FINAL FORM
+FD23;AL # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+FD24;AL # ARABIC LIGATURE DAD WITH YEH FINAL FORM
+FD25;AL # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+FD26;AL # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+FD27;AL # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+FD28;AL # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+FD29;AL # ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+FD2A;AL # ARABIC LIGATURE SEEN WITH REH FINAL FORM
+FD2B;AL # ARABIC LIGATURE SAD WITH REH FINAL FORM
+FD2C;AL # ARABIC LIGATURE DAD WITH REH FINAL FORM
+FD2D;AL # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+FD2E;AL # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+FD2F;AL # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+FD30;AL # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+FD31;AL # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+FD32;AL # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+FD33;AL # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+FD34;AL # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+FD35;AL # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+FD36;AL # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+FD37;AL # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+FD38;AL # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+FD39;AL # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+FD3A;AL # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+FD3B;AL # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+FD3C;AL # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+FD3D;AL # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD3E;OP # ORNATE LEFT PARENTHESIS
+FD3F;CL # ORNATE RIGHT PARENTHESIS
+FD50;AL # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+FD51;AL # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+FD52;AL # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+FD53;AL # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+FD54;AL # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+FD55;AL # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+FD56;AL # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+FD57;AL # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+FD58;AL # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+FD59;AL # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+FD5A;AL # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+FD5B;AL # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD5C;AL # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+FD5D;AL # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+FD5E;AL # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD5F;AL # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+FD60;AL # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+FD61;AL # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+FD62;AL # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+FD63;AL # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+FD64;AL # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+FD65;AL # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+FD66;AL # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+FD67;AL # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+FD68;AL # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+FD69;AL # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+FD6A;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+FD6B;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+FD6C;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+FD6D;AL # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+FD6E;AL # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD6F;AL # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+FD70;AL # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+FD71;AL # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+FD72;AL # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+FD73;AL # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+FD74;AL # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+FD75;AL # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+FD76;AL # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+FD77;AL # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+FD78;AL # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD79;AL # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+FD7A;AL # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+FD7B;AL # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD7C;AL # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+FD7D;AL # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+FD7E;AL # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+FD7F;AL # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+FD80;AL # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+FD81;AL # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+FD82;AL # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD83;AL # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+FD84;AL # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+FD85;AL # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+FD86;AL # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+FD87;AL # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+FD88;AL # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+FD89;AL # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+FD8A;AL # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+FD8B;AL # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+FD8C;AL # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+FD8D;AL # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+FD8E;AL # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+FD8F;AL # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92;AL # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+FD93;AL # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+FD94;AL # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+FD95;AL # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+FD96;AL # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD97;AL # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+FD98;AL # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+FD99;AL # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD9A;AL # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+FD9B;AL # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD9C;AL # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+FD9D;AL # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+FD9E;AL # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+FD9F;AL # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+FDA0;AL # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FDA1;AL # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+FDA2;AL # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA3;AL # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+FDA4;AL # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA5;AL # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+FDA6;AL # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FDA7;AL # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA8;AL # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA9;AL # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+FDAA;AL # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+FDAB;AL # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+FDAC;AL # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+FDAD;AL # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+FDAE;AL # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+FDAF;AL # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+FDB0;AL # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+FDB1;AL # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+FDB2;AL # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+FDB3;AL # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+FDB4;AL # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+FDB5;AL # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+FDB6;AL # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+FDB7;AL # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+FDB8;AL # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+FDB9;AL # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+FDBA;AL # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+FDBB;AL # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+FDBC;AL # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+FDBD;AL # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+FDBE;AL # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+FDBF;AL # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+FDC0;AL # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+FDC1;AL # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+FDC2;AL # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+FDC3;AL # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+FDC4;AL # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+FDC5;AL # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+FDC6;AL # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+FDC7;AL # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0;AL # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF1;AL # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF2;AL # ARABIC LIGATURE ALLAH ISOLATED FORM
+FDF3;AL # ARABIC LIGATURE AKBAR ISOLATED FORM
+FDF4;AL # ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+FDF5;AL # ARABIC LIGATURE SALAM ISOLATED FORM
+FDF6;AL # ARABIC LIGATURE RASOUL ISOLATED FORM
+FDF7;AL # ARABIC LIGATURE ALAYHE ISOLATED FORM
+FDF8;AL # ARABIC LIGATURE WASALLAM ISOLATED FORM
+FDF9;AL # ARABIC LIGATURE SALLA ISOLATED FORM
+FDFA;AL # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+FDFB;AL # ARABIC LIGATURE JALLAJALALOUHOU
+FDFC;PO # RIAL SIGN
+FDFD;AL # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE00;CM # VARIATION SELECTOR-1
+FE01;CM # VARIATION SELECTOR-2
+FE02;CM # VARIATION SELECTOR-3
+FE03;CM # VARIATION SELECTOR-4
+FE04;CM # VARIATION SELECTOR-5
+FE05;CM # VARIATION SELECTOR-6
+FE06;CM # VARIATION SELECTOR-7
+FE07;CM # VARIATION SELECTOR-8
+FE08;CM # VARIATION SELECTOR-9
+FE09;CM # VARIATION SELECTOR-10
+FE0A;CM # VARIATION SELECTOR-11
+FE0B;CM # VARIATION SELECTOR-12
+FE0C;CM # VARIATION SELECTOR-13
+FE0D;CM # VARIATION SELECTOR-14
+FE0E;CM # VARIATION SELECTOR-15
+FE0F;CM # VARIATION SELECTOR-16
+FE10;IS # PRESENTATION FORM FOR VERTICAL COMMA
+FE11;CL # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
+FE12;CL # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP
+FE13;IS # PRESENTATION FORM FOR VERTICAL COLON
+FE14;IS # PRESENTATION FORM FOR VERTICAL SEMICOLON
+FE15;EX # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
+FE16;EX # PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17;OP # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18;CL # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19;IN # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE20;CM # COMBINING LIGATURE LEFT HALF
+FE21;CM # COMBINING LIGATURE RIGHT HALF
+FE22;CM # COMBINING DOUBLE TILDE LEFT HALF
+FE23;CM # COMBINING DOUBLE TILDE RIGHT HALF
+FE30;ID # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31;ID # PRESENTATION FORM FOR VERTICAL EM DASH
+FE32;ID # PRESENTATION FORM FOR VERTICAL EN DASH
+FE33;ID # PRESENTATION FORM FOR VERTICAL LOW LINE
+FE34;ID # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35;OP # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36;CL # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37;OP # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38;CL # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39;OP # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A;CL # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B;OP # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C;CL # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D;OP # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E;CL # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F;OP # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40;CL # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41;OP # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42;CL # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43;OP # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44;CL # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45;ID # SESAME DOT
+FE46;ID # WHITE SESAME DOT
+FE47;OP # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48;CL # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49;ID # DASHED OVERLINE
+FE4A;ID # CENTRELINE OVERLINE
+FE4B;ID # WAVY OVERLINE
+FE4C;ID # DOUBLE WAVY OVERLINE
+FE4D;ID # DASHED LOW LINE
+FE4E;ID # CENTRELINE LOW LINE
+FE4F;ID # WAVY LOW LINE
+FE50;CL # SMALL COMMA
+FE51;ID # SMALL IDEOGRAPHIC COMMA
+FE52;CL # SMALL FULL STOP
+FE54;NS # SMALL SEMICOLON
+FE55;NS # SMALL COLON
+FE56;EX # SMALL QUESTION MARK
+FE57;EX # SMALL EXCLAMATION MARK
+FE58;ID # SMALL EM DASH
+FE59;OP # SMALL LEFT PARENTHESIS
+FE5A;CL # SMALL RIGHT PARENTHESIS
+FE5B;OP # SMALL LEFT CURLY BRACKET
+FE5C;CL # SMALL RIGHT CURLY BRACKET
+FE5D;OP # SMALL LEFT TORTOISE SHELL BRACKET
+FE5E;CL # SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F;ID # SMALL NUMBER SIGN
+FE60;ID # SMALL AMPERSAND
+FE61;ID # SMALL ASTERISK
+FE62;ID # SMALL PLUS SIGN
+FE63;ID # SMALL HYPHEN-MINUS
+FE64;ID # SMALL LESS-THAN SIGN
+FE65;ID # SMALL GREATER-THAN SIGN
+FE66;ID # SMALL EQUALS SIGN
+FE68;ID # SMALL REVERSE SOLIDUS
+FE69;PR # SMALL DOLLAR SIGN
+FE6A;PO # SMALL PERCENT SIGN
+FE6B;ID # SMALL COMMERCIAL AT
+FE70;AL # ARABIC FATHATAN ISOLATED FORM
+FE71;AL # ARABIC TATWEEL WITH FATHATAN ABOVE
+FE72;AL # ARABIC DAMMATAN ISOLATED FORM
+FE73;AL # ARABIC TAIL FRAGMENT
+FE74;AL # ARABIC KASRATAN ISOLATED FORM
+FE76;AL # ARABIC FATHA ISOLATED FORM
+FE77;AL # ARABIC FATHA MEDIAL FORM
+FE78;AL # ARABIC DAMMA ISOLATED FORM
+FE79;AL # ARABIC DAMMA MEDIAL FORM
+FE7A;AL # ARABIC KASRA ISOLATED FORM
+FE7B;AL # ARABIC KASRA MEDIAL FORM
+FE7C;AL # ARABIC SHADDA ISOLATED FORM
+FE7D;AL # ARABIC SHADDA MEDIAL FORM
+FE7E;AL # ARABIC SUKUN ISOLATED FORM
+FE7F;AL # ARABIC SUKUN MEDIAL FORM
+FE80;AL # ARABIC LETTER HAMZA ISOLATED FORM
+FE81;AL # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+FE82;AL # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+FE83;AL # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+FE84;AL # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+FE85;AL # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+FE86;AL # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+FE87;AL # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+FE88;AL # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+FE89;AL # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+FE8A;AL # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+FE8B;AL # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+FE8C;AL # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+FE8D;AL # ARABIC LETTER ALEF ISOLATED FORM
+FE8E;AL # ARABIC LETTER ALEF FINAL FORM
+FE8F;AL # ARABIC LETTER BEH ISOLATED FORM
+FE90;AL # ARABIC LETTER BEH FINAL FORM
+FE91;AL # ARABIC LETTER BEH INITIAL FORM
+FE92;AL # ARABIC LETTER BEH MEDIAL FORM
+FE93;AL # ARABIC LETTER TEH MARBUTA ISOLATED FORM
+FE94;AL # ARABIC LETTER TEH MARBUTA FINAL FORM
+FE95;AL # ARABIC LETTER TEH ISOLATED FORM
+FE96;AL # ARABIC LETTER TEH FINAL FORM
+FE97;AL # ARABIC LETTER TEH INITIAL FORM
+FE98;AL # ARABIC LETTER TEH MEDIAL FORM
+FE99;AL # ARABIC LETTER THEH ISOLATED FORM
+FE9A;AL # ARABIC LETTER THEH FINAL FORM
+FE9B;AL # ARABIC LETTER THEH INITIAL FORM
+FE9C;AL # ARABIC LETTER THEH MEDIAL FORM
+FE9D;AL # ARABIC LETTER JEEM ISOLATED FORM
+FE9E;AL # ARABIC LETTER JEEM FINAL FORM
+FE9F;AL # ARABIC LETTER JEEM INITIAL FORM
+FEA0;AL # ARABIC LETTER JEEM MEDIAL FORM
+FEA1;AL # ARABIC LETTER HAH ISOLATED FORM
+FEA2;AL # ARABIC LETTER HAH FINAL FORM
+FEA3;AL # ARABIC LETTER HAH INITIAL FORM
+FEA4;AL # ARABIC LETTER HAH MEDIAL FORM
+FEA5;AL # ARABIC LETTER KHAH ISOLATED FORM
+FEA6;AL # ARABIC LETTER KHAH FINAL FORM
+FEA7;AL # ARABIC LETTER KHAH INITIAL FORM
+FEA8;AL # ARABIC LETTER KHAH MEDIAL FORM
+FEA9;AL # ARABIC LETTER DAL ISOLATED FORM
+FEAA;AL # ARABIC LETTER DAL FINAL FORM
+FEAB;AL # ARABIC LETTER THAL ISOLATED FORM
+FEAC;AL # ARABIC LETTER THAL FINAL FORM
+FEAD;AL # ARABIC LETTER REH ISOLATED FORM
+FEAE;AL # ARABIC LETTER REH FINAL FORM
+FEAF;AL # ARABIC LETTER ZAIN ISOLATED FORM
+FEB0;AL # ARABIC LETTER ZAIN FINAL FORM
+FEB1;AL # ARABIC LETTER SEEN ISOLATED FORM
+FEB2;AL # ARABIC LETTER SEEN FINAL FORM
+FEB3;AL # ARABIC LETTER SEEN INITIAL FORM
+FEB4;AL # ARABIC LETTER SEEN MEDIAL FORM
+FEB5;AL # ARABIC LETTER SHEEN ISOLATED FORM
+FEB6;AL # ARABIC LETTER SHEEN FINAL FORM
+FEB7;AL # ARABIC LETTER SHEEN INITIAL FORM
+FEB8;AL # ARABIC LETTER SHEEN MEDIAL FORM
+FEB9;AL # ARABIC LETTER SAD ISOLATED FORM
+FEBA;AL # ARABIC LETTER SAD FINAL FORM
+FEBB;AL # ARABIC LETTER SAD INITIAL FORM
+FEBC;AL # ARABIC LETTER SAD MEDIAL FORM
+FEBD;AL # ARABIC LETTER DAD ISOLATED FORM
+FEBE;AL # ARABIC LETTER DAD FINAL FORM
+FEBF;AL # ARABIC LETTER DAD INITIAL FORM
+FEC0;AL # ARABIC LETTER DAD MEDIAL FORM
+FEC1;AL # ARABIC LETTER TAH ISOLATED FORM
+FEC2;AL # ARABIC LETTER TAH FINAL FORM
+FEC3;AL # ARABIC LETTER TAH INITIAL FORM
+FEC4;AL # ARABIC LETTER TAH MEDIAL FORM
+FEC5;AL # ARABIC LETTER ZAH ISOLATED FORM
+FEC6;AL # ARABIC LETTER ZAH FINAL FORM
+FEC7;AL # ARABIC LETTER ZAH INITIAL FORM
+FEC8;AL # ARABIC LETTER ZAH MEDIAL FORM
+FEC9;AL # ARABIC LETTER AIN ISOLATED FORM
+FECA;AL # ARABIC LETTER AIN FINAL FORM
+FECB;AL # ARABIC LETTER AIN INITIAL FORM
+FECC;AL # ARABIC LETTER AIN MEDIAL FORM
+FECD;AL # ARABIC LETTER GHAIN ISOLATED FORM
+FECE;AL # ARABIC LETTER GHAIN FINAL FORM
+FECF;AL # ARABIC LETTER GHAIN INITIAL FORM
+FED0;AL # ARABIC LETTER GHAIN MEDIAL FORM
+FED1;AL # ARABIC LETTER FEH ISOLATED FORM
+FED2;AL # ARABIC LETTER FEH FINAL FORM
+FED3;AL # ARABIC LETTER FEH INITIAL FORM
+FED4;AL # ARABIC LETTER FEH MEDIAL FORM
+FED5;AL # ARABIC LETTER QAF ISOLATED FORM
+FED6;AL # ARABIC LETTER QAF FINAL FORM
+FED7;AL # ARABIC LETTER QAF INITIAL FORM
+FED8;AL # ARABIC LETTER QAF MEDIAL FORM
+FED9;AL # ARABIC LETTER KAF ISOLATED FORM
+FEDA;AL # ARABIC LETTER KAF FINAL FORM
+FEDB;AL # ARABIC LETTER KAF INITIAL FORM
+FEDC;AL # ARABIC LETTER KAF MEDIAL FORM
+FEDD;AL # ARABIC LETTER LAM ISOLATED FORM
+FEDE;AL # ARABIC LETTER LAM FINAL FORM
+FEDF;AL # ARABIC LETTER LAM INITIAL FORM
+FEE0;AL # ARABIC LETTER LAM MEDIAL FORM
+FEE1;AL # ARABIC LETTER MEEM ISOLATED FORM
+FEE2;AL # ARABIC LETTER MEEM FINAL FORM
+FEE3;AL # ARABIC LETTER MEEM INITIAL FORM
+FEE4;AL # ARABIC LETTER MEEM MEDIAL FORM
+FEE5;AL # ARABIC LETTER NOON ISOLATED FORM
+FEE6;AL # ARABIC LETTER NOON FINAL FORM
+FEE7;AL # ARABIC LETTER NOON INITIAL FORM
+FEE8;AL # ARABIC LETTER NOON MEDIAL FORM
+FEE9;AL # ARABIC LETTER HEH ISOLATED FORM
+FEEA;AL # ARABIC LETTER HEH FINAL FORM
+FEEB;AL # ARABIC LETTER HEH INITIAL FORM
+FEEC;AL # ARABIC LETTER HEH MEDIAL FORM
+FEED;AL # ARABIC LETTER WAW ISOLATED FORM
+FEEE;AL # ARABIC LETTER WAW FINAL FORM
+FEEF;AL # ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+FEF0;AL # ARABIC LETTER ALEF MAKSURA FINAL FORM
+FEF1;AL # ARABIC LETTER YEH ISOLATED FORM
+FEF2;AL # ARABIC LETTER YEH FINAL FORM
+FEF3;AL # ARABIC LETTER YEH INITIAL FORM
+FEF4;AL # ARABIC LETTER YEH MEDIAL FORM
+FEF5;AL # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+FEF6;AL # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+FEF7;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+FEF8;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+FEF9;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+FEFA;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+FEFB;AL # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+FEFC;AL # ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFF;WJ # ZERO WIDTH NO-BREAK SPACE
+FF01;EX # FULLWIDTH EXCLAMATION MARK
+FF02;ID # FULLWIDTH QUOTATION MARK
+FF03;ID # FULLWIDTH NUMBER SIGN
+FF04;PR # FULLWIDTH DOLLAR SIGN
+FF05;PO # FULLWIDTH PERCENT SIGN
+FF06;ID # FULLWIDTH AMPERSAND
+FF07;ID # FULLWIDTH APOSTROPHE
+FF08;OP # FULLWIDTH LEFT PARENTHESIS
+FF09;CL # FULLWIDTH RIGHT PARENTHESIS
+FF0A;ID # FULLWIDTH ASTERISK
+FF0B;ID # FULLWIDTH PLUS SIGN
+FF0C;CL # FULLWIDTH COMMA
+FF0D;ID # FULLWIDTH HYPHEN-MINUS
+FF0E;CL # FULLWIDTH FULL STOP
+FF0F;ID # FULLWIDTH SOLIDUS
+FF10;ID # FULLWIDTH DIGIT ZERO
+FF11;ID # FULLWIDTH DIGIT ONE
+FF12;ID # FULLWIDTH DIGIT TWO
+FF13;ID # FULLWIDTH DIGIT THREE
+FF14;ID # FULLWIDTH DIGIT FOUR
+FF15;ID # FULLWIDTH DIGIT FIVE
+FF16;ID # FULLWIDTH DIGIT SIX
+FF17;ID # FULLWIDTH DIGIT SEVEN
+FF18;ID # FULLWIDTH DIGIT EIGHT
+FF19;ID # FULLWIDTH DIGIT NINE
+FF1A;NS # FULLWIDTH COLON
+FF1B;NS # FULLWIDTH SEMICOLON
+FF1C;ID # FULLWIDTH LESS-THAN SIGN
+FF1D;ID # FULLWIDTH EQUALS SIGN
+FF1E;ID # FULLWIDTH GREATER-THAN SIGN
+FF1F;EX # FULLWIDTH QUESTION MARK
+FF20;ID # FULLWIDTH COMMERCIAL AT
+FF21;ID # FULLWIDTH LATIN CAPITAL LETTER A
+FF22;ID # FULLWIDTH LATIN CAPITAL LETTER B
+FF23;ID # FULLWIDTH LATIN CAPITAL LETTER C
+FF24;ID # FULLWIDTH LATIN CAPITAL LETTER D
+FF25;ID # FULLWIDTH LATIN CAPITAL LETTER E
+FF26;ID # FULLWIDTH LATIN CAPITAL LETTER F
+FF27;ID # FULLWIDTH LATIN CAPITAL LETTER G
+FF28;ID # FULLWIDTH LATIN CAPITAL LETTER H
+FF29;ID # FULLWIDTH LATIN CAPITAL LETTER I
+FF2A;ID # FULLWIDTH LATIN CAPITAL LETTER J
+FF2B;ID # FULLWIDTH LATIN CAPITAL LETTER K
+FF2C;ID # FULLWIDTH LATIN CAPITAL LETTER L
+FF2D;ID # FULLWIDTH LATIN CAPITAL LETTER M
+FF2E;ID # FULLWIDTH LATIN CAPITAL LETTER N
+FF2F;ID # FULLWIDTH LATIN CAPITAL LETTER O
+FF30;ID # FULLWIDTH LATIN CAPITAL LETTER P
+FF31;ID # FULLWIDTH LATIN CAPITAL LETTER Q
+FF32;ID # FULLWIDTH LATIN CAPITAL LETTER R
+FF33;ID # FULLWIDTH LATIN CAPITAL LETTER S
+FF34;ID # FULLWIDTH LATIN CAPITAL LETTER T
+FF35;ID # FULLWIDTH LATIN CAPITAL LETTER U
+FF36;ID # FULLWIDTH LATIN CAPITAL LETTER V
+FF37;ID # FULLWIDTH LATIN CAPITAL LETTER W
+FF38;ID # FULLWIDTH LATIN CAPITAL LETTER X
+FF39;ID # FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A;ID # FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B;OP # FULLWIDTH LEFT SQUARE BRACKET
+FF3C;ID # FULLWIDTH REVERSE SOLIDUS
+FF3D;CL # FULLWIDTH RIGHT SQUARE BRACKET
+FF3E;ID # FULLWIDTH CIRCUMFLEX ACCENT
+FF3F;ID # FULLWIDTH LOW LINE
+FF40;ID # FULLWIDTH GRAVE ACCENT
+FF41;ID # FULLWIDTH LATIN SMALL LETTER A
+FF42;ID # FULLWIDTH LATIN SMALL LETTER B
+FF43;ID # FULLWIDTH LATIN SMALL LETTER C
+FF44;ID # FULLWIDTH LATIN SMALL LETTER D
+FF45;ID # FULLWIDTH LATIN SMALL LETTER E
+FF46;ID # FULLWIDTH LATIN SMALL LETTER F
+FF47;ID # FULLWIDTH LATIN SMALL LETTER G
+FF48;ID # FULLWIDTH LATIN SMALL LETTER H
+FF49;ID # FULLWIDTH LATIN SMALL LETTER I
+FF4A;ID # FULLWIDTH LATIN SMALL LETTER J
+FF4B;ID # FULLWIDTH LATIN SMALL LETTER K
+FF4C;ID # FULLWIDTH LATIN SMALL LETTER L
+FF4D;ID # FULLWIDTH LATIN SMALL LETTER M
+FF4E;ID # FULLWIDTH LATIN SMALL LETTER N
+FF4F;ID # FULLWIDTH LATIN SMALL LETTER O
+FF50;ID # FULLWIDTH LATIN SMALL LETTER P
+FF51;ID # FULLWIDTH LATIN SMALL LETTER Q
+FF52;ID # FULLWIDTH LATIN SMALL LETTER R
+FF53;ID # FULLWIDTH LATIN SMALL LETTER S
+FF54;ID # FULLWIDTH LATIN SMALL LETTER T
+FF55;ID # FULLWIDTH LATIN SMALL LETTER U
+FF56;ID # FULLWIDTH LATIN SMALL LETTER V
+FF57;ID # FULLWIDTH LATIN SMALL LETTER W
+FF58;ID # FULLWIDTH LATIN SMALL LETTER X
+FF59;ID # FULLWIDTH LATIN SMALL LETTER Y
+FF5A;ID # FULLWIDTH LATIN SMALL LETTER Z
+FF5B;OP # FULLWIDTH LEFT CURLY BRACKET
+FF5C;ID # FULLWIDTH VERTICAL LINE
+FF5D;CL # FULLWIDTH RIGHT CURLY BRACKET
+FF5E;ID # FULLWIDTH TILDE
+FF5F;OP # FULLWIDTH LEFT WHITE PARENTHESIS
+FF60;CL # FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61;CL # HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62;OP # HALFWIDTH LEFT CORNER BRACKET
+FF63;CL # HALFWIDTH RIGHT CORNER BRACKET
+FF64;CL # HALFWIDTH IDEOGRAPHIC COMMA
+FF65;NS # HALFWIDTH KATAKANA MIDDLE DOT
+FF66;AL # HALFWIDTH KATAKANA LETTER WO
+FF67;NS # HALFWIDTH KATAKANA LETTER SMALL A
+FF68;NS # HALFWIDTH KATAKANA LETTER SMALL I
+FF69;NS # HALFWIDTH KATAKANA LETTER SMALL U
+FF6A;NS # HALFWIDTH KATAKANA LETTER SMALL E
+FF6B;NS # HALFWIDTH KATAKANA LETTER SMALL O
+FF6C;NS # HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D;NS # HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E;NS # HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F;NS # HALFWIDTH KATAKANA LETTER SMALL TU
+FF70;NS # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71;AL # HALFWIDTH KATAKANA LETTER A
+FF72;AL # HALFWIDTH KATAKANA LETTER I
+FF73;AL # HALFWIDTH KATAKANA LETTER U
+FF74;AL # HALFWIDTH KATAKANA LETTER E
+FF75;AL # HALFWIDTH KATAKANA LETTER O
+FF76;AL # HALFWIDTH KATAKANA LETTER KA
+FF77;AL # HALFWIDTH KATAKANA LETTER KI
+FF78;AL # HALFWIDTH KATAKANA LETTER KU
+FF79;AL # HALFWIDTH KATAKANA LETTER KE
+FF7A;AL # HALFWIDTH KATAKANA LETTER KO
+FF7B;AL # HALFWIDTH KATAKANA LETTER SA
+FF7C;AL # HALFWIDTH KATAKANA LETTER SI
+FF7D;AL # HALFWIDTH KATAKANA LETTER SU
+FF7E;AL # HALFWIDTH KATAKANA LETTER SE
+FF7F;AL # HALFWIDTH KATAKANA LETTER SO
+FF80;AL # HALFWIDTH KATAKANA LETTER TA
+FF81;AL # HALFWIDTH KATAKANA LETTER TI
+FF82;AL # HALFWIDTH KATAKANA LETTER TU
+FF83;AL # HALFWIDTH KATAKANA LETTER TE
+FF84;AL # HALFWIDTH KATAKANA LETTER TO
+FF85;AL # HALFWIDTH KATAKANA LETTER NA
+FF86;AL # HALFWIDTH KATAKANA LETTER NI
+FF87;AL # HALFWIDTH KATAKANA LETTER NU
+FF88;AL # HALFWIDTH KATAKANA LETTER NE
+FF89;AL # HALFWIDTH KATAKANA LETTER NO
+FF8A;AL # HALFWIDTH KATAKANA LETTER HA
+FF8B;AL # HALFWIDTH KATAKANA LETTER HI
+FF8C;AL # HALFWIDTH KATAKANA LETTER HU
+FF8D;AL # HALFWIDTH KATAKANA LETTER HE
+FF8E;AL # HALFWIDTH KATAKANA LETTER HO
+FF8F;AL # HALFWIDTH KATAKANA LETTER MA
+FF90;AL # HALFWIDTH KATAKANA LETTER MI
+FF91;AL # HALFWIDTH KATAKANA LETTER MU
+FF92;AL # HALFWIDTH KATAKANA LETTER ME
+FF93;AL # HALFWIDTH KATAKANA LETTER MO
+FF94;AL # HALFWIDTH KATAKANA LETTER YA
+FF95;AL # HALFWIDTH KATAKANA LETTER YU
+FF96;AL # HALFWIDTH KATAKANA LETTER YO
+FF97;AL # HALFWIDTH KATAKANA LETTER RA
+FF98;AL # HALFWIDTH KATAKANA LETTER RI
+FF99;AL # HALFWIDTH KATAKANA LETTER RU
+FF9A;AL # HALFWIDTH KATAKANA LETTER RE
+FF9B;AL # HALFWIDTH KATAKANA LETTER RO
+FF9C;AL # HALFWIDTH KATAKANA LETTER WA
+FF9D;AL # HALFWIDTH KATAKANA LETTER N
+FF9E;NS # HALFWIDTH KATAKANA VOICED SOUND MARK
+FF9F;NS # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0;AL # HALFWIDTH HANGUL FILLER
+FFA1;AL # HALFWIDTH HANGUL LETTER KIYEOK
+FFA2;AL # HALFWIDTH HANGUL LETTER SSANGKIYEOK
+FFA3;AL # HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+FFA4;AL # HALFWIDTH HANGUL LETTER NIEUN
+FFA5;AL # HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+FFA6;AL # HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+FFA7;AL # HALFWIDTH HANGUL LETTER TIKEUT
+FFA8;AL # HALFWIDTH HANGUL LETTER SSANGTIKEUT
+FFA9;AL # HALFWIDTH HANGUL LETTER RIEUL
+FFAA;AL # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+FFAB;AL # HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+FFAC;AL # HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+FFAD;AL # HALFWIDTH HANGUL LETTER RIEUL-SIOS
+FFAE;AL # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+FFAF;AL # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+FFB0;AL # HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+FFB1;AL # HALFWIDTH HANGUL LETTER MIEUM
+FFB2;AL # HALFWIDTH HANGUL LETTER PIEUP
+FFB3;AL # HALFWIDTH HANGUL LETTER SSANGPIEUP
+FFB4;AL # HALFWIDTH HANGUL LETTER PIEUP-SIOS
+FFB5;AL # HALFWIDTH HANGUL LETTER SIOS
+FFB6;AL # HALFWIDTH HANGUL LETTER SSANGSIOS
+FFB7;AL # HALFWIDTH HANGUL LETTER IEUNG
+FFB8;AL # HALFWIDTH HANGUL LETTER CIEUC
+FFB9;AL # HALFWIDTH HANGUL LETTER SSANGCIEUC
+FFBA;AL # HALFWIDTH HANGUL LETTER CHIEUCH
+FFBB;AL # HALFWIDTH HANGUL LETTER KHIEUKH
+FFBC;AL # HALFWIDTH HANGUL LETTER THIEUTH
+FFBD;AL # HALFWIDTH HANGUL LETTER PHIEUPH
+FFBE;AL # HALFWIDTH HANGUL LETTER HIEUH
+FFC2;AL # HALFWIDTH HANGUL LETTER A
+FFC3;AL # HALFWIDTH HANGUL LETTER AE
+FFC4;AL # HALFWIDTH HANGUL LETTER YA
+FFC5;AL # HALFWIDTH HANGUL LETTER YAE
+FFC6;AL # HALFWIDTH HANGUL LETTER EO
+FFC7;AL # HALFWIDTH HANGUL LETTER E
+FFCA;AL # HALFWIDTH HANGUL LETTER YEO
+FFCB;AL # HALFWIDTH HANGUL LETTER YE
+FFCC;AL # HALFWIDTH HANGUL LETTER O
+FFCD;AL # HALFWIDTH HANGUL LETTER WA
+FFCE;AL # HALFWIDTH HANGUL LETTER WAE
+FFCF;AL # HALFWIDTH HANGUL LETTER OE
+FFD2;AL # HALFWIDTH HANGUL LETTER YO
+FFD3;AL # HALFWIDTH HANGUL LETTER U
+FFD4;AL # HALFWIDTH HANGUL LETTER WEO
+FFD5;AL # HALFWIDTH HANGUL LETTER WE
+FFD6;AL # HALFWIDTH HANGUL LETTER WI
+FFD7;AL # HALFWIDTH HANGUL LETTER YU
+FFDA;AL # HALFWIDTH HANGUL LETTER EU
+FFDB;AL # HALFWIDTH HANGUL LETTER YI
+FFDC;AL # HALFWIDTH HANGUL LETTER I
+FFE0;PO # FULLWIDTH CENT SIGN
+FFE1;PR # FULLWIDTH POUND SIGN
+FFE2;ID # FULLWIDTH NOT SIGN
+FFE3;ID # FULLWIDTH MACRON
+FFE4;ID # FULLWIDTH BROKEN BAR
+FFE5;PR # FULLWIDTH YEN SIGN
+FFE6;PR # FULLWIDTH WON SIGN
+FFE8;AL # HALFWIDTH FORMS LIGHT VERTICAL
+FFE9;AL # HALFWIDTH LEFTWARDS ARROW
+FFEA;AL # HALFWIDTH UPWARDS ARROW
+FFEB;AL # HALFWIDTH RIGHTWARDS ARROW
+FFEC;AL # HALFWIDTH DOWNWARDS ARROW
+FFED;AL # HALFWIDTH BLACK SQUARE
+FFEE;AL # HALFWIDTH WHITE CIRCLE
+FFF9;CM # INTERLINEAR ANNOTATION ANCHOR
+FFFA;CM # INTERLINEAR ANNOTATION SEPARATOR
+FFFB;CM # INTERLINEAR ANNOTATION TERMINATOR
+FFFC;CB # OBJECT REPLACEMENT CHARACTER
+FFFD;AI # REPLACEMENT CHARACTER
+10000;AL # LINEAR B SYLLABLE B008 A
+10001;AL # LINEAR B SYLLABLE B038 E
+10002;AL # LINEAR B SYLLABLE B028 I
+10003;AL # LINEAR B SYLLABLE B061 O
+10004;AL # LINEAR B SYLLABLE B010 U
+10005;AL # LINEAR B SYLLABLE B001 DA
+10006;AL # LINEAR B SYLLABLE B045 DE
+10007;AL # LINEAR B SYLLABLE B007 DI
+10008;AL # LINEAR B SYLLABLE B014 DO
+10009;AL # LINEAR B SYLLABLE B051 DU
+1000A;AL # LINEAR B SYLLABLE B057 JA
+1000B;AL # LINEAR B SYLLABLE B046 JE
+1000D;AL # LINEAR B SYLLABLE B036 JO
+1000E;AL # LINEAR B SYLLABLE B065 JU
+1000F;AL # LINEAR B SYLLABLE B077 KA
+10010;AL # LINEAR B SYLLABLE B044 KE
+10011;AL # LINEAR B SYLLABLE B067 KI
+10012;AL # LINEAR B SYLLABLE B070 KO
+10013;AL # LINEAR B SYLLABLE B081 KU
+10014;AL # LINEAR B SYLLABLE B080 MA
+10015;AL # LINEAR B SYLLABLE B013 ME
+10016;AL # LINEAR B SYLLABLE B073 MI
+10017;AL # LINEAR B SYLLABLE B015 MO
+10018;AL # LINEAR B SYLLABLE B023 MU
+10019;AL # LINEAR B SYLLABLE B006 NA
+1001A;AL # LINEAR B SYLLABLE B024 NE
+1001B;AL # LINEAR B SYLLABLE B030 NI
+1001C;AL # LINEAR B SYLLABLE B052 NO
+1001D;AL # LINEAR B SYLLABLE B055 NU
+1001E;AL # LINEAR B SYLLABLE B003 PA
+1001F;AL # LINEAR B SYLLABLE B072 PE
+10020;AL # LINEAR B SYLLABLE B039 PI
+10021;AL # LINEAR B SYLLABLE B011 PO
+10022;AL # LINEAR B SYLLABLE B050 PU
+10023;AL # LINEAR B SYLLABLE B016 QA
+10024;AL # LINEAR B SYLLABLE B078 QE
+10025;AL # LINEAR B SYLLABLE B021 QI
+10026;AL # LINEAR B SYLLABLE B032 QO
+10028;AL # LINEAR B SYLLABLE B060 RA
+10029;AL # LINEAR B SYLLABLE B027 RE
+1002A;AL # LINEAR B SYLLABLE B053 RI
+1002B;AL # LINEAR B SYLLABLE B002 RO
+1002C;AL # LINEAR B SYLLABLE B026 RU
+1002D;AL # LINEAR B SYLLABLE B031 SA
+1002E;AL # LINEAR B SYLLABLE B009 SE
+1002F;AL # LINEAR B SYLLABLE B041 SI
+10030;AL # LINEAR B SYLLABLE B012 SO
+10031;AL # LINEAR B SYLLABLE B058 SU
+10032;AL # LINEAR B SYLLABLE B059 TA
+10033;AL # LINEAR B SYLLABLE B004 TE
+10034;AL # LINEAR B SYLLABLE B037 TI
+10035;AL # LINEAR B SYLLABLE B005 TO
+10036;AL # LINEAR B SYLLABLE B069 TU
+10037;AL # LINEAR B SYLLABLE B054 WA
+10038;AL # LINEAR B SYLLABLE B075 WE
+10039;AL # LINEAR B SYLLABLE B040 WI
+1003A;AL # LINEAR B SYLLABLE B042 WO
+1003C;AL # LINEAR B SYLLABLE B017 ZA
+1003D;AL # LINEAR B SYLLABLE B074 ZE
+1003F;AL # LINEAR B SYLLABLE B020 ZO
+10040;AL # LINEAR B SYLLABLE B025 A2
+10041;AL # LINEAR B SYLLABLE B043 A3
+10042;AL # LINEAR B SYLLABLE B085 AU
+10043;AL # LINEAR B SYLLABLE B071 DWE
+10044;AL # LINEAR B SYLLABLE B090 DWO
+10045;AL # LINEAR B SYLLABLE B048 NWA
+10046;AL # LINEAR B SYLLABLE B029 PU2
+10047;AL # LINEAR B SYLLABLE B062 PTE
+10048;AL # LINEAR B SYLLABLE B076 RA2
+10049;AL # LINEAR B SYLLABLE B033 RA3
+1004A;AL # LINEAR B SYLLABLE B068 RO2
+1004B;AL # LINEAR B SYLLABLE B066 TA2
+1004C;AL # LINEAR B SYLLABLE B087 TWE
+1004D;AL # LINEAR B SYLLABLE B091 TWO
+10050;AL # LINEAR B SYMBOL B018
+10051;AL # LINEAR B SYMBOL B019
+10052;AL # LINEAR B SYMBOL B022
+10053;AL # LINEAR B SYMBOL B034
+10054;AL # LINEAR B SYMBOL B047
+10055;AL # LINEAR B SYMBOL B049
+10056;AL # LINEAR B SYMBOL B056
+10057;AL # LINEAR B SYMBOL B063
+10058;AL # LINEAR B SYMBOL B064
+10059;AL # LINEAR B SYMBOL B079
+1005A;AL # LINEAR B SYMBOL B082
+1005B;AL # LINEAR B SYMBOL B083
+1005C;AL # LINEAR B SYMBOL B086
+1005D;AL # LINEAR B SYMBOL B089
+10080;AL # LINEAR B IDEOGRAM B100 MAN
+10081;AL # LINEAR B IDEOGRAM B102 WOMAN
+10082;AL # LINEAR B IDEOGRAM B104 DEER
+10083;AL # LINEAR B IDEOGRAM B105 EQUID
+10084;AL # LINEAR B IDEOGRAM B105F MARE
+10085;AL # LINEAR B IDEOGRAM B105M STALLION
+10086;AL # LINEAR B IDEOGRAM B106F EWE
+10087;AL # LINEAR B IDEOGRAM B106M RAM
+10088;AL # LINEAR B IDEOGRAM B107F SHE-GOAT
+10089;AL # LINEAR B IDEOGRAM B107M HE-GOAT
+1008A;AL # LINEAR B IDEOGRAM B108F SOW
+1008B;AL # LINEAR B IDEOGRAM B108M BOAR
+1008C;AL # LINEAR B IDEOGRAM B109F COW
+1008D;AL # LINEAR B IDEOGRAM B109M BULL
+1008E;AL # LINEAR B IDEOGRAM B120 WHEAT
+1008F;AL # LINEAR B IDEOGRAM B121 BARLEY
+10090;AL # LINEAR B IDEOGRAM B122 OLIVE
+10091;AL # LINEAR B IDEOGRAM B123 SPICE
+10092;AL # LINEAR B IDEOGRAM B125 CYPERUS
+10093;AL # LINEAR B MONOGRAM B127 KAPO
+10094;AL # LINEAR B MONOGRAM B128 KANAKO
+10095;AL # LINEAR B IDEOGRAM B130 OIL
+10096;AL # LINEAR B IDEOGRAM B131 WINE
+10097;AL # LINEAR B IDEOGRAM B132
+10098;AL # LINEAR B MONOGRAM B133 AREPA
+10099;AL # LINEAR B MONOGRAM B135 MERI
+1009A;AL # LINEAR B IDEOGRAM B140 BRONZE
+1009B;AL # LINEAR B IDEOGRAM B141 GOLD
+1009C;AL # LINEAR B IDEOGRAM B142
+1009D;AL # LINEAR B IDEOGRAM B145 WOOL
+1009E;AL # LINEAR B IDEOGRAM B146
+1009F;AL # LINEAR B IDEOGRAM B150
+100A0;AL # LINEAR B IDEOGRAM B151 HORN
+100A1;AL # LINEAR B IDEOGRAM B152
+100A2;AL # LINEAR B IDEOGRAM B153
+100A3;AL # LINEAR B IDEOGRAM B154
+100A4;AL # LINEAR B MONOGRAM B156 TURO2
+100A5;AL # LINEAR B IDEOGRAM B157
+100A6;AL # LINEAR B IDEOGRAM B158
+100A7;AL # LINEAR B IDEOGRAM B159 CLOTH
+100A8;AL # LINEAR B IDEOGRAM B160
+100A9;AL # LINEAR B IDEOGRAM B161
+100AA;AL # LINEAR B IDEOGRAM B162 GARMENT
+100AB;AL # LINEAR B IDEOGRAM B163 ARMOUR
+100AC;AL # LINEAR B IDEOGRAM B164
+100AD;AL # LINEAR B IDEOGRAM B165
+100AE;AL # LINEAR B IDEOGRAM B166
+100AF;AL # LINEAR B IDEOGRAM B167
+100B0;AL # LINEAR B IDEOGRAM B168
+100B1;AL # LINEAR B IDEOGRAM B169
+100B2;AL # LINEAR B IDEOGRAM B170
+100B3;AL # LINEAR B IDEOGRAM B171
+100B4;AL # LINEAR B IDEOGRAM B172
+100B5;AL # LINEAR B IDEOGRAM B173 MONTH
+100B6;AL # LINEAR B IDEOGRAM B174
+100B7;AL # LINEAR B IDEOGRAM B176 TREE
+100B8;AL # LINEAR B IDEOGRAM B177
+100B9;AL # LINEAR B IDEOGRAM B178
+100BA;AL # LINEAR B IDEOGRAM B179
+100BB;AL # LINEAR B IDEOGRAM B180
+100BC;AL # LINEAR B IDEOGRAM B181
+100BD;AL # LINEAR B IDEOGRAM B182
+100BE;AL # LINEAR B IDEOGRAM B183
+100BF;AL # LINEAR B IDEOGRAM B184
+100C0;AL # LINEAR B IDEOGRAM B185
+100C1;AL # LINEAR B IDEOGRAM B189
+100C2;AL # LINEAR B IDEOGRAM B190
+100C3;AL # LINEAR B IDEOGRAM B191 HELMET
+100C4;AL # LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5;AL # LINEAR B IDEOGRAM B225 BATHTUB
+100C6;AL # LINEAR B IDEOGRAM B230 SPEAR
+100C7;AL # LINEAR B IDEOGRAM B231 ARROW
+100C8;AL # LINEAR B IDEOGRAM B232
+100C9;AL # LINEAR B IDEOGRAM B233 SWORD
+100CA;AL # LINEAR B IDEOGRAM B234
+100CB;AL # LINEAR B IDEOGRAM B236
+100CC;AL # LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD;AL # LINEAR B IDEOGRAM B241 CHARIOT
+100CE;AL # LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF;AL # LINEAR B IDEOGRAM B243 WHEEL
+100D0;AL # LINEAR B IDEOGRAM B245
+100D1;AL # LINEAR B IDEOGRAM B246
+100D2;AL # LINEAR B MONOGRAM B247 DIPTE
+100D3;AL # LINEAR B IDEOGRAM B248
+100D4;AL # LINEAR B IDEOGRAM B249
+100D5;AL # LINEAR B IDEOGRAM B251
+100D6;AL # LINEAR B IDEOGRAM B252
+100D7;AL # LINEAR B IDEOGRAM B253
+100D8;AL # LINEAR B IDEOGRAM B254 DART
+100D9;AL # LINEAR B IDEOGRAM B255
+100DA;AL # LINEAR B IDEOGRAM B256
+100DB;AL # LINEAR B IDEOGRAM B257
+100DC;AL # LINEAR B IDEOGRAM B258
+100DD;AL # LINEAR B IDEOGRAM B259
+100DE;AL # LINEAR B IDEOGRAM VESSEL B155
+100DF;AL # LINEAR B IDEOGRAM VESSEL B200
+100E0;AL # LINEAR B IDEOGRAM VESSEL B201
+100E1;AL # LINEAR B IDEOGRAM VESSEL B202
+100E2;AL # LINEAR B IDEOGRAM VESSEL B203
+100E3;AL # LINEAR B IDEOGRAM VESSEL B204
+100E4;AL # LINEAR B IDEOGRAM VESSEL B205
+100E5;AL # LINEAR B IDEOGRAM VESSEL B206
+100E6;AL # LINEAR B IDEOGRAM VESSEL B207
+100E7;AL # LINEAR B IDEOGRAM VESSEL B208
+100E8;AL # LINEAR B IDEOGRAM VESSEL B209
+100E9;AL # LINEAR B IDEOGRAM VESSEL B210
+100EA;AL # LINEAR B IDEOGRAM VESSEL B211
+100EB;AL # LINEAR B IDEOGRAM VESSEL B212
+100EC;AL # LINEAR B IDEOGRAM VESSEL B213
+100ED;AL # LINEAR B IDEOGRAM VESSEL B214
+100EE;AL # LINEAR B IDEOGRAM VESSEL B215
+100EF;AL # LINEAR B IDEOGRAM VESSEL B216
+100F0;AL # LINEAR B IDEOGRAM VESSEL B217
+100F1;AL # LINEAR B IDEOGRAM VESSEL B218
+100F2;AL # LINEAR B IDEOGRAM VESSEL B219
+100F3;AL # LINEAR B IDEOGRAM VESSEL B221
+100F4;AL # LINEAR B IDEOGRAM VESSEL B222
+100F5;AL # LINEAR B IDEOGRAM VESSEL B226
+100F6;AL # LINEAR B IDEOGRAM VESSEL B227
+100F7;AL # LINEAR B IDEOGRAM VESSEL B228
+100F8;AL # LINEAR B IDEOGRAM VESSEL B229
+100F9;AL # LINEAR B IDEOGRAM VESSEL B250
+100FA;AL # LINEAR B IDEOGRAM VESSEL B305
+10100;BA # AEGEAN WORD SEPARATOR LINE
+10101;BA # AEGEAN WORD SEPARATOR DOT
+10102;BA # AEGEAN CHECK MARK
+10107;AL # AEGEAN NUMBER ONE
+10108;AL # AEGEAN NUMBER TWO
+10109;AL # AEGEAN NUMBER THREE
+1010A;AL # AEGEAN NUMBER FOUR
+1010B;AL # AEGEAN NUMBER FIVE
+1010C;AL # AEGEAN NUMBER SIX
+1010D;AL # AEGEAN NUMBER SEVEN
+1010E;AL # AEGEAN NUMBER EIGHT
+1010F;AL # AEGEAN NUMBER NINE
+10110;AL # AEGEAN NUMBER TEN
+10111;AL # AEGEAN NUMBER TWENTY
+10112;AL # AEGEAN NUMBER THIRTY
+10113;AL # AEGEAN NUMBER FORTY
+10114;AL # AEGEAN NUMBER FIFTY
+10115;AL # AEGEAN NUMBER SIXTY
+10116;AL # AEGEAN NUMBER SEVENTY
+10117;AL # AEGEAN NUMBER EIGHTY
+10118;AL # AEGEAN NUMBER NINETY
+10119;AL # AEGEAN NUMBER ONE HUNDRED
+1011A;AL # AEGEAN NUMBER TWO HUNDRED
+1011B;AL # AEGEAN NUMBER THREE HUNDRED
+1011C;AL # AEGEAN NUMBER FOUR HUNDRED
+1011D;AL # AEGEAN NUMBER FIVE HUNDRED
+1011E;AL # AEGEAN NUMBER SIX HUNDRED
+1011F;AL # AEGEAN NUMBER SEVEN HUNDRED
+10120;AL # AEGEAN NUMBER EIGHT HUNDRED
+10121;AL # AEGEAN NUMBER NINE HUNDRED
+10122;AL # AEGEAN NUMBER ONE THOUSAND
+10123;AL # AEGEAN NUMBER TWO THOUSAND
+10124;AL # AEGEAN NUMBER THREE THOUSAND
+10125;AL # AEGEAN NUMBER FOUR THOUSAND
+10126;AL # AEGEAN NUMBER FIVE THOUSAND
+10127;AL # AEGEAN NUMBER SIX THOUSAND
+10128;AL # AEGEAN NUMBER SEVEN THOUSAND
+10129;AL # AEGEAN NUMBER EIGHT THOUSAND
+1012A;AL # AEGEAN NUMBER NINE THOUSAND
+1012B;AL # AEGEAN NUMBER TEN THOUSAND
+1012C;AL # AEGEAN NUMBER TWENTY THOUSAND
+1012D;AL # AEGEAN NUMBER THIRTY THOUSAND
+1012E;AL # AEGEAN NUMBER FORTY THOUSAND
+1012F;AL # AEGEAN NUMBER FIFTY THOUSAND
+10130;AL # AEGEAN NUMBER SIXTY THOUSAND
+10131;AL # AEGEAN NUMBER SEVENTY THOUSAND
+10132;AL # AEGEAN NUMBER EIGHTY THOUSAND
+10133;AL # AEGEAN NUMBER NINETY THOUSAND
+10137;AL # AEGEAN WEIGHT BASE UNIT
+10138;AL # AEGEAN WEIGHT FIRST SUBUNIT
+10139;AL # AEGEAN WEIGHT SECOND SUBUNIT
+1013A;AL # AEGEAN WEIGHT THIRD SUBUNIT
+1013B;AL # AEGEAN WEIGHT FOURTH SUBUNIT
+1013C;AL # AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D;AL # AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E;AL # AEGEAN MEASURE SECOND SUBUNIT
+1013F;AL # AEGEAN MEASURE THIRD SUBUNIT
+10140;AL # GREEK ACROPHONIC ATTIC ONE QUARTER
+10141;AL # GREEK ACROPHONIC ATTIC ONE HALF
+10142;AL # GREEK ACROPHONIC ATTIC ONE DRACHMA
+10143;AL # GREEK ACROPHONIC ATTIC FIVE
+10144;AL # GREEK ACROPHONIC ATTIC FIFTY
+10145;AL # GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146;AL # GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147;AL # GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10148;AL # GREEK ACROPHONIC ATTIC FIVE TALENTS
+10149;AL # GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A;AL # GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B;AL # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C;AL # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D;AL # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E;AL # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+1014F;AL # GREEK ACROPHONIC ATTIC FIVE STATERS
+10150;AL # GREEK ACROPHONIC ATTIC TEN STATERS
+10151;AL # GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152;AL # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153;AL # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154;AL # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155;AL # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156;AL # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157;AL # GREEK ACROPHONIC ATTIC TEN MNAS
+10158;AL # GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159;AL # GREEK ACROPHONIC THESPIAN ONE
+1015A;AL # GREEK ACROPHONIC HERMIONIAN ONE
+1015B;AL # GREEK ACROPHONIC EPIDAUREAN TWO
+1015C;AL # GREEK ACROPHONIC THESPIAN TWO
+1015D;AL # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E;AL # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+1015F;AL # GREEK ACROPHONIC TROEZENIAN FIVE
+10160;AL # GREEK ACROPHONIC TROEZENIAN TEN
+10161;AL # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162;AL # GREEK ACROPHONIC HERMIONIAN TEN
+10163;AL # GREEK ACROPHONIC MESSENIAN TEN
+10164;AL # GREEK ACROPHONIC THESPIAN TEN
+10165;AL # GREEK ACROPHONIC THESPIAN THIRTY
+10166;AL # GREEK ACROPHONIC TROEZENIAN FIFTY
+10167;AL # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168;AL # GREEK ACROPHONIC HERMIONIAN FIFTY
+10169;AL # GREEK ACROPHONIC THESPIAN FIFTY
+1016A;AL # GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B;AL # GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C;AL # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D;AL # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E;AL # GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F;AL # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170;AL # GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171;AL # GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172;AL # GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10173;AL # GREEK ACROPHONIC DELPHIC FIVE MNAS
+10174;AL # GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175;AL # GREEK ONE HALF SIGN
+10176;AL # GREEK ONE HALF SIGN ALTERNATE FORM
+10177;AL # GREEK TWO THIRDS SIGN
+10178;AL # GREEK THREE QUARTERS SIGN
+10179;AL # GREEK YEAR SIGN
+1017A;AL # GREEK TALENT SIGN
+1017B;AL # GREEK DRACHMA SIGN
+1017C;AL # GREEK OBOL SIGN
+1017D;AL # GREEK TWO OBOLS SIGN
+1017E;AL # GREEK THREE OBOLS SIGN
+1017F;AL # GREEK FOUR OBOLS SIGN
+10180;AL # GREEK FIVE OBOLS SIGN
+10181;AL # GREEK METRETES SIGN
+10182;AL # GREEK KYATHOS BASE SIGN
+10183;AL # GREEK LITRA SIGN
+10184;AL # GREEK OUNKIA SIGN
+10185;AL # GREEK XESTES SIGN
+10186;AL # GREEK ARTABE SIGN
+10187;AL # GREEK AROURA SIGN
+10188;AL # GREEK GRAMMA SIGN
+10189;AL # GREEK TRYBLION BASE SIGN
+1018A;AL # GREEK ZERO SIGN
+10300;AL # OLD ITALIC LETTER A
+10301;AL # OLD ITALIC LETTER BE
+10302;AL # OLD ITALIC LETTER KE
+10303;AL # OLD ITALIC LETTER DE
+10304;AL # OLD ITALIC LETTER E
+10305;AL # OLD ITALIC LETTER VE
+10306;AL # OLD ITALIC LETTER ZE
+10307;AL # OLD ITALIC LETTER HE
+10308;AL # OLD ITALIC LETTER THE
+10309;AL # OLD ITALIC LETTER I
+1030A;AL # OLD ITALIC LETTER KA
+1030B;AL # OLD ITALIC LETTER EL
+1030C;AL # OLD ITALIC LETTER EM
+1030D;AL # OLD ITALIC LETTER EN
+1030E;AL # OLD ITALIC LETTER ESH
+1030F;AL # OLD ITALIC LETTER O
+10310;AL # OLD ITALIC LETTER PE
+10311;AL # OLD ITALIC LETTER SHE
+10312;AL # OLD ITALIC LETTER KU
+10313;AL # OLD ITALIC LETTER ER
+10314;AL # OLD ITALIC LETTER ES
+10315;AL # OLD ITALIC LETTER TE
+10316;AL # OLD ITALIC LETTER U
+10317;AL # OLD ITALIC LETTER EKS
+10318;AL # OLD ITALIC LETTER PHE
+10319;AL # OLD ITALIC LETTER KHE
+1031A;AL # OLD ITALIC LETTER EF
+1031B;AL # OLD ITALIC LETTER ERS
+1031C;AL # OLD ITALIC LETTER CHE
+1031D;AL # OLD ITALIC LETTER II
+1031E;AL # OLD ITALIC LETTER UU
+10320;AL # OLD ITALIC NUMERAL ONE
+10321;AL # OLD ITALIC NUMERAL FIVE
+10322;AL # OLD ITALIC NUMERAL TEN
+10323;AL # OLD ITALIC NUMERAL FIFTY
+10330;AL # GOTHIC LETTER AHSA
+10331;AL # GOTHIC LETTER BAIRKAN
+10332;AL # GOTHIC LETTER GIBA
+10333;AL # GOTHIC LETTER DAGS
+10334;AL # GOTHIC LETTER AIHVUS
+10335;AL # GOTHIC LETTER QAIRTHRA
+10336;AL # GOTHIC LETTER IUJA
+10337;AL # GOTHIC LETTER HAGL
+10338;AL # GOTHIC LETTER THIUTH
+10339;AL # GOTHIC LETTER EIS
+1033A;AL # GOTHIC LETTER KUSMA
+1033B;AL # GOTHIC LETTER LAGUS
+1033C;AL # GOTHIC LETTER MANNA
+1033D;AL # GOTHIC LETTER NAUTHS
+1033E;AL # GOTHIC LETTER JER
+1033F;AL # GOTHIC LETTER URUS
+10340;AL # GOTHIC LETTER PAIRTHRA
+10341;AL # GOTHIC LETTER NINETY
+10342;AL # GOTHIC LETTER RAIDA
+10343;AL # GOTHIC LETTER SAUIL
+10344;AL # GOTHIC LETTER TEIWS
+10345;AL # GOTHIC LETTER WINJA
+10346;AL # GOTHIC LETTER FAIHU
+10347;AL # GOTHIC LETTER IGGWS
+10348;AL # GOTHIC LETTER HWAIR
+10349;AL # GOTHIC LETTER OTHAL
+1034A;AL # GOTHIC LETTER NINE HUNDRED
+10380;AL # UGARITIC LETTER ALPA
+10381;AL # UGARITIC LETTER BETA
+10382;AL # UGARITIC LETTER GAMLA
+10383;AL # UGARITIC LETTER KHA
+10384;AL # UGARITIC LETTER DELTA
+10385;AL # UGARITIC LETTER HO
+10386;AL # UGARITIC LETTER WO
+10387;AL # UGARITIC LETTER ZETA
+10388;AL # UGARITIC LETTER HOTA
+10389;AL # UGARITIC LETTER TET
+1038A;AL # UGARITIC LETTER YOD
+1038B;AL # UGARITIC LETTER KAF
+1038C;AL # UGARITIC LETTER SHIN
+1038D;AL # UGARITIC LETTER LAMDA
+1038E;AL # UGARITIC LETTER MEM
+1038F;AL # UGARITIC LETTER DHAL
+10390;AL # UGARITIC LETTER NUN
+10391;AL # UGARITIC LETTER ZU
+10392;AL # UGARITIC LETTER SAMKA
+10393;AL # UGARITIC LETTER AIN
+10394;AL # UGARITIC LETTER PU
+10395;AL # UGARITIC LETTER SADE
+10396;AL # UGARITIC LETTER QOPA
+10397;AL # UGARITIC LETTER RASHA
+10398;AL # UGARITIC LETTER THANNA
+10399;AL # UGARITIC LETTER GHAIN
+1039A;AL # UGARITIC LETTER TO
+1039B;AL # UGARITIC LETTER I
+1039C;AL # UGARITIC LETTER U
+1039D;AL # UGARITIC LETTER SSU
+1039F;BA # UGARITIC WORD DIVIDER
+103A0;AL # OLD PERSIAN SIGN A
+103A1;AL # OLD PERSIAN SIGN I
+103A2;AL # OLD PERSIAN SIGN U
+103A3;AL # OLD PERSIAN SIGN KA
+103A4;AL # OLD PERSIAN SIGN KU
+103A5;AL # OLD PERSIAN SIGN GA
+103A6;AL # OLD PERSIAN SIGN GU
+103A7;AL # OLD PERSIAN SIGN XA
+103A8;AL # OLD PERSIAN SIGN CA
+103A9;AL # OLD PERSIAN SIGN JA
+103AA;AL # OLD PERSIAN SIGN JI
+103AB;AL # OLD PERSIAN SIGN TA
+103AC;AL # OLD PERSIAN SIGN TU
+103AD;AL # OLD PERSIAN SIGN DA
+103AE;AL # OLD PERSIAN SIGN DI
+103AF;AL # OLD PERSIAN SIGN DU
+103B0;AL # OLD PERSIAN SIGN THA
+103B1;AL # OLD PERSIAN SIGN PA
+103B2;AL # OLD PERSIAN SIGN BA
+103B3;AL # OLD PERSIAN SIGN FA
+103B4;AL # OLD PERSIAN SIGN NA
+103B5;AL # OLD PERSIAN SIGN NU
+103B6;AL # OLD PERSIAN SIGN MA
+103B7;AL # OLD PERSIAN SIGN MI
+103B8;AL # OLD PERSIAN SIGN MU
+103B9;AL # OLD PERSIAN SIGN YA
+103BA;AL # OLD PERSIAN SIGN VA
+103BB;AL # OLD PERSIAN SIGN VI
+103BC;AL # OLD PERSIAN SIGN RA
+103BD;AL # OLD PERSIAN SIGN RU
+103BE;AL # OLD PERSIAN SIGN LA
+103BF;AL # OLD PERSIAN SIGN SA
+103C0;AL # OLD PERSIAN SIGN ZA
+103C1;AL # OLD PERSIAN SIGN SHA
+103C2;AL # OLD PERSIAN SIGN SSA
+103C3;AL # OLD PERSIAN SIGN HA
+103C8;AL # OLD PERSIAN SIGN AURAMAZDAA
+103C9;AL # OLD PERSIAN SIGN AURAMAZDAA-2
+103CA;AL # OLD PERSIAN SIGN AURAMAZDAAHA
+103CB;AL # OLD PERSIAN SIGN XSHAAYATHIYA
+103CC;AL # OLD PERSIAN SIGN DAHYAAUSH
+103CD;AL # OLD PERSIAN SIGN DAHYAAUSH-2
+103CE;AL # OLD PERSIAN SIGN BAGA
+103CF;AL # OLD PERSIAN SIGN BUUMISH
+103D0;AL # OLD PERSIAN WORD DIVIDER
+103D1;AL # OLD PERSIAN NUMBER ONE
+103D2;AL # OLD PERSIAN NUMBER TWO
+103D3;AL # OLD PERSIAN NUMBER TEN
+103D4;AL # OLD PERSIAN NUMBER TWENTY
+103D5;AL # OLD PERSIAN NUMBER HUNDRED
+10400;AL # DESERET CAPITAL LETTER LONG I
+10401;AL # DESERET CAPITAL LETTER LONG E
+10402;AL # DESERET CAPITAL LETTER LONG A
+10403;AL # DESERET CAPITAL LETTER LONG AH
+10404;AL # DESERET CAPITAL LETTER LONG O
+10405;AL # DESERET CAPITAL LETTER LONG OO
+10406;AL # DESERET CAPITAL LETTER SHORT I
+10407;AL # DESERET CAPITAL LETTER SHORT E
+10408;AL # DESERET CAPITAL LETTER SHORT A
+10409;AL # DESERET CAPITAL LETTER SHORT AH
+1040A;AL # DESERET CAPITAL LETTER SHORT O
+1040B;AL # DESERET CAPITAL LETTER SHORT OO
+1040C;AL # DESERET CAPITAL LETTER AY
+1040D;AL # DESERET CAPITAL LETTER OW
+1040E;AL # DESERET CAPITAL LETTER WU
+1040F;AL # DESERET CAPITAL LETTER YEE
+10410;AL # DESERET CAPITAL LETTER H
+10411;AL # DESERET CAPITAL LETTER PEE
+10412;AL # DESERET CAPITAL LETTER BEE
+10413;AL # DESERET CAPITAL LETTER TEE
+10414;AL # DESERET CAPITAL LETTER DEE
+10415;AL # DESERET CAPITAL LETTER CHEE
+10416;AL # DESERET CAPITAL LETTER JEE
+10417;AL # DESERET CAPITAL LETTER KAY
+10418;AL # DESERET CAPITAL LETTER GAY
+10419;AL # DESERET CAPITAL LETTER EF
+1041A;AL # DESERET CAPITAL LETTER VEE
+1041B;AL # DESERET CAPITAL LETTER ETH
+1041C;AL # DESERET CAPITAL LETTER THEE
+1041D;AL # DESERET CAPITAL LETTER ES
+1041E;AL # DESERET CAPITAL LETTER ZEE
+1041F;AL # DESERET CAPITAL LETTER ESH
+10420;AL # DESERET CAPITAL LETTER ZHEE
+10421;AL # DESERET CAPITAL LETTER ER
+10422;AL # DESERET CAPITAL LETTER EL
+10423;AL # DESERET CAPITAL LETTER EM
+10424;AL # DESERET CAPITAL LETTER EN
+10425;AL # DESERET CAPITAL LETTER ENG
+10426;AL # DESERET CAPITAL LETTER OI
+10427;AL # DESERET CAPITAL LETTER EW
+10428;AL # DESERET SMALL LETTER LONG I
+10429;AL # DESERET SMALL LETTER LONG E
+1042A;AL # DESERET SMALL LETTER LONG A
+1042B;AL # DESERET SMALL LETTER LONG AH
+1042C;AL # DESERET SMALL LETTER LONG O
+1042D;AL # DESERET SMALL LETTER LONG OO
+1042E;AL # DESERET SMALL LETTER SHORT I
+1042F;AL # DESERET SMALL LETTER SHORT E
+10430;AL # DESERET SMALL LETTER SHORT A
+10431;AL # DESERET SMALL LETTER SHORT AH
+10432;AL # DESERET SMALL LETTER SHORT O
+10433;AL # DESERET SMALL LETTER SHORT OO
+10434;AL # DESERET SMALL LETTER AY
+10435;AL # DESERET SMALL LETTER OW
+10436;AL # DESERET SMALL LETTER WU
+10437;AL # DESERET SMALL LETTER YEE
+10438;AL # DESERET SMALL LETTER H
+10439;AL # DESERET SMALL LETTER PEE
+1043A;AL # DESERET SMALL LETTER BEE
+1043B;AL # DESERET SMALL LETTER TEE
+1043C;AL # DESERET SMALL LETTER DEE
+1043D;AL # DESERET SMALL LETTER CHEE
+1043E;AL # DESERET SMALL LETTER JEE
+1043F;AL # DESERET SMALL LETTER KAY
+10440;AL # DESERET SMALL LETTER GAY
+10441;AL # DESERET SMALL LETTER EF
+10442;AL # DESERET SMALL LETTER VEE
+10443;AL # DESERET SMALL LETTER ETH
+10444;AL # DESERET SMALL LETTER THEE
+10445;AL # DESERET SMALL LETTER ES
+10446;AL # DESERET SMALL LETTER ZEE
+10447;AL # DESERET SMALL LETTER ESH
+10448;AL # DESERET SMALL LETTER ZHEE
+10449;AL # DESERET SMALL LETTER ER
+1044A;AL # DESERET SMALL LETTER EL
+1044B;AL # DESERET SMALL LETTER EM
+1044C;AL # DESERET SMALL LETTER EN
+1044D;AL # DESERET SMALL LETTER ENG
+1044E;AL # DESERET SMALL LETTER OI
+1044F;AL # DESERET SMALL LETTER EW
+10450;AL # SHAVIAN LETTER PEEP
+10451;AL # SHAVIAN LETTER TOT
+10452;AL # SHAVIAN LETTER KICK
+10453;AL # SHAVIAN LETTER FEE
+10454;AL # SHAVIAN LETTER THIGH
+10455;AL # SHAVIAN LETTER SO
+10456;AL # SHAVIAN LETTER SURE
+10457;AL # SHAVIAN LETTER CHURCH
+10458;AL # SHAVIAN LETTER YEA
+10459;AL # SHAVIAN LETTER HUNG
+1045A;AL # SHAVIAN LETTER BIB
+1045B;AL # SHAVIAN LETTER DEAD
+1045C;AL # SHAVIAN LETTER GAG
+1045D;AL # SHAVIAN LETTER VOW
+1045E;AL # SHAVIAN LETTER THEY
+1045F;AL # SHAVIAN LETTER ZOO
+10460;AL # SHAVIAN LETTER MEASURE
+10461;AL # SHAVIAN LETTER JUDGE
+10462;AL # SHAVIAN LETTER WOE
+10463;AL # SHAVIAN LETTER HA-HA
+10464;AL # SHAVIAN LETTER LOLL
+10465;AL # SHAVIAN LETTER MIME
+10466;AL # SHAVIAN LETTER IF
+10467;AL # SHAVIAN LETTER EGG
+10468;AL # SHAVIAN LETTER ASH
+10469;AL # SHAVIAN LETTER ADO
+1046A;AL # SHAVIAN LETTER ON
+1046B;AL # SHAVIAN LETTER WOOL
+1046C;AL # SHAVIAN LETTER OUT
+1046D;AL # SHAVIAN LETTER AH
+1046E;AL # SHAVIAN LETTER ROAR
+1046F;AL # SHAVIAN LETTER NUN
+10470;AL # SHAVIAN LETTER EAT
+10471;AL # SHAVIAN LETTER AGE
+10472;AL # SHAVIAN LETTER ICE
+10473;AL # SHAVIAN LETTER UP
+10474;AL # SHAVIAN LETTER OAK
+10475;AL # SHAVIAN LETTER OOZE
+10476;AL # SHAVIAN LETTER OIL
+10477;AL # SHAVIAN LETTER AWE
+10478;AL # SHAVIAN LETTER ARE
+10479;AL # SHAVIAN LETTER OR
+1047A;AL # SHAVIAN LETTER AIR
+1047B;AL # SHAVIAN LETTER ERR
+1047C;AL # SHAVIAN LETTER ARRAY
+1047D;AL # SHAVIAN LETTER EAR
+1047E;AL # SHAVIAN LETTER IAN
+1047F;AL # SHAVIAN LETTER YEW
+10480;AL # OSMANYA LETTER ALEF
+10481;AL # OSMANYA LETTER BA
+10482;AL # OSMANYA LETTER TA
+10483;AL # OSMANYA LETTER JA
+10484;AL # OSMANYA LETTER XA
+10485;AL # OSMANYA LETTER KHA
+10486;AL # OSMANYA LETTER DEEL
+10487;AL # OSMANYA LETTER RA
+10488;AL # OSMANYA LETTER SA
+10489;AL # OSMANYA LETTER SHIIN
+1048A;AL # OSMANYA LETTER DHA
+1048B;AL # OSMANYA LETTER CAYN
+1048C;AL # OSMANYA LETTER GA
+1048D;AL # OSMANYA LETTER FA
+1048E;AL # OSMANYA LETTER QAAF
+1048F;AL # OSMANYA LETTER KAAF
+10490;AL # OSMANYA LETTER LAAN
+10491;AL # OSMANYA LETTER MIIN
+10492;AL # OSMANYA LETTER NUUN
+10493;AL # OSMANYA LETTER WAW
+10494;AL # OSMANYA LETTER HA
+10495;AL # OSMANYA LETTER YA
+10496;AL # OSMANYA LETTER A
+10497;AL # OSMANYA LETTER E
+10498;AL # OSMANYA LETTER I
+10499;AL # OSMANYA LETTER O
+1049A;AL # OSMANYA LETTER U
+1049B;AL # OSMANYA LETTER AA
+1049C;AL # OSMANYA LETTER EE
+1049D;AL # OSMANYA LETTER OO
+104A0;NU # OSMANYA DIGIT ZERO
+104A1;NU # OSMANYA DIGIT ONE
+104A2;NU # OSMANYA DIGIT TWO
+104A3;NU # OSMANYA DIGIT THREE
+104A4;NU # OSMANYA DIGIT FOUR
+104A5;NU # OSMANYA DIGIT FIVE
+104A6;NU # OSMANYA DIGIT SIX
+104A7;NU # OSMANYA DIGIT SEVEN
+104A8;NU # OSMANYA DIGIT EIGHT
+104A9;NU # OSMANYA DIGIT NINE
+10800;AL # CYPRIOT SYLLABLE A
+10801;AL # CYPRIOT SYLLABLE E
+10802;AL # CYPRIOT SYLLABLE I
+10803;AL # CYPRIOT SYLLABLE O
+10804;AL # CYPRIOT SYLLABLE U
+10805;AL # CYPRIOT SYLLABLE JA
+10808;AL # CYPRIOT SYLLABLE JO
+1080A;AL # CYPRIOT SYLLABLE KA
+1080B;AL # CYPRIOT SYLLABLE KE
+1080C;AL # CYPRIOT SYLLABLE KI
+1080D;AL # CYPRIOT SYLLABLE KO
+1080E;AL # CYPRIOT SYLLABLE KU
+1080F;AL # CYPRIOT SYLLABLE LA
+10810;AL # CYPRIOT SYLLABLE LE
+10811;AL # CYPRIOT SYLLABLE LI
+10812;AL # CYPRIOT SYLLABLE LO
+10813;AL # CYPRIOT SYLLABLE LU
+10814;AL # CYPRIOT SYLLABLE MA
+10815;AL # CYPRIOT SYLLABLE ME
+10816;AL # CYPRIOT SYLLABLE MI
+10817;AL # CYPRIOT SYLLABLE MO
+10818;AL # CYPRIOT SYLLABLE MU
+10819;AL # CYPRIOT SYLLABLE NA
+1081A;AL # CYPRIOT SYLLABLE NE
+1081B;AL # CYPRIOT SYLLABLE NI
+1081C;AL # CYPRIOT SYLLABLE NO
+1081D;AL # CYPRIOT SYLLABLE NU
+1081E;AL # CYPRIOT SYLLABLE PA
+1081F;AL # CYPRIOT SYLLABLE PE
+10820;AL # CYPRIOT SYLLABLE PI
+10821;AL # CYPRIOT SYLLABLE PO
+10822;AL # CYPRIOT SYLLABLE PU
+10823;AL # CYPRIOT SYLLABLE RA
+10824;AL # CYPRIOT SYLLABLE RE
+10825;AL # CYPRIOT SYLLABLE RI
+10826;AL # CYPRIOT SYLLABLE RO
+10827;AL # CYPRIOT SYLLABLE RU
+10828;AL # CYPRIOT SYLLABLE SA
+10829;AL # CYPRIOT SYLLABLE SE
+1082A;AL # CYPRIOT SYLLABLE SI
+1082B;AL # CYPRIOT SYLLABLE SO
+1082C;AL # CYPRIOT SYLLABLE SU
+1082D;AL # CYPRIOT SYLLABLE TA
+1082E;AL # CYPRIOT SYLLABLE TE
+1082F;AL # CYPRIOT SYLLABLE TI
+10830;AL # CYPRIOT SYLLABLE TO
+10831;AL # CYPRIOT SYLLABLE TU
+10832;AL # CYPRIOT SYLLABLE WA
+10833;AL # CYPRIOT SYLLABLE WE
+10834;AL # CYPRIOT SYLLABLE WI
+10835;AL # CYPRIOT SYLLABLE WO
+10837;AL # CYPRIOT SYLLABLE XA
+10838;AL # CYPRIOT SYLLABLE XE
+1083C;AL # CYPRIOT SYLLABLE ZA
+1083F;AL # CYPRIOT SYLLABLE ZO
+10A00;AL # KHAROSHTHI LETTER A
+10A01;CM # KHAROSHTHI VOWEL SIGN I
+10A02;CM # KHAROSHTHI VOWEL SIGN U
+10A03;CM # KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05;CM # KHAROSHTHI VOWEL SIGN E
+10A06;CM # KHAROSHTHI VOWEL SIGN O
+10A0C;CM # KHAROSHTHI VOWEL LENGTH MARK
+10A0D;CM # KHAROSHTHI SIGN DOUBLE RING BELOW
+10A0E;CM # KHAROSHTHI SIGN ANUSVARA
+10A0F;CM # KHAROSHTHI SIGN VISARGA
+10A10;AL # KHAROSHTHI LETTER KA
+10A11;AL # KHAROSHTHI LETTER KHA
+10A12;AL # KHAROSHTHI LETTER GA
+10A13;AL # KHAROSHTHI LETTER GHA
+10A15;AL # KHAROSHTHI LETTER CA
+10A16;AL # KHAROSHTHI LETTER CHA
+10A17;AL # KHAROSHTHI LETTER JA
+10A19;AL # KHAROSHTHI LETTER NYA
+10A1A;AL # KHAROSHTHI LETTER TTA
+10A1B;AL # KHAROSHTHI LETTER TTHA
+10A1C;AL # KHAROSHTHI LETTER DDA
+10A1D;AL # KHAROSHTHI LETTER DDHA
+10A1E;AL # KHAROSHTHI LETTER NNA
+10A1F;AL # KHAROSHTHI LETTER TA
+10A20;AL # KHAROSHTHI LETTER THA
+10A21;AL # KHAROSHTHI LETTER DA
+10A22;AL # KHAROSHTHI LETTER DHA
+10A23;AL # KHAROSHTHI LETTER NA
+10A24;AL # KHAROSHTHI LETTER PA
+10A25;AL # KHAROSHTHI LETTER PHA
+10A26;AL # KHAROSHTHI LETTER BA
+10A27;AL # KHAROSHTHI LETTER BHA
+10A28;AL # KHAROSHTHI LETTER MA
+10A29;AL # KHAROSHTHI LETTER YA
+10A2A;AL # KHAROSHTHI LETTER RA
+10A2B;AL # KHAROSHTHI LETTER LA
+10A2C;AL # KHAROSHTHI LETTER VA
+10A2D;AL # KHAROSHTHI LETTER SHA
+10A2E;AL # KHAROSHTHI LETTER SSA
+10A2F;AL # KHAROSHTHI LETTER SA
+10A30;AL # KHAROSHTHI LETTER ZA
+10A31;AL # KHAROSHTHI LETTER HA
+10A32;AL # KHAROSHTHI LETTER KKA
+10A33;AL # KHAROSHTHI LETTER TTTHA
+10A38;CM # KHAROSHTHI SIGN BAR ABOVE
+10A39;CM # KHAROSHTHI SIGN CAUDA
+10A3A;CM # KHAROSHTHI SIGN DOT BELOW
+10A3F;CM # KHAROSHTHI VIRAMA
+10A40;AL # KHAROSHTHI DIGIT ONE
+10A41;AL # KHAROSHTHI DIGIT TWO
+10A42;AL # KHAROSHTHI DIGIT THREE
+10A43;AL # KHAROSHTHI DIGIT FOUR
+10A44;AL # KHAROSHTHI NUMBER TEN
+10A45;AL # KHAROSHTHI NUMBER TWENTY
+10A46;AL # KHAROSHTHI NUMBER ONE HUNDRED
+10A47;AL # KHAROSHTHI NUMBER ONE THOUSAND
+10A50;BA # KHAROSHTHI PUNCTUATION DOT
+10A51;BA # KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52;BA # KHAROSHTHI PUNCTUATION CIRCLE
+10A53;BA # KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54;BA # KHAROSHTHI PUNCTUATION MANGALAM
+10A55;BA # KHAROSHTHI PUNCTUATION LOTUS
+10A56;BA # KHAROSHTHI PUNCTUATION DANDA
+10A57;BA # KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58;AL # KHAROSHTHI PUNCTUATION LINES
+1D000;AL # BYZANTINE MUSICAL SYMBOL PSILI
+1D001;AL # BYZANTINE MUSICAL SYMBOL DASEIA
+1D002;AL # BYZANTINE MUSICAL SYMBOL PERISPOMENI
+1D003;AL # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004;AL # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005;AL # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006;AL # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007;AL # BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008;AL # BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009;AL # BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A;AL # BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B;AL # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C;AL # BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D;AL # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E;AL # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F;AL # BYZANTINE MUSICAL SYMBOL TELEIA
+1D010;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013;AL # BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014;AL # BYZANTINE MUSICAL SYMBOL THITA
+1D015;AL # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016;AL # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017;AL # BYZANTINE MUSICAL SYMBOL PSILON
+1D018;AL # BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019;AL # BYZANTINE MUSICAL SYMBOL VATHY
+1D01A;AL # BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B;AL # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D;AL # BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E;AL # BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F;AL # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020;AL # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021;AL # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022;AL # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023;AL # BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024;AL # BYZANTINE MUSICAL SYMBOL KLASMA
+1D025;AL # BYZANTINE MUSICAL SYMBOL REVMA
+1D026;AL # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027;AL # BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028;AL # BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029;AL # BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A;AL # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B;AL # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C;AL # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D;AL # BYZANTINE MUSICAL SYMBOL THEMA
+1D02E;AL # BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F;AL # BYZANTINE MUSICAL SYMBOL DYO
+1D030;AL # BYZANTINE MUSICAL SYMBOL TRIA
+1D031;AL # BYZANTINE MUSICAL SYMBOL TESSERA
+1D032;AL # BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033;AL # BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034;AL # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035;AL # BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036;AL # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037;AL # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038;AL # BYZANTINE MUSICAL SYMBOL PELASTON
+1D039;AL # BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A;AL # BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B;AL # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C;AL # BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D;AL # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E;AL # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F;AL # BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040;AL # BYZANTINE MUSICAL SYMBOL NANA
+1D041;AL # BYZANTINE MUSICAL SYMBOL PETASMA
+1D042;AL # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043;AL # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044;AL # BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045;AL # BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+1D046;AL # BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047;AL # BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048;AL # BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049;AL # BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A;AL # BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B;AL # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C;AL # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D;AL # BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F;AL # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050;AL # BYZANTINE MUSICAL SYMBOL YPSILI
+1D051;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053;AL # BYZANTINE MUSICAL SYMBOL YPORROI
+1D054;AL # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055;AL # BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056;AL # BYZANTINE MUSICAL SYMBOL CHAMILI
+1D057;AL # BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058;AL # BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059;AL # BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A;AL # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B;AL # BYZANTINE MUSICAL SYMBOL OMALON
+1D05C;AL # BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D;AL # BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E;AL # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F;AL # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060;AL # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061;AL # BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062;AL # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063;AL # BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064;AL # BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065;AL # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066;AL # BYZANTINE MUSICAL SYMBOL SYRMA
+1D067;AL # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068;AL # BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069;AL # BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A;AL # BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B;AL # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C;AL # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D;AL # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E;AL # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F;AL # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070;AL # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071;AL # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072;AL # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073;AL # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074;AL # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075;AL # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076;AL # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077;AL # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078;AL # BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079;AL # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A;AL # BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B;AL # BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C;AL # BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D;AL # BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E;AL # BYZANTINE MUSICAL SYMBOL STAVROS
+1D07F;AL # BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080;AL # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081;AL # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082;AL # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083;AL # BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084;AL # BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085;AL # BYZANTINE MUSICAL SYMBOL APLI
+1D086;AL # BYZANTINE MUSICAL SYMBOL DIPLI
+1D087;AL # BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088;AL # BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089;AL # BYZANTINE MUSICAL SYMBOL KORONIS
+1D08A;AL # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B;AL # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C;AL # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D;AL # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E;AL # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+1D08F;AL # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090;AL # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091;AL # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092;AL # BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093;AL # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094;AL # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095;AL # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096;AL # BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097;AL # BYZANTINE MUSICAL SYMBOL ARGON
+1D098;AL # BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099;AL # BYZANTINE MUSICAL SYMBOL DIARGON
+1D09A;AL # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B;AL # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C;AL # BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D;AL # BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E;AL # BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F;AL # BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0;AL # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1;AL # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+1D0A2;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC;AL # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD;AL # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE;AL # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF;AL # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0;AL # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3;AL # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4;AL # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+1D0B5;AL # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6;AL # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7;AL # BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8;AL # BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9;AL # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC;AL # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE;AL # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2;AL # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3;AL # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4;AL # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5;AL # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+1D0C6;AL # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7;AL # BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8;AL # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9;AL # BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA;AL # BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB;AL # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC;AL # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD;AL # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE;AL # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF;AL # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0;AL # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1;AL # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2;AL # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3;AL # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4;AL # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5;AL # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6;AL # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7;AL # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8;AL # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9;AL # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD;AL # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5;AL # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6;AL # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7;AL # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8;AL # BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF;AL # BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+1D0F0;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1;AL # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2;AL # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3;AL # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4;AL # BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5;AL # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100;AL # MUSICAL SYMBOL SINGLE BARLINE
+1D101;AL # MUSICAL SYMBOL DOUBLE BARLINE
+1D102;AL # MUSICAL SYMBOL FINAL BARLINE
+1D103;AL # MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104;AL # MUSICAL SYMBOL DASHED BARLINE
+1D105;AL # MUSICAL SYMBOL SHORT BARLINE
+1D106;AL # MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107;AL # MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108;AL # MUSICAL SYMBOL REPEAT DOTS
+1D109;AL # MUSICAL SYMBOL DAL SEGNO
+1D10A;AL # MUSICAL SYMBOL DA CAPO
+1D10B;AL # MUSICAL SYMBOL SEGNO
+1D10C;AL # MUSICAL SYMBOL CODA
+1D10D;AL # MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E;AL # MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F;AL # MUSICAL SYMBOL REPEATED FIGURE-3
+1D110;AL # MUSICAL SYMBOL FERMATA
+1D111;AL # MUSICAL SYMBOL FERMATA BELOW
+1D112;AL # MUSICAL SYMBOL BREATH MARK
+1D113;AL # MUSICAL SYMBOL CAESURA
+1D114;AL # MUSICAL SYMBOL BRACE
+1D115;AL # MUSICAL SYMBOL BRACKET
+1D116;AL # MUSICAL SYMBOL ONE-LINE STAFF
+1D117;AL # MUSICAL SYMBOL TWO-LINE STAFF
+1D118;AL # MUSICAL SYMBOL THREE-LINE STAFF
+1D119;AL # MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A;AL # MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B;AL # MUSICAL SYMBOL SIX-LINE STAFF
+1D11C;AL # MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D;AL # MUSICAL SYMBOL FOUR-STRING FRETBOARD
+1D11E;AL # MUSICAL SYMBOL G CLEF
+1D11F;AL # MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120;AL # MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121;AL # MUSICAL SYMBOL C CLEF
+1D122;AL # MUSICAL SYMBOL F CLEF
+1D123;AL # MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124;AL # MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125;AL # MUSICAL SYMBOL DRUM CLEF-1
+1D126;AL # MUSICAL SYMBOL DRUM CLEF-2
+1D12A;AL # MUSICAL SYMBOL DOUBLE SHARP
+1D12B;AL # MUSICAL SYMBOL DOUBLE FLAT
+1D12C;AL # MUSICAL SYMBOL FLAT UP
+1D12D;AL # MUSICAL SYMBOL FLAT DOWN
+1D12E;AL # MUSICAL SYMBOL NATURAL UP
+1D12F;AL # MUSICAL SYMBOL NATURAL DOWN
+1D130;AL # MUSICAL SYMBOL SHARP UP
+1D131;AL # MUSICAL SYMBOL SHARP DOWN
+1D132;AL # MUSICAL SYMBOL QUARTER TONE SHARP
+1D133;AL # MUSICAL SYMBOL QUARTER TONE FLAT
+1D134;AL # MUSICAL SYMBOL COMMON TIME
+1D135;AL # MUSICAL SYMBOL CUT TIME
+1D136;AL # MUSICAL SYMBOL OTTAVA ALTA
+1D137;AL # MUSICAL SYMBOL OTTAVA BASSA
+1D138;AL # MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139;AL # MUSICAL SYMBOL QUINDICESIMA BASSA
+1D13A;AL # MUSICAL SYMBOL MULTI REST
+1D13B;AL # MUSICAL SYMBOL WHOLE REST
+1D13C;AL # MUSICAL SYMBOL HALF REST
+1D13D;AL # MUSICAL SYMBOL QUARTER REST
+1D13E;AL # MUSICAL SYMBOL EIGHTH REST
+1D13F;AL # MUSICAL SYMBOL SIXTEENTH REST
+1D140;AL # MUSICAL SYMBOL THIRTY-SECOND REST
+1D141;AL # MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142;AL # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+1D143;AL # MUSICAL SYMBOL X NOTEHEAD
+1D144;AL # MUSICAL SYMBOL PLUS NOTEHEAD
+1D145;AL # MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146;AL # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147;AL # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151;AL # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152;AL # MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153;AL # MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154;AL # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155;AL # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156;AL # MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157;AL # MUSICAL SYMBOL VOID NOTEHEAD
+1D158;AL # MUSICAL SYMBOL NOTEHEAD BLACK
+1D159;AL # MUSICAL SYMBOL NULL NOTEHEAD
+1D15A;AL # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B;AL # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+1D15C;AL # MUSICAL SYMBOL BREVE
+1D15D;AL # MUSICAL SYMBOL WHOLE NOTE
+1D15E;AL # MUSICAL SYMBOL HALF NOTE
+1D15F;AL # MUSICAL SYMBOL QUARTER NOTE
+1D160;AL # MUSICAL SYMBOL EIGHTH NOTE
+1D161;AL # MUSICAL SYMBOL SIXTEENTH NOTE
+1D162;AL # MUSICAL SYMBOL THIRTY-SECOND NOTE
+1D163;AL # MUSICAL SYMBOL SIXTY-FOURTH NOTE
+1D164;AL # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165;CM # MUSICAL SYMBOL COMBINING STEM
+1D166;CM # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167;CM # MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168;CM # MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169;CM # MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A;AL # MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B;AL # MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C;AL # MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D;CM # MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D16E;CM # MUSICAL SYMBOL COMBINING FLAG-1
+1D16F;CM # MUSICAL SYMBOL COMBINING FLAG-2
+1D170;CM # MUSICAL SYMBOL COMBINING FLAG-3
+1D171;CM # MUSICAL SYMBOL COMBINING FLAG-4
+1D172;CM # MUSICAL SYMBOL COMBINING FLAG-5
+1D173;CM # MUSICAL SYMBOL BEGIN BEAM
+1D174;CM # MUSICAL SYMBOL END BEAM
+1D175;CM # MUSICAL SYMBOL BEGIN TIE
+1D176;CM # MUSICAL SYMBOL END TIE
+1D177;CM # MUSICAL SYMBOL BEGIN SLUR
+1D178;CM # MUSICAL SYMBOL END SLUR
+1D179;CM # MUSICAL SYMBOL BEGIN PHRASE
+1D17A;CM # MUSICAL SYMBOL END PHRASE
+1D17B;CM # MUSICAL SYMBOL COMBINING ACCENT
+1D17C;CM # MUSICAL SYMBOL COMBINING STACCATO
+1D17D;CM # MUSICAL SYMBOL COMBINING TENUTO
+1D17E;CM # MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F;CM # MUSICAL SYMBOL COMBINING MARCATO
+1D180;CM # MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181;CM # MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182;CM # MUSICAL SYMBOL COMBINING LOURE
+1D183;AL # MUSICAL SYMBOL ARPEGGIATO UP
+1D184;AL # MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185;CM # MUSICAL SYMBOL COMBINING DOIT
+1D186;CM # MUSICAL SYMBOL COMBINING RIP
+1D187;CM # MUSICAL SYMBOL COMBINING FLIP
+1D188;CM # MUSICAL SYMBOL COMBINING SMEAR
+1D189;CM # MUSICAL SYMBOL COMBINING BEND
+1D18A;CM # MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B;CM # MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C;AL # MUSICAL SYMBOL RINFORZANDO
+1D18D;AL # MUSICAL SYMBOL SUBITO
+1D18E;AL # MUSICAL SYMBOL Z
+1D18F;AL # MUSICAL SYMBOL PIANO
+1D190;AL # MUSICAL SYMBOL MEZZO
+1D191;AL # MUSICAL SYMBOL FORTE
+1D192;AL # MUSICAL SYMBOL CRESCENDO
+1D193;AL # MUSICAL SYMBOL DECRESCENDO
+1D194;AL # MUSICAL SYMBOL GRACE NOTE SLASH
+1D195;AL # MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196;AL # MUSICAL SYMBOL TR
+1D197;AL # MUSICAL SYMBOL TURN
+1D198;AL # MUSICAL SYMBOL INVERTED TURN
+1D199;AL # MUSICAL SYMBOL TURN SLASH
+1D19A;AL # MUSICAL SYMBOL TURN UP
+1D19B;AL # MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C;AL # MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D;AL # MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E;AL # MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F;AL # MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0;AL # MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1;AL # MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2;AL # MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3;AL # MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4;AL # MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5;AL # MUSICAL SYMBOL ORNAMENT STROKE-11
+1D1A6;AL # MUSICAL SYMBOL HAUPTSTIMME
+1D1A7;AL # MUSICAL SYMBOL NEBENSTIMME
+1D1A8;AL # MUSICAL SYMBOL END OF STIMME
+1D1A9;AL # MUSICAL SYMBOL DEGREE SLASH
+1D1AA;CM # MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB;CM # MUSICAL SYMBOL COMBINING UP BOW
+1D1AC;CM # MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD;CM # MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE;AL # MUSICAL SYMBOL PEDAL MARK
+1D1AF;AL # MUSICAL SYMBOL PEDAL UP MARK
+1D1B0;AL # MUSICAL SYMBOL HALF PEDAL MARK
+1D1B1;AL # MUSICAL SYMBOL GLISSANDO UP
+1D1B2;AL # MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3;AL # MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4;AL # MUSICAL SYMBOL DAMP
+1D1B5;AL # MUSICAL SYMBOL DAMP ALL
+1D1B6;AL # MUSICAL SYMBOL MAXIMA
+1D1B7;AL # MUSICAL SYMBOL LONGA
+1D1B8;AL # MUSICAL SYMBOL BREVIS
+1D1B9;AL # MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA;AL # MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB;AL # MUSICAL SYMBOL MINIMA
+1D1BC;AL # MUSICAL SYMBOL MINIMA BLACK
+1D1BD;AL # MUSICAL SYMBOL SEMIMINIMA WHITE
+1D1BE;AL # MUSICAL SYMBOL SEMIMINIMA BLACK
+1D1BF;AL # MUSICAL SYMBOL FUSA WHITE
+1D1C0;AL # MUSICAL SYMBOL FUSA BLACK
+1D1C1;AL # MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2;AL # MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3;AL # MUSICAL SYMBOL BREVIS REST
+1D1C4;AL # MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5;AL # MUSICAL SYMBOL MINIMA REST
+1D1C6;AL # MUSICAL SYMBOL SEMIMINIMA REST
+1D1C7;AL # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8;AL # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9;AL # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE;AL # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+1D1CF;AL # MUSICAL SYMBOL CROIX
+1D1D0;AL # MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1;AL # MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2;AL # MUSICAL SYMBOL SQUARE B
+1D1D3;AL # MUSICAL SYMBOL VIRGA
+1D1D4;AL # MUSICAL SYMBOL PODATUS
+1D1D5;AL # MUSICAL SYMBOL CLIVIS
+1D1D6;AL # MUSICAL SYMBOL SCANDICUS
+1D1D7;AL # MUSICAL SYMBOL CLIMACUS
+1D1D8;AL # MUSICAL SYMBOL TORCULUS
+1D1D9;AL # MUSICAL SYMBOL PORRECTUS
+1D1DA;AL # MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB;AL # MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC;AL # MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD;AL # MUSICAL SYMBOL PES SUBPUNCTIS
+1D200;AL # GREEK VOCAL NOTATION SYMBOL-1
+1D201;AL # GREEK VOCAL NOTATION SYMBOL-2
+1D202;AL # GREEK VOCAL NOTATION SYMBOL-3
+1D203;AL # GREEK VOCAL NOTATION SYMBOL-4
+1D204;AL # GREEK VOCAL NOTATION SYMBOL-5
+1D205;AL # GREEK VOCAL NOTATION SYMBOL-6
+1D206;AL # GREEK VOCAL NOTATION SYMBOL-7
+1D207;AL # GREEK VOCAL NOTATION SYMBOL-8
+1D208;AL # GREEK VOCAL NOTATION SYMBOL-9
+1D209;AL # GREEK VOCAL NOTATION SYMBOL-10
+1D20A;AL # GREEK VOCAL NOTATION SYMBOL-11
+1D20B;AL # GREEK VOCAL NOTATION SYMBOL-12
+1D20C;AL # GREEK VOCAL NOTATION SYMBOL-13
+1D20D;AL # GREEK VOCAL NOTATION SYMBOL-14
+1D20E;AL # GREEK VOCAL NOTATION SYMBOL-15
+1D20F;AL # GREEK VOCAL NOTATION SYMBOL-16
+1D210;AL # GREEK VOCAL NOTATION SYMBOL-17
+1D211;AL # GREEK VOCAL NOTATION SYMBOL-18
+1D212;AL # GREEK VOCAL NOTATION SYMBOL-19
+1D213;AL # GREEK VOCAL NOTATION SYMBOL-20
+1D214;AL # GREEK VOCAL NOTATION SYMBOL-21
+1D215;AL # GREEK VOCAL NOTATION SYMBOL-22
+1D216;AL # GREEK VOCAL NOTATION SYMBOL-23
+1D217;AL # GREEK VOCAL NOTATION SYMBOL-24
+1D218;AL # GREEK VOCAL NOTATION SYMBOL-50
+1D219;AL # GREEK VOCAL NOTATION SYMBOL-51
+1D21A;AL # GREEK VOCAL NOTATION SYMBOL-52
+1D21B;AL # GREEK VOCAL NOTATION SYMBOL-53
+1D21C;AL # GREEK VOCAL NOTATION SYMBOL-54
+1D21D;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-1
+1D21E;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-2
+1D21F;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-4
+1D220;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-5
+1D221;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-7
+1D222;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-8
+1D223;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-11
+1D224;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-12
+1D225;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-13
+1D226;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-14
+1D227;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-17
+1D228;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-18
+1D229;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-19
+1D22A;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-23
+1D22B;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-24
+1D22C;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-25
+1D22D;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-26
+1D22E;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-27
+1D22F;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-29
+1D230;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-30
+1D231;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-32
+1D232;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-36
+1D233;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-37
+1D234;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-38
+1D235;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-39
+1D236;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-40
+1D237;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-42
+1D238;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-43
+1D239;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-45
+1D23A;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-47
+1D23B;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-48
+1D23C;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-49
+1D23D;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-50
+1D23E;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-51
+1D23F;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-52
+1D240;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-53
+1D241;AL # GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242;CM # COMBINING GREEK MUSICAL TRISEME
+1D243;CM # COMBINING GREEK MUSICAL TETRASEME
+1D244;CM # COMBINING GREEK MUSICAL PENTASEME
+1D245;AL # GREEK MUSICAL LEIMMA
+1D300;AL # MONOGRAM FOR EARTH
+1D301;AL # DIGRAM FOR HEAVENLY EARTH
+1D302;AL # DIGRAM FOR HUMAN EARTH
+1D303;AL # DIGRAM FOR EARTHLY HEAVEN
+1D304;AL # DIGRAM FOR EARTHLY HUMAN
+1D305;AL # DIGRAM FOR EARTH
+1D306;AL # TETRAGRAM FOR CENTRE
+1D307;AL # TETRAGRAM FOR FULL CIRCLE
+1D308;AL # TETRAGRAM FOR MIRED
+1D309;AL # TETRAGRAM FOR BARRIER
+1D30A;AL # TETRAGRAM FOR KEEPING SMALL
+1D30B;AL # TETRAGRAM FOR CONTRARIETY
+1D30C;AL # TETRAGRAM FOR ASCENT
+1D30D;AL # TETRAGRAM FOR OPPOSITION
+1D30E;AL # TETRAGRAM FOR BRANCHING OUT
+1D30F;AL # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310;AL # TETRAGRAM FOR DIVERGENCE
+1D311;AL # TETRAGRAM FOR YOUTHFULNESS
+1D312;AL # TETRAGRAM FOR INCREASE
+1D313;AL # TETRAGRAM FOR PENETRATION
+1D314;AL # TETRAGRAM FOR REACH
+1D315;AL # TETRAGRAM FOR CONTACT
+1D316;AL # TETRAGRAM FOR HOLDING BACK
+1D317;AL # TETRAGRAM FOR WAITING
+1D318;AL # TETRAGRAM FOR FOLLOWING
+1D319;AL # TETRAGRAM FOR ADVANCE
+1D31A;AL # TETRAGRAM FOR RELEASE
+1D31B;AL # TETRAGRAM FOR RESISTANCE
+1D31C;AL # TETRAGRAM FOR EASE
+1D31D;AL # TETRAGRAM FOR JOY
+1D31E;AL # TETRAGRAM FOR CONTENTION
+1D31F;AL # TETRAGRAM FOR ENDEAVOUR
+1D320;AL # TETRAGRAM FOR DUTIES
+1D321;AL # TETRAGRAM FOR CHANGE
+1D322;AL # TETRAGRAM FOR DECISIVENESS
+1D323;AL # TETRAGRAM FOR BOLD RESOLUTION
+1D324;AL # TETRAGRAM FOR PACKING
+1D325;AL # TETRAGRAM FOR LEGION
+1D326;AL # TETRAGRAM FOR CLOSENESS
+1D327;AL # TETRAGRAM FOR KINSHIP
+1D328;AL # TETRAGRAM FOR GATHERING
+1D329;AL # TETRAGRAM FOR STRENGTH
+1D32A;AL # TETRAGRAM FOR PURITY
+1D32B;AL # TETRAGRAM FOR FULLNESS
+1D32C;AL # TETRAGRAM FOR RESIDENCE
+1D32D;AL # TETRAGRAM FOR LAW OR MODEL
+1D32E;AL # TETRAGRAM FOR RESPONSE
+1D32F;AL # TETRAGRAM FOR GOING TO MEET
+1D330;AL # TETRAGRAM FOR ENCOUNTERS
+1D331;AL # TETRAGRAM FOR STOVE
+1D332;AL # TETRAGRAM FOR GREATNESS
+1D333;AL # TETRAGRAM FOR ENLARGEMENT
+1D334;AL # TETRAGRAM FOR PATTERN
+1D335;AL # TETRAGRAM FOR RITUAL
+1D336;AL # TETRAGRAM FOR FLIGHT
+1D337;AL # TETRAGRAM FOR VASTNESS OR WASTING
+1D338;AL # TETRAGRAM FOR CONSTANCY
+1D339;AL # TETRAGRAM FOR MEASURE
+1D33A;AL # TETRAGRAM FOR ETERNITY
+1D33B;AL # TETRAGRAM FOR UNITY
+1D33C;AL # TETRAGRAM FOR DIMINISHMENT
+1D33D;AL # TETRAGRAM FOR CLOSED MOUTH
+1D33E;AL # TETRAGRAM FOR GUARDEDNESS
+1D33F;AL # TETRAGRAM FOR GATHERING IN
+1D340;AL # TETRAGRAM FOR MASSING
+1D341;AL # TETRAGRAM FOR ACCUMULATION
+1D342;AL # TETRAGRAM FOR EMBELLISHMENT
+1D343;AL # TETRAGRAM FOR DOUBT
+1D344;AL # TETRAGRAM FOR WATCH
+1D345;AL # TETRAGRAM FOR SINKING
+1D346;AL # TETRAGRAM FOR INNER
+1D347;AL # TETRAGRAM FOR DEPARTURE
+1D348;AL # TETRAGRAM FOR DARKENING
+1D349;AL # TETRAGRAM FOR DIMMING
+1D34A;AL # TETRAGRAM FOR EXHAUSTION
+1D34B;AL # TETRAGRAM FOR SEVERANCE
+1D34C;AL # TETRAGRAM FOR STOPPAGE
+1D34D;AL # TETRAGRAM FOR HARDNESS
+1D34E;AL # TETRAGRAM FOR COMPLETION
+1D34F;AL # TETRAGRAM FOR CLOSURE
+1D350;AL # TETRAGRAM FOR FAILURE
+1D351;AL # TETRAGRAM FOR AGGRAVATION
+1D352;AL # TETRAGRAM FOR COMPLIANCE
+1D353;AL # TETRAGRAM FOR ON THE VERGE
+1D354;AL # TETRAGRAM FOR DIFFICULTIES
+1D355;AL # TETRAGRAM FOR LABOURING
+1D356;AL # TETRAGRAM FOR FOSTERING
+1D400;AL # MATHEMATICAL BOLD CAPITAL A
+1D401;AL # MATHEMATICAL BOLD CAPITAL B
+1D402;AL # MATHEMATICAL BOLD CAPITAL C
+1D403;AL # MATHEMATICAL BOLD CAPITAL D
+1D404;AL # MATHEMATICAL BOLD CAPITAL E
+1D405;AL # MATHEMATICAL BOLD CAPITAL F
+1D406;AL # MATHEMATICAL BOLD CAPITAL G
+1D407;AL # MATHEMATICAL BOLD CAPITAL H
+1D408;AL # MATHEMATICAL BOLD CAPITAL I
+1D409;AL # MATHEMATICAL BOLD CAPITAL J
+1D40A;AL # MATHEMATICAL BOLD CAPITAL K
+1D40B;AL # MATHEMATICAL BOLD CAPITAL L
+1D40C;AL # MATHEMATICAL BOLD CAPITAL M
+1D40D;AL # MATHEMATICAL BOLD CAPITAL N
+1D40E;AL # MATHEMATICAL BOLD CAPITAL O
+1D40F;AL # MATHEMATICAL BOLD CAPITAL P
+1D410;AL # MATHEMATICAL BOLD CAPITAL Q
+1D411;AL # MATHEMATICAL BOLD CAPITAL R
+1D412;AL # MATHEMATICAL BOLD CAPITAL S
+1D413;AL # MATHEMATICAL BOLD CAPITAL T
+1D414;AL # MATHEMATICAL BOLD CAPITAL U
+1D415;AL # MATHEMATICAL BOLD CAPITAL V
+1D416;AL # MATHEMATICAL BOLD CAPITAL W
+1D417;AL # MATHEMATICAL BOLD CAPITAL X
+1D418;AL # MATHEMATICAL BOLD CAPITAL Y
+1D419;AL # MATHEMATICAL BOLD CAPITAL Z
+1D41A;AL # MATHEMATICAL BOLD SMALL A
+1D41B;AL # MATHEMATICAL BOLD SMALL B
+1D41C;AL # MATHEMATICAL BOLD SMALL C
+1D41D;AL # MATHEMATICAL BOLD SMALL D
+1D41E;AL # MATHEMATICAL BOLD SMALL E
+1D41F;AL # MATHEMATICAL BOLD SMALL F
+1D420;AL # MATHEMATICAL BOLD SMALL G
+1D421;AL # MATHEMATICAL BOLD SMALL H
+1D422;AL # MATHEMATICAL BOLD SMALL I
+1D423;AL # MATHEMATICAL BOLD SMALL J
+1D424;AL # MATHEMATICAL BOLD SMALL K
+1D425;AL # MATHEMATICAL BOLD SMALL L
+1D426;AL # MATHEMATICAL BOLD SMALL M
+1D427;AL # MATHEMATICAL BOLD SMALL N
+1D428;AL # MATHEMATICAL BOLD SMALL O
+1D429;AL # MATHEMATICAL BOLD SMALL P
+1D42A;AL # MATHEMATICAL BOLD SMALL Q
+1D42B;AL # MATHEMATICAL BOLD SMALL R
+1D42C;AL # MATHEMATICAL BOLD SMALL S
+1D42D;AL # MATHEMATICAL BOLD SMALL T
+1D42E;AL # MATHEMATICAL BOLD SMALL U
+1D42F;AL # MATHEMATICAL BOLD SMALL V
+1D430;AL # MATHEMATICAL BOLD SMALL W
+1D431;AL # MATHEMATICAL BOLD SMALL X
+1D432;AL # MATHEMATICAL BOLD SMALL Y
+1D433;AL # MATHEMATICAL BOLD SMALL Z
+1D434;AL # MATHEMATICAL ITALIC CAPITAL A
+1D435;AL # MATHEMATICAL ITALIC CAPITAL B
+1D436;AL # MATHEMATICAL ITALIC CAPITAL C
+1D437;AL # MATHEMATICAL ITALIC CAPITAL D
+1D438;AL # MATHEMATICAL ITALIC CAPITAL E
+1D439;AL # MATHEMATICAL ITALIC CAPITAL F
+1D43A;AL # MATHEMATICAL ITALIC CAPITAL G
+1D43B;AL # MATHEMATICAL ITALIC CAPITAL H
+1D43C;AL # MATHEMATICAL ITALIC CAPITAL I
+1D43D;AL # MATHEMATICAL ITALIC CAPITAL J
+1D43E;AL # MATHEMATICAL ITALIC CAPITAL K
+1D43F;AL # MATHEMATICAL ITALIC CAPITAL L
+1D440;AL # MATHEMATICAL ITALIC CAPITAL M
+1D441;AL # MATHEMATICAL ITALIC CAPITAL N
+1D442;AL # MATHEMATICAL ITALIC CAPITAL O
+1D443;AL # MATHEMATICAL ITALIC CAPITAL P
+1D444;AL # MATHEMATICAL ITALIC CAPITAL Q
+1D445;AL # MATHEMATICAL ITALIC CAPITAL R
+1D446;AL # MATHEMATICAL ITALIC CAPITAL S
+1D447;AL # MATHEMATICAL ITALIC CAPITAL T
+1D448;AL # MATHEMATICAL ITALIC CAPITAL U
+1D449;AL # MATHEMATICAL ITALIC CAPITAL V
+1D44A;AL # MATHEMATICAL ITALIC CAPITAL W
+1D44B;AL # MATHEMATICAL ITALIC CAPITAL X
+1D44C;AL # MATHEMATICAL ITALIC CAPITAL Y
+1D44D;AL # MATHEMATICAL ITALIC CAPITAL Z
+1D44E;AL # MATHEMATICAL ITALIC SMALL A
+1D44F;AL # MATHEMATICAL ITALIC SMALL B
+1D450;AL # MATHEMATICAL ITALIC SMALL C
+1D451;AL # MATHEMATICAL ITALIC SMALL D
+1D452;AL # MATHEMATICAL ITALIC SMALL E
+1D453;AL # MATHEMATICAL ITALIC SMALL F
+1D454;AL # MATHEMATICAL ITALIC SMALL G
+1D456;AL # MATHEMATICAL ITALIC SMALL I
+1D457;AL # MATHEMATICAL ITALIC SMALL J
+1D458;AL # MATHEMATICAL ITALIC SMALL K
+1D459;AL # MATHEMATICAL ITALIC SMALL L
+1D45A;AL # MATHEMATICAL ITALIC SMALL M
+1D45B;AL # MATHEMATICAL ITALIC SMALL N
+1D45C;AL # MATHEMATICAL ITALIC SMALL O
+1D45D;AL # MATHEMATICAL ITALIC SMALL P
+1D45E;AL # MATHEMATICAL ITALIC SMALL Q
+1D45F;AL # MATHEMATICAL ITALIC SMALL R
+1D460;AL # MATHEMATICAL ITALIC SMALL S
+1D461;AL # MATHEMATICAL ITALIC SMALL T
+1D462;AL # MATHEMATICAL ITALIC SMALL U
+1D463;AL # MATHEMATICAL ITALIC SMALL V
+1D464;AL # MATHEMATICAL ITALIC SMALL W
+1D465;AL # MATHEMATICAL ITALIC SMALL X
+1D466;AL # MATHEMATICAL ITALIC SMALL Y
+1D467;AL # MATHEMATICAL ITALIC SMALL Z
+1D468;AL # MATHEMATICAL BOLD ITALIC CAPITAL A
+1D469;AL # MATHEMATICAL BOLD ITALIC CAPITAL B
+1D46A;AL # MATHEMATICAL BOLD ITALIC CAPITAL C
+1D46B;AL # MATHEMATICAL BOLD ITALIC CAPITAL D
+1D46C;AL # MATHEMATICAL BOLD ITALIC CAPITAL E
+1D46D;AL # MATHEMATICAL BOLD ITALIC CAPITAL F
+1D46E;AL # MATHEMATICAL BOLD ITALIC CAPITAL G
+1D46F;AL # MATHEMATICAL BOLD ITALIC CAPITAL H
+1D470;AL # MATHEMATICAL BOLD ITALIC CAPITAL I
+1D471;AL # MATHEMATICAL BOLD ITALIC CAPITAL J
+1D472;AL # MATHEMATICAL BOLD ITALIC CAPITAL K
+1D473;AL # MATHEMATICAL BOLD ITALIC CAPITAL L
+1D474;AL # MATHEMATICAL BOLD ITALIC CAPITAL M
+1D475;AL # MATHEMATICAL BOLD ITALIC CAPITAL N
+1D476;AL # MATHEMATICAL BOLD ITALIC CAPITAL O
+1D477;AL # MATHEMATICAL BOLD ITALIC CAPITAL P
+1D478;AL # MATHEMATICAL BOLD ITALIC CAPITAL Q
+1D479;AL # MATHEMATICAL BOLD ITALIC CAPITAL R
+1D47A;AL # MATHEMATICAL BOLD ITALIC CAPITAL S
+1D47B;AL # MATHEMATICAL BOLD ITALIC CAPITAL T
+1D47C;AL # MATHEMATICAL BOLD ITALIC CAPITAL U
+1D47D;AL # MATHEMATICAL BOLD ITALIC CAPITAL V
+1D47E;AL # MATHEMATICAL BOLD ITALIC CAPITAL W
+1D47F;AL # MATHEMATICAL BOLD ITALIC CAPITAL X
+1D480;AL # MATHEMATICAL BOLD ITALIC CAPITAL Y
+1D481;AL # MATHEMATICAL BOLD ITALIC CAPITAL Z
+1D482;AL # MATHEMATICAL BOLD ITALIC SMALL A
+1D483;AL # MATHEMATICAL BOLD ITALIC SMALL B
+1D484;AL # MATHEMATICAL BOLD ITALIC SMALL C
+1D485;AL # MATHEMATICAL BOLD ITALIC SMALL D
+1D486;AL # MATHEMATICAL BOLD ITALIC SMALL E
+1D487;AL # MATHEMATICAL BOLD ITALIC SMALL F
+1D488;AL # MATHEMATICAL BOLD ITALIC SMALL G
+1D489;AL # MATHEMATICAL BOLD ITALIC SMALL H
+1D48A;AL # MATHEMATICAL BOLD ITALIC SMALL I
+1D48B;AL # MATHEMATICAL BOLD ITALIC SMALL J
+1D48C;AL # MATHEMATICAL BOLD ITALIC SMALL K
+1D48D;AL # MATHEMATICAL BOLD ITALIC SMALL L
+1D48E;AL # MATHEMATICAL BOLD ITALIC SMALL M
+1D48F;AL # MATHEMATICAL BOLD ITALIC SMALL N
+1D490;AL # MATHEMATICAL BOLD ITALIC SMALL O
+1D491;AL # MATHEMATICAL BOLD ITALIC SMALL P
+1D492;AL # MATHEMATICAL BOLD ITALIC SMALL Q
+1D493;AL # MATHEMATICAL BOLD ITALIC SMALL R
+1D494;AL # MATHEMATICAL BOLD ITALIC SMALL S
+1D495;AL # MATHEMATICAL BOLD ITALIC SMALL T
+1D496;AL # MATHEMATICAL BOLD ITALIC SMALL U
+1D497;AL # MATHEMATICAL BOLD ITALIC SMALL V
+1D498;AL # MATHEMATICAL BOLD ITALIC SMALL W
+1D499;AL # MATHEMATICAL BOLD ITALIC SMALL X
+1D49A;AL # MATHEMATICAL BOLD ITALIC SMALL Y
+1D49B;AL # MATHEMATICAL BOLD ITALIC SMALL Z
+1D49C;AL # MATHEMATICAL SCRIPT CAPITAL A
+1D49E;AL # MATHEMATICAL SCRIPT CAPITAL C
+1D49F;AL # MATHEMATICAL SCRIPT CAPITAL D
+1D4A2;AL # MATHEMATICAL SCRIPT CAPITAL G
+1D4A5;AL # MATHEMATICAL SCRIPT CAPITAL J
+1D4A6;AL # MATHEMATICAL SCRIPT CAPITAL K
+1D4A9;AL # MATHEMATICAL SCRIPT CAPITAL N
+1D4AA;AL # MATHEMATICAL SCRIPT CAPITAL O
+1D4AB;AL # MATHEMATICAL SCRIPT CAPITAL P
+1D4AC;AL # MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE;AL # MATHEMATICAL SCRIPT CAPITAL S
+1D4AF;AL # MATHEMATICAL SCRIPT CAPITAL T
+1D4B0;AL # MATHEMATICAL SCRIPT CAPITAL U
+1D4B1;AL # MATHEMATICAL SCRIPT CAPITAL V
+1D4B2;AL # MATHEMATICAL SCRIPT CAPITAL W
+1D4B3;AL # MATHEMATICAL SCRIPT CAPITAL X
+1D4B4;AL # MATHEMATICAL SCRIPT CAPITAL Y
+1D4B5;AL # MATHEMATICAL SCRIPT CAPITAL Z
+1D4B6;AL # MATHEMATICAL SCRIPT SMALL A
+1D4B7;AL # MATHEMATICAL SCRIPT SMALL B
+1D4B8;AL # MATHEMATICAL SCRIPT SMALL C
+1D4B9;AL # MATHEMATICAL SCRIPT SMALL D
+1D4BB;AL # MATHEMATICAL SCRIPT SMALL F
+1D4BD;AL # MATHEMATICAL SCRIPT SMALL H
+1D4BE;AL # MATHEMATICAL SCRIPT SMALL I
+1D4BF;AL # MATHEMATICAL SCRIPT SMALL J
+1D4C0;AL # MATHEMATICAL SCRIPT SMALL K
+1D4C1;AL # MATHEMATICAL SCRIPT SMALL L
+1D4C2;AL # MATHEMATICAL SCRIPT SMALL M
+1D4C3;AL # MATHEMATICAL SCRIPT SMALL N
+1D4C5;AL # MATHEMATICAL SCRIPT SMALL P
+1D4C6;AL # MATHEMATICAL SCRIPT SMALL Q
+1D4C7;AL # MATHEMATICAL SCRIPT SMALL R
+1D4C8;AL # MATHEMATICAL SCRIPT SMALL S
+1D4C9;AL # MATHEMATICAL SCRIPT SMALL T
+1D4CA;AL # MATHEMATICAL SCRIPT SMALL U
+1D4CB;AL # MATHEMATICAL SCRIPT SMALL V
+1D4CC;AL # MATHEMATICAL SCRIPT SMALL W
+1D4CD;AL # MATHEMATICAL SCRIPT SMALL X
+1D4CE;AL # MATHEMATICAL SCRIPT SMALL Y
+1D4CF;AL # MATHEMATICAL SCRIPT SMALL Z
+1D4D0;AL # MATHEMATICAL BOLD SCRIPT CAPITAL A
+1D4D1;AL # MATHEMATICAL BOLD SCRIPT CAPITAL B
+1D4D2;AL # MATHEMATICAL BOLD SCRIPT CAPITAL C
+1D4D3;AL # MATHEMATICAL BOLD SCRIPT CAPITAL D
+1D4D4;AL # MATHEMATICAL BOLD SCRIPT CAPITAL E
+1D4D5;AL # MATHEMATICAL BOLD SCRIPT CAPITAL F
+1D4D6;AL # MATHEMATICAL BOLD SCRIPT CAPITAL G
+1D4D7;AL # MATHEMATICAL BOLD SCRIPT CAPITAL H
+1D4D8;AL # MATHEMATICAL BOLD SCRIPT CAPITAL I
+1D4D9;AL # MATHEMATICAL BOLD SCRIPT CAPITAL J
+1D4DA;AL # MATHEMATICAL BOLD SCRIPT CAPITAL K
+1D4DB;AL # MATHEMATICAL BOLD SCRIPT CAPITAL L
+1D4DC;AL # MATHEMATICAL BOLD SCRIPT CAPITAL M
+1D4DD;AL # MATHEMATICAL BOLD SCRIPT CAPITAL N
+1D4DE;AL # MATHEMATICAL BOLD SCRIPT CAPITAL O
+1D4DF;AL # MATHEMATICAL BOLD SCRIPT CAPITAL P
+1D4E0;AL # MATHEMATICAL BOLD SCRIPT CAPITAL Q
+1D4E1;AL # MATHEMATICAL BOLD SCRIPT CAPITAL R
+1D4E2;AL # MATHEMATICAL BOLD SCRIPT CAPITAL S
+1D4E3;AL # MATHEMATICAL BOLD SCRIPT CAPITAL T
+1D4E4;AL # MATHEMATICAL BOLD SCRIPT CAPITAL U
+1D4E5;AL # MATHEMATICAL BOLD SCRIPT CAPITAL V
+1D4E6;AL # MATHEMATICAL BOLD SCRIPT CAPITAL W
+1D4E7;AL # MATHEMATICAL BOLD SCRIPT CAPITAL X
+1D4E8;AL # MATHEMATICAL BOLD SCRIPT CAPITAL Y
+1D4E9;AL # MATHEMATICAL BOLD SCRIPT CAPITAL Z
+1D4EA;AL # MATHEMATICAL BOLD SCRIPT SMALL A
+1D4EB;AL # MATHEMATICAL BOLD SCRIPT SMALL B
+1D4EC;AL # MATHEMATICAL BOLD SCRIPT SMALL C
+1D4ED;AL # MATHEMATICAL BOLD SCRIPT SMALL D
+1D4EE;AL # MATHEMATICAL BOLD SCRIPT SMALL E
+1D4EF;AL # MATHEMATICAL BOLD SCRIPT SMALL F
+1D4F0;AL # MATHEMATICAL BOLD SCRIPT SMALL G
+1D4F1;AL # MATHEMATICAL BOLD SCRIPT SMALL H
+1D4F2;AL # MATHEMATICAL BOLD SCRIPT SMALL I
+1D4F3;AL # MATHEMATICAL BOLD SCRIPT SMALL J
+1D4F4;AL # MATHEMATICAL BOLD SCRIPT SMALL K
+1D4F5;AL # MATHEMATICAL BOLD SCRIPT SMALL L
+1D4F6;AL # MATHEMATICAL BOLD SCRIPT SMALL M
+1D4F7;AL # MATHEMATICAL BOLD SCRIPT SMALL N
+1D4F8;AL # MATHEMATICAL BOLD SCRIPT SMALL O
+1D4F9;AL # MATHEMATICAL BOLD SCRIPT SMALL P
+1D4FA;AL # MATHEMATICAL BOLD SCRIPT SMALL Q
+1D4FB;AL # MATHEMATICAL BOLD SCRIPT SMALL R
+1D4FC;AL # MATHEMATICAL BOLD SCRIPT SMALL S
+1D4FD;AL # MATHEMATICAL BOLD SCRIPT SMALL T
+1D4FE;AL # MATHEMATICAL BOLD SCRIPT SMALL U
+1D4FF;AL # MATHEMATICAL BOLD SCRIPT SMALL V
+1D500;AL # MATHEMATICAL BOLD SCRIPT SMALL W
+1D501;AL # MATHEMATICAL BOLD SCRIPT SMALL X
+1D502;AL # MATHEMATICAL BOLD SCRIPT SMALL Y
+1D503;AL # MATHEMATICAL BOLD SCRIPT SMALL Z
+1D504;AL # MATHEMATICAL FRAKTUR CAPITAL A
+1D505;AL # MATHEMATICAL FRAKTUR CAPITAL B
+1D507;AL # MATHEMATICAL FRAKTUR CAPITAL D
+1D508;AL # MATHEMATICAL FRAKTUR CAPITAL E
+1D509;AL # MATHEMATICAL FRAKTUR CAPITAL F
+1D50A;AL # MATHEMATICAL FRAKTUR CAPITAL G
+1D50D;AL # MATHEMATICAL FRAKTUR CAPITAL J
+1D50E;AL # MATHEMATICAL FRAKTUR CAPITAL K
+1D50F;AL # MATHEMATICAL FRAKTUR CAPITAL L
+1D510;AL # MATHEMATICAL FRAKTUR CAPITAL M
+1D511;AL # MATHEMATICAL FRAKTUR CAPITAL N
+1D512;AL # MATHEMATICAL FRAKTUR CAPITAL O
+1D513;AL # MATHEMATICAL FRAKTUR CAPITAL P
+1D514;AL # MATHEMATICAL FRAKTUR CAPITAL Q
+1D516;AL # MATHEMATICAL FRAKTUR CAPITAL S
+1D517;AL # MATHEMATICAL FRAKTUR CAPITAL T
+1D518;AL # MATHEMATICAL FRAKTUR CAPITAL U
+1D519;AL # MATHEMATICAL FRAKTUR CAPITAL V
+1D51A;AL # MATHEMATICAL FRAKTUR CAPITAL W
+1D51B;AL # MATHEMATICAL FRAKTUR CAPITAL X
+1D51C;AL # MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E;AL # MATHEMATICAL FRAKTUR SMALL A
+1D51F;AL # MATHEMATICAL FRAKTUR SMALL B
+1D520;AL # MATHEMATICAL FRAKTUR SMALL C
+1D521;AL # MATHEMATICAL FRAKTUR SMALL D
+1D522;AL # MATHEMATICAL FRAKTUR SMALL E
+1D523;AL # MATHEMATICAL FRAKTUR SMALL F
+1D524;AL # MATHEMATICAL FRAKTUR SMALL G
+1D525;AL # MATHEMATICAL FRAKTUR SMALL H
+1D526;AL # MATHEMATICAL FRAKTUR SMALL I
+1D527;AL # MATHEMATICAL FRAKTUR SMALL J
+1D528;AL # MATHEMATICAL FRAKTUR SMALL K
+1D529;AL # MATHEMATICAL FRAKTUR SMALL L
+1D52A;AL # MATHEMATICAL FRAKTUR SMALL M
+1D52B;AL # MATHEMATICAL FRAKTUR SMALL N
+1D52C;AL # MATHEMATICAL FRAKTUR SMALL O
+1D52D;AL # MATHEMATICAL FRAKTUR SMALL P
+1D52E;AL # MATHEMATICAL FRAKTUR SMALL Q
+1D52F;AL # MATHEMATICAL FRAKTUR SMALL R
+1D530;AL # MATHEMATICAL FRAKTUR SMALL S
+1D531;AL # MATHEMATICAL FRAKTUR SMALL T
+1D532;AL # MATHEMATICAL FRAKTUR SMALL U
+1D533;AL # MATHEMATICAL FRAKTUR SMALL V
+1D534;AL # MATHEMATICAL FRAKTUR SMALL W
+1D535;AL # MATHEMATICAL FRAKTUR SMALL X
+1D536;AL # MATHEMATICAL FRAKTUR SMALL Y
+1D537;AL # MATHEMATICAL FRAKTUR SMALL Z
+1D538;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+1D539;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+1D53C;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+1D53D;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+1D53E;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+1D541;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+1D542;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+1D543;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+1D544;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+1D54B;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+1D54C;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+1D54D;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+1D54E;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+1D54F;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+1D550;AL # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552;AL # MATHEMATICAL DOUBLE-STRUCK SMALL A
+1D553;AL # MATHEMATICAL DOUBLE-STRUCK SMALL B
+1D554;AL # MATHEMATICAL DOUBLE-STRUCK SMALL C
+1D555;AL # MATHEMATICAL DOUBLE-STRUCK SMALL D
+1D556;AL # MATHEMATICAL DOUBLE-STRUCK SMALL E
+1D557;AL # MATHEMATICAL DOUBLE-STRUCK SMALL F
+1D558;AL # MATHEMATICAL DOUBLE-STRUCK SMALL G
+1D559;AL # MATHEMATICAL DOUBLE-STRUCK SMALL H
+1D55A;AL # MATHEMATICAL DOUBLE-STRUCK SMALL I
+1D55B;AL # MATHEMATICAL DOUBLE-STRUCK SMALL J
+1D55C;AL # MATHEMATICAL DOUBLE-STRUCK SMALL K
+1D55D;AL # MATHEMATICAL DOUBLE-STRUCK SMALL L
+1D55E;AL # MATHEMATICAL DOUBLE-STRUCK SMALL M
+1D55F;AL # MATHEMATICAL DOUBLE-STRUCK SMALL N
+1D560;AL # MATHEMATICAL DOUBLE-STRUCK SMALL O
+1D561;AL # MATHEMATICAL DOUBLE-STRUCK SMALL P
+1D562;AL # MATHEMATICAL DOUBLE-STRUCK SMALL Q
+1D563;AL # MATHEMATICAL DOUBLE-STRUCK SMALL R
+1D564;AL # MATHEMATICAL DOUBLE-STRUCK SMALL S
+1D565;AL # MATHEMATICAL DOUBLE-STRUCK SMALL T
+1D566;AL # MATHEMATICAL DOUBLE-STRUCK SMALL U
+1D567;AL # MATHEMATICAL DOUBLE-STRUCK SMALL V
+1D568;AL # MATHEMATICAL DOUBLE-STRUCK SMALL W
+1D569;AL # MATHEMATICAL DOUBLE-STRUCK SMALL X
+1D56A;AL # MATHEMATICAL DOUBLE-STRUCK SMALL Y
+1D56B;AL # MATHEMATICAL DOUBLE-STRUCK SMALL Z
+1D56C;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL A
+1D56D;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL B
+1D56E;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL C
+1D56F;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL D
+1D570;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL E
+1D571;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL F
+1D572;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL G
+1D573;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL H
+1D574;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL I
+1D575;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL J
+1D576;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL K
+1D577;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL L
+1D578;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL M
+1D579;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL N
+1D57A;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL O
+1D57B;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL P
+1D57C;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL Q
+1D57D;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL R
+1D57E;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL S
+1D57F;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL T
+1D580;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL U
+1D581;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL V
+1D582;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL W
+1D583;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL X
+1D584;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL Y
+1D585;AL # MATHEMATICAL BOLD FRAKTUR CAPITAL Z
+1D586;AL # MATHEMATICAL BOLD FRAKTUR SMALL A
+1D587;AL # MATHEMATICAL BOLD FRAKTUR SMALL B
+1D588;AL # MATHEMATICAL BOLD FRAKTUR SMALL C
+1D589;AL # MATHEMATICAL BOLD FRAKTUR SMALL D
+1D58A;AL # MATHEMATICAL BOLD FRAKTUR SMALL E
+1D58B;AL # MATHEMATICAL BOLD FRAKTUR SMALL F
+1D58C;AL # MATHEMATICAL BOLD FRAKTUR SMALL G
+1D58D;AL # MATHEMATICAL BOLD FRAKTUR SMALL H
+1D58E;AL # MATHEMATICAL BOLD FRAKTUR SMALL I
+1D58F;AL # MATHEMATICAL BOLD FRAKTUR SMALL J
+1D590;AL # MATHEMATICAL BOLD FRAKTUR SMALL K
+1D591;AL # MATHEMATICAL BOLD FRAKTUR SMALL L
+1D592;AL # MATHEMATICAL BOLD FRAKTUR SMALL M
+1D593;AL # MATHEMATICAL BOLD FRAKTUR SMALL N
+1D594;AL # MATHEMATICAL BOLD FRAKTUR SMALL O
+1D595;AL # MATHEMATICAL BOLD FRAKTUR SMALL P
+1D596;AL # MATHEMATICAL BOLD FRAKTUR SMALL Q
+1D597;AL # MATHEMATICAL BOLD FRAKTUR SMALL R
+1D598;AL # MATHEMATICAL BOLD FRAKTUR SMALL S
+1D599;AL # MATHEMATICAL BOLD FRAKTUR SMALL T
+1D59A;AL # MATHEMATICAL BOLD FRAKTUR SMALL U
+1D59B;AL # MATHEMATICAL BOLD FRAKTUR SMALL V
+1D59C;AL # MATHEMATICAL BOLD FRAKTUR SMALL W
+1D59D;AL # MATHEMATICAL BOLD FRAKTUR SMALL X
+1D59E;AL # MATHEMATICAL BOLD FRAKTUR SMALL Y
+1D59F;AL # MATHEMATICAL BOLD FRAKTUR SMALL Z
+1D5A0;AL # MATHEMATICAL SANS-SERIF CAPITAL A
+1D5A1;AL # MATHEMATICAL SANS-SERIF CAPITAL B
+1D5A2;AL # MATHEMATICAL SANS-SERIF CAPITAL C
+1D5A3;AL # MATHEMATICAL SANS-SERIF CAPITAL D
+1D5A4;AL # MATHEMATICAL SANS-SERIF CAPITAL E
+1D5A5;AL # MATHEMATICAL SANS-SERIF CAPITAL F
+1D5A6;AL # MATHEMATICAL SANS-SERIF CAPITAL G
+1D5A7;AL # MATHEMATICAL SANS-SERIF CAPITAL H
+1D5A8;AL # MATHEMATICAL SANS-SERIF CAPITAL I
+1D5A9;AL # MATHEMATICAL SANS-SERIF CAPITAL J
+1D5AA;AL # MATHEMATICAL SANS-SERIF CAPITAL K
+1D5AB;AL # MATHEMATICAL SANS-SERIF CAPITAL L
+1D5AC;AL # MATHEMATICAL SANS-SERIF CAPITAL M
+1D5AD;AL # MATHEMATICAL SANS-SERIF CAPITAL N
+1D5AE;AL # MATHEMATICAL SANS-SERIF CAPITAL O
+1D5AF;AL # MATHEMATICAL SANS-SERIF CAPITAL P
+1D5B0;AL # MATHEMATICAL SANS-SERIF CAPITAL Q
+1D5B1;AL # MATHEMATICAL SANS-SERIF CAPITAL R
+1D5B2;AL # MATHEMATICAL SANS-SERIF CAPITAL S
+1D5B3;AL # MATHEMATICAL SANS-SERIF CAPITAL T
+1D5B4;AL # MATHEMATICAL SANS-SERIF CAPITAL U
+1D5B5;AL # MATHEMATICAL SANS-SERIF CAPITAL V
+1D5B6;AL # MATHEMATICAL SANS-SERIF CAPITAL W
+1D5B7;AL # MATHEMATICAL SANS-SERIF CAPITAL X
+1D5B8;AL # MATHEMATICAL SANS-SERIF CAPITAL Y
+1D5B9;AL # MATHEMATICAL SANS-SERIF CAPITAL Z
+1D5BA;AL # MATHEMATICAL SANS-SERIF SMALL A
+1D5BB;AL # MATHEMATICAL SANS-SERIF SMALL B
+1D5BC;AL # MATHEMATICAL SANS-SERIF SMALL C
+1D5BD;AL # MATHEMATICAL SANS-SERIF SMALL D
+1D5BE;AL # MATHEMATICAL SANS-SERIF SMALL E
+1D5BF;AL # MATHEMATICAL SANS-SERIF SMALL F
+1D5C0;AL # MATHEMATICAL SANS-SERIF SMALL G
+1D5C1;AL # MATHEMATICAL SANS-SERIF SMALL H
+1D5C2;AL # MATHEMATICAL SANS-SERIF SMALL I
+1D5C3;AL # MATHEMATICAL SANS-SERIF SMALL J
+1D5C4;AL # MATHEMATICAL SANS-SERIF SMALL K
+1D5C5;AL # MATHEMATICAL SANS-SERIF SMALL L
+1D5C6;AL # MATHEMATICAL SANS-SERIF SMALL M
+1D5C7;AL # MATHEMATICAL SANS-SERIF SMALL N
+1D5C8;AL # MATHEMATICAL SANS-SERIF SMALL O
+1D5C9;AL # MATHEMATICAL SANS-SERIF SMALL P
+1D5CA;AL # MATHEMATICAL SANS-SERIF SMALL Q
+1D5CB;AL # MATHEMATICAL SANS-SERIF SMALL R
+1D5CC;AL # MATHEMATICAL SANS-SERIF SMALL S
+1D5CD;AL # MATHEMATICAL SANS-SERIF SMALL T
+1D5CE;AL # MATHEMATICAL SANS-SERIF SMALL U
+1D5CF;AL # MATHEMATICAL SANS-SERIF SMALL V
+1D5D0;AL # MATHEMATICAL SANS-SERIF SMALL W
+1D5D1;AL # MATHEMATICAL SANS-SERIF SMALL X
+1D5D2;AL # MATHEMATICAL SANS-SERIF SMALL Y
+1D5D3;AL # MATHEMATICAL SANS-SERIF SMALL Z
+1D5D4;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+1D5D5;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL B
+1D5D6;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL C
+1D5D7;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL D
+1D5D8;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL E
+1D5D9;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL F
+1D5DA;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL G
+1D5DB;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL H
+1D5DC;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL I
+1D5DD;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL J
+1D5DE;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL K
+1D5DF;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL L
+1D5E0;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL M
+1D5E1;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL N
+1D5E2;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL O
+1D5E3;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL P
+1D5E4;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q
+1D5E5;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL R
+1D5E6;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL S
+1D5E7;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL T
+1D5E8;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL U
+1D5E9;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL V
+1D5EA;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL W
+1D5EB;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL X
+1D5EC;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y
+1D5ED;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
+1D5EE;AL # MATHEMATICAL SANS-SERIF BOLD SMALL A
+1D5EF;AL # MATHEMATICAL SANS-SERIF BOLD SMALL B
+1D5F0;AL # MATHEMATICAL SANS-SERIF BOLD SMALL C
+1D5F1;AL # MATHEMATICAL SANS-SERIF BOLD SMALL D
+1D5F2;AL # MATHEMATICAL SANS-SERIF BOLD SMALL E
+1D5F3;AL # MATHEMATICAL SANS-SERIF BOLD SMALL F
+1D5F4;AL # MATHEMATICAL SANS-SERIF BOLD SMALL G
+1D5F5;AL # MATHEMATICAL SANS-SERIF BOLD SMALL H
+1D5F6;AL # MATHEMATICAL SANS-SERIF BOLD SMALL I
+1D5F7;AL # MATHEMATICAL SANS-SERIF BOLD SMALL J
+1D5F8;AL # MATHEMATICAL SANS-SERIF BOLD SMALL K
+1D5F9;AL # MATHEMATICAL SANS-SERIF BOLD SMALL L
+1D5FA;AL # MATHEMATICAL SANS-SERIF BOLD SMALL M
+1D5FB;AL # MATHEMATICAL SANS-SERIF BOLD SMALL N
+1D5FC;AL # MATHEMATICAL SANS-SERIF BOLD SMALL O
+1D5FD;AL # MATHEMATICAL SANS-SERIF BOLD SMALL P
+1D5FE;AL # MATHEMATICAL SANS-SERIF BOLD SMALL Q
+1D5FF;AL # MATHEMATICAL SANS-SERIF BOLD SMALL R
+1D600;AL # MATHEMATICAL SANS-SERIF BOLD SMALL S
+1D601;AL # MATHEMATICAL SANS-SERIF BOLD SMALL T
+1D602;AL # MATHEMATICAL SANS-SERIF BOLD SMALL U
+1D603;AL # MATHEMATICAL SANS-SERIF BOLD SMALL V
+1D604;AL # MATHEMATICAL SANS-SERIF BOLD SMALL W
+1D605;AL # MATHEMATICAL SANS-SERIF BOLD SMALL X
+1D606;AL # MATHEMATICAL SANS-SERIF BOLD SMALL Y
+1D607;AL # MATHEMATICAL SANS-SERIF BOLD SMALL Z
+1D608;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
+1D609;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B
+1D60A;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C
+1D60B;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D
+1D60C;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E
+1D60D;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F
+1D60E;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G
+1D60F;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H
+1D610;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
+1D611;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J
+1D612;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K
+1D613;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L
+1D614;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M
+1D615;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N
+1D616;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O
+1D617;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P
+1D618;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q
+1D619;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R
+1D61A;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S
+1D61B;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T
+1D61C;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U
+1D61D;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V
+1D61E;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W
+1D61F;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X
+1D620;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y
+1D621;AL # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
+1D622;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL A
+1D623;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL B
+1D624;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL C
+1D625;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL D
+1D626;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL E
+1D627;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL F
+1D628;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL G
+1D629;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL H
+1D62A;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL I
+1D62B;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL J
+1D62C;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL K
+1D62D;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL L
+1D62E;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL M
+1D62F;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL N
+1D630;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL O
+1D631;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL P
+1D632;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL Q
+1D633;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL R
+1D634;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL S
+1D635;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL T
+1D636;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL U
+1D637;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL V
+1D638;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL W
+1D639;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL X
+1D63A;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL Y
+1D63B;AL # MATHEMATICAL SANS-SERIF ITALIC SMALL Z
+1D63C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
+1D63D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B
+1D63E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C
+1D63F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D
+1D640;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E
+1D641;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F
+1D642;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G
+1D643;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H
+1D644;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
+1D645;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J
+1D646;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K
+1D647;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L
+1D648;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M
+1D649;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N
+1D64A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O
+1D64B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P
+1D64C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q
+1D64D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R
+1D64E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S
+1D64F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T
+1D650;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U
+1D651;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V
+1D652;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W
+1D653;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X
+1D654;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y
+1D655;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
+1D656;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A
+1D657;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B
+1D658;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C
+1D659;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D
+1D65A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E
+1D65B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F
+1D65C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G
+1D65D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H
+1D65E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I
+1D65F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+1D660;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K
+1D661;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
+1D662;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M
+1D663;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N
+1D664;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O
+1D665;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P
+1D666;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q
+1D667;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R
+1D668;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S
+1D669;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T
+1D66A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U
+1D66B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V
+1D66C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W
+1D66D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X
+1D66E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y
+1D66F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
+1D670;AL # MATHEMATICAL MONOSPACE CAPITAL A
+1D671;AL # MATHEMATICAL MONOSPACE CAPITAL B
+1D672;AL # MATHEMATICAL MONOSPACE CAPITAL C
+1D673;AL # MATHEMATICAL MONOSPACE CAPITAL D
+1D674;AL # MATHEMATICAL MONOSPACE CAPITAL E
+1D675;AL # MATHEMATICAL MONOSPACE CAPITAL F
+1D676;AL # MATHEMATICAL MONOSPACE CAPITAL G
+1D677;AL # MATHEMATICAL MONOSPACE CAPITAL H
+1D678;AL # MATHEMATICAL MONOSPACE CAPITAL I
+1D679;AL # MATHEMATICAL MONOSPACE CAPITAL J
+1D67A;AL # MATHEMATICAL MONOSPACE CAPITAL K
+1D67B;AL # MATHEMATICAL MONOSPACE CAPITAL L
+1D67C;AL # MATHEMATICAL MONOSPACE CAPITAL M
+1D67D;AL # MATHEMATICAL MONOSPACE CAPITAL N
+1D67E;AL # MATHEMATICAL MONOSPACE CAPITAL O
+1D67F;AL # MATHEMATICAL MONOSPACE CAPITAL P
+1D680;AL # MATHEMATICAL MONOSPACE CAPITAL Q
+1D681;AL # MATHEMATICAL MONOSPACE CAPITAL R
+1D682;AL # MATHEMATICAL MONOSPACE CAPITAL S
+1D683;AL # MATHEMATICAL MONOSPACE CAPITAL T
+1D684;AL # MATHEMATICAL MONOSPACE CAPITAL U
+1D685;AL # MATHEMATICAL MONOSPACE CAPITAL V
+1D686;AL # MATHEMATICAL MONOSPACE CAPITAL W
+1D687;AL # MATHEMATICAL MONOSPACE CAPITAL X
+1D688;AL # MATHEMATICAL MONOSPACE CAPITAL Y
+1D689;AL # MATHEMATICAL MONOSPACE CAPITAL Z
+1D68A;AL # MATHEMATICAL MONOSPACE SMALL A
+1D68B;AL # MATHEMATICAL MONOSPACE SMALL B
+1D68C;AL # MATHEMATICAL MONOSPACE SMALL C
+1D68D;AL # MATHEMATICAL MONOSPACE SMALL D
+1D68E;AL # MATHEMATICAL MONOSPACE SMALL E
+1D68F;AL # MATHEMATICAL MONOSPACE SMALL F
+1D690;AL # MATHEMATICAL MONOSPACE SMALL G
+1D691;AL # MATHEMATICAL MONOSPACE SMALL H
+1D692;AL # MATHEMATICAL MONOSPACE SMALL I
+1D693;AL # MATHEMATICAL MONOSPACE SMALL J
+1D694;AL # MATHEMATICAL MONOSPACE SMALL K
+1D695;AL # MATHEMATICAL MONOSPACE SMALL L
+1D696;AL # MATHEMATICAL MONOSPACE SMALL M
+1D697;AL # MATHEMATICAL MONOSPACE SMALL N
+1D698;AL # MATHEMATICAL MONOSPACE SMALL O
+1D699;AL # MATHEMATICAL MONOSPACE SMALL P
+1D69A;AL # MATHEMATICAL MONOSPACE SMALL Q
+1D69B;AL # MATHEMATICAL MONOSPACE SMALL R
+1D69C;AL # MATHEMATICAL MONOSPACE SMALL S
+1D69D;AL # MATHEMATICAL MONOSPACE SMALL T
+1D69E;AL # MATHEMATICAL MONOSPACE SMALL U
+1D69F;AL # MATHEMATICAL MONOSPACE SMALL V
+1D6A0;AL # MATHEMATICAL MONOSPACE SMALL W
+1D6A1;AL # MATHEMATICAL MONOSPACE SMALL X
+1D6A2;AL # MATHEMATICAL MONOSPACE SMALL Y
+1D6A3;AL # MATHEMATICAL MONOSPACE SMALL Z
+1D6A4;AL # MATHEMATICAL ITALIC SMALL DOTLESS I
+1D6A5;AL # MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8;AL # MATHEMATICAL BOLD CAPITAL ALPHA
+1D6A9;AL # MATHEMATICAL BOLD CAPITAL BETA
+1D6AA;AL # MATHEMATICAL BOLD CAPITAL GAMMA
+1D6AB;AL # MATHEMATICAL BOLD CAPITAL DELTA
+1D6AC;AL # MATHEMATICAL BOLD CAPITAL EPSILON
+1D6AD;AL # MATHEMATICAL BOLD CAPITAL ZETA
+1D6AE;AL # MATHEMATICAL BOLD CAPITAL ETA
+1D6AF;AL # MATHEMATICAL BOLD CAPITAL THETA
+1D6B0;AL # MATHEMATICAL BOLD CAPITAL IOTA
+1D6B1;AL # MATHEMATICAL BOLD CAPITAL KAPPA
+1D6B2;AL # MATHEMATICAL BOLD CAPITAL LAMDA
+1D6B3;AL # MATHEMATICAL BOLD CAPITAL MU
+1D6B4;AL # MATHEMATICAL BOLD CAPITAL NU
+1D6B5;AL # MATHEMATICAL BOLD CAPITAL XI
+1D6B6;AL # MATHEMATICAL BOLD CAPITAL OMICRON
+1D6B7;AL # MATHEMATICAL BOLD CAPITAL PI
+1D6B8;AL # MATHEMATICAL BOLD CAPITAL RHO
+1D6B9;AL # MATHEMATICAL BOLD CAPITAL THETA SYMBOL
+1D6BA;AL # MATHEMATICAL BOLD CAPITAL SIGMA
+1D6BB;AL # MATHEMATICAL BOLD CAPITAL TAU
+1D6BC;AL # MATHEMATICAL BOLD CAPITAL UPSILON
+1D6BD;AL # MATHEMATICAL BOLD CAPITAL PHI
+1D6BE;AL # MATHEMATICAL BOLD CAPITAL CHI
+1D6BF;AL # MATHEMATICAL BOLD CAPITAL PSI
+1D6C0;AL # MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1;AL # MATHEMATICAL BOLD NABLA
+1D6C2;AL # MATHEMATICAL BOLD SMALL ALPHA
+1D6C3;AL # MATHEMATICAL BOLD SMALL BETA
+1D6C4;AL # MATHEMATICAL BOLD SMALL GAMMA
+1D6C5;AL # MATHEMATICAL BOLD SMALL DELTA
+1D6C6;AL # MATHEMATICAL BOLD SMALL EPSILON
+1D6C7;AL # MATHEMATICAL BOLD SMALL ZETA
+1D6C8;AL # MATHEMATICAL BOLD SMALL ETA
+1D6C9;AL # MATHEMATICAL BOLD SMALL THETA
+1D6CA;AL # MATHEMATICAL BOLD SMALL IOTA
+1D6CB;AL # MATHEMATICAL BOLD SMALL KAPPA
+1D6CC;AL # MATHEMATICAL BOLD SMALL LAMDA
+1D6CD;AL # MATHEMATICAL BOLD SMALL MU
+1D6CE;AL # MATHEMATICAL BOLD SMALL NU
+1D6CF;AL # MATHEMATICAL BOLD SMALL XI
+1D6D0;AL # MATHEMATICAL BOLD SMALL OMICRON
+1D6D1;AL # MATHEMATICAL BOLD SMALL PI
+1D6D2;AL # MATHEMATICAL BOLD SMALL RHO
+1D6D3;AL # MATHEMATICAL BOLD SMALL FINAL SIGMA
+1D6D4;AL # MATHEMATICAL BOLD SMALL SIGMA
+1D6D5;AL # MATHEMATICAL BOLD SMALL TAU
+1D6D6;AL # MATHEMATICAL BOLD SMALL UPSILON
+1D6D7;AL # MATHEMATICAL BOLD SMALL PHI
+1D6D8;AL # MATHEMATICAL BOLD SMALL CHI
+1D6D9;AL # MATHEMATICAL BOLD SMALL PSI
+1D6DA;AL # MATHEMATICAL BOLD SMALL OMEGA
+1D6DB;AL # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC;AL # MATHEMATICAL BOLD EPSILON SYMBOL
+1D6DD;AL # MATHEMATICAL BOLD THETA SYMBOL
+1D6DE;AL # MATHEMATICAL BOLD KAPPA SYMBOL
+1D6DF;AL # MATHEMATICAL BOLD PHI SYMBOL
+1D6E0;AL # MATHEMATICAL BOLD RHO SYMBOL
+1D6E1;AL # MATHEMATICAL BOLD PI SYMBOL
+1D6E2;AL # MATHEMATICAL ITALIC CAPITAL ALPHA
+1D6E3;AL # MATHEMATICAL ITALIC CAPITAL BETA
+1D6E4;AL # MATHEMATICAL ITALIC CAPITAL GAMMA
+1D6E5;AL # MATHEMATICAL ITALIC CAPITAL DELTA
+1D6E6;AL # MATHEMATICAL ITALIC CAPITAL EPSILON
+1D6E7;AL # MATHEMATICAL ITALIC CAPITAL ZETA
+1D6E8;AL # MATHEMATICAL ITALIC CAPITAL ETA
+1D6E9;AL # MATHEMATICAL ITALIC CAPITAL THETA
+1D6EA;AL # MATHEMATICAL ITALIC CAPITAL IOTA
+1D6EB;AL # MATHEMATICAL ITALIC CAPITAL KAPPA
+1D6EC;AL # MATHEMATICAL ITALIC CAPITAL LAMDA
+1D6ED;AL # MATHEMATICAL ITALIC CAPITAL MU
+1D6EE;AL # MATHEMATICAL ITALIC CAPITAL NU
+1D6EF;AL # MATHEMATICAL ITALIC CAPITAL XI
+1D6F0;AL # MATHEMATICAL ITALIC CAPITAL OMICRON
+1D6F1;AL # MATHEMATICAL ITALIC CAPITAL PI
+1D6F2;AL # MATHEMATICAL ITALIC CAPITAL RHO
+1D6F3;AL # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL
+1D6F4;AL # MATHEMATICAL ITALIC CAPITAL SIGMA
+1D6F5;AL # MATHEMATICAL ITALIC CAPITAL TAU
+1D6F6;AL # MATHEMATICAL ITALIC CAPITAL UPSILON
+1D6F7;AL # MATHEMATICAL ITALIC CAPITAL PHI
+1D6F8;AL # MATHEMATICAL ITALIC CAPITAL CHI
+1D6F9;AL # MATHEMATICAL ITALIC CAPITAL PSI
+1D6FA;AL # MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB;AL # MATHEMATICAL ITALIC NABLA
+1D6FC;AL # MATHEMATICAL ITALIC SMALL ALPHA
+1D6FD;AL # MATHEMATICAL ITALIC SMALL BETA
+1D6FE;AL # MATHEMATICAL ITALIC SMALL GAMMA
+1D6FF;AL # MATHEMATICAL ITALIC SMALL DELTA
+1D700;AL # MATHEMATICAL ITALIC SMALL EPSILON
+1D701;AL # MATHEMATICAL ITALIC SMALL ZETA
+1D702;AL # MATHEMATICAL ITALIC SMALL ETA
+1D703;AL # MATHEMATICAL ITALIC SMALL THETA
+1D704;AL # MATHEMATICAL ITALIC SMALL IOTA
+1D705;AL # MATHEMATICAL ITALIC SMALL KAPPA
+1D706;AL # MATHEMATICAL ITALIC SMALL LAMDA
+1D707;AL # MATHEMATICAL ITALIC SMALL MU
+1D708;AL # MATHEMATICAL ITALIC SMALL NU
+1D709;AL # MATHEMATICAL ITALIC SMALL XI
+1D70A;AL # MATHEMATICAL ITALIC SMALL OMICRON
+1D70B;AL # MATHEMATICAL ITALIC SMALL PI
+1D70C;AL # MATHEMATICAL ITALIC SMALL RHO
+1D70D;AL # MATHEMATICAL ITALIC SMALL FINAL SIGMA
+1D70E;AL # MATHEMATICAL ITALIC SMALL SIGMA
+1D70F;AL # MATHEMATICAL ITALIC SMALL TAU
+1D710;AL # MATHEMATICAL ITALIC SMALL UPSILON
+1D711;AL # MATHEMATICAL ITALIC SMALL PHI
+1D712;AL # MATHEMATICAL ITALIC SMALL CHI
+1D713;AL # MATHEMATICAL ITALIC SMALL PSI
+1D714;AL # MATHEMATICAL ITALIC SMALL OMEGA
+1D715;AL # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716;AL # MATHEMATICAL ITALIC EPSILON SYMBOL
+1D717;AL # MATHEMATICAL ITALIC THETA SYMBOL
+1D718;AL # MATHEMATICAL ITALIC KAPPA SYMBOL
+1D719;AL # MATHEMATICAL ITALIC PHI SYMBOL
+1D71A;AL # MATHEMATICAL ITALIC RHO SYMBOL
+1D71B;AL # MATHEMATICAL ITALIC PI SYMBOL
+1D71C;AL # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA
+1D71D;AL # MATHEMATICAL BOLD ITALIC CAPITAL BETA
+1D71E;AL # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA
+1D71F;AL # MATHEMATICAL BOLD ITALIC CAPITAL DELTA
+1D720;AL # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON
+1D721;AL # MATHEMATICAL BOLD ITALIC CAPITAL ZETA
+1D722;AL # MATHEMATICAL BOLD ITALIC CAPITAL ETA
+1D723;AL # MATHEMATICAL BOLD ITALIC CAPITAL THETA
+1D724;AL # MATHEMATICAL BOLD ITALIC CAPITAL IOTA
+1D725;AL # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA
+1D726;AL # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA
+1D727;AL # MATHEMATICAL BOLD ITALIC CAPITAL MU
+1D728;AL # MATHEMATICAL BOLD ITALIC CAPITAL NU
+1D729;AL # MATHEMATICAL BOLD ITALIC CAPITAL XI
+1D72A;AL # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON
+1D72B;AL # MATHEMATICAL BOLD ITALIC CAPITAL PI
+1D72C;AL # MATHEMATICAL BOLD ITALIC CAPITAL RHO
+1D72D;AL # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL
+1D72E;AL # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA
+1D72F;AL # MATHEMATICAL BOLD ITALIC CAPITAL TAU
+1D730;AL # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON
+1D731;AL # MATHEMATICAL BOLD ITALIC CAPITAL PHI
+1D732;AL # MATHEMATICAL BOLD ITALIC CAPITAL CHI
+1D733;AL # MATHEMATICAL BOLD ITALIC CAPITAL PSI
+1D734;AL # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735;AL # MATHEMATICAL BOLD ITALIC NABLA
+1D736;AL # MATHEMATICAL BOLD ITALIC SMALL ALPHA
+1D737;AL # MATHEMATICAL BOLD ITALIC SMALL BETA
+1D738;AL # MATHEMATICAL BOLD ITALIC SMALL GAMMA
+1D739;AL # MATHEMATICAL BOLD ITALIC SMALL DELTA
+1D73A;AL # MATHEMATICAL BOLD ITALIC SMALL EPSILON
+1D73B;AL # MATHEMATICAL BOLD ITALIC SMALL ZETA
+1D73C;AL # MATHEMATICAL BOLD ITALIC SMALL ETA
+1D73D;AL # MATHEMATICAL BOLD ITALIC SMALL THETA
+1D73E;AL # MATHEMATICAL BOLD ITALIC SMALL IOTA
+1D73F;AL # MATHEMATICAL BOLD ITALIC SMALL KAPPA
+1D740;AL # MATHEMATICAL BOLD ITALIC SMALL LAMDA
+1D741;AL # MATHEMATICAL BOLD ITALIC SMALL MU
+1D742;AL # MATHEMATICAL BOLD ITALIC SMALL NU
+1D743;AL # MATHEMATICAL BOLD ITALIC SMALL XI
+1D744;AL # MATHEMATICAL BOLD ITALIC SMALL OMICRON
+1D745;AL # MATHEMATICAL BOLD ITALIC SMALL PI
+1D746;AL # MATHEMATICAL BOLD ITALIC SMALL RHO
+1D747;AL # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA
+1D748;AL # MATHEMATICAL BOLD ITALIC SMALL SIGMA
+1D749;AL # MATHEMATICAL BOLD ITALIC SMALL TAU
+1D74A;AL # MATHEMATICAL BOLD ITALIC SMALL UPSILON
+1D74B;AL # MATHEMATICAL BOLD ITALIC SMALL PHI
+1D74C;AL # MATHEMATICAL BOLD ITALIC SMALL CHI
+1D74D;AL # MATHEMATICAL BOLD ITALIC SMALL PSI
+1D74E;AL # MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F;AL # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750;AL # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL
+1D751;AL # MATHEMATICAL BOLD ITALIC THETA SYMBOL
+1D752;AL # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL
+1D753;AL # MATHEMATICAL BOLD ITALIC PHI SYMBOL
+1D754;AL # MATHEMATICAL BOLD ITALIC RHO SYMBOL
+1D755;AL # MATHEMATICAL BOLD ITALIC PI SYMBOL
+1D756;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA
+1D757;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA
+1D758;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA
+1D759;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA
+1D75A;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON
+1D75B;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA
+1D75C;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA
+1D75D;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA
+1D75E;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
+1D75F;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA
+1D760;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA
+1D761;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU
+1D762;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU
+1D763;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI
+1D764;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON
+1D765;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI
+1D766;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO
+1D767;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL
+1D768;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA
+1D769;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU
+1D76A;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON
+1D76B;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI
+1D76C;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI
+1D76D;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI
+1D76E;AL # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F;AL # MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770;AL # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA
+1D771;AL # MATHEMATICAL SANS-SERIF BOLD SMALL BETA
+1D772;AL # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA
+1D773;AL # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA
+1D774;AL # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON
+1D775;AL # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA
+1D776;AL # MATHEMATICAL SANS-SERIF BOLD SMALL ETA
+1D777;AL # MATHEMATICAL SANS-SERIF BOLD SMALL THETA
+1D778;AL # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA
+1D779;AL # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA
+1D77A;AL # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA
+1D77B;AL # MATHEMATICAL SANS-SERIF BOLD SMALL MU
+1D77C;AL # MATHEMATICAL SANS-SERIF BOLD SMALL NU
+1D77D;AL # MATHEMATICAL SANS-SERIF BOLD SMALL XI
+1D77E;AL # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON
+1D77F;AL # MATHEMATICAL SANS-SERIF BOLD SMALL PI
+1D780;AL # MATHEMATICAL SANS-SERIF BOLD SMALL RHO
+1D781;AL # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA
+1D782;AL # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA
+1D783;AL # MATHEMATICAL SANS-SERIF BOLD SMALL TAU
+1D784;AL # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON
+1D785;AL # MATHEMATICAL SANS-SERIF BOLD SMALL PHI
+1D786;AL # MATHEMATICAL SANS-SERIF BOLD SMALL CHI
+1D787;AL # MATHEMATICAL SANS-SERIF BOLD SMALL PSI
+1D788;AL # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789;AL # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A;AL # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL
+1D78B;AL # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL
+1D78C;AL # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL
+1D78D;AL # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL
+1D78E;AL # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL
+1D78F;AL # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
+1D790;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA
+1D791;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA
+1D792;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA
+1D793;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA
+1D794;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON
+1D795;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA
+1D796;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA
+1D797;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA
+1D798;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
+1D799;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA
+1D79A;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA
+1D79B;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU
+1D79C;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU
+1D79D;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI
+1D79E;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON
+1D79F;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI
+1D7A0;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO
+1D7A1;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL
+1D7A2;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA
+1D7A3;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU
+1D7A4;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON
+1D7A5;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI
+1D7A6;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI
+1D7A7;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI
+1D7A8;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA
+1D7AB;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA
+1D7AC;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA
+1D7AD;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA
+1D7AE;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON
+1D7AF;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA
+1D7B0;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA
+1D7B1;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA
+1D7B2;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA
+1D7B3;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA
+1D7B4;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA
+1D7B5;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU
+1D7B6;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU
+1D7B7;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI
+1D7B8;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON
+1D7B9;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI
+1D7BA;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO
+1D7BB;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA
+1D7BC;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA
+1D7BD;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU
+1D7BE;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON
+1D7BF;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI
+1D7C0;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI
+1D7C1;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI
+1D7C2;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL
+1D7C5;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL
+1D7C6;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL
+1D7C7;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL
+1D7C8;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL
+1D7C9;AL # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+1D7CE;NU # MATHEMATICAL BOLD DIGIT ZERO
+1D7CF;NU # MATHEMATICAL BOLD DIGIT ONE
+1D7D0;NU # MATHEMATICAL BOLD DIGIT TWO
+1D7D1;NU # MATHEMATICAL BOLD DIGIT THREE
+1D7D2;NU # MATHEMATICAL BOLD DIGIT FOUR
+1D7D3;NU # MATHEMATICAL BOLD DIGIT FIVE
+1D7D4;NU # MATHEMATICAL BOLD DIGIT SIX
+1D7D5;NU # MATHEMATICAL BOLD DIGIT SEVEN
+1D7D6;NU # MATHEMATICAL BOLD DIGIT EIGHT
+1D7D7;NU # MATHEMATICAL BOLD DIGIT NINE
+1D7D8;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
+1D7D9;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
+1D7DA;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
+1D7DB;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
+1D7DC;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
+1D7DD;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
+1D7DE;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
+1D7DF;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
+1D7E0;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
+1D7E1;NU # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
+1D7E2;NU # MATHEMATICAL SANS-SERIF DIGIT ZERO
+1D7E3;NU # MATHEMATICAL SANS-SERIF DIGIT ONE
+1D7E4;NU # MATHEMATICAL SANS-SERIF DIGIT TWO
+1D7E5;NU # MATHEMATICAL SANS-SERIF DIGIT THREE
+1D7E6;NU # MATHEMATICAL SANS-SERIF DIGIT FOUR
+1D7E7;NU # MATHEMATICAL SANS-SERIF DIGIT FIVE
+1D7E8;NU # MATHEMATICAL SANS-SERIF DIGIT SIX
+1D7E9;NU # MATHEMATICAL SANS-SERIF DIGIT SEVEN
+1D7EA;NU # MATHEMATICAL SANS-SERIF DIGIT EIGHT
+1D7EB;NU # MATHEMATICAL SANS-SERIF DIGIT NINE
+1D7EC;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
+1D7ED;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
+1D7EE;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
+1D7EF;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
+1D7F0;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
+1D7F1;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
+1D7F2;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
+1D7F3;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
+1D7F4;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
+1D7F5;NU # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
+1D7F6;NU # MATHEMATICAL MONOSPACE DIGIT ZERO
+1D7F7;NU # MATHEMATICAL MONOSPACE DIGIT ONE
+1D7F8;NU # MATHEMATICAL MONOSPACE DIGIT TWO
+1D7F9;NU # MATHEMATICAL MONOSPACE DIGIT THREE
+1D7FA;NU # MATHEMATICAL MONOSPACE DIGIT FOUR
+1D7FB;NU # MATHEMATICAL MONOSPACE DIGIT FIVE
+1D7FC;NU # MATHEMATICAL MONOSPACE DIGIT SIX
+1D7FD;NU # MATHEMATICAL MONOSPACE DIGIT SEVEN
+1D7FE;NU # MATHEMATICAL MONOSPACE DIGIT EIGHT
+1D7FF;NU # MATHEMATICAL MONOSPACE DIGIT NINE
+20000..2A6D6;ID # <CJK Ideograph Extension B, First>..<CJK Ideograph Extension B, Last>
+2F800;ID # CJK COMPATIBILITY IDEOGRAPH-2F800
+2F801;ID # CJK COMPATIBILITY IDEOGRAPH-2F801
+2F802;ID # CJK COMPATIBILITY IDEOGRAPH-2F802
+2F803;ID # CJK COMPATIBILITY IDEOGRAPH-2F803
+2F804;ID # CJK COMPATIBILITY IDEOGRAPH-2F804
+2F805;ID # CJK COMPATIBILITY IDEOGRAPH-2F805
+2F806;ID # CJK COMPATIBILITY IDEOGRAPH-2F806
+2F807;ID # CJK COMPATIBILITY IDEOGRAPH-2F807
+2F808;ID # CJK COMPATIBILITY IDEOGRAPH-2F808
+2F809;ID # CJK COMPATIBILITY IDEOGRAPH-2F809
+2F80A;ID # CJK COMPATIBILITY IDEOGRAPH-2F80A
+2F80B;ID # CJK COMPATIBILITY IDEOGRAPH-2F80B
+2F80C;ID # CJK COMPATIBILITY IDEOGRAPH-2F80C
+2F80D;ID # CJK COMPATIBILITY IDEOGRAPH-2F80D
+2F80E;ID # CJK COMPATIBILITY IDEOGRAPH-2F80E
+2F80F;ID # CJK COMPATIBILITY IDEOGRAPH-2F80F
+2F810;ID # CJK COMPATIBILITY IDEOGRAPH-2F810
+2F811;ID # CJK COMPATIBILITY IDEOGRAPH-2F811
+2F812;ID # CJK COMPATIBILITY IDEOGRAPH-2F812
+2F813;ID # CJK COMPATIBILITY IDEOGRAPH-2F813
+2F814;ID # CJK COMPATIBILITY IDEOGRAPH-2F814
+2F815;ID # CJK COMPATIBILITY IDEOGRAPH-2F815
+2F816;ID # CJK COMPATIBILITY IDEOGRAPH-2F816
+2F817;ID # CJK COMPATIBILITY IDEOGRAPH-2F817
+2F818;ID # CJK COMPATIBILITY IDEOGRAPH-2F818
+2F819;ID # CJK COMPATIBILITY IDEOGRAPH-2F819
+2F81A;ID # CJK COMPATIBILITY IDEOGRAPH-2F81A
+2F81B;ID # CJK COMPATIBILITY IDEOGRAPH-2F81B
+2F81C;ID # CJK COMPATIBILITY IDEOGRAPH-2F81C
+2F81D;ID # CJK COMPATIBILITY IDEOGRAPH-2F81D
+2F81E;ID # CJK COMPATIBILITY IDEOGRAPH-2F81E
+2F81F;ID # CJK COMPATIBILITY IDEOGRAPH-2F81F
+2F820;ID # CJK COMPATIBILITY IDEOGRAPH-2F820
+2F821;ID # CJK COMPATIBILITY IDEOGRAPH-2F821
+2F822;ID # CJK COMPATIBILITY IDEOGRAPH-2F822
+2F823;ID # CJK COMPATIBILITY IDEOGRAPH-2F823
+2F824;ID # CJK COMPATIBILITY IDEOGRAPH-2F824
+2F825;ID # CJK COMPATIBILITY IDEOGRAPH-2F825
+2F826;ID # CJK COMPATIBILITY IDEOGRAPH-2F826
+2F827;ID # CJK COMPATIBILITY IDEOGRAPH-2F827
+2F828;ID # CJK COMPATIBILITY IDEOGRAPH-2F828
+2F829;ID # CJK COMPATIBILITY IDEOGRAPH-2F829
+2F82A;ID # CJK COMPATIBILITY IDEOGRAPH-2F82A
+2F82B;ID # CJK COMPATIBILITY IDEOGRAPH-2F82B
+2F82C;ID # CJK COMPATIBILITY IDEOGRAPH-2F82C
+2F82D;ID # CJK COMPATIBILITY IDEOGRAPH-2F82D
+2F82E;ID # CJK COMPATIBILITY IDEOGRAPH-2F82E
+2F82F;ID # CJK COMPATIBILITY IDEOGRAPH-2F82F
+2F830;ID # CJK COMPATIBILITY IDEOGRAPH-2F830
+2F831;ID # CJK COMPATIBILITY IDEOGRAPH-2F831
+2F832;ID # CJK COMPATIBILITY IDEOGRAPH-2F832
+2F833;ID # CJK COMPATIBILITY IDEOGRAPH-2F833
+2F834;ID # CJK COMPATIBILITY IDEOGRAPH-2F834
+2F835;ID # CJK COMPATIBILITY IDEOGRAPH-2F835
+2F836;ID # CJK COMPATIBILITY IDEOGRAPH-2F836
+2F837;ID # CJK COMPATIBILITY IDEOGRAPH-2F837
+2F838;ID # CJK COMPATIBILITY IDEOGRAPH-2F838
+2F839;ID # CJK COMPATIBILITY IDEOGRAPH-2F839
+2F83A;ID # CJK COMPATIBILITY IDEOGRAPH-2F83A
+2F83B;ID # CJK COMPATIBILITY IDEOGRAPH-2F83B
+2F83C;ID # CJK COMPATIBILITY IDEOGRAPH-2F83C
+2F83D;ID # CJK COMPATIBILITY IDEOGRAPH-2F83D
+2F83E;ID # CJK COMPATIBILITY IDEOGRAPH-2F83E
+2F83F;ID # CJK COMPATIBILITY IDEOGRAPH-2F83F
+2F840;ID # CJK COMPATIBILITY IDEOGRAPH-2F840
+2F841;ID # CJK COMPATIBILITY IDEOGRAPH-2F841
+2F842;ID # CJK COMPATIBILITY IDEOGRAPH-2F842
+2F843;ID # CJK COMPATIBILITY IDEOGRAPH-2F843
+2F844;ID # CJK COMPATIBILITY IDEOGRAPH-2F844
+2F845;ID # CJK COMPATIBILITY IDEOGRAPH-2F845
+2F846;ID # CJK COMPATIBILITY IDEOGRAPH-2F846
+2F847;ID # CJK COMPATIBILITY IDEOGRAPH-2F847
+2F848;ID # CJK COMPATIBILITY IDEOGRAPH-2F848
+2F849;ID # CJK COMPATIBILITY IDEOGRAPH-2F849
+2F84A;ID # CJK COMPATIBILITY IDEOGRAPH-2F84A
+2F84B;ID # CJK COMPATIBILITY IDEOGRAPH-2F84B
+2F84C;ID # CJK COMPATIBILITY IDEOGRAPH-2F84C
+2F84D;ID # CJK COMPATIBILITY IDEOGRAPH-2F84D
+2F84E;ID # CJK COMPATIBILITY IDEOGRAPH-2F84E
+2F84F;ID # CJK COMPATIBILITY IDEOGRAPH-2F84F
+2F850;ID # CJK COMPATIBILITY IDEOGRAPH-2F850
+2F851;ID # CJK COMPATIBILITY IDEOGRAPH-2F851
+2F852;ID # CJK COMPATIBILITY IDEOGRAPH-2F852
+2F853;ID # CJK COMPATIBILITY IDEOGRAPH-2F853
+2F854;ID # CJK COMPATIBILITY IDEOGRAPH-2F854
+2F855;ID # CJK COMPATIBILITY IDEOGRAPH-2F855
+2F856;ID # CJK COMPATIBILITY IDEOGRAPH-2F856
+2F857;ID # CJK COMPATIBILITY IDEOGRAPH-2F857
+2F858;ID # CJK COMPATIBILITY IDEOGRAPH-2F858
+2F859;ID # CJK COMPATIBILITY IDEOGRAPH-2F859
+2F85A;ID # CJK COMPATIBILITY IDEOGRAPH-2F85A
+2F85B;ID # CJK COMPATIBILITY IDEOGRAPH-2F85B
+2F85C;ID # CJK COMPATIBILITY IDEOGRAPH-2F85C
+2F85D;ID # CJK COMPATIBILITY IDEOGRAPH-2F85D
+2F85E;ID # CJK COMPATIBILITY IDEOGRAPH-2F85E
+2F85F;ID # CJK COMPATIBILITY IDEOGRAPH-2F85F
+2F860;ID # CJK COMPATIBILITY IDEOGRAPH-2F860
+2F861;ID # CJK COMPATIBILITY IDEOGRAPH-2F861
+2F862;ID # CJK COMPATIBILITY IDEOGRAPH-2F862
+2F863;ID # CJK COMPATIBILITY IDEOGRAPH-2F863
+2F864;ID # CJK COMPATIBILITY IDEOGRAPH-2F864
+2F865;ID # CJK COMPATIBILITY IDEOGRAPH-2F865
+2F866;ID # CJK COMPATIBILITY IDEOGRAPH-2F866
+2F867;ID # CJK COMPATIBILITY IDEOGRAPH-2F867
+2F868;ID # CJK COMPATIBILITY IDEOGRAPH-2F868
+2F869;ID # CJK COMPATIBILITY IDEOGRAPH-2F869
+2F86A;ID # CJK COMPATIBILITY IDEOGRAPH-2F86A
+2F86B;ID # CJK COMPATIBILITY IDEOGRAPH-2F86B
+2F86C;ID # CJK COMPATIBILITY IDEOGRAPH-2F86C
+2F86D;ID # CJK COMPATIBILITY IDEOGRAPH-2F86D
+2F86E;ID # CJK COMPATIBILITY IDEOGRAPH-2F86E
+2F86F;ID # CJK COMPATIBILITY IDEOGRAPH-2F86F
+2F870;ID # CJK COMPATIBILITY IDEOGRAPH-2F870
+2F871;ID # CJK COMPATIBILITY IDEOGRAPH-2F871
+2F872;ID # CJK COMPATIBILITY IDEOGRAPH-2F872
+2F873;ID # CJK COMPATIBILITY IDEOGRAPH-2F873
+2F874;ID # CJK COMPATIBILITY IDEOGRAPH-2F874
+2F875;ID # CJK COMPATIBILITY IDEOGRAPH-2F875
+2F876;ID # CJK COMPATIBILITY IDEOGRAPH-2F876
+2F877;ID # CJK COMPATIBILITY IDEOGRAPH-2F877
+2F878;ID # CJK COMPATIBILITY IDEOGRAPH-2F878
+2F879;ID # CJK COMPATIBILITY IDEOGRAPH-2F879
+2F87A;ID # CJK COMPATIBILITY IDEOGRAPH-2F87A
+2F87B;ID # CJK COMPATIBILITY IDEOGRAPH-2F87B
+2F87C;ID # CJK COMPATIBILITY IDEOGRAPH-2F87C
+2F87D;ID # CJK COMPATIBILITY IDEOGRAPH-2F87D
+2F87E;ID # CJK COMPATIBILITY IDEOGRAPH-2F87E
+2F87F;ID # CJK COMPATIBILITY IDEOGRAPH-2F87F
+2F880;ID # CJK COMPATIBILITY IDEOGRAPH-2F880
+2F881;ID # CJK COMPATIBILITY IDEOGRAPH-2F881
+2F882;ID # CJK COMPATIBILITY IDEOGRAPH-2F882
+2F883;ID # CJK COMPATIBILITY IDEOGRAPH-2F883
+2F884;ID # CJK COMPATIBILITY IDEOGRAPH-2F884
+2F885;ID # CJK COMPATIBILITY IDEOGRAPH-2F885
+2F886;ID # CJK COMPATIBILITY IDEOGRAPH-2F886
+2F887;ID # CJK COMPATIBILITY IDEOGRAPH-2F887
+2F888;ID # CJK COMPATIBILITY IDEOGRAPH-2F888
+2F889;ID # CJK COMPATIBILITY IDEOGRAPH-2F889
+2F88A;ID # CJK COMPATIBILITY IDEOGRAPH-2F88A
+2F88B;ID # CJK COMPATIBILITY IDEOGRAPH-2F88B
+2F88C;ID # CJK COMPATIBILITY IDEOGRAPH-2F88C
+2F88D;ID # CJK COMPATIBILITY IDEOGRAPH-2F88D
+2F88E;ID # CJK COMPATIBILITY IDEOGRAPH-2F88E
+2F88F;ID # CJK COMPATIBILITY IDEOGRAPH-2F88F
+2F890;ID # CJK COMPATIBILITY IDEOGRAPH-2F890
+2F891;ID # CJK COMPATIBILITY IDEOGRAPH-2F891
+2F892;ID # CJK COMPATIBILITY IDEOGRAPH-2F892
+2F893;ID # CJK COMPATIBILITY IDEOGRAPH-2F893
+2F894;ID # CJK COMPATIBILITY IDEOGRAPH-2F894
+2F895;ID # CJK COMPATIBILITY IDEOGRAPH-2F895
+2F896;ID # CJK COMPATIBILITY IDEOGRAPH-2F896
+2F897;ID # CJK COMPATIBILITY IDEOGRAPH-2F897
+2F898;ID # CJK COMPATIBILITY IDEOGRAPH-2F898
+2F899;ID # CJK COMPATIBILITY IDEOGRAPH-2F899
+2F89A;ID # CJK COMPATIBILITY IDEOGRAPH-2F89A
+2F89B;ID # CJK COMPATIBILITY IDEOGRAPH-2F89B
+2F89C;ID # CJK COMPATIBILITY IDEOGRAPH-2F89C
+2F89D;ID # CJK COMPATIBILITY IDEOGRAPH-2F89D
+2F89E;ID # CJK COMPATIBILITY IDEOGRAPH-2F89E
+2F89F;ID # CJK COMPATIBILITY IDEOGRAPH-2F89F
+2F8A0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A0
+2F8A1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A1
+2F8A2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A2
+2F8A3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A3
+2F8A4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A4
+2F8A5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A5
+2F8A6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A6
+2F8A7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A7
+2F8A8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A8
+2F8A9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8A9
+2F8AA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AA
+2F8AB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AB
+2F8AC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AC
+2F8AD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AD
+2F8AE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AE
+2F8AF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8AF
+2F8B0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B0
+2F8B1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B1
+2F8B2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B2
+2F8B3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B3
+2F8B4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B4
+2F8B5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B5
+2F8B6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B6
+2F8B7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B7
+2F8B8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B8
+2F8B9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8B9
+2F8BA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BA
+2F8BB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BB
+2F8BC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BC
+2F8BD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BD
+2F8BE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BE
+2F8BF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8BF
+2F8C0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C0
+2F8C1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C1
+2F8C2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C2
+2F8C3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C3
+2F8C4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C4
+2F8C5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C5
+2F8C6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C6
+2F8C7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C7
+2F8C8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C8
+2F8C9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8C9
+2F8CA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CA
+2F8CB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CB
+2F8CC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CC
+2F8CD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CD
+2F8CE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CE
+2F8CF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8CF
+2F8D0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D0
+2F8D1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D1
+2F8D2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D2
+2F8D3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D3
+2F8D4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D4
+2F8D5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D5
+2F8D6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D6
+2F8D7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D7
+2F8D8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D8
+2F8D9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8D9
+2F8DA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DA
+2F8DB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DB
+2F8DC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DC
+2F8DD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DD
+2F8DE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DE
+2F8DF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8DF
+2F8E0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E0
+2F8E1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E1
+2F8E2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E2
+2F8E3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E3
+2F8E4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E4
+2F8E5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E5
+2F8E6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E6
+2F8E7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E7
+2F8E8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E8
+2F8E9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8E9
+2F8EA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EA
+2F8EB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EB
+2F8EC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EC
+2F8ED;ID # CJK COMPATIBILITY IDEOGRAPH-2F8ED
+2F8EE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EE
+2F8EF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8EF
+2F8F0;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F0
+2F8F1;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F1
+2F8F2;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F2
+2F8F3;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F3
+2F8F4;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F4
+2F8F5;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F5
+2F8F6;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F6
+2F8F7;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F7
+2F8F8;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F8
+2F8F9;ID # CJK COMPATIBILITY IDEOGRAPH-2F8F9
+2F8FA;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FA
+2F8FB;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FB
+2F8FC;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FC
+2F8FD;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FD
+2F8FE;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FE
+2F8FF;ID # CJK COMPATIBILITY IDEOGRAPH-2F8FF
+2F900;ID # CJK COMPATIBILITY IDEOGRAPH-2F900
+2F901;ID # CJK COMPATIBILITY IDEOGRAPH-2F901
+2F902;ID # CJK COMPATIBILITY IDEOGRAPH-2F902
+2F903;ID # CJK COMPATIBILITY IDEOGRAPH-2F903
+2F904;ID # CJK COMPATIBILITY IDEOGRAPH-2F904
+2F905;ID # CJK COMPATIBILITY IDEOGRAPH-2F905
+2F906;ID # CJK COMPATIBILITY IDEOGRAPH-2F906
+2F907;ID # CJK COMPATIBILITY IDEOGRAPH-2F907
+2F908;ID # CJK COMPATIBILITY IDEOGRAPH-2F908
+2F909;ID # CJK COMPATIBILITY IDEOGRAPH-2F909
+2F90A;ID # CJK COMPATIBILITY IDEOGRAPH-2F90A
+2F90B;ID # CJK COMPATIBILITY IDEOGRAPH-2F90B
+2F90C;ID # CJK COMPATIBILITY IDEOGRAPH-2F90C
+2F90D;ID # CJK COMPATIBILITY IDEOGRAPH-2F90D
+2F90E;ID # CJK COMPATIBILITY IDEOGRAPH-2F90E
+2F90F;ID # CJK COMPATIBILITY IDEOGRAPH-2F90F
+2F910;ID # CJK COMPATIBILITY IDEOGRAPH-2F910
+2F911;ID # CJK COMPATIBILITY IDEOGRAPH-2F911
+2F912;ID # CJK COMPATIBILITY IDEOGRAPH-2F912
+2F913;ID # CJK COMPATIBILITY IDEOGRAPH-2F913
+2F914;ID # CJK COMPATIBILITY IDEOGRAPH-2F914
+2F915;ID # CJK COMPATIBILITY IDEOGRAPH-2F915
+2F916;ID # CJK COMPATIBILITY IDEOGRAPH-2F916
+2F917;ID # CJK COMPATIBILITY IDEOGRAPH-2F917
+2F918;ID # CJK COMPATIBILITY IDEOGRAPH-2F918
+2F919;ID # CJK COMPATIBILITY IDEOGRAPH-2F919
+2F91A;ID # CJK COMPATIBILITY IDEOGRAPH-2F91A
+2F91B;ID # CJK COMPATIBILITY IDEOGRAPH-2F91B
+2F91C;ID # CJK COMPATIBILITY IDEOGRAPH-2F91C
+2F91D;ID # CJK COMPATIBILITY IDEOGRAPH-2F91D
+2F91E;ID # CJK COMPATIBILITY IDEOGRAPH-2F91E
+2F91F;ID # CJK COMPATIBILITY IDEOGRAPH-2F91F
+2F920;ID # CJK COMPATIBILITY IDEOGRAPH-2F920
+2F921;ID # CJK COMPATIBILITY IDEOGRAPH-2F921
+2F922;ID # CJK COMPATIBILITY IDEOGRAPH-2F922
+2F923;ID # CJK COMPATIBILITY IDEOGRAPH-2F923
+2F924;ID # CJK COMPATIBILITY IDEOGRAPH-2F924
+2F925;ID # CJK COMPATIBILITY IDEOGRAPH-2F925
+2F926;ID # CJK COMPATIBILITY IDEOGRAPH-2F926
+2F927;ID # CJK COMPATIBILITY IDEOGRAPH-2F927
+2F928;ID # CJK COMPATIBILITY IDEOGRAPH-2F928
+2F929;ID # CJK COMPATIBILITY IDEOGRAPH-2F929
+2F92A;ID # CJK COMPATIBILITY IDEOGRAPH-2F92A
+2F92B;ID # CJK COMPATIBILITY IDEOGRAPH-2F92B
+2F92C;ID # CJK COMPATIBILITY IDEOGRAPH-2F92C
+2F92D;ID # CJK COMPATIBILITY IDEOGRAPH-2F92D
+2F92E;ID # CJK COMPATIBILITY IDEOGRAPH-2F92E
+2F92F;ID # CJK COMPATIBILITY IDEOGRAPH-2F92F
+2F930;ID # CJK COMPATIBILITY IDEOGRAPH-2F930
+2F931;ID # CJK COMPATIBILITY IDEOGRAPH-2F931
+2F932;ID # CJK COMPATIBILITY IDEOGRAPH-2F932
+2F933;ID # CJK COMPATIBILITY IDEOGRAPH-2F933
+2F934;ID # CJK COMPATIBILITY IDEOGRAPH-2F934
+2F935;ID # CJK COMPATIBILITY IDEOGRAPH-2F935
+2F936;ID # CJK COMPATIBILITY IDEOGRAPH-2F936
+2F937;ID # CJK COMPATIBILITY IDEOGRAPH-2F937
+2F938;ID # CJK COMPATIBILITY IDEOGRAPH-2F938
+2F939;ID # CJK COMPATIBILITY IDEOGRAPH-2F939
+2F93A;ID # CJK COMPATIBILITY IDEOGRAPH-2F93A
+2F93B;ID # CJK COMPATIBILITY IDEOGRAPH-2F93B
+2F93C;ID # CJK COMPATIBILITY IDEOGRAPH-2F93C
+2F93D;ID # CJK COMPATIBILITY IDEOGRAPH-2F93D
+2F93E;ID # CJK COMPATIBILITY IDEOGRAPH-2F93E
+2F93F;ID # CJK COMPATIBILITY IDEOGRAPH-2F93F
+2F940;ID # CJK COMPATIBILITY IDEOGRAPH-2F940
+2F941;ID # CJK COMPATIBILITY IDEOGRAPH-2F941
+2F942;ID # CJK COMPATIBILITY IDEOGRAPH-2F942
+2F943;ID # CJK COMPATIBILITY IDEOGRAPH-2F943
+2F944;ID # CJK COMPATIBILITY IDEOGRAPH-2F944
+2F945;ID # CJK COMPATIBILITY IDEOGRAPH-2F945
+2F946;ID # CJK COMPATIBILITY IDEOGRAPH-2F946
+2F947;ID # CJK COMPATIBILITY IDEOGRAPH-2F947
+2F948;ID # CJK COMPATIBILITY IDEOGRAPH-2F948
+2F949;ID # CJK COMPATIBILITY IDEOGRAPH-2F949
+2F94A;ID # CJK COMPATIBILITY IDEOGRAPH-2F94A
+2F94B;ID # CJK COMPATIBILITY IDEOGRAPH-2F94B
+2F94C;ID # CJK COMPATIBILITY IDEOGRAPH-2F94C
+2F94D;ID # CJK COMPATIBILITY IDEOGRAPH-2F94D
+2F94E;ID # CJK COMPATIBILITY IDEOGRAPH-2F94E
+2F94F;ID # CJK COMPATIBILITY IDEOGRAPH-2F94F
+2F950;ID # CJK COMPATIBILITY IDEOGRAPH-2F950
+2F951;ID # CJK COMPATIBILITY IDEOGRAPH-2F951
+2F952;ID # CJK COMPATIBILITY IDEOGRAPH-2F952
+2F953;ID # CJK COMPATIBILITY IDEOGRAPH-2F953
+2F954;ID # CJK COMPATIBILITY IDEOGRAPH-2F954
+2F955;ID # CJK COMPATIBILITY IDEOGRAPH-2F955
+2F956;ID # CJK COMPATIBILITY IDEOGRAPH-2F956
+2F957;ID # CJK COMPATIBILITY IDEOGRAPH-2F957
+2F958;ID # CJK COMPATIBILITY IDEOGRAPH-2F958
+2F959;ID # CJK COMPATIBILITY IDEOGRAPH-2F959
+2F95A;ID # CJK COMPATIBILITY IDEOGRAPH-2F95A
+2F95B;ID # CJK COMPATIBILITY IDEOGRAPH-2F95B
+2F95C;ID # CJK COMPATIBILITY IDEOGRAPH-2F95C
+2F95D;ID # CJK COMPATIBILITY IDEOGRAPH-2F95D
+2F95E;ID # CJK COMPATIBILITY IDEOGRAPH-2F95E
+2F95F;ID # CJK COMPATIBILITY IDEOGRAPH-2F95F
+2F960;ID # CJK COMPATIBILITY IDEOGRAPH-2F960
+2F961;ID # CJK COMPATIBILITY IDEOGRAPH-2F961
+2F962;ID # CJK COMPATIBILITY IDEOGRAPH-2F962
+2F963;ID # CJK COMPATIBILITY IDEOGRAPH-2F963
+2F964;ID # CJK COMPATIBILITY IDEOGRAPH-2F964
+2F965;ID # CJK COMPATIBILITY IDEOGRAPH-2F965
+2F966;ID # CJK COMPATIBILITY IDEOGRAPH-2F966
+2F967;ID # CJK COMPATIBILITY IDEOGRAPH-2F967
+2F968;ID # CJK COMPATIBILITY IDEOGRAPH-2F968
+2F969;ID # CJK COMPATIBILITY IDEOGRAPH-2F969
+2F96A;ID # CJK COMPATIBILITY IDEOGRAPH-2F96A
+2F96B;ID # CJK COMPATIBILITY IDEOGRAPH-2F96B
+2F96C;ID # CJK COMPATIBILITY IDEOGRAPH-2F96C
+2F96D;ID # CJK COMPATIBILITY IDEOGRAPH-2F96D
+2F96E;ID # CJK COMPATIBILITY IDEOGRAPH-2F96E
+2F96F;ID # CJK COMPATIBILITY IDEOGRAPH-2F96F
+2F970;ID # CJK COMPATIBILITY IDEOGRAPH-2F970
+2F971;ID # CJK COMPATIBILITY IDEOGRAPH-2F971
+2F972;ID # CJK COMPATIBILITY IDEOGRAPH-2F972
+2F973;ID # CJK COMPATIBILITY IDEOGRAPH-2F973
+2F974;ID # CJK COMPATIBILITY IDEOGRAPH-2F974
+2F975;ID # CJK COMPATIBILITY IDEOGRAPH-2F975
+2F976;ID # CJK COMPATIBILITY IDEOGRAPH-2F976
+2F977;ID # CJK COMPATIBILITY IDEOGRAPH-2F977
+2F978;ID # CJK COMPATIBILITY IDEOGRAPH-2F978
+2F979;ID # CJK COMPATIBILITY IDEOGRAPH-2F979
+2F97A;ID # CJK COMPATIBILITY IDEOGRAPH-2F97A
+2F97B;ID # CJK COMPATIBILITY IDEOGRAPH-2F97B
+2F97C;ID # CJK COMPATIBILITY IDEOGRAPH-2F97C
+2F97D;ID # CJK COMPATIBILITY IDEOGRAPH-2F97D
+2F97E;ID # CJK COMPATIBILITY IDEOGRAPH-2F97E
+2F97F;ID # CJK COMPATIBILITY IDEOGRAPH-2F97F
+2F980;ID # CJK COMPATIBILITY IDEOGRAPH-2F980
+2F981;ID # CJK COMPATIBILITY IDEOGRAPH-2F981
+2F982;ID # CJK COMPATIBILITY IDEOGRAPH-2F982
+2F983;ID # CJK COMPATIBILITY IDEOGRAPH-2F983
+2F984;ID # CJK COMPATIBILITY IDEOGRAPH-2F984
+2F985;ID # CJK COMPATIBILITY IDEOGRAPH-2F985
+2F986;ID # CJK COMPATIBILITY IDEOGRAPH-2F986
+2F987;ID # CJK COMPATIBILITY IDEOGRAPH-2F987
+2F988;ID # CJK COMPATIBILITY IDEOGRAPH-2F988
+2F989;ID # CJK COMPATIBILITY IDEOGRAPH-2F989
+2F98A;ID # CJK COMPATIBILITY IDEOGRAPH-2F98A
+2F98B;ID # CJK COMPATIBILITY IDEOGRAPH-2F98B
+2F98C;ID # CJK COMPATIBILITY IDEOGRAPH-2F98C
+2F98D;ID # CJK COMPATIBILITY IDEOGRAPH-2F98D
+2F98E;ID # CJK COMPATIBILITY IDEOGRAPH-2F98E
+2F98F;ID # CJK COMPATIBILITY IDEOGRAPH-2F98F
+2F990;ID # CJK COMPATIBILITY IDEOGRAPH-2F990
+2F991;ID # CJK COMPATIBILITY IDEOGRAPH-2F991
+2F992;ID # CJK COMPATIBILITY IDEOGRAPH-2F992
+2F993;ID # CJK COMPATIBILITY IDEOGRAPH-2F993
+2F994;ID # CJK COMPATIBILITY IDEOGRAPH-2F994
+2F995;ID # CJK COMPATIBILITY IDEOGRAPH-2F995
+2F996;ID # CJK COMPATIBILITY IDEOGRAPH-2F996
+2F997;ID # CJK COMPATIBILITY IDEOGRAPH-2F997
+2F998;ID # CJK COMPATIBILITY IDEOGRAPH-2F998
+2F999;ID # CJK COMPATIBILITY IDEOGRAPH-2F999
+2F99A;ID # CJK COMPATIBILITY IDEOGRAPH-2F99A
+2F99B;ID # CJK COMPATIBILITY IDEOGRAPH-2F99B
+2F99C;ID # CJK COMPATIBILITY IDEOGRAPH-2F99C
+2F99D;ID # CJK COMPATIBILITY IDEOGRAPH-2F99D
+2F99E;ID # CJK COMPATIBILITY IDEOGRAPH-2F99E
+2F99F;ID # CJK COMPATIBILITY IDEOGRAPH-2F99F
+2F9A0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A0
+2F9A1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A1
+2F9A2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A2
+2F9A3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A3
+2F9A4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A4
+2F9A5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A5
+2F9A6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A6
+2F9A7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A7
+2F9A8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A8
+2F9A9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9A9
+2F9AA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AA
+2F9AB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AB
+2F9AC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AC
+2F9AD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AD
+2F9AE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AE
+2F9AF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9AF
+2F9B0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B0
+2F9B1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B1
+2F9B2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B2
+2F9B3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B3
+2F9B4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B4
+2F9B5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B5
+2F9B6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B6
+2F9B7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B7
+2F9B8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B8
+2F9B9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9B9
+2F9BA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BA
+2F9BB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BB
+2F9BC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BC
+2F9BD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BD
+2F9BE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BE
+2F9BF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9BF
+2F9C0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C0
+2F9C1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C1
+2F9C2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C2
+2F9C3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C3
+2F9C4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C4
+2F9C5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C5
+2F9C6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C6
+2F9C7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C7
+2F9C8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C8
+2F9C9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9C9
+2F9CA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CA
+2F9CB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CB
+2F9CC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CC
+2F9CD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CD
+2F9CE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CE
+2F9CF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9CF
+2F9D0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D0
+2F9D1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D1
+2F9D2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D2
+2F9D3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D3
+2F9D4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D4
+2F9D5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D5
+2F9D6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D6
+2F9D7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D7
+2F9D8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D8
+2F9D9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9D9
+2F9DA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DA
+2F9DB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DB
+2F9DC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DC
+2F9DD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DD
+2F9DE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DE
+2F9DF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9DF
+2F9E0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E0
+2F9E1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E1
+2F9E2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E2
+2F9E3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E3
+2F9E4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E4
+2F9E5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E5
+2F9E6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E6
+2F9E7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E7
+2F9E8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E8
+2F9E9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9E9
+2F9EA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EA
+2F9EB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EB
+2F9EC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EC
+2F9ED;ID # CJK COMPATIBILITY IDEOGRAPH-2F9ED
+2F9EE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EE
+2F9EF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9EF
+2F9F0;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F0
+2F9F1;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F1
+2F9F2;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F2
+2F9F3;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F3
+2F9F4;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F4
+2F9F5;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F5
+2F9F6;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F6
+2F9F7;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F7
+2F9F8;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F8
+2F9F9;ID # CJK COMPATIBILITY IDEOGRAPH-2F9F9
+2F9FA;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FA
+2F9FB;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FB
+2F9FC;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FC
+2F9FD;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FD
+2F9FE;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FE
+2F9FF;ID # CJK COMPATIBILITY IDEOGRAPH-2F9FF
+2FA00;ID # CJK COMPATIBILITY IDEOGRAPH-2FA00
+2FA01;ID # CJK COMPATIBILITY IDEOGRAPH-2FA01
+2FA02;ID # CJK COMPATIBILITY IDEOGRAPH-2FA02
+2FA03;ID # CJK COMPATIBILITY IDEOGRAPH-2FA03
+2FA04;ID # CJK COMPATIBILITY IDEOGRAPH-2FA04
+2FA05;ID # CJK COMPATIBILITY IDEOGRAPH-2FA05
+2FA06;ID # CJK COMPATIBILITY IDEOGRAPH-2FA06
+2FA07;ID # CJK COMPATIBILITY IDEOGRAPH-2FA07
+2FA08;ID # CJK COMPATIBILITY IDEOGRAPH-2FA08
+2FA09;ID # CJK COMPATIBILITY IDEOGRAPH-2FA09
+2FA0A;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0A
+2FA0B;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0B
+2FA0C;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0C
+2FA0D;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0D
+2FA0E;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0E
+2FA0F;ID # CJK COMPATIBILITY IDEOGRAPH-2FA0F
+2FA10;ID # CJK COMPATIBILITY IDEOGRAPH-2FA10
+2FA11;ID # CJK COMPATIBILITY IDEOGRAPH-2FA11
+2FA12;ID # CJK COMPATIBILITY IDEOGRAPH-2FA12
+2FA13;ID # CJK COMPATIBILITY IDEOGRAPH-2FA13
+2FA14;ID # CJK COMPATIBILITY IDEOGRAPH-2FA14
+2FA15;ID # CJK COMPATIBILITY IDEOGRAPH-2FA15
+2FA16;ID # CJK COMPATIBILITY IDEOGRAPH-2FA16
+2FA17;ID # CJK COMPATIBILITY IDEOGRAPH-2FA17
+2FA18;ID # CJK COMPATIBILITY IDEOGRAPH-2FA18
+2FA19;ID # CJK COMPATIBILITY IDEOGRAPH-2FA19
+2FA1A;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1A
+2FA1B;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1B
+2FA1C;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1C
+2FA1D;ID # CJK COMPATIBILITY IDEOGRAPH-2FA1D
+E0001;CM # LANGUAGE TAG
+E0020;CM # TAG SPACE
+E0021;CM # TAG EXCLAMATION MARK
+E0022;CM # TAG QUOTATION MARK
+E0023;CM # TAG NUMBER SIGN
+E0024;CM # TAG DOLLAR SIGN
+E0025;CM # TAG PERCENT SIGN
+E0026;CM # TAG AMPERSAND
+E0027;CM # TAG APOSTROPHE
+E0028;CM # TAG LEFT PARENTHESIS
+E0029;CM # TAG RIGHT PARENTHESIS
+E002A;CM # TAG ASTERISK
+E002B;CM # TAG PLUS SIGN
+E002C;CM # TAG COMMA
+E002D;CM # TAG HYPHEN-MINUS
+E002E;CM # TAG FULL STOP
+E002F;CM # TAG SOLIDUS
+E0030;CM # TAG DIGIT ZERO
+E0031;CM # TAG DIGIT ONE
+E0032;CM # TAG DIGIT TWO
+E0033;CM # TAG DIGIT THREE
+E0034;CM # TAG DIGIT FOUR
+E0035;CM # TAG DIGIT FIVE
+E0036;CM # TAG DIGIT SIX
+E0037;CM # TAG DIGIT SEVEN
+E0038;CM # TAG DIGIT EIGHT
+E0039;CM # TAG DIGIT NINE
+E003A;CM # TAG COLON
+E003B;CM # TAG SEMICOLON
+E003C;CM # TAG LESS-THAN SIGN
+E003D;CM # TAG EQUALS SIGN
+E003E;CM # TAG GREATER-THAN SIGN
+E003F;CM # TAG QUESTION MARK
+E0040;CM # TAG COMMERCIAL AT
+E0041;CM # TAG LATIN CAPITAL LETTER A
+E0042;CM # TAG LATIN CAPITAL LETTER B
+E0043;CM # TAG LATIN CAPITAL LETTER C
+E0044;CM # TAG LATIN CAPITAL LETTER D
+E0045;CM # TAG LATIN CAPITAL LETTER E
+E0046;CM # TAG LATIN CAPITAL LETTER F
+E0047;CM # TAG LATIN CAPITAL LETTER G
+E0048;CM # TAG LATIN CAPITAL LETTER H
+E0049;CM # TAG LATIN CAPITAL LETTER I
+E004A;CM # TAG LATIN CAPITAL LETTER J
+E004B;CM # TAG LATIN CAPITAL LETTER K
+E004C;CM # TAG LATIN CAPITAL LETTER L
+E004D;CM # TAG LATIN CAPITAL LETTER M
+E004E;CM # TAG LATIN CAPITAL LETTER N
+E004F;CM # TAG LATIN CAPITAL LETTER O
+E0050;CM # TAG LATIN CAPITAL LETTER P
+E0051;CM # TAG LATIN CAPITAL LETTER Q
+E0052;CM # TAG LATIN CAPITAL LETTER R
+E0053;CM # TAG LATIN CAPITAL LETTER S
+E0054;CM # TAG LATIN CAPITAL LETTER T
+E0055;CM # TAG LATIN CAPITAL LETTER U
+E0056;CM # TAG LATIN CAPITAL LETTER V
+E0057;CM # TAG LATIN CAPITAL LETTER W
+E0058;CM # TAG LATIN CAPITAL LETTER X
+E0059;CM # TAG LATIN CAPITAL LETTER Y
+E005A;CM # TAG LATIN CAPITAL LETTER Z
+E005B;CM # TAG LEFT SQUARE BRACKET
+E005C;CM # TAG REVERSE SOLIDUS
+E005D;CM # TAG RIGHT SQUARE BRACKET
+E005E;CM # TAG CIRCUMFLEX ACCENT
+E005F;CM # TAG LOW LINE
+E0060;CM # TAG GRAVE ACCENT
+E0061;CM # TAG LATIN SMALL LETTER A
+E0062;CM # TAG LATIN SMALL LETTER B
+E0063;CM # TAG LATIN SMALL LETTER C
+E0064;CM # TAG LATIN SMALL LETTER D
+E0065;CM # TAG LATIN SMALL LETTER E
+E0066;CM # TAG LATIN SMALL LETTER F
+E0067;CM # TAG LATIN SMALL LETTER G
+E0068;CM # TAG LATIN SMALL LETTER H
+E0069;CM # TAG LATIN SMALL LETTER I
+E006A;CM # TAG LATIN SMALL LETTER J
+E006B;CM # TAG LATIN SMALL LETTER K
+E006C;CM # TAG LATIN SMALL LETTER L
+E006D;CM # TAG LATIN SMALL LETTER M
+E006E;CM # TAG LATIN SMALL LETTER N
+E006F;CM # TAG LATIN SMALL LETTER O
+E0070;CM # TAG LATIN SMALL LETTER P
+E0071;CM # TAG LATIN SMALL LETTER Q
+E0072;CM # TAG LATIN SMALL LETTER R
+E0073;CM # TAG LATIN SMALL LETTER S
+E0074;CM # TAG LATIN SMALL LETTER T
+E0075;CM # TAG LATIN SMALL LETTER U
+E0076;CM # TAG LATIN SMALL LETTER V
+E0077;CM # TAG LATIN SMALL LETTER W
+E0078;CM # TAG LATIN SMALL LETTER X
+E0079;CM # TAG LATIN SMALL LETTER Y
+E007A;CM # TAG LATIN SMALL LETTER Z
+E007B;CM # TAG LEFT CURLY BRACKET
+E007C;CM # TAG VERTICAL LINE
+E007D;CM # TAG RIGHT CURLY BRACKET
+E007E;CM # TAG TILDE
+E007F;CM # CANCEL TAG
+E0100;CM # VARIATION SELECTOR-17
+E0101;CM # VARIATION SELECTOR-18
+E0102;CM # VARIATION SELECTOR-19
+E0103;CM # VARIATION SELECTOR-20
+E0104;CM # VARIATION SELECTOR-21
+E0105;CM # VARIATION SELECTOR-22
+E0106;CM # VARIATION SELECTOR-23
+E0107;CM # VARIATION SELECTOR-24
+E0108;CM # VARIATION SELECTOR-25
+E0109;CM # VARIATION SELECTOR-26
+E010A;CM # VARIATION SELECTOR-27
+E010B;CM # VARIATION SELECTOR-28
+E010C;CM # VARIATION SELECTOR-29
+E010D;CM # VARIATION SELECTOR-30
+E010E;CM # VARIATION SELECTOR-31
+E010F;CM # VARIATION SELECTOR-32
+E0110;CM # VARIATION SELECTOR-33
+E0111;CM # VARIATION SELECTOR-34
+E0112;CM # VARIATION SELECTOR-35
+E0113;CM # VARIATION SELECTOR-36
+E0114;CM # VARIATION SELECTOR-37
+E0115;CM # VARIATION SELECTOR-38
+E0116;CM # VARIATION SELECTOR-39
+E0117;CM # VARIATION SELECTOR-40
+E0118;CM # VARIATION SELECTOR-41
+E0119;CM # VARIATION SELECTOR-42
+E011A;CM # VARIATION SELECTOR-43
+E011B;CM # VARIATION SELECTOR-44
+E011C;CM # VARIATION SELECTOR-45
+E011D;CM # VARIATION SELECTOR-46
+E011E;CM # VARIATION SELECTOR-47
+E011F;CM # VARIATION SELECTOR-48
+E0120;CM # VARIATION SELECTOR-49
+E0121;CM # VARIATION SELECTOR-50
+E0122;CM # VARIATION SELECTOR-51
+E0123;CM # VARIATION SELECTOR-52
+E0124;CM # VARIATION SELECTOR-53
+E0125;CM # VARIATION SELECTOR-54
+E0126;CM # VARIATION SELECTOR-55
+E0127;CM # VARIATION SELECTOR-56
+E0128;CM # VARIATION SELECTOR-57
+E0129;CM # VARIATION SELECTOR-58
+E012A;CM # VARIATION SELECTOR-59
+E012B;CM # VARIATION SELECTOR-60
+E012C;CM # VARIATION SELECTOR-61
+E012D;CM # VARIATION SELECTOR-62
+E012E;CM # VARIATION SELECTOR-63
+E012F;CM # VARIATION SELECTOR-64
+E0130;CM # VARIATION SELECTOR-65
+E0131;CM # VARIATION SELECTOR-66
+E0132;CM # VARIATION SELECTOR-67
+E0133;CM # VARIATION SELECTOR-68
+E0134;CM # VARIATION SELECTOR-69
+E0135;CM # VARIATION SELECTOR-70
+E0136;CM # VARIATION SELECTOR-71
+E0137;CM # VARIATION SELECTOR-72
+E0138;CM # VARIATION SELECTOR-73
+E0139;CM # VARIATION SELECTOR-74
+E013A;CM # VARIATION SELECTOR-75
+E013B;CM # VARIATION SELECTOR-76
+E013C;CM # VARIATION SELECTOR-77
+E013D;CM # VARIATION SELECTOR-78
+E013E;CM # VARIATION SELECTOR-79
+E013F;CM # VARIATION SELECTOR-80
+E0140;CM # VARIATION SELECTOR-81
+E0141;CM # VARIATION SELECTOR-82
+E0142;CM # VARIATION SELECTOR-83
+E0143;CM # VARIATION SELECTOR-84
+E0144;CM # VARIATION SELECTOR-85
+E0145;CM # VARIATION SELECTOR-86
+E0146;CM # VARIATION SELECTOR-87
+E0147;CM # VARIATION SELECTOR-88
+E0148;CM # VARIATION SELECTOR-89
+E0149;CM # VARIATION SELECTOR-90
+E014A;CM # VARIATION SELECTOR-91
+E014B;CM # VARIATION SELECTOR-92
+E014C;CM # VARIATION SELECTOR-93
+E014D;CM # VARIATION SELECTOR-94
+E014E;CM # VARIATION SELECTOR-95
+E014F;CM # VARIATION SELECTOR-96
+E0150;CM # VARIATION SELECTOR-97
+E0151;CM # VARIATION SELECTOR-98
+E0152;CM # VARIATION SELECTOR-99
+E0153;CM # VARIATION SELECTOR-100
+E0154;CM # VARIATION SELECTOR-101
+E0155;CM # VARIATION SELECTOR-102
+E0156;CM # VARIATION SELECTOR-103
+E0157;CM # VARIATION SELECTOR-104
+E0158;CM # VARIATION SELECTOR-105
+E0159;CM # VARIATION SELECTOR-106
+E015A;CM # VARIATION SELECTOR-107
+E015B;CM # VARIATION SELECTOR-108
+E015C;CM # VARIATION SELECTOR-109
+E015D;CM # VARIATION SELECTOR-110
+E015E;CM # VARIATION SELECTOR-111
+E015F;CM # VARIATION SELECTOR-112
+E0160;CM # VARIATION SELECTOR-113
+E0161;CM # VARIATION SELECTOR-114
+E0162;CM # VARIATION SELECTOR-115
+E0163;CM # VARIATION SELECTOR-116
+E0164;CM # VARIATION SELECTOR-117
+E0165;CM # VARIATION SELECTOR-118
+E0166;CM # VARIATION SELECTOR-119
+E0167;CM # VARIATION SELECTOR-120
+E0168;CM # VARIATION SELECTOR-121
+E0169;CM # VARIATION SELECTOR-122
+E016A;CM # VARIATION SELECTOR-123
+E016B;CM # VARIATION SELECTOR-124
+E016C;CM # VARIATION SELECTOR-125
+E016D;CM # VARIATION SELECTOR-126
+E016E;CM # VARIATION SELECTOR-127
+E016F;CM # VARIATION SELECTOR-128
+E0170;CM # VARIATION SELECTOR-129
+E0171;CM # VARIATION SELECTOR-130
+E0172;CM # VARIATION SELECTOR-131
+E0173;CM # VARIATION SELECTOR-132
+E0174;CM # VARIATION SELECTOR-133
+E0175;CM # VARIATION SELECTOR-134
+E0176;CM # VARIATION SELECTOR-135
+E0177;CM # VARIATION SELECTOR-136
+E0178;CM # VARIATION SELECTOR-137
+E0179;CM # VARIATION SELECTOR-138
+E017A;CM # VARIATION SELECTOR-139
+E017B;CM # VARIATION SELECTOR-140
+E017C;CM # VARIATION SELECTOR-141
+E017D;CM # VARIATION SELECTOR-142
+E017E;CM # VARIATION SELECTOR-143
+E017F;CM # VARIATION SELECTOR-144
+E0180;CM # VARIATION SELECTOR-145
+E0181;CM # VARIATION SELECTOR-146
+E0182;CM # VARIATION SELECTOR-147
+E0183;CM # VARIATION SELECTOR-148
+E0184;CM # VARIATION SELECTOR-149
+E0185;CM # VARIATION SELECTOR-150
+E0186;CM # VARIATION SELECTOR-151
+E0187;CM # VARIATION SELECTOR-152
+E0188;CM # VARIATION SELECTOR-153
+E0189;CM # VARIATION SELECTOR-154
+E018A;CM # VARIATION SELECTOR-155
+E018B;CM # VARIATION SELECTOR-156
+E018C;CM # VARIATION SELECTOR-157
+E018D;CM # VARIATION SELECTOR-158
+E018E;CM # VARIATION SELECTOR-159
+E018F;CM # VARIATION SELECTOR-160
+E0190;CM # VARIATION SELECTOR-161
+E0191;CM # VARIATION SELECTOR-162
+E0192;CM # VARIATION SELECTOR-163
+E0193;CM # VARIATION SELECTOR-164
+E0194;CM # VARIATION SELECTOR-165
+E0195;CM # VARIATION SELECTOR-166
+E0196;CM # VARIATION SELECTOR-167
+E0197;CM # VARIATION SELECTOR-168
+E0198;CM # VARIATION SELECTOR-169
+E0199;CM # VARIATION SELECTOR-170
+E019A;CM # VARIATION SELECTOR-171
+E019B;CM # VARIATION SELECTOR-172
+E019C;CM # VARIATION SELECTOR-173
+E019D;CM # VARIATION SELECTOR-174
+E019E;CM # VARIATION SELECTOR-175
+E019F;CM # VARIATION SELECTOR-176
+E01A0;CM # VARIATION SELECTOR-177
+E01A1;CM # VARIATION SELECTOR-178
+E01A2;CM # VARIATION SELECTOR-179
+E01A3;CM # VARIATION SELECTOR-180
+E01A4;CM # VARIATION SELECTOR-181
+E01A5;CM # VARIATION SELECTOR-182
+E01A6;CM # VARIATION SELECTOR-183
+E01A7;CM # VARIATION SELECTOR-184
+E01A8;CM # VARIATION SELECTOR-185
+E01A9;CM # VARIATION SELECTOR-186
+E01AA;CM # VARIATION SELECTOR-187
+E01AB;CM # VARIATION SELECTOR-188
+E01AC;CM # VARIATION SELECTOR-189
+E01AD;CM # VARIATION SELECTOR-190
+E01AE;CM # VARIATION SELECTOR-191
+E01AF;CM # VARIATION SELECTOR-192
+E01B0;CM # VARIATION SELECTOR-193
+E01B1;CM # VARIATION SELECTOR-194
+E01B2;CM # VARIATION SELECTOR-195
+E01B3;CM # VARIATION SELECTOR-196
+E01B4;CM # VARIATION SELECTOR-197
+E01B5;CM # VARIATION SELECTOR-198
+E01B6;CM # VARIATION SELECTOR-199
+E01B7;CM # VARIATION SELECTOR-200
+E01B8;CM # VARIATION SELECTOR-201
+E01B9;CM # VARIATION SELECTOR-202
+E01BA;CM # VARIATION SELECTOR-203
+E01BB;CM # VARIATION SELECTOR-204
+E01BC;CM # VARIATION SELECTOR-205
+E01BD;CM # VARIATION SELECTOR-206
+E01BE;CM # VARIATION SELECTOR-207
+E01BF;CM # VARIATION SELECTOR-208
+E01C0;CM # VARIATION SELECTOR-209
+E01C1;CM # VARIATION SELECTOR-210
+E01C2;CM # VARIATION SELECTOR-211
+E01C3;CM # VARIATION SELECTOR-212
+E01C4;CM # VARIATION SELECTOR-213
+E01C5;CM # VARIATION SELECTOR-214
+E01C6;CM # VARIATION SELECTOR-215
+E01C7;CM # VARIATION SELECTOR-216
+E01C8;CM # VARIATION SELECTOR-217
+E01C9;CM # VARIATION SELECTOR-218
+E01CA;CM # VARIATION SELECTOR-219
+E01CB;CM # VARIATION SELECTOR-220
+E01CC;CM # VARIATION SELECTOR-221
+E01CD;CM # VARIATION SELECTOR-222
+E01CE;CM # VARIATION SELECTOR-223
+E01CF;CM # VARIATION SELECTOR-224
+E01D0;CM # VARIATION SELECTOR-225
+E01D1;CM # VARIATION SELECTOR-226
+E01D2;CM # VARIATION SELECTOR-227
+E01D3;CM # VARIATION SELECTOR-228
+E01D4;CM # VARIATION SELECTOR-229
+E01D5;CM # VARIATION SELECTOR-230
+E01D6;CM # VARIATION SELECTOR-231
+E01D7;CM # VARIATION SELECTOR-232
+E01D8;CM # VARIATION SELECTOR-233
+E01D9;CM # VARIATION SELECTOR-234
+E01DA;CM # VARIATION SELECTOR-235
+E01DB;CM # VARIATION SELECTOR-236
+E01DC;CM # VARIATION SELECTOR-237
+E01DD;CM # VARIATION SELECTOR-238
+E01DE;CM # VARIATION SELECTOR-239
+E01DF;CM # VARIATION SELECTOR-240
+E01E0;CM # VARIATION SELECTOR-241
+E01E1;CM # VARIATION SELECTOR-242
+E01E2;CM # VARIATION SELECTOR-243
+E01E3;CM # VARIATION SELECTOR-244
+E01E4;CM # VARIATION SELECTOR-245
+E01E5;CM # VARIATION SELECTOR-246
+E01E6;CM # VARIATION SELECTOR-247
+E01E7;CM # VARIATION SELECTOR-248
+E01E8;CM # VARIATION SELECTOR-249
+E01E9;CM # VARIATION SELECTOR-250
+E01EA;CM # VARIATION SELECTOR-251
+E01EB;CM # VARIATION SELECTOR-252
+E01EC;CM # VARIATION SELECTOR-253
+E01ED;CM # VARIATION SELECTOR-254
+E01EE;CM # VARIATION SELECTOR-255
+E01EF;CM # VARIATION SELECTOR-256
+F0000..FFFFD;XX # <Plane 15 Private Use, First>..<Plane 15 Private Use, Last>
+100000..10FFFD;XX # <Plane 16 Private Use, First>..<Plane 16 Private Use, Last>
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/Name.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/Name.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/Name.pl	(revision 14489)
@@ -0,0 +1,16346 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+return <<'END';
+0000		NULL
+0001		START OF HEADING
+0002		START OF TEXT
+0003		END OF TEXT
+0004		END OF TRANSMISSION
+0005		ENQUIRY
+0006		ACKNOWLEDGE
+0007		BELL
+0008		BACKSPACE
+0009		CHARACTER TABULATION
+000A		LINE FEED (LF)
+000B		LINE TABULATION
+000C		FORM FEED (FF)
+000D		CARRIAGE RETURN (CR)
+000E		SHIFT OUT
+000F		SHIFT IN
+0010		DATA LINK ESCAPE
+0011		DEVICE CONTROL ONE
+0012		DEVICE CONTROL TWO
+0013		DEVICE CONTROL THREE
+0014		DEVICE CONTROL FOUR
+0015		NEGATIVE ACKNOWLEDGE
+0016		SYNCHRONOUS IDLE
+0017		END OF TRANSMISSION BLOCK
+0018		CANCEL
+0019		END OF MEDIUM
+001A		SUBSTITUTE
+001B		ESCAPE
+001C		INFORMATION SEPARATOR FOUR
+001D		INFORMATION SEPARATOR THREE
+001E		INFORMATION SEPARATOR TWO
+001F		INFORMATION SEPARATOR ONE
+0020		SPACE
+0021		EXCLAMATION MARK
+0022		QUOTATION MARK
+0023		NUMBER SIGN
+0024		DOLLAR SIGN
+0025		PERCENT SIGN
+0026		AMPERSAND
+0027		APOSTROPHE
+0028		LEFT PARENTHESIS
+0029		RIGHT PARENTHESIS
+002A		ASTERISK
+002B		PLUS SIGN
+002C		COMMA
+002D		HYPHEN-MINUS
+002E		FULL STOP
+002F		SOLIDUS
+0030		DIGIT ZERO
+0031		DIGIT ONE
+0032		DIGIT TWO
+0033		DIGIT THREE
+0034		DIGIT FOUR
+0035		DIGIT FIVE
+0036		DIGIT SIX
+0037		DIGIT SEVEN
+0038		DIGIT EIGHT
+0039		DIGIT NINE
+003A		COLON
+003B		SEMICOLON
+003C		LESS-THAN SIGN
+003D		EQUALS SIGN
+003E		GREATER-THAN SIGN
+003F		QUESTION MARK
+0040		COMMERCIAL AT
+0041		LATIN CAPITAL LETTER A
+0042		LATIN CAPITAL LETTER B
+0043		LATIN CAPITAL LETTER C
+0044		LATIN CAPITAL LETTER D
+0045		LATIN CAPITAL LETTER E
+0046		LATIN CAPITAL LETTER F
+0047		LATIN CAPITAL LETTER G
+0048		LATIN CAPITAL LETTER H
+0049		LATIN CAPITAL LETTER I
+004A		LATIN CAPITAL LETTER J
+004B		LATIN CAPITAL LETTER K
+004C		LATIN CAPITAL LETTER L
+004D		LATIN CAPITAL LETTER M
+004E		LATIN CAPITAL LETTER N
+004F		LATIN CAPITAL LETTER O
+0050		LATIN CAPITAL LETTER P
+0051		LATIN CAPITAL LETTER Q
+0052		LATIN CAPITAL LETTER R
+0053		LATIN CAPITAL LETTER S
+0054		LATIN CAPITAL LETTER T
+0055		LATIN CAPITAL LETTER U
+0056		LATIN CAPITAL LETTER V
+0057		LATIN CAPITAL LETTER W
+0058		LATIN CAPITAL LETTER X
+0059		LATIN CAPITAL LETTER Y
+005A		LATIN CAPITAL LETTER Z
+005B		LEFT SQUARE BRACKET
+005C		REVERSE SOLIDUS
+005D		RIGHT SQUARE BRACKET
+005E		CIRCUMFLEX ACCENT
+005F		LOW LINE
+0060		GRAVE ACCENT
+0061		LATIN SMALL LETTER A
+0062		LATIN SMALL LETTER B
+0063		LATIN SMALL LETTER C
+0064		LATIN SMALL LETTER D
+0065		LATIN SMALL LETTER E
+0066		LATIN SMALL LETTER F
+0067		LATIN SMALL LETTER G
+0068		LATIN SMALL LETTER H
+0069		LATIN SMALL LETTER I
+006A		LATIN SMALL LETTER J
+006B		LATIN SMALL LETTER K
+006C		LATIN SMALL LETTER L
+006D		LATIN SMALL LETTER M
+006E		LATIN SMALL LETTER N
+006F		LATIN SMALL LETTER O
+0070		LATIN SMALL LETTER P
+0071		LATIN SMALL LETTER Q
+0072		LATIN SMALL LETTER R
+0073		LATIN SMALL LETTER S
+0074		LATIN SMALL LETTER T
+0075		LATIN SMALL LETTER U
+0076		LATIN SMALL LETTER V
+0077		LATIN SMALL LETTER W
+0078		LATIN SMALL LETTER X
+0079		LATIN SMALL LETTER Y
+007A		LATIN SMALL LETTER Z
+007B		LEFT CURLY BRACKET
+007C		VERTICAL LINE
+007D		RIGHT CURLY BRACKET
+007E		TILDE
+007F		DELETE
+0080	0081	<control>
+0082		BREAK PERMITTED HERE
+0083		NO BREAK HERE
+0084		<control>
+0085		NEXT LINE (NEL)
+0086		START OF SELECTED AREA
+0087		END OF SELECTED AREA
+0088		CHARACTER TABULATION SET
+0089		CHARACTER TABULATION WITH JUSTIFICATION
+008A		LINE TABULATION SET
+008B		PARTIAL LINE FORWARD
+008C		PARTIAL LINE BACKWARD
+008D		REVERSE LINE FEED
+008E		SINGLE SHIFT TWO
+008F		SINGLE SHIFT THREE
+0090		DEVICE CONTROL STRING
+0091		PRIVATE USE ONE
+0092		PRIVATE USE TWO
+0093		SET TRANSMIT STATE
+0094		CANCEL CHARACTER
+0095		MESSAGE WAITING
+0096		START OF GUARDED AREA
+0097		END OF GUARDED AREA
+0098		START OF STRING
+0099		<control>
+009A		SINGLE CHARACTER INTRODUCER
+009B		CONTROL SEQUENCE INTRODUCER
+009C		STRING TERMINATOR
+009D		OPERATING SYSTEM COMMAND
+009E		PRIVACY MESSAGE
+009F		APPLICATION PROGRAM COMMAND
+00A0		NO-BREAK SPACE
+00A1		INVERTED EXCLAMATION MARK
+00A2		CENT SIGN
+00A3		POUND SIGN
+00A4		CURRENCY SIGN
+00A5		YEN SIGN
+00A6		BROKEN BAR
+00A7		SECTION SIGN
+00A8		DIAERESIS
+00A9		COPYRIGHT SIGN
+00AA		FEMININE ORDINAL INDICATOR
+00AB		LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC		NOT SIGN
+00AD		SOFT HYPHEN
+00AE		REGISTERED SIGN
+00AF		MACRON
+00B0		DEGREE SIGN
+00B1		PLUS-MINUS SIGN
+00B2		SUPERSCRIPT TWO
+00B3		SUPERSCRIPT THREE
+00B4		ACUTE ACCENT
+00B5		MICRO SIGN
+00B6		PILCROW SIGN
+00B7		MIDDLE DOT
+00B8		CEDILLA
+00B9		SUPERSCRIPT ONE
+00BA		MASCULINE ORDINAL INDICATOR
+00BB		RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC		VULGAR FRACTION ONE QUARTER
+00BD		VULGAR FRACTION ONE HALF
+00BE		VULGAR FRACTION THREE QUARTERS
+00BF		INVERTED QUESTION MARK
+00C0		LATIN CAPITAL LETTER A WITH GRAVE
+00C1		LATIN CAPITAL LETTER A WITH ACUTE
+00C2		LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3		LATIN CAPITAL LETTER A WITH TILDE
+00C4		LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5		LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6		LATIN CAPITAL LETTER AE
+00C7		LATIN CAPITAL LETTER C WITH CEDILLA
+00C8		LATIN CAPITAL LETTER E WITH GRAVE
+00C9		LATIN CAPITAL LETTER E WITH ACUTE
+00CA		LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB		LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC		LATIN CAPITAL LETTER I WITH GRAVE
+00CD		LATIN CAPITAL LETTER I WITH ACUTE
+00CE		LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF		LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0		LATIN CAPITAL LETTER ETH
+00D1		LATIN CAPITAL LETTER N WITH TILDE
+00D2		LATIN CAPITAL LETTER O WITH GRAVE
+00D3		LATIN CAPITAL LETTER O WITH ACUTE
+00D4		LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5		LATIN CAPITAL LETTER O WITH TILDE
+00D6		LATIN CAPITAL LETTER O WITH DIAERESIS
+00D7		MULTIPLICATION SIGN
+00D8		LATIN CAPITAL LETTER O WITH STROKE
+00D9		LATIN CAPITAL LETTER U WITH GRAVE
+00DA		LATIN CAPITAL LETTER U WITH ACUTE
+00DB		LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC		LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD		LATIN CAPITAL LETTER Y WITH ACUTE
+00DE		LATIN CAPITAL LETTER THORN
+00DF		LATIN SMALL LETTER SHARP S
+00E0		LATIN SMALL LETTER A WITH GRAVE
+00E1		LATIN SMALL LETTER A WITH ACUTE
+00E2		LATIN SMALL LETTER A WITH CIRCUMFLEX
+00E3		LATIN SMALL LETTER A WITH TILDE
+00E4		LATIN SMALL LETTER A WITH DIAERESIS
+00E5		LATIN SMALL LETTER A WITH RING ABOVE
+00E6		LATIN SMALL LETTER AE
+00E7		LATIN SMALL LETTER C WITH CEDILLA
+00E8		LATIN SMALL LETTER E WITH GRAVE
+00E9		LATIN SMALL LETTER E WITH ACUTE
+00EA		LATIN SMALL LETTER E WITH CIRCUMFLEX
+00EB		LATIN SMALL LETTER E WITH DIAERESIS
+00EC		LATIN SMALL LETTER I WITH GRAVE
+00ED		LATIN SMALL LETTER I WITH ACUTE
+00EE		LATIN SMALL LETTER I WITH CIRCUMFLEX
+00EF		LATIN SMALL LETTER I WITH DIAERESIS
+00F0		LATIN SMALL LETTER ETH
+00F1		LATIN SMALL LETTER N WITH TILDE
+00F2		LATIN SMALL LETTER O WITH GRAVE
+00F3		LATIN SMALL LETTER O WITH ACUTE
+00F4		LATIN SMALL LETTER O WITH CIRCUMFLEX
+00F5		LATIN SMALL LETTER O WITH TILDE
+00F6		LATIN SMALL LETTER O WITH DIAERESIS
+00F7		DIVISION SIGN
+00F8		LATIN SMALL LETTER O WITH STROKE
+00F9		LATIN SMALL LETTER U WITH GRAVE
+00FA		LATIN SMALL LETTER U WITH ACUTE
+00FB		LATIN SMALL LETTER U WITH CIRCUMFLEX
+00FC		LATIN SMALL LETTER U WITH DIAERESIS
+00FD		LATIN SMALL LETTER Y WITH ACUTE
+00FE		LATIN SMALL LETTER THORN
+00FF		LATIN SMALL LETTER Y WITH DIAERESIS
+0100		LATIN CAPITAL LETTER A WITH MACRON
+0101		LATIN SMALL LETTER A WITH MACRON
+0102		LATIN CAPITAL LETTER A WITH BREVE
+0103		LATIN SMALL LETTER A WITH BREVE
+0104		LATIN CAPITAL LETTER A WITH OGONEK
+0105		LATIN SMALL LETTER A WITH OGONEK
+0106		LATIN CAPITAL LETTER C WITH ACUTE
+0107		LATIN SMALL LETTER C WITH ACUTE
+0108		LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0109		LATIN SMALL LETTER C WITH CIRCUMFLEX
+010A		LATIN CAPITAL LETTER C WITH DOT ABOVE
+010B		LATIN SMALL LETTER C WITH DOT ABOVE
+010C		LATIN CAPITAL LETTER C WITH CARON
+010D		LATIN SMALL LETTER C WITH CARON
+010E		LATIN CAPITAL LETTER D WITH CARON
+010F		LATIN SMALL LETTER D WITH CARON
+0110		LATIN CAPITAL LETTER D WITH STROKE
+0111		LATIN SMALL LETTER D WITH STROKE
+0112		LATIN CAPITAL LETTER E WITH MACRON
+0113		LATIN SMALL LETTER E WITH MACRON
+0114		LATIN CAPITAL LETTER E WITH BREVE
+0115		LATIN SMALL LETTER E WITH BREVE
+0116		LATIN CAPITAL LETTER E WITH DOT ABOVE
+0117		LATIN SMALL LETTER E WITH DOT ABOVE
+0118		LATIN CAPITAL LETTER E WITH OGONEK
+0119		LATIN SMALL LETTER E WITH OGONEK
+011A		LATIN CAPITAL LETTER E WITH CARON
+011B		LATIN SMALL LETTER E WITH CARON
+011C		LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011D		LATIN SMALL LETTER G WITH CIRCUMFLEX
+011E		LATIN CAPITAL LETTER G WITH BREVE
+011F		LATIN SMALL LETTER G WITH BREVE
+0120		LATIN CAPITAL LETTER G WITH DOT ABOVE
+0121		LATIN SMALL LETTER G WITH DOT ABOVE
+0122		LATIN CAPITAL LETTER G WITH CEDILLA
+0123		LATIN SMALL LETTER G WITH CEDILLA
+0124		LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0125		LATIN SMALL LETTER H WITH CIRCUMFLEX
+0126		LATIN CAPITAL LETTER H WITH STROKE
+0127		LATIN SMALL LETTER H WITH STROKE
+0128		LATIN CAPITAL LETTER I WITH TILDE
+0129		LATIN SMALL LETTER I WITH TILDE
+012A		LATIN CAPITAL LETTER I WITH MACRON
+012B		LATIN SMALL LETTER I WITH MACRON
+012C		LATIN CAPITAL LETTER I WITH BREVE
+012D		LATIN SMALL LETTER I WITH BREVE
+012E		LATIN CAPITAL LETTER I WITH OGONEK
+012F		LATIN SMALL LETTER I WITH OGONEK
+0130		LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131		LATIN SMALL LETTER DOTLESS I
+0132		LATIN CAPITAL LIGATURE IJ
+0133		LATIN SMALL LIGATURE IJ
+0134		LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0135		LATIN SMALL LETTER J WITH CIRCUMFLEX
+0136		LATIN CAPITAL LETTER K WITH CEDILLA
+0137		LATIN SMALL LETTER K WITH CEDILLA
+0138		LATIN SMALL LETTER KRA
+0139		LATIN CAPITAL LETTER L WITH ACUTE
+013A		LATIN SMALL LETTER L WITH ACUTE
+013B		LATIN CAPITAL LETTER L WITH CEDILLA
+013C		LATIN SMALL LETTER L WITH CEDILLA
+013D		LATIN CAPITAL LETTER L WITH CARON
+013E		LATIN SMALL LETTER L WITH CARON
+013F		LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0140		LATIN SMALL LETTER L WITH MIDDLE DOT
+0141		LATIN CAPITAL LETTER L WITH STROKE
+0142		LATIN SMALL LETTER L WITH STROKE
+0143		LATIN CAPITAL LETTER N WITH ACUTE
+0144		LATIN SMALL LETTER N WITH ACUTE
+0145		LATIN CAPITAL LETTER N WITH CEDILLA
+0146		LATIN SMALL LETTER N WITH CEDILLA
+0147		LATIN CAPITAL LETTER N WITH CARON
+0148		LATIN SMALL LETTER N WITH CARON
+0149		LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A		LATIN CAPITAL LETTER ENG
+014B		LATIN SMALL LETTER ENG
+014C		LATIN CAPITAL LETTER O WITH MACRON
+014D		LATIN SMALL LETTER O WITH MACRON
+014E		LATIN CAPITAL LETTER O WITH BREVE
+014F		LATIN SMALL LETTER O WITH BREVE
+0150		LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0151		LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0152		LATIN CAPITAL LIGATURE OE
+0153		LATIN SMALL LIGATURE OE
+0154		LATIN CAPITAL LETTER R WITH ACUTE
+0155		LATIN SMALL LETTER R WITH ACUTE
+0156		LATIN CAPITAL LETTER R WITH CEDILLA
+0157		LATIN SMALL LETTER R WITH CEDILLA
+0158		LATIN CAPITAL LETTER R WITH CARON
+0159		LATIN SMALL LETTER R WITH CARON
+015A		LATIN CAPITAL LETTER S WITH ACUTE
+015B		LATIN SMALL LETTER S WITH ACUTE
+015C		LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015D		LATIN SMALL LETTER S WITH CIRCUMFLEX
+015E		LATIN CAPITAL LETTER S WITH CEDILLA
+015F		LATIN SMALL LETTER S WITH CEDILLA
+0160		LATIN CAPITAL LETTER S WITH CARON
+0161		LATIN SMALL LETTER S WITH CARON
+0162		LATIN CAPITAL LETTER T WITH CEDILLA
+0163		LATIN SMALL LETTER T WITH CEDILLA
+0164		LATIN CAPITAL LETTER T WITH CARON
+0165		LATIN SMALL LETTER T WITH CARON
+0166		LATIN CAPITAL LETTER T WITH STROKE
+0167		LATIN SMALL LETTER T WITH STROKE
+0168		LATIN CAPITAL LETTER U WITH TILDE
+0169		LATIN SMALL LETTER U WITH TILDE
+016A		LATIN CAPITAL LETTER U WITH MACRON
+016B		LATIN SMALL LETTER U WITH MACRON
+016C		LATIN CAPITAL LETTER U WITH BREVE
+016D		LATIN SMALL LETTER U WITH BREVE
+016E		LATIN CAPITAL LETTER U WITH RING ABOVE
+016F		LATIN SMALL LETTER U WITH RING ABOVE
+0170		LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0171		LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0172		LATIN CAPITAL LETTER U WITH OGONEK
+0173		LATIN SMALL LETTER U WITH OGONEK
+0174		LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0175		LATIN SMALL LETTER W WITH CIRCUMFLEX
+0176		LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0177		LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0178		LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179		LATIN CAPITAL LETTER Z WITH ACUTE
+017A		LATIN SMALL LETTER Z WITH ACUTE
+017B		LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017C		LATIN SMALL LETTER Z WITH DOT ABOVE
+017D		LATIN CAPITAL LETTER Z WITH CARON
+017E		LATIN SMALL LETTER Z WITH CARON
+017F		LATIN SMALL LETTER LONG S
+0180		LATIN SMALL LETTER B WITH STROKE
+0181		LATIN CAPITAL LETTER B WITH HOOK
+0182		LATIN CAPITAL LETTER B WITH TOPBAR
+0183		LATIN SMALL LETTER B WITH TOPBAR
+0184		LATIN CAPITAL LETTER TONE SIX
+0185		LATIN SMALL LETTER TONE SIX
+0186		LATIN CAPITAL LETTER OPEN O
+0187		LATIN CAPITAL LETTER C WITH HOOK
+0188		LATIN SMALL LETTER C WITH HOOK
+0189		LATIN CAPITAL LETTER AFRICAN D
+018A		LATIN CAPITAL LETTER D WITH HOOK
+018B		LATIN CAPITAL LETTER D WITH TOPBAR
+018C		LATIN SMALL LETTER D WITH TOPBAR
+018D		LATIN SMALL LETTER TURNED DELTA
+018E		LATIN CAPITAL LETTER REVERSED E
+018F		LATIN CAPITAL LETTER SCHWA
+0190		LATIN CAPITAL LETTER OPEN E
+0191		LATIN CAPITAL LETTER F WITH HOOK
+0192		LATIN SMALL LETTER F WITH HOOK
+0193		LATIN CAPITAL LETTER G WITH HOOK
+0194		LATIN CAPITAL LETTER GAMMA
+0195		LATIN SMALL LETTER HV
+0196		LATIN CAPITAL LETTER IOTA
+0197		LATIN CAPITAL LETTER I WITH STROKE
+0198		LATIN CAPITAL LETTER K WITH HOOK
+0199		LATIN SMALL LETTER K WITH HOOK
+019A		LATIN SMALL LETTER L WITH BAR
+019B		LATIN SMALL LETTER LAMBDA WITH STROKE
+019C		LATIN CAPITAL LETTER TURNED M
+019D		LATIN CAPITAL LETTER N WITH LEFT HOOK
+019E		LATIN SMALL LETTER N WITH LONG RIGHT LEG
+019F		LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0		LATIN CAPITAL LETTER O WITH HORN
+01A1		LATIN SMALL LETTER O WITH HORN
+01A2		LATIN CAPITAL LETTER OI
+01A3		LATIN SMALL LETTER OI
+01A4		LATIN CAPITAL LETTER P WITH HOOK
+01A5		LATIN SMALL LETTER P WITH HOOK
+01A6		LATIN LETTER YR
+01A7		LATIN CAPITAL LETTER TONE TWO
+01A8		LATIN SMALL LETTER TONE TWO
+01A9		LATIN CAPITAL LETTER ESH
+01AA		LATIN LETTER REVERSED ESH LOOP
+01AB		LATIN SMALL LETTER T WITH PALATAL HOOK
+01AC		LATIN CAPITAL LETTER T WITH HOOK
+01AD		LATIN SMALL LETTER T WITH HOOK
+01AE		LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF		LATIN CAPITAL LETTER U WITH HORN
+01B0		LATIN SMALL LETTER U WITH HORN
+01B1		LATIN CAPITAL LETTER UPSILON
+01B2		LATIN CAPITAL LETTER V WITH HOOK
+01B3		LATIN CAPITAL LETTER Y WITH HOOK
+01B4		LATIN SMALL LETTER Y WITH HOOK
+01B5		LATIN CAPITAL LETTER Z WITH STROKE
+01B6		LATIN SMALL LETTER Z WITH STROKE
+01B7		LATIN CAPITAL LETTER EZH
+01B8		LATIN CAPITAL LETTER EZH REVERSED
+01B9		LATIN SMALL LETTER EZH REVERSED
+01BA		LATIN SMALL LETTER EZH WITH TAIL
+01BB		LATIN LETTER TWO WITH STROKE
+01BC		LATIN CAPITAL LETTER TONE FIVE
+01BD		LATIN SMALL LETTER TONE FIVE
+01BE		LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+01BF		LATIN LETTER WYNN
+01C0		LATIN LETTER DENTAL CLICK
+01C1		LATIN LETTER LATERAL CLICK
+01C2		LATIN LETTER ALVEOLAR CLICK
+01C3		LATIN LETTER RETROFLEX CLICK
+01C4		LATIN CAPITAL LETTER DZ WITH CARON
+01C5		LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C6		LATIN SMALL LETTER DZ WITH CARON
+01C7		LATIN CAPITAL LETTER LJ
+01C8		LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01C9		LATIN SMALL LETTER LJ
+01CA		LATIN CAPITAL LETTER NJ
+01CB		LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CC		LATIN SMALL LETTER NJ
+01CD		LATIN CAPITAL LETTER A WITH CARON
+01CE		LATIN SMALL LETTER A WITH CARON
+01CF		LATIN CAPITAL LETTER I WITH CARON
+01D0		LATIN SMALL LETTER I WITH CARON
+01D1		LATIN CAPITAL LETTER O WITH CARON
+01D2		LATIN SMALL LETTER O WITH CARON
+01D3		LATIN CAPITAL LETTER U WITH CARON
+01D4		LATIN SMALL LETTER U WITH CARON
+01D5		LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D6		LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D7		LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D8		LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D9		LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DA		LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DB		LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DC		LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DD		LATIN SMALL LETTER TURNED E
+01DE		LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01DF		LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E0		LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E1		LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E2		LATIN CAPITAL LETTER AE WITH MACRON
+01E3		LATIN SMALL LETTER AE WITH MACRON
+01E4		LATIN CAPITAL LETTER G WITH STROKE
+01E5		LATIN SMALL LETTER G WITH STROKE
+01E6		LATIN CAPITAL LETTER G WITH CARON
+01E7		LATIN SMALL LETTER G WITH CARON
+01E8		LATIN CAPITAL LETTER K WITH CARON
+01E9		LATIN SMALL LETTER K WITH CARON
+01EA		LATIN CAPITAL LETTER O WITH OGONEK
+01EB		LATIN SMALL LETTER O WITH OGONEK
+01EC		LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01ED		LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EE		LATIN CAPITAL LETTER EZH WITH CARON
+01EF		LATIN SMALL LETTER EZH WITH CARON
+01F0		LATIN SMALL LETTER J WITH CARON
+01F1		LATIN CAPITAL LETTER DZ
+01F2		LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F3		LATIN SMALL LETTER DZ
+01F4		LATIN CAPITAL LETTER G WITH ACUTE
+01F5		LATIN SMALL LETTER G WITH ACUTE
+01F6		LATIN CAPITAL LETTER HWAIR
+01F7		LATIN CAPITAL LETTER WYNN
+01F8		LATIN CAPITAL LETTER N WITH GRAVE
+01F9		LATIN SMALL LETTER N WITH GRAVE
+01FA		LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FB		LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FC		LATIN CAPITAL LETTER AE WITH ACUTE
+01FD		LATIN SMALL LETTER AE WITH ACUTE
+01FE		LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+01FF		LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0200		LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0201		LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0202		LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0203		LATIN SMALL LETTER A WITH INVERTED BREVE
+0204		LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0205		LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0206		LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0207		LATIN SMALL LETTER E WITH INVERTED BREVE
+0208		LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+0209		LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020A		LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020B		LATIN SMALL LETTER I WITH INVERTED BREVE
+020C		LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020D		LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020E		LATIN CAPITAL LETTER O WITH INVERTED BREVE
+020F		LATIN SMALL LETTER O WITH INVERTED BREVE
+0210		LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0211		LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0212		LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0213		LATIN SMALL LETTER R WITH INVERTED BREVE
+0214		LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0215		LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0216		LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0217		LATIN SMALL LETTER U WITH INVERTED BREVE
+0218		LATIN CAPITAL LETTER S WITH COMMA BELOW
+0219		LATIN SMALL LETTER S WITH COMMA BELOW
+021A		LATIN CAPITAL LETTER T WITH COMMA BELOW
+021B		LATIN SMALL LETTER T WITH COMMA BELOW
+021C		LATIN CAPITAL LETTER YOGH
+021D		LATIN SMALL LETTER YOGH
+021E		LATIN CAPITAL LETTER H WITH CARON
+021F		LATIN SMALL LETTER H WITH CARON
+0220		LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0221		LATIN SMALL LETTER D WITH CURL
+0222		LATIN CAPITAL LETTER OU
+0223		LATIN SMALL LETTER OU
+0224		LATIN CAPITAL LETTER Z WITH HOOK
+0225		LATIN SMALL LETTER Z WITH HOOK
+0226		LATIN CAPITAL LETTER A WITH DOT ABOVE
+0227		LATIN SMALL LETTER A WITH DOT ABOVE
+0228		LATIN CAPITAL LETTER E WITH CEDILLA
+0229		LATIN SMALL LETTER E WITH CEDILLA
+022A		LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022B		LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022C		LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022D		LATIN SMALL LETTER O WITH TILDE AND MACRON
+022E		LATIN CAPITAL LETTER O WITH DOT ABOVE
+022F		LATIN SMALL LETTER O WITH DOT ABOVE
+0230		LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0231		LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0232		LATIN CAPITAL LETTER Y WITH MACRON
+0233		LATIN SMALL LETTER Y WITH MACRON
+0234		LATIN SMALL LETTER L WITH CURL
+0235		LATIN SMALL LETTER N WITH CURL
+0236		LATIN SMALL LETTER T WITH CURL
+0237		LATIN SMALL LETTER DOTLESS J
+0238		LATIN SMALL LETTER DB DIGRAPH
+0239		LATIN SMALL LETTER QP DIGRAPH
+023A		LATIN CAPITAL LETTER A WITH STROKE
+023B		LATIN CAPITAL LETTER C WITH STROKE
+023C		LATIN SMALL LETTER C WITH STROKE
+023D		LATIN CAPITAL LETTER L WITH BAR
+023E		LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+023F		LATIN SMALL LETTER S WITH SWASH TAIL
+0240		LATIN SMALL LETTER Z WITH SWASH TAIL
+0241		LATIN CAPITAL LETTER GLOTTAL STOP
+0250		LATIN SMALL LETTER TURNED A
+0251		LATIN SMALL LETTER ALPHA
+0252		LATIN SMALL LETTER TURNED ALPHA
+0253		LATIN SMALL LETTER B WITH HOOK
+0254		LATIN SMALL LETTER OPEN O
+0255		LATIN SMALL LETTER C WITH CURL
+0256		LATIN SMALL LETTER D WITH TAIL
+0257		LATIN SMALL LETTER D WITH HOOK
+0258		LATIN SMALL LETTER REVERSED E
+0259		LATIN SMALL LETTER SCHWA
+025A		LATIN SMALL LETTER SCHWA WITH HOOK
+025B		LATIN SMALL LETTER OPEN E
+025C		LATIN SMALL LETTER REVERSED OPEN E
+025D		LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E		LATIN SMALL LETTER CLOSED REVERSED OPEN E
+025F		LATIN SMALL LETTER DOTLESS J WITH STROKE
+0260		LATIN SMALL LETTER G WITH HOOK
+0261		LATIN SMALL LETTER SCRIPT G
+0262		LATIN LETTER SMALL CAPITAL G
+0263		LATIN SMALL LETTER GAMMA
+0264		LATIN SMALL LETTER RAMS HORN
+0265		LATIN SMALL LETTER TURNED H
+0266		LATIN SMALL LETTER H WITH HOOK
+0267		LATIN SMALL LETTER HENG WITH HOOK
+0268		LATIN SMALL LETTER I WITH STROKE
+0269		LATIN SMALL LETTER IOTA
+026A		LATIN LETTER SMALL CAPITAL I
+026B		LATIN SMALL LETTER L WITH MIDDLE TILDE
+026C		LATIN SMALL LETTER L WITH BELT
+026D		LATIN SMALL LETTER L WITH RETROFLEX HOOK
+026E		LATIN SMALL LETTER LEZH
+026F		LATIN SMALL LETTER TURNED M
+0270		LATIN SMALL LETTER TURNED M WITH LONG LEG
+0271		LATIN SMALL LETTER M WITH HOOK
+0272		LATIN SMALL LETTER N WITH LEFT HOOK
+0273		LATIN SMALL LETTER N WITH RETROFLEX HOOK
+0274		LATIN LETTER SMALL CAPITAL N
+0275		LATIN SMALL LETTER BARRED O
+0276		LATIN LETTER SMALL CAPITAL OE
+0277		LATIN SMALL LETTER CLOSED OMEGA
+0278		LATIN SMALL LETTER PHI
+0279		LATIN SMALL LETTER TURNED R
+027A		LATIN SMALL LETTER TURNED R WITH LONG LEG
+027B		LATIN SMALL LETTER TURNED R WITH HOOK
+027C		LATIN SMALL LETTER R WITH LONG LEG
+027D		LATIN SMALL LETTER R WITH TAIL
+027E		LATIN SMALL LETTER R WITH FISHHOOK
+027F		LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0280		LATIN LETTER SMALL CAPITAL R
+0281		LATIN LETTER SMALL CAPITAL INVERTED R
+0282		LATIN SMALL LETTER S WITH HOOK
+0283		LATIN SMALL LETTER ESH
+0284		LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+0285		LATIN SMALL LETTER SQUAT REVERSED ESH
+0286		LATIN SMALL LETTER ESH WITH CURL
+0287		LATIN SMALL LETTER TURNED T
+0288		LATIN SMALL LETTER T WITH RETROFLEX HOOK
+0289		LATIN SMALL LETTER U BAR
+028A		LATIN SMALL LETTER UPSILON
+028B		LATIN SMALL LETTER V WITH HOOK
+028C		LATIN SMALL LETTER TURNED V
+028D		LATIN SMALL LETTER TURNED W
+028E		LATIN SMALL LETTER TURNED Y
+028F		LATIN LETTER SMALL CAPITAL Y
+0290		LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+0291		LATIN SMALL LETTER Z WITH CURL
+0292		LATIN SMALL LETTER EZH
+0293		LATIN SMALL LETTER EZH WITH CURL
+0294		LATIN LETTER GLOTTAL STOP
+0295		LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+0296		LATIN LETTER INVERTED GLOTTAL STOP
+0297		LATIN LETTER STRETCHED C
+0298		LATIN LETTER BILABIAL CLICK
+0299		LATIN LETTER SMALL CAPITAL B
+029A		LATIN SMALL LETTER CLOSED OPEN E
+029B		LATIN LETTER SMALL CAPITAL G WITH HOOK
+029C		LATIN LETTER SMALL CAPITAL H
+029D		LATIN SMALL LETTER J WITH CROSSED-TAIL
+029E		LATIN SMALL LETTER TURNED K
+029F		LATIN LETTER SMALL CAPITAL L
+02A0		LATIN SMALL LETTER Q WITH HOOK
+02A1		LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2		LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+02A3		LATIN SMALL LETTER DZ DIGRAPH
+02A4		LATIN SMALL LETTER DEZH DIGRAPH
+02A5		LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+02A6		LATIN SMALL LETTER TS DIGRAPH
+02A7		LATIN SMALL LETTER TESH DIGRAPH
+02A8		LATIN SMALL LETTER TC DIGRAPH WITH CURL
+02A9		LATIN SMALL LETTER FENG DIGRAPH
+02AA		LATIN SMALL LETTER LS DIGRAPH
+02AB		LATIN SMALL LETTER LZ DIGRAPH
+02AC		LATIN LETTER BILABIAL PERCUSSIVE
+02AD		LATIN LETTER BIDENTAL PERCUSSIVE
+02AE		LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF		LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0		MODIFIER LETTER SMALL H
+02B1		MODIFIER LETTER SMALL H WITH HOOK
+02B2		MODIFIER LETTER SMALL J
+02B3		MODIFIER LETTER SMALL R
+02B4		MODIFIER LETTER SMALL TURNED R
+02B5		MODIFIER LETTER SMALL TURNED R WITH HOOK
+02B6		MODIFIER LETTER SMALL CAPITAL INVERTED R
+02B7		MODIFIER LETTER SMALL W
+02B8		MODIFIER LETTER SMALL Y
+02B9		MODIFIER LETTER PRIME
+02BA		MODIFIER LETTER DOUBLE PRIME
+02BB		MODIFIER LETTER TURNED COMMA
+02BC		MODIFIER LETTER APOSTROPHE
+02BD		MODIFIER LETTER REVERSED COMMA
+02BE		MODIFIER LETTER RIGHT HALF RING
+02BF		MODIFIER LETTER LEFT HALF RING
+02C0		MODIFIER LETTER GLOTTAL STOP
+02C1		MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2		MODIFIER LETTER LEFT ARROWHEAD
+02C3		MODIFIER LETTER RIGHT ARROWHEAD
+02C4		MODIFIER LETTER UP ARROWHEAD
+02C5		MODIFIER LETTER DOWN ARROWHEAD
+02C6		MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7		CARON
+02C8		MODIFIER LETTER VERTICAL LINE
+02C9		MODIFIER LETTER MACRON
+02CA		MODIFIER LETTER ACUTE ACCENT
+02CB		MODIFIER LETTER GRAVE ACCENT
+02CC		MODIFIER LETTER LOW VERTICAL LINE
+02CD		MODIFIER LETTER LOW MACRON
+02CE		MODIFIER LETTER LOW GRAVE ACCENT
+02CF		MODIFIER LETTER LOW ACUTE ACCENT
+02D0		MODIFIER LETTER TRIANGULAR COLON
+02D1		MODIFIER LETTER HALF TRIANGULAR COLON
+02D2		MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3		MODIFIER LETTER CENTRED LEFT HALF RING
+02D4		MODIFIER LETTER UP TACK
+02D5		MODIFIER LETTER DOWN TACK
+02D6		MODIFIER LETTER PLUS SIGN
+02D7		MODIFIER LETTER MINUS SIGN
+02D8		BREVE
+02D9		DOT ABOVE
+02DA		RING ABOVE
+02DB		OGONEK
+02DC		SMALL TILDE
+02DD		DOUBLE ACUTE ACCENT
+02DE		MODIFIER LETTER RHOTIC HOOK
+02DF		MODIFIER LETTER CROSS ACCENT
+02E0		MODIFIER LETTER SMALL GAMMA
+02E1		MODIFIER LETTER SMALL L
+02E2		MODIFIER LETTER SMALL S
+02E3		MODIFIER LETTER SMALL X
+02E4		MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5		MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6		MODIFIER LETTER HIGH TONE BAR
+02E7		MODIFIER LETTER MID TONE BAR
+02E8		MODIFIER LETTER LOW TONE BAR
+02E9		MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA		MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB		MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC		MODIFIER LETTER VOICING
+02ED		MODIFIER LETTER UNASPIRATED
+02EE		MODIFIER LETTER DOUBLE APOSTROPHE
+02EF		MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0		MODIFIER LETTER LOW UP ARROWHEAD
+02F1		MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2		MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3		MODIFIER LETTER LOW RING
+02F4		MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5		MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6		MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7		MODIFIER LETTER LOW TILDE
+02F8		MODIFIER LETTER RAISED COLON
+02F9		MODIFIER LETTER BEGIN HIGH TONE
+02FA		MODIFIER LETTER END HIGH TONE
+02FB		MODIFIER LETTER BEGIN LOW TONE
+02FC		MODIFIER LETTER END LOW TONE
+02FD		MODIFIER LETTER SHELF
+02FE		MODIFIER LETTER OPEN SHELF
+02FF		MODIFIER LETTER LOW LEFT ARROW
+0300		COMBINING GRAVE ACCENT
+0301		COMBINING ACUTE ACCENT
+0302		COMBINING CIRCUMFLEX ACCENT
+0303		COMBINING TILDE
+0304		COMBINING MACRON
+0305		COMBINING OVERLINE
+0306		COMBINING BREVE
+0307		COMBINING DOT ABOVE
+0308		COMBINING DIAERESIS
+0309		COMBINING HOOK ABOVE
+030A		COMBINING RING ABOVE
+030B		COMBINING DOUBLE ACUTE ACCENT
+030C		COMBINING CARON
+030D		COMBINING VERTICAL LINE ABOVE
+030E		COMBINING DOUBLE VERTICAL LINE ABOVE
+030F		COMBINING DOUBLE GRAVE ACCENT
+0310		COMBINING CANDRABINDU
+0311		COMBINING INVERTED BREVE
+0312		COMBINING TURNED COMMA ABOVE
+0313		COMBINING COMMA ABOVE
+0314		COMBINING REVERSED COMMA ABOVE
+0315		COMBINING COMMA ABOVE RIGHT
+0316		COMBINING GRAVE ACCENT BELOW
+0317		COMBINING ACUTE ACCENT BELOW
+0318		COMBINING LEFT TACK BELOW
+0319		COMBINING RIGHT TACK BELOW
+031A		COMBINING LEFT ANGLE ABOVE
+031B		COMBINING HORN
+031C		COMBINING LEFT HALF RING BELOW
+031D		COMBINING UP TACK BELOW
+031E		COMBINING DOWN TACK BELOW
+031F		COMBINING PLUS SIGN BELOW
+0320		COMBINING MINUS SIGN BELOW
+0321		COMBINING PALATALIZED HOOK BELOW
+0322		COMBINING RETROFLEX HOOK BELOW
+0323		COMBINING DOT BELOW
+0324		COMBINING DIAERESIS BELOW
+0325		COMBINING RING BELOW
+0326		COMBINING COMMA BELOW
+0327		COMBINING CEDILLA
+0328		COMBINING OGONEK
+0329		COMBINING VERTICAL LINE BELOW
+032A		COMBINING BRIDGE BELOW
+032B		COMBINING INVERTED DOUBLE ARCH BELOW
+032C		COMBINING CARON BELOW
+032D		COMBINING CIRCUMFLEX ACCENT BELOW
+032E		COMBINING BREVE BELOW
+032F		COMBINING INVERTED BREVE BELOW
+0330		COMBINING TILDE BELOW
+0331		COMBINING MACRON BELOW
+0332		COMBINING LOW LINE
+0333		COMBINING DOUBLE LOW LINE
+0334		COMBINING TILDE OVERLAY
+0335		COMBINING SHORT STROKE OVERLAY
+0336		COMBINING LONG STROKE OVERLAY
+0337		COMBINING SHORT SOLIDUS OVERLAY
+0338		COMBINING LONG SOLIDUS OVERLAY
+0339		COMBINING RIGHT HALF RING BELOW
+033A		COMBINING INVERTED BRIDGE BELOW
+033B		COMBINING SQUARE BELOW
+033C		COMBINING SEAGULL BELOW
+033D		COMBINING X ABOVE
+033E		COMBINING VERTICAL TILDE
+033F		COMBINING DOUBLE OVERLINE
+0340		COMBINING GRAVE TONE MARK
+0341		COMBINING ACUTE TONE MARK
+0342		COMBINING GREEK PERISPOMENI
+0343		COMBINING GREEK KORONIS
+0344		COMBINING GREEK DIALYTIKA TONOS
+0345		COMBINING GREEK YPOGEGRAMMENI
+0346		COMBINING BRIDGE ABOVE
+0347		COMBINING EQUALS SIGN BELOW
+0348		COMBINING DOUBLE VERTICAL LINE BELOW
+0349		COMBINING LEFT ANGLE BELOW
+034A		COMBINING NOT TILDE ABOVE
+034B		COMBINING HOMOTHETIC ABOVE
+034C		COMBINING ALMOST EQUAL TO ABOVE
+034D		COMBINING LEFT RIGHT ARROW BELOW
+034E		COMBINING UPWARDS ARROW BELOW
+034F		COMBINING GRAPHEME JOINER
+0350		COMBINING RIGHT ARROWHEAD ABOVE
+0351		COMBINING LEFT HALF RING ABOVE
+0352		COMBINING FERMATA
+0353		COMBINING X BELOW
+0354		COMBINING LEFT ARROWHEAD BELOW
+0355		COMBINING RIGHT ARROWHEAD BELOW
+0356		COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357		COMBINING RIGHT HALF RING ABOVE
+0358		COMBINING DOT ABOVE RIGHT
+0359		COMBINING ASTERISK BELOW
+035A		COMBINING DOUBLE RING BELOW
+035B		COMBINING ZIGZAG ABOVE
+035C		COMBINING DOUBLE BREVE BELOW
+035D		COMBINING DOUBLE BREVE
+035E		COMBINING DOUBLE MACRON
+035F		COMBINING DOUBLE MACRON BELOW
+0360		COMBINING DOUBLE TILDE
+0361		COMBINING DOUBLE INVERTED BREVE
+0362		COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0363		COMBINING LATIN SMALL LETTER A
+0364		COMBINING LATIN SMALL LETTER E
+0365		COMBINING LATIN SMALL LETTER I
+0366		COMBINING LATIN SMALL LETTER O
+0367		COMBINING LATIN SMALL LETTER U
+0368		COMBINING LATIN SMALL LETTER C
+0369		COMBINING LATIN SMALL LETTER D
+036A		COMBINING LATIN SMALL LETTER H
+036B		COMBINING LATIN SMALL LETTER M
+036C		COMBINING LATIN SMALL LETTER R
+036D		COMBINING LATIN SMALL LETTER T
+036E		COMBINING LATIN SMALL LETTER V
+036F		COMBINING LATIN SMALL LETTER X
+0374		GREEK NUMERAL SIGN
+0375		GREEK LOWER NUMERAL SIGN
+037A		GREEK YPOGEGRAMMENI
+037E		GREEK QUESTION MARK
+0384		GREEK TONOS
+0385		GREEK DIALYTIKA TONOS
+0386		GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387		GREEK ANO TELEIA
+0388		GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389		GREEK CAPITAL LETTER ETA WITH TONOS
+038A		GREEK CAPITAL LETTER IOTA WITH TONOS
+038C		GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E		GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F		GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390		GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391		GREEK CAPITAL LETTER ALPHA
+0392		GREEK CAPITAL LETTER BETA
+0393		GREEK CAPITAL LETTER GAMMA
+0394		GREEK CAPITAL LETTER DELTA
+0395		GREEK CAPITAL LETTER EPSILON
+0396		GREEK CAPITAL LETTER ZETA
+0397		GREEK CAPITAL LETTER ETA
+0398		GREEK CAPITAL LETTER THETA
+0399		GREEK CAPITAL LETTER IOTA
+039A		GREEK CAPITAL LETTER KAPPA
+039B		GREEK CAPITAL LETTER LAMDA
+039C		GREEK CAPITAL LETTER MU
+039D		GREEK CAPITAL LETTER NU
+039E		GREEK CAPITAL LETTER XI
+039F		GREEK CAPITAL LETTER OMICRON
+03A0		GREEK CAPITAL LETTER PI
+03A1		GREEK CAPITAL LETTER RHO
+03A3		GREEK CAPITAL LETTER SIGMA
+03A4		GREEK CAPITAL LETTER TAU
+03A5		GREEK CAPITAL LETTER UPSILON
+03A6		GREEK CAPITAL LETTER PHI
+03A7		GREEK CAPITAL LETTER CHI
+03A8		GREEK CAPITAL LETTER PSI
+03A9		GREEK CAPITAL LETTER OMEGA
+03AA		GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB		GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03AC		GREEK SMALL LETTER ALPHA WITH TONOS
+03AD		GREEK SMALL LETTER EPSILON WITH TONOS
+03AE		GREEK SMALL LETTER ETA WITH TONOS
+03AF		GREEK SMALL LETTER IOTA WITH TONOS
+03B0		GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03B1		GREEK SMALL LETTER ALPHA
+03B2		GREEK SMALL LETTER BETA
+03B3		GREEK SMALL LETTER GAMMA
+03B4		GREEK SMALL LETTER DELTA
+03B5		GREEK SMALL LETTER EPSILON
+03B6		GREEK SMALL LETTER ZETA
+03B7		GREEK SMALL LETTER ETA
+03B8		GREEK SMALL LETTER THETA
+03B9		GREEK SMALL LETTER IOTA
+03BA		GREEK SMALL LETTER KAPPA
+03BB		GREEK SMALL LETTER LAMDA
+03BC		GREEK SMALL LETTER MU
+03BD		GREEK SMALL LETTER NU
+03BE		GREEK SMALL LETTER XI
+03BF		GREEK SMALL LETTER OMICRON
+03C0		GREEK SMALL LETTER PI
+03C1		GREEK SMALL LETTER RHO
+03C2		GREEK SMALL LETTER FINAL SIGMA
+03C3		GREEK SMALL LETTER SIGMA
+03C4		GREEK SMALL LETTER TAU
+03C5		GREEK SMALL LETTER UPSILON
+03C6		GREEK SMALL LETTER PHI
+03C7		GREEK SMALL LETTER CHI
+03C8		GREEK SMALL LETTER PSI
+03C9		GREEK SMALL LETTER OMEGA
+03CA		GREEK SMALL LETTER IOTA WITH DIALYTIKA
+03CB		GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+03CC		GREEK SMALL LETTER OMICRON WITH TONOS
+03CD		GREEK SMALL LETTER UPSILON WITH TONOS
+03CE		GREEK SMALL LETTER OMEGA WITH TONOS
+03D0		GREEK BETA SYMBOL
+03D1		GREEK THETA SYMBOL
+03D2		GREEK UPSILON WITH HOOK SYMBOL
+03D3		GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+03D4		GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+03D5		GREEK PHI SYMBOL
+03D6		GREEK PI SYMBOL
+03D7		GREEK KAI SYMBOL
+03D8		GREEK LETTER ARCHAIC KOPPA
+03D9		GREEK SMALL LETTER ARCHAIC KOPPA
+03DA		GREEK LETTER STIGMA
+03DB		GREEK SMALL LETTER STIGMA
+03DC		GREEK LETTER DIGAMMA
+03DD		GREEK SMALL LETTER DIGAMMA
+03DE		GREEK LETTER KOPPA
+03DF		GREEK SMALL LETTER KOPPA
+03E0		GREEK LETTER SAMPI
+03E1		GREEK SMALL LETTER SAMPI
+03E2		COPTIC CAPITAL LETTER SHEI
+03E3		COPTIC SMALL LETTER SHEI
+03E4		COPTIC CAPITAL LETTER FEI
+03E5		COPTIC SMALL LETTER FEI
+03E6		COPTIC CAPITAL LETTER KHEI
+03E7		COPTIC SMALL LETTER KHEI
+03E8		COPTIC CAPITAL LETTER HORI
+03E9		COPTIC SMALL LETTER HORI
+03EA		COPTIC CAPITAL LETTER GANGIA
+03EB		COPTIC SMALL LETTER GANGIA
+03EC		COPTIC CAPITAL LETTER SHIMA
+03ED		COPTIC SMALL LETTER SHIMA
+03EE		COPTIC CAPITAL LETTER DEI
+03EF		COPTIC SMALL LETTER DEI
+03F0		GREEK KAPPA SYMBOL
+03F1		GREEK RHO SYMBOL
+03F2		GREEK LUNATE SIGMA SYMBOL
+03F3		GREEK LETTER YOT
+03F4		GREEK CAPITAL THETA SYMBOL
+03F5		GREEK LUNATE EPSILON SYMBOL
+03F6		GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7		GREEK CAPITAL LETTER SHO
+03F8		GREEK SMALL LETTER SHO
+03F9		GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA		GREEK CAPITAL LETTER SAN
+03FB		GREEK SMALL LETTER SAN
+03FC		GREEK RHO WITH STROKE SYMBOL
+03FD		GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+03FE		GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+03FF		GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0400		CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401		CYRILLIC CAPITAL LETTER IO
+0402		CYRILLIC CAPITAL LETTER DJE
+0403		CYRILLIC CAPITAL LETTER GJE
+0404		CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405		CYRILLIC CAPITAL LETTER DZE
+0406		CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407		CYRILLIC CAPITAL LETTER YI
+0408		CYRILLIC CAPITAL LETTER JE
+0409		CYRILLIC CAPITAL LETTER LJE
+040A		CYRILLIC CAPITAL LETTER NJE
+040B		CYRILLIC CAPITAL LETTER TSHE
+040C		CYRILLIC CAPITAL LETTER KJE
+040D		CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E		CYRILLIC CAPITAL LETTER SHORT U
+040F		CYRILLIC CAPITAL LETTER DZHE
+0410		CYRILLIC CAPITAL LETTER A
+0411		CYRILLIC CAPITAL LETTER BE
+0412		CYRILLIC CAPITAL LETTER VE
+0413		CYRILLIC CAPITAL LETTER GHE
+0414		CYRILLIC CAPITAL LETTER DE
+0415		CYRILLIC CAPITAL LETTER IE
+0416		CYRILLIC CAPITAL LETTER ZHE
+0417		CYRILLIC CAPITAL LETTER ZE
+0418		CYRILLIC CAPITAL LETTER I
+0419		CYRILLIC CAPITAL LETTER SHORT I
+041A		CYRILLIC CAPITAL LETTER KA
+041B		CYRILLIC CAPITAL LETTER EL
+041C		CYRILLIC CAPITAL LETTER EM
+041D		CYRILLIC CAPITAL LETTER EN
+041E		CYRILLIC CAPITAL LETTER O
+041F		CYRILLIC CAPITAL LETTER PE
+0420		CYRILLIC CAPITAL LETTER ER
+0421		CYRILLIC CAPITAL LETTER ES
+0422		CYRILLIC CAPITAL LETTER TE
+0423		CYRILLIC CAPITAL LETTER U
+0424		CYRILLIC CAPITAL LETTER EF
+0425		CYRILLIC CAPITAL LETTER HA
+0426		CYRILLIC CAPITAL LETTER TSE
+0427		CYRILLIC CAPITAL LETTER CHE
+0428		CYRILLIC CAPITAL LETTER SHA
+0429		CYRILLIC CAPITAL LETTER SHCHA
+042A		CYRILLIC CAPITAL LETTER HARD SIGN
+042B		CYRILLIC CAPITAL LETTER YERU
+042C		CYRILLIC CAPITAL LETTER SOFT SIGN
+042D		CYRILLIC CAPITAL LETTER E
+042E		CYRILLIC CAPITAL LETTER YU
+042F		CYRILLIC CAPITAL LETTER YA
+0430		CYRILLIC SMALL LETTER A
+0431		CYRILLIC SMALL LETTER BE
+0432		CYRILLIC SMALL LETTER VE
+0433		CYRILLIC SMALL LETTER GHE
+0434		CYRILLIC SMALL LETTER DE
+0435		CYRILLIC SMALL LETTER IE
+0436		CYRILLIC SMALL LETTER ZHE
+0437		CYRILLIC SMALL LETTER ZE
+0438		CYRILLIC SMALL LETTER I
+0439		CYRILLIC SMALL LETTER SHORT I
+043A		CYRILLIC SMALL LETTER KA
+043B		CYRILLIC SMALL LETTER EL
+043C		CYRILLIC SMALL LETTER EM
+043D		CYRILLIC SMALL LETTER EN
+043E		CYRILLIC SMALL LETTER O
+043F		CYRILLIC SMALL LETTER PE
+0440		CYRILLIC SMALL LETTER ER
+0441		CYRILLIC SMALL LETTER ES
+0442		CYRILLIC SMALL LETTER TE
+0443		CYRILLIC SMALL LETTER U
+0444		CYRILLIC SMALL LETTER EF
+0445		CYRILLIC SMALL LETTER HA
+0446		CYRILLIC SMALL LETTER TSE
+0447		CYRILLIC SMALL LETTER CHE
+0448		CYRILLIC SMALL LETTER SHA
+0449		CYRILLIC SMALL LETTER SHCHA
+044A		CYRILLIC SMALL LETTER HARD SIGN
+044B		CYRILLIC SMALL LETTER YERU
+044C		CYRILLIC SMALL LETTER SOFT SIGN
+044D		CYRILLIC SMALL LETTER E
+044E		CYRILLIC SMALL LETTER YU
+044F		CYRILLIC SMALL LETTER YA
+0450		CYRILLIC SMALL LETTER IE WITH GRAVE
+0451		CYRILLIC SMALL LETTER IO
+0452		CYRILLIC SMALL LETTER DJE
+0453		CYRILLIC SMALL LETTER GJE
+0454		CYRILLIC SMALL LETTER UKRAINIAN IE
+0455		CYRILLIC SMALL LETTER DZE
+0456		CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0457		CYRILLIC SMALL LETTER YI
+0458		CYRILLIC SMALL LETTER JE
+0459		CYRILLIC SMALL LETTER LJE
+045A		CYRILLIC SMALL LETTER NJE
+045B		CYRILLIC SMALL LETTER TSHE
+045C		CYRILLIC SMALL LETTER KJE
+045D		CYRILLIC SMALL LETTER I WITH GRAVE
+045E		CYRILLIC SMALL LETTER SHORT U
+045F		CYRILLIC SMALL LETTER DZHE
+0460		CYRILLIC CAPITAL LETTER OMEGA
+0461		CYRILLIC SMALL LETTER OMEGA
+0462		CYRILLIC CAPITAL LETTER YAT
+0463		CYRILLIC SMALL LETTER YAT
+0464		CYRILLIC CAPITAL LETTER IOTIFIED E
+0465		CYRILLIC SMALL LETTER IOTIFIED E
+0466		CYRILLIC CAPITAL LETTER LITTLE YUS
+0467		CYRILLIC SMALL LETTER LITTLE YUS
+0468		CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469		CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A		CYRILLIC CAPITAL LETTER BIG YUS
+046B		CYRILLIC SMALL LETTER BIG YUS
+046C		CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D		CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E		CYRILLIC CAPITAL LETTER KSI
+046F		CYRILLIC SMALL LETTER KSI
+0470		CYRILLIC CAPITAL LETTER PSI
+0471		CYRILLIC SMALL LETTER PSI
+0472		CYRILLIC CAPITAL LETTER FITA
+0473		CYRILLIC SMALL LETTER FITA
+0474		CYRILLIC CAPITAL LETTER IZHITSA
+0475		CYRILLIC SMALL LETTER IZHITSA
+0476		CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0477		CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478		CYRILLIC CAPITAL LETTER UK
+0479		CYRILLIC SMALL LETTER UK
+047A		CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B		CYRILLIC SMALL LETTER ROUND OMEGA
+047C		CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D		CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E		CYRILLIC CAPITAL LETTER OT
+047F		CYRILLIC SMALL LETTER OT
+0480		CYRILLIC CAPITAL LETTER KOPPA
+0481		CYRILLIC SMALL LETTER KOPPA
+0482		CYRILLIC THOUSANDS SIGN
+0483		COMBINING CYRILLIC TITLO
+0484		COMBINING CYRILLIC PALATALIZATION
+0485		COMBINING CYRILLIC DASIA PNEUMATA
+0486		COMBINING CYRILLIC PSILI PNEUMATA
+0488		COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489		COMBINING CYRILLIC MILLIONS SIGN
+048A		CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048B		CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048C		CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D		CYRILLIC SMALL LETTER SEMISOFT SIGN
+048E		CYRILLIC CAPITAL LETTER ER WITH TICK
+048F		CYRILLIC SMALL LETTER ER WITH TICK
+0490		CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491		CYRILLIC SMALL LETTER GHE WITH UPTURN
+0492		CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493		CYRILLIC SMALL LETTER GHE WITH STROKE
+0494		CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495		CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0496		CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497		CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0498		CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499		CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049A		CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B		CYRILLIC SMALL LETTER KA WITH DESCENDER
+049C		CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D		CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049E		CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F		CYRILLIC SMALL LETTER KA WITH STROKE
+04A0		CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1		CYRILLIC SMALL LETTER BASHKIR KA
+04A2		CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3		CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A4		CYRILLIC CAPITAL LIGATURE EN GHE
+04A5		CYRILLIC SMALL LIGATURE EN GHE
+04A6		CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A7		CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A8		CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9		CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA		CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB		CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AC		CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD		CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AE		CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF		CYRILLIC SMALL LETTER STRAIGHT U
+04B0		CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1		CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B2		CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3		CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B4		CYRILLIC CAPITAL LIGATURE TE TSE
+04B5		CYRILLIC SMALL LIGATURE TE TSE
+04B6		CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7		CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B8		CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9		CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BA		CYRILLIC CAPITAL LETTER SHHA
+04BB		CYRILLIC SMALL LETTER SHHA
+04BC		CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD		CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE		CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF		CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0		CYRILLIC LETTER PALOCHKA
+04C1		CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C2		CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C3		CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4		CYRILLIC SMALL LETTER KA WITH HOOK
+04C5		CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C6		CYRILLIC SMALL LETTER EL WITH TAIL
+04C7		CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8		CYRILLIC SMALL LETTER EN WITH HOOK
+04C9		CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CA		CYRILLIC SMALL LETTER EN WITH TAIL
+04CB		CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC		CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CD		CYRILLIC CAPITAL LETTER EM WITH TAIL
+04CE		CYRILLIC SMALL LETTER EM WITH TAIL
+04D0		CYRILLIC CAPITAL LETTER A WITH BREVE
+04D1		CYRILLIC SMALL LETTER A WITH BREVE
+04D2		CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D3		CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D4		CYRILLIC CAPITAL LIGATURE A IE
+04D5		CYRILLIC SMALL LIGATURE A IE
+04D6		CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D7		CYRILLIC SMALL LETTER IE WITH BREVE
+04D8		CYRILLIC CAPITAL LETTER SCHWA
+04D9		CYRILLIC SMALL LETTER SCHWA
+04DA		CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DB		CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DC		CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DD		CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DE		CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04DF		CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E0		CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1		CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E2		CYRILLIC CAPITAL LETTER I WITH MACRON
+04E3		CYRILLIC SMALL LETTER I WITH MACRON
+04E4		CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E5		CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E6		CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E7		CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E8		CYRILLIC CAPITAL LETTER BARRED O
+04E9		CYRILLIC SMALL LETTER BARRED O
+04EA		CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EB		CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EC		CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04ED		CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EE		CYRILLIC CAPITAL LETTER U WITH MACRON
+04EF		CYRILLIC SMALL LETTER U WITH MACRON
+04F0		CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F1		CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F2		CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F3		CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F4		CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F5		CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F6		CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F7		CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F8		CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04F9		CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+0500		CYRILLIC CAPITAL LETTER KOMI DE
+0501		CYRILLIC SMALL LETTER KOMI DE
+0502		CYRILLIC CAPITAL LETTER KOMI DJE
+0503		CYRILLIC SMALL LETTER KOMI DJE
+0504		CYRILLIC CAPITAL LETTER KOMI ZJE
+0505		CYRILLIC SMALL LETTER KOMI ZJE
+0506		CYRILLIC CAPITAL LETTER KOMI DZJE
+0507		CYRILLIC SMALL LETTER KOMI DZJE
+0508		CYRILLIC CAPITAL LETTER KOMI LJE
+0509		CYRILLIC SMALL LETTER KOMI LJE
+050A		CYRILLIC CAPITAL LETTER KOMI NJE
+050B		CYRILLIC SMALL LETTER KOMI NJE
+050C		CYRILLIC CAPITAL LETTER KOMI SJE
+050D		CYRILLIC SMALL LETTER KOMI SJE
+050E		CYRILLIC CAPITAL LETTER KOMI TJE
+050F		CYRILLIC SMALL LETTER KOMI TJE
+0531		ARMENIAN CAPITAL LETTER AYB
+0532		ARMENIAN CAPITAL LETTER BEN
+0533		ARMENIAN CAPITAL LETTER GIM
+0534		ARMENIAN CAPITAL LETTER DA
+0535		ARMENIAN CAPITAL LETTER ECH
+0536		ARMENIAN CAPITAL LETTER ZA
+0537		ARMENIAN CAPITAL LETTER EH
+0538		ARMENIAN CAPITAL LETTER ET
+0539		ARMENIAN CAPITAL LETTER TO
+053A		ARMENIAN CAPITAL LETTER ZHE
+053B		ARMENIAN CAPITAL LETTER INI
+053C		ARMENIAN CAPITAL LETTER LIWN
+053D		ARMENIAN CAPITAL LETTER XEH
+053E		ARMENIAN CAPITAL LETTER CA
+053F		ARMENIAN CAPITAL LETTER KEN
+0540		ARMENIAN CAPITAL LETTER HO
+0541		ARMENIAN CAPITAL LETTER JA
+0542		ARMENIAN CAPITAL LETTER GHAD
+0543		ARMENIAN CAPITAL LETTER CHEH
+0544		ARMENIAN CAPITAL LETTER MEN
+0545		ARMENIAN CAPITAL LETTER YI
+0546		ARMENIAN CAPITAL LETTER NOW
+0547		ARMENIAN CAPITAL LETTER SHA
+0548		ARMENIAN CAPITAL LETTER VO
+0549		ARMENIAN CAPITAL LETTER CHA
+054A		ARMENIAN CAPITAL LETTER PEH
+054B		ARMENIAN CAPITAL LETTER JHEH
+054C		ARMENIAN CAPITAL LETTER RA
+054D		ARMENIAN CAPITAL LETTER SEH
+054E		ARMENIAN CAPITAL LETTER VEW
+054F		ARMENIAN CAPITAL LETTER TIWN
+0550		ARMENIAN CAPITAL LETTER REH
+0551		ARMENIAN CAPITAL LETTER CO
+0552		ARMENIAN CAPITAL LETTER YIWN
+0553		ARMENIAN CAPITAL LETTER PIWR
+0554		ARMENIAN CAPITAL LETTER KEH
+0555		ARMENIAN CAPITAL LETTER OH
+0556		ARMENIAN CAPITAL LETTER FEH
+0559		ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A		ARMENIAN APOSTROPHE
+055B		ARMENIAN EMPHASIS MARK
+055C		ARMENIAN EXCLAMATION MARK
+055D		ARMENIAN COMMA
+055E		ARMENIAN QUESTION MARK
+055F		ARMENIAN ABBREVIATION MARK
+0561		ARMENIAN SMALL LETTER AYB
+0562		ARMENIAN SMALL LETTER BEN
+0563		ARMENIAN SMALL LETTER GIM
+0564		ARMENIAN SMALL LETTER DA
+0565		ARMENIAN SMALL LETTER ECH
+0566		ARMENIAN SMALL LETTER ZA
+0567		ARMENIAN SMALL LETTER EH
+0568		ARMENIAN SMALL LETTER ET
+0569		ARMENIAN SMALL LETTER TO
+056A		ARMENIAN SMALL LETTER ZHE
+056B		ARMENIAN SMALL LETTER INI
+056C		ARMENIAN SMALL LETTER LIWN
+056D		ARMENIAN SMALL LETTER XEH
+056E		ARMENIAN SMALL LETTER CA
+056F		ARMENIAN SMALL LETTER KEN
+0570		ARMENIAN SMALL LETTER HO
+0571		ARMENIAN SMALL LETTER JA
+0572		ARMENIAN SMALL LETTER GHAD
+0573		ARMENIAN SMALL LETTER CHEH
+0574		ARMENIAN SMALL LETTER MEN
+0575		ARMENIAN SMALL LETTER YI
+0576		ARMENIAN SMALL LETTER NOW
+0577		ARMENIAN SMALL LETTER SHA
+0578		ARMENIAN SMALL LETTER VO
+0579		ARMENIAN SMALL LETTER CHA
+057A		ARMENIAN SMALL LETTER PEH
+057B		ARMENIAN SMALL LETTER JHEH
+057C		ARMENIAN SMALL LETTER RA
+057D		ARMENIAN SMALL LETTER SEH
+057E		ARMENIAN SMALL LETTER VEW
+057F		ARMENIAN SMALL LETTER TIWN
+0580		ARMENIAN SMALL LETTER REH
+0581		ARMENIAN SMALL LETTER CO
+0582		ARMENIAN SMALL LETTER YIWN
+0583		ARMENIAN SMALL LETTER PIWR
+0584		ARMENIAN SMALL LETTER KEH
+0585		ARMENIAN SMALL LETTER OH
+0586		ARMENIAN SMALL LETTER FEH
+0587		ARMENIAN SMALL LIGATURE ECH YIWN
+0589		ARMENIAN FULL STOP
+058A		ARMENIAN HYPHEN
+0591		HEBREW ACCENT ETNAHTA
+0592		HEBREW ACCENT SEGOL
+0593		HEBREW ACCENT SHALSHELET
+0594		HEBREW ACCENT ZAQEF QATAN
+0595		HEBREW ACCENT ZAQEF GADOL
+0596		HEBREW ACCENT TIPEHA
+0597		HEBREW ACCENT REVIA
+0598		HEBREW ACCENT ZARQA
+0599		HEBREW ACCENT PASHTA
+059A		HEBREW ACCENT YETIV
+059B		HEBREW ACCENT TEVIR
+059C		HEBREW ACCENT GERESH
+059D		HEBREW ACCENT GERESH MUQDAM
+059E		HEBREW ACCENT GERSHAYIM
+059F		HEBREW ACCENT QARNEY PARA
+05A0		HEBREW ACCENT TELISHA GEDOLA
+05A1		HEBREW ACCENT PAZER
+05A2		HEBREW ACCENT ATNAH HAFUKH
+05A3		HEBREW ACCENT MUNAH
+05A4		HEBREW ACCENT MAHAPAKH
+05A5		HEBREW ACCENT MERKHA
+05A6		HEBREW ACCENT MERKHA KEFULA
+05A7		HEBREW ACCENT DARGA
+05A8		HEBREW ACCENT QADMA
+05A9		HEBREW ACCENT TELISHA QETANA
+05AA		HEBREW ACCENT YERAH BEN YOMO
+05AB		HEBREW ACCENT OLE
+05AC		HEBREW ACCENT ILUY
+05AD		HEBREW ACCENT DEHI
+05AE		HEBREW ACCENT ZINOR
+05AF		HEBREW MARK MASORA CIRCLE
+05B0		HEBREW POINT SHEVA
+05B1		HEBREW POINT HATAF SEGOL
+05B2		HEBREW POINT HATAF PATAH
+05B3		HEBREW POINT HATAF QAMATS
+05B4		HEBREW POINT HIRIQ
+05B5		HEBREW POINT TSERE
+05B6		HEBREW POINT SEGOL
+05B7		HEBREW POINT PATAH
+05B8		HEBREW POINT QAMATS
+05B9		HEBREW POINT HOLAM
+05BB		HEBREW POINT QUBUTS
+05BC		HEBREW POINT DAGESH OR MAPIQ
+05BD		HEBREW POINT METEG
+05BE		HEBREW PUNCTUATION MAQAF
+05BF		HEBREW POINT RAFE
+05C0		HEBREW PUNCTUATION PASEQ
+05C1		HEBREW POINT SHIN DOT
+05C2		HEBREW POINT SIN DOT
+05C3		HEBREW PUNCTUATION SOF PASUQ
+05C4		HEBREW MARK UPPER DOT
+05C5		HEBREW MARK LOWER DOT
+05C6		HEBREW PUNCTUATION NUN HAFUKHA
+05C7		HEBREW POINT QAMATS QATAN
+05D0		HEBREW LETTER ALEF
+05D1		HEBREW LETTER BET
+05D2		HEBREW LETTER GIMEL
+05D3		HEBREW LETTER DALET
+05D4		HEBREW LETTER HE
+05D5		HEBREW LETTER VAV
+05D6		HEBREW LETTER ZAYIN
+05D7		HEBREW LETTER HET
+05D8		HEBREW LETTER TET
+05D9		HEBREW LETTER YOD
+05DA		HEBREW LETTER FINAL KAF
+05DB		HEBREW LETTER KAF
+05DC		HEBREW LETTER LAMED
+05DD		HEBREW LETTER FINAL MEM
+05DE		HEBREW LETTER MEM
+05DF		HEBREW LETTER FINAL NUN
+05E0		HEBREW LETTER NUN
+05E1		HEBREW LETTER SAMEKH
+05E2		HEBREW LETTER AYIN
+05E3		HEBREW LETTER FINAL PE
+05E4		HEBREW LETTER PE
+05E5		HEBREW LETTER FINAL TSADI
+05E6		HEBREW LETTER TSADI
+05E7		HEBREW LETTER QOF
+05E8		HEBREW LETTER RESH
+05E9		HEBREW LETTER SHIN
+05EA		HEBREW LETTER TAV
+05F0		HEBREW LIGATURE YIDDISH DOUBLE VAV
+05F1		HEBREW LIGATURE YIDDISH VAV YOD
+05F2		HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3		HEBREW PUNCTUATION GERESH
+05F4		HEBREW PUNCTUATION GERSHAYIM
+0600		ARABIC NUMBER SIGN
+0601		ARABIC SIGN SANAH
+0602		ARABIC FOOTNOTE MARKER
+0603		ARABIC SIGN SAFHA
+060B		AFGHANI SIGN
+060C		ARABIC COMMA
+060D		ARABIC DATE SEPARATOR
+060E		ARABIC POETIC VERSE SIGN
+060F		ARABIC SIGN MISRA
+0610		ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611		ARABIC SIGN ALAYHE ASSALLAM
+0612		ARABIC SIGN RAHMATULLAH ALAYHE
+0613		ARABIC SIGN RADI ALLAHOU ANHU
+0614		ARABIC SIGN TAKHALLUS
+0615		ARABIC SMALL HIGH TAH
+061B		ARABIC SEMICOLON
+061E		ARABIC TRIPLE DOT PUNCTUATION MARK
+061F		ARABIC QUESTION MARK
+0621		ARABIC LETTER HAMZA
+0622		ARABIC LETTER ALEF WITH MADDA ABOVE
+0623		ARABIC LETTER ALEF WITH HAMZA ABOVE
+0624		ARABIC LETTER WAW WITH HAMZA ABOVE
+0625		ARABIC LETTER ALEF WITH HAMZA BELOW
+0626		ARABIC LETTER YEH WITH HAMZA ABOVE
+0627		ARABIC LETTER ALEF
+0628		ARABIC LETTER BEH
+0629		ARABIC LETTER TEH MARBUTA
+062A		ARABIC LETTER TEH
+062B		ARABIC LETTER THEH
+062C		ARABIC LETTER JEEM
+062D		ARABIC LETTER HAH
+062E		ARABIC LETTER KHAH
+062F		ARABIC LETTER DAL
+0630		ARABIC LETTER THAL
+0631		ARABIC LETTER REH
+0632		ARABIC LETTER ZAIN
+0633		ARABIC LETTER SEEN
+0634		ARABIC LETTER SHEEN
+0635		ARABIC LETTER SAD
+0636		ARABIC LETTER DAD
+0637		ARABIC LETTER TAH
+0638		ARABIC LETTER ZAH
+0639		ARABIC LETTER AIN
+063A		ARABIC LETTER GHAIN
+0640		ARABIC TATWEEL
+0641		ARABIC LETTER FEH
+0642		ARABIC LETTER QAF
+0643		ARABIC LETTER KAF
+0644		ARABIC LETTER LAM
+0645		ARABIC LETTER MEEM
+0646		ARABIC LETTER NOON
+0647		ARABIC LETTER HEH
+0648		ARABIC LETTER WAW
+0649		ARABIC LETTER ALEF MAKSURA
+064A		ARABIC LETTER YEH
+064B		ARABIC FATHATAN
+064C		ARABIC DAMMATAN
+064D		ARABIC KASRATAN
+064E		ARABIC FATHA
+064F		ARABIC DAMMA
+0650		ARABIC KASRA
+0651		ARABIC SHADDA
+0652		ARABIC SUKUN
+0653		ARABIC MADDAH ABOVE
+0654		ARABIC HAMZA ABOVE
+0655		ARABIC HAMZA BELOW
+0656		ARABIC SUBSCRIPT ALEF
+0657		ARABIC INVERTED DAMMA
+0658		ARABIC MARK NOON GHUNNA
+0659		ARABIC ZWARAKAY
+065A		ARABIC VOWEL SIGN SMALL V ABOVE
+065B		ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+065C		ARABIC VOWEL SIGN DOT BELOW
+065D		ARABIC REVERSED DAMMA
+065E		ARABIC FATHA WITH TWO DOTS
+0660		ARABIC-INDIC DIGIT ZERO
+0661		ARABIC-INDIC DIGIT ONE
+0662		ARABIC-INDIC DIGIT TWO
+0663		ARABIC-INDIC DIGIT THREE
+0664		ARABIC-INDIC DIGIT FOUR
+0665		ARABIC-INDIC DIGIT FIVE
+0666		ARABIC-INDIC DIGIT SIX
+0667		ARABIC-INDIC DIGIT SEVEN
+0668		ARABIC-INDIC DIGIT EIGHT
+0669		ARABIC-INDIC DIGIT NINE
+066A		ARABIC PERCENT SIGN
+066B		ARABIC DECIMAL SEPARATOR
+066C		ARABIC THOUSANDS SEPARATOR
+066D		ARABIC FIVE POINTED STAR
+066E		ARABIC LETTER DOTLESS BEH
+066F		ARABIC LETTER DOTLESS QAF
+0670		ARABIC LETTER SUPERSCRIPT ALEF
+0671		ARABIC LETTER ALEF WASLA
+0672		ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0673		ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0674		ARABIC LETTER HIGH HAMZA
+0675		ARABIC LETTER HIGH HAMZA ALEF
+0676		ARABIC LETTER HIGH HAMZA WAW
+0677		ARABIC LETTER U WITH HAMZA ABOVE
+0678		ARABIC LETTER HIGH HAMZA YEH
+0679		ARABIC LETTER TTEH
+067A		ARABIC LETTER TTEHEH
+067B		ARABIC LETTER BEEH
+067C		ARABIC LETTER TEH WITH RING
+067D		ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067E		ARABIC LETTER PEH
+067F		ARABIC LETTER TEHEH
+0680		ARABIC LETTER BEHEH
+0681		ARABIC LETTER HAH WITH HAMZA ABOVE
+0682		ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0683		ARABIC LETTER NYEH
+0684		ARABIC LETTER DYEH
+0685		ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0686		ARABIC LETTER TCHEH
+0687		ARABIC LETTER TCHEHEH
+0688		ARABIC LETTER DDAL
+0689		ARABIC LETTER DAL WITH RING
+068A		ARABIC LETTER DAL WITH DOT BELOW
+068B		ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C		ARABIC LETTER DAHAL
+068D		ARABIC LETTER DDAHAL
+068E		ARABIC LETTER DUL
+068F		ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690		ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+0691		ARABIC LETTER RREH
+0692		ARABIC LETTER REH WITH SMALL V
+0693		ARABIC LETTER REH WITH RING
+0694		ARABIC LETTER REH WITH DOT BELOW
+0695		ARABIC LETTER REH WITH SMALL V BELOW
+0696		ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697		ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698		ARABIC LETTER JEH
+0699		ARABIC LETTER REH WITH FOUR DOTS ABOVE
+069A		ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B		ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C		ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+069D		ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E		ARABIC LETTER SAD WITH THREE DOTS ABOVE
+069F		ARABIC LETTER TAH WITH THREE DOTS ABOVE
+06A0		ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06A1		ARABIC LETTER DOTLESS FEH
+06A2		ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3		ARABIC LETTER FEH WITH DOT BELOW
+06A4		ARABIC LETTER VEH
+06A5		ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6		ARABIC LETTER PEHEH
+06A7		ARABIC LETTER QAF WITH DOT ABOVE
+06A8		ARABIC LETTER QAF WITH THREE DOTS ABOVE
+06A9		ARABIC LETTER KEHEH
+06AA		ARABIC LETTER SWASH KAF
+06AB		ARABIC LETTER KAF WITH RING
+06AC		ARABIC LETTER KAF WITH DOT ABOVE
+06AD		ARABIC LETTER NG
+06AE		ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF		ARABIC LETTER GAF
+06B0		ARABIC LETTER GAF WITH RING
+06B1		ARABIC LETTER NGOEH
+06B2		ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3		ARABIC LETTER GUEH
+06B4		ARABIC LETTER GAF WITH THREE DOTS ABOVE
+06B5		ARABIC LETTER LAM WITH SMALL V
+06B6		ARABIC LETTER LAM WITH DOT ABOVE
+06B7		ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8		ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9		ARABIC LETTER NOON WITH DOT BELOW
+06BA		ARABIC LETTER NOON GHUNNA
+06BB		ARABIC LETTER RNOON
+06BC		ARABIC LETTER NOON WITH RING
+06BD		ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06BE		ARABIC LETTER HEH DOACHASHMEE
+06BF		ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0		ARABIC LETTER HEH WITH YEH ABOVE
+06C1		ARABIC LETTER HEH GOAL
+06C2		ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06C3		ARABIC LETTER TEH MARBUTA GOAL
+06C4		ARABIC LETTER WAW WITH RING
+06C5		ARABIC LETTER KIRGHIZ OE
+06C6		ARABIC LETTER OE
+06C7		ARABIC LETTER U
+06C8		ARABIC LETTER YU
+06C9		ARABIC LETTER KIRGHIZ YU
+06CA		ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB		ARABIC LETTER VE
+06CC		ARABIC LETTER FARSI YEH
+06CD		ARABIC LETTER YEH WITH TAIL
+06CE		ARABIC LETTER YEH WITH SMALL V
+06CF		ARABIC LETTER WAW WITH DOT ABOVE
+06D0		ARABIC LETTER E
+06D1		ARABIC LETTER YEH WITH THREE DOTS BELOW
+06D2		ARABIC LETTER YEH BARREE
+06D3		ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4		ARABIC FULL STOP
+06D5		ARABIC LETTER AE
+06D6		ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7		ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8		ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9		ARABIC SMALL HIGH LAM ALEF
+06DA		ARABIC SMALL HIGH JEEM
+06DB		ARABIC SMALL HIGH THREE DOTS
+06DC		ARABIC SMALL HIGH SEEN
+06DD		ARABIC END OF AYAH
+06DE		ARABIC START OF RUB EL HIZB
+06DF		ARABIC SMALL HIGH ROUNDED ZERO
+06E0		ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1		ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2		ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3		ARABIC SMALL LOW SEEN
+06E4		ARABIC SMALL HIGH MADDA
+06E5		ARABIC SMALL WAW
+06E6		ARABIC SMALL YEH
+06E7		ARABIC SMALL HIGH YEH
+06E8		ARABIC SMALL HIGH NOON
+06E9		ARABIC PLACE OF SAJDAH
+06EA		ARABIC EMPTY CENTRE LOW STOP
+06EB		ARABIC EMPTY CENTRE HIGH STOP
+06EC		ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED		ARABIC SMALL LOW MEEM
+06EE		ARABIC LETTER DAL WITH INVERTED V
+06EF		ARABIC LETTER REH WITH INVERTED V
+06F0		EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1		EXTENDED ARABIC-INDIC DIGIT ONE
+06F2		EXTENDED ARABIC-INDIC DIGIT TWO
+06F3		EXTENDED ARABIC-INDIC DIGIT THREE
+06F4		EXTENDED ARABIC-INDIC DIGIT FOUR
+06F5		EXTENDED ARABIC-INDIC DIGIT FIVE
+06F6		EXTENDED ARABIC-INDIC DIGIT SIX
+06F7		EXTENDED ARABIC-INDIC DIGIT SEVEN
+06F8		EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9		EXTENDED ARABIC-INDIC DIGIT NINE
+06FA		ARABIC LETTER SHEEN WITH DOT BELOW
+06FB		ARABIC LETTER DAD WITH DOT BELOW
+06FC		ARABIC LETTER GHAIN WITH DOT BELOW
+06FD		ARABIC SIGN SINDHI AMPERSAND
+06FE		ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF		ARABIC LETTER HEH WITH INVERTED V
+0700		SYRIAC END OF PARAGRAPH
+0701		SYRIAC SUPRALINEAR FULL STOP
+0702		SYRIAC SUBLINEAR FULL STOP
+0703		SYRIAC SUPRALINEAR COLON
+0704		SYRIAC SUBLINEAR COLON
+0705		SYRIAC HORIZONTAL COLON
+0706		SYRIAC COLON SKEWED LEFT
+0707		SYRIAC COLON SKEWED RIGHT
+0708		SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709		SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A		SYRIAC CONTRACTION
+070B		SYRIAC HARKLEAN OBELUS
+070C		SYRIAC HARKLEAN METOBELUS
+070D		SYRIAC HARKLEAN ASTERISCUS
+070F		SYRIAC ABBREVIATION MARK
+0710		SYRIAC LETTER ALAPH
+0711		SYRIAC LETTER SUPERSCRIPT ALAPH
+0712		SYRIAC LETTER BETH
+0713		SYRIAC LETTER GAMAL
+0714		SYRIAC LETTER GAMAL GARSHUNI
+0715		SYRIAC LETTER DALATH
+0716		SYRIAC LETTER DOTLESS DALATH RISH
+0717		SYRIAC LETTER HE
+0718		SYRIAC LETTER WAW
+0719		SYRIAC LETTER ZAIN
+071A		SYRIAC LETTER HETH
+071B		SYRIAC LETTER TETH
+071C		SYRIAC LETTER TETH GARSHUNI
+071D		SYRIAC LETTER YUDH
+071E		SYRIAC LETTER YUDH HE
+071F		SYRIAC LETTER KAPH
+0720		SYRIAC LETTER LAMADH
+0721		SYRIAC LETTER MIM
+0722		SYRIAC LETTER NUN
+0723		SYRIAC LETTER SEMKATH
+0724		SYRIAC LETTER FINAL SEMKATH
+0725		SYRIAC LETTER E
+0726		SYRIAC LETTER PE
+0727		SYRIAC LETTER REVERSED PE
+0728		SYRIAC LETTER SADHE
+0729		SYRIAC LETTER QAPH
+072A		SYRIAC LETTER RISH
+072B		SYRIAC LETTER SHIN
+072C		SYRIAC LETTER TAW
+072D		SYRIAC LETTER PERSIAN BHETH
+072E		SYRIAC LETTER PERSIAN GHAMAL
+072F		SYRIAC LETTER PERSIAN DHALATH
+0730		SYRIAC PTHAHA ABOVE
+0731		SYRIAC PTHAHA BELOW
+0732		SYRIAC PTHAHA DOTTED
+0733		SYRIAC ZQAPHA ABOVE
+0734		SYRIAC ZQAPHA BELOW
+0735		SYRIAC ZQAPHA DOTTED
+0736		SYRIAC RBASA ABOVE
+0737		SYRIAC RBASA BELOW
+0738		SYRIAC DOTTED ZLAMA HORIZONTAL
+0739		SYRIAC DOTTED ZLAMA ANGULAR
+073A		SYRIAC HBASA ABOVE
+073B		SYRIAC HBASA BELOW
+073C		SYRIAC HBASA-ESASA DOTTED
+073D		SYRIAC ESASA ABOVE
+073E		SYRIAC ESASA BELOW
+073F		SYRIAC RWAHA
+0740		SYRIAC FEMININE DOT
+0741		SYRIAC QUSHSHAYA
+0742		SYRIAC RUKKAKHA
+0743		SYRIAC TWO VERTICAL DOTS ABOVE
+0744		SYRIAC TWO VERTICAL DOTS BELOW
+0745		SYRIAC THREE DOTS ABOVE
+0746		SYRIAC THREE DOTS BELOW
+0747		SYRIAC OBLIQUE LINE ABOVE
+0748		SYRIAC OBLIQUE LINE BELOW
+0749		SYRIAC MUSIC
+074A		SYRIAC BARREKH
+074D		SYRIAC LETTER SOGDIAN ZHAIN
+074E		SYRIAC LETTER SOGDIAN KHAPH
+074F		SYRIAC LETTER SOGDIAN FE
+0750		ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751		ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752		ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753		ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754		ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755		ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756		ARABIC LETTER BEH WITH SMALL V
+0757		ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758		ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+0759		ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+075A		ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+075B		ARABIC LETTER REH WITH STROKE
+075C		ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+075D		ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E		ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F		ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0760		ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761		ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+0762		ARABIC LETTER KEHEH WITH DOT ABOVE
+0763		ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+0764		ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0765		ARABIC LETTER MEEM WITH DOT ABOVE
+0766		ARABIC LETTER MEEM WITH DOT BELOW
+0767		ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768		ARABIC LETTER NOON WITH SMALL TAH
+0769		ARABIC LETTER NOON WITH SMALL V
+076A		ARABIC LETTER LAM WITH BAR
+076B		ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+076C		ARABIC LETTER REH WITH HAMZA ABOVE
+076D		ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+0780		THAANA LETTER HAA
+0781		THAANA LETTER SHAVIYANI
+0782		THAANA LETTER NOONU
+0783		THAANA LETTER RAA
+0784		THAANA LETTER BAA
+0785		THAANA LETTER LHAVIYANI
+0786		THAANA LETTER KAAFU
+0787		THAANA LETTER ALIFU
+0788		THAANA LETTER VAAVU
+0789		THAANA LETTER MEEMU
+078A		THAANA LETTER FAAFU
+078B		THAANA LETTER DHAALU
+078C		THAANA LETTER THAA
+078D		THAANA LETTER LAAMU
+078E		THAANA LETTER GAAFU
+078F		THAANA LETTER GNAVIYANI
+0790		THAANA LETTER SEENU
+0791		THAANA LETTER DAVIYANI
+0792		THAANA LETTER ZAVIYANI
+0793		THAANA LETTER TAVIYANI
+0794		THAANA LETTER YAA
+0795		THAANA LETTER PAVIYANI
+0796		THAANA LETTER JAVIYANI
+0797		THAANA LETTER CHAVIYANI
+0798		THAANA LETTER TTAA
+0799		THAANA LETTER HHAA
+079A		THAANA LETTER KHAA
+079B		THAANA LETTER THAALU
+079C		THAANA LETTER ZAA
+079D		THAANA LETTER SHEENU
+079E		THAANA LETTER SAADHU
+079F		THAANA LETTER DAADHU
+07A0		THAANA LETTER TO
+07A1		THAANA LETTER ZO
+07A2		THAANA LETTER AINU
+07A3		THAANA LETTER GHAINU
+07A4		THAANA LETTER QAAFU
+07A5		THAANA LETTER WAAVU
+07A6		THAANA ABAFILI
+07A7		THAANA AABAAFILI
+07A8		THAANA IBIFILI
+07A9		THAANA EEBEEFILI
+07AA		THAANA UBUFILI
+07AB		THAANA OOBOOFILI
+07AC		THAANA EBEFILI
+07AD		THAANA EYBEYFILI
+07AE		THAANA OBOFILI
+07AF		THAANA OABOAFILI
+07B0		THAANA SUKUN
+07B1		THAANA LETTER NAA
+0901		DEVANAGARI SIGN CANDRABINDU
+0902		DEVANAGARI SIGN ANUSVARA
+0903		DEVANAGARI SIGN VISARGA
+0904		DEVANAGARI LETTER SHORT A
+0905		DEVANAGARI LETTER A
+0906		DEVANAGARI LETTER AA
+0907		DEVANAGARI LETTER I
+0908		DEVANAGARI LETTER II
+0909		DEVANAGARI LETTER U
+090A		DEVANAGARI LETTER UU
+090B		DEVANAGARI LETTER VOCALIC R
+090C		DEVANAGARI LETTER VOCALIC L
+090D		DEVANAGARI LETTER CANDRA E
+090E		DEVANAGARI LETTER SHORT E
+090F		DEVANAGARI LETTER E
+0910		DEVANAGARI LETTER AI
+0911		DEVANAGARI LETTER CANDRA O
+0912		DEVANAGARI LETTER SHORT O
+0913		DEVANAGARI LETTER O
+0914		DEVANAGARI LETTER AU
+0915		DEVANAGARI LETTER KA
+0916		DEVANAGARI LETTER KHA
+0917		DEVANAGARI LETTER GA
+0918		DEVANAGARI LETTER GHA
+0919		DEVANAGARI LETTER NGA
+091A		DEVANAGARI LETTER CA
+091B		DEVANAGARI LETTER CHA
+091C		DEVANAGARI LETTER JA
+091D		DEVANAGARI LETTER JHA
+091E		DEVANAGARI LETTER NYA
+091F		DEVANAGARI LETTER TTA
+0920		DEVANAGARI LETTER TTHA
+0921		DEVANAGARI LETTER DDA
+0922		DEVANAGARI LETTER DDHA
+0923		DEVANAGARI LETTER NNA
+0924		DEVANAGARI LETTER TA
+0925		DEVANAGARI LETTER THA
+0926		DEVANAGARI LETTER DA
+0927		DEVANAGARI LETTER DHA
+0928		DEVANAGARI LETTER NA
+0929		DEVANAGARI LETTER NNNA
+092A		DEVANAGARI LETTER PA
+092B		DEVANAGARI LETTER PHA
+092C		DEVANAGARI LETTER BA
+092D		DEVANAGARI LETTER BHA
+092E		DEVANAGARI LETTER MA
+092F		DEVANAGARI LETTER YA
+0930		DEVANAGARI LETTER RA
+0931		DEVANAGARI LETTER RRA
+0932		DEVANAGARI LETTER LA
+0933		DEVANAGARI LETTER LLA
+0934		DEVANAGARI LETTER LLLA
+0935		DEVANAGARI LETTER VA
+0936		DEVANAGARI LETTER SHA
+0937		DEVANAGARI LETTER SSA
+0938		DEVANAGARI LETTER SA
+0939		DEVANAGARI LETTER HA
+093C		DEVANAGARI SIGN NUKTA
+093D		DEVANAGARI SIGN AVAGRAHA
+093E		DEVANAGARI VOWEL SIGN AA
+093F		DEVANAGARI VOWEL SIGN I
+0940		DEVANAGARI VOWEL SIGN II
+0941		DEVANAGARI VOWEL SIGN U
+0942		DEVANAGARI VOWEL SIGN UU
+0943		DEVANAGARI VOWEL SIGN VOCALIC R
+0944		DEVANAGARI VOWEL SIGN VOCALIC RR
+0945		DEVANAGARI VOWEL SIGN CANDRA E
+0946		DEVANAGARI VOWEL SIGN SHORT E
+0947		DEVANAGARI VOWEL SIGN E
+0948		DEVANAGARI VOWEL SIGN AI
+0949		DEVANAGARI VOWEL SIGN CANDRA O
+094A		DEVANAGARI VOWEL SIGN SHORT O
+094B		DEVANAGARI VOWEL SIGN O
+094C		DEVANAGARI VOWEL SIGN AU
+094D		DEVANAGARI SIGN VIRAMA
+0950		DEVANAGARI OM
+0951		DEVANAGARI STRESS SIGN UDATTA
+0952		DEVANAGARI STRESS SIGN ANUDATTA
+0953		DEVANAGARI GRAVE ACCENT
+0954		DEVANAGARI ACUTE ACCENT
+0958		DEVANAGARI LETTER QA
+0959		DEVANAGARI LETTER KHHA
+095A		DEVANAGARI LETTER GHHA
+095B		DEVANAGARI LETTER ZA
+095C		DEVANAGARI LETTER DDDHA
+095D		DEVANAGARI LETTER RHA
+095E		DEVANAGARI LETTER FA
+095F		DEVANAGARI LETTER YYA
+0960		DEVANAGARI LETTER VOCALIC RR
+0961		DEVANAGARI LETTER VOCALIC LL
+0962		DEVANAGARI VOWEL SIGN VOCALIC L
+0963		DEVANAGARI VOWEL SIGN VOCALIC LL
+0964		DEVANAGARI DANDA
+0965		DEVANAGARI DOUBLE DANDA
+0966		DEVANAGARI DIGIT ZERO
+0967		DEVANAGARI DIGIT ONE
+0968		DEVANAGARI DIGIT TWO
+0969		DEVANAGARI DIGIT THREE
+096A		DEVANAGARI DIGIT FOUR
+096B		DEVANAGARI DIGIT FIVE
+096C		DEVANAGARI DIGIT SIX
+096D		DEVANAGARI DIGIT SEVEN
+096E		DEVANAGARI DIGIT EIGHT
+096F		DEVANAGARI DIGIT NINE
+0970		DEVANAGARI ABBREVIATION SIGN
+097D		DEVANAGARI LETTER GLOTTAL STOP
+0981		BENGALI SIGN CANDRABINDU
+0982		BENGALI SIGN ANUSVARA
+0983		BENGALI SIGN VISARGA
+0985		BENGALI LETTER A
+0986		BENGALI LETTER AA
+0987		BENGALI LETTER I
+0988		BENGALI LETTER II
+0989		BENGALI LETTER U
+098A		BENGALI LETTER UU
+098B		BENGALI LETTER VOCALIC R
+098C		BENGALI LETTER VOCALIC L
+098F		BENGALI LETTER E
+0990		BENGALI LETTER AI
+0993		BENGALI LETTER O
+0994		BENGALI LETTER AU
+0995		BENGALI LETTER KA
+0996		BENGALI LETTER KHA
+0997		BENGALI LETTER GA
+0998		BENGALI LETTER GHA
+0999		BENGALI LETTER NGA
+099A		BENGALI LETTER CA
+099B		BENGALI LETTER CHA
+099C		BENGALI LETTER JA
+099D		BENGALI LETTER JHA
+099E		BENGALI LETTER NYA
+099F		BENGALI LETTER TTA
+09A0		BENGALI LETTER TTHA
+09A1		BENGALI LETTER DDA
+09A2		BENGALI LETTER DDHA
+09A3		BENGALI LETTER NNA
+09A4		BENGALI LETTER TA
+09A5		BENGALI LETTER THA
+09A6		BENGALI LETTER DA
+09A7		BENGALI LETTER DHA
+09A8		BENGALI LETTER NA
+09AA		BENGALI LETTER PA
+09AB		BENGALI LETTER PHA
+09AC		BENGALI LETTER BA
+09AD		BENGALI LETTER BHA
+09AE		BENGALI LETTER MA
+09AF		BENGALI LETTER YA
+09B0		BENGALI LETTER RA
+09B2		BENGALI LETTER LA
+09B6		BENGALI LETTER SHA
+09B7		BENGALI LETTER SSA
+09B8		BENGALI LETTER SA
+09B9		BENGALI LETTER HA
+09BC		BENGALI SIGN NUKTA
+09BD		BENGALI SIGN AVAGRAHA
+09BE		BENGALI VOWEL SIGN AA
+09BF		BENGALI VOWEL SIGN I
+09C0		BENGALI VOWEL SIGN II
+09C1		BENGALI VOWEL SIGN U
+09C2		BENGALI VOWEL SIGN UU
+09C3		BENGALI VOWEL SIGN VOCALIC R
+09C4		BENGALI VOWEL SIGN VOCALIC RR
+09C7		BENGALI VOWEL SIGN E
+09C8		BENGALI VOWEL SIGN AI
+09CB		BENGALI VOWEL SIGN O
+09CC		BENGALI VOWEL SIGN AU
+09CD		BENGALI SIGN VIRAMA
+09CE		BENGALI LETTER KHANDA TA
+09D7		BENGALI AU LENGTH MARK
+09DC		BENGALI LETTER RRA
+09DD		BENGALI LETTER RHA
+09DF		BENGALI LETTER YYA
+09E0		BENGALI LETTER VOCALIC RR
+09E1		BENGALI LETTER VOCALIC LL
+09E2		BENGALI VOWEL SIGN VOCALIC L
+09E3		BENGALI VOWEL SIGN VOCALIC LL
+09E6		BENGALI DIGIT ZERO
+09E7		BENGALI DIGIT ONE
+09E8		BENGALI DIGIT TWO
+09E9		BENGALI DIGIT THREE
+09EA		BENGALI DIGIT FOUR
+09EB		BENGALI DIGIT FIVE
+09EC		BENGALI DIGIT SIX
+09ED		BENGALI DIGIT SEVEN
+09EE		BENGALI DIGIT EIGHT
+09EF		BENGALI DIGIT NINE
+09F0		BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09F1		BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2		BENGALI RUPEE MARK
+09F3		BENGALI RUPEE SIGN
+09F4		BENGALI CURRENCY NUMERATOR ONE
+09F5		BENGALI CURRENCY NUMERATOR TWO
+09F6		BENGALI CURRENCY NUMERATOR THREE
+09F7		BENGALI CURRENCY NUMERATOR FOUR
+09F8		BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9		BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA		BENGALI ISSHAR
+0A01		GURMUKHI SIGN ADAK BINDI
+0A02		GURMUKHI SIGN BINDI
+0A03		GURMUKHI SIGN VISARGA
+0A05		GURMUKHI LETTER A
+0A06		GURMUKHI LETTER AA
+0A07		GURMUKHI LETTER I
+0A08		GURMUKHI LETTER II
+0A09		GURMUKHI LETTER U
+0A0A		GURMUKHI LETTER UU
+0A0F		GURMUKHI LETTER EE
+0A10		GURMUKHI LETTER AI
+0A13		GURMUKHI LETTER OO
+0A14		GURMUKHI LETTER AU
+0A15		GURMUKHI LETTER KA
+0A16		GURMUKHI LETTER KHA
+0A17		GURMUKHI LETTER GA
+0A18		GURMUKHI LETTER GHA
+0A19		GURMUKHI LETTER NGA
+0A1A		GURMUKHI LETTER CA
+0A1B		GURMUKHI LETTER CHA
+0A1C		GURMUKHI LETTER JA
+0A1D		GURMUKHI LETTER JHA
+0A1E		GURMUKHI LETTER NYA
+0A1F		GURMUKHI LETTER TTA
+0A20		GURMUKHI LETTER TTHA
+0A21		GURMUKHI LETTER DDA
+0A22		GURMUKHI LETTER DDHA
+0A23		GURMUKHI LETTER NNA
+0A24		GURMUKHI LETTER TA
+0A25		GURMUKHI LETTER THA
+0A26		GURMUKHI LETTER DA
+0A27		GURMUKHI LETTER DHA
+0A28		GURMUKHI LETTER NA
+0A2A		GURMUKHI LETTER PA
+0A2B		GURMUKHI LETTER PHA
+0A2C		GURMUKHI LETTER BA
+0A2D		GURMUKHI LETTER BHA
+0A2E		GURMUKHI LETTER MA
+0A2F		GURMUKHI LETTER YA
+0A30		GURMUKHI LETTER RA
+0A32		GURMUKHI LETTER LA
+0A33		GURMUKHI LETTER LLA
+0A35		GURMUKHI LETTER VA
+0A36		GURMUKHI LETTER SHA
+0A38		GURMUKHI LETTER SA
+0A39		GURMUKHI LETTER HA
+0A3C		GURMUKHI SIGN NUKTA
+0A3E		GURMUKHI VOWEL SIGN AA
+0A3F		GURMUKHI VOWEL SIGN I
+0A40		GURMUKHI VOWEL SIGN II
+0A41		GURMUKHI VOWEL SIGN U
+0A42		GURMUKHI VOWEL SIGN UU
+0A47		GURMUKHI VOWEL SIGN EE
+0A48		GURMUKHI VOWEL SIGN AI
+0A4B		GURMUKHI VOWEL SIGN OO
+0A4C		GURMUKHI VOWEL SIGN AU
+0A4D		GURMUKHI SIGN VIRAMA
+0A59		GURMUKHI LETTER KHHA
+0A5A		GURMUKHI LETTER GHHA
+0A5B		GURMUKHI LETTER ZA
+0A5C		GURMUKHI LETTER RRA
+0A5E		GURMUKHI LETTER FA
+0A66		GURMUKHI DIGIT ZERO
+0A67		GURMUKHI DIGIT ONE
+0A68		GURMUKHI DIGIT TWO
+0A69		GURMUKHI DIGIT THREE
+0A6A		GURMUKHI DIGIT FOUR
+0A6B		GURMUKHI DIGIT FIVE
+0A6C		GURMUKHI DIGIT SIX
+0A6D		GURMUKHI DIGIT SEVEN
+0A6E		GURMUKHI DIGIT EIGHT
+0A6F		GURMUKHI DIGIT NINE
+0A70		GURMUKHI TIPPI
+0A71		GURMUKHI ADDAK
+0A72		GURMUKHI IRI
+0A73		GURMUKHI URA
+0A74		GURMUKHI EK ONKAR
+0A81		GUJARATI SIGN CANDRABINDU
+0A82		GUJARATI SIGN ANUSVARA
+0A83		GUJARATI SIGN VISARGA
+0A85		GUJARATI LETTER A
+0A86		GUJARATI LETTER AA
+0A87		GUJARATI LETTER I
+0A88		GUJARATI LETTER II
+0A89		GUJARATI LETTER U
+0A8A		GUJARATI LETTER UU
+0A8B		GUJARATI LETTER VOCALIC R
+0A8C		GUJARATI LETTER VOCALIC L
+0A8D		GUJARATI VOWEL CANDRA E
+0A8F		GUJARATI LETTER E
+0A90		GUJARATI LETTER AI
+0A91		GUJARATI VOWEL CANDRA O
+0A93		GUJARATI LETTER O
+0A94		GUJARATI LETTER AU
+0A95		GUJARATI LETTER KA
+0A96		GUJARATI LETTER KHA
+0A97		GUJARATI LETTER GA
+0A98		GUJARATI LETTER GHA
+0A99		GUJARATI LETTER NGA
+0A9A		GUJARATI LETTER CA
+0A9B		GUJARATI LETTER CHA
+0A9C		GUJARATI LETTER JA
+0A9D		GUJARATI LETTER JHA
+0A9E		GUJARATI LETTER NYA
+0A9F		GUJARATI LETTER TTA
+0AA0		GUJARATI LETTER TTHA
+0AA1		GUJARATI LETTER DDA
+0AA2		GUJARATI LETTER DDHA
+0AA3		GUJARATI LETTER NNA
+0AA4		GUJARATI LETTER TA
+0AA5		GUJARATI LETTER THA
+0AA6		GUJARATI LETTER DA
+0AA7		GUJARATI LETTER DHA
+0AA8		GUJARATI LETTER NA
+0AAA		GUJARATI LETTER PA
+0AAB		GUJARATI LETTER PHA
+0AAC		GUJARATI LETTER BA
+0AAD		GUJARATI LETTER BHA
+0AAE		GUJARATI LETTER MA
+0AAF		GUJARATI LETTER YA
+0AB0		GUJARATI LETTER RA
+0AB2		GUJARATI LETTER LA
+0AB3		GUJARATI LETTER LLA
+0AB5		GUJARATI LETTER VA
+0AB6		GUJARATI LETTER SHA
+0AB7		GUJARATI LETTER SSA
+0AB8		GUJARATI LETTER SA
+0AB9		GUJARATI LETTER HA
+0ABC		GUJARATI SIGN NUKTA
+0ABD		GUJARATI SIGN AVAGRAHA
+0ABE		GUJARATI VOWEL SIGN AA
+0ABF		GUJARATI VOWEL SIGN I
+0AC0		GUJARATI VOWEL SIGN II
+0AC1		GUJARATI VOWEL SIGN U
+0AC2		GUJARATI VOWEL SIGN UU
+0AC3		GUJARATI VOWEL SIGN VOCALIC R
+0AC4		GUJARATI VOWEL SIGN VOCALIC RR
+0AC5		GUJARATI VOWEL SIGN CANDRA E
+0AC7		GUJARATI VOWEL SIGN E
+0AC8		GUJARATI VOWEL SIGN AI
+0AC9		GUJARATI VOWEL SIGN CANDRA O
+0ACB		GUJARATI VOWEL SIGN O
+0ACC		GUJARATI VOWEL SIGN AU
+0ACD		GUJARATI SIGN VIRAMA
+0AD0		GUJARATI OM
+0AE0		GUJARATI LETTER VOCALIC RR
+0AE1		GUJARATI LETTER VOCALIC LL
+0AE2		GUJARATI VOWEL SIGN VOCALIC L
+0AE3		GUJARATI VOWEL SIGN VOCALIC LL
+0AE6		GUJARATI DIGIT ZERO
+0AE7		GUJARATI DIGIT ONE
+0AE8		GUJARATI DIGIT TWO
+0AE9		GUJARATI DIGIT THREE
+0AEA		GUJARATI DIGIT FOUR
+0AEB		GUJARATI DIGIT FIVE
+0AEC		GUJARATI DIGIT SIX
+0AED		GUJARATI DIGIT SEVEN
+0AEE		GUJARATI DIGIT EIGHT
+0AEF		GUJARATI DIGIT NINE
+0AF1		GUJARATI RUPEE SIGN
+0B01		ORIYA SIGN CANDRABINDU
+0B02		ORIYA SIGN ANUSVARA
+0B03		ORIYA SIGN VISARGA
+0B05		ORIYA LETTER A
+0B06		ORIYA LETTER AA
+0B07		ORIYA LETTER I
+0B08		ORIYA LETTER II
+0B09		ORIYA LETTER U
+0B0A		ORIYA LETTER UU
+0B0B		ORIYA LETTER VOCALIC R
+0B0C		ORIYA LETTER VOCALIC L
+0B0F		ORIYA LETTER E
+0B10		ORIYA LETTER AI
+0B13		ORIYA LETTER O
+0B14		ORIYA LETTER AU
+0B15		ORIYA LETTER KA
+0B16		ORIYA LETTER KHA
+0B17		ORIYA LETTER GA
+0B18		ORIYA LETTER GHA
+0B19		ORIYA LETTER NGA
+0B1A		ORIYA LETTER CA
+0B1B		ORIYA LETTER CHA
+0B1C		ORIYA LETTER JA
+0B1D		ORIYA LETTER JHA
+0B1E		ORIYA LETTER NYA
+0B1F		ORIYA LETTER TTA
+0B20		ORIYA LETTER TTHA
+0B21		ORIYA LETTER DDA
+0B22		ORIYA LETTER DDHA
+0B23		ORIYA LETTER NNA
+0B24		ORIYA LETTER TA
+0B25		ORIYA LETTER THA
+0B26		ORIYA LETTER DA
+0B27		ORIYA LETTER DHA
+0B28		ORIYA LETTER NA
+0B2A		ORIYA LETTER PA
+0B2B		ORIYA LETTER PHA
+0B2C		ORIYA LETTER BA
+0B2D		ORIYA LETTER BHA
+0B2E		ORIYA LETTER MA
+0B2F		ORIYA LETTER YA
+0B30		ORIYA LETTER RA
+0B32		ORIYA LETTER LA
+0B33		ORIYA LETTER LLA
+0B35		ORIYA LETTER VA
+0B36		ORIYA LETTER SHA
+0B37		ORIYA LETTER SSA
+0B38		ORIYA LETTER SA
+0B39		ORIYA LETTER HA
+0B3C		ORIYA SIGN NUKTA
+0B3D		ORIYA SIGN AVAGRAHA
+0B3E		ORIYA VOWEL SIGN AA
+0B3F		ORIYA VOWEL SIGN I
+0B40		ORIYA VOWEL SIGN II
+0B41		ORIYA VOWEL SIGN U
+0B42		ORIYA VOWEL SIGN UU
+0B43		ORIYA VOWEL SIGN VOCALIC R
+0B47		ORIYA VOWEL SIGN E
+0B48		ORIYA VOWEL SIGN AI
+0B4B		ORIYA VOWEL SIGN O
+0B4C		ORIYA VOWEL SIGN AU
+0B4D		ORIYA SIGN VIRAMA
+0B56		ORIYA AI LENGTH MARK
+0B57		ORIYA AU LENGTH MARK
+0B5C		ORIYA LETTER RRA
+0B5D		ORIYA LETTER RHA
+0B5F		ORIYA LETTER YYA
+0B60		ORIYA LETTER VOCALIC RR
+0B61		ORIYA LETTER VOCALIC LL
+0B66		ORIYA DIGIT ZERO
+0B67		ORIYA DIGIT ONE
+0B68		ORIYA DIGIT TWO
+0B69		ORIYA DIGIT THREE
+0B6A		ORIYA DIGIT FOUR
+0B6B		ORIYA DIGIT FIVE
+0B6C		ORIYA DIGIT SIX
+0B6D		ORIYA DIGIT SEVEN
+0B6E		ORIYA DIGIT EIGHT
+0B6F		ORIYA DIGIT NINE
+0B70		ORIYA ISSHAR
+0B71		ORIYA LETTER WA
+0B82		TAMIL SIGN ANUSVARA
+0B83		TAMIL SIGN VISARGA
+0B85		TAMIL LETTER A
+0B86		TAMIL LETTER AA
+0B87		TAMIL LETTER I
+0B88		TAMIL LETTER II
+0B89		TAMIL LETTER U
+0B8A		TAMIL LETTER UU
+0B8E		TAMIL LETTER E
+0B8F		TAMIL LETTER EE
+0B90		TAMIL LETTER AI
+0B92		TAMIL LETTER O
+0B93		TAMIL LETTER OO
+0B94		TAMIL LETTER AU
+0B95		TAMIL LETTER KA
+0B99		TAMIL LETTER NGA
+0B9A		TAMIL LETTER CA
+0B9C		TAMIL LETTER JA
+0B9E		TAMIL LETTER NYA
+0B9F		TAMIL LETTER TTA
+0BA3		TAMIL LETTER NNA
+0BA4		TAMIL LETTER TA
+0BA8		TAMIL LETTER NA
+0BA9		TAMIL LETTER NNNA
+0BAA		TAMIL LETTER PA
+0BAE		TAMIL LETTER MA
+0BAF		TAMIL LETTER YA
+0BB0		TAMIL LETTER RA
+0BB1		TAMIL LETTER RRA
+0BB2		TAMIL LETTER LA
+0BB3		TAMIL LETTER LLA
+0BB4		TAMIL LETTER LLLA
+0BB5		TAMIL LETTER VA
+0BB6		TAMIL LETTER SHA
+0BB7		TAMIL LETTER SSA
+0BB8		TAMIL LETTER SA
+0BB9		TAMIL LETTER HA
+0BBE		TAMIL VOWEL SIGN AA
+0BBF		TAMIL VOWEL SIGN I
+0BC0		TAMIL VOWEL SIGN II
+0BC1		TAMIL VOWEL SIGN U
+0BC2		TAMIL VOWEL SIGN UU
+0BC6		TAMIL VOWEL SIGN E
+0BC7		TAMIL VOWEL SIGN EE
+0BC8		TAMIL VOWEL SIGN AI
+0BCA		TAMIL VOWEL SIGN O
+0BCB		TAMIL VOWEL SIGN OO
+0BCC		TAMIL VOWEL SIGN AU
+0BCD		TAMIL SIGN VIRAMA
+0BD7		TAMIL AU LENGTH MARK
+0BE6		TAMIL DIGIT ZERO
+0BE7		TAMIL DIGIT ONE
+0BE8		TAMIL DIGIT TWO
+0BE9		TAMIL DIGIT THREE
+0BEA		TAMIL DIGIT FOUR
+0BEB		TAMIL DIGIT FIVE
+0BEC		TAMIL DIGIT SIX
+0BED		TAMIL DIGIT SEVEN
+0BEE		TAMIL DIGIT EIGHT
+0BEF		TAMIL DIGIT NINE
+0BF0		TAMIL NUMBER TEN
+0BF1		TAMIL NUMBER ONE HUNDRED
+0BF2		TAMIL NUMBER ONE THOUSAND
+0BF3		TAMIL DAY SIGN
+0BF4		TAMIL MONTH SIGN
+0BF5		TAMIL YEAR SIGN
+0BF6		TAMIL DEBIT SIGN
+0BF7		TAMIL CREDIT SIGN
+0BF8		TAMIL AS ABOVE SIGN
+0BF9		TAMIL RUPEE SIGN
+0BFA		TAMIL NUMBER SIGN
+0C01		TELUGU SIGN CANDRABINDU
+0C02		TELUGU SIGN ANUSVARA
+0C03		TELUGU SIGN VISARGA
+0C05		TELUGU LETTER A
+0C06		TELUGU LETTER AA
+0C07		TELUGU LETTER I
+0C08		TELUGU LETTER II
+0C09		TELUGU LETTER U
+0C0A		TELUGU LETTER UU
+0C0B		TELUGU LETTER VOCALIC R
+0C0C		TELUGU LETTER VOCALIC L
+0C0E		TELUGU LETTER E
+0C0F		TELUGU LETTER EE
+0C10		TELUGU LETTER AI
+0C12		TELUGU LETTER O
+0C13		TELUGU LETTER OO
+0C14		TELUGU LETTER AU
+0C15		TELUGU LETTER KA
+0C16		TELUGU LETTER KHA
+0C17		TELUGU LETTER GA
+0C18		TELUGU LETTER GHA
+0C19		TELUGU LETTER NGA
+0C1A		TELUGU LETTER CA
+0C1B		TELUGU LETTER CHA
+0C1C		TELUGU LETTER JA
+0C1D		TELUGU LETTER JHA
+0C1E		TELUGU LETTER NYA
+0C1F		TELUGU LETTER TTA
+0C20		TELUGU LETTER TTHA
+0C21		TELUGU LETTER DDA
+0C22		TELUGU LETTER DDHA
+0C23		TELUGU LETTER NNA
+0C24		TELUGU LETTER TA
+0C25		TELUGU LETTER THA
+0C26		TELUGU LETTER DA
+0C27		TELUGU LETTER DHA
+0C28		TELUGU LETTER NA
+0C2A		TELUGU LETTER PA
+0C2B		TELUGU LETTER PHA
+0C2C		TELUGU LETTER BA
+0C2D		TELUGU LETTER BHA
+0C2E		TELUGU LETTER MA
+0C2F		TELUGU LETTER YA
+0C30		TELUGU LETTER RA
+0C31		TELUGU LETTER RRA
+0C32		TELUGU LETTER LA
+0C33		TELUGU LETTER LLA
+0C35		TELUGU LETTER VA
+0C36		TELUGU LETTER SHA
+0C37		TELUGU LETTER SSA
+0C38		TELUGU LETTER SA
+0C39		TELUGU LETTER HA
+0C3E		TELUGU VOWEL SIGN AA
+0C3F		TELUGU VOWEL SIGN I
+0C40		TELUGU VOWEL SIGN II
+0C41		TELUGU VOWEL SIGN U
+0C42		TELUGU VOWEL SIGN UU
+0C43		TELUGU VOWEL SIGN VOCALIC R
+0C44		TELUGU VOWEL SIGN VOCALIC RR
+0C46		TELUGU VOWEL SIGN E
+0C47		TELUGU VOWEL SIGN EE
+0C48		TELUGU VOWEL SIGN AI
+0C4A		TELUGU VOWEL SIGN O
+0C4B		TELUGU VOWEL SIGN OO
+0C4C		TELUGU VOWEL SIGN AU
+0C4D		TELUGU SIGN VIRAMA
+0C55		TELUGU LENGTH MARK
+0C56		TELUGU AI LENGTH MARK
+0C60		TELUGU LETTER VOCALIC RR
+0C61		TELUGU LETTER VOCALIC LL
+0C66		TELUGU DIGIT ZERO
+0C67		TELUGU DIGIT ONE
+0C68		TELUGU DIGIT TWO
+0C69		TELUGU DIGIT THREE
+0C6A		TELUGU DIGIT FOUR
+0C6B		TELUGU DIGIT FIVE
+0C6C		TELUGU DIGIT SIX
+0C6D		TELUGU DIGIT SEVEN
+0C6E		TELUGU DIGIT EIGHT
+0C6F		TELUGU DIGIT NINE
+0C82		KANNADA SIGN ANUSVARA
+0C83		KANNADA SIGN VISARGA
+0C85		KANNADA LETTER A
+0C86		KANNADA LETTER AA
+0C87		KANNADA LETTER I
+0C88		KANNADA LETTER II
+0C89		KANNADA LETTER U
+0C8A		KANNADA LETTER UU
+0C8B		KANNADA LETTER VOCALIC R
+0C8C		KANNADA LETTER VOCALIC L
+0C8E		KANNADA LETTER E
+0C8F		KANNADA LETTER EE
+0C90		KANNADA LETTER AI
+0C92		KANNADA LETTER O
+0C93		KANNADA LETTER OO
+0C94		KANNADA LETTER AU
+0C95		KANNADA LETTER KA
+0C96		KANNADA LETTER KHA
+0C97		KANNADA LETTER GA
+0C98		KANNADA LETTER GHA
+0C99		KANNADA LETTER NGA
+0C9A		KANNADA LETTER CA
+0C9B		KANNADA LETTER CHA
+0C9C		KANNADA LETTER JA
+0C9D		KANNADA LETTER JHA
+0C9E		KANNADA LETTER NYA
+0C9F		KANNADA LETTER TTA
+0CA0		KANNADA LETTER TTHA
+0CA1		KANNADA LETTER DDA
+0CA2		KANNADA LETTER DDHA
+0CA3		KANNADA LETTER NNA
+0CA4		KANNADA LETTER TA
+0CA5		KANNADA LETTER THA
+0CA6		KANNADA LETTER DA
+0CA7		KANNADA LETTER DHA
+0CA8		KANNADA LETTER NA
+0CAA		KANNADA LETTER PA
+0CAB		KANNADA LETTER PHA
+0CAC		KANNADA LETTER BA
+0CAD		KANNADA LETTER BHA
+0CAE		KANNADA LETTER MA
+0CAF		KANNADA LETTER YA
+0CB0		KANNADA LETTER RA
+0CB1		KANNADA LETTER RRA
+0CB2		KANNADA LETTER LA
+0CB3		KANNADA LETTER LLA
+0CB5		KANNADA LETTER VA
+0CB6		KANNADA LETTER SHA
+0CB7		KANNADA LETTER SSA
+0CB8		KANNADA LETTER SA
+0CB9		KANNADA LETTER HA
+0CBC		KANNADA SIGN NUKTA
+0CBD		KANNADA SIGN AVAGRAHA
+0CBE		KANNADA VOWEL SIGN AA
+0CBF		KANNADA VOWEL SIGN I
+0CC0		KANNADA VOWEL SIGN II
+0CC1		KANNADA VOWEL SIGN U
+0CC2		KANNADA VOWEL SIGN UU
+0CC3		KANNADA VOWEL SIGN VOCALIC R
+0CC4		KANNADA VOWEL SIGN VOCALIC RR
+0CC6		KANNADA VOWEL SIGN E
+0CC7		KANNADA VOWEL SIGN EE
+0CC8		KANNADA VOWEL SIGN AI
+0CCA		KANNADA VOWEL SIGN O
+0CCB		KANNADA VOWEL SIGN OO
+0CCC		KANNADA VOWEL SIGN AU
+0CCD		KANNADA SIGN VIRAMA
+0CD5		KANNADA LENGTH MARK
+0CD6		KANNADA AI LENGTH MARK
+0CDE		KANNADA LETTER FA
+0CE0		KANNADA LETTER VOCALIC RR
+0CE1		KANNADA LETTER VOCALIC LL
+0CE6		KANNADA DIGIT ZERO
+0CE7		KANNADA DIGIT ONE
+0CE8		KANNADA DIGIT TWO
+0CE9		KANNADA DIGIT THREE
+0CEA		KANNADA DIGIT FOUR
+0CEB		KANNADA DIGIT FIVE
+0CEC		KANNADA DIGIT SIX
+0CED		KANNADA DIGIT SEVEN
+0CEE		KANNADA DIGIT EIGHT
+0CEF		KANNADA DIGIT NINE
+0D02		MALAYALAM SIGN ANUSVARA
+0D03		MALAYALAM SIGN VISARGA
+0D05		MALAYALAM LETTER A
+0D06		MALAYALAM LETTER AA
+0D07		MALAYALAM LETTER I
+0D08		MALAYALAM LETTER II
+0D09		MALAYALAM LETTER U
+0D0A		MALAYALAM LETTER UU
+0D0B		MALAYALAM LETTER VOCALIC R
+0D0C		MALAYALAM LETTER VOCALIC L
+0D0E		MALAYALAM LETTER E
+0D0F		MALAYALAM LETTER EE
+0D10		MALAYALAM LETTER AI
+0D12		MALAYALAM LETTER O
+0D13		MALAYALAM LETTER OO
+0D14		MALAYALAM LETTER AU
+0D15		MALAYALAM LETTER KA
+0D16		MALAYALAM LETTER KHA
+0D17		MALAYALAM LETTER GA
+0D18		MALAYALAM LETTER GHA
+0D19		MALAYALAM LETTER NGA
+0D1A		MALAYALAM LETTER CA
+0D1B		MALAYALAM LETTER CHA
+0D1C		MALAYALAM LETTER JA
+0D1D		MALAYALAM LETTER JHA
+0D1E		MALAYALAM LETTER NYA
+0D1F		MALAYALAM LETTER TTA
+0D20		MALAYALAM LETTER TTHA
+0D21		MALAYALAM LETTER DDA
+0D22		MALAYALAM LETTER DDHA
+0D23		MALAYALAM LETTER NNA
+0D24		MALAYALAM LETTER TA
+0D25		MALAYALAM LETTER THA
+0D26		MALAYALAM LETTER DA
+0D27		MALAYALAM LETTER DHA
+0D28		MALAYALAM LETTER NA
+0D2A		MALAYALAM LETTER PA
+0D2B		MALAYALAM LETTER PHA
+0D2C		MALAYALAM LETTER BA
+0D2D		MALAYALAM LETTER BHA
+0D2E		MALAYALAM LETTER MA
+0D2F		MALAYALAM LETTER YA
+0D30		MALAYALAM LETTER RA
+0D31		MALAYALAM LETTER RRA
+0D32		MALAYALAM LETTER LA
+0D33		MALAYALAM LETTER LLA
+0D34		MALAYALAM LETTER LLLA
+0D35		MALAYALAM LETTER VA
+0D36		MALAYALAM LETTER SHA
+0D37		MALAYALAM LETTER SSA
+0D38		MALAYALAM LETTER SA
+0D39		MALAYALAM LETTER HA
+0D3E		MALAYALAM VOWEL SIGN AA
+0D3F		MALAYALAM VOWEL SIGN I
+0D40		MALAYALAM VOWEL SIGN II
+0D41		MALAYALAM VOWEL SIGN U
+0D42		MALAYALAM VOWEL SIGN UU
+0D43		MALAYALAM VOWEL SIGN VOCALIC R
+0D46		MALAYALAM VOWEL SIGN E
+0D47		MALAYALAM VOWEL SIGN EE
+0D48		MALAYALAM VOWEL SIGN AI
+0D4A		MALAYALAM VOWEL SIGN O
+0D4B		MALAYALAM VOWEL SIGN OO
+0D4C		MALAYALAM VOWEL SIGN AU
+0D4D		MALAYALAM SIGN VIRAMA
+0D57		MALAYALAM AU LENGTH MARK
+0D60		MALAYALAM LETTER VOCALIC RR
+0D61		MALAYALAM LETTER VOCALIC LL
+0D66		MALAYALAM DIGIT ZERO
+0D67		MALAYALAM DIGIT ONE
+0D68		MALAYALAM DIGIT TWO
+0D69		MALAYALAM DIGIT THREE
+0D6A		MALAYALAM DIGIT FOUR
+0D6B		MALAYALAM DIGIT FIVE
+0D6C		MALAYALAM DIGIT SIX
+0D6D		MALAYALAM DIGIT SEVEN
+0D6E		MALAYALAM DIGIT EIGHT
+0D6F		MALAYALAM DIGIT NINE
+0D82		SINHALA SIGN ANUSVARAYA
+0D83		SINHALA SIGN VISARGAYA
+0D85		SINHALA LETTER AYANNA
+0D86		SINHALA LETTER AAYANNA
+0D87		SINHALA LETTER AEYANNA
+0D88		SINHALA LETTER AEEYANNA
+0D89		SINHALA LETTER IYANNA
+0D8A		SINHALA LETTER IIYANNA
+0D8B		SINHALA LETTER UYANNA
+0D8C		SINHALA LETTER UUYANNA
+0D8D		SINHALA LETTER IRUYANNA
+0D8E		SINHALA LETTER IRUUYANNA
+0D8F		SINHALA LETTER ILUYANNA
+0D90		SINHALA LETTER ILUUYANNA
+0D91		SINHALA LETTER EYANNA
+0D92		SINHALA LETTER EEYANNA
+0D93		SINHALA LETTER AIYANNA
+0D94		SINHALA LETTER OYANNA
+0D95		SINHALA LETTER OOYANNA
+0D96		SINHALA LETTER AUYANNA
+0D9A		SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B		SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C		SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D		SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E		SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F		SINHALA LETTER SANYAKA GAYANNA
+0DA0		SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1		SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2		SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3		SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4		SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5		SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6		SINHALA LETTER SANYAKA JAYANNA
+0DA7		SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8		SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9		SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA		SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB		SINHALA LETTER MUURDHAJA NAYANNA
+0DAC		SINHALA LETTER SANYAKA DDAYANNA
+0DAD		SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE		SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF		SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0		SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1		SINHALA LETTER DANTAJA NAYANNA
+0DB3		SINHALA LETTER SANYAKA DAYANNA
+0DB4		SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5		SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6		SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7		SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8		SINHALA LETTER MAYANNA
+0DB9		SINHALA LETTER AMBA BAYANNA
+0DBA		SINHALA LETTER YAYANNA
+0DBB		SINHALA LETTER RAYANNA
+0DBD		SINHALA LETTER DANTAJA LAYANNA
+0DC0		SINHALA LETTER VAYANNA
+0DC1		SINHALA LETTER TAALUJA SAYANNA
+0DC2		SINHALA LETTER MUURDHAJA SAYANNA
+0DC3		SINHALA LETTER DANTAJA SAYANNA
+0DC4		SINHALA LETTER HAYANNA
+0DC5		SINHALA LETTER MUURDHAJA LAYANNA
+0DC6		SINHALA LETTER FAYANNA
+0DCA		SINHALA SIGN AL-LAKUNA
+0DCF		SINHALA VOWEL SIGN AELA-PILLA
+0DD0		SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1		SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2		SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3		SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4		SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6		SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8		SINHALA VOWEL SIGN GAETTA-PILLA
+0DD9		SINHALA VOWEL SIGN KOMBUVA
+0DDA		SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB		SINHALA VOWEL SIGN KOMBU DEKA
+0DDC		SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD		SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE		SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DDF		SINHALA VOWEL SIGN GAYANUKITTA
+0DF2		SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DF3		SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4		SINHALA PUNCTUATION KUNDDALIYA
+0E01		THAI CHARACTER KO KAI
+0E02		THAI CHARACTER KHO KHAI
+0E03		THAI CHARACTER KHO KHUAT
+0E04		THAI CHARACTER KHO KHWAI
+0E05		THAI CHARACTER KHO KHON
+0E06		THAI CHARACTER KHO RAKHANG
+0E07		THAI CHARACTER NGO NGU
+0E08		THAI CHARACTER CHO CHAN
+0E09		THAI CHARACTER CHO CHING
+0E0A		THAI CHARACTER CHO CHANG
+0E0B		THAI CHARACTER SO SO
+0E0C		THAI CHARACTER CHO CHOE
+0E0D		THAI CHARACTER YO YING
+0E0E		THAI CHARACTER DO CHADA
+0E0F		THAI CHARACTER TO PATAK
+0E10		THAI CHARACTER THO THAN
+0E11		THAI CHARACTER THO NANGMONTHO
+0E12		THAI CHARACTER THO PHUTHAO
+0E13		THAI CHARACTER NO NEN
+0E14		THAI CHARACTER DO DEK
+0E15		THAI CHARACTER TO TAO
+0E16		THAI CHARACTER THO THUNG
+0E17		THAI CHARACTER THO THAHAN
+0E18		THAI CHARACTER THO THONG
+0E19		THAI CHARACTER NO NU
+0E1A		THAI CHARACTER BO BAIMAI
+0E1B		THAI CHARACTER PO PLA
+0E1C		THAI CHARACTER PHO PHUNG
+0E1D		THAI CHARACTER FO FA
+0E1E		THAI CHARACTER PHO PHAN
+0E1F		THAI CHARACTER FO FAN
+0E20		THAI CHARACTER PHO SAMPHAO
+0E21		THAI CHARACTER MO MA
+0E22		THAI CHARACTER YO YAK
+0E23		THAI CHARACTER RO RUA
+0E24		THAI CHARACTER RU
+0E25		THAI CHARACTER LO LING
+0E26		THAI CHARACTER LU
+0E27		THAI CHARACTER WO WAEN
+0E28		THAI CHARACTER SO SALA
+0E29		THAI CHARACTER SO RUSI
+0E2A		THAI CHARACTER SO SUA
+0E2B		THAI CHARACTER HO HIP
+0E2C		THAI CHARACTER LO CHULA
+0E2D		THAI CHARACTER O ANG
+0E2E		THAI CHARACTER HO NOKHUK
+0E2F		THAI CHARACTER PAIYANNOI
+0E30		THAI CHARACTER SARA A
+0E31		THAI CHARACTER MAI HAN-AKAT
+0E32		THAI CHARACTER SARA AA
+0E33		THAI CHARACTER SARA AM
+0E34		THAI CHARACTER SARA I
+0E35		THAI CHARACTER SARA II
+0E36		THAI CHARACTER SARA UE
+0E37		THAI CHARACTER SARA UEE
+0E38		THAI CHARACTER SARA U
+0E39		THAI CHARACTER SARA UU
+0E3A		THAI CHARACTER PHINTHU
+0E3F		THAI CURRENCY SYMBOL BAHT
+0E40		THAI CHARACTER SARA E
+0E41		THAI CHARACTER SARA AE
+0E42		THAI CHARACTER SARA O
+0E43		THAI CHARACTER SARA AI MAIMUAN
+0E44		THAI CHARACTER SARA AI MAIMALAI
+0E45		THAI CHARACTER LAKKHANGYAO
+0E46		THAI CHARACTER MAIYAMOK
+0E47		THAI CHARACTER MAITAIKHU
+0E48		THAI CHARACTER MAI EK
+0E49		THAI CHARACTER MAI THO
+0E4A		THAI CHARACTER MAI TRI
+0E4B		THAI CHARACTER MAI CHATTAWA
+0E4C		THAI CHARACTER THANTHAKHAT
+0E4D		THAI CHARACTER NIKHAHIT
+0E4E		THAI CHARACTER YAMAKKAN
+0E4F		THAI CHARACTER FONGMAN
+0E50		THAI DIGIT ZERO
+0E51		THAI DIGIT ONE
+0E52		THAI DIGIT TWO
+0E53		THAI DIGIT THREE
+0E54		THAI DIGIT FOUR
+0E55		THAI DIGIT FIVE
+0E56		THAI DIGIT SIX
+0E57		THAI DIGIT SEVEN
+0E58		THAI DIGIT EIGHT
+0E59		THAI DIGIT NINE
+0E5A		THAI CHARACTER ANGKHANKHU
+0E5B		THAI CHARACTER KHOMUT
+0E81		LAO LETTER KO
+0E82		LAO LETTER KHO SUNG
+0E84		LAO LETTER KHO TAM
+0E87		LAO LETTER NGO
+0E88		LAO LETTER CO
+0E8A		LAO LETTER SO TAM
+0E8D		LAO LETTER NYO
+0E94		LAO LETTER DO
+0E95		LAO LETTER TO
+0E96		LAO LETTER THO SUNG
+0E97		LAO LETTER THO TAM
+0E99		LAO LETTER NO
+0E9A		LAO LETTER BO
+0E9B		LAO LETTER PO
+0E9C		LAO LETTER PHO SUNG
+0E9D		LAO LETTER FO TAM
+0E9E		LAO LETTER PHO TAM
+0E9F		LAO LETTER FO SUNG
+0EA1		LAO LETTER MO
+0EA2		LAO LETTER YO
+0EA3		LAO LETTER LO LING
+0EA5		LAO LETTER LO LOOT
+0EA7		LAO LETTER WO
+0EAA		LAO LETTER SO SUNG
+0EAB		LAO LETTER HO SUNG
+0EAD		LAO LETTER O
+0EAE		LAO LETTER HO TAM
+0EAF		LAO ELLIPSIS
+0EB0		LAO VOWEL SIGN A
+0EB1		LAO VOWEL SIGN MAI KAN
+0EB2		LAO VOWEL SIGN AA
+0EB3		LAO VOWEL SIGN AM
+0EB4		LAO VOWEL SIGN I
+0EB5		LAO VOWEL SIGN II
+0EB6		LAO VOWEL SIGN Y
+0EB7		LAO VOWEL SIGN YY
+0EB8		LAO VOWEL SIGN U
+0EB9		LAO VOWEL SIGN UU
+0EBB		LAO VOWEL SIGN MAI KON
+0EBC		LAO SEMIVOWEL SIGN LO
+0EBD		LAO SEMIVOWEL SIGN NYO
+0EC0		LAO VOWEL SIGN E
+0EC1		LAO VOWEL SIGN EI
+0EC2		LAO VOWEL SIGN O
+0EC3		LAO VOWEL SIGN AY
+0EC4		LAO VOWEL SIGN AI
+0EC6		LAO KO LA
+0EC8		LAO TONE MAI EK
+0EC9		LAO TONE MAI THO
+0ECA		LAO TONE MAI TI
+0ECB		LAO TONE MAI CATAWA
+0ECC		LAO CANCELLATION MARK
+0ECD		LAO NIGGAHITA
+0ED0		LAO DIGIT ZERO
+0ED1		LAO DIGIT ONE
+0ED2		LAO DIGIT TWO
+0ED3		LAO DIGIT THREE
+0ED4		LAO DIGIT FOUR
+0ED5		LAO DIGIT FIVE
+0ED6		LAO DIGIT SIX
+0ED7		LAO DIGIT SEVEN
+0ED8		LAO DIGIT EIGHT
+0ED9		LAO DIGIT NINE
+0EDC		LAO HO NO
+0EDD		LAO HO MO
+0F00		TIBETAN SYLLABLE OM
+0F01		TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02		TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03		TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04		TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05		TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06		TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07		TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08		TIBETAN MARK SBRUL SHAD
+0F09		TIBETAN MARK BSKUR YIG MGO
+0F0A		TIBETAN MARK BKA- SHOG YIG MGO
+0F0B		TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C		TIBETAN MARK DELIMITER TSHEG BSTAR
+0F0D		TIBETAN MARK SHAD
+0F0E		TIBETAN MARK NYIS SHAD
+0F0F		TIBETAN MARK TSHEG SHAD
+0F10		TIBETAN MARK NYIS TSHEG SHAD
+0F11		TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12		TIBETAN MARK RGYA GRAM SHAD
+0F13		TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14		TIBETAN MARK GTER TSHEG
+0F15		TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16		TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17		TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18		TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19		TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A		TIBETAN SIGN RDEL DKAR GCIG
+0F1B		TIBETAN SIGN RDEL DKAR GNYIS
+0F1C		TIBETAN SIGN RDEL DKAR GSUM
+0F1D		TIBETAN SIGN RDEL NAG GCIG
+0F1E		TIBETAN SIGN RDEL NAG GNYIS
+0F1F		TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20		TIBETAN DIGIT ZERO
+0F21		TIBETAN DIGIT ONE
+0F22		TIBETAN DIGIT TWO
+0F23		TIBETAN DIGIT THREE
+0F24		TIBETAN DIGIT FOUR
+0F25		TIBETAN DIGIT FIVE
+0F26		TIBETAN DIGIT SIX
+0F27		TIBETAN DIGIT SEVEN
+0F28		TIBETAN DIGIT EIGHT
+0F29		TIBETAN DIGIT NINE
+0F2A		TIBETAN DIGIT HALF ONE
+0F2B		TIBETAN DIGIT HALF TWO
+0F2C		TIBETAN DIGIT HALF THREE
+0F2D		TIBETAN DIGIT HALF FOUR
+0F2E		TIBETAN DIGIT HALF FIVE
+0F2F		TIBETAN DIGIT HALF SIX
+0F30		TIBETAN DIGIT HALF SEVEN
+0F31		TIBETAN DIGIT HALF EIGHT
+0F32		TIBETAN DIGIT HALF NINE
+0F33		TIBETAN DIGIT HALF ZERO
+0F34		TIBETAN MARK BSDUS RTAGS
+0F35		TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36		TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37		TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38		TIBETAN MARK CHE MGO
+0F39		TIBETAN MARK TSA -PHRU
+0F3A		TIBETAN MARK GUG RTAGS GYON
+0F3B		TIBETAN MARK GUG RTAGS GYAS
+0F3C		TIBETAN MARK ANG KHANG GYON
+0F3D		TIBETAN MARK ANG KHANG GYAS
+0F3E		TIBETAN SIGN YAR TSHES
+0F3F		TIBETAN SIGN MAR TSHES
+0F40		TIBETAN LETTER KA
+0F41		TIBETAN LETTER KHA
+0F42		TIBETAN LETTER GA
+0F43		TIBETAN LETTER GHA
+0F44		TIBETAN LETTER NGA
+0F45		TIBETAN LETTER CA
+0F46		TIBETAN LETTER CHA
+0F47		TIBETAN LETTER JA
+0F49		TIBETAN LETTER NYA
+0F4A		TIBETAN LETTER TTA
+0F4B		TIBETAN LETTER TTHA
+0F4C		TIBETAN LETTER DDA
+0F4D		TIBETAN LETTER DDHA
+0F4E		TIBETAN LETTER NNA
+0F4F		TIBETAN LETTER TA
+0F50		TIBETAN LETTER THA
+0F51		TIBETAN LETTER DA
+0F52		TIBETAN LETTER DHA
+0F53		TIBETAN LETTER NA
+0F54		TIBETAN LETTER PA
+0F55		TIBETAN LETTER PHA
+0F56		TIBETAN LETTER BA
+0F57		TIBETAN LETTER BHA
+0F58		TIBETAN LETTER MA
+0F59		TIBETAN LETTER TSA
+0F5A		TIBETAN LETTER TSHA
+0F5B		TIBETAN LETTER DZA
+0F5C		TIBETAN LETTER DZHA
+0F5D		TIBETAN LETTER WA
+0F5E		TIBETAN LETTER ZHA
+0F5F		TIBETAN LETTER ZA
+0F60		TIBETAN LETTER -A
+0F61		TIBETAN LETTER YA
+0F62		TIBETAN LETTER RA
+0F63		TIBETAN LETTER LA
+0F64		TIBETAN LETTER SHA
+0F65		TIBETAN LETTER SSA
+0F66		TIBETAN LETTER SA
+0F67		TIBETAN LETTER HA
+0F68		TIBETAN LETTER A
+0F69		TIBETAN LETTER KSSA
+0F6A		TIBETAN LETTER FIXED-FORM RA
+0F71		TIBETAN VOWEL SIGN AA
+0F72		TIBETAN VOWEL SIGN I
+0F73		TIBETAN VOWEL SIGN II
+0F74		TIBETAN VOWEL SIGN U
+0F75		TIBETAN VOWEL SIGN UU
+0F76		TIBETAN VOWEL SIGN VOCALIC R
+0F77		TIBETAN VOWEL SIGN VOCALIC RR
+0F78		TIBETAN VOWEL SIGN VOCALIC L
+0F79		TIBETAN VOWEL SIGN VOCALIC LL
+0F7A		TIBETAN VOWEL SIGN E
+0F7B		TIBETAN VOWEL SIGN EE
+0F7C		TIBETAN VOWEL SIGN O
+0F7D		TIBETAN VOWEL SIGN OO
+0F7E		TIBETAN SIGN RJES SU NGA RO
+0F7F		TIBETAN SIGN RNAM BCAD
+0F80		TIBETAN VOWEL SIGN REVERSED I
+0F81		TIBETAN VOWEL SIGN REVERSED II
+0F82		TIBETAN SIGN NYI ZLA NAA DA
+0F83		TIBETAN SIGN SNA LDAN
+0F84		TIBETAN MARK HALANTA
+0F85		TIBETAN MARK PALUTA
+0F86		TIBETAN SIGN LCI RTAGS
+0F87		TIBETAN SIGN YANG RTAGS
+0F88		TIBETAN SIGN LCE TSA CAN
+0F89		TIBETAN SIGN MCHU CAN
+0F8A		TIBETAN SIGN GRU CAN RGYINGS
+0F8B		TIBETAN SIGN GRU MED RGYINGS
+0F90		TIBETAN SUBJOINED LETTER KA
+0F91		TIBETAN SUBJOINED LETTER KHA
+0F92		TIBETAN SUBJOINED LETTER GA
+0F93		TIBETAN SUBJOINED LETTER GHA
+0F94		TIBETAN SUBJOINED LETTER NGA
+0F95		TIBETAN SUBJOINED LETTER CA
+0F96		TIBETAN SUBJOINED LETTER CHA
+0F97		TIBETAN SUBJOINED LETTER JA
+0F99		TIBETAN SUBJOINED LETTER NYA
+0F9A		TIBETAN SUBJOINED LETTER TTA
+0F9B		TIBETAN SUBJOINED LETTER TTHA
+0F9C		TIBETAN SUBJOINED LETTER DDA
+0F9D		TIBETAN SUBJOINED LETTER DDHA
+0F9E		TIBETAN SUBJOINED LETTER NNA
+0F9F		TIBETAN SUBJOINED LETTER TA
+0FA0		TIBETAN SUBJOINED LETTER THA
+0FA1		TIBETAN SUBJOINED LETTER DA
+0FA2		TIBETAN SUBJOINED LETTER DHA
+0FA3		TIBETAN SUBJOINED LETTER NA
+0FA4		TIBETAN SUBJOINED LETTER PA
+0FA5		TIBETAN SUBJOINED LETTER PHA
+0FA6		TIBETAN SUBJOINED LETTER BA
+0FA7		TIBETAN SUBJOINED LETTER BHA
+0FA8		TIBETAN SUBJOINED LETTER MA
+0FA9		TIBETAN SUBJOINED LETTER TSA
+0FAA		TIBETAN SUBJOINED LETTER TSHA
+0FAB		TIBETAN SUBJOINED LETTER DZA
+0FAC		TIBETAN SUBJOINED LETTER DZHA
+0FAD		TIBETAN SUBJOINED LETTER WA
+0FAE		TIBETAN SUBJOINED LETTER ZHA
+0FAF		TIBETAN SUBJOINED LETTER ZA
+0FB0		TIBETAN SUBJOINED LETTER -A
+0FB1		TIBETAN SUBJOINED LETTER YA
+0FB2		TIBETAN SUBJOINED LETTER RA
+0FB3		TIBETAN SUBJOINED LETTER LA
+0FB4		TIBETAN SUBJOINED LETTER SHA
+0FB5		TIBETAN SUBJOINED LETTER SSA
+0FB6		TIBETAN SUBJOINED LETTER SA
+0FB7		TIBETAN SUBJOINED LETTER HA
+0FB8		TIBETAN SUBJOINED LETTER A
+0FB9		TIBETAN SUBJOINED LETTER KSSA
+0FBA		TIBETAN SUBJOINED LETTER FIXED-FORM WA
+0FBB		TIBETAN SUBJOINED LETTER FIXED-FORM YA
+0FBC		TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE		TIBETAN KU RU KHA
+0FBF		TIBETAN KU RU KHA BZHI MIG CAN
+0FC0		TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1		TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2		TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3		TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4		TIBETAN SYMBOL DRIL BU
+0FC5		TIBETAN SYMBOL RDO RJE
+0FC6		TIBETAN SYMBOL PADMA GDAN
+0FC7		TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8		TIBETAN SYMBOL PHUR PA
+0FC9		TIBETAN SYMBOL NOR BU
+0FCA		TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB		TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC		TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCF		TIBETAN SIGN RDEL NAG GSUM
+0FD0		TIBETAN MARK BSKA- SHOG GI MGO RGYAN
+0FD1		TIBETAN MARK MNYAM YIG GI MGO RGYAN
+1000		MYANMAR LETTER KA
+1001		MYANMAR LETTER KHA
+1002		MYANMAR LETTER GA
+1003		MYANMAR LETTER GHA
+1004		MYANMAR LETTER NGA
+1005		MYANMAR LETTER CA
+1006		MYANMAR LETTER CHA
+1007		MYANMAR LETTER JA
+1008		MYANMAR LETTER JHA
+1009		MYANMAR LETTER NYA
+100A		MYANMAR LETTER NNYA
+100B		MYANMAR LETTER TTA
+100C		MYANMAR LETTER TTHA
+100D		MYANMAR LETTER DDA
+100E		MYANMAR LETTER DDHA
+100F		MYANMAR LETTER NNA
+1010		MYANMAR LETTER TA
+1011		MYANMAR LETTER THA
+1012		MYANMAR LETTER DA
+1013		MYANMAR LETTER DHA
+1014		MYANMAR LETTER NA
+1015		MYANMAR LETTER PA
+1016		MYANMAR LETTER PHA
+1017		MYANMAR LETTER BA
+1018		MYANMAR LETTER BHA
+1019		MYANMAR LETTER MA
+101A		MYANMAR LETTER YA
+101B		MYANMAR LETTER RA
+101C		MYANMAR LETTER LA
+101D		MYANMAR LETTER WA
+101E		MYANMAR LETTER SA
+101F		MYANMAR LETTER HA
+1020		MYANMAR LETTER LLA
+1021		MYANMAR LETTER A
+1023		MYANMAR LETTER I
+1024		MYANMAR LETTER II
+1025		MYANMAR LETTER U
+1026		MYANMAR LETTER UU
+1027		MYANMAR LETTER E
+1029		MYANMAR LETTER O
+102A		MYANMAR LETTER AU
+102C		MYANMAR VOWEL SIGN AA
+102D		MYANMAR VOWEL SIGN I
+102E		MYANMAR VOWEL SIGN II
+102F		MYANMAR VOWEL SIGN U
+1030		MYANMAR VOWEL SIGN UU
+1031		MYANMAR VOWEL SIGN E
+1032		MYANMAR VOWEL SIGN AI
+1036		MYANMAR SIGN ANUSVARA
+1037		MYANMAR SIGN DOT BELOW
+1038		MYANMAR SIGN VISARGA
+1039		MYANMAR SIGN VIRAMA
+1040		MYANMAR DIGIT ZERO
+1041		MYANMAR DIGIT ONE
+1042		MYANMAR DIGIT TWO
+1043		MYANMAR DIGIT THREE
+1044		MYANMAR DIGIT FOUR
+1045		MYANMAR DIGIT FIVE
+1046		MYANMAR DIGIT SIX
+1047		MYANMAR DIGIT SEVEN
+1048		MYANMAR DIGIT EIGHT
+1049		MYANMAR DIGIT NINE
+104A		MYANMAR SIGN LITTLE SECTION
+104B		MYANMAR SIGN SECTION
+104C		MYANMAR SYMBOL LOCATIVE
+104D		MYANMAR SYMBOL COMPLETED
+104E		MYANMAR SYMBOL AFOREMENTIONED
+104F		MYANMAR SYMBOL GENITIVE
+1050		MYANMAR LETTER SHA
+1051		MYANMAR LETTER SSA
+1052		MYANMAR LETTER VOCALIC R
+1053		MYANMAR LETTER VOCALIC RR
+1054		MYANMAR LETTER VOCALIC L
+1055		MYANMAR LETTER VOCALIC LL
+1056		MYANMAR VOWEL SIGN VOCALIC R
+1057		MYANMAR VOWEL SIGN VOCALIC RR
+1058		MYANMAR VOWEL SIGN VOCALIC L
+1059		MYANMAR VOWEL SIGN VOCALIC LL
+10A0		GEORGIAN CAPITAL LETTER AN
+10A1		GEORGIAN CAPITAL LETTER BAN
+10A2		GEORGIAN CAPITAL LETTER GAN
+10A3		GEORGIAN CAPITAL LETTER DON
+10A4		GEORGIAN CAPITAL LETTER EN
+10A5		GEORGIAN CAPITAL LETTER VIN
+10A6		GEORGIAN CAPITAL LETTER ZEN
+10A7		GEORGIAN CAPITAL LETTER TAN
+10A8		GEORGIAN CAPITAL LETTER IN
+10A9		GEORGIAN CAPITAL LETTER KAN
+10AA		GEORGIAN CAPITAL LETTER LAS
+10AB		GEORGIAN CAPITAL LETTER MAN
+10AC		GEORGIAN CAPITAL LETTER NAR
+10AD		GEORGIAN CAPITAL LETTER ON
+10AE		GEORGIAN CAPITAL LETTER PAR
+10AF		GEORGIAN CAPITAL LETTER ZHAR
+10B0		GEORGIAN CAPITAL LETTER RAE
+10B1		GEORGIAN CAPITAL LETTER SAN
+10B2		GEORGIAN CAPITAL LETTER TAR
+10B3		GEORGIAN CAPITAL LETTER UN
+10B4		GEORGIAN CAPITAL LETTER PHAR
+10B5		GEORGIAN CAPITAL LETTER KHAR
+10B6		GEORGIAN CAPITAL LETTER GHAN
+10B7		GEORGIAN CAPITAL LETTER QAR
+10B8		GEORGIAN CAPITAL LETTER SHIN
+10B9		GEORGIAN CAPITAL LETTER CHIN
+10BA		GEORGIAN CAPITAL LETTER CAN
+10BB		GEORGIAN CAPITAL LETTER JIL
+10BC		GEORGIAN CAPITAL LETTER CIL
+10BD		GEORGIAN CAPITAL LETTER CHAR
+10BE		GEORGIAN CAPITAL LETTER XAN
+10BF		GEORGIAN CAPITAL LETTER JHAN
+10C0		GEORGIAN CAPITAL LETTER HAE
+10C1		GEORGIAN CAPITAL LETTER HE
+10C2		GEORGIAN CAPITAL LETTER HIE
+10C3		GEORGIAN CAPITAL LETTER WE
+10C4		GEORGIAN CAPITAL LETTER HAR
+10C5		GEORGIAN CAPITAL LETTER HOE
+10D0		GEORGIAN LETTER AN
+10D1		GEORGIAN LETTER BAN
+10D2		GEORGIAN LETTER GAN
+10D3		GEORGIAN LETTER DON
+10D4		GEORGIAN LETTER EN
+10D5		GEORGIAN LETTER VIN
+10D6		GEORGIAN LETTER ZEN
+10D7		GEORGIAN LETTER TAN
+10D8		GEORGIAN LETTER IN
+10D9		GEORGIAN LETTER KAN
+10DA		GEORGIAN LETTER LAS
+10DB		GEORGIAN LETTER MAN
+10DC		GEORGIAN LETTER NAR
+10DD		GEORGIAN LETTER ON
+10DE		GEORGIAN LETTER PAR
+10DF		GEORGIAN LETTER ZHAR
+10E0		GEORGIAN LETTER RAE
+10E1		GEORGIAN LETTER SAN
+10E2		GEORGIAN LETTER TAR
+10E3		GEORGIAN LETTER UN
+10E4		GEORGIAN LETTER PHAR
+10E5		GEORGIAN LETTER KHAR
+10E6		GEORGIAN LETTER GHAN
+10E7		GEORGIAN LETTER QAR
+10E8		GEORGIAN LETTER SHIN
+10E9		GEORGIAN LETTER CHIN
+10EA		GEORGIAN LETTER CAN
+10EB		GEORGIAN LETTER JIL
+10EC		GEORGIAN LETTER CIL
+10ED		GEORGIAN LETTER CHAR
+10EE		GEORGIAN LETTER XAN
+10EF		GEORGIAN LETTER JHAN
+10F0		GEORGIAN LETTER HAE
+10F1		GEORGIAN LETTER HE
+10F2		GEORGIAN LETTER HIE
+10F3		GEORGIAN LETTER WE
+10F4		GEORGIAN LETTER HAR
+10F5		GEORGIAN LETTER HOE
+10F6		GEORGIAN LETTER FI
+10F7		GEORGIAN LETTER YN
+10F8		GEORGIAN LETTER ELIFI
+10F9		GEORGIAN LETTER TURNED GAN
+10FA		GEORGIAN LETTER AIN
+10FB		GEORGIAN PARAGRAPH SEPARATOR
+10FC		MODIFIER LETTER GEORGIAN NAR
+1100		HANGUL CHOSEONG KIYEOK
+1101		HANGUL CHOSEONG SSANGKIYEOK
+1102		HANGUL CHOSEONG NIEUN
+1103		HANGUL CHOSEONG TIKEUT
+1104		HANGUL CHOSEONG SSANGTIKEUT
+1105		HANGUL CHOSEONG RIEUL
+1106		HANGUL CHOSEONG MIEUM
+1107		HANGUL CHOSEONG PIEUP
+1108		HANGUL CHOSEONG SSANGPIEUP
+1109		HANGUL CHOSEONG SIOS
+110A		HANGUL CHOSEONG SSANGSIOS
+110B		HANGUL CHOSEONG IEUNG
+110C		HANGUL CHOSEONG CIEUC
+110D		HANGUL CHOSEONG SSANGCIEUC
+110E		HANGUL CHOSEONG CHIEUCH
+110F		HANGUL CHOSEONG KHIEUKH
+1110		HANGUL CHOSEONG THIEUTH
+1111		HANGUL CHOSEONG PHIEUPH
+1112		HANGUL CHOSEONG HIEUH
+1113		HANGUL CHOSEONG NIEUN-KIYEOK
+1114		HANGUL CHOSEONG SSANGNIEUN
+1115		HANGUL CHOSEONG NIEUN-TIKEUT
+1116		HANGUL CHOSEONG NIEUN-PIEUP
+1117		HANGUL CHOSEONG TIKEUT-KIYEOK
+1118		HANGUL CHOSEONG RIEUL-NIEUN
+1119		HANGUL CHOSEONG SSANGRIEUL
+111A		HANGUL CHOSEONG RIEUL-HIEUH
+111B		HANGUL CHOSEONG KAPYEOUNRIEUL
+111C		HANGUL CHOSEONG MIEUM-PIEUP
+111D		HANGUL CHOSEONG KAPYEOUNMIEUM
+111E		HANGUL CHOSEONG PIEUP-KIYEOK
+111F		HANGUL CHOSEONG PIEUP-NIEUN
+1120		HANGUL CHOSEONG PIEUP-TIKEUT
+1121		HANGUL CHOSEONG PIEUP-SIOS
+1122		HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123		HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124		HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125		HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126		HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127		HANGUL CHOSEONG PIEUP-CIEUC
+1128		HANGUL CHOSEONG PIEUP-CHIEUCH
+1129		HANGUL CHOSEONG PIEUP-THIEUTH
+112A		HANGUL CHOSEONG PIEUP-PHIEUPH
+112B		HANGUL CHOSEONG KAPYEOUNPIEUP
+112C		HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D		HANGUL CHOSEONG SIOS-KIYEOK
+112E		HANGUL CHOSEONG SIOS-NIEUN
+112F		HANGUL CHOSEONG SIOS-TIKEUT
+1130		HANGUL CHOSEONG SIOS-RIEUL
+1131		HANGUL CHOSEONG SIOS-MIEUM
+1132		HANGUL CHOSEONG SIOS-PIEUP
+1133		HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134		HANGUL CHOSEONG SIOS-SSANGSIOS
+1135		HANGUL CHOSEONG SIOS-IEUNG
+1136		HANGUL CHOSEONG SIOS-CIEUC
+1137		HANGUL CHOSEONG SIOS-CHIEUCH
+1138		HANGUL CHOSEONG SIOS-KHIEUKH
+1139		HANGUL CHOSEONG SIOS-THIEUTH
+113A		HANGUL CHOSEONG SIOS-PHIEUPH
+113B		HANGUL CHOSEONG SIOS-HIEUH
+113C		HANGUL CHOSEONG CHITUEUMSIOS
+113D		HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E		HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F		HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140		HANGUL CHOSEONG PANSIOS
+1141		HANGUL CHOSEONG IEUNG-KIYEOK
+1142		HANGUL CHOSEONG IEUNG-TIKEUT
+1143		HANGUL CHOSEONG IEUNG-MIEUM
+1144		HANGUL CHOSEONG IEUNG-PIEUP
+1145		HANGUL CHOSEONG IEUNG-SIOS
+1146		HANGUL CHOSEONG IEUNG-PANSIOS
+1147		HANGUL CHOSEONG SSANGIEUNG
+1148		HANGUL CHOSEONG IEUNG-CIEUC
+1149		HANGUL CHOSEONG IEUNG-CHIEUCH
+114A		HANGUL CHOSEONG IEUNG-THIEUTH
+114B		HANGUL CHOSEONG IEUNG-PHIEUPH
+114C		HANGUL CHOSEONG YESIEUNG
+114D		HANGUL CHOSEONG CIEUC-IEUNG
+114E		HANGUL CHOSEONG CHITUEUMCIEUC
+114F		HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150		HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151		HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152		HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153		HANGUL CHOSEONG CHIEUCH-HIEUH
+1154		HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155		HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156		HANGUL CHOSEONG PHIEUPH-PIEUP
+1157		HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158		HANGUL CHOSEONG SSANGHIEUH
+1159		HANGUL CHOSEONG YEORINHIEUH
+115F		HANGUL CHOSEONG FILLER
+1160		HANGUL JUNGSEONG FILLER
+1161		HANGUL JUNGSEONG A
+1162		HANGUL JUNGSEONG AE
+1163		HANGUL JUNGSEONG YA
+1164		HANGUL JUNGSEONG YAE
+1165		HANGUL JUNGSEONG EO
+1166		HANGUL JUNGSEONG E
+1167		HANGUL JUNGSEONG YEO
+1168		HANGUL JUNGSEONG YE
+1169		HANGUL JUNGSEONG O
+116A		HANGUL JUNGSEONG WA
+116B		HANGUL JUNGSEONG WAE
+116C		HANGUL JUNGSEONG OE
+116D		HANGUL JUNGSEONG YO
+116E		HANGUL JUNGSEONG U
+116F		HANGUL JUNGSEONG WEO
+1170		HANGUL JUNGSEONG WE
+1171		HANGUL JUNGSEONG WI
+1172		HANGUL JUNGSEONG YU
+1173		HANGUL JUNGSEONG EU
+1174		HANGUL JUNGSEONG YI
+1175		HANGUL JUNGSEONG I
+1176		HANGUL JUNGSEONG A-O
+1177		HANGUL JUNGSEONG A-U
+1178		HANGUL JUNGSEONG YA-O
+1179		HANGUL JUNGSEONG YA-YO
+117A		HANGUL JUNGSEONG EO-O
+117B		HANGUL JUNGSEONG EO-U
+117C		HANGUL JUNGSEONG EO-EU
+117D		HANGUL JUNGSEONG YEO-O
+117E		HANGUL JUNGSEONG YEO-U
+117F		HANGUL JUNGSEONG O-EO
+1180		HANGUL JUNGSEONG O-E
+1181		HANGUL JUNGSEONG O-YE
+1182		HANGUL JUNGSEONG O-O
+1183		HANGUL JUNGSEONG O-U
+1184		HANGUL JUNGSEONG YO-YA
+1185		HANGUL JUNGSEONG YO-YAE
+1186		HANGUL JUNGSEONG YO-YEO
+1187		HANGUL JUNGSEONG YO-O
+1188		HANGUL JUNGSEONG YO-I
+1189		HANGUL JUNGSEONG U-A
+118A		HANGUL JUNGSEONG U-AE
+118B		HANGUL JUNGSEONG U-EO-EU
+118C		HANGUL JUNGSEONG U-YE
+118D		HANGUL JUNGSEONG U-U
+118E		HANGUL JUNGSEONG YU-A
+118F		HANGUL JUNGSEONG YU-EO
+1190		HANGUL JUNGSEONG YU-E
+1191		HANGUL JUNGSEONG YU-YEO
+1192		HANGUL JUNGSEONG YU-YE
+1193		HANGUL JUNGSEONG YU-U
+1194		HANGUL JUNGSEONG YU-I
+1195		HANGUL JUNGSEONG EU-U
+1196		HANGUL JUNGSEONG EU-EU
+1197		HANGUL JUNGSEONG YI-U
+1198		HANGUL JUNGSEONG I-A
+1199		HANGUL JUNGSEONG I-YA
+119A		HANGUL JUNGSEONG I-O
+119B		HANGUL JUNGSEONG I-U
+119C		HANGUL JUNGSEONG I-EU
+119D		HANGUL JUNGSEONG I-ARAEA
+119E		HANGUL JUNGSEONG ARAEA
+119F		HANGUL JUNGSEONG ARAEA-EO
+11A0		HANGUL JUNGSEONG ARAEA-U
+11A1		HANGUL JUNGSEONG ARAEA-I
+11A2		HANGUL JUNGSEONG SSANGARAEA
+11A8		HANGUL JONGSEONG KIYEOK
+11A9		HANGUL JONGSEONG SSANGKIYEOK
+11AA		HANGUL JONGSEONG KIYEOK-SIOS
+11AB		HANGUL JONGSEONG NIEUN
+11AC		HANGUL JONGSEONG NIEUN-CIEUC
+11AD		HANGUL JONGSEONG NIEUN-HIEUH
+11AE		HANGUL JONGSEONG TIKEUT
+11AF		HANGUL JONGSEONG RIEUL
+11B0		HANGUL JONGSEONG RIEUL-KIYEOK
+11B1		HANGUL JONGSEONG RIEUL-MIEUM
+11B2		HANGUL JONGSEONG RIEUL-PIEUP
+11B3		HANGUL JONGSEONG RIEUL-SIOS
+11B4		HANGUL JONGSEONG RIEUL-THIEUTH
+11B5		HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6		HANGUL JONGSEONG RIEUL-HIEUH
+11B7		HANGUL JONGSEONG MIEUM
+11B8		HANGUL JONGSEONG PIEUP
+11B9		HANGUL JONGSEONG PIEUP-SIOS
+11BA		HANGUL JONGSEONG SIOS
+11BB		HANGUL JONGSEONG SSANGSIOS
+11BC		HANGUL JONGSEONG IEUNG
+11BD		HANGUL JONGSEONG CIEUC
+11BE		HANGUL JONGSEONG CHIEUCH
+11BF		HANGUL JONGSEONG KHIEUKH
+11C0		HANGUL JONGSEONG THIEUTH
+11C1		HANGUL JONGSEONG PHIEUPH
+11C2		HANGUL JONGSEONG HIEUH
+11C3		HANGUL JONGSEONG KIYEOK-RIEUL
+11C4		HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5		HANGUL JONGSEONG NIEUN-KIYEOK
+11C6		HANGUL JONGSEONG NIEUN-TIKEUT
+11C7		HANGUL JONGSEONG NIEUN-SIOS
+11C8		HANGUL JONGSEONG NIEUN-PANSIOS
+11C9		HANGUL JONGSEONG NIEUN-THIEUTH
+11CA		HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB		HANGUL JONGSEONG TIKEUT-RIEUL
+11CC		HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD		HANGUL JONGSEONG RIEUL-NIEUN
+11CE		HANGUL JONGSEONG RIEUL-TIKEUT
+11CF		HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0		HANGUL JONGSEONG SSANGRIEUL
+11D1		HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2		HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3		HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4		HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5		HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6		HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7		HANGUL JONGSEONG RIEUL-PANSIOS
+11D8		HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9		HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA		HANGUL JONGSEONG MIEUM-KIYEOK
+11DB		HANGUL JONGSEONG MIEUM-RIEUL
+11DC		HANGUL JONGSEONG MIEUM-PIEUP
+11DD		HANGUL JONGSEONG MIEUM-SIOS
+11DE		HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF		HANGUL JONGSEONG MIEUM-PANSIOS
+11E0		HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1		HANGUL JONGSEONG MIEUM-HIEUH
+11E2		HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3		HANGUL JONGSEONG PIEUP-RIEUL
+11E4		HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5		HANGUL JONGSEONG PIEUP-HIEUH
+11E6		HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7		HANGUL JONGSEONG SIOS-KIYEOK
+11E8		HANGUL JONGSEONG SIOS-TIKEUT
+11E9		HANGUL JONGSEONG SIOS-RIEUL
+11EA		HANGUL JONGSEONG SIOS-PIEUP
+11EB		HANGUL JONGSEONG PANSIOS
+11EC		HANGUL JONGSEONG IEUNG-KIYEOK
+11ED		HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE		HANGUL JONGSEONG SSANGIEUNG
+11EF		HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0		HANGUL JONGSEONG YESIEUNG
+11F1		HANGUL JONGSEONG YESIEUNG-SIOS
+11F2		HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3		HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4		HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5		HANGUL JONGSEONG HIEUH-NIEUN
+11F6		HANGUL JONGSEONG HIEUH-RIEUL
+11F7		HANGUL JONGSEONG HIEUH-MIEUM
+11F8		HANGUL JONGSEONG HIEUH-PIEUP
+11F9		HANGUL JONGSEONG YEORINHIEUH
+1200		ETHIOPIC SYLLABLE HA
+1201		ETHIOPIC SYLLABLE HU
+1202		ETHIOPIC SYLLABLE HI
+1203		ETHIOPIC SYLLABLE HAA
+1204		ETHIOPIC SYLLABLE HEE
+1205		ETHIOPIC SYLLABLE HE
+1206		ETHIOPIC SYLLABLE HO
+1207		ETHIOPIC SYLLABLE HOA
+1208		ETHIOPIC SYLLABLE LA
+1209		ETHIOPIC SYLLABLE LU
+120A		ETHIOPIC SYLLABLE LI
+120B		ETHIOPIC SYLLABLE LAA
+120C		ETHIOPIC SYLLABLE LEE
+120D		ETHIOPIC SYLLABLE LE
+120E		ETHIOPIC SYLLABLE LO
+120F		ETHIOPIC SYLLABLE LWA
+1210		ETHIOPIC SYLLABLE HHA
+1211		ETHIOPIC SYLLABLE HHU
+1212		ETHIOPIC SYLLABLE HHI
+1213		ETHIOPIC SYLLABLE HHAA
+1214		ETHIOPIC SYLLABLE HHEE
+1215		ETHIOPIC SYLLABLE HHE
+1216		ETHIOPIC SYLLABLE HHO
+1217		ETHIOPIC SYLLABLE HHWA
+1218		ETHIOPIC SYLLABLE MA
+1219		ETHIOPIC SYLLABLE MU
+121A		ETHIOPIC SYLLABLE MI
+121B		ETHIOPIC SYLLABLE MAA
+121C		ETHIOPIC SYLLABLE MEE
+121D		ETHIOPIC SYLLABLE ME
+121E		ETHIOPIC SYLLABLE MO
+121F		ETHIOPIC SYLLABLE MWA
+1220		ETHIOPIC SYLLABLE SZA
+1221		ETHIOPIC SYLLABLE SZU
+1222		ETHIOPIC SYLLABLE SZI
+1223		ETHIOPIC SYLLABLE SZAA
+1224		ETHIOPIC SYLLABLE SZEE
+1225		ETHIOPIC SYLLABLE SZE
+1226		ETHIOPIC SYLLABLE SZO
+1227		ETHIOPIC SYLLABLE SZWA
+1228		ETHIOPIC SYLLABLE RA
+1229		ETHIOPIC SYLLABLE RU
+122A		ETHIOPIC SYLLABLE RI
+122B		ETHIOPIC SYLLABLE RAA
+122C		ETHIOPIC SYLLABLE REE
+122D		ETHIOPIC SYLLABLE RE
+122E		ETHIOPIC SYLLABLE RO
+122F		ETHIOPIC SYLLABLE RWA
+1230		ETHIOPIC SYLLABLE SA
+1231		ETHIOPIC SYLLABLE SU
+1232		ETHIOPIC SYLLABLE SI
+1233		ETHIOPIC SYLLABLE SAA
+1234		ETHIOPIC SYLLABLE SEE
+1235		ETHIOPIC SYLLABLE SE
+1236		ETHIOPIC SYLLABLE SO
+1237		ETHIOPIC SYLLABLE SWA
+1238		ETHIOPIC SYLLABLE SHA
+1239		ETHIOPIC SYLLABLE SHU
+123A		ETHIOPIC SYLLABLE SHI
+123B		ETHIOPIC SYLLABLE SHAA
+123C		ETHIOPIC SYLLABLE SHEE
+123D		ETHIOPIC SYLLABLE SHE
+123E		ETHIOPIC SYLLABLE SHO
+123F		ETHIOPIC SYLLABLE SHWA
+1240		ETHIOPIC SYLLABLE QA
+1241		ETHIOPIC SYLLABLE QU
+1242		ETHIOPIC SYLLABLE QI
+1243		ETHIOPIC SYLLABLE QAA
+1244		ETHIOPIC SYLLABLE QEE
+1245		ETHIOPIC SYLLABLE QE
+1246		ETHIOPIC SYLLABLE QO
+1247		ETHIOPIC SYLLABLE QOA
+1248		ETHIOPIC SYLLABLE QWA
+124A		ETHIOPIC SYLLABLE QWI
+124B		ETHIOPIC SYLLABLE QWAA
+124C		ETHIOPIC SYLLABLE QWEE
+124D		ETHIOPIC SYLLABLE QWE
+1250		ETHIOPIC SYLLABLE QHA
+1251		ETHIOPIC SYLLABLE QHU
+1252		ETHIOPIC SYLLABLE QHI
+1253		ETHIOPIC SYLLABLE QHAA
+1254		ETHIOPIC SYLLABLE QHEE
+1255		ETHIOPIC SYLLABLE QHE
+1256		ETHIOPIC SYLLABLE QHO
+1258		ETHIOPIC SYLLABLE QHWA
+125A		ETHIOPIC SYLLABLE QHWI
+125B		ETHIOPIC SYLLABLE QHWAA
+125C		ETHIOPIC SYLLABLE QHWEE
+125D		ETHIOPIC SYLLABLE QHWE
+1260		ETHIOPIC SYLLABLE BA
+1261		ETHIOPIC SYLLABLE BU
+1262		ETHIOPIC SYLLABLE BI
+1263		ETHIOPIC SYLLABLE BAA
+1264		ETHIOPIC SYLLABLE BEE
+1265		ETHIOPIC SYLLABLE BE
+1266		ETHIOPIC SYLLABLE BO
+1267		ETHIOPIC SYLLABLE BWA
+1268		ETHIOPIC SYLLABLE VA
+1269		ETHIOPIC SYLLABLE VU
+126A		ETHIOPIC SYLLABLE VI
+126B		ETHIOPIC SYLLABLE VAA
+126C		ETHIOPIC SYLLABLE VEE
+126D		ETHIOPIC SYLLABLE VE
+126E		ETHIOPIC SYLLABLE VO
+126F		ETHIOPIC SYLLABLE VWA
+1270		ETHIOPIC SYLLABLE TA
+1271		ETHIOPIC SYLLABLE TU
+1272		ETHIOPIC SYLLABLE TI
+1273		ETHIOPIC SYLLABLE TAA
+1274		ETHIOPIC SYLLABLE TEE
+1275		ETHIOPIC SYLLABLE TE
+1276		ETHIOPIC SYLLABLE TO
+1277		ETHIOPIC SYLLABLE TWA
+1278		ETHIOPIC SYLLABLE CA
+1279		ETHIOPIC SYLLABLE CU
+127A		ETHIOPIC SYLLABLE CI
+127B		ETHIOPIC SYLLABLE CAA
+127C		ETHIOPIC SYLLABLE CEE
+127D		ETHIOPIC SYLLABLE CE
+127E		ETHIOPIC SYLLABLE CO
+127F		ETHIOPIC SYLLABLE CWA
+1280		ETHIOPIC SYLLABLE XA
+1281		ETHIOPIC SYLLABLE XU
+1282		ETHIOPIC SYLLABLE XI
+1283		ETHIOPIC SYLLABLE XAA
+1284		ETHIOPIC SYLLABLE XEE
+1285		ETHIOPIC SYLLABLE XE
+1286		ETHIOPIC SYLLABLE XO
+1287		ETHIOPIC SYLLABLE XOA
+1288		ETHIOPIC SYLLABLE XWA
+128A		ETHIOPIC SYLLABLE XWI
+128B		ETHIOPIC SYLLABLE XWAA
+128C		ETHIOPIC SYLLABLE XWEE
+128D		ETHIOPIC SYLLABLE XWE
+1290		ETHIOPIC SYLLABLE NA
+1291		ETHIOPIC SYLLABLE NU
+1292		ETHIOPIC SYLLABLE NI
+1293		ETHIOPIC SYLLABLE NAA
+1294		ETHIOPIC SYLLABLE NEE
+1295		ETHIOPIC SYLLABLE NE
+1296		ETHIOPIC SYLLABLE NO
+1297		ETHIOPIC SYLLABLE NWA
+1298		ETHIOPIC SYLLABLE NYA
+1299		ETHIOPIC SYLLABLE NYU
+129A		ETHIOPIC SYLLABLE NYI
+129B		ETHIOPIC SYLLABLE NYAA
+129C		ETHIOPIC SYLLABLE NYEE
+129D		ETHIOPIC SYLLABLE NYE
+129E		ETHIOPIC SYLLABLE NYO
+129F		ETHIOPIC SYLLABLE NYWA
+12A0		ETHIOPIC SYLLABLE GLOTTAL A
+12A1		ETHIOPIC SYLLABLE GLOTTAL U
+12A2		ETHIOPIC SYLLABLE GLOTTAL I
+12A3		ETHIOPIC SYLLABLE GLOTTAL AA
+12A4		ETHIOPIC SYLLABLE GLOTTAL EE
+12A5		ETHIOPIC SYLLABLE GLOTTAL E
+12A6		ETHIOPIC SYLLABLE GLOTTAL O
+12A7		ETHIOPIC SYLLABLE GLOTTAL WA
+12A8		ETHIOPIC SYLLABLE KA
+12A9		ETHIOPIC SYLLABLE KU
+12AA		ETHIOPIC SYLLABLE KI
+12AB		ETHIOPIC SYLLABLE KAA
+12AC		ETHIOPIC SYLLABLE KEE
+12AD		ETHIOPIC SYLLABLE KE
+12AE		ETHIOPIC SYLLABLE KO
+12AF		ETHIOPIC SYLLABLE KOA
+12B0		ETHIOPIC SYLLABLE KWA
+12B2		ETHIOPIC SYLLABLE KWI
+12B3		ETHIOPIC SYLLABLE KWAA
+12B4		ETHIOPIC SYLLABLE KWEE
+12B5		ETHIOPIC SYLLABLE KWE
+12B8		ETHIOPIC SYLLABLE KXA
+12B9		ETHIOPIC SYLLABLE KXU
+12BA		ETHIOPIC SYLLABLE KXI
+12BB		ETHIOPIC SYLLABLE KXAA
+12BC		ETHIOPIC SYLLABLE KXEE
+12BD		ETHIOPIC SYLLABLE KXE
+12BE		ETHIOPIC SYLLABLE KXO
+12C0		ETHIOPIC SYLLABLE KXWA
+12C2		ETHIOPIC SYLLABLE KXWI
+12C3		ETHIOPIC SYLLABLE KXWAA
+12C4		ETHIOPIC SYLLABLE KXWEE
+12C5		ETHIOPIC SYLLABLE KXWE
+12C8		ETHIOPIC SYLLABLE WA
+12C9		ETHIOPIC SYLLABLE WU
+12CA		ETHIOPIC SYLLABLE WI
+12CB		ETHIOPIC SYLLABLE WAA
+12CC		ETHIOPIC SYLLABLE WEE
+12CD		ETHIOPIC SYLLABLE WE
+12CE		ETHIOPIC SYLLABLE WO
+12CF		ETHIOPIC SYLLABLE WOA
+12D0		ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1		ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2		ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3		ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4		ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5		ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6		ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8		ETHIOPIC SYLLABLE ZA
+12D9		ETHIOPIC SYLLABLE ZU
+12DA		ETHIOPIC SYLLABLE ZI
+12DB		ETHIOPIC SYLLABLE ZAA
+12DC		ETHIOPIC SYLLABLE ZEE
+12DD		ETHIOPIC SYLLABLE ZE
+12DE		ETHIOPIC SYLLABLE ZO
+12DF		ETHIOPIC SYLLABLE ZWA
+12E0		ETHIOPIC SYLLABLE ZHA
+12E1		ETHIOPIC SYLLABLE ZHU
+12E2		ETHIOPIC SYLLABLE ZHI
+12E3		ETHIOPIC SYLLABLE ZHAA
+12E4		ETHIOPIC SYLLABLE ZHEE
+12E5		ETHIOPIC SYLLABLE ZHE
+12E6		ETHIOPIC SYLLABLE ZHO
+12E7		ETHIOPIC SYLLABLE ZHWA
+12E8		ETHIOPIC SYLLABLE YA
+12E9		ETHIOPIC SYLLABLE YU
+12EA		ETHIOPIC SYLLABLE YI
+12EB		ETHIOPIC SYLLABLE YAA
+12EC		ETHIOPIC SYLLABLE YEE
+12ED		ETHIOPIC SYLLABLE YE
+12EE		ETHIOPIC SYLLABLE YO
+12EF		ETHIOPIC SYLLABLE YOA
+12F0		ETHIOPIC SYLLABLE DA
+12F1		ETHIOPIC SYLLABLE DU
+12F2		ETHIOPIC SYLLABLE DI
+12F3		ETHIOPIC SYLLABLE DAA
+12F4		ETHIOPIC SYLLABLE DEE
+12F5		ETHIOPIC SYLLABLE DE
+12F6		ETHIOPIC SYLLABLE DO
+12F7		ETHIOPIC SYLLABLE DWA
+12F8		ETHIOPIC SYLLABLE DDA
+12F9		ETHIOPIC SYLLABLE DDU
+12FA		ETHIOPIC SYLLABLE DDI
+12FB		ETHIOPIC SYLLABLE DDAA
+12FC		ETHIOPIC SYLLABLE DDEE
+12FD		ETHIOPIC SYLLABLE DDE
+12FE		ETHIOPIC SYLLABLE DDO
+12FF		ETHIOPIC SYLLABLE DDWA
+1300		ETHIOPIC SYLLABLE JA
+1301		ETHIOPIC SYLLABLE JU
+1302		ETHIOPIC SYLLABLE JI
+1303		ETHIOPIC SYLLABLE JAA
+1304		ETHIOPIC SYLLABLE JEE
+1305		ETHIOPIC SYLLABLE JE
+1306		ETHIOPIC SYLLABLE JO
+1307		ETHIOPIC SYLLABLE JWA
+1308		ETHIOPIC SYLLABLE GA
+1309		ETHIOPIC SYLLABLE GU
+130A		ETHIOPIC SYLLABLE GI
+130B		ETHIOPIC SYLLABLE GAA
+130C		ETHIOPIC SYLLABLE GEE
+130D		ETHIOPIC SYLLABLE GE
+130E		ETHIOPIC SYLLABLE GO
+130F		ETHIOPIC SYLLABLE GOA
+1310		ETHIOPIC SYLLABLE GWA
+1312		ETHIOPIC SYLLABLE GWI
+1313		ETHIOPIC SYLLABLE GWAA
+1314		ETHIOPIC SYLLABLE GWEE
+1315		ETHIOPIC SYLLABLE GWE
+1318		ETHIOPIC SYLLABLE GGA
+1319		ETHIOPIC SYLLABLE GGU
+131A		ETHIOPIC SYLLABLE GGI
+131B		ETHIOPIC SYLLABLE GGAA
+131C		ETHIOPIC SYLLABLE GGEE
+131D		ETHIOPIC SYLLABLE GGE
+131E		ETHIOPIC SYLLABLE GGO
+131F		ETHIOPIC SYLLABLE GGWAA
+1320		ETHIOPIC SYLLABLE THA
+1321		ETHIOPIC SYLLABLE THU
+1322		ETHIOPIC SYLLABLE THI
+1323		ETHIOPIC SYLLABLE THAA
+1324		ETHIOPIC SYLLABLE THEE
+1325		ETHIOPIC SYLLABLE THE
+1326		ETHIOPIC SYLLABLE THO
+1327		ETHIOPIC SYLLABLE THWA
+1328		ETHIOPIC SYLLABLE CHA
+1329		ETHIOPIC SYLLABLE CHU
+132A		ETHIOPIC SYLLABLE CHI
+132B		ETHIOPIC SYLLABLE CHAA
+132C		ETHIOPIC SYLLABLE CHEE
+132D		ETHIOPIC SYLLABLE CHE
+132E		ETHIOPIC SYLLABLE CHO
+132F		ETHIOPIC SYLLABLE CHWA
+1330		ETHIOPIC SYLLABLE PHA
+1331		ETHIOPIC SYLLABLE PHU
+1332		ETHIOPIC SYLLABLE PHI
+1333		ETHIOPIC SYLLABLE PHAA
+1334		ETHIOPIC SYLLABLE PHEE
+1335		ETHIOPIC SYLLABLE PHE
+1336		ETHIOPIC SYLLABLE PHO
+1337		ETHIOPIC SYLLABLE PHWA
+1338		ETHIOPIC SYLLABLE TSA
+1339		ETHIOPIC SYLLABLE TSU
+133A		ETHIOPIC SYLLABLE TSI
+133B		ETHIOPIC SYLLABLE TSAA
+133C		ETHIOPIC SYLLABLE TSEE
+133D		ETHIOPIC SYLLABLE TSE
+133E		ETHIOPIC SYLLABLE TSO
+133F		ETHIOPIC SYLLABLE TSWA
+1340		ETHIOPIC SYLLABLE TZA
+1341		ETHIOPIC SYLLABLE TZU
+1342		ETHIOPIC SYLLABLE TZI
+1343		ETHIOPIC SYLLABLE TZAA
+1344		ETHIOPIC SYLLABLE TZEE
+1345		ETHIOPIC SYLLABLE TZE
+1346		ETHIOPIC SYLLABLE TZO
+1347		ETHIOPIC SYLLABLE TZOA
+1348		ETHIOPIC SYLLABLE FA
+1349		ETHIOPIC SYLLABLE FU
+134A		ETHIOPIC SYLLABLE FI
+134B		ETHIOPIC SYLLABLE FAA
+134C		ETHIOPIC SYLLABLE FEE
+134D		ETHIOPIC SYLLABLE FE
+134E		ETHIOPIC SYLLABLE FO
+134F		ETHIOPIC SYLLABLE FWA
+1350		ETHIOPIC SYLLABLE PA
+1351		ETHIOPIC SYLLABLE PU
+1352		ETHIOPIC SYLLABLE PI
+1353		ETHIOPIC SYLLABLE PAA
+1354		ETHIOPIC SYLLABLE PEE
+1355		ETHIOPIC SYLLABLE PE
+1356		ETHIOPIC SYLLABLE PO
+1357		ETHIOPIC SYLLABLE PWA
+1358		ETHIOPIC SYLLABLE RYA
+1359		ETHIOPIC SYLLABLE MYA
+135A		ETHIOPIC SYLLABLE FYA
+135F		ETHIOPIC COMBINING GEMINATION MARK
+1360		ETHIOPIC SECTION MARK
+1361		ETHIOPIC WORDSPACE
+1362		ETHIOPIC FULL STOP
+1363		ETHIOPIC COMMA
+1364		ETHIOPIC SEMICOLON
+1365		ETHIOPIC COLON
+1366		ETHIOPIC PREFACE COLON
+1367		ETHIOPIC QUESTION MARK
+1368		ETHIOPIC PARAGRAPH SEPARATOR
+1369		ETHIOPIC DIGIT ONE
+136A		ETHIOPIC DIGIT TWO
+136B		ETHIOPIC DIGIT THREE
+136C		ETHIOPIC DIGIT FOUR
+136D		ETHIOPIC DIGIT FIVE
+136E		ETHIOPIC DIGIT SIX
+136F		ETHIOPIC DIGIT SEVEN
+1370		ETHIOPIC DIGIT EIGHT
+1371		ETHIOPIC DIGIT NINE
+1372		ETHIOPIC NUMBER TEN
+1373		ETHIOPIC NUMBER TWENTY
+1374		ETHIOPIC NUMBER THIRTY
+1375		ETHIOPIC NUMBER FORTY
+1376		ETHIOPIC NUMBER FIFTY
+1377		ETHIOPIC NUMBER SIXTY
+1378		ETHIOPIC NUMBER SEVENTY
+1379		ETHIOPIC NUMBER EIGHTY
+137A		ETHIOPIC NUMBER NINETY
+137B		ETHIOPIC NUMBER HUNDRED
+137C		ETHIOPIC NUMBER TEN THOUSAND
+1380		ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381		ETHIOPIC SYLLABLE MWI
+1382		ETHIOPIC SYLLABLE MWEE
+1383		ETHIOPIC SYLLABLE MWE
+1384		ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385		ETHIOPIC SYLLABLE BWI
+1386		ETHIOPIC SYLLABLE BWEE
+1387		ETHIOPIC SYLLABLE BWE
+1388		ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389		ETHIOPIC SYLLABLE FWI
+138A		ETHIOPIC SYLLABLE FWEE
+138B		ETHIOPIC SYLLABLE FWE
+138C		ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D		ETHIOPIC SYLLABLE PWI
+138E		ETHIOPIC SYLLABLE PWEE
+138F		ETHIOPIC SYLLABLE PWE
+1390		ETHIOPIC TONAL MARK YIZET
+1391		ETHIOPIC TONAL MARK DERET
+1392		ETHIOPIC TONAL MARK RIKRIK
+1393		ETHIOPIC TONAL MARK SHORT RIKRIK
+1394		ETHIOPIC TONAL MARK DIFAT
+1395		ETHIOPIC TONAL MARK KENAT
+1396		ETHIOPIC TONAL MARK CHIRET
+1397		ETHIOPIC TONAL MARK HIDET
+1398		ETHIOPIC TONAL MARK DERET-HIDET
+1399		ETHIOPIC TONAL MARK KURT
+13A0		CHEROKEE LETTER A
+13A1		CHEROKEE LETTER E
+13A2		CHEROKEE LETTER I
+13A3		CHEROKEE LETTER O
+13A4		CHEROKEE LETTER U
+13A5		CHEROKEE LETTER V
+13A6		CHEROKEE LETTER GA
+13A7		CHEROKEE LETTER KA
+13A8		CHEROKEE LETTER GE
+13A9		CHEROKEE LETTER GI
+13AA		CHEROKEE LETTER GO
+13AB		CHEROKEE LETTER GU
+13AC		CHEROKEE LETTER GV
+13AD		CHEROKEE LETTER HA
+13AE		CHEROKEE LETTER HE
+13AF		CHEROKEE LETTER HI
+13B0		CHEROKEE LETTER HO
+13B1		CHEROKEE LETTER HU
+13B2		CHEROKEE LETTER HV
+13B3		CHEROKEE LETTER LA
+13B4		CHEROKEE LETTER LE
+13B5		CHEROKEE LETTER LI
+13B6		CHEROKEE LETTER LO
+13B7		CHEROKEE LETTER LU
+13B8		CHEROKEE LETTER LV
+13B9		CHEROKEE LETTER MA
+13BA		CHEROKEE LETTER ME
+13BB		CHEROKEE LETTER MI
+13BC		CHEROKEE LETTER MO
+13BD		CHEROKEE LETTER MU
+13BE		CHEROKEE LETTER NA
+13BF		CHEROKEE LETTER HNA
+13C0		CHEROKEE LETTER NAH
+13C1		CHEROKEE LETTER NE
+13C2		CHEROKEE LETTER NI
+13C3		CHEROKEE LETTER NO
+13C4		CHEROKEE LETTER NU
+13C5		CHEROKEE LETTER NV
+13C6		CHEROKEE LETTER QUA
+13C7		CHEROKEE LETTER QUE
+13C8		CHEROKEE LETTER QUI
+13C9		CHEROKEE LETTER QUO
+13CA		CHEROKEE LETTER QUU
+13CB		CHEROKEE LETTER QUV
+13CC		CHEROKEE LETTER SA
+13CD		CHEROKEE LETTER S
+13CE		CHEROKEE LETTER SE
+13CF		CHEROKEE LETTER SI
+13D0		CHEROKEE LETTER SO
+13D1		CHEROKEE LETTER SU
+13D2		CHEROKEE LETTER SV
+13D3		CHEROKEE LETTER DA
+13D4		CHEROKEE LETTER TA
+13D5		CHEROKEE LETTER DE
+13D6		CHEROKEE LETTER TE
+13D7		CHEROKEE LETTER DI
+13D8		CHEROKEE LETTER TI
+13D9		CHEROKEE LETTER DO
+13DA		CHEROKEE LETTER DU
+13DB		CHEROKEE LETTER DV
+13DC		CHEROKEE LETTER DLA
+13DD		CHEROKEE LETTER TLA
+13DE		CHEROKEE LETTER TLE
+13DF		CHEROKEE LETTER TLI
+13E0		CHEROKEE LETTER TLO
+13E1		CHEROKEE LETTER TLU
+13E2		CHEROKEE LETTER TLV
+13E3		CHEROKEE LETTER TSA
+13E4		CHEROKEE LETTER TSE
+13E5		CHEROKEE LETTER TSI
+13E6		CHEROKEE LETTER TSO
+13E7		CHEROKEE LETTER TSU
+13E8		CHEROKEE LETTER TSV
+13E9		CHEROKEE LETTER WA
+13EA		CHEROKEE LETTER WE
+13EB		CHEROKEE LETTER WI
+13EC		CHEROKEE LETTER WO
+13ED		CHEROKEE LETTER WU
+13EE		CHEROKEE LETTER WV
+13EF		CHEROKEE LETTER YA
+13F0		CHEROKEE LETTER YE
+13F1		CHEROKEE LETTER YI
+13F2		CHEROKEE LETTER YO
+13F3		CHEROKEE LETTER YU
+13F4		CHEROKEE LETTER YV
+1401		CANADIAN SYLLABICS E
+1402		CANADIAN SYLLABICS AAI
+1403		CANADIAN SYLLABICS I
+1404		CANADIAN SYLLABICS II
+1405		CANADIAN SYLLABICS O
+1406		CANADIAN SYLLABICS OO
+1407		CANADIAN SYLLABICS Y-CREE OO
+1408		CANADIAN SYLLABICS CARRIER EE
+1409		CANADIAN SYLLABICS CARRIER I
+140A		CANADIAN SYLLABICS A
+140B		CANADIAN SYLLABICS AA
+140C		CANADIAN SYLLABICS WE
+140D		CANADIAN SYLLABICS WEST-CREE WE
+140E		CANADIAN SYLLABICS WI
+140F		CANADIAN SYLLABICS WEST-CREE WI
+1410		CANADIAN SYLLABICS WII
+1411		CANADIAN SYLLABICS WEST-CREE WII
+1412		CANADIAN SYLLABICS WO
+1413		CANADIAN SYLLABICS WEST-CREE WO
+1414		CANADIAN SYLLABICS WOO
+1415		CANADIAN SYLLABICS WEST-CREE WOO
+1416		CANADIAN SYLLABICS NASKAPI WOO
+1417		CANADIAN SYLLABICS WA
+1418		CANADIAN SYLLABICS WEST-CREE WA
+1419		CANADIAN SYLLABICS WAA
+141A		CANADIAN SYLLABICS WEST-CREE WAA
+141B		CANADIAN SYLLABICS NASKAPI WAA
+141C		CANADIAN SYLLABICS AI
+141D		CANADIAN SYLLABICS Y-CREE W
+141E		CANADIAN SYLLABICS GLOTTAL STOP
+141F		CANADIAN SYLLABICS FINAL ACUTE
+1420		CANADIAN SYLLABICS FINAL GRAVE
+1421		CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422		CANADIAN SYLLABICS FINAL TOP HALF RING
+1423		CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424		CANADIAN SYLLABICS FINAL RING
+1425		CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426		CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427		CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428		CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429		CANADIAN SYLLABICS FINAL PLUS
+142A		CANADIAN SYLLABICS FINAL DOWN TACK
+142B		CANADIAN SYLLABICS EN
+142C		CANADIAN SYLLABICS IN
+142D		CANADIAN SYLLABICS ON
+142E		CANADIAN SYLLABICS AN
+142F		CANADIAN SYLLABICS PE
+1430		CANADIAN SYLLABICS PAAI
+1431		CANADIAN SYLLABICS PI
+1432		CANADIAN SYLLABICS PII
+1433		CANADIAN SYLLABICS PO
+1434		CANADIAN SYLLABICS POO
+1435		CANADIAN SYLLABICS Y-CREE POO
+1436		CANADIAN SYLLABICS CARRIER HEE
+1437		CANADIAN SYLLABICS CARRIER HI
+1438		CANADIAN SYLLABICS PA
+1439		CANADIAN SYLLABICS PAA
+143A		CANADIAN SYLLABICS PWE
+143B		CANADIAN SYLLABICS WEST-CREE PWE
+143C		CANADIAN SYLLABICS PWI
+143D		CANADIAN SYLLABICS WEST-CREE PWI
+143E		CANADIAN SYLLABICS PWII
+143F		CANADIAN SYLLABICS WEST-CREE PWII
+1440		CANADIAN SYLLABICS PWO
+1441		CANADIAN SYLLABICS WEST-CREE PWO
+1442		CANADIAN SYLLABICS PWOO
+1443		CANADIAN SYLLABICS WEST-CREE PWOO
+1444		CANADIAN SYLLABICS PWA
+1445		CANADIAN SYLLABICS WEST-CREE PWA
+1446		CANADIAN SYLLABICS PWAA
+1447		CANADIAN SYLLABICS WEST-CREE PWAA
+1448		CANADIAN SYLLABICS Y-CREE PWAA
+1449		CANADIAN SYLLABICS P
+144A		CANADIAN SYLLABICS WEST-CREE P
+144B		CANADIAN SYLLABICS CARRIER H
+144C		CANADIAN SYLLABICS TE
+144D		CANADIAN SYLLABICS TAAI
+144E		CANADIAN SYLLABICS TI
+144F		CANADIAN SYLLABICS TII
+1450		CANADIAN SYLLABICS TO
+1451		CANADIAN SYLLABICS TOO
+1452		CANADIAN SYLLABICS Y-CREE TOO
+1453		CANADIAN SYLLABICS CARRIER DEE
+1454		CANADIAN SYLLABICS CARRIER DI
+1455		CANADIAN SYLLABICS TA
+1456		CANADIAN SYLLABICS TAA
+1457		CANADIAN SYLLABICS TWE
+1458		CANADIAN SYLLABICS WEST-CREE TWE
+1459		CANADIAN SYLLABICS TWI
+145A		CANADIAN SYLLABICS WEST-CREE TWI
+145B		CANADIAN SYLLABICS TWII
+145C		CANADIAN SYLLABICS WEST-CREE TWII
+145D		CANADIAN SYLLABICS TWO
+145E		CANADIAN SYLLABICS WEST-CREE TWO
+145F		CANADIAN SYLLABICS TWOO
+1460		CANADIAN SYLLABICS WEST-CREE TWOO
+1461		CANADIAN SYLLABICS TWA
+1462		CANADIAN SYLLABICS WEST-CREE TWA
+1463		CANADIAN SYLLABICS TWAA
+1464		CANADIAN SYLLABICS WEST-CREE TWAA
+1465		CANADIAN SYLLABICS NASKAPI TWAA
+1466		CANADIAN SYLLABICS T
+1467		CANADIAN SYLLABICS TTE
+1468		CANADIAN SYLLABICS TTI
+1469		CANADIAN SYLLABICS TTO
+146A		CANADIAN SYLLABICS TTA
+146B		CANADIAN SYLLABICS KE
+146C		CANADIAN SYLLABICS KAAI
+146D		CANADIAN SYLLABICS KI
+146E		CANADIAN SYLLABICS KII
+146F		CANADIAN SYLLABICS KO
+1470		CANADIAN SYLLABICS KOO
+1471		CANADIAN SYLLABICS Y-CREE KOO
+1472		CANADIAN SYLLABICS KA
+1473		CANADIAN SYLLABICS KAA
+1474		CANADIAN SYLLABICS KWE
+1475		CANADIAN SYLLABICS WEST-CREE KWE
+1476		CANADIAN SYLLABICS KWI
+1477		CANADIAN SYLLABICS WEST-CREE KWI
+1478		CANADIAN SYLLABICS KWII
+1479		CANADIAN SYLLABICS WEST-CREE KWII
+147A		CANADIAN SYLLABICS KWO
+147B		CANADIAN SYLLABICS WEST-CREE KWO
+147C		CANADIAN SYLLABICS KWOO
+147D		CANADIAN SYLLABICS WEST-CREE KWOO
+147E		CANADIAN SYLLABICS KWA
+147F		CANADIAN SYLLABICS WEST-CREE KWA
+1480		CANADIAN SYLLABICS KWAA
+1481		CANADIAN SYLLABICS WEST-CREE KWAA
+1482		CANADIAN SYLLABICS NASKAPI KWAA
+1483		CANADIAN SYLLABICS K
+1484		CANADIAN SYLLABICS KW
+1485		CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486		CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487		CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488		CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489		CANADIAN SYLLABICS CE
+148A		CANADIAN SYLLABICS CAAI
+148B		CANADIAN SYLLABICS CI
+148C		CANADIAN SYLLABICS CII
+148D		CANADIAN SYLLABICS CO
+148E		CANADIAN SYLLABICS COO
+148F		CANADIAN SYLLABICS Y-CREE COO
+1490		CANADIAN SYLLABICS CA
+1491		CANADIAN SYLLABICS CAA
+1492		CANADIAN SYLLABICS CWE
+1493		CANADIAN SYLLABICS WEST-CREE CWE
+1494		CANADIAN SYLLABICS CWI
+1495		CANADIAN SYLLABICS WEST-CREE CWI
+1496		CANADIAN SYLLABICS CWII
+1497		CANADIAN SYLLABICS WEST-CREE CWII
+1498		CANADIAN SYLLABICS CWO
+1499		CANADIAN SYLLABICS WEST-CREE CWO
+149A		CANADIAN SYLLABICS CWOO
+149B		CANADIAN SYLLABICS WEST-CREE CWOO
+149C		CANADIAN SYLLABICS CWA
+149D		CANADIAN SYLLABICS WEST-CREE CWA
+149E		CANADIAN SYLLABICS CWAA
+149F		CANADIAN SYLLABICS WEST-CREE CWAA
+14A0		CANADIAN SYLLABICS NASKAPI CWAA
+14A1		CANADIAN SYLLABICS C
+14A2		CANADIAN SYLLABICS SAYISI TH
+14A3		CANADIAN SYLLABICS ME
+14A4		CANADIAN SYLLABICS MAAI
+14A5		CANADIAN SYLLABICS MI
+14A6		CANADIAN SYLLABICS MII
+14A7		CANADIAN SYLLABICS MO
+14A8		CANADIAN SYLLABICS MOO
+14A9		CANADIAN SYLLABICS Y-CREE MOO
+14AA		CANADIAN SYLLABICS MA
+14AB		CANADIAN SYLLABICS MAA
+14AC		CANADIAN SYLLABICS MWE
+14AD		CANADIAN SYLLABICS WEST-CREE MWE
+14AE		CANADIAN SYLLABICS MWI
+14AF		CANADIAN SYLLABICS WEST-CREE MWI
+14B0		CANADIAN SYLLABICS MWII
+14B1		CANADIAN SYLLABICS WEST-CREE MWII
+14B2		CANADIAN SYLLABICS MWO
+14B3		CANADIAN SYLLABICS WEST-CREE MWO
+14B4		CANADIAN SYLLABICS MWOO
+14B5		CANADIAN SYLLABICS WEST-CREE MWOO
+14B6		CANADIAN SYLLABICS MWA
+14B7		CANADIAN SYLLABICS WEST-CREE MWA
+14B8		CANADIAN SYLLABICS MWAA
+14B9		CANADIAN SYLLABICS WEST-CREE MWAA
+14BA		CANADIAN SYLLABICS NASKAPI MWAA
+14BB		CANADIAN SYLLABICS M
+14BC		CANADIAN SYLLABICS WEST-CREE M
+14BD		CANADIAN SYLLABICS MH
+14BE		CANADIAN SYLLABICS ATHAPASCAN M
+14BF		CANADIAN SYLLABICS SAYISI M
+14C0		CANADIAN SYLLABICS NE
+14C1		CANADIAN SYLLABICS NAAI
+14C2		CANADIAN SYLLABICS NI
+14C3		CANADIAN SYLLABICS NII
+14C4		CANADIAN SYLLABICS NO
+14C5		CANADIAN SYLLABICS NOO
+14C6		CANADIAN SYLLABICS Y-CREE NOO
+14C7		CANADIAN SYLLABICS NA
+14C8		CANADIAN SYLLABICS NAA
+14C9		CANADIAN SYLLABICS NWE
+14CA		CANADIAN SYLLABICS WEST-CREE NWE
+14CB		CANADIAN SYLLABICS NWA
+14CC		CANADIAN SYLLABICS WEST-CREE NWA
+14CD		CANADIAN SYLLABICS NWAA
+14CE		CANADIAN SYLLABICS WEST-CREE NWAA
+14CF		CANADIAN SYLLABICS NASKAPI NWAA
+14D0		CANADIAN SYLLABICS N
+14D1		CANADIAN SYLLABICS CARRIER NG
+14D2		CANADIAN SYLLABICS NH
+14D3		CANADIAN SYLLABICS LE
+14D4		CANADIAN SYLLABICS LAAI
+14D5		CANADIAN SYLLABICS LI
+14D6		CANADIAN SYLLABICS LII
+14D7		CANADIAN SYLLABICS LO
+14D8		CANADIAN SYLLABICS LOO
+14D9		CANADIAN SYLLABICS Y-CREE LOO
+14DA		CANADIAN SYLLABICS LA
+14DB		CANADIAN SYLLABICS LAA
+14DC		CANADIAN SYLLABICS LWE
+14DD		CANADIAN SYLLABICS WEST-CREE LWE
+14DE		CANADIAN SYLLABICS LWI
+14DF		CANADIAN SYLLABICS WEST-CREE LWI
+14E0		CANADIAN SYLLABICS LWII
+14E1		CANADIAN SYLLABICS WEST-CREE LWII
+14E2		CANADIAN SYLLABICS LWO
+14E3		CANADIAN SYLLABICS WEST-CREE LWO
+14E4		CANADIAN SYLLABICS LWOO
+14E5		CANADIAN SYLLABICS WEST-CREE LWOO
+14E6		CANADIAN SYLLABICS LWA
+14E7		CANADIAN SYLLABICS WEST-CREE LWA
+14E8		CANADIAN SYLLABICS LWAA
+14E9		CANADIAN SYLLABICS WEST-CREE LWAA
+14EA		CANADIAN SYLLABICS L
+14EB		CANADIAN SYLLABICS WEST-CREE L
+14EC		CANADIAN SYLLABICS MEDIAL L
+14ED		CANADIAN SYLLABICS SE
+14EE		CANADIAN SYLLABICS SAAI
+14EF		CANADIAN SYLLABICS SI
+14F0		CANADIAN SYLLABICS SII
+14F1		CANADIAN SYLLABICS SO
+14F2		CANADIAN SYLLABICS SOO
+14F3		CANADIAN SYLLABICS Y-CREE SOO
+14F4		CANADIAN SYLLABICS SA
+14F5		CANADIAN SYLLABICS SAA
+14F6		CANADIAN SYLLABICS SWE
+14F7		CANADIAN SYLLABICS WEST-CREE SWE
+14F8		CANADIAN SYLLABICS SWI
+14F9		CANADIAN SYLLABICS WEST-CREE SWI
+14FA		CANADIAN SYLLABICS SWII
+14FB		CANADIAN SYLLABICS WEST-CREE SWII
+14FC		CANADIAN SYLLABICS SWO
+14FD		CANADIAN SYLLABICS WEST-CREE SWO
+14FE		CANADIAN SYLLABICS SWOO
+14FF		CANADIAN SYLLABICS WEST-CREE SWOO
+1500		CANADIAN SYLLABICS SWA
+1501		CANADIAN SYLLABICS WEST-CREE SWA
+1502		CANADIAN SYLLABICS SWAA
+1503		CANADIAN SYLLABICS WEST-CREE SWAA
+1504		CANADIAN SYLLABICS NASKAPI SWAA
+1505		CANADIAN SYLLABICS S
+1506		CANADIAN SYLLABICS ATHAPASCAN S
+1507		CANADIAN SYLLABICS SW
+1508		CANADIAN SYLLABICS BLACKFOOT S
+1509		CANADIAN SYLLABICS MOOSE-CREE SK
+150A		CANADIAN SYLLABICS NASKAPI SKW
+150B		CANADIAN SYLLABICS NASKAPI S-W
+150C		CANADIAN SYLLABICS NASKAPI SPWA
+150D		CANADIAN SYLLABICS NASKAPI STWA
+150E		CANADIAN SYLLABICS NASKAPI SKWA
+150F		CANADIAN SYLLABICS NASKAPI SCWA
+1510		CANADIAN SYLLABICS SHE
+1511		CANADIAN SYLLABICS SHI
+1512		CANADIAN SYLLABICS SHII
+1513		CANADIAN SYLLABICS SHO
+1514		CANADIAN SYLLABICS SHOO
+1515		CANADIAN SYLLABICS SHA
+1516		CANADIAN SYLLABICS SHAA
+1517		CANADIAN SYLLABICS SHWE
+1518		CANADIAN SYLLABICS WEST-CREE SHWE
+1519		CANADIAN SYLLABICS SHWI
+151A		CANADIAN SYLLABICS WEST-CREE SHWI
+151B		CANADIAN SYLLABICS SHWII
+151C		CANADIAN SYLLABICS WEST-CREE SHWII
+151D		CANADIAN SYLLABICS SHWO
+151E		CANADIAN SYLLABICS WEST-CREE SHWO
+151F		CANADIAN SYLLABICS SHWOO
+1520		CANADIAN SYLLABICS WEST-CREE SHWOO
+1521		CANADIAN SYLLABICS SHWA
+1522		CANADIAN SYLLABICS WEST-CREE SHWA
+1523		CANADIAN SYLLABICS SHWAA
+1524		CANADIAN SYLLABICS WEST-CREE SHWAA
+1525		CANADIAN SYLLABICS SH
+1526		CANADIAN SYLLABICS YE
+1527		CANADIAN SYLLABICS YAAI
+1528		CANADIAN SYLLABICS YI
+1529		CANADIAN SYLLABICS YII
+152A		CANADIAN SYLLABICS YO
+152B		CANADIAN SYLLABICS YOO
+152C		CANADIAN SYLLABICS Y-CREE YOO
+152D		CANADIAN SYLLABICS YA
+152E		CANADIAN SYLLABICS YAA
+152F		CANADIAN SYLLABICS YWE
+1530		CANADIAN SYLLABICS WEST-CREE YWE
+1531		CANADIAN SYLLABICS YWI
+1532		CANADIAN SYLLABICS WEST-CREE YWI
+1533		CANADIAN SYLLABICS YWII
+1534		CANADIAN SYLLABICS WEST-CREE YWII
+1535		CANADIAN SYLLABICS YWO
+1536		CANADIAN SYLLABICS WEST-CREE YWO
+1537		CANADIAN SYLLABICS YWOO
+1538		CANADIAN SYLLABICS WEST-CREE YWOO
+1539		CANADIAN SYLLABICS YWA
+153A		CANADIAN SYLLABICS WEST-CREE YWA
+153B		CANADIAN SYLLABICS YWAA
+153C		CANADIAN SYLLABICS WEST-CREE YWAA
+153D		CANADIAN SYLLABICS NASKAPI YWAA
+153E		CANADIAN SYLLABICS Y
+153F		CANADIAN SYLLABICS BIBLE-CREE Y
+1540		CANADIAN SYLLABICS WEST-CREE Y
+1541		CANADIAN SYLLABICS SAYISI YI
+1542		CANADIAN SYLLABICS RE
+1543		CANADIAN SYLLABICS R-CREE RE
+1544		CANADIAN SYLLABICS WEST-CREE LE
+1545		CANADIAN SYLLABICS RAAI
+1546		CANADIAN SYLLABICS RI
+1547		CANADIAN SYLLABICS RII
+1548		CANADIAN SYLLABICS RO
+1549		CANADIAN SYLLABICS ROO
+154A		CANADIAN SYLLABICS WEST-CREE LO
+154B		CANADIAN SYLLABICS RA
+154C		CANADIAN SYLLABICS RAA
+154D		CANADIAN SYLLABICS WEST-CREE LA
+154E		CANADIAN SYLLABICS RWAA
+154F		CANADIAN SYLLABICS WEST-CREE RWAA
+1550		CANADIAN SYLLABICS R
+1551		CANADIAN SYLLABICS WEST-CREE R
+1552		CANADIAN SYLLABICS MEDIAL R
+1553		CANADIAN SYLLABICS FE
+1554		CANADIAN SYLLABICS FAAI
+1555		CANADIAN SYLLABICS FI
+1556		CANADIAN SYLLABICS FII
+1557		CANADIAN SYLLABICS FO
+1558		CANADIAN SYLLABICS FOO
+1559		CANADIAN SYLLABICS FA
+155A		CANADIAN SYLLABICS FAA
+155B		CANADIAN SYLLABICS FWAA
+155C		CANADIAN SYLLABICS WEST-CREE FWAA
+155D		CANADIAN SYLLABICS F
+155E		CANADIAN SYLLABICS THE
+155F		CANADIAN SYLLABICS N-CREE THE
+1560		CANADIAN SYLLABICS THI
+1561		CANADIAN SYLLABICS N-CREE THI
+1562		CANADIAN SYLLABICS THII
+1563		CANADIAN SYLLABICS N-CREE THII
+1564		CANADIAN SYLLABICS THO
+1565		CANADIAN SYLLABICS THOO
+1566		CANADIAN SYLLABICS THA
+1567		CANADIAN SYLLABICS THAA
+1568		CANADIAN SYLLABICS THWAA
+1569		CANADIAN SYLLABICS WEST-CREE THWAA
+156A		CANADIAN SYLLABICS TH
+156B		CANADIAN SYLLABICS TTHE
+156C		CANADIAN SYLLABICS TTHI
+156D		CANADIAN SYLLABICS TTHO
+156E		CANADIAN SYLLABICS TTHA
+156F		CANADIAN SYLLABICS TTH
+1570		CANADIAN SYLLABICS TYE
+1571		CANADIAN SYLLABICS TYI
+1572		CANADIAN SYLLABICS TYO
+1573		CANADIAN SYLLABICS TYA
+1574		CANADIAN SYLLABICS NUNAVIK HE
+1575		CANADIAN SYLLABICS NUNAVIK HI
+1576		CANADIAN SYLLABICS NUNAVIK HII
+1577		CANADIAN SYLLABICS NUNAVIK HO
+1578		CANADIAN SYLLABICS NUNAVIK HOO
+1579		CANADIAN SYLLABICS NUNAVIK HA
+157A		CANADIAN SYLLABICS NUNAVIK HAA
+157B		CANADIAN SYLLABICS NUNAVIK H
+157C		CANADIAN SYLLABICS NUNAVUT H
+157D		CANADIAN SYLLABICS HK
+157E		CANADIAN SYLLABICS QAAI
+157F		CANADIAN SYLLABICS QI
+1580		CANADIAN SYLLABICS QII
+1581		CANADIAN SYLLABICS QO
+1582		CANADIAN SYLLABICS QOO
+1583		CANADIAN SYLLABICS QA
+1584		CANADIAN SYLLABICS QAA
+1585		CANADIAN SYLLABICS Q
+1586		CANADIAN SYLLABICS TLHE
+1587		CANADIAN SYLLABICS TLHI
+1588		CANADIAN SYLLABICS TLHO
+1589		CANADIAN SYLLABICS TLHA
+158A		CANADIAN SYLLABICS WEST-CREE RE
+158B		CANADIAN SYLLABICS WEST-CREE RI
+158C		CANADIAN SYLLABICS WEST-CREE RO
+158D		CANADIAN SYLLABICS WEST-CREE RA
+158E		CANADIAN SYLLABICS NGAAI
+158F		CANADIAN SYLLABICS NGI
+1590		CANADIAN SYLLABICS NGII
+1591		CANADIAN SYLLABICS NGO
+1592		CANADIAN SYLLABICS NGOO
+1593		CANADIAN SYLLABICS NGA
+1594		CANADIAN SYLLABICS NGAA
+1595		CANADIAN SYLLABICS NG
+1596		CANADIAN SYLLABICS NNG
+1597		CANADIAN SYLLABICS SAYISI SHE
+1598		CANADIAN SYLLABICS SAYISI SHI
+1599		CANADIAN SYLLABICS SAYISI SHO
+159A		CANADIAN SYLLABICS SAYISI SHA
+159B		CANADIAN SYLLABICS WOODS-CREE THE
+159C		CANADIAN SYLLABICS WOODS-CREE THI
+159D		CANADIAN SYLLABICS WOODS-CREE THO
+159E		CANADIAN SYLLABICS WOODS-CREE THA
+159F		CANADIAN SYLLABICS WOODS-CREE TH
+15A0		CANADIAN SYLLABICS LHI
+15A1		CANADIAN SYLLABICS LHII
+15A2		CANADIAN SYLLABICS LHO
+15A3		CANADIAN SYLLABICS LHOO
+15A4		CANADIAN SYLLABICS LHA
+15A5		CANADIAN SYLLABICS LHAA
+15A6		CANADIAN SYLLABICS LH
+15A7		CANADIAN SYLLABICS TH-CREE THE
+15A8		CANADIAN SYLLABICS TH-CREE THI
+15A9		CANADIAN SYLLABICS TH-CREE THII
+15AA		CANADIAN SYLLABICS TH-CREE THO
+15AB		CANADIAN SYLLABICS TH-CREE THOO
+15AC		CANADIAN SYLLABICS TH-CREE THA
+15AD		CANADIAN SYLLABICS TH-CREE THAA
+15AE		CANADIAN SYLLABICS TH-CREE TH
+15AF		CANADIAN SYLLABICS AIVILIK B
+15B0		CANADIAN SYLLABICS BLACKFOOT E
+15B1		CANADIAN SYLLABICS BLACKFOOT I
+15B2		CANADIAN SYLLABICS BLACKFOOT O
+15B3		CANADIAN SYLLABICS BLACKFOOT A
+15B4		CANADIAN SYLLABICS BLACKFOOT WE
+15B5		CANADIAN SYLLABICS BLACKFOOT WI
+15B6		CANADIAN SYLLABICS BLACKFOOT WO
+15B7		CANADIAN SYLLABICS BLACKFOOT WA
+15B8		CANADIAN SYLLABICS BLACKFOOT NE
+15B9		CANADIAN SYLLABICS BLACKFOOT NI
+15BA		CANADIAN SYLLABICS BLACKFOOT NO
+15BB		CANADIAN SYLLABICS BLACKFOOT NA
+15BC		CANADIAN SYLLABICS BLACKFOOT KE
+15BD		CANADIAN SYLLABICS BLACKFOOT KI
+15BE		CANADIAN SYLLABICS BLACKFOOT KO
+15BF		CANADIAN SYLLABICS BLACKFOOT KA
+15C0		CANADIAN SYLLABICS SAYISI HE
+15C1		CANADIAN SYLLABICS SAYISI HI
+15C2		CANADIAN SYLLABICS SAYISI HO
+15C3		CANADIAN SYLLABICS SAYISI HA
+15C4		CANADIAN SYLLABICS CARRIER GHU
+15C5		CANADIAN SYLLABICS CARRIER GHO
+15C6		CANADIAN SYLLABICS CARRIER GHE
+15C7		CANADIAN SYLLABICS CARRIER GHEE
+15C8		CANADIAN SYLLABICS CARRIER GHI
+15C9		CANADIAN SYLLABICS CARRIER GHA
+15CA		CANADIAN SYLLABICS CARRIER RU
+15CB		CANADIAN SYLLABICS CARRIER RO
+15CC		CANADIAN SYLLABICS CARRIER RE
+15CD		CANADIAN SYLLABICS CARRIER REE
+15CE		CANADIAN SYLLABICS CARRIER RI
+15CF		CANADIAN SYLLABICS CARRIER RA
+15D0		CANADIAN SYLLABICS CARRIER WU
+15D1		CANADIAN SYLLABICS CARRIER WO
+15D2		CANADIAN SYLLABICS CARRIER WE
+15D3		CANADIAN SYLLABICS CARRIER WEE
+15D4		CANADIAN SYLLABICS CARRIER WI
+15D5		CANADIAN SYLLABICS CARRIER WA
+15D6		CANADIAN SYLLABICS CARRIER HWU
+15D7		CANADIAN SYLLABICS CARRIER HWO
+15D8		CANADIAN SYLLABICS CARRIER HWE
+15D9		CANADIAN SYLLABICS CARRIER HWEE
+15DA		CANADIAN SYLLABICS CARRIER HWI
+15DB		CANADIAN SYLLABICS CARRIER HWA
+15DC		CANADIAN SYLLABICS CARRIER THU
+15DD		CANADIAN SYLLABICS CARRIER THO
+15DE		CANADIAN SYLLABICS CARRIER THE
+15DF		CANADIAN SYLLABICS CARRIER THEE
+15E0		CANADIAN SYLLABICS CARRIER THI
+15E1		CANADIAN SYLLABICS CARRIER THA
+15E2		CANADIAN SYLLABICS CARRIER TTU
+15E3		CANADIAN SYLLABICS CARRIER TTO
+15E4		CANADIAN SYLLABICS CARRIER TTE
+15E5		CANADIAN SYLLABICS CARRIER TTEE
+15E6		CANADIAN SYLLABICS CARRIER TTI
+15E7		CANADIAN SYLLABICS CARRIER TTA
+15E8		CANADIAN SYLLABICS CARRIER PU
+15E9		CANADIAN SYLLABICS CARRIER PO
+15EA		CANADIAN SYLLABICS CARRIER PE
+15EB		CANADIAN SYLLABICS CARRIER PEE
+15EC		CANADIAN SYLLABICS CARRIER PI
+15ED		CANADIAN SYLLABICS CARRIER PA
+15EE		CANADIAN SYLLABICS CARRIER P
+15EF		CANADIAN SYLLABICS CARRIER GU
+15F0		CANADIAN SYLLABICS CARRIER GO
+15F1		CANADIAN SYLLABICS CARRIER GE
+15F2		CANADIAN SYLLABICS CARRIER GEE
+15F3		CANADIAN SYLLABICS CARRIER GI
+15F4		CANADIAN SYLLABICS CARRIER GA
+15F5		CANADIAN SYLLABICS CARRIER KHU
+15F6		CANADIAN SYLLABICS CARRIER KHO
+15F7		CANADIAN SYLLABICS CARRIER KHE
+15F8		CANADIAN SYLLABICS CARRIER KHEE
+15F9		CANADIAN SYLLABICS CARRIER KHI
+15FA		CANADIAN SYLLABICS CARRIER KHA
+15FB		CANADIAN SYLLABICS CARRIER KKU
+15FC		CANADIAN SYLLABICS CARRIER KKO
+15FD		CANADIAN SYLLABICS CARRIER KKE
+15FE		CANADIAN SYLLABICS CARRIER KKEE
+15FF		CANADIAN SYLLABICS CARRIER KKI
+1600		CANADIAN SYLLABICS CARRIER KKA
+1601		CANADIAN SYLLABICS CARRIER KK
+1602		CANADIAN SYLLABICS CARRIER NU
+1603		CANADIAN SYLLABICS CARRIER NO
+1604		CANADIAN SYLLABICS CARRIER NE
+1605		CANADIAN SYLLABICS CARRIER NEE
+1606		CANADIAN SYLLABICS CARRIER NI
+1607		CANADIAN SYLLABICS CARRIER NA
+1608		CANADIAN SYLLABICS CARRIER MU
+1609		CANADIAN SYLLABICS CARRIER MO
+160A		CANADIAN SYLLABICS CARRIER ME
+160B		CANADIAN SYLLABICS CARRIER MEE
+160C		CANADIAN SYLLABICS CARRIER MI
+160D		CANADIAN SYLLABICS CARRIER MA
+160E		CANADIAN SYLLABICS CARRIER YU
+160F		CANADIAN SYLLABICS CARRIER YO
+1610		CANADIAN SYLLABICS CARRIER YE
+1611		CANADIAN SYLLABICS CARRIER YEE
+1612		CANADIAN SYLLABICS CARRIER YI
+1613		CANADIAN SYLLABICS CARRIER YA
+1614		CANADIAN SYLLABICS CARRIER JU
+1615		CANADIAN SYLLABICS SAYISI JU
+1616		CANADIAN SYLLABICS CARRIER JO
+1617		CANADIAN SYLLABICS CARRIER JE
+1618		CANADIAN SYLLABICS CARRIER JEE
+1619		CANADIAN SYLLABICS CARRIER JI
+161A		CANADIAN SYLLABICS SAYISI JI
+161B		CANADIAN SYLLABICS CARRIER JA
+161C		CANADIAN SYLLABICS CARRIER JJU
+161D		CANADIAN SYLLABICS CARRIER JJO
+161E		CANADIAN SYLLABICS CARRIER JJE
+161F		CANADIAN SYLLABICS CARRIER JJEE
+1620		CANADIAN SYLLABICS CARRIER JJI
+1621		CANADIAN SYLLABICS CARRIER JJA
+1622		CANADIAN SYLLABICS CARRIER LU
+1623		CANADIAN SYLLABICS CARRIER LO
+1624		CANADIAN SYLLABICS CARRIER LE
+1625		CANADIAN SYLLABICS CARRIER LEE
+1626		CANADIAN SYLLABICS CARRIER LI
+1627		CANADIAN SYLLABICS CARRIER LA
+1628		CANADIAN SYLLABICS CARRIER DLU
+1629		CANADIAN SYLLABICS CARRIER DLO
+162A		CANADIAN SYLLABICS CARRIER DLE
+162B		CANADIAN SYLLABICS CARRIER DLEE
+162C		CANADIAN SYLLABICS CARRIER DLI
+162D		CANADIAN SYLLABICS CARRIER DLA
+162E		CANADIAN SYLLABICS CARRIER LHU
+162F		CANADIAN SYLLABICS CARRIER LHO
+1630		CANADIAN SYLLABICS CARRIER LHE
+1631		CANADIAN SYLLABICS CARRIER LHEE
+1632		CANADIAN SYLLABICS CARRIER LHI
+1633		CANADIAN SYLLABICS CARRIER LHA
+1634		CANADIAN SYLLABICS CARRIER TLHU
+1635		CANADIAN SYLLABICS CARRIER TLHO
+1636		CANADIAN SYLLABICS CARRIER TLHE
+1637		CANADIAN SYLLABICS CARRIER TLHEE
+1638		CANADIAN SYLLABICS CARRIER TLHI
+1639		CANADIAN SYLLABICS CARRIER TLHA
+163A		CANADIAN SYLLABICS CARRIER TLU
+163B		CANADIAN SYLLABICS CARRIER TLO
+163C		CANADIAN SYLLABICS CARRIER TLE
+163D		CANADIAN SYLLABICS CARRIER TLEE
+163E		CANADIAN SYLLABICS CARRIER TLI
+163F		CANADIAN SYLLABICS CARRIER TLA
+1640		CANADIAN SYLLABICS CARRIER ZU
+1641		CANADIAN SYLLABICS CARRIER ZO
+1642		CANADIAN SYLLABICS CARRIER ZE
+1643		CANADIAN SYLLABICS CARRIER ZEE
+1644		CANADIAN SYLLABICS CARRIER ZI
+1645		CANADIAN SYLLABICS CARRIER ZA
+1646		CANADIAN SYLLABICS CARRIER Z
+1647		CANADIAN SYLLABICS CARRIER INITIAL Z
+1648		CANADIAN SYLLABICS CARRIER DZU
+1649		CANADIAN SYLLABICS CARRIER DZO
+164A		CANADIAN SYLLABICS CARRIER DZE
+164B		CANADIAN SYLLABICS CARRIER DZEE
+164C		CANADIAN SYLLABICS CARRIER DZI
+164D		CANADIAN SYLLABICS CARRIER DZA
+164E		CANADIAN SYLLABICS CARRIER SU
+164F		CANADIAN SYLLABICS CARRIER SO
+1650		CANADIAN SYLLABICS CARRIER SE
+1651		CANADIAN SYLLABICS CARRIER SEE
+1652		CANADIAN SYLLABICS CARRIER SI
+1653		CANADIAN SYLLABICS CARRIER SA
+1654		CANADIAN SYLLABICS CARRIER SHU
+1655		CANADIAN SYLLABICS CARRIER SHO
+1656		CANADIAN SYLLABICS CARRIER SHE
+1657		CANADIAN SYLLABICS CARRIER SHEE
+1658		CANADIAN SYLLABICS CARRIER SHI
+1659		CANADIAN SYLLABICS CARRIER SHA
+165A		CANADIAN SYLLABICS CARRIER SH
+165B		CANADIAN SYLLABICS CARRIER TSU
+165C		CANADIAN SYLLABICS CARRIER TSO
+165D		CANADIAN SYLLABICS CARRIER TSE
+165E		CANADIAN SYLLABICS CARRIER TSEE
+165F		CANADIAN SYLLABICS CARRIER TSI
+1660		CANADIAN SYLLABICS CARRIER TSA
+1661		CANADIAN SYLLABICS CARRIER CHU
+1662		CANADIAN SYLLABICS CARRIER CHO
+1663		CANADIAN SYLLABICS CARRIER CHE
+1664		CANADIAN SYLLABICS CARRIER CHEE
+1665		CANADIAN SYLLABICS CARRIER CHI
+1666		CANADIAN SYLLABICS CARRIER CHA
+1667		CANADIAN SYLLABICS CARRIER TTSU
+1668		CANADIAN SYLLABICS CARRIER TTSO
+1669		CANADIAN SYLLABICS CARRIER TTSE
+166A		CANADIAN SYLLABICS CARRIER TTSEE
+166B		CANADIAN SYLLABICS CARRIER TTSI
+166C		CANADIAN SYLLABICS CARRIER TTSA
+166D		CANADIAN SYLLABICS CHI SIGN
+166E		CANADIAN SYLLABICS FULL STOP
+166F		CANADIAN SYLLABICS QAI
+1670		CANADIAN SYLLABICS NGAI
+1671		CANADIAN SYLLABICS NNGI
+1672		CANADIAN SYLLABICS NNGII
+1673		CANADIAN SYLLABICS NNGO
+1674		CANADIAN SYLLABICS NNGOO
+1675		CANADIAN SYLLABICS NNGA
+1676		CANADIAN SYLLABICS NNGAA
+1680		OGHAM SPACE MARK
+1681		OGHAM LETTER BEITH
+1682		OGHAM LETTER LUIS
+1683		OGHAM LETTER FEARN
+1684		OGHAM LETTER SAIL
+1685		OGHAM LETTER NION
+1686		OGHAM LETTER UATH
+1687		OGHAM LETTER DAIR
+1688		OGHAM LETTER TINNE
+1689		OGHAM LETTER COLL
+168A		OGHAM LETTER CEIRT
+168B		OGHAM LETTER MUIN
+168C		OGHAM LETTER GORT
+168D		OGHAM LETTER NGEADAL
+168E		OGHAM LETTER STRAIF
+168F		OGHAM LETTER RUIS
+1690		OGHAM LETTER AILM
+1691		OGHAM LETTER ONN
+1692		OGHAM LETTER UR
+1693		OGHAM LETTER EADHADH
+1694		OGHAM LETTER IODHADH
+1695		OGHAM LETTER EABHADH
+1696		OGHAM LETTER OR
+1697		OGHAM LETTER UILLEANN
+1698		OGHAM LETTER IFIN
+1699		OGHAM LETTER EAMHANCHOLL
+169A		OGHAM LETTER PEITH
+169B		OGHAM FEATHER MARK
+169C		OGHAM REVERSED FEATHER MARK
+16A0		RUNIC LETTER FEHU FEOH FE F
+16A1		RUNIC LETTER V
+16A2		RUNIC LETTER URUZ UR U
+16A3		RUNIC LETTER YR
+16A4		RUNIC LETTER Y
+16A5		RUNIC LETTER W
+16A6		RUNIC LETTER THURISAZ THURS THORN
+16A7		RUNIC LETTER ETH
+16A8		RUNIC LETTER ANSUZ A
+16A9		RUNIC LETTER OS O
+16AA		RUNIC LETTER AC A
+16AB		RUNIC LETTER AESC
+16AC		RUNIC LETTER LONG-BRANCH-OSS O
+16AD		RUNIC LETTER SHORT-TWIG-OSS O
+16AE		RUNIC LETTER O
+16AF		RUNIC LETTER OE
+16B0		RUNIC LETTER ON
+16B1		RUNIC LETTER RAIDO RAD REID R
+16B2		RUNIC LETTER KAUNA
+16B3		RUNIC LETTER CEN
+16B4		RUNIC LETTER KAUN K
+16B5		RUNIC LETTER G
+16B6		RUNIC LETTER ENG
+16B7		RUNIC LETTER GEBO GYFU G
+16B8		RUNIC LETTER GAR
+16B9		RUNIC LETTER WUNJO WYNN W
+16BA		RUNIC LETTER HAGLAZ H
+16BB		RUNIC LETTER HAEGL H
+16BC		RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD		RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE		RUNIC LETTER NAUDIZ NYD NAUD N
+16BF		RUNIC LETTER SHORT-TWIG-NAUD N
+16C0		RUNIC LETTER DOTTED-N
+16C1		RUNIC LETTER ISAZ IS ISS I
+16C2		RUNIC LETTER E
+16C3		RUNIC LETTER JERAN J
+16C4		RUNIC LETTER GER
+16C5		RUNIC LETTER LONG-BRANCH-AR AE
+16C6		RUNIC LETTER SHORT-TWIG-AR A
+16C7		RUNIC LETTER IWAZ EOH
+16C8		RUNIC LETTER PERTHO PEORTH P
+16C9		RUNIC LETTER ALGIZ EOLHX
+16CA		RUNIC LETTER SOWILO S
+16CB		RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC		RUNIC LETTER SHORT-TWIG-SOL S
+16CD		RUNIC LETTER C
+16CE		RUNIC LETTER Z
+16CF		RUNIC LETTER TIWAZ TIR TYR T
+16D0		RUNIC LETTER SHORT-TWIG-TYR T
+16D1		RUNIC LETTER D
+16D2		RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3		RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4		RUNIC LETTER DOTTED-P
+16D5		RUNIC LETTER OPEN-P
+16D6		RUNIC LETTER EHWAZ EH E
+16D7		RUNIC LETTER MANNAZ MAN M
+16D8		RUNIC LETTER LONG-BRANCH-MADR M
+16D9		RUNIC LETTER SHORT-TWIG-MADR M
+16DA		RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB		RUNIC LETTER DOTTED-L
+16DC		RUNIC LETTER INGWAZ
+16DD		RUNIC LETTER ING
+16DE		RUNIC LETTER DAGAZ DAEG D
+16DF		RUNIC LETTER OTHALAN ETHEL O
+16E0		RUNIC LETTER EAR
+16E1		RUNIC LETTER IOR
+16E2		RUNIC LETTER CWEORTH
+16E3		RUNIC LETTER CALC
+16E4		RUNIC LETTER CEALC
+16E5		RUNIC LETTER STAN
+16E6		RUNIC LETTER LONG-BRANCH-YR
+16E7		RUNIC LETTER SHORT-TWIG-YR
+16E8		RUNIC LETTER ICELANDIC-YR
+16E9		RUNIC LETTER Q
+16EA		RUNIC LETTER X
+16EB		RUNIC SINGLE PUNCTUATION
+16EC		RUNIC MULTIPLE PUNCTUATION
+16ED		RUNIC CROSS PUNCTUATION
+16EE		RUNIC ARLAUG SYMBOL
+16EF		RUNIC TVIMADUR SYMBOL
+16F0		RUNIC BELGTHOR SYMBOL
+1700		TAGALOG LETTER A
+1701		TAGALOG LETTER I
+1702		TAGALOG LETTER U
+1703		TAGALOG LETTER KA
+1704		TAGALOG LETTER GA
+1705		TAGALOG LETTER NGA
+1706		TAGALOG LETTER TA
+1707		TAGALOG LETTER DA
+1708		TAGALOG LETTER NA
+1709		TAGALOG LETTER PA
+170A		TAGALOG LETTER BA
+170B		TAGALOG LETTER MA
+170C		TAGALOG LETTER YA
+170E		TAGALOG LETTER LA
+170F		TAGALOG LETTER WA
+1710		TAGALOG LETTER SA
+1711		TAGALOG LETTER HA
+1712		TAGALOG VOWEL SIGN I
+1713		TAGALOG VOWEL SIGN U
+1714		TAGALOG SIGN VIRAMA
+1720		HANUNOO LETTER A
+1721		HANUNOO LETTER I
+1722		HANUNOO LETTER U
+1723		HANUNOO LETTER KA
+1724		HANUNOO LETTER GA
+1725		HANUNOO LETTER NGA
+1726		HANUNOO LETTER TA
+1727		HANUNOO LETTER DA
+1728		HANUNOO LETTER NA
+1729		HANUNOO LETTER PA
+172A		HANUNOO LETTER BA
+172B		HANUNOO LETTER MA
+172C		HANUNOO LETTER YA
+172D		HANUNOO LETTER RA
+172E		HANUNOO LETTER LA
+172F		HANUNOO LETTER WA
+1730		HANUNOO LETTER SA
+1731		HANUNOO LETTER HA
+1732		HANUNOO VOWEL SIGN I
+1733		HANUNOO VOWEL SIGN U
+1734		HANUNOO SIGN PAMUDPOD
+1735		PHILIPPINE SINGLE PUNCTUATION
+1736		PHILIPPINE DOUBLE PUNCTUATION
+1740		BUHID LETTER A
+1741		BUHID LETTER I
+1742		BUHID LETTER U
+1743		BUHID LETTER KA
+1744		BUHID LETTER GA
+1745		BUHID LETTER NGA
+1746		BUHID LETTER TA
+1747		BUHID LETTER DA
+1748		BUHID LETTER NA
+1749		BUHID LETTER PA
+174A		BUHID LETTER BA
+174B		BUHID LETTER MA
+174C		BUHID LETTER YA
+174D		BUHID LETTER RA
+174E		BUHID LETTER LA
+174F		BUHID LETTER WA
+1750		BUHID LETTER SA
+1751		BUHID LETTER HA
+1752		BUHID VOWEL SIGN I
+1753		BUHID VOWEL SIGN U
+1760		TAGBANWA LETTER A
+1761		TAGBANWA LETTER I
+1762		TAGBANWA LETTER U
+1763		TAGBANWA LETTER KA
+1764		TAGBANWA LETTER GA
+1765		TAGBANWA LETTER NGA
+1766		TAGBANWA LETTER TA
+1767		TAGBANWA LETTER DA
+1768		TAGBANWA LETTER NA
+1769		TAGBANWA LETTER PA
+176A		TAGBANWA LETTER BA
+176B		TAGBANWA LETTER MA
+176C		TAGBANWA LETTER YA
+176E		TAGBANWA LETTER LA
+176F		TAGBANWA LETTER WA
+1770		TAGBANWA LETTER SA
+1772		TAGBANWA VOWEL SIGN I
+1773		TAGBANWA VOWEL SIGN U
+1780		KHMER LETTER KA
+1781		KHMER LETTER KHA
+1782		KHMER LETTER KO
+1783		KHMER LETTER KHO
+1784		KHMER LETTER NGO
+1785		KHMER LETTER CA
+1786		KHMER LETTER CHA
+1787		KHMER LETTER CO
+1788		KHMER LETTER CHO
+1789		KHMER LETTER NYO
+178A		KHMER LETTER DA
+178B		KHMER LETTER TTHA
+178C		KHMER LETTER DO
+178D		KHMER LETTER TTHO
+178E		KHMER LETTER NNO
+178F		KHMER LETTER TA
+1790		KHMER LETTER THA
+1791		KHMER LETTER TO
+1792		KHMER LETTER THO
+1793		KHMER LETTER NO
+1794		KHMER LETTER BA
+1795		KHMER LETTER PHA
+1796		KHMER LETTER PO
+1797		KHMER LETTER PHO
+1798		KHMER LETTER MO
+1799		KHMER LETTER YO
+179A		KHMER LETTER RO
+179B		KHMER LETTER LO
+179C		KHMER LETTER VO
+179D		KHMER LETTER SHA
+179E		KHMER LETTER SSO
+179F		KHMER LETTER SA
+17A0		KHMER LETTER HA
+17A1		KHMER LETTER LA
+17A2		KHMER LETTER QA
+17A3		KHMER INDEPENDENT VOWEL QAQ
+17A4		KHMER INDEPENDENT VOWEL QAA
+17A5		KHMER INDEPENDENT VOWEL QI
+17A6		KHMER INDEPENDENT VOWEL QII
+17A7		KHMER INDEPENDENT VOWEL QU
+17A8		KHMER INDEPENDENT VOWEL QUK
+17A9		KHMER INDEPENDENT VOWEL QUU
+17AA		KHMER INDEPENDENT VOWEL QUUV
+17AB		KHMER INDEPENDENT VOWEL RY
+17AC		KHMER INDEPENDENT VOWEL RYY
+17AD		KHMER INDEPENDENT VOWEL LY
+17AE		KHMER INDEPENDENT VOWEL LYY
+17AF		KHMER INDEPENDENT VOWEL QE
+17B0		KHMER INDEPENDENT VOWEL QAI
+17B1		KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2		KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3		KHMER INDEPENDENT VOWEL QAU
+17B4		KHMER VOWEL INHERENT AQ
+17B5		KHMER VOWEL INHERENT AA
+17B6		KHMER VOWEL SIGN AA
+17B7		KHMER VOWEL SIGN I
+17B8		KHMER VOWEL SIGN II
+17B9		KHMER VOWEL SIGN Y
+17BA		KHMER VOWEL SIGN YY
+17BB		KHMER VOWEL SIGN U
+17BC		KHMER VOWEL SIGN UU
+17BD		KHMER VOWEL SIGN UA
+17BE		KHMER VOWEL SIGN OE
+17BF		KHMER VOWEL SIGN YA
+17C0		KHMER VOWEL SIGN IE
+17C1		KHMER VOWEL SIGN E
+17C2		KHMER VOWEL SIGN AE
+17C3		KHMER VOWEL SIGN AI
+17C4		KHMER VOWEL SIGN OO
+17C5		KHMER VOWEL SIGN AU
+17C6		KHMER SIGN NIKAHIT
+17C7		KHMER SIGN REAHMUK
+17C8		KHMER SIGN YUUKALEAPINTU
+17C9		KHMER SIGN MUUSIKATOAN
+17CA		KHMER SIGN TRIISAP
+17CB		KHMER SIGN BANTOC
+17CC		KHMER SIGN ROBAT
+17CD		KHMER SIGN TOANDAKHIAT
+17CE		KHMER SIGN KAKABAT
+17CF		KHMER SIGN AHSDA
+17D0		KHMER SIGN SAMYOK SANNYA
+17D1		KHMER SIGN VIRIAM
+17D2		KHMER SIGN COENG
+17D3		KHMER SIGN BATHAMASAT
+17D4		KHMER SIGN KHAN
+17D5		KHMER SIGN BARIYOOSAN
+17D6		KHMER SIGN CAMNUC PII KUUH
+17D7		KHMER SIGN LEK TOO
+17D8		KHMER SIGN BEYYAL
+17D9		KHMER SIGN PHNAEK MUAN
+17DA		KHMER SIGN KOOMUUT
+17DB		KHMER CURRENCY SYMBOL RIEL
+17DC		KHMER SIGN AVAKRAHASANYA
+17DD		KHMER SIGN ATTHACAN
+17E0		KHMER DIGIT ZERO
+17E1		KHMER DIGIT ONE
+17E2		KHMER DIGIT TWO
+17E3		KHMER DIGIT THREE
+17E4		KHMER DIGIT FOUR
+17E5		KHMER DIGIT FIVE
+17E6		KHMER DIGIT SIX
+17E7		KHMER DIGIT SEVEN
+17E8		KHMER DIGIT EIGHT
+17E9		KHMER DIGIT NINE
+17F0		KHMER SYMBOL LEK ATTAK SON
+17F1		KHMER SYMBOL LEK ATTAK MUOY
+17F2		KHMER SYMBOL LEK ATTAK PII
+17F3		KHMER SYMBOL LEK ATTAK BEI
+17F4		KHMER SYMBOL LEK ATTAK BUON
+17F5		KHMER SYMBOL LEK ATTAK PRAM
+17F6		KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7		KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8		KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9		KHMER SYMBOL LEK ATTAK PRAM-BUON
+1800		MONGOLIAN BIRGA
+1801		MONGOLIAN ELLIPSIS
+1802		MONGOLIAN COMMA
+1803		MONGOLIAN FULL STOP
+1804		MONGOLIAN COLON
+1805		MONGOLIAN FOUR DOTS
+1806		MONGOLIAN TODO SOFT HYPHEN
+1807		MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808		MONGOLIAN MANCHU COMMA
+1809		MONGOLIAN MANCHU FULL STOP
+180A		MONGOLIAN NIRUGU
+180B		MONGOLIAN FREE VARIATION SELECTOR ONE
+180C		MONGOLIAN FREE VARIATION SELECTOR TWO
+180D		MONGOLIAN FREE VARIATION SELECTOR THREE
+180E		MONGOLIAN VOWEL SEPARATOR
+1810		MONGOLIAN DIGIT ZERO
+1811		MONGOLIAN DIGIT ONE
+1812		MONGOLIAN DIGIT TWO
+1813		MONGOLIAN DIGIT THREE
+1814		MONGOLIAN DIGIT FOUR
+1815		MONGOLIAN DIGIT FIVE
+1816		MONGOLIAN DIGIT SIX
+1817		MONGOLIAN DIGIT SEVEN
+1818		MONGOLIAN DIGIT EIGHT
+1819		MONGOLIAN DIGIT NINE
+1820		MONGOLIAN LETTER A
+1821		MONGOLIAN LETTER E
+1822		MONGOLIAN LETTER I
+1823		MONGOLIAN LETTER O
+1824		MONGOLIAN LETTER U
+1825		MONGOLIAN LETTER OE
+1826		MONGOLIAN LETTER UE
+1827		MONGOLIAN LETTER EE
+1828		MONGOLIAN LETTER NA
+1829		MONGOLIAN LETTER ANG
+182A		MONGOLIAN LETTER BA
+182B		MONGOLIAN LETTER PA
+182C		MONGOLIAN LETTER QA
+182D		MONGOLIAN LETTER GA
+182E		MONGOLIAN LETTER MA
+182F		MONGOLIAN LETTER LA
+1830		MONGOLIAN LETTER SA
+1831		MONGOLIAN LETTER SHA
+1832		MONGOLIAN LETTER TA
+1833		MONGOLIAN LETTER DA
+1834		MONGOLIAN LETTER CHA
+1835		MONGOLIAN LETTER JA
+1836		MONGOLIAN LETTER YA
+1837		MONGOLIAN LETTER RA
+1838		MONGOLIAN LETTER WA
+1839		MONGOLIAN LETTER FA
+183A		MONGOLIAN LETTER KA
+183B		MONGOLIAN LETTER KHA
+183C		MONGOLIAN LETTER TSA
+183D		MONGOLIAN LETTER ZA
+183E		MONGOLIAN LETTER HAA
+183F		MONGOLIAN LETTER ZRA
+1840		MONGOLIAN LETTER LHA
+1841		MONGOLIAN LETTER ZHI
+1842		MONGOLIAN LETTER CHI
+1843		MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844		MONGOLIAN LETTER TODO E
+1845		MONGOLIAN LETTER TODO I
+1846		MONGOLIAN LETTER TODO O
+1847		MONGOLIAN LETTER TODO U
+1848		MONGOLIAN LETTER TODO OE
+1849		MONGOLIAN LETTER TODO UE
+184A		MONGOLIAN LETTER TODO ANG
+184B		MONGOLIAN LETTER TODO BA
+184C		MONGOLIAN LETTER TODO PA
+184D		MONGOLIAN LETTER TODO QA
+184E		MONGOLIAN LETTER TODO GA
+184F		MONGOLIAN LETTER TODO MA
+1850		MONGOLIAN LETTER TODO TA
+1851		MONGOLIAN LETTER TODO DA
+1852		MONGOLIAN LETTER TODO CHA
+1853		MONGOLIAN LETTER TODO JA
+1854		MONGOLIAN LETTER TODO TSA
+1855		MONGOLIAN LETTER TODO YA
+1856		MONGOLIAN LETTER TODO WA
+1857		MONGOLIAN LETTER TODO KA
+1858		MONGOLIAN LETTER TODO GAA
+1859		MONGOLIAN LETTER TODO HAA
+185A		MONGOLIAN LETTER TODO JIA
+185B		MONGOLIAN LETTER TODO NIA
+185C		MONGOLIAN LETTER TODO DZA
+185D		MONGOLIAN LETTER SIBE E
+185E		MONGOLIAN LETTER SIBE I
+185F		MONGOLIAN LETTER SIBE IY
+1860		MONGOLIAN LETTER SIBE UE
+1861		MONGOLIAN LETTER SIBE U
+1862		MONGOLIAN LETTER SIBE ANG
+1863		MONGOLIAN LETTER SIBE KA
+1864		MONGOLIAN LETTER SIBE GA
+1865		MONGOLIAN LETTER SIBE HA
+1866		MONGOLIAN LETTER SIBE PA
+1867		MONGOLIAN LETTER SIBE SHA
+1868		MONGOLIAN LETTER SIBE TA
+1869		MONGOLIAN LETTER SIBE DA
+186A		MONGOLIAN LETTER SIBE JA
+186B		MONGOLIAN LETTER SIBE FA
+186C		MONGOLIAN LETTER SIBE GAA
+186D		MONGOLIAN LETTER SIBE HAA
+186E		MONGOLIAN LETTER SIBE TSA
+186F		MONGOLIAN LETTER SIBE ZA
+1870		MONGOLIAN LETTER SIBE RAA
+1871		MONGOLIAN LETTER SIBE CHA
+1872		MONGOLIAN LETTER SIBE ZHA
+1873		MONGOLIAN LETTER MANCHU I
+1874		MONGOLIAN LETTER MANCHU KA
+1875		MONGOLIAN LETTER MANCHU RA
+1876		MONGOLIAN LETTER MANCHU FA
+1877		MONGOLIAN LETTER MANCHU ZHA
+1880		MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881		MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882		MONGOLIAN LETTER ALI GALI DAMARU
+1883		MONGOLIAN LETTER ALI GALI UBADAMA
+1884		MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885		MONGOLIAN LETTER ALI GALI BALUDA
+1886		MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887		MONGOLIAN LETTER ALI GALI A
+1888		MONGOLIAN LETTER ALI GALI I
+1889		MONGOLIAN LETTER ALI GALI KA
+188A		MONGOLIAN LETTER ALI GALI NGA
+188B		MONGOLIAN LETTER ALI GALI CA
+188C		MONGOLIAN LETTER ALI GALI TTA
+188D		MONGOLIAN LETTER ALI GALI TTHA
+188E		MONGOLIAN LETTER ALI GALI DDA
+188F		MONGOLIAN LETTER ALI GALI NNA
+1890		MONGOLIAN LETTER ALI GALI TA
+1891		MONGOLIAN LETTER ALI GALI DA
+1892		MONGOLIAN LETTER ALI GALI PA
+1893		MONGOLIAN LETTER ALI GALI PHA
+1894		MONGOLIAN LETTER ALI GALI SSA
+1895		MONGOLIAN LETTER ALI GALI ZHA
+1896		MONGOLIAN LETTER ALI GALI ZA
+1897		MONGOLIAN LETTER ALI GALI AH
+1898		MONGOLIAN LETTER TODO ALI GALI TA
+1899		MONGOLIAN LETTER TODO ALI GALI ZHA
+189A		MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B		MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C		MONGOLIAN LETTER MANCHU ALI GALI CA
+189D		MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E		MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F		MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0		MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1		MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2		MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3		MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4		MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5		MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6		MONGOLIAN LETTER ALI GALI HALF U
+18A7		MONGOLIAN LETTER ALI GALI HALF YA
+18A8		MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9		MONGOLIAN LETTER ALI GALI DAGALGA
+1900		LIMBU VOWEL-CARRIER LETTER
+1901		LIMBU LETTER KA
+1902		LIMBU LETTER KHA
+1903		LIMBU LETTER GA
+1904		LIMBU LETTER GHA
+1905		LIMBU LETTER NGA
+1906		LIMBU LETTER CA
+1907		LIMBU LETTER CHA
+1908		LIMBU LETTER JA
+1909		LIMBU LETTER JHA
+190A		LIMBU LETTER YAN
+190B		LIMBU LETTER TA
+190C		LIMBU LETTER THA
+190D		LIMBU LETTER DA
+190E		LIMBU LETTER DHA
+190F		LIMBU LETTER NA
+1910		LIMBU LETTER PA
+1911		LIMBU LETTER PHA
+1912		LIMBU LETTER BA
+1913		LIMBU LETTER BHA
+1914		LIMBU LETTER MA
+1915		LIMBU LETTER YA
+1916		LIMBU LETTER RA
+1917		LIMBU LETTER LA
+1918		LIMBU LETTER WA
+1919		LIMBU LETTER SHA
+191A		LIMBU LETTER SSA
+191B		LIMBU LETTER SA
+191C		LIMBU LETTER HA
+1920		LIMBU VOWEL SIGN A
+1921		LIMBU VOWEL SIGN I
+1922		LIMBU VOWEL SIGN U
+1923		LIMBU VOWEL SIGN EE
+1924		LIMBU VOWEL SIGN AI
+1925		LIMBU VOWEL SIGN OO
+1926		LIMBU VOWEL SIGN AU
+1927		LIMBU VOWEL SIGN E
+1928		LIMBU VOWEL SIGN O
+1929		LIMBU SUBJOINED LETTER YA
+192A		LIMBU SUBJOINED LETTER RA
+192B		LIMBU SUBJOINED LETTER WA
+1930		LIMBU SMALL LETTER KA
+1931		LIMBU SMALL LETTER NGA
+1932		LIMBU SMALL LETTER ANUSVARA
+1933		LIMBU SMALL LETTER TA
+1934		LIMBU SMALL LETTER NA
+1935		LIMBU SMALL LETTER PA
+1936		LIMBU SMALL LETTER MA
+1937		LIMBU SMALL LETTER RA
+1938		LIMBU SMALL LETTER LA
+1939		LIMBU SIGN MUKPHRENG
+193A		LIMBU SIGN KEMPHRENG
+193B		LIMBU SIGN SA-I
+1940		LIMBU SIGN LOO
+1944		LIMBU EXCLAMATION MARK
+1945		LIMBU QUESTION MARK
+1946		LIMBU DIGIT ZERO
+1947		LIMBU DIGIT ONE
+1948		LIMBU DIGIT TWO
+1949		LIMBU DIGIT THREE
+194A		LIMBU DIGIT FOUR
+194B		LIMBU DIGIT FIVE
+194C		LIMBU DIGIT SIX
+194D		LIMBU DIGIT SEVEN
+194E		LIMBU DIGIT EIGHT
+194F		LIMBU DIGIT NINE
+1950		TAI LE LETTER KA
+1951		TAI LE LETTER XA
+1952		TAI LE LETTER NGA
+1953		TAI LE LETTER TSA
+1954		TAI LE LETTER SA
+1955		TAI LE LETTER YA
+1956		TAI LE LETTER TA
+1957		TAI LE LETTER THA
+1958		TAI LE LETTER LA
+1959		TAI LE LETTER PA
+195A		TAI LE LETTER PHA
+195B		TAI LE LETTER MA
+195C		TAI LE LETTER FA
+195D		TAI LE LETTER VA
+195E		TAI LE LETTER HA
+195F		TAI LE LETTER QA
+1960		TAI LE LETTER KHA
+1961		TAI LE LETTER TSHA
+1962		TAI LE LETTER NA
+1963		TAI LE LETTER A
+1964		TAI LE LETTER I
+1965		TAI LE LETTER EE
+1966		TAI LE LETTER EH
+1967		TAI LE LETTER U
+1968		TAI LE LETTER OO
+1969		TAI LE LETTER O
+196A		TAI LE LETTER UE
+196B		TAI LE LETTER E
+196C		TAI LE LETTER AUE
+196D		TAI LE LETTER AI
+1970		TAI LE LETTER TONE-2
+1971		TAI LE LETTER TONE-3
+1972		TAI LE LETTER TONE-4
+1973		TAI LE LETTER TONE-5
+1974		TAI LE LETTER TONE-6
+1980		NEW TAI LUE LETTER HIGH QA
+1981		NEW TAI LUE LETTER LOW QA
+1982		NEW TAI LUE LETTER HIGH KA
+1983		NEW TAI LUE LETTER HIGH XA
+1984		NEW TAI LUE LETTER HIGH NGA
+1985		NEW TAI LUE LETTER LOW KA
+1986		NEW TAI LUE LETTER LOW XA
+1987		NEW TAI LUE LETTER LOW NGA
+1988		NEW TAI LUE LETTER HIGH TSA
+1989		NEW TAI LUE LETTER HIGH SA
+198A		NEW TAI LUE LETTER HIGH YA
+198B		NEW TAI LUE LETTER LOW TSA
+198C		NEW TAI LUE LETTER LOW SA
+198D		NEW TAI LUE LETTER LOW YA
+198E		NEW TAI LUE LETTER HIGH TA
+198F		NEW TAI LUE LETTER HIGH THA
+1990		NEW TAI LUE LETTER HIGH NA
+1991		NEW TAI LUE LETTER LOW TA
+1992		NEW TAI LUE LETTER LOW THA
+1993		NEW TAI LUE LETTER LOW NA
+1994		NEW TAI LUE LETTER HIGH PA
+1995		NEW TAI LUE LETTER HIGH PHA
+1996		NEW TAI LUE LETTER HIGH MA
+1997		NEW TAI LUE LETTER LOW PA
+1998		NEW TAI LUE LETTER LOW PHA
+1999		NEW TAI LUE LETTER LOW MA
+199A		NEW TAI LUE LETTER HIGH FA
+199B		NEW TAI LUE LETTER HIGH VA
+199C		NEW TAI LUE LETTER HIGH LA
+199D		NEW TAI LUE LETTER LOW FA
+199E		NEW TAI LUE LETTER LOW VA
+199F		NEW TAI LUE LETTER LOW LA
+19A0		NEW TAI LUE LETTER HIGH HA
+19A1		NEW TAI LUE LETTER HIGH DA
+19A2		NEW TAI LUE LETTER HIGH BA
+19A3		NEW TAI LUE LETTER LOW HA
+19A4		NEW TAI LUE LETTER LOW DA
+19A5		NEW TAI LUE LETTER LOW BA
+19A6		NEW TAI LUE LETTER HIGH KVA
+19A7		NEW TAI LUE LETTER HIGH XVA
+19A8		NEW TAI LUE LETTER LOW KVA
+19A9		NEW TAI LUE LETTER LOW XVA
+19B0		NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1		NEW TAI LUE VOWEL SIGN AA
+19B2		NEW TAI LUE VOWEL SIGN II
+19B3		NEW TAI LUE VOWEL SIGN U
+19B4		NEW TAI LUE VOWEL SIGN UU
+19B5		NEW TAI LUE VOWEL SIGN E
+19B6		NEW TAI LUE VOWEL SIGN AE
+19B7		NEW TAI LUE VOWEL SIGN O
+19B8		NEW TAI LUE VOWEL SIGN OA
+19B9		NEW TAI LUE VOWEL SIGN UE
+19BA		NEW TAI LUE VOWEL SIGN AY
+19BB		NEW TAI LUE VOWEL SIGN AAY
+19BC		NEW TAI LUE VOWEL SIGN UY
+19BD		NEW TAI LUE VOWEL SIGN OY
+19BE		NEW TAI LUE VOWEL SIGN OAY
+19BF		NEW TAI LUE VOWEL SIGN UEY
+19C0		NEW TAI LUE VOWEL SIGN IY
+19C1		NEW TAI LUE LETTER FINAL V
+19C2		NEW TAI LUE LETTER FINAL NG
+19C3		NEW TAI LUE LETTER FINAL N
+19C4		NEW TAI LUE LETTER FINAL M
+19C5		NEW TAI LUE LETTER FINAL K
+19C6		NEW TAI LUE LETTER FINAL D
+19C7		NEW TAI LUE LETTER FINAL B
+19C8		NEW TAI LUE TONE MARK-1
+19C9		NEW TAI LUE TONE MARK-2
+19D0		NEW TAI LUE DIGIT ZERO
+19D1		NEW TAI LUE DIGIT ONE
+19D2		NEW TAI LUE DIGIT TWO
+19D3		NEW TAI LUE DIGIT THREE
+19D4		NEW TAI LUE DIGIT FOUR
+19D5		NEW TAI LUE DIGIT FIVE
+19D6		NEW TAI LUE DIGIT SIX
+19D7		NEW TAI LUE DIGIT SEVEN
+19D8		NEW TAI LUE DIGIT EIGHT
+19D9		NEW TAI LUE DIGIT NINE
+19DE		NEW TAI LUE SIGN LAE
+19DF		NEW TAI LUE SIGN LAEV
+19E0		KHMER SYMBOL PATHAMASAT
+19E1		KHMER SYMBOL MUOY KOET
+19E2		KHMER SYMBOL PII KOET
+19E3		KHMER SYMBOL BEI KOET
+19E4		KHMER SYMBOL BUON KOET
+19E5		KHMER SYMBOL PRAM KOET
+19E6		KHMER SYMBOL PRAM-MUOY KOET
+19E7		KHMER SYMBOL PRAM-PII KOET
+19E8		KHMER SYMBOL PRAM-BEI KOET
+19E9		KHMER SYMBOL PRAM-BUON KOET
+19EA		KHMER SYMBOL DAP KOET
+19EB		KHMER SYMBOL DAP-MUOY KOET
+19EC		KHMER SYMBOL DAP-PII KOET
+19ED		KHMER SYMBOL DAP-BEI KOET
+19EE		KHMER SYMBOL DAP-BUON KOET
+19EF		KHMER SYMBOL DAP-PRAM KOET
+19F0		KHMER SYMBOL TUTEYASAT
+19F1		KHMER SYMBOL MUOY ROC
+19F2		KHMER SYMBOL PII ROC
+19F3		KHMER SYMBOL BEI ROC
+19F4		KHMER SYMBOL BUON ROC
+19F5		KHMER SYMBOL PRAM ROC
+19F6		KHMER SYMBOL PRAM-MUOY ROC
+19F7		KHMER SYMBOL PRAM-PII ROC
+19F8		KHMER SYMBOL PRAM-BEI ROC
+19F9		KHMER SYMBOL PRAM-BUON ROC
+19FA		KHMER SYMBOL DAP ROC
+19FB		KHMER SYMBOL DAP-MUOY ROC
+19FC		KHMER SYMBOL DAP-PII ROC
+19FD		KHMER SYMBOL DAP-BEI ROC
+19FE		KHMER SYMBOL DAP-BUON ROC
+19FF		KHMER SYMBOL DAP-PRAM ROC
+1A00		BUGINESE LETTER KA
+1A01		BUGINESE LETTER GA
+1A02		BUGINESE LETTER NGA
+1A03		BUGINESE LETTER NGKA
+1A04		BUGINESE LETTER PA
+1A05		BUGINESE LETTER BA
+1A06		BUGINESE LETTER MA
+1A07		BUGINESE LETTER MPA
+1A08		BUGINESE LETTER TA
+1A09		BUGINESE LETTER DA
+1A0A		BUGINESE LETTER NA
+1A0B		BUGINESE LETTER NRA
+1A0C		BUGINESE LETTER CA
+1A0D		BUGINESE LETTER JA
+1A0E		BUGINESE LETTER NYA
+1A0F		BUGINESE LETTER NYCA
+1A10		BUGINESE LETTER YA
+1A11		BUGINESE LETTER RA
+1A12		BUGINESE LETTER LA
+1A13		BUGINESE LETTER VA
+1A14		BUGINESE LETTER SA
+1A15		BUGINESE LETTER A
+1A16		BUGINESE LETTER HA
+1A17		BUGINESE VOWEL SIGN I
+1A18		BUGINESE VOWEL SIGN U
+1A19		BUGINESE VOWEL SIGN E
+1A1A		BUGINESE VOWEL SIGN O
+1A1B		BUGINESE VOWEL SIGN AE
+1A1E		BUGINESE PALLAWA
+1A1F		BUGINESE END OF SECTION
+1D00		LATIN LETTER SMALL CAPITAL A
+1D01		LATIN LETTER SMALL CAPITAL AE
+1D02		LATIN SMALL LETTER TURNED AE
+1D03		LATIN LETTER SMALL CAPITAL BARRED B
+1D04		LATIN LETTER SMALL CAPITAL C
+1D05		LATIN LETTER SMALL CAPITAL D
+1D06		LATIN LETTER SMALL CAPITAL ETH
+1D07		LATIN LETTER SMALL CAPITAL E
+1D08		LATIN SMALL LETTER TURNED OPEN E
+1D09		LATIN SMALL LETTER TURNED I
+1D0A		LATIN LETTER SMALL CAPITAL J
+1D0B		LATIN LETTER SMALL CAPITAL K
+1D0C		LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D		LATIN LETTER SMALL CAPITAL M
+1D0E		LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F		LATIN LETTER SMALL CAPITAL O
+1D10		LATIN LETTER SMALL CAPITAL OPEN O
+1D11		LATIN SMALL LETTER SIDEWAYS O
+1D12		LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13		LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14		LATIN SMALL LETTER TURNED OE
+1D15		LATIN LETTER SMALL CAPITAL OU
+1D16		LATIN SMALL LETTER TOP HALF O
+1D17		LATIN SMALL LETTER BOTTOM HALF O
+1D18		LATIN LETTER SMALL CAPITAL P
+1D19		LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A		LATIN LETTER SMALL CAPITAL TURNED R
+1D1B		LATIN LETTER SMALL CAPITAL T
+1D1C		LATIN LETTER SMALL CAPITAL U
+1D1D		LATIN SMALL LETTER SIDEWAYS U
+1D1E		LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D1F		LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20		LATIN LETTER SMALL CAPITAL V
+1D21		LATIN LETTER SMALL CAPITAL W
+1D22		LATIN LETTER SMALL CAPITAL Z
+1D23		LATIN LETTER SMALL CAPITAL EZH
+1D24		LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25		LATIN LETTER AIN
+1D26		GREEK LETTER SMALL CAPITAL GAMMA
+1D27		GREEK LETTER SMALL CAPITAL LAMDA
+1D28		GREEK LETTER SMALL CAPITAL PI
+1D29		GREEK LETTER SMALL CAPITAL RHO
+1D2A		GREEK LETTER SMALL CAPITAL PSI
+1D2B		CYRILLIC LETTER SMALL CAPITAL EL
+1D2C		MODIFIER LETTER CAPITAL A
+1D2D		MODIFIER LETTER CAPITAL AE
+1D2E		MODIFIER LETTER CAPITAL B
+1D2F		MODIFIER LETTER CAPITAL BARRED B
+1D30		MODIFIER LETTER CAPITAL D
+1D31		MODIFIER LETTER CAPITAL E
+1D32		MODIFIER LETTER CAPITAL REVERSED E
+1D33		MODIFIER LETTER CAPITAL G
+1D34		MODIFIER LETTER CAPITAL H
+1D35		MODIFIER LETTER CAPITAL I
+1D36		MODIFIER LETTER CAPITAL J
+1D37		MODIFIER LETTER CAPITAL K
+1D38		MODIFIER LETTER CAPITAL L
+1D39		MODIFIER LETTER CAPITAL M
+1D3A		MODIFIER LETTER CAPITAL N
+1D3B		MODIFIER LETTER CAPITAL REVERSED N
+1D3C		MODIFIER LETTER CAPITAL O
+1D3D		MODIFIER LETTER CAPITAL OU
+1D3E		MODIFIER LETTER CAPITAL P
+1D3F		MODIFIER LETTER CAPITAL R
+1D40		MODIFIER LETTER CAPITAL T
+1D41		MODIFIER LETTER CAPITAL U
+1D42		MODIFIER LETTER CAPITAL W
+1D43		MODIFIER LETTER SMALL A
+1D44		MODIFIER LETTER SMALL TURNED A
+1D45		MODIFIER LETTER SMALL ALPHA
+1D46		MODIFIER LETTER SMALL TURNED AE
+1D47		MODIFIER LETTER SMALL B
+1D48		MODIFIER LETTER SMALL D
+1D49		MODIFIER LETTER SMALL E
+1D4A		MODIFIER LETTER SMALL SCHWA
+1D4B		MODIFIER LETTER SMALL OPEN E
+1D4C		MODIFIER LETTER SMALL TURNED OPEN E
+1D4D		MODIFIER LETTER SMALL G
+1D4E		MODIFIER LETTER SMALL TURNED I
+1D4F		MODIFIER LETTER SMALL K
+1D50		MODIFIER LETTER SMALL M
+1D51		MODIFIER LETTER SMALL ENG
+1D52		MODIFIER LETTER SMALL O
+1D53		MODIFIER LETTER SMALL OPEN O
+1D54		MODIFIER LETTER SMALL TOP HALF O
+1D55		MODIFIER LETTER SMALL BOTTOM HALF O
+1D56		MODIFIER LETTER SMALL P
+1D57		MODIFIER LETTER SMALL T
+1D58		MODIFIER LETTER SMALL U
+1D59		MODIFIER LETTER SMALL SIDEWAYS U
+1D5A		MODIFIER LETTER SMALL TURNED M
+1D5B		MODIFIER LETTER SMALL V
+1D5C		MODIFIER LETTER SMALL AIN
+1D5D		MODIFIER LETTER SMALL BETA
+1D5E		MODIFIER LETTER SMALL GREEK GAMMA
+1D5F		MODIFIER LETTER SMALL DELTA
+1D60		MODIFIER LETTER SMALL GREEK PHI
+1D61		MODIFIER LETTER SMALL CHI
+1D62		LATIN SUBSCRIPT SMALL LETTER I
+1D63		LATIN SUBSCRIPT SMALL LETTER R
+1D64		LATIN SUBSCRIPT SMALL LETTER U
+1D65		LATIN SUBSCRIPT SMALL LETTER V
+1D66		GREEK SUBSCRIPT SMALL LETTER BETA
+1D67		GREEK SUBSCRIPT SMALL LETTER GAMMA
+1D68		GREEK SUBSCRIPT SMALL LETTER RHO
+1D69		GREEK SUBSCRIPT SMALL LETTER PHI
+1D6A		GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B		LATIN SMALL LETTER UE
+1D6C		LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D6D		LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D6E		LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D6F		LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D70		LATIN SMALL LETTER N WITH MIDDLE TILDE
+1D71		LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D72		LATIN SMALL LETTER R WITH MIDDLE TILDE
+1D73		LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+1D74		LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D75		LATIN SMALL LETTER T WITH MIDDLE TILDE
+1D76		LATIN SMALL LETTER Z WITH MIDDLE TILDE
+1D77		LATIN SMALL LETTER TURNED G
+1D78		MODIFIER LETTER CYRILLIC EN
+1D79		LATIN SMALL LETTER INSULAR G
+1D7A		LATIN SMALL LETTER TH WITH STRIKETHROUGH
+1D7B		LATIN SMALL CAPITAL LETTER I WITH STROKE
+1D7C		LATIN SMALL LETTER IOTA WITH STROKE
+1D7D		LATIN SMALL LETTER P WITH STROKE
+1D7E		LATIN SMALL CAPITAL LETTER U WITH STROKE
+1D7F		LATIN SMALL LETTER UPSILON WITH STROKE
+1D80		LATIN SMALL LETTER B WITH PALATAL HOOK
+1D81		LATIN SMALL LETTER D WITH PALATAL HOOK
+1D82		LATIN SMALL LETTER F WITH PALATAL HOOK
+1D83		LATIN SMALL LETTER G WITH PALATAL HOOK
+1D84		LATIN SMALL LETTER K WITH PALATAL HOOK
+1D85		LATIN SMALL LETTER L WITH PALATAL HOOK
+1D86		LATIN SMALL LETTER M WITH PALATAL HOOK
+1D87		LATIN SMALL LETTER N WITH PALATAL HOOK
+1D88		LATIN SMALL LETTER P WITH PALATAL HOOK
+1D89		LATIN SMALL LETTER R WITH PALATAL HOOK
+1D8A		LATIN SMALL LETTER S WITH PALATAL HOOK
+1D8B		LATIN SMALL LETTER ESH WITH PALATAL HOOK
+1D8C		LATIN SMALL LETTER V WITH PALATAL HOOK
+1D8D		LATIN SMALL LETTER X WITH PALATAL HOOK
+1D8E		LATIN SMALL LETTER Z WITH PALATAL HOOK
+1D8F		LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D90		LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+1D91		LATIN SMALL LETTER D WITH HOOK AND TAIL
+1D92		LATIN SMALL LETTER E WITH RETROFLEX HOOK
+1D93		LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+1D94		LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+1D95		LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+1D96		LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1D97		LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+1D98		LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+1D99		LATIN SMALL LETTER U WITH RETROFLEX HOOK
+1D9A		LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B		MODIFIER LETTER SMALL TURNED ALPHA
+1D9C		MODIFIER LETTER SMALL C
+1D9D		MODIFIER LETTER SMALL C WITH CURL
+1D9E		MODIFIER LETTER SMALL ETH
+1D9F		MODIFIER LETTER SMALL REVERSED OPEN E
+1DA0		MODIFIER LETTER SMALL F
+1DA1		MODIFIER LETTER SMALL DOTLESS J WITH STROKE
+1DA2		MODIFIER LETTER SMALL SCRIPT G
+1DA3		MODIFIER LETTER SMALL TURNED H
+1DA4		MODIFIER LETTER SMALL I WITH STROKE
+1DA5		MODIFIER LETTER SMALL IOTA
+1DA6		MODIFIER LETTER SMALL CAPITAL I
+1DA7		MODIFIER LETTER SMALL CAPITAL I WITH STROKE
+1DA8		MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+1DA9		MODIFIER LETTER SMALL L WITH RETROFLEX HOOK
+1DAA		MODIFIER LETTER SMALL L WITH PALATAL HOOK
+1DAB		MODIFIER LETTER SMALL CAPITAL L
+1DAC		MODIFIER LETTER SMALL M WITH HOOK
+1DAD		MODIFIER LETTER SMALL TURNED M WITH LONG LEG
+1DAE		MODIFIER LETTER SMALL N WITH LEFT HOOK
+1DAF		MODIFIER LETTER SMALL N WITH RETROFLEX HOOK
+1DB0		MODIFIER LETTER SMALL CAPITAL N
+1DB1		MODIFIER LETTER SMALL BARRED O
+1DB2		MODIFIER LETTER SMALL PHI
+1DB3		MODIFIER LETTER SMALL S WITH HOOK
+1DB4		MODIFIER LETTER SMALL ESH
+1DB5		MODIFIER LETTER SMALL T WITH PALATAL HOOK
+1DB6		MODIFIER LETTER SMALL U BAR
+1DB7		MODIFIER LETTER SMALL UPSILON
+1DB8		MODIFIER LETTER SMALL CAPITAL U
+1DB9		MODIFIER LETTER SMALL V WITH HOOK
+1DBA		MODIFIER LETTER SMALL TURNED V
+1DBB		MODIFIER LETTER SMALL Z
+1DBC		MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK
+1DBD		MODIFIER LETTER SMALL Z WITH CURL
+1DBE		MODIFIER LETTER SMALL EZH
+1DBF		MODIFIER LETTER SMALL THETA
+1DC0		COMBINING DOTTED GRAVE ACCENT
+1DC1		COMBINING DOTTED ACUTE ACCENT
+1DC2		COMBINING SNAKE BELOW
+1DC3		COMBINING SUSPENSION MARK
+1E00		LATIN CAPITAL LETTER A WITH RING BELOW
+1E01		LATIN SMALL LETTER A WITH RING BELOW
+1E02		LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E03		LATIN SMALL LETTER B WITH DOT ABOVE
+1E04		LATIN CAPITAL LETTER B WITH DOT BELOW
+1E05		LATIN SMALL LETTER B WITH DOT BELOW
+1E06		LATIN CAPITAL LETTER B WITH LINE BELOW
+1E07		LATIN SMALL LETTER B WITH LINE BELOW
+1E08		LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E09		LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0A		LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0B		LATIN SMALL LETTER D WITH DOT ABOVE
+1E0C		LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0D		LATIN SMALL LETTER D WITH DOT BELOW
+1E0E		LATIN CAPITAL LETTER D WITH LINE BELOW
+1E0F		LATIN SMALL LETTER D WITH LINE BELOW
+1E10		LATIN CAPITAL LETTER D WITH CEDILLA
+1E11		LATIN SMALL LETTER D WITH CEDILLA
+1E12		LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E13		LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E14		LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E15		LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E16		LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E17		LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E18		LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E19		LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1A		LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1B		LATIN SMALL LETTER E WITH TILDE BELOW
+1E1C		LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1D		LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1E		LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E1F		LATIN SMALL LETTER F WITH DOT ABOVE
+1E20		LATIN CAPITAL LETTER G WITH MACRON
+1E21		LATIN SMALL LETTER G WITH MACRON
+1E22		LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E23		LATIN SMALL LETTER H WITH DOT ABOVE
+1E24		LATIN CAPITAL LETTER H WITH DOT BELOW
+1E25		LATIN SMALL LETTER H WITH DOT BELOW
+1E26		LATIN CAPITAL LETTER H WITH DIAERESIS
+1E27		LATIN SMALL LETTER H WITH DIAERESIS
+1E28		LATIN CAPITAL LETTER H WITH CEDILLA
+1E29		LATIN SMALL LETTER H WITH CEDILLA
+1E2A		LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2B		LATIN SMALL LETTER H WITH BREVE BELOW
+1E2C		LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2D		LATIN SMALL LETTER I WITH TILDE BELOW
+1E2E		LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E2F		LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E30		LATIN CAPITAL LETTER K WITH ACUTE
+1E31		LATIN SMALL LETTER K WITH ACUTE
+1E32		LATIN CAPITAL LETTER K WITH DOT BELOW
+1E33		LATIN SMALL LETTER K WITH DOT BELOW
+1E34		LATIN CAPITAL LETTER K WITH LINE BELOW
+1E35		LATIN SMALL LETTER K WITH LINE BELOW
+1E36		LATIN CAPITAL LETTER L WITH DOT BELOW
+1E37		LATIN SMALL LETTER L WITH DOT BELOW
+1E38		LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E39		LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3A		LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3B		LATIN SMALL LETTER L WITH LINE BELOW
+1E3C		LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3D		LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3E		LATIN CAPITAL LETTER M WITH ACUTE
+1E3F		LATIN SMALL LETTER M WITH ACUTE
+1E40		LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E41		LATIN SMALL LETTER M WITH DOT ABOVE
+1E42		LATIN CAPITAL LETTER M WITH DOT BELOW
+1E43		LATIN SMALL LETTER M WITH DOT BELOW
+1E44		LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E45		LATIN SMALL LETTER N WITH DOT ABOVE
+1E46		LATIN CAPITAL LETTER N WITH DOT BELOW
+1E47		LATIN SMALL LETTER N WITH DOT BELOW
+1E48		LATIN CAPITAL LETTER N WITH LINE BELOW
+1E49		LATIN SMALL LETTER N WITH LINE BELOW
+1E4A		LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4B		LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4C		LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4D		LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4E		LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E4F		LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E50		LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E51		LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E52		LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E53		LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E54		LATIN CAPITAL LETTER P WITH ACUTE
+1E55		LATIN SMALL LETTER P WITH ACUTE
+1E56		LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E57		LATIN SMALL LETTER P WITH DOT ABOVE
+1E58		LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E59		LATIN SMALL LETTER R WITH DOT ABOVE
+1E5A		LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5B		LATIN SMALL LETTER R WITH DOT BELOW
+1E5C		LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5D		LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5E		LATIN CAPITAL LETTER R WITH LINE BELOW
+1E5F		LATIN SMALL LETTER R WITH LINE BELOW
+1E60		LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E61		LATIN SMALL LETTER S WITH DOT ABOVE
+1E62		LATIN CAPITAL LETTER S WITH DOT BELOW
+1E63		LATIN SMALL LETTER S WITH DOT BELOW
+1E64		LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E65		LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E66		LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E67		LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E68		LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E69		LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A		LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6B		LATIN SMALL LETTER T WITH DOT ABOVE
+1E6C		LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6D		LATIN SMALL LETTER T WITH DOT BELOW
+1E6E		LATIN CAPITAL LETTER T WITH LINE BELOW
+1E6F		LATIN SMALL LETTER T WITH LINE BELOW
+1E70		LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E71		LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E72		LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E73		LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E74		LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E75		LATIN SMALL LETTER U WITH TILDE BELOW
+1E76		LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E77		LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E78		LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E79		LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7A		LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7B		LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7C		LATIN CAPITAL LETTER V WITH TILDE
+1E7D		LATIN SMALL LETTER V WITH TILDE
+1E7E		LATIN CAPITAL LETTER V WITH DOT BELOW
+1E7F		LATIN SMALL LETTER V WITH DOT BELOW
+1E80		LATIN CAPITAL LETTER W WITH GRAVE
+1E81		LATIN SMALL LETTER W WITH GRAVE
+1E82		LATIN CAPITAL LETTER W WITH ACUTE
+1E83		LATIN SMALL LETTER W WITH ACUTE
+1E84		LATIN CAPITAL LETTER W WITH DIAERESIS
+1E85		LATIN SMALL LETTER W WITH DIAERESIS
+1E86		LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E87		LATIN SMALL LETTER W WITH DOT ABOVE
+1E88		LATIN CAPITAL LETTER W WITH DOT BELOW
+1E89		LATIN SMALL LETTER W WITH DOT BELOW
+1E8A		LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8B		LATIN SMALL LETTER X WITH DOT ABOVE
+1E8C		LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8D		LATIN SMALL LETTER X WITH DIAERESIS
+1E8E		LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E8F		LATIN SMALL LETTER Y WITH DOT ABOVE
+1E90		LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E91		LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E92		LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E93		LATIN SMALL LETTER Z WITH DOT BELOW
+1E94		LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E95		LATIN SMALL LETTER Z WITH LINE BELOW
+1E96		LATIN SMALL LETTER H WITH LINE BELOW
+1E97		LATIN SMALL LETTER T WITH DIAERESIS
+1E98		LATIN SMALL LETTER W WITH RING ABOVE
+1E99		LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A		LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B		LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0		LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA1		LATIN SMALL LETTER A WITH DOT BELOW
+1EA2		LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA3		LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA4		LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA5		LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6		LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA7		LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8		LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EA9		LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA		LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAB		LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC		LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAD		LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE		LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EAF		LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB0		LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB1		LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB2		LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB3		LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4		LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB5		LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB6		LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB7		LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB8		LATIN CAPITAL LETTER E WITH DOT BELOW
+1EB9		LATIN SMALL LETTER E WITH DOT BELOW
+1EBA		LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBB		LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBC		LATIN CAPITAL LETTER E WITH TILDE
+1EBD		LATIN SMALL LETTER E WITH TILDE
+1EBE		LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EBF		LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0		LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC1		LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2		LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC3		LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4		LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC5		LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6		LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC7		LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8		LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1EC9		LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECA		LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECB		LATIN SMALL LETTER I WITH DOT BELOW
+1ECC		LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECD		LATIN SMALL LETTER O WITH DOT BELOW
+1ECE		LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ECF		LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED0		LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED1		LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2		LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED3		LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4		LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED5		LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6		LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED7		LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8		LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1ED9		LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA		LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDB		LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDC		LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDD		LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDE		LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EDF		LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE0		LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE1		LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE2		LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE3		LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE4		LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE5		LATIN SMALL LETTER U WITH DOT BELOW
+1EE6		LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE7		LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE8		LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EE9		LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEA		LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEB		LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EEC		LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EED		LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEE		LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EEF		LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF0		LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF1		LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF2		LATIN CAPITAL LETTER Y WITH GRAVE
+1EF3		LATIN SMALL LETTER Y WITH GRAVE
+1EF4		LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF5		LATIN SMALL LETTER Y WITH DOT BELOW
+1EF6		LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF7		LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF8		LATIN CAPITAL LETTER Y WITH TILDE
+1EF9		LATIN SMALL LETTER Y WITH TILDE
+1F00		GREEK SMALL LETTER ALPHA WITH PSILI
+1F01		GREEK SMALL LETTER ALPHA WITH DASIA
+1F02		GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+1F03		GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+1F04		GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+1F05		GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+1F06		GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F07		GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F08		GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09		GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A		GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B		GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C		GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D		GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E		GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F		GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10		GREEK SMALL LETTER EPSILON WITH PSILI
+1F11		GREEK SMALL LETTER EPSILON WITH DASIA
+1F12		GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+1F13		GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+1F14		GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+1F15		GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18		GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19		GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A		GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B		GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C		GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D		GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20		GREEK SMALL LETTER ETA WITH PSILI
+1F21		GREEK SMALL LETTER ETA WITH DASIA
+1F22		GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+1F23		GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+1F24		GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+1F25		GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+1F26		GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+1F27		GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F28		GREEK CAPITAL LETTER ETA WITH PSILI
+1F29		GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A		GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B		GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C		GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D		GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E		GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F		GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30		GREEK SMALL LETTER IOTA WITH PSILI
+1F31		GREEK SMALL LETTER IOTA WITH DASIA
+1F32		GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+1F33		GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+1F34		GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+1F35		GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+1F36		GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F37		GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F38		GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39		GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A		GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B		GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C		GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D		GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E		GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F		GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40		GREEK SMALL LETTER OMICRON WITH PSILI
+1F41		GREEK SMALL LETTER OMICRON WITH DASIA
+1F42		GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+1F43		GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+1F44		GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+1F45		GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48		GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49		GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A		GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B		GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C		GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D		GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50		GREEK SMALL LETTER UPSILON WITH PSILI
+1F51		GREEK SMALL LETTER UPSILON WITH DASIA
+1F52		GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F53		GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+1F54		GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F55		GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+1F56		GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F57		GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59		GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B		GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D		GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F		GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60		GREEK SMALL LETTER OMEGA WITH PSILI
+1F61		GREEK SMALL LETTER OMEGA WITH DASIA
+1F62		GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+1F63		GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+1F64		GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+1F65		GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+1F66		GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F67		GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F68		GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69		GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A		GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B		GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C		GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D		GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E		GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F		GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70		GREEK SMALL LETTER ALPHA WITH VARIA
+1F71		GREEK SMALL LETTER ALPHA WITH OXIA
+1F72		GREEK SMALL LETTER EPSILON WITH VARIA
+1F73		GREEK SMALL LETTER EPSILON WITH OXIA
+1F74		GREEK SMALL LETTER ETA WITH VARIA
+1F75		GREEK SMALL LETTER ETA WITH OXIA
+1F76		GREEK SMALL LETTER IOTA WITH VARIA
+1F77		GREEK SMALL LETTER IOTA WITH OXIA
+1F78		GREEK SMALL LETTER OMICRON WITH VARIA
+1F79		GREEK SMALL LETTER OMICRON WITH OXIA
+1F7A		GREEK SMALL LETTER UPSILON WITH VARIA
+1F7B		GREEK SMALL LETTER UPSILON WITH OXIA
+1F7C		GREEK SMALL LETTER OMEGA WITH VARIA
+1F7D		GREEK SMALL LETTER OMEGA WITH OXIA
+1F80		GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81		GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82		GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83		GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84		GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85		GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86		GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87		GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88		GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89		GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A		GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B		GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C		GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D		GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E		GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F		GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90		GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91		GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92		GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93		GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94		GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95		GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96		GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97		GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98		GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99		GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A		GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B		GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C		GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D		GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E		GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F		GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0		GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1		GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2		GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3		GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4		GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5		GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6		GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7		GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8		GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9		GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA		GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB		GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC		GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD		GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE		GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF		GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB0		GREEK SMALL LETTER ALPHA WITH VRACHY
+1FB1		GREEK SMALL LETTER ALPHA WITH MACRON
+1FB2		GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3		GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4		GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6		GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7		GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8		GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9		GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA		GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB		GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC		GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD		GREEK KORONIS
+1FBE		GREEK PROSGEGRAMMENI
+1FBF		GREEK PSILI
+1FC0		GREEK PERISPOMENI
+1FC1		GREEK DIALYTIKA AND PERISPOMENI
+1FC2		GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3		GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4		GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6		GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7		GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8		GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9		GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA		GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB		GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC		GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD		GREEK PSILI AND VARIA
+1FCE		GREEK PSILI AND OXIA
+1FCF		GREEK PSILI AND PERISPOMENI
+1FD0		GREEK SMALL LETTER IOTA WITH VRACHY
+1FD1		GREEK SMALL LETTER IOTA WITH MACRON
+1FD2		GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3		GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6		GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7		GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8		GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9		GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA		GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB		GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD		GREEK DASIA AND VARIA
+1FDE		GREEK DASIA AND OXIA
+1FDF		GREEK DASIA AND PERISPOMENI
+1FE0		GREEK SMALL LETTER UPSILON WITH VRACHY
+1FE1		GREEK SMALL LETTER UPSILON WITH MACRON
+1FE2		GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3		GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4		GREEK SMALL LETTER RHO WITH PSILI
+1FE5		GREEK SMALL LETTER RHO WITH DASIA
+1FE6		GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7		GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8		GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9		GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA		GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB		GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC		GREEK CAPITAL LETTER RHO WITH DASIA
+1FED		GREEK DIALYTIKA AND VARIA
+1FEE		GREEK DIALYTIKA AND OXIA
+1FEF		GREEK VARIA
+1FF2		GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3		GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4		GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6		GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7		GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8		GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9		GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA		GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB		GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC		GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD		GREEK OXIA
+1FFE		GREEK DASIA
+2000		EN QUAD
+2001		EM QUAD
+2002		EN SPACE
+2003		EM SPACE
+2004		THREE-PER-EM SPACE
+2005		FOUR-PER-EM SPACE
+2006		SIX-PER-EM SPACE
+2007		FIGURE SPACE
+2008		PUNCTUATION SPACE
+2009		THIN SPACE
+200A		HAIR SPACE
+200B		ZERO WIDTH SPACE
+200C		ZERO WIDTH NON-JOINER
+200D		ZERO WIDTH JOINER
+200E		LEFT-TO-RIGHT MARK
+200F		RIGHT-TO-LEFT MARK
+2010		HYPHEN
+2011		NON-BREAKING HYPHEN
+2012		FIGURE DASH
+2013		EN DASH
+2014		EM DASH
+2015		HORIZONTAL BAR
+2016		DOUBLE VERTICAL LINE
+2017		DOUBLE LOW LINE
+2018		LEFT SINGLE QUOTATION MARK
+2019		RIGHT SINGLE QUOTATION MARK
+201A		SINGLE LOW-9 QUOTATION MARK
+201B		SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C		LEFT DOUBLE QUOTATION MARK
+201D		RIGHT DOUBLE QUOTATION MARK
+201E		DOUBLE LOW-9 QUOTATION MARK
+201F		DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020		DAGGER
+2021		DOUBLE DAGGER
+2022		BULLET
+2023		TRIANGULAR BULLET
+2024		ONE DOT LEADER
+2025		TWO DOT LEADER
+2026		HORIZONTAL ELLIPSIS
+2027		HYPHENATION POINT
+2028		LINE SEPARATOR
+2029		PARAGRAPH SEPARATOR
+202A		LEFT-TO-RIGHT EMBEDDING
+202B		RIGHT-TO-LEFT EMBEDDING
+202C		POP DIRECTIONAL FORMATTING
+202D		LEFT-TO-RIGHT OVERRIDE
+202E		RIGHT-TO-LEFT OVERRIDE
+202F		NARROW NO-BREAK SPACE
+2030		PER MILLE SIGN
+2031		PER TEN THOUSAND SIGN
+2032		PRIME
+2033		DOUBLE PRIME
+2034		TRIPLE PRIME
+2035		REVERSED PRIME
+2036		REVERSED DOUBLE PRIME
+2037		REVERSED TRIPLE PRIME
+2038		CARET
+2039		SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A		SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B		REFERENCE MARK
+203C		DOUBLE EXCLAMATION MARK
+203D		INTERROBANG
+203E		OVERLINE
+203F		UNDERTIE
+2040		CHARACTER TIE
+2041		CARET INSERTION POINT
+2042		ASTERISM
+2043		HYPHEN BULLET
+2044		FRACTION SLASH
+2045		LEFT SQUARE BRACKET WITH QUILL
+2046		RIGHT SQUARE BRACKET WITH QUILL
+2047		DOUBLE QUESTION MARK
+2048		QUESTION EXCLAMATION MARK
+2049		EXCLAMATION QUESTION MARK
+204A		TIRONIAN SIGN ET
+204B		REVERSED PILCROW SIGN
+204C		BLACK LEFTWARDS BULLET
+204D		BLACK RIGHTWARDS BULLET
+204E		LOW ASTERISK
+204F		REVERSED SEMICOLON
+2050		CLOSE UP
+2051		TWO ASTERISKS ALIGNED VERTICALLY
+2052		COMMERCIAL MINUS SIGN
+2053		SWUNG DASH
+2054		INVERTED UNDERTIE
+2055		FLOWER PUNCTUATION MARK
+2056		THREE DOT PUNCTUATION
+2057		QUADRUPLE PRIME
+2058		FOUR DOT PUNCTUATION
+2059		FIVE DOT PUNCTUATION
+205A		TWO DOT PUNCTUATION
+205B		FOUR DOT MARK
+205C		DOTTED CROSS
+205D		TRICOLON
+205E		VERTICAL FOUR DOTS
+205F		MEDIUM MATHEMATICAL SPACE
+2060		WORD JOINER
+2061		FUNCTION APPLICATION
+2062		INVISIBLE TIMES
+2063		INVISIBLE SEPARATOR
+206A		INHIBIT SYMMETRIC SWAPPING
+206B		ACTIVATE SYMMETRIC SWAPPING
+206C		INHIBIT ARABIC FORM SHAPING
+206D		ACTIVATE ARABIC FORM SHAPING
+206E		NATIONAL DIGIT SHAPES
+206F		NOMINAL DIGIT SHAPES
+2070		SUPERSCRIPT ZERO
+2071		SUPERSCRIPT LATIN SMALL LETTER I
+2074		SUPERSCRIPT FOUR
+2075		SUPERSCRIPT FIVE
+2076		SUPERSCRIPT SIX
+2077		SUPERSCRIPT SEVEN
+2078		SUPERSCRIPT EIGHT
+2079		SUPERSCRIPT NINE
+207A		SUPERSCRIPT PLUS SIGN
+207B		SUPERSCRIPT MINUS
+207C		SUPERSCRIPT EQUALS SIGN
+207D		SUPERSCRIPT LEFT PARENTHESIS
+207E		SUPERSCRIPT RIGHT PARENTHESIS
+207F		SUPERSCRIPT LATIN SMALL LETTER N
+2080		SUBSCRIPT ZERO
+2081		SUBSCRIPT ONE
+2082		SUBSCRIPT TWO
+2083		SUBSCRIPT THREE
+2084		SUBSCRIPT FOUR
+2085		SUBSCRIPT FIVE
+2086		SUBSCRIPT SIX
+2087		SUBSCRIPT SEVEN
+2088		SUBSCRIPT EIGHT
+2089		SUBSCRIPT NINE
+208A		SUBSCRIPT PLUS SIGN
+208B		SUBSCRIPT MINUS
+208C		SUBSCRIPT EQUALS SIGN
+208D		SUBSCRIPT LEFT PARENTHESIS
+208E		SUBSCRIPT RIGHT PARENTHESIS
+2090		LATIN SUBSCRIPT SMALL LETTER A
+2091		LATIN SUBSCRIPT SMALL LETTER E
+2092		LATIN SUBSCRIPT SMALL LETTER O
+2093		LATIN SUBSCRIPT SMALL LETTER X
+2094		LATIN SUBSCRIPT SMALL LETTER SCHWA
+20A0		EURO-CURRENCY SIGN
+20A1		COLON SIGN
+20A2		CRUZEIRO SIGN
+20A3		FRENCH FRANC SIGN
+20A4		LIRA SIGN
+20A5		MILL SIGN
+20A6		NAIRA SIGN
+20A7		PESETA SIGN
+20A8		RUPEE SIGN
+20A9		WON SIGN
+20AA		NEW SHEQEL SIGN
+20AB		DONG SIGN
+20AC		EURO SIGN
+20AD		KIP SIGN
+20AE		TUGRIK SIGN
+20AF		DRACHMA SIGN
+20B0		GERMAN PENNY SIGN
+20B1		PESO SIGN
+20B2		GUARANI SIGN
+20B3		AUSTRAL SIGN
+20B4		HRYVNIA SIGN
+20B5		CEDI SIGN
+20D0		COMBINING LEFT HARPOON ABOVE
+20D1		COMBINING RIGHT HARPOON ABOVE
+20D2		COMBINING LONG VERTICAL LINE OVERLAY
+20D3		COMBINING SHORT VERTICAL LINE OVERLAY
+20D4		COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5		COMBINING CLOCKWISE ARROW ABOVE
+20D6		COMBINING LEFT ARROW ABOVE
+20D7		COMBINING RIGHT ARROW ABOVE
+20D8		COMBINING RING OVERLAY
+20D9		COMBINING CLOCKWISE RING OVERLAY
+20DA		COMBINING ANTICLOCKWISE RING OVERLAY
+20DB		COMBINING THREE DOTS ABOVE
+20DC		COMBINING FOUR DOTS ABOVE
+20DD		COMBINING ENCLOSING CIRCLE
+20DE		COMBINING ENCLOSING SQUARE
+20DF		COMBINING ENCLOSING DIAMOND
+20E0		COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1		COMBINING LEFT RIGHT ARROW ABOVE
+20E2		COMBINING ENCLOSING SCREEN
+20E3		COMBINING ENCLOSING KEYCAP
+20E4		COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5		COMBINING REVERSE SOLIDUS OVERLAY
+20E6		COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20E7		COMBINING ANNUITY SYMBOL
+20E8		COMBINING TRIPLE UNDERDOT
+20E9		COMBINING WIDE BRIDGE ABOVE
+20EA		COMBINING LEFTWARDS ARROW OVERLAY
+20EB		COMBINING LONG DOUBLE SOLIDUS OVERLAY
+2100		ACCOUNT OF
+2101		ADDRESSED TO THE SUBJECT
+2102		DOUBLE-STRUCK CAPITAL C
+2103		DEGREE CELSIUS
+2104		CENTRE LINE SYMBOL
+2105		CARE OF
+2106		CADA UNA
+2107		EULER CONSTANT
+2108		SCRUPLE
+2109		DEGREE FAHRENHEIT
+210A		SCRIPT SMALL G
+210B		SCRIPT CAPITAL H
+210C		BLACK-LETTER CAPITAL H
+210D		DOUBLE-STRUCK CAPITAL H
+210E		PLANCK CONSTANT
+210F		PLANCK CONSTANT OVER TWO PI
+2110		SCRIPT CAPITAL I
+2111		BLACK-LETTER CAPITAL I
+2112		SCRIPT CAPITAL L
+2113		SCRIPT SMALL L
+2114		L B BAR SYMBOL
+2115		DOUBLE-STRUCK CAPITAL N
+2116		NUMERO SIGN
+2117		SOUND RECORDING COPYRIGHT
+2118		SCRIPT CAPITAL P
+2119		DOUBLE-STRUCK CAPITAL P
+211A		DOUBLE-STRUCK CAPITAL Q
+211B		SCRIPT CAPITAL R
+211C		BLACK-LETTER CAPITAL R
+211D		DOUBLE-STRUCK CAPITAL R
+211E		PRESCRIPTION TAKE
+211F		RESPONSE
+2120		SERVICE MARK
+2121		TELEPHONE SIGN
+2122		TRADE MARK SIGN
+2123		VERSICLE
+2124		DOUBLE-STRUCK CAPITAL Z
+2125		OUNCE SIGN
+2126		OHM SIGN
+2127		INVERTED OHM SIGN
+2128		BLACK-LETTER CAPITAL Z
+2129		TURNED GREEK SMALL LETTER IOTA
+212A		KELVIN SIGN
+212B		ANGSTROM SIGN
+212C		SCRIPT CAPITAL B
+212D		BLACK-LETTER CAPITAL C
+212E		ESTIMATED SYMBOL
+212F		SCRIPT SMALL E
+2130		SCRIPT CAPITAL E
+2131		SCRIPT CAPITAL F
+2132		TURNED CAPITAL F
+2133		SCRIPT CAPITAL M
+2134		SCRIPT SMALL O
+2135		ALEF SYMBOL
+2136		BET SYMBOL
+2137		GIMEL SYMBOL
+2138		DALET SYMBOL
+2139		INFORMATION SOURCE
+213A		ROTATED CAPITAL Q
+213B		FACSIMILE SIGN
+213C		DOUBLE-STRUCK SMALL PI
+213D		DOUBLE-STRUCK SMALL GAMMA
+213E		DOUBLE-STRUCK CAPITAL GAMMA
+213F		DOUBLE-STRUCK CAPITAL PI
+2140		DOUBLE-STRUCK N-ARY SUMMATION
+2141		TURNED SANS-SERIF CAPITAL G
+2142		TURNED SANS-SERIF CAPITAL L
+2143		REVERSED SANS-SERIF CAPITAL L
+2144		TURNED SANS-SERIF CAPITAL Y
+2145		DOUBLE-STRUCK ITALIC CAPITAL D
+2146		DOUBLE-STRUCK ITALIC SMALL D
+2147		DOUBLE-STRUCK ITALIC SMALL E
+2148		DOUBLE-STRUCK ITALIC SMALL I
+2149		DOUBLE-STRUCK ITALIC SMALL J
+214A		PROPERTY LINE
+214B		TURNED AMPERSAND
+214C		PER SIGN
+2153		VULGAR FRACTION ONE THIRD
+2154		VULGAR FRACTION TWO THIRDS
+2155		VULGAR FRACTION ONE FIFTH
+2156		VULGAR FRACTION TWO FIFTHS
+2157		VULGAR FRACTION THREE FIFTHS
+2158		VULGAR FRACTION FOUR FIFTHS
+2159		VULGAR FRACTION ONE SIXTH
+215A		VULGAR FRACTION FIVE SIXTHS
+215B		VULGAR FRACTION ONE EIGHTH
+215C		VULGAR FRACTION THREE EIGHTHS
+215D		VULGAR FRACTION FIVE EIGHTHS
+215E		VULGAR FRACTION SEVEN EIGHTHS
+215F		FRACTION NUMERATOR ONE
+2160		ROMAN NUMERAL ONE
+2161		ROMAN NUMERAL TWO
+2162		ROMAN NUMERAL THREE
+2163		ROMAN NUMERAL FOUR
+2164		ROMAN NUMERAL FIVE
+2165		ROMAN NUMERAL SIX
+2166		ROMAN NUMERAL SEVEN
+2167		ROMAN NUMERAL EIGHT
+2168		ROMAN NUMERAL NINE
+2169		ROMAN NUMERAL TEN
+216A		ROMAN NUMERAL ELEVEN
+216B		ROMAN NUMERAL TWELVE
+216C		ROMAN NUMERAL FIFTY
+216D		ROMAN NUMERAL ONE HUNDRED
+216E		ROMAN NUMERAL FIVE HUNDRED
+216F		ROMAN NUMERAL ONE THOUSAND
+2170		SMALL ROMAN NUMERAL ONE
+2171		SMALL ROMAN NUMERAL TWO
+2172		SMALL ROMAN NUMERAL THREE
+2173		SMALL ROMAN NUMERAL FOUR
+2174		SMALL ROMAN NUMERAL FIVE
+2175		SMALL ROMAN NUMERAL SIX
+2176		SMALL ROMAN NUMERAL SEVEN
+2177		SMALL ROMAN NUMERAL EIGHT
+2178		SMALL ROMAN NUMERAL NINE
+2179		SMALL ROMAN NUMERAL TEN
+217A		SMALL ROMAN NUMERAL ELEVEN
+217B		SMALL ROMAN NUMERAL TWELVE
+217C		SMALL ROMAN NUMERAL FIFTY
+217D		SMALL ROMAN NUMERAL ONE HUNDRED
+217E		SMALL ROMAN NUMERAL FIVE HUNDRED
+217F		SMALL ROMAN NUMERAL ONE THOUSAND
+2180		ROMAN NUMERAL ONE THOUSAND C D
+2181		ROMAN NUMERAL FIVE THOUSAND
+2182		ROMAN NUMERAL TEN THOUSAND
+2183		ROMAN NUMERAL REVERSED ONE HUNDRED
+2190		LEFTWARDS ARROW
+2191		UPWARDS ARROW
+2192		RIGHTWARDS ARROW
+2193		DOWNWARDS ARROW
+2194		LEFT RIGHT ARROW
+2195		UP DOWN ARROW
+2196		NORTH WEST ARROW
+2197		NORTH EAST ARROW
+2198		SOUTH EAST ARROW
+2199		SOUTH WEST ARROW
+219A		LEFTWARDS ARROW WITH STROKE
+219B		RIGHTWARDS ARROW WITH STROKE
+219C		LEFTWARDS WAVE ARROW
+219D		RIGHTWARDS WAVE ARROW
+219E		LEFTWARDS TWO HEADED ARROW
+219F		UPWARDS TWO HEADED ARROW
+21A0		RIGHTWARDS TWO HEADED ARROW
+21A1		DOWNWARDS TWO HEADED ARROW
+21A2		LEFTWARDS ARROW WITH TAIL
+21A3		RIGHTWARDS ARROW WITH TAIL
+21A4		LEFTWARDS ARROW FROM BAR
+21A5		UPWARDS ARROW FROM BAR
+21A6		RIGHTWARDS ARROW FROM BAR
+21A7		DOWNWARDS ARROW FROM BAR
+21A8		UP DOWN ARROW WITH BASE
+21A9		LEFTWARDS ARROW WITH HOOK
+21AA		RIGHTWARDS ARROW WITH HOOK
+21AB		LEFTWARDS ARROW WITH LOOP
+21AC		RIGHTWARDS ARROW WITH LOOP
+21AD		LEFT RIGHT WAVE ARROW
+21AE		LEFT RIGHT ARROW WITH STROKE
+21AF		DOWNWARDS ZIGZAG ARROW
+21B0		UPWARDS ARROW WITH TIP LEFTWARDS
+21B1		UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2		DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3		DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4		RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5		DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6		ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7		CLOCKWISE TOP SEMICIRCLE ARROW
+21B8		NORTH WEST ARROW TO LONG BAR
+21B9		LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA		ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB		CLOCKWISE OPEN CIRCLE ARROW
+21BC		LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD		LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE		UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF		UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0		RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1		RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2		DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3		DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4		RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5		UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6		LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7		LEFTWARDS PAIRED ARROWS
+21C8		UPWARDS PAIRED ARROWS
+21C9		RIGHTWARDS PAIRED ARROWS
+21CA		DOWNWARDS PAIRED ARROWS
+21CB		LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC		RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD		LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE		LEFT RIGHT DOUBLE ARROW WITH STROKE
+21CF		RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0		LEFTWARDS DOUBLE ARROW
+21D1		UPWARDS DOUBLE ARROW
+21D2		RIGHTWARDS DOUBLE ARROW
+21D3		DOWNWARDS DOUBLE ARROW
+21D4		LEFT RIGHT DOUBLE ARROW
+21D5		UP DOWN DOUBLE ARROW
+21D6		NORTH WEST DOUBLE ARROW
+21D7		NORTH EAST DOUBLE ARROW
+21D8		SOUTH EAST DOUBLE ARROW
+21D9		SOUTH WEST DOUBLE ARROW
+21DA		LEFTWARDS TRIPLE ARROW
+21DB		RIGHTWARDS TRIPLE ARROW
+21DC		LEFTWARDS SQUIGGLE ARROW
+21DD		RIGHTWARDS SQUIGGLE ARROW
+21DE		UPWARDS ARROW WITH DOUBLE STROKE
+21DF		DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0		LEFTWARDS DASHED ARROW
+21E1		UPWARDS DASHED ARROW
+21E2		RIGHTWARDS DASHED ARROW
+21E3		DOWNWARDS DASHED ARROW
+21E4		LEFTWARDS ARROW TO BAR
+21E5		RIGHTWARDS ARROW TO BAR
+21E6		LEFTWARDS WHITE ARROW
+21E7		UPWARDS WHITE ARROW
+21E8		RIGHTWARDS WHITE ARROW
+21E9		DOWNWARDS WHITE ARROW
+21EA		UPWARDS WHITE ARROW FROM BAR
+21EB		UPWARDS WHITE ARROW ON PEDESTAL
+21EC		UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED		UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE		UPWARDS WHITE DOUBLE ARROW
+21EF		UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0		RIGHTWARDS WHITE ARROW FROM WALL
+21F1		NORTH WEST ARROW TO CORNER
+21F2		SOUTH EAST ARROW TO CORNER
+21F3		UP DOWN WHITE ARROW
+21F4		RIGHT ARROW WITH SMALL CIRCLE
+21F5		DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6		THREE RIGHTWARDS ARROWS
+21F7		LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8		RIGHTWARDS ARROW WITH VERTICAL STROKE
+21F9		LEFT RIGHT ARROW WITH VERTICAL STROKE
+21FA		LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB		RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FC		LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+21FD		LEFTWARDS OPEN-HEADED ARROW
+21FE		RIGHTWARDS OPEN-HEADED ARROW
+21FF		LEFT RIGHT OPEN-HEADED ARROW
+2200		FOR ALL
+2201		COMPLEMENT
+2202		PARTIAL DIFFERENTIAL
+2203		THERE EXISTS
+2204		THERE DOES NOT EXIST
+2205		EMPTY SET
+2206		INCREMENT
+2207		NABLA
+2208		ELEMENT OF
+2209		NOT AN ELEMENT OF
+220A		SMALL ELEMENT OF
+220B		CONTAINS AS MEMBER
+220C		DOES NOT CONTAIN AS MEMBER
+220D		SMALL CONTAINS AS MEMBER
+220E		END OF PROOF
+220F		N-ARY PRODUCT
+2210		N-ARY COPRODUCT
+2211		N-ARY SUMMATION
+2212		MINUS SIGN
+2213		MINUS-OR-PLUS SIGN
+2214		DOT PLUS
+2215		DIVISION SLASH
+2216		SET MINUS
+2217		ASTERISK OPERATOR
+2218		RING OPERATOR
+2219		BULLET OPERATOR
+221A		SQUARE ROOT
+221B		CUBE ROOT
+221C		FOURTH ROOT
+221D		PROPORTIONAL TO
+221E		INFINITY
+221F		RIGHT ANGLE
+2220		ANGLE
+2221		MEASURED ANGLE
+2222		SPHERICAL ANGLE
+2223		DIVIDES
+2224		DOES NOT DIVIDE
+2225		PARALLEL TO
+2226		NOT PARALLEL TO
+2227		LOGICAL AND
+2228		LOGICAL OR
+2229		INTERSECTION
+222A		UNION
+222B		INTEGRAL
+222C		DOUBLE INTEGRAL
+222D		TRIPLE INTEGRAL
+222E		CONTOUR INTEGRAL
+222F		SURFACE INTEGRAL
+2230		VOLUME INTEGRAL
+2231		CLOCKWISE INTEGRAL
+2232		CLOCKWISE CONTOUR INTEGRAL
+2233		ANTICLOCKWISE CONTOUR INTEGRAL
+2234		THEREFORE
+2235		BECAUSE
+2236		RATIO
+2237		PROPORTION
+2238		DOT MINUS
+2239		EXCESS
+223A		GEOMETRIC PROPORTION
+223B		HOMOTHETIC
+223C		TILDE OPERATOR
+223D		REVERSED TILDE
+223E		INVERTED LAZY S
+223F		SINE WAVE
+2240		WREATH PRODUCT
+2241		NOT TILDE
+2242		MINUS TILDE
+2243		ASYMPTOTICALLY EQUAL TO
+2244		NOT ASYMPTOTICALLY EQUAL TO
+2245		APPROXIMATELY EQUAL TO
+2246		APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247		NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+2248		ALMOST EQUAL TO
+2249		NOT ALMOST EQUAL TO
+224A		ALMOST EQUAL OR EQUAL TO
+224B		TRIPLE TILDE
+224C		ALL EQUAL TO
+224D		EQUIVALENT TO
+224E		GEOMETRICALLY EQUIVALENT TO
+224F		DIFFERENCE BETWEEN
+2250		APPROACHES THE LIMIT
+2251		GEOMETRICALLY EQUAL TO
+2252		APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253		IMAGE OF OR APPROXIMATELY EQUAL TO
+2254		COLON EQUALS
+2255		EQUALS COLON
+2256		RING IN EQUAL TO
+2257		RING EQUAL TO
+2258		CORRESPONDS TO
+2259		ESTIMATES
+225A		EQUIANGULAR TO
+225B		STAR EQUALS
+225C		DELTA EQUAL TO
+225D		EQUAL TO BY DEFINITION
+225E		MEASURED BY
+225F		QUESTIONED EQUAL TO
+2260		NOT EQUAL TO
+2261		IDENTICAL TO
+2262		NOT IDENTICAL TO
+2263		STRICTLY EQUIVALENT TO
+2264		LESS-THAN OR EQUAL TO
+2265		GREATER-THAN OR EQUAL TO
+2266		LESS-THAN OVER EQUAL TO
+2267		GREATER-THAN OVER EQUAL TO
+2268		LESS-THAN BUT NOT EQUAL TO
+2269		GREATER-THAN BUT NOT EQUAL TO
+226A		MUCH LESS-THAN
+226B		MUCH GREATER-THAN
+226C		BETWEEN
+226D		NOT EQUIVALENT TO
+226E		NOT LESS-THAN
+226F		NOT GREATER-THAN
+2270		NEITHER LESS-THAN NOR EQUAL TO
+2271		NEITHER GREATER-THAN NOR EQUAL TO
+2272		LESS-THAN OR EQUIVALENT TO
+2273		GREATER-THAN OR EQUIVALENT TO
+2274		NEITHER LESS-THAN NOR EQUIVALENT TO
+2275		NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276		LESS-THAN OR GREATER-THAN
+2277		GREATER-THAN OR LESS-THAN
+2278		NEITHER LESS-THAN NOR GREATER-THAN
+2279		NEITHER GREATER-THAN NOR LESS-THAN
+227A		PRECEDES
+227B		SUCCEEDS
+227C		PRECEDES OR EQUAL TO
+227D		SUCCEEDS OR EQUAL TO
+227E		PRECEDES OR EQUIVALENT TO
+227F		SUCCEEDS OR EQUIVALENT TO
+2280		DOES NOT PRECEDE
+2281		DOES NOT SUCCEED
+2282		SUBSET OF
+2283		SUPERSET OF
+2284		NOT A SUBSET OF
+2285		NOT A SUPERSET OF
+2286		SUBSET OF OR EQUAL TO
+2287		SUPERSET OF OR EQUAL TO
+2288		NEITHER A SUBSET OF NOR EQUAL TO
+2289		NEITHER A SUPERSET OF NOR EQUAL TO
+228A		SUBSET OF WITH NOT EQUAL TO
+228B		SUPERSET OF WITH NOT EQUAL TO
+228C		MULTISET
+228D		MULTISET MULTIPLICATION
+228E		MULTISET UNION
+228F		SQUARE IMAGE OF
+2290		SQUARE ORIGINAL OF
+2291		SQUARE IMAGE OF OR EQUAL TO
+2292		SQUARE ORIGINAL OF OR EQUAL TO
+2293		SQUARE CAP
+2294		SQUARE CUP
+2295		CIRCLED PLUS
+2296		CIRCLED MINUS
+2297		CIRCLED TIMES
+2298		CIRCLED DIVISION SLASH
+2299		CIRCLED DOT OPERATOR
+229A		CIRCLED RING OPERATOR
+229B		CIRCLED ASTERISK OPERATOR
+229C		CIRCLED EQUALS
+229D		CIRCLED DASH
+229E		SQUARED PLUS
+229F		SQUARED MINUS
+22A0		SQUARED TIMES
+22A1		SQUARED DOT OPERATOR
+22A2		RIGHT TACK
+22A3		LEFT TACK
+22A4		DOWN TACK
+22A5		UP TACK
+22A6		ASSERTION
+22A7		MODELS
+22A8		TRUE
+22A9		FORCES
+22AA		TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB		DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC		DOES NOT PROVE
+22AD		NOT TRUE
+22AE		DOES NOT FORCE
+22AF		NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0		PRECEDES UNDER RELATION
+22B1		SUCCEEDS UNDER RELATION
+22B2		NORMAL SUBGROUP OF
+22B3		CONTAINS AS NORMAL SUBGROUP
+22B4		NORMAL SUBGROUP OF OR EQUAL TO
+22B5		CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6		ORIGINAL OF
+22B7		IMAGE OF
+22B8		MULTIMAP
+22B9		HERMITIAN CONJUGATE MATRIX
+22BA		INTERCALATE
+22BB		XOR
+22BC		NAND
+22BD		NOR
+22BE		RIGHT ANGLE WITH ARC
+22BF		RIGHT TRIANGLE
+22C0		N-ARY LOGICAL AND
+22C1		N-ARY LOGICAL OR
+22C2		N-ARY INTERSECTION
+22C3		N-ARY UNION
+22C4		DIAMOND OPERATOR
+22C5		DOT OPERATOR
+22C6		STAR OPERATOR
+22C7		DIVISION TIMES
+22C8		BOWTIE
+22C9		LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA		RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB		LEFT SEMIDIRECT PRODUCT
+22CC		RIGHT SEMIDIRECT PRODUCT
+22CD		REVERSED TILDE EQUALS
+22CE		CURLY LOGICAL OR
+22CF		CURLY LOGICAL AND
+22D0		DOUBLE SUBSET
+22D1		DOUBLE SUPERSET
+22D2		DOUBLE INTERSECTION
+22D3		DOUBLE UNION
+22D4		PITCHFORK
+22D5		EQUAL AND PARALLEL TO
+22D6		LESS-THAN WITH DOT
+22D7		GREATER-THAN WITH DOT
+22D8		VERY MUCH LESS-THAN
+22D9		VERY MUCH GREATER-THAN
+22DA		LESS-THAN EQUAL TO OR GREATER-THAN
+22DB		GREATER-THAN EQUAL TO OR LESS-THAN
+22DC		EQUAL TO OR LESS-THAN
+22DD		EQUAL TO OR GREATER-THAN
+22DE		EQUAL TO OR PRECEDES
+22DF		EQUAL TO OR SUCCEEDS
+22E0		DOES NOT PRECEDE OR EQUAL
+22E1		DOES NOT SUCCEED OR EQUAL
+22E2		NOT SQUARE IMAGE OF OR EQUAL TO
+22E3		NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4		SQUARE IMAGE OF OR NOT EQUAL TO
+22E5		SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6		LESS-THAN BUT NOT EQUIVALENT TO
+22E7		GREATER-THAN BUT NOT EQUIVALENT TO
+22E8		PRECEDES BUT NOT EQUIVALENT TO
+22E9		SUCCEEDS BUT NOT EQUIVALENT TO
+22EA		NOT NORMAL SUBGROUP OF
+22EB		DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC		NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED		DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22EE		VERTICAL ELLIPSIS
+22EF		MIDLINE HORIZONTAL ELLIPSIS
+22F0		UP RIGHT DIAGONAL ELLIPSIS
+22F1		DOWN RIGHT DIAGONAL ELLIPSIS
+22F2		ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3		ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4		SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5		ELEMENT OF WITH DOT ABOVE
+22F6		ELEMENT OF WITH OVERBAR
+22F7		SMALL ELEMENT OF WITH OVERBAR
+22F8		ELEMENT OF WITH UNDERBAR
+22F9		ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA		CONTAINS WITH LONG HORIZONTAL STROKE
+22FB		CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC		SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD		CONTAINS WITH OVERBAR
+22FE		SMALL CONTAINS WITH OVERBAR
+22FF		Z NOTATION BAG MEMBERSHIP
+2300		DIAMETER SIGN
+2301		ELECTRIC ARROW
+2302		HOUSE
+2303		UP ARROWHEAD
+2304		DOWN ARROWHEAD
+2305		PROJECTIVE
+2306		PERSPECTIVE
+2307		WAVY LINE
+2308		LEFT CEILING
+2309		RIGHT CEILING
+230A		LEFT FLOOR
+230B		RIGHT FLOOR
+230C		BOTTOM RIGHT CROP
+230D		BOTTOM LEFT CROP
+230E		TOP RIGHT CROP
+230F		TOP LEFT CROP
+2310		REVERSED NOT SIGN
+2311		SQUARE LOZENGE
+2312		ARC
+2313		SEGMENT
+2314		SECTOR
+2315		TELEPHONE RECORDER
+2316		POSITION INDICATOR
+2317		VIEWDATA SQUARE
+2318		PLACE OF INTEREST SIGN
+2319		TURNED NOT SIGN
+231A		WATCH
+231B		HOURGLASS
+231C		TOP LEFT CORNER
+231D		TOP RIGHT CORNER
+231E		BOTTOM LEFT CORNER
+231F		BOTTOM RIGHT CORNER
+2320		TOP HALF INTEGRAL
+2321		BOTTOM HALF INTEGRAL
+2322		FROWN
+2323		SMILE
+2324		UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325		OPTION KEY
+2326		ERASE TO THE RIGHT
+2327		X IN A RECTANGLE BOX
+2328		KEYBOARD
+2329		LEFT-POINTING ANGLE BRACKET
+232A		RIGHT-POINTING ANGLE BRACKET
+232B		ERASE TO THE LEFT
+232C		BENZENE RING
+232D		CYLINDRICITY
+232E		ALL AROUND-PROFILE
+232F		SYMMETRY
+2330		TOTAL RUNOUT
+2331		DIMENSION ORIGIN
+2332		CONICAL TAPER
+2333		SLOPE
+2334		COUNTERBORE
+2335		COUNTERSINK
+2336		APL FUNCTIONAL SYMBOL I-BEAM
+2337		APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338		APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339		APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A		APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B		APL FUNCTIONAL SYMBOL QUAD JOT
+233C		APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D		APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E		APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F		APL FUNCTIONAL SYMBOL SLASH BAR
+2340		APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341		APL FUNCTIONAL SYMBOL QUAD SLASH
+2342		APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343		APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344		APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345		APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346		APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347		APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348		APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349		APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A		APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B		APL FUNCTIONAL SYMBOL DELTA STILE
+234C		APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D		APL FUNCTIONAL SYMBOL QUAD DELTA
+234E		APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F		APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350		APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351		APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352		APL FUNCTIONAL SYMBOL DEL STILE
+2353		APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354		APL FUNCTIONAL SYMBOL QUAD DEL
+2355		APL FUNCTIONAL SYMBOL UP TACK JOT
+2356		APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357		APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358		APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359		APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A		APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B		APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C		APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D		APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E		APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F		APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360		APL FUNCTIONAL SYMBOL QUAD COLON
+2361		APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362		APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363		APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364		APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365		APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366		APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367		APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368		APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369		APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A		APL FUNCTIONAL SYMBOL COMMA BAR
+236B		APL FUNCTIONAL SYMBOL DEL TILDE
+236C		APL FUNCTIONAL SYMBOL ZILDE
+236D		APL FUNCTIONAL SYMBOL STILE TILDE
+236E		APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F		APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370		APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371		APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372		APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373		APL FUNCTIONAL SYMBOL IOTA
+2374		APL FUNCTIONAL SYMBOL RHO
+2375		APL FUNCTIONAL SYMBOL OMEGA
+2376		APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377		APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378		APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379		APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A		APL FUNCTIONAL SYMBOL ALPHA
+237B		NOT CHECK MARK
+237C		RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D		SHOULDERED OPEN BOX
+237E		BELL SYMBOL
+237F		VERTICAL LINE WITH MIDDLE DOT
+2380		INSERTION SYMBOL
+2381		CONTINUOUS UNDERLINE SYMBOL
+2382		DISCONTINUOUS UNDERLINE SYMBOL
+2383		EMPHASIS SYMBOL
+2384		COMPOSITION SYMBOL
+2385		WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386		ENTER SYMBOL
+2387		ALTERNATIVE KEY SYMBOL
+2388		HELM SYMBOL
+2389		CIRCLED HORIZONTAL BAR WITH NOTCH
+238A		CIRCLED TRIANGLE DOWN
+238B		BROKEN CIRCLE WITH NORTHWEST ARROW
+238C		UNDO SYMBOL
+238D		MONOSTABLE SYMBOL
+238E		HYSTERESIS SYMBOL
+238F		OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390		OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391		PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392		PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393		DIRECT CURRENT SYMBOL FORM TWO
+2394		SOFTWARE-FUNCTION SYMBOL
+2395		APL FUNCTIONAL SYMBOL QUAD
+2396		DECIMAL SEPARATOR KEY SYMBOL
+2397		PREVIOUS PAGE
+2398		NEXT PAGE
+2399		PRINT SCREEN SYMBOL
+239A		CLEAR SCREEN SYMBOL
+239B		LEFT PARENTHESIS UPPER HOOK
+239C		LEFT PARENTHESIS EXTENSION
+239D		LEFT PARENTHESIS LOWER HOOK
+239E		RIGHT PARENTHESIS UPPER HOOK
+239F		RIGHT PARENTHESIS EXTENSION
+23A0		RIGHT PARENTHESIS LOWER HOOK
+23A1		LEFT SQUARE BRACKET UPPER CORNER
+23A2		LEFT SQUARE BRACKET EXTENSION
+23A3		LEFT SQUARE BRACKET LOWER CORNER
+23A4		RIGHT SQUARE BRACKET UPPER CORNER
+23A5		RIGHT SQUARE BRACKET EXTENSION
+23A6		RIGHT SQUARE BRACKET LOWER CORNER
+23A7		LEFT CURLY BRACKET UPPER HOOK
+23A8		LEFT CURLY BRACKET MIDDLE PIECE
+23A9		LEFT CURLY BRACKET LOWER HOOK
+23AA		CURLY BRACKET EXTENSION
+23AB		RIGHT CURLY BRACKET UPPER HOOK
+23AC		RIGHT CURLY BRACKET MIDDLE PIECE
+23AD		RIGHT CURLY BRACKET LOWER HOOK
+23AE		INTEGRAL EXTENSION
+23AF		HORIZONTAL LINE EXTENSION
+23B0		UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+23B1		UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+23B2		SUMMATION TOP
+23B3		SUMMATION BOTTOM
+23B4		TOP SQUARE BRACKET
+23B5		BOTTOM SQUARE BRACKET
+23B6		BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7		RADICAL SYMBOL BOTTOM
+23B8		LEFT VERTICAL BOX LINE
+23B9		RIGHT VERTICAL BOX LINE
+23BA		HORIZONTAL SCAN LINE-1
+23BB		HORIZONTAL SCAN LINE-3
+23BC		HORIZONTAL SCAN LINE-7
+23BD		HORIZONTAL SCAN LINE-9
+23BE		DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+23BF		DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+23C0		DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1		DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2		DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3		DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4		DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5		DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6		DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7		DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8		DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9		DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+23CA		DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+23CB		DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+23CC		DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+23CD		SQUARE FOOT
+23CE		RETURN SYMBOL
+23CF		EJECT SYMBOL
+23D0		VERTICAL LINE EXTENSION
+23D1		METRICAL BREVE
+23D2		METRICAL LONG OVER SHORT
+23D3		METRICAL SHORT OVER LONG
+23D4		METRICAL LONG OVER TWO SHORTS
+23D5		METRICAL TWO SHORTS OVER LONG
+23D6		METRICAL TWO SHORTS JOINED
+23D7		METRICAL TRISEME
+23D8		METRICAL TETRASEME
+23D9		METRICAL PENTASEME
+23DA		EARTH GROUND
+23DB		FUSE
+2400		SYMBOL FOR NULL
+2401		SYMBOL FOR START OF HEADING
+2402		SYMBOL FOR START OF TEXT
+2403		SYMBOL FOR END OF TEXT
+2404		SYMBOL FOR END OF TRANSMISSION
+2405		SYMBOL FOR ENQUIRY
+2406		SYMBOL FOR ACKNOWLEDGE
+2407		SYMBOL FOR BELL
+2408		SYMBOL FOR BACKSPACE
+2409		SYMBOL FOR HORIZONTAL TABULATION
+240A		SYMBOL FOR LINE FEED
+240B		SYMBOL FOR VERTICAL TABULATION
+240C		SYMBOL FOR FORM FEED
+240D		SYMBOL FOR CARRIAGE RETURN
+240E		SYMBOL FOR SHIFT OUT
+240F		SYMBOL FOR SHIFT IN
+2410		SYMBOL FOR DATA LINK ESCAPE
+2411		SYMBOL FOR DEVICE CONTROL ONE
+2412		SYMBOL FOR DEVICE CONTROL TWO
+2413		SYMBOL FOR DEVICE CONTROL THREE
+2414		SYMBOL FOR DEVICE CONTROL FOUR
+2415		SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416		SYMBOL FOR SYNCHRONOUS IDLE
+2417		SYMBOL FOR END OF TRANSMISSION BLOCK
+2418		SYMBOL FOR CANCEL
+2419		SYMBOL FOR END OF MEDIUM
+241A		SYMBOL FOR SUBSTITUTE
+241B		SYMBOL FOR ESCAPE
+241C		SYMBOL FOR FILE SEPARATOR
+241D		SYMBOL FOR GROUP SEPARATOR
+241E		SYMBOL FOR RECORD SEPARATOR
+241F		SYMBOL FOR UNIT SEPARATOR
+2420		SYMBOL FOR SPACE
+2421		SYMBOL FOR DELETE
+2422		BLANK SYMBOL
+2423		OPEN BOX
+2424		SYMBOL FOR NEWLINE
+2425		SYMBOL FOR DELETE FORM TWO
+2426		SYMBOL FOR SUBSTITUTE FORM TWO
+2440		OCR HOOK
+2441		OCR CHAIR
+2442		OCR FORK
+2443		OCR INVERTED FORK
+2444		OCR BELT BUCKLE
+2445		OCR BOW TIE
+2446		OCR BRANCH BANK IDENTIFICATION
+2447		OCR AMOUNT OF CHECK
+2448		OCR DASH
+2449		OCR CUSTOMER ACCOUNT NUMBER
+244A		OCR DOUBLE BACKSLASH
+2460		CIRCLED DIGIT ONE
+2461		CIRCLED DIGIT TWO
+2462		CIRCLED DIGIT THREE
+2463		CIRCLED DIGIT FOUR
+2464		CIRCLED DIGIT FIVE
+2465		CIRCLED DIGIT SIX
+2466		CIRCLED DIGIT SEVEN
+2467		CIRCLED DIGIT EIGHT
+2468		CIRCLED DIGIT NINE
+2469		CIRCLED NUMBER TEN
+246A		CIRCLED NUMBER ELEVEN
+246B		CIRCLED NUMBER TWELVE
+246C		CIRCLED NUMBER THIRTEEN
+246D		CIRCLED NUMBER FOURTEEN
+246E		CIRCLED NUMBER FIFTEEN
+246F		CIRCLED NUMBER SIXTEEN
+2470		CIRCLED NUMBER SEVENTEEN
+2471		CIRCLED NUMBER EIGHTEEN
+2472		CIRCLED NUMBER NINETEEN
+2473		CIRCLED NUMBER TWENTY
+2474		PARENTHESIZED DIGIT ONE
+2475		PARENTHESIZED DIGIT TWO
+2476		PARENTHESIZED DIGIT THREE
+2477		PARENTHESIZED DIGIT FOUR
+2478		PARENTHESIZED DIGIT FIVE
+2479		PARENTHESIZED DIGIT SIX
+247A		PARENTHESIZED DIGIT SEVEN
+247B		PARENTHESIZED DIGIT EIGHT
+247C		PARENTHESIZED DIGIT NINE
+247D		PARENTHESIZED NUMBER TEN
+247E		PARENTHESIZED NUMBER ELEVEN
+247F		PARENTHESIZED NUMBER TWELVE
+2480		PARENTHESIZED NUMBER THIRTEEN
+2481		PARENTHESIZED NUMBER FOURTEEN
+2482		PARENTHESIZED NUMBER FIFTEEN
+2483		PARENTHESIZED NUMBER SIXTEEN
+2484		PARENTHESIZED NUMBER SEVENTEEN
+2485		PARENTHESIZED NUMBER EIGHTEEN
+2486		PARENTHESIZED NUMBER NINETEEN
+2487		PARENTHESIZED NUMBER TWENTY
+2488		DIGIT ONE FULL STOP
+2489		DIGIT TWO FULL STOP
+248A		DIGIT THREE FULL STOP
+248B		DIGIT FOUR FULL STOP
+248C		DIGIT FIVE FULL STOP
+248D		DIGIT SIX FULL STOP
+248E		DIGIT SEVEN FULL STOP
+248F		DIGIT EIGHT FULL STOP
+2490		DIGIT NINE FULL STOP
+2491		NUMBER TEN FULL STOP
+2492		NUMBER ELEVEN FULL STOP
+2493		NUMBER TWELVE FULL STOP
+2494		NUMBER THIRTEEN FULL STOP
+2495		NUMBER FOURTEEN FULL STOP
+2496		NUMBER FIFTEEN FULL STOP
+2497		NUMBER SIXTEEN FULL STOP
+2498		NUMBER SEVENTEEN FULL STOP
+2499		NUMBER EIGHTEEN FULL STOP
+249A		NUMBER NINETEEN FULL STOP
+249B		NUMBER TWENTY FULL STOP
+249C		PARENTHESIZED LATIN SMALL LETTER A
+249D		PARENTHESIZED LATIN SMALL LETTER B
+249E		PARENTHESIZED LATIN SMALL LETTER C
+249F		PARENTHESIZED LATIN SMALL LETTER D
+24A0		PARENTHESIZED LATIN SMALL LETTER E
+24A1		PARENTHESIZED LATIN SMALL LETTER F
+24A2		PARENTHESIZED LATIN SMALL LETTER G
+24A3		PARENTHESIZED LATIN SMALL LETTER H
+24A4		PARENTHESIZED LATIN SMALL LETTER I
+24A5		PARENTHESIZED LATIN SMALL LETTER J
+24A6		PARENTHESIZED LATIN SMALL LETTER K
+24A7		PARENTHESIZED LATIN SMALL LETTER L
+24A8		PARENTHESIZED LATIN SMALL LETTER M
+24A9		PARENTHESIZED LATIN SMALL LETTER N
+24AA		PARENTHESIZED LATIN SMALL LETTER O
+24AB		PARENTHESIZED LATIN SMALL LETTER P
+24AC		PARENTHESIZED LATIN SMALL LETTER Q
+24AD		PARENTHESIZED LATIN SMALL LETTER R
+24AE		PARENTHESIZED LATIN SMALL LETTER S
+24AF		PARENTHESIZED LATIN SMALL LETTER T
+24B0		PARENTHESIZED LATIN SMALL LETTER U
+24B1		PARENTHESIZED LATIN SMALL LETTER V
+24B2		PARENTHESIZED LATIN SMALL LETTER W
+24B3		PARENTHESIZED LATIN SMALL LETTER X
+24B4		PARENTHESIZED LATIN SMALL LETTER Y
+24B5		PARENTHESIZED LATIN SMALL LETTER Z
+24B6		CIRCLED LATIN CAPITAL LETTER A
+24B7		CIRCLED LATIN CAPITAL LETTER B
+24B8		CIRCLED LATIN CAPITAL LETTER C
+24B9		CIRCLED LATIN CAPITAL LETTER D
+24BA		CIRCLED LATIN CAPITAL LETTER E
+24BB		CIRCLED LATIN CAPITAL LETTER F
+24BC		CIRCLED LATIN CAPITAL LETTER G
+24BD		CIRCLED LATIN CAPITAL LETTER H
+24BE		CIRCLED LATIN CAPITAL LETTER I
+24BF		CIRCLED LATIN CAPITAL LETTER J
+24C0		CIRCLED LATIN CAPITAL LETTER K
+24C1		CIRCLED LATIN CAPITAL LETTER L
+24C2		CIRCLED LATIN CAPITAL LETTER M
+24C3		CIRCLED LATIN CAPITAL LETTER N
+24C4		CIRCLED LATIN CAPITAL LETTER O
+24C5		CIRCLED LATIN CAPITAL LETTER P
+24C6		CIRCLED LATIN CAPITAL LETTER Q
+24C7		CIRCLED LATIN CAPITAL LETTER R
+24C8		CIRCLED LATIN CAPITAL LETTER S
+24C9		CIRCLED LATIN CAPITAL LETTER T
+24CA		CIRCLED LATIN CAPITAL LETTER U
+24CB		CIRCLED LATIN CAPITAL LETTER V
+24CC		CIRCLED LATIN CAPITAL LETTER W
+24CD		CIRCLED LATIN CAPITAL LETTER X
+24CE		CIRCLED LATIN CAPITAL LETTER Y
+24CF		CIRCLED LATIN CAPITAL LETTER Z
+24D0		CIRCLED LATIN SMALL LETTER A
+24D1		CIRCLED LATIN SMALL LETTER B
+24D2		CIRCLED LATIN SMALL LETTER C
+24D3		CIRCLED LATIN SMALL LETTER D
+24D4		CIRCLED LATIN SMALL LETTER E
+24D5		CIRCLED LATIN SMALL LETTER F
+24D6		CIRCLED LATIN SMALL LETTER G
+24D7		CIRCLED LATIN SMALL LETTER H
+24D8		CIRCLED LATIN SMALL LETTER I
+24D9		CIRCLED LATIN SMALL LETTER J
+24DA		CIRCLED LATIN SMALL LETTER K
+24DB		CIRCLED LATIN SMALL LETTER L
+24DC		CIRCLED LATIN SMALL LETTER M
+24DD		CIRCLED LATIN SMALL LETTER N
+24DE		CIRCLED LATIN SMALL LETTER O
+24DF		CIRCLED LATIN SMALL LETTER P
+24E0		CIRCLED LATIN SMALL LETTER Q
+24E1		CIRCLED LATIN SMALL LETTER R
+24E2		CIRCLED LATIN SMALL LETTER S
+24E3		CIRCLED LATIN SMALL LETTER T
+24E4		CIRCLED LATIN SMALL LETTER U
+24E5		CIRCLED LATIN SMALL LETTER V
+24E6		CIRCLED LATIN SMALL LETTER W
+24E7		CIRCLED LATIN SMALL LETTER X
+24E8		CIRCLED LATIN SMALL LETTER Y
+24E9		CIRCLED LATIN SMALL LETTER Z
+24EA		CIRCLED DIGIT ZERO
+24EB		NEGATIVE CIRCLED NUMBER ELEVEN
+24EC		NEGATIVE CIRCLED NUMBER TWELVE
+24ED		NEGATIVE CIRCLED NUMBER THIRTEEN
+24EE		NEGATIVE CIRCLED NUMBER FOURTEEN
+24EF		NEGATIVE CIRCLED NUMBER FIFTEEN
+24F0		NEGATIVE CIRCLED NUMBER SIXTEEN
+24F1		NEGATIVE CIRCLED NUMBER SEVENTEEN
+24F2		NEGATIVE CIRCLED NUMBER EIGHTEEN
+24F3		NEGATIVE CIRCLED NUMBER NINETEEN
+24F4		NEGATIVE CIRCLED NUMBER TWENTY
+24F5		DOUBLE CIRCLED DIGIT ONE
+24F6		DOUBLE CIRCLED DIGIT TWO
+24F7		DOUBLE CIRCLED DIGIT THREE
+24F8		DOUBLE CIRCLED DIGIT FOUR
+24F9		DOUBLE CIRCLED DIGIT FIVE
+24FA		DOUBLE CIRCLED DIGIT SIX
+24FB		DOUBLE CIRCLED DIGIT SEVEN
+24FC		DOUBLE CIRCLED DIGIT EIGHT
+24FD		DOUBLE CIRCLED DIGIT NINE
+24FE		DOUBLE CIRCLED NUMBER TEN
+24FF		NEGATIVE CIRCLED DIGIT ZERO
+2500		BOX DRAWINGS LIGHT HORIZONTAL
+2501		BOX DRAWINGS HEAVY HORIZONTAL
+2502		BOX DRAWINGS LIGHT VERTICAL
+2503		BOX DRAWINGS HEAVY VERTICAL
+2504		BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505		BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506		BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507		BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508		BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509		BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A		BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B		BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C		BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D		BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E		BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F		BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510		BOX DRAWINGS LIGHT DOWN AND LEFT
+2511		BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512		BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513		BOX DRAWINGS HEAVY DOWN AND LEFT
+2514		BOX DRAWINGS LIGHT UP AND RIGHT
+2515		BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516		BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517		BOX DRAWINGS HEAVY UP AND RIGHT
+2518		BOX DRAWINGS LIGHT UP AND LEFT
+2519		BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A		BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B		BOX DRAWINGS HEAVY UP AND LEFT
+251C		BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D		BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E		BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F		BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520		BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521		BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522		BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523		BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524		BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525		BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526		BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527		BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528		BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529		BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A		BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B		BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C		BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D		BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E		BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F		BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530		BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531		BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532		BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533		BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534		BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535		BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536		BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537		BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538		BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539		BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A		BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B		BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C		BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D		BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E		BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F		BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540		BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541		BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542		BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543		BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544		BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545		BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546		BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547		BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548		BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549		BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A		BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B		BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C		BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D		BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E		BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F		BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550		BOX DRAWINGS DOUBLE HORIZONTAL
+2551		BOX DRAWINGS DOUBLE VERTICAL
+2552		BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553		BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554		BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555		BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556		BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557		BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558		BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559		BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A		BOX DRAWINGS DOUBLE UP AND RIGHT
+255B		BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C		BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D		BOX DRAWINGS DOUBLE UP AND LEFT
+255E		BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F		BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560		BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561		BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562		BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563		BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564		BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565		BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566		BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567		BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568		BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569		BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A		BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B		BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C		BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D		BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E		BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F		BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570		BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571		BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572		BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573		BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574		BOX DRAWINGS LIGHT LEFT
+2575		BOX DRAWINGS LIGHT UP
+2576		BOX DRAWINGS LIGHT RIGHT
+2577		BOX DRAWINGS LIGHT DOWN
+2578		BOX DRAWINGS HEAVY LEFT
+2579		BOX DRAWINGS HEAVY UP
+257A		BOX DRAWINGS HEAVY RIGHT
+257B		BOX DRAWINGS HEAVY DOWN
+257C		BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D		BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E		BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F		BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580		UPPER HALF BLOCK
+2581		LOWER ONE EIGHTH BLOCK
+2582		LOWER ONE QUARTER BLOCK
+2583		LOWER THREE EIGHTHS BLOCK
+2584		LOWER HALF BLOCK
+2585		LOWER FIVE EIGHTHS BLOCK
+2586		LOWER THREE QUARTERS BLOCK
+2587		LOWER SEVEN EIGHTHS BLOCK
+2588		FULL BLOCK
+2589		LEFT SEVEN EIGHTHS BLOCK
+258A		LEFT THREE QUARTERS BLOCK
+258B		LEFT FIVE EIGHTHS BLOCK
+258C		LEFT HALF BLOCK
+258D		LEFT THREE EIGHTHS BLOCK
+258E		LEFT ONE QUARTER BLOCK
+258F		LEFT ONE EIGHTH BLOCK
+2590		RIGHT HALF BLOCK
+2591		LIGHT SHADE
+2592		MEDIUM SHADE
+2593		DARK SHADE
+2594		UPPER ONE EIGHTH BLOCK
+2595		RIGHT ONE EIGHTH BLOCK
+2596		QUADRANT LOWER LEFT
+2597		QUADRANT LOWER RIGHT
+2598		QUADRANT UPPER LEFT
+2599		QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A		QUADRANT UPPER LEFT AND LOWER RIGHT
+259B		QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C		QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D		QUADRANT UPPER RIGHT
+259E		QUADRANT UPPER RIGHT AND LOWER LEFT
+259F		QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0		BLACK SQUARE
+25A1		WHITE SQUARE
+25A2		WHITE SQUARE WITH ROUNDED CORNERS
+25A3		WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4		SQUARE WITH HORIZONTAL FILL
+25A5		SQUARE WITH VERTICAL FILL
+25A6		SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7		SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8		SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9		SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA		BLACK SMALL SQUARE
+25AB		WHITE SMALL SQUARE
+25AC		BLACK RECTANGLE
+25AD		WHITE RECTANGLE
+25AE		BLACK VERTICAL RECTANGLE
+25AF		WHITE VERTICAL RECTANGLE
+25B0		BLACK PARALLELOGRAM
+25B1		WHITE PARALLELOGRAM
+25B2		BLACK UP-POINTING TRIANGLE
+25B3		WHITE UP-POINTING TRIANGLE
+25B4		BLACK UP-POINTING SMALL TRIANGLE
+25B5		WHITE UP-POINTING SMALL TRIANGLE
+25B6		BLACK RIGHT-POINTING TRIANGLE
+25B7		WHITE RIGHT-POINTING TRIANGLE
+25B8		BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9		WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA		BLACK RIGHT-POINTING POINTER
+25BB		WHITE RIGHT-POINTING POINTER
+25BC		BLACK DOWN-POINTING TRIANGLE
+25BD		WHITE DOWN-POINTING TRIANGLE
+25BE		BLACK DOWN-POINTING SMALL TRIANGLE
+25BF		WHITE DOWN-POINTING SMALL TRIANGLE
+25C0		BLACK LEFT-POINTING TRIANGLE
+25C1		WHITE LEFT-POINTING TRIANGLE
+25C2		BLACK LEFT-POINTING SMALL TRIANGLE
+25C3		WHITE LEFT-POINTING SMALL TRIANGLE
+25C4		BLACK LEFT-POINTING POINTER
+25C5		WHITE LEFT-POINTING POINTER
+25C6		BLACK DIAMOND
+25C7		WHITE DIAMOND
+25C8		WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9		FISHEYE
+25CA		LOZENGE
+25CB		WHITE CIRCLE
+25CC		DOTTED CIRCLE
+25CD		CIRCLE WITH VERTICAL FILL
+25CE		BULLSEYE
+25CF		BLACK CIRCLE
+25D0		CIRCLE WITH LEFT HALF BLACK
+25D1		CIRCLE WITH RIGHT HALF BLACK
+25D2		CIRCLE WITH LOWER HALF BLACK
+25D3		CIRCLE WITH UPPER HALF BLACK
+25D4		CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5		CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6		LEFT HALF BLACK CIRCLE
+25D7		RIGHT HALF BLACK CIRCLE
+25D8		INVERSE BULLET
+25D9		INVERSE WHITE CIRCLE
+25DA		UPPER HALF INVERSE WHITE CIRCLE
+25DB		LOWER HALF INVERSE WHITE CIRCLE
+25DC		UPPER LEFT QUADRANT CIRCULAR ARC
+25DD		UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE		LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF		LOWER LEFT QUADRANT CIRCULAR ARC
+25E0		UPPER HALF CIRCLE
+25E1		LOWER HALF CIRCLE
+25E2		BLACK LOWER RIGHT TRIANGLE
+25E3		BLACK LOWER LEFT TRIANGLE
+25E4		BLACK UPPER LEFT TRIANGLE
+25E5		BLACK UPPER RIGHT TRIANGLE
+25E6		WHITE BULLET
+25E7		SQUARE WITH LEFT HALF BLACK
+25E8		SQUARE WITH RIGHT HALF BLACK
+25E9		SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA		SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB		WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC		WHITE UP-POINTING TRIANGLE WITH DOT
+25ED		UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE		UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF		LARGE CIRCLE
+25F0		WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1		WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2		WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3		WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4		WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5		WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6		WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7		WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8		UPPER LEFT TRIANGLE
+25F9		UPPER RIGHT TRIANGLE
+25FA		LOWER LEFT TRIANGLE
+25FB		WHITE MEDIUM SQUARE
+25FC		BLACK MEDIUM SQUARE
+25FD		WHITE MEDIUM SMALL SQUARE
+25FE		BLACK MEDIUM SMALL SQUARE
+25FF		LOWER RIGHT TRIANGLE
+2600		BLACK SUN WITH RAYS
+2601		CLOUD
+2602		UMBRELLA
+2603		SNOWMAN
+2604		COMET
+2605		BLACK STAR
+2606		WHITE STAR
+2607		LIGHTNING
+2608		THUNDERSTORM
+2609		SUN
+260A		ASCENDING NODE
+260B		DESCENDING NODE
+260C		CONJUNCTION
+260D		OPPOSITION
+260E		BLACK TELEPHONE
+260F		WHITE TELEPHONE
+2610		BALLOT BOX
+2611		BALLOT BOX WITH CHECK
+2612		BALLOT BOX WITH X
+2613		SALTIRE
+2614		UMBRELLA WITH RAIN DROPS
+2615		HOT BEVERAGE
+2616		WHITE SHOGI PIECE
+2617		BLACK SHOGI PIECE
+2618		SHAMROCK
+2619		REVERSED ROTATED FLORAL HEART BULLET
+261A		BLACK LEFT POINTING INDEX
+261B		BLACK RIGHT POINTING INDEX
+261C		WHITE LEFT POINTING INDEX
+261D		WHITE UP POINTING INDEX
+261E		WHITE RIGHT POINTING INDEX
+261F		WHITE DOWN POINTING INDEX
+2620		SKULL AND CROSSBONES
+2621		CAUTION SIGN
+2622		RADIOACTIVE SIGN
+2623		BIOHAZARD SIGN
+2624		CADUCEUS
+2625		ANKH
+2626		ORTHODOX CROSS
+2627		CHI RHO
+2628		CROSS OF LORRAINE
+2629		CROSS OF JERUSALEM
+262A		STAR AND CRESCENT
+262B		FARSI SYMBOL
+262C		ADI SHAKTI
+262D		HAMMER AND SICKLE
+262E		PEACE SYMBOL
+262F		YIN YANG
+2630		TRIGRAM FOR HEAVEN
+2631		TRIGRAM FOR LAKE
+2632		TRIGRAM FOR FIRE
+2633		TRIGRAM FOR THUNDER
+2634		TRIGRAM FOR WIND
+2635		TRIGRAM FOR WATER
+2636		TRIGRAM FOR MOUNTAIN
+2637		TRIGRAM FOR EARTH
+2638		WHEEL OF DHARMA
+2639		WHITE FROWNING FACE
+263A		WHITE SMILING FACE
+263B		BLACK SMILING FACE
+263C		WHITE SUN WITH RAYS
+263D		FIRST QUARTER MOON
+263E		LAST QUARTER MOON
+263F		MERCURY
+2640		FEMALE SIGN
+2641		EARTH
+2642		MALE SIGN
+2643		JUPITER
+2644		SATURN
+2645		URANUS
+2646		NEPTUNE
+2647		PLUTO
+2648		ARIES
+2649		TAURUS
+264A		GEMINI
+264B		CANCER
+264C		LEO
+264D		VIRGO
+264E		LIBRA
+264F		SCORPIUS
+2650		SAGITTARIUS
+2651		CAPRICORN
+2652		AQUARIUS
+2653		PISCES
+2654		WHITE CHESS KING
+2655		WHITE CHESS QUEEN
+2656		WHITE CHESS ROOK
+2657		WHITE CHESS BISHOP
+2658		WHITE CHESS KNIGHT
+2659		WHITE CHESS PAWN
+265A		BLACK CHESS KING
+265B		BLACK CHESS QUEEN
+265C		BLACK CHESS ROOK
+265D		BLACK CHESS BISHOP
+265E		BLACK CHESS KNIGHT
+265F		BLACK CHESS PAWN
+2660		BLACK SPADE SUIT
+2661		WHITE HEART SUIT
+2662		WHITE DIAMOND SUIT
+2663		BLACK CLUB SUIT
+2664		WHITE SPADE SUIT
+2665		BLACK HEART SUIT
+2666		BLACK DIAMOND SUIT
+2667		WHITE CLUB SUIT
+2668		HOT SPRINGS
+2669		QUARTER NOTE
+266A		EIGHTH NOTE
+266B		BEAMED EIGHTH NOTES
+266C		BEAMED SIXTEENTH NOTES
+266D		MUSIC FLAT SIGN
+266E		MUSIC NATURAL SIGN
+266F		MUSIC SHARP SIGN
+2670		WEST SYRIAC CROSS
+2671		EAST SYRIAC CROSS
+2672		UNIVERSAL RECYCLING SYMBOL
+2673		RECYCLING SYMBOL FOR TYPE-1 PLASTICS
+2674		RECYCLING SYMBOL FOR TYPE-2 PLASTICS
+2675		RECYCLING SYMBOL FOR TYPE-3 PLASTICS
+2676		RECYCLING SYMBOL FOR TYPE-4 PLASTICS
+2677		RECYCLING SYMBOL FOR TYPE-5 PLASTICS
+2678		RECYCLING SYMBOL FOR TYPE-6 PLASTICS
+2679		RECYCLING SYMBOL FOR TYPE-7 PLASTICS
+267A		RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B		BLACK UNIVERSAL RECYCLING SYMBOL
+267C		RECYCLED PAPER SYMBOL
+267D		PARTIALLY-RECYCLED PAPER SYMBOL
+267E		PERMANENT PAPER SIGN
+267F		WHEELCHAIR SYMBOL
+2680		DIE FACE-1
+2681		DIE FACE-2
+2682		DIE FACE-3
+2683		DIE FACE-4
+2684		DIE FACE-5
+2685		DIE FACE-6
+2686		WHITE CIRCLE WITH DOT RIGHT
+2687		WHITE CIRCLE WITH TWO DOTS
+2688		BLACK CIRCLE WITH WHITE DOT RIGHT
+2689		BLACK CIRCLE WITH TWO WHITE DOTS
+268A		MONOGRAM FOR YANG
+268B		MONOGRAM FOR YIN
+268C		DIGRAM FOR GREATER YANG
+268D		DIGRAM FOR LESSER YIN
+268E		DIGRAM FOR LESSER YANG
+268F		DIGRAM FOR GREATER YIN
+2690		WHITE FLAG
+2691		BLACK FLAG
+2692		HAMMER AND PICK
+2693		ANCHOR
+2694		CROSSED SWORDS
+2695		STAFF OF AESCULAPIUS
+2696		SCALES
+2697		ALEMBIC
+2698		FLOWER
+2699		GEAR
+269A		STAFF OF HERMES
+269B		ATOM SYMBOL
+269C		FLEUR-DE-LIS
+26A0		WARNING SIGN
+26A1		HIGH VOLTAGE SIGN
+26A2		DOUBLED FEMALE SIGN
+26A3		DOUBLED MALE SIGN
+26A4		INTERLOCKED FEMALE AND MALE SIGN
+26A5		MALE AND FEMALE SIGN
+26A6		MALE WITH STROKE SIGN
+26A7		MALE WITH STROKE AND MALE AND FEMALE SIGN
+26A8		VERTICAL MALE WITH STROKE SIGN
+26A9		HORIZONTAL MALE WITH STROKE SIGN
+26AA		MEDIUM WHITE CIRCLE
+26AB		MEDIUM BLACK CIRCLE
+26AC		MEDIUM SMALL WHITE CIRCLE
+26AD		MARRIAGE SYMBOL
+26AE		DIVORCE SYMBOL
+26AF		UNMARRIED PARTNERSHIP SYMBOL
+26B0		COFFIN
+26B1		FUNERAL URN
+2701		UPPER BLADE SCISSORS
+2702		BLACK SCISSORS
+2703		LOWER BLADE SCISSORS
+2704		WHITE SCISSORS
+2706		TELEPHONE LOCATION SIGN
+2707		TAPE DRIVE
+2708		AIRPLANE
+2709		ENVELOPE
+270C		VICTORY HAND
+270D		WRITING HAND
+270E		LOWER RIGHT PENCIL
+270F		PENCIL
+2710		UPPER RIGHT PENCIL
+2711		WHITE NIB
+2712		BLACK NIB
+2713		CHECK MARK
+2714		HEAVY CHECK MARK
+2715		MULTIPLICATION X
+2716		HEAVY MULTIPLICATION X
+2717		BALLOT X
+2718		HEAVY BALLOT X
+2719		OUTLINED GREEK CROSS
+271A		HEAVY GREEK CROSS
+271B		OPEN CENTRE CROSS
+271C		HEAVY OPEN CENTRE CROSS
+271D		LATIN CROSS
+271E		SHADOWED WHITE LATIN CROSS
+271F		OUTLINED LATIN CROSS
+2720		MALTESE CROSS
+2721		STAR OF DAVID
+2722		FOUR TEARDROP-SPOKED ASTERISK
+2723		FOUR BALLOON-SPOKED ASTERISK
+2724		HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725		FOUR CLUB-SPOKED ASTERISK
+2726		BLACK FOUR POINTED STAR
+2727		WHITE FOUR POINTED STAR
+2729		STRESS OUTLINED WHITE STAR
+272A		CIRCLED WHITE STAR
+272B		OPEN CENTRE BLACK STAR
+272C		BLACK CENTRE WHITE STAR
+272D		OUTLINED BLACK STAR
+272E		HEAVY OUTLINED BLACK STAR
+272F		PINWHEEL STAR
+2730		SHADOWED WHITE STAR
+2731		HEAVY ASTERISK
+2732		OPEN CENTRE ASTERISK
+2733		EIGHT SPOKED ASTERISK
+2734		EIGHT POINTED BLACK STAR
+2735		EIGHT POINTED PINWHEEL STAR
+2736		SIX POINTED BLACK STAR
+2737		EIGHT POINTED RECTILINEAR BLACK STAR
+2738		HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739		TWELVE POINTED BLACK STAR
+273A		SIXTEEN POINTED ASTERISK
+273B		TEARDROP-SPOKED ASTERISK
+273C		OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D		HEAVY TEARDROP-SPOKED ASTERISK
+273E		SIX PETALLED BLACK AND WHITE FLORETTE
+273F		BLACK FLORETTE
+2740		WHITE FLORETTE
+2741		EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742		CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743		HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744		SNOWFLAKE
+2745		TIGHT TRIFOLIATE SNOWFLAKE
+2746		HEAVY CHEVRON SNOWFLAKE
+2747		SPARKLE
+2748		HEAVY SPARKLE
+2749		BALLOON-SPOKED ASTERISK
+274A		EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B		HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D		SHADOWED WHITE CIRCLE
+274F		LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750		UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751		LOWER RIGHT SHADOWED WHITE SQUARE
+2752		UPPER RIGHT SHADOWED WHITE SQUARE
+2756		BLACK DIAMOND MINUS WHITE X
+2758		LIGHT VERTICAL BAR
+2759		MEDIUM VERTICAL BAR
+275A		HEAVY VERTICAL BAR
+275B		HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C		HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D		HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E		HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761		CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762		HEAVY EXCLAMATION MARK ORNAMENT
+2763		HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764		HEAVY BLACK HEART
+2765		ROTATED HEAVY BLACK HEART BULLET
+2766		FLORAL HEART
+2767		ROTATED FLORAL HEART BULLET
+2768		MEDIUM LEFT PARENTHESIS ORNAMENT
+2769		MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A		MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B		MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C		MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D		MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E		HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F		HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770		HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771		HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772		LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773		LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774		MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775		MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776		DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777		DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778		DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779		DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A		DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B		DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C		DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D		DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E		DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F		DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780		DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781		DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782		DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783		DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784		DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785		DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786		DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787		DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788		DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789		DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A		DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B		DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C		DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D		DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E		DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F		DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790		DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791		DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792		DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793		DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794		HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798		HEAVY SOUTH EAST ARROW
+2799		HEAVY RIGHTWARDS ARROW
+279A		HEAVY NORTH EAST ARROW
+279B		DRAFTING POINT RIGHTWARDS ARROW
+279C		HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D		TRIANGLE-HEADED RIGHTWARDS ARROW
+279E		HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F		DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0		HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1		BLACK RIGHTWARDS ARROW
+27A2		THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3		THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4		BLACK RIGHTWARDS ARROWHEAD
+27A5		HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6		HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7		SQUAT BLACK RIGHTWARDS ARROW
+27A8		HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9		RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA		LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB		BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC		FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD		HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE		HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF		NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1		NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2		CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3		WHITE-FEATHERED RIGHTWARDS ARROW
+27B4		BLACK-FEATHERED SOUTH EAST ARROW
+27B5		BLACK-FEATHERED RIGHTWARDS ARROW
+27B6		BLACK-FEATHERED NORTH EAST ARROW
+27B7		HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8		HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9		HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA		TEARDROP-BARBED RIGHTWARDS ARROW
+27BB		HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC		WEDGE-TAILED RIGHTWARDS ARROW
+27BD		HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE		OPEN-OUTLINED RIGHTWARDS ARROW
+27C0		THREE DIMENSIONAL ANGLE
+27C1		WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+27C2		PERPENDICULAR
+27C3		OPEN SUBSET
+27C4		OPEN SUPERSET
+27C5		LEFT S-SHAPED BAG DELIMITER
+27C6		RIGHT S-SHAPED BAG DELIMITER
+27D0		WHITE DIAMOND WITH CENTRED DOT
+27D1		AND WITH DOT
+27D2		ELEMENT OF OPENING UPWARDS
+27D3		LOWER RIGHT CORNER WITH DOT
+27D4		UPPER LEFT CORNER WITH DOT
+27D5		LEFT OUTER JOIN
+27D6		RIGHT OUTER JOIN
+27D7		FULL OUTER JOIN
+27D8		LARGE UP TACK
+27D9		LARGE DOWN TACK
+27DA		LEFT AND RIGHT DOUBLE TURNSTILE
+27DB		LEFT AND RIGHT TACK
+27DC		LEFT MULTIMAP
+27DD		LONG RIGHT TACK
+27DE		LONG LEFT TACK
+27DF		UP TACK WITH CIRCLE ABOVE
+27E0		LOZENGE DIVIDED BY HORIZONTAL RULE
+27E1		WHITE CONCAVE-SIDED DIAMOND
+27E2		WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3		WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4		WHITE SQUARE WITH LEFTWARDS TICK
+27E5		WHITE SQUARE WITH RIGHTWARDS TICK
+27E6		MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7		MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8		MATHEMATICAL LEFT ANGLE BRACKET
+27E9		MATHEMATICAL RIGHT ANGLE BRACKET
+27EA		MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB		MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27F0		UPWARDS QUADRUPLE ARROW
+27F1		DOWNWARDS QUADRUPLE ARROW
+27F2		ANTICLOCKWISE GAPPED CIRCLE ARROW
+27F3		CLOCKWISE GAPPED CIRCLE ARROW
+27F4		RIGHT ARROW WITH CIRCLED PLUS
+27F5		LONG LEFTWARDS ARROW
+27F6		LONG RIGHTWARDS ARROW
+27F7		LONG LEFT RIGHT ARROW
+27F8		LONG LEFTWARDS DOUBLE ARROW
+27F9		LONG RIGHTWARDS DOUBLE ARROW
+27FA		LONG LEFT RIGHT DOUBLE ARROW
+27FB		LONG LEFTWARDS ARROW FROM BAR
+27FC		LONG RIGHTWARDS ARROW FROM BAR
+27FD		LONG LEFTWARDS DOUBLE ARROW FROM BAR
+27FE		LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+27FF		LONG RIGHTWARDS SQUIGGLE ARROW
+2800		BRAILLE PATTERN BLANK
+2801		BRAILLE PATTERN DOTS-1
+2802		BRAILLE PATTERN DOTS-2
+2803		BRAILLE PATTERN DOTS-12
+2804		BRAILLE PATTERN DOTS-3
+2805		BRAILLE PATTERN DOTS-13
+2806		BRAILLE PATTERN DOTS-23
+2807		BRAILLE PATTERN DOTS-123
+2808		BRAILLE PATTERN DOTS-4
+2809		BRAILLE PATTERN DOTS-14
+280A		BRAILLE PATTERN DOTS-24
+280B		BRAILLE PATTERN DOTS-124
+280C		BRAILLE PATTERN DOTS-34
+280D		BRAILLE PATTERN DOTS-134
+280E		BRAILLE PATTERN DOTS-234
+280F		BRAILLE PATTERN DOTS-1234
+2810		BRAILLE PATTERN DOTS-5
+2811		BRAILLE PATTERN DOTS-15
+2812		BRAILLE PATTERN DOTS-25
+2813		BRAILLE PATTERN DOTS-125
+2814		BRAILLE PATTERN DOTS-35
+2815		BRAILLE PATTERN DOTS-135
+2816		BRAILLE PATTERN DOTS-235
+2817		BRAILLE PATTERN DOTS-1235
+2818		BRAILLE PATTERN DOTS-45
+2819		BRAILLE PATTERN DOTS-145
+281A		BRAILLE PATTERN DOTS-245
+281B		BRAILLE PATTERN DOTS-1245
+281C		BRAILLE PATTERN DOTS-345
+281D		BRAILLE PATTERN DOTS-1345
+281E		BRAILLE PATTERN DOTS-2345
+281F		BRAILLE PATTERN DOTS-12345
+2820		BRAILLE PATTERN DOTS-6
+2821		BRAILLE PATTERN DOTS-16
+2822		BRAILLE PATTERN DOTS-26
+2823		BRAILLE PATTERN DOTS-126
+2824		BRAILLE PATTERN DOTS-36
+2825		BRAILLE PATTERN DOTS-136
+2826		BRAILLE PATTERN DOTS-236
+2827		BRAILLE PATTERN DOTS-1236
+2828		BRAILLE PATTERN DOTS-46
+2829		BRAILLE PATTERN DOTS-146
+282A		BRAILLE PATTERN DOTS-246
+282B		BRAILLE PATTERN DOTS-1246
+282C		BRAILLE PATTERN DOTS-346
+282D		BRAILLE PATTERN DOTS-1346
+282E		BRAILLE PATTERN DOTS-2346
+282F		BRAILLE PATTERN DOTS-12346
+2830		BRAILLE PATTERN DOTS-56
+2831		BRAILLE PATTERN DOTS-156
+2832		BRAILLE PATTERN DOTS-256
+2833		BRAILLE PATTERN DOTS-1256
+2834		BRAILLE PATTERN DOTS-356
+2835		BRAILLE PATTERN DOTS-1356
+2836		BRAILLE PATTERN DOTS-2356
+2837		BRAILLE PATTERN DOTS-12356
+2838		BRAILLE PATTERN DOTS-456
+2839		BRAILLE PATTERN DOTS-1456
+283A		BRAILLE PATTERN DOTS-2456
+283B		BRAILLE PATTERN DOTS-12456
+283C		BRAILLE PATTERN DOTS-3456
+283D		BRAILLE PATTERN DOTS-13456
+283E		BRAILLE PATTERN DOTS-23456
+283F		BRAILLE PATTERN DOTS-123456
+2840		BRAILLE PATTERN DOTS-7
+2841		BRAILLE PATTERN DOTS-17
+2842		BRAILLE PATTERN DOTS-27
+2843		BRAILLE PATTERN DOTS-127
+2844		BRAILLE PATTERN DOTS-37
+2845		BRAILLE PATTERN DOTS-137
+2846		BRAILLE PATTERN DOTS-237
+2847		BRAILLE PATTERN DOTS-1237
+2848		BRAILLE PATTERN DOTS-47
+2849		BRAILLE PATTERN DOTS-147
+284A		BRAILLE PATTERN DOTS-247
+284B		BRAILLE PATTERN DOTS-1247
+284C		BRAILLE PATTERN DOTS-347
+284D		BRAILLE PATTERN DOTS-1347
+284E		BRAILLE PATTERN DOTS-2347
+284F		BRAILLE PATTERN DOTS-12347
+2850		BRAILLE PATTERN DOTS-57
+2851		BRAILLE PATTERN DOTS-157
+2852		BRAILLE PATTERN DOTS-257
+2853		BRAILLE PATTERN DOTS-1257
+2854		BRAILLE PATTERN DOTS-357
+2855		BRAILLE PATTERN DOTS-1357
+2856		BRAILLE PATTERN DOTS-2357
+2857		BRAILLE PATTERN DOTS-12357
+2858		BRAILLE PATTERN DOTS-457
+2859		BRAILLE PATTERN DOTS-1457
+285A		BRAILLE PATTERN DOTS-2457
+285B		BRAILLE PATTERN DOTS-12457
+285C		BRAILLE PATTERN DOTS-3457
+285D		BRAILLE PATTERN DOTS-13457
+285E		BRAILLE PATTERN DOTS-23457
+285F		BRAILLE PATTERN DOTS-123457
+2860		BRAILLE PATTERN DOTS-67
+2861		BRAILLE PATTERN DOTS-167
+2862		BRAILLE PATTERN DOTS-267
+2863		BRAILLE PATTERN DOTS-1267
+2864		BRAILLE PATTERN DOTS-367
+2865		BRAILLE PATTERN DOTS-1367
+2866		BRAILLE PATTERN DOTS-2367
+2867		BRAILLE PATTERN DOTS-12367
+2868		BRAILLE PATTERN DOTS-467
+2869		BRAILLE PATTERN DOTS-1467
+286A		BRAILLE PATTERN DOTS-2467
+286B		BRAILLE PATTERN DOTS-12467
+286C		BRAILLE PATTERN DOTS-3467
+286D		BRAILLE PATTERN DOTS-13467
+286E		BRAILLE PATTERN DOTS-23467
+286F		BRAILLE PATTERN DOTS-123467
+2870		BRAILLE PATTERN DOTS-567
+2871		BRAILLE PATTERN DOTS-1567
+2872		BRAILLE PATTERN DOTS-2567
+2873		BRAILLE PATTERN DOTS-12567
+2874		BRAILLE PATTERN DOTS-3567
+2875		BRAILLE PATTERN DOTS-13567
+2876		BRAILLE PATTERN DOTS-23567
+2877		BRAILLE PATTERN DOTS-123567
+2878		BRAILLE PATTERN DOTS-4567
+2879		BRAILLE PATTERN DOTS-14567
+287A		BRAILLE PATTERN DOTS-24567
+287B		BRAILLE PATTERN DOTS-124567
+287C		BRAILLE PATTERN DOTS-34567
+287D		BRAILLE PATTERN DOTS-134567
+287E		BRAILLE PATTERN DOTS-234567
+287F		BRAILLE PATTERN DOTS-1234567
+2880		BRAILLE PATTERN DOTS-8
+2881		BRAILLE PATTERN DOTS-18
+2882		BRAILLE PATTERN DOTS-28
+2883		BRAILLE PATTERN DOTS-128
+2884		BRAILLE PATTERN DOTS-38
+2885		BRAILLE PATTERN DOTS-138
+2886		BRAILLE PATTERN DOTS-238
+2887		BRAILLE PATTERN DOTS-1238
+2888		BRAILLE PATTERN DOTS-48
+2889		BRAILLE PATTERN DOTS-148
+288A		BRAILLE PATTERN DOTS-248
+288B		BRAILLE PATTERN DOTS-1248
+288C		BRAILLE PATTERN DOTS-348
+288D		BRAILLE PATTERN DOTS-1348
+288E		BRAILLE PATTERN DOTS-2348
+288F		BRAILLE PATTERN DOTS-12348
+2890		BRAILLE PATTERN DOTS-58
+2891		BRAILLE PATTERN DOTS-158
+2892		BRAILLE PATTERN DOTS-258
+2893		BRAILLE PATTERN DOTS-1258
+2894		BRAILLE PATTERN DOTS-358
+2895		BRAILLE PATTERN DOTS-1358
+2896		BRAILLE PATTERN DOTS-2358
+2897		BRAILLE PATTERN DOTS-12358
+2898		BRAILLE PATTERN DOTS-458
+2899		BRAILLE PATTERN DOTS-1458
+289A		BRAILLE PATTERN DOTS-2458
+289B		BRAILLE PATTERN DOTS-12458
+289C		BRAILLE PATTERN DOTS-3458
+289D		BRAILLE PATTERN DOTS-13458
+289E		BRAILLE PATTERN DOTS-23458
+289F		BRAILLE PATTERN DOTS-123458
+28A0		BRAILLE PATTERN DOTS-68
+28A1		BRAILLE PATTERN DOTS-168
+28A2		BRAILLE PATTERN DOTS-268
+28A3		BRAILLE PATTERN DOTS-1268
+28A4		BRAILLE PATTERN DOTS-368
+28A5		BRAILLE PATTERN DOTS-1368
+28A6		BRAILLE PATTERN DOTS-2368
+28A7		BRAILLE PATTERN DOTS-12368
+28A8		BRAILLE PATTERN DOTS-468
+28A9		BRAILLE PATTERN DOTS-1468
+28AA		BRAILLE PATTERN DOTS-2468
+28AB		BRAILLE PATTERN DOTS-12468
+28AC		BRAILLE PATTERN DOTS-3468
+28AD		BRAILLE PATTERN DOTS-13468
+28AE		BRAILLE PATTERN DOTS-23468
+28AF		BRAILLE PATTERN DOTS-123468
+28B0		BRAILLE PATTERN DOTS-568
+28B1		BRAILLE PATTERN DOTS-1568
+28B2		BRAILLE PATTERN DOTS-2568
+28B3		BRAILLE PATTERN DOTS-12568
+28B4		BRAILLE PATTERN DOTS-3568
+28B5		BRAILLE PATTERN DOTS-13568
+28B6		BRAILLE PATTERN DOTS-23568
+28B7		BRAILLE PATTERN DOTS-123568
+28B8		BRAILLE PATTERN DOTS-4568
+28B9		BRAILLE PATTERN DOTS-14568
+28BA		BRAILLE PATTERN DOTS-24568
+28BB		BRAILLE PATTERN DOTS-124568
+28BC		BRAILLE PATTERN DOTS-34568
+28BD		BRAILLE PATTERN DOTS-134568
+28BE		BRAILLE PATTERN DOTS-234568
+28BF		BRAILLE PATTERN DOTS-1234568
+28C0		BRAILLE PATTERN DOTS-78
+28C1		BRAILLE PATTERN DOTS-178
+28C2		BRAILLE PATTERN DOTS-278
+28C3		BRAILLE PATTERN DOTS-1278
+28C4		BRAILLE PATTERN DOTS-378
+28C5		BRAILLE PATTERN DOTS-1378
+28C6		BRAILLE PATTERN DOTS-2378
+28C7		BRAILLE PATTERN DOTS-12378
+28C8		BRAILLE PATTERN DOTS-478
+28C9		BRAILLE PATTERN DOTS-1478
+28CA		BRAILLE PATTERN DOTS-2478
+28CB		BRAILLE PATTERN DOTS-12478
+28CC		BRAILLE PATTERN DOTS-3478
+28CD		BRAILLE PATTERN DOTS-13478
+28CE		BRAILLE PATTERN DOTS-23478
+28CF		BRAILLE PATTERN DOTS-123478
+28D0		BRAILLE PATTERN DOTS-578
+28D1		BRAILLE PATTERN DOTS-1578
+28D2		BRAILLE PATTERN DOTS-2578
+28D3		BRAILLE PATTERN DOTS-12578
+28D4		BRAILLE PATTERN DOTS-3578
+28D5		BRAILLE PATTERN DOTS-13578
+28D6		BRAILLE PATTERN DOTS-23578
+28D7		BRAILLE PATTERN DOTS-123578
+28D8		BRAILLE PATTERN DOTS-4578
+28D9		BRAILLE PATTERN DOTS-14578
+28DA		BRAILLE PATTERN DOTS-24578
+28DB		BRAILLE PATTERN DOTS-124578
+28DC		BRAILLE PATTERN DOTS-34578
+28DD		BRAILLE PATTERN DOTS-134578
+28DE		BRAILLE PATTERN DOTS-234578
+28DF		BRAILLE PATTERN DOTS-1234578
+28E0		BRAILLE PATTERN DOTS-678
+28E1		BRAILLE PATTERN DOTS-1678
+28E2		BRAILLE PATTERN DOTS-2678
+28E3		BRAILLE PATTERN DOTS-12678
+28E4		BRAILLE PATTERN DOTS-3678
+28E5		BRAILLE PATTERN DOTS-13678
+28E6		BRAILLE PATTERN DOTS-23678
+28E7		BRAILLE PATTERN DOTS-123678
+28E8		BRAILLE PATTERN DOTS-4678
+28E9		BRAILLE PATTERN DOTS-14678
+28EA		BRAILLE PATTERN DOTS-24678
+28EB		BRAILLE PATTERN DOTS-124678
+28EC		BRAILLE PATTERN DOTS-34678
+28ED		BRAILLE PATTERN DOTS-134678
+28EE		BRAILLE PATTERN DOTS-234678
+28EF		BRAILLE PATTERN DOTS-1234678
+28F0		BRAILLE PATTERN DOTS-5678
+28F1		BRAILLE PATTERN DOTS-15678
+28F2		BRAILLE PATTERN DOTS-25678
+28F3		BRAILLE PATTERN DOTS-125678
+28F4		BRAILLE PATTERN DOTS-35678
+28F5		BRAILLE PATTERN DOTS-135678
+28F6		BRAILLE PATTERN DOTS-235678
+28F7		BRAILLE PATTERN DOTS-1235678
+28F8		BRAILLE PATTERN DOTS-45678
+28F9		BRAILLE PATTERN DOTS-145678
+28FA		BRAILLE PATTERN DOTS-245678
+28FB		BRAILLE PATTERN DOTS-1245678
+28FC		BRAILLE PATTERN DOTS-345678
+28FD		BRAILLE PATTERN DOTS-1345678
+28FE		BRAILLE PATTERN DOTS-2345678
+28FF		BRAILLE PATTERN DOTS-12345678
+2900		RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2901		RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2902		LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903		RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904		LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905		RIGHTWARDS TWO-HEADED ARROW FROM BAR
+2906		LEFTWARDS DOUBLE ARROW FROM BAR
+2907		RIGHTWARDS DOUBLE ARROW FROM BAR
+2908		DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909		UPWARDS ARROW WITH HORIZONTAL STROKE
+290A		UPWARDS TRIPLE ARROW
+290B		DOWNWARDS TRIPLE ARROW
+290C		LEFTWARDS DOUBLE DASH ARROW
+290D		RIGHTWARDS DOUBLE DASH ARROW
+290E		LEFTWARDS TRIPLE DASH ARROW
+290F		RIGHTWARDS TRIPLE DASH ARROW
+2910		RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911		RIGHTWARDS ARROW WITH DOTTED STEM
+2912		UPWARDS ARROW TO BAR
+2913		DOWNWARDS ARROW TO BAR
+2914		RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2915		RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2916		RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+2917		RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2918		RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2919		LEFTWARDS ARROW-TAIL
+291A		RIGHTWARDS ARROW-TAIL
+291B		LEFTWARDS DOUBLE ARROW-TAIL
+291C		RIGHTWARDS DOUBLE ARROW-TAIL
+291D		LEFTWARDS ARROW TO BLACK DIAMOND
+291E		RIGHTWARDS ARROW TO BLACK DIAMOND
+291F		LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920		RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921		NORTH WEST AND SOUTH EAST ARROW
+2922		NORTH EAST AND SOUTH WEST ARROW
+2923		NORTH WEST ARROW WITH HOOK
+2924		NORTH EAST ARROW WITH HOOK
+2925		SOUTH EAST ARROW WITH HOOK
+2926		SOUTH WEST ARROW WITH HOOK
+2927		NORTH WEST ARROW AND NORTH EAST ARROW
+2928		NORTH EAST ARROW AND SOUTH EAST ARROW
+2929		SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A		SOUTH WEST ARROW AND NORTH WEST ARROW
+292B		RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C		FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D		SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E		NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F		FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930		RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931		NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932		NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933		WAVE ARROW POINTING DIRECTLY RIGHT
+2934		ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935		ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936		ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937		ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938		RIGHT-SIDE ARC CLOCKWISE ARROW
+2939		LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A		TOP ARC ANTICLOCKWISE ARROW
+293B		BOTTOM ARC ANTICLOCKWISE ARROW
+293C		TOP ARC CLOCKWISE ARROW WITH MINUS
+293D		TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E		LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F		LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940		ANTICLOCKWISE CLOSED CIRCLE ARROW
+2941		CLOCKWISE CLOSED CIRCLE ARROW
+2942		RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943		LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944		SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945		RIGHTWARDS ARROW WITH PLUS BELOW
+2946		LEFTWARDS ARROW WITH PLUS BELOW
+2947		RIGHTWARDS ARROW THROUGH X
+2948		LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949		UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A		LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B		LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C		UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D		UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E		LEFT BARB UP RIGHT BARB UP HARPOON
+294F		UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950		LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951		UP BARB LEFT DOWN BARB LEFT HARPOON
+2952		LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953		RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954		UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955		DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956		LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957		RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958		UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959		DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A		LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B		RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C		UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D		DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E		LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F		RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960		UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961		DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962		LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963		UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964		RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965		DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966		LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967		LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968		RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969		RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A		LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B		LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C		RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D		RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E		UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F		DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970		RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+2971		EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972		TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973		LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974		RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975		RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976		LESS-THAN ABOVE LEFTWARDS ARROW
+2977		LEFTWARDS ARROW THROUGH LESS-THAN
+2978		GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979		SUBSET ABOVE RIGHTWARDS ARROW
+297A		LEFTWARDS ARROW THROUGH SUBSET
+297B		SUPERSET ABOVE LEFTWARDS ARROW
+297C		LEFT FISH TAIL
+297D		RIGHT FISH TAIL
+297E		UP FISH TAIL
+297F		DOWN FISH TAIL
+2980		TRIPLE VERTICAL BAR DELIMITER
+2981		Z NOTATION SPOT
+2982		Z NOTATION TYPE COLON
+2983		LEFT WHITE CURLY BRACKET
+2984		RIGHT WHITE CURLY BRACKET
+2985		LEFT WHITE PARENTHESIS
+2986		RIGHT WHITE PARENTHESIS
+2987		Z NOTATION LEFT IMAGE BRACKET
+2988		Z NOTATION RIGHT IMAGE BRACKET
+2989		Z NOTATION LEFT BINDING BRACKET
+298A		Z NOTATION RIGHT BINDING BRACKET
+298B		LEFT SQUARE BRACKET WITH UNDERBAR
+298C		RIGHT SQUARE BRACKET WITH UNDERBAR
+298D		LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E		RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F		LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990		RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991		LEFT ANGLE BRACKET WITH DOT
+2992		RIGHT ANGLE BRACKET WITH DOT
+2993		LEFT ARC LESS-THAN BRACKET
+2994		RIGHT ARC GREATER-THAN BRACKET
+2995		DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996		DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997		LEFT BLACK TORTOISE SHELL BRACKET
+2998		RIGHT BLACK TORTOISE SHELL BRACKET
+2999		DOTTED FENCE
+299A		VERTICAL ZIGZAG LINE
+299B		MEASURED ANGLE OPENING LEFT
+299C		RIGHT ANGLE VARIANT WITH SQUARE
+299D		MEASURED RIGHT ANGLE WITH DOT
+299E		ANGLE WITH S INSIDE
+299F		ACUTE ANGLE
+29A0		SPHERICAL ANGLE OPENING LEFT
+29A1		SPHERICAL ANGLE OPENING UP
+29A2		TURNED ANGLE
+29A3		REVERSED ANGLE
+29A4		ANGLE WITH UNDERBAR
+29A5		REVERSED ANGLE WITH UNDERBAR
+29A6		OBLIQUE ANGLE OPENING UP
+29A7		OBLIQUE ANGLE OPENING DOWN
+29A8		MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9		MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA		MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB		MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC		MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD		MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE		MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF		MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+29B0		REVERSED EMPTY SET
+29B1		EMPTY SET WITH OVERBAR
+29B2		EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3		EMPTY SET WITH RIGHT ARROW ABOVE
+29B4		EMPTY SET WITH LEFT ARROW ABOVE
+29B5		CIRCLE WITH HORIZONTAL BAR
+29B6		CIRCLED VERTICAL BAR
+29B7		CIRCLED PARALLEL
+29B8		CIRCLED REVERSE SOLIDUS
+29B9		CIRCLED PERPENDICULAR
+29BA		CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB		CIRCLE WITH SUPERIMPOSED X
+29BC		CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD		UP ARROW THROUGH CIRCLE
+29BE		CIRCLED WHITE BULLET
+29BF		CIRCLED BULLET
+29C0		CIRCLED LESS-THAN
+29C1		CIRCLED GREATER-THAN
+29C2		CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3		CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+29C4		SQUARED RISING DIAGONAL SLASH
+29C5		SQUARED FALLING DIAGONAL SLASH
+29C6		SQUARED ASTERISK
+29C7		SQUARED SMALL CIRCLE
+29C8		SQUARED SQUARE
+29C9		TWO JOINED SQUARES
+29CA		TRIANGLE WITH DOT ABOVE
+29CB		TRIANGLE WITH UNDERBAR
+29CC		S IN TRIANGLE
+29CD		TRIANGLE WITH SERIFS AT BOTTOM
+29CE		RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF		LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0		VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1		BOWTIE WITH LEFT HALF BLACK
+29D2		BOWTIE WITH RIGHT HALF BLACK
+29D3		BLACK BOWTIE
+29D4		TIMES WITH LEFT HALF BLACK
+29D5		TIMES WITH RIGHT HALF BLACK
+29D6		WHITE HOURGLASS
+29D7		BLACK HOURGLASS
+29D8		LEFT WIGGLY FENCE
+29D9		RIGHT WIGGLY FENCE
+29DA		LEFT DOUBLE WIGGLY FENCE
+29DB		RIGHT DOUBLE WIGGLY FENCE
+29DC		INCOMPLETE INFINITY
+29DD		TIE OVER INFINITY
+29DE		INFINITY NEGATED WITH VERTICAL BAR
+29DF		DOUBLE-ENDED MULTIMAP
+29E0		SQUARE WITH CONTOURED OUTLINE
+29E1		INCREASES AS
+29E2		SHUFFLE PRODUCT
+29E3		EQUALS SIGN AND SLANTED PARALLEL
+29E4		EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5		IDENTICAL TO AND SLANTED PARALLEL
+29E6		GLEICH STARK
+29E7		THERMODYNAMIC
+29E8		DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+29E9		DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+29EA		BLACK DIAMOND WITH DOWN ARROW
+29EB		BLACK LOZENGE
+29EC		WHITE CIRCLE WITH DOWN ARROW
+29ED		BLACK CIRCLE WITH DOWN ARROW
+29EE		ERROR-BARRED WHITE SQUARE
+29EF		ERROR-BARRED BLACK SQUARE
+29F0		ERROR-BARRED WHITE DIAMOND
+29F1		ERROR-BARRED BLACK DIAMOND
+29F2		ERROR-BARRED WHITE CIRCLE
+29F3		ERROR-BARRED BLACK CIRCLE
+29F4		RULE-DELAYED
+29F5		REVERSE SOLIDUS OPERATOR
+29F6		SOLIDUS WITH OVERBAR
+29F7		REVERSE SOLIDUS WITH HORIZONTAL STROKE
+29F8		BIG SOLIDUS
+29F9		BIG REVERSE SOLIDUS
+29FA		DOUBLE PLUS
+29FB		TRIPLE PLUS
+29FC		LEFT-POINTING CURVED ANGLE BRACKET
+29FD		RIGHT-POINTING CURVED ANGLE BRACKET
+29FE		TINY
+29FF		MINY
+2A00		N-ARY CIRCLED DOT OPERATOR
+2A01		N-ARY CIRCLED PLUS OPERATOR
+2A02		N-ARY CIRCLED TIMES OPERATOR
+2A03		N-ARY UNION OPERATOR WITH DOT
+2A04		N-ARY UNION OPERATOR WITH PLUS
+2A05		N-ARY SQUARE INTERSECTION OPERATOR
+2A06		N-ARY SQUARE UNION OPERATOR
+2A07		TWO LOGICAL AND OPERATOR
+2A08		TWO LOGICAL OR OPERATOR
+2A09		N-ARY TIMES OPERATOR
+2A0A		MODULO TWO SUM
+2A0B		SUMMATION WITH INTEGRAL
+2A0C		QUADRUPLE INTEGRAL OPERATOR
+2A0D		FINITE PART INTEGRAL
+2A0E		INTEGRAL WITH DOUBLE STROKE
+2A0F		INTEGRAL AVERAGE WITH SLASH
+2A10		CIRCULATION FUNCTION
+2A11		ANTICLOCKWISE INTEGRATION
+2A12		LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13		LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14		LINE INTEGRATION NOT INCLUDING THE POLE
+2A15		INTEGRAL AROUND A POINT OPERATOR
+2A16		QUATERNION INTEGRAL OPERATOR
+2A17		INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18		INTEGRAL WITH TIMES SIGN
+2A19		INTEGRAL WITH INTERSECTION
+2A1A		INTEGRAL WITH UNION
+2A1B		INTEGRAL WITH OVERBAR
+2A1C		INTEGRAL WITH UNDERBAR
+2A1D		JOIN
+2A1E		LARGE LEFT TRIANGLE OPERATOR
+2A1F		Z NOTATION SCHEMA COMPOSITION
+2A20		Z NOTATION SCHEMA PIPING
+2A21		Z NOTATION SCHEMA PROJECTION
+2A22		PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23		PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24		PLUS SIGN WITH TILDE ABOVE
+2A25		PLUS SIGN WITH DOT BELOW
+2A26		PLUS SIGN WITH TILDE BELOW
+2A27		PLUS SIGN WITH SUBSCRIPT TWO
+2A28		PLUS SIGN WITH BLACK TRIANGLE
+2A29		MINUS SIGN WITH COMMA ABOVE
+2A2A		MINUS SIGN WITH DOT BELOW
+2A2B		MINUS SIGN WITH FALLING DOTS
+2A2C		MINUS SIGN WITH RISING DOTS
+2A2D		PLUS SIGN IN LEFT HALF CIRCLE
+2A2E		PLUS SIGN IN RIGHT HALF CIRCLE
+2A2F		VECTOR OR CROSS PRODUCT
+2A30		MULTIPLICATION SIGN WITH DOT ABOVE
+2A31		MULTIPLICATION SIGN WITH UNDERBAR
+2A32		SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33		SMASH PRODUCT
+2A34		MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35		MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36		CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37		MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38		CIRCLED DIVISION SIGN
+2A39		PLUS SIGN IN TRIANGLE
+2A3A		MINUS SIGN IN TRIANGLE
+2A3B		MULTIPLICATION SIGN IN TRIANGLE
+2A3C		INTERIOR PRODUCT
+2A3D		RIGHTHAND INTERIOR PRODUCT
+2A3E		Z NOTATION RELATIONAL COMPOSITION
+2A3F		AMALGAMATION OR COPRODUCT
+2A40		INTERSECTION WITH DOT
+2A41		UNION WITH MINUS SIGN
+2A42		UNION WITH OVERBAR
+2A43		INTERSECTION WITH OVERBAR
+2A44		INTERSECTION WITH LOGICAL AND
+2A45		UNION WITH LOGICAL OR
+2A46		UNION ABOVE INTERSECTION
+2A47		INTERSECTION ABOVE UNION
+2A48		UNION ABOVE BAR ABOVE INTERSECTION
+2A49		INTERSECTION ABOVE BAR ABOVE UNION
+2A4A		UNION BESIDE AND JOINED WITH UNION
+2A4B		INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C		CLOSED UNION WITH SERIFS
+2A4D		CLOSED INTERSECTION WITH SERIFS
+2A4E		DOUBLE SQUARE INTERSECTION
+2A4F		DOUBLE SQUARE UNION
+2A50		CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+2A51		LOGICAL AND WITH DOT ABOVE
+2A52		LOGICAL OR WITH DOT ABOVE
+2A53		DOUBLE LOGICAL AND
+2A54		DOUBLE LOGICAL OR
+2A55		TWO INTERSECTING LOGICAL AND
+2A56		TWO INTERSECTING LOGICAL OR
+2A57		SLOPING LARGE OR
+2A58		SLOPING LARGE AND
+2A59		LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A		LOGICAL AND WITH MIDDLE STEM
+2A5B		LOGICAL OR WITH MIDDLE STEM
+2A5C		LOGICAL AND WITH HORIZONTAL DASH
+2A5D		LOGICAL OR WITH HORIZONTAL DASH
+2A5E		LOGICAL AND WITH DOUBLE OVERBAR
+2A5F		LOGICAL AND WITH UNDERBAR
+2A60		LOGICAL AND WITH DOUBLE UNDERBAR
+2A61		SMALL VEE WITH UNDERBAR
+2A62		LOGICAL OR WITH DOUBLE OVERBAR
+2A63		LOGICAL OR WITH DOUBLE UNDERBAR
+2A64		Z NOTATION DOMAIN ANTIRESTRICTION
+2A65		Z NOTATION RANGE ANTIRESTRICTION
+2A66		EQUALS SIGN WITH DOT BELOW
+2A67		IDENTICAL WITH DOT ABOVE
+2A68		TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+2A69		TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A		TILDE OPERATOR WITH DOT ABOVE
+2A6B		TILDE OPERATOR WITH RISING DOTS
+2A6C		SIMILAR MINUS SIMILAR
+2A6D		CONGRUENT WITH DOT ABOVE
+2A6E		EQUALS WITH ASTERISK
+2A6F		ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70		APPROXIMATELY EQUAL OR EQUAL TO
+2A71		EQUALS SIGN ABOVE PLUS SIGN
+2A72		PLUS SIGN ABOVE EQUALS SIGN
+2A73		EQUALS SIGN ABOVE TILDE OPERATOR
+2A74		DOUBLE COLON EQUAL
+2A75		TWO CONSECUTIVE EQUALS SIGNS
+2A76		THREE CONSECUTIVE EQUALS SIGNS
+2A77		EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78		EQUIVALENT WITH FOUR DOTS ABOVE
+2A79		LESS-THAN WITH CIRCLE INSIDE
+2A7A		GREATER-THAN WITH CIRCLE INSIDE
+2A7B		LESS-THAN WITH QUESTION MARK ABOVE
+2A7C		GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D		LESS-THAN OR SLANTED EQUAL TO
+2A7E		GREATER-THAN OR SLANTED EQUAL TO
+2A7F		LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80		GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81		LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82		GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83		LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84		GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85		LESS-THAN OR APPROXIMATE
+2A86		GREATER-THAN OR APPROXIMATE
+2A87		LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+2A88		GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+2A89		LESS-THAN AND NOT APPROXIMATE
+2A8A		GREATER-THAN AND NOT APPROXIMATE
+2A8B		LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C		GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A8D		LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E		GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F		LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90		GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91		LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92		GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93		LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94		GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95		SLANTED EQUAL TO OR LESS-THAN
+2A96		SLANTED EQUAL TO OR GREATER-THAN
+2A97		SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98		SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99		DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A		DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B		DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C		DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D		SIMILAR OR LESS-THAN
+2A9E		SIMILAR OR GREATER-THAN
+2A9F		SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0		SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1		DOUBLE NESTED LESS-THAN
+2AA2		DOUBLE NESTED GREATER-THAN
+2AA3		DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4		GREATER-THAN OVERLAPPING LESS-THAN
+2AA5		GREATER-THAN BESIDE LESS-THAN
+2AA6		LESS-THAN CLOSED BY CURVE
+2AA7		GREATER-THAN CLOSED BY CURVE
+2AA8		LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9		GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA		SMALLER THAN
+2AAB		LARGER THAN
+2AAC		SMALLER THAN OR EQUAL TO
+2AAD		LARGER THAN OR EQUAL TO
+2AAE		EQUALS SIGN WITH BUMPY ABOVE
+2AAF		PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0		SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB1		PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2		SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3		PRECEDES ABOVE EQUALS SIGN
+2AB4		SUCCEEDS ABOVE EQUALS SIGN
+2AB5		PRECEDES ABOVE NOT EQUAL TO
+2AB6		SUCCEEDS ABOVE NOT EQUAL TO
+2AB7		PRECEDES ABOVE ALMOST EQUAL TO
+2AB8		SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9		PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA		SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB		DOUBLE PRECEDES
+2ABC		DOUBLE SUCCEEDS
+2ABD		SUBSET WITH DOT
+2ABE		SUPERSET WITH DOT
+2ABF		SUBSET WITH PLUS SIGN BELOW
+2AC0		SUPERSET WITH PLUS SIGN BELOW
+2AC1		SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2		SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3		SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4		SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5		SUBSET OF ABOVE EQUALS SIGN
+2AC6		SUPERSET OF ABOVE EQUALS SIGN
+2AC7		SUBSET OF ABOVE TILDE OPERATOR
+2AC8		SUPERSET OF ABOVE TILDE OPERATOR
+2AC9		SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA		SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB		SUBSET OF ABOVE NOT EQUAL TO
+2ACC		SUPERSET OF ABOVE NOT EQUAL TO
+2ACD		SQUARE LEFT OPEN BOX OPERATOR
+2ACE		SQUARE RIGHT OPEN BOX OPERATOR
+2ACF		CLOSED SUBSET
+2AD0		CLOSED SUPERSET
+2AD1		CLOSED SUBSET OR EQUAL TO
+2AD2		CLOSED SUPERSET OR EQUAL TO
+2AD3		SUBSET ABOVE SUPERSET
+2AD4		SUPERSET ABOVE SUBSET
+2AD5		SUBSET ABOVE SUBSET
+2AD6		SUPERSET ABOVE SUPERSET
+2AD7		SUPERSET BESIDE SUBSET
+2AD8		SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+2AD9		ELEMENT OF OPENING DOWNWARDS
+2ADA		PITCHFORK WITH TEE TOP
+2ADB		TRANSVERSAL INTERSECTION
+2ADC		FORKING
+2ADD		NONFORKING
+2ADE		SHORT LEFT TACK
+2ADF		SHORT DOWN TACK
+2AE0		SHORT UP TACK
+2AE1		PERPENDICULAR WITH S
+2AE2		VERTICAL BAR TRIPLE RIGHT TURNSTILE
+2AE3		DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4		VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5		DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6		LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+2AE7		SHORT DOWN TACK WITH OVERBAR
+2AE8		SHORT UP TACK WITH UNDERBAR
+2AE9		SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA		DOUBLE DOWN TACK
+2AEB		DOUBLE UP TACK
+2AEC		DOUBLE STROKE NOT SIGN
+2AED		REVERSED DOUBLE STROKE NOT SIGN
+2AEE		DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+2AEF		VERTICAL LINE WITH CIRCLE ABOVE
+2AF0		VERTICAL LINE WITH CIRCLE BELOW
+2AF1		DOWN TACK WITH CIRCLE BELOW
+2AF2		PARALLEL WITH HORIZONTAL STROKE
+2AF3		PARALLEL WITH TILDE OPERATOR
+2AF4		TRIPLE VERTICAL BAR BINARY RELATION
+2AF5		TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+2AF6		TRIPLE COLON OPERATOR
+2AF7		TRIPLE NESTED LESS-THAN
+2AF8		TRIPLE NESTED GREATER-THAN
+2AF9		DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA		DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2AFB		TRIPLE SOLIDUS BINARY RELATION
+2AFC		LARGE TRIPLE VERTICAL BAR OPERATOR
+2AFD		DOUBLE SOLIDUS OPERATOR
+2AFE		WHITE VERTICAL BAR
+2AFF		N-ARY WHITE VERTICAL BAR
+2B00		NORTH EAST WHITE ARROW
+2B01		NORTH WEST WHITE ARROW
+2B02		SOUTH EAST WHITE ARROW
+2B03		SOUTH WEST WHITE ARROW
+2B04		LEFT RIGHT WHITE ARROW
+2B05		LEFTWARDS BLACK ARROW
+2B06		UPWARDS BLACK ARROW
+2B07		DOWNWARDS BLACK ARROW
+2B08		NORTH EAST BLACK ARROW
+2B09		NORTH WEST BLACK ARROW
+2B0A		SOUTH EAST BLACK ARROW
+2B0B		SOUTH WEST BLACK ARROW
+2B0C		LEFT RIGHT BLACK ARROW
+2B0D		UP DOWN BLACK ARROW
+2B0E		RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F		RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10		LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11		LEFTWARDS ARROW WITH TIP UPWARDS
+2B12		SQUARE WITH TOP HALF BLACK
+2B13		SQUARE WITH BOTTOM HALF BLACK
+2C00		GLAGOLITIC CAPITAL LETTER AZU
+2C01		GLAGOLITIC CAPITAL LETTER BUKY
+2C02		GLAGOLITIC CAPITAL LETTER VEDE
+2C03		GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C04		GLAGOLITIC CAPITAL LETTER DOBRO
+2C05		GLAGOLITIC CAPITAL LETTER YESTU
+2C06		GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C07		GLAGOLITIC CAPITAL LETTER DZELO
+2C08		GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C09		GLAGOLITIC CAPITAL LETTER IZHE
+2C0A		GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C0B		GLAGOLITIC CAPITAL LETTER I
+2C0C		GLAGOLITIC CAPITAL LETTER DJERVI
+2C0D		GLAGOLITIC CAPITAL LETTER KAKO
+2C0E		GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C0F		GLAGOLITIC CAPITAL LETTER MYSLITE
+2C10		GLAGOLITIC CAPITAL LETTER NASHI
+2C11		GLAGOLITIC CAPITAL LETTER ONU
+2C12		GLAGOLITIC CAPITAL LETTER POKOJI
+2C13		GLAGOLITIC CAPITAL LETTER RITSI
+2C14		GLAGOLITIC CAPITAL LETTER SLOVO
+2C15		GLAGOLITIC CAPITAL LETTER TVRIDO
+2C16		GLAGOLITIC CAPITAL LETTER UKU
+2C17		GLAGOLITIC CAPITAL LETTER FRITU
+2C18		GLAGOLITIC CAPITAL LETTER HERU
+2C19		GLAGOLITIC CAPITAL LETTER OTU
+2C1A		GLAGOLITIC CAPITAL LETTER PE
+2C1B		GLAGOLITIC CAPITAL LETTER SHTA
+2C1C		GLAGOLITIC CAPITAL LETTER TSI
+2C1D		GLAGOLITIC CAPITAL LETTER CHRIVI
+2C1E		GLAGOLITIC CAPITAL LETTER SHA
+2C1F		GLAGOLITIC CAPITAL LETTER YERU
+2C20		GLAGOLITIC CAPITAL LETTER YERI
+2C21		GLAGOLITIC CAPITAL LETTER YATI
+2C22		GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C23		GLAGOLITIC CAPITAL LETTER YU
+2C24		GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C25		GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C26		GLAGOLITIC CAPITAL LETTER YO
+2C27		GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C28		GLAGOLITIC CAPITAL LETTER BIG YUS
+2C29		GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C2A		GLAGOLITIC CAPITAL LETTER FITA
+2C2B		GLAGOLITIC CAPITAL LETTER IZHITSA
+2C2C		GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C2D		GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C2E		GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30		GLAGOLITIC SMALL LETTER AZU
+2C31		GLAGOLITIC SMALL LETTER BUKY
+2C32		GLAGOLITIC SMALL LETTER VEDE
+2C33		GLAGOLITIC SMALL LETTER GLAGOLI
+2C34		GLAGOLITIC SMALL LETTER DOBRO
+2C35		GLAGOLITIC SMALL LETTER YESTU
+2C36		GLAGOLITIC SMALL LETTER ZHIVETE
+2C37		GLAGOLITIC SMALL LETTER DZELO
+2C38		GLAGOLITIC SMALL LETTER ZEMLJA
+2C39		GLAGOLITIC SMALL LETTER IZHE
+2C3A		GLAGOLITIC SMALL LETTER INITIAL IZHE
+2C3B		GLAGOLITIC SMALL LETTER I
+2C3C		GLAGOLITIC SMALL LETTER DJERVI
+2C3D		GLAGOLITIC SMALL LETTER KAKO
+2C3E		GLAGOLITIC SMALL LETTER LJUDIJE
+2C3F		GLAGOLITIC SMALL LETTER MYSLITE
+2C40		GLAGOLITIC SMALL LETTER NASHI
+2C41		GLAGOLITIC SMALL LETTER ONU
+2C42		GLAGOLITIC SMALL LETTER POKOJI
+2C43		GLAGOLITIC SMALL LETTER RITSI
+2C44		GLAGOLITIC SMALL LETTER SLOVO
+2C45		GLAGOLITIC SMALL LETTER TVRIDO
+2C46		GLAGOLITIC SMALL LETTER UKU
+2C47		GLAGOLITIC SMALL LETTER FRITU
+2C48		GLAGOLITIC SMALL LETTER HERU
+2C49		GLAGOLITIC SMALL LETTER OTU
+2C4A		GLAGOLITIC SMALL LETTER PE
+2C4B		GLAGOLITIC SMALL LETTER SHTA
+2C4C		GLAGOLITIC SMALL LETTER TSI
+2C4D		GLAGOLITIC SMALL LETTER CHRIVI
+2C4E		GLAGOLITIC SMALL LETTER SHA
+2C4F		GLAGOLITIC SMALL LETTER YERU
+2C50		GLAGOLITIC SMALL LETTER YERI
+2C51		GLAGOLITIC SMALL LETTER YATI
+2C52		GLAGOLITIC SMALL LETTER SPIDERY HA
+2C53		GLAGOLITIC SMALL LETTER YU
+2C54		GLAGOLITIC SMALL LETTER SMALL YUS
+2C55		GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C56		GLAGOLITIC SMALL LETTER YO
+2C57		GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C58		GLAGOLITIC SMALL LETTER BIG YUS
+2C59		GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C5A		GLAGOLITIC SMALL LETTER FITA
+2C5B		GLAGOLITIC SMALL LETTER IZHITSA
+2C5C		GLAGOLITIC SMALL LETTER SHTAPIC
+2C5D		GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C5E		GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C80		COPTIC CAPITAL LETTER ALFA
+2C81		COPTIC SMALL LETTER ALFA
+2C82		COPTIC CAPITAL LETTER VIDA
+2C83		COPTIC SMALL LETTER VIDA
+2C84		COPTIC CAPITAL LETTER GAMMA
+2C85		COPTIC SMALL LETTER GAMMA
+2C86		COPTIC CAPITAL LETTER DALDA
+2C87		COPTIC SMALL LETTER DALDA
+2C88		COPTIC CAPITAL LETTER EIE
+2C89		COPTIC SMALL LETTER EIE
+2C8A		COPTIC CAPITAL LETTER SOU
+2C8B		COPTIC SMALL LETTER SOU
+2C8C		COPTIC CAPITAL LETTER ZATA
+2C8D		COPTIC SMALL LETTER ZATA
+2C8E		COPTIC CAPITAL LETTER HATE
+2C8F		COPTIC SMALL LETTER HATE
+2C90		COPTIC CAPITAL LETTER THETHE
+2C91		COPTIC SMALL LETTER THETHE
+2C92		COPTIC CAPITAL LETTER IAUDA
+2C93		COPTIC SMALL LETTER IAUDA
+2C94		COPTIC CAPITAL LETTER KAPA
+2C95		COPTIC SMALL LETTER KAPA
+2C96		COPTIC CAPITAL LETTER LAULA
+2C97		COPTIC SMALL LETTER LAULA
+2C98		COPTIC CAPITAL LETTER MI
+2C99		COPTIC SMALL LETTER MI
+2C9A		COPTIC CAPITAL LETTER NI
+2C9B		COPTIC SMALL LETTER NI
+2C9C		COPTIC CAPITAL LETTER KSI
+2C9D		COPTIC SMALL LETTER KSI
+2C9E		COPTIC CAPITAL LETTER O
+2C9F		COPTIC SMALL LETTER O
+2CA0		COPTIC CAPITAL LETTER PI
+2CA1		COPTIC SMALL LETTER PI
+2CA2		COPTIC CAPITAL LETTER RO
+2CA3		COPTIC SMALL LETTER RO
+2CA4		COPTIC CAPITAL LETTER SIMA
+2CA5		COPTIC SMALL LETTER SIMA
+2CA6		COPTIC CAPITAL LETTER TAU
+2CA7		COPTIC SMALL LETTER TAU
+2CA8		COPTIC CAPITAL LETTER UA
+2CA9		COPTIC SMALL LETTER UA
+2CAA		COPTIC CAPITAL LETTER FI
+2CAB		COPTIC SMALL LETTER FI
+2CAC		COPTIC CAPITAL LETTER KHI
+2CAD		COPTIC SMALL LETTER KHI
+2CAE		COPTIC CAPITAL LETTER PSI
+2CAF		COPTIC SMALL LETTER PSI
+2CB0		COPTIC CAPITAL LETTER OOU
+2CB1		COPTIC SMALL LETTER OOU
+2CB2		COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB3		COPTIC SMALL LETTER DIALECT-P ALEF
+2CB4		COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB5		COPTIC SMALL LETTER OLD COPTIC AIN
+2CB6		COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB7		COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB8		COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CB9		COPTIC SMALL LETTER DIALECT-P KAPA
+2CBA		COPTIC CAPITAL LETTER DIALECT-P NI
+2CBB		COPTIC SMALL LETTER DIALECT-P NI
+2CBC		COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBD		COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBE		COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CBF		COPTIC SMALL LETTER OLD COPTIC OOU
+2CC0		COPTIC CAPITAL LETTER SAMPI
+2CC1		COPTIC SMALL LETTER SAMPI
+2CC2		COPTIC CAPITAL LETTER CROSSED SHEI
+2CC3		COPTIC SMALL LETTER CROSSED SHEI
+2CC4		COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC5		COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC6		COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC7		COPTIC SMALL LETTER OLD COPTIC ESH
+2CC8		COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CC9		COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCA		COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCB		COPTIC SMALL LETTER DIALECT-P HORI
+2CCC		COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCD		COPTIC SMALL LETTER OLD COPTIC HORI
+2CCE		COPTIC CAPITAL LETTER OLD COPTIC HA
+2CCF		COPTIC SMALL LETTER OLD COPTIC HA
+2CD0		COPTIC CAPITAL LETTER L-SHAPED HA
+2CD1		COPTIC SMALL LETTER L-SHAPED HA
+2CD2		COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD3		COPTIC SMALL LETTER OLD COPTIC HEI
+2CD4		COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD5		COPTIC SMALL LETTER OLD COPTIC HAT
+2CD6		COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD7		COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD8		COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CD9		COPTIC SMALL LETTER OLD COPTIC DJA
+2CDA		COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDB		COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDC		COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDD		COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDE		COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CDF		COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE0		COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE1		COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE2		COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CE3		COPTIC SMALL LETTER OLD NUBIAN WAU
+2CE4		COPTIC SYMBOL KAI
+2CE5		COPTIC SYMBOL MI RO
+2CE6		COPTIC SYMBOL PI RO
+2CE7		COPTIC SYMBOL STAUROS
+2CE8		COPTIC SYMBOL TAU RO
+2CE9		COPTIC SYMBOL KHI RO
+2CEA		COPTIC SYMBOL SHIMA SIMA
+2CF9		COPTIC OLD NUBIAN FULL STOP
+2CFA		COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB		COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC		COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD		COPTIC FRACTION ONE HALF
+2CFE		COPTIC FULL STOP
+2CFF		COPTIC MORPHOLOGICAL DIVIDER
+2D00		GEORGIAN SMALL LETTER AN
+2D01		GEORGIAN SMALL LETTER BAN
+2D02		GEORGIAN SMALL LETTER GAN
+2D03		GEORGIAN SMALL LETTER DON
+2D04		GEORGIAN SMALL LETTER EN
+2D05		GEORGIAN SMALL LETTER VIN
+2D06		GEORGIAN SMALL LETTER ZEN
+2D07		GEORGIAN SMALL LETTER TAN
+2D08		GEORGIAN SMALL LETTER IN
+2D09		GEORGIAN SMALL LETTER KAN
+2D0A		GEORGIAN SMALL LETTER LAS
+2D0B		GEORGIAN SMALL LETTER MAN
+2D0C		GEORGIAN SMALL LETTER NAR
+2D0D		GEORGIAN SMALL LETTER ON
+2D0E		GEORGIAN SMALL LETTER PAR
+2D0F		GEORGIAN SMALL LETTER ZHAR
+2D10		GEORGIAN SMALL LETTER RAE
+2D11		GEORGIAN SMALL LETTER SAN
+2D12		GEORGIAN SMALL LETTER TAR
+2D13		GEORGIAN SMALL LETTER UN
+2D14		GEORGIAN SMALL LETTER PHAR
+2D15		GEORGIAN SMALL LETTER KHAR
+2D16		GEORGIAN SMALL LETTER GHAN
+2D17		GEORGIAN SMALL LETTER QAR
+2D18		GEORGIAN SMALL LETTER SHIN
+2D19		GEORGIAN SMALL LETTER CHIN
+2D1A		GEORGIAN SMALL LETTER CAN
+2D1B		GEORGIAN SMALL LETTER JIL
+2D1C		GEORGIAN SMALL LETTER CIL
+2D1D		GEORGIAN SMALL LETTER CHAR
+2D1E		GEORGIAN SMALL LETTER XAN
+2D1F		GEORGIAN SMALL LETTER JHAN
+2D20		GEORGIAN SMALL LETTER HAE
+2D21		GEORGIAN SMALL LETTER HE
+2D22		GEORGIAN SMALL LETTER HIE
+2D23		GEORGIAN SMALL LETTER WE
+2D24		GEORGIAN SMALL LETTER HAR
+2D25		GEORGIAN SMALL LETTER HOE
+2D30		TIFINAGH LETTER YA
+2D31		TIFINAGH LETTER YAB
+2D32		TIFINAGH LETTER YABH
+2D33		TIFINAGH LETTER YAG
+2D34		TIFINAGH LETTER YAGHH
+2D35		TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36		TIFINAGH LETTER YAJ
+2D37		TIFINAGH LETTER YAD
+2D38		TIFINAGH LETTER YADH
+2D39		TIFINAGH LETTER YADD
+2D3A		TIFINAGH LETTER YADDH
+2D3B		TIFINAGH LETTER YEY
+2D3C		TIFINAGH LETTER YAF
+2D3D		TIFINAGH LETTER YAK
+2D3E		TIFINAGH LETTER TUAREG YAK
+2D3F		TIFINAGH LETTER YAKHH
+2D40		TIFINAGH LETTER YAH
+2D41		TIFINAGH LETTER BERBER ACADEMY YAH
+2D42		TIFINAGH LETTER TUAREG YAH
+2D43		TIFINAGH LETTER YAHH
+2D44		TIFINAGH LETTER YAA
+2D45		TIFINAGH LETTER YAKH
+2D46		TIFINAGH LETTER TUAREG YAKH
+2D47		TIFINAGH LETTER YAQ
+2D48		TIFINAGH LETTER TUAREG YAQ
+2D49		TIFINAGH LETTER YI
+2D4A		TIFINAGH LETTER YAZH
+2D4B		TIFINAGH LETTER AHAGGAR YAZH
+2D4C		TIFINAGH LETTER TUAREG YAZH
+2D4D		TIFINAGH LETTER YAL
+2D4E		TIFINAGH LETTER YAM
+2D4F		TIFINAGH LETTER YAN
+2D50		TIFINAGH LETTER TUAREG YAGN
+2D51		TIFINAGH LETTER TUAREG YANG
+2D52		TIFINAGH LETTER YAP
+2D53		TIFINAGH LETTER YU
+2D54		TIFINAGH LETTER YAR
+2D55		TIFINAGH LETTER YARR
+2D56		TIFINAGH LETTER YAGH
+2D57		TIFINAGH LETTER TUAREG YAGH
+2D58		TIFINAGH LETTER AYER YAGH
+2D59		TIFINAGH LETTER YAS
+2D5A		TIFINAGH LETTER YASS
+2D5B		TIFINAGH LETTER YASH
+2D5C		TIFINAGH LETTER YAT
+2D5D		TIFINAGH LETTER YATH
+2D5E		TIFINAGH LETTER YACH
+2D5F		TIFINAGH LETTER YATT
+2D60		TIFINAGH LETTER YAV
+2D61		TIFINAGH LETTER YAW
+2D62		TIFINAGH LETTER YAY
+2D63		TIFINAGH LETTER YAZ
+2D64		TIFINAGH LETTER TAWELLEMET YAZ
+2D65		TIFINAGH LETTER YAZZ
+2D6F		TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+2D80		ETHIOPIC SYLLABLE LOA
+2D81		ETHIOPIC SYLLABLE MOA
+2D82		ETHIOPIC SYLLABLE ROA
+2D83		ETHIOPIC SYLLABLE SOA
+2D84		ETHIOPIC SYLLABLE SHOA
+2D85		ETHIOPIC SYLLABLE BOA
+2D86		ETHIOPIC SYLLABLE TOA
+2D87		ETHIOPIC SYLLABLE COA
+2D88		ETHIOPIC SYLLABLE NOA
+2D89		ETHIOPIC SYLLABLE NYOA
+2D8A		ETHIOPIC SYLLABLE GLOTTAL OA
+2D8B		ETHIOPIC SYLLABLE ZOA
+2D8C		ETHIOPIC SYLLABLE DOA
+2D8D		ETHIOPIC SYLLABLE DDOA
+2D8E		ETHIOPIC SYLLABLE JOA
+2D8F		ETHIOPIC SYLLABLE THOA
+2D90		ETHIOPIC SYLLABLE CHOA
+2D91		ETHIOPIC SYLLABLE PHOA
+2D92		ETHIOPIC SYLLABLE POA
+2D93		ETHIOPIC SYLLABLE GGWA
+2D94		ETHIOPIC SYLLABLE GGWI
+2D95		ETHIOPIC SYLLABLE GGWEE
+2D96		ETHIOPIC SYLLABLE GGWE
+2DA0		ETHIOPIC SYLLABLE SSA
+2DA1		ETHIOPIC SYLLABLE SSU
+2DA2		ETHIOPIC SYLLABLE SSI
+2DA3		ETHIOPIC SYLLABLE SSAA
+2DA4		ETHIOPIC SYLLABLE SSEE
+2DA5		ETHIOPIC SYLLABLE SSE
+2DA6		ETHIOPIC SYLLABLE SSO
+2DA8		ETHIOPIC SYLLABLE CCA
+2DA9		ETHIOPIC SYLLABLE CCU
+2DAA		ETHIOPIC SYLLABLE CCI
+2DAB		ETHIOPIC SYLLABLE CCAA
+2DAC		ETHIOPIC SYLLABLE CCEE
+2DAD		ETHIOPIC SYLLABLE CCE
+2DAE		ETHIOPIC SYLLABLE CCO
+2DB0		ETHIOPIC SYLLABLE ZZA
+2DB1		ETHIOPIC SYLLABLE ZZU
+2DB2		ETHIOPIC SYLLABLE ZZI
+2DB3		ETHIOPIC SYLLABLE ZZAA
+2DB4		ETHIOPIC SYLLABLE ZZEE
+2DB5		ETHIOPIC SYLLABLE ZZE
+2DB6		ETHIOPIC SYLLABLE ZZO
+2DB8		ETHIOPIC SYLLABLE CCHA
+2DB9		ETHIOPIC SYLLABLE CCHU
+2DBA		ETHIOPIC SYLLABLE CCHI
+2DBB		ETHIOPIC SYLLABLE CCHAA
+2DBC		ETHIOPIC SYLLABLE CCHEE
+2DBD		ETHIOPIC SYLLABLE CCHE
+2DBE		ETHIOPIC SYLLABLE CCHO
+2DC0		ETHIOPIC SYLLABLE QYA
+2DC1		ETHIOPIC SYLLABLE QYU
+2DC2		ETHIOPIC SYLLABLE QYI
+2DC3		ETHIOPIC SYLLABLE QYAA
+2DC4		ETHIOPIC SYLLABLE QYEE
+2DC5		ETHIOPIC SYLLABLE QYE
+2DC6		ETHIOPIC SYLLABLE QYO
+2DC8		ETHIOPIC SYLLABLE KYA
+2DC9		ETHIOPIC SYLLABLE KYU
+2DCA		ETHIOPIC SYLLABLE KYI
+2DCB		ETHIOPIC SYLLABLE KYAA
+2DCC		ETHIOPIC SYLLABLE KYEE
+2DCD		ETHIOPIC SYLLABLE KYE
+2DCE		ETHIOPIC SYLLABLE KYO
+2DD0		ETHIOPIC SYLLABLE XYA
+2DD1		ETHIOPIC SYLLABLE XYU
+2DD2		ETHIOPIC SYLLABLE XYI
+2DD3		ETHIOPIC SYLLABLE XYAA
+2DD4		ETHIOPIC SYLLABLE XYEE
+2DD5		ETHIOPIC SYLLABLE XYE
+2DD6		ETHIOPIC SYLLABLE XYO
+2DD8		ETHIOPIC SYLLABLE GYA
+2DD9		ETHIOPIC SYLLABLE GYU
+2DDA		ETHIOPIC SYLLABLE GYI
+2DDB		ETHIOPIC SYLLABLE GYAA
+2DDC		ETHIOPIC SYLLABLE GYEE
+2DDD		ETHIOPIC SYLLABLE GYE
+2DDE		ETHIOPIC SYLLABLE GYO
+2E00		RIGHT ANGLE SUBSTITUTION MARKER
+2E01		RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02		LEFT SUBSTITUTION BRACKET
+2E03		RIGHT SUBSTITUTION BRACKET
+2E04		LEFT DOTTED SUBSTITUTION BRACKET
+2E05		RIGHT DOTTED SUBSTITUTION BRACKET
+2E06		RAISED INTERPOLATION MARKER
+2E07		RAISED DOTTED INTERPOLATION MARKER
+2E08		DOTTED TRANSPOSITION MARKER
+2E09		LEFT TRANSPOSITION BRACKET
+2E0A		RIGHT TRANSPOSITION BRACKET
+2E0B		RAISED SQUARE
+2E0C		LEFT RAISED OMISSION BRACKET
+2E0D		RIGHT RAISED OMISSION BRACKET
+2E0E		EDITORIAL CORONIS
+2E0F		PARAGRAPHOS
+2E10		FORKED PARAGRAPHOS
+2E11		REVERSED FORKED PARAGRAPHOS
+2E12		HYPODIASTOLE
+2E13		DOTTED OBELOS
+2E14		DOWNWARDS ANCORA
+2E15		UPWARDS ANCORA
+2E16		DOTTED RIGHT-POINTING ANGLE
+2E17		DOUBLE OBLIQUE HYPHEN
+2E1C		LEFT LOW PARAPHRASE BRACKET
+2E1D		RIGHT LOW PARAPHRASE BRACKET
+2E80		CJK RADICAL REPEAT
+2E81		CJK RADICAL CLIFF
+2E82		CJK RADICAL SECOND ONE
+2E83		CJK RADICAL SECOND TWO
+2E84		CJK RADICAL SECOND THREE
+2E85		CJK RADICAL PERSON
+2E86		CJK RADICAL BOX
+2E87		CJK RADICAL TABLE
+2E88		CJK RADICAL KNIFE ONE
+2E89		CJK RADICAL KNIFE TWO
+2E8A		CJK RADICAL DIVINATION
+2E8B		CJK RADICAL SEAL
+2E8C		CJK RADICAL SMALL ONE
+2E8D		CJK RADICAL SMALL TWO
+2E8E		CJK RADICAL LAME ONE
+2E8F		CJK RADICAL LAME TWO
+2E90		CJK RADICAL LAME THREE
+2E91		CJK RADICAL LAME FOUR
+2E92		CJK RADICAL SNAKE
+2E93		CJK RADICAL THREAD
+2E94		CJK RADICAL SNOUT ONE
+2E95		CJK RADICAL SNOUT TWO
+2E96		CJK RADICAL HEART ONE
+2E97		CJK RADICAL HEART TWO
+2E98		CJK RADICAL HAND
+2E99		CJK RADICAL RAP
+2E9B		CJK RADICAL CHOKE
+2E9C		CJK RADICAL SUN
+2E9D		CJK RADICAL MOON
+2E9E		CJK RADICAL DEATH
+2E9F		CJK RADICAL MOTHER
+2EA0		CJK RADICAL CIVILIAN
+2EA1		CJK RADICAL WATER ONE
+2EA2		CJK RADICAL WATER TWO
+2EA3		CJK RADICAL FIRE
+2EA4		CJK RADICAL PAW ONE
+2EA5		CJK RADICAL PAW TWO
+2EA6		CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+2EA7		CJK RADICAL COW
+2EA8		CJK RADICAL DOG
+2EA9		CJK RADICAL JADE
+2EAA		CJK RADICAL BOLT OF CLOTH
+2EAB		CJK RADICAL EYE
+2EAC		CJK RADICAL SPIRIT ONE
+2EAD		CJK RADICAL SPIRIT TWO
+2EAE		CJK RADICAL BAMBOO
+2EAF		CJK RADICAL SILK
+2EB0		CJK RADICAL C-SIMPLIFIED SILK
+2EB1		CJK RADICAL NET ONE
+2EB2		CJK RADICAL NET TWO
+2EB3		CJK RADICAL NET THREE
+2EB4		CJK RADICAL NET FOUR
+2EB5		CJK RADICAL MESH
+2EB6		CJK RADICAL SHEEP
+2EB7		CJK RADICAL RAM
+2EB8		CJK RADICAL EWE
+2EB9		CJK RADICAL OLD
+2EBA		CJK RADICAL BRUSH ONE
+2EBB		CJK RADICAL BRUSH TWO
+2EBC		CJK RADICAL MEAT
+2EBD		CJK RADICAL MORTAR
+2EBE		CJK RADICAL GRASS ONE
+2EBF		CJK RADICAL GRASS TWO
+2EC0		CJK RADICAL GRASS THREE
+2EC1		CJK RADICAL TIGER
+2EC2		CJK RADICAL CLOTHES
+2EC3		CJK RADICAL WEST ONE
+2EC4		CJK RADICAL WEST TWO
+2EC5		CJK RADICAL C-SIMPLIFIED SEE
+2EC6		CJK RADICAL SIMPLIFIED HORN
+2EC7		CJK RADICAL HORN
+2EC8		CJK RADICAL C-SIMPLIFIED SPEECH
+2EC9		CJK RADICAL C-SIMPLIFIED SHELL
+2ECA		CJK RADICAL FOOT
+2ECB		CJK RADICAL C-SIMPLIFIED CART
+2ECC		CJK RADICAL SIMPLIFIED WALK
+2ECD		CJK RADICAL WALK ONE
+2ECE		CJK RADICAL WALK TWO
+2ECF		CJK RADICAL CITY
+2ED0		CJK RADICAL C-SIMPLIFIED GOLD
+2ED1		CJK RADICAL LONG ONE
+2ED2		CJK RADICAL LONG TWO
+2ED3		CJK RADICAL C-SIMPLIFIED LONG
+2ED4		CJK RADICAL C-SIMPLIFIED GATE
+2ED5		CJK RADICAL MOUND ONE
+2ED6		CJK RADICAL MOUND TWO
+2ED7		CJK RADICAL RAIN
+2ED8		CJK RADICAL BLUE
+2ED9		CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+2EDA		CJK RADICAL C-SIMPLIFIED LEAF
+2EDB		CJK RADICAL C-SIMPLIFIED WIND
+2EDC		CJK RADICAL C-SIMPLIFIED FLY
+2EDD		CJK RADICAL EAT ONE
+2EDE		CJK RADICAL EAT TWO
+2EDF		CJK RADICAL EAT THREE
+2EE0		CJK RADICAL C-SIMPLIFIED EAT
+2EE1		CJK RADICAL HEAD
+2EE2		CJK RADICAL C-SIMPLIFIED HORSE
+2EE3		CJK RADICAL BONE
+2EE4		CJK RADICAL GHOST
+2EE5		CJK RADICAL C-SIMPLIFIED FISH
+2EE6		CJK RADICAL C-SIMPLIFIED BIRD
+2EE7		CJK RADICAL C-SIMPLIFIED SALT
+2EE8		CJK RADICAL SIMPLIFIED WHEAT
+2EE9		CJK RADICAL SIMPLIFIED YELLOW
+2EEA		CJK RADICAL C-SIMPLIFIED FROG
+2EEB		CJK RADICAL J-SIMPLIFIED EVEN
+2EEC		CJK RADICAL C-SIMPLIFIED EVEN
+2EED		CJK RADICAL J-SIMPLIFIED TOOTH
+2EEE		CJK RADICAL C-SIMPLIFIED TOOTH
+2EEF		CJK RADICAL J-SIMPLIFIED DRAGON
+2EF0		CJK RADICAL C-SIMPLIFIED DRAGON
+2EF1		CJK RADICAL TURTLE
+2EF2		CJK RADICAL J-SIMPLIFIED TURTLE
+2EF3		CJK RADICAL C-SIMPLIFIED TURTLE
+2F00		KANGXI RADICAL ONE
+2F01		KANGXI RADICAL LINE
+2F02		KANGXI RADICAL DOT
+2F03		KANGXI RADICAL SLASH
+2F04		KANGXI RADICAL SECOND
+2F05		KANGXI RADICAL HOOK
+2F06		KANGXI RADICAL TWO
+2F07		KANGXI RADICAL LID
+2F08		KANGXI RADICAL MAN
+2F09		KANGXI RADICAL LEGS
+2F0A		KANGXI RADICAL ENTER
+2F0B		KANGXI RADICAL EIGHT
+2F0C		KANGXI RADICAL DOWN BOX
+2F0D		KANGXI RADICAL COVER
+2F0E		KANGXI RADICAL ICE
+2F0F		KANGXI RADICAL TABLE
+2F10		KANGXI RADICAL OPEN BOX
+2F11		KANGXI RADICAL KNIFE
+2F12		KANGXI RADICAL POWER
+2F13		KANGXI RADICAL WRAP
+2F14		KANGXI RADICAL SPOON
+2F15		KANGXI RADICAL RIGHT OPEN BOX
+2F16		KANGXI RADICAL HIDING ENCLOSURE
+2F17		KANGXI RADICAL TEN
+2F18		KANGXI RADICAL DIVINATION
+2F19		KANGXI RADICAL SEAL
+2F1A		KANGXI RADICAL CLIFF
+2F1B		KANGXI RADICAL PRIVATE
+2F1C		KANGXI RADICAL AGAIN
+2F1D		KANGXI RADICAL MOUTH
+2F1E		KANGXI RADICAL ENCLOSURE
+2F1F		KANGXI RADICAL EARTH
+2F20		KANGXI RADICAL SCHOLAR
+2F21		KANGXI RADICAL GO
+2F22		KANGXI RADICAL GO SLOWLY
+2F23		KANGXI RADICAL EVENING
+2F24		KANGXI RADICAL BIG
+2F25		KANGXI RADICAL WOMAN
+2F26		KANGXI RADICAL CHILD
+2F27		KANGXI RADICAL ROOF
+2F28		KANGXI RADICAL INCH
+2F29		KANGXI RADICAL SMALL
+2F2A		KANGXI RADICAL LAME
+2F2B		KANGXI RADICAL CORPSE
+2F2C		KANGXI RADICAL SPROUT
+2F2D		KANGXI RADICAL MOUNTAIN
+2F2E		KANGXI RADICAL RIVER
+2F2F		KANGXI RADICAL WORK
+2F30		KANGXI RADICAL ONESELF
+2F31		KANGXI RADICAL TURBAN
+2F32		KANGXI RADICAL DRY
+2F33		KANGXI RADICAL SHORT THREAD
+2F34		KANGXI RADICAL DOTTED CLIFF
+2F35		KANGXI RADICAL LONG STRIDE
+2F36		KANGXI RADICAL TWO HANDS
+2F37		KANGXI RADICAL SHOOT
+2F38		KANGXI RADICAL BOW
+2F39		KANGXI RADICAL SNOUT
+2F3A		KANGXI RADICAL BRISTLE
+2F3B		KANGXI RADICAL STEP
+2F3C		KANGXI RADICAL HEART
+2F3D		KANGXI RADICAL HALBERD
+2F3E		KANGXI RADICAL DOOR
+2F3F		KANGXI RADICAL HAND
+2F40		KANGXI RADICAL BRANCH
+2F41		KANGXI RADICAL RAP
+2F42		KANGXI RADICAL SCRIPT
+2F43		KANGXI RADICAL DIPPER
+2F44		KANGXI RADICAL AXE
+2F45		KANGXI RADICAL SQUARE
+2F46		KANGXI RADICAL NOT
+2F47		KANGXI RADICAL SUN
+2F48		KANGXI RADICAL SAY
+2F49		KANGXI RADICAL MOON
+2F4A		KANGXI RADICAL TREE
+2F4B		KANGXI RADICAL LACK
+2F4C		KANGXI RADICAL STOP
+2F4D		KANGXI RADICAL DEATH
+2F4E		KANGXI RADICAL WEAPON
+2F4F		KANGXI RADICAL DO NOT
+2F50		KANGXI RADICAL COMPARE
+2F51		KANGXI RADICAL FUR
+2F52		KANGXI RADICAL CLAN
+2F53		KANGXI RADICAL STEAM
+2F54		KANGXI RADICAL WATER
+2F55		KANGXI RADICAL FIRE
+2F56		KANGXI RADICAL CLAW
+2F57		KANGXI RADICAL FATHER
+2F58		KANGXI RADICAL DOUBLE X
+2F59		KANGXI RADICAL HALF TREE TRUNK
+2F5A		KANGXI RADICAL SLICE
+2F5B		KANGXI RADICAL FANG
+2F5C		KANGXI RADICAL COW
+2F5D		KANGXI RADICAL DOG
+2F5E		KANGXI RADICAL PROFOUND
+2F5F		KANGXI RADICAL JADE
+2F60		KANGXI RADICAL MELON
+2F61		KANGXI RADICAL TILE
+2F62		KANGXI RADICAL SWEET
+2F63		KANGXI RADICAL LIFE
+2F64		KANGXI RADICAL USE
+2F65		KANGXI RADICAL FIELD
+2F66		KANGXI RADICAL BOLT OF CLOTH
+2F67		KANGXI RADICAL SICKNESS
+2F68		KANGXI RADICAL DOTTED TENT
+2F69		KANGXI RADICAL WHITE
+2F6A		KANGXI RADICAL SKIN
+2F6B		KANGXI RADICAL DISH
+2F6C		KANGXI RADICAL EYE
+2F6D		KANGXI RADICAL SPEAR
+2F6E		KANGXI RADICAL ARROW
+2F6F		KANGXI RADICAL STONE
+2F70		KANGXI RADICAL SPIRIT
+2F71		KANGXI RADICAL TRACK
+2F72		KANGXI RADICAL GRAIN
+2F73		KANGXI RADICAL CAVE
+2F74		KANGXI RADICAL STAND
+2F75		KANGXI RADICAL BAMBOO
+2F76		KANGXI RADICAL RICE
+2F77		KANGXI RADICAL SILK
+2F78		KANGXI RADICAL JAR
+2F79		KANGXI RADICAL NET
+2F7A		KANGXI RADICAL SHEEP
+2F7B		KANGXI RADICAL FEATHER
+2F7C		KANGXI RADICAL OLD
+2F7D		KANGXI RADICAL AND
+2F7E		KANGXI RADICAL PLOW
+2F7F		KANGXI RADICAL EAR
+2F80		KANGXI RADICAL BRUSH
+2F81		KANGXI RADICAL MEAT
+2F82		KANGXI RADICAL MINISTER
+2F83		KANGXI RADICAL SELF
+2F84		KANGXI RADICAL ARRIVE
+2F85		KANGXI RADICAL MORTAR
+2F86		KANGXI RADICAL TONGUE
+2F87		KANGXI RADICAL OPPOSE
+2F88		KANGXI RADICAL BOAT
+2F89		KANGXI RADICAL STOPPING
+2F8A		KANGXI RADICAL COLOR
+2F8B		KANGXI RADICAL GRASS
+2F8C		KANGXI RADICAL TIGER
+2F8D		KANGXI RADICAL INSECT
+2F8E		KANGXI RADICAL BLOOD
+2F8F		KANGXI RADICAL WALK ENCLOSURE
+2F90		KANGXI RADICAL CLOTHES
+2F91		KANGXI RADICAL WEST
+2F92		KANGXI RADICAL SEE
+2F93		KANGXI RADICAL HORN
+2F94		KANGXI RADICAL SPEECH
+2F95		KANGXI RADICAL VALLEY
+2F96		KANGXI RADICAL BEAN
+2F97		KANGXI RADICAL PIG
+2F98		KANGXI RADICAL BADGER
+2F99		KANGXI RADICAL SHELL
+2F9A		KANGXI RADICAL RED
+2F9B		KANGXI RADICAL RUN
+2F9C		KANGXI RADICAL FOOT
+2F9D		KANGXI RADICAL BODY
+2F9E		KANGXI RADICAL CART
+2F9F		KANGXI RADICAL BITTER
+2FA0		KANGXI RADICAL MORNING
+2FA1		KANGXI RADICAL WALK
+2FA2		KANGXI RADICAL CITY
+2FA3		KANGXI RADICAL WINE
+2FA4		KANGXI RADICAL DISTINGUISH
+2FA5		KANGXI RADICAL VILLAGE
+2FA6		KANGXI RADICAL GOLD
+2FA7		KANGXI RADICAL LONG
+2FA8		KANGXI RADICAL GATE
+2FA9		KANGXI RADICAL MOUND
+2FAA		KANGXI RADICAL SLAVE
+2FAB		KANGXI RADICAL SHORT TAILED BIRD
+2FAC		KANGXI RADICAL RAIN
+2FAD		KANGXI RADICAL BLUE
+2FAE		KANGXI RADICAL WRONG
+2FAF		KANGXI RADICAL FACE
+2FB0		KANGXI RADICAL LEATHER
+2FB1		KANGXI RADICAL TANNED LEATHER
+2FB2		KANGXI RADICAL LEEK
+2FB3		KANGXI RADICAL SOUND
+2FB4		KANGXI RADICAL LEAF
+2FB5		KANGXI RADICAL WIND
+2FB6		KANGXI RADICAL FLY
+2FB7		KANGXI RADICAL EAT
+2FB8		KANGXI RADICAL HEAD
+2FB9		KANGXI RADICAL FRAGRANT
+2FBA		KANGXI RADICAL HORSE
+2FBB		KANGXI RADICAL BONE
+2FBC		KANGXI RADICAL TALL
+2FBD		KANGXI RADICAL HAIR
+2FBE		KANGXI RADICAL FIGHT
+2FBF		KANGXI RADICAL SACRIFICIAL WINE
+2FC0		KANGXI RADICAL CAULDRON
+2FC1		KANGXI RADICAL GHOST
+2FC2		KANGXI RADICAL FISH
+2FC3		KANGXI RADICAL BIRD
+2FC4		KANGXI RADICAL SALT
+2FC5		KANGXI RADICAL DEER
+2FC6		KANGXI RADICAL WHEAT
+2FC7		KANGXI RADICAL HEMP
+2FC8		KANGXI RADICAL YELLOW
+2FC9		KANGXI RADICAL MILLET
+2FCA		KANGXI RADICAL BLACK
+2FCB		KANGXI RADICAL EMBROIDERY
+2FCC		KANGXI RADICAL FROG
+2FCD		KANGXI RADICAL TRIPOD
+2FCE		KANGXI RADICAL DRUM
+2FCF		KANGXI RADICAL RAT
+2FD0		KANGXI RADICAL NOSE
+2FD1		KANGXI RADICAL EVEN
+2FD2		KANGXI RADICAL TOOTH
+2FD3		KANGXI RADICAL DRAGON
+2FD4		KANGXI RADICAL TURTLE
+2FD5		KANGXI RADICAL FLUTE
+2FF0		IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1		IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2		IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3		IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4		IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5		IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6		IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7		IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8		IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9		IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA		IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB		IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000		IDEOGRAPHIC SPACE
+3001		IDEOGRAPHIC COMMA
+3002		IDEOGRAPHIC FULL STOP
+3003		DITTO MARK
+3004		JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005		IDEOGRAPHIC ITERATION MARK
+3006		IDEOGRAPHIC CLOSING MARK
+3007		IDEOGRAPHIC NUMBER ZERO
+3008		LEFT ANGLE BRACKET
+3009		RIGHT ANGLE BRACKET
+300A		LEFT DOUBLE ANGLE BRACKET
+300B		RIGHT DOUBLE ANGLE BRACKET
+300C		LEFT CORNER BRACKET
+300D		RIGHT CORNER BRACKET
+300E		LEFT WHITE CORNER BRACKET
+300F		RIGHT WHITE CORNER BRACKET
+3010		LEFT BLACK LENTICULAR BRACKET
+3011		RIGHT BLACK LENTICULAR BRACKET
+3012		POSTAL MARK
+3013		GETA MARK
+3014		LEFT TORTOISE SHELL BRACKET
+3015		RIGHT TORTOISE SHELL BRACKET
+3016		LEFT WHITE LENTICULAR BRACKET
+3017		RIGHT WHITE LENTICULAR BRACKET
+3018		LEFT WHITE TORTOISE SHELL BRACKET
+3019		RIGHT WHITE TORTOISE SHELL BRACKET
+301A		LEFT WHITE SQUARE BRACKET
+301B		RIGHT WHITE SQUARE BRACKET
+301C		WAVE DASH
+301D		REVERSED DOUBLE PRIME QUOTATION MARK
+301E		DOUBLE PRIME QUOTATION MARK
+301F		LOW DOUBLE PRIME QUOTATION MARK
+3020		POSTAL MARK FACE
+3021		HANGZHOU NUMERAL ONE
+3022		HANGZHOU NUMERAL TWO
+3023		HANGZHOU NUMERAL THREE
+3024		HANGZHOU NUMERAL FOUR
+3025		HANGZHOU NUMERAL FIVE
+3026		HANGZHOU NUMERAL SIX
+3027		HANGZHOU NUMERAL SEVEN
+3028		HANGZHOU NUMERAL EIGHT
+3029		HANGZHOU NUMERAL NINE
+302A		IDEOGRAPHIC LEVEL TONE MARK
+302B		IDEOGRAPHIC RISING TONE MARK
+302C		IDEOGRAPHIC DEPARTING TONE MARK
+302D		IDEOGRAPHIC ENTERING TONE MARK
+302E		HANGUL SINGLE DOT TONE MARK
+302F		HANGUL DOUBLE DOT TONE MARK
+3030		WAVY DASH
+3031		VERTICAL KANA REPEAT MARK
+3032		VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+3033		VERTICAL KANA REPEAT MARK UPPER HALF
+3034		VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+3035		VERTICAL KANA REPEAT MARK LOWER HALF
+3036		CIRCLED POSTAL MARK
+3037		IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038		HANGZHOU NUMERAL TEN
+3039		HANGZHOU NUMERAL TWENTY
+303A		HANGZHOU NUMERAL THIRTY
+303B		VERTICAL IDEOGRAPHIC ITERATION MARK
+303C		MASU MARK
+303D		PART ALTERNATION MARK
+303E		IDEOGRAPHIC VARIATION INDICATOR
+303F		IDEOGRAPHIC HALF FILL SPACE
+3041		HIRAGANA LETTER SMALL A
+3042		HIRAGANA LETTER A
+3043		HIRAGANA LETTER SMALL I
+3044		HIRAGANA LETTER I
+3045		HIRAGANA LETTER SMALL U
+3046		HIRAGANA LETTER U
+3047		HIRAGANA LETTER SMALL E
+3048		HIRAGANA LETTER E
+3049		HIRAGANA LETTER SMALL O
+304A		HIRAGANA LETTER O
+304B		HIRAGANA LETTER KA
+304C		HIRAGANA LETTER GA
+304D		HIRAGANA LETTER KI
+304E		HIRAGANA LETTER GI
+304F		HIRAGANA LETTER KU
+3050		HIRAGANA LETTER GU
+3051		HIRAGANA LETTER KE
+3052		HIRAGANA LETTER GE
+3053		HIRAGANA LETTER KO
+3054		HIRAGANA LETTER GO
+3055		HIRAGANA LETTER SA
+3056		HIRAGANA LETTER ZA
+3057		HIRAGANA LETTER SI
+3058		HIRAGANA LETTER ZI
+3059		HIRAGANA LETTER SU
+305A		HIRAGANA LETTER ZU
+305B		HIRAGANA LETTER SE
+305C		HIRAGANA LETTER ZE
+305D		HIRAGANA LETTER SO
+305E		HIRAGANA LETTER ZO
+305F		HIRAGANA LETTER TA
+3060		HIRAGANA LETTER DA
+3061		HIRAGANA LETTER TI
+3062		HIRAGANA LETTER DI
+3063		HIRAGANA LETTER SMALL TU
+3064		HIRAGANA LETTER TU
+3065		HIRAGANA LETTER DU
+3066		HIRAGANA LETTER TE
+3067		HIRAGANA LETTER DE
+3068		HIRAGANA LETTER TO
+3069		HIRAGANA LETTER DO
+306A		HIRAGANA LETTER NA
+306B		HIRAGANA LETTER NI
+306C		HIRAGANA LETTER NU
+306D		HIRAGANA LETTER NE
+306E		HIRAGANA LETTER NO
+306F		HIRAGANA LETTER HA
+3070		HIRAGANA LETTER BA
+3071		HIRAGANA LETTER PA
+3072		HIRAGANA LETTER HI
+3073		HIRAGANA LETTER BI
+3074		HIRAGANA LETTER PI
+3075		HIRAGANA LETTER HU
+3076		HIRAGANA LETTER BU
+3077		HIRAGANA LETTER PU
+3078		HIRAGANA LETTER HE
+3079		HIRAGANA LETTER BE
+307A		HIRAGANA LETTER PE
+307B		HIRAGANA LETTER HO
+307C		HIRAGANA LETTER BO
+307D		HIRAGANA LETTER PO
+307E		HIRAGANA LETTER MA
+307F		HIRAGANA LETTER MI
+3080		HIRAGANA LETTER MU
+3081		HIRAGANA LETTER ME
+3082		HIRAGANA LETTER MO
+3083		HIRAGANA LETTER SMALL YA
+3084		HIRAGANA LETTER YA
+3085		HIRAGANA LETTER SMALL YU
+3086		HIRAGANA LETTER YU
+3087		HIRAGANA LETTER SMALL YO
+3088		HIRAGANA LETTER YO
+3089		HIRAGANA LETTER RA
+308A		HIRAGANA LETTER RI
+308B		HIRAGANA LETTER RU
+308C		HIRAGANA LETTER RE
+308D		HIRAGANA LETTER RO
+308E		HIRAGANA LETTER SMALL WA
+308F		HIRAGANA LETTER WA
+3090		HIRAGANA LETTER WI
+3091		HIRAGANA LETTER WE
+3092		HIRAGANA LETTER WO
+3093		HIRAGANA LETTER N
+3094		HIRAGANA LETTER VU
+3095		HIRAGANA LETTER SMALL KA
+3096		HIRAGANA LETTER SMALL KE
+3099		COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A		COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B		KATAKANA-HIRAGANA VOICED SOUND MARK
+309C		KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D		HIRAGANA ITERATION MARK
+309E		HIRAGANA VOICED ITERATION MARK
+309F		HIRAGANA DIGRAPH YORI
+30A0		KATAKANA-HIRAGANA DOUBLE HYPHEN
+30A1		KATAKANA LETTER SMALL A
+30A2		KATAKANA LETTER A
+30A3		KATAKANA LETTER SMALL I
+30A4		KATAKANA LETTER I
+30A5		KATAKANA LETTER SMALL U
+30A6		KATAKANA LETTER U
+30A7		KATAKANA LETTER SMALL E
+30A8		KATAKANA LETTER E
+30A9		KATAKANA LETTER SMALL O
+30AA		KATAKANA LETTER O
+30AB		KATAKANA LETTER KA
+30AC		KATAKANA LETTER GA
+30AD		KATAKANA LETTER KI
+30AE		KATAKANA LETTER GI
+30AF		KATAKANA LETTER KU
+30B0		KATAKANA LETTER GU
+30B1		KATAKANA LETTER KE
+30B2		KATAKANA LETTER GE
+30B3		KATAKANA LETTER KO
+30B4		KATAKANA LETTER GO
+30B5		KATAKANA LETTER SA
+30B6		KATAKANA LETTER ZA
+30B7		KATAKANA LETTER SI
+30B8		KATAKANA LETTER ZI
+30B9		KATAKANA LETTER SU
+30BA		KATAKANA LETTER ZU
+30BB		KATAKANA LETTER SE
+30BC		KATAKANA LETTER ZE
+30BD		KATAKANA LETTER SO
+30BE		KATAKANA LETTER ZO
+30BF		KATAKANA LETTER TA
+30C0		KATAKANA LETTER DA
+30C1		KATAKANA LETTER TI
+30C2		KATAKANA LETTER DI
+30C3		KATAKANA LETTER SMALL TU
+30C4		KATAKANA LETTER TU
+30C5		KATAKANA LETTER DU
+30C6		KATAKANA LETTER TE
+30C7		KATAKANA LETTER DE
+30C8		KATAKANA LETTER TO
+30C9		KATAKANA LETTER DO
+30CA		KATAKANA LETTER NA
+30CB		KATAKANA LETTER NI
+30CC		KATAKANA LETTER NU
+30CD		KATAKANA LETTER NE
+30CE		KATAKANA LETTER NO
+30CF		KATAKANA LETTER HA
+30D0		KATAKANA LETTER BA
+30D1		KATAKANA LETTER PA
+30D2		KATAKANA LETTER HI
+30D3		KATAKANA LETTER BI
+30D4		KATAKANA LETTER PI
+30D5		KATAKANA LETTER HU
+30D6		KATAKANA LETTER BU
+30D7		KATAKANA LETTER PU
+30D8		KATAKANA LETTER HE
+30D9		KATAKANA LETTER BE
+30DA		KATAKANA LETTER PE
+30DB		KATAKANA LETTER HO
+30DC		KATAKANA LETTER BO
+30DD		KATAKANA LETTER PO
+30DE		KATAKANA LETTER MA
+30DF		KATAKANA LETTER MI
+30E0		KATAKANA LETTER MU
+30E1		KATAKANA LETTER ME
+30E2		KATAKANA LETTER MO
+30E3		KATAKANA LETTER SMALL YA
+30E4		KATAKANA LETTER YA
+30E5		KATAKANA LETTER SMALL YU
+30E6		KATAKANA LETTER YU
+30E7		KATAKANA LETTER SMALL YO
+30E8		KATAKANA LETTER YO
+30E9		KATAKANA LETTER RA
+30EA		KATAKANA LETTER RI
+30EB		KATAKANA LETTER RU
+30EC		KATAKANA LETTER RE
+30ED		KATAKANA LETTER RO
+30EE		KATAKANA LETTER SMALL WA
+30EF		KATAKANA LETTER WA
+30F0		KATAKANA LETTER WI
+30F1		KATAKANA LETTER WE
+30F2		KATAKANA LETTER WO
+30F3		KATAKANA LETTER N
+30F4		KATAKANA LETTER VU
+30F5		KATAKANA LETTER SMALL KA
+30F6		KATAKANA LETTER SMALL KE
+30F7		KATAKANA LETTER VA
+30F8		KATAKANA LETTER VI
+30F9		KATAKANA LETTER VE
+30FA		KATAKANA LETTER VO
+30FB		KATAKANA MIDDLE DOT
+30FC		KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD		KATAKANA ITERATION MARK
+30FE		KATAKANA VOICED ITERATION MARK
+30FF		KATAKANA DIGRAPH KOTO
+3105		BOPOMOFO LETTER B
+3106		BOPOMOFO LETTER P
+3107		BOPOMOFO LETTER M
+3108		BOPOMOFO LETTER F
+3109		BOPOMOFO LETTER D
+310A		BOPOMOFO LETTER T
+310B		BOPOMOFO LETTER N
+310C		BOPOMOFO LETTER L
+310D		BOPOMOFO LETTER G
+310E		BOPOMOFO LETTER K
+310F		BOPOMOFO LETTER H
+3110		BOPOMOFO LETTER J
+3111		BOPOMOFO LETTER Q
+3112		BOPOMOFO LETTER X
+3113		BOPOMOFO LETTER ZH
+3114		BOPOMOFO LETTER CH
+3115		BOPOMOFO LETTER SH
+3116		BOPOMOFO LETTER R
+3117		BOPOMOFO LETTER Z
+3118		BOPOMOFO LETTER C
+3119		BOPOMOFO LETTER S
+311A		BOPOMOFO LETTER A
+311B		BOPOMOFO LETTER O
+311C		BOPOMOFO LETTER E
+311D		BOPOMOFO LETTER EH
+311E		BOPOMOFO LETTER AI
+311F		BOPOMOFO LETTER EI
+3120		BOPOMOFO LETTER AU
+3121		BOPOMOFO LETTER OU
+3122		BOPOMOFO LETTER AN
+3123		BOPOMOFO LETTER EN
+3124		BOPOMOFO LETTER ANG
+3125		BOPOMOFO LETTER ENG
+3126		BOPOMOFO LETTER ER
+3127		BOPOMOFO LETTER I
+3128		BOPOMOFO LETTER U
+3129		BOPOMOFO LETTER IU
+312A		BOPOMOFO LETTER V
+312B		BOPOMOFO LETTER NG
+312C		BOPOMOFO LETTER GN
+3131		HANGUL LETTER KIYEOK
+3132		HANGUL LETTER SSANGKIYEOK
+3133		HANGUL LETTER KIYEOK-SIOS
+3134		HANGUL LETTER NIEUN
+3135		HANGUL LETTER NIEUN-CIEUC
+3136		HANGUL LETTER NIEUN-HIEUH
+3137		HANGUL LETTER TIKEUT
+3138		HANGUL LETTER SSANGTIKEUT
+3139		HANGUL LETTER RIEUL
+313A		HANGUL LETTER RIEUL-KIYEOK
+313B		HANGUL LETTER RIEUL-MIEUM
+313C		HANGUL LETTER RIEUL-PIEUP
+313D		HANGUL LETTER RIEUL-SIOS
+313E		HANGUL LETTER RIEUL-THIEUTH
+313F		HANGUL LETTER RIEUL-PHIEUPH
+3140		HANGUL LETTER RIEUL-HIEUH
+3141		HANGUL LETTER MIEUM
+3142		HANGUL LETTER PIEUP
+3143		HANGUL LETTER SSANGPIEUP
+3144		HANGUL LETTER PIEUP-SIOS
+3145		HANGUL LETTER SIOS
+3146		HANGUL LETTER SSANGSIOS
+3147		HANGUL LETTER IEUNG
+3148		HANGUL LETTER CIEUC
+3149		HANGUL LETTER SSANGCIEUC
+314A		HANGUL LETTER CHIEUCH
+314B		HANGUL LETTER KHIEUKH
+314C		HANGUL LETTER THIEUTH
+314D		HANGUL LETTER PHIEUPH
+314E		HANGUL LETTER HIEUH
+314F		HANGUL LETTER A
+3150		HANGUL LETTER AE
+3151		HANGUL LETTER YA
+3152		HANGUL LETTER YAE
+3153		HANGUL LETTER EO
+3154		HANGUL LETTER E
+3155		HANGUL LETTER YEO
+3156		HANGUL LETTER YE
+3157		HANGUL LETTER O
+3158		HANGUL LETTER WA
+3159		HANGUL LETTER WAE
+315A		HANGUL LETTER OE
+315B		HANGUL LETTER YO
+315C		HANGUL LETTER U
+315D		HANGUL LETTER WEO
+315E		HANGUL LETTER WE
+315F		HANGUL LETTER WI
+3160		HANGUL LETTER YU
+3161		HANGUL LETTER EU
+3162		HANGUL LETTER YI
+3163		HANGUL LETTER I
+3164		HANGUL FILLER
+3165		HANGUL LETTER SSANGNIEUN
+3166		HANGUL LETTER NIEUN-TIKEUT
+3167		HANGUL LETTER NIEUN-SIOS
+3168		HANGUL LETTER NIEUN-PANSIOS
+3169		HANGUL LETTER RIEUL-KIYEOK-SIOS
+316A		HANGUL LETTER RIEUL-TIKEUT
+316B		HANGUL LETTER RIEUL-PIEUP-SIOS
+316C		HANGUL LETTER RIEUL-PANSIOS
+316D		HANGUL LETTER RIEUL-YEORINHIEUH
+316E		HANGUL LETTER MIEUM-PIEUP
+316F		HANGUL LETTER MIEUM-SIOS
+3170		HANGUL LETTER MIEUM-PANSIOS
+3171		HANGUL LETTER KAPYEOUNMIEUM
+3172		HANGUL LETTER PIEUP-KIYEOK
+3173		HANGUL LETTER PIEUP-TIKEUT
+3174		HANGUL LETTER PIEUP-SIOS-KIYEOK
+3175		HANGUL LETTER PIEUP-SIOS-TIKEUT
+3176		HANGUL LETTER PIEUP-CIEUC
+3177		HANGUL LETTER PIEUP-THIEUTH
+3178		HANGUL LETTER KAPYEOUNPIEUP
+3179		HANGUL LETTER KAPYEOUNSSANGPIEUP
+317A		HANGUL LETTER SIOS-KIYEOK
+317B		HANGUL LETTER SIOS-NIEUN
+317C		HANGUL LETTER SIOS-TIKEUT
+317D		HANGUL LETTER SIOS-PIEUP
+317E		HANGUL LETTER SIOS-CIEUC
+317F		HANGUL LETTER PANSIOS
+3180		HANGUL LETTER SSANGIEUNG
+3181		HANGUL LETTER YESIEUNG
+3182		HANGUL LETTER YESIEUNG-SIOS
+3183		HANGUL LETTER YESIEUNG-PANSIOS
+3184		HANGUL LETTER KAPYEOUNPHIEUPH
+3185		HANGUL LETTER SSANGHIEUH
+3186		HANGUL LETTER YEORINHIEUH
+3187		HANGUL LETTER YO-YA
+3188		HANGUL LETTER YO-YAE
+3189		HANGUL LETTER YO-I
+318A		HANGUL LETTER YU-YEO
+318B		HANGUL LETTER YU-YE
+318C		HANGUL LETTER YU-I
+318D		HANGUL LETTER ARAEA
+318E		HANGUL LETTER ARAEAE
+3190		IDEOGRAPHIC ANNOTATION LINKING MARK
+3191		IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192		IDEOGRAPHIC ANNOTATION ONE MARK
+3193		IDEOGRAPHIC ANNOTATION TWO MARK
+3194		IDEOGRAPHIC ANNOTATION THREE MARK
+3195		IDEOGRAPHIC ANNOTATION FOUR MARK
+3196		IDEOGRAPHIC ANNOTATION TOP MARK
+3197		IDEOGRAPHIC ANNOTATION MIDDLE MARK
+3198		IDEOGRAPHIC ANNOTATION BOTTOM MARK
+3199		IDEOGRAPHIC ANNOTATION FIRST MARK
+319A		IDEOGRAPHIC ANNOTATION SECOND MARK
+319B		IDEOGRAPHIC ANNOTATION THIRD MARK
+319C		IDEOGRAPHIC ANNOTATION FOURTH MARK
+319D		IDEOGRAPHIC ANNOTATION HEAVEN MARK
+319E		IDEOGRAPHIC ANNOTATION EARTH MARK
+319F		IDEOGRAPHIC ANNOTATION MAN MARK
+31A0		BOPOMOFO LETTER BU
+31A1		BOPOMOFO LETTER ZI
+31A2		BOPOMOFO LETTER JI
+31A3		BOPOMOFO LETTER GU
+31A4		BOPOMOFO LETTER EE
+31A5		BOPOMOFO LETTER ENN
+31A6		BOPOMOFO LETTER OO
+31A7		BOPOMOFO LETTER ONN
+31A8		BOPOMOFO LETTER IR
+31A9		BOPOMOFO LETTER ANN
+31AA		BOPOMOFO LETTER INN
+31AB		BOPOMOFO LETTER UNN
+31AC		BOPOMOFO LETTER IM
+31AD		BOPOMOFO LETTER NGG
+31AE		BOPOMOFO LETTER AINN
+31AF		BOPOMOFO LETTER AUNN
+31B0		BOPOMOFO LETTER AM
+31B1		BOPOMOFO LETTER OM
+31B2		BOPOMOFO LETTER ONG
+31B3		BOPOMOFO LETTER INNN
+31B4		BOPOMOFO FINAL LETTER P
+31B5		BOPOMOFO FINAL LETTER T
+31B6		BOPOMOFO FINAL LETTER K
+31B7		BOPOMOFO FINAL LETTER H
+31C0		CJK STROKE T
+31C1		CJK STROKE WG
+31C2		CJK STROKE XG
+31C3		CJK STROKE BXG
+31C4		CJK STROKE SW
+31C5		CJK STROKE HZZ
+31C6		CJK STROKE HZG
+31C7		CJK STROKE HP
+31C8		CJK STROKE HZWG
+31C9		CJK STROKE SZWG
+31CA		CJK STROKE HZT
+31CB		CJK STROKE HZZP
+31CC		CJK STROKE HPWG
+31CD		CJK STROKE HZW
+31CE		CJK STROKE HZZZ
+31CF		CJK STROKE N
+31F0		KATAKANA LETTER SMALL KU
+31F1		KATAKANA LETTER SMALL SI
+31F2		KATAKANA LETTER SMALL SU
+31F3		KATAKANA LETTER SMALL TO
+31F4		KATAKANA LETTER SMALL NU
+31F5		KATAKANA LETTER SMALL HA
+31F6		KATAKANA LETTER SMALL HI
+31F7		KATAKANA LETTER SMALL HU
+31F8		KATAKANA LETTER SMALL HE
+31F9		KATAKANA LETTER SMALL HO
+31FA		KATAKANA LETTER SMALL MU
+31FB		KATAKANA LETTER SMALL RA
+31FC		KATAKANA LETTER SMALL RI
+31FD		KATAKANA LETTER SMALL RU
+31FE		KATAKANA LETTER SMALL RE
+31FF		KATAKANA LETTER SMALL RO
+3200		PARENTHESIZED HANGUL KIYEOK
+3201		PARENTHESIZED HANGUL NIEUN
+3202		PARENTHESIZED HANGUL TIKEUT
+3203		PARENTHESIZED HANGUL RIEUL
+3204		PARENTHESIZED HANGUL MIEUM
+3205		PARENTHESIZED HANGUL PIEUP
+3206		PARENTHESIZED HANGUL SIOS
+3207		PARENTHESIZED HANGUL IEUNG
+3208		PARENTHESIZED HANGUL CIEUC
+3209		PARENTHESIZED HANGUL CHIEUCH
+320A		PARENTHESIZED HANGUL KHIEUKH
+320B		PARENTHESIZED HANGUL THIEUTH
+320C		PARENTHESIZED HANGUL PHIEUPH
+320D		PARENTHESIZED HANGUL HIEUH
+320E		PARENTHESIZED HANGUL KIYEOK A
+320F		PARENTHESIZED HANGUL NIEUN A
+3210		PARENTHESIZED HANGUL TIKEUT A
+3211		PARENTHESIZED HANGUL RIEUL A
+3212		PARENTHESIZED HANGUL MIEUM A
+3213		PARENTHESIZED HANGUL PIEUP A
+3214		PARENTHESIZED HANGUL SIOS A
+3215		PARENTHESIZED HANGUL IEUNG A
+3216		PARENTHESIZED HANGUL CIEUC A
+3217		PARENTHESIZED HANGUL CHIEUCH A
+3218		PARENTHESIZED HANGUL KHIEUKH A
+3219		PARENTHESIZED HANGUL THIEUTH A
+321A		PARENTHESIZED HANGUL PHIEUPH A
+321B		PARENTHESIZED HANGUL HIEUH A
+321C		PARENTHESIZED HANGUL CIEUC U
+321D		PARENTHESIZED KOREAN CHARACTER OJEON
+321E		PARENTHESIZED KOREAN CHARACTER O HU
+3220		PARENTHESIZED IDEOGRAPH ONE
+3221		PARENTHESIZED IDEOGRAPH TWO
+3222		PARENTHESIZED IDEOGRAPH THREE
+3223		PARENTHESIZED IDEOGRAPH FOUR
+3224		PARENTHESIZED IDEOGRAPH FIVE
+3225		PARENTHESIZED IDEOGRAPH SIX
+3226		PARENTHESIZED IDEOGRAPH SEVEN
+3227		PARENTHESIZED IDEOGRAPH EIGHT
+3228		PARENTHESIZED IDEOGRAPH NINE
+3229		PARENTHESIZED IDEOGRAPH TEN
+322A		PARENTHESIZED IDEOGRAPH MOON
+322B		PARENTHESIZED IDEOGRAPH FIRE
+322C		PARENTHESIZED IDEOGRAPH WATER
+322D		PARENTHESIZED IDEOGRAPH WOOD
+322E		PARENTHESIZED IDEOGRAPH METAL
+322F		PARENTHESIZED IDEOGRAPH EARTH
+3230		PARENTHESIZED IDEOGRAPH SUN
+3231		PARENTHESIZED IDEOGRAPH STOCK
+3232		PARENTHESIZED IDEOGRAPH HAVE
+3233		PARENTHESIZED IDEOGRAPH SOCIETY
+3234		PARENTHESIZED IDEOGRAPH NAME
+3235		PARENTHESIZED IDEOGRAPH SPECIAL
+3236		PARENTHESIZED IDEOGRAPH FINANCIAL
+3237		PARENTHESIZED IDEOGRAPH CONGRATULATION
+3238		PARENTHESIZED IDEOGRAPH LABOR
+3239		PARENTHESIZED IDEOGRAPH REPRESENT
+323A		PARENTHESIZED IDEOGRAPH CALL
+323B		PARENTHESIZED IDEOGRAPH STUDY
+323C		PARENTHESIZED IDEOGRAPH SUPERVISE
+323D		PARENTHESIZED IDEOGRAPH ENTERPRISE
+323E		PARENTHESIZED IDEOGRAPH RESOURCE
+323F		PARENTHESIZED IDEOGRAPH ALLIANCE
+3240		PARENTHESIZED IDEOGRAPH FESTIVAL
+3241		PARENTHESIZED IDEOGRAPH REST
+3242		PARENTHESIZED IDEOGRAPH SELF
+3243		PARENTHESIZED IDEOGRAPH REACH
+3250		PARTNERSHIP SIGN
+3251		CIRCLED NUMBER TWENTY ONE
+3252		CIRCLED NUMBER TWENTY TWO
+3253		CIRCLED NUMBER TWENTY THREE
+3254		CIRCLED NUMBER TWENTY FOUR
+3255		CIRCLED NUMBER TWENTY FIVE
+3256		CIRCLED NUMBER TWENTY SIX
+3257		CIRCLED NUMBER TWENTY SEVEN
+3258		CIRCLED NUMBER TWENTY EIGHT
+3259		CIRCLED NUMBER TWENTY NINE
+325A		CIRCLED NUMBER THIRTY
+325B		CIRCLED NUMBER THIRTY ONE
+325C		CIRCLED NUMBER THIRTY TWO
+325D		CIRCLED NUMBER THIRTY THREE
+325E		CIRCLED NUMBER THIRTY FOUR
+325F		CIRCLED NUMBER THIRTY FIVE
+3260		CIRCLED HANGUL KIYEOK
+3261		CIRCLED HANGUL NIEUN
+3262		CIRCLED HANGUL TIKEUT
+3263		CIRCLED HANGUL RIEUL
+3264		CIRCLED HANGUL MIEUM
+3265		CIRCLED HANGUL PIEUP
+3266		CIRCLED HANGUL SIOS
+3267		CIRCLED HANGUL IEUNG
+3268		CIRCLED HANGUL CIEUC
+3269		CIRCLED HANGUL CHIEUCH
+326A		CIRCLED HANGUL KHIEUKH
+326B		CIRCLED HANGUL THIEUTH
+326C		CIRCLED HANGUL PHIEUPH
+326D		CIRCLED HANGUL HIEUH
+326E		CIRCLED HANGUL KIYEOK A
+326F		CIRCLED HANGUL NIEUN A
+3270		CIRCLED HANGUL TIKEUT A
+3271		CIRCLED HANGUL RIEUL A
+3272		CIRCLED HANGUL MIEUM A
+3273		CIRCLED HANGUL PIEUP A
+3274		CIRCLED HANGUL SIOS A
+3275		CIRCLED HANGUL IEUNG A
+3276		CIRCLED HANGUL CIEUC A
+3277		CIRCLED HANGUL CHIEUCH A
+3278		CIRCLED HANGUL KHIEUKH A
+3279		CIRCLED HANGUL THIEUTH A
+327A		CIRCLED HANGUL PHIEUPH A
+327B		CIRCLED HANGUL HIEUH A
+327C		CIRCLED KOREAN CHARACTER CHAMKO
+327D		CIRCLED KOREAN CHARACTER JUEUI
+327E		CIRCLED HANGUL IEUNG U
+327F		KOREAN STANDARD SYMBOL
+3280		CIRCLED IDEOGRAPH ONE
+3281		CIRCLED IDEOGRAPH TWO
+3282		CIRCLED IDEOGRAPH THREE
+3283		CIRCLED IDEOGRAPH FOUR
+3284		CIRCLED IDEOGRAPH FIVE
+3285		CIRCLED IDEOGRAPH SIX
+3286		CIRCLED IDEOGRAPH SEVEN
+3287		CIRCLED IDEOGRAPH EIGHT
+3288		CIRCLED IDEOGRAPH NINE
+3289		CIRCLED IDEOGRAPH TEN
+328A		CIRCLED IDEOGRAPH MOON
+328B		CIRCLED IDEOGRAPH FIRE
+328C		CIRCLED IDEOGRAPH WATER
+328D		CIRCLED IDEOGRAPH WOOD
+328E		CIRCLED IDEOGRAPH METAL
+328F		CIRCLED IDEOGRAPH EARTH
+3290		CIRCLED IDEOGRAPH SUN
+3291		CIRCLED IDEOGRAPH STOCK
+3292		CIRCLED IDEOGRAPH HAVE
+3293		CIRCLED IDEOGRAPH SOCIETY
+3294		CIRCLED IDEOGRAPH NAME
+3295		CIRCLED IDEOGRAPH SPECIAL
+3296		CIRCLED IDEOGRAPH FINANCIAL
+3297		CIRCLED IDEOGRAPH CONGRATULATION
+3298		CIRCLED IDEOGRAPH LABOR
+3299		CIRCLED IDEOGRAPH SECRET
+329A		CIRCLED IDEOGRAPH MALE
+329B		CIRCLED IDEOGRAPH FEMALE
+329C		CIRCLED IDEOGRAPH SUITABLE
+329D		CIRCLED IDEOGRAPH EXCELLENT
+329E		CIRCLED IDEOGRAPH PRINT
+329F		CIRCLED IDEOGRAPH ATTENTION
+32A0		CIRCLED IDEOGRAPH ITEM
+32A1		CIRCLED IDEOGRAPH REST
+32A2		CIRCLED IDEOGRAPH COPY
+32A3		CIRCLED IDEOGRAPH CORRECT
+32A4		CIRCLED IDEOGRAPH HIGH
+32A5		CIRCLED IDEOGRAPH CENTRE
+32A6		CIRCLED IDEOGRAPH LOW
+32A7		CIRCLED IDEOGRAPH LEFT
+32A8		CIRCLED IDEOGRAPH RIGHT
+32A9		CIRCLED IDEOGRAPH MEDICINE
+32AA		CIRCLED IDEOGRAPH RELIGION
+32AB		CIRCLED IDEOGRAPH STUDY
+32AC		CIRCLED IDEOGRAPH SUPERVISE
+32AD		CIRCLED IDEOGRAPH ENTERPRISE
+32AE		CIRCLED IDEOGRAPH RESOURCE
+32AF		CIRCLED IDEOGRAPH ALLIANCE
+32B0		CIRCLED IDEOGRAPH NIGHT
+32B1		CIRCLED NUMBER THIRTY SIX
+32B2		CIRCLED NUMBER THIRTY SEVEN
+32B3		CIRCLED NUMBER THIRTY EIGHT
+32B4		CIRCLED NUMBER THIRTY NINE
+32B5		CIRCLED NUMBER FORTY
+32B6		CIRCLED NUMBER FORTY ONE
+32B7		CIRCLED NUMBER FORTY TWO
+32B8		CIRCLED NUMBER FORTY THREE
+32B9		CIRCLED NUMBER FORTY FOUR
+32BA		CIRCLED NUMBER FORTY FIVE
+32BB		CIRCLED NUMBER FORTY SIX
+32BC		CIRCLED NUMBER FORTY SEVEN
+32BD		CIRCLED NUMBER FORTY EIGHT
+32BE		CIRCLED NUMBER FORTY NINE
+32BF		CIRCLED NUMBER FIFTY
+32C0		IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+32C1		IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+32C2		IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+32C3		IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+32C4		IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+32C5		IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+32C6		IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+32C7		IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+32C8		IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+32C9		IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+32CA		IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+32CB		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32CC		SQUARE HG
+32CD		SQUARE ERG
+32CE		SQUARE EV
+32CF		LIMITED LIABILITY SIGN
+32D0		CIRCLED KATAKANA A
+32D1		CIRCLED KATAKANA I
+32D2		CIRCLED KATAKANA U
+32D3		CIRCLED KATAKANA E
+32D4		CIRCLED KATAKANA O
+32D5		CIRCLED KATAKANA KA
+32D6		CIRCLED KATAKANA KI
+32D7		CIRCLED KATAKANA KU
+32D8		CIRCLED KATAKANA KE
+32D9		CIRCLED KATAKANA KO
+32DA		CIRCLED KATAKANA SA
+32DB		CIRCLED KATAKANA SI
+32DC		CIRCLED KATAKANA SU
+32DD		CIRCLED KATAKANA SE
+32DE		CIRCLED KATAKANA SO
+32DF		CIRCLED KATAKANA TA
+32E0		CIRCLED KATAKANA TI
+32E1		CIRCLED KATAKANA TU
+32E2		CIRCLED KATAKANA TE
+32E3		CIRCLED KATAKANA TO
+32E4		CIRCLED KATAKANA NA
+32E5		CIRCLED KATAKANA NI
+32E6		CIRCLED KATAKANA NU
+32E7		CIRCLED KATAKANA NE
+32E8		CIRCLED KATAKANA NO
+32E9		CIRCLED KATAKANA HA
+32EA		CIRCLED KATAKANA HI
+32EB		CIRCLED KATAKANA HU
+32EC		CIRCLED KATAKANA HE
+32ED		CIRCLED KATAKANA HO
+32EE		CIRCLED KATAKANA MA
+32EF		CIRCLED KATAKANA MI
+32F0		CIRCLED KATAKANA MU
+32F1		CIRCLED KATAKANA ME
+32F2		CIRCLED KATAKANA MO
+32F3		CIRCLED KATAKANA YA
+32F4		CIRCLED KATAKANA YU
+32F5		CIRCLED KATAKANA YO
+32F6		CIRCLED KATAKANA RA
+32F7		CIRCLED KATAKANA RI
+32F8		CIRCLED KATAKANA RU
+32F9		CIRCLED KATAKANA RE
+32FA		CIRCLED KATAKANA RO
+32FB		CIRCLED KATAKANA WA
+32FC		CIRCLED KATAKANA WI
+32FD		CIRCLED KATAKANA WE
+32FE		CIRCLED KATAKANA WO
+3300		SQUARE APAATO
+3301		SQUARE ARUHUA
+3302		SQUARE ANPEA
+3303		SQUARE AARU
+3304		SQUARE ININGU
+3305		SQUARE INTI
+3306		SQUARE UON
+3307		SQUARE ESUKUUDO
+3308		SQUARE EEKAA
+3309		SQUARE ONSU
+330A		SQUARE OOMU
+330B		SQUARE KAIRI
+330C		SQUARE KARATTO
+330D		SQUARE KARORII
+330E		SQUARE GARON
+330F		SQUARE GANMA
+3310		SQUARE GIGA
+3311		SQUARE GINII
+3312		SQUARE KYURII
+3313		SQUARE GIRUDAA
+3314		SQUARE KIRO
+3315		SQUARE KIROGURAMU
+3316		SQUARE KIROMEETORU
+3317		SQUARE KIROWATTO
+3318		SQUARE GURAMU
+3319		SQUARE GURAMUTON
+331A		SQUARE KURUZEIRO
+331B		SQUARE KUROONE
+331C		SQUARE KEESU
+331D		SQUARE KORUNA
+331E		SQUARE KOOPO
+331F		SQUARE SAIKURU
+3320		SQUARE SANTIIMU
+3321		SQUARE SIRINGU
+3322		SQUARE SENTI
+3323		SQUARE SENTO
+3324		SQUARE DAASU
+3325		SQUARE DESI
+3326		SQUARE DORU
+3327		SQUARE TON
+3328		SQUARE NANO
+3329		SQUARE NOTTO
+332A		SQUARE HAITU
+332B		SQUARE PAASENTO
+332C		SQUARE PAATU
+332D		SQUARE BAARERU
+332E		SQUARE PIASUTORU
+332F		SQUARE PIKURU
+3330		SQUARE PIKO
+3331		SQUARE BIRU
+3332		SQUARE HUARADDO
+3333		SQUARE HUIITO
+3334		SQUARE BUSSYERU
+3335		SQUARE HURAN
+3336		SQUARE HEKUTAARU
+3337		SQUARE PESO
+3338		SQUARE PENIHI
+3339		SQUARE HERUTU
+333A		SQUARE PENSU
+333B		SQUARE PEEZI
+333C		SQUARE BEETA
+333D		SQUARE POINTO
+333E		SQUARE BORUTO
+333F		SQUARE HON
+3340		SQUARE PONDO
+3341		SQUARE HOORU
+3342		SQUARE HOON
+3343		SQUARE MAIKURO
+3344		SQUARE MAIRU
+3345		SQUARE MAHHA
+3346		SQUARE MARUKU
+3347		SQUARE MANSYON
+3348		SQUARE MIKURON
+3349		SQUARE MIRI
+334A		SQUARE MIRIBAARU
+334B		SQUARE MEGA
+334C		SQUARE MEGATON
+334D		SQUARE MEETORU
+334E		SQUARE YAADO
+334F		SQUARE YAARU
+3350		SQUARE YUAN
+3351		SQUARE RITTORU
+3352		SQUARE RIRA
+3353		SQUARE RUPII
+3354		SQUARE RUUBURU
+3355		SQUARE REMU
+3356		SQUARE RENTOGEN
+3357		SQUARE WATTO
+3358		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+3359		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+335A		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+335B		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+335C		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+335D		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+335E		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+335F		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+3360		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+3361		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+3362		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+3363		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+3364		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+3365		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+3366		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+3367		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+3368		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+3369		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+336A		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+336B		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+336C		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+336D		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+336E		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+336F		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+3370		IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+3371		SQUARE HPA
+3372		SQUARE DA
+3373		SQUARE AU
+3374		SQUARE BAR
+3375		SQUARE OV
+3376		SQUARE PC
+3377		SQUARE DM
+3378		SQUARE DM SQUARED
+3379		SQUARE DM CUBED
+337A		SQUARE IU
+337B		SQUARE ERA NAME HEISEI
+337C		SQUARE ERA NAME SYOUWA
+337D		SQUARE ERA NAME TAISYOU
+337E		SQUARE ERA NAME MEIZI
+337F		SQUARE CORPORATION
+3380		SQUARE PA AMPS
+3381		SQUARE NA
+3382		SQUARE MU A
+3383		SQUARE MA
+3384		SQUARE KA
+3385		SQUARE KB
+3386		SQUARE MB
+3387		SQUARE GB
+3388		SQUARE CAL
+3389		SQUARE KCAL
+338A		SQUARE PF
+338B		SQUARE NF
+338C		SQUARE MU F
+338D		SQUARE MU G
+338E		SQUARE MG
+338F		SQUARE KG
+3390		SQUARE HZ
+3391		SQUARE KHZ
+3392		SQUARE MHZ
+3393		SQUARE GHZ
+3394		SQUARE THZ
+3395		SQUARE MU L
+3396		SQUARE ML
+3397		SQUARE DL
+3398		SQUARE KL
+3399		SQUARE FM
+339A		SQUARE NM
+339B		SQUARE MU M
+339C		SQUARE MM
+339D		SQUARE CM
+339E		SQUARE KM
+339F		SQUARE MM SQUARED
+33A0		SQUARE CM SQUARED
+33A1		SQUARE M SQUARED
+33A2		SQUARE KM SQUARED
+33A3		SQUARE MM CUBED
+33A4		SQUARE CM CUBED
+33A5		SQUARE M CUBED
+33A6		SQUARE KM CUBED
+33A7		SQUARE M OVER S
+33A8		SQUARE M OVER S SQUARED
+33A9		SQUARE PA
+33AA		SQUARE KPA
+33AB		SQUARE MPA
+33AC		SQUARE GPA
+33AD		SQUARE RAD
+33AE		SQUARE RAD OVER S
+33AF		SQUARE RAD OVER S SQUARED
+33B0		SQUARE PS
+33B1		SQUARE NS
+33B2		SQUARE MU S
+33B3		SQUARE MS
+33B4		SQUARE PV
+33B5		SQUARE NV
+33B6		SQUARE MU V
+33B7		SQUARE MV
+33B8		SQUARE KV
+33B9		SQUARE MV MEGA
+33BA		SQUARE PW
+33BB		SQUARE NW
+33BC		SQUARE MU W
+33BD		SQUARE MW
+33BE		SQUARE KW
+33BF		SQUARE MW MEGA
+33C0		SQUARE K OHM
+33C1		SQUARE M OHM
+33C2		SQUARE AM
+33C3		SQUARE BQ
+33C4		SQUARE CC
+33C5		SQUARE CD
+33C6		SQUARE C OVER KG
+33C7		SQUARE CO
+33C8		SQUARE DB
+33C9		SQUARE GY
+33CA		SQUARE HA
+33CB		SQUARE HP
+33CC		SQUARE IN
+33CD		SQUARE KK
+33CE		SQUARE KM CAPITAL
+33CF		SQUARE KT
+33D0		SQUARE LM
+33D1		SQUARE LN
+33D2		SQUARE LOG
+33D3		SQUARE LX
+33D4		SQUARE MB SMALL
+33D5		SQUARE MIL
+33D6		SQUARE MOL
+33D7		SQUARE PH
+33D8		SQUARE PM
+33D9		SQUARE PPM
+33DA		SQUARE PR
+33DB		SQUARE SR
+33DC		SQUARE SV
+33DD		SQUARE WB
+33DE		SQUARE V OVER M
+33DF		SQUARE A OVER M
+33E0		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+33E1		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+33E2		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+33E3		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+33E4		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+33E5		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+33E6		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+33E7		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+33E8		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+33E9		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+33EA		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+33EB		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+33EC		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+33ED		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+33EE		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+33EF		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+33F0		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+33F1		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+33F2		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+33F3		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+33F4		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+33F5		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+33F6		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+33F7		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+33F8		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+33F9		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+33FA		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+33FB		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+33FC		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+33FD		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+33FE		IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+33FF		SQUARE GAL
+3400	4DB5	CJK Ideograph Extension A
+4DC0		HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1		HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2		HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3		HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4		HEXAGRAM FOR WAITING
+4DC5		HEXAGRAM FOR CONFLICT
+4DC6		HEXAGRAM FOR THE ARMY
+4DC7		HEXAGRAM FOR HOLDING TOGETHER
+4DC8		HEXAGRAM FOR SMALL TAMING
+4DC9		HEXAGRAM FOR TREADING
+4DCA		HEXAGRAM FOR PEACE
+4DCB		HEXAGRAM FOR STANDSTILL
+4DCC		HEXAGRAM FOR FELLOWSHIP
+4DCD		HEXAGRAM FOR GREAT POSSESSION
+4DCE		HEXAGRAM FOR MODESTY
+4DCF		HEXAGRAM FOR ENTHUSIASM
+4DD0		HEXAGRAM FOR FOLLOWING
+4DD1		HEXAGRAM FOR WORK ON THE DECAYED
+4DD2		HEXAGRAM FOR APPROACH
+4DD3		HEXAGRAM FOR CONTEMPLATION
+4DD4		HEXAGRAM FOR BITING THROUGH
+4DD5		HEXAGRAM FOR GRACE
+4DD6		HEXAGRAM FOR SPLITTING APART
+4DD7		HEXAGRAM FOR RETURN
+4DD8		HEXAGRAM FOR INNOCENCE
+4DD9		HEXAGRAM FOR GREAT TAMING
+4DDA		HEXAGRAM FOR MOUTH CORNERS
+4DDB		HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC		HEXAGRAM FOR THE ABYSMAL WATER
+4DDD		HEXAGRAM FOR THE CLINGING FIRE
+4DDE		HEXAGRAM FOR INFLUENCE
+4DDF		HEXAGRAM FOR DURATION
+4DE0		HEXAGRAM FOR RETREAT
+4DE1		HEXAGRAM FOR GREAT POWER
+4DE2		HEXAGRAM FOR PROGRESS
+4DE3		HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4		HEXAGRAM FOR THE FAMILY
+4DE5		HEXAGRAM FOR OPPOSITION
+4DE6		HEXAGRAM FOR OBSTRUCTION
+4DE7		HEXAGRAM FOR DELIVERANCE
+4DE8		HEXAGRAM FOR DECREASE
+4DE9		HEXAGRAM FOR INCREASE
+4DEA		HEXAGRAM FOR BREAKTHROUGH
+4DEB		HEXAGRAM FOR COMING TO MEET
+4DEC		HEXAGRAM FOR GATHERING TOGETHER
+4DED		HEXAGRAM FOR PUSHING UPWARD
+4DEE		HEXAGRAM FOR OPPRESSION
+4DEF		HEXAGRAM FOR THE WELL
+4DF0		HEXAGRAM FOR REVOLUTION
+4DF1		HEXAGRAM FOR THE CAULDRON
+4DF2		HEXAGRAM FOR THE AROUSING THUNDER
+4DF3		HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4		HEXAGRAM FOR DEVELOPMENT
+4DF5		HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6		HEXAGRAM FOR ABUNDANCE
+4DF7		HEXAGRAM FOR THE WANDERER
+4DF8		HEXAGRAM FOR THE GENTLE WIND
+4DF9		HEXAGRAM FOR THE JOYOUS LAKE
+4DFA		HEXAGRAM FOR DISPERSION
+4DFB		HEXAGRAM FOR LIMITATION
+4DFC		HEXAGRAM FOR INNER TRUTH
+4DFD		HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE		HEXAGRAM FOR AFTER COMPLETION
+4DFF		HEXAGRAM FOR BEFORE COMPLETION
+4E00	9FBB	CJK Ideograph
+A000		YI SYLLABLE IT
+A001		YI SYLLABLE IX
+A002		YI SYLLABLE I
+A003		YI SYLLABLE IP
+A004		YI SYLLABLE IET
+A005		YI SYLLABLE IEX
+A006		YI SYLLABLE IE
+A007		YI SYLLABLE IEP
+A008		YI SYLLABLE AT
+A009		YI SYLLABLE AX
+A00A		YI SYLLABLE A
+A00B		YI SYLLABLE AP
+A00C		YI SYLLABLE UOX
+A00D		YI SYLLABLE UO
+A00E		YI SYLLABLE UOP
+A00F		YI SYLLABLE OT
+A010		YI SYLLABLE OX
+A011		YI SYLLABLE O
+A012		YI SYLLABLE OP
+A013		YI SYLLABLE EX
+A014		YI SYLLABLE E
+A015		YI SYLLABLE WU
+A016		YI SYLLABLE BIT
+A017		YI SYLLABLE BIX
+A018		YI SYLLABLE BI
+A019		YI SYLLABLE BIP
+A01A		YI SYLLABLE BIET
+A01B		YI SYLLABLE BIEX
+A01C		YI SYLLABLE BIE
+A01D		YI SYLLABLE BIEP
+A01E		YI SYLLABLE BAT
+A01F		YI SYLLABLE BAX
+A020		YI SYLLABLE BA
+A021		YI SYLLABLE BAP
+A022		YI SYLLABLE BUOX
+A023		YI SYLLABLE BUO
+A024		YI SYLLABLE BUOP
+A025		YI SYLLABLE BOT
+A026		YI SYLLABLE BOX
+A027		YI SYLLABLE BO
+A028		YI SYLLABLE BOP
+A029		YI SYLLABLE BEX
+A02A		YI SYLLABLE BE
+A02B		YI SYLLABLE BEP
+A02C		YI SYLLABLE BUT
+A02D		YI SYLLABLE BUX
+A02E		YI SYLLABLE BU
+A02F		YI SYLLABLE BUP
+A030		YI SYLLABLE BURX
+A031		YI SYLLABLE BUR
+A032		YI SYLLABLE BYT
+A033		YI SYLLABLE BYX
+A034		YI SYLLABLE BY
+A035		YI SYLLABLE BYP
+A036		YI SYLLABLE BYRX
+A037		YI SYLLABLE BYR
+A038		YI SYLLABLE PIT
+A039		YI SYLLABLE PIX
+A03A		YI SYLLABLE PI
+A03B		YI SYLLABLE PIP
+A03C		YI SYLLABLE PIEX
+A03D		YI SYLLABLE PIE
+A03E		YI SYLLABLE PIEP
+A03F		YI SYLLABLE PAT
+A040		YI SYLLABLE PAX
+A041		YI SYLLABLE PA
+A042		YI SYLLABLE PAP
+A043		YI SYLLABLE PUOX
+A044		YI SYLLABLE PUO
+A045		YI SYLLABLE PUOP
+A046		YI SYLLABLE POT
+A047		YI SYLLABLE POX
+A048		YI SYLLABLE PO
+A049		YI SYLLABLE POP
+A04A		YI SYLLABLE PUT
+A04B		YI SYLLABLE PUX
+A04C		YI SYLLABLE PU
+A04D		YI SYLLABLE PUP
+A04E		YI SYLLABLE PURX
+A04F		YI SYLLABLE PUR
+A050		YI SYLLABLE PYT
+A051		YI SYLLABLE PYX
+A052		YI SYLLABLE PY
+A053		YI SYLLABLE PYP
+A054		YI SYLLABLE PYRX
+A055		YI SYLLABLE PYR
+A056		YI SYLLABLE BBIT
+A057		YI SYLLABLE BBIX
+A058		YI SYLLABLE BBI
+A059		YI SYLLABLE BBIP
+A05A		YI SYLLABLE BBIET
+A05B		YI SYLLABLE BBIEX
+A05C		YI SYLLABLE BBIE
+A05D		YI SYLLABLE BBIEP
+A05E		YI SYLLABLE BBAT
+A05F		YI SYLLABLE BBAX
+A060		YI SYLLABLE BBA
+A061		YI SYLLABLE BBAP
+A062		YI SYLLABLE BBUOX
+A063		YI SYLLABLE BBUO
+A064		YI SYLLABLE BBUOP
+A065		YI SYLLABLE BBOT
+A066		YI SYLLABLE BBOX
+A067		YI SYLLABLE BBO
+A068		YI SYLLABLE BBOP
+A069		YI SYLLABLE BBEX
+A06A		YI SYLLABLE BBE
+A06B		YI SYLLABLE BBEP
+A06C		YI SYLLABLE BBUT
+A06D		YI SYLLABLE BBUX
+A06E		YI SYLLABLE BBU
+A06F		YI SYLLABLE BBUP
+A070		YI SYLLABLE BBURX
+A071		YI SYLLABLE BBUR
+A072		YI SYLLABLE BBYT
+A073		YI SYLLABLE BBYX
+A074		YI SYLLABLE BBY
+A075		YI SYLLABLE BBYP
+A076		YI SYLLABLE NBIT
+A077		YI SYLLABLE NBIX
+A078		YI SYLLABLE NBI
+A079		YI SYLLABLE NBIP
+A07A		YI SYLLABLE NBIEX
+A07B		YI SYLLABLE NBIE
+A07C		YI SYLLABLE NBIEP
+A07D		YI SYLLABLE NBAT
+A07E		YI SYLLABLE NBAX
+A07F		YI SYLLABLE NBA
+A080		YI SYLLABLE NBAP
+A081		YI SYLLABLE NBOT
+A082		YI SYLLABLE NBOX
+A083		YI SYLLABLE NBO
+A084		YI SYLLABLE NBOP
+A085		YI SYLLABLE NBUT
+A086		YI SYLLABLE NBUX
+A087		YI SYLLABLE NBU
+A088		YI SYLLABLE NBUP
+A089		YI SYLLABLE NBURX
+A08A		YI SYLLABLE NBUR
+A08B		YI SYLLABLE NBYT
+A08C		YI SYLLABLE NBYX
+A08D		YI SYLLABLE NBY
+A08E		YI SYLLABLE NBYP
+A08F		YI SYLLABLE NBYRX
+A090		YI SYLLABLE NBYR
+A091		YI SYLLABLE HMIT
+A092		YI SYLLABLE HMIX
+A093		YI SYLLABLE HMI
+A094		YI SYLLABLE HMIP
+A095		YI SYLLABLE HMIEX
+A096		YI SYLLABLE HMIE
+A097		YI SYLLABLE HMIEP
+A098		YI SYLLABLE HMAT
+A099		YI SYLLABLE HMAX
+A09A		YI SYLLABLE HMA
+A09B		YI SYLLABLE HMAP
+A09C		YI SYLLABLE HMUOX
+A09D		YI SYLLABLE HMUO
+A09E		YI SYLLABLE HMUOP
+A09F		YI SYLLABLE HMOT
+A0A0		YI SYLLABLE HMOX
+A0A1		YI SYLLABLE HMO
+A0A2		YI SYLLABLE HMOP
+A0A3		YI SYLLABLE HMUT
+A0A4		YI SYLLABLE HMUX
+A0A5		YI SYLLABLE HMU
+A0A6		YI SYLLABLE HMUP
+A0A7		YI SYLLABLE HMURX
+A0A8		YI SYLLABLE HMUR
+A0A9		YI SYLLABLE HMYX
+A0AA		YI SYLLABLE HMY
+A0AB		YI SYLLABLE HMYP
+A0AC		YI SYLLABLE HMYRX
+A0AD		YI SYLLABLE HMYR
+A0AE		YI SYLLABLE MIT
+A0AF		YI SYLLABLE MIX
+A0B0		YI SYLLABLE MI
+A0B1		YI SYLLABLE MIP
+A0B2		YI SYLLABLE MIEX
+A0B3		YI SYLLABLE MIE
+A0B4		YI SYLLABLE MIEP
+A0B5		YI SYLLABLE MAT
+A0B6		YI SYLLABLE MAX
+A0B7		YI SYLLABLE MA
+A0B8		YI SYLLABLE MAP
+A0B9		YI SYLLABLE MUOT
+A0BA		YI SYLLABLE MUOX
+A0BB		YI SYLLABLE MUO
+A0BC		YI SYLLABLE MUOP
+A0BD		YI SYLLABLE MOT
+A0BE		YI SYLLABLE MOX
+A0BF		YI SYLLABLE MO
+A0C0		YI SYLLABLE MOP
+A0C1		YI SYLLABLE MEX
+A0C2		YI SYLLABLE ME
+A0C3		YI SYLLABLE MUT
+A0C4		YI SYLLABLE MUX
+A0C5		YI SYLLABLE MU
+A0C6		YI SYLLABLE MUP
+A0C7		YI SYLLABLE MURX
+A0C8		YI SYLLABLE MUR
+A0C9		YI SYLLABLE MYT
+A0CA		YI SYLLABLE MYX
+A0CB		YI SYLLABLE MY
+A0CC		YI SYLLABLE MYP
+A0CD		YI SYLLABLE FIT
+A0CE		YI SYLLABLE FIX
+A0CF		YI SYLLABLE FI
+A0D0		YI SYLLABLE FIP
+A0D1		YI SYLLABLE FAT
+A0D2		YI SYLLABLE FAX
+A0D3		YI SYLLABLE FA
+A0D4		YI SYLLABLE FAP
+A0D5		YI SYLLABLE FOX
+A0D6		YI SYLLABLE FO
+A0D7		YI SYLLABLE FOP
+A0D8		YI SYLLABLE FUT
+A0D9		YI SYLLABLE FUX
+A0DA		YI SYLLABLE FU
+A0DB		YI SYLLABLE FUP
+A0DC		YI SYLLABLE FURX
+A0DD		YI SYLLABLE FUR
+A0DE		YI SYLLABLE FYT
+A0DF		YI SYLLABLE FYX
+A0E0		YI SYLLABLE FY
+A0E1		YI SYLLABLE FYP
+A0E2		YI SYLLABLE VIT
+A0E3		YI SYLLABLE VIX
+A0E4		YI SYLLABLE VI
+A0E5		YI SYLLABLE VIP
+A0E6		YI SYLLABLE VIET
+A0E7		YI SYLLABLE VIEX
+A0E8		YI SYLLABLE VIE
+A0E9		YI SYLLABLE VIEP
+A0EA		YI SYLLABLE VAT
+A0EB		YI SYLLABLE VAX
+A0EC		YI SYLLABLE VA
+A0ED		YI SYLLABLE VAP
+A0EE		YI SYLLABLE VOT
+A0EF		YI SYLLABLE VOX
+A0F0		YI SYLLABLE VO
+A0F1		YI SYLLABLE VOP
+A0F2		YI SYLLABLE VEX
+A0F3		YI SYLLABLE VEP
+A0F4		YI SYLLABLE VUT
+A0F5		YI SYLLABLE VUX
+A0F6		YI SYLLABLE VU
+A0F7		YI SYLLABLE VUP
+A0F8		YI SYLLABLE VURX
+A0F9		YI SYLLABLE VUR
+A0FA		YI SYLLABLE VYT
+A0FB		YI SYLLABLE VYX
+A0FC		YI SYLLABLE VY
+A0FD		YI SYLLABLE VYP
+A0FE		YI SYLLABLE VYRX
+A0FF		YI SYLLABLE VYR
+A100		YI SYLLABLE DIT
+A101		YI SYLLABLE DIX
+A102		YI SYLLABLE DI
+A103		YI SYLLABLE DIP
+A104		YI SYLLABLE DIEX
+A105		YI SYLLABLE DIE
+A106		YI SYLLABLE DIEP
+A107		YI SYLLABLE DAT
+A108		YI SYLLABLE DAX
+A109		YI SYLLABLE DA
+A10A		YI SYLLABLE DAP
+A10B		YI SYLLABLE DUOX
+A10C		YI SYLLABLE DUO
+A10D		YI SYLLABLE DOT
+A10E		YI SYLLABLE DOX
+A10F		YI SYLLABLE DO
+A110		YI SYLLABLE DOP
+A111		YI SYLLABLE DEX
+A112		YI SYLLABLE DE
+A113		YI SYLLABLE DEP
+A114		YI SYLLABLE DUT
+A115		YI SYLLABLE DUX
+A116		YI SYLLABLE DU
+A117		YI SYLLABLE DUP
+A118		YI SYLLABLE DURX
+A119		YI SYLLABLE DUR
+A11A		YI SYLLABLE TIT
+A11B		YI SYLLABLE TIX
+A11C		YI SYLLABLE TI
+A11D		YI SYLLABLE TIP
+A11E		YI SYLLABLE TIEX
+A11F		YI SYLLABLE TIE
+A120		YI SYLLABLE TIEP
+A121		YI SYLLABLE TAT
+A122		YI SYLLABLE TAX
+A123		YI SYLLABLE TA
+A124		YI SYLLABLE TAP
+A125		YI SYLLABLE TUOT
+A126		YI SYLLABLE TUOX
+A127		YI SYLLABLE TUO
+A128		YI SYLLABLE TUOP
+A129		YI SYLLABLE TOT
+A12A		YI SYLLABLE TOX
+A12B		YI SYLLABLE TO
+A12C		YI SYLLABLE TOP
+A12D		YI SYLLABLE TEX
+A12E		YI SYLLABLE TE
+A12F		YI SYLLABLE TEP
+A130		YI SYLLABLE TUT
+A131		YI SYLLABLE TUX
+A132		YI SYLLABLE TU
+A133		YI SYLLABLE TUP
+A134		YI SYLLABLE TURX
+A135		YI SYLLABLE TUR
+A136		YI SYLLABLE DDIT
+A137		YI SYLLABLE DDIX
+A138		YI SYLLABLE DDI
+A139		YI SYLLABLE DDIP
+A13A		YI SYLLABLE DDIEX
+A13B		YI SYLLABLE DDIE
+A13C		YI SYLLABLE DDIEP
+A13D		YI SYLLABLE DDAT
+A13E		YI SYLLABLE DDAX
+A13F		YI SYLLABLE DDA
+A140		YI SYLLABLE DDAP
+A141		YI SYLLABLE DDUOX
+A142		YI SYLLABLE DDUO
+A143		YI SYLLABLE DDUOP
+A144		YI SYLLABLE DDOT
+A145		YI SYLLABLE DDOX
+A146		YI SYLLABLE DDO
+A147		YI SYLLABLE DDOP
+A148		YI SYLLABLE DDEX
+A149		YI SYLLABLE DDE
+A14A		YI SYLLABLE DDEP
+A14B		YI SYLLABLE DDUT
+A14C		YI SYLLABLE DDUX
+A14D		YI SYLLABLE DDU
+A14E		YI SYLLABLE DDUP
+A14F		YI SYLLABLE DDURX
+A150		YI SYLLABLE DDUR
+A151		YI SYLLABLE NDIT
+A152		YI SYLLABLE NDIX
+A153		YI SYLLABLE NDI
+A154		YI SYLLABLE NDIP
+A155		YI SYLLABLE NDIEX
+A156		YI SYLLABLE NDIE
+A157		YI SYLLABLE NDAT
+A158		YI SYLLABLE NDAX
+A159		YI SYLLABLE NDA
+A15A		YI SYLLABLE NDAP
+A15B		YI SYLLABLE NDOT
+A15C		YI SYLLABLE NDOX
+A15D		YI SYLLABLE NDO
+A15E		YI SYLLABLE NDOP
+A15F		YI SYLLABLE NDEX
+A160		YI SYLLABLE NDE
+A161		YI SYLLABLE NDEP
+A162		YI SYLLABLE NDUT
+A163		YI SYLLABLE NDUX
+A164		YI SYLLABLE NDU
+A165		YI SYLLABLE NDUP
+A166		YI SYLLABLE NDURX
+A167		YI SYLLABLE NDUR
+A168		YI SYLLABLE HNIT
+A169		YI SYLLABLE HNIX
+A16A		YI SYLLABLE HNI
+A16B		YI SYLLABLE HNIP
+A16C		YI SYLLABLE HNIET
+A16D		YI SYLLABLE HNIEX
+A16E		YI SYLLABLE HNIE
+A16F		YI SYLLABLE HNIEP
+A170		YI SYLLABLE HNAT
+A171		YI SYLLABLE HNAX
+A172		YI SYLLABLE HNA
+A173		YI SYLLABLE HNAP
+A174		YI SYLLABLE HNUOX
+A175		YI SYLLABLE HNUO
+A176		YI SYLLABLE HNOT
+A177		YI SYLLABLE HNOX
+A178		YI SYLLABLE HNOP
+A179		YI SYLLABLE HNEX
+A17A		YI SYLLABLE HNE
+A17B		YI SYLLABLE HNEP
+A17C		YI SYLLABLE HNUT
+A17D		YI SYLLABLE NIT
+A17E		YI SYLLABLE NIX
+A17F		YI SYLLABLE NI
+A180		YI SYLLABLE NIP
+A181		YI SYLLABLE NIEX
+A182		YI SYLLABLE NIE
+A183		YI SYLLABLE NIEP
+A184		YI SYLLABLE NAX
+A185		YI SYLLABLE NA
+A186		YI SYLLABLE NAP
+A187		YI SYLLABLE NUOX
+A188		YI SYLLABLE NUO
+A189		YI SYLLABLE NUOP
+A18A		YI SYLLABLE NOT
+A18B		YI SYLLABLE NOX
+A18C		YI SYLLABLE NO
+A18D		YI SYLLABLE NOP
+A18E		YI SYLLABLE NEX
+A18F		YI SYLLABLE NE
+A190		YI SYLLABLE NEP
+A191		YI SYLLABLE NUT
+A192		YI SYLLABLE NUX
+A193		YI SYLLABLE NU
+A194		YI SYLLABLE NUP
+A195		YI SYLLABLE NURX
+A196		YI SYLLABLE NUR
+A197		YI SYLLABLE HLIT
+A198		YI SYLLABLE HLIX
+A199		YI SYLLABLE HLI
+A19A		YI SYLLABLE HLIP
+A19B		YI SYLLABLE HLIEX
+A19C		YI SYLLABLE HLIE
+A19D		YI SYLLABLE HLIEP
+A19E		YI SYLLABLE HLAT
+A19F		YI SYLLABLE HLAX
+A1A0		YI SYLLABLE HLA
+A1A1		YI SYLLABLE HLAP
+A1A2		YI SYLLABLE HLUOX
+A1A3		YI SYLLABLE HLUO
+A1A4		YI SYLLABLE HLUOP
+A1A5		YI SYLLABLE HLOX
+A1A6		YI SYLLABLE HLO
+A1A7		YI SYLLABLE HLOP
+A1A8		YI SYLLABLE HLEX
+A1A9		YI SYLLABLE HLE
+A1AA		YI SYLLABLE HLEP
+A1AB		YI SYLLABLE HLUT
+A1AC		YI SYLLABLE HLUX
+A1AD		YI SYLLABLE HLU
+A1AE		YI SYLLABLE HLUP
+A1AF		YI SYLLABLE HLURX
+A1B0		YI SYLLABLE HLUR
+A1B1		YI SYLLABLE HLYT
+A1B2		YI SYLLABLE HLYX
+A1B3		YI SYLLABLE HLY
+A1B4		YI SYLLABLE HLYP
+A1B5		YI SYLLABLE HLYRX
+A1B6		YI SYLLABLE HLYR
+A1B7		YI SYLLABLE LIT
+A1B8		YI SYLLABLE LIX
+A1B9		YI SYLLABLE LI
+A1BA		YI SYLLABLE LIP
+A1BB		YI SYLLABLE LIET
+A1BC		YI SYLLABLE LIEX
+A1BD		YI SYLLABLE LIE
+A1BE		YI SYLLABLE LIEP
+A1BF		YI SYLLABLE LAT
+A1C0		YI SYLLABLE LAX
+A1C1		YI SYLLABLE LA
+A1C2		YI SYLLABLE LAP
+A1C3		YI SYLLABLE LUOT
+A1C4		YI SYLLABLE LUOX
+A1C5		YI SYLLABLE LUO
+A1C6		YI SYLLABLE LUOP
+A1C7		YI SYLLABLE LOT
+A1C8		YI SYLLABLE LOX
+A1C9		YI SYLLABLE LO
+A1CA		YI SYLLABLE LOP
+A1CB		YI SYLLABLE LEX
+A1CC		YI SYLLABLE LE
+A1CD		YI SYLLABLE LEP
+A1CE		YI SYLLABLE LUT
+A1CF		YI SYLLABLE LUX
+A1D0		YI SYLLABLE LU
+A1D1		YI SYLLABLE LUP
+A1D2		YI SYLLABLE LURX
+A1D3		YI SYLLABLE LUR
+A1D4		YI SYLLABLE LYT
+A1D5		YI SYLLABLE LYX
+A1D6		YI SYLLABLE LY
+A1D7		YI SYLLABLE LYP
+A1D8		YI SYLLABLE LYRX
+A1D9		YI SYLLABLE LYR
+A1DA		YI SYLLABLE GIT
+A1DB		YI SYLLABLE GIX
+A1DC		YI SYLLABLE GI
+A1DD		YI SYLLABLE GIP
+A1DE		YI SYLLABLE GIET
+A1DF		YI SYLLABLE GIEX
+A1E0		YI SYLLABLE GIE
+A1E1		YI SYLLABLE GIEP
+A1E2		YI SYLLABLE GAT
+A1E3		YI SYLLABLE GAX
+A1E4		YI SYLLABLE GA
+A1E5		YI SYLLABLE GAP
+A1E6		YI SYLLABLE GUOT
+A1E7		YI SYLLABLE GUOX
+A1E8		YI SYLLABLE GUO
+A1E9		YI SYLLABLE GUOP
+A1EA		YI SYLLABLE GOT
+A1EB		YI SYLLABLE GOX
+A1EC		YI SYLLABLE GO
+A1ED		YI SYLLABLE GOP
+A1EE		YI SYLLABLE GET
+A1EF		YI SYLLABLE GEX
+A1F0		YI SYLLABLE GE
+A1F1		YI SYLLABLE GEP
+A1F2		YI SYLLABLE GUT
+A1F3		YI SYLLABLE GUX
+A1F4		YI SYLLABLE GU
+A1F5		YI SYLLABLE GUP
+A1F6		YI SYLLABLE GURX
+A1F7		YI SYLLABLE GUR
+A1F8		YI SYLLABLE KIT
+A1F9		YI SYLLABLE KIX
+A1FA		YI SYLLABLE KI
+A1FB		YI SYLLABLE KIP
+A1FC		YI SYLLABLE KIEX
+A1FD		YI SYLLABLE KIE
+A1FE		YI SYLLABLE KIEP
+A1FF		YI SYLLABLE KAT
+A200		YI SYLLABLE KAX
+A201		YI SYLLABLE KA
+A202		YI SYLLABLE KAP
+A203		YI SYLLABLE KUOX
+A204		YI SYLLABLE KUO
+A205		YI SYLLABLE KUOP
+A206		YI SYLLABLE KOT
+A207		YI SYLLABLE KOX
+A208		YI SYLLABLE KO
+A209		YI SYLLABLE KOP
+A20A		YI SYLLABLE KET
+A20B		YI SYLLABLE KEX
+A20C		YI SYLLABLE KE
+A20D		YI SYLLABLE KEP
+A20E		YI SYLLABLE KUT
+A20F		YI SYLLABLE KUX
+A210		YI SYLLABLE KU
+A211		YI SYLLABLE KUP
+A212		YI SYLLABLE KURX
+A213		YI SYLLABLE KUR
+A214		YI SYLLABLE GGIT
+A215		YI SYLLABLE GGIX
+A216		YI SYLLABLE GGI
+A217		YI SYLLABLE GGIEX
+A218		YI SYLLABLE GGIE
+A219		YI SYLLABLE GGIEP
+A21A		YI SYLLABLE GGAT
+A21B		YI SYLLABLE GGAX
+A21C		YI SYLLABLE GGA
+A21D		YI SYLLABLE GGAP
+A21E		YI SYLLABLE GGUOT
+A21F		YI SYLLABLE GGUOX
+A220		YI SYLLABLE GGUO
+A221		YI SYLLABLE GGUOP
+A222		YI SYLLABLE GGOT
+A223		YI SYLLABLE GGOX
+A224		YI SYLLABLE GGO
+A225		YI SYLLABLE GGOP
+A226		YI SYLLABLE GGET
+A227		YI SYLLABLE GGEX
+A228		YI SYLLABLE GGE
+A229		YI SYLLABLE GGEP
+A22A		YI SYLLABLE GGUT
+A22B		YI SYLLABLE GGUX
+A22C		YI SYLLABLE GGU
+A22D		YI SYLLABLE GGUP
+A22E		YI SYLLABLE GGURX
+A22F		YI SYLLABLE GGUR
+A230		YI SYLLABLE MGIEX
+A231		YI SYLLABLE MGIE
+A232		YI SYLLABLE MGAT
+A233		YI SYLLABLE MGAX
+A234		YI SYLLABLE MGA
+A235		YI SYLLABLE MGAP
+A236		YI SYLLABLE MGUOX
+A237		YI SYLLABLE MGUO
+A238		YI SYLLABLE MGUOP
+A239		YI SYLLABLE MGOT
+A23A		YI SYLLABLE MGOX
+A23B		YI SYLLABLE MGO
+A23C		YI SYLLABLE MGOP
+A23D		YI SYLLABLE MGEX
+A23E		YI SYLLABLE MGE
+A23F		YI SYLLABLE MGEP
+A240		YI SYLLABLE MGUT
+A241		YI SYLLABLE MGUX
+A242		YI SYLLABLE MGU
+A243		YI SYLLABLE MGUP
+A244		YI SYLLABLE MGURX
+A245		YI SYLLABLE MGUR
+A246		YI SYLLABLE HXIT
+A247		YI SYLLABLE HXIX
+A248		YI SYLLABLE HXI
+A249		YI SYLLABLE HXIP
+A24A		YI SYLLABLE HXIET
+A24B		YI SYLLABLE HXIEX
+A24C		YI SYLLABLE HXIE
+A24D		YI SYLLABLE HXIEP
+A24E		YI SYLLABLE HXAT
+A24F		YI SYLLABLE HXAX
+A250		YI SYLLABLE HXA
+A251		YI SYLLABLE HXAP
+A252		YI SYLLABLE HXUOT
+A253		YI SYLLABLE HXUOX
+A254		YI SYLLABLE HXUO
+A255		YI SYLLABLE HXUOP
+A256		YI SYLLABLE HXOT
+A257		YI SYLLABLE HXOX
+A258		YI SYLLABLE HXO
+A259		YI SYLLABLE HXOP
+A25A		YI SYLLABLE HXEX
+A25B		YI SYLLABLE HXE
+A25C		YI SYLLABLE HXEP
+A25D		YI SYLLABLE NGIEX
+A25E		YI SYLLABLE NGIE
+A25F		YI SYLLABLE NGIEP
+A260		YI SYLLABLE NGAT
+A261		YI SYLLABLE NGAX
+A262		YI SYLLABLE NGA
+A263		YI SYLLABLE NGAP
+A264		YI SYLLABLE NGUOT
+A265		YI SYLLABLE NGUOX
+A266		YI SYLLABLE NGUO
+A267		YI SYLLABLE NGOT
+A268		YI SYLLABLE NGOX
+A269		YI SYLLABLE NGO
+A26A		YI SYLLABLE NGOP
+A26B		YI SYLLABLE NGEX
+A26C		YI SYLLABLE NGE
+A26D		YI SYLLABLE NGEP
+A26E		YI SYLLABLE HIT
+A26F		YI SYLLABLE HIEX
+A270		YI SYLLABLE HIE
+A271		YI SYLLABLE HAT
+A272		YI SYLLABLE HAX
+A273		YI SYLLABLE HA
+A274		YI SYLLABLE HAP
+A275		YI SYLLABLE HUOT
+A276		YI SYLLABLE HUOX
+A277		YI SYLLABLE HUO
+A278		YI SYLLABLE HUOP
+A279		YI SYLLABLE HOT
+A27A		YI SYLLABLE HOX
+A27B		YI SYLLABLE HO
+A27C		YI SYLLABLE HOP
+A27D		YI SYLLABLE HEX
+A27E		YI SYLLABLE HE
+A27F		YI SYLLABLE HEP
+A280		YI SYLLABLE WAT
+A281		YI SYLLABLE WAX
+A282		YI SYLLABLE WA
+A283		YI SYLLABLE WAP
+A284		YI SYLLABLE WUOX
+A285		YI SYLLABLE WUO
+A286		YI SYLLABLE WUOP
+A287		YI SYLLABLE WOX
+A288		YI SYLLABLE WO
+A289		YI SYLLABLE WOP
+A28A		YI SYLLABLE WEX
+A28B		YI SYLLABLE WE
+A28C		YI SYLLABLE WEP
+A28D		YI SYLLABLE ZIT
+A28E		YI SYLLABLE ZIX
+A28F		YI SYLLABLE ZI
+A290		YI SYLLABLE ZIP
+A291		YI SYLLABLE ZIEX
+A292		YI SYLLABLE ZIE
+A293		YI SYLLABLE ZIEP
+A294		YI SYLLABLE ZAT
+A295		YI SYLLABLE ZAX
+A296		YI SYLLABLE ZA
+A297		YI SYLLABLE ZAP
+A298		YI SYLLABLE ZUOX
+A299		YI SYLLABLE ZUO
+A29A		YI SYLLABLE ZUOP
+A29B		YI SYLLABLE ZOT
+A29C		YI SYLLABLE ZOX
+A29D		YI SYLLABLE ZO
+A29E		YI SYLLABLE ZOP
+A29F		YI SYLLABLE ZEX
+A2A0		YI SYLLABLE ZE
+A2A1		YI SYLLABLE ZEP
+A2A2		YI SYLLABLE ZUT
+A2A3		YI SYLLABLE ZUX
+A2A4		YI SYLLABLE ZU
+A2A5		YI SYLLABLE ZUP
+A2A6		YI SYLLABLE ZURX
+A2A7		YI SYLLABLE ZUR
+A2A8		YI SYLLABLE ZYT
+A2A9		YI SYLLABLE ZYX
+A2AA		YI SYLLABLE ZY
+A2AB		YI SYLLABLE ZYP
+A2AC		YI SYLLABLE ZYRX
+A2AD		YI SYLLABLE ZYR
+A2AE		YI SYLLABLE CIT
+A2AF		YI SYLLABLE CIX
+A2B0		YI SYLLABLE CI
+A2B1		YI SYLLABLE CIP
+A2B2		YI SYLLABLE CIET
+A2B3		YI SYLLABLE CIEX
+A2B4		YI SYLLABLE CIE
+A2B5		YI SYLLABLE CIEP
+A2B6		YI SYLLABLE CAT
+A2B7		YI SYLLABLE CAX
+A2B8		YI SYLLABLE CA
+A2B9		YI SYLLABLE CAP
+A2BA		YI SYLLABLE CUOX
+A2BB		YI SYLLABLE CUO
+A2BC		YI SYLLABLE CUOP
+A2BD		YI SYLLABLE COT
+A2BE		YI SYLLABLE COX
+A2BF		YI SYLLABLE CO
+A2C0		YI SYLLABLE COP
+A2C1		YI SYLLABLE CEX
+A2C2		YI SYLLABLE CE
+A2C3		YI SYLLABLE CEP
+A2C4		YI SYLLABLE CUT
+A2C5		YI SYLLABLE CUX
+A2C6		YI SYLLABLE CU
+A2C7		YI SYLLABLE CUP
+A2C8		YI SYLLABLE CURX
+A2C9		YI SYLLABLE CUR
+A2CA		YI SYLLABLE CYT
+A2CB		YI SYLLABLE CYX
+A2CC		YI SYLLABLE CY
+A2CD		YI SYLLABLE CYP
+A2CE		YI SYLLABLE CYRX
+A2CF		YI SYLLABLE CYR
+A2D0		YI SYLLABLE ZZIT
+A2D1		YI SYLLABLE ZZIX
+A2D2		YI SYLLABLE ZZI
+A2D3		YI SYLLABLE ZZIP
+A2D4		YI SYLLABLE ZZIET
+A2D5		YI SYLLABLE ZZIEX
+A2D6		YI SYLLABLE ZZIE
+A2D7		YI SYLLABLE ZZIEP
+A2D8		YI SYLLABLE ZZAT
+A2D9		YI SYLLABLE ZZAX
+A2DA		YI SYLLABLE ZZA
+A2DB		YI SYLLABLE ZZAP
+A2DC		YI SYLLABLE ZZOX
+A2DD		YI SYLLABLE ZZO
+A2DE		YI SYLLABLE ZZOP
+A2DF		YI SYLLABLE ZZEX
+A2E0		YI SYLLABLE ZZE
+A2E1		YI SYLLABLE ZZEP
+A2E2		YI SYLLABLE ZZUX
+A2E3		YI SYLLABLE ZZU
+A2E4		YI SYLLABLE ZZUP
+A2E5		YI SYLLABLE ZZURX
+A2E6		YI SYLLABLE ZZUR
+A2E7		YI SYLLABLE ZZYT
+A2E8		YI SYLLABLE ZZYX
+A2E9		YI SYLLABLE ZZY
+A2EA		YI SYLLABLE ZZYP
+A2EB		YI SYLLABLE ZZYRX
+A2EC		YI SYLLABLE ZZYR
+A2ED		YI SYLLABLE NZIT
+A2EE		YI SYLLABLE NZIX
+A2EF		YI SYLLABLE NZI
+A2F0		YI SYLLABLE NZIP
+A2F1		YI SYLLABLE NZIEX
+A2F2		YI SYLLABLE NZIE
+A2F3		YI SYLLABLE NZIEP
+A2F4		YI SYLLABLE NZAT
+A2F5		YI SYLLABLE NZAX
+A2F6		YI SYLLABLE NZA
+A2F7		YI SYLLABLE NZAP
+A2F8		YI SYLLABLE NZUOX
+A2F9		YI SYLLABLE NZUO
+A2FA		YI SYLLABLE NZOX
+A2FB		YI SYLLABLE NZOP
+A2FC		YI SYLLABLE NZEX
+A2FD		YI SYLLABLE NZE
+A2FE		YI SYLLABLE NZUX
+A2FF		YI SYLLABLE NZU
+A300		YI SYLLABLE NZUP
+A301		YI SYLLABLE NZURX
+A302		YI SYLLABLE NZUR
+A303		YI SYLLABLE NZYT
+A304		YI SYLLABLE NZYX
+A305		YI SYLLABLE NZY
+A306		YI SYLLABLE NZYP
+A307		YI SYLLABLE NZYRX
+A308		YI SYLLABLE NZYR
+A309		YI SYLLABLE SIT
+A30A		YI SYLLABLE SIX
+A30B		YI SYLLABLE SI
+A30C		YI SYLLABLE SIP
+A30D		YI SYLLABLE SIEX
+A30E		YI SYLLABLE SIE
+A30F		YI SYLLABLE SIEP
+A310		YI SYLLABLE SAT
+A311		YI SYLLABLE SAX
+A312		YI SYLLABLE SA
+A313		YI SYLLABLE SAP
+A314		YI SYLLABLE SUOX
+A315		YI SYLLABLE SUO
+A316		YI SYLLABLE SUOP
+A317		YI SYLLABLE SOT
+A318		YI SYLLABLE SOX
+A319		YI SYLLABLE SO
+A31A		YI SYLLABLE SOP
+A31B		YI SYLLABLE SEX
+A31C		YI SYLLABLE SE
+A31D		YI SYLLABLE SEP
+A31E		YI SYLLABLE SUT
+A31F		YI SYLLABLE SUX
+A320		YI SYLLABLE SU
+A321		YI SYLLABLE SUP
+A322		YI SYLLABLE SURX
+A323		YI SYLLABLE SUR
+A324		YI SYLLABLE SYT
+A325		YI SYLLABLE SYX
+A326		YI SYLLABLE SY
+A327		YI SYLLABLE SYP
+A328		YI SYLLABLE SYRX
+A329		YI SYLLABLE SYR
+A32A		YI SYLLABLE SSIT
+A32B		YI SYLLABLE SSIX
+A32C		YI SYLLABLE SSI
+A32D		YI SYLLABLE SSIP
+A32E		YI SYLLABLE SSIEX
+A32F		YI SYLLABLE SSIE
+A330		YI SYLLABLE SSIEP
+A331		YI SYLLABLE SSAT
+A332		YI SYLLABLE SSAX
+A333		YI SYLLABLE SSA
+A334		YI SYLLABLE SSAP
+A335		YI SYLLABLE SSOT
+A336		YI SYLLABLE SSOX
+A337		YI SYLLABLE SSO
+A338		YI SYLLABLE SSOP
+A339		YI SYLLABLE SSEX
+A33A		YI SYLLABLE SSE
+A33B		YI SYLLABLE SSEP
+A33C		YI SYLLABLE SSUT
+A33D		YI SYLLABLE SSUX
+A33E		YI SYLLABLE SSU
+A33F		YI SYLLABLE SSUP
+A340		YI SYLLABLE SSYT
+A341		YI SYLLABLE SSYX
+A342		YI SYLLABLE SSY
+A343		YI SYLLABLE SSYP
+A344		YI SYLLABLE SSYRX
+A345		YI SYLLABLE SSYR
+A346		YI SYLLABLE ZHAT
+A347		YI SYLLABLE ZHAX
+A348		YI SYLLABLE ZHA
+A349		YI SYLLABLE ZHAP
+A34A		YI SYLLABLE ZHUOX
+A34B		YI SYLLABLE ZHUO
+A34C		YI SYLLABLE ZHUOP
+A34D		YI SYLLABLE ZHOT
+A34E		YI SYLLABLE ZHOX
+A34F		YI SYLLABLE ZHO
+A350		YI SYLLABLE ZHOP
+A351		YI SYLLABLE ZHET
+A352		YI SYLLABLE ZHEX
+A353		YI SYLLABLE ZHE
+A354		YI SYLLABLE ZHEP
+A355		YI SYLLABLE ZHUT
+A356		YI SYLLABLE ZHUX
+A357		YI SYLLABLE ZHU
+A358		YI SYLLABLE ZHUP
+A359		YI SYLLABLE ZHURX
+A35A		YI SYLLABLE ZHUR
+A35B		YI SYLLABLE ZHYT
+A35C		YI SYLLABLE ZHYX
+A35D		YI SYLLABLE ZHY
+A35E		YI SYLLABLE ZHYP
+A35F		YI SYLLABLE ZHYRX
+A360		YI SYLLABLE ZHYR
+A361		YI SYLLABLE CHAT
+A362		YI SYLLABLE CHAX
+A363		YI SYLLABLE CHA
+A364		YI SYLLABLE CHAP
+A365		YI SYLLABLE CHUOT
+A366		YI SYLLABLE CHUOX
+A367		YI SYLLABLE CHUO
+A368		YI SYLLABLE CHUOP
+A369		YI SYLLABLE CHOT
+A36A		YI SYLLABLE CHOX
+A36B		YI SYLLABLE CHO
+A36C		YI SYLLABLE CHOP
+A36D		YI SYLLABLE CHET
+A36E		YI SYLLABLE CHEX
+A36F		YI SYLLABLE CHE
+A370		YI SYLLABLE CHEP
+A371		YI SYLLABLE CHUX
+A372		YI SYLLABLE CHU
+A373		YI SYLLABLE CHUP
+A374		YI SYLLABLE CHURX
+A375		YI SYLLABLE CHUR
+A376		YI SYLLABLE CHYT
+A377		YI SYLLABLE CHYX
+A378		YI SYLLABLE CHY
+A379		YI SYLLABLE CHYP
+A37A		YI SYLLABLE CHYRX
+A37B		YI SYLLABLE CHYR
+A37C		YI SYLLABLE RRAX
+A37D		YI SYLLABLE RRA
+A37E		YI SYLLABLE RRUOX
+A37F		YI SYLLABLE RRUO
+A380		YI SYLLABLE RROT
+A381		YI SYLLABLE RROX
+A382		YI SYLLABLE RRO
+A383		YI SYLLABLE RROP
+A384		YI SYLLABLE RRET
+A385		YI SYLLABLE RREX
+A386		YI SYLLABLE RRE
+A387		YI SYLLABLE RREP
+A388		YI SYLLABLE RRUT
+A389		YI SYLLABLE RRUX
+A38A		YI SYLLABLE RRU
+A38B		YI SYLLABLE RRUP
+A38C		YI SYLLABLE RRURX
+A38D		YI SYLLABLE RRUR
+A38E		YI SYLLABLE RRYT
+A38F		YI SYLLABLE RRYX
+A390		YI SYLLABLE RRY
+A391		YI SYLLABLE RRYP
+A392		YI SYLLABLE RRYRX
+A393		YI SYLLABLE RRYR
+A394		YI SYLLABLE NRAT
+A395		YI SYLLABLE NRAX
+A396		YI SYLLABLE NRA
+A397		YI SYLLABLE NRAP
+A398		YI SYLLABLE NROX
+A399		YI SYLLABLE NRO
+A39A		YI SYLLABLE NROP
+A39B		YI SYLLABLE NRET
+A39C		YI SYLLABLE NREX
+A39D		YI SYLLABLE NRE
+A39E		YI SYLLABLE NREP
+A39F		YI SYLLABLE NRUT
+A3A0		YI SYLLABLE NRUX
+A3A1		YI SYLLABLE NRU
+A3A2		YI SYLLABLE NRUP
+A3A3		YI SYLLABLE NRURX
+A3A4		YI SYLLABLE NRUR
+A3A5		YI SYLLABLE NRYT
+A3A6		YI SYLLABLE NRYX
+A3A7		YI SYLLABLE NRY
+A3A8		YI SYLLABLE NRYP
+A3A9		YI SYLLABLE NRYRX
+A3AA		YI SYLLABLE NRYR
+A3AB		YI SYLLABLE SHAT
+A3AC		YI SYLLABLE SHAX
+A3AD		YI SYLLABLE SHA
+A3AE		YI SYLLABLE SHAP
+A3AF		YI SYLLABLE SHUOX
+A3B0		YI SYLLABLE SHUO
+A3B1		YI SYLLABLE SHUOP
+A3B2		YI SYLLABLE SHOT
+A3B3		YI SYLLABLE SHOX
+A3B4		YI SYLLABLE SHO
+A3B5		YI SYLLABLE SHOP
+A3B6		YI SYLLABLE SHET
+A3B7		YI SYLLABLE SHEX
+A3B8		YI SYLLABLE SHE
+A3B9		YI SYLLABLE SHEP
+A3BA		YI SYLLABLE SHUT
+A3BB		YI SYLLABLE SHUX
+A3BC		YI SYLLABLE SHU
+A3BD		YI SYLLABLE SHUP
+A3BE		YI SYLLABLE SHURX
+A3BF		YI SYLLABLE SHUR
+A3C0		YI SYLLABLE SHYT
+A3C1		YI SYLLABLE SHYX
+A3C2		YI SYLLABLE SHY
+A3C3		YI SYLLABLE SHYP
+A3C4		YI SYLLABLE SHYRX
+A3C5		YI SYLLABLE SHYR
+A3C6		YI SYLLABLE RAT
+A3C7		YI SYLLABLE RAX
+A3C8		YI SYLLABLE RA
+A3C9		YI SYLLABLE RAP
+A3CA		YI SYLLABLE RUOX
+A3CB		YI SYLLABLE RUO
+A3CC		YI SYLLABLE RUOP
+A3CD		YI SYLLABLE ROT
+A3CE		YI SYLLABLE ROX
+A3CF		YI SYLLABLE RO
+A3D0		YI SYLLABLE ROP
+A3D1		YI SYLLABLE REX
+A3D2		YI SYLLABLE RE
+A3D3		YI SYLLABLE REP
+A3D4		YI SYLLABLE RUT
+A3D5		YI SYLLABLE RUX
+A3D6		YI SYLLABLE RU
+A3D7		YI SYLLABLE RUP
+A3D8		YI SYLLABLE RURX
+A3D9		YI SYLLABLE RUR
+A3DA		YI SYLLABLE RYT
+A3DB		YI SYLLABLE RYX
+A3DC		YI SYLLABLE RY
+A3DD		YI SYLLABLE RYP
+A3DE		YI SYLLABLE RYRX
+A3DF		YI SYLLABLE RYR
+A3E0		YI SYLLABLE JIT
+A3E1		YI SYLLABLE JIX
+A3E2		YI SYLLABLE JI
+A3E3		YI SYLLABLE JIP
+A3E4		YI SYLLABLE JIET
+A3E5		YI SYLLABLE JIEX
+A3E6		YI SYLLABLE JIE
+A3E7		YI SYLLABLE JIEP
+A3E8		YI SYLLABLE JUOT
+A3E9		YI SYLLABLE JUOX
+A3EA		YI SYLLABLE JUO
+A3EB		YI SYLLABLE JUOP
+A3EC		YI SYLLABLE JOT
+A3ED		YI SYLLABLE JOX
+A3EE		YI SYLLABLE JO
+A3EF		YI SYLLABLE JOP
+A3F0		YI SYLLABLE JUT
+A3F1		YI SYLLABLE JUX
+A3F2		YI SYLLABLE JU
+A3F3		YI SYLLABLE JUP
+A3F4		YI SYLLABLE JURX
+A3F5		YI SYLLABLE JUR
+A3F6		YI SYLLABLE JYT
+A3F7		YI SYLLABLE JYX
+A3F8		YI SYLLABLE JY
+A3F9		YI SYLLABLE JYP
+A3FA		YI SYLLABLE JYRX
+A3FB		YI SYLLABLE JYR
+A3FC		YI SYLLABLE QIT
+A3FD		YI SYLLABLE QIX
+A3FE		YI SYLLABLE QI
+A3FF		YI SYLLABLE QIP
+A400		YI SYLLABLE QIET
+A401		YI SYLLABLE QIEX
+A402		YI SYLLABLE QIE
+A403		YI SYLLABLE QIEP
+A404		YI SYLLABLE QUOT
+A405		YI SYLLABLE QUOX
+A406		YI SYLLABLE QUO
+A407		YI SYLLABLE QUOP
+A408		YI SYLLABLE QOT
+A409		YI SYLLABLE QOX
+A40A		YI SYLLABLE QO
+A40B		YI SYLLABLE QOP
+A40C		YI SYLLABLE QUT
+A40D		YI SYLLABLE QUX
+A40E		YI SYLLABLE QU
+A40F		YI SYLLABLE QUP
+A410		YI SYLLABLE QURX
+A411		YI SYLLABLE QUR
+A412		YI SYLLABLE QYT
+A413		YI SYLLABLE QYX
+A414		YI SYLLABLE QY
+A415		YI SYLLABLE QYP
+A416		YI SYLLABLE QYRX
+A417		YI SYLLABLE QYR
+A418		YI SYLLABLE JJIT
+A419		YI SYLLABLE JJIX
+A41A		YI SYLLABLE JJI
+A41B		YI SYLLABLE JJIP
+A41C		YI SYLLABLE JJIET
+A41D		YI SYLLABLE JJIEX
+A41E		YI SYLLABLE JJIE
+A41F		YI SYLLABLE JJIEP
+A420		YI SYLLABLE JJUOX
+A421		YI SYLLABLE JJUO
+A422		YI SYLLABLE JJUOP
+A423		YI SYLLABLE JJOT
+A424		YI SYLLABLE JJOX
+A425		YI SYLLABLE JJO
+A426		YI SYLLABLE JJOP
+A427		YI SYLLABLE JJUT
+A428		YI SYLLABLE JJUX
+A429		YI SYLLABLE JJU
+A42A		YI SYLLABLE JJUP
+A42B		YI SYLLABLE JJURX
+A42C		YI SYLLABLE JJUR
+A42D		YI SYLLABLE JJYT
+A42E		YI SYLLABLE JJYX
+A42F		YI SYLLABLE JJY
+A430		YI SYLLABLE JJYP
+A431		YI SYLLABLE NJIT
+A432		YI SYLLABLE NJIX
+A433		YI SYLLABLE NJI
+A434		YI SYLLABLE NJIP
+A435		YI SYLLABLE NJIET
+A436		YI SYLLABLE NJIEX
+A437		YI SYLLABLE NJIE
+A438		YI SYLLABLE NJIEP
+A439		YI SYLLABLE NJUOX
+A43A		YI SYLLABLE NJUO
+A43B		YI SYLLABLE NJOT
+A43C		YI SYLLABLE NJOX
+A43D		YI SYLLABLE NJO
+A43E		YI SYLLABLE NJOP
+A43F		YI SYLLABLE NJUX
+A440		YI SYLLABLE NJU
+A441		YI SYLLABLE NJUP
+A442		YI SYLLABLE NJURX
+A443		YI SYLLABLE NJUR
+A444		YI SYLLABLE NJYT
+A445		YI SYLLABLE NJYX
+A446		YI SYLLABLE NJY
+A447		YI SYLLABLE NJYP
+A448		YI SYLLABLE NJYRX
+A449		YI SYLLABLE NJYR
+A44A		YI SYLLABLE NYIT
+A44B		YI SYLLABLE NYIX
+A44C		YI SYLLABLE NYI
+A44D		YI SYLLABLE NYIP
+A44E		YI SYLLABLE NYIET
+A44F		YI SYLLABLE NYIEX
+A450		YI SYLLABLE NYIE
+A451		YI SYLLABLE NYIEP
+A452		YI SYLLABLE NYUOX
+A453		YI SYLLABLE NYUO
+A454		YI SYLLABLE NYUOP
+A455		YI SYLLABLE NYOT
+A456		YI SYLLABLE NYOX
+A457		YI SYLLABLE NYO
+A458		YI SYLLABLE NYOP
+A459		YI SYLLABLE NYUT
+A45A		YI SYLLABLE NYUX
+A45B		YI SYLLABLE NYU
+A45C		YI SYLLABLE NYUP
+A45D		YI SYLLABLE XIT
+A45E		YI SYLLABLE XIX
+A45F		YI SYLLABLE XI
+A460		YI SYLLABLE XIP
+A461		YI SYLLABLE XIET
+A462		YI SYLLABLE XIEX
+A463		YI SYLLABLE XIE
+A464		YI SYLLABLE XIEP
+A465		YI SYLLABLE XUOX
+A466		YI SYLLABLE XUO
+A467		YI SYLLABLE XOT
+A468		YI SYLLABLE XOX
+A469		YI SYLLABLE XO
+A46A		YI SYLLABLE XOP
+A46B		YI SYLLABLE XYT
+A46C		YI SYLLABLE XYX
+A46D		YI SYLLABLE XY
+A46E		YI SYLLABLE XYP
+A46F		YI SYLLABLE XYRX
+A470		YI SYLLABLE XYR
+A471		YI SYLLABLE YIT
+A472		YI SYLLABLE YIX
+A473		YI SYLLABLE YI
+A474		YI SYLLABLE YIP
+A475		YI SYLLABLE YIET
+A476		YI SYLLABLE YIEX
+A477		YI SYLLABLE YIE
+A478		YI SYLLABLE YIEP
+A479		YI SYLLABLE YUOT
+A47A		YI SYLLABLE YUOX
+A47B		YI SYLLABLE YUO
+A47C		YI SYLLABLE YUOP
+A47D		YI SYLLABLE YOT
+A47E		YI SYLLABLE YOX
+A47F		YI SYLLABLE YO
+A480		YI SYLLABLE YOP
+A481		YI SYLLABLE YUT
+A482		YI SYLLABLE YUX
+A483		YI SYLLABLE YU
+A484		YI SYLLABLE YUP
+A485		YI SYLLABLE YURX
+A486		YI SYLLABLE YUR
+A487		YI SYLLABLE YYT
+A488		YI SYLLABLE YYX
+A489		YI SYLLABLE YY
+A48A		YI SYLLABLE YYP
+A48B		YI SYLLABLE YYRX
+A48C		YI SYLLABLE YYR
+A490		YI RADICAL QOT
+A491		YI RADICAL LI
+A492		YI RADICAL KIT
+A493		YI RADICAL NYIP
+A494		YI RADICAL CYP
+A495		YI RADICAL SSI
+A496		YI RADICAL GGOP
+A497		YI RADICAL GEP
+A498		YI RADICAL MI
+A499		YI RADICAL HXIT
+A49A		YI RADICAL LYR
+A49B		YI RADICAL BBUT
+A49C		YI RADICAL MOP
+A49D		YI RADICAL YO
+A49E		YI RADICAL PUT
+A49F		YI RADICAL HXUO
+A4A0		YI RADICAL TAT
+A4A1		YI RADICAL GA
+A4A2		YI RADICAL ZUP
+A4A3		YI RADICAL CYT
+A4A4		YI RADICAL DDUR
+A4A5		YI RADICAL BUR
+A4A6		YI RADICAL GGUO
+A4A7		YI RADICAL NYOP
+A4A8		YI RADICAL TU
+A4A9		YI RADICAL OP
+A4AA		YI RADICAL JJUT
+A4AB		YI RADICAL ZOT
+A4AC		YI RADICAL PYT
+A4AD		YI RADICAL HMO
+A4AE		YI RADICAL YIT
+A4AF		YI RADICAL VUR
+A4B0		YI RADICAL SHY
+A4B1		YI RADICAL VEP
+A4B2		YI RADICAL ZA
+A4B3		YI RADICAL JO
+A4B4		YI RADICAL NZUP
+A4B5		YI RADICAL JJY
+A4B6		YI RADICAL GOT
+A4B7		YI RADICAL JJIE
+A4B8		YI RADICAL WO
+A4B9		YI RADICAL DU
+A4BA		YI RADICAL SHUR
+A4BB		YI RADICAL LIE
+A4BC		YI RADICAL CY
+A4BD		YI RADICAL CUOP
+A4BE		YI RADICAL CIP
+A4BF		YI RADICAL HXOP
+A4C0		YI RADICAL SHAT
+A4C1		YI RADICAL ZUR
+A4C2		YI RADICAL SHOP
+A4C3		YI RADICAL CHE
+A4C4		YI RADICAL ZZIET
+A4C5		YI RADICAL NBIE
+A4C6		YI RADICAL KE
+A700		MODIFIER LETTER CHINESE TONE YIN PING
+A701		MODIFIER LETTER CHINESE TONE YANG PING
+A702		MODIFIER LETTER CHINESE TONE YIN SHANG
+A703		MODIFIER LETTER CHINESE TONE YANG SHANG
+A704		MODIFIER LETTER CHINESE TONE YIN QU
+A705		MODIFIER LETTER CHINESE TONE YANG QU
+A706		MODIFIER LETTER CHINESE TONE YIN RU
+A707		MODIFIER LETTER CHINESE TONE YANG RU
+A708		MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709		MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A		MODIFIER LETTER MID DOTTED TONE BAR
+A70B		MODIFIER LETTER LOW DOTTED TONE BAR
+A70C		MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D		MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E		MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F		MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710		MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711		MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+A712		MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713		MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714		MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715		MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716		MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A800		SYLOTI NAGRI LETTER A
+A801		SYLOTI NAGRI LETTER I
+A802		SYLOTI NAGRI SIGN DVISVARA
+A803		SYLOTI NAGRI LETTER U
+A804		SYLOTI NAGRI LETTER E
+A805		SYLOTI NAGRI LETTER O
+A806		SYLOTI NAGRI SIGN HASANTA
+A807		SYLOTI NAGRI LETTER KO
+A808		SYLOTI NAGRI LETTER KHO
+A809		SYLOTI NAGRI LETTER GO
+A80A		SYLOTI NAGRI LETTER GHO
+A80B		SYLOTI NAGRI SIGN ANUSVARA
+A80C		SYLOTI NAGRI LETTER CO
+A80D		SYLOTI NAGRI LETTER CHO
+A80E		SYLOTI NAGRI LETTER JO
+A80F		SYLOTI NAGRI LETTER JHO
+A810		SYLOTI NAGRI LETTER TTO
+A811		SYLOTI NAGRI LETTER TTHO
+A812		SYLOTI NAGRI LETTER DDO
+A813		SYLOTI NAGRI LETTER DDHO
+A814		SYLOTI NAGRI LETTER TO
+A815		SYLOTI NAGRI LETTER THO
+A816		SYLOTI NAGRI LETTER DO
+A817		SYLOTI NAGRI LETTER DHO
+A818		SYLOTI NAGRI LETTER NO
+A819		SYLOTI NAGRI LETTER PO
+A81A		SYLOTI NAGRI LETTER PHO
+A81B		SYLOTI NAGRI LETTER BO
+A81C		SYLOTI NAGRI LETTER BHO
+A81D		SYLOTI NAGRI LETTER MO
+A81E		SYLOTI NAGRI LETTER RO
+A81F		SYLOTI NAGRI LETTER LO
+A820		SYLOTI NAGRI LETTER RRO
+A821		SYLOTI NAGRI LETTER SO
+A822		SYLOTI NAGRI LETTER HO
+A823		SYLOTI NAGRI VOWEL SIGN A
+A824		SYLOTI NAGRI VOWEL SIGN I
+A825		SYLOTI NAGRI VOWEL SIGN U
+A826		SYLOTI NAGRI VOWEL SIGN E
+A827		SYLOTI NAGRI VOWEL SIGN OO
+A828		SYLOTI NAGRI POETRY MARK-1
+A829		SYLOTI NAGRI POETRY MARK-2
+A82A		SYLOTI NAGRI POETRY MARK-3
+A82B		SYLOTI NAGRI POETRY MARK-4
+AC00	D7A3	Hangul Syllable
+D800	DB7F	Non Private Use High Surrogate
+DB80	DBFF	Private Use High Surrogate
+DC00	DFFF	Low Surrogate
+E000	F8FF	Private Use
+F900		CJK COMPATIBILITY IDEOGRAPH-F900
+F901		CJK COMPATIBILITY IDEOGRAPH-F901
+F902		CJK COMPATIBILITY IDEOGRAPH-F902
+F903		CJK COMPATIBILITY IDEOGRAPH-F903
+F904		CJK COMPATIBILITY IDEOGRAPH-F904
+F905		CJK COMPATIBILITY IDEOGRAPH-F905
+F906		CJK COMPATIBILITY IDEOGRAPH-F906
+F907		CJK COMPATIBILITY IDEOGRAPH-F907
+F908		CJK COMPATIBILITY IDEOGRAPH-F908
+F909		CJK COMPATIBILITY IDEOGRAPH-F909
+F90A		CJK COMPATIBILITY IDEOGRAPH-F90A
+F90B		CJK COMPATIBILITY IDEOGRAPH-F90B
+F90C		CJK COMPATIBILITY IDEOGRAPH-F90C
+F90D		CJK COMPATIBILITY IDEOGRAPH-F90D
+F90E		CJK COMPATIBILITY IDEOGRAPH-F90E
+F90F		CJK COMPATIBILITY IDEOGRAPH-F90F
+F910		CJK COMPATIBILITY IDEOGRAPH-F910
+F911		CJK COMPATIBILITY IDEOGRAPH-F911
+F912		CJK COMPATIBILITY IDEOGRAPH-F912
+F913		CJK COMPATIBILITY IDEOGRAPH-F913
+F914		CJK COMPATIBILITY IDEOGRAPH-F914
+F915		CJK COMPATIBILITY IDEOGRAPH-F915
+F916		CJK COMPATIBILITY IDEOGRAPH-F916
+F917		CJK COMPATIBILITY IDEOGRAPH-F917
+F918		CJK COMPATIBILITY IDEOGRAPH-F918
+F919		CJK COMPATIBILITY IDEOGRAPH-F919
+F91A		CJK COMPATIBILITY IDEOGRAPH-F91A
+F91B		CJK COMPATIBILITY IDEOGRAPH-F91B
+F91C		CJK COMPATIBILITY IDEOGRAPH-F91C
+F91D		CJK COMPATIBILITY IDEOGRAPH-F91D
+F91E		CJK COMPATIBILITY IDEOGRAPH-F91E
+F91F		CJK COMPATIBILITY IDEOGRAPH-F91F
+F920		CJK COMPATIBILITY IDEOGRAPH-F920
+F921		CJK COMPATIBILITY IDEOGRAPH-F921
+F922		CJK COMPATIBILITY IDEOGRAPH-F922
+F923		CJK COMPATIBILITY IDEOGRAPH-F923
+F924		CJK COMPATIBILITY IDEOGRAPH-F924
+F925		CJK COMPATIBILITY IDEOGRAPH-F925
+F926		CJK COMPATIBILITY IDEOGRAPH-F926
+F927		CJK COMPATIBILITY IDEOGRAPH-F927
+F928		CJK COMPATIBILITY IDEOGRAPH-F928
+F929		CJK COMPATIBILITY IDEOGRAPH-F929
+F92A		CJK COMPATIBILITY IDEOGRAPH-F92A
+F92B		CJK COMPATIBILITY IDEOGRAPH-F92B
+F92C		CJK COMPATIBILITY IDEOGRAPH-F92C
+F92D		CJK COMPATIBILITY IDEOGRAPH-F92D
+F92E		CJK COMPATIBILITY IDEOGRAPH-F92E
+F92F		CJK COMPATIBILITY IDEOGRAPH-F92F
+F930		CJK COMPATIBILITY IDEOGRAPH-F930
+F931		CJK COMPATIBILITY IDEOGRAPH-F931
+F932		CJK COMPATIBILITY IDEOGRAPH-F932
+F933		CJK COMPATIBILITY IDEOGRAPH-F933
+F934		CJK COMPATIBILITY IDEOGRAPH-F934
+F935		CJK COMPATIBILITY IDEOGRAPH-F935
+F936		CJK COMPATIBILITY IDEOGRAPH-F936
+F937		CJK COMPATIBILITY IDEOGRAPH-F937
+F938		CJK COMPATIBILITY IDEOGRAPH-F938
+F939		CJK COMPATIBILITY IDEOGRAPH-F939
+F93A		CJK COMPATIBILITY IDEOGRAPH-F93A
+F93B		CJK COMPATIBILITY IDEOGRAPH-F93B
+F93C		CJK COMPATIBILITY IDEOGRAPH-F93C
+F93D		CJK COMPATIBILITY IDEOGRAPH-F93D
+F93E		CJK COMPATIBILITY IDEOGRAPH-F93E
+F93F		CJK COMPATIBILITY IDEOGRAPH-F93F
+F940		CJK COMPATIBILITY IDEOGRAPH-F940
+F941		CJK COMPATIBILITY IDEOGRAPH-F941
+F942		CJK COMPATIBILITY IDEOGRAPH-F942
+F943		CJK COMPATIBILITY IDEOGRAPH-F943
+F944		CJK COMPATIBILITY IDEOGRAPH-F944
+F945		CJK COMPATIBILITY IDEOGRAPH-F945
+F946		CJK COMPATIBILITY IDEOGRAPH-F946
+F947		CJK COMPATIBILITY IDEOGRAPH-F947
+F948		CJK COMPATIBILITY IDEOGRAPH-F948
+F949		CJK COMPATIBILITY IDEOGRAPH-F949
+F94A		CJK COMPATIBILITY IDEOGRAPH-F94A
+F94B		CJK COMPATIBILITY IDEOGRAPH-F94B
+F94C		CJK COMPATIBILITY IDEOGRAPH-F94C
+F94D		CJK COMPATIBILITY IDEOGRAPH-F94D
+F94E		CJK COMPATIBILITY IDEOGRAPH-F94E
+F94F		CJK COMPATIBILITY IDEOGRAPH-F94F
+F950		CJK COMPATIBILITY IDEOGRAPH-F950
+F951		CJK COMPATIBILITY IDEOGRAPH-F951
+F952		CJK COMPATIBILITY IDEOGRAPH-F952
+F953		CJK COMPATIBILITY IDEOGRAPH-F953
+F954		CJK COMPATIBILITY IDEOGRAPH-F954
+F955		CJK COMPATIBILITY IDEOGRAPH-F955
+F956		CJK COMPATIBILITY IDEOGRAPH-F956
+F957		CJK COMPATIBILITY IDEOGRAPH-F957
+F958		CJK COMPATIBILITY IDEOGRAPH-F958
+F959		CJK COMPATIBILITY IDEOGRAPH-F959
+F95A		CJK COMPATIBILITY IDEOGRAPH-F95A
+F95B		CJK COMPATIBILITY IDEOGRAPH-F95B
+F95C		CJK COMPATIBILITY IDEOGRAPH-F95C
+F95D		CJK COMPATIBILITY IDEOGRAPH-F95D
+F95E		CJK COMPATIBILITY IDEOGRAPH-F95E
+F95F		CJK COMPATIBILITY IDEOGRAPH-F95F
+F960		CJK COMPATIBILITY IDEOGRAPH-F960
+F961		CJK COMPATIBILITY IDEOGRAPH-F961
+F962		CJK COMPATIBILITY IDEOGRAPH-F962
+F963		CJK COMPATIBILITY IDEOGRAPH-F963
+F964		CJK COMPATIBILITY IDEOGRAPH-F964
+F965		CJK COMPATIBILITY IDEOGRAPH-F965
+F966		CJK COMPATIBILITY IDEOGRAPH-F966
+F967		CJK COMPATIBILITY IDEOGRAPH-F967
+F968		CJK COMPATIBILITY IDEOGRAPH-F968
+F969		CJK COMPATIBILITY IDEOGRAPH-F969
+F96A		CJK COMPATIBILITY IDEOGRAPH-F96A
+F96B		CJK COMPATIBILITY IDEOGRAPH-F96B
+F96C		CJK COMPATIBILITY IDEOGRAPH-F96C
+F96D		CJK COMPATIBILITY IDEOGRAPH-F96D
+F96E		CJK COMPATIBILITY IDEOGRAPH-F96E
+F96F		CJK COMPATIBILITY IDEOGRAPH-F96F
+F970		CJK COMPATIBILITY IDEOGRAPH-F970
+F971		CJK COMPATIBILITY IDEOGRAPH-F971
+F972		CJK COMPATIBILITY IDEOGRAPH-F972
+F973		CJK COMPATIBILITY IDEOGRAPH-F973
+F974		CJK COMPATIBILITY IDEOGRAPH-F974
+F975		CJK COMPATIBILITY IDEOGRAPH-F975
+F976		CJK COMPATIBILITY IDEOGRAPH-F976
+F977		CJK COMPATIBILITY IDEOGRAPH-F977
+F978		CJK COMPATIBILITY IDEOGRAPH-F978
+F979		CJK COMPATIBILITY IDEOGRAPH-F979
+F97A		CJK COMPATIBILITY IDEOGRAPH-F97A
+F97B		CJK COMPATIBILITY IDEOGRAPH-F97B
+F97C		CJK COMPATIBILITY IDEOGRAPH-F97C
+F97D		CJK COMPATIBILITY IDEOGRAPH-F97D
+F97E		CJK COMPATIBILITY IDEOGRAPH-F97E
+F97F		CJK COMPATIBILITY IDEOGRAPH-F97F
+F980		CJK COMPATIBILITY IDEOGRAPH-F980
+F981		CJK COMPATIBILITY IDEOGRAPH-F981
+F982		CJK COMPATIBILITY IDEOGRAPH-F982
+F983		CJK COMPATIBILITY IDEOGRAPH-F983
+F984		CJK COMPATIBILITY IDEOGRAPH-F984
+F985		CJK COMPATIBILITY IDEOGRAPH-F985
+F986		CJK COMPATIBILITY IDEOGRAPH-F986
+F987		CJK COMPATIBILITY IDEOGRAPH-F987
+F988		CJK COMPATIBILITY IDEOGRAPH-F988
+F989		CJK COMPATIBILITY IDEOGRAPH-F989
+F98A		CJK COMPATIBILITY IDEOGRAPH-F98A
+F98B		CJK COMPATIBILITY IDEOGRAPH-F98B
+F98C		CJK COMPATIBILITY IDEOGRAPH-F98C
+F98D		CJK COMPATIBILITY IDEOGRAPH-F98D
+F98E		CJK COMPATIBILITY IDEOGRAPH-F98E
+F98F		CJK COMPATIBILITY IDEOGRAPH-F98F
+F990		CJK COMPATIBILITY IDEOGRAPH-F990
+F991		CJK COMPATIBILITY IDEOGRAPH-F991
+F992		CJK COMPATIBILITY IDEOGRAPH-F992
+F993		CJK COMPATIBILITY IDEOGRAPH-F993
+F994		CJK COMPATIBILITY IDEOGRAPH-F994
+F995		CJK COMPATIBILITY IDEOGRAPH-F995
+F996		CJK COMPATIBILITY IDEOGRAPH-F996
+F997		CJK COMPATIBILITY IDEOGRAPH-F997
+F998		CJK COMPATIBILITY IDEOGRAPH-F998
+F999		CJK COMPATIBILITY IDEOGRAPH-F999
+F99A		CJK COMPATIBILITY IDEOGRAPH-F99A
+F99B		CJK COMPATIBILITY IDEOGRAPH-F99B
+F99C		CJK COMPATIBILITY IDEOGRAPH-F99C
+F99D		CJK COMPATIBILITY IDEOGRAPH-F99D
+F99E		CJK COMPATIBILITY IDEOGRAPH-F99E
+F99F		CJK COMPATIBILITY IDEOGRAPH-F99F
+F9A0		CJK COMPATIBILITY IDEOGRAPH-F9A0
+F9A1		CJK COMPATIBILITY IDEOGRAPH-F9A1
+F9A2		CJK COMPATIBILITY IDEOGRAPH-F9A2
+F9A3		CJK COMPATIBILITY IDEOGRAPH-F9A3
+F9A4		CJK COMPATIBILITY IDEOGRAPH-F9A4
+F9A5		CJK COMPATIBILITY IDEOGRAPH-F9A5
+F9A6		CJK COMPATIBILITY IDEOGRAPH-F9A6
+F9A7		CJK COMPATIBILITY IDEOGRAPH-F9A7
+F9A8		CJK COMPATIBILITY IDEOGRAPH-F9A8
+F9A9		CJK COMPATIBILITY IDEOGRAPH-F9A9
+F9AA		CJK COMPATIBILITY IDEOGRAPH-F9AA
+F9AB		CJK COMPATIBILITY IDEOGRAPH-F9AB
+F9AC		CJK COMPATIBILITY IDEOGRAPH-F9AC
+F9AD		CJK COMPATIBILITY IDEOGRAPH-F9AD
+F9AE		CJK COMPATIBILITY IDEOGRAPH-F9AE
+F9AF		CJK COMPATIBILITY IDEOGRAPH-F9AF
+F9B0		CJK COMPATIBILITY IDEOGRAPH-F9B0
+F9B1		CJK COMPATIBILITY IDEOGRAPH-F9B1
+F9B2		CJK COMPATIBILITY IDEOGRAPH-F9B2
+F9B3		CJK COMPATIBILITY IDEOGRAPH-F9B3
+F9B4		CJK COMPATIBILITY IDEOGRAPH-F9B4
+F9B5		CJK COMPATIBILITY IDEOGRAPH-F9B5
+F9B6		CJK COMPATIBILITY IDEOGRAPH-F9B6
+F9B7		CJK COMPATIBILITY IDEOGRAPH-F9B7
+F9B8		CJK COMPATIBILITY IDEOGRAPH-F9B8
+F9B9		CJK COMPATIBILITY IDEOGRAPH-F9B9
+F9BA		CJK COMPATIBILITY IDEOGRAPH-F9BA
+F9BB		CJK COMPATIBILITY IDEOGRAPH-F9BB
+F9BC		CJK COMPATIBILITY IDEOGRAPH-F9BC
+F9BD		CJK COMPATIBILITY IDEOGRAPH-F9BD
+F9BE		CJK COMPATIBILITY IDEOGRAPH-F9BE
+F9BF		CJK COMPATIBILITY IDEOGRAPH-F9BF
+F9C0		CJK COMPATIBILITY IDEOGRAPH-F9C0
+F9C1		CJK COMPATIBILITY IDEOGRAPH-F9C1
+F9C2		CJK COMPATIBILITY IDEOGRAPH-F9C2
+F9C3		CJK COMPATIBILITY IDEOGRAPH-F9C3
+F9C4		CJK COMPATIBILITY IDEOGRAPH-F9C4
+F9C5		CJK COMPATIBILITY IDEOGRAPH-F9C5
+F9C6		CJK COMPATIBILITY IDEOGRAPH-F9C6
+F9C7		CJK COMPATIBILITY IDEOGRAPH-F9C7
+F9C8		CJK COMPATIBILITY IDEOGRAPH-F9C8
+F9C9		CJK COMPATIBILITY IDEOGRAPH-F9C9
+F9CA		CJK COMPATIBILITY IDEOGRAPH-F9CA
+F9CB		CJK COMPATIBILITY IDEOGRAPH-F9CB
+F9CC		CJK COMPATIBILITY IDEOGRAPH-F9CC
+F9CD		CJK COMPATIBILITY IDEOGRAPH-F9CD
+F9CE		CJK COMPATIBILITY IDEOGRAPH-F9CE
+F9CF		CJK COMPATIBILITY IDEOGRAPH-F9CF
+F9D0		CJK COMPATIBILITY IDEOGRAPH-F9D0
+F9D1		CJK COMPATIBILITY IDEOGRAPH-F9D1
+F9D2		CJK COMPATIBILITY IDEOGRAPH-F9D2
+F9D3		CJK COMPATIBILITY IDEOGRAPH-F9D3
+F9D4		CJK COMPATIBILITY IDEOGRAPH-F9D4
+F9D5		CJK COMPATIBILITY IDEOGRAPH-F9D5
+F9D6		CJK COMPATIBILITY IDEOGRAPH-F9D6
+F9D7		CJK COMPATIBILITY IDEOGRAPH-F9D7
+F9D8		CJK COMPATIBILITY IDEOGRAPH-F9D8
+F9D9		CJK COMPATIBILITY IDEOGRAPH-F9D9
+F9DA		CJK COMPATIBILITY IDEOGRAPH-F9DA
+F9DB		CJK COMPATIBILITY IDEOGRAPH-F9DB
+F9DC		CJK COMPATIBILITY IDEOGRAPH-F9DC
+F9DD		CJK COMPATIBILITY IDEOGRAPH-F9DD
+F9DE		CJK COMPATIBILITY IDEOGRAPH-F9DE
+F9DF		CJK COMPATIBILITY IDEOGRAPH-F9DF
+F9E0		CJK COMPATIBILITY IDEOGRAPH-F9E0
+F9E1		CJK COMPATIBILITY IDEOGRAPH-F9E1
+F9E2		CJK COMPATIBILITY IDEOGRAPH-F9E2
+F9E3		CJK COMPATIBILITY IDEOGRAPH-F9E3
+F9E4		CJK COMPATIBILITY IDEOGRAPH-F9E4
+F9E5		CJK COMPATIBILITY IDEOGRAPH-F9E5
+F9E6		CJK COMPATIBILITY IDEOGRAPH-F9E6
+F9E7		CJK COMPATIBILITY IDEOGRAPH-F9E7
+F9E8		CJK COMPATIBILITY IDEOGRAPH-F9E8
+F9E9		CJK COMPATIBILITY IDEOGRAPH-F9E9
+F9EA		CJK COMPATIBILITY IDEOGRAPH-F9EA
+F9EB		CJK COMPATIBILITY IDEOGRAPH-F9EB
+F9EC		CJK COMPATIBILITY IDEOGRAPH-F9EC
+F9ED		CJK COMPATIBILITY IDEOGRAPH-F9ED
+F9EE		CJK COMPATIBILITY IDEOGRAPH-F9EE
+F9EF		CJK COMPATIBILITY IDEOGRAPH-F9EF
+F9F0		CJK COMPATIBILITY IDEOGRAPH-F9F0
+F9F1		CJK COMPATIBILITY IDEOGRAPH-F9F1
+F9F2		CJK COMPATIBILITY IDEOGRAPH-F9F2
+F9F3		CJK COMPATIBILITY IDEOGRAPH-F9F3
+F9F4		CJK COMPATIBILITY IDEOGRAPH-F9F4
+F9F5		CJK COMPATIBILITY IDEOGRAPH-F9F5
+F9F6		CJK COMPATIBILITY IDEOGRAPH-F9F6
+F9F7		CJK COMPATIBILITY IDEOGRAPH-F9F7
+F9F8		CJK COMPATIBILITY IDEOGRAPH-F9F8
+F9F9		CJK COMPATIBILITY IDEOGRAPH-F9F9
+F9FA		CJK COMPATIBILITY IDEOGRAPH-F9FA
+F9FB		CJK COMPATIBILITY IDEOGRAPH-F9FB
+F9FC		CJK COMPATIBILITY IDEOGRAPH-F9FC
+F9FD		CJK COMPATIBILITY IDEOGRAPH-F9FD
+F9FE		CJK COMPATIBILITY IDEOGRAPH-F9FE
+F9FF		CJK COMPATIBILITY IDEOGRAPH-F9FF
+FA00		CJK COMPATIBILITY IDEOGRAPH-FA00
+FA01		CJK COMPATIBILITY IDEOGRAPH-FA01
+FA02		CJK COMPATIBILITY IDEOGRAPH-FA02
+FA03		CJK COMPATIBILITY IDEOGRAPH-FA03
+FA04		CJK COMPATIBILITY IDEOGRAPH-FA04
+FA05		CJK COMPATIBILITY IDEOGRAPH-FA05
+FA06		CJK COMPATIBILITY IDEOGRAPH-FA06
+FA07		CJK COMPATIBILITY IDEOGRAPH-FA07
+FA08		CJK COMPATIBILITY IDEOGRAPH-FA08
+FA09		CJK COMPATIBILITY IDEOGRAPH-FA09
+FA0A		CJK COMPATIBILITY IDEOGRAPH-FA0A
+FA0B		CJK COMPATIBILITY IDEOGRAPH-FA0B
+FA0C		CJK COMPATIBILITY IDEOGRAPH-FA0C
+FA0D		CJK COMPATIBILITY IDEOGRAPH-FA0D
+FA0E		CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F		CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA10		CJK COMPATIBILITY IDEOGRAPH-FA10
+FA11		CJK COMPATIBILITY IDEOGRAPH-FA11
+FA12		CJK COMPATIBILITY IDEOGRAPH-FA12
+FA13		CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14		CJK COMPATIBILITY IDEOGRAPH-FA14
+FA15		CJK COMPATIBILITY IDEOGRAPH-FA15
+FA16		CJK COMPATIBILITY IDEOGRAPH-FA16
+FA17		CJK COMPATIBILITY IDEOGRAPH-FA17
+FA18		CJK COMPATIBILITY IDEOGRAPH-FA18
+FA19		CJK COMPATIBILITY IDEOGRAPH-FA19
+FA1A		CJK COMPATIBILITY IDEOGRAPH-FA1A
+FA1B		CJK COMPATIBILITY IDEOGRAPH-FA1B
+FA1C		CJK COMPATIBILITY IDEOGRAPH-FA1C
+FA1D		CJK COMPATIBILITY IDEOGRAPH-FA1D
+FA1E		CJK COMPATIBILITY IDEOGRAPH-FA1E
+FA1F		CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA20		CJK COMPATIBILITY IDEOGRAPH-FA20
+FA21		CJK COMPATIBILITY IDEOGRAPH-FA21
+FA22		CJK COMPATIBILITY IDEOGRAPH-FA22
+FA23		CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24		CJK COMPATIBILITY IDEOGRAPH-FA24
+FA25		CJK COMPATIBILITY IDEOGRAPH-FA25
+FA26		CJK COMPATIBILITY IDEOGRAPH-FA26
+FA27		CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28		CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29		CJK COMPATIBILITY IDEOGRAPH-FA29
+FA2A		CJK COMPATIBILITY IDEOGRAPH-FA2A
+FA2B		CJK COMPATIBILITY IDEOGRAPH-FA2B
+FA2C		CJK COMPATIBILITY IDEOGRAPH-FA2C
+FA2D		CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30		CJK COMPATIBILITY IDEOGRAPH-FA30
+FA31		CJK COMPATIBILITY IDEOGRAPH-FA31
+FA32		CJK COMPATIBILITY IDEOGRAPH-FA32
+FA33		CJK COMPATIBILITY IDEOGRAPH-FA33
+FA34		CJK COMPATIBILITY IDEOGRAPH-FA34
+FA35		CJK COMPATIBILITY IDEOGRAPH-FA35
+FA36		CJK COMPATIBILITY IDEOGRAPH-FA36
+FA37		CJK COMPATIBILITY IDEOGRAPH-FA37
+FA38		CJK COMPATIBILITY IDEOGRAPH-FA38
+FA39		CJK COMPATIBILITY IDEOGRAPH-FA39
+FA3A		CJK COMPATIBILITY IDEOGRAPH-FA3A
+FA3B		CJK COMPATIBILITY IDEOGRAPH-FA3B
+FA3C		CJK COMPATIBILITY IDEOGRAPH-FA3C
+FA3D		CJK COMPATIBILITY IDEOGRAPH-FA3D
+FA3E		CJK COMPATIBILITY IDEOGRAPH-FA3E
+FA3F		CJK COMPATIBILITY IDEOGRAPH-FA3F
+FA40		CJK COMPATIBILITY IDEOGRAPH-FA40
+FA41		CJK COMPATIBILITY IDEOGRAPH-FA41
+FA42		CJK COMPATIBILITY IDEOGRAPH-FA42
+FA43		CJK COMPATIBILITY IDEOGRAPH-FA43
+FA44		CJK COMPATIBILITY IDEOGRAPH-FA44
+FA45		CJK COMPATIBILITY IDEOGRAPH-FA45
+FA46		CJK COMPATIBILITY IDEOGRAPH-FA46
+FA47		CJK COMPATIBILITY IDEOGRAPH-FA47
+FA48		CJK COMPATIBILITY IDEOGRAPH-FA48
+FA49		CJK COMPATIBILITY IDEOGRAPH-FA49
+FA4A		CJK COMPATIBILITY IDEOGRAPH-FA4A
+FA4B		CJK COMPATIBILITY IDEOGRAPH-FA4B
+FA4C		CJK COMPATIBILITY IDEOGRAPH-FA4C
+FA4D		CJK COMPATIBILITY IDEOGRAPH-FA4D
+FA4E		CJK COMPATIBILITY IDEOGRAPH-FA4E
+FA4F		CJK COMPATIBILITY IDEOGRAPH-FA4F
+FA50		CJK COMPATIBILITY IDEOGRAPH-FA50
+FA51		CJK COMPATIBILITY IDEOGRAPH-FA51
+FA52		CJK COMPATIBILITY IDEOGRAPH-FA52
+FA53		CJK COMPATIBILITY IDEOGRAPH-FA53
+FA54		CJK COMPATIBILITY IDEOGRAPH-FA54
+FA55		CJK COMPATIBILITY IDEOGRAPH-FA55
+FA56		CJK COMPATIBILITY IDEOGRAPH-FA56
+FA57		CJK COMPATIBILITY IDEOGRAPH-FA57
+FA58		CJK COMPATIBILITY IDEOGRAPH-FA58
+FA59		CJK COMPATIBILITY IDEOGRAPH-FA59
+FA5A		CJK COMPATIBILITY IDEOGRAPH-FA5A
+FA5B		CJK COMPATIBILITY IDEOGRAPH-FA5B
+FA5C		CJK COMPATIBILITY IDEOGRAPH-FA5C
+FA5D		CJK COMPATIBILITY IDEOGRAPH-FA5D
+FA5E		CJK COMPATIBILITY IDEOGRAPH-FA5E
+FA5F		CJK COMPATIBILITY IDEOGRAPH-FA5F
+FA60		CJK COMPATIBILITY IDEOGRAPH-FA60
+FA61		CJK COMPATIBILITY IDEOGRAPH-FA61
+FA62		CJK COMPATIBILITY IDEOGRAPH-FA62
+FA63		CJK COMPATIBILITY IDEOGRAPH-FA63
+FA64		CJK COMPATIBILITY IDEOGRAPH-FA64
+FA65		CJK COMPATIBILITY IDEOGRAPH-FA65
+FA66		CJK COMPATIBILITY IDEOGRAPH-FA66
+FA67		CJK COMPATIBILITY IDEOGRAPH-FA67
+FA68		CJK COMPATIBILITY IDEOGRAPH-FA68
+FA69		CJK COMPATIBILITY IDEOGRAPH-FA69
+FA6A		CJK COMPATIBILITY IDEOGRAPH-FA6A
+FA70		CJK COMPATIBILITY IDEOGRAPH-FA70
+FA71		CJK COMPATIBILITY IDEOGRAPH-FA71
+FA72		CJK COMPATIBILITY IDEOGRAPH-FA72
+FA73		CJK COMPATIBILITY IDEOGRAPH-FA73
+FA74		CJK COMPATIBILITY IDEOGRAPH-FA74
+FA75		CJK COMPATIBILITY IDEOGRAPH-FA75
+FA76		CJK COMPATIBILITY IDEOGRAPH-FA76
+FA77		CJK COMPATIBILITY IDEOGRAPH-FA77
+FA78		CJK COMPATIBILITY IDEOGRAPH-FA78
+FA79		CJK COMPATIBILITY IDEOGRAPH-FA79
+FA7A		CJK COMPATIBILITY IDEOGRAPH-FA7A
+FA7B		CJK COMPATIBILITY IDEOGRAPH-FA7B
+FA7C		CJK COMPATIBILITY IDEOGRAPH-FA7C
+FA7D		CJK COMPATIBILITY IDEOGRAPH-FA7D
+FA7E		CJK COMPATIBILITY IDEOGRAPH-FA7E
+FA7F		CJK COMPATIBILITY IDEOGRAPH-FA7F
+FA80		CJK COMPATIBILITY IDEOGRAPH-FA80
+FA81		CJK COMPATIBILITY IDEOGRAPH-FA81
+FA82		CJK COMPATIBILITY IDEOGRAPH-FA82
+FA83		CJK COMPATIBILITY IDEOGRAPH-FA83
+FA84		CJK COMPATIBILITY IDEOGRAPH-FA84
+FA85		CJK COMPATIBILITY IDEOGRAPH-FA85
+FA86		CJK COMPATIBILITY IDEOGRAPH-FA86
+FA87		CJK COMPATIBILITY IDEOGRAPH-FA87
+FA88		CJK COMPATIBILITY IDEOGRAPH-FA88
+FA89		CJK COMPATIBILITY IDEOGRAPH-FA89
+FA8A		CJK COMPATIBILITY IDEOGRAPH-FA8A
+FA8B		CJK COMPATIBILITY IDEOGRAPH-FA8B
+FA8C		CJK COMPATIBILITY IDEOGRAPH-FA8C
+FA8D		CJK COMPATIBILITY IDEOGRAPH-FA8D
+FA8E		CJK COMPATIBILITY IDEOGRAPH-FA8E
+FA8F		CJK COMPATIBILITY IDEOGRAPH-FA8F
+FA90		CJK COMPATIBILITY IDEOGRAPH-FA90
+FA91		CJK COMPATIBILITY IDEOGRAPH-FA91
+FA92		CJK COMPATIBILITY IDEOGRAPH-FA92
+FA93		CJK COMPATIBILITY IDEOGRAPH-FA93
+FA94		CJK COMPATIBILITY IDEOGRAPH-FA94
+FA95		CJK COMPATIBILITY IDEOGRAPH-FA95
+FA96		CJK COMPATIBILITY IDEOGRAPH-FA96
+FA97		CJK COMPATIBILITY IDEOGRAPH-FA97
+FA98		CJK COMPATIBILITY IDEOGRAPH-FA98
+FA99		CJK COMPATIBILITY IDEOGRAPH-FA99
+FA9A		CJK COMPATIBILITY IDEOGRAPH-FA9A
+FA9B		CJK COMPATIBILITY IDEOGRAPH-FA9B
+FA9C		CJK COMPATIBILITY IDEOGRAPH-FA9C
+FA9D		CJK COMPATIBILITY IDEOGRAPH-FA9D
+FA9E		CJK COMPATIBILITY IDEOGRAPH-FA9E
+FA9F		CJK COMPATIBILITY IDEOGRAPH-FA9F
+FAA0		CJK COMPATIBILITY IDEOGRAPH-FAA0
+FAA1		CJK COMPATIBILITY IDEOGRAPH-FAA1
+FAA2		CJK COMPATIBILITY IDEOGRAPH-FAA2
+FAA3		CJK COMPATIBILITY IDEOGRAPH-FAA3
+FAA4		CJK COMPATIBILITY IDEOGRAPH-FAA4
+FAA5		CJK COMPATIBILITY IDEOGRAPH-FAA5
+FAA6		CJK COMPATIBILITY IDEOGRAPH-FAA6
+FAA7		CJK COMPATIBILITY IDEOGRAPH-FAA7
+FAA8		CJK COMPATIBILITY IDEOGRAPH-FAA8
+FAA9		CJK COMPATIBILITY IDEOGRAPH-FAA9
+FAAA		CJK COMPATIBILITY IDEOGRAPH-FAAA
+FAAB		CJK COMPATIBILITY IDEOGRAPH-FAAB
+FAAC		CJK COMPATIBILITY IDEOGRAPH-FAAC
+FAAD		CJK COMPATIBILITY IDEOGRAPH-FAAD
+FAAE		CJK COMPATIBILITY IDEOGRAPH-FAAE
+FAAF		CJK COMPATIBILITY IDEOGRAPH-FAAF
+FAB0		CJK COMPATIBILITY IDEOGRAPH-FAB0
+FAB1		CJK COMPATIBILITY IDEOGRAPH-FAB1
+FAB2		CJK COMPATIBILITY IDEOGRAPH-FAB2
+FAB3		CJK COMPATIBILITY IDEOGRAPH-FAB3
+FAB4		CJK COMPATIBILITY IDEOGRAPH-FAB4
+FAB5		CJK COMPATIBILITY IDEOGRAPH-FAB5
+FAB6		CJK COMPATIBILITY IDEOGRAPH-FAB6
+FAB7		CJK COMPATIBILITY IDEOGRAPH-FAB7
+FAB8		CJK COMPATIBILITY IDEOGRAPH-FAB8
+FAB9		CJK COMPATIBILITY IDEOGRAPH-FAB9
+FABA		CJK COMPATIBILITY IDEOGRAPH-FABA
+FABB		CJK COMPATIBILITY IDEOGRAPH-FABB
+FABC		CJK COMPATIBILITY IDEOGRAPH-FABC
+FABD		CJK COMPATIBILITY IDEOGRAPH-FABD
+FABE		CJK COMPATIBILITY IDEOGRAPH-FABE
+FABF		CJK COMPATIBILITY IDEOGRAPH-FABF
+FAC0		CJK COMPATIBILITY IDEOGRAPH-FAC0
+FAC1		CJK COMPATIBILITY IDEOGRAPH-FAC1
+FAC2		CJK COMPATIBILITY IDEOGRAPH-FAC2
+FAC3		CJK COMPATIBILITY IDEOGRAPH-FAC3
+FAC4		CJK COMPATIBILITY IDEOGRAPH-FAC4
+FAC5		CJK COMPATIBILITY IDEOGRAPH-FAC5
+FAC6		CJK COMPATIBILITY IDEOGRAPH-FAC6
+FAC7		CJK COMPATIBILITY IDEOGRAPH-FAC7
+FAC8		CJK COMPATIBILITY IDEOGRAPH-FAC8
+FAC9		CJK COMPATIBILITY IDEOGRAPH-FAC9
+FACA		CJK COMPATIBILITY IDEOGRAPH-FACA
+FACB		CJK COMPATIBILITY IDEOGRAPH-FACB
+FACC		CJK COMPATIBILITY IDEOGRAPH-FACC
+FACD		CJK COMPATIBILITY IDEOGRAPH-FACD
+FACE		CJK COMPATIBILITY IDEOGRAPH-FACE
+FACF		CJK COMPATIBILITY IDEOGRAPH-FACF
+FAD0		CJK COMPATIBILITY IDEOGRAPH-FAD0
+FAD1		CJK COMPATIBILITY IDEOGRAPH-FAD1
+FAD2		CJK COMPATIBILITY IDEOGRAPH-FAD2
+FAD3		CJK COMPATIBILITY IDEOGRAPH-FAD3
+FAD4		CJK COMPATIBILITY IDEOGRAPH-FAD4
+FAD5		CJK COMPATIBILITY IDEOGRAPH-FAD5
+FAD6		CJK COMPATIBILITY IDEOGRAPH-FAD6
+FAD7		CJK COMPATIBILITY IDEOGRAPH-FAD7
+FAD8		CJK COMPATIBILITY IDEOGRAPH-FAD8
+FAD9		CJK COMPATIBILITY IDEOGRAPH-FAD9
+FB00		LATIN SMALL LIGATURE FF
+FB01		LATIN SMALL LIGATURE FI
+FB02		LATIN SMALL LIGATURE FL
+FB03		LATIN SMALL LIGATURE FFI
+FB04		LATIN SMALL LIGATURE FFL
+FB05		LATIN SMALL LIGATURE LONG S T
+FB06		LATIN SMALL LIGATURE ST
+FB13		ARMENIAN SMALL LIGATURE MEN NOW
+FB14		ARMENIAN SMALL LIGATURE MEN ECH
+FB15		ARMENIAN SMALL LIGATURE MEN INI
+FB16		ARMENIAN SMALL LIGATURE VEW NOW
+FB17		ARMENIAN SMALL LIGATURE MEN XEH
+FB1D		HEBREW LETTER YOD WITH HIRIQ
+FB1E		HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F		HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB20		HEBREW LETTER ALTERNATIVE AYIN
+FB21		HEBREW LETTER WIDE ALEF
+FB22		HEBREW LETTER WIDE DALET
+FB23		HEBREW LETTER WIDE HE
+FB24		HEBREW LETTER WIDE KAF
+FB25		HEBREW LETTER WIDE LAMED
+FB26		HEBREW LETTER WIDE FINAL MEM
+FB27		HEBREW LETTER WIDE RESH
+FB28		HEBREW LETTER WIDE TAV
+FB29		HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A		HEBREW LETTER SHIN WITH SHIN DOT
+FB2B		HEBREW LETTER SHIN WITH SIN DOT
+FB2C		HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D		HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E		HEBREW LETTER ALEF WITH PATAH
+FB2F		HEBREW LETTER ALEF WITH QAMATS
+FB30		HEBREW LETTER ALEF WITH MAPIQ
+FB31		HEBREW LETTER BET WITH DAGESH
+FB32		HEBREW LETTER GIMEL WITH DAGESH
+FB33		HEBREW LETTER DALET WITH DAGESH
+FB34		HEBREW LETTER HE WITH MAPIQ
+FB35		HEBREW LETTER VAV WITH DAGESH
+FB36		HEBREW LETTER ZAYIN WITH DAGESH
+FB38		HEBREW LETTER TET WITH DAGESH
+FB39		HEBREW LETTER YOD WITH DAGESH
+FB3A		HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B		HEBREW LETTER KAF WITH DAGESH
+FB3C		HEBREW LETTER LAMED WITH DAGESH
+FB3E		HEBREW LETTER MEM WITH DAGESH
+FB40		HEBREW LETTER NUN WITH DAGESH
+FB41		HEBREW LETTER SAMEKH WITH DAGESH
+FB43		HEBREW LETTER FINAL PE WITH DAGESH
+FB44		HEBREW LETTER PE WITH DAGESH
+FB46		HEBREW LETTER TSADI WITH DAGESH
+FB47		HEBREW LETTER QOF WITH DAGESH
+FB48		HEBREW LETTER RESH WITH DAGESH
+FB49		HEBREW LETTER SHIN WITH DAGESH
+FB4A		HEBREW LETTER TAV WITH DAGESH
+FB4B		HEBREW LETTER VAV WITH HOLAM
+FB4C		HEBREW LETTER BET WITH RAFE
+FB4D		HEBREW LETTER KAF WITH RAFE
+FB4E		HEBREW LETTER PE WITH RAFE
+FB4F		HEBREW LIGATURE ALEF LAMED
+FB50		ARABIC LETTER ALEF WASLA ISOLATED FORM
+FB51		ARABIC LETTER ALEF WASLA FINAL FORM
+FB52		ARABIC LETTER BEEH ISOLATED FORM
+FB53		ARABIC LETTER BEEH FINAL FORM
+FB54		ARABIC LETTER BEEH INITIAL FORM
+FB55		ARABIC LETTER BEEH MEDIAL FORM
+FB56		ARABIC LETTER PEH ISOLATED FORM
+FB57		ARABIC LETTER PEH FINAL FORM
+FB58		ARABIC LETTER PEH INITIAL FORM
+FB59		ARABIC LETTER PEH MEDIAL FORM
+FB5A		ARABIC LETTER BEHEH ISOLATED FORM
+FB5B		ARABIC LETTER BEHEH FINAL FORM
+FB5C		ARABIC LETTER BEHEH INITIAL FORM
+FB5D		ARABIC LETTER BEHEH MEDIAL FORM
+FB5E		ARABIC LETTER TTEHEH ISOLATED FORM
+FB5F		ARABIC LETTER TTEHEH FINAL FORM
+FB60		ARABIC LETTER TTEHEH INITIAL FORM
+FB61		ARABIC LETTER TTEHEH MEDIAL FORM
+FB62		ARABIC LETTER TEHEH ISOLATED FORM
+FB63		ARABIC LETTER TEHEH FINAL FORM
+FB64		ARABIC LETTER TEHEH INITIAL FORM
+FB65		ARABIC LETTER TEHEH MEDIAL FORM
+FB66		ARABIC LETTER TTEH ISOLATED FORM
+FB67		ARABIC LETTER TTEH FINAL FORM
+FB68		ARABIC LETTER TTEH INITIAL FORM
+FB69		ARABIC LETTER TTEH MEDIAL FORM
+FB6A		ARABIC LETTER VEH ISOLATED FORM
+FB6B		ARABIC LETTER VEH FINAL FORM
+FB6C		ARABIC LETTER VEH INITIAL FORM
+FB6D		ARABIC LETTER VEH MEDIAL FORM
+FB6E		ARABIC LETTER PEHEH ISOLATED FORM
+FB6F		ARABIC LETTER PEHEH FINAL FORM
+FB70		ARABIC LETTER PEHEH INITIAL FORM
+FB71		ARABIC LETTER PEHEH MEDIAL FORM
+FB72		ARABIC LETTER DYEH ISOLATED FORM
+FB73		ARABIC LETTER DYEH FINAL FORM
+FB74		ARABIC LETTER DYEH INITIAL FORM
+FB75		ARABIC LETTER DYEH MEDIAL FORM
+FB76		ARABIC LETTER NYEH ISOLATED FORM
+FB77		ARABIC LETTER NYEH FINAL FORM
+FB78		ARABIC LETTER NYEH INITIAL FORM
+FB79		ARABIC LETTER NYEH MEDIAL FORM
+FB7A		ARABIC LETTER TCHEH ISOLATED FORM
+FB7B		ARABIC LETTER TCHEH FINAL FORM
+FB7C		ARABIC LETTER TCHEH INITIAL FORM
+FB7D		ARABIC LETTER TCHEH MEDIAL FORM
+FB7E		ARABIC LETTER TCHEHEH ISOLATED FORM
+FB7F		ARABIC LETTER TCHEHEH FINAL FORM
+FB80		ARABIC LETTER TCHEHEH INITIAL FORM
+FB81		ARABIC LETTER TCHEHEH MEDIAL FORM
+FB82		ARABIC LETTER DDAHAL ISOLATED FORM
+FB83		ARABIC LETTER DDAHAL FINAL FORM
+FB84		ARABIC LETTER DAHAL ISOLATED FORM
+FB85		ARABIC LETTER DAHAL FINAL FORM
+FB86		ARABIC LETTER DUL ISOLATED FORM
+FB87		ARABIC LETTER DUL FINAL FORM
+FB88		ARABIC LETTER DDAL ISOLATED FORM
+FB89		ARABIC LETTER DDAL FINAL FORM
+FB8A		ARABIC LETTER JEH ISOLATED FORM
+FB8B		ARABIC LETTER JEH FINAL FORM
+FB8C		ARABIC LETTER RREH ISOLATED FORM
+FB8D		ARABIC LETTER RREH FINAL FORM
+FB8E		ARABIC LETTER KEHEH ISOLATED FORM
+FB8F		ARABIC LETTER KEHEH FINAL FORM
+FB90		ARABIC LETTER KEHEH INITIAL FORM
+FB91		ARABIC LETTER KEHEH MEDIAL FORM
+FB92		ARABIC LETTER GAF ISOLATED FORM
+FB93		ARABIC LETTER GAF FINAL FORM
+FB94		ARABIC LETTER GAF INITIAL FORM
+FB95		ARABIC LETTER GAF MEDIAL FORM
+FB96		ARABIC LETTER GUEH ISOLATED FORM
+FB97		ARABIC LETTER GUEH FINAL FORM
+FB98		ARABIC LETTER GUEH INITIAL FORM
+FB99		ARABIC LETTER GUEH MEDIAL FORM
+FB9A		ARABIC LETTER NGOEH ISOLATED FORM
+FB9B		ARABIC LETTER NGOEH FINAL FORM
+FB9C		ARABIC LETTER NGOEH INITIAL FORM
+FB9D		ARABIC LETTER NGOEH MEDIAL FORM
+FB9E		ARABIC LETTER NOON GHUNNA ISOLATED FORM
+FB9F		ARABIC LETTER NOON GHUNNA FINAL FORM
+FBA0		ARABIC LETTER RNOON ISOLATED FORM
+FBA1		ARABIC LETTER RNOON FINAL FORM
+FBA2		ARABIC LETTER RNOON INITIAL FORM
+FBA3		ARABIC LETTER RNOON MEDIAL FORM
+FBA4		ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+FBA5		ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+FBA6		ARABIC LETTER HEH GOAL ISOLATED FORM
+FBA7		ARABIC LETTER HEH GOAL FINAL FORM
+FBA8		ARABIC LETTER HEH GOAL INITIAL FORM
+FBA9		ARABIC LETTER HEH GOAL MEDIAL FORM
+FBAA		ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+FBAB		ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+FBAC		ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+FBAD		ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+FBAE		ARABIC LETTER YEH BARREE ISOLATED FORM
+FBAF		ARABIC LETTER YEH BARREE FINAL FORM
+FBB0		ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+FBB1		ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3		ARABIC LETTER NG ISOLATED FORM
+FBD4		ARABIC LETTER NG FINAL FORM
+FBD5		ARABIC LETTER NG INITIAL FORM
+FBD6		ARABIC LETTER NG MEDIAL FORM
+FBD7		ARABIC LETTER U ISOLATED FORM
+FBD8		ARABIC LETTER U FINAL FORM
+FBD9		ARABIC LETTER OE ISOLATED FORM
+FBDA		ARABIC LETTER OE FINAL FORM
+FBDB		ARABIC LETTER YU ISOLATED FORM
+FBDC		ARABIC LETTER YU FINAL FORM
+FBDD		ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+FBDE		ARABIC LETTER VE ISOLATED FORM
+FBDF		ARABIC LETTER VE FINAL FORM
+FBE0		ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+FBE1		ARABIC LETTER KIRGHIZ OE FINAL FORM
+FBE2		ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+FBE3		ARABIC LETTER KIRGHIZ YU FINAL FORM
+FBE4		ARABIC LETTER E ISOLATED FORM
+FBE5		ARABIC LETTER E FINAL FORM
+FBE6		ARABIC LETTER E INITIAL FORM
+FBE7		ARABIC LETTER E MEDIAL FORM
+FBE8		ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+FBE9		ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+FBEA		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+FBEB		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+FBEC		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+FBED		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+FBEE		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+FBEF		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+FBF0		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+FBF1		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+FBF2		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+FBF3		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+FBF4		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+FBF5		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+FBF6		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+FBF7		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+FBF8		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+FBF9		ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FBFA		ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FBFB		ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+FBFC		ARABIC LETTER FARSI YEH ISOLATED FORM
+FBFD		ARABIC LETTER FARSI YEH FINAL FORM
+FBFE		ARABIC LETTER FARSI YEH INITIAL FORM
+FBFF		ARABIC LETTER FARSI YEH MEDIAL FORM
+FC00		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+FC01		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+FC02		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+FC03		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FC04		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+FC05		ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+FC06		ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+FC07		ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+FC08		ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+FC09		ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+FC0A		ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+FC0B		ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+FC0C		ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+FC0D		ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+FC0E		ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+FC0F		ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+FC10		ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+FC11		ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+FC12		ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+FC13		ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+FC14		ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+FC15		ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+FC16		ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+FC17		ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+FC18		ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+FC19		ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+FC1A		ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+FC1B		ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+FC1C		ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+FC1D		ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+FC1E		ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+FC1F		ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+FC20		ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+FC21		ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+FC22		ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+FC23		ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+FC24		ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+FC25		ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+FC26		ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+FC27		ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+FC28		ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+FC29		ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+FC2A		ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+FC2B		ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+FC2C		ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+FC2D		ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+FC2E		ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+FC2F		ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+FC30		ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+FC31		ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+FC32		ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+FC33		ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+FC34		ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+FC35		ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+FC36		ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+FC37		ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+FC38		ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+FC39		ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+FC3A		ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+FC3B		ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+FC3C		ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+FC3D		ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+FC3E		ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+FC3F		ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+FC40		ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+FC41		ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+FC42		ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+FC43		ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+FC44		ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+FC45		ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+FC46		ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+FC47		ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+FC48		ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+FC49		ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+FC4A		ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+FC4B		ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+FC4C		ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+FC4D		ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+FC4E		ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+FC4F		ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+FC50		ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+FC51		ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+FC52		ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+FC53		ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+FC54		ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+FC55		ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+FC56		ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+FC57		ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+FC58		ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+FC59		ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+FC5A		ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+FC5B		ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5C		ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5D		ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5E		ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+FC5F		ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+FC60		ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+FC61		ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+FC62		ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+FC63		ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC64		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+FC65		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+FC66		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+FC67		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+FC68		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FC69		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+FC6A		ARABIC LIGATURE BEH WITH REH FINAL FORM
+FC6B		ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+FC6C		ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+FC6D		ARABIC LIGATURE BEH WITH NOON FINAL FORM
+FC6E		ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+FC6F		ARABIC LIGATURE BEH WITH YEH FINAL FORM
+FC70		ARABIC LIGATURE TEH WITH REH FINAL FORM
+FC71		ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+FC72		ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+FC73		ARABIC LIGATURE TEH WITH NOON FINAL FORM
+FC74		ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+FC75		ARABIC LIGATURE TEH WITH YEH FINAL FORM
+FC76		ARABIC LIGATURE THEH WITH REH FINAL FORM
+FC77		ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+FC78		ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+FC79		ARABIC LIGATURE THEH WITH NOON FINAL FORM
+FC7A		ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+FC7B		ARABIC LIGATURE THEH WITH YEH FINAL FORM
+FC7C		ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+FC7D		ARABIC LIGATURE FEH WITH YEH FINAL FORM
+FC7E		ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+FC7F		ARABIC LIGATURE QAF WITH YEH FINAL FORM
+FC80		ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+FC81		ARABIC LIGATURE KAF WITH LAM FINAL FORM
+FC82		ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+FC83		ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+FC84		ARABIC LIGATURE KAF WITH YEH FINAL FORM
+FC85		ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+FC86		ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+FC87		ARABIC LIGATURE LAM WITH YEH FINAL FORM
+FC88		ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+FC89		ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+FC8A		ARABIC LIGATURE NOON WITH REH FINAL FORM
+FC8B		ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+FC8C		ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+FC8D		ARABIC LIGATURE NOON WITH NOON FINAL FORM
+FC8E		ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+FC8F		ARABIC LIGATURE NOON WITH YEH FINAL FORM
+FC90		ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+FC91		ARABIC LIGATURE YEH WITH REH FINAL FORM
+FC92		ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+FC93		ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+FC94		ARABIC LIGATURE YEH WITH NOON FINAL FORM
+FC95		ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+FC96		ARABIC LIGATURE YEH WITH YEH FINAL FORM
+FC97		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+FC98		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+FC99		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+FC9A		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+FC9B		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+FC9C		ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+FC9D		ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+FC9E		ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+FC9F		ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+FCA0		ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+FCA1		ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+FCA2		ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+FCA3		ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+FCA4		ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+FCA5		ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+FCA6		ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+FCA7		ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+FCA8		ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+FCA9		ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+FCAA		ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+FCAB		ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+FCAC		ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+FCAD		ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+FCAE		ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+FCAF		ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+FCB0		ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+FCB1		ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+FCB2		ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+FCB3		ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+FCB4		ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+FCB5		ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+FCB6		ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+FCB7		ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+FCB8		ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+FCB9		ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+FCBA		ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+FCBB		ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+FCBC		ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+FCBD		ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+FCBE		ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+FCBF		ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+FCC0		ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+FCC1		ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+FCC2		ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+FCC3		ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+FCC4		ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+FCC5		ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+FCC6		ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+FCC7		ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+FCC8		ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+FCC9		ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+FCCA		ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+FCCB		ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+FCCC		ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+FCCD		ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+FCCE		ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+FCCF		ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+FCD0		ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+FCD1		ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+FCD2		ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+FCD3		ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+FCD4		ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+FCD5		ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+FCD6		ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+FCD7		ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+FCD8		ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+FCD9		ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+FCDA		ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+FCDB		ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+FCDC		ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+FCDD		ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+FCDE		ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+FCDF		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+FCE0		ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+FCE1		ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+FCE2		ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+FCE3		ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+FCE4		ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+FCE5		ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+FCE6		ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+FCE7		ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+FCE8		ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+FCE9		ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+FCEA		ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+FCEB		ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+FCEC		ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+FCED		ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+FCEE		ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+FCEF		ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+FCF0		ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+FCF1		ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+FCF2		ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+FCF3		ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+FCF4		ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+FCF5		ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+FCF6		ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+FCF7		ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+FCF8		ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+FCF9		ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+FCFA		ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+FCFB		ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFC		ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+FCFD		ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFE		ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+FCFF		ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+FD00		ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+FD01		ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+FD02		ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+FD03		ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+FD04		ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+FD05		ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+FD06		ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+FD07		ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+FD08		ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+FD09		ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+FD0A		ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+FD0B		ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+FD0C		ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+FD0D		ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+FD0E		ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+FD0F		ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+FD10		ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+FD11		ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+FD12		ARABIC LIGATURE TAH WITH YEH FINAL FORM
+FD13		ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+FD14		ARABIC LIGATURE AIN WITH YEH FINAL FORM
+FD15		ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+FD16		ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+FD17		ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+FD18		ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+FD19		ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+FD1A		ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+FD1B		ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+FD1C		ARABIC LIGATURE HAH WITH YEH FINAL FORM
+FD1D		ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+FD1E		ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+FD1F		ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+FD20		ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+FD21		ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+FD22		ARABIC LIGATURE SAD WITH YEH FINAL FORM
+FD23		ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+FD24		ARABIC LIGATURE DAD WITH YEH FINAL FORM
+FD25		ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+FD26		ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+FD27		ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+FD28		ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+FD29		ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+FD2A		ARABIC LIGATURE SEEN WITH REH FINAL FORM
+FD2B		ARABIC LIGATURE SAD WITH REH FINAL FORM
+FD2C		ARABIC LIGATURE DAD WITH REH FINAL FORM
+FD2D		ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+FD2E		ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+FD2F		ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+FD30		ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+FD31		ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+FD32		ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+FD33		ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+FD34		ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+FD35		ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+FD36		ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+FD37		ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+FD38		ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+FD39		ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+FD3A		ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+FD3B		ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+FD3C		ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+FD3D		ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD3E		ORNATE LEFT PARENTHESIS
+FD3F		ORNATE RIGHT PARENTHESIS
+FD50		ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+FD51		ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+FD52		ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+FD53		ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+FD54		ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+FD55		ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+FD56		ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+FD57		ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+FD58		ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+FD59		ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+FD5A		ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+FD5B		ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD5C		ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+FD5D		ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+FD5E		ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD5F		ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+FD60		ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+FD61		ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+FD62		ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+FD63		ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+FD64		ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+FD65		ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+FD66		ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+FD67		ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+FD68		ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+FD69		ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+FD6A		ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+FD6B		ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+FD6C		ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+FD6D		ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+FD6E		ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD6F		ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+FD70		ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+FD71		ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+FD72		ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+FD73		ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+FD74		ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+FD75		ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+FD76		ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+FD77		ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+FD78		ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD79		ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+FD7A		ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+FD7B		ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD7C		ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+FD7D		ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+FD7E		ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+FD7F		ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+FD80		ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+FD81		ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+FD82		ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD83		ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+FD84		ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+FD85		ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+FD86		ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+FD87		ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+FD88		ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+FD89		ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+FD8A		ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+FD8B		ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+FD8C		ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+FD8D		ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+FD8E		ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+FD8F		ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92		ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+FD93		ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+FD94		ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+FD95		ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+FD96		ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD97		ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+FD98		ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+FD99		ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD9A		ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+FD9B		ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD9C		ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+FD9D		ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+FD9E		ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+FD9F		ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+FDA0		ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FDA1		ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+FDA2		ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA3		ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+FDA4		ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA5		ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+FDA6		ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FDA7		ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA8		ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA9		ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+FDAA		ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+FDAB		ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+FDAC		ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+FDAD		ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+FDAE		ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+FDAF		ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+FDB0		ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+FDB1		ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+FDB2		ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+FDB3		ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+FDB4		ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+FDB5		ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+FDB6		ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+FDB7		ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+FDB8		ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+FDB9		ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+FDBA		ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+FDBB		ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+FDBC		ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+FDBD		ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+FDBE		ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+FDBF		ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+FDC0		ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+FDC1		ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+FDC2		ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+FDC3		ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+FDC4		ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+FDC5		ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+FDC6		ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+FDC7		ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0		ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF1		ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF2		ARABIC LIGATURE ALLAH ISOLATED FORM
+FDF3		ARABIC LIGATURE AKBAR ISOLATED FORM
+FDF4		ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+FDF5		ARABIC LIGATURE SALAM ISOLATED FORM
+FDF6		ARABIC LIGATURE RASOUL ISOLATED FORM
+FDF7		ARABIC LIGATURE ALAYHE ISOLATED FORM
+FDF8		ARABIC LIGATURE WASALLAM ISOLATED FORM
+FDF9		ARABIC LIGATURE SALLA ISOLATED FORM
+FDFA		ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+FDFB		ARABIC LIGATURE JALLAJALALOUHOU
+FDFC		RIAL SIGN
+FDFD		ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE00		VARIATION SELECTOR-1
+FE01		VARIATION SELECTOR-2
+FE02		VARIATION SELECTOR-3
+FE03		VARIATION SELECTOR-4
+FE04		VARIATION SELECTOR-5
+FE05		VARIATION SELECTOR-6
+FE06		VARIATION SELECTOR-7
+FE07		VARIATION SELECTOR-8
+FE08		VARIATION SELECTOR-9
+FE09		VARIATION SELECTOR-10
+FE0A		VARIATION SELECTOR-11
+FE0B		VARIATION SELECTOR-12
+FE0C		VARIATION SELECTOR-13
+FE0D		VARIATION SELECTOR-14
+FE0E		VARIATION SELECTOR-15
+FE0F		VARIATION SELECTOR-16
+FE10		PRESENTATION FORM FOR VERTICAL COMMA
+FE11		PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
+FE12		PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP
+FE13		PRESENTATION FORM FOR VERTICAL COLON
+FE14		PRESENTATION FORM FOR VERTICAL SEMICOLON
+FE15		PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
+FE16		PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17		PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18		PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19		PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE20		COMBINING LIGATURE LEFT HALF
+FE21		COMBINING LIGATURE RIGHT HALF
+FE22		COMBINING DOUBLE TILDE LEFT HALF
+FE23		COMBINING DOUBLE TILDE RIGHT HALF
+FE30		PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31		PRESENTATION FORM FOR VERTICAL EM DASH
+FE32		PRESENTATION FORM FOR VERTICAL EN DASH
+FE33		PRESENTATION FORM FOR VERTICAL LOW LINE
+FE34		PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35		PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36		PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37		PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38		PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39		PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A		PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B		PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C		PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D		PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E		PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F		PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40		PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41		PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42		PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43		PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44		PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45		SESAME DOT
+FE46		WHITE SESAME DOT
+FE47		PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48		PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49		DASHED OVERLINE
+FE4A		CENTRELINE OVERLINE
+FE4B		WAVY OVERLINE
+FE4C		DOUBLE WAVY OVERLINE
+FE4D		DASHED LOW LINE
+FE4E		CENTRELINE LOW LINE
+FE4F		WAVY LOW LINE
+FE50		SMALL COMMA
+FE51		SMALL IDEOGRAPHIC COMMA
+FE52		SMALL FULL STOP
+FE54		SMALL SEMICOLON
+FE55		SMALL COLON
+FE56		SMALL QUESTION MARK
+FE57		SMALL EXCLAMATION MARK
+FE58		SMALL EM DASH
+FE59		SMALL LEFT PARENTHESIS
+FE5A		SMALL RIGHT PARENTHESIS
+FE5B		SMALL LEFT CURLY BRACKET
+FE5C		SMALL RIGHT CURLY BRACKET
+FE5D		SMALL LEFT TORTOISE SHELL BRACKET
+FE5E		SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F		SMALL NUMBER SIGN
+FE60		SMALL AMPERSAND
+FE61		SMALL ASTERISK
+FE62		SMALL PLUS SIGN
+FE63		SMALL HYPHEN-MINUS
+FE64		SMALL LESS-THAN SIGN
+FE65		SMALL GREATER-THAN SIGN
+FE66		SMALL EQUALS SIGN
+FE68		SMALL REVERSE SOLIDUS
+FE69		SMALL DOLLAR SIGN
+FE6A		SMALL PERCENT SIGN
+FE6B		SMALL COMMERCIAL AT
+FE70		ARABIC FATHATAN ISOLATED FORM
+FE71		ARABIC TATWEEL WITH FATHATAN ABOVE
+FE72		ARABIC DAMMATAN ISOLATED FORM
+FE73		ARABIC TAIL FRAGMENT
+FE74		ARABIC KASRATAN ISOLATED FORM
+FE76		ARABIC FATHA ISOLATED FORM
+FE77		ARABIC FATHA MEDIAL FORM
+FE78		ARABIC DAMMA ISOLATED FORM
+FE79		ARABIC DAMMA MEDIAL FORM
+FE7A		ARABIC KASRA ISOLATED FORM
+FE7B		ARABIC KASRA MEDIAL FORM
+FE7C		ARABIC SHADDA ISOLATED FORM
+FE7D		ARABIC SHADDA MEDIAL FORM
+FE7E		ARABIC SUKUN ISOLATED FORM
+FE7F		ARABIC SUKUN MEDIAL FORM
+FE80		ARABIC LETTER HAMZA ISOLATED FORM
+FE81		ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+FE82		ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+FE83		ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+FE84		ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+FE85		ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+FE86		ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+FE87		ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+FE88		ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+FE89		ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+FE8A		ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+FE8B		ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+FE8C		ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+FE8D		ARABIC LETTER ALEF ISOLATED FORM
+FE8E		ARABIC LETTER ALEF FINAL FORM
+FE8F		ARABIC LETTER BEH ISOLATED FORM
+FE90		ARABIC LETTER BEH FINAL FORM
+FE91		ARABIC LETTER BEH INITIAL FORM
+FE92		ARABIC LETTER BEH MEDIAL FORM
+FE93		ARABIC LETTER TEH MARBUTA ISOLATED FORM
+FE94		ARABIC LETTER TEH MARBUTA FINAL FORM
+FE95		ARABIC LETTER TEH ISOLATED FORM
+FE96		ARABIC LETTER TEH FINAL FORM
+FE97		ARABIC LETTER TEH INITIAL FORM
+FE98		ARABIC LETTER TEH MEDIAL FORM
+FE99		ARABIC LETTER THEH ISOLATED FORM
+FE9A		ARABIC LETTER THEH FINAL FORM
+FE9B		ARABIC LETTER THEH INITIAL FORM
+FE9C		ARABIC LETTER THEH MEDIAL FORM
+FE9D		ARABIC LETTER JEEM ISOLATED FORM
+FE9E		ARABIC LETTER JEEM FINAL FORM
+FE9F		ARABIC LETTER JEEM INITIAL FORM
+FEA0		ARABIC LETTER JEEM MEDIAL FORM
+FEA1		ARABIC LETTER HAH ISOLATED FORM
+FEA2		ARABIC LETTER HAH FINAL FORM
+FEA3		ARABIC LETTER HAH INITIAL FORM
+FEA4		ARABIC LETTER HAH MEDIAL FORM
+FEA5		ARABIC LETTER KHAH ISOLATED FORM
+FEA6		ARABIC LETTER KHAH FINAL FORM
+FEA7		ARABIC LETTER KHAH INITIAL FORM
+FEA8		ARABIC LETTER KHAH MEDIAL FORM
+FEA9		ARABIC LETTER DAL ISOLATED FORM
+FEAA		ARABIC LETTER DAL FINAL FORM
+FEAB		ARABIC LETTER THAL ISOLATED FORM
+FEAC		ARABIC LETTER THAL FINAL FORM
+FEAD		ARABIC LETTER REH ISOLATED FORM
+FEAE		ARABIC LETTER REH FINAL FORM
+FEAF		ARABIC LETTER ZAIN ISOLATED FORM
+FEB0		ARABIC LETTER ZAIN FINAL FORM
+FEB1		ARABIC LETTER SEEN ISOLATED FORM
+FEB2		ARABIC LETTER SEEN FINAL FORM
+FEB3		ARABIC LETTER SEEN INITIAL FORM
+FEB4		ARABIC LETTER SEEN MEDIAL FORM
+FEB5		ARABIC LETTER SHEEN ISOLATED FORM
+FEB6		ARABIC LETTER SHEEN FINAL FORM
+FEB7		ARABIC LETTER SHEEN INITIAL FORM
+FEB8		ARABIC LETTER SHEEN MEDIAL FORM
+FEB9		ARABIC LETTER SAD ISOLATED FORM
+FEBA		ARABIC LETTER SAD FINAL FORM
+FEBB		ARABIC LETTER SAD INITIAL FORM
+FEBC		ARABIC LETTER SAD MEDIAL FORM
+FEBD		ARABIC LETTER DAD ISOLATED FORM
+FEBE		ARABIC LETTER DAD FINAL FORM
+FEBF		ARABIC LETTER DAD INITIAL FORM
+FEC0		ARABIC LETTER DAD MEDIAL FORM
+FEC1		ARABIC LETTER TAH ISOLATED FORM
+FEC2		ARABIC LETTER TAH FINAL FORM
+FEC3		ARABIC LETTER TAH INITIAL FORM
+FEC4		ARABIC LETTER TAH MEDIAL FORM
+FEC5		ARABIC LETTER ZAH ISOLATED FORM
+FEC6		ARABIC LETTER ZAH FINAL FORM
+FEC7		ARABIC LETTER ZAH INITIAL FORM
+FEC8		ARABIC LETTER ZAH MEDIAL FORM
+FEC9		ARABIC LETTER AIN ISOLATED FORM
+FECA		ARABIC LETTER AIN FINAL FORM
+FECB		ARABIC LETTER AIN INITIAL FORM
+FECC		ARABIC LETTER AIN MEDIAL FORM
+FECD		ARABIC LETTER GHAIN ISOLATED FORM
+FECE		ARABIC LETTER GHAIN FINAL FORM
+FECF		ARABIC LETTER GHAIN INITIAL FORM
+FED0		ARABIC LETTER GHAIN MEDIAL FORM
+FED1		ARABIC LETTER FEH ISOLATED FORM
+FED2		ARABIC LETTER FEH FINAL FORM
+FED3		ARABIC LETTER FEH INITIAL FORM
+FED4		ARABIC LETTER FEH MEDIAL FORM
+FED5		ARABIC LETTER QAF ISOLATED FORM
+FED6		ARABIC LETTER QAF FINAL FORM
+FED7		ARABIC LETTER QAF INITIAL FORM
+FED8		ARABIC LETTER QAF MEDIAL FORM
+FED9		ARABIC LETTER KAF ISOLATED FORM
+FEDA		ARABIC LETTER KAF FINAL FORM
+FEDB		ARABIC LETTER KAF INITIAL FORM
+FEDC		ARABIC LETTER KAF MEDIAL FORM
+FEDD		ARABIC LETTER LAM ISOLATED FORM
+FEDE		ARABIC LETTER LAM FINAL FORM
+FEDF		ARABIC LETTER LAM INITIAL FORM
+FEE0		ARABIC LETTER LAM MEDIAL FORM
+FEE1		ARABIC LETTER MEEM ISOLATED FORM
+FEE2		ARABIC LETTER MEEM FINAL FORM
+FEE3		ARABIC LETTER MEEM INITIAL FORM
+FEE4		ARABIC LETTER MEEM MEDIAL FORM
+FEE5		ARABIC LETTER NOON ISOLATED FORM
+FEE6		ARABIC LETTER NOON FINAL FORM
+FEE7		ARABIC LETTER NOON INITIAL FORM
+FEE8		ARABIC LETTER NOON MEDIAL FORM
+FEE9		ARABIC LETTER HEH ISOLATED FORM
+FEEA		ARABIC LETTER HEH FINAL FORM
+FEEB		ARABIC LETTER HEH INITIAL FORM
+FEEC		ARABIC LETTER HEH MEDIAL FORM
+FEED		ARABIC LETTER WAW ISOLATED FORM
+FEEE		ARABIC LETTER WAW FINAL FORM
+FEEF		ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+FEF0		ARABIC LETTER ALEF MAKSURA FINAL FORM
+FEF1		ARABIC LETTER YEH ISOLATED FORM
+FEF2		ARABIC LETTER YEH FINAL FORM
+FEF3		ARABIC LETTER YEH INITIAL FORM
+FEF4		ARABIC LETTER YEH MEDIAL FORM
+FEF5		ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+FEF6		ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+FEF7		ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+FEF8		ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+FEF9		ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+FEFA		ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+FEFB		ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+FEFC		ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFF		ZERO WIDTH NO-BREAK SPACE
+FF01		FULLWIDTH EXCLAMATION MARK
+FF02		FULLWIDTH QUOTATION MARK
+FF03		FULLWIDTH NUMBER SIGN
+FF04		FULLWIDTH DOLLAR SIGN
+FF05		FULLWIDTH PERCENT SIGN
+FF06		FULLWIDTH AMPERSAND
+FF07		FULLWIDTH APOSTROPHE
+FF08		FULLWIDTH LEFT PARENTHESIS
+FF09		FULLWIDTH RIGHT PARENTHESIS
+FF0A		FULLWIDTH ASTERISK
+FF0B		FULLWIDTH PLUS SIGN
+FF0C		FULLWIDTH COMMA
+FF0D		FULLWIDTH HYPHEN-MINUS
+FF0E		FULLWIDTH FULL STOP
+FF0F		FULLWIDTH SOLIDUS
+FF10		FULLWIDTH DIGIT ZERO
+FF11		FULLWIDTH DIGIT ONE
+FF12		FULLWIDTH DIGIT TWO
+FF13		FULLWIDTH DIGIT THREE
+FF14		FULLWIDTH DIGIT FOUR
+FF15		FULLWIDTH DIGIT FIVE
+FF16		FULLWIDTH DIGIT SIX
+FF17		FULLWIDTH DIGIT SEVEN
+FF18		FULLWIDTH DIGIT EIGHT
+FF19		FULLWIDTH DIGIT NINE
+FF1A		FULLWIDTH COLON
+FF1B		FULLWIDTH SEMICOLON
+FF1C		FULLWIDTH LESS-THAN SIGN
+FF1D		FULLWIDTH EQUALS SIGN
+FF1E		FULLWIDTH GREATER-THAN SIGN
+FF1F		FULLWIDTH QUESTION MARK
+FF20		FULLWIDTH COMMERCIAL AT
+FF21		FULLWIDTH LATIN CAPITAL LETTER A
+FF22		FULLWIDTH LATIN CAPITAL LETTER B
+FF23		FULLWIDTH LATIN CAPITAL LETTER C
+FF24		FULLWIDTH LATIN CAPITAL LETTER D
+FF25		FULLWIDTH LATIN CAPITAL LETTER E
+FF26		FULLWIDTH LATIN CAPITAL LETTER F
+FF27		FULLWIDTH LATIN CAPITAL LETTER G
+FF28		FULLWIDTH LATIN CAPITAL LETTER H
+FF29		FULLWIDTH LATIN CAPITAL LETTER I
+FF2A		FULLWIDTH LATIN CAPITAL LETTER J
+FF2B		FULLWIDTH LATIN CAPITAL LETTER K
+FF2C		FULLWIDTH LATIN CAPITAL LETTER L
+FF2D		FULLWIDTH LATIN CAPITAL LETTER M
+FF2E		FULLWIDTH LATIN CAPITAL LETTER N
+FF2F		FULLWIDTH LATIN CAPITAL LETTER O
+FF30		FULLWIDTH LATIN CAPITAL LETTER P
+FF31		FULLWIDTH LATIN CAPITAL LETTER Q
+FF32		FULLWIDTH LATIN CAPITAL LETTER R
+FF33		FULLWIDTH LATIN CAPITAL LETTER S
+FF34		FULLWIDTH LATIN CAPITAL LETTER T
+FF35		FULLWIDTH LATIN CAPITAL LETTER U
+FF36		FULLWIDTH LATIN CAPITAL LETTER V
+FF37		FULLWIDTH LATIN CAPITAL LETTER W
+FF38		FULLWIDTH LATIN CAPITAL LETTER X
+FF39		FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A		FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B		FULLWIDTH LEFT SQUARE BRACKET
+FF3C		FULLWIDTH REVERSE SOLIDUS
+FF3D		FULLWIDTH RIGHT SQUARE BRACKET
+FF3E		FULLWIDTH CIRCUMFLEX ACCENT
+FF3F		FULLWIDTH LOW LINE
+FF40		FULLWIDTH GRAVE ACCENT
+FF41		FULLWIDTH LATIN SMALL LETTER A
+FF42		FULLWIDTH LATIN SMALL LETTER B
+FF43		FULLWIDTH LATIN SMALL LETTER C
+FF44		FULLWIDTH LATIN SMALL LETTER D
+FF45		FULLWIDTH LATIN SMALL LETTER E
+FF46		FULLWIDTH LATIN SMALL LETTER F
+FF47		FULLWIDTH LATIN SMALL LETTER G
+FF48		FULLWIDTH LATIN SMALL LETTER H
+FF49		FULLWIDTH LATIN SMALL LETTER I
+FF4A		FULLWIDTH LATIN SMALL LETTER J
+FF4B		FULLWIDTH LATIN SMALL LETTER K
+FF4C		FULLWIDTH LATIN SMALL LETTER L
+FF4D		FULLWIDTH LATIN SMALL LETTER M
+FF4E		FULLWIDTH LATIN SMALL LETTER N
+FF4F		FULLWIDTH LATIN SMALL LETTER O
+FF50		FULLWIDTH LATIN SMALL LETTER P
+FF51		FULLWIDTH LATIN SMALL LETTER Q
+FF52		FULLWIDTH LATIN SMALL LETTER R
+FF53		FULLWIDTH LATIN SMALL LETTER S
+FF54		FULLWIDTH LATIN SMALL LETTER T
+FF55		FULLWIDTH LATIN SMALL LETTER U
+FF56		FULLWIDTH LATIN SMALL LETTER V
+FF57		FULLWIDTH LATIN SMALL LETTER W
+FF58		FULLWIDTH LATIN SMALL LETTER X
+FF59		FULLWIDTH LATIN SMALL LETTER Y
+FF5A		FULLWIDTH LATIN SMALL LETTER Z
+FF5B		FULLWIDTH LEFT CURLY BRACKET
+FF5C		FULLWIDTH VERTICAL LINE
+FF5D		FULLWIDTH RIGHT CURLY BRACKET
+FF5E		FULLWIDTH TILDE
+FF5F		FULLWIDTH LEFT WHITE PARENTHESIS
+FF60		FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61		HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62		HALFWIDTH LEFT CORNER BRACKET
+FF63		HALFWIDTH RIGHT CORNER BRACKET
+FF64		HALFWIDTH IDEOGRAPHIC COMMA
+FF65		HALFWIDTH KATAKANA MIDDLE DOT
+FF66		HALFWIDTH KATAKANA LETTER WO
+FF67		HALFWIDTH KATAKANA LETTER SMALL A
+FF68		HALFWIDTH KATAKANA LETTER SMALL I
+FF69		HALFWIDTH KATAKANA LETTER SMALL U
+FF6A		HALFWIDTH KATAKANA LETTER SMALL E
+FF6B		HALFWIDTH KATAKANA LETTER SMALL O
+FF6C		HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D		HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E		HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F		HALFWIDTH KATAKANA LETTER SMALL TU
+FF70		HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71		HALFWIDTH KATAKANA LETTER A
+FF72		HALFWIDTH KATAKANA LETTER I
+FF73		HALFWIDTH KATAKANA LETTER U
+FF74		HALFWIDTH KATAKANA LETTER E
+FF75		HALFWIDTH KATAKANA LETTER O
+FF76		HALFWIDTH KATAKANA LETTER KA
+FF77		HALFWIDTH KATAKANA LETTER KI
+FF78		HALFWIDTH KATAKANA LETTER KU
+FF79		HALFWIDTH KATAKANA LETTER KE
+FF7A		HALFWIDTH KATAKANA LETTER KO
+FF7B		HALFWIDTH KATAKANA LETTER SA
+FF7C		HALFWIDTH KATAKANA LETTER SI
+FF7D		HALFWIDTH KATAKANA LETTER SU
+FF7E		HALFWIDTH KATAKANA LETTER SE
+FF7F		HALFWIDTH KATAKANA LETTER SO
+FF80		HALFWIDTH KATAKANA LETTER TA
+FF81		HALFWIDTH KATAKANA LETTER TI
+FF82		HALFWIDTH KATAKANA LETTER TU
+FF83		HALFWIDTH KATAKANA LETTER TE
+FF84		HALFWIDTH KATAKANA LETTER TO
+FF85		HALFWIDTH KATAKANA LETTER NA
+FF86		HALFWIDTH KATAKANA LETTER NI
+FF87		HALFWIDTH KATAKANA LETTER NU
+FF88		HALFWIDTH KATAKANA LETTER NE
+FF89		HALFWIDTH KATAKANA LETTER NO
+FF8A		HALFWIDTH KATAKANA LETTER HA
+FF8B		HALFWIDTH KATAKANA LETTER HI
+FF8C		HALFWIDTH KATAKANA LETTER HU
+FF8D		HALFWIDTH KATAKANA LETTER HE
+FF8E		HALFWIDTH KATAKANA LETTER HO
+FF8F		HALFWIDTH KATAKANA LETTER MA
+FF90		HALFWIDTH KATAKANA LETTER MI
+FF91		HALFWIDTH KATAKANA LETTER MU
+FF92		HALFWIDTH KATAKANA LETTER ME
+FF93		HALFWIDTH KATAKANA LETTER MO
+FF94		HALFWIDTH KATAKANA LETTER YA
+FF95		HALFWIDTH KATAKANA LETTER YU
+FF96		HALFWIDTH KATAKANA LETTER YO
+FF97		HALFWIDTH KATAKANA LETTER RA
+FF98		HALFWIDTH KATAKANA LETTER RI
+FF99		HALFWIDTH KATAKANA LETTER RU
+FF9A		HALFWIDTH KATAKANA LETTER RE
+FF9B		HALFWIDTH KATAKANA LETTER RO
+FF9C		HALFWIDTH KATAKANA LETTER WA
+FF9D		HALFWIDTH KATAKANA LETTER N
+FF9E		HALFWIDTH KATAKANA VOICED SOUND MARK
+FF9F		HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0		HALFWIDTH HANGUL FILLER
+FFA1		HALFWIDTH HANGUL LETTER KIYEOK
+FFA2		HALFWIDTH HANGUL LETTER SSANGKIYEOK
+FFA3		HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+FFA4		HALFWIDTH HANGUL LETTER NIEUN
+FFA5		HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+FFA6		HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+FFA7		HALFWIDTH HANGUL LETTER TIKEUT
+FFA8		HALFWIDTH HANGUL LETTER SSANGTIKEUT
+FFA9		HALFWIDTH HANGUL LETTER RIEUL
+FFAA		HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+FFAB		HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+FFAC		HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+FFAD		HALFWIDTH HANGUL LETTER RIEUL-SIOS
+FFAE		HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+FFAF		HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+FFB0		HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+FFB1		HALFWIDTH HANGUL LETTER MIEUM
+FFB2		HALFWIDTH HANGUL LETTER PIEUP
+FFB3		HALFWIDTH HANGUL LETTER SSANGPIEUP
+FFB4		HALFWIDTH HANGUL LETTER PIEUP-SIOS
+FFB5		HALFWIDTH HANGUL LETTER SIOS
+FFB6		HALFWIDTH HANGUL LETTER SSANGSIOS
+FFB7		HALFWIDTH HANGUL LETTER IEUNG
+FFB8		HALFWIDTH HANGUL LETTER CIEUC
+FFB9		HALFWIDTH HANGUL LETTER SSANGCIEUC
+FFBA		HALFWIDTH HANGUL LETTER CHIEUCH
+FFBB		HALFWIDTH HANGUL LETTER KHIEUKH
+FFBC		HALFWIDTH HANGUL LETTER THIEUTH
+FFBD		HALFWIDTH HANGUL LETTER PHIEUPH
+FFBE		HALFWIDTH HANGUL LETTER HIEUH
+FFC2		HALFWIDTH HANGUL LETTER A
+FFC3		HALFWIDTH HANGUL LETTER AE
+FFC4		HALFWIDTH HANGUL LETTER YA
+FFC5		HALFWIDTH HANGUL LETTER YAE
+FFC6		HALFWIDTH HANGUL LETTER EO
+FFC7		HALFWIDTH HANGUL LETTER E
+FFCA		HALFWIDTH HANGUL LETTER YEO
+FFCB		HALFWIDTH HANGUL LETTER YE
+FFCC		HALFWIDTH HANGUL LETTER O
+FFCD		HALFWIDTH HANGUL LETTER WA
+FFCE		HALFWIDTH HANGUL LETTER WAE
+FFCF		HALFWIDTH HANGUL LETTER OE
+FFD2		HALFWIDTH HANGUL LETTER YO
+FFD3		HALFWIDTH HANGUL LETTER U
+FFD4		HALFWIDTH HANGUL LETTER WEO
+FFD5		HALFWIDTH HANGUL LETTER WE
+FFD6		HALFWIDTH HANGUL LETTER WI
+FFD7		HALFWIDTH HANGUL LETTER YU
+FFDA		HALFWIDTH HANGUL LETTER EU
+FFDB		HALFWIDTH HANGUL LETTER YI
+FFDC		HALFWIDTH HANGUL LETTER I
+FFE0		FULLWIDTH CENT SIGN
+FFE1		FULLWIDTH POUND SIGN
+FFE2		FULLWIDTH NOT SIGN
+FFE3		FULLWIDTH MACRON
+FFE4		FULLWIDTH BROKEN BAR
+FFE5		FULLWIDTH YEN SIGN
+FFE6		FULLWIDTH WON SIGN
+FFE8		HALFWIDTH FORMS LIGHT VERTICAL
+FFE9		HALFWIDTH LEFTWARDS ARROW
+FFEA		HALFWIDTH UPWARDS ARROW
+FFEB		HALFWIDTH RIGHTWARDS ARROW
+FFEC		HALFWIDTH DOWNWARDS ARROW
+FFED		HALFWIDTH BLACK SQUARE
+FFEE		HALFWIDTH WHITE CIRCLE
+FFF9		INTERLINEAR ANNOTATION ANCHOR
+FFFA		INTERLINEAR ANNOTATION SEPARATOR
+FFFB		INTERLINEAR ANNOTATION TERMINATOR
+FFFC		OBJECT REPLACEMENT CHARACTER
+FFFD		REPLACEMENT CHARACTER
+10000		LINEAR B SYLLABLE B008 A
+10001		LINEAR B SYLLABLE B038 E
+10002		LINEAR B SYLLABLE B028 I
+10003		LINEAR B SYLLABLE B061 O
+10004		LINEAR B SYLLABLE B010 U
+10005		LINEAR B SYLLABLE B001 DA
+10006		LINEAR B SYLLABLE B045 DE
+10007		LINEAR B SYLLABLE B007 DI
+10008		LINEAR B SYLLABLE B014 DO
+10009		LINEAR B SYLLABLE B051 DU
+1000A		LINEAR B SYLLABLE B057 JA
+1000B		LINEAR B SYLLABLE B046 JE
+1000D		LINEAR B SYLLABLE B036 JO
+1000E		LINEAR B SYLLABLE B065 JU
+1000F		LINEAR B SYLLABLE B077 KA
+10010		LINEAR B SYLLABLE B044 KE
+10011		LINEAR B SYLLABLE B067 KI
+10012		LINEAR B SYLLABLE B070 KO
+10013		LINEAR B SYLLABLE B081 KU
+10014		LINEAR B SYLLABLE B080 MA
+10015		LINEAR B SYLLABLE B013 ME
+10016		LINEAR B SYLLABLE B073 MI
+10017		LINEAR B SYLLABLE B015 MO
+10018		LINEAR B SYLLABLE B023 MU
+10019		LINEAR B SYLLABLE B006 NA
+1001A		LINEAR B SYLLABLE B024 NE
+1001B		LINEAR B SYLLABLE B030 NI
+1001C		LINEAR B SYLLABLE B052 NO
+1001D		LINEAR B SYLLABLE B055 NU
+1001E		LINEAR B SYLLABLE B003 PA
+1001F		LINEAR B SYLLABLE B072 PE
+10020		LINEAR B SYLLABLE B039 PI
+10021		LINEAR B SYLLABLE B011 PO
+10022		LINEAR B SYLLABLE B050 PU
+10023		LINEAR B SYLLABLE B016 QA
+10024		LINEAR B SYLLABLE B078 QE
+10025		LINEAR B SYLLABLE B021 QI
+10026		LINEAR B SYLLABLE B032 QO
+10028		LINEAR B SYLLABLE B060 RA
+10029		LINEAR B SYLLABLE B027 RE
+1002A		LINEAR B SYLLABLE B053 RI
+1002B		LINEAR B SYLLABLE B002 RO
+1002C		LINEAR B SYLLABLE B026 RU
+1002D		LINEAR B SYLLABLE B031 SA
+1002E		LINEAR B SYLLABLE B009 SE
+1002F		LINEAR B SYLLABLE B041 SI
+10030		LINEAR B SYLLABLE B012 SO
+10031		LINEAR B SYLLABLE B058 SU
+10032		LINEAR B SYLLABLE B059 TA
+10033		LINEAR B SYLLABLE B004 TE
+10034		LINEAR B SYLLABLE B037 TI
+10035		LINEAR B SYLLABLE B005 TO
+10036		LINEAR B SYLLABLE B069 TU
+10037		LINEAR B SYLLABLE B054 WA
+10038		LINEAR B SYLLABLE B075 WE
+10039		LINEAR B SYLLABLE B040 WI
+1003A		LINEAR B SYLLABLE B042 WO
+1003C		LINEAR B SYLLABLE B017 ZA
+1003D		LINEAR B SYLLABLE B074 ZE
+1003F		LINEAR B SYLLABLE B020 ZO
+10040		LINEAR B SYLLABLE B025 A2
+10041		LINEAR B SYLLABLE B043 A3
+10042		LINEAR B SYLLABLE B085 AU
+10043		LINEAR B SYLLABLE B071 DWE
+10044		LINEAR B SYLLABLE B090 DWO
+10045		LINEAR B SYLLABLE B048 NWA
+10046		LINEAR B SYLLABLE B029 PU2
+10047		LINEAR B SYLLABLE B062 PTE
+10048		LINEAR B SYLLABLE B076 RA2
+10049		LINEAR B SYLLABLE B033 RA3
+1004A		LINEAR B SYLLABLE B068 RO2
+1004B		LINEAR B SYLLABLE B066 TA2
+1004C		LINEAR B SYLLABLE B087 TWE
+1004D		LINEAR B SYLLABLE B091 TWO
+10050		LINEAR B SYMBOL B018
+10051		LINEAR B SYMBOL B019
+10052		LINEAR B SYMBOL B022
+10053		LINEAR B SYMBOL B034
+10054		LINEAR B SYMBOL B047
+10055		LINEAR B SYMBOL B049
+10056		LINEAR B SYMBOL B056
+10057		LINEAR B SYMBOL B063
+10058		LINEAR B SYMBOL B064
+10059		LINEAR B SYMBOL B079
+1005A		LINEAR B SYMBOL B082
+1005B		LINEAR B SYMBOL B083
+1005C		LINEAR B SYMBOL B086
+1005D		LINEAR B SYMBOL B089
+10080		LINEAR B IDEOGRAM B100 MAN
+10081		LINEAR B IDEOGRAM B102 WOMAN
+10082		LINEAR B IDEOGRAM B104 DEER
+10083		LINEAR B IDEOGRAM B105 EQUID
+10084		LINEAR B IDEOGRAM B105F MARE
+10085		LINEAR B IDEOGRAM B105M STALLION
+10086		LINEAR B IDEOGRAM B106F EWE
+10087		LINEAR B IDEOGRAM B106M RAM
+10088		LINEAR B IDEOGRAM B107F SHE-GOAT
+10089		LINEAR B IDEOGRAM B107M HE-GOAT
+1008A		LINEAR B IDEOGRAM B108F SOW
+1008B		LINEAR B IDEOGRAM B108M BOAR
+1008C		LINEAR B IDEOGRAM B109F COW
+1008D		LINEAR B IDEOGRAM B109M BULL
+1008E		LINEAR B IDEOGRAM B120 WHEAT
+1008F		LINEAR B IDEOGRAM B121 BARLEY
+10090		LINEAR B IDEOGRAM B122 OLIVE
+10091		LINEAR B IDEOGRAM B123 SPICE
+10092		LINEAR B IDEOGRAM B125 CYPERUS
+10093		LINEAR B MONOGRAM B127 KAPO
+10094		LINEAR B MONOGRAM B128 KANAKO
+10095		LINEAR B IDEOGRAM B130 OIL
+10096		LINEAR B IDEOGRAM B131 WINE
+10097		LINEAR B IDEOGRAM B132
+10098		LINEAR B MONOGRAM B133 AREPA
+10099		LINEAR B MONOGRAM B135 MERI
+1009A		LINEAR B IDEOGRAM B140 BRONZE
+1009B		LINEAR B IDEOGRAM B141 GOLD
+1009C		LINEAR B IDEOGRAM B142
+1009D		LINEAR B IDEOGRAM B145 WOOL
+1009E		LINEAR B IDEOGRAM B146
+1009F		LINEAR B IDEOGRAM B150
+100A0		LINEAR B IDEOGRAM B151 HORN
+100A1		LINEAR B IDEOGRAM B152
+100A2		LINEAR B IDEOGRAM B153
+100A3		LINEAR B IDEOGRAM B154
+100A4		LINEAR B MONOGRAM B156 TURO2
+100A5		LINEAR B IDEOGRAM B157
+100A6		LINEAR B IDEOGRAM B158
+100A7		LINEAR B IDEOGRAM B159 CLOTH
+100A8		LINEAR B IDEOGRAM B160
+100A9		LINEAR B IDEOGRAM B161
+100AA		LINEAR B IDEOGRAM B162 GARMENT
+100AB		LINEAR B IDEOGRAM B163 ARMOUR
+100AC		LINEAR B IDEOGRAM B164
+100AD		LINEAR B IDEOGRAM B165
+100AE		LINEAR B IDEOGRAM B166
+100AF		LINEAR B IDEOGRAM B167
+100B0		LINEAR B IDEOGRAM B168
+100B1		LINEAR B IDEOGRAM B169
+100B2		LINEAR B IDEOGRAM B170
+100B3		LINEAR B IDEOGRAM B171
+100B4		LINEAR B IDEOGRAM B172
+100B5		LINEAR B IDEOGRAM B173 MONTH
+100B6		LINEAR B IDEOGRAM B174
+100B7		LINEAR B IDEOGRAM B176 TREE
+100B8		LINEAR B IDEOGRAM B177
+100B9		LINEAR B IDEOGRAM B178
+100BA		LINEAR B IDEOGRAM B179
+100BB		LINEAR B IDEOGRAM B180
+100BC		LINEAR B IDEOGRAM B181
+100BD		LINEAR B IDEOGRAM B182
+100BE		LINEAR B IDEOGRAM B183
+100BF		LINEAR B IDEOGRAM B184
+100C0		LINEAR B IDEOGRAM B185
+100C1		LINEAR B IDEOGRAM B189
+100C2		LINEAR B IDEOGRAM B190
+100C3		LINEAR B IDEOGRAM B191 HELMET
+100C4		LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5		LINEAR B IDEOGRAM B225 BATHTUB
+100C6		LINEAR B IDEOGRAM B230 SPEAR
+100C7		LINEAR B IDEOGRAM B231 ARROW
+100C8		LINEAR B IDEOGRAM B232
+100C9		LINEAR B IDEOGRAM B233 SWORD
+100CA		LINEAR B IDEOGRAM B234
+100CB		LINEAR B IDEOGRAM B236
+100CC		LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD		LINEAR B IDEOGRAM B241 CHARIOT
+100CE		LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF		LINEAR B IDEOGRAM B243 WHEEL
+100D0		LINEAR B IDEOGRAM B245
+100D1		LINEAR B IDEOGRAM B246
+100D2		LINEAR B MONOGRAM B247 DIPTE
+100D3		LINEAR B IDEOGRAM B248
+100D4		LINEAR B IDEOGRAM B249
+100D5		LINEAR B IDEOGRAM B251
+100D6		LINEAR B IDEOGRAM B252
+100D7		LINEAR B IDEOGRAM B253
+100D8		LINEAR B IDEOGRAM B254 DART
+100D9		LINEAR B IDEOGRAM B255
+100DA		LINEAR B IDEOGRAM B256
+100DB		LINEAR B IDEOGRAM B257
+100DC		LINEAR B IDEOGRAM B258
+100DD		LINEAR B IDEOGRAM B259
+100DE		LINEAR B IDEOGRAM VESSEL B155
+100DF		LINEAR B IDEOGRAM VESSEL B200
+100E0		LINEAR B IDEOGRAM VESSEL B201
+100E1		LINEAR B IDEOGRAM VESSEL B202
+100E2		LINEAR B IDEOGRAM VESSEL B203
+100E3		LINEAR B IDEOGRAM VESSEL B204
+100E4		LINEAR B IDEOGRAM VESSEL B205
+100E5		LINEAR B IDEOGRAM VESSEL B206
+100E6		LINEAR B IDEOGRAM VESSEL B207
+100E7		LINEAR B IDEOGRAM VESSEL B208
+100E8		LINEAR B IDEOGRAM VESSEL B209
+100E9		LINEAR B IDEOGRAM VESSEL B210
+100EA		LINEAR B IDEOGRAM VESSEL B211
+100EB		LINEAR B IDEOGRAM VESSEL B212
+100EC		LINEAR B IDEOGRAM VESSEL B213
+100ED		LINEAR B IDEOGRAM VESSEL B214
+100EE		LINEAR B IDEOGRAM VESSEL B215
+100EF		LINEAR B IDEOGRAM VESSEL B216
+100F0		LINEAR B IDEOGRAM VESSEL B217
+100F1		LINEAR B IDEOGRAM VESSEL B218
+100F2		LINEAR B IDEOGRAM VESSEL B219
+100F3		LINEAR B IDEOGRAM VESSEL B221
+100F4		LINEAR B IDEOGRAM VESSEL B222
+100F5		LINEAR B IDEOGRAM VESSEL B226
+100F6		LINEAR B IDEOGRAM VESSEL B227
+100F7		LINEAR B IDEOGRAM VESSEL B228
+100F8		LINEAR B IDEOGRAM VESSEL B229
+100F9		LINEAR B IDEOGRAM VESSEL B250
+100FA		LINEAR B IDEOGRAM VESSEL B305
+10100		AEGEAN WORD SEPARATOR LINE
+10101		AEGEAN WORD SEPARATOR DOT
+10102		AEGEAN CHECK MARK
+10107		AEGEAN NUMBER ONE
+10108		AEGEAN NUMBER TWO
+10109		AEGEAN NUMBER THREE
+1010A		AEGEAN NUMBER FOUR
+1010B		AEGEAN NUMBER FIVE
+1010C		AEGEAN NUMBER SIX
+1010D		AEGEAN NUMBER SEVEN
+1010E		AEGEAN NUMBER EIGHT
+1010F		AEGEAN NUMBER NINE
+10110		AEGEAN NUMBER TEN
+10111		AEGEAN NUMBER TWENTY
+10112		AEGEAN NUMBER THIRTY
+10113		AEGEAN NUMBER FORTY
+10114		AEGEAN NUMBER FIFTY
+10115		AEGEAN NUMBER SIXTY
+10116		AEGEAN NUMBER SEVENTY
+10117		AEGEAN NUMBER EIGHTY
+10118		AEGEAN NUMBER NINETY
+10119		AEGEAN NUMBER ONE HUNDRED
+1011A		AEGEAN NUMBER TWO HUNDRED
+1011B		AEGEAN NUMBER THREE HUNDRED
+1011C		AEGEAN NUMBER FOUR HUNDRED
+1011D		AEGEAN NUMBER FIVE HUNDRED
+1011E		AEGEAN NUMBER SIX HUNDRED
+1011F		AEGEAN NUMBER SEVEN HUNDRED
+10120		AEGEAN NUMBER EIGHT HUNDRED
+10121		AEGEAN NUMBER NINE HUNDRED
+10122		AEGEAN NUMBER ONE THOUSAND
+10123		AEGEAN NUMBER TWO THOUSAND
+10124		AEGEAN NUMBER THREE THOUSAND
+10125		AEGEAN NUMBER FOUR THOUSAND
+10126		AEGEAN NUMBER FIVE THOUSAND
+10127		AEGEAN NUMBER SIX THOUSAND
+10128		AEGEAN NUMBER SEVEN THOUSAND
+10129		AEGEAN NUMBER EIGHT THOUSAND
+1012A		AEGEAN NUMBER NINE THOUSAND
+1012B		AEGEAN NUMBER TEN THOUSAND
+1012C		AEGEAN NUMBER TWENTY THOUSAND
+1012D		AEGEAN NUMBER THIRTY THOUSAND
+1012E		AEGEAN NUMBER FORTY THOUSAND
+1012F		AEGEAN NUMBER FIFTY THOUSAND
+10130		AEGEAN NUMBER SIXTY THOUSAND
+10131		AEGEAN NUMBER SEVENTY THOUSAND
+10132		AEGEAN NUMBER EIGHTY THOUSAND
+10133		AEGEAN NUMBER NINETY THOUSAND
+10137		AEGEAN WEIGHT BASE UNIT
+10138		AEGEAN WEIGHT FIRST SUBUNIT
+10139		AEGEAN WEIGHT SECOND SUBUNIT
+1013A		AEGEAN WEIGHT THIRD SUBUNIT
+1013B		AEGEAN WEIGHT FOURTH SUBUNIT
+1013C		AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D		AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E		AEGEAN MEASURE SECOND SUBUNIT
+1013F		AEGEAN MEASURE THIRD SUBUNIT
+10140		GREEK ACROPHONIC ATTIC ONE QUARTER
+10141		GREEK ACROPHONIC ATTIC ONE HALF
+10142		GREEK ACROPHONIC ATTIC ONE DRACHMA
+10143		GREEK ACROPHONIC ATTIC FIVE
+10144		GREEK ACROPHONIC ATTIC FIFTY
+10145		GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146		GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147		GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10148		GREEK ACROPHONIC ATTIC FIVE TALENTS
+10149		GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A		GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B		GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C		GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D		GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E		GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+1014F		GREEK ACROPHONIC ATTIC FIVE STATERS
+10150		GREEK ACROPHONIC ATTIC TEN STATERS
+10151		GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152		GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153		GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154		GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155		GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156		GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157		GREEK ACROPHONIC ATTIC TEN MNAS
+10158		GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159		GREEK ACROPHONIC THESPIAN ONE
+1015A		GREEK ACROPHONIC HERMIONIAN ONE
+1015B		GREEK ACROPHONIC EPIDAUREAN TWO
+1015C		GREEK ACROPHONIC THESPIAN TWO
+1015D		GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E		GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+1015F		GREEK ACROPHONIC TROEZENIAN FIVE
+10160		GREEK ACROPHONIC TROEZENIAN TEN
+10161		GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162		GREEK ACROPHONIC HERMIONIAN TEN
+10163		GREEK ACROPHONIC MESSENIAN TEN
+10164		GREEK ACROPHONIC THESPIAN TEN
+10165		GREEK ACROPHONIC THESPIAN THIRTY
+10166		GREEK ACROPHONIC TROEZENIAN FIFTY
+10167		GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168		GREEK ACROPHONIC HERMIONIAN FIFTY
+10169		GREEK ACROPHONIC THESPIAN FIFTY
+1016A		GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B		GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C		GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D		GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E		GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F		GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170		GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171		GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172		GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10173		GREEK ACROPHONIC DELPHIC FIVE MNAS
+10174		GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175		GREEK ONE HALF SIGN
+10176		GREEK ONE HALF SIGN ALTERNATE FORM
+10177		GREEK TWO THIRDS SIGN
+10178		GREEK THREE QUARTERS SIGN
+10179		GREEK YEAR SIGN
+1017A		GREEK TALENT SIGN
+1017B		GREEK DRACHMA SIGN
+1017C		GREEK OBOL SIGN
+1017D		GREEK TWO OBOLS SIGN
+1017E		GREEK THREE OBOLS SIGN
+1017F		GREEK FOUR OBOLS SIGN
+10180		GREEK FIVE OBOLS SIGN
+10181		GREEK METRETES SIGN
+10182		GREEK KYATHOS BASE SIGN
+10183		GREEK LITRA SIGN
+10184		GREEK OUNKIA SIGN
+10185		GREEK XESTES SIGN
+10186		GREEK ARTABE SIGN
+10187		GREEK AROURA SIGN
+10188		GREEK GRAMMA SIGN
+10189		GREEK TRYBLION BASE SIGN
+1018A		GREEK ZERO SIGN
+10300		OLD ITALIC LETTER A
+10301		OLD ITALIC LETTER BE
+10302		OLD ITALIC LETTER KE
+10303		OLD ITALIC LETTER DE
+10304		OLD ITALIC LETTER E
+10305		OLD ITALIC LETTER VE
+10306		OLD ITALIC LETTER ZE
+10307		OLD ITALIC LETTER HE
+10308		OLD ITALIC LETTER THE
+10309		OLD ITALIC LETTER I
+1030A		OLD ITALIC LETTER KA
+1030B		OLD ITALIC LETTER EL
+1030C		OLD ITALIC LETTER EM
+1030D		OLD ITALIC LETTER EN
+1030E		OLD ITALIC LETTER ESH
+1030F		OLD ITALIC LETTER O
+10310		OLD ITALIC LETTER PE
+10311		OLD ITALIC LETTER SHE
+10312		OLD ITALIC LETTER KU
+10313		OLD ITALIC LETTER ER
+10314		OLD ITALIC LETTER ES
+10315		OLD ITALIC LETTER TE
+10316		OLD ITALIC LETTER U
+10317		OLD ITALIC LETTER EKS
+10318		OLD ITALIC LETTER PHE
+10319		OLD ITALIC LETTER KHE
+1031A		OLD ITALIC LETTER EF
+1031B		OLD ITALIC LETTER ERS
+1031C		OLD ITALIC LETTER CHE
+1031D		OLD ITALIC LETTER II
+1031E		OLD ITALIC LETTER UU
+10320		OLD ITALIC NUMERAL ONE
+10321		OLD ITALIC NUMERAL FIVE
+10322		OLD ITALIC NUMERAL TEN
+10323		OLD ITALIC NUMERAL FIFTY
+10330		GOTHIC LETTER AHSA
+10331		GOTHIC LETTER BAIRKAN
+10332		GOTHIC LETTER GIBA
+10333		GOTHIC LETTER DAGS
+10334		GOTHIC LETTER AIHVUS
+10335		GOTHIC LETTER QAIRTHRA
+10336		GOTHIC LETTER IUJA
+10337		GOTHIC LETTER HAGL
+10338		GOTHIC LETTER THIUTH
+10339		GOTHIC LETTER EIS
+1033A		GOTHIC LETTER KUSMA
+1033B		GOTHIC LETTER LAGUS
+1033C		GOTHIC LETTER MANNA
+1033D		GOTHIC LETTER NAUTHS
+1033E		GOTHIC LETTER JER
+1033F		GOTHIC LETTER URUS
+10340		GOTHIC LETTER PAIRTHRA
+10341		GOTHIC LETTER NINETY
+10342		GOTHIC LETTER RAIDA
+10343		GOTHIC LETTER SAUIL
+10344		GOTHIC LETTER TEIWS
+10345		GOTHIC LETTER WINJA
+10346		GOTHIC LETTER FAIHU
+10347		GOTHIC LETTER IGGWS
+10348		GOTHIC LETTER HWAIR
+10349		GOTHIC LETTER OTHAL
+1034A		GOTHIC LETTER NINE HUNDRED
+10380		UGARITIC LETTER ALPA
+10381		UGARITIC LETTER BETA
+10382		UGARITIC LETTER GAMLA
+10383		UGARITIC LETTER KHA
+10384		UGARITIC LETTER DELTA
+10385		UGARITIC LETTER HO
+10386		UGARITIC LETTER WO
+10387		UGARITIC LETTER ZETA
+10388		UGARITIC LETTER HOTA
+10389		UGARITIC LETTER TET
+1038A		UGARITIC LETTER YOD
+1038B		UGARITIC LETTER KAF
+1038C		UGARITIC LETTER SHIN
+1038D		UGARITIC LETTER LAMDA
+1038E		UGARITIC LETTER MEM
+1038F		UGARITIC LETTER DHAL
+10390		UGARITIC LETTER NUN
+10391		UGARITIC LETTER ZU
+10392		UGARITIC LETTER SAMKA
+10393		UGARITIC LETTER AIN
+10394		UGARITIC LETTER PU
+10395		UGARITIC LETTER SADE
+10396		UGARITIC LETTER QOPA
+10397		UGARITIC LETTER RASHA
+10398		UGARITIC LETTER THANNA
+10399		UGARITIC LETTER GHAIN
+1039A		UGARITIC LETTER TO
+1039B		UGARITIC LETTER I
+1039C		UGARITIC LETTER U
+1039D		UGARITIC LETTER SSU
+1039F		UGARITIC WORD DIVIDER
+103A0		OLD PERSIAN SIGN A
+103A1		OLD PERSIAN SIGN I
+103A2		OLD PERSIAN SIGN U
+103A3		OLD PERSIAN SIGN KA
+103A4		OLD PERSIAN SIGN KU
+103A5		OLD PERSIAN SIGN GA
+103A6		OLD PERSIAN SIGN GU
+103A7		OLD PERSIAN SIGN XA
+103A8		OLD PERSIAN SIGN CA
+103A9		OLD PERSIAN SIGN JA
+103AA		OLD PERSIAN SIGN JI
+103AB		OLD PERSIAN SIGN TA
+103AC		OLD PERSIAN SIGN TU
+103AD		OLD PERSIAN SIGN DA
+103AE		OLD PERSIAN SIGN DI
+103AF		OLD PERSIAN SIGN DU
+103B0		OLD PERSIAN SIGN THA
+103B1		OLD PERSIAN SIGN PA
+103B2		OLD PERSIAN SIGN BA
+103B3		OLD PERSIAN SIGN FA
+103B4		OLD PERSIAN SIGN NA
+103B5		OLD PERSIAN SIGN NU
+103B6		OLD PERSIAN SIGN MA
+103B7		OLD PERSIAN SIGN MI
+103B8		OLD PERSIAN SIGN MU
+103B9		OLD PERSIAN SIGN YA
+103BA		OLD PERSIAN SIGN VA
+103BB		OLD PERSIAN SIGN VI
+103BC		OLD PERSIAN SIGN RA
+103BD		OLD PERSIAN SIGN RU
+103BE		OLD PERSIAN SIGN LA
+103BF		OLD PERSIAN SIGN SA
+103C0		OLD PERSIAN SIGN ZA
+103C1		OLD PERSIAN SIGN SHA
+103C2		OLD PERSIAN SIGN SSA
+103C3		OLD PERSIAN SIGN HA
+103C8		OLD PERSIAN SIGN AURAMAZDAA
+103C9		OLD PERSIAN SIGN AURAMAZDAA-2
+103CA		OLD PERSIAN SIGN AURAMAZDAAHA
+103CB		OLD PERSIAN SIGN XSHAAYATHIYA
+103CC		OLD PERSIAN SIGN DAHYAAUSH
+103CD		OLD PERSIAN SIGN DAHYAAUSH-2
+103CE		OLD PERSIAN SIGN BAGA
+103CF		OLD PERSIAN SIGN BUUMISH
+103D0		OLD PERSIAN WORD DIVIDER
+103D1		OLD PERSIAN NUMBER ONE
+103D2		OLD PERSIAN NUMBER TWO
+103D3		OLD PERSIAN NUMBER TEN
+103D4		OLD PERSIAN NUMBER TWENTY
+103D5		OLD PERSIAN NUMBER HUNDRED
+10400		DESERET CAPITAL LETTER LONG I
+10401		DESERET CAPITAL LETTER LONG E
+10402		DESERET CAPITAL LETTER LONG A
+10403		DESERET CAPITAL LETTER LONG AH
+10404		DESERET CAPITAL LETTER LONG O
+10405		DESERET CAPITAL LETTER LONG OO
+10406		DESERET CAPITAL LETTER SHORT I
+10407		DESERET CAPITAL LETTER SHORT E
+10408		DESERET CAPITAL LETTER SHORT A
+10409		DESERET CAPITAL LETTER SHORT AH
+1040A		DESERET CAPITAL LETTER SHORT O
+1040B		DESERET CAPITAL LETTER SHORT OO
+1040C		DESERET CAPITAL LETTER AY
+1040D		DESERET CAPITAL LETTER OW
+1040E		DESERET CAPITAL LETTER WU
+1040F		DESERET CAPITAL LETTER YEE
+10410		DESERET CAPITAL LETTER H
+10411		DESERET CAPITAL LETTER PEE
+10412		DESERET CAPITAL LETTER BEE
+10413		DESERET CAPITAL LETTER TEE
+10414		DESERET CAPITAL LETTER DEE
+10415		DESERET CAPITAL LETTER CHEE
+10416		DESERET CAPITAL LETTER JEE
+10417		DESERET CAPITAL LETTER KAY
+10418		DESERET CAPITAL LETTER GAY
+10419		DESERET CAPITAL LETTER EF
+1041A		DESERET CAPITAL LETTER VEE
+1041B		DESERET CAPITAL LETTER ETH
+1041C		DESERET CAPITAL LETTER THEE
+1041D		DESERET CAPITAL LETTER ES
+1041E		DESERET CAPITAL LETTER ZEE
+1041F		DESERET CAPITAL LETTER ESH
+10420		DESERET CAPITAL LETTER ZHEE
+10421		DESERET CAPITAL LETTER ER
+10422		DESERET CAPITAL LETTER EL
+10423		DESERET CAPITAL LETTER EM
+10424		DESERET CAPITAL LETTER EN
+10425		DESERET CAPITAL LETTER ENG
+10426		DESERET CAPITAL LETTER OI
+10427		DESERET CAPITAL LETTER EW
+10428		DESERET SMALL LETTER LONG I
+10429		DESERET SMALL LETTER LONG E
+1042A		DESERET SMALL LETTER LONG A
+1042B		DESERET SMALL LETTER LONG AH
+1042C		DESERET SMALL LETTER LONG O
+1042D		DESERET SMALL LETTER LONG OO
+1042E		DESERET SMALL LETTER SHORT I
+1042F		DESERET SMALL LETTER SHORT E
+10430		DESERET SMALL LETTER SHORT A
+10431		DESERET SMALL LETTER SHORT AH
+10432		DESERET SMALL LETTER SHORT O
+10433		DESERET SMALL LETTER SHORT OO
+10434		DESERET SMALL LETTER AY
+10435		DESERET SMALL LETTER OW
+10436		DESERET SMALL LETTER WU
+10437		DESERET SMALL LETTER YEE
+10438		DESERET SMALL LETTER H
+10439		DESERET SMALL LETTER PEE
+1043A		DESERET SMALL LETTER BEE
+1043B		DESERET SMALL LETTER TEE
+1043C		DESERET SMALL LETTER DEE
+1043D		DESERET SMALL LETTER CHEE
+1043E		DESERET SMALL LETTER JEE
+1043F		DESERET SMALL LETTER KAY
+10440		DESERET SMALL LETTER GAY
+10441		DESERET SMALL LETTER EF
+10442		DESERET SMALL LETTER VEE
+10443		DESERET SMALL LETTER ETH
+10444		DESERET SMALL LETTER THEE
+10445		DESERET SMALL LETTER ES
+10446		DESERET SMALL LETTER ZEE
+10447		DESERET SMALL LETTER ESH
+10448		DESERET SMALL LETTER ZHEE
+10449		DESERET SMALL LETTER ER
+1044A		DESERET SMALL LETTER EL
+1044B		DESERET SMALL LETTER EM
+1044C		DESERET SMALL LETTER EN
+1044D		DESERET SMALL LETTER ENG
+1044E		DESERET SMALL LETTER OI
+1044F		DESERET SMALL LETTER EW
+10450		SHAVIAN LETTER PEEP
+10451		SHAVIAN LETTER TOT
+10452		SHAVIAN LETTER KICK
+10453		SHAVIAN LETTER FEE
+10454		SHAVIAN LETTER THIGH
+10455		SHAVIAN LETTER SO
+10456		SHAVIAN LETTER SURE
+10457		SHAVIAN LETTER CHURCH
+10458		SHAVIAN LETTER YEA
+10459		SHAVIAN LETTER HUNG
+1045A		SHAVIAN LETTER BIB
+1045B		SHAVIAN LETTER DEAD
+1045C		SHAVIAN LETTER GAG
+1045D		SHAVIAN LETTER VOW
+1045E		SHAVIAN LETTER THEY
+1045F		SHAVIAN LETTER ZOO
+10460		SHAVIAN LETTER MEASURE
+10461		SHAVIAN LETTER JUDGE
+10462		SHAVIAN LETTER WOE
+10463		SHAVIAN LETTER HA-HA
+10464		SHAVIAN LETTER LOLL
+10465		SHAVIAN LETTER MIME
+10466		SHAVIAN LETTER IF
+10467		SHAVIAN LETTER EGG
+10468		SHAVIAN LETTER ASH
+10469		SHAVIAN LETTER ADO
+1046A		SHAVIAN LETTER ON
+1046B		SHAVIAN LETTER WOOL
+1046C		SHAVIAN LETTER OUT
+1046D		SHAVIAN LETTER AH
+1046E		SHAVIAN LETTER ROAR
+1046F		SHAVIAN LETTER NUN
+10470		SHAVIAN LETTER EAT
+10471		SHAVIAN LETTER AGE
+10472		SHAVIAN LETTER ICE
+10473		SHAVIAN LETTER UP
+10474		SHAVIAN LETTER OAK
+10475		SHAVIAN LETTER OOZE
+10476		SHAVIAN LETTER OIL
+10477		SHAVIAN LETTER AWE
+10478		SHAVIAN LETTER ARE
+10479		SHAVIAN LETTER OR
+1047A		SHAVIAN LETTER AIR
+1047B		SHAVIAN LETTER ERR
+1047C		SHAVIAN LETTER ARRAY
+1047D		SHAVIAN LETTER EAR
+1047E		SHAVIAN LETTER IAN
+1047F		SHAVIAN LETTER YEW
+10480		OSMANYA LETTER ALEF
+10481		OSMANYA LETTER BA
+10482		OSMANYA LETTER TA
+10483		OSMANYA LETTER JA
+10484		OSMANYA LETTER XA
+10485		OSMANYA LETTER KHA
+10486		OSMANYA LETTER DEEL
+10487		OSMANYA LETTER RA
+10488		OSMANYA LETTER SA
+10489		OSMANYA LETTER SHIIN
+1048A		OSMANYA LETTER DHA
+1048B		OSMANYA LETTER CAYN
+1048C		OSMANYA LETTER GA
+1048D		OSMANYA LETTER FA
+1048E		OSMANYA LETTER QAAF
+1048F		OSMANYA LETTER KAAF
+10490		OSMANYA LETTER LAAN
+10491		OSMANYA LETTER MIIN
+10492		OSMANYA LETTER NUUN
+10493		OSMANYA LETTER WAW
+10494		OSMANYA LETTER HA
+10495		OSMANYA LETTER YA
+10496		OSMANYA LETTER A
+10497		OSMANYA LETTER E
+10498		OSMANYA LETTER I
+10499		OSMANYA LETTER O
+1049A		OSMANYA LETTER U
+1049B		OSMANYA LETTER AA
+1049C		OSMANYA LETTER EE
+1049D		OSMANYA LETTER OO
+104A0		OSMANYA DIGIT ZERO
+104A1		OSMANYA DIGIT ONE
+104A2		OSMANYA DIGIT TWO
+104A3		OSMANYA DIGIT THREE
+104A4		OSMANYA DIGIT FOUR
+104A5		OSMANYA DIGIT FIVE
+104A6		OSMANYA DIGIT SIX
+104A7		OSMANYA DIGIT SEVEN
+104A8		OSMANYA DIGIT EIGHT
+104A9		OSMANYA DIGIT NINE
+10800		CYPRIOT SYLLABLE A
+10801		CYPRIOT SYLLABLE E
+10802		CYPRIOT SYLLABLE I
+10803		CYPRIOT SYLLABLE O
+10804		CYPRIOT SYLLABLE U
+10805		CYPRIOT SYLLABLE JA
+10808		CYPRIOT SYLLABLE JO
+1080A		CYPRIOT SYLLABLE KA
+1080B		CYPRIOT SYLLABLE KE
+1080C		CYPRIOT SYLLABLE KI
+1080D		CYPRIOT SYLLABLE KO
+1080E		CYPRIOT SYLLABLE KU
+1080F		CYPRIOT SYLLABLE LA
+10810		CYPRIOT SYLLABLE LE
+10811		CYPRIOT SYLLABLE LI
+10812		CYPRIOT SYLLABLE LO
+10813		CYPRIOT SYLLABLE LU
+10814		CYPRIOT SYLLABLE MA
+10815		CYPRIOT SYLLABLE ME
+10816		CYPRIOT SYLLABLE MI
+10817		CYPRIOT SYLLABLE MO
+10818		CYPRIOT SYLLABLE MU
+10819		CYPRIOT SYLLABLE NA
+1081A		CYPRIOT SYLLABLE NE
+1081B		CYPRIOT SYLLABLE NI
+1081C		CYPRIOT SYLLABLE NO
+1081D		CYPRIOT SYLLABLE NU
+1081E		CYPRIOT SYLLABLE PA
+1081F		CYPRIOT SYLLABLE PE
+10820		CYPRIOT SYLLABLE PI
+10821		CYPRIOT SYLLABLE PO
+10822		CYPRIOT SYLLABLE PU
+10823		CYPRIOT SYLLABLE RA
+10824		CYPRIOT SYLLABLE RE
+10825		CYPRIOT SYLLABLE RI
+10826		CYPRIOT SYLLABLE RO
+10827		CYPRIOT SYLLABLE RU
+10828		CYPRIOT SYLLABLE SA
+10829		CYPRIOT SYLLABLE SE
+1082A		CYPRIOT SYLLABLE SI
+1082B		CYPRIOT SYLLABLE SO
+1082C		CYPRIOT SYLLABLE SU
+1082D		CYPRIOT SYLLABLE TA
+1082E		CYPRIOT SYLLABLE TE
+1082F		CYPRIOT SYLLABLE TI
+10830		CYPRIOT SYLLABLE TO
+10831		CYPRIOT SYLLABLE TU
+10832		CYPRIOT SYLLABLE WA
+10833		CYPRIOT SYLLABLE WE
+10834		CYPRIOT SYLLABLE WI
+10835		CYPRIOT SYLLABLE WO
+10837		CYPRIOT SYLLABLE XA
+10838		CYPRIOT SYLLABLE XE
+1083C		CYPRIOT SYLLABLE ZA
+1083F		CYPRIOT SYLLABLE ZO
+10A00		KHAROSHTHI LETTER A
+10A01		KHAROSHTHI VOWEL SIGN I
+10A02		KHAROSHTHI VOWEL SIGN U
+10A03		KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05		KHAROSHTHI VOWEL SIGN E
+10A06		KHAROSHTHI VOWEL SIGN O
+10A0C		KHAROSHTHI VOWEL LENGTH MARK
+10A0D		KHAROSHTHI SIGN DOUBLE RING BELOW
+10A0E		KHAROSHTHI SIGN ANUSVARA
+10A0F		KHAROSHTHI SIGN VISARGA
+10A10		KHAROSHTHI LETTER KA
+10A11		KHAROSHTHI LETTER KHA
+10A12		KHAROSHTHI LETTER GA
+10A13		KHAROSHTHI LETTER GHA
+10A15		KHAROSHTHI LETTER CA
+10A16		KHAROSHTHI LETTER CHA
+10A17		KHAROSHTHI LETTER JA
+10A19		KHAROSHTHI LETTER NYA
+10A1A		KHAROSHTHI LETTER TTA
+10A1B		KHAROSHTHI LETTER TTHA
+10A1C		KHAROSHTHI LETTER DDA
+10A1D		KHAROSHTHI LETTER DDHA
+10A1E		KHAROSHTHI LETTER NNA
+10A1F		KHAROSHTHI LETTER TA
+10A20		KHAROSHTHI LETTER THA
+10A21		KHAROSHTHI LETTER DA
+10A22		KHAROSHTHI LETTER DHA
+10A23		KHAROSHTHI LETTER NA
+10A24		KHAROSHTHI LETTER PA
+10A25		KHAROSHTHI LETTER PHA
+10A26		KHAROSHTHI LETTER BA
+10A27		KHAROSHTHI LETTER BHA
+10A28		KHAROSHTHI LETTER MA
+10A29		KHAROSHTHI LETTER YA
+10A2A		KHAROSHTHI LETTER RA
+10A2B		KHAROSHTHI LETTER LA
+10A2C		KHAROSHTHI LETTER VA
+10A2D		KHAROSHTHI LETTER SHA
+10A2E		KHAROSHTHI LETTER SSA
+10A2F		KHAROSHTHI LETTER SA
+10A30		KHAROSHTHI LETTER ZA
+10A31		KHAROSHTHI LETTER HA
+10A32		KHAROSHTHI LETTER KKA
+10A33		KHAROSHTHI LETTER TTTHA
+10A38		KHAROSHTHI SIGN BAR ABOVE
+10A39		KHAROSHTHI SIGN CAUDA
+10A3A		KHAROSHTHI SIGN DOT BELOW
+10A3F		KHAROSHTHI VIRAMA
+10A40		KHAROSHTHI DIGIT ONE
+10A41		KHAROSHTHI DIGIT TWO
+10A42		KHAROSHTHI DIGIT THREE
+10A43		KHAROSHTHI DIGIT FOUR
+10A44		KHAROSHTHI NUMBER TEN
+10A45		KHAROSHTHI NUMBER TWENTY
+10A46		KHAROSHTHI NUMBER ONE HUNDRED
+10A47		KHAROSHTHI NUMBER ONE THOUSAND
+10A50		KHAROSHTHI PUNCTUATION DOT
+10A51		KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52		KHAROSHTHI PUNCTUATION CIRCLE
+10A53		KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54		KHAROSHTHI PUNCTUATION MANGALAM
+10A55		KHAROSHTHI PUNCTUATION LOTUS
+10A56		KHAROSHTHI PUNCTUATION DANDA
+10A57		KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58		KHAROSHTHI PUNCTUATION LINES
+1D000		BYZANTINE MUSICAL SYMBOL PSILI
+1D001		BYZANTINE MUSICAL SYMBOL DASEIA
+1D002		BYZANTINE MUSICAL SYMBOL PERISPOMENI
+1D003		BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004		BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005		BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006		BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007		BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008		BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009		BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A		BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B		BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C		BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D		BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E		BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F		BYZANTINE MUSICAL SYMBOL TELEIA
+1D010		BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011		BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012		BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013		BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014		BYZANTINE MUSICAL SYMBOL THITA
+1D015		BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016		BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017		BYZANTINE MUSICAL SYMBOL PSILON
+1D018		BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019		BYZANTINE MUSICAL SYMBOL VATHY
+1D01A		BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B		BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C		BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D		BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E		BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F		BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020		BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021		BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022		BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023		BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024		BYZANTINE MUSICAL SYMBOL KLASMA
+1D025		BYZANTINE MUSICAL SYMBOL REVMA
+1D026		BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027		BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028		BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029		BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A		BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B		BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C		BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D		BYZANTINE MUSICAL SYMBOL THEMA
+1D02E		BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F		BYZANTINE MUSICAL SYMBOL DYO
+1D030		BYZANTINE MUSICAL SYMBOL TRIA
+1D031		BYZANTINE MUSICAL SYMBOL TESSERA
+1D032		BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033		BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034		BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035		BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036		BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037		BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038		BYZANTINE MUSICAL SYMBOL PELASTON
+1D039		BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A		BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B		BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C		BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D		BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E		BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F		BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040		BYZANTINE MUSICAL SYMBOL NANA
+1D041		BYZANTINE MUSICAL SYMBOL PETASMA
+1D042		BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043		BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044		BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045		BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+1D046		BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047		BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048		BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049		BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A		BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B		BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C		BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D		BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E		BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F		BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050		BYZANTINE MUSICAL SYMBOL YPSILI
+1D051		BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052		BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053		BYZANTINE MUSICAL SYMBOL YPORROI
+1D054		BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055		BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056		BYZANTINE MUSICAL SYMBOL CHAMILI
+1D057		BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058		BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059		BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A		BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B		BYZANTINE MUSICAL SYMBOL OMALON
+1D05C		BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D		BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E		BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F		BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060		BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061		BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062		BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063		BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064		BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065		BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066		BYZANTINE MUSICAL SYMBOL SYRMA
+1D067		BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068		BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069		BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A		BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B		BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C		BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D		BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E		BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F		BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070		BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071		BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072		BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073		BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074		BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075		BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076		BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077		BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078		BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079		BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A		BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B		BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C		BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D		BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E		BYZANTINE MUSICAL SYMBOL STAVROS
+1D07F		BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080		BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081		BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082		BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083		BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084		BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085		BYZANTINE MUSICAL SYMBOL APLI
+1D086		BYZANTINE MUSICAL SYMBOL DIPLI
+1D087		BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088		BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089		BYZANTINE MUSICAL SYMBOL KORONIS
+1D08A		BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B		BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C		BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D		BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E		BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+1D08F		BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090		BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091		BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092		BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093		BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094		BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095		BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096		BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097		BYZANTINE MUSICAL SYMBOL ARGON
+1D098		BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099		BYZANTINE MUSICAL SYMBOL DIARGON
+1D09A		BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B		BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C		BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D		BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E		BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F		BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0		BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1		BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+1D0A2		BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3		BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4		BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5		BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6		BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7		BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8		BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9		BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA		BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB		BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC		BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD		BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE		BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF		BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0		BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1		BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2		BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3		BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4		BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+1D0B5		BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6		BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7		BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8		BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9		BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA		BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB		BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC		BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD		BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE		BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF		BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0		BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1		BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2		BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3		BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4		BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5		BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+1D0C6		BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7		BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8		BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9		BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA		BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB		BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC		BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD		BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE		BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF		BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0		BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1		BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2		BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3		BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4		BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5		BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6		BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7		BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8		BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9		BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA		BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB		BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC		BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD		BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE		BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF		BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0		BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1		BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2		BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3		BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4		BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5		BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6		BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7		BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8		BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9		BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA		BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB		BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC		BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED		BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE		BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF		BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+1D0F0		BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1		BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2		BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3		BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4		BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5		BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100		MUSICAL SYMBOL SINGLE BARLINE
+1D101		MUSICAL SYMBOL DOUBLE BARLINE
+1D102		MUSICAL SYMBOL FINAL BARLINE
+1D103		MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104		MUSICAL SYMBOL DASHED BARLINE
+1D105		MUSICAL SYMBOL SHORT BARLINE
+1D106		MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107		MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108		MUSICAL SYMBOL REPEAT DOTS
+1D109		MUSICAL SYMBOL DAL SEGNO
+1D10A		MUSICAL SYMBOL DA CAPO
+1D10B		MUSICAL SYMBOL SEGNO
+1D10C		MUSICAL SYMBOL CODA
+1D10D		MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E		MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F		MUSICAL SYMBOL REPEATED FIGURE-3
+1D110		MUSICAL SYMBOL FERMATA
+1D111		MUSICAL SYMBOL FERMATA BELOW
+1D112		MUSICAL SYMBOL BREATH MARK
+1D113		MUSICAL SYMBOL CAESURA
+1D114		MUSICAL SYMBOL BRACE
+1D115		MUSICAL SYMBOL BRACKET
+1D116		MUSICAL SYMBOL ONE-LINE STAFF
+1D117		MUSICAL SYMBOL TWO-LINE STAFF
+1D118		MUSICAL SYMBOL THREE-LINE STAFF
+1D119		MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A		MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B		MUSICAL SYMBOL SIX-LINE STAFF
+1D11C		MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D		MUSICAL SYMBOL FOUR-STRING FRETBOARD
+1D11E		MUSICAL SYMBOL G CLEF
+1D11F		MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120		MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121		MUSICAL SYMBOL C CLEF
+1D122		MUSICAL SYMBOL F CLEF
+1D123		MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124		MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125		MUSICAL SYMBOL DRUM CLEF-1
+1D126		MUSICAL SYMBOL DRUM CLEF-2
+1D12A		MUSICAL SYMBOL DOUBLE SHARP
+1D12B		MUSICAL SYMBOL DOUBLE FLAT
+1D12C		MUSICAL SYMBOL FLAT UP
+1D12D		MUSICAL SYMBOL FLAT DOWN
+1D12E		MUSICAL SYMBOL NATURAL UP
+1D12F		MUSICAL SYMBOL NATURAL DOWN
+1D130		MUSICAL SYMBOL SHARP UP
+1D131		MUSICAL SYMBOL SHARP DOWN
+1D132		MUSICAL SYMBOL QUARTER TONE SHARP
+1D133		MUSICAL SYMBOL QUARTER TONE FLAT
+1D134		MUSICAL SYMBOL COMMON TIME
+1D135		MUSICAL SYMBOL CUT TIME
+1D136		MUSICAL SYMBOL OTTAVA ALTA
+1D137		MUSICAL SYMBOL OTTAVA BASSA
+1D138		MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139		MUSICAL SYMBOL QUINDICESIMA BASSA
+1D13A		MUSICAL SYMBOL MULTI REST
+1D13B		MUSICAL SYMBOL WHOLE REST
+1D13C		MUSICAL SYMBOL HALF REST
+1D13D		MUSICAL SYMBOL QUARTER REST
+1D13E		MUSICAL SYMBOL EIGHTH REST
+1D13F		MUSICAL SYMBOL SIXTEENTH REST
+1D140		MUSICAL SYMBOL THIRTY-SECOND REST
+1D141		MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142		MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+1D143		MUSICAL SYMBOL X NOTEHEAD
+1D144		MUSICAL SYMBOL PLUS NOTEHEAD
+1D145		MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146		MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147		MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148		MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149		MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A		MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B		MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C		MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D		MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E		MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F		MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150		MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151		MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152		MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153		MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154		MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155		MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156		MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157		MUSICAL SYMBOL VOID NOTEHEAD
+1D158		MUSICAL SYMBOL NOTEHEAD BLACK
+1D159		MUSICAL SYMBOL NULL NOTEHEAD
+1D15A		MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B		MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+1D15C		MUSICAL SYMBOL BREVE
+1D15D		MUSICAL SYMBOL WHOLE NOTE
+1D15E		MUSICAL SYMBOL HALF NOTE
+1D15F		MUSICAL SYMBOL QUARTER NOTE
+1D160		MUSICAL SYMBOL EIGHTH NOTE
+1D161		MUSICAL SYMBOL SIXTEENTH NOTE
+1D162		MUSICAL SYMBOL THIRTY-SECOND NOTE
+1D163		MUSICAL SYMBOL SIXTY-FOURTH NOTE
+1D164		MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165		MUSICAL SYMBOL COMBINING STEM
+1D166		MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167		MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168		MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169		MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A		MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B		MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C		MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D		MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D16E		MUSICAL SYMBOL COMBINING FLAG-1
+1D16F		MUSICAL SYMBOL COMBINING FLAG-2
+1D170		MUSICAL SYMBOL COMBINING FLAG-3
+1D171		MUSICAL SYMBOL COMBINING FLAG-4
+1D172		MUSICAL SYMBOL COMBINING FLAG-5
+1D173		MUSICAL SYMBOL BEGIN BEAM
+1D174		MUSICAL SYMBOL END BEAM
+1D175		MUSICAL SYMBOL BEGIN TIE
+1D176		MUSICAL SYMBOL END TIE
+1D177		MUSICAL SYMBOL BEGIN SLUR
+1D178		MUSICAL SYMBOL END SLUR
+1D179		MUSICAL SYMBOL BEGIN PHRASE
+1D17A		MUSICAL SYMBOL END PHRASE
+1D17B		MUSICAL SYMBOL COMBINING ACCENT
+1D17C		MUSICAL SYMBOL COMBINING STACCATO
+1D17D		MUSICAL SYMBOL COMBINING TENUTO
+1D17E		MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F		MUSICAL SYMBOL COMBINING MARCATO
+1D180		MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181		MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182		MUSICAL SYMBOL COMBINING LOURE
+1D183		MUSICAL SYMBOL ARPEGGIATO UP
+1D184		MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185		MUSICAL SYMBOL COMBINING DOIT
+1D186		MUSICAL SYMBOL COMBINING RIP
+1D187		MUSICAL SYMBOL COMBINING FLIP
+1D188		MUSICAL SYMBOL COMBINING SMEAR
+1D189		MUSICAL SYMBOL COMBINING BEND
+1D18A		MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B		MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C		MUSICAL SYMBOL RINFORZANDO
+1D18D		MUSICAL SYMBOL SUBITO
+1D18E		MUSICAL SYMBOL Z
+1D18F		MUSICAL SYMBOL PIANO
+1D190		MUSICAL SYMBOL MEZZO
+1D191		MUSICAL SYMBOL FORTE
+1D192		MUSICAL SYMBOL CRESCENDO
+1D193		MUSICAL SYMBOL DECRESCENDO
+1D194		MUSICAL SYMBOL GRACE NOTE SLASH
+1D195		MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196		MUSICAL SYMBOL TR
+1D197		MUSICAL SYMBOL TURN
+1D198		MUSICAL SYMBOL INVERTED TURN
+1D199		MUSICAL SYMBOL TURN SLASH
+1D19A		MUSICAL SYMBOL TURN UP
+1D19B		MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C		MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D		MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E		MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F		MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0		MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1		MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2		MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3		MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4		MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5		MUSICAL SYMBOL ORNAMENT STROKE-11
+1D1A6		MUSICAL SYMBOL HAUPTSTIMME
+1D1A7		MUSICAL SYMBOL NEBENSTIMME
+1D1A8		MUSICAL SYMBOL END OF STIMME
+1D1A9		MUSICAL SYMBOL DEGREE SLASH
+1D1AA		MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB		MUSICAL SYMBOL COMBINING UP BOW
+1D1AC		MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD		MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE		MUSICAL SYMBOL PEDAL MARK
+1D1AF		MUSICAL SYMBOL PEDAL UP MARK
+1D1B0		MUSICAL SYMBOL HALF PEDAL MARK
+1D1B1		MUSICAL SYMBOL GLISSANDO UP
+1D1B2		MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3		MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4		MUSICAL SYMBOL DAMP
+1D1B5		MUSICAL SYMBOL DAMP ALL
+1D1B6		MUSICAL SYMBOL MAXIMA
+1D1B7		MUSICAL SYMBOL LONGA
+1D1B8		MUSICAL SYMBOL BREVIS
+1D1B9		MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA		MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB		MUSICAL SYMBOL MINIMA
+1D1BC		MUSICAL SYMBOL MINIMA BLACK
+1D1BD		MUSICAL SYMBOL SEMIMINIMA WHITE
+1D1BE		MUSICAL SYMBOL SEMIMINIMA BLACK
+1D1BF		MUSICAL SYMBOL FUSA WHITE
+1D1C0		MUSICAL SYMBOL FUSA BLACK
+1D1C1		MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2		MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3		MUSICAL SYMBOL BREVIS REST
+1D1C4		MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5		MUSICAL SYMBOL MINIMA REST
+1D1C6		MUSICAL SYMBOL SEMIMINIMA REST
+1D1C7		MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8		MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9		MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA		MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB		MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC		MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD		MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE		MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+1D1CF		MUSICAL SYMBOL CROIX
+1D1D0		MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1		MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2		MUSICAL SYMBOL SQUARE B
+1D1D3		MUSICAL SYMBOL VIRGA
+1D1D4		MUSICAL SYMBOL PODATUS
+1D1D5		MUSICAL SYMBOL CLIVIS
+1D1D6		MUSICAL SYMBOL SCANDICUS
+1D1D7		MUSICAL SYMBOL CLIMACUS
+1D1D8		MUSICAL SYMBOL TORCULUS
+1D1D9		MUSICAL SYMBOL PORRECTUS
+1D1DA		MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB		MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC		MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD		MUSICAL SYMBOL PES SUBPUNCTIS
+1D200		GREEK VOCAL NOTATION SYMBOL-1
+1D201		GREEK VOCAL NOTATION SYMBOL-2
+1D202		GREEK VOCAL NOTATION SYMBOL-3
+1D203		GREEK VOCAL NOTATION SYMBOL-4
+1D204		GREEK VOCAL NOTATION SYMBOL-5
+1D205		GREEK VOCAL NOTATION SYMBOL-6
+1D206		GREEK VOCAL NOTATION SYMBOL-7
+1D207		GREEK VOCAL NOTATION SYMBOL-8
+1D208		GREEK VOCAL NOTATION SYMBOL-9
+1D209		GREEK VOCAL NOTATION SYMBOL-10
+1D20A		GREEK VOCAL NOTATION SYMBOL-11
+1D20B		GREEK VOCAL NOTATION SYMBOL-12
+1D20C		GREEK VOCAL NOTATION SYMBOL-13
+1D20D		GREEK VOCAL NOTATION SYMBOL-14
+1D20E		GREEK VOCAL NOTATION SYMBOL-15
+1D20F		GREEK VOCAL NOTATION SYMBOL-16
+1D210		GREEK VOCAL NOTATION SYMBOL-17
+1D211		GREEK VOCAL NOTATION SYMBOL-18
+1D212		GREEK VOCAL NOTATION SYMBOL-19
+1D213		GREEK VOCAL NOTATION SYMBOL-20
+1D214		GREEK VOCAL NOTATION SYMBOL-21
+1D215		GREEK VOCAL NOTATION SYMBOL-22
+1D216		GREEK VOCAL NOTATION SYMBOL-23
+1D217		GREEK VOCAL NOTATION SYMBOL-24
+1D218		GREEK VOCAL NOTATION SYMBOL-50
+1D219		GREEK VOCAL NOTATION SYMBOL-51
+1D21A		GREEK VOCAL NOTATION SYMBOL-52
+1D21B		GREEK VOCAL NOTATION SYMBOL-53
+1D21C		GREEK VOCAL NOTATION SYMBOL-54
+1D21D		GREEK INSTRUMENTAL NOTATION SYMBOL-1
+1D21E		GREEK INSTRUMENTAL NOTATION SYMBOL-2
+1D21F		GREEK INSTRUMENTAL NOTATION SYMBOL-4
+1D220		GREEK INSTRUMENTAL NOTATION SYMBOL-5
+1D221		GREEK INSTRUMENTAL NOTATION SYMBOL-7
+1D222		GREEK INSTRUMENTAL NOTATION SYMBOL-8
+1D223		GREEK INSTRUMENTAL NOTATION SYMBOL-11
+1D224		GREEK INSTRUMENTAL NOTATION SYMBOL-12
+1D225		GREEK INSTRUMENTAL NOTATION SYMBOL-13
+1D226		GREEK INSTRUMENTAL NOTATION SYMBOL-14
+1D227		GREEK INSTRUMENTAL NOTATION SYMBOL-17
+1D228		GREEK INSTRUMENTAL NOTATION SYMBOL-18
+1D229		GREEK INSTRUMENTAL NOTATION SYMBOL-19
+1D22A		GREEK INSTRUMENTAL NOTATION SYMBOL-23
+1D22B		GREEK INSTRUMENTAL NOTATION SYMBOL-24
+1D22C		GREEK INSTRUMENTAL NOTATION SYMBOL-25
+1D22D		GREEK INSTRUMENTAL NOTATION SYMBOL-26
+1D22E		GREEK INSTRUMENTAL NOTATION SYMBOL-27
+1D22F		GREEK INSTRUMENTAL NOTATION SYMBOL-29
+1D230		GREEK INSTRUMENTAL NOTATION SYMBOL-30
+1D231		GREEK INSTRUMENTAL NOTATION SYMBOL-32
+1D232		GREEK INSTRUMENTAL NOTATION SYMBOL-36
+1D233		GREEK INSTRUMENTAL NOTATION SYMBOL-37
+1D234		GREEK INSTRUMENTAL NOTATION SYMBOL-38
+1D235		GREEK INSTRUMENTAL NOTATION SYMBOL-39
+1D236		GREEK INSTRUMENTAL NOTATION SYMBOL-40
+1D237		GREEK INSTRUMENTAL NOTATION SYMBOL-42
+1D238		GREEK INSTRUMENTAL NOTATION SYMBOL-43
+1D239		GREEK INSTRUMENTAL NOTATION SYMBOL-45
+1D23A		GREEK INSTRUMENTAL NOTATION SYMBOL-47
+1D23B		GREEK INSTRUMENTAL NOTATION SYMBOL-48
+1D23C		GREEK INSTRUMENTAL NOTATION SYMBOL-49
+1D23D		GREEK INSTRUMENTAL NOTATION SYMBOL-50
+1D23E		GREEK INSTRUMENTAL NOTATION SYMBOL-51
+1D23F		GREEK INSTRUMENTAL NOTATION SYMBOL-52
+1D240		GREEK INSTRUMENTAL NOTATION SYMBOL-53
+1D241		GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242		COMBINING GREEK MUSICAL TRISEME
+1D243		COMBINING GREEK MUSICAL TETRASEME
+1D244		COMBINING GREEK MUSICAL PENTASEME
+1D245		GREEK MUSICAL LEIMMA
+1D300		MONOGRAM FOR EARTH
+1D301		DIGRAM FOR HEAVENLY EARTH
+1D302		DIGRAM FOR HUMAN EARTH
+1D303		DIGRAM FOR EARTHLY HEAVEN
+1D304		DIGRAM FOR EARTHLY HUMAN
+1D305		DIGRAM FOR EARTH
+1D306		TETRAGRAM FOR CENTRE
+1D307		TETRAGRAM FOR FULL CIRCLE
+1D308		TETRAGRAM FOR MIRED
+1D309		TETRAGRAM FOR BARRIER
+1D30A		TETRAGRAM FOR KEEPING SMALL
+1D30B		TETRAGRAM FOR CONTRARIETY
+1D30C		TETRAGRAM FOR ASCENT
+1D30D		TETRAGRAM FOR OPPOSITION
+1D30E		TETRAGRAM FOR BRANCHING OUT
+1D30F		TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310		TETRAGRAM FOR DIVERGENCE
+1D311		TETRAGRAM FOR YOUTHFULNESS
+1D312		TETRAGRAM FOR INCREASE
+1D313		TETRAGRAM FOR PENETRATION
+1D314		TETRAGRAM FOR REACH
+1D315		TETRAGRAM FOR CONTACT
+1D316		TETRAGRAM FOR HOLDING BACK
+1D317		TETRAGRAM FOR WAITING
+1D318		TETRAGRAM FOR FOLLOWING
+1D319		TETRAGRAM FOR ADVANCE
+1D31A		TETRAGRAM FOR RELEASE
+1D31B		TETRAGRAM FOR RESISTANCE
+1D31C		TETRAGRAM FOR EASE
+1D31D		TETRAGRAM FOR JOY
+1D31E		TETRAGRAM FOR CONTENTION
+1D31F		TETRAGRAM FOR ENDEAVOUR
+1D320		TETRAGRAM FOR DUTIES
+1D321		TETRAGRAM FOR CHANGE
+1D322		TETRAGRAM FOR DECISIVENESS
+1D323		TETRAGRAM FOR BOLD RESOLUTION
+1D324		TETRAGRAM FOR PACKING
+1D325		TETRAGRAM FOR LEGION
+1D326		TETRAGRAM FOR CLOSENESS
+1D327		TETRAGRAM FOR KINSHIP
+1D328		TETRAGRAM FOR GATHERING
+1D329		TETRAGRAM FOR STRENGTH
+1D32A		TETRAGRAM FOR PURITY
+1D32B		TETRAGRAM FOR FULLNESS
+1D32C		TETRAGRAM FOR RESIDENCE
+1D32D		TETRAGRAM FOR LAW OR MODEL
+1D32E		TETRAGRAM FOR RESPONSE
+1D32F		TETRAGRAM FOR GOING TO MEET
+1D330		TETRAGRAM FOR ENCOUNTERS
+1D331		TETRAGRAM FOR STOVE
+1D332		TETRAGRAM FOR GREATNESS
+1D333		TETRAGRAM FOR ENLARGEMENT
+1D334		TETRAGRAM FOR PATTERN
+1D335		TETRAGRAM FOR RITUAL
+1D336		TETRAGRAM FOR FLIGHT
+1D337		TETRAGRAM FOR VASTNESS OR WASTING
+1D338		TETRAGRAM FOR CONSTANCY
+1D339		TETRAGRAM FOR MEASURE
+1D33A		TETRAGRAM FOR ETERNITY
+1D33B		TETRAGRAM FOR UNITY
+1D33C		TETRAGRAM FOR DIMINISHMENT
+1D33D		TETRAGRAM FOR CLOSED MOUTH
+1D33E		TETRAGRAM FOR GUARDEDNESS
+1D33F		TETRAGRAM FOR GATHERING IN
+1D340		TETRAGRAM FOR MASSING
+1D341		TETRAGRAM FOR ACCUMULATION
+1D342		TETRAGRAM FOR EMBELLISHMENT
+1D343		TETRAGRAM FOR DOUBT
+1D344		TETRAGRAM FOR WATCH
+1D345		TETRAGRAM FOR SINKING
+1D346		TETRAGRAM FOR INNER
+1D347		TETRAGRAM FOR DEPARTURE
+1D348		TETRAGRAM FOR DARKENING
+1D349		TETRAGRAM FOR DIMMING
+1D34A		TETRAGRAM FOR EXHAUSTION
+1D34B		TETRAGRAM FOR SEVERANCE
+1D34C		TETRAGRAM FOR STOPPAGE
+1D34D		TETRAGRAM FOR HARDNESS
+1D34E		TETRAGRAM FOR COMPLETION
+1D34F		TETRAGRAM FOR CLOSURE
+1D350		TETRAGRAM FOR FAILURE
+1D351		TETRAGRAM FOR AGGRAVATION
+1D352		TETRAGRAM FOR COMPLIANCE
+1D353		TETRAGRAM FOR ON THE VERGE
+1D354		TETRAGRAM FOR DIFFICULTIES
+1D355		TETRAGRAM FOR LABOURING
+1D356		TETRAGRAM FOR FOSTERING
+1D400		MATHEMATICAL BOLD CAPITAL A
+1D401		MATHEMATICAL BOLD CAPITAL B
+1D402		MATHEMATICAL BOLD CAPITAL C
+1D403		MATHEMATICAL BOLD CAPITAL D
+1D404		MATHEMATICAL BOLD CAPITAL E
+1D405		MATHEMATICAL BOLD CAPITAL F
+1D406		MATHEMATICAL BOLD CAPITAL G
+1D407		MATHEMATICAL BOLD CAPITAL H
+1D408		MATHEMATICAL BOLD CAPITAL I
+1D409		MATHEMATICAL BOLD CAPITAL J
+1D40A		MATHEMATICAL BOLD CAPITAL K
+1D40B		MATHEMATICAL BOLD CAPITAL L
+1D40C		MATHEMATICAL BOLD CAPITAL M
+1D40D		MATHEMATICAL BOLD CAPITAL N
+1D40E		MATHEMATICAL BOLD CAPITAL O
+1D40F		MATHEMATICAL BOLD CAPITAL P
+1D410		MATHEMATICAL BOLD CAPITAL Q
+1D411		MATHEMATICAL BOLD CAPITAL R
+1D412		MATHEMATICAL BOLD CAPITAL S
+1D413		MATHEMATICAL BOLD CAPITAL T
+1D414		MATHEMATICAL BOLD CAPITAL U
+1D415		MATHEMATICAL BOLD CAPITAL V
+1D416		MATHEMATICAL BOLD CAPITAL W
+1D417		MATHEMATICAL BOLD CAPITAL X
+1D418		MATHEMATICAL BOLD CAPITAL Y
+1D419		MATHEMATICAL BOLD CAPITAL Z
+1D41A		MATHEMATICAL BOLD SMALL A
+1D41B		MATHEMATICAL BOLD SMALL B
+1D41C		MATHEMATICAL BOLD SMALL C
+1D41D		MATHEMATICAL BOLD SMALL D
+1D41E		MATHEMATICAL BOLD SMALL E
+1D41F		MATHEMATICAL BOLD SMALL F
+1D420		MATHEMATICAL BOLD SMALL G
+1D421		MATHEMATICAL BOLD SMALL H
+1D422		MATHEMATICAL BOLD SMALL I
+1D423		MATHEMATICAL BOLD SMALL J
+1D424		MATHEMATICAL BOLD SMALL K
+1D425		MATHEMATICAL BOLD SMALL L
+1D426		MATHEMATICAL BOLD SMALL M
+1D427		MATHEMATICAL BOLD SMALL N
+1D428		MATHEMATICAL BOLD SMALL O
+1D429		MATHEMATICAL BOLD SMALL P
+1D42A		MATHEMATICAL BOLD SMALL Q
+1D42B		MATHEMATICAL BOLD SMALL R
+1D42C		MATHEMATICAL BOLD SMALL S
+1D42D		MATHEMATICAL BOLD SMALL T
+1D42E		MATHEMATICAL BOLD SMALL U
+1D42F		MATHEMATICAL BOLD SMALL V
+1D430		MATHEMATICAL BOLD SMALL W
+1D431		MATHEMATICAL BOLD SMALL X
+1D432		MATHEMATICAL BOLD SMALL Y
+1D433		MATHEMATICAL BOLD SMALL Z
+1D434		MATHEMATICAL ITALIC CAPITAL A
+1D435		MATHEMATICAL ITALIC CAPITAL B
+1D436		MATHEMATICAL ITALIC CAPITAL C
+1D437		MATHEMATICAL ITALIC CAPITAL D
+1D438		MATHEMATICAL ITALIC CAPITAL E
+1D439		MATHEMATICAL ITALIC CAPITAL F
+1D43A		MATHEMATICAL ITALIC CAPITAL G
+1D43B		MATHEMATICAL ITALIC CAPITAL H
+1D43C		MATHEMATICAL ITALIC CAPITAL I
+1D43D		MATHEMATICAL ITALIC CAPITAL J
+1D43E		MATHEMATICAL ITALIC CAPITAL K
+1D43F		MATHEMATICAL ITALIC CAPITAL L
+1D440		MATHEMATICAL ITALIC CAPITAL M
+1D441		MATHEMATICAL ITALIC CAPITAL N
+1D442		MATHEMATICAL ITALIC CAPITAL O
+1D443		MATHEMATICAL ITALIC CAPITAL P
+1D444		MATHEMATICAL ITALIC CAPITAL Q
+1D445		MATHEMATICAL ITALIC CAPITAL R
+1D446		MATHEMATICAL ITALIC CAPITAL S
+1D447		MATHEMATICAL ITALIC CAPITAL T
+1D448		MATHEMATICAL ITALIC CAPITAL U
+1D449		MATHEMATICAL ITALIC CAPITAL V
+1D44A		MATHEMATICAL ITALIC CAPITAL W
+1D44B		MATHEMATICAL ITALIC CAPITAL X
+1D44C		MATHEMATICAL ITALIC CAPITAL Y
+1D44D		MATHEMATICAL ITALIC CAPITAL Z
+1D44E		MATHEMATICAL ITALIC SMALL A
+1D44F		MATHEMATICAL ITALIC SMALL B
+1D450		MATHEMATICAL ITALIC SMALL C
+1D451		MATHEMATICAL ITALIC SMALL D
+1D452		MATHEMATICAL ITALIC SMALL E
+1D453		MATHEMATICAL ITALIC SMALL F
+1D454		MATHEMATICAL ITALIC SMALL G
+1D456		MATHEMATICAL ITALIC SMALL I
+1D457		MATHEMATICAL ITALIC SMALL J
+1D458		MATHEMATICAL ITALIC SMALL K
+1D459		MATHEMATICAL ITALIC SMALL L
+1D45A		MATHEMATICAL ITALIC SMALL M
+1D45B		MATHEMATICAL ITALIC SMALL N
+1D45C		MATHEMATICAL ITALIC SMALL O
+1D45D		MATHEMATICAL ITALIC SMALL P
+1D45E		MATHEMATICAL ITALIC SMALL Q
+1D45F		MATHEMATICAL ITALIC SMALL R
+1D460		MATHEMATICAL ITALIC SMALL S
+1D461		MATHEMATICAL ITALIC SMALL T
+1D462		MATHEMATICAL ITALIC SMALL U
+1D463		MATHEMATICAL ITALIC SMALL V
+1D464		MATHEMATICAL ITALIC SMALL W
+1D465		MATHEMATICAL ITALIC SMALL X
+1D466		MATHEMATICAL ITALIC SMALL Y
+1D467		MATHEMATICAL ITALIC SMALL Z
+1D468		MATHEMATICAL BOLD ITALIC CAPITAL A
+1D469		MATHEMATICAL BOLD ITALIC CAPITAL B
+1D46A		MATHEMATICAL BOLD ITALIC CAPITAL C
+1D46B		MATHEMATICAL BOLD ITALIC CAPITAL D
+1D46C		MATHEMATICAL BOLD ITALIC CAPITAL E
+1D46D		MATHEMATICAL BOLD ITALIC CAPITAL F
+1D46E		MATHEMATICAL BOLD ITALIC CAPITAL G
+1D46F		MATHEMATICAL BOLD ITALIC CAPITAL H
+1D470		MATHEMATICAL BOLD ITALIC CAPITAL I
+1D471		MATHEMATICAL BOLD ITALIC CAPITAL J
+1D472		MATHEMATICAL BOLD ITALIC CAPITAL K
+1D473		MATHEMATICAL BOLD ITALIC CAPITAL L
+1D474		MATHEMATICAL BOLD ITALIC CAPITAL M
+1D475		MATHEMATICAL BOLD ITALIC CAPITAL N
+1D476		MATHEMATICAL BOLD ITALIC CAPITAL O
+1D477		MATHEMATICAL BOLD ITALIC CAPITAL P
+1D478		MATHEMATICAL BOLD ITALIC CAPITAL Q
+1D479		MATHEMATICAL BOLD ITALIC CAPITAL R
+1D47A		MATHEMATICAL BOLD ITALIC CAPITAL S
+1D47B		MATHEMATICAL BOLD ITALIC CAPITAL T
+1D47C		MATHEMATICAL BOLD ITALIC CAPITAL U
+1D47D		MATHEMATICAL BOLD ITALIC CAPITAL V
+1D47E		MATHEMATICAL BOLD ITALIC CAPITAL W
+1D47F		MATHEMATICAL BOLD ITALIC CAPITAL X
+1D480		MATHEMATICAL BOLD ITALIC CAPITAL Y
+1D481		MATHEMATICAL BOLD ITALIC CAPITAL Z
+1D482		MATHEMATICAL BOLD ITALIC SMALL A
+1D483		MATHEMATICAL BOLD ITALIC SMALL B
+1D484		MATHEMATICAL BOLD ITALIC SMALL C
+1D485		MATHEMATICAL BOLD ITALIC SMALL D
+1D486		MATHEMATICAL BOLD ITALIC SMALL E
+1D487		MATHEMATICAL BOLD ITALIC SMALL F
+1D488		MATHEMATICAL BOLD ITALIC SMALL G
+1D489		MATHEMATICAL BOLD ITALIC SMALL H
+1D48A		MATHEMATICAL BOLD ITALIC SMALL I
+1D48B		MATHEMATICAL BOLD ITALIC SMALL J
+1D48C		MATHEMATICAL BOLD ITALIC SMALL K
+1D48D		MATHEMATICAL BOLD ITALIC SMALL L
+1D48E		MATHEMATICAL BOLD ITALIC SMALL M
+1D48F		MATHEMATICAL BOLD ITALIC SMALL N
+1D490		MATHEMATICAL BOLD ITALIC SMALL O
+1D491		MATHEMATICAL BOLD ITALIC SMALL P
+1D492		MATHEMATICAL BOLD ITALIC SMALL Q
+1D493		MATHEMATICAL BOLD ITALIC SMALL R
+1D494		MATHEMATICAL BOLD ITALIC SMALL S
+1D495		MATHEMATICAL BOLD ITALIC SMALL T
+1D496		MATHEMATICAL BOLD ITALIC SMALL U
+1D497		MATHEMATICAL BOLD ITALIC SMALL V
+1D498		MATHEMATICAL BOLD ITALIC SMALL W
+1D499		MATHEMATICAL BOLD ITALIC SMALL X
+1D49A		MATHEMATICAL BOLD ITALIC SMALL Y
+1D49B		MATHEMATICAL BOLD ITALIC SMALL Z
+1D49C		MATHEMATICAL SCRIPT CAPITAL A
+1D49E		MATHEMATICAL SCRIPT CAPITAL C
+1D49F		MATHEMATICAL SCRIPT CAPITAL D
+1D4A2		MATHEMATICAL SCRIPT CAPITAL G
+1D4A5		MATHEMATICAL SCRIPT CAPITAL J
+1D4A6		MATHEMATICAL SCRIPT CAPITAL K
+1D4A9		MATHEMATICAL SCRIPT CAPITAL N
+1D4AA		MATHEMATICAL SCRIPT CAPITAL O
+1D4AB		MATHEMATICAL SCRIPT CAPITAL P
+1D4AC		MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE		MATHEMATICAL SCRIPT CAPITAL S
+1D4AF		MATHEMATICAL SCRIPT CAPITAL T
+1D4B0		MATHEMATICAL SCRIPT CAPITAL U
+1D4B1		MATHEMATICAL SCRIPT CAPITAL V
+1D4B2		MATHEMATICAL SCRIPT CAPITAL W
+1D4B3		MATHEMATICAL SCRIPT CAPITAL X
+1D4B4		MATHEMATICAL SCRIPT CAPITAL Y
+1D4B5		MATHEMATICAL SCRIPT CAPITAL Z
+1D4B6		MATHEMATICAL SCRIPT SMALL A
+1D4B7		MATHEMATICAL SCRIPT SMALL B
+1D4B8		MATHEMATICAL SCRIPT SMALL C
+1D4B9		MATHEMATICAL SCRIPT SMALL D
+1D4BB		MATHEMATICAL SCRIPT SMALL F
+1D4BD		MATHEMATICAL SCRIPT SMALL H
+1D4BE		MATHEMATICAL SCRIPT SMALL I
+1D4BF		MATHEMATICAL SCRIPT SMALL J
+1D4C0		MATHEMATICAL SCRIPT SMALL K
+1D4C1		MATHEMATICAL SCRIPT SMALL L
+1D4C2		MATHEMATICAL SCRIPT SMALL M
+1D4C3		MATHEMATICAL SCRIPT SMALL N
+1D4C5		MATHEMATICAL SCRIPT SMALL P
+1D4C6		MATHEMATICAL SCRIPT SMALL Q
+1D4C7		MATHEMATICAL SCRIPT SMALL R
+1D4C8		MATHEMATICAL SCRIPT SMALL S
+1D4C9		MATHEMATICAL SCRIPT SMALL T
+1D4CA		MATHEMATICAL SCRIPT SMALL U
+1D4CB		MATHEMATICAL SCRIPT SMALL V
+1D4CC		MATHEMATICAL SCRIPT SMALL W
+1D4CD		MATHEMATICAL SCRIPT SMALL X
+1D4CE		MATHEMATICAL SCRIPT SMALL Y
+1D4CF		MATHEMATICAL SCRIPT SMALL Z
+1D4D0		MATHEMATICAL BOLD SCRIPT CAPITAL A
+1D4D1		MATHEMATICAL BOLD SCRIPT CAPITAL B
+1D4D2		MATHEMATICAL BOLD SCRIPT CAPITAL C
+1D4D3		MATHEMATICAL BOLD SCRIPT CAPITAL D
+1D4D4		MATHEMATICAL BOLD SCRIPT CAPITAL E
+1D4D5		MATHEMATICAL BOLD SCRIPT CAPITAL F
+1D4D6		MATHEMATICAL BOLD SCRIPT CAPITAL G
+1D4D7		MATHEMATICAL BOLD SCRIPT CAPITAL H
+1D4D8		MATHEMATICAL BOLD SCRIPT CAPITAL I
+1D4D9		MATHEMATICAL BOLD SCRIPT CAPITAL J
+1D4DA		MATHEMATICAL BOLD SCRIPT CAPITAL K
+1D4DB		MATHEMATICAL BOLD SCRIPT CAPITAL L
+1D4DC		MATHEMATICAL BOLD SCRIPT CAPITAL M
+1D4DD		MATHEMATICAL BOLD SCRIPT CAPITAL N
+1D4DE		MATHEMATICAL BOLD SCRIPT CAPITAL O
+1D4DF		MATHEMATICAL BOLD SCRIPT CAPITAL P
+1D4E0		MATHEMATICAL BOLD SCRIPT CAPITAL Q
+1D4E1		MATHEMATICAL BOLD SCRIPT CAPITAL R
+1D4E2		MATHEMATICAL BOLD SCRIPT CAPITAL S
+1D4E3		MATHEMATICAL BOLD SCRIPT CAPITAL T
+1D4E4		MATHEMATICAL BOLD SCRIPT CAPITAL U
+1D4E5		MATHEMATICAL BOLD SCRIPT CAPITAL V
+1D4E6		MATHEMATICAL BOLD SCRIPT CAPITAL W
+1D4E7		MATHEMATICAL BOLD SCRIPT CAPITAL X
+1D4E8		MATHEMATICAL BOLD SCRIPT CAPITAL Y
+1D4E9		MATHEMATICAL BOLD SCRIPT CAPITAL Z
+1D4EA		MATHEMATICAL BOLD SCRIPT SMALL A
+1D4EB		MATHEMATICAL BOLD SCRIPT SMALL B
+1D4EC		MATHEMATICAL BOLD SCRIPT SMALL C
+1D4ED		MATHEMATICAL BOLD SCRIPT SMALL D
+1D4EE		MATHEMATICAL BOLD SCRIPT SMALL E
+1D4EF		MATHEMATICAL BOLD SCRIPT SMALL F
+1D4F0		MATHEMATICAL BOLD SCRIPT SMALL G
+1D4F1		MATHEMATICAL BOLD SCRIPT SMALL H
+1D4F2		MATHEMATICAL BOLD SCRIPT SMALL I
+1D4F3		MATHEMATICAL BOLD SCRIPT SMALL J
+1D4F4		MATHEMATICAL BOLD SCRIPT SMALL K
+1D4F5		MATHEMATICAL BOLD SCRIPT SMALL L
+1D4F6		MATHEMATICAL BOLD SCRIPT SMALL M
+1D4F7		MATHEMATICAL BOLD SCRIPT SMALL N
+1D4F8		MATHEMATICAL BOLD SCRIPT SMALL O
+1D4F9		MATHEMATICAL BOLD SCRIPT SMALL P
+1D4FA		MATHEMATICAL BOLD SCRIPT SMALL Q
+1D4FB		MATHEMATICAL BOLD SCRIPT SMALL R
+1D4FC		MATHEMATICAL BOLD SCRIPT SMALL S
+1D4FD		MATHEMATICAL BOLD SCRIPT SMALL T
+1D4FE		MATHEMATICAL BOLD SCRIPT SMALL U
+1D4FF		MATHEMATICAL BOLD SCRIPT SMALL V
+1D500		MATHEMATICAL BOLD SCRIPT SMALL W
+1D501		MATHEMATICAL BOLD SCRIPT SMALL X
+1D502		MATHEMATICAL BOLD SCRIPT SMALL Y
+1D503		MATHEMATICAL BOLD SCRIPT SMALL Z
+1D504		MATHEMATICAL FRAKTUR CAPITAL A
+1D505		MATHEMATICAL FRAKTUR CAPITAL B
+1D507		MATHEMATICAL FRAKTUR CAPITAL D
+1D508		MATHEMATICAL FRAKTUR CAPITAL E
+1D509		MATHEMATICAL FRAKTUR CAPITAL F
+1D50A		MATHEMATICAL FRAKTUR CAPITAL G
+1D50D		MATHEMATICAL FRAKTUR CAPITAL J
+1D50E		MATHEMATICAL FRAKTUR CAPITAL K
+1D50F		MATHEMATICAL FRAKTUR CAPITAL L
+1D510		MATHEMATICAL FRAKTUR CAPITAL M
+1D511		MATHEMATICAL FRAKTUR CAPITAL N
+1D512		MATHEMATICAL FRAKTUR CAPITAL O
+1D513		MATHEMATICAL FRAKTUR CAPITAL P
+1D514		MATHEMATICAL FRAKTUR CAPITAL Q
+1D516		MATHEMATICAL FRAKTUR CAPITAL S
+1D517		MATHEMATICAL FRAKTUR CAPITAL T
+1D518		MATHEMATICAL FRAKTUR CAPITAL U
+1D519		MATHEMATICAL FRAKTUR CAPITAL V
+1D51A		MATHEMATICAL FRAKTUR CAPITAL W
+1D51B		MATHEMATICAL FRAKTUR CAPITAL X
+1D51C		MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E		MATHEMATICAL FRAKTUR SMALL A
+1D51F		MATHEMATICAL FRAKTUR SMALL B
+1D520		MATHEMATICAL FRAKTUR SMALL C
+1D521		MATHEMATICAL FRAKTUR SMALL D
+1D522		MATHEMATICAL FRAKTUR SMALL E
+1D523		MATHEMATICAL FRAKTUR SMALL F
+1D524		MATHEMATICAL FRAKTUR SMALL G
+1D525		MATHEMATICAL FRAKTUR SMALL H
+1D526		MATHEMATICAL FRAKTUR SMALL I
+1D527		MATHEMATICAL FRAKTUR SMALL J
+1D528		MATHEMATICAL FRAKTUR SMALL K
+1D529		MATHEMATICAL FRAKTUR SMALL L
+1D52A		MATHEMATICAL FRAKTUR SMALL M
+1D52B		MATHEMATICAL FRAKTUR SMALL N
+1D52C		MATHEMATICAL FRAKTUR SMALL O
+1D52D		MATHEMATICAL FRAKTUR SMALL P
+1D52E		MATHEMATICAL FRAKTUR SMALL Q
+1D52F		MATHEMATICAL FRAKTUR SMALL R
+1D530		MATHEMATICAL FRAKTUR SMALL S
+1D531		MATHEMATICAL FRAKTUR SMALL T
+1D532		MATHEMATICAL FRAKTUR SMALL U
+1D533		MATHEMATICAL FRAKTUR SMALL V
+1D534		MATHEMATICAL FRAKTUR SMALL W
+1D535		MATHEMATICAL FRAKTUR SMALL X
+1D536		MATHEMATICAL FRAKTUR SMALL Y
+1D537		MATHEMATICAL FRAKTUR SMALL Z
+1D538		MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+1D539		MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B		MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+1D53C		MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+1D53D		MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+1D53E		MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540		MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+1D541		MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+1D542		MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+1D543		MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+1D544		MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546		MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A		MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+1D54B		MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+1D54C		MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+1D54D		MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+1D54E		MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+1D54F		MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+1D550		MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552		MATHEMATICAL DOUBLE-STRUCK SMALL A
+1D553		MATHEMATICAL DOUBLE-STRUCK SMALL B
+1D554		MATHEMATICAL DOUBLE-STRUCK SMALL C
+1D555		MATHEMATICAL DOUBLE-STRUCK SMALL D
+1D556		MATHEMATICAL DOUBLE-STRUCK SMALL E
+1D557		MATHEMATICAL DOUBLE-STRUCK SMALL F
+1D558		MATHEMATICAL DOUBLE-STRUCK SMALL G
+1D559		MATHEMATICAL DOUBLE-STRUCK SMALL H
+1D55A		MATHEMATICAL DOUBLE-STRUCK SMALL I
+1D55B		MATHEMATICAL DOUBLE-STRUCK SMALL J
+1D55C		MATHEMATICAL DOUBLE-STRUCK SMALL K
+1D55D		MATHEMATICAL DOUBLE-STRUCK SMALL L
+1D55E		MATHEMATICAL DOUBLE-STRUCK SMALL M
+1D55F		MATHEMATICAL DOUBLE-STRUCK SMALL N
+1D560		MATHEMATICAL DOUBLE-STRUCK SMALL O
+1D561		MATHEMATICAL DOUBLE-STRUCK SMALL P
+1D562		MATHEMATICAL DOUBLE-STRUCK SMALL Q
+1D563		MATHEMATICAL DOUBLE-STRUCK SMALL R
+1D564		MATHEMATICAL DOUBLE-STRUCK SMALL S
+1D565		MATHEMATICAL DOUBLE-STRUCK SMALL T
+1D566		MATHEMATICAL DOUBLE-STRUCK SMALL U
+1D567		MATHEMATICAL DOUBLE-STRUCK SMALL V
+1D568		MATHEMATICAL DOUBLE-STRUCK SMALL W
+1D569		MATHEMATICAL DOUBLE-STRUCK SMALL X
+1D56A		MATHEMATICAL DOUBLE-STRUCK SMALL Y
+1D56B		MATHEMATICAL DOUBLE-STRUCK SMALL Z
+1D56C		MATHEMATICAL BOLD FRAKTUR CAPITAL A
+1D56D		MATHEMATICAL BOLD FRAKTUR CAPITAL B
+1D56E		MATHEMATICAL BOLD FRAKTUR CAPITAL C
+1D56F		MATHEMATICAL BOLD FRAKTUR CAPITAL D
+1D570		MATHEMATICAL BOLD FRAKTUR CAPITAL E
+1D571		MATHEMATICAL BOLD FRAKTUR CAPITAL F
+1D572		MATHEMATICAL BOLD FRAKTUR CAPITAL G
+1D573		MATHEMATICAL BOLD FRAKTUR CAPITAL H
+1D574		MATHEMATICAL BOLD FRAKTUR CAPITAL I
+1D575		MATHEMATICAL BOLD FRAKTUR CAPITAL J
+1D576		MATHEMATICAL BOLD FRAKTUR CAPITAL K
+1D577		MATHEMATICAL BOLD FRAKTUR CAPITAL L
+1D578		MATHEMATICAL BOLD FRAKTUR CAPITAL M
+1D579		MATHEMATICAL BOLD FRAKTUR CAPITAL N
+1D57A		MATHEMATICAL BOLD FRAKTUR CAPITAL O
+1D57B		MATHEMATICAL BOLD FRAKTUR CAPITAL P
+1D57C		MATHEMATICAL BOLD FRAKTUR CAPITAL Q
+1D57D		MATHEMATICAL BOLD FRAKTUR CAPITAL R
+1D57E		MATHEMATICAL BOLD FRAKTUR CAPITAL S
+1D57F		MATHEMATICAL BOLD FRAKTUR CAPITAL T
+1D580		MATHEMATICAL BOLD FRAKTUR CAPITAL U
+1D581		MATHEMATICAL BOLD FRAKTUR CAPITAL V
+1D582		MATHEMATICAL BOLD FRAKTUR CAPITAL W
+1D583		MATHEMATICAL BOLD FRAKTUR CAPITAL X
+1D584		MATHEMATICAL BOLD FRAKTUR CAPITAL Y
+1D585		MATHEMATICAL BOLD FRAKTUR CAPITAL Z
+1D586		MATHEMATICAL BOLD FRAKTUR SMALL A
+1D587		MATHEMATICAL BOLD FRAKTUR SMALL B
+1D588		MATHEMATICAL BOLD FRAKTUR SMALL C
+1D589		MATHEMATICAL BOLD FRAKTUR SMALL D
+1D58A		MATHEMATICAL BOLD FRAKTUR SMALL E
+1D58B		MATHEMATICAL BOLD FRAKTUR SMALL F
+1D58C		MATHEMATICAL BOLD FRAKTUR SMALL G
+1D58D		MATHEMATICAL BOLD FRAKTUR SMALL H
+1D58E		MATHEMATICAL BOLD FRAKTUR SMALL I
+1D58F		MATHEMATICAL BOLD FRAKTUR SMALL J
+1D590		MATHEMATICAL BOLD FRAKTUR SMALL K
+1D591		MATHEMATICAL BOLD FRAKTUR SMALL L
+1D592		MATHEMATICAL BOLD FRAKTUR SMALL M
+1D593		MATHEMATICAL BOLD FRAKTUR SMALL N
+1D594		MATHEMATICAL BOLD FRAKTUR SMALL O
+1D595		MATHEMATICAL BOLD FRAKTUR SMALL P
+1D596		MATHEMATICAL BOLD FRAKTUR SMALL Q
+1D597		MATHEMATICAL BOLD FRAKTUR SMALL R
+1D598		MATHEMATICAL BOLD FRAKTUR SMALL S
+1D599		MATHEMATICAL BOLD FRAKTUR SMALL T
+1D59A		MATHEMATICAL BOLD FRAKTUR SMALL U
+1D59B		MATHEMATICAL BOLD FRAKTUR SMALL V
+1D59C		MATHEMATICAL BOLD FRAKTUR SMALL W
+1D59D		MATHEMATICAL BOLD FRAKTUR SMALL X
+1D59E		MATHEMATICAL BOLD FRAKTUR SMALL Y
+1D59F		MATHEMATICAL BOLD FRAKTUR SMALL Z
+1D5A0		MATHEMATICAL SANS-SERIF CAPITAL A
+1D5A1		MATHEMATICAL SANS-SERIF CAPITAL B
+1D5A2		MATHEMATICAL SANS-SERIF CAPITAL C
+1D5A3		MATHEMATICAL SANS-SERIF CAPITAL D
+1D5A4		MATHEMATICAL SANS-SERIF CAPITAL E
+1D5A5		MATHEMATICAL SANS-SERIF CAPITAL F
+1D5A6		MATHEMATICAL SANS-SERIF CAPITAL G
+1D5A7		MATHEMATICAL SANS-SERIF CAPITAL H
+1D5A8		MATHEMATICAL SANS-SERIF CAPITAL I
+1D5A9		MATHEMATICAL SANS-SERIF CAPITAL J
+1D5AA		MATHEMATICAL SANS-SERIF CAPITAL K
+1D5AB		MATHEMATICAL SANS-SERIF CAPITAL L
+1D5AC		MATHEMATICAL SANS-SERIF CAPITAL M
+1D5AD		MATHEMATICAL SANS-SERIF CAPITAL N
+1D5AE		MATHEMATICAL SANS-SERIF CAPITAL O
+1D5AF		MATHEMATICAL SANS-SERIF CAPITAL P
+1D5B0		MATHEMATICAL SANS-SERIF CAPITAL Q
+1D5B1		MATHEMATICAL SANS-SERIF CAPITAL R
+1D5B2		MATHEMATICAL SANS-SERIF CAPITAL S
+1D5B3		MATHEMATICAL SANS-SERIF CAPITAL T
+1D5B4		MATHEMATICAL SANS-SERIF CAPITAL U
+1D5B5		MATHEMATICAL SANS-SERIF CAPITAL V
+1D5B6		MATHEMATICAL SANS-SERIF CAPITAL W
+1D5B7		MATHEMATICAL SANS-SERIF CAPITAL X
+1D5B8		MATHEMATICAL SANS-SERIF CAPITAL Y
+1D5B9		MATHEMATICAL SANS-SERIF CAPITAL Z
+1D5BA		MATHEMATICAL SANS-SERIF SMALL A
+1D5BB		MATHEMATICAL SANS-SERIF SMALL B
+1D5BC		MATHEMATICAL SANS-SERIF SMALL C
+1D5BD		MATHEMATICAL SANS-SERIF SMALL D
+1D5BE		MATHEMATICAL SANS-SERIF SMALL E
+1D5BF		MATHEMATICAL SANS-SERIF SMALL F
+1D5C0		MATHEMATICAL SANS-SERIF SMALL G
+1D5C1		MATHEMATICAL SANS-SERIF SMALL H
+1D5C2		MATHEMATICAL SANS-SERIF SMALL I
+1D5C3		MATHEMATICAL SANS-SERIF SMALL J
+1D5C4		MATHEMATICAL SANS-SERIF SMALL K
+1D5C5		MATHEMATICAL SANS-SERIF SMALL L
+1D5C6		MATHEMATICAL SANS-SERIF SMALL M
+1D5C7		MATHEMATICAL SANS-SERIF SMALL N
+1D5C8		MATHEMATICAL SANS-SERIF SMALL O
+1D5C9		MATHEMATICAL SANS-SERIF SMALL P
+1D5CA		MATHEMATICAL SANS-SERIF SMALL Q
+1D5CB		MATHEMATICAL SANS-SERIF SMALL R
+1D5CC		MATHEMATICAL SANS-SERIF SMALL S
+1D5CD		MATHEMATICAL SANS-SERIF SMALL T
+1D5CE		MATHEMATICAL SANS-SERIF SMALL U
+1D5CF		MATHEMATICAL SANS-SERIF SMALL V
+1D5D0		MATHEMATICAL SANS-SERIF SMALL W
+1D5D1		MATHEMATICAL SANS-SERIF SMALL X
+1D5D2		MATHEMATICAL SANS-SERIF SMALL Y
+1D5D3		MATHEMATICAL SANS-SERIF SMALL Z
+1D5D4		MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+1D5D5		MATHEMATICAL SANS-SERIF BOLD CAPITAL B
+1D5D6		MATHEMATICAL SANS-SERIF BOLD CAPITAL C
+1D5D7		MATHEMATICAL SANS-SERIF BOLD CAPITAL D
+1D5D8		MATHEMATICAL SANS-SERIF BOLD CAPITAL E
+1D5D9		MATHEMATICAL SANS-SERIF BOLD CAPITAL F
+1D5DA		MATHEMATICAL SANS-SERIF BOLD CAPITAL G
+1D5DB		MATHEMATICAL SANS-SERIF BOLD CAPITAL H
+1D5DC		MATHEMATICAL SANS-SERIF BOLD CAPITAL I
+1D5DD		MATHEMATICAL SANS-SERIF BOLD CAPITAL J
+1D5DE		MATHEMATICAL SANS-SERIF BOLD CAPITAL K
+1D5DF		MATHEMATICAL SANS-SERIF BOLD CAPITAL L
+1D5E0		MATHEMATICAL SANS-SERIF BOLD CAPITAL M
+1D5E1		MATHEMATICAL SANS-SERIF BOLD CAPITAL N
+1D5E2		MATHEMATICAL SANS-SERIF BOLD CAPITAL O
+1D5E3		MATHEMATICAL SANS-SERIF BOLD CAPITAL P
+1D5E4		MATHEMATICAL SANS-SERIF BOLD CAPITAL Q
+1D5E5		MATHEMATICAL SANS-SERIF BOLD CAPITAL R
+1D5E6		MATHEMATICAL SANS-SERIF BOLD CAPITAL S
+1D5E7		MATHEMATICAL SANS-SERIF BOLD CAPITAL T
+1D5E8		MATHEMATICAL SANS-SERIF BOLD CAPITAL U
+1D5E9		MATHEMATICAL SANS-SERIF BOLD CAPITAL V
+1D5EA		MATHEMATICAL SANS-SERIF BOLD CAPITAL W
+1D5EB		MATHEMATICAL SANS-SERIF BOLD CAPITAL X
+1D5EC		MATHEMATICAL SANS-SERIF BOLD CAPITAL Y
+1D5ED		MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
+1D5EE		MATHEMATICAL SANS-SERIF BOLD SMALL A
+1D5EF		MATHEMATICAL SANS-SERIF BOLD SMALL B
+1D5F0		MATHEMATICAL SANS-SERIF BOLD SMALL C
+1D5F1		MATHEMATICAL SANS-SERIF BOLD SMALL D
+1D5F2		MATHEMATICAL SANS-SERIF BOLD SMALL E
+1D5F3		MATHEMATICAL SANS-SERIF BOLD SMALL F
+1D5F4		MATHEMATICAL SANS-SERIF BOLD SMALL G
+1D5F5		MATHEMATICAL SANS-SERIF BOLD SMALL H
+1D5F6		MATHEMATICAL SANS-SERIF BOLD SMALL I
+1D5F7		MATHEMATICAL SANS-SERIF BOLD SMALL J
+1D5F8		MATHEMATICAL SANS-SERIF BOLD SMALL K
+1D5F9		MATHEMATICAL SANS-SERIF BOLD SMALL L
+1D5FA		MATHEMATICAL SANS-SERIF BOLD SMALL M
+1D5FB		MATHEMATICAL SANS-SERIF BOLD SMALL N
+1D5FC		MATHEMATICAL SANS-SERIF BOLD SMALL O
+1D5FD		MATHEMATICAL SANS-SERIF BOLD SMALL P
+1D5FE		MATHEMATICAL SANS-SERIF BOLD SMALL Q
+1D5FF		MATHEMATICAL SANS-SERIF BOLD SMALL R
+1D600		MATHEMATICAL SANS-SERIF BOLD SMALL S
+1D601		MATHEMATICAL SANS-SERIF BOLD SMALL T
+1D602		MATHEMATICAL SANS-SERIF BOLD SMALL U
+1D603		MATHEMATICAL SANS-SERIF BOLD SMALL V
+1D604		MATHEMATICAL SANS-SERIF BOLD SMALL W
+1D605		MATHEMATICAL SANS-SERIF BOLD SMALL X
+1D606		MATHEMATICAL SANS-SERIF BOLD SMALL Y
+1D607		MATHEMATICAL SANS-SERIF BOLD SMALL Z
+1D608		MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
+1D609		MATHEMATICAL SANS-SERIF ITALIC CAPITAL B
+1D60A		MATHEMATICAL SANS-SERIF ITALIC CAPITAL C
+1D60B		MATHEMATICAL SANS-SERIF ITALIC CAPITAL D
+1D60C		MATHEMATICAL SANS-SERIF ITALIC CAPITAL E
+1D60D		MATHEMATICAL SANS-SERIF ITALIC CAPITAL F
+1D60E		MATHEMATICAL SANS-SERIF ITALIC CAPITAL G
+1D60F		MATHEMATICAL SANS-SERIF ITALIC CAPITAL H
+1D610		MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
+1D611		MATHEMATICAL SANS-SERIF ITALIC CAPITAL J
+1D612		MATHEMATICAL SANS-SERIF ITALIC CAPITAL K
+1D613		MATHEMATICAL SANS-SERIF ITALIC CAPITAL L
+1D614		MATHEMATICAL SANS-SERIF ITALIC CAPITAL M
+1D615		MATHEMATICAL SANS-SERIF ITALIC CAPITAL N
+1D616		MATHEMATICAL SANS-SERIF ITALIC CAPITAL O
+1D617		MATHEMATICAL SANS-SERIF ITALIC CAPITAL P
+1D618		MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q
+1D619		MATHEMATICAL SANS-SERIF ITALIC CAPITAL R
+1D61A		MATHEMATICAL SANS-SERIF ITALIC CAPITAL S
+1D61B		MATHEMATICAL SANS-SERIF ITALIC CAPITAL T
+1D61C		MATHEMATICAL SANS-SERIF ITALIC CAPITAL U
+1D61D		MATHEMATICAL SANS-SERIF ITALIC CAPITAL V
+1D61E		MATHEMATICAL SANS-SERIF ITALIC CAPITAL W
+1D61F		MATHEMATICAL SANS-SERIF ITALIC CAPITAL X
+1D620		MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y
+1D621		MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
+1D622		MATHEMATICAL SANS-SERIF ITALIC SMALL A
+1D623		MATHEMATICAL SANS-SERIF ITALIC SMALL B
+1D624		MATHEMATICAL SANS-SERIF ITALIC SMALL C
+1D625		MATHEMATICAL SANS-SERIF ITALIC SMALL D
+1D626		MATHEMATICAL SANS-SERIF ITALIC SMALL E
+1D627		MATHEMATICAL SANS-SERIF ITALIC SMALL F
+1D628		MATHEMATICAL SANS-SERIF ITALIC SMALL G
+1D629		MATHEMATICAL SANS-SERIF ITALIC SMALL H
+1D62A		MATHEMATICAL SANS-SERIF ITALIC SMALL I
+1D62B		MATHEMATICAL SANS-SERIF ITALIC SMALL J
+1D62C		MATHEMATICAL SANS-SERIF ITALIC SMALL K
+1D62D		MATHEMATICAL SANS-SERIF ITALIC SMALL L
+1D62E		MATHEMATICAL SANS-SERIF ITALIC SMALL M
+1D62F		MATHEMATICAL SANS-SERIF ITALIC SMALL N
+1D630		MATHEMATICAL SANS-SERIF ITALIC SMALL O
+1D631		MATHEMATICAL SANS-SERIF ITALIC SMALL P
+1D632		MATHEMATICAL SANS-SERIF ITALIC SMALL Q
+1D633		MATHEMATICAL SANS-SERIF ITALIC SMALL R
+1D634		MATHEMATICAL SANS-SERIF ITALIC SMALL S
+1D635		MATHEMATICAL SANS-SERIF ITALIC SMALL T
+1D636		MATHEMATICAL SANS-SERIF ITALIC SMALL U
+1D637		MATHEMATICAL SANS-SERIF ITALIC SMALL V
+1D638		MATHEMATICAL SANS-SERIF ITALIC SMALL W
+1D639		MATHEMATICAL SANS-SERIF ITALIC SMALL X
+1D63A		MATHEMATICAL SANS-SERIF ITALIC SMALL Y
+1D63B		MATHEMATICAL SANS-SERIF ITALIC SMALL Z
+1D63C		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
+1D63D		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B
+1D63E		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C
+1D63F		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D
+1D640		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E
+1D641		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F
+1D642		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G
+1D643		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H
+1D644		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
+1D645		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J
+1D646		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K
+1D647		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L
+1D648		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M
+1D649		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N
+1D64A		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O
+1D64B		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P
+1D64C		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q
+1D64D		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R
+1D64E		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S
+1D64F		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T
+1D650		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U
+1D651		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V
+1D652		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W
+1D653		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X
+1D654		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y
+1D655		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
+1D656		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A
+1D657		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B
+1D658		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C
+1D659		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D
+1D65A		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E
+1D65B		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F
+1D65C		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G
+1D65D		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H
+1D65E		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I
+1D65F		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+1D660		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K
+1D661		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
+1D662		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M
+1D663		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N
+1D664		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O
+1D665		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P
+1D666		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q
+1D667		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R
+1D668		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S
+1D669		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T
+1D66A		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U
+1D66B		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V
+1D66C		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W
+1D66D		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X
+1D66E		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y
+1D66F		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
+1D670		MATHEMATICAL MONOSPACE CAPITAL A
+1D671		MATHEMATICAL MONOSPACE CAPITAL B
+1D672		MATHEMATICAL MONOSPACE CAPITAL C
+1D673		MATHEMATICAL MONOSPACE CAPITAL D
+1D674		MATHEMATICAL MONOSPACE CAPITAL E
+1D675		MATHEMATICAL MONOSPACE CAPITAL F
+1D676		MATHEMATICAL MONOSPACE CAPITAL G
+1D677		MATHEMATICAL MONOSPACE CAPITAL H
+1D678		MATHEMATICAL MONOSPACE CAPITAL I
+1D679		MATHEMATICAL MONOSPACE CAPITAL J
+1D67A		MATHEMATICAL MONOSPACE CAPITAL K
+1D67B		MATHEMATICAL MONOSPACE CAPITAL L
+1D67C		MATHEMATICAL MONOSPACE CAPITAL M
+1D67D		MATHEMATICAL MONOSPACE CAPITAL N
+1D67E		MATHEMATICAL MONOSPACE CAPITAL O
+1D67F		MATHEMATICAL MONOSPACE CAPITAL P
+1D680		MATHEMATICAL MONOSPACE CAPITAL Q
+1D681		MATHEMATICAL MONOSPACE CAPITAL R
+1D682		MATHEMATICAL MONOSPACE CAPITAL S
+1D683		MATHEMATICAL MONOSPACE CAPITAL T
+1D684		MATHEMATICAL MONOSPACE CAPITAL U
+1D685		MATHEMATICAL MONOSPACE CAPITAL V
+1D686		MATHEMATICAL MONOSPACE CAPITAL W
+1D687		MATHEMATICAL MONOSPACE CAPITAL X
+1D688		MATHEMATICAL MONOSPACE CAPITAL Y
+1D689		MATHEMATICAL MONOSPACE CAPITAL Z
+1D68A		MATHEMATICAL MONOSPACE SMALL A
+1D68B		MATHEMATICAL MONOSPACE SMALL B
+1D68C		MATHEMATICAL MONOSPACE SMALL C
+1D68D		MATHEMATICAL MONOSPACE SMALL D
+1D68E		MATHEMATICAL MONOSPACE SMALL E
+1D68F		MATHEMATICAL MONOSPACE SMALL F
+1D690		MATHEMATICAL MONOSPACE SMALL G
+1D691		MATHEMATICAL MONOSPACE SMALL H
+1D692		MATHEMATICAL MONOSPACE SMALL I
+1D693		MATHEMATICAL MONOSPACE SMALL J
+1D694		MATHEMATICAL MONOSPACE SMALL K
+1D695		MATHEMATICAL MONOSPACE SMALL L
+1D696		MATHEMATICAL MONOSPACE SMALL M
+1D697		MATHEMATICAL MONOSPACE SMALL N
+1D698		MATHEMATICAL MONOSPACE SMALL O
+1D699		MATHEMATICAL MONOSPACE SMALL P
+1D69A		MATHEMATICAL MONOSPACE SMALL Q
+1D69B		MATHEMATICAL MONOSPACE SMALL R
+1D69C		MATHEMATICAL MONOSPACE SMALL S
+1D69D		MATHEMATICAL MONOSPACE SMALL T
+1D69E		MATHEMATICAL MONOSPACE SMALL U
+1D69F		MATHEMATICAL MONOSPACE SMALL V
+1D6A0		MATHEMATICAL MONOSPACE SMALL W
+1D6A1		MATHEMATICAL MONOSPACE SMALL X
+1D6A2		MATHEMATICAL MONOSPACE SMALL Y
+1D6A3		MATHEMATICAL MONOSPACE SMALL Z
+1D6A4		MATHEMATICAL ITALIC SMALL DOTLESS I
+1D6A5		MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8		MATHEMATICAL BOLD CAPITAL ALPHA
+1D6A9		MATHEMATICAL BOLD CAPITAL BETA
+1D6AA		MATHEMATICAL BOLD CAPITAL GAMMA
+1D6AB		MATHEMATICAL BOLD CAPITAL DELTA
+1D6AC		MATHEMATICAL BOLD CAPITAL EPSILON
+1D6AD		MATHEMATICAL BOLD CAPITAL ZETA
+1D6AE		MATHEMATICAL BOLD CAPITAL ETA
+1D6AF		MATHEMATICAL BOLD CAPITAL THETA
+1D6B0		MATHEMATICAL BOLD CAPITAL IOTA
+1D6B1		MATHEMATICAL BOLD CAPITAL KAPPA
+1D6B2		MATHEMATICAL BOLD CAPITAL LAMDA
+1D6B3		MATHEMATICAL BOLD CAPITAL MU
+1D6B4		MATHEMATICAL BOLD CAPITAL NU
+1D6B5		MATHEMATICAL BOLD CAPITAL XI
+1D6B6		MATHEMATICAL BOLD CAPITAL OMICRON
+1D6B7		MATHEMATICAL BOLD CAPITAL PI
+1D6B8		MATHEMATICAL BOLD CAPITAL RHO
+1D6B9		MATHEMATICAL BOLD CAPITAL THETA SYMBOL
+1D6BA		MATHEMATICAL BOLD CAPITAL SIGMA
+1D6BB		MATHEMATICAL BOLD CAPITAL TAU
+1D6BC		MATHEMATICAL BOLD CAPITAL UPSILON
+1D6BD		MATHEMATICAL BOLD CAPITAL PHI
+1D6BE		MATHEMATICAL BOLD CAPITAL CHI
+1D6BF		MATHEMATICAL BOLD CAPITAL PSI
+1D6C0		MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1		MATHEMATICAL BOLD NABLA
+1D6C2		MATHEMATICAL BOLD SMALL ALPHA
+1D6C3		MATHEMATICAL BOLD SMALL BETA
+1D6C4		MATHEMATICAL BOLD SMALL GAMMA
+1D6C5		MATHEMATICAL BOLD SMALL DELTA
+1D6C6		MATHEMATICAL BOLD SMALL EPSILON
+1D6C7		MATHEMATICAL BOLD SMALL ZETA
+1D6C8		MATHEMATICAL BOLD SMALL ETA
+1D6C9		MATHEMATICAL BOLD SMALL THETA
+1D6CA		MATHEMATICAL BOLD SMALL IOTA
+1D6CB		MATHEMATICAL BOLD SMALL KAPPA
+1D6CC		MATHEMATICAL BOLD SMALL LAMDA
+1D6CD		MATHEMATICAL BOLD SMALL MU
+1D6CE		MATHEMATICAL BOLD SMALL NU
+1D6CF		MATHEMATICAL BOLD SMALL XI
+1D6D0		MATHEMATICAL BOLD SMALL OMICRON
+1D6D1		MATHEMATICAL BOLD SMALL PI
+1D6D2		MATHEMATICAL BOLD SMALL RHO
+1D6D3		MATHEMATICAL BOLD SMALL FINAL SIGMA
+1D6D4		MATHEMATICAL BOLD SMALL SIGMA
+1D6D5		MATHEMATICAL BOLD SMALL TAU
+1D6D6		MATHEMATICAL BOLD SMALL UPSILON
+1D6D7		MATHEMATICAL BOLD SMALL PHI
+1D6D8		MATHEMATICAL BOLD SMALL CHI
+1D6D9		MATHEMATICAL BOLD SMALL PSI
+1D6DA		MATHEMATICAL BOLD SMALL OMEGA
+1D6DB		MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC		MATHEMATICAL BOLD EPSILON SYMBOL
+1D6DD		MATHEMATICAL BOLD THETA SYMBOL
+1D6DE		MATHEMATICAL BOLD KAPPA SYMBOL
+1D6DF		MATHEMATICAL BOLD PHI SYMBOL
+1D6E0		MATHEMATICAL BOLD RHO SYMBOL
+1D6E1		MATHEMATICAL BOLD PI SYMBOL
+1D6E2		MATHEMATICAL ITALIC CAPITAL ALPHA
+1D6E3		MATHEMATICAL ITALIC CAPITAL BETA
+1D6E4		MATHEMATICAL ITALIC CAPITAL GAMMA
+1D6E5		MATHEMATICAL ITALIC CAPITAL DELTA
+1D6E6		MATHEMATICAL ITALIC CAPITAL EPSILON
+1D6E7		MATHEMATICAL ITALIC CAPITAL ZETA
+1D6E8		MATHEMATICAL ITALIC CAPITAL ETA
+1D6E9		MATHEMATICAL ITALIC CAPITAL THETA
+1D6EA		MATHEMATICAL ITALIC CAPITAL IOTA
+1D6EB		MATHEMATICAL ITALIC CAPITAL KAPPA
+1D6EC		MATHEMATICAL ITALIC CAPITAL LAMDA
+1D6ED		MATHEMATICAL ITALIC CAPITAL MU
+1D6EE		MATHEMATICAL ITALIC CAPITAL NU
+1D6EF		MATHEMATICAL ITALIC CAPITAL XI
+1D6F0		MATHEMATICAL ITALIC CAPITAL OMICRON
+1D6F1		MATHEMATICAL ITALIC CAPITAL PI
+1D6F2		MATHEMATICAL ITALIC CAPITAL RHO
+1D6F3		MATHEMATICAL ITALIC CAPITAL THETA SYMBOL
+1D6F4		MATHEMATICAL ITALIC CAPITAL SIGMA
+1D6F5		MATHEMATICAL ITALIC CAPITAL TAU
+1D6F6		MATHEMATICAL ITALIC CAPITAL UPSILON
+1D6F7		MATHEMATICAL ITALIC CAPITAL PHI
+1D6F8		MATHEMATICAL ITALIC CAPITAL CHI
+1D6F9		MATHEMATICAL ITALIC CAPITAL PSI
+1D6FA		MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB		MATHEMATICAL ITALIC NABLA
+1D6FC		MATHEMATICAL ITALIC SMALL ALPHA
+1D6FD		MATHEMATICAL ITALIC SMALL BETA
+1D6FE		MATHEMATICAL ITALIC SMALL GAMMA
+1D6FF		MATHEMATICAL ITALIC SMALL DELTA
+1D700		MATHEMATICAL ITALIC SMALL EPSILON
+1D701		MATHEMATICAL ITALIC SMALL ZETA
+1D702		MATHEMATICAL ITALIC SMALL ETA
+1D703		MATHEMATICAL ITALIC SMALL THETA
+1D704		MATHEMATICAL ITALIC SMALL IOTA
+1D705		MATHEMATICAL ITALIC SMALL KAPPA
+1D706		MATHEMATICAL ITALIC SMALL LAMDA
+1D707		MATHEMATICAL ITALIC SMALL MU
+1D708		MATHEMATICAL ITALIC SMALL NU
+1D709		MATHEMATICAL ITALIC SMALL XI
+1D70A		MATHEMATICAL ITALIC SMALL OMICRON
+1D70B		MATHEMATICAL ITALIC SMALL PI
+1D70C		MATHEMATICAL ITALIC SMALL RHO
+1D70D		MATHEMATICAL ITALIC SMALL FINAL SIGMA
+1D70E		MATHEMATICAL ITALIC SMALL SIGMA
+1D70F		MATHEMATICAL ITALIC SMALL TAU
+1D710		MATHEMATICAL ITALIC SMALL UPSILON
+1D711		MATHEMATICAL ITALIC SMALL PHI
+1D712		MATHEMATICAL ITALIC SMALL CHI
+1D713		MATHEMATICAL ITALIC SMALL PSI
+1D714		MATHEMATICAL ITALIC SMALL OMEGA
+1D715		MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716		MATHEMATICAL ITALIC EPSILON SYMBOL
+1D717		MATHEMATICAL ITALIC THETA SYMBOL
+1D718		MATHEMATICAL ITALIC KAPPA SYMBOL
+1D719		MATHEMATICAL ITALIC PHI SYMBOL
+1D71A		MATHEMATICAL ITALIC RHO SYMBOL
+1D71B		MATHEMATICAL ITALIC PI SYMBOL
+1D71C		MATHEMATICAL BOLD ITALIC CAPITAL ALPHA
+1D71D		MATHEMATICAL BOLD ITALIC CAPITAL BETA
+1D71E		MATHEMATICAL BOLD ITALIC CAPITAL GAMMA
+1D71F		MATHEMATICAL BOLD ITALIC CAPITAL DELTA
+1D720		MATHEMATICAL BOLD ITALIC CAPITAL EPSILON
+1D721		MATHEMATICAL BOLD ITALIC CAPITAL ZETA
+1D722		MATHEMATICAL BOLD ITALIC CAPITAL ETA
+1D723		MATHEMATICAL BOLD ITALIC CAPITAL THETA
+1D724		MATHEMATICAL BOLD ITALIC CAPITAL IOTA
+1D725		MATHEMATICAL BOLD ITALIC CAPITAL KAPPA
+1D726		MATHEMATICAL BOLD ITALIC CAPITAL LAMDA
+1D727		MATHEMATICAL BOLD ITALIC CAPITAL MU
+1D728		MATHEMATICAL BOLD ITALIC CAPITAL NU
+1D729		MATHEMATICAL BOLD ITALIC CAPITAL XI
+1D72A		MATHEMATICAL BOLD ITALIC CAPITAL OMICRON
+1D72B		MATHEMATICAL BOLD ITALIC CAPITAL PI
+1D72C		MATHEMATICAL BOLD ITALIC CAPITAL RHO
+1D72D		MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL
+1D72E		MATHEMATICAL BOLD ITALIC CAPITAL SIGMA
+1D72F		MATHEMATICAL BOLD ITALIC CAPITAL TAU
+1D730		MATHEMATICAL BOLD ITALIC CAPITAL UPSILON
+1D731		MATHEMATICAL BOLD ITALIC CAPITAL PHI
+1D732		MATHEMATICAL BOLD ITALIC CAPITAL CHI
+1D733		MATHEMATICAL BOLD ITALIC CAPITAL PSI
+1D734		MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735		MATHEMATICAL BOLD ITALIC NABLA
+1D736		MATHEMATICAL BOLD ITALIC SMALL ALPHA
+1D737		MATHEMATICAL BOLD ITALIC SMALL BETA
+1D738		MATHEMATICAL BOLD ITALIC SMALL GAMMA
+1D739		MATHEMATICAL BOLD ITALIC SMALL DELTA
+1D73A		MATHEMATICAL BOLD ITALIC SMALL EPSILON
+1D73B		MATHEMATICAL BOLD ITALIC SMALL ZETA
+1D73C		MATHEMATICAL BOLD ITALIC SMALL ETA
+1D73D		MATHEMATICAL BOLD ITALIC SMALL THETA
+1D73E		MATHEMATICAL BOLD ITALIC SMALL IOTA
+1D73F		MATHEMATICAL BOLD ITALIC SMALL KAPPA
+1D740		MATHEMATICAL BOLD ITALIC SMALL LAMDA
+1D741		MATHEMATICAL BOLD ITALIC SMALL MU
+1D742		MATHEMATICAL BOLD ITALIC SMALL NU
+1D743		MATHEMATICAL BOLD ITALIC SMALL XI
+1D744		MATHEMATICAL BOLD ITALIC SMALL OMICRON
+1D745		MATHEMATICAL BOLD ITALIC SMALL PI
+1D746		MATHEMATICAL BOLD ITALIC SMALL RHO
+1D747		MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA
+1D748		MATHEMATICAL BOLD ITALIC SMALL SIGMA
+1D749		MATHEMATICAL BOLD ITALIC SMALL TAU
+1D74A		MATHEMATICAL BOLD ITALIC SMALL UPSILON
+1D74B		MATHEMATICAL BOLD ITALIC SMALL PHI
+1D74C		MATHEMATICAL BOLD ITALIC SMALL CHI
+1D74D		MATHEMATICAL BOLD ITALIC SMALL PSI
+1D74E		MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F		MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750		MATHEMATICAL BOLD ITALIC EPSILON SYMBOL
+1D751		MATHEMATICAL BOLD ITALIC THETA SYMBOL
+1D752		MATHEMATICAL BOLD ITALIC KAPPA SYMBOL
+1D753		MATHEMATICAL BOLD ITALIC PHI SYMBOL
+1D754		MATHEMATICAL BOLD ITALIC RHO SYMBOL
+1D755		MATHEMATICAL BOLD ITALIC PI SYMBOL
+1D756		MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA
+1D757		MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA
+1D758		MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA
+1D759		MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA
+1D75A		MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON
+1D75B		MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA
+1D75C		MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA
+1D75D		MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA
+1D75E		MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
+1D75F		MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA
+1D760		MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA
+1D761		MATHEMATICAL SANS-SERIF BOLD CAPITAL MU
+1D762		MATHEMATICAL SANS-SERIF BOLD CAPITAL NU
+1D763		MATHEMATICAL SANS-SERIF BOLD CAPITAL XI
+1D764		MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON
+1D765		MATHEMATICAL SANS-SERIF BOLD CAPITAL PI
+1D766		MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO
+1D767		MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL
+1D768		MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA
+1D769		MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU
+1D76A		MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON
+1D76B		MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI
+1D76C		MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI
+1D76D		MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI
+1D76E		MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F		MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770		MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA
+1D771		MATHEMATICAL SANS-SERIF BOLD SMALL BETA
+1D772		MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA
+1D773		MATHEMATICAL SANS-SERIF BOLD SMALL DELTA
+1D774		MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON
+1D775		MATHEMATICAL SANS-SERIF BOLD SMALL ZETA
+1D776		MATHEMATICAL SANS-SERIF BOLD SMALL ETA
+1D777		MATHEMATICAL SANS-SERIF BOLD SMALL THETA
+1D778		MATHEMATICAL SANS-SERIF BOLD SMALL IOTA
+1D779		MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA
+1D77A		MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA
+1D77B		MATHEMATICAL SANS-SERIF BOLD SMALL MU
+1D77C		MATHEMATICAL SANS-SERIF BOLD SMALL NU
+1D77D		MATHEMATICAL SANS-SERIF BOLD SMALL XI
+1D77E		MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON
+1D77F		MATHEMATICAL SANS-SERIF BOLD SMALL PI
+1D780		MATHEMATICAL SANS-SERIF BOLD SMALL RHO
+1D781		MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA
+1D782		MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA
+1D783		MATHEMATICAL SANS-SERIF BOLD SMALL TAU
+1D784		MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON
+1D785		MATHEMATICAL SANS-SERIF BOLD SMALL PHI
+1D786		MATHEMATICAL SANS-SERIF BOLD SMALL CHI
+1D787		MATHEMATICAL SANS-SERIF BOLD SMALL PSI
+1D788		MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789		MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A		MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL
+1D78B		MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL
+1D78C		MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL
+1D78D		MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL
+1D78E		MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL
+1D78F		MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
+1D790		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA
+1D791		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA
+1D792		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA
+1D793		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA
+1D794		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON
+1D795		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA
+1D796		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA
+1D797		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA
+1D798		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
+1D799		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA
+1D79A		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA
+1D79B		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU
+1D79C		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU
+1D79D		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI
+1D79E		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON
+1D79F		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI
+1D7A0		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO
+1D7A1		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL
+1D7A2		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA
+1D7A3		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU
+1D7A4		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON
+1D7A5		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI
+1D7A6		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI
+1D7A7		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI
+1D7A8		MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9		MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA
+1D7AB		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA
+1D7AC		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA
+1D7AD		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA
+1D7AE		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON
+1D7AF		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA
+1D7B0		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA
+1D7B1		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA
+1D7B2		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA
+1D7B3		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA
+1D7B4		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA
+1D7B5		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU
+1D7B6		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU
+1D7B7		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI
+1D7B8		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON
+1D7B9		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI
+1D7BA		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO
+1D7BB		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA
+1D7BC		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA
+1D7BD		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU
+1D7BE		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON
+1D7BF		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI
+1D7C0		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI
+1D7C1		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI
+1D7C2		MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3		MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4		MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL
+1D7C5		MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL
+1D7C6		MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL
+1D7C7		MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL
+1D7C8		MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL
+1D7C9		MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+1D7CE		MATHEMATICAL BOLD DIGIT ZERO
+1D7CF		MATHEMATICAL BOLD DIGIT ONE
+1D7D0		MATHEMATICAL BOLD DIGIT TWO
+1D7D1		MATHEMATICAL BOLD DIGIT THREE
+1D7D2		MATHEMATICAL BOLD DIGIT FOUR
+1D7D3		MATHEMATICAL BOLD DIGIT FIVE
+1D7D4		MATHEMATICAL BOLD DIGIT SIX
+1D7D5		MATHEMATICAL BOLD DIGIT SEVEN
+1D7D6		MATHEMATICAL BOLD DIGIT EIGHT
+1D7D7		MATHEMATICAL BOLD DIGIT NINE
+1D7D8		MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
+1D7D9		MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
+1D7DA		MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
+1D7DB		MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
+1D7DC		MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
+1D7DD		MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
+1D7DE		MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
+1D7DF		MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
+1D7E0		MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
+1D7E1		MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
+1D7E2		MATHEMATICAL SANS-SERIF DIGIT ZERO
+1D7E3		MATHEMATICAL SANS-SERIF DIGIT ONE
+1D7E4		MATHEMATICAL SANS-SERIF DIGIT TWO
+1D7E5		MATHEMATICAL SANS-SERIF DIGIT THREE
+1D7E6		MATHEMATICAL SANS-SERIF DIGIT FOUR
+1D7E7		MATHEMATICAL SANS-SERIF DIGIT FIVE
+1D7E8		MATHEMATICAL SANS-SERIF DIGIT SIX
+1D7E9		MATHEMATICAL SANS-SERIF DIGIT SEVEN
+1D7EA		MATHEMATICAL SANS-SERIF DIGIT EIGHT
+1D7EB		MATHEMATICAL SANS-SERIF DIGIT NINE
+1D7EC		MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
+1D7ED		MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
+1D7EE		MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
+1D7EF		MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
+1D7F0		MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
+1D7F1		MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
+1D7F2		MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
+1D7F3		MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
+1D7F4		MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
+1D7F5		MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
+1D7F6		MATHEMATICAL MONOSPACE DIGIT ZERO
+1D7F7		MATHEMATICAL MONOSPACE DIGIT ONE
+1D7F8		MATHEMATICAL MONOSPACE DIGIT TWO
+1D7F9		MATHEMATICAL MONOSPACE DIGIT THREE
+1D7FA		MATHEMATICAL MONOSPACE DIGIT FOUR
+1D7FB		MATHEMATICAL MONOSPACE DIGIT FIVE
+1D7FC		MATHEMATICAL MONOSPACE DIGIT SIX
+1D7FD		MATHEMATICAL MONOSPACE DIGIT SEVEN
+1D7FE		MATHEMATICAL MONOSPACE DIGIT EIGHT
+1D7FF		MATHEMATICAL MONOSPACE DIGIT NINE
+20000	2A6D6	CJK Ideograph Extension B
+2F800		CJK COMPATIBILITY IDEOGRAPH-2F800
+2F801		CJK COMPATIBILITY IDEOGRAPH-2F801
+2F802		CJK COMPATIBILITY IDEOGRAPH-2F802
+2F803		CJK COMPATIBILITY IDEOGRAPH-2F803
+2F804		CJK COMPATIBILITY IDEOGRAPH-2F804
+2F805		CJK COMPATIBILITY IDEOGRAPH-2F805
+2F806		CJK COMPATIBILITY IDEOGRAPH-2F806
+2F807		CJK COMPATIBILITY IDEOGRAPH-2F807
+2F808		CJK COMPATIBILITY IDEOGRAPH-2F808
+2F809		CJK COMPATIBILITY IDEOGRAPH-2F809
+2F80A		CJK COMPATIBILITY IDEOGRAPH-2F80A
+2F80B		CJK COMPATIBILITY IDEOGRAPH-2F80B
+2F80C		CJK COMPATIBILITY IDEOGRAPH-2F80C
+2F80D		CJK COMPATIBILITY IDEOGRAPH-2F80D
+2F80E		CJK COMPATIBILITY IDEOGRAPH-2F80E
+2F80F		CJK COMPATIBILITY IDEOGRAPH-2F80F
+2F810		CJK COMPATIBILITY IDEOGRAPH-2F810
+2F811		CJK COMPATIBILITY IDEOGRAPH-2F811
+2F812		CJK COMPATIBILITY IDEOGRAPH-2F812
+2F813		CJK COMPATIBILITY IDEOGRAPH-2F813
+2F814		CJK COMPATIBILITY IDEOGRAPH-2F814
+2F815		CJK COMPATIBILITY IDEOGRAPH-2F815
+2F816		CJK COMPATIBILITY IDEOGRAPH-2F816
+2F817		CJK COMPATIBILITY IDEOGRAPH-2F817
+2F818		CJK COMPATIBILITY IDEOGRAPH-2F818
+2F819		CJK COMPATIBILITY IDEOGRAPH-2F819
+2F81A		CJK COMPATIBILITY IDEOGRAPH-2F81A
+2F81B		CJK COMPATIBILITY IDEOGRAPH-2F81B
+2F81C		CJK COMPATIBILITY IDEOGRAPH-2F81C
+2F81D		CJK COMPATIBILITY IDEOGRAPH-2F81D
+2F81E		CJK COMPATIBILITY IDEOGRAPH-2F81E
+2F81F		CJK COMPATIBILITY IDEOGRAPH-2F81F
+2F820		CJK COMPATIBILITY IDEOGRAPH-2F820
+2F821		CJK COMPATIBILITY IDEOGRAPH-2F821
+2F822		CJK COMPATIBILITY IDEOGRAPH-2F822
+2F823		CJK COMPATIBILITY IDEOGRAPH-2F823
+2F824		CJK COMPATIBILITY IDEOGRAPH-2F824
+2F825		CJK COMPATIBILITY IDEOGRAPH-2F825
+2F826		CJK COMPATIBILITY IDEOGRAPH-2F826
+2F827		CJK COMPATIBILITY IDEOGRAPH-2F827
+2F828		CJK COMPATIBILITY IDEOGRAPH-2F828
+2F829		CJK COMPATIBILITY IDEOGRAPH-2F829
+2F82A		CJK COMPATIBILITY IDEOGRAPH-2F82A
+2F82B		CJK COMPATIBILITY IDEOGRAPH-2F82B
+2F82C		CJK COMPATIBILITY IDEOGRAPH-2F82C
+2F82D		CJK COMPATIBILITY IDEOGRAPH-2F82D
+2F82E		CJK COMPATIBILITY IDEOGRAPH-2F82E
+2F82F		CJK COMPATIBILITY IDEOGRAPH-2F82F
+2F830		CJK COMPATIBILITY IDEOGRAPH-2F830
+2F831		CJK COMPATIBILITY IDEOGRAPH-2F831
+2F832		CJK COMPATIBILITY IDEOGRAPH-2F832
+2F833		CJK COMPATIBILITY IDEOGRAPH-2F833
+2F834		CJK COMPATIBILITY IDEOGRAPH-2F834
+2F835		CJK COMPATIBILITY IDEOGRAPH-2F835
+2F836		CJK COMPATIBILITY IDEOGRAPH-2F836
+2F837		CJK COMPATIBILITY IDEOGRAPH-2F837
+2F838		CJK COMPATIBILITY IDEOGRAPH-2F838
+2F839		CJK COMPATIBILITY IDEOGRAPH-2F839
+2F83A		CJK COMPATIBILITY IDEOGRAPH-2F83A
+2F83B		CJK COMPATIBILITY IDEOGRAPH-2F83B
+2F83C		CJK COMPATIBILITY IDEOGRAPH-2F83C
+2F83D		CJK COMPATIBILITY IDEOGRAPH-2F83D
+2F83E		CJK COMPATIBILITY IDEOGRAPH-2F83E
+2F83F		CJK COMPATIBILITY IDEOGRAPH-2F83F
+2F840		CJK COMPATIBILITY IDEOGRAPH-2F840
+2F841		CJK COMPATIBILITY IDEOGRAPH-2F841
+2F842		CJK COMPATIBILITY IDEOGRAPH-2F842
+2F843		CJK COMPATIBILITY IDEOGRAPH-2F843
+2F844		CJK COMPATIBILITY IDEOGRAPH-2F844
+2F845		CJK COMPATIBILITY IDEOGRAPH-2F845
+2F846		CJK COMPATIBILITY IDEOGRAPH-2F846
+2F847		CJK COMPATIBILITY IDEOGRAPH-2F847
+2F848		CJK COMPATIBILITY IDEOGRAPH-2F848
+2F849		CJK COMPATIBILITY IDEOGRAPH-2F849
+2F84A		CJK COMPATIBILITY IDEOGRAPH-2F84A
+2F84B		CJK COMPATIBILITY IDEOGRAPH-2F84B
+2F84C		CJK COMPATIBILITY IDEOGRAPH-2F84C
+2F84D		CJK COMPATIBILITY IDEOGRAPH-2F84D
+2F84E		CJK COMPATIBILITY IDEOGRAPH-2F84E
+2F84F		CJK COMPATIBILITY IDEOGRAPH-2F84F
+2F850		CJK COMPATIBILITY IDEOGRAPH-2F850
+2F851		CJK COMPATIBILITY IDEOGRAPH-2F851
+2F852		CJK COMPATIBILITY IDEOGRAPH-2F852
+2F853		CJK COMPATIBILITY IDEOGRAPH-2F853
+2F854		CJK COMPATIBILITY IDEOGRAPH-2F854
+2F855		CJK COMPATIBILITY IDEOGRAPH-2F855
+2F856		CJK COMPATIBILITY IDEOGRAPH-2F856
+2F857		CJK COMPATIBILITY IDEOGRAPH-2F857
+2F858		CJK COMPATIBILITY IDEOGRAPH-2F858
+2F859		CJK COMPATIBILITY IDEOGRAPH-2F859
+2F85A		CJK COMPATIBILITY IDEOGRAPH-2F85A
+2F85B		CJK COMPATIBILITY IDEOGRAPH-2F85B
+2F85C		CJK COMPATIBILITY IDEOGRAPH-2F85C
+2F85D		CJK COMPATIBILITY IDEOGRAPH-2F85D
+2F85E		CJK COMPATIBILITY IDEOGRAPH-2F85E
+2F85F		CJK COMPATIBILITY IDEOGRAPH-2F85F
+2F860		CJK COMPATIBILITY IDEOGRAPH-2F860
+2F861		CJK COMPATIBILITY IDEOGRAPH-2F861
+2F862		CJK COMPATIBILITY IDEOGRAPH-2F862
+2F863		CJK COMPATIBILITY IDEOGRAPH-2F863
+2F864		CJK COMPATIBILITY IDEOGRAPH-2F864
+2F865		CJK COMPATIBILITY IDEOGRAPH-2F865
+2F866		CJK COMPATIBILITY IDEOGRAPH-2F866
+2F867		CJK COMPATIBILITY IDEOGRAPH-2F867
+2F868		CJK COMPATIBILITY IDEOGRAPH-2F868
+2F869		CJK COMPATIBILITY IDEOGRAPH-2F869
+2F86A		CJK COMPATIBILITY IDEOGRAPH-2F86A
+2F86B		CJK COMPATIBILITY IDEOGRAPH-2F86B
+2F86C		CJK COMPATIBILITY IDEOGRAPH-2F86C
+2F86D		CJK COMPATIBILITY IDEOGRAPH-2F86D
+2F86E		CJK COMPATIBILITY IDEOGRAPH-2F86E
+2F86F		CJK COMPATIBILITY IDEOGRAPH-2F86F
+2F870		CJK COMPATIBILITY IDEOGRAPH-2F870
+2F871		CJK COMPATIBILITY IDEOGRAPH-2F871
+2F872		CJK COMPATIBILITY IDEOGRAPH-2F872
+2F873		CJK COMPATIBILITY IDEOGRAPH-2F873
+2F874		CJK COMPATIBILITY IDEOGRAPH-2F874
+2F875		CJK COMPATIBILITY IDEOGRAPH-2F875
+2F876		CJK COMPATIBILITY IDEOGRAPH-2F876
+2F877		CJK COMPATIBILITY IDEOGRAPH-2F877
+2F878		CJK COMPATIBILITY IDEOGRAPH-2F878
+2F879		CJK COMPATIBILITY IDEOGRAPH-2F879
+2F87A		CJK COMPATIBILITY IDEOGRAPH-2F87A
+2F87B		CJK COMPATIBILITY IDEOGRAPH-2F87B
+2F87C		CJK COMPATIBILITY IDEOGRAPH-2F87C
+2F87D		CJK COMPATIBILITY IDEOGRAPH-2F87D
+2F87E		CJK COMPATIBILITY IDEOGRAPH-2F87E
+2F87F		CJK COMPATIBILITY IDEOGRAPH-2F87F
+2F880		CJK COMPATIBILITY IDEOGRAPH-2F880
+2F881		CJK COMPATIBILITY IDEOGRAPH-2F881
+2F882		CJK COMPATIBILITY IDEOGRAPH-2F882
+2F883		CJK COMPATIBILITY IDEOGRAPH-2F883
+2F884		CJK COMPATIBILITY IDEOGRAPH-2F884
+2F885		CJK COMPATIBILITY IDEOGRAPH-2F885
+2F886		CJK COMPATIBILITY IDEOGRAPH-2F886
+2F887		CJK COMPATIBILITY IDEOGRAPH-2F887
+2F888		CJK COMPATIBILITY IDEOGRAPH-2F888
+2F889		CJK COMPATIBILITY IDEOGRAPH-2F889
+2F88A		CJK COMPATIBILITY IDEOGRAPH-2F88A
+2F88B		CJK COMPATIBILITY IDEOGRAPH-2F88B
+2F88C		CJK COMPATIBILITY IDEOGRAPH-2F88C
+2F88D		CJK COMPATIBILITY IDEOGRAPH-2F88D
+2F88E		CJK COMPATIBILITY IDEOGRAPH-2F88E
+2F88F		CJK COMPATIBILITY IDEOGRAPH-2F88F
+2F890		CJK COMPATIBILITY IDEOGRAPH-2F890
+2F891		CJK COMPATIBILITY IDEOGRAPH-2F891
+2F892		CJK COMPATIBILITY IDEOGRAPH-2F892
+2F893		CJK COMPATIBILITY IDEOGRAPH-2F893
+2F894		CJK COMPATIBILITY IDEOGRAPH-2F894
+2F895		CJK COMPATIBILITY IDEOGRAPH-2F895
+2F896		CJK COMPATIBILITY IDEOGRAPH-2F896
+2F897		CJK COMPATIBILITY IDEOGRAPH-2F897
+2F898		CJK COMPATIBILITY IDEOGRAPH-2F898
+2F899		CJK COMPATIBILITY IDEOGRAPH-2F899
+2F89A		CJK COMPATIBILITY IDEOGRAPH-2F89A
+2F89B		CJK COMPATIBILITY IDEOGRAPH-2F89B
+2F89C		CJK COMPATIBILITY IDEOGRAPH-2F89C
+2F89D		CJK COMPATIBILITY IDEOGRAPH-2F89D
+2F89E		CJK COMPATIBILITY IDEOGRAPH-2F89E
+2F89F		CJK COMPATIBILITY IDEOGRAPH-2F89F
+2F8A0		CJK COMPATIBILITY IDEOGRAPH-2F8A0
+2F8A1		CJK COMPATIBILITY IDEOGRAPH-2F8A1
+2F8A2		CJK COMPATIBILITY IDEOGRAPH-2F8A2
+2F8A3		CJK COMPATIBILITY IDEOGRAPH-2F8A3
+2F8A4		CJK COMPATIBILITY IDEOGRAPH-2F8A4
+2F8A5		CJK COMPATIBILITY IDEOGRAPH-2F8A5
+2F8A6		CJK COMPATIBILITY IDEOGRAPH-2F8A6
+2F8A7		CJK COMPATIBILITY IDEOGRAPH-2F8A7
+2F8A8		CJK COMPATIBILITY IDEOGRAPH-2F8A8
+2F8A9		CJK COMPATIBILITY IDEOGRAPH-2F8A9
+2F8AA		CJK COMPATIBILITY IDEOGRAPH-2F8AA
+2F8AB		CJK COMPATIBILITY IDEOGRAPH-2F8AB
+2F8AC		CJK COMPATIBILITY IDEOGRAPH-2F8AC
+2F8AD		CJK COMPATIBILITY IDEOGRAPH-2F8AD
+2F8AE		CJK COMPATIBILITY IDEOGRAPH-2F8AE
+2F8AF		CJK COMPATIBILITY IDEOGRAPH-2F8AF
+2F8B0		CJK COMPATIBILITY IDEOGRAPH-2F8B0
+2F8B1		CJK COMPATIBILITY IDEOGRAPH-2F8B1
+2F8B2		CJK COMPATIBILITY IDEOGRAPH-2F8B2
+2F8B3		CJK COMPATIBILITY IDEOGRAPH-2F8B3
+2F8B4		CJK COMPATIBILITY IDEOGRAPH-2F8B4
+2F8B5		CJK COMPATIBILITY IDEOGRAPH-2F8B5
+2F8B6		CJK COMPATIBILITY IDEOGRAPH-2F8B6
+2F8B7		CJK COMPATIBILITY IDEOGRAPH-2F8B7
+2F8B8		CJK COMPATIBILITY IDEOGRAPH-2F8B8
+2F8B9		CJK COMPATIBILITY IDEOGRAPH-2F8B9
+2F8BA		CJK COMPATIBILITY IDEOGRAPH-2F8BA
+2F8BB		CJK COMPATIBILITY IDEOGRAPH-2F8BB
+2F8BC		CJK COMPATIBILITY IDEOGRAPH-2F8BC
+2F8BD		CJK COMPATIBILITY IDEOGRAPH-2F8BD
+2F8BE		CJK COMPATIBILITY IDEOGRAPH-2F8BE
+2F8BF		CJK COMPATIBILITY IDEOGRAPH-2F8BF
+2F8C0		CJK COMPATIBILITY IDEOGRAPH-2F8C0
+2F8C1		CJK COMPATIBILITY IDEOGRAPH-2F8C1
+2F8C2		CJK COMPATIBILITY IDEOGRAPH-2F8C2
+2F8C3		CJK COMPATIBILITY IDEOGRAPH-2F8C3
+2F8C4		CJK COMPATIBILITY IDEOGRAPH-2F8C4
+2F8C5		CJK COMPATIBILITY IDEOGRAPH-2F8C5
+2F8C6		CJK COMPATIBILITY IDEOGRAPH-2F8C6
+2F8C7		CJK COMPATIBILITY IDEOGRAPH-2F8C7
+2F8C8		CJK COMPATIBILITY IDEOGRAPH-2F8C8
+2F8C9		CJK COMPATIBILITY IDEOGRAPH-2F8C9
+2F8CA		CJK COMPATIBILITY IDEOGRAPH-2F8CA
+2F8CB		CJK COMPATIBILITY IDEOGRAPH-2F8CB
+2F8CC		CJK COMPATIBILITY IDEOGRAPH-2F8CC
+2F8CD		CJK COMPATIBILITY IDEOGRAPH-2F8CD
+2F8CE		CJK COMPATIBILITY IDEOGRAPH-2F8CE
+2F8CF		CJK COMPATIBILITY IDEOGRAPH-2F8CF
+2F8D0		CJK COMPATIBILITY IDEOGRAPH-2F8D0
+2F8D1		CJK COMPATIBILITY IDEOGRAPH-2F8D1
+2F8D2		CJK COMPATIBILITY IDEOGRAPH-2F8D2
+2F8D3		CJK COMPATIBILITY IDEOGRAPH-2F8D3
+2F8D4		CJK COMPATIBILITY IDEOGRAPH-2F8D4
+2F8D5		CJK COMPATIBILITY IDEOGRAPH-2F8D5
+2F8D6		CJK COMPATIBILITY IDEOGRAPH-2F8D6
+2F8D7		CJK COMPATIBILITY IDEOGRAPH-2F8D7
+2F8D8		CJK COMPATIBILITY IDEOGRAPH-2F8D8
+2F8D9		CJK COMPATIBILITY IDEOGRAPH-2F8D9
+2F8DA		CJK COMPATIBILITY IDEOGRAPH-2F8DA
+2F8DB		CJK COMPATIBILITY IDEOGRAPH-2F8DB
+2F8DC		CJK COMPATIBILITY IDEOGRAPH-2F8DC
+2F8DD		CJK COMPATIBILITY IDEOGRAPH-2F8DD
+2F8DE		CJK COMPATIBILITY IDEOGRAPH-2F8DE
+2F8DF		CJK COMPATIBILITY IDEOGRAPH-2F8DF
+2F8E0		CJK COMPATIBILITY IDEOGRAPH-2F8E0
+2F8E1		CJK COMPATIBILITY IDEOGRAPH-2F8E1
+2F8E2		CJK COMPATIBILITY IDEOGRAPH-2F8E2
+2F8E3		CJK COMPATIBILITY IDEOGRAPH-2F8E3
+2F8E4		CJK COMPATIBILITY IDEOGRAPH-2F8E4
+2F8E5		CJK COMPATIBILITY IDEOGRAPH-2F8E5
+2F8E6		CJK COMPATIBILITY IDEOGRAPH-2F8E6
+2F8E7		CJK COMPATIBILITY IDEOGRAPH-2F8E7
+2F8E8		CJK COMPATIBILITY IDEOGRAPH-2F8E8
+2F8E9		CJK COMPATIBILITY IDEOGRAPH-2F8E9
+2F8EA		CJK COMPATIBILITY IDEOGRAPH-2F8EA
+2F8EB		CJK COMPATIBILITY IDEOGRAPH-2F8EB
+2F8EC		CJK COMPATIBILITY IDEOGRAPH-2F8EC
+2F8ED		CJK COMPATIBILITY IDEOGRAPH-2F8ED
+2F8EE		CJK COMPATIBILITY IDEOGRAPH-2F8EE
+2F8EF		CJK COMPATIBILITY IDEOGRAPH-2F8EF
+2F8F0		CJK COMPATIBILITY IDEOGRAPH-2F8F0
+2F8F1		CJK COMPATIBILITY IDEOGRAPH-2F8F1
+2F8F2		CJK COMPATIBILITY IDEOGRAPH-2F8F2
+2F8F3		CJK COMPATIBILITY IDEOGRAPH-2F8F3
+2F8F4		CJK COMPATIBILITY IDEOGRAPH-2F8F4
+2F8F5		CJK COMPATIBILITY IDEOGRAPH-2F8F5
+2F8F6		CJK COMPATIBILITY IDEOGRAPH-2F8F6
+2F8F7		CJK COMPATIBILITY IDEOGRAPH-2F8F7
+2F8F8		CJK COMPATIBILITY IDEOGRAPH-2F8F8
+2F8F9		CJK COMPATIBILITY IDEOGRAPH-2F8F9
+2F8FA		CJK COMPATIBILITY IDEOGRAPH-2F8FA
+2F8FB		CJK COMPATIBILITY IDEOGRAPH-2F8FB
+2F8FC		CJK COMPATIBILITY IDEOGRAPH-2F8FC
+2F8FD		CJK COMPATIBILITY IDEOGRAPH-2F8FD
+2F8FE		CJK COMPATIBILITY IDEOGRAPH-2F8FE
+2F8FF		CJK COMPATIBILITY IDEOGRAPH-2F8FF
+2F900		CJK COMPATIBILITY IDEOGRAPH-2F900
+2F901		CJK COMPATIBILITY IDEOGRAPH-2F901
+2F902		CJK COMPATIBILITY IDEOGRAPH-2F902
+2F903		CJK COMPATIBILITY IDEOGRAPH-2F903
+2F904		CJK COMPATIBILITY IDEOGRAPH-2F904
+2F905		CJK COMPATIBILITY IDEOGRAPH-2F905
+2F906		CJK COMPATIBILITY IDEOGRAPH-2F906
+2F907		CJK COMPATIBILITY IDEOGRAPH-2F907
+2F908		CJK COMPATIBILITY IDEOGRAPH-2F908
+2F909		CJK COMPATIBILITY IDEOGRAPH-2F909
+2F90A		CJK COMPATIBILITY IDEOGRAPH-2F90A
+2F90B		CJK COMPATIBILITY IDEOGRAPH-2F90B
+2F90C		CJK COMPATIBILITY IDEOGRAPH-2F90C
+2F90D		CJK COMPATIBILITY IDEOGRAPH-2F90D
+2F90E		CJK COMPATIBILITY IDEOGRAPH-2F90E
+2F90F		CJK COMPATIBILITY IDEOGRAPH-2F90F
+2F910		CJK COMPATIBILITY IDEOGRAPH-2F910
+2F911		CJK COMPATIBILITY IDEOGRAPH-2F911
+2F912		CJK COMPATIBILITY IDEOGRAPH-2F912
+2F913		CJK COMPATIBILITY IDEOGRAPH-2F913
+2F914		CJK COMPATIBILITY IDEOGRAPH-2F914
+2F915		CJK COMPATIBILITY IDEOGRAPH-2F915
+2F916		CJK COMPATIBILITY IDEOGRAPH-2F916
+2F917		CJK COMPATIBILITY IDEOGRAPH-2F917
+2F918		CJK COMPATIBILITY IDEOGRAPH-2F918
+2F919		CJK COMPATIBILITY IDEOGRAPH-2F919
+2F91A		CJK COMPATIBILITY IDEOGRAPH-2F91A
+2F91B		CJK COMPATIBILITY IDEOGRAPH-2F91B
+2F91C		CJK COMPATIBILITY IDEOGRAPH-2F91C
+2F91D		CJK COMPATIBILITY IDEOGRAPH-2F91D
+2F91E		CJK COMPATIBILITY IDEOGRAPH-2F91E
+2F91F		CJK COMPATIBILITY IDEOGRAPH-2F91F
+2F920		CJK COMPATIBILITY IDEOGRAPH-2F920
+2F921		CJK COMPATIBILITY IDEOGRAPH-2F921
+2F922		CJK COMPATIBILITY IDEOGRAPH-2F922
+2F923		CJK COMPATIBILITY IDEOGRAPH-2F923
+2F924		CJK COMPATIBILITY IDEOGRAPH-2F924
+2F925		CJK COMPATIBILITY IDEOGRAPH-2F925
+2F926		CJK COMPATIBILITY IDEOGRAPH-2F926
+2F927		CJK COMPATIBILITY IDEOGRAPH-2F927
+2F928		CJK COMPATIBILITY IDEOGRAPH-2F928
+2F929		CJK COMPATIBILITY IDEOGRAPH-2F929
+2F92A		CJK COMPATIBILITY IDEOGRAPH-2F92A
+2F92B		CJK COMPATIBILITY IDEOGRAPH-2F92B
+2F92C		CJK COMPATIBILITY IDEOGRAPH-2F92C
+2F92D		CJK COMPATIBILITY IDEOGRAPH-2F92D
+2F92E		CJK COMPATIBILITY IDEOGRAPH-2F92E
+2F92F		CJK COMPATIBILITY IDEOGRAPH-2F92F
+2F930		CJK COMPATIBILITY IDEOGRAPH-2F930
+2F931		CJK COMPATIBILITY IDEOGRAPH-2F931
+2F932		CJK COMPATIBILITY IDEOGRAPH-2F932
+2F933		CJK COMPATIBILITY IDEOGRAPH-2F933
+2F934		CJK COMPATIBILITY IDEOGRAPH-2F934
+2F935		CJK COMPATIBILITY IDEOGRAPH-2F935
+2F936		CJK COMPATIBILITY IDEOGRAPH-2F936
+2F937		CJK COMPATIBILITY IDEOGRAPH-2F937
+2F938		CJK COMPATIBILITY IDEOGRAPH-2F938
+2F939		CJK COMPATIBILITY IDEOGRAPH-2F939
+2F93A		CJK COMPATIBILITY IDEOGRAPH-2F93A
+2F93B		CJK COMPATIBILITY IDEOGRAPH-2F93B
+2F93C		CJK COMPATIBILITY IDEOGRAPH-2F93C
+2F93D		CJK COMPATIBILITY IDEOGRAPH-2F93D
+2F93E		CJK COMPATIBILITY IDEOGRAPH-2F93E
+2F93F		CJK COMPATIBILITY IDEOGRAPH-2F93F
+2F940		CJK COMPATIBILITY IDEOGRAPH-2F940
+2F941		CJK COMPATIBILITY IDEOGRAPH-2F941
+2F942		CJK COMPATIBILITY IDEOGRAPH-2F942
+2F943		CJK COMPATIBILITY IDEOGRAPH-2F943
+2F944		CJK COMPATIBILITY IDEOGRAPH-2F944
+2F945		CJK COMPATIBILITY IDEOGRAPH-2F945
+2F946		CJK COMPATIBILITY IDEOGRAPH-2F946
+2F947		CJK COMPATIBILITY IDEOGRAPH-2F947
+2F948		CJK COMPATIBILITY IDEOGRAPH-2F948
+2F949		CJK COMPATIBILITY IDEOGRAPH-2F949
+2F94A		CJK COMPATIBILITY IDEOGRAPH-2F94A
+2F94B		CJK COMPATIBILITY IDEOGRAPH-2F94B
+2F94C		CJK COMPATIBILITY IDEOGRAPH-2F94C
+2F94D		CJK COMPATIBILITY IDEOGRAPH-2F94D
+2F94E		CJK COMPATIBILITY IDEOGRAPH-2F94E
+2F94F		CJK COMPATIBILITY IDEOGRAPH-2F94F
+2F950		CJK COMPATIBILITY IDEOGRAPH-2F950
+2F951		CJK COMPATIBILITY IDEOGRAPH-2F951
+2F952		CJK COMPATIBILITY IDEOGRAPH-2F952
+2F953		CJK COMPATIBILITY IDEOGRAPH-2F953
+2F954		CJK COMPATIBILITY IDEOGRAPH-2F954
+2F955		CJK COMPATIBILITY IDEOGRAPH-2F955
+2F956		CJK COMPATIBILITY IDEOGRAPH-2F956
+2F957		CJK COMPATIBILITY IDEOGRAPH-2F957
+2F958		CJK COMPATIBILITY IDEOGRAPH-2F958
+2F959		CJK COMPATIBILITY IDEOGRAPH-2F959
+2F95A		CJK COMPATIBILITY IDEOGRAPH-2F95A
+2F95B		CJK COMPATIBILITY IDEOGRAPH-2F95B
+2F95C		CJK COMPATIBILITY IDEOGRAPH-2F95C
+2F95D		CJK COMPATIBILITY IDEOGRAPH-2F95D
+2F95E		CJK COMPATIBILITY IDEOGRAPH-2F95E
+2F95F		CJK COMPATIBILITY IDEOGRAPH-2F95F
+2F960		CJK COMPATIBILITY IDEOGRAPH-2F960
+2F961		CJK COMPATIBILITY IDEOGRAPH-2F961
+2F962		CJK COMPATIBILITY IDEOGRAPH-2F962
+2F963		CJK COMPATIBILITY IDEOGRAPH-2F963
+2F964		CJK COMPATIBILITY IDEOGRAPH-2F964
+2F965		CJK COMPATIBILITY IDEOGRAPH-2F965
+2F966		CJK COMPATIBILITY IDEOGRAPH-2F966
+2F967		CJK COMPATIBILITY IDEOGRAPH-2F967
+2F968		CJK COMPATIBILITY IDEOGRAPH-2F968
+2F969		CJK COMPATIBILITY IDEOGRAPH-2F969
+2F96A		CJK COMPATIBILITY IDEOGRAPH-2F96A
+2F96B		CJK COMPATIBILITY IDEOGRAPH-2F96B
+2F96C		CJK COMPATIBILITY IDEOGRAPH-2F96C
+2F96D		CJK COMPATIBILITY IDEOGRAPH-2F96D
+2F96E		CJK COMPATIBILITY IDEOGRAPH-2F96E
+2F96F		CJK COMPATIBILITY IDEOGRAPH-2F96F
+2F970		CJK COMPATIBILITY IDEOGRAPH-2F970
+2F971		CJK COMPATIBILITY IDEOGRAPH-2F971
+2F972		CJK COMPATIBILITY IDEOGRAPH-2F972
+2F973		CJK COMPATIBILITY IDEOGRAPH-2F973
+2F974		CJK COMPATIBILITY IDEOGRAPH-2F974
+2F975		CJK COMPATIBILITY IDEOGRAPH-2F975
+2F976		CJK COMPATIBILITY IDEOGRAPH-2F976
+2F977		CJK COMPATIBILITY IDEOGRAPH-2F977
+2F978		CJK COMPATIBILITY IDEOGRAPH-2F978
+2F979		CJK COMPATIBILITY IDEOGRAPH-2F979
+2F97A		CJK COMPATIBILITY IDEOGRAPH-2F97A
+2F97B		CJK COMPATIBILITY IDEOGRAPH-2F97B
+2F97C		CJK COMPATIBILITY IDEOGRAPH-2F97C
+2F97D		CJK COMPATIBILITY IDEOGRAPH-2F97D
+2F97E		CJK COMPATIBILITY IDEOGRAPH-2F97E
+2F97F		CJK COMPATIBILITY IDEOGRAPH-2F97F
+2F980		CJK COMPATIBILITY IDEOGRAPH-2F980
+2F981		CJK COMPATIBILITY IDEOGRAPH-2F981
+2F982		CJK COMPATIBILITY IDEOGRAPH-2F982
+2F983		CJK COMPATIBILITY IDEOGRAPH-2F983
+2F984		CJK COMPATIBILITY IDEOGRAPH-2F984
+2F985		CJK COMPATIBILITY IDEOGRAPH-2F985
+2F986		CJK COMPATIBILITY IDEOGRAPH-2F986
+2F987		CJK COMPATIBILITY IDEOGRAPH-2F987
+2F988		CJK COMPATIBILITY IDEOGRAPH-2F988
+2F989		CJK COMPATIBILITY IDEOGRAPH-2F989
+2F98A		CJK COMPATIBILITY IDEOGRAPH-2F98A
+2F98B		CJK COMPATIBILITY IDEOGRAPH-2F98B
+2F98C		CJK COMPATIBILITY IDEOGRAPH-2F98C
+2F98D		CJK COMPATIBILITY IDEOGRAPH-2F98D
+2F98E		CJK COMPATIBILITY IDEOGRAPH-2F98E
+2F98F		CJK COMPATIBILITY IDEOGRAPH-2F98F
+2F990		CJK COMPATIBILITY IDEOGRAPH-2F990
+2F991		CJK COMPATIBILITY IDEOGRAPH-2F991
+2F992		CJK COMPATIBILITY IDEOGRAPH-2F992
+2F993		CJK COMPATIBILITY IDEOGRAPH-2F993
+2F994		CJK COMPATIBILITY IDEOGRAPH-2F994
+2F995		CJK COMPATIBILITY IDEOGRAPH-2F995
+2F996		CJK COMPATIBILITY IDEOGRAPH-2F996
+2F997		CJK COMPATIBILITY IDEOGRAPH-2F997
+2F998		CJK COMPATIBILITY IDEOGRAPH-2F998
+2F999		CJK COMPATIBILITY IDEOGRAPH-2F999
+2F99A		CJK COMPATIBILITY IDEOGRAPH-2F99A
+2F99B		CJK COMPATIBILITY IDEOGRAPH-2F99B
+2F99C		CJK COMPATIBILITY IDEOGRAPH-2F99C
+2F99D		CJK COMPATIBILITY IDEOGRAPH-2F99D
+2F99E		CJK COMPATIBILITY IDEOGRAPH-2F99E
+2F99F		CJK COMPATIBILITY IDEOGRAPH-2F99F
+2F9A0		CJK COMPATIBILITY IDEOGRAPH-2F9A0
+2F9A1		CJK COMPATIBILITY IDEOGRAPH-2F9A1
+2F9A2		CJK COMPATIBILITY IDEOGRAPH-2F9A2
+2F9A3		CJK COMPATIBILITY IDEOGRAPH-2F9A3
+2F9A4		CJK COMPATIBILITY IDEOGRAPH-2F9A4
+2F9A5		CJK COMPATIBILITY IDEOGRAPH-2F9A5
+2F9A6		CJK COMPATIBILITY IDEOGRAPH-2F9A6
+2F9A7		CJK COMPATIBILITY IDEOGRAPH-2F9A7
+2F9A8		CJK COMPATIBILITY IDEOGRAPH-2F9A8
+2F9A9		CJK COMPATIBILITY IDEOGRAPH-2F9A9
+2F9AA		CJK COMPATIBILITY IDEOGRAPH-2F9AA
+2F9AB		CJK COMPATIBILITY IDEOGRAPH-2F9AB
+2F9AC		CJK COMPATIBILITY IDEOGRAPH-2F9AC
+2F9AD		CJK COMPATIBILITY IDEOGRAPH-2F9AD
+2F9AE		CJK COMPATIBILITY IDEOGRAPH-2F9AE
+2F9AF		CJK COMPATIBILITY IDEOGRAPH-2F9AF
+2F9B0		CJK COMPATIBILITY IDEOGRAPH-2F9B0
+2F9B1		CJK COMPATIBILITY IDEOGRAPH-2F9B1
+2F9B2		CJK COMPATIBILITY IDEOGRAPH-2F9B2
+2F9B3		CJK COMPATIBILITY IDEOGRAPH-2F9B3
+2F9B4		CJK COMPATIBILITY IDEOGRAPH-2F9B4
+2F9B5		CJK COMPATIBILITY IDEOGRAPH-2F9B5
+2F9B6		CJK COMPATIBILITY IDEOGRAPH-2F9B6
+2F9B7		CJK COMPATIBILITY IDEOGRAPH-2F9B7
+2F9B8		CJK COMPATIBILITY IDEOGRAPH-2F9B8
+2F9B9		CJK COMPATIBILITY IDEOGRAPH-2F9B9
+2F9BA		CJK COMPATIBILITY IDEOGRAPH-2F9BA
+2F9BB		CJK COMPATIBILITY IDEOGRAPH-2F9BB
+2F9BC		CJK COMPATIBILITY IDEOGRAPH-2F9BC
+2F9BD		CJK COMPATIBILITY IDEOGRAPH-2F9BD
+2F9BE		CJK COMPATIBILITY IDEOGRAPH-2F9BE
+2F9BF		CJK COMPATIBILITY IDEOGRAPH-2F9BF
+2F9C0		CJK COMPATIBILITY IDEOGRAPH-2F9C0
+2F9C1		CJK COMPATIBILITY IDEOGRAPH-2F9C1
+2F9C2		CJK COMPATIBILITY IDEOGRAPH-2F9C2
+2F9C3		CJK COMPATIBILITY IDEOGRAPH-2F9C3
+2F9C4		CJK COMPATIBILITY IDEOGRAPH-2F9C4
+2F9C5		CJK COMPATIBILITY IDEOGRAPH-2F9C5
+2F9C6		CJK COMPATIBILITY IDEOGRAPH-2F9C6
+2F9C7		CJK COMPATIBILITY IDEOGRAPH-2F9C7
+2F9C8		CJK COMPATIBILITY IDEOGRAPH-2F9C8
+2F9C9		CJK COMPATIBILITY IDEOGRAPH-2F9C9
+2F9CA		CJK COMPATIBILITY IDEOGRAPH-2F9CA
+2F9CB		CJK COMPATIBILITY IDEOGRAPH-2F9CB
+2F9CC		CJK COMPATIBILITY IDEOGRAPH-2F9CC
+2F9CD		CJK COMPATIBILITY IDEOGRAPH-2F9CD
+2F9CE		CJK COMPATIBILITY IDEOGRAPH-2F9CE
+2F9CF		CJK COMPATIBILITY IDEOGRAPH-2F9CF
+2F9D0		CJK COMPATIBILITY IDEOGRAPH-2F9D0
+2F9D1		CJK COMPATIBILITY IDEOGRAPH-2F9D1
+2F9D2		CJK COMPATIBILITY IDEOGRAPH-2F9D2
+2F9D3		CJK COMPATIBILITY IDEOGRAPH-2F9D3
+2F9D4		CJK COMPATIBILITY IDEOGRAPH-2F9D4
+2F9D5		CJK COMPATIBILITY IDEOGRAPH-2F9D5
+2F9D6		CJK COMPATIBILITY IDEOGRAPH-2F9D6
+2F9D7		CJK COMPATIBILITY IDEOGRAPH-2F9D7
+2F9D8		CJK COMPATIBILITY IDEOGRAPH-2F9D8
+2F9D9		CJK COMPATIBILITY IDEOGRAPH-2F9D9
+2F9DA		CJK COMPATIBILITY IDEOGRAPH-2F9DA
+2F9DB		CJK COMPATIBILITY IDEOGRAPH-2F9DB
+2F9DC		CJK COMPATIBILITY IDEOGRAPH-2F9DC
+2F9DD		CJK COMPATIBILITY IDEOGRAPH-2F9DD
+2F9DE		CJK COMPATIBILITY IDEOGRAPH-2F9DE
+2F9DF		CJK COMPATIBILITY IDEOGRAPH-2F9DF
+2F9E0		CJK COMPATIBILITY IDEOGRAPH-2F9E0
+2F9E1		CJK COMPATIBILITY IDEOGRAPH-2F9E1
+2F9E2		CJK COMPATIBILITY IDEOGRAPH-2F9E2
+2F9E3		CJK COMPATIBILITY IDEOGRAPH-2F9E3
+2F9E4		CJK COMPATIBILITY IDEOGRAPH-2F9E4
+2F9E5		CJK COMPATIBILITY IDEOGRAPH-2F9E5
+2F9E6		CJK COMPATIBILITY IDEOGRAPH-2F9E6
+2F9E7		CJK COMPATIBILITY IDEOGRAPH-2F9E7
+2F9E8		CJK COMPATIBILITY IDEOGRAPH-2F9E8
+2F9E9		CJK COMPATIBILITY IDEOGRAPH-2F9E9
+2F9EA		CJK COMPATIBILITY IDEOGRAPH-2F9EA
+2F9EB		CJK COMPATIBILITY IDEOGRAPH-2F9EB
+2F9EC		CJK COMPATIBILITY IDEOGRAPH-2F9EC
+2F9ED		CJK COMPATIBILITY IDEOGRAPH-2F9ED
+2F9EE		CJK COMPATIBILITY IDEOGRAPH-2F9EE
+2F9EF		CJK COMPATIBILITY IDEOGRAPH-2F9EF
+2F9F0		CJK COMPATIBILITY IDEOGRAPH-2F9F0
+2F9F1		CJK COMPATIBILITY IDEOGRAPH-2F9F1
+2F9F2		CJK COMPATIBILITY IDEOGRAPH-2F9F2
+2F9F3		CJK COMPATIBILITY IDEOGRAPH-2F9F3
+2F9F4		CJK COMPATIBILITY IDEOGRAPH-2F9F4
+2F9F5		CJK COMPATIBILITY IDEOGRAPH-2F9F5
+2F9F6		CJK COMPATIBILITY IDEOGRAPH-2F9F6
+2F9F7		CJK COMPATIBILITY IDEOGRAPH-2F9F7
+2F9F8		CJK COMPATIBILITY IDEOGRAPH-2F9F8
+2F9F9		CJK COMPATIBILITY IDEOGRAPH-2F9F9
+2F9FA		CJK COMPATIBILITY IDEOGRAPH-2F9FA
+2F9FB		CJK COMPATIBILITY IDEOGRAPH-2F9FB
+2F9FC		CJK COMPATIBILITY IDEOGRAPH-2F9FC
+2F9FD		CJK COMPATIBILITY IDEOGRAPH-2F9FD
+2F9FE		CJK COMPATIBILITY IDEOGRAPH-2F9FE
+2F9FF		CJK COMPATIBILITY IDEOGRAPH-2F9FF
+2FA00		CJK COMPATIBILITY IDEOGRAPH-2FA00
+2FA01		CJK COMPATIBILITY IDEOGRAPH-2FA01
+2FA02		CJK COMPATIBILITY IDEOGRAPH-2FA02
+2FA03		CJK COMPATIBILITY IDEOGRAPH-2FA03
+2FA04		CJK COMPATIBILITY IDEOGRAPH-2FA04
+2FA05		CJK COMPATIBILITY IDEOGRAPH-2FA05
+2FA06		CJK COMPATIBILITY IDEOGRAPH-2FA06
+2FA07		CJK COMPATIBILITY IDEOGRAPH-2FA07
+2FA08		CJK COMPATIBILITY IDEOGRAPH-2FA08
+2FA09		CJK COMPATIBILITY IDEOGRAPH-2FA09
+2FA0A		CJK COMPATIBILITY IDEOGRAPH-2FA0A
+2FA0B		CJK COMPATIBILITY IDEOGRAPH-2FA0B
+2FA0C		CJK COMPATIBILITY IDEOGRAPH-2FA0C
+2FA0D		CJK COMPATIBILITY IDEOGRAPH-2FA0D
+2FA0E		CJK COMPATIBILITY IDEOGRAPH-2FA0E
+2FA0F		CJK COMPATIBILITY IDEOGRAPH-2FA0F
+2FA10		CJK COMPATIBILITY IDEOGRAPH-2FA10
+2FA11		CJK COMPATIBILITY IDEOGRAPH-2FA11
+2FA12		CJK COMPATIBILITY IDEOGRAPH-2FA12
+2FA13		CJK COMPATIBILITY IDEOGRAPH-2FA13
+2FA14		CJK COMPATIBILITY IDEOGRAPH-2FA14
+2FA15		CJK COMPATIBILITY IDEOGRAPH-2FA15
+2FA16		CJK COMPATIBILITY IDEOGRAPH-2FA16
+2FA17		CJK COMPATIBILITY IDEOGRAPH-2FA17
+2FA18		CJK COMPATIBILITY IDEOGRAPH-2FA18
+2FA19		CJK COMPATIBILITY IDEOGRAPH-2FA19
+2FA1A		CJK COMPATIBILITY IDEOGRAPH-2FA1A
+2FA1B		CJK COMPATIBILITY IDEOGRAPH-2FA1B
+2FA1C		CJK COMPATIBILITY IDEOGRAPH-2FA1C
+2FA1D		CJK COMPATIBILITY IDEOGRAPH-2FA1D
+E0001		LANGUAGE TAG
+E0020		TAG SPACE
+E0021		TAG EXCLAMATION MARK
+E0022		TAG QUOTATION MARK
+E0023		TAG NUMBER SIGN
+E0024		TAG DOLLAR SIGN
+E0025		TAG PERCENT SIGN
+E0026		TAG AMPERSAND
+E0027		TAG APOSTROPHE
+E0028		TAG LEFT PARENTHESIS
+E0029		TAG RIGHT PARENTHESIS
+E002A		TAG ASTERISK
+E002B		TAG PLUS SIGN
+E002C		TAG COMMA
+E002D		TAG HYPHEN-MINUS
+E002E		TAG FULL STOP
+E002F		TAG SOLIDUS
+E0030		TAG DIGIT ZERO
+E0031		TAG DIGIT ONE
+E0032		TAG DIGIT TWO
+E0033		TAG DIGIT THREE
+E0034		TAG DIGIT FOUR
+E0035		TAG DIGIT FIVE
+E0036		TAG DIGIT SIX
+E0037		TAG DIGIT SEVEN
+E0038		TAG DIGIT EIGHT
+E0039		TAG DIGIT NINE
+E003A		TAG COLON
+E003B		TAG SEMICOLON
+E003C		TAG LESS-THAN SIGN
+E003D		TAG EQUALS SIGN
+E003E		TAG GREATER-THAN SIGN
+E003F		TAG QUESTION MARK
+E0040		TAG COMMERCIAL AT
+E0041		TAG LATIN CAPITAL LETTER A
+E0042		TAG LATIN CAPITAL LETTER B
+E0043		TAG LATIN CAPITAL LETTER C
+E0044		TAG LATIN CAPITAL LETTER D
+E0045		TAG LATIN CAPITAL LETTER E
+E0046		TAG LATIN CAPITAL LETTER F
+E0047		TAG LATIN CAPITAL LETTER G
+E0048		TAG LATIN CAPITAL LETTER H
+E0049		TAG LATIN CAPITAL LETTER I
+E004A		TAG LATIN CAPITAL LETTER J
+E004B		TAG LATIN CAPITAL LETTER K
+E004C		TAG LATIN CAPITAL LETTER L
+E004D		TAG LATIN CAPITAL LETTER M
+E004E		TAG LATIN CAPITAL LETTER N
+E004F		TAG LATIN CAPITAL LETTER O
+E0050		TAG LATIN CAPITAL LETTER P
+E0051		TAG LATIN CAPITAL LETTER Q
+E0052		TAG LATIN CAPITAL LETTER R
+E0053		TAG LATIN CAPITAL LETTER S
+E0054		TAG LATIN CAPITAL LETTER T
+E0055		TAG LATIN CAPITAL LETTER U
+E0056		TAG LATIN CAPITAL LETTER V
+E0057		TAG LATIN CAPITAL LETTER W
+E0058		TAG LATIN CAPITAL LETTER X
+E0059		TAG LATIN CAPITAL LETTER Y
+E005A		TAG LATIN CAPITAL LETTER Z
+E005B		TAG LEFT SQUARE BRACKET
+E005C		TAG REVERSE SOLIDUS
+E005D		TAG RIGHT SQUARE BRACKET
+E005E		TAG CIRCUMFLEX ACCENT
+E005F		TAG LOW LINE
+E0060		TAG GRAVE ACCENT
+E0061		TAG LATIN SMALL LETTER A
+E0062		TAG LATIN SMALL LETTER B
+E0063		TAG LATIN SMALL LETTER C
+E0064		TAG LATIN SMALL LETTER D
+E0065		TAG LATIN SMALL LETTER E
+E0066		TAG LATIN SMALL LETTER F
+E0067		TAG LATIN SMALL LETTER G
+E0068		TAG LATIN SMALL LETTER H
+E0069		TAG LATIN SMALL LETTER I
+E006A		TAG LATIN SMALL LETTER J
+E006B		TAG LATIN SMALL LETTER K
+E006C		TAG LATIN SMALL LETTER L
+E006D		TAG LATIN SMALL LETTER M
+E006E		TAG LATIN SMALL LETTER N
+E006F		TAG LATIN SMALL LETTER O
+E0070		TAG LATIN SMALL LETTER P
+E0071		TAG LATIN SMALL LETTER Q
+E0072		TAG LATIN SMALL LETTER R
+E0073		TAG LATIN SMALL LETTER S
+E0074		TAG LATIN SMALL LETTER T
+E0075		TAG LATIN SMALL LETTER U
+E0076		TAG LATIN SMALL LETTER V
+E0077		TAG LATIN SMALL LETTER W
+E0078		TAG LATIN SMALL LETTER X
+E0079		TAG LATIN SMALL LETTER Y
+E007A		TAG LATIN SMALL LETTER Z
+E007B		TAG LEFT CURLY BRACKET
+E007C		TAG VERTICAL LINE
+E007D		TAG RIGHT CURLY BRACKET
+E007E		TAG TILDE
+E007F		CANCEL TAG
+E0100		VARIATION SELECTOR-17
+E0101		VARIATION SELECTOR-18
+E0102		VARIATION SELECTOR-19
+E0103		VARIATION SELECTOR-20
+E0104		VARIATION SELECTOR-21
+E0105		VARIATION SELECTOR-22
+E0106		VARIATION SELECTOR-23
+E0107		VARIATION SELECTOR-24
+E0108		VARIATION SELECTOR-25
+E0109		VARIATION SELECTOR-26
+E010A		VARIATION SELECTOR-27
+E010B		VARIATION SELECTOR-28
+E010C		VARIATION SELECTOR-29
+E010D		VARIATION SELECTOR-30
+E010E		VARIATION SELECTOR-31
+E010F		VARIATION SELECTOR-32
+E0110		VARIATION SELECTOR-33
+E0111		VARIATION SELECTOR-34
+E0112		VARIATION SELECTOR-35
+E0113		VARIATION SELECTOR-36
+E0114		VARIATION SELECTOR-37
+E0115		VARIATION SELECTOR-38
+E0116		VARIATION SELECTOR-39
+E0117		VARIATION SELECTOR-40
+E0118		VARIATION SELECTOR-41
+E0119		VARIATION SELECTOR-42
+E011A		VARIATION SELECTOR-43
+E011B		VARIATION SELECTOR-44
+E011C		VARIATION SELECTOR-45
+E011D		VARIATION SELECTOR-46
+E011E		VARIATION SELECTOR-47
+E011F		VARIATION SELECTOR-48
+E0120		VARIATION SELECTOR-49
+E0121		VARIATION SELECTOR-50
+E0122		VARIATION SELECTOR-51
+E0123		VARIATION SELECTOR-52
+E0124		VARIATION SELECTOR-53
+E0125		VARIATION SELECTOR-54
+E0126		VARIATION SELECTOR-55
+E0127		VARIATION SELECTOR-56
+E0128		VARIATION SELECTOR-57
+E0129		VARIATION SELECTOR-58
+E012A		VARIATION SELECTOR-59
+E012B		VARIATION SELECTOR-60
+E012C		VARIATION SELECTOR-61
+E012D		VARIATION SELECTOR-62
+E012E		VARIATION SELECTOR-63
+E012F		VARIATION SELECTOR-64
+E0130		VARIATION SELECTOR-65
+E0131		VARIATION SELECTOR-66
+E0132		VARIATION SELECTOR-67
+E0133		VARIATION SELECTOR-68
+E0134		VARIATION SELECTOR-69
+E0135		VARIATION SELECTOR-70
+E0136		VARIATION SELECTOR-71
+E0137		VARIATION SELECTOR-72
+E0138		VARIATION SELECTOR-73
+E0139		VARIATION SELECTOR-74
+E013A		VARIATION SELECTOR-75
+E013B		VARIATION SELECTOR-76
+E013C		VARIATION SELECTOR-77
+E013D		VARIATION SELECTOR-78
+E013E		VARIATION SELECTOR-79
+E013F		VARIATION SELECTOR-80
+E0140		VARIATION SELECTOR-81
+E0141		VARIATION SELECTOR-82
+E0142		VARIATION SELECTOR-83
+E0143		VARIATION SELECTOR-84
+E0144		VARIATION SELECTOR-85
+E0145		VARIATION SELECTOR-86
+E0146		VARIATION SELECTOR-87
+E0147		VARIATION SELECTOR-88
+E0148		VARIATION SELECTOR-89
+E0149		VARIATION SELECTOR-90
+E014A		VARIATION SELECTOR-91
+E014B		VARIATION SELECTOR-92
+E014C		VARIATION SELECTOR-93
+E014D		VARIATION SELECTOR-94
+E014E		VARIATION SELECTOR-95
+E014F		VARIATION SELECTOR-96
+E0150		VARIATION SELECTOR-97
+E0151		VARIATION SELECTOR-98
+E0152		VARIATION SELECTOR-99
+E0153		VARIATION SELECTOR-100
+E0154		VARIATION SELECTOR-101
+E0155		VARIATION SELECTOR-102
+E0156		VARIATION SELECTOR-103
+E0157		VARIATION SELECTOR-104
+E0158		VARIATION SELECTOR-105
+E0159		VARIATION SELECTOR-106
+E015A		VARIATION SELECTOR-107
+E015B		VARIATION SELECTOR-108
+E015C		VARIATION SELECTOR-109
+E015D		VARIATION SELECTOR-110
+E015E		VARIATION SELECTOR-111
+E015F		VARIATION SELECTOR-112
+E0160		VARIATION SELECTOR-113
+E0161		VARIATION SELECTOR-114
+E0162		VARIATION SELECTOR-115
+E0163		VARIATION SELECTOR-116
+E0164		VARIATION SELECTOR-117
+E0165		VARIATION SELECTOR-118
+E0166		VARIATION SELECTOR-119
+E0167		VARIATION SELECTOR-120
+E0168		VARIATION SELECTOR-121
+E0169		VARIATION SELECTOR-122
+E016A		VARIATION SELECTOR-123
+E016B		VARIATION SELECTOR-124
+E016C		VARIATION SELECTOR-125
+E016D		VARIATION SELECTOR-126
+E016E		VARIATION SELECTOR-127
+E016F		VARIATION SELECTOR-128
+E0170		VARIATION SELECTOR-129
+E0171		VARIATION SELECTOR-130
+E0172		VARIATION SELECTOR-131
+E0173		VARIATION SELECTOR-132
+E0174		VARIATION SELECTOR-133
+E0175		VARIATION SELECTOR-134
+E0176		VARIATION SELECTOR-135
+E0177		VARIATION SELECTOR-136
+E0178		VARIATION SELECTOR-137
+E0179		VARIATION SELECTOR-138
+E017A		VARIATION SELECTOR-139
+E017B		VARIATION SELECTOR-140
+E017C		VARIATION SELECTOR-141
+E017D		VARIATION SELECTOR-142
+E017E		VARIATION SELECTOR-143
+E017F		VARIATION SELECTOR-144
+E0180		VARIATION SELECTOR-145
+E0181		VARIATION SELECTOR-146
+E0182		VARIATION SELECTOR-147
+E0183		VARIATION SELECTOR-148
+E0184		VARIATION SELECTOR-149
+E0185		VARIATION SELECTOR-150
+E0186		VARIATION SELECTOR-151
+E0187		VARIATION SELECTOR-152
+E0188		VARIATION SELECTOR-153
+E0189		VARIATION SELECTOR-154
+E018A		VARIATION SELECTOR-155
+E018B		VARIATION SELECTOR-156
+E018C		VARIATION SELECTOR-157
+E018D		VARIATION SELECTOR-158
+E018E		VARIATION SELECTOR-159
+E018F		VARIATION SELECTOR-160
+E0190		VARIATION SELECTOR-161
+E0191		VARIATION SELECTOR-162
+E0192		VARIATION SELECTOR-163
+E0193		VARIATION SELECTOR-164
+E0194		VARIATION SELECTOR-165
+E0195		VARIATION SELECTOR-166
+E0196		VARIATION SELECTOR-167
+E0197		VARIATION SELECTOR-168
+E0198		VARIATION SELECTOR-169
+E0199		VARIATION SELECTOR-170
+E019A		VARIATION SELECTOR-171
+E019B		VARIATION SELECTOR-172
+E019C		VARIATION SELECTOR-173
+E019D		VARIATION SELECTOR-174
+E019E		VARIATION SELECTOR-175
+E019F		VARIATION SELECTOR-176
+E01A0		VARIATION SELECTOR-177
+E01A1		VARIATION SELECTOR-178
+E01A2		VARIATION SELECTOR-179
+E01A3		VARIATION SELECTOR-180
+E01A4		VARIATION SELECTOR-181
+E01A5		VARIATION SELECTOR-182
+E01A6		VARIATION SELECTOR-183
+E01A7		VARIATION SELECTOR-184
+E01A8		VARIATION SELECTOR-185
+E01A9		VARIATION SELECTOR-186
+E01AA		VARIATION SELECTOR-187
+E01AB		VARIATION SELECTOR-188
+E01AC		VARIATION SELECTOR-189
+E01AD		VARIATION SELECTOR-190
+E01AE		VARIATION SELECTOR-191
+E01AF		VARIATION SELECTOR-192
+E01B0		VARIATION SELECTOR-193
+E01B1		VARIATION SELECTOR-194
+E01B2		VARIATION SELECTOR-195
+E01B3		VARIATION SELECTOR-196
+E01B4		VARIATION SELECTOR-197
+E01B5		VARIATION SELECTOR-198
+E01B6		VARIATION SELECTOR-199
+E01B7		VARIATION SELECTOR-200
+E01B8		VARIATION SELECTOR-201
+E01B9		VARIATION SELECTOR-202
+E01BA		VARIATION SELECTOR-203
+E01BB		VARIATION SELECTOR-204
+E01BC		VARIATION SELECTOR-205
+E01BD		VARIATION SELECTOR-206
+E01BE		VARIATION SELECTOR-207
+E01BF		VARIATION SELECTOR-208
+E01C0		VARIATION SELECTOR-209
+E01C1		VARIATION SELECTOR-210
+E01C2		VARIATION SELECTOR-211
+E01C3		VARIATION SELECTOR-212
+E01C4		VARIATION SELECTOR-213
+E01C5		VARIATION SELECTOR-214
+E01C6		VARIATION SELECTOR-215
+E01C7		VARIATION SELECTOR-216
+E01C8		VARIATION SELECTOR-217
+E01C9		VARIATION SELECTOR-218
+E01CA		VARIATION SELECTOR-219
+E01CB		VARIATION SELECTOR-220
+E01CC		VARIATION SELECTOR-221
+E01CD		VARIATION SELECTOR-222
+E01CE		VARIATION SELECTOR-223
+E01CF		VARIATION SELECTOR-224
+E01D0		VARIATION SELECTOR-225
+E01D1		VARIATION SELECTOR-226
+E01D2		VARIATION SELECTOR-227
+E01D3		VARIATION SELECTOR-228
+E01D4		VARIATION SELECTOR-229
+E01D5		VARIATION SELECTOR-230
+E01D6		VARIATION SELECTOR-231
+E01D7		VARIATION SELECTOR-232
+E01D8		VARIATION SELECTOR-233
+E01D9		VARIATION SELECTOR-234
+E01DA		VARIATION SELECTOR-235
+E01DB		VARIATION SELECTOR-236
+E01DC		VARIATION SELECTOR-237
+E01DD		VARIATION SELECTOR-238
+E01DE		VARIATION SELECTOR-239
+E01DF		VARIATION SELECTOR-240
+E01E0		VARIATION SELECTOR-241
+E01E1		VARIATION SELECTOR-242
+E01E2		VARIATION SELECTOR-243
+E01E3		VARIATION SELECTOR-244
+E01E4		VARIATION SELECTOR-245
+E01E5		VARIATION SELECTOR-246
+E01E6		VARIATION SELECTOR-247
+E01E7		VARIATION SELECTOR-248
+E01E8		VARIATION SELECTOR-249
+E01E9		VARIATION SELECTOR-250
+E01EA		VARIATION SELECTOR-251
+E01EB		VARIATION SELECTOR-252
+E01EC		VARIATION SELECTOR-253
+E01ED		VARIATION SELECTOR-254
+E01EE		VARIATION SELECTOR-255
+E01EF		VARIATION SELECTOR-256
+F0000	FFFFD	Plane 15 Private Use
+100000	10FFFD	Plane 16 Private Use
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/NamedSequences.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/NamedSequences.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/NamedSequences.txt	(revision 14489)
@@ -0,0 +1,95 @@
+# NamedSequences-4.1.0.txt
+# Date: 2005-214, 13:10 PST [KW]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# Format:
+# Name of Sequence; Code Point Sequence for USI
+#
+# Note: The order of entries in this file is not significant.
+# However, entries are generally in script order corresponding
+# to block order in the Unicode Standard, to make it easier
+# to find entries in the list.
+
+# ================================================
+
+LATIN CAPITAL LETTER A WITH MACRON AND GRAVE;0100 0300
+LATIN SMALL LETTER A WITH MACRON AND GRAVE;0101 0300
+LATIN SMALL LETTER A WITH ACUTE AND OGONEK;00E1 0328
+LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW;0045 0329
+LATIN SMALL LETTER E WITH VERTICAL LINE BELOW;0065 0329
+LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00C8 0329
+LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00E8 0329
+LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00C9 0329
+LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00E9 0329
+LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON;00CA 0304
+LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON;00EA 0304
+LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON;00CA 030C
+LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON;00EA 030C
+LATIN CAPITAL LETTER I WITH MACRON AND GRAVE;012A 0300
+LATIN SMALL LETTER I WITH MACRON AND GRAVE;012B 0300
+LATIN SMALL LETTER I WITH DOT ABOVE AND ACUTE;0069 0307 0301
+LATIN SMALL LETTER NG WITH TILDE ABOVE;006E 0360 0067
+LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW;004F 0329
+LATIN SMALL LETTER O WITH VERTICAL LINE BELOW;006F 0329
+LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00D2 0329
+LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00F2 0329
+LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00D3 0329
+LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00F3 0329
+LATIN CAPITAL LETTER S WITH VERTICAL LINE BELOW;0053 0329
+LATIN SMALL LETTER S WITH VERTICAL LINE BELOW;0073 0329
+LATIN CAPITAL LETTER U WITH MACRON AND GRAVE;016A 0300
+LATIN SMALL LETTER U WITH MACRON AND GRAVE;016B 0300
+GURMUKHI HALF YA;0A2F 0A4D
+GURMUKHI PARI CA;0A4D 0A1A
+GURMUKHI PARI TA;0A4D 0A24
+GURMUKHI PARI NA;0A4D 0A28
+GURMUKHI PARI YA;0A4D 0A2F
+GURMUKHI PARI VA;0A4D 0A35
+GEORGIAN LETTER U-BRJGU;10E3 0302
+KHMER CONSONANT SIGN COENG KA;17D2 1780
+KHMER CONSONANT SIGN COENG KHA;17D2 1781
+KHMER CONSONANT SIGN COENG KO;17D2 1782
+KHMER CONSONANT SIGN COENG KHO;17D2 1783
+KHMER CONSONANT SIGN COENG NGO;17D2 1784
+KHMER CONSONANT SIGN COENG CA;17D2 1785
+KHMER CONSONANT SIGN COENG CHA;17D2 1786
+KHMER CONSONANT SIGN COENG CO;17D2 1787
+KHMER CONSONANT SIGN COENG CHO;17D2 1788
+KHMER CONSONANT SIGN COENG NYO;17D2 1789
+KHMER CONSONANT SIGN COENG DA;17D2 178A
+KHMER CONSONANT SIGN COENG TTHA;17D2 178B
+KHMER CONSONANT SIGN COENG DO;17D2 178C
+KHMER CONSONANT SIGN COENG TTHO;17D2 178D
+KHMER CONSONANT SIGN COENG NA;17D2 178E
+KHMER CONSONANT SIGN COENG TA;17D2 178F
+KHMER CONSONANT SIGN COENG THA;17D2 1790
+KHMER CONSONANT SIGN COENG TO;17D2 1791
+KHMER CONSONANT SIGN COENG THO;17D2 1792
+KHMER CONSONANT SIGN COENG NO;17D2 1793
+KHMER CONSONANT SIGN COENG BA;17D2 1794
+KHMER CONSONANT SIGN COENG PHA;17D2 1795
+KHMER CONSONANT SIGN COENG PO;17D2 1796
+KHMER CONSONANT SIGN COENG PHO;17D2 1797
+KHMER CONSONANT SIGN COENG MO;17D2 1798
+KHMER CONSONANT SIGN COENG YO;17D2 1799
+KHMER CONSONANT SIGN COENG RO;17D2 179A
+KHMER CONSONANT SIGN COENG LO;17D2 179B
+KHMER CONSONANT SIGN COENG VO;17D2 179C
+KHMER CONSONANT SIGN COENG SHA;17D2 179D
+KHMER CONSONANT SIGN COENG SSA;17D2 179E
+KHMER CONSONANT SIGN COENG SA;17D2 179F
+KHMER CONSONANT SIGN COENG HA;17D2 17A0
+KHMER CONSONANT SIGN COENG LA;17D2 17A1
+KHMER VOWEL SIGN COENG QA;17D2 17A2
+KHMER INDEPENDENT VOWEL SIGN COENG QU;17D2 17A7
+KHMER INDEPENDENT VOWEL SIGN COENG RY;17D2 17AB
+KHMER INDEPENDENT VOWEL SIGN COENG RYY;17D2 17AC
+KHMER INDEPENDENT VOWEL SIGN COENG QE;17D2 17AF
+KHMER VOWEL SIGN OM;17BB 17C6
+KHMER VOWEL SIGN AAM;17B6 17C6
+KATAKANA LETTER AINU P;31F7 309A
+MODIFIER LETTER EXTRA-HIGH EXTRA-LOW CONTOUR TONE BAR;02E5 02E9
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/NamesList.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/NamesList.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/NamesList.txt	(revision 14489)
@@ -0,0 +1,27024 @@
+@@@	The Unicode Standard 4.1
+@@@+	U41M050317.lst
+	Draft Unicode 4.1 names list.
+	Major merger of post-Unicode 4.0 additions with Amd1 name file (xia050208.lst).
+	Accumulation of fixes post-Unicode 4.0. (5th collection)
+	Add alias for 2D53.
+	Corrected alias for 2697.
+	Subdivided headers for Modifier Tone Letters.
+	Add xrefs for 1DC0 and 1DC3.
+	Updated annotation for 301C.
+	Add xref to 2026 and 22EE for FE19.
+	This file is semi-automatically derived from UnicodeData.txt and
+	a set of manually created annotations using a script to select
+	or suppress information from the data file. The rules used
+	for this process are aimed at readability for the human reader,
+	at the expense of some details; therefore, this file should not
+	be parsed for machine-readable information.
+@+		Copyright (c) 1991-2005 Unicode, Inc.
+	For terms of use, see http://www.unicode.org/terms_of_use.html
+@@	0000	C0 Controls and Basic Latin (Basic Latin)	007F
+@		C0 controls
+@+		Alias names are those for ISO/IEC 6429:1992. Commonly used alternative aliases are also shown.
+0000	<control>
+	= NULL
+0001	<control>
+	= START OF HEADING
+0002	<control>
+	= START OF TEXT
+0003	<control>
+	= END OF TEXT
+0004	<control>
+	= END OF TRANSMISSION
+0005	<control>
+	= ENQUIRY
+0006	<control>
+	= ACKNOWLEDGE
+0007	<control>
+	= BELL
+0008	<control>
+	= BACKSPACE
+0009	<control>
+	= CHARACTER TABULATION
+	= horizontal tabulation (HT), tab
+000A	<control>
+	= LINE FEED (LF)
+	= new line (NL), end of line (EOL)
+000B	<control>
+	= LINE TABULATION
+	= vertical tabulation (VT)
+000C	<control>
+	= FORM FEED (FF)
+000D	<control>
+	= CARRIAGE RETURN (CR)
+000E	<control>
+	= SHIFT OUT
+000F	<control>
+	= SHIFT IN
+0010	<control>
+	= DATA LINK ESCAPE
+0011	<control>
+	= DEVICE CONTROL ONE
+0012	<control>
+	= DEVICE CONTROL TWO
+0013	<control>
+	= DEVICE CONTROL THREE
+0014	<control>
+	= DEVICE CONTROL FOUR
+0015	<control>
+	= NEGATIVE ACKNOWLEDGE
+0016	<control>
+	= SYNCHRONOUS IDLE
+0017	<control>
+	= END OF TRANSMISSION BLOCK
+0018	<control>
+	= CANCEL
+0019	<control>
+	= END OF MEDIUM
+001A	<control>
+	= SUBSTITUTE
+	x (replacement character - FFFD)
+001B	<control>
+	= ESCAPE
+001C	<control>
+	= INFORMATION SEPARATOR FOUR
+	= file separator (FS)
+001D	<control>
+	= INFORMATION SEPARATOR THREE
+	= group separator (GS)
+001E	<control>
+	= INFORMATION SEPARATOR TWO
+	= record separator (RS)
+001F	<control>
+	= INFORMATION SEPARATOR ONE
+	= unit separator (US)
+@		ASCII punctuation and symbols
+@+		Based on ISO/IEC 646 from here.
+0020	SPACE
+	* sometimes considered a control code
+	* other space characters: 2000-200A
+	x (no-break space - 00A0)
+	x (zero width space - 200B)
+	x (word joiner - 2060)
+	x (ideographic space - 3000)
+	x (zero width no-break space - FEFF)
+0021	EXCLAMATION MARK
+	= factorial
+	= bang
+	x (inverted exclamation mark - 00A1)
+	x (latin letter retroflex click - 01C3)
+	x (double exclamation mark - 203C)
+	x (interrobang - 203D)
+	x (heavy exclamation mark ornament - 2762)
+0022	QUOTATION MARK
+	* neutral (vertical), used as opening or closing quotation mark
+	* preferred characters in English for paired quotation marks are 201C & 201D
+	x (modifier letter double prime - 02BA)
+	x (combining double acute accent - 030B)
+	x (combining double vertical line above - 030E)
+	x (double prime - 2033)
+	x (ditto mark - 3003)
+0023	NUMBER SIGN
+	= pound sign, hash, crosshatch, octothorpe
+	x (music sharp sign - 266F)
+0024	DOLLAR SIGN
+	= milreis, escudo
+	* glyph may have one or two vertical bars
+	* other currency symbol characters: 20A0-20AF
+	x (currency sign - 00A4)
+0025	PERCENT SIGN
+	x (arabic percent sign - 066A)
+	x (per mille sign - 2030)
+	x (per ten thousand sign - 2031)
+	x (commercial minus sign - 2052)
+0026	AMPERSAND
+0027	APOSTROPHE
+	= APOSTROPHE-QUOTE
+	= APL quote
+	* neutral (vertical) glyph with mixed usage
+	* 2019 is preferred for apostrophe
+	* preferred characters in English for paired quotation marks are 2018 & 2019
+	x (modifier letter prime - 02B9)
+	x (modifier letter apostrophe - 02BC)
+	x (modifier letter vertical line - 02C8)
+	x (combining acute accent - 0301)
+	x (prime - 2032)
+0028	LEFT PARENTHESIS
+	= OPENING PARENTHESIS
+0029	RIGHT PARENTHESIS
+	= CLOSING PARENTHESIS
+	* see discussion on semantics of paired bracketing characters
+002A	ASTERISK
+	= star (on phone keypads)
+	x (arabic five pointed star - 066D)
+	x (low asterisk - 204E)
+	x (asterisk operator - 2217)
+	x (heavy asterisk - 2731)
+002B	PLUS SIGN
+002C	COMMA
+	= decimal separator
+	x (arabic comma - 060C)
+	x (single low-9 quotation mark - 201A)
+	x (ideographic comma - 3001)
+002D	HYPHEN-MINUS
+	= hyphen or minus sign
+	* used for either hyphen or minus sign
+	x (hyphen - 2010)
+	x (non-breaking hyphen - 2011)
+	x (figure dash - 2012)
+	x (en dash - 2013)
+	x (minus sign - 2212)
+002E	FULL STOP
+	= PERIOD
+	= dot, decimal point
+	* may be rendered as a raised decimal point in old style numbers
+	x (arabic full stop - 06D4)
+	x (ideographic full stop - 3002)
+002F	SOLIDUS
+	= SLASH
+	= virgule, shilling (British)
+	x (latin letter dental click - 01C0)
+	x (combining long solidus overlay - 0338)
+	x (fraction slash - 2044)
+	x (division slash - 2215)
+@		ASCII digits
+0030	DIGIT ZERO
+0031	DIGIT ONE
+0032	DIGIT TWO
+0033	DIGIT THREE
+0034	DIGIT FOUR
+0035	DIGIT FIVE
+0036	DIGIT SIX
+0037	DIGIT SEVEN
+0038	DIGIT EIGHT
+0039	DIGIT NINE
+@		ASCII punctuation and symbols
+003A	COLON
+	x (armenian full stop - 0589)
+	x (hebrew punctuation sof pasuq - 05C3)
+	x (ratio - 2236)
+003B	SEMICOLON
+	* this, and not 037E, is the preferred character for 'Greek question mark'
+	x (greek question mark - 037E)
+	x (arabic semicolon - 061B)
+	x (reversed semicolon - 204F)
+003C	LESS-THAN SIGN
+	x (single left-pointing angle quotation mark - 2039)
+	x (left-pointing angle bracket - 2329)
+	x (mathematical left angle bracket - 27E8)
+	x (left angle bracket - 3008)
+003D	EQUALS SIGN
+	* other related characters: 2241-2263
+	x (not equal to - 2260)
+	x (identical to - 2261)
+003E	GREATER-THAN SIGN
+	x (single right-pointing angle quotation mark - 203A)
+	x (right-pointing angle bracket - 232A)
+	x (mathematical right angle bracket - 27E9)
+	x (right angle bracket - 3009)
+003F	QUESTION MARK
+	x (inverted question mark - 00BF)
+	x (greek question mark - 037E)
+	x (arabic question mark - 061F)
+	x (interrobang - 203D)
+	x (question exclamation mark - 2048)
+	x (exclamation question mark - 2049)
+0040	COMMERCIAL AT
+	= Klammeraffe (common, humorous slang German name)
+@		Uppercase Latin alphabet
+0041	LATIN CAPITAL LETTER A
+0042	LATIN CAPITAL LETTER B
+	x (script capital b - 212C)
+0043	LATIN CAPITAL LETTER C
+	x (double-struck capital c - 2102)
+	x (black-letter capital c - 212D)
+0044	LATIN CAPITAL LETTER D
+0045	LATIN CAPITAL LETTER E
+	x (euler constant - 2107)
+	x (script capital e - 2130)
+0046	LATIN CAPITAL LETTER F
+	x (script capital f - 2131)
+	x (turned capital f - 2132)
+0047	LATIN CAPITAL LETTER G
+	* invented circa 300 BCE by Spurius Carvilius Ruga, who added a stroke to the letter C
+0048	LATIN CAPITAL LETTER H
+	x (script capital h - 210B)
+	x (black-letter capital h - 210C)
+	x (double-struck capital h - 210D)
+0049	LATIN CAPITAL LETTER I
+	* Turkish and Azerbaijani use 0131 for lowercase
+	x (latin capital letter i with dot above - 0130)
+	x (cyrillic capital letter byelorussian-ukrainian i - 0406)
+	x (cyrillic letter palochka - 04C0)
+	x (script capital i - 2110)
+	x (black-letter capital i - 2111)
+	x (roman numeral one - 2160)
+004A	LATIN CAPITAL LETTER J
+004B	LATIN CAPITAL LETTER K
+	x (kelvin sign - 212A)
+004C	LATIN CAPITAL LETTER L
+	x (script capital l - 2112)
+004D	LATIN CAPITAL LETTER M
+	x (script capital m - 2133)
+004E	LATIN CAPITAL LETTER N
+	x (double-struck capital n - 2115)
+004F	LATIN CAPITAL LETTER O
+0050	LATIN CAPITAL LETTER P
+	x (double-struck capital p - 2119)
+0051	LATIN CAPITAL LETTER Q
+	x (double-struck capital q - 211A)
+0052	LATIN CAPITAL LETTER R
+	x (script capital r - 211B)
+	x (black-letter capital r - 211C)
+	x (double-struck capital r - 211D)
+0053	LATIN CAPITAL LETTER S
+0054	LATIN CAPITAL LETTER T
+0055	LATIN CAPITAL LETTER U
+0056	LATIN CAPITAL LETTER V
+0057	LATIN CAPITAL LETTER W
+0058	LATIN CAPITAL LETTER X
+0059	LATIN CAPITAL LETTER Y
+005A	LATIN CAPITAL LETTER Z
+	x (double-struck capital z - 2124)
+	x (black-letter capital z - 2128)
+@		ASCII punctuation and symbols
+005B	LEFT SQUARE BRACKET
+	= OPENING SQUARE BRACKET
+	* other bracket characters: 3008-301B
+005C	REVERSE SOLIDUS
+	= BACKSLASH
+	x (combining reverse solidus overlay - 20E5)
+	x (set minus - 2216)
+005D	RIGHT SQUARE BRACKET
+	= CLOSING SQUARE BRACKET
+005E	CIRCUMFLEX ACCENT
+	* this is a spacing character
+	x (modifier letter up arrowhead - 02C4)
+	x (modifier letter circumflex accent - 02C6)
+	x (combining circumflex accent - 0302)
+	x (up arrowhead - 2303)
+005F	LOW LINE
+	= SPACING UNDERSCORE
+	* this is a spacing character
+	x (modifier letter low macron - 02CD)
+	x (combining macron below - 0331)
+	x (combining low line - 0332)
+	x (double low line - 2017)
+0060	GRAVE ACCENT
+	* this is a spacing character
+	x (modifier letter grave accent - 02CB)
+	x (combining grave accent - 0300)
+	x (reversed prime - 2035)
+@		Lowercase Latin alphabet
+0061	LATIN SMALL LETTER A
+0062	LATIN SMALL LETTER B
+0063	LATIN SMALL LETTER C
+0064	LATIN SMALL LETTER D
+0065	LATIN SMALL LETTER E
+	x (estimated symbol - 212E)
+	x (script small e - 212F)
+0066	LATIN SMALL LETTER F
+0067	LATIN SMALL LETTER G
+	x (latin small letter script g - 0261)
+	x (script small g - 210A)
+0068	LATIN SMALL LETTER H
+	x (cyrillic small letter shha - 04BB)
+	x (planck constant - 210E)
+0069	LATIN SMALL LETTER I
+	* Turkish and Azerbaijani use 0130 for uppercase
+	x (latin small letter dotless i - 0131)
+006A	LATIN SMALL LETTER J
+006B	LATIN SMALL LETTER K
+006C	LATIN SMALL LETTER L
+	x (script small l - 2113)
+006D	LATIN SMALL LETTER M
+006E	LATIN SMALL LETTER N
+	x (superscript latin small letter n - 207F)
+006F	LATIN SMALL LETTER O
+	x (script small o - 2134)
+0070	LATIN SMALL LETTER P
+0071	LATIN SMALL LETTER Q
+0072	LATIN SMALL LETTER R
+0073	LATIN SMALL LETTER S
+0074	LATIN SMALL LETTER T
+0075	LATIN SMALL LETTER U
+0076	LATIN SMALL LETTER V
+0077	LATIN SMALL LETTER W
+0078	LATIN SMALL LETTER X
+0079	LATIN SMALL LETTER Y
+007A	LATIN SMALL LETTER Z
+	x (latin small letter z with stroke - 01B6)
+@		ASCII punctuation and symbols
+007B	LEFT CURLY BRACKET
+	= OPENING CURLY BRACKET
+	= opening brace
+007C	VERTICAL LINE
+	= VERTICAL BAR
+	* used in pairs to indicate absolute value
+	x (latin letter dental click - 01C0)
+	x (hebrew punctuation paseq - 05C0)
+	x (divides - 2223)
+	x (light vertical bar - 2758)
+007D	RIGHT CURLY BRACKET
+	= CLOSING CURLY BRACKET
+	= closing brace
+007E	TILDE
+	* this is a spacing character
+	x (small tilde - 02DC)
+	x (combining tilde - 0303)
+	x (swung dash - 2053)
+	x (tilde operator - 223C)
+	x (fullwidth tilde - FF5E)
+@		Control character
+007F	<control>
+	= DELETE
+@@	0080	C1 Controls and Latin-1 Supplement (Latin-1 Supplement)	00FF
+@		C1 controls
+@+		Alias names are those for ISO/IEC 6429:1992.
+0080	<control>
+0081	<control>
+0082	<control>
+	= BREAK PERMITTED HERE
+0083	<control>
+	= NO BREAK HERE
+0084	<control>
+0085	<control>
+	= NEXT LINE (NEL)
+0086	<control>
+	= START OF SELECTED AREA
+0087	<control>
+	= END OF SELECTED AREA
+0088	<control>
+	= CHARACTER TABULATION SET
+0089	<control>
+	= CHARACTER TABULATION WITH JUSTIFICATION
+008A	<control>
+	= LINE TABULATION SET
+008B	<control>
+	= PARTIAL LINE FORWARD
+008C	<control>
+	= PARTIAL LINE BACKWARD
+008D	<control>
+	= REVERSE LINE FEED
+008E	<control>
+	= SINGLE SHIFT TWO
+008F	<control>
+	= SINGLE SHIFT THREE
+0090	<control>
+	= DEVICE CONTROL STRING
+0091	<control>
+	= PRIVATE USE ONE
+0092	<control>
+	= PRIVATE USE TWO
+0093	<control>
+	= SET TRANSMIT STATE
+0094	<control>
+	= CANCEL CHARACTER
+0095	<control>
+	= MESSAGE WAITING
+0096	<control>
+	= START OF GUARDED AREA
+0097	<control>
+	= END OF GUARDED AREA
+0098	<control>
+	= START OF STRING
+0099	<control>
+009A	<control>
+	= SINGLE CHARACTER INTRODUCER
+009B	<control>
+	= CONTROL SEQUENCE INTRODUCER
+009C	<control>
+	= STRING TERMINATOR
+009D	<control>
+	= OPERATING SYSTEM COMMAND
+009E	<control>
+	= PRIVACY MESSAGE
+009F	<control>
+	= APPLICATION PROGRAM COMMAND
+@		Latin-1 punctuation and symbols
+@+		Based on ISO/IEC 8859-1 (aka Latin-1) from here.
+00A0	NO-BREAK SPACE
+	= NBSP
+	x (space - 0020)
+	x (figure space - 2007)
+	x (narrow no-break space - 202F)
+	x (word joiner - 2060)
+	x (zero width no-break space - FEFF)
+	# <noBreak> 0020
+00A1	INVERTED EXCLAMATION MARK
+	* Spanish, Asturian, Galician
+	x (exclamation mark - 0021)
+00A2	CENT SIGN
+00A3	POUND SIGN
+	= pound sterling, Irish punt, Italian lira, Turkish lira, etc.
+	x (lira sign - 20A4)
+00A4	CURRENCY SIGN
+	* other currency symbol characters: 20A0-20AF
+	x (dollar sign - 0024)
+00A5	YEN SIGN
+	= yuan sign
+	* glyph may have one or two crossbars
+00A6	BROKEN BAR
+	= BROKEN VERTICAL BAR
+	= parted rule (in typography)
+00A7	SECTION SIGN
+	* paragraph sign in some European usage
+00A8	DIAERESIS
+	* this is a spacing character
+	x (combining diaeresis - 0308)
+	# 0020 0308
+00A9	COPYRIGHT SIGN
+	x (sound recording copyright - 2117)
+00AA	FEMININE ORDINAL INDICATOR
+	* Spanish
+	# <super> 0061
+00AB	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK *
+	= LEFT POINTING GUILLEMET
+	= chevrons (in typography)
+	* usually opening, sometimes closing
+	x (much less-than - 226A)
+	x (left double angle bracket - 300A)
+00AC	NOT SIGN
+	= angled dash (in typography)
+	x (reversed not sign - 2310)
+00AD	SOFT HYPHEN
+	= SHY
+	= discretionary hyphen
+	x (mongolian todo soft hyphen - 1806)
+00AE	REGISTERED SIGN
+	= REGISTERED TRADE MARK SIGN
+00AF	MACRON
+	= overline, APL overbar
+	* this is a spacing character
+	x (modifier letter macron - 02C9)
+	x (combining macron - 0304)
+	x (combining overline - 0305)
+	# 0020 0304
+00B0	DEGREE SIGN
+	* this is a spacing character
+	x (ring above - 02DA)
+	x (combining ring above - 030A)
+	x (superscript zero - 2070)
+	x (ring operator - 2218)
+00B1	PLUS-MINUS SIGN
+	x (minus-or-plus sign - 2213)
+00B2	SUPERSCRIPT TWO
+	= squared
+	* other superscript digit characters: 2070-2079
+	x (superscript one - 00B9)
+	# <super> 0032
+00B3	SUPERSCRIPT THREE
+	= cubed
+	x (superscript one - 00B9)
+	# <super> 0033
+00B4	ACUTE ACCENT
+	* this is a spacing character
+	x (modifier letter prime - 02B9)
+	x (modifier letter acute accent - 02CA)
+	x (combining acute accent - 0301)
+	x (prime - 2032)
+	# 0020 0301
+00B5	MICRO SIGN
+	# 03BC greek small letter mu
+00B6	PILCROW SIGN
+	= PARAGRAPH SIGN
+	* section sign in some European usage
+	x (reversed pilcrow sign - 204B)
+	x (curved stem paragraph sign ornament - 2761)
+00B7	MIDDLE DOT
+	= midpoint (in typography)
+	= Georgian comma
+	= Greek middle dot (ano teleia)
+	x (greek ano teleia - 0387)
+	x (bullet - 2022)
+	x (one dot leader - 2024)
+	x (hyphenation point - 2027)
+	x (bullet operator - 2219)
+	x (dot operator - 22C5)
+	x (katakana middle dot - 30FB)
+00B8	CEDILLA
+	* this is a spacing character
+	* other spacing accent characters: 02D8-02DB
+	x (combining cedilla - 0327)
+	# 0020 0327
+00B9	SUPERSCRIPT ONE
+	x (superscript two - 00B2)
+	x (superscript three - 00B3)
+	# <super> 0031
+00BA	MASCULINE ORDINAL INDICATOR
+	* Spanish
+	# <super> 006F
+00BB	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK *
+	= RIGHT POINTING GUILLEMET
+	* usually closing, sometimes opening
+	x (much greater-than - 226B)
+	x (right double angle bracket - 300B)
+00BC	VULGAR FRACTION ONE QUARTER
+	* bar may be horizontal or slanted
+	* other fraction characters: 2153-215E
+	# <fraction> 0031 2044 0034
+00BD	VULGAR FRACTION ONE HALF
+	* bar may be horizontal or slanted
+	# <fraction> 0031 2044 0032
+00BE	VULGAR FRACTION THREE QUARTERS
+	* bar may be horizontal or slanted
+	# <fraction> 0033 2044 0034
+00BF	INVERTED QUESTION MARK
+	= turned question mark
+	* Spanish
+	x (question mark - 003F)
+@		Letters
+00C0	LATIN CAPITAL LETTER A WITH GRAVE
+	: 0041 0300
+00C1	LATIN CAPITAL LETTER A WITH ACUTE
+	: 0041 0301
+00C2	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+	: 0041 0302
+00C3	LATIN CAPITAL LETTER A WITH TILDE
+	: 0041 0303
+00C4	LATIN CAPITAL LETTER A WITH DIAERESIS
+	: 0041 0308
+00C5	LATIN CAPITAL LETTER A WITH RING ABOVE
+	x (angstrom sign - 212B)
+	: 0041 030A
+00C6	LATIN CAPITAL LETTER AE (ash) *
+	= LATIN CAPITAL LIGATURE AE
+00C7	LATIN CAPITAL LETTER C WITH CEDILLA
+	: 0043 0327
+00C8	LATIN CAPITAL LETTER E WITH GRAVE
+	: 0045 0300
+00C9	LATIN CAPITAL LETTER E WITH ACUTE
+	: 0045 0301
+00CA	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+	: 0045 0302
+00CB	LATIN CAPITAL LETTER E WITH DIAERESIS
+	: 0045 0308
+00CC	LATIN CAPITAL LETTER I WITH GRAVE
+	: 0049 0300
+00CD	LATIN CAPITAL LETTER I WITH ACUTE
+	: 0049 0301
+00CE	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+	: 0049 0302
+00CF	LATIN CAPITAL LETTER I WITH DIAERESIS
+	: 0049 0308
+00D0	LATIN CAPITAL LETTER ETH (Icelandic)
+	x (latin small letter eth - 00F0)
+	x (latin capital letter d with stroke - 0110)
+	x (latin capital letter african d - 0189)
+00D1	LATIN CAPITAL LETTER N WITH TILDE
+	: 004E 0303
+00D2	LATIN CAPITAL LETTER O WITH GRAVE
+	: 004F 0300
+00D3	LATIN CAPITAL LETTER O WITH ACUTE
+	: 004F 0301
+00D4	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+	: 004F 0302
+00D5	LATIN CAPITAL LETTER O WITH TILDE
+	: 004F 0303
+00D6	LATIN CAPITAL LETTER O WITH DIAERESIS
+	: 004F 0308
+@		Mathematical operator
+00D7	MULTIPLICATION SIGN
+	= z notation Cartesian product
+@		Letters
+00D8	LATIN CAPITAL LETTER O WITH STROKE
+	= LATIN CAPITAL LETTER O SLASH
+	x (empty set - 2205)
+00D9	LATIN CAPITAL LETTER U WITH GRAVE
+	: 0055 0300
+00DA	LATIN CAPITAL LETTER U WITH ACUTE
+	: 0055 0301
+00DB	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+	: 0055 0302
+00DC	LATIN CAPITAL LETTER U WITH DIAERESIS
+	: 0055 0308
+00DD	LATIN CAPITAL LETTER Y WITH ACUTE
+	: 0059 0301
+00DE	LATIN CAPITAL LETTER THORN (Icelandic)
+00DF	LATIN SMALL LETTER SHARP S (German)
+	= Eszett
+	* German
+	* uppercase is "SS"
+	* in origin a ligature of 017F and 0073
+	x (greek small letter beta - 03B2)
+00E0	LATIN SMALL LETTER A WITH GRAVE
+	: 0061 0300
+00E1	LATIN SMALL LETTER A WITH ACUTE
+	: 0061 0301
+00E2	LATIN SMALL LETTER A WITH CIRCUMFLEX
+	: 0061 0302
+00E3	LATIN SMALL LETTER A WITH TILDE
+	* Portuguese
+	: 0061 0303
+00E4	LATIN SMALL LETTER A WITH DIAERESIS
+	: 0061 0308
+00E5	LATIN SMALL LETTER A WITH RING ABOVE
+	* Danish, Norwegian, Swedish, Walloon
+	: 0061 030A
+00E6	LATIN SMALL LETTER AE (ash) *
+	= LATIN SMALL LIGATURE AE
+	= ash (from Old English æsc)
+	* Danish, Norwegian, Icelandic, Faroese, Old English, French, IPA
+	x (latin small ligature oe - 0153)
+	x (cyrillic small ligature a ie - 04D5)
+00E7	LATIN SMALL LETTER C WITH CEDILLA
+	: 0063 0327
+00E8	LATIN SMALL LETTER E WITH GRAVE
+	: 0065 0300
+00E9	LATIN SMALL LETTER E WITH ACUTE
+	: 0065 0301
+00EA	LATIN SMALL LETTER E WITH CIRCUMFLEX
+	: 0065 0302
+00EB	LATIN SMALL LETTER E WITH DIAERESIS
+	: 0065 0308
+00EC	LATIN SMALL LETTER I WITH GRAVE
+	* Italian, Malagasy
+	: 0069 0300
+00ED	LATIN SMALL LETTER I WITH ACUTE
+	: 0069 0301
+00EE	LATIN SMALL LETTER I WITH CIRCUMFLEX
+	: 0069 0302
+00EF	LATIN SMALL LETTER I WITH DIAERESIS
+	: 0069 0308
+00F0	LATIN SMALL LETTER ETH (Icelandic)
+	* Icelandic, Faroese, Old English, IPA
+	x (latin capital letter eth - 00D0)
+	x (greek small letter delta - 03B4)
+	x (partial differential - 2202)
+00F1	LATIN SMALL LETTER N WITH TILDE
+	: 006E 0303
+00F2	LATIN SMALL LETTER O WITH GRAVE
+	: 006F 0300
+00F3	LATIN SMALL LETTER O WITH ACUTE
+	: 006F 0301
+00F4	LATIN SMALL LETTER O WITH CIRCUMFLEX
+	: 006F 0302
+00F5	LATIN SMALL LETTER O WITH TILDE
+	* Portuguese, Estonian
+	: 006F 0303
+00F6	LATIN SMALL LETTER O WITH DIAERESIS
+	: 006F 0308
+@		Mathematical operator
+00F7	DIVISION SIGN
+	x (division slash - 2215)
+	x (divides - 2223)
+@		Letters
+00F8	LATIN SMALL LETTER O WITH STROKE
+	= LATIN SMALL LETTER O SLASH
+	* Danish, Norwegian, Faroese, IPA
+00F9	LATIN SMALL LETTER U WITH GRAVE
+	* French, Italian
+	: 0075 0300
+00FA	LATIN SMALL LETTER U WITH ACUTE
+	: 0075 0301
+00FB	LATIN SMALL LETTER U WITH CIRCUMFLEX
+	: 0075 0302
+00FC	LATIN SMALL LETTER U WITH DIAERESIS
+	: 0075 0308
+00FD	LATIN SMALL LETTER Y WITH ACUTE
+	* Czech, Slovak, Icelandic, Faroese, Welsh, Malagasy
+	: 0079 0301
+00FE	LATIN SMALL LETTER THORN (Icelandic)
+	* Icelandic, Old English, phonetics
+	* Runic letter borrowed into Latin script
+	x (runic letter thurisaz thurs thorn - 16A6)
+00FF	LATIN SMALL LETTER Y WITH DIAERESIS
+	* French
+	x (latin capital letter y with diaeresis - 0178)
+	: 0079 0308
+@@	0100	Latin Extended-A	017F
+@		European Latin
+0100	LATIN CAPITAL LETTER A WITH MACRON
+	: 0041 0304
+0101	LATIN SMALL LETTER A WITH MACRON
+	* Latvian, Latin, ...
+	: 0061 0304
+0102	LATIN CAPITAL LETTER A WITH BREVE
+	: 0041 0306
+0103	LATIN SMALL LETTER A WITH BREVE
+	* Romanian, Vietnamese, Latin, ...
+	: 0061 0306
+0104	LATIN CAPITAL LETTER A WITH OGONEK
+	: 0041 0328
+0105	LATIN SMALL LETTER A WITH OGONEK
+	* Polish, Lithuanian, ...
+	: 0061 0328
+0106	LATIN CAPITAL LETTER C WITH ACUTE
+	: 0043 0301
+0107	LATIN SMALL LETTER C WITH ACUTE
+	* Polish, Croatian, ...
+	x (cyrillic small letter tshe - 045B)
+	: 0063 0301
+0108	LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+	: 0043 0302
+0109	LATIN SMALL LETTER C WITH CIRCUMFLEX
+	* Esperanto
+	: 0063 0302
+010A	LATIN CAPITAL LETTER C WITH DOT ABOVE
+	: 0043 0307
+010B	LATIN SMALL LETTER C WITH DOT ABOVE
+	* Maltese, Irish Gaelic (old orthography)
+	: 0063 0307
+010C	LATIN CAPITAL LETTER C WITH CARON
+	: 0043 030C
+010D	LATIN SMALL LETTER C WITH CARON
+	* Czech, Slovak, Slovenian, and many other languages
+	: 0063 030C
+010E	LATIN CAPITAL LETTER D WITH CARON
+	* the form using caron/hacek is preferred in all contexts
+	: 0044 030C
+010F	LATIN SMALL LETTER D WITH CARON
+	* Czech, Slovak
+	* the form using apostrophe is preferred in typesetting
+	: 0064 030C
+0110	LATIN CAPITAL LETTER D WITH STROKE
+	x (latin capital letter eth - 00D0)
+	x (latin small letter d with stroke - 0111)
+	x (latin capital letter african d - 0189)
+0111	LATIN SMALL LETTER D WITH STROKE
+	* Croatian, Vietnamese, Sami
+	* an alternate glyph with the stroke through the bowl is used in Americanist orthographies
+	x (latin capital letter d with stroke - 0110)
+	x (cyrillic small letter dje - 0452)
+0112	LATIN CAPITAL LETTER E WITH MACRON
+	: 0045 0304
+0113	LATIN SMALL LETTER E WITH MACRON
+	* Latvian, Latin, ...
+	: 0065 0304
+0114	LATIN CAPITAL LETTER E WITH BREVE
+	: 0045 0306
+0115	LATIN SMALL LETTER E WITH BREVE
+	* Malay, Latin, ...
+	: 0065 0306
+0116	LATIN CAPITAL LETTER E WITH DOT ABOVE
+	: 0045 0307
+0117	LATIN SMALL LETTER E WITH DOT ABOVE
+	* Lithuanian
+	: 0065 0307
+0118	LATIN CAPITAL LETTER E WITH OGONEK
+	: 0045 0328
+0119	LATIN SMALL LETTER E WITH OGONEK
+	* Polish, Lithuanian, ...
+	: 0065 0328
+011A	LATIN CAPITAL LETTER E WITH CARON
+	: 0045 030C
+011B	LATIN SMALL LETTER E WITH CARON
+	* Czech, ...
+	: 0065 030C
+011C	LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+	: 0047 0302
+011D	LATIN SMALL LETTER G WITH CIRCUMFLEX
+	* Esperanto
+	: 0067 0302
+011E	LATIN CAPITAL LETTER G WITH BREVE
+	: 0047 0306
+011F	LATIN SMALL LETTER G WITH BREVE
+	* Turkish, Azerbaijani
+	x (latin small letter g with caron - 01E7)
+	: 0067 0306
+0120	LATIN CAPITAL LETTER G WITH DOT ABOVE
+	: 0047 0307
+0121	LATIN SMALL LETTER G WITH DOT ABOVE
+	* Maltese, Irish Gaelic (old orthography)
+	: 0067 0307
+0122	LATIN CAPITAL LETTER G WITH CEDILLA
+	: 0047 0327
+0123	LATIN SMALL LETTER G WITH CEDILLA
+	* Latvian
+	* there are three major glyph variants
+	: 0067 0327
+0124	LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+	: 0048 0302
+0125	LATIN SMALL LETTER H WITH CIRCUMFLEX
+	* Esperanto
+	: 0068 0302
+0126	LATIN CAPITAL LETTER H WITH STROKE
+0127	LATIN SMALL LETTER H WITH STROKE
+	* Maltese, IPA, ...
+	x (cyrillic small letter tshe - 045B)
+	x (planck constant over two pi - 210F)
+0128	LATIN CAPITAL LETTER I WITH TILDE
+	: 0049 0303
+0129	LATIN SMALL LETTER I WITH TILDE
+	* Greenlandic (old orthography)
+	: 0069 0303
+012A	LATIN CAPITAL LETTER I WITH MACRON
+	: 0049 0304
+012B	LATIN SMALL LETTER I WITH MACRON
+	* Latvian, Latin, ...
+	: 0069 0304
+012C	LATIN CAPITAL LETTER I WITH BREVE
+	: 0049 0306
+012D	LATIN SMALL LETTER I WITH BREVE
+	* Latin, ...
+	: 0069 0306
+012E	LATIN CAPITAL LETTER I WITH OGONEK
+	: 0049 0328
+012F	LATIN SMALL LETTER I WITH OGONEK
+	* Lithuanian, ...
+	: 0069 0328
+0130	LATIN CAPITAL LETTER I WITH DOT ABOVE
+	= LATIN CAPITAL LETTER I DOT
+	* Turkish, Azerbaijani
+	* lowercase is 0069
+	x (latin capital letter i - 0049)
+	: 0049 0307
+0131	LATIN SMALL LETTER DOTLESS I
+	* Turkish, Azerbaijani
+	* uppercase is 0049
+	x (latin small letter i - 0069)
+0132	LATIN CAPITAL LIGATURE IJ
+	# 0049 004A
+0133	LATIN SMALL LIGATURE IJ
+	* Dutch
+	# 0069 006A
+0134	LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+	: 004A 0302
+0135	LATIN SMALL LETTER J WITH CIRCUMFLEX
+	* Esperanto
+	: 006A 0302
+0136	LATIN CAPITAL LETTER K WITH CEDILLA
+	: 004B 0327
+0137	LATIN SMALL LETTER K WITH CEDILLA
+	* Latvian
+	: 006B 0327
+0138	LATIN SMALL LETTER KRA (Greenlandic)
+	* Greenlandic (old orthography)
+0139	LATIN CAPITAL LETTER L WITH ACUTE
+	: 004C 0301
+013A	LATIN SMALL LETTER L WITH ACUTE
+	* Slovak
+	: 006C 0301
+013B	LATIN CAPITAL LETTER L WITH CEDILLA
+	: 004C 0327
+013C	LATIN SMALL LETTER L WITH CEDILLA
+	* Latvian
+	: 006C 0327
+013D	LATIN CAPITAL LETTER L WITH CARON
+	* the form using apostrophe is preferred in typesetting
+	: 004C 030C
+013E	LATIN SMALL LETTER L WITH CARON
+	* Slovak
+	* the form using apostrophe is preferred in typesetting
+	: 006C 030C
+013F	LATIN CAPITAL LETTER L WITH MIDDLE DOT
+	* some fonts show the middle dot inside the L, but the preferred form has the dot following the L
+	# 004C 00B7
+0140	LATIN SMALL LETTER L WITH MIDDLE DOT
+	* Catalan
+	# 006C 00B7
+0141	LATIN CAPITAL LETTER L WITH STROKE
+0142	LATIN SMALL LETTER L WITH STROKE
+	* Polish, ...
+	x (latin small letter l with bar - 019A)
+0143	LATIN CAPITAL LETTER N WITH ACUTE
+	: 004E 0301
+0144	LATIN SMALL LETTER N WITH ACUTE
+	* Polish, ...
+	: 006E 0301
+0145	LATIN CAPITAL LETTER N WITH CEDILLA
+	: 004E 0327
+0146	LATIN SMALL LETTER N WITH CEDILLA
+	* Latvian
+	: 006E 0327
+0147	LATIN CAPITAL LETTER N WITH CARON
+	: 004E 030C
+0148	LATIN SMALL LETTER N WITH CARON
+	* Czech, Slovak
+	: 006E 030C
+0149	LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+	= LATIN SMALL LETTER APOSTROPHE N
+	* Afrikaans
+	* this is not actually a single letter
+	# 02BC 006E
+014A	LATIN CAPITAL LETTER ENG (Sami)
+	* glyph may also have appearance of large form of the small letter
+014B	LATIN SMALL LETTER ENG (Sami)
+	* Sami, Mende, IPA, ...
+014C	LATIN CAPITAL LETTER O WITH MACRON
+	: 004F 0304
+014D	LATIN SMALL LETTER O WITH MACRON
+	* Latvian, Latin, ...
+	: 006F 0304
+014E	LATIN CAPITAL LETTER O WITH BREVE
+	: 004F 0306
+014F	LATIN SMALL LETTER O WITH BREVE
+	* Latin
+	: 006F 0306
+0150	LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+	: 004F 030B
+0151	LATIN SMALL LETTER O WITH DOUBLE ACUTE
+	* Hungarian
+	: 006F 030B
+0152	LATIN CAPITAL LIGATURE OE
+0153	LATIN SMALL LIGATURE OE
+	= LATIN SMALL LETTER O E
+	= ethel (from Old English eðel)
+	* French, IPA, Old Icelandic, Old English, ...
+	x (latin small letter ae - 00E6)
+	x (latin letter small capital oe - 0276)
+0154	LATIN CAPITAL LETTER R WITH ACUTE
+	: 0052 0301
+0155	LATIN SMALL LETTER R WITH ACUTE
+	* Slovak, ...
+	: 0072 0301
+0156	LATIN CAPITAL LETTER R WITH CEDILLA
+	: 0052 0327
+0157	LATIN SMALL LETTER R WITH CEDILLA
+	* Latvian
+	: 0072 0327
+0158	LATIN CAPITAL LETTER R WITH CARON
+	: 0052 030C
+0159	LATIN SMALL LETTER R WITH CARON
+	* Czech, ...
+	: 0072 030C
+015A	LATIN CAPITAL LETTER S WITH ACUTE
+	: 0053 0301
+015B	LATIN SMALL LETTER S WITH ACUTE
+	* Polish, Indic transliteration, ...
+	: 0073 0301
+015C	LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+	: 0053 0302
+015D	LATIN SMALL LETTER S WITH CIRCUMFLEX
+	* Esperanto
+	: 0073 0302
+015E	LATIN CAPITAL LETTER S WITH CEDILLA *
+	: 0053 0327
+015F	LATIN SMALL LETTER S WITH CEDILLA *
+	* Turkish, Azerbaijani, Romanian, ...
+	* this character is used in both Turkish and Romanian data
+	* a glyph variant with comma below is preferred for Romanian
+	x (latin small letter s with comma below - 0219)
+	: 0073 0327
+0160	LATIN CAPITAL LETTER S WITH CARON
+	: 0053 030C
+0161	LATIN SMALL LETTER S WITH CARON
+	* Czech, Estonian, Finnish, Slovak, and many other languages
+	: 0073 030C
+0162	LATIN CAPITAL LETTER T WITH CEDILLA *
+	: 0054 0327
+0163	LATIN SMALL LETTER T WITH CEDILLA *
+	* Romanian, Semitic transliteration, ...
+	* this character is used in Romanian data
+	* a glyph variant with comma below is preferred for Romanian
+	x (latin small letter t with comma below - 021B)
+	: 0074 0327
+0164	LATIN CAPITAL LETTER T WITH CARON
+	* the form using caron/hacek is preferred in all contexts
+	: 0054 030C
+0165	LATIN SMALL LETTER T WITH CARON
+	* Czech, Slovak
+	* the form using apostrophe is preferred in typesetting
+	: 0074 030C
+0166	LATIN CAPITAL LETTER T WITH STROKE
+0167	LATIN SMALL LETTER T WITH STROKE
+	* Sami
+0168	LATIN CAPITAL LETTER U WITH TILDE
+	: 0055 0303
+0169	LATIN SMALL LETTER U WITH TILDE
+	* Greenlandic (old orthography)
+	: 0075 0303
+016A	LATIN CAPITAL LETTER U WITH MACRON
+	: 0055 0304
+016B	LATIN SMALL LETTER U WITH MACRON
+	* Latvian, Lithuanian, Latin, ...
+	: 0075 0304
+016C	LATIN CAPITAL LETTER U WITH BREVE
+	: 0055 0306
+016D	LATIN SMALL LETTER U WITH BREVE
+	* Latin, Esperanto, ...
+	: 0075 0306
+016E	LATIN CAPITAL LETTER U WITH RING ABOVE
+	: 0055 030A
+016F	LATIN SMALL LETTER U WITH RING ABOVE
+	* Czech, ...
+	: 0075 030A
+0170	LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+	: 0055 030B
+0171	LATIN SMALL LETTER U WITH DOUBLE ACUTE
+	* Hungarian
+	: 0075 030B
+0172	LATIN CAPITAL LETTER U WITH OGONEK
+	: 0055 0328
+0173	LATIN SMALL LETTER U WITH OGONEK
+	* Lithuanian
+	: 0075 0328
+0174	LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+	: 0057 0302
+0175	LATIN SMALL LETTER W WITH CIRCUMFLEX
+	* Welsh
+	: 0077 0302
+0176	LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+	: 0059 0302
+0177	LATIN SMALL LETTER Y WITH CIRCUMFLEX
+	* Welsh
+	: 0079 0302
+0178	LATIN CAPITAL LETTER Y WITH DIAERESIS
+	* French, Igbo
+	x (latin small letter y with diaeresis - 00FF)
+	: 0059 0308
+0179	LATIN CAPITAL LETTER Z WITH ACUTE
+	: 005A 0301
+017A	LATIN SMALL LETTER Z WITH ACUTE
+	* Polish, ...
+	: 007A 0301
+017B	LATIN CAPITAL LETTER Z WITH DOT ABOVE
+	: 005A 0307
+017C	LATIN SMALL LETTER Z WITH DOT ABOVE
+	* Polish, ...
+	: 007A 0307
+017D	LATIN CAPITAL LETTER Z WITH CARON
+	: 005A 030C
+017E	LATIN SMALL LETTER Z WITH CARON
+	* Czech, Estonian, Finnish, Slovak, Slovenian, and many other languages
+	: 007A 030C
+017F	LATIN SMALL LETTER LONG S
+	* in common use in Roman types until the 18th century
+	* in current use in Fraktur and Gaelic types
+	# 0073 latin small letter s
+@@	0180	Latin Extended-B	024F
+@		Latin Extended-B
+0180	LATIN SMALL LETTER B WITH STROKE
+	* Americanist and Indo-Europeanist usage for phonetic beta
+	* Americanist orthographies use an alternate glyph with the stroke through the bowl
+	* Old Saxon
+	x (greek small letter beta - 03B2)
+	x (blank symbol - 2422)
+0181	LATIN CAPITAL LETTER B WITH HOOK
+	* Zulu, Pan-Nigerian alphabet
+	x (latin small letter b with hook - 0253)
+0182	LATIN CAPITAL LETTER B WITH TOPBAR
+0183	LATIN SMALL LETTER B WITH TOPBAR
+	* Zhuang
+	* former Soviet minority language scripts
+	x (cyrillic capital letter be - 0411)
+0184	LATIN CAPITAL LETTER TONE SIX
+0185	LATIN SMALL LETTER TONE SIX
+	* Zhuang
+	* Zhuang tone three is Cyrillic ze
+	* Zhuang tone four is Cyrillic che
+	x (latin small letter tone two - 01A8)
+	x (latin small letter tone five - 01BD)
+	x (cyrillic small letter ze - 0437)
+	x (cyrillic small letter che - 0447)
+	x (cyrillic small letter soft sign - 044C)
+0186	LATIN CAPITAL LETTER OPEN O
+	* typographically a turned C
+	* African
+	x (latin small letter open o - 0254)
+0187	LATIN CAPITAL LETTER C WITH HOOK
+0188	LATIN SMALL LETTER C WITH HOOK
+	* African
+0189	LATIN CAPITAL LETTER AFRICAN D *
+	* Ewe
+	x (latin capital letter eth - 00D0)
+	x (latin capital letter d with stroke - 0110)
+	x (latin small letter d with tail - 0256)
+018A	LATIN CAPITAL LETTER D WITH HOOK
+	* Pan-Nigerian alphabet
+	x (latin small letter d with hook - 0257)
+018B	LATIN CAPITAL LETTER D WITH TOPBAR
+018C	LATIN SMALL LETTER D WITH TOPBAR
+	* former-Soviet minority language scripts
+018D	LATIN SMALL LETTER TURNED DELTA
+	= reversed Polish-hook o
+	* archaic phonetic for labialized alveolar fricative
+	* recommended spellings 007A 02B7 or 007A 032B
+018E	LATIN CAPITAL LETTER REVERSED E
+	= LATIN CAPITAL LETTER TURNED E
+	* Pan-Nigerian alphabet
+	* lowercase is 01DD
+018F	LATIN CAPITAL LETTER SCHWA
+	* Azerbaijani, ...
+	x (latin small letter schwa - 0259)
+	x (cyrillic capital letter schwa - 04D8)
+0190	LATIN CAPITAL LETTER OPEN E
+	= LATIN CAPITAL LETTER EPSILON
+	* African
+	x (latin small letter open e - 025B)
+	x (euler constant - 2107)
+0191	LATIN CAPITAL LETTER F WITH HOOK
+	* African
+0192	LATIN SMALL LETTER F WITH HOOK
+	= LATIN SMALL LETTER SCRIPT F
+	= Florin currency symbol (Netherlands)
+	= function symbol
+	= abbreviation convention for folder
+0193	LATIN CAPITAL LETTER G WITH HOOK
+	* African
+	x (latin small letter g with hook - 0260)
+0194	LATIN CAPITAL LETTER GAMMA
+	* African
+	x (latin small letter gamma - 0263)
+0195	LATIN SMALL LETTER HV (hwair)
+	* Gothic transliteration
+	* uppercase is 01F6
+0196	LATIN CAPITAL LETTER IOTA
+	* African
+	x (latin small letter iota - 0269)
+0197	LATIN CAPITAL LETTER I WITH STROKE
+	= barred i, i bar
+	* African
+	* ISO 6438 gives lowercase as 026A, not 0268
+	x (latin letter small capital i - 026A)
+0198	LATIN CAPITAL LETTER K WITH HOOK
+0199	LATIN SMALL LETTER K WITH HOOK
+	* Hausa, Pan-Nigerian alphabet
+019A	LATIN SMALL LETTER L WITH BAR
+	= barred l
+	* Americanist phonetic usage for 026C
+	x (latin small letter l with stroke - 0142)
+019B	LATIN SMALL LETTER LAMBDA WITH STROKE
+	= barred lambda, lambda bar
+	* Americanist phonetic usage
+019C	LATIN CAPITAL LETTER TURNED M
+	* Zhuang
+	x (latin small letter turned m - 026F)
+019D	LATIN CAPITAL LETTER N WITH LEFT HOOK
+	* African
+	x (latin small letter n with left hook - 0272)
+019E	LATIN SMALL LETTER N WITH LONG RIGHT LEG
+	* archaic phonetic for Japanese 3093
+	* recommended spelling for syllabic n is 006E 0329
+	* Lakota (indicates nasalization of vowel)
+	x (latin capital letter n with long right leg - 0220)
+019F	LATIN CAPITAL LETTER O WITH MIDDLE TILDE *
+	= barred o, o bar
+	* lowercase is 0275
+	* African
+	x (cyrillic capital letter barred o - 04E8)
+01A0	LATIN CAPITAL LETTER O WITH HORN
+	: 004F 031B
+01A1	LATIN SMALL LETTER O WITH HORN
+	* Vietnamese
+	: 006F 031B
+01A2	LATIN CAPITAL LETTER OI (gha)
+01A3	LATIN SMALL LETTER OI (gha)
+	= gha
+	* Pan-Turkic Latin alphabets
+01A4	LATIN CAPITAL LETTER P WITH HOOK
+01A5	LATIN SMALL LETTER P WITH HOOK
+	* African
+01A6	LATIN LETTER YR *
+	* Old Norse
+	* from German Standard DIN 31624 and ISO 5246-2
+	* lowercase is 0280
+01A7	LATIN CAPITAL LETTER TONE TWO
+01A8	LATIN SMALL LETTER TONE TWO
+	* Zhuang
+	* typographically a reversed S
+	x (latin small letter tone six - 0185)
+01A9	LATIN CAPITAL LETTER ESH
+	* African
+	x (latin small letter esh - 0283)
+	x (greek capital letter sigma - 03A3)
+01AA	LATIN LETTER REVERSED ESH LOOP
+	* archaic phonetic for labialized palatoalveolar or palatal fricative
+	* Twi
+	* recommended spellings 0283 02B7, 00E7 02B7, 0068 0265, etc.
+01AB	LATIN SMALL LETTER T WITH PALATAL HOOK
+	* archaic phonetic for palatalized alveolar or dental stop
+	* recommended spelling 0074 02B2
+01AC	LATIN CAPITAL LETTER T WITH HOOK
+	* a glyph variant with hook at the right also occurs
+01AD	LATIN SMALL LETTER T WITH HOOK
+	* African
+01AE	LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+	* African
+	x (latin small letter t with retroflex hook - 0288)
+01AF	LATIN CAPITAL LETTER U WITH HORN
+	: 0055 031B
+01B0	LATIN SMALL LETTER U WITH HORN
+	* Vietnamese
+	: 0075 031B
+01B1	LATIN CAPITAL LETTER UPSILON
+	* African
+	* typographically based on turned capital Greek omega
+	x (latin small letter upsilon - 028A)
+	x (inverted ohm sign - 2127)
+01B2	LATIN CAPITAL LETTER V WITH HOOK
+	= LATIN CAPITAL LETTER SCRIPT V
+	* African
+	x (latin small letter v with hook - 028B)
+01B3	LATIN CAPITAL LETTER Y WITH HOOK
+	* a glyph variant with hook at the right also occurs
+01B4	LATIN SMALL LETTER Y WITH HOOK
+	* Bini, Esoko, and other Edo languages in West Africa
+01B5	LATIN CAPITAL LETTER Z WITH STROKE
+01B6	LATIN SMALL LETTER Z WITH STROKE
+	= barred z, z bar
+	* Pan-Turkic Latin orthography
+	* handwritten variant of Latin "z"
+	x (latin small letter z - 007A)
+01B7	LATIN CAPITAL LETTER EZH
+	* African, Skolt Sami
+	* lowercase is 0292
+	x (latin capital letter yogh - 021C)
+	x (cyrillic capital letter abkhasian dze - 04E0)
+01B8	LATIN CAPITAL LETTER EZH REVERSED
+01B9	LATIN SMALL LETTER EZH REVERSED
+	* archaic phonetic for voiced pharyngeal fricative
+	* sometimes typographically rendered with a turned digit 3
+	* recommended spelling 0295
+	x (latin letter pharyngeal voiced fricative - 0295)
+	x (arabic letter ain - 0639)
+01BA	LATIN SMALL LETTER EZH WITH TAIL
+	* archaic phonetic for labialized voiced palatoalveolar or palatal fricative
+	* Twi
+	* recommended spellings 0292 02B7 or 006A 02B7
+01BB	LATIN LETTER TWO WITH STROKE
+	* archaic phonetic for [dz] affricate
+	* recommended spellings 0292 or 0064 007A
+01BC	LATIN CAPITAL LETTER TONE FIVE
+01BD	LATIN SMALL LETTER TONE FIVE
+	* Zhuang
+	x (latin small letter tone six - 0185)
+01BE	LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+	* archaic phonetic for [ts] affricate
+	* recommended spelling 0074 0073
+	* letter form is actually derived from ligation of ts, rather than inverted glottal stop
+01BF	LATIN LETTER WYNN
+	= wen
+	* Runic letter borrowed into Latin script
+	* replaced by "w" in modern transcriptions of Old English
+	* uppercase is 01F7
+	x (runic letter wunjo wynn w - 16B9)
+@		African letters for clicks
+01C0	LATIN LETTER DENTAL CLICK
+	= pipe
+	* Khoisan tradition
+	* "c" in Zulu orthography
+	x (solidus - 002F)
+	x (vertical line - 007C)
+	x (latin small letter turned t - 0287)
+	x (divides - 2223)
+01C1	LATIN LETTER LATERAL CLICK
+	= double pipe
+	* Khoisan tradition
+	* "x" in Zulu orthography
+	x (latin letter inverted glottal stop - 0296)
+	x (parallel to - 2225)
+01C2	LATIN LETTER ALVEOLAR CLICK
+	= double-barred pipe
+	* Khoisan tradition
+	x (not equal to - 2260)
+01C3	LATIN LETTER RETROFLEX CLICK
+	= LATIN LETTER EXCLAMATION MARK
+	* Khoisan tradition
+	* "q" in Zulu orthography
+	x (exclamation mark - 0021)
+	x (latin letter stretched c - 0297)
+@		Croatian digraphs matching Serbian Cyrillic letters
+01C4	LATIN CAPITAL LETTER DZ WITH CARON
+	# 0044 017D
+01C5	LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+	# 0044 017E
+01C6	LATIN SMALL LETTER DZ WITH CARON
+	x (cyrillic small letter dzhe - 045F)
+	# 0064 017E
+01C7	LATIN CAPITAL LETTER LJ
+	# 004C 004A
+01C8	LATIN CAPITAL LETTER L WITH SMALL LETTER J
+	# 004C 006A
+01C9	LATIN SMALL LETTER LJ
+	x (cyrillic small letter lje - 0459)
+	# 006C 006A
+01CA	LATIN CAPITAL LETTER NJ
+	# 004E 004A
+01CB	LATIN CAPITAL LETTER N WITH SMALL LETTER J
+	# 004E 006A
+01CC	LATIN SMALL LETTER NJ
+	x (cyrillic small letter nje - 045A)
+	# 006E 006A
+@		Pinyin diacritic-vowel combinations
+01CD	LATIN CAPITAL LETTER A WITH CARON
+	: 0041 030C
+01CE	LATIN SMALL LETTER A WITH CARON
+	* Pinyin third tone
+	: 0061 030C
+01CF	LATIN CAPITAL LETTER I WITH CARON
+	: 0049 030C
+01D0	LATIN SMALL LETTER I WITH CARON
+	* Pinyin third tone
+	: 0069 030C
+01D1	LATIN CAPITAL LETTER O WITH CARON
+	: 004F 030C
+01D2	LATIN SMALL LETTER O WITH CARON
+	* Pinyin third tone
+	: 006F 030C
+01D3	LATIN CAPITAL LETTER U WITH CARON
+	: 0055 030C
+01D4	LATIN SMALL LETTER U WITH CARON
+	* Pinyin third tone
+	: 0075 030C
+01D5	LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+	: 00DC 0304
+01D6	LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+	* Pinyin first tone
+	: 00FC 0304
+01D7	LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+	: 00DC 0301
+01D8	LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+	* Pinyin second tone
+	: 00FC 0301
+01D9	LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+	: 00DC 030C
+01DA	LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+	* Pinyin third tone
+	: 00FC 030C
+01DB	LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+	: 00DC 0300
+01DC	LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+	* Pinyin fourth tone
+	: 00FC 0300
+@		Additions
+01DD	LATIN SMALL LETTER TURNED E
+	* Pan-Nigerian alphabet
+	* all other usages of schwa are 0259
+	* uppercase is 018E
+	x (latin small letter schwa - 0259)
+01DE	LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+	: 00C4 0304
+01DF	LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+	* Livonian, Uralicist usage
+	: 00E4 0304
+01E0	LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+	: 0226 0304
+01E1	LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+	* Uralicist usage
+	: 0227 0304
+01E2	LATIN CAPITAL LETTER AE WITH MACRON (ash) *
+	: 00C6 0304
+01E3	LATIN SMALL LETTER AE WITH MACRON (ash) *
+	* Old Norse, Old English
+	: 00E6 0304
+01E4	LATIN CAPITAL LETTER G WITH STROKE
+01E5	LATIN SMALL LETTER G WITH STROKE
+	* Skolt Sami
+01E6	LATIN CAPITAL LETTER G WITH CARON
+	: 0047 030C
+01E7	LATIN SMALL LETTER G WITH CARON
+	* Skolt Sami
+	x (latin small letter g with breve - 011F)
+	: 0067 030C
+01E8	LATIN CAPITAL LETTER K WITH CARON
+	: 004B 030C
+01E9	LATIN SMALL LETTER K WITH CARON
+	* Skolt Sami
+	: 006B 030C
+01EA	LATIN CAPITAL LETTER O WITH OGONEK
+	: 004F 0328
+01EB	LATIN SMALL LETTER O WITH OGONEK
+	* Sami, Iroquoian, Old Icelandic
+	: 006F 0328
+01EC	LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+	: 01EA 0304
+01ED	LATIN SMALL LETTER O WITH OGONEK AND MACRON
+	* Old Icelandic
+	: 01EB 0304
+01EE	LATIN CAPITAL LETTER EZH WITH CARON
+	: 01B7 030C
+01EF	LATIN SMALL LETTER EZH WITH CARON
+	* Skolt Sami
+	: 0292 030C
+01F0	LATIN SMALL LETTER J WITH CARON
+	* IPA and many languages
+	: 006A 030C
+01F1	LATIN CAPITAL LETTER DZ
+	# 0044 005A
+01F2	LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+	# 0044 007A
+01F3	LATIN SMALL LETTER DZ
+	# 0064 007A
+01F4	LATIN CAPITAL LETTER G WITH ACUTE
+	: 0047 0301
+01F5	LATIN SMALL LETTER G WITH ACUTE
+	* Macedonian and Serbian transliteration
+	: 0067 0301
+01F6	LATIN CAPITAL LETTER HWAIR
+	* lowercase is 0195
+01F7	LATIN CAPITAL LETTER WYNN
+	= wen
+	* lowercase is 01BF
+01F8	LATIN CAPITAL LETTER N WITH GRAVE
+	: 004E 0300
+01F9	LATIN SMALL LETTER N WITH GRAVE
+	* Pinyin
+	: 006E 0300
+01FA	LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+	: 00C5 0301
+01FB	LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+	: 00E5 0301
+01FC	LATIN CAPITAL LETTER AE WITH ACUTE (ash) *
+	: 00C6 0301
+01FD	LATIN SMALL LETTER AE WITH ACUTE (ash) *
+	: 00E6 0301
+01FE	LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+	: 00D8 0301
+01FF	LATIN SMALL LETTER O WITH STROKE AND ACUTE
+	: 00F8 0301
+@		Additions for Slovenian and Croatian
+0200	LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+	: 0041 030F
+0201	LATIN SMALL LETTER A WITH DOUBLE GRAVE
+	: 0061 030F
+0202	LATIN CAPITAL LETTER A WITH INVERTED BREVE
+	: 0041 0311
+0203	LATIN SMALL LETTER A WITH INVERTED BREVE
+	: 0061 0311
+0204	LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+	: 0045 030F
+0205	LATIN SMALL LETTER E WITH DOUBLE GRAVE
+	: 0065 030F
+0206	LATIN CAPITAL LETTER E WITH INVERTED BREVE
+	: 0045 0311
+0207	LATIN SMALL LETTER E WITH INVERTED BREVE
+	: 0065 0311
+0208	LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+	: 0049 030F
+0209	LATIN SMALL LETTER I WITH DOUBLE GRAVE
+	: 0069 030F
+020A	LATIN CAPITAL LETTER I WITH INVERTED BREVE
+	: 0049 0311
+020B	LATIN SMALL LETTER I WITH INVERTED BREVE
+	: 0069 0311
+020C	LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+	: 004F 030F
+020D	LATIN SMALL LETTER O WITH DOUBLE GRAVE
+	: 006F 030F
+020E	LATIN CAPITAL LETTER O WITH INVERTED BREVE
+	: 004F 0311
+020F	LATIN SMALL LETTER O WITH INVERTED BREVE
+	: 006F 0311
+0210	LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+	: 0052 030F
+0211	LATIN SMALL LETTER R WITH DOUBLE GRAVE
+	: 0072 030F
+0212	LATIN CAPITAL LETTER R WITH INVERTED BREVE
+	: 0052 0311
+0213	LATIN SMALL LETTER R WITH INVERTED BREVE
+	: 0072 0311
+0214	LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+	: 0055 030F
+0215	LATIN SMALL LETTER U WITH DOUBLE GRAVE
+	: 0075 030F
+0216	LATIN CAPITAL LETTER U WITH INVERTED BREVE
+	: 0055 0311
+0217	LATIN SMALL LETTER U WITH INVERTED BREVE
+	: 0075 0311
+@		Additions for Romanian
+0218	LATIN CAPITAL LETTER S WITH COMMA BELOW *
+	: 0053 0326
+0219	LATIN SMALL LETTER S WITH COMMA BELOW *
+	* Romanian, when distinct comma below form is required
+	x (latin small letter s with cedilla - 015F)
+	: 0073 0326
+021A	LATIN CAPITAL LETTER T WITH COMMA BELOW *
+	: 0054 0326
+021B	LATIN SMALL LETTER T WITH COMMA BELOW *
+	* Romanian, when distinct comma below form is required
+	x (latin small letter t with cedilla - 0163)
+	: 0074 0326
+@		Miscellaneous additions
+021C	LATIN CAPITAL LETTER YOGH
+	x (latin capital letter ezh - 01B7)
+021D	LATIN SMALL LETTER YOGH
+	* Middle English, Scots
+	x (latin small letter ezh - 0292)
+	x (ounce sign - 2125)
+021E	LATIN CAPITAL LETTER H WITH CARON
+	: 0048 030C
+021F	LATIN SMALL LETTER H WITH CARON
+	* Finnish Romany
+	: 0068 030C
+0220	LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+	* Lakota
+	x (latin small letter n with long right leg - 019E)
+0221	LATIN SMALL LETTER D WITH CURL
+	* phonetic use in Sinology
+0222	LATIN CAPITAL LETTER OU
+0223	LATIN SMALL LETTER OU
+	* Algonquin, Huron
+	x (digit eight - 0038)
+0224	LATIN CAPITAL LETTER Z WITH HOOK
+0225	LATIN SMALL LETTER Z WITH HOOK
+	* Middle High German
+0226	LATIN CAPITAL LETTER A WITH DOT ABOVE
+	: 0041 0307
+0227	LATIN SMALL LETTER A WITH DOT ABOVE
+	* Uralicist usage
+	: 0061 0307
+0228	LATIN CAPITAL LETTER E WITH CEDILLA
+	: 0045 0327
+0229	LATIN SMALL LETTER E WITH CEDILLA
+	: 0065 0327
+@		Additions for Livonian
+022A	LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+	: 00D6 0304
+022B	LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+	* Livonian
+	: 00F6 0304
+022C	LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+	: 00D5 0304
+022D	LATIN SMALL LETTER O WITH TILDE AND MACRON
+	* Livonian
+	: 00F5 0304
+022E	LATIN CAPITAL LETTER O WITH DOT ABOVE
+	: 004F 0307
+022F	LATIN SMALL LETTER O WITH DOT ABOVE
+	* Livonian
+	: 006F 0307
+0230	LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+	: 022E 0304
+0231	LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+	* Livonian
+	: 022F 0304
+0232	LATIN CAPITAL LETTER Y WITH MACRON
+	: 0059 0304
+0233	LATIN SMALL LETTER Y WITH MACRON
+	* Livonian, Cornish
+	: 0079 0304
+@		Additions for Sinology
+0234	LATIN SMALL LETTER L WITH CURL
+0235	LATIN SMALL LETTER N WITH CURL
+0236	LATIN SMALL LETTER T WITH CURL
+@		Miscellaneous additions
+0237	LATIN SMALL LETTER DOTLESS J
+	x (mathematical italic small dotless j - 1D6A5)
+0238	LATIN SMALL LETTER DB DIGRAPH
+	* used in Africanist linguistics
+0239	LATIN SMALL LETTER QP DIGRAPH
+	* used in Africanist linguistics
+023A	LATIN CAPITAL LETTER A WITH STROKE
+	* Sencoten
+023B	LATIN CAPITAL LETTER C WITH STROKE
+	* Sencoten
+023C	LATIN SMALL LETTER C WITH STROKE
+	* used in Americanist linguistics
+023D	LATIN CAPITAL LETTER L WITH BAR
+	* Sencoten
+023E	LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+	* Sencoten
+023F	LATIN SMALL LETTER S WITH SWASH TAIL
+0240	LATIN SMALL LETTER Z WITH SWASH TAIL
+0241	LATIN CAPITAL LETTER GLOTTAL STOP
+	* lowercase is 0294
+@@	0250	IPA Extensions	02AF
+@		IPA extensions
+@+		IPA includes basic Latin letters and a number of Latin or Greek letters from other blocks.
+		x (latin small letter ae - 00E6)
+		x (latin small letter c with cedilla - 00E7)
+		x (latin small letter eth - 00F0)
+		x (latin small letter o with stroke - 00F8)
+		x (latin small letter h with stroke - 0127)
+		x (latin small letter eng - 014B)
+		x (latin small ligature oe - 0153)
+		x (greek small letter beta - 03B2)
+		x (greek small letter theta - 03B8)
+		x (greek small letter lamda - 03BB)
+		x (greek small letter chi - 03C7)
+0250	LATIN SMALL LETTER TURNED A
+	* low central unrounded vowel
+0251	LATIN SMALL LETTER ALPHA
+	= LATIN SMALL LETTER SCRIPT A
+	* low back unrounded vowel
+	x (greek small letter alpha - 03B1)
+0252	LATIN SMALL LETTER TURNED ALPHA
+	* low back rounded vowel
+0253	LATIN SMALL LETTER B WITH HOOK
+	* implosive bilabial stop
+	* Pan-Nigerian alphabet
+	x (latin capital letter b with hook - 0181)
+0254	LATIN SMALL LETTER OPEN O
+	* typographically a turned c
+	* lower-mid back rounded vowel
+	x (latin capital letter open o - 0186)
+0255	LATIN SMALL LETTER C WITH CURL
+	* voiceless alveolo-palatal laminal fricative
+	* used in transcription of Mandarin Chinese
+	* sound spelled with 015B in Polish
+0256	LATIN SMALL LETTER D WITH TAIL
+	= LATIN SMALL LETTER D RETROFLEX HOOK
+	* voiced retroflex stop
+	x (latin capital letter african d - 0189)
+0257	LATIN SMALL LETTER D WITH HOOK
+	* implosive dental or alveolar stop
+	* Ewe, Pan-Nigerian alphabet
+	x (latin capital letter d with hook - 018A)
+0258	LATIN SMALL LETTER REVERSED E
+	* upper-mid central unrounded vowel
+0259	LATIN SMALL LETTER SCHWA
+	* mid-central unrounded vowel
+	* variant uppercase form 018E is associated with 01DD
+	x (latin capital letter schwa - 018F)
+	x (latin small letter turned e - 01DD)
+	x (cyrillic small letter schwa - 04D9)
+025A	LATIN SMALL LETTER SCHWA WITH HOOK
+	* rhotacized schwa
+025B	LATIN SMALL LETTER OPEN E
+	= LATIN SMALL LETTER EPSILON
+	* lower-mid front unrounded vowel
+	x (latin capital letter open e - 0190)
+	x (greek small letter epsilon - 03B5)
+025C	LATIN SMALL LETTER REVERSED OPEN E
+	* lower-mid central unrounded vowel
+025D	LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+	* rhotacized lower-mid central vowel
+025E	LATIN SMALL LETTER CLOSED REVERSED OPEN E
+	= LATIN SMALL LETTER CLOSED REVERSED EPSILON
+	* lower-mid central rounded vowel
+025F	LATIN SMALL LETTER DOTLESS J WITH STROKE
+	* voiced palatal stop
+	* typographically a turned f, but better thought of as a form of j
+	* "gy" in Hungarian orthography
+	* also archaic phonetic for palatoalveolar affricate 02A4
+0260	LATIN SMALL LETTER G WITH HOOK
+	* implosive velar stop
+	x (latin capital letter g with hook - 0193)
+0261	LATIN SMALL LETTER SCRIPT G
+	* voiced velar stop
+	x (latin small letter g - 0067)
+0262	LATIN LETTER SMALL CAPITAL G
+	* voiced uvular stop
+0263	LATIN SMALL LETTER GAMMA
+	* voiced velar fricative
+	x (latin capital letter gamma - 0194)
+	x (greek small letter gamma - 03B3)
+0264	LATIN SMALL LETTER RAMS HORN
+	= LATIN SMALL LETTER BABY GAMMA
+	* upper-mid back unrounded vowel
+0265	LATIN SMALL LETTER TURNED H
+	* voiced rounded palatal approximant
+0266	LATIN SMALL LETTER H WITH HOOK
+	* breathy-voiced glottal fricative
+	x (modifier letter small h with hook - 02B1)
+0267	LATIN SMALL LETTER HENG WITH HOOK
+	* voiceless coarticulated velar and palatoalveolar fricative
+	* "tj" or "kj" or "sj" in some Swedish dialects
+0268	LATIN SMALL LETTER I WITH STROKE
+	= barred i, i bar
+	* high central unrounded vowel
+	* ISO 6438 gives lowercase of 0197 as 026A, not 0268
+0269	LATIN SMALL LETTER IOTA
+	* semi-high front unrounded vowel
+@+		* obsoleted by IPA in 1989
+	* preferred use is 026A LATIN LETTER SMALL CAPITAL I
+	x (latin capital letter iota - 0196)
+	x (greek small letter iota - 03B9)
+026A	LATIN LETTER SMALL CAPITAL I
+	* semi-high front unrounded vowel
+	* preferred IPA alternate for 0269
+	x (latin capital letter i with stroke - 0197)
+026B	LATIN SMALL LETTER L WITH MIDDLE TILDE
+	* velarized voiced alveolar lateral approximant
+026C	LATIN SMALL LETTER L WITH BELT
+	* voiceless alveolar lateral fricative
+026D	LATIN SMALL LETTER L WITH RETROFLEX HOOK
+	* voiced retroflex lateral
+026E	LATIN SMALL LETTER LEZH
+	* voiced lateral fricative
+	* "dhl" in Zulu orthography
+026F	LATIN SMALL LETTER TURNED M
+	* high back unrounded vowel
+	x (latin capital letter turned m - 019C)
+0270	LATIN SMALL LETTER TURNED M WITH LONG LEG
+	* voiced velar approximant
+0271	LATIN SMALL LETTER M WITH HOOK
+	* voiced labiodental nasal
+0272	LATIN SMALL LETTER N WITH LEFT HOOK
+	* voiced palatal nasal
+	x (latin capital letter n with left hook - 019D)
+0273	LATIN SMALL LETTER N WITH RETROFLEX HOOK
+	* voiced retroflex nasal
+0274	LATIN LETTER SMALL CAPITAL N
+	* voiced uvular nasal
+0275	LATIN SMALL LETTER BARRED O
+	= o bar
+	* rounded mid-central vowel, i.e. rounded schwa
+	* uppercase is 019F
+	x (greek small letter theta - 03B8)
+	x (cyrillic small letter fita - 0473)
+	x (cyrillic small letter barred o - 04E9)
+0276	LATIN LETTER SMALL CAPITAL OE
+	* low front rounded vowel
+	x (latin small ligature oe - 0153)
+0277	LATIN SMALL LETTER CLOSED OMEGA
+	* semi-high back rounded vowel
+@+		* obsoleted by IPA in 1989
+	* preferred use is 028A latin small letter upsilon
+0278	LATIN SMALL LETTER PHI
+	* voiceless bilabial fricative
+	x (greek small letter phi - 03C6)
+0279	LATIN SMALL LETTER TURNED R
+	* voiced alveolar approximant
+	x (modifier letter small turned r - 02B4)
+027A	LATIN SMALL LETTER TURNED R WITH LONG LEG
+	* voiced lateral flap
+027B	LATIN SMALL LETTER TURNED R WITH HOOK
+	* voiced retroflex approximant
+	x (modifier letter small turned r with hook - 02B5)
+027C	LATIN SMALL LETTER R WITH LONG LEG
+	* voiced strident apico-alveolar trill
+@+		* obsoleted by IPA in 1989
+	* sound spelled with 0159 in Czech
+	* preferred phonetic representation for Czech is 0072 031D
+	* in current use in Gaelic types (as glyph variant of 0072)
+027D	LATIN SMALL LETTER R WITH TAIL
+	* voiced retroflex flap
+027E	LATIN SMALL LETTER R WITH FISHHOOK
+	* voiced alveolar flap or tap
+027F	LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+	= long leg turned iota (a misnomer)
+	* apical dental vowel
+	* used by linguists working on Chinese and other Sino-Tibetan languages
+	* IPA spelling - 007A 0329
+0280	LATIN LETTER SMALL CAPITAL R *
+	* voiced uvular trill
+	* Germanic, Old Norse
+	* uppercase is 01A6
+0281	LATIN LETTER SMALL CAPITAL INVERTED R
+	* voiced uvular fricative or approximant
+	x (modifier letter small capital inverted r - 02B6)
+0282	LATIN SMALL LETTER S WITH HOOK
+	* voiceless retroflex fricative
+0283	LATIN SMALL LETTER ESH
+	* voiceless postalveolar fricative
+	x (latin capital letter esh - 01A9)
+	x (integral - 222B)
+0284	LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+	* implosive palatal stop
+	* typographically based on 025F, not on 0283
+0285	LATIN SMALL LETTER SQUAT REVERSED ESH
+	* apical retroflex vowel
+	* used by linguists working on Chinese and other Sino-Tibetan languages
+	* IPA spelling - 0290 0329
+	* in origin 027F plus the retroflex hook 0322, despite its name
+0286	LATIN SMALL LETTER ESH WITH CURL
+	* palatalized voiceless postalveolar fricative
+	* suggested spelling - 0283 02B2
+0287	LATIN SMALL LETTER TURNED T
+	* dental click (sound of "tsk tsk")
+	x (latin letter dental click - 01C0)
+0288	LATIN SMALL LETTER T WITH RETROFLEX HOOK
+	* voiceless retroflex stop
+	x (latin capital letter t with retroflex hook - 01AE)
+0289	LATIN SMALL LETTER U BAR
+	* high central rounded vowel
+028A	LATIN SMALL LETTER UPSILON
+	* semi-high back rounded vowel
+	* preferred IPA alternate to 0277
+	x (latin capital letter upsilon - 01B1)
+	x (greek small letter upsilon - 03C5)
+028B	LATIN SMALL LETTER V WITH HOOK
+	= LATIN SMALL LETTER SCRIPT V
+	* voiced labiodental approximant
+	x (latin capital letter v with hook - 01B2)
+	x (greek small letter upsilon - 03C5)
+028C	LATIN SMALL LETTER TURNED V
+	= caret, wedge
+	* lower-mid back unrounded vowel
+	x (greek capital letter lamda - 039B)
+	x (caret - 2038)
+	x (logical and - 2227)
+028D	LATIN SMALL LETTER TURNED W
+	* voiceless rounded labiovelar approximant
+028E	LATIN SMALL LETTER TURNED Y
+	* voiced lateral approximant
+028F	LATIN LETTER SMALL CAPITAL Y
+	* semi-high front rounded vowel
+0290	LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+	* voiced retroflex fricative
+0291	LATIN SMALL LETTER Z WITH CURL
+	* voiced alveolo-palatal laminal fricative
+	* sound spelled with 017A in Polish
+0292	LATIN SMALL LETTER EZH
+	= dram
+	* voiced postalveolar fricative
+	* mistakenly named yogh in Unicode 1.0
+	* uppercase is 01B7
+	* Skolt Sami
+	x (latin small letter yogh - 021D)
+	x (cyrillic small letter abkhasian dze - 04E1)
+	x (ounce sign - 2125)
+0293	LATIN SMALL LETTER EZH WITH CURL
+	* palatalized voiced postalveolar fricative
+0294	LATIN LETTER GLOTTAL STOP
+	* uppercase is 0241
+	x (modifier letter glottal stop - 02C0)
+0295	LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+	= LATIN LETTER REVERSED GLOTTAL STOP
+	* voiced pharyngeal fricative
+	* ain
+	x (latin small letter ezh reversed - 01B9)
+	x (modifier letter reversed glottal stop - 02C1)
+0296	LATIN LETTER INVERTED GLOTTAL STOP
+	* lateral click
+	x (latin letter lateral click - 01C1)
+0297	LATIN LETTER STRETCHED C
+	* palatal (or alveolar) click
+	x (latin letter retroflex click - 01C3)
+	x (complement - 2201)
+0298	LATIN LETTER BILABIAL CLICK
+	= LATIN LETTER BULLSEYE
+	x (circled dot operator - 2299)
+0299	LATIN LETTER SMALL CAPITAL B
+	* bilabial trill
+029A	LATIN SMALL LETTER CLOSED OPEN E
+	= LATIN SMALL LETTER CLOSED EPSILON
+	* lower-mid front rounded vowel
+	* non-IPA alternate for the preferred 0153
+029B	LATIN LETTER SMALL CAPITAL G WITH HOOK
+	* voiced uvular implosive
+029C	LATIN LETTER SMALL CAPITAL H
+	* voiceless epiglottal fricative
+029D	LATIN SMALL LETTER J WITH CROSSED-TAIL
+	* voiced palatal fricative
+029E	LATIN SMALL LETTER TURNED K
+	* proposed for velar click
+@+		* withdrawn by IPA in 1970
+029F	LATIN LETTER SMALL CAPITAL L
+	* velar lateral approximant
+02A0	LATIN SMALL LETTER Q WITH HOOK
+	* voiceless uvular implosive
+02A1	LATIN LETTER GLOTTAL STOP WITH STROKE
+	* voiced epiglottal stop
+02A2	LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+	* voiced epiglottal fricative
+02A3	LATIN SMALL LETTER DZ DIGRAPH
+	* voiced dental affricate
+02A4	LATIN SMALL LETTER DEZH DIGRAPH
+	* voiced postalveolar affricate
+02A5	LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+	* voiced alveolo-palatal affricate
+02A6	LATIN SMALL LETTER TS DIGRAPH
+	* voiceless dental affricate
+02A7	LATIN SMALL LETTER TESH DIGRAPH
+	* voiceless postalveolar affricate
+02A8	LATIN SMALL LETTER TC DIGRAPH WITH CURL
+	* voiceless alveolo-palatal affricate
+@		IPA characters for disordered speech
+02A9	LATIN SMALL LETTER FENG DIGRAPH
+	* velopharyngeal fricative
+02AA	LATIN SMALL LETTER LS DIGRAPH
+	* lateral alveolar fricative (lisp)
+02AB	LATIN SMALL LETTER LZ DIGRAPH
+	* voiced lateral alveolar fricative
+02AC	LATIN LETTER BILABIAL PERCUSSIVE
+	* audible lip smack
+02AD	LATIN LETTER BIDENTAL PERCUSSIVE
+	* audible teeth gnashing
+@		Additions for Sinology
+02AE	LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF	LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+@@	02B0	Spacing Modifier Letters	02FF
+@		Latin superscript modifier letters
+02B0	MODIFIER LETTER SMALL H
+	* aspiration
+	# <super> 0068
+02B1	MODIFIER LETTER SMALL H WITH HOOK
+	* breathy voiced, murmured
+	x (latin small letter h with hook - 0266)
+	x (combining diaeresis below - 0324)
+	# <super> 0266
+02B2	MODIFIER LETTER SMALL J
+	* palatalization
+	x (combining palatalized hook below - 0321)
+	# <super> 006A
+02B3	MODIFIER LETTER SMALL R
+	# <super> 0072
+02B4	MODIFIER LETTER SMALL TURNED R
+	x (latin small letter turned r - 0279)
+	# <super> 0279
+02B5	MODIFIER LETTER SMALL TURNED R WITH HOOK
+	x (latin small letter turned r with hook - 027B)
+	# <super> 027B
+02B6	MODIFIER LETTER SMALL CAPITAL INVERTED R
+	* preceding four used for r-coloring or r-offglides
+	x (latin letter small capital inverted r - 0281)
+	# <super> 0281
+02B7	MODIFIER LETTER SMALL W
+	* labialization
+	x (combining inverted double arch below - 032B)
+	# <super> 0077
+02B8	MODIFIER LETTER SMALL Y
+	* palatalization
+	* common Americanist usage for 02B2
+	# <super> 0079
+@		Miscellaneous phonetic modifiers
+02B9	MODIFIER LETTER PRIME
+	* primary stress, emphasis
+	* transliteration of mjagkij znak (Cyrillic soft sign: palatalization)
+	x (apostrophe - 0027)
+	x (acute accent - 00B4)
+	x (modifier letter acute accent - 02CA)
+	x (combining acute accent - 0301)
+	x (greek numeral sign - 0374)
+	x (prime - 2032)
+02BA	MODIFIER LETTER DOUBLE PRIME
+	* exaggerated stress, contrastive stress
+	* transliteration of tverdyj znak (Cyrillic hard sign: no palatalization)
+	x (quotation mark - 0022)
+	x (combining double acute accent - 030B)
+	x (double prime - 2033)
+02BB	MODIFIER LETTER TURNED COMMA
+	* typographical alternate for 02BD or 02BF
+	x (combining turned comma above - 0312)
+	x (left single quotation mark - 2018)
+02BC	MODIFIER LETTER APOSTROPHE
+	= apostrophe
+	* glottal stop, glottalization, ejective
+	* spacing clone of Greek smooth breathing mark
+	* many languages use this as a letter of their alphabets
+	* 2019 is the preferred character for a punctuation apostrophe
+	x (apostrophe - 0027)
+	x (combining comma above - 0313)
+	x (combining comma above right - 0315)
+	x (armenian apostrophe - 055A)
+	x (right single quotation mark - 2019)
+02BD	MODIFIER LETTER REVERSED COMMA
+	* weak aspiration
+	* spacing clone of Greek rough breathing mark
+	x (combining reversed comma above - 0314)
+	x (armenian modifier letter left half ring - 0559)
+	x (single high-reversed-9 quotation mark - 201B)
+02BE	MODIFIER LETTER RIGHT HALF RING
+	* transliteration of Arabic hamza (glottal stop)
+	x (armenian apostrophe - 055A)
+	x (arabic letter hamza - 0621)
+02BF	MODIFIER LETTER LEFT HALF RING
+	* transliteration of Arabic ain (voiced pharyngeal fricative)
+	x (armenian modifier letter left half ring - 0559)
+	x (arabic letter ain - 0639)
+02C0	MODIFIER LETTER GLOTTAL STOP
+	* ejective or glottalized
+	* typographical alternate for 02BC or 02BE
+	x (latin letter glottal stop - 0294)
+	x (combining hook above - 0309)
+02C1	MODIFIER LETTER REVERSED GLOTTAL STOP
+	* typographical alternate for 02BF
+	x (latin letter pharyngeal voiced fricative - 0295)
+02C2	MODIFIER LETTER LEFT ARROWHEAD
+	* fronted articulation
+02C3	MODIFIER LETTER RIGHT ARROWHEAD
+	* backed articulation
+02C4	MODIFIER LETTER UP ARROWHEAD
+	* raised articulation
+	x (circumflex accent - 005E)
+	x (up arrowhead - 2303)
+02C5	MODIFIER LETTER DOWN ARROWHEAD
+	* lowered articulation
+02C6	MODIFIER LETTER CIRCUMFLEX ACCENT
+	* rising-falling tone, falling tone, secondary stress, etc.
+	x (circumflex accent - 005E)
+	x (combining circumflex accent - 0302)
+02C7	CARON (Mandarin Chinese third tone)
+	= hacek
+	* falling-rising tone
+	* Mandarin Chinese third tone
+	x (combining caron - 030C)
+02C8	MODIFIER LETTER VERTICAL LINE
+	* primary stress, downstep
+	* precedes letter or syllable modified
+	x (apostrophe - 0027)
+	x (combining vertical line above - 030D)
+02C9	MODIFIER LETTER MACRON (Mandarin Chinese first tone)
+	* high level tone
+	* precedes or follows letter or syllable modified
+	* Mandarin Chinese first tone
+	x (macron - 00AF)
+	x (combining macron - 0304)
+02CA	MODIFIER LETTER ACUTE ACCENT (Mandarin Chinese second tone)
+	* high-rising tone (IPA), high tone, primary stress
+	* Mandarin Chinese second tone
+	x (acute accent - 00B4)
+	x (modifier letter prime - 02B9)
+	x (combining acute accent - 0301)
+	x (greek numeral sign - 0374)
+	x (armenian emphasis mark - 055B)
+02CB	MODIFIER LETTER GRAVE ACCENT (Mandarin Chinese fourth tone)
+	* high-falling tone (IPA), low tone, secondary or tertiary stress
+	* Mandarin Chinese fourth tone
+	x (grave accent - 0060)
+	x (combining grave accent - 0300)
+	x (armenian comma - 055D)
+02CC	MODIFIER LETTER LOW VERTICAL LINE
+	* secondary stress
+	* precedes letter or syllable modified
+	x (combining vertical line below - 0329)
+02CD	MODIFIER LETTER LOW MACRON
+	* low level tone
+	x (low line - 005F)
+	x (combining macron below - 0331)
+02CE	MODIFIER LETTER LOW GRAVE ACCENT
+	* low-falling tone
+02CF	MODIFIER LETTER LOW ACUTE ACCENT
+	* low-rising tone
+	x (greek lower numeral sign - 0375)
+02D0	MODIFIER LETTER TRIANGULAR COLON
+	* length mark
+	x (colon - 003A)
+02D1	MODIFIER LETTER HALF TRIANGULAR COLON
+	* half-length mark
+	x (middle dot - 00B7)
+02D2	MODIFIER LETTER CENTRED RIGHT HALF RING
+	* more rounded articulation
+02D3	MODIFIER LETTER CENTRED LEFT HALF RING
+	* less rounded articulation
+02D4	MODIFIER LETTER UP TACK
+	* vowel raising or closing
+	x (combining up tack below - 031D)
+	x (combining dot below - 0323)
+02D5	MODIFIER LETTER DOWN TACK
+	* vowel lowering or opening
+	x (combining left half ring below - 031C)
+	x (combining down tack below - 031E)
+02D6	MODIFIER LETTER PLUS SIGN
+	* advanced or fronted articulation
+	x (combining plus sign below - 031F)
+02D7	MODIFIER LETTER MINUS SIGN
+	* retracted or backed articulation
+	* glyph may have small end-serifs
+	x (combining minus sign below - 0320)
+	x (minus sign - 2212)
+@		Spacing clones of diacritics
+02D8	BREVE
+	x (combining breve - 0306)
+	# 0020 0306
+02D9	DOT ABOVE (Mandarin Chinese light tone)
+	* Mandarin Chinese fifth tone (light or neutral)
+	x (combining dot above - 0307)
+	# 0020 0307
+02DA	RING ABOVE
+	x (degree sign - 00B0)
+	x (combining ring above - 030A)
+	# 0020 030A
+02DB	OGONEK
+	x (combining ogonek - 0328)
+	# 0020 0328
+02DC	SMALL TILDE
+	x (tilde - 007E)
+	x (combining tilde - 0303)
+	x (tilde operator - 223C)
+	# 0020 0303
+02DD	DOUBLE ACUTE ACCENT
+	x (combining double acute accent - 030B)
+	# 0020 030B
+@		Additions based on 1989 IPA
+02DE	MODIFIER LETTER RHOTIC HOOK
+	* rhotacization in vowel
+	* often ligated: 025A = 0259 + 02DE; 025D = 025C + 02DE
+02DF	MODIFIER LETTER CROSS ACCENT
+	* Swedish grave accent
+02E0	MODIFIER LETTER SMALL GAMMA
+	* these modifier letters are occasionally used in transcription of affricates
+	# <super> 0263
+02E1	MODIFIER LETTER SMALL L
+	# <super> 006C
+02E2	MODIFIER LETTER SMALL S
+	# <super> 0073
+02E3	MODIFIER LETTER SMALL X
+	# <super> 0078
+02E4	MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+	# <super> 0295
+@		Tone letters
+02E5	MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6	MODIFIER LETTER HIGH TONE BAR
+02E7	MODIFIER LETTER MID TONE BAR
+02E8	MODIFIER LETTER LOW TONE BAR
+02E9	MODIFIER LETTER EXTRA-LOW TONE BAR
+@		Extended Bopomofo tone marks
+02EA	MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB	MODIFIER LETTER YANG DEPARTING TONE MARK
+@		IPA modifiers
+02EC	MODIFIER LETTER VOICING
+02ED	MODIFIER LETTER UNASPIRATED
+@		Other modifier letter
+02EE	MODIFIER LETTER DOUBLE APOSTROPHE
+	* Nenets
+@		UPA modifiers
+02EF	MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0	MODIFIER LETTER LOW UP ARROWHEAD
+02F1	MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2	MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3	MODIFIER LETTER LOW RING
+02F4	MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5	MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6	MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7	MODIFIER LETTER LOW TILDE
+02F8	MODIFIER LETTER RAISED COLON
+02F9	MODIFIER LETTER BEGIN HIGH TONE
+02FA	MODIFIER LETTER END HIGH TONE
+02FB	MODIFIER LETTER BEGIN LOW TONE
+02FC	MODIFIER LETTER END LOW TONE
+02FD	MODIFIER LETTER SHELF
+02FE	MODIFIER LETTER OPEN SHELF
+02FF	MODIFIER LETTER LOW LEFT ARROW
+@@	0300	Combining Diacritical Marks	036F
+@		Ordinary diacritics
+0300	COMBINING GRAVE ACCENT (Varia)
+	= Greek varia
+	x (grave accent - 0060)
+	x (modifier letter grave accent - 02CB)
+0301	COMBINING ACUTE ACCENT (Oxia, Tonos)
+	= stress mark
+	= Greek oxia, tonos
+	x (apostrophe - 0027)
+	x (acute accent - 00B4)
+	x (modifier letter prime - 02B9)
+	x (modifier letter acute accent - 02CA)
+	x (greek tonos - 0384)
+0302	COMBINING CIRCUMFLEX ACCENT
+	= hat
+	x (circumflex accent - 005E)
+	x (modifier letter circumflex accent - 02C6)
+0303	COMBINING TILDE
+	* IPA: nasalization
+	* Vietnamese tone mark
+	x (tilde - 007E)
+	x (small tilde - 02DC)
+0304	COMBINING MACRON
+	= long
+	* distinguish from the following
+	x (macron - 00AF)
+	x (modifier letter macron - 02C9)
+0305	COMBINING OVERLINE
+	= overscore, vinculum
+	* connects on left and right
+	x (macron - 00AF)
+0306	COMBINING BREVE (Vrachy)
+	= short
+	= Greek vrachy
+	x (breve - 02D8)
+0307	COMBINING DOT ABOVE
+	= derivative (Newtonian notation)
+@+		* IPA (withdrawn in 1976): palatalization
+	x (dot above - 02D9)
+0308	COMBINING DIAERESIS (Dialytika)
+	= double dot above, umlaut
+	= Greek dialytika
+	= double derivative
+	x (diaeresis - 00A8)
+0309	COMBINING HOOK ABOVE
+	= hoi
+	* kerns left or right of circumflex over vowels
+	* Vietnamese tone mark
+	x (modifier letter glottal stop - 02C0)
+030A	COMBINING RING ABOVE
+	x (degree sign - 00B0)
+	x (ring above - 02DA)
+030B	COMBINING DOUBLE ACUTE ACCENT
+	* Hungarian, Chuvash
+	x (quotation mark - 0022)
+	x (modifier letter double prime - 02BA)
+	x (double acute accent - 02DD)
+030C	COMBINING CARON
+	= hacek, V above
+	x (caron - 02C7)
+030D	COMBINING VERTICAL LINE ABOVE
+	* this is not the Greek tonos
+	* Marshallese
+	x (modifier letter vertical line - 02C8)
+030E	COMBINING DOUBLE VERTICAL LINE ABOVE
+	* Marshallese
+	x (quotation mark - 0022)
+030F	COMBINING DOUBLE GRAVE ACCENT
+	* Serbian and Croatian poetics
+0310	COMBINING CANDRABINDU
+	x (devanagari sign candrabindu - 0901)
+0311	COMBINING INVERTED BREVE
+0312	COMBINING TURNED COMMA ABOVE
+	= cedilla above
+	* Latvian (but not used in decomposition)
+	x (modifier letter turned comma - 02BB)
+0313	COMBINING COMMA ABOVE (Psili)
+	= Greek psili, smooth breathing mark
+	* Americanist: ejective or glottalization
+	x (modifier letter apostrophe - 02BC)
+	x (combining cyrillic psili pneumata - 0486)
+	x (armenian apostrophe - 055A)
+0314	COMBINING REVERSED COMMA ABOVE (Dasia)
+	= Greek dasia, rough breathing mark
+	x (modifier letter reversed comma - 02BD)
+	x (combining cyrillic dasia pneumata - 0485)
+	x (armenian modifier letter left half ring - 0559)
+0315	COMBINING COMMA ABOVE RIGHT
+	x (modifier letter apostrophe - 02BC)
+0316	COMBINING GRAVE ACCENT BELOW
+0317	COMBINING ACUTE ACCENT BELOW
+0318	COMBINING LEFT TACK BELOW
+0319	COMBINING RIGHT TACK BELOW
+031A	COMBINING LEFT ANGLE ABOVE
+	* IPA: unreleased stop
+031B	COMBINING HORN
+	* Vietnamese
+031C	COMBINING LEFT HALF RING BELOW
+	* IPA: open variety of vowel
+	x (modifier letter down tack - 02D5)
+031D	COMBINING UP TACK BELOW
+	* IPA: vowel raising or closing
+	x (modifier letter up tack - 02D4)
+031E	COMBINING DOWN TACK BELOW
+	* IPA: vowel lowering or opening
+	x (modifier letter down tack - 02D5)
+031F	COMBINING PLUS SIGN BELOW
+	* IPA: advanced or fronted articulation
+	x (modifier letter plus sign - 02D6)
+0320	COMBINING MINUS SIGN BELOW
+	* IPA: retracted or backed articulation
+	* glyph may have small end-serifs
+	x (modifier letter minus sign - 02D7)
+0321	COMBINING PALATALIZED HOOK BELOW
+	* IPA: palatalization
+	x (modifier letter small j - 02B2)
+0322	COMBINING RETROFLEX HOOK BELOW
+	* IPA: retroflexion
+0323	COMBINING DOT BELOW
+	= nang
+	* IPA: closer variety of vowel
+	* Americanist and Indo-Europeanist: retraction or retroflexion
+	* Semiticist: velarization or pharyngealization
+	* Vietnamese tone mark
+	x (modifier letter up tack - 02D4)
+0324	COMBINING DIAERESIS BELOW
+	* IPA: breathy-voice or murmur
+	x (modifier letter small h with hook - 02B1)
+0325	COMBINING RING BELOW
+	* IPA: voiceless
+	* Madurese
+0326	COMBINING COMMA BELOW
+	* Romanian, Latvian, Livonian
+0327	COMBINING CEDILLA
+	* French, Turkish, Azerbaijani
+	x (cedilla - 00B8)
+0328	COMBINING OGONEK
+	= nasal hook
+	* Americanist: nasalization
+	* Polish, Lithuanian
+	x (ogonek - 02DB)
+0329	COMBINING VERTICAL LINE BELOW
+	* IPA: syllabic
+	* Yoruba
+	x (modifier letter low vertical line - 02CC)
+032A	COMBINING BRIDGE BELOW
+	* IPA: dental
+032B	COMBINING INVERTED DOUBLE ARCH BELOW
+	* IPA: labialization
+	x (modifier letter small w - 02B7)
+032C	COMBINING CARON BELOW
+	* IPA: voiced
+032D	COMBINING CIRCUMFLEX ACCENT BELOW
+	* Americanist: fronted articulation
+032E	COMBINING BREVE BELOW
+	* Hittite transcription
+032F	COMBINING INVERTED BREVE BELOW
+	* Americanist: fronted articulation (variant of 032D)
+	* Indo-Europeanist: semivowel
+0330	COMBINING TILDE BELOW
+	* IPA: creaky voice
+0331	COMBINING MACRON BELOW
+	x (low line - 005F)
+	x (modifier letter low macron - 02CD)
+0332	COMBINING LOW LINE
+	= underline, underscore
+	* connects on left and right
+	x (low line - 005F)
+0333	COMBINING DOUBLE LOW LINE
+	= double underline, double underscore
+	* connects on left and right
+	x (combining equals sign below - 0347)
+	x (double low line - 2017)
+@		Overstruck diacritics
+0334	COMBINING TILDE OVERLAY
+	* IPA: velarization or pharyngealization
+0335	COMBINING SHORT STROKE OVERLAY
+0336	COMBINING LONG STROKE OVERLAY
+0337	COMBINING SHORT SOLIDUS OVERLAY
+	= short slash overlay
+0338	COMBINING LONG SOLIDUS OVERLAY
+	= long slash overlay
+@		Additions
+0339	COMBINING RIGHT HALF RING BELOW
+033A	COMBINING INVERTED BRIDGE BELOW
+033B	COMBINING SQUARE BELOW
+033C	COMBINING SEAGULL BELOW
+033D	COMBINING X ABOVE
+033E	COMBINING VERTICAL TILDE
+	* Cyrillic palatalization
+	x (combining cyrillic palatalization - 0484)
+033F	COMBINING DOUBLE OVERLINE
+@		Vietnamese tone marks (deprecated)
+0340	COMBINING GRAVE TONE MARK (Vietnamese)
+	* kerns left or right of circumflex over vowels
+	: 0300 combining grave accent
+0341	COMBINING ACUTE TONE MARK (Vietnamese)
+	* kerns right of circumflex over vowels
+	: 0301 combining acute accent
+@		Additions for Greek
+0342	COMBINING GREEK PERISPOMENI
+0343	COMBINING GREEK KORONIS
+	: 0313 combining comma above
+0344	COMBINING GREEK DIALYTIKA TONOS
+	* use of this character is discouraged
+	: 0308 0301
+0345	COMBINING GREEK YPOGEGRAMMENI
+	= GREEK NON-SPACING IOTA BELOW
+	= iota subscript
+	* note special casing issues
+	x (greek ypogegrammeni - 037A)
+	x (greek capital letter iota - 0399)
+@		Additions for IPA
+0346	COMBINING BRIDGE ABOVE
+	* IPA: dentolabial
+	x (combining wide bridge above - 20E9)
+0347	COMBINING EQUALS SIGN BELOW
+	* IPA: alveolar
+0348	COMBINING DOUBLE VERTICAL LINE BELOW
+	* IPA: strong articulation
+0349	COMBINING LEFT ANGLE BELOW
+	* IPA: weak articulation
+034A	COMBINING NOT TILDE ABOVE
+	* IPA: denasal
+@		IPA diacritics for disordered speech
+034B	COMBINING HOMOTHETIC ABOVE
+	* IPA: nasal escape
+034C	COMBINING ALMOST EQUAL TO ABOVE
+	* IPA: velopharyngeal friction
+034D	COMBINING LEFT RIGHT ARROW BELOW
+	* IPA: labial spreading
+034E	COMBINING UPWARDS ARROW BELOW
+	* IPA: whistled articulation
+@		Grapheme joiner
+034F	COMBINING GRAPHEME JOINER
+	= CGJ
+	* has no visible glyph
+	* indicates that adjoining characters are to be treated as a graphemic unit
+@		Additions for the Uralic Phonetic Alphabet
+0350	COMBINING RIGHT ARROWHEAD ABOVE
+0351	COMBINING LEFT HALF RING ABOVE
+0352	COMBINING FERMATA
+0353	COMBINING X BELOW
+0354	COMBINING LEFT ARROWHEAD BELOW
+0355	COMBINING RIGHT ARROWHEAD BELOW
+0356	COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357	COMBINING RIGHT HALF RING ABOVE
+@		Miscellaneous additions
+0358	COMBINING DOT ABOVE RIGHT
+	* Latin transliterations of the Southern Min dialects of Chinese
+0359	COMBINING ASTERISK BELOW
+035A	COMBINING DOUBLE RING BELOW
+	* Kharoshthi transliteration
+035B	COMBINING ZIGZAG ABOVE
+	* Latin abbreviation, Lithuanian phonetics and mediaevalist transcriptions
+@		Double diacritics
+035C	COMBINING DOUBLE BREVE BELOW
+	= ligature tie below, papyrological hyphen
+	* a common glyph alternate connects the horizontal midpoints of the characters
+	x (combining double breve - 035D)
+	x (combining double inverted breve - 0361)
+035D	COMBINING DOUBLE BREVE
+035E	COMBINING DOUBLE MACRON
+035F	COMBINING DOUBLE MACRON BELOW
+0360	COMBINING DOUBLE TILDE
+0361	COMBINING DOUBLE INVERTED BREVE
+	= ligature tie
+0362	COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+	* IPA: sliding articulation
+@		Medieval superscript letter diacritics
+@+		These are letter diacritics written directly above other letters. They appear primarily in medieval Germanic manuscripts, but saw some usage as late as the 19th century in some languages.
+0363	COMBINING LATIN SMALL LETTER A
+0364	COMBINING LATIN SMALL LETTER E
+0365	COMBINING LATIN SMALL LETTER I
+0366	COMBINING LATIN SMALL LETTER O
+0367	COMBINING LATIN SMALL LETTER U
+0368	COMBINING LATIN SMALL LETTER C
+0369	COMBINING LATIN SMALL LETTER D
+036A	COMBINING LATIN SMALL LETTER H
+036B	COMBINING LATIN SMALL LETTER M
+036C	COMBINING LATIN SMALL LETTER R
+036D	COMBINING LATIN SMALL LETTER T
+036E	COMBINING LATIN SMALL LETTER V
+036F	COMBINING LATIN SMALL LETTER X
+@@	0370	Greek and Coptic	03FF
+@		Based on ISO 8859-7
+0374	GREEK NUMERAL SIGN (Dexia keraia)
+	= dexia keraia
+	* indicates numeric use of letters
+	x (modifier letter acute accent - 02CA)
+	: 02B9 modifier letter prime
+0375	GREEK LOWER NUMERAL SIGN (Aristeri keraia)
+	= aristeri keraia
+	* indicates numeric use of letters
+	x (modifier letter low acute accent - 02CF)
+037A	GREEK YPOGEGRAMMENI
+	= iota subscript
+	x (combining greek ypogegrammeni - 0345)
+	# 0020 0345
+037E	GREEK QUESTION MARK (Erotimatiko)
+	= erotimatiko
+	* sentence-final punctuation
+	* 003B is the preferred character
+	x (question mark - 003F)
+	: 003B semicolon
+0384	GREEK TONOS
+	x (acute accent - 00B4)
+	x (combining vertical line above - 030D)
+	# 0020 0301
+0385	GREEK DIALYTIKA TONOS
+	: 00A8 0301
+0386	GREEK CAPITAL LETTER ALPHA WITH TONOS
+	: 0391 0301
+0387	GREEK ANO TELEIA
+	* functions in Greek like a semicolon
+	* 00B7 is the preferred character
+	: 00B7 middle dot
+0388	GREEK CAPITAL LETTER EPSILON WITH TONOS
+	: 0395 0301
+0389	GREEK CAPITAL LETTER ETA WITH TONOS
+	: 0397 0301
+038A	GREEK CAPITAL LETTER IOTA WITH TONOS
+	: 0399 0301
+038C	GREEK CAPITAL LETTER OMICRON WITH TONOS
+	: 039F 0301
+038E	GREEK CAPITAL LETTER UPSILON WITH TONOS
+	: 03A5 0301
+038F	GREEK CAPITAL LETTER OMEGA WITH TONOS
+	: 03A9 0301
+0390	GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+	: 03CA 0301
+0391	GREEK CAPITAL LETTER ALPHA
+0392	GREEK CAPITAL LETTER BETA
+0393	GREEK CAPITAL LETTER GAMMA
+	= gamma function
+0394	GREEK CAPITAL LETTER DELTA
+	x (increment - 2206)
+0395	GREEK CAPITAL LETTER EPSILON
+0396	GREEK CAPITAL LETTER ZETA
+0397	GREEK CAPITAL LETTER ETA
+0398	GREEK CAPITAL LETTER THETA
+0399	GREEK CAPITAL LETTER IOTA
+	= iota adscript
+039A	GREEK CAPITAL LETTER KAPPA
+039B	GREEK CAPITAL LETTER LAMDA
+039C	GREEK CAPITAL LETTER MU
+039D	GREEK CAPITAL LETTER NU
+039E	GREEK CAPITAL LETTER XI
+039F	GREEK CAPITAL LETTER OMICRON
+03A0	GREEK CAPITAL LETTER PI
+	x (n-ary product - 220F)
+03A1	GREEK CAPITAL LETTER RHO
+03A3	GREEK CAPITAL LETTER SIGMA
+	x (latin capital letter esh - 01A9)
+	x (n-ary summation - 2211)
+03A4	GREEK CAPITAL LETTER TAU
+03A5	GREEK CAPITAL LETTER UPSILON
+03A6	GREEK CAPITAL LETTER PHI
+03A7	GREEK CAPITAL LETTER CHI
+03A8	GREEK CAPITAL LETTER PSI
+03A9	GREEK CAPITAL LETTER OMEGA
+	x (ohm sign - 2126)
+	x (inverted ohm sign - 2127)
+03AA	GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+	: 0399 0308
+03AB	GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+	: 03A5 0308
+03AC	GREEK SMALL LETTER ALPHA WITH TONOS
+	: 03B1 0301
+03AD	GREEK SMALL LETTER EPSILON WITH TONOS
+	: 03B5 0301
+03AE	GREEK SMALL LETTER ETA WITH TONOS
+	: 03B7 0301
+03AF	GREEK SMALL LETTER IOTA WITH TONOS
+	: 03B9 0301
+03B0	GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+	: 03CB 0301
+03B1	GREEK SMALL LETTER ALPHA
+	x (latin small letter alpha - 0251)
+	x (proportional to - 221D)
+03B2	GREEK SMALL LETTER BETA
+	x (latin small letter sharp s - 00DF)
+	x (latin small letter b with stroke - 0180)
+03B3	GREEK SMALL LETTER GAMMA
+	x (latin small letter gamma - 0263)
+03B4	GREEK SMALL LETTER DELTA
+03B5	GREEK SMALL LETTER EPSILON
+	x (latin small letter open e - 025B)
+03B6	GREEK SMALL LETTER ZETA
+03B7	GREEK SMALL LETTER ETA
+03B8	GREEK SMALL LETTER THETA
+	x (latin small letter barred o - 0275)
+	x (cyrillic small letter fita - 0473)
+03B9	GREEK SMALL LETTER IOTA
+	x (latin small letter iota - 0269)
+	x (turned greek small letter iota - 2129)
+03BA	GREEK SMALL LETTER KAPPA
+03BB	GREEK SMALL LETTER LAMDA
+	= lambda
+03BC	GREEK SMALL LETTER MU
+	x (micro sign - 00B5)
+03BD	GREEK SMALL LETTER NU
+03BE	GREEK SMALL LETTER XI
+03BF	GREEK SMALL LETTER OMICRON
+03C0	GREEK SMALL LETTER PI
+	* math constant 3.141592...
+03C1	GREEK SMALL LETTER RHO
+03C2	GREEK SMALL LETTER FINAL SIGMA
+	= stigma (the Modern Greek name for this letterform)
+	* not to be confused with the actual stigma letter
+	x (greek small letter stigma - 03DB)
+03C3	GREEK SMALL LETTER SIGMA
+	* used symbolically with a numeric value 200
+03C4	GREEK SMALL LETTER TAU
+03C5	GREEK SMALL LETTER UPSILON
+	x (latin small letter upsilon - 028A)
+	x (latin small letter v with hook - 028B)
+03C6	GREEK SMALL LETTER PHI
+	x (latin small letter phi - 0278)
+	x (greek phi symbol - 03D5)
+	* the ordinary Greek letter, showing considerable glyph variation
+	* in mathematical contexts, the loopy glyph is preferred, to contrast with 03D5
+03C7	GREEK SMALL LETTER CHI
+03C8	GREEK SMALL LETTER PSI
+03C9	GREEK SMALL LETTER OMEGA
+03CA	GREEK SMALL LETTER IOTA WITH DIALYTIKA
+	: 03B9 0308
+03CB	GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+	: 03C5 0308
+03CC	GREEK SMALL LETTER OMICRON WITH TONOS
+	: 03BF 0301
+03CD	GREEK SMALL LETTER UPSILON WITH TONOS
+	: 03C5 0301
+03CE	GREEK SMALL LETTER OMEGA WITH TONOS
+	: 03C9 0301
+@		Variant letterforms
+03D0	GREEK BETA SYMBOL
+	= GREEK SMALL LETTER CURLED BETA
+	# 03B2 greek small letter beta
+03D1	GREEK THETA SYMBOL
+	= GREEK SMALL LETTER SCRIPT THETA
+	* used as a technical symbol
+	# 03B8 greek small letter theta
+03D2	GREEK UPSILON WITH HOOK SYMBOL
+	= GREEK CAPITAL LETTER UPSILON HOOK
+	# 03A5 greek capital letter upsilon
+03D3	GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+	= GREEK CAPITAL LETTER UPSILON HOOK TONOS
+	: 03D2 0301
+03D4	GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+	= GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS
+	: 03D2 0308
+03D5	GREEK PHI SYMBOL
+	* used as a technical symbol, with a stroked glyph
+	* maps to "phi1" symbol entities
+	# 03C6 greek small letter phi
+03D6	GREEK PI SYMBOL
+	= GREEK SMALL LETTER OMEGA PI
+	* used as a technical symbol
+	* a variant of pi, looking like omega
+	# 03C0 greek small letter pi
+03D7	GREEK KAI SYMBOL
+	* used as an ampersand
+	x (coptic symbol kai - 2CE4)
+@		Archaic letters
+03D8	GREEK LETTER ARCHAIC KOPPA *
+03D9	GREEK SMALL LETTER ARCHAIC KOPPA *
+	* the Q-shaped archaic koppas are the ordinary alphabetic letters and can also be used as symbols with a numeric value of 90 in classical and pre-classical texts
+03DA	GREEK LETTER STIGMA
+	* apparently in origin a cursive form of digamma
+	* the name "stigma" originally applied to a medieval sigma-tau ligature, whose shape was confusably similar to the cursive digamma
+	* used as a symbol with a numeric value of 6
+03DB	GREEK SMALL LETTER STIGMA
+	x (greek small letter final sigma - 03C2)
+03DC	GREEK LETTER DIGAMMA
+03DD	GREEK SMALL LETTER DIGAMMA
+	* used as a symbol with a numeric value of 6
+03DE	GREEK LETTER KOPPA
+03DF	GREEK SMALL LETTER KOPPA
+	* used in modern Greek as a symbol with a numeric value of 90, as in the dating of legal documentation
+03E0	GREEK LETTER SAMPI
+03E1	GREEK SMALL LETTER SAMPI
+	* used as a symbol with a numeric value of 900
+@		Coptic letters derived from Demotic
+@+		For other Coptic letters see the Coptic Block.
+03E2	COPTIC CAPITAL LETTER SHEI
+03E3	COPTIC SMALL LETTER SHEI
+03E4	COPTIC CAPITAL LETTER FEI
+03E5	COPTIC SMALL LETTER FEI
+03E6	COPTIC CAPITAL LETTER KHEI
+03E7	COPTIC SMALL LETTER KHEI
+03E8	COPTIC CAPITAL LETTER HORI
+03E9	COPTIC SMALL LETTER HORI
+03EA	COPTIC CAPITAL LETTER GANGIA
+03EB	COPTIC SMALL LETTER GANGIA
+03EC	COPTIC CAPITAL LETTER SHIMA
+03ED	COPTIC SMALL LETTER SHIMA
+03EE	COPTIC CAPITAL LETTER DEI
+03EF	COPTIC SMALL LETTER DEI
+@		Variant letterforms
+03F0	GREEK KAPPA SYMBOL
+	= GREEK SMALL LETTER SCRIPT KAPPA
+	* used as technical symbol
+	# 03BA greek small letter kappa
+03F1	GREEK RHO SYMBOL
+	= GREEK SMALL LETTER TAILED RHO
+	* used as technical symbol
+	# 03C1 greek small letter rho
+03F2	GREEK LUNATE SIGMA SYMBOL
+	= GREEK SMALL LETTER LUNATE SIGMA
+	# 03C2 greek small letter final sigma
+@		Additional letter
+03F3	GREEK LETTER YOT
+@		Variant letterforms and symbols
+03F4	GREEK CAPITAL THETA SYMBOL
+	x (cyrillic capital letter fita - 0472)
+	# 0398 greek capital letter theta
+03F5	GREEK LUNATE EPSILON SYMBOL
+	= straight epsilon
+	x (small element of - 220A)
+	# 03B5 greek small letter epsilon
+03F6	GREEK REVERSED LUNATE EPSILON SYMBOL
+	= reversed straight epsilon
+	x (small contains as member - 220D)
+@		Additional archaic letters for Bactrian
+03F7	GREEK CAPITAL LETTER SHO
+03F8	GREEK SMALL LETTER SHO
+@		Variant letterform
+03F9	GREEK CAPITAL LUNATE SIGMA SYMBOL
+	# 03A3 greek capital letter sigma
+@		Archaic letters
+03FA	GREEK CAPITAL LETTER SAN
+03FB	GREEK SMALL LETTER SAN
+@		Symbol
+03FC	GREEK RHO WITH STROKE SYMBOL
+	* used with abbreviations containing 03C1
+@		Editorial symbols
+03FD	GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+	= antisigma
+03FE	GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+	= sigma periestigmenon
+03FF	GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+	= antisigma periestigmenon
+@@	0400	Cyrillic	04FF
+@		Cyrillic extensions
+0400	CYRILLIC CAPITAL LETTER IE WITH GRAVE
+	: 0415 0300
+0401	CYRILLIC CAPITAL LETTER IO
+	: 0415 0308
+0402	CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
+0403	CYRILLIC CAPITAL LETTER GJE
+	: 0413 0301
+0404	CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405	CYRILLIC CAPITAL LETTER DZE
+0406	CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+	x (latin capital letter i - 0049)
+	x (cyrillic small letter byelorussian-ukrainian i - 0456)
+	x (cyrillic letter palochka - 04C0)
+0407	CYRILLIC CAPITAL LETTER YI (Ukrainian)
+	: 0406 0308
+0408	CYRILLIC CAPITAL LETTER JE
+0409	CYRILLIC CAPITAL LETTER LJE
+040A	CYRILLIC CAPITAL LETTER NJE
+040B	CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
+040C	CYRILLIC CAPITAL LETTER KJE
+	: 041A 0301
+040D	CYRILLIC CAPITAL LETTER I WITH GRAVE
+	: 0418 0300
+040E	CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
+	: 0423 0306
+040F	CYRILLIC CAPITAL LETTER DZHE
+@		Basic Russian alphabet
+0410	CYRILLIC CAPITAL LETTER A
+0411	CYRILLIC CAPITAL LETTER BE
+	x (latin small letter b with topbar - 0183)
+0412	CYRILLIC CAPITAL LETTER VE
+0413	CYRILLIC CAPITAL LETTER GHE
+0414	CYRILLIC CAPITAL LETTER DE
+0415	CYRILLIC CAPITAL LETTER IE
+0416	CYRILLIC CAPITAL LETTER ZHE
+0417	CYRILLIC CAPITAL LETTER ZE
+0418	CYRILLIC CAPITAL LETTER I
+0419	CYRILLIC CAPITAL LETTER SHORT I
+	: 0418 0306
+041A	CYRILLIC CAPITAL LETTER KA
+041B	CYRILLIC CAPITAL LETTER EL
+041C	CYRILLIC CAPITAL LETTER EM
+041D	CYRILLIC CAPITAL LETTER EN
+041E	CYRILLIC CAPITAL LETTER O
+041F	CYRILLIC CAPITAL LETTER PE
+0420	CYRILLIC CAPITAL LETTER ER
+0421	CYRILLIC CAPITAL LETTER ES
+0422	CYRILLIC CAPITAL LETTER TE
+0423	CYRILLIC CAPITAL LETTER U
+	x (cyrillic capital letter uk - 0478)
+	x (cyrillic small letter straight u - 04AF)
+0424	CYRILLIC CAPITAL LETTER EF
+0425	CYRILLIC CAPITAL LETTER HA
+0426	CYRILLIC CAPITAL LETTER TSE
+0427	CYRILLIC CAPITAL LETTER CHE
+0428	CYRILLIC CAPITAL LETTER SHA
+0429	CYRILLIC CAPITAL LETTER SHCHA
+042A	CYRILLIC CAPITAL LETTER HARD SIGN
+042B	CYRILLIC CAPITAL LETTER YERU
+042C	CYRILLIC CAPITAL LETTER SOFT SIGN
+042D	CYRILLIC CAPITAL LETTER E
+042E	CYRILLIC CAPITAL LETTER YU
+042F	CYRILLIC CAPITAL LETTER YA
+0430	CYRILLIC SMALL LETTER A
+0431	CYRILLIC SMALL LETTER BE
+0432	CYRILLIC SMALL LETTER VE
+0433	CYRILLIC SMALL LETTER GHE
+0434	CYRILLIC SMALL LETTER DE
+0435	CYRILLIC SMALL LETTER IE
+0436	CYRILLIC SMALL LETTER ZHE
+0437	CYRILLIC SMALL LETTER ZE
+0438	CYRILLIC SMALL LETTER I
+0439	CYRILLIC SMALL LETTER SHORT I
+	: 0438 0306
+043A	CYRILLIC SMALL LETTER KA
+043B	CYRILLIC SMALL LETTER EL
+043C	CYRILLIC SMALL LETTER EM
+043D	CYRILLIC SMALL LETTER EN
+043E	CYRILLIC SMALL LETTER O
+043F	CYRILLIC SMALL LETTER PE
+0440	CYRILLIC SMALL LETTER ER
+0441	CYRILLIC SMALL LETTER ES
+0442	CYRILLIC SMALL LETTER TE
+0443	CYRILLIC SMALL LETTER U
+0444	CYRILLIC SMALL LETTER EF
+0445	CYRILLIC SMALL LETTER HA
+0446	CYRILLIC SMALL LETTER TSE
+0447	CYRILLIC SMALL LETTER CHE
+0448	CYRILLIC SMALL LETTER SHA
+0449	CYRILLIC SMALL LETTER SHCHA
+044A	CYRILLIC SMALL LETTER HARD SIGN
+044B	CYRILLIC SMALL LETTER YERU
+044C	CYRILLIC SMALL LETTER SOFT SIGN
+	x (latin small letter tone six - 0185)
+044D	CYRILLIC SMALL LETTER E
+044E	CYRILLIC SMALL LETTER YU
+044F	CYRILLIC SMALL LETTER YA
+@		Cyrillic extensions
+0450	CYRILLIC SMALL LETTER IE WITH GRAVE
+	* Macedonian
+	: 0435 0300
+0451	CYRILLIC SMALL LETTER IO
+	* Russian, ...
+	: 0435 0308
+0452	CYRILLIC SMALL LETTER DJE (Serbocroatian)
+	* Serbian
+	x (latin small letter d with stroke - 0111)
+0453	CYRILLIC SMALL LETTER GJE
+	* Macedonian
+	: 0433 0301
+0454	CYRILLIC SMALL LETTER UKRAINIAN IE
+	= Old Cyrillic yest
+0455	CYRILLIC SMALL LETTER DZE
+	= Old Cyrillic zelo
+	* Macedonian
+0456	CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+	= Old Cyrillic i
+0457	CYRILLIC SMALL LETTER YI (Ukrainian)
+	* Ukrainian
+	: 0456 0308
+0458	CYRILLIC SMALL LETTER JE
+	* Serbian, Azerbaijani, Altay
+0459	CYRILLIC SMALL LETTER LJE
+	* Serbian, Macedonian
+	x (latin small letter lj - 01C9)
+045A	CYRILLIC SMALL LETTER NJE
+	* Serbian, Macedonian
+	x (latin small letter nj - 01CC)
+045B	CYRILLIC SMALL LETTER TSHE (Serbocroatian)
+	= Old Cyrillic derv
+	* Serbian
+	x (latin small letter c with acute - 0107)
+	x (latin small letter h with stroke - 0127)
+	x (cyrillic capital letter tshe - 040B)
+	x (planck constant over two pi - 210F)
+045C	CYRILLIC SMALL LETTER KJE
+	* Macedonian
+	: 043A 0301
+045D	CYRILLIC SMALL LETTER I WITH GRAVE
+	* Macedonian
+	: 0438 0300
+045E	CYRILLIC SMALL LETTER SHORT U (Byelorussian)
+	* Byelorussian, Uzbek
+	: 0443 0306
+045F	CYRILLIC SMALL LETTER DZHE
+	* Serbian, Macedonian, Abkhasian
+	x (latin small letter dz with caron - 01C6)
+@		Historic letters
+0460	CYRILLIC CAPITAL LETTER OMEGA
+0461	CYRILLIC SMALL LETTER OMEGA
+0462	CYRILLIC CAPITAL LETTER YAT
+0463	CYRILLIC SMALL LETTER YAT
+0464	CYRILLIC CAPITAL LETTER IOTIFIED E
+0465	CYRILLIC SMALL LETTER IOTIFIED E
+0466	CYRILLIC CAPITAL LETTER LITTLE YUS
+0467	CYRILLIC SMALL LETTER LITTLE YUS
+0468	CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469	CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A	CYRILLIC CAPITAL LETTER BIG YUS
+046B	CYRILLIC SMALL LETTER BIG YUS
+046C	CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D	CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E	CYRILLIC CAPITAL LETTER KSI
+046F	CYRILLIC SMALL LETTER KSI
+0470	CYRILLIC CAPITAL LETTER PSI
+0471	CYRILLIC SMALL LETTER PSI
+0472	CYRILLIC CAPITAL LETTER FITA
+0473	CYRILLIC SMALL LETTER FITA
+	x (latin small letter barred o - 0275)
+	x (greek small letter theta - 03B8)
+0474	CYRILLIC CAPITAL LETTER IZHITSA
+0475	CYRILLIC SMALL LETTER IZHITSA
+0476	CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+	: 0474 030F
+0477	CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+	: 0475 030F
+0478	CYRILLIC CAPITAL LETTER UK
+	* basic Old Cyrillic uk is unified with CYRILLIC LETTER U
+	x (cyrillic capital letter u - 0423)
+0479	CYRILLIC SMALL LETTER UK
+047A	CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B	CYRILLIC SMALL LETTER ROUND OMEGA
+047C	CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D	CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E	CYRILLIC CAPITAL LETTER OT
+047F	CYRILLIC SMALL LETTER OT
+0480	CYRILLIC CAPITAL LETTER KOPPA
+0481	CYRILLIC SMALL LETTER KOPPA
+@		Historic miscellaneous
+0482	CYRILLIC THOUSANDS SIGN
+0483	COMBINING CYRILLIC TITLO
+0484	COMBINING CYRILLIC PALATALIZATION
+	x (combining vertical tilde - 033E)
+0485	COMBINING CYRILLIC DASIA PNEUMATA
+	x (combining reversed comma above - 0314)
+0486	COMBINING CYRILLIC PSILI PNEUMATA
+	x (combining comma above - 0313)
+0488	COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489	COMBINING CYRILLIC MILLIONS SIGN
+@		Extended Cyrillic
+048A	CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+048B	CYRILLIC SMALL LETTER SHORT I WITH TAIL
+	* Kildin Sami
+048C	CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D	CYRILLIC SMALL LETTER SEMISOFT SIGN
+	* Kildin Sami
+048E	CYRILLIC CAPITAL LETTER ER WITH TICK
+048F	CYRILLIC SMALL LETTER ER WITH TICK
+	* Kildin Sami
+0490	CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491	CYRILLIC SMALL LETTER GHE WITH UPTURN
+	* Ukrainian
+0492	CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493	CYRILLIC SMALL LETTER GHE WITH STROKE
+	* Azerbaijani, Bashkir, ...
+	* full bar form preferred over half-barred "F"-type
+0494	CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495	CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+	* Abkhasian, Yakut
+0496	CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497	CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+	* Tatar, ...
+0498	CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499	CYRILLIC SMALL LETTER ZE WITH DESCENDER
+	* Bashkir
+	* reversed ogonek form of the descender is preferred
+049A	CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B	CYRILLIC SMALL LETTER KA WITH DESCENDER
+	* Abkhasian, Tajik, ...
+049C	CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D	CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+	* Azerbaijani
+049E	CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F	CYRILLIC SMALL LETTER KA WITH STROKE
+	* Abkhasian
+04A0	CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1	CYRILLIC SMALL LETTER BASHKIR KA
+04A2	CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3	CYRILLIC SMALL LETTER EN WITH DESCENDER
+	* Bashkir, ...
+04A4	CYRILLIC CAPITAL LIGATURE EN GHE
+04A5	CYRILLIC SMALL LIGATURE EN GHE
+	* Altay, Mari, Yakut
+	* this is not a decomposable ligature
+04A6	CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (Abkhasian)
+04A7	CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (Abkhasian)
+	* Abkhasian
+04A8	CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9	CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA	CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB	CYRILLIC SMALL LETTER ES WITH DESCENDER
+	* Bashkir, Chuvash
+	* reversed ogonek form of the descender is preferred
+04AC	CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD	CYRILLIC SMALL LETTER TE WITH DESCENDER
+	* Abkhasian
+04AE	CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF	CYRILLIC SMALL LETTER STRAIGHT U
+	* stem is straight, unlike LETTER U
+	* Azerbaijani, Bashkir, ...
+	x (cyrillic capital letter u - 0423)
+04B0	CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1	CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+	* Kazakh
+04B2	CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3	CYRILLIC SMALL LETTER HA WITH DESCENDER
+	* Abkhasian, Tajik, Uzbek
+04B4	CYRILLIC CAPITAL LIGATURE TE TSE (Abkhasian)
+04B5	CYRILLIC SMALL LIGATURE TE TSE (Abkhasian)
+	* Abkhasian
+	* this is not a decomposable ligature
+04B6	CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7	CYRILLIC SMALL LETTER CHE WITH DESCENDER
+	* Abkhasian, Tajik
+04B8	CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9	CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+	* Azerbaijani
+04BA	CYRILLIC CAPITAL LETTER SHHA
+04BB	CYRILLIC SMALL LETTER SHHA
+	* originally derived from Latin "h", but uppercase form 04BA is closer to an inverted che (0427)
+	* Azerbaijani, Bashkir, ...
+	x (latin small letter h - 0068)
+04BC	CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD	CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE	CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF	CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+	* ogonek form preferred
+04C0	CYRILLIC LETTER PALOCHKA
+	* aspiration sign in many Caucasian languages
+	* has no "lowercase form", i.e. is case-invariant
+	x (latin capital letter i - 0049)
+	x (cyrillic capital letter byelorussian-ukrainian i - 0406)
+04C1	CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+	: 0416 0306
+04C2	CYRILLIC SMALL LETTER ZHE WITH BREVE
+	* Moldavian
+	: 0436 0306
+04C3	CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4	CYRILLIC SMALL LETTER KA WITH HOOK
+	* Khanty, Chukchi
+04C5	CYRILLIC CAPITAL LETTER EL WITH TAIL
+04C6	CYRILLIC SMALL LETTER EL WITH TAIL
+	* Kildin Sami
+04C7	CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8	CYRILLIC SMALL LETTER EN WITH HOOK
+	* Khanty, Chukchi, Nenets
+04C9	CYRILLIC CAPITAL LETTER EN WITH TAIL
+04CA	CYRILLIC SMALL LETTER EN WITH TAIL
+	* Kildin Sami
+04CB	CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC	CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CD	CYRILLIC CAPITAL LETTER EM WITH TAIL
+04CE	CYRILLIC SMALL LETTER EM WITH TAIL
+	* Kildin Sami
+04D0	CYRILLIC CAPITAL LETTER A WITH BREVE
+	: 0410 0306
+04D1	CYRILLIC SMALL LETTER A WITH BREVE
+	: 0430 0306
+04D2	CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+	: 0410 0308
+04D3	CYRILLIC SMALL LETTER A WITH DIAERESIS
+	: 0430 0308
+04D4	CYRILLIC CAPITAL LIGATURE A IE
+04D5	CYRILLIC SMALL LIGATURE A IE
+	* this is not a decomposable ligature
+	x (latin small letter ae - 00E6)
+04D6	CYRILLIC CAPITAL LETTER IE WITH BREVE
+	: 0415 0306
+04D7	CYRILLIC SMALL LETTER IE WITH BREVE
+	: 0435 0306
+04D8	CYRILLIC CAPITAL LETTER SCHWA
+04D9	CYRILLIC SMALL LETTER SCHWA
+	x (latin small letter schwa - 0259)
+04DA	CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+	: 04D8 0308
+04DB	CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+	: 04D9 0308
+04DC	CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+	: 0416 0308
+04DD	CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+	: 0436 0308
+04DE	CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+	: 0417 0308
+04DF	CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+	: 0437 0308
+04E0	CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1	CYRILLIC SMALL LETTER ABKHASIAN DZE
+	x (latin small letter ezh - 0292)
+04E2	CYRILLIC CAPITAL LETTER I WITH MACRON
+	: 0418 0304
+04E3	CYRILLIC SMALL LETTER I WITH MACRON
+	: 0438 0304
+04E4	CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+	: 0418 0308
+04E5	CYRILLIC SMALL LETTER I WITH DIAERESIS
+	: 0438 0308
+04E6	CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+	: 041E 0308
+04E7	CYRILLIC SMALL LETTER O WITH DIAERESIS
+	: 043E 0308
+04E8	CYRILLIC CAPITAL LETTER BARRED O
+04E9	CYRILLIC SMALL LETTER BARRED O
+	x (latin small letter barred o - 0275)
+04EA	CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+	: 04E8 0308
+04EB	CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+	: 04E9 0308
+04EC	CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+	: 042D 0308
+04ED	CYRILLIC SMALL LETTER E WITH DIAERESIS
+	* Kildin Sami
+	: 044D 0308
+04EE	CYRILLIC CAPITAL LETTER U WITH MACRON
+	: 0423 0304
+04EF	CYRILLIC SMALL LETTER U WITH MACRON
+	: 0443 0304
+04F0	CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+	: 0423 0308
+04F1	CYRILLIC SMALL LETTER U WITH DIAERESIS
+	: 0443 0308
+04F2	CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+	: 0423 030B
+04F3	CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+	: 0443 030B
+04F4	CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+	: 0427 0308
+04F5	CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+	: 0447 0308
+04F6	CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+04F7	CYRILLIC SMALL LETTER GHE WITH DESCENDER
+	* Yupik
+04F8	CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+	: 042B 0308
+04F9	CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+	: 044B 0308
+@@	0500	Cyrillic Supplement	052F
+@		Komi letters
+0500	CYRILLIC CAPITAL LETTER KOMI DE
+0501	CYRILLIC SMALL LETTER KOMI DE
+0502	CYRILLIC CAPITAL LETTER KOMI DJE
+0503	CYRILLIC SMALL LETTER KOMI DJE
+0504	CYRILLIC CAPITAL LETTER KOMI ZJE
+0505	CYRILLIC SMALL LETTER KOMI ZJE
+0506	CYRILLIC CAPITAL LETTER KOMI DZJE
+0507	CYRILLIC SMALL LETTER KOMI DZJE
+0508	CYRILLIC CAPITAL LETTER KOMI LJE
+0509	CYRILLIC SMALL LETTER KOMI LJE
+050A	CYRILLIC CAPITAL LETTER KOMI NJE
+050B	CYRILLIC SMALL LETTER KOMI NJE
+050C	CYRILLIC CAPITAL LETTER KOMI SJE
+050D	CYRILLIC SMALL LETTER KOMI SJE
+050E	CYRILLIC CAPITAL LETTER KOMI TJE
+050F	CYRILLIC SMALL LETTER KOMI TJE
+@@	0530	Armenian	058F
+@		Uppercase letters
+0531	ARMENIAN CAPITAL LETTER AYB
+0532	ARMENIAN CAPITAL LETTER BEN
+0533	ARMENIAN CAPITAL LETTER GIM
+0534	ARMENIAN CAPITAL LETTER DA
+0535	ARMENIAN CAPITAL LETTER ECH
+0536	ARMENIAN CAPITAL LETTER ZA
+0537	ARMENIAN CAPITAL LETTER EH
+0538	ARMENIAN CAPITAL LETTER ET
+0539	ARMENIAN CAPITAL LETTER TO
+053A	ARMENIAN CAPITAL LETTER ZHE
+053B	ARMENIAN CAPITAL LETTER INI
+053C	ARMENIAN CAPITAL LETTER LIWN
+053D	ARMENIAN CAPITAL LETTER XEH
+053E	ARMENIAN CAPITAL LETTER CA
+053F	ARMENIAN CAPITAL LETTER KEN
+0540	ARMENIAN CAPITAL LETTER HO
+0541	ARMENIAN CAPITAL LETTER JA
+0542	ARMENIAN CAPITAL LETTER GHAD
+0543	ARMENIAN CAPITAL LETTER CHEH
+0544	ARMENIAN CAPITAL LETTER MEN
+0545	ARMENIAN CAPITAL LETTER YI
+0546	ARMENIAN CAPITAL LETTER NOW
+0547	ARMENIAN CAPITAL LETTER SHA
+0548	ARMENIAN CAPITAL LETTER VO
+0549	ARMENIAN CAPITAL LETTER CHA
+054A	ARMENIAN CAPITAL LETTER PEH
+054B	ARMENIAN CAPITAL LETTER JHEH
+054C	ARMENIAN CAPITAL LETTER RA
+054D	ARMENIAN CAPITAL LETTER SEH
+054E	ARMENIAN CAPITAL LETTER VEW
+054F	ARMENIAN CAPITAL LETTER TIWN
+0550	ARMENIAN CAPITAL LETTER REH
+0551	ARMENIAN CAPITAL LETTER CO
+0552	ARMENIAN CAPITAL LETTER YIWN
+0553	ARMENIAN CAPITAL LETTER PIWR
+0554	ARMENIAN CAPITAL LETTER KEH
+0555	ARMENIAN CAPITAL LETTER OH
+0556	ARMENIAN CAPITAL LETTER FEH
+@		Modifier letters
+0559	ARMENIAN MODIFIER LETTER LEFT HALF RING
+	x (modifier letter reversed comma - 02BD)
+	x (modifier letter left half ring - 02BF)
+	x (combining reversed comma above - 0314)
+055A	ARMENIAN APOSTROPHE
+	= ARMENIAN MODIFIER LETTER RIGHT HALF RING
+	x (modifier letter apostrophe - 02BC)
+	x (modifier letter right half ring - 02BE)
+	x (combining comma above - 0313)
+055B	ARMENIAN EMPHASIS MARK
+	= shesht
+	x (modifier letter acute accent - 02CA)
+055C	ARMENIAN EXCLAMATION MARK
+	= batsaganchakan nshan
+055D	ARMENIAN COMMA
+	= bowt
+	x (modifier letter grave accent - 02CB)
+055E	ARMENIAN QUESTION MARK
+	= hartsakan nshan
+055F	ARMENIAN ABBREVIATION MARK
+	= patiw
+@		Lowercase letters
+0561	ARMENIAN SMALL LETTER AYB
+0562	ARMENIAN SMALL LETTER BEN
+0563	ARMENIAN SMALL LETTER GIM
+0564	ARMENIAN SMALL LETTER DA
+0565	ARMENIAN SMALL LETTER ECH
+0566	ARMENIAN SMALL LETTER ZA
+0567	ARMENIAN SMALL LETTER EH
+0568	ARMENIAN SMALL LETTER ET
+0569	ARMENIAN SMALL LETTER TO
+056A	ARMENIAN SMALL LETTER ZHE
+056B	ARMENIAN SMALL LETTER INI
+056C	ARMENIAN SMALL LETTER LIWN
+056D	ARMENIAN SMALL LETTER XEH
+056E	ARMENIAN SMALL LETTER CA
+056F	ARMENIAN SMALL LETTER KEN
+0570	ARMENIAN SMALL LETTER HO
+0571	ARMENIAN SMALL LETTER JA
+0572	ARMENIAN SMALL LETTER GHAD
+0573	ARMENIAN SMALL LETTER CHEH
+0574	ARMENIAN SMALL LETTER MEN
+0575	ARMENIAN SMALL LETTER YI
+0576	ARMENIAN SMALL LETTER NOW
+0577	ARMENIAN SMALL LETTER SHA
+0578	ARMENIAN SMALL LETTER VO
+0579	ARMENIAN SMALL LETTER CHA
+057A	ARMENIAN SMALL LETTER PEH
+057B	ARMENIAN SMALL LETTER JHEH
+057C	ARMENIAN SMALL LETTER RA
+057D	ARMENIAN SMALL LETTER SEH
+057E	ARMENIAN SMALL LETTER VEW
+057F	ARMENIAN SMALL LETTER TIWN
+0580	ARMENIAN SMALL LETTER REH
+0581	ARMENIAN SMALL LETTER CO
+0582	ARMENIAN SMALL LETTER YIWN
+0583	ARMENIAN SMALL LETTER PIWR
+0584	ARMENIAN SMALL LETTER KEH
+0585	ARMENIAN SMALL LETTER OH
+0586	ARMENIAN SMALL LETTER FEH
+0587	ARMENIAN SMALL LIGATURE ECH YIWN
+	# 0565 0582
+@		Punctuation
+0589	ARMENIAN FULL STOP
+	= vertsaket
+	* may also be used for Georgian
+	x (colon - 003A)
+058A	ARMENIAN HYPHEN
+	= yentamna
+@@	0590	Hebrew	05FF
+@		Cantillation marks
+0591	HEBREW ACCENT ETNAHTA
+	= atnah
+0592	HEBREW ACCENT SEGOL
+	= segolta
+0593	HEBREW ACCENT SHALSHELET
+0594	HEBREW ACCENT ZAQEF QATAN
+0595	HEBREW ACCENT ZAQEF GADOL
+0596	HEBREW ACCENT TIPEHA *
+	= tarha, me'ayla ~ mayla
+0597	HEBREW ACCENT REVIA
+0598	HEBREW ACCENT ZARQA *
+	= tsinorit, zinorit; tsinor, zinor
+	* This character is to be used when Zarqa or Tsinor are placed above, and also for Tsinorit.
+	x (hebrew accent zinor - 05AE)
+0599	HEBREW ACCENT PASHTA
+059A	HEBREW ACCENT YETIV
+059B	HEBREW ACCENT TEVIR
+059C	HEBREW ACCENT GERESH
+	= teres
+059D	HEBREW ACCENT GERESH MUQDAM
+059E	HEBREW ACCENT GERSHAYIM
+059F	HEBREW ACCENT QARNEY PARA
+	= pazer gadol
+05A0	HEBREW ACCENT TELISHA GEDOLA
+05A1	HEBREW ACCENT PAZER
+	= pazer qatan
+05A2	HEBREW ACCENT ATNAH HAFUKH
+	x (hebrew accent yerah ben yomo - 05AA)
+05A3	HEBREW ACCENT MUNAH
+05A4	HEBREW ACCENT MAHAPAKH
+05A5	HEBREW ACCENT MERKHA *
+	= yored
+05A6	HEBREW ACCENT MERKHA KEFULA
+05A7	HEBREW ACCENT DARGA
+05A8	HEBREW ACCENT QADMA *
+	= azla
+05A9	HEBREW ACCENT TELISHA QETANA
+05AA	HEBREW ACCENT YERAH BEN YOMO *
+	= galgal
+	x (hebrew accent atnah hafukh - 05A2)
+05AB	HEBREW ACCENT OLE
+05AC	HEBREW ACCENT ILUY
+05AD	HEBREW ACCENT DEHI
+05AE	HEBREW ACCENT ZINOR
+	= tsinor; zarqa
+	* This character is to be used when Zarqa or Tsinor are placed above left.
+	x (hebrew accent zarqa - 0598)
+05AF	HEBREW MARK MASORA CIRCLE
+@		Points and punctuation
+05B0	HEBREW POINT SHEVA
+05B1	HEBREW POINT HATAF SEGOL
+05B2	HEBREW POINT HATAF PATAH
+05B3	HEBREW POINT HATAF QAMATS
+05B4	HEBREW POINT HIRIQ
+05B5	HEBREW POINT TSERE
+05B6	HEBREW POINT SEGOL
+05B7	HEBREW POINT PATAH
+	* furtive patah is not a distinct character
+05B8	HEBREW POINT QAMATS
+	x (hebrew point qamats qatan - 05C7)
+05B9	HEBREW POINT HOLAM
+05BB	HEBREW POINT QUBUTS
+05BC	HEBREW POINT DAGESH OR MAPIQ (or shuruq)
+	= shuruq
+	* falls within the base letter
+05BD	HEBREW POINT METEG *
+	= siluq
+	* may be used as a Hebrew accent sof pasuq
+05BE	HEBREW PUNCTUATION MAQAF
+05BF	HEBREW POINT RAFE
+	x (hebrew point judeo-spanish varika - FB1E)
+05C0	HEBREW PUNCTUATION PASEQ *
+	= legarmeh
+	* may be treated as spacing punctuation, not as a point
+	x (vertical line - 007C)
+05C1	HEBREW POINT SHIN DOT
+05C2	HEBREW POINT SIN DOT
+05C3	HEBREW PUNCTUATION SOF PASUQ *
+	* may be used as a Hebrew punctuation colon
+	x (colon - 003A)
+@		Puncta extraordinaria
+05C4	HEBREW MARK UPPER DOT
+05C5	HEBREW MARK LOWER DOT
+	* punctum extraordinarium (Psalms 27:13)
+	x (hebrew point hiriq - 05B4)
+@		Points and punctuation
+05C6	HEBREW PUNCTUATION NUN HAFUKHA
+	* does not historically derive from the letter nun
+	x (hebrew letter nun - 05E0)
+05C7	HEBREW POINT QAMATS QATAN
+	x (hebrew point qamats - 05B8)
+@		Based on ISO 8859-8
+05D0	HEBREW LETTER ALEF
+	= aleph
+	x (alef symbol - 2135)
+05D1	HEBREW LETTER BET
+	x (bet symbol - 2136)
+05D2	HEBREW LETTER GIMEL
+	x (gimel symbol - 2137)
+05D3	HEBREW LETTER DALET
+	x (dalet symbol - 2138)
+05D4	HEBREW LETTER HE
+05D5	HEBREW LETTER VAV
+05D6	HEBREW LETTER ZAYIN
+05D7	HEBREW LETTER HET
+05D8	HEBREW LETTER TET
+05D9	HEBREW LETTER YOD
+05DA	HEBREW LETTER FINAL KAF
+05DB	HEBREW LETTER KAF
+05DC	HEBREW LETTER LAMED
+05DD	HEBREW LETTER FINAL MEM
+05DE	HEBREW LETTER MEM
+05DF	HEBREW LETTER FINAL NUN
+05E0	HEBREW LETTER NUN
+05E1	HEBREW LETTER SAMEKH
+05E2	HEBREW LETTER AYIN
+05E3	HEBREW LETTER FINAL PE
+05E4	HEBREW LETTER PE
+05E5	HEBREW LETTER FINAL TSADI
+05E6	HEBREW LETTER TSADI
+	= zade
+05E7	HEBREW LETTER QOF
+05E8	HEBREW LETTER RESH
+05E9	HEBREW LETTER SHIN
+05EA	HEBREW LETTER TAV
+@		Yiddish digraphs
+05F0	HEBREW LIGATURE YIDDISH DOUBLE VAV
+	= tsvey vovn
+05F1	HEBREW LIGATURE YIDDISH VAV YOD
+05F2	HEBREW LIGATURE YIDDISH DOUBLE YOD
+	= tsvey yudn
+@		Additional punctuation
+05F3	HEBREW PUNCTUATION GERESH
+05F4	HEBREW PUNCTUATION GERSHAYIM
+@@	0600	Arabic	06FF
+@		Subtending marks
+0600	ARABIC NUMBER SIGN
+0601	ARABIC SIGN SANAH
+0602	ARABIC FOOTNOTE MARKER
+0603	ARABIC SIGN SAFHA
+@		Currency sign
+060B	AFGHANI SIGN
+@		Punctuation
+060C	ARABIC COMMA
+	* also used with Thaana and Syriac in modern text
+	x (comma - 002C)
+060D	ARABIC DATE SEPARATOR
+@		Poetic marks
+060E	ARABIC POETIC VERSE SIGN
+060F	ARABIC SIGN MISRA
+@		Honorifics
+0610	ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+	* represents sallallahu alayhe wasallam "may God's peace and blessings be upon him"
+0611	ARABIC SIGN ALAYHE ASSALLAM
+	* represents alayhe assalam "upon him be peace"
+0612	ARABIC SIGN RAHMATULLAH ALAYHE
+	* represents rahmatullah alayhe "may God have mercy upon him"
+0613	ARABIC SIGN RADI ALLAHOU ANHU
+	* represents radi allahu 'anhu "may God be pleased with him"
+0614	ARABIC SIGN TAKHALLUS
+	* sign placed over the name or nom-de-plume of a poet, or in some writings used to mark all proper names
+@		Koranic annotation sign
+0615	ARABIC SMALL HIGH TAH
+	* marks a recommended pause position in some Korans published in Iran and Pakistan
+	* should not be confused with the small TAH sign used as a diacritic for some letters such as 0679
+@		Punctuation
+061B	ARABIC SEMICOLON
+	* also used with Thaana and Syriac in modern text
+	x (semicolon - 003B)
+061E	ARABIC TRIPLE DOT PUNCTUATION MARK
+061F	ARABIC QUESTION MARK
+	* also used with Thaana and Syriac in modern text
+	x (question mark - 003F)
+@		Based on ISO 8859-6
+0621	ARABIC LETTER HAMZA
+	x (modifier letter right half ring - 02BE)
+0622	ARABIC LETTER ALEF WITH MADDA ABOVE
+	: 0627 0653
+0623	ARABIC LETTER ALEF WITH HAMZA ABOVE
+	: 0627 0654
+0624	ARABIC LETTER WAW WITH HAMZA ABOVE
+	: 0648 0654
+0625	ARABIC LETTER ALEF WITH HAMZA BELOW
+	: 0627 0655
+0626	ARABIC LETTER YEH WITH HAMZA ABOVE
+	: 064A 0654
+0627	ARABIC LETTER ALEF
+0628	ARABIC LETTER BEH
+0629	ARABIC LETTER TEH MARBUTA
+062A	ARABIC LETTER TEH
+062B	ARABIC LETTER THEH
+062C	ARABIC LETTER JEEM
+062D	ARABIC LETTER HAH
+062E	ARABIC LETTER KHAH
+062F	ARABIC LETTER DAL
+0630	ARABIC LETTER THAL
+0631	ARABIC LETTER REH
+0632	ARABIC LETTER ZAIN
+0633	ARABIC LETTER SEEN
+0634	ARABIC LETTER SHEEN
+0635	ARABIC LETTER SAD
+0636	ARABIC LETTER DAD
+0637	ARABIC LETTER TAH
+0638	ARABIC LETTER ZAH
+0639	ARABIC LETTER AIN
+	x (latin small letter ezh reversed - 01B9)
+	x (modifier letter left half ring - 02BF)
+063A	ARABIC LETTER GHAIN
+0640	ARABIC TATWEEL
+	= kashida
+	* inserted to stretch characters
+	* also used with Syriac
+0641	ARABIC LETTER FEH
+0642	ARABIC LETTER QAF
+0643	ARABIC LETTER KAF
+0644	ARABIC LETTER LAM
+0645	ARABIC LETTER MEEM
+0646	ARABIC LETTER NOON
+0647	ARABIC LETTER HEH
+0648	ARABIC LETTER WAW
+0649	ARABIC LETTER ALEF MAKSURA
+	* represents YEH-shaped letter with no dots in any positional form
+064A	ARABIC LETTER YEH
+@		Points from ISO 8859-6
+064B	ARABIC FATHATAN
+064C	ARABIC DAMMATAN
+064D	ARABIC KASRATAN
+064E	ARABIC FATHA
+064F	ARABIC DAMMA
+0650	ARABIC KASRA
+0651	ARABIC SHADDA
+0652	ARABIC SUKUN
+	* marks absence of a vowel after the base consonant
+	* used in some Korans to mark a long vowel as ignored
+	x (arabic small high dotless head of khah - 06E1)
+@		Combining maddah and hamza
+0653	ARABIC MADDAH ABOVE
+0654	ARABIC HAMZA ABOVE
+0655	ARABIC HAMZA BELOW
+@		Other combining marks
+0656	ARABIC SUBSCRIPT ALEF
+0657	ARABIC INVERTED DAMMA
+0658	ARABIC MARK NOON GHUNNA
+	* Kashmiri and Baluchi
+	* indicates nasalization in Urdu
+0659	ARABIC ZWARAKAY
+	* Pashto
+065A	ARABIC VOWEL SIGN SMALL V ABOVE
+	* African languages
+065B	ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+	* African languages
+065C	ARABIC VOWEL SIGN DOT BELOW
+	* African languages
+065D	ARABIC REVERSED DAMMA
+	* Ormuri, African languages
+065E	ARABIC FATHA WITH TWO DOTS
+	* Kalami
+@		Arabic-Indic digits
+@+		These digits are used with Arabic proper; for languages of Iran, Pakistan, and India, see the Eastern Arabic-Indic digits at 06F0..06F9.
+0660	ARABIC-INDIC DIGIT ZERO
+0661	ARABIC-INDIC DIGIT ONE
+0662	ARABIC-INDIC DIGIT TWO
+0663	ARABIC-INDIC DIGIT THREE
+0664	ARABIC-INDIC DIGIT FOUR
+0665	ARABIC-INDIC DIGIT FIVE
+0666	ARABIC-INDIC DIGIT SIX
+0667	ARABIC-INDIC DIGIT SEVEN
+0668	ARABIC-INDIC DIGIT EIGHT
+0669	ARABIC-INDIC DIGIT NINE
+@		Punctuation
+066A	ARABIC PERCENT SIGN
+	x (percent sign - 0025)
+066B	ARABIC DECIMAL SEPARATOR
+066C	ARABIC THOUSANDS SEPARATOR
+	x (apostrophe - 0027)
+	x (right single quotation mark - 2019)
+066D	ARABIC FIVE POINTED STAR
+	x (asterisk - 002A)
+@		Archaic letters
+066E	ARABIC LETTER DOTLESS BEH
+066F	ARABIC LETTER DOTLESS QAF
+@		Point
+0670	ARABIC LETTER SUPERSCRIPT ALEF
+	* actually a vowel sign, despite the name
+@		Extended Arabic letters
+0671	ARABIC LETTER ALEF WASLA
+	* Koranic Arabic
+0672	ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+	* Baluchi, Kashmiri
+0673	ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+	* Baluchi, Kashmiri
+0674	ARABIC LETTER HIGH HAMZA
+	* Kazakh
+	* forms digraphs
+0675	ARABIC LETTER HIGH HAMZA ALEF
+	* Kazakh
+	# 0627 0674
+0676	ARABIC LETTER HIGH HAMZA WAW
+	* Kazakh
+	# 0648 0674
+0677	ARABIC LETTER U WITH HAMZA ABOVE
+	* Kazakh
+	# 06C7 0674
+0678	ARABIC LETTER HIGH HAMZA YEH
+	* Kazakh
+	# 064A 0674
+0679	ARABIC LETTER TTEH
+	* Urdu
+067A	ARABIC LETTER TTEHEH
+	* Sindhi
+067B	ARABIC LETTER BEEH
+	* Sindhi
+067C	ARABIC LETTER TEH WITH RING
+	* Pashto
+067D	ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+	* Sindhi
+067E	ARABIC LETTER PEH
+	* Persian, Urdu, ...
+067F	ARABIC LETTER TEHEH
+	* Sindhi
+0680	ARABIC LETTER BEHEH
+	* Sindhi
+0681	ARABIC LETTER HAH WITH HAMZA ABOVE
+	* Pashto letter "zhe"
+0682	ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+	* not used in modern Pashto
+0683	ARABIC LETTER NYEH
+	* Sindhi
+0684	ARABIC LETTER DYEH
+	* Sindhi
+0685	ARABIC LETTER HAH WITH THREE DOTS ABOVE
+	* Pashto
+0686	ARABIC LETTER TCHEH
+	* Persian, Urdu, ...
+0687	ARABIC LETTER TCHEHEH
+	* Sindhi
+0688	ARABIC LETTER DDAL
+	* Urdu
+0689	ARABIC LETTER DAL WITH RING
+	* Pashto
+068A	ARABIC LETTER DAL WITH DOT BELOW
+	* Sindhi
+068B	ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+	* Lahnda
+068C	ARABIC LETTER DAHAL
+	* Sindhi
+068D	ARABIC LETTER DDAHAL
+	* Sindhi
+068E	ARABIC LETTER DUL
+	* older shape for DUL, now obsolete in Sindhi
+068F	ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+	* Sindhi
+	* current shape used for DUL
+0690	ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+	* old Urdu, not in current use
+0691	ARABIC LETTER RREH
+	* Urdu
+0692	ARABIC LETTER REH WITH SMALL V
+	* Kurdish
+0693	ARABIC LETTER REH WITH RING
+	* Pashto
+0694	ARABIC LETTER REH WITH DOT BELOW
+	* Kurdish
+0695	ARABIC LETTER REH WITH SMALL V BELOW
+	* Kurdish
+0696	ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+	* Pashto
+0697	ARABIC LETTER REH WITH TWO DOTS ABOVE
+	* Dargwa
+0698	ARABIC LETTER JEH
+	* Persian, Urdu, ...
+0699	ARABIC LETTER REH WITH FOUR DOTS ABOVE
+	* Sindhi
+069A	ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+	* Pashto
+069B	ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C	ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+	* Moroccan Arabic
+069D	ARABIC LETTER SAD WITH TWO DOTS BELOW
+	* Turkic
+069E	ARABIC LETTER SAD WITH THREE DOTS ABOVE
+	* Berber
+069F	ARABIC LETTER TAH WITH THREE DOTS ABOVE
+	* old Hausa
+06A0	ARABIC LETTER AIN WITH THREE DOTS ABOVE
+	* old Malay
+06A1	ARABIC LETTER DOTLESS FEH
+	* Adighe
+06A2	ARABIC LETTER FEH WITH DOT MOVED BELOW
+	* Maghrib Arabic
+06A3	ARABIC LETTER FEH WITH DOT BELOW
+	* Ingush
+06A4	ARABIC LETTER VEH
+	* Middle Eastern Arabic for foreign words
+	* Kurdish
+06A5	ARABIC LETTER FEH WITH THREE DOTS BELOW
+	* North African Arabic for foreign words
+06A6	ARABIC LETTER PEHEH
+	* Sindhi
+06A7	ARABIC LETTER QAF WITH DOT ABOVE
+	* Maghrib Arabic
+06A8	ARABIC LETTER QAF WITH THREE DOTS ABOVE
+	* Tunisian Arabic
+06A9	ARABIC LETTER KEHEH
+	* Persian, Urdu, ...
+06AA	ARABIC LETTER SWASH KAF
+06AB	ARABIC LETTER KAF WITH RING
+	* Pashto
+	* may appear like an Arabic KAF (0643) with a ring below the base
+06AC	ARABIC LETTER KAF WITH DOT ABOVE
+	* old Malay
+06AD	ARABIC LETTER NG
+	* Uighur, Kazakh, old Malay, ...
+06AE	ARABIC LETTER KAF WITH THREE DOTS BELOW
+	* Berber
+06AF	ARABIC LETTER GAF *
+	* Persian, Urdu, ...
+06B0	ARABIC LETTER GAF WITH RING
+	* Lahnda
+06B1	ARABIC LETTER NGOEH
+	* Sindhi
+06B2	ARABIC LETTER GAF WITH TWO DOTS BELOW
+	* not used in Sindhi
+06B3	ARABIC LETTER GUEH
+	* Sindhi
+06B4	ARABIC LETTER GAF WITH THREE DOTS ABOVE
+	* not used in Sindhi
+06B5	ARABIC LETTER LAM WITH SMALL V
+	* Kurdish
+06B6	ARABIC LETTER LAM WITH DOT ABOVE
+	* Kurdish
+06B7	ARABIC LETTER LAM WITH THREE DOTS ABOVE
+	* Kurdish
+06B8	ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9	ARABIC LETTER NOON WITH DOT BELOW
+06BA	ARABIC LETTER NOON GHUNNA
+	* Urdu
+06BB	ARABIC LETTER RNOON
+	* Sindhi
+06BC	ARABIC LETTER NOON WITH RING
+	* Pashto
+06BD	ARABIC LETTER NOON WITH THREE DOTS ABOVE
+	* old Malay
+06BE	ARABIC LETTER HEH DOACHASHMEE
+	* Urdu
+	* forms aspirate digraphs
+06BF	ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0	ARABIC LETTER HEH WITH YEH ABOVE
+	= ARABIC LETTER HAMZAH ON HA
+	= izafet
+	* Urdu
+	* actually a ligature, not an independent letter
+	: 06D5 0654
+06C1	ARABIC LETTER HEH GOAL
+	* Urdu
+06C2	ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+	* Urdu
+	* actually a ligature, not an independent letter
+	: 06C1 0654
+06C3	ARABIC LETTER TEH MARBUTA GOAL
+	* Urdu
+06C4	ARABIC LETTER WAW WITH RING
+	* Kashmiri
+06C5	ARABIC LETTER KIRGHIZ OE
+	* Kirghiz
+06C6	ARABIC LETTER OE
+	* Uighur, Kurdish, Kazakh
+06C7	ARABIC LETTER U
+	* Kirghiz
+06C8	ARABIC LETTER YU
+	* Uighur
+06C9	ARABIC LETTER KIRGHIZ YU
+	* Kazakh, Kirghiz
+06CA	ARABIC LETTER WAW WITH TWO DOTS ABOVE
+	* Kurdish
+06CB	ARABIC LETTER VE
+	* Uighur, Kazakh
+06CC	ARABIC LETTER FARSI YEH
+	* Arabic, Persian, Urdu, ...
+	* initial and medial forms of this letter have dots
+	x (arabic letter alef maksura - 0649)
+	x (arabic letter yeh - 064A)
+06CD	ARABIC LETTER YEH WITH TAIL
+	* Pashto, Sindhi
+06CE	ARABIC LETTER YEH WITH SMALL V
+	* Kurdish
+06CF	ARABIC LETTER WAW WITH DOT ABOVE
+06D0	ARABIC LETTER E *
+	* Pashto, Uighur
+	* used as the letter bbeh in Sindhi
+06D1	ARABIC LETTER YEH WITH THREE DOTS BELOW
+	* old Malay
+06D2	ARABIC LETTER YEH BARREE
+	* Urdu
+06D3	ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+	* Urdu
+	* actually a ligature, not an independent letter
+	: 06D2 0654
+@		Punctuation
+06D4	ARABIC FULL STOP
+	* Urdu
+@		Extended Arabic letter
+06D5	ARABIC LETTER AE
+	* Uighur, Kazakh, Kirghiz
+@		Koranic annotation signs
+06D6	ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7	ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8	ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9	ARABIC SMALL HIGH LAM ALEF
+06DA	ARABIC SMALL HIGH JEEM
+06DB	ARABIC SMALL HIGH THREE DOTS
+06DC	ARABIC SMALL HIGH SEEN
+06DD	ARABIC END OF AYAH
+06DE	ARABIC START OF RUB EL HIZB
+06DF	ARABIC SMALL HIGH ROUNDED ZERO
+06E0	ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1	ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+	= Arabic jazm
+	* used in some Korans to mark absence of a vowel
+	x (arabic sukun - 0652)
+06E2	ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3	ARABIC SMALL LOW SEEN
+06E4	ARABIC SMALL HIGH MADDA
+06E5	ARABIC SMALL WAW
+06E6	ARABIC SMALL YEH
+06E7	ARABIC SMALL HIGH YEH
+06E8	ARABIC SMALL HIGH NOON
+06E9	ARABIC PLACE OF SAJDAH
+06EA	ARABIC EMPTY CENTRE LOW STOP
+06EB	ARABIC EMPTY CENTRE HIGH STOP
+06EC	ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED	ARABIC SMALL LOW MEEM
+@		Extended Arabic letters for Parkari
+06EE	ARABIC LETTER DAL WITH INVERTED V
+06EF	ARABIC LETTER REH WITH INVERTED V
+@		Eastern Arabic-Indic digits
+@+		These digits are used with Arabic-script languages of Iran, Pakistan, and India (Persian, Sindhi, Urdu, etc.). For details of variations in preferred glyphs, see the block description for the Arabic script.
+06F0	EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1	EXTENDED ARABIC-INDIC DIGIT ONE
+06F2	EXTENDED ARABIC-INDIC DIGIT TWO
+06F3	EXTENDED ARABIC-INDIC DIGIT THREE
+06F4	EXTENDED ARABIC-INDIC DIGIT FOUR
+	* Persian has a different glyph than Sindhi and Urdu
+06F5	EXTENDED ARABIC-INDIC DIGIT FIVE
+	* Persian, Sindhi, and Urdu share glyph different from Arabic
+06F6	EXTENDED ARABIC-INDIC DIGIT SIX
+	* Persian, Sindhi, and Urdu have glyphs different from Arabic
+06F7	EXTENDED ARABIC-INDIC DIGIT SEVEN
+	* Urdu and Sindhi have glyphs different from Arabic
+06F8	EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9	EXTENDED ARABIC-INDIC DIGIT NINE
+@		Extended Arabic letters
+06FA	ARABIC LETTER SHEEN WITH DOT BELOW
+06FB	ARABIC LETTER DAD WITH DOT BELOW
+06FC	ARABIC LETTER GHAIN WITH DOT BELOW
+@		Signs for Sindhi
+06FD	ARABIC SIGN SINDHI AMPERSAND
+06FE	ARABIC SIGN SINDHI POSTPOSITION MEN
+@		Extended Arabic letter for Parkari
+06FF	ARABIC LETTER HEH WITH INVERTED V
+@@	0700	Syriac	074F
+@		Syriac punctuation and signs
+0700	SYRIAC END OF PARAGRAPH
+	* marks the end of a paragraph
+0701	SYRIAC SUPRALINEAR FULL STOP
+	* marks interrogations, imperatives, and pauses, especially in Biblical texts
+0702	SYRIAC SUBLINEAR FULL STOP
+	* marks subordinate clauses and minor pauses, especially in Biblical texts
+0703	SYRIAC SUPRALINEAR COLON
+	* marks expressions of wonder and has a distinct pausal value in Biblical texts
+0704	SYRIAC SUBLINEAR COLON
+	* used at the end of verses of supplications
+0705	SYRIAC HORIZONTAL COLON
+	* joins two words closely together in a context to which a rising tone is suitable
+0706	SYRIAC COLON SKEWED LEFT
+	* marks a dependent clause
+0707	SYRIAC COLON SKEWED RIGHT
+	* marks the end of a subdivision of the apodosis, or latter part of a Biblical verse
+0708	SYRIAC SUPRALINEAR COLON SKEWED LEFT
+	* marks a minor phrase division
+0709	SYRIAC SUBLINEAR COLON SKEWED RIGHT
+	* marks the end of a real or rhetorical question
+070A	SYRIAC CONTRACTION
+	* a contraction mark, mostly used in East Syriac
+	* placed at the end of an incomplete word
+070B	SYRIAC HARKLEAN OBELUS
+	* marks the beginning of a phrase, word, or morpheme that has a marginal note
+070C	SYRIAC HARKLEAN METOBELUS
+	* marks the end of a section with a marginal note
+070D	SYRIAC HARKLEAN ASTERISCUS
+	* marks the beginning of a phrase, word, or morpheme that has a marginal note
+@		Syriac format control character
+070F	SYRIAC ABBREVIATION MARK
+	= SAM
+	* marks the beginning of a Syriac abbreviation
+@		Syriac letters
+0710	SYRIAC LETTER ALAPH
+0711	SYRIAC LETTER SUPERSCRIPT ALAPH
+	* used in East Syriac texts to indicate an etymological Alaph
+0712	SYRIAC LETTER BETH
+0713	SYRIAC LETTER GAMAL
+0714	SYRIAC LETTER GAMAL GARSHUNI
+	* used in Garshuni documents
+0715	SYRIAC LETTER DALATH
+0716	SYRIAC LETTER DOTLESS DALATH RISH
+	* ambiguous form for undifferentiated early dalath/rish
+0717	SYRIAC LETTER HE
+0718	SYRIAC LETTER WAW
+0719	SYRIAC LETTER ZAIN
+071A	SYRIAC LETTER HETH
+071B	SYRIAC LETTER TETH
+071C	SYRIAC LETTER TETH GARSHUNI
+	* used in Garshuni documents
+071D	SYRIAC LETTER YUDH
+071E	SYRIAC LETTER YUDH HE
+	* mostly used in East Syriac texts
+071F	SYRIAC LETTER KAPH
+0720	SYRIAC LETTER LAMADH
+0721	SYRIAC LETTER MIM
+0722	SYRIAC LETTER NUN
+0723	SYRIAC LETTER SEMKATH
+0724	SYRIAC LETTER FINAL SEMKATH
+0725	SYRIAC LETTER E
+0726	SYRIAC LETTER PE
+0727	SYRIAC LETTER REVERSED PE
+	* used in Christian Palestinian Aramaic
+0728	SYRIAC LETTER SADHE
+0729	SYRIAC LETTER QAPH
+072A	SYRIAC LETTER RISH
+072B	SYRIAC LETTER SHIN
+072C	SYRIAC LETTER TAW
+@		Persian letters
+072D	SYRIAC LETTER PERSIAN BHETH
+072E	SYRIAC LETTER PERSIAN GHAMAL
+072F	SYRIAC LETTER PERSIAN DHALATH
+@		Syriac points (vowels)
+0730	SYRIAC PTHAHA ABOVE
+0731	SYRIAC PTHAHA BELOW
+0732	SYRIAC PTHAHA DOTTED
+0733	SYRIAC ZQAPHA ABOVE
+0734	SYRIAC ZQAPHA BELOW
+0735	SYRIAC ZQAPHA DOTTED
+0736	SYRIAC RBASA ABOVE
+0737	SYRIAC RBASA BELOW
+0738	SYRIAC DOTTED ZLAMA HORIZONTAL
+0739	SYRIAC DOTTED ZLAMA ANGULAR
+073A	SYRIAC HBASA ABOVE
+073B	SYRIAC HBASA BELOW
+073C	SYRIAC HBASA-ESASA DOTTED
+073D	SYRIAC ESASA ABOVE
+073E	SYRIAC ESASA BELOW
+073F	SYRIAC RWAHA
+@		Syriac marks
+0740	SYRIAC FEMININE DOT
+	* feminine marker used with the Taw feminine suffix
+0741	SYRIAC QUSHSHAYA
+	* indicates a plosive pronunciation
+0742	SYRIAC RUKKAKHA
+	* indicates an aspirated (spirantized) pronunciation
+0743	SYRIAC TWO VERTICAL DOTS ABOVE
+	* accent mark used in ancient manuscripts
+0744	SYRIAC TWO VERTICAL DOTS BELOW
+	* accent mark used in ancient manuscripts
+0745	SYRIAC THREE DOTS ABOVE
+	* diacritic used in Turoyo for letters not found in Syriac
+0746	SYRIAC THREE DOTS BELOW
+	* diacritic used in Turoyo for letters not found in Syriac
+0747	SYRIAC OBLIQUE LINE ABOVE
+	* indication of a silent letter
+0748	SYRIAC OBLIQUE LINE BELOW
+	* indication of a silent letter
+	* also used to indicate numbers multiplied by a certain constant
+0749	SYRIAC MUSIC
+	* a music mark
+	* also used in the Syrian Orthodox Anaphora book to mark the breaking of the Eucharist bread
+074A	SYRIAC BARREKH
+	* a diacritic cross used in liturgical texts
+@		Sogdian letters
+074D	SYRIAC LETTER SOGDIAN ZHAIN
+074E	SYRIAC LETTER SOGDIAN KHAPH
+074F	SYRIAC LETTER SOGDIAN FE
+@@	0750	Arabic Supplement	077F
+@	Extended Arabic letters
+@+		These are primarily used in Arabic-script orthographies of African languages.
+0750	ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751	ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752	ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753	ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754	ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755	ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756	ARABIC LETTER BEH WITH SMALL V
+0757	ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758	ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+0759	ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+	* Saraiki
+075A	ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+075B	ARABIC LETTER REH WITH STROKE
+075C	ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+	* Shina
+075D	ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E	ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F	ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0760	ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761	ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+0762	ARABIC LETTER KEHEH WITH DOT ABOVE
+	* old Malay, preferred to 06AC
+	x (arabic letter kaf with dot above - 06AC)
+0763	ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+	* Moroccan Arabic, Amazigh
+	x (arabic letter ng - 06AD)
+0764	ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0765	ARABIC LETTER MEEM WITH DOT ABOVE
+0766	ARABIC LETTER MEEM WITH DOT BELOW
+	* Maba
+0767	ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768	ARABIC LETTER NOON WITH SMALL TAH
+	* Saraiki, Pathwari
+0769	ARABIC LETTER NOON WITH SMALL V
+	* Gojri
+076A	ARABIC LETTER LAM WITH BAR
+076B	ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+	* Torwali, Ormuri
+076C	ARABIC LETTER REH WITH HAMZA ABOVE
+	* Ormuri
+076D	ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+	* Kalami, Ormuri
+@@	0780	Thaana	07BF
+@		Basic consonants
+0780	THAANA LETTER HAA
+0781	THAANA LETTER SHAVIYANI
+0782	THAANA LETTER NOONU
+0783	THAANA LETTER RAA
+0784	THAANA LETTER BAA
+0785	THAANA LETTER LHAVIYANI
+0786	THAANA LETTER KAAFU
+0787	THAANA LETTER ALIFU
+0788	THAANA LETTER VAAVU
+0789	THAANA LETTER MEEMU
+078A	THAANA LETTER FAAFU
+078B	THAANA LETTER DHAALU
+078C	THAANA LETTER THAA
+078D	THAANA LETTER LAAMU
+078E	THAANA LETTER GAAFU
+078F	THAANA LETTER GNAVIYANI
+0790	THAANA LETTER SEENU
+0791	THAANA LETTER DAVIYANI
+0792	THAANA LETTER ZAVIYANI
+0793	THAANA LETTER TAVIYANI
+0794	THAANA LETTER YAA
+0795	THAANA LETTER PAVIYANI
+0796	THAANA LETTER JAVIYANI
+0797	THAANA LETTER CHAVIYANI
+@		Extensions for Arabic
+0798	THAANA LETTER TTAA
+0799	THAANA LETTER HHAA
+079A	THAANA LETTER KHAA
+079B	THAANA LETTER THAALU
+079C	THAANA LETTER ZAA
+079D	THAANA LETTER SHEENU
+079E	THAANA LETTER SAADHU
+079F	THAANA LETTER DAADHU
+07A0	THAANA LETTER TO
+07A1	THAANA LETTER ZO
+07A2	THAANA LETTER AINU
+07A3	THAANA LETTER GHAINU
+07A4	THAANA LETTER QAAFU
+07A5	THAANA LETTER WAAVU
+@		Vowels
+07A6	THAANA ABAFILI
+07A7	THAANA AABAAFILI
+07A8	THAANA IBIFILI
+07A9	THAANA EEBEEFILI
+07AA	THAANA UBUFILI
+07AB	THAANA OOBOOFILI
+07AC	THAANA EBEFILI
+07AD	THAANA EYBEYFILI
+07AE	THAANA OBOFILI
+07AF	THAANA OABOAFILI
+07B0	THAANA SUKUN
+@		Consonant for Addu dialect
+07B1	THAANA LETTER NAA
+@@	0900	Devanagari	097F
+@		Based on ISCII 1988
+@		Various signs
+0901	DEVANAGARI SIGN CANDRABINDU
+	= anunasika
+	x (combining candrabindu - 0310)
+0902	DEVANAGARI SIGN ANUSVARA
+	= bindu
+0903	DEVANAGARI SIGN VISARGA
+@		Independent vowels
+0904	DEVANAGARI LETTER SHORT A
+0905	DEVANAGARI LETTER A
+0906	DEVANAGARI LETTER AA
+0907	DEVANAGARI LETTER I
+0908	DEVANAGARI LETTER II
+0909	DEVANAGARI LETTER U
+090A	DEVANAGARI LETTER UU
+090B	DEVANAGARI LETTER VOCALIC R
+090C	DEVANAGARI LETTER VOCALIC L
+090D	DEVANAGARI LETTER CANDRA E
+090E	DEVANAGARI LETTER SHORT E
+	* for transcribing Dravidian short e
+090F	DEVANAGARI LETTER E
+0910	DEVANAGARI LETTER AI
+0911	DEVANAGARI LETTER CANDRA O
+0912	DEVANAGARI LETTER SHORT O
+	* for transcribing Dravidian short o
+0913	DEVANAGARI LETTER O
+0914	DEVANAGARI LETTER AU
+@		Consonants
+0915	DEVANAGARI LETTER KA
+0916	DEVANAGARI LETTER KHA
+0917	DEVANAGARI LETTER GA
+0918	DEVANAGARI LETTER GHA
+0919	DEVANAGARI LETTER NGA
+091A	DEVANAGARI LETTER CA
+091B	DEVANAGARI LETTER CHA
+091C	DEVANAGARI LETTER JA
+091D	DEVANAGARI LETTER JHA
+091E	DEVANAGARI LETTER NYA
+091F	DEVANAGARI LETTER TTA
+0920	DEVANAGARI LETTER TTHA
+0921	DEVANAGARI LETTER DDA
+0922	DEVANAGARI LETTER DDHA
+0923	DEVANAGARI LETTER NNA
+0924	DEVANAGARI LETTER TA
+0925	DEVANAGARI LETTER THA
+0926	DEVANAGARI LETTER DA
+0927	DEVANAGARI LETTER DHA
+0928	DEVANAGARI LETTER NA
+0929	DEVANAGARI LETTER NNNA
+	* for transcribing Dravidian alveolar n
+	: 0928 093C
+092A	DEVANAGARI LETTER PA
+092B	DEVANAGARI LETTER PHA
+092C	DEVANAGARI LETTER BA
+092D	DEVANAGARI LETTER BHA
+092E	DEVANAGARI LETTER MA
+092F	DEVANAGARI LETTER YA
+0930	DEVANAGARI LETTER RA
+0931	DEVANAGARI LETTER RRA
+	* for transcribing Dravidian alveolar r
+	* half form is represented as "Eyelash RA"
+	: 0930 093C
+0932	DEVANAGARI LETTER LA
+0933	DEVANAGARI LETTER LLA
+0934	DEVANAGARI LETTER LLLA
+	* for transcribing Dravidian l
+	: 0933 093C
+0935	DEVANAGARI LETTER VA
+0936	DEVANAGARI LETTER SHA
+0937	DEVANAGARI LETTER SSA
+0938	DEVANAGARI LETTER SA
+0939	DEVANAGARI LETTER HA
+@		Various signs
+093C	DEVANAGARI SIGN NUKTA
+	* for extending the alphabet to new letters
+093D	DEVANAGARI SIGN AVAGRAHA
+@		Dependent vowel signs
+093E	DEVANAGARI VOWEL SIGN AA
+093F	DEVANAGARI VOWEL SIGN I
+	* stands to the left of the consonant
+0940	DEVANAGARI VOWEL SIGN II
+0941	DEVANAGARI VOWEL SIGN U
+0942	DEVANAGARI VOWEL SIGN UU
+0943	DEVANAGARI VOWEL SIGN VOCALIC R
+0944	DEVANAGARI VOWEL SIGN VOCALIC RR
+0945	DEVANAGARI VOWEL SIGN CANDRA E
+	= candra
+0946	DEVANAGARI VOWEL SIGN SHORT E
+	* for transcribing Dravidian vowels
+0947	DEVANAGARI VOWEL SIGN E
+0948	DEVANAGARI VOWEL SIGN AI
+0949	DEVANAGARI VOWEL SIGN CANDRA O
+094A	DEVANAGARI VOWEL SIGN SHORT O
+	* for transcribing Dravidian vowels
+094B	DEVANAGARI VOWEL SIGN O
+094C	DEVANAGARI VOWEL SIGN AU
+@		Various signs
+094D	DEVANAGARI SIGN VIRAMA
+	= halant (the preferred Hindi name)
+	* suppresses inherent vowel
+0950	DEVANAGARI OM
+0951	DEVANAGARI STRESS SIGN UDATTA
+	* mostly used for Rigvedic svarita, with rare use for Yajurvedic udatta
+0952	DEVANAGARI STRESS SIGN ANUDATTA
+0953	DEVANAGARI GRAVE ACCENT
+0954	DEVANAGARI ACUTE ACCENT
+@		Additional consonants
+0958	DEVANAGARI LETTER QA
+	: 0915 093C
+0959	DEVANAGARI LETTER KHHA
+	: 0916 093C
+095A	DEVANAGARI LETTER GHHA
+	: 0917 093C
+095B	DEVANAGARI LETTER ZA
+	: 091C 093C
+095C	DEVANAGARI LETTER DDDHA
+	: 0921 093C
+095D	DEVANAGARI LETTER RHA
+	: 0922 093C
+095E	DEVANAGARI LETTER FA
+	: 092B 093C
+095F	DEVANAGARI LETTER YYA
+	: 092F 093C
+@		Generic additions
+0960	DEVANAGARI LETTER VOCALIC RR
+0961	DEVANAGARI LETTER VOCALIC LL
+0962	DEVANAGARI VOWEL SIGN VOCALIC L
+0963	DEVANAGARI VOWEL SIGN VOCALIC LL
+0964	DEVANAGARI DANDA
+	= purna viram
+	* phrase separator
+0965	DEVANAGARI DOUBLE DANDA
+	= deergh viram
+@		Digits
+0966	DEVANAGARI DIGIT ZERO
+0967	DEVANAGARI DIGIT ONE
+0968	DEVANAGARI DIGIT TWO
+0969	DEVANAGARI DIGIT THREE
+096A	DEVANAGARI DIGIT FOUR
+096B	DEVANAGARI DIGIT FIVE
+096C	DEVANAGARI DIGIT SIX
+096D	DEVANAGARI DIGIT SEVEN
+096E	DEVANAGARI DIGIT EIGHT
+096F	DEVANAGARI DIGIT NINE
+@		Devanagari-specific additions
+0970	DEVANAGARI ABBREVIATION SIGN
+@		Glottal stop
+097D	DEVANAGARI LETTER GLOTTAL STOP
+	* used for writing Limbu in Devanagari
+	* a glyph variant has the connecting top bar
+@@	0980	Bengali	09FF
+@		Based on ISCII 1988
+@		Various signs
+0981	BENGALI SIGN CANDRABINDU
+0982	BENGALI SIGN ANUSVARA
+0983	BENGALI SIGN VISARGA
+@		Independent vowels
+0985	BENGALI LETTER A
+0986	BENGALI LETTER AA
+0987	BENGALI LETTER I
+0988	BENGALI LETTER II
+0989	BENGALI LETTER U
+098A	BENGALI LETTER UU
+098B	BENGALI LETTER VOCALIC R
+098C	BENGALI LETTER VOCALIC L
+098F	BENGALI LETTER E
+0990	BENGALI LETTER AI
+0993	BENGALI LETTER O
+0994	BENGALI LETTER AU
+@		Consonants
+0995	BENGALI LETTER KA
+0996	BENGALI LETTER KHA
+0997	BENGALI LETTER GA
+0998	BENGALI LETTER GHA
+0999	BENGALI LETTER NGA
+099A	BENGALI LETTER CA
+099B	BENGALI LETTER CHA
+099C	BENGALI LETTER JA
+099D	BENGALI LETTER JHA
+099E	BENGALI LETTER NYA
+099F	BENGALI LETTER TTA
+09A0	BENGALI LETTER TTHA
+09A1	BENGALI LETTER DDA
+09A2	BENGALI LETTER DDHA
+09A3	BENGALI LETTER NNA
+09A4	BENGALI LETTER TA
+09A5	BENGALI LETTER THA
+09A6	BENGALI LETTER DA
+09A7	BENGALI LETTER DHA
+09A8	BENGALI LETTER NA
+09AA	BENGALI LETTER PA
+09AB	BENGALI LETTER PHA
+09AC	BENGALI LETTER BA
+	= Bengali va, wa
+09AD	BENGALI LETTER BHA
+09AE	BENGALI LETTER MA
+09AF	BENGALI LETTER YA
+09B0	BENGALI LETTER RA
+09B2	BENGALI LETTER LA
+09B6	BENGALI LETTER SHA
+09B7	BENGALI LETTER SSA
+09B8	BENGALI LETTER SA
+09B9	BENGALI LETTER HA
+@		Various signs
+09BC	BENGALI SIGN NUKTA
+	* for extending the alphabet to new letters
+09BD	BENGALI SIGN AVAGRAHA
+@		Dependent vowel signs
+09BE	BENGALI VOWEL SIGN AA
+09BF	BENGALI VOWEL SIGN I
+	* stands to the left of the consonant
+09C0	BENGALI VOWEL SIGN II
+09C1	BENGALI VOWEL SIGN U
+09C2	BENGALI VOWEL SIGN UU
+09C3	BENGALI VOWEL SIGN VOCALIC R
+09C4	BENGALI VOWEL SIGN VOCALIC RR
+09C7	BENGALI VOWEL SIGN E
+	* stands to the left of the consonant
+09C8	BENGALI VOWEL SIGN AI
+	* stands to the left of the consonant
+@		Two-part dependent vowel signs
+@+		These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing.
+09CB	BENGALI VOWEL SIGN O
+	: 09C7 09BE
+09CC	BENGALI VOWEL SIGN AU
+	: 09C7 09D7
+@		Sign
+09CD	BENGALI SIGN VIRAMA
+	= hasant (Bengali term for halant)
+@		Additional consonant
+09CE	BENGALI LETTER KHANDA TA
+@		Sign
+09D7	BENGALI AU LENGTH MARK
+@		Additional consonants
+09DC	BENGALI LETTER RRA
+	: 09A1 09BC
+09DD	BENGALI LETTER RHA
+	: 09A2 09BC
+09DF	BENGALI LETTER YYA
+	: 09AF 09BC
+@		Generic additions
+09E0	BENGALI LETTER VOCALIC RR
+09E1	BENGALI LETTER VOCALIC LL
+09E2	BENGALI VOWEL SIGN VOCALIC L
+09E3	BENGALI VOWEL SIGN VOCALIC LL
+@		Digits
+09E6	BENGALI DIGIT ZERO
+09E7	BENGALI DIGIT ONE
+09E8	BENGALI DIGIT TWO
+09E9	BENGALI DIGIT THREE
+09EA	BENGALI DIGIT FOUR
+09EB	BENGALI DIGIT FIVE
+09EC	BENGALI DIGIT SIX
+09ED	BENGALI DIGIT SEVEN
+09EE	BENGALI DIGIT EIGHT
+09EF	BENGALI DIGIT NINE
+@		Bengali-specific additions
+09F0	BENGALI LETTER RA WITH MIDDLE DIAGONAL (Assamese)
+	* Assamese
+09F1	BENGALI LETTER RA WITH LOWER DIAGONAL (Assamese)
+	= BENGALI LETTER VA WITH LOWER DIAGONAL
+	* Assamese
+09F2	BENGALI RUPEE MARK
+09F3	BENGALI RUPEE SIGN
+09F4	BENGALI CURRENCY NUMERATOR ONE
+	* not in current usage
+09F5	BENGALI CURRENCY NUMERATOR TWO
+	* not in current usage
+09F6	BENGALI CURRENCY NUMERATOR THREE
+	* not in current usage
+09F7	BENGALI CURRENCY NUMERATOR FOUR
+09F8	BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9	BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA	BENGALI ISSHAR
+@@	0A00	Gurmukhi	0A7F
+@		Based on ISCII 1988
+@		Various signs
+0A01	GURMUKHI SIGN ADAK BINDI
+0A02	GURMUKHI SIGN BINDI
+0A03	GURMUKHI SIGN VISARGA
+@		Independent vowels
+0A05	GURMUKHI LETTER A
+0A06	GURMUKHI LETTER AA
+0A07	GURMUKHI LETTER I
+0A08	GURMUKHI LETTER II
+0A09	GURMUKHI LETTER U
+0A0A	GURMUKHI LETTER UU
+0A0F	GURMUKHI LETTER EE
+0A10	GURMUKHI LETTER AI
+0A13	GURMUKHI LETTER OO
+0A14	GURMUKHI LETTER AU
+@		Consonants
+0A15	GURMUKHI LETTER KA
+0A16	GURMUKHI LETTER KHA
+0A17	GURMUKHI LETTER GA
+0A18	GURMUKHI LETTER GHA
+0A19	GURMUKHI LETTER NGA
+0A1A	GURMUKHI LETTER CA
+0A1B	GURMUKHI LETTER CHA
+0A1C	GURMUKHI LETTER JA
+0A1D	GURMUKHI LETTER JHA
+0A1E	GURMUKHI LETTER NYA
+0A1F	GURMUKHI LETTER TTA
+0A20	GURMUKHI LETTER TTHA
+0A21	GURMUKHI LETTER DDA
+0A22	GURMUKHI LETTER DDHA
+0A23	GURMUKHI LETTER NNA
+0A24	GURMUKHI LETTER TA
+0A25	GURMUKHI LETTER THA
+0A26	GURMUKHI LETTER DA
+0A27	GURMUKHI LETTER DHA
+0A28	GURMUKHI LETTER NA
+0A2A	GURMUKHI LETTER PA
+0A2B	GURMUKHI LETTER PHA
+0A2C	GURMUKHI LETTER BA
+0A2D	GURMUKHI LETTER BHA
+0A2E	GURMUKHI LETTER MA
+0A2F	GURMUKHI LETTER YA
+0A30	GURMUKHI LETTER RA
+0A32	GURMUKHI LETTER LA
+0A33	GURMUKHI LETTER LLA
+	: 0A32 0A3C
+0A35	GURMUKHI LETTER VA
+0A36	GURMUKHI LETTER SHA
+	: 0A38 0A3C
+0A38	GURMUKHI LETTER SA
+0A39	GURMUKHI LETTER HA
+@		Various signs
+0A3C	GURMUKHI SIGN NUKTA
+	* for extending the alphabet to new letters
+@		Dependent vowel signs
+0A3E	GURMUKHI VOWEL SIGN AA
+0A3F	GURMUKHI VOWEL SIGN I
+	* stands to the left of the consonant
+0A40	GURMUKHI VOWEL SIGN II
+0A41	GURMUKHI VOWEL SIGN U
+0A42	GURMUKHI VOWEL SIGN UU
+0A47	GURMUKHI VOWEL SIGN EE
+0A48	GURMUKHI VOWEL SIGN AI
+0A4B	GURMUKHI VOWEL SIGN OO
+0A4C	GURMUKHI VOWEL SIGN AU
+@		Various signs
+0A4D	GURMUKHI SIGN VIRAMA
+@		Additional consonants
+0A59	GURMUKHI LETTER KHHA
+	: 0A16 0A3C
+0A5A	GURMUKHI LETTER GHHA
+	: 0A17 0A3C
+0A5B	GURMUKHI LETTER ZA
+	: 0A1C 0A3C
+0A5C	GURMUKHI LETTER RRA
+0A5E	GURMUKHI LETTER FA
+	: 0A2B 0A3C
+@		Digits
+0A66	GURMUKHI DIGIT ZERO
+0A67	GURMUKHI DIGIT ONE
+0A68	GURMUKHI DIGIT TWO
+0A69	GURMUKHI DIGIT THREE
+0A6A	GURMUKHI DIGIT FOUR
+0A6B	GURMUKHI DIGIT FIVE
+0A6C	GURMUKHI DIGIT SIX
+0A6D	GURMUKHI DIGIT SEVEN
+0A6E	GURMUKHI DIGIT EIGHT
+0A6F	GURMUKHI DIGIT NINE
+@		Gurmukhi-specific additions
+0A70	GURMUKHI TIPPI
+	* nasalization
+0A71	GURMUKHI ADDAK
+	* doubles following consonant
+0A72	GURMUKHI IRI
+	* base for vowels
+0A73	GURMUKHI URA
+	* base for vowels
+0A74	GURMUKHI EK ONKAR
+	* God is One
+@@	0A80	Gujarati	0AFF
+@		Based on ISCII 1988
+@		Various signs
+0A81	GUJARATI SIGN CANDRABINDU
+0A82	GUJARATI SIGN ANUSVARA
+0A83	GUJARATI SIGN VISARGA
+@		Independent vowels
+0A85	GUJARATI LETTER A
+0A86	GUJARATI LETTER AA
+0A87	GUJARATI LETTER I
+0A88	GUJARATI LETTER II
+0A89	GUJARATI LETTER U
+0A8A	GUJARATI LETTER UU
+0A8B	GUJARATI LETTER VOCALIC R
+0A8C	GUJARATI LETTER VOCALIC L
+	* used with Sanskrit text
+0A8D	GUJARATI VOWEL CANDRA E
+0A8F	GUJARATI LETTER E
+0A90	GUJARATI LETTER AI
+0A91	GUJARATI VOWEL CANDRA O
+0A93	GUJARATI LETTER O
+0A94	GUJARATI LETTER AU
+@		Consonants
+0A95	GUJARATI LETTER KA
+0A96	GUJARATI LETTER KHA
+0A97	GUJARATI LETTER GA
+0A98	GUJARATI LETTER GHA
+0A99	GUJARATI LETTER NGA
+0A9A	GUJARATI LETTER CA
+0A9B	GUJARATI LETTER CHA
+0A9C	GUJARATI LETTER JA
+0A9D	GUJARATI LETTER JHA
+0A9E	GUJARATI LETTER NYA
+0A9F	GUJARATI LETTER TTA
+0AA0	GUJARATI LETTER TTHA
+0AA1	GUJARATI LETTER DDA
+0AA2	GUJARATI LETTER DDHA
+0AA3	GUJARATI LETTER NNA
+0AA4	GUJARATI LETTER TA
+0AA5	GUJARATI LETTER THA
+0AA6	GUJARATI LETTER DA
+0AA7	GUJARATI LETTER DHA
+0AA8	GUJARATI LETTER NA
+0AAA	GUJARATI LETTER PA
+0AAB	GUJARATI LETTER PHA
+0AAC	GUJARATI LETTER BA
+0AAD	GUJARATI LETTER BHA
+0AAE	GUJARATI LETTER MA
+0AAF	GUJARATI LETTER YA
+0AB0	GUJARATI LETTER RA
+0AB2	GUJARATI LETTER LA
+0AB3	GUJARATI LETTER LLA
+0AB5	GUJARATI LETTER VA
+0AB6	GUJARATI LETTER SHA
+0AB7	GUJARATI LETTER SSA
+0AB8	GUJARATI LETTER SA
+0AB9	GUJARATI LETTER HA
+@		Various signs
+0ABC	GUJARATI SIGN NUKTA
+	* for extending the alphabet to new letters
+0ABD	GUJARATI SIGN AVAGRAHA
+@		Dependent vowel signs
+0ABE	GUJARATI VOWEL SIGN AA
+0ABF	GUJARATI VOWEL SIGN I
+	* stands to the left of the consonant
+0AC0	GUJARATI VOWEL SIGN II
+0AC1	GUJARATI VOWEL SIGN U
+0AC2	GUJARATI VOWEL SIGN UU
+0AC3	GUJARATI VOWEL SIGN VOCALIC R
+0AC4	GUJARATI VOWEL SIGN VOCALIC RR
+0AC5	GUJARATI VOWEL SIGN CANDRA E
+0AC7	GUJARATI VOWEL SIGN E
+0AC8	GUJARATI VOWEL SIGN AI
+0AC9	GUJARATI VOWEL SIGN CANDRA O
+0ACB	GUJARATI VOWEL SIGN O
+0ACC	GUJARATI VOWEL SIGN AU
+@		Various signs
+0ACD	GUJARATI SIGN VIRAMA
+0AD0	GUJARATI OM
+@		Generic addition
+0AE0	GUJARATI LETTER VOCALIC RR
+@		Additions for use with Sanskrit text
+0AE1	GUJARATI LETTER VOCALIC LL
+0AE2	GUJARATI VOWEL SIGN VOCALIC L
+0AE3	GUJARATI VOWEL SIGN VOCALIC LL
+@		Digits
+0AE6	GUJARATI DIGIT ZERO
+0AE7	GUJARATI DIGIT ONE
+0AE8	GUJARATI DIGIT TWO
+0AE9	GUJARATI DIGIT THREE
+0AEA	GUJARATI DIGIT FOUR
+0AEB	GUJARATI DIGIT FIVE
+0AEC	GUJARATI DIGIT SIX
+0AED	GUJARATI DIGIT SEVEN
+0AEE	GUJARATI DIGIT EIGHT
+0AEF	GUJARATI DIGIT NINE
+@		Currency sign
+0AF1	GUJARATI RUPEE SIGN
+@@	0B00	Oriya	0B7F
+@		Based on ISCII 1988
+@		Various signs
+0B01	ORIYA SIGN CANDRABINDU
+0B02	ORIYA SIGN ANUSVARA
+0B03	ORIYA SIGN VISARGA
+@		Independent vowels
+0B05	ORIYA LETTER A
+0B06	ORIYA LETTER AA
+0B07	ORIYA LETTER I
+0B08	ORIYA LETTER II
+0B09	ORIYA LETTER U
+0B0A	ORIYA LETTER UU
+0B0B	ORIYA LETTER VOCALIC R
+0B0C	ORIYA LETTER VOCALIC L
+0B0F	ORIYA LETTER E
+0B10	ORIYA LETTER AI
+0B13	ORIYA LETTER O
+0B14	ORIYA LETTER AU
+@		Consonants
+0B15	ORIYA LETTER KA
+0B16	ORIYA LETTER KHA
+0B17	ORIYA LETTER GA
+0B18	ORIYA LETTER GHA
+0B19	ORIYA LETTER NGA
+0B1A	ORIYA LETTER CA
+0B1B	ORIYA LETTER CHA
+0B1C	ORIYA LETTER JA
+0B1D	ORIYA LETTER JHA
+0B1E	ORIYA LETTER NYA
+0B1F	ORIYA LETTER TTA
+0B20	ORIYA LETTER TTHA
+0B21	ORIYA LETTER DDA
+0B22	ORIYA LETTER DDHA
+0B23	ORIYA LETTER NNA
+0B24	ORIYA LETTER TA
+0B25	ORIYA LETTER THA
+0B26	ORIYA LETTER DA
+0B27	ORIYA LETTER DHA
+0B28	ORIYA LETTER NA
+0B2A	ORIYA LETTER PA
+0B2B	ORIYA LETTER PHA
+0B2C	ORIYA LETTER BA
+	x (oriya letter va - 0B35)
+0B2D	ORIYA LETTER BHA
+0B2E	ORIYA LETTER MA
+0B2F	ORIYA LETTER YA
+	= ja
+0B30	ORIYA LETTER RA
+0B32	ORIYA LETTER LA
+0B33	ORIYA LETTER LLA
+0B35	ORIYA LETTER VA
+	x (oriya letter ba - 0B2C)
+0B36	ORIYA LETTER SHA
+0B37	ORIYA LETTER SSA
+0B38	ORIYA LETTER SA
+0B39	ORIYA LETTER HA
+@		Various signs
+0B3C	ORIYA SIGN NUKTA
+	* for extending the alphabet to new letters
+0B3D	ORIYA SIGN AVAGRAHA
+@		Dependent vowel signs
+0B3E	ORIYA VOWEL SIGN AA
+0B3F	ORIYA VOWEL SIGN I
+0B40	ORIYA VOWEL SIGN II
+0B41	ORIYA VOWEL SIGN U
+0B42	ORIYA VOWEL SIGN UU
+0B43	ORIYA VOWEL SIGN VOCALIC R
+0B47	ORIYA VOWEL SIGN E
+	* stands to the left of the consonant
+0B48	ORIYA VOWEL SIGN AI
+	* pieces left of and above the consonant
+	: 0B47 0B56
+@		Two-part dependent vowel signs
+@+		These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing.
+0B4B	ORIYA VOWEL SIGN O
+	: 0B47 0B3E
+0B4C	ORIYA VOWEL SIGN AU
+	: 0B47 0B57
+@		Various signs
+0B4D	ORIYA SIGN VIRAMA
+0B56	ORIYA AI LENGTH MARK
+0B57	ORIYA AU LENGTH MARK
+@		Additional consonants
+0B5C	ORIYA LETTER RRA
+	= dda
+	: 0B21 0B3C
+0B5D	ORIYA LETTER RHA
+	= ddha
+	: 0B22 0B3C
+0B5F	ORIYA LETTER YYA
+	= ya
+@		Generic additions
+0B60	ORIYA LETTER VOCALIC RR
+0B61	ORIYA LETTER VOCALIC LL
+@		Digits
+0B66	ORIYA DIGIT ZERO
+0B67	ORIYA DIGIT ONE
+0B68	ORIYA DIGIT TWO
+0B69	ORIYA DIGIT THREE
+0B6A	ORIYA DIGIT FOUR
+0B6B	ORIYA DIGIT FIVE
+0B6C	ORIYA DIGIT SIX
+0B6D	ORIYA DIGIT SEVEN
+0B6E	ORIYA DIGIT EIGHT
+0B6F	ORIYA DIGIT NINE
+@		Oriya-specific additions
+0B70	ORIYA ISSHAR
+0B71	ORIYA LETTER WA
+	x (oriya letter o - 0B13)
+	x (oriya letter va - 0B35)
+@@	0B80	Tamil	0BFF
+@		Based on ISCII 1988
+@		Various signs
+0B82	TAMIL SIGN ANUSVARA
+	* not used in Tamil
+0B83	TAMIL SIGN VISARGA
+	= aytham
+@		Independent vowels
+0B85	TAMIL LETTER A
+0B86	TAMIL LETTER AA
+0B87	TAMIL LETTER I
+0B88	TAMIL LETTER II
+0B89	TAMIL LETTER U
+0B8A	TAMIL LETTER UU
+0B8E	TAMIL LETTER E
+0B8F	TAMIL LETTER EE
+0B90	TAMIL LETTER AI
+0B92	TAMIL LETTER O
+0B93	TAMIL LETTER OO
+0B94	TAMIL LETTER AU
+	: 0B92 0BD7
+@		Consonants
+0B95	TAMIL LETTER KA
+0B99	TAMIL LETTER NGA
+0B9A	TAMIL LETTER CA
+0B9C	TAMIL LETTER JA
+0B9E	TAMIL LETTER NYA
+0B9F	TAMIL LETTER TTA
+0BA3	TAMIL LETTER NNA
+0BA4	TAMIL LETTER TA
+0BA8	TAMIL LETTER NA
+0BA9	TAMIL LETTER NNNA
+0BAA	TAMIL LETTER PA
+0BAE	TAMIL LETTER MA
+0BAF	TAMIL LETTER YA
+0BB0	TAMIL LETTER RA
+0BB1	TAMIL LETTER RRA
+0BB2	TAMIL LETTER LA
+0BB3	TAMIL LETTER LLA
+0BB4	TAMIL LETTER LLLA
+0BB5	TAMIL LETTER VA
+0BB6	TAMIL LETTER SHA
+0BB7	TAMIL LETTER SSA
+0BB8	TAMIL LETTER SA
+0BB9	TAMIL LETTER HA
+@		Dependent vowel signs
+0BBE	TAMIL VOWEL SIGN AA
+0BBF	TAMIL VOWEL SIGN I
+0BC0	TAMIL VOWEL SIGN II
+0BC1	TAMIL VOWEL SIGN U
+0BC2	TAMIL VOWEL SIGN UU
+0BC6	TAMIL VOWEL SIGN E
+	* stands to the left of the consonant
+0BC7	TAMIL VOWEL SIGN EE
+	* stands to the left of the consonant
+0BC8	TAMIL VOWEL SIGN AI
+	* stands to the left of the consonant
+@		Two-part dependent vowel signs
+@+		These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing.
+0BCA	TAMIL VOWEL SIGN O
+	: 0BC6 0BBE
+0BCB	TAMIL VOWEL SIGN OO
+	: 0BC7 0BBE
+0BCC	TAMIL VOWEL SIGN AU
+	: 0BC6 0BD7
+@		Various signs
+0BCD	TAMIL SIGN VIRAMA
+0BD7	TAMIL AU LENGTH MARK
+@		Digits
+0BE6	TAMIL DIGIT ZERO
+0BE7	TAMIL DIGIT ONE
+0BE8	TAMIL DIGIT TWO
+0BE9	TAMIL DIGIT THREE
+0BEA	TAMIL DIGIT FOUR
+0BEB	TAMIL DIGIT FIVE
+0BEC	TAMIL DIGIT SIX
+0BED	TAMIL DIGIT SEVEN
+0BEE	TAMIL DIGIT EIGHT
+0BEF	TAMIL DIGIT NINE
+@		Tamil numerics
+0BF0	TAMIL NUMBER TEN
+0BF1	TAMIL NUMBER ONE HUNDRED
+0BF2	TAMIL NUMBER ONE THOUSAND
+@		Tamil symbols
+0BF3	TAMIL DAY SIGN (Naal)
+0BF4	TAMIL MONTH SIGN (Maatham)
+0BF5	TAMIL YEAR SIGN (Varudam)
+0BF6	TAMIL DEBIT SIGN (Patru)
+0BF7	TAMIL CREDIT SIGN (Varavu)
+0BF8	TAMIL AS ABOVE SIGN (Merpadi)
+@		Currency symbol
+0BF9	TAMIL RUPEE SIGN (Rupai)
+@		Tamil symbol
+0BFA	TAMIL NUMBER SIGN (Enn)
+@@	0C00	Telugu	0C7F
+@		Based on ISCII 1988
+@		Various signs
+0C01	TELUGU SIGN CANDRABINDU
+0C02	TELUGU SIGN ANUSVARA
+	= sunna
+0C03	TELUGU SIGN VISARGA
+@		Independent vowels
+0C05	TELUGU LETTER A
+0C06	TELUGU LETTER AA
+0C07	TELUGU LETTER I
+0C08	TELUGU LETTER II
+0C09	TELUGU LETTER U
+0C0A	TELUGU LETTER UU
+0C0B	TELUGU LETTER VOCALIC R
+0C0C	TELUGU LETTER VOCALIC L
+0C0E	TELUGU LETTER E
+0C0F	TELUGU LETTER EE
+0C10	TELUGU LETTER AI
+0C12	TELUGU LETTER O
+0C13	TELUGU LETTER OO
+0C14	TELUGU LETTER AU
+@		Consonants
+0C15	TELUGU LETTER KA
+0C16	TELUGU LETTER KHA
+0C17	TELUGU LETTER GA
+0C18	TELUGU LETTER GHA
+0C19	TELUGU LETTER NGA
+0C1A	TELUGU LETTER CA
+0C1B	TELUGU LETTER CHA
+0C1C	TELUGU LETTER JA
+0C1D	TELUGU LETTER JHA
+0C1E	TELUGU LETTER NYA
+0C1F	TELUGU LETTER TTA
+0C20	TELUGU LETTER TTHA
+0C21	TELUGU LETTER DDA
+0C22	TELUGU LETTER DDHA
+0C23	TELUGU LETTER NNA
+0C24	TELUGU LETTER TA
+0C25	TELUGU LETTER THA
+0C26	TELUGU LETTER DA
+0C27	TELUGU LETTER DHA
+0C28	TELUGU LETTER NA
+0C2A	TELUGU LETTER PA
+0C2B	TELUGU LETTER PHA
+0C2C	TELUGU LETTER BA
+0C2D	TELUGU LETTER BHA
+0C2E	TELUGU LETTER MA
+0C2F	TELUGU LETTER YA
+0C30	TELUGU LETTER RA
+0C31	TELUGU LETTER RRA
+0C32	TELUGU LETTER LA
+0C33	TELUGU LETTER LLA
+0C35	TELUGU LETTER VA
+0C36	TELUGU LETTER SHA
+0C37	TELUGU LETTER SSA
+0C38	TELUGU LETTER SA
+0C39	TELUGU LETTER HA
+@		Dependent vowel signs
+0C3E	TELUGU VOWEL SIGN AA
+0C3F	TELUGU VOWEL SIGN I
+0C40	TELUGU VOWEL SIGN II
+0C41	TELUGU VOWEL SIGN U
+0C42	TELUGU VOWEL SIGN UU
+0C43	TELUGU VOWEL SIGN VOCALIC R
+0C44	TELUGU VOWEL SIGN VOCALIC RR
+0C46	TELUGU VOWEL SIGN E
+0C47	TELUGU VOWEL SIGN EE
+0C48	TELUGU VOWEL SIGN AI
+	: 0C46 0C56
+0C4A	TELUGU VOWEL SIGN O
+0C4B	TELUGU VOWEL SIGN OO
+0C4C	TELUGU VOWEL SIGN AU
+@		Various signs
+0C4D	TELUGU SIGN VIRAMA
+	= halant (the preferred name)
+0C55	TELUGU LENGTH MARK
+0C56	TELUGU AI LENGTH MARK
+@		Generic additions
+0C60	TELUGU LETTER VOCALIC RR
+0C61	TELUGU LETTER VOCALIC LL
+@		Digits
+0C66	TELUGU DIGIT ZERO
+0C67	TELUGU DIGIT ONE
+0C68	TELUGU DIGIT TWO
+0C69	TELUGU DIGIT THREE
+0C6A	TELUGU DIGIT FOUR
+0C6B	TELUGU DIGIT FIVE
+0C6C	TELUGU DIGIT SIX
+0C6D	TELUGU DIGIT SEVEN
+0C6E	TELUGU DIGIT EIGHT
+0C6F	TELUGU DIGIT NINE
+@@	0C80	Kannada	0CFF
+@		Based on ISCII 1988
+@		Various signs
+0C82	KANNADA SIGN ANUSVARA
+0C83	KANNADA SIGN VISARGA
+@		Independent vowels
+0C85	KANNADA LETTER A
+0C86	KANNADA LETTER AA
+0C87	KANNADA LETTER I
+0C88	KANNADA LETTER II
+0C89	KANNADA LETTER U
+0C8A	KANNADA LETTER UU
+0C8B	KANNADA LETTER VOCALIC R
+0C8C	KANNADA LETTER VOCALIC L
+0C8E	KANNADA LETTER E
+0C8F	KANNADA LETTER EE
+0C90	KANNADA LETTER AI
+0C92	KANNADA LETTER O
+0C93	KANNADA LETTER OO
+0C94	KANNADA LETTER AU
+@		Consonants
+0C95	KANNADA LETTER KA
+0C96	KANNADA LETTER KHA
+0C97	KANNADA LETTER GA
+0C98	KANNADA LETTER GHA
+0C99	KANNADA LETTER NGA
+0C9A	KANNADA LETTER CA
+0C9B	KANNADA LETTER CHA
+0C9C	KANNADA LETTER JA
+0C9D	KANNADA LETTER JHA
+0C9E	KANNADA LETTER NYA
+0C9F	KANNADA LETTER TTA
+0CA0	KANNADA LETTER TTHA
+0CA1	KANNADA LETTER DDA
+0CA2	KANNADA LETTER DDHA
+0CA3	KANNADA LETTER NNA
+0CA4	KANNADA LETTER TA
+0CA5	KANNADA LETTER THA
+0CA6	KANNADA LETTER DA
+0CA7	KANNADA LETTER DHA
+0CA8	KANNADA LETTER NA
+0CAA	KANNADA LETTER PA
+0CAB	KANNADA LETTER PHA
+0CAC	KANNADA LETTER BA
+0CAD	KANNADA LETTER BHA
+0CAE	KANNADA LETTER MA
+0CAF	KANNADA LETTER YA
+0CB0	KANNADA LETTER RA
+0CB1	KANNADA LETTER RRA
+0CB2	KANNADA LETTER LA
+0CB3	KANNADA LETTER LLA
+0CB5	KANNADA LETTER VA
+0CB6	KANNADA LETTER SHA
+0CB7	KANNADA LETTER SSA
+0CB8	KANNADA LETTER SA
+0CB9	KANNADA LETTER HA
+@		Various signs
+0CBC	KANNADA SIGN NUKTA
+0CBD	KANNADA SIGN AVAGRAHA
+@		Dependent vowel signs
+0CBE	KANNADA VOWEL SIGN AA
+0CBF	KANNADA VOWEL SIGN I
+0CC0	KANNADA VOWEL SIGN II
+	: 0CBF 0CD5
+0CC1	KANNADA VOWEL SIGN U
+0CC2	KANNADA VOWEL SIGN UU
+0CC3	KANNADA VOWEL SIGN VOCALIC R
+0CC4	KANNADA VOWEL SIGN VOCALIC RR
+0CC6	KANNADA VOWEL SIGN E
+0CC7	KANNADA VOWEL SIGN EE
+	: 0CC6 0CD5
+0CC8	KANNADA VOWEL SIGN AI
+	: 0CC6 0CD6
+0CCA	KANNADA VOWEL SIGN O
+	: 0CC6 0CC2
+0CCB	KANNADA VOWEL SIGN OO
+	: 0CCA 0CD5
+0CCC	KANNADA VOWEL SIGN AU
+@		Various signs
+0CCD	KANNADA SIGN VIRAMA
+	* preferred name is halant
+0CD5	KANNADA LENGTH MARK
+0CD6	KANNADA AI LENGTH MARK
+@		Additional consonants
+0CDE	KANNADA LETTER FA
+	* obsolete historic letter
+	* name is a mistake for LLLA
+@		Generic additions
+0CE0	KANNADA LETTER VOCALIC RR
+0CE1	KANNADA LETTER VOCALIC LL
+@		Digits
+0CE6	KANNADA DIGIT ZERO
+0CE7	KANNADA DIGIT ONE
+0CE8	KANNADA DIGIT TWO
+0CE9	KANNADA DIGIT THREE
+0CEA	KANNADA DIGIT FOUR
+0CEB	KANNADA DIGIT FIVE
+0CEC	KANNADA DIGIT SIX
+0CED	KANNADA DIGIT SEVEN
+0CEE	KANNADA DIGIT EIGHT
+0CEF	KANNADA DIGIT NINE
+@@	0D00	Malayalam	0D7F
+@		Based on ISCII 1988
+@		Various signs
+0D02	MALAYALAM SIGN ANUSVARA
+0D03	MALAYALAM SIGN VISARGA
+@		Independent vowels
+0D05	MALAYALAM LETTER A
+0D06	MALAYALAM LETTER AA
+0D07	MALAYALAM LETTER I
+0D08	MALAYALAM LETTER II
+0D09	MALAYALAM LETTER U
+0D0A	MALAYALAM LETTER UU
+0D0B	MALAYALAM LETTER VOCALIC R
+0D0C	MALAYALAM LETTER VOCALIC L
+0D0E	MALAYALAM LETTER E
+0D0F	MALAYALAM LETTER EE
+0D10	MALAYALAM LETTER AI
+0D12	MALAYALAM LETTER O
+0D13	MALAYALAM LETTER OO
+0D14	MALAYALAM LETTER AU
+@		Consonants
+@+		Alternate romanizations are shown as aliases for some letters to clarify their identity.
+0D15	MALAYALAM LETTER KA
+0D16	MALAYALAM LETTER KHA
+0D17	MALAYALAM LETTER GA
+0D18	MALAYALAM LETTER GHA
+0D19	MALAYALAM LETTER NGA
+0D1A	MALAYALAM LETTER CA
+	= cha
+0D1B	MALAYALAM LETTER CHA
+	= chha
+0D1C	MALAYALAM LETTER JA
+0D1D	MALAYALAM LETTER JHA
+0D1E	MALAYALAM LETTER NYA
+	= nha
+0D1F	MALAYALAM LETTER TTA
+	= ta
+0D20	MALAYALAM LETTER TTHA
+	= tta
+0D21	MALAYALAM LETTER DDA
+	= hard da
+0D22	MALAYALAM LETTER DDHA
+	= hard dda
+0D23	MALAYALAM LETTER NNA
+	= hard na
+0D24	MALAYALAM LETTER TA
+	= tha
+0D25	MALAYALAM LETTER THA
+	= ttha
+0D26	MALAYALAM LETTER DA
+	= soft da
+0D27	MALAYALAM LETTER DHA
+	= soft dda
+0D28	MALAYALAM LETTER NA
+0D2A	MALAYALAM LETTER PA
+0D2B	MALAYALAM LETTER PHA
+0D2C	MALAYALAM LETTER BA
+0D2D	MALAYALAM LETTER BHA
+0D2E	MALAYALAM LETTER MA
+0D2F	MALAYALAM LETTER YA
+0D30	MALAYALAM LETTER RA
+0D31	MALAYALAM LETTER RRA
+0D32	MALAYALAM LETTER LA
+0D33	MALAYALAM LETTER LLA
+0D34	MALAYALAM LETTER LLLA
+	= zha
+0D35	MALAYALAM LETTER VA
+0D36	MALAYALAM LETTER SHA
+	= soft sha
+0D37	MALAYALAM LETTER SSA
+	= sha
+0D38	MALAYALAM LETTER SA
+0D39	MALAYALAM LETTER HA
+@		Dependent vowel signs
+0D3E	MALAYALAM VOWEL SIGN AA
+0D3F	MALAYALAM VOWEL SIGN I
+0D40	MALAYALAM VOWEL SIGN II
+0D41	MALAYALAM VOWEL SIGN U
+0D42	MALAYALAM VOWEL SIGN UU
+0D43	MALAYALAM VOWEL SIGN VOCALIC R
+0D46	MALAYALAM VOWEL SIGN E
+	* stands to the left of the consonant
+0D47	MALAYALAM VOWEL SIGN EE
+	* stands to the left of the consonant
+0D48	MALAYALAM VOWEL SIGN AI
+	* stands to the left of the consonant
+@		Two-part dependent vowel signs
+@+		These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing.
+0D4A	MALAYALAM VOWEL SIGN O
+	: 0D46 0D3E
+0D4B	MALAYALAM VOWEL SIGN OO
+	: 0D47 0D3E
+0D4C	MALAYALAM VOWEL SIGN AU
+	: 0D46 0D57
+@		Various signs
+0D4D	MALAYALAM SIGN VIRAMA
+	= chandrakkala (the preferred name)
+	= vowel half-u
+0D57	MALAYALAM AU LENGTH MARK
+	* only a representation of the right half of 0D4C
+@		Generic additions
+0D60	MALAYALAM LETTER VOCALIC RR
+0D61	MALAYALAM LETTER VOCALIC LL
+@		Digits
+0D66	MALAYALAM DIGIT ZERO
+0D67	MALAYALAM DIGIT ONE
+0D68	MALAYALAM DIGIT TWO
+0D69	MALAYALAM DIGIT THREE
+0D6A	MALAYALAM DIGIT FOUR
+0D6B	MALAYALAM DIGIT FIVE
+0D6C	MALAYALAM DIGIT SIX
+0D6D	MALAYALAM DIGIT SEVEN
+0D6E	MALAYALAM DIGIT EIGHT
+0D6F	MALAYALAM DIGIT NINE
+@@	0D80	Sinhala	0DFF
+@		Various signs
+0D82	SINHALA SIGN ANUSVARAYA
+	= anusvara
+0D83	SINHALA SIGN VISARGAYA
+	= visarga
+@		Independent vowels
+0D85	SINHALA LETTER AYANNA
+	= sinhala letter a
+0D86	SINHALA LETTER AAYANNA
+	= sinhala letter aa
+0D87	SINHALA LETTER AEYANNA
+	= sinhala letter ae
+0D88	SINHALA LETTER AEEYANNA
+	= sinhala letter aae
+0D89	SINHALA LETTER IYANNA
+	= sinhala letter i
+0D8A	SINHALA LETTER IIYANNA
+	= sinhala letter ii
+0D8B	SINHALA LETTER UYANNA
+	= sinhala letter u
+0D8C	SINHALA LETTER UUYANNA
+	= sinhala letter uu
+0D8D	SINHALA LETTER IRUYANNA
+	= sinhala letter vocalic r
+0D8E	SINHALA LETTER IRUUYANNA
+	= sinhala letter vocalic rr
+0D8F	SINHALA LETTER ILUYANNA
+	= sinhala letter vocalic l
+0D90	SINHALA LETTER ILUUYANNA
+	= sinhala letter vocalic ll
+0D91	SINHALA LETTER EYANNA
+	= sinhala letter e
+0D92	SINHALA LETTER EEYANNA
+	= sinhala letter ee
+0D93	SINHALA LETTER AIYANNA
+	= sinhala letter ai
+0D94	SINHALA LETTER OYANNA
+	= sinhala letter o
+0D95	SINHALA LETTER OOYANNA
+	= sinhala letter oo
+0D96	SINHALA LETTER AUYANNA
+	= sinhala letter au
+@		Consonants
+0D9A	SINHALA LETTER ALPAPRAANA KAYANNA
+	= sinhala letter ka
+0D9B	SINHALA LETTER MAHAAPRAANA KAYANNA
+	= sinhala letter kha
+0D9C	SINHALA LETTER ALPAPRAANA GAYANNA
+	= sinhala letter ga
+0D9D	SINHALA LETTER MAHAAPRAANA GAYANNA
+	= sinhala letter gha
+0D9E	SINHALA LETTER KANTAJA NAASIKYAYA
+	= sinhala letter nga
+0D9F	SINHALA LETTER SANYAKA GAYANNA
+	= sinhala letter nnga
+0DA0	SINHALA LETTER ALPAPRAANA CAYANNA
+	= sinhala letter ca
+0DA1	SINHALA LETTER MAHAAPRAANA CAYANNA
+	= sinhala letter cha
+0DA2	SINHALA LETTER ALPAPRAANA JAYANNA
+	= sinhala letter ja
+0DA3	SINHALA LETTER MAHAAPRAANA JAYANNA
+	= sinhala letter jha
+0DA4	SINHALA LETTER TAALUJA NAASIKYAYA
+	= sinhala letter nya
+0DA5	SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+	= sinhala letter jnya
+0DA6	SINHALA LETTER SANYAKA JAYANNA
+	= sinhala letter nyja
+0DA7	SINHALA LETTER ALPAPRAANA TTAYANNA
+	= sinhala letter tta
+0DA8	SINHALA LETTER MAHAAPRAANA TTAYANNA
+	= sinhala letter ttha
+0DA9	SINHALA LETTER ALPAPRAANA DDAYANNA
+	= sinhala letter dda
+0DAA	SINHALA LETTER MAHAAPRAANA DDAYANNA
+	= sinhala letter ddha
+0DAB	SINHALA LETTER MUURDHAJA NAYANNA
+	= sinhala letter nna
+0DAC	SINHALA LETTER SANYAKA DDAYANNA
+	= sinhala letter nndda
+0DAD	SINHALA LETTER ALPAPRAANA TAYANNA
+	= sinhala letter ta
+0DAE	SINHALA LETTER MAHAAPRAANA TAYANNA
+	= sinhala letter tha
+0DAF	SINHALA LETTER ALPAPRAANA DAYANNA
+	= sinhala letter da
+0DB0	SINHALA LETTER MAHAAPRAANA DAYANNA
+	= sinhala letter dha
+0DB1	SINHALA LETTER DANTAJA NAYANNA
+	= sinhala letter na
+0DB3	SINHALA LETTER SANYAKA DAYANNA
+	= sinhala letter nda
+0DB4	SINHALA LETTER ALPAPRAANA PAYANNA
+	= sinhala letter pa
+0DB5	SINHALA LETTER MAHAAPRAANA PAYANNA
+	= sinhala letter pha
+0DB6	SINHALA LETTER ALPAPRAANA BAYANNA
+	= sinhala letter ba
+0DB7	SINHALA LETTER MAHAAPRAANA BAYANNA
+	= sinhala letter bha
+0DB8	SINHALA LETTER MAYANNA
+	= sinhala letter ma
+0DB9	SINHALA LETTER AMBA BAYANNA
+	= sinhala letter mba
+0DBA	SINHALA LETTER YAYANNA
+	= sinhala letter ya
+0DBB	SINHALA LETTER RAYANNA
+	= sinhala letter ra
+0DBD	SINHALA LETTER DANTAJA LAYANNA
+	= sinhala letter la
+	* dental
+0DC0	SINHALA LETTER VAYANNA
+	= sinhala letter va
+0DC1	SINHALA LETTER TAALUJA SAYANNA
+	= sinhala letter sha
+0DC2	SINHALA LETTER MUURDHAJA SAYANNA
+	= sinhala letter ssa
+	* retroflex
+0DC3	SINHALA LETTER DANTAJA SAYANNA
+	= sinhala letter sa
+	* dental
+0DC4	SINHALA LETTER HAYANNA
+	= sinhala letter ha
+0DC5	SINHALA LETTER MUURDHAJA LAYANNA
+	= sinhala letter lla
+	* retroflex
+0DC6	SINHALA LETTER FAYANNA
+	= sinhala letter fa
+@		Sign
+0DCA	SINHALA SIGN AL-LAKUNA
+	= virama
+@		Dependent vowel signs
+0DCF	SINHALA VOWEL SIGN AELA-PILLA
+	= sinhala vowel sign aa
+0DD0	SINHALA VOWEL SIGN KETTI AEDA-PILLA
+	= sinhala vowel sign ae
+0DD1	SINHALA VOWEL SIGN DIGA AEDA-PILLA
+	= sinhala vowel sign aae
+0DD2	SINHALA VOWEL SIGN KETTI IS-PILLA
+	= sinhala vowel sign i
+0DD3	SINHALA VOWEL SIGN DIGA IS-PILLA
+	= sinhala vowel sign ii
+0DD4	SINHALA VOWEL SIGN KETTI PAA-PILLA
+	= sinhala vowel sign u
+0DD6	SINHALA VOWEL SIGN DIGA PAA-PILLA
+	= sinhala vowel sign uu
+0DD8	SINHALA VOWEL SIGN GAETTA-PILLA
+	= sinhala vowel sign vocalic r
+0DD9	SINHALA VOWEL SIGN KOMBUVA
+	= sinhala vowel sign e
+0DDA	SINHALA VOWEL SIGN DIGA KOMBUVA
+	= sinhala vowel sign ee
+	: 0DD9 0DCA
+0DDB	SINHALA VOWEL SIGN KOMBU DEKA
+	= sinhala vowel sign ai
+@		Two-part dependent vowel signs
+@+		These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing.
+0DDC	SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+	= sinhala vowel sign o
+	: 0DD9 0DCF
+0DDD	SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+	= sinhala vowel sign oo
+	: 0DDC 0DCA
+0DDE	SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+	= sinhala vowel sign au
+	: 0DD9 0DDF
+@		Dependent vowel sign
+0DDF	SINHALA VOWEL SIGN GAYANUKITTA
+	= sinhala vowel sign vocalic l
+@		Additional dependent vowel signs
+0DF2	SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+	= sinhala vowel sign vocalic rr
+0DF3	SINHALA VOWEL SIGN DIGA GAYANUKITTA
+	= sinhala vowel sign vocalic ll
+@		Punctuation
+0DF4	SINHALA PUNCTUATION KUNDDALIYA
+@@	0E00	Thai	0E7F
+@		Based on TIS 620-2533
+@		Consonants
+0E01	THAI CHARACTER KO KAI
+0E02	THAI CHARACTER KHO KHAI
+0E03	THAI CHARACTER KHO KHUAT
+0E04	THAI CHARACTER KHO KHWAI
+0E05	THAI CHARACTER KHO KHON
+0E06	THAI CHARACTER KHO RAKHANG
+0E07	THAI CHARACTER NGO NGU
+0E08	THAI CHARACTER CHO CHAN
+0E09	THAI CHARACTER CHO CHING
+0E0A	THAI CHARACTER CHO CHANG
+0E0B	THAI CHARACTER SO SO
+0E0C	THAI CHARACTER CHO CHOE
+0E0D	THAI CHARACTER YO YING
+0E0E	THAI CHARACTER DO CHADA
+0E0F	THAI CHARACTER TO PATAK
+0E10	THAI CHARACTER THO THAN
+0E11	THAI CHARACTER THO NANGMONTHO
+0E12	THAI CHARACTER THO PHUTHAO
+0E13	THAI CHARACTER NO NEN
+0E14	THAI CHARACTER DO DEK
+0E15	THAI CHARACTER TO TAO
+0E16	THAI CHARACTER THO THUNG
+0E17	THAI CHARACTER THO THAHAN
+0E18	THAI CHARACTER THO THONG
+0E19	THAI CHARACTER NO NU
+0E1A	THAI CHARACTER BO BAIMAI
+0E1B	THAI CHARACTER PO PLA
+0E1C	THAI CHARACTER PHO PHUNG
+0E1D	THAI CHARACTER FO FA
+0E1E	THAI CHARACTER PHO PHAN
+0E1F	THAI CHARACTER FO FAN
+0E20	THAI CHARACTER PHO SAMPHAO
+0E21	THAI CHARACTER MO MA
+0E22	THAI CHARACTER YO YAK
+0E23	THAI CHARACTER RO RUA
+0E24	THAI CHARACTER RU
+	* independent vowel letter used to write Sanskrit
+0E25	THAI CHARACTER LO LING
+0E26	THAI CHARACTER LU
+	* independent vowel letter used to write Sanskrit
+0E27	THAI CHARACTER WO WAEN
+0E28	THAI CHARACTER SO SALA
+0E29	THAI CHARACTER SO RUSI
+0E2A	THAI CHARACTER SO SUA
+0E2B	THAI CHARACTER HO HIP
+0E2C	THAI CHARACTER LO CHULA
+0E2D	THAI CHARACTER O ANG
+0E2E	THAI CHARACTER HO NOKHUK
+	= ho nok huk
+@		Sign
+0E2F	THAI CHARACTER PAIYANNOI (paiyan noi)
+	= paiyan noi
+	* ellipsis, abbreviation
+@		Vowels
+0E30	THAI CHARACTER SARA A
+0E31	THAI CHARACTER MAI HAN-AKAT
+0E32	THAI CHARACTER SARA AA
+	x (thai character lakkhangyao - 0E45)
+0E33	THAI CHARACTER SARA AM
+	# 0E4D 0E32
+0E34	THAI CHARACTER SARA I
+0E35	THAI CHARACTER SARA II
+0E36	THAI CHARACTER SARA UE
+0E37	THAI CHARACTER SARA UEE (sara uue)
+	= sara uue
+0E38	THAI CHARACTER SARA U
+0E39	THAI CHARACTER SARA UU
+0E3A	THAI CHARACTER PHINTHU
+	* Pali virama
+@		Currency symbol
+0E3F	THAI CURRENCY SYMBOL BAHT
+@		Vowels
+0E40	THAI CHARACTER SARA E
+0E41	THAI CHARACTER SARA AE
+0E42	THAI CHARACTER SARA O
+0E43	THAI CHARACTER SARA AI MAIMUAN (sara ai mai muan)
+	= sara ai mai muan
+0E44	THAI CHARACTER SARA AI MAIMALAI (sara ai mai malai)
+	= sara ai mai malai
+0E45	THAI CHARACTER LAKKHANGYAO (lakkhang yao)
+	= lakkhang yao
+	* special vowel length indication used with 0E24 or 0E26
+	x (thai character sara aa - 0E32)
+@		Sign
+0E46	THAI CHARACTER MAIYAMOK (mai yamok)
+	= mai yamok
+	* repetition
+@		Vowel
+0E47	THAI CHARACTER MAITAIKHU (mai taikhu)
+	= mai taikhu
+@		Tone marks
+0E48	THAI CHARACTER MAI EK
+0E49	THAI CHARACTER MAI THO
+0E4A	THAI CHARACTER MAI TRI
+0E4B	THAI CHARACTER MAI CHATTAWA
+@		Signs
+0E4C	THAI CHARACTER THANTHAKHAT
+	* cancellation mark
+0E4D	THAI CHARACTER NIKHAHIT (nikkhahit)
+	= nikkhahit
+	* final nasal
+0E4E	THAI CHARACTER YAMAKKAN
+0E4F	THAI CHARACTER FONGMAN
+	* used as a bullet
+	x (khmer sign phnaek muan - 17D9)
+@		Digits
+0E50	THAI DIGIT ZERO
+0E51	THAI DIGIT ONE
+0E52	THAI DIGIT TWO
+0E53	THAI DIGIT THREE
+0E54	THAI DIGIT FOUR
+0E55	THAI DIGIT FIVE
+0E56	THAI DIGIT SIX
+0E57	THAI DIGIT SEVEN
+0E58	THAI DIGIT EIGHT
+0E59	THAI DIGIT NINE
+@		Signs
+0E5A	THAI CHARACTER ANGKHANKHU
+	* used to mark end of long sections
+	* used in combination with 0E30 to mark end of a verse
+0E5B	THAI CHARACTER KHOMUT
+	* used to mark end of chapter or document
+	x (khmer sign koomuut - 17DA)
+@@	0E80	Lao	0EFF
+@		Based on TIS 620-2529
+@		Consonants
+0E81	LAO LETTER KO
+0E82	LAO LETTER KHO SUNG
+0E84	LAO LETTER KHO TAM
+0E87	LAO LETTER NGO
+0E88	LAO LETTER CO
+0E8A	LAO LETTER SO TAM
+0E8D	LAO LETTER NYO
+0E94	LAO LETTER DO
+0E95	LAO LETTER TO
+0E96	LAO LETTER THO SUNG
+0E97	LAO LETTER THO TAM
+0E99	LAO LETTER NO
+0E9A	LAO LETTER BO
+0E9B	LAO LETTER PO
+0E9C	LAO LETTER PHO SUNG
+0E9D	LAO LETTER FO TAM
+0E9E	LAO LETTER PHO TAM
+0E9F	LAO LETTER FO SUNG
+0EA1	LAO LETTER MO
+0EA2	LAO LETTER YO
+0EA3	LAO LETTER LO LING
+0EA5	LAO LETTER LO LOOT
+0EA7	LAO LETTER WO
+0EAA	LAO LETTER SO SUNG
+0EAB	LAO LETTER HO SUNG
+0EAD	LAO LETTER O
+0EAE	LAO LETTER HO TAM
+@		Sign
+0EAF	LAO ELLIPSIS
+@		Vowels
+0EB0	LAO VOWEL SIGN A
+0EB1	LAO VOWEL SIGN MAI KAN
+	* vowel shortener
+0EB2	LAO VOWEL SIGN AA
+0EB3	LAO VOWEL SIGN AM
+	# 0ECD 0EB2
+0EB4	LAO VOWEL SIGN I
+0EB5	LAO VOWEL SIGN II
+0EB6	LAO VOWEL SIGN Y
+0EB7	LAO VOWEL SIGN YY
+0EB8	LAO VOWEL SIGN U
+0EB9	LAO VOWEL SIGN UU
+0EBB	LAO VOWEL SIGN MAI KON
+@		Signs
+0EBC	LAO SEMIVOWEL SIGN LO
+0EBD	LAO SEMIVOWEL SIGN NYO
+@		Vowels
+0EC0	LAO VOWEL SIGN E
+0EC1	LAO VOWEL SIGN EI
+0EC2	LAO VOWEL SIGN O
+0EC3	LAO VOWEL SIGN AY
+0EC4	LAO VOWEL SIGN AI
+@		Sign
+0EC6	LAO KO LA
+	* repetition
+@		Tone marks
+0EC8	LAO TONE MAI EK
+0EC9	LAO TONE MAI THO
+0ECA	LAO TONE MAI TI
+0ECB	LAO TONE MAI CATAWA
+@		Signs
+0ECC	LAO CANCELLATION MARK
+0ECD	LAO NIGGAHITA
+	* final nasal
+@		Digits
+0ED0	LAO DIGIT ZERO
+0ED1	LAO DIGIT ONE
+0ED2	LAO DIGIT TWO
+0ED3	LAO DIGIT THREE
+0ED4	LAO DIGIT FOUR
+0ED5	LAO DIGIT FIVE
+0ED6	LAO DIGIT SIX
+0ED7	LAO DIGIT SEVEN
+0ED8	LAO DIGIT EIGHT
+0ED9	LAO DIGIT NINE
+@		Digraphs
+0EDC	LAO HO NO
+	# 0EAB 0E99
+0EDD	LAO HO MO
+	# 0EAB 0EA1
+@@	0F00	Tibetan	0FFF
+@		Syllable
+0F00	TIBETAN SYLLABLE OM
+@		Head marks
+0F01	TIBETAN MARK GTER YIG MGO TRUNCATED A (ter yik go a thung)
+0F02	TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA (ter yik go wum nam chey ma)
+0F03	TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA (ter yik go wum ter tsek ma)
+0F04	TIBETAN MARK INITIAL YIG MGO MDUN MA (yik go dun ma)
+	* honorific; marks beginning of text or start of new folio
+	x (mongolian birga - 1800)
+0F05	TIBETAN MARK CLOSING YIG MGO SGAB MA (yik go kab ma)
+	* follows and ligates with initial yig-mgo
+0F06	TIBETAN MARK CARET YIG MGO PHUR SHAD MA (yik go pur shey ma)
+0F07	TIBETAN MARK YIG MGO TSHEG SHAD MA (yik go tsek shey ma)
+@		Marks and signs
+0F08	TIBETAN MARK SBRUL SHAD (drul shey)
+	* separates sections of meaning equivalent to topics and sub-topics
+0F09	TIBETAN MARK BSKUR YIG MGO (kur yik go)
+	* list enumerator, used in Bhutan
+0F0A	TIBETAN MARK BKA- SHOG YIG MGO (ka sho yik go)
+	* petition honorific, used in Bhutan
+0F0B	TIBETAN MARK INTERSYLLABIC TSHEG (tsek)
+	* morpheme delimiter (approximate meaning)
+	* the normal tsheg; provides a break opportunity
+	* character name is a misnomer
+0F0C	TIBETAN MARK DELIMITER TSHEG BSTAR (tsek tar)
+	* a non-breaking tsheg; inhibits line breaking
+	* character name is a misnomer
+	# <noBreak> 0F0B
+0F0D	TIBETAN MARK SHAD (shey)
+	* marks end of a section of text (tshig-grub)
+	x (devanagari danda - 0964)
+0F0E	TIBETAN MARK NYIS SHAD (nyi shey)
+	* marks end of a whole topic (don-tshan)
+	x (devanagari double danda - 0965)
+0F0F	TIBETAN MARK TSHEG SHAD (tsek shey)
+0F10	TIBETAN MARK NYIS TSHEG SHAD (nyi tsek shey)
+0F11	TIBETAN MARK RIN CHEN SPUNGS SHAD (rinchen pung shey)
+	* shad which follows a tsheg-bar that starts a new line
+0F12	TIBETAN MARK RGYA GRAM SHAD (gya tram shey)
+0F13	TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN (dzu ta me long chen)
+0F14	TIBETAN MARK GTER TSHEG (ter tsek)
+	* used as a comma-like text delimiter
+	x (khmer sign camnuc pii kuuh - 17D6)
+@		Astrological signs
+0F15	TIBETAN LOGOTYPE SIGN CHAD RTAGS (che ta)
+0F16	TIBETAN LOGOTYPE SIGN LHAG RTAGS (hlak ta)
+0F17	TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS (trachen char ta)
+0F18	TIBETAN ASTROLOGICAL SIGN -KHYUD PA (kyu pa)
+	* combines with digits
+0F19	TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS (dong tsu)
+	* combines with digits
+0F1A	TIBETAN SIGN RDEL DKAR GCIG (deka chig)
+0F1B	TIBETAN SIGN RDEL DKAR GNYIS (deka nyi)
+0F1C	TIBETAN SIGN RDEL DKAR GSUM (deka sum)
+0F1D	TIBETAN SIGN RDEL NAG GCIG (dena chig)
+0F1E	TIBETAN SIGN RDEL NAG GNYIS (dena nyi)
+0F1F	TIBETAN SIGN RDEL DKAR RDEL NAG (deka dena)
+@		Digits
+0F20	TIBETAN DIGIT ZERO
+0F21	TIBETAN DIGIT ONE
+0F22	TIBETAN DIGIT TWO
+0F23	TIBETAN DIGIT THREE
+0F24	TIBETAN DIGIT FOUR
+0F25	TIBETAN DIGIT FIVE
+0F26	TIBETAN DIGIT SIX
+0F27	TIBETAN DIGIT SEVEN
+0F28	TIBETAN DIGIT EIGHT
+0F29	TIBETAN DIGIT NINE
+@		Digits minus half
+0F2A	TIBETAN DIGIT HALF ONE
+0F2B	TIBETAN DIGIT HALF TWO
+0F2C	TIBETAN DIGIT HALF THREE
+0F2D	TIBETAN DIGIT HALF FOUR
+0F2E	TIBETAN DIGIT HALF FIVE
+0F2F	TIBETAN DIGIT HALF SIX
+0F30	TIBETAN DIGIT HALF SEVEN
+0F31	TIBETAN DIGIT HALF EIGHT
+0F32	TIBETAN DIGIT HALF NINE
+0F33	TIBETAN DIGIT HALF ZERO
+@		Marks and signs
+0F34	TIBETAN MARK BSDUS RTAGS (du ta)
+	* repetition
+0F35	TIBETAN MARK NGAS BZUNG NYI ZLA (nge zung nyi da)
+	* honorific, emphasis; used like underlining
+0F36	TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN (dzu ta shi mig chen)
+	* marks point of text insertion or annotation
+0F37	TIBETAN MARK NGAS BZUNG SGOR RTAGS (nge zung gor ta)
+	* emphasis; used like underlining
+0F38	TIBETAN MARK CHE MGO (che go)
+0F39	TIBETAN MARK TSA -PHRU (tsa tru)
+	* a lenition mark
+@		Paired punctuation
+0F3A	TIBETAN MARK GUG RTAGS GYON (gug ta yun)
+0F3B	TIBETAN MARK GUG RTAGS GYAS (gug ta ye)
+	* brackets
+0F3C	TIBETAN MARK ANG KHANG GYON (ang kang yun)
+0F3D	TIBETAN MARK ANG KHANG GYAS (ang kang ye)
+	* used for bracketing with a roof over
+@		Astrological signs
+0F3E	TIBETAN SIGN YAR TSHES (yar tse)
+0F3F	TIBETAN SIGN MAR TSHES (mar tse)
+	* marks which combine with digits
+@		Consonants
+0F40	TIBETAN LETTER KA
+0F41	TIBETAN LETTER KHA
+0F42	TIBETAN LETTER GA
+0F43	TIBETAN LETTER GHA
+	: 0F42 0FB7
+0F44	TIBETAN LETTER NGA
+0F45	TIBETAN LETTER CA
+0F46	TIBETAN LETTER CHA
+0F47	TIBETAN LETTER JA
+0F49	TIBETAN LETTER NYA
+0F4A	TIBETAN LETTER TTA
+0F4B	TIBETAN LETTER TTHA
+0F4C	TIBETAN LETTER DDA
+0F4D	TIBETAN LETTER DDHA
+	: 0F4C 0FB7
+0F4E	TIBETAN LETTER NNA
+0F4F	TIBETAN LETTER TA
+0F50	TIBETAN LETTER THA
+0F51	TIBETAN LETTER DA
+0F52	TIBETAN LETTER DHA
+	: 0F51 0FB7
+0F53	TIBETAN LETTER NA
+0F54	TIBETAN LETTER PA
+0F55	TIBETAN LETTER PHA
+0F56	TIBETAN LETTER BA
+0F57	TIBETAN LETTER BHA
+	: 0F56 0FB7
+0F58	TIBETAN LETTER MA
+0F59	TIBETAN LETTER TSA
+0F5A	TIBETAN LETTER TSHA
+0F5B	TIBETAN LETTER DZA
+0F5C	TIBETAN LETTER DZHA
+	: 0F5B 0FB7
+0F5D	TIBETAN LETTER WA
+0F5E	TIBETAN LETTER ZHA
+0F5F	TIBETAN LETTER ZA
+0F60	TIBETAN LETTER -A
+0F61	TIBETAN LETTER YA
+0F62	TIBETAN LETTER RA *
+	* when followed by a subjoined letter = ra mgo
+0F63	TIBETAN LETTER LA
+0F64	TIBETAN LETTER SHA
+0F65	TIBETAN LETTER SSA
+	= reversed sha
+0F66	TIBETAN LETTER SA
+0F67	TIBETAN LETTER HA
+0F68	TIBETAN LETTER A
+	* base for dependent vowels
+0F69	TIBETAN LETTER KSSA
+	: 0F40 0FB5
+0F6A	TIBETAN LETTER FIXED-FORM RA *
+	* used only in transliteration and transcription
+@		Dependent vowel signs
+0F71	TIBETAN VOWEL SIGN AA
+	= a-chung
+	* common, vowel-lengthening mark
+0F72	TIBETAN VOWEL SIGN I
+0F73	TIBETAN VOWEL SIGN II
+	* use of this character is discouraged
+	: 0F71 0F72
+0F74	TIBETAN VOWEL SIGN U
+0F75	TIBETAN VOWEL SIGN UU
+	* use of this character is discouraged
+	: 0F71 0F74
+0F76	TIBETAN VOWEL SIGN VOCALIC R
+	: 0FB2 0F80
+0F77	TIBETAN VOWEL SIGN VOCALIC RR
+	* use of this character is strongly discouraged
+	# 0FB2 0F81
+0F78	TIBETAN VOWEL SIGN VOCALIC L
+	: 0FB3 0F80
+0F79	TIBETAN VOWEL SIGN VOCALIC LL
+	* use of this character is strongly discouraged
+	# 0FB3 0F81
+0F7A	TIBETAN VOWEL SIGN E
+0F7B	TIBETAN VOWEL SIGN EE
+0F7C	TIBETAN VOWEL SIGN O
+0F7D	TIBETAN VOWEL SIGN OO
+@		Vocalic modification
+0F7E	TIBETAN SIGN RJES SU NGA RO (je su nga ro)
+	= anusvara
+0F7F	TIBETAN SIGN RNAM BCAD (nam chey)
+	= visarga
+@		Dependent vowel signs
+0F80	TIBETAN VOWEL SIGN REVERSED I
+0F81	TIBETAN VOWEL SIGN REVERSED II
+	* use of this character is discouraged
+	: 0F71 0F80
+@		Marks and signs
+0F82	TIBETAN SIGN NYI ZLA NAA DA (nyi da na da)
+0F83	TIBETAN SIGN SNA LDAN (nan de)
+	x (devanagari sign candrabindu - 0901)
+0F84	TIBETAN MARK HALANTA
+	= srog med
+	x (devanagari sign virama - 094D)
+0F85	TIBETAN MARK PALUTA
+	* transliteration of Sanskrit avagraha
+	x (devanagari sign avagraha - 093D)
+0F86	TIBETAN SIGN LCI RTAGS (ji ta)
+0F87	TIBETAN SIGN YANG RTAGS (yang ta)
+@		Transliteration head letters
+0F88	TIBETAN SIGN LCE TSA CAN (che tsa chen)
+0F89	TIBETAN SIGN MCHU CAN (chu chen)
+0F8A	TIBETAN SIGN GRU CAN RGYINGS (tru chen ging)
+	* always followed by 0F82
+0F8B	TIBETAN SIGN GRU MED RGYINGS (tru me ging)
+@		Subjoined consonants
+0F90	TIBETAN SUBJOINED LETTER KA
+0F91	TIBETAN SUBJOINED LETTER KHA
+0F92	TIBETAN SUBJOINED LETTER GA
+0F93	TIBETAN SUBJOINED LETTER GHA
+	: 0F92 0FB7
+0F94	TIBETAN SUBJOINED LETTER NGA
+0F95	TIBETAN SUBJOINED LETTER CA
+0F96	TIBETAN SUBJOINED LETTER CHA
+0F97	TIBETAN SUBJOINED LETTER JA
+0F99	TIBETAN SUBJOINED LETTER NYA
+0F9A	TIBETAN SUBJOINED LETTER TTA
+0F9B	TIBETAN SUBJOINED LETTER TTHA
+0F9C	TIBETAN SUBJOINED LETTER DDA
+0F9D	TIBETAN SUBJOINED LETTER DDHA
+	: 0F9C 0FB7
+0F9E	TIBETAN SUBJOINED LETTER NNA
+0F9F	TIBETAN SUBJOINED LETTER TA
+0FA0	TIBETAN SUBJOINED LETTER THA
+0FA1	TIBETAN SUBJOINED LETTER DA
+0FA2	TIBETAN SUBJOINED LETTER DHA
+	: 0FA1 0FB7
+0FA3	TIBETAN SUBJOINED LETTER NA
+0FA4	TIBETAN SUBJOINED LETTER PA
+0FA5	TIBETAN SUBJOINED LETTER PHA
+0FA6	TIBETAN SUBJOINED LETTER BA
+0FA7	TIBETAN SUBJOINED LETTER BHA
+	: 0FA6 0FB7
+0FA8	TIBETAN SUBJOINED LETTER MA
+0FA9	TIBETAN SUBJOINED LETTER TSA
+0FAA	TIBETAN SUBJOINED LETTER TSHA
+0FAB	TIBETAN SUBJOINED LETTER DZA
+0FAC	TIBETAN SUBJOINED LETTER DZHA
+	: 0FAB 0FB7
+0FAD	TIBETAN SUBJOINED LETTER WA *
+	= wa-zur, wa-btags
+0FAE	TIBETAN SUBJOINED LETTER ZHA
+0FAF	TIBETAN SUBJOINED LETTER ZA
+0FB0	TIBETAN SUBJOINED LETTER -A
+	= a-chung
+	* rare, only used for full-sized subjoined letter
+	x (tibetan vowel sign aa - 0F71)
+0FB1	TIBETAN SUBJOINED LETTER YA *
+	= ya-btags
+0FB2	TIBETAN SUBJOINED LETTER RA *
+	= ra-btags
+0FB3	TIBETAN SUBJOINED LETTER LA
+0FB4	TIBETAN SUBJOINED LETTER SHA
+0FB5	TIBETAN SUBJOINED LETTER SSA
+	= reversed subjoined sha
+0FB6	TIBETAN SUBJOINED LETTER SA
+0FB7	TIBETAN SUBJOINED LETTER HA
+0FB8	TIBETAN SUBJOINED LETTER A
+0FB9	TIBETAN SUBJOINED LETTER KSSA
+	: 0F90 0FB5
+@		Fixed-form subjoined consonants
+@+		These characters are used only for transliteration and transcription.
+0FBA	TIBETAN SUBJOINED LETTER FIXED-FORM WA *
+0FBB	TIBETAN SUBJOINED LETTER FIXED-FORM YA *
+0FBC	TIBETAN SUBJOINED LETTER FIXED-FORM RA *
+@		Signs
+0FBE	TIBETAN KU RU KHA (kuruka)
+	* often repeated three times; indicates a refrain
+0FBF	TIBETAN KU RU KHA BZHI MIG CAN (kuruka shi mik chen)
+	* marks point of text insertion or annotation
+	x (reference mark - 203B)
+@		Cantillation signs
+0FC0	TIBETAN CANTILLATION SIGN HEAVY BEAT
+	* marks a heavy drum beat
+0FC1	TIBETAN CANTILLATION SIGN LIGHT BEAT
+	* marks a light drum beat
+0FC2	TIBETAN CANTILLATION SIGN CANG TE-U (chang tyu)
+	* symbol of a small Tibetan hand drum
+0FC3	TIBETAN CANTILLATION SIGN SBUB -CHAL (bub chey)
+	* symbol of a Tibetan cymbal
+@		Symbols
+0FC4	TIBETAN SYMBOL DRIL BU (drilbu)
+	* symbol of a Tibetan hand bell
+0FC5	TIBETAN SYMBOL RDO RJE (dorje)
+0FC6	TIBETAN SYMBOL PADMA GDAN (pema den)
+0FC7	TIBETAN SYMBOL RDO RJE RGYA GRAM (dorje gya dram)
+0FC8	TIBETAN SYMBOL PHUR PA (phurba)
+0FC9	TIBETAN SYMBOL NOR BU (norbu)
+0FCA	TIBETAN SYMBOL NOR BU NYIS -KHYIL (norbu nyi khyi)
+	* the double body symbol
+	x (yin yang - 262F)
+0FCB	TIBETAN SYMBOL NOR BU GSUM -KHYIL (norbu sum khyi)
+	* the tri-kaya or triple body symbol
+0FCC	TIBETAN SYMBOL NOR BU BZHI -KHYIL (norbu shi khyi)
+	* the quadruple body symbol, a form of the swastika
+	x (cjk unified ideograph-534D - 534D)
+@		Astrological sign
+0FCF	TIBETAN SIGN RDEL NAG GSUM (dena sum)
+@		Marks
+0FD0	TIBETAN MARK BSKA- SHOG GI MGO RGYAN (ka shog gi go gyen)
+	* used in Bhutan
+0FD1	TIBETAN MARK MNYAM YIG GI MGO RGYAN (nyam yig gi go gyen)
+	* used in Bhutan
+@@	1000	Myanmar	109F
+@		Consonants
+1000	MYANMAR LETTER KA
+1001	MYANMAR LETTER KHA
+1002	MYANMAR LETTER GA
+1003	MYANMAR LETTER GHA
+1004	MYANMAR LETTER NGA
+1005	MYANMAR LETTER CA
+1006	MYANMAR LETTER CHA
+1007	MYANMAR LETTER JA
+1008	MYANMAR LETTER JHA
+1009	MYANMAR LETTER NYA
+100A	MYANMAR LETTER NNYA
+100B	MYANMAR LETTER TTA
+100C	MYANMAR LETTER TTHA
+100D	MYANMAR LETTER DDA
+100E	MYANMAR LETTER DDHA
+100F	MYANMAR LETTER NNA
+1010	MYANMAR LETTER TA
+1011	MYANMAR LETTER THA
+1012	MYANMAR LETTER DA
+1013	MYANMAR LETTER DHA
+1014	MYANMAR LETTER NA
+1015	MYANMAR LETTER PA
+1016	MYANMAR LETTER PHA
+1017	MYANMAR LETTER BA
+1018	MYANMAR LETTER BHA
+1019	MYANMAR LETTER MA
+101A	MYANMAR LETTER YA
+101B	MYANMAR LETTER RA
+101C	MYANMAR LETTER LA
+101D	MYANMAR LETTER WA
+101E	MYANMAR LETTER SA
+101F	MYANMAR LETTER HA
+1020	MYANMAR LETTER LLA
+@		Independent vowels
+1021	MYANMAR LETTER A
+	* also represents the glottal stop as a consonant
+1023	MYANMAR LETTER I
+1024	MYANMAR LETTER II
+1025	MYANMAR LETTER U
+1026	MYANMAR LETTER UU
+	: 1025 102E
+1027	MYANMAR LETTER E
+1029	MYANMAR LETTER O
+102A	MYANMAR LETTER AU
+@		Dependent vowel signs
+102C	MYANMAR VOWEL SIGN AA
+102D	MYANMAR VOWEL SIGN I
+102E	MYANMAR VOWEL SIGN II
+102F	MYANMAR VOWEL SIGN U
+1030	MYANMAR VOWEL SIGN UU
+1031	MYANMAR VOWEL SIGN E
+	* stands to the left of the consonant
+1032	MYANMAR VOWEL SIGN AI
+@		Various signs
+1036	MYANMAR SIGN ANUSVARA
+1037	MYANMAR SIGN DOT BELOW
+	= aukmyit
+	* a tone mark
+1038	MYANMAR SIGN VISARGA
+1039	MYANMAR SIGN VIRAMA
+	= killer (when rendered visibly)
+@		Digits
+1040	MYANMAR DIGIT ZERO
+1041	MYANMAR DIGIT ONE
+1042	MYANMAR DIGIT TWO
+1043	MYANMAR DIGIT THREE
+1044	MYANMAR DIGIT FOUR
+1045	MYANMAR DIGIT FIVE
+1046	MYANMAR DIGIT SIX
+1047	MYANMAR DIGIT SEVEN
+1048	MYANMAR DIGIT EIGHT
+1049	MYANMAR DIGIT NINE
+@		Punctuation
+104A	MYANMAR SIGN LITTLE SECTION
+	x (devanagari danda - 0964)
+104B	MYANMAR SIGN SECTION
+	x (devanagari double danda - 0965)
+@		Various signs
+104C	MYANMAR SYMBOL LOCATIVE
+104D	MYANMAR SYMBOL COMPLETED
+104E	MYANMAR SYMBOL AFOREMENTIONED
+104F	MYANMAR SYMBOL GENITIVE
+@		Pali and Sanskrit extensions
+1050	MYANMAR LETTER SHA
+1051	MYANMAR LETTER SSA
+1052	MYANMAR LETTER VOCALIC R
+1053	MYANMAR LETTER VOCALIC RR
+1054	MYANMAR LETTER VOCALIC L
+1055	MYANMAR LETTER VOCALIC LL
+1056	MYANMAR VOWEL SIGN VOCALIC R
+1057	MYANMAR VOWEL SIGN VOCALIC RR
+1058	MYANMAR VOWEL SIGN VOCALIC L
+1059	MYANMAR VOWEL SIGN VOCALIC LL
+@@	10A0	Georgian	10FF
+@		Capital letters (Khutsuri)
+@+		This is the uppercase of the old ecclesiastical alphabet. The style shown in the code charts is known as Asomtavruli. See the Georgian Supplement block for lowercase Nuskhuri.
+10A0	GEORGIAN CAPITAL LETTER AN (Khutsuri)
+10A1	GEORGIAN CAPITAL LETTER BAN (Khutsuri)
+10A2	GEORGIAN CAPITAL LETTER GAN (Khutsuri)
+10A3	GEORGIAN CAPITAL LETTER DON (Khutsuri)
+10A4	GEORGIAN CAPITAL LETTER EN (Khutsuri)
+10A5	GEORGIAN CAPITAL LETTER VIN (Khutsuri)
+10A6	GEORGIAN CAPITAL LETTER ZEN (Khutsuri)
+10A7	GEORGIAN CAPITAL LETTER TAN (Khutsuri)
+10A8	GEORGIAN CAPITAL LETTER IN (Khutsuri)
+10A9	GEORGIAN CAPITAL LETTER KAN (Khutsuri)
+10AA	GEORGIAN CAPITAL LETTER LAS (Khutsuri)
+10AB	GEORGIAN CAPITAL LETTER MAN (Khutsuri)
+10AC	GEORGIAN CAPITAL LETTER NAR (Khutsuri)
+10AD	GEORGIAN CAPITAL LETTER ON (Khutsuri)
+10AE	GEORGIAN CAPITAL LETTER PAR (Khutsuri)
+10AF	GEORGIAN CAPITAL LETTER ZHAR (Khutsuri)
+10B0	GEORGIAN CAPITAL LETTER RAE (Khutsuri)
+10B1	GEORGIAN CAPITAL LETTER SAN (Khutsuri)
+10B2	GEORGIAN CAPITAL LETTER TAR (Khutsuri)
+10B3	GEORGIAN CAPITAL LETTER UN (Khutsuri)
+10B4	GEORGIAN CAPITAL LETTER PHAR (Khutsuri)
+10B5	GEORGIAN CAPITAL LETTER KHAR (Khutsuri)
+10B6	GEORGIAN CAPITAL LETTER GHAN (Khutsuri)
+10B7	GEORGIAN CAPITAL LETTER QAR (Khutsuri)
+10B8	GEORGIAN CAPITAL LETTER SHIN (Khutsuri)
+10B9	GEORGIAN CAPITAL LETTER CHIN (Khutsuri)
+10BA	GEORGIAN CAPITAL LETTER CAN (Khutsuri)
+10BB	GEORGIAN CAPITAL LETTER JIL (Khutsuri)
+10BC	GEORGIAN CAPITAL LETTER CIL (Khutsuri)
+10BD	GEORGIAN CAPITAL LETTER CHAR (Khutsuri)
+10BE	GEORGIAN CAPITAL LETTER XAN (Khutsuri)
+10BF	GEORGIAN CAPITAL LETTER JHAN (Khutsuri)
+10C0	GEORGIAN CAPITAL LETTER HAE (Khutsuri)
+10C1	GEORGIAN CAPITAL LETTER HE (Khutsuri)
+10C2	GEORGIAN CAPITAL LETTER HIE (Khutsuri)
+10C3	GEORGIAN CAPITAL LETTER WE (Khutsuri)
+10C4	GEORGIAN CAPITAL LETTER HAR (Khutsuri)
+10C5	GEORGIAN CAPITAL LETTER HOE (Khutsuri)
+@		Mkhedruli
+@+		This is the modern secular alphabet, which is caseless.
+10D0	GEORGIAN LETTER AN
+10D1	GEORGIAN LETTER BAN
+10D2	GEORGIAN LETTER GAN
+10D3	GEORGIAN LETTER DON
+10D4	GEORGIAN LETTER EN
+10D5	GEORGIAN LETTER VIN
+10D6	GEORGIAN LETTER ZEN
+10D7	GEORGIAN LETTER TAN
+10D8	GEORGIAN LETTER IN
+10D9	GEORGIAN LETTER KAN
+10DA	GEORGIAN LETTER LAS
+10DB	GEORGIAN LETTER MAN
+10DC	GEORGIAN LETTER NAR
+10DD	GEORGIAN LETTER ON
+10DE	GEORGIAN LETTER PAR
+10DF	GEORGIAN LETTER ZHAR
+10E0	GEORGIAN LETTER RAE
+10E1	GEORGIAN LETTER SAN
+10E2	GEORGIAN LETTER TAR
+10E3	GEORGIAN LETTER UN
+10E4	GEORGIAN LETTER PHAR
+10E5	GEORGIAN LETTER KHAR
+10E6	GEORGIAN LETTER GHAN
+10E7	GEORGIAN LETTER QAR
+10E8	GEORGIAN LETTER SHIN
+10E9	GEORGIAN LETTER CHIN
+10EA	GEORGIAN LETTER CAN
+10EB	GEORGIAN LETTER JIL
+10EC	GEORGIAN LETTER CIL
+10ED	GEORGIAN LETTER CHAR
+10EE	GEORGIAN LETTER XAN
+10EF	GEORGIAN LETTER JHAN
+10F0	GEORGIAN LETTER HAE
+@		Archaic letters
+10F1	GEORGIAN LETTER HE
+10F2	GEORGIAN LETTER HIE
+10F3	GEORGIAN LETTER WE
+10F4	GEORGIAN LETTER HAR
+10F5	GEORGIAN LETTER HOE
+10F6	GEORGIAN LETTER FI
+@		Additional letters for Mingrelian and Svan
+10F7	GEORGIAN LETTER YN
+10F8	GEORGIAN LETTER ELIFI
+@		Additional letters
+10F9	GEORGIAN LETTER TURNED GAN
+10FA	GEORGIAN LETTER AIN
+@		Punctuation
+10FB	GEORGIAN PARAGRAPH SEPARATOR
+@		Modifier letter
+10FC	MODIFIER LETTER GEORGIAN NAR
+	# <super> 10DC
+@@	1100	Hangul Jamo	11FF
+@+		The aliases in this block represent the Jamo short names.
+@		Korean combining alphabet
+@		Initial consonants
+1100	HANGUL CHOSEONG KIYEOK (g) *
+	= G
+1101	HANGUL CHOSEONG SSANGKIYEOK (gg) *
+	= GG
+1102	HANGUL CHOSEONG NIEUN (n) *
+	= N
+1103	HANGUL CHOSEONG TIKEUT (d) *
+	= D
+1104	HANGUL CHOSEONG SSANGTIKEUT (dd) *
+	= DD
+1105	HANGUL CHOSEONG RIEUL (r) *
+	= R
+1106	HANGUL CHOSEONG MIEUM (m) *
+	= M
+1107	HANGUL CHOSEONG PIEUP (b) *
+	= B
+1108	HANGUL CHOSEONG SSANGPIEUP (bb) *
+	= BB
+1109	HANGUL CHOSEONG SIOS (s) *
+	= S
+110A	HANGUL CHOSEONG SSANGSIOS (ss) *
+	= SS
+110B	HANGUL CHOSEONG IEUNG
+110C	HANGUL CHOSEONG CIEUC (j) *
+	= J
+110D	HANGUL CHOSEONG SSANGCIEUC (jj) *
+	= JJ
+110E	HANGUL CHOSEONG CHIEUCH (c) *
+	= C
+110F	HANGUL CHOSEONG KHIEUKH (k) *
+	= K
+1110	HANGUL CHOSEONG THIEUTH (t) *
+	= T
+1111	HANGUL CHOSEONG PHIEUPH (p) *
+	= P
+1112	HANGUL CHOSEONG HIEUH (h) *
+	= H
+1113	HANGUL CHOSEONG NIEUN-KIYEOK
+1114	HANGUL CHOSEONG SSANGNIEUN
+1115	HANGUL CHOSEONG NIEUN-TIKEUT
+1116	HANGUL CHOSEONG NIEUN-PIEUP
+1117	HANGUL CHOSEONG TIKEUT-KIYEOK
+1118	HANGUL CHOSEONG RIEUL-NIEUN
+1119	HANGUL CHOSEONG SSANGRIEUL
+111A	HANGUL CHOSEONG RIEUL-HIEUH
+111B	HANGUL CHOSEONG KAPYEOUNRIEUL
+111C	HANGUL CHOSEONG MIEUM-PIEUP
+111D	HANGUL CHOSEONG KAPYEOUNMIEUM
+111E	HANGUL CHOSEONG PIEUP-KIYEOK
+111F	HANGUL CHOSEONG PIEUP-NIEUN
+1120	HANGUL CHOSEONG PIEUP-TIKEUT
+1121	HANGUL CHOSEONG PIEUP-SIOS
+1122	HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123	HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124	HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125	HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126	HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127	HANGUL CHOSEONG PIEUP-CIEUC
+1128	HANGUL CHOSEONG PIEUP-CHIEUCH
+1129	HANGUL CHOSEONG PIEUP-THIEUTH
+112A	HANGUL CHOSEONG PIEUP-PHIEUPH
+112B	HANGUL CHOSEONG KAPYEOUNPIEUP
+112C	HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D	HANGUL CHOSEONG SIOS-KIYEOK
+112E	HANGUL CHOSEONG SIOS-NIEUN
+112F	HANGUL CHOSEONG SIOS-TIKEUT
+1130	HANGUL CHOSEONG SIOS-RIEUL
+1131	HANGUL CHOSEONG SIOS-MIEUM
+1132	HANGUL CHOSEONG SIOS-PIEUP
+1133	HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134	HANGUL CHOSEONG SIOS-SSANGSIOS
+1135	HANGUL CHOSEONG SIOS-IEUNG
+1136	HANGUL CHOSEONG SIOS-CIEUC
+1137	HANGUL CHOSEONG SIOS-CHIEUCH
+1138	HANGUL CHOSEONG SIOS-KHIEUKH
+1139	HANGUL CHOSEONG SIOS-THIEUTH
+113A	HANGUL CHOSEONG SIOS-PHIEUPH
+113B	HANGUL CHOSEONG SIOS-HIEUH
+113C	HANGUL CHOSEONG CHITUEUMSIOS
+113D	HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E	HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F	HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140	HANGUL CHOSEONG PANSIOS
+1141	HANGUL CHOSEONG IEUNG-KIYEOK
+1142	HANGUL CHOSEONG IEUNG-TIKEUT
+1143	HANGUL CHOSEONG IEUNG-MIEUM
+1144	HANGUL CHOSEONG IEUNG-PIEUP
+1145	HANGUL CHOSEONG IEUNG-SIOS
+1146	HANGUL CHOSEONG IEUNG-PANSIOS
+1147	HANGUL CHOSEONG SSANGIEUNG
+1148	HANGUL CHOSEONG IEUNG-CIEUC
+1149	HANGUL CHOSEONG IEUNG-CHIEUCH
+114A	HANGUL CHOSEONG IEUNG-THIEUTH
+114B	HANGUL CHOSEONG IEUNG-PHIEUPH
+114C	HANGUL CHOSEONG YESIEUNG
+114D	HANGUL CHOSEONG CIEUC-IEUNG
+114E	HANGUL CHOSEONG CHITUEUMCIEUC
+114F	HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150	HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151	HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152	HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153	HANGUL CHOSEONG CHIEUCH-HIEUH
+1154	HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155	HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156	HANGUL CHOSEONG PHIEUPH-PIEUP
+1157	HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158	HANGUL CHOSEONG SSANGHIEUH
+1159	HANGUL CHOSEONG YEORINHIEUH
+115F	HANGUL CHOSEONG FILLER
+@		Medial vowels
+1160	HANGUL JUNGSEONG FILLER
+1161	HANGUL JUNGSEONG A
+	= A
+1162	HANGUL JUNGSEONG AE
+	= AE
+1163	HANGUL JUNGSEONG YA
+	= YA
+1164	HANGUL JUNGSEONG YAE
+	= YAE
+1165	HANGUL JUNGSEONG EO
+	= EO
+1166	HANGUL JUNGSEONG E
+	= E
+1167	HANGUL JUNGSEONG YEO
+	= YEO
+1168	HANGUL JUNGSEONG YE
+	= YE
+1169	HANGUL JUNGSEONG O
+	= O
+116A	HANGUL JUNGSEONG WA
+	= WA
+116B	HANGUL JUNGSEONG WAE
+	= WAE
+116C	HANGUL JUNGSEONG OE
+	= OE
+116D	HANGUL JUNGSEONG YO
+	= YO
+116E	HANGUL JUNGSEONG U
+	= U
+116F	HANGUL JUNGSEONG WEO
+	= WEO
+1170	HANGUL JUNGSEONG WE
+	= WE
+1171	HANGUL JUNGSEONG WI
+	= WI
+1172	HANGUL JUNGSEONG YU
+	= YU
+1173	HANGUL JUNGSEONG EU
+	= EU
+1174	HANGUL JUNGSEONG YI
+	= YI
+1175	HANGUL JUNGSEONG I
+	= I
+1176	HANGUL JUNGSEONG A-O
+1177	HANGUL JUNGSEONG A-U
+1178	HANGUL JUNGSEONG YA-O
+1179	HANGUL JUNGSEONG YA-YO
+117A	HANGUL JUNGSEONG EO-O
+117B	HANGUL JUNGSEONG EO-U
+117C	HANGUL JUNGSEONG EO-EU
+117D	HANGUL JUNGSEONG YEO-O
+117E	HANGUL JUNGSEONG YEO-U
+117F	HANGUL JUNGSEONG O-EO
+1180	HANGUL JUNGSEONG O-E
+1181	HANGUL JUNGSEONG O-YE
+1182	HANGUL JUNGSEONG O-O
+1183	HANGUL JUNGSEONG O-U
+1184	HANGUL JUNGSEONG YO-YA
+1185	HANGUL JUNGSEONG YO-YAE
+1186	HANGUL JUNGSEONG YO-YEO
+1187	HANGUL JUNGSEONG YO-O
+1188	HANGUL JUNGSEONG YO-I
+1189	HANGUL JUNGSEONG U-A
+118A	HANGUL JUNGSEONG U-AE
+118B	HANGUL JUNGSEONG U-EO-EU
+118C	HANGUL JUNGSEONG U-YE
+118D	HANGUL JUNGSEONG U-U
+118E	HANGUL JUNGSEONG YU-A
+118F	HANGUL JUNGSEONG YU-EO
+1190	HANGUL JUNGSEONG YU-E
+1191	HANGUL JUNGSEONG YU-YEO
+1192	HANGUL JUNGSEONG YU-YE
+1193	HANGUL JUNGSEONG YU-U
+1194	HANGUL JUNGSEONG YU-I
+1195	HANGUL JUNGSEONG EU-U
+1196	HANGUL JUNGSEONG EU-EU
+1197	HANGUL JUNGSEONG YI-U
+1198	HANGUL JUNGSEONG I-A
+1199	HANGUL JUNGSEONG I-YA
+119A	HANGUL JUNGSEONG I-O
+119B	HANGUL JUNGSEONG I-U
+119C	HANGUL JUNGSEONG I-EU
+119D	HANGUL JUNGSEONG I-ARAEA
+119E	HANGUL JUNGSEONG ARAEA
+119F	HANGUL JUNGSEONG ARAEA-EO
+11A0	HANGUL JUNGSEONG ARAEA-U
+11A1	HANGUL JUNGSEONG ARAEA-I
+11A2	HANGUL JUNGSEONG SSANGARAEA
+@		Final consonants
+11A8	HANGUL JONGSEONG KIYEOK (g) *
+	= G
+11A9	HANGUL JONGSEONG SSANGKIYEOK (gg) *
+	= GG
+11AA	HANGUL JONGSEONG KIYEOK-SIOS (gs) *
+	= GS
+11AB	HANGUL JONGSEONG NIEUN (n) *
+	= N
+11AC	HANGUL JONGSEONG NIEUN-CIEUC (nj) *
+	= NJ
+11AD	HANGUL JONGSEONG NIEUN-HIEUH (nh) *
+	= NH
+11AE	HANGUL JONGSEONG TIKEUT (d) *
+	= D
+11AF	HANGUL JONGSEONG RIEUL (l) *
+	= L
+11B0	HANGUL JONGSEONG RIEUL-KIYEOK (lg) *
+	= LG
+11B1	HANGUL JONGSEONG RIEUL-MIEUM (lm) *
+	= LM
+11B2	HANGUL JONGSEONG RIEUL-PIEUP (lb) *
+	= LB
+11B3	HANGUL JONGSEONG RIEUL-SIOS (ls) *
+	= LS
+11B4	HANGUL JONGSEONG RIEUL-THIEUTH (lt) *
+	= LT
+11B5	HANGUL JONGSEONG RIEUL-PHIEUPH (lp) *
+	= LP
+11B6	HANGUL JONGSEONG RIEUL-HIEUH (lh) *
+	= LH
+11B7	HANGUL JONGSEONG MIEUM (m) *
+	= M
+11B8	HANGUL JONGSEONG PIEUP (b) *
+	= B
+11B9	HANGUL JONGSEONG PIEUP-SIOS (bs) *
+	= BS
+11BA	HANGUL JONGSEONG SIOS (s) *
+	= S
+11BB	HANGUL JONGSEONG SSANGSIOS (ss) *
+	= SS
+11BC	HANGUL JONGSEONG IEUNG (ng) *
+	= NG
+11BD	HANGUL JONGSEONG CIEUC (j) *
+	= J
+11BE	HANGUL JONGSEONG CHIEUCH (c) *
+	= C
+11BF	HANGUL JONGSEONG KHIEUKH (k) *
+	= K
+11C0	HANGUL JONGSEONG THIEUTH (t) *
+	= T
+11C1	HANGUL JONGSEONG PHIEUPH (p) *
+	= P
+11C2	HANGUL JONGSEONG HIEUH (h) *
+	= H
+11C3	HANGUL JONGSEONG KIYEOK-RIEUL
+11C4	HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5	HANGUL JONGSEONG NIEUN-KIYEOK
+11C6	HANGUL JONGSEONG NIEUN-TIKEUT
+11C7	HANGUL JONGSEONG NIEUN-SIOS
+11C8	HANGUL JONGSEONG NIEUN-PANSIOS
+11C9	HANGUL JONGSEONG NIEUN-THIEUTH
+11CA	HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB	HANGUL JONGSEONG TIKEUT-RIEUL
+11CC	HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD	HANGUL JONGSEONG RIEUL-NIEUN
+11CE	HANGUL JONGSEONG RIEUL-TIKEUT
+11CF	HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0	HANGUL JONGSEONG SSANGRIEUL
+11D1	HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2	HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3	HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4	HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5	HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6	HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7	HANGUL JONGSEONG RIEUL-PANSIOS
+11D8	HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9	HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA	HANGUL JONGSEONG MIEUM-KIYEOK
+11DB	HANGUL JONGSEONG MIEUM-RIEUL
+11DC	HANGUL JONGSEONG MIEUM-PIEUP
+11DD	HANGUL JONGSEONG MIEUM-SIOS
+11DE	HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF	HANGUL JONGSEONG MIEUM-PANSIOS
+11E0	HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1	HANGUL JONGSEONG MIEUM-HIEUH
+11E2	HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3	HANGUL JONGSEONG PIEUP-RIEUL
+11E4	HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5	HANGUL JONGSEONG PIEUP-HIEUH
+11E6	HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7	HANGUL JONGSEONG SIOS-KIYEOK
+11E8	HANGUL JONGSEONG SIOS-TIKEUT
+11E9	HANGUL JONGSEONG SIOS-RIEUL
+11EA	HANGUL JONGSEONG SIOS-PIEUP
+11EB	HANGUL JONGSEONG PANSIOS
+11EC	HANGUL JONGSEONG IEUNG-KIYEOK
+11ED	HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE	HANGUL JONGSEONG SSANGIEUNG
+11EF	HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0	HANGUL JONGSEONG YESIEUNG
+11F1	HANGUL JONGSEONG YESIEUNG-SIOS
+11F2	HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3	HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4	HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5	HANGUL JONGSEONG HIEUH-NIEUN
+11F6	HANGUL JONGSEONG HIEUH-RIEUL
+11F7	HANGUL JONGSEONG HIEUH-MIEUM
+11F8	HANGUL JONGSEONG HIEUH-PIEUP
+11F9	HANGUL JONGSEONG YEORINHIEUH
+@@	1200	Ethiopic	137F
+@		Syllables
+1200	ETHIOPIC SYLLABLE HA
+1201	ETHIOPIC SYLLABLE HU
+1202	ETHIOPIC SYLLABLE HI
+1203	ETHIOPIC SYLLABLE HAA
+1204	ETHIOPIC SYLLABLE HEE
+1205	ETHIOPIC SYLLABLE HE
+1206	ETHIOPIC SYLLABLE HO
+1207	ETHIOPIC SYLLABLE HOA
+1208	ETHIOPIC SYLLABLE LA
+1209	ETHIOPIC SYLLABLE LU
+120A	ETHIOPIC SYLLABLE LI
+120B	ETHIOPIC SYLLABLE LAA
+120C	ETHIOPIC SYLLABLE LEE
+120D	ETHIOPIC SYLLABLE LE
+120E	ETHIOPIC SYLLABLE LO
+120F	ETHIOPIC SYLLABLE LWA
+1210	ETHIOPIC SYLLABLE HHA
+1211	ETHIOPIC SYLLABLE HHU
+1212	ETHIOPIC SYLLABLE HHI
+1213	ETHIOPIC SYLLABLE HHAA
+1214	ETHIOPIC SYLLABLE HHEE
+1215	ETHIOPIC SYLLABLE HHE
+1216	ETHIOPIC SYLLABLE HHO
+1217	ETHIOPIC SYLLABLE HHWA
+1218	ETHIOPIC SYLLABLE MA
+1219	ETHIOPIC SYLLABLE MU
+121A	ETHIOPIC SYLLABLE MI
+121B	ETHIOPIC SYLLABLE MAA
+121C	ETHIOPIC SYLLABLE MEE
+121D	ETHIOPIC SYLLABLE ME
+121E	ETHIOPIC SYLLABLE MO
+121F	ETHIOPIC SYLLABLE MWA
+1220	ETHIOPIC SYLLABLE SZA
+1221	ETHIOPIC SYLLABLE SZU
+1222	ETHIOPIC SYLLABLE SZI
+1223	ETHIOPIC SYLLABLE SZAA
+1224	ETHIOPIC SYLLABLE SZEE
+1225	ETHIOPIC SYLLABLE SZE
+1226	ETHIOPIC SYLLABLE SZO
+1227	ETHIOPIC SYLLABLE SZWA
+1228	ETHIOPIC SYLLABLE RA
+1229	ETHIOPIC SYLLABLE RU
+122A	ETHIOPIC SYLLABLE RI
+122B	ETHIOPIC SYLLABLE RAA
+122C	ETHIOPIC SYLLABLE REE
+122D	ETHIOPIC SYLLABLE RE
+122E	ETHIOPIC SYLLABLE RO
+122F	ETHIOPIC SYLLABLE RWA
+1230	ETHIOPIC SYLLABLE SA
+1231	ETHIOPIC SYLLABLE SU
+1232	ETHIOPIC SYLLABLE SI
+1233	ETHIOPIC SYLLABLE SAA
+1234	ETHIOPIC SYLLABLE SEE
+1235	ETHIOPIC SYLLABLE SE
+1236	ETHIOPIC SYLLABLE SO
+1237	ETHIOPIC SYLLABLE SWA
+1238	ETHIOPIC SYLLABLE SHA
+1239	ETHIOPIC SYLLABLE SHU
+123A	ETHIOPIC SYLLABLE SHI
+123B	ETHIOPIC SYLLABLE SHAA
+123C	ETHIOPIC SYLLABLE SHEE
+123D	ETHIOPIC SYLLABLE SHE
+123E	ETHIOPIC SYLLABLE SHO
+123F	ETHIOPIC SYLLABLE SHWA
+1240	ETHIOPIC SYLLABLE QA
+1241	ETHIOPIC SYLLABLE QU
+1242	ETHIOPIC SYLLABLE QI
+1243	ETHIOPIC SYLLABLE QAA
+1244	ETHIOPIC SYLLABLE QEE
+1245	ETHIOPIC SYLLABLE QE
+1246	ETHIOPIC SYLLABLE QO
+1247	ETHIOPIC SYLLABLE QOA
+1248	ETHIOPIC SYLLABLE QWA
+124A	ETHIOPIC SYLLABLE QWI
+124B	ETHIOPIC SYLLABLE QWAA
+124C	ETHIOPIC SYLLABLE QWEE
+124D	ETHIOPIC SYLLABLE QWE
+1250	ETHIOPIC SYLLABLE QHA
+1251	ETHIOPIC SYLLABLE QHU
+1252	ETHIOPIC SYLLABLE QHI
+1253	ETHIOPIC SYLLABLE QHAA
+1254	ETHIOPIC SYLLABLE QHEE
+1255	ETHIOPIC SYLLABLE QHE
+1256	ETHIOPIC SYLLABLE QHO
+1258	ETHIOPIC SYLLABLE QHWA
+125A	ETHIOPIC SYLLABLE QHWI
+125B	ETHIOPIC SYLLABLE QHWAA
+125C	ETHIOPIC SYLLABLE QHWEE
+125D	ETHIOPIC SYLLABLE QHWE
+1260	ETHIOPIC SYLLABLE BA
+1261	ETHIOPIC SYLLABLE BU
+1262	ETHIOPIC SYLLABLE BI
+1263	ETHIOPIC SYLLABLE BAA
+1264	ETHIOPIC SYLLABLE BEE
+1265	ETHIOPIC SYLLABLE BE
+1266	ETHIOPIC SYLLABLE BO
+1267	ETHIOPIC SYLLABLE BWA
+1268	ETHIOPIC SYLLABLE VA
+1269	ETHIOPIC SYLLABLE VU
+126A	ETHIOPIC SYLLABLE VI
+126B	ETHIOPIC SYLLABLE VAA
+126C	ETHIOPIC SYLLABLE VEE
+126D	ETHIOPIC SYLLABLE VE
+126E	ETHIOPIC SYLLABLE VO
+126F	ETHIOPIC SYLLABLE VWA
+1270	ETHIOPIC SYLLABLE TA
+1271	ETHIOPIC SYLLABLE TU
+1272	ETHIOPIC SYLLABLE TI
+1273	ETHIOPIC SYLLABLE TAA
+1274	ETHIOPIC SYLLABLE TEE
+1275	ETHIOPIC SYLLABLE TE
+1276	ETHIOPIC SYLLABLE TO
+1277	ETHIOPIC SYLLABLE TWA
+1278	ETHIOPIC SYLLABLE CA
+1279	ETHIOPIC SYLLABLE CU
+127A	ETHIOPIC SYLLABLE CI
+127B	ETHIOPIC SYLLABLE CAA
+127C	ETHIOPIC SYLLABLE CEE
+127D	ETHIOPIC SYLLABLE CE
+127E	ETHIOPIC SYLLABLE CO
+127F	ETHIOPIC SYLLABLE CWA
+1280	ETHIOPIC SYLLABLE XA
+1281	ETHIOPIC SYLLABLE XU
+1282	ETHIOPIC SYLLABLE XI
+1283	ETHIOPIC SYLLABLE XAA
+1284	ETHIOPIC SYLLABLE XEE
+1285	ETHIOPIC SYLLABLE XE
+1286	ETHIOPIC SYLLABLE XO
+1287	ETHIOPIC SYLLABLE XOA
+1288	ETHIOPIC SYLLABLE XWA
+128A	ETHIOPIC SYLLABLE XWI
+128B	ETHIOPIC SYLLABLE XWAA
+128C	ETHIOPIC SYLLABLE XWEE
+128D	ETHIOPIC SYLLABLE XWE
+1290	ETHIOPIC SYLLABLE NA
+1291	ETHIOPIC SYLLABLE NU
+1292	ETHIOPIC SYLLABLE NI
+1293	ETHIOPIC SYLLABLE NAA
+1294	ETHIOPIC SYLLABLE NEE
+1295	ETHIOPIC SYLLABLE NE
+1296	ETHIOPIC SYLLABLE NO
+1297	ETHIOPIC SYLLABLE NWA
+1298	ETHIOPIC SYLLABLE NYA
+1299	ETHIOPIC SYLLABLE NYU
+129A	ETHIOPIC SYLLABLE NYI
+129B	ETHIOPIC SYLLABLE NYAA
+129C	ETHIOPIC SYLLABLE NYEE
+129D	ETHIOPIC SYLLABLE NYE
+129E	ETHIOPIC SYLLABLE NYO
+129F	ETHIOPIC SYLLABLE NYWA
+12A0	ETHIOPIC SYLLABLE GLOTTAL A
+12A1	ETHIOPIC SYLLABLE GLOTTAL U
+12A2	ETHIOPIC SYLLABLE GLOTTAL I
+12A3	ETHIOPIC SYLLABLE GLOTTAL AA
+12A4	ETHIOPIC SYLLABLE GLOTTAL EE
+12A5	ETHIOPIC SYLLABLE GLOTTAL E
+12A6	ETHIOPIC SYLLABLE GLOTTAL O
+12A7	ETHIOPIC SYLLABLE GLOTTAL WA
+12A8	ETHIOPIC SYLLABLE KA
+12A9	ETHIOPIC SYLLABLE KU
+12AA	ETHIOPIC SYLLABLE KI
+12AB	ETHIOPIC SYLLABLE KAA
+12AC	ETHIOPIC SYLLABLE KEE
+12AD	ETHIOPIC SYLLABLE KE
+12AE	ETHIOPIC SYLLABLE KO
+12AF	ETHIOPIC SYLLABLE KOA
+12B0	ETHIOPIC SYLLABLE KWA
+12B2	ETHIOPIC SYLLABLE KWI
+12B3	ETHIOPIC SYLLABLE KWAA
+12B4	ETHIOPIC SYLLABLE KWEE
+12B5	ETHIOPIC SYLLABLE KWE
+12B8	ETHIOPIC SYLLABLE KXA
+12B9	ETHIOPIC SYLLABLE KXU
+12BA	ETHIOPIC SYLLABLE KXI
+12BB	ETHIOPIC SYLLABLE KXAA
+12BC	ETHIOPIC SYLLABLE KXEE
+12BD	ETHIOPIC SYLLABLE KXE
+12BE	ETHIOPIC SYLLABLE KXO
+12C0	ETHIOPIC SYLLABLE KXWA
+12C2	ETHIOPIC SYLLABLE KXWI
+12C3	ETHIOPIC SYLLABLE KXWAA
+12C4	ETHIOPIC SYLLABLE KXWEE
+12C5	ETHIOPIC SYLLABLE KXWE
+12C8	ETHIOPIC SYLLABLE WA
+12C9	ETHIOPIC SYLLABLE WU
+12CA	ETHIOPIC SYLLABLE WI
+12CB	ETHIOPIC SYLLABLE WAA
+12CC	ETHIOPIC SYLLABLE WEE
+12CD	ETHIOPIC SYLLABLE WE
+12CE	ETHIOPIC SYLLABLE WO
+12CF	ETHIOPIC SYLLABLE WOA
+12D0	ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1	ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2	ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3	ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4	ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5	ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6	ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8	ETHIOPIC SYLLABLE ZA
+12D9	ETHIOPIC SYLLABLE ZU
+12DA	ETHIOPIC SYLLABLE ZI
+12DB	ETHIOPIC SYLLABLE ZAA
+12DC	ETHIOPIC SYLLABLE ZEE
+12DD	ETHIOPIC SYLLABLE ZE
+12DE	ETHIOPIC SYLLABLE ZO
+12DF	ETHIOPIC SYLLABLE ZWA
+12E0	ETHIOPIC SYLLABLE ZHA
+12E1	ETHIOPIC SYLLABLE ZHU
+12E2	ETHIOPIC SYLLABLE ZHI
+12E3	ETHIOPIC SYLLABLE ZHAA
+12E4	ETHIOPIC SYLLABLE ZHEE
+12E5	ETHIOPIC SYLLABLE ZHE
+12E6	ETHIOPIC SYLLABLE ZHO
+12E7	ETHIOPIC SYLLABLE ZHWA
+12E8	ETHIOPIC SYLLABLE YA
+12E9	ETHIOPIC SYLLABLE YU
+12EA	ETHIOPIC SYLLABLE YI
+12EB	ETHIOPIC SYLLABLE YAA
+12EC	ETHIOPIC SYLLABLE YEE
+12ED	ETHIOPIC SYLLABLE YE
+12EE	ETHIOPIC SYLLABLE YO
+12EF	ETHIOPIC SYLLABLE YOA
+12F0	ETHIOPIC SYLLABLE DA
+12F1	ETHIOPIC SYLLABLE DU
+12F2	ETHIOPIC SYLLABLE DI
+12F3	ETHIOPIC SYLLABLE DAA
+12F4	ETHIOPIC SYLLABLE DEE
+12F5	ETHIOPIC SYLLABLE DE
+12F6	ETHIOPIC SYLLABLE DO
+12F7	ETHIOPIC SYLLABLE DWA
+12F8	ETHIOPIC SYLLABLE DDA
+12F9	ETHIOPIC SYLLABLE DDU
+12FA	ETHIOPIC SYLLABLE DDI
+12FB	ETHIOPIC SYLLABLE DDAA
+12FC	ETHIOPIC SYLLABLE DDEE
+12FD	ETHIOPIC SYLLABLE DDE
+12FE	ETHIOPIC SYLLABLE DDO
+12FF	ETHIOPIC SYLLABLE DDWA
+1300	ETHIOPIC SYLLABLE JA
+1301	ETHIOPIC SYLLABLE JU
+1302	ETHIOPIC SYLLABLE JI
+1303	ETHIOPIC SYLLABLE JAA
+1304	ETHIOPIC SYLLABLE JEE
+1305	ETHIOPIC SYLLABLE JE
+1306	ETHIOPIC SYLLABLE JO
+1307	ETHIOPIC SYLLABLE JWA
+1308	ETHIOPIC SYLLABLE GA
+1309	ETHIOPIC SYLLABLE GU
+130A	ETHIOPIC SYLLABLE GI
+130B	ETHIOPIC SYLLABLE GAA
+130C	ETHIOPIC SYLLABLE GEE
+130D	ETHIOPIC SYLLABLE GE
+130E	ETHIOPIC SYLLABLE GO
+130F	ETHIOPIC SYLLABLE GOA
+1310	ETHIOPIC SYLLABLE GWA
+1312	ETHIOPIC SYLLABLE GWI
+1313	ETHIOPIC SYLLABLE GWAA
+1314	ETHIOPIC SYLLABLE GWEE
+1315	ETHIOPIC SYLLABLE GWE
+1318	ETHIOPIC SYLLABLE GGA
+1319	ETHIOPIC SYLLABLE GGU
+131A	ETHIOPIC SYLLABLE GGI
+131B	ETHIOPIC SYLLABLE GGAA
+131C	ETHIOPIC SYLLABLE GGEE
+131D	ETHIOPIC SYLLABLE GGE
+131E	ETHIOPIC SYLLABLE GGO
+131F	ETHIOPIC SYLLABLE GGWAA
+1320	ETHIOPIC SYLLABLE THA
+1321	ETHIOPIC SYLLABLE THU
+1322	ETHIOPIC SYLLABLE THI
+1323	ETHIOPIC SYLLABLE THAA
+1324	ETHIOPIC SYLLABLE THEE
+1325	ETHIOPIC SYLLABLE THE
+1326	ETHIOPIC SYLLABLE THO
+1327	ETHIOPIC SYLLABLE THWA
+1328	ETHIOPIC SYLLABLE CHA
+1329	ETHIOPIC SYLLABLE CHU
+132A	ETHIOPIC SYLLABLE CHI
+132B	ETHIOPIC SYLLABLE CHAA
+132C	ETHIOPIC SYLLABLE CHEE
+132D	ETHIOPIC SYLLABLE CHE
+132E	ETHIOPIC SYLLABLE CHO
+132F	ETHIOPIC SYLLABLE CHWA
+1330	ETHIOPIC SYLLABLE PHA
+1331	ETHIOPIC SYLLABLE PHU
+1332	ETHIOPIC SYLLABLE PHI
+1333	ETHIOPIC SYLLABLE PHAA
+1334	ETHIOPIC SYLLABLE PHEE
+1335	ETHIOPIC SYLLABLE PHE
+1336	ETHIOPIC SYLLABLE PHO
+1337	ETHIOPIC SYLLABLE PHWA
+1338	ETHIOPIC SYLLABLE TSA
+1339	ETHIOPIC SYLLABLE TSU
+133A	ETHIOPIC SYLLABLE TSI
+133B	ETHIOPIC SYLLABLE TSAA
+133C	ETHIOPIC SYLLABLE TSEE
+133D	ETHIOPIC SYLLABLE TSE
+133E	ETHIOPIC SYLLABLE TSO
+133F	ETHIOPIC SYLLABLE TSWA
+1340	ETHIOPIC SYLLABLE TZA
+1341	ETHIOPIC SYLLABLE TZU
+1342	ETHIOPIC SYLLABLE TZI
+1343	ETHIOPIC SYLLABLE TZAA
+1344	ETHIOPIC SYLLABLE TZEE
+1345	ETHIOPIC SYLLABLE TZE
+1346	ETHIOPIC SYLLABLE TZO
+1347	ETHIOPIC SYLLABLE TZOA
+1348	ETHIOPIC SYLLABLE FA
+1349	ETHIOPIC SYLLABLE FU
+134A	ETHIOPIC SYLLABLE FI
+134B	ETHIOPIC SYLLABLE FAA
+134C	ETHIOPIC SYLLABLE FEE
+134D	ETHIOPIC SYLLABLE FE
+134E	ETHIOPIC SYLLABLE FO
+134F	ETHIOPIC SYLLABLE FWA
+1350	ETHIOPIC SYLLABLE PA
+1351	ETHIOPIC SYLLABLE PU
+1352	ETHIOPIC SYLLABLE PI
+1353	ETHIOPIC SYLLABLE PAA
+1354	ETHIOPIC SYLLABLE PEE
+1355	ETHIOPIC SYLLABLE PE
+1356	ETHIOPIC SYLLABLE PO
+1357	ETHIOPIC SYLLABLE PWA
+1358	ETHIOPIC SYLLABLE RYA
+1359	ETHIOPIC SYLLABLE MYA
+135A	ETHIOPIC SYLLABLE FYA
+@		Combining mark
+135F	ETHIOPIC COMBINING GEMINATION MARK
+@		Punctuation
+1360	ETHIOPIC SECTION MARK
+1361	ETHIOPIC WORDSPACE
+1362	ETHIOPIC FULL STOP
+1363	ETHIOPIC COMMA
+1364	ETHIOPIC SEMICOLON
+1365	ETHIOPIC COLON
+1366	ETHIOPIC PREFACE COLON
+1367	ETHIOPIC QUESTION MARK
+1368	ETHIOPIC PARAGRAPH SEPARATOR
+@		Digits
+1369	ETHIOPIC DIGIT ONE
+136A	ETHIOPIC DIGIT TWO
+136B	ETHIOPIC DIGIT THREE
+136C	ETHIOPIC DIGIT FOUR
+136D	ETHIOPIC DIGIT FIVE
+136E	ETHIOPIC DIGIT SIX
+136F	ETHIOPIC DIGIT SEVEN
+1370	ETHIOPIC DIGIT EIGHT
+1371	ETHIOPIC DIGIT NINE
+@		Numbers
+1372	ETHIOPIC NUMBER TEN
+1373	ETHIOPIC NUMBER TWENTY
+1374	ETHIOPIC NUMBER THIRTY
+1375	ETHIOPIC NUMBER FORTY
+1376	ETHIOPIC NUMBER FIFTY
+1377	ETHIOPIC NUMBER SIXTY
+1378	ETHIOPIC NUMBER SEVENTY
+1379	ETHIOPIC NUMBER EIGHTY
+137A	ETHIOPIC NUMBER NINETY
+137B	ETHIOPIC NUMBER HUNDRED
+137C	ETHIOPIC NUMBER TEN THOUSAND
+@@	1380	Ethiopic Supplement 	139F
+@	Syllables for Sebatbeit
+1380	ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381	ETHIOPIC SYLLABLE MWI
+1382	ETHIOPIC SYLLABLE MWEE
+1383	ETHIOPIC SYLLABLE MWE
+1384	ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385	ETHIOPIC SYLLABLE BWI
+1386	ETHIOPIC SYLLABLE BWEE
+1387	ETHIOPIC SYLLABLE BWE
+1388	ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389	ETHIOPIC SYLLABLE FWI
+138A	ETHIOPIC SYLLABLE FWEE
+138B	ETHIOPIC SYLLABLE FWE
+138C	ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D	ETHIOPIC SYLLABLE PWI
+138E	ETHIOPIC SYLLABLE PWEE
+138F	ETHIOPIC SYLLABLE PWE
+@	Tonal Marks
+@+		Intended for use with a multiline scored layout
+1390	ETHIOPIC TONAL MARK YIZET
+1391	ETHIOPIC TONAL MARK DERET
+1392	ETHIOPIC TONAL MARK RIKRIK
+1393	ETHIOPIC TONAL MARK SHORT RIKRIK
+1394	ETHIOPIC TONAL MARK DIFAT
+1395	ETHIOPIC TONAL MARK KENAT
+1396	ETHIOPIC TONAL MARK CHIRET
+1397	ETHIOPIC TONAL MARK HIDET
+1398	ETHIOPIC TONAL MARK DERET-HIDET
+1399	ETHIOPIC TONAL MARK KURT
+@@	13A0	Cherokee	13FF
+@		Syllables
+13A0	CHEROKEE LETTER A
+13A1	CHEROKEE LETTER E
+13A2	CHEROKEE LETTER I
+13A3	CHEROKEE LETTER O
+13A4	CHEROKEE LETTER U
+13A5	CHEROKEE LETTER V
+13A6	CHEROKEE LETTER GA
+13A7	CHEROKEE LETTER KA
+13A8	CHEROKEE LETTER GE
+13A9	CHEROKEE LETTER GI
+13AA	CHEROKEE LETTER GO
+13AB	CHEROKEE LETTER GU
+13AC	CHEROKEE LETTER GV
+13AD	CHEROKEE LETTER HA
+13AE	CHEROKEE LETTER HE
+13AF	CHEROKEE LETTER HI
+13B0	CHEROKEE LETTER HO
+13B1	CHEROKEE LETTER HU
+13B2	CHEROKEE LETTER HV
+13B3	CHEROKEE LETTER LA
+13B4	CHEROKEE LETTER LE
+13B5	CHEROKEE LETTER LI
+13B6	CHEROKEE LETTER LO
+13B7	CHEROKEE LETTER LU
+13B8	CHEROKEE LETTER LV
+13B9	CHEROKEE LETTER MA
+13BA	CHEROKEE LETTER ME
+13BB	CHEROKEE LETTER MI
+13BC	CHEROKEE LETTER MO
+13BD	CHEROKEE LETTER MU
+13BE	CHEROKEE LETTER NA
+13BF	CHEROKEE LETTER HNA
+13C0	CHEROKEE LETTER NAH
+13C1	CHEROKEE LETTER NE
+13C2	CHEROKEE LETTER NI
+13C3	CHEROKEE LETTER NO
+13C4	CHEROKEE LETTER NU
+13C5	CHEROKEE LETTER NV
+13C6	CHEROKEE LETTER QUA
+13C7	CHEROKEE LETTER QUE
+13C8	CHEROKEE LETTER QUI
+13C9	CHEROKEE LETTER QUO
+13CA	CHEROKEE LETTER QUU
+13CB	CHEROKEE LETTER QUV
+13CC	CHEROKEE LETTER SA
+13CD	CHEROKEE LETTER S
+13CE	CHEROKEE LETTER SE
+13CF	CHEROKEE LETTER SI
+13D0	CHEROKEE LETTER SO
+13D1	CHEROKEE LETTER SU
+13D2	CHEROKEE LETTER SV
+13D3	CHEROKEE LETTER DA
+13D4	CHEROKEE LETTER TA
+13D5	CHEROKEE LETTER DE
+13D6	CHEROKEE LETTER TE
+13D7	CHEROKEE LETTER DI
+13D8	CHEROKEE LETTER TI
+13D9	CHEROKEE LETTER DO
+13DA	CHEROKEE LETTER DU
+13DB	CHEROKEE LETTER DV
+13DC	CHEROKEE LETTER DLA
+13DD	CHEROKEE LETTER TLA
+13DE	CHEROKEE LETTER TLE
+13DF	CHEROKEE LETTER TLI
+13E0	CHEROKEE LETTER TLO
+13E1	CHEROKEE LETTER TLU
+13E2	CHEROKEE LETTER TLV
+13E3	CHEROKEE LETTER TSA
+13E4	CHEROKEE LETTER TSE
+13E5	CHEROKEE LETTER TSI
+13E6	CHEROKEE LETTER TSO
+13E7	CHEROKEE LETTER TSU
+13E8	CHEROKEE LETTER TSV
+13E9	CHEROKEE LETTER WA
+13EA	CHEROKEE LETTER WE
+13EB	CHEROKEE LETTER WI
+13EC	CHEROKEE LETTER WO
+13ED	CHEROKEE LETTER WU
+13EE	CHEROKEE LETTER WV
+13EF	CHEROKEE LETTER YA
+13F0	CHEROKEE LETTER YE
+13F1	CHEROKEE LETTER YI
+13F2	CHEROKEE LETTER YO
+13F3	CHEROKEE LETTER YU
+13F4	CHEROKEE LETTER YV
+@@	1400	Unified Canadian Aboriginal Syllabics	167F
+@		Syllables
+1401	CANADIAN SYLLABICS E
+	* Inuktitut (AI), Carrier (U)
+1402	CANADIAN SYLLABICS AAI
+	* Inuktitut
+1403	CANADIAN SYLLABICS I
+	* Carrier (O)
+1404	CANADIAN SYLLABICS II
+1405	CANADIAN SYLLABICS O
+	* Inuktitut (U), Carrier (E)
+1406	CANADIAN SYLLABICS OO
+	* Inuktitut (UU)
+1407	CANADIAN SYLLABICS Y-CREE OO
+1408	CANADIAN SYLLABICS CARRIER EE
+1409	CANADIAN SYLLABICS CARRIER I
+140A	CANADIAN SYLLABICS A
+140B	CANADIAN SYLLABICS AA
+140C	CANADIAN SYLLABICS WE
+140D	CANADIAN SYLLABICS WEST-CREE WE
+140E	CANADIAN SYLLABICS WI
+140F	CANADIAN SYLLABICS WEST-CREE WI
+1410	CANADIAN SYLLABICS WII
+1411	CANADIAN SYLLABICS WEST-CREE WII
+1412	CANADIAN SYLLABICS WO
+1413	CANADIAN SYLLABICS WEST-CREE WO
+1414	CANADIAN SYLLABICS WOO
+1415	CANADIAN SYLLABICS WEST-CREE WOO
+1416	CANADIAN SYLLABICS NASKAPI WOO
+1417	CANADIAN SYLLABICS WA
+1418	CANADIAN SYLLABICS WEST-CREE WA
+1419	CANADIAN SYLLABICS WAA
+141A	CANADIAN SYLLABICS WEST-CREE WAA
+141B	CANADIAN SYLLABICS NASKAPI WAA
+141C	CANADIAN SYLLABICS AI
+	* East Cree
+141D	CANADIAN SYLLABICS Y-CREE W
+141E	CANADIAN SYLLABICS GLOTTAL STOP
+	* Moose Cree (Y), Algonquian (GLOTTAL STOP)
+141F	CANADIAN SYLLABICS FINAL ACUTE
+	* West Cree (T), East Cree (Y), Inuktitut (GLOTTAL STOP)
+	* Athapascan (B/P), Sayisi (I), Carrier (G)
+1420	CANADIAN SYLLABICS FINAL GRAVE
+	* West Cree (K), Athapascan (K), Carrier (KH)
+1421	CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+	* N Cree (SH), Sayisi (R), Carrier (NG)
+1422	CANADIAN SYLLABICS FINAL TOP HALF RING
+	* Algonquian (S), Chipewyan (R), Sayisi (S)
+1423	CANADIAN SYLLABICS FINAL RIGHT HALF RING
+	* West Cree (N), Athapascan (D/T), Sayisi (N), Carrier (N)
+1424	CANADIAN SYLLABICS FINAL RING
+	* West Cree (W), Sayisi (O)
+1425	CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+	* Chipewyan (TT), South Slavey (GH)
+1426	CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+	* Algonquian (H), Carrier (R)
+1427	CANADIAN SYLLABICS FINAL MIDDLE DOT
+	* Moose Cree (W), Athapascan (Y), Sayisi (YU)
+1428	CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+	* West Cree (C), Sayisi (D)
+1429	CANADIAN SYLLABICS FINAL PLUS
+	* Athapascan (N), Sayisi (AI)
+142A	CANADIAN SYLLABICS FINAL DOWN TACK
+	* N Cree (L), Carrier (D)
+	x (down tack - 22A4)
+142B	CANADIAN SYLLABICS EN
+142C	CANADIAN SYLLABICS IN
+142D	CANADIAN SYLLABICS ON
+142E	CANADIAN SYLLABICS AN
+142F	CANADIAN SYLLABICS PE
+	* Inuktitut (PAI), Athapascan (BE), Carrier (HU)
+1430	CANADIAN SYLLABICS PAAI
+	* Inuktitut
+1431	CANADIAN SYLLABICS PI
+1432	CANADIAN SYLLABICS PII
+1433	CANADIAN SYLLABICS PO
+	* Inuktitut (PU), Athapascan (BO), Carrier (HE)
+1434	CANADIAN SYLLABICS POO
+	* Inuktitut (PUU)
+1435	CANADIAN SYLLABICS Y-CREE POO
+1436	CANADIAN SYLLABICS CARRIER HEE
+1437	CANADIAN SYLLABICS CARRIER HI
+1438	CANADIAN SYLLABICS PA
+	* Athapascan (BA), Carrier (HA)
+1439	CANADIAN SYLLABICS PAA
+143A	CANADIAN SYLLABICS PWE
+143B	CANADIAN SYLLABICS WEST-CREE PWE
+143C	CANADIAN SYLLABICS PWI
+143D	CANADIAN SYLLABICS WEST-CREE PWI
+143E	CANADIAN SYLLABICS PWII
+143F	CANADIAN SYLLABICS WEST-CREE PWII
+1440	CANADIAN SYLLABICS PWO
+1441	CANADIAN SYLLABICS WEST-CREE PWO
+1442	CANADIAN SYLLABICS PWOO
+1443	CANADIAN SYLLABICS WEST-CREE PWOO
+1444	CANADIAN SYLLABICS PWA
+1445	CANADIAN SYLLABICS WEST-CREE PWA
+1446	CANADIAN SYLLABICS PWAA
+1447	CANADIAN SYLLABICS WEST-CREE PWAA
+1448	CANADIAN SYLLABICS Y-CREE PWAA
+1449	CANADIAN SYLLABICS P
+144A	CANADIAN SYLLABICS WEST-CREE P
+	* Sayisi (G)
+144B	CANADIAN SYLLABICS CARRIER H
+144C	CANADIAN SYLLABICS TE
+	* Inuktitut (TAI), Athapascan (DI), Carrier (DU)
+144D	CANADIAN SYLLABICS TAAI
+	* Inuktitut
+144E	CANADIAN SYLLABICS TI
+	* Athapascan (DE), Carrier (DO)
+144F	CANADIAN SYLLABICS TII
+1450	CANADIAN SYLLABICS TO
+	* Inuktitut (TU), Athapascan (DO), Carrier (DE), Sayisi (DU)
+1451	CANADIAN SYLLABICS TOO
+	* Inuktitut (TUU)
+1452	CANADIAN SYLLABICS Y-CREE TOO
+1453	CANADIAN SYLLABICS CARRIER DEE
+1454	CANADIAN SYLLABICS CARRIER DI
+1455	CANADIAN SYLLABICS TA
+	* Athapascan (DA)
+1456	CANADIAN SYLLABICS TAA
+1457	CANADIAN SYLLABICS TWE
+1458	CANADIAN SYLLABICS WEST-CREE TWE
+1459	CANADIAN SYLLABICS TWI
+145A	CANADIAN SYLLABICS WEST-CREE TWI
+145B	CANADIAN SYLLABICS TWII
+145C	CANADIAN SYLLABICS WEST-CREE TWII
+145D	CANADIAN SYLLABICS TWO
+145E	CANADIAN SYLLABICS WEST-CREE TWO
+145F	CANADIAN SYLLABICS TWOO
+1460	CANADIAN SYLLABICS WEST-CREE TWOO
+1461	CANADIAN SYLLABICS TWA
+1462	CANADIAN SYLLABICS WEST-CREE TWA
+1463	CANADIAN SYLLABICS TWAA
+1464	CANADIAN SYLLABICS WEST-CREE TWAA
+1465	CANADIAN SYLLABICS NASKAPI TWAA
+1466	CANADIAN SYLLABICS T
+1467	CANADIAN SYLLABICS TTE
+	* South Slavey (DEH)
+1468	CANADIAN SYLLABICS TTI
+	* South Slavey (DIH)
+1469	CANADIAN SYLLABICS TTO
+	* South Slavey (DOH)
+146A	CANADIAN SYLLABICS TTA
+	* South Slavey (DAH)
+146B	CANADIAN SYLLABICS KE
+	* Inuktitut (KAI)
+146C	CANADIAN SYLLABICS KAAI
+	* Inuktitut
+146D	CANADIAN SYLLABICS KI
+146E	CANADIAN SYLLABICS KII
+146F	CANADIAN SYLLABICS KO
+	* Inuktitut (KU), Sayisi (KU)
+1470	CANADIAN SYLLABICS KOO
+	* Inuktitut (KUU)
+1471	CANADIAN SYLLABICS Y-CREE KOO
+1472	CANADIAN SYLLABICS KA
+1473	CANADIAN SYLLABICS KAA
+1474	CANADIAN SYLLABICS KWE
+1475	CANADIAN SYLLABICS WEST-CREE KWE
+1476	CANADIAN SYLLABICS KWI
+1477	CANADIAN SYLLABICS WEST-CREE KWI
+1478	CANADIAN SYLLABICS KWII
+1479	CANADIAN SYLLABICS WEST-CREE KWII
+147A	CANADIAN SYLLABICS KWO
+147B	CANADIAN SYLLABICS WEST-CREE KWO
+147C	CANADIAN SYLLABICS KWOO
+147D	CANADIAN SYLLABICS WEST-CREE KWOO
+147E	CANADIAN SYLLABICS KWA
+147F	CANADIAN SYLLABICS WEST-CREE KWA
+1480	CANADIAN SYLLABICS KWAA
+1481	CANADIAN SYLLABICS WEST-CREE KWAA
+1482	CANADIAN SYLLABICS NASKAPI KWAA
+1483	CANADIAN SYLLABICS K
+1484	CANADIAN SYLLABICS KW
+	* East Cree
+1485	CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486	CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487	CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488	CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489	CANADIAN SYLLABICS CE
+	* Inuktitut (GAI), Athapascan (DHE), Sayisi (THE)
+148A	CANADIAN SYLLABICS CAAI
+	* Inuktitut (GAAI)
+148B	CANADIAN SYLLABICS CI
+	* Inuktitut (GI), Athapascan (DHI), Sayisi (THI)
+148C	CANADIAN SYLLABICS CII
+	* Inuktitut (GII)
+148D	CANADIAN SYLLABICS CO
+	* Inuktitut (GU), Athapascan (DHO), Sayisi (THO)
+148E	CANADIAN SYLLABICS COO
+	* Inuktitut (GUU)
+148F	CANADIAN SYLLABICS Y-CREE COO
+1490	CANADIAN SYLLABICS CA
+	* Inuktitut (GA), Athapascan (DHA), Sayisi (THA)
+1491	CANADIAN SYLLABICS CAA
+	* Inuktitut (GAA)
+1492	CANADIAN SYLLABICS CWE
+1493	CANADIAN SYLLABICS WEST-CREE CWE
+1494	CANADIAN SYLLABICS CWI
+1495	CANADIAN SYLLABICS WEST-CREE CWI
+1496	CANADIAN SYLLABICS CWII
+1497	CANADIAN SYLLABICS WEST-CREE CWII
+1498	CANADIAN SYLLABICS CWO
+1499	CANADIAN SYLLABICS WEST-CREE CWO
+149A	CANADIAN SYLLABICS CWOO
+149B	CANADIAN SYLLABICS WEST-CREE CWOO
+149C	CANADIAN SYLLABICS CWA
+149D	CANADIAN SYLLABICS WEST-CREE CWA
+149E	CANADIAN SYLLABICS CWAA
+149F	CANADIAN SYLLABICS WEST-CREE CWAA
+14A0	CANADIAN SYLLABICS NASKAPI CWAA
+14A1	CANADIAN SYLLABICS C
+	* Inuktitut (G), Sayisi (T)
+14A2	CANADIAN SYLLABICS SAYISI TH
+	* Athapascan (DH)
+14A3	CANADIAN SYLLABICS ME
+	* Inuktitut (MAI)
+14A4	CANADIAN SYLLABICS MAAI
+	* Inuktitut
+14A5	CANADIAN SYLLABICS MI
+14A6	CANADIAN SYLLABICS MII
+14A7	CANADIAN SYLLABICS MO
+	* Inuktitut (MU), Sayisi (MU)
+14A8	CANADIAN SYLLABICS MOO
+	* Inuktitut (MUU)
+14A9	CANADIAN SYLLABICS Y-CREE MOO
+14AA	CANADIAN SYLLABICS MA
+14AB	CANADIAN SYLLABICS MAA
+14AC	CANADIAN SYLLABICS MWE
+14AD	CANADIAN SYLLABICS WEST-CREE MWE
+14AE	CANADIAN SYLLABICS MWI
+14AF	CANADIAN SYLLABICS WEST-CREE MWI
+14B0	CANADIAN SYLLABICS MWII
+14B1	CANADIAN SYLLABICS WEST-CREE MWII
+14B2	CANADIAN SYLLABICS MWO
+14B3	CANADIAN SYLLABICS WEST-CREE MWO
+14B4	CANADIAN SYLLABICS MWOO
+14B5	CANADIAN SYLLABICS WEST-CREE MWOO
+14B6	CANADIAN SYLLABICS MWA
+14B7	CANADIAN SYLLABICS WEST-CREE MWA
+14B8	CANADIAN SYLLABICS MWAA
+14B9	CANADIAN SYLLABICS WEST-CREE MWAA
+14BA	CANADIAN SYLLABICS NASKAPI MWAA
+14BB	CANADIAN SYLLABICS M
+14BC	CANADIAN SYLLABICS WEST-CREE M
+	* Carrier (M)
+14BD	CANADIAN SYLLABICS MH
+14BE	CANADIAN SYLLABICS ATHAPASCAN M
+14BF	CANADIAN SYLLABICS SAYISI M
+14C0	CANADIAN SYLLABICS NE
+	* Inuktitut (NAI)
+14C1	CANADIAN SYLLABICS NAAI
+	* Inuktitut
+14C2	CANADIAN SYLLABICS NI
+14C3	CANADIAN SYLLABICS NII
+14C4	CANADIAN SYLLABICS NO
+	* Inuktitut (NU), Sayisi (NU)
+14C5	CANADIAN SYLLABICS NOO
+	* Inuktitut (NUU)
+14C6	CANADIAN SYLLABICS Y-CREE NOO
+14C7	CANADIAN SYLLABICS NA
+14C8	CANADIAN SYLLABICS NAA
+14C9	CANADIAN SYLLABICS NWE
+14CA	CANADIAN SYLLABICS WEST-CREE NWE
+14CB	CANADIAN SYLLABICS NWA
+14CC	CANADIAN SYLLABICS WEST-CREE NWA
+14CD	CANADIAN SYLLABICS NWAA
+14CE	CANADIAN SYLLABICS WEST-CREE NWAA
+14CF	CANADIAN SYLLABICS NASKAPI NWAA
+14D0	CANADIAN SYLLABICS N
+14D1	CANADIAN SYLLABICS CARRIER NG
+14D2	CANADIAN SYLLABICS NH
+14D3	CANADIAN SYLLABICS LE
+	* Inuktitut (LAI)
+14D4	CANADIAN SYLLABICS LAAI
+	* Inuktitut
+14D5	CANADIAN SYLLABICS LI
+14D6	CANADIAN SYLLABICS LII
+14D7	CANADIAN SYLLABICS LO
+	* Inuktitut (LU)
+14D8	CANADIAN SYLLABICS LOO
+	* Inuktitut (LUU)
+14D9	CANADIAN SYLLABICS Y-CREE LOO
+14DA	CANADIAN SYLLABICS LA
+14DB	CANADIAN SYLLABICS LAA
+14DC	CANADIAN SYLLABICS LWE
+14DD	CANADIAN SYLLABICS WEST-CREE LWE
+14DE	CANADIAN SYLLABICS LWI
+14DF	CANADIAN SYLLABICS WEST-CREE LWI
+14E0	CANADIAN SYLLABICS LWII
+14E1	CANADIAN SYLLABICS WEST-CREE LWII
+14E2	CANADIAN SYLLABICS LWO
+14E3	CANADIAN SYLLABICS WEST-CREE LWO
+14E4	CANADIAN SYLLABICS LWOO
+14E5	CANADIAN SYLLABICS WEST-CREE LWOO
+14E6	CANADIAN SYLLABICS LWA
+14E7	CANADIAN SYLLABICS WEST-CREE LWA
+14E8	CANADIAN SYLLABICS LWAA
+14E9	CANADIAN SYLLABICS WEST-CREE LWAA
+14EA	CANADIAN SYLLABICS L
+14EB	CANADIAN SYLLABICS WEST-CREE L
+14EC	CANADIAN SYLLABICS MEDIAL L
+14ED	CANADIAN SYLLABICS SE
+	* Inuktitut (SAI)
+14EE	CANADIAN SYLLABICS SAAI
+	* Inuktitut
+14EF	CANADIAN SYLLABICS SI
+14F0	CANADIAN SYLLABICS SII
+14F1	CANADIAN SYLLABICS SO
+	* Inuktitut (SU), Sayisi (SU)
+14F2	CANADIAN SYLLABICS SOO
+	* Inuktitut (SUU)
+14F3	CANADIAN SYLLABICS Y-CREE SOO
+14F4	CANADIAN SYLLABICS SA
+14F5	CANADIAN SYLLABICS SAA
+14F6	CANADIAN SYLLABICS SWE
+14F7	CANADIAN SYLLABICS WEST-CREE SWE
+14F8	CANADIAN SYLLABICS SWI
+14F9	CANADIAN SYLLABICS WEST-CREE SWI
+14FA	CANADIAN SYLLABICS SWII
+14FB	CANADIAN SYLLABICS WEST-CREE SWII
+14FC	CANADIAN SYLLABICS SWO
+14FD	CANADIAN SYLLABICS WEST-CREE SWO
+14FE	CANADIAN SYLLABICS SWOO
+14FF	CANADIAN SYLLABICS WEST-CREE SWOO
+1500	CANADIAN SYLLABICS SWA
+1501	CANADIAN SYLLABICS WEST-CREE SWA
+1502	CANADIAN SYLLABICS SWAA
+1503	CANADIAN SYLLABICS WEST-CREE SWAA
+1504	CANADIAN SYLLABICS NASKAPI SWAA
+1505	CANADIAN SYLLABICS S
+1506	CANADIAN SYLLABICS ATHAPASCAN S
+1507	CANADIAN SYLLABICS SW
+1508	CANADIAN SYLLABICS BLACKFOOT S
+1509	CANADIAN SYLLABICS MOOSE-CREE SK
+150A	CANADIAN SYLLABICS NASKAPI SKW
+150B	CANADIAN SYLLABICS NASKAPI S-W
+150C	CANADIAN SYLLABICS NASKAPI SPWA
+150D	CANADIAN SYLLABICS NASKAPI STWA
+150E	CANADIAN SYLLABICS NASKAPI SKWA
+150F	CANADIAN SYLLABICS NASKAPI SCWA
+1510	CANADIAN SYLLABICS SHE
+1511	CANADIAN SYLLABICS SHI
+1512	CANADIAN SYLLABICS SHII
+1513	CANADIAN SYLLABICS SHO
+1514	CANADIAN SYLLABICS SHOO
+1515	CANADIAN SYLLABICS SHA
+1516	CANADIAN SYLLABICS SHAA
+1517	CANADIAN SYLLABICS SHWE
+1518	CANADIAN SYLLABICS WEST-CREE SHWE
+1519	CANADIAN SYLLABICS SHWI
+151A	CANADIAN SYLLABICS WEST-CREE SHWI
+151B	CANADIAN SYLLABICS SHWII
+151C	CANADIAN SYLLABICS WEST-CREE SHWII
+151D	CANADIAN SYLLABICS SHWO
+151E	CANADIAN SYLLABICS WEST-CREE SHWO
+151F	CANADIAN SYLLABICS SHWOO
+1520	CANADIAN SYLLABICS WEST-CREE SHWOO
+1521	CANADIAN SYLLABICS SHWA
+1522	CANADIAN SYLLABICS WEST-CREE SHWA
+1523	CANADIAN SYLLABICS SHWAA
+1524	CANADIAN SYLLABICS WEST-CREE SHWAA
+1525	CANADIAN SYLLABICS SH
+1526	CANADIAN SYLLABICS YE
+	* Inuktitut (YAI)
+1527	CANADIAN SYLLABICS YAAI
+	* Inuktitut
+1528	CANADIAN SYLLABICS YI
+1529	CANADIAN SYLLABICS YII
+152A	CANADIAN SYLLABICS YO
+	* Inuktitut (YU)
+152B	CANADIAN SYLLABICS YOO
+	* Inuktitut (YUU)
+152C	CANADIAN SYLLABICS Y-CREE YOO
+152D	CANADIAN SYLLABICS YA
+152E	CANADIAN SYLLABICS YAA
+152F	CANADIAN SYLLABICS YWE
+1530	CANADIAN SYLLABICS WEST-CREE YWE
+1531	CANADIAN SYLLABICS YWI
+1532	CANADIAN SYLLABICS WEST-CREE YWI
+1533	CANADIAN SYLLABICS YWII
+1534	CANADIAN SYLLABICS WEST-CREE YWII
+1535	CANADIAN SYLLABICS YWO
+1536	CANADIAN SYLLABICS WEST-CREE YWO
+1537	CANADIAN SYLLABICS YWOO
+1538	CANADIAN SYLLABICS WEST-CREE YWOO
+1539	CANADIAN SYLLABICS YWA
+153A	CANADIAN SYLLABICS WEST-CREE YWA
+153B	CANADIAN SYLLABICS YWAA
+153C	CANADIAN SYLLABICS WEST-CREE YWAA
+153D	CANADIAN SYLLABICS NASKAPI YWAA
+153E	CANADIAN SYLLABICS Y
+153F	CANADIAN SYLLABICS BIBLE-CREE Y
+1540	CANADIAN SYLLABICS WEST-CREE Y
+1541	CANADIAN SYLLABICS SAYISI YI
+1542	CANADIAN SYLLABICS RE
+	* Inuktitut (RAI)
+1543	CANADIAN SYLLABICS R-CREE RE
+	* Athapascan (LE)
+1544	CANADIAN SYLLABICS WEST-CREE LE
+	* Athapascan (LI)
+1545	CANADIAN SYLLABICS RAAI
+	* Inuktitut
+1546	CANADIAN SYLLABICS RI
+1547	CANADIAN SYLLABICS RII
+1548	CANADIAN SYLLABICS RO
+	* Inuktitut (RU)
+1549	CANADIAN SYLLABICS ROO
+	* Inuktitut (RUU)
+154A	CANADIAN SYLLABICS WEST-CREE LO
+	* Sayisi (LU)
+154B	CANADIAN SYLLABICS RA
+154C	CANADIAN SYLLABICS RAA
+154D	CANADIAN SYLLABICS WEST-CREE LA
+154E	CANADIAN SYLLABICS RWAA
+154F	CANADIAN SYLLABICS WEST-CREE RWAA
+1550	CANADIAN SYLLABICS R
+1551	CANADIAN SYLLABICS WEST-CREE R
+1552	CANADIAN SYLLABICS MEDIAL R
+1553	CANADIAN SYLLABICS FE
+	* Inuktitut (FAI)
+1554	CANADIAN SYLLABICS FAAI
+	* Inuktitut
+1555	CANADIAN SYLLABICS FI
+1556	CANADIAN SYLLABICS FII
+1557	CANADIAN SYLLABICS FO
+1558	CANADIAN SYLLABICS FOO
+1559	CANADIAN SYLLABICS FA
+155A	CANADIAN SYLLABICS FAA
+155B	CANADIAN SYLLABICS FWAA
+155C	CANADIAN SYLLABICS WEST-CREE FWAA
+155D	CANADIAN SYLLABICS F
+155E	CANADIAN SYLLABICS THE
+	* Sayisi (TE)
+155F	CANADIAN SYLLABICS N-CREE THE
+1560	CANADIAN SYLLABICS THI
+	* Sayisi (TI)
+1561	CANADIAN SYLLABICS N-CREE THI
+1562	CANADIAN SYLLABICS THII
+1563	CANADIAN SYLLABICS N-CREE THII
+1564	CANADIAN SYLLABICS THO
+	* Sayisi (TU)
+1565	CANADIAN SYLLABICS THOO
+1566	CANADIAN SYLLABICS THA
+	* Sayisi (TA)
+1567	CANADIAN SYLLABICS THAA
+1568	CANADIAN SYLLABICS THWAA
+1569	CANADIAN SYLLABICS WEST-CREE THWAA
+156A	CANADIAN SYLLABICS TH
+156B	CANADIAN SYLLABICS TTHE
+156C	CANADIAN SYLLABICS TTHI
+156D	CANADIAN SYLLABICS TTHO
+	* Sayisi (TTHU)
+156E	CANADIAN SYLLABICS TTHA
+156F	CANADIAN SYLLABICS TTH
+	* probably a mistaken interpretation of an asterisk used to mark a proper noun
+	x (asterisk - 002A)
+1570	CANADIAN SYLLABICS TYE
+1571	CANADIAN SYLLABICS TYI
+1572	CANADIAN SYLLABICS TYO
+1573	CANADIAN SYLLABICS TYA
+1574	CANADIAN SYLLABICS NUNAVIK HE
+1575	CANADIAN SYLLABICS NUNAVIK HI
+1576	CANADIAN SYLLABICS NUNAVIK HII
+1577	CANADIAN SYLLABICS NUNAVIK HO
+1578	CANADIAN SYLLABICS NUNAVIK HOO
+1579	CANADIAN SYLLABICS NUNAVIK HA
+157A	CANADIAN SYLLABICS NUNAVIK HAA
+157B	CANADIAN SYLLABICS NUNAVIK H
+157C	CANADIAN SYLLABICS NUNAVUT H
+157D	CANADIAN SYLLABICS HK
+	* Algonquian
+157E	CANADIAN SYLLABICS QAAI
+	* Inuktitut
+157F	CANADIAN SYLLABICS QI
+1580	CANADIAN SYLLABICS QII
+1581	CANADIAN SYLLABICS QO
+	* Inuktitut (QU)
+1582	CANADIAN SYLLABICS QOO
+	* Inuktitut (QUU)
+1583	CANADIAN SYLLABICS QA
+1584	CANADIAN SYLLABICS QAA
+1585	CANADIAN SYLLABICS Q
+1586	CANADIAN SYLLABICS TLHE
+	* Sayisi (KLE)
+1587	CANADIAN SYLLABICS TLHI
+	* Sayisi (KLI)
+1588	CANADIAN SYLLABICS TLHO
+	* Sayisi (KLU)
+1589	CANADIAN SYLLABICS TLHA
+	* Sayisi (KLA)
+158A	CANADIAN SYLLABICS WEST-CREE RE
+158B	CANADIAN SYLLABICS WEST-CREE RI
+158C	CANADIAN SYLLABICS WEST-CREE RO
+158D	CANADIAN SYLLABICS WEST-CREE RA
+158E	CANADIAN SYLLABICS NGAAI
+	* Inuktitut
+158F	CANADIAN SYLLABICS NGI
+1590	CANADIAN SYLLABICS NGII
+1591	CANADIAN SYLLABICS NGO
+	* Inuktitut (NGU)
+1592	CANADIAN SYLLABICS NGOO
+	* Inuktitut (NGUU)
+1593	CANADIAN SYLLABICS NGA
+1594	CANADIAN SYLLABICS NGAA
+1595	CANADIAN SYLLABICS NG
+1596	CANADIAN SYLLABICS NNG
+1597	CANADIAN SYLLABICS SAYISI SHE
+1598	CANADIAN SYLLABICS SAYISI SHI
+1599	CANADIAN SYLLABICS SAYISI SHO
+	* Sayisi (SHU)
+159A	CANADIAN SYLLABICS SAYISI SHA
+159B	CANADIAN SYLLABICS WOODS-CREE THE
+159C	CANADIAN SYLLABICS WOODS-CREE THI
+159D	CANADIAN SYLLABICS WOODS-CREE THO
+159E	CANADIAN SYLLABICS WOODS-CREE THA
+159F	CANADIAN SYLLABICS WOODS-CREE TH
+15A0	CANADIAN SYLLABICS LHI
+15A1	CANADIAN SYLLABICS LHII
+15A2	CANADIAN SYLLABICS LHO
+	* Inuktitut (LHU)
+15A3	CANADIAN SYLLABICS LHOO
+	* Inuktitut (LHUU)
+15A4	CANADIAN SYLLABICS LHA
+15A5	CANADIAN SYLLABICS LHAA
+15A6	CANADIAN SYLLABICS LH
+15A7	CANADIAN SYLLABICS TH-CREE THE
+15A8	CANADIAN SYLLABICS TH-CREE THI
+15A9	CANADIAN SYLLABICS TH-CREE THII
+15AA	CANADIAN SYLLABICS TH-CREE THO
+15AB	CANADIAN SYLLABICS TH-CREE THOO
+15AC	CANADIAN SYLLABICS TH-CREE THA
+15AD	CANADIAN SYLLABICS TH-CREE THAA
+15AE	CANADIAN SYLLABICS TH-CREE TH
+15AF	CANADIAN SYLLABICS AIVILIK B
+15B0	CANADIAN SYLLABICS BLACKFOOT E
+15B1	CANADIAN SYLLABICS BLACKFOOT I
+15B2	CANADIAN SYLLABICS BLACKFOOT O
+15B3	CANADIAN SYLLABICS BLACKFOOT A
+15B4	CANADIAN SYLLABICS BLACKFOOT WE
+15B5	CANADIAN SYLLABICS BLACKFOOT WI
+15B6	CANADIAN SYLLABICS BLACKFOOT WO
+15B7	CANADIAN SYLLABICS BLACKFOOT WA
+15B8	CANADIAN SYLLABICS BLACKFOOT NE
+15B9	CANADIAN SYLLABICS BLACKFOOT NI
+15BA	CANADIAN SYLLABICS BLACKFOOT NO
+15BB	CANADIAN SYLLABICS BLACKFOOT NA
+15BC	CANADIAN SYLLABICS BLACKFOOT KE
+15BD	CANADIAN SYLLABICS BLACKFOOT KI
+15BE	CANADIAN SYLLABICS BLACKFOOT KO
+15BF	CANADIAN SYLLABICS BLACKFOOT KA
+15C0	CANADIAN SYLLABICS SAYISI HE
+15C1	CANADIAN SYLLABICS SAYISI HI
+15C2	CANADIAN SYLLABICS SAYISI HO
+	* Sayisi (HU)
+15C3	CANADIAN SYLLABICS SAYISI HA
+15C4	CANADIAN SYLLABICS CARRIER GHU
+15C5	CANADIAN SYLLABICS CARRIER GHO
+15C6	CANADIAN SYLLABICS CARRIER GHE
+15C7	CANADIAN SYLLABICS CARRIER GHEE
+15C8	CANADIAN SYLLABICS CARRIER GHI
+15C9	CANADIAN SYLLABICS CARRIER GHA
+15CA	CANADIAN SYLLABICS CARRIER RU
+15CB	CANADIAN SYLLABICS CARRIER RO
+15CC	CANADIAN SYLLABICS CARRIER RE
+15CD	CANADIAN SYLLABICS CARRIER REE
+15CE	CANADIAN SYLLABICS CARRIER RI
+15CF	CANADIAN SYLLABICS CARRIER RA
+15D0	CANADIAN SYLLABICS CARRIER WU
+15D1	CANADIAN SYLLABICS CARRIER WO
+15D2	CANADIAN SYLLABICS CARRIER WE
+15D3	CANADIAN SYLLABICS CARRIER WEE
+15D4	CANADIAN SYLLABICS CARRIER WI
+15D5	CANADIAN SYLLABICS CARRIER WA
+15D6	CANADIAN SYLLABICS CARRIER HWU
+15D7	CANADIAN SYLLABICS CARRIER HWO
+15D8	CANADIAN SYLLABICS CARRIER HWE
+15D9	CANADIAN SYLLABICS CARRIER HWEE
+15DA	CANADIAN SYLLABICS CARRIER HWI
+15DB	CANADIAN SYLLABICS CARRIER HWA
+15DC	CANADIAN SYLLABICS CARRIER THU
+15DD	CANADIAN SYLLABICS CARRIER THO
+15DE	CANADIAN SYLLABICS CARRIER THE
+15DF	CANADIAN SYLLABICS CARRIER THEE
+15E0	CANADIAN SYLLABICS CARRIER THI
+15E1	CANADIAN SYLLABICS CARRIER THA
+15E2	CANADIAN SYLLABICS CARRIER TTU
+15E3	CANADIAN SYLLABICS CARRIER TTO
+15E4	CANADIAN SYLLABICS CARRIER TTE
+15E5	CANADIAN SYLLABICS CARRIER TTEE
+15E6	CANADIAN SYLLABICS CARRIER TTI
+15E7	CANADIAN SYLLABICS CARRIER TTA
+15E8	CANADIAN SYLLABICS CARRIER PU
+15E9	CANADIAN SYLLABICS CARRIER PO
+15EA	CANADIAN SYLLABICS CARRIER PE
+15EB	CANADIAN SYLLABICS CARRIER PEE
+15EC	CANADIAN SYLLABICS CARRIER PI
+15ED	CANADIAN SYLLABICS CARRIER PA
+15EE	CANADIAN SYLLABICS CARRIER P
+15EF	CANADIAN SYLLABICS CARRIER GU
+15F0	CANADIAN SYLLABICS CARRIER GO
+15F1	CANADIAN SYLLABICS CARRIER GE
+15F2	CANADIAN SYLLABICS CARRIER GEE
+15F3	CANADIAN SYLLABICS CARRIER GI
+15F4	CANADIAN SYLLABICS CARRIER GA
+15F5	CANADIAN SYLLABICS CARRIER KHU
+15F6	CANADIAN SYLLABICS CARRIER KHO
+15F7	CANADIAN SYLLABICS CARRIER KHE
+15F8	CANADIAN SYLLABICS CARRIER KHEE
+15F9	CANADIAN SYLLABICS CARRIER KHI
+15FA	CANADIAN SYLLABICS CARRIER KHA
+15FB	CANADIAN SYLLABICS CARRIER KKU
+15FC	CANADIAN SYLLABICS CARRIER KKO
+15FD	CANADIAN SYLLABICS CARRIER KKE
+15FE	CANADIAN SYLLABICS CARRIER KKEE
+15FF	CANADIAN SYLLABICS CARRIER KKI
+1600	CANADIAN SYLLABICS CARRIER KKA
+1601	CANADIAN SYLLABICS CARRIER KK
+1602	CANADIAN SYLLABICS CARRIER NU
+1603	CANADIAN SYLLABICS CARRIER NO
+1604	CANADIAN SYLLABICS CARRIER NE
+1605	CANADIAN SYLLABICS CARRIER NEE
+1606	CANADIAN SYLLABICS CARRIER NI
+1607	CANADIAN SYLLABICS CARRIER NA
+1608	CANADIAN SYLLABICS CARRIER MU
+1609	CANADIAN SYLLABICS CARRIER MO
+160A	CANADIAN SYLLABICS CARRIER ME
+160B	CANADIAN SYLLABICS CARRIER MEE
+160C	CANADIAN SYLLABICS CARRIER MI
+160D	CANADIAN SYLLABICS CARRIER MA
+160E	CANADIAN SYLLABICS CARRIER YU
+160F	CANADIAN SYLLABICS CARRIER YO
+1610	CANADIAN SYLLABICS CARRIER YE
+1611	CANADIAN SYLLABICS CARRIER YEE
+1612	CANADIAN SYLLABICS CARRIER YI
+1613	CANADIAN SYLLABICS CARRIER YA
+1614	CANADIAN SYLLABICS CARRIER JU
+	* Athapascan (ZA), Sayisi (TZO), South Slavey (DHA)
+1615	CANADIAN SYLLABICS SAYISI JU
+	* Athapascan (ZO), Sayisi (TZU), South Slavey (DHO)
+1616	CANADIAN SYLLABICS CARRIER JO
+1617	CANADIAN SYLLABICS CARRIER JE
+1618	CANADIAN SYLLABICS CARRIER JEE
+1619	CANADIAN SYLLABICS CARRIER JI
+161A	CANADIAN SYLLABICS SAYISI JI
+	* Athapascan (ZE), Sayisi (TZE), South Slavey (DHE)
+161B	CANADIAN SYLLABICS CARRIER JA
+	* Athapascan (ZI), Sayisi (TZI), South Slavey (DHI)
+161C	CANADIAN SYLLABICS CARRIER JJU
+161D	CANADIAN SYLLABICS CARRIER JJO
+161E	CANADIAN SYLLABICS CARRIER JJE
+161F	CANADIAN SYLLABICS CARRIER JJEE
+1620	CANADIAN SYLLABICS CARRIER JJI
+1621	CANADIAN SYLLABICS CARRIER JJA
+1622	CANADIAN SYLLABICS CARRIER LU
+1623	CANADIAN SYLLABICS CARRIER LO
+1624	CANADIAN SYLLABICS CARRIER LE
+1625	CANADIAN SYLLABICS CARRIER LEE
+1626	CANADIAN SYLLABICS CARRIER LI
+1627	CANADIAN SYLLABICS CARRIER LA
+1628	CANADIAN SYLLABICS CARRIER DLU
+1629	CANADIAN SYLLABICS CARRIER DLO
+162A	CANADIAN SYLLABICS CARRIER DLE
+162B	CANADIAN SYLLABICS CARRIER DLEE
+162C	CANADIAN SYLLABICS CARRIER DLI
+162D	CANADIAN SYLLABICS CARRIER DLA
+162E	CANADIAN SYLLABICS CARRIER LHU
+162F	CANADIAN SYLLABICS CARRIER LHO
+1630	CANADIAN SYLLABICS CARRIER LHE
+1631	CANADIAN SYLLABICS CARRIER LHEE
+1632	CANADIAN SYLLABICS CARRIER LHI
+1633	CANADIAN SYLLABICS CARRIER LHA
+1634	CANADIAN SYLLABICS CARRIER TLHU
+1635	CANADIAN SYLLABICS CARRIER TLHO
+1636	CANADIAN SYLLABICS CARRIER TLHE
+1637	CANADIAN SYLLABICS CARRIER TLHEE
+1638	CANADIAN SYLLABICS CARRIER TLHI
+1639	CANADIAN SYLLABICS CARRIER TLHA
+163A	CANADIAN SYLLABICS CARRIER TLU
+163B	CANADIAN SYLLABICS CARRIER TLO
+163C	CANADIAN SYLLABICS CARRIER TLE
+163D	CANADIAN SYLLABICS CARRIER TLEE
+163E	CANADIAN SYLLABICS CARRIER TLI
+163F	CANADIAN SYLLABICS CARRIER TLA
+1640	CANADIAN SYLLABICS CARRIER ZU
+1641	CANADIAN SYLLABICS CARRIER ZO
+1642	CANADIAN SYLLABICS CARRIER ZE
+1643	CANADIAN SYLLABICS CARRIER ZEE
+1644	CANADIAN SYLLABICS CARRIER ZI
+1645	CANADIAN SYLLABICS CARRIER ZA
+1646	CANADIAN SYLLABICS CARRIER Z
+1647	CANADIAN SYLLABICS CARRIER INITIAL Z
+1648	CANADIAN SYLLABICS CARRIER DZU
+1649	CANADIAN SYLLABICS CARRIER DZO
+164A	CANADIAN SYLLABICS CARRIER DZE
+164B	CANADIAN SYLLABICS CARRIER DZEE
+164C	CANADIAN SYLLABICS CARRIER DZI
+164D	CANADIAN SYLLABICS CARRIER DZA
+164E	CANADIAN SYLLABICS CARRIER SU
+164F	CANADIAN SYLLABICS CARRIER SO
+1650	CANADIAN SYLLABICS CARRIER SE
+1651	CANADIAN SYLLABICS CARRIER SEE
+1652	CANADIAN SYLLABICS CARRIER SI
+1653	CANADIAN SYLLABICS CARRIER SA
+1654	CANADIAN SYLLABICS CARRIER SHU
+1655	CANADIAN SYLLABICS CARRIER SHO
+1656	CANADIAN SYLLABICS CARRIER SHE
+1657	CANADIAN SYLLABICS CARRIER SHEE
+1658	CANADIAN SYLLABICS CARRIER SHI
+1659	CANADIAN SYLLABICS CARRIER SHA
+165A	CANADIAN SYLLABICS CARRIER SH
+165B	CANADIAN SYLLABICS CARRIER TSU
+165C	CANADIAN SYLLABICS CARRIER TSO
+165D	CANADIAN SYLLABICS CARRIER TSE
+165E	CANADIAN SYLLABICS CARRIER TSEE
+165F	CANADIAN SYLLABICS CARRIER TSI
+1660	CANADIAN SYLLABICS CARRIER TSA
+1661	CANADIAN SYLLABICS CARRIER CHU
+1662	CANADIAN SYLLABICS CARRIER CHO
+1663	CANADIAN SYLLABICS CARRIER CHE
+1664	CANADIAN SYLLABICS CARRIER CHEE
+1665	CANADIAN SYLLABICS CARRIER CHI
+1666	CANADIAN SYLLABICS CARRIER CHA
+1667	CANADIAN SYLLABICS CARRIER TTSU
+1668	CANADIAN SYLLABICS CARRIER TTSO
+1669	CANADIAN SYLLABICS CARRIER TTSE
+166A	CANADIAN SYLLABICS CARRIER TTSEE
+166B	CANADIAN SYLLABICS CARRIER TTSI
+166C	CANADIAN SYLLABICS CARRIER TTSA
+@		Symbol
+166D	CANADIAN SYLLABICS CHI SIGN
+	* Algonquian
+	* used as a symbol to denote Christ
+	x (chi rho - 2627)
+@		Punctuation
+166E	CANADIAN SYLLABICS FULL STOP
+@		Syllables
+166F	CANADIAN SYLLABICS QAI
+1670	CANADIAN SYLLABICS NGAI
+1671	CANADIAN SYLLABICS NNGI
+1672	CANADIAN SYLLABICS NNGII
+1673	CANADIAN SYLLABICS NNGO
+	* Inuktitut (NNGU)
+1674	CANADIAN SYLLABICS NNGOO
+	* Inuktitut (NNGUU)
+1675	CANADIAN SYLLABICS NNGA
+1676	CANADIAN SYLLABICS NNGAA
+@@	1680	Ogham	169F
+@		Punctuation
+1680	OGHAM SPACE MARK
+	* glyph is blank in "stemless" style fonts
+@		Traditional letters
+1681	OGHAM LETTER BEITH
+1682	OGHAM LETTER LUIS
+1683	OGHAM LETTER FEARN
+1684	OGHAM LETTER SAIL
+1685	OGHAM LETTER NION
+1686	OGHAM LETTER UATH
+1687	OGHAM LETTER DAIR
+1688	OGHAM LETTER TINNE
+1689	OGHAM LETTER COLL
+168A	OGHAM LETTER CEIRT
+168B	OGHAM LETTER MUIN
+168C	OGHAM LETTER GORT
+168D	OGHAM LETTER NGEADAL
+168E	OGHAM LETTER STRAIF
+168F	OGHAM LETTER RUIS
+1690	OGHAM LETTER AILM
+1691	OGHAM LETTER ONN
+1692	OGHAM LETTER UR
+1693	OGHAM LETTER EADHADH
+1694	OGHAM LETTER IODHADH
+@		Forfeda (supplementary letters)
+1695	OGHAM LETTER EABHADH
+1696	OGHAM LETTER OR
+1697	OGHAM LETTER UILLEANN
+1698	OGHAM LETTER IFIN
+1699	OGHAM LETTER EAMHANCHOLL
+169A	OGHAM LETTER PEITH
+@		Punctuation
+169B	OGHAM FEATHER MARK
+	* marks beginning of Ogham text
+169C	OGHAM REVERSED FEATHER MARK
+	* marks end of Ogham text
+@@	16A0	Runic	16FF
+@		Letters
+16A0	RUNIC LETTER FEHU FEOH FE F
+16A1	RUNIC LETTER V
+16A2	RUNIC LETTER URUZ UR U
+16A3	RUNIC LETTER YR
+16A4	RUNIC LETTER Y
+16A5	RUNIC LETTER W
+16A6	RUNIC LETTER THURISAZ THURS THORN
+	x (latin small letter thorn - 00FE)
+16A7	RUNIC LETTER ETH
+16A8	RUNIC LETTER ANSUZ A
+16A9	RUNIC LETTER OS O
+16AA	RUNIC LETTER AC A
+16AB	RUNIC LETTER AESC
+16AC	RUNIC LETTER LONG-BRANCH-OSS O
+16AD	RUNIC LETTER SHORT-TWIG-OSS O
+16AE	RUNIC LETTER O
+16AF	RUNIC LETTER OE
+16B0	RUNIC LETTER ON
+16B1	RUNIC LETTER RAIDO RAD REID R
+16B2	RUNIC LETTER KAUNA
+16B3	RUNIC LETTER CEN
+16B4	RUNIC LETTER KAUN K
+16B5	RUNIC LETTER G
+16B6	RUNIC LETTER ENG
+16B7	RUNIC LETTER GEBO GYFU G
+16B8	RUNIC LETTER GAR
+16B9	RUNIC LETTER WUNJO WYNN W
+	x (latin letter wynn - 01BF)
+16BA	RUNIC LETTER HAGLAZ H
+16BB	RUNIC LETTER HAEGL H
+16BC	RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD	RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE	RUNIC LETTER NAUDIZ NYD NAUD N
+16BF	RUNIC LETTER SHORT-TWIG-NAUD N
+16C0	RUNIC LETTER DOTTED-N
+16C1	RUNIC LETTER ISAZ IS ISS I
+16C2	RUNIC LETTER E
+16C3	RUNIC LETTER JERAN J
+16C4	RUNIC LETTER GER
+16C5	RUNIC LETTER LONG-BRANCH-AR AE
+16C6	RUNIC LETTER SHORT-TWIG-AR A
+16C7	RUNIC LETTER IWAZ EOH
+16C8	RUNIC LETTER PERTHO PEORTH P
+16C9	RUNIC LETTER ALGIZ EOLHX
+16CA	RUNIC LETTER SOWILO S
+16CB	RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC	RUNIC LETTER SHORT-TWIG-SOL S
+16CD	RUNIC LETTER C
+16CE	RUNIC LETTER Z
+16CF	RUNIC LETTER TIWAZ TIR TYR T
+16D0	RUNIC LETTER SHORT-TWIG-TYR T
+16D1	RUNIC LETTER D
+16D2	RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3	RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4	RUNIC LETTER DOTTED-P
+16D5	RUNIC LETTER OPEN-P
+16D6	RUNIC LETTER EHWAZ EH E
+16D7	RUNIC LETTER MANNAZ MAN M
+16D8	RUNIC LETTER LONG-BRANCH-MADR M
+16D9	RUNIC LETTER SHORT-TWIG-MADR M
+16DA	RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB	RUNIC LETTER DOTTED-L
+16DC	RUNIC LETTER INGWAZ
+16DD	RUNIC LETTER ING
+16DE	RUNIC LETTER DAGAZ DAEG D
+16DF	RUNIC LETTER OTHALAN ETHEL O
+16E0	RUNIC LETTER EAR
+16E1	RUNIC LETTER IOR
+16E2	RUNIC LETTER CWEORTH
+16E3	RUNIC LETTER CALC
+16E4	RUNIC LETTER CEALC
+16E5	RUNIC LETTER STAN
+16E6	RUNIC LETTER LONG-BRANCH-YR
+16E7	RUNIC LETTER SHORT-TWIG-YR
+16E8	RUNIC LETTER ICELANDIC-YR
+16E9	RUNIC LETTER Q
+16EA	RUNIC LETTER X
+@		Punctuation
+16EB	RUNIC SINGLE PUNCTUATION
+16EC	RUNIC MULTIPLE PUNCTUATION
+16ED	RUNIC CROSS PUNCTUATION
+@		Golden number runes
+16EE	RUNIC ARLAUG SYMBOL (golden number 17)
+	* golden number 17
+16EF	RUNIC TVIMADUR SYMBOL (golden number 18)
+	* golden number 18
+16F0	RUNIC BELGTHOR SYMBOL (golden number 19)
+	* golden number 19
+@@	1700	Tagalog	171F
+@		Independent vowels
+1700	TAGALOG LETTER A
+1701	TAGALOG LETTER I
+1702	TAGALOG LETTER U
+@		Consonants
+1703	TAGALOG LETTER KA
+1704	TAGALOG LETTER GA
+1705	TAGALOG LETTER NGA
+1706	TAGALOG LETTER TA
+1707	TAGALOG LETTER DA
+1708	TAGALOG LETTER NA
+1709	TAGALOG LETTER PA
+170A	TAGALOG LETTER BA
+170B	TAGALOG LETTER MA
+170C	TAGALOG LETTER YA
+170E	TAGALOG LETTER LA
+170F	TAGALOG LETTER WA
+1710	TAGALOG LETTER SA
+1711	TAGALOG LETTER HA
+@		Dependent vowel signs
+1712	TAGALOG VOWEL SIGN I
+1713	TAGALOG VOWEL SIGN U
+@		Virama
+1714	TAGALOG SIGN VIRAMA
+@@	1720	Hanunoo	173F
+@		Independent vowels
+1720	HANUNOO LETTER A
+1721	HANUNOO LETTER I
+1722	HANUNOO LETTER U
+@		Consonants
+1723	HANUNOO LETTER KA
+1724	HANUNOO LETTER GA
+1725	HANUNOO LETTER NGA
+1726	HANUNOO LETTER TA
+1727	HANUNOO LETTER DA
+1728	HANUNOO LETTER NA
+1729	HANUNOO LETTER PA
+172A	HANUNOO LETTER BA
+172B	HANUNOO LETTER MA
+172C	HANUNOO LETTER YA
+172D	HANUNOO LETTER RA
+172E	HANUNOO LETTER LA
+172F	HANUNOO LETTER WA
+1730	HANUNOO LETTER SA
+1731	HANUNOO LETTER HA
+@		Dependent vowel signs
+1732	HANUNOO VOWEL SIGN I
+1733	HANUNOO VOWEL SIGN U
+@		Virama
+1734	HANUNOO SIGN PAMUDPOD
+@		Generic punctuation for Philippine scripts
+1735	PHILIPPINE SINGLE PUNCTUATION
+	x (devanagari danda - 0964)
+1736	PHILIPPINE DOUBLE PUNCTUATION
+	x (devanagari double danda - 0965)
+@@	1740	Buhid	175F
+@		Independent vowels
+1740	BUHID LETTER A
+1741	BUHID LETTER I
+1742	BUHID LETTER U
+@		Consonants
+1743	BUHID LETTER KA
+1744	BUHID LETTER GA
+1745	BUHID LETTER NGA
+1746	BUHID LETTER TA
+1747	BUHID LETTER DA
+1748	BUHID LETTER NA
+1749	BUHID LETTER PA
+174A	BUHID LETTER BA
+174B	BUHID LETTER MA
+174C	BUHID LETTER YA
+174D	BUHID LETTER RA
+174E	BUHID LETTER LA
+174F	BUHID LETTER WA
+1750	BUHID LETTER SA
+1751	BUHID LETTER HA
+@		Dependent vowel signs
+1752	BUHID VOWEL SIGN I
+1753	BUHID VOWEL SIGN U
+@@	1760	Tagbanwa	177F
+@		Independent vowels
+1760	TAGBANWA LETTER A
+1761	TAGBANWA LETTER I
+1762	TAGBANWA LETTER U
+@		Consonants
+1763	TAGBANWA LETTER KA
+1764	TAGBANWA LETTER GA
+1765	TAGBANWA LETTER NGA
+1766	TAGBANWA LETTER TA
+1767	TAGBANWA LETTER DA
+1768	TAGBANWA LETTER NA
+1769	TAGBANWA LETTER PA
+176A	TAGBANWA LETTER BA
+176B	TAGBANWA LETTER MA
+176C	TAGBANWA LETTER YA
+176E	TAGBANWA LETTER LA
+176F	TAGBANWA LETTER WA
+1770	TAGBANWA LETTER SA
+@		Dependent vowel signs
+1772	TAGBANWA VOWEL SIGN I
+1773	TAGBANWA VOWEL SIGN U
+@@	1780	Khmer	17FF
+@		Consonants
+1780	KHMER LETTER KA
+1781	KHMER LETTER KHA
+1782	KHMER LETTER KO
+1783	KHMER LETTER KHO
+1784	KHMER LETTER NGO
+1785	KHMER LETTER CA
+1786	KHMER LETTER CHA
+1787	KHMER LETTER CO
+1788	KHMER LETTER CHO
+1789	KHMER LETTER NYO
+178A	KHMER LETTER DA
+178B	KHMER LETTER TTHA
+178C	KHMER LETTER DO
+178D	KHMER LETTER TTHO
+178E	KHMER LETTER NNO
+	* as this character belongs to the first register, its correct transliteration is nna, not nno
+178F	KHMER LETTER TA
+1790	KHMER LETTER THA
+1791	KHMER LETTER TO
+1792	KHMER LETTER THO
+1793	KHMER LETTER NO
+1794	KHMER LETTER BA
+1795	KHMER LETTER PHA
+1796	KHMER LETTER PO
+1797	KHMER LETTER PHO
+1798	KHMER LETTER MO
+1799	KHMER LETTER YO
+179A	KHMER LETTER RO
+179B	KHMER LETTER LO
+179C	KHMER LETTER VO
+179D	KHMER LETTER SHA
+	* used only for Pali/Sanskrit transliteration
+179E	KHMER LETTER SSO
+	* used only for Pali/Sanskrit transliteration
+	* as this character belongs to the first register, its correct transliteration is ssa, not sso
+179F	KHMER LETTER SA
+17A0	KHMER LETTER HA
+17A1	KHMER LETTER LA
+17A2	KHMER LETTER QA
+	* glottal stop
+@		Independent vowel (deprecated)
+17A3	KHMER INDEPENDENT VOWEL QAQ *
+	* originally intended only for Pali/Sanskrit transliteration
+	* use of this character is strongly discouraged; 17A2 should be used instead
+@		Independent vowels
+17A4	KHMER INDEPENDENT VOWEL QAA *
+	* used only for Pali/Sanskrit transliteration
+	* use of this character is discouraged; the sequence 17A2 17B6 should be used instead
+17A5	KHMER INDEPENDENT VOWEL QI
+17A6	KHMER INDEPENDENT VOWEL QII
+17A7	KHMER INDEPENDENT VOWEL QU
+17A8	KHMER INDEPENDENT VOWEL QUK
+	* obsolete ligature for the sequence 17A7 1780
+	* use of the sequence is now preferred
+17A9	KHMER INDEPENDENT VOWEL QUU
+17AA	KHMER INDEPENDENT VOWEL QUUV
+17AB	KHMER INDEPENDENT VOWEL RY
+17AC	KHMER INDEPENDENT VOWEL RYY
+17AD	KHMER INDEPENDENT VOWEL LY
+17AE	KHMER INDEPENDENT VOWEL LYY
+17AF	KHMER INDEPENDENT VOWEL QE
+17B0	KHMER INDEPENDENT VOWEL QAI
+17B1	KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2	KHMER INDEPENDENT VOWEL QOO TYPE TWO
+	* this is a variant for 17B1, used in only two words
+	* 17B1 is the normal variant of this vowel
+17B3	KHMER INDEPENDENT VOWEL QAU
+@		Inherent vowels
+@+		These are for phonetic transcription to distinguish Indic language inherent vowels from Khmer inherent vowels. These characters are included solely for compatibility with particular applications; their use in other contexts is discouraged.
+17B4	KHMER VOWEL INHERENT AQ *
+17B5	KHMER VOWEL INHERENT AA *
+@		Dependent vowel signs
+17B6	KHMER VOWEL SIGN AA
+17B7	KHMER VOWEL SIGN I
+17B8	KHMER VOWEL SIGN II
+17B9	KHMER VOWEL SIGN Y
+17BA	KHMER VOWEL SIGN YY
+17BB	KHMER VOWEL SIGN U
+17BC	KHMER VOWEL SIGN UU
+17BD	KHMER VOWEL SIGN UA
+@		Two-part dependent vowel signs
+@+		These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for processing.
+17BE	KHMER VOWEL SIGN OE
+17BF	KHMER VOWEL SIGN YA
+17C0	KHMER VOWEL SIGN IE
+@		Dependent vowel signs
+17C1	KHMER VOWEL SIGN E
+17C2	KHMER VOWEL SIGN AE
+17C3	KHMER VOWEL SIGN AI
+@		Two-part dependent vowel signs
+@+		These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for processing.
+17C4	KHMER VOWEL SIGN OO
+17C5	KHMER VOWEL SIGN AU
+@		Various signs
+17C6	KHMER SIGN NIKAHIT
+	= srak am
+	= anusvara
+	* final nasalization
+	* this character is usually regarded as a vowel sign am, along with om and aam
+	x (thai character nikhahit - 0E4D)
+	x (myanmar sign anusvara - 1036)
+17C7	KHMER SIGN REAHMUK
+	= srak ah
+	= visarga
+	x (myanmar sign visarga - 1038)
+17C8	KHMER SIGN YUUKALEAPINTU
+	* inserts a short inherent vowel with abrupt glottal stop
+	* the preferred transliteration is yukaleakpintu
+@		Consonant shifters
+@+		These signs shift the base consonant between registers.
+17C9	KHMER SIGN MUUSIKATOAN
+	* changes the second register to the first
+	* the preferred transliteration is muusekatoan
+17CA	KHMER SIGN TRIISAP
+	* changes the first register to the second
+	* the preferred transliteration is treisap
+@		Various signs
+17CB	KHMER SIGN BANTOC
+	* shortens the vowel sound in the previous orthographic syllable
+	* the preferred transliteration is bantak
+17CC	KHMER SIGN ROBAT
+	* a diacritic historically corresponding to the repha form of ra in Devanagari
+17CD	KHMER SIGN TOANDAKHIAT
+	* indicates that the base character is not pronounced
+17CE	KHMER SIGN KAKABAT
+	* sign used with some exclamations
+17CF	KHMER SIGN AHSDA
+	* denotes stressed intonation in some single-consonant words
+17D0	KHMER SIGN SAMYOK SANNYA
+	* denotes deviation from the general rules of pronunciation, mostly used in loan words from Pali/Sanskrit, French, and so on
+17D1	KHMER SIGN VIRIAM
+	* mostly obsolete, a "killer"
+	* indicates that the base character is the final consonant of a word without its inherent vowel sound
+17D2	KHMER SIGN COENG
+	* functions to indicate that the following Khmer letter is to be rendered subscripted
+	* shape shown is arbitrary and is not visibly rendered
+@		Lunar date sign (deprecated)
+17D3	KHMER SIGN BATHAMASAT *
+	* originally intended as part of lunar date symbols
+	* use of this character is strongly discouraged in favor of the complete set of lunar date symbols
+	x (khmer symbol pathamasat - 19E0)
+@		Various signs
+17D4	KHMER SIGN KHAN
+	* functions as a full stop, period
+	x (thai character paiyannoi - 0E2F)
+	x (myanmar sign little section - 104A)
+17D5	KHMER SIGN BARIYOOSAN
+	* indicates the end of a section or a text
+	x (thai character angkhankhu - 0E5A)
+	x (myanmar sign section - 104B)
+17D6	KHMER SIGN CAMNUC PII KUUH
+	* functions as colon
+	* the preferred transliteration is camnoc pii kuuh
+	x (division sign - 00F7)
+	x (tibetan mark gter tsheg - 0F14)
+17D7	KHMER SIGN LEK TOO
+	* repetition sign
+	x (thai character maiyamok - 0E46)
+17D8	KHMER SIGN BEYYAL *
+	* et cetera
+	* use of this character is discouraged; other abbreviations for et cetera also exist
+	* preferred spelling: 17D4 179B 17D4
+17D9	KHMER SIGN PHNAEK MUAN
+	* indicates the beginning of a book or a treatise
+	* the preferred transliteration is phnek moan
+	x (thai character fongman - 0E4F)
+17DA	KHMER SIGN KOOMUUT
+	* indicates the end of a book or treatise
+	* this forms a pair with 17D9
+	* the preferred transliteration is koomoot
+	x (thai character khomut - 0E5B)
+@		Currency symbol
+17DB	KHMER CURRENCY SYMBOL RIEL
+@		Various signs
+17DC	KHMER SIGN AVAKRAHASANYA
+	* rare, shows an omitted Sanskrit vowel, like an apostrophe
+	* the preferred transliteration is avakraha sannya
+	x (devanagari sign avagraha - 093D)
+17DD	KHMER SIGN ATTHACAN
+	* mostly obsolete
+	* indicates that the base character is the final consonant of a word with its inherent vowel sound
+	x (khmer sign viriam - 17D1)
+@		Digits
+17E0	KHMER DIGIT ZERO
+17E1	KHMER DIGIT ONE
+17E2	KHMER DIGIT TWO
+17E3	KHMER DIGIT THREE
+17E4	KHMER DIGIT FOUR
+17E5	KHMER DIGIT FIVE
+17E6	KHMER DIGIT SIX
+17E7	KHMER DIGIT SEVEN
+17E8	KHMER DIGIT EIGHT
+17E9	KHMER DIGIT NINE
+@		Numeric symbols for divination lore
+@+		These characters have numeric values 0-9, respectively, but are not used for calculation.
+17F0	KHMER SYMBOL LEK ATTAK SON
+17F1	KHMER SYMBOL LEK ATTAK MUOY
+17F2	KHMER SYMBOL LEK ATTAK PII
+17F3	KHMER SYMBOL LEK ATTAK BEI
+17F4	KHMER SYMBOL LEK ATTAK BUON
+17F5	KHMER SYMBOL LEK ATTAK PRAM
+17F6	KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7	KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8	KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9	KHMER SYMBOL LEK ATTAK PRAM-BUON
+@@	1800	Mongolian	18AF
+@		Punctuation
+1800	MONGOLIAN BIRGA
+	x (tibetan mark initial yig mgo mdun ma - 0F04)
+1801	MONGOLIAN ELLIPSIS
+1802	MONGOLIAN COMMA
+1803	MONGOLIAN FULL STOP
+1804	MONGOLIAN COLON
+1805	MONGOLIAN FOUR DOTS
+	* marks the end of a chapter
+1806	MONGOLIAN TODO SOFT HYPHEN
+	* not a format control character, but simply a hyphen for Todo
+	x (soft hyphen - 00AD)
+1807	MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808	MONGOLIAN MANCHU COMMA
+1809	MONGOLIAN MANCHU FULL STOP
+180A	MONGOLIAN NIRUGU
+@		Format controls
+180B	MONGOLIAN FREE VARIATION SELECTOR ONE
+	= FVS1
+180C	MONGOLIAN FREE VARIATION SELECTOR TWO
+	= FVS2
+180D	MONGOLIAN FREE VARIATION SELECTOR THREE
+	= FVS3
+180E	MONGOLIAN VOWEL SEPARATOR
+	= MVS
+@		Digits
+1810	MONGOLIAN DIGIT ZERO
+1811	MONGOLIAN DIGIT ONE
+1812	MONGOLIAN DIGIT TWO
+1813	MONGOLIAN DIGIT THREE
+1814	MONGOLIAN DIGIT FOUR
+1815	MONGOLIAN DIGIT FIVE
+1816	MONGOLIAN DIGIT SIX
+1817	MONGOLIAN DIGIT SEVEN
+1818	MONGOLIAN DIGIT EIGHT
+1819	MONGOLIAN DIGIT NINE
+@		Basic letters
+1820	MONGOLIAN LETTER A
+	x (cyrillic small letter a - 0430)
+1821	MONGOLIAN LETTER E
+	x (cyrillic small letter e - 044D)
+1822	MONGOLIAN LETTER I
+	x (cyrillic small letter i - 0438)
+1823	MONGOLIAN LETTER O
+	x (cyrillic small letter o - 043E)
+1824	MONGOLIAN LETTER U
+	x (cyrillic small letter u - 0443)
+1825	MONGOLIAN LETTER OE
+	x (cyrillic small letter barred o - 04E9)
+1826	MONGOLIAN LETTER UE
+	x (cyrillic small letter straight u - 04AF)
+1827	MONGOLIAN LETTER EE
+1828	MONGOLIAN LETTER NA
+	x (cyrillic small letter en - 043D)
+1829	MONGOLIAN LETTER ANG
+182A	MONGOLIAN LETTER BA
+	x (cyrillic small letter be - 0431)
+182B	MONGOLIAN LETTER PA
+	x (cyrillic small letter pe - 043F)
+182C	MONGOLIAN LETTER QA
+	x (cyrillic small letter ha - 0445)
+182D	MONGOLIAN LETTER GA
+	x (cyrillic small letter ghe - 0433)
+182E	MONGOLIAN LETTER MA
+	x (cyrillic small letter em - 043C)
+182F	MONGOLIAN LETTER LA
+	x (cyrillic small letter el - 043B)
+1830	MONGOLIAN LETTER SA
+	x (cyrillic small letter es - 0441)
+1831	MONGOLIAN LETTER SHA
+	x (cyrillic small letter sha - 0448)
+1832	MONGOLIAN LETTER TA
+	x (cyrillic small letter te - 0442)
+1833	MONGOLIAN LETTER DA
+	x (cyrillic small letter de - 0434)
+1834	MONGOLIAN LETTER CHA
+	x (cyrillic small letter che - 0447)
+1835	MONGOLIAN LETTER JA
+	x (cyrillic small letter zhe - 0436)
+1836	MONGOLIAN LETTER YA
+	x (cyrillic small letter short i - 0439)
+1837	MONGOLIAN LETTER RA
+	x (cyrillic small letter er - 0440)
+1838	MONGOLIAN LETTER WA
+	x (cyrillic small letter ve - 0432)
+1839	MONGOLIAN LETTER FA
+	x (cyrillic small letter ef - 0444)
+183A	MONGOLIAN LETTER KA
+	x (cyrillic small letter ha - 0445)
+183B	MONGOLIAN LETTER KHA
+	x (cyrillic small letter ka - 043A)
+183C	MONGOLIAN LETTER TSA
+	x (cyrillic small letter tse - 0446)
+183D	MONGOLIAN LETTER ZA
+	x (cyrillic small letter ze - 0437)
+183E	MONGOLIAN LETTER HAA
+	x (cyrillic small letter ha - 0445)
+183F	MONGOLIAN LETTER ZRA
+	x (cyrillic small letter zhe - 0436)
+1840	MONGOLIAN LETTER LHA
+1841	MONGOLIAN LETTER ZHI
+1842	MONGOLIAN LETTER CHI
+@		Todo letters
+1843	MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844	MONGOLIAN LETTER TODO E
+1845	MONGOLIAN LETTER TODO I
+1846	MONGOLIAN LETTER TODO O
+1847	MONGOLIAN LETTER TODO U
+1848	MONGOLIAN LETTER TODO OE
+1849	MONGOLIAN LETTER TODO UE
+184A	MONGOLIAN LETTER TODO ANG
+184B	MONGOLIAN LETTER TODO BA
+184C	MONGOLIAN LETTER TODO PA
+184D	MONGOLIAN LETTER TODO QA
+184E	MONGOLIAN LETTER TODO GA
+184F	MONGOLIAN LETTER TODO MA
+1850	MONGOLIAN LETTER TODO TA
+1851	MONGOLIAN LETTER TODO DA
+1852	MONGOLIAN LETTER TODO CHA
+1853	MONGOLIAN LETTER TODO JA
+1854	MONGOLIAN LETTER TODO TSA
+1855	MONGOLIAN LETTER TODO YA
+1856	MONGOLIAN LETTER TODO WA
+1857	MONGOLIAN LETTER TODO KA
+1858	MONGOLIAN LETTER TODO GAA
+1859	MONGOLIAN LETTER TODO HAA
+185A	MONGOLIAN LETTER TODO JIA
+185B	MONGOLIAN LETTER TODO NIA
+185C	MONGOLIAN LETTER TODO DZA
+@		Sibe letters
+185D	MONGOLIAN LETTER SIBE E
+185E	MONGOLIAN LETTER SIBE I
+185F	MONGOLIAN LETTER SIBE IY
+1860	MONGOLIAN LETTER SIBE UE
+1861	MONGOLIAN LETTER SIBE U
+1862	MONGOLIAN LETTER SIBE ANG
+1863	MONGOLIAN LETTER SIBE KA
+1864	MONGOLIAN LETTER SIBE GA
+1865	MONGOLIAN LETTER SIBE HA
+1866	MONGOLIAN LETTER SIBE PA
+1867	MONGOLIAN LETTER SIBE SHA
+1868	MONGOLIAN LETTER SIBE TA
+1869	MONGOLIAN LETTER SIBE DA
+186A	MONGOLIAN LETTER SIBE JA
+186B	MONGOLIAN LETTER SIBE FA
+186C	MONGOLIAN LETTER SIBE GAA
+186D	MONGOLIAN LETTER SIBE HAA
+186E	MONGOLIAN LETTER SIBE TSA
+186F	MONGOLIAN LETTER SIBE ZA
+1870	MONGOLIAN LETTER SIBE RAA
+1871	MONGOLIAN LETTER SIBE CHA
+1872	MONGOLIAN LETTER SIBE ZHA
+@		Manchu letters
+1873	MONGOLIAN LETTER MANCHU I
+1874	MONGOLIAN LETTER MANCHU KA
+1875	MONGOLIAN LETTER MANCHU RA
+1876	MONGOLIAN LETTER MANCHU FA
+1877	MONGOLIAN LETTER MANCHU ZHA
+@		Extensions for Sanskrit and Tibetan
+1880	MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+	x (tibetan sign sna ldan - 0F83)
+1881	MONGOLIAN LETTER ALI GALI VISARGA ONE
+	x (tibetan sign rnam bcad - 0F7F)
+1882	MONGOLIAN LETTER ALI GALI DAMARU
+	x (tibetan sign lce tsa can - 0F88)
+1883	MONGOLIAN LETTER ALI GALI UBADAMA
+1884	MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885	MONGOLIAN LETTER ALI GALI BALUDA
+	x (tibetan mark paluta - 0F85)
+1886	MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887	MONGOLIAN LETTER ALI GALI A
+1888	MONGOLIAN LETTER ALI GALI I
+1889	MONGOLIAN LETTER ALI GALI KA
+188A	MONGOLIAN LETTER ALI GALI NGA
+188B	MONGOLIAN LETTER ALI GALI CA
+188C	MONGOLIAN LETTER ALI GALI TTA
+188D	MONGOLIAN LETTER ALI GALI TTHA
+188E	MONGOLIAN LETTER ALI GALI DDA
+188F	MONGOLIAN LETTER ALI GALI NNA
+1890	MONGOLIAN LETTER ALI GALI TA
+1891	MONGOLIAN LETTER ALI GALI DA
+1892	MONGOLIAN LETTER ALI GALI PA
+1893	MONGOLIAN LETTER ALI GALI PHA
+1894	MONGOLIAN LETTER ALI GALI SSA
+1895	MONGOLIAN LETTER ALI GALI ZHA
+1896	MONGOLIAN LETTER ALI GALI ZA
+1897	MONGOLIAN LETTER ALI GALI AH
+1898	MONGOLIAN LETTER TODO ALI GALI TA
+1899	MONGOLIAN LETTER TODO ALI GALI ZHA
+189A	MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B	MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C	MONGOLIAN LETTER MANCHU ALI GALI CA
+189D	MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E	MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F	MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0	MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1	MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2	MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3	MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4	MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5	MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6	MONGOLIAN LETTER ALI GALI HALF U
+18A7	MONGOLIAN LETTER ALI GALI HALF YA
+18A8	MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9	MONGOLIAN LETTER ALI GALI DAGALGA
+@@	1900	Limbu	194F
+@		Consonants
+1900	LIMBU VOWEL-CARRIER LETTER
+1901	LIMBU LETTER KA
+1902	LIMBU LETTER KHA
+1903	LIMBU LETTER GA
+1904	LIMBU LETTER GHA
+1905	LIMBU LETTER NGA
+1906	LIMBU LETTER CA
+1907	LIMBU LETTER CHA
+1908	LIMBU LETTER JA
+1909	LIMBU LETTER JHA
+190A	LIMBU LETTER YAN
+190B	LIMBU LETTER TA
+190C	LIMBU LETTER THA
+190D	LIMBU LETTER DA
+190E	LIMBU LETTER DHA
+190F	LIMBU LETTER NA
+1910	LIMBU LETTER PA
+1911	LIMBU LETTER PHA
+1912	LIMBU LETTER BA
+1913	LIMBU LETTER BHA
+1914	LIMBU LETTER MA
+1915	LIMBU LETTER YA
+1916	LIMBU LETTER RA
+1917	LIMBU LETTER LA
+1918	LIMBU LETTER WA
+1919	LIMBU LETTER SHA
+191A	LIMBU LETTER SSA
+191B	LIMBU LETTER SA
+191C	LIMBU LETTER HA
+@		Dependent vowel signs
+1920	LIMBU VOWEL SIGN A
+1921	LIMBU VOWEL SIGN I
+1922	LIMBU VOWEL SIGN U
+1923	LIMBU VOWEL SIGN EE
+1924	LIMBU VOWEL SIGN AI
+1925	LIMBU VOWEL SIGN OO
+1926	LIMBU VOWEL SIGN AU
+1927	LIMBU VOWEL SIGN E
+1928	LIMBU VOWEL SIGN O
+@		Subjoined consonants
+1929	LIMBU SUBJOINED LETTER YA
+192A	LIMBU SUBJOINED LETTER RA
+192B	LIMBU SUBJOINED LETTER WA
+@		Final consonants
+1930	LIMBU SMALL LETTER KA
+1931	LIMBU SMALL LETTER NGA
+1932	LIMBU SMALL LETTER ANUSVARA
+1933	LIMBU SMALL LETTER TA
+1934	LIMBU SMALL LETTER NA
+1935	LIMBU SMALL LETTER PA
+1936	LIMBU SMALL LETTER MA
+1937	LIMBU SMALL LETTER RA
+1938	LIMBU SMALL LETTER LA
+@		Various signs
+1939	LIMBU SIGN MUKPHRENG
+193A	LIMBU SIGN KEMPHRENG
+193B	LIMBU SIGN SA-I
+1940	LIMBU SIGN LOO
+1944	LIMBU EXCLAMATION MARK
+1945	LIMBU QUESTION MARK
+@		Digits
+1946	LIMBU DIGIT ZERO
+1947	LIMBU DIGIT ONE
+1948	LIMBU DIGIT TWO
+1949	LIMBU DIGIT THREE
+194A	LIMBU DIGIT FOUR
+194B	LIMBU DIGIT FIVE
+194C	LIMBU DIGIT SIX
+194D	LIMBU DIGIT SEVEN
+194E	LIMBU DIGIT EIGHT
+194F	LIMBU DIGIT NINE
+@@	1950	Tai Le	197F
+@		Consonants
+1950	TAI LE LETTER KA
+1951	TAI LE LETTER XA
+1952	TAI LE LETTER NGA
+1953	TAI LE LETTER TSA
+1954	TAI LE LETTER SA
+1955	TAI LE LETTER YA
+1956	TAI LE LETTER TA
+1957	TAI LE LETTER THA
+1958	TAI LE LETTER LA
+1959	TAI LE LETTER PA
+195A	TAI LE LETTER PHA
+195B	TAI LE LETTER MA
+195C	TAI LE LETTER FA
+195D	TAI LE LETTER VA
+195E	TAI LE LETTER HA
+195F	TAI LE LETTER QA
+1960	TAI LE LETTER KHA
+1961	TAI LE LETTER TSHA
+1962	TAI LE LETTER NA
+@		Vowels
+1963	TAI LE LETTER A
+1964	TAI LE LETTER I
+1965	TAI LE LETTER EE
+1966	TAI LE LETTER EH
+1967	TAI LE LETTER U
+1968	TAI LE LETTER OO
+1969	TAI LE LETTER O
+196A	TAI LE LETTER UE
+196B	TAI LE LETTER E
+196C	TAI LE LETTER AUE
+196D	TAI LE LETTER AI
+@		Tone letters
+1970	TAI LE LETTER TONE-2
+1971	TAI LE LETTER TONE-3
+1972	TAI LE LETTER TONE-4
+1973	TAI LE LETTER TONE-5
+1974	TAI LE LETTER TONE-6
+@@	1980	New Tai Lue	19DF
+@+		This script is also known as Xishuang Banna Dai.
+@		Consonants
+1980	NEW TAI LUE LETTER HIGH QA
+1981	NEW TAI LUE LETTER LOW QA
+1982	NEW TAI LUE LETTER HIGH KA
+1983	NEW TAI LUE LETTER HIGH XA
+1984	NEW TAI LUE LETTER HIGH NGA
+1985	NEW TAI LUE LETTER LOW KA
+1986	NEW TAI LUE LETTER LOW XA
+1987	NEW TAI LUE LETTER LOW NGA
+1988	NEW TAI LUE LETTER HIGH TSA
+1989	NEW TAI LUE LETTER HIGH SA
+198A	NEW TAI LUE LETTER HIGH YA
+198B	NEW TAI LUE LETTER LOW TSA
+198C	NEW TAI LUE LETTER LOW SA
+198D	NEW TAI LUE LETTER LOW YA
+198E	NEW TAI LUE LETTER HIGH TA
+198F	NEW TAI LUE LETTER HIGH THA
+1990	NEW TAI LUE LETTER HIGH NA
+1991	NEW TAI LUE LETTER LOW TA
+1992	NEW TAI LUE LETTER LOW THA
+1993	NEW TAI LUE LETTER LOW NA
+1994	NEW TAI LUE LETTER HIGH PA
+1995	NEW TAI LUE LETTER HIGH PHA
+1996	NEW TAI LUE LETTER HIGH MA
+1997	NEW TAI LUE LETTER LOW PA
+1998	NEW TAI LUE LETTER LOW PHA
+1999	NEW TAI LUE LETTER LOW MA
+199A	NEW TAI LUE LETTER HIGH FA
+199B	NEW TAI LUE LETTER HIGH VA
+199C	NEW TAI LUE LETTER HIGH LA
+199D	NEW TAI LUE LETTER LOW FA
+199E	NEW TAI LUE LETTER LOW VA
+199F	NEW TAI LUE LETTER LOW LA
+19A0	NEW TAI LUE LETTER HIGH HA
+19A1	NEW TAI LUE LETTER HIGH DA
+19A2	NEW TAI LUE LETTER HIGH BA
+19A3	NEW TAI LUE LETTER LOW HA
+19A4	NEW TAI LUE LETTER LOW DA
+19A5	NEW TAI LUE LETTER LOW BA
+19A6	NEW TAI LUE LETTER HIGH KVA
+19A7	NEW TAI LUE LETTER HIGH XVA
+19A8	NEW TAI LUE LETTER LOW KVA
+19A9	NEW TAI LUE LETTER LOW XVA
+@		Vowel signs
+19B0	NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1	NEW TAI LUE VOWEL SIGN AA
+19B2	NEW TAI LUE VOWEL SIGN II
+19B3	NEW TAI LUE VOWEL SIGN U
+19B4	NEW TAI LUE VOWEL SIGN UU
+19B5	NEW TAI LUE VOWEL SIGN E
+19B6	NEW TAI LUE VOWEL SIGN AE
+19B7	NEW TAI LUE VOWEL SIGN O
+19B8	NEW TAI LUE VOWEL SIGN OA
+19B9	NEW TAI LUE VOWEL SIGN UE
+19BA	NEW TAI LUE VOWEL SIGN AY
+19BB	NEW TAI LUE VOWEL SIGN AAY
+19BC	NEW TAI LUE VOWEL SIGN UY
+19BD	NEW TAI LUE VOWEL SIGN OY
+19BE	NEW TAI LUE VOWEL SIGN OAY
+19BF	NEW TAI LUE VOWEL SIGN UEY
+19C0	NEW TAI LUE VOWEL SIGN IY
+@		Final consonants
+19C1	NEW TAI LUE LETTER FINAL V
+19C2	NEW TAI LUE LETTER FINAL NG
+19C3	NEW TAI LUE LETTER FINAL N
+19C4	NEW TAI LUE LETTER FINAL M
+19C5	NEW TAI LUE LETTER FINAL K
+19C6	NEW TAI LUE LETTER FINAL D
+19C7	NEW TAI LUE LETTER FINAL B
+@		Tone marks
+19C8	NEW TAI LUE TONE MARK-1
+19C9	NEW TAI LUE TONE MARK-2
+@		Digits
+19D0	NEW TAI LUE DIGIT ZERO
+19D1	NEW TAI LUE DIGIT ONE
+19D2	NEW TAI LUE DIGIT TWO
+19D3	NEW TAI LUE DIGIT THREE
+19D4	NEW TAI LUE DIGIT FOUR
+19D5	NEW TAI LUE DIGIT FIVE
+19D6	NEW TAI LUE DIGIT SIX
+19D7	NEW TAI LUE DIGIT SEVEN
+19D8	NEW TAI LUE DIGIT EIGHT
+19D9	NEW TAI LUE DIGIT NINE
+@		Various signs
+19DE	NEW TAI LUE SIGN LAE
+	* conjunction: and
+19DF	NEW TAI LUE SIGN LAEV
+	* perfective
+@@	19E0	Khmer Symbols	19FF
+@		Lunar date symbols
+19E0	KHMER SYMBOL PATHAMASAT
+	* represents the first August in a leap year
+@+		The following fifteen characters represent the first through the fifteenth waxing days, respectively.
+19E1	KHMER SYMBOL MUOY KOET
+19E2	KHMER SYMBOL PII KOET
+19E3	KHMER SYMBOL BEI KOET
+19E4	KHMER SYMBOL BUON KOET
+19E5	KHMER SYMBOL PRAM KOET
+19E6	KHMER SYMBOL PRAM-MUOY KOET
+19E7	KHMER SYMBOL PRAM-PII KOET
+19E8	KHMER SYMBOL PRAM-BEI KOET
+19E9	KHMER SYMBOL PRAM-BUON KOET
+19EA	KHMER SYMBOL DAP KOET
+19EB	KHMER SYMBOL DAP-MUOY KOET
+19EC	KHMER SYMBOL DAP-PII KOET
+19ED	KHMER SYMBOL DAP-BEI KOET
+19EE	KHMER SYMBOL DAP-BUON KOET
+19EF	KHMER SYMBOL DAP-PRAM KOET
+19F0	KHMER SYMBOL TUTEYASAT
+	* represents the second August in a leap year
+@+		The following fifteen characters represent the first through the fifteenth waning days, respectively.
+19F1	KHMER SYMBOL MUOY ROC
+19F2	KHMER SYMBOL PII ROC
+19F3	KHMER SYMBOL BEI ROC
+19F4	KHMER SYMBOL BUON ROC
+19F5	KHMER SYMBOL PRAM ROC
+19F6	KHMER SYMBOL PRAM-MUOY ROC
+19F7	KHMER SYMBOL PRAM-PII ROC
+19F8	KHMER SYMBOL PRAM-BEI ROC
+19F9	KHMER SYMBOL PRAM-BUON ROC
+19FA	KHMER SYMBOL DAP ROC
+19FB	KHMER SYMBOL DAP-MUOY ROC
+19FC	KHMER SYMBOL DAP-PII ROC
+19FD	KHMER SYMBOL DAP-BEI ROC
+19FE	KHMER SYMBOL DAP-BUON ROC
+19FF	KHMER SYMBOL DAP-PRAM ROC
+@@	1A00	Buginese	1A1F
+@+		This script is also known as Lontara.
+@	Consonants
+1A00	BUGINESE LETTER KA
+1A01	BUGINESE LETTER GA
+1A02	BUGINESE LETTER NGA
+1A03	BUGINESE LETTER NGKA
+1A04	BUGINESE LETTER PA
+1A05	BUGINESE LETTER BA
+1A06	BUGINESE LETTER MA
+1A07	BUGINESE LETTER MPA
+1A08	BUGINESE LETTER TA
+1A09	BUGINESE LETTER DA
+1A0A	BUGINESE LETTER NA
+1A0B	BUGINESE LETTER NRA
+1A0C	BUGINESE LETTER CA
+1A0D	BUGINESE LETTER JA
+1A0E	BUGINESE LETTER NYA
+1A0F	BUGINESE LETTER NYCA
+1A10	BUGINESE LETTER YA
+1A11	BUGINESE LETTER RA
+1A12	BUGINESE LETTER LA
+1A13	BUGINESE LETTER VA
+1A14	BUGINESE LETTER SA
+1A15	BUGINESE LETTER A
+1A16	BUGINESE LETTER HA
+@	Vowels
+1A17	BUGINESE VOWEL SIGN I
+1A18	BUGINESE VOWEL SIGN U
+1A19	BUGINESE VOWEL SIGN E
+1A1A	BUGINESE VOWEL SIGN O
+1A1B	BUGINESE VOWEL SIGN AE
+@	Various signs
+1A1E	BUGINESE PALLAWA
+1A1F	BUGINESE END OF SECTION
+@@	1D00	Phonetic Extensions	1D7F
+@+		These are non-IPA phonetic extensions, mostly for the Uralic Phonetic Alphabet (UPA).
+@+		The small capitals, superscript, and subscript forms are for phonetic representations where style variations are semantically important. 
+@+		For general text, use regular Latin, Greek or Cyrillic letters with markup instead.	
+@		Latin letters
+1D00	LATIN LETTER SMALL CAPITAL A
+1D01	LATIN LETTER SMALL CAPITAL AE
+1D02	LATIN SMALL LETTER TURNED AE
+	* glyph can also have sideways orientation
+1D03	LATIN LETTER SMALL CAPITAL BARRED B
+1D04	LATIN LETTER SMALL CAPITAL C
+1D05	LATIN LETTER SMALL CAPITAL D
+1D06	LATIN LETTER SMALL CAPITAL ETH
+1D07	LATIN LETTER SMALL CAPITAL E
+1D08	LATIN SMALL LETTER TURNED OPEN E
+1D09	LATIN SMALL LETTER TURNED I
+1D0A	LATIN LETTER SMALL CAPITAL J
+1D0B	LATIN LETTER SMALL CAPITAL K
+1D0C	LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D	LATIN LETTER SMALL CAPITAL M
+1D0E	LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F	LATIN LETTER SMALL CAPITAL O
+1D10	LATIN LETTER SMALL CAPITAL OPEN O
+1D11	LATIN SMALL LETTER SIDEWAYS O
+1D12	LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13	LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14	LATIN SMALL LETTER TURNED OE
+	* glyph can also have sideways orientation
+1D15	LATIN LETTER SMALL CAPITAL OU
+1D16	LATIN SMALL LETTER TOP HALF O
+1D17	LATIN SMALL LETTER BOTTOM HALF O
+1D18	LATIN LETTER SMALL CAPITAL P
+	* represents a semi-voiced [p]
+1D19	LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A	LATIN LETTER SMALL CAPITAL TURNED R
+1D1B	LATIN LETTER SMALL CAPITAL T
+1D1C	LATIN LETTER SMALL CAPITAL U
+1D1D	LATIN SMALL LETTER SIDEWAYS U
+1D1E	LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+	* glyph can also have turned orientation
+1D1F	LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20	LATIN LETTER SMALL CAPITAL V
+1D21	LATIN LETTER SMALL CAPITAL W
+1D22	LATIN LETTER SMALL CAPITAL Z
+1D23	LATIN LETTER SMALL CAPITAL EZH
+1D24	LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25	LATIN LETTER AIN
+@		Greek letters
+1D26	GREEK LETTER SMALL CAPITAL GAMMA
+1D27	GREEK LETTER SMALL CAPITAL LAMDA
+1D28	GREEK LETTER SMALL CAPITAL PI
+1D29	GREEK LETTER SMALL CAPITAL RHO
+	* represents a voiceless uvular trill
+1D2A	GREEK LETTER SMALL CAPITAL PSI
+@		Cyrillic letter
+1D2B	CYRILLIC LETTER SMALL CAPITAL EL
+	* in italic style, the glyph is obliqued, not italicized
+	x (cyrillic small letter el - 043B)
+@		Latin superscript modifier letters
+1D2C	MODIFIER LETTER CAPITAL A
+	# <super> 0041
+1D2D	MODIFIER LETTER CAPITAL AE
+	# <super> 00C6
+1D2E	MODIFIER LETTER CAPITAL B
+	# <super> 0042
+1D2F	MODIFIER LETTER CAPITAL BARRED B
+1D30	MODIFIER LETTER CAPITAL D
+	# <super> 0044
+1D31	MODIFIER LETTER CAPITAL E
+	# <super> 0045
+1D32	MODIFIER LETTER CAPITAL REVERSED E
+	# <super> 018E
+1D33	MODIFIER LETTER CAPITAL G
+	# <super> 0047
+1D34	MODIFIER LETTER CAPITAL H
+	# <super> 0048
+1D35	MODIFIER LETTER CAPITAL I
+	# <super> 0049
+1D36	MODIFIER LETTER CAPITAL J
+	# <super> 004A
+1D37	MODIFIER LETTER CAPITAL K
+	# <super> 004B
+1D38	MODIFIER LETTER CAPITAL L
+	# <super> 004C
+1D39	MODIFIER LETTER CAPITAL M
+	# <super> 004D
+1D3A	MODIFIER LETTER CAPITAL N
+	# <super> 004E
+1D3B	MODIFIER LETTER CAPITAL REVERSED N
+1D3C	MODIFIER LETTER CAPITAL O
+	# <super> 004F
+1D3D	MODIFIER LETTER CAPITAL OU
+	# <super> 0222
+1D3E	MODIFIER LETTER CAPITAL P
+	# <super> 0050
+1D3F	MODIFIER LETTER CAPITAL R
+	# <super> 0052
+1D40	MODIFIER LETTER CAPITAL T
+	# <super> 0054
+1D41	MODIFIER LETTER CAPITAL U
+	# <super> 0055
+1D42	MODIFIER LETTER CAPITAL W
+	# <super> 0057
+1D43	MODIFIER LETTER SMALL A
+	# <super> 0061
+1D44	MODIFIER LETTER SMALL TURNED A
+	# <super> 0250
+1D45	MODIFIER LETTER SMALL ALPHA
+	# <super> 0251
+1D46	MODIFIER LETTER SMALL TURNED AE
+	# <super> 1D02
+1D47	MODIFIER LETTER SMALL B
+	# <super> 0062
+1D48	MODIFIER LETTER SMALL D
+	# <super> 0064
+1D49	MODIFIER LETTER SMALL E
+	# <super> 0065
+1D4A	MODIFIER LETTER SMALL SCHWA
+	# <super> 0259
+1D4B	MODIFIER LETTER SMALL OPEN E
+	# <super> 025B
+1D4C	MODIFIER LETTER SMALL TURNED OPEN E
+	* more appropriate equivalence would be to 1D08
+	# <super> 025C
+1D4D	MODIFIER LETTER SMALL G
+	# <super> 0067
+1D4E	MODIFIER LETTER SMALL TURNED I
+1D4F	MODIFIER LETTER SMALL K
+	# <super> 006B
+1D50	MODIFIER LETTER SMALL M
+	# <super> 006D
+1D51	MODIFIER LETTER SMALL ENG
+	# <super> 014B
+1D52	MODIFIER LETTER SMALL O
+	# <super> 006F
+1D53	MODIFIER LETTER SMALL OPEN O
+	# <super> 0254
+1D54	MODIFIER LETTER SMALL TOP HALF O
+	# <super> 1D16
+1D55	MODIFIER LETTER SMALL BOTTOM HALF O
+	# <super> 1D17
+1D56	MODIFIER LETTER SMALL P
+	# <super> 0070
+1D57	MODIFIER LETTER SMALL T
+	# <super> 0074
+1D58	MODIFIER LETTER SMALL U
+	# <super> 0075
+1D59	MODIFIER LETTER SMALL SIDEWAYS U
+	# <super> 1D1D
+1D5A	MODIFIER LETTER SMALL TURNED M
+	# <super> 026F
+1D5B	MODIFIER LETTER SMALL V
+	# <super> 0076
+1D5C	MODIFIER LETTER SMALL AIN
+	# <super> 1D25
+@		Greek superscript modifier letters
+1D5D	MODIFIER LETTER SMALL BETA
+	# <super> 03B2
+1D5E	MODIFIER LETTER SMALL GREEK GAMMA
+	# <super> 03B3
+1D5F	MODIFIER LETTER SMALL DELTA
+	# <super> 03B4
+1D60	MODIFIER LETTER SMALL GREEK PHI
+	# <super> 03C6
+1D61	MODIFIER LETTER SMALL CHI
+	# <super> 03C7
+@		Latin subscript modifier letters
+1D62	LATIN SUBSCRIPT SMALL LETTER I
+	# <sub> 0069
+1D63	LATIN SUBSCRIPT SMALL LETTER R
+	# <sub> 0072
+1D64	LATIN SUBSCRIPT SMALL LETTER U
+	# <sub> 0075
+1D65	LATIN SUBSCRIPT SMALL LETTER V
+	# <sub> 0076
+@		Greek subscript modifier letters
+1D66	GREEK SUBSCRIPT SMALL LETTER BETA
+	# <sub> 03B2
+1D67	GREEK SUBSCRIPT SMALL LETTER GAMMA
+	# <sub> 03B3
+1D68	GREEK SUBSCRIPT SMALL LETTER RHO
+	# <sub> 03C1
+1D69	GREEK SUBSCRIPT SMALL LETTER PHI
+	# <sub> 03C6
+1D6A	GREEK SUBSCRIPT SMALL LETTER CHI
+	# <sub> 03C7
+@		Latin letter
+1D6B	LATIN SMALL LETTER UE
+@		Latin letters with middle tilde
+@+		An additional letter with middle tilde is found in another block.
+	x (latin small letter l with middle tilde - 026B)
+1D6C	LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D6D	LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D6E	LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D6F	LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D70	LATIN SMALL LETTER N WITH MIDDLE TILDE
+1D71	LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D72	LATIN SMALL LETTER R WITH MIDDLE TILDE
+1D73	LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+1D74	LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D75	LATIN SMALL LETTER T WITH MIDDLE TILDE
+1D76	LATIN SMALL LETTER Z WITH MIDDLE TILDE
+@		Caucasian linguistics
+1D77	LATIN SMALL LETTER TURNED G
+	* Georgian transcription
+	x (georgian letter turned gan - 10F9)
+1D78	MODIFIER LETTER CYRILLIC EN
+	# <super> 043D
+@		Other phonetic symbols
+1D79	LATIN SMALL LETTER INSULAR G
+	* older Irish phonetic notation
+	x (latin small letter g - 0067)
+	x (latin small letter script g - 0261)
+	x (latin small letter gamma - 0263)
+1D7A	LATIN SMALL LETTER TH WITH STRIKETHROUGH
+	* American dictionary usage
+	x (greek small letter theta - 03B8)
+1D7B	LATIN SMALL CAPITAL LETTER I WITH STROKE
+	* used with different meanings by Americanists and Oxford dictionaries
+1D7C	LATIN SMALL LETTER IOTA WITH STROKE
+	* used by Russianists
+1D7D	LATIN SMALL LETTER P WITH STROKE
+	* used by Americanists
+1D7E	LATIN SMALL CAPITAL LETTER U WITH STROKE
+	* used by Americanists
+1D7F	LATIN SMALL LETTER UPSILON WITH STROKE
+	* used by Americanists and Oxford dictionaries
+@@	1D80	Phonetic Extensions Supplement	1DBF
+@		Latin letters with palatal hook
+@+		An additional letter with palatal hook is found in another block.
+	x (latin small letter t with palatal hook - 01AB)
+1D80	LATIN SMALL LETTER B WITH PALATAL HOOK
+1D81	LATIN SMALL LETTER D WITH PALATAL HOOK
+1D82	LATIN SMALL LETTER F WITH PALATAL HOOK
+1D83	LATIN SMALL LETTER G WITH PALATAL HOOK
+1D84	LATIN SMALL LETTER K WITH PALATAL HOOK
+1D85	LATIN SMALL LETTER L WITH PALATAL HOOK
+1D86	LATIN SMALL LETTER M WITH PALATAL HOOK
+1D87	LATIN SMALL LETTER N WITH PALATAL HOOK
+1D88	LATIN SMALL LETTER P WITH PALATAL HOOK
+1D89	LATIN SMALL LETTER R WITH PALATAL HOOK
+1D8A	LATIN SMALL LETTER S WITH PALATAL HOOK
+1D8B	LATIN SMALL LETTER ESH WITH PALATAL HOOK
+1D8C	LATIN SMALL LETTER V WITH PALATAL HOOK
+1D8D	LATIN SMALL LETTER X WITH PALATAL HOOK
+1D8E	LATIN SMALL LETTER Z WITH PALATAL HOOK
+@		Latin letters with retroflex hook
+@+		IPA recommends transcribing vowels with r-coloring (rhoticity) with the rhotic hook instead.
+	x (modifier letter rhotic hook - 02DE)
+@+		Additional letters with retroflex hook are found in other blocks.
+	x (latin capital letter t with retroflex hook - 01AE)
+	x (latin small letter d with tail - 0256)
+	x (latin small letter l with retroflex hook - 026D)
+	x (latin small letter n with retroflex hook - 0273)
+	x (latin small letter turned r with hook - 027B)
+	x (latin small letter r with tail - 027D)
+	x (latin small letter s with hook - 0282)
+	x (latin small letter squat reversed esh - 0285)
+	x (latin small letter t with retroflex hook - 0288)
+	x (latin small letter z with retroflex hook - 0290)
+	x (latin small letter turned h with fishhook and tail - 02AF)
+1D8F	LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D90	LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+1D91	LATIN SMALL LETTER D WITH HOOK AND TAIL
+1D92	LATIN SMALL LETTER E WITH RETROFLEX HOOK
+1D93	LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+1D94	LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+	x (latin small letter reversed open e with hook - 025D)
+1D95	LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+	x (latin small letter schwa with hook - 025A)
+1D96	LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1D97	LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+1D98	LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+1D99	LATIN SMALL LETTER U WITH RETROFLEX HOOK
+1D9A	LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+@		Modifier letters
+@+		Other modifier letters can be found in the Spacing Modifer Letters, Phonetic Extensions, as well as Superscripts and Subscripts blocks.
+1D9B	MODIFIER LETTER SMALL TURNED ALPHA
+	# <super> 0252
+1D9C	MODIFIER LETTER SMALL C
+	# <super> 0063
+1D9D	MODIFIER LETTER SMALL C WITH CURL
+	# <super> 0255
+1D9E	MODIFIER LETTER SMALL ETH
+	# <super> 00F0
+1D9F	MODIFIER LETTER SMALL REVERSED OPEN E
+	# <super> 025C
+1DA0	MODIFIER LETTER SMALL F
+	# <super> 0066
+1DA1	MODIFIER LETTER SMALL DOTLESS J WITH STROKE
+	# <super> 025F
+1DA2	MODIFIER LETTER SMALL SCRIPT G
+	# <super> 0261
+1DA3	MODIFIER LETTER SMALL TURNED H
+	# <super> 0265
+1DA4	MODIFIER LETTER SMALL I WITH STROKE
+	# <super> 0268
+1DA5	MODIFIER LETTER SMALL IOTA
+	# <super> 0269
+1DA6	MODIFIER LETTER SMALL CAPITAL I
+	# <super> 026A
+1DA7	MODIFIER LETTER SMALL CAPITAL I WITH STROKE
+	# <super> 1D7B
+1DA8	MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+	# <super> 029D
+1DA9	MODIFIER LETTER SMALL L WITH RETROFLEX HOOK
+	# <super> 026D
+1DAA	MODIFIER LETTER SMALL L WITH PALATAL HOOK
+	# <super> 1D85
+1DAB	MODIFIER LETTER SMALL CAPITAL L
+	# <super> 029F
+1DAC	MODIFIER LETTER SMALL M WITH HOOK
+	# <super> 0271
+1DAD	MODIFIER LETTER SMALL TURNED M WITH LONG LEG
+	# <super> 0270
+1DAE	MODIFIER LETTER SMALL N WITH LEFT HOOK
+	# <super> 0272
+1DAF	MODIFIER LETTER SMALL N WITH RETROFLEX HOOK
+	# <super> 0273
+1DB0	MODIFIER LETTER SMALL CAPITAL N
+	# <super> 0274
+1DB1	MODIFIER LETTER SMALL BARRED O
+	# <super> 0275
+1DB2	MODIFIER LETTER SMALL PHI
+	# <super> 0278
+1DB3	MODIFIER LETTER SMALL S WITH HOOK
+	# <super> 0282
+1DB4	MODIFIER LETTER SMALL ESH
+	# <super> 0283
+1DB5	MODIFIER LETTER SMALL T WITH PALATAL HOOK
+	# <super> 01AB
+1DB6	MODIFIER LETTER SMALL U BAR
+	# <super> 0289
+1DB7	MODIFIER LETTER SMALL UPSILON
+	# <super> 028A
+1DB8	MODIFIER LETTER SMALL CAPITAL U
+	# <super> 1D1C
+1DB9	MODIFIER LETTER SMALL V WITH HOOK
+	# <super> 028B
+1DBA	MODIFIER LETTER SMALL TURNED V
+	# <super> 028C
+1DBB	MODIFIER LETTER SMALL Z
+	# <super> 007A
+1DBC	MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK
+	# <super> 0290
+1DBD	MODIFIER LETTER SMALL Z WITH CURL
+	# <super> 0291
+1DBE	MODIFIER LETTER SMALL EZH
+	# <super> 0292
+1DBF	MODIFIER LETTER SMALL THETA
+	# <super> 03B8
+@@	1DC0	Combining Diacritical Marks Supplement	1DFF
+@		Used for Ancient Greek
+1DC0	COMBINING DOTTED GRAVE ACCENT
+	x (greek dialytika and varia - 1FED)
+1DC1	COMBINING DOTTED ACUTE ACCENT
+	x (combining greek dialytika tonos - 0344)
+	x (greek dialytika and oxia - 1FEE)
+@		Miscellaneous marks
+1DC2	COMBINING SNAKE BELOW
+1DC3	COMBINING SUSPENSION MARK
+	* Glagolitic
+	x (combining breve - 0306)
+@@	1E00	Latin Extended Additional	1EFF
+@+		In this block the names "WITH LINE BELOW" refer to a macron below the letter.
+@		Latin general use extensions
+1E00	LATIN CAPITAL LETTER A WITH RING BELOW
+	: 0041 0325
+1E01	LATIN SMALL LETTER A WITH RING BELOW
+	: 0061 0325
+1E02	LATIN CAPITAL LETTER B WITH DOT ABOVE
+	: 0042 0307
+1E03	LATIN SMALL LETTER B WITH DOT ABOVE
+	* Irish Gaelic (old orthography)
+	: 0062 0307
+1E04	LATIN CAPITAL LETTER B WITH DOT BELOW
+	: 0042 0323
+1E05	LATIN SMALL LETTER B WITH DOT BELOW
+	: 0062 0323
+1E06	LATIN CAPITAL LETTER B WITH LINE BELOW
+	: 0042 0331
+1E07	LATIN SMALL LETTER B WITH LINE BELOW
+	: 0062 0331
+1E08	LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+	: 00C7 0301
+1E09	LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+	: 00E7 0301
+1E0A	LATIN CAPITAL LETTER D WITH DOT ABOVE
+	: 0044 0307
+1E0B	LATIN SMALL LETTER D WITH DOT ABOVE
+	* Irish Gaelic (old orthography)
+	: 0064 0307
+1E0C	LATIN CAPITAL LETTER D WITH DOT BELOW
+	: 0044 0323
+1E0D	LATIN SMALL LETTER D WITH DOT BELOW
+	* Indic transliteration
+	: 0064 0323
+1E0E	LATIN CAPITAL LETTER D WITH LINE BELOW
+	: 0044 0331
+1E0F	LATIN SMALL LETTER D WITH LINE BELOW
+	: 0064 0331
+1E10	LATIN CAPITAL LETTER D WITH CEDILLA
+	: 0044 0327
+1E11	LATIN SMALL LETTER D WITH CEDILLA
+	* Livonian
+	: 0064 0327
+1E12	LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+	: 0044 032D
+1E13	LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+	: 0064 032D
+1E14	LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+	: 0112 0300
+1E15	LATIN SMALL LETTER E WITH MACRON AND GRAVE
+	: 0113 0300
+1E16	LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+	: 0112 0301
+1E17	LATIN SMALL LETTER E WITH MACRON AND ACUTE
+	: 0113 0301
+1E18	LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+	: 0045 032D
+1E19	LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+	: 0065 032D
+1E1A	LATIN CAPITAL LETTER E WITH TILDE BELOW
+	: 0045 0330
+1E1B	LATIN SMALL LETTER E WITH TILDE BELOW
+	: 0065 0330
+1E1C	LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+	: 0228 0306
+1E1D	LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+	: 0229 0306
+1E1E	LATIN CAPITAL LETTER F WITH DOT ABOVE
+	: 0046 0307
+1E1F	LATIN SMALL LETTER F WITH DOT ABOVE
+	* Irish Gaelic (old orthography)
+	: 0066 0307
+1E20	LATIN CAPITAL LETTER G WITH MACRON
+	: 0047 0304
+1E21	LATIN SMALL LETTER G WITH MACRON
+	: 0067 0304
+1E22	LATIN CAPITAL LETTER H WITH DOT ABOVE
+	: 0048 0307
+1E23	LATIN SMALL LETTER H WITH DOT ABOVE
+	: 0068 0307
+1E24	LATIN CAPITAL LETTER H WITH DOT BELOW
+	: 0048 0323
+1E25	LATIN SMALL LETTER H WITH DOT BELOW
+	* Indic transliteration
+	: 0068 0323
+1E26	LATIN CAPITAL LETTER H WITH DIAERESIS
+	: 0048 0308
+1E27	LATIN SMALL LETTER H WITH DIAERESIS
+	: 0068 0308
+1E28	LATIN CAPITAL LETTER H WITH CEDILLA
+	: 0048 0327
+1E29	LATIN SMALL LETTER H WITH CEDILLA
+	: 0068 0327
+1E2A	LATIN CAPITAL LETTER H WITH BREVE BELOW
+	: 0048 032E
+1E2B	LATIN SMALL LETTER H WITH BREVE BELOW
+	* Semitic transliteration
+	: 0068 032E
+1E2C	LATIN CAPITAL LETTER I WITH TILDE BELOW
+	: 0049 0330
+1E2D	LATIN SMALL LETTER I WITH TILDE BELOW
+	: 0069 0330
+1E2E	LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+	: 00CF 0301
+1E2F	LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+	: 00EF 0301
+1E30	LATIN CAPITAL LETTER K WITH ACUTE
+	: 004B 0301
+1E31	LATIN SMALL LETTER K WITH ACUTE
+	* Macedonian transliteration
+	: 006B 0301
+1E32	LATIN CAPITAL LETTER K WITH DOT BELOW
+	: 004B 0323
+1E33	LATIN SMALL LETTER K WITH DOT BELOW
+	: 006B 0323
+1E34	LATIN CAPITAL LETTER K WITH LINE BELOW
+	: 004B 0331
+1E35	LATIN SMALL LETTER K WITH LINE BELOW
+	: 006B 0331
+1E36	LATIN CAPITAL LETTER L WITH DOT BELOW
+	: 004C 0323
+1E37	LATIN SMALL LETTER L WITH DOT BELOW
+	* Indic transliteration
+	: 006C 0323
+1E38	LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+	: 1E36 0304
+1E39	LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+	* Indic transliteration
+	: 1E37 0304
+1E3A	LATIN CAPITAL LETTER L WITH LINE BELOW
+	: 004C 0331
+1E3B	LATIN SMALL LETTER L WITH LINE BELOW
+	* Indic transliteration
+	: 006C 0331
+1E3C	LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+	: 004C 032D
+1E3D	LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+	: 006C 032D
+1E3E	LATIN CAPITAL LETTER M WITH ACUTE
+	: 004D 0301
+1E3F	LATIN SMALL LETTER M WITH ACUTE
+	: 006D 0301
+1E40	LATIN CAPITAL LETTER M WITH DOT ABOVE
+	: 004D 0307
+1E41	LATIN SMALL LETTER M WITH DOT ABOVE
+	* Irish Gaelic (old orthography)
+	: 006D 0307
+1E42	LATIN CAPITAL LETTER M WITH DOT BELOW
+	: 004D 0323
+1E43	LATIN SMALL LETTER M WITH DOT BELOW
+	* Indic transliteration
+	: 006D 0323
+1E44	LATIN CAPITAL LETTER N WITH DOT ABOVE
+	: 004E 0307
+1E45	LATIN SMALL LETTER N WITH DOT ABOVE
+	* Indic transliteration
+	: 006E 0307
+1E46	LATIN CAPITAL LETTER N WITH DOT BELOW
+	: 004E 0323
+1E47	LATIN SMALL LETTER N WITH DOT BELOW
+	* Indic transliteration
+	: 006E 0323
+1E48	LATIN CAPITAL LETTER N WITH LINE BELOW
+	: 004E 0331
+1E49	LATIN SMALL LETTER N WITH LINE BELOW
+	* Indic transliteration
+	: 006E 0331
+1E4A	LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+	: 004E 032D
+1E4B	LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+	: 006E 032D
+1E4C	LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+	: 00D5 0301
+1E4D	LATIN SMALL LETTER O WITH TILDE AND ACUTE
+	: 00F5 0301
+1E4E	LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+	: 00D5 0308
+1E4F	LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+	: 00F5 0308
+1E50	LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+	: 014C 0300
+1E51	LATIN SMALL LETTER O WITH MACRON AND GRAVE
+	: 014D 0300
+1E52	LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+	: 014C 0301
+1E53	LATIN SMALL LETTER O WITH MACRON AND ACUTE
+	: 014D 0301
+1E54	LATIN CAPITAL LETTER P WITH ACUTE
+	: 0050 0301
+1E55	LATIN SMALL LETTER P WITH ACUTE
+	: 0070 0301
+1E56	LATIN CAPITAL LETTER P WITH DOT ABOVE
+	: 0050 0307
+1E57	LATIN SMALL LETTER P WITH DOT ABOVE
+	* Irish Gaelic (old orthography)
+	: 0070 0307
+1E58	LATIN CAPITAL LETTER R WITH DOT ABOVE
+	: 0052 0307
+1E59	LATIN SMALL LETTER R WITH DOT ABOVE
+	: 0072 0307
+1E5A	LATIN CAPITAL LETTER R WITH DOT BELOW
+	: 0052 0323
+1E5B	LATIN SMALL LETTER R WITH DOT BELOW
+	* Indic transliteration
+	: 0072 0323
+1E5C	LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+	: 1E5A 0304
+1E5D	LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+	* Indic transliteration
+	: 1E5B 0304
+1E5E	LATIN CAPITAL LETTER R WITH LINE BELOW
+	: 0052 0331
+1E5F	LATIN SMALL LETTER R WITH LINE BELOW
+	* Indic transliteration
+	: 0072 0331
+1E60	LATIN CAPITAL LETTER S WITH DOT ABOVE
+	: 0053 0307
+1E61	LATIN SMALL LETTER S WITH DOT ABOVE
+	* Irish Gaelic (old orthography)
+	: 0073 0307
+1E62	LATIN CAPITAL LETTER S WITH DOT BELOW
+	: 0053 0323
+1E63	LATIN SMALL LETTER S WITH DOT BELOW
+	* Indic transliteration
+	: 0073 0323
+1E64	LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+	: 015A 0307
+1E65	LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+	: 015B 0307
+1E66	LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+	: 0160 0307
+1E67	LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+	: 0161 0307
+1E68	LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+	: 1E62 0307
+1E69	LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+	: 1E63 0307
+1E6A	LATIN CAPITAL LETTER T WITH DOT ABOVE
+	: 0054 0307
+1E6B	LATIN SMALL LETTER T WITH DOT ABOVE
+	* Irish Gaelic (old orthography)
+	: 0074 0307
+1E6C	LATIN CAPITAL LETTER T WITH DOT BELOW
+	: 0054 0323
+1E6D	LATIN SMALL LETTER T WITH DOT BELOW
+	* Indic transliteration
+	: 0074 0323
+1E6E	LATIN CAPITAL LETTER T WITH LINE BELOW
+	: 0054 0331
+1E6F	LATIN SMALL LETTER T WITH LINE BELOW
+	* Semitic transliteration
+	: 0074 0331
+1E70	LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+	: 0054 032D
+1E71	LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+	: 0074 032D
+1E72	LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+	: 0055 0324
+1E73	LATIN SMALL LETTER U WITH DIAERESIS BELOW
+	: 0075 0324
+1E74	LATIN CAPITAL LETTER U WITH TILDE BELOW
+	: 0055 0330
+1E75	LATIN SMALL LETTER U WITH TILDE BELOW
+	: 0075 0330
+1E76	LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+	: 0055 032D
+1E77	LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+	: 0075 032D
+1E78	LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+	: 0168 0301
+1E79	LATIN SMALL LETTER U WITH TILDE AND ACUTE
+	: 0169 0301
+1E7A	LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+	: 016A 0308
+1E7B	LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+	: 016B 0308
+1E7C	LATIN CAPITAL LETTER V WITH TILDE
+	: 0056 0303
+1E7D	LATIN SMALL LETTER V WITH TILDE
+	: 0076 0303
+1E7E	LATIN CAPITAL LETTER V WITH DOT BELOW
+	: 0056 0323
+1E7F	LATIN SMALL LETTER V WITH DOT BELOW
+	: 0076 0323
+1E80	LATIN CAPITAL LETTER W WITH GRAVE
+	: 0057 0300
+1E81	LATIN SMALL LETTER W WITH GRAVE
+	* Welsh
+	: 0077 0300
+1E82	LATIN CAPITAL LETTER W WITH ACUTE
+	: 0057 0301
+1E83	LATIN SMALL LETTER W WITH ACUTE
+	* Welsh
+	: 0077 0301
+1E84	LATIN CAPITAL LETTER W WITH DIAERESIS
+	: 0057 0308
+1E85	LATIN SMALL LETTER W WITH DIAERESIS
+	* Welsh
+	: 0077 0308
+1E86	LATIN CAPITAL LETTER W WITH DOT ABOVE
+	: 0057 0307
+1E87	LATIN SMALL LETTER W WITH DOT ABOVE
+	: 0077 0307
+1E88	LATIN CAPITAL LETTER W WITH DOT BELOW
+	: 0057 0323
+1E89	LATIN SMALL LETTER W WITH DOT BELOW
+	: 0077 0323
+1E8A	LATIN CAPITAL LETTER X WITH DOT ABOVE
+	: 0058 0307
+1E8B	LATIN SMALL LETTER X WITH DOT ABOVE
+	: 0078 0307
+1E8C	LATIN CAPITAL LETTER X WITH DIAERESIS
+	: 0058 0308
+1E8D	LATIN SMALL LETTER X WITH DIAERESIS
+	: 0078 0308
+1E8E	LATIN CAPITAL LETTER Y WITH DOT ABOVE
+	: 0059 0307
+1E8F	LATIN SMALL LETTER Y WITH DOT ABOVE
+	: 0079 0307
+1E90	LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+	: 005A 0302
+1E91	LATIN SMALL LETTER Z WITH CIRCUMFLEX
+	: 007A 0302
+1E92	LATIN CAPITAL LETTER Z WITH DOT BELOW
+	: 005A 0323
+1E93	LATIN SMALL LETTER Z WITH DOT BELOW
+	* Indic transliteration
+	: 007A 0323
+1E94	LATIN CAPITAL LETTER Z WITH LINE BELOW
+	: 005A 0331
+1E95	LATIN SMALL LETTER Z WITH LINE BELOW
+	* Semitic transliteration
+	: 007A 0331
+1E96	LATIN SMALL LETTER H WITH LINE BELOW
+	* Semitic transliteration
+	: 0068 0331
+1E97	LATIN SMALL LETTER T WITH DIAERESIS
+	: 0074 0308
+1E98	LATIN SMALL LETTER W WITH RING ABOVE
+	: 0077 030A
+1E99	LATIN SMALL LETTER Y WITH RING ABOVE
+	: 0079 030A
+1E9A	LATIN SMALL LETTER A WITH RIGHT HALF RING
+	# 0061 02BE
+1E9B	LATIN SMALL LETTER LONG S WITH DOT ABOVE
+	* in current use in Gaelic types (as glyph variant of 1E61)
+	: 017F 0307
+@		Latin extensions for Vietnamese
+1EA0	LATIN CAPITAL LETTER A WITH DOT BELOW
+	: 0041 0323
+1EA1	LATIN SMALL LETTER A WITH DOT BELOW
+	: 0061 0323
+1EA2	LATIN CAPITAL LETTER A WITH HOOK ABOVE
+	: 0041 0309
+1EA3	LATIN SMALL LETTER A WITH HOOK ABOVE
+	: 0061 0309
+1EA4	LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+	: 00C2 0301
+1EA5	LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+	: 00E2 0301
+1EA6	LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+	: 00C2 0300
+1EA7	LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+	: 00E2 0300
+1EA8	LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+	: 00C2 0309
+1EA9	LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+	: 00E2 0309
+1EAA	LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+	: 00C2 0303
+1EAB	LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+	: 00E2 0303
+1EAC	LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+	: 1EA0 0302
+1EAD	LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+	: 1EA1 0302
+1EAE	LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+	: 0102 0301
+1EAF	LATIN SMALL LETTER A WITH BREVE AND ACUTE
+	: 0103 0301
+1EB0	LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+	: 0102 0300
+1EB1	LATIN SMALL LETTER A WITH BREVE AND GRAVE
+	: 0103 0300
+1EB2	LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+	: 0102 0309
+1EB3	LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+	: 0103 0309
+1EB4	LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+	: 0102 0303
+1EB5	LATIN SMALL LETTER A WITH BREVE AND TILDE
+	: 0103 0303
+1EB6	LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+	: 1EA0 0306
+1EB7	LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+	: 1EA1 0306
+1EB8	LATIN CAPITAL LETTER E WITH DOT BELOW
+	: 0045 0323
+1EB9	LATIN SMALL LETTER E WITH DOT BELOW
+	: 0065 0323
+1EBA	LATIN CAPITAL LETTER E WITH HOOK ABOVE
+	: 0045 0309
+1EBB	LATIN SMALL LETTER E WITH HOOK ABOVE
+	: 0065 0309
+1EBC	LATIN CAPITAL LETTER E WITH TILDE
+	: 0045 0303
+1EBD	LATIN SMALL LETTER E WITH TILDE
+	: 0065 0303
+1EBE	LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+	: 00CA 0301
+1EBF	LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+	: 00EA 0301
+1EC0	LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+	: 00CA 0300
+1EC1	LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+	: 00EA 0300
+1EC2	LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+	: 00CA 0309
+1EC3	LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+	: 00EA 0309
+1EC4	LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+	: 00CA 0303
+1EC5	LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+	: 00EA 0303
+1EC6	LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+	: 1EB8 0302
+1EC7	LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+	: 1EB9 0302
+1EC8	LATIN CAPITAL LETTER I WITH HOOK ABOVE
+	: 0049 0309
+1EC9	LATIN SMALL LETTER I WITH HOOK ABOVE
+	: 0069 0309
+1ECA	LATIN CAPITAL LETTER I WITH DOT BELOW
+	: 0049 0323
+1ECB	LATIN SMALL LETTER I WITH DOT BELOW
+	: 0069 0323
+1ECC	LATIN CAPITAL LETTER O WITH DOT BELOW
+	: 004F 0323
+1ECD	LATIN SMALL LETTER O WITH DOT BELOW
+	: 006F 0323
+1ECE	LATIN CAPITAL LETTER O WITH HOOK ABOVE
+	: 004F 0309
+1ECF	LATIN SMALL LETTER O WITH HOOK ABOVE
+	: 006F 0309
+1ED0	LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+	: 00D4 0301
+1ED1	LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+	: 00F4 0301
+1ED2	LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+	: 00D4 0300
+1ED3	LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+	: 00F4 0300
+1ED4	LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+	: 00D4 0309
+1ED5	LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+	: 00F4 0309
+1ED6	LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+	: 00D4 0303
+1ED7	LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+	: 00F4 0303
+1ED8	LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+	: 1ECC 0302
+1ED9	LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+	: 1ECD 0302
+1EDA	LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+	: 01A0 0301
+1EDB	LATIN SMALL LETTER O WITH HORN AND ACUTE
+	: 01A1 0301
+1EDC	LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+	: 01A0 0300
+1EDD	LATIN SMALL LETTER O WITH HORN AND GRAVE
+	: 01A1 0300
+1EDE	LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+	: 01A0 0309
+1EDF	LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+	: 01A1 0309
+1EE0	LATIN CAPITAL LETTER O WITH HORN AND TILDE
+	: 01A0 0303
+1EE1	LATIN SMALL LETTER O WITH HORN AND TILDE
+	: 01A1 0303
+1EE2	LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+	: 01A0 0323
+1EE3	LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+	: 01A1 0323
+1EE4	LATIN CAPITAL LETTER U WITH DOT BELOW
+	: 0055 0323
+1EE5	LATIN SMALL LETTER U WITH DOT BELOW
+	: 0075 0323
+1EE6	LATIN CAPITAL LETTER U WITH HOOK ABOVE
+	: 0055 0309
+1EE7	LATIN SMALL LETTER U WITH HOOK ABOVE
+	: 0075 0309
+1EE8	LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+	: 01AF 0301
+1EE9	LATIN SMALL LETTER U WITH HORN AND ACUTE
+	: 01B0 0301
+1EEA	LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+	: 01AF 0300
+1EEB	LATIN SMALL LETTER U WITH HORN AND GRAVE
+	: 01B0 0300
+1EEC	LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+	: 01AF 0309
+1EED	LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+	: 01B0 0309
+1EEE	LATIN CAPITAL LETTER U WITH HORN AND TILDE
+	: 01AF 0303
+1EEF	LATIN SMALL LETTER U WITH HORN AND TILDE
+	: 01B0 0303
+1EF0	LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+	: 01AF 0323
+1EF1	LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+	: 01B0 0323
+1EF2	LATIN CAPITAL LETTER Y WITH GRAVE
+	: 0059 0300
+1EF3	LATIN SMALL LETTER Y WITH GRAVE
+	* Welsh
+	: 0079 0300
+1EF4	LATIN CAPITAL LETTER Y WITH DOT BELOW
+	: 0059 0323
+1EF5	LATIN SMALL LETTER Y WITH DOT BELOW
+	: 0079 0323
+1EF6	LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+	: 0059 0309
+1EF7	LATIN SMALL LETTER Y WITH HOOK ABOVE
+	: 0079 0309
+1EF8	LATIN CAPITAL LETTER Y WITH TILDE
+	: 0059 0303
+1EF9	LATIN SMALL LETTER Y WITH TILDE
+	: 0079 0303
+@@	1F00	Greek Extended	1FFF
+@		Precomposed polytonic Greek
+1F00	GREEK SMALL LETTER ALPHA WITH PSILI
+	: 03B1 0313
+1F01	GREEK SMALL LETTER ALPHA WITH DASIA
+	: 03B1 0314
+1F02	GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+	: 1F00 0300
+1F03	GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+	: 1F01 0300
+1F04	GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+	: 1F00 0301
+1F05	GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+	: 1F01 0301
+1F06	GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+	: 1F00 0342
+1F07	GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+	: 1F01 0342
+1F08	GREEK CAPITAL LETTER ALPHA WITH PSILI
+	: 0391 0313
+1F09	GREEK CAPITAL LETTER ALPHA WITH DASIA
+	: 0391 0314
+1F0A	GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+	: 1F08 0300
+1F0B	GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+	: 1F09 0300
+1F0C	GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+	: 1F08 0301
+1F0D	GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+	: 1F09 0301
+1F0E	GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+	: 1F08 0342
+1F0F	GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+	: 1F09 0342
+1F10	GREEK SMALL LETTER EPSILON WITH PSILI
+	: 03B5 0313
+1F11	GREEK SMALL LETTER EPSILON WITH DASIA
+	: 03B5 0314
+1F12	GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+	: 1F10 0300
+1F13	GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+	: 1F11 0300
+1F14	GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+	: 1F10 0301
+1F15	GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+	: 1F11 0301
+1F18	GREEK CAPITAL LETTER EPSILON WITH PSILI
+	: 0395 0313
+1F19	GREEK CAPITAL LETTER EPSILON WITH DASIA
+	: 0395 0314
+1F1A	GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+	: 1F18 0300
+1F1B	GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+	: 1F19 0300
+1F1C	GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+	: 1F18 0301
+1F1D	GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+	: 1F19 0301
+1F20	GREEK SMALL LETTER ETA WITH PSILI
+	: 03B7 0313
+1F21	GREEK SMALL LETTER ETA WITH DASIA
+	: 03B7 0314
+1F22	GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+	: 1F20 0300
+1F23	GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+	: 1F21 0300
+1F24	GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+	: 1F20 0301
+1F25	GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+	: 1F21 0301
+1F26	GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+	: 1F20 0342
+1F27	GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+	: 1F21 0342
+1F28	GREEK CAPITAL LETTER ETA WITH PSILI
+	: 0397 0313
+1F29	GREEK CAPITAL LETTER ETA WITH DASIA
+	: 0397 0314
+1F2A	GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+	: 1F28 0300
+1F2B	GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+	: 1F29 0300
+1F2C	GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+	: 1F28 0301
+1F2D	GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+	: 1F29 0301
+1F2E	GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+	: 1F28 0342
+1F2F	GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+	: 1F29 0342
+1F30	GREEK SMALL LETTER IOTA WITH PSILI
+	: 03B9 0313
+1F31	GREEK SMALL LETTER IOTA WITH DASIA
+	: 03B9 0314
+1F32	GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+	: 1F30 0300
+1F33	GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+	: 1F31 0300
+1F34	GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+	: 1F30 0301
+1F35	GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+	: 1F31 0301
+1F36	GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+	: 1F30 0342
+1F37	GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+	: 1F31 0342
+1F38	GREEK CAPITAL LETTER IOTA WITH PSILI
+	: 0399 0313
+1F39	GREEK CAPITAL LETTER IOTA WITH DASIA
+	: 0399 0314
+1F3A	GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+	: 1F38 0300
+1F3B	GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+	: 1F39 0300
+1F3C	GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+	: 1F38 0301
+1F3D	GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+	: 1F39 0301
+1F3E	GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+	: 1F38 0342
+1F3F	GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+	: 1F39 0342
+1F40	GREEK SMALL LETTER OMICRON WITH PSILI
+	: 03BF 0313
+1F41	GREEK SMALL LETTER OMICRON WITH DASIA
+	: 03BF 0314
+1F42	GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+	: 1F40 0300
+1F43	GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+	: 1F41 0300
+1F44	GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+	: 1F40 0301
+1F45	GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+	: 1F41 0301
+1F48	GREEK CAPITAL LETTER OMICRON WITH PSILI
+	: 039F 0313
+1F49	GREEK CAPITAL LETTER OMICRON WITH DASIA
+	: 039F 0314
+1F4A	GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+	: 1F48 0300
+1F4B	GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+	: 1F49 0300
+1F4C	GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+	: 1F48 0301
+1F4D	GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+	: 1F49 0301
+1F50	GREEK SMALL LETTER UPSILON WITH PSILI
+	: 03C5 0313
+1F51	GREEK SMALL LETTER UPSILON WITH DASIA
+	: 03C5 0314
+1F52	GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+	: 1F50 0300
+1F53	GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+	: 1F51 0300
+1F54	GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+	: 1F50 0301
+1F55	GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+	: 1F51 0301
+1F56	GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+	: 1F50 0342
+1F57	GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+	: 1F51 0342
+1F59	GREEK CAPITAL LETTER UPSILON WITH DASIA
+	: 03A5 0314
+1F5B	GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+	: 1F59 0300
+1F5D	GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+	: 1F59 0301
+1F5F	GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+	: 1F59 0342
+1F60	GREEK SMALL LETTER OMEGA WITH PSILI
+	: 03C9 0313
+1F61	GREEK SMALL LETTER OMEGA WITH DASIA
+	: 03C9 0314
+1F62	GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+	: 1F60 0300
+1F63	GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+	: 1F61 0300
+1F64	GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+	: 1F60 0301
+1F65	GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+	: 1F61 0301
+1F66	GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+	: 1F60 0342
+1F67	GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+	: 1F61 0342
+1F68	GREEK CAPITAL LETTER OMEGA WITH PSILI
+	: 03A9 0313
+1F69	GREEK CAPITAL LETTER OMEGA WITH DASIA
+	: 03A9 0314
+1F6A	GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+	: 1F68 0300
+1F6B	GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+	: 1F69 0300
+1F6C	GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+	: 1F68 0301
+1F6D	GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+	: 1F69 0301
+1F6E	GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+	: 1F68 0342
+1F6F	GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+	: 1F69 0342
+1F70	GREEK SMALL LETTER ALPHA WITH VARIA
+	: 03B1 0300
+1F71	GREEK SMALL LETTER ALPHA WITH OXIA
+	: 03AC greek small letter alpha with tonos
+1F72	GREEK SMALL LETTER EPSILON WITH VARIA
+	: 03B5 0300
+1F73	GREEK SMALL LETTER EPSILON WITH OXIA
+	: 03AD greek small letter epsilon with tonos
+1F74	GREEK SMALL LETTER ETA WITH VARIA
+	: 03B7 0300
+1F75	GREEK SMALL LETTER ETA WITH OXIA
+	: 03AE greek small letter eta with tonos
+1F76	GREEK SMALL LETTER IOTA WITH VARIA
+	: 03B9 0300
+1F77	GREEK SMALL LETTER IOTA WITH OXIA
+	: 03AF greek small letter iota with tonos
+1F78	GREEK SMALL LETTER OMICRON WITH VARIA
+	: 03BF 0300
+1F79	GREEK SMALL LETTER OMICRON WITH OXIA
+	: 03CC greek small letter omicron with tonos
+1F7A	GREEK SMALL LETTER UPSILON WITH VARIA
+	: 03C5 0300
+1F7B	GREEK SMALL LETTER UPSILON WITH OXIA
+	: 03CD greek small letter upsilon with tonos
+1F7C	GREEK SMALL LETTER OMEGA WITH VARIA
+	: 03C9 0300
+1F7D	GREEK SMALL LETTER OMEGA WITH OXIA
+	: 03CE greek small letter omega with tonos
+1F80	GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+	: 1F00 0345
+1F81	GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+	: 1F01 0345
+1F82	GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+	: 1F02 0345
+1F83	GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+	: 1F03 0345
+1F84	GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+	: 1F04 0345
+1F85	GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+	: 1F05 0345
+1F86	GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+	: 1F06 0345
+1F87	GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+	: 1F07 0345
+1F88	GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+	: 1F08 0345
+1F89	GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+	: 1F09 0345
+1F8A	GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+	: 1F0A 0345
+1F8B	GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+	: 1F0B 0345
+1F8C	GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+	: 1F0C 0345
+1F8D	GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+	: 1F0D 0345
+1F8E	GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+	: 1F0E 0345
+1F8F	GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+	: 1F0F 0345
+1F90	GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+	: 1F20 0345
+1F91	GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+	: 1F21 0345
+1F92	GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+	: 1F22 0345
+1F93	GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+	: 1F23 0345
+1F94	GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+	: 1F24 0345
+1F95	GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+	: 1F25 0345
+1F96	GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+	: 1F26 0345
+1F97	GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+	: 1F27 0345
+1F98	GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+	: 1F28 0345
+1F99	GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+	: 1F29 0345
+1F9A	GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+	: 1F2A 0345
+1F9B	GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+	: 1F2B 0345
+1F9C	GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+	: 1F2C 0345
+1F9D	GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+	: 1F2D 0345
+1F9E	GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+	: 1F2E 0345
+1F9F	GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+	: 1F2F 0345
+1FA0	GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+	: 1F60 0345
+1FA1	GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+	: 1F61 0345
+1FA2	GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+	: 1F62 0345
+1FA3	GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+	: 1F63 0345
+1FA4	GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+	: 1F64 0345
+1FA5	GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+	: 1F65 0345
+1FA6	GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+	: 1F66 0345
+1FA7	GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+	: 1F67 0345
+1FA8	GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+	: 1F68 0345
+1FA9	GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+	: 1F69 0345
+1FAA	GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+	: 1F6A 0345
+1FAB	GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+	: 1F6B 0345
+1FAC	GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+	: 1F6C 0345
+1FAD	GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+	: 1F6D 0345
+1FAE	GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+	: 1F6E 0345
+1FAF	GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+	: 1F6F 0345
+1FB0	GREEK SMALL LETTER ALPHA WITH VRACHY
+	: 03B1 0306
+1FB1	GREEK SMALL LETTER ALPHA WITH MACRON
+	: 03B1 0304
+1FB2	GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+	: 1F70 0345
+1FB3	GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+	: 03B1 0345
+1FB4	GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+	: 03AC 0345
+1FB6	GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+	: 03B1 0342
+1FB7	GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+	: 1FB6 0345
+1FB8	GREEK CAPITAL LETTER ALPHA WITH VRACHY
+	: 0391 0306
+1FB9	GREEK CAPITAL LETTER ALPHA WITH MACRON
+	: 0391 0304
+1FBA	GREEK CAPITAL LETTER ALPHA WITH VARIA
+	: 0391 0300
+1FBB	GREEK CAPITAL LETTER ALPHA WITH OXIA
+	: 0386 greek capital letter alpha with tonos
+1FBC	GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+	: 0391 0345
+1FBD	GREEK KORONIS
+	# 0020 0313
+1FBE	GREEK PROSGEGRAMMENI
+	: 03B9 greek small letter iota
+1FBF	GREEK PSILI
+	# 0020 0313
+1FC0	GREEK PERISPOMENI
+	# 0020 0342
+1FC1	GREEK DIALYTIKA AND PERISPOMENI
+	: 00A8 0342
+1FC2	GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+	: 1F74 0345
+1FC3	GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+	: 03B7 0345
+1FC4	GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+	: 03AE 0345
+1FC6	GREEK SMALL LETTER ETA WITH PERISPOMENI
+	: 03B7 0342
+1FC7	GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+	: 1FC6 0345
+1FC8	GREEK CAPITAL LETTER EPSILON WITH VARIA
+	: 0395 0300
+1FC9	GREEK CAPITAL LETTER EPSILON WITH OXIA
+	: 0388 greek capital letter epsilon with tonos
+1FCA	GREEK CAPITAL LETTER ETA WITH VARIA
+	: 0397 0300
+1FCB	GREEK CAPITAL LETTER ETA WITH OXIA
+	: 0389 greek capital letter eta with tonos
+1FCC	GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+	: 0397 0345
+1FCD	GREEK PSILI AND VARIA
+	: 1FBF 0300
+1FCE	GREEK PSILI AND OXIA
+	: 1FBF 0301
+1FCF	GREEK PSILI AND PERISPOMENI
+	: 1FBF 0342
+1FD0	GREEK SMALL LETTER IOTA WITH VRACHY
+	: 03B9 0306
+1FD1	GREEK SMALL LETTER IOTA WITH MACRON
+	: 03B9 0304
+1FD2	GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+	: 03CA 0300
+1FD3	GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+	: 0390 greek small letter iota with dialytika and tonos
+1FD6	GREEK SMALL LETTER IOTA WITH PERISPOMENI
+	: 03B9 0342
+1FD7	GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+	: 03CA 0342
+1FD8	GREEK CAPITAL LETTER IOTA WITH VRACHY
+	: 0399 0306
+1FD9	GREEK CAPITAL LETTER IOTA WITH MACRON
+	: 0399 0304
+1FDA	GREEK CAPITAL LETTER IOTA WITH VARIA
+	: 0399 0300
+1FDB	GREEK CAPITAL LETTER IOTA WITH OXIA
+	: 038A greek capital letter iota with tonos
+1FDD	GREEK DASIA AND VARIA
+	: 1FFE 0300
+1FDE	GREEK DASIA AND OXIA
+	: 1FFE 0301
+1FDF	GREEK DASIA AND PERISPOMENI
+	: 1FFE 0342
+1FE0	GREEK SMALL LETTER UPSILON WITH VRACHY
+	: 03C5 0306
+1FE1	GREEK SMALL LETTER UPSILON WITH MACRON
+	: 03C5 0304
+1FE2	GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+	: 03CB 0300
+1FE3	GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+	: 03B0 greek small letter upsilon with dialytika and tonos
+1FE4	GREEK SMALL LETTER RHO WITH PSILI
+	: 03C1 0313
+1FE5	GREEK SMALL LETTER RHO WITH DASIA
+	: 03C1 0314
+1FE6	GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+	: 03C5 0342
+1FE7	GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+	: 03CB 0342
+1FE8	GREEK CAPITAL LETTER UPSILON WITH VRACHY
+	: 03A5 0306
+1FE9	GREEK CAPITAL LETTER UPSILON WITH MACRON
+	: 03A5 0304
+1FEA	GREEK CAPITAL LETTER UPSILON WITH VARIA
+	: 03A5 0300
+1FEB	GREEK CAPITAL LETTER UPSILON WITH OXIA
+	: 038E greek capital letter upsilon with tonos
+1FEC	GREEK CAPITAL LETTER RHO WITH DASIA
+	: 03A1 0314
+1FED	GREEK DIALYTIKA AND VARIA
+	: 00A8 0300
+1FEE	GREEK DIALYTIKA AND OXIA
+	: 0385 greek dialytika tonos
+1FEF	GREEK VARIA
+	: 0060 grave accent
+1FF2	GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+	: 1F7C 0345
+1FF3	GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+	: 03C9 0345
+1FF4	GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+	: 03CE 0345
+1FF6	GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+	: 03C9 0342
+1FF7	GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+	: 1FF6 0345
+1FF8	GREEK CAPITAL LETTER OMICRON WITH VARIA
+	: 039F 0300
+1FF9	GREEK CAPITAL LETTER OMICRON WITH OXIA
+	: 038C greek capital letter omicron with tonos
+1FFA	GREEK CAPITAL LETTER OMEGA WITH VARIA
+	: 03A9 0300
+1FFB	GREEK CAPITAL LETTER OMEGA WITH OXIA
+	: 038F greek capital letter omega with tonos
+1FFC	GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+	: 03A9 0345
+1FFD	GREEK OXIA
+	: 00B4 acute accent
+1FFE	GREEK DASIA
+	# 0020 0314
+@@	2000	General Punctuation	206F
+@+	For additional general punctuation characters see also Basic Latin, Latin-1, Supplemental Punctuation and CJK Symbols and Punctuation.
+@		Spaces
+2000	EN QUAD
+	: 2002 en space
+2001	EM QUAD
+	= mutton quad
+	: 2003 em space
+2002	EN SPACE
+	= nut
+	* half an em
+	# 0020 space
+2003	EM SPACE
+	= mutton
+	* nominally, a space equal to the type size in points
+	* may scale by the condensation factor of a font
+	# 0020 space
+2004	THREE-PER-EM SPACE
+	= thick space
+	# 0020 space
+2005	FOUR-PER-EM SPACE
+	= mid space
+	# 0020 space
+2006	SIX-PER-EM SPACE
+	* in computer typography sometimes equated to thin space
+	# 0020 space
+2007	FIGURE SPACE
+	* space equal to tabular width of a font
+	* this is equivalent to the digit width of fonts with fixed-width digits
+	# <noBreak> 0020
+2008	PUNCTUATION SPACE
+	* space equal to narrow punctuation of a font
+	# 0020 space
+2009	THIN SPACE
+	* a fifth of an em (or sometimes a sixth)
+	# 0020 space
+200A	HAIR SPACE
+	* thinner than a thin space
+	* in traditional typography, the thinnest space available
+	# 0020 space
+200B	ZERO WIDTH SPACE
+	= ZWSP
+	* this character is intended for line break control; it has no width, but its presence between two characters does not prevent increased letter spacing in justification
+@		Formatting characters
+200C	ZERO WIDTH NON-JOINER
+	= ZWNJ
+200D	ZERO WIDTH JOINER
+	= ZWJ
+200E	LEFT-TO-RIGHT MARK
+	= LRM
+200F	RIGHT-TO-LEFT MARK
+	= RLM
+@		Dashes
+2010	HYPHEN
+	x (hyphen-minus - 002D)
+	x (soft hyphen - 00AD)
+2011	NON-BREAKING HYPHEN
+	x (hyphen-minus - 002D)
+	x (soft hyphen - 00AD)
+	# <noBreak> 2010
+2012	FIGURE DASH
+2013	EN DASH
+2014	EM DASH
+	* may be used in pairs to offset parenthetical text
+	x (katakana-hiragana prolonged sound mark - 30FC)
+2015	HORIZONTAL BAR
+	= QUOTATION DASH
+	* long dash introducing quoted text
+@		General punctuation
+2016	DOUBLE VERTICAL LINE
+	* used in pairs to indicate norm of a matrix
+	x (combining double vertical stroke overlay - 20E6)
+	x (parallel to - 2225)
+2017	DOUBLE LOW LINE
+	* this is a spacing character
+	x (low line - 005F)
+	x (combining double low line - 0333)
+	# 0020 0333
+2018	LEFT SINGLE QUOTATION MARK
+	= SINGLE TURNED COMMA QUOTATION MARK
+	* this is the preferred glyph (as opposed to 201B)
+	x (apostrophe - 0027)
+	x (modifier letter turned comma - 02BB)
+	x (heavy single turned comma quotation mark ornament - 275B)
+2019	RIGHT SINGLE QUOTATION MARK
+	= SINGLE COMMA QUOTATION MARK
+	* this is the preferred character to use for apostrophe
+	x (apostrophe - 0027)
+	x (modifier letter apostrophe - 02BC)
+	x (heavy single comma quotation mark ornament - 275C)
+201A	SINGLE LOW-9 QUOTATION MARK
+	= LOW SINGLE COMMA QUOTATION MARK
+	* used as opening single quotation mark in some languages
+201B	SINGLE HIGH-REVERSED-9 QUOTATION MARK
+	= SINGLE REVERSED COMMA QUOTATION MARK
+	* glyph variant of 2018
+	x (modifier letter reversed comma - 02BD)
+201C	LEFT DOUBLE QUOTATION MARK
+	= DOUBLE TURNED COMMA QUOTATION MARK
+	* this is the preferred glyph (as opposed to 201F)
+	x (quotation mark - 0022)
+	x (heavy double turned comma quotation mark ornament - 275D)
+	x (reversed double prime quotation mark - 301D)
+201D	RIGHT DOUBLE QUOTATION MARK
+	= DOUBLE COMMA QUOTATION MARK
+	x (quotation mark - 0022)
+	x (double prime - 2033)
+	x (heavy double comma quotation mark ornament - 275E)
+	x (double prime quotation mark - 301E)
+201E	DOUBLE LOW-9 QUOTATION MARK
+	= LOW DOUBLE COMMA QUOTATION MARK
+	* used as opening double quotation mark in some languages
+	x (low double prime quotation mark - 301F)
+201F	DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+	= DOUBLE REVERSED COMMA QUOTATION MARK
+	* glyph variant of 201C
+2020	DAGGER
+	= obelisk, obelus, long cross
+2021	DOUBLE DAGGER
+	= diesis, double obelisk
+2022	BULLET
+	= black small circle
+	x (middle dot - 00B7)
+	x (one dot leader - 2024)
+	x (bullet operator - 2219)
+	x (inverse bullet - 25D8)
+	x (white bullet - 25E6)
+2023	TRIANGULAR BULLET
+	x (end of proof - 220E)
+	x (black right-pointing small triangle - 25B8)
+2024	ONE DOT LEADER
+	* also used as an Armenian semicolon (mijaket)
+	x (middle dot - 00B7)
+	x (bullet - 2022)
+	x (bullet operator - 2219)
+	# 002E full stop
+2025	TWO DOT LEADER
+	# 002E 002E
+2026	HORIZONTAL ELLIPSIS
+	= three dot leader
+	x (vertical ellipsis - 22EE)
+	x (presentation form for vertical horizontal ellipsis - FE19)
+	# 002E 002E 002E
+2027	HYPHENATION POINT
+@		Formatting characters
+2028	LINE SEPARATOR
+	* may be used to represent this semantic unambiguously
+2029	PARAGRAPH SEPARATOR
+	* may be used to represent this semantic unambiguously
+202A	LEFT-TO-RIGHT EMBEDDING
+	= LRE
+202B	RIGHT-TO-LEFT EMBEDDING
+	= RLE
+202C	POP DIRECTIONAL FORMATTING
+	= PDF
+202D	LEFT-TO-RIGHT OVERRIDE
+	= LRO
+202E	RIGHT-TO-LEFT OVERRIDE
+	= RLO
+202F	NARROW NO-BREAK SPACE
+	= NNBSP
+	x (no-break space - 00A0)
+	# <noBreak> 0020
+@		General punctuation
+2030	PER MILLE SIGN
+	= permille, per thousand
+	* used, for example, in measures of blood alcohol content, salinity, etc.
+	x (percent sign - 0025)
+2031	PER TEN THOUSAND SIGN
+	= permyriad
+	* percent of a percent, rarely used
+	x (percent sign - 0025)
+2032	PRIME
+	= minutes, feet
+	x (apostrophe - 0027)
+	x (acute accent - 00B4)
+	x (modifier letter prime - 02B9)
+2033	DOUBLE PRIME
+	= seconds, inches
+	x (quotation mark - 0022)
+	x (modifier letter double prime - 02BA)
+	x (right double quotation mark - 201D)
+	x (ditto mark - 3003)
+	x (double prime quotation mark - 301E)
+	# 2032 2032
+2034	TRIPLE PRIME
+	= lines (old measure, 1/12 of an inch)
+	# 2032 2032 2032
+2035	REVERSED PRIME
+	x (grave accent - 0060)
+2036	REVERSED DOUBLE PRIME
+	x (reversed double prime quotation mark - 301D)
+	# 2035 2035
+2037	REVERSED TRIPLE PRIME
+	# 2035 2035 2035
+2038	CARET
+	x (up arrowhead - 2303)
+2039	SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+	= LEFT POINTING SINGLE GUILLEMET
+	* usually opening, sometimes closing
+	x (less-than sign - 003C)
+	x (left-pointing angle bracket - 2329)
+	x (left angle bracket - 3008)
+203A	SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+	= RIGHT POINTING SINGLE GUILLEMET
+	* usually closing, sometimes opening
+	x (greater-than sign - 003E)
+	x (right-pointing angle bracket - 232A)
+	x (right angle bracket - 3009)
+203B	REFERENCE MARK
+	= Japanese kome
+	= Urdu paragraph separator
+	x (tibetan ku ru kha bzhi mig can - 0FBF)
+@		Double punctuation for vertical text
+203C	DOUBLE EXCLAMATION MARK
+	x (exclamation mark - 0021)
+	# 0021 0021
+@		General punctuation
+203D	INTERROBANG
+	x (exclamation mark - 0021)
+	x (question mark - 003F)
+203E	OVERLINE
+	= SPACING OVERSCORE
+	# 0020 0305
+203F	UNDERTIE (Enotikon)
+	= Greek enotikon
+	x (smile - 2323)
+2040	CHARACTER TIE
+	= z notation sequence concatenation
+	x (frown - 2322)
+2041	CARET INSERTION POINT
+	* proofreader's mark: insert here
+	x (right semidirect product - 22CC)
+2042	ASTERISM
+2043	HYPHEN BULLET
+2044	FRACTION SLASH
+	= solidus (in typography)
+	* for composing arbitrary fractions
+	x (solidus - 002F)
+	x (division slash - 2215)
+2045	LEFT SQUARE BRACKET WITH QUILL
+2046	RIGHT SQUARE BRACKET WITH QUILL
+@		Double punctuation for vertical text
+2047	DOUBLE QUESTION MARK
+	# 003F 003F
+2048	QUESTION EXCLAMATION MARK
+	# 003F 0021
+2049	EXCLAMATION QUESTION MARK
+	# 0021 003F
+@		General punctuation
+204A	TIRONIAN SIGN ET
+	* Irish Gaelic, ...
+204B	REVERSED PILCROW SIGN
+	x (pilcrow sign - 00B6)
+204C	BLACK LEFTWARDS BULLET
+204D	BLACK RIGHTWARDS BULLET
+204E	LOW ASTERISK
+	x (asterisk - 002A)
+204F	REVERSED SEMICOLON
+	x (semicolon - 003B)
+2050	CLOSE UP
+	* editing mark
+2051	TWO ASTERISKS ALIGNED VERTICALLY
+2052	COMMERCIAL MINUS SIGN
+	= abzüglich (German), med avdrag av (Swedish), piska (Swedish, "whip")
+	* a common glyph variant and fallback representation looks like ./.
+	* may also be used as a dingbat to indicate correctness
+	* used in Finno-Ugric Phonetic Alphabet to indicate a related borrowed form with different sound
+	x (percent sign - 0025)
+	x (arabic percent sign - 066A)
+2053	SWUNG DASH
+	x (tilde - 007E)
+2054	INVERTED UNDERTIE
+2055	FLOWER PUNCTUATION MARK
+	= phul, puspika
+	* used as a punctuation mark with Syloti Nagri, Bengali and other Indic scripts
+	x (heavy eight teardrop-spoked propeller asterisk - 274B)
+@		Archaic punctuation
+2056	THREE DOT PUNCTUATION
+@		General punctuation
+2057	QUADRUPLE PRIME
+	# 2032 2032 2032 2032
+@		Archaic punctuation
+2058	FOUR DOT PUNCTUATION
+2059	FIVE DOT PUNCTUATION
+	= Greek pentonkion
+205A	TWO DOT PUNCTUATION
+	* historically used to indicate the end of a sentence or change of speaker
+	* extends from baseline to cap height
+	x (presentation form for vertical two dot leader - FE30)
+	x (greek acrophonic epidaurean two - 1015B)
+205B	FOUR DOT MARK
+	* used by scribes in the margin as highlighter mark
+	* this is centered on the line, but extends beyond top and bottom of the line
+205C	DOTTED CROSS
+	* used by scribes in the margin as highlighter mark
+205D	TRICOLON
+	= Epidaurean acrophonic symbol three
+	x (vertical ellipsis - 22EE)
+	x (triple colon operator - 2AF6)
+	x (presentation form for vertical horizontal ellipsis - FE19)
+205E	VERTICAL FOUR DOTS
+	* used in dictionaries to indicate legal but undesirable word break
+	* glyph extends the whole height of the line
+@		Space
+205F	MEDIUM MATHEMATICAL SPACE
+	= MMSP
+	* four-eighteenths of an em
+	# 0020 space
+@		Formatting character
+2060	WORD JOINER
+	= WJ
+	* a zero width non-breaking space (only)
+	* intended for disambiguation of functions for byte order mark
+	x (zero width no-break space - FEFF)
+@		Invisible operators
+2061	FUNCTION APPLICATION
+	* contiguity operator indicating application of a function
+2062	INVISIBLE TIMES
+	* contiguity operator indicating multiplication
+2063	INVISIBLE SEPARATOR
+	= invisible comma
+	* contiguity operator indicating that adjacent mathematical symbols form a list, e.g. when no visible comma is used between multiple indices
+@		Deprecated
+206A	INHIBIT SYMMETRIC SWAPPING
+206B	ACTIVATE SYMMETRIC SWAPPING
+206C	INHIBIT ARABIC FORM SHAPING
+206D	ACTIVATE ARABIC FORM SHAPING
+206E	NATIONAL DIGIT SHAPES
+206F	NOMINAL DIGIT SHAPES
+@@	2070	Superscripts and Subscripts	209F
+@		Superscripts
+2070	SUPERSCRIPT ZERO
+	# <super> 0030
+2071	SUPERSCRIPT LATIN SMALL LETTER I
+	# <super> 0069
+2072	<reserved>
+	x (superscript two - 00B2)
+2073	<reserved>
+	x (superscript three - 00B3)
+2074	SUPERSCRIPT FOUR
+	# <super> 0034
+2075	SUPERSCRIPT FIVE
+	# <super> 0035
+2076	SUPERSCRIPT SIX
+	# <super> 0036
+2077	SUPERSCRIPT SEVEN
+	# <super> 0037
+2078	SUPERSCRIPT EIGHT
+	# <super> 0038
+2079	SUPERSCRIPT NINE
+	# <super> 0039
+207A	SUPERSCRIPT PLUS SIGN
+	# <super> 002B
+207B	SUPERSCRIPT MINUS
+	# <super> 2212
+207C	SUPERSCRIPT EQUALS SIGN
+	# <super> 003D
+207D	SUPERSCRIPT LEFT PARENTHESIS
+	# <super> 0028
+207E	SUPERSCRIPT RIGHT PARENTHESIS
+	# <super> 0029
+207F	SUPERSCRIPT LATIN SMALL LETTER N
+	# <super> 006E
+@		Subscripts
+2080	SUBSCRIPT ZERO
+	# <sub> 0030
+2081	SUBSCRIPT ONE
+	# <sub> 0031
+2082	SUBSCRIPT TWO
+	# <sub> 0032
+2083	SUBSCRIPT THREE
+	# <sub> 0033
+2084	SUBSCRIPT FOUR
+	# <sub> 0034
+2085	SUBSCRIPT FIVE
+	# <sub> 0035
+2086	SUBSCRIPT SIX
+	# <sub> 0036
+2087	SUBSCRIPT SEVEN
+	# <sub> 0037
+2088	SUBSCRIPT EIGHT
+	# <sub> 0038
+2089	SUBSCRIPT NINE
+	# <sub> 0039
+208A	SUBSCRIPT PLUS SIGN
+	# <sub> 002B
+208B	SUBSCRIPT MINUS
+	# <sub> 2212
+208C	SUBSCRIPT EQUALS SIGN
+	# <sub> 003D
+208D	SUBSCRIPT LEFT PARENTHESIS
+	# <sub> 0028
+208E	SUBSCRIPT RIGHT PARENTHESIS
+	# <sub> 0029
+2090	LATIN SUBSCRIPT SMALL LETTER A
+	# <sub> 0061
+2091	LATIN SUBSCRIPT SMALL LETTER E
+	# <sub> 0065
+2092	LATIN SUBSCRIPT SMALL LETTER O
+	# <sub> 006F
+2093	LATIN SUBSCRIPT SMALL LETTER X
+	# <sub> 0078
+2094	LATIN SUBSCRIPT SMALL LETTER SCHWA
+	# <sub> 0259
+@@	20A0	Currency Symbols	20CF
+@		Currency symbols
+@+		A number of currency symbols are found in other blocks. Fullwidth versions of some currency symbols are found in the Halfwidth and Fullwidth Forms block.
+		x (dollar sign - 0024)
+		x (cent sign - 00A2)
+		x (pound sign - 00A3)
+		x (currency sign - 00A4)
+		x (yen sign - 00A5)
+		x (latin small letter f with hook - 0192)
+		x (afghani sign - 060B)
+		x (bengali rupee mark - 09F2)
+		x (bengali rupee sign - 09F3)
+		x (gujarati rupee sign - 0AF1)
+		x (tamil rupee sign - 0BF9)
+		x (thai currency symbol baht - 0E3F)
+		x (khmer currency symbol riel - 17DB)
+		x (script capital m - 2133)
+		x (rial sign - FDFC)
+20A0	EURO-CURRENCY SIGN
+	* intended for ECU, but not widely used
+	* historical character; this is NOT the euro!
+	x (euro sign - 20AC)
+20A1	COLON SIGN
+	* Costa Rica, El Salvador
+20A2	CRUZEIRO SIGN
+	* Brazil
+20A3	FRENCH FRANC SIGN
+	* France
+20A4	LIRA SIGN
+	* intended for lira, but not widely used
+	* preferred character for lira is 00A3
+	x (pound sign - 00A3)
+20A5	MILL SIGN
+	* USA (1/10 cent)
+20A6	NAIRA SIGN
+	* Nigeria
+20A7	PESETA SIGN
+	* Spain
+	x (peso sign - 20B1)
+20A8	RUPEE SIGN
+	* India
+	# 0052 0073
+20A9	WON SIGN
+	* Korea
+20AA	NEW SHEQEL SIGN
+	* Israel
+20AB	DONG SIGN
+	* Vietnam
+20AC	EURO SIGN
+	* currency sign for the European Monetary Union
+	* euro, not ecu
+	x (euro-currency sign - 20A0)
+20AD	KIP SIGN
+	* Laos
+20AE	TUGRIK SIGN
+	* Mongolia
+	* also transliterated as tugrug, tugric, tugrog, togrog, tögrög
+20AF	DRACHMA SIGN
+	* Greece
+20B0	GERMAN PENNY SIGN
+20B1	PESO SIGN
+	* Philippines
+	* the Mexican peso is indicated with the dollar sign
+	x (peseta sign - 20A7)
+20B2	GUARANI SIGN
+	* Paraguay
+	* Often represented by G. or Gs.
+20B3	AUSTRAL SIGN
+	* former Argentinian currency
+20B4	HRYVNIA SIGN
+	* Ukraine
+20B5	CEDI SIGN
+	* Ghana
+	* glyph may look like '023B' or like C with a short vertical stroke through the upper arm
+	x (cent sign - 00A2)
+	x (latin capital letter c with stroke - 023B)
+@@	20D0	Combining Diacritical Marks for Symbols	20FF
+@		Combining diacritical marks for symbols
+20D0	COMBINING LEFT HARPOON ABOVE
+20D1	COMBINING RIGHT HARPOON ABOVE
+	* vector
+20D2	COMBINING LONG VERTICAL LINE OVERLAY
+	* negation
+20D3	COMBINING SHORT VERTICAL LINE OVERLAY
+	* occasional variant for negation
+20D4	COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5	COMBINING CLOCKWISE ARROW ABOVE
+	* rotation
+20D6	COMBINING LEFT ARROW ABOVE
+20D7	COMBINING RIGHT ARROW ABOVE
+	* vector
+20D8	COMBINING RING OVERLAY
+20D9	COMBINING CLOCKWISE RING OVERLAY
+20DA	COMBINING ANTICLOCKWISE RING OVERLAY
+20DB	COMBINING THREE DOTS ABOVE
+	= third derivative
+20DC	COMBINING FOUR DOTS ABOVE
+	= fourth derivative
+@		Enclosing diacritics
+20DD	COMBINING ENCLOSING CIRCLE
+	= JIS composition circle
+	x (white circle - 25CB)
+	x (large circle - 25EF)
+	x (ideographic number zero - 3007)
+20DE	COMBINING ENCLOSING SQUARE
+	x (white square - 25A1)
+20DF	COMBINING ENCLOSING DIAMOND
+	x (white diamond - 25C7)
+20E0	COMBINING ENCLOSING CIRCLE BACKSLASH
+	* prohibition
+@		Additional diacritical mark for symbols
+20E1	COMBINING LEFT RIGHT ARROW ABOVE
+	* tensor
+@		Additional enclosing diacritics
+20E2	COMBINING ENCLOSING SCREEN
+	x (clear screen symbol - 239A)
+20E3	COMBINING ENCLOSING KEYCAP
+20E4	COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+	x (white up-pointing triangle - 25B3)
+@		Additional diacritical marks for symbols
+20E5	COMBINING REVERSE SOLIDUS OVERLAY
+	x (reverse solidus - 005C)
+20E6	COMBINING DOUBLE VERTICAL STROKE OVERLAY
+	= z notation finite function diacritic
+	x (double vertical line - 2016)
+20E7	COMBINING ANNUITY SYMBOL
+	= actuarial bend
+	x (right ceiling - 2309)
+20E8	COMBINING TRIPLE UNDERDOT
+20E9	COMBINING WIDE BRIDGE ABOVE
+	= contraction operator
+	* extends the full width of the base character
+	x (combining bridge above - 0346)
+20EA	COMBINING LEFTWARDS ARROW OVERLAY
+	x (leftwards arrow - 2190)
+20EB	COMBINING LONG DOUBLE SOLIDUS OVERLAY
+	= long double slash overlay
+@@	2100	Letterlike Symbols	214F
+@		Letterlike symbols
+@+		Some of the letterlike symbols are intended to complete the set of mathematical alphanumeric symbols starting at U+1D400.
+2100	ACCOUNT OF
+	# 0061 002F 0063
+2101	ADDRESSED TO THE SUBJECT
+	# 0061 002F 0073
+2102	DOUBLE-STRUCK CAPITAL C
+	= the set of complex numbers
+	# <font> 0043 latin capital letter c
+2103	DEGREE CELSIUS
+	= degrees Centigrade
+	# 00B0 0043
+2104	CENTRE LINE SYMBOL
+	= clone
+2105	CARE OF
+	# 0063 002F 006F
+2106	CADA UNA
+	# 0063 002F 0075
+2107	EULER CONSTANT
+	x (latin capital letter e - 0045)
+	# 0190 latin capital letter open e
+2108	SCRUPLE
+2109	DEGREE FAHRENHEIT
+	# 00B0 0046
+210A	SCRIPT SMALL G
+	= real number symbol
+	# <font> 0067 latin small letter g
+210B	SCRIPT CAPITAL H
+	= Hamiltonian operator
+	# <font> 0048 latin capital letter h
+210C	BLACK-LETTER CAPITAL H
+	= Hilbert space
+	# <font> 0048 latin capital letter h
+210D	DOUBLE-STRUCK CAPITAL H
+	# <font> 0048 latin capital letter h
+210E	PLANCK CONSTANT
+	# <font> 0068 latin small letter h
+210F	PLANCK CONSTANT OVER TWO PI
+	x (cyrillic small letter tshe - 045B)
+	# <font> 0127 latin small letter h with stroke
+2110	SCRIPT CAPITAL I
+	# <font> 0049 latin capital letter i
+2111	BLACK-LETTER CAPITAL I
+	= imaginary part
+	# <font> 0049 latin capital letter i
+2112	SCRIPT CAPITAL L
+	= Laplace transform
+	# <font> 004C latin capital letter l
+2113	SCRIPT SMALL L
+	= mathematical symbol 'ell'
+	= liter (traditional symbol)
+	* despite its character name, this symbol is derived from a special italicized version of the small letter l
+	* the SI recommended symbol for liter is 006C
+	x (mathematical script small l - 1D4C1)
+	# <font> 006C latin small letter l
+2114	L B BAR SYMBOL
+	= pounds
+2115	DOUBLE-STRUCK CAPITAL N
+	= natural number
+	# <font> 004E latin capital letter n
+2116	NUMERO SIGN
+	# 004E 006F
+2117	SOUND RECORDING COPYRIGHT
+	= published
+	= phonorecord sign
+	x (copyright sign - 00A9)
+2118	SCRIPT CAPITAL P
+	= Weierstrass elliptic function
+	* actually this has the form of a lowercase calligraphic p, despite its name
+2119	DOUBLE-STRUCK CAPITAL P
+	# <font> 0050 latin capital letter p
+211A	DOUBLE-STRUCK CAPITAL Q
+	= the set of rational numbers
+	# <font> 0051 latin capital letter q
+211B	SCRIPT CAPITAL R
+	= Riemann Integral
+	# <font> 0052 latin capital letter r
+211C	BLACK-LETTER CAPITAL R
+	= real part
+	# <font> 0052 latin capital letter r
+211D	DOUBLE-STRUCK CAPITAL R
+	= the set of real numbers
+	# <font> 0052 latin capital letter r
+211E	PRESCRIPTION TAKE
+	= recipe
+	= cross ratio
+211F	RESPONSE
+2120	SERVICE MARK
+	# <super> 0053 004D
+2121	TELEPHONE SIGN
+	* typical forms for this symbol may use lower case, small caps or superscripted letter shapes
+	# 0054 0045 004C
+2122	TRADE MARK SIGN
+	# <super> 0054 004D
+2123	VERSICLE
+2124	DOUBLE-STRUCK CAPITAL Z
+	= the set of integers
+	# <font> 005A latin capital letter z
+2125	OUNCE SIGN
+	x (latin small letter yogh - 021D)
+2126	OHM SIGN
+	* SI unit of resistance, named after G. S. Ohm, German physicist
+	* preferred representation is 03A9
+	: 03A9 greek capital letter omega
+2127	INVERTED OHM SIGN
+	= MHO
+	* archaic unit of conductance (= the SI unit siemens)
+	* typographically a turned greek capital letter omega
+	x (latin capital letter upsilon - 01B1)
+	x (greek capital letter omega - 03A9)
+2128	BLACK-LETTER CAPITAL Z
+	# <font> 005A latin capital letter z
+2129	TURNED GREEK SMALL LETTER IOTA
+	* unique element fulfilling a description (logic)
+	x (greek small letter iota - 03B9)
+212A	KELVIN SIGN
+	: 004B latin capital letter k
+212B	ANGSTROM SIGN
+	* non SI length unit (=0.1 nm) named after A. J. Ångström, Swedish physicist
+	* preferred representation is 00C5
+	: 00C5 latin capital letter a with ring above
+212C	SCRIPT CAPITAL B
+	= Bernoulli function
+	# <font> 0042 latin capital letter b
+212D	BLACK-LETTER CAPITAL C
+	# <font> 0043 latin capital letter c
+212E	ESTIMATED SYMBOL
+	* used in European packaging
+	x (latin small letter e - 0065)
+212F	SCRIPT SMALL E
+	= error
+	= natural exponent
+	# <font> 0065 latin small letter e
+2130	SCRIPT CAPITAL E
+	= emf (electromotive force)
+	# <font> 0045 latin capital letter e
+2131	SCRIPT CAPITAL F
+	= Fourier transform
+	# <font> 0046 latin capital letter f
+2132	TURNED CAPITAL F
+	x (latin capital letter f - 0046)
+2133	SCRIPT CAPITAL M
+	= M-matrix (physics)
+	= German Mark (not the current Deutsche Mark)
+	# <font> 004D latin capital letter m
+2134	SCRIPT SMALL O
+	= order, of inferior order to
+	# <font> 006F latin small letter o
+@		Hebrew letterlike math symbols
+@+		These are left-to-right characters.
+2135	ALEF SYMBOL
+	= first transfinite cardinal (countable)
+	# 05D0 hebrew letter alef
+2136	BET SYMBOL
+	= second transfinite cardinal (the continuum)
+	# 05D1 hebrew letter bet
+2137	GIMEL SYMBOL
+	= third transfinite cardinal (functions of a real variable)
+	# 05D2 hebrew letter gimel
+2138	DALET SYMBOL
+	= fourth transfinite cardinal
+	# 05D3 hebrew letter dalet
+@		Additional letterlike symbols
+2139	INFORMATION SOURCE
+	* intended for use with 20DD
+	# <font> 0069 latin small letter i
+213A	ROTATED CAPITAL Q
+	* a binding signature mark
+213B	FACSIMILE SIGN
+	* typical forms for this symbol may use lower case, small caps or superscripted letter shapes
+	x (telephone sign - 2121)
+	# 0046 0041 0058
+213C	DOUBLE-STRUCK SMALL PI
+	# <font> 03C0 greek small letter pi
+213D	DOUBLE-STRUCK SMALL GAMMA
+	# <font> 03B3 greek small letter gamma
+213E	DOUBLE-STRUCK CAPITAL GAMMA
+	# <font> 0393 greek capital letter gamma
+213F	DOUBLE-STRUCK CAPITAL PI
+	# <font> 03A0 greek capital letter pi
+@		Double-struck large operator
+2140	DOUBLE-STRUCK N-ARY SUMMATION
+	# <font> 2211 n-ary summation
+@		Additional letterlike symbols
+2141	TURNED SANS-SERIF CAPITAL G
+	= game
+2142	TURNED SANS-SERIF CAPITAL L
+2143	REVERSED SANS-SERIF CAPITAL L
+2144	TURNED SANS-SERIF CAPITAL Y
+@		Double-struck italic mathematical symbols
+@+		These stylized mathematical symbols are used in some documents to distinguish special mathematical usages from ordinary variables.
+2145	DOUBLE-STRUCK ITALIC CAPITAL D
+	* sometimes used for the differential
+	# <font> 0044 latin capital letter d
+2146	DOUBLE-STRUCK ITALIC SMALL D
+	* sometimes used for the differential
+	# <font> 0064 latin small letter d
+2147	DOUBLE-STRUCK ITALIC SMALL E
+	* sometimes used for the natural exponent
+	# <font> 0065 latin small letter e
+2148	DOUBLE-STRUCK ITALIC SMALL I
+	* sometimes used for the imaginary unit
+	# <font> 0069 latin small letter i
+2149	DOUBLE-STRUCK ITALIC SMALL J
+	* sometimes used for the imaginary unit
+	# <font> 006A latin small letter j
+@		Additional letterlike symbols
+214A	PROPERTY LINE
+214B	TURNED AMPERSAND
+	* used in linear logic
+	x (ampersand - 0026)
+214C	PER SIGN
+	* abbreviates the word 'per'
+@@	2150	Number Forms	218F
+@		Fractions
+@+		Other fraction number forms are found in the Latin-1 Supplement block.
+	x (vulgar fraction one quarter - 00BC)
+	x (vulgar fraction one half - 00BD)
+	x (vulgar fraction three quarters - 00BE)
+2153	VULGAR FRACTION ONE THIRD
+	# <fraction> 0031 2044 0033
+2154	VULGAR FRACTION TWO THIRDS
+	# <fraction> 0032 2044 0033
+2155	VULGAR FRACTION ONE FIFTH
+	# <fraction> 0031 2044 0035
+2156	VULGAR FRACTION TWO FIFTHS
+	# <fraction> 0032 2044 0035
+2157	VULGAR FRACTION THREE FIFTHS
+	# <fraction> 0033 2044 0035
+2158	VULGAR FRACTION FOUR FIFTHS
+	# <fraction> 0034 2044 0035
+2159	VULGAR FRACTION ONE SIXTH
+	# <fraction> 0031 2044 0036
+215A	VULGAR FRACTION FIVE SIXTHS
+	# <fraction> 0035 2044 0036
+215B	VULGAR FRACTION ONE EIGHTH
+	# <fraction> 0031 2044 0038
+215C	VULGAR FRACTION THREE EIGHTHS
+	# <fraction> 0033 2044 0038
+215D	VULGAR FRACTION FIVE EIGHTHS
+	# <fraction> 0035 2044 0038
+215E	VULGAR FRACTION SEVEN EIGHTHS
+	# <fraction> 0037 2044 0038
+215F	FRACTION NUMERATOR ONE
+	# <fraction> 0031 2044
+@		Roman numerals
+2160	ROMAN NUMERAL ONE
+	# 0049 latin capital letter i
+2161	ROMAN NUMERAL TWO
+	# 0049 0049
+2162	ROMAN NUMERAL THREE
+	# 0049 0049 0049
+2163	ROMAN NUMERAL FOUR
+	# 0049 0056
+2164	ROMAN NUMERAL FIVE
+	# 0056 latin capital letter v
+2165	ROMAN NUMERAL SIX
+	# 0056 0049
+2166	ROMAN NUMERAL SEVEN
+	# 0056 0049 0049
+2167	ROMAN NUMERAL EIGHT
+	# 0056 0049 0049 0049
+2168	ROMAN NUMERAL NINE
+	# 0049 0058
+2169	ROMAN NUMERAL TEN
+	# 0058 latin capital letter x
+216A	ROMAN NUMERAL ELEVEN
+	# 0058 0049
+216B	ROMAN NUMERAL TWELVE
+	# 0058 0049 0049
+216C	ROMAN NUMERAL FIFTY
+	# 004C latin capital letter l
+216D	ROMAN NUMERAL ONE HUNDRED
+	# 0043 latin capital letter c
+216E	ROMAN NUMERAL FIVE HUNDRED
+	# 0044 latin capital letter d
+216F	ROMAN NUMERAL ONE THOUSAND
+	# 004D latin capital letter m
+2170	SMALL ROMAN NUMERAL ONE
+	# 0069 latin small letter i
+2171	SMALL ROMAN NUMERAL TWO
+	# 0069 0069
+2172	SMALL ROMAN NUMERAL THREE
+	# 0069 0069 0069
+2173	SMALL ROMAN NUMERAL FOUR
+	# 0069 0076
+2174	SMALL ROMAN NUMERAL FIVE
+	# 0076 latin small letter v
+2175	SMALL ROMAN NUMERAL SIX
+	# 0076 0069
+2176	SMALL ROMAN NUMERAL SEVEN
+	# 0076 0069 0069
+2177	SMALL ROMAN NUMERAL EIGHT
+	# 0076 0069 0069 0069
+2178	SMALL ROMAN NUMERAL NINE
+	# 0069 0078
+2179	SMALL ROMAN NUMERAL TEN
+	# 0078 latin small letter x
+217A	SMALL ROMAN NUMERAL ELEVEN
+	# 0078 0069
+217B	SMALL ROMAN NUMERAL TWELVE
+	# 0078 0069 0069
+217C	SMALL ROMAN NUMERAL FIFTY
+	# 006C latin small letter l
+217D	SMALL ROMAN NUMERAL ONE HUNDRED
+	# 0063 latin small letter c
+217E	SMALL ROMAN NUMERAL FIVE HUNDRED
+	# 0064 latin small letter d
+217F	SMALL ROMAN NUMERAL ONE THOUSAND
+	# 006D latin small letter m
+2180	ROMAN NUMERAL ONE THOUSAND C D
+2181	ROMAN NUMERAL FIVE THOUSAND
+2182	ROMAN NUMERAL TEN THOUSAND
+2183	ROMAN NUMERAL REVERSED ONE HUNDRED
+	= apostrophic C
+	* used in combination with C and I to form large numbers
+@@	2190	Arrows	21FF
+@		Arrows
+2190	LEFTWARDS ARROW
+	x (combining leftwards arrow overlay - 20EA)
+2191	UPWARDS ARROW
+	* IPA: egressive airflow
+2192	RIGHTWARDS ARROW
+	= z notation total function
+2193	DOWNWARDS ARROW
+	* IPA: ingressive airflow
+2194	LEFT RIGHT ARROW
+	= z notation relation
+2195	UP DOWN ARROW
+2196	NORTH WEST ARROW
+2197	NORTH EAST ARROW
+2198	SOUTH EAST ARROW
+2199	SOUTH WEST ARROW
+219A	LEFTWARDS ARROW WITH STROKE
+	* negation of 2190
+	: 2190 0338
+219B	RIGHTWARDS ARROW WITH STROKE
+	* negation of 2192
+	: 2192 0338
+219C	LEFTWARDS WAVE ARROW
+219D	RIGHTWARDS WAVE ARROW
+219E	LEFTWARDS TWO HEADED ARROW
+	= fast cursor left
+219F	UPWARDS TWO HEADED ARROW
+	= fast cursor up
+21A0	RIGHTWARDS TWO HEADED ARROW
+	= z notation total surjection
+	= fast cursor right
+21A1	DOWNWARDS TWO HEADED ARROW
+	= form feed
+	= fast cursor down
+21A2	LEFTWARDS ARROW WITH TAIL
+21A3	RIGHTWARDS ARROW WITH TAIL
+	= z notation total injection
+21A4	LEFTWARDS ARROW FROM BAR
+21A5	UPWARDS ARROW FROM BAR
+21A6	RIGHTWARDS ARROW FROM BAR
+	= z notation maplet
+21A7	DOWNWARDS ARROW FROM BAR
+	= depth symbol
+21A8	UP DOWN ARROW WITH BASE
+21A9	LEFTWARDS ARROW WITH HOOK
+21AA	RIGHTWARDS ARROW WITH HOOK
+21AB	LEFTWARDS ARROW WITH LOOP
+21AC	RIGHTWARDS ARROW WITH LOOP
+21AD	LEFT RIGHT WAVE ARROW
+21AE	LEFT RIGHT ARROW WITH STROKE
+	* negation of 2194
+	: 2194 0338
+21AF	DOWNWARDS ZIGZAG ARROW
+	= electrolysis
+21B0	UPWARDS ARROW WITH TIP LEFTWARDS
+21B1	UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2	DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3	DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4	RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+	= line feed
+21B5	DOWNWARDS ARROW WITH CORNER LEFTWARDS
+	* may indicate a carriage return or new line
+	x (return symbol - 23CE)
+21B6	ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7	CLOCKWISE TOP SEMICIRCLE ARROW
+21B8	NORTH WEST ARROW TO LONG BAR
+	= home
+21B9	LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+	= tab with shift tab
+21BA	ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB	CLOCKWISE OPEN CIRCLE ARROW
+21BC	LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD	LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE	UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF	UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0	RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1	RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2	DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3	DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4	RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5	UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6	LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7	LEFTWARDS PAIRED ARROWS
+21C8	UPWARDS PAIRED ARROWS
+21C9	RIGHTWARDS PAIRED ARROWS
+21CA	DOWNWARDS PAIRED ARROWS
+21CB	LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC	RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD	LEFTWARDS DOUBLE ARROW WITH STROKE
+	* negation of 21D0
+	: 21D0 0338
+21CE	LEFT RIGHT DOUBLE ARROW WITH STROKE
+	* negation of 21D4
+	: 21D4 0338
+21CF	RIGHTWARDS DOUBLE ARROW WITH STROKE
+	* negation of 21D2
+	: 21D2 0338
+21D0	LEFTWARDS DOUBLE ARROW
+21D1	UPWARDS DOUBLE ARROW
+21D2	RIGHTWARDS DOUBLE ARROW
+21D3	DOWNWARDS DOUBLE ARROW
+21D4	LEFT RIGHT DOUBLE ARROW
+21D5	UP DOWN DOUBLE ARROW
+21D6	NORTH WEST DOUBLE ARROW
+21D7	NORTH EAST DOUBLE ARROW
+21D8	SOUTH EAST DOUBLE ARROW
+21D9	SOUTH WEST DOUBLE ARROW
+21DA	LEFTWARDS TRIPLE ARROW
+21DB	RIGHTWARDS TRIPLE ARROW
+21DC	LEFTWARDS SQUIGGLE ARROW
+21DD	RIGHTWARDS SQUIGGLE ARROW
+21DE	UPWARDS ARROW WITH DOUBLE STROKE
+	= page up
+21DF	DOWNWARDS ARROW WITH DOUBLE STROKE
+	= page down
+21E0	LEFTWARDS DASHED ARROW
+21E1	UPWARDS DASHED ARROW
+21E2	RIGHTWARDS DASHED ARROW
+21E3	DOWNWARDS DASHED ARROW
+21E4	LEFTWARDS ARROW TO BAR
+	= leftward tab
+21E5	RIGHTWARDS ARROW TO BAR
+	= rightward tab
+21E6	LEFTWARDS WHITE ARROW
+21E7	UPWARDS WHITE ARROW
+	= shift
+21E8	RIGHTWARDS WHITE ARROW
+21E9	DOWNWARDS WHITE ARROW
+21EA	UPWARDS WHITE ARROW FROM BAR
+	= caps lock
+21EB	UPWARDS WHITE ARROW ON PEDESTAL
+	= level 2 lock
+21EC	UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+	= caps lock
+21ED	UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+	= numerics lock
+21EE	UPWARDS WHITE DOUBLE ARROW
+	= level 3 select
+21EF	UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+	= level 3 lock
+21F0	RIGHTWARDS WHITE ARROW FROM WALL
+	= group lock
+21F1	NORTH WEST ARROW TO CORNER
+	= home
+21F2	SOUTH EAST ARROW TO CORNER
+	= end
+21F3	UP DOWN WHITE ARROW
+	= scrolling
+21F4	RIGHT ARROW WITH SMALL CIRCLE
+21F5	DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6	THREE RIGHTWARDS ARROWS
+21F7	LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8	RIGHTWARDS ARROW WITH VERTICAL STROKE
+	= z notation partial function
+21F9	LEFT RIGHT ARROW WITH VERTICAL STROKE
+	= z notation partial relation
+21FA	LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB	RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+	= z notation finite function
+21FC	LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+	= z notation finite relation
+21FD	LEFTWARDS OPEN-HEADED ARROW
+21FE	RIGHTWARDS OPEN-HEADED ARROW
+21FF	LEFT RIGHT OPEN-HEADED ARROW
+@@	2200	Mathematical Operators	22FF
+@		Miscellaneous mathematical symbols
+2200	FOR ALL
+	= universal quantifier
+2201	COMPLEMENT
+	x (latin letter stretched c - 0297)
+2202	PARTIAL DIFFERENTIAL
+2203	THERE EXISTS
+	= existential quantifier
+2204	THERE DOES NOT EXIST
+	: 2203 0338
+2205	EMPTY SET
+	= null set
+	* used in linguistics to indicate a null morpheme or phonological "zero"
+	x (latin capital letter o with stroke - 00D8)
+	x (diameter sign - 2300)
+2206	INCREMENT
+	= Laplace operator
+	= forward difference
+	x (greek capital letter delta - 0394)
+	x (white up-pointing triangle - 25B3)
+2207	NABLA
+	= backward difference
+	= gradient, del
+	* used for Laplacian operator (written with superscript 2)
+	x (white down-pointing triangle - 25BD)
+@		Set membership
+2208	ELEMENT OF
+2209	NOT AN ELEMENT OF
+	: 2208 0338
+220A	SMALL ELEMENT OF
+	* originates in math pi fonts; not the straight epsilon
+	x (greek lunate epsilon symbol - 03F5)
+220B	CONTAINS AS MEMBER
+	= such that
+220C	DOES NOT CONTAIN AS MEMBER
+	: 220B 0338
+220D	SMALL CONTAINS AS MEMBER
+	x (greek reversed lunate epsilon symbol - 03F6)
+@		Miscellaneous mathematical symbol
+220E	END OF PROOF
+	= Q.E.D.
+	x (triangular bullet - 2023)
+	x (black vertical rectangle - 25AE)
+@		N-ary operators
+220F	N-ARY PRODUCT
+	= product sign
+	x (greek capital letter pi - 03A0)
+2210	N-ARY COPRODUCT
+	= coproduct sign
+2211	N-ARY SUMMATION
+	= summation sign
+	x (greek capital letter sigma - 03A3)
+@		Operators
+2212	MINUS SIGN
+	x (hyphen-minus - 002D)
+2213	MINUS-OR-PLUS SIGN
+	x (plus-minus sign - 00B1)
+2214	DOT PLUS
+2215	DIVISION SLASH
+	* generic division operator
+	x (solidus - 002F)
+	x (fraction slash - 2044)
+2216	SET MINUS
+	x (reverse solidus - 005C)
+2217	ASTERISK OPERATOR
+	x (asterisk - 002A)
+2218	RING OPERATOR
+	= composite function
+	= APL jot
+	x (degree sign - 00B0)
+	x (white bullet - 25E6)
+2219	BULLET OPERATOR
+	x (middle dot - 00B7)
+	x (bullet - 2022)
+	x (one dot leader - 2024)
+221A	SQUARE ROOT
+	= radical sign
+	x (check mark - 2713)
+221B	CUBE ROOT
+221C	FOURTH ROOT
+221D	PROPORTIONAL TO
+	x (greek small letter alpha - 03B1)
+@		Miscellaneous mathematical symbols
+221E	INFINITY
+221F	RIGHT ANGLE
+2220	ANGLE
+2221	MEASURED ANGLE
+2222	SPHERICAL ANGLE
+	= angle arc
+@		Operators
+2223	DIVIDES
+	= such that
+	= APL stile
+	x (vertical line - 007C)
+	x (latin letter dental click - 01C0)
+2224	DOES NOT DIVIDE
+	: 2223 0338
+2225	PARALLEL TO
+	x (latin letter lateral click - 01C1)
+	x (double vertical line - 2016)
+2226	NOT PARALLEL TO
+	: 2225 0338
+@		Logical and set operators
+2227	LOGICAL AND
+	= wedge, conjunction
+	x (n-ary logical and - 22C0)
+	x (up arrowhead - 2303)
+2228	LOGICAL OR
+	= vee, disjunction
+	x (n-ary logical or - 22C1)
+	x (down arrowhead - 2304)
+2229	INTERSECTION
+	= cap, hat
+	x (n-ary intersection - 22C2)
+222A	UNION
+	= cup
+	x (n-ary union - 22C3)
+@		Integrals
+222B	INTEGRAL
+	x (latin small letter esh - 0283)
+222C	DOUBLE INTEGRAL
+	# 222B 222B
+222D	TRIPLE INTEGRAL
+	x (quadruple integral operator - 2A0C)
+	# 222B 222B 222B
+222E	CONTOUR INTEGRAL
+	x (integral around a point operator - 2A15)
+222F	SURFACE INTEGRAL
+	# 222E 222E
+2230	VOLUME INTEGRAL
+	# 222E 222E 222E
+2231	CLOCKWISE INTEGRAL
+2232	CLOCKWISE CONTOUR INTEGRAL
+2233	ANTICLOCKWISE CONTOUR INTEGRAL
+	* clockwise or anticlockwise arrows do not reverse during layout mirroring
+@		Miscellaneous mathematical symbols
+2234	THEREFORE
+2235	BECAUSE
+@		Relations
+2236	RATIO
+	x (colon - 003A)
+2237	PROPORTION
+@		Operator
+2238	DOT MINUS
+	= symmetric difference
+@		Relation
+2239	EXCESS
+@		Operator
+223A	GEOMETRIC PROPORTION
+@		Relations
+223B	HOMOTHETIC
+	x (tilde operator with rising dots - 2A6B)
+223C	TILDE OPERATOR
+	= varies with (proportional to)
+	= difference between
+	= similar to
+	= not
+	= cycle
+	= APL tilde
+	x (tilde - 007E)
+	x (not sign - 00AC)
+	x (small tilde - 02DC)
+223D	REVERSED TILDE (lazy S)
+	= lazy S
+	* reversed tilde and lazy S are glyph variants
+223E	INVERTED LAZY S
+	= most positive
+@		Miscellaneous mathematical symbol
+223F	SINE WAVE
+	= alternating current
+@		Operator
+2240	WREATH PRODUCT
+@		Relations
+2241	NOT TILDE
+	: 223C 0338
+2242	MINUS TILDE
+2243	ASYMPTOTICALLY EQUAL TO
+2244	NOT ASYMPTOTICALLY EQUAL TO
+	: 2243 0338
+2245	APPROXIMATELY EQUAL TO
+2246	APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247	NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+	: 2245 0338
+2248	ALMOST EQUAL TO
+	= asymptotic to
+2249	NOT ALMOST EQUAL TO
+	: 2248 0338
+224A	ALMOST EQUAL OR EQUAL TO
+224B	TRIPLE TILDE
+224C	ALL EQUAL TO
+	* reversed tilde and lazy S are glyph variants
+224D	EQUIVALENT TO
+224E	GEOMETRICALLY EQUIVALENT TO
+224F	DIFFERENCE BETWEEN
+2250	APPROACHES THE LIMIT
+2251	GEOMETRICALLY EQUAL TO
+2252	APPROXIMATELY EQUAL TO OR THE IMAGE OF
+	= nearly equals
+2253	IMAGE OF OR APPROXIMATELY EQUAL TO
+2254	COLON EQUALS
+2255	EQUALS COLON
+2256	RING IN EQUAL TO
+2257	RING EQUAL TO
+	= approximately equal to
+2258	CORRESPONDS TO
+2259	ESTIMATES
+	= corresponds to
+225A	EQUIANGULAR TO
+225B	STAR EQUALS
+225C	DELTA EQUAL TO
+	= equiangular
+	= equal to by definition
+225D	EQUAL TO BY DEFINITION
+225E	MEASURED BY
+225F	QUESTIONED EQUAL TO
+2260	NOT EQUAL TO
+	x (equals sign - 003D)
+	x (latin letter alveolar click - 01C2)
+	: 003D 0338
+2261	IDENTICAL TO
+2262	NOT IDENTICAL TO
+	: 2261 0338
+2263	STRICTLY EQUIVALENT TO
+2264	LESS-THAN OR EQUAL TO
+2265	GREATER-THAN OR EQUAL TO
+2266	LESS-THAN OVER EQUAL TO
+2267	GREATER-THAN OVER EQUAL TO
+2268	LESS-THAN BUT NOT EQUAL TO
+2269	GREATER-THAN BUT NOT EQUAL TO
+226A	MUCH LESS-THAN
+	x (left-pointing double angle quotation mark - 00AB)
+226B	MUCH GREATER-THAN
+	x (right-pointing double angle quotation mark - 00BB)
+226C	BETWEEN
+	= plaintiff, quantic
+226D	NOT EQUIVALENT TO
+	: 224D 0338
+226E	NOT LESS-THAN
+	: 003C 0338
+226F	NOT GREATER-THAN
+	: 003E 0338
+2270	NEITHER LESS-THAN NOR EQUAL TO
+	: 2264 0338
+2271	NEITHER GREATER-THAN NOR EQUAL TO
+	: 2265 0338
+2272	LESS-THAN OR EQUIVALENT TO
+2273	GREATER-THAN OR EQUIVALENT TO
+2274	NEITHER LESS-THAN NOR EQUIVALENT TO
+	: 2272 0338
+2275	NEITHER GREATER-THAN NOR EQUIVALENT TO
+	: 2273 0338
+2276	LESS-THAN OR GREATER-THAN
+2277	GREATER-THAN OR LESS-THAN
+2278	NEITHER LESS-THAN NOR GREATER-THAN
+	: 2276 0338
+2279	NEITHER GREATER-THAN NOR LESS-THAN
+	: 2277 0338
+227A	PRECEDES
+	= lower rank than
+	x (precedes under relation - 22B0)
+227B	SUCCEEDS
+	= higher rank than
+	x (succeeds under relation - 22B1)
+227C	PRECEDES OR EQUAL TO
+227D	SUCCEEDS OR EQUAL TO
+227E	PRECEDES OR EQUIVALENT TO
+227F	SUCCEEDS OR EQUIVALENT TO
+2280	DOES NOT PRECEDE
+	: 227A 0338
+2281	DOES NOT SUCCEED
+	: 227B 0338
+2282	SUBSET OF
+	= included in set
+2283	SUPERSET OF
+	= includes in set
+2284	NOT A SUBSET OF
+	: 2282 0338
+2285	NOT A SUPERSET OF
+	: 2283 0338
+2286	SUBSET OF OR EQUAL TO
+2287	SUPERSET OF OR EQUAL TO
+2288	NEITHER A SUBSET OF NOR EQUAL TO
+	: 2286 0338
+2289	NEITHER A SUPERSET OF NOR EQUAL TO
+	: 2287 0338
+228A	SUBSET OF WITH NOT EQUAL TO
+228B	SUPERSET OF WITH NOT EQUAL TO
+@		Operators
+228C	MULTISET
+228D	MULTISET MULTIPLICATION
+	x (n-ary union operator with dot - 2A03)
+	x (intersection with dot - 2A40)
+228E	MULTISET UNION
+	= z notation bag addition
+	x (n-ary union operator with plus - 2A04)
+@		Relations
+228F	SQUARE IMAGE OF
+2290	SQUARE ORIGINAL OF
+2291	SQUARE IMAGE OF OR EQUAL TO
+2292	SQUARE ORIGINAL OF OR EQUAL TO
+@		Operators
+2293	SQUARE CAP
+	x (n-ary square intersection operator - 2A05)
+2294	SQUARE CUP
+2295	CIRCLED PLUS
+	= direct sum
+	= vector pointing into page
+	x (earth - 2641)
+	x (n-ary circled plus operator - 2A01)
+2296	CIRCLED MINUS
+	= symmetric difference
+	x (circle with horizontal bar - 29B5)
+2297	CIRCLED TIMES
+	= tensor product
+	= vector pointing into page
+	x (n-ary circled times operator - 2A02)
+2298	CIRCLED DIVISION SLASH
+2299	CIRCLED DOT OPERATOR
+	= direct product
+	= vector pointing out of page
+	x (latin letter bilabial click - 0298)
+	x (sun - 2609)
+	x (n-ary circled dot operator - 2A00)
+229A	CIRCLED RING OPERATOR
+	x (apl functional symbol circle jot - 233E)
+	x (bullseye - 25CE)
+229B	CIRCLED ASTERISK OPERATOR
+	x (apl functional symbol circle star - 235F)
+229C	CIRCLED EQUALS
+229D	CIRCLED DASH
+229E	SQUARED PLUS
+229F	SQUARED MINUS
+22A0	SQUARED TIMES
+	x (ballot box with x - 2612)
+22A1	SQUARED DOT OPERATOR
+22A2	RIGHT TACK
+	= turnstile
+	= proves, implies, yields
+	= reducible
+22A3	LEFT TACK
+	= reverse turnstile
+	= non-theorem, does not yield
+@		Miscellaneous mathematical symbols
+22A4	DOWN TACK
+	= top
+22A5	UP TACK
+	= base, bottom
+	x (perpendicular - 27C2)
+@		Relations
+22A6	ASSERTION
+	= reduces to
+22A7	MODELS
+22A8	TRUE
+	= statement is true, valid
+	= is a tautology
+	= satisfies
+	= results in
+22A9	FORCES
+22AA	TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB	DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC	DOES NOT PROVE
+	: 22A2 0338
+22AD	NOT TRUE
+	: 22A8 0338
+22AE	DOES NOT FORCE
+	: 22A9 0338
+22AF	NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+	: 22AB 0338
+22B0	PRECEDES UNDER RELATION
+	x (precedes - 227A)
+22B1	SUCCEEDS UNDER RELATION
+	x (succeeds - 227B)
+22B2	NORMAL SUBGROUP OF
+	x (white left-pointing pointer - 25C5)
+22B3	CONTAINS AS NORMAL SUBGROUP
+	x (white right-pointing pointer - 25BB)
+22B4	NORMAL SUBGROUP OF OR EQUAL TO
+22B5	CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6	ORIGINAL OF
+22B7	IMAGE OF
+22B8	MULTIMAP
+22B9	HERMITIAN CONJUGATE MATRIX
+@		Operators
+22BA	INTERCALATE
+22BB	XOR
+22BC	NAND
+	x (projective - 2305)
+22BD	NOR
+@		Miscellaneous mathematical symbols
+22BE	RIGHT ANGLE WITH ARC
+22BF	RIGHT TRIANGLE
+@		N-ary operators
+22C0	N-ARY LOGICAL AND
+	* also used to denote the universal quantifier
+	x (logical and - 2227)
+22C1	N-ARY LOGICAL OR
+	* also used to denote the existential quantifier
+	x (logical or - 2228)
+22C2	N-ARY INTERSECTION
+	= z notation generalised intersection
+	x (intersection - 2229)
+22C3	N-ARY UNION
+	= z notation generalised union
+	x (union - 222A)
+@		Operators
+22C4	DIAMOND OPERATOR
+	x (white diamond - 25C7)
+22C5	DOT OPERATOR
+	x (middle dot - 00B7)
+22C6	STAR OPERATOR
+	* APL
+	x (arabic five pointed star - 066D)
+	x (black star - 2605)
+22C7	DIVISION TIMES
+@		Relation
+22C8	BOWTIE
+	x (ocr bow tie - 2445)
+@		Operators
+22C9	LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA	RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB	LEFT SEMIDIRECT PRODUCT
+22CC	RIGHT SEMIDIRECT PRODUCT
+	x (caret insertion point - 2041)
+@		Relation
+22CD	REVERSED TILDE EQUALS
+@		Logical operators
+22CE	CURLY LOGICAL OR
+22CF	CURLY LOGICAL AND
+@		Relations
+22D0	DOUBLE SUBSET
+22D1	DOUBLE SUPERSET
+@		Operators
+22D2	DOUBLE INTERSECTION
+22D3	DOUBLE UNION
+@		Relations
+22D4	PITCHFORK
+	= proper intersection
+22D5	EQUAL AND PARALLEL TO
+	x (viewdata square - 2317)
+22D6	LESS-THAN WITH DOT
+22D7	GREATER-THAN WITH DOT
+22D8	VERY MUCH LESS-THAN
+22D9	VERY MUCH GREATER-THAN
+22DA	LESS-THAN EQUAL TO OR GREATER-THAN
+22DB	GREATER-THAN EQUAL TO OR LESS-THAN
+22DC	EQUAL TO OR LESS-THAN
+22DD	EQUAL TO OR GREATER-THAN
+22DE	EQUAL TO OR PRECEDES
+22DF	EQUAL TO OR SUCCEEDS
+22E0	DOES NOT PRECEDE OR EQUAL
+	: 227C 0338
+22E1	DOES NOT SUCCEED OR EQUAL
+	: 227D 0338
+22E2	NOT SQUARE IMAGE OF OR EQUAL TO
+	: 2291 0338
+22E3	NOT SQUARE ORIGINAL OF OR EQUAL TO
+	: 2292 0338
+22E4	SQUARE IMAGE OF OR NOT EQUAL TO
+22E5	SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6	LESS-THAN BUT NOT EQUIVALENT TO
+22E7	GREATER-THAN BUT NOT EQUIVALENT TO
+22E8	PRECEDES BUT NOT EQUIVALENT TO
+22E9	SUCCEEDS BUT NOT EQUIVALENT TO
+22EA	NOT NORMAL SUBGROUP OF
+	: 22B2 0338
+22EB	DOES NOT CONTAIN AS NORMAL SUBGROUP
+	: 22B3 0338
+22EC	NOT NORMAL SUBGROUP OF OR EQUAL TO
+	: 22B4 0338
+22ED	DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+	: 22B5 0338
+22EE	VERTICAL ELLIPSIS
+	* these four ellipses are used for matrix row/column elision
+	x (tricolon - 205D)
+	x (horizontal ellipsis - 2026)
+	x (presentation form for vertical horizontal ellipsis - FE19)
+22EF	MIDLINE HORIZONTAL ELLIPSIS
+22F0	UP RIGHT DIAGONAL ELLIPSIS
+22F1	DOWN RIGHT DIAGONAL ELLIPSIS
+22F2	ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3	ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4	SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5	ELEMENT OF WITH DOT ABOVE
+22F6	ELEMENT OF WITH OVERBAR
+22F7	SMALL ELEMENT OF WITH OVERBAR
+22F8	ELEMENT OF WITH UNDERBAR
+22F9	ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA	CONTAINS WITH LONG HORIZONTAL STROKE
+22FB	CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC	SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD	CONTAINS WITH OVERBAR
+22FE	SMALL CONTAINS WITH OVERBAR
+22FF	Z NOTATION BAG MEMBERSHIP
+@@	2300	Miscellaneous Technical	23FF
+@		Miscellaneous technical
+2300	DIAMETER SIGN
+	x (empty set - 2205)
+2301	ELECTRIC ARROW
+	* from ISO 2047
+	* symbol for End of Transmission
+2302	HOUSE
+2303	UP ARROWHEAD
+	x (circumflex accent - 005E)
+	x (modifier letter up arrowhead - 02C4)
+	x (caret - 2038)
+	x (logical and - 2227)
+2304	DOWN ARROWHEAD
+	x (modifier letter down arrowhead - 02C5)
+	x (logical or - 2228)
+	x (countersink - 2335)
+2305	PROJECTIVE
+	x (nand - 22BC)
+2306	PERSPECTIVE
+2307	WAVY LINE
+	x (wavy dash - 3030)
+@		Corner brackets
+@+		The ceiling and floor characters are recommended for general-purpose corner brackets, rather than the CJK corner brackets, which are wide quotation marks.
+2308	LEFT CEILING
+	= APL upstile
+	x (left corner bracket - 300C)
+2309	RIGHT CEILING
+	x (combining annuity symbol - 20E7)
+230A	LEFT FLOOR
+	= APL downstile
+230B	RIGHT FLOOR
+	x (right corner bracket - 300D)
+@		Crops
+230C	BOTTOM RIGHT CROP
+	* set of four "crop" corners, arranged facing outward
+230D	BOTTOM LEFT CROP
+230E	TOP RIGHT CROP
+230F	TOP LEFT CROP
+@		Miscellaneous technical
+2310	REVERSED NOT SIGN
+	= beginning of line
+	x (not sign - 00AC)
+2311	SQUARE LOZENGE
+	= Kissen (pillow)
+	* used as a command delimiter in some very old computers
+2312	ARC
+	x (upper half circle - 25E0)
+2313	SEGMENT
+2314	SECTOR
+2315	TELEPHONE RECORDER
+2316	POSITION INDICATOR
+2317	VIEWDATA SQUARE
+	x (equal and parallel to - 22D5)
+2318	PLACE OF INTEREST SIGN
+	= COMMAND KEY
+2319	TURNED NOT SIGN
+	= line marker
+@		GUI icons
+231A	WATCH
+231B	HOURGLASS
+@		Quine corners
+231C	TOP LEFT CORNER
+	* set of four "quine" corners, for quincuncial arrangement
+231D	TOP RIGHT CORNER
+231E	BOTTOM LEFT CORNER
+231F	BOTTOM RIGHT CORNER
+@		Integral pieces
+2320	TOP HALF INTEGRAL
+	x (integral extension - 23AE)
+2321	BOTTOM HALF INTEGRAL
+@		Frown and smile
+2322	FROWN
+	x (character tie - 2040)
+2323	SMILE
+	x (undertie - 203F)
+@		Keyboard symbols
+2324	UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+	= ENTER KEY
+2325	OPTION KEY
+2326	ERASE TO THE RIGHT
+	= DELETE TO THE RIGHT KEY
+2327	X IN A RECTANGLE BOX
+	= CLEAR KEY
+2328	KEYBOARD
+@		Angle brackets
+@+		These are discouraged for mathematical use because of their canonical equivalence to CJK punctuation.
+2329	LEFT-POINTING ANGLE BRACKET
+	x (less-than sign - 003C)
+	x (single left-pointing angle quotation mark - 2039)
+	x (mathematical left angle bracket - 27E8)
+	: 3008 left angle bracket
+232A	RIGHT-POINTING ANGLE BRACKET
+	x (greater-than sign - 003E)
+	x (single right-pointing angle quotation mark - 203A)
+	x (mathematical right angle bracket - 27E9)
+	: 3009 right angle bracket
+@		Keyboard symbol
+232B	ERASE TO THE LEFT
+	= DELETE TO THE LEFT KEY
+@		Chemistry symbol
+232C	BENZENE RING
+@		Drafting symbols
+232D	CYLINDRICITY
+232E	ALL AROUND-PROFILE
+232F	SYMMETRY
+2330	TOTAL RUNOUT
+2331	DIMENSION ORIGIN
+2332	CONICAL TAPER
+2333	SLOPE
+	x (lower left triangle - 25FA)
+2334	COUNTERBORE
+	x (open box - 2423)
+2335	COUNTERSINK
+	x (down arrowhead - 2304)
+@		APL
+2336	APL FUNCTIONAL SYMBOL I-BEAM
+2337	APL FUNCTIONAL SYMBOL SQUISH QUAD
+	x (apl functional symbol quad - 2395)
+	x (white vertical rectangle - 25AF)
+	x (n-ary white vertical bar - 2AFF)
+2338	APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339	APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A	APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B	APL FUNCTIONAL SYMBOL QUAD JOT
+	x (squared small circle - 29C7)
+233C	APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D	APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E	APL FUNCTIONAL SYMBOL CIRCLE JOT
+	x (circled ring operator - 229A)
+	x (circled white bullet - 29BE)
+233F	APL FUNCTIONAL SYMBOL SLASH BAR
+2340	APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341	APL FUNCTIONAL SYMBOL QUAD SLASH
+	x (squared rising diagonal slash - 29C4)
+2342	APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+	x (squared falling diagonal slash - 29C5)
+2343	APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344	APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345	APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346	APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347	APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348	APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349	APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+	x (reversed empty set - 29B0)
+234A	APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR *
+	= up tack underbar
+	* preferred naming for APL tack symbols now follows the London Convention in ISO/IEC 13751:2000 (APL Extended)
+	x (up tack - 22A5)
+234B	APL FUNCTIONAL SYMBOL DELTA STILE
+234C	APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D	APL FUNCTIONAL SYMBOL QUAD DELTA
+234E	APL FUNCTIONAL SYMBOL DOWN TACK JOT *
+	= up tack jot
+	x (up tack - 22A5)
+234F	APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350	APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351	APL FUNCTIONAL SYMBOL UP TACK OVERBAR *
+	= down tack overbar
+	x (down tack - 22A4)
+	x (postal mark - 3012)
+2352	APL FUNCTIONAL SYMBOL DEL STILE
+2353	APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354	APL FUNCTIONAL SYMBOL QUAD DEL
+2355	APL FUNCTIONAL SYMBOL UP TACK JOT *
+	= down tack jot
+	x (down tack - 22A4)
+2356	APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357	APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358	APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359	APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A	APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B	APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C	APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D	APL FUNCTIONAL SYMBOL UP SHOE JOT
+	x (intersection with dot - 2A40)
+235E	APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F	APL FUNCTIONAL SYMBOL CIRCLE STAR
+	x (circled asterisk operator - 229B)
+2360	APL FUNCTIONAL SYMBOL QUAD COLON
+2361	APL FUNCTIONAL SYMBOL UP TACK DIAERESIS *
+	= down tack diaeresis
+	x (down tack - 22A4)
+2362	APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363	APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364	APL FUNCTIONAL SYMBOL JOT DIAERESIS
+	= hoot
+2365	APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+	= holler
+2366	APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367	APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368	APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+	= smirk
+2369	APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A	APL FUNCTIONAL SYMBOL COMMA BAR
+236B	APL FUNCTIONAL SYMBOL DEL TILDE
+236C	APL FUNCTIONAL SYMBOL ZILDE
+236D	APL FUNCTIONAL SYMBOL STILE TILDE
+236E	APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F	APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370	APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371	APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372	APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373	APL FUNCTIONAL SYMBOL IOTA
+2374	APL FUNCTIONAL SYMBOL RHO
+2375	APL FUNCTIONAL SYMBOL OMEGA
+2376	APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377	APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378	APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379	APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A	APL FUNCTIONAL SYMBOL ALPHA
+@		Graphics for control codes
+237B	NOT CHECK MARK
+	* from ISO 2047
+	* symbol for Negative Acknowledge
+@		Miscellaneous technical
+237C	RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+@		Graphics for control codes
+237D	SHOULDERED OPEN BOX
+	* from ISO 9995-7
+	* keyboard symbol for No Break Space
+	x (open box - 2423)
+237E	BELL SYMBOL
+	* from ISO 2047
+237F	VERTICAL LINE WITH MIDDLE DOT
+	* from ISO 2047
+	* symbol for End of Medium
+@		Keyboard symbols from ISO 9995-7
+2380	INSERTION SYMBOL
+2381	CONTINUOUS UNDERLINE SYMBOL
+2382	DISCONTINUOUS UNDERLINE SYMBOL
+2383	EMPHASIS SYMBOL
+2384	COMPOSITION SYMBOL
+2385	WHITE SQUARE WITH CENTRE VERTICAL LINE
+	= center
+2386	ENTER SYMBOL
+2387	ALTERNATIVE KEY SYMBOL
+2388	HELM SYMBOL
+	= control
+	x (wheel of dharma - 2638)
+2389	CIRCLED HORIZONTAL BAR WITH NOTCH (pause)
+	= pause
+238A	CIRCLED TRIANGLE DOWN (break)
+	= interrupt
+238B	BROKEN CIRCLE WITH NORTHWEST ARROW (escape)
+	= escape
+238C	UNDO SYMBOL
+@		Electrotechnical symbols from IR 181
+238D	MONOSTABLE SYMBOL
+238E	HYSTERESIS SYMBOL
+238F	OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390	OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391	PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392	PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393	DIRECT CURRENT SYMBOL FORM TWO
+2394	SOFTWARE-FUNCTION SYMBOL
+@		APL
+2395	APL FUNCTIONAL SYMBOL QUAD
+	x (apl functional symbol squish quad - 2337)
+	x (white vertical rectangle - 25AF)
+@		Keyboard symbols from ISO 9995-7
+2396	DECIMAL SEPARATOR KEY SYMBOL
+2397	PREVIOUS PAGE
+2398	NEXT PAGE
+2399	PRINT SCREEN SYMBOL
+239A	CLEAR SCREEN SYMBOL
+	x (combining enclosing screen - 20E2)
+@		Bracket pieces
+239B	LEFT PARENTHESIS UPPER HOOK
+239C	LEFT PARENTHESIS EXTENSION
+239D	LEFT PARENTHESIS LOWER HOOK
+239E	RIGHT PARENTHESIS UPPER HOOK
+239F	RIGHT PARENTHESIS EXTENSION
+23A0	RIGHT PARENTHESIS LOWER HOOK
+23A1	LEFT SQUARE BRACKET UPPER CORNER
+23A2	LEFT SQUARE BRACKET EXTENSION
+23A3	LEFT SQUARE BRACKET LOWER CORNER
+23A4	RIGHT SQUARE BRACKET UPPER CORNER
+23A5	RIGHT SQUARE BRACKET EXTENSION
+23A6	RIGHT SQUARE BRACKET LOWER CORNER
+23A7	LEFT CURLY BRACKET UPPER HOOK
+23A8	LEFT CURLY BRACKET MIDDLE PIECE
+23A9	LEFT CURLY BRACKET LOWER HOOK
+23AA	CURLY BRACKET EXTENSION
+23AB	RIGHT CURLY BRACKET UPPER HOOK
+23AC	RIGHT CURLY BRACKET MIDDLE PIECE
+23AD	RIGHT CURLY BRACKET LOWER HOOK
+@		Special character extensions
+23AE	INTEGRAL EXTENSION
+	x (top half integral - 2320)
+	x (bottom half integral - 2321)
+23AF	HORIZONTAL LINE EXTENSION
+	* used for extension of arrows
+	x (vertical line extension - 23D0)
+@		Bracket pieces
+23B0	UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+	= left moustache
+23B1	UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+	= right moustache
+@		Summation sign parts
+23B2	SUMMATION TOP
+23B3	SUMMATION BOTTOM
+@		Vertical brackets
+23B4	TOP SQUARE BRACKET
+	x (presentation form for vertical left square bracket - FE47)
+23B5	BOTTOM SQUARE BRACKET
+	x (presentation form for vertical right square bracket - FE48)
+23B6	BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+@		Terminal graphic characters
+23B7	RADICAL SYMBOL BOTTOM
+23B8	LEFT VERTICAL BOX LINE
+23B9	RIGHT VERTICAL BOX LINE
+@		Scan lines for terminal graphics
+@+		The scan line numbers here refer to old, low-resolution technology for terminals, with only 9 scan lines per fixed-size character glyph. Even-numbered scan lines are unified with box-drawing graphics.
+23BA	HORIZONTAL SCAN LINE-1
+23BB	HORIZONTAL SCAN LINE-3
+23BC	HORIZONTAL SCAN LINE-7
+23BD	HORIZONTAL SCAN LINE-9
+@		Dentistry notation symbols
+23BE	DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+	x (left ceiling - 2308)
+23BF	DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+	x (left floor - 230A)
+23C0	DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1	DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2	DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3	DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4	DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5	DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6	DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7	DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8	DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9	DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+	x (down tack - 22A4)
+	x (box drawings light down and horizontal - 252C)
+23CA	DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+	x (up tack - 22A5)
+	x (box drawings light up and horizontal - 2534)
+23CB	DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+	x (right ceiling - 2309)
+23CC	DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+	x (right floor - 230B)
+@		Miscellaneous technical symbol
+23CD	SQUARE FOOT
+@		Keyboard and UI symbols
+23CE	RETURN SYMBOL
+	* may be shown with either hollow or filled glyph
+	x (downwards arrow with corner leftwards - 21B5)
+23CF	EJECT SYMBOL
+	* UI symbol to eject media
+@		Special character extension
+23D0	VERTICAL LINE EXTENSION
+	* used for extension of arrows
+	x (horizontal line extension - 23AF)
+@		Metrical symbols
+23D1	METRICAL BREVE
+23D2	METRICAL LONG OVER SHORT
+23D3	METRICAL SHORT OVER LONG
+23D4	METRICAL LONG OVER TWO SHORTS
+23D5	METRICAL TWO SHORTS OVER LONG
+23D6	METRICAL TWO SHORTS JOINED
+23D7	METRICAL TRISEME
+	x (combining greek musical triseme - 1D242)
+23D8	METRICAL TETRASEME
+	x (combining greek musical tetraseme - 1D243)
+23D9	METRICAL PENTASEME
+	x (combining greek musical pentaseme - 1D244)
+@	Electrotechnical symbols
+23DA	EARTH GROUND
+23DB	FUSE
+@@	2400	Control Pictures	243F
+@+		The diagonal lettering glyphs are only exemplary; alternate representations may be, and often are used in the visible display of control codes.
+@		Graphic pictures for control codes
+2400	SYMBOL FOR NULL
+2401	SYMBOL FOR START OF HEADING
+2402	SYMBOL FOR START OF TEXT
+2403	SYMBOL FOR END OF TEXT
+2404	SYMBOL FOR END OF TRANSMISSION
+2405	SYMBOL FOR ENQUIRY
+2406	SYMBOL FOR ACKNOWLEDGE
+2407	SYMBOL FOR BELL
+2408	SYMBOL FOR BACKSPACE
+2409	SYMBOL FOR HORIZONTAL TABULATION
+240A	SYMBOL FOR LINE FEED
+240B	SYMBOL FOR VERTICAL TABULATION
+240C	SYMBOL FOR FORM FEED
+240D	SYMBOL FOR CARRIAGE RETURN
+240E	SYMBOL FOR SHIFT OUT
+240F	SYMBOL FOR SHIFT IN
+2410	SYMBOL FOR DATA LINK ESCAPE
+2411	SYMBOL FOR DEVICE CONTROL ONE
+2412	SYMBOL FOR DEVICE CONTROL TWO
+2413	SYMBOL FOR DEVICE CONTROL THREE
+2414	SYMBOL FOR DEVICE CONTROL FOUR
+2415	SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416	SYMBOL FOR SYNCHRONOUS IDLE
+2417	SYMBOL FOR END OF TRANSMISSION BLOCK
+2418	SYMBOL FOR CANCEL
+2419	SYMBOL FOR END OF MEDIUM
+241A	SYMBOL FOR SUBSTITUTE
+241B	SYMBOL FOR ESCAPE
+241C	SYMBOL FOR FILE SEPARATOR
+241D	SYMBOL FOR GROUP SEPARATOR
+241E	SYMBOL FOR RECORD SEPARATOR
+241F	SYMBOL FOR UNIT SEPARATOR
+2420	SYMBOL FOR SPACE
+2421	SYMBOL FOR DELETE
+@		Specific symbols for space
+2422	BLANK SYMBOL
+	* graphic for space
+	x (latin small letter b with stroke - 0180)
+2423	OPEN BOX
+	* graphic for space
+	x (counterbore - 2334)
+@		Graphic picture for control code
+2424	SYMBOL FOR NEWLINE
+@		Keyboard symbol
+2425	SYMBOL FOR DELETE FORM TWO
+	* from ISO 9995-7
+	* keyboard symbol for undoable delete
+@		Specific symbol for control code
+2426	SYMBOL FOR SUBSTITUTE FORM TWO
+	* from ISO 2047
+	x (arabic question mark - 061F)
+@@	2440	Optical Character Recognition	245F
+@		OCR
+2440	OCR HOOK
+2441	OCR CHAIR
+2442	OCR FORK
+2443	OCR INVERTED FORK
+2444	OCR BELT BUCKLE
+2445	OCR BOW TIE
+	x (bowtie - 22C8)
+2446	OCR BRANCH BANK IDENTIFICATION
+	= transit
+2447	OCR AMOUNT OF CHECK
+2448	OCR DASH
+	= on us
+2449	OCR CUSTOMER ACCOUNT NUMBER
+	= dash
+244A	OCR DOUBLE BACKSLASH
+@@	2460	Enclosed Alphanumerics	24FF
+@		Circled numbers
+2460	CIRCLED DIGIT ONE
+	# <circle> 0031
+2461	CIRCLED DIGIT TWO
+	# <circle> 0032
+2462	CIRCLED DIGIT THREE
+	# <circle> 0033
+2463	CIRCLED DIGIT FOUR
+	# <circle> 0034
+2464	CIRCLED DIGIT FIVE
+	# <circle> 0035
+2465	CIRCLED DIGIT SIX
+	# <circle> 0036
+2466	CIRCLED DIGIT SEVEN
+	# <circle> 0037
+2467	CIRCLED DIGIT EIGHT
+	# <circle> 0038
+2468	CIRCLED DIGIT NINE
+	# <circle> 0039
+2469	CIRCLED NUMBER TEN
+	# <circle> 0031 0030
+246A	CIRCLED NUMBER ELEVEN
+	# <circle> 0031 0031
+246B	CIRCLED NUMBER TWELVE
+	# <circle> 0031 0032
+246C	CIRCLED NUMBER THIRTEEN
+	# <circle> 0031 0033
+246D	CIRCLED NUMBER FOURTEEN
+	# <circle> 0031 0034
+246E	CIRCLED NUMBER FIFTEEN
+	# <circle> 0031 0035
+246F	CIRCLED NUMBER SIXTEEN
+	# <circle> 0031 0036
+2470	CIRCLED NUMBER SEVENTEEN
+	# <circle> 0031 0037
+2471	CIRCLED NUMBER EIGHTEEN
+	# <circle> 0031 0038
+2472	CIRCLED NUMBER NINETEEN
+	# <circle> 0031 0039
+2473	CIRCLED NUMBER TWENTY
+	# <circle> 0032 0030
+@		Parenthesized numbers
+2474	PARENTHESIZED DIGIT ONE
+	# 0028 0031 0029
+2475	PARENTHESIZED DIGIT TWO
+	# 0028 0032 0029
+2476	PARENTHESIZED DIGIT THREE
+	# 0028 0033 0029
+2477	PARENTHESIZED DIGIT FOUR
+	# 0028 0034 0029
+2478	PARENTHESIZED DIGIT FIVE
+	# 0028 0035 0029
+2479	PARENTHESIZED DIGIT SIX
+	# 0028 0036 0029
+247A	PARENTHESIZED DIGIT SEVEN
+	# 0028 0037 0029
+247B	PARENTHESIZED DIGIT EIGHT
+	# 0028 0038 0029
+247C	PARENTHESIZED DIGIT NINE
+	# 0028 0039 0029
+247D	PARENTHESIZED NUMBER TEN
+	# 0028 0031 0030 0029
+247E	PARENTHESIZED NUMBER ELEVEN
+	# 0028 0031 0031 0029
+247F	PARENTHESIZED NUMBER TWELVE
+	# 0028 0031 0032 0029
+2480	PARENTHESIZED NUMBER THIRTEEN
+	# 0028 0031 0033 0029
+2481	PARENTHESIZED NUMBER FOURTEEN
+	# 0028 0031 0034 0029
+2482	PARENTHESIZED NUMBER FIFTEEN
+	# 0028 0031 0035 0029
+2483	PARENTHESIZED NUMBER SIXTEEN
+	# 0028 0031 0036 0029
+2484	PARENTHESIZED NUMBER SEVENTEEN
+	# 0028 0031 0037 0029
+2485	PARENTHESIZED NUMBER EIGHTEEN
+	# 0028 0031 0038 0029
+2486	PARENTHESIZED NUMBER NINETEEN
+	# 0028 0031 0039 0029
+2487	PARENTHESIZED NUMBER TWENTY
+	# 0028 0032 0030 0029
+@		Numbers period
+2488	DIGIT ONE FULL STOP
+	# 0031 002E
+2489	DIGIT TWO FULL STOP
+	# 0032 002E
+248A	DIGIT THREE FULL STOP
+	# 0033 002E
+248B	DIGIT FOUR FULL STOP
+	# 0034 002E
+248C	DIGIT FIVE FULL STOP
+	# 0035 002E
+248D	DIGIT SIX FULL STOP
+	# 0036 002E
+248E	DIGIT SEVEN FULL STOP
+	# 0037 002E
+248F	DIGIT EIGHT FULL STOP
+	# 0038 002E
+2490	DIGIT NINE FULL STOP
+	# 0039 002E
+2491	NUMBER TEN FULL STOP
+	# 0031 0030 002E
+2492	NUMBER ELEVEN FULL STOP
+	# 0031 0031 002E
+2493	NUMBER TWELVE FULL STOP
+	# 0031 0032 002E
+2494	NUMBER THIRTEEN FULL STOP
+	# 0031 0033 002E
+2495	NUMBER FOURTEEN FULL STOP
+	# 0031 0034 002E
+2496	NUMBER FIFTEEN FULL STOP
+	# 0031 0035 002E
+2497	NUMBER SIXTEEN FULL STOP
+	# 0031 0036 002E
+2498	NUMBER SEVENTEEN FULL STOP
+	# 0031 0037 002E
+2499	NUMBER EIGHTEEN FULL STOP
+	# 0031 0038 002E
+249A	NUMBER NINETEEN FULL STOP
+	# 0031 0039 002E
+249B	NUMBER TWENTY FULL STOP
+	# 0032 0030 002E
+@		Parenthesized Latin letters
+249C	PARENTHESIZED LATIN SMALL LETTER A
+	# 0028 0061 0029
+249D	PARENTHESIZED LATIN SMALL LETTER B
+	# 0028 0062 0029
+249E	PARENTHESIZED LATIN SMALL LETTER C
+	# 0028 0063 0029
+249F	PARENTHESIZED LATIN SMALL LETTER D
+	# 0028 0064 0029
+24A0	PARENTHESIZED LATIN SMALL LETTER E
+	# 0028 0065 0029
+24A1	PARENTHESIZED LATIN SMALL LETTER F
+	# 0028 0066 0029
+24A2	PARENTHESIZED LATIN SMALL LETTER G
+	# 0028 0067 0029
+24A3	PARENTHESIZED LATIN SMALL LETTER H
+	# 0028 0068 0029
+24A4	PARENTHESIZED LATIN SMALL LETTER I
+	# 0028 0069 0029
+24A5	PARENTHESIZED LATIN SMALL LETTER J
+	# 0028 006A 0029
+24A6	PARENTHESIZED LATIN SMALL LETTER K
+	# 0028 006B 0029
+24A7	PARENTHESIZED LATIN SMALL LETTER L
+	# 0028 006C 0029
+24A8	PARENTHESIZED LATIN SMALL LETTER M
+	# 0028 006D 0029
+24A9	PARENTHESIZED LATIN SMALL LETTER N
+	# 0028 006E 0029
+24AA	PARENTHESIZED LATIN SMALL LETTER O
+	# 0028 006F 0029
+24AB	PARENTHESIZED LATIN SMALL LETTER P
+	# 0028 0070 0029
+24AC	PARENTHESIZED LATIN SMALL LETTER Q
+	# 0028 0071 0029
+24AD	PARENTHESIZED LATIN SMALL LETTER R
+	# 0028 0072 0029
+24AE	PARENTHESIZED LATIN SMALL LETTER S
+	# 0028 0073 0029
+24AF	PARENTHESIZED LATIN SMALL LETTER T
+	# 0028 0074 0029
+24B0	PARENTHESIZED LATIN SMALL LETTER U
+	# 0028 0075 0029
+24B1	PARENTHESIZED LATIN SMALL LETTER V
+	# 0028 0076 0029
+24B2	PARENTHESIZED LATIN SMALL LETTER W
+	# 0028 0077 0029
+24B3	PARENTHESIZED LATIN SMALL LETTER X
+	# 0028 0078 0029
+24B4	PARENTHESIZED LATIN SMALL LETTER Y
+	# 0028 0079 0029
+24B5	PARENTHESIZED LATIN SMALL LETTER Z
+	# 0028 007A 0029
+@		Circled Latin letters
+24B6	CIRCLED LATIN CAPITAL LETTER A
+	# <circle> 0041
+24B7	CIRCLED LATIN CAPITAL LETTER B
+	# <circle> 0042
+24B8	CIRCLED LATIN CAPITAL LETTER C
+	# <circle> 0043
+24B9	CIRCLED LATIN CAPITAL LETTER D
+	# <circle> 0044
+24BA	CIRCLED LATIN CAPITAL LETTER E
+	# <circle> 0045
+24BB	CIRCLED LATIN CAPITAL LETTER F
+	# <circle> 0046
+24BC	CIRCLED LATIN CAPITAL LETTER G
+	# <circle> 0047
+24BD	CIRCLED LATIN CAPITAL LETTER H
+	# <circle> 0048
+24BE	CIRCLED LATIN CAPITAL LETTER I
+	# <circle> 0049
+24BF	CIRCLED LATIN CAPITAL LETTER J
+	# <circle> 004A
+24C0	CIRCLED LATIN CAPITAL LETTER K
+	# <circle> 004B
+24C1	CIRCLED LATIN CAPITAL LETTER L
+	# <circle> 004C
+24C2	CIRCLED LATIN CAPITAL LETTER M
+	# <circle> 004D
+24C3	CIRCLED LATIN CAPITAL LETTER N
+	# <circle> 004E
+24C4	CIRCLED LATIN CAPITAL LETTER O
+	# <circle> 004F
+24C5	CIRCLED LATIN CAPITAL LETTER P
+	# <circle> 0050
+24C6	CIRCLED LATIN CAPITAL LETTER Q
+	# <circle> 0051
+24C7	CIRCLED LATIN CAPITAL LETTER R
+	# <circle> 0052
+24C8	CIRCLED LATIN CAPITAL LETTER S
+	# <circle> 0053
+24C9	CIRCLED LATIN CAPITAL LETTER T
+	# <circle> 0054
+24CA	CIRCLED LATIN CAPITAL LETTER U
+	# <circle> 0055
+24CB	CIRCLED LATIN CAPITAL LETTER V
+	# <circle> 0056
+24CC	CIRCLED LATIN CAPITAL LETTER W
+	# <circle> 0057
+24CD	CIRCLED LATIN CAPITAL LETTER X
+	# <circle> 0058
+24CE	CIRCLED LATIN CAPITAL LETTER Y
+	# <circle> 0059
+24CF	CIRCLED LATIN CAPITAL LETTER Z
+	# <circle> 005A
+24D0	CIRCLED LATIN SMALL LETTER A
+	# <circle> 0061
+24D1	CIRCLED LATIN SMALL LETTER B
+	# <circle> 0062
+24D2	CIRCLED LATIN SMALL LETTER C
+	# <circle> 0063
+24D3	CIRCLED LATIN SMALL LETTER D
+	# <circle> 0064
+24D4	CIRCLED LATIN SMALL LETTER E
+	# <circle> 0065
+24D5	CIRCLED LATIN SMALL LETTER F
+	# <circle> 0066
+24D6	CIRCLED LATIN SMALL LETTER G
+	# <circle> 0067
+24D7	CIRCLED LATIN SMALL LETTER H
+	# <circle> 0068
+24D8	CIRCLED LATIN SMALL LETTER I
+	# <circle> 0069
+24D9	CIRCLED LATIN SMALL LETTER J
+	# <circle> 006A
+24DA	CIRCLED LATIN SMALL LETTER K
+	# <circle> 006B
+24DB	CIRCLED LATIN SMALL LETTER L
+	# <circle> 006C
+24DC	CIRCLED LATIN SMALL LETTER M
+	# <circle> 006D
+24DD	CIRCLED LATIN SMALL LETTER N
+	# <circle> 006E
+24DE	CIRCLED LATIN SMALL LETTER O
+	# <circle> 006F
+24DF	CIRCLED LATIN SMALL LETTER P
+	# <circle> 0070
+24E0	CIRCLED LATIN SMALL LETTER Q
+	# <circle> 0071
+24E1	CIRCLED LATIN SMALL LETTER R
+	# <circle> 0072
+24E2	CIRCLED LATIN SMALL LETTER S
+	# <circle> 0073
+24E3	CIRCLED LATIN SMALL LETTER T
+	# <circle> 0074
+24E4	CIRCLED LATIN SMALL LETTER U
+	# <circle> 0075
+24E5	CIRCLED LATIN SMALL LETTER V
+	# <circle> 0076
+24E6	CIRCLED LATIN SMALL LETTER W
+	# <circle> 0077
+24E7	CIRCLED LATIN SMALL LETTER X
+	# <circle> 0078
+24E8	CIRCLED LATIN SMALL LETTER Y
+	# <circle> 0079
+24E9	CIRCLED LATIN SMALL LETTER Z
+	# <circle> 007A
+@		Additional circled number
+24EA	CIRCLED DIGIT ZERO
+	# <circle> 0030
+@		White on black circled numbers
+24EB	NEGATIVE CIRCLED NUMBER ELEVEN
+24EC	NEGATIVE CIRCLED NUMBER TWELVE
+24ED	NEGATIVE CIRCLED NUMBER THIRTEEN
+24EE	NEGATIVE CIRCLED NUMBER FOURTEEN
+24EF	NEGATIVE CIRCLED NUMBER FIFTEEN
+24F0	NEGATIVE CIRCLED NUMBER SIXTEEN
+24F1	NEGATIVE CIRCLED NUMBER SEVENTEEN
+24F2	NEGATIVE CIRCLED NUMBER EIGHTEEN
+24F3	NEGATIVE CIRCLED NUMBER NINETEEN
+24F4	NEGATIVE CIRCLED NUMBER TWENTY
+@		Double circled numbers
+24F5	DOUBLE CIRCLED DIGIT ONE
+24F6	DOUBLE CIRCLED DIGIT TWO
+24F7	DOUBLE CIRCLED DIGIT THREE
+24F8	DOUBLE CIRCLED DIGIT FOUR
+24F9	DOUBLE CIRCLED DIGIT FIVE
+24FA	DOUBLE CIRCLED DIGIT SIX
+24FB	DOUBLE CIRCLED DIGIT SEVEN
+24FC	DOUBLE CIRCLED DIGIT EIGHT
+24FD	DOUBLE CIRCLED DIGIT NINE
+24FE	DOUBLE CIRCLED NUMBER TEN
+@		Additional white on black circled number
+24FF	NEGATIVE CIRCLED DIGIT ZERO
+	x (dingbat negative circled digit one - 2776)
+@@	2500	Box Drawing	257F
+@		Form and chart components
+2500	BOX DRAWINGS LIGHT HORIZONTAL
+	= Videotex Mosaic DG 15
+2501	BOX DRAWINGS HEAVY HORIZONTAL
+2502	BOX DRAWINGS LIGHT VERTICAL
+	= Videotex Mosaic DG 14
+2503	BOX DRAWINGS HEAVY VERTICAL
+2504	BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505	BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506	BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507	BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508	BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509	BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A	BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B	BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C	BOX DRAWINGS LIGHT DOWN AND RIGHT
+	= Videotex Mosaic DG 16
+250D	BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E	BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F	BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510	BOX DRAWINGS LIGHT DOWN AND LEFT
+	= Videotex Mosaic DG 17
+2511	BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512	BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513	BOX DRAWINGS HEAVY DOWN AND LEFT
+2514	BOX DRAWINGS LIGHT UP AND RIGHT
+	= Videotex Mosaic DG 18
+2515	BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516	BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517	BOX DRAWINGS HEAVY UP AND RIGHT
+2518	BOX DRAWINGS LIGHT UP AND LEFT
+	= Videotex Mosaic DG 19
+2519	BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A	BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B	BOX DRAWINGS HEAVY UP AND LEFT
+251C	BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+	= Videotex Mosaic DG 20
+251D	BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+	= Videotex Mosaic DG 03
+251E	BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F	BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520	BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521	BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522	BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523	BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524	BOX DRAWINGS LIGHT VERTICAL AND LEFT
+	= Videotex Mosaic DG 21
+2525	BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+	= Videotex Mosaic DG 04
+2526	BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527	BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528	BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529	BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A	BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B	BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C	BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+	= Videotex Mosaic DG 22
+252D	BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E	BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F	BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+	= Videotex Mosaic DG 02
+2530	BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531	BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532	BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533	BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534	BOX DRAWINGS LIGHT UP AND HORIZONTAL
+	= Videotex Mosaic DG 23
+2535	BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536	BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537	BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+	= Videotex Mosaic DG 01
+2538	BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539	BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A	BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B	BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C	BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+	= Videotex Mosaic DG 24
+253D	BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E	BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F	BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+	= Videotex Mosaic DG 13
+2540	BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541	BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542	BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543	BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544	BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545	BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546	BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547	BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548	BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549	BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A	BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B	BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C	BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D	BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E	BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F	BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550	BOX DRAWINGS DOUBLE HORIZONTAL
+2551	BOX DRAWINGS DOUBLE VERTICAL
+2552	BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553	BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554	BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555	BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556	BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557	BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558	BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559	BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A	BOX DRAWINGS DOUBLE UP AND RIGHT
+255B	BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C	BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D	BOX DRAWINGS DOUBLE UP AND LEFT
+255E	BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F	BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560	BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561	BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562	BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563	BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564	BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565	BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566	BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567	BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568	BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569	BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A	BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B	BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C	BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D	BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E	BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F	BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570	BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571	BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572	BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573	BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574	BOX DRAWINGS LIGHT LEFT
+2575	BOX DRAWINGS LIGHT UP
+2576	BOX DRAWINGS LIGHT RIGHT
+2577	BOX DRAWINGS LIGHT DOWN
+2578	BOX DRAWINGS HEAVY LEFT
+2579	BOX DRAWINGS HEAVY UP
+257A	BOX DRAWINGS HEAVY RIGHT
+257B	BOX DRAWINGS HEAVY DOWN
+257C	BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D	BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E	BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F	BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+@@	2580	Block Elements	259F
+@		Block elements
+2580	UPPER HALF BLOCK
+2581	LOWER ONE EIGHTH BLOCK
+2582	LOWER ONE QUARTER BLOCK
+2583	LOWER THREE EIGHTHS BLOCK
+2584	LOWER HALF BLOCK
+2585	LOWER FIVE EIGHTHS BLOCK
+2586	LOWER THREE QUARTERS BLOCK
+2587	LOWER SEVEN EIGHTHS BLOCK
+2588	FULL BLOCK
+	= solid
+	x (black square - 25A0)
+2589	LEFT SEVEN EIGHTHS BLOCK
+258A	LEFT THREE QUARTERS BLOCK
+258B	LEFT FIVE EIGHTHS BLOCK
+258C	LEFT HALF BLOCK
+258D	LEFT THREE EIGHTHS BLOCK
+258E	LEFT ONE QUARTER BLOCK
+258F	LEFT ONE EIGHTH BLOCK
+2590	RIGHT HALF BLOCK
+@		Shade characters
+2591	LIGHT SHADE
+	* 25%
+2592	MEDIUM SHADE
+	* 50%
+2593	DARK SHADE
+	* 75%
+@		Block elements
+2594	UPPER ONE EIGHTH BLOCK
+2595	RIGHT ONE EIGHTH BLOCK
+@		Terminal graphic characters
+2596	QUADRANT LOWER LEFT
+2597	QUADRANT LOWER RIGHT
+2598	QUADRANT UPPER LEFT
+2599	QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A	QUADRANT UPPER LEFT AND LOWER RIGHT
+259B	QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C	QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D	QUADRANT UPPER RIGHT
+259E	QUADRANT UPPER RIGHT AND LOWER LEFT
+259F	QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+@@	25A0	Geometric Shapes	25FF
+@		Geometric shapes
+25A0	BLACK SQUARE
+	= moding mark (in ideographic text)
+	x (full block - 2588)
+25A1	WHITE SQUARE
+	= quadrature
+	* may be used to represent a missing ideograph
+	x (combining enclosing square - 20DE)
+	x (ballot box - 2610)
+	x (geta mark - 3013)
+25A2	WHITE SQUARE WITH ROUNDED CORNERS
+25A3	WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4	SQUARE WITH HORIZONTAL FILL
+25A5	SQUARE WITH VERTICAL FILL
+25A6	SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7	SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8	SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9	SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA	BLACK SMALL SQUARE
+25AB	WHITE SMALL SQUARE
+25AC	BLACK RECTANGLE
+25AD	WHITE RECTANGLE
+25AE	BLACK VERTICAL RECTANGLE
+	= histogram marker
+	x (end of proof - 220E)
+25AF	WHITE VERTICAL RECTANGLE
+	x (apl functional symbol squish quad - 2337)
+	x (apl functional symbol quad - 2395)
+25B0	BLACK PARALLELOGRAM
+25B1	WHITE PARALLELOGRAM
+25B2	BLACK UP-POINTING TRIANGLE
+25B3	WHITE UP-POINTING TRIANGLE
+	= trine
+	x (combining enclosing upward pointing triangle - 20E4)
+	x (increment - 2206)
+25B4	BLACK UP-POINTING SMALL TRIANGLE
+25B5	WHITE UP-POINTING SMALL TRIANGLE
+25B6	BLACK RIGHT-POINTING TRIANGLE
+25B7	WHITE RIGHT-POINTING TRIANGLE
+	= z notation range restriction
+25B8	BLACK RIGHT-POINTING SMALL TRIANGLE
+	x (triangular bullet - 2023)
+25B9	WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA	BLACK RIGHT-POINTING POINTER
+25BB	WHITE RIGHT-POINTING POINTER
+	= forward arrow indicator
+	x (contains as normal subgroup - 22B3)
+25BC	BLACK DOWN-POINTING TRIANGLE
+25BD	WHITE DOWN-POINTING TRIANGLE
+	= Hamilton operator
+	x (nabla - 2207)
+25BE	BLACK DOWN-POINTING SMALL TRIANGLE
+25BF	WHITE DOWN-POINTING SMALL TRIANGLE
+25C0	BLACK LEFT-POINTING TRIANGLE
+25C1	WHITE LEFT-POINTING TRIANGLE
+	= z notation domain restriction
+25C2	BLACK LEFT-POINTING SMALL TRIANGLE
+25C3	WHITE LEFT-POINTING SMALL TRIANGLE
+25C4	BLACK LEFT-POINTING POINTER
+25C5	WHITE LEFT-POINTING POINTER
+	= backward arrow indicator
+	x (normal subgroup of - 22B2)
+25C6	BLACK DIAMOND
+	x (black diamond suit - 2666)
+25C7	WHITE DIAMOND
+	x (combining enclosing diamond - 20DF)
+	x (diamond operator - 22C4)
+	x (white diamond suit - 2662)
+25C8	WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9	FISHEYE
+	= tainome (Japanese, a kind of bullet)
+25CA	LOZENGE
+	x (white diamond suit - 2662)
+25CB	WHITE CIRCLE
+	x (combining enclosing circle - 20DD)
+	x (large circle - 25EF)
+	x (ideographic number zero - 3007)
+25CC	DOTTED CIRCLE
+	* note that the reference glyph for this character is intentionally larger than the dotted circle glyph used to indicate combining characters in this standard; see, for example, 0300
+25CD	CIRCLE WITH VERTICAL FILL
+25CE	BULLSEYE
+	x (circled ring operator - 229A)
+25CF	BLACK CIRCLE
+25D0	CIRCLE WITH LEFT HALF BLACK
+25D1	CIRCLE WITH RIGHT HALF BLACK
+25D2	CIRCLE WITH LOWER HALF BLACK
+25D3	CIRCLE WITH UPPER HALF BLACK
+25D4	CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5	CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6	LEFT HALF BLACK CIRCLE
+25D7	RIGHT HALF BLACK CIRCLE
+25D8	INVERSE BULLET
+	x (bullet - 2022)
+	x (white bullet - 25E6)
+25D9	INVERSE WHITE CIRCLE
+25DA	UPPER HALF INVERSE WHITE CIRCLE
+25DB	LOWER HALF INVERSE WHITE CIRCLE
+25DC	UPPER LEFT QUADRANT CIRCULAR ARC
+25DD	UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE	LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF	LOWER LEFT QUADRANT CIRCULAR ARC
+25E0	UPPER HALF CIRCLE
+	x (arc - 2312)
+25E1	LOWER HALF CIRCLE
+25E2	BLACK LOWER RIGHT TRIANGLE
+25E3	BLACK LOWER LEFT TRIANGLE
+25E4	BLACK UPPER LEFT TRIANGLE
+25E5	BLACK UPPER RIGHT TRIANGLE
+25E6	WHITE BULLET
+	x (bullet - 2022)
+	x (ring operator - 2218)
+	x (inverse bullet - 25D8)
+25E7	SQUARE WITH LEFT HALF BLACK
+	x (square with top half black - 2B12)
+25E8	SQUARE WITH RIGHT HALF BLACK
+25E9	SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA	SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB	WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC	WHITE UP-POINTING TRIANGLE WITH DOT
+25ED	UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE	UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF	LARGE CIRCLE
+	x (combining enclosing circle - 20DD)
+	x (white circle - 25CB)
+	x (ideographic number zero - 3007)
+@		Control code graphics
+25F0	WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1	WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2	WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3	WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4	WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5	WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6	WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7	WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+@		Geometric shapes
+25F8	UPPER LEFT TRIANGLE
+25F9	UPPER RIGHT TRIANGLE
+25FA	LOWER LEFT TRIANGLE
+	x (right triangle - 22BF)
+25FB	WHITE MEDIUM SQUARE
+	= always (modal operator)
+	x (white square - 25A1)
+25FC	BLACK MEDIUM SQUARE
+	x (black square - 25A0)
+25FD	WHITE MEDIUM SMALL SQUARE
+	x (white small square - 25AB)
+25FE	BLACK MEDIUM SMALL SQUARE
+	x (black small square - 25AA)
+25FF	LOWER RIGHT TRIANGLE
+	x (right triangle - 22BF)
+@@	2600	Miscellaneous Symbols	26FF
+@		Weather and astrological symbols
+2600	BLACK SUN WITH RAYS
+	= clear weather
+	x (sun - 2609)
+2601	CLOUD
+	= cloudy weather
+2602	UMBRELLA
+	= rainy weather
+2603	SNOWMAN
+	= snowy weather
+2604	COMET
+2605	BLACK STAR
+	x (star operator - 22C6)
+2606	WHITE STAR
+	x (stress outlined white star - 2729)
+2607	LIGHTNING
+2608	THUNDERSTORM
+2609	SUN
+	x (circled dot operator - 2299)
+	x (black sun with rays - 2600)
+	x (white sun with rays - 263C)
+260A	ASCENDING NODE
+260B	DESCENDING NODE
+260C	CONJUNCTION
+260D	OPPOSITION
+@		Miscellaneous symbols
+260E	BLACK TELEPHONE
+260F	WHITE TELEPHONE
+2610	BALLOT BOX
+	x (white square - 25A1)
+2611	BALLOT BOX WITH CHECK
+2612	BALLOT BOX WITH X
+	x (squared times - 22A0)
+2613	SALTIRE
+	= St. Andrew's Cross
+	x (ballot x - 2717)
+@		Weather symbol
+2614	UMBRELLA WITH RAIN DROPS
+	= showery weather
+@		Miscellaneous symbol
+2615	HOT BEVERAGE
+	= tea or coffee, depending on locale
+	* can be used to indicate a wait
+	x (watch - 231A)
+	x (hourglass - 231B)
+@		Japanese chess symbols
+2616	WHITE SHOGI PIECE
+2617	BLACK SHOGI PIECE
+@		Miscellaneous symbols
+2618	SHAMROCK
+2619	REVERSED ROTATED FLORAL HEART BULLET
+	* a binding signature mark
+	x (rotated floral heart bullet - 2767)
+@		Pointing hand symbols
+261A	BLACK LEFT POINTING INDEX
+261B	BLACK RIGHT POINTING INDEX
+261C	WHITE LEFT POINTING INDEX
+261D	WHITE UP POINTING INDEX
+261E	WHITE RIGHT POINTING INDEX
+	= fist (typographic term)
+261F	WHITE DOWN POINTING INDEX
+@		Warning signs
+2620	SKULL AND CROSSBONES
+	= poison
+2621	CAUTION SIGN
+2622	RADIOACTIVE SIGN
+2623	BIOHAZARD SIGN
+@		Medical and healing symbols
+2624	CADUCEUS
+	x (staff of aesculapius - 2695)
+2625	ANKH
+@		Religious and political symbols
+2626	ORTHODOX CROSS
+2627	CHI RHO
+	= Constantine's cross, Christogram
+	x (coptic symbol khi ro - 2CE9)
+2628	CROSS OF LORRAINE
+2629	CROSS OF JERUSALEM
+262A	STAR AND CRESCENT
+262B	FARSI SYMBOL
+	= SYMBOL OF IRAN
+262C	ADI SHAKTI
+	= Gurmukhi khanda
+262D	HAMMER AND SICKLE
+262E	PEACE SYMBOL
+262F	YIN YANG
+	x (tibetan symbol nor bu nyis -khyil - 0FCA)
+@		Yijing trigram symbols
+2630	TRIGRAM FOR HEAVEN
+	= qian2
+2631	TRIGRAM FOR LAKE
+	= dui4
+2632	TRIGRAM FOR FIRE
+	= li2
+2633	TRIGRAM FOR THUNDER
+	= zhen4
+2634	TRIGRAM FOR WIND
+	= xun4
+2635	TRIGRAM FOR WATER
+	= kan3
+2636	TRIGRAM FOR MOUNTAIN
+	= gen4
+2637	TRIGRAM FOR EARTH
+	= kun1
+@		Miscellaneous symbols
+2638	WHEEL OF DHARMA
+	x (helm symbol - 2388)
+2639	WHITE FROWNING FACE
+263A	WHITE SMILING FACE
+	= have a nice day!
+263B	BLACK SMILING FACE
+263C	WHITE SUN WITH RAYS
+	= compass
+	x (sun - 2609)
+@		Astrological symbols
+263D	FIRST QUARTER MOON
+263E	LAST QUARTER MOON
+263F	MERCURY
+2640	FEMALE SIGN
+	= Venus
+2641	EARTH
+	x (circled plus - 2295)
+2642	MALE SIGN
+	= Mars
+2643	JUPITER
+2644	SATURN
+2645	URANUS
+2646	NEPTUNE
+2647	PLUTO
+@		Zodiacal symbols
+2648	ARIES
+2649	TAURUS
+264A	GEMINI
+264B	CANCER
+264C	LEO
+264D	VIRGO
+	= minim (alternate glyph)
+264E	LIBRA
+264F	SCORPIUS
+	= minim, drop
+2650	SAGITTARIUS
+2651	CAPRICORN
+2652	AQUARIUS
+2653	PISCES
+@		Chess symbols
+2654	WHITE CHESS KING
+2655	WHITE CHESS QUEEN
+2656	WHITE CHESS ROOK
+2657	WHITE CHESS BISHOP
+2658	WHITE CHESS KNIGHT
+2659	WHITE CHESS PAWN
+265A	BLACK CHESS KING
+265B	BLACK CHESS QUEEN
+265C	BLACK CHESS ROOK
+265D	BLACK CHESS BISHOP
+265E	BLACK CHESS KNIGHT
+265F	BLACK CHESS PAWN
+@		Playing card symbols
+2660	BLACK SPADE SUIT
+2661	WHITE HEART SUIT
+2662	WHITE DIAMOND SUIT
+	x (white diamond - 25C7)
+	x (lozenge - 25CA)
+2663	BLACK CLUB SUIT
+	= shamrock
+2664	WHITE SPADE SUIT
+2665	BLACK HEART SUIT
+	= valentine
+	x (heavy black heart - 2764)
+2666	BLACK DIAMOND SUIT
+	x (black diamond - 25C6)
+2667	WHITE CLUB SUIT
+@		Miscellaneous symbol
+2668	HOT SPRINGS
+@		Musical symbols
+2669	QUARTER NOTE
+266A	EIGHTH NOTE
+266B	BEAMED EIGHTH NOTES
+266C	BEAMED SIXTEENTH NOTES
+266D	MUSIC FLAT SIGN
+266E	MUSIC NATURAL SIGN
+266F	MUSIC SHARP SIGN
+	= z notation infix bag count
+	x (number sign - 0023)
+@		Syriac cross symbols
+@+		These symbols are used in liturgical texts of Syriac-speaking churches.
+2670	WEST SYRIAC CROSS
+2671	EAST SYRIAC CROSS
+@		Recycling symbols
+2672	UNIVERSAL RECYCLING SYMBOL
+	* used as generic symbol for recycling or to indicate that material is recyclable
+2673	RECYCLING SYMBOL FOR TYPE-1 PLASTICS (pete)
+	* polyethylene terephthalate
+2674	RECYCLING SYMBOL FOR TYPE-2 PLASTICS (hdpe)
+	* high density polyethylene
+2675	RECYCLING SYMBOL FOR TYPE-3 PLASTICS (pvc)
+	* vinyl, polyvinyl chloride
+2676	RECYCLING SYMBOL FOR TYPE-4 PLASTICS (ldpe)
+	* low density polyethylene
+2677	RECYCLING SYMBOL FOR TYPE-5 PLASTICS (pp)
+	* polypropylene
+2678	RECYCLING SYMBOL FOR TYPE-6 PLASTICS (ps)
+	* polystyrene
+2679	RECYCLING SYMBOL FOR TYPE-7 PLASTICS (other)
+	* other plastics
+267A	RECYCLING SYMBOL FOR GENERIC MATERIALS
+	* used together with other text and labels to indicate the type of material to be recycled
+267B	BLACK UNIVERSAL RECYCLING SYMBOL
+267C	RECYCLED PAPER SYMBOL
+	* used to indicate 100% recycled paper content
+267D	PARTIALLY-RECYCLED PAPER SYMBOL
+	* percentage of recycled paper content indicated in overlay or next to this symbol
+@		Miscellaneous symbols
+267E	PERMANENT PAPER SIGN
+267F	WHEELCHAIR SYMBOL
+@		Dice
+2680	DIE FACE-1
+2681	DIE FACE-2
+2682	DIE FACE-3
+2683	DIE FACE-4
+2684	DIE FACE-5
+2685	DIE FACE-6
+@		Go markers
+2686	WHITE CIRCLE WITH DOT RIGHT
+2687	WHITE CIRCLE WITH TWO DOTS
+2688	BLACK CIRCLE WITH WHITE DOT RIGHT
+2689	BLACK CIRCLE WITH TWO WHITE DOTS
+@		Yijing monogram and digram symbols
+268A	MONOGRAM FOR YANG
+268B	MONOGRAM FOR YIN
+268C	DIGRAM FOR GREATER YANG
+268D	DIGRAM FOR LESSER YIN
+268E	DIGRAM FOR LESSER YANG
+268F	DIGRAM FOR GREATER YIN
+@		Dictionary and map symbols
+2690	WHITE FLAG
+2691	BLACK FLAG
+2692	HAMMER AND PICK
+	= mining, working day (in timetables)
+2693	ANCHOR
+	= nautical term, harbor (on maps)
+2694	CROSSED SWORDS
+	= military term, battleground (on maps), killed in action
+2695	STAFF OF AESCULAPIUS
+	= medical term
+	* both inclined or upright renderings of this symbol are common
+	x (caduceus - 2624)
+2696	SCALES
+	= legal term, jurisprudence
+2697	ALEMBIC
+	= chemical term, chemistry
+2698	FLOWER
+	= botanical term
+	x (flower punctuation mark - 2055)
+	x (shamrock - 2618)
+	x (white florette - 2740)
+2699	GEAR
+	= technology, tools
+269A	STAFF OF HERMES
+	* signifies a commercial term or commerce
+	* glyph shows a heraldic staff with a winged wheel
+269B	ATOM SYMBOL
+	= nuclear installation (on maps)
+@		Miscellaneous symbols
+269C	FLEUR-DE-LIS
+26A0	WARNING SIGN
+26A1	HIGH VOLTAGE SIGN
+@		Gender symbols
+26A2	DOUBLED FEMALE SIGN
+	= lesbianism
+26A3	DOUBLED MALE SIGN
+	* a glyph variant has the two circles on the same line
+	= male homosexuality
+26A4	INTERLOCKED FEMALE AND MALE SIGN
+	* a glyph variant has the two circles on the same line
+	= bisexuality
+26A5	MALE AND FEMALE SIGN
+	= transgendered sexuality
+	= hermaphrodite (in entomology)
+26A6	MALE WITH STROKE SIGN
+	= transgendered sexuality
+26A7	MALE WITH STROKE AND MALE AND FEMALE SIGN
+	= transgendered sexuality
+26A8	VERTICAL MALE WITH STROKE SIGN
+	= ferrous iron sulphate (alchemy and older chemistry)
+26A9	HORIZONTAL MALE WITH STROKE SIGN
+	= magnesium (alchemy and older chemistry)
+@		Circles
+26AA	MEDIUM WHITE CIRCLE
+	= asexuality, sexless, genderless
+	= engaged, betrothed
+	* base for male or female sign
+26AB	MEDIUM BLACK CIRCLE
+	* UI symbol for record function
+26AC	MEDIUM SMALL WHITE CIRCLE
+	= engaged, betrothed (genealogy)
+	* can represent wedding ring
+@		Genealogical symbols
+26AD	MARRIAGE SYMBOL
+	x (infinity - 221E)
+26AE	DIVORCE SYMBOL
+	x (infinity negated with vertical bar - 29DE)
+26AF	UNMARRIED PARTNERSHIP SYMBOL
+	x (double-ended multimap - 29DF)
+26B0	COFFIN
+	= buried (genealogy)
+	x (white rectangle - 25AD)
+26B1	FUNERAL URN
+	= cremated (genealogy)
+@@	2700	Dingbats	27BF
+@+		ITC Zapf dingbats series 100
+@		Miscellaneous
+2701	UPPER BLADE SCISSORS
+2702	BLACK SCISSORS
+2703	LOWER BLADE SCISSORS
+2704	WHITE SCISSORS
+2705	<reserved>
+	x (black telephone - 260E)
+2706	TELEPHONE LOCATION SIGN
+2707	TAPE DRIVE
+2708	AIRPLANE
+2709	ENVELOPE
+270A	<reserved>
+	x (black right pointing index - 261B)
+270B	<reserved>
+	x (white right pointing index - 261E)
+270C	VICTORY HAND
+270D	WRITING HAND
+270E	LOWER RIGHT PENCIL
+270F	PENCIL
+2710	UPPER RIGHT PENCIL
+2711	WHITE NIB
+2712	BLACK NIB
+2713	CHECK MARK
+	x (square root - 221A)
+2714	HEAVY CHECK MARK
+2715	MULTIPLICATION X
+	x (multiplication sign - 00D7)
+	x (box drawings light diagonal cross - 2573)
+2716	HEAVY MULTIPLICATION X
+2717	BALLOT X
+	x (saltire - 2613)
+2718	HEAVY BALLOT X
+@		Crosses
+2719	OUTLINED GREEK CROSS
+271A	HEAVY GREEK CROSS
+271B	OPEN CENTRE CROSS
+271C	HEAVY OPEN CENTRE CROSS
+271D	LATIN CROSS
+271E	SHADOWED WHITE LATIN CROSS
+271F	OUTLINED LATIN CROSS
+2720	MALTESE CROSS
+	* Historically, the Maltese cross took many forms; the shape shown in the Zapf Dingbats is similar to one known as the Cross Formée.
+@		Stars, asterisks and snowflakes
+2721	STAR OF DAVID
+2722	FOUR TEARDROP-SPOKED ASTERISK
+2723	FOUR BALLOON-SPOKED ASTERISK
+2724	HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725	FOUR CLUB-SPOKED ASTERISK
+2726	BLACK FOUR POINTED STAR
+2727	WHITE FOUR POINTED STAR
+2728	<reserved>
+	x (black star - 2605)
+2729	STRESS OUTLINED WHITE STAR
+	x (white star - 2606)
+272A	CIRCLED WHITE STAR
+272B	OPEN CENTRE BLACK STAR
+272C	BLACK CENTRE WHITE STAR
+272D	OUTLINED BLACK STAR
+272E	HEAVY OUTLINED BLACK STAR
+272F	PINWHEEL STAR
+2730	SHADOWED WHITE STAR
+2731	HEAVY ASTERISK
+	x (asterisk - 002A)
+2732	OPEN CENTRE ASTERISK
+2733	EIGHT SPOKED ASTERISK
+2734	EIGHT POINTED BLACK STAR
+2735	EIGHT POINTED PINWHEEL STAR
+2736	SIX POINTED BLACK STAR
+	= sextile
+2737	EIGHT POINTED RECTILINEAR BLACK STAR
+2738	HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739	TWELVE POINTED BLACK STAR
+273A	SIXTEEN POINTED ASTERISK
+	= starburst
+273B	TEARDROP-SPOKED ASTERISK
+273C	OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D	HEAVY TEARDROP-SPOKED ASTERISK
+273E	SIX PETALLED BLACK AND WHITE FLORETTE
+273F	BLACK FLORETTE
+2740	WHITE FLORETTE
+2741	EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742	CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743	HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744	SNOWFLAKE
+2745	TIGHT TRIFOLIATE SNOWFLAKE
+2746	HEAVY CHEVRON SNOWFLAKE
+2747	SPARKLE
+2748	HEAVY SPARKLE
+2749	BALLOON-SPOKED ASTERISK
+	= jack
+274A	EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B	HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+	= turbofan
+@		Miscellaneous
+274C	<reserved>
+	x (black circle - 25CF)
+274D	SHADOWED WHITE CIRCLE
+274E	<reserved>
+	x (black square - 25A0)
+274F	LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750	UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751	LOWER RIGHT SHADOWED WHITE SQUARE
+2752	UPPER RIGHT SHADOWED WHITE SQUARE
+2753	<reserved>
+	x (black up-pointing triangle - 25B2)
+2754	<reserved>
+	x (black down-pointing triangle - 25BC)
+2755	<reserved>
+	x (black diamond - 25C6)
+2756	BLACK DIAMOND MINUS WHITE X
+2757	<reserved>
+	x (right half black circle - 25D7)
+2758	LIGHT VERTICAL BAR
+	x (vertical line - 007C)
+2759	MEDIUM VERTICAL BAR
+275A	HEAVY VERTICAL BAR
+@		Punctuation ornaments
+275B	HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+	x (left single quotation mark - 2018)
+275C	HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+	x (right single quotation mark - 2019)
+275D	HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+	x (left double quotation mark - 201C)
+275E	HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+	x (right double quotation mark - 201D)
+2761	CURVED STEM PARAGRAPH SIGN ORNAMENT
+	x (pilcrow sign - 00B6)
+2762	HEAVY EXCLAMATION MARK ORNAMENT
+	x (exclamation mark - 0021)
+2763	HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764	HEAVY BLACK HEART
+	x (black heart suit - 2665)
+2765	ROTATED HEAVY BLACK HEART BULLET
+2766	FLORAL HEART
+	= Aldus leaf
+2767	ROTATED FLORAL HEART BULLET
+	= hedera, ivy leaf
+	x (reversed rotated floral heart bullet - 2619)
+@		Ornamental brackets
+2768	MEDIUM LEFT PARENTHESIS ORNAMENT
+	x (left parenthesis - 0028)
+2769	MEDIUM RIGHT PARENTHESIS ORNAMENT
+	x (right parenthesis - 0029)
+276A	MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B	MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C	MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+	x (left-pointing angle bracket - 2329)
+276D	MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+	x (right-pointing angle bracket - 232A)
+276E	HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+	x (single left-pointing angle quotation mark - 2039)
+276F	HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+	x (single right-pointing angle quotation mark - 203A)
+2770	HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771	HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772	LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+	x (left tortoise shell bracket - 3014)
+2773	LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+	x (right tortoise shell bracket - 3015)
+2774	MEDIUM LEFT CURLY BRACKET ORNAMENT
+	x (left curly bracket - 007B)
+2775	MEDIUM RIGHT CURLY BRACKET ORNAMENT
+	x (right curly bracket - 007D)
+@		Dingbat circled digits
+2776	DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777	DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778	DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779	DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A	DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B	DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C	DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D	DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E	DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F	DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780	DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781	DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782	DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783	DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784	DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785	DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786	DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787	DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788	DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789	DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A	DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B	DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C	DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D	DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E	DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F	DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790	DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791	DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792	DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793	DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+@		Dingbat arrows
+2794	HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2795	<reserved>
+	x (rightwards arrow - 2192)
+2796	<reserved>
+	x (left right arrow - 2194)
+2797	<reserved>
+	x (up down arrow - 2195)
+2798	HEAVY SOUTH EAST ARROW
+2799	HEAVY RIGHTWARDS ARROW
+279A	HEAVY NORTH EAST ARROW
+279B	DRAFTING POINT RIGHTWARDS ARROW
+279C	HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D	TRIANGLE-HEADED RIGHTWARDS ARROW
+279E	HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F	DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0	HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1	BLACK RIGHTWARDS ARROW
+27A2	THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3	THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4	BLACK RIGHTWARDS ARROWHEAD
+27A5	HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6	HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7	SQUAT BLACK RIGHTWARDS ARROW
+27A8	HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9	RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA	LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB	BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC	FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD	HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE	HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF	NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1	NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2	CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3	WHITE-FEATHERED RIGHTWARDS ARROW
+27B4	BLACK-FEATHERED SOUTH EAST ARROW
+27B5	BLACK-FEATHERED RIGHTWARDS ARROW
+27B6	BLACK-FEATHERED NORTH EAST ARROW
+27B7	HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8	HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9	HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA	TEARDROP-BARBED RIGHTWARDS ARROW
+27BB	HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC	WEDGE-TAILED RIGHTWARDS ARROW
+27BD	HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE	OPEN-OUTLINED RIGHTWARDS ARROW
+@@	27C0	Miscellaneous Mathematical Symbols-A	27EF
+@		Miscellaneous symbols
+27C0	THREE DIMENSIONAL ANGLE
+	* used by Euclid
+27C1	WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+	* used by Euclid
+27C2	PERPENDICULAR
+	= orthogonal to
+	* relation, typeset with additional spacing
+	x (up tack - 22A5)
+27C3	OPEN SUBSET
+27C4	OPEN SUPERSET
+27C5	LEFT S-SHAPED BAG DELIMITER
+27C6	RIGHT S-SHAPED BAG DELIMITER
+27D0	WHITE DIAMOND WITH CENTRED DOT
+@		Operators
+27D1	AND WITH DOT
+	x (logical and - 2227)
+	x (intersection with dot - 2A40)
+27D2	ELEMENT OF OPENING UPWARDS
+	x (element of opening downwards - 2AD9)
+27D3	LOWER RIGHT CORNER WITH DOT
+	= pullback
+	x (right floor - 230B)
+27D4	UPPER LEFT CORNER WITH DOT
+	= pushout
+	x (left ceiling - 2308)
+@		Database theory operators
+27D5	LEFT OUTER JOIN
+27D6	RIGHT OUTER JOIN
+27D7	FULL OUTER JOIN
+	x (join - 2A1D)
+@		Tacks and turnstiles
+27D8	LARGE UP TACK
+	x (up tack - 22A5)
+27D9	LARGE DOWN TACK
+	x (down tack - 22A4)
+27DA	LEFT AND RIGHT DOUBLE TURNSTILE
+	x (true - 22A8)
+	x (vertical bar double left turnstile - 2AE4)
+27DB	LEFT AND RIGHT TACK
+	x (right tack - 22A2)
+27DC	LEFT MULTIMAP
+	x (multimap - 22B8)
+27DD	LONG RIGHT TACK
+	x (right tack - 22A2)
+27DE	LONG LEFT TACK
+	x (left tack - 22A3)
+27DF	UP TACK WITH CIRCLE ABOVE
+	= radial component
+	x (down tack with circle below - 2AF1)
+@		Modal logic operators
+27E0	LOZENGE DIVIDED BY HORIZONTAL RULE
+	* used as form of possibility in modal logic
+	x (lozenge - 25CA)
+27E1	WHITE CONCAVE-SIDED DIAMOND
+	= never (modal operator)
+27E2	WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+	= was never (modal operator)
+27E3	WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+	= will never be (modal operator)
+27E4	WHITE SQUARE WITH LEFTWARDS TICK
+	= was always (modal operator)
+	x (white square - 25A1)
+27E5	WHITE SQUARE WITH RIGHTWARDS TICK
+	= will always be (modal operator)
+@		Mathematical brackets
+27E6	MATHEMATICAL LEFT WHITE SQUARE BRACKET
+	= z notation left bag bracket
+	x (left white square bracket - 301A)
+27E7	MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+	= z notation right bag bracket
+	x (right white square bracket - 301B)
+27E8	MATHEMATICAL LEFT ANGLE BRACKET
+	= bra
+	= z notation left sequence bracket
+	x (left-pointing angle bracket - 2329)
+	x (left angle bracket - 3008)
+27E9	MATHEMATICAL RIGHT ANGLE BRACKET
+	= ket
+	= z notation right sequence bracket
+	x (right-pointing angle bracket - 232A)
+	x (right angle bracket - 3009)
+27EA	MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+	= z notation left chevron bracket
+	x (left double angle bracket - 300A)
+27EB	MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+	= z notation right chevron bracket
+	x (right double angle bracket - 300B)
+@@	27F0	Supplemental Arrows-A	27FF
+@		Arrows
+27F0	UPWARDS QUADRUPLE ARROW
+	x (upwards triple arrow - 290A)
+27F1	DOWNWARDS QUADRUPLE ARROW
+	x (downwards triple arrow - 290B)
+27F2	ANTICLOCKWISE GAPPED CIRCLE ARROW
+	x (anticlockwise open circle arrow - 21BA)
+	x (anticlockwise closed circle arrow - 2940)
+27F3	CLOCKWISE GAPPED CIRCLE ARROW
+	x (clockwise open circle arrow - 21BB)
+	x (clockwise closed circle arrow - 2941)
+27F4	RIGHT ARROW WITH CIRCLED PLUS
+@		Long arrows
+@+	The long arrows are used for mapping whereas the short forms would be used in limits. They are also needed for MathML to complete mapping to the ASMA sets.
+27F5	LONG LEFTWARDS ARROW
+	x (leftwards arrow - 2190)
+27F6	LONG RIGHTWARDS ARROW
+	x (rightwards arrow - 2192)
+27F7	LONG LEFT RIGHT ARROW
+	x (left right arrow - 2194)
+27F8	LONG LEFTWARDS DOUBLE ARROW
+	x (leftwards double arrow - 21D0)
+27F9	LONG RIGHTWARDS DOUBLE ARROW
+	x (rightwards double arrow - 21D2)
+27FA	LONG LEFT RIGHT DOUBLE ARROW
+	x (left right double arrow - 21D4)
+27FB	LONG LEFTWARDS ARROW FROM BAR
+	= maps from
+	x (leftwards arrow from bar - 21A4)
+27FC	LONG RIGHTWARDS ARROW FROM BAR
+	= maps to
+	x (rightwards arrow from bar - 21A6)
+27FD	LONG LEFTWARDS DOUBLE ARROW FROM BAR
+	x (leftwards double arrow from bar - 2906)
+27FE	LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+	x (rightwards double arrow from bar - 2907)
+27FF	LONG RIGHTWARDS SQUIGGLE ARROW
+	x (rightwards squiggle arrow - 21DD)
+@@	2800	Braille Patterns	28FF
+@		Braille patterns
+2800	BRAILLE PATTERN BLANK
+2801	BRAILLE PATTERN DOTS-1
+2802	BRAILLE PATTERN DOTS-2
+2803	BRAILLE PATTERN DOTS-12
+2804	BRAILLE PATTERN DOTS-3
+2805	BRAILLE PATTERN DOTS-13
+2806	BRAILLE PATTERN DOTS-23
+2807	BRAILLE PATTERN DOTS-123
+2808	BRAILLE PATTERN DOTS-4
+2809	BRAILLE PATTERN DOTS-14
+280A	BRAILLE PATTERN DOTS-24
+280B	BRAILLE PATTERN DOTS-124
+280C	BRAILLE PATTERN DOTS-34
+280D	BRAILLE PATTERN DOTS-134
+280E	BRAILLE PATTERN DOTS-234
+280F	BRAILLE PATTERN DOTS-1234
+2810	BRAILLE PATTERN DOTS-5
+2811	BRAILLE PATTERN DOTS-15
+2812	BRAILLE PATTERN DOTS-25
+2813	BRAILLE PATTERN DOTS-125
+2814	BRAILLE PATTERN DOTS-35
+2815	BRAILLE PATTERN DOTS-135
+2816	BRAILLE PATTERN DOTS-235
+2817	BRAILLE PATTERN DOTS-1235
+2818	BRAILLE PATTERN DOTS-45
+2819	BRAILLE PATTERN DOTS-145
+281A	BRAILLE PATTERN DOTS-245
+281B	BRAILLE PATTERN DOTS-1245
+281C	BRAILLE PATTERN DOTS-345
+281D	BRAILLE PATTERN DOTS-1345
+281E	BRAILLE PATTERN DOTS-2345
+281F	BRAILLE PATTERN DOTS-12345
+2820	BRAILLE PATTERN DOTS-6
+2821	BRAILLE PATTERN DOTS-16
+2822	BRAILLE PATTERN DOTS-26
+2823	BRAILLE PATTERN DOTS-126
+2824	BRAILLE PATTERN DOTS-36
+2825	BRAILLE PATTERN DOTS-136
+2826	BRAILLE PATTERN DOTS-236
+2827	BRAILLE PATTERN DOTS-1236
+2828	BRAILLE PATTERN DOTS-46
+2829	BRAILLE PATTERN DOTS-146
+282A	BRAILLE PATTERN DOTS-246
+282B	BRAILLE PATTERN DOTS-1246
+282C	BRAILLE PATTERN DOTS-346
+282D	BRAILLE PATTERN DOTS-1346
+282E	BRAILLE PATTERN DOTS-2346
+282F	BRAILLE PATTERN DOTS-12346
+2830	BRAILLE PATTERN DOTS-56
+2831	BRAILLE PATTERN DOTS-156
+2832	BRAILLE PATTERN DOTS-256
+2833	BRAILLE PATTERN DOTS-1256
+2834	BRAILLE PATTERN DOTS-356
+2835	BRAILLE PATTERN DOTS-1356
+2836	BRAILLE PATTERN DOTS-2356
+2837	BRAILLE PATTERN DOTS-12356
+2838	BRAILLE PATTERN DOTS-456
+2839	BRAILLE PATTERN DOTS-1456
+283A	BRAILLE PATTERN DOTS-2456
+283B	BRAILLE PATTERN DOTS-12456
+283C	BRAILLE PATTERN DOTS-3456
+283D	BRAILLE PATTERN DOTS-13456
+283E	BRAILLE PATTERN DOTS-23456
+283F	BRAILLE PATTERN DOTS-123456
+2840	BRAILLE PATTERN DOTS-7
+2841	BRAILLE PATTERN DOTS-17
+2842	BRAILLE PATTERN DOTS-27
+2843	BRAILLE PATTERN DOTS-127
+2844	BRAILLE PATTERN DOTS-37
+2845	BRAILLE PATTERN DOTS-137
+2846	BRAILLE PATTERN DOTS-237
+2847	BRAILLE PATTERN DOTS-1237
+2848	BRAILLE PATTERN DOTS-47
+2849	BRAILLE PATTERN DOTS-147
+284A	BRAILLE PATTERN DOTS-247
+284B	BRAILLE PATTERN DOTS-1247
+284C	BRAILLE PATTERN DOTS-347
+284D	BRAILLE PATTERN DOTS-1347
+284E	BRAILLE PATTERN DOTS-2347
+284F	BRAILLE PATTERN DOTS-12347
+2850	BRAILLE PATTERN DOTS-57
+2851	BRAILLE PATTERN DOTS-157
+2852	BRAILLE PATTERN DOTS-257
+2853	BRAILLE PATTERN DOTS-1257
+2854	BRAILLE PATTERN DOTS-357
+2855	BRAILLE PATTERN DOTS-1357
+2856	BRAILLE PATTERN DOTS-2357
+2857	BRAILLE PATTERN DOTS-12357
+2858	BRAILLE PATTERN DOTS-457
+2859	BRAILLE PATTERN DOTS-1457
+285A	BRAILLE PATTERN DOTS-2457
+285B	BRAILLE PATTERN DOTS-12457
+285C	BRAILLE PATTERN DOTS-3457
+285D	BRAILLE PATTERN DOTS-13457
+285E	BRAILLE PATTERN DOTS-23457
+285F	BRAILLE PATTERN DOTS-123457
+2860	BRAILLE PATTERN DOTS-67
+2861	BRAILLE PATTERN DOTS-167
+2862	BRAILLE PATTERN DOTS-267
+2863	BRAILLE PATTERN DOTS-1267
+2864	BRAILLE PATTERN DOTS-367
+2865	BRAILLE PATTERN DOTS-1367
+2866	BRAILLE PATTERN DOTS-2367
+2867	BRAILLE PATTERN DOTS-12367
+2868	BRAILLE PATTERN DOTS-467
+2869	BRAILLE PATTERN DOTS-1467
+286A	BRAILLE PATTERN DOTS-2467
+286B	BRAILLE PATTERN DOTS-12467
+286C	BRAILLE PATTERN DOTS-3467
+286D	BRAILLE PATTERN DOTS-13467
+286E	BRAILLE PATTERN DOTS-23467
+286F	BRAILLE PATTERN DOTS-123467
+2870	BRAILLE PATTERN DOTS-567
+2871	BRAILLE PATTERN DOTS-1567
+2872	BRAILLE PATTERN DOTS-2567
+2873	BRAILLE PATTERN DOTS-12567
+2874	BRAILLE PATTERN DOTS-3567
+2875	BRAILLE PATTERN DOTS-13567
+2876	BRAILLE PATTERN DOTS-23567
+2877	BRAILLE PATTERN DOTS-123567
+2878	BRAILLE PATTERN DOTS-4567
+2879	BRAILLE PATTERN DOTS-14567
+287A	BRAILLE PATTERN DOTS-24567
+287B	BRAILLE PATTERN DOTS-124567
+287C	BRAILLE PATTERN DOTS-34567
+287D	BRAILLE PATTERN DOTS-134567
+287E	BRAILLE PATTERN DOTS-234567
+287F	BRAILLE PATTERN DOTS-1234567
+2880	BRAILLE PATTERN DOTS-8
+2881	BRAILLE PATTERN DOTS-18
+2882	BRAILLE PATTERN DOTS-28
+2883	BRAILLE PATTERN DOTS-128
+2884	BRAILLE PATTERN DOTS-38
+2885	BRAILLE PATTERN DOTS-138
+2886	BRAILLE PATTERN DOTS-238
+2887	BRAILLE PATTERN DOTS-1238
+2888	BRAILLE PATTERN DOTS-48
+2889	BRAILLE PATTERN DOTS-148
+288A	BRAILLE PATTERN DOTS-248
+288B	BRAILLE PATTERN DOTS-1248
+288C	BRAILLE PATTERN DOTS-348
+288D	BRAILLE PATTERN DOTS-1348
+288E	BRAILLE PATTERN DOTS-2348
+288F	BRAILLE PATTERN DOTS-12348
+2890	BRAILLE PATTERN DOTS-58
+2891	BRAILLE PATTERN DOTS-158
+2892	BRAILLE PATTERN DOTS-258
+2893	BRAILLE PATTERN DOTS-1258
+2894	BRAILLE PATTERN DOTS-358
+2895	BRAILLE PATTERN DOTS-1358
+2896	BRAILLE PATTERN DOTS-2358
+2897	BRAILLE PATTERN DOTS-12358
+2898	BRAILLE PATTERN DOTS-458
+2899	BRAILLE PATTERN DOTS-1458
+289A	BRAILLE PATTERN DOTS-2458
+289B	BRAILLE PATTERN DOTS-12458
+289C	BRAILLE PATTERN DOTS-3458
+289D	BRAILLE PATTERN DOTS-13458
+289E	BRAILLE PATTERN DOTS-23458
+289F	BRAILLE PATTERN DOTS-123458
+28A0	BRAILLE PATTERN DOTS-68
+28A1	BRAILLE PATTERN DOTS-168
+28A2	BRAILLE PATTERN DOTS-268
+28A3	BRAILLE PATTERN DOTS-1268
+28A4	BRAILLE PATTERN DOTS-368
+28A5	BRAILLE PATTERN DOTS-1368
+28A6	BRAILLE PATTERN DOTS-2368
+28A7	BRAILLE PATTERN DOTS-12368
+28A8	BRAILLE PATTERN DOTS-468
+28A9	BRAILLE PATTERN DOTS-1468
+28AA	BRAILLE PATTERN DOTS-2468
+28AB	BRAILLE PATTERN DOTS-12468
+28AC	BRAILLE PATTERN DOTS-3468
+28AD	BRAILLE PATTERN DOTS-13468
+28AE	BRAILLE PATTERN DOTS-23468
+28AF	BRAILLE PATTERN DOTS-123468
+28B0	BRAILLE PATTERN DOTS-568
+28B1	BRAILLE PATTERN DOTS-1568
+28B2	BRAILLE PATTERN DOTS-2568
+28B3	BRAILLE PATTERN DOTS-12568
+28B4	BRAILLE PATTERN DOTS-3568
+28B5	BRAILLE PATTERN DOTS-13568
+28B6	BRAILLE PATTERN DOTS-23568
+28B7	BRAILLE PATTERN DOTS-123568
+28B8	BRAILLE PATTERN DOTS-4568
+28B9	BRAILLE PATTERN DOTS-14568
+28BA	BRAILLE PATTERN DOTS-24568
+28BB	BRAILLE PATTERN DOTS-124568
+28BC	BRAILLE PATTERN DOTS-34568
+28BD	BRAILLE PATTERN DOTS-134568
+28BE	BRAILLE PATTERN DOTS-234568
+28BF	BRAILLE PATTERN DOTS-1234568
+28C0	BRAILLE PATTERN DOTS-78
+28C1	BRAILLE PATTERN DOTS-178
+28C2	BRAILLE PATTERN DOTS-278
+28C3	BRAILLE PATTERN DOTS-1278
+28C4	BRAILLE PATTERN DOTS-378
+28C5	BRAILLE PATTERN DOTS-1378
+28C6	BRAILLE PATTERN DOTS-2378
+28C7	BRAILLE PATTERN DOTS-12378
+28C8	BRAILLE PATTERN DOTS-478
+28C9	BRAILLE PATTERN DOTS-1478
+28CA	BRAILLE PATTERN DOTS-2478
+28CB	BRAILLE PATTERN DOTS-12478
+28CC	BRAILLE PATTERN DOTS-3478
+28CD	BRAILLE PATTERN DOTS-13478
+28CE	BRAILLE PATTERN DOTS-23478
+28CF	BRAILLE PATTERN DOTS-123478
+28D0	BRAILLE PATTERN DOTS-578
+28D1	BRAILLE PATTERN DOTS-1578
+28D2	BRAILLE PATTERN DOTS-2578
+28D3	BRAILLE PATTERN DOTS-12578
+28D4	BRAILLE PATTERN DOTS-3578
+28D5	BRAILLE PATTERN DOTS-13578
+28D6	BRAILLE PATTERN DOTS-23578
+28D7	BRAILLE PATTERN DOTS-123578
+28D8	BRAILLE PATTERN DOTS-4578
+28D9	BRAILLE PATTERN DOTS-14578
+28DA	BRAILLE PATTERN DOTS-24578
+28DB	BRAILLE PATTERN DOTS-124578
+28DC	BRAILLE PATTERN DOTS-34578
+28DD	BRAILLE PATTERN DOTS-134578
+28DE	BRAILLE PATTERN DOTS-234578
+28DF	BRAILLE PATTERN DOTS-1234578
+28E0	BRAILLE PATTERN DOTS-678
+28E1	BRAILLE PATTERN DOTS-1678
+28E2	BRAILLE PATTERN DOTS-2678
+28E3	BRAILLE PATTERN DOTS-12678
+28E4	BRAILLE PATTERN DOTS-3678
+28E5	BRAILLE PATTERN DOTS-13678
+28E6	BRAILLE PATTERN DOTS-23678
+28E7	BRAILLE PATTERN DOTS-123678
+28E8	BRAILLE PATTERN DOTS-4678
+28E9	BRAILLE PATTERN DOTS-14678
+28EA	BRAILLE PATTERN DOTS-24678
+28EB	BRAILLE PATTERN DOTS-124678
+28EC	BRAILLE PATTERN DOTS-34678
+28ED	BRAILLE PATTERN DOTS-134678
+28EE	BRAILLE PATTERN DOTS-234678
+28EF	BRAILLE PATTERN DOTS-1234678
+28F0	BRAILLE PATTERN DOTS-5678
+28F1	BRAILLE PATTERN DOTS-15678
+28F2	BRAILLE PATTERN DOTS-25678
+28F3	BRAILLE PATTERN DOTS-125678
+28F4	BRAILLE PATTERN DOTS-35678
+28F5	BRAILLE PATTERN DOTS-135678
+28F6	BRAILLE PATTERN DOTS-235678
+28F7	BRAILLE PATTERN DOTS-1235678
+28F8	BRAILLE PATTERN DOTS-45678
+28F9	BRAILLE PATTERN DOTS-145678
+28FA	BRAILLE PATTERN DOTS-245678
+28FB	BRAILLE PATTERN DOTS-1245678
+28FC	BRAILLE PATTERN DOTS-345678
+28FD	BRAILLE PATTERN DOTS-1345678
+28FE	BRAILLE PATTERN DOTS-2345678
+28FF	BRAILLE PATTERN DOTS-12345678
+@@	2900	Supplemental Arrows-B	297F
+@		Supplemental arrows
+2900	RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+	= z notation partial surjection
+2901	RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+	= z notation finite surjection
+2902	LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903	RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904	LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905	RIGHTWARDS TWO-HEADED ARROW FROM BAR
+	= maps to
+2906	LEFTWARDS DOUBLE ARROW FROM BAR
+	= maps from
+	x (long leftwards arrow from bar - 27FB)
+2907	RIGHTWARDS DOUBLE ARROW FROM BAR
+	= maps to
+	x (long rightwards arrow from bar - 27FC)
+2908	DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909	UPWARDS ARROW WITH HORIZONTAL STROKE
+290A	UPWARDS TRIPLE ARROW
+	x (upwards double arrow - 21D1)
+	x (upwards quadruple arrow - 27F0)
+290B	DOWNWARDS TRIPLE ARROW
+	x (downwards double arrow - 21D3)
+	x (downwards quadruple arrow - 27F1)
+290C	LEFTWARDS DOUBLE DASH ARROW
+290D	RIGHTWARDS DOUBLE DASH ARROW
+290E	LEFTWARDS TRIPLE DASH ARROW
+290F	RIGHTWARDS TRIPLE DASH ARROW
+2910	RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911	RIGHTWARDS ARROW WITH DOTTED STEM
+2912	UPWARDS ARROW TO BAR
+2913	DOWNWARDS ARROW TO BAR
+2914	RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+	= z notation partial injection
+2915	RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+	= z notation finite injection
+2916	RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+	= bijective mapping
+	= z notation bijection
+2917	RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+	= z notation surjective injection
+2918	RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+	= z notation finite surjective injection
+2919	LEFTWARDS ARROW-TAIL
+291A	RIGHTWARDS ARROW-TAIL
+291B	LEFTWARDS DOUBLE ARROW-TAIL
+291C	RIGHTWARDS DOUBLE ARROW-TAIL
+291D	LEFTWARDS ARROW TO BLACK DIAMOND
+291E	RIGHTWARDS ARROW TO BLACK DIAMOND
+291F	LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920	RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921	NORTH WEST AND SOUTH EAST ARROW
+2922	NORTH EAST AND SOUTH WEST ARROW
+2923	NORTH WEST ARROW WITH HOOK
+2924	NORTH EAST ARROW WITH HOOK
+2925	SOUTH EAST ARROW WITH HOOK
+2926	SOUTH WEST ARROW WITH HOOK
+2927	NORTH WEST ARROW AND NORTH EAST ARROW
+2928	NORTH EAST ARROW AND SOUTH EAST ARROW
+2929	SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A	SOUTH WEST ARROW AND NORTH WEST ARROW
+292B	RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C	FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D	SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E	NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F	FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930	RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931	NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932	NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933	WAVE ARROW POINTING DIRECTLY RIGHT
+	x (rightwards wave arrow - 219D)
+2934	ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935	ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936	ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937	ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938	RIGHT-SIDE ARC CLOCKWISE ARROW
+2939	LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A	TOP ARC ANTICLOCKWISE ARROW
+293B	BOTTOM ARC ANTICLOCKWISE ARROW
+293C	TOP ARC CLOCKWISE ARROW WITH MINUS
+293D	TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E	LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F	LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940	ANTICLOCKWISE CLOSED CIRCLE ARROW
+	x (combining anticlockwise ring overlay - 20DA)
+2941	CLOCKWISE CLOSED CIRCLE ARROW
+	x (combining clockwise ring overlay - 20D9)
+2942	RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943	LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944	SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945	RIGHTWARDS ARROW WITH PLUS BELOW
+2946	LEFTWARDS ARROW WITH PLUS BELOW
+2947	RIGHTWARDS ARROW THROUGH X
+2948	LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949	UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A	LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B	LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C	UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D	UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E	LEFT BARB UP RIGHT BARB UP HARPOON
+294F	UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950	LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951	UP BARB LEFT DOWN BARB LEFT HARPOON
+2952	LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953	RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954	UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955	DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956	LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957	RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958	UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959	DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A	LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B	RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C	UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D	DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E	LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F	RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960	UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961	DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962	LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963	UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964	RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965	DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966	LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967	LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968	RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969	RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A	LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B	LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C	RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D	RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E	UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F	DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970	RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+	x (superset of - 2283)
+2971	EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972	TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973	LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974	RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975	RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976	LESS-THAN ABOVE LEFTWARDS ARROW
+2977	LEFTWARDS ARROW THROUGH LESS-THAN
+2978	GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979	SUBSET ABOVE RIGHTWARDS ARROW
+297A	LEFTWARDS ARROW THROUGH SUBSET
+297B	SUPERSET ABOVE LEFTWARDS ARROW
+@		Fish tails
+297C	LEFT FISH TAIL
+297D	RIGHT FISH TAIL
+297E	UP FISH TAIL
+297F	DOWN FISH TAIL
+@@	2980	Miscellaneous Mathematical Symbols-B	29FF
+@		Miscellaneous mathematical symbols
+2980	TRIPLE VERTICAL BAR DELIMITER
+	x (triple vertical bar binary relation - 2AF4)
+	x (large triple vertical bar operator - 2AFC)
+2981	Z NOTATION SPOT
+	* medium-small-sized black circle
+	x (bullet operator - 2219)
+	x (black circle - 25CF)
+2982	Z NOTATION TYPE COLON
+	x (tibetan sign rnam bcad - 0F7F)
+@		Brackets
+2983	LEFT WHITE CURLY BRACKET
+2984	RIGHT WHITE CURLY BRACKET
+2985	LEFT WHITE PARENTHESIS
+	x (fullwidth left white parenthesis - FF5F)
+2986	RIGHT WHITE PARENTHESIS
+	* used for Bourbakist intervals
+	x (fullwidth right white parenthesis - FF60)
+2987	Z NOTATION LEFT IMAGE BRACKET
+2988	Z NOTATION RIGHT IMAGE BRACKET
+2989	Z NOTATION LEFT BINDING BRACKET
+298A	Z NOTATION RIGHT BINDING BRACKET
+298B	LEFT SQUARE BRACKET WITH UNDERBAR
+298C	RIGHT SQUARE BRACKET WITH UNDERBAR
+298D	LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E	RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F	LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990	RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991	LEFT ANGLE BRACKET WITH DOT
+2992	RIGHT ANGLE BRACKET WITH DOT
+2993	LEFT ARC LESS-THAN BRACKET
+2994	RIGHT ARC GREATER-THAN BRACKET
+2995	DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996	DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997	LEFT BLACK TORTOISE SHELL BRACKET
+	x (left tortoise shell bracket - 3014)
+	x (left white tortoise shell bracket - 3018)
+2998	RIGHT BLACK TORTOISE SHELL BRACKET
+@		Fences
+2999	DOTTED FENCE
+	* four close dots vertical
+299A	VERTICAL ZIGZAG LINE
+	x (wavy line - 2307)
+@		Angles
+299B	MEASURED ANGLE OPENING LEFT
+	x (measured angle - 2221)
+299C	RIGHT ANGLE VARIANT WITH SQUARE
+	x (right angle - 221F)
+299D	MEASURED RIGHT ANGLE WITH DOT
+299E	ANGLE WITH S INSIDE
+299F	ACUTE ANGLE
+29A0	SPHERICAL ANGLE OPENING LEFT
+	x (spherical angle - 2222)
+29A1	SPHERICAL ANGLE OPENING UP
+29A2	TURNED ANGLE
+	x (angle - 2220)
+29A3	REVERSED ANGLE
+29A4	ANGLE WITH UNDERBAR
+29A5	REVERSED ANGLE WITH UNDERBAR
+29A6	OBLIQUE ANGLE OPENING UP
+29A7	OBLIQUE ANGLE OPENING DOWN
+29A8	MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9	MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA	MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB	MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC	MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD	MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE	MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF	MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+@		Empty sets
+29B0	REVERSED EMPTY SET
+	x (empty set - 2205)
+	x (apl functional symbol circle backslash - 2349)
+29B1	EMPTY SET WITH OVERBAR
+29B2	EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3	EMPTY SET WITH RIGHT ARROW ABOVE
+29B4	EMPTY SET WITH LEFT ARROW ABOVE
+@		Circle symbols
+29B5	CIRCLE WITH HORIZONTAL BAR
+	x (circled minus - 2296)
+29B6	CIRCLED VERTICAL BAR
+29B7	CIRCLED PARALLEL
+29B8	CIRCLED REVERSE SOLIDUS
+29B9	CIRCLED PERPENDICULAR
+29BA	CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB	CIRCLE WITH SUPERIMPOSED X
+	x (circled times - 2297)
+29BC	CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD	UP ARROW THROUGH CIRCLE
+29BE	CIRCLED WHITE BULLET
+	x (circled ring operator - 229A)
+	x (apl functional symbol circle jot - 233E)
+	x (bullseye - 25CE)
+29BF	CIRCLED BULLET
+	* forms part of a graduated set of circles with enclosed black circle of different sizes
+	x (circled dot operator - 2299)
+	x (fisheye - 25C9)
+	x (n-ary circled dot operator - 2A00)
+29C0	CIRCLED LESS-THAN
+29C1	CIRCLED GREATER-THAN
+29C2	CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3	CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+@		Square symbols
+29C4	SQUARED RISING DIAGONAL SLASH
+	x (apl functional symbol quad slash - 2341)
+	x (masu mark - 303C)
+29C5	SQUARED FALLING DIAGONAL SLASH
+	x (apl functional symbol quad backslash - 2342)
+29C6	SQUARED ASTERISK
+29C7	SQUARED SMALL CIRCLE
+	x (apl functional symbol quad jot - 233B)
+29C8	SQUARED SQUARE
+29C9	TWO JOINED SQUARES
+@		Triangle symbols
+29CA	TRIANGLE WITH DOT ABOVE
+29CB	TRIANGLE WITH UNDERBAR
+29CC	S IN TRIANGLE
+29CD	TRIANGLE WITH SERIFS AT BOTTOM
+	x (white up-pointing triangle - 25B3)
+29CE	RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF	LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0	VERTICAL BAR BESIDE RIGHT TRIANGLE
+@		Bowtie symbols
+29D1	BOWTIE WITH LEFT HALF BLACK
+	x (bowtie - 22C8)
+29D2	BOWTIE WITH RIGHT HALF BLACK
+29D3	BLACK BOWTIE
+29D4	TIMES WITH LEFT HALF BLACK
+	x (left normal factor semidirect product - 22C9)
+29D5	TIMES WITH RIGHT HALF BLACK
+	x (right normal factor semidirect product - 22CA)
+29D6	WHITE HOURGLASS
+	= vertical bowtie
+	= white framus
+	x (hourglass - 231B)
+29D7	BLACK HOURGLASS
+@		Fences
+29D8	LEFT WIGGLY FENCE
+	x (presentation form for vertical wavy low line - FE34)
+29D9	RIGHT WIGGLY FENCE
+29DA	LEFT DOUBLE WIGGLY FENCE
+29DB	RIGHT DOUBLE WIGGLY FENCE
+@		Miscellaneous mathematical symbols
+29DC	INCOMPLETE INFINITY
+	= ISOtech entity &iinfin;
+	x (infinity - 221E)
+29DD	TIE OVER INFINITY
+29DE	INFINITY NEGATED WITH VERTICAL BAR
+29DF	DOUBLE-ENDED MULTIMAP
+	x (multimap - 22B8)
+29E0	SQUARE WITH CONTOURED OUTLINE
+	= D'Alembertian
+	x (lower right drop-shadowed white square - 274F)
+29E1	INCREASES AS
+	x (normal subgroup of or equal to - 22B4)
+29E2	SHUFFLE PRODUCT
+	x (z notation bag membership - 22FF)
+@		Relations
+29E3	EQUALS SIGN AND SLANTED PARALLEL
+	x (number sign - 0023)
+	x (equal and parallel to - 22D5)
+29E4	EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5	IDENTICAL TO AND SLANTED PARALLEL
+	x (triple horizontal bar with double vertical stroke - 2A68)
+29E6	GLEICH STARK
+	= tautological equivalent
+@		Miscellaneous mathematical symbols
+29E7	THERMODYNAMIC
+	* vertical bar crossed by two horizontals
+	x (not equal to - 2260)
+29E8	DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+	x (up-pointing triangle with left half black - 25ED)
+29E9	DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+	x (up-pointing triangle with right half black - 25EE)
+29EA	BLACK DIAMOND WITH DOWN ARROW
+29EB	BLACK LOZENGE
+	x (lozenge - 25CA)
+29EC	WHITE CIRCLE WITH DOWN ARROW
+29ED	BLACK CIRCLE WITH DOWN ARROW
+@		Error bar symbols
+29EE	ERROR-BARRED WHITE SQUARE
+29EF	ERROR-BARRED BLACK SQUARE
+29F0	ERROR-BARRED WHITE DIAMOND
+29F1	ERROR-BARRED BLACK DIAMOND
+29F2	ERROR-BARRED WHITE CIRCLE
+29F3	ERROR-BARRED BLACK CIRCLE
+@		Miscellaneous mathematical symbols
+29F4	RULE-DELAYED
+	= colon right arrow
+29F5	REVERSE SOLIDUS OPERATOR
+	x (reverse solidus - 005C)
+	x (set minus - 2216)
+29F6	SOLIDUS WITH OVERBAR
+29F7	REVERSE SOLIDUS WITH HORIZONTAL STROKE
+@		Large operators
+29F8	BIG SOLIDUS
+	x (division slash - 2215)
+29F9	BIG REVERSE SOLIDUS
+	= z notation schema hiding
+	x (set minus - 2216)
+@		Specialized plus sign operators
+29FA	DOUBLE PLUS
+29FB	TRIPLE PLUS
+@		Brackets
+29FC	LEFT-POINTING CURVED ANGLE BRACKET
+	x (precedes - 227A)
+	x (left-pointing angle bracket - 2329)
+29FD	RIGHT-POINTING CURVED ANGLE BRACKET
+	x (succeeds - 227B)
+	x (right-pointing angle bracket - 232A)
+@		Miscellaneous mathematical symbols
+29FE	TINY
+	x (plus sign - 002B)
+29FF	MINY
+	x (minus sign - 2212)
+@@	2A00	Supplemental Mathematical Operators	2AFF
+@		N-ary operators
+2A00	N-ARY CIRCLED DOT OPERATOR
+	x (circled dot operator - 2299)
+	x (fisheye - 25C9)
+2A01	N-ARY CIRCLED PLUS OPERATOR
+	x (circled plus - 2295)
+2A02	N-ARY CIRCLED TIMES OPERATOR
+	x (circled times - 2297)
+2A03	N-ARY UNION OPERATOR WITH DOT
+2A04	N-ARY UNION OPERATOR WITH PLUS
+	x (multiset union - 228E)
+2A05	N-ARY SQUARE INTERSECTION OPERATOR
+	x (square cap - 2293)
+2A06	N-ARY SQUARE UNION OPERATOR
+	x (square cup - 2294)
+2A07	TWO LOGICAL AND OPERATOR
+	= merge
+	x (two intersecting logical and - 2A55)
+2A08	TWO LOGICAL OR OPERATOR
+	x (two intersecting logical or - 2A56)
+2A09	N-ARY TIMES OPERATOR
+	x (multiplication sign - 00D7)
+@		Summations and integrals
+2A0A	MODULO TWO SUM
+	x (n-ary summation - 2211)
+2A0B	SUMMATION WITH INTEGRAL
+2A0C	QUADRUPLE INTEGRAL OPERATOR
+	x (triple integral - 222D)
+	# 222B 222B 222B 222B
+2A0D	FINITE PART INTEGRAL
+2A0E	INTEGRAL WITH DOUBLE STROKE
+2A0F	INTEGRAL AVERAGE WITH SLASH
+2A10	CIRCULATION FUNCTION
+2A11	ANTICLOCKWISE INTEGRATION
+2A12	LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13	LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14	LINE INTEGRATION NOT INCLUDING THE POLE
+2A15	INTEGRAL AROUND A POINT OPERATOR
+	x (contour integral - 222E)
+2A16	QUATERNION INTEGRAL OPERATOR
+2A17	INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18	INTEGRAL WITH TIMES SIGN
+2A19	INTEGRAL WITH INTERSECTION
+2A1A	INTEGRAL WITH UNION
+2A1B	INTEGRAL WITH OVERBAR
+	= upper integral
+2A1C	INTEGRAL WITH UNDERBAR
+	= lower integral
+@		Miscellaneous large operators
+2A1D	JOIN
+	= large bowtie
+	* relational database theory
+	x (bowtie - 22C8)
+	x (full outer join - 27D7)
+2A1E	LARGE LEFT TRIANGLE OPERATOR
+	* relational database theory
+	x (white left-pointing triangle - 25C1)
+2A1F	Z NOTATION SCHEMA COMPOSITION
+	x (z notation relational composition - 2A3E)
+2A20	Z NOTATION SCHEMA PIPING
+	x (much greater-than - 226B)
+2A21	Z NOTATION SCHEMA PROJECTION
+	x (upwards harpoon with barb rightwards - 21BE)
+@		Plus and minus sign operators
+2A22	PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23	PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24	PLUS SIGN WITH TILDE ABOVE
+	= positive difference or sum
+2A25	PLUS SIGN WITH DOT BELOW
+	x (dot plus - 2214)
+2A26	PLUS SIGN WITH TILDE BELOW
+	= sum or positive difference
+2A27	PLUS SIGN WITH SUBSCRIPT TWO
+	= nim-addition
+2A28	PLUS SIGN WITH BLACK TRIANGLE
+2A29	MINUS SIGN WITH COMMA ABOVE
+2A2A	MINUS SIGN WITH DOT BELOW
+	x (dot minus - 2238)
+2A2B	MINUS SIGN WITH FALLING DOTS
+2A2C	MINUS SIGN WITH RISING DOTS
+2A2D	PLUS SIGN IN LEFT HALF CIRCLE
+2A2E	PLUS SIGN IN RIGHT HALF CIRCLE
+@		Multiplication and division sign operators
+2A2F	VECTOR OR CROSS PRODUCT
+	x (multiplication sign - 00D7)
+2A30	MULTIPLICATION SIGN WITH DOT ABOVE
+2A31	MULTIPLICATION SIGN WITH UNDERBAR
+2A32	SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33	SMASH PRODUCT
+2A34	MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35	MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36	CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37	MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38	CIRCLED DIVISION SIGN
+@		Miscellaneous mathematical operators
+2A39	PLUS SIGN IN TRIANGLE
+2A3A	MINUS SIGN IN TRIANGLE
+2A3B	MULTIPLICATION SIGN IN TRIANGLE
+2A3C	INTERIOR PRODUCT
+	x (right floor - 230B)
+2A3D	RIGHTHAND INTERIOR PRODUCT
+	x (left floor - 230A)
+	x (turned not sign - 2319)
+2A3E	Z NOTATION RELATIONAL COMPOSITION
+	x (z notation schema composition - 2A1F)
+2A3F	AMALGAMATION OR COPRODUCT
+	x (n-ary coproduct - 2210)
+@		Intersections and unions
+2A40	INTERSECTION WITH DOT
+	x (logical and - 2227)
+	x (and with dot - 27D1)
+2A41	UNION WITH MINUS SIGN
+	= z notation bag subtraction
+	x (multiset union - 228E)
+2A42	UNION WITH OVERBAR
+2A43	INTERSECTION WITH OVERBAR
+2A44	INTERSECTION WITH LOGICAL AND
+2A45	UNION WITH LOGICAL OR
+2A46	UNION ABOVE INTERSECTION
+2A47	INTERSECTION ABOVE UNION
+2A48	UNION ABOVE BAR ABOVE INTERSECTION
+2A49	INTERSECTION ABOVE BAR ABOVE UNION
+2A4A	UNION BESIDE AND JOINED WITH UNION
+2A4B	INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C	CLOSED UNION WITH SERIFS
+	x (union - 222A)
+2A4D	CLOSED INTERSECTION WITH SERIFS
+	x (intersection - 2229)
+2A4E	DOUBLE SQUARE INTERSECTION
+2A4F	DOUBLE SQUARE UNION
+2A50	CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+@		Logical ands and ors
+2A51	LOGICAL AND WITH DOT ABOVE
+2A52	LOGICAL OR WITH DOT ABOVE
+2A53	DOUBLE LOGICAL AND
+2A54	DOUBLE LOGICAL OR
+2A55	TWO INTERSECTING LOGICAL AND
+	x (two logical and operator - 2A07)
+2A56	TWO INTERSECTING LOGICAL OR
+	x (two logical or operator - 2A08)
+2A57	SLOPING LARGE OR
+2A58	SLOPING LARGE AND
+2A59	LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A	LOGICAL AND WITH MIDDLE STEM
+2A5B	LOGICAL OR WITH MIDDLE STEM
+2A5C	LOGICAL AND WITH HORIZONTAL DASH
+2A5D	LOGICAL OR WITH HORIZONTAL DASH
+2A5E	LOGICAL AND WITH DOUBLE OVERBAR
+	x (perspective - 2306)
+2A5F	LOGICAL AND WITH UNDERBAR
+2A60	LOGICAL AND WITH DOUBLE UNDERBAR
+	x (estimates - 2259)
+2A61	SMALL VEE WITH UNDERBAR
+	x (equiangular to - 225A)
+2A62	LOGICAL OR WITH DOUBLE OVERBAR
+2A63	LOGICAL OR WITH DOUBLE UNDERBAR
+	x (equiangular to - 225A)
+@		Miscellaneous mathematical operators
+2A64	Z NOTATION DOMAIN ANTIRESTRICTION
+2A65	Z NOTATION RANGE ANTIRESTRICTION
+	x (conical taper - 2332)
+@		Relational operators
+2A66	EQUALS SIGN WITH DOT BELOW
+	x (approaches the limit - 2250)
+2A67	IDENTICAL WITH DOT ABOVE
+2A68	TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+	= identical and parallel to
+	x (equal and parallel to - 22D5)
+	x (identical to and slanted parallel - 29E5)
+2A69	TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A	TILDE OPERATOR WITH DOT ABOVE
+2A6B	TILDE OPERATOR WITH RISING DOTS
+	x (homothetic - 223B)
+2A6C	SIMILAR MINUS SIMILAR
+2A6D	CONGRUENT WITH DOT ABOVE
+	x (approximately equal to - 2245)
+2A6E	EQUALS WITH ASTERISK
+	x (star equals - 225B)
+2A6F	ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70	APPROXIMATELY EQUAL OR EQUAL TO
+2A71	EQUALS SIGN ABOVE PLUS SIGN
+	* black stands slightly better (chess notation)
+2A72	PLUS SIGN ABOVE EQUALS SIGN
+	* white stands slightly better (chess notation)
+2A73	EQUALS SIGN ABOVE TILDE OPERATOR
+2A74	DOUBLE COLON EQUAL
+	# 003A 003A 003D
+2A75	TWO CONSECUTIVE EQUALS SIGNS
+	# 003D 003D
+2A76	THREE CONSECUTIVE EQUALS SIGNS
+	# 003D 003D 003D
+2A77	EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78	EQUIVALENT WITH FOUR DOTS ABOVE
+2A79	LESS-THAN WITH CIRCLE INSIDE
+2A7A	GREATER-THAN WITH CIRCLE INSIDE
+2A7B	LESS-THAN WITH QUESTION MARK ABOVE
+2A7C	GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D	LESS-THAN OR SLANTED EQUAL TO
+	x (less-than or equal to - 2264)
+2A7E	GREATER-THAN OR SLANTED EQUAL TO
+	x (greater-than or equal to - 2265)
+2A7F	LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80	GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81	LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82	GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83	LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84	GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85	LESS-THAN OR APPROXIMATE
+2A86	GREATER-THAN OR APPROXIMATE
+2A87	LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+	x (less-than but not equal to - 2268)
+2A88	GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+	x (greater-than but not equal to - 2269)
+2A89	LESS-THAN AND NOT APPROXIMATE
+2A8A	GREATER-THAN AND NOT APPROXIMATE
+2A8B	LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+	x (less-than equal to or greater-than - 22DA)
+2A8C	GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+	x (greater-than equal to or less-than - 22DB)
+2A8D	LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E	GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F	LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90	GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91	LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92	GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93	LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94	GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95	SLANTED EQUAL TO OR LESS-THAN
+	x (equal to or less-than - 22DC)
+2A96	SLANTED EQUAL TO OR GREATER-THAN
+	x (equal to or greater-than - 22DD)
+2A97	SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98	SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99	DOUBLE-LINE EQUAL TO OR LESS-THAN
+	x (equal to or less-than - 22DC)
+2A9A	DOUBLE-LINE EQUAL TO OR GREATER-THAN
+	x (equal to or greater-than - 22DD)
+2A9B	DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C	DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D	SIMILAR OR LESS-THAN
+2A9E	SIMILAR OR GREATER-THAN
+2A9F	SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0	SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1	DOUBLE NESTED LESS-THAN
+	= absolute continuity
+	x (much less-than - 226A)
+2AA2	DOUBLE NESTED GREATER-THAN
+	x (much greater-than - 226B)
+2AA3	DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4	GREATER-THAN OVERLAPPING LESS-THAN
+2AA5	GREATER-THAN BESIDE LESS-THAN
+2AA6	LESS-THAN CLOSED BY CURVE
+2AA7	GREATER-THAN CLOSED BY CURVE
+2AA8	LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9	GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA	SMALLER THAN
+2AAB	LARGER THAN
+2AAC	SMALLER THAN OR EQUAL TO
+2AAD	LARGER THAN OR EQUAL TO
+2AAE	EQUALS SIGN WITH BUMPY ABOVE
+	x (difference between - 224F)
+2AAF	PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+	x (precedes or equal to - 227C)
+2AB0	SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+	x (succeeds or equal to - 227D)
+2AB1	PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2	SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3	PRECEDES ABOVE EQUALS SIGN
+2AB4	SUCCEEDS ABOVE EQUALS SIGN
+2AB5	PRECEDES ABOVE NOT EQUAL TO
+2AB6	SUCCEEDS ABOVE NOT EQUAL TO
+2AB7	PRECEDES ABOVE ALMOST EQUAL TO
+2AB8	SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9	PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA	SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB	DOUBLE PRECEDES
+2ABC	DOUBLE SUCCEEDS
+@		Subset and superset relations
+2ABD	SUBSET WITH DOT
+2ABE	SUPERSET WITH DOT
+2ABF	SUBSET WITH PLUS SIGN BELOW
+2AC0	SUPERSET WITH PLUS SIGN BELOW
+2AC1	SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2	SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3	SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4	SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5	SUBSET OF ABOVE EQUALS SIGN
+2AC6	SUPERSET OF ABOVE EQUALS SIGN
+2AC7	SUBSET OF ABOVE TILDE OPERATOR
+2AC8	SUPERSET OF ABOVE TILDE OPERATOR
+2AC9	SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA	SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB	SUBSET OF ABOVE NOT EQUAL TO
+2ACC	SUPERSET OF ABOVE NOT EQUAL TO
+2ACD	SQUARE LEFT OPEN BOX OPERATOR
+2ACE	SQUARE RIGHT OPEN BOX OPERATOR
+2ACF	CLOSED SUBSET
+	x (subset of - 2282)
+2AD0	CLOSED SUPERSET
+	x (superset of - 2283)
+2AD1	CLOSED SUBSET OR EQUAL TO
+2AD2	CLOSED SUPERSET OR EQUAL TO
+2AD3	SUBSET ABOVE SUPERSET
+2AD4	SUPERSET ABOVE SUBSET
+2AD5	SUBSET ABOVE SUBSET
+2AD6	SUPERSET ABOVE SUPERSET
+2AD7	SUPERSET BESIDE SUBSET
+2AD8	SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+@		Forks
+2AD9	ELEMENT OF OPENING DOWNWARDS
+	x (element of - 2208)
+	x (element of opening upwards - 27D2)
+2ADA	PITCHFORK WITH TEE TOP
+	x (pitchfork - 22D4)
+2ADB	TRANSVERSAL INTERSECTION
+	x (pitchfork - 22D4)
+2ADC	FORKING (not independent)
+	= not independent
+	* an equational logic symbol, not a computing science symbol
+	* non-independence (original concept) is related to forking
+	: 2ADD 0338
+2ADD	NONFORKING (independent)
+	= independent
+	* an equational logic symbol, not a computing science symbol
+	* independence (original concept) is related to non-forking
+@		Tacks and turnstiles
+2ADE	SHORT LEFT TACK
+	x (left tack - 22A3)
+2ADF	SHORT DOWN TACK
+	x (down tack - 22A4)
+2AE0	SHORT UP TACK
+	x (up tack - 22A5)
+2AE1	PERPENDICULAR WITH S
+2AE2	VERTICAL BAR TRIPLE RIGHT TURNSTILE
+	= ordinarily satisfies
+2AE3	DOUBLE VERTICAL BAR LEFT TURNSTILE
+	x (forces - 22A9)
+2AE4	VERTICAL BAR DOUBLE LEFT TURNSTILE
+	x (true - 22A8)
+2AE5	DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6	LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+	x (forces - 22A9)
+2AE7	SHORT DOWN TACK WITH OVERBAR
+	x (down tack - 22A4)
+	x (apl functional symbol up tack overbar - 2351)
+2AE8	SHORT UP TACK WITH UNDERBAR
+	x (up tack - 22A5)
+	x (apl functional symbol down tack underbar - 234A)
+2AE9	SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA	DOUBLE DOWN TACK
+2AEB	DOUBLE UP TACK
+	= independence
+	* probability theory
+2AEC	DOUBLE STROKE NOT SIGN
+	x (not sign - 00AC)
+2AED	REVERSED DOUBLE STROKE NOT SIGN
+	x (reversed not sign - 2310)
+@		Vertical line operators
+2AEE	DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+	x (does not divide - 2224)
+2AEF	VERTICAL LINE WITH CIRCLE ABOVE
+2AF0	VERTICAL LINE WITH CIRCLE BELOW
+2AF1	DOWN TACK WITH CIRCLE BELOW
+	= necessarily satisfies
+	x (up tack with circle above - 27DF)
+2AF2	PARALLEL WITH HORIZONTAL STROKE
+	x (not parallel to - 2226)
+2AF3	PARALLEL WITH TILDE OPERATOR
+2AF4	TRIPLE VERTICAL BAR BINARY RELATION
+	= interleave
+	x (triple vertical bar delimiter - 2980)
+2AF5	TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+@		Miscellaneous mathematical operator
+2AF6	TRIPLE COLON OPERATOR
+	* logic
+	x (tricolon - 205D)
+	x (vertical ellipsis - 22EE)
+@		Relations
+2AF7	TRIPLE NESTED LESS-THAN
+	x (very much less-than - 22D8)
+2AF8	TRIPLE NESTED GREATER-THAN
+	x (very much greater-than - 22D9)
+2AF9	DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+	x (less-than over equal to - 2266)
+2AFA	DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+	x (greater-than over equal to - 2267)
+2AFB	TRIPLE SOLIDUS BINARY RELATION
+	x (triple vertical bar binary relation - 2AF4)
+@		Operators
+2AFC	LARGE TRIPLE VERTICAL BAR OPERATOR
+	* often n-ary
+	x (triple vertical bar binary relation - 2AF4)
+	x (triple vertical bar delimiter - 2980)
+2AFD	DOUBLE SOLIDUS OPERATOR
+	x (parallel to - 2225)
+2AFE	WHITE VERTICAL BAR
+	= Dijkstra choice
+2AFF	N-ARY WHITE VERTICAL BAR
+	= n-ary Dijkstra choice
+@@	2B00	Miscellaneous Symbols and Arrows	2BFF
+@		White and black arrows
+@+		Other white and black arrows to complete this set can be found in the Arrows and Dingbats blocks.
+2B00	NORTH EAST WHITE ARROW
+2B01	NORTH WEST WHITE ARROW
+2B02	SOUTH EAST WHITE ARROW
+2B03	SOUTH WEST WHITE ARROW
+2B04	LEFT RIGHT WHITE ARROW
+2B05	LEFTWARDS BLACK ARROW
+2B06	UPWARDS BLACK ARROW
+2B07	DOWNWARDS BLACK ARROW
+2B08	NORTH EAST BLACK ARROW
+2B09	NORTH WEST BLACK ARROW
+2B0A	SOUTH EAST BLACK ARROW
+2B0B	SOUTH WEST BLACK ARROW
+2B0C	LEFT RIGHT BLACK ARROW
+2B0D	UP DOWN BLACK ARROW
+@		Arrows with bent tips
+2B0E	RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F	RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10	LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11	LEFTWARDS ARROW WITH TIP UPWARDS
+@		Squares
+2B12	SQUARE WITH TOP HALF BLACK
+	x (square with left half black - 25E7)
+2B13	SQUARE WITH BOTTOM HALF BLACK
+@@	2C00	Glagolitic	2C5F
+@		Capital letters
+2C00	GLAGOLITIC CAPITAL LETTER AZU
+2C01	GLAGOLITIC CAPITAL LETTER BUKY
+2C02	GLAGOLITIC CAPITAL LETTER VEDE
+2C03	GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C04	GLAGOLITIC CAPITAL LETTER DOBRO
+2C05	GLAGOLITIC CAPITAL LETTER YESTU
+2C06	GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C07	GLAGOLITIC CAPITAL LETTER DZELO
+2C08	GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C09	GLAGOLITIC CAPITAL LETTER IZHE
+2C0A	GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C0B	GLAGOLITIC CAPITAL LETTER I
+2C0C	GLAGOLITIC CAPITAL LETTER DJERVI
+2C0D	GLAGOLITIC CAPITAL LETTER KAKO
+2C0E	GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C0F	GLAGOLITIC CAPITAL LETTER MYSLITE
+2C10	GLAGOLITIC CAPITAL LETTER NASHI
+2C11	GLAGOLITIC CAPITAL LETTER ONU
+2C12	GLAGOLITIC CAPITAL LETTER POKOJI
+2C13	GLAGOLITIC CAPITAL LETTER RITSI
+2C14	GLAGOLITIC CAPITAL LETTER SLOVO
+2C15	GLAGOLITIC CAPITAL LETTER TVRIDO
+2C16	GLAGOLITIC CAPITAL LETTER UKU
+2C17	GLAGOLITIC CAPITAL LETTER FRITU
+2C18	GLAGOLITIC CAPITAL LETTER HERU
+2C19	GLAGOLITIC CAPITAL LETTER OTU
+2C1A	GLAGOLITIC CAPITAL LETTER PE
+2C1B	GLAGOLITIC CAPITAL LETTER SHTA
+2C1C	GLAGOLITIC CAPITAL LETTER TSI
+2C1D	GLAGOLITIC CAPITAL LETTER CHRIVI
+2C1E	GLAGOLITIC CAPITAL LETTER SHA
+2C1F	GLAGOLITIC CAPITAL LETTER YERU
+2C20	GLAGOLITIC CAPITAL LETTER YERI
+2C21	GLAGOLITIC CAPITAL LETTER YATI
+2C22	GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C23	GLAGOLITIC CAPITAL LETTER YU
+2C24	GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C25	GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C26	GLAGOLITIC CAPITAL LETTER YO
+2C27	GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C28	GLAGOLITIC CAPITAL LETTER BIG YUS
+2C29	GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C2A	GLAGOLITIC CAPITAL LETTER FITA
+2C2B	GLAGOLITIC CAPITAL LETTER IZHITSA
+2C2C	GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C2D	GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C2E	GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+@		Small letters
+2C30	GLAGOLITIC SMALL LETTER AZU
+2C31	GLAGOLITIC SMALL LETTER BUKY
+2C32	GLAGOLITIC SMALL LETTER VEDE
+2C33	GLAGOLITIC SMALL LETTER GLAGOLI
+2C34	GLAGOLITIC SMALL LETTER DOBRO
+2C35	GLAGOLITIC SMALL LETTER YESTU
+2C36	GLAGOLITIC SMALL LETTER ZHIVETE
+2C37	GLAGOLITIC SMALL LETTER DZELO
+2C38	GLAGOLITIC SMALL LETTER ZEMLJA
+2C39	GLAGOLITIC SMALL LETTER IZHE
+2C3A	GLAGOLITIC SMALL LETTER INITIAL IZHE
+2C3B	GLAGOLITIC SMALL LETTER I
+2C3C	GLAGOLITIC SMALL LETTER DJERVI
+2C3D	GLAGOLITIC SMALL LETTER KAKO
+2C3E	GLAGOLITIC SMALL LETTER LJUDIJE
+2C3F	GLAGOLITIC SMALL LETTER MYSLITE
+2C40	GLAGOLITIC SMALL LETTER NASHI
+2C41	GLAGOLITIC SMALL LETTER ONU
+2C42	GLAGOLITIC SMALL LETTER POKOJI
+2C43	GLAGOLITIC SMALL LETTER RITSI
+2C44	GLAGOLITIC SMALL LETTER SLOVO
+2C45	GLAGOLITIC SMALL LETTER TVRIDO
+2C46	GLAGOLITIC SMALL LETTER UKU
+2C47	GLAGOLITIC SMALL LETTER FRITU
+2C48	GLAGOLITIC SMALL LETTER HERU
+2C49	GLAGOLITIC SMALL LETTER OTU
+2C4A	GLAGOLITIC SMALL LETTER PE
+2C4B	GLAGOLITIC SMALL LETTER SHTA
+2C4C	GLAGOLITIC SMALL LETTER TSI
+2C4D	GLAGOLITIC SMALL LETTER CHRIVI
+2C4E	GLAGOLITIC SMALL LETTER SHA
+2C4F	GLAGOLITIC SMALL LETTER YERU
+2C50	GLAGOLITIC SMALL LETTER YERI
+2C51	GLAGOLITIC SMALL LETTER YATI
+2C52	GLAGOLITIC SMALL LETTER SPIDERY HA
+2C53	GLAGOLITIC SMALL LETTER YU
+2C54	GLAGOLITIC SMALL LETTER SMALL YUS
+2C55	GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C56	GLAGOLITIC SMALL LETTER YO
+2C57	GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C58	GLAGOLITIC SMALL LETTER BIG YUS
+2C59	GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C5A	GLAGOLITIC SMALL LETTER FITA
+2C5B	GLAGOLITIC SMALL LETTER IZHITSA
+2C5C	GLAGOLITIC SMALL LETTER SHTAPIC
+2C5D	GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C5E	GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+@@	2C80	Coptic	2CFF
+@+		Other Coptic letters derived from Demotic are encoded in the Greek and Coptic block.
+@		Bohairic Coptic letters
+2C80	COPTIC CAPITAL LETTER ALFA
+2C81	COPTIC SMALL LETTER ALFA
+2C82	COPTIC CAPITAL LETTER VIDA
+2C83	COPTIC SMALL LETTER VIDA
+2C84	COPTIC CAPITAL LETTER GAMMA
+2C85	COPTIC SMALL LETTER GAMMA
+2C86	COPTIC CAPITAL LETTER DALDA
+2C87	COPTIC SMALL LETTER DALDA
+2C88	COPTIC CAPITAL LETTER EIE
+2C89	COPTIC SMALL LETTER EIE
+2C8A	COPTIC CAPITAL LETTER SOU
+2C8B	COPTIC SMALL LETTER SOU
+2C8C	COPTIC CAPITAL LETTER ZATA
+2C8D	COPTIC SMALL LETTER ZATA
+2C8E	COPTIC CAPITAL LETTER HATE
+2C8F	COPTIC SMALL LETTER HATE
+2C90	COPTIC CAPITAL LETTER THETHE
+2C91	COPTIC SMALL LETTER THETHE
+2C92	COPTIC CAPITAL LETTER IAUDA
+2C93	COPTIC SMALL LETTER IAUDA
+2C94	COPTIC CAPITAL LETTER KAPA
+2C95	COPTIC SMALL LETTER KAPA
+2C96	COPTIC CAPITAL LETTER LAULA
+2C97	COPTIC SMALL LETTER LAULA
+2C98	COPTIC CAPITAL LETTER MI
+2C99	COPTIC SMALL LETTER MI
+2C9A	COPTIC CAPITAL LETTER NI
+2C9B	COPTIC SMALL LETTER NI
+2C9C	COPTIC CAPITAL LETTER KSI
+2C9D	COPTIC SMALL LETTER KSI
+2C9E	COPTIC CAPITAL LETTER O
+2C9F	COPTIC SMALL LETTER O
+2CA0	COPTIC CAPITAL LETTER PI
+2CA1	COPTIC SMALL LETTER PI
+2CA2	COPTIC CAPITAL LETTER RO
+2CA3	COPTIC SMALL LETTER RO
+2CA4	COPTIC CAPITAL LETTER SIMA
+2CA5	COPTIC SMALL LETTER SIMA
+2CA6	COPTIC CAPITAL LETTER TAU
+2CA7	COPTIC SMALL LETTER TAU
+2CA8	COPTIC CAPITAL LETTER UA
+2CA9	COPTIC SMALL LETTER UA
+2CAA	COPTIC CAPITAL LETTER FI
+2CAB	COPTIC SMALL LETTER FI
+2CAC	COPTIC CAPITAL LETTER KHI
+2CAD	COPTIC SMALL LETTER KHI
+2CAE	COPTIC CAPITAL LETTER PSI
+2CAF	COPTIC SMALL LETTER PSI
+2CB0	COPTIC CAPITAL LETTER OOU
+2CB1	COPTIC SMALL LETTER OOU
+@		Old Coptic and dialect letters
+2CB2	COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB3	COPTIC SMALL LETTER DIALECT-P ALEF
+2CB4	COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CB5	COPTIC SMALL LETTER OLD COPTIC AIN
+2CB6	COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2CB7	COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB8	COPTIC CAPITAL LETTER DIALECT-P KAPA
+2CB9	COPTIC SMALL LETTER DIALECT-P KAPA
+2CBA	COPTIC CAPITAL LETTER DIALECT-P NI
+2CBB	COPTIC SMALL LETTER DIALECT-P NI
+2CBC	COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2CBD	COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBE	COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CBF	COPTIC SMALL LETTER OLD COPTIC OOU
+2CC0	COPTIC CAPITAL LETTER SAMPI
+2CC1	COPTIC SMALL LETTER SAMPI
+2CC2	COPTIC CAPITAL LETTER CROSSED SHEI
+2CC3	COPTIC SMALL LETTER CROSSED SHEI
+2CC4	COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC5	COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC6	COPTIC CAPITAL LETTER OLD COPTIC ESH
+2CC7	COPTIC SMALL LETTER OLD COPTIC ESH
+2CC8	COPTIC CAPITAL LETTER AKHMIMIC KHEI
+2CC9	COPTIC SMALL LETTER AKHMIMIC KHEI
+2CCA	COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCB	COPTIC SMALL LETTER DIALECT-P HORI
+2CCC	COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCD	COPTIC SMALL LETTER OLD COPTIC HORI
+2CCE	COPTIC CAPITAL LETTER OLD COPTIC HA
+2CCF	COPTIC SMALL LETTER OLD COPTIC HA
+2CD0	COPTIC CAPITAL LETTER L-SHAPED HA
+2CD1	COPTIC SMALL LETTER L-SHAPED HA
+2CD2	COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD3	COPTIC SMALL LETTER OLD COPTIC HEI
+2CD4	COPTIC CAPITAL LETTER OLD COPTIC HAT
+2CD5	COPTIC SMALL LETTER OLD COPTIC HAT
+2CD6	COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+2CD7	COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD8	COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CD9	COPTIC SMALL LETTER OLD COPTIC DJA
+2CDA	COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDB	COPTIC SMALL LETTER OLD COPTIC SHIMA
+@		Old Nubian letters
+2CDC	COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+2CDD	COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDE	COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CDF	COPTIC SMALL LETTER OLD NUBIAN NGI
+2CE0	COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE1	COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE2	COPTIC CAPITAL LETTER OLD NUBIAN WAU
+2CE3	COPTIC SMALL LETTER OLD NUBIAN WAU
+@		Symbols
+2CE4	COPTIC SYMBOL KAI
+	x (greek kai symbol - 03D7)
+2CE5	COPTIC SYMBOL MI RO
+2CE6	COPTIC SYMBOL PI RO
+2CE7	COPTIC SYMBOL STAUROS
+2CE8	COPTIC SYMBOL TAU RO
+2CE9	COPTIC SYMBOL KHI RO
+	x (chi rho - 2627)
+2CEA	COPTIC SYMBOL SHIMA SIMA
+@		Old Nubian punctuation
+2CF9	COPTIC OLD NUBIAN FULL STOP
+2CFA	COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB	COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC	COPTIC OLD NUBIAN VERSE DIVIDER
+@		Numeric character
+2CFD	COPTIC FRACTION ONE HALF
+@		Punctuation
+2CFE	COPTIC FULL STOP
+2CFF	COPTIC MORPHOLOGICAL DIVIDER
+@@	2D00	Georgian Supplement	2D2F
+@		Small letters (Khutsuri)
+@+		This is the lowercase of the old ecclesiastical alphabet. See the Georgian block for uppercase Asomtavruli.
+2D00	GEORGIAN SMALL LETTER AN (Khutsuri)
+2D01	GEORGIAN SMALL LETTER BAN (Khutsuri)
+2D02	GEORGIAN SMALL LETTER GAN (Khutsuri)
+2D03	GEORGIAN SMALL LETTER DON (Khutsuri)
+2D04	GEORGIAN SMALL LETTER EN (Khutsuri)
+2D05	GEORGIAN SMALL LETTER VIN (Khutsuri)
+2D06	GEORGIAN SMALL LETTER ZEN (Khutsuri)
+2D07	GEORGIAN SMALL LETTER TAN (Khutsuri)
+2D08	GEORGIAN SMALL LETTER IN (Khutsuri)
+2D09	GEORGIAN SMALL LETTER KAN (Khutsuri)
+2D0A	GEORGIAN SMALL LETTER LAS (Khutsuri)
+2D0B	GEORGIAN SMALL LETTER MAN (Khutsuri)
+2D0C	GEORGIAN SMALL LETTER NAR (Khutsuri)
+2D0D	GEORGIAN SMALL LETTER ON (Khutsuri)
+2D0E	GEORGIAN SMALL LETTER PAR (Khutsuri)
+2D0F	GEORGIAN SMALL LETTER ZHAR (Khutsuri)
+2D10	GEORGIAN SMALL LETTER RAE (Khutsuri)
+2D11	GEORGIAN SMALL LETTER SAN (Khutsuri)
+2D12	GEORGIAN SMALL LETTER TAR (Khutsuri)
+2D13	GEORGIAN SMALL LETTER UN (Khutsuri)
+2D14	GEORGIAN SMALL LETTER PHAR (Khutsuri)
+2D15	GEORGIAN SMALL LETTER KHAR (Khutsuri)
+2D16	GEORGIAN SMALL LETTER GHAN (Khutsuri)
+2D17	GEORGIAN SMALL LETTER QAR (Khutsuri)
+2D18	GEORGIAN SMALL LETTER SHIN (Khutsuri)
+2D19	GEORGIAN SMALL LETTER CHIN (Khutsuri)
+2D1A	GEORGIAN SMALL LETTER CAN (Khutsuri)
+2D1B	GEORGIAN SMALL LETTER JIL (Khutsuri)
+2D1C	GEORGIAN SMALL LETTER CIL (Khutsuri)
+2D1D	GEORGIAN SMALL LETTER CHAR (Khutsuri)
+2D1E	GEORGIAN SMALL LETTER XAN (Khutsuri)
+2D1F	GEORGIAN SMALL LETTER JHAN (Khutsuri)
+2D20	GEORGIAN SMALL LETTER HAE (Khutsuri)
+2D21	GEORGIAN SMALL LETTER HE (Khutsuri)
+2D22	GEORGIAN SMALL LETTER HIE (Khutsuri)
+2D23	GEORGIAN SMALL LETTER WE (Khutsuri)
+2D24	GEORGIAN SMALL LETTER HAR (Khutsuri)
+2D25	GEORGIAN SMALL LETTER HOE (Khutsuri)
+@@	2D30	Tifinagh	2D7F
+@		Letters
+2D30	TIFINAGH LETTER YA
+2D31	TIFINAGH LETTER YAB
+2D32	TIFINAGH LETTER YABH
+2D33	TIFINAGH LETTER YAG
+2D34	TIFINAGH LETTER YAGHH
+2D35	TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36	TIFINAGH LETTER YAJ
+2D37	TIFINAGH LETTER YAD
+2D38	TIFINAGH LETTER YADH
+2D39	TIFINAGH LETTER YADD
+2D3A	TIFINAGH LETTER YADDH
+2D3B	TIFINAGH LETTER YEY
+2D3C	TIFINAGH LETTER YAF
+2D3D	TIFINAGH LETTER YAK
+2D3E	TIFINAGH LETTER TUAREG YAK
+2D3F	TIFINAGH LETTER YAKHH
+2D40	TIFINAGH LETTER YAH (Tuareg yab)
+	= Tuareg yab
+2D41	TIFINAGH LETTER BERBER ACADEMY YAH
+2D42	TIFINAGH LETTER TUAREG YAH
+2D43	TIFINAGH LETTER YAHH
+2D44	TIFINAGH LETTER YAA
+2D45	TIFINAGH LETTER YAKH
+2D46	TIFINAGH LETTER TUAREG YAKH
+2D47	TIFINAGH LETTER YAQ
+2D48	TIFINAGH LETTER TUAREG YAQ
+2D49	TIFINAGH LETTER YI
+2D4A	TIFINAGH LETTER YAZH
+2D4B	TIFINAGH LETTER AHAGGAR YAZH
+2D4C	TIFINAGH LETTER TUAREG YAZH
+2D4D	TIFINAGH LETTER YAL
+2D4E	TIFINAGH LETTER YAM
+2D4F	TIFINAGH LETTER YAN
+2D50	TIFINAGH LETTER TUAREG YAGN
+2D51	TIFINAGH LETTER TUAREG YANG
+2D52	TIFINAGH LETTER YAP
+2D53	TIFINAGH LETTER YU (Tuareg yaw)
+	= Tuareg yaw
+2D54	TIFINAGH LETTER YAR
+2D55	TIFINAGH LETTER YARR
+2D56	TIFINAGH LETTER YAGH
+2D57	TIFINAGH LETTER TUAREG YAGH
+2D58	TIFINAGH LETTER AYER YAGH (Adrar yaj)
+	= Adrar yaj
+2D59	TIFINAGH LETTER YAS
+2D5A	TIFINAGH LETTER YASS
+2D5B	TIFINAGH LETTER YASH
+2D5C	TIFINAGH LETTER YAT
+2D5D	TIFINAGH LETTER YATH
+2D5E	TIFINAGH LETTER YACH
+2D5F	TIFINAGH LETTER YATT
+2D60	TIFINAGH LETTER YAV
+2D61	TIFINAGH LETTER YAW
+2D62	TIFINAGH LETTER YAY
+2D63	TIFINAGH LETTER YAZ
+2D64	TIFINAGH LETTER TAWELLEMET YAZ (harpoon yaz)
+	= harpoon yaz
+2D65	TIFINAGH LETTER YAZZ
+@		Modifier letter
+2D6F	TIFINAGH MODIFIER LETTER LABIALIZATION MARK (tamatart)
+	= tamatart
+	# <super> 2D61
+@@	2D80	Ethiopic Extended	2DDF
+@		Syllables for Me'en
+2D80	ETHIOPIC SYLLABLE LOA
+2D81	ETHIOPIC SYLLABLE MOA
+2D82	ETHIOPIC SYLLABLE ROA
+2D83	ETHIOPIC SYLLABLE SOA
+2D84	ETHIOPIC SYLLABLE SHOA
+2D85	ETHIOPIC SYLLABLE BOA
+2D86	ETHIOPIC SYLLABLE TOA
+2D87	ETHIOPIC SYLLABLE COA
+2D88	ETHIOPIC SYLLABLE NOA
+2D89	ETHIOPIC SYLLABLE NYOA
+2D8A	ETHIOPIC SYLLABLE GLOTTAL OA
+2D8B	ETHIOPIC SYLLABLE ZOA
+2D8C	ETHIOPIC SYLLABLE DOA
+2D8D	ETHIOPIC SYLLABLE DDOA
+2D8E	ETHIOPIC SYLLABLE JOA
+2D8F	ETHIOPIC SYLLABLE THOA
+2D90	ETHIOPIC SYLLABLE CHOA
+2D91	ETHIOPIC SYLLABLE PHOA
+2D92	ETHIOPIC SYLLABLE POA
+@		Syllables for Blin
+2D93	ETHIOPIC SYLLABLE GGWA
+2D94	ETHIOPIC SYLLABLE GGWI
+2D95	ETHIOPIC SYLLABLE GGWEE
+2D96	ETHIOPIC SYLLABLE GGWE
+@		Syllables for Sebatbeit
+2DA0	ETHIOPIC SYLLABLE SSA
+2DA1	ETHIOPIC SYLLABLE SSU
+2DA2	ETHIOPIC SYLLABLE SSI
+2DA3	ETHIOPIC SYLLABLE SSAA
+2DA4	ETHIOPIC SYLLABLE SSEE
+2DA5	ETHIOPIC SYLLABLE SSE
+2DA6	ETHIOPIC SYLLABLE SSO
+2DA8	ETHIOPIC SYLLABLE CCA
+2DA9	ETHIOPIC SYLLABLE CCU
+2DAA	ETHIOPIC SYLLABLE CCI
+2DAB	ETHIOPIC SYLLABLE CCAA
+2DAC	ETHIOPIC SYLLABLE CCEE
+2DAD	ETHIOPIC SYLLABLE CCE
+2DAE	ETHIOPIC SYLLABLE CCO
+2DB0	ETHIOPIC SYLLABLE ZZA
+2DB1	ETHIOPIC SYLLABLE ZZU
+2DB2	ETHIOPIC SYLLABLE ZZI
+2DB3	ETHIOPIC SYLLABLE ZZAA
+2DB4	ETHIOPIC SYLLABLE ZZEE
+2DB5	ETHIOPIC SYLLABLE ZZE
+2DB6	ETHIOPIC SYLLABLE ZZO
+2DB8	ETHIOPIC SYLLABLE CCHA
+2DB9	ETHIOPIC SYLLABLE CCHU
+2DBA	ETHIOPIC SYLLABLE CCHI
+2DBB	ETHIOPIC SYLLABLE CCHAA
+2DBC	ETHIOPIC SYLLABLE CCHEE
+2DBD	ETHIOPIC SYLLABLE CCHE
+2DBE	ETHIOPIC SYLLABLE CCHO
+2DC0	ETHIOPIC SYLLABLE QYA
+2DC1	ETHIOPIC SYLLABLE QYU
+2DC2	ETHIOPIC SYLLABLE QYI
+2DC3	ETHIOPIC SYLLABLE QYAA
+2DC4	ETHIOPIC SYLLABLE QYEE
+2DC5	ETHIOPIC SYLLABLE QYE
+2DC6	ETHIOPIC SYLLABLE QYO
+2DC8	ETHIOPIC SYLLABLE KYA
+2DC9	ETHIOPIC SYLLABLE KYU
+2DCA	ETHIOPIC SYLLABLE KYI
+2DCB	ETHIOPIC SYLLABLE KYAA
+2DCC	ETHIOPIC SYLLABLE KYEE
+2DCD	ETHIOPIC SYLLABLE KYE
+2DCE	ETHIOPIC SYLLABLE KYO
+2DD0	ETHIOPIC SYLLABLE XYA
+2DD1	ETHIOPIC SYLLABLE XYU
+2DD2	ETHIOPIC SYLLABLE XYI
+2DD3	ETHIOPIC SYLLABLE XYAA
+2DD4	ETHIOPIC SYLLABLE XYEE
+2DD5	ETHIOPIC SYLLABLE XYE
+2DD6	ETHIOPIC SYLLABLE XYO
+2DD8	ETHIOPIC SYLLABLE GYA
+2DD9	ETHIOPIC SYLLABLE GYU
+2DDA	ETHIOPIC SYLLABLE GYI
+2DDB	ETHIOPIC SYLLABLE GYAA
+2DDC	ETHIOPIC SYLLABLE GYEE
+2DDD	ETHIOPIC SYLLABLE GYE
+2DDE	ETHIOPIC SYLLABLE GYO
+@@	2E00	Supplemental Punctuation	2E7F
+@		New Testament editorial symbols
+2E00	RIGHT ANGLE SUBSTITUTION MARKER
+2E01	RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02	LEFT SUBSTITUTION BRACKET
+2E03	RIGHT SUBSTITUTION BRACKET
+2E04	LEFT DOTTED SUBSTITUTION BRACKET
+2E05	RIGHT DOTTED SUBSTITUTION BRACKET
+2E06	RAISED INTERPOLATION MARKER
+2E07	RAISED DOTTED INTERPOLATION MARKER
+2E08	DOTTED TRANSPOSITION MARKER
+2E09	LEFT TRANSPOSITION BRACKET
+2E0A	RIGHT TRANSPOSITION BRACKET
+2E0B	RAISED SQUARE
+	* used as an opening raised omission bracket
+2E0C	LEFT RAISED OMISSION BRACKET
+	* used as an opening or closing raised omission bracket
+2E0D	RIGHT RAISED OMISSION BRACKET
+	* used as a closing or opening raised omission bracket
+@		Ancient Greek textual symbols
+2E0E	EDITORIAL CORONIS
+	x (greek koronis - 1FBD)
+2E0F	PARAGRAPHOS
+2E10	FORKED PARAGRAPHOS
+2E11	REVERSED FORKED PARAGRAPHOS
+2E12	HYPODIASTOLE
+2E13	DOTTED OBELOS
+	* glyph variants may look like '00F7' or '2238'
+	x (commercial minus sign - 2052)
+2E14	DOWNWARDS ANCORA
+2E15	UPWARDS ANCORA
+2E16	DOTTED RIGHT-POINTING ANGLE
+	= diple periestigmene
+@		Ancient Near-Eastern linguistic symbol
+2E17	DOUBLE OBLIQUE HYPHEN
+	* used in ancient Near-Eastern linguistics
+	* hyphen in Fraktur text uses 002D or 2010, but with a '2E17' glyph in Fraktur fonts
+	x (hyphen-minus - 002D)
+	x (equals sign - 003D)
+	x (hyphen - 2010)
+@		Brackets
+2E1C	LEFT LOW PARAPHRASE BRACKET
+2E1D	RIGHT LOW PARAPHRASE BRACKET
+	* used in N'Ko
+@@	2E80	CJK Radicals Supplement	2EFF
+@		CJK radicals supplement
+2E80	CJK RADICAL REPEAT
+2E81	CJK RADICAL CLIFF
+	x 5382
+2E82	CJK RADICAL SECOND ONE
+	x 4E5B
+2E83	CJK RADICAL SECOND TWO
+	x 4E5A
+2E84	CJK RADICAL SECOND THREE
+	x 4E59
+2E85	CJK RADICAL PERSON
+	* form used on left side
+	x 4EBB
+2E86	CJK RADICAL BOX
+	x 5182
+2E87	CJK RADICAL TABLE
+	x 51E0
+2E88	CJK RADICAL KNIFE ONE
+	* form used at top
+	x 5200
+2E89	CJK RADICAL KNIFE TWO
+	* form used on right side
+	x 5202
+2E8A	CJK RADICAL DIVINATION
+	* form used at top
+	x 535C
+2E8B	CJK RADICAL SEAL
+	* form used at bottom
+	x 353E
+2E8C	CJK RADICAL SMALL ONE
+	* form used at top
+	x 5C0F
+2E8D	CJK RADICAL SMALL TWO
+	* form used at top
+	x 5C0F
+2E8E	CJK RADICAL LAME ONE
+	x 5C22
+2E8F	CJK RADICAL LAME TWO
+	x 5C23
+2E90	CJK RADICAL LAME THREE
+	x 5C22
+2E91	CJK RADICAL LAME FOUR
+	x 5C23
+2E92	CJK RADICAL SNAKE
+	x 5DF3
+2E93	CJK RADICAL THREAD
+	x 5E7A
+2E94	CJK RADICAL SNOUT ONE
+	x 5F51
+2E95	CJK RADICAL SNOUT TWO
+	x 5F50
+2E96	CJK RADICAL HEART ONE
+	* form used on left side
+	x 5FC4
+2E97	CJK RADICAL HEART TWO
+	* form used at bottom
+	x 5FC3
+2E98	CJK RADICAL HAND
+	* form used on left side
+	x 624C
+2E99	CJK RADICAL RAP
+	* form used on right side
+	x 6535
+2E9B	CJK RADICAL CHOKE
+	x 65E1
+2E9C	CJK RADICAL SUN
+	x 65E5
+2E9D	CJK RADICAL MOON
+	x 6708
+2E9E	CJK RADICAL DEATH
+	x 6B7A
+2E9F	CJK RADICAL MOTHER
+	# 6BCD
+2EA0	CJK RADICAL CIVILIAN
+	x 6C11
+2EA1	CJK RADICAL WATER ONE
+	* form used on left side
+	x 6C35
+2EA2	CJK RADICAL WATER TWO
+	* form used (rarely) at bottom
+	x 6C3A
+2EA3	CJK RADICAL FIRE
+	* form used at bottom
+	x 706C
+2EA4	CJK RADICAL PAW ONE
+	* form used at top
+	x 722B
+2EA5	CJK RADICAL PAW TWO
+	* form used at top
+	x 722B
+2EA6	CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+	x 4E2C
+2EA7	CJK RADICAL COW
+	x 725B
+2EA8	CJK RADICAL DOG
+	* form used on left side
+	x 72AD
+2EA9	CJK RADICAL JADE
+	* form used on left side
+	x 738B
+2EAA	CJK RADICAL BOLT OF CLOTH
+	* form used on left side
+	x 758B
+2EAB	CJK RADICAL EYE
+	* form used at top
+	x (cjk radical net two - 2EB2)
+	x 76EE
+2EAC	CJK RADICAL SPIRIT ONE
+	x 793A
+2EAD	CJK RADICAL SPIRIT TWO
+	x 793B
+2EAE	CJK RADICAL BAMBOO
+	x 7AF9
+2EAF	CJK RADICAL SILK
+	* form used on left side
+	x 7CF9
+2EB0	CJK RADICAL C-SIMPLIFIED SILK
+	* form used on left side
+	x 7E9F
+2EB1	CJK RADICAL NET ONE
+	x 7F53
+2EB2	CJK RADICAL NET TWO
+	x (cjk radical eye - 2EAB)
+	x 7F52
+2EB3	CJK RADICAL NET THREE
+	x 7F51
+2EB4	CJK RADICAL NET FOUR
+	x 7F51
+2EB5	CJK RADICAL MESH
+	x 2626B
+2EB6	CJK RADICAL SHEEP
+	* form used on left side
+	x 7F8A
+2EB7	CJK RADICAL RAM
+	* form used at top
+	x 7F8A
+2EB8	CJK RADICAL EWE
+	x 7F8B
+2EB9	CJK RADICAL OLD
+	x 8002
+2EBA	CJK RADICAL BRUSH ONE
+	x 8080
+2EBB	CJK RADICAL BRUSH TWO
+	x 807F
+2EBC	CJK RADICAL MEAT
+	x 8089
+2EBD	CJK RADICAL MORTAR
+	x 81FC
+2EBE	CJK RADICAL GRASS ONE
+	x 8279
+2EBF	CJK RADICAL GRASS TWO
+	x 8279
+2EC0	CJK RADICAL GRASS THREE
+	x 8279
+2EC1	CJK RADICAL TIGER
+	x 864E
+2EC2	CJK RADICAL CLOTHES
+	* form used on left side
+	x 8864
+2EC3	CJK RADICAL WEST ONE
+	* form used at top
+	x 8980
+2EC4	CJK RADICAL WEST TWO
+	* form used on left side
+	x 897F
+2EC5	CJK RADICAL C-SIMPLIFIED SEE
+	x 89C1
+2EC6	CJK RADICAL SIMPLIFIED HORN
+	x 89D2
+2EC7	CJK RADICAL HORN
+	x 278B2
+2EC8	CJK RADICAL C-SIMPLIFIED SPEECH
+	x 8BA0
+2EC9	CJK RADICAL C-SIMPLIFIED SHELL
+	x 8D1D
+2ECA	CJK RADICAL FOOT
+	* form used on left side
+	x 8DB3
+2ECB	CJK RADICAL C-SIMPLIFIED CART
+	x 8F66
+2ECC	CJK RADICAL SIMPLIFIED WALK
+	x 8FB6
+2ECD	CJK RADICAL WALK ONE
+	x 8FB6
+2ECE	CJK RADICAL WALK TWO
+	x 8FB6
+2ECF	CJK RADICAL CITY
+	* form used on right side
+	x 9091
+2ED0	CJK RADICAL C-SIMPLIFIED GOLD
+	x 9485
+2ED1	CJK RADICAL LONG ONE
+	x 9577
+2ED2	CJK RADICAL LONG TWO
+	* form used on left side
+	x 9578
+2ED3	CJK RADICAL C-SIMPLIFIED LONG
+	x 957F
+2ED4	CJK RADICAL C-SIMPLIFIED GATE
+	x 95E8
+2ED5	CJK RADICAL MOUND ONE
+	x 961C
+	x 28E0F
+2ED6	CJK RADICAL MOUND TWO
+	* form used on left side
+	x 961D
+2ED7	CJK RADICAL RAIN
+	x 96E8
+2ED8	CJK RADICAL BLUE
+	x 9752
+2ED9	CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+	x 97E6
+2EDA	CJK RADICAL C-SIMPLIFIED LEAF
+	x 9875
+2EDB	CJK RADICAL C-SIMPLIFIED WIND
+	x 98CE
+2EDC	CJK RADICAL C-SIMPLIFIED FLY
+	x 98DE
+2EDD	CJK RADICAL EAT ONE
+	* form used at bottom
+	x 98DF
+2EDE	CJK RADICAL EAT TWO
+	* form used on left side
+	x 2967F
+2EDF	CJK RADICAL EAT THREE
+	* form used on left side
+	x 98E0
+2EE0	CJK RADICAL C-SIMPLIFIED EAT
+	* form used on left side
+	x 9963
+2EE1	CJK RADICAL HEAD
+	x 29810
+2EE2	CJK RADICAL C-SIMPLIFIED HORSE
+	x 9A6C
+2EE3	CJK RADICAL BONE
+	x 9AA8
+2EE4	CJK RADICAL GHOST
+	x 9B3C
+2EE5	CJK RADICAL C-SIMPLIFIED FISH
+	x 9C7C
+2EE6	CJK RADICAL C-SIMPLIFIED BIRD
+	x 9E1F
+2EE7	CJK RADICAL C-SIMPLIFIED SALT
+	x 9E75
+2EE8	CJK RADICAL SIMPLIFIED WHEAT
+	x 9EA6
+2EE9	CJK RADICAL SIMPLIFIED YELLOW
+	x 9EC4
+2EEA	CJK RADICAL C-SIMPLIFIED FROG
+	x 9EFE
+2EEB	CJK RADICAL J-SIMPLIFIED EVEN
+	x 6589
+2EEC	CJK RADICAL C-SIMPLIFIED EVEN
+	x 9F50
+2EED	CJK RADICAL J-SIMPLIFIED TOOTH
+	x 6B6F
+2EEE	CJK RADICAL C-SIMPLIFIED TOOTH
+	x 9F7F
+2EEF	CJK RADICAL J-SIMPLIFIED DRAGON
+	x 9F8D
+2EF0	CJK RADICAL C-SIMPLIFIED DRAGON
+	x 9F99
+2EF1	CJK RADICAL TURTLE
+	x 9F9C
+2EF2	CJK RADICAL J-SIMPLIFIED TURTLE
+	x 4E80
+2EF3	CJK RADICAL C-SIMPLIFIED TURTLE
+	# 9F9F
+@@	2F00	Kangxi Radicals	2FDF
+@		Kangxi radicals
+2F00	KANGXI RADICAL ONE
+	# 4E00
+2F01	KANGXI RADICAL LINE
+	# 4E28
+2F02	KANGXI RADICAL DOT
+	# 4E36
+2F03	KANGXI RADICAL SLASH
+	# 4E3F
+2F04	KANGXI RADICAL SECOND
+	# 4E59
+2F05	KANGXI RADICAL HOOK
+	# 4E85
+2F06	KANGXI RADICAL TWO
+	# 4E8C
+2F07	KANGXI RADICAL LID
+	# 4EA0
+2F08	KANGXI RADICAL MAN
+	# 4EBA
+2F09	KANGXI RADICAL LEGS
+	# 513F
+2F0A	KANGXI RADICAL ENTER
+	# 5165
+2F0B	KANGXI RADICAL EIGHT
+	# 516B
+2F0C	KANGXI RADICAL DOWN BOX
+	# 5182
+2F0D	KANGXI RADICAL COVER
+	# 5196
+2F0E	KANGXI RADICAL ICE
+	# 51AB
+2F0F	KANGXI RADICAL TABLE
+	# 51E0
+2F10	KANGXI RADICAL OPEN BOX
+	# 51F5
+2F11	KANGXI RADICAL KNIFE
+	# 5200
+2F12	KANGXI RADICAL POWER
+	# 529B
+2F13	KANGXI RADICAL WRAP
+	# 52F9
+2F14	KANGXI RADICAL SPOON
+	# 5315
+2F15	KANGXI RADICAL RIGHT OPEN BOX
+	# 531A
+2F16	KANGXI RADICAL HIDING ENCLOSURE
+	# 5338
+2F17	KANGXI RADICAL TEN
+	# 5341
+2F18	KANGXI RADICAL DIVINATION
+	# 535C
+2F19	KANGXI RADICAL SEAL
+	# 5369
+2F1A	KANGXI RADICAL CLIFF
+	# 5382
+2F1B	KANGXI RADICAL PRIVATE
+	# 53B6
+2F1C	KANGXI RADICAL AGAIN
+	# 53C8
+2F1D	KANGXI RADICAL MOUTH
+	# 53E3
+2F1E	KANGXI RADICAL ENCLOSURE
+	# 56D7
+2F1F	KANGXI RADICAL EARTH
+	# 571F
+2F20	KANGXI RADICAL SCHOLAR
+	# 58EB
+2F21	KANGXI RADICAL GO
+	# 5902
+2F22	KANGXI RADICAL GO SLOWLY
+	# 590A
+2F23	KANGXI RADICAL EVENING
+	# 5915
+2F24	KANGXI RADICAL BIG
+	# 5927
+2F25	KANGXI RADICAL WOMAN
+	# 5973
+2F26	KANGXI RADICAL CHILD
+	# 5B50
+2F27	KANGXI RADICAL ROOF
+	# 5B80
+2F28	KANGXI RADICAL INCH
+	# 5BF8
+2F29	KANGXI RADICAL SMALL
+	# 5C0F
+2F2A	KANGXI RADICAL LAME
+	# 5C22
+2F2B	KANGXI RADICAL CORPSE
+	# 5C38
+2F2C	KANGXI RADICAL SPROUT
+	# 5C6E
+2F2D	KANGXI RADICAL MOUNTAIN
+	# 5C71
+2F2E	KANGXI RADICAL RIVER
+	# 5DDB
+2F2F	KANGXI RADICAL WORK
+	# 5DE5
+2F30	KANGXI RADICAL ONESELF
+	# 5DF1
+2F31	KANGXI RADICAL TURBAN
+	# 5DFE
+2F32	KANGXI RADICAL DRY
+	# 5E72
+2F33	KANGXI RADICAL SHORT THREAD
+	# 5E7A
+2F34	KANGXI RADICAL DOTTED CLIFF
+	# 5E7F
+2F35	KANGXI RADICAL LONG STRIDE
+	# 5EF4
+2F36	KANGXI RADICAL TWO HANDS
+	# 5EFE
+2F37	KANGXI RADICAL SHOOT
+	# 5F0B
+2F38	KANGXI RADICAL BOW
+	# 5F13
+2F39	KANGXI RADICAL SNOUT
+	# 5F50
+2F3A	KANGXI RADICAL BRISTLE
+	# 5F61
+2F3B	KANGXI RADICAL STEP
+	# 5F73
+2F3C	KANGXI RADICAL HEART
+	# 5FC3
+2F3D	KANGXI RADICAL HALBERD
+	# 6208
+2F3E	KANGXI RADICAL DOOR
+	# 6236
+2F3F	KANGXI RADICAL HAND
+	# 624B
+2F40	KANGXI RADICAL BRANCH
+	# 652F
+2F41	KANGXI RADICAL RAP
+	# 6534
+2F42	KANGXI RADICAL SCRIPT
+	# 6587
+2F43	KANGXI RADICAL DIPPER
+	# 6597
+2F44	KANGXI RADICAL AXE
+	# 65A4
+2F45	KANGXI RADICAL SQUARE
+	# 65B9
+2F46	KANGXI RADICAL NOT
+	# 65E0
+2F47	KANGXI RADICAL SUN
+	# 65E5
+2F48	KANGXI RADICAL SAY
+	# 66F0
+2F49	KANGXI RADICAL MOON
+	# 6708
+2F4A	KANGXI RADICAL TREE
+	# 6728
+2F4B	KANGXI RADICAL LACK
+	# 6B20
+2F4C	KANGXI RADICAL STOP
+	# 6B62
+2F4D	KANGXI RADICAL DEATH
+	# 6B79
+2F4E	KANGXI RADICAL WEAPON
+	# 6BB3
+2F4F	KANGXI RADICAL DO NOT
+	# 6BCB
+2F50	KANGXI RADICAL COMPARE
+	# 6BD4
+2F51	KANGXI RADICAL FUR
+	# 6BDB
+2F52	KANGXI RADICAL CLAN
+	# 6C0F
+2F53	KANGXI RADICAL STEAM
+	# 6C14
+2F54	KANGXI RADICAL WATER
+	# 6C34
+2F55	KANGXI RADICAL FIRE
+	# 706B
+2F56	KANGXI RADICAL CLAW
+	# 722A
+2F57	KANGXI RADICAL FATHER
+	# 7236
+2F58	KANGXI RADICAL DOUBLE X
+	# 723B
+2F59	KANGXI RADICAL HALF TREE TRUNK
+	# 723F
+2F5A	KANGXI RADICAL SLICE
+	# 7247
+2F5B	KANGXI RADICAL FANG
+	# 7259
+2F5C	KANGXI RADICAL COW
+	# 725B
+2F5D	KANGXI RADICAL DOG
+	# 72AC
+2F5E	KANGXI RADICAL PROFOUND
+	# 7384
+2F5F	KANGXI RADICAL JADE
+	# 7389
+2F60	KANGXI RADICAL MELON
+	# 74DC
+2F61	KANGXI RADICAL TILE
+	# 74E6
+2F62	KANGXI RADICAL SWEET
+	# 7518
+2F63	KANGXI RADICAL LIFE
+	# 751F
+2F64	KANGXI RADICAL USE
+	# 7528
+2F65	KANGXI RADICAL FIELD
+	# 7530
+2F66	KANGXI RADICAL BOLT OF CLOTH
+	# 758B
+2F67	KANGXI RADICAL SICKNESS
+	# 7592
+2F68	KANGXI RADICAL DOTTED TENT
+	# 7676
+2F69	KANGXI RADICAL WHITE
+	# 767D
+2F6A	KANGXI RADICAL SKIN
+	# 76AE
+2F6B	KANGXI RADICAL DISH
+	# 76BF
+2F6C	KANGXI RADICAL EYE
+	# 76EE
+2F6D	KANGXI RADICAL SPEAR
+	# 77DB
+2F6E	KANGXI RADICAL ARROW
+	# 77E2
+2F6F	KANGXI RADICAL STONE
+	# 77F3
+2F70	KANGXI RADICAL SPIRIT
+	# 793A
+2F71	KANGXI RADICAL TRACK
+	# 79B8
+2F72	KANGXI RADICAL GRAIN
+	# 79BE
+2F73	KANGXI RADICAL CAVE
+	# 7A74
+2F74	KANGXI RADICAL STAND
+	# 7ACB
+2F75	KANGXI RADICAL BAMBOO
+	# 7AF9
+2F76	KANGXI RADICAL RICE
+	# 7C73
+2F77	KANGXI RADICAL SILK
+	# 7CF8
+2F78	KANGXI RADICAL JAR
+	# 7F36
+2F79	KANGXI RADICAL NET
+	# 7F51
+2F7A	KANGXI RADICAL SHEEP
+	# 7F8A
+2F7B	KANGXI RADICAL FEATHER
+	# 7FBD
+2F7C	KANGXI RADICAL OLD
+	# 8001
+2F7D	KANGXI RADICAL AND
+	# 800C
+2F7E	KANGXI RADICAL PLOW
+	# 8012
+2F7F	KANGXI RADICAL EAR
+	# 8033
+2F80	KANGXI RADICAL BRUSH
+	# 807F
+2F81	KANGXI RADICAL MEAT
+	# 8089
+2F82	KANGXI RADICAL MINISTER
+	# 81E3
+2F83	KANGXI RADICAL SELF
+	# 81EA
+2F84	KANGXI RADICAL ARRIVE
+	# 81F3
+2F85	KANGXI RADICAL MORTAR
+	# 81FC
+2F86	KANGXI RADICAL TONGUE
+	# 820C
+2F87	KANGXI RADICAL OPPOSE
+	# 821B
+2F88	KANGXI RADICAL BOAT
+	# 821F
+2F89	KANGXI RADICAL STOPPING
+	# 826E
+2F8A	KANGXI RADICAL COLOR
+	# 8272
+2F8B	KANGXI RADICAL GRASS
+	# 8278
+2F8C	KANGXI RADICAL TIGER
+	# 864D
+2F8D	KANGXI RADICAL INSECT
+	# 866B
+2F8E	KANGXI RADICAL BLOOD
+	# 8840
+2F8F	KANGXI RADICAL WALK ENCLOSURE
+	# 884C
+2F90	KANGXI RADICAL CLOTHES
+	# 8863
+2F91	KANGXI RADICAL WEST
+	# 897E
+2F92	KANGXI RADICAL SEE
+	# 898B
+2F93	KANGXI RADICAL HORN
+	# 89D2
+2F94	KANGXI RADICAL SPEECH
+	# 8A00
+2F95	KANGXI RADICAL VALLEY
+	# 8C37
+2F96	KANGXI RADICAL BEAN
+	# 8C46
+2F97	KANGXI RADICAL PIG
+	# 8C55
+2F98	KANGXI RADICAL BADGER
+	# 8C78
+2F99	KANGXI RADICAL SHELL
+	# 8C9D
+2F9A	KANGXI RADICAL RED
+	# 8D64
+2F9B	KANGXI RADICAL RUN
+	# 8D70
+2F9C	KANGXI RADICAL FOOT
+	# 8DB3
+2F9D	KANGXI RADICAL BODY
+	# 8EAB
+2F9E	KANGXI RADICAL CART
+	# 8ECA
+2F9F	KANGXI RADICAL BITTER
+	# 8F9B
+2FA0	KANGXI RADICAL MORNING
+	# 8FB0
+2FA1	KANGXI RADICAL WALK
+	# 8FB5
+2FA2	KANGXI RADICAL CITY
+	# 9091
+2FA3	KANGXI RADICAL WINE
+	# 9149
+2FA4	KANGXI RADICAL DISTINGUISH
+	# 91C6
+2FA5	KANGXI RADICAL VILLAGE
+	# 91CC
+2FA6	KANGXI RADICAL GOLD
+	# 91D1
+2FA7	KANGXI RADICAL LONG
+	# 9577
+2FA8	KANGXI RADICAL GATE
+	# 9580
+2FA9	KANGXI RADICAL MOUND
+	# 961C
+2FAA	KANGXI RADICAL SLAVE
+	# 96B6
+2FAB	KANGXI RADICAL SHORT TAILED BIRD
+	# 96B9
+2FAC	KANGXI RADICAL RAIN
+	# 96E8
+2FAD	KANGXI RADICAL BLUE
+	# 9751
+2FAE	KANGXI RADICAL WRONG
+	# 975E
+2FAF	KANGXI RADICAL FACE
+	# 9762
+2FB0	KANGXI RADICAL LEATHER
+	# 9769
+2FB1	KANGXI RADICAL TANNED LEATHER
+	# 97CB
+2FB2	KANGXI RADICAL LEEK
+	# 97ED
+2FB3	KANGXI RADICAL SOUND
+	# 97F3
+2FB4	KANGXI RADICAL LEAF
+	# 9801
+2FB5	KANGXI RADICAL WIND
+	# 98A8
+2FB6	KANGXI RADICAL FLY
+	# 98DB
+2FB7	KANGXI RADICAL EAT
+	# 98DF
+2FB8	KANGXI RADICAL HEAD
+	# 9996
+2FB9	KANGXI RADICAL FRAGRANT
+	# 9999
+2FBA	KANGXI RADICAL HORSE
+	# 99AC
+2FBB	KANGXI RADICAL BONE
+	# 9AA8
+2FBC	KANGXI RADICAL TALL
+	# 9AD8
+2FBD	KANGXI RADICAL HAIR
+	# 9ADF
+2FBE	KANGXI RADICAL FIGHT
+	# 9B25
+2FBF	KANGXI RADICAL SACRIFICIAL WINE
+	# 9B2F
+2FC0	KANGXI RADICAL CAULDRON
+	# 9B32
+2FC1	KANGXI RADICAL GHOST
+	# 9B3C
+2FC2	KANGXI RADICAL FISH
+	# 9B5A
+2FC3	KANGXI RADICAL BIRD
+	# 9CE5
+2FC4	KANGXI RADICAL SALT
+	# 9E75
+2FC5	KANGXI RADICAL DEER
+	# 9E7F
+2FC6	KANGXI RADICAL WHEAT
+	# 9EA5
+2FC7	KANGXI RADICAL HEMP
+	# 9EBB
+2FC8	KANGXI RADICAL YELLOW
+	# 9EC3
+2FC9	KANGXI RADICAL MILLET
+	# 9ECD
+2FCA	KANGXI RADICAL BLACK
+	# 9ED1
+2FCB	KANGXI RADICAL EMBROIDERY
+	# 9EF9
+2FCC	KANGXI RADICAL FROG
+	# 9EFD
+2FCD	KANGXI RADICAL TRIPOD
+	# 9F0E
+2FCE	KANGXI RADICAL DRUM
+	# 9F13
+2FCF	KANGXI RADICAL RAT
+	# 9F20
+2FD0	KANGXI RADICAL NOSE
+	# 9F3B
+2FD1	KANGXI RADICAL EVEN
+	# 9F4A
+2FD2	KANGXI RADICAL TOOTH
+	# 9F52
+2FD3	KANGXI RADICAL DRAGON
+	# 9F8D
+2FD4	KANGXI RADICAL TURTLE
+	# 9F9C
+2FD5	KANGXI RADICAL FLUTE
+	# 9FA0
+@@	2FF0	Ideographic Description Characters	2FFF
+@		Ideographic description characters
+@+		These are visibly displayed graphic characters, not invisible composition controls.
+2FF0	IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1	IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2	IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3	IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4	IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5	IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6	IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7	IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8	IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9	IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA	IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB	IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+@@	3000	CJK Symbols and Punctuation	303F
+@		CJK symbols and punctuation
+3000	IDEOGRAPHIC SPACE
+	x (space - 0020)
+	# <wide> 0020
+3001	IDEOGRAPHIC COMMA
+	x (comma - 002C)
+3002	IDEOGRAPHIC FULL STOP
+	x (full stop - 002E)
+3003	DITTO MARK
+	x (double prime - 2033)
+3004	JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005	IDEOGRAPHIC ITERATION MARK
+3006	IDEOGRAPHIC CLOSING MARK
+3007	IDEOGRAPHIC NUMBER ZERO
+	x (combining enclosing circle - 20DD)
+	x (white circle - 25CB)
+	x (large circle - 25EF)
+@		CJK angle brackets
+3008	LEFT ANGLE BRACKET
+	x (less-than sign - 003C)
+	x (single left-pointing angle quotation mark - 2039)
+	x (left-pointing angle bracket - 2329)
+	x (mathematical left angle bracket - 27E8)
+3009	RIGHT ANGLE BRACKET
+	x (greater-than sign - 003E)
+	x (single right-pointing angle quotation mark - 203A)
+	x (right-pointing angle bracket - 232A)
+	x (mathematical right angle bracket - 27E9)
+300A	LEFT DOUBLE ANGLE BRACKET
+	x (left-pointing double angle quotation mark - 00AB)
+	x (mathematical left double angle bracket - 27EA)
+300B	RIGHT DOUBLE ANGLE BRACKET
+	x (right-pointing double angle quotation mark - 00BB)
+	x (mathematical right double angle bracket - 27EB)
+@		CJK corner brackets
+@+		The CJK corner brackets, which function as quotation marks, are not recommended for general-purpose corner brackets. See the ceiling and floor characters, instead.
+300C	LEFT CORNER BRACKET
+	x (left ceiling - 2308)
+300D	RIGHT CORNER BRACKET
+	* used as quotation marks
+	x (right floor - 230B)
+300E	LEFT WHITE CORNER BRACKET
+300F	RIGHT WHITE CORNER BRACKET
+	* used as quotation marks
+@		CJK brackets
+3010	LEFT BLACK LENTICULAR BRACKET
+3011	RIGHT BLACK LENTICULAR BRACKET
+@		CJK symbols
+3012	POSTAL MARK
+3013	GETA MARK
+	* substitute for ideograph not in font
+@		CJK brackets
+3014	LEFT TORTOISE SHELL BRACKET
+3015	RIGHT TORTOISE SHELL BRACKET
+3016	LEFT WHITE LENTICULAR BRACKET
+3017	RIGHT WHITE LENTICULAR BRACKET
+3018	LEFT WHITE TORTOISE SHELL BRACKET
+3019	RIGHT WHITE TORTOISE SHELL BRACKET
+301A	LEFT WHITE SQUARE BRACKET
+	= left abstract syntax bracket
+	x (mathematical left white square bracket - 27E6)
+301B	RIGHT WHITE SQUARE BRACKET
+	= right abstract syntax bracket
+	x (mathematical right white square bracket - 27E7)
+@		CJK symbols and punctuation
+301C	WAVE DASH
+@+		* This character was encoded to match JIS C 6226-1978 1-33 "wave dash". The JIS standards and some industry practice disagree in mapping.
+	x (wavy dash - 3030)
+	x (fullwidth tilde - FF5E)
+301D	REVERSED DOUBLE PRIME QUOTATION MARK
+	* sometimes depicted as double prime quotation mark
+	x (left double quotation mark - 201C)
+	x (reversed double prime - 2036)
+301E	DOUBLE PRIME QUOTATION MARK
+	* this is a mistaken analogue to 201D; 301F is preferred
+	x (right double quotation mark - 201D)
+	x (double prime - 2033)
+301F	LOW DOUBLE PRIME QUOTATION MARK
+	* may be depicted as low inverse double prime quotation mark
+3020	POSTAL MARK FACE
+@		Suzhou numerals
+@+		The Suzhou numerals (Chinese su1zhou1ma3zi) are special numeric forms used by traders to display the prices of goods. The use of "HANGZHOU" in the names is a misnomer.
+3021	HANGZHOU NUMERAL ONE
+3022	HANGZHOU NUMERAL TWO
+3023	HANGZHOU NUMERAL THREE
+3024	HANGZHOU NUMERAL FOUR
+3025	HANGZHOU NUMERAL FIVE
+3026	HANGZHOU NUMERAL SIX
+3027	HANGZHOU NUMERAL SEVEN
+3028	HANGZHOU NUMERAL EIGHT
+3029	HANGZHOU NUMERAL NINE
+@		Diacritics
+302A	IDEOGRAPHIC LEVEL TONE MARK
+302B	IDEOGRAPHIC RISING TONE MARK
+302C	IDEOGRAPHIC DEPARTING TONE MARK
+302D	IDEOGRAPHIC ENTERING TONE MARK
+302E	HANGUL SINGLE DOT TONE MARK
+	= single dot Bangjeom
+302F	HANGUL DOUBLE DOT TONE MARK
+	= double dot Bangjeom
+@		Other CJK symbols
+3030	WAVY DASH
+	x (wavy line - 2307)
+	x (wave dash - 301C)
+3031	VERTICAL KANA REPEAT MARK
+3032	VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+	* the preceding two semantic characters are preferred to the following three glyphic forms
+3033	VERTICAL KANA REPEAT MARK UPPER HALF
+3034	VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+	* the preceding two are glyphs used in conjunction with the following glyph
+3035	VERTICAL KANA REPEAT MARK LOWER HALF
+3036	CIRCLED POSTAL MARK
+	# 3012 postal mark
+3037	IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+@		Additional Suzhou numerals
+3038	HANGZHOU NUMERAL TEN
+	# 5341
+3039	HANGZHOU NUMERAL TWENTY
+	# 5344
+303A	HANGZHOU NUMERAL THIRTY
+	# 5345
+@		Other CJK punctuation
+303B	VERTICAL IDEOGRAPHIC ITERATION MARK
+303C	MASU MARK
+	* informal abbreviation for Japanese -masu ending
+	x (squared rising diagonal slash - 29C4)
+303D	PART ALTERNATION MARK
+	* marks the start of a song part in Japanese
+@		Special CJK indicators
+@+		These are visibly displayed graphic characters, not invisible formatting controls.
+303E	IDEOGRAPHIC VARIATION INDICATOR
+	* visual indicator that the following ideograph is to be taken as a variant of the intended character
+303F	IDEOGRAPHIC HALF FILL SPACE
+	* visual indicator of a screen space for half of an ideograph
+@@	3040	Hiragana	309F
+@		Based on JIS X 0208
+3041	HIRAGANA LETTER SMALL A
+3042	HIRAGANA LETTER A
+3043	HIRAGANA LETTER SMALL I
+3044	HIRAGANA LETTER I
+3045	HIRAGANA LETTER SMALL U
+3046	HIRAGANA LETTER U
+3047	HIRAGANA LETTER SMALL E
+3048	HIRAGANA LETTER E
+3049	HIRAGANA LETTER SMALL O
+304A	HIRAGANA LETTER O
+304B	HIRAGANA LETTER KA
+304C	HIRAGANA LETTER GA
+	: 304B 3099
+304D	HIRAGANA LETTER KI
+304E	HIRAGANA LETTER GI
+	: 304D 3099
+304F	HIRAGANA LETTER KU
+3050	HIRAGANA LETTER GU
+	: 304F 3099
+3051	HIRAGANA LETTER KE
+3052	HIRAGANA LETTER GE
+	: 3051 3099
+3053	HIRAGANA LETTER KO
+3054	HIRAGANA LETTER GO
+	: 3053 3099
+3055	HIRAGANA LETTER SA
+3056	HIRAGANA LETTER ZA
+	: 3055 3099
+3057	HIRAGANA LETTER SI
+	= SHI
+3058	HIRAGANA LETTER ZI
+	= JI (not unique)
+	: 3057 3099
+3059	HIRAGANA LETTER SU
+305A	HIRAGANA LETTER ZU
+	: 3059 3099
+305B	HIRAGANA LETTER SE
+305C	HIRAGANA LETTER ZE
+	: 305B 3099
+305D	HIRAGANA LETTER SO
+305E	HIRAGANA LETTER ZO
+	: 305D 3099
+305F	HIRAGANA LETTER TA
+3060	HIRAGANA LETTER DA
+	: 305F 3099
+3061	HIRAGANA LETTER TI
+	= CHI
+3062	HIRAGANA LETTER DI
+	= JI (not unique)
+	: 3061 3099
+3063	HIRAGANA LETTER SMALL TU
+	= SMALL TSU
+3064	HIRAGANA LETTER TU
+	= TSU
+3065	HIRAGANA LETTER DU
+	= ZU (not unique)
+	: 3064 3099
+3066	HIRAGANA LETTER TE
+3067	HIRAGANA LETTER DE
+	: 3066 3099
+3068	HIRAGANA LETTER TO
+3069	HIRAGANA LETTER DO
+	: 3068 3099
+306A	HIRAGANA LETTER NA
+306B	HIRAGANA LETTER NI
+306C	HIRAGANA LETTER NU
+306D	HIRAGANA LETTER NE
+306E	HIRAGANA LETTER NO
+306F	HIRAGANA LETTER HA
+3070	HIRAGANA LETTER BA
+	: 306F 3099
+3071	HIRAGANA LETTER PA
+	: 306F 309A
+3072	HIRAGANA LETTER HI
+3073	HIRAGANA LETTER BI
+	: 3072 3099
+3074	HIRAGANA LETTER PI
+	: 3072 309A
+3075	HIRAGANA LETTER HU
+	= FU
+3076	HIRAGANA LETTER BU
+	: 3075 3099
+3077	HIRAGANA LETTER PU
+	: 3075 309A
+3078	HIRAGANA LETTER HE
+3079	HIRAGANA LETTER BE
+	: 3078 3099
+307A	HIRAGANA LETTER PE
+	: 3078 309A
+307B	HIRAGANA LETTER HO
+307C	HIRAGANA LETTER BO
+	: 307B 3099
+307D	HIRAGANA LETTER PO
+	: 307B 309A
+307E	HIRAGANA LETTER MA
+307F	HIRAGANA LETTER MI
+3080	HIRAGANA LETTER MU
+3081	HIRAGANA LETTER ME
+3082	HIRAGANA LETTER MO
+3083	HIRAGANA LETTER SMALL YA
+3084	HIRAGANA LETTER YA
+3085	HIRAGANA LETTER SMALL YU
+3086	HIRAGANA LETTER YU
+3087	HIRAGANA LETTER SMALL YO
+3088	HIRAGANA LETTER YO
+3089	HIRAGANA LETTER RA
+308A	HIRAGANA LETTER RI
+308B	HIRAGANA LETTER RU
+308C	HIRAGANA LETTER RE
+308D	HIRAGANA LETTER RO
+308E	HIRAGANA LETTER SMALL WA
+308F	HIRAGANA LETTER WA
+3090	HIRAGANA LETTER WI
+3091	HIRAGANA LETTER WE
+3092	HIRAGANA LETTER WO
+3093	HIRAGANA LETTER N
+3094	HIRAGANA LETTER VU
+	: 3046 3099
+@		Small letters
+3095	HIRAGANA LETTER SMALL KA
+3096	HIRAGANA LETTER SMALL KE
+@		Voicing marks
+3099	COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A	COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B	KATAKANA-HIRAGANA VOICED SOUND MARK
+	# 0020 3099
+309C	KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+	# 0020 309A
+@		Iteration marks
+309D	HIRAGANA ITERATION MARK
+309E	HIRAGANA VOICED ITERATION MARK
+	: 309D 3099
+@		Vertical form digraph
+309F	HIRAGANA DIGRAPH YORI
+	# <vertical> 3088 308A
+@@	30A0	Katakana	30FF
+@		Katakana punctuation
+30A0	KATAKANA-HIRAGANA DOUBLE HYPHEN
+	x (equals sign - 003D)
+@		Based on JIS X 0208
+30A1	KATAKANA LETTER SMALL A
+30A2	KATAKANA LETTER A
+30A3	KATAKANA LETTER SMALL I
+30A4	KATAKANA LETTER I
+30A5	KATAKANA LETTER SMALL U
+30A6	KATAKANA LETTER U
+30A7	KATAKANA LETTER SMALL E
+30A8	KATAKANA LETTER E
+30A9	KATAKANA LETTER SMALL O
+30AA	KATAKANA LETTER O
+30AB	KATAKANA LETTER KA
+30AC	KATAKANA LETTER GA
+	: 30AB 3099
+30AD	KATAKANA LETTER KI
+30AE	KATAKANA LETTER GI
+	: 30AD 3099
+30AF	KATAKANA LETTER KU
+30B0	KATAKANA LETTER GU
+	: 30AF 3099
+30B1	KATAKANA LETTER KE
+30B2	KATAKANA LETTER GE
+	: 30B1 3099
+30B3	KATAKANA LETTER KO
+30B4	KATAKANA LETTER GO
+	: 30B3 3099
+30B5	KATAKANA LETTER SA
+30B6	KATAKANA LETTER ZA
+	: 30B5 3099
+30B7	KATAKANA LETTER SI
+	= SHI
+30B8	KATAKANA LETTER ZI
+	= JI (not unique)
+	: 30B7 3099
+30B9	KATAKANA LETTER SU
+30BA	KATAKANA LETTER ZU
+	: 30B9 3099
+30BB	KATAKANA LETTER SE
+30BC	KATAKANA LETTER ZE
+	: 30BB 3099
+30BD	KATAKANA LETTER SO
+30BE	KATAKANA LETTER ZO
+	: 30BD 3099
+30BF	KATAKANA LETTER TA
+30C0	KATAKANA LETTER DA
+	: 30BF 3099
+30C1	KATAKANA LETTER TI
+	= CHI
+30C2	KATAKANA LETTER DI
+	= JI (not unique)
+	: 30C1 3099
+30C3	KATAKANA LETTER SMALL TU
+	= SMALL TSU
+30C4	KATAKANA LETTER TU
+	= TSU
+30C5	KATAKANA LETTER DU
+	= ZU (not unique)
+	: 30C4 3099
+30C6	KATAKANA LETTER TE
+30C7	KATAKANA LETTER DE
+	: 30C6 3099
+30C8	KATAKANA LETTER TO
+30C9	KATAKANA LETTER DO
+	: 30C8 3099
+30CA	KATAKANA LETTER NA
+30CB	KATAKANA LETTER NI
+30CC	KATAKANA LETTER NU
+30CD	KATAKANA LETTER NE
+30CE	KATAKANA LETTER NO
+30CF	KATAKANA LETTER HA
+30D0	KATAKANA LETTER BA
+	: 30CF 3099
+30D1	KATAKANA LETTER PA
+	: 30CF 309A
+30D2	KATAKANA LETTER HI
+30D3	KATAKANA LETTER BI
+	: 30D2 3099
+30D4	KATAKANA LETTER PI
+	: 30D2 309A
+30D5	KATAKANA LETTER HU
+	= FU
+30D6	KATAKANA LETTER BU
+	: 30D5 3099
+30D7	KATAKANA LETTER PU
+	: 30D5 309A
+30D8	KATAKANA LETTER HE
+30D9	KATAKANA LETTER BE
+	: 30D8 3099
+30DA	KATAKANA LETTER PE
+	: 30D8 309A
+30DB	KATAKANA LETTER HO
+30DC	KATAKANA LETTER BO
+	: 30DB 3099
+30DD	KATAKANA LETTER PO
+	: 30DB 309A
+30DE	KATAKANA LETTER MA
+30DF	KATAKANA LETTER MI
+30E0	KATAKANA LETTER MU
+30E1	KATAKANA LETTER ME
+30E2	KATAKANA LETTER MO
+30E3	KATAKANA LETTER SMALL YA
+30E4	KATAKANA LETTER YA
+30E5	KATAKANA LETTER SMALL YU
+30E6	KATAKANA LETTER YU
+30E7	KATAKANA LETTER SMALL YO
+30E8	KATAKANA LETTER YO
+30E9	KATAKANA LETTER RA
+30EA	KATAKANA LETTER RI
+30EB	KATAKANA LETTER RU
+30EC	KATAKANA LETTER RE
+30ED	KATAKANA LETTER RO
+30EE	KATAKANA LETTER SMALL WA
+30EF	KATAKANA LETTER WA
+30F0	KATAKANA LETTER WI
+30F1	KATAKANA LETTER WE
+30F2	KATAKANA LETTER WO
+30F3	KATAKANA LETTER N
+30F4	KATAKANA LETTER VU
+	: 30A6 3099
+30F5	KATAKANA LETTER SMALL KA
+30F6	KATAKANA LETTER SMALL KE
+30F7	KATAKANA LETTER VA
+	: 30EF 3099
+30F8	KATAKANA LETTER VI
+	: 30F0 3099
+30F9	KATAKANA LETTER VE
+	: 30F1 3099
+30FA	KATAKANA LETTER VO
+	: 30F2 3099
+@		Conjunction and length marks
+30FB	KATAKANA MIDDLE DOT
+	x (middle dot - 00B7)
+30FC	KATAKANA-HIRAGANA PROLONGED SOUND MARK
+	x (em dash - 2014)
+@		Iteration marks
+30FD	KATAKANA ITERATION MARK
+30FE	KATAKANA VOICED ITERATION MARK
+	: 30FD 3099
+@		Vertical form digraph
+30FF	KATAKANA DIGRAPH KOTO
+	# <vertical> 30B3 30C8
+@@	3100	Bopomofo	312F
+@+		See also the Bopomofo Extended block
+@		Based on GB 2312
+3105	BOPOMOFO LETTER B
+3106	BOPOMOFO LETTER P
+3107	BOPOMOFO LETTER M
+3108	BOPOMOFO LETTER F
+3109	BOPOMOFO LETTER D
+310A	BOPOMOFO LETTER T
+310B	BOPOMOFO LETTER N
+310C	BOPOMOFO LETTER L
+310D	BOPOMOFO LETTER G
+310E	BOPOMOFO LETTER K
+310F	BOPOMOFO LETTER H
+3110	BOPOMOFO LETTER J
+3111	BOPOMOFO LETTER Q
+3112	BOPOMOFO LETTER X
+3113	BOPOMOFO LETTER ZH
+3114	BOPOMOFO LETTER CH
+3115	BOPOMOFO LETTER SH
+3116	BOPOMOFO LETTER R
+3117	BOPOMOFO LETTER Z
+3118	BOPOMOFO LETTER C
+3119	BOPOMOFO LETTER S
+311A	BOPOMOFO LETTER A
+311B	BOPOMOFO LETTER O
+311C	BOPOMOFO LETTER E
+311D	BOPOMOFO LETTER EH
+311E	BOPOMOFO LETTER AI
+311F	BOPOMOFO LETTER EI
+3120	BOPOMOFO LETTER AU
+3121	BOPOMOFO LETTER OU
+3122	BOPOMOFO LETTER AN
+3123	BOPOMOFO LETTER EN
+3124	BOPOMOFO LETTER ANG
+3125	BOPOMOFO LETTER ENG
+3126	BOPOMOFO LETTER ER
+3127	BOPOMOFO LETTER I
+3128	BOPOMOFO LETTER U
+3129	BOPOMOFO LETTER IU
+@		Dialect (non-Mandarin) letters
+312A	BOPOMOFO LETTER V
+312B	BOPOMOFO LETTER NG
+312C	BOPOMOFO LETTER GN
+@@	3130	Hangul Compatibility Jamo	318F
+@		Modern letters
+3131	HANGUL LETTER KIYEOK
+	# 1100 hangul choseong kiyeok
+3132	HANGUL LETTER SSANGKIYEOK
+	# 1101 hangul choseong ssangkiyeok
+3133	HANGUL LETTER KIYEOK-SIOS
+	# 11AA hangul jongseong kiyeok-sios
+3134	HANGUL LETTER NIEUN
+	# 1102 hangul choseong nieun
+3135	HANGUL LETTER NIEUN-CIEUC
+	# 11AC hangul jongseong nieun-cieuc
+3136	HANGUL LETTER NIEUN-HIEUH
+	# 11AD hangul jongseong nieun-hieuh
+3137	HANGUL LETTER TIKEUT
+	# 1103 hangul choseong tikeut
+3138	HANGUL LETTER SSANGTIKEUT
+	# 1104 hangul choseong ssangtikeut
+3139	HANGUL LETTER RIEUL
+	# 1105 hangul choseong rieul
+313A	HANGUL LETTER RIEUL-KIYEOK
+	# 11B0 hangul jongseong rieul-kiyeok
+313B	HANGUL LETTER RIEUL-MIEUM
+	# 11B1 hangul jongseong rieul-mieum
+313C	HANGUL LETTER RIEUL-PIEUP
+	# 11B2 hangul jongseong rieul-pieup
+313D	HANGUL LETTER RIEUL-SIOS
+	# 11B3 hangul jongseong rieul-sios
+313E	HANGUL LETTER RIEUL-THIEUTH
+	# 11B4 hangul jongseong rieul-thieuth
+313F	HANGUL LETTER RIEUL-PHIEUPH
+	# 11B5 hangul jongseong rieul-phieuph
+3140	HANGUL LETTER RIEUL-HIEUH
+	# 111A hangul choseong rieul-hieuh
+3141	HANGUL LETTER MIEUM
+	# 1106 hangul choseong mieum
+3142	HANGUL LETTER PIEUP
+	# 1107 hangul choseong pieup
+3143	HANGUL LETTER SSANGPIEUP
+	# 1108 hangul choseong ssangpieup
+3144	HANGUL LETTER PIEUP-SIOS
+	# 1121 hangul choseong pieup-sios
+3145	HANGUL LETTER SIOS
+	# 1109 hangul choseong sios
+3146	HANGUL LETTER SSANGSIOS
+	# 110A hangul choseong ssangsios
+3147	HANGUL LETTER IEUNG
+	# 110B hangul choseong ieung
+3148	HANGUL LETTER CIEUC
+	# 110C hangul choseong cieuc
+3149	HANGUL LETTER SSANGCIEUC
+	# 110D hangul choseong ssangcieuc
+314A	HANGUL LETTER CHIEUCH
+	# 110E hangul choseong chieuch
+314B	HANGUL LETTER KHIEUKH
+	# 110F hangul choseong khieukh
+314C	HANGUL LETTER THIEUTH
+	# 1110 hangul choseong thieuth
+314D	HANGUL LETTER PHIEUPH
+	# 1111 hangul choseong phieuph
+314E	HANGUL LETTER HIEUH
+	# 1112 hangul choseong hieuh
+314F	HANGUL LETTER A
+	# 1161 hangul jungseong a
+3150	HANGUL LETTER AE
+	# 1162 hangul jungseong ae
+3151	HANGUL LETTER YA
+	# 1163 hangul jungseong ya
+3152	HANGUL LETTER YAE
+	# 1164 hangul jungseong yae
+3153	HANGUL LETTER EO
+	# 1165 hangul jungseong eo
+3154	HANGUL LETTER E
+	# 1166 hangul jungseong e
+3155	HANGUL LETTER YEO
+	# 1167 hangul jungseong yeo
+3156	HANGUL LETTER YE
+	# 1168 hangul jungseong ye
+3157	HANGUL LETTER O
+	# 1169 hangul jungseong o
+3158	HANGUL LETTER WA
+	# 116A hangul jungseong wa
+3159	HANGUL LETTER WAE
+	# 116B hangul jungseong wae
+315A	HANGUL LETTER OE
+	# 116C hangul jungseong oe
+315B	HANGUL LETTER YO
+	# 116D hangul jungseong yo
+315C	HANGUL LETTER U
+	# 116E hangul jungseong u
+315D	HANGUL LETTER WEO
+	# 116F hangul jungseong weo
+315E	HANGUL LETTER WE
+	# 1170 hangul jungseong we
+315F	HANGUL LETTER WI
+	# 1171 hangul jungseong wi
+3160	HANGUL LETTER YU
+	# 1172 hangul jungseong yu
+3161	HANGUL LETTER EU
+	# 1173 hangul jungseong eu
+3162	HANGUL LETTER YI
+	# 1174 hangul jungseong yi
+3163	HANGUL LETTER I
+	# 1175 hangul jungseong i
+@		Special character
+3164	HANGUL FILLER
+	= HANGUL CAE OM
+	# 1160 hangul jungseong filler
+@		Archaic letters
+3165	HANGUL LETTER SSANGNIEUN
+	# 1114 hangul choseong ssangnieun
+3166	HANGUL LETTER NIEUN-TIKEUT
+	# 1115 hangul choseong nieun-tikeut
+3167	HANGUL LETTER NIEUN-SIOS
+	# 11C7 hangul jongseong nieun-sios
+3168	HANGUL LETTER NIEUN-PANSIOS
+	# 11C8 hangul jongseong nieun-pansios
+3169	HANGUL LETTER RIEUL-KIYEOK-SIOS
+	# 11CC hangul jongseong rieul-kiyeok-sios
+316A	HANGUL LETTER RIEUL-TIKEUT
+	# 11CE hangul jongseong rieul-tikeut
+316B	HANGUL LETTER RIEUL-PIEUP-SIOS
+	# 11D3 hangul jongseong rieul-pieup-sios
+316C	HANGUL LETTER RIEUL-PANSIOS
+	# 11D7 hangul jongseong rieul-pansios
+316D	HANGUL LETTER RIEUL-YEORINHIEUH
+	# 11D9 hangul jongseong rieul-yeorinhieuh
+316E	HANGUL LETTER MIEUM-PIEUP
+	# 111C hangul choseong mieum-pieup
+316F	HANGUL LETTER MIEUM-SIOS
+	# 11DD hangul jongseong mieum-sios
+3170	HANGUL LETTER MIEUM-PANSIOS
+	# 11DF hangul jongseong mieum-pansios
+3171	HANGUL LETTER KAPYEOUNMIEUM
+	# 111D hangul choseong kapyeounmieum
+3172	HANGUL LETTER PIEUP-KIYEOK
+	# 111E hangul choseong pieup-kiyeok
+3173	HANGUL LETTER PIEUP-TIKEUT
+	# 1120 hangul choseong pieup-tikeut
+3174	HANGUL LETTER PIEUP-SIOS-KIYEOK
+	# 1122 hangul choseong pieup-sios-kiyeok
+3175	HANGUL LETTER PIEUP-SIOS-TIKEUT
+	# 1123 hangul choseong pieup-sios-tikeut
+3176	HANGUL LETTER PIEUP-CIEUC
+	# 1127 hangul choseong pieup-cieuc
+3177	HANGUL LETTER PIEUP-THIEUTH
+	# 1129 hangul choseong pieup-thieuth
+3178	HANGUL LETTER KAPYEOUNPIEUP
+	# 112B hangul choseong kapyeounpieup
+3179	HANGUL LETTER KAPYEOUNSSANGPIEUP
+	# 112C hangul choseong kapyeounssangpieup
+317A	HANGUL LETTER SIOS-KIYEOK
+	# 112D hangul choseong sios-kiyeok
+317B	HANGUL LETTER SIOS-NIEUN
+	# 112E hangul choseong sios-nieun
+317C	HANGUL LETTER SIOS-TIKEUT
+	# 112F hangul choseong sios-tikeut
+317D	HANGUL LETTER SIOS-PIEUP
+	# 1132 hangul choseong sios-pieup
+317E	HANGUL LETTER SIOS-CIEUC
+	# 1136 hangul choseong sios-cieuc
+317F	HANGUL LETTER PANSIOS
+	# 1140 hangul choseong pansios
+3180	HANGUL LETTER SSANGIEUNG
+	# 1147 hangul choseong ssangieung
+3181	HANGUL LETTER YESIEUNG
+	* archaic velar nasal
+	# 114C hangul choseong yesieung
+3182	HANGUL LETTER YESIEUNG-SIOS
+	# 11F1 hangul jongseong yesieung-sios
+3183	HANGUL LETTER YESIEUNG-PANSIOS
+	# 11F2 hangul jongseong yesieung-pansios
+3184	HANGUL LETTER KAPYEOUNPHIEUPH
+	# 1157 hangul choseong kapyeounphieuph
+3185	HANGUL LETTER SSANGHIEUH
+	# 1158 hangul choseong ssanghieuh
+3186	HANGUL LETTER YEORINHIEUH
+	* archaic glottal stop
+	# 1159 hangul choseong yeorinhieuh
+3187	HANGUL LETTER YO-YA
+	# 1184 hangul jungseong yo-ya
+3188	HANGUL LETTER YO-YAE
+	# 1185 hangul jungseong yo-yae
+3189	HANGUL LETTER YO-I
+	# 1188 hangul jungseong yo-i
+318A	HANGUL LETTER YU-YEO
+	# 1191 hangul jungseong yu-yeo
+318B	HANGUL LETTER YU-YE
+	# 1192 hangul jungseong yu-ye
+318C	HANGUL LETTER YU-I
+	# 1194 hangul jungseong yu-i
+318D	HANGUL LETTER ARAEA
+	# 119E hangul jungseong araea
+318E	HANGUL LETTER ARAEAE
+	# 11A1 hangul jungseong araea-i
+@@	3190	Kanbun	319F
+@		Kanbun
+3190	IDEOGRAPHIC ANNOTATION LINKING MARK (Kanbun Tateten)
+	= KANBUN TATETEN
+3191	IDEOGRAPHIC ANNOTATION REVERSE MARK (Kaeriten)
+	= KAERITEN RE
+3192	IDEOGRAPHIC ANNOTATION ONE MARK (Kaeriten)
+	# <super> 4E00
+3193	IDEOGRAPHIC ANNOTATION TWO MARK (Kaeriten)
+	# <super> 4E8C
+3194	IDEOGRAPHIC ANNOTATION THREE MARK (Kaeriten)
+	# <super> 4E09
+3195	IDEOGRAPHIC ANNOTATION FOUR MARK (Kaeriten)
+	# <super> 56DB
+3196	IDEOGRAPHIC ANNOTATION TOP MARK (Kaeriten)
+	# <super> 4E0A
+3197	IDEOGRAPHIC ANNOTATION MIDDLE MARK (Kaeriten)
+	# <super> 4E2D
+3198	IDEOGRAPHIC ANNOTATION BOTTOM MARK (Kaeriten)
+	# <super> 4E0B
+3199	IDEOGRAPHIC ANNOTATION FIRST MARK (Kaeriten)
+	# <super> 7532
+319A	IDEOGRAPHIC ANNOTATION SECOND MARK (Kaeriten)
+	# <super> 4E59
+319B	IDEOGRAPHIC ANNOTATION THIRD MARK (Kaeriten)
+	# <super> 4E19
+319C	IDEOGRAPHIC ANNOTATION FOURTH MARK (Kaeriten)
+	# <super> 4E01
+319D	IDEOGRAPHIC ANNOTATION HEAVEN MARK (Kaeriten)
+	# <super> 5929
+319E	IDEOGRAPHIC ANNOTATION EARTH MARK (Kaeriten)
+	# <super> 5730
+319F	IDEOGRAPHIC ANNOTATION MAN MARK (Kaeriten)
+	# <super> 4EBA
+@@	31A0	Bopomofo Extended	31BF
+@+		See also the Bopomofo block
+@		Extended Bopomofo for Minnan and Hakka
+31A0	BOPOMOFO LETTER BU
+31A1	BOPOMOFO LETTER ZI
+31A2	BOPOMOFO LETTER JI
+31A3	BOPOMOFO LETTER GU
+31A4	BOPOMOFO LETTER EE
+31A5	BOPOMOFO LETTER ENN
+31A6	BOPOMOFO LETTER OO
+31A7	BOPOMOFO LETTER ONN
+31A8	BOPOMOFO LETTER IR
+31A9	BOPOMOFO LETTER ANN
+31AA	BOPOMOFO LETTER INN
+31AB	BOPOMOFO LETTER UNN
+31AC	BOPOMOFO LETTER IM
+31AD	BOPOMOFO LETTER NGG
+31AE	BOPOMOFO LETTER AINN
+31AF	BOPOMOFO LETTER AUNN
+31B0	BOPOMOFO LETTER AM
+31B1	BOPOMOFO LETTER OM
+31B2	BOPOMOFO LETTER ONG
+31B3	BOPOMOFO LETTER INNN
+31B4	BOPOMOFO FINAL LETTER P
+31B5	BOPOMOFO FINAL LETTER T
+31B6	BOPOMOFO FINAL LETTER K
+31B7	BOPOMOFO FINAL LETTER H
+@@	31C0	CJK Strokes	31EF
+@		CJK strokes
+31C0	CJK STROKE T
+31C1	CJK STROKE WG
+31C2	CJK STROKE XG
+31C3	CJK STROKE BXG
+31C4	CJK STROKE SW
+31C5	CJK STROKE HZZ
+31C6	CJK STROKE HZG
+31C7	CJK STROKE HP
+31C8	CJK STROKE HZWG
+31C9	CJK STROKE SZWG
+31CA	CJK STROKE HZT
+31CB	CJK STROKE HZZP
+31CC	CJK STROKE HPWG
+31CD	CJK STROKE HZW
+31CE	CJK STROKE HZZZ
+31CF	CJK STROKE N
+@@	31F0	Katakana Phonetic Extensions	31FF
+@		Phonetic extensions for Ainu
+31F0	KATAKANA LETTER SMALL KU
+31F1	KATAKANA LETTER SMALL SI
+31F2	KATAKANA LETTER SMALL SU
+31F3	KATAKANA LETTER SMALL TO
+31F4	KATAKANA LETTER SMALL NU
+31F5	KATAKANA LETTER SMALL HA
+31F6	KATAKANA LETTER SMALL HI
+31F7	KATAKANA LETTER SMALL HU
+31F8	KATAKANA LETTER SMALL HE
+31F9	KATAKANA LETTER SMALL HO
+31FA	KATAKANA LETTER SMALL MU
+31FB	KATAKANA LETTER SMALL RA
+31FC	KATAKANA LETTER SMALL RI
+31FD	KATAKANA LETTER SMALL RU
+31FE	KATAKANA LETTER SMALL RE
+31FF	KATAKANA LETTER SMALL RO
+@@	3200	Enclosed CJK Letters and Months	32FF
+@		Parenthesized Hangul elements
+3200	PARENTHESIZED HANGUL KIYEOK
+	# 0028 1100 0029
+3201	PARENTHESIZED HANGUL NIEUN
+	# 0028 1102 0029
+3202	PARENTHESIZED HANGUL TIKEUT
+	# 0028 1103 0029
+3203	PARENTHESIZED HANGUL RIEUL
+	# 0028 1105 0029
+3204	PARENTHESIZED HANGUL MIEUM
+	# 0028 1106 0029
+3205	PARENTHESIZED HANGUL PIEUP
+	# 0028 1107 0029
+3206	PARENTHESIZED HANGUL SIOS
+	# 0028 1109 0029
+3207	PARENTHESIZED HANGUL IEUNG
+	# 0028 110B 0029
+3208	PARENTHESIZED HANGUL CIEUC
+	# 0028 110C 0029
+3209	PARENTHESIZED HANGUL CHIEUCH
+	# 0028 110E 0029
+320A	PARENTHESIZED HANGUL KHIEUKH
+	# 0028 110F 0029
+320B	PARENTHESIZED HANGUL THIEUTH
+	# 0028 1110 0029
+320C	PARENTHESIZED HANGUL PHIEUPH
+	# 0028 1111 0029
+320D	PARENTHESIZED HANGUL HIEUH
+	# 0028 1112 0029
+@		Parenthesized Hangul syllables
+320E	PARENTHESIZED HANGUL KIYEOK A
+	# 0028 1100 1161 0029
+320F	PARENTHESIZED HANGUL NIEUN A
+	# 0028 1102 1161 0029
+3210	PARENTHESIZED HANGUL TIKEUT A
+	# 0028 1103 1161 0029
+3211	PARENTHESIZED HANGUL RIEUL A
+	# 0028 1105 1161 0029
+3212	PARENTHESIZED HANGUL MIEUM A
+	# 0028 1106 1161 0029
+3213	PARENTHESIZED HANGUL PIEUP A
+	# 0028 1107 1161 0029
+3214	PARENTHESIZED HANGUL SIOS A
+	# 0028 1109 1161 0029
+3215	PARENTHESIZED HANGUL IEUNG A
+	# 0028 110B 1161 0029
+3216	PARENTHESIZED HANGUL CIEUC A
+	# 0028 110C 1161 0029
+3217	PARENTHESIZED HANGUL CHIEUCH A
+	# 0028 110E 1161 0029
+3218	PARENTHESIZED HANGUL KHIEUKH A
+	# 0028 110F 1161 0029
+3219	PARENTHESIZED HANGUL THIEUTH A
+	# 0028 1110 1161 0029
+321A	PARENTHESIZED HANGUL PHIEUPH A
+	# 0028 1111 1161 0029
+321B	PARENTHESIZED HANGUL HIEUH A
+	# 0028 1112 1161 0029
+321C	PARENTHESIZED HANGUL CIEUC U
+	# 0028 110C 116E 0029
+@		Parenthesized Korean words
+321D	PARENTHESIZED KOREAN CHARACTER OJEON
+	# 0028 110B 1169 110C 1165 11AB 0029
+321E	PARENTHESIZED KOREAN CHARACTER O HU
+	# 0028 110B 1169 1112 116E 0029
+@		Parenthesized ideographs
+3220	PARENTHESIZED IDEOGRAPH ONE
+	# 0028 4E00 0029
+3221	PARENTHESIZED IDEOGRAPH TWO
+	# 0028 4E8C 0029
+3222	PARENTHESIZED IDEOGRAPH THREE
+	# 0028 4E09 0029
+3223	PARENTHESIZED IDEOGRAPH FOUR
+	# 0028 56DB 0029
+3224	PARENTHESIZED IDEOGRAPH FIVE
+	# 0028 4E94 0029
+3225	PARENTHESIZED IDEOGRAPH SIX
+	# 0028 516D 0029
+3226	PARENTHESIZED IDEOGRAPH SEVEN
+	# 0028 4E03 0029
+3227	PARENTHESIZED IDEOGRAPH EIGHT
+	# 0028 516B 0029
+3228	PARENTHESIZED IDEOGRAPH NINE
+	# 0028 4E5D 0029
+3229	PARENTHESIZED IDEOGRAPH TEN
+	# 0028 5341 0029
+322A	PARENTHESIZED IDEOGRAPH MOON
+	* Monday
+	# 0028 6708 0029
+322B	PARENTHESIZED IDEOGRAPH FIRE
+	* Tuesday
+	# 0028 706B 0029
+322C	PARENTHESIZED IDEOGRAPH WATER
+	* Wednesday
+	# 0028 6C34 0029
+322D	PARENTHESIZED IDEOGRAPH WOOD
+	* Thursday
+	# 0028 6728 0029
+322E	PARENTHESIZED IDEOGRAPH METAL
+	* Friday
+	# 0028 91D1 0029
+322F	PARENTHESIZED IDEOGRAPH EARTH
+	* Saturday
+	# 0028 571F 0029
+3230	PARENTHESIZED IDEOGRAPH SUN
+	* Sunday
+	# 0028 65E5 0029
+3231	PARENTHESIZED IDEOGRAPH STOCK
+	* incorporated
+	# 0028 682A 0029
+3232	PARENTHESIZED IDEOGRAPH HAVE
+	* limited
+	# 0028 6709 0029
+3233	PARENTHESIZED IDEOGRAPH SOCIETY
+	* company
+	# 0028 793E 0029
+3234	PARENTHESIZED IDEOGRAPH NAME
+	# 0028 540D 0029
+3235	PARENTHESIZED IDEOGRAPH SPECIAL
+	# 0028 7279 0029
+3236	PARENTHESIZED IDEOGRAPH FINANCIAL
+	# 0028 8CA1 0029
+3237	PARENTHESIZED IDEOGRAPH CONGRATULATION
+	# 0028 795D 0029
+3238	PARENTHESIZED IDEOGRAPH LABOR
+	# 0028 52B4 0029
+3239	PARENTHESIZED IDEOGRAPH REPRESENT
+	# 0028 4EE3 0029
+323A	PARENTHESIZED IDEOGRAPH CALL
+	# 0028 547C 0029
+323B	PARENTHESIZED IDEOGRAPH STUDY
+	# 0028 5B66 0029
+323C	PARENTHESIZED IDEOGRAPH SUPERVISE
+	# 0028 76E3 0029
+323D	PARENTHESIZED IDEOGRAPH ENTERPRISE
+	# 0028 4F01 0029
+323E	PARENTHESIZED IDEOGRAPH RESOURCE
+	# 0028 8CC7 0029
+323F	PARENTHESIZED IDEOGRAPH ALLIANCE
+	# 0028 5354 0029
+3240	PARENTHESIZED IDEOGRAPH FESTIVAL
+	# 0028 796D 0029
+3241	PARENTHESIZED IDEOGRAPH REST
+	# 0028 4F11 0029
+3242	PARENTHESIZED IDEOGRAPH SELF
+	* from
+	# 0028 81EA 0029
+3243	PARENTHESIZED IDEOGRAPH REACH
+	* to
+	# 0028 81F3 0029
+@		Squared Latin abbreviation
+3250	PARTNERSHIP SIGN
+	# <square> 0050 0054 0045
+@		Circled numbers
+3251	CIRCLED NUMBER TWENTY ONE
+	# <circle> 0032 0031
+3252	CIRCLED NUMBER TWENTY TWO
+	# <circle> 0032 0032
+3253	CIRCLED NUMBER TWENTY THREE
+	# <circle> 0032 0033
+3254	CIRCLED NUMBER TWENTY FOUR
+	# <circle> 0032 0034
+3255	CIRCLED NUMBER TWENTY FIVE
+	# <circle> 0032 0035
+3256	CIRCLED NUMBER TWENTY SIX
+	# <circle> 0032 0036
+3257	CIRCLED NUMBER TWENTY SEVEN
+	# <circle> 0032 0037
+3258	CIRCLED NUMBER TWENTY EIGHT
+	# <circle> 0032 0038
+3259	CIRCLED NUMBER TWENTY NINE
+	# <circle> 0032 0039
+325A	CIRCLED NUMBER THIRTY
+	# <circle> 0033 0030
+325B	CIRCLED NUMBER THIRTY ONE
+	# <circle> 0033 0031
+325C	CIRCLED NUMBER THIRTY TWO
+	# <circle> 0033 0032
+325D	CIRCLED NUMBER THIRTY THREE
+	# <circle> 0033 0033
+325E	CIRCLED NUMBER THIRTY FOUR
+	# <circle> 0033 0034
+325F	CIRCLED NUMBER THIRTY FIVE
+	# <circle> 0033 0035
+@		Circled Hangul elements
+3260	CIRCLED HANGUL KIYEOK
+	# <circle> 1100
+3261	CIRCLED HANGUL NIEUN
+	# <circle> 1102
+3262	CIRCLED HANGUL TIKEUT
+	# <circle> 1103
+3263	CIRCLED HANGUL RIEUL
+	# <circle> 1105
+3264	CIRCLED HANGUL MIEUM
+	# <circle> 1106
+3265	CIRCLED HANGUL PIEUP
+	# <circle> 1107
+3266	CIRCLED HANGUL SIOS
+	# <circle> 1109
+3267	CIRCLED HANGUL IEUNG
+	# <circle> 110B
+3268	CIRCLED HANGUL CIEUC
+	# <circle> 110C
+3269	CIRCLED HANGUL CHIEUCH
+	# <circle> 110E
+326A	CIRCLED HANGUL KHIEUKH
+	# <circle> 110F
+326B	CIRCLED HANGUL THIEUTH
+	# <circle> 1110
+326C	CIRCLED HANGUL PHIEUPH
+	# <circle> 1111
+326D	CIRCLED HANGUL HIEUH
+	# <circle> 1112
+@		Circled Hangul syllables
+326E	CIRCLED HANGUL KIYEOK A
+	# <circle> 1100 1161
+326F	CIRCLED HANGUL NIEUN A
+	# <circle> 1102 1161
+3270	CIRCLED HANGUL TIKEUT A
+	# <circle> 1103 1161
+3271	CIRCLED HANGUL RIEUL A
+	# <circle> 1105 1161
+3272	CIRCLED HANGUL MIEUM A
+	# <circle> 1106 1161
+3273	CIRCLED HANGUL PIEUP A
+	# <circle> 1107 1161
+3274	CIRCLED HANGUL SIOS A
+	# <circle> 1109 1161
+3275	CIRCLED HANGUL IEUNG A
+	# <circle> 110B 1161
+3276	CIRCLED HANGUL CIEUC A
+	# <circle> 110C 1161
+3277	CIRCLED HANGUL CHIEUCH A
+	# <circle> 110E 1161
+3278	CIRCLED HANGUL KHIEUKH A
+	# <circle> 110F 1161
+3279	CIRCLED HANGUL THIEUTH A
+	# <circle> 1110 1161
+327A	CIRCLED HANGUL PHIEUPH A
+	# <circle> 1111 1161
+327B	CIRCLED HANGUL HIEUH A
+	# <circle> 1112 1161
+@		Circled Korean words
+327C	CIRCLED KOREAN CHARACTER CHAMKO
+	# <circle> 110E 1161 11B7 1100 1169
+327D	CIRCLED KOREAN CHARACTER JUEUI
+	# <circle> 110C 116E 110B 1174
+@		Circled Hangul syllable
+327E	CIRCLED HANGUL IEUNG U
+	* postal code mark
+	# <circle> 110B 116E
+@		Symbol
+327F	KOREAN STANDARD SYMBOL
+@		Circled ideographs
+3280	CIRCLED IDEOGRAPH ONE
+	= maru-iti, symbol of unification
+	# <circle> 4E00
+3281	CIRCLED IDEOGRAPH TWO
+	# <circle> 4E8C
+3282	CIRCLED IDEOGRAPH THREE
+	# <circle> 4E09
+3283	CIRCLED IDEOGRAPH FOUR
+	# <circle> 56DB
+3284	CIRCLED IDEOGRAPH FIVE
+	# <circle> 4E94
+3285	CIRCLED IDEOGRAPH SIX
+	# <circle> 516D
+3286	CIRCLED IDEOGRAPH SEVEN
+	# <circle> 4E03
+3287	CIRCLED IDEOGRAPH EIGHT
+	# <circle> 516B
+3288	CIRCLED IDEOGRAPH NINE
+	# <circle> 4E5D
+3289	CIRCLED IDEOGRAPH TEN
+	# <circle> 5341
+328A	CIRCLED IDEOGRAPH MOON
+	* Monday
+	# <circle> 6708
+328B	CIRCLED IDEOGRAPH FIRE
+	* Tuesday
+	# <circle> 706B
+328C	CIRCLED IDEOGRAPH WATER
+	* Wednesday
+	# <circle> 6C34
+328D	CIRCLED IDEOGRAPH WOOD
+	* Thursday
+	# <circle> 6728
+328E	CIRCLED IDEOGRAPH METAL
+	* Friday
+	# <circle> 91D1
+328F	CIRCLED IDEOGRAPH EARTH
+	* Saturday
+	# <circle> 571F
+3290	CIRCLED IDEOGRAPH SUN
+	* Sunday
+	# <circle> 65E5
+3291	CIRCLED IDEOGRAPH STOCK
+	* incorporated
+	# <circle> 682A
+3292	CIRCLED IDEOGRAPH HAVE
+	* limited
+	# <circle> 6709
+3293	CIRCLED IDEOGRAPH SOCIETY
+	* company
+	# <circle> 793E
+3294	CIRCLED IDEOGRAPH NAME
+	# <circle> 540D
+3295	CIRCLED IDEOGRAPH SPECIAL
+	# <circle> 7279
+3296	CIRCLED IDEOGRAPH FINANCIAL
+	# <circle> 8CA1
+3297	CIRCLED IDEOGRAPH CONGRATULATION
+	# <circle> 795D
+3298	CIRCLED IDEOGRAPH LABOR
+	# <circle> 52B4
+3299	CIRCLED IDEOGRAPH SECRET
+	# <circle> 79D8
+329A	CIRCLED IDEOGRAPH MALE
+	# <circle> 7537
+329B	CIRCLED IDEOGRAPH FEMALE
+	# <circle> 5973
+329C	CIRCLED IDEOGRAPH SUITABLE
+	# <circle> 9069
+329D	CIRCLED IDEOGRAPH EXCELLENT
+	# <circle> 512A
+329E	CIRCLED IDEOGRAPH PRINT
+	* name seal
+	# <circle> 5370
+329F	CIRCLED IDEOGRAPH ATTENTION
+	# <circle> 6CE8
+32A0	CIRCLED IDEOGRAPH ITEM
+	# <circle> 9805
+32A1	CIRCLED IDEOGRAPH REST
+	* holiday
+	# <circle> 4F11
+32A2	CIRCLED IDEOGRAPH COPY
+	# <circle> 5199
+32A3	CIRCLED IDEOGRAPH CORRECT
+	# <circle> 6B63
+32A4	CIRCLED IDEOGRAPH HIGH
+	# <circle> 4E0A
+32A5	CIRCLED IDEOGRAPH CENTRE
+	# <circle> 4E2D
+32A6	CIRCLED IDEOGRAPH LOW
+	# <circle> 4E0B
+32A7	CIRCLED IDEOGRAPH LEFT
+	# <circle> 5DE6
+32A8	CIRCLED IDEOGRAPH RIGHT
+	# <circle> 53F3
+32A9	CIRCLED IDEOGRAPH MEDICINE
+	# <circle> 533B
+32AA	CIRCLED IDEOGRAPH RELIGION
+	# <circle> 5B97
+32AB	CIRCLED IDEOGRAPH STUDY
+	# <circle> 5B66
+32AC	CIRCLED IDEOGRAPH SUPERVISE
+	# <circle> 76E3
+32AD	CIRCLED IDEOGRAPH ENTERPRISE
+	# <circle> 4F01
+32AE	CIRCLED IDEOGRAPH RESOURCE
+	# <circle> 8CC7
+32AF	CIRCLED IDEOGRAPH ALLIANCE
+	# <circle> 5354
+32B0	CIRCLED IDEOGRAPH NIGHT
+	# <circle> 591C
+@		Circled numbers
+32B1	CIRCLED NUMBER THIRTY SIX
+	# <circle> 0033 0036
+32B2	CIRCLED NUMBER THIRTY SEVEN
+	# <circle> 0033 0037
+32B3	CIRCLED NUMBER THIRTY EIGHT
+	# <circle> 0033 0038
+32B4	CIRCLED NUMBER THIRTY NINE
+	# <circle> 0033 0039
+32B5	CIRCLED NUMBER FORTY
+	# <circle> 0034 0030
+32B6	CIRCLED NUMBER FORTY ONE
+	# <circle> 0034 0031
+32B7	CIRCLED NUMBER FORTY TWO
+	# <circle> 0034 0032
+32B8	CIRCLED NUMBER FORTY THREE
+	# <circle> 0034 0033
+32B9	CIRCLED NUMBER FORTY FOUR
+	# <circle> 0034 0034
+32BA	CIRCLED NUMBER FORTY FIVE
+	# <circle> 0034 0035
+32BB	CIRCLED NUMBER FORTY SIX
+	# <circle> 0034 0036
+32BC	CIRCLED NUMBER FORTY SEVEN
+	# <circle> 0034 0037
+32BD	CIRCLED NUMBER FORTY EIGHT
+	# <circle> 0034 0038
+32BE	CIRCLED NUMBER FORTY NINE
+	# <circle> 0034 0039
+32BF	CIRCLED NUMBER FIFTY
+	# <circle> 0035 0030
+@		Telegraph symbols for months
+32C0	IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+	# 0031 6708
+32C1	IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+	# 0032 6708
+32C2	IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+	# 0033 6708
+32C3	IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+	# 0034 6708
+32C4	IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+	# 0035 6708
+32C5	IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+	# 0036 6708
+32C6	IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+	# 0037 6708
+32C7	IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+	# 0038 6708
+32C8	IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+	# 0039 6708
+32C9	IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+	# 0031 0030 6708
+32CA	IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+	# 0031 0031 6708
+32CB	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+	# 0031 0032 6708
+@		Squared Latin abbreviations
+32CC	SQUARE HG
+	# <square> 0048 0067
+32CD	SQUARE ERG
+	# <square> 0065 0072 0067
+32CE	SQUARE EV
+	# <square> 0065 0056
+32CF	LIMITED LIABILITY SIGN
+	# <square> 004C 0054 0044
+@		Circled Katakana
+32D0	CIRCLED KATAKANA A
+	# <circle> 30A2
+32D1	CIRCLED KATAKANA I
+	# <circle> 30A4
+32D2	CIRCLED KATAKANA U
+	# <circle> 30A6
+32D3	CIRCLED KATAKANA E
+	# <circle> 30A8
+32D4	CIRCLED KATAKANA O
+	# <circle> 30AA
+32D5	CIRCLED KATAKANA KA
+	# <circle> 30AB
+32D6	CIRCLED KATAKANA KI
+	# <circle> 30AD
+32D7	CIRCLED KATAKANA KU
+	# <circle> 30AF
+32D8	CIRCLED KATAKANA KE
+	# <circle> 30B1
+32D9	CIRCLED KATAKANA KO
+	# <circle> 30B3
+32DA	CIRCLED KATAKANA SA
+	# <circle> 30B5
+32DB	CIRCLED KATAKANA SI
+	# <circle> 30B7
+32DC	CIRCLED KATAKANA SU
+	# <circle> 30B9
+32DD	CIRCLED KATAKANA SE
+	# <circle> 30BB
+32DE	CIRCLED KATAKANA SO
+	# <circle> 30BD
+32DF	CIRCLED KATAKANA TA
+	# <circle> 30BF
+32E0	CIRCLED KATAKANA TI
+	# <circle> 30C1
+32E1	CIRCLED KATAKANA TU
+	# <circle> 30C4
+32E2	CIRCLED KATAKANA TE
+	# <circle> 30C6
+32E3	CIRCLED KATAKANA TO
+	# <circle> 30C8
+32E4	CIRCLED KATAKANA NA
+	# <circle> 30CA
+32E5	CIRCLED KATAKANA NI
+	# <circle> 30CB
+32E6	CIRCLED KATAKANA NU
+	# <circle> 30CC
+32E7	CIRCLED KATAKANA NE
+	# <circle> 30CD
+32E8	CIRCLED KATAKANA NO
+	# <circle> 30CE
+32E9	CIRCLED KATAKANA HA
+	# <circle> 30CF
+32EA	CIRCLED KATAKANA HI
+	# <circle> 30D2
+32EB	CIRCLED KATAKANA HU
+	# <circle> 30D5
+32EC	CIRCLED KATAKANA HE
+	# <circle> 30D8
+32ED	CIRCLED KATAKANA HO
+	# <circle> 30DB
+32EE	CIRCLED KATAKANA MA
+	# <circle> 30DE
+32EF	CIRCLED KATAKANA MI
+	# <circle> 30DF
+32F0	CIRCLED KATAKANA MU
+	# <circle> 30E0
+32F1	CIRCLED KATAKANA ME
+	# <circle> 30E1
+32F2	CIRCLED KATAKANA MO
+	# <circle> 30E2
+32F3	CIRCLED KATAKANA YA
+	# <circle> 30E4
+32F4	CIRCLED KATAKANA YU
+	# <circle> 30E6
+32F5	CIRCLED KATAKANA YO
+	# <circle> 30E8
+32F6	CIRCLED KATAKANA RA
+	# <circle> 30E9
+32F7	CIRCLED KATAKANA RI
+	# <circle> 30EA
+32F8	CIRCLED KATAKANA RU
+	# <circle> 30EB
+32F9	CIRCLED KATAKANA RE
+	# <circle> 30EC
+32FA	CIRCLED KATAKANA RO
+	# <circle> 30ED
+32FB	CIRCLED KATAKANA WA
+	# <circle> 30EF
+32FC	CIRCLED KATAKANA WI
+	# <circle> 30F0
+32FD	CIRCLED KATAKANA WE
+	# <circle> 30F1
+32FE	CIRCLED KATAKANA WO
+	# <circle> 30F2
+@@	3300	CJK Compatibility	33FF
+@		Squared Katakana words
+3300	SQUARE APAATO
+	* apartment
+	# <square> 30A2 30D1 30FC 30C8
+3301	SQUARE ARUHUA
+	* alpha
+	# <square> 30A2 30EB 30D5 30A1
+3302	SQUARE ANPEA
+	* ampere
+	# <square> 30A2 30F3 30DA 30A2
+3303	SQUARE AARU
+	* are (unit of area)
+	# <square> 30A2 30FC 30EB
+3304	SQUARE ININGU
+	* inning
+	# <square> 30A4 30CB 30F3 30B0
+3305	SQUARE INTI
+	* inch
+	# <square> 30A4 30F3 30C1
+3306	SQUARE UON
+	* won (Korean currency)
+	# <square> 30A6 30A9 30F3
+3307	SQUARE ESUKUUDO
+	* escudo (Portuguese currency)
+	# <square> 30A8 30B9 30AF 30FC 30C9
+3308	SQUARE EEKAA
+	* acre
+	# <square> 30A8 30FC 30AB 30FC
+3309	SQUARE ONSU
+	* ounce
+	# <square> 30AA 30F3 30B9
+330A	SQUARE OOMU
+	* ohm
+	# <square> 30AA 30FC 30E0
+330B	SQUARE KAIRI
+	* kai-ri: nautical mile
+	# <square> 30AB 30A4 30EA
+330C	SQUARE KARATTO
+	* carat
+	# <square> 30AB 30E9 30C3 30C8
+330D	SQUARE KARORII
+	* calorie
+	# <square> 30AB 30ED 30EA 30FC
+330E	SQUARE GARON
+	* gallon
+	# <square> 30AC 30ED 30F3
+330F	SQUARE GANMA
+	* gamma
+	# <square> 30AC 30F3 30DE
+3310	SQUARE GIGA
+	* giga-
+	# <square> 30AE 30AC
+3311	SQUARE GINII
+	* guinea
+	# <square> 30AE 30CB 30FC
+3312	SQUARE KYURII
+	* curie
+	# <square> 30AD 30E5 30EA 30FC
+3313	SQUARE GIRUDAA
+	* guilder
+	# <square> 30AE 30EB 30C0 30FC
+3314	SQUARE KIRO
+	* kilo-
+	# <square> 30AD 30ED
+3315	SQUARE KIROGURAMU
+	* kilogram
+	# <square> 30AD 30ED 30B0 30E9 30E0
+3316	SQUARE KIROMEETORU
+	* kilometer
+	# <square> 30AD 30ED 30E1 30FC 30C8 30EB
+3317	SQUARE KIROWATTO
+	* kilowatt
+	# <square> 30AD 30ED 30EF 30C3 30C8
+3318	SQUARE GURAMU
+	* gram
+	# <square> 30B0 30E9 30E0
+3319	SQUARE GURAMUTON
+	* gram ton
+	# <square> 30B0 30E9 30E0 30C8 30F3
+331A	SQUARE KURUZEIRO
+	* cruzeiro (Brazilian currency)
+	# <square> 30AF 30EB 30BC 30A4 30ED
+331B	SQUARE KUROONE
+	* krone
+	# <square> 30AF 30ED 30FC 30CD
+331C	SQUARE KEESU
+	* case
+	# <square> 30B1 30FC 30B9
+331D	SQUARE KORUNA
+	* koruna (Czech currency)
+	# <square> 30B3 30EB 30CA
+331E	SQUARE KOOPO
+	* co-op
+	# <square> 30B3 30FC 30DD
+331F	SQUARE SAIKURU
+	* cycle
+	# <square> 30B5 30A4 30AF 30EB
+3320	SQUARE SANTIIMU
+	* centime
+	# <square> 30B5 30F3 30C1 30FC 30E0
+3321	SQUARE SIRINGU
+	* shilling
+	# <square> 30B7 30EA 30F3 30B0
+3322	SQUARE SENTI
+	* centi-
+	# <square> 30BB 30F3 30C1
+3323	SQUARE SENTO
+	* cent
+	# <square> 30BB 30F3 30C8
+3324	SQUARE DAASU
+	* dozen
+	# <square> 30C0 30FC 30B9
+3325	SQUARE DESI
+	* deci-
+	# <square> 30C7 30B7
+3326	SQUARE DORU
+	* dollar
+	# <square> 30C9 30EB
+3327	SQUARE TON
+	* ton
+	# <square> 30C8 30F3
+3328	SQUARE NANO
+	* nano-
+	# <square> 30CA 30CE
+3329	SQUARE NOTTO
+	* knot, nautical mile
+	# <square> 30CE 30C3 30C8
+332A	SQUARE HAITU
+	* heights
+	# <square> 30CF 30A4 30C4
+332B	SQUARE PAASENTO
+	* percent
+	# <square> 30D1 30FC 30BB 30F3 30C8
+332C	SQUARE PAATU
+	* parts
+	# <square> 30D1 30FC 30C4
+332D	SQUARE BAARERU
+	* barrel
+	# <square> 30D0 30FC 30EC 30EB
+332E	SQUARE PIASUTORU
+	* piaster
+	# <square> 30D4 30A2 30B9 30C8 30EB
+332F	SQUARE PIKURU
+	* picul (unit of weight)
+	# <square> 30D4 30AF 30EB
+3330	SQUARE PIKO
+	* pico-
+	# <square> 30D4 30B3
+3331	SQUARE BIRU
+	* building
+	# <square> 30D3 30EB
+3332	SQUARE HUARADDO
+	* farad
+	# <square> 30D5 30A1 30E9 30C3 30C9
+3333	SQUARE HUIITO
+	* feet
+	# <square> 30D5 30A3 30FC 30C8
+3334	SQUARE BUSSYERU
+	* bushel
+	# <square> 30D6 30C3 30B7 30A7 30EB
+3335	SQUARE HURAN
+	* franc
+	# <square> 30D5 30E9 30F3
+3336	SQUARE HEKUTAARU
+	* hectare
+	# <square> 30D8 30AF 30BF 30FC 30EB
+3337	SQUARE PESO
+	* peso
+	# <square> 30DA 30BD
+3338	SQUARE PENIHI
+	* pfennig
+	# <square> 30DA 30CB 30D2
+3339	SQUARE HERUTU
+	* hertz
+	# <square> 30D8 30EB 30C4
+333A	SQUARE PENSU
+	* pence
+	# <square> 30DA 30F3 30B9
+333B	SQUARE PEEZI
+	* page
+	# <square> 30DA 30FC 30B8
+333C	SQUARE BEETA
+	* beta
+	# <square> 30D9 30FC 30BF
+333D	SQUARE POINTO
+	* point
+	# <square> 30DD 30A4 30F3 30C8
+333E	SQUARE BORUTO
+	* volt, bolt
+	# <square> 30DC 30EB 30C8
+333F	SQUARE HON
+	* hon: volume
+	# <square> 30DB 30F3
+3340	SQUARE PONDO
+	* pound
+	# <square> 30DD 30F3 30C9
+3341	SQUARE HOORU
+	* hall
+	# <square> 30DB 30FC 30EB
+3342	SQUARE HOON
+	* horn
+	# <square> 30DB 30FC 30F3
+3343	SQUARE MAIKURO
+	* micro-
+	# <square> 30DE 30A4 30AF 30ED
+3344	SQUARE MAIRU
+	* mile
+	# <square> 30DE 30A4 30EB
+3345	SQUARE MAHHA
+	* mach
+	# <square> 30DE 30C3 30CF
+3346	SQUARE MARUKU
+	* mark
+	# <square> 30DE 30EB 30AF
+3347	SQUARE MANSYON
+	* mansion (i.e. better quality apartment)
+	# <square> 30DE 30F3 30B7 30E7 30F3
+3348	SQUARE MIKURON
+	* micron
+	# <square> 30DF 30AF 30ED 30F3
+3349	SQUARE MIRI
+	* milli-
+	# <square> 30DF 30EA
+334A	SQUARE MIRIBAARU
+	* millibar
+	# <square> 30DF 30EA 30D0 30FC 30EB
+334B	SQUARE MEGA
+	* mega-
+	# <square> 30E1 30AC
+334C	SQUARE MEGATON
+	* megaton
+	# <square> 30E1 30AC 30C8 30F3
+334D	SQUARE MEETORU
+	* meter
+	# <square> 30E1 30FC 30C8 30EB
+334E	SQUARE YAADO
+	* yard
+	# <square> 30E4 30FC 30C9
+334F	SQUARE YAARU
+	* yard
+	# <square> 30E4 30FC 30EB
+3350	SQUARE YUAN
+	* yuan (Chinese currency)
+	# <square> 30E6 30A2 30F3
+3351	SQUARE RITTORU
+	* liter
+	# <square> 30EA 30C3 30C8 30EB
+3352	SQUARE RIRA
+	* lira
+	# <square> 30EA 30E9
+3353	SQUARE RUPII
+	* rupee
+	# <square> 30EB 30D4 30FC
+3354	SQUARE RUUBURU
+	* ruble
+	# <square> 30EB 30FC 30D6 30EB
+3355	SQUARE REMU
+	* rem (unit of radiation)
+	# <square> 30EC 30E0
+3356	SQUARE RENTOGEN
+	* roentgen
+	# <square> 30EC 30F3 30C8 30B2 30F3
+3357	SQUARE WATTO
+	* watt
+	# <square> 30EF 30C3 30C8
+@		Telegraph symbols for hours
+3358	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+	# 0030 70B9
+3359	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+	# 0031 70B9
+335A	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+	# 0032 70B9
+335B	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+	# 0033 70B9
+335C	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+	# 0034 70B9
+335D	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+	# 0035 70B9
+335E	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+	# 0036 70B9
+335F	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+	# 0037 70B9
+3360	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+	# 0038 70B9
+3361	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+	# 0039 70B9
+3362	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+	# 0031 0030 70B9
+3363	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+	# 0031 0031 70B9
+3364	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+	# 0031 0032 70B9
+3365	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+	# 0031 0033 70B9
+3366	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+	# 0031 0034 70B9
+3367	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+	# 0031 0035 70B9
+3368	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+	# 0031 0036 70B9
+3369	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+	# 0031 0037 70B9
+336A	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+	# 0031 0038 70B9
+336B	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+	# 0031 0039 70B9
+336C	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+	# 0032 0030 70B9
+336D	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+	# 0032 0031 70B9
+336E	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+	# 0032 0032 70B9
+336F	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+	# 0032 0033 70B9
+3370	IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+	# 0032 0034 70B9
+@		Squared Latin abbreviations
+3371	SQUARE HPA
+	# <square> 0068 0050 0061
+3372	SQUARE DA
+	# <square> 0064 0061
+3373	SQUARE AU
+	# <square> 0041 0055
+3374	SQUARE BAR
+	# <square> 0062 0061 0072
+3375	SQUARE OV
+	# <square> 006F 0056
+3376	SQUARE PC
+	# <square> 0070 0063
+3377	SQUARE DM
+	# <square> 0064 006D
+3378	SQUARE DM SQUARED
+	# <square> 0064 006D 00B2
+3379	SQUARE DM CUBED
+	# <square> 0064 006D 00B3
+337A	SQUARE IU
+	# <square> 0049 0055
+@		Japanese era names
+337B	SQUARE ERA NAME HEISEI
+	# <square> 5E73 6210
+337C	SQUARE ERA NAME SYOUWA
+	# <square> 662D 548C
+337D	SQUARE ERA NAME TAISYOU
+	# <square> 5927 6B63
+337E	SQUARE ERA NAME MEIZI
+	# <square> 660E 6CBB
+@		Japanese corporation
+337F	SQUARE CORPORATION
+	= kabusiki-gaisya
+	* incorporated
+	# <square> 682A 5F0F 4F1A 793E
+@		Squared Latin abbreviations
+3380	SQUARE PA AMPS
+	# <square> 0070 0041
+3381	SQUARE NA
+	# <square> 006E 0041
+3382	SQUARE MU A
+	# <square> 03BC 0041
+3383	SQUARE MA
+	# <square> 006D 0041
+3384	SQUARE KA
+	# <square> 006B 0041
+3385	SQUARE KB
+	# <square> 004B 0042
+3386	SQUARE MB
+	# <square> 004D 0042
+3387	SQUARE GB
+	# <square> 0047 0042
+3388	SQUARE CAL
+	# <square> 0063 0061 006C
+3389	SQUARE KCAL
+	# <square> 006B 0063 0061 006C
+338A	SQUARE PF
+	# <square> 0070 0046
+338B	SQUARE NF
+	# <square> 006E 0046
+338C	SQUARE MU F
+	# <square> 03BC 0046
+338D	SQUARE MU G
+	# <square> 03BC 0067
+338E	SQUARE MG
+	# <square> 006D 0067
+338F	SQUARE KG
+	# <square> 006B 0067
+3390	SQUARE HZ
+	# <square> 0048 007A
+3391	SQUARE KHZ
+	# <square> 006B 0048 007A
+3392	SQUARE MHZ
+	# <square> 004D 0048 007A
+3393	SQUARE GHZ
+	# <square> 0047 0048 007A
+3394	SQUARE THZ
+	# <square> 0054 0048 007A
+3395	SQUARE MU L
+	# <square> 03BC 2113
+3396	SQUARE ML
+	# <square> 006D 2113
+3397	SQUARE DL
+	# <square> 0064 2113
+3398	SQUARE KL
+	# <square> 006B 2113
+3399	SQUARE FM
+	# <square> 0066 006D
+339A	SQUARE NM
+	# <square> 006E 006D
+339B	SQUARE MU M
+	# <square> 03BC 006D
+339C	SQUARE MM
+	# <square> 006D 006D
+339D	SQUARE CM
+	# <square> 0063 006D
+339E	SQUARE KM
+	# <square> 006B 006D
+339F	SQUARE MM SQUARED
+	# <square> 006D 006D 00B2
+33A0	SQUARE CM SQUARED
+	# <square> 0063 006D 00B2
+33A1	SQUARE M SQUARED
+	# <square> 006D 00B2
+33A2	SQUARE KM SQUARED
+	# <square> 006B 006D 00B2
+33A3	SQUARE MM CUBED
+	# <square> 006D 006D 00B3
+33A4	SQUARE CM CUBED
+	# <square> 0063 006D 00B3
+33A5	SQUARE M CUBED
+	# <square> 006D 00B3
+33A6	SQUARE KM CUBED
+	# <square> 006B 006D 00B3
+33A7	SQUARE M OVER S
+	# <square> 006D 2215 0073
+33A8	SQUARE M OVER S SQUARED
+	# <square> 006D 2215 0073 00B2
+33A9	SQUARE PA
+	# <square> 0050 0061
+33AA	SQUARE KPA
+	# <square> 006B 0050 0061
+33AB	SQUARE MPA
+	# <square> 004D 0050 0061
+33AC	SQUARE GPA
+	# <square> 0047 0050 0061
+33AD	SQUARE RAD
+	# <square> 0072 0061 0064
+33AE	SQUARE RAD OVER S
+	# <square> 0072 0061 0064 2215 0073
+33AF	SQUARE RAD OVER S SQUARED
+	# <square> 0072 0061 0064 2215 0073 00B2
+33B0	SQUARE PS
+	# <square> 0070 0073
+33B1	SQUARE NS
+	# <square> 006E 0073
+33B2	SQUARE MU S
+	# <square> 03BC 0073
+33B3	SQUARE MS
+	# <square> 006D 0073
+33B4	SQUARE PV
+	# <square> 0070 0056
+33B5	SQUARE NV
+	# <square> 006E 0056
+33B6	SQUARE MU V
+	# <square> 03BC 0056
+33B7	SQUARE MV
+	# <square> 006D 0056
+33B8	SQUARE KV
+	# <square> 006B 0056
+33B9	SQUARE MV MEGA
+	# <square> 004D 0056
+33BA	SQUARE PW
+	# <square> 0070 0057
+33BB	SQUARE NW
+	# <square> 006E 0057
+33BC	SQUARE MU W
+	# <square> 03BC 0057
+33BD	SQUARE MW
+	# <square> 006D 0057
+33BE	SQUARE KW
+	# <square> 006B 0057
+33BF	SQUARE MW MEGA
+	# <square> 004D 0057
+33C0	SQUARE K OHM
+	# <square> 006B 03A9
+33C1	SQUARE M OHM
+	# <square> 004D 03A9
+33C2	SQUARE AM
+	# <square> 0061 002E 006D 002E
+33C3	SQUARE BQ
+	# <square> 0042 0071
+33C4	SQUARE CC
+	# <square> 0063 0063
+33C5	SQUARE CD
+	# <square> 0063 0064
+33C6	SQUARE C OVER KG
+	# <square> 0043 2215 006B 0067
+33C7	SQUARE CO
+	# <square> 0043 006F 002E
+33C8	SQUARE DB
+	# <square> 0064 0042
+33C9	SQUARE GY
+	# <square> 0047 0079
+33CA	SQUARE HA
+	# <square> 0068 0061
+33CB	SQUARE HP
+	# <square> 0048 0050
+33CC	SQUARE IN
+	# <square> 0069 006E
+33CD	SQUARE KK
+	# <square> 004B 004B
+33CE	SQUARE KM CAPITAL
+	# <square> 004B 004D
+33CF	SQUARE KT
+	# <square> 006B 0074
+33D0	SQUARE LM
+	# <square> 006C 006D
+33D1	SQUARE LN
+	# <square> 006C 006E
+33D2	SQUARE LOG
+	# <square> 006C 006F 0067
+33D3	SQUARE LX
+	# <square> 006C 0078
+33D4	SQUARE MB SMALL
+	# <square> 006D 0062
+33D5	SQUARE MIL
+	# <square> 006D 0069 006C
+33D6	SQUARE MOL
+	# <square> 006D 006F 006C
+33D7	SQUARE PH
+	# <square> 0050 0048
+33D8	SQUARE PM
+	# <square> 0070 002E 006D 002E
+33D9	SQUARE PPM
+	# <square> 0050 0050 004D
+33DA	SQUARE PR
+	# <square> 0050 0052
+33DB	SQUARE SR
+	# <square> 0073 0072
+33DC	SQUARE SV
+	# <square> 0053 0076
+33DD	SQUARE WB
+	# <square> 0057 0062
+33DE	SQUARE V OVER M
+	# <square> 0056 2215 006D
+33DF	SQUARE A OVER M
+	# <square> 0041 2215 006D
+@		Telegraph symbols for days
+33E0	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+	# 0031 65E5
+33E1	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+	# 0032 65E5
+33E2	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+	# 0033 65E5
+33E3	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+	# 0034 65E5
+33E4	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+	# 0035 65E5
+33E5	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+	# 0036 65E5
+33E6	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+	# 0037 65E5
+33E7	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+	# 0038 65E5
+33E8	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+	# 0039 65E5
+33E9	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+	# 0031 0030 65E5
+33EA	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+	# 0031 0031 65E5
+33EB	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+	# 0031 0032 65E5
+33EC	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+	# 0031 0033 65E5
+33ED	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+	# 0031 0034 65E5
+33EE	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+	# 0031 0035 65E5
+33EF	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+	# 0031 0036 65E5
+33F0	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+	# 0031 0037 65E5
+33F1	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+	# 0031 0038 65E5
+33F2	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+	# 0031 0039 65E5
+33F3	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+	# 0032 0030 65E5
+33F4	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+	# 0032 0031 65E5
+33F5	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+	# 0032 0032 65E5
+33F6	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+	# 0032 0033 65E5
+33F7	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+	# 0032 0034 65E5
+33F8	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+	# 0032 0035 65E5
+33F9	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+	# 0032 0036 65E5
+33FA	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+	# 0032 0037 65E5
+33FB	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+	# 0032 0038 65E5
+33FC	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+	# 0032 0039 65E5
+33FD	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+	# 0033 0030 65E5
+33FE	IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+	# 0033 0031 65E5
+@		Squared Latin abbreviation
+33FF	SQUARE GAL
+	# <square> 0067 0061 006C
+@@	3400	CJK Unified Ideographs Extension A	4DB5
+@@	4DC0	Yijing Hexagram Symbols	4DFF
+@		Yijing hexagram symbols
+4DC0	HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1	HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2	HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3	HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4	HEXAGRAM FOR WAITING
+4DC5	HEXAGRAM FOR CONFLICT
+4DC6	HEXAGRAM FOR THE ARMY
+4DC7	HEXAGRAM FOR HOLDING TOGETHER
+4DC8	HEXAGRAM FOR SMALL TAMING
+4DC9	HEXAGRAM FOR TREADING
+4DCA	HEXAGRAM FOR PEACE
+4DCB	HEXAGRAM FOR STANDSTILL
+4DCC	HEXAGRAM FOR FELLOWSHIP
+4DCD	HEXAGRAM FOR GREAT POSSESSION
+4DCE	HEXAGRAM FOR MODESTY
+4DCF	HEXAGRAM FOR ENTHUSIASM
+4DD0	HEXAGRAM FOR FOLLOWING
+4DD1	HEXAGRAM FOR WORK ON THE DECAYED
+4DD2	HEXAGRAM FOR APPROACH
+4DD3	HEXAGRAM FOR CONTEMPLATION
+4DD4	HEXAGRAM FOR BITING THROUGH
+4DD5	HEXAGRAM FOR GRACE
+4DD6	HEXAGRAM FOR SPLITTING APART
+4DD7	HEXAGRAM FOR RETURN
+4DD8	HEXAGRAM FOR INNOCENCE
+4DD9	HEXAGRAM FOR GREAT TAMING
+4DDA	HEXAGRAM FOR MOUTH CORNERS
+4DDB	HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC	HEXAGRAM FOR THE ABYSMAL WATER
+4DDD	HEXAGRAM FOR THE CLINGING FIRE
+4DDE	HEXAGRAM FOR INFLUENCE
+4DDF	HEXAGRAM FOR DURATION
+4DE0	HEXAGRAM FOR RETREAT
+4DE1	HEXAGRAM FOR GREAT POWER
+4DE2	HEXAGRAM FOR PROGRESS
+4DE3	HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4	HEXAGRAM FOR THE FAMILY
+4DE5	HEXAGRAM FOR OPPOSITION
+4DE6	HEXAGRAM FOR OBSTRUCTION
+4DE7	HEXAGRAM FOR DELIVERANCE
+4DE8	HEXAGRAM FOR DECREASE
+4DE9	HEXAGRAM FOR INCREASE
+4DEA	HEXAGRAM FOR BREAKTHROUGH
+4DEB	HEXAGRAM FOR COMING TO MEET
+4DEC	HEXAGRAM FOR GATHERING TOGETHER
+4DED	HEXAGRAM FOR PUSHING UPWARD
+4DEE	HEXAGRAM FOR OPPRESSION
+4DEF	HEXAGRAM FOR THE WELL
+4DF0	HEXAGRAM FOR REVOLUTION
+4DF1	HEXAGRAM FOR THE CAULDRON
+4DF2	HEXAGRAM FOR THE AROUSING THUNDER
+4DF3	HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4	HEXAGRAM FOR DEVELOPMENT
+4DF5	HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6	HEXAGRAM FOR ABUNDANCE
+4DF7	HEXAGRAM FOR THE WANDERER
+4DF8	HEXAGRAM FOR THE GENTLE WIND
+4DF9	HEXAGRAM FOR THE JOYOUS LAKE
+4DFA	HEXAGRAM FOR DISPERSION
+4DFB	HEXAGRAM FOR LIMITATION
+4DFC	HEXAGRAM FOR INNER TRUTH
+4DFD	HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE	HEXAGRAM FOR AFTER COMPLETION
+4DFF	HEXAGRAM FOR BEFORE COMPLETION
+@@	4E00	CJK Unified Ideographs	9FBB
+@@	A000	Yi Syllables	A48F
+@		Syllables
+A000	YI SYLLABLE IT
+A001	YI SYLLABLE IX
+A002	YI SYLLABLE I
+A003	YI SYLLABLE IP
+A004	YI SYLLABLE IET
+A005	YI SYLLABLE IEX
+A006	YI SYLLABLE IE
+A007	YI SYLLABLE IEP
+A008	YI SYLLABLE AT
+A009	YI SYLLABLE AX
+A00A	YI SYLLABLE A
+A00B	YI SYLLABLE AP
+A00C	YI SYLLABLE UOX
+A00D	YI SYLLABLE UO
+A00E	YI SYLLABLE UOP
+A00F	YI SYLLABLE OT
+A010	YI SYLLABLE OX
+A011	YI SYLLABLE O
+A012	YI SYLLABLE OP
+A013	YI SYLLABLE EX
+A014	YI SYLLABLE E
+A015	YI SYLLABLE WU
+A016	YI SYLLABLE BIT
+A017	YI SYLLABLE BIX
+A018	YI SYLLABLE BI
+A019	YI SYLLABLE BIP
+A01A	YI SYLLABLE BIET
+A01B	YI SYLLABLE BIEX
+A01C	YI SYLLABLE BIE
+A01D	YI SYLLABLE BIEP
+A01E	YI SYLLABLE BAT
+A01F	YI SYLLABLE BAX
+A020	YI SYLLABLE BA
+A021	YI SYLLABLE BAP
+A022	YI SYLLABLE BUOX
+A023	YI SYLLABLE BUO
+A024	YI SYLLABLE BUOP
+A025	YI SYLLABLE BOT
+A026	YI SYLLABLE BOX
+A027	YI SYLLABLE BO
+A028	YI SYLLABLE BOP
+A029	YI SYLLABLE BEX
+A02A	YI SYLLABLE BE
+A02B	YI SYLLABLE BEP
+A02C	YI SYLLABLE BUT
+A02D	YI SYLLABLE BUX
+A02E	YI SYLLABLE BU
+A02F	YI SYLLABLE BUP
+A030	YI SYLLABLE BURX
+A031	YI SYLLABLE BUR
+A032	YI SYLLABLE BYT
+A033	YI SYLLABLE BYX
+A034	YI SYLLABLE BY
+A035	YI SYLLABLE BYP
+A036	YI SYLLABLE BYRX
+A037	YI SYLLABLE BYR
+A038	YI SYLLABLE PIT
+A039	YI SYLLABLE PIX
+A03A	YI SYLLABLE PI
+A03B	YI SYLLABLE PIP
+A03C	YI SYLLABLE PIEX
+A03D	YI SYLLABLE PIE
+A03E	YI SYLLABLE PIEP
+A03F	YI SYLLABLE PAT
+A040	YI SYLLABLE PAX
+A041	YI SYLLABLE PA
+A042	YI SYLLABLE PAP
+A043	YI SYLLABLE PUOX
+A044	YI SYLLABLE PUO
+A045	YI SYLLABLE PUOP
+A046	YI SYLLABLE POT
+A047	YI SYLLABLE POX
+A048	YI SYLLABLE PO
+A049	YI SYLLABLE POP
+A04A	YI SYLLABLE PUT
+A04B	YI SYLLABLE PUX
+A04C	YI SYLLABLE PU
+A04D	YI SYLLABLE PUP
+A04E	YI SYLLABLE PURX
+A04F	YI SYLLABLE PUR
+A050	YI SYLLABLE PYT
+A051	YI SYLLABLE PYX
+A052	YI SYLLABLE PY
+A053	YI SYLLABLE PYP
+A054	YI SYLLABLE PYRX
+A055	YI SYLLABLE PYR
+A056	YI SYLLABLE BBIT
+A057	YI SYLLABLE BBIX
+A058	YI SYLLABLE BBI
+A059	YI SYLLABLE BBIP
+A05A	YI SYLLABLE BBIET
+A05B	YI SYLLABLE BBIEX
+A05C	YI SYLLABLE BBIE
+A05D	YI SYLLABLE BBIEP
+A05E	YI SYLLABLE BBAT
+A05F	YI SYLLABLE BBAX
+A060	YI SYLLABLE BBA
+A061	YI SYLLABLE BBAP
+A062	YI SYLLABLE BBUOX
+A063	YI SYLLABLE BBUO
+A064	YI SYLLABLE BBUOP
+A065	YI SYLLABLE BBOT
+A066	YI SYLLABLE BBOX
+A067	YI SYLLABLE BBO
+A068	YI SYLLABLE BBOP
+A069	YI SYLLABLE BBEX
+A06A	YI SYLLABLE BBE
+A06B	YI SYLLABLE BBEP
+A06C	YI SYLLABLE BBUT
+A06D	YI SYLLABLE BBUX
+A06E	YI SYLLABLE BBU
+A06F	YI SYLLABLE BBUP
+A070	YI SYLLABLE BBURX
+A071	YI SYLLABLE BBUR
+A072	YI SYLLABLE BBYT
+A073	YI SYLLABLE BBYX
+A074	YI SYLLABLE BBY
+A075	YI SYLLABLE BBYP
+A076	YI SYLLABLE NBIT
+A077	YI SYLLABLE NBIX
+A078	YI SYLLABLE NBI
+A079	YI SYLLABLE NBIP
+A07A	YI SYLLABLE NBIEX
+A07B	YI SYLLABLE NBIE
+A07C	YI SYLLABLE NBIEP
+A07D	YI SYLLABLE NBAT
+A07E	YI SYLLABLE NBAX
+A07F	YI SYLLABLE NBA
+A080	YI SYLLABLE NBAP
+A081	YI SYLLABLE NBOT
+A082	YI SYLLABLE NBOX
+A083	YI SYLLABLE NBO
+A084	YI SYLLABLE NBOP
+A085	YI SYLLABLE NBUT
+A086	YI SYLLABLE NBUX
+A087	YI SYLLABLE NBU
+A088	YI SYLLABLE NBUP
+A089	YI SYLLABLE NBURX
+A08A	YI SYLLABLE NBUR
+A08B	YI SYLLABLE NBYT
+A08C	YI SYLLABLE NBYX
+A08D	YI SYLLABLE NBY
+A08E	YI SYLLABLE NBYP
+A08F	YI SYLLABLE NBYRX
+A090	YI SYLLABLE NBYR
+A091	YI SYLLABLE HMIT
+A092	YI SYLLABLE HMIX
+A093	YI SYLLABLE HMI
+A094	YI SYLLABLE HMIP
+A095	YI SYLLABLE HMIEX
+A096	YI SYLLABLE HMIE
+A097	YI SYLLABLE HMIEP
+A098	YI SYLLABLE HMAT
+A099	YI SYLLABLE HMAX
+A09A	YI SYLLABLE HMA
+A09B	YI SYLLABLE HMAP
+A09C	YI SYLLABLE HMUOX
+A09D	YI SYLLABLE HMUO
+A09E	YI SYLLABLE HMUOP
+A09F	YI SYLLABLE HMOT
+A0A0	YI SYLLABLE HMOX
+A0A1	YI SYLLABLE HMO
+A0A2	YI SYLLABLE HMOP
+A0A3	YI SYLLABLE HMUT
+A0A4	YI SYLLABLE HMUX
+A0A5	YI SYLLABLE HMU
+A0A6	YI SYLLABLE HMUP
+A0A7	YI SYLLABLE HMURX
+A0A8	YI SYLLABLE HMUR
+A0A9	YI SYLLABLE HMYX
+A0AA	YI SYLLABLE HMY
+A0AB	YI SYLLABLE HMYP
+A0AC	YI SYLLABLE HMYRX
+A0AD	YI SYLLABLE HMYR
+A0AE	YI SYLLABLE MIT
+A0AF	YI SYLLABLE MIX
+A0B0	YI SYLLABLE MI
+A0B1	YI SYLLABLE MIP
+A0B2	YI SYLLABLE MIEX
+A0B3	YI SYLLABLE MIE
+A0B4	YI SYLLABLE MIEP
+A0B5	YI SYLLABLE MAT
+A0B6	YI SYLLABLE MAX
+A0B7	YI SYLLABLE MA
+A0B8	YI SYLLABLE MAP
+A0B9	YI SYLLABLE MUOT
+A0BA	YI SYLLABLE MUOX
+A0BB	YI SYLLABLE MUO
+A0BC	YI SYLLABLE MUOP
+A0BD	YI SYLLABLE MOT
+A0BE	YI SYLLABLE MOX
+A0BF	YI SYLLABLE MO
+A0C0	YI SYLLABLE MOP
+A0C1	YI SYLLABLE MEX
+A0C2	YI SYLLABLE ME
+A0C3	YI SYLLABLE MUT
+A0C4	YI SYLLABLE MUX
+A0C5	YI SYLLABLE MU
+A0C6	YI SYLLABLE MUP
+A0C7	YI SYLLABLE MURX
+A0C8	YI SYLLABLE MUR
+A0C9	YI SYLLABLE MYT
+A0CA	YI SYLLABLE MYX
+A0CB	YI SYLLABLE MY
+A0CC	YI SYLLABLE MYP
+A0CD	YI SYLLABLE FIT
+A0CE	YI SYLLABLE FIX
+A0CF	YI SYLLABLE FI
+A0D0	YI SYLLABLE FIP
+A0D1	YI SYLLABLE FAT
+A0D2	YI SYLLABLE FAX
+A0D3	YI SYLLABLE FA
+A0D4	YI SYLLABLE FAP
+A0D5	YI SYLLABLE FOX
+A0D6	YI SYLLABLE FO
+A0D7	YI SYLLABLE FOP
+A0D8	YI SYLLABLE FUT
+A0D9	YI SYLLABLE FUX
+A0DA	YI SYLLABLE FU
+A0DB	YI SYLLABLE FUP
+A0DC	YI SYLLABLE FURX
+A0DD	YI SYLLABLE FUR
+A0DE	YI SYLLABLE FYT
+A0DF	YI SYLLABLE FYX
+A0E0	YI SYLLABLE FY
+A0E1	YI SYLLABLE FYP
+A0E2	YI SYLLABLE VIT
+A0E3	YI SYLLABLE VIX
+A0E4	YI SYLLABLE VI
+A0E5	YI SYLLABLE VIP
+A0E6	YI SYLLABLE VIET
+A0E7	YI SYLLABLE VIEX
+A0E8	YI SYLLABLE VIE
+A0E9	YI SYLLABLE VIEP
+A0EA	YI SYLLABLE VAT
+A0EB	YI SYLLABLE VAX
+A0EC	YI SYLLABLE VA
+A0ED	YI SYLLABLE VAP
+A0EE	YI SYLLABLE VOT
+A0EF	YI SYLLABLE VOX
+A0F0	YI SYLLABLE VO
+A0F1	YI SYLLABLE VOP
+A0F2	YI SYLLABLE VEX
+A0F3	YI SYLLABLE VEP
+A0F4	YI SYLLABLE VUT
+A0F5	YI SYLLABLE VUX
+A0F6	YI SYLLABLE VU
+A0F7	YI SYLLABLE VUP
+A0F8	YI SYLLABLE VURX
+A0F9	YI SYLLABLE VUR
+A0FA	YI SYLLABLE VYT
+A0FB	YI SYLLABLE VYX
+A0FC	YI SYLLABLE VY
+A0FD	YI SYLLABLE VYP
+A0FE	YI SYLLABLE VYRX
+A0FF	YI SYLLABLE VYR
+A100	YI SYLLABLE DIT
+A101	YI SYLLABLE DIX
+A102	YI SYLLABLE DI
+A103	YI SYLLABLE DIP
+A104	YI SYLLABLE DIEX
+A105	YI SYLLABLE DIE
+A106	YI SYLLABLE DIEP
+A107	YI SYLLABLE DAT
+A108	YI SYLLABLE DAX
+A109	YI SYLLABLE DA
+A10A	YI SYLLABLE DAP
+A10B	YI SYLLABLE DUOX
+A10C	YI SYLLABLE DUO
+A10D	YI SYLLABLE DOT
+A10E	YI SYLLABLE DOX
+A10F	YI SYLLABLE DO
+A110	YI SYLLABLE DOP
+A111	YI SYLLABLE DEX
+A112	YI SYLLABLE DE
+A113	YI SYLLABLE DEP
+A114	YI SYLLABLE DUT
+A115	YI SYLLABLE DUX
+A116	YI SYLLABLE DU
+A117	YI SYLLABLE DUP
+A118	YI SYLLABLE DURX
+A119	YI SYLLABLE DUR
+A11A	YI SYLLABLE TIT
+A11B	YI SYLLABLE TIX
+A11C	YI SYLLABLE TI
+A11D	YI SYLLABLE TIP
+A11E	YI SYLLABLE TIEX
+A11F	YI SYLLABLE TIE
+A120	YI SYLLABLE TIEP
+A121	YI SYLLABLE TAT
+A122	YI SYLLABLE TAX
+A123	YI SYLLABLE TA
+A124	YI SYLLABLE TAP
+A125	YI SYLLABLE TUOT
+A126	YI SYLLABLE TUOX
+A127	YI SYLLABLE TUO
+A128	YI SYLLABLE TUOP
+A129	YI SYLLABLE TOT
+A12A	YI SYLLABLE TOX
+A12B	YI SYLLABLE TO
+A12C	YI SYLLABLE TOP
+A12D	YI SYLLABLE TEX
+A12E	YI SYLLABLE TE
+A12F	YI SYLLABLE TEP
+A130	YI SYLLABLE TUT
+A131	YI SYLLABLE TUX
+A132	YI SYLLABLE TU
+A133	YI SYLLABLE TUP
+A134	YI SYLLABLE TURX
+A135	YI SYLLABLE TUR
+A136	YI SYLLABLE DDIT
+A137	YI SYLLABLE DDIX
+A138	YI SYLLABLE DDI
+A139	YI SYLLABLE DDIP
+A13A	YI SYLLABLE DDIEX
+A13B	YI SYLLABLE DDIE
+A13C	YI SYLLABLE DDIEP
+A13D	YI SYLLABLE DDAT
+A13E	YI SYLLABLE DDAX
+A13F	YI SYLLABLE DDA
+A140	YI SYLLABLE DDAP
+A141	YI SYLLABLE DDUOX
+A142	YI SYLLABLE DDUO
+A143	YI SYLLABLE DDUOP
+A144	YI SYLLABLE DDOT
+A145	YI SYLLABLE DDOX
+A146	YI SYLLABLE DDO
+A147	YI SYLLABLE DDOP
+A148	YI SYLLABLE DDEX
+A149	YI SYLLABLE DDE
+A14A	YI SYLLABLE DDEP
+A14B	YI SYLLABLE DDUT
+A14C	YI SYLLABLE DDUX
+A14D	YI SYLLABLE DDU
+A14E	YI SYLLABLE DDUP
+A14F	YI SYLLABLE DDURX
+A150	YI SYLLABLE DDUR
+A151	YI SYLLABLE NDIT
+A152	YI SYLLABLE NDIX
+A153	YI SYLLABLE NDI
+A154	YI SYLLABLE NDIP
+A155	YI SYLLABLE NDIEX
+A156	YI SYLLABLE NDIE
+A157	YI SYLLABLE NDAT
+A158	YI SYLLABLE NDAX
+A159	YI SYLLABLE NDA
+A15A	YI SYLLABLE NDAP
+A15B	YI SYLLABLE NDOT
+A15C	YI SYLLABLE NDOX
+A15D	YI SYLLABLE NDO
+A15E	YI SYLLABLE NDOP
+A15F	YI SYLLABLE NDEX
+A160	YI SYLLABLE NDE
+A161	YI SYLLABLE NDEP
+A162	YI SYLLABLE NDUT
+A163	YI SYLLABLE NDUX
+A164	YI SYLLABLE NDU
+A165	YI SYLLABLE NDUP
+A166	YI SYLLABLE NDURX
+A167	YI SYLLABLE NDUR
+A168	YI SYLLABLE HNIT
+A169	YI SYLLABLE HNIX
+A16A	YI SYLLABLE HNI
+A16B	YI SYLLABLE HNIP
+A16C	YI SYLLABLE HNIET
+A16D	YI SYLLABLE HNIEX
+A16E	YI SYLLABLE HNIE
+A16F	YI SYLLABLE HNIEP
+A170	YI SYLLABLE HNAT
+A171	YI SYLLABLE HNAX
+A172	YI SYLLABLE HNA
+A173	YI SYLLABLE HNAP
+A174	YI SYLLABLE HNUOX
+A175	YI SYLLABLE HNUO
+A176	YI SYLLABLE HNOT
+A177	YI SYLLABLE HNOX
+A178	YI SYLLABLE HNOP
+A179	YI SYLLABLE HNEX
+A17A	YI SYLLABLE HNE
+A17B	YI SYLLABLE HNEP
+A17C	YI SYLLABLE HNUT
+A17D	YI SYLLABLE NIT
+A17E	YI SYLLABLE NIX
+A17F	YI SYLLABLE NI
+A180	YI SYLLABLE NIP
+A181	YI SYLLABLE NIEX
+A182	YI SYLLABLE NIE
+A183	YI SYLLABLE NIEP
+A184	YI SYLLABLE NAX
+A185	YI SYLLABLE NA
+A186	YI SYLLABLE NAP
+A187	YI SYLLABLE NUOX
+A188	YI SYLLABLE NUO
+A189	YI SYLLABLE NUOP
+A18A	YI SYLLABLE NOT
+A18B	YI SYLLABLE NOX
+A18C	YI SYLLABLE NO
+A18D	YI SYLLABLE NOP
+A18E	YI SYLLABLE NEX
+A18F	YI SYLLABLE NE
+A190	YI SYLLABLE NEP
+A191	YI SYLLABLE NUT
+A192	YI SYLLABLE NUX
+A193	YI SYLLABLE NU
+A194	YI SYLLABLE NUP
+A195	YI SYLLABLE NURX
+A196	YI SYLLABLE NUR
+A197	YI SYLLABLE HLIT
+A198	YI SYLLABLE HLIX
+A199	YI SYLLABLE HLI
+A19A	YI SYLLABLE HLIP
+A19B	YI SYLLABLE HLIEX
+A19C	YI SYLLABLE HLIE
+A19D	YI SYLLABLE HLIEP
+A19E	YI SYLLABLE HLAT
+A19F	YI SYLLABLE HLAX
+A1A0	YI SYLLABLE HLA
+A1A1	YI SYLLABLE HLAP
+A1A2	YI SYLLABLE HLUOX
+A1A3	YI SYLLABLE HLUO
+A1A4	YI SYLLABLE HLUOP
+A1A5	YI SYLLABLE HLOX
+A1A6	YI SYLLABLE HLO
+A1A7	YI SYLLABLE HLOP
+A1A8	YI SYLLABLE HLEX
+A1A9	YI SYLLABLE HLE
+A1AA	YI SYLLABLE HLEP
+A1AB	YI SYLLABLE HLUT
+A1AC	YI SYLLABLE HLUX
+A1AD	YI SYLLABLE HLU
+A1AE	YI SYLLABLE HLUP
+A1AF	YI SYLLABLE HLURX
+A1B0	YI SYLLABLE HLUR
+A1B1	YI SYLLABLE HLYT
+A1B2	YI SYLLABLE HLYX
+A1B3	YI SYLLABLE HLY
+A1B4	YI SYLLABLE HLYP
+A1B5	YI SYLLABLE HLYRX
+A1B6	YI SYLLABLE HLYR
+A1B7	YI SYLLABLE LIT
+A1B8	YI SYLLABLE LIX
+A1B9	YI SYLLABLE LI
+A1BA	YI SYLLABLE LIP
+A1BB	YI SYLLABLE LIET
+A1BC	YI SYLLABLE LIEX
+A1BD	YI SYLLABLE LIE
+A1BE	YI SYLLABLE LIEP
+A1BF	YI SYLLABLE LAT
+A1C0	YI SYLLABLE LAX
+A1C1	YI SYLLABLE LA
+A1C2	YI SYLLABLE LAP
+A1C3	YI SYLLABLE LUOT
+A1C4	YI SYLLABLE LUOX
+A1C5	YI SYLLABLE LUO
+A1C6	YI SYLLABLE LUOP
+A1C7	YI SYLLABLE LOT
+A1C8	YI SYLLABLE LOX
+A1C9	YI SYLLABLE LO
+A1CA	YI SYLLABLE LOP
+A1CB	YI SYLLABLE LEX
+A1CC	YI SYLLABLE LE
+A1CD	YI SYLLABLE LEP
+A1CE	YI SYLLABLE LUT
+A1CF	YI SYLLABLE LUX
+A1D0	YI SYLLABLE LU
+A1D1	YI SYLLABLE LUP
+A1D2	YI SYLLABLE LURX
+A1D3	YI SYLLABLE LUR
+A1D4	YI SYLLABLE LYT
+A1D5	YI SYLLABLE LYX
+A1D6	YI SYLLABLE LY
+A1D7	YI SYLLABLE LYP
+A1D8	YI SYLLABLE LYRX
+A1D9	YI SYLLABLE LYR
+A1DA	YI SYLLABLE GIT
+A1DB	YI SYLLABLE GIX
+A1DC	YI SYLLABLE GI
+A1DD	YI SYLLABLE GIP
+A1DE	YI SYLLABLE GIET
+A1DF	YI SYLLABLE GIEX
+A1E0	YI SYLLABLE GIE
+A1E1	YI SYLLABLE GIEP
+A1E2	YI SYLLABLE GAT
+A1E3	YI SYLLABLE GAX
+A1E4	YI SYLLABLE GA
+A1E5	YI SYLLABLE GAP
+A1E6	YI SYLLABLE GUOT
+A1E7	YI SYLLABLE GUOX
+A1E8	YI SYLLABLE GUO
+A1E9	YI SYLLABLE GUOP
+A1EA	YI SYLLABLE GOT
+A1EB	YI SYLLABLE GOX
+A1EC	YI SYLLABLE GO
+A1ED	YI SYLLABLE GOP
+A1EE	YI SYLLABLE GET
+A1EF	YI SYLLABLE GEX
+A1F0	YI SYLLABLE GE
+A1F1	YI SYLLABLE GEP
+A1F2	YI SYLLABLE GUT
+A1F3	YI SYLLABLE GUX
+A1F4	YI SYLLABLE GU
+A1F5	YI SYLLABLE GUP
+A1F6	YI SYLLABLE GURX
+A1F7	YI SYLLABLE GUR
+A1F8	YI SYLLABLE KIT
+A1F9	YI SYLLABLE KIX
+A1FA	YI SYLLABLE KI
+A1FB	YI SYLLABLE KIP
+A1FC	YI SYLLABLE KIEX
+A1FD	YI SYLLABLE KIE
+A1FE	YI SYLLABLE KIEP
+A1FF	YI SYLLABLE KAT
+A200	YI SYLLABLE KAX
+A201	YI SYLLABLE KA
+A202	YI SYLLABLE KAP
+A203	YI SYLLABLE KUOX
+A204	YI SYLLABLE KUO
+A205	YI SYLLABLE KUOP
+A206	YI SYLLABLE KOT
+A207	YI SYLLABLE KOX
+A208	YI SYLLABLE KO
+A209	YI SYLLABLE KOP
+A20A	YI SYLLABLE KET
+A20B	YI SYLLABLE KEX
+A20C	YI SYLLABLE KE
+A20D	YI SYLLABLE KEP
+A20E	YI SYLLABLE KUT
+A20F	YI SYLLABLE KUX
+A210	YI SYLLABLE KU
+A211	YI SYLLABLE KUP
+A212	YI SYLLABLE KURX
+A213	YI SYLLABLE KUR
+A214	YI SYLLABLE GGIT
+A215	YI SYLLABLE GGIX
+A216	YI SYLLABLE GGI
+A217	YI SYLLABLE GGIEX
+A218	YI SYLLABLE GGIE
+A219	YI SYLLABLE GGIEP
+A21A	YI SYLLABLE GGAT
+A21B	YI SYLLABLE GGAX
+A21C	YI SYLLABLE GGA
+A21D	YI SYLLABLE GGAP
+A21E	YI SYLLABLE GGUOT
+A21F	YI SYLLABLE GGUOX
+A220	YI SYLLABLE GGUO
+A221	YI SYLLABLE GGUOP
+A222	YI SYLLABLE GGOT
+A223	YI SYLLABLE GGOX
+A224	YI SYLLABLE GGO
+A225	YI SYLLABLE GGOP
+A226	YI SYLLABLE GGET
+A227	YI SYLLABLE GGEX
+A228	YI SYLLABLE GGE
+A229	YI SYLLABLE GGEP
+A22A	YI SYLLABLE GGUT
+A22B	YI SYLLABLE GGUX
+A22C	YI SYLLABLE GGU
+A22D	YI SYLLABLE GGUP
+A22E	YI SYLLABLE GGURX
+A22F	YI SYLLABLE GGUR
+A230	YI SYLLABLE MGIEX
+A231	YI SYLLABLE MGIE
+A232	YI SYLLABLE MGAT
+A233	YI SYLLABLE MGAX
+A234	YI SYLLABLE MGA
+A235	YI SYLLABLE MGAP
+A236	YI SYLLABLE MGUOX
+A237	YI SYLLABLE MGUO
+A238	YI SYLLABLE MGUOP
+A239	YI SYLLABLE MGOT
+A23A	YI SYLLABLE MGOX
+A23B	YI SYLLABLE MGO
+A23C	YI SYLLABLE MGOP
+A23D	YI SYLLABLE MGEX
+A23E	YI SYLLABLE MGE
+A23F	YI SYLLABLE MGEP
+A240	YI SYLLABLE MGUT
+A241	YI SYLLABLE MGUX
+A242	YI SYLLABLE MGU
+A243	YI SYLLABLE MGUP
+A244	YI SYLLABLE MGURX
+A245	YI SYLLABLE MGUR
+A246	YI SYLLABLE HXIT
+A247	YI SYLLABLE HXIX
+A248	YI SYLLABLE HXI
+A249	YI SYLLABLE HXIP
+A24A	YI SYLLABLE HXIET
+A24B	YI SYLLABLE HXIEX
+A24C	YI SYLLABLE HXIE
+A24D	YI SYLLABLE HXIEP
+A24E	YI SYLLABLE HXAT
+A24F	YI SYLLABLE HXAX
+A250	YI SYLLABLE HXA
+A251	YI SYLLABLE HXAP
+A252	YI SYLLABLE HXUOT
+A253	YI SYLLABLE HXUOX
+A254	YI SYLLABLE HXUO
+A255	YI SYLLABLE HXUOP
+A256	YI SYLLABLE HXOT
+A257	YI SYLLABLE HXOX
+A258	YI SYLLABLE HXO
+A259	YI SYLLABLE HXOP
+A25A	YI SYLLABLE HXEX
+A25B	YI SYLLABLE HXE
+A25C	YI SYLLABLE HXEP
+A25D	YI SYLLABLE NGIEX
+A25E	YI SYLLABLE NGIE
+A25F	YI SYLLABLE NGIEP
+A260	YI SYLLABLE NGAT
+A261	YI SYLLABLE NGAX
+A262	YI SYLLABLE NGA
+A263	YI SYLLABLE NGAP
+A264	YI SYLLABLE NGUOT
+A265	YI SYLLABLE NGUOX
+A266	YI SYLLABLE NGUO
+A267	YI SYLLABLE NGOT
+A268	YI SYLLABLE NGOX
+A269	YI SYLLABLE NGO
+A26A	YI SYLLABLE NGOP
+A26B	YI SYLLABLE NGEX
+A26C	YI SYLLABLE NGE
+A26D	YI SYLLABLE NGEP
+A26E	YI SYLLABLE HIT
+A26F	YI SYLLABLE HIEX
+A270	YI SYLLABLE HIE
+A271	YI SYLLABLE HAT
+A272	YI SYLLABLE HAX
+A273	YI SYLLABLE HA
+A274	YI SYLLABLE HAP
+A275	YI SYLLABLE HUOT
+A276	YI SYLLABLE HUOX
+A277	YI SYLLABLE HUO
+A278	YI SYLLABLE HUOP
+A279	YI SYLLABLE HOT
+A27A	YI SYLLABLE HOX
+A27B	YI SYLLABLE HO
+A27C	YI SYLLABLE HOP
+A27D	YI SYLLABLE HEX
+A27E	YI SYLLABLE HE
+A27F	YI SYLLABLE HEP
+A280	YI SYLLABLE WAT
+A281	YI SYLLABLE WAX
+A282	YI SYLLABLE WA
+A283	YI SYLLABLE WAP
+A284	YI SYLLABLE WUOX
+A285	YI SYLLABLE WUO
+A286	YI SYLLABLE WUOP
+A287	YI SYLLABLE WOX
+A288	YI SYLLABLE WO
+A289	YI SYLLABLE WOP
+A28A	YI SYLLABLE WEX
+A28B	YI SYLLABLE WE
+A28C	YI SYLLABLE WEP
+A28D	YI SYLLABLE ZIT
+A28E	YI SYLLABLE ZIX
+A28F	YI SYLLABLE ZI
+A290	YI SYLLABLE ZIP
+A291	YI SYLLABLE ZIEX
+A292	YI SYLLABLE ZIE
+A293	YI SYLLABLE ZIEP
+A294	YI SYLLABLE ZAT
+A295	YI SYLLABLE ZAX
+A296	YI SYLLABLE ZA
+A297	YI SYLLABLE ZAP
+A298	YI SYLLABLE ZUOX
+A299	YI SYLLABLE ZUO
+A29A	YI SYLLABLE ZUOP
+A29B	YI SYLLABLE ZOT
+A29C	YI SYLLABLE ZOX
+A29D	YI SYLLABLE ZO
+A29E	YI SYLLABLE ZOP
+A29F	YI SYLLABLE ZEX
+A2A0	YI SYLLABLE ZE
+A2A1	YI SYLLABLE ZEP
+A2A2	YI SYLLABLE ZUT
+A2A3	YI SYLLABLE ZUX
+A2A4	YI SYLLABLE ZU
+A2A5	YI SYLLABLE ZUP
+A2A6	YI SYLLABLE ZURX
+A2A7	YI SYLLABLE ZUR
+A2A8	YI SYLLABLE ZYT
+A2A9	YI SYLLABLE ZYX
+A2AA	YI SYLLABLE ZY
+A2AB	YI SYLLABLE ZYP
+A2AC	YI SYLLABLE ZYRX
+A2AD	YI SYLLABLE ZYR
+A2AE	YI SYLLABLE CIT
+A2AF	YI SYLLABLE CIX
+A2B0	YI SYLLABLE CI
+A2B1	YI SYLLABLE CIP
+A2B2	YI SYLLABLE CIET
+A2B3	YI SYLLABLE CIEX
+A2B4	YI SYLLABLE CIE
+A2B5	YI SYLLABLE CIEP
+A2B6	YI SYLLABLE CAT
+A2B7	YI SYLLABLE CAX
+A2B8	YI SYLLABLE CA
+A2B9	YI SYLLABLE CAP
+A2BA	YI SYLLABLE CUOX
+A2BB	YI SYLLABLE CUO
+A2BC	YI SYLLABLE CUOP
+A2BD	YI SYLLABLE COT
+A2BE	YI SYLLABLE COX
+A2BF	YI SYLLABLE CO
+A2C0	YI SYLLABLE COP
+A2C1	YI SYLLABLE CEX
+A2C2	YI SYLLABLE CE
+A2C3	YI SYLLABLE CEP
+A2C4	YI SYLLABLE CUT
+A2C5	YI SYLLABLE CUX
+A2C6	YI SYLLABLE CU
+A2C7	YI SYLLABLE CUP
+A2C8	YI SYLLABLE CURX
+A2C9	YI SYLLABLE CUR
+A2CA	YI SYLLABLE CYT
+A2CB	YI SYLLABLE CYX
+A2CC	YI SYLLABLE CY
+A2CD	YI SYLLABLE CYP
+A2CE	YI SYLLABLE CYRX
+A2CF	YI SYLLABLE CYR
+A2D0	YI SYLLABLE ZZIT
+A2D1	YI SYLLABLE ZZIX
+A2D2	YI SYLLABLE ZZI
+A2D3	YI SYLLABLE ZZIP
+A2D4	YI SYLLABLE ZZIET
+A2D5	YI SYLLABLE ZZIEX
+A2D6	YI SYLLABLE ZZIE
+A2D7	YI SYLLABLE ZZIEP
+A2D8	YI SYLLABLE ZZAT
+A2D9	YI SYLLABLE ZZAX
+A2DA	YI SYLLABLE ZZA
+A2DB	YI SYLLABLE ZZAP
+A2DC	YI SYLLABLE ZZOX
+A2DD	YI SYLLABLE ZZO
+A2DE	YI SYLLABLE ZZOP
+A2DF	YI SYLLABLE ZZEX
+A2E0	YI SYLLABLE ZZE
+A2E1	YI SYLLABLE ZZEP
+A2E2	YI SYLLABLE ZZUX
+A2E3	YI SYLLABLE ZZU
+A2E4	YI SYLLABLE ZZUP
+A2E5	YI SYLLABLE ZZURX
+A2E6	YI SYLLABLE ZZUR
+A2E7	YI SYLLABLE ZZYT
+A2E8	YI SYLLABLE ZZYX
+A2E9	YI SYLLABLE ZZY
+A2EA	YI SYLLABLE ZZYP
+A2EB	YI SYLLABLE ZZYRX
+A2EC	YI SYLLABLE ZZYR
+A2ED	YI SYLLABLE NZIT
+A2EE	YI SYLLABLE NZIX
+A2EF	YI SYLLABLE NZI
+A2F0	YI SYLLABLE NZIP
+A2F1	YI SYLLABLE NZIEX
+A2F2	YI SYLLABLE NZIE
+A2F3	YI SYLLABLE NZIEP
+A2F4	YI SYLLABLE NZAT
+A2F5	YI SYLLABLE NZAX
+A2F6	YI SYLLABLE NZA
+A2F7	YI SYLLABLE NZAP
+A2F8	YI SYLLABLE NZUOX
+A2F9	YI SYLLABLE NZUO
+A2FA	YI SYLLABLE NZOX
+A2FB	YI SYLLABLE NZOP
+A2FC	YI SYLLABLE NZEX
+A2FD	YI SYLLABLE NZE
+A2FE	YI SYLLABLE NZUX
+A2FF	YI SYLLABLE NZU
+A300	YI SYLLABLE NZUP
+A301	YI SYLLABLE NZURX
+A302	YI SYLLABLE NZUR
+A303	YI SYLLABLE NZYT
+A304	YI SYLLABLE NZYX
+A305	YI SYLLABLE NZY
+A306	YI SYLLABLE NZYP
+A307	YI SYLLABLE NZYRX
+A308	YI SYLLABLE NZYR
+A309	YI SYLLABLE SIT
+A30A	YI SYLLABLE SIX
+A30B	YI SYLLABLE SI
+A30C	YI SYLLABLE SIP
+A30D	YI SYLLABLE SIEX
+A30E	YI SYLLABLE SIE
+A30F	YI SYLLABLE SIEP
+A310	YI SYLLABLE SAT
+A311	YI SYLLABLE SAX
+A312	YI SYLLABLE SA
+A313	YI SYLLABLE SAP
+A314	YI SYLLABLE SUOX
+A315	YI SYLLABLE SUO
+A316	YI SYLLABLE SUOP
+A317	YI SYLLABLE SOT
+A318	YI SYLLABLE SOX
+A319	YI SYLLABLE SO
+A31A	YI SYLLABLE SOP
+A31B	YI SYLLABLE SEX
+A31C	YI SYLLABLE SE
+A31D	YI SYLLABLE SEP
+A31E	YI SYLLABLE SUT
+A31F	YI SYLLABLE SUX
+A320	YI SYLLABLE SU
+A321	YI SYLLABLE SUP
+A322	YI SYLLABLE SURX
+A323	YI SYLLABLE SUR
+A324	YI SYLLABLE SYT
+A325	YI SYLLABLE SYX
+A326	YI SYLLABLE SY
+A327	YI SYLLABLE SYP
+A328	YI SYLLABLE SYRX
+A329	YI SYLLABLE SYR
+A32A	YI SYLLABLE SSIT
+A32B	YI SYLLABLE SSIX
+A32C	YI SYLLABLE SSI
+A32D	YI SYLLABLE SSIP
+A32E	YI SYLLABLE SSIEX
+A32F	YI SYLLABLE SSIE
+A330	YI SYLLABLE SSIEP
+A331	YI SYLLABLE SSAT
+A332	YI SYLLABLE SSAX
+A333	YI SYLLABLE SSA
+A334	YI SYLLABLE SSAP
+A335	YI SYLLABLE SSOT
+A336	YI SYLLABLE SSOX
+A337	YI SYLLABLE SSO
+A338	YI SYLLABLE SSOP
+A339	YI SYLLABLE SSEX
+A33A	YI SYLLABLE SSE
+A33B	YI SYLLABLE SSEP
+A33C	YI SYLLABLE SSUT
+A33D	YI SYLLABLE SSUX
+A33E	YI SYLLABLE SSU
+A33F	YI SYLLABLE SSUP
+A340	YI SYLLABLE SSYT
+A341	YI SYLLABLE SSYX
+A342	YI SYLLABLE SSY
+A343	YI SYLLABLE SSYP
+A344	YI SYLLABLE SSYRX
+A345	YI SYLLABLE SSYR
+A346	YI SYLLABLE ZHAT
+A347	YI SYLLABLE ZHAX
+A348	YI SYLLABLE ZHA
+A349	YI SYLLABLE ZHAP
+A34A	YI SYLLABLE ZHUOX
+A34B	YI SYLLABLE ZHUO
+A34C	YI SYLLABLE ZHUOP
+A34D	YI SYLLABLE ZHOT
+A34E	YI SYLLABLE ZHOX
+A34F	YI SYLLABLE ZHO
+A350	YI SYLLABLE ZHOP
+A351	YI SYLLABLE ZHET
+A352	YI SYLLABLE ZHEX
+A353	YI SYLLABLE ZHE
+A354	YI SYLLABLE ZHEP
+A355	YI SYLLABLE ZHUT
+A356	YI SYLLABLE ZHUX
+A357	YI SYLLABLE ZHU
+A358	YI SYLLABLE ZHUP
+A359	YI SYLLABLE ZHURX
+A35A	YI SYLLABLE ZHUR
+A35B	YI SYLLABLE ZHYT
+A35C	YI SYLLABLE ZHYX
+A35D	YI SYLLABLE ZHY
+A35E	YI SYLLABLE ZHYP
+A35F	YI SYLLABLE ZHYRX
+A360	YI SYLLABLE ZHYR
+A361	YI SYLLABLE CHAT
+A362	YI SYLLABLE CHAX
+A363	YI SYLLABLE CHA
+A364	YI SYLLABLE CHAP
+A365	YI SYLLABLE CHUOT
+A366	YI SYLLABLE CHUOX
+A367	YI SYLLABLE CHUO
+A368	YI SYLLABLE CHUOP
+A369	YI SYLLABLE CHOT
+A36A	YI SYLLABLE CHOX
+A36B	YI SYLLABLE CHO
+A36C	YI SYLLABLE CHOP
+A36D	YI SYLLABLE CHET
+A36E	YI SYLLABLE CHEX
+A36F	YI SYLLABLE CHE
+A370	YI SYLLABLE CHEP
+A371	YI SYLLABLE CHUX
+A372	YI SYLLABLE CHU
+A373	YI SYLLABLE CHUP
+A374	YI SYLLABLE CHURX
+A375	YI SYLLABLE CHUR
+A376	YI SYLLABLE CHYT
+A377	YI SYLLABLE CHYX
+A378	YI SYLLABLE CHY
+A379	YI SYLLABLE CHYP
+A37A	YI SYLLABLE CHYRX
+A37B	YI SYLLABLE CHYR
+A37C	YI SYLLABLE RRAX
+A37D	YI SYLLABLE RRA
+A37E	YI SYLLABLE RRUOX
+A37F	YI SYLLABLE RRUO
+A380	YI SYLLABLE RROT
+A381	YI SYLLABLE RROX
+A382	YI SYLLABLE RRO
+A383	YI SYLLABLE RROP
+A384	YI SYLLABLE RRET
+A385	YI SYLLABLE RREX
+A386	YI SYLLABLE RRE
+A387	YI SYLLABLE RREP
+A388	YI SYLLABLE RRUT
+A389	YI SYLLABLE RRUX
+A38A	YI SYLLABLE RRU
+A38B	YI SYLLABLE RRUP
+A38C	YI SYLLABLE RRURX
+A38D	YI SYLLABLE RRUR
+A38E	YI SYLLABLE RRYT
+A38F	YI SYLLABLE RRYX
+A390	YI SYLLABLE RRY
+A391	YI SYLLABLE RRYP
+A392	YI SYLLABLE RRYRX
+A393	YI SYLLABLE RRYR
+A394	YI SYLLABLE NRAT
+A395	YI SYLLABLE NRAX
+A396	YI SYLLABLE NRA
+A397	YI SYLLABLE NRAP
+A398	YI SYLLABLE NROX
+A399	YI SYLLABLE NRO
+A39A	YI SYLLABLE NROP
+A39B	YI SYLLABLE NRET
+A39C	YI SYLLABLE NREX
+A39D	YI SYLLABLE NRE
+A39E	YI SYLLABLE NREP
+A39F	YI SYLLABLE NRUT
+A3A0	YI SYLLABLE NRUX
+A3A1	YI SYLLABLE NRU
+A3A2	YI SYLLABLE NRUP
+A3A3	YI SYLLABLE NRURX
+A3A4	YI SYLLABLE NRUR
+A3A5	YI SYLLABLE NRYT
+A3A6	YI SYLLABLE NRYX
+A3A7	YI SYLLABLE NRY
+A3A8	YI SYLLABLE NRYP
+A3A9	YI SYLLABLE NRYRX
+A3AA	YI SYLLABLE NRYR
+A3AB	YI SYLLABLE SHAT
+A3AC	YI SYLLABLE SHAX
+A3AD	YI SYLLABLE SHA
+A3AE	YI SYLLABLE SHAP
+A3AF	YI SYLLABLE SHUOX
+A3B0	YI SYLLABLE SHUO
+A3B1	YI SYLLABLE SHUOP
+A3B2	YI SYLLABLE SHOT
+A3B3	YI SYLLABLE SHOX
+A3B4	YI SYLLABLE SHO
+A3B5	YI SYLLABLE SHOP
+A3B6	YI SYLLABLE SHET
+A3B7	YI SYLLABLE SHEX
+A3B8	YI SYLLABLE SHE
+A3B9	YI SYLLABLE SHEP
+A3BA	YI SYLLABLE SHUT
+A3BB	YI SYLLABLE SHUX
+A3BC	YI SYLLABLE SHU
+A3BD	YI SYLLABLE SHUP
+A3BE	YI SYLLABLE SHURX
+A3BF	YI SYLLABLE SHUR
+A3C0	YI SYLLABLE SHYT
+A3C1	YI SYLLABLE SHYX
+A3C2	YI SYLLABLE SHY
+A3C3	YI SYLLABLE SHYP
+A3C4	YI SYLLABLE SHYRX
+A3C5	YI SYLLABLE SHYR
+A3C6	YI SYLLABLE RAT
+A3C7	YI SYLLABLE RAX
+A3C8	YI SYLLABLE RA
+A3C9	YI SYLLABLE RAP
+A3CA	YI SYLLABLE RUOX
+A3CB	YI SYLLABLE RUO
+A3CC	YI SYLLABLE RUOP
+A3CD	YI SYLLABLE ROT
+A3CE	YI SYLLABLE ROX
+A3CF	YI SYLLABLE RO
+A3D0	YI SYLLABLE ROP
+A3D1	YI SYLLABLE REX
+A3D2	YI SYLLABLE RE
+A3D3	YI SYLLABLE REP
+A3D4	YI SYLLABLE RUT
+A3D5	YI SYLLABLE RUX
+A3D6	YI SYLLABLE RU
+A3D7	YI SYLLABLE RUP
+A3D8	YI SYLLABLE RURX
+A3D9	YI SYLLABLE RUR
+A3DA	YI SYLLABLE RYT
+A3DB	YI SYLLABLE RYX
+A3DC	YI SYLLABLE RY
+A3DD	YI SYLLABLE RYP
+A3DE	YI SYLLABLE RYRX
+A3DF	YI SYLLABLE RYR
+A3E0	YI SYLLABLE JIT
+A3E1	YI SYLLABLE JIX
+A3E2	YI SYLLABLE JI
+A3E3	YI SYLLABLE JIP
+A3E4	YI SYLLABLE JIET
+A3E5	YI SYLLABLE JIEX
+A3E6	YI SYLLABLE JIE
+A3E7	YI SYLLABLE JIEP
+A3E8	YI SYLLABLE JUOT
+A3E9	YI SYLLABLE JUOX
+A3EA	YI SYLLABLE JUO
+A3EB	YI SYLLABLE JUOP
+A3EC	YI SYLLABLE JOT
+A3ED	YI SYLLABLE JOX
+A3EE	YI SYLLABLE JO
+A3EF	YI SYLLABLE JOP
+A3F0	YI SYLLABLE JUT
+A3F1	YI SYLLABLE JUX
+A3F2	YI SYLLABLE JU
+A3F3	YI SYLLABLE JUP
+A3F4	YI SYLLABLE JURX
+A3F5	YI SYLLABLE JUR
+A3F6	YI SYLLABLE JYT
+A3F7	YI SYLLABLE JYX
+A3F8	YI SYLLABLE JY
+A3F9	YI SYLLABLE JYP
+A3FA	YI SYLLABLE JYRX
+A3FB	YI SYLLABLE JYR
+A3FC	YI SYLLABLE QIT
+A3FD	YI SYLLABLE QIX
+A3FE	YI SYLLABLE QI
+A3FF	YI SYLLABLE QIP
+A400	YI SYLLABLE QIET
+A401	YI SYLLABLE QIEX
+A402	YI SYLLABLE QIE
+A403	YI SYLLABLE QIEP
+A404	YI SYLLABLE QUOT
+A405	YI SYLLABLE QUOX
+A406	YI SYLLABLE QUO
+A407	YI SYLLABLE QUOP
+A408	YI SYLLABLE QOT
+A409	YI SYLLABLE QOX
+A40A	YI SYLLABLE QO
+A40B	YI SYLLABLE QOP
+A40C	YI SYLLABLE QUT
+A40D	YI SYLLABLE QUX
+A40E	YI SYLLABLE QU
+A40F	YI SYLLABLE QUP
+A410	YI SYLLABLE QURX
+A411	YI SYLLABLE QUR
+A412	YI SYLLABLE QYT
+A413	YI SYLLABLE QYX
+A414	YI SYLLABLE QY
+A415	YI SYLLABLE QYP
+A416	YI SYLLABLE QYRX
+A417	YI SYLLABLE QYR
+A418	YI SYLLABLE JJIT
+A419	YI SYLLABLE JJIX
+A41A	YI SYLLABLE JJI
+A41B	YI SYLLABLE JJIP
+A41C	YI SYLLABLE JJIET
+A41D	YI SYLLABLE JJIEX
+A41E	YI SYLLABLE JJIE
+A41F	YI SYLLABLE JJIEP
+A420	YI SYLLABLE JJUOX
+A421	YI SYLLABLE JJUO
+A422	YI SYLLABLE JJUOP
+A423	YI SYLLABLE JJOT
+A424	YI SYLLABLE JJOX
+A425	YI SYLLABLE JJO
+A426	YI SYLLABLE JJOP
+A427	YI SYLLABLE JJUT
+A428	YI SYLLABLE JJUX
+A429	YI SYLLABLE JJU
+A42A	YI SYLLABLE JJUP
+A42B	YI SYLLABLE JJURX
+A42C	YI SYLLABLE JJUR
+A42D	YI SYLLABLE JJYT
+A42E	YI SYLLABLE JJYX
+A42F	YI SYLLABLE JJY
+A430	YI SYLLABLE JJYP
+A431	YI SYLLABLE NJIT
+A432	YI SYLLABLE NJIX
+A433	YI SYLLABLE NJI
+A434	YI SYLLABLE NJIP
+A435	YI SYLLABLE NJIET
+A436	YI SYLLABLE NJIEX
+A437	YI SYLLABLE NJIE
+A438	YI SYLLABLE NJIEP
+A439	YI SYLLABLE NJUOX
+A43A	YI SYLLABLE NJUO
+A43B	YI SYLLABLE NJOT
+A43C	YI SYLLABLE NJOX
+A43D	YI SYLLABLE NJO
+A43E	YI SYLLABLE NJOP
+A43F	YI SYLLABLE NJUX
+A440	YI SYLLABLE NJU
+A441	YI SYLLABLE NJUP
+A442	YI SYLLABLE NJURX
+A443	YI SYLLABLE NJUR
+A444	YI SYLLABLE NJYT
+A445	YI SYLLABLE NJYX
+A446	YI SYLLABLE NJY
+A447	YI SYLLABLE NJYP
+A448	YI SYLLABLE NJYRX
+A449	YI SYLLABLE NJYR
+A44A	YI SYLLABLE NYIT
+A44B	YI SYLLABLE NYIX
+A44C	YI SYLLABLE NYI
+A44D	YI SYLLABLE NYIP
+A44E	YI SYLLABLE NYIET
+A44F	YI SYLLABLE NYIEX
+A450	YI SYLLABLE NYIE
+A451	YI SYLLABLE NYIEP
+A452	YI SYLLABLE NYUOX
+A453	YI SYLLABLE NYUO
+A454	YI SYLLABLE NYUOP
+A455	YI SYLLABLE NYOT
+A456	YI SYLLABLE NYOX
+A457	YI SYLLABLE NYO
+A458	YI SYLLABLE NYOP
+A459	YI SYLLABLE NYUT
+A45A	YI SYLLABLE NYUX
+A45B	YI SYLLABLE NYU
+A45C	YI SYLLABLE NYUP
+A45D	YI SYLLABLE XIT
+A45E	YI SYLLABLE XIX
+A45F	YI SYLLABLE XI
+A460	YI SYLLABLE XIP
+A461	YI SYLLABLE XIET
+A462	YI SYLLABLE XIEX
+A463	YI SYLLABLE XIE
+A464	YI SYLLABLE XIEP
+A465	YI SYLLABLE XUOX
+A466	YI SYLLABLE XUO
+A467	YI SYLLABLE XOT
+A468	YI SYLLABLE XOX
+A469	YI SYLLABLE XO
+A46A	YI SYLLABLE XOP
+A46B	YI SYLLABLE XYT
+A46C	YI SYLLABLE XYX
+A46D	YI SYLLABLE XY
+A46E	YI SYLLABLE XYP
+A46F	YI SYLLABLE XYRX
+A470	YI SYLLABLE XYR
+A471	YI SYLLABLE YIT
+A472	YI SYLLABLE YIX
+A473	YI SYLLABLE YI
+A474	YI SYLLABLE YIP
+A475	YI SYLLABLE YIET
+A476	YI SYLLABLE YIEX
+A477	YI SYLLABLE YIE
+A478	YI SYLLABLE YIEP
+A479	YI SYLLABLE YUOT
+A47A	YI SYLLABLE YUOX
+A47B	YI SYLLABLE YUO
+A47C	YI SYLLABLE YUOP
+A47D	YI SYLLABLE YOT
+A47E	YI SYLLABLE YOX
+A47F	YI SYLLABLE YO
+A480	YI SYLLABLE YOP
+A481	YI SYLLABLE YUT
+A482	YI SYLLABLE YUX
+A483	YI SYLLABLE YU
+A484	YI SYLLABLE YUP
+A485	YI SYLLABLE YURX
+A486	YI SYLLABLE YUR
+A487	YI SYLLABLE YYT
+A488	YI SYLLABLE YYX
+A489	YI SYLLABLE YY
+A48A	YI SYLLABLE YYP
+A48B	YI SYLLABLE YYRX
+A48C	YI SYLLABLE YYR
+@@	A490	Yi Radicals	A4CF
+@		Yi radicals
+A490	YI RADICAL QOT
+A491	YI RADICAL LI
+A492	YI RADICAL KIT
+A493	YI RADICAL NYIP
+A494	YI RADICAL CYP
+A495	YI RADICAL SSI
+A496	YI RADICAL GGOP
+A497	YI RADICAL GEP
+A498	YI RADICAL MI
+A499	YI RADICAL HXIT
+A49A	YI RADICAL LYR
+A49B	YI RADICAL BBUT
+A49C	YI RADICAL MOP
+A49D	YI RADICAL YO
+A49E	YI RADICAL PUT
+A49F	YI RADICAL HXUO
+A4A0	YI RADICAL TAT
+A4A1	YI RADICAL GA
+A4A2	YI RADICAL ZUP
+A4A3	YI RADICAL CYT
+A4A4	YI RADICAL DDUR
+A4A5	YI RADICAL BUR
+A4A6	YI RADICAL GGUO
+A4A7	YI RADICAL NYOP
+A4A8	YI RADICAL TU
+A4A9	YI RADICAL OP
+A4AA	YI RADICAL JJUT
+A4AB	YI RADICAL ZOT
+A4AC	YI RADICAL PYT
+A4AD	YI RADICAL HMO
+A4AE	YI RADICAL YIT
+A4AF	YI RADICAL VUR
+A4B0	YI RADICAL SHY
+A4B1	YI RADICAL VEP
+A4B2	YI RADICAL ZA
+A4B3	YI RADICAL JO
+A4B4	YI RADICAL NZUP
+A4B5	YI RADICAL JJY
+A4B6	YI RADICAL GOT
+A4B7	YI RADICAL JJIE
+A4B8	YI RADICAL WO
+A4B9	YI RADICAL DU
+A4BA	YI RADICAL SHUR
+A4BB	YI RADICAL LIE
+A4BC	YI RADICAL CY
+A4BD	YI RADICAL CUOP
+A4BE	YI RADICAL CIP
+A4BF	YI RADICAL HXOP
+A4C0	YI RADICAL SHAT
+A4C1	YI RADICAL ZUR
+A4C2	YI RADICAL SHOP
+A4C3	YI RADICAL CHE
+A4C4	YI RADICAL ZZIET
+A4C5	YI RADICAL NBIE
+A4C6	YI RADICAL KE
+@@	A700	Modifier Tone Letters	A71F
+@		Corner tone marks for Chinese
+A700	MODIFIER LETTER CHINESE TONE YIN PING
+A701	MODIFIER LETTER CHINESE TONE YANG PING
+A702	MODIFIER LETTER CHINESE TONE YIN SHANG
+A703	MODIFIER LETTER CHINESE TONE YANG SHANG
+A704	MODIFIER LETTER CHINESE TONE YIN QU
+A705	MODIFIER LETTER CHINESE TONE YANG QU
+A706	MODIFIER LETTER CHINESE TONE YIN RU
+A707	MODIFIER LETTER CHINESE TONE YANG RU
+@		Dotted tone letters
+A708	MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709	MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A	MODIFIER LETTER MID DOTTED TONE BAR
+A70B	MODIFIER LETTER LOW DOTTED TONE BAR
+A70C	MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D	MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E	MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F	MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710	MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711	MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+@		Left-stem tone letters
+A712	MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713	MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714	MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715	MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716	MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+@@	A800	Syloti Nagri	A82F
+@		Independent vowels and dvisvara
+A800	SYLOTI NAGRI LETTER A
+A801	SYLOTI NAGRI LETTER I
+A802	SYLOTI NAGRI SIGN DVISVARA
+A803	SYLOTI NAGRI LETTER U
+A804	SYLOTI NAGRI LETTER E
+A805	SYLOTI NAGRI LETTER O
+@		Sign
+A806	SYLOTI NAGRI SIGN HASANTA
+	= halant, virama
+@		Consonants and consonant signs
+A807	SYLOTI NAGRI LETTER KO
+A808	SYLOTI NAGRI LETTER KHO
+A809	SYLOTI NAGRI LETTER GO
+A80A	SYLOTI NAGRI LETTER GHO
+A80B	SYLOTI NAGRI SIGN ANUSVARA
+A80C	SYLOTI NAGRI LETTER CO
+A80D	SYLOTI NAGRI LETTER CHO
+A80E	SYLOTI NAGRI LETTER JO
+A80F	SYLOTI NAGRI LETTER JHO
+A810	SYLOTI NAGRI LETTER TTO
+A811	SYLOTI NAGRI LETTER TTHO
+A812	SYLOTI NAGRI LETTER DDO
+A813	SYLOTI NAGRI LETTER DDHO
+A814	SYLOTI NAGRI LETTER TO
+A815	SYLOTI NAGRI LETTER THO
+A816	SYLOTI NAGRI LETTER DO
+A817	SYLOTI NAGRI LETTER DHO
+A818	SYLOTI NAGRI LETTER NO
+A819	SYLOTI NAGRI LETTER PO
+A81A	SYLOTI NAGRI LETTER PHO
+A81B	SYLOTI NAGRI LETTER BO
+A81C	SYLOTI NAGRI LETTER BHO
+A81D	SYLOTI NAGRI LETTER MO
+A81E	SYLOTI NAGRI LETTER RO
+A81F	SYLOTI NAGRI LETTER LO
+A820	SYLOTI NAGRI LETTER RRO
+A821	SYLOTI NAGRI LETTER SO
+A822	SYLOTI NAGRI LETTER HO
+@	Dependent vowel signs
+A823	SYLOTI NAGRI VOWEL SIGN A
+A824	SYLOTI NAGRI VOWEL SIGN I
+A825	SYLOTI NAGRI VOWEL SIGN U
+A826	SYLOTI NAGRI VOWEL SIGN E
+A827	SYLOTI NAGRI VOWEL SIGN OO
+@	Poetry marks
+A828	SYLOTI NAGRI POETRY MARK-1
+A829	SYLOTI NAGRI POETRY MARK-2
+A82A	SYLOTI NAGRI POETRY MARK-3
+A82B	SYLOTI NAGRI POETRY MARK-4
+@@	AC00	Hangul Syllables	D7A3
+@@	D800	High Surrogates	DB7F
+@@	DB80	High Private Use Surrogates	DBFF
+@@	DC00	Low Surrogates	DFFF
+@@	E000	Private Use Area	F8FF
+@@	F900	CJK Compatibility Ideographs	FAFF
+@		Pronunciation variants from KS X 1001:1998
+F900	CJK COMPATIBILITY IDEOGRAPH-F900
+	: 8C48
+F901	CJK COMPATIBILITY IDEOGRAPH-F901
+	: 66F4
+F902	CJK COMPATIBILITY IDEOGRAPH-F902
+	: 8ECA
+F903	CJK COMPATIBILITY IDEOGRAPH-F903
+	: 8CC8
+F904	CJK COMPATIBILITY IDEOGRAPH-F904
+	: 6ED1
+F905	CJK COMPATIBILITY IDEOGRAPH-F905
+	: 4E32
+F906	CJK COMPATIBILITY IDEOGRAPH-F906
+	: 53E5
+F907	CJK COMPATIBILITY IDEOGRAPH-F907
+	: 9F9C
+F908	CJK COMPATIBILITY IDEOGRAPH-F908
+	: 9F9C
+F909	CJK COMPATIBILITY IDEOGRAPH-F909
+	: 5951
+F90A	CJK COMPATIBILITY IDEOGRAPH-F90A
+	: 91D1
+F90B	CJK COMPATIBILITY IDEOGRAPH-F90B
+	: 5587
+F90C	CJK COMPATIBILITY IDEOGRAPH-F90C
+	: 5948
+F90D	CJK COMPATIBILITY IDEOGRAPH-F90D
+	: 61F6
+F90E	CJK COMPATIBILITY IDEOGRAPH-F90E
+	: 7669
+F90F	CJK COMPATIBILITY IDEOGRAPH-F90F
+	: 7F85
+F910	CJK COMPATIBILITY IDEOGRAPH-F910
+	: 863F
+F911	CJK COMPATIBILITY IDEOGRAPH-F911
+	: 87BA
+F912	CJK COMPATIBILITY IDEOGRAPH-F912
+	: 88F8
+F913	CJK COMPATIBILITY IDEOGRAPH-F913
+	: 908F
+F914	CJK COMPATIBILITY IDEOGRAPH-F914
+	: 6A02
+F915	CJK COMPATIBILITY IDEOGRAPH-F915
+	: 6D1B
+F916	CJK COMPATIBILITY IDEOGRAPH-F916
+	: 70D9
+F917	CJK COMPATIBILITY IDEOGRAPH-F917
+	: 73DE
+F918	CJK COMPATIBILITY IDEOGRAPH-F918
+	: 843D
+F919	CJK COMPATIBILITY IDEOGRAPH-F919
+	: 916A
+F91A	CJK COMPATIBILITY IDEOGRAPH-F91A
+	: 99F1
+F91B	CJK COMPATIBILITY IDEOGRAPH-F91B
+	: 4E82
+F91C	CJK COMPATIBILITY IDEOGRAPH-F91C
+	: 5375
+F91D	CJK COMPATIBILITY IDEOGRAPH-F91D
+	: 6B04
+F91E	CJK COMPATIBILITY IDEOGRAPH-F91E
+	: 721B
+F91F	CJK COMPATIBILITY IDEOGRAPH-F91F
+	: 862D
+F920	CJK COMPATIBILITY IDEOGRAPH-F920
+	: 9E1E
+F921	CJK COMPATIBILITY IDEOGRAPH-F921
+	: 5D50
+F922	CJK COMPATIBILITY IDEOGRAPH-F922
+	: 6FEB
+F923	CJK COMPATIBILITY IDEOGRAPH-F923
+	: 85CD
+F924	CJK COMPATIBILITY IDEOGRAPH-F924
+	: 8964
+F925	CJK COMPATIBILITY IDEOGRAPH-F925
+	: 62C9
+F926	CJK COMPATIBILITY IDEOGRAPH-F926
+	: 81D8
+F927	CJK COMPATIBILITY IDEOGRAPH-F927
+	: 881F
+F928	CJK COMPATIBILITY IDEOGRAPH-F928
+	: 5ECA
+F929	CJK COMPATIBILITY IDEOGRAPH-F929
+	: 6717
+F92A	CJK COMPATIBILITY IDEOGRAPH-F92A
+	: 6D6A
+F92B	CJK COMPATIBILITY IDEOGRAPH-F92B
+	: 72FC
+F92C	CJK COMPATIBILITY IDEOGRAPH-F92C
+	: 90CE
+F92D	CJK COMPATIBILITY IDEOGRAPH-F92D
+	: 4F86
+F92E	CJK COMPATIBILITY IDEOGRAPH-F92E
+	: 51B7
+F92F	CJK COMPATIBILITY IDEOGRAPH-F92F
+	: 52DE
+F930	CJK COMPATIBILITY IDEOGRAPH-F930
+	: 64C4
+F931	CJK COMPATIBILITY IDEOGRAPH-F931
+	: 6AD3
+F932	CJK COMPATIBILITY IDEOGRAPH-F932
+	: 7210
+F933	CJK COMPATIBILITY IDEOGRAPH-F933
+	: 76E7
+F934	CJK COMPATIBILITY IDEOGRAPH-F934
+	: 8001
+F935	CJK COMPATIBILITY IDEOGRAPH-F935
+	: 8606
+F936	CJK COMPATIBILITY IDEOGRAPH-F936
+	: 865C
+F937	CJK COMPATIBILITY IDEOGRAPH-F937
+	: 8DEF
+F938	CJK COMPATIBILITY IDEOGRAPH-F938
+	: 9732
+F939	CJK COMPATIBILITY IDEOGRAPH-F939
+	: 9B6F
+F93A	CJK COMPATIBILITY IDEOGRAPH-F93A
+	: 9DFA
+F93B	CJK COMPATIBILITY IDEOGRAPH-F93B
+	: 788C
+F93C	CJK COMPATIBILITY IDEOGRAPH-F93C
+	: 797F
+F93D	CJK COMPATIBILITY IDEOGRAPH-F93D
+	: 7DA0
+F93E	CJK COMPATIBILITY IDEOGRAPH-F93E
+	: 83C9
+F93F	CJK COMPATIBILITY IDEOGRAPH-F93F
+	: 9304
+F940	CJK COMPATIBILITY IDEOGRAPH-F940
+	: 9E7F
+F941	CJK COMPATIBILITY IDEOGRAPH-F941
+	: 8AD6
+F942	CJK COMPATIBILITY IDEOGRAPH-F942
+	: 58DF
+F943	CJK COMPATIBILITY IDEOGRAPH-F943
+	: 5F04
+F944	CJK COMPATIBILITY IDEOGRAPH-F944
+	: 7C60
+F945	CJK COMPATIBILITY IDEOGRAPH-F945
+	: 807E
+F946	CJK COMPATIBILITY IDEOGRAPH-F946
+	: 7262
+F947	CJK COMPATIBILITY IDEOGRAPH-F947
+	: 78CA
+F948	CJK COMPATIBILITY IDEOGRAPH-F948
+	: 8CC2
+F949	CJK COMPATIBILITY IDEOGRAPH-F949
+	: 96F7
+F94A	CJK COMPATIBILITY IDEOGRAPH-F94A
+	: 58D8
+F94B	CJK COMPATIBILITY IDEOGRAPH-F94B
+	: 5C62
+F94C	CJK COMPATIBILITY IDEOGRAPH-F94C
+	: 6A13
+F94D	CJK COMPATIBILITY IDEOGRAPH-F94D
+	: 6DDA
+F94E	CJK COMPATIBILITY IDEOGRAPH-F94E
+	: 6F0F
+F94F	CJK COMPATIBILITY IDEOGRAPH-F94F
+	: 7D2F
+F950	CJK COMPATIBILITY IDEOGRAPH-F950
+	: 7E37
+F951	CJK COMPATIBILITY IDEOGRAPH-F951
+	: 964B
+F952	CJK COMPATIBILITY IDEOGRAPH-F952
+	: 52D2
+F953	CJK COMPATIBILITY IDEOGRAPH-F953
+	: 808B
+F954	CJK COMPATIBILITY IDEOGRAPH-F954
+	: 51DC
+F955	CJK COMPATIBILITY IDEOGRAPH-F955
+	: 51CC
+F956	CJK COMPATIBILITY IDEOGRAPH-F956
+	: 7A1C
+F957	CJK COMPATIBILITY IDEOGRAPH-F957
+	: 7DBE
+F958	CJK COMPATIBILITY IDEOGRAPH-F958
+	: 83F1
+F959	CJK COMPATIBILITY IDEOGRAPH-F959
+	: 9675
+F95A	CJK COMPATIBILITY IDEOGRAPH-F95A
+	: 8B80
+F95B	CJK COMPATIBILITY IDEOGRAPH-F95B
+	: 62CF
+F95C	CJK COMPATIBILITY IDEOGRAPH-F95C
+	: 6A02
+F95D	CJK COMPATIBILITY IDEOGRAPH-F95D
+	: 8AFE
+F95E	CJK COMPATIBILITY IDEOGRAPH-F95E
+	: 4E39
+F95F	CJK COMPATIBILITY IDEOGRAPH-F95F
+	: 5BE7
+F960	CJK COMPATIBILITY IDEOGRAPH-F960
+	: 6012
+F961	CJK COMPATIBILITY IDEOGRAPH-F961
+	: 7387
+F962	CJK COMPATIBILITY IDEOGRAPH-F962
+	: 7570
+F963	CJK COMPATIBILITY IDEOGRAPH-F963
+	: 5317
+F964	CJK COMPATIBILITY IDEOGRAPH-F964
+	: 78FB
+F965	CJK COMPATIBILITY IDEOGRAPH-F965
+	: 4FBF
+F966	CJK COMPATIBILITY IDEOGRAPH-F966
+	: 5FA9
+F967	CJK COMPATIBILITY IDEOGRAPH-F967
+	: 4E0D
+F968	CJK COMPATIBILITY IDEOGRAPH-F968
+	: 6CCC
+F969	CJK COMPATIBILITY IDEOGRAPH-F969
+	: 6578
+F96A	CJK COMPATIBILITY IDEOGRAPH-F96A
+	: 7D22
+F96B	CJK COMPATIBILITY IDEOGRAPH-F96B
+	: 53C3
+F96C	CJK COMPATIBILITY IDEOGRAPH-F96C
+	: 585E
+F96D	CJK COMPATIBILITY IDEOGRAPH-F96D
+	: 7701
+F96E	CJK COMPATIBILITY IDEOGRAPH-F96E
+	: 8449
+F96F	CJK COMPATIBILITY IDEOGRAPH-F96F
+	: 8AAA
+F970	CJK COMPATIBILITY IDEOGRAPH-F970
+	: 6BBA
+F971	CJK COMPATIBILITY IDEOGRAPH-F971
+	: 8FB0
+F972	CJK COMPATIBILITY IDEOGRAPH-F972
+	: 6C88
+F973	CJK COMPATIBILITY IDEOGRAPH-F973
+	: 62FE
+F974	CJK COMPATIBILITY IDEOGRAPH-F974
+	: 82E5
+F975	CJK COMPATIBILITY IDEOGRAPH-F975
+	: 63A0
+F976	CJK COMPATIBILITY IDEOGRAPH-F976
+	: 7565
+F977	CJK COMPATIBILITY IDEOGRAPH-F977
+	: 4EAE
+F978	CJK COMPATIBILITY IDEOGRAPH-F978
+	: 5169
+F979	CJK COMPATIBILITY IDEOGRAPH-F979
+	: 51C9
+F97A	CJK COMPATIBILITY IDEOGRAPH-F97A
+	: 6881
+F97B	CJK COMPATIBILITY IDEOGRAPH-F97B
+	: 7CE7
+F97C	CJK COMPATIBILITY IDEOGRAPH-F97C
+	: 826F
+F97D	CJK COMPATIBILITY IDEOGRAPH-F97D
+	: 8AD2
+F97E	CJK COMPATIBILITY IDEOGRAPH-F97E
+	: 91CF
+F97F	CJK COMPATIBILITY IDEOGRAPH-F97F
+	: 52F5
+F980	CJK COMPATIBILITY IDEOGRAPH-F980
+	: 5442
+F981	CJK COMPATIBILITY IDEOGRAPH-F981
+	: 5973
+F982	CJK COMPATIBILITY IDEOGRAPH-F982
+	: 5EEC
+F983	CJK COMPATIBILITY IDEOGRAPH-F983
+	: 65C5
+F984	CJK COMPATIBILITY IDEOGRAPH-F984
+	: 6FFE
+F985	CJK COMPATIBILITY IDEOGRAPH-F985
+	: 792A
+F986	CJK COMPATIBILITY IDEOGRAPH-F986
+	: 95AD
+F987	CJK COMPATIBILITY IDEOGRAPH-F987
+	: 9A6A
+F988	CJK COMPATIBILITY IDEOGRAPH-F988
+	: 9E97
+F989	CJK COMPATIBILITY IDEOGRAPH-F989
+	: 9ECE
+F98A	CJK COMPATIBILITY IDEOGRAPH-F98A
+	: 529B
+F98B	CJK COMPATIBILITY IDEOGRAPH-F98B
+	: 66C6
+F98C	CJK COMPATIBILITY IDEOGRAPH-F98C
+	: 6B77
+F98D	CJK COMPATIBILITY IDEOGRAPH-F98D
+	: 8F62
+F98E	CJK COMPATIBILITY IDEOGRAPH-F98E
+	: 5E74
+F98F	CJK COMPATIBILITY IDEOGRAPH-F98F
+	: 6190
+F990	CJK COMPATIBILITY IDEOGRAPH-F990
+	: 6200
+F991	CJK COMPATIBILITY IDEOGRAPH-F991
+	: 649A
+F992	CJK COMPATIBILITY IDEOGRAPH-F992
+	: 6F23
+F993	CJK COMPATIBILITY IDEOGRAPH-F993
+	: 7149
+F994	CJK COMPATIBILITY IDEOGRAPH-F994
+	: 7489
+F995	CJK COMPATIBILITY IDEOGRAPH-F995
+	: 79CA
+F996	CJK COMPATIBILITY IDEOGRAPH-F996
+	: 7DF4
+F997	CJK COMPATIBILITY IDEOGRAPH-F997
+	: 806F
+F998	CJK COMPATIBILITY IDEOGRAPH-F998
+	: 8F26
+F999	CJK COMPATIBILITY IDEOGRAPH-F999
+	: 84EE
+F99A	CJK COMPATIBILITY IDEOGRAPH-F99A
+	: 9023
+F99B	CJK COMPATIBILITY IDEOGRAPH-F99B
+	: 934A
+F99C	CJK COMPATIBILITY IDEOGRAPH-F99C
+	: 5217
+F99D	CJK COMPATIBILITY IDEOGRAPH-F99D
+	: 52A3
+F99E	CJK COMPATIBILITY IDEOGRAPH-F99E
+	: 54BD
+F99F	CJK COMPATIBILITY IDEOGRAPH-F99F
+	: 70C8
+F9A0	CJK COMPATIBILITY IDEOGRAPH-F9A0
+	: 88C2
+F9A1	CJK COMPATIBILITY IDEOGRAPH-F9A1
+	: 8AAA
+F9A2	CJK COMPATIBILITY IDEOGRAPH-F9A2
+	: 5EC9
+F9A3	CJK COMPATIBILITY IDEOGRAPH-F9A3
+	: 5FF5
+F9A4	CJK COMPATIBILITY IDEOGRAPH-F9A4
+	: 637B
+F9A5	CJK COMPATIBILITY IDEOGRAPH-F9A5
+	: 6BAE
+F9A6	CJK COMPATIBILITY IDEOGRAPH-F9A6
+	: 7C3E
+F9A7	CJK COMPATIBILITY IDEOGRAPH-F9A7
+	: 7375
+F9A8	CJK COMPATIBILITY IDEOGRAPH-F9A8
+	: 4EE4
+F9A9	CJK COMPATIBILITY IDEOGRAPH-F9A9
+	: 56F9
+F9AA	CJK COMPATIBILITY IDEOGRAPH-F9AA
+	: 5BE7
+F9AB	CJK COMPATIBILITY IDEOGRAPH-F9AB
+	: 5DBA
+F9AC	CJK COMPATIBILITY IDEOGRAPH-F9AC
+	: 601C
+F9AD	CJK COMPATIBILITY IDEOGRAPH-F9AD
+	: 73B2
+F9AE	CJK COMPATIBILITY IDEOGRAPH-F9AE
+	: 7469
+F9AF	CJK COMPATIBILITY IDEOGRAPH-F9AF
+	: 7F9A
+F9B0	CJK COMPATIBILITY IDEOGRAPH-F9B0
+	: 8046
+F9B1	CJK COMPATIBILITY IDEOGRAPH-F9B1
+	: 9234
+F9B2	CJK COMPATIBILITY IDEOGRAPH-F9B2
+	: 96F6
+F9B3	CJK COMPATIBILITY IDEOGRAPH-F9B3
+	: 9748
+F9B4	CJK COMPATIBILITY IDEOGRAPH-F9B4
+	: 9818
+F9B5	CJK COMPATIBILITY IDEOGRAPH-F9B5
+	: 4F8B
+F9B6	CJK COMPATIBILITY IDEOGRAPH-F9B6
+	: 79AE
+F9B7	CJK COMPATIBILITY IDEOGRAPH-F9B7
+	: 91B4
+F9B8	CJK COMPATIBILITY IDEOGRAPH-F9B8
+	x (cjk unified ideograph-96B7 - 96B7)
+	: 96B8
+F9B9	CJK COMPATIBILITY IDEOGRAPH-F9B9
+	: 60E1
+F9BA	CJK COMPATIBILITY IDEOGRAPH-F9BA
+	: 4E86
+F9BB	CJK COMPATIBILITY IDEOGRAPH-F9BB
+	: 50DA
+F9BC	CJK COMPATIBILITY IDEOGRAPH-F9BC
+	: 5BEE
+F9BD	CJK COMPATIBILITY IDEOGRAPH-F9BD
+	: 5C3F
+F9BE	CJK COMPATIBILITY IDEOGRAPH-F9BE
+	: 6599
+F9BF	CJK COMPATIBILITY IDEOGRAPH-F9BF
+	: 6A02
+F9C0	CJK COMPATIBILITY IDEOGRAPH-F9C0
+	: 71CE
+F9C1	CJK COMPATIBILITY IDEOGRAPH-F9C1
+	: 7642
+F9C2	CJK COMPATIBILITY IDEOGRAPH-F9C2
+	: 84FC
+F9C3	CJK COMPATIBILITY IDEOGRAPH-F9C3
+	: 907C
+F9C4	CJK COMPATIBILITY IDEOGRAPH-F9C4
+	: 9F8D
+F9C5	CJK COMPATIBILITY IDEOGRAPH-F9C5
+	: 6688
+F9C6	CJK COMPATIBILITY IDEOGRAPH-F9C6
+	: 962E
+F9C7	CJK COMPATIBILITY IDEOGRAPH-F9C7
+	: 5289
+F9C8	CJK COMPATIBILITY IDEOGRAPH-F9C8
+	: 677B
+F9C9	CJK COMPATIBILITY IDEOGRAPH-F9C9
+	: 67F3
+F9CA	CJK COMPATIBILITY IDEOGRAPH-F9CA
+	: 6D41
+F9CB	CJK COMPATIBILITY IDEOGRAPH-F9CB
+	: 6E9C
+F9CC	CJK COMPATIBILITY IDEOGRAPH-F9CC
+	: 7409
+F9CD	CJK COMPATIBILITY IDEOGRAPH-F9CD
+	: 7559
+F9CE	CJK COMPATIBILITY IDEOGRAPH-F9CE
+	: 786B
+F9CF	CJK COMPATIBILITY IDEOGRAPH-F9CF
+	: 7D10
+F9D0	CJK COMPATIBILITY IDEOGRAPH-F9D0
+	: 985E
+F9D1	CJK COMPATIBILITY IDEOGRAPH-F9D1
+	: 516D
+F9D2	CJK COMPATIBILITY IDEOGRAPH-F9D2
+	: 622E
+F9D3	CJK COMPATIBILITY IDEOGRAPH-F9D3
+	: 9678
+F9D4	CJK COMPATIBILITY IDEOGRAPH-F9D4
+	: 502B
+F9D5	CJK COMPATIBILITY IDEOGRAPH-F9D5
+	: 5D19
+F9D6	CJK COMPATIBILITY IDEOGRAPH-F9D6
+	: 6DEA
+F9D7	CJK COMPATIBILITY IDEOGRAPH-F9D7
+	: 8F2A
+F9D8	CJK COMPATIBILITY IDEOGRAPH-F9D8
+	: 5F8B
+F9D9	CJK COMPATIBILITY IDEOGRAPH-F9D9
+	: 6144
+F9DA	CJK COMPATIBILITY IDEOGRAPH-F9DA
+	: 6817
+F9DB	CJK COMPATIBILITY IDEOGRAPH-F9DB
+	: 7387
+F9DC	CJK COMPATIBILITY IDEOGRAPH-F9DC
+	: 9686
+F9DD	CJK COMPATIBILITY IDEOGRAPH-F9DD
+	: 5229
+F9DE	CJK COMPATIBILITY IDEOGRAPH-F9DE
+	: 540F
+F9DF	CJK COMPATIBILITY IDEOGRAPH-F9DF
+	: 5C65
+F9E0	CJK COMPATIBILITY IDEOGRAPH-F9E0
+	: 6613
+F9E1	CJK COMPATIBILITY IDEOGRAPH-F9E1
+	: 674E
+F9E2	CJK COMPATIBILITY IDEOGRAPH-F9E2
+	: 68A8
+F9E3	CJK COMPATIBILITY IDEOGRAPH-F9E3
+	: 6CE5
+F9E4	CJK COMPATIBILITY IDEOGRAPH-F9E4
+	: 7406
+F9E5	CJK COMPATIBILITY IDEOGRAPH-F9E5
+	: 75E2
+F9E6	CJK COMPATIBILITY IDEOGRAPH-F9E6
+	: 7F79
+F9E7	CJK COMPATIBILITY IDEOGRAPH-F9E7
+	: 88CF
+F9E8	CJK COMPATIBILITY IDEOGRAPH-F9E8
+	: 88E1
+F9E9	CJK COMPATIBILITY IDEOGRAPH-F9E9
+	: 91CC
+F9EA	CJK COMPATIBILITY IDEOGRAPH-F9EA
+	: 96E2
+F9EB	CJK COMPATIBILITY IDEOGRAPH-F9EB
+	: 533F
+F9EC	CJK COMPATIBILITY IDEOGRAPH-F9EC
+	: 6EBA
+F9ED	CJK COMPATIBILITY IDEOGRAPH-F9ED
+	: 541D
+F9EE	CJK COMPATIBILITY IDEOGRAPH-F9EE
+	: 71D0
+F9EF	CJK COMPATIBILITY IDEOGRAPH-F9EF
+	: 7498
+F9F0	CJK COMPATIBILITY IDEOGRAPH-F9F0
+	: 85FA
+F9F1	CJK COMPATIBILITY IDEOGRAPH-F9F1
+	: 96A3
+F9F2	CJK COMPATIBILITY IDEOGRAPH-F9F2
+	: 9C57
+F9F3	CJK COMPATIBILITY IDEOGRAPH-F9F3
+	: 9E9F
+F9F4	CJK COMPATIBILITY IDEOGRAPH-F9F4
+	: 6797
+F9F5	CJK COMPATIBILITY IDEOGRAPH-F9F5
+	: 6DCB
+F9F6	CJK COMPATIBILITY IDEOGRAPH-F9F6
+	: 81E8
+F9F7	CJK COMPATIBILITY IDEOGRAPH-F9F7
+	: 7ACB
+F9F8	CJK COMPATIBILITY IDEOGRAPH-F9F8
+	: 7B20
+F9F9	CJK COMPATIBILITY IDEOGRAPH-F9F9
+	: 7C92
+F9FA	CJK COMPATIBILITY IDEOGRAPH-F9FA
+	: 72C0
+F9FB	CJK COMPATIBILITY IDEOGRAPH-F9FB
+	: 7099
+F9FC	CJK COMPATIBILITY IDEOGRAPH-F9FC
+	: 8B58
+F9FD	CJK COMPATIBILITY IDEOGRAPH-F9FD
+	: 4EC0
+F9FE	CJK COMPATIBILITY IDEOGRAPH-F9FE
+	: 8336
+F9FF	CJK COMPATIBILITY IDEOGRAPH-F9FF
+	: 523A
+FA00	CJK COMPATIBILITY IDEOGRAPH-FA00
+	: 5207
+FA01	CJK COMPATIBILITY IDEOGRAPH-FA01
+	: 5EA6
+FA02	CJK COMPATIBILITY IDEOGRAPH-FA02
+	: 62D3
+FA03	CJK COMPATIBILITY IDEOGRAPH-FA03
+	: 7CD6
+FA04	CJK COMPATIBILITY IDEOGRAPH-FA04
+	: 5B85
+FA05	CJK COMPATIBILITY IDEOGRAPH-FA05
+	: 6D1E
+FA06	CJK COMPATIBILITY IDEOGRAPH-FA06
+	: 66B4
+FA07	CJK COMPATIBILITY IDEOGRAPH-FA07
+	: 8F3B
+FA08	CJK COMPATIBILITY IDEOGRAPH-FA08
+	: 884C
+FA09	CJK COMPATIBILITY IDEOGRAPH-FA09
+	: 964D
+FA0A	CJK COMPATIBILITY IDEOGRAPH-FA0A
+	: 898B
+FA0B	CJK COMPATIBILITY IDEOGRAPH-FA0B
+	: 5ED3
+@		Duplicates from Big 5
+FA0C	CJK COMPATIBILITY IDEOGRAPH-FA0C
+	: 5140
+FA0D	CJK COMPATIBILITY IDEOGRAPH-FA0D
+	: 55C0
+@		The IBM 32 compatibility ideographs
+FA0E	CJK COMPATIBILITY IDEOGRAPH-FA0E
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA0F	CJK COMPATIBILITY IDEOGRAPH-FA0F
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA10	CJK COMPATIBILITY IDEOGRAPH-FA10
+	: 585A
+FA11	CJK COMPATIBILITY IDEOGRAPH-FA11
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA12	CJK COMPATIBILITY IDEOGRAPH-FA12
+	: 6674
+FA13	CJK COMPATIBILITY IDEOGRAPH-FA13
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA14	CJK COMPATIBILITY IDEOGRAPH-FA14
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA15	CJK COMPATIBILITY IDEOGRAPH-FA15
+	: 51DE
+FA16	CJK COMPATIBILITY IDEOGRAPH-FA16
+	: 732A
+FA17	CJK COMPATIBILITY IDEOGRAPH-FA17
+	: 76CA
+FA18	CJK COMPATIBILITY IDEOGRAPH-FA18
+	: 793C
+FA19	CJK COMPATIBILITY IDEOGRAPH-FA19
+	: 795E
+FA1A	CJK COMPATIBILITY IDEOGRAPH-FA1A
+	: 7965
+FA1B	CJK COMPATIBILITY IDEOGRAPH-FA1B
+	: 798F
+FA1C	CJK COMPATIBILITY IDEOGRAPH-FA1C
+	: 9756
+FA1D	CJK COMPATIBILITY IDEOGRAPH-FA1D
+	: 7CBE
+FA1E	CJK COMPATIBILITY IDEOGRAPH-FA1E
+	: 7FBD
+FA1F	CJK COMPATIBILITY IDEOGRAPH-FA1F *
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA20	CJK COMPATIBILITY IDEOGRAPH-FA20
+	: 8612
+FA21	CJK COMPATIBILITY IDEOGRAPH-FA21
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA22	CJK COMPATIBILITY IDEOGRAPH-FA22
+	: 8AF8
+FA23	CJK COMPATIBILITY IDEOGRAPH-FA23 *
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA24	CJK COMPATIBILITY IDEOGRAPH-FA24
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA25	CJK COMPATIBILITY IDEOGRAPH-FA25
+	: 9038
+FA26	CJK COMPATIBILITY IDEOGRAPH-FA26
+	: 90FD
+FA27	CJK COMPATIBILITY IDEOGRAPH-FA27
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA28	CJK COMPATIBILITY IDEOGRAPH-FA28
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA29	CJK COMPATIBILITY IDEOGRAPH-FA29
+	* a unified CJK ideograph, not a compatibility ideograph, despite its name
+FA2A	CJK COMPATIBILITY IDEOGRAPH-FA2A
+	: 98EF
+FA2B	CJK COMPATIBILITY IDEOGRAPH-FA2B
+	: 98FC
+FA2C	CJK COMPATIBILITY IDEOGRAPH-FA2C
+	: 9928
+FA2D	CJK COMPATIBILITY IDEOGRAPH-FA2D
+	: 9DB4
+@		JIS X 0213 compatibility ideographs
+FA30	CJK COMPATIBILITY IDEOGRAPH-FA30
+	: 4FAE
+FA31	CJK COMPATIBILITY IDEOGRAPH-FA31
+	: 50E7
+FA32	CJK COMPATIBILITY IDEOGRAPH-FA32
+	: 514D
+FA33	CJK COMPATIBILITY IDEOGRAPH-FA33
+	: 52C9
+FA34	CJK COMPATIBILITY IDEOGRAPH-FA34
+	: 52E4
+FA35	CJK COMPATIBILITY IDEOGRAPH-FA35
+	: 5351
+FA36	CJK COMPATIBILITY IDEOGRAPH-FA36
+	: 559D
+FA37	CJK COMPATIBILITY IDEOGRAPH-FA37
+	: 5606
+FA38	CJK COMPATIBILITY IDEOGRAPH-FA38
+	: 5668
+FA39	CJK COMPATIBILITY IDEOGRAPH-FA39
+	: 5840
+FA3A	CJK COMPATIBILITY IDEOGRAPH-FA3A
+	: 58A8
+FA3B	CJK COMPATIBILITY IDEOGRAPH-FA3B
+	: 5C64
+FA3C	CJK COMPATIBILITY IDEOGRAPH-FA3C
+	: 5C6E
+FA3D	CJK COMPATIBILITY IDEOGRAPH-FA3D
+	: 6094
+FA3E	CJK COMPATIBILITY IDEOGRAPH-FA3E
+	: 6168
+FA3F	CJK COMPATIBILITY IDEOGRAPH-FA3F
+	: 618E
+FA40	CJK COMPATIBILITY IDEOGRAPH-FA40
+	: 61F2
+FA41	CJK COMPATIBILITY IDEOGRAPH-FA41
+	: 654F
+FA42	CJK COMPATIBILITY IDEOGRAPH-FA42
+	: 65E2
+FA43	CJK COMPATIBILITY IDEOGRAPH-FA43
+	: 6691
+FA44	CJK COMPATIBILITY IDEOGRAPH-FA44
+	: 6885
+FA45	CJK COMPATIBILITY IDEOGRAPH-FA45
+	: 6D77
+FA46	CJK COMPATIBILITY IDEOGRAPH-FA46
+	: 6E1A
+FA47	CJK COMPATIBILITY IDEOGRAPH-FA47
+	: 6F22
+FA48	CJK COMPATIBILITY IDEOGRAPH-FA48
+	: 716E
+FA49	CJK COMPATIBILITY IDEOGRAPH-FA49
+	: 722B
+FA4A	CJK COMPATIBILITY IDEOGRAPH-FA4A
+	: 7422
+FA4B	CJK COMPATIBILITY IDEOGRAPH-FA4B
+	: 7891
+FA4C	CJK COMPATIBILITY IDEOGRAPH-FA4C
+	: 793E
+FA4D	CJK COMPATIBILITY IDEOGRAPH-FA4D
+	: 7949
+FA4E	CJK COMPATIBILITY IDEOGRAPH-FA4E
+	: 7948
+FA4F	CJK COMPATIBILITY IDEOGRAPH-FA4F
+	: 7950
+FA50	CJK COMPATIBILITY IDEOGRAPH-FA50
+	: 7956
+FA51	CJK COMPATIBILITY IDEOGRAPH-FA51
+	: 795D
+FA52	CJK COMPATIBILITY IDEOGRAPH-FA52
+	: 798D
+FA53	CJK COMPATIBILITY IDEOGRAPH-FA53
+	: 798E
+FA54	CJK COMPATIBILITY IDEOGRAPH-FA54
+	: 7A40
+FA55	CJK COMPATIBILITY IDEOGRAPH-FA55
+	: 7A81
+FA56	CJK COMPATIBILITY IDEOGRAPH-FA56
+	: 7BC0
+FA57	CJK COMPATIBILITY IDEOGRAPH-FA57
+	: 7DF4
+FA58	CJK COMPATIBILITY IDEOGRAPH-FA58
+	: 7E09
+FA59	CJK COMPATIBILITY IDEOGRAPH-FA59
+	: 7E41
+FA5A	CJK COMPATIBILITY IDEOGRAPH-FA5A
+	: 7F72
+FA5B	CJK COMPATIBILITY IDEOGRAPH-FA5B
+	: 8005
+FA5C	CJK COMPATIBILITY IDEOGRAPH-FA5C
+	: 81ED
+FA5D	CJK COMPATIBILITY IDEOGRAPH-FA5D
+	: 8279
+FA5E	CJK COMPATIBILITY IDEOGRAPH-FA5E
+	: 8279
+FA5F	CJK COMPATIBILITY IDEOGRAPH-FA5F
+	: 8457
+FA60	CJK COMPATIBILITY IDEOGRAPH-FA60
+	: 8910
+FA61	CJK COMPATIBILITY IDEOGRAPH-FA61
+	: 8996
+FA62	CJK COMPATIBILITY IDEOGRAPH-FA62
+	: 8B01
+FA63	CJK COMPATIBILITY IDEOGRAPH-FA63
+	: 8B39
+FA64	CJK COMPATIBILITY IDEOGRAPH-FA64
+	: 8CD3
+FA65	CJK COMPATIBILITY IDEOGRAPH-FA65
+	: 8D08
+FA66	CJK COMPATIBILITY IDEOGRAPH-FA66
+	: 8FB6
+FA67	CJK COMPATIBILITY IDEOGRAPH-FA67
+	: 9038
+FA68	CJK COMPATIBILITY IDEOGRAPH-FA68
+	: 96E3
+FA69	CJK COMPATIBILITY IDEOGRAPH-FA69
+	: 97FF
+FA6A	CJK COMPATIBILITY IDEOGRAPH-FA6A
+	: 983B
+@		DPRK compatibility ideographs
+FA70	CJK COMPATIBILITY IDEOGRAPH-FA70
+	: 4E26
+FA71	CJK COMPATIBILITY IDEOGRAPH-FA71
+	: 51B5
+FA72	CJK COMPATIBILITY IDEOGRAPH-FA72
+	: 5168
+FA73	CJK COMPATIBILITY IDEOGRAPH-FA73
+	: 4F80
+FA74	CJK COMPATIBILITY IDEOGRAPH-FA74
+	: 5145
+FA75	CJK COMPATIBILITY IDEOGRAPH-FA75
+	: 5180
+FA76	CJK COMPATIBILITY IDEOGRAPH-FA76
+	: 52C7
+FA77	CJK COMPATIBILITY IDEOGRAPH-FA77
+	: 52FA
+FA78	CJK COMPATIBILITY IDEOGRAPH-FA78
+	: 559D
+FA79	CJK COMPATIBILITY IDEOGRAPH-FA79
+	: 5555
+FA7A	CJK COMPATIBILITY IDEOGRAPH-FA7A
+	: 5599
+FA7B	CJK COMPATIBILITY IDEOGRAPH-FA7B
+	: 55E2
+FA7C	CJK COMPATIBILITY IDEOGRAPH-FA7C
+	: 585A
+FA7D	CJK COMPATIBILITY IDEOGRAPH-FA7D
+	: 58B3
+FA7E	CJK COMPATIBILITY IDEOGRAPH-FA7E
+	: 5944
+FA7F	CJK COMPATIBILITY IDEOGRAPH-FA7F
+	: 5954
+FA80	CJK COMPATIBILITY IDEOGRAPH-FA80
+	: 5A62
+FA81	CJK COMPATIBILITY IDEOGRAPH-FA81
+	: 5B28
+FA82	CJK COMPATIBILITY IDEOGRAPH-FA82
+	: 5ED2
+FA83	CJK COMPATIBILITY IDEOGRAPH-FA83
+	: 5ED9
+FA84	CJK COMPATIBILITY IDEOGRAPH-FA84
+	: 5F69
+FA85	CJK COMPATIBILITY IDEOGRAPH-FA85
+	: 5FAD
+FA86	CJK COMPATIBILITY IDEOGRAPH-FA86
+	: 60D8
+FA87	CJK COMPATIBILITY IDEOGRAPH-FA87
+	: 614E
+FA88	CJK COMPATIBILITY IDEOGRAPH-FA88
+	: 6108
+FA89	CJK COMPATIBILITY IDEOGRAPH-FA89
+	: 618E
+FA8A	CJK COMPATIBILITY IDEOGRAPH-FA8A
+	: 6160
+FA8B	CJK COMPATIBILITY IDEOGRAPH-FA8B
+	: 61F2
+FA8C	CJK COMPATIBILITY IDEOGRAPH-FA8C
+	: 6234
+FA8D	CJK COMPATIBILITY IDEOGRAPH-FA8D
+	: 63C4
+FA8E	CJK COMPATIBILITY IDEOGRAPH-FA8E
+	: 641C
+FA8F	CJK COMPATIBILITY IDEOGRAPH-FA8F
+	: 6452
+FA90	CJK COMPATIBILITY IDEOGRAPH-FA90
+	: 6556
+FA91	CJK COMPATIBILITY IDEOGRAPH-FA91
+	: 6674
+FA92	CJK COMPATIBILITY IDEOGRAPH-FA92
+	: 6717
+FA93	CJK COMPATIBILITY IDEOGRAPH-FA93
+	: 671B
+FA94	CJK COMPATIBILITY IDEOGRAPH-FA94
+	: 6756
+FA95	CJK COMPATIBILITY IDEOGRAPH-FA95
+	: 6B79
+FA96	CJK COMPATIBILITY IDEOGRAPH-FA96
+	: 6BBA
+FA97	CJK COMPATIBILITY IDEOGRAPH-FA97
+	: 6D41
+FA98	CJK COMPATIBILITY IDEOGRAPH-FA98
+	: 6EDB
+FA99	CJK COMPATIBILITY IDEOGRAPH-FA99
+	: 6ECB
+FA9A	CJK COMPATIBILITY IDEOGRAPH-FA9A
+	: 6F22
+FA9B	CJK COMPATIBILITY IDEOGRAPH-FA9B
+	: 701E
+FA9C	CJK COMPATIBILITY IDEOGRAPH-FA9C
+	: 716E
+FA9D	CJK COMPATIBILITY IDEOGRAPH-FA9D
+	: 77A7
+FA9E	CJK COMPATIBILITY IDEOGRAPH-FA9E
+	: 7235
+FA9F	CJK COMPATIBILITY IDEOGRAPH-FA9F
+	: 72AF
+FAA0	CJK COMPATIBILITY IDEOGRAPH-FAA0
+	: 732A
+FAA1	CJK COMPATIBILITY IDEOGRAPH-FAA1
+	: 7471
+FAA2	CJK COMPATIBILITY IDEOGRAPH-FAA2
+	: 7506
+FAA3	CJK COMPATIBILITY IDEOGRAPH-FAA3
+	: 753B
+FAA4	CJK COMPATIBILITY IDEOGRAPH-FAA4
+	: 761D
+FAA5	CJK COMPATIBILITY IDEOGRAPH-FAA5
+	: 761F
+FAA6	CJK COMPATIBILITY IDEOGRAPH-FAA6
+	: 76CA
+FAA7	CJK COMPATIBILITY IDEOGRAPH-FAA7
+	: 76DB
+FAA8	CJK COMPATIBILITY IDEOGRAPH-FAA8
+	: 76F4
+FAA9	CJK COMPATIBILITY IDEOGRAPH-FAA9
+	: 774A
+FAAA	CJK COMPATIBILITY IDEOGRAPH-FAAA
+	: 7740
+FAAB	CJK COMPATIBILITY IDEOGRAPH-FAAB
+	: 78CC
+FAAC	CJK COMPATIBILITY IDEOGRAPH-FAAC
+	: 7AB1
+FAAD	CJK COMPATIBILITY IDEOGRAPH-FAAD
+	: 7BC0
+FAAE	CJK COMPATIBILITY IDEOGRAPH-FAAE
+	: 7C7B
+FAAF	CJK COMPATIBILITY IDEOGRAPH-FAAF
+	: 7D5B
+FAB0	CJK COMPATIBILITY IDEOGRAPH-FAB0
+	: 7DF4
+FAB1	CJK COMPATIBILITY IDEOGRAPH-FAB1
+	: 7F3E
+FAB2	CJK COMPATIBILITY IDEOGRAPH-FAB2
+	: 8005
+FAB3	CJK COMPATIBILITY IDEOGRAPH-FAB3
+	: 8352
+FAB4	CJK COMPATIBILITY IDEOGRAPH-FAB4
+	: 83EF
+FAB5	CJK COMPATIBILITY IDEOGRAPH-FAB5
+	: 8779
+FAB6	CJK COMPATIBILITY IDEOGRAPH-FAB6
+	: 8941
+FAB7	CJK COMPATIBILITY IDEOGRAPH-FAB7
+	: 8986
+FAB8	CJK COMPATIBILITY IDEOGRAPH-FAB8
+	: 8996
+FAB9	CJK COMPATIBILITY IDEOGRAPH-FAB9
+	: 8ABF
+FABA	CJK COMPATIBILITY IDEOGRAPH-FABA
+	: 8AF8
+FABB	CJK COMPATIBILITY IDEOGRAPH-FABB
+	: 8ACB
+FABC	CJK COMPATIBILITY IDEOGRAPH-FABC
+	: 8B01
+FABD	CJK COMPATIBILITY IDEOGRAPH-FABD
+	: 8AFE
+FABE	CJK COMPATIBILITY IDEOGRAPH-FABE
+	: 8AED
+FABF	CJK COMPATIBILITY IDEOGRAPH-FABF
+	: 8B39
+FAC0	CJK COMPATIBILITY IDEOGRAPH-FAC0
+	: 8B8A
+FAC1	CJK COMPATIBILITY IDEOGRAPH-FAC1
+	: 8D08
+FAC2	CJK COMPATIBILITY IDEOGRAPH-FAC2
+	: 8F38
+FAC3	CJK COMPATIBILITY IDEOGRAPH-FAC3
+	: 9072
+FAC4	CJK COMPATIBILITY IDEOGRAPH-FAC4
+	: 9199
+FAC5	CJK COMPATIBILITY IDEOGRAPH-FAC5
+	: 9276
+FAC6	CJK COMPATIBILITY IDEOGRAPH-FAC6
+	: 967C
+FAC7	CJK COMPATIBILITY IDEOGRAPH-FAC7
+	: 96E3
+FAC8	CJK COMPATIBILITY IDEOGRAPH-FAC8
+	: 9756
+FAC9	CJK COMPATIBILITY IDEOGRAPH-FAC9
+	: 97DB
+FACA	CJK COMPATIBILITY IDEOGRAPH-FACA
+	: 97FF
+FACB	CJK COMPATIBILITY IDEOGRAPH-FACB
+	: 980B
+FACC	CJK COMPATIBILITY IDEOGRAPH-FACC
+	: 983B
+FACD	CJK COMPATIBILITY IDEOGRAPH-FACD
+	: 9B12
+FACE	CJK COMPATIBILITY IDEOGRAPH-FACE
+	: 9F9C
+FACF	CJK COMPATIBILITY IDEOGRAPH-FACF
+	: 2284A
+FAD0	CJK COMPATIBILITY IDEOGRAPH-FAD0
+	: 22844
+FAD1	CJK COMPATIBILITY IDEOGRAPH-FAD1
+	: 233D5
+FAD2	CJK COMPATIBILITY IDEOGRAPH-FAD2
+	: 3B9D
+FAD3	CJK COMPATIBILITY IDEOGRAPH-FAD3
+	: 4018
+FAD4	CJK COMPATIBILITY IDEOGRAPH-FAD4
+	: 4039
+FAD5	CJK COMPATIBILITY IDEOGRAPH-FAD5
+	: 25249
+FAD6	CJK COMPATIBILITY IDEOGRAPH-FAD6
+	: 25CD0
+FAD7	CJK COMPATIBILITY IDEOGRAPH-FAD7
+	: 27ED3
+FAD8	CJK COMPATIBILITY IDEOGRAPH-FAD8
+	: 9F43
+FAD9	CJK COMPATIBILITY IDEOGRAPH-FAD9
+	: 9F8E
+@@	FB00	Alphabetic Presentation Forms	FB4F
+@		Latin ligatures
+@+		See the Basic Latin block starting at 0020
+FB00	LATIN SMALL LIGATURE FF
+	# 0066 0066
+FB01	LATIN SMALL LIGATURE FI
+	# 0066 0069
+FB02	LATIN SMALL LIGATURE FL
+	# 0066 006C
+FB03	LATIN SMALL LIGATURE FFI
+	# 0066 0066 0069
+FB04	LATIN SMALL LIGATURE FFL
+	# 0066 0066 006C
+FB05	LATIN SMALL LIGATURE LONG S T
+	# 017F 0074
+FB06	LATIN SMALL LIGATURE ST
+	# 0073 0074
+@		Armenian ligatures
+@+		See the Armenian block starting at 0530
+FB13	ARMENIAN SMALL LIGATURE MEN NOW
+	# 0574 0576
+FB14	ARMENIAN SMALL LIGATURE MEN ECH
+	# 0574 0565
+FB15	ARMENIAN SMALL LIGATURE MEN INI
+	# 0574 056B
+FB16	ARMENIAN SMALL LIGATURE VEW NOW
+	# 057E 0576
+FB17	ARMENIAN SMALL LIGATURE MEN XEH
+	# 0574 056D
+@		Hebrew presentation forms
+@+		See the Hebrew block starting at 0590
+FB1D	HEBREW LETTER YOD WITH HIRIQ
+	: 05D9 05B4
+FB1E	HEBREW POINT JUDEO-SPANISH VARIKA
+	* a glyph variant of 05BF
+FB1F	HEBREW LIGATURE YIDDISH YOD YOD PATAH
+	: 05F2 05B7
+FB20	HEBREW LETTER ALTERNATIVE AYIN
+	* this form of AYIN has no descender, for use with marks placed below the letter
+	# <font> 05E2 hebrew letter ayin
+FB21	HEBREW LETTER WIDE ALEF
+	# <font> 05D0 hebrew letter alef
+FB22	HEBREW LETTER WIDE DALET
+	# <font> 05D3 hebrew letter dalet
+FB23	HEBREW LETTER WIDE HE
+	# <font> 05D4 hebrew letter he
+FB24	HEBREW LETTER WIDE KAF
+	# <font> 05DB hebrew letter kaf
+FB25	HEBREW LETTER WIDE LAMED
+	# <font> 05DC hebrew letter lamed
+FB26	HEBREW LETTER WIDE FINAL MEM
+	# <font> 05DD hebrew letter final mem
+FB27	HEBREW LETTER WIDE RESH
+	# <font> 05E8 hebrew letter resh
+FB28	HEBREW LETTER WIDE TAV
+	# <font> 05EA hebrew letter tav
+FB29	HEBREW LETTER ALTERNATIVE PLUS SIGN
+	# <font> 002B plus sign
+FB2A	HEBREW LETTER SHIN WITH SHIN DOT
+	: 05E9 05C1
+FB2B	HEBREW LETTER SHIN WITH SIN DOT
+	: 05E9 05C2
+FB2C	HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+	: FB49 05C1
+FB2D	HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+	: FB49 05C2
+FB2E	HEBREW LETTER ALEF WITH PATAH
+	: 05D0 05B7
+FB2F	HEBREW LETTER ALEF WITH QAMATS
+	: 05D0 05B8
+FB30	HEBREW LETTER ALEF WITH MAPIQ
+	: 05D0 05BC
+FB31	HEBREW LETTER BET WITH DAGESH
+	: 05D1 05BC
+FB32	HEBREW LETTER GIMEL WITH DAGESH
+	: 05D2 05BC
+FB33	HEBREW LETTER DALET WITH DAGESH
+	: 05D3 05BC
+FB34	HEBREW LETTER HE WITH MAPIQ
+	: 05D4 05BC
+FB35	HEBREW LETTER VAV WITH DAGESH
+	: 05D5 05BC
+FB36	HEBREW LETTER ZAYIN WITH DAGESH
+	: 05D6 05BC
+FB38	HEBREW LETTER TET WITH DAGESH
+	: 05D8 05BC
+FB39	HEBREW LETTER YOD WITH DAGESH
+	: 05D9 05BC
+FB3A	HEBREW LETTER FINAL KAF WITH DAGESH
+	: 05DA 05BC
+FB3B	HEBREW LETTER KAF WITH DAGESH
+	: 05DB 05BC
+FB3C	HEBREW LETTER LAMED WITH DAGESH
+	: 05DC 05BC
+FB3E	HEBREW LETTER MEM WITH DAGESH
+	: 05DE 05BC
+FB40	HEBREW LETTER NUN WITH DAGESH
+	: 05E0 05BC
+FB41	HEBREW LETTER SAMEKH WITH DAGESH
+	: 05E1 05BC
+FB43	HEBREW LETTER FINAL PE WITH DAGESH
+	: 05E3 05BC
+FB44	HEBREW LETTER PE WITH DAGESH
+	: 05E4 05BC
+FB46	HEBREW LETTER TSADI WITH DAGESH
+	: 05E6 05BC
+FB47	HEBREW LETTER QOF WITH DAGESH
+	: 05E7 05BC
+FB48	HEBREW LETTER RESH WITH DAGESH
+	: 05E8 05BC
+FB49	HEBREW LETTER SHIN WITH DAGESH
+	: 05E9 05BC
+FB4A	HEBREW LETTER TAV WITH DAGESH
+	: 05EA 05BC
+FB4B	HEBREW LETTER VAV WITH HOLAM
+	: 05D5 05B9
+FB4C	HEBREW LETTER BET WITH RAFE
+	: 05D1 05BF
+FB4D	HEBREW LETTER KAF WITH RAFE
+	: 05DB 05BF
+FB4E	HEBREW LETTER PE WITH RAFE
+	: 05E4 05BF
+FB4F	HEBREW LIGATURE ALEF LAMED
+	# 05D0 05DC
+@@	FB50	Arabic Presentation Forms-A	FDFF
+@+		Preferred characters are found in the Arabic block 0600 - 06FF.
+@		Glyphs for contextual forms of letters for Persian, Urdu, Sindhi, etc.
+FB50	ARABIC LETTER ALEF WASLA ISOLATED FORM
+	# <isolated> 0671
+FB51	ARABIC LETTER ALEF WASLA FINAL FORM
+	# <final> 0671
+FB52	ARABIC LETTER BEEH ISOLATED FORM
+	# <isolated> 067B
+FB53	ARABIC LETTER BEEH FINAL FORM
+	# <final> 067B
+FB54	ARABIC LETTER BEEH INITIAL FORM
+	# <initial> 067B
+FB55	ARABIC LETTER BEEH MEDIAL FORM
+	# <medial> 067B
+FB56	ARABIC LETTER PEH ISOLATED FORM
+	# <isolated> 067E
+FB57	ARABIC LETTER PEH FINAL FORM
+	# <final> 067E
+FB58	ARABIC LETTER PEH INITIAL FORM
+	# <initial> 067E
+FB59	ARABIC LETTER PEH MEDIAL FORM
+	# <medial> 067E
+FB5A	ARABIC LETTER BEHEH ISOLATED FORM
+	# <isolated> 0680
+FB5B	ARABIC LETTER BEHEH FINAL FORM
+	# <final> 0680
+FB5C	ARABIC LETTER BEHEH INITIAL FORM
+	# <initial> 0680
+FB5D	ARABIC LETTER BEHEH MEDIAL FORM
+	# <medial> 0680
+FB5E	ARABIC LETTER TTEHEH ISOLATED FORM
+	# <isolated> 067A
+FB5F	ARABIC LETTER TTEHEH FINAL FORM
+	# <final> 067A
+FB60	ARABIC LETTER TTEHEH INITIAL FORM
+	# <initial> 067A
+FB61	ARABIC LETTER TTEHEH MEDIAL FORM
+	# <medial> 067A
+FB62	ARABIC LETTER TEHEH ISOLATED FORM
+	# <isolated> 067F
+FB63	ARABIC LETTER TEHEH FINAL FORM
+	# <final> 067F
+FB64	ARABIC LETTER TEHEH INITIAL FORM
+	# <initial> 067F
+FB65	ARABIC LETTER TEHEH MEDIAL FORM
+	# <medial> 067F
+FB66	ARABIC LETTER TTEH ISOLATED FORM
+	# <isolated> 0679
+FB67	ARABIC LETTER TTEH FINAL FORM
+	# <final> 0679
+FB68	ARABIC LETTER TTEH INITIAL FORM
+	# <initial> 0679
+FB69	ARABIC LETTER TTEH MEDIAL FORM
+	# <medial> 0679
+FB6A	ARABIC LETTER VEH ISOLATED FORM
+	# <isolated> 06A4
+FB6B	ARABIC LETTER VEH FINAL FORM
+	# <final> 06A4
+FB6C	ARABIC LETTER VEH INITIAL FORM
+	# <initial> 06A4
+FB6D	ARABIC LETTER VEH MEDIAL FORM
+	# <medial> 06A4
+FB6E	ARABIC LETTER PEHEH ISOLATED FORM
+	# <isolated> 06A6
+FB6F	ARABIC LETTER PEHEH FINAL FORM
+	# <final> 06A6
+FB70	ARABIC LETTER PEHEH INITIAL FORM
+	# <initial> 06A6
+FB71	ARABIC LETTER PEHEH MEDIAL FORM
+	# <medial> 06A6
+FB72	ARABIC LETTER DYEH ISOLATED FORM
+	# <isolated> 0684
+FB73	ARABIC LETTER DYEH FINAL FORM
+	# <final> 0684
+FB74	ARABIC LETTER DYEH INITIAL FORM
+	# <initial> 0684
+FB75	ARABIC LETTER DYEH MEDIAL FORM
+	# <medial> 0684
+FB76	ARABIC LETTER NYEH ISOLATED FORM
+	# <isolated> 0683
+FB77	ARABIC LETTER NYEH FINAL FORM
+	# <final> 0683
+FB78	ARABIC LETTER NYEH INITIAL FORM
+	# <initial> 0683
+FB79	ARABIC LETTER NYEH MEDIAL FORM
+	# <medial> 0683
+FB7A	ARABIC LETTER TCHEH ISOLATED FORM
+	# <isolated> 0686
+FB7B	ARABIC LETTER TCHEH FINAL FORM
+	# <final> 0686
+FB7C	ARABIC LETTER TCHEH INITIAL FORM
+	# <initial> 0686
+FB7D	ARABIC LETTER TCHEH MEDIAL FORM
+	# <medial> 0686
+FB7E	ARABIC LETTER TCHEHEH ISOLATED FORM
+	# <isolated> 0687
+FB7F	ARABIC LETTER TCHEHEH FINAL FORM
+	# <final> 0687
+FB80	ARABIC LETTER TCHEHEH INITIAL FORM
+	# <initial> 0687
+FB81	ARABIC LETTER TCHEHEH MEDIAL FORM
+	# <medial> 0687
+FB82	ARABIC LETTER DDAHAL ISOLATED FORM
+	# <isolated> 068D
+FB83	ARABIC LETTER DDAHAL FINAL FORM
+	# <final> 068D
+FB84	ARABIC LETTER DAHAL ISOLATED FORM
+	# <isolated> 068C
+FB85	ARABIC LETTER DAHAL FINAL FORM
+	# <final> 068C
+FB86	ARABIC LETTER DUL ISOLATED FORM
+	# <isolated> 068E
+FB87	ARABIC LETTER DUL FINAL FORM
+	# <final> 068E
+FB88	ARABIC LETTER DDAL ISOLATED FORM
+	# <isolated> 0688
+FB89	ARABIC LETTER DDAL FINAL FORM
+	# <final> 0688
+FB8A	ARABIC LETTER JEH ISOLATED FORM
+	# <isolated> 0698
+FB8B	ARABIC LETTER JEH FINAL FORM
+	# <final> 0698
+FB8C	ARABIC LETTER RREH ISOLATED FORM
+	# <isolated> 0691
+FB8D	ARABIC LETTER RREH FINAL FORM
+	# <final> 0691
+FB8E	ARABIC LETTER KEHEH ISOLATED FORM
+	# <isolated> 06A9
+FB8F	ARABIC LETTER KEHEH FINAL FORM
+	# <final> 06A9
+FB90	ARABIC LETTER KEHEH INITIAL FORM
+	# <initial> 06A9
+FB91	ARABIC LETTER KEHEH MEDIAL FORM
+	# <medial> 06A9
+FB92	ARABIC LETTER GAF ISOLATED FORM
+	# <isolated> 06AF
+FB93	ARABIC LETTER GAF FINAL FORM
+	# <final> 06AF
+FB94	ARABIC LETTER GAF INITIAL FORM
+	# <initial> 06AF
+FB95	ARABIC LETTER GAF MEDIAL FORM
+	# <medial> 06AF
+FB96	ARABIC LETTER GUEH ISOLATED FORM
+	# <isolated> 06B3
+FB97	ARABIC LETTER GUEH FINAL FORM
+	# <final> 06B3
+FB98	ARABIC LETTER GUEH INITIAL FORM
+	# <initial> 06B3
+FB99	ARABIC LETTER GUEH MEDIAL FORM
+	# <medial> 06B3
+FB9A	ARABIC LETTER NGOEH ISOLATED FORM
+	# <isolated> 06B1
+FB9B	ARABIC LETTER NGOEH FINAL FORM
+	# <final> 06B1
+FB9C	ARABIC LETTER NGOEH INITIAL FORM
+	# <initial> 06B1
+FB9D	ARABIC LETTER NGOEH MEDIAL FORM
+	# <medial> 06B1
+FB9E	ARABIC LETTER NOON GHUNNA ISOLATED FORM
+	# <isolated> 06BA
+FB9F	ARABIC LETTER NOON GHUNNA FINAL FORM
+	# <final> 06BA
+FBA0	ARABIC LETTER RNOON ISOLATED FORM
+	# <isolated> 06BB
+FBA1	ARABIC LETTER RNOON FINAL FORM
+	# <final> 06BB
+FBA2	ARABIC LETTER RNOON INITIAL FORM
+	# <initial> 06BB
+FBA3	ARABIC LETTER RNOON MEDIAL FORM
+	# <medial> 06BB
+FBA4	ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+	# <isolated> 06C0
+FBA5	ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+	# <final> 06C0
+FBA6	ARABIC LETTER HEH GOAL ISOLATED FORM
+	# <isolated> 06C1
+FBA7	ARABIC LETTER HEH GOAL FINAL FORM
+	# <final> 06C1
+FBA8	ARABIC LETTER HEH GOAL INITIAL FORM
+	# <initial> 06C1
+FBA9	ARABIC LETTER HEH GOAL MEDIAL FORM
+	# <medial> 06C1
+FBAA	ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+	# <isolated> 06BE
+FBAB	ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+	# <final> 06BE
+FBAC	ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+	# <initial> 06BE
+FBAD	ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+	# <medial> 06BE
+FBAE	ARABIC LETTER YEH BARREE ISOLATED FORM
+	# <isolated> 06D2
+FBAF	ARABIC LETTER YEH BARREE FINAL FORM
+	# <final> 06D2
+FBB0	ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+	# <isolated> 06D3
+FBB1	ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+	# <final> 06D3
+@		Glyphs for contextual forms of letters for Central Asian languages
+FBD3	ARABIC LETTER NG ISOLATED FORM
+	# <isolated> 06AD
+FBD4	ARABIC LETTER NG FINAL FORM
+	# <final> 06AD
+FBD5	ARABIC LETTER NG INITIAL FORM
+	# <initial> 06AD
+FBD6	ARABIC LETTER NG MEDIAL FORM
+	# <medial> 06AD
+FBD7	ARABIC LETTER U ISOLATED FORM
+	# <isolated> 06C7
+FBD8	ARABIC LETTER U FINAL FORM
+	# <final> 06C7
+FBD9	ARABIC LETTER OE ISOLATED FORM
+	# <isolated> 06C6
+FBDA	ARABIC LETTER OE FINAL FORM
+	# <final> 06C6
+FBDB	ARABIC LETTER YU ISOLATED FORM
+	# <isolated> 06C8
+FBDC	ARABIC LETTER YU FINAL FORM
+	# <final> 06C8
+FBDD	ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+	# <isolated> 0677
+FBDE	ARABIC LETTER VE ISOLATED FORM
+	# <isolated> 06CB
+FBDF	ARABIC LETTER VE FINAL FORM
+	# <final> 06CB
+FBE0	ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+	# <isolated> 06C5
+FBE1	ARABIC LETTER KIRGHIZ OE FINAL FORM
+	# <final> 06C5
+FBE2	ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+	# <isolated> 06C9
+FBE3	ARABIC LETTER KIRGHIZ YU FINAL FORM
+	# <final> 06C9
+FBE4	ARABIC LETTER E ISOLATED FORM
+	# <isolated> 06D0
+FBE5	ARABIC LETTER E FINAL FORM
+	# <final> 06D0
+FBE6	ARABIC LETTER E INITIAL FORM
+	# <initial> 06D0
+FBE7	ARABIC LETTER E MEDIAL FORM
+	# <medial> 06D0
+FBE8	ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+	# <initial> 0649
+FBE9	ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+	# <medial> 0649
+@		Ligatures (two elements)
+FBEA	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+	# <isolated> 0626 0627
+FBEB	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+	# <final> 0626 0627
+FBEC	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+	# <isolated> 0626 06D5
+FBED	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+	# <final> 0626 06D5
+FBEE	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+	# <isolated> 0626 0648
+FBEF	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+	# <final> 0626 0648
+FBF0	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+	# <isolated> 0626 06C7
+FBF1	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+	# <final> 0626 06C7
+FBF2	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+	# <isolated> 0626 06C6
+FBF3	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+	# <final> 0626 06C6
+FBF4	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+	# <isolated> 0626 06C8
+FBF5	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+	# <final> 0626 06C8
+FBF6	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+	# <isolated> 0626 06D0
+FBF7	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+	# <final> 0626 06D0
+FBF8	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+	# <initial> 0626 06D0
+FBF9	ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0626 0649
+FBFA	ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+	# <final> 0626 0649
+FBFB	ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+	# <initial> 0626 0649
+FBFC	ARABIC LETTER FARSI YEH ISOLATED FORM
+	# <isolated> 06CC
+FBFD	ARABIC LETTER FARSI YEH FINAL FORM
+	# <final> 06CC
+FBFE	ARABIC LETTER FARSI YEH INITIAL FORM
+	# <initial> 06CC
+FBFF	ARABIC LETTER FARSI YEH MEDIAL FORM
+	# <medial> 06CC
+FC00	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+	# <isolated> 0626 062C
+FC01	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+	# <isolated> 0626 062D
+FC02	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+	# <isolated> 0626 0645
+FC03	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0626 0649
+FC04	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+	# <isolated> 0626 064A
+FC05	ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+	# <isolated> 0628 062C
+FC06	ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+	# <isolated> 0628 062D
+FC07	ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+	# <isolated> 0628 062E
+FC08	ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+	# <isolated> 0628 0645
+FC09	ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0628 0649
+FC0A	ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+	# <isolated> 0628 064A
+FC0B	ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+	# <isolated> 062A 062C
+FC0C	ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+	# <isolated> 062A 062D
+FC0D	ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+	# <isolated> 062A 062E
+FC0E	ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+	# <isolated> 062A 0645
+FC0F	ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 062A 0649
+FC10	ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+	# <isolated> 062A 064A
+FC11	ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+	# <isolated> 062B 062C
+FC12	ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+	# <isolated> 062B 0645
+FC13	ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 062B 0649
+FC14	ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+	# <isolated> 062B 064A
+FC15	ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+	# <isolated> 062C 062D
+FC16	ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+	# <isolated> 062C 0645
+FC17	ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+	# <isolated> 062D 062C
+FC18	ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+	# <isolated> 062D 0645
+FC19	ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+	# <isolated> 062E 062C
+FC1A	ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+	# <isolated> 062E 062D
+FC1B	ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+	# <isolated> 062E 0645
+FC1C	ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+	# <isolated> 0633 062C
+FC1D	ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+	# <isolated> 0633 062D
+FC1E	ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+	# <isolated> 0633 062E
+FC1F	ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+	# <isolated> 0633 0645
+FC20	ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+	# <isolated> 0635 062D
+FC21	ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+	# <isolated> 0635 0645
+FC22	ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+	# <isolated> 0636 062C
+FC23	ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+	# <isolated> 0636 062D
+FC24	ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+	# <isolated> 0636 062E
+FC25	ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+	# <isolated> 0636 0645
+FC26	ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+	# <isolated> 0637 062D
+FC27	ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+	# <isolated> 0637 0645
+FC28	ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+	# <isolated> 0638 0645
+FC29	ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+	# <isolated> 0639 062C
+FC2A	ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+	# <isolated> 0639 0645
+FC2B	ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+	# <isolated> 063A 062C
+FC2C	ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+	# <isolated> 063A 0645
+FC2D	ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+	# <isolated> 0641 062C
+FC2E	ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+	# <isolated> 0641 062D
+FC2F	ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+	# <isolated> 0641 062E
+FC30	ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+	# <isolated> 0641 0645
+FC31	ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0641 0649
+FC32	ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+	# <isolated> 0641 064A
+FC33	ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+	# <isolated> 0642 062D
+FC34	ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+	# <isolated> 0642 0645
+FC35	ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0642 0649
+FC36	ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+	# <isolated> 0642 064A
+FC37	ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+	# <isolated> 0643 0627
+FC38	ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+	# <isolated> 0643 062C
+FC39	ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+	# <isolated> 0643 062D
+FC3A	ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+	# <isolated> 0643 062E
+FC3B	ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+	# <isolated> 0643 0644
+FC3C	ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+	# <isolated> 0643 0645
+FC3D	ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0643 0649
+FC3E	ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+	# <isolated> 0643 064A
+FC3F	ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+	# <isolated> 0644 062C
+FC40	ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+	# <isolated> 0644 062D
+FC41	ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+	# <isolated> 0644 062E
+FC42	ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+	# <isolated> 0644 0645
+FC43	ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0644 0649
+FC44	ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+	# <isolated> 0644 064A
+FC45	ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+	# <isolated> 0645 062C
+FC46	ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+	# <isolated> 0645 062D
+FC47	ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+	# <isolated> 0645 062E
+FC48	ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+	# <isolated> 0645 0645
+FC49	ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0645 0649
+FC4A	ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+	# <isolated> 0645 064A
+FC4B	ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+	# <isolated> 0646 062C
+FC4C	ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+	# <isolated> 0646 062D
+FC4D	ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+	# <isolated> 0646 062E
+FC4E	ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+	# <isolated> 0646 0645
+FC4F	ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0646 0649
+FC50	ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+	# <isolated> 0646 064A
+FC51	ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+	# <isolated> 0647 062C
+FC52	ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+	# <isolated> 0647 0645
+FC53	ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0647 0649
+FC54	ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+	# <isolated> 0647 064A
+FC55	ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+	# <isolated> 064A 062C
+FC56	ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+	# <isolated> 064A 062D
+FC57	ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+	# <isolated> 064A 062E
+FC58	ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+	# <isolated> 064A 0645
+FC59	ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 064A 0649
+FC5A	ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+	# <isolated> 064A 064A
+FC5B	ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+	# <isolated> 0630 0670
+FC5C	ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+	# <isolated> 0631 0670
+FC5D	ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+	# <isolated> 0649 0670
+FC5E	ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+	# <isolated> 0020 064C 0651
+FC5F	ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+	# <isolated> 0020 064D 0651
+FC60	ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+	# <isolated> 0020 064E 0651
+FC61	ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+	# <isolated> 0020 064F 0651
+FC62	ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+	# <isolated> 0020 0650 0651
+FC63	ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+	# <isolated> 0020 0651 0670
+FC64	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+	# <final> 0626 0631
+FC65	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+	# <final> 0626 0632
+FC66	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+	# <final> 0626 0645
+FC67	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+	# <final> 0626 0646
+FC68	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+	# <final> 0626 0649
+FC69	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+	# <final> 0626 064A
+FC6A	ARABIC LIGATURE BEH WITH REH FINAL FORM
+	# <final> 0628 0631
+FC6B	ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+	# <final> 0628 0632
+FC6C	ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+	# <final> 0628 0645
+FC6D	ARABIC LIGATURE BEH WITH NOON FINAL FORM
+	# <final> 0628 0646
+FC6E	ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+	# <final> 0628 0649
+FC6F	ARABIC LIGATURE BEH WITH YEH FINAL FORM
+	# <final> 0628 064A
+FC70	ARABIC LIGATURE TEH WITH REH FINAL FORM
+	# <final> 062A 0631
+FC71	ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+	# <final> 062A 0632
+FC72	ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+	# <final> 062A 0645
+FC73	ARABIC LIGATURE TEH WITH NOON FINAL FORM
+	# <final> 062A 0646
+FC74	ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+	# <final> 062A 0649
+FC75	ARABIC LIGATURE TEH WITH YEH FINAL FORM
+	# <final> 062A 064A
+FC76	ARABIC LIGATURE THEH WITH REH FINAL FORM
+	# <final> 062B 0631
+FC77	ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+	# <final> 062B 0632
+FC78	ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+	# <final> 062B 0645
+FC79	ARABIC LIGATURE THEH WITH NOON FINAL FORM
+	# <final> 062B 0646
+FC7A	ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+	# <final> 062B 0649
+FC7B	ARABIC LIGATURE THEH WITH YEH FINAL FORM
+	# <final> 062B 064A
+FC7C	ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+	# <final> 0641 0649
+FC7D	ARABIC LIGATURE FEH WITH YEH FINAL FORM
+	# <final> 0641 064A
+FC7E	ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+	# <final> 0642 0649
+FC7F	ARABIC LIGATURE QAF WITH YEH FINAL FORM
+	# <final> 0642 064A
+FC80	ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+	# <final> 0643 0627
+FC81	ARABIC LIGATURE KAF WITH LAM FINAL FORM
+	# <final> 0643 0644
+FC82	ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+	# <final> 0643 0645
+FC83	ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+	# <final> 0643 0649
+FC84	ARABIC LIGATURE KAF WITH YEH FINAL FORM
+	# <final> 0643 064A
+FC85	ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+	# <final> 0644 0645
+FC86	ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+	# <final> 0644 0649
+FC87	ARABIC LIGATURE LAM WITH YEH FINAL FORM
+	# <final> 0644 064A
+FC88	ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+	# <final> 0645 0627
+FC89	ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+	# <final> 0645 0645
+FC8A	ARABIC LIGATURE NOON WITH REH FINAL FORM
+	# <final> 0646 0631
+FC8B	ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+	# <final> 0646 0632
+FC8C	ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+	# <final> 0646 0645
+FC8D	ARABIC LIGATURE NOON WITH NOON FINAL FORM
+	# <final> 0646 0646
+FC8E	ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+	# <final> 0646 0649
+FC8F	ARABIC LIGATURE NOON WITH YEH FINAL FORM
+	# <final> 0646 064A
+FC90	ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+	# <final> 0649 0670
+FC91	ARABIC LIGATURE YEH WITH REH FINAL FORM
+	# <final> 064A 0631
+FC92	ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+	# <final> 064A 0632
+FC93	ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+	# <final> 064A 0645
+FC94	ARABIC LIGATURE YEH WITH NOON FINAL FORM
+	# <final> 064A 0646
+FC95	ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+	# <final> 064A 0649
+FC96	ARABIC LIGATURE YEH WITH YEH FINAL FORM
+	# <final> 064A 064A
+FC97	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+	# <initial> 0626 062C
+FC98	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+	# <initial> 0626 062D
+FC99	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+	# <initial> 0626 062E
+FC9A	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+	# <initial> 0626 0645
+FC9B	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+	# <initial> 0626 0647
+FC9C	ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+	# <initial> 0628 062C
+FC9D	ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+	# <initial> 0628 062D
+FC9E	ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+	# <initial> 0628 062E
+FC9F	ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+	# <initial> 0628 0645
+FCA0	ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+	# <initial> 0628 0647
+FCA1	ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+	# <initial> 062A 062C
+FCA2	ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+	# <initial> 062A 062D
+FCA3	ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+	# <initial> 062A 062E
+FCA4	ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+	# <initial> 062A 0645
+FCA5	ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+	# <initial> 062A 0647
+FCA6	ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+	# <initial> 062B 0645
+FCA7	ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+	# <initial> 062C 062D
+FCA8	ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+	# <initial> 062C 0645
+FCA9	ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+	# <initial> 062D 062C
+FCAA	ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+	# <initial> 062D 0645
+FCAB	ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+	# <initial> 062E 062C
+FCAC	ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+	# <initial> 062E 0645
+FCAD	ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+	# <initial> 0633 062C
+FCAE	ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+	# <initial> 0633 062D
+FCAF	ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+	# <initial> 0633 062E
+FCB0	ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+	# <initial> 0633 0645
+FCB1	ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+	# <initial> 0635 062D
+FCB2	ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+	# <initial> 0635 062E
+FCB3	ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+	# <initial> 0635 0645
+FCB4	ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+	# <initial> 0636 062C
+FCB5	ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+	# <initial> 0636 062D
+FCB6	ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+	# <initial> 0636 062E
+FCB7	ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+	# <initial> 0636 0645
+FCB8	ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+	# <initial> 0637 062D
+FCB9	ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+	# <initial> 0638 0645
+FCBA	ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+	# <initial> 0639 062C
+FCBB	ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+	# <initial> 0639 0645
+FCBC	ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+	# <initial> 063A 062C
+FCBD	ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+	# <initial> 063A 0645
+FCBE	ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+	# <initial> 0641 062C
+FCBF	ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+	# <initial> 0641 062D
+FCC0	ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+	# <initial> 0641 062E
+FCC1	ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+	# <initial> 0641 0645
+FCC2	ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+	# <initial> 0642 062D
+FCC3	ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+	# <initial> 0642 0645
+FCC4	ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+	# <initial> 0643 062C
+FCC5	ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+	# <initial> 0643 062D
+FCC6	ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+	# <initial> 0643 062E
+FCC7	ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+	# <initial> 0643 0644
+FCC8	ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+	# <initial> 0643 0645
+FCC9	ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+	# <initial> 0644 062C
+FCCA	ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+	# <initial> 0644 062D
+FCCB	ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+	# <initial> 0644 062E
+FCCC	ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+	# <initial> 0644 0645
+FCCD	ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+	# <initial> 0644 0647
+FCCE	ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+	# <initial> 0645 062C
+FCCF	ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+	# <initial> 0645 062D
+FCD0	ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+	# <initial> 0645 062E
+FCD1	ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+	# <initial> 0645 0645
+FCD2	ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+	# <initial> 0646 062C
+FCD3	ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+	# <initial> 0646 062D
+FCD4	ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+	# <initial> 0646 062E
+FCD5	ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+	# <initial> 0646 0645
+FCD6	ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+	# <initial> 0646 0647
+FCD7	ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+	# <initial> 0647 062C
+FCD8	ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+	# <initial> 0647 0645
+FCD9	ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+	# <initial> 0647 0670
+FCDA	ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+	# <initial> 064A 062C
+FCDB	ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+	# <initial> 064A 062D
+FCDC	ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+	# <initial> 064A 062E
+FCDD	ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+	# <initial> 064A 0645
+FCDE	ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+	# <initial> 064A 0647
+FCDF	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+	# <medial> 0626 0645
+FCE0	ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+	# <medial> 0626 0647
+FCE1	ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+	# <medial> 0628 0645
+FCE2	ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+	# <medial> 0628 0647
+FCE3	ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+	# <medial> 062A 0645
+FCE4	ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+	# <medial> 062A 0647
+FCE5	ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+	# <medial> 062B 0645
+FCE6	ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+	# <medial> 062B 0647
+FCE7	ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+	# <medial> 0633 0645
+FCE8	ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+	# <medial> 0633 0647
+FCE9	ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+	# <medial> 0634 0645
+FCEA	ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+	# <medial> 0634 0647
+FCEB	ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+	# <medial> 0643 0644
+FCEC	ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+	# <medial> 0643 0645
+FCED	ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+	# <medial> 0644 0645
+FCEE	ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+	# <medial> 0646 0645
+FCEF	ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+	# <medial> 0646 0647
+FCF0	ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+	# <medial> 064A 0645
+FCF1	ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+	# <medial> 064A 0647
+FCF2	ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+	# <medial> 0640 064E 0651
+FCF3	ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+	# <medial> 0640 064F 0651
+FCF4	ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+	# <medial> 0640 0650 0651
+FCF5	ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0637 0649
+FCF6	ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+	# <isolated> 0637 064A
+FCF7	ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0639 0649
+FCF8	ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+	# <isolated> 0639 064A
+FCF9	ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 063A 0649
+FCFA	ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+	# <isolated> 063A 064A
+FCFB	ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0633 0649
+FCFC	ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+	# <isolated> 0633 064A
+FCFD	ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0634 0649
+FCFE	ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+	# <isolated> 0634 064A
+FCFF	ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 062D 0649
+FD00	ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+	# <isolated> 062D 064A
+FD01	ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 062C 0649
+FD02	ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+	# <isolated> 062C 064A
+FD03	ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 062E 0649
+FD04	ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+	# <isolated> 062E 064A
+FD05	ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0635 0649
+FD06	ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+	# <isolated> 0635 064A
+FD07	ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0636 0649
+FD08	ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+	# <isolated> 0636 064A
+FD09	ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+	# <isolated> 0634 062C
+FD0A	ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+	# <isolated> 0634 062D
+FD0B	ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+	# <isolated> 0634 062E
+FD0C	ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+	# <isolated> 0634 0645
+FD0D	ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+	# <isolated> 0634 0631
+FD0E	ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+	# <isolated> 0633 0631
+FD0F	ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+	# <isolated> 0635 0631
+FD10	ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+	# <isolated> 0636 0631
+FD11	ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+	# <final> 0637 0649
+FD12	ARABIC LIGATURE TAH WITH YEH FINAL FORM
+	# <final> 0637 064A
+FD13	ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+	# <final> 0639 0649
+FD14	ARABIC LIGATURE AIN WITH YEH FINAL FORM
+	# <final> 0639 064A
+FD15	ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+	# <final> 063A 0649
+FD16	ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+	# <final> 063A 064A
+FD17	ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+	# <final> 0633 0649
+FD18	ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+	# <final> 0633 064A
+FD19	ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+	# <final> 0634 0649
+FD1A	ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+	# <final> 0634 064A
+FD1B	ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+	# <final> 062D 0649
+FD1C	ARABIC LIGATURE HAH WITH YEH FINAL FORM
+	# <final> 062D 064A
+FD1D	ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+	# <final> 062C 0649
+FD1E	ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+	# <final> 062C 064A
+FD1F	ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+	# <final> 062E 0649
+FD20	ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+	# <final> 062E 064A
+FD21	ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+	# <final> 0635 0649
+FD22	ARABIC LIGATURE SAD WITH YEH FINAL FORM
+	# <final> 0635 064A
+FD23	ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+	# <final> 0636 0649
+FD24	ARABIC LIGATURE DAD WITH YEH FINAL FORM
+	# <final> 0636 064A
+FD25	ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+	# <final> 0634 062C
+FD26	ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+	# <final> 0634 062D
+FD27	ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+	# <final> 0634 062E
+FD28	ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+	# <final> 0634 0645
+FD29	ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+	# <final> 0634 0631
+FD2A	ARABIC LIGATURE SEEN WITH REH FINAL FORM
+	# <final> 0633 0631
+FD2B	ARABIC LIGATURE SAD WITH REH FINAL FORM
+	# <final> 0635 0631
+FD2C	ARABIC LIGATURE DAD WITH REH FINAL FORM
+	# <final> 0636 0631
+FD2D	ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+	# <initial> 0634 062C
+FD2E	ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+	# <initial> 0634 062D
+FD2F	ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+	# <initial> 0634 062E
+FD30	ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+	# <initial> 0634 0645
+FD31	ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+	# <initial> 0633 0647
+FD32	ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+	# <initial> 0634 0647
+FD33	ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+	# <initial> 0637 0645
+FD34	ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+	# <medial> 0633 062C
+FD35	ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+	# <medial> 0633 062D
+FD36	ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+	# <medial> 0633 062E
+FD37	ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+	# <medial> 0634 062C
+FD38	ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+	# <medial> 0634 062D
+FD39	ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+	# <medial> 0634 062E
+FD3A	ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+	# <medial> 0637 0645
+FD3B	ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+	# <medial> 0638 0645
+FD3C	ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+	# <final> 0627 064B
+FD3D	ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+	# <isolated> 0627 064B
+@		Punctuation
+FD3E	ORNATE LEFT PARENTHESIS
+FD3F	ORNATE RIGHT PARENTHESIS
+@		Ligatures (three elements)
+FD50	ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+	# <initial> 062A 062C 0645
+FD51	ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+	# <final> 062A 062D 062C
+FD52	ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+	# <initial> 062A 062D 062C
+FD53	ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+	# <initial> 062A 062D 0645
+FD54	ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+	# <initial> 062A 062E 0645
+FD55	ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+	# <initial> 062A 0645 062C
+FD56	ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+	# <initial> 062A 0645 062D
+FD57	ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+	# <initial> 062A 0645 062E
+FD58	ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+	# <final> 062C 0645 062D
+FD59	ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+	# <initial> 062C 0645 062D
+FD5A	ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+	# <final> 062D 0645 064A
+FD5B	ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+	# <final> 062D 0645 0649
+FD5C	ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+	# <initial> 0633 062D 062C
+FD5D	ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+	# <initial> 0633 062C 062D
+FD5E	ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+	# <final> 0633 062C 0649
+FD5F	ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+	# <final> 0633 0645 062D
+FD60	ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+	# <initial> 0633 0645 062D
+FD61	ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+	# <initial> 0633 0645 062C
+FD62	ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+	# <final> 0633 0645 0645
+FD63	ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+	# <initial> 0633 0645 0645
+FD64	ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+	# <final> 0635 062D 062D
+FD65	ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+	# <initial> 0635 062D 062D
+FD66	ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+	# <final> 0635 0645 0645
+FD67	ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+	# <final> 0634 062D 0645
+FD68	ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+	# <initial> 0634 062D 0645
+FD69	ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+	# <final> 0634 062C 064A
+FD6A	ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+	# <final> 0634 0645 062E
+FD6B	ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+	# <initial> 0634 0645 062E
+FD6C	ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+	# <final> 0634 0645 0645
+FD6D	ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+	# <initial> 0634 0645 0645
+FD6E	ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+	# <final> 0636 062D 0649
+FD6F	ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+	# <final> 0636 062E 0645
+FD70	ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+	# <initial> 0636 062E 0645
+FD71	ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+	# <final> 0637 0645 062D
+FD72	ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+	# <initial> 0637 0645 062D
+FD73	ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+	# <initial> 0637 0645 0645
+FD74	ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+	# <final> 0637 0645 064A
+FD75	ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+	# <final> 0639 062C 0645
+FD76	ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+	# <final> 0639 0645 0645
+FD77	ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+	# <initial> 0639 0645 0645
+FD78	ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+	# <final> 0639 0645 0649
+FD79	ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+	# <final> 063A 0645 0645
+FD7A	ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+	# <final> 063A 0645 064A
+FD7B	ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+	# <final> 063A 0645 0649
+FD7C	ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+	# <final> 0641 062E 0645
+FD7D	ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+	# <initial> 0641 062E 0645
+FD7E	ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+	# <final> 0642 0645 062D
+FD7F	ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+	# <final> 0642 0645 0645
+FD80	ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+	# <final> 0644 062D 0645
+FD81	ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+	# <final> 0644 062D 064A
+FD82	ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+	# <final> 0644 062D 0649
+FD83	ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+	# <initial> 0644 062C 062C
+FD84	ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+	# <final> 0644 062C 062C
+FD85	ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+	# <final> 0644 062E 0645
+FD86	ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+	# <initial> 0644 062E 0645
+FD87	ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+	# <final> 0644 0645 062D
+FD88	ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+	# <initial> 0644 0645 062D
+FD89	ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+	# <initial> 0645 062D 062C
+FD8A	ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+	# <initial> 0645 062D 0645
+FD8B	ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+	# <final> 0645 062D 064A
+FD8C	ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+	# <initial> 0645 062C 062D
+FD8D	ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+	# <initial> 0645 062C 0645
+FD8E	ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+	# <initial> 0645 062E 062C
+FD8F	ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+	# <initial> 0645 062E 0645
+FD92	ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+	# <initial> 0645 062C 062E
+FD93	ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+	# <initial> 0647 0645 062C
+FD94	ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+	# <initial> 0647 0645 0645
+FD95	ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+	# <initial> 0646 062D 0645
+FD96	ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+	# <final> 0646 062D 0649
+FD97	ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+	# <final> 0646 062C 0645
+FD98	ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+	# <initial> 0646 062C 0645
+FD99	ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+	# <final> 0646 062C 0649
+FD9A	ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+	# <final> 0646 0645 064A
+FD9B	ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+	# <final> 0646 0645 0649
+FD9C	ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+	# <final> 064A 0645 0645
+FD9D	ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+	# <initial> 064A 0645 0645
+FD9E	ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+	# <final> 0628 062E 064A
+FD9F	ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+	# <final> 062A 062C 064A
+FDA0	ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+	# <final> 062A 062C 0649
+FDA1	ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+	# <final> 062A 062E 064A
+FDA2	ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+	# <final> 062A 062E 0649
+FDA3	ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+	# <final> 062A 0645 064A
+FDA4	ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+	# <final> 062A 0645 0649
+FDA5	ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+	# <final> 062C 0645 064A
+FDA6	ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+	# <final> 062C 062D 0649
+FDA7	ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+	# <final> 062C 0645 0649
+FDA8	ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+	# <final> 0633 062E 0649
+FDA9	ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+	# <final> 0635 062D 064A
+FDAA	ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+	# <final> 0634 062D 064A
+FDAB	ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+	# <final> 0636 062D 064A
+FDAC	ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+	# <final> 0644 062C 064A
+FDAD	ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+	# <final> 0644 0645 064A
+FDAE	ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+	# <final> 064A 062D 064A
+FDAF	ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+	# <final> 064A 062C 064A
+FDB0	ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+	# <final> 064A 0645 064A
+FDB1	ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+	# <final> 0645 0645 064A
+FDB2	ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+	# <final> 0642 0645 064A
+FDB3	ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+	# <final> 0646 062D 064A
+FDB4	ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+	# <initial> 0642 0645 062D
+FDB5	ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+	# <initial> 0644 062D 0645
+FDB6	ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+	# <final> 0639 0645 064A
+FDB7	ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+	# <final> 0643 0645 064A
+FDB8	ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+	# <initial> 0646 062C 062D
+FDB9	ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+	# <final> 0645 062E 064A
+FDBA	ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+	# <initial> 0644 062C 0645
+FDBB	ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+	# <final> 0643 0645 0645
+FDBC	ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+	# <final> 0644 062C 0645
+FDBD	ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+	# <final> 0646 062C 062D
+FDBE	ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+	# <final> 062C 062D 064A
+FDBF	ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+	# <final> 062D 062C 064A
+FDC0	ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+	# <final> 0645 062C 064A
+FDC1	ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+	# <final> 0641 0645 064A
+FDC2	ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+	# <final> 0628 062D 064A
+FDC3	ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+	# <initial> 0643 0645 0645
+FDC4	ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+	# <initial> 0639 062C 0645
+FDC5	ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+	# <initial> 0635 0645 0645
+FDC6	ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+	# <final> 0633 062E 064A
+FDC7	ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+	# <final> 0646 062C 064A
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+FDD0	<not a character>
+FDD1	<not a character>
+FDD2	<not a character>
+FDD3	<not a character>
+FDD4	<not a character>
+FDD5	<not a character>
+FDD6	<not a character>
+FDD7	<not a character>
+FDD8	<not a character>
+FDD9	<not a character>
+FDDA	<not a character>
+FDDB	<not a character>
+FDDC	<not a character>
+FDDD	<not a character>
+FDDE	<not a character>
+FDDF	<not a character>
+FDE0	<not a character>
+FDE1	<not a character>
+FDE2	<not a character>
+FDE3	<not a character>
+FDE4	<not a character>
+FDE5	<not a character>
+FDE6	<not a character>
+FDE7	<not a character>
+FDE8	<not a character>
+FDE9	<not a character>
+FDEA	<not a character>
+FDEB	<not a character>
+FDEC	<not a character>
+FDED	<not a character>
+FDEE	<not a character>
+FDEF	<not a character>
+@		Word ligatures
+FDF0	ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+	# <isolated> 0635 0644 06D2
+FDF1	ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+	# <isolated> 0642 0644 06D2
+FDF2	ARABIC LIGATURE ALLAH ISOLATED FORM
+	# <isolated> 0627 0644 0644 0647
+FDF3	ARABIC LIGATURE AKBAR ISOLATED FORM
+	# <isolated> 0627 0643 0628 0631
+FDF4	ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+	# <isolated> 0645 062D 0645 062F
+FDF5	ARABIC LIGATURE SALAM ISOLATED FORM
+	# <isolated> 0635 0644 0639 0645
+FDF6	ARABIC LIGATURE RASOUL ISOLATED FORM
+	# <isolated> 0631 0633 0648 0644
+FDF7	ARABIC LIGATURE ALAYHE ISOLATED FORM
+	# <isolated> 0639 0644 064A 0647
+FDF8	ARABIC LIGATURE WASALLAM ISOLATED FORM
+	# <isolated> 0648 0633 0644 0645
+FDF9	ARABIC LIGATURE SALLA ISOLATED FORM
+	# <isolated> 0635 0644 0649
+FDFA	ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+	# <isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645
+FDFB	ARABIC LIGATURE JALLAJALALOUHOU
+	# <isolated> 062C 0644 0020 062C 0644 0627 0644 0647
+@		Currency sign
+FDFC	RIAL SIGN
+	# <isolated> 0631 06CC 0627 0644
+@		Symbol
+FDFD	ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+@@	FE00	Variation Selectors	FE0F
+@		Variation selectors
+@+	Combining characters; in conjunction with the preceding character these indicate a predetermined choice of variant glyph
+FE00	VARIATION SELECTOR-1
+	* these are abbreviated VS1, and so on
+FE01	VARIATION SELECTOR-2
+FE02	VARIATION SELECTOR-3
+FE03	VARIATION SELECTOR-4
+FE04	VARIATION SELECTOR-5
+FE05	VARIATION SELECTOR-6
+FE06	VARIATION SELECTOR-7
+FE07	VARIATION SELECTOR-8
+FE08	VARIATION SELECTOR-9
+FE09	VARIATION SELECTOR-10
+FE0A	VARIATION SELECTOR-11
+FE0B	VARIATION SELECTOR-12
+FE0C	VARIATION SELECTOR-13
+FE0D	VARIATION SELECTOR-14
+FE0E	VARIATION SELECTOR-15
+FE0F	VARIATION SELECTOR-16
+@@	FE10	Vertical forms	FE1F
+@+		These characters are compatibility characters needed to map to GB 18030.
+@		Glyphs for vertical variants
+FE10	PRESENTATION FORM FOR VERTICAL COMMA
+	x (small comma - FE50)
+	# <vertical> 002C
+FE11	PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
+	x (sesame dot - FE45)
+	x (small ideographic comma - FE51)
+	# <vertical> 3001
+FE12	PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP
+	# <vertical> 3002
+FE13	PRESENTATION FORM FOR VERTICAL COLON
+	x (small colon - FE55)
+	# <vertical> 003A
+FE14	PRESENTATION FORM FOR VERTICAL SEMICOLON
+	x (small semicolon - FE54)
+	# <vertical> 003B
+FE15	PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
+	x (small exclamation mark - FE57)
+	# <vertical> 0021
+FE16	PRESENTATION FORM FOR VERTICAL QUESTION MARK
+	x (small question mark - FE56)
+	# <vertical> 003F
+FE17	PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+	# <vertical> 3016
+FE18	PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+	# <vertical> 3017
+FE19	PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+	x (vertical ellipsis - 22EE)
+	# <vertical> 2026
+@@	FE20	Combining Half Marks	FE2F
+@		Combining half marks
+FE20	COMBINING LIGATURE LEFT HALF
+FE21	COMBINING LIGATURE RIGHT HALF
+FE22	COMBINING DOUBLE TILDE LEFT HALF
+FE23	COMBINING DOUBLE TILDE RIGHT HALF
+@@	FE30	CJK Compatibility Forms	FE4F
+@		Glyphs for vertical variants
+FE30	PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+	# <vertical> 2025
+FE31	PRESENTATION FORM FOR VERTICAL EM DASH
+	# <vertical> 2014
+FE32	PRESENTATION FORM FOR VERTICAL EN DASH
+	# <vertical> 2013
+FE33	PRESENTATION FORM FOR VERTICAL LOW LINE
+	# <vertical> 005F
+FE34	PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+	# <vertical> 005F
+FE35	PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+	# <vertical> 0028
+FE36	PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+	# <vertical> 0029
+FE37	PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+	# <vertical> 007B
+FE38	PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+	# <vertical> 007D
+FE39	PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+	# <vertical> 3014
+FE3A	PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+	# <vertical> 3015
+FE3B	PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+	# <vertical> 3010
+FE3C	PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+	# <vertical> 3011
+FE3D	PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+	# <vertical> 300A
+FE3E	PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+	# <vertical> 300B
+FE3F	PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+	# <vertical> 3008
+FE40	PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+	# <vertical> 3009
+FE41	PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+	# <vertical> 300C
+FE42	PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+	# <vertical> 300D
+FE43	PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+	# <vertical> 300E
+FE44	PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+	# <vertical> 300F
+@		Sidelining emphasis marks
+FE45	SESAME DOT
+	x (small ideographic comma - FE51)
+FE46	WHITE SESAME DOT
+	* sesame dots are used beside vertical text for emphasis
+@		Glyphs for vertical variants
+FE47	PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+	x (top square bracket - 23B4)
+	# <vertical> 005B
+FE48	PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+	x (bottom square bracket - 23B5)
+	# <vertical> 005D
+@		Overscores and underscores
+FE49	DASHED OVERLINE
+	# 203E overline
+FE4A	CENTRELINE OVERLINE
+	# 203E overline
+FE4B	WAVY OVERLINE
+	# 203E overline
+FE4C	DOUBLE WAVY OVERLINE
+	# 203E overline
+FE4D	DASHED LOW LINE
+	# 005F low line
+FE4E	CENTRELINE LOW LINE
+	# 005F low line
+FE4F	WAVY LOW LINE
+	# 005F low line
+@@	FE50	Small Form Variants	FE6F
+@+		These characters are compatibility characters needed to map to CNS 11643.
+@		Small form variants
+FE50	SMALL COMMA
+	x (presentation form for vertical comma - FE10)
+	# <small> 002C
+FE51	SMALL IDEOGRAPHIC COMMA
+	x (presentation form for vertical ideographic comma - FE11)
+	x (black sesame dot - FE45)
+	# <small> 3001
+FE52	SMALL FULL STOP
+	# <small> 002E
+FE54	SMALL SEMICOLON
+	x (presentation form for vertical semicolon - FE14)
+	# <small> 003B
+FE55	SMALL COLON
+	x (presentation form for vertical colon - FE13)
+	# <small> 003A
+FE56	SMALL QUESTION MARK
+	x (presentation form for vertical question mark - FE16)
+	# <small> 003F
+FE57	SMALL EXCLAMATION MARK
+	x (presentation form for vertical exclamation mark - FE15)
+	# <small> 0021
+FE58	SMALL EM DASH
+	# <small> 2014
+FE59	SMALL LEFT PARENTHESIS
+	# <small> 0028
+FE5A	SMALL RIGHT PARENTHESIS
+	# <small> 0029
+FE5B	SMALL LEFT CURLY BRACKET
+	# <small> 007B
+FE5C	SMALL RIGHT CURLY BRACKET
+	# <small> 007D
+FE5D	SMALL LEFT TORTOISE SHELL BRACKET
+	# <small> 3014
+FE5E	SMALL RIGHT TORTOISE SHELL BRACKET
+	# <small> 3015
+FE5F	SMALL NUMBER SIGN
+	# <small> 0023
+FE60	SMALL AMPERSAND
+	# <small> 0026
+FE61	SMALL ASTERISK
+	# <small> 002A
+FE62	SMALL PLUS SIGN
+	# <small> 002B
+FE63	SMALL HYPHEN-MINUS
+	# <small> 002D
+FE64	SMALL LESS-THAN SIGN
+	# <small> 003C
+FE65	SMALL GREATER-THAN SIGN
+	# <small> 003E
+FE66	SMALL EQUALS SIGN
+	# <small> 003D
+FE68	SMALL REVERSE SOLIDUS
+	# <small> 005C
+FE69	SMALL DOLLAR SIGN
+	# <small> 0024
+FE6A	SMALL PERCENT SIGN
+	# <small> 0025
+FE6B	SMALL COMMERCIAL AT
+	# <small> 0040
+@@	FE70	Arabic Presentation Forms-B	FEFF
+@		Glyphs for spacing forms of Arabic points
+FE70	ARABIC FATHATAN ISOLATED FORM
+	# <isolated> 0020 064B
+FE71	ARABIC TATWEEL WITH FATHATAN ABOVE
+	# <medial> 0640 064B
+FE72	ARABIC DAMMATAN ISOLATED FORM
+	# <isolated> 0020 064C
+@		Glyph part
+FE73	ARABIC TAIL FRAGMENT
+	* for compatibility with certain legacy character sets
+@		Glyphs for spacing forms of Arabic points
+FE74	ARABIC KASRATAN ISOLATED FORM
+	# <isolated> 0020 064D
+FE76	ARABIC FATHA ISOLATED FORM
+	# <isolated> 0020 064E
+FE77	ARABIC FATHA MEDIAL FORM
+	# <medial> 0640 064E
+FE78	ARABIC DAMMA ISOLATED FORM
+	# <isolated> 0020 064F
+FE79	ARABIC DAMMA MEDIAL FORM
+	# <medial> 0640 064F
+FE7A	ARABIC KASRA ISOLATED FORM
+	# <isolated> 0020 0650
+FE7B	ARABIC KASRA MEDIAL FORM
+	# <medial> 0640 0650
+FE7C	ARABIC SHADDA ISOLATED FORM
+	# <isolated> 0020 0651
+FE7D	ARABIC SHADDA MEDIAL FORM
+	# <medial> 0640 0651
+FE7E	ARABIC SUKUN ISOLATED FORM
+	# <isolated> 0020 0652
+FE7F	ARABIC SUKUN MEDIAL FORM
+	# <medial> 0640 0652
+@		Basic glyphs for Arabic language contextual forms
+FE80	ARABIC LETTER HAMZA ISOLATED FORM
+	# <isolated> 0621
+FE81	ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+	# <isolated> 0622
+FE82	ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+	# <final> 0622
+FE83	ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+	# <isolated> 0623
+FE84	ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+	# <final> 0623
+FE85	ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+	# <isolated> 0624
+FE86	ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+	# <final> 0624
+FE87	ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+	# <isolated> 0625
+FE88	ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+	# <final> 0625
+FE89	ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+	# <isolated> 0626
+FE8A	ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+	# <final> 0626
+FE8B	ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+	# <initial> 0626
+FE8C	ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+	# <medial> 0626
+FE8D	ARABIC LETTER ALEF ISOLATED FORM
+	# <isolated> 0627
+FE8E	ARABIC LETTER ALEF FINAL FORM
+	# <final> 0627
+FE8F	ARABIC LETTER BEH ISOLATED FORM
+	# <isolated> 0628
+FE90	ARABIC LETTER BEH FINAL FORM
+	# <final> 0628
+FE91	ARABIC LETTER BEH INITIAL FORM
+	# <initial> 0628
+FE92	ARABIC LETTER BEH MEDIAL FORM
+	# <medial> 0628
+FE93	ARABIC LETTER TEH MARBUTA ISOLATED FORM
+	# <isolated> 0629
+FE94	ARABIC LETTER TEH MARBUTA FINAL FORM
+	# <final> 0629
+FE95	ARABIC LETTER TEH ISOLATED FORM
+	# <isolated> 062A
+FE96	ARABIC LETTER TEH FINAL FORM
+	# <final> 062A
+FE97	ARABIC LETTER TEH INITIAL FORM
+	# <initial> 062A
+FE98	ARABIC LETTER TEH MEDIAL FORM
+	# <medial> 062A
+FE99	ARABIC LETTER THEH ISOLATED FORM
+	# <isolated> 062B
+FE9A	ARABIC LETTER THEH FINAL FORM
+	# <final> 062B
+FE9B	ARABIC LETTER THEH INITIAL FORM
+	# <initial> 062B
+FE9C	ARABIC LETTER THEH MEDIAL FORM
+	# <medial> 062B
+FE9D	ARABIC LETTER JEEM ISOLATED FORM
+	# <isolated> 062C
+FE9E	ARABIC LETTER JEEM FINAL FORM
+	# <final> 062C
+FE9F	ARABIC LETTER JEEM INITIAL FORM
+	# <initial> 062C
+FEA0	ARABIC LETTER JEEM MEDIAL FORM
+	# <medial> 062C
+FEA1	ARABIC LETTER HAH ISOLATED FORM
+	# <isolated> 062D
+FEA2	ARABIC LETTER HAH FINAL FORM
+	# <final> 062D
+FEA3	ARABIC LETTER HAH INITIAL FORM
+	# <initial> 062D
+FEA4	ARABIC LETTER HAH MEDIAL FORM
+	# <medial> 062D
+FEA5	ARABIC LETTER KHAH ISOLATED FORM
+	# <isolated> 062E
+FEA6	ARABIC LETTER KHAH FINAL FORM
+	# <final> 062E
+FEA7	ARABIC LETTER KHAH INITIAL FORM
+	# <initial> 062E
+FEA8	ARABIC LETTER KHAH MEDIAL FORM
+	# <medial> 062E
+FEA9	ARABIC LETTER DAL ISOLATED FORM
+	# <isolated> 062F
+FEAA	ARABIC LETTER DAL FINAL FORM
+	# <final> 062F
+FEAB	ARABIC LETTER THAL ISOLATED FORM
+	# <isolated> 0630
+FEAC	ARABIC LETTER THAL FINAL FORM
+	# <final> 0630
+FEAD	ARABIC LETTER REH ISOLATED FORM
+	# <isolated> 0631
+FEAE	ARABIC LETTER REH FINAL FORM
+	# <final> 0631
+FEAF	ARABIC LETTER ZAIN ISOLATED FORM
+	# <isolated> 0632
+FEB0	ARABIC LETTER ZAIN FINAL FORM
+	# <final> 0632
+FEB1	ARABIC LETTER SEEN ISOLATED FORM
+	# <isolated> 0633
+FEB2	ARABIC LETTER SEEN FINAL FORM
+	# <final> 0633
+FEB3	ARABIC LETTER SEEN INITIAL FORM
+	# <initial> 0633
+FEB4	ARABIC LETTER SEEN MEDIAL FORM
+	# <medial> 0633
+FEB5	ARABIC LETTER SHEEN ISOLATED FORM
+	# <isolated> 0634
+FEB6	ARABIC LETTER SHEEN FINAL FORM
+	# <final> 0634
+FEB7	ARABIC LETTER SHEEN INITIAL FORM
+	# <initial> 0634
+FEB8	ARABIC LETTER SHEEN MEDIAL FORM
+	# <medial> 0634
+FEB9	ARABIC LETTER SAD ISOLATED FORM
+	# <isolated> 0635
+FEBA	ARABIC LETTER SAD FINAL FORM
+	# <final> 0635
+FEBB	ARABIC LETTER SAD INITIAL FORM
+	# <initial> 0635
+FEBC	ARABIC LETTER SAD MEDIAL FORM
+	# <medial> 0635
+FEBD	ARABIC LETTER DAD ISOLATED FORM
+	# <isolated> 0636
+FEBE	ARABIC LETTER DAD FINAL FORM
+	# <final> 0636
+FEBF	ARABIC LETTER DAD INITIAL FORM
+	# <initial> 0636
+FEC0	ARABIC LETTER DAD MEDIAL FORM
+	# <medial> 0636
+FEC1	ARABIC LETTER TAH ISOLATED FORM
+	# <isolated> 0637
+FEC2	ARABIC LETTER TAH FINAL FORM
+	# <final> 0637
+FEC3	ARABIC LETTER TAH INITIAL FORM
+	# <initial> 0637
+FEC4	ARABIC LETTER TAH MEDIAL FORM
+	# <medial> 0637
+FEC5	ARABIC LETTER ZAH ISOLATED FORM
+	# <isolated> 0638
+FEC6	ARABIC LETTER ZAH FINAL FORM
+	# <final> 0638
+FEC7	ARABIC LETTER ZAH INITIAL FORM
+	# <initial> 0638
+FEC8	ARABIC LETTER ZAH MEDIAL FORM
+	# <medial> 0638
+FEC9	ARABIC LETTER AIN ISOLATED FORM
+	# <isolated> 0639
+FECA	ARABIC LETTER AIN FINAL FORM
+	# <final> 0639
+FECB	ARABIC LETTER AIN INITIAL FORM
+	# <initial> 0639
+FECC	ARABIC LETTER AIN MEDIAL FORM
+	# <medial> 0639
+FECD	ARABIC LETTER GHAIN ISOLATED FORM
+	# <isolated> 063A
+FECE	ARABIC LETTER GHAIN FINAL FORM
+	# <final> 063A
+FECF	ARABIC LETTER GHAIN INITIAL FORM
+	# <initial> 063A
+FED0	ARABIC LETTER GHAIN MEDIAL FORM
+	# <medial> 063A
+FED1	ARABIC LETTER FEH ISOLATED FORM
+	# <isolated> 0641
+FED2	ARABIC LETTER FEH FINAL FORM
+	# <final> 0641
+FED3	ARABIC LETTER FEH INITIAL FORM
+	# <initial> 0641
+FED4	ARABIC LETTER FEH MEDIAL FORM
+	# <medial> 0641
+FED5	ARABIC LETTER QAF ISOLATED FORM
+	# <isolated> 0642
+FED6	ARABIC LETTER QAF FINAL FORM
+	# <final> 0642
+FED7	ARABIC LETTER QAF INITIAL FORM
+	# <initial> 0642
+FED8	ARABIC LETTER QAF MEDIAL FORM
+	# <medial> 0642
+FED9	ARABIC LETTER KAF ISOLATED FORM
+	# <isolated> 0643
+FEDA	ARABIC LETTER KAF FINAL FORM
+	# <final> 0643
+FEDB	ARABIC LETTER KAF INITIAL FORM
+	# <initial> 0643
+FEDC	ARABIC LETTER KAF MEDIAL FORM
+	# <medial> 0643
+FEDD	ARABIC LETTER LAM ISOLATED FORM
+	# <isolated> 0644
+FEDE	ARABIC LETTER LAM FINAL FORM
+	# <final> 0644
+FEDF	ARABIC LETTER LAM INITIAL FORM
+	# <initial> 0644
+FEE0	ARABIC LETTER LAM MEDIAL FORM
+	# <medial> 0644
+FEE1	ARABIC LETTER MEEM ISOLATED FORM
+	# <isolated> 0645
+FEE2	ARABIC LETTER MEEM FINAL FORM
+	# <final> 0645
+FEE3	ARABIC LETTER MEEM INITIAL FORM
+	# <initial> 0645
+FEE4	ARABIC LETTER MEEM MEDIAL FORM
+	# <medial> 0645
+FEE5	ARABIC LETTER NOON ISOLATED FORM
+	# <isolated> 0646
+FEE6	ARABIC LETTER NOON FINAL FORM
+	# <final> 0646
+FEE7	ARABIC LETTER NOON INITIAL FORM
+	# <initial> 0646
+FEE8	ARABIC LETTER NOON MEDIAL FORM
+	# <medial> 0646
+FEE9	ARABIC LETTER HEH ISOLATED FORM
+	# <isolated> 0647
+FEEA	ARABIC LETTER HEH FINAL FORM
+	# <final> 0647
+FEEB	ARABIC LETTER HEH INITIAL FORM
+	# <initial> 0647
+FEEC	ARABIC LETTER HEH MEDIAL FORM
+	# <medial> 0647
+FEED	ARABIC LETTER WAW ISOLATED FORM
+	# <isolated> 0648
+FEEE	ARABIC LETTER WAW FINAL FORM
+	# <final> 0648
+FEEF	ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+	# <isolated> 0649
+FEF0	ARABIC LETTER ALEF MAKSURA FINAL FORM
+	# <final> 0649
+FEF1	ARABIC LETTER YEH ISOLATED FORM
+	# <isolated> 064A
+FEF2	ARABIC LETTER YEH FINAL FORM
+	# <final> 064A
+FEF3	ARABIC LETTER YEH INITIAL FORM
+	# <initial> 064A
+FEF4	ARABIC LETTER YEH MEDIAL FORM
+	# <medial> 064A
+FEF5	ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+	# <isolated> 0644 0622
+FEF6	ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+	# <final> 0644 0622
+FEF7	ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+	# <isolated> 0644 0623
+FEF8	ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+	# <final> 0644 0623
+FEF9	ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+	# <isolated> 0644 0625
+FEFA	ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+	# <final> 0644 0625
+FEFB	ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+	# <isolated> 0644 0627
+FEFC	ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+	# <final> 0644 0627
+@		Special
+FEFF	ZERO WIDTH NO-BREAK SPACE
+	= BYTE ORDER MARK (BOM), ZWNBSP
+	* may be used to detect byte order by contrast with the noncharacter code point FFFE
+	* use as an indication of non-breaking is deprecated; see 2060 instead
+	x (zero width space - 200B)
+	x (word joiner - 2060)
+	x (<not a character> - FFFE)
+@@	FF00	Halfwidth and Fullwidth Forms	FFEF
+@		Fullwidth ASCII variants
+@+		See ASCII 0020 - 007E
+FF01	FULLWIDTH EXCLAMATION MARK
+	# <wide> 0021
+FF02	FULLWIDTH QUOTATION MARK
+	# <wide> 0022
+FF03	FULLWIDTH NUMBER SIGN
+	# <wide> 0023
+FF04	FULLWIDTH DOLLAR SIGN
+	# <wide> 0024
+FF05	FULLWIDTH PERCENT SIGN
+	# <wide> 0025
+FF06	FULLWIDTH AMPERSAND
+	# <wide> 0026
+FF07	FULLWIDTH APOSTROPHE
+	# <wide> 0027
+FF08	FULLWIDTH LEFT PARENTHESIS
+	# <wide> 0028
+FF09	FULLWIDTH RIGHT PARENTHESIS
+	# <wide> 0029
+FF0A	FULLWIDTH ASTERISK
+	# <wide> 002A
+FF0B	FULLWIDTH PLUS SIGN
+	# <wide> 002B
+FF0C	FULLWIDTH COMMA
+	# <wide> 002C
+FF0D	FULLWIDTH HYPHEN-MINUS
+	# <wide> 002D
+FF0E	FULLWIDTH FULL STOP
+	# <wide> 002E
+FF0F	FULLWIDTH SOLIDUS
+	# <wide> 002F
+FF10	FULLWIDTH DIGIT ZERO
+	# <wide> 0030
+FF11	FULLWIDTH DIGIT ONE
+	# <wide> 0031
+FF12	FULLWIDTH DIGIT TWO
+	# <wide> 0032
+FF13	FULLWIDTH DIGIT THREE
+	# <wide> 0033
+FF14	FULLWIDTH DIGIT FOUR
+	# <wide> 0034
+FF15	FULLWIDTH DIGIT FIVE
+	# <wide> 0035
+FF16	FULLWIDTH DIGIT SIX
+	# <wide> 0036
+FF17	FULLWIDTH DIGIT SEVEN
+	# <wide> 0037
+FF18	FULLWIDTH DIGIT EIGHT
+	# <wide> 0038
+FF19	FULLWIDTH DIGIT NINE
+	# <wide> 0039
+FF1A	FULLWIDTH COLON
+	# <wide> 003A
+FF1B	FULLWIDTH SEMICOLON
+	# <wide> 003B
+FF1C	FULLWIDTH LESS-THAN SIGN
+	# <wide> 003C
+FF1D	FULLWIDTH EQUALS SIGN
+	# <wide> 003D
+FF1E	FULLWIDTH GREATER-THAN SIGN
+	# <wide> 003E
+FF1F	FULLWIDTH QUESTION MARK
+	# <wide> 003F
+FF20	FULLWIDTH COMMERCIAL AT
+	# <wide> 0040
+FF21	FULLWIDTH LATIN CAPITAL LETTER A
+	# <wide> 0041
+FF22	FULLWIDTH LATIN CAPITAL LETTER B
+	# <wide> 0042
+FF23	FULLWIDTH LATIN CAPITAL LETTER C
+	# <wide> 0043
+FF24	FULLWIDTH LATIN CAPITAL LETTER D
+	# <wide> 0044
+FF25	FULLWIDTH LATIN CAPITAL LETTER E
+	# <wide> 0045
+FF26	FULLWIDTH LATIN CAPITAL LETTER F
+	# <wide> 0046
+FF27	FULLWIDTH LATIN CAPITAL LETTER G
+	# <wide> 0047
+FF28	FULLWIDTH LATIN CAPITAL LETTER H
+	# <wide> 0048
+FF29	FULLWIDTH LATIN CAPITAL LETTER I
+	# <wide> 0049
+FF2A	FULLWIDTH LATIN CAPITAL LETTER J
+	# <wide> 004A
+FF2B	FULLWIDTH LATIN CAPITAL LETTER K
+	# <wide> 004B
+FF2C	FULLWIDTH LATIN CAPITAL LETTER L
+	# <wide> 004C
+FF2D	FULLWIDTH LATIN CAPITAL LETTER M
+	# <wide> 004D
+FF2E	FULLWIDTH LATIN CAPITAL LETTER N
+	# <wide> 004E
+FF2F	FULLWIDTH LATIN CAPITAL LETTER O
+	# <wide> 004F
+FF30	FULLWIDTH LATIN CAPITAL LETTER P
+	# <wide> 0050
+FF31	FULLWIDTH LATIN CAPITAL LETTER Q
+	# <wide> 0051
+FF32	FULLWIDTH LATIN CAPITAL LETTER R
+	# <wide> 0052
+FF33	FULLWIDTH LATIN CAPITAL LETTER S
+	# <wide> 0053
+FF34	FULLWIDTH LATIN CAPITAL LETTER T
+	# <wide> 0054
+FF35	FULLWIDTH LATIN CAPITAL LETTER U
+	# <wide> 0055
+FF36	FULLWIDTH LATIN CAPITAL LETTER V
+	# <wide> 0056
+FF37	FULLWIDTH LATIN CAPITAL LETTER W
+	# <wide> 0057
+FF38	FULLWIDTH LATIN CAPITAL LETTER X
+	# <wide> 0058
+FF39	FULLWIDTH LATIN CAPITAL LETTER Y
+	# <wide> 0059
+FF3A	FULLWIDTH LATIN CAPITAL LETTER Z
+	# <wide> 005A
+FF3B	FULLWIDTH LEFT SQUARE BRACKET
+	# <wide> 005B
+FF3C	FULLWIDTH REVERSE SOLIDUS
+	# <wide> 005C
+FF3D	FULLWIDTH RIGHT SQUARE BRACKET
+	# <wide> 005D
+FF3E	FULLWIDTH CIRCUMFLEX ACCENT
+	# <wide> 005E
+FF3F	FULLWIDTH LOW LINE
+	# <wide> 005F
+FF40	FULLWIDTH GRAVE ACCENT
+	# <wide> 0060
+FF41	FULLWIDTH LATIN SMALL LETTER A
+	# <wide> 0061
+FF42	FULLWIDTH LATIN SMALL LETTER B
+	# <wide> 0062
+FF43	FULLWIDTH LATIN SMALL LETTER C
+	# <wide> 0063
+FF44	FULLWIDTH LATIN SMALL LETTER D
+	# <wide> 0064
+FF45	FULLWIDTH LATIN SMALL LETTER E
+	# <wide> 0065
+FF46	FULLWIDTH LATIN SMALL LETTER F
+	# <wide> 0066
+FF47	FULLWIDTH LATIN SMALL LETTER G
+	# <wide> 0067
+FF48	FULLWIDTH LATIN SMALL LETTER H
+	# <wide> 0068
+FF49	FULLWIDTH LATIN SMALL LETTER I
+	# <wide> 0069
+FF4A	FULLWIDTH LATIN SMALL LETTER J
+	# <wide> 006A
+FF4B	FULLWIDTH LATIN SMALL LETTER K
+	# <wide> 006B
+FF4C	FULLWIDTH LATIN SMALL LETTER L
+	# <wide> 006C
+FF4D	FULLWIDTH LATIN SMALL LETTER M
+	# <wide> 006D
+FF4E	FULLWIDTH LATIN SMALL LETTER N
+	# <wide> 006E
+FF4F	FULLWIDTH LATIN SMALL LETTER O
+	# <wide> 006F
+FF50	FULLWIDTH LATIN SMALL LETTER P
+	# <wide> 0070
+FF51	FULLWIDTH LATIN SMALL LETTER Q
+	# <wide> 0071
+FF52	FULLWIDTH LATIN SMALL LETTER R
+	# <wide> 0072
+FF53	FULLWIDTH LATIN SMALL LETTER S
+	# <wide> 0073
+FF54	FULLWIDTH LATIN SMALL LETTER T
+	# <wide> 0074
+FF55	FULLWIDTH LATIN SMALL LETTER U
+	# <wide> 0075
+FF56	FULLWIDTH LATIN SMALL LETTER V
+	# <wide> 0076
+FF57	FULLWIDTH LATIN SMALL LETTER W
+	# <wide> 0077
+FF58	FULLWIDTH LATIN SMALL LETTER X
+	# <wide> 0078
+FF59	FULLWIDTH LATIN SMALL LETTER Y
+	# <wide> 0079
+FF5A	FULLWIDTH LATIN SMALL LETTER Z
+	# <wide> 007A
+FF5B	FULLWIDTH LEFT CURLY BRACKET
+	# <wide> 007B
+FF5C	FULLWIDTH VERTICAL LINE
+	# <wide> 007C
+FF5D	FULLWIDTH RIGHT CURLY BRACKET
+	# <wide> 007D
+FF5E	FULLWIDTH TILDE
+	# <wide> 007E
+@		Fullwidth brackets
+FF5F	FULLWIDTH LEFT WHITE PARENTHESIS *
+	# <wide> 2985
+FF60	FULLWIDTH RIGHT WHITE PARENTHESIS *
+	* the most commonly occurring glyph variant looks like doubled parentheses
+	# <wide> 2986
+@		Halfwidth CJK punctuation
+@+		See CJK punctuation 3000 - 303F
+FF61	HALFWIDTH IDEOGRAPHIC FULL STOP
+	# <narrow> 3002
+FF62	HALFWIDTH LEFT CORNER BRACKET
+	# <narrow> 300C
+FF63	HALFWIDTH RIGHT CORNER BRACKET
+	# <narrow> 300D
+FF64	HALFWIDTH IDEOGRAPHIC COMMA
+	# <narrow> 3001
+@		Halfwidth Katakana variants
+@+		See Katakana 30A0 - 30FF
+FF65	HALFWIDTH KATAKANA MIDDLE DOT
+	# <narrow> 30FB
+FF66	HALFWIDTH KATAKANA LETTER WO
+	# <narrow> 30F2
+FF67	HALFWIDTH KATAKANA LETTER SMALL A
+	# <narrow> 30A1
+FF68	HALFWIDTH KATAKANA LETTER SMALL I
+	# <narrow> 30A3
+FF69	HALFWIDTH KATAKANA LETTER SMALL U
+	# <narrow> 30A5
+FF6A	HALFWIDTH KATAKANA LETTER SMALL E
+	# <narrow> 30A7
+FF6B	HALFWIDTH KATAKANA LETTER SMALL O
+	# <narrow> 30A9
+FF6C	HALFWIDTH KATAKANA LETTER SMALL YA
+	# <narrow> 30E3
+FF6D	HALFWIDTH KATAKANA LETTER SMALL YU
+	# <narrow> 30E5
+FF6E	HALFWIDTH KATAKANA LETTER SMALL YO
+	# <narrow> 30E7
+FF6F	HALFWIDTH KATAKANA LETTER SMALL TU
+	# <narrow> 30C3
+FF70	HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+	# <narrow> 30FC
+FF71	HALFWIDTH KATAKANA LETTER A
+	# <narrow> 30A2
+FF72	HALFWIDTH KATAKANA LETTER I
+	# <narrow> 30A4
+FF73	HALFWIDTH KATAKANA LETTER U
+	# <narrow> 30A6
+FF74	HALFWIDTH KATAKANA LETTER E
+	# <narrow> 30A8
+FF75	HALFWIDTH KATAKANA LETTER O
+	# <narrow> 30AA
+FF76	HALFWIDTH KATAKANA LETTER KA
+	# <narrow> 30AB
+FF77	HALFWIDTH KATAKANA LETTER KI
+	# <narrow> 30AD
+FF78	HALFWIDTH KATAKANA LETTER KU
+	# <narrow> 30AF
+FF79	HALFWIDTH KATAKANA LETTER KE
+	# <narrow> 30B1
+FF7A	HALFWIDTH KATAKANA LETTER KO
+	# <narrow> 30B3
+FF7B	HALFWIDTH KATAKANA LETTER SA
+	# <narrow> 30B5
+FF7C	HALFWIDTH KATAKANA LETTER SI
+	# <narrow> 30B7
+FF7D	HALFWIDTH KATAKANA LETTER SU
+	# <narrow> 30B9
+FF7E	HALFWIDTH KATAKANA LETTER SE
+	# <narrow> 30BB
+FF7F	HALFWIDTH KATAKANA LETTER SO
+	# <narrow> 30BD
+FF80	HALFWIDTH KATAKANA LETTER TA
+	# <narrow> 30BF
+FF81	HALFWIDTH KATAKANA LETTER TI
+	# <narrow> 30C1
+FF82	HALFWIDTH KATAKANA LETTER TU
+	# <narrow> 30C4
+FF83	HALFWIDTH KATAKANA LETTER TE
+	# <narrow> 30C6
+FF84	HALFWIDTH KATAKANA LETTER TO
+	# <narrow> 30C8
+FF85	HALFWIDTH KATAKANA LETTER NA
+	# <narrow> 30CA
+FF86	HALFWIDTH KATAKANA LETTER NI
+	# <narrow> 30CB
+FF87	HALFWIDTH KATAKANA LETTER NU
+	# <narrow> 30CC
+FF88	HALFWIDTH KATAKANA LETTER NE
+	# <narrow> 30CD
+FF89	HALFWIDTH KATAKANA LETTER NO
+	# <narrow> 30CE
+FF8A	HALFWIDTH KATAKANA LETTER HA
+	# <narrow> 30CF
+FF8B	HALFWIDTH KATAKANA LETTER HI
+	# <narrow> 30D2
+FF8C	HALFWIDTH KATAKANA LETTER HU
+	# <narrow> 30D5
+FF8D	HALFWIDTH KATAKANA LETTER HE
+	# <narrow> 30D8
+FF8E	HALFWIDTH KATAKANA LETTER HO
+	# <narrow> 30DB
+FF8F	HALFWIDTH KATAKANA LETTER MA
+	# <narrow> 30DE
+FF90	HALFWIDTH KATAKANA LETTER MI
+	# <narrow> 30DF
+FF91	HALFWIDTH KATAKANA LETTER MU
+	# <narrow> 30E0
+FF92	HALFWIDTH KATAKANA LETTER ME
+	# <narrow> 30E1
+FF93	HALFWIDTH KATAKANA LETTER MO
+	# <narrow> 30E2
+FF94	HALFWIDTH KATAKANA LETTER YA
+	# <narrow> 30E4
+FF95	HALFWIDTH KATAKANA LETTER YU
+	# <narrow> 30E6
+FF96	HALFWIDTH KATAKANA LETTER YO
+	# <narrow> 30E8
+FF97	HALFWIDTH KATAKANA LETTER RA
+	# <narrow> 30E9
+FF98	HALFWIDTH KATAKANA LETTER RI
+	# <narrow> 30EA
+FF99	HALFWIDTH KATAKANA LETTER RU
+	# <narrow> 30EB
+FF9A	HALFWIDTH KATAKANA LETTER RE
+	# <narrow> 30EC
+FF9B	HALFWIDTH KATAKANA LETTER RO
+	# <narrow> 30ED
+FF9C	HALFWIDTH KATAKANA LETTER WA
+	# <narrow> 30EF
+FF9D	HALFWIDTH KATAKANA LETTER N
+	# <narrow> 30F3
+FF9E	HALFWIDTH KATAKANA VOICED SOUND MARK (halfwidth katakana-hiragana voiced sound mark)
+	# <narrow> 3099
+FF9F	HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK (halfwidth katakana-hiragana semi-voiced sound mark)
+	# <narrow> 309A
+@		Halfwidth Hangul variants
+@+		See Hangul Compatibility Jamo 3130 - 318F
+FFA0	HALFWIDTH HANGUL FILLER
+	# <narrow> 3164
+FFA1	HALFWIDTH HANGUL LETTER KIYEOK
+	# <narrow> 3131
+FFA2	HALFWIDTH HANGUL LETTER SSANGKIYEOK
+	# <narrow> 3132
+FFA3	HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+	# <narrow> 3133
+FFA4	HALFWIDTH HANGUL LETTER NIEUN
+	# <narrow> 3134
+FFA5	HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+	# <narrow> 3135
+FFA6	HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+	# <narrow> 3136
+FFA7	HALFWIDTH HANGUL LETTER TIKEUT
+	# <narrow> 3137
+FFA8	HALFWIDTH HANGUL LETTER SSANGTIKEUT
+	# <narrow> 3138
+FFA9	HALFWIDTH HANGUL LETTER RIEUL
+	# <narrow> 3139
+FFAA	HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+	# <narrow> 313A
+FFAB	HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+	# <narrow> 313B
+FFAC	HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+	# <narrow> 313C
+FFAD	HALFWIDTH HANGUL LETTER RIEUL-SIOS
+	# <narrow> 313D
+FFAE	HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+	# <narrow> 313E
+FFAF	HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+	# <narrow> 313F
+FFB0	HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+	# <narrow> 3140
+FFB1	HALFWIDTH HANGUL LETTER MIEUM
+	# <narrow> 3141
+FFB2	HALFWIDTH HANGUL LETTER PIEUP
+	# <narrow> 3142
+FFB3	HALFWIDTH HANGUL LETTER SSANGPIEUP
+	# <narrow> 3143
+FFB4	HALFWIDTH HANGUL LETTER PIEUP-SIOS
+	# <narrow> 3144
+FFB5	HALFWIDTH HANGUL LETTER SIOS
+	# <narrow> 3145
+FFB6	HALFWIDTH HANGUL LETTER SSANGSIOS
+	# <narrow> 3146
+FFB7	HALFWIDTH HANGUL LETTER IEUNG
+	# <narrow> 3147
+FFB8	HALFWIDTH HANGUL LETTER CIEUC
+	# <narrow> 3148
+FFB9	HALFWIDTH HANGUL LETTER SSANGCIEUC
+	# <narrow> 3149
+FFBA	HALFWIDTH HANGUL LETTER CHIEUCH
+	# <narrow> 314A
+FFBB	HALFWIDTH HANGUL LETTER KHIEUKH
+	# <narrow> 314B
+FFBC	HALFWIDTH HANGUL LETTER THIEUTH
+	# <narrow> 314C
+FFBD	HALFWIDTH HANGUL LETTER PHIEUPH
+	# <narrow> 314D
+FFBE	HALFWIDTH HANGUL LETTER HIEUH
+	# <narrow> 314E
+FFC2	HALFWIDTH HANGUL LETTER A
+	# <narrow> 314F
+FFC3	HALFWIDTH HANGUL LETTER AE
+	# <narrow> 3150
+FFC4	HALFWIDTH HANGUL LETTER YA
+	# <narrow> 3151
+FFC5	HALFWIDTH HANGUL LETTER YAE
+	# <narrow> 3152
+FFC6	HALFWIDTH HANGUL LETTER EO
+	# <narrow> 3153
+FFC7	HALFWIDTH HANGUL LETTER E
+	# <narrow> 3154
+FFCA	HALFWIDTH HANGUL LETTER YEO
+	# <narrow> 3155
+FFCB	HALFWIDTH HANGUL LETTER YE
+	# <narrow> 3156
+FFCC	HALFWIDTH HANGUL LETTER O
+	# <narrow> 3157
+FFCD	HALFWIDTH HANGUL LETTER WA
+	# <narrow> 3158
+FFCE	HALFWIDTH HANGUL LETTER WAE
+	# <narrow> 3159
+FFCF	HALFWIDTH HANGUL LETTER OE
+	# <narrow> 315A
+FFD2	HALFWIDTH HANGUL LETTER YO
+	# <narrow> 315B
+FFD3	HALFWIDTH HANGUL LETTER U
+	# <narrow> 315C
+FFD4	HALFWIDTH HANGUL LETTER WEO
+	# <narrow> 315D
+FFD5	HALFWIDTH HANGUL LETTER WE
+	# <narrow> 315E
+FFD6	HALFWIDTH HANGUL LETTER WI
+	# <narrow> 315F
+FFD7	HALFWIDTH HANGUL LETTER YU
+	# <narrow> 3160
+FFDA	HALFWIDTH HANGUL LETTER EU
+	# <narrow> 3161
+FFDB	HALFWIDTH HANGUL LETTER YI
+	# <narrow> 3162
+FFDC	HALFWIDTH HANGUL LETTER I
+	# <narrow> 3163
+@		Fullwidth symbol variants
+@+		See Latin-1 00A0 - 00FF
+FFE0	FULLWIDTH CENT SIGN
+	# <wide> 00A2
+FFE1	FULLWIDTH POUND SIGN
+	# <wide> 00A3
+FFE2	FULLWIDTH NOT SIGN
+	# <wide> 00AC
+FFE3	FULLWIDTH MACRON *
+	* sometimes treated as fullwidth overline
+	x (overline - 203E)
+	# <wide> 00AF
+FFE4	FULLWIDTH BROKEN BAR
+	# <wide> 00A6
+FFE5	FULLWIDTH YEN SIGN
+	# <wide> 00A5
+FFE6	FULLWIDTH WON SIGN
+	# <wide> 20A9
+@		Halfwidth symbol variants
+FFE8	HALFWIDTH FORMS LIGHT VERTICAL
+	# <narrow> 2502
+FFE9	HALFWIDTH LEFTWARDS ARROW
+	# <narrow> 2190
+FFEA	HALFWIDTH UPWARDS ARROW
+	# <narrow> 2191
+FFEB	HALFWIDTH RIGHTWARDS ARROW
+	# <narrow> 2192
+FFEC	HALFWIDTH DOWNWARDS ARROW
+	# <narrow> 2193
+FFED	HALFWIDTH BLACK SQUARE
+	# <narrow> 25A0
+FFEE	HALFWIDTH WHITE CIRCLE
+	# <narrow> 25CB
+@@	FFF0	Specials	FFFF
+@		Interlinear annotation
+@+		Used internally for Japanese Ruby (furigana), etc.
+FFF9	INTERLINEAR ANNOTATION ANCHOR
+	* marks start of annotated text
+FFFA	INTERLINEAR ANNOTATION SEPARATOR
+	* marks start of annotating character(s)
+FFFB	INTERLINEAR ANNOTATION TERMINATOR
+	* marks end of annotation block
+@		Replacement characters
+FFFC	OBJECT REPLACEMENT CHARACTER
+	* used as placeholder in text for an otherwise unspecified object
+FFFD	REPLACEMENT CHARACTER
+	* used to replace an incoming character whose value is unknown or unrepresentable in Unicode
+	* compare the use of 001A as a control character to indicate the substitute function
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+FFFE	<not a character>
+	* the value FFFE is guaranteed not to be a Unicode character at all
+	* may be used to detect byte order by contrast with FEFF which is a character
+	x (zero width no-break space - FEFF)
+FFFF	<not a character>
+	* the value FFFF is guaranteed not to be a Unicode character at all
+@@	10000	Linear B Syllabary	1007F
+@		Basic syllables
+10000	LINEAR B SYLLABLE B008 A
+10001	LINEAR B SYLLABLE B038 E
+10002	LINEAR B SYLLABLE B028 I
+10003	LINEAR B SYLLABLE B061 O
+10004	LINEAR B SYLLABLE B010 U
+10005	LINEAR B SYLLABLE B001 DA
+10006	LINEAR B SYLLABLE B045 DE
+10007	LINEAR B SYLLABLE B007 DI
+10008	LINEAR B SYLLABLE B014 DO
+10009	LINEAR B SYLLABLE B051 DU
+1000A	LINEAR B SYLLABLE B057 JA
+1000B	LINEAR B SYLLABLE B046 JE
+1000D	LINEAR B SYLLABLE B036 JO
+1000E	LINEAR B SYLLABLE B065 JU
+	= ideogram B129 flour
+1000F	LINEAR B SYLLABLE B077 KA
+10010	LINEAR B SYLLABLE B044 KE
+10011	LINEAR B SYLLABLE B067 KI
+10012	LINEAR B SYLLABLE B070 KO
+10013	LINEAR B SYLLABLE B081 KU
+10014	LINEAR B SYLLABLE B080 MA
+10015	LINEAR B SYLLABLE B013 ME
+10016	LINEAR B SYLLABLE B073 MI
+10017	LINEAR B SYLLABLE B015 MO
+10018	LINEAR B SYLLABLE B023 MU
+	= ideogram B109 ox
+10019	LINEAR B SYLLABLE B006 NA
+1001A	LINEAR B SYLLABLE B024 NE
+1001B	LINEAR B SYLLABLE B030 NI
+	= ideogram B030 figs
+1001C	LINEAR B SYLLABLE B052 NO
+1001D	LINEAR B SYLLABLE B055 NU
+1001E	LINEAR B SYLLABLE B003 PA
+1001F	LINEAR B SYLLABLE B072 PE
+10020	LINEAR B SYLLABLE B039 PI
+10021	LINEAR B SYLLABLE B011 PO
+10022	LINEAR B SYLLABLE B050 PU
+10023	LINEAR B SYLLABLE B016 QA
+10024	LINEAR B SYLLABLE B078 QE
+10025	LINEAR B SYLLABLE B021 QI
+	= ideogram B106 sheep
+10026	LINEAR B SYLLABLE B032 QO
+10028	LINEAR B SYLLABLE B060 RA
+10029	LINEAR B SYLLABLE B027 RE
+1002A	LINEAR B SYLLABLE B053 RI
+1002B	LINEAR B SYLLABLE B002 RO
+1002C	LINEAR B SYLLABLE B026 RU
+1002D	LINEAR B SYLLABLE B031 SA
+	= ideogram B031 flax
+1002E	LINEAR B SYLLABLE B009 SE
+1002F	LINEAR B SYLLABLE B041 SI
+10030	LINEAR B SYLLABLE B012 SO
+10031	LINEAR B SYLLABLE B058 SU
+10032	LINEAR B SYLLABLE B059 TA
+10033	LINEAR B SYLLABLE B004 TE
+10034	LINEAR B SYLLABLE B037 TI
+10035	LINEAR B SYLLABLE B005 TO
+10036	LINEAR B SYLLABLE B069 TU
+10037	LINEAR B SYLLABLE B054 WA
+10038	LINEAR B SYLLABLE B075 WE
+10039	LINEAR B SYLLABLE B040 WI
+1003A	LINEAR B SYLLABLE B042 WO
+1003C	LINEAR B SYLLABLE B017 ZA
+1003D	LINEAR B SYLLABLE B074 ZE
+1003F	LINEAR B SYLLABLE B020 ZO
+@		Supplementary signs
+10040	LINEAR B SYLLABLE B025 A2
+10041	LINEAR B SYLLABLE B043 A3
+10042	LINEAR B SYLLABLE B085 AU
+	= ideogram B108 pig
+10043	LINEAR B SYLLABLE B071 DWE
+10044	LINEAR B SYLLABLE B090 DWO
+10045	LINEAR B SYLLABLE B048 NWA
+10046	LINEAR B SYLLABLE B029 PU2
+10047	LINEAR B SYLLABLE B062 PTE
+10048	LINEAR B SYLLABLE B076 RA2
+10049	LINEAR B SYLLABLE B033 RA3
+	= ideogram B144 saffron
+1004A	LINEAR B SYLLABLE B068 RO2
+1004B	LINEAR B SYLLABLE B066 TA2
+1004C	LINEAR B SYLLABLE B087 TWE
+1004D	LINEAR B SYLLABLE B091 TWO
+@		Symbols
+10050	LINEAR B SYMBOL B018
+10051	LINEAR B SYMBOL B019
+10052	LINEAR B SYMBOL B022
+	= ideogram B107 goat
+10053	LINEAR B SYMBOL B034
+10054	LINEAR B SYMBOL B047
+10055	LINEAR B SYMBOL B049
+10056	LINEAR B SYMBOL B056
+10057	LINEAR B SYMBOL B063
+10058	LINEAR B SYMBOL B064
+10059	LINEAR B SYMBOL B079
+1005A	LINEAR B SYMBOL B082
+1005B	LINEAR B SYMBOL B083
+1005C	LINEAR B SYMBOL B086
+1005D	LINEAR B SYMBOL B089
+@@	10080	Linear B Ideograms	100FF
+@+		Some Linear B syllables are also used as Linear B ideograms.
+	x (linear b syllable b021 qi - 10025)
+	x (linear b symbol b022 - 10052)
+	x (linear b syllable b023 mu - 10018)
+	x (linear b syllable b030 ni - 1001B)
+	x (linear b syllable b031 sa - 1002D)
+	x (linear b syllable b033 ra3 - 10049)
+	x (linear b syllable b065 ju - 1000E)
+	x (linear b syllable b085 au - 10042)
+@		People and animals
+10080	LINEAR B IDEOGRAM B100 MAN
+10081	LINEAR B IDEOGRAM B102 WOMAN
+10082	LINEAR B IDEOGRAM B104 DEER
+10083	LINEAR B IDEOGRAM B105 EQUID
+10084	LINEAR B IDEOGRAM B105F MARE
+10085	LINEAR B IDEOGRAM B105M STALLION
+10086	LINEAR B IDEOGRAM B106F EWE
+10087	LINEAR B IDEOGRAM B106M RAM
+10088	LINEAR B IDEOGRAM B107F SHE-GOAT
+10089	LINEAR B IDEOGRAM B107M HE-GOAT
+1008A	LINEAR B IDEOGRAM B108F SOW
+1008B	LINEAR B IDEOGRAM B108M BOAR
+1008C	LINEAR B IDEOGRAM B109F COW
+1008D	LINEAR B IDEOGRAM B109M BULL
+@		Cereals and plants
+1008E	LINEAR B IDEOGRAM B120 WHEAT
+1008F	LINEAR B IDEOGRAM B121 BARLEY
+10090	LINEAR B IDEOGRAM B122 OLIVE
+10091	LINEAR B IDEOGRAM B123 SPICE
+10092	LINEAR B IDEOGRAM B125 CYPERUS
+10093	LINEAR B MONOGRAM B127 KAPO
+	= fruit
+10094	LINEAR B MONOGRAM B128 KANAKO
+	= saffron
+@		Extracts
+10095	LINEAR B IDEOGRAM B130 OIL
+10096	LINEAR B IDEOGRAM B131 WINE
+10097	LINEAR B IDEOGRAM B132
+10098	LINEAR B MONOGRAM B133 AREPA
+	= ointment
+10099	LINEAR B MONOGRAM B135 MERI
+	= honey
+@		Metals
+1009A	LINEAR B IDEOGRAM B140 BRONZE
+1009B	LINEAR B IDEOGRAM B141 GOLD
+1009C	LINEAR B IDEOGRAM B142
+@		Other materials
+1009D	LINEAR B IDEOGRAM B145 WOOL
+1009E	LINEAR B IDEOGRAM B146
+1009F	LINEAR B IDEOGRAM B150
+100A0	LINEAR B IDEOGRAM B151 HORN
+100A1	LINEAR B IDEOGRAM B152
+100A2	LINEAR B IDEOGRAM B153
+100A3	LINEAR B IDEOGRAM B154
+100A4	LINEAR B MONOGRAM B156 TURO2
+	= cheese
+100A5	LINEAR B IDEOGRAM B157
+100A6	LINEAR B IDEOGRAM B158
+100A7	LINEAR B IDEOGRAM B159 CLOTH
+100A8	LINEAR B IDEOGRAM B160
+100A9	LINEAR B IDEOGRAM B161
+100AA	LINEAR B IDEOGRAM B162 GARMENT
+100AB	LINEAR B IDEOGRAM B163 ARMOUR
+100AC	LINEAR B IDEOGRAM B164
+100AD	LINEAR B IDEOGRAM B165
+100AE	LINEAR B IDEOGRAM B166
+100AF	LINEAR B IDEOGRAM B167
+100B0	LINEAR B IDEOGRAM B168
+100B1	LINEAR B IDEOGRAM B169
+100B2	LINEAR B IDEOGRAM B170
+100B3	LINEAR B IDEOGRAM B171
+100B4	LINEAR B IDEOGRAM B172
+100B5	LINEAR B IDEOGRAM B173 MONTH
+100B6	LINEAR B IDEOGRAM B174
+100B7	LINEAR B IDEOGRAM B176 TREE
+100B8	LINEAR B IDEOGRAM B177
+100B9	LINEAR B IDEOGRAM B178
+100BA	LINEAR B IDEOGRAM B179
+100BB	LINEAR B IDEOGRAM B180
+100BC	LINEAR B IDEOGRAM B181
+100BD	LINEAR B IDEOGRAM B182
+100BE	LINEAR B IDEOGRAM B183
+100BF	LINEAR B IDEOGRAM B184
+	* the shape of this ideogram is only partially known
+100C0	LINEAR B IDEOGRAM B185
+100C1	LINEAR B IDEOGRAM B189
+100C2	LINEAR B IDEOGRAM B190
+100C3	LINEAR B IDEOGRAM B191 HELMET
+100C4	LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5	LINEAR B IDEOGRAM B225 BATHTUB
+100C6	LINEAR B IDEOGRAM B230 SPEAR
+100C7	LINEAR B IDEOGRAM B231 ARROW
+100C8	LINEAR B IDEOGRAM B232
+100C9	LINEAR B IDEOGRAM B233 SWORD (pug)
+	= pugio
+100CA	LINEAR B IDEOGRAM B234
+100CB	LINEAR B IDEOGRAM B236 (gup)
+	= "gupio", inverted sword
+100CC	LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD	LINEAR B IDEOGRAM B241 CHARIOT
+100CE	LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF	LINEAR B IDEOGRAM B243 WHEEL
+100D0	LINEAR B IDEOGRAM B245
+100D1	LINEAR B IDEOGRAM B246
+100D2	LINEAR B MONOGRAM B247 DIPTE
+100D3	LINEAR B IDEOGRAM B248
+100D4	LINEAR B IDEOGRAM B249
+100D5	LINEAR B IDEOGRAM B251
+	* the shape of this ideogram is only partially known
+100D6	LINEAR B IDEOGRAM B252
+	* the shape of this ideogram is only partially known
+100D7	LINEAR B IDEOGRAM B253
+100D8	LINEAR B IDEOGRAM B254 DART
+100D9	LINEAR B IDEOGRAM B255
+100DA	LINEAR B IDEOGRAM B256
+100DB	LINEAR B IDEOGRAM B257
+100DC	LINEAR B IDEOGRAM B258
+100DD	LINEAR B IDEOGRAM B259
+@		Vessels
+100DE	LINEAR B IDEOGRAM VESSEL B155
+100DF	LINEAR B IDEOGRAM VESSEL B200
+100E0	LINEAR B IDEOGRAM VESSEL B201
+100E1	LINEAR B IDEOGRAM VESSEL B202
+100E2	LINEAR B IDEOGRAM VESSEL B203
+100E3	LINEAR B IDEOGRAM VESSEL B204
+100E4	LINEAR B IDEOGRAM VESSEL B205
+100E5	LINEAR B IDEOGRAM VESSEL B206
+100E6	LINEAR B IDEOGRAM VESSEL B207
+100E7	LINEAR B IDEOGRAM VESSEL B208
+100E8	LINEAR B IDEOGRAM VESSEL B209
+100E9	LINEAR B IDEOGRAM VESSEL B210
+100EA	LINEAR B IDEOGRAM VESSEL B211
+100EB	LINEAR B IDEOGRAM VESSEL B212
+100EC	LINEAR B IDEOGRAM VESSEL B213
+100ED	LINEAR B IDEOGRAM VESSEL B214
+100EE	LINEAR B IDEOGRAM VESSEL B215
+100EF	LINEAR B IDEOGRAM VESSEL B216
+100F0	LINEAR B IDEOGRAM VESSEL B217
+100F1	LINEAR B IDEOGRAM VESSEL B218
+100F2	LINEAR B IDEOGRAM VESSEL B219
+100F3	LINEAR B IDEOGRAM VESSEL B221
+100F4	LINEAR B IDEOGRAM VESSEL B222
+100F5	LINEAR B IDEOGRAM VESSEL B226
+100F6	LINEAR B IDEOGRAM VESSEL B227
+100F7	LINEAR B IDEOGRAM VESSEL B228
+100F8	LINEAR B IDEOGRAM VESSEL B229
+100F9	LINEAR B IDEOGRAM VESSEL B250
+100FA	LINEAR B IDEOGRAM VESSEL B305
+	* the shape of this ideogram is only partially known
+@@	10100	Aegean Numbers	1013F
+@		Punctuation
+10100	AEGEAN WORD SEPARATOR LINE
+10101	AEGEAN WORD SEPARATOR DOT
+10102	AEGEAN CHECK MARK
+@		Numbers
+10107	AEGEAN NUMBER ONE
+10108	AEGEAN NUMBER TWO
+10109	AEGEAN NUMBER THREE
+1010A	AEGEAN NUMBER FOUR
+1010B	AEGEAN NUMBER FIVE
+1010C	AEGEAN NUMBER SIX
+1010D	AEGEAN NUMBER SEVEN
+1010E	AEGEAN NUMBER EIGHT
+1010F	AEGEAN NUMBER NINE
+10110	AEGEAN NUMBER TEN
+10111	AEGEAN NUMBER TWENTY
+10112	AEGEAN NUMBER THIRTY
+10113	AEGEAN NUMBER FORTY
+10114	AEGEAN NUMBER FIFTY
+10115	AEGEAN NUMBER SIXTY
+10116	AEGEAN NUMBER SEVENTY
+10117	AEGEAN NUMBER EIGHTY
+10118	AEGEAN NUMBER NINETY
+10119	AEGEAN NUMBER ONE HUNDRED
+1011A	AEGEAN NUMBER TWO HUNDRED
+1011B	AEGEAN NUMBER THREE HUNDRED
+1011C	AEGEAN NUMBER FOUR HUNDRED
+1011D	AEGEAN NUMBER FIVE HUNDRED
+1011E	AEGEAN NUMBER SIX HUNDRED
+1011F	AEGEAN NUMBER SEVEN HUNDRED
+10120	AEGEAN NUMBER EIGHT HUNDRED
+10121	AEGEAN NUMBER NINE HUNDRED
+10122	AEGEAN NUMBER ONE THOUSAND
+10123	AEGEAN NUMBER TWO THOUSAND
+10124	AEGEAN NUMBER THREE THOUSAND
+10125	AEGEAN NUMBER FOUR THOUSAND
+10126	AEGEAN NUMBER FIVE THOUSAND
+10127	AEGEAN NUMBER SIX THOUSAND
+10128	AEGEAN NUMBER SEVEN THOUSAND
+10129	AEGEAN NUMBER EIGHT THOUSAND
+1012A	AEGEAN NUMBER NINE THOUSAND
+1012B	AEGEAN NUMBER TEN THOUSAND
+1012C	AEGEAN NUMBER TWENTY THOUSAND
+1012D	AEGEAN NUMBER THIRTY THOUSAND
+1012E	AEGEAN NUMBER FORTY THOUSAND
+1012F	AEGEAN NUMBER FIFTY THOUSAND
+10130	AEGEAN NUMBER SIXTY THOUSAND
+10131	AEGEAN NUMBER SEVENTY THOUSAND
+10132	AEGEAN NUMBER EIGHTY THOUSAND
+10133	AEGEAN NUMBER NINETY THOUSAND
+@		Measures
+10137	AEGEAN WEIGHT BASE UNIT
+10138	AEGEAN WEIGHT FIRST SUBUNIT
+10139	AEGEAN WEIGHT SECOND SUBUNIT
+1013A	AEGEAN WEIGHT THIRD SUBUNIT
+1013B	AEGEAN WEIGHT FOURTH SUBUNIT
+1013C	AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D	AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E	AEGEAN MEASURE SECOND SUBUNIT
+1013F	AEGEAN MEASURE THIRD SUBUNIT
+@@	10140	Ancient Greek Numbers	1018F
+@		Ancient Greek acrophonic numerals
+@+		These are shown as sans-serif forms because that corresponds more closely to their appearance in ancient texts.
+10140	GREEK ACROPHONIC ATTIC ONE QUARTER
+10141	GREEK ACROPHONIC ATTIC ONE HALF
+10142	GREEK ACROPHONIC ATTIC ONE DRACHMA
+10143	GREEK ACROPHONIC ATTIC FIVE
+10144	GREEK ACROPHONIC ATTIC FIFTY
+10145	GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146	GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147	GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10148	GREEK ACROPHONIC ATTIC FIVE TALENTS
+10149	GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A	GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B	GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C	GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D	GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E	GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+1014F	GREEK ACROPHONIC ATTIC FIVE STATERS
+10150	GREEK ACROPHONIC ATTIC TEN STATERS
+10151	GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152	GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153	GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154	GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155	GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156	GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157	GREEK ACROPHONIC ATTIC TEN MNAS
+10158	GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159	GREEK ACROPHONIC THESPIAN ONE
+1015A	GREEK ACROPHONIC HERMIONIAN ONE
+1015B	GREEK ACROPHONIC EPIDAUREAN TWO
+	x (two dot punctuation - 205A)
+1015C	GREEK ACROPHONIC THESPIAN TWO
+1015D	GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E	GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+	* top line is at cap height, unlike 10111
+	x (aegean number twenty - 10111)
+1015F	GREEK ACROPHONIC TROEZENIAN FIVE
+10160	GREEK ACROPHONIC TROEZENIAN TEN
+10161	GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162	GREEK ACROPHONIC HERMIONIAN TEN
+10163	GREEK ACROPHONIC MESSENIAN TEN
+10164	GREEK ACROPHONIC THESPIAN TEN
+10165	GREEK ACROPHONIC THESPIAN THIRTY
+10166	GREEK ACROPHONIC TROEZENIAN FIFTY
+10167	GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168	GREEK ACROPHONIC HERMIONIAN FIFTY
+10169	GREEK ACROPHONIC THESPIAN FIFTY
+1016A	GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B	GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C	GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D	GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E	GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F	GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170	GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171	GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172	GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10173	GREEK ACROPHONIC DELPHIC FIVE MNAS
+10174	GREEK ACROPHONIC STRATIAN FIFTY MNAS
+@		Ancient Greek papyrological numbers
+10175	GREEK ONE HALF SIGN
+10176	GREEK ONE HALF SIGN ALTERNATE FORM
+10177	GREEK TWO THIRDS SIGN
+10178	GREEK THREE QUARTERS SIGN
+10179	GREEK YEAR SIGN
+1017A	GREEK TALENT SIGN
+1017B	GREEK DRACHMA SIGN
+1017C	GREEK OBOL SIGN
+1017D	GREEK TWO OBOLS SIGN
+1017E	GREEK THREE OBOLS SIGN
+1017F	GREEK FOUR OBOLS SIGN
+10180	GREEK FIVE OBOLS SIGN
+10181	GREEK METRETES SIGN
+10182	GREEK KYATHOS BASE SIGN
+10183	GREEK LITRA SIGN
+10184	GREEK OUNKIA SIGN
+10185	GREEK XESTES SIGN
+10186	GREEK ARTABE SIGN
+10187	GREEK AROURA SIGN
+10188	GREEK GRAMMA SIGN
+10189	GREEK TRYBLION BASE SIGN
+1018A	GREEK ZERO SIGN
+@@	10300	Old Italic	1032F
+@		Letters
+10300	OLD ITALIC LETTER A
+10301	OLD ITALIC LETTER BE
+10302	OLD ITALIC LETTER KE
+10303	OLD ITALIC LETTER DE
+10304	OLD ITALIC LETTER E
+10305	OLD ITALIC LETTER VE
+10306	OLD ITALIC LETTER ZE
+10307	OLD ITALIC LETTER HE
+10308	OLD ITALIC LETTER THE
+10309	OLD ITALIC LETTER I
+1030A	OLD ITALIC LETTER KA
+1030B	OLD ITALIC LETTER EL
+1030C	OLD ITALIC LETTER EM
+1030D	OLD ITALIC LETTER EN
+1030E	OLD ITALIC LETTER ESH
+1030F	OLD ITALIC LETTER O (Faliscan)
+10310	OLD ITALIC LETTER PE
+10311	OLD ITALIC LETTER SHE
+10312	OLD ITALIC LETTER KU
+10313	OLD ITALIC LETTER ER
+10314	OLD ITALIC LETTER ES
+10315	OLD ITALIC LETTER TE
+10316	OLD ITALIC LETTER U
+10317	OLD ITALIC LETTER EKS (Faliscan)
+10318	OLD ITALIC LETTER PHE
+10319	OLD ITALIC LETTER KHE
+1031A	OLD ITALIC LETTER EF
+1031B	OLD ITALIC LETTER ERS (Umbrian)
+1031C	OLD ITALIC LETTER CHE (Umbrian)
+1031D	OLD ITALIC LETTER II (Oscan)
+1031E	OLD ITALIC LETTER UU (Oscan)
+@		Numerals
+10320	OLD ITALIC NUMERAL ONE
+10321	OLD ITALIC NUMERAL FIVE
+10322	OLD ITALIC NUMERAL TEN
+10323	OLD ITALIC NUMERAL FIFTY
+@@	10330	Gothic	1034F
+@		Letters
+10330	GOTHIC LETTER AHSA
+10331	GOTHIC LETTER BAIRKAN
+10332	GOTHIC LETTER GIBA
+10333	GOTHIC LETTER DAGS
+10334	GOTHIC LETTER AIHVUS
+10335	GOTHIC LETTER QAIRTHRA
+10336	GOTHIC LETTER IUJA
+10337	GOTHIC LETTER HAGL
+10338	GOTHIC LETTER THIUTH
+10339	GOTHIC LETTER EIS
+1033A	GOTHIC LETTER KUSMA
+1033B	GOTHIC LETTER LAGUS
+1033C	GOTHIC LETTER MANNA
+1033D	GOTHIC LETTER NAUTHS
+1033E	GOTHIC LETTER JER
+1033F	GOTHIC LETTER URUS
+10340	GOTHIC LETTER PAIRTHRA
+10341	GOTHIC LETTER NINETY
+10342	GOTHIC LETTER RAIDA
+10343	GOTHIC LETTER SAUIL
+10344	GOTHIC LETTER TEIWS
+10345	GOTHIC LETTER WINJA
+10346	GOTHIC LETTER FAIHU
+10347	GOTHIC LETTER IGGWS
+10348	GOTHIC LETTER HWAIR
+10349	GOTHIC LETTER OTHAL
+1034A	GOTHIC LETTER NINE HUNDRED
+@@	10380	Ugaritic	1039F
+@		Letters
+10380	UGARITIC LETTER ALPA
+10381	UGARITIC LETTER BETA
+10382	UGARITIC LETTER GAMLA
+10383	UGARITIC LETTER KHA
+10384	UGARITIC LETTER DELTA
+10385	UGARITIC LETTER HO
+10386	UGARITIC LETTER WO
+10387	UGARITIC LETTER ZETA
+10388	UGARITIC LETTER HOTA
+10389	UGARITIC LETTER TET
+1038A	UGARITIC LETTER YOD
+1038B	UGARITIC LETTER KAF
+1038C	UGARITIC LETTER SHIN
+1038D	UGARITIC LETTER LAMDA
+1038E	UGARITIC LETTER MEM
+1038F	UGARITIC LETTER DHAL
+10390	UGARITIC LETTER NUN
+10391	UGARITIC LETTER ZU
+10392	UGARITIC LETTER SAMKA
+10393	UGARITIC LETTER AIN
+10394	UGARITIC LETTER PU
+10395	UGARITIC LETTER SADE
+10396	UGARITIC LETTER QOPA
+10397	UGARITIC LETTER RASHA
+10398	UGARITIC LETTER THANNA
+10399	UGARITIC LETTER GHAIN
+1039A	UGARITIC LETTER TO
+1039B	UGARITIC LETTER I
+1039C	UGARITIC LETTER U
+1039D	UGARITIC LETTER SSU
+@		Punctuation
+1039F	UGARITIC WORD DIVIDER
+@@	103A0	Old Persian	103DF
+@		Independent vowels
+103A0	OLD PERSIAN SIGN A
+103A1	OLD PERSIAN SIGN I
+103A2	OLD PERSIAN SIGN U
+@		Consonants
+103A3	OLD PERSIAN SIGN KA
+103A4	OLD PERSIAN SIGN KU
+103A5	OLD PERSIAN SIGN GA
+103A6	OLD PERSIAN SIGN GU
+103A7	OLD PERSIAN SIGN XA
+103A8	OLD PERSIAN SIGN CA
+103A9	OLD PERSIAN SIGN JA
+103AA	OLD PERSIAN SIGN JI
+103AB	OLD PERSIAN SIGN TA
+103AC	OLD PERSIAN SIGN TU
+103AD	OLD PERSIAN SIGN DA
+103AE	OLD PERSIAN SIGN DI
+103AF	OLD PERSIAN SIGN DU
+103B0	OLD PERSIAN SIGN THA
+103B1	OLD PERSIAN SIGN PA
+103B2	OLD PERSIAN SIGN BA
+103B3	OLD PERSIAN SIGN FA
+103B4	OLD PERSIAN SIGN NA
+103B5	OLD PERSIAN SIGN NU
+103B6	OLD PERSIAN SIGN MA
+103B7	OLD PERSIAN SIGN MI
+103B8	OLD PERSIAN SIGN MU
+103B9	OLD PERSIAN SIGN YA
+103BA	OLD PERSIAN SIGN VA
+103BB	OLD PERSIAN SIGN VI
+103BC	OLD PERSIAN SIGN RA
+103BD	OLD PERSIAN SIGN RU
+103BE	OLD PERSIAN SIGN LA
+103BF	OLD PERSIAN SIGN SA
+103C0	OLD PERSIAN SIGN ZA
+103C1	OLD PERSIAN SIGN SHA
+103C2	OLD PERSIAN SIGN SSA
+103C3	OLD PERSIAN SIGN HA
+@		Various signs
+103C8	OLD PERSIAN SIGN AURAMAZDAA
+103C9	OLD PERSIAN SIGN AURAMAZDAA-2
+103CA	OLD PERSIAN SIGN AURAMAZDAAHA
+103CB	OLD PERSIAN SIGN XSHAAYATHIYA
+103CC	OLD PERSIAN SIGN DAHYAAUSH
+103CD	OLD PERSIAN SIGN DAHYAAUSH-2
+103CE	OLD PERSIAN SIGN BAGA
+103CF	OLD PERSIAN SIGN BUUMISH
+@		Punctuation
+103D0	OLD PERSIAN WORD DIVIDER
+@		Numbers
+103D1	OLD PERSIAN NUMBER ONE
+103D2	OLD PERSIAN NUMBER TWO
+103D3	OLD PERSIAN NUMBER TEN
+103D4	OLD PERSIAN NUMBER TWENTY
+103D5	OLD PERSIAN NUMBER HUNDRED
+@@	10400	Deseret	1044F
+@		Uppercase letters
+10400	DESERET CAPITAL LETTER LONG I
+10401	DESERET CAPITAL LETTER LONG E
+10402	DESERET CAPITAL LETTER LONG A
+10403	DESERET CAPITAL LETTER LONG AH
+10404	DESERET CAPITAL LETTER LONG O
+10405	DESERET CAPITAL LETTER LONG OO
+10406	DESERET CAPITAL LETTER SHORT I
+10407	DESERET CAPITAL LETTER SHORT E
+10408	DESERET CAPITAL LETTER SHORT A
+10409	DESERET CAPITAL LETTER SHORT AH
+1040A	DESERET CAPITAL LETTER SHORT O
+1040B	DESERET CAPITAL LETTER SHORT OO
+1040C	DESERET CAPITAL LETTER AY
+1040D	DESERET CAPITAL LETTER OW
+1040E	DESERET CAPITAL LETTER WU
+1040F	DESERET CAPITAL LETTER YEE
+10410	DESERET CAPITAL LETTER H
+10411	DESERET CAPITAL LETTER PEE
+10412	DESERET CAPITAL LETTER BEE
+10413	DESERET CAPITAL LETTER TEE
+10414	DESERET CAPITAL LETTER DEE
+10415	DESERET CAPITAL LETTER CHEE
+10416	DESERET CAPITAL LETTER JEE
+10417	DESERET CAPITAL LETTER KAY
+10418	DESERET CAPITAL LETTER GAY
+10419	DESERET CAPITAL LETTER EF
+1041A	DESERET CAPITAL LETTER VEE
+1041B	DESERET CAPITAL LETTER ETH
+1041C	DESERET CAPITAL LETTER THEE
+1041D	DESERET CAPITAL LETTER ES
+1041E	DESERET CAPITAL LETTER ZEE
+1041F	DESERET CAPITAL LETTER ESH
+10420	DESERET CAPITAL LETTER ZHEE
+10421	DESERET CAPITAL LETTER ER
+10422	DESERET CAPITAL LETTER EL
+10423	DESERET CAPITAL LETTER EM
+10424	DESERET CAPITAL LETTER EN
+10425	DESERET CAPITAL LETTER ENG
+10426	DESERET CAPITAL LETTER OI
+10427	DESERET CAPITAL LETTER EW
+@		Lowercase letters
+10428	DESERET SMALL LETTER LONG I
+10429	DESERET SMALL LETTER LONG E
+1042A	DESERET SMALL LETTER LONG A
+1042B	DESERET SMALL LETTER LONG AH
+1042C	DESERET SMALL LETTER LONG O
+1042D	DESERET SMALL LETTER LONG OO
+1042E	DESERET SMALL LETTER SHORT I
+1042F	DESERET SMALL LETTER SHORT E
+10430	DESERET SMALL LETTER SHORT A
+10431	DESERET SMALL LETTER SHORT AH
+10432	DESERET SMALL LETTER SHORT O
+10433	DESERET SMALL LETTER SHORT OO
+10434	DESERET SMALL LETTER AY
+10435	DESERET SMALL LETTER OW
+10436	DESERET SMALL LETTER WU
+10437	DESERET SMALL LETTER YEE
+10438	DESERET SMALL LETTER H
+10439	DESERET SMALL LETTER PEE
+1043A	DESERET SMALL LETTER BEE
+1043B	DESERET SMALL LETTER TEE
+1043C	DESERET SMALL LETTER DEE
+1043D	DESERET SMALL LETTER CHEE
+1043E	DESERET SMALL LETTER JEE
+1043F	DESERET SMALL LETTER KAY
+10440	DESERET SMALL LETTER GAY
+10441	DESERET SMALL LETTER EF
+10442	DESERET SMALL LETTER VEE
+10443	DESERET SMALL LETTER ETH
+10444	DESERET SMALL LETTER THEE
+10445	DESERET SMALL LETTER ES
+10446	DESERET SMALL LETTER ZEE
+10447	DESERET SMALL LETTER ESH
+10448	DESERET SMALL LETTER ZHEE
+10449	DESERET SMALL LETTER ER
+1044A	DESERET SMALL LETTER EL
+1044B	DESERET SMALL LETTER EM
+1044C	DESERET SMALL LETTER EN
+1044D	DESERET SMALL LETTER ENG
+1044E	DESERET SMALL LETTER OI
+1044F	DESERET SMALL LETTER EW
+@@	10450	Shavian	1047F
+@		Consonants
+10450	SHAVIAN LETTER PEEP
+10451	SHAVIAN LETTER TOT
+10452	SHAVIAN LETTER KICK
+10453	SHAVIAN LETTER FEE
+10454	SHAVIAN LETTER THIGH
+10455	SHAVIAN LETTER SO
+10456	SHAVIAN LETTER SURE
+10457	SHAVIAN LETTER CHURCH
+10458	SHAVIAN LETTER YEA
+10459	SHAVIAN LETTER HUNG
+1045A	SHAVIAN LETTER BIB
+1045B	SHAVIAN LETTER DEAD
+1045C	SHAVIAN LETTER GAG
+1045D	SHAVIAN LETTER VOW
+1045E	SHAVIAN LETTER THEY
+1045F	SHAVIAN LETTER ZOO
+10460	SHAVIAN LETTER MEASURE
+10461	SHAVIAN LETTER JUDGE
+10462	SHAVIAN LETTER WOE
+10463	SHAVIAN LETTER HA-HA
+10464	SHAVIAN LETTER LOLL
+10465	SHAVIAN LETTER MIME
+@		Vowels
+10466	SHAVIAN LETTER IF
+10467	SHAVIAN LETTER EGG
+10468	SHAVIAN LETTER ASH
+10469	SHAVIAN LETTER ADO
+1046A	SHAVIAN LETTER ON
+1046B	SHAVIAN LETTER WOOL
+1046C	SHAVIAN LETTER OUT
+1046D	SHAVIAN LETTER AH
+1046E	SHAVIAN LETTER ROAR
+1046F	SHAVIAN LETTER NUN
+10470	SHAVIAN LETTER EAT
+10471	SHAVIAN LETTER AGE
+10472	SHAVIAN LETTER ICE
+10473	SHAVIAN LETTER UP
+10474	SHAVIAN LETTER OAK
+10475	SHAVIAN LETTER OOZE
+10476	SHAVIAN LETTER OIL
+10477	SHAVIAN LETTER AWE
+10478	SHAVIAN LETTER ARE
+10479	SHAVIAN LETTER OR
+1047A	SHAVIAN LETTER AIR
+1047B	SHAVIAN LETTER ERR
+1047C	SHAVIAN LETTER ARRAY
+1047D	SHAVIAN LETTER EAR
+1047E	SHAVIAN LETTER IAN
+1047F	SHAVIAN LETTER YEW
+@@	10480	Osmanya	104AF
+@		Letters
+10480	OSMANYA LETTER ALEF
+10481	OSMANYA LETTER BA
+10482	OSMANYA LETTER TA
+10483	OSMANYA LETTER JA
+10484	OSMANYA LETTER XA
+10485	OSMANYA LETTER KHA
+10486	OSMANYA LETTER DEEL
+10487	OSMANYA LETTER RA
+10488	OSMANYA LETTER SA
+10489	OSMANYA LETTER SHIIN
+1048A	OSMANYA LETTER DHA
+1048B	OSMANYA LETTER CAYN
+1048C	OSMANYA LETTER GA
+1048D	OSMANYA LETTER FA
+1048E	OSMANYA LETTER QAAF
+1048F	OSMANYA LETTER KAAF
+10490	OSMANYA LETTER LAAN
+10491	OSMANYA LETTER MIIN
+10492	OSMANYA LETTER NUUN
+10493	OSMANYA LETTER WAW
+10494	OSMANYA LETTER HA
+10495	OSMANYA LETTER YA
+10496	OSMANYA LETTER A
+10497	OSMANYA LETTER E
+10498	OSMANYA LETTER I
+10499	OSMANYA LETTER O
+1049A	OSMANYA LETTER U
+1049B	OSMANYA LETTER AA
+1049C	OSMANYA LETTER EE
+1049D	OSMANYA LETTER OO
+@		Digits
+104A0	OSMANYA DIGIT ZERO
+104A1	OSMANYA DIGIT ONE
+104A2	OSMANYA DIGIT TWO
+104A3	OSMANYA DIGIT THREE
+104A4	OSMANYA DIGIT FOUR
+104A5	OSMANYA DIGIT FIVE
+104A6	OSMANYA DIGIT SIX
+104A7	OSMANYA DIGIT SEVEN
+104A8	OSMANYA DIGIT EIGHT
+104A9	OSMANYA DIGIT NINE
+@@	10800	Cypriot Syllabary	1083F
+@		Syllables
+10800	CYPRIOT SYLLABLE A
+10801	CYPRIOT SYLLABLE E
+10802	CYPRIOT SYLLABLE I
+10803	CYPRIOT SYLLABLE O
+10804	CYPRIOT SYLLABLE U
+10805	CYPRIOT SYLLABLE JA
+10808	CYPRIOT SYLLABLE JO
+1080A	CYPRIOT SYLLABLE KA
+1080B	CYPRIOT SYLLABLE KE
+1080C	CYPRIOT SYLLABLE KI
+1080D	CYPRIOT SYLLABLE KO
+1080E	CYPRIOT SYLLABLE KU
+1080F	CYPRIOT SYLLABLE LA
+10810	CYPRIOT SYLLABLE LE
+10811	CYPRIOT SYLLABLE LI
+10812	CYPRIOT SYLLABLE LO
+10813	CYPRIOT SYLLABLE LU
+10814	CYPRIOT SYLLABLE MA
+10815	CYPRIOT SYLLABLE ME
+10816	CYPRIOT SYLLABLE MI
+10817	CYPRIOT SYLLABLE MO
+10818	CYPRIOT SYLLABLE MU
+10819	CYPRIOT SYLLABLE NA
+1081A	CYPRIOT SYLLABLE NE
+1081B	CYPRIOT SYLLABLE NI
+1081C	CYPRIOT SYLLABLE NO
+1081D	CYPRIOT SYLLABLE NU
+1081E	CYPRIOT SYLLABLE PA
+1081F	CYPRIOT SYLLABLE PE
+10820	CYPRIOT SYLLABLE PI
+10821	CYPRIOT SYLLABLE PO
+10822	CYPRIOT SYLLABLE PU
+10823	CYPRIOT SYLLABLE RA
+10824	CYPRIOT SYLLABLE RE
+10825	CYPRIOT SYLLABLE RI
+10826	CYPRIOT SYLLABLE RO
+10827	CYPRIOT SYLLABLE RU
+10828	CYPRIOT SYLLABLE SA
+10829	CYPRIOT SYLLABLE SE
+1082A	CYPRIOT SYLLABLE SI
+1082B	CYPRIOT SYLLABLE SO
+1082C	CYPRIOT SYLLABLE SU
+1082D	CYPRIOT SYLLABLE TA
+1082E	CYPRIOT SYLLABLE TE
+1082F	CYPRIOT SYLLABLE TI
+10830	CYPRIOT SYLLABLE TO
+10831	CYPRIOT SYLLABLE TU
+10832	CYPRIOT SYLLABLE WA
+10833	CYPRIOT SYLLABLE WE
+10834	CYPRIOT SYLLABLE WI
+10835	CYPRIOT SYLLABLE WO
+10837	CYPRIOT SYLLABLE XA
+10838	CYPRIOT SYLLABLE XE
+1083C	CYPRIOT SYLLABLE ZA
+1083F	CYPRIOT SYLLABLE ZO
+@@	10A00	Kharoshthi	10A5F
+@		Vowels
+10A00	KHAROSHTHI LETTER A
+10A01	KHAROSHTHI VOWEL SIGN I
+10A02	KHAROSHTHI VOWEL SIGN U
+10A03	KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05	KHAROSHTHI VOWEL SIGN E
+10A06	KHAROSHTHI VOWEL SIGN O
+@		Length mark
+10A0C	KHAROSHTHI VOWEL LENGTH MARK
+@		Various signs
+10A0D	KHAROSHTHI SIGN DOUBLE RING BELOW
+10A0E	KHAROSHTHI SIGN ANUSVARA
+10A0F	KHAROSHTHI SIGN VISARGA
+@		Consonants
+10A10	KHAROSHTHI LETTER KA
+10A11	KHAROSHTHI LETTER KHA
+10A12	KHAROSHTHI LETTER GA
+10A13	KHAROSHTHI LETTER GHA
+10A15	KHAROSHTHI LETTER CA
+10A16	KHAROSHTHI LETTER CHA
+10A17	KHAROSHTHI LETTER JA
+10A19	KHAROSHTHI LETTER NYA
+10A1A	KHAROSHTHI LETTER TTA
+10A1B	KHAROSHTHI LETTER TTHA
+10A1C	KHAROSHTHI LETTER DDA
+10A1D	KHAROSHTHI LETTER DDHA
+10A1E	KHAROSHTHI LETTER NNA
+10A1F	KHAROSHTHI LETTER TA
+10A20	KHAROSHTHI LETTER THA
+10A21	KHAROSHTHI LETTER DA
+10A22	KHAROSHTHI LETTER DHA
+10A23	KHAROSHTHI LETTER NA
+10A24	KHAROSHTHI LETTER PA
+10A25	KHAROSHTHI LETTER PHA
+10A26	KHAROSHTHI LETTER BA
+10A27	KHAROSHTHI LETTER BHA
+10A28	KHAROSHTHI LETTER MA
+10A29	KHAROSHTHI LETTER YA
+10A2A	KHAROSHTHI LETTER RA
+10A2B	KHAROSHTHI LETTER LA
+10A2C	KHAROSHTHI LETTER VA
+10A2D	KHAROSHTHI LETTER SHA
+10A2E	KHAROSHTHI LETTER SSA
+10A2F	KHAROSHTHI LETTER SA
+10A30	KHAROSHTHI LETTER ZA
+10A31	KHAROSHTHI LETTER HA
+10A32	KHAROSHTHI LETTER KKA
+10A33	KHAROSHTHI LETTER TTTHA
+@		Various signs
+10A38	KHAROSHTHI SIGN BAR ABOVE
+10A39	KHAROSHTHI SIGN CAUDA
+10A3A	KHAROSHTHI SIGN DOT BELOW
+@		Virama
+10A3F	KHAROSHTHI VIRAMA
+	= halant
+	* suppresses inherent vowel
+@		Digits
+10A40	KHAROSHTHI DIGIT ONE
+10A41	KHAROSHTHI DIGIT TWO
+10A42	KHAROSHTHI DIGIT THREE
+10A43	KHAROSHTHI DIGIT FOUR
+@		Numbers
+10A44	KHAROSHTHI NUMBER TEN
+10A45	KHAROSHTHI NUMBER TWENTY
+10A46	KHAROSHTHI NUMBER ONE HUNDRED
+10A47	KHAROSHTHI NUMBER ONE THOUSAND
+@		Punctuation
+10A50	KHAROSHTHI PUNCTUATION DOT
+10A51	KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52	KHAROSHTHI PUNCTUATION CIRCLE
+10A53	KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54	KHAROSHTHI PUNCTUATION MANGALAM
+10A55	KHAROSHTHI PUNCTUATION LOTUS
+10A56	KHAROSHTHI PUNCTUATION DANDA
+10A57	KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58	KHAROSHTHI PUNCTUATION LINES
+@@	1D000	Byzantine Musical Symbols	1D0FF
+@		Prosodies (Prosodics)
+1D000	BYZANTINE MUSICAL SYMBOL PSILI
+1D001	BYZANTINE MUSICAL SYMBOL DASEIA
+1D002	BYZANTINE MUSICAL SYMBOL PERISPOMENI
+@		Ekfonetika
+1D003	BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004	BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005	BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006	BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007	BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008	BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009	BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A	BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B	BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C	BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D	BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E	BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F	BYZANTINE MUSICAL SYMBOL TELEIA
+1D010	BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011	BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012	BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013	BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014	BYZANTINE MUSICAL SYMBOL THITA
+@		Melodimata (Melodics)
+1D015	BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016	BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017	BYZANTINE MUSICAL SYMBOL PSILON
+1D018	BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019	BYZANTINE MUSICAL SYMBOL VATHY
+1D01A	BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B	BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C	BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D	BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E	BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F	BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020	BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021	BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022	BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023	BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024	BYZANTINE MUSICAL SYMBOL KLASMA
+1D025	BYZANTINE MUSICAL SYMBOL REVMA
+1D026	BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027	BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028	BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029	BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A	BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B	BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C	BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D	BYZANTINE MUSICAL SYMBOL THEMA
+1D02E	BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F	BYZANTINE MUSICAL SYMBOL DYO
+1D030	BYZANTINE MUSICAL SYMBOL TRIA
+1D031	BYZANTINE MUSICAL SYMBOL TESSERA
+1D032	BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033	BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034	BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035	BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036	BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037	BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038	BYZANTINE MUSICAL SYMBOL PELASTON
+1D039	BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A	BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B	BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C	BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D	BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E	BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F	BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040	BYZANTINE MUSICAL SYMBOL NANA
+1D041	BYZANTINE MUSICAL SYMBOL PETASMA
+1D042	BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043	BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044	BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045	BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+@		Fonitika (Vocals)
+1D046	BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047	BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048	BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049	BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A	BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B	BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C	BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D	BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E	BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F	BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050	BYZANTINE MUSICAL SYMBOL YPSILI
+1D051	BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052	BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053	BYZANTINE MUSICAL SYMBOL YPORROI
+1D054	BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055	BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056	BYZANTINE MUSICAL SYMBOL CHAMILI
+@		Afona or Ypostaseis (Mutes or Hypostases)
+1D057	BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058	BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059	BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A	BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B	BYZANTINE MUSICAL SYMBOL OMALON
+1D05C	BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D	BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E	BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F	BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060	BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061	BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062	BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063	BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064	BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065	BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066	BYZANTINE MUSICAL SYMBOL SYRMA
+1D067	BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068	BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069	BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A	BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B	BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C	BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D	BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E	BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F	BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070	BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071	BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072	BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073	BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074	BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075	BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076	BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077	BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078	BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079	BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A	BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B	BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C	BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D	BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E	BYZANTINE MUSICAL SYMBOL STAVROS
+@		Argies (Retards)
+1D07F	BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080	BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081	BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082	BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083	BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084	BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085	BYZANTINE MUSICAL SYMBOL APLI
+1D086	BYZANTINE MUSICAL SYMBOL DIPLI
+1D087	BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088	BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089	BYZANTINE MUSICAL SYMBOL KORONIS
+@		Leimmata or Siopes (Leimmas or Silencers)
+1D08A	BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B	BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C	BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D	BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E	BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+@		Synagmata or Gorgotites (Synagmas or Quickeners)
+1D08F	BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090	BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091	BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092	BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093	BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094	BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095	BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096	BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097	BYZANTINE MUSICAL SYMBOL ARGON
+1D098	BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099	BYZANTINE MUSICAL SYMBOL DIARGON
+@		Agogika (Conduits)
+1D09A	BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B	BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C	BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D	BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E	BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F	BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0	BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1	BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+@		Ichimata and Martyrika (Ichimas and Evidentials)
+1D0A2	BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3	BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4	BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5	BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6	BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7	BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8	BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9	BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA	BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB	BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC	BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD	BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE	BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF	BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0	BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1	BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2	BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3	BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4	BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+@		Fthores (Destroyers)
+1D0B5	BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6	BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7	BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8	BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9	BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA	BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB	BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC	BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD	BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE	BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF	BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0	BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1	BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2	BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3	BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4	BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5	BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+	* misspelling of "FTHORA" in character name is a known defect
+1D0C6	BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7	BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8	BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9	BYZANTINE MUSICAL SYMBOL CHROA KLITON
+@		Alloioseis (Differentiators)
+1D0CA	BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB	BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC	BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD	BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE	BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF	BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0	BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1	BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2	BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3	BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4	BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5	BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6	BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7	BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8	BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+@		Rythmika (Rhythmics)
+1D0D9	BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA	BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB	BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC	BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD	BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE	BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF	BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0	BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1	BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2	BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3	BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4	BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+@		Grammata (Letters)
+1D0E5	BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6	BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7	BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8	BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9	BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA	BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB	BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC	BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED	BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE	BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF	BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+@		Specials
+1D0F0	BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1	BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2	BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3	BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4	BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5	BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+@@	1D100	Musical Symbols	1D1FF
+@		Bars
+1D100	MUSICAL SYMBOL SINGLE BARLINE
+1D101	MUSICAL SYMBOL DOUBLE BARLINE
+1D102	MUSICAL SYMBOL FINAL BARLINE
+1D103	MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104	MUSICAL SYMBOL DASHED BARLINE
+1D105	MUSICAL SYMBOL SHORT BARLINE
+@		Codas
+1D106	MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107	MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108	MUSICAL SYMBOL REPEAT DOTS
+1D109	MUSICAL SYMBOL DAL SEGNO
+1D10A	MUSICAL SYMBOL DA CAPO
+1D10B	MUSICAL SYMBOL SEGNO
+1D10C	MUSICAL SYMBOL CODA
+@		Figure repetitions
+1D10D	MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E	MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F	MUSICAL SYMBOL REPEATED FIGURE-3
+@		Holds and pauses
+1D110	MUSICAL SYMBOL FERMATA
+1D111	MUSICAL SYMBOL FERMATA BELOW
+1D112	MUSICAL SYMBOL BREATH MARK
+1D113	MUSICAL SYMBOL CAESURA
+@		Staff brackets
+1D114	MUSICAL SYMBOL BRACE
+1D115	MUSICAL SYMBOL BRACKET
+@		Staves
+1D116	MUSICAL SYMBOL ONE-LINE STAFF
+1D117	MUSICAL SYMBOL TWO-LINE STAFF
+1D118	MUSICAL SYMBOL THREE-LINE STAFF
+1D119	MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A	MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B	MUSICAL SYMBOL SIX-LINE STAFF
+@		Tablature
+1D11C	MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D	MUSICAL SYMBOL FOUR-STRING FRETBOARD
+@		Clefs
+1D11E	MUSICAL SYMBOL G CLEF
+1D11F	MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120	MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121	MUSICAL SYMBOL C CLEF
+1D122	MUSICAL SYMBOL F CLEF
+1D123	MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124	MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125	MUSICAL SYMBOL DRUM CLEF-1
+1D126	MUSICAL SYMBOL DRUM CLEF-2
+@		Accidentals
+1D127	<reserved>
+	x (music flat sign - 266D)
+1D128	<reserved>
+	x (music natural sign - 266E)
+1D129	<reserved>
+	x (music sharp sign - 266F)
+1D12A	MUSICAL SYMBOL DOUBLE SHARP
+1D12B	MUSICAL SYMBOL DOUBLE FLAT
+1D12C	MUSICAL SYMBOL FLAT UP
+1D12D	MUSICAL SYMBOL FLAT DOWN
+1D12E	MUSICAL SYMBOL NATURAL UP
+1D12F	MUSICAL SYMBOL NATURAL DOWN
+1D130	MUSICAL SYMBOL SHARP UP
+1D131	MUSICAL SYMBOL SHARP DOWN
+1D132	MUSICAL SYMBOL QUARTER TONE SHARP
+1D133	MUSICAL SYMBOL QUARTER TONE FLAT
+@		Time signatures
+1D134	MUSICAL SYMBOL COMMON TIME
+1D135	MUSICAL SYMBOL CUT TIME
+@		Octaves
+1D136	MUSICAL SYMBOL OTTAVA ALTA
+1D137	MUSICAL SYMBOL OTTAVA BASSA
+1D138	MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139	MUSICAL SYMBOL QUINDICESIMA BASSA
+@		Rests
+1D13A	MUSICAL SYMBOL MULTI REST
+1D13B	MUSICAL SYMBOL WHOLE REST
+1D13C	MUSICAL SYMBOL HALF REST
+1D13D	MUSICAL SYMBOL QUARTER REST
+1D13E	MUSICAL SYMBOL EIGHTH REST
+1D13F	MUSICAL SYMBOL SIXTEENTH REST
+1D140	MUSICAL SYMBOL THIRTY-SECOND REST
+1D141	MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142	MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+@		Noteheads
+1D143	MUSICAL SYMBOL X NOTEHEAD
+1D144	MUSICAL SYMBOL PLUS NOTEHEAD
+1D145	MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146	MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147	MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148	MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149	MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A	MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B	MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C	MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D	MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E	MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F	MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150	MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151	MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152	MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153	MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154	MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155	MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156	MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157	MUSICAL SYMBOL VOID NOTEHEAD
+1D158	MUSICAL SYMBOL NOTEHEAD BLACK
+1D159	MUSICAL SYMBOL NULL NOTEHEAD
+1D15A	MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B	MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+@		Notes
+1D15C	MUSICAL SYMBOL BREVE
+1D15D	MUSICAL SYMBOL WHOLE NOTE
+1D15E	MUSICAL SYMBOL HALF NOTE
+	: 1D157 1D165
+1D15F	MUSICAL SYMBOL QUARTER NOTE
+	: 1D158 1D165
+1D160	MUSICAL SYMBOL EIGHTH NOTE
+	: 1D15F 1D16E
+1D161	MUSICAL SYMBOL SIXTEENTH NOTE
+	: 1D15F 1D16F
+1D162	MUSICAL SYMBOL THIRTY-SECOND NOTE
+	: 1D15F 1D170
+1D163	MUSICAL SYMBOL SIXTY-FOURTH NOTE
+	: 1D15F 1D171
+1D164	MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+	: 1D15F 1D172
+@		Stems
+1D165	MUSICAL SYMBOL COMBINING STEM
+1D166	MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+@		Tremolos
+1D167	MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168	MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169	MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A	MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B	MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C	MUSICAL SYMBOL FINGERED TREMOLO-3
+@		Augmentation dot
+1D16D	MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+@		Flags
+1D16E	MUSICAL SYMBOL COMBINING FLAG-1
+1D16F	MUSICAL SYMBOL COMBINING FLAG-2
+1D170	MUSICAL SYMBOL COMBINING FLAG-3
+1D171	MUSICAL SYMBOL COMBINING FLAG-4
+1D172	MUSICAL SYMBOL COMBINING FLAG-5
+@		Beams and slurs
+1D173	MUSICAL SYMBOL BEGIN BEAM
+1D174	MUSICAL SYMBOL END BEAM
+1D175	MUSICAL SYMBOL BEGIN TIE
+1D176	MUSICAL SYMBOL END TIE
+1D177	MUSICAL SYMBOL BEGIN SLUR
+1D178	MUSICAL SYMBOL END SLUR
+1D179	MUSICAL SYMBOL BEGIN PHRASE
+1D17A	MUSICAL SYMBOL END PHRASE
+@		Articulation
+1D17B	MUSICAL SYMBOL COMBINING ACCENT
+1D17C	MUSICAL SYMBOL COMBINING STACCATO
+1D17D	MUSICAL SYMBOL COMBINING TENUTO
+1D17E	MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F	MUSICAL SYMBOL COMBINING MARCATO
+1D180	MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181	MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182	MUSICAL SYMBOL COMBINING LOURE
+1D183	MUSICAL SYMBOL ARPEGGIATO UP
+1D184	MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185	MUSICAL SYMBOL COMBINING DOIT
+1D186	MUSICAL SYMBOL COMBINING RIP
+1D187	MUSICAL SYMBOL COMBINING FLIP
+1D188	MUSICAL SYMBOL COMBINING SMEAR
+1D189	MUSICAL SYMBOL COMBINING BEND
+1D18A	MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B	MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C	MUSICAL SYMBOL RINFORZANDO
+1D18D	MUSICAL SYMBOL SUBITO
+1D18E	MUSICAL SYMBOL Z
+@		Dynamics
+1D18F	MUSICAL SYMBOL PIANO
+1D190	MUSICAL SYMBOL MEZZO
+1D191	MUSICAL SYMBOL FORTE
+1D192	MUSICAL SYMBOL CRESCENDO
+1D193	MUSICAL SYMBOL DECRESCENDO
+@		Ornaments
+1D194	MUSICAL SYMBOL GRACE NOTE SLASH
+1D195	MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196	MUSICAL SYMBOL TR
+1D197	MUSICAL SYMBOL TURN
+1D198	MUSICAL SYMBOL INVERTED TURN
+1D199	MUSICAL SYMBOL TURN SLASH
+1D19A	MUSICAL SYMBOL TURN UP
+1D19B	MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C	MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D	MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E	MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F	MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0	MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1	MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2	MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3	MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4	MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5	MUSICAL SYMBOL ORNAMENT STROKE-11
+@		Analytics
+1D1A6	MUSICAL SYMBOL HAUPTSTIMME
+1D1A7	MUSICAL SYMBOL NEBENSTIMME
+1D1A8	MUSICAL SYMBOL END OF STIMME
+1D1A9	MUSICAL SYMBOL DEGREE SLASH
+@		Instrumentation
+1D1AA	MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB	MUSICAL SYMBOL COMBINING UP BOW
+1D1AC	MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD	MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+@		Pedals
+1D1AE	MUSICAL SYMBOL PEDAL MARK
+1D1AF	MUSICAL SYMBOL PEDAL UP MARK
+1D1B0	MUSICAL SYMBOL HALF PEDAL MARK
+@		Miscellaneous symbols
+1D1B1	MUSICAL SYMBOL GLISSANDO UP
+1D1B2	MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3	MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4	MUSICAL SYMBOL DAMP
+1D1B5	MUSICAL SYMBOL DAMP ALL
+@		Mensural notation
+1D1B6	MUSICAL SYMBOL MAXIMA
+1D1B7	MUSICAL SYMBOL LONGA
+1D1B8	MUSICAL SYMBOL BREVIS
+1D1B9	MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA	MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB	MUSICAL SYMBOL MINIMA
+	: 1D1B9 1D165
+1D1BC	MUSICAL SYMBOL MINIMA BLACK
+	: 1D1BA 1D165
+1D1BD	MUSICAL SYMBOL SEMIMINIMA WHITE
+	: 1D1BB 1D16E
+1D1BE	MUSICAL SYMBOL SEMIMINIMA BLACK
+	: 1D1BC 1D16E
+1D1BF	MUSICAL SYMBOL FUSA WHITE
+	: 1D1BB 1D16F
+1D1C0	MUSICAL SYMBOL FUSA BLACK
+	: 1D1BC 1D16F
+@		Mensural rests
+1D1C1	MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2	MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3	MUSICAL SYMBOL BREVIS REST
+1D1C4	MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5	MUSICAL SYMBOL MINIMA REST
+1D1C6	MUSICAL SYMBOL SEMIMINIMA REST
+@		Mensural prolations
+1D1C7	MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8	MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9	MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA	MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB	MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC	MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD	MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE	MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+@		Miscellaneous symbol
+1D1CF	MUSICAL SYMBOL CROIX
+@		Gregorian notation
+1D1D0	MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1	MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2	MUSICAL SYMBOL SQUARE B
+1D1D3	MUSICAL SYMBOL VIRGA
+1D1D4	MUSICAL SYMBOL PODATUS
+1D1D5	MUSICAL SYMBOL CLIVIS
+1D1D6	MUSICAL SYMBOL SCANDICUS
+1D1D7	MUSICAL SYMBOL CLIMACUS
+1D1D8	MUSICAL SYMBOL TORCULUS
+1D1D9	MUSICAL SYMBOL PORRECTUS
+1D1DA	MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB	MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC	MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD	MUSICAL SYMBOL PES SUBPUNCTIS
+@@	1D200	Ancient Greek Musical Notation	1D24F
+@		Ancient Greek vocalic notation
+@+		In a few instances vocalic and instrumental symbols have been unified with each other. In other instances they have been unified with regular Greek letters.
+1D200	GREEK VOCAL NOTATION SYMBOL-1
+	* vocal E
+1D201	GREEK VOCAL NOTATION SYMBOL-2
+	* vocal first sharp of E
+1D202	GREEK VOCAL NOTATION SYMBOL-3
+	= Greek instrumental notation symbol-3
+	* vocal or instrumental second sharp of E
+1D203	GREEK VOCAL NOTATION SYMBOL-4
+	* vocal F
+1D204	GREEK VOCAL NOTATION SYMBOL-5
+	* vocal first sharp of F
+1D205	GREEK VOCAL NOTATION SYMBOL-6
+	= Greek instrumental notation symbol-21
+	* vocal second sharp of F
+	* instrumental second sharp of d
+1D206	GREEK VOCAL NOTATION SYMBOL-7
+	= Greek instrumental notation symbol-9
+	* vocal G
+	* instrumental second sharp of G
+1D207	GREEK VOCAL NOTATION SYMBOL-8
+	* vocal first sharp of G
+1D208	GREEK VOCAL NOTATION SYMBOL-9
+	= Greek instrumental notation symbol-44
+	* vocal second sharp of G
+	* instrumental first sharp of eŽ
+1D209	GREEK VOCAL NOTATION SYMBOL-10
+	* vocal A
+	* this is a modification of 039F and is therefore not the same as 03D8
+1D20A	GREEK VOCAL NOTATION SYMBOL-11
+	* vocal first sharp of A
+1D20B	GREEK VOCAL NOTATION SYMBOL-12
+	* vocal second sharp of A
+1D20C	GREEK VOCAL NOTATION SYMBOL-13
+	* vocal B
+1D20D	GREEK VOCAL NOTATION SYMBOL-14
+	= Greek instrumental notation symbol-41
+	* vocal first sharp of B
+	* instrumental first sharp of dŽ
+	x (latin capital letter v - 0056)
+1D20E	GREEK VOCAL NOTATION SYMBOL-15
+	= Greek instrumental notation symbol-35
+	* vocal second sharp of B
+	* instrumental first sharp of b
+1D20F	GREEK VOCAL NOTATION SYMBOL-16
+	* vocal c
+	* unlike 1D23B this character has a glyph variant that looks like a horizontal line
+1D210	GREEK VOCAL NOTATION SYMBOL-17
+	* vocal first sharp of c
+1D211	GREEK VOCAL NOTATION SYMBOL-18
+	= Greek instrumental notation symbol-15
+	* vocal second sharp of c
+	* instrumental second sharp of B
+1D212	GREEK VOCAL NOTATION SYMBOL-19
+	* vocal d
+1D213	GREEK VOCAL NOTATION SYMBOL-20
+	= Greek instrumental notation symbol-28
+	* vocal first sharp of d
+	* instrumental g
+	* this is a modification of 0395 and is therefore not the same as 0046
+1D214	GREEK VOCAL NOTATION SYMBOL-21
+	* vocal second sharp of d
+1D215	GREEK VOCAL NOTATION SYMBOL-22
+	* vocal e
+1D216	GREEK VOCAL NOTATION SYMBOL-23
+	* vocal first sharp of e
+	* this is a modification of 0392 and is therefore not the same as 0052
+1D217	GREEK VOCAL NOTATION SYMBOL-24
+	* vocal second sharp of e
+1D218	GREEK VOCAL NOTATION SYMBOL-50
+	* vocal first sharp of gŽ
+1D219	GREEK VOCAL NOTATION SYMBOL-51
+	* vocal second sharp of gŽ
+1D21A	GREEK VOCAL NOTATION SYMBOL-52
+	* vocal aŽ
+1D21B	GREEK VOCAL NOTATION SYMBOL-53
+	* vocal first sharp of aŽ
+1D21C	GREEK VOCAL NOTATION SYMBOL-54
+	= Greek instrumental notation symbol-20
+	* vocal second sharp of aŽ
+	* instrumental first sharp of d
+@		Ancient Greek instrumental notation
+1D21D	GREEK INSTRUMENTAL NOTATION SYMBOL-1
+	* instrumental E
+1D21E	GREEK INSTRUMENTAL NOTATION SYMBOL-2
+	* instrumental first sharp of e
+1D21F	GREEK INSTRUMENTAL NOTATION SYMBOL-4
+	* instrumental F
+1D220	GREEK INSTRUMENTAL NOTATION SYMBOL-5
+	* instrumental first sharp of F
+1D221	GREEK INSTRUMENTAL NOTATION SYMBOL-7
+	* instrumental G
+1D222	GREEK INSTRUMENTAL NOTATION SYMBOL-8
+	* instrumental first sharp of G
+1D223	GREEK INSTRUMENTAL NOTATION SYMBOL-11
+	* instrumental first sharp of A
+1D224	GREEK INSTRUMENTAL NOTATION SYMBOL-12
+	* instrumental second sharp of A
+1D225	GREEK INSTRUMENTAL NOTATION SYMBOL-13
+	* instrumental B
+1D226	GREEK INSTRUMENTAL NOTATION SYMBOL-14
+	* instrumental first sharp of B
+1D227	GREEK INSTRUMENTAL NOTATION SYMBOL-17
+	* instrumental first sharp of c
+1D228	GREEK INSTRUMENTAL NOTATION SYMBOL-18
+	* instrumental second sharp of c
+1D229	GREEK INSTRUMENTAL NOTATION SYMBOL-19
+	* instrumental d
+1D22A	GREEK INSTRUMENTAL NOTATION SYMBOL-23
+	* instrumental first sharp of e
+1D22B	GREEK INSTRUMENTAL NOTATION SYMBOL-24
+	* instrumental second sharp of e
+1D22C	GREEK INSTRUMENTAL NOTATION SYMBOL-25
+	* instrumental f
+1D22D	GREEK INSTRUMENTAL NOTATION SYMBOL-26
+	* instrumental first sharp of f
+1D22E	GREEK INSTRUMENTAL NOTATION SYMBOL-27
+	* instrumental second sharp of f
+1D22F	GREEK INSTRUMENTAL NOTATION SYMBOL-29
+	* instrumental first sharp of g
+1D230	GREEK INSTRUMENTAL NOTATION SYMBOL-30
+	* instrumental second sharp of g
+1D231	GREEK INSTRUMENTAL NOTATION SYMBOL-32
+	* instrumental first sharp of a
+1D232	GREEK INSTRUMENTAL NOTATION SYMBOL-36
+	* instrumental second sharp of b
+1D233	GREEK INSTRUMENTAL NOTATION SYMBOL-37
+	* instrumental cŽ
+1D234	GREEK INSTRUMENTAL NOTATION SYMBOL-38
+	* instrumental first sharp of cŽ
+1D235	GREEK INSTRUMENTAL NOTATION SYMBOL-39
+	* instrumental second sharp of cŽ
+1D236	GREEK INSTRUMENTAL NOTATION SYMBOL-40
+	* instrumental dŽ
+1D237	GREEK INSTRUMENTAL NOTATION SYMBOL-42
+	* instrumental second sharp of dŽ
+1D238	GREEK INSTRUMENTAL NOTATION SYMBOL-43
+	* instrumental eŽ
+1D239	GREEK INSTRUMENTAL NOTATION SYMBOL-45
+	* instrumental second sharp of eŽ
+1D23A	GREEK INSTRUMENTAL NOTATION SYMBOL-47
+	* instrumental first sharp of fŽ
+	* similar but not identical to 002F
+1D23B	GREEK INSTRUMENTAL NOTATION SYMBOL-48
+	* instrumental second sharp of fŽ
+	* similar but not identical to 005C
+1D23C	GREEK INSTRUMENTAL NOTATION SYMBOL-49
+	* instrumental gŽ
+1D23D	GREEK INSTRUMENTAL NOTATION SYMBOL-50
+	* instrumental first sharp of gŽ
+1D23E	GREEK INSTRUMENTAL NOTATION SYMBOL-51
+	* instrumental second sharp of gŽ
+1D23F	GREEK INSTRUMENTAL NOTATION SYMBOL-52
+	* instrumental aŽ
+1D240	GREEK INSTRUMENTAL NOTATION SYMBOL-53
+	* instrumental first sharp of aŽ
+1D241	GREEK INSTRUMENTAL NOTATION SYMBOL-54
+	* instrumental second sharp of aŽ
+@		Further Greek musical notation symbols
+1D242	COMBINING GREEK MUSICAL TRISEME
+	x (metrical triseme - 23D7)
+1D243	COMBINING GREEK MUSICAL TETRASEME
+	x (metrical tetraseme - 23D8)
+1D244	COMBINING GREEK MUSICAL PENTASEME
+	x (metrical pentaseme - 23D9)
+1D245	GREEK MUSICAL LEIMMA
+@@	1D300	Tai Xuan Jing Symbols	1D35F
+@		Monogram
+1D300	MONOGRAM FOR EARTH
+@		Digrams
+1D301	DIGRAM FOR HEAVENLY EARTH
+1D302	DIGRAM FOR HUMAN EARTH
+1D303	DIGRAM FOR EARTHLY HEAVEN
+1D304	DIGRAM FOR EARTHLY HUMAN
+1D305	DIGRAM FOR EARTH
+@		Tetragrams
+1D306	TETRAGRAM FOR CENTRE
+1D307	TETRAGRAM FOR FULL CIRCLE
+1D308	TETRAGRAM FOR MIRED
+1D309	TETRAGRAM FOR BARRIER
+1D30A	TETRAGRAM FOR KEEPING SMALL
+1D30B	TETRAGRAM FOR CONTRARIETY
+1D30C	TETRAGRAM FOR ASCENT
+1D30D	TETRAGRAM FOR OPPOSITION
+1D30E	TETRAGRAM FOR BRANCHING OUT
+1D30F	TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310	TETRAGRAM FOR DIVERGENCE
+1D311	TETRAGRAM FOR YOUTHFULNESS
+1D312	TETRAGRAM FOR INCREASE
+1D313	TETRAGRAM FOR PENETRATION
+1D314	TETRAGRAM FOR REACH
+1D315	TETRAGRAM FOR CONTACT
+1D316	TETRAGRAM FOR HOLDING BACK
+1D317	TETRAGRAM FOR WAITING
+1D318	TETRAGRAM FOR FOLLOWING
+1D319	TETRAGRAM FOR ADVANCE
+1D31A	TETRAGRAM FOR RELEASE
+1D31B	TETRAGRAM FOR RESISTANCE
+1D31C	TETRAGRAM FOR EASE
+1D31D	TETRAGRAM FOR JOY
+1D31E	TETRAGRAM FOR CONTENTION
+1D31F	TETRAGRAM FOR ENDEAVOUR
+1D320	TETRAGRAM FOR DUTIES
+1D321	TETRAGRAM FOR CHANGE
+1D322	TETRAGRAM FOR DECISIVENESS
+1D323	TETRAGRAM FOR BOLD RESOLUTION
+1D324	TETRAGRAM FOR PACKING
+1D325	TETRAGRAM FOR LEGION
+1D326	TETRAGRAM FOR CLOSENESS
+1D327	TETRAGRAM FOR KINSHIP
+1D328	TETRAGRAM FOR GATHERING
+1D329	TETRAGRAM FOR STRENGTH
+1D32A	TETRAGRAM FOR PURITY
+1D32B	TETRAGRAM FOR FULLNESS
+1D32C	TETRAGRAM FOR RESIDENCE
+1D32D	TETRAGRAM FOR LAW OR MODEL
+1D32E	TETRAGRAM FOR RESPONSE
+1D32F	TETRAGRAM FOR GOING TO MEET
+1D330	TETRAGRAM FOR ENCOUNTERS
+1D331	TETRAGRAM FOR STOVE
+1D332	TETRAGRAM FOR GREATNESS
+1D333	TETRAGRAM FOR ENLARGEMENT
+1D334	TETRAGRAM FOR PATTERN
+1D335	TETRAGRAM FOR RITUAL
+1D336	TETRAGRAM FOR FLIGHT
+1D337	TETRAGRAM FOR VASTNESS OR WASTING
+1D338	TETRAGRAM FOR CONSTANCY
+1D339	TETRAGRAM FOR MEASURE
+1D33A	TETRAGRAM FOR ETERNITY
+1D33B	TETRAGRAM FOR UNITY
+1D33C	TETRAGRAM FOR DIMINISHMENT
+1D33D	TETRAGRAM FOR CLOSED MOUTH
+1D33E	TETRAGRAM FOR GUARDEDNESS
+1D33F	TETRAGRAM FOR GATHERING IN
+1D340	TETRAGRAM FOR MASSING
+1D341	TETRAGRAM FOR ACCUMULATION
+1D342	TETRAGRAM FOR EMBELLISHMENT
+1D343	TETRAGRAM FOR DOUBT
+1D344	TETRAGRAM FOR WATCH
+1D345	TETRAGRAM FOR SINKING
+1D346	TETRAGRAM FOR INNER
+1D347	TETRAGRAM FOR DEPARTURE
+1D348	TETRAGRAM FOR DARKENING
+1D349	TETRAGRAM FOR DIMMING
+1D34A	TETRAGRAM FOR EXHAUSTION
+1D34B	TETRAGRAM FOR SEVERANCE
+1D34C	TETRAGRAM FOR STOPPAGE
+1D34D	TETRAGRAM FOR HARDNESS
+1D34E	TETRAGRAM FOR COMPLETION
+1D34F	TETRAGRAM FOR CLOSURE
+1D350	TETRAGRAM FOR FAILURE
+1D351	TETRAGRAM FOR AGGRAVATION
+1D352	TETRAGRAM FOR COMPLIANCE
+1D353	TETRAGRAM FOR ON THE VERGE
+1D354	TETRAGRAM FOR DIFFICULTIES
+1D355	TETRAGRAM FOR LABOURING
+1D356	TETRAGRAM FOR FOSTERING
+@@	1D400	Mathematical Alphanumeric Symbols	1D7FF
+@+		To be used for mathematical variables where style variations are important semantically. For general text, use standard Latin and Greek letters with markup.
+@		Bold symbols
+1D400	MATHEMATICAL BOLD CAPITAL A
+	# <font> 0041 latin capital letter a
+1D401	MATHEMATICAL BOLD CAPITAL B
+	# <font> 0042 latin capital letter b
+1D402	MATHEMATICAL BOLD CAPITAL C
+	# <font> 0043 latin capital letter c
+1D403	MATHEMATICAL BOLD CAPITAL D
+	# <font> 0044 latin capital letter d
+1D404	MATHEMATICAL BOLD CAPITAL E
+	# <font> 0045 latin capital letter e
+1D405	MATHEMATICAL BOLD CAPITAL F
+	# <font> 0046 latin capital letter f
+1D406	MATHEMATICAL BOLD CAPITAL G
+	# <font> 0047 latin capital letter g
+1D407	MATHEMATICAL BOLD CAPITAL H
+	# <font> 0048 latin capital letter h
+1D408	MATHEMATICAL BOLD CAPITAL I
+	# <font> 0049 latin capital letter i
+1D409	MATHEMATICAL BOLD CAPITAL J
+	# <font> 004A latin capital letter j
+1D40A	MATHEMATICAL BOLD CAPITAL K
+	# <font> 004B latin capital letter k
+1D40B	MATHEMATICAL BOLD CAPITAL L
+	# <font> 004C latin capital letter l
+1D40C	MATHEMATICAL BOLD CAPITAL M
+	# <font> 004D latin capital letter m
+1D40D	MATHEMATICAL BOLD CAPITAL N
+	# <font> 004E latin capital letter n
+1D40E	MATHEMATICAL BOLD CAPITAL O
+	# <font> 004F latin capital letter o
+1D40F	MATHEMATICAL BOLD CAPITAL P
+	# <font> 0050 latin capital letter p
+1D410	MATHEMATICAL BOLD CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D411	MATHEMATICAL BOLD CAPITAL R
+	# <font> 0052 latin capital letter r
+1D412	MATHEMATICAL BOLD CAPITAL S
+	# <font> 0053 latin capital letter s
+1D413	MATHEMATICAL BOLD CAPITAL T
+	# <font> 0054 latin capital letter t
+1D414	MATHEMATICAL BOLD CAPITAL U
+	# <font> 0055 latin capital letter u
+1D415	MATHEMATICAL BOLD CAPITAL V
+	# <font> 0056 latin capital letter v
+1D416	MATHEMATICAL BOLD CAPITAL W
+	# <font> 0057 latin capital letter w
+1D417	MATHEMATICAL BOLD CAPITAL X
+	# <font> 0058 latin capital letter x
+1D418	MATHEMATICAL BOLD CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D419	MATHEMATICAL BOLD CAPITAL Z
+	# <font> 005A latin capital letter z
+1D41A	MATHEMATICAL BOLD SMALL A
+	# <font> 0061 latin small letter a
+1D41B	MATHEMATICAL BOLD SMALL B
+	# <font> 0062 latin small letter b
+1D41C	MATHEMATICAL BOLD SMALL C
+	# <font> 0063 latin small letter c
+1D41D	MATHEMATICAL BOLD SMALL D
+	# <font> 0064 latin small letter d
+1D41E	MATHEMATICAL BOLD SMALL E
+	# <font> 0065 latin small letter e
+1D41F	MATHEMATICAL BOLD SMALL F
+	# <font> 0066 latin small letter f
+1D420	MATHEMATICAL BOLD SMALL G
+	# <font> 0067 latin small letter g
+1D421	MATHEMATICAL BOLD SMALL H
+	# <font> 0068 latin small letter h
+1D422	MATHEMATICAL BOLD SMALL I
+	# <font> 0069 latin small letter i
+1D423	MATHEMATICAL BOLD SMALL J
+	# <font> 006A latin small letter j
+1D424	MATHEMATICAL BOLD SMALL K
+	# <font> 006B latin small letter k
+1D425	MATHEMATICAL BOLD SMALL L
+	# <font> 006C latin small letter l
+1D426	MATHEMATICAL BOLD SMALL M
+	# <font> 006D latin small letter m
+1D427	MATHEMATICAL BOLD SMALL N
+	# <font> 006E latin small letter n
+1D428	MATHEMATICAL BOLD SMALL O
+	# <font> 006F latin small letter o
+1D429	MATHEMATICAL BOLD SMALL P
+	# <font> 0070 latin small letter p
+1D42A	MATHEMATICAL BOLD SMALL Q
+	# <font> 0071 latin small letter q
+1D42B	MATHEMATICAL BOLD SMALL R
+	# <font> 0072 latin small letter r
+1D42C	MATHEMATICAL BOLD SMALL S
+	# <font> 0073 latin small letter s
+1D42D	MATHEMATICAL BOLD SMALL T
+	# <font> 0074 latin small letter t
+1D42E	MATHEMATICAL BOLD SMALL U
+	# <font> 0075 latin small letter u
+1D42F	MATHEMATICAL BOLD SMALL V
+	# <font> 0076 latin small letter v
+1D430	MATHEMATICAL BOLD SMALL W
+	# <font> 0077 latin small letter w
+1D431	MATHEMATICAL BOLD SMALL X
+	# <font> 0078 latin small letter x
+1D432	MATHEMATICAL BOLD SMALL Y
+	# <font> 0079 latin small letter y
+1D433	MATHEMATICAL BOLD SMALL Z
+	# <font> 007A latin small letter z
+@		Italic symbols
+@+	 	Several italic symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation.
+1D434	MATHEMATICAL ITALIC CAPITAL A
+	# <font> 0041 latin capital letter a
+1D435	MATHEMATICAL ITALIC CAPITAL B
+	# <font> 0042 latin capital letter b
+1D436	MATHEMATICAL ITALIC CAPITAL C
+	# <font> 0043 latin capital letter c
+1D437	MATHEMATICAL ITALIC CAPITAL D
+	# <font> 0044 latin capital letter d
+1D438	MATHEMATICAL ITALIC CAPITAL E
+	# <font> 0045 latin capital letter e
+1D439	MATHEMATICAL ITALIC CAPITAL F
+	# <font> 0046 latin capital letter f
+1D43A	MATHEMATICAL ITALIC CAPITAL G
+	# <font> 0047 latin capital letter g
+1D43B	MATHEMATICAL ITALIC CAPITAL H
+	# <font> 0048 latin capital letter h
+1D43C	MATHEMATICAL ITALIC CAPITAL I
+	# <font> 0049 latin capital letter i
+1D43D	MATHEMATICAL ITALIC CAPITAL J
+	# <font> 004A latin capital letter j
+1D43E	MATHEMATICAL ITALIC CAPITAL K
+	# <font> 004B latin capital letter k
+1D43F	MATHEMATICAL ITALIC CAPITAL L
+	# <font> 004C latin capital letter l
+1D440	MATHEMATICAL ITALIC CAPITAL M
+	# <font> 004D latin capital letter m
+1D441	MATHEMATICAL ITALIC CAPITAL N
+	# <font> 004E latin capital letter n
+1D442	MATHEMATICAL ITALIC CAPITAL O
+	# <font> 004F latin capital letter o
+1D443	MATHEMATICAL ITALIC CAPITAL P
+	# <font> 0050 latin capital letter p
+1D444	MATHEMATICAL ITALIC CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D445	MATHEMATICAL ITALIC CAPITAL R
+	# <font> 0052 latin capital letter r
+1D446	MATHEMATICAL ITALIC CAPITAL S
+	# <font> 0053 latin capital letter s
+1D447	MATHEMATICAL ITALIC CAPITAL T
+	# <font> 0054 latin capital letter t
+1D448	MATHEMATICAL ITALIC CAPITAL U
+	# <font> 0055 latin capital letter u
+1D449	MATHEMATICAL ITALIC CAPITAL V
+	# <font> 0056 latin capital letter v
+1D44A	MATHEMATICAL ITALIC CAPITAL W
+	# <font> 0057 latin capital letter w
+1D44B	MATHEMATICAL ITALIC CAPITAL X
+	# <font> 0058 latin capital letter x
+1D44C	MATHEMATICAL ITALIC CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D44D	MATHEMATICAL ITALIC CAPITAL Z
+	# <font> 005A latin capital letter z
+1D44E	MATHEMATICAL ITALIC SMALL A
+	# <font> 0061 latin small letter a
+1D44F	MATHEMATICAL ITALIC SMALL B
+	# <font> 0062 latin small letter b
+1D450	MATHEMATICAL ITALIC SMALL C
+	# <font> 0063 latin small letter c
+1D451	MATHEMATICAL ITALIC SMALL D
+	# <font> 0064 latin small letter d
+1D452	MATHEMATICAL ITALIC SMALL E
+	# <font> 0065 latin small letter e
+1D453	MATHEMATICAL ITALIC SMALL F
+	# <font> 0066 latin small letter f
+1D454	MATHEMATICAL ITALIC SMALL G
+	# <font> 0067 latin small letter g
+1D455	<reserved>
+	x (planck constant - 210E)
+1D456	MATHEMATICAL ITALIC SMALL I
+	# <font> 0069 latin small letter i
+1D457	MATHEMATICAL ITALIC SMALL J
+	# <font> 006A latin small letter j
+1D458	MATHEMATICAL ITALIC SMALL K
+	# <font> 006B latin small letter k
+1D459	MATHEMATICAL ITALIC SMALL L
+	# <font> 006C latin small letter l
+1D45A	MATHEMATICAL ITALIC SMALL M
+	# <font> 006D latin small letter m
+1D45B	MATHEMATICAL ITALIC SMALL N
+	# <font> 006E latin small letter n
+1D45C	MATHEMATICAL ITALIC SMALL O
+	# <font> 006F latin small letter o
+1D45D	MATHEMATICAL ITALIC SMALL P
+	# <font> 0070 latin small letter p
+1D45E	MATHEMATICAL ITALIC SMALL Q
+	# <font> 0071 latin small letter q
+1D45F	MATHEMATICAL ITALIC SMALL R
+	# <font> 0072 latin small letter r
+1D460	MATHEMATICAL ITALIC SMALL S
+	# <font> 0073 latin small letter s
+1D461	MATHEMATICAL ITALIC SMALL T
+	# <font> 0074 latin small letter t
+1D462	MATHEMATICAL ITALIC SMALL U
+	# <font> 0075 latin small letter u
+1D463	MATHEMATICAL ITALIC SMALL V
+	# <font> 0076 latin small letter v
+1D464	MATHEMATICAL ITALIC SMALL W
+	# <font> 0077 latin small letter w
+1D465	MATHEMATICAL ITALIC SMALL X
+	# <font> 0078 latin small letter x
+1D466	MATHEMATICAL ITALIC SMALL Y
+	# <font> 0079 latin small letter y
+1D467	MATHEMATICAL ITALIC SMALL Z
+	# <font> 007A latin small letter z
+@		Bold italic symbols
+1D468	MATHEMATICAL BOLD ITALIC CAPITAL A
+	# <font> 0041 latin capital letter a
+1D469	MATHEMATICAL BOLD ITALIC CAPITAL B
+	# <font> 0042 latin capital letter b
+1D46A	MATHEMATICAL BOLD ITALIC CAPITAL C
+	# <font> 0043 latin capital letter c
+1D46B	MATHEMATICAL BOLD ITALIC CAPITAL D
+	# <font> 0044 latin capital letter d
+1D46C	MATHEMATICAL BOLD ITALIC CAPITAL E
+	# <font> 0045 latin capital letter e
+1D46D	MATHEMATICAL BOLD ITALIC CAPITAL F
+	# <font> 0046 latin capital letter f
+1D46E	MATHEMATICAL BOLD ITALIC CAPITAL G
+	# <font> 0047 latin capital letter g
+1D46F	MATHEMATICAL BOLD ITALIC CAPITAL H
+	# <font> 0048 latin capital letter h
+1D470	MATHEMATICAL BOLD ITALIC CAPITAL I
+	# <font> 0049 latin capital letter i
+1D471	MATHEMATICAL BOLD ITALIC CAPITAL J
+	# <font> 004A latin capital letter j
+1D472	MATHEMATICAL BOLD ITALIC CAPITAL K
+	# <font> 004B latin capital letter k
+1D473	MATHEMATICAL BOLD ITALIC CAPITAL L
+	# <font> 004C latin capital letter l
+1D474	MATHEMATICAL BOLD ITALIC CAPITAL M
+	# <font> 004D latin capital letter m
+1D475	MATHEMATICAL BOLD ITALIC CAPITAL N
+	# <font> 004E latin capital letter n
+1D476	MATHEMATICAL BOLD ITALIC CAPITAL O
+	# <font> 004F latin capital letter o
+1D477	MATHEMATICAL BOLD ITALIC CAPITAL P
+	# <font> 0050 latin capital letter p
+1D478	MATHEMATICAL BOLD ITALIC CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D479	MATHEMATICAL BOLD ITALIC CAPITAL R
+	# <font> 0052 latin capital letter r
+1D47A	MATHEMATICAL BOLD ITALIC CAPITAL S
+	# <font> 0053 latin capital letter s
+1D47B	MATHEMATICAL BOLD ITALIC CAPITAL T
+	# <font> 0054 latin capital letter t
+1D47C	MATHEMATICAL BOLD ITALIC CAPITAL U
+	# <font> 0055 latin capital letter u
+1D47D	MATHEMATICAL BOLD ITALIC CAPITAL V
+	# <font> 0056 latin capital letter v
+1D47E	MATHEMATICAL BOLD ITALIC CAPITAL W
+	# <font> 0057 latin capital letter w
+1D47F	MATHEMATICAL BOLD ITALIC CAPITAL X
+	# <font> 0058 latin capital letter x
+1D480	MATHEMATICAL BOLD ITALIC CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D481	MATHEMATICAL BOLD ITALIC CAPITAL Z
+	# <font> 005A latin capital letter z
+1D482	MATHEMATICAL BOLD ITALIC SMALL A
+	# <font> 0061 latin small letter a
+1D483	MATHEMATICAL BOLD ITALIC SMALL B
+	# <font> 0062 latin small letter b
+1D484	MATHEMATICAL BOLD ITALIC SMALL C
+	# <font> 0063 latin small letter c
+1D485	MATHEMATICAL BOLD ITALIC SMALL D
+	# <font> 0064 latin small letter d
+1D486	MATHEMATICAL BOLD ITALIC SMALL E
+	# <font> 0065 latin small letter e
+1D487	MATHEMATICAL BOLD ITALIC SMALL F
+	# <font> 0066 latin small letter f
+1D488	MATHEMATICAL BOLD ITALIC SMALL G
+	# <font> 0067 latin small letter g
+1D489	MATHEMATICAL BOLD ITALIC SMALL H
+	# <font> 0068 latin small letter h
+1D48A	MATHEMATICAL BOLD ITALIC SMALL I
+	# <font> 0069 latin small letter i
+1D48B	MATHEMATICAL BOLD ITALIC SMALL J
+	# <font> 006A latin small letter j
+1D48C	MATHEMATICAL BOLD ITALIC SMALL K
+	# <font> 006B latin small letter k
+1D48D	MATHEMATICAL BOLD ITALIC SMALL L
+	# <font> 006C latin small letter l
+1D48E	MATHEMATICAL BOLD ITALIC SMALL M
+	# <font> 006D latin small letter m
+1D48F	MATHEMATICAL BOLD ITALIC SMALL N
+	# <font> 006E latin small letter n
+1D490	MATHEMATICAL BOLD ITALIC SMALL O
+	# <font> 006F latin small letter o
+1D491	MATHEMATICAL BOLD ITALIC SMALL P
+	# <font> 0070 latin small letter p
+1D492	MATHEMATICAL BOLD ITALIC SMALL Q
+	# <font> 0071 latin small letter q
+1D493	MATHEMATICAL BOLD ITALIC SMALL R
+	# <font> 0072 latin small letter r
+1D494	MATHEMATICAL BOLD ITALIC SMALL S
+	# <font> 0073 latin small letter s
+1D495	MATHEMATICAL BOLD ITALIC SMALL T
+	# <font> 0074 latin small letter t
+1D496	MATHEMATICAL BOLD ITALIC SMALL U
+	# <font> 0075 latin small letter u
+1D497	MATHEMATICAL BOLD ITALIC SMALL V
+	# <font> 0076 latin small letter v
+1D498	MATHEMATICAL BOLD ITALIC SMALL W
+	# <font> 0077 latin small letter w
+1D499	MATHEMATICAL BOLD ITALIC SMALL X
+	# <font> 0078 latin small letter x
+1D49A	MATHEMATICAL BOLD ITALIC SMALL Y
+	# <font> 0079 latin small letter y
+1D49B	MATHEMATICAL BOLD ITALIC SMALL Z
+	# <font> 007A latin small letter z
+@		Script symbols
+@+	 	Several script symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation.
+1D49C	MATHEMATICAL SCRIPT CAPITAL A
+	# <font> 0041 latin capital letter a
+1D49D	<reserved>
+	x (script capital b - 212C)
+1D49E	MATHEMATICAL SCRIPT CAPITAL C
+	# <font> 0043 latin capital letter c
+1D49F	MATHEMATICAL SCRIPT CAPITAL D
+	# <font> 0044 latin capital letter d
+1D4A0	<reserved>
+	x (script capital e - 2130)
+1D4A1	<reserved>
+	x (script capital f - 2131)
+1D4A2	MATHEMATICAL SCRIPT CAPITAL G
+	# <font> 0047 latin capital letter g
+1D4A3	<reserved>
+	x (script capital h - 210B)
+1D4A4	<reserved>
+	x (script capital i - 2110)
+1D4A5	MATHEMATICAL SCRIPT CAPITAL J
+	# <font> 004A latin capital letter j
+1D4A6	MATHEMATICAL SCRIPT CAPITAL K
+	# <font> 004B latin capital letter k
+1D4A7	<reserved>
+	x (script capital l - 2112)
+1D4A8	<reserved>
+	x (script capital m - 2133)
+1D4A9	MATHEMATICAL SCRIPT CAPITAL N
+	# <font> 004E latin capital letter n
+1D4AA	MATHEMATICAL SCRIPT CAPITAL O
+	# <font> 004F latin capital letter o
+1D4AB	MATHEMATICAL SCRIPT CAPITAL P
+	= power set
+	# <font> 0050 latin capital letter p
+1D4AC	MATHEMATICAL SCRIPT CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D4AD	<reserved>
+	x (script capital r - 211B)
+1D4AE	MATHEMATICAL SCRIPT CAPITAL S
+	# <font> 0053 latin capital letter s
+1D4AF	MATHEMATICAL SCRIPT CAPITAL T
+	# <font> 0054 latin capital letter t
+1D4B0	MATHEMATICAL SCRIPT CAPITAL U
+	# <font> 0055 latin capital letter u
+1D4B1	MATHEMATICAL SCRIPT CAPITAL V
+	# <font> 0056 latin capital letter v
+1D4B2	MATHEMATICAL SCRIPT CAPITAL W
+	# <font> 0057 latin capital letter w
+1D4B3	MATHEMATICAL SCRIPT CAPITAL X
+	# <font> 0058 latin capital letter x
+1D4B4	MATHEMATICAL SCRIPT CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D4B5	MATHEMATICAL SCRIPT CAPITAL Z
+	# <font> 005A latin capital letter z
+1D4B6	MATHEMATICAL SCRIPT SMALL A
+	# <font> 0061 latin small letter a
+1D4B7	MATHEMATICAL SCRIPT SMALL B
+	# <font> 0062 latin small letter b
+1D4B8	MATHEMATICAL SCRIPT SMALL C
+	# <font> 0063 latin small letter c
+1D4B9	MATHEMATICAL SCRIPT SMALL D
+	# <font> 0064 latin small letter d
+1D4BA	<reserved>
+	x (script small e - 212F)
+1D4BB	MATHEMATICAL SCRIPT SMALL F
+	# <font> 0066 latin small letter f
+1D4BC	<reserved>
+	x (script small g - 210A)
+1D4BD	MATHEMATICAL SCRIPT SMALL H
+	# <font> 0068 latin small letter h
+1D4BE	MATHEMATICAL SCRIPT SMALL I
+	# <font> 0069 latin small letter i
+1D4BF	MATHEMATICAL SCRIPT SMALL J
+	# <font> 006A latin small letter j
+1D4C0	MATHEMATICAL SCRIPT SMALL K
+	# <font> 006B latin small letter k
+1D4C1	MATHEMATICAL SCRIPT SMALL L
+	x (script small l - 2113)
+	# <font> 006C latin small letter l
+1D4C2	MATHEMATICAL SCRIPT SMALL M
+	# <font> 006D latin small letter m
+1D4C3	MATHEMATICAL SCRIPT SMALL N
+	# <font> 006E latin small letter n
+1D4C4	<reserved>
+	x (script small o - 2134)
+1D4C5	MATHEMATICAL SCRIPT SMALL P
+	# <font> 0070 latin small letter p
+1D4C6	MATHEMATICAL SCRIPT SMALL Q
+	# <font> 0071 latin small letter q
+1D4C7	MATHEMATICAL SCRIPT SMALL R
+	# <font> 0072 latin small letter r
+1D4C8	MATHEMATICAL SCRIPT SMALL S
+	# <font> 0073 latin small letter s
+1D4C9	MATHEMATICAL SCRIPT SMALL T
+	# <font> 0074 latin small letter t
+1D4CA	MATHEMATICAL SCRIPT SMALL U
+	# <font> 0075 latin small letter u
+1D4CB	MATHEMATICAL SCRIPT SMALL V
+	# <font> 0076 latin small letter v
+1D4CC	MATHEMATICAL SCRIPT SMALL W
+	# <font> 0077 latin small letter w
+1D4CD	MATHEMATICAL SCRIPT SMALL X
+	# <font> 0078 latin small letter x
+1D4CE	MATHEMATICAL SCRIPT SMALL Y
+	# <font> 0079 latin small letter y
+1D4CF	MATHEMATICAL SCRIPT SMALL Z
+	# <font> 007A latin small letter z
+@		Bold script symbols
+1D4D0	MATHEMATICAL BOLD SCRIPT CAPITAL A
+	# <font> 0041 latin capital letter a
+1D4D1	MATHEMATICAL BOLD SCRIPT CAPITAL B
+	# <font> 0042 latin capital letter b
+1D4D2	MATHEMATICAL BOLD SCRIPT CAPITAL C
+	# <font> 0043 latin capital letter c
+1D4D3	MATHEMATICAL BOLD SCRIPT CAPITAL D
+	# <font> 0044 latin capital letter d
+1D4D4	MATHEMATICAL BOLD SCRIPT CAPITAL E
+	# <font> 0045 latin capital letter e
+1D4D5	MATHEMATICAL BOLD SCRIPT CAPITAL F
+	# <font> 0046 latin capital letter f
+1D4D6	MATHEMATICAL BOLD SCRIPT CAPITAL G
+	# <font> 0047 latin capital letter g
+1D4D7	MATHEMATICAL BOLD SCRIPT CAPITAL H
+	# <font> 0048 latin capital letter h
+1D4D8	MATHEMATICAL BOLD SCRIPT CAPITAL I
+	# <font> 0049 latin capital letter i
+1D4D9	MATHEMATICAL BOLD SCRIPT CAPITAL J
+	# <font> 004A latin capital letter j
+1D4DA	MATHEMATICAL BOLD SCRIPT CAPITAL K
+	# <font> 004B latin capital letter k
+1D4DB	MATHEMATICAL BOLD SCRIPT CAPITAL L
+	# <font> 004C latin capital letter l
+1D4DC	MATHEMATICAL BOLD SCRIPT CAPITAL M
+	# <font> 004D latin capital letter m
+1D4DD	MATHEMATICAL BOLD SCRIPT CAPITAL N
+	# <font> 004E latin capital letter n
+1D4DE	MATHEMATICAL BOLD SCRIPT CAPITAL O
+	# <font> 004F latin capital letter o
+1D4DF	MATHEMATICAL BOLD SCRIPT CAPITAL P
+	# <font> 0050 latin capital letter p
+1D4E0	MATHEMATICAL BOLD SCRIPT CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D4E1	MATHEMATICAL BOLD SCRIPT CAPITAL R
+	# <font> 0052 latin capital letter r
+1D4E2	MATHEMATICAL BOLD SCRIPT CAPITAL S
+	# <font> 0053 latin capital letter s
+1D4E3	MATHEMATICAL BOLD SCRIPT CAPITAL T
+	# <font> 0054 latin capital letter t
+1D4E4	MATHEMATICAL BOLD SCRIPT CAPITAL U
+	# <font> 0055 latin capital letter u
+1D4E5	MATHEMATICAL BOLD SCRIPT CAPITAL V
+	# <font> 0056 latin capital letter v
+1D4E6	MATHEMATICAL BOLD SCRIPT CAPITAL W
+	# <font> 0057 latin capital letter w
+1D4E7	MATHEMATICAL BOLD SCRIPT CAPITAL X
+	# <font> 0058 latin capital letter x
+1D4E8	MATHEMATICAL BOLD SCRIPT CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D4E9	MATHEMATICAL BOLD SCRIPT CAPITAL Z
+	# <font> 005A latin capital letter z
+1D4EA	MATHEMATICAL BOLD SCRIPT SMALL A
+	# <font> 0061 latin small letter a
+1D4EB	MATHEMATICAL BOLD SCRIPT SMALL B
+	# <font> 0062 latin small letter b
+1D4EC	MATHEMATICAL BOLD SCRIPT SMALL C
+	# <font> 0063 latin small letter c
+1D4ED	MATHEMATICAL BOLD SCRIPT SMALL D
+	# <font> 0064 latin small letter d
+1D4EE	MATHEMATICAL BOLD SCRIPT SMALL E
+	# <font> 0065 latin small letter e
+1D4EF	MATHEMATICAL BOLD SCRIPT SMALL F
+	# <font> 0066 latin small letter f
+1D4F0	MATHEMATICAL BOLD SCRIPT SMALL G
+	# <font> 0067 latin small letter g
+1D4F1	MATHEMATICAL BOLD SCRIPT SMALL H
+	# <font> 0068 latin small letter h
+1D4F2	MATHEMATICAL BOLD SCRIPT SMALL I
+	# <font> 0069 latin small letter i
+1D4F3	MATHEMATICAL BOLD SCRIPT SMALL J
+	# <font> 006A latin small letter j
+1D4F4	MATHEMATICAL BOLD SCRIPT SMALL K
+	# <font> 006B latin small letter k
+1D4F5	MATHEMATICAL BOLD SCRIPT SMALL L
+	# <font> 006C latin small letter l
+1D4F6	MATHEMATICAL BOLD SCRIPT SMALL M
+	# <font> 006D latin small letter m
+1D4F7	MATHEMATICAL BOLD SCRIPT SMALL N
+	# <font> 006E latin small letter n
+1D4F8	MATHEMATICAL BOLD SCRIPT SMALL O
+	# <font> 006F latin small letter o
+1D4F9	MATHEMATICAL BOLD SCRIPT SMALL P
+	# <font> 0070 latin small letter p
+1D4FA	MATHEMATICAL BOLD SCRIPT SMALL Q
+	# <font> 0071 latin small letter q
+1D4FB	MATHEMATICAL BOLD SCRIPT SMALL R
+	# <font> 0072 latin small letter r
+1D4FC	MATHEMATICAL BOLD SCRIPT SMALL S
+	# <font> 0073 latin small letter s
+1D4FD	MATHEMATICAL BOLD SCRIPT SMALL T
+	# <font> 0074 latin small letter t
+1D4FE	MATHEMATICAL BOLD SCRIPT SMALL U
+	# <font> 0075 latin small letter u
+1D4FF	MATHEMATICAL BOLD SCRIPT SMALL V
+	# <font> 0076 latin small letter v
+1D500	MATHEMATICAL BOLD SCRIPT SMALL W
+	# <font> 0077 latin small letter w
+1D501	MATHEMATICAL BOLD SCRIPT SMALL X
+	# <font> 0078 latin small letter x
+1D502	MATHEMATICAL BOLD SCRIPT SMALL Y
+	# <font> 0079 latin small letter y
+1D503	MATHEMATICAL BOLD SCRIPT SMALL Z
+	# <font> 007A latin small letter z
+@		Fraktur symbols
+@+		This style is sometimes known as black-letter. Several black-letter symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation.
+1D504	MATHEMATICAL FRAKTUR CAPITAL A
+	# <font> 0041 latin capital letter a
+1D505	MATHEMATICAL FRAKTUR CAPITAL B
+	# <font> 0042 latin capital letter b
+1D506	<reserved>
+	x (black-letter capital c - 212D)
+1D507	MATHEMATICAL FRAKTUR CAPITAL D
+	# <font> 0044 latin capital letter d
+1D508	MATHEMATICAL FRAKTUR CAPITAL E
+	# <font> 0045 latin capital letter e
+1D509	MATHEMATICAL FRAKTUR CAPITAL F
+	# <font> 0046 latin capital letter f
+1D50A	MATHEMATICAL FRAKTUR CAPITAL G
+	# <font> 0047 latin capital letter g
+1D50B	<reserved>
+	x (black-letter capital h - 210C)
+1D50C	<reserved>
+	x (black-letter capital i - 2111)
+1D50D	MATHEMATICAL FRAKTUR CAPITAL J
+	# <font> 004A latin capital letter j
+1D50E	MATHEMATICAL FRAKTUR CAPITAL K
+	# <font> 004B latin capital letter k
+1D50F	MATHEMATICAL FRAKTUR CAPITAL L
+	# <font> 004C latin capital letter l
+1D510	MATHEMATICAL FRAKTUR CAPITAL M
+	= New Testament majority text
+	# <font> 004D latin capital letter m
+1D511	MATHEMATICAL FRAKTUR CAPITAL N
+	# <font> 004E latin capital letter n
+1D512	MATHEMATICAL FRAKTUR CAPITAL O
+	# <font> 004F latin capital letter o
+1D513	MATHEMATICAL FRAKTUR CAPITAL P
+	# <font> 0050 latin capital letter p
+1D514	MATHEMATICAL FRAKTUR CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D515	<reserved>
+	x (black-letter capital r - 211C)
+1D516	MATHEMATICAL FRAKTUR CAPITAL S
+	= Septuagint, Greek Old Testament
+	# <font> 0053 latin capital letter s
+1D517	MATHEMATICAL FRAKTUR CAPITAL T
+	# <font> 0054 latin capital letter t
+1D518	MATHEMATICAL FRAKTUR CAPITAL U
+	# <font> 0055 latin capital letter u
+1D519	MATHEMATICAL FRAKTUR CAPITAL V
+	# <font> 0056 latin capital letter v
+1D51A	MATHEMATICAL FRAKTUR CAPITAL W
+	# <font> 0057 latin capital letter w
+1D51B	MATHEMATICAL FRAKTUR CAPITAL X
+	# <font> 0058 latin capital letter x
+1D51C	MATHEMATICAL FRAKTUR CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D51D	<reserved>
+	x (black-letter capital z - 2128)
+1D51E	MATHEMATICAL FRAKTUR SMALL A
+	# <font> 0061 latin small letter a
+1D51F	MATHEMATICAL FRAKTUR SMALL B
+	# <font> 0062 latin small letter b
+1D520	MATHEMATICAL FRAKTUR SMALL C
+	# <font> 0063 latin small letter c
+1D521	MATHEMATICAL FRAKTUR SMALL D
+	# <font> 0064 latin small letter d
+1D522	MATHEMATICAL FRAKTUR SMALL E
+	# <font> 0065 latin small letter e
+1D523	MATHEMATICAL FRAKTUR SMALL F
+	# <font> 0066 latin small letter f
+1D524	MATHEMATICAL FRAKTUR SMALL G
+	# <font> 0067 latin small letter g
+1D525	MATHEMATICAL FRAKTUR SMALL H
+	# <font> 0068 latin small letter h
+1D526	MATHEMATICAL FRAKTUR SMALL I
+	# <font> 0069 latin small letter i
+1D527	MATHEMATICAL FRAKTUR SMALL J
+	# <font> 006A latin small letter j
+1D528	MATHEMATICAL FRAKTUR SMALL K
+	# <font> 006B latin small letter k
+1D529	MATHEMATICAL FRAKTUR SMALL L
+	# <font> 006C latin small letter l
+1D52A	MATHEMATICAL FRAKTUR SMALL M
+	# <font> 006D latin small letter m
+1D52B	MATHEMATICAL FRAKTUR SMALL N
+	# <font> 006E latin small letter n
+1D52C	MATHEMATICAL FRAKTUR SMALL O
+	# <font> 006F latin small letter o
+1D52D	MATHEMATICAL FRAKTUR SMALL P
+	# <font> 0070 latin small letter p
+1D52E	MATHEMATICAL FRAKTUR SMALL Q
+	# <font> 0071 latin small letter q
+1D52F	MATHEMATICAL FRAKTUR SMALL R
+	# <font> 0072 latin small letter r
+1D530	MATHEMATICAL FRAKTUR SMALL S
+	# <font> 0073 latin small letter s
+1D531	MATHEMATICAL FRAKTUR SMALL T
+	# <font> 0074 latin small letter t
+1D532	MATHEMATICAL FRAKTUR SMALL U
+	# <font> 0075 latin small letter u
+1D533	MATHEMATICAL FRAKTUR SMALL V
+	# <font> 0076 latin small letter v
+1D534	MATHEMATICAL FRAKTUR SMALL W
+	# <font> 0077 latin small letter w
+1D535	MATHEMATICAL FRAKTUR SMALL X
+	# <font> 0078 latin small letter x
+1D536	MATHEMATICAL FRAKTUR SMALL Y
+	# <font> 0079 latin small letter y
+1D537	MATHEMATICAL FRAKTUR SMALL Z
+	# <font> 007A latin small letter z
+@		Double-struck symbols
+@+		This style is sometimes known as open-face or blackboard-bold. Several double-struck symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation.
+1D538	MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+	# <font> 0041 latin capital letter a
+1D539	MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+	# <font> 0042 latin capital letter b
+1D53A	<reserved>
+	x (double-struck capital c - 2102)
+1D53B	MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+	# <font> 0044 latin capital letter d
+1D53C	MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+	# <font> 0045 latin capital letter e
+1D53D	MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+	# <font> 0046 latin capital letter f
+1D53E	MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+	# <font> 0047 latin capital letter g
+1D53F	<reserved>
+	x (double-struck capital h - 210D)
+1D540	MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+	# <font> 0049 latin capital letter i
+1D541	MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+	# <font> 004A latin capital letter j
+1D542	MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+	# <font> 004B latin capital letter k
+1D543	MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+	# <font> 004C latin capital letter l
+1D544	MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+	# <font> 004D latin capital letter m
+1D545	<reserved>
+	x (double-struck capital n - 2115)
+1D546	MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+	# <font> 004F latin capital letter o
+1D547	<reserved>
+	x (double-struck capital p - 2119)
+1D548	<reserved>
+	x (double-struck capital q - 211A)
+1D549	<reserved>
+	x (double-struck capital r - 211D)
+1D54A	MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+	# <font> 0053 latin capital letter s
+1D54B	MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+	# <font> 0054 latin capital letter t
+1D54C	MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+	# <font> 0055 latin capital letter u
+1D54D	MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+	# <font> 0056 latin capital letter v
+1D54E	MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+	# <font> 0057 latin capital letter w
+1D54F	MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+	# <font> 0058 latin capital letter x
+1D550	MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D551	<reserved>
+	x (double-struck capital z - 2124)
+1D552	MATHEMATICAL DOUBLE-STRUCK SMALL A
+	# <font> 0061 latin small letter a
+1D553	MATHEMATICAL DOUBLE-STRUCK SMALL B
+	# <font> 0062 latin small letter b
+1D554	MATHEMATICAL DOUBLE-STRUCK SMALL C
+	# <font> 0063 latin small letter c
+1D555	MATHEMATICAL DOUBLE-STRUCK SMALL D
+	# <font> 0064 latin small letter d
+1D556	MATHEMATICAL DOUBLE-STRUCK SMALL E
+	# <font> 0065 latin small letter e
+1D557	MATHEMATICAL DOUBLE-STRUCK SMALL F
+	# <font> 0066 latin small letter f
+1D558	MATHEMATICAL DOUBLE-STRUCK SMALL G
+	# <font> 0067 latin small letter g
+1D559	MATHEMATICAL DOUBLE-STRUCK SMALL H
+	# <font> 0068 latin small letter h
+1D55A	MATHEMATICAL DOUBLE-STRUCK SMALL I
+	# <font> 0069 latin small letter i
+1D55B	MATHEMATICAL DOUBLE-STRUCK SMALL J
+	# <font> 006A latin small letter j
+1D55C	MATHEMATICAL DOUBLE-STRUCK SMALL K
+	# <font> 006B latin small letter k
+1D55D	MATHEMATICAL DOUBLE-STRUCK SMALL L
+	# <font> 006C latin small letter l
+1D55E	MATHEMATICAL DOUBLE-STRUCK SMALL M
+	# <font> 006D latin small letter m
+1D55F	MATHEMATICAL DOUBLE-STRUCK SMALL N
+	# <font> 006E latin small letter n
+1D560	MATHEMATICAL DOUBLE-STRUCK SMALL O
+	# <font> 006F latin small letter o
+1D561	MATHEMATICAL DOUBLE-STRUCK SMALL P
+	# <font> 0070 latin small letter p
+1D562	MATHEMATICAL DOUBLE-STRUCK SMALL Q
+	# <font> 0071 latin small letter q
+1D563	MATHEMATICAL DOUBLE-STRUCK SMALL R
+	# <font> 0072 latin small letter r
+1D564	MATHEMATICAL DOUBLE-STRUCK SMALL S
+	# <font> 0073 latin small letter s
+1D565	MATHEMATICAL DOUBLE-STRUCK SMALL T
+	# <font> 0074 latin small letter t
+1D566	MATHEMATICAL DOUBLE-STRUCK SMALL U
+	# <font> 0075 latin small letter u
+1D567	MATHEMATICAL DOUBLE-STRUCK SMALL V
+	# <font> 0076 latin small letter v
+1D568	MATHEMATICAL DOUBLE-STRUCK SMALL W
+	# <font> 0077 latin small letter w
+1D569	MATHEMATICAL DOUBLE-STRUCK SMALL X
+	# <font> 0078 latin small letter x
+1D56A	MATHEMATICAL DOUBLE-STRUCK SMALL Y
+	# <font> 0079 latin small letter y
+1D56B	MATHEMATICAL DOUBLE-STRUCK SMALL Z
+	# <font> 007A latin small letter z
+@		Bold Fraktur symbols
+1D56C	MATHEMATICAL BOLD FRAKTUR CAPITAL A
+	# <font> 0041 latin capital letter a
+1D56D	MATHEMATICAL BOLD FRAKTUR CAPITAL B
+	# <font> 0042 latin capital letter b
+1D56E	MATHEMATICAL BOLD FRAKTUR CAPITAL C
+	# <font> 0043 latin capital letter c
+1D56F	MATHEMATICAL BOLD FRAKTUR CAPITAL D
+	# <font> 0044 latin capital letter d
+1D570	MATHEMATICAL BOLD FRAKTUR CAPITAL E
+	# <font> 0045 latin capital letter e
+1D571	MATHEMATICAL BOLD FRAKTUR CAPITAL F
+	# <font> 0046 latin capital letter f
+1D572	MATHEMATICAL BOLD FRAKTUR CAPITAL G
+	# <font> 0047 latin capital letter g
+1D573	MATHEMATICAL BOLD FRAKTUR CAPITAL H
+	# <font> 0048 latin capital letter h
+1D574	MATHEMATICAL BOLD FRAKTUR CAPITAL I
+	# <font> 0049 latin capital letter i
+1D575	MATHEMATICAL BOLD FRAKTUR CAPITAL J
+	# <font> 004A latin capital letter j
+1D576	MATHEMATICAL BOLD FRAKTUR CAPITAL K
+	# <font> 004B latin capital letter k
+1D577	MATHEMATICAL BOLD FRAKTUR CAPITAL L
+	# <font> 004C latin capital letter l
+1D578	MATHEMATICAL BOLD FRAKTUR CAPITAL M
+	# <font> 004D latin capital letter m
+1D579	MATHEMATICAL BOLD FRAKTUR CAPITAL N
+	# <font> 004E latin capital letter n
+1D57A	MATHEMATICAL BOLD FRAKTUR CAPITAL O
+	# <font> 004F latin capital letter o
+1D57B	MATHEMATICAL BOLD FRAKTUR CAPITAL P
+	# <font> 0050 latin capital letter p
+1D57C	MATHEMATICAL BOLD FRAKTUR CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D57D	MATHEMATICAL BOLD FRAKTUR CAPITAL R
+	# <font> 0052 latin capital letter r
+1D57E	MATHEMATICAL BOLD FRAKTUR CAPITAL S
+	# <font> 0053 latin capital letter s
+1D57F	MATHEMATICAL BOLD FRAKTUR CAPITAL T
+	# <font> 0054 latin capital letter t
+1D580	MATHEMATICAL BOLD FRAKTUR CAPITAL U
+	# <font> 0055 latin capital letter u
+1D581	MATHEMATICAL BOLD FRAKTUR CAPITAL V
+	# <font> 0056 latin capital letter v
+1D582	MATHEMATICAL BOLD FRAKTUR CAPITAL W
+	# <font> 0057 latin capital letter w
+1D583	MATHEMATICAL BOLD FRAKTUR CAPITAL X
+	# <font> 0058 latin capital letter x
+1D584	MATHEMATICAL BOLD FRAKTUR CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D585	MATHEMATICAL BOLD FRAKTUR CAPITAL Z
+	# <font> 005A latin capital letter z
+1D586	MATHEMATICAL BOLD FRAKTUR SMALL A
+	# <font> 0061 latin small letter a
+1D587	MATHEMATICAL BOLD FRAKTUR SMALL B
+	# <font> 0062 latin small letter b
+1D588	MATHEMATICAL BOLD FRAKTUR SMALL C
+	# <font> 0063 latin small letter c
+1D589	MATHEMATICAL BOLD FRAKTUR SMALL D
+	# <font> 0064 latin small letter d
+1D58A	MATHEMATICAL BOLD FRAKTUR SMALL E
+	# <font> 0065 latin small letter e
+1D58B	MATHEMATICAL BOLD FRAKTUR SMALL F
+	# <font> 0066 latin small letter f
+1D58C	MATHEMATICAL BOLD FRAKTUR SMALL G
+	# <font> 0067 latin small letter g
+1D58D	MATHEMATICAL BOLD FRAKTUR SMALL H
+	# <font> 0068 latin small letter h
+1D58E	MATHEMATICAL BOLD FRAKTUR SMALL I
+	# <font> 0069 latin small letter i
+1D58F	MATHEMATICAL BOLD FRAKTUR SMALL J
+	# <font> 006A latin small letter j
+1D590	MATHEMATICAL BOLD FRAKTUR SMALL K
+	# <font> 006B latin small letter k
+1D591	MATHEMATICAL BOLD FRAKTUR SMALL L
+	# <font> 006C latin small letter l
+1D592	MATHEMATICAL BOLD FRAKTUR SMALL M
+	# <font> 006D latin small letter m
+1D593	MATHEMATICAL BOLD FRAKTUR SMALL N
+	# <font> 006E latin small letter n
+1D594	MATHEMATICAL BOLD FRAKTUR SMALL O
+	# <font> 006F latin small letter o
+1D595	MATHEMATICAL BOLD FRAKTUR SMALL P
+	# <font> 0070 latin small letter p
+1D596	MATHEMATICAL BOLD FRAKTUR SMALL Q
+	# <font> 0071 latin small letter q
+1D597	MATHEMATICAL BOLD FRAKTUR SMALL R
+	# <font> 0072 latin small letter r
+1D598	MATHEMATICAL BOLD FRAKTUR SMALL S
+	# <font> 0073 latin small letter s
+1D599	MATHEMATICAL BOLD FRAKTUR SMALL T
+	# <font> 0074 latin small letter t
+1D59A	MATHEMATICAL BOLD FRAKTUR SMALL U
+	# <font> 0075 latin small letter u
+1D59B	MATHEMATICAL BOLD FRAKTUR SMALL V
+	# <font> 0076 latin small letter v
+1D59C	MATHEMATICAL BOLD FRAKTUR SMALL W
+	# <font> 0077 latin small letter w
+1D59D	MATHEMATICAL BOLD FRAKTUR SMALL X
+	# <font> 0078 latin small letter x
+1D59E	MATHEMATICAL BOLD FRAKTUR SMALL Y
+	# <font> 0079 latin small letter y
+1D59F	MATHEMATICAL BOLD FRAKTUR SMALL Z
+	# <font> 007A latin small letter z
+@		Sans-serif symbols
+1D5A0	MATHEMATICAL SANS-SERIF CAPITAL A
+	# <font> 0041 latin capital letter a
+1D5A1	MATHEMATICAL SANS-SERIF CAPITAL B
+	# <font> 0042 latin capital letter b
+1D5A2	MATHEMATICAL SANS-SERIF CAPITAL C
+	# <font> 0043 latin capital letter c
+1D5A3	MATHEMATICAL SANS-SERIF CAPITAL D
+	# <font> 0044 latin capital letter d
+1D5A4	MATHEMATICAL SANS-SERIF CAPITAL E
+	# <font> 0045 latin capital letter e
+1D5A5	MATHEMATICAL SANS-SERIF CAPITAL F
+	# <font> 0046 latin capital letter f
+1D5A6	MATHEMATICAL SANS-SERIF CAPITAL G
+	# <font> 0047 latin capital letter g
+1D5A7	MATHEMATICAL SANS-SERIF CAPITAL H
+	# <font> 0048 latin capital letter h
+1D5A8	MATHEMATICAL SANS-SERIF CAPITAL I
+	# <font> 0049 latin capital letter i
+1D5A9	MATHEMATICAL SANS-SERIF CAPITAL J
+	# <font> 004A latin capital letter j
+1D5AA	MATHEMATICAL SANS-SERIF CAPITAL K
+	# <font> 004B latin capital letter k
+1D5AB	MATHEMATICAL SANS-SERIF CAPITAL L
+	# <font> 004C latin capital letter l
+1D5AC	MATHEMATICAL SANS-SERIF CAPITAL M
+	# <font> 004D latin capital letter m
+1D5AD	MATHEMATICAL SANS-SERIF CAPITAL N
+	# <font> 004E latin capital letter n
+1D5AE	MATHEMATICAL SANS-SERIF CAPITAL O
+	# <font> 004F latin capital letter o
+1D5AF	MATHEMATICAL SANS-SERIF CAPITAL P
+	# <font> 0050 latin capital letter p
+1D5B0	MATHEMATICAL SANS-SERIF CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D5B1	MATHEMATICAL SANS-SERIF CAPITAL R
+	# <font> 0052 latin capital letter r
+1D5B2	MATHEMATICAL SANS-SERIF CAPITAL S
+	# <font> 0053 latin capital letter s
+1D5B3	MATHEMATICAL SANS-SERIF CAPITAL T
+	# <font> 0054 latin capital letter t
+1D5B4	MATHEMATICAL SANS-SERIF CAPITAL U
+	# <font> 0055 latin capital letter u
+1D5B5	MATHEMATICAL SANS-SERIF CAPITAL V
+	# <font> 0056 latin capital letter v
+1D5B6	MATHEMATICAL SANS-SERIF CAPITAL W
+	# <font> 0057 latin capital letter w
+1D5B7	MATHEMATICAL SANS-SERIF CAPITAL X
+	# <font> 0058 latin capital letter x
+1D5B8	MATHEMATICAL SANS-SERIF CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D5B9	MATHEMATICAL SANS-SERIF CAPITAL Z
+	# <font> 005A latin capital letter z
+1D5BA	MATHEMATICAL SANS-SERIF SMALL A
+	# <font> 0061 latin small letter a
+1D5BB	MATHEMATICAL SANS-SERIF SMALL B
+	# <font> 0062 latin small letter b
+1D5BC	MATHEMATICAL SANS-SERIF SMALL C
+	# <font> 0063 latin small letter c
+1D5BD	MATHEMATICAL SANS-SERIF SMALL D
+	# <font> 0064 latin small letter d
+1D5BE	MATHEMATICAL SANS-SERIF SMALL E
+	# <font> 0065 latin small letter e
+1D5BF	MATHEMATICAL SANS-SERIF SMALL F
+	# <font> 0066 latin small letter f
+1D5C0	MATHEMATICAL SANS-SERIF SMALL G
+	# <font> 0067 latin small letter g
+1D5C1	MATHEMATICAL SANS-SERIF SMALL H
+	# <font> 0068 latin small letter h
+1D5C2	MATHEMATICAL SANS-SERIF SMALL I
+	# <font> 0069 latin small letter i
+1D5C3	MATHEMATICAL SANS-SERIF SMALL J
+	# <font> 006A latin small letter j
+1D5C4	MATHEMATICAL SANS-SERIF SMALL K
+	# <font> 006B latin small letter k
+1D5C5	MATHEMATICAL SANS-SERIF SMALL L
+	# <font> 006C latin small letter l
+1D5C6	MATHEMATICAL SANS-SERIF SMALL M
+	# <font> 006D latin small letter m
+1D5C7	MATHEMATICAL SANS-SERIF SMALL N
+	# <font> 006E latin small letter n
+1D5C8	MATHEMATICAL SANS-SERIF SMALL O
+	# <font> 006F latin small letter o
+1D5C9	MATHEMATICAL SANS-SERIF SMALL P
+	# <font> 0070 latin small letter p
+1D5CA	MATHEMATICAL SANS-SERIF SMALL Q
+	# <font> 0071 latin small letter q
+1D5CB	MATHEMATICAL SANS-SERIF SMALL R
+	# <font> 0072 latin small letter r
+1D5CC	MATHEMATICAL SANS-SERIF SMALL S
+	# <font> 0073 latin small letter s
+1D5CD	MATHEMATICAL SANS-SERIF SMALL T
+	# <font> 0074 latin small letter t
+1D5CE	MATHEMATICAL SANS-SERIF SMALL U
+	# <font> 0075 latin small letter u
+1D5CF	MATHEMATICAL SANS-SERIF SMALL V
+	# <font> 0076 latin small letter v
+1D5D0	MATHEMATICAL SANS-SERIF SMALL W
+	# <font> 0077 latin small letter w
+1D5D1	MATHEMATICAL SANS-SERIF SMALL X
+	# <font> 0078 latin small letter x
+1D5D2	MATHEMATICAL SANS-SERIF SMALL Y
+	# <font> 0079 latin small letter y
+1D5D3	MATHEMATICAL SANS-SERIF SMALL Z
+	# <font> 007A latin small letter z
+@		Sans-serif bold symbols
+1D5D4	MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+	# <font> 0041 latin capital letter a
+1D5D5	MATHEMATICAL SANS-SERIF BOLD CAPITAL B
+	# <font> 0042 latin capital letter b
+1D5D6	MATHEMATICAL SANS-SERIF BOLD CAPITAL C
+	# <font> 0043 latin capital letter c
+1D5D7	MATHEMATICAL SANS-SERIF BOLD CAPITAL D
+	# <font> 0044 latin capital letter d
+1D5D8	MATHEMATICAL SANS-SERIF BOLD CAPITAL E
+	# <font> 0045 latin capital letter e
+1D5D9	MATHEMATICAL SANS-SERIF BOLD CAPITAL F
+	# <font> 0046 latin capital letter f
+1D5DA	MATHEMATICAL SANS-SERIF BOLD CAPITAL G
+	# <font> 0047 latin capital letter g
+1D5DB	MATHEMATICAL SANS-SERIF BOLD CAPITAL H
+	# <font> 0048 latin capital letter h
+1D5DC	MATHEMATICAL SANS-SERIF BOLD CAPITAL I
+	# <font> 0049 latin capital letter i
+1D5DD	MATHEMATICAL SANS-SERIF BOLD CAPITAL J
+	# <font> 004A latin capital letter j
+1D5DE	MATHEMATICAL SANS-SERIF BOLD CAPITAL K
+	# <font> 004B latin capital letter k
+1D5DF	MATHEMATICAL SANS-SERIF BOLD CAPITAL L
+	# <font> 004C latin capital letter l
+1D5E0	MATHEMATICAL SANS-SERIF BOLD CAPITAL M
+	# <font> 004D latin capital letter m
+1D5E1	MATHEMATICAL SANS-SERIF BOLD CAPITAL N
+	# <font> 004E latin capital letter n
+1D5E2	MATHEMATICAL SANS-SERIF BOLD CAPITAL O
+	# <font> 004F latin capital letter o
+1D5E3	MATHEMATICAL SANS-SERIF BOLD CAPITAL P
+	# <font> 0050 latin capital letter p
+1D5E4	MATHEMATICAL SANS-SERIF BOLD CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D5E5	MATHEMATICAL SANS-SERIF BOLD CAPITAL R
+	# <font> 0052 latin capital letter r
+1D5E6	MATHEMATICAL SANS-SERIF BOLD CAPITAL S
+	# <font> 0053 latin capital letter s
+1D5E7	MATHEMATICAL SANS-SERIF BOLD CAPITAL T
+	# <font> 0054 latin capital letter t
+1D5E8	MATHEMATICAL SANS-SERIF BOLD CAPITAL U
+	# <font> 0055 latin capital letter u
+1D5E9	MATHEMATICAL SANS-SERIF BOLD CAPITAL V
+	# <font> 0056 latin capital letter v
+1D5EA	MATHEMATICAL SANS-SERIF BOLD CAPITAL W
+	# <font> 0057 latin capital letter w
+1D5EB	MATHEMATICAL SANS-SERIF BOLD CAPITAL X
+	# <font> 0058 latin capital letter x
+1D5EC	MATHEMATICAL SANS-SERIF BOLD CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D5ED	MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
+	# <font> 005A latin capital letter z
+1D5EE	MATHEMATICAL SANS-SERIF BOLD SMALL A
+	# <font> 0061 latin small letter a
+1D5EF	MATHEMATICAL SANS-SERIF BOLD SMALL B
+	# <font> 0062 latin small letter b
+1D5F0	MATHEMATICAL SANS-SERIF BOLD SMALL C
+	# <font> 0063 latin small letter c
+1D5F1	MATHEMATICAL SANS-SERIF BOLD SMALL D
+	# <font> 0064 latin small letter d
+1D5F2	MATHEMATICAL SANS-SERIF BOLD SMALL E
+	# <font> 0065 latin small letter e
+1D5F3	MATHEMATICAL SANS-SERIF BOLD SMALL F
+	# <font> 0066 latin small letter f
+1D5F4	MATHEMATICAL SANS-SERIF BOLD SMALL G
+	# <font> 0067 latin small letter g
+1D5F5	MATHEMATICAL SANS-SERIF BOLD SMALL H
+	# <font> 0068 latin small letter h
+1D5F6	MATHEMATICAL SANS-SERIF BOLD SMALL I
+	# <font> 0069 latin small letter i
+1D5F7	MATHEMATICAL SANS-SERIF BOLD SMALL J
+	# <font> 006A latin small letter j
+1D5F8	MATHEMATICAL SANS-SERIF BOLD SMALL K
+	# <font> 006B latin small letter k
+1D5F9	MATHEMATICAL SANS-SERIF BOLD SMALL L
+	# <font> 006C latin small letter l
+1D5FA	MATHEMATICAL SANS-SERIF BOLD SMALL M
+	# <font> 006D latin small letter m
+1D5FB	MATHEMATICAL SANS-SERIF BOLD SMALL N
+	# <font> 006E latin small letter n
+1D5FC	MATHEMATICAL SANS-SERIF BOLD SMALL O
+	# <font> 006F latin small letter o
+1D5FD	MATHEMATICAL SANS-SERIF BOLD SMALL P
+	# <font> 0070 latin small letter p
+1D5FE	MATHEMATICAL SANS-SERIF BOLD SMALL Q
+	# <font> 0071 latin small letter q
+1D5FF	MATHEMATICAL SANS-SERIF BOLD SMALL R
+	# <font> 0072 latin small letter r
+1D600	MATHEMATICAL SANS-SERIF BOLD SMALL S
+	# <font> 0073 latin small letter s
+1D601	MATHEMATICAL SANS-SERIF BOLD SMALL T
+	# <font> 0074 latin small letter t
+1D602	MATHEMATICAL SANS-SERIF BOLD SMALL U
+	# <font> 0075 latin small letter u
+1D603	MATHEMATICAL SANS-SERIF BOLD SMALL V
+	# <font> 0076 latin small letter v
+1D604	MATHEMATICAL SANS-SERIF BOLD SMALL W
+	# <font> 0077 latin small letter w
+1D605	MATHEMATICAL SANS-SERIF BOLD SMALL X
+	# <font> 0078 latin small letter x
+1D606	MATHEMATICAL SANS-SERIF BOLD SMALL Y
+	# <font> 0079 latin small letter y
+1D607	MATHEMATICAL SANS-SERIF BOLD SMALL Z
+	# <font> 007A latin small letter z
+@		Sans-serif italic symbols
+1D608	MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
+	# <font> 0041 latin capital letter a
+1D609	MATHEMATICAL SANS-SERIF ITALIC CAPITAL B
+	# <font> 0042 latin capital letter b
+1D60A	MATHEMATICAL SANS-SERIF ITALIC CAPITAL C
+	# <font> 0043 latin capital letter c
+1D60B	MATHEMATICAL SANS-SERIF ITALIC CAPITAL D
+	# <font> 0044 latin capital letter d
+1D60C	MATHEMATICAL SANS-SERIF ITALIC CAPITAL E
+	# <font> 0045 latin capital letter e
+1D60D	MATHEMATICAL SANS-SERIF ITALIC CAPITAL F
+	# <font> 0046 latin capital letter f
+1D60E	MATHEMATICAL SANS-SERIF ITALIC CAPITAL G
+	# <font> 0047 latin capital letter g
+1D60F	MATHEMATICAL SANS-SERIF ITALIC CAPITAL H
+	# <font> 0048 latin capital letter h
+1D610	MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
+	# <font> 0049 latin capital letter i
+1D611	MATHEMATICAL SANS-SERIF ITALIC CAPITAL J
+	# <font> 004A latin capital letter j
+1D612	MATHEMATICAL SANS-SERIF ITALIC CAPITAL K
+	# <font> 004B latin capital letter k
+1D613	MATHEMATICAL SANS-SERIF ITALIC CAPITAL L
+	# <font> 004C latin capital letter l
+1D614	MATHEMATICAL SANS-SERIF ITALIC CAPITAL M
+	# <font> 004D latin capital letter m
+1D615	MATHEMATICAL SANS-SERIF ITALIC CAPITAL N
+	# <font> 004E latin capital letter n
+1D616	MATHEMATICAL SANS-SERIF ITALIC CAPITAL O
+	# <font> 004F latin capital letter o
+1D617	MATHEMATICAL SANS-SERIF ITALIC CAPITAL P
+	# <font> 0050 latin capital letter p
+1D618	MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D619	MATHEMATICAL SANS-SERIF ITALIC CAPITAL R
+	# <font> 0052 latin capital letter r
+1D61A	MATHEMATICAL SANS-SERIF ITALIC CAPITAL S
+	# <font> 0053 latin capital letter s
+1D61B	MATHEMATICAL SANS-SERIF ITALIC CAPITAL T
+	# <font> 0054 latin capital letter t
+1D61C	MATHEMATICAL SANS-SERIF ITALIC CAPITAL U
+	# <font> 0055 latin capital letter u
+1D61D	MATHEMATICAL SANS-SERIF ITALIC CAPITAL V
+	# <font> 0056 latin capital letter v
+1D61E	MATHEMATICAL SANS-SERIF ITALIC CAPITAL W
+	# <font> 0057 latin capital letter w
+1D61F	MATHEMATICAL SANS-SERIF ITALIC CAPITAL X
+	# <font> 0058 latin capital letter x
+1D620	MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D621	MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
+	# <font> 005A latin capital letter z
+1D622	MATHEMATICAL SANS-SERIF ITALIC SMALL A
+	# <font> 0061 latin small letter a
+1D623	MATHEMATICAL SANS-SERIF ITALIC SMALL B
+	# <font> 0062 latin small letter b
+1D624	MATHEMATICAL SANS-SERIF ITALIC SMALL C
+	# <font> 0063 latin small letter c
+1D625	MATHEMATICAL SANS-SERIF ITALIC SMALL D
+	# <font> 0064 latin small letter d
+1D626	MATHEMATICAL SANS-SERIF ITALIC SMALL E
+	# <font> 0065 latin small letter e
+1D627	MATHEMATICAL SANS-SERIF ITALIC SMALL F
+	# <font> 0066 latin small letter f
+1D628	MATHEMATICAL SANS-SERIF ITALIC SMALL G
+	# <font> 0067 latin small letter g
+1D629	MATHEMATICAL SANS-SERIF ITALIC SMALL H
+	# <font> 0068 latin small letter h
+1D62A	MATHEMATICAL SANS-SERIF ITALIC SMALL I
+	# <font> 0069 latin small letter i
+1D62B	MATHEMATICAL SANS-SERIF ITALIC SMALL J
+	# <font> 006A latin small letter j
+1D62C	MATHEMATICAL SANS-SERIF ITALIC SMALL K
+	# <font> 006B latin small letter k
+1D62D	MATHEMATICAL SANS-SERIF ITALIC SMALL L
+	# <font> 006C latin small letter l
+1D62E	MATHEMATICAL SANS-SERIF ITALIC SMALL M
+	# <font> 006D latin small letter m
+1D62F	MATHEMATICAL SANS-SERIF ITALIC SMALL N
+	# <font> 006E latin small letter n
+1D630	MATHEMATICAL SANS-SERIF ITALIC SMALL O
+	# <font> 006F latin small letter o
+1D631	MATHEMATICAL SANS-SERIF ITALIC SMALL P
+	# <font> 0070 latin small letter p
+1D632	MATHEMATICAL SANS-SERIF ITALIC SMALL Q
+	# <font> 0071 latin small letter q
+1D633	MATHEMATICAL SANS-SERIF ITALIC SMALL R
+	# <font> 0072 latin small letter r
+1D634	MATHEMATICAL SANS-SERIF ITALIC SMALL S
+	# <font> 0073 latin small letter s
+1D635	MATHEMATICAL SANS-SERIF ITALIC SMALL T
+	# <font> 0074 latin small letter t
+1D636	MATHEMATICAL SANS-SERIF ITALIC SMALL U
+	# <font> 0075 latin small letter u
+1D637	MATHEMATICAL SANS-SERIF ITALIC SMALL V
+	# <font> 0076 latin small letter v
+1D638	MATHEMATICAL SANS-SERIF ITALIC SMALL W
+	# <font> 0077 latin small letter w
+1D639	MATHEMATICAL SANS-SERIF ITALIC SMALL X
+	# <font> 0078 latin small letter x
+1D63A	MATHEMATICAL SANS-SERIF ITALIC SMALL Y
+	# <font> 0079 latin small letter y
+1D63B	MATHEMATICAL SANS-SERIF ITALIC SMALL Z
+	# <font> 007A latin small letter z
+@		Sans-serif bold italic symbols
+1D63C	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
+	# <font> 0041 latin capital letter a
+1D63D	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B
+	# <font> 0042 latin capital letter b
+1D63E	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C
+	# <font> 0043 latin capital letter c
+1D63F	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D
+	# <font> 0044 latin capital letter d
+1D640	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E
+	# <font> 0045 latin capital letter e
+1D641	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F
+	# <font> 0046 latin capital letter f
+1D642	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G
+	# <font> 0047 latin capital letter g
+1D643	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H
+	# <font> 0048 latin capital letter h
+1D644	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
+	# <font> 0049 latin capital letter i
+1D645	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J
+	# <font> 004A latin capital letter j
+1D646	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K
+	# <font> 004B latin capital letter k
+1D647	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L
+	# <font> 004C latin capital letter l
+1D648	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M
+	# <font> 004D latin capital letter m
+1D649	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N
+	# <font> 004E latin capital letter n
+1D64A	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O
+	# <font> 004F latin capital letter o
+1D64B	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P
+	# <font> 0050 latin capital letter p
+1D64C	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D64D	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R
+	# <font> 0052 latin capital letter r
+1D64E	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S
+	# <font> 0053 latin capital letter s
+1D64F	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T
+	# <font> 0054 latin capital letter t
+1D650	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U
+	# <font> 0055 latin capital letter u
+1D651	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V
+	# <font> 0056 latin capital letter v
+1D652	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W
+	# <font> 0057 latin capital letter w
+1D653	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X
+	# <font> 0058 latin capital letter x
+1D654	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D655	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
+	# <font> 005A latin capital letter z
+1D656	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A
+	# <font> 0061 latin small letter a
+1D657	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B
+	# <font> 0062 latin small letter b
+1D658	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C
+	# <font> 0063 latin small letter c
+1D659	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D
+	# <font> 0064 latin small letter d
+1D65A	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E
+	# <font> 0065 latin small letter e
+1D65B	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F
+	# <font> 0066 latin small letter f
+1D65C	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G
+	# <font> 0067 latin small letter g
+1D65D	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H
+	# <font> 0068 latin small letter h
+1D65E	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I
+	# <font> 0069 latin small letter i
+1D65F	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+	# <font> 006A latin small letter j
+1D660	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K
+	# <font> 006B latin small letter k
+1D661	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
+	# <font> 006C latin small letter l
+1D662	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M
+	# <font> 006D latin small letter m
+1D663	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N
+	# <font> 006E latin small letter n
+1D664	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O
+	# <font> 006F latin small letter o
+1D665	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P
+	# <font> 0070 latin small letter p
+1D666	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q
+	# <font> 0071 latin small letter q
+1D667	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R
+	# <font> 0072 latin small letter r
+1D668	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S
+	# <font> 0073 latin small letter s
+1D669	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T
+	# <font> 0074 latin small letter t
+1D66A	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U
+	# <font> 0075 latin small letter u
+1D66B	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V
+	# <font> 0076 latin small letter v
+1D66C	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W
+	# <font> 0077 latin small letter w
+1D66D	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X
+	# <font> 0078 latin small letter x
+1D66E	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y
+	# <font> 0079 latin small letter y
+1D66F	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
+	# <font> 007A latin small letter z
+@		Monospace symbols
+1D670	MATHEMATICAL MONOSPACE CAPITAL A
+	# <font> 0041 latin capital letter a
+1D671	MATHEMATICAL MONOSPACE CAPITAL B
+	# <font> 0042 latin capital letter b
+1D672	MATHEMATICAL MONOSPACE CAPITAL C
+	# <font> 0043 latin capital letter c
+1D673	MATHEMATICAL MONOSPACE CAPITAL D
+	# <font> 0044 latin capital letter d
+1D674	MATHEMATICAL MONOSPACE CAPITAL E
+	# <font> 0045 latin capital letter e
+1D675	MATHEMATICAL MONOSPACE CAPITAL F
+	# <font> 0046 latin capital letter f
+1D676	MATHEMATICAL MONOSPACE CAPITAL G
+	# <font> 0047 latin capital letter g
+1D677	MATHEMATICAL MONOSPACE CAPITAL H
+	# <font> 0048 latin capital letter h
+1D678	MATHEMATICAL MONOSPACE CAPITAL I
+	# <font> 0049 latin capital letter i
+1D679	MATHEMATICAL MONOSPACE CAPITAL J
+	# <font> 004A latin capital letter j
+1D67A	MATHEMATICAL MONOSPACE CAPITAL K
+	# <font> 004B latin capital letter k
+1D67B	MATHEMATICAL MONOSPACE CAPITAL L
+	# <font> 004C latin capital letter l
+1D67C	MATHEMATICAL MONOSPACE CAPITAL M
+	# <font> 004D latin capital letter m
+1D67D	MATHEMATICAL MONOSPACE CAPITAL N
+	# <font> 004E latin capital letter n
+1D67E	MATHEMATICAL MONOSPACE CAPITAL O
+	# <font> 004F latin capital letter o
+1D67F	MATHEMATICAL MONOSPACE CAPITAL P
+	# <font> 0050 latin capital letter p
+1D680	MATHEMATICAL MONOSPACE CAPITAL Q
+	# <font> 0051 latin capital letter q
+1D681	MATHEMATICAL MONOSPACE CAPITAL R
+	# <font> 0052 latin capital letter r
+1D682	MATHEMATICAL MONOSPACE CAPITAL S
+	# <font> 0053 latin capital letter s
+1D683	MATHEMATICAL MONOSPACE CAPITAL T
+	# <font> 0054 latin capital letter t
+1D684	MATHEMATICAL MONOSPACE CAPITAL U
+	# <font> 0055 latin capital letter u
+1D685	MATHEMATICAL MONOSPACE CAPITAL V
+	# <font> 0056 latin capital letter v
+1D686	MATHEMATICAL MONOSPACE CAPITAL W
+	# <font> 0057 latin capital letter w
+1D687	MATHEMATICAL MONOSPACE CAPITAL X
+	# <font> 0058 latin capital letter x
+1D688	MATHEMATICAL MONOSPACE CAPITAL Y
+	# <font> 0059 latin capital letter y
+1D689	MATHEMATICAL MONOSPACE CAPITAL Z
+	# <font> 005A latin capital letter z
+1D68A	MATHEMATICAL MONOSPACE SMALL A
+	# <font> 0061 latin small letter a
+1D68B	MATHEMATICAL MONOSPACE SMALL B
+	# <font> 0062 latin small letter b
+1D68C	MATHEMATICAL MONOSPACE SMALL C
+	# <font> 0063 latin small letter c
+1D68D	MATHEMATICAL MONOSPACE SMALL D
+	# <font> 0064 latin small letter d
+1D68E	MATHEMATICAL MONOSPACE SMALL E
+	# <font> 0065 latin small letter e
+1D68F	MATHEMATICAL MONOSPACE SMALL F
+	# <font> 0066 latin small letter f
+1D690	MATHEMATICAL MONOSPACE SMALL G
+	# <font> 0067 latin small letter g
+1D691	MATHEMATICAL MONOSPACE SMALL H
+	# <font> 0068 latin small letter h
+1D692	MATHEMATICAL MONOSPACE SMALL I
+	# <font> 0069 latin small letter i
+1D693	MATHEMATICAL MONOSPACE SMALL J
+	# <font> 006A latin small letter j
+1D694	MATHEMATICAL MONOSPACE SMALL K
+	# <font> 006B latin small letter k
+1D695	MATHEMATICAL MONOSPACE SMALL L
+	# <font> 006C latin small letter l
+1D696	MATHEMATICAL MONOSPACE SMALL M
+	# <font> 006D latin small letter m
+1D697	MATHEMATICAL MONOSPACE SMALL N
+	# <font> 006E latin small letter n
+1D698	MATHEMATICAL MONOSPACE SMALL O
+	# <font> 006F latin small letter o
+1D699	MATHEMATICAL MONOSPACE SMALL P
+	# <font> 0070 latin small letter p
+1D69A	MATHEMATICAL MONOSPACE SMALL Q
+	# <font> 0071 latin small letter q
+1D69B	MATHEMATICAL MONOSPACE SMALL R
+	# <font> 0072 latin small letter r
+1D69C	MATHEMATICAL MONOSPACE SMALL S
+	# <font> 0073 latin small letter s
+1D69D	MATHEMATICAL MONOSPACE SMALL T
+	# <font> 0074 latin small letter t
+1D69E	MATHEMATICAL MONOSPACE SMALL U
+	# <font> 0075 latin small letter u
+1D69F	MATHEMATICAL MONOSPACE SMALL V
+	# <font> 0076 latin small letter v
+1D6A0	MATHEMATICAL MONOSPACE SMALL W
+	# <font> 0077 latin small letter w
+1D6A1	MATHEMATICAL MONOSPACE SMALL X
+	# <font> 0078 latin small letter x
+1D6A2	MATHEMATICAL MONOSPACE SMALL Y
+	# <font> 0079 latin small letter y
+1D6A3	MATHEMATICAL MONOSPACE SMALL Z
+	# <font> 007A latin small letter z
+@		Dotless symbols
+@+		For use as independent symbols. These are not required as base characters for accents since regular i and j are soft-dotted in Unicode.
+1D6A4	MATHEMATICAL ITALIC SMALL DOTLESS I
+	= \imath
+	x (latin small letter dotless i - 0131)
+	x (mathematical italic small i - 1D456)
+	# <font> 0131 latin small letter dotless i
+1D6A5	MATHEMATICAL ITALIC SMALL DOTLESS J
+	= \jmath
+	x (latin small letter dotless j - 0237)
+	x (mathematical italic small j - 1D457)
+	# <font> 0237 latin small letter dotless j
+@		Bold Greek symbols
+1D6A8	MATHEMATICAL BOLD CAPITAL ALPHA
+	# <font> 0391 greek capital letter alpha
+1D6A9	MATHEMATICAL BOLD CAPITAL BETA
+	# <font> 0392 greek capital letter beta
+1D6AA	MATHEMATICAL BOLD CAPITAL GAMMA
+	# <font> 0393 greek capital letter gamma
+1D6AB	MATHEMATICAL BOLD CAPITAL DELTA
+	# <font> 0394 greek capital letter delta
+1D6AC	MATHEMATICAL BOLD CAPITAL EPSILON
+	# <font> 0395 greek capital letter epsilon
+1D6AD	MATHEMATICAL BOLD CAPITAL ZETA
+	# <font> 0396 greek capital letter zeta
+1D6AE	MATHEMATICAL BOLD CAPITAL ETA
+	# <font> 0397 greek capital letter eta
+1D6AF	MATHEMATICAL BOLD CAPITAL THETA
+	# <font> 0398 greek capital letter theta
+1D6B0	MATHEMATICAL BOLD CAPITAL IOTA
+	# <font> 0399 greek capital letter iota
+1D6B1	MATHEMATICAL BOLD CAPITAL KAPPA
+	# <font> 039A greek capital letter kappa
+1D6B2	MATHEMATICAL BOLD CAPITAL LAMDA
+	# <font> 039B greek capital letter lamda
+1D6B3	MATHEMATICAL BOLD CAPITAL MU
+	# <font> 039C greek capital letter mu
+1D6B4	MATHEMATICAL BOLD CAPITAL NU
+	# <font> 039D greek capital letter nu
+1D6B5	MATHEMATICAL BOLD CAPITAL XI
+	# <font> 039E greek capital letter xi
+1D6B6	MATHEMATICAL BOLD CAPITAL OMICRON
+	# <font> 039F greek capital letter omicron
+1D6B7	MATHEMATICAL BOLD CAPITAL PI
+	# <font> 03A0 greek capital letter pi
+1D6B8	MATHEMATICAL BOLD CAPITAL RHO
+	# <font> 03A1 greek capital letter rho
+1D6B9	MATHEMATICAL BOLD CAPITAL THETA SYMBOL
+	# <font> 03F4 greek capital theta symbol
+1D6BA	MATHEMATICAL BOLD CAPITAL SIGMA
+	# <font> 03A3 greek capital letter sigma
+1D6BB	MATHEMATICAL BOLD CAPITAL TAU
+	# <font> 03A4 greek capital letter tau
+1D6BC	MATHEMATICAL BOLD CAPITAL UPSILON
+	# <font> 03A5 greek capital letter upsilon
+1D6BD	MATHEMATICAL BOLD CAPITAL PHI
+	# <font> 03A6 greek capital letter phi
+1D6BE	MATHEMATICAL BOLD CAPITAL CHI
+	# <font> 03A7 greek capital letter chi
+1D6BF	MATHEMATICAL BOLD CAPITAL PSI
+	# <font> 03A8 greek capital letter psi
+1D6C0	MATHEMATICAL BOLD CAPITAL OMEGA
+	# <font> 03A9 greek capital letter omega
+1D6C1	MATHEMATICAL BOLD NABLA
+	# <font> 2207 nabla
+1D6C2	MATHEMATICAL BOLD SMALL ALPHA
+	# <font> 03B1 greek small letter alpha
+1D6C3	MATHEMATICAL BOLD SMALL BETA
+	# <font> 03B2 greek small letter beta
+1D6C4	MATHEMATICAL BOLD SMALL GAMMA
+	# <font> 03B3 greek small letter gamma
+1D6C5	MATHEMATICAL BOLD SMALL DELTA
+	# <font> 03B4 greek small letter delta
+1D6C6	MATHEMATICAL BOLD SMALL EPSILON
+	# <font> 03B5 greek small letter epsilon
+1D6C7	MATHEMATICAL BOLD SMALL ZETA
+	# <font> 03B6 greek small letter zeta
+1D6C8	MATHEMATICAL BOLD SMALL ETA
+	# <font> 03B7 greek small letter eta
+1D6C9	MATHEMATICAL BOLD SMALL THETA
+	# <font> 03B8 greek small letter theta
+1D6CA	MATHEMATICAL BOLD SMALL IOTA
+	# <font> 03B9 greek small letter iota
+1D6CB	MATHEMATICAL BOLD SMALL KAPPA
+	# <font> 03BA greek small letter kappa
+1D6CC	MATHEMATICAL BOLD SMALL LAMDA
+	# <font> 03BB greek small letter lamda
+1D6CD	MATHEMATICAL BOLD SMALL MU
+	# <font> 03BC greek small letter mu
+1D6CE	MATHEMATICAL BOLD SMALL NU
+	# <font> 03BD greek small letter nu
+1D6CF	MATHEMATICAL BOLD SMALL XI
+	# <font> 03BE greek small letter xi
+1D6D0	MATHEMATICAL BOLD SMALL OMICRON
+	# <font> 03BF greek small letter omicron
+1D6D1	MATHEMATICAL BOLD SMALL PI
+	# <font> 03C0 greek small letter pi
+1D6D2	MATHEMATICAL BOLD SMALL RHO
+	# <font> 03C1 greek small letter rho
+1D6D3	MATHEMATICAL BOLD SMALL FINAL SIGMA
+	# <font> 03C2 greek small letter final sigma
+1D6D4	MATHEMATICAL BOLD SMALL SIGMA
+	# <font> 03C3 greek small letter sigma
+1D6D5	MATHEMATICAL BOLD SMALL TAU
+	# <font> 03C4 greek small letter tau
+1D6D6	MATHEMATICAL BOLD SMALL UPSILON
+	# <font> 03C5 greek small letter upsilon
+1D6D7	MATHEMATICAL BOLD SMALL PHI
+	# <font> 03C6 greek small letter phi
+1D6D8	MATHEMATICAL BOLD SMALL CHI
+	# <font> 03C7 greek small letter chi
+1D6D9	MATHEMATICAL BOLD SMALL PSI
+	# <font> 03C8 greek small letter psi
+1D6DA	MATHEMATICAL BOLD SMALL OMEGA
+	# <font> 03C9 greek small letter omega
+@		Additional bold Greek symbols
+1D6DB	MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+	# <font> 2202 partial differential
+1D6DC	MATHEMATICAL BOLD EPSILON SYMBOL
+	# <font> 03F5 greek lunate epsilon symbol
+1D6DD	MATHEMATICAL BOLD THETA SYMBOL
+	# <font> 03D1 greek theta symbol
+1D6DE	MATHEMATICAL BOLD KAPPA SYMBOL
+	# <font> 03F0 greek kappa symbol
+1D6DF	MATHEMATICAL BOLD PHI SYMBOL
+	# <font> 03D5 greek phi symbol
+1D6E0	MATHEMATICAL BOLD RHO SYMBOL
+	# <font> 03F1 greek rho symbol
+1D6E1	MATHEMATICAL BOLD PI SYMBOL
+	# <font> 03D6 greek pi symbol
+@		Italic Greek symbols
+1D6E2	MATHEMATICAL ITALIC CAPITAL ALPHA
+	# <font> 0391 greek capital letter alpha
+1D6E3	MATHEMATICAL ITALIC CAPITAL BETA
+	# <font> 0392 greek capital letter beta
+1D6E4	MATHEMATICAL ITALIC CAPITAL GAMMA
+	# <font> 0393 greek capital letter gamma
+1D6E5	MATHEMATICAL ITALIC CAPITAL DELTA
+	# <font> 0394 greek capital letter delta
+1D6E6	MATHEMATICAL ITALIC CAPITAL EPSILON
+	# <font> 0395 greek capital letter epsilon
+1D6E7	MATHEMATICAL ITALIC CAPITAL ZETA
+	# <font> 0396 greek capital letter zeta
+1D6E8	MATHEMATICAL ITALIC CAPITAL ETA
+	# <font> 0397 greek capital letter eta
+1D6E9	MATHEMATICAL ITALIC CAPITAL THETA
+	# <font> 0398 greek capital letter theta
+1D6EA	MATHEMATICAL ITALIC CAPITAL IOTA
+	# <font> 0399 greek capital letter iota
+1D6EB	MATHEMATICAL ITALIC CAPITAL KAPPA
+	# <font> 039A greek capital letter kappa
+1D6EC	MATHEMATICAL ITALIC CAPITAL LAMDA
+	# <font> 039B greek capital letter lamda
+1D6ED	MATHEMATICAL ITALIC CAPITAL MU
+	# <font> 039C greek capital letter mu
+1D6EE	MATHEMATICAL ITALIC CAPITAL NU
+	# <font> 039D greek capital letter nu
+1D6EF	MATHEMATICAL ITALIC CAPITAL XI
+	# <font> 039E greek capital letter xi
+1D6F0	MATHEMATICAL ITALIC CAPITAL OMICRON
+	# <font> 039F greek capital letter omicron
+1D6F1	MATHEMATICAL ITALIC CAPITAL PI
+	# <font> 03A0 greek capital letter pi
+1D6F2	MATHEMATICAL ITALIC CAPITAL RHO
+	# <font> 03A1 greek capital letter rho
+1D6F3	MATHEMATICAL ITALIC CAPITAL THETA SYMBOL
+	# <font> 03F4 greek capital theta symbol
+1D6F4	MATHEMATICAL ITALIC CAPITAL SIGMA
+	# <font> 03A3 greek capital letter sigma
+1D6F5	MATHEMATICAL ITALIC CAPITAL TAU
+	# <font> 03A4 greek capital letter tau
+1D6F6	MATHEMATICAL ITALIC CAPITAL UPSILON
+	# <font> 03A5 greek capital letter upsilon
+1D6F7	MATHEMATICAL ITALIC CAPITAL PHI
+	# <font> 03A6 greek capital letter phi
+1D6F8	MATHEMATICAL ITALIC CAPITAL CHI
+	# <font> 03A7 greek capital letter chi
+1D6F9	MATHEMATICAL ITALIC CAPITAL PSI
+	# <font> 03A8 greek capital letter psi
+1D6FA	MATHEMATICAL ITALIC CAPITAL OMEGA
+	# <font> 03A9 greek capital letter omega
+1D6FB	MATHEMATICAL ITALIC NABLA
+	# <font> 2207 nabla
+1D6FC	MATHEMATICAL ITALIC SMALL ALPHA
+	# <font> 03B1 greek small letter alpha
+1D6FD	MATHEMATICAL ITALIC SMALL BETA
+	# <font> 03B2 greek small letter beta
+1D6FE	MATHEMATICAL ITALIC SMALL GAMMA
+	# <font> 03B3 greek small letter gamma
+1D6FF	MATHEMATICAL ITALIC SMALL DELTA
+	# <font> 03B4 greek small letter delta
+1D700	MATHEMATICAL ITALIC SMALL EPSILON
+	# <font> 03B5 greek small letter epsilon
+1D701	MATHEMATICAL ITALIC SMALL ZETA
+	# <font> 03B6 greek small letter zeta
+1D702	MATHEMATICAL ITALIC SMALL ETA
+	# <font> 03B7 greek small letter eta
+1D703	MATHEMATICAL ITALIC SMALL THETA
+	# <font> 03B8 greek small letter theta
+1D704	MATHEMATICAL ITALIC SMALL IOTA
+	# <font> 03B9 greek small letter iota
+1D705	MATHEMATICAL ITALIC SMALL KAPPA
+	# <font> 03BA greek small letter kappa
+1D706	MATHEMATICAL ITALIC SMALL LAMDA
+	# <font> 03BB greek small letter lamda
+1D707	MATHEMATICAL ITALIC SMALL MU
+	# <font> 03BC greek small letter mu
+1D708	MATHEMATICAL ITALIC SMALL NU
+	# <font> 03BD greek small letter nu
+1D709	MATHEMATICAL ITALIC SMALL XI
+	# <font> 03BE greek small letter xi
+1D70A	MATHEMATICAL ITALIC SMALL OMICRON
+	# <font> 03BF greek small letter omicron
+1D70B	MATHEMATICAL ITALIC SMALL PI
+	# <font> 03C0 greek small letter pi
+1D70C	MATHEMATICAL ITALIC SMALL RHO
+	# <font> 03C1 greek small letter rho
+1D70D	MATHEMATICAL ITALIC SMALL FINAL SIGMA
+	# <font> 03C2 greek small letter final sigma
+1D70E	MATHEMATICAL ITALIC SMALL SIGMA
+	# <font> 03C3 greek small letter sigma
+1D70F	MATHEMATICAL ITALIC SMALL TAU
+	# <font> 03C4 greek small letter tau
+1D710	MATHEMATICAL ITALIC SMALL UPSILON
+	# <font> 03C5 greek small letter upsilon
+1D711	MATHEMATICAL ITALIC SMALL PHI
+	# <font> 03C6 greek small letter phi
+1D712	MATHEMATICAL ITALIC SMALL CHI
+	# <font> 03C7 greek small letter chi
+1D713	MATHEMATICAL ITALIC SMALL PSI
+	# <font> 03C8 greek small letter psi
+1D714	MATHEMATICAL ITALIC SMALL OMEGA
+	# <font> 03C9 greek small letter omega
+@		Additional italic Greek symbols
+1D715	MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+	# <font> 2202 partial differential
+1D716	MATHEMATICAL ITALIC EPSILON SYMBOL
+	# <font> 03F5 greek lunate epsilon symbol
+1D717	MATHEMATICAL ITALIC THETA SYMBOL
+	# <font> 03D1 greek theta symbol
+1D718	MATHEMATICAL ITALIC KAPPA SYMBOL
+	# <font> 03F0 greek kappa symbol
+1D719	MATHEMATICAL ITALIC PHI SYMBOL
+	# <font> 03D5 greek phi symbol
+1D71A	MATHEMATICAL ITALIC RHO SYMBOL
+	# <font> 03F1 greek rho symbol
+1D71B	MATHEMATICAL ITALIC PI SYMBOL
+	# <font> 03D6 greek pi symbol
+@		Bold italic Greek symbols
+1D71C	MATHEMATICAL BOLD ITALIC CAPITAL ALPHA
+	# <font> 0391 greek capital letter alpha
+1D71D	MATHEMATICAL BOLD ITALIC CAPITAL BETA
+	# <font> 0392 greek capital letter beta
+1D71E	MATHEMATICAL BOLD ITALIC CAPITAL GAMMA
+	# <font> 0393 greek capital letter gamma
+1D71F	MATHEMATICAL BOLD ITALIC CAPITAL DELTA
+	# <font> 0394 greek capital letter delta
+1D720	MATHEMATICAL BOLD ITALIC CAPITAL EPSILON
+	# <font> 0395 greek capital letter epsilon
+1D721	MATHEMATICAL BOLD ITALIC CAPITAL ZETA
+	# <font> 0396 greek capital letter zeta
+1D722	MATHEMATICAL BOLD ITALIC CAPITAL ETA
+	# <font> 0397 greek capital letter eta
+1D723	MATHEMATICAL BOLD ITALIC CAPITAL THETA
+	# <font> 0398 greek capital letter theta
+1D724	MATHEMATICAL BOLD ITALIC CAPITAL IOTA
+	# <font> 0399 greek capital letter iota
+1D725	MATHEMATICAL BOLD ITALIC CAPITAL KAPPA
+	# <font> 039A greek capital letter kappa
+1D726	MATHEMATICAL BOLD ITALIC CAPITAL LAMDA
+	# <font> 039B greek capital letter lamda
+1D727	MATHEMATICAL BOLD ITALIC CAPITAL MU
+	# <font> 039C greek capital letter mu
+1D728	MATHEMATICAL BOLD ITALIC CAPITAL NU
+	# <font> 039D greek capital letter nu
+1D729	MATHEMATICAL BOLD ITALIC CAPITAL XI
+	# <font> 039E greek capital letter xi
+1D72A	MATHEMATICAL BOLD ITALIC CAPITAL OMICRON
+	# <font> 039F greek capital letter omicron
+1D72B	MATHEMATICAL BOLD ITALIC CAPITAL PI
+	# <font> 03A0 greek capital letter pi
+1D72C	MATHEMATICAL BOLD ITALIC CAPITAL RHO
+	# <font> 03A1 greek capital letter rho
+1D72D	MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL
+	# <font> 03F4 greek capital theta symbol
+1D72E	MATHEMATICAL BOLD ITALIC CAPITAL SIGMA
+	# <font> 03A3 greek capital letter sigma
+1D72F	MATHEMATICAL BOLD ITALIC CAPITAL TAU
+	# <font> 03A4 greek capital letter tau
+1D730	MATHEMATICAL BOLD ITALIC CAPITAL UPSILON
+	# <font> 03A5 greek capital letter upsilon
+1D731	MATHEMATICAL BOLD ITALIC CAPITAL PHI
+	# <font> 03A6 greek capital letter phi
+1D732	MATHEMATICAL BOLD ITALIC CAPITAL CHI
+	# <font> 03A7 greek capital letter chi
+1D733	MATHEMATICAL BOLD ITALIC CAPITAL PSI
+	# <font> 03A8 greek capital letter psi
+1D734	MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+	# <font> 03A9 greek capital letter omega
+1D735	MATHEMATICAL BOLD ITALIC NABLA
+	# <font> 2207 nabla
+1D736	MATHEMATICAL BOLD ITALIC SMALL ALPHA
+	# <font> 03B1 greek small letter alpha
+1D737	MATHEMATICAL BOLD ITALIC SMALL BETA
+	# <font> 03B2 greek small letter beta
+1D738	MATHEMATICAL BOLD ITALIC SMALL GAMMA
+	# <font> 03B3 greek small letter gamma
+1D739	MATHEMATICAL BOLD ITALIC SMALL DELTA
+	# <font> 03B4 greek small letter delta
+1D73A	MATHEMATICAL BOLD ITALIC SMALL EPSILON
+	# <font> 03B5 greek small letter epsilon
+1D73B	MATHEMATICAL BOLD ITALIC SMALL ZETA
+	# <font> 03B6 greek small letter zeta
+1D73C	MATHEMATICAL BOLD ITALIC SMALL ETA
+	# <font> 03B7 greek small letter eta
+1D73D	MATHEMATICAL BOLD ITALIC SMALL THETA
+	# <font> 03B8 greek small letter theta
+1D73E	MATHEMATICAL BOLD ITALIC SMALL IOTA
+	# <font> 03B9 greek small letter iota
+1D73F	MATHEMATICAL BOLD ITALIC SMALL KAPPA
+	# <font> 03BA greek small letter kappa
+1D740	MATHEMATICAL BOLD ITALIC SMALL LAMDA
+	# <font> 03BB greek small letter lamda
+1D741	MATHEMATICAL BOLD ITALIC SMALL MU
+	# <font> 03BC greek small letter mu
+1D742	MATHEMATICAL BOLD ITALIC SMALL NU
+	# <font> 03BD greek small letter nu
+1D743	MATHEMATICAL BOLD ITALIC SMALL XI
+	# <font> 03BE greek small letter xi
+1D744	MATHEMATICAL BOLD ITALIC SMALL OMICRON
+	# <font> 03BF greek small letter omicron
+1D745	MATHEMATICAL BOLD ITALIC SMALL PI
+	# <font> 03C0 greek small letter pi
+1D746	MATHEMATICAL BOLD ITALIC SMALL RHO
+	# <font> 03C1 greek small letter rho
+1D747	MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA
+	# <font> 03C2 greek small letter final sigma
+1D748	MATHEMATICAL BOLD ITALIC SMALL SIGMA
+	# <font> 03C3 greek small letter sigma
+1D749	MATHEMATICAL BOLD ITALIC SMALL TAU
+	# <font> 03C4 greek small letter tau
+1D74A	MATHEMATICAL BOLD ITALIC SMALL UPSILON
+	# <font> 03C5 greek small letter upsilon
+1D74B	MATHEMATICAL BOLD ITALIC SMALL PHI
+	# <font> 03C6 greek small letter phi
+1D74C	MATHEMATICAL BOLD ITALIC SMALL CHI
+	# <font> 03C7 greek small letter chi
+1D74D	MATHEMATICAL BOLD ITALIC SMALL PSI
+	# <font> 03C8 greek small letter psi
+1D74E	MATHEMATICAL BOLD ITALIC SMALL OMEGA
+	# <font> 03C9 greek small letter omega
+@		Additional bold italic Greek symbols
+1D74F	MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+	# <font> 2202 partial differential
+1D750	MATHEMATICAL BOLD ITALIC EPSILON SYMBOL
+	# <font> 03F5 greek lunate epsilon symbol
+1D751	MATHEMATICAL BOLD ITALIC THETA SYMBOL
+	# <font> 03D1 greek theta symbol
+1D752	MATHEMATICAL BOLD ITALIC KAPPA SYMBOL
+	# <font> 03F0 greek kappa symbol
+1D753	MATHEMATICAL BOLD ITALIC PHI SYMBOL
+	# <font> 03D5 greek phi symbol
+1D754	MATHEMATICAL BOLD ITALIC RHO SYMBOL
+	# <font> 03F1 greek rho symbol
+1D755	MATHEMATICAL BOLD ITALIC PI SYMBOL
+	# <font> 03D6 greek pi symbol
+@		Sans-serif bold Greek symbols
+1D756	MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA
+	# <font> 0391 greek capital letter alpha
+1D757	MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA
+	# <font> 0392 greek capital letter beta
+1D758	MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA
+	# <font> 0393 greek capital letter gamma
+1D759	MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA
+	# <font> 0394 greek capital letter delta
+1D75A	MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON
+	# <font> 0395 greek capital letter epsilon
+1D75B	MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA
+	# <font> 0396 greek capital letter zeta
+1D75C	MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA
+	# <font> 0397 greek capital letter eta
+1D75D	MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA
+	# <font> 0398 greek capital letter theta
+1D75E	MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
+	# <font> 0399 greek capital letter iota
+1D75F	MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA
+	# <font> 039A greek capital letter kappa
+1D760	MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA
+	# <font> 039B greek capital letter lamda
+1D761	MATHEMATICAL SANS-SERIF BOLD CAPITAL MU
+	# <font> 039C greek capital letter mu
+1D762	MATHEMATICAL SANS-SERIF BOLD CAPITAL NU
+	# <font> 039D greek capital letter nu
+1D763	MATHEMATICAL SANS-SERIF BOLD CAPITAL XI
+	# <font> 039E greek capital letter xi
+1D764	MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON
+	# <font> 039F greek capital letter omicron
+1D765	MATHEMATICAL SANS-SERIF BOLD CAPITAL PI
+	# <font> 03A0 greek capital letter pi
+1D766	MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO
+	# <font> 03A1 greek capital letter rho
+1D767	MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL
+	# <font> 03F4 greek capital theta symbol
+1D768	MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA
+	# <font> 03A3 greek capital letter sigma
+1D769	MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU
+	# <font> 03A4 greek capital letter tau
+1D76A	MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON
+	# <font> 03A5 greek capital letter upsilon
+1D76B	MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI
+	# <font> 03A6 greek capital letter phi
+1D76C	MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI
+	# <font> 03A7 greek capital letter chi
+1D76D	MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI
+	# <font> 03A8 greek capital letter psi
+1D76E	MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+	# <font> 03A9 greek capital letter omega
+1D76F	MATHEMATICAL SANS-SERIF BOLD NABLA
+	# <font> 2207 nabla
+1D770	MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA
+	# <font> 03B1 greek small letter alpha
+1D771	MATHEMATICAL SANS-SERIF BOLD SMALL BETA
+	# <font> 03B2 greek small letter beta
+1D772	MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA
+	# <font> 03B3 greek small letter gamma
+1D773	MATHEMATICAL SANS-SERIF BOLD SMALL DELTA
+	# <font> 03B4 greek small letter delta
+1D774	MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON
+	# <font> 03B5 greek small letter epsilon
+1D775	MATHEMATICAL SANS-SERIF BOLD SMALL ZETA
+	# <font> 03B6 greek small letter zeta
+1D776	MATHEMATICAL SANS-SERIF BOLD SMALL ETA
+	# <font> 03B7 greek small letter eta
+1D777	MATHEMATICAL SANS-SERIF BOLD SMALL THETA
+	# <font> 03B8 greek small letter theta
+1D778	MATHEMATICAL SANS-SERIF BOLD SMALL IOTA
+	# <font> 03B9 greek small letter iota
+1D779	MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA
+	# <font> 03BA greek small letter kappa
+1D77A	MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA
+	# <font> 03BB greek small letter lamda
+1D77B	MATHEMATICAL SANS-SERIF BOLD SMALL MU
+	# <font> 03BC greek small letter mu
+1D77C	MATHEMATICAL SANS-SERIF BOLD SMALL NU
+	# <font> 03BD greek small letter nu
+1D77D	MATHEMATICAL SANS-SERIF BOLD SMALL XI
+	# <font> 03BE greek small letter xi
+1D77E	MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON
+	# <font> 03BF greek small letter omicron
+1D77F	MATHEMATICAL SANS-SERIF BOLD SMALL PI
+	# <font> 03C0 greek small letter pi
+1D780	MATHEMATICAL SANS-SERIF BOLD SMALL RHO
+	# <font> 03C1 greek small letter rho
+1D781	MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA
+	# <font> 03C2 greek small letter final sigma
+1D782	MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA
+	# <font> 03C3 greek small letter sigma
+1D783	MATHEMATICAL SANS-SERIF BOLD SMALL TAU
+	# <font> 03C4 greek small letter tau
+1D784	MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON
+	# <font> 03C5 greek small letter upsilon
+1D785	MATHEMATICAL SANS-SERIF BOLD SMALL PHI
+	# <font> 03C6 greek small letter phi
+1D786	MATHEMATICAL SANS-SERIF BOLD SMALL CHI
+	# <font> 03C7 greek small letter chi
+1D787	MATHEMATICAL SANS-SERIF BOLD SMALL PSI
+	# <font> 03C8 greek small letter psi
+1D788	MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+	# <font> 03C9 greek small letter omega
+@		Additional sans-serif bold Greek symbols
+1D789	MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+	# <font> 2202 partial differential
+1D78A	MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL
+	# <font> 03F5 greek lunate epsilon symbol
+1D78B	MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL
+	# <font> 03D1 greek theta symbol
+1D78C	MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL
+	# <font> 03F0 greek kappa symbol
+1D78D	MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL
+	# <font> 03D5 greek phi symbol
+1D78E	MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL
+	# <font> 03F1 greek rho symbol
+1D78F	MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
+	# <font> 03D6 greek pi symbol
+@		Sans-serif bold italic Greek symbols
+1D790	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA
+	# <font> 0391 greek capital letter alpha
+1D791	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA
+	# <font> 0392 greek capital letter beta
+1D792	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA
+	# <font> 0393 greek capital letter gamma
+1D793	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA
+	# <font> 0394 greek capital letter delta
+1D794	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON
+	# <font> 0395 greek capital letter epsilon
+1D795	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA
+	# <font> 0396 greek capital letter zeta
+1D796	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA
+	# <font> 0397 greek capital letter eta
+1D797	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA
+	# <font> 0398 greek capital letter theta
+1D798	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
+	# <font> 0399 greek capital letter iota
+1D799	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA
+	# <font> 039A greek capital letter kappa
+1D79A	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA
+	# <font> 039B greek capital letter lamda
+1D79B	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU
+	# <font> 039C greek capital letter mu
+1D79C	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU
+	# <font> 039D greek capital letter nu
+1D79D	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI
+	# <font> 039E greek capital letter xi
+1D79E	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON
+	# <font> 039F greek capital letter omicron
+1D79F	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI
+	# <font> 03A0 greek capital letter pi
+1D7A0	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO
+	# <font> 03A1 greek capital letter rho
+1D7A1	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL
+	# <font> 03F4 greek capital theta symbol
+1D7A2	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA
+	# <font> 03A3 greek capital letter sigma
+1D7A3	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU
+	# <font> 03A4 greek capital letter tau
+1D7A4	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON
+	# <font> 03A5 greek capital letter upsilon
+1D7A5	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI
+	# <font> 03A6 greek capital letter phi
+1D7A6	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI
+	# <font> 03A7 greek capital letter chi
+1D7A7	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI
+	# <font> 03A8 greek capital letter psi
+1D7A8	MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+	# <font> 03A9 greek capital letter omega
+1D7A9	MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+	# <font> 2207 nabla
+1D7AA	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA
+	# <font> 03B1 greek small letter alpha
+1D7AB	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA
+	# <font> 03B2 greek small letter beta
+1D7AC	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA
+	# <font> 03B3 greek small letter gamma
+1D7AD	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA
+	# <font> 03B4 greek small letter delta
+1D7AE	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON
+	# <font> 03B5 greek small letter epsilon
+1D7AF	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA
+	# <font> 03B6 greek small letter zeta
+1D7B0	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA
+	# <font> 03B7 greek small letter eta
+1D7B1	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA
+	# <font> 03B8 greek small letter theta
+1D7B2	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA
+	# <font> 03B9 greek small letter iota
+1D7B3	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA
+	# <font> 03BA greek small letter kappa
+1D7B4	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA
+	# <font> 03BB greek small letter lamda
+1D7B5	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU
+	# <font> 03BC greek small letter mu
+1D7B6	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU
+	# <font> 03BD greek small letter nu
+1D7B7	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI
+	# <font> 03BE greek small letter xi
+1D7B8	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON
+	# <font> 03BF greek small letter omicron
+1D7B9	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI
+	# <font> 03C0 greek small letter pi
+1D7BA	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO
+	# <font> 03C1 greek small letter rho
+1D7BB	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA
+	# <font> 03C2 greek small letter final sigma
+1D7BC	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA
+	# <font> 03C3 greek small letter sigma
+1D7BD	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU
+	# <font> 03C4 greek small letter tau
+1D7BE	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON
+	# <font> 03C5 greek small letter upsilon
+1D7BF	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI
+	# <font> 03C6 greek small letter phi
+1D7C0	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI
+	# <font> 03C7 greek small letter chi
+1D7C1	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI
+	# <font> 03C8 greek small letter psi
+1D7C2	MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+	# <font> 03C9 greek small letter omega
+@		Additional sans-serif bold italic Greek symbols
+1D7C3	MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+	# <font> 2202 partial differential
+1D7C4	MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL
+	# <font> 03F5 greek lunate epsilon symbol
+1D7C5	MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL
+	# <font> 03D1 greek theta symbol
+1D7C6	MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL
+	# <font> 03F0 greek kappa symbol
+1D7C7	MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL
+	# <font> 03D5 greek phi symbol
+1D7C8	MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL
+	# <font> 03F1 greek rho symbol
+1D7C9	MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+	# <font> 03D6 greek pi symbol
+@		Bold digits
+1D7CE	MATHEMATICAL BOLD DIGIT ZERO
+	# <font> 0030 digit zero
+1D7CF	MATHEMATICAL BOLD DIGIT ONE
+	# <font> 0031 digit one
+1D7D0	MATHEMATICAL BOLD DIGIT TWO
+	# <font> 0032 digit two
+1D7D1	MATHEMATICAL BOLD DIGIT THREE
+	# <font> 0033 digit three
+1D7D2	MATHEMATICAL BOLD DIGIT FOUR
+	# <font> 0034 digit four
+1D7D3	MATHEMATICAL BOLD DIGIT FIVE
+	# <font> 0035 digit five
+1D7D4	MATHEMATICAL BOLD DIGIT SIX
+	# <font> 0036 digit six
+1D7D5	MATHEMATICAL BOLD DIGIT SEVEN
+	# <font> 0037 digit seven
+1D7D6	MATHEMATICAL BOLD DIGIT EIGHT
+	# <font> 0038 digit eight
+1D7D7	MATHEMATICAL BOLD DIGIT NINE
+	# <font> 0039 digit nine
+@		Double-struck digits
+1D7D8	MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
+	# <font> 0030 digit zero
+1D7D9	MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
+	# <font> 0031 digit one
+1D7DA	MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
+	# <font> 0032 digit two
+1D7DB	MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
+	# <font> 0033 digit three
+1D7DC	MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
+	# <font> 0034 digit four
+1D7DD	MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
+	# <font> 0035 digit five
+1D7DE	MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
+	# <font> 0036 digit six
+1D7DF	MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
+	# <font> 0037 digit seven
+1D7E0	MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
+	# <font> 0038 digit eight
+1D7E1	MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
+	# <font> 0039 digit nine
+@		Sans-serif digits
+1D7E2	MATHEMATICAL SANS-SERIF DIGIT ZERO
+	# <font> 0030 digit zero
+1D7E3	MATHEMATICAL SANS-SERIF DIGIT ONE
+	# <font> 0031 digit one
+1D7E4	MATHEMATICAL SANS-SERIF DIGIT TWO
+	# <font> 0032 digit two
+1D7E5	MATHEMATICAL SANS-SERIF DIGIT THREE
+	# <font> 0033 digit three
+1D7E6	MATHEMATICAL SANS-SERIF DIGIT FOUR
+	# <font> 0034 digit four
+1D7E7	MATHEMATICAL SANS-SERIF DIGIT FIVE
+	# <font> 0035 digit five
+1D7E8	MATHEMATICAL SANS-SERIF DIGIT SIX
+	# <font> 0036 digit six
+1D7E9	MATHEMATICAL SANS-SERIF DIGIT SEVEN
+	# <font> 0037 digit seven
+1D7EA	MATHEMATICAL SANS-SERIF DIGIT EIGHT
+	# <font> 0038 digit eight
+1D7EB	MATHEMATICAL SANS-SERIF DIGIT NINE
+	# <font> 0039 digit nine
+@		Sans-serif bold digits
+1D7EC	MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
+	# <font> 0030 digit zero
+1D7ED	MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
+	# <font> 0031 digit one
+1D7EE	MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
+	# <font> 0032 digit two
+1D7EF	MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
+	# <font> 0033 digit three
+1D7F0	MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
+	# <font> 0034 digit four
+1D7F1	MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
+	# <font> 0035 digit five
+1D7F2	MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
+	# <font> 0036 digit six
+1D7F3	MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
+	# <font> 0037 digit seven
+1D7F4	MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
+	# <font> 0038 digit eight
+1D7F5	MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
+	# <font> 0039 digit nine
+@		Monospace digits
+1D7F6	MATHEMATICAL MONOSPACE DIGIT ZERO
+	# <font> 0030 digit zero
+1D7F7	MATHEMATICAL MONOSPACE DIGIT ONE
+	# <font> 0031 digit one
+1D7F8	MATHEMATICAL MONOSPACE DIGIT TWO
+	# <font> 0032 digit two
+1D7F9	MATHEMATICAL MONOSPACE DIGIT THREE
+	# <font> 0033 digit three
+1D7FA	MATHEMATICAL MONOSPACE DIGIT FOUR
+	# <font> 0034 digit four
+1D7FB	MATHEMATICAL MONOSPACE DIGIT FIVE
+	# <font> 0035 digit five
+1D7FC	MATHEMATICAL MONOSPACE DIGIT SIX
+	# <font> 0036 digit six
+1D7FD	MATHEMATICAL MONOSPACE DIGIT SEVEN
+	# <font> 0037 digit seven
+1D7FE	MATHEMATICAL MONOSPACE DIGIT EIGHT
+	# <font> 0038 digit eight
+1D7FF	MATHEMATICAL MONOSPACE DIGIT NINE
+	# <font> 0039 digit nine
+@@	1FF80	Unassigned	1FFFF
+@		Not character codes
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+1FFFE	<not a character>
+	* the value 1FFFE is guaranteed not to be a Unicode character at all
+1FFFF	<not a character>
+	* the value 1FFFF is guaranteed not to be a Unicode character at all
+@@	20000	CJK Unified Ideographs Extension B	2A6D6
+@@	2F800	CJK Compatibility Ideographs Supplement	2FA1F
+@		Duplicate characters from CNS 11643-1992
+2F800	CJK COMPATIBILITY IDEOGRAPH-2F800
+	: 4E3D
+2F801	CJK COMPATIBILITY IDEOGRAPH-2F801
+	: 4E38
+2F802	CJK COMPATIBILITY IDEOGRAPH-2F802
+	: 4E41
+2F803	CJK COMPATIBILITY IDEOGRAPH-2F803
+	: 20122
+2F804	CJK COMPATIBILITY IDEOGRAPH-2F804
+	: 4F60
+2F805	CJK COMPATIBILITY IDEOGRAPH-2F805
+	: 4FAE
+2F806	CJK COMPATIBILITY IDEOGRAPH-2F806
+	: 4FBB
+2F807	CJK COMPATIBILITY IDEOGRAPH-2F807
+	: 5002
+2F808	CJK COMPATIBILITY IDEOGRAPH-2F808
+	: 507A
+2F809	CJK COMPATIBILITY IDEOGRAPH-2F809
+	: 5099
+2F80A	CJK COMPATIBILITY IDEOGRAPH-2F80A
+	: 50E7
+2F80B	CJK COMPATIBILITY IDEOGRAPH-2F80B
+	: 50CF
+2F80C	CJK COMPATIBILITY IDEOGRAPH-2F80C
+	: 349E
+2F80D	CJK COMPATIBILITY IDEOGRAPH-2F80D
+	x 5145
+	: 2063A
+2F80E	CJK COMPATIBILITY IDEOGRAPH-2F80E
+	: 514D
+2F80F	CJK COMPATIBILITY IDEOGRAPH-2F80F
+	: 5154
+2F810	CJK COMPATIBILITY IDEOGRAPH-2F810
+	: 5164
+2F811	CJK COMPATIBILITY IDEOGRAPH-2F811
+	: 5177
+2F812	CJK COMPATIBILITY IDEOGRAPH-2F812
+	: 2051C
+2F813	CJK COMPATIBILITY IDEOGRAPH-2F813
+	: 34B9
+2F814	CJK COMPATIBILITY IDEOGRAPH-2F814
+	x 5185
+	: 5167
+2F815	CJK COMPATIBILITY IDEOGRAPH-2F815
+	: 518D
+2F816	CJK COMPATIBILITY IDEOGRAPH-2F816
+	: 2054B
+2F817	CJK COMPATIBILITY IDEOGRAPH-2F817
+	: 5197
+2F818	CJK COMPATIBILITY IDEOGRAPH-2F818
+	: 51A4
+2F819	CJK COMPATIBILITY IDEOGRAPH-2F819
+	: 4ECC
+2F81A	CJK COMPATIBILITY IDEOGRAPH-2F81A
+	: 51AC
+2F81B	CJK COMPATIBILITY IDEOGRAPH-2F81B
+	: 51B5
+2F81C	CJK COMPATIBILITY IDEOGRAPH-2F81C
+	: 291DF
+2F81D	CJK COMPATIBILITY IDEOGRAPH-2F81D
+	: 51F5
+2F81E	CJK COMPATIBILITY IDEOGRAPH-2F81E
+	: 5203
+2F81F	CJK COMPATIBILITY IDEOGRAPH-2F81F
+	: 34DF
+2F820	CJK COMPATIBILITY IDEOGRAPH-2F820
+	: 523B
+2F821	CJK COMPATIBILITY IDEOGRAPH-2F821
+	: 5246
+2F822	CJK COMPATIBILITY IDEOGRAPH-2F822
+	: 5272
+2F823	CJK COMPATIBILITY IDEOGRAPH-2F823
+	: 5277
+2F824	CJK COMPATIBILITY IDEOGRAPH-2F824
+	: 3515
+2F825	CJK COMPATIBILITY IDEOGRAPH-2F825
+	: 52C7
+2F826	CJK COMPATIBILITY IDEOGRAPH-2F826
+	: 52C9
+2F827	CJK COMPATIBILITY IDEOGRAPH-2F827
+	: 52E4
+2F828	CJK COMPATIBILITY IDEOGRAPH-2F828
+	: 52FA
+2F829	CJK COMPATIBILITY IDEOGRAPH-2F829
+	: 5305
+2F82A	CJK COMPATIBILITY IDEOGRAPH-2F82A
+	: 5306
+2F82B	CJK COMPATIBILITY IDEOGRAPH-2F82B
+	: 5317
+2F82C	CJK COMPATIBILITY IDEOGRAPH-2F82C
+	: 5349
+2F82D	CJK COMPATIBILITY IDEOGRAPH-2F82D
+	: 5351
+2F82E	CJK COMPATIBILITY IDEOGRAPH-2F82E
+	: 535A
+2F82F	CJK COMPATIBILITY IDEOGRAPH-2F82F
+	: 5373
+2F830	CJK COMPATIBILITY IDEOGRAPH-2F830
+	: 537D
+2F831	CJK COMPATIBILITY IDEOGRAPH-2F831
+	: 537F
+2F832	CJK COMPATIBILITY IDEOGRAPH-2F832
+	: 537F
+2F833	CJK COMPATIBILITY IDEOGRAPH-2F833
+	: 537F
+2F834	CJK COMPATIBILITY IDEOGRAPH-2F834
+	: 20A2C
+2F835	CJK COMPATIBILITY IDEOGRAPH-2F835
+	: 7070
+2F836	CJK COMPATIBILITY IDEOGRAPH-2F836
+	: 53CA
+2F837	CJK COMPATIBILITY IDEOGRAPH-2F837
+	: 53DF
+2F838	CJK COMPATIBILITY IDEOGRAPH-2F838
+	: 20B63
+2F839	CJK COMPATIBILITY IDEOGRAPH-2F839
+	: 53EB
+2F83A	CJK COMPATIBILITY IDEOGRAPH-2F83A
+	: 53F1
+2F83B	CJK COMPATIBILITY IDEOGRAPH-2F83B
+	: 5406
+2F83C	CJK COMPATIBILITY IDEOGRAPH-2F83C
+	: 549E
+2F83D	CJK COMPATIBILITY IDEOGRAPH-2F83D
+	: 5438
+2F83E	CJK COMPATIBILITY IDEOGRAPH-2F83E
+	: 5448
+2F83F	CJK COMPATIBILITY IDEOGRAPH-2F83F
+	: 5468
+2F840	CJK COMPATIBILITY IDEOGRAPH-2F840
+	: 54A2
+2F841	CJK COMPATIBILITY IDEOGRAPH-2F841
+	: 54F6
+2F842	CJK COMPATIBILITY IDEOGRAPH-2F842
+	: 5510
+2F843	CJK COMPATIBILITY IDEOGRAPH-2F843
+	: 5553
+2F844	CJK COMPATIBILITY IDEOGRAPH-2F844
+	: 5563
+2F845	CJK COMPATIBILITY IDEOGRAPH-2F845
+	: 5584
+2F846	CJK COMPATIBILITY IDEOGRAPH-2F846
+	: 5584
+2F847	CJK COMPATIBILITY IDEOGRAPH-2F847
+	: 5599
+2F848	CJK COMPATIBILITY IDEOGRAPH-2F848
+	: 55AB
+2F849	CJK COMPATIBILITY IDEOGRAPH-2F849
+	: 55B3
+2F84A	CJK COMPATIBILITY IDEOGRAPH-2F84A
+	: 55C2
+2F84B	CJK COMPATIBILITY IDEOGRAPH-2F84B
+	: 5716
+2F84C	CJK COMPATIBILITY IDEOGRAPH-2F84C
+	: 5606
+2F84D	CJK COMPATIBILITY IDEOGRAPH-2F84D
+	: 5717
+2F84E	CJK COMPATIBILITY IDEOGRAPH-2F84E
+	: 5651
+2F84F	CJK COMPATIBILITY IDEOGRAPH-2F84F
+	: 5674
+2F850	CJK COMPATIBILITY IDEOGRAPH-2F850
+	: 5207
+2F851	CJK COMPATIBILITY IDEOGRAPH-2F851
+	: 58EE
+2F852	CJK COMPATIBILITY IDEOGRAPH-2F852
+	: 57CE
+2F853	CJK COMPATIBILITY IDEOGRAPH-2F853
+	: 57F4
+2F854	CJK COMPATIBILITY IDEOGRAPH-2F854
+	: 580D
+2F855	CJK COMPATIBILITY IDEOGRAPH-2F855
+	: 578B
+2F856	CJK COMPATIBILITY IDEOGRAPH-2F856
+	: 5832
+2F857	CJK COMPATIBILITY IDEOGRAPH-2F857
+	: 5831
+2F858	CJK COMPATIBILITY IDEOGRAPH-2F858
+	: 58AC
+2F859	CJK COMPATIBILITY IDEOGRAPH-2F859
+	: 214E4
+2F85A	CJK COMPATIBILITY IDEOGRAPH-2F85A
+	x 58F3
+	: 58F2
+2F85B	CJK COMPATIBILITY IDEOGRAPH-2F85B
+	x 21533
+	: 58F7
+2F85C	CJK COMPATIBILITY IDEOGRAPH-2F85C
+	: 5906
+2F85D	CJK COMPATIBILITY IDEOGRAPH-2F85D
+	: 591A
+2F85E	CJK COMPATIBILITY IDEOGRAPH-2F85E
+	: 5922
+2F85F	CJK COMPATIBILITY IDEOGRAPH-2F85F
+	: 5962
+2F860	CJK COMPATIBILITY IDEOGRAPH-2F860
+	: 216A8
+2F861	CJK COMPATIBILITY IDEOGRAPH-2F861
+	: 216EA
+2F862	CJK COMPATIBILITY IDEOGRAPH-2F862
+	: 59EC
+2F863	CJK COMPATIBILITY IDEOGRAPH-2F863
+	: 5A1B
+2F864	CJK COMPATIBILITY IDEOGRAPH-2F864
+	: 5A27
+2F865	CJK COMPATIBILITY IDEOGRAPH-2F865
+	: 59D8
+2F866	CJK COMPATIBILITY IDEOGRAPH-2F866
+	: 5A66
+2F867	CJK COMPATIBILITY IDEOGRAPH-2F867
+	: 36EE
+2F868	CJK COMPATIBILITY IDEOGRAPH-2F868
+	: 36FC
+2F869	CJK COMPATIBILITY IDEOGRAPH-2F869
+	: 5B08
+2F86A	CJK COMPATIBILITY IDEOGRAPH-2F86A
+	: 5B3E
+2F86B	CJK COMPATIBILITY IDEOGRAPH-2F86B
+	: 5B3E
+2F86C	CJK COMPATIBILITY IDEOGRAPH-2F86C
+	: 219C8
+2F86D	CJK COMPATIBILITY IDEOGRAPH-2F86D
+	: 5BC3
+2F86E	CJK COMPATIBILITY IDEOGRAPH-2F86E
+	: 5BD8
+2F86F	CJK COMPATIBILITY IDEOGRAPH-2F86F
+	: 5BE7
+2F870	CJK COMPATIBILITY IDEOGRAPH-2F870
+	: 5BF3
+2F871	CJK COMPATIBILITY IDEOGRAPH-2F871
+	: 21B18
+2F872	CJK COMPATIBILITY IDEOGRAPH-2F872
+	: 5BFF
+2F873	CJK COMPATIBILITY IDEOGRAPH-2F873
+	: 5C06
+2F874	CJK COMPATIBILITY IDEOGRAPH-2F874
+	: 5F53
+2F875	CJK COMPATIBILITY IDEOGRAPH-2F875
+	: 5C22
+2F876	CJK COMPATIBILITY IDEOGRAPH-2F876
+	: 3781
+2F877	CJK COMPATIBILITY IDEOGRAPH-2F877
+	: 5C60
+2F878	CJK COMPATIBILITY IDEOGRAPH-2F878
+	: 5C6E
+2F879	CJK COMPATIBILITY IDEOGRAPH-2F879
+	: 5CC0
+2F87A	CJK COMPATIBILITY IDEOGRAPH-2F87A
+	: 5C8D
+2F87B	CJK COMPATIBILITY IDEOGRAPH-2F87B
+	: 21DE4
+2F87C	CJK COMPATIBILITY IDEOGRAPH-2F87C
+	: 5D43
+2F87D	CJK COMPATIBILITY IDEOGRAPH-2F87D
+	: 21DE6
+2F87E	CJK COMPATIBILITY IDEOGRAPH-2F87E
+	: 5D6E
+2F87F	CJK COMPATIBILITY IDEOGRAPH-2F87F
+	: 5D6B
+2F880	CJK COMPATIBILITY IDEOGRAPH-2F880
+	: 5D7C
+2F881	CJK COMPATIBILITY IDEOGRAPH-2F881
+	: 5DE1
+2F882	CJK COMPATIBILITY IDEOGRAPH-2F882
+	: 5DE2
+2F883	CJK COMPATIBILITY IDEOGRAPH-2F883
+	: 382F
+2F884	CJK COMPATIBILITY IDEOGRAPH-2F884
+	: 5DFD
+2F885	CJK COMPATIBILITY IDEOGRAPH-2F885
+	: 5E28
+2F886	CJK COMPATIBILITY IDEOGRAPH-2F886
+	: 5E3D
+2F887	CJK COMPATIBILITY IDEOGRAPH-2F887
+	: 5E69
+2F888	CJK COMPATIBILITY IDEOGRAPH-2F888
+	: 3862
+2F889	CJK COMPATIBILITY IDEOGRAPH-2F889
+	: 22183
+2F88A	CJK COMPATIBILITY IDEOGRAPH-2F88A
+	: 387C
+2F88B	CJK COMPATIBILITY IDEOGRAPH-2F88B
+	: 5EB0
+2F88C	CJK COMPATIBILITY IDEOGRAPH-2F88C
+	: 5EB3
+2F88D	CJK COMPATIBILITY IDEOGRAPH-2F88D
+	: 5EB6
+2F88E	CJK COMPATIBILITY IDEOGRAPH-2F88E
+	: 5ECA
+2F88F	CJK COMPATIBILITY IDEOGRAPH-2F88F
+	: 2A392
+2F890	CJK COMPATIBILITY IDEOGRAPH-2F890
+	: 5EFE
+2F891	CJK COMPATIBILITY IDEOGRAPH-2F891
+	: 22331
+2F892	CJK COMPATIBILITY IDEOGRAPH-2F892
+	: 22331
+2F893	CJK COMPATIBILITY IDEOGRAPH-2F893
+	: 8201
+2F894	CJK COMPATIBILITY IDEOGRAPH-2F894
+	: 5F22
+2F895	CJK COMPATIBILITY IDEOGRAPH-2F895
+	: 5F22
+2F896	CJK COMPATIBILITY IDEOGRAPH-2F896
+	: 38C7
+2F897	CJK COMPATIBILITY IDEOGRAPH-2F897
+	: 232B8
+2F898	CJK COMPATIBILITY IDEOGRAPH-2F898
+	: 261DA
+2F899	CJK COMPATIBILITY IDEOGRAPH-2F899
+	: 5F62
+2F89A	CJK COMPATIBILITY IDEOGRAPH-2F89A
+	: 5F6B
+2F89B	CJK COMPATIBILITY IDEOGRAPH-2F89B
+	: 38E3
+2F89C	CJK COMPATIBILITY IDEOGRAPH-2F89C
+	x 22505
+	: 5F9A
+2F89D	CJK COMPATIBILITY IDEOGRAPH-2F89D
+	: 5FCD
+2F89E	CJK COMPATIBILITY IDEOGRAPH-2F89E
+	: 5FD7
+2F89F	CJK COMPATIBILITY IDEOGRAPH-2F89F
+	: 5FF9
+2F8A0	CJK COMPATIBILITY IDEOGRAPH-2F8A0
+	: 6081
+2F8A1	CJK COMPATIBILITY IDEOGRAPH-2F8A1
+	: 393A
+2F8A2	CJK COMPATIBILITY IDEOGRAPH-2F8A2
+	: 391C
+2F8A3	CJK COMPATIBILITY IDEOGRAPH-2F8A3
+	: 6094
+2F8A4	CJK COMPATIBILITY IDEOGRAPH-2F8A4
+	: 226D4
+2F8A5	CJK COMPATIBILITY IDEOGRAPH-2F8A5
+	: 60C7
+2F8A6	CJK COMPATIBILITY IDEOGRAPH-2F8A6
+	: 6148
+2F8A7	CJK COMPATIBILITY IDEOGRAPH-2F8A7
+	: 614C
+2F8A8	CJK COMPATIBILITY IDEOGRAPH-2F8A8
+	: 614E
+2F8A9	CJK COMPATIBILITY IDEOGRAPH-2F8A9
+	: 614C
+2F8AA	CJK COMPATIBILITY IDEOGRAPH-2F8AA
+	: 617A
+2F8AB	CJK COMPATIBILITY IDEOGRAPH-2F8AB
+	: 618E
+2F8AC	CJK COMPATIBILITY IDEOGRAPH-2F8AC
+	: 61B2
+2F8AD	CJK COMPATIBILITY IDEOGRAPH-2F8AD
+	: 61A4
+2F8AE	CJK COMPATIBILITY IDEOGRAPH-2F8AE
+	: 61AF
+2F8AF	CJK COMPATIBILITY IDEOGRAPH-2F8AF
+	: 61DE
+2F8B0	CJK COMPATIBILITY IDEOGRAPH-2F8B0
+	: 61F2
+2F8B1	CJK COMPATIBILITY IDEOGRAPH-2F8B1
+	: 61F6
+2F8B2	CJK COMPATIBILITY IDEOGRAPH-2F8B2
+	: 6210
+2F8B3	CJK COMPATIBILITY IDEOGRAPH-2F8B3
+	: 621B
+2F8B4	CJK COMPATIBILITY IDEOGRAPH-2F8B4
+	: 625D
+2F8B5	CJK COMPATIBILITY IDEOGRAPH-2F8B5
+	: 62B1
+2F8B6	CJK COMPATIBILITY IDEOGRAPH-2F8B6
+	: 62D4
+2F8B7	CJK COMPATIBILITY IDEOGRAPH-2F8B7
+	: 6350
+2F8B8	CJK COMPATIBILITY IDEOGRAPH-2F8B8
+	: 22B0C
+2F8B9	CJK COMPATIBILITY IDEOGRAPH-2F8B9
+	: 633D
+2F8BA	CJK COMPATIBILITY IDEOGRAPH-2F8BA
+	: 62FC
+2F8BB	CJK COMPATIBILITY IDEOGRAPH-2F8BB
+	: 6368
+2F8BC	CJK COMPATIBILITY IDEOGRAPH-2F8BC
+	: 6383
+2F8BD	CJK COMPATIBILITY IDEOGRAPH-2F8BD
+	: 63E4
+2F8BE	CJK COMPATIBILITY IDEOGRAPH-2F8BE
+	: 22BF1
+2F8BF	CJK COMPATIBILITY IDEOGRAPH-2F8BF
+	: 6422
+2F8C0	CJK COMPATIBILITY IDEOGRAPH-2F8C0
+	: 63C5
+2F8C1	CJK COMPATIBILITY IDEOGRAPH-2F8C1
+	: 63A9
+2F8C2	CJK COMPATIBILITY IDEOGRAPH-2F8C2
+	: 3A2E
+2F8C3	CJK COMPATIBILITY IDEOGRAPH-2F8C3
+	: 6469
+2F8C4	CJK COMPATIBILITY IDEOGRAPH-2F8C4
+	: 647E
+2F8C5	CJK COMPATIBILITY IDEOGRAPH-2F8C5
+	: 649D
+2F8C6	CJK COMPATIBILITY IDEOGRAPH-2F8C6
+	: 6477
+2F8C7	CJK COMPATIBILITY IDEOGRAPH-2F8C7
+	: 3A6C
+2F8C8	CJK COMPATIBILITY IDEOGRAPH-2F8C8
+	: 654F
+2F8C9	CJK COMPATIBILITY IDEOGRAPH-2F8C9
+	: 656C
+2F8CA	CJK COMPATIBILITY IDEOGRAPH-2F8CA
+	: 2300A
+2F8CB	CJK COMPATIBILITY IDEOGRAPH-2F8CB
+	: 65E3
+2F8CC	CJK COMPATIBILITY IDEOGRAPH-2F8CC
+	: 66F8
+2F8CD	CJK COMPATIBILITY IDEOGRAPH-2F8CD
+	: 6649
+2F8CE	CJK COMPATIBILITY IDEOGRAPH-2F8CE
+	: 3B19
+2F8CF	CJK COMPATIBILITY IDEOGRAPH-2F8CF
+	: 6691
+2F8D0	CJK COMPATIBILITY IDEOGRAPH-2F8D0
+	: 3B08
+2F8D1	CJK COMPATIBILITY IDEOGRAPH-2F8D1
+	: 3AE4
+2F8D2	CJK COMPATIBILITY IDEOGRAPH-2F8D2
+	: 5192
+2F8D3	CJK COMPATIBILITY IDEOGRAPH-2F8D3
+	: 5195
+2F8D4	CJK COMPATIBILITY IDEOGRAPH-2F8D4
+	: 6700
+2F8D5	CJK COMPATIBILITY IDEOGRAPH-2F8D5
+	: 669C
+2F8D6	CJK COMPATIBILITY IDEOGRAPH-2F8D6
+	: 80AD
+2F8D7	CJK COMPATIBILITY IDEOGRAPH-2F8D7
+	: 43D9
+2F8D8	CJK COMPATIBILITY IDEOGRAPH-2F8D8
+	: 6717
+2F8D9	CJK COMPATIBILITY IDEOGRAPH-2F8D9
+	: 671B
+2F8DA	CJK COMPATIBILITY IDEOGRAPH-2F8DA
+	: 6721
+2F8DB	CJK COMPATIBILITY IDEOGRAPH-2F8DB
+	: 675E
+2F8DC	CJK COMPATIBILITY IDEOGRAPH-2F8DC
+	: 6753
+2F8DD	CJK COMPATIBILITY IDEOGRAPH-2F8DD
+	: 233C3
+2F8DE	CJK COMPATIBILITY IDEOGRAPH-2F8DE
+	: 3B49
+2F8DF	CJK COMPATIBILITY IDEOGRAPH-2F8DF
+	: 67FA
+2F8E0	CJK COMPATIBILITY IDEOGRAPH-2F8E0
+	: 6785
+2F8E1	CJK COMPATIBILITY IDEOGRAPH-2F8E1
+	: 6852
+2F8E2	CJK COMPATIBILITY IDEOGRAPH-2F8E2
+	: 6885
+2F8E3	CJK COMPATIBILITY IDEOGRAPH-2F8E3
+	: 2346D
+2F8E4	CJK COMPATIBILITY IDEOGRAPH-2F8E4
+	: 688E
+2F8E5	CJK COMPATIBILITY IDEOGRAPH-2F8E5
+	: 681F
+2F8E6	CJK COMPATIBILITY IDEOGRAPH-2F8E6
+	: 6914
+2F8E7	CJK COMPATIBILITY IDEOGRAPH-2F8E7
+	: 3B9D
+2F8E8	CJK COMPATIBILITY IDEOGRAPH-2F8E8
+	: 6942
+2F8E9	CJK COMPATIBILITY IDEOGRAPH-2F8E9
+	: 69A3
+2F8EA	CJK COMPATIBILITY IDEOGRAPH-2F8EA
+	: 69EA
+2F8EB	CJK COMPATIBILITY IDEOGRAPH-2F8EB
+	: 6AA8
+2F8EC	CJK COMPATIBILITY IDEOGRAPH-2F8EC
+	: 236A3
+2F8ED	CJK COMPATIBILITY IDEOGRAPH-2F8ED
+	: 6ADB
+2F8EE	CJK COMPATIBILITY IDEOGRAPH-2F8EE
+	: 3C18
+2F8EF	CJK COMPATIBILITY IDEOGRAPH-2F8EF
+	: 6B21
+2F8F0	CJK COMPATIBILITY IDEOGRAPH-2F8F0
+	: 238A7
+2F8F1	CJK COMPATIBILITY IDEOGRAPH-2F8F1
+	: 6B54
+2F8F2	CJK COMPATIBILITY IDEOGRAPH-2F8F2
+	: 3C4E
+2F8F3	CJK COMPATIBILITY IDEOGRAPH-2F8F3
+	: 6B72
+2F8F4	CJK COMPATIBILITY IDEOGRAPH-2F8F4
+	: 6B9F
+2F8F5	CJK COMPATIBILITY IDEOGRAPH-2F8F5
+	: 6BBA
+2F8F6	CJK COMPATIBILITY IDEOGRAPH-2F8F6
+	: 6BBB
+2F8F7	CJK COMPATIBILITY IDEOGRAPH-2F8F7
+	: 23A8D
+2F8F8	CJK COMPATIBILITY IDEOGRAPH-2F8F8
+	: 21D0B
+2F8F9	CJK COMPATIBILITY IDEOGRAPH-2F8F9
+	: 23AFA
+2F8FA	CJK COMPATIBILITY IDEOGRAPH-2F8FA
+	: 6C4E
+2F8FB	CJK COMPATIBILITY IDEOGRAPH-2F8FB
+	: 23CBC
+2F8FC	CJK COMPATIBILITY IDEOGRAPH-2F8FC
+	: 6CBF
+2F8FD	CJK COMPATIBILITY IDEOGRAPH-2F8FD
+	: 6CCD
+2F8FE	CJK COMPATIBILITY IDEOGRAPH-2F8FE
+	: 6C67
+2F8FF	CJK COMPATIBILITY IDEOGRAPH-2F8FF
+	: 6D16
+2F900	CJK COMPATIBILITY IDEOGRAPH-2F900
+	: 6D3E
+2F901	CJK COMPATIBILITY IDEOGRAPH-2F901
+	: 6D77
+2F902	CJK COMPATIBILITY IDEOGRAPH-2F902
+	: 6D41
+2F903	CJK COMPATIBILITY IDEOGRAPH-2F903
+	: 6D69
+2F904	CJK COMPATIBILITY IDEOGRAPH-2F904
+	: 6D78
+2F905	CJK COMPATIBILITY IDEOGRAPH-2F905
+	: 6D85
+2F906	CJK COMPATIBILITY IDEOGRAPH-2F906
+	: 23D1E
+2F907	CJK COMPATIBILITY IDEOGRAPH-2F907
+	: 6D34
+2F908	CJK COMPATIBILITY IDEOGRAPH-2F908
+	: 6E2F
+2F909	CJK COMPATIBILITY IDEOGRAPH-2F909
+	: 6E6E
+2F90A	CJK COMPATIBILITY IDEOGRAPH-2F90A
+	: 3D33
+2F90B	CJK COMPATIBILITY IDEOGRAPH-2F90B
+	: 6ECB
+2F90C	CJK COMPATIBILITY IDEOGRAPH-2F90C
+	: 6EC7
+2F90D	CJK COMPATIBILITY IDEOGRAPH-2F90D
+	: 23ED1
+2F90E	CJK COMPATIBILITY IDEOGRAPH-2F90E
+	: 6DF9
+2F90F	CJK COMPATIBILITY IDEOGRAPH-2F90F
+	: 6F6E
+2F910	CJK COMPATIBILITY IDEOGRAPH-2F910
+	: 23F5E
+2F911	CJK COMPATIBILITY IDEOGRAPH-2F911
+	: 23F8E
+2F912	CJK COMPATIBILITY IDEOGRAPH-2F912
+	: 6FC6
+2F913	CJK COMPATIBILITY IDEOGRAPH-2F913
+	: 7039
+2F914	CJK COMPATIBILITY IDEOGRAPH-2F914
+	: 701E
+2F915	CJK COMPATIBILITY IDEOGRAPH-2F915
+	: 701B
+2F916	CJK COMPATIBILITY IDEOGRAPH-2F916
+	: 3D96
+2F917	CJK COMPATIBILITY IDEOGRAPH-2F917
+	: 704A
+2F918	CJK COMPATIBILITY IDEOGRAPH-2F918
+	: 707D
+2F919	CJK COMPATIBILITY IDEOGRAPH-2F919
+	: 7077
+2F91A	CJK COMPATIBILITY IDEOGRAPH-2F91A
+	: 70AD
+2F91B	CJK COMPATIBILITY IDEOGRAPH-2F91B
+	: 20525
+2F91C	CJK COMPATIBILITY IDEOGRAPH-2F91C
+	: 7145
+2F91D	CJK COMPATIBILITY IDEOGRAPH-2F91D
+	: 24263
+2F91E	CJK COMPATIBILITY IDEOGRAPH-2F91E
+	: 719C
+2F91F	CJK COMPATIBILITY IDEOGRAPH-2F91F
+	: 243AB
+2F920	CJK COMPATIBILITY IDEOGRAPH-2F920
+	: 7228
+2F921	CJK COMPATIBILITY IDEOGRAPH-2F921
+	: 7235
+2F922	CJK COMPATIBILITY IDEOGRAPH-2F922
+	: 7250
+2F923	CJK COMPATIBILITY IDEOGRAPH-2F923
+	: 24608
+2F924	CJK COMPATIBILITY IDEOGRAPH-2F924
+	: 7280
+2F925	CJK COMPATIBILITY IDEOGRAPH-2F925
+	: 7295
+2F926	CJK COMPATIBILITY IDEOGRAPH-2F926
+	: 24735
+2F927	CJK COMPATIBILITY IDEOGRAPH-2F927
+	: 24814
+2F928	CJK COMPATIBILITY IDEOGRAPH-2F928
+	: 737A
+2F929	CJK COMPATIBILITY IDEOGRAPH-2F929
+	: 738B
+2F92A	CJK COMPATIBILITY IDEOGRAPH-2F92A
+	: 3EAC
+2F92B	CJK COMPATIBILITY IDEOGRAPH-2F92B
+	: 73A5
+2F92C	CJK COMPATIBILITY IDEOGRAPH-2F92C
+	: 3EB8
+2F92D	CJK COMPATIBILITY IDEOGRAPH-2F92D
+	: 3EB8
+2F92E	CJK COMPATIBILITY IDEOGRAPH-2F92E
+	: 7447
+2F92F	CJK COMPATIBILITY IDEOGRAPH-2F92F
+	: 745C
+2F930	CJK COMPATIBILITY IDEOGRAPH-2F930
+	: 7471
+2F931	CJK COMPATIBILITY IDEOGRAPH-2F931
+	: 7485
+2F932	CJK COMPATIBILITY IDEOGRAPH-2F932
+	: 74CA
+2F933	CJK COMPATIBILITY IDEOGRAPH-2F933
+	: 3F1B
+2F934	CJK COMPATIBILITY IDEOGRAPH-2F934
+	: 7524
+2F935	CJK COMPATIBILITY IDEOGRAPH-2F935
+	: 24C36
+2F936	CJK COMPATIBILITY IDEOGRAPH-2F936
+	: 753E
+2F937	CJK COMPATIBILITY IDEOGRAPH-2F937
+	: 24C92
+2F938	CJK COMPATIBILITY IDEOGRAPH-2F938
+	: 7570
+2F939	CJK COMPATIBILITY IDEOGRAPH-2F939
+	: 2219F
+2F93A	CJK COMPATIBILITY IDEOGRAPH-2F93A
+	: 7610
+2F93B	CJK COMPATIBILITY IDEOGRAPH-2F93B
+	: 24FA1
+2F93C	CJK COMPATIBILITY IDEOGRAPH-2F93C
+	: 24FB8
+2F93D	CJK COMPATIBILITY IDEOGRAPH-2F93D
+	: 25044
+2F93E	CJK COMPATIBILITY IDEOGRAPH-2F93E
+	: 3FFC
+2F93F	CJK COMPATIBILITY IDEOGRAPH-2F93F
+	: 4008
+2F940	CJK COMPATIBILITY IDEOGRAPH-2F940
+	: 76F4
+2F941	CJK COMPATIBILITY IDEOGRAPH-2F941
+	: 250F3
+2F942	CJK COMPATIBILITY IDEOGRAPH-2F942
+	: 250F2
+2F943	CJK COMPATIBILITY IDEOGRAPH-2F943
+	: 25119
+2F944	CJK COMPATIBILITY IDEOGRAPH-2F944
+	: 25133
+2F945	CJK COMPATIBILITY IDEOGRAPH-2F945
+	: 771E
+2F946	CJK COMPATIBILITY IDEOGRAPH-2F946
+	: 771F
+2F947	CJK COMPATIBILITY IDEOGRAPH-2F947
+	: 771F
+2F948	CJK COMPATIBILITY IDEOGRAPH-2F948
+	: 774A
+2F949	CJK COMPATIBILITY IDEOGRAPH-2F949
+	: 4039
+2F94A	CJK COMPATIBILITY IDEOGRAPH-2F94A
+	: 778B
+2F94B	CJK COMPATIBILITY IDEOGRAPH-2F94B
+	: 4046
+2F94C	CJK COMPATIBILITY IDEOGRAPH-2F94C
+	: 4096
+2F94D	CJK COMPATIBILITY IDEOGRAPH-2F94D
+	: 2541D
+2F94E	CJK COMPATIBILITY IDEOGRAPH-2F94E
+	: 784E
+2F94F	CJK COMPATIBILITY IDEOGRAPH-2F94F
+	: 788C
+2F950	CJK COMPATIBILITY IDEOGRAPH-2F950
+	: 78CC
+2F951	CJK COMPATIBILITY IDEOGRAPH-2F951
+	: 40E3
+2F952	CJK COMPATIBILITY IDEOGRAPH-2F952
+	: 25626
+2F953	CJK COMPATIBILITY IDEOGRAPH-2F953
+	: 7956
+2F954	CJK COMPATIBILITY IDEOGRAPH-2F954
+	: 2569A
+2F955	CJK COMPATIBILITY IDEOGRAPH-2F955
+	: 256C5
+2F956	CJK COMPATIBILITY IDEOGRAPH-2F956
+	: 798F
+2F957	CJK COMPATIBILITY IDEOGRAPH-2F957
+	: 79EB
+2F958	CJK COMPATIBILITY IDEOGRAPH-2F958
+	: 412F
+2F959	CJK COMPATIBILITY IDEOGRAPH-2F959
+	: 7A40
+2F95A	CJK COMPATIBILITY IDEOGRAPH-2F95A
+	: 7A4A
+2F95B	CJK COMPATIBILITY IDEOGRAPH-2F95B
+	: 7A4F
+2F95C	CJK COMPATIBILITY IDEOGRAPH-2F95C
+	: 2597C
+2F95D	CJK COMPATIBILITY IDEOGRAPH-2F95D
+	: 25AA7
+2F95E	CJK COMPATIBILITY IDEOGRAPH-2F95E
+	: 25AA7
+2F95F	CJK COMPATIBILITY IDEOGRAPH-2F95F
+	: 7AEE
+2F960	CJK COMPATIBILITY IDEOGRAPH-2F960
+	: 4202
+2F961	CJK COMPATIBILITY IDEOGRAPH-2F961
+	: 25BAB
+2F962	CJK COMPATIBILITY IDEOGRAPH-2F962
+	: 7BC6
+2F963	CJK COMPATIBILITY IDEOGRAPH-2F963
+	: 7BC9
+2F964	CJK COMPATIBILITY IDEOGRAPH-2F964
+	: 4227
+2F965	CJK COMPATIBILITY IDEOGRAPH-2F965
+	: 25C80
+2F966	CJK COMPATIBILITY IDEOGRAPH-2F966
+	: 7CD2
+2F967	CJK COMPATIBILITY IDEOGRAPH-2F967
+	: 42A0
+2F968	CJK COMPATIBILITY IDEOGRAPH-2F968
+	: 7CE8
+2F969	CJK COMPATIBILITY IDEOGRAPH-2F969
+	: 7CE3
+2F96A	CJK COMPATIBILITY IDEOGRAPH-2F96A
+	: 7D00
+2F96B	CJK COMPATIBILITY IDEOGRAPH-2F96B
+	: 25F86
+2F96C	CJK COMPATIBILITY IDEOGRAPH-2F96C
+	: 7D63
+2F96D	CJK COMPATIBILITY IDEOGRAPH-2F96D
+	: 4301
+2F96E	CJK COMPATIBILITY IDEOGRAPH-2F96E
+	: 7DC7
+2F96F	CJK COMPATIBILITY IDEOGRAPH-2F96F
+	: 7E02
+2F970	CJK COMPATIBILITY IDEOGRAPH-2F970
+	: 7E45
+2F971	CJK COMPATIBILITY IDEOGRAPH-2F971
+	: 4334
+2F972	CJK COMPATIBILITY IDEOGRAPH-2F972
+	: 26228
+2F973	CJK COMPATIBILITY IDEOGRAPH-2F973
+	: 26247
+2F974	CJK COMPATIBILITY IDEOGRAPH-2F974
+	: 4359
+2F975	CJK COMPATIBILITY IDEOGRAPH-2F975
+	: 262D9
+2F976	CJK COMPATIBILITY IDEOGRAPH-2F976
+	: 7F7A
+2F977	CJK COMPATIBILITY IDEOGRAPH-2F977
+	: 2633E
+2F978	CJK COMPATIBILITY IDEOGRAPH-2F978
+	: 7F95
+2F979	CJK COMPATIBILITY IDEOGRAPH-2F979
+	: 7FFA
+2F97A	CJK COMPATIBILITY IDEOGRAPH-2F97A
+	: 8005
+2F97B	CJK COMPATIBILITY IDEOGRAPH-2F97B
+	: 264DA
+2F97C	CJK COMPATIBILITY IDEOGRAPH-2F97C
+	: 26523
+2F97D	CJK COMPATIBILITY IDEOGRAPH-2F97D
+	: 8060
+2F97E	CJK COMPATIBILITY IDEOGRAPH-2F97E
+	: 265A8
+2F97F	CJK COMPATIBILITY IDEOGRAPH-2F97F
+	: 8070
+2F980	CJK COMPATIBILITY IDEOGRAPH-2F980
+	: 2335F
+2F981	CJK COMPATIBILITY IDEOGRAPH-2F981
+	: 43D5
+2F982	CJK COMPATIBILITY IDEOGRAPH-2F982
+	: 80B2
+2F983	CJK COMPATIBILITY IDEOGRAPH-2F983
+	: 8103
+2F984	CJK COMPATIBILITY IDEOGRAPH-2F984
+	: 440B
+2F985	CJK COMPATIBILITY IDEOGRAPH-2F985
+	: 813E
+2F986	CJK COMPATIBILITY IDEOGRAPH-2F986
+	: 5AB5
+2F987	CJK COMPATIBILITY IDEOGRAPH-2F987
+	: 267A7
+2F988	CJK COMPATIBILITY IDEOGRAPH-2F988
+	: 267B5
+2F989	CJK COMPATIBILITY IDEOGRAPH-2F989
+	: 23393
+2F98A	CJK COMPATIBILITY IDEOGRAPH-2F98A
+	: 2339C
+2F98B	CJK COMPATIBILITY IDEOGRAPH-2F98B
+	: 8201
+2F98C	CJK COMPATIBILITY IDEOGRAPH-2F98C
+	: 8204
+2F98D	CJK COMPATIBILITY IDEOGRAPH-2F98D
+	: 8F9E
+2F98E	CJK COMPATIBILITY IDEOGRAPH-2F98E
+	: 446B
+2F98F	CJK COMPATIBILITY IDEOGRAPH-2F98F
+	: 8291
+2F990	CJK COMPATIBILITY IDEOGRAPH-2F990
+	: 828B
+2F991	CJK COMPATIBILITY IDEOGRAPH-2F991
+	: 829D
+2F992	CJK COMPATIBILITY IDEOGRAPH-2F992
+	: 52B3
+2F993	CJK COMPATIBILITY IDEOGRAPH-2F993
+	: 82B1
+2F994	CJK COMPATIBILITY IDEOGRAPH-2F994
+	: 82B3
+2F995	CJK COMPATIBILITY IDEOGRAPH-2F995
+	: 82BD
+2F996	CJK COMPATIBILITY IDEOGRAPH-2F996
+	: 82E6
+2F997	CJK COMPATIBILITY IDEOGRAPH-2F997
+	: 26B3C
+2F998	CJK COMPATIBILITY IDEOGRAPH-2F998
+	: 82E5
+2F999	CJK COMPATIBILITY IDEOGRAPH-2F999
+	: 831D
+2F99A	CJK COMPATIBILITY IDEOGRAPH-2F99A
+	: 8363
+2F99B	CJK COMPATIBILITY IDEOGRAPH-2F99B
+	: 83AD
+2F99C	CJK COMPATIBILITY IDEOGRAPH-2F99C
+	: 8323
+2F99D	CJK COMPATIBILITY IDEOGRAPH-2F99D
+	: 83BD
+2F99E	CJK COMPATIBILITY IDEOGRAPH-2F99E
+	: 83E7
+2F99F	CJK COMPATIBILITY IDEOGRAPH-2F99F
+	: 8457
+2F9A0	CJK COMPATIBILITY IDEOGRAPH-2F9A0
+	: 8353
+2F9A1	CJK COMPATIBILITY IDEOGRAPH-2F9A1
+	: 83CA
+2F9A2	CJK COMPATIBILITY IDEOGRAPH-2F9A2
+	: 83CC
+2F9A3	CJK COMPATIBILITY IDEOGRAPH-2F9A3
+	: 83DC
+2F9A4	CJK COMPATIBILITY IDEOGRAPH-2F9A4
+	: 26C36
+2F9A5	CJK COMPATIBILITY IDEOGRAPH-2F9A5
+	: 26D6B
+2F9A6	CJK COMPATIBILITY IDEOGRAPH-2F9A6
+	: 26CD5
+2F9A7	CJK COMPATIBILITY IDEOGRAPH-2F9A7
+	: 452B
+2F9A8	CJK COMPATIBILITY IDEOGRAPH-2F9A8
+	: 84F1
+2F9A9	CJK COMPATIBILITY IDEOGRAPH-2F9A9
+	: 84F3
+2F9AA	CJK COMPATIBILITY IDEOGRAPH-2F9AA
+	: 8516
+2F9AB	CJK COMPATIBILITY IDEOGRAPH-2F9AB
+	: 273CA
+2F9AC	CJK COMPATIBILITY IDEOGRAPH-2F9AC
+	: 8564
+2F9AD	CJK COMPATIBILITY IDEOGRAPH-2F9AD
+	: 26F2C
+2F9AE	CJK COMPATIBILITY IDEOGRAPH-2F9AE
+	: 455D
+2F9AF	CJK COMPATIBILITY IDEOGRAPH-2F9AF
+	: 4561
+2F9B0	CJK COMPATIBILITY IDEOGRAPH-2F9B0
+	: 26FB1
+2F9B1	CJK COMPATIBILITY IDEOGRAPH-2F9B1
+	: 270D2
+2F9B2	CJK COMPATIBILITY IDEOGRAPH-2F9B2
+	x 5914
+	x 270CD
+	x 270F0
+	: 456B
+2F9B3	CJK COMPATIBILITY IDEOGRAPH-2F9B3
+	: 8650
+2F9B4	CJK COMPATIBILITY IDEOGRAPH-2F9B4
+	: 865C
+2F9B5	CJK COMPATIBILITY IDEOGRAPH-2F9B5
+	: 8667
+2F9B6	CJK COMPATIBILITY IDEOGRAPH-2F9B6
+	x 27205
+	: 8669
+2F9B7	CJK COMPATIBILITY IDEOGRAPH-2F9B7
+	: 86A9
+2F9B8	CJK COMPATIBILITY IDEOGRAPH-2F9B8
+	: 8688
+2F9B9	CJK COMPATIBILITY IDEOGRAPH-2F9B9
+	: 870E
+2F9BA	CJK COMPATIBILITY IDEOGRAPH-2F9BA
+	: 86E2
+2F9BB	CJK COMPATIBILITY IDEOGRAPH-2F9BB
+	: 8779
+2F9BC	CJK COMPATIBILITY IDEOGRAPH-2F9BC
+	: 8728
+2F9BD	CJK COMPATIBILITY IDEOGRAPH-2F9BD
+	: 876B
+2F9BE	CJK COMPATIBILITY IDEOGRAPH-2F9BE
+	: 8786
+2F9BF	CJK COMPATIBILITY IDEOGRAPH-2F9BF
+	: 45D7
+2F9C0	CJK COMPATIBILITY IDEOGRAPH-2F9C0
+	: 87E1
+2F9C1	CJK COMPATIBILITY IDEOGRAPH-2F9C1
+	: 8801
+2F9C2	CJK COMPATIBILITY IDEOGRAPH-2F9C2
+	: 45F9
+2F9C3	CJK COMPATIBILITY IDEOGRAPH-2F9C3
+	: 8860
+2F9C4	CJK COMPATIBILITY IDEOGRAPH-2F9C4
+	: 8863
+2F9C5	CJK COMPATIBILITY IDEOGRAPH-2F9C5
+	: 27667
+2F9C6	CJK COMPATIBILITY IDEOGRAPH-2F9C6
+	: 88D7
+2F9C7	CJK COMPATIBILITY IDEOGRAPH-2F9C7
+	: 88DE
+2F9C8	CJK COMPATIBILITY IDEOGRAPH-2F9C8
+	: 4635
+2F9C9	CJK COMPATIBILITY IDEOGRAPH-2F9C9
+	: 88FA
+2F9CA	CJK COMPATIBILITY IDEOGRAPH-2F9CA
+	: 34BB
+2F9CB	CJK COMPATIBILITY IDEOGRAPH-2F9CB
+	x 4695
+	: 278AE
+2F9CC	CJK COMPATIBILITY IDEOGRAPH-2F9CC
+	: 27966
+2F9CD	CJK COMPATIBILITY IDEOGRAPH-2F9CD
+	: 46BE
+2F9CE	CJK COMPATIBILITY IDEOGRAPH-2F9CE
+	: 46C7
+2F9CF	CJK COMPATIBILITY IDEOGRAPH-2F9CF
+	: 8AA0
+2F9D0	CJK COMPATIBILITY IDEOGRAPH-2F9D0
+	: 8AED
+2F9D1	CJK COMPATIBILITY IDEOGRAPH-2F9D1
+	: 8B8A
+2F9D2	CJK COMPATIBILITY IDEOGRAPH-2F9D2
+	: 8C55
+2F9D3	CJK COMPATIBILITY IDEOGRAPH-2F9D3
+	: 27CA8
+2F9D4	CJK COMPATIBILITY IDEOGRAPH-2F9D4
+	: 8CAB
+2F9D5	CJK COMPATIBILITY IDEOGRAPH-2F9D5
+	: 8CC1
+2F9D6	CJK COMPATIBILITY IDEOGRAPH-2F9D6
+	x 25AD4
+	: 8D1B
+2F9D7	CJK COMPATIBILITY IDEOGRAPH-2F9D7
+	: 8D77
+2F9D8	CJK COMPATIBILITY IDEOGRAPH-2F9D8
+	: 27F2F
+2F9D9	CJK COMPATIBILITY IDEOGRAPH-2F9D9
+	: 20804
+2F9DA	CJK COMPATIBILITY IDEOGRAPH-2F9DA
+	: 8DCB
+2F9DB	CJK COMPATIBILITY IDEOGRAPH-2F9DB
+	: 8DBC
+2F9DC	CJK COMPATIBILITY IDEOGRAPH-2F9DC
+	: 8DF0
+2F9DD	CJK COMPATIBILITY IDEOGRAPH-2F9DD
+	: 208DE
+2F9DE	CJK COMPATIBILITY IDEOGRAPH-2F9DE
+	: 8ED4
+2F9DF	CJK COMPATIBILITY IDEOGRAPH-2F9DF
+	: 8F38
+2F9E0	CJK COMPATIBILITY IDEOGRAPH-2F9E0
+	: 285D2
+2F9E1	CJK COMPATIBILITY IDEOGRAPH-2F9E1
+	: 285ED
+2F9E2	CJK COMPATIBILITY IDEOGRAPH-2F9E2
+	: 9094
+2F9E3	CJK COMPATIBILITY IDEOGRAPH-2F9E3
+	: 90F1
+2F9E4	CJK COMPATIBILITY IDEOGRAPH-2F9E4
+	: 9111
+2F9E5	CJK COMPATIBILITY IDEOGRAPH-2F9E5
+	: 2872E
+2F9E6	CJK COMPATIBILITY IDEOGRAPH-2F9E6
+	: 911B
+2F9E7	CJK COMPATIBILITY IDEOGRAPH-2F9E7
+	: 9238
+2F9E8	CJK COMPATIBILITY IDEOGRAPH-2F9E8
+	: 92D7
+2F9E9	CJK COMPATIBILITY IDEOGRAPH-2F9E9
+	: 92D8
+2F9EA	CJK COMPATIBILITY IDEOGRAPH-2F9EA
+	: 927C
+2F9EB	CJK COMPATIBILITY IDEOGRAPH-2F9EB
+	: 93F9
+2F9EC	CJK COMPATIBILITY IDEOGRAPH-2F9EC
+	: 9415
+2F9ED	CJK COMPATIBILITY IDEOGRAPH-2F9ED
+	: 28BFA
+2F9EE	CJK COMPATIBILITY IDEOGRAPH-2F9EE
+	: 958B
+2F9EF	CJK COMPATIBILITY IDEOGRAPH-2F9EF
+	: 4995
+2F9F0	CJK COMPATIBILITY IDEOGRAPH-2F9F0
+	: 95B7
+2F9F1	CJK COMPATIBILITY IDEOGRAPH-2F9F1
+	: 28D77
+2F9F2	CJK COMPATIBILITY IDEOGRAPH-2F9F2
+	: 49E6
+2F9F3	CJK COMPATIBILITY IDEOGRAPH-2F9F3
+	: 96C3
+2F9F4	CJK COMPATIBILITY IDEOGRAPH-2F9F4
+	: 5DB2
+2F9F5	CJK COMPATIBILITY IDEOGRAPH-2F9F5
+	: 9723
+2F9F6	CJK COMPATIBILITY IDEOGRAPH-2F9F6
+	: 29145
+2F9F7	CJK COMPATIBILITY IDEOGRAPH-2F9F7
+	: 2921A
+2F9F8	CJK COMPATIBILITY IDEOGRAPH-2F9F8
+	: 4A6E
+2F9F9	CJK COMPATIBILITY IDEOGRAPH-2F9F9
+	: 4A76
+2F9FA	CJK COMPATIBILITY IDEOGRAPH-2F9FA
+	: 97E0
+2F9FB	CJK COMPATIBILITY IDEOGRAPH-2F9FB
+	: 2940A
+2F9FC	CJK COMPATIBILITY IDEOGRAPH-2F9FC
+	: 4AB2
+2F9FD	CJK COMPATIBILITY IDEOGRAPH-2F9FD
+	: 29496
+2F9FE	CJK COMPATIBILITY IDEOGRAPH-2F9FE
+	: 980B
+2F9FF	CJK COMPATIBILITY IDEOGRAPH-2F9FF
+	: 980B
+2FA00	CJK COMPATIBILITY IDEOGRAPH-2FA00
+	: 9829
+2FA01	CJK COMPATIBILITY IDEOGRAPH-2FA01
+	: 295B6
+2FA02	CJK COMPATIBILITY IDEOGRAPH-2FA02
+	: 98E2
+2FA03	CJK COMPATIBILITY IDEOGRAPH-2FA03
+	: 4B33
+2FA04	CJK COMPATIBILITY IDEOGRAPH-2FA04
+	: 9929
+2FA05	CJK COMPATIBILITY IDEOGRAPH-2FA05
+	: 99A7
+2FA06	CJK COMPATIBILITY IDEOGRAPH-2FA06
+	: 99C2
+2FA07	CJK COMPATIBILITY IDEOGRAPH-2FA07
+	: 99FE
+2FA08	CJK COMPATIBILITY IDEOGRAPH-2FA08
+	: 4BCE
+2FA09	CJK COMPATIBILITY IDEOGRAPH-2FA09
+	: 29B30
+2FA0A	CJK COMPATIBILITY IDEOGRAPH-2FA0A
+	: 9B12
+2FA0B	CJK COMPATIBILITY IDEOGRAPH-2FA0B
+	: 9C40
+2FA0C	CJK COMPATIBILITY IDEOGRAPH-2FA0C
+	: 9CFD
+2FA0D	CJK COMPATIBILITY IDEOGRAPH-2FA0D
+	: 4CCE
+2FA0E	CJK COMPATIBILITY IDEOGRAPH-2FA0E
+	: 4CED
+2FA0F	CJK COMPATIBILITY IDEOGRAPH-2FA0F
+	: 9D67
+2FA10	CJK COMPATIBILITY IDEOGRAPH-2FA10
+	: 2A0CE
+2FA11	CJK COMPATIBILITY IDEOGRAPH-2FA11
+	: 4CF8
+2FA12	CJK COMPATIBILITY IDEOGRAPH-2FA12
+	: 2A105
+2FA13	CJK COMPATIBILITY IDEOGRAPH-2FA13
+	: 2A20E
+2FA14	CJK COMPATIBILITY IDEOGRAPH-2FA14
+	: 2A291
+2FA15	CJK COMPATIBILITY IDEOGRAPH-2FA15
+	: 9EBB
+2FA16	CJK COMPATIBILITY IDEOGRAPH-2FA16
+	: 4D56
+2FA17	CJK COMPATIBILITY IDEOGRAPH-2FA17
+	: 9EF9
+2FA18	CJK COMPATIBILITY IDEOGRAPH-2FA18
+	: 9EFE
+2FA19	CJK COMPATIBILITY IDEOGRAPH-2FA19
+	: 9F05
+2FA1A	CJK COMPATIBILITY IDEOGRAPH-2FA1A
+	: 9F0F
+2FA1B	CJK COMPATIBILITY IDEOGRAPH-2FA1B
+	: 9F16
+2FA1C	CJK COMPATIBILITY IDEOGRAPH-2FA1C
+	: 9F3B
+2FA1D	CJK COMPATIBILITY IDEOGRAPH-2FA1D
+	: 2A600
+@@	2FF80	Unassigned	2FFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+2FFFE	<not a character>
+	* the value 2FFFE is guaranteed not to be a Unicode character at all
+2FFFF	<not a character>
+	* the value 2FFFF is guaranteed not to be a Unicode character at all
+@@	3FF80	Unassigned	3FFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+3FFFE	<not a character>
+	* the value 3FFFE is guaranteed not to be a Unicode character at all
+3FFFF	<not a character>
+	* the value 3FFFF is guaranteed not to be a Unicode character at all
+@@	4FF80	Unassigned	4FFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+4FFFE	<not a character>
+	* the value 4FFFE is guaranteed not to be a Unicode character at all
+4FFFF	<not a character>
+	* the value 4FFFF is guaranteed not to be a Unicode character at all
+@@	5FF80	Unassigned	5FFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+5FFFE	<not a character>
+	* the value 5FFFE is guaranteed not to be a Unicode character at all
+5FFFF	<not a character>
+	* the value 5FFFF is guaranteed not to be a Unicode character at all
+@@	6FF80	Unassigned	6FFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+6FFFE	<not a character>
+	* the value 6FFFE is guaranteed not to be a Unicode character at all
+6FFFF	<not a character>
+	* the value 6FFFF is guaranteed not to be a Unicode character at all
+@@	7FF80	Unassigned	7FFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+7FFFE	<not a character>
+	* the value 7FFFE is guaranteed not to be a Unicode character at all
+7FFFF	<not a character>
+	* the value 7FFFF is guaranteed not to be a Unicode character at all
+@@	8FF80	Unassigned	8FFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+8FFFE	<not a character>
+	* the value 8FFFE is guaranteed not to be a Unicode character at all
+8FFFF	<not a character>
+	* the value 8FFFF is guaranteed not to be a Unicode character at all
+@@	9FF80	Unassigned	9FFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+9FFFE	<not a character>
+	* the value 9FFFE is guaranteed not to be a Unicode character at all
+9FFFF	<not a character>
+	* the value 9FFFF is guaranteed not to be a Unicode character at all
+@@	AFF80	Unassigned	AFFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+AFFFE	<not a character>
+	* the value AFFFE is guaranteed not to be a Unicode character at all
+AFFFF	<not a character>
+	* the value AFFFF is guaranteed not to be a Unicode character at all
+@@	BFF80	Unassigned	BFFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+BFFFE	<not a character>
+	* the value BFFFE is guaranteed not to be a Unicode character at all
+BFFFF	<not a character>
+	* the value BFFFF is guaranteed not to be a Unicode character at all
+@@	CFF80	Unassigned	CFFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+CFFFE	<not a character>
+	* the value CFFFE is guaranteed not to be a Unicode character at all
+CFFFF	<not a character>
+	* the value CFFFF is guaranteed not to be a Unicode character at all
+@@	DFF80	Unassigned	DFFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+DFFFE	<not a character>
+	* the value DFFFE is guaranteed not to be a Unicode character at all
+DFFFF	<not a character>
+	* the value DFFFF is guaranteed not to be a Unicode character at all
+@@	E0000	Tags	E007F
+@		Tag identifiers
+E0001	LANGUAGE TAG
+@		Tag components
+E0020	TAG SPACE
+E0021	TAG EXCLAMATION MARK
+E0022	TAG QUOTATION MARK
+E0023	TAG NUMBER SIGN
+E0024	TAG DOLLAR SIGN
+E0025	TAG PERCENT SIGN
+E0026	TAG AMPERSAND
+E0027	TAG APOSTROPHE
+E0028	TAG LEFT PARENTHESIS
+E0029	TAG RIGHT PARENTHESIS
+E002A	TAG ASTERISK
+E002B	TAG PLUS SIGN
+E002C	TAG COMMA
+E002D	TAG HYPHEN-MINUS
+E002E	TAG FULL STOP
+E002F	TAG SOLIDUS
+E0030	TAG DIGIT ZERO
+E0031	TAG DIGIT ONE
+E0032	TAG DIGIT TWO
+E0033	TAG DIGIT THREE
+E0034	TAG DIGIT FOUR
+E0035	TAG DIGIT FIVE
+E0036	TAG DIGIT SIX
+E0037	TAG DIGIT SEVEN
+E0038	TAG DIGIT EIGHT
+E0039	TAG DIGIT NINE
+E003A	TAG COLON
+E003B	TAG SEMICOLON
+E003C	TAG LESS-THAN SIGN
+E003D	TAG EQUALS SIGN
+E003E	TAG GREATER-THAN SIGN
+E003F	TAG QUESTION MARK
+E0040	TAG COMMERCIAL AT
+E0041	TAG LATIN CAPITAL LETTER A
+E0042	TAG LATIN CAPITAL LETTER B
+E0043	TAG LATIN CAPITAL LETTER C
+E0044	TAG LATIN CAPITAL LETTER D
+E0045	TAG LATIN CAPITAL LETTER E
+E0046	TAG LATIN CAPITAL LETTER F
+E0047	TAG LATIN CAPITAL LETTER G
+E0048	TAG LATIN CAPITAL LETTER H
+E0049	TAG LATIN CAPITAL LETTER I
+E004A	TAG LATIN CAPITAL LETTER J
+E004B	TAG LATIN CAPITAL LETTER K
+E004C	TAG LATIN CAPITAL LETTER L
+E004D	TAG LATIN CAPITAL LETTER M
+E004E	TAG LATIN CAPITAL LETTER N
+E004F	TAG LATIN CAPITAL LETTER O
+E0050	TAG LATIN CAPITAL LETTER P
+E0051	TAG LATIN CAPITAL LETTER Q
+E0052	TAG LATIN CAPITAL LETTER R
+E0053	TAG LATIN CAPITAL LETTER S
+E0054	TAG LATIN CAPITAL LETTER T
+E0055	TAG LATIN CAPITAL LETTER U
+E0056	TAG LATIN CAPITAL LETTER V
+E0057	TAG LATIN CAPITAL LETTER W
+E0058	TAG LATIN CAPITAL LETTER X
+E0059	TAG LATIN CAPITAL LETTER Y
+E005A	TAG LATIN CAPITAL LETTER Z
+E005B	TAG LEFT SQUARE BRACKET
+E005C	TAG REVERSE SOLIDUS
+E005D	TAG RIGHT SQUARE BRACKET
+E005E	TAG CIRCUMFLEX ACCENT
+E005F	TAG LOW LINE
+E0060	TAG GRAVE ACCENT
+E0061	TAG LATIN SMALL LETTER A
+E0062	TAG LATIN SMALL LETTER B
+E0063	TAG LATIN SMALL LETTER C
+E0064	TAG LATIN SMALL LETTER D
+E0065	TAG LATIN SMALL LETTER E
+E0066	TAG LATIN SMALL LETTER F
+E0067	TAG LATIN SMALL LETTER G
+E0068	TAG LATIN SMALL LETTER H
+E0069	TAG LATIN SMALL LETTER I
+E006A	TAG LATIN SMALL LETTER J
+E006B	TAG LATIN SMALL LETTER K
+E006C	TAG LATIN SMALL LETTER L
+E006D	TAG LATIN SMALL LETTER M
+E006E	TAG LATIN SMALL LETTER N
+E006F	TAG LATIN SMALL LETTER O
+E0070	TAG LATIN SMALL LETTER P
+E0071	TAG LATIN SMALL LETTER Q
+E0072	TAG LATIN SMALL LETTER R
+E0073	TAG LATIN SMALL LETTER S
+E0074	TAG LATIN SMALL LETTER T
+E0075	TAG LATIN SMALL LETTER U
+E0076	TAG LATIN SMALL LETTER V
+E0077	TAG LATIN SMALL LETTER W
+E0078	TAG LATIN SMALL LETTER X
+E0079	TAG LATIN SMALL LETTER Y
+E007A	TAG LATIN SMALL LETTER Z
+E007B	TAG LEFT CURLY BRACKET
+E007C	TAG VERTICAL LINE
+E007D	TAG RIGHT CURLY BRACKET
+E007E	TAG TILDE
+E007F	CANCEL TAG
+@@	E0100	Variation Selectors Supplement	E01EF
+@+	These complete the set started at FE00 to FE0F
+@		Variation selectors
+E0100	VARIATION SELECTOR-17
+	* these are abbreviated VS17, and so on
+E0101	VARIATION SELECTOR-18
+E0102	VARIATION SELECTOR-19
+E0103	VARIATION SELECTOR-20
+E0104	VARIATION SELECTOR-21
+E0105	VARIATION SELECTOR-22
+E0106	VARIATION SELECTOR-23
+E0107	VARIATION SELECTOR-24
+E0108	VARIATION SELECTOR-25
+E0109	VARIATION SELECTOR-26
+E010A	VARIATION SELECTOR-27
+E010B	VARIATION SELECTOR-28
+E010C	VARIATION SELECTOR-29
+E010D	VARIATION SELECTOR-30
+E010E	VARIATION SELECTOR-31
+E010F	VARIATION SELECTOR-32
+E0110	VARIATION SELECTOR-33
+E0111	VARIATION SELECTOR-34
+E0112	VARIATION SELECTOR-35
+E0113	VARIATION SELECTOR-36
+E0114	VARIATION SELECTOR-37
+E0115	VARIATION SELECTOR-38
+E0116	VARIATION SELECTOR-39
+E0117	VARIATION SELECTOR-40
+E0118	VARIATION SELECTOR-41
+E0119	VARIATION SELECTOR-42
+E011A	VARIATION SELECTOR-43
+E011B	VARIATION SELECTOR-44
+E011C	VARIATION SELECTOR-45
+E011D	VARIATION SELECTOR-46
+E011E	VARIATION SELECTOR-47
+E011F	VARIATION SELECTOR-48
+E0120	VARIATION SELECTOR-49
+E0121	VARIATION SELECTOR-50
+E0122	VARIATION SELECTOR-51
+E0123	VARIATION SELECTOR-52
+E0124	VARIATION SELECTOR-53
+E0125	VARIATION SELECTOR-54
+E0126	VARIATION SELECTOR-55
+E0127	VARIATION SELECTOR-56
+E0128	VARIATION SELECTOR-57
+E0129	VARIATION SELECTOR-58
+E012A	VARIATION SELECTOR-59
+E012B	VARIATION SELECTOR-60
+E012C	VARIATION SELECTOR-61
+E012D	VARIATION SELECTOR-62
+E012E	VARIATION SELECTOR-63
+E012F	VARIATION SELECTOR-64
+E0130	VARIATION SELECTOR-65
+E0131	VARIATION SELECTOR-66
+E0132	VARIATION SELECTOR-67
+E0133	VARIATION SELECTOR-68
+E0134	VARIATION SELECTOR-69
+E0135	VARIATION SELECTOR-70
+E0136	VARIATION SELECTOR-71
+E0137	VARIATION SELECTOR-72
+E0138	VARIATION SELECTOR-73
+E0139	VARIATION SELECTOR-74
+E013A	VARIATION SELECTOR-75
+E013B	VARIATION SELECTOR-76
+E013C	VARIATION SELECTOR-77
+E013D	VARIATION SELECTOR-78
+E013E	VARIATION SELECTOR-79
+E013F	VARIATION SELECTOR-80
+E0140	VARIATION SELECTOR-81
+E0141	VARIATION SELECTOR-82
+E0142	VARIATION SELECTOR-83
+E0143	VARIATION SELECTOR-84
+E0144	VARIATION SELECTOR-85
+E0145	VARIATION SELECTOR-86
+E0146	VARIATION SELECTOR-87
+E0147	VARIATION SELECTOR-88
+E0148	VARIATION SELECTOR-89
+E0149	VARIATION SELECTOR-90
+E014A	VARIATION SELECTOR-91
+E014B	VARIATION SELECTOR-92
+E014C	VARIATION SELECTOR-93
+E014D	VARIATION SELECTOR-94
+E014E	VARIATION SELECTOR-95
+E014F	VARIATION SELECTOR-96
+E0150	VARIATION SELECTOR-97
+E0151	VARIATION SELECTOR-98
+E0152	VARIATION SELECTOR-99
+E0153	VARIATION SELECTOR-100
+E0154	VARIATION SELECTOR-101
+E0155	VARIATION SELECTOR-102
+E0156	VARIATION SELECTOR-103
+E0157	VARIATION SELECTOR-104
+E0158	VARIATION SELECTOR-105
+E0159	VARIATION SELECTOR-106
+E015A	VARIATION SELECTOR-107
+E015B	VARIATION SELECTOR-108
+E015C	VARIATION SELECTOR-109
+E015D	VARIATION SELECTOR-110
+E015E	VARIATION SELECTOR-111
+E015F	VARIATION SELECTOR-112
+E0160	VARIATION SELECTOR-113
+E0161	VARIATION SELECTOR-114
+E0162	VARIATION SELECTOR-115
+E0163	VARIATION SELECTOR-116
+E0164	VARIATION SELECTOR-117
+E0165	VARIATION SELECTOR-118
+E0166	VARIATION SELECTOR-119
+E0167	VARIATION SELECTOR-120
+E0168	VARIATION SELECTOR-121
+E0169	VARIATION SELECTOR-122
+E016A	VARIATION SELECTOR-123
+E016B	VARIATION SELECTOR-124
+E016C	VARIATION SELECTOR-125
+E016D	VARIATION SELECTOR-126
+E016E	VARIATION SELECTOR-127
+E016F	VARIATION SELECTOR-128
+E0170	VARIATION SELECTOR-129
+E0171	VARIATION SELECTOR-130
+E0172	VARIATION SELECTOR-131
+E0173	VARIATION SELECTOR-132
+E0174	VARIATION SELECTOR-133
+E0175	VARIATION SELECTOR-134
+E0176	VARIATION SELECTOR-135
+E0177	VARIATION SELECTOR-136
+E0178	VARIATION SELECTOR-137
+E0179	VARIATION SELECTOR-138
+E017A	VARIATION SELECTOR-139
+E017B	VARIATION SELECTOR-140
+E017C	VARIATION SELECTOR-141
+E017D	VARIATION SELECTOR-142
+E017E	VARIATION SELECTOR-143
+E017F	VARIATION SELECTOR-144
+E0180	VARIATION SELECTOR-145
+E0181	VARIATION SELECTOR-146
+E0182	VARIATION SELECTOR-147
+E0183	VARIATION SELECTOR-148
+E0184	VARIATION SELECTOR-149
+E0185	VARIATION SELECTOR-150
+E0186	VARIATION SELECTOR-151
+E0187	VARIATION SELECTOR-152
+E0188	VARIATION SELECTOR-153
+E0189	VARIATION SELECTOR-154
+E018A	VARIATION SELECTOR-155
+E018B	VARIATION SELECTOR-156
+E018C	VARIATION SELECTOR-157
+E018D	VARIATION SELECTOR-158
+E018E	VARIATION SELECTOR-159
+E018F	VARIATION SELECTOR-160
+E0190	VARIATION SELECTOR-161
+E0191	VARIATION SELECTOR-162
+E0192	VARIATION SELECTOR-163
+E0193	VARIATION SELECTOR-164
+E0194	VARIATION SELECTOR-165
+E0195	VARIATION SELECTOR-166
+E0196	VARIATION SELECTOR-167
+E0197	VARIATION SELECTOR-168
+E0198	VARIATION SELECTOR-169
+E0199	VARIATION SELECTOR-170
+E019A	VARIATION SELECTOR-171
+E019B	VARIATION SELECTOR-172
+E019C	VARIATION SELECTOR-173
+E019D	VARIATION SELECTOR-174
+E019E	VARIATION SELECTOR-175
+E019F	VARIATION SELECTOR-176
+E01A0	VARIATION SELECTOR-177
+E01A1	VARIATION SELECTOR-178
+E01A2	VARIATION SELECTOR-179
+E01A3	VARIATION SELECTOR-180
+E01A4	VARIATION SELECTOR-181
+E01A5	VARIATION SELECTOR-182
+E01A6	VARIATION SELECTOR-183
+E01A7	VARIATION SELECTOR-184
+E01A8	VARIATION SELECTOR-185
+E01A9	VARIATION SELECTOR-186
+E01AA	VARIATION SELECTOR-187
+E01AB	VARIATION SELECTOR-188
+E01AC	VARIATION SELECTOR-189
+E01AD	VARIATION SELECTOR-190
+E01AE	VARIATION SELECTOR-191
+E01AF	VARIATION SELECTOR-192
+E01B0	VARIATION SELECTOR-193
+E01B1	VARIATION SELECTOR-194
+E01B2	VARIATION SELECTOR-195
+E01B3	VARIATION SELECTOR-196
+E01B4	VARIATION SELECTOR-197
+E01B5	VARIATION SELECTOR-198
+E01B6	VARIATION SELECTOR-199
+E01B7	VARIATION SELECTOR-200
+E01B8	VARIATION SELECTOR-201
+E01B9	VARIATION SELECTOR-202
+E01BA	VARIATION SELECTOR-203
+E01BB	VARIATION SELECTOR-204
+E01BC	VARIATION SELECTOR-205
+E01BD	VARIATION SELECTOR-206
+E01BE	VARIATION SELECTOR-207
+E01BF	VARIATION SELECTOR-208
+E01C0	VARIATION SELECTOR-209
+E01C1	VARIATION SELECTOR-210
+E01C2	VARIATION SELECTOR-211
+E01C3	VARIATION SELECTOR-212
+E01C4	VARIATION SELECTOR-213
+E01C5	VARIATION SELECTOR-214
+E01C6	VARIATION SELECTOR-215
+E01C7	VARIATION SELECTOR-216
+E01C8	VARIATION SELECTOR-217
+E01C9	VARIATION SELECTOR-218
+E01CA	VARIATION SELECTOR-219
+E01CB	VARIATION SELECTOR-220
+E01CC	VARIATION SELECTOR-221
+E01CD	VARIATION SELECTOR-222
+E01CE	VARIATION SELECTOR-223
+E01CF	VARIATION SELECTOR-224
+E01D0	VARIATION SELECTOR-225
+E01D1	VARIATION SELECTOR-226
+E01D2	VARIATION SELECTOR-227
+E01D3	VARIATION SELECTOR-228
+E01D4	VARIATION SELECTOR-229
+E01D5	VARIATION SELECTOR-230
+E01D6	VARIATION SELECTOR-231
+E01D7	VARIATION SELECTOR-232
+E01D8	VARIATION SELECTOR-233
+E01D9	VARIATION SELECTOR-234
+E01DA	VARIATION SELECTOR-235
+E01DB	VARIATION SELECTOR-236
+E01DC	VARIATION SELECTOR-237
+E01DD	VARIATION SELECTOR-238
+E01DE	VARIATION SELECTOR-239
+E01DF	VARIATION SELECTOR-240
+E01E0	VARIATION SELECTOR-241
+E01E1	VARIATION SELECTOR-242
+E01E2	VARIATION SELECTOR-243
+E01E3	VARIATION SELECTOR-244
+E01E4	VARIATION SELECTOR-245
+E01E5	VARIATION SELECTOR-246
+E01E6	VARIATION SELECTOR-247
+E01E7	VARIATION SELECTOR-248
+E01E8	VARIATION SELECTOR-249
+E01E9	VARIATION SELECTOR-250
+E01EA	VARIATION SELECTOR-251
+E01EB	VARIATION SELECTOR-252
+E01EC	VARIATION SELECTOR-253
+E01ED	VARIATION SELECTOR-254
+E01EE	VARIATION SELECTOR-255
+E01EF	VARIATION SELECTOR-256
+@@	EFF80	Unassigned	EFFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+EFFFE	<not a character>
+	* the value EFFFE is guaranteed not to be a Unicode character at all
+EFFFF	<not a character>
+	* the value EFFFF is guaranteed not to be a Unicode character at all
+@@	FFF80	Supplementary Private Use Area-A	FFFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+FFFFE	<not a character>
+	* the value FFFFE is guaranteed not to be a Unicode character at all
+FFFFF	<not a character>
+	* the value FFFFF is guaranteed not to be a Unicode character at all
+@@	10FF80	Supplementary Private Use Area-B	10FFFF
+@		Noncharacters
+@+	These codes are intended for process internal uses, but are not permitted for interchange.
+10FFFE	<not a character>
+	* the value 10FFFE is guaranteed not to be a Unicode character at all
+10FFFF	<not a character>
+	* the value 10FFFF is guaranteed not to be a Unicode character at all
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/NormalizationCorrections.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/NormalizationCorrections.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/NormalizationCorrections.txt	(revision 14489)
@@ -0,0 +1,48 @@
+# NormalizationCorrections-4.1.0.txt
+# Date: 2005-03-17, 15:21:00 PST [KW]
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# The normalization stabilization policy of the Unicode
+# Consortium ordinarily precludes any change to the decomposition
+# for any character, once established in a relevant version
+# of the UnicodeData.txt data file. However, under certain
+# exceptional (and rare) conditions, an error in a decomposition
+# mapping may be discovered that is truly just an unintended
+# typo in the data, and not a matter of dubious interpretation.
+#
+# Whenever such an error may be found, and if it meets the
+# requirements for possible exceptions to normalization
+# stability, the correction is entered in this data file,
+# so that any implementation depending on absolute stability
+# of normalization, *including* any errors in the data, can
+# safely reconstruct the exact state of the data tables at
+# any given version of Unicode.
+#
+# Currently this list has exactly six entries in it, one for the
+# typo found and corrected in Corrigendum #3, and five for
+# the typos and misidentifications found and corrected in 
+# Corrigendum #4. All efforts
+# will be made to keep the entries limited to just those fixes.
+#
+# Interpretation of the fields:
+#   Field 1: Unicode code point
+#   Field 2: Original (erroneous) decomposition
+#   Field 3: Corrected decomposition
+#   Field 4: Version of Unicode for which the correction was
+#            entered into UnicodeData.txt, in n.n.n format.
+#   Comment: Indicates the Unicode Corrigendum which documents 
+#            the correction
+#
+# For more information, see UAX #15, Unicode Normalization Forms.
+#
+F951;96FB;964B;3.2.0 # Corrigendum 3
+2F868;2136A;36FC;4.0.0 # Corrigendum 4
+2F874;5F33;5F53;4.0.0 # Corrigendum 4
+2F91F;43AB;243AB;4.0.0 # Corrigendum 4
+2F95F;7AAE;7AEE;4.0.0 # Corrigendum 4
+2F9BF;4D57;45D7;4.0.0 # Corrigendum 4
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/PVA.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/PVA.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/PVA.pl	(revision 14489)
@@ -0,0 +1,2044 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+
+%utf8::PropertyAlias = (
+'sc',
+'Script',
+'xonfkd',
+'ExpandsOnNFKD',
+'patsyn',
+'PatternSyntax',
+'nfkcqc',
+'NFKCQuickCheck',
+'oalpha',
+'OtherAlphabetic',
+'gcb',
+'GraphemeClusterBreak',
+'nfcqc',
+'NFCQuickCheck',
+'ids',
+'IDStart',
+'lb',
+'LineBreak',
+'stc',
+'SimpleTitlecaseMapping',
+'xonfkc',
+'ExpandsOnNFKC',
+'patws',
+'PatternWhiteSpace',
+'tc',
+'TitlecaseMapping',
+'lower',
+'Lowercase',
+'idst',
+'IDSTrinaryOperator',
+'radical',
+'Radical',
+'fcnfkc',
+'FCNFKCClosure',
+'dm',
+'DecompositionMapping',
+'slc',
+'SimpleLowercaseMapping',
+'wspace',
+'WhiteSpace',
+'di',
+'DefaultIgnorableCodePoint',
+'nt',
+'NumericType',
+'ea',
+'EastAsianWidth',
+'ahex',
+'ASCIIHexDigit',
+'alpha',
+'Alphabetic',
+'uc',
+'UppercaseMapping',
+'dia',
+'Diacritic',
+'gc',
+'GeneralCategory',
+'xids',
+'XIDStart',
+'oupper',
+'OtherUppercase',
+'wb',
+'WordBreak',
+'math',
+'Math',
+'sb',
+'SentenceBreak',
+'qmark',
+'QuotationMark',
+'nfdqc',
+'NFDQuickCheck',
+'ideo',
+'Ideographic',
+'blk',
+'Block',
+'odi',
+'OtherDefaultIgnorableCodePoint',
+'hst',
+'HangulSyllableType',
+'bidim',
+'BidiMirrored',
+'olower',
+'OtherLowercase',
+'na',
+'Name',
+'hyphen',
+'Hyphen',
+'xidc',
+'XIDContinue',
+'oidc',
+'OtherIDContinue',
+'bidic',
+'BidiControl',
+'na1',
+'Unicode1Name',
+'compex',
+'FullCompositionExclusion',
+'ext',
+'Extender',
+'cf',
+'CaseFolding',
+'grlink',
+'GraphemeLink',
+'xonfc',
+'ExpandsOnNFC',
+'sd',
+'SoftDotted',
+'ccc',
+'CanonicalCombiningClass',
+'dash',
+'Dash',
+'hex',
+'HexDigit',
+'grbase',
+'GraphemeBase',
+'dt',
+'DecompositionType',
+'xonfd',
+'ExpandsOnNFD',
+'scc',
+'SpecialCaseCondition',
+'idsb',
+'IDSBinaryOperator',
+'age',
+'Age',
+'loe',
+'LogicalOrderException',
+'term',
+'TerminalPunctuation',
+'ce',
+'CompositionExclusion',
+'isc',
+'ISOComment',
+'dep',
+'Deprecated',
+'sfc',
+'SimpleCaseFolding',
+'bc',
+'BidiClass',
+'nchar',
+'NoncharacterCodePoint',
+'jt',
+'JoiningType',
+'upper',
+'Uppercase',
+'uideo',
+'UnifiedIdeograph',
+'sterm',
+'STerm',
+'nfkdqc',
+'NFKDQuickCheck',
+'oids',
+'OtherIDStart',
+'joinc',
+'JoinControl',
+'nv',
+'NumericValue',
+'suc',
+'SimpleUppercaseMapping',
+'urs',
+'UnicodeRadicalStroke',
+'bmg',
+'BidiMirroringGlyph',
+'grext',
+'GraphemeExtend',
+'idc',
+'IDContinue',
+'vs',
+'VariationSelector',
+'omath',
+'OtherMath',
+'lc',
+'LowercaseMapping',
+'ogrext',
+'OtherGraphemeExtend',
+'jg',
+'JoiningGroup',
+);
+
+%utf8::PA_reverse = (
+'linebreak',
+'lb',
+'bidiclass',
+'bc',
+'terminalpunctuation',
+'Term',
+'expandsonnfkc',
+'XONFKC',
+'extender',
+'Ext',
+'simplecasefolding',
+'sfc',
+'patternsyntax',
+'PatSyn',
+'sentencebreak',
+'SB',
+'numericvalue',
+'nv',
+'patternwhitespace',
+'PatWS',
+'softdotted',
+'SD',
+'logicalorderexception',
+'LOE',
+'idstart',
+'IDS',
+'generalcategory',
+'gc',
+'decompositiontype',
+'dt',
+'name',
+'na',
+'numerictype',
+'nt',
+'otherlowercase',
+'OLower',
+'joininggroup',
+'jg',
+'expandsonnfkd',
+'XONFKD',
+'deprecated',
+'Dep',
+'radical',
+'Radical',
+'idstrinaryoperator',
+'IDST',
+'xidstart',
+'XIDS',
+'lowercase',
+'Lower',
+'unifiedideograph',
+'UIdeo',
+'othergraphemeextend',
+'OGrExt',
+'eastasianwidth',
+'ea',
+'math',
+'Math',
+'graphemelink',
+'GrLink',
+'noncharactercodepoint',
+'NChar',
+'graphemebase',
+'GrBase',
+'bidimirrored',
+'BidiM',
+'casefolding',
+'cf',
+'simpleuppercasemapping',
+'suc',
+'fullcompositionexclusion',
+'CompEx',
+'compositionexclusion',
+'CE',
+'uppercasemapping',
+'uc',
+'decompositionmapping',
+'dm',
+'whitespace',
+'WSpace',
+'hyphen',
+'Hyphen',
+'ideographic',
+'Ideo',
+'idcontinue',
+'IDC',
+'idsbinaryoperator',
+'IDSB',
+'hangulsyllabletype',
+'hst',
+'asciihexdigit',
+'AHex',
+'otheruppercase',
+'OUpper',
+'nfkdquickcheck',
+'NFKDQC',
+'simpletitlecasemapping',
+'stc',
+'nfcquickcheck',
+'NFCQC',
+'bidicontrol',
+'BidiC',
+'diacritic',
+'Dia',
+'joiningtype',
+'jt',
+'otheralphabetic',
+'OAlpha',
+'canonicalcombiningclass',
+'ccc',
+'alphabetic',
+'Alpha',
+'titlecasemapping',
+'tc',
+'unicoderadicalstroke',
+'URS',
+'hexdigit',
+'Hex',
+'unicode1name',
+'na1',
+'dash',
+'Dash',
+'fcnfkcclosure',
+'FCNFKC',
+'graphemeextend',
+'GrExt',
+'joincontrol',
+'JoinC',
+'xidcontinue',
+'XIDC',
+'quotationmark',
+'QMark',
+'expandsonnfd',
+'XONFD',
+'age',
+'age',
+'otheridcontinue',
+'OIDC',
+'uppercase',
+'Upper',
+'expandsonnfc',
+'XONFC',
+'defaultignorablecodepoint',
+'DI',
+'nfdquickcheck',
+'NFDQC',
+'isocomment',
+'isc',
+'otherdefaultignorablecodepoint',
+'ODI',
+'variationselector',
+'VS',
+'specialcasecondition',
+'scc',
+'script',
+'sc',
+'otheridstart',
+'OIDS',
+'sterm',
+'STerm',
+'graphemeclusterbreak',
+'GCB',
+'nfkcquickcheck',
+'NFKCQC',
+'bidimirroringglyph',
+'bmg',
+'othermath',
+'OMath',
+'block',
+'blk',
+'wordbreak',
+'WB',
+'lowercasemapping',
+'lc',
+'simplelowercasemapping',
+'slc',
+);
+
+%utf8::PropValueAlias = (
+'sc',
+{
+'tglg',
+'Tagalog',
+'runr',
+'Runic',
+'osma',
+'Osmanya',
+'hano',
+'Hanunoo',
+'cans',
+'CanadianAboriginal',
+'tagb',
+'Tagbanwa',
+'mlym',
+'Malayalam',
+'knda',
+'Kannada',
+'grek',
+'Greek',
+'ethi',
+'Ethiopic',
+'orya',
+'Oriya',
+'cher',
+'Cherokee',
+'mong',
+'Mongolian',
+'khmr',
+'Khmer',
+'ogam',
+'Ogham',
+'hrkt',
+'KatakanaOrHiragana',
+'armn',
+'Armenian',
+'ital',
+'OldItalic',
+'hani',
+'Han',
+'shaw',
+'Shavian',
+'taml',
+'Tamil',
+'tibt',
+'Tibetan',
+'guru',
+'Gurmukhi',
+'ugar',
+'Ugaritic',
+'qaai',
+'Inherited',
+'kana',
+'Katakana',
+'gujr',
+'Gujarati',
+'thaa',
+'Thaana',
+'cyrl',
+'Cyrillic',
+'copt',
+'Coptic',
+'sylo',
+'SylotiNagri',
+'thai',
+'Thai',
+'talu',
+'NewTaiLue',
+'laoo',
+'Lao',
+'sinh',
+'Sinhala',
+'beng',
+'Bengali',
+'hira',
+'Hiragana',
+'brai',
+'Braille',
+'telu',
+'Telugu',
+'limb',
+'Limbu',
+'geor',
+'Georgian',
+'mymr',
+'Myanmar',
+'glag',
+'Glagolitic',
+'hang',
+'Hangul',
+'syrc',
+'Syriac',
+'tfng',
+'Tifinagh',
+'dsrt',
+'Deseret',
+'buhd',
+'Buhid',
+'yiii',
+'Yi',
+'arab',
+'Arabic',
+'bopo',
+'Bopomofo',
+'khar',
+'Kharoshthi',
+'linb',
+'LinearB',
+'deva',
+'Devanagari',
+'xpeo',
+'OldPersian',
+'goth',
+'Gothic',
+'cprt',
+'Cypriot',
+'tale',
+'TaiLe',
+'zyyy',
+'Common',
+'latn',
+'Latin',
+'bugi',
+'Buginese',
+'hebr',
+'Hebrew',
+},
+'dt',
+{
+'fra',
+'Fraction',
+'none',
+'None',
+'sml',
+'Small',
+'enc',
+'Circle',
+'font',
+'Font',
+'init',
+'Initial',
+'nb',
+'Nobreak',
+'iso',
+'Isolated',
+'sup',
+'Super',
+'fin',
+'Final',
+'wide',
+'Wide',
+'nar',
+'Narrow',
+'can',
+'Canonical',
+'med',
+'Medial',
+'sub',
+'Sub',
+'vert',
+'Vertical',
+'sqr',
+'Square',
+'com',
+'Compat',
+},
+'nt',
+{
+'none',
+'None',
+'di',
+'Digit',
+'de',
+'Decimal',
+'nu',
+'Numeric',
+},
+'ea',
+{
+'w',
+'Wide',
+'n',
+'Neutral',
+'h',
+'Halfwidth',
+'a',
+'Ambiguous',
+'f',
+'Fullwidth',
+'na',
+'Narrow',
+},
+'NFKC_QC',
+{
+'y',
+'Yes',
+'n',
+'No',
+'m',
+'Maybe',
+},
+'bc',
+{
+'r',
+'RightToLeft',
+'rlo',
+'RightToLeftOverride',
+'es',
+'EuropeanSeparator',
+'ws',
+'WhiteSpace',
+'rle',
+'RightToLeftEmbedding',
+'on',
+'OtherNeutral',
+'bn',
+'BoundaryNeutral',
+'et',
+'EuropeanTerminator',
+'pdf',
+'PopDirectionalFormat',
+'lro',
+'LeftToRightOverride',
+'s',
+'SegmentSeparator',
+'al',
+'ArabicLetter',
+'en',
+'EuropeanNumber',
+'l',
+'LeftToRight',
+'b',
+'ParagraphSeparator',
+'lre',
+'LeftToRightEmbedding',
+'cs',
+'CommonSeparator',
+'nsm',
+'NonspacingMark',
+'an',
+'ArabicNumber',
+},
+'gc',
+{
+'sc',
+'CurrencySymbol',
+'mc',
+'SpacingMark',
+'lm',
+'ModifierLetter',
+'cn',
+'Unassigned',
+'pf',
+'FinalPunctuation',
+'no',
+'OtherNumber',
+'cc',
+'Control',
+'lo',
+'OtherLetter',
+'po',
+'OtherPunctuation',
+'zs',
+'SpaceSeparator',
+'co',
+'PrivateUse',
+'so',
+'OtherSymbol',
+'ll',
+'LowercaseLetter',
+'nd',
+'DecimalNumber',
+'cf',
+'Format',
+'me',
+'EnclosingMark',
+'s',
+'Symbol',
+'zp',
+'ParagraphSeparator',
+'pd',
+'DashPunctuation',
+'c',
+'Other',
+'lt',
+'TitlecaseLetter',
+'cs',
+'Surrogate',
+'l&',
+'CasedLetter',
+'z',
+'Separator',
+'ps',
+'OpenPunctuation',
+'zl',
+'LineSeparator',
+'pc',
+'ConnectorPunctuation',
+'pi',
+'InitialPunctuation',
+'n',
+'Number',
+'m',
+'Mark',
+'nl',
+'LetterNumber',
+'sm',
+'MathSymbol',
+'l',
+'Letter',
+'mn',
+'NonspacingMark',
+'p',
+'Punctuation',
+'lc',
+'CasedLetter',
+'sk',
+'ModifierSymbol',
+'lu',
+'UppercaseLetter',
+'pe',
+'ClosePunctuation',
+},
+'GCB',
+{
+'cn',
+'Control',
+'ex',
+'Extend',
+'v',
+'V',
+'lv',
+'LV',
+'xx',
+'Other',
+'l',
+'L',
+'lvt',
+'LVT',
+'cr',
+'CR',
+'lf',
+'LF',
+'t',
+'T',
+},
+'lb',
+{
+'sp',
+'Space',
+'ba',
+'BreakAfter',
+'gl',
+'Glue',
+'xx',
+'Unknown',
+'nu',
+'Numeric',
+'cb',
+'ContingentBreak',
+'sy',
+'BreakSymbols',
+'cr',
+'CarriageReturn',
+'in',
+'Inseparable',
+'bb',
+'BreakBefore',
+'sg',
+'Surrogate',
+'sa',
+'ComplexContext',
+'po',
+'PostfixNumeric',
+'jl',
+'JL',
+'id',
+'Ideographic',
+'al',
+'Alphabetic',
+'bk',
+'MandatoryBreak',
+'pr',
+'PrefixNumeric',
+'b2',
+'BreakBoth',
+'op',
+'OpenPunctuation',
+'cl',
+'ClosePunctuation',
+'is',
+'InfixNumeric',
+'qu',
+'Quotation',
+'hy',
+'Hyphen',
+'wj',
+'WordJoiner',
+'zw',
+'ZWSpace',
+'jt',
+'JT',
+'ex',
+'Exclamation',
+'cm',
+'CombiningMark',
+'h2',
+'H2',
+'nl',
+'NextLine',
+'ns',
+'Nonstarter',
+'h3',
+'H3',
+'ai',
+'Ambiguous',
+'lf',
+'LineFeed',
+'jv',
+'JV',
+},
+'jt',
+{
+'l',
+'LeftJoining',
+'u',
+'NonJoining',
+'c',
+'JoinCausing',
+'r',
+'RightJoining',
+'d',
+'DualJoining',
+'t',
+'Transparent',
+},
+'NFKD_QC',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'NFC_QC',
+{
+'y',
+'Yes',
+'n',
+'No',
+'m',
+'Maybe',
+},
+'hst',
+{
+'l',
+'LeadingJamo',
+'lvt',
+'LVTSyllable',
+'v',
+'VowelJamo',
+'lv',
+'LVSyllable',
+'t',
+'TrailingJamo',
+'na',
+'NotApplicable',
+},
+'NFD_QC',
+{
+'y',
+'Yes',
+'n',
+'No',
+},
+'WB',
+{
+'ml',
+'MidLetter',
+'le',
+'ALetter',
+'ex',
+'ExtendNumLet',
+'xx',
+'Other',
+'nu',
+'Numeric',
+'fo',
+'Format',
+'mn',
+'MidNum',
+'ka',
+'Katakana',
+},
+'SB',
+{
+'sp',
+'Sp',
+'cl',
+'Close',
+'le',
+'OLetter',
+'up',
+'Upper',
+'st',
+'STerm',
+'xx',
+'Other',
+'nu',
+'Numeric',
+'fo',
+'Format',
+'se',
+'Sep',
+'lo',
+'Lower',
+'at',
+'ATerm',
+},
+'ccc',
+{
+'atb',
+'AttachedBelow',
+'db',
+'DoubleBelow',
+'a',
+'Above',
+'r',
+'Right',
+'da',
+'DoubleAbove',
+'is',
+'IotaSubscript',
+'nr',
+'NotReordered',
+'ov',
+'Overlay',
+'br',
+'BelowRight',
+'nk',
+'Nukta',
+'atbl',
+'AttachedBelowLeft',
+'al',
+'AboveLeft',
+'ar',
+'AboveRight',
+'atar',
+'AttachedAboveRight',
+'l',
+'Left',
+'b',
+'Below',
+'vr',
+'Virama',
+'kv',
+'KanaVoicing',
+'bl',
+'BelowLeft',
+},
+);
+
+%utf8::PVA_reverse = (
+'sc',
+{
+'newtailue',
+'Talu',
+'canadianaboriginal',
+'Cans',
+'gujarati',
+'Gujr',
+'latin',
+'Latn',
+'hangul',
+'Hang',
+'deseret',
+'Dsrt',
+'hebrew',
+'Hebr',
+'inherited',
+'Qaai',
+'linearb',
+'Linb',
+'ugaritic',
+'Ugar',
+'taile',
+'Tale',
+'armenian',
+'Armn',
+'tifinagh',
+'Tfng',
+'myanmar',
+'Mymr',
+'gurmukhi',
+'Guru',
+'greek',
+'Grek',
+'coptic',
+'Copt',
+'cyrillic',
+'Cyrl',
+'thaana',
+'Thaa',
+'lao',
+'Laoo',
+'katakana',
+'Kana',
+'khmer',
+'Khmr',
+'tibetan',
+'Tibt',
+'hiragana',
+'Hira',
+'mongolian',
+'Mong',
+'thai',
+'Thai',
+'yi',
+'Yiii',
+'sylotinagri',
+'Sylo',
+'bopomofo',
+'Bopo',
+'malayalam',
+'Mlym',
+'telugu',
+'Telu',
+'limbu',
+'Limb',
+'oriya',
+'Orya',
+'buhid',
+'Buhd',
+'cypriot',
+'Cprt',
+'bengali',
+'Beng',
+'katakanaorhiragana',
+'Hrkt',
+'oldpersian',
+'Xpeo',
+'tagalog',
+'Tglg',
+'syriac',
+'Syrc',
+'cherokee',
+'Cher',
+'ogham',
+'Ogam',
+'hanunoo',
+'Hano',
+'braille',
+'Brai',
+'tamil',
+'Taml',
+'common',
+'Zyyy',
+'runic',
+'Runr',
+'georgian',
+'Geor',
+'ethiopic',
+'Ethi',
+'glagolitic',
+'Glag',
+'han',
+'Hani',
+'kharoshthi',
+'Khar',
+'kannada',
+'Knda',
+'tagbanwa',
+'Tagb',
+'arabic',
+'Arab',
+'sinhala',
+'Sinh',
+'gothic',
+'Goth',
+'osmanya',
+'Osma',
+'olditalic',
+'Ital',
+'devanagari',
+'Deva',
+'buginese',
+'Bugi',
+'shavian',
+'Shaw',
+},
+'dt',
+{
+'small',
+'sml',
+'none',
+'none',
+'isolated',
+'iso',
+'narrow',
+'nar',
+'square',
+'sqr',
+'nobreak',
+'nb',
+'fraction',
+'fra',
+'font',
+'font',
+'medial',
+'med',
+'wide',
+'wide',
+'canonical',
+'can',
+'circle',
+'enc',
+'super',
+'sup',
+'vertical',
+'vert',
+'final',
+'fin',
+'compat',
+'com',
+'sub',
+'sub',
+'initial',
+'init',
+},
+'nt',
+{
+'none',
+'None',
+'digit',
+'Di',
+'numeric',
+'Nu',
+'decimal',
+'De',
+},
+'ea',
+{
+'halfwidth',
+'H',
+'fullwidth',
+'F',
+'ambiguous',
+'A',
+'narrow',
+'Na',
+'wide',
+'W',
+'neutral',
+'N',
+},
+'NFKC_QC',
+{
+'yes',
+'Y',
+'maybe',
+'M',
+'no',
+'N',
+},
+'bc',
+{
+'nonspacingmark',
+'NSM',
+'whitespace',
+'WS',
+'righttoleft',
+'R',
+'lefttoright',
+'L',
+'boundaryneutral',
+'BN',
+'segmentseparator',
+'S',
+'lefttorightembedding',
+'LRE',
+'europeanterminator',
+'ET',
+'righttoleftembedding',
+'RLE',
+'righttoleftoverride',
+'RLO',
+'lefttorightoverride',
+'LRO',
+'europeanseparator',
+'ES',
+'europeannumber',
+'EN',
+'commonseparator',
+'CS',
+'arabicletter',
+'AL',
+'paragraphseparator',
+'B',
+'otherneutral',
+'ON',
+'popdirectionalformat',
+'PDF',
+'arabicnumber',
+'AN',
+},
+'gc',
+{
+'modifiersymbol',
+'Sk',
+'letternumber',
+'Nl',
+'connectorpunctuation',
+'Pc',
+'spacingmark',
+'Mc',
+'mark',
+'M',
+'unassigned',
+'Cn',
+'enclosingmark',
+'Me',
+'lineseparator',
+'Zl',
+'lowercaseletter',
+'Ll',
+'symbol',
+'S',
+'letter',
+'L',
+'othernumber',
+'No',
+'paragraphseparator',
+'Zp',
+'modifierletter',
+'Lm',
+'titlecaseletter',
+'Lt',
+'decimalnumber',
+'Nd',
+'other',
+'C',
+'mathsymbol',
+'Sm',
+'surrogate',
+'Cs',
+'otherletter',
+'Lo',
+'nonspacingmark',
+'Mn',
+'number',
+'N',
+'uppercaseletter',
+'Lu',
+'spaceseparator',
+'Zs',
+'privateuse',
+'Co',
+'openpunctuation',
+'Ps',
+'punctuation',
+'P',
+'control',
+'Cc',
+'casedletter',
+'LC',
+'closepunctuation',
+'Pe',
+'otherpunctuation',
+'Po',
+'finalpunctuation',
+'Pf',
+'format',
+'Cf',
+'initialpunctuation',
+'Pi',
+'separator',
+'Z',
+'othersymbol',
+'So',
+'dashpunctuation',
+'Pd',
+'currencysymbol',
+'Sc',
+},
+'GCB',
+{
+'extend',
+'EX',
+'v',
+'V',
+'lv',
+'LV',
+'l',
+'L',
+'lvt',
+'LVT',
+'cr',
+'CR',
+'other',
+'XX',
+'lf',
+'LF',
+'control',
+'CN',
+'t',
+'T',
+},
+'lb',
+{
+'carriagereturn',
+'CR',
+'ideographic',
+'ID',
+'hyphen',
+'HY',
+'ambiguous',
+'AI',
+'contingentbreak',
+'CB',
+'complexcontext',
+'SA',
+'prefixnumeric',
+'PR',
+'jl',
+'JL',
+'inseparable',
+'IN',
+'breaksymbols',
+'SY',
+'breakafter',
+'BA',
+'breakbefore',
+'BB',
+'postfixnumeric',
+'PO',
+'glue',
+'GL',
+'wordjoiner',
+'WJ',
+'breakboth',
+'B2',
+'quotation',
+'QU',
+'combiningmark',
+'CM',
+'nonstarter',
+'NS',
+'linefeed',
+'LF',
+'alphabetic',
+'AL',
+'surrogate',
+'SG',
+'mandatorybreak',
+'BK',
+'unknown',
+'XX',
+'exclamation',
+'EX',
+'openpunctuation',
+'OP',
+'jt',
+'JT',
+'closepunctuation',
+'CL',
+'space',
+'SP',
+'zwspace',
+'ZW',
+'h2',
+'H2',
+'infixnumeric',
+'IS',
+'nextline',
+'NL',
+'numeric',
+'NU',
+'h3',
+'H3',
+'jv',
+'JV',
+},
+'jt',
+{
+'leftjoining',
+'L',
+'transparent',
+'T',
+'nonjoining',
+'U',
+'rightjoining',
+'R',
+'dualjoining',
+'D',
+'joincausing',
+'C',
+},
+'NFKD_QC',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'NFC_QC',
+{
+'yes',
+'Y',
+'maybe',
+'M',
+'no',
+'N',
+},
+'hst',
+{
+'lvtsyllable',
+'LVT',
+'lvsyllable',
+'LV',
+'leadingjamo',
+'L',
+'notapplicable',
+'NA',
+'voweljamo',
+'V',
+'trailingjamo',
+'T',
+},
+'NFD_QC',
+{
+'yes',
+'Y',
+'no',
+'N',
+},
+'WB',
+{
+'midletter',
+'ML',
+'format',
+'FO',
+'katakana',
+'KA',
+'other',
+'XX',
+'midnum',
+'MN',
+'numeric',
+'NU',
+'extendnumlet',
+'EX',
+'aletter',
+'LE',
+},
+'SB',
+{
+'sp',
+'SP',
+'upper',
+'UP',
+'sterm',
+'ST',
+'aterm',
+'AT',
+'close',
+'CL',
+'oletter',
+'LE',
+'sep',
+'SE',
+'format',
+'FO',
+'other',
+'XX',
+'lower',
+'LO',
+'numeric',
+'NU',
+},
+'ccc',
+{
+'left',
+'L',
+'attachedbelowleft',
+'ATBL',
+'belowleft',
+'BL',
+'aboveright',
+'AR',
+'kanavoicing',
+'KV',
+'above',
+'A',
+'aboveleft',
+'AL',
+'nukta',
+'NK',
+'below',
+'B',
+'doublebelow',
+'DB',
+'virama',
+'VR',
+'belowright',
+'BR',
+'notreordered',
+'NR',
+'attachedbelow',
+'ATB',
+'right',
+'R',
+'iotasubscript',
+'IS',
+'doubleabove',
+'DA',
+'attachedaboveright',
+'ATAR',
+'overlay',
+'OV',
+},
+);
+
+%utf8::PVA_abbr_map = (
+'jt',
+{
+'l',
+'L',
+'u',
+'U',
+'c',
+'C',
+'r',
+'R',
+'d',
+'D',
+'t',
+'T',
+},
+'dt',
+{
+'fra',
+'fra',
+'none',
+'none',
+'sml',
+'sml',
+'enc',
+'enc',
+'font',
+'font',
+'init',
+'init',
+'nb',
+'nb',
+'iso',
+'iso',
+'sup',
+'sup',
+'fin',
+'fin',
+'wide',
+'wide',
+'nar',
+'nar',
+'can',
+'can',
+'med',
+'med',
+'sub',
+'sub',
+'vert',
+'vert',
+'sqr',
+'sqr',
+'com',
+'com',
+},
+'nt',
+{
+'none',
+'None',
+'di',
+'Di',
+'de',
+'De',
+'nu',
+'Nu',
+},
+'NFKD_QC',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'ea',
+{
+'w',
+'W',
+'n',
+'N',
+'h',
+'H',
+'a',
+'A',
+'f',
+'F',
+'na',
+'Na',
+},
+'gc_sc',
+{
+'runr',
+'Runr',
+'osma',
+'Osma',
+'sc',
+'Sc',
+'mc',
+'Mc',
+'hano',
+'Hano',
+'cans',
+'Cans',
+'lm',
+'Lm',
+'cn',
+'Cn',
+'knda',
+'Knda',
+'orya',
+'Orya',
+'cher',
+'Cher',
+'khmr',
+'Khmr',
+'ogam',
+'Ogam',
+'lo',
+'Lo',
+'po',
+'Po',
+'co',
+'Co',
+'ital',
+'Ital',
+'ll',
+'Ll',
+'tibt',
+'Tibt',
+'kana',
+'Kana',
+'zp',
+'Zp',
+'gujr',
+'Gujr',
+'thaa',
+'Thaa',
+'cs',
+'Cs',
+'copt',
+'Copt',
+'z',
+'Z',
+'ps',
+'Ps',
+'sylo',
+'Sylo',
+'talu',
+'Talu',
+'laoo',
+'Laoo',
+'sinh',
+'Sinh',
+'zl',
+'Zl',
+'pc',
+'Pc',
+'hira',
+'Hira',
+'limb',
+'Limb',
+'mymr',
+'Mymr',
+'yiii',
+'Yiii',
+'arab',
+'Arab',
+'deva',
+'Deva',
+'xpeo',
+'Xpeo',
+'cprt',
+'Cprt',
+'bugi',
+'Bugi',
+'sk',
+'Sk',
+'hebr',
+'Hebr',
+'lu',
+'Lu',
+'pe',
+'Pe',
+'tglg',
+'Tglg',
+'tagb',
+'Tagb',
+'mlym',
+'Mlym',
+'pf',
+'Pf',
+'no',
+'No',
+'grek',
+'Grek',
+'ethi',
+'Ethi',
+'mong',
+'Mong',
+'cc',
+'Cc',
+'hrkt',
+'Hrkt',
+'armn',
+'Armn',
+'zs',
+'Zs',
+'so',
+'So',
+'hani',
+'Hani',
+'shaw',
+'Shaw',
+'taml',
+'Taml',
+'me',
+'Me',
+'cf',
+'Cf',
+'nd',
+'Nd',
+'s',
+'S',
+'guru',
+'Guru',
+'ugar',
+'Ugar',
+'qaai',
+'Qaai',
+'lt',
+'Lt',
+'c',
+'C',
+'pd',
+'Pd',
+'cyrl',
+'Cyrl',
+'l&',
+'LC',
+'thai',
+'Thai',
+'beng',
+'Beng',
+'brai',
+'Brai',
+'telu',
+'Telu',
+'pi',
+'Pi',
+'geor',
+'Geor',
+'glag',
+'Glag',
+'hang',
+'Hang',
+'syrc',
+'Syrc',
+'tfng',
+'Tfng',
+'n',
+'N',
+'dsrt',
+'Dsrt',
+'buhd',
+'Buhd',
+'m',
+'M',
+'khar',
+'Khar',
+'sm',
+'Sm',
+'nl',
+'Nl',
+'bopo',
+'Bopo',
+'linb',
+'Linb',
+'mn',
+'Mn',
+'l',
+'L',
+'p',
+'P',
+'goth',
+'Goth',
+'tale',
+'Tale',
+'lc',
+'LC',
+'zyyy',
+'Zyyy',
+'latn',
+'Latn',
+},
+'NFC_QC',
+{
+'y',
+'Y',
+'n',
+'N',
+'m',
+'M',
+},
+'NFD_QC',
+{
+'y',
+'Y',
+'n',
+'N',
+},
+'hst',
+{
+'l',
+'L',
+'lvt',
+'LVT',
+'v',
+'V',
+'lv',
+'LV',
+'t',
+'T',
+'na',
+'NA',
+},
+'NFKC_QC',
+{
+'y',
+'Y',
+'n',
+'N',
+'m',
+'M',
+},
+'WB',
+{
+'ml',
+'ML',
+'le',
+'LE',
+'ex',
+'EX',
+'xx',
+'XX',
+'nu',
+'NU',
+'fo',
+'FO',
+'mn',
+'MN',
+'ka',
+'KA',
+},
+'SB',
+{
+'sp',
+'SP',
+'cl',
+'CL',
+'le',
+'LE',
+'up',
+'UP',
+'st',
+'ST',
+'xx',
+'XX',
+'nu',
+'NU',
+'fo',
+'FO',
+'se',
+'SE',
+'lo',
+'LO',
+'at',
+'AT',
+},
+'bc',
+{
+'r',
+'R',
+'rlo',
+'RLO',
+'es',
+'ES',
+'ws',
+'WS',
+'rle',
+'RLE',
+'on',
+'ON',
+'bn',
+'BN',
+'et',
+'ET',
+'pdf',
+'PDF',
+'lro',
+'LRO',
+'s',
+'S',
+'al',
+'AL',
+'en',
+'EN',
+'l',
+'L',
+'b',
+'B',
+'lre',
+'LRE',
+'cs',
+'CS',
+'nsm',
+'NSM',
+'an',
+'AN',
+},
+'GCB',
+{
+'cn',
+'CN',
+'ex',
+'EX',
+'v',
+'V',
+'lv',
+'LV',
+'xx',
+'XX',
+'l',
+'L',
+'lvt',
+'LVT',
+'cr',
+'CR',
+'lf',
+'LF',
+'t',
+'T',
+},
+'ccc',
+{
+'atb',
+'ATB',
+'db',
+'DB',
+'a',
+'A',
+'r',
+'R',
+'da',
+'DA',
+'is',
+'IS',
+'nr',
+'NR',
+'ov',
+'OV',
+'br',
+'BR',
+'nk',
+'NK',
+'atbl',
+'ATBL',
+'al',
+'AL',
+'ar',
+'AR',
+'atar',
+'ATAR',
+'l',
+'L',
+'b',
+'B',
+'vr',
+'VR',
+'kv',
+'KV',
+'bl',
+'BL',
+},
+'lb',
+{
+'sp',
+'SP',
+'ba',
+'BA',
+'gl',
+'GL',
+'xx',
+'XX',
+'nu',
+'NU',
+'cb',
+'CB',
+'sy',
+'SY',
+'cr',
+'CR',
+'in',
+'IN',
+'bb',
+'BB',
+'sg',
+'SG',
+'sa',
+'SA',
+'po',
+'PO',
+'jl',
+'JL',
+'id',
+'ID',
+'al',
+'AL',
+'bk',
+'BK',
+'pr',
+'PR',
+'b2',
+'B2',
+'op',
+'OP',
+'cl',
+'CL',
+'is',
+'IS',
+'qu',
+'QU',
+'hy',
+'HY',
+'wj',
+'WJ',
+'zw',
+'ZW',
+'jt',
+'JT',
+'ex',
+'EX',
+'cm',
+'CM',
+'h2',
+'H2',
+'nl',
+'NL',
+'ns',
+'NS',
+'h3',
+'H3',
+'ai',
+'AI',
+'lf',
+'LF',
+'jv',
+'JV',
+},
+);
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/PropList.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/PropList.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/PropList.txt	(revision 14489)
@@ -0,0 +1,1049 @@
+# PropList-4.1.0.txt
+# Date: 2005-03-26, 00:34:40 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+
+# ================================================
+
+0009..000D    ; White_Space # Cc   [5] <control-0009>..<control-000D>
+0020          ; White_Space # Zs       SPACE
+0085          ; White_Space # Cc       <control-0085>
+00A0          ; White_Space # Zs       NO-BREAK SPACE
+1680          ; White_Space # Zs       OGHAM SPACE MARK
+180E          ; White_Space # Zs       MONGOLIAN VOWEL SEPARATOR
+2000..200A    ; White_Space # Zs  [11] EN QUAD..HAIR SPACE
+2028          ; White_Space # Zl       LINE SEPARATOR
+2029          ; White_Space # Zp       PARAGRAPH SEPARATOR
+202F          ; White_Space # Zs       NARROW NO-BREAK SPACE
+205F          ; White_Space # Zs       MEDIUM MATHEMATICAL SPACE
+3000          ; White_Space # Zs       IDEOGRAPHIC SPACE
+
+# Total code points: 26
+
+# ================================================
+
+200E..200F    ; Bidi_Control # Cf   [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+202A..202E    ; Bidi_Control # Cf   [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+
+# Total code points: 7
+
+# ================================================
+
+200C..200D    ; Join_Control # Cf   [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+
+# Total code points: 2
+
+# ================================================
+
+002D          ; Dash # Pd       HYPHEN-MINUS
+058A          ; Dash # Pd       ARMENIAN HYPHEN
+1806          ; Dash # Pd       MONGOLIAN TODO SOFT HYPHEN
+2010..2015    ; Dash # Pd   [6] HYPHEN..HORIZONTAL BAR
+2053          ; Dash # Po       SWUNG DASH
+207B          ; Dash # Sm       SUPERSCRIPT MINUS
+208B          ; Dash # Sm       SUBSCRIPT MINUS
+2212          ; Dash # Sm       MINUS SIGN
+2E17          ; Dash # Pd       DOUBLE OBLIQUE HYPHEN
+301C          ; Dash # Pd       WAVE DASH
+3030          ; Dash # Pd       WAVY DASH
+30A0          ; Dash # Pd       KATAKANA-HIRAGANA DOUBLE HYPHEN
+FE31..FE32    ; Dash # Pd   [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE58          ; Dash # Pd       SMALL EM DASH
+FE63          ; Dash # Pd       SMALL HYPHEN-MINUS
+FF0D          ; Dash # Pd       FULLWIDTH HYPHEN-MINUS
+
+# Total code points: 22
+
+# ================================================
+
+002D          ; Hyphen # Pd       HYPHEN-MINUS
+00AD          ; Hyphen # Cf       SOFT HYPHEN
+058A          ; Hyphen # Pd       ARMENIAN HYPHEN
+1806          ; Hyphen # Pd       MONGOLIAN TODO SOFT HYPHEN
+2010..2011    ; Hyphen # Pd   [2] HYPHEN..NON-BREAKING HYPHEN
+2E17          ; Hyphen # Pd       DOUBLE OBLIQUE HYPHEN
+30FB          ; Hyphen # Po       KATAKANA MIDDLE DOT
+FE63          ; Hyphen # Pd       SMALL HYPHEN-MINUS
+FF0D          ; Hyphen # Pd       FULLWIDTH HYPHEN-MINUS
+FF65          ; Hyphen # Po       HALFWIDTH KATAKANA MIDDLE DOT
+
+# Total code points: 11
+
+# ================================================
+
+0022          ; Quotation_Mark # Po       QUOTATION MARK
+0027          ; Quotation_Mark # Po       APOSTROPHE
+00AB          ; Quotation_Mark # Pi       LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BB          ; Quotation_Mark # Pf       RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+2018          ; Quotation_Mark # Pi       LEFT SINGLE QUOTATION MARK
+2019          ; Quotation_Mark # Pf       RIGHT SINGLE QUOTATION MARK
+201A          ; Quotation_Mark # Ps       SINGLE LOW-9 QUOTATION MARK
+201B..201C    ; Quotation_Mark # Pi   [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D          ; Quotation_Mark # Pf       RIGHT DOUBLE QUOTATION MARK
+201E          ; Quotation_Mark # Ps       DOUBLE LOW-9 QUOTATION MARK
+201F          ; Quotation_Mark # Pi       DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2039          ; Quotation_Mark # Pi       SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A          ; Quotation_Mark # Pf       SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+300C          ; Quotation_Mark # Ps       LEFT CORNER BRACKET
+300D          ; Quotation_Mark # Pe       RIGHT CORNER BRACKET
+300E          ; Quotation_Mark # Ps       LEFT WHITE CORNER BRACKET
+300F          ; Quotation_Mark # Pe       RIGHT WHITE CORNER BRACKET
+301D          ; Quotation_Mark # Ps       REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F    ; Quotation_Mark # Pe   [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+FE41          ; Quotation_Mark # Ps       PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42          ; Quotation_Mark # Pe       PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43          ; Quotation_Mark # Ps       PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44          ; Quotation_Mark # Pe       PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FF02          ; Quotation_Mark # Po       FULLWIDTH QUOTATION MARK
+FF07          ; Quotation_Mark # Po       FULLWIDTH APOSTROPHE
+FF62          ; Quotation_Mark # Ps       HALFWIDTH LEFT CORNER BRACKET
+FF63          ; Quotation_Mark # Pe       HALFWIDTH RIGHT CORNER BRACKET
+
+# Total code points: 29
+
+# ================================================
+
+0021          ; Terminal_Punctuation # Po       EXCLAMATION MARK
+002C          ; Terminal_Punctuation # Po       COMMA
+002E          ; Terminal_Punctuation # Po       FULL STOP
+003A..003B    ; Terminal_Punctuation # Po   [2] COLON..SEMICOLON
+003F          ; Terminal_Punctuation # Po       QUESTION MARK
+037E          ; Terminal_Punctuation # Po       GREEK QUESTION MARK
+0387          ; Terminal_Punctuation # Po       GREEK ANO TELEIA
+0589          ; Terminal_Punctuation # Po       ARMENIAN FULL STOP
+05C3          ; Terminal_Punctuation # Po       HEBREW PUNCTUATION SOF PASUQ
+060C          ; Terminal_Punctuation # Po       ARABIC COMMA
+061B          ; Terminal_Punctuation # Po       ARABIC SEMICOLON
+061F          ; Terminal_Punctuation # Po       ARABIC QUESTION MARK
+06D4          ; Terminal_Punctuation # Po       ARABIC FULL STOP
+0700..070A    ; Terminal_Punctuation # Po  [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION
+070C          ; Terminal_Punctuation # Po       SYRIAC HARKLEAN METOBELUS
+0964..0965    ; Terminal_Punctuation # Po   [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0E5A..0E5B    ; Terminal_Punctuation # Po   [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+0F08          ; Terminal_Punctuation # Po       TIBETAN MARK SBRUL SHAD
+0F0D..0F12    ; Terminal_Punctuation # Po   [6] TIBETAN MARK SHAD..TIBETAN MARK RGYA GRAM SHAD
+104A..104B    ; Terminal_Punctuation # Po   [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
+1361..1368    ; Terminal_Punctuation # Po   [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR
+166D..166E    ; Terminal_Punctuation # Po   [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+16EB..16ED    ; Terminal_Punctuation # Po   [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
+17D4..17D6    ; Terminal_Punctuation # Po   [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17DA          ; Terminal_Punctuation # Po       KHMER SIGN KOOMUUT
+1802..1805    ; Terminal_Punctuation # Po   [4] MONGOLIAN COMMA..MONGOLIAN FOUR DOTS
+1808..1809    ; Terminal_Punctuation # Po   [2] MONGOLIAN MANCHU COMMA..MONGOLIAN MANCHU FULL STOP
+1944..1945    ; Terminal_Punctuation # Po   [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+203C..203D    ; Terminal_Punctuation # Po   [2] DOUBLE EXCLAMATION MARK..INTERROBANG
+2047..2049    ; Terminal_Punctuation # Po   [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK
+3001..3002    ; Terminal_Punctuation # Po   [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP
+FE50..FE52    ; Terminal_Punctuation # Po   [3] SMALL COMMA..SMALL FULL STOP
+FE54..FE57    ; Terminal_Punctuation # Po   [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
+FF01          ; Terminal_Punctuation # Po       FULLWIDTH EXCLAMATION MARK
+FF0C          ; Terminal_Punctuation # Po       FULLWIDTH COMMA
+FF0E          ; Terminal_Punctuation # Po       FULLWIDTH FULL STOP
+FF1A..FF1B    ; Terminal_Punctuation # Po   [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON
+FF1F          ; Terminal_Punctuation # Po       FULLWIDTH QUESTION MARK
+FF61          ; Terminal_Punctuation # Po       HALFWIDTH IDEOGRAPHIC FULL STOP
+FF64          ; Terminal_Punctuation # Po       HALFWIDTH IDEOGRAPHIC COMMA
+
+# Total code points: 86
+
+# ================================================
+
+005E          ; Other_Math # Sk       CIRCUMFLEX ACCENT
+03D0..03D2    ; Other_Math # L&   [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL
+03D5          ; Other_Math # L&       GREEK PHI SYMBOL
+03F0..03F1    ; Other_Math # L&   [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL
+03F4..03F5    ; Other_Math # L&   [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+2016          ; Other_Math # Po       DOUBLE VERTICAL LINE
+2032..2034    ; Other_Math # Po   [3] PRIME..TRIPLE PRIME
+2040          ; Other_Math # Pc       CHARACTER TIE
+2061..2063    ; Other_Math # Cf   [3] FUNCTION APPLICATION..INVISIBLE SEPARATOR
+207D          ; Other_Math # Ps       SUPERSCRIPT LEFT PARENTHESIS
+207E          ; Other_Math # Pe       SUPERSCRIPT RIGHT PARENTHESIS
+208D          ; Other_Math # Ps       SUBSCRIPT LEFT PARENTHESIS
+208E          ; Other_Math # Pe       SUBSCRIPT RIGHT PARENTHESIS
+20D0..20DC    ; Other_Math # Mn  [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20E1          ; Other_Math # Mn       COMBINING LEFT RIGHT ARROW ABOVE
+20E5..20E6    ; Other_Math # Mn   [2] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING DOUBLE VERTICAL STROKE OVERLAY
+2102          ; Other_Math # L&       DOUBLE-STRUCK CAPITAL C
+210A..2113    ; Other_Math # L&  [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115          ; Other_Math # L&       DOUBLE-STRUCK CAPITAL N
+2119..211D    ; Other_Math # L&   [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124          ; Other_Math # L&       DOUBLE-STRUCK CAPITAL Z
+2128          ; Other_Math # L&       BLACK-LETTER CAPITAL Z
+2129          ; Other_Math # So       TURNED GREEK SMALL LETTER IOTA
+212C..212D    ; Other_Math # L&   [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C
+212F..2131    ; Other_Math # L&   [3] SCRIPT SMALL E..SCRIPT CAPITAL F
+2133..2134    ; Other_Math # L&   [2] SCRIPT CAPITAL M..SCRIPT SMALL O
+2135..2138    ; Other_Math # Lo   [4] ALEF SYMBOL..DALET SYMBOL
+213C..213F    ; Other_Math # L&   [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2145..2149    ; Other_Math # L&   [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+23B7          ; Other_Math # So       RADICAL SYMBOL BOTTOM
+23D0          ; Other_Math # So       VERTICAL LINE EXTENSION
+27C5          ; Other_Math # Ps       LEFT S-SHAPED BAG DELIMITER
+27C6          ; Other_Math # Pe       RIGHT S-SHAPED BAG DELIMITER
+27E6          ; Other_Math # Ps       MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7          ; Other_Math # Pe       MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8          ; Other_Math # Ps       MATHEMATICAL LEFT ANGLE BRACKET
+27E9          ; Other_Math # Pe       MATHEMATICAL RIGHT ANGLE BRACKET
+27EA          ; Other_Math # Ps       MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB          ; Other_Math # Pe       MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+2983          ; Other_Math # Ps       LEFT WHITE CURLY BRACKET
+2984          ; Other_Math # Pe       RIGHT WHITE CURLY BRACKET
+2985          ; Other_Math # Ps       LEFT WHITE PARENTHESIS
+2986          ; Other_Math # Pe       RIGHT WHITE PARENTHESIS
+2987          ; Other_Math # Ps       Z NOTATION LEFT IMAGE BRACKET
+2988          ; Other_Math # Pe       Z NOTATION RIGHT IMAGE BRACKET
+2989          ; Other_Math # Ps       Z NOTATION LEFT BINDING BRACKET
+298A          ; Other_Math # Pe       Z NOTATION RIGHT BINDING BRACKET
+298B          ; Other_Math # Ps       LEFT SQUARE BRACKET WITH UNDERBAR
+298C          ; Other_Math # Pe       RIGHT SQUARE BRACKET WITH UNDERBAR
+298D          ; Other_Math # Ps       LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E          ; Other_Math # Pe       RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F          ; Other_Math # Ps       LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990          ; Other_Math # Pe       RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991          ; Other_Math # Ps       LEFT ANGLE BRACKET WITH DOT
+2992          ; Other_Math # Pe       RIGHT ANGLE BRACKET WITH DOT
+2993          ; Other_Math # Ps       LEFT ARC LESS-THAN BRACKET
+2994          ; Other_Math # Pe       RIGHT ARC GREATER-THAN BRACKET
+2995          ; Other_Math # Ps       DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996          ; Other_Math # Pe       DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997          ; Other_Math # Ps       LEFT BLACK TORTOISE SHELL BRACKET
+2998          ; Other_Math # Pe       RIGHT BLACK TORTOISE SHELL BRACKET
+29D8          ; Other_Math # Ps       LEFT WIGGLY FENCE
+29D9          ; Other_Math # Pe       RIGHT WIGGLY FENCE
+29DA          ; Other_Math # Ps       LEFT DOUBLE WIGGLY FENCE
+29DB          ; Other_Math # Pe       RIGHT DOUBLE WIGGLY FENCE
+29FC          ; Other_Math # Ps       LEFT-POINTING CURVED ANGLE BRACKET
+29FD          ; Other_Math # Pe       RIGHT-POINTING CURVED ANGLE BRACKET
+FE61          ; Other_Math # Po       SMALL ASTERISK
+FE63          ; Other_Math # Pd       SMALL HYPHEN-MINUS
+FE68          ; Other_Math # Po       SMALL REVERSE SOLIDUS
+FF3C          ; Other_Math # Po       FULLWIDTH REVERSE SOLIDUS
+FF3E          ; Other_Math # Sk       FULLWIDTH CIRCUMFLEX ACCENT
+1D400..1D454  ; Other_Math # L&  [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C  ; Other_Math # L&  [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F  ; Other_Math # L&   [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2         ; Other_Math # L&       MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6  ; Other_Math # L&   [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC  ; Other_Math # L&   [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9  ; Other_Math # L&  [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB         ; Other_Math # L&       MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3  ; Other_Math # L&   [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505  ; Other_Math # L&  [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A  ; Other_Math # L&   [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514  ; Other_Math # L&   [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C  ; Other_Math # L&   [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539  ; Other_Math # L&  [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E  ; Other_Math # L&   [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544  ; Other_Math # L&   [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546         ; Other_Math # L&       MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550  ; Other_Math # L&   [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A3  ; Other_Math # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z
+1D6A8..1D6C0  ; Other_Math # L&  [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C2..1D6DA  ; Other_Math # L&  [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DC..1D6FA  ; Other_Math # L&  [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FC..1D714  ; Other_Math # L&  [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D716..1D734  ; Other_Math # L&  [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D736..1D74E  ; Other_Math # L&  [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D750..1D76E  ; Other_Math # L&  [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D770..1D788  ; Other_Math # L&  [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D78A..1D7A8  ; Other_Math # L&  [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7AA..1D7C2  ; Other_Math # L&  [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C4..1D7C9  ; Other_Math # L&   [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+1D7CE..1D7FF  ; Other_Math # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+
+# Total code points: 1102
+
+# ================================================
+
+0030..0039    ; Hex_Digit # Nd  [10] DIGIT ZERO..DIGIT NINE
+0041..0046    ; Hex_Digit # L&   [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F
+0061..0066    ; Hex_Digit # L&   [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F
+FF10..FF19    ; Hex_Digit # Nd  [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF21..FF26    ; Hex_Digit # L&   [6] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER F
+FF41..FF46    ; Hex_Digit # L&   [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER F
+
+# Total code points: 44
+
+# ================================================
+
+0030..0039    ; ASCII_Hex_Digit # Nd  [10] DIGIT ZERO..DIGIT NINE
+0041..0046    ; ASCII_Hex_Digit # L&   [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F
+0061..0066    ; ASCII_Hex_Digit # L&   [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F
+
+# Total code points: 22
+
+# ================================================
+
+0345          ; Other_Alphabetic # Mn       COMBINING GREEK YPOGEGRAMMENI
+05B0..05B9    ; Other_Alphabetic # Mn  [10] HEBREW POINT SHEVA..HEBREW POINT HOLAM
+05BB..05BD    ; Other_Alphabetic # Mn   [3] HEBREW POINT QUBUTS..HEBREW POINT METEG
+05BF          ; Other_Alphabetic # Mn       HEBREW POINT RAFE
+05C1..05C2    ; Other_Alphabetic # Mn   [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5    ; Other_Alphabetic # Mn   [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7          ; Other_Alphabetic # Mn       HEBREW POINT QAMATS QATAN
+0610..0615    ; Other_Alphabetic # Mn   [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH
+064B..0657    ; Other_Alphabetic # Mn  [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA
+0659..065E    ; Other_Alphabetic # Mn   [6] ARABIC ZWARAKAY..ARABIC FATHA WITH TWO DOTS
+0670          ; Other_Alphabetic # Mn       ARABIC LETTER SUPERSCRIPT ALEF
+06D6..06DC    ; Other_Alphabetic # Mn   [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06E1..06E4    ; Other_Alphabetic # Mn   [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA
+06E7..06E8    ; Other_Alphabetic # Mn   [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06ED          ; Other_Alphabetic # Mn       ARABIC SMALL LOW MEEM
+0711          ; Other_Alphabetic # Mn       SYRIAC LETTER SUPERSCRIPT ALAPH
+0730..073F    ; Other_Alphabetic # Mn  [16] SYRIAC PTHAHA ABOVE..SYRIAC RWAHA
+07A6..07B0    ; Other_Alphabetic # Mn  [11] THAANA ABAFILI..THAANA SUKUN
+0901..0902    ; Other_Alphabetic # Mn   [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903          ; Other_Alphabetic # Mc       DEVANAGARI SIGN VISARGA
+093E..0940    ; Other_Alphabetic # Mc   [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948    ; Other_Alphabetic # Mn   [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C    ; Other_Alphabetic # Mc   [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+0962..0963    ; Other_Alphabetic # Mn   [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0981          ; Other_Alphabetic # Mn       BENGALI SIGN CANDRABINDU
+0982..0983    ; Other_Alphabetic # Mc   [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+09BE..09C0    ; Other_Alphabetic # Mc   [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4    ; Other_Alphabetic # Mn   [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8    ; Other_Alphabetic # Mc   [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC    ; Other_Alphabetic # Mc   [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09D7          ; Other_Alphabetic # Mc       BENGALI AU LENGTH MARK
+09E2..09E3    ; Other_Alphabetic # Mn   [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+0A01..0A02    ; Other_Alphabetic # Mn   [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03          ; Other_Alphabetic # Mc       GURMUKHI SIGN VISARGA
+0A3E..0A40    ; Other_Alphabetic # Mc   [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42    ; Other_Alphabetic # Mn   [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48    ; Other_Alphabetic # Mn   [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4C    ; Other_Alphabetic # Mn   [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU
+0A70..0A71    ; Other_Alphabetic # Mn   [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A81..0A82    ; Other_Alphabetic # Mn   [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83          ; Other_Alphabetic # Mc       GUJARATI SIGN VISARGA
+0ABE..0AC0    ; Other_Alphabetic # Mc   [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5    ; Other_Alphabetic # Mn   [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8    ; Other_Alphabetic # Mn   [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9          ; Other_Alphabetic # Mc       GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC    ; Other_Alphabetic # Mc   [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0AE2..0AE3    ; Other_Alphabetic # Mn   [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0B01          ; Other_Alphabetic # Mn       ORIYA SIGN CANDRABINDU
+0B02..0B03    ; Other_Alphabetic # Mc   [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B3E          ; Other_Alphabetic # Mc       ORIYA VOWEL SIGN AA
+0B3F          ; Other_Alphabetic # Mn       ORIYA VOWEL SIGN I
+0B40          ; Other_Alphabetic # Mc       ORIYA VOWEL SIGN II
+0B41..0B43    ; Other_Alphabetic # Mn   [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R
+0B47..0B48    ; Other_Alphabetic # Mc   [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C    ; Other_Alphabetic # Mc   [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B56          ; Other_Alphabetic # Mn       ORIYA AI LENGTH MARK
+0B57          ; Other_Alphabetic # Mc       ORIYA AU LENGTH MARK
+0B82          ; Other_Alphabetic # Mn       TAMIL SIGN ANUSVARA
+0BBE..0BBF    ; Other_Alphabetic # Mc   [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0          ; Other_Alphabetic # Mn       TAMIL VOWEL SIGN II
+0BC1..0BC2    ; Other_Alphabetic # Mc   [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8    ; Other_Alphabetic # Mc   [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC    ; Other_Alphabetic # Mc   [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BD7          ; Other_Alphabetic # Mc       TAMIL AU LENGTH MARK
+0C01..0C03    ; Other_Alphabetic # Mc   [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C3E..0C40    ; Other_Alphabetic # Mn   [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44    ; Other_Alphabetic # Mc   [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48    ; Other_Alphabetic # Mn   [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4C    ; Other_Alphabetic # Mn   [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU
+0C55..0C56    ; Other_Alphabetic # Mn   [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C82..0C83    ; Other_Alphabetic # Mc   [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0CBE          ; Other_Alphabetic # Mc       KANNADA VOWEL SIGN AA
+0CBF          ; Other_Alphabetic # Mn       KANNADA VOWEL SIGN I
+0CC0..0CC4    ; Other_Alphabetic # Mc   [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6          ; Other_Alphabetic # Mn       KANNADA VOWEL SIGN E
+0CC7..0CC8    ; Other_Alphabetic # Mc   [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB    ; Other_Alphabetic # Mc   [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC          ; Other_Alphabetic # Mn       KANNADA VOWEL SIGN AU
+0CD5..0CD6    ; Other_Alphabetic # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0D02..0D03    ; Other_Alphabetic # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D3E..0D40    ; Other_Alphabetic # Mc   [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D43    ; Other_Alphabetic # Mn   [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R
+0D46..0D48    ; Other_Alphabetic # Mc   [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C    ; Other_Alphabetic # Mc   [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D57          ; Other_Alphabetic # Mc       MALAYALAM AU LENGTH MARK
+0D82..0D83    ; Other_Alphabetic # Mc   [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0DCF..0DD1    ; Other_Alphabetic # Mc   [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4    ; Other_Alphabetic # Mn   [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6          ; Other_Alphabetic # Mn       SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF    ; Other_Alphabetic # Mc   [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3    ; Other_Alphabetic # Mc   [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0E31          ; Other_Alphabetic # Mn       THAI CHARACTER MAI HAN-AKAT
+0E34..0E3A    ; Other_Alphabetic # Mn   [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E4D          ; Other_Alphabetic # Mn       THAI CHARACTER NIKHAHIT
+0EB1          ; Other_Alphabetic # Mn       LAO VOWEL SIGN MAI KAN
+0EB4..0EB9    ; Other_Alphabetic # Mn   [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC    ; Other_Alphabetic # Mn   [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0ECD          ; Other_Alphabetic # Mn       LAO NIGGAHITA
+0F71..0F7E    ; Other_Alphabetic # Mn  [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F          ; Other_Alphabetic # Mc       TIBETAN SIGN RNAM BCAD
+0F80..0F81    ; Other_Alphabetic # Mn   [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II
+0F90..0F97    ; Other_Alphabetic # Mn   [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC    ; Other_Alphabetic # Mn  [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+102C          ; Other_Alphabetic # Mc       MYANMAR VOWEL SIGN AA
+102D..1030    ; Other_Alphabetic # Mn   [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031          ; Other_Alphabetic # Mc       MYANMAR VOWEL SIGN E
+1032          ; Other_Alphabetic # Mn       MYANMAR VOWEL SIGN AI
+1036          ; Other_Alphabetic # Mn       MYANMAR SIGN ANUSVARA
+1038          ; Other_Alphabetic # Mc       MYANMAR SIGN VISARGA
+1056..1057    ; Other_Alphabetic # Mc   [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059    ; Other_Alphabetic # Mn   [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+135F          ; Other_Alphabetic # Mn       ETHIOPIC COMBINING GEMINATION MARK
+1712..1713    ; Other_Alphabetic # Mn   [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U
+1732..1733    ; Other_Alphabetic # Mn   [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U
+1752..1753    ; Other_Alphabetic # Mn   [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1772..1773    ; Other_Alphabetic # Mn   [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+17B6          ; Other_Alphabetic # Mc       KHMER VOWEL SIGN AA
+17B7..17BD    ; Other_Alphabetic # Mn   [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5    ; Other_Alphabetic # Mc   [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6          ; Other_Alphabetic # Mn       KHMER SIGN NIKAHIT
+17C7..17C8    ; Other_Alphabetic # Mc   [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+18A9          ; Other_Alphabetic # Mn       MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922    ; Other_Alphabetic # Mn   [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926    ; Other_Alphabetic # Mc   [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928    ; Other_Alphabetic # Mn   [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B    ; Other_Alphabetic # Mc   [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931    ; Other_Alphabetic # Mc   [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932          ; Other_Alphabetic # Mn       LIMBU SMALL LETTER ANUSVARA
+1933..1938    ; Other_Alphabetic # Mc   [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+19B0..19C0    ; Other_Alphabetic # Mc  [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C8..19C9    ; Other_Alphabetic # Mc   [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+1A17..1A18    ; Other_Alphabetic # Mn   [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1B    ; Other_Alphabetic # Mc   [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+24B6..24E9    ; Other_Alphabetic # So  [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z
+A823..A824    ; Other_Alphabetic # Mc   [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826    ; Other_Alphabetic # Mn   [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827          ; Other_Alphabetic # Mc       SYLOTI NAGRI VOWEL SIGN OO
+FB1E          ; Other_Alphabetic # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
+10A01..10A03  ; Other_Alphabetic # Mn   [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06  ; Other_Alphabetic # Mn   [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F  ; Other_Alphabetic # Mn   [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+
+# Total code points: 488
+
+# ================================================
+
+3006          ; Ideographic # Lo       IDEOGRAPHIC CLOSING MARK
+3007          ; Ideographic # Nl       IDEOGRAPHIC NUMBER ZERO
+3021..3029    ; Ideographic # Nl   [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3038..303A    ; Ideographic # Nl   [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+3400..4DB5    ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FBB    ; Ideographic # Lo [20924] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FBB
+F900..FA2D    ; Ideographic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA70..FAD9    ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+20000..2A6D6  ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2F800..2FA1D  ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 71181
+
+# ================================================
+
+005E          ; Diacritic # Sk       CIRCUMFLEX ACCENT
+0060          ; Diacritic # Sk       GRAVE ACCENT
+00A8          ; Diacritic # Sk       DIAERESIS
+00AF          ; Diacritic # Sk       MACRON
+00B4          ; Diacritic # Sk       ACUTE ACCENT
+00B7          ; Diacritic # Po       MIDDLE DOT
+00B8          ; Diacritic # Sk       CEDILLA
+02B0..02C1    ; Diacritic # Lm  [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5    ; Diacritic # Sk   [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1    ; Diacritic # Lm  [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2..02DF    ; Diacritic # Sk  [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E0..02E4    ; Diacritic # Lm   [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5..02ED    ; Diacritic # Sk   [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED
+02EE          ; Diacritic # Lm       MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF    ; Diacritic # Sk  [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0300..034E    ; Diacritic # Mn  [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW
+0350..0357    ; Diacritic # Mn   [8] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING RIGHT HALF RING ABOVE
+035D..0362    ; Diacritic # Mn   [6] COMBINING DOUBLE BREVE..COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0374..0375    ; Diacritic # Sk   [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN
+037A          ; Diacritic # Lm       GREEK YPOGEGRAMMENI
+0384..0385    ; Diacritic # Sk   [2] GREEK TONOS..GREEK DIALYTIKA TONOS
+0483..0486    ; Diacritic # Mn   [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA
+0559          ; Diacritic # Lm       ARMENIAN MODIFIER LETTER LEFT HALF RING
+0591..05A1    ; Diacritic # Mn  [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER
+05A3..05B9    ; Diacritic # Mn  [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM
+05BB..05BD    ; Diacritic # Mn   [3] HEBREW POINT QUBUTS..HEBREW POINT METEG
+05BF          ; Diacritic # Mn       HEBREW POINT RAFE
+05C1..05C2    ; Diacritic # Mn   [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4          ; Diacritic # Mn       HEBREW MARK UPPER DOT
+064B..0652    ; Diacritic # Mn   [8] ARABIC FATHATAN..ARABIC SUKUN
+0657..0658    ; Diacritic # Mn   [2] ARABIC INVERTED DAMMA..ARABIC MARK NOON GHUNNA
+06DF..06E0    ; Diacritic # Mn   [2] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E5..06E6    ; Diacritic # Lm   [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06EA..06EC    ; Diacritic # Mn   [3] ARABIC EMPTY CENTRE LOW STOP..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+0730..074A    ; Diacritic # Mn  [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+07A6..07B0    ; Diacritic # Mn  [11] THAANA ABAFILI..THAANA SUKUN
+093C          ; Diacritic # Mn       DEVANAGARI SIGN NUKTA
+094D          ; Diacritic # Mn       DEVANAGARI SIGN VIRAMA
+0951..0954    ; Diacritic # Mn   [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT
+09BC          ; Diacritic # Mn       BENGALI SIGN NUKTA
+09CD          ; Diacritic # Mn       BENGALI SIGN VIRAMA
+0A3C          ; Diacritic # Mn       GURMUKHI SIGN NUKTA
+0A4D          ; Diacritic # Mn       GURMUKHI SIGN VIRAMA
+0ABC          ; Diacritic # Mn       GUJARATI SIGN NUKTA
+0ACD          ; Diacritic # Mn       GUJARATI SIGN VIRAMA
+0B3C          ; Diacritic # Mn       ORIYA SIGN NUKTA
+0B4D          ; Diacritic # Mn       ORIYA SIGN VIRAMA
+0BCD          ; Diacritic # Mn       TAMIL SIGN VIRAMA
+0C4D          ; Diacritic # Mn       TELUGU SIGN VIRAMA
+0CBC          ; Diacritic # Mn       KANNADA SIGN NUKTA
+0CCD          ; Diacritic # Mn       KANNADA SIGN VIRAMA
+0D4D          ; Diacritic # Mn       MALAYALAM SIGN VIRAMA
+0DCA          ; Diacritic # Mn       SINHALA SIGN AL-LAKUNA
+0E47..0E4C    ; Diacritic # Mn   [6] THAI CHARACTER MAITAIKHU..THAI CHARACTER THANTHAKHAT
+0E4E          ; Diacritic # Mn       THAI CHARACTER YAMAKKAN
+0EC8..0ECC    ; Diacritic # Mn   [5] LAO TONE MAI EK..LAO CANCELLATION MARK
+0F18..0F19    ; Diacritic # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F35          ; Diacritic # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37          ; Diacritic # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39          ; Diacritic # Mn       TIBETAN MARK TSA -PHRU
+0F3E..0F3F    ; Diacritic # Mc   [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F82..0F84    ; Diacritic # Mn   [3] TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA
+0F86..0F87    ; Diacritic # Mn   [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0FC6          ; Diacritic # Mn       TIBETAN SYMBOL PADMA GDAN
+1037          ; Diacritic # Mn       MYANMAR SIGN DOT BELOW
+1039          ; Diacritic # Mn       MYANMAR SIGN VIRAMA
+17C9..17D3    ; Diacritic # Mn  [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17DD          ; Diacritic # Mn       KHMER SIGN ATTHACAN
+1939..193B    ; Diacritic # Mn   [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1D2C..1D61    ; Diacritic # Lm  [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D6A    ; Diacritic # L&   [9] LATIN SUBSCRIPT SMALL LETTER I..GREEK SUBSCRIPT SMALL LETTER CHI
+1FBD          ; Diacritic # Sk       GREEK KORONIS
+1FBF..1FC1    ; Diacritic # Sk   [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FCD..1FCF    ; Diacritic # Sk   [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FDD..1FDF    ; Diacritic # Sk   [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FED..1FEF    ; Diacritic # Sk   [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FFD..1FFE    ; Diacritic # Sk   [2] GREEK OXIA..GREEK DASIA
+302A..302F    ; Diacritic # Mn   [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A    ; Diacritic # Mn   [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B..309C    ; Diacritic # Sk   [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30FC          ; Diacritic # Lm       KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FB1E          ; Diacritic # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
+FE20..FE23    ; Diacritic # Mn   [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF
+FF3E          ; Diacritic # Sk       FULLWIDTH CIRCUMFLEX ACCENT
+FF40          ; Diacritic # Sk       FULLWIDTH GRAVE ACCENT
+FF70          ; Diacritic # Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF9E..FF9F    ; Diacritic # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFE3          ; Diacritic # Sk       FULLWIDTH MACRON
+1D167..1D169  ; Diacritic # Mn   [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16D..1D172  ; Diacritic # Mc   [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D17B..1D182  ; Diacritic # Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B  ; Diacritic # Mn   [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD  ; Diacritic # Mn   [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+
+# Total code points: 482
+
+# ================================================
+
+00B7          ; Extender # Po       MIDDLE DOT
+02D0..02D1    ; Extender # Lm   [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON
+0640          ; Extender # Lm       ARABIC TATWEEL
+0E46          ; Extender # Lm       THAI CHARACTER MAIYAMOK
+0EC6          ; Extender # Lm       LAO KO LA
+1843          ; Extender # Lm       MONGOLIAN LETTER TODO LONG VOWEL SIGN
+3005          ; Extender # Lm       IDEOGRAPHIC ITERATION MARK
+3031..3035    ; Extender # Lm   [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+309D..309E    ; Extender # Lm   [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+30FC..30FE    ; Extender # Lm   [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+A015          ; Extender # Lm       YI SYLLABLE WU
+FF70          ; Extender # Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+
+# Total code points: 20
+
+# ================================================
+
+02B0..02B8    ; Other_Lowercase # Lm   [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02C0..02C1    ; Other_Lowercase # Lm   [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP
+02E0..02E4    ; Other_Lowercase # Lm   [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+0345          ; Other_Lowercase # Mn       COMBINING GREEK YPOGEGRAMMENI
+037A          ; Other_Lowercase # Lm       GREEK YPOGEGRAMMENI
+1D2C..1D61    ; Other_Lowercase # Lm  [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D78          ; Other_Lowercase # Lm       MODIFIER LETTER CYRILLIC EN
+1D9B..1DBF    ; Other_Lowercase # Lm  [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+2090..2094    ; Other_Lowercase # Lm   [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+2170..217F    ; Other_Lowercase # Nl  [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
+24D0..24E9    ; Other_Lowercase # So  [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+
+# Total code points: 157
+
+# ================================================
+
+2160..216F    ; Other_Uppercase # Nl  [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND
+24B6..24CF    ; Other_Uppercase # So  [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z
+
+# Total code points: 42
+
+# ================================================
+
+FDD0..FDEF    ; Noncharacter_Code_Point # Cn  [32] <noncharacter-FDD0>..<noncharacter-FDEF>
+FFFE..FFFF    ; Noncharacter_Code_Point # Cn   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
+1FFFE..1FFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-1FFFE>..<noncharacter-1FFFF>
+2FFFE..2FFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-2FFFE>..<noncharacter-2FFFF>
+3FFFE..3FFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-3FFFE>..<noncharacter-3FFFF>
+4FFFE..4FFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-4FFFE>..<noncharacter-4FFFF>
+5FFFE..5FFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-5FFFE>..<noncharacter-5FFFF>
+6FFFE..6FFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-6FFFE>..<noncharacter-6FFFF>
+7FFFE..7FFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-7FFFE>..<noncharacter-7FFFF>
+8FFFE..8FFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-8FFFE>..<noncharacter-8FFFF>
+9FFFE..9FFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-9FFFE>..<noncharacter-9FFFF>
+AFFFE..AFFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-AFFFE>..<noncharacter-AFFFF>
+BFFFE..BFFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-BFFFE>..<noncharacter-BFFFF>
+CFFFE..CFFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-CFFFE>..<noncharacter-CFFFF>
+DFFFE..DFFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-DFFFE>..<noncharacter-DFFFF>
+EFFFE..EFFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-EFFFE>..<noncharacter-EFFFF>
+FFFFE..FFFFF  ; Noncharacter_Code_Point # Cn   [2] <noncharacter-FFFFE>..<noncharacter-FFFFF>
+10FFFE..10FFFF; Noncharacter_Code_Point # Cn   [2] <noncharacter-10FFFE>..<noncharacter-10FFFF>
+
+# Total code points: 66
+
+# ================================================
+
+09BE          ; Other_Grapheme_Extend # Mc       BENGALI VOWEL SIGN AA
+09D7          ; Other_Grapheme_Extend # Mc       BENGALI AU LENGTH MARK
+0B3E          ; Other_Grapheme_Extend # Mc       ORIYA VOWEL SIGN AA
+0B57          ; Other_Grapheme_Extend # Mc       ORIYA AU LENGTH MARK
+0BBE          ; Other_Grapheme_Extend # Mc       TAMIL VOWEL SIGN AA
+0BD7          ; Other_Grapheme_Extend # Mc       TAMIL AU LENGTH MARK
+0CC2          ; Other_Grapheme_Extend # Mc       KANNADA VOWEL SIGN UU
+0CD5..0CD6    ; Other_Grapheme_Extend # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0D3E          ; Other_Grapheme_Extend # Mc       MALAYALAM VOWEL SIGN AA
+0D57          ; Other_Grapheme_Extend # Mc       MALAYALAM AU LENGTH MARK
+0DCF          ; Other_Grapheme_Extend # Mc       SINHALA VOWEL SIGN AELA-PILLA
+0DDF          ; Other_Grapheme_Extend # Mc       SINHALA VOWEL SIGN GAYANUKITTA
+200C..200D    ; Other_Grapheme_Extend # Cf   [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+1D165         ; Other_Grapheme_Extend # Mc       MUSICAL SYMBOL COMBINING STEM
+1D16E..1D172  ; Other_Grapheme_Extend # Mc   [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5
+
+# Total code points: 21
+
+# ================================================
+
+034F          ; Grapheme_Link # Mn       COMBINING GRAPHEME JOINER
+094D          ; Grapheme_Link # Mn       DEVANAGARI SIGN VIRAMA
+09CD          ; Grapheme_Link # Mn       BENGALI SIGN VIRAMA
+0A4D          ; Grapheme_Link # Mn       GURMUKHI SIGN VIRAMA
+0ACD          ; Grapheme_Link # Mn       GUJARATI SIGN VIRAMA
+0B4D          ; Grapheme_Link # Mn       ORIYA SIGN VIRAMA
+0BCD          ; Grapheme_Link # Mn       TAMIL SIGN VIRAMA
+0C4D          ; Grapheme_Link # Mn       TELUGU SIGN VIRAMA
+0CCD          ; Grapheme_Link # Mn       KANNADA SIGN VIRAMA
+0D4D          ; Grapheme_Link # Mn       MALAYALAM SIGN VIRAMA
+0DCA          ; Grapheme_Link # Mn       SINHALA SIGN AL-LAKUNA
+0E3A          ; Grapheme_Link # Mn       THAI CHARACTER PHINTHU
+1039          ; Grapheme_Link # Mn       MYANMAR SIGN VIRAMA
+17D2          ; Grapheme_Link # Mn       KHMER SIGN COENG
+A806          ; Grapheme_Link # Mn       SYLOTI NAGRI SIGN HASANTA
+10A3F         ; Grapheme_Link # Mn       KHAROSHTHI VIRAMA
+
+# Total code points: 16
+
+# ================================================
+
+2FF0..2FF1    ; IDS_Binary_Operator # So   [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF4..2FFB    ; IDS_Binary_Operator # So   [8] IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+
+# Total code points: 10
+
+# ================================================
+
+2FF2..2FF3    ; IDS_Trinary_Operator # So   [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+
+# Total code points: 2
+
+# ================================================
+
+2E80..2E99    ; Radical # So  [26] CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9B..2EF3    ; Radical # So  [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2F00..2FD5    ; Radical # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+
+# Total code points: 329
+
+# ================================================
+
+3400..4DB5    ; Unified_Ideograph # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FBB    ; Unified_Ideograph # Lo [20924] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FBB
+FA0E..FA0F    ; Unified_Ideograph # Lo   [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA11          ; Unified_Ideograph # Lo       CJK COMPATIBILITY IDEOGRAPH-FA11
+FA13..FA14    ; Unified_Ideograph # Lo   [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14
+FA1F          ; Unified_Ideograph # Lo       CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA21          ; Unified_Ideograph # Lo       CJK COMPATIBILITY IDEOGRAPH-FA21
+FA23..FA24    ; Unified_Ideograph # Lo   [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24
+FA27..FA29    ; Unified_Ideograph # Lo   [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29
+20000..2A6D6  ; Unified_Ideograph # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+
+# Total code points: 70229
+
+# ================================================
+
+034F          ; Other_Default_Ignorable_Code_Point # Mn       COMBINING GRAPHEME JOINER
+115F..1160    ; Other_Default_Ignorable_Code_Point # Lo   [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER
+2064..2069    ; Other_Default_Ignorable_Code_Point # Cn   [6] <reserved-2064>..<reserved-2069>
+3164          ; Other_Default_Ignorable_Code_Point # Lo       HANGUL FILLER
+FFA0          ; Other_Default_Ignorable_Code_Point # Lo       HALFWIDTH HANGUL FILLER
+FFF0..FFF8    ; Other_Default_Ignorable_Code_Point # Cn   [9] <reserved-FFF0>..<reserved-FFF8>
+E0000         ; Other_Default_Ignorable_Code_Point # Cn       <reserved-E0000>
+E0002..E001F  ; Other_Default_Ignorable_Code_Point # Cn  [30] <reserved-E0002>..<reserved-E001F>
+E0080..E00FF  ; Other_Default_Ignorable_Code_Point # Cn [128] <reserved-E0080>..<reserved-E00FF>
+E01F0..E0FFF  ; Other_Default_Ignorable_Code_Point # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
+
+# Total code points: 3779
+
+# ================================================
+
+0340..0341    ; Deprecated # Mn   [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK
+17A3          ; Deprecated # Lo       KHMER INDEPENDENT VOWEL QAQ
+17D3          ; Deprecated # Mn       KHMER SIGN BATHAMASAT
+206A..206F    ; Deprecated # Cf   [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+
+# Total code points: 10
+
+# ================================================
+
+0069..006A    ; Soft_Dotted # L&   [2] LATIN SMALL LETTER I..LATIN SMALL LETTER J
+012F          ; Soft_Dotted # L&       LATIN SMALL LETTER I WITH OGONEK
+0268          ; Soft_Dotted # L&       LATIN SMALL LETTER I WITH STROKE
+029D          ; Soft_Dotted # L&       LATIN SMALL LETTER J WITH CROSSED-TAIL
+02B2          ; Soft_Dotted # Lm       MODIFIER LETTER SMALL J
+03F3          ; Soft_Dotted # L&       GREEK LETTER YOT
+0456          ; Soft_Dotted # L&       CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0458          ; Soft_Dotted # L&       CYRILLIC SMALL LETTER JE
+1D62          ; Soft_Dotted # L&       LATIN SUBSCRIPT SMALL LETTER I
+1D96          ; Soft_Dotted # L&       LATIN SMALL LETTER I WITH RETROFLEX HOOK
+1DA4          ; Soft_Dotted # Lm       MODIFIER LETTER SMALL I WITH STROKE
+1DA8          ; Soft_Dotted # Lm       MODIFIER LETTER SMALL J WITH CROSSED-TAIL
+1E2D          ; Soft_Dotted # L&       LATIN SMALL LETTER I WITH TILDE BELOW
+1ECB          ; Soft_Dotted # L&       LATIN SMALL LETTER I WITH DOT BELOW
+2071          ; Soft_Dotted # L&       SUPERSCRIPT LATIN SMALL LETTER I
+2148..2149    ; Soft_Dotted # L&   [2] DOUBLE-STRUCK ITALIC SMALL I..DOUBLE-STRUCK ITALIC SMALL J
+1D422..1D423  ; Soft_Dotted # L&   [2] MATHEMATICAL BOLD SMALL I..MATHEMATICAL BOLD SMALL J
+1D456..1D457  ; Soft_Dotted # L&   [2] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL J
+1D48A..1D48B  ; Soft_Dotted # L&   [2] MATHEMATICAL BOLD ITALIC SMALL I..MATHEMATICAL BOLD ITALIC SMALL J
+1D4BE..1D4BF  ; Soft_Dotted # L&   [2] MATHEMATICAL SCRIPT SMALL I..MATHEMATICAL SCRIPT SMALL J
+1D4F2..1D4F3  ; Soft_Dotted # L&   [2] MATHEMATICAL BOLD SCRIPT SMALL I..MATHEMATICAL BOLD SCRIPT SMALL J
+1D526..1D527  ; Soft_Dotted # L&   [2] MATHEMATICAL FRAKTUR SMALL I..MATHEMATICAL FRAKTUR SMALL J
+1D55A..1D55B  ; Soft_Dotted # L&   [2] MATHEMATICAL DOUBLE-STRUCK SMALL I..MATHEMATICAL DOUBLE-STRUCK SMALL J
+1D58E..1D58F  ; Soft_Dotted # L&   [2] MATHEMATICAL BOLD FRAKTUR SMALL I..MATHEMATICAL BOLD FRAKTUR SMALL J
+1D5C2..1D5C3  ; Soft_Dotted # L&   [2] MATHEMATICAL SANS-SERIF SMALL I..MATHEMATICAL SANS-SERIF SMALL J
+1D5F6..1D5F7  ; Soft_Dotted # L&   [2] MATHEMATICAL SANS-SERIF BOLD SMALL I..MATHEMATICAL SANS-SERIF BOLD SMALL J
+1D62A..1D62B  ; Soft_Dotted # L&   [2] MATHEMATICAL SANS-SERIF ITALIC SMALL I..MATHEMATICAL SANS-SERIF ITALIC SMALL J
+1D65E..1D65F  ; Soft_Dotted # L&   [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
+1D692..1D693  ; Soft_Dotted # L&   [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J
+
+# Total code points: 44
+
+# ================================================
+
+0E40..0E44    ; Logical_Order_Exception # Lo   [5] THAI CHARACTER SARA E..THAI CHARACTER SARA AI MAIMALAI
+0EC0..0EC4    ; Logical_Order_Exception # Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+
+# Total code points: 10
+
+# ================================================
+
+2118          ; Other_ID_Start # So       SCRIPT CAPITAL P
+212E          ; Other_ID_Start # So       ESTIMATED SYMBOL
+309B..309C    ; Other_ID_Start # Sk   [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+
+# Total code points: 4
+
+# ================================================
+
+1369..1371    ; Other_ID_Continue # No   [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE
+
+# Total code points: 9
+
+# ================================================
+
+0021          ; STerm # Po       EXCLAMATION MARK
+002E          ; STerm # Po       FULL STOP
+003F          ; STerm # Po       QUESTION MARK
+055C          ; STerm # Po       ARMENIAN EXCLAMATION MARK
+055E          ; STerm # Po       ARMENIAN QUESTION MARK
+0589          ; STerm # Po       ARMENIAN FULL STOP
+061F          ; STerm # Po       ARABIC QUESTION MARK
+06D4          ; STerm # Po       ARABIC FULL STOP
+0700..0702    ; STerm # Po   [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP
+0964..0965    ; STerm # Po   [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+104A..104B    ; STerm # Po   [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
+1362          ; STerm # Po       ETHIOPIC FULL STOP
+1367..1368    ; STerm # Po   [2] ETHIOPIC QUESTION MARK..ETHIOPIC PARAGRAPH SEPARATOR
+166E          ; STerm # Po       CANADIAN SYLLABICS FULL STOP
+1803          ; STerm # Po       MONGOLIAN FULL STOP
+1809          ; STerm # Po       MONGOLIAN MANCHU FULL STOP
+1944..1945    ; STerm # Po   [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+203C..203D    ; STerm # Po   [2] DOUBLE EXCLAMATION MARK..INTERROBANG
+2047..2049    ; STerm # Po   [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK
+3002          ; STerm # Po       IDEOGRAPHIC FULL STOP
+FE52          ; STerm # Po       SMALL FULL STOP
+FE56..FE57    ; STerm # Po   [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK
+FF01          ; STerm # Po       FULLWIDTH EXCLAMATION MARK
+FF0E          ; STerm # Po       FULLWIDTH FULL STOP
+FF1F          ; STerm # Po       FULLWIDTH QUESTION MARK
+FF61          ; STerm # Po       HALFWIDTH IDEOGRAPHIC FULL STOP
+
+# Total code points: 36
+
+# ================================================
+
+180B..180D    ; Variation_Selector # Mn   [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+FE00..FE0F    ; Variation_Selector # Mn  [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+E0100..E01EF  ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 259
+
+# ================================================
+
+0009..000D    ; Pattern_White_Space # Cc   [5] <control-0009>..<control-000D>
+0020          ; Pattern_White_Space # Zs       SPACE
+0085          ; Pattern_White_Space # Cc       <control-0085>
+200E..200F    ; Pattern_White_Space # Cf   [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+2028          ; Pattern_White_Space # Zl       LINE SEPARATOR
+2029          ; Pattern_White_Space # Zp       PARAGRAPH SEPARATOR
+
+# Total code points: 11
+
+# ================================================
+
+0021..0023    ; Pattern_Syntax # Po   [3] EXCLAMATION MARK..NUMBER SIGN
+0024          ; Pattern_Syntax # Sc       DOLLAR SIGN
+0025..0027    ; Pattern_Syntax # Po   [3] PERCENT SIGN..APOSTROPHE
+0028          ; Pattern_Syntax # Ps       LEFT PARENTHESIS
+0029          ; Pattern_Syntax # Pe       RIGHT PARENTHESIS
+002A          ; Pattern_Syntax # Po       ASTERISK
+002B          ; Pattern_Syntax # Sm       PLUS SIGN
+002C          ; Pattern_Syntax # Po       COMMA
+002D          ; Pattern_Syntax # Pd       HYPHEN-MINUS
+002E..002F    ; Pattern_Syntax # Po   [2] FULL STOP..SOLIDUS
+003A..003B    ; Pattern_Syntax # Po   [2] COLON..SEMICOLON
+003C..003E    ; Pattern_Syntax # Sm   [3] LESS-THAN SIGN..GREATER-THAN SIGN
+003F..0040    ; Pattern_Syntax # Po   [2] QUESTION MARK..COMMERCIAL AT
+005B          ; Pattern_Syntax # Ps       LEFT SQUARE BRACKET
+005C          ; Pattern_Syntax # Po       REVERSE SOLIDUS
+005D          ; Pattern_Syntax # Pe       RIGHT SQUARE BRACKET
+005E          ; Pattern_Syntax # Sk       CIRCUMFLEX ACCENT
+0060          ; Pattern_Syntax # Sk       GRAVE ACCENT
+007B          ; Pattern_Syntax # Ps       LEFT CURLY BRACKET
+007C          ; Pattern_Syntax # Sm       VERTICAL LINE
+007D          ; Pattern_Syntax # Pe       RIGHT CURLY BRACKET
+007E          ; Pattern_Syntax # Sm       TILDE
+00A1          ; Pattern_Syntax # Po       INVERTED EXCLAMATION MARK
+00A2..00A5    ; Pattern_Syntax # Sc   [4] CENT SIGN..YEN SIGN
+00A6..00A7    ; Pattern_Syntax # So   [2] BROKEN BAR..SECTION SIGN
+00A9          ; Pattern_Syntax # So       COPYRIGHT SIGN
+00AB          ; Pattern_Syntax # Pi       LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC          ; Pattern_Syntax # Sm       NOT SIGN
+00AE          ; Pattern_Syntax # So       REGISTERED SIGN
+00B0          ; Pattern_Syntax # So       DEGREE SIGN
+00B1          ; Pattern_Syntax # Sm       PLUS-MINUS SIGN
+00B6          ; Pattern_Syntax # So       PILCROW SIGN
+00BB          ; Pattern_Syntax # Pf       RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BF          ; Pattern_Syntax # Po       INVERTED QUESTION MARK
+00D7          ; Pattern_Syntax # Sm       MULTIPLICATION SIGN
+00F7          ; Pattern_Syntax # Sm       DIVISION SIGN
+2010..2015    ; Pattern_Syntax # Pd   [6] HYPHEN..HORIZONTAL BAR
+2016..2017    ; Pattern_Syntax # Po   [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE
+2018          ; Pattern_Syntax # Pi       LEFT SINGLE QUOTATION MARK
+2019          ; Pattern_Syntax # Pf       RIGHT SINGLE QUOTATION MARK
+201A          ; Pattern_Syntax # Ps       SINGLE LOW-9 QUOTATION MARK
+201B..201C    ; Pattern_Syntax # Pi   [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D          ; Pattern_Syntax # Pf       RIGHT DOUBLE QUOTATION MARK
+201E          ; Pattern_Syntax # Ps       DOUBLE LOW-9 QUOTATION MARK
+201F          ; Pattern_Syntax # Pi       DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020..2027    ; Pattern_Syntax # Po   [8] DAGGER..HYPHENATION POINT
+2030..2038    ; Pattern_Syntax # Po   [9] PER MILLE SIGN..CARET
+2039          ; Pattern_Syntax # Pi       SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A          ; Pattern_Syntax # Pf       SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B..203E    ; Pattern_Syntax # Po   [4] REFERENCE MARK..OVERLINE
+2041..2043    ; Pattern_Syntax # Po   [3] CARET INSERTION POINT..HYPHEN BULLET
+2044          ; Pattern_Syntax # Sm       FRACTION SLASH
+2045          ; Pattern_Syntax # Ps       LEFT SQUARE BRACKET WITH QUILL
+2046          ; Pattern_Syntax # Pe       RIGHT SQUARE BRACKET WITH QUILL
+2047..2051    ; Pattern_Syntax # Po  [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
+2052          ; Pattern_Syntax # Sm       COMMERCIAL MINUS SIGN
+2053          ; Pattern_Syntax # Po       SWUNG DASH
+2055..205E    ; Pattern_Syntax # Po  [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS
+2190..2194    ; Pattern_Syntax # Sm   [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199    ; Pattern_Syntax # So   [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B    ; Pattern_Syntax # Sm   [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F    ; Pattern_Syntax # So   [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0          ; Pattern_Syntax # Sm       RIGHTWARDS TWO HEADED ARROW
+21A1..21A2    ; Pattern_Syntax # So   [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3          ; Pattern_Syntax # Sm       RIGHTWARDS ARROW WITH TAIL
+21A4..21A5    ; Pattern_Syntax # So   [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6          ; Pattern_Syntax # Sm       RIGHTWARDS ARROW FROM BAR
+21A7..21AD    ; Pattern_Syntax # So   [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
+21AE          ; Pattern_Syntax # Sm       LEFT RIGHT ARROW WITH STROKE
+21AF..21CD    ; Pattern_Syntax # So  [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF    ; Pattern_Syntax # Sm   [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1    ; Pattern_Syntax # So   [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2          ; Pattern_Syntax # Sm       RIGHTWARDS DOUBLE ARROW
+21D3          ; Pattern_Syntax # So       DOWNWARDS DOUBLE ARROW
+21D4          ; Pattern_Syntax # Sm       LEFT RIGHT DOUBLE ARROW
+21D5..21F3    ; Pattern_Syntax # So  [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
+21F4..22FF    ; Pattern_Syntax # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP
+2300..2307    ; Pattern_Syntax # So   [8] DIAMETER SIGN..WAVY LINE
+2308..230B    ; Pattern_Syntax # Sm   [4] LEFT CEILING..RIGHT FLOOR
+230C..231F    ; Pattern_Syntax # So  [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
+2320..2321    ; Pattern_Syntax # Sm   [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+2322..2328    ; Pattern_Syntax # So   [7] FROWN..KEYBOARD
+2329          ; Pattern_Syntax # Ps       LEFT-POINTING ANGLE BRACKET
+232A          ; Pattern_Syntax # Pe       RIGHT-POINTING ANGLE BRACKET
+232B..237B    ; Pattern_Syntax # So  [81] ERASE TO THE LEFT..NOT CHECK MARK
+237C          ; Pattern_Syntax # Sm       RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D..239A    ; Pattern_Syntax # So  [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL
+239B..23B3    ; Pattern_Syntax # Sm  [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4          ; Pattern_Syntax # Ps       TOP SQUARE BRACKET
+23B5          ; Pattern_Syntax # Pe       BOTTOM SQUARE BRACKET
+23B6          ; Pattern_Syntax # Po       BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7..23DB    ; Pattern_Syntax # So  [37] RADICAL SYMBOL BOTTOM..FUSE
+23DC..23FF    ; Pattern_Syntax # Cn  [36] <reserved-23DC>..<reserved-23FF>
+2400..2426    ; Pattern_Syntax # So  [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
+2427..243F    ; Pattern_Syntax # Cn  [25] <reserved-2427>..<reserved-243F>
+2440..244A    ; Pattern_Syntax # So  [11] OCR HOOK..OCR DOUBLE BACKSLASH
+244B..245F    ; Pattern_Syntax # Cn  [21] <reserved-244B>..<reserved-245F>
+2500..25B6    ; Pattern_Syntax # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE
+25B7          ; Pattern_Syntax # Sm       WHITE RIGHT-POINTING TRIANGLE
+25B8..25C0    ; Pattern_Syntax # So   [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1          ; Pattern_Syntax # Sm       WHITE LEFT-POINTING TRIANGLE
+25C2..25F7    ; Pattern_Syntax # So  [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8..25FF    ; Pattern_Syntax # Sm   [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2600..266E    ; Pattern_Syntax # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN
+266F          ; Pattern_Syntax # Sm       MUSIC SHARP SIGN
+2670..269C    ; Pattern_Syntax # So  [45] WEST SYRIAC CROSS..FLEUR-DE-LIS
+269D..269F    ; Pattern_Syntax # Cn   [3] <reserved-269D>..<reserved-269F>
+26A0..26B1    ; Pattern_Syntax # So  [18] WARNING SIGN..FUNERAL URN
+26B2..2700    ; Pattern_Syntax # Cn  [79] <reserved-26B2>..<reserved-2700>
+2701..2704    ; Pattern_Syntax # So   [4] UPPER BLADE SCISSORS..WHITE SCISSORS
+2705          ; Pattern_Syntax # Cn       <reserved-2705>
+2706..2709    ; Pattern_Syntax # So   [4] TELEPHONE LOCATION SIGN..ENVELOPE
+270A..270B    ; Pattern_Syntax # Cn   [2] <reserved-270A>..<reserved-270B>
+270C..2727    ; Pattern_Syntax # So  [28] VICTORY HAND..WHITE FOUR POINTED STAR
+2728          ; Pattern_Syntax # Cn       <reserved-2728>
+2729..274B    ; Pattern_Syntax # So  [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274C          ; Pattern_Syntax # Cn       <reserved-274C>
+274D          ; Pattern_Syntax # So       SHADOWED WHITE CIRCLE
+274E          ; Pattern_Syntax # Cn       <reserved-274E>
+274F..2752    ; Pattern_Syntax # So   [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+2753..2755    ; Pattern_Syntax # Cn   [3] <reserved-2753>..<reserved-2755>
+2756          ; Pattern_Syntax # So       BLACK DIAMOND MINUS WHITE X
+2757          ; Pattern_Syntax # Cn       <reserved-2757>
+2758..275E    ; Pattern_Syntax # So   [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+275F..2760    ; Pattern_Syntax # Cn   [2] <reserved-275F>..<reserved-2760>
+2761..2767    ; Pattern_Syntax # So   [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
+2768          ; Pattern_Syntax # Ps       MEDIUM LEFT PARENTHESIS ORNAMENT
+2769          ; Pattern_Syntax # Pe       MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A          ; Pattern_Syntax # Ps       MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B          ; Pattern_Syntax # Pe       MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C          ; Pattern_Syntax # Ps       MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D          ; Pattern_Syntax # Pe       MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E          ; Pattern_Syntax # Ps       HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F          ; Pattern_Syntax # Pe       HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770          ; Pattern_Syntax # Ps       HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771          ; Pattern_Syntax # Pe       HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772          ; Pattern_Syntax # Ps       LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773          ; Pattern_Syntax # Pe       LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774          ; Pattern_Syntax # Ps       MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775          ; Pattern_Syntax # Pe       MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2794          ; Pattern_Syntax # So       HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2795..2797    ; Pattern_Syntax # Cn   [3] <reserved-2795>..<reserved-2797>
+2798..27AF    ; Pattern_Syntax # So  [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B0          ; Pattern_Syntax # Cn       <reserved-27B0>
+27B1..27BE    ; Pattern_Syntax # So  [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+27BF          ; Pattern_Syntax # Cn       <reserved-27BF>
+27C0..27C4    ; Pattern_Syntax # Sm   [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
+27C5          ; Pattern_Syntax # Ps       LEFT S-SHAPED BAG DELIMITER
+27C6          ; Pattern_Syntax # Pe       RIGHT S-SHAPED BAG DELIMITER
+27C7..27CF    ; Pattern_Syntax # Cn   [9] <reserved-27C7>..<reserved-27CF>
+27D0..27E5    ; Pattern_Syntax # Sm  [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6          ; Pattern_Syntax # Ps       MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7          ; Pattern_Syntax # Pe       MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8          ; Pattern_Syntax # Ps       MATHEMATICAL LEFT ANGLE BRACKET
+27E9          ; Pattern_Syntax # Pe       MATHEMATICAL RIGHT ANGLE BRACKET
+27EA          ; Pattern_Syntax # Ps       MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB          ; Pattern_Syntax # Pe       MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC..27EF    ; Pattern_Syntax # Cn   [4] <reserved-27EC>..<reserved-27EF>
+27F0..27FF    ; Pattern_Syntax # Sm  [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2800..28FF    ; Pattern_Syntax # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+2900..2982    ; Pattern_Syntax # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
+2983          ; Pattern_Syntax # Ps       LEFT WHITE CURLY BRACKET
+2984          ; Pattern_Syntax # Pe       RIGHT WHITE CURLY BRACKET
+2985          ; Pattern_Syntax # Ps       LEFT WHITE PARENTHESIS
+2986          ; Pattern_Syntax # Pe       RIGHT WHITE PARENTHESIS
+2987          ; Pattern_Syntax # Ps       Z NOTATION LEFT IMAGE BRACKET
+2988          ; Pattern_Syntax # Pe       Z NOTATION RIGHT IMAGE BRACKET
+2989          ; Pattern_Syntax # Ps       Z NOTATION LEFT BINDING BRACKET
+298A          ; Pattern_Syntax # Pe       Z NOTATION RIGHT BINDING BRACKET
+298B          ; Pattern_Syntax # Ps       LEFT SQUARE BRACKET WITH UNDERBAR
+298C          ; Pattern_Syntax # Pe       RIGHT SQUARE BRACKET WITH UNDERBAR
+298D          ; Pattern_Syntax # Ps       LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E          ; Pattern_Syntax # Pe       RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F          ; Pattern_Syntax # Ps       LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990          ; Pattern_Syntax # Pe       RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991          ; Pattern_Syntax # Ps       LEFT ANGLE BRACKET WITH DOT
+2992          ; Pattern_Syntax # Pe       RIGHT ANGLE BRACKET WITH DOT
+2993          ; Pattern_Syntax # Ps       LEFT ARC LESS-THAN BRACKET
+2994          ; Pattern_Syntax # Pe       RIGHT ARC GREATER-THAN BRACKET
+2995          ; Pattern_Syntax # Ps       DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996          ; Pattern_Syntax # Pe       DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997          ; Pattern_Syntax # Ps       LEFT BLACK TORTOISE SHELL BRACKET
+2998          ; Pattern_Syntax # Pe       RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7    ; Pattern_Syntax # Sm  [63] DOTTED FENCE..BLACK HOURGLASS
+29D8          ; Pattern_Syntax # Ps       LEFT WIGGLY FENCE
+29D9          ; Pattern_Syntax # Pe       RIGHT WIGGLY FENCE
+29DA          ; Pattern_Syntax # Ps       LEFT DOUBLE WIGGLY FENCE
+29DB          ; Pattern_Syntax # Pe       RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB    ; Pattern_Syntax # Sm  [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC          ; Pattern_Syntax # Ps       LEFT-POINTING CURVED ANGLE BRACKET
+29FD          ; Pattern_Syntax # Pe       RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..2AFF    ; Pattern_Syntax # Sm [258] TINY..N-ARY WHITE VERTICAL BAR
+2B00..2B13    ; Pattern_Syntax # So  [20] NORTH EAST WHITE ARROW..SQUARE WITH BOTTOM HALF BLACK
+2B14..2BFF    ; Pattern_Syntax # Cn [236] <reserved-2B14>..<reserved-2BFF>
+2E00..2E01    ; Pattern_Syntax # Po   [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02          ; Pattern_Syntax # Pi       LEFT SUBSTITUTION BRACKET
+2E03          ; Pattern_Syntax # Pf       RIGHT SUBSTITUTION BRACKET
+2E04          ; Pattern_Syntax # Pi       LEFT DOTTED SUBSTITUTION BRACKET
+2E05          ; Pattern_Syntax # Pf       RIGHT DOTTED SUBSTITUTION BRACKET
+2E06..2E08    ; Pattern_Syntax # Po   [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER
+2E09          ; Pattern_Syntax # Pi       LEFT TRANSPOSITION BRACKET
+2E0A          ; Pattern_Syntax # Pf       RIGHT TRANSPOSITION BRACKET
+2E0B          ; Pattern_Syntax # Po       RAISED SQUARE
+2E0C          ; Pattern_Syntax # Pi       LEFT RAISED OMISSION BRACKET
+2E0D          ; Pattern_Syntax # Pf       RIGHT RAISED OMISSION BRACKET
+2E0E..2E16    ; Pattern_Syntax # Po   [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE
+2E17          ; Pattern_Syntax # Pd       DOUBLE OBLIQUE HYPHEN
+2E18..2E1B    ; Pattern_Syntax # Cn   [4] <reserved-2E18>..<reserved-2E1B>
+2E1C          ; Pattern_Syntax # Pi       LEFT LOW PARAPHRASE BRACKET
+2E1D          ; Pattern_Syntax # Pf       RIGHT LOW PARAPHRASE BRACKET
+2E1E..2E7F    ; Pattern_Syntax # Cn  [98] <reserved-2E1E>..<reserved-2E7F>
+3001..3003    ; Pattern_Syntax # Po   [3] IDEOGRAPHIC COMMA..DITTO MARK
+3008          ; Pattern_Syntax # Ps       LEFT ANGLE BRACKET
+3009          ; Pattern_Syntax # Pe       RIGHT ANGLE BRACKET
+300A          ; Pattern_Syntax # Ps       LEFT DOUBLE ANGLE BRACKET
+300B          ; Pattern_Syntax # Pe       RIGHT DOUBLE ANGLE BRACKET
+300C          ; Pattern_Syntax # Ps       LEFT CORNER BRACKET
+300D          ; Pattern_Syntax # Pe       RIGHT CORNER BRACKET
+300E          ; Pattern_Syntax # Ps       LEFT WHITE CORNER BRACKET
+300F          ; Pattern_Syntax # Pe       RIGHT WHITE CORNER BRACKET
+3010          ; Pattern_Syntax # Ps       LEFT BLACK LENTICULAR BRACKET
+3011          ; Pattern_Syntax # Pe       RIGHT BLACK LENTICULAR BRACKET
+3012..3013    ; Pattern_Syntax # So   [2] POSTAL MARK..GETA MARK
+3014          ; Pattern_Syntax # Ps       LEFT TORTOISE SHELL BRACKET
+3015          ; Pattern_Syntax # Pe       RIGHT TORTOISE SHELL BRACKET
+3016          ; Pattern_Syntax # Ps       LEFT WHITE LENTICULAR BRACKET
+3017          ; Pattern_Syntax # Pe       RIGHT WHITE LENTICULAR BRACKET
+3018          ; Pattern_Syntax # Ps       LEFT WHITE TORTOISE SHELL BRACKET
+3019          ; Pattern_Syntax # Pe       RIGHT WHITE TORTOISE SHELL BRACKET
+301A          ; Pattern_Syntax # Ps       LEFT WHITE SQUARE BRACKET
+301B          ; Pattern_Syntax # Pe       RIGHT WHITE SQUARE BRACKET
+301C          ; Pattern_Syntax # Pd       WAVE DASH
+301D          ; Pattern_Syntax # Ps       REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F    ; Pattern_Syntax # Pe   [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+3020          ; Pattern_Syntax # So       POSTAL MARK FACE
+3030          ; Pattern_Syntax # Pd       WAVY DASH
+FD3E          ; Pattern_Syntax # Ps       ORNATE LEFT PARENTHESIS
+FD3F          ; Pattern_Syntax # Pe       ORNATE RIGHT PARENTHESIS
+FE45..FE46    ; Pattern_Syntax # Po   [2] SESAME DOT..WHITE SESAME DOT
+
+# Total code points: 2760
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/PropValueAliases.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/PropValueAliases.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/PropValueAliases.txt	(revision 14489)
@@ -0,0 +1,578 @@
+# PropertyValueAliases-4.1.0.txt
+# Date: 2005-03-28, 17:21:48 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# This file contains aliases for property values used in the UCD.
+# These names can be used for XML formats of UCD data, for regular-expression
+# property tests, and other programmatic textual descriptions of Unicode data.
+# For information on which properties are normative, see UCD.html.
+#
+# The names may be translated in appropriate environments, and additional
+# aliases may be useful.
+#
+# FORMAT
+#
+# Each line describes a property value name.
+# This consists of three or more fields, separated by semicolons.
+#
+# First Field: The first field describes the property for which that
+# property value name is used.
+#
+# Second Field: The second field is an abbreviated name.
+# If there is no abbreviated name available, the field is marked with "n/a".
+#
+# Third Field: The third field is a long name.
+#
+# In the case of ccc, there are 4 fields. The second field is numeric, third
+# is abbreviated, and fourth is long.
+#
+# The above are the preferred aliases. Other aliases may be listed in additional fields.
+#
+# Loose matching should be applied to all property names and property values, with
+# the exception of String Property values. With loose matching of property names and
+# values, the case distinctions, whitespace, and '_' are ignored. For Numeric Property
+# values, numeric equivalencies are applied: thus "01.00" is equivalent to "1".
+#
+# NOTE: Property value names are NOT unique across properties. For example:
+#
+#   AL means Arabic Letter for the Bidi_Class property, and
+#   AL means Alpha_Left for the Combining_Class property, and
+#   AL means Alphabetic for the Line_Break property.
+#
+# In addition, some property names may be the same as some property value names.
+# For example:
+#
+#   sc means the Script property, and
+#   Sc means the General_Category property value Currency_Symbol (Sc)
+#
+# The combination of property value and property name is, however, unique.
+#
+# For more information, see UTS #18: Regular Expression Guidelines
+# ================================================
+
+
+# Age (age)
+
+age; n/a       ; 1.1
+age; n/a       ; 2.0
+age; n/a       ; 2.1
+age; n/a       ; 3.0
+age; n/a       ; 3.1
+age; n/a       ; 3.2
+age; n/a       ; 4.0
+age; n/a       ; 4.1
+age; n/a       ; unassigned
+
+# Bidi_Class (bc)
+
+bc ; AL        ; Arabic_Letter
+bc ; AN        ; Arabic_Number
+bc ; B         ; Paragraph_Separator
+bc ; BN        ; Boundary_Neutral
+bc ; CS        ; Common_Separator
+bc ; EN        ; European_Number
+bc ; ES        ; European_Separator
+bc ; ET        ; European_Terminator
+bc ; L         ; Left_To_Right
+bc ; LRE       ; Left_To_Right_Embedding
+bc ; LRO       ; Left_To_Right_Override
+bc ; NSM       ; Nonspacing_Mark
+bc ; ON        ; Other_Neutral
+bc ; PDF       ; Pop_Directional_Format
+bc ; R         ; Right_To_Left
+bc ; RLE       ; Right_To_Left_Embedding
+bc ; RLO       ; Right_To_Left_Override
+bc ; S         ; Segment_Separator
+bc ; WS        ; White_Space
+
+# Block (blk)
+
+blk; n/a       ; Aegean_Numbers
+blk; n/a       ; Alphabetic_Presentation_Forms
+blk; n/a       ; Ancient_Greek_Musical_Notation
+blk; n/a       ; Ancient_Greek_Numbers
+blk; n/a       ; Arabic
+blk; n/a       ; Arabic_Presentation_Forms-A
+blk; n/a       ; Arabic_Presentation_Forms-B
+blk; n/a       ; Arabic_Supplement
+blk; n/a       ; Armenian
+blk; n/a       ; Arrows
+blk; n/a       ; Basic_Latin
+blk; n/a       ; Bengali
+blk; n/a       ; Block_Elements
+blk; n/a       ; Bopomofo
+blk; n/a       ; Bopomofo_Extended
+blk; n/a       ; Box_Drawing
+blk; n/a       ; Braille_Patterns
+blk; n/a       ; Buginese
+blk; n/a       ; Buhid
+blk; n/a       ; Byzantine_Musical_Symbols
+blk; n/a       ; Cherokee
+blk; n/a       ; CJK_Compatibility
+blk; n/a       ; CJK_Compatibility_Forms
+blk; n/a       ; CJK_Compatibility_Ideographs
+blk; n/a       ; CJK_Compatibility_Ideographs_Supplement
+blk; n/a       ; CJK_Radicals_Supplement
+blk; n/a       ; CJK_Strokes
+blk; n/a       ; CJK_Symbols_and_Punctuation
+blk; n/a       ; CJK_Unified_Ideographs
+blk; n/a       ; CJK_Unified_Ideographs_Extension_A
+blk; n/a       ; CJK_Unified_Ideographs_Extension_B
+blk; n/a       ; Combining_Diacritical_Marks
+blk; n/a       ; Combining_Diacritical_Marks_for_Symbols
+blk; n/a       ; Combining_Diacritical_Marks_Supplement
+blk; n/a       ; Combining_Half_Marks
+blk; n/a       ; Control_Pictures
+blk; n/a       ; Coptic
+blk; n/a       ; Currency_Symbols
+blk; n/a       ; Cypriot_Syllabary
+blk; n/a       ; Cyrillic
+blk; n/a       ; Cyrillic_Supplement              ; Cyrillic_Supplementary
+blk; n/a       ; Deseret
+blk; n/a       ; Devanagari
+blk; n/a       ; Dingbats
+blk; n/a       ; Enclosed_Alphanumerics
+blk; n/a       ; Enclosed_CJK_Letters_and_Months
+blk; n/a       ; Ethiopic
+blk; n/a       ; Ethiopic_Extended
+blk; n/a       ; Ethiopic_Supplement
+blk; n/a       ; General_Punctuation
+blk; n/a       ; Geometric_Shapes
+blk; n/a       ; Georgian
+blk; n/a       ; Georgian_Supplement
+blk; n/a       ; Glagolitic
+blk; n/a       ; Gothic
+blk; n/a       ; Greek_and_Coptic
+blk; n/a       ; Greek_Extended
+blk; n/a       ; Gujarati
+blk; n/a       ; Gurmukhi
+blk; n/a       ; Halfwidth_and_Fullwidth_Forms
+blk; n/a       ; Hangul_Compatibility_Jamo
+blk; n/a       ; Hangul_Jamo
+blk; n/a       ; Hangul_Syllables
+blk; n/a       ; Hanunoo
+blk; n/a       ; Hebrew
+blk; n/a       ; High_Private_Use_Surrogates
+blk; n/a       ; High_Surrogates
+blk; n/a       ; Hiragana
+blk; n/a       ; Ideographic_Description_Characters
+blk; n/a       ; IPA_Extensions
+blk; n/a       ; Kanbun
+blk; n/a       ; Kangxi_Radicals
+blk; n/a       ; Kannada
+blk; n/a       ; Katakana
+blk; n/a       ; Katakana_Phonetic_Extensions
+blk; n/a       ; Kharoshthi
+blk; n/a       ; Khmer
+blk; n/a       ; Khmer_Symbols
+blk; n/a       ; Lao
+blk; n/a       ; Latin-1_Supplement
+blk; n/a       ; Latin_Extended-A
+blk; n/a       ; Latin_Extended-B
+blk; n/a       ; Latin_Extended_Additional
+blk; n/a       ; Letterlike_Symbols
+blk; n/a       ; Limbu
+blk; n/a       ; Linear_B_Ideograms
+blk; n/a       ; Linear_B_Syllabary
+blk; n/a       ; Low_Surrogates
+blk; n/a       ; Malayalam
+blk; n/a       ; Mathematical_Alphanumeric_Symbols
+blk; n/a       ; Mathematical_Operators
+blk; n/a       ; Miscellaneous_Mathematical_Symbols-A
+blk; n/a       ; Miscellaneous_Mathematical_Symbols-B
+blk; n/a       ; Miscellaneous_Symbols
+blk; n/a       ; Miscellaneous_Symbols_and_Arrows
+blk; n/a       ; Miscellaneous_Technical
+blk; n/a       ; Modifier_Tone_Letters
+blk; n/a       ; Mongolian
+blk; n/a       ; Musical_Symbols
+blk; n/a       ; Myanmar
+blk; n/a       ; New_Tai_Lue
+blk; n/a       ; No_Block
+blk; n/a       ; Number_Forms
+blk; n/a       ; Ogham
+blk; n/a       ; Old_Italic
+blk; n/a       ; Old_Persian
+blk; n/a       ; Optical_Character_Recognition
+blk; n/a       ; Oriya
+blk; n/a       ; Osmanya
+blk; n/a       ; Phonetic_Extensions
+blk; n/a       ; Phonetic_Extensions_Supplement
+blk; n/a       ; Private_Use_Area
+blk; n/a       ; Runic
+blk; n/a       ; Shavian
+blk; n/a       ; Sinhala
+blk; n/a       ; Small_Form_Variants
+blk; n/a       ; Spacing_Modifier_Letters
+blk; n/a       ; Specials
+blk; n/a       ; Superscripts_and_Subscripts
+blk; n/a       ; Supplemental_Arrows-A
+blk; n/a       ; Supplemental_Arrows-B
+blk; n/a       ; Supplemental_Mathematical_Operators
+blk; n/a       ; Supplemental_Punctuation
+blk; n/a       ; Supplementary_Private_Use_Area-A
+blk; n/a       ; Supplementary_Private_Use_Area-B
+blk; n/a       ; Syloti_Nagri
+blk; n/a       ; Syriac
+blk; n/a       ; Tagalog
+blk; n/a       ; Tagbanwa
+blk; n/a       ; Tags
+blk; n/a       ; Tai_Le
+blk; n/a       ; Tai_Xuan_Jing_Symbols
+blk; n/a       ; Tamil
+blk; n/a       ; Telugu
+blk; n/a       ; Thaana
+blk; n/a       ; Thai
+blk; n/a       ; Tibetan
+blk; n/a       ; Tifinagh
+blk; n/a       ; Ugaritic
+blk; n/a       ; Unified_Canadian_Aboriginal_Syllabics
+blk; n/a       ; Variation_Selectors
+blk; n/a       ; Variation_Selectors_Supplement
+blk; n/a       ; Vertical_Forms
+blk; n/a       ; Yi_Radicals
+blk; n/a       ; Yi_Syllables
+blk; n/a       ; Yijing_Hexagram_Symbols
+
+# Canonical_Combining_Class (ccc)
+
+ccc;   0; NR   ; Not_Reordered
+ccc;   1; OV   ; Overlay
+ccc;   7; NK   ; Nukta
+ccc;   8; KV   ; Kana_Voicing
+ccc;   9; VR   ; Virama
+ccc; 200; ATBL ; Attached_Below_Left
+ccc; 202; ATB  ; Attached_Below
+ccc; 216; ATAR ; Attached_Above_Right
+ccc; 218; BL   ; Below_Left
+ccc; 220; B    ; Below
+ccc; 222; BR   ; Below_Right
+ccc; 224; L    ; Left
+ccc; 226; R    ; Right
+ccc; 228; AL   ; Above_Left
+ccc; 230; A    ; Above
+ccc; 232; AR   ; Above_Right
+ccc; 233; DB   ; Double_Below
+ccc; 234; DA   ; Double_Above
+ccc; 240; IS   ; Iota_Subscript
+
+# Decomposition_Type (dt)
+
+dt ; can       ; Canonical
+dt ; com       ; Compat
+dt ; enc       ; Circle
+dt ; fin       ; Final
+dt ; font      ; Font
+dt ; fra       ; Fraction
+dt ; init      ; Initial
+dt ; iso       ; Isolated
+dt ; med       ; Medial
+dt ; nar       ; Narrow
+dt ; nb        ; Nobreak
+dt ; none      ; None
+dt ; sml       ; Small
+dt ; sqr       ; Square
+dt ; sub       ; Sub
+dt ; sup       ; Super
+dt ; vert      ; Vertical
+dt ; wide      ; Wide
+
+# East_Asian_Width (ea)
+
+ea ; A         ; Ambiguous
+ea ; F         ; Fullwidth
+ea ; H         ; Halfwidth
+ea ; N         ; Neutral
+ea ; Na        ; Narrow
+ea ; W         ; Wide
+
+# General_Category (gc)
+
+gc ; C         ; Other                            # Cc | Cf | Cn | Co | Cs
+gc ; Cc        ; Control                          ; cntrl
+gc ; Cf        ; Format
+gc ; Cn        ; Unassigned
+gc ; Co        ; Private_Use
+gc ; Cs        ; Surrogate
+gc ; L         ; Letter                           # Ll | Lm | Lo | Lt | Lu
+gc ; LC        ; Cased_Letter                     # Ll | Lt | Lu
+gc ; Ll        ; Lowercase_Letter
+gc ; Lm        ; Modifier_Letter
+gc ; Lo        ; Other_Letter
+gc ; Lt        ; Titlecase_Letter
+gc ; Lu        ; Uppercase_Letter
+gc ; M         ; Mark                             # Mc | Me | Mn
+gc ; Mc        ; Spacing_Mark
+gc ; Me        ; Enclosing_Mark
+gc ; Mn        ; Nonspacing_Mark
+gc ; N         ; Number                           # Nd | Nl | No
+gc ; Nd        ; Decimal_Number                   ; digit
+gc ; Nl        ; Letter_Number
+gc ; No        ; Other_Number
+gc ; P         ; Punctuation                      ; punct                            # Pc | Pd | Pe | Pf | Pi | Po | Ps
+gc ; Pc        ; Connector_Punctuation
+gc ; Pd        ; Dash_Punctuation
+gc ; Pe        ; Close_Punctuation
+gc ; Pf        ; Final_Punctuation
+gc ; Pi        ; Initial_Punctuation
+gc ; Po        ; Other_Punctuation
+gc ; Ps        ; Open_Punctuation
+gc ; S         ; Symbol                           # Sc | Sk | Sm | So
+gc ; Sc        ; Currency_Symbol
+gc ; Sk        ; Modifier_Symbol
+gc ; Sm        ; Math_Symbol
+gc ; So        ; Other_Symbol
+gc ; Z         ; Separator                        # Zl | Zp | Zs
+gc ; Zl        ; Line_Separator
+gc ; Zp        ; Paragraph_Separator
+gc ; Zs        ; Space_Separator
+
+# Grapheme_Cluster_Break (GCB)
+
+GCB; CN        ; Control
+GCB; CR        ; CR
+GCB; EX        ; Extend
+GCB; L         ; L
+GCB; LF        ; LF
+GCB; LV        ; LV
+GCB; LVT       ; LVT
+GCB; T         ; T
+GCB; V         ; V
+GCB; XX        ; Other
+
+# Hangul_Syllable_Type (hst)
+
+hst; L         ; Leading_Jamo
+hst; LV        ; LV_Syllable
+hst; LVT       ; LVT_Syllable
+hst; NA        ; Not_Applicable
+hst; T         ; Trailing_Jamo
+hst; V         ; Vowel_Jamo
+
+# Joining_Group (jg)
+
+jg ; n/a       ; Ain
+jg ; n/a       ; Alaph
+jg ; n/a       ; Alef
+jg ; n/a       ; Beh
+jg ; n/a       ; Beth
+jg ; n/a       ; Dal
+jg ; n/a       ; Dalath_Rish
+jg ; n/a       ; E
+jg ; n/a       ; Fe
+jg ; n/a       ; Feh
+jg ; n/a       ; Final_Semkath
+jg ; n/a       ; Gaf
+jg ; n/a       ; Gamal
+jg ; n/a       ; Hah
+jg ; n/a       ; Hamza_On_Heh_Goal
+jg ; n/a       ; He
+jg ; n/a       ; Heh
+jg ; n/a       ; Heh_Goal
+jg ; n/a       ; Heth
+jg ; n/a       ; Kaf
+jg ; n/a       ; Kaph
+jg ; n/a       ; Khaph
+jg ; n/a       ; Knotted_Heh
+jg ; n/a       ; Lam
+jg ; n/a       ; Lamadh
+jg ; n/a       ; Meem
+jg ; n/a       ; Mim
+jg ; n/a       ; No_Joining_Group
+jg ; n/a       ; Noon
+jg ; n/a       ; Nun
+jg ; n/a       ; Pe
+jg ; n/a       ; Qaf
+jg ; n/a       ; Qaph
+jg ; n/a       ; Reh
+jg ; n/a       ; Reversed_Pe
+jg ; n/a       ; Sad
+jg ; n/a       ; Sadhe
+jg ; n/a       ; Seen
+jg ; n/a       ; Semkath
+jg ; n/a       ; Shin
+jg ; n/a       ; Swash_Kaf
+jg ; n/a       ; Syriac_Waw
+jg ; n/a       ; Tah
+jg ; n/a       ; Taw
+jg ; n/a       ; Teh_Marbuta
+jg ; n/a       ; Teth
+jg ; n/a       ; Waw
+jg ; n/a       ; Yeh
+jg ; n/a       ; Yeh_Barree
+jg ; n/a       ; Yeh_With_Tail
+jg ; n/a       ; Yudh
+jg ; n/a       ; Yudh_He
+jg ; n/a       ; Zain
+jg ; n/a       ; Zhain
+
+# Joining_Type (jt)
+
+jt ; C         ; Join_Causing
+jt ; D         ; Dual_Joining
+jt ; L         ; Left_Joining
+jt ; R         ; Right_Joining
+jt ; T         ; Transparent
+jt ; U         ; Non_Joining
+
+# Line_Break (lb)
+
+lb ; AI        ; Ambiguous
+lb ; AL        ; Alphabetic
+lb ; B2        ; Break_Both
+lb ; BA        ; Break_After
+lb ; BB        ; Break_Before
+lb ; BK        ; Mandatory_Break
+lb ; CB        ; Contingent_Break
+lb ; CL        ; Close_Punctuation
+lb ; CM        ; Combining_Mark
+lb ; CR        ; Carriage_Return
+lb ; EX        ; Exclamation
+lb ; GL        ; Glue
+lb ; H2        ; H2
+lb ; H3        ; H3
+lb ; HY        ; Hyphen
+lb ; ID        ; Ideographic
+lb ; IN        ; Inseparable                      ; Inseperable
+lb ; IS        ; Infix_Numeric
+lb ; JL        ; JL
+lb ; JT        ; JT
+lb ; JV        ; JV
+lb ; LF        ; Line_Feed
+lb ; NL        ; Next_Line
+lb ; NS        ; Nonstarter
+lb ; NU        ; Numeric
+lb ; OP        ; Open_Punctuation
+lb ; PO        ; Postfix_Numeric
+lb ; PR        ; Prefix_Numeric
+lb ; QU        ; Quotation
+lb ; SA        ; Complex_Context
+lb ; SG        ; Surrogate
+lb ; SP        ; Space
+lb ; SY        ; Break_Symbols
+lb ; WJ        ; Word_Joiner
+lb ; XX        ; Unknown
+lb ; ZW        ; ZWSpace
+
+# NFC_Quick_Check (NFC_QC)
+
+NFC_QC; M      ; Maybe
+NFC_QC; N      ; No
+NFC_QC; Y      ; Yes
+
+# NFD_Quick_Check (NFD_QC)
+
+NFD_QC; N      ; No
+NFD_QC; Y      ; Yes
+
+# NFKC_Quick_Check (NFKC_QC)
+
+NFKC_QC; M     ; Maybe
+NFKC_QC; N     ; No
+NFKC_QC; Y     ; Yes
+
+# NFKD_Quick_Check (NFKD_QC)
+
+NFKD_QC; N     ; No
+NFKD_QC; Y     ; Yes
+
+# Numeric_Type (nt)
+
+nt ; De        ; Decimal
+nt ; Di        ; Digit
+nt ; None      ; None
+nt ; Nu        ; Numeric
+
+# Script (sc)
+
+sc ; Arab      ; Arabic
+sc ; Armn      ; Armenian
+sc ; Beng      ; Bengali
+sc ; Bopo      ; Bopomofo
+sc ; Brai      ; Braille
+sc ; Bugi      ; Buginese
+sc ; Buhd      ; Buhid
+sc ; Cans      ; Canadian_Aboriginal
+sc ; Cher      ; Cherokee
+sc ; Copt      ; Coptic                           ; Qaac
+sc ; Cprt      ; Cypriot
+sc ; Cyrl      ; Cyrillic
+sc ; Deva      ; Devanagari
+sc ; Dsrt      ; Deseret
+sc ; Ethi      ; Ethiopic
+sc ; Geor      ; Georgian
+sc ; Glag      ; Glagolitic
+sc ; Goth      ; Gothic
+sc ; Grek      ; Greek
+sc ; Gujr      ; Gujarati
+sc ; Guru      ; Gurmukhi
+sc ; Hang      ; Hangul
+sc ; Hani      ; Han
+sc ; Hano      ; Hanunoo
+sc ; Hebr      ; Hebrew
+sc ; Hira      ; Hiragana
+sc ; Hrkt      ; Katakana_Or_Hiragana
+sc ; Ital      ; Old_Italic
+sc ; Kana      ; Katakana
+sc ; Khar      ; Kharoshthi
+sc ; Khmr      ; Khmer
+sc ; Knda      ; Kannada
+sc ; Laoo      ; Lao
+sc ; Latn      ; Latin
+sc ; Limb      ; Limbu
+sc ; Linb      ; Linear_B
+sc ; Mlym      ; Malayalam
+sc ; Mong      ; Mongolian
+sc ; Mymr      ; Myanmar
+sc ; Ogam      ; Ogham
+sc ; Orya      ; Oriya
+sc ; Osma      ; Osmanya
+sc ; Qaai      ; Inherited
+sc ; Runr      ; Runic
+sc ; Shaw      ; Shavian
+sc ; Sinh      ; Sinhala
+sc ; Sylo      ; Syloti_Nagri
+sc ; Syrc      ; Syriac
+sc ; Tagb      ; Tagbanwa
+sc ; Tale      ; Tai_Le
+sc ; Talu      ; New_Tai_Lue
+sc ; Taml      ; Tamil
+sc ; Telu      ; Telugu
+sc ; Tfng      ; Tifinagh
+sc ; Tglg      ; Tagalog
+sc ; Thaa      ; Thaana
+sc ; Thai      ; Thai
+sc ; Tibt      ; Tibetan
+sc ; Ugar      ; Ugaritic
+sc ; Xpeo      ; Old_Persian
+sc ; Yiii      ; Yi
+sc ; Zyyy      ; Common
+
+# Sentence_Break (SB)
+
+SB ; AT        ; ATerm
+SB ; CL        ; Close
+SB ; FO        ; Format
+SB ; LE        ; OLetter
+SB ; LO        ; Lower
+SB ; NU        ; Numeric
+SB ; SE        ; Sep
+SB ; SP        ; Sp
+SB ; ST        ; STerm
+SB ; UP        ; Upper
+SB ; XX        ; Other
+
+# Word_Break (WB)
+
+WB ; EX        ; ExtendNumLet
+WB ; FO        ; Format
+WB ; KA        ; Katakana
+WB ; LE        ; ALetter
+WB ; ML        ; MidLetter
+WB ; MN        ; MidNum
+WB ; NU        ; Numeric
+WB ; XX        ; Other
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/Properties
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/Properties	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/Properties	(revision 14489)
@@ -0,0 +1,350 @@
+##
+## This file created by mktables
+## List of built-in \p{...}/\P{...} properties.
+##
+## '*' means name may be 'fuzzy'
+##
+
+  \p{ASCII}                                  [[:ASCII:]]
+  \p{Alnum}                                  [[:Alnum:]]
+* \p{Alphabetic}                             [\p{L}\p{OtherAlphabetic}]
+  \p{Alpha}                                  [[:Alpha:]]
+  \p{Any}                                    Alias for \p{Any} ([\x{0000}-\x{10FFFF}])
+  \p{Any}                                    [\x{0000}-\x{10FFFF}]
+* \p{Arabic}                                 Script 'Arabic'
+* \p{Armenian}                               Script 'Armenian'
+* \p{AsciiHexDigit}                          Extended property 'ASCII_Hex_Digit'
+  \p{Assigned}                               All assigned code points
+* \p{Bengali}                                Script 'Bengali'
+* \p{BidiControl}                            Extended property 'Bidi_Control'
+  \p{Blank}                                  [[:Blank:]]
+* \p{Bopomofo}                               Script 'Bopomofo'
+* \p{Braille}                                Script 'Braille'
+* \p{Buginese}                               Script 'Buginese'
+* \p{Buhid}                                  Script 'Buhid'
+* \p{CanadianAboriginal}                     Script 'Canadian_Aboriginal'
+* \p{Cc}                                     Alias for \p{Cc} (General Category 'Cc')
+  \p{Cc}                                     General Category 'Cc'
+* \p{Cf}                                     Alias for \p{Cf} (General Category 'Cf')
+  \p{Cf}                                     General Category 'Cf'
+* \p{Cherokee}                               Script 'Cherokee'
+  \p{Cntrl}                                  [[:Cntrl:]]
+* \p{Cn}                                     Alias for \p{Cn} (General Category 'Cn' [not functional in Perl])
+  \p{Cn}                                     General Category 'Cn' [not functional in Perl]
+* \p{Common}                                 Script 'Common'
+* \p{Coptic}                                 Script 'Coptic'
+* \p{Co}                                     Alias for \p{Co} (General Category 'Co')
+  \p{Co}                                     General Category 'Co'
+* \p{Cs}                                     Alias for \p{Cs} (General Category 'Cs')
+  \p{Cs}                                     General Category 'Cs'
+* \p{Cypriot}                                Script 'Cypriot'
+* \p{Cyrillic}                               Script 'Cyrillic'
+* \p{C}                                      Alias for \p{C} (Major Category 'C')
+  \p{C}                                      Major Category 'C'
+* \p{Dash}                                   Extended property 'Dash'
+* \p{Deprecated}                             Extended property 'Deprecated'
+* \p{Deseret}                                Script 'Deseret'
+* \p{Devanagari}                             Script 'Devanagari'
+* \p{Diacritic}                              Extended property 'Diacritic'
+  \p{Digit}                                  [[:Digit:]]
+* \p{Ethiopic}                               Script 'Ethiopic'
+* \p{Extender}                               Extended property 'Extender'
+* \p{Georgian}                               Script 'Georgian'
+* \p{Glagolitic}                             Script 'Glagolitic'
+* \p{Gothic}                                 Script 'Gothic'
+* \p{GraphemeLink}                           Extended property 'Grapheme_Link'
+  \p{Graph}                                  [[:Graph:]]
+* \p{Greek}                                  Script 'Greek'
+* \p{Gujarati}                               Script 'Gujarati'
+* \p{Gurmukhi}                               Script 'Gurmukhi'
+* \p{Hangul}                                 Script 'Hangul'
+* \p{Hanunoo}                                Script 'Hanunoo'
+* \p{Han}                                    Script 'Han'
+* \p{Hebrew}                                 Script 'Hebrew'
+* \p{HexDigit}                               Extended property 'Hex_Digit'
+* \p{Hiragana}                               Script 'Hiragana'
+* \p{Hyphen}                                 Extended property 'Hyphen'
+* \p{IdContinue}                             [\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}]
+* \p{IdStart}                                [\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{Nl}]
+* \p{Ideographic}                            Extended property 'Ideographic'
+* \p{IdsBinaryOperator}                      Extended property 'IDS_Binary_Operator'
+* \p{IdsTrinaryOperator}                     Extended property 'IDS_Trinary_Operator'
+* \p{InAegeanNumbers}                        Block 'Aegean Numbers'
+* \p{InAlphabeticPresentationForms}          Block 'Alphabetic Presentation Forms'
+* \p{InAncientGreekMusicalNotation}          Block 'Ancient Greek Musical Notation'
+* \p{InAncientGreekNumbers}                  Block 'Ancient Greek Numbers'
+* \p{InArabicPresentationFormsA}             Block 'Arabic Presentation Forms-A'
+* \p{InArabicPresentationFormsB}             Block 'Arabic Presentation Forms-B'
+* \p{InArabicSupplement}                     Block 'Arabic Supplement'
+* \p{InArabic}                               Block 'Arabic'
+* \p{InArmenian}                             Block 'Armenian'
+* \p{InArrows}                               Block 'Arrows'
+* \p{InBasicLatin}                           Block 'Basic Latin'
+* \p{InBengali}                              Block 'Bengali'
+* \p{InBlockElements}                        Block 'Block Elements'
+* \p{InBopomofoExtended}                     Block 'Bopomofo Extended'
+* \p{InBopomofo}                             Block 'Bopomofo'
+* \p{InBoxDrawing}                           Block 'Box Drawing'
+* \p{InBraillePatterns}                      Block 'Braille Patterns'
+* \p{InBuginese}                             Block 'Buginese'
+* \p{InBuhid}                                Block 'Buhid'
+* \p{InByzantineMusicalSymbols}              Block 'Byzantine Musical Symbols'
+* \p{InCherokee}                             Block 'Cherokee'
+* \p{InCjkCompatibilityForms}                Block 'CJK Compatibility Forms'
+* \p{InCjkCompatibilityIdeographsSupplement} Block 'CJK Compatibility Ideographs Supplement'
+* \p{InCjkCompatibilityIdeographs}           Block 'CJK Compatibility Ideographs'
+* \p{InCjkCompatibility}                     Block 'CJK Compatibility'
+* \p{InCjkRadicalsSupplement}                Block 'CJK Radicals Supplement'
+* \p{InCjkStrokes}                           Block 'CJK Strokes'
+* \p{InCjkSymbolsAndPunctuation}             Block 'CJK Symbols and Punctuation'
+* \p{InCjkUnifiedIdeographsExtensionA}       Block 'CJK Unified Ideographs Extension A'
+* \p{InCjkUnifiedIdeographsExtensionB}       Block 'CJK Unified Ideographs Extension B'
+* \p{InCjkUnifiedIdeographs}                 Block 'CJK Unified Ideographs'
+* \p{InCombiningDiacriticalMarksForSymbols}  Block 'Combining Diacritical Marks for Symbols'
+* \p{InCombiningDiacriticalMarksSupplement}  Block 'Combining Diacritical Marks Supplement'
+* \p{InCombiningDiacriticalMarks}            Block 'Combining Diacritical Marks'
+* \p{InCombiningHalfMarks}                   Block 'Combining Half Marks'
+* \p{InControlPictures}                      Block 'Control Pictures'
+* \p{InCoptic}                               Block 'Coptic'
+* \p{InCurrencySymbols}                      Block 'Currency Symbols'
+* \p{InCypriotSyllabary}                     Block 'Cypriot Syllabary'
+* \p{InCyrillicSupplement}                   Block 'Cyrillic Supplement'
+* \p{InCyrillic}                             Block 'Cyrillic'
+* \p{InDeseret}                              Block 'Deseret'
+* \p{InDevanagari}                           Block 'Devanagari'
+* \p{InDingbats}                             Block 'Dingbats'
+* \p{InEnclosedAlphanumerics}                Block 'Enclosed Alphanumerics'
+* \p{InEnclosedCjkLettersAndMonths}          Block 'Enclosed CJK Letters and Months'
+* \p{InEthiopicExtended}                     Block 'Ethiopic Extended'
+* \p{InEthiopicSupplement}                   Block 'Ethiopic Supplement'
+* \p{InEthiopic}                             Block 'Ethiopic'
+* \p{InGeneralPunctuation}                   Block 'General Punctuation'
+* \p{InGeometricShapes}                      Block 'Geometric Shapes'
+* \p{InGeorgianSupplement}                   Block 'Georgian Supplement'
+* \p{InGeorgian}                             Block 'Georgian'
+* \p{InGlagolitic}                           Block 'Glagolitic'
+* \p{InGothic}                               Block 'Gothic'
+* \p{InGreekAndCoptic}                       Block 'Greek and Coptic'
+* \p{InGreekExtended}                        Block 'Greek Extended'
+* \p{InGujarati}                             Block 'Gujarati'
+* \p{InGurmukhi}                             Block 'Gurmukhi'
+* \p{InHalfwidthAndFullwidthForms}           Block 'Halfwidth and Fullwidth Forms'
+* \p{InHangulCompatibilityJamo}              Block 'Hangul Compatibility Jamo'
+* \p{InHangulJamo}                           Block 'Hangul Jamo'
+* \p{InHangulSyllables}                      Block 'Hangul Syllables'
+* \p{InHanunoo}                              Block 'Hanunoo'
+* \p{InHebrew}                               Block 'Hebrew'
+* \p{InHighPrivateUseSurrogates}             Block 'High Private Use Surrogates'
+* \p{InHighSurrogates}                       Block 'High Surrogates'
+* \p{InHiragana}                             Block 'Hiragana'
+* \p{InIdeographicDescriptionCharacters}     Block 'Ideographic Description Characters'
+* \p{InIpaExtensions}                        Block 'IPA Extensions'
+* \p{InKanbun}                               Block 'Kanbun'
+* \p{InKangxiRadicals}                       Block 'Kangxi Radicals'
+* \p{InKannada}                              Block 'Kannada'
+* \p{InKatakanaPhoneticExtensions}           Block 'Katakana Phonetic Extensions'
+* \p{InKatakana}                             Block 'Katakana'
+* \p{InKharoshthi}                           Block 'Kharoshthi'
+* \p{InKhmerSymbols}                         Block 'Khmer Symbols'
+* \p{InKhmer}                                Block 'Khmer'
+* \p{InLao}                                  Block 'Lao'
+* \p{InLatin1Supplement}                     Block 'Latin-1 Supplement'
+* \p{InLatinExtendedAdditional}              Block 'Latin Extended Additional'
+* \p{InLatinExtendedA}                       Block 'Latin Extended-A'
+* \p{InLatinExtendedB}                       Block 'Latin Extended-B'
+* \p{InLetterlikeSymbols}                    Block 'Letterlike Symbols'
+* \p{InLimbu}                                Block 'Limbu'
+* \p{InLinearBIdeograms}                     Block 'Linear B Ideograms'
+* \p{InLinearBSyllabary}                     Block 'Linear B Syllabary'
+* \p{InLowSurrogates}                        Block 'Low Surrogates'
+* \p{InMalayalam}                            Block 'Malayalam'
+* \p{InMathematicalAlphanumericSymbols}      Block 'Mathematical Alphanumeric Symbols'
+* \p{InMathematicalOperators}                Block 'Mathematical Operators'
+* \p{InMiscellaneousMathematicalSymbolsA}    Block 'Miscellaneous Mathematical Symbols-A'
+* \p{InMiscellaneousMathematicalSymbolsB}    Block 'Miscellaneous Mathematical Symbols-B'
+* \p{InMiscellaneousSymbolsAndArrows}        Block 'Miscellaneous Symbols and Arrows'
+* \p{InMiscellaneousSymbols}                 Block 'Miscellaneous Symbols'
+* \p{InMiscellaneousTechnical}               Block 'Miscellaneous Technical'
+* \p{InModifierToneLetters}                  Block 'Modifier Tone Letters'
+* \p{InMongolian}                            Block 'Mongolian'
+* \p{InMusicalSymbols}                       Block 'Musical Symbols'
+* \p{InMyanmar}                              Block 'Myanmar'
+* \p{InNewTaiLue}                            Block 'New Tai Lue'
+* \p{InNumberForms}                          Block 'Number Forms'
+* \p{InOgham}                                Block 'Ogham'
+* \p{InOldItalic}                            Block 'Old Italic'
+* \p{InOldPersian}                           Block 'Old Persian'
+* \p{InOpticalCharacterRecognition}          Block 'Optical Character Recognition'
+* \p{InOriya}                                Block 'Oriya'
+* \p{InOsmanya}                              Block 'Osmanya'
+* \p{InPhoneticExtensionsSupplement}         Block 'Phonetic Extensions Supplement'
+* \p{InPhoneticExtensions}                   Block 'Phonetic Extensions'
+* \p{InPrivateUseArea}                       Block 'Private Use Area'
+* \p{InRunic}                                Block 'Runic'
+* \p{InShavian}                              Block 'Shavian'
+* \p{InSinhala}                              Block 'Sinhala'
+* \p{InSmallFormVariants}                    Block 'Small Form Variants'
+* \p{InSpacingModifierLetters}               Block 'Spacing Modifier Letters'
+* \p{InSpecials}                             Block 'Specials'
+* \p{InSuperscriptsAndSubscripts}            Block 'Superscripts and Subscripts'
+* \p{InSupplementalArrowsA}                  Block 'Supplemental Arrows-A'
+* \p{InSupplementalArrowsB}                  Block 'Supplemental Arrows-B'
+* \p{InSupplementalMathematicalOperators}    Block 'Supplemental Mathematical Operators'
+* \p{InSupplementalPunctuation}              Block 'Supplemental Punctuation'
+* \p{InSupplementaryPrivateUseAreaA}         Block 'Supplementary Private Use Area-A'
+* \p{InSupplementaryPrivateUseAreaB}         Block 'Supplementary Private Use Area-B'
+* \p{InSylotiNagri}                          Block 'Syloti Nagri'
+* \p{InSyriac}                               Block 'Syriac'
+* \p{InTagalog}                              Block 'Tagalog'
+* \p{InTagbanwa}                             Block 'Tagbanwa'
+* \p{InTags}                                 Block 'Tags'
+* \p{InTaiLe}                                Block 'Tai Le'
+* \p{InTaiXuanJingSymbols}                   Block 'Tai Xuan Jing Symbols'
+* \p{InTamil}                                Block 'Tamil'
+* \p{InTelugu}                               Block 'Telugu'
+* \p{InThaana}                               Block 'Thaana'
+* \p{InThai}                                 Block 'Thai'
+* \p{InTibetan}                              Block 'Tibetan'
+* \p{InTifinagh}                             Block 'Tifinagh'
+* \p{InUgaritic}                             Block 'Ugaritic'
+* \p{InUnifiedCanadianAboriginalSyllabics}   Block 'Unified Canadian Aboriginal Syllabics'
+* \p{InVariationSelectorsSupplement}         Block 'Variation Selectors Supplement'
+* \p{InVariationSelectors}                   Block 'Variation Selectors'
+* \p{InVerticalForms}                        Block 'Vertical Forms'
+* \p{InYiRadicals}                           Block 'Yi Radicals'
+* \p{InYiSyllables}                          Block 'Yi Syllables'
+* \p{InYijingHexagramSymbols}                Block 'Yijing Hexagram Symbols'
+* \p{Inherited}                              Script 'Inherited'
+* \p{JoinControl}                            Extended property 'Join_Control'
+* \p{Kannada}                                Script 'Kannada'
+* \p{Katakana}                               Script 'Katakana'
+* \p{Kharoshthi}                             Script 'Kharoshthi'
+* \p{Khmer}                                  Script 'Khmer'
+* \p{LC}                                     Alias for \p{LC} ([\p{Ll}\p{Lu}\p{Lt}])
+  \p{LC}                                     [\p{Ll}\p{Lu}\p{Lt}]
+* \p{Lao}                                    Script 'Lao'
+* \p{Latin}                                  Script 'Latin'
+* \p{Limbu}                                  Script 'Limbu'
+* \p{LinearB}                                Script 'Linear_B'
+* \p{Ll}                                     Alias for \p{Ll} (General Category 'Ll')
+  \p{Ll}                                     General Category 'Ll'
+* \p{Lm}                                     Alias for \p{Lm} (General Category 'Lm')
+  \p{Lm}                                     General Category 'Lm'
+* \p{LogicalOrderException}                  Extended property 'Logical_Order_Exception'
+* \p{Lowercase}                              [\p{Ll}\p{OtherLowercase}]
+  \p{Lower}                                  [[:Lower:]]
+* \p{Lo}                                     Alias for \p{Lo} (General Category 'Lo')
+  \p{Lo}                                     General Category 'Lo'
+* \p{Lt}                                     Alias for \p{Lt} (General Category 'Lt')
+  \p{Lt}                                     General Category 'Lt'
+* \p{Lu}                                     Alias for \p{Lu} (General Category 'Lu')
+  \p{Lu}                                     General Category 'Lu'
+* \p{L}                                      Alias for \p{L} (Major Category 'L')
+  \p{L}                                      Major Category 'L'
+* \p{Malayalam}                              Script 'Malayalam'
+* \p{Math}                                   [\p{Sm}\p{OtherMath}]
+* \p{Mc}                                     Alias for \p{Mc} (General Category 'Mc')
+  \p{Mc}                                     General Category 'Mc'
+* \p{Me}                                     Alias for \p{Me} (General Category 'Me')
+  \p{Me}                                     General Category 'Me'
+* \p{Mn}                                     Alias for \p{Mn} (General Category 'Mn')
+  \p{Mn}                                     General Category 'Mn'
+* \p{Mongolian}                              Script 'Mongolian'
+* \p{Myanmar}                                Script 'Myanmar'
+* \p{M}                                      Alias for \p{M} (Major Category 'M')
+  \p{M}                                      Major Category 'M'
+* \p{Nd}                                     Alias for \p{Nd} (General Category 'Nd')
+  \p{Nd}                                     General Category 'Nd'
+* \p{NewTaiLue}                              Script 'New_Tai_Lue'
+* \p{Nl}                                     Alias for \p{Nl} (General Category 'Nl')
+  \p{Nl}                                     General Category 'Nl'
+* \p{NoncharacterCodePoint}                  Extended property 'Noncharacter_Code_Point'
+* \p{No}                                     Alias for \p{No} (General Category 'No')
+  \p{No}                                     General Category 'No'
+* \p{N}                                      Alias for \p{N} (Major Category 'N')
+  \p{N}                                      Major Category 'N'
+* \p{Ogham}                                  Script 'Ogham'
+* \p{OldItalic}                              Script 'Old_Italic'
+* \p{OldPersian}                             Script 'Old_Persian'
+* \p{Oriya}                                  Script 'Oriya'
+* \p{Osmanya}                                Script 'Osmanya'
+* \p{OtherAlphabetic}                        Extended property 'Other_Alphabetic'
+* \p{OtherDefaultIgnorableCodePoint}         Extended property 'Other_Default_Ignorable_Code_Point'
+* \p{OtherGraphemeExtend}                    Extended property 'Other_Grapheme_Extend'
+* \p{OtherIdContinue}                        Extended property 'Other_ID_Continue'
+* \p{OtherIdStart}                           Extended property 'Other_ID_Start'
+* \p{OtherLowercase}                         Extended property 'Other_Lowercase'
+* \p{OtherMath}                              Extended property 'Other_Math'
+* \p{OtherUppercase}                         Extended property 'Other_Uppercase'
+* \p{PatternSyntax}                          Extended property 'Pattern_Syntax'
+* \p{PatternWhiteSpace}                      Extended property 'Pattern_White_Space'
+* \p{Pc}                                     Alias for \p{Pc} (General Category 'Pc')
+  \p{Pc}                                     General Category 'Pc'
+* \p{Pd}                                     Alias for \p{Pd} (General Category 'Pd')
+  \p{Pd}                                     General Category 'Pd'
+* \p{Pe}                                     Alias for \p{Pe} (General Category 'Pe')
+  \p{Pe}                                     General Category 'Pe'
+* \p{Pf}                                     Alias for \p{Pf} (General Category 'Pf')
+  \p{Pf}                                     General Category 'Pf'
+* \p{Pi}                                     Alias for \p{Pi} (General Category 'Pi')
+  \p{Pi}                                     General Category 'Pi'
+* \p{Po}                                     Alias for \p{Po} (General Category 'Po')
+  \p{Po}                                     General Category 'Po'
+  \p{Print}                                  [[:Print:]]
+* \p{Ps}                                     Alias for \p{Ps} (General Category 'Ps')
+  \p{Ps}                                     General Category 'Ps'
+  \p{Punct}                                  [[:Punct:]]
+* \p{P}                                      Alias for \p{P} (Major Category 'P')
+  \p{P}                                      Major Category 'P'
+* \p{QuotationMark}                          Extended property 'Quotation_Mark'
+* \p{Radical}                                Extended property 'Radical'
+* \p{Runic}                                  Script 'Runic'
+* \p{Sc}                                     Alias for \p{Sc} (General Category 'Sc')
+  \p{Sc}                                     General Category 'Sc'
+* \p{Shavian}                                Script 'Shavian'
+* \p{Sinhala}                                Script 'Sinhala'
+* \p{Sk}                                     Alias for \p{Sk} (General Category 'Sk')
+  \p{Sk}                                     General Category 'Sk'
+* \p{Sm}                                     Alias for \p{Sm} (General Category 'Sm')
+  \p{Sm}                                     General Category 'Sm'
+* \p{SoftDotted}                             Extended property 'Soft_Dotted'
+* \p{So}                                     Alias for \p{So} (General Category 'So')
+  \p{So}                                     General Category 'So'
+  \p{SpacePerl}                              \s
+  \p{Space}                                  [[:Space:]]
+* \p{Sterm}                                  Extended property 'STerm'
+* \p{SylotiNagri}                            Script 'Syloti_Nagri'
+* \p{Syriac}                                 Script 'Syriac'
+* \p{S}                                      Alias for \p{S} (Major Category 'S')
+  \p{S}                                      Major Category 'S'
+* \p{Tagalog}                                Script 'Tagalog'
+* \p{Tagbanwa}                               Script 'Tagbanwa'
+* \p{TaiLe}                                  Script 'Tai_Le'
+* \p{Tamil}                                  Script 'Tamil'
+* \p{Telugu}                                 Script 'Telugu'
+* \p{TerminalPunctuation}                    Extended property 'Terminal_Punctuation'
+* \p{Thaana}                                 Script 'Thaana'
+* \p{Thai}                                   Script 'Thai'
+* \p{Tibetan}                                Script 'Tibetan'
+* \p{Tifinagh}                               Script 'Tifinagh'
+  \p{Title}                                  [[:Title:]]
+* \p{Ugaritic}                               Script 'Ugaritic'
+* \p{UnifiedIdeograph}                       Extended property 'Unified_Ideograph'
+* \p{Uppercase}                              [\p{Lu}\p{Other_Uppercase}]
+  \p{Upper}                                  [[:Upper:]]
+* \p{VariationSelector}                      Extended property 'Variation_Selector'
+* \p{WhiteSpace}                             Extended property 'White_Space'
+  \p{Word}                                   [[:Word:]]
+  \p{XDigit}                                 [[:XDigit:]]
+* \p{Yi}                                     Script 'Yi'
+* \p{Zl}                                     Alias for \p{Zl} (General Category 'Zl')
+  \p{Zl}                                     General Category 'Zl'
+* \p{Zp}                                     Alias for \p{Zp} (General Category 'Zp')
+  \p{Zp}                                     General Category 'Zp'
+* \p{Zs}                                     Alias for \p{Zs} (General Category 'Zs')
+  \p{Zs}                                     General Category 'Zs'
+* \p{Z}                                      Alias for \p{Z} (Major Category 'Z')
+  \p{Z}                                      Major Category 'Z'
+  \p{_CanonDCIJ}                             (for internal casefolding use)
+  \p{_CaseIgnorable}                         (for internal casefolding use)
+  \p{_CombAbove}                             (for internal casefolding use)
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/PropertyAliases.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/PropertyAliases.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/PropertyAliases.txt	(revision 14489)
@@ -0,0 +1,163 @@
+# PropertyAliases-4.1.0.txt
+# Date: 2005-02-26, 11:13:41 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+# This file contains aliases for properties used in the UCD.
+# These names can be used for XML formats of UCD data, for regular-expression
+# property tests, and other programmatic textual descriptions of Unicode data.
+# For information on which properties are normative, see UCD.html.
+#
+# The names may be translated in appropriate environments, and additional
+# aliases may be useful.
+#
+# FORMAT
+#
+# Each line has two or more fields, separated by semicolons.
+#
+# First Field: The first field is an abbreviated name for the property.
+#
+# Second Field: The second field is a long name
+#
+# The above are the preferred aliases. Other aliases may be listed in additional fields.
+#
+# Loose matching should be applied to all property names and property values, with
+# the exception of String Property values. With loose matching of property names and
+# values, the case distinctions, whitespace, and '_' are ignored. For Numeric Property
+# values, numeric equivalencies are applied: thus "01.00" is equivalent to "1".
+#
+# NOTE: Property value names are NOT unique across properties. For example:
+#
+#   AL means Arabic Letter for the Bidi_Class property, and
+#   AL means Alpha_Left for the Combining_Class property, and
+#   AL means Alphabetic for the Line_Break property.
+#
+# In addition, some property names may be the same as some property value names.
+# For example:
+#
+#   sc means the Script property, and
+#   Sc means the General_Category property value Currency_Symbol (Sc)
+#
+# The combination of property value and property name is, however, unique.
+#
+# For more information, see UTS #18: Regular Expression Guidelines
+# ================================================
+
+
+# ================================================
+# Numeric Properties
+# ================================================
+nv        ; Numeric_Value
+
+# ================================================
+# String Properties
+# ================================================
+bmg       ; Bidi_Mirroring_Glyph
+cf        ; Case_Folding
+dm        ; Decomposition_Mapping
+FC_NFKC   ; FC_NFKC_Closure
+lc        ; Lowercase_Mapping
+scc       ; Special_Case_Condition
+sfc       ; Simple_Case_Folding
+slc       ; Simple_Lowercase_Mapping
+stc       ; Simple_Titlecase_Mapping
+suc       ; Simple_Uppercase_Mapping
+tc        ; Titlecase_Mapping
+uc        ; Uppercase_Mapping
+
+# ================================================
+# Miscellaneous Properties
+# ================================================
+isc       ; ISO_Comment
+na        ; Name
+na1       ; Unicode_1_Name
+URS       ; Unicode_Radical_Stroke
+
+# ================================================
+# Catalog Properties
+# ================================================
+age       ; Age
+blk       ; Block
+sc        ; Script
+
+# ================================================
+# Enumerated Properties
+# ================================================
+bc        ; Bidi_Class
+ccc       ; Canonical_Combining_Class
+dt        ; Decomposition_Type
+ea        ; East_Asian_Width
+gc        ; General_Category
+GCB       ; Grapheme_Cluster_Break
+hst       ; Hangul_Syllable_Type
+jg        ; Joining_Group
+jt        ; Joining_Type
+lb        ; Line_Break
+NFC_QC    ; NFC_Quick_Check
+NFD_QC    ; NFD_Quick_Check
+NFKC_QC   ; NFKC_Quick_Check
+NFKD_QC   ; NFKD_Quick_Check
+nt        ; Numeric_Type
+SB        ; Sentence_Break
+WB        ; Word_Break
+
+# ================================================
+# Binary Properties
+# ================================================
+AHex      ; ASCII_Hex_Digit
+Alpha     ; Alphabetic
+Bidi_C    ; Bidi_Control
+Bidi_M    ; Bidi_Mirrored
+CE        ; Composition_Exclusion
+Comp_Ex   ; Full_Composition_Exclusion
+Dash      ; Dash
+Dep       ; Deprecated
+DI        ; Default_Ignorable_Code_Point
+Dia       ; Diacritic
+Ext       ; Extender
+Gr_Base   ; Grapheme_Base
+Gr_Ext    ; Grapheme_Extend
+Gr_Link   ; Grapheme_Link
+Hex       ; Hex_Digit
+Hyphen    ; Hyphen
+IDC       ; ID_Continue
+Ideo      ; Ideographic
+IDS       ; ID_Start
+IDSB      ; IDS_Binary_Operator
+IDST      ; IDS_Trinary_Operator
+Join_C    ; Join_Control
+LOE       ; Logical_Order_Exception
+Lower     ; Lowercase
+Math      ; Math
+NChar     ; Noncharacter_Code_Point
+OAlpha    ; Other_Alphabetic
+ODI       ; Other_Default_Ignorable_Code_Point
+OGr_Ext   ; Other_Grapheme_Extend
+OIDC      ; Other_ID_Continue
+OIDS      ; Other_ID_Start
+OLower    ; Other_Lowercase
+OMath     ; Other_Math
+OUpper    ; Other_Uppercase
+Pat_Syn   ; Pattern_Syntax
+Pat_WS    ; Pattern_White_Space
+QMark     ; Quotation_Mark
+Radical   ; Radical
+SD        ; Soft_Dotted
+STerm     ; STerm
+Term      ; Terminal_Punctuation
+UIdeo     ; Unified_Ideograph
+Upper     ; Uppercase
+VS        ; Variation_Selector
+WSpace    ; White_Space                 ; space
+XIDC      ; XID_Continue
+XIDS      ; XID_Start
+XO_NFC    ; Expands_On_NFC
+XO_NFD    ; Expands_On_NFD
+XO_NFKC   ; Expands_On_NFKC
+XO_NFKD   ; Expands_On_NFKD
+
+# ================================================
+# Total:    88
+
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/ReadMe.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/ReadMe.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/ReadMe.txt	(revision 14489)
@@ -0,0 +1,24 @@
+2005 March 30
+
+Welcome to the Unicode Character Database
+
+This directory contains contributory data files
+for the Unicode Character Database of the Unicode Standard. 
+
+Copyright (c) 1991-2005 Unicode, Inc.
+For terms of use, see http://www.unicode.org/terms_of_use.html
+
+For an overview of how to access a specific version of 
+the Unicode Character Database (UCD) and other information, see:
+
+http://www.unicode.org/ucd/
+
+If you accessed this file via the URL:
+
+http://www.unicode.org/Public/UNIDATA/ReadMe.txt
+
+then you are looking at the most current version of the UCD. 
+Otherwise the version number of the UCD is part of the path name. 
+
+The file UCD.html in this directory, as well as any file 
+headers, where present, also identify the version of the UCD.
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/Scripts.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/Scripts.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/Scripts.txt	(revision 14489)
@@ -0,0 +1,1464 @@
+# Scripts-4.1.0.txt
+# Date: 2005-03-10, 01:56:19 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+
+# ================================================
+
+# Property:	Script
+
+#  All code points not explicitly listed for Script
+#  have the value Common (Zyyy).
+
+# ================================================
+
+0000..001F    ; Common # Cc  [32] <control-0000>..<control-001F>
+0020          ; Common # Zs       SPACE
+0021..0023    ; Common # Po   [3] EXCLAMATION MARK..NUMBER SIGN
+0024          ; Common # Sc       DOLLAR SIGN
+0025..0027    ; Common # Po   [3] PERCENT SIGN..APOSTROPHE
+0028          ; Common # Ps       LEFT PARENTHESIS
+0029          ; Common # Pe       RIGHT PARENTHESIS
+002A          ; Common # Po       ASTERISK
+002B          ; Common # Sm       PLUS SIGN
+002C          ; Common # Po       COMMA
+002D          ; Common # Pd       HYPHEN-MINUS
+002E..002F    ; Common # Po   [2] FULL STOP..SOLIDUS
+0030..0039    ; Common # Nd  [10] DIGIT ZERO..DIGIT NINE
+003A..003B    ; Common # Po   [2] COLON..SEMICOLON
+003C..003E    ; Common # Sm   [3] LESS-THAN SIGN..GREATER-THAN SIGN
+003F..0040    ; Common # Po   [2] QUESTION MARK..COMMERCIAL AT
+005B          ; Common # Ps       LEFT SQUARE BRACKET
+005C          ; Common # Po       REVERSE SOLIDUS
+005D          ; Common # Pe       RIGHT SQUARE BRACKET
+005E          ; Common # Sk       CIRCUMFLEX ACCENT
+005F          ; Common # Pc       LOW LINE
+0060          ; Common # Sk       GRAVE ACCENT
+007B          ; Common # Ps       LEFT CURLY BRACKET
+007C          ; Common # Sm       VERTICAL LINE
+007D          ; Common # Pe       RIGHT CURLY BRACKET
+007E          ; Common # Sm       TILDE
+007F..009F    ; Common # Cc  [33] <control-007F>..<control-009F>
+00A0          ; Common # Zs       NO-BREAK SPACE
+00A1          ; Common # Po       INVERTED EXCLAMATION MARK
+00A2..00A5    ; Common # Sc   [4] CENT SIGN..YEN SIGN
+00A6..00A7    ; Common # So   [2] BROKEN BAR..SECTION SIGN
+00A8          ; Common # Sk       DIAERESIS
+00A9          ; Common # So       COPYRIGHT SIGN
+00AB          ; Common # Pi       LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC          ; Common # Sm       NOT SIGN
+00AD          ; Common # Cf       SOFT HYPHEN
+00AE          ; Common # So       REGISTERED SIGN
+00AF          ; Common # Sk       MACRON
+00B0          ; Common # So       DEGREE SIGN
+00B1          ; Common # Sm       PLUS-MINUS SIGN
+00B2..00B3    ; Common # No   [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
+00B4          ; Common # Sk       ACUTE ACCENT
+00B5          ; Common # L&       MICRO SIGN
+00B6          ; Common # So       PILCROW SIGN
+00B7          ; Common # Po       MIDDLE DOT
+00B8          ; Common # Sk       CEDILLA
+00B9          ; Common # No       SUPERSCRIPT ONE
+00BB          ; Common # Pf       RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC..00BE    ; Common # No   [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS
+00BF          ; Common # Po       INVERTED QUESTION MARK
+00D7          ; Common # Sm       MULTIPLICATION SIGN
+00F7          ; Common # Sm       DIVISION SIGN
+02B9..02C1    ; Common # Lm   [9] MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5    ; Common # Sk   [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1    ; Common # Lm  [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2..02DF    ; Common # Sk  [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E5..02ED    ; Common # Sk   [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED
+02EE          ; Common # Lm       MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF    ; Common # Sk  [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+037E          ; Common # Po       GREEK QUESTION MARK
+0387          ; Common # Po       GREEK ANO TELEIA
+0589          ; Common # Po       ARMENIAN FULL STOP
+0600..0603    ; Common # Cf   [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA
+060C          ; Common # Po       ARABIC COMMA
+061B          ; Common # Po       ARABIC SEMICOLON
+061F          ; Common # Po       ARABIC QUESTION MARK
+0640          ; Common # Lm       ARABIC TATWEEL
+0660..0669    ; Common # Nd  [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+06DD          ; Common # Cf       ARABIC END OF AYAH
+0964..0965    ; Common # Po   [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0970          ; Common # Po       DEVANAGARI ABBREVIATION SIGN
+0E3F          ; Common # Sc       THAI CURRENCY SYMBOL BAHT
+10FB          ; Common # Po       GEORGIAN PARAGRAPH SEPARATOR
+16EB..16ED    ; Common # Po   [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
+1735..1736    ; Common # Po   [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION
+2000..200A    ; Common # Zs  [11] EN QUAD..HAIR SPACE
+200B          ; Common # Cf       ZERO WIDTH SPACE
+200E..200F    ; Common # Cf   [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+2010..2015    ; Common # Pd   [6] HYPHEN..HORIZONTAL BAR
+2016..2017    ; Common # Po   [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE
+2018          ; Common # Pi       LEFT SINGLE QUOTATION MARK
+2019          ; Common # Pf       RIGHT SINGLE QUOTATION MARK
+201A          ; Common # Ps       SINGLE LOW-9 QUOTATION MARK
+201B..201C    ; Common # Pi   [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D          ; Common # Pf       RIGHT DOUBLE QUOTATION MARK
+201E          ; Common # Ps       DOUBLE LOW-9 QUOTATION MARK
+201F          ; Common # Pi       DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020..2027    ; Common # Po   [8] DAGGER..HYPHENATION POINT
+2028          ; Common # Zl       LINE SEPARATOR
+2029          ; Common # Zp       PARAGRAPH SEPARATOR
+202A..202E    ; Common # Cf   [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+202F          ; Common # Zs       NARROW NO-BREAK SPACE
+2030..2038    ; Common # Po   [9] PER MILLE SIGN..CARET
+2039          ; Common # Pi       SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A          ; Common # Pf       SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B..203E    ; Common # Po   [4] REFERENCE MARK..OVERLINE
+203F..2040    ; Common # Pc   [2] UNDERTIE..CHARACTER TIE
+2041..2043    ; Common # Po   [3] CARET INSERTION POINT..HYPHEN BULLET
+2044          ; Common # Sm       FRACTION SLASH
+2045          ; Common # Ps       LEFT SQUARE BRACKET WITH QUILL
+2046          ; Common # Pe       RIGHT SQUARE BRACKET WITH QUILL
+2047..2051    ; Common # Po  [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
+2052          ; Common # Sm       COMMERCIAL MINUS SIGN
+2053          ; Common # Po       SWUNG DASH
+2054          ; Common # Pc       INVERTED UNDERTIE
+2055..205E    ; Common # Po  [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS
+205F          ; Common # Zs       MEDIUM MATHEMATICAL SPACE
+2060..2063    ; Common # Cf   [4] WORD JOINER..INVISIBLE SEPARATOR
+206A..206F    ; Common # Cf   [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+2070          ; Common # No       SUPERSCRIPT ZERO
+2074..2079    ; Common # No   [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE
+207A..207C    ; Common # Sm   [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN
+207D          ; Common # Ps       SUPERSCRIPT LEFT PARENTHESIS
+207E          ; Common # Pe       SUPERSCRIPT RIGHT PARENTHESIS
+2080..2089    ; Common # No  [10] SUBSCRIPT ZERO..SUBSCRIPT NINE
+208A..208C    ; Common # Sm   [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN
+208D          ; Common # Ps       SUBSCRIPT LEFT PARENTHESIS
+208E          ; Common # Pe       SUBSCRIPT RIGHT PARENTHESIS
+20A0..20B5    ; Common # Sc  [22] EURO-CURRENCY SIGN..CEDI SIGN
+2100..2101    ; Common # So   [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT
+2102          ; Common # L&       DOUBLE-STRUCK CAPITAL C
+2103..2106    ; Common # So   [4] DEGREE CELSIUS..CADA UNA
+2107          ; Common # L&       EULER CONSTANT
+2108..2109    ; Common # So   [2] SCRUPLE..DEGREE FAHRENHEIT
+210A..2113    ; Common # L&  [10] SCRIPT SMALL G..SCRIPT SMALL L
+2114          ; Common # So       L B BAR SYMBOL
+2115          ; Common # L&       DOUBLE-STRUCK CAPITAL N
+2116..2118    ; Common # So   [3] NUMERO SIGN..SCRIPT CAPITAL P
+2119..211D    ; Common # L&   [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+211E..2123    ; Common # So   [6] PRESCRIPTION TAKE..VERSICLE
+2124          ; Common # L&       DOUBLE-STRUCK CAPITAL Z
+2125          ; Common # So       OUNCE SIGN
+2127          ; Common # So       INVERTED OHM SIGN
+2128          ; Common # L&       BLACK-LETTER CAPITAL Z
+2129          ; Common # So       TURNED GREEK SMALL LETTER IOTA
+212C..212D    ; Common # L&   [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C
+212E          ; Common # So       ESTIMATED SYMBOL
+212F..2131    ; Common # L&   [3] SCRIPT SMALL E..SCRIPT CAPITAL F
+2132          ; Common # So       TURNED CAPITAL F
+2133..2134    ; Common # L&   [2] SCRIPT CAPITAL M..SCRIPT SMALL O
+2135..2138    ; Common # Lo   [4] ALEF SYMBOL..DALET SYMBOL
+2139          ; Common # L&       INFORMATION SOURCE
+213A..213B    ; Common # So   [2] ROTATED CAPITAL Q..FACSIMILE SIGN
+213C..213F    ; Common # L&   [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2140..2144    ; Common # Sm   [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y
+2145..2149    ; Common # L&   [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214A          ; Common # So       PROPERTY LINE
+214B          ; Common # Sm       TURNED AMPERSAND
+214C          ; Common # So       PER SIGN
+2153..215F    ; Common # No  [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE
+2160..2183    ; Common # Nl  [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED
+2190..2194    ; Common # Sm   [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199    ; Common # So   [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B    ; Common # Sm   [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F    ; Common # So   [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0          ; Common # Sm       RIGHTWARDS TWO HEADED ARROW
+21A1..21A2    ; Common # So   [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3          ; Common # Sm       RIGHTWARDS ARROW WITH TAIL
+21A4..21A5    ; Common # So   [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6          ; Common # Sm       RIGHTWARDS ARROW FROM BAR
+21A7..21AD    ; Common # So   [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
+21AE          ; Common # Sm       LEFT RIGHT ARROW WITH STROKE
+21AF..21CD    ; Common # So  [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF    ; Common # Sm   [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1    ; Common # So   [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2          ; Common # Sm       RIGHTWARDS DOUBLE ARROW
+21D3          ; Common # So       DOWNWARDS DOUBLE ARROW
+21D4          ; Common # Sm       LEFT RIGHT DOUBLE ARROW
+21D5..21F3    ; Common # So  [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
+21F4..22FF    ; Common # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP
+2300..2307    ; Common # So   [8] DIAMETER SIGN..WAVY LINE
+2308..230B    ; Common # Sm   [4] LEFT CEILING..RIGHT FLOOR
+230C..231F    ; Common # So  [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
+2320..2321    ; Common # Sm   [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+2322..2328    ; Common # So   [7] FROWN..KEYBOARD
+2329          ; Common # Ps       LEFT-POINTING ANGLE BRACKET
+232A          ; Common # Pe       RIGHT-POINTING ANGLE BRACKET
+232B..237B    ; Common # So  [81] ERASE TO THE LEFT..NOT CHECK MARK
+237C          ; Common # Sm       RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D..239A    ; Common # So  [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL
+239B..23B3    ; Common # Sm  [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4          ; Common # Ps       TOP SQUARE BRACKET
+23B5          ; Common # Pe       BOTTOM SQUARE BRACKET
+23B6          ; Common # Po       BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7..23DB    ; Common # So  [37] RADICAL SYMBOL BOTTOM..FUSE
+2400..2426    ; Common # So  [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
+2440..244A    ; Common # So  [11] OCR HOOK..OCR DOUBLE BACKSLASH
+2460..249B    ; Common # No  [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP
+249C..24E9    ; Common # So  [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+24EA..24FF    ; Common # No  [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO
+2500..25B6    ; Common # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE
+25B7          ; Common # Sm       WHITE RIGHT-POINTING TRIANGLE
+25B8..25C0    ; Common # So   [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1          ; Common # Sm       WHITE LEFT-POINTING TRIANGLE
+25C2..25F7    ; Common # So  [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8..25FF    ; Common # Sm   [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2600..266E    ; Common # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN
+266F          ; Common # Sm       MUSIC SHARP SIGN
+2670..269C    ; Common # So  [45] WEST SYRIAC CROSS..FLEUR-DE-LIS
+26A0..26B1    ; Common # So  [18] WARNING SIGN..FUNERAL URN
+2701..2704    ; Common # So   [4] UPPER BLADE SCISSORS..WHITE SCISSORS
+2706..2709    ; Common # So   [4] TELEPHONE LOCATION SIGN..ENVELOPE
+270C..2727    ; Common # So  [28] VICTORY HAND..WHITE FOUR POINTED STAR
+2729..274B    ; Common # So  [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D          ; Common # So       SHADOWED WHITE CIRCLE
+274F..2752    ; Common # So   [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+2756          ; Common # So       BLACK DIAMOND MINUS WHITE X
+2758..275E    ; Common # So   [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761..2767    ; Common # So   [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
+2768          ; Common # Ps       MEDIUM LEFT PARENTHESIS ORNAMENT
+2769          ; Common # Pe       MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A          ; Common # Ps       MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B          ; Common # Pe       MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C          ; Common # Ps       MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D          ; Common # Pe       MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E          ; Common # Ps       HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F          ; Common # Pe       HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770          ; Common # Ps       HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771          ; Common # Pe       HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772          ; Common # Ps       LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773          ; Common # Pe       LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774          ; Common # Ps       MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775          ; Common # Pe       MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776..2793    ; Common # No  [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794          ; Common # So       HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798..27AF    ; Common # So  [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1..27BE    ; Common # So  [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+27C0..27C4    ; Common # Sm   [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
+27C5          ; Common # Ps       LEFT S-SHAPED BAG DELIMITER
+27C6          ; Common # Pe       RIGHT S-SHAPED BAG DELIMITER
+27D0..27E5    ; Common # Sm  [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6          ; Common # Ps       MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7          ; Common # Pe       MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8          ; Common # Ps       MATHEMATICAL LEFT ANGLE BRACKET
+27E9          ; Common # Pe       MATHEMATICAL RIGHT ANGLE BRACKET
+27EA          ; Common # Ps       MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB          ; Common # Pe       MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27F0..27FF    ; Common # Sm  [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2900..2982    ; Common # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
+2983          ; Common # Ps       LEFT WHITE CURLY BRACKET
+2984          ; Common # Pe       RIGHT WHITE CURLY BRACKET
+2985          ; Common # Ps       LEFT WHITE PARENTHESIS
+2986          ; Common # Pe       RIGHT WHITE PARENTHESIS
+2987          ; Common # Ps       Z NOTATION LEFT IMAGE BRACKET
+2988          ; Common # Pe       Z NOTATION RIGHT IMAGE BRACKET
+2989          ; Common # Ps       Z NOTATION LEFT BINDING BRACKET
+298A          ; Common # Pe       Z NOTATION RIGHT BINDING BRACKET
+298B          ; Common # Ps       LEFT SQUARE BRACKET WITH UNDERBAR
+298C          ; Common # Pe       RIGHT SQUARE BRACKET WITH UNDERBAR
+298D          ; Common # Ps       LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E          ; Common # Pe       RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F          ; Common # Ps       LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990          ; Common # Pe       RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991          ; Common # Ps       LEFT ANGLE BRACKET WITH DOT
+2992          ; Common # Pe       RIGHT ANGLE BRACKET WITH DOT
+2993          ; Common # Ps       LEFT ARC LESS-THAN BRACKET
+2994          ; Common # Pe       RIGHT ARC GREATER-THAN BRACKET
+2995          ; Common # Ps       DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996          ; Common # Pe       DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997          ; Common # Ps       LEFT BLACK TORTOISE SHELL BRACKET
+2998          ; Common # Pe       RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7    ; Common # Sm  [63] DOTTED FENCE..BLACK HOURGLASS
+29D8          ; Common # Ps       LEFT WIGGLY FENCE
+29D9          ; Common # Pe       RIGHT WIGGLY FENCE
+29DA          ; Common # Ps       LEFT DOUBLE WIGGLY FENCE
+29DB          ; Common # Pe       RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB    ; Common # Sm  [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC          ; Common # Ps       LEFT-POINTING CURVED ANGLE BRACKET
+29FD          ; Common # Pe       RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..2AFF    ; Common # Sm [258] TINY..N-ARY WHITE VERTICAL BAR
+2B00..2B13    ; Common # So  [20] NORTH EAST WHITE ARROW..SQUARE WITH BOTTOM HALF BLACK
+2E00..2E01    ; Common # Po   [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02          ; Common # Pi       LEFT SUBSTITUTION BRACKET
+2E03          ; Common # Pf       RIGHT SUBSTITUTION BRACKET
+2E04          ; Common # Pi       LEFT DOTTED SUBSTITUTION BRACKET
+2E05          ; Common # Pf       RIGHT DOTTED SUBSTITUTION BRACKET
+2E06..2E08    ; Common # Po   [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER
+2E09          ; Common # Pi       LEFT TRANSPOSITION BRACKET
+2E0A          ; Common # Pf       RIGHT TRANSPOSITION BRACKET
+2E0B          ; Common # Po       RAISED SQUARE
+2E0C          ; Common # Pi       LEFT RAISED OMISSION BRACKET
+2E0D          ; Common # Pf       RIGHT RAISED OMISSION BRACKET
+2E0E..2E16    ; Common # Po   [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE
+2E17          ; Common # Pd       DOUBLE OBLIQUE HYPHEN
+2E1C          ; Common # Pi       LEFT LOW PARAPHRASE BRACKET
+2E1D          ; Common # Pf       RIGHT LOW PARAPHRASE BRACKET
+2FF0..2FFB    ; Common # So  [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000          ; Common # Zs       IDEOGRAPHIC SPACE
+3001..3003    ; Common # Po   [3] IDEOGRAPHIC COMMA..DITTO MARK
+3004          ; Common # So       JAPANESE INDUSTRIAL STANDARD SYMBOL
+3006          ; Common # Lo       IDEOGRAPHIC CLOSING MARK
+3008          ; Common # Ps       LEFT ANGLE BRACKET
+3009          ; Common # Pe       RIGHT ANGLE BRACKET
+300A          ; Common # Ps       LEFT DOUBLE ANGLE BRACKET
+300B          ; Common # Pe       RIGHT DOUBLE ANGLE BRACKET
+300C          ; Common # Ps       LEFT CORNER BRACKET
+300D          ; Common # Pe       RIGHT CORNER BRACKET
+300E          ; Common # Ps       LEFT WHITE CORNER BRACKET
+300F          ; Common # Pe       RIGHT WHITE CORNER BRACKET
+3010          ; Common # Ps       LEFT BLACK LENTICULAR BRACKET
+3011          ; Common # Pe       RIGHT BLACK LENTICULAR BRACKET
+3012..3013    ; Common # So   [2] POSTAL MARK..GETA MARK
+3014          ; Common # Ps       LEFT TORTOISE SHELL BRACKET
+3015          ; Common # Pe       RIGHT TORTOISE SHELL BRACKET
+3016          ; Common # Ps       LEFT WHITE LENTICULAR BRACKET
+3017          ; Common # Pe       RIGHT WHITE LENTICULAR BRACKET
+3018          ; Common # Ps       LEFT WHITE TORTOISE SHELL BRACKET
+3019          ; Common # Pe       RIGHT WHITE TORTOISE SHELL BRACKET
+301A          ; Common # Ps       LEFT WHITE SQUARE BRACKET
+301B          ; Common # Pe       RIGHT WHITE SQUARE BRACKET
+301C          ; Common # Pd       WAVE DASH
+301D          ; Common # Ps       REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F    ; Common # Pe   [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+3020          ; Common # So       POSTAL MARK FACE
+3030          ; Common # Pd       WAVY DASH
+3031..3035    ; Common # Lm   [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3036..3037    ; Common # So   [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+303C          ; Common # Lo       MASU MARK
+303D          ; Common # Po       PART ALTERNATION MARK
+303E..303F    ; Common # So   [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE
+309B..309C    ; Common # Sk   [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30A0          ; Common # Pd       KATAKANA-HIRAGANA DOUBLE HYPHEN
+30FB          ; Common # Po       KATAKANA MIDDLE DOT
+30FC          ; Common # Lm       KATAKANA-HIRAGANA PROLONGED SOUND MARK
+3190..3191    ; Common # So   [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192..3195    ; Common # No   [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK
+3196..319F    ; Common # So  [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK
+31C0..31CF    ; Common # So  [16] CJK STROKE T..CJK STROKE N
+3220..3229    ; Common # No  [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN
+322A..3243    ; Common # So  [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH
+3250          ; Common # So       PARTNERSHIP SIGN
+3251..325F    ; Common # No  [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE
+327E..327F    ; Common # So   [2] CIRCLED HANGUL IEUNG U..KOREAN STANDARD SYMBOL
+3280..3289    ; Common # No  [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN
+328A..32B0    ; Common # So  [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT
+32B1..32BF    ; Common # No  [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY
+32C0..32FE    ; Common # So  [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO
+3300..33FF    ; Common # So [256] SQUARE APAATO..SQUARE GAL
+4DC0..4DFF    ; Common # So  [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
+A700..A716    ; Common # Sk  [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+E000..F8FF    ; Common # Co [6400] <private-use-E000>..<private-use-F8FF>
+FD3E          ; Common # Ps       ORNATE LEFT PARENTHESIS
+FD3F          ; Common # Pe       ORNATE RIGHT PARENTHESIS
+FDFD          ; Common # So       ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE10..FE16    ; Common # Po   [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19          ; Common # Po       PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE30          ; Common # Po       PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31..FE32    ; Common # Pd   [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE33..FE34    ; Common # Pc   [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45..FE46    ; Common # Po   [2] SESAME DOT..WHITE SESAME DOT
+FE47          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49..FE4C    ; Common # Po   [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE
+FE4D..FE4F    ; Common # Pc   [3] DASHED LOW LINE..WAVY LOW LINE
+FE50..FE52    ; Common # Po   [3] SMALL COMMA..SMALL FULL STOP
+FE54..FE57    ; Common # Po   [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
+FE58          ; Common # Pd       SMALL EM DASH
+FE59          ; Common # Ps       SMALL LEFT PARENTHESIS
+FE5A          ; Common # Pe       SMALL RIGHT PARENTHESIS
+FE5B          ; Common # Ps       SMALL LEFT CURLY BRACKET
+FE5C          ; Common # Pe       SMALL RIGHT CURLY BRACKET
+FE5D          ; Common # Ps       SMALL LEFT TORTOISE SHELL BRACKET
+FE5E          ; Common # Pe       SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F..FE61    ; Common # Po   [3] SMALL NUMBER SIGN..SMALL ASTERISK
+FE62          ; Common # Sm       SMALL PLUS SIGN
+FE63          ; Common # Pd       SMALL HYPHEN-MINUS
+FE64..FE66    ; Common # Sm   [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN
+FE68          ; Common # Po       SMALL REVERSE SOLIDUS
+FE69          ; Common # Sc       SMALL DOLLAR SIGN
+FE6A..FE6B    ; Common # Po   [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT
+FEFF          ; Common # Cf       ZERO WIDTH NO-BREAK SPACE
+FF01..FF03    ; Common # Po   [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN
+FF04          ; Common # Sc       FULLWIDTH DOLLAR SIGN
+FF05..FF07    ; Common # Po   [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE
+FF08          ; Common # Ps       FULLWIDTH LEFT PARENTHESIS
+FF09          ; Common # Pe       FULLWIDTH RIGHT PARENTHESIS
+FF0A          ; Common # Po       FULLWIDTH ASTERISK
+FF0B          ; Common # Sm       FULLWIDTH PLUS SIGN
+FF0C          ; Common # Po       FULLWIDTH COMMA
+FF0D          ; Common # Pd       FULLWIDTH HYPHEN-MINUS
+FF0E..FF0F    ; Common # Po   [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS
+FF10..FF19    ; Common # Nd  [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF1A..FF1B    ; Common # Po   [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON
+FF1C..FF1E    ; Common # Sm   [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN
+FF1F..FF20    ; Common # Po   [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT
+FF3B          ; Common # Ps       FULLWIDTH LEFT SQUARE BRACKET
+FF3C          ; Common # Po       FULLWIDTH REVERSE SOLIDUS
+FF3D          ; Common # Pe       FULLWIDTH RIGHT SQUARE BRACKET
+FF3E          ; Common # Sk       FULLWIDTH CIRCUMFLEX ACCENT
+FF3F          ; Common # Pc       FULLWIDTH LOW LINE
+FF40          ; Common # Sk       FULLWIDTH GRAVE ACCENT
+FF5B          ; Common # Ps       FULLWIDTH LEFT CURLY BRACKET
+FF5C          ; Common # Sm       FULLWIDTH VERTICAL LINE
+FF5D          ; Common # Pe       FULLWIDTH RIGHT CURLY BRACKET
+FF5E          ; Common # Sm       FULLWIDTH TILDE
+FF5F          ; Common # Ps       FULLWIDTH LEFT WHITE PARENTHESIS
+FF60          ; Common # Pe       FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61          ; Common # Po       HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62          ; Common # Ps       HALFWIDTH LEFT CORNER BRACKET
+FF63          ; Common # Pe       HALFWIDTH RIGHT CORNER BRACKET
+FF64..FF65    ; Common # Po   [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT
+FF70          ; Common # Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF9E..FF9F    ; Common # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFE0..FFE1    ; Common # Sc   [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN
+FFE2          ; Common # Sm       FULLWIDTH NOT SIGN
+FFE3          ; Common # Sk       FULLWIDTH MACRON
+FFE4          ; Common # So       FULLWIDTH BROKEN BAR
+FFE5..FFE6    ; Common # Sc   [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
+FFE8          ; Common # So       HALFWIDTH FORMS LIGHT VERTICAL
+FFE9..FFEC    ; Common # Sm   [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW
+FFED..FFEE    ; Common # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
+FFF9..FFFB    ; Common # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+FFFC..FFFD    ; Common # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
+10100..10101  ; Common # Po   [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT
+10102         ; Common # So       AEGEAN CHECK MARK
+10107..10133  ; Common # No  [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND
+10137..1013F  ; Common # So   [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT
+1D000..1D0F5  ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100..1D126  ; Common # So  [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2
+1D12A..1D164  ; Common # So  [59] MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165..1D166  ; Common # Mc   [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D16A..1D16C  ; Common # So   [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D..1D172  ; Common # Mc   [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D173..1D17A  ; Common # Cf   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+1D183..1D184  ; Common # So   [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
+1D18C..1D1A9  ; Common # So  [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
+1D1AE..1D1DD  ; Common # So  [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS
+1D300..1D356  ; Common # So  [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
+1D400..1D454  ; Common # L&  [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C  ; Common # L&  [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F  ; Common # L&   [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2         ; Common # L&       MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6  ; Common # L&   [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC  ; Common # L&   [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9  ; Common # L&  [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB         ; Common # L&       MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3  ; Common # L&   [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505  ; Common # L&  [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A  ; Common # L&   [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514  ; Common # L&   [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C  ; Common # L&   [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539  ; Common # L&  [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E  ; Common # L&   [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544  ; Common # L&   [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546         ; Common # L&       MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550  ; Common # L&   [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5  ; Common # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0  ; Common # L&  [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1         ; Common # Sm       MATHEMATICAL BOLD NABLA
+1D6C2..1D6DA  ; Common # L&  [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DB         ; Common # Sm       MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC..1D6FA  ; Common # L&  [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB         ; Common # Sm       MATHEMATICAL ITALIC NABLA
+1D6FC..1D714  ; Common # L&  [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D715         ; Common # Sm       MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716..1D734  ; Common # L&  [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735         ; Common # Sm       MATHEMATICAL BOLD ITALIC NABLA
+1D736..1D74E  ; Common # L&  [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F         ; Common # Sm       MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750..1D76E  ; Common # L&  [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F         ; Common # Sm       MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770..1D788  ; Common # L&  [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789         ; Common # Sm       MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A..1D7A8  ; Common # L&  [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9         ; Common # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA..1D7C2  ; Common # L&  [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3         ; Common # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4..1D7C9  ; Common # L&   [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+1D7CE..1D7FF  ; Common # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+E0001         ; Common # Cf       LANGUAGE TAG
+E0020..E007F  ; Common # Cf  [96] TAG SPACE..CANCEL TAG
+F0000..FFFFD  ; Common # Co [65534] <private-use-F0000>..<private-use-FFFFD>
+100000..10FFFD; Common # Co [65534] <private-use-100000>..<private-use-10FFFD>
+
+# The above property value applies to 878924 code points not listed here.
+# Total code points: 1021355
+
+# ================================================
+
+0041..005A    ; Latin # L&  [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+0061..007A    ; Latin # L&  [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA          ; Latin # L&       FEMININE ORDINAL INDICATOR
+00BA          ; Latin # L&       MASCULINE ORDINAL INDICATOR
+00C0..00D6    ; Latin # L&  [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6    ; Latin # L&  [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA    ; Latin # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB          ; Latin # Lo       LATIN LETTER TWO WITH STROKE
+01BC..01BF    ; Latin # L&   [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3    ; Latin # Lo   [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0241    ; Latin # L& [126] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER GLOTTAL STOP
+0250..02AF    ; Latin # L&  [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02B8    ; Latin # Lm   [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02E0..02E4    ; Latin # Lm   [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+1D00..1D25    ; Latin # L&  [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN
+1D2C..1D5C    ; Latin # Lm  [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN
+1D62..1D65    ; Latin # L&   [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V
+1D6B..1D77    ; Latin # L&  [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G
+1D79..1D9A    ; Latin # L&  [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBF    ; Latin # Lm  [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA
+1E00..1E9B    ; Latin # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0..1EF9    ; Latin # L&  [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE
+2071          ; Latin # L&       SUPERSCRIPT LATIN SMALL LETTER I
+207F          ; Latin # L&       SUPERSCRIPT LATIN SMALL LETTER N
+2090..2094    ; Latin # Lm   [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+212A..212B    ; Latin # L&   [2] KELVIN SIGN..ANGSTROM SIGN
+FB00..FB06    ; Latin # L&   [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FF21..FF3A    ; Latin # L&  [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF41..FF5A    ; Latin # L&  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+
+# Total code points: 1037
+
+# ================================================
+
+0374..0375    ; Greek # Sk   [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN
+037A          ; Greek # Lm       GREEK YPOGEGRAMMENI
+0384..0385    ; Greek # Sk   [2] GREEK TONOS..GREEK DIALYTIKA TONOS
+0386          ; Greek # L&       GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A    ; Greek # L&   [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C          ; Greek # L&       GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1    ; Greek # L&  [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03CE    ; Greek # L&  [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS
+03D0..03E1    ; Greek # L&  [18] GREEK BETA SYMBOL..GREEK SMALL LETTER SAMPI
+03F0..03F5    ; Greek # L&   [6] GREEK KAPPA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+03F6          ; Greek # Sm       GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7..03FF    ; Greek # L&   [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+1D26..1D2A    ; Greek # L&   [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI
+1D5D..1D61    ; Greek # Lm   [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI
+1D66..1D6A    ; Greek # L&   [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI
+1F00..1F15    ; Greek # L&  [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D    ; Greek # L&   [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45    ; Greek # L&  [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D    ; Greek # L&   [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57    ; Greek # L&   [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59          ; Greek # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B          ; Greek # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D          ; Greek # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D    ; Greek # L&  [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4    ; Greek # L&  [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC    ; Greek # L&   [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD          ; Greek # Sk       GREEK KORONIS
+1FBE          ; Greek # L&       GREEK PROSGEGRAMMENI
+1FBF..1FC1    ; Greek # Sk   [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FC2..1FC4    ; Greek # L&   [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC    ; Greek # L&   [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD..1FCF    ; Greek # Sk   [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FD0..1FD3    ; Greek # L&   [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB    ; Greek # L&   [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD..1FDF    ; Greek # Sk   [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FE0..1FEC    ; Greek # L&  [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FED..1FEF    ; Greek # Sk   [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FF2..1FF4    ; Greek # L&   [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC    ; Greek # L&   [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD..1FFE    ; Greek # Sk   [2] GREEK OXIA..GREEK DASIA
+2126          ; Greek # L&       OHM SIGN
+10140..10174  ; Greek # Nl  [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175..10178  ; Greek # No   [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN
+10179..10189  ; Greek # So  [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN
+1018A         ; Greek # No       GREEK ZERO SIGN
+1D200..1D241  ; Greek # So  [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242..1D244  ; Greek # Mn   [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+1D245         ; Greek # So       GREEK MUSICAL LEIMMA
+
+# Total code points: 502
+
+# ================================================
+
+0400..0481    ; Cyrillic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA
+0482          ; Cyrillic # So       CYRILLIC THOUSANDS SIGN
+0483..0486    ; Cyrillic # Mn   [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA
+0488..0489    ; Cyrillic # Me   [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+048A..04CE    ; Cyrillic # L&  [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL
+04D0..04F9    ; Cyrillic # L&  [42] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+0500..050F    ; Cyrillic # L&  [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE
+1D2B          ; Cyrillic # L&       CYRILLIC LETTER SMALL CAPITAL EL
+1D78          ; Cyrillic # Lm       MODIFIER LETTER CYRILLIC EN
+
+# Total code points: 266
+
+# ================================================
+
+0531..0556    ; Armenian # L&  [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559          ; Armenian # Lm       ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A..055F    ; Armenian # Po   [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
+0561..0587    ; Armenian # L&  [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+058A          ; Armenian # Pd       ARMENIAN HYPHEN
+FB13..FB17    ; Armenian # L&   [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+
+# Total code points: 90
+
+# ================================================
+
+0591..05B9    ; Hebrew # Mn  [41] HEBREW ACCENT ETNAHTA..HEBREW POINT HOLAM
+05BB..05BD    ; Hebrew # Mn   [3] HEBREW POINT QUBUTS..HEBREW POINT METEG
+05BE          ; Hebrew # Po       HEBREW PUNCTUATION MAQAF
+05BF          ; Hebrew # Mn       HEBREW POINT RAFE
+05C0          ; Hebrew # Po       HEBREW PUNCTUATION PASEQ
+05C1..05C2    ; Hebrew # Mn   [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C3          ; Hebrew # Po       HEBREW PUNCTUATION SOF PASUQ
+05C4..05C5    ; Hebrew # Mn   [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C6          ; Hebrew # Po       HEBREW PUNCTUATION NUN HAFUKHA
+05C7          ; Hebrew # Mn       HEBREW POINT QAMATS QATAN
+05D0..05EA    ; Hebrew # Lo  [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2    ; Hebrew # Lo   [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3..05F4    ; Hebrew # Po   [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
+FB1D          ; Hebrew # Lo       HEBREW LETTER YOD WITH HIRIQ
+FB1E          ; Hebrew # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F..FB28    ; Hebrew # Lo  [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB29          ; Hebrew # Sm       HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A..FB36    ; Hebrew # Lo  [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C    ; Hebrew # Lo   [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E          ; Hebrew # Lo       HEBREW LETTER MEM WITH DAGESH
+FB40..FB41    ; Hebrew # Lo   [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44    ; Hebrew # Lo   [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FB4F    ; Hebrew # Lo  [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED
+
+# Total code points: 132
+
+# ================================================
+
+060B          ; Arabic # Sc       AFGHANI SIGN
+060D          ; Arabic # Po       ARABIC DATE SEPARATOR
+060E..060F    ; Arabic # So   [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA
+0610..0615    ; Arabic # Mn   [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH
+061E          ; Arabic # Po       ARABIC TRIPLE DOT PUNCTUATION MARK
+0621..063A    ; Arabic # Lo  [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN
+0641..064A    ; Arabic # Lo  [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+0656..065E    ; Arabic # Mn   [9] ARABIC SUBSCRIPT ALEF..ARABIC FATHA WITH TWO DOTS
+066A..066D    ; Arabic # Po   [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR
+066E..066F    ; Arabic # Lo   [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0671..06D3    ; Arabic # Lo  [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4          ; Arabic # Po       ARABIC FULL STOP
+06D5          ; Arabic # Lo       ARABIC LETTER AE
+06D6..06DC    ; Arabic # Mn   [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DE          ; Arabic # Me       ARABIC START OF RUB EL HIZB
+06DF..06E4    ; Arabic # Mn   [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E5..06E6    ; Arabic # Lm   [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06E7..06E8    ; Arabic # Mn   [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06E9          ; Arabic # So       ARABIC PLACE OF SAJDAH
+06EA..06ED    ; Arabic # Mn   [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+06EE..06EF    ; Arabic # Lo   [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06F0..06F9    ; Arabic # Nd  [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+06FA..06FC    ; Arabic # Lo   [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FD..06FE    ; Arabic # So   [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF          ; Arabic # Lo       ARABIC LETTER HEH WITH INVERTED V
+0750..076D    ; Arabic # Lo  [30] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+FB50..FBB1    ; Arabic # Lo  [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3..FD3D    ; Arabic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD50..FD8F    ; Arabic # Lo  [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7    ; Arabic # Lo  [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDFB    ; Arabic # Lo  [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FDFC          ; Arabic # Sc       RIAL SIGN
+FE70..FE74    ; Arabic # Lo   [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
+FE76..FEFC    ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+
+# Total code points: 966
+
+# ================================================
+
+0700..070D    ; Syriac # Po  [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
+070F          ; Syriac # Cf       SYRIAC ABBREVIATION MARK
+0710          ; Syriac # Lo       SYRIAC LETTER ALAPH
+0711          ; Syriac # Mn       SYRIAC LETTER SUPERSCRIPT ALAPH
+0712..072F    ; Syriac # Lo  [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+0730..074A    ; Syriac # Mn  [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+074D..074F    ; Syriac # Lo   [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE
+
+# Total code points: 77
+
+# ================================================
+
+0780..07A5    ; Thaana # Lo  [38] THAANA LETTER HAA..THAANA LETTER WAAVU
+07A6..07B0    ; Thaana # Mn  [11] THAANA ABAFILI..THAANA SUKUN
+07B1          ; Thaana # Lo       THAANA LETTER NAA
+
+# Total code points: 50
+
+# ================================================
+
+0901..0902    ; Devanagari # Mn   [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903          ; Devanagari # Mc       DEVANAGARI SIGN VISARGA
+0904..0939    ; Devanagari # Lo  [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093C          ; Devanagari # Mn       DEVANAGARI SIGN NUKTA
+093D          ; Devanagari # Lo       DEVANAGARI SIGN AVAGRAHA
+093E..0940    ; Devanagari # Mc   [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948    ; Devanagari # Mn   [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C    ; Devanagari # Mc   [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094D          ; Devanagari # Mn       DEVANAGARI SIGN VIRAMA
+0950          ; Devanagari # Lo       DEVANAGARI OM
+0951..0954    ; Devanagari # Mn   [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT
+0958..0961    ; Devanagari # Lo  [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0962..0963    ; Devanagari # Mn   [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0966..096F    ; Devanagari # Nd  [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+097D          ; Devanagari # Lo       DEVANAGARI LETTER GLOTTAL STOP
+
+# Total code points: 103
+
+# ================================================
+
+0981          ; Bengali # Mn       BENGALI SIGN CANDRABINDU
+0982..0983    ; Bengali # Mc   [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+0985..098C    ; Bengali # Lo   [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990    ; Bengali # Lo   [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8    ; Bengali # Lo  [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0    ; Bengali # Lo   [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2          ; Bengali # Lo       BENGALI LETTER LA
+09B6..09B9    ; Bengali # Lo   [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BC          ; Bengali # Mn       BENGALI SIGN NUKTA
+09BD          ; Bengali # Lo       BENGALI SIGN AVAGRAHA
+09BE..09C0    ; Bengali # Mc   [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4    ; Bengali # Mn   [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8    ; Bengali # Mc   [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC    ; Bengali # Mc   [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09CD          ; Bengali # Mn       BENGALI SIGN VIRAMA
+09CE          ; Bengali # Lo       BENGALI LETTER KHANDA TA
+09D7          ; Bengali # Mc       BENGALI AU LENGTH MARK
+09DC..09DD    ; Bengali # Lo   [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1    ; Bengali # Lo   [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09E2..09E3    ; Bengali # Mn   [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09E6..09EF    ; Bengali # Nd  [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
+09F0..09F1    ; Bengali # Lo   [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2..09F3    ; Bengali # Sc   [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN
+09F4..09F9    ; Bengali # No   [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA          ; Bengali # So       BENGALI ISSHAR
+
+# Total code points: 91
+
+# ================================================
+
+0A01..0A02    ; Gurmukhi # Mn   [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03          ; Gurmukhi # Mc       GURMUKHI SIGN VISARGA
+0A05..0A0A    ; Gurmukhi # Lo   [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10    ; Gurmukhi # Lo   [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28    ; Gurmukhi # Lo  [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30    ; Gurmukhi # Lo   [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33    ; Gurmukhi # Lo   [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36    ; Gurmukhi # Lo   [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39    ; Gurmukhi # Lo   [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3C          ; Gurmukhi # Mn       GURMUKHI SIGN NUKTA
+0A3E..0A40    ; Gurmukhi # Mc   [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42    ; Gurmukhi # Mn   [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48    ; Gurmukhi # Mn   [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D    ; Gurmukhi # Mn   [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A59..0A5C    ; Gurmukhi # Lo   [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E          ; Gurmukhi # Lo       GURMUKHI LETTER FA
+0A66..0A6F    ; Gurmukhi # Nd  [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE
+0A70..0A71    ; Gurmukhi # Mn   [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A72..0A74    ; Gurmukhi # Lo   [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+
+# Total code points: 77
+
+# ================================================
+
+0A81..0A82    ; Gujarati # Mn   [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83          ; Gujarati # Mc       GUJARATI SIGN VISARGA
+0A85..0A8D    ; Gujarati # Lo   [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91    ; Gujarati # Lo   [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8    ; Gujarati # Lo  [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0    ; Gujarati # Lo   [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3    ; Gujarati # Lo   [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9    ; Gujarati # Lo   [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABC          ; Gujarati # Mn       GUJARATI SIGN NUKTA
+0ABD          ; Gujarati # Lo       GUJARATI SIGN AVAGRAHA
+0ABE..0AC0    ; Gujarati # Mc   [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5    ; Gujarati # Mn   [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8    ; Gujarati # Mn   [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9          ; Gujarati # Mc       GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC    ; Gujarati # Mc   [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0ACD          ; Gujarati # Mn       GUJARATI SIGN VIRAMA
+0AD0          ; Gujarati # Lo       GUJARATI OM
+0AE0..0AE1    ; Gujarati # Lo   [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE2..0AE3    ; Gujarati # Mn   [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0AE6..0AEF    ; Gujarati # Nd  [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+0AF1          ; Gujarati # Sc       GUJARATI RUPEE SIGN
+
+# Total code points: 83
+
+# ================================================
+
+0B01          ; Oriya # Mn       ORIYA SIGN CANDRABINDU
+0B02..0B03    ; Oriya # Mc   [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B05..0B0C    ; Oriya # Lo   [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10    ; Oriya # Lo   [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28    ; Oriya # Lo  [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30    ; Oriya # Lo   [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33    ; Oriya # Lo   [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39    ; Oriya # Lo   [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3C          ; Oriya # Mn       ORIYA SIGN NUKTA
+0B3D          ; Oriya # Lo       ORIYA SIGN AVAGRAHA
+0B3E          ; Oriya # Mc       ORIYA VOWEL SIGN AA
+0B3F          ; Oriya # Mn       ORIYA VOWEL SIGN I
+0B40          ; Oriya # Mc       ORIYA VOWEL SIGN II
+0B41..0B43    ; Oriya # Mn   [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R
+0B47..0B48    ; Oriya # Mc   [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C    ; Oriya # Mc   [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B4D          ; Oriya # Mn       ORIYA SIGN VIRAMA
+0B56          ; Oriya # Mn       ORIYA AI LENGTH MARK
+0B57          ; Oriya # Mc       ORIYA AU LENGTH MARK
+0B5C..0B5D    ; Oriya # Lo   [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61    ; Oriya # Lo   [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B66..0B6F    ; Oriya # Nd  [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B70          ; Oriya # So       ORIYA ISSHAR
+0B71          ; Oriya # Lo       ORIYA LETTER WA
+
+# Total code points: 81
+
+# ================================================
+
+0B82          ; Tamil # Mn       TAMIL SIGN ANUSVARA
+0B83          ; Tamil # Lo       TAMIL SIGN VISARGA
+0B85..0B8A    ; Tamil # Lo   [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90    ; Tamil # Lo   [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95    ; Tamil # Lo   [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A    ; Tamil # Lo   [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C          ; Tamil # Lo       TAMIL LETTER JA
+0B9E..0B9F    ; Tamil # Lo   [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4    ; Tamil # Lo   [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA    ; Tamil # Lo   [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9    ; Tamil # Lo  [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BBE..0BBF    ; Tamil # Mc   [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0          ; Tamil # Mn       TAMIL VOWEL SIGN II
+0BC1..0BC2    ; Tamil # Mc   [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8    ; Tamil # Mc   [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC    ; Tamil # Mc   [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BCD          ; Tamil # Mn       TAMIL SIGN VIRAMA
+0BD7          ; Tamil # Mc       TAMIL AU LENGTH MARK
+0BE6..0BEF    ; Tamil # Nd  [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE
+0BF0..0BF2    ; Tamil # No   [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND
+0BF3..0BF8    ; Tamil # So   [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN
+0BF9          ; Tamil # Sc       TAMIL RUPEE SIGN
+0BFA          ; Tamil # So       TAMIL NUMBER SIGN
+
+# Total code points: 71
+
+# ================================================
+
+0C01..0C03    ; Telugu # Mc   [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C05..0C0C    ; Telugu # Lo   [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10    ; Telugu # Lo   [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28    ; Telugu # Lo  [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33    ; Telugu # Lo  [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39    ; Telugu # Lo   [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C3E..0C40    ; Telugu # Mn   [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44    ; Telugu # Mc   [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48    ; Telugu # Mn   [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D    ; Telugu # Mn   [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56    ; Telugu # Mn   [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C60..0C61    ; Telugu # Lo   [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C66..0C6F    ; Telugu # Nd  [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+
+# Total code points: 80
+
+# ================================================
+
+0C82..0C83    ; Kannada # Mc   [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C85..0C8C    ; Kannada # Lo   [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90    ; Kannada # Lo   [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8    ; Kannada # Lo  [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3    ; Kannada # Lo  [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9    ; Kannada # Lo   [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBC          ; Kannada # Mn       KANNADA SIGN NUKTA
+0CBD          ; Kannada # Lo       KANNADA SIGN AVAGRAHA
+0CBE          ; Kannada # Mc       KANNADA VOWEL SIGN AA
+0CBF          ; Kannada # Mn       KANNADA VOWEL SIGN I
+0CC0..0CC4    ; Kannada # Mc   [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6          ; Kannada # Mn       KANNADA VOWEL SIGN E
+0CC7..0CC8    ; Kannada # Mc   [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB    ; Kannada # Mc   [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC..0CCD    ; Kannada # Mn   [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CD5..0CD6    ; Kannada # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CDE          ; Kannada # Lo       KANNADA LETTER FA
+0CE0..0CE1    ; Kannada # Lo   [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0CE6..0CEF    ; Kannada # Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+
+# Total code points: 82
+
+# ================================================
+
+0D02..0D03    ; Malayalam # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D05..0D0C    ; Malayalam # Lo   [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10    ; Malayalam # Lo   [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28    ; Malayalam # Lo  [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39    ; Malayalam # Lo  [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3E..0D40    ; Malayalam # Mc   [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D43    ; Malayalam # Mn   [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R
+0D46..0D48    ; Malayalam # Mc   [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C    ; Malayalam # Mc   [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D4D          ; Malayalam # Mn       MALAYALAM SIGN VIRAMA
+0D57          ; Malayalam # Mc       MALAYALAM AU LENGTH MARK
+0D60..0D61    ; Malayalam # Lo   [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D66..0D6F    ; Malayalam # Nd  [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+
+# Total code points: 78
+
+# ================================================
+
+0D82..0D83    ; Sinhala # Mc   [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D85..0D96    ; Sinhala # Lo  [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1    ; Sinhala # Lo  [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB    ; Sinhala # Lo   [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD          ; Sinhala # Lo       SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6    ; Sinhala # Lo   [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DCA          ; Sinhala # Mn       SINHALA SIGN AL-LAKUNA
+0DCF..0DD1    ; Sinhala # Mc   [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4    ; Sinhala # Mn   [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6          ; Sinhala # Mn       SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF    ; Sinhala # Mc   [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3    ; Sinhala # Mc   [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4          ; Sinhala # Po       SINHALA PUNCTUATION KUNDDALIYA
+
+# Total code points: 80
+
+# ================================================
+
+0E01..0E30    ; Thai # Lo  [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E31          ; Thai # Mn       THAI CHARACTER MAI HAN-AKAT
+0E32..0E33    ; Thai # Lo   [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E34..0E3A    ; Thai # Mn   [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E40..0E45    ; Thai # Lo   [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46          ; Thai # Lm       THAI CHARACTER MAIYAMOK
+0E47..0E4E    ; Thai # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0E4F          ; Thai # Po       THAI CHARACTER FONGMAN
+0E50..0E59    ; Thai # Nd  [10] THAI DIGIT ZERO..THAI DIGIT NINE
+0E5A..0E5B    ; Thai # Po   [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+
+# Total code points: 86
+
+# ================================================
+
+0E81..0E82    ; Lao # Lo   [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84          ; Lao # Lo       LAO LETTER KHO TAM
+0E87..0E88    ; Lao # Lo   [2] LAO LETTER NGO..LAO LETTER CO
+0E8A          ; Lao # Lo       LAO LETTER SO TAM
+0E8D          ; Lao # Lo       LAO LETTER NYO
+0E94..0E97    ; Lao # Lo   [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F    ; Lao # Lo   [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3    ; Lao # Lo   [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5          ; Lao # Lo       LAO LETTER LO LOOT
+0EA7          ; Lao # Lo       LAO LETTER WO
+0EAA..0EAB    ; Lao # Lo   [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0    ; Lao # Lo   [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB1          ; Lao # Mn       LAO VOWEL SIGN MAI KAN
+0EB2..0EB3    ; Lao # Lo   [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EB4..0EB9    ; Lao # Mn   [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC    ; Lao # Mn   [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EBD          ; Lao # Lo       LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4    ; Lao # Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6          ; Lao # Lm       LAO KO LA
+0EC8..0ECD    ; Lao # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0ED0..0ED9    ; Lao # Nd  [10] LAO DIGIT ZERO..LAO DIGIT NINE
+0EDC..0EDD    ; Lao # Lo   [2] LAO HO NO..LAO HO MO
+
+# Total code points: 65
+
+# ================================================
+
+0F00          ; Tibetan # Lo       TIBETAN SYLLABLE OM
+0F01..0F03    ; Tibetan # So   [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04..0F12    ; Tibetan # Po  [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD
+0F13..0F17    ; Tibetan # So   [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18..0F19    ; Tibetan # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A..0F1F    ; Tibetan # So   [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20..0F29    ; Tibetan # Nd  [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+0F2A..0F33    ; Tibetan # No  [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO
+0F34          ; Tibetan # So       TIBETAN MARK BSDUS RTAGS
+0F35          ; Tibetan # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36          ; Tibetan # So       TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37          ; Tibetan # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38          ; Tibetan # So       TIBETAN MARK CHE MGO
+0F39          ; Tibetan # Mn       TIBETAN MARK TSA -PHRU
+0F3A          ; Tibetan # Ps       TIBETAN MARK GUG RTAGS GYON
+0F3B          ; Tibetan # Pe       TIBETAN MARK GUG RTAGS GYAS
+0F3C          ; Tibetan # Ps       TIBETAN MARK ANG KHANG GYON
+0F3D          ; Tibetan # Pe       TIBETAN MARK ANG KHANG GYAS
+0F3E..0F3F    ; Tibetan # Mc   [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F40..0F47    ; Tibetan # Lo   [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6A    ; Tibetan # Lo  [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA
+0F71..0F7E    ; Tibetan # Mn  [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F          ; Tibetan # Mc       TIBETAN SIGN RNAM BCAD
+0F80..0F84    ; Tibetan # Mn   [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F85          ; Tibetan # Po       TIBETAN MARK PALUTA
+0F86..0F87    ; Tibetan # Mn   [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F88..0F8B    ; Tibetan # Lo   [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+0F90..0F97    ; Tibetan # Mn   [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC    ; Tibetan # Mn  [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE..0FC5    ; Tibetan # So   [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE
+0FC6          ; Tibetan # Mn       TIBETAN SYMBOL PADMA GDAN
+0FC7..0FCC    ; Tibetan # So   [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCF          ; Tibetan # So       TIBETAN SIGN RDEL NAG GSUM
+0FD0..0FD1    ; Tibetan # Po   [2] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK MNYAM YIG GI MGO RGYAN
+
+# Total code points: 195
+
+# ================================================
+
+1000..1021    ; Myanmar # Lo  [34] MYANMAR LETTER KA..MYANMAR LETTER A
+1023..1027    ; Myanmar # Lo   [5] MYANMAR LETTER I..MYANMAR LETTER E
+1029..102A    ; Myanmar # Lo   [2] MYANMAR LETTER O..MYANMAR LETTER AU
+102C          ; Myanmar # Mc       MYANMAR VOWEL SIGN AA
+102D..1030    ; Myanmar # Mn   [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031          ; Myanmar # Mc       MYANMAR VOWEL SIGN E
+1032          ; Myanmar # Mn       MYANMAR VOWEL SIGN AI
+1036..1037    ; Myanmar # Mn   [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW
+1038          ; Myanmar # Mc       MYANMAR SIGN VISARGA
+1039          ; Myanmar # Mn       MYANMAR SIGN VIRAMA
+1040..1049    ; Myanmar # Nd  [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
+104A..104F    ; Myanmar # Po   [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE
+1050..1055    ; Myanmar # Lo   [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+1056..1057    ; Myanmar # Mc   [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059    ; Myanmar # Mn   [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+
+# Total code points: 78
+
+# ================================================
+
+10A0..10C5    ; Georgian # L&  [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10FA    ; Georgian # Lo  [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC          ; Georgian # Lm       MODIFIER LETTER GEORGIAN NAR
+2D00..2D25    ; Georgian # L&  [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+
+# Total code points: 120
+
+# ================================================
+
+1100..1159    ; Hangul # Lo  [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH
+115F..11A2    ; Hangul # Lo  [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA
+11A8..11F9    ; Hangul # Lo  [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH
+3131..318E    ; Hangul # Lo  [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+3200..321E    ; Hangul # So  [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU
+3260..327D    ; Hangul # So  [30] CIRCLED HANGUL KIYEOK..CIRCLED KOREAN CHARACTER JUEUI
+AC00..D7A3    ; Hangul # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+FFA0..FFBE    ; Hangul # Lo  [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7    ; Hangul # Lo   [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF    ; Hangul # Lo   [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7    ; Hangul # Lo   [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC    ; Hangul # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+
+# Total code points: 11619
+
+# ================================================
+
+1200..1248    ; Ethiopic # Lo  [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA
+124A..124D    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258          ; Ethiopic # Lo       ETHIOPIC SYLLABLE QHWA
+125A..125D    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288    ; Ethiopic # Lo  [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0    ; Ethiopic # Lo  [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0          ; Ethiopic # Lo       ETHIOPIC SYLLABLE KXWA
+12C2..12C5    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6    ; Ethiopic # Lo  [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310    ; Ethiopic # Lo  [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A    ; Ethiopic # Lo  [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+135F          ; Ethiopic # Mn       ETHIOPIC COMBINING GEMINATION MARK
+1360          ; Ethiopic # So       ETHIOPIC SECTION MARK
+1361..1368    ; Ethiopic # Po   [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR
+1369..137C    ; Ethiopic # No  [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND
+1380..138F    ; Ethiopic # Lo  [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+1390..1399    ; Ethiopic # So  [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT
+2D80..2D96    ; Ethiopic # Lo  [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+
+# Total code points: 461
+
+# ================================================
+
+13A0..13F4    ; Cherokee # Lo  [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+
+# Total code points: 85
+
+# ================================================
+
+1401..166C    ; Canadian_Aboriginal # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166D..166E    ; Canadian_Aboriginal # Po   [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+166F..1676    ; Canadian_Aboriginal # Lo   [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA
+
+# Total code points: 630
+
+# ================================================
+
+1680          ; Ogham # Zs       OGHAM SPACE MARK
+1681..169A    ; Ogham # Lo  [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+169B          ; Ogham # Ps       OGHAM FEATHER MARK
+169C          ; Ogham # Pe       OGHAM REVERSED FEATHER MARK
+
+# Total code points: 29
+
+# ================================================
+
+16A0..16EA    ; Runic # Lo  [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EE..16F0    ; Runic # Nl   [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+
+# Total code points: 78
+
+# ================================================
+
+1780..17B3    ; Khmer # Lo  [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B4..17B5    ; Khmer # Cf   [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B6          ; Khmer # Mc       KHMER VOWEL SIGN AA
+17B7..17BD    ; Khmer # Mn   [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5    ; Khmer # Mc   [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6          ; Khmer # Mn       KHMER SIGN NIKAHIT
+17C7..17C8    ; Khmer # Mc   [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+17C9..17D3    ; Khmer # Mn  [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17D4..17D6    ; Khmer # Po   [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17D7          ; Khmer # Lm       KHMER SIGN LEK TOO
+17D8..17DA    ; Khmer # Po   [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT
+17DB          ; Khmer # Sc       KHMER CURRENCY SYMBOL RIEL
+17DC          ; Khmer # Lo       KHMER SIGN AVAKRAHASANYA
+17DD          ; Khmer # Mn       KHMER SIGN ATTHACAN
+17E0..17E9    ; Khmer # Nd  [10] KHMER DIGIT ZERO..KHMER DIGIT NINE
+17F0..17F9    ; Khmer # No  [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON
+19E0..19FF    ; Khmer # So  [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC
+
+# Total code points: 146
+
+# ================================================
+
+1800..1805    ; Mongolian # Po   [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS
+1806          ; Mongolian # Pd       MONGOLIAN TODO SOFT HYPHEN
+1807..180A    ; Mongolian # Po   [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU
+180B..180D    ; Mongolian # Mn   [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+180E          ; Mongolian # Zs       MONGOLIAN VOWEL SEPARATOR
+1810..1819    ; Mongolian # Nd  [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+1820..1842    ; Mongolian # Lo  [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843          ; Mongolian # Lm       MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877    ; Mongolian # Lo  [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8    ; Mongolian # Lo  [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9          ; Mongolian # Mn       MONGOLIAN LETTER ALI GALI DAGALGA
+
+# Total code points: 155
+
+# ================================================
+
+3041..3096    ; Hiragana # Lo  [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+309D..309E    ; Hiragana # Lm   [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F          ; Hiragana # Lo       HIRAGANA DIGRAPH YORI
+
+# Total code points: 89
+
+# ================================================
+
+30A1..30FA    ; Katakana # Lo  [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FD..30FE    ; Katakana # Lm   [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK
+30FF          ; Katakana # Lo       KATAKANA DIGRAPH KOTO
+31F0..31FF    ; Katakana # Lo  [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+FF66..FF6F    ; Katakana # Lo  [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF71..FF9D    ; Katakana # Lo  [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+
+# Total code points: 164
+
+# ================================================
+
+3105..312C    ; Bopomofo # Lo  [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN
+31A0..31B7    ; Bopomofo # Lo  [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+
+# Total code points: 64
+
+# ================================================
+
+2E80..2E99    ; Han # So  [26] CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9B..2EF3    ; Han # So  [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2F00..2FD5    ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+3005          ; Han # Lm       IDEOGRAPHIC ITERATION MARK
+3007          ; Han # Nl       IDEOGRAPHIC NUMBER ZERO
+3021..3029    ; Han # Nl   [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3038..303A    ; Han # Nl   [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B          ; Han # Lm       VERTICAL IDEOGRAPHIC ITERATION MARK
+3400..4DB5    ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FBB    ; Han # Lo [20924] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FBB
+F900..FA2D    ; Han # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6A    ; Han # Lo  [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A
+FA70..FAD9    ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+20000..2A6D6  ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2F800..2FA1D  ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 71570
+
+# ================================================
+
+A000..A014    ; Yi # Lo  [21] YI SYLLABLE IT..YI SYLLABLE E
+A015          ; Yi # Lm       YI SYLLABLE WU
+A016..A48C    ; Yi # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A490..A4C6    ; Yi # So  [55] YI RADICAL QOT..YI RADICAL KE
+
+# Total code points: 1220
+
+# ================================================
+
+10300..1031E  ; Old_Italic # Lo  [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10320..10323  ; Old_Italic # No   [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
+
+# Total code points: 35
+
+# ================================================
+
+10330..10349  ; Gothic # Lo  [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL
+1034A         ; Gothic # Nl       GOTHIC LETTER NINE HUNDRED
+
+# Total code points: 27
+
+# ================================================
+
+10400..1044F  ; Deseret # L&  [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+
+# Total code points: 80
+
+# ================================================
+
+0300..036F    ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+064B..0655    ; Inherited # Mn  [11] ARABIC FATHATAN..ARABIC HAMZA BELOW
+0670          ; Inherited # Mn       ARABIC LETTER SUPERSCRIPT ALEF
+1DC0..1DC3    ; Inherited # Mn   [4] COMBINING DOTTED GRAVE ACCENT..COMBINING SUSPENSION MARK
+200C..200D    ; Inherited # Cf   [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+20D0..20DC    ; Inherited # Mn  [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0    ; Inherited # Me   [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1          ; Inherited # Mn       COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4    ; Inherited # Me   [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20EB    ; Inherited # Mn   [7] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LONG DOUBLE SOLIDUS OVERLAY
+302A..302F    ; Inherited # Mn   [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A    ; Inherited # Mn   [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+FE00..FE0F    ; Inherited # Mn  [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE23    ; Inherited # Mn   [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF
+1D167..1D169  ; Inherited # Mn   [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D17B..1D182  ; Inherited # Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B  ; Inherited # Mn   [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD  ; Inherited # Mn   [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+E0100..E01EF  ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 448
+
+# ================================================
+
+1700..170C    ; Tagalog # Lo  [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711    ; Tagalog # Lo   [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1712..1714    ; Tagalog # Mn   [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+
+# Total code points: 20
+
+# ================================================
+
+1720..1731    ; Hanunoo # Lo  [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1732..1734    ; Hanunoo # Mn   [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+
+# Total code points: 21
+
+# ================================================
+
+1740..1751    ; Buhid # Lo  [18] BUHID LETTER A..BUHID LETTER HA
+1752..1753    ; Buhid # Mn   [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+
+# Total code points: 20
+
+# ================================================
+
+1760..176C    ; Tagbanwa # Lo  [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770    ; Tagbanwa # Lo   [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1772..1773    ; Tagbanwa # Mn   [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+
+# Total code points: 18
+
+# ================================================
+
+1900..191C    ; Limbu # Lo  [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1920..1922    ; Limbu # Mn   [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926    ; Limbu # Mc   [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928    ; Limbu # Mn   [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B    ; Limbu # Mc   [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931    ; Limbu # Mc   [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932          ; Limbu # Mn       LIMBU SMALL LETTER ANUSVARA
+1933..1938    ; Limbu # Mc   [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1939..193B    ; Limbu # Mn   [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1940          ; Limbu # So       LIMBU SIGN LOO
+1944..1945    ; Limbu # Po   [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1946..194F    ; Limbu # Nd  [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
+
+# Total code points: 66
+
+# ================================================
+
+1950..196D    ; Tai_Le # Lo  [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974    ; Tai_Le # Lo   [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+
+# Total code points: 35
+
+# ================================================
+
+10000..1000B  ; Linear_B # Lo  [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026  ; Linear_B # Lo  [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A  ; Linear_B # Lo  [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D  ; Linear_B # Lo   [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D  ; Linear_B # Lo  [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D  ; Linear_B # Lo  [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA  ; Linear_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+
+# Total code points: 211
+
+# ================================================
+
+10380..1039D  ; Ugaritic # Lo  [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+1039F         ; Ugaritic # Po       UGARITIC WORD DIVIDER
+
+# Total code points: 31
+
+# ================================================
+
+10450..1047F  ; Shavian # Lo  [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW
+
+# Total code points: 48
+
+# ================================================
+
+10480..1049D  ; Osmanya # Lo  [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO
+104A0..104A9  ; Osmanya # Nd  [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+
+# Total code points: 40
+
+# ================================================
+
+10800..10805  ; Cypriot # Lo   [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808         ; Cypriot # Lo       CYPRIOT SYLLABLE JO
+1080A..10835  ; Cypriot # Lo  [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838  ; Cypriot # Lo   [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C         ; Cypriot # Lo       CYPRIOT SYLLABLE ZA
+1083F         ; Cypriot # Lo       CYPRIOT SYLLABLE ZO
+
+# Total code points: 55
+
+# ================================================
+
+2800..28FF    ; Braille # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+
+# Total code points: 256
+
+# ================================================
+
+1A00..1A16    ; Buginese # Lo  [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A17..1A18    ; Buginese # Mn   [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1B    ; Buginese # Mc   [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1A1E..1A1F    ; Buginese # Po   [2] BUGINESE PALLAWA..BUGINESE END OF SECTION
+
+# Total code points: 30
+
+# ================================================
+
+03E2..03EF    ; Coptic # L&  [14] COPTIC CAPITAL LETTER SHEI..COPTIC SMALL LETTER DEI
+2C80..2CE4    ; Coptic # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI
+2CE5..2CEA    ; Coptic # So   [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA
+2CF9..2CFC    ; Coptic # Po   [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD          ; Coptic # No       COPTIC FRACTION ONE HALF
+2CFE..2CFF    ; Coptic # Po   [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER
+
+# Total code points: 128
+
+# ================================================
+
+1980..19A9    ; New_Tai_Lue # Lo  [42] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA
+19B0..19C0    ; New_Tai_Lue # Mc  [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C1..19C7    ; New_Tai_Lue # Lo   [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
+19C8..19C9    ; New_Tai_Lue # Mc   [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+19D0..19D9    ; New_Tai_Lue # Nd  [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE
+19DE..19DF    ; New_Tai_Lue # Po   [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV
+
+# Total code points: 80
+
+# ================================================
+
+2C00..2C2E    ; Glagolitic # L&  [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E    ; Glagolitic # L&  [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+
+# Total code points: 94
+
+# ================================================
+
+2D30..2D65    ; Tifinagh # Lo  [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D6F          ; Tifinagh # Lm       TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+
+# Total code points: 55
+
+# ================================================
+
+A800..A801    ; Syloti_Nagri # Lo   [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I
+A802          ; Syloti_Nagri # Mc       SYLOTI NAGRI SIGN DVISVARA
+A803..A805    ; Syloti_Nagri # Lo   [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A806          ; Syloti_Nagri # Mn       SYLOTI NAGRI SIGN HASANTA
+A807..A80A    ; Syloti_Nagri # Lo   [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80B          ; Syloti_Nagri # Mn       SYLOTI NAGRI SIGN ANUSVARA
+A80C..A822    ; Syloti_Nagri # Lo  [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A823..A824    ; Syloti_Nagri # Mc   [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826    ; Syloti_Nagri # Mn   [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827          ; Syloti_Nagri # Mc       SYLOTI NAGRI VOWEL SIGN OO
+A828..A82B    ; Syloti_Nagri # So   [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4
+
+# Total code points: 44
+
+# ================================================
+
+103A0..103C3  ; Old_Persian # Lo  [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF  ; Old_Persian # Lo   [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D0         ; Old_Persian # So       OLD PERSIAN WORD DIVIDER
+103D1..103D5  ; Old_Persian # Nl   [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+
+# Total code points: 50
+
+# ================================================
+
+10A00         ; Kharoshthi # Lo       KHAROSHTHI LETTER A
+10A01..10A03  ; Kharoshthi # Mn   [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06  ; Kharoshthi # Mn   [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F  ; Kharoshthi # Mn   [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A10..10A13  ; Kharoshthi # Lo   [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17  ; Kharoshthi # Lo   [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33  ; Kharoshthi # Lo  [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A38..10A3A  ; Kharoshthi # Mn   [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F         ; Kharoshthi # Mn       KHAROSHTHI VIRAMA
+10A40..10A47  ; Kharoshthi # No   [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
+10A50..10A58  ; Kharoshthi # Po   [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
+
+# Total code points: 65
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/SpecialCasing.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/SpecialCasing.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/SpecialCasing.txt	(revision 14489)
@@ -0,0 +1,260 @@
+# SpecialCasing-4.1.0.txt
+# Date: 2005-03-26, 00:35:45 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+#
+# Special Casing Properties
+#
+# This file is a supplement to the UnicodeData file.
+# It contains additional information about the casing of Unicode characters.
+# (For compatibility, the UnicodeData.txt file only contains case mappings for
+# characters where they are 1-1, and does not have locale-specific mappings.)
+# For more information, see the discussion of Case Mappings in the Unicode Standard.
+#
+# All code points not listed in this file that do not have a simple case mappings
+# in UnicodeData.txt map to themselves.
+# ================================================================================
+# Format
+# ================================================================================
+# The entries in this file are in the following machine-readable format:
+#
+# <code>; <lower> ; <title> ; <upper> ; (<condition_list> ;)? # <comment>
+#
+# <code>, <lower>, <title>, and <upper> provide character values in hex. If there is more
+# than one character, they are separated by spaces. Other than as used to separate 
+# elements, spaces are to be ignored.
+#
+# The <condition_list> is optional. Where present, it consists of one or more locale IDs
+# or contexts, separated by spaces. In these conditions:
+# - A condition list overrides the normal behavior if all of the listed conditions are true.
+# - The context is always the context of the characters in the original string,
+#   NOT in the resulting string.
+# - Case distinctions in the condition list are not significant.
+# - Conditions preceded by "Not_" represent the negation of the condition.
+#
+# A locale ID is defined by taking any language tag as defined by
+# RFC 3066 (or its successor), and replacing '-' by '_'.
+#
+# A context for a character C is defined by Section 3.13 Default Case Operations,
+# on p. 89-90 of The Unicode Standard, Version 4.0, as amended by Unicode 4.1.0,
+# as specified in http://www.unicode.org/versions/Unicode4.1.0/
+#
+# Parsers of this file must be prepared to deal with future additions to this format:
+#  * Additional contexts
+#  * Additional fields
+# ================================================================================
+
+# ================================================================================
+# Unconditional mappings
+# ================================================================================
+
+# The German es-zed is special--the normal mapping is to SS.
+# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>))
+
+00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S
+
+# Preserve canonical equivalence for I with dot. Turkic is handled below.
+
+0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+
+# Ligatures
+
+FB00; FB00; 0046 0066; 0046 0046; # LATIN SMALL LIGATURE FF
+FB01; FB01; 0046 0069; 0046 0049; # LATIN SMALL LIGATURE FI
+FB02; FB02; 0046 006C; 0046 004C; # LATIN SMALL LIGATURE FL
+FB03; FB03; 0046 0066 0069; 0046 0046 0049; # LATIN SMALL LIGATURE FFI
+FB04; FB04; 0046 0066 006C; 0046 0046 004C; # LATIN SMALL LIGATURE FFL
+FB05; FB05; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE LONG S T
+FB06; FB06; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE ST
+
+0587; 0587; 0535 0582; 0535 0552; # ARMENIAN SMALL LIGATURE ECH YIWN
+FB13; FB13; 0544 0576; 0544 0546; # ARMENIAN SMALL LIGATURE MEN NOW
+FB14; FB14; 0544 0565; 0544 0535; # ARMENIAN SMALL LIGATURE MEN ECH
+FB15; FB15; 0544 056B; 0544 053B; # ARMENIAN SMALL LIGATURE MEN INI
+FB16; FB16; 054E 0576; 054E 0546; # ARMENIAN SMALL LIGATURE VEW NOW
+FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
+
+# No corresponding uppercase precomposed character
+
+0149; 0149; 02BC 004E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0390; 0390; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+03B0; 03B0; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+01F0; 01F0; 004A 030C; 004A 030C; # LATIN SMALL LETTER J WITH CARON
+1E96; 1E96; 0048 0331; 0048 0331; # LATIN SMALL LETTER H WITH LINE BELOW
+1E97; 1E97; 0054 0308; 0054 0308; # LATIN SMALL LETTER T WITH DIAERESIS
+1E98; 1E98; 0057 030A; 0057 030A; # LATIN SMALL LETTER W WITH RING ABOVE
+1E99; 1E99; 0059 030A; 0059 030A; # LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A; 1E9A; 0041 02BE; 0041 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING
+1F50; 1F50; 03A5 0313; 03A5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI
+1F52; 1F52; 03A5 0313 0300; 03A5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F54; 1F54; 03A5 0313 0301; 03A5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F56; 1F56; 03A5 0313 0342; 03A5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1FB6; 1FB6; 0391 0342; 0391 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FC6; 1FC6; 0397 0342; 0397 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FD2; 1FD2; 0399 0308 0300; 0399 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3; 1FD3; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6; 1FD6; 0399 0342; 0399 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7; 1FD7; 0399 0308 0342; 0399 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FE2; 1FE2; 03A5 0308 0300; 03A5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3; 1FE3; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4; 1FE4; 03A1 0313; 03A1 0313; # GREEK SMALL LETTER RHO WITH PSILI
+1FE6; 1FE6; 03A5 0342; 03A5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+
+# IMPORTANT-when capitalizing iota-subscript (0345)
+#  It MUST be in normalized form--moved to the end of any sequence of combining marks.
+#  This is because logically it represents a following base character!
+#  E.g. <iota_subscript> (<Mn> | <Mc> | <Me>)+ => (<Mn> | <Mc> | <Me>)+ <iota_subscript>
+# It should never be the first character in a word, so in titlecasing it can be left as is.
+
+# The following cases are already in the UnicodeData file, so are only commented here.
+
+# 0345; 0345; 0345; 0399; # COMBINING GREEK YPOGEGRAMMENI
+
+# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript)
+# have special uppercases.
+# Note: characters with PROSGEGRAMMENI are actually titlecase, not uppercase!
+
+1F80; 1F80; 1F88; 1F08 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81; 1F81; 1F89; 1F09 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82; 1F82; 1F8A; 1F0A 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83; 1F83; 1F8B; 1F0B 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84; 1F84; 1F8C; 1F0C 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85; 1F85; 1F8D; 1F0D 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86; 1F86; 1F8E; 1F0E 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87; 1F87; 1F8F; 1F0F 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88; 1F80; 1F88; 1F08 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89; 1F81; 1F89; 1F09 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A; 1F82; 1F8A; 1F0A 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B; 1F83; 1F8B; 1F0B 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C; 1F84; 1F8C; 1F0C 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D; 1F85; 1F8D; 1F0D 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E; 1F86; 1F8E; 1F0E 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F; 1F87; 1F8F; 1F0F 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90; 1F90; 1F98; 1F28 0399; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91; 1F91; 1F99; 1F29 0399; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92; 1F92; 1F9A; 1F2A 0399; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93; 1F93; 1F9B; 1F2B 0399; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94; 1F94; 1F9C; 1F2C 0399; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95; 1F95; 1F9D; 1F2D 0399; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96; 1F96; 1F9E; 1F2E 0399; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97; 1F97; 1F9F; 1F2F 0399; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98; 1F90; 1F98; 1F28 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99; 1F91; 1F99; 1F29 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A; 1F92; 1F9A; 1F2A 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B; 1F93; 1F9B; 1F2B 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C; 1F94; 1F9C; 1F2C 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D; 1F95; 1F9D; 1F2D 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E; 1F96; 1F9E; 1F2E 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F; 1F97; 1F9F; 1F2F 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0; 1FA0; 1FA8; 1F68 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1; 1FA1; 1FA9; 1F69 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2; 1FA2; 1FAA; 1F6A 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3; 1FA3; 1FAB; 1F6B 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4; 1FA4; 1FAC; 1F6C 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5; 1FA5; 1FAD; 1F6D 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6; 1FA6; 1FAE; 1F6E 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7; 1FA7; 1FAF; 1F6F 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8; 1FA0; 1FA8; 1F68 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9; 1FA1; 1FA9; 1F69 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA; 1FA2; 1FAA; 1F6A 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB; 1FA3; 1FAB; 1F6B 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC; 1FA4; 1FAC; 1F6C 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD; 1FA5; 1FAD; 1F6D 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE; 1FA6; 1FAE; 1F6E 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF; 1FA7; 1FAF; 1F6F 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB3; 1FB3; 1FBC; 0391 0399; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FBC; 1FB3; 1FBC; 0391 0399; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FC3; 1FC3; 1FCC; 0397 0399; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FCC; 1FC3; 1FCC; 0397 0399; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+
+# Some characters with YPOGEGRAMMENI also have no corresponding titlecases
+
+1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FC2; 1FC2; 1FCA 0345; 1FCA 0399; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC4; 1FC4; 0389 0345; 0389 0399; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FF2; 1FF2; 1FFA 0345; 1FFA 0399; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF4; 1FF4; 038F 0345; 038F 0399; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+
+1FB7; 1FB7; 0391 0342 0345; 0391 0342 0399; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC7; 1FC7; 0397 0342 0345; 0397 0342 0399; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+
+# ================================================================================
+# Conditional mappings
+# ================================================================================
+
+# Special case for final form of sigma
+
+03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA
+
+# Note: the following cases for non-final are already in the UnicodeData file.
+
+# 03A3; 03C3; 03A3; 03A3; # GREEK CAPITAL LETTER SIGMA
+# 03C3; 03C3; 03A3; 03A3; # GREEK SMALL LETTER SIGMA
+# 03C2; 03C2; 03A3; 03A3; # GREEK SMALL LETTER FINAL SIGMA
+
+# Note: the following cases are not included, since they would case-fold in lowercasing
+
+# 03C3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK SMALL LETTER SIGMA
+# 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA
+
+# ================================================================================
+# Locale-sensitive mappings
+# ================================================================================
+
+# Lithuanian
+
+# Lithuanian retains the dot in a lowercase i when followed by accents.
+
+# Remove DOT ABOVE after "i" with upper or titlecase
+
+0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE
+
+# Introduce an explicit dot above when lowercasing capital I's and J's
+# whenever there are more accents above.
+# (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek)
+
+0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I
+004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J
+012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK
+00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE
+00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE
+0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE
+
+# ================================================================================
+
+# Turkish and Azeri
+
+# I and i-dotless; I-dot and i are case pairs in Turkish and Azeri
+# The following rules handle those cases.
+
+0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+
+# When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i.
+# This matches the behavior of the canonically equivalent I-dot_above
+
+0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE
+0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE
+
+# When lowercasing, unless an I is before a dot_above, it turns into a dotless i.
+
+0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I
+0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I
+
+# When uppercasing, i turns into a dotted capital I
+
+0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I
+0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I
+
+# Note: the following case is already in the UnicodeData file.
+
+# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/StandardizedVariants.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/StandardizedVariants.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/StandardizedVariants.txt	(revision 14489)
@@ -0,0 +1,122 @@
+# StandardizedVariants-4.1.0.txt
+# Date: 2005-03-17, 15:21:00 PST [KW]
+#
+# Specification of the variant sequences that are defined in the
+# Unicode Standard.
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2005 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Warning: Only the variation sequences specifically defined in this file
+# are sanctioned for standard use. In all other cases the variation selector
+# cannot change the visual appearance of the preceding base character from 
+# what it would have had in the absence of the variation selector.
+#
+# For more information, see Section 15.6, Variation Selectors, 
+# in The Unicode Standard, Version 4.0.
+#
+# Format:
+#   Field 0: the variation sequence
+#   Field 1: the description of the desired appearance
+#   Field 2: where the appearance is only different in in particular shaping environments
+#	this field lists them. The possible values are: isolate, initial, medial, final.
+#	If more than one is present, there are spaces between them.
+# =============================
+
+# Mathematical
+
+2229 FE00; with serifs; # INTERSECTION 
+222A FE00; with serifs; # UNION
+2268 FE00; with vertical stroke; # LESS-THAN BUT NOT EQUAL TO
+2269 FE00; with vertical stroke; # GREATER-THAN AND NOT DOUBLE EQUAL
+2272 FE00; following the slant of the lower leg; # LESS-THAN OR EQUIVALENT TO
+2273 FE00; following the slant of the lower leg; # GREATER-THAN OR EQUIVALENT TO
+#2278 FE00; with vertical stroke; # NEITHER LESS-THAN NOR GREATER-THAN
+#2279 FE00; with vertical stroke; # NEITHER GREATER-THAN NOR LESS-THAN
+228A FE00; with stroke through bottom members; # SUBSET OF WITH NOT EQUAL TO
+228B FE00; with stroke through bottom members; # SUPERSET OF WITH NOT EQUAL TO
+2293 FE00; with serifs; # SQUARE CAP
+2294 FE00; with serifs; # SQUARE CUP
+2295 FE00; with white rim; # CIRCLED PLUS
+2297 FE00; with white rim; # CIRCLED TIMES
+229C FE00; with equal sign touching the circle; # CIRCLED EQUALS
+22DA FE00; with slanted equal; # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB FE00; with slanted equal; # GREATER-THAN EQUAL TO OR LESS-THAN
+2A3C FE00; tall variant with narrow foot; # INTERIOR PRODUCT
+2A3D FE00; tall variant with narrow foot; # RIGHTHAND INTERIOR PRODUCT
+2A9D FE00; with similar following the slant of the upper leg; # SIMILAR OR LESS-THAN
+2A9E FE00; with similar following the slant of the upper leg; # SIMILAR OR GREATER-THAN
+2AAC FE00; with slanted equal; # SMALLER THAN OR EQUAL TO
+2AAD FE00; with slanted equal; # LARGER THAN OR EQUAL TO
+2ACB FE00; with stroke through bottom members; # SUBSET OF ABOVE NOT EQUAL TO
+2ACC FE00; with stroke through bottom members; # SUPERSET OF ABOVE NOT EQUAL TO
+
+#Mongolian
+
+1820 180B; second form; isolate medial final # MONGOLIAN LETTER A
+1820 180C; third form; medial # MONGOLIAN LETTER A 
+1821 180B; second form; initial final # MONGOLIAN LETTER E
+1822 180B; second form; medial # MONGOLIAN LETTER I
+1823 180B; second form; medial final # MONGOLIAN LETTER O 
+1824 180B; second form; medial # MONGOLIAN LETTER U 
+1825 180B; second form; medial final # MONGOLIAN LETTER OE 
+1825 180C; third form; medial # MONGOLIAN LETTER OE 
+1826 180B; second form; isolate medial final # MONGOLIAN LETTER UE 
+1826 180C; third form; medial # MONGOLIAN LETTER UE 
+1828 180B; second form; initial medial # MONGOLIAN LETTER NA
+1828 180C; third form; medial # MONGOLIAN LETTER NA
+1828 180D; separate form; medial # MONGOLIAN LETTER NA
+182A 180B; alternative form; final # MONGOLIAN LETTER BA
+182C 180B; second form; initial medial # MONGOLIAN LETTER QA
+182C 180B; feminine second form; isolate # MONGOLIAN LETTER QA 
+182C 180C; third form; medial # MONGOLIAN LETTER QA
+182C 180D; fourth form; medial # MONGOLIAN LETTER QA
+182D 180B; second form; initial medial # MONGOLIAN LETTER GA
+182D 180B; feminine form; final # MONGOLIAN LETTER GA
+182D 180C; third form; medial # MONGOLIAN LETTER GA
+182D 180D; feminine form; medial # MONGOLIAN LETTER GA
+1830 180B; second form; final # MONGOLIAN LETTER SA
+1830 180C; third form; final # MONGOLIAN LETTER SA
+1832 180B; second form; medial # MONGOLIAN LETTER TA 
+1833 180B; second form; initial medial final # MONGOLIAN LETTER DA
+1835 180B; second form; medial # MONGOLIAN LETTER JA
+1836 180B; second form; initial medial # # MONGOLIAN LETTER YA
+1836 180C; third form; medial # MONGOLIAN LETTER YA
+1838 180B; second form; final # MONGOLIAN LETTER WA
+1844 180B; second form; medial # MONGOLIAN LETTER TODO E
+1845 180B; second form; medial # MONGOLIAN LETTER TODO I 
+1846 180B; second form; medial # MONGOLIAN LETTER TODO O
+1847 180B; second form; isolate medial final # MONGOLIAN LETTER TODO U
+1847 180C; third form; medial # MONGOLIAN LETTER TODO U
+1848 180B; second form; medial # MONGOLIAN LETTER TODO OE
+1849 180B; second form; isolate medial # MONGOLIAN LETTER TODO UE
+184D 180B; feminine form; initial medial # MONGOLIAN LETTER TODO QA
+184E 180B; second form; medial # MONGOLIAN LETTER TODO GA
+185D 180B; second form; medial final # MONGOLIAN LETTER SIBE E
+185E 180B; second form; medial final # MONGOLIAN LETTER SIBE I
+185E 180C; third form; medial final # MONGOLIAN LETTER SIBE I
+1860 180B; second form; medial final # MONGOLIAN LETTER SIBE UE
+1863 180B; second form; medial # MONGOLIAN LETTER SIBE KA
+1868 180B; second form; initial medial # MONGOLIAN LETTER SIBE TA
+1868 180C; third form; medial # MONGOLIAN LETTER SIBE TA
+1869 180B; second form; initial medial # MONGOLIAN LETTER SIBE DA
+186F 180B; second form; initial medial # MONGOLIAN LETTER SIBE ZA
+1873 180B; second form; medial final # MONGOLIAN LETTER MANCHU I
+1873 180C; third form; medial final # MONGOLIAN LETTER MANCHU I
+1873 180D; fourth form; medial # MONGOLIAN LETTER MANCHU I
+1874 180B; second form; medial # MONGOLIAN LETTER MANCHU KA
+1874 180B; feminine first final form; final # MONGOLIAN LETTER MANCHU KA
+1874 180C; feminine first medial form; medial # MONGOLIAN LETTER MANCHU KA
+1874 180C; feminine second final form; final # MONGOLIAN LETTER MANCHU KA 
+1874 180D; feminine second medial form; medial # MONGOLIAN LETTER MANCHU KA
+1876 180B; second form; initial medial # MONGOLIAN LETTER MANCHU FA
+1880 180B; second form; # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881 180B; second form; # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1887 180B; second form; isolate final # MONGOLIAN LETTER ALI GALI A
+1887 180C; third form; final # MONGOLIAN LETTER ALI GALI A
+1887 180D; fourth form; final # MONGOLIAN LETTER ALI GALI A
+1888 180B; second form; final # MONGOLIAN LETTER ALI GALI I 
+188A 180B; second form; initial medial # MONGOLIAN LETTER ALI GALI NGA
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Digit.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Digit.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Digit.pl	(revision 14489)
@@ -0,0 +1,276 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+return <<'END';
+0030		0
+0031		1
+0032		2
+0033		3
+0034		4
+0035		5
+0036		6
+0037		7
+0038		8
+0039		9
+0660		0
+0661		1
+0662		2
+0663		3
+0664		4
+0665		5
+0666		6
+0667		7
+0668		8
+0669		9
+06F0		0
+06F1		1
+06F2		2
+06F3		3
+06F4		4
+06F5		5
+06F6		6
+06F7		7
+06F8		8
+06F9		9
+0966		0
+0967		1
+0968		2
+0969		3
+096A		4
+096B		5
+096C		6
+096D		7
+096E		8
+096F		9
+09E6		0
+09E7		1
+09E8		2
+09E9		3
+09EA		4
+09EB		5
+09EC		6
+09ED		7
+09EE		8
+09EF		9
+0A66		0
+0A67		1
+0A68		2
+0A69		3
+0A6A		4
+0A6B		5
+0A6C		6
+0A6D		7
+0A6E		8
+0A6F		9
+0AE6		0
+0AE7		1
+0AE8		2
+0AE9		3
+0AEA		4
+0AEB		5
+0AEC		6
+0AED		7
+0AEE		8
+0AEF		9
+0B66		0
+0B67		1
+0B68		2
+0B69		3
+0B6A		4
+0B6B		5
+0B6C		6
+0B6D		7
+0B6E		8
+0B6F		9
+0BE6		0
+0BE7		1
+0BE8		2
+0BE9		3
+0BEA		4
+0BEB		5
+0BEC		6
+0BED		7
+0BEE		8
+0BEF		9
+0C66		0
+0C67		1
+0C68		2
+0C69		3
+0C6A		4
+0C6B		5
+0C6C		6
+0C6D		7
+0C6E		8
+0C6F		9
+0CE6		0
+0CE7		1
+0CE8		2
+0CE9		3
+0CEA		4
+0CEB		5
+0CEC		6
+0CED		7
+0CEE		8
+0CEF		9
+0D66		0
+0D67		1
+0D68		2
+0D69		3
+0D6A		4
+0D6B		5
+0D6C		6
+0D6D		7
+0D6E		8
+0D6F		9
+0E50		0
+0E51		1
+0E52		2
+0E53		3
+0E54		4
+0E55		5
+0E56		6
+0E57		7
+0E58		8
+0E59		9
+0ED0		0
+0ED1		1
+0ED2		2
+0ED3		3
+0ED4		4
+0ED5		5
+0ED6		6
+0ED7		7
+0ED8		8
+0ED9		9
+0F20		0
+0F21		1
+0F22		2
+0F23		3
+0F24		4
+0F25		5
+0F26		6
+0F27		7
+0F28		8
+0F29		9
+1040		0
+1041		1
+1042		2
+1043		3
+1044		4
+1045		5
+1046		6
+1047		7
+1048		8
+1049		9
+17E0		0
+17E1		1
+17E2		2
+17E3		3
+17E4		4
+17E5		5
+17E6		6
+17E7		7
+17E8		8
+17E9		9
+1810		0
+1811		1
+1812		2
+1813		3
+1814		4
+1815		5
+1816		6
+1817		7
+1818		8
+1819		9
+1946		0
+1947		1
+1948		2
+1949		3
+194A		4
+194B		5
+194C		6
+194D		7
+194E		8
+194F		9
+19D0		0
+19D1		1
+19D2		2
+19D3		3
+19D4		4
+19D5		5
+19D6		6
+19D7		7
+19D8		8
+19D9		9
+FF10		0
+FF11		1
+FF12		2
+FF13		3
+FF14		4
+FF15		5
+FF16		6
+FF17		7
+FF18		8
+FF19		9
+104A0		0
+104A1		1
+104A2		2
+104A3		3
+104A4		4
+104A5		5
+104A6		6
+104A7		7
+104A8		8
+104A9		9
+1D7CE		0
+1D7CF		1
+1D7D0		2
+1D7D1		3
+1D7D2		4
+1D7D3		5
+1D7D4		6
+1D7D5		7
+1D7D6		8
+1D7D7		9
+1D7D8		0
+1D7D9		1
+1D7DA		2
+1D7DB		3
+1D7DC		4
+1D7DD		5
+1D7DE		6
+1D7DF		7
+1D7E0		8
+1D7E1		9
+1D7E2		0
+1D7E3		1
+1D7E4		2
+1D7E5		3
+1D7E6		4
+1D7E7		5
+1D7E8		6
+1D7E9		7
+1D7EA		8
+1D7EB		9
+1D7EC		0
+1D7ED		1
+1D7EE		2
+1D7EF		3
+1D7F0		4
+1D7F1		5
+1D7F2		6
+1D7F3		7
+1D7F4		8
+1D7F5		9
+1D7F6		0
+1D7F7		1
+1D7F8		2
+1D7F9		3
+1D7FA		4
+1D7FB		5
+1D7FC		6
+1D7FD		7
+1D7FE		8
+1D7FF		9
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Fold.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Fold.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Fold.pl	(revision 14489)
@@ -0,0 +1,993 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+
+#  The ke UTF-8 _bytes_, the value UTF-8 (speed hack)
+%utf8::ToSpecFold =
+(
+"\xC3\x9F" => "\x{0073}\x{0073}",
+"\xC4\xB0" => "\x{0069}\x{0307}",
+"\xC5\x89" => "\x{02BC}\x{006E}",
+"\xC7\xB0" => "\x{006A}\x{030C}",
+"\xCE\x90" => "\x{03B9}\x{0308}\x{0301}",
+"\xCE\xB0" => "\x{03C5}\x{0308}\x{0301}",
+"\xD6\x87" => "\x{0565}\x{0582}",
+"\xE1\xBA\x96" => "\x{0068}\x{0331}",
+"\xE1\xBA\x97" => "\x{0074}\x{0308}",
+"\xE1\xBA\x98" => "\x{0077}\x{030A}",
+"\xE1\xBA\x99" => "\x{0079}\x{030A}",
+"\xE1\xBA\x9A" => "\x{0061}\x{02BE}",
+"\xE1\xBD\x90" => "\x{03C5}\x{0313}",
+"\xE1\xBD\x92" => "\x{03C5}\x{0313}\x{0300}",
+"\xE1\xBD\x94" => "\x{03C5}\x{0313}\x{0301}",
+"\xE1\xBD\x96" => "\x{03C5}\x{0313}\x{0342}",
+"\xE1\xBE\x80" => "\x{1F00}\x{03B9}",
+"\xE1\xBE\x81" => "\x{1F01}\x{03B9}",
+"\xE1\xBE\x82" => "\x{1F02}\x{03B9}",
+"\xE1\xBE\x83" => "\x{1F03}\x{03B9}",
+"\xE1\xBE\x84" => "\x{1F04}\x{03B9}",
+"\xE1\xBE\x85" => "\x{1F05}\x{03B9}",
+"\xE1\xBE\x86" => "\x{1F06}\x{03B9}",
+"\xE1\xBE\x87" => "\x{1F07}\x{03B9}",
+"\xE1\xBE\x88" => "\x{1F00}\x{03B9}",
+"\xE1\xBE\x89" => "\x{1F01}\x{03B9}",
+"\xE1\xBE\x8A" => "\x{1F02}\x{03B9}",
+"\xE1\xBE\x8B" => "\x{1F03}\x{03B9}",
+"\xE1\xBE\x8C" => "\x{1F04}\x{03B9}",
+"\xE1\xBE\x8D" => "\x{1F05}\x{03B9}",
+"\xE1\xBE\x8E" => "\x{1F06}\x{03B9}",
+"\xE1\xBE\x8F" => "\x{1F07}\x{03B9}",
+"\xE1\xBE\x90" => "\x{1F20}\x{03B9}",
+"\xE1\xBE\x91" => "\x{1F21}\x{03B9}",
+"\xE1\xBE\x92" => "\x{1F22}\x{03B9}",
+"\xE1\xBE\x93" => "\x{1F23}\x{03B9}",
+"\xE1\xBE\x94" => "\x{1F24}\x{03B9}",
+"\xE1\xBE\x95" => "\x{1F25}\x{03B9}",
+"\xE1\xBE\x96" => "\x{1F26}\x{03B9}",
+"\xE1\xBE\x97" => "\x{1F27}\x{03B9}",
+"\xE1\xBE\x98" => "\x{1F20}\x{03B9}",
+"\xE1\xBE\x99" => "\x{1F21}\x{03B9}",
+"\xE1\xBE\x9A" => "\x{1F22}\x{03B9}",
+"\xE1\xBE\x9B" => "\x{1F23}\x{03B9}",
+"\xE1\xBE\x9C" => "\x{1F24}\x{03B9}",
+"\xE1\xBE\x9D" => "\x{1F25}\x{03B9}",
+"\xE1\xBE\x9E" => "\x{1F26}\x{03B9}",
+"\xE1\xBE\x9F" => "\x{1F27}\x{03B9}",
+"\xE1\xBE\xA0" => "\x{1F60}\x{03B9}",
+"\xE1\xBE\xA1" => "\x{1F61}\x{03B9}",
+"\xE1\xBE\xA2" => "\x{1F62}\x{03B9}",
+"\xE1\xBE\xA3" => "\x{1F63}\x{03B9}",
+"\xE1\xBE\xA4" => "\x{1F64}\x{03B9}",
+"\xE1\xBE\xA5" => "\x{1F65}\x{03B9}",
+"\xE1\xBE\xA6" => "\x{1F66}\x{03B9}",
+"\xE1\xBE\xA7" => "\x{1F67}\x{03B9}",
+"\xE1\xBE\xA8" => "\x{1F60}\x{03B9}",
+"\xE1\xBE\xA9" => "\x{1F61}\x{03B9}",
+"\xE1\xBE\xAA" => "\x{1F62}\x{03B9}",
+"\xE1\xBE\xAB" => "\x{1F63}\x{03B9}",
+"\xE1\xBE\xAC" => "\x{1F64}\x{03B9}",
+"\xE1\xBE\xAD" => "\x{1F65}\x{03B9}",
+"\xE1\xBE\xAE" => "\x{1F66}\x{03B9}",
+"\xE1\xBE\xAF" => "\x{1F67}\x{03B9}",
+"\xE1\xBE\xB2" => "\x{1F70}\x{03B9}",
+"\xE1\xBE\xB3" => "\x{03B1}\x{03B9}",
+"\xE1\xBE\xB4" => "\x{03AC}\x{03B9}",
+"\xE1\xBE\xB6" => "\x{03B1}\x{0342}",
+"\xE1\xBE\xB7" => "\x{03B1}\x{0342}\x{03B9}",
+"\xE1\xBE\xBC" => "\x{03B1}\x{03B9}",
+"\xE1\xBF\x82" => "\x{1F74}\x{03B9}",
+"\xE1\xBF\x83" => "\x{03B7}\x{03B9}",
+"\xE1\xBF\x84" => "\x{03AE}\x{03B9}",
+"\xE1\xBF\x86" => "\x{03B7}\x{0342}",
+"\xE1\xBF\x87" => "\x{03B7}\x{0342}\x{03B9}",
+"\xE1\xBF\x8C" => "\x{03B7}\x{03B9}",
+"\xE1\xBF\x92" => "\x{03B9}\x{0308}\x{0300}",
+"\xE1\xBF\x93" => "\x{03B9}\x{0308}\x{0301}",
+"\xE1\xBF\x96" => "\x{03B9}\x{0342}",
+"\xE1\xBF\x97" => "\x{03B9}\x{0308}\x{0342}",
+"\xE1\xBF\xA2" => "\x{03C5}\x{0308}\x{0300}",
+"\xE1\xBF\xA3" => "\x{03C5}\x{0308}\x{0301}",
+"\xE1\xBF\xA4" => "\x{03C1}\x{0313}",
+"\xE1\xBF\xA6" => "\x{03C5}\x{0342}",
+"\xE1\xBF\xA7" => "\x{03C5}\x{0308}\x{0342}",
+"\xE1\xBF\xB2" => "\x{1F7C}\x{03B9}",
+"\xE1\xBF\xB3" => "\x{03C9}\x{03B9}",
+"\xE1\xBF\xB4" => "\x{03CE}\x{03B9}",
+"\xE1\xBF\xB6" => "\x{03C9}\x{0342}",
+"\xE1\xBF\xB7" => "\x{03C9}\x{0342}\x{03B9}",
+"\xE1\xBF\xBC" => "\x{03C9}\x{03B9}",
+"\xEF\xAC\x80" => "\x{0066}\x{0066}",
+"\xEF\xAC\x81" => "\x{0066}\x{0069}",
+"\xEF\xAC\x82" => "\x{0066}\x{006C}",
+"\xEF\xAC\x83" => "\x{0066}\x{0066}\x{0069}",
+"\xEF\xAC\x84" => "\x{0066}\x{0066}\x{006C}",
+"\xEF\xAC\x85" => "\x{0073}\x{0074}",
+"\xEF\xAC\x86" => "\x{0073}\x{0074}",
+"\xEF\xAC\x93" => "\x{0574}\x{0576}",
+"\xEF\xAC\x94" => "\x{0574}\x{0565}",
+"\xEF\xAC\x95" => "\x{0574}\x{056B}",
+"\xEF\xAC\x96" => "\x{057E}\x{0576}",
+"\xEF\xAC\x97" => "\x{0574}\x{056D}",
+);
+
+return <<'END';
+0041		0061
+0042		0062
+0043		0063
+0044		0064
+0045		0065
+0046		0066
+0047		0067
+0048		0068
+0049		0069
+004A		006A
+004B		006B
+004C		006C
+004D		006D
+004E		006E
+004F		006F
+0050		0070
+0051		0071
+0052		0072
+0053		0073
+0054		0074
+0055		0075
+0056		0076
+0057		0077
+0058		0078
+0059		0079
+005A		007A
+00B5		03BC
+00C0		00E0
+00C1		00E1
+00C2		00E2
+00C3		00E3
+00C4		00E4
+00C5		00E5
+00C6		00E6
+00C7		00E7
+00C8		00E8
+00C9		00E9
+00CA		00EA
+00CB		00EB
+00CC		00EC
+00CD		00ED
+00CE		00EE
+00CF		00EF
+00D0		00F0
+00D1		00F1
+00D2		00F2
+00D3		00F3
+00D4		00F4
+00D5		00F5
+00D6		00F6
+00D8		00F8
+00D9		00F9
+00DA		00FA
+00DB		00FB
+00DC		00FC
+00DD		00FD
+00DE		00FE
+0100		0101
+0102		0103
+0104		0105
+0106		0107
+0108		0109
+010A		010B
+010C		010D
+010E		010F
+0110		0111
+0112		0113
+0114		0115
+0116		0117
+0118		0119
+011A		011B
+011C		011D
+011E		011F
+0120		0121
+0122		0123
+0124		0125
+0126		0127
+0128		0129
+012A		012B
+012C		012D
+012E		012F
+0132		0133
+0134		0135
+0136		0137
+0139		013A
+013B		013C
+013D		013E
+013F		0140
+0141		0142
+0143		0144
+0145		0146
+0147		0148
+014A		014B
+014C		014D
+014E		014F
+0150		0151
+0152		0153
+0154		0155
+0156		0157
+0158		0159
+015A		015B
+015C		015D
+015E		015F
+0160		0161
+0162		0163
+0164		0165
+0166		0167
+0168		0169
+016A		016B
+016C		016D
+016E		016F
+0170		0171
+0172		0173
+0174		0175
+0176		0177
+0178		00FF
+0179		017A
+017B		017C
+017D		017E
+017F		0073
+0181		0253
+0182		0183
+0184		0185
+0186		0254
+0187		0188
+0189		0256
+018A		0257
+018B		018C
+018E		01DD
+018F		0259
+0190		025B
+0191		0192
+0193		0260
+0194		0263
+0196		0269
+0197		0268
+0198		0199
+019C		026F
+019D		0272
+019F		0275
+01A0		01A1
+01A2		01A3
+01A4		01A5
+01A6		0280
+01A7		01A8
+01A9		0283
+01AC		01AD
+01AE		0288
+01AF		01B0
+01B1		028A
+01B2		028B
+01B3		01B4
+01B5		01B6
+01B7		0292
+01B8		01B9
+01BC		01BD
+01C4		01C6
+01C5		01C6
+01C7		01C9
+01C8		01C9
+01CA		01CC
+01CB		01CC
+01CD		01CE
+01CF		01D0
+01D1		01D2
+01D3		01D4
+01D5		01D6
+01D7		01D8
+01D9		01DA
+01DB		01DC
+01DE		01DF
+01E0		01E1
+01E2		01E3
+01E4		01E5
+01E6		01E7
+01E8		01E9
+01EA		01EB
+01EC		01ED
+01EE		01EF
+01F1		01F3
+01F2		01F3
+01F4		01F5
+01F6		0195
+01F7		01BF
+01F8		01F9
+01FA		01FB
+01FC		01FD
+01FE		01FF
+0200		0201
+0202		0203
+0204		0205
+0206		0207
+0208		0209
+020A		020B
+020C		020D
+020E		020F
+0210		0211
+0212		0213
+0214		0215
+0216		0217
+0218		0219
+021A		021B
+021C		021D
+021E		021F
+0220		019E
+0222		0223
+0224		0225
+0226		0227
+0228		0229
+022A		022B
+022C		022D
+022E		022F
+0230		0231
+0232		0233
+023B		023C
+023D		019A
+0241		0294
+0345		03B9
+0386		03AC
+0388		03AD
+0389		03AE
+038A		03AF
+038C		03CC
+038E		03CD
+038F		03CE
+0391		03B1
+0392		03B2
+0393		03B3
+0394		03B4
+0395		03B5
+0396		03B6
+0397		03B7
+0398		03B8
+0399		03B9
+039A		03BA
+039B		03BB
+039C		03BC
+039D		03BD
+039E		03BE
+039F		03BF
+03A0		03C0
+03A1		03C1
+03A3		03C3
+03A4		03C4
+03A5		03C5
+03A6		03C6
+03A7		03C7
+03A8		03C8
+03A9		03C9
+03AA		03CA
+03AB		03CB
+03C2		03C3
+03D0		03B2
+03D1		03B8
+03D5		03C6
+03D6		03C0
+03D8		03D9
+03DA		03DB
+03DC		03DD
+03DE		03DF
+03E0		03E1
+03E2		03E3
+03E4		03E5
+03E6		03E7
+03E8		03E9
+03EA		03EB
+03EC		03ED
+03EE		03EF
+03F0		03BA
+03F1		03C1
+03F4		03B8
+03F5		03B5
+03F7		03F8
+03F9		03F2
+03FA		03FB
+0400		0450
+0401		0451
+0402		0452
+0403		0453
+0404		0454
+0405		0455
+0406		0456
+0407		0457
+0408		0458
+0409		0459
+040A		045A
+040B		045B
+040C		045C
+040D		045D
+040E		045E
+040F		045F
+0410		0430
+0411		0431
+0412		0432
+0413		0433
+0414		0434
+0415		0435
+0416		0436
+0417		0437
+0418		0438
+0419		0439
+041A		043A
+041B		043B
+041C		043C
+041D		043D
+041E		043E
+041F		043F
+0420		0440
+0421		0441
+0422		0442
+0423		0443
+0424		0444
+0425		0445
+0426		0446
+0427		0447
+0428		0448
+0429		0449
+042A		044A
+042B		044B
+042C		044C
+042D		044D
+042E		044E
+042F		044F
+0460		0461
+0462		0463
+0464		0465
+0466		0467
+0468		0469
+046A		046B
+046C		046D
+046E		046F
+0470		0471
+0472		0473
+0474		0475
+0476		0477
+0478		0479
+047A		047B
+047C		047D
+047E		047F
+0480		0481
+048A		048B
+048C		048D
+048E		048F
+0490		0491
+0492		0493
+0494		0495
+0496		0497
+0498		0499
+049A		049B
+049C		049D
+049E		049F
+04A0		04A1
+04A2		04A3
+04A4		04A5
+04A6		04A7
+04A8		04A9
+04AA		04AB
+04AC		04AD
+04AE		04AF
+04B0		04B1
+04B2		04B3
+04B4		04B5
+04B6		04B7
+04B8		04B9
+04BA		04BB
+04BC		04BD
+04BE		04BF
+04C1		04C2
+04C3		04C4
+04C5		04C6
+04C7		04C8
+04C9		04CA
+04CB		04CC
+04CD		04CE
+04D0		04D1
+04D2		04D3
+04D4		04D5
+04D6		04D7
+04D8		04D9
+04DA		04DB
+04DC		04DD
+04DE		04DF
+04E0		04E1
+04E2		04E3
+04E4		04E5
+04E6		04E7
+04E8		04E9
+04EA		04EB
+04EC		04ED
+04EE		04EF
+04F0		04F1
+04F2		04F3
+04F4		04F5
+04F6		04F7
+04F8		04F9
+0500		0501
+0502		0503
+0504		0505
+0506		0507
+0508		0509
+050A		050B
+050C		050D
+050E		050F
+0531		0561
+0532		0562
+0533		0563
+0534		0564
+0535		0565
+0536		0566
+0537		0567
+0538		0568
+0539		0569
+053A		056A
+053B		056B
+053C		056C
+053D		056D
+053E		056E
+053F		056F
+0540		0570
+0541		0571
+0542		0572
+0543		0573
+0544		0574
+0545		0575
+0546		0576
+0547		0577
+0548		0578
+0549		0579
+054A		057A
+054B		057B
+054C		057C
+054D		057D
+054E		057E
+054F		057F
+0550		0580
+0551		0581
+0552		0582
+0553		0583
+0554		0584
+0555		0585
+0556		0586
+10A0		2D00
+10A1		2D01
+10A2		2D02
+10A3		2D03
+10A4		2D04
+10A5		2D05
+10A6		2D06
+10A7		2D07
+10A8		2D08
+10A9		2D09
+10AA		2D0A
+10AB		2D0B
+10AC		2D0C
+10AD		2D0D
+10AE		2D0E
+10AF		2D0F
+10B0		2D10
+10B1		2D11
+10B2		2D12
+10B3		2D13
+10B4		2D14
+10B5		2D15
+10B6		2D16
+10B7		2D17
+10B8		2D18
+10B9		2D19
+10BA		2D1A
+10BB		2D1B
+10BC		2D1C
+10BD		2D1D
+10BE		2D1E
+10BF		2D1F
+10C0		2D20
+10C1		2D21
+10C2		2D22
+10C3		2D23
+10C4		2D24
+10C5		2D25
+1E00		1E01
+1E02		1E03
+1E04		1E05
+1E06		1E07
+1E08		1E09
+1E0A		1E0B
+1E0C		1E0D
+1E0E		1E0F
+1E10		1E11
+1E12		1E13
+1E14		1E15
+1E16		1E17
+1E18		1E19
+1E1A		1E1B
+1E1C		1E1D
+1E1E		1E1F
+1E20		1E21
+1E22		1E23
+1E24		1E25
+1E26		1E27
+1E28		1E29
+1E2A		1E2B
+1E2C		1E2D
+1E2E		1E2F
+1E30		1E31
+1E32		1E33
+1E34		1E35
+1E36		1E37
+1E38		1E39
+1E3A		1E3B
+1E3C		1E3D
+1E3E		1E3F
+1E40		1E41
+1E42		1E43
+1E44		1E45
+1E46		1E47
+1E48		1E49
+1E4A		1E4B
+1E4C		1E4D
+1E4E		1E4F
+1E50		1E51
+1E52		1E53
+1E54		1E55
+1E56		1E57
+1E58		1E59
+1E5A		1E5B
+1E5C		1E5D
+1E5E		1E5F
+1E60		1E61
+1E62		1E63
+1E64		1E65
+1E66		1E67
+1E68		1E69
+1E6A		1E6B
+1E6C		1E6D
+1E6E		1E6F
+1E70		1E71
+1E72		1E73
+1E74		1E75
+1E76		1E77
+1E78		1E79
+1E7A		1E7B
+1E7C		1E7D
+1E7E		1E7F
+1E80		1E81
+1E82		1E83
+1E84		1E85
+1E86		1E87
+1E88		1E89
+1E8A		1E8B
+1E8C		1E8D
+1E8E		1E8F
+1E90		1E91
+1E92		1E93
+1E94		1E95
+1E9B		1E61
+1EA0		1EA1
+1EA2		1EA3
+1EA4		1EA5
+1EA6		1EA7
+1EA8		1EA9
+1EAA		1EAB
+1EAC		1EAD
+1EAE		1EAF
+1EB0		1EB1
+1EB2		1EB3
+1EB4		1EB5
+1EB6		1EB7
+1EB8		1EB9
+1EBA		1EBB
+1EBC		1EBD
+1EBE		1EBF
+1EC0		1EC1
+1EC2		1EC3
+1EC4		1EC5
+1EC6		1EC7
+1EC8		1EC9
+1ECA		1ECB
+1ECC		1ECD
+1ECE		1ECF
+1ED0		1ED1
+1ED2		1ED3
+1ED4		1ED5
+1ED6		1ED7
+1ED8		1ED9
+1EDA		1EDB
+1EDC		1EDD
+1EDE		1EDF
+1EE0		1EE1
+1EE2		1EE3
+1EE4		1EE5
+1EE6		1EE7
+1EE8		1EE9
+1EEA		1EEB
+1EEC		1EED
+1EEE		1EEF
+1EF0		1EF1
+1EF2		1EF3
+1EF4		1EF5
+1EF6		1EF7
+1EF8		1EF9
+1F08		1F00
+1F09		1F01
+1F0A		1F02
+1F0B		1F03
+1F0C		1F04
+1F0D		1F05
+1F0E		1F06
+1F0F		1F07
+1F18		1F10
+1F19		1F11
+1F1A		1F12
+1F1B		1F13
+1F1C		1F14
+1F1D		1F15
+1F28		1F20
+1F29		1F21
+1F2A		1F22
+1F2B		1F23
+1F2C		1F24
+1F2D		1F25
+1F2E		1F26
+1F2F		1F27
+1F38		1F30
+1F39		1F31
+1F3A		1F32
+1F3B		1F33
+1F3C		1F34
+1F3D		1F35
+1F3E		1F36
+1F3F		1F37
+1F48		1F40
+1F49		1F41
+1F4A		1F42
+1F4B		1F43
+1F4C		1F44
+1F4D		1F45
+1F59		1F51
+1F5B		1F53
+1F5D		1F55
+1F5F		1F57
+1F68		1F60
+1F69		1F61
+1F6A		1F62
+1F6B		1F63
+1F6C		1F64
+1F6D		1F65
+1F6E		1F66
+1F6F		1F67
+1FB8		1FB0
+1FB9		1FB1
+1FBA		1F70
+1FBB		1F71
+1FBE		03B9
+1FC8		1F72
+1FC9		1F73
+1FCA		1F74
+1FCB		1F75
+1FD8		1FD0
+1FD9		1FD1
+1FDA		1F76
+1FDB		1F77
+1FE8		1FE0
+1FE9		1FE1
+1FEA		1F7A
+1FEB		1F7B
+1FEC		1FE5
+1FF8		1F78
+1FF9		1F79
+1FFA		1F7C
+1FFB		1F7D
+2126		03C9
+212A		006B
+212B		00E5
+2160		2170
+2161		2171
+2162		2172
+2163		2173
+2164		2174
+2165		2175
+2166		2176
+2167		2177
+2168		2178
+2169		2179
+216A		217A
+216B		217B
+216C		217C
+216D		217D
+216E		217E
+216F		217F
+24B6		24D0
+24B7		24D1
+24B8		24D2
+24B9		24D3
+24BA		24D4
+24BB		24D5
+24BC		24D6
+24BD		24D7
+24BE		24D8
+24BF		24D9
+24C0		24DA
+24C1		24DB
+24C2		24DC
+24C3		24DD
+24C4		24DE
+24C5		24DF
+24C6		24E0
+24C7		24E1
+24C8		24E2
+24C9		24E3
+24CA		24E4
+24CB		24E5
+24CC		24E6
+24CD		24E7
+24CE		24E8
+24CF		24E9
+2C00		2C30
+2C01		2C31
+2C02		2C32
+2C03		2C33
+2C04		2C34
+2C05		2C35
+2C06		2C36
+2C07		2C37
+2C08		2C38
+2C09		2C39
+2C0A		2C3A
+2C0B		2C3B
+2C0C		2C3C
+2C0D		2C3D
+2C0E		2C3E
+2C0F		2C3F
+2C10		2C40
+2C11		2C41
+2C12		2C42
+2C13		2C43
+2C14		2C44
+2C15		2C45
+2C16		2C46
+2C17		2C47
+2C18		2C48
+2C19		2C49
+2C1A		2C4A
+2C1B		2C4B
+2C1C		2C4C
+2C1D		2C4D
+2C1E		2C4E
+2C1F		2C4F
+2C20		2C50
+2C21		2C51
+2C22		2C52
+2C23		2C53
+2C24		2C54
+2C25		2C55
+2C26		2C56
+2C27		2C57
+2C28		2C58
+2C29		2C59
+2C2A		2C5A
+2C2B		2C5B
+2C2C		2C5C
+2C2D		2C5D
+2C2E		2C5E
+2C80		2C81
+2C82		2C83
+2C84		2C85
+2C86		2C87
+2C88		2C89
+2C8A		2C8B
+2C8C		2C8D
+2C8E		2C8F
+2C90		2C91
+2C92		2C93
+2C94		2C95
+2C96		2C97
+2C98		2C99
+2C9A		2C9B
+2C9C		2C9D
+2C9E		2C9F
+2CA0		2CA1
+2CA2		2CA3
+2CA4		2CA5
+2CA6		2CA7
+2CA8		2CA9
+2CAA		2CAB
+2CAC		2CAD
+2CAE		2CAF
+2CB0		2CB1
+2CB2		2CB3
+2CB4		2CB5
+2CB6		2CB7
+2CB8		2CB9
+2CBA		2CBB
+2CBC		2CBD
+2CBE		2CBF
+2CC0		2CC1
+2CC2		2CC3
+2CC4		2CC5
+2CC6		2CC7
+2CC8		2CC9
+2CCA		2CCB
+2CCC		2CCD
+2CCE		2CCF
+2CD0		2CD1
+2CD2		2CD3
+2CD4		2CD5
+2CD6		2CD7
+2CD8		2CD9
+2CDA		2CDB
+2CDC		2CDD
+2CDE		2CDF
+2CE0		2CE1
+2CE2		2CE3
+FF21		FF41
+FF22		FF42
+FF23		FF43
+FF24		FF44
+FF25		FF45
+FF26		FF46
+FF27		FF47
+FF28		FF48
+FF29		FF49
+FF2A		FF4A
+FF2B		FF4B
+FF2C		FF4C
+FF2D		FF4D
+FF2E		FF4E
+FF2F		FF4F
+FF30		FF50
+FF31		FF51
+FF32		FF52
+FF33		FF53
+FF34		FF54
+FF35		FF55
+FF36		FF56
+FF37		FF57
+FF38		FF58
+FF39		FF59
+FF3A		FF5A
+10400		10428
+10401		10429
+10402		1042A
+10403		1042B
+10404		1042C
+10405		1042D
+10406		1042E
+10407		1042F
+10408		10430
+10409		10431
+1040A		10432
+1040B		10433
+1040C		10434
+1040D		10435
+1040E		10436
+1040F		10437
+10410		10438
+10411		10439
+10412		1043A
+10413		1043B
+10414		1043C
+10415		1043D
+10416		1043E
+10417		1043F
+10418		10440
+10419		10441
+1041A		10442
+1041B		10443
+1041C		10444
+1041D		10445
+1041E		10446
+1041F		10447
+10420		10448
+10421		10449
+10422		1044A
+10423		1044B
+10424		1044C
+10425		1044D
+10426		1044E
+10427		1044F
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Lower.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Lower.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Lower.pl	(revision 14489)
@@ -0,0 +1,905 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+
+# The key UTF-8 _bytes_, the value UTF-8 (speed hack)
+%utf8::ToSpecLower =
+(
+"\xC4\xB0" => "\x{0069}\x{0307}",
+"\xE1\xBE\x88" => "\x{1F80}",
+"\xE1\xBE\x89" => "\x{1F81}",
+"\xE1\xBE\x8A" => "\x{1F82}",
+"\xE1\xBE\x8B" => "\x{1F83}",
+"\xE1\xBE\x8C" => "\x{1F84}",
+"\xE1\xBE\x8D" => "\x{1F85}",
+"\xE1\xBE\x8E" => "\x{1F86}",
+"\xE1\xBE\x8F" => "\x{1F87}",
+"\xE1\xBE\x98" => "\x{1F90}",
+"\xE1\xBE\x99" => "\x{1F91}",
+"\xE1\xBE\x9A" => "\x{1F92}",
+"\xE1\xBE\x9B" => "\x{1F93}",
+"\xE1\xBE\x9C" => "\x{1F94}",
+"\xE1\xBE\x9D" => "\x{1F95}",
+"\xE1\xBE\x9E" => "\x{1F96}",
+"\xE1\xBE\x9F" => "\x{1F97}",
+"\xE1\xBE\xA8" => "\x{1FA0}",
+"\xE1\xBE\xA9" => "\x{1FA1}",
+"\xE1\xBE\xAA" => "\x{1FA2}",
+"\xE1\xBE\xAB" => "\x{1FA3}",
+"\xE1\xBE\xAC" => "\x{1FA4}",
+"\xE1\xBE\xAD" => "\x{1FA5}",
+"\xE1\xBE\xAE" => "\x{1FA6}",
+"\xE1\xBE\xAF" => "\x{1FA7}",
+"\xE1\xBE\xBC" => "\x{1FB3}",
+"\xE1\xBF\x8C" => "\x{1FC3}",
+"\xE1\xBF\xBC" => "\x{1FF3}",
+);
+
+return <<'END';
+0041		0061
+0042		0062
+0043		0063
+0044		0064
+0045		0065
+0046		0066
+0047		0067
+0048		0068
+0049		0069
+004A		006A
+004B		006B
+004C		006C
+004D		006D
+004E		006E
+004F		006F
+0050		0070
+0051		0071
+0052		0072
+0053		0073
+0054		0074
+0055		0075
+0056		0076
+0057		0077
+0058		0078
+0059		0079
+005A		007A
+00C0		00E0
+00C1		00E1
+00C2		00E2
+00C3		00E3
+00C4		00E4
+00C5		00E5
+00C6		00E6
+00C7		00E7
+00C8		00E8
+00C9		00E9
+00CA		00EA
+00CB		00EB
+00CC		00EC
+00CD		00ED
+00CE		00EE
+00CF		00EF
+00D0		00F0
+00D1		00F1
+00D2		00F2
+00D3		00F3
+00D4		00F4
+00D5		00F5
+00D6		00F6
+00D8		00F8
+00D9		00F9
+00DA		00FA
+00DB		00FB
+00DC		00FC
+00DD		00FD
+00DE		00FE
+0100		0101
+0102		0103
+0104		0105
+0106		0107
+0108		0109
+010A		010B
+010C		010D
+010E		010F
+0110		0111
+0112		0113
+0114		0115
+0116		0117
+0118		0119
+011A		011B
+011C		011D
+011E		011F
+0120		0121
+0122		0123
+0124		0125
+0126		0127
+0128		0129
+012A		012B
+012C		012D
+012E		012F
+0132		0133
+0134		0135
+0136		0137
+0139		013A
+013B		013C
+013D		013E
+013F		0140
+0141		0142
+0143		0144
+0145		0146
+0147		0148
+014A		014B
+014C		014D
+014E		014F
+0150		0151
+0152		0153
+0154		0155
+0156		0157
+0158		0159
+015A		015B
+015C		015D
+015E		015F
+0160		0161
+0162		0163
+0164		0165
+0166		0167
+0168		0169
+016A		016B
+016C		016D
+016E		016F
+0170		0171
+0172		0173
+0174		0175
+0176		0177
+0178		00FF
+0179		017A
+017B		017C
+017D		017E
+0181		0253
+0182		0183
+0184		0185
+0186		0254
+0187		0188
+0189		0256
+018A		0257
+018B		018C
+018E		01DD
+018F		0259
+0190		025B
+0191		0192
+0193		0260
+0194		0263
+0196		0269
+0197		0268
+0198		0199
+019C		026F
+019D		0272
+019F		0275
+01A0		01A1
+01A2		01A3
+01A4		01A5
+01A6		0280
+01A7		01A8
+01A9		0283
+01AC		01AD
+01AE		0288
+01AF		01B0
+01B1		028A
+01B2		028B
+01B3		01B4
+01B5		01B6
+01B7		0292
+01B8		01B9
+01BC		01BD
+01C4		01C6
+01C5		01C6
+01C7		01C9
+01C8		01C9
+01CA		01CC
+01CB		01CC
+01CD		01CE
+01CF		01D0
+01D1		01D2
+01D3		01D4
+01D5		01D6
+01D7		01D8
+01D9		01DA
+01DB		01DC
+01DE		01DF
+01E0		01E1
+01E2		01E3
+01E4		01E5
+01E6		01E7
+01E8		01E9
+01EA		01EB
+01EC		01ED
+01EE		01EF
+01F1		01F3
+01F2		01F3
+01F4		01F5
+01F6		0195
+01F7		01BF
+01F8		01F9
+01FA		01FB
+01FC		01FD
+01FE		01FF
+0200		0201
+0202		0203
+0204		0205
+0206		0207
+0208		0209
+020A		020B
+020C		020D
+020E		020F
+0210		0211
+0212		0213
+0214		0215
+0216		0217
+0218		0219
+021A		021B
+021C		021D
+021E		021F
+0220		019E
+0222		0223
+0224		0225
+0226		0227
+0228		0229
+022A		022B
+022C		022D
+022E		022F
+0230		0231
+0232		0233
+023B		023C
+023D		019A
+0241		0294
+0386		03AC
+0388		03AD
+0389		03AE
+038A		03AF
+038C		03CC
+038E		03CD
+038F		03CE
+0391		03B1
+0392		03B2
+0393		03B3
+0394		03B4
+0395		03B5
+0396		03B6
+0397		03B7
+0398		03B8
+0399		03B9
+039A		03BA
+039B		03BB
+039C		03BC
+039D		03BD
+039E		03BE
+039F		03BF
+03A0		03C0
+03A1		03C1
+03A3		03C3
+03A4		03C4
+03A5		03C5
+03A6		03C6
+03A7		03C7
+03A8		03C8
+03A9		03C9
+03AA		03CA
+03AB		03CB
+03D8		03D9
+03DA		03DB
+03DC		03DD
+03DE		03DF
+03E0		03E1
+03E2		03E3
+03E4		03E5
+03E6		03E7
+03E8		03E9
+03EA		03EB
+03EC		03ED
+03EE		03EF
+03F4		03B8
+03F7		03F8
+03F9		03F2
+03FA		03FB
+0400		0450
+0401		0451
+0402		0452
+0403		0453
+0404		0454
+0405		0455
+0406		0456
+0407		0457
+0408		0458
+0409		0459
+040A		045A
+040B		045B
+040C		045C
+040D		045D
+040E		045E
+040F		045F
+0410		0430
+0411		0431
+0412		0432
+0413		0433
+0414		0434
+0415		0435
+0416		0436
+0417		0437
+0418		0438
+0419		0439
+041A		043A
+041B		043B
+041C		043C
+041D		043D
+041E		043E
+041F		043F
+0420		0440
+0421		0441
+0422		0442
+0423		0443
+0424		0444
+0425		0445
+0426		0446
+0427		0447
+0428		0448
+0429		0449
+042A		044A
+042B		044B
+042C		044C
+042D		044D
+042E		044E
+042F		044F
+0460		0461
+0462		0463
+0464		0465
+0466		0467
+0468		0469
+046A		046B
+046C		046D
+046E		046F
+0470		0471
+0472		0473
+0474		0475
+0476		0477
+0478		0479
+047A		047B
+047C		047D
+047E		047F
+0480		0481
+048A		048B
+048C		048D
+048E		048F
+0490		0491
+0492		0493
+0494		0495
+0496		0497
+0498		0499
+049A		049B
+049C		049D
+049E		049F
+04A0		04A1
+04A2		04A3
+04A4		04A5
+04A6		04A7
+04A8		04A9
+04AA		04AB
+04AC		04AD
+04AE		04AF
+04B0		04B1
+04B2		04B3
+04B4		04B5
+04B6		04B7
+04B8		04B9
+04BA		04BB
+04BC		04BD
+04BE		04BF
+04C1		04C2
+04C3		04C4
+04C5		04C6
+04C7		04C8
+04C9		04CA
+04CB		04CC
+04CD		04CE
+04D0		04D1
+04D2		04D3
+04D4		04D5
+04D6		04D7
+04D8		04D9
+04DA		04DB
+04DC		04DD
+04DE		04DF
+04E0		04E1
+04E2		04E3
+04E4		04E5
+04E6		04E7
+04E8		04E9
+04EA		04EB
+04EC		04ED
+04EE		04EF
+04F0		04F1
+04F2		04F3
+04F4		04F5
+04F6		04F7
+04F8		04F9
+0500		0501
+0502		0503
+0504		0505
+0506		0507
+0508		0509
+050A		050B
+050C		050D
+050E		050F
+0531		0561
+0532		0562
+0533		0563
+0534		0564
+0535		0565
+0536		0566
+0537		0567
+0538		0568
+0539		0569
+053A		056A
+053B		056B
+053C		056C
+053D		056D
+053E		056E
+053F		056F
+0540		0570
+0541		0571
+0542		0572
+0543		0573
+0544		0574
+0545		0575
+0546		0576
+0547		0577
+0548		0578
+0549		0579
+054A		057A
+054B		057B
+054C		057C
+054D		057D
+054E		057E
+054F		057F
+0550		0580
+0551		0581
+0552		0582
+0553		0583
+0554		0584
+0555		0585
+0556		0586
+10A0		2D00
+10A1		2D01
+10A2		2D02
+10A3		2D03
+10A4		2D04
+10A5		2D05
+10A6		2D06
+10A7		2D07
+10A8		2D08
+10A9		2D09
+10AA		2D0A
+10AB		2D0B
+10AC		2D0C
+10AD		2D0D
+10AE		2D0E
+10AF		2D0F
+10B0		2D10
+10B1		2D11
+10B2		2D12
+10B3		2D13
+10B4		2D14
+10B5		2D15
+10B6		2D16
+10B7		2D17
+10B8		2D18
+10B9		2D19
+10BA		2D1A
+10BB		2D1B
+10BC		2D1C
+10BD		2D1D
+10BE		2D1E
+10BF		2D1F
+10C0		2D20
+10C1		2D21
+10C2		2D22
+10C3		2D23
+10C4		2D24
+10C5		2D25
+1E00		1E01
+1E02		1E03
+1E04		1E05
+1E06		1E07
+1E08		1E09
+1E0A		1E0B
+1E0C		1E0D
+1E0E		1E0F
+1E10		1E11
+1E12		1E13
+1E14		1E15
+1E16		1E17
+1E18		1E19
+1E1A		1E1B
+1E1C		1E1D
+1E1E		1E1F
+1E20		1E21
+1E22		1E23
+1E24		1E25
+1E26		1E27
+1E28		1E29
+1E2A		1E2B
+1E2C		1E2D
+1E2E		1E2F
+1E30		1E31
+1E32		1E33
+1E34		1E35
+1E36		1E37
+1E38		1E39
+1E3A		1E3B
+1E3C		1E3D
+1E3E		1E3F
+1E40		1E41
+1E42		1E43
+1E44		1E45
+1E46		1E47
+1E48		1E49
+1E4A		1E4B
+1E4C		1E4D
+1E4E		1E4F
+1E50		1E51
+1E52		1E53
+1E54		1E55
+1E56		1E57
+1E58		1E59
+1E5A		1E5B
+1E5C		1E5D
+1E5E		1E5F
+1E60		1E61
+1E62		1E63
+1E64		1E65
+1E66		1E67
+1E68		1E69
+1E6A		1E6B
+1E6C		1E6D
+1E6E		1E6F
+1E70		1E71
+1E72		1E73
+1E74		1E75
+1E76		1E77
+1E78		1E79
+1E7A		1E7B
+1E7C		1E7D
+1E7E		1E7F
+1E80		1E81
+1E82		1E83
+1E84		1E85
+1E86		1E87
+1E88		1E89
+1E8A		1E8B
+1E8C		1E8D
+1E8E		1E8F
+1E90		1E91
+1E92		1E93
+1E94		1E95
+1EA0		1EA1
+1EA2		1EA3
+1EA4		1EA5
+1EA6		1EA7
+1EA8		1EA9
+1EAA		1EAB
+1EAC		1EAD
+1EAE		1EAF
+1EB0		1EB1
+1EB2		1EB3
+1EB4		1EB5
+1EB6		1EB7
+1EB8		1EB9
+1EBA		1EBB
+1EBC		1EBD
+1EBE		1EBF
+1EC0		1EC1
+1EC2		1EC3
+1EC4		1EC5
+1EC6		1EC7
+1EC8		1EC9
+1ECA		1ECB
+1ECC		1ECD
+1ECE		1ECF
+1ED0		1ED1
+1ED2		1ED3
+1ED4		1ED5
+1ED6		1ED7
+1ED8		1ED9
+1EDA		1EDB
+1EDC		1EDD
+1EDE		1EDF
+1EE0		1EE1
+1EE2		1EE3
+1EE4		1EE5
+1EE6		1EE7
+1EE8		1EE9
+1EEA		1EEB
+1EEC		1EED
+1EEE		1EEF
+1EF0		1EF1
+1EF2		1EF3
+1EF4		1EF5
+1EF6		1EF7
+1EF8		1EF9
+1F08		1F00
+1F09		1F01
+1F0A		1F02
+1F0B		1F03
+1F0C		1F04
+1F0D		1F05
+1F0E		1F06
+1F0F		1F07
+1F18		1F10
+1F19		1F11
+1F1A		1F12
+1F1B		1F13
+1F1C		1F14
+1F1D		1F15
+1F28		1F20
+1F29		1F21
+1F2A		1F22
+1F2B		1F23
+1F2C		1F24
+1F2D		1F25
+1F2E		1F26
+1F2F		1F27
+1F38		1F30
+1F39		1F31
+1F3A		1F32
+1F3B		1F33
+1F3C		1F34
+1F3D		1F35
+1F3E		1F36
+1F3F		1F37
+1F48		1F40
+1F49		1F41
+1F4A		1F42
+1F4B		1F43
+1F4C		1F44
+1F4D		1F45
+1F59		1F51
+1F5B		1F53
+1F5D		1F55
+1F5F		1F57
+1F68		1F60
+1F69		1F61
+1F6A		1F62
+1F6B		1F63
+1F6C		1F64
+1F6D		1F65
+1F6E		1F66
+1F6F		1F67
+1FB8		1FB0
+1FB9		1FB1
+1FBA		1F70
+1FBB		1F71
+1FC8		1F72
+1FC9		1F73
+1FCA		1F74
+1FCB		1F75
+1FD8		1FD0
+1FD9		1FD1
+1FDA		1F76
+1FDB		1F77
+1FE8		1FE0
+1FE9		1FE1
+1FEA		1F7A
+1FEB		1F7B
+1FEC		1FE5
+1FF8		1F78
+1FF9		1F79
+1FFA		1F7C
+1FFB		1F7D
+2126		03C9
+212A		006B
+212B		00E5
+2160		2170
+2161		2171
+2162		2172
+2163		2173
+2164		2174
+2165		2175
+2166		2176
+2167		2177
+2168		2178
+2169		2179
+216A		217A
+216B		217B
+216C		217C
+216D		217D
+216E		217E
+216F		217F
+24B6		24D0
+24B7		24D1
+24B8		24D2
+24B9		24D3
+24BA		24D4
+24BB		24D5
+24BC		24D6
+24BD		24D7
+24BE		24D8
+24BF		24D9
+24C0		24DA
+24C1		24DB
+24C2		24DC
+24C3		24DD
+24C4		24DE
+24C5		24DF
+24C6		24E0
+24C7		24E1
+24C8		24E2
+24C9		24E3
+24CA		24E4
+24CB		24E5
+24CC		24E6
+24CD		24E7
+24CE		24E8
+24CF		24E9
+2C00		2C30
+2C01		2C31
+2C02		2C32
+2C03		2C33
+2C04		2C34
+2C05		2C35
+2C06		2C36
+2C07		2C37
+2C08		2C38
+2C09		2C39
+2C0A		2C3A
+2C0B		2C3B
+2C0C		2C3C
+2C0D		2C3D
+2C0E		2C3E
+2C0F		2C3F
+2C10		2C40
+2C11		2C41
+2C12		2C42
+2C13		2C43
+2C14		2C44
+2C15		2C45
+2C16		2C46
+2C17		2C47
+2C18		2C48
+2C19		2C49
+2C1A		2C4A
+2C1B		2C4B
+2C1C		2C4C
+2C1D		2C4D
+2C1E		2C4E
+2C1F		2C4F
+2C20		2C50
+2C21		2C51
+2C22		2C52
+2C23		2C53
+2C24		2C54
+2C25		2C55
+2C26		2C56
+2C27		2C57
+2C28		2C58
+2C29		2C59
+2C2A		2C5A
+2C2B		2C5B
+2C2C		2C5C
+2C2D		2C5D
+2C2E		2C5E
+2C80		2C81
+2C82		2C83
+2C84		2C85
+2C86		2C87
+2C88		2C89
+2C8A		2C8B
+2C8C		2C8D
+2C8E		2C8F
+2C90		2C91
+2C92		2C93
+2C94		2C95
+2C96		2C97
+2C98		2C99
+2C9A		2C9B
+2C9C		2C9D
+2C9E		2C9F
+2CA0		2CA1
+2CA2		2CA3
+2CA4		2CA5
+2CA6		2CA7
+2CA8		2CA9
+2CAA		2CAB
+2CAC		2CAD
+2CAE		2CAF
+2CB0		2CB1
+2CB2		2CB3
+2CB4		2CB5
+2CB6		2CB7
+2CB8		2CB9
+2CBA		2CBB
+2CBC		2CBD
+2CBE		2CBF
+2CC0		2CC1
+2CC2		2CC3
+2CC4		2CC5
+2CC6		2CC7
+2CC8		2CC9
+2CCA		2CCB
+2CCC		2CCD
+2CCE		2CCF
+2CD0		2CD1
+2CD2		2CD3
+2CD4		2CD5
+2CD6		2CD7
+2CD8		2CD9
+2CDA		2CDB
+2CDC		2CDD
+2CDE		2CDF
+2CE0		2CE1
+2CE2		2CE3
+FF21		FF41
+FF22		FF42
+FF23		FF43
+FF24		FF44
+FF25		FF45
+FF26		FF46
+FF27		FF47
+FF28		FF48
+FF29		FF49
+FF2A		FF4A
+FF2B		FF4B
+FF2C		FF4C
+FF2D		FF4D
+FF2E		FF4E
+FF2F		FF4F
+FF30		FF50
+FF31		FF51
+FF32		FF52
+FF33		FF53
+FF34		FF54
+FF35		FF55
+FF36		FF56
+FF37		FF57
+FF38		FF58
+FF39		FF59
+FF3A		FF5A
+10400		10428
+10401		10429
+10402		1042A
+10403		1042B
+10404		1042C
+10405		1042D
+10406		1042E
+10407		1042F
+10408		10430
+10409		10431
+1040A		10432
+1040B		10433
+1040C		10434
+1040D		10435
+1040E		10436
+1040F		10437
+10410		10438
+10411		10439
+10412		1043A
+10413		1043B
+10414		1043C
+10415		1043D
+10416		1043E
+10417		1043F
+10418		10440
+10419		10441
+1041A		10442
+1041B		10443
+1041C		10444
+1041D		10445
+1041E		10446
+1041F		10447
+10420		10448
+10421		10449
+10422		1044A
+10423		1044B
+10424		1044C
+10425		1044D
+10426		1044E
+10427		1044F
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Title.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Title.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Title.pl	(revision 14489)
@@ -0,0 +1,966 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+
+# The key UTF-8 _bytes_, the value UTF-8 (speed hack)
+%utf8::ToSpecTitle =
+(
+"\xC3\x9F" => "\x{0053}\x{0073}",
+"\xC5\x89" => "\x{02BC}\x{004E}",
+"\xC7\xB0" => "\x{004A}\x{030C}",
+"\xCE\x90" => "\x{0399}\x{0308}\x{0301}",
+"\xCE\xB0" => "\x{03A5}\x{0308}\x{0301}",
+"\xD6\x87" => "\x{0535}\x{0582}",
+"\xE1\xBA\x96" => "\x{0048}\x{0331}",
+"\xE1\xBA\x97" => "\x{0054}\x{0308}",
+"\xE1\xBA\x98" => "\x{0057}\x{030A}",
+"\xE1\xBA\x99" => "\x{0059}\x{030A}",
+"\xE1\xBA\x9A" => "\x{0041}\x{02BE}",
+"\xE1\xBD\x90" => "\x{03A5}\x{0313}",
+"\xE1\xBD\x92" => "\x{03A5}\x{0313}\x{0300}",
+"\xE1\xBD\x94" => "\x{03A5}\x{0313}\x{0301}",
+"\xE1\xBD\x96" => "\x{03A5}\x{0313}\x{0342}",
+"\xE1\xBE\x80" => "\x{1F88}",
+"\xE1\xBE\x81" => "\x{1F89}",
+"\xE1\xBE\x82" => "\x{1F8A}",
+"\xE1\xBE\x83" => "\x{1F8B}",
+"\xE1\xBE\x84" => "\x{1F8C}",
+"\xE1\xBE\x85" => "\x{1F8D}",
+"\xE1\xBE\x86" => "\x{1F8E}",
+"\xE1\xBE\x87" => "\x{1F8F}",
+"\xE1\xBE\x90" => "\x{1F98}",
+"\xE1\xBE\x91" => "\x{1F99}",
+"\xE1\xBE\x92" => "\x{1F9A}",
+"\xE1\xBE\x93" => "\x{1F9B}",
+"\xE1\xBE\x94" => "\x{1F9C}",
+"\xE1\xBE\x95" => "\x{1F9D}",
+"\xE1\xBE\x96" => "\x{1F9E}",
+"\xE1\xBE\x97" => "\x{1F9F}",
+"\xE1\xBE\xA0" => "\x{1FA8}",
+"\xE1\xBE\xA1" => "\x{1FA9}",
+"\xE1\xBE\xA2" => "\x{1FAA}",
+"\xE1\xBE\xA3" => "\x{1FAB}",
+"\xE1\xBE\xA4" => "\x{1FAC}",
+"\xE1\xBE\xA5" => "\x{1FAD}",
+"\xE1\xBE\xA6" => "\x{1FAE}",
+"\xE1\xBE\xA7" => "\x{1FAF}",
+"\xE1\xBE\xB2" => "\x{1FBA}\x{0345}",
+"\xE1\xBE\xB3" => "\x{1FBC}",
+"\xE1\xBE\xB4" => "\x{0386}\x{0345}",
+"\xE1\xBE\xB6" => "\x{0391}\x{0342}",
+"\xE1\xBE\xB7" => "\x{0391}\x{0342}\x{0345}",
+"\xE1\xBF\x82" => "\x{1FCA}\x{0345}",
+"\xE1\xBF\x83" => "\x{1FCC}",
+"\xE1\xBF\x84" => "\x{0389}\x{0345}",
+"\xE1\xBF\x86" => "\x{0397}\x{0342}",
+"\xE1\xBF\x87" => "\x{0397}\x{0342}\x{0345}",
+"\xE1\xBF\x92" => "\x{0399}\x{0308}\x{0300}",
+"\xE1\xBF\x93" => "\x{0399}\x{0308}\x{0301}",
+"\xE1\xBF\x96" => "\x{0399}\x{0342}",
+"\xE1\xBF\x97" => "\x{0399}\x{0308}\x{0342}",
+"\xE1\xBF\xA2" => "\x{03A5}\x{0308}\x{0300}",
+"\xE1\xBF\xA3" => "\x{03A5}\x{0308}\x{0301}",
+"\xE1\xBF\xA4" => "\x{03A1}\x{0313}",
+"\xE1\xBF\xA6" => "\x{03A5}\x{0342}",
+"\xE1\xBF\xA7" => "\x{03A5}\x{0308}\x{0342}",
+"\xE1\xBF\xB2" => "\x{1FFA}\x{0345}",
+"\xE1\xBF\xB3" => "\x{1FFC}",
+"\xE1\xBF\xB4" => "\x{038F}\x{0345}",
+"\xE1\xBF\xB6" => "\x{03A9}\x{0342}",
+"\xE1\xBF\xB7" => "\x{03A9}\x{0342}\x{0345}",
+"\xEF\xAC\x80" => "\x{0046}\x{0066}",
+"\xEF\xAC\x81" => "\x{0046}\x{0069}",
+"\xEF\xAC\x82" => "\x{0046}\x{006C}",
+"\xEF\xAC\x83" => "\x{0046}\x{0066}\x{0069}",
+"\xEF\xAC\x84" => "\x{0046}\x{0066}\x{006C}",
+"\xEF\xAC\x85" => "\x{0053}\x{0074}",
+"\xEF\xAC\x86" => "\x{0053}\x{0074}",
+"\xEF\xAC\x93" => "\x{0544}\x{0576}",
+"\xEF\xAC\x94" => "\x{0544}\x{0565}",
+"\xEF\xAC\x95" => "\x{0544}\x{056B}",
+"\xEF\xAC\x96" => "\x{054E}\x{0576}",
+"\xEF\xAC\x97" => "\x{0544}\x{056D}",
+);
+
+return <<'END';
+0061		0041
+0062		0042
+0063		0043
+0064		0044
+0065		0045
+0066		0046
+0067		0047
+0068		0048
+0069		0049
+006A		004A
+006B		004B
+006C		004C
+006D		004D
+006E		004E
+006F		004F
+0070		0050
+0071		0051
+0072		0052
+0073		0053
+0074		0054
+0075		0055
+0076		0056
+0077		0057
+0078		0058
+0079		0059
+007A		005A
+00B5		039C
+00E0		00C0
+00E1		00C1
+00E2		00C2
+00E3		00C3
+00E4		00C4
+00E5		00C5
+00E6		00C6
+00E7		00C7
+00E8		00C8
+00E9		00C9
+00EA		00CA
+00EB		00CB
+00EC		00CC
+00ED		00CD
+00EE		00CE
+00EF		00CF
+00F0		00D0
+00F1		00D1
+00F2		00D2
+00F3		00D3
+00F4		00D4
+00F5		00D5
+00F6		00D6
+00F8		00D8
+00F9		00D9
+00FA		00DA
+00FB		00DB
+00FC		00DC
+00FD		00DD
+00FE		00DE
+00FF		0178
+0101		0100
+0103		0102
+0105		0104
+0107		0106
+0109		0108
+010B		010A
+010D		010C
+010F		010E
+0111		0110
+0113		0112
+0115		0114
+0117		0116
+0119		0118
+011B		011A
+011D		011C
+011F		011E
+0121		0120
+0123		0122
+0125		0124
+0127		0126
+0129		0128
+012B		012A
+012D		012C
+012F		012E
+0131		0049
+0133		0132
+0135		0134
+0137		0136
+013A		0139
+013C		013B
+013E		013D
+0140		013F
+0142		0141
+0144		0143
+0146		0145
+0148		0147
+014B		014A
+014D		014C
+014F		014E
+0151		0150
+0153		0152
+0155		0154
+0157		0156
+0159		0158
+015B		015A
+015D		015C
+015F		015E
+0161		0160
+0163		0162
+0165		0164
+0167		0166
+0169		0168
+016B		016A
+016D		016C
+016F		016E
+0171		0170
+0173		0172
+0175		0174
+0177		0176
+017A		0179
+017C		017B
+017E		017D
+017F		0053
+0183		0182
+0185		0184
+0188		0187
+018C		018B
+0192		0191
+0195		01F6
+0199		0198
+019A		023D
+019E		0220
+01A1		01A0
+01A3		01A2
+01A5		01A4
+01A8		01A7
+01AD		01AC
+01B0		01AF
+01B4		01B3
+01B6		01B5
+01B9		01B8
+01BD		01BC
+01BF		01F7
+01C4		01C5
+01C5		01C5
+01C6		01C5
+01C7		01C8
+01C8		01C8
+01C9		01C8
+01CA		01CB
+01CB		01CB
+01CC		01CB
+01CE		01CD
+01D0		01CF
+01D2		01D1
+01D4		01D3
+01D6		01D5
+01D8		01D7
+01DA		01D9
+01DC		01DB
+01DD		018E
+01DF		01DE
+01E1		01E0
+01E3		01E2
+01E5		01E4
+01E7		01E6
+01E9		01E8
+01EB		01EA
+01ED		01EC
+01EF		01EE
+01F1		01F2
+01F2		01F2
+01F3		01F2
+01F5		01F4
+01F9		01F8
+01FB		01FA
+01FD		01FC
+01FF		01FE
+0201		0200
+0203		0202
+0205		0204
+0207		0206
+0209		0208
+020B		020A
+020D		020C
+020F		020E
+0211		0210
+0213		0212
+0215		0214
+0217		0216
+0219		0218
+021B		021A
+021D		021C
+021F		021E
+0223		0222
+0225		0224
+0227		0226
+0229		0228
+022B		022A
+022D		022C
+022F		022E
+0231		0230
+0233		0232
+023C		023B
+0253		0181
+0254		0186
+0256		0189
+0257		018A
+0259		018F
+025B		0190
+0260		0193
+0263		0194
+0268		0197
+0269		0196
+026F		019C
+0272		019D
+0275		019F
+0280		01A6
+0283		01A9
+0288		01AE
+028A		01B1
+028B		01B2
+0292		01B7
+0294		0241
+0345		0399
+03AC		0386
+03AD		0388
+03AE		0389
+03AF		038A
+03B1		0391
+03B2		0392
+03B3		0393
+03B4		0394
+03B5		0395
+03B6		0396
+03B7		0397
+03B8		0398
+03B9		0399
+03BA		039A
+03BB		039B
+03BC		039C
+03BD		039D
+03BE		039E
+03BF		039F
+03C0		03A0
+03C1		03A1
+03C2		03A3
+03C3		03A3
+03C4		03A4
+03C5		03A5
+03C6		03A6
+03C7		03A7
+03C8		03A8
+03C9		03A9
+03CA		03AA
+03CB		03AB
+03CC		038C
+03CD		038E
+03CE		038F
+03D0		0392
+03D1		0398
+03D5		03A6
+03D6		03A0
+03D9		03D8
+03DB		03DA
+03DD		03DC
+03DF		03DE
+03E1		03E0
+03E3		03E2
+03E5		03E4
+03E7		03E6
+03E9		03E8
+03EB		03EA
+03ED		03EC
+03EF		03EE
+03F0		039A
+03F1		03A1
+03F2		03F9
+03F5		0395
+03F8		03F7
+03FB		03FA
+0430		0410
+0431		0411
+0432		0412
+0433		0413
+0434		0414
+0435		0415
+0436		0416
+0437		0417
+0438		0418
+0439		0419
+043A		041A
+043B		041B
+043C		041C
+043D		041D
+043E		041E
+043F		041F
+0440		0420
+0441		0421
+0442		0422
+0443		0423
+0444		0424
+0445		0425
+0446		0426
+0447		0427
+0448		0428
+0449		0429
+044A		042A
+044B		042B
+044C		042C
+044D		042D
+044E		042E
+044F		042F
+0450		0400
+0451		0401
+0452		0402
+0453		0403
+0454		0404
+0455		0405
+0456		0406
+0457		0407
+0458		0408
+0459		0409
+045A		040A
+045B		040B
+045C		040C
+045D		040D
+045E		040E
+045F		040F
+0461		0460
+0463		0462
+0465		0464
+0467		0466
+0469		0468
+046B		046A
+046D		046C
+046F		046E
+0471		0470
+0473		0472
+0475		0474
+0477		0476
+0479		0478
+047B		047A
+047D		047C
+047F		047E
+0481		0480
+048B		048A
+048D		048C
+048F		048E
+0491		0490
+0493		0492
+0495		0494
+0497		0496
+0499		0498
+049B		049A
+049D		049C
+049F		049E
+04A1		04A0
+04A3		04A2
+04A5		04A4
+04A7		04A6
+04A9		04A8
+04AB		04AA
+04AD		04AC
+04AF		04AE
+04B1		04B0
+04B3		04B2
+04B5		04B4
+04B7		04B6
+04B9		04B8
+04BB		04BA
+04BD		04BC
+04BF		04BE
+04C2		04C1
+04C4		04C3
+04C6		04C5
+04C8		04C7
+04CA		04C9
+04CC		04CB
+04CE		04CD
+04D1		04D0
+04D3		04D2
+04D5		04D4
+04D7		04D6
+04D9		04D8
+04DB		04DA
+04DD		04DC
+04DF		04DE
+04E1		04E0
+04E3		04E2
+04E5		04E4
+04E7		04E6
+04E9		04E8
+04EB		04EA
+04ED		04EC
+04EF		04EE
+04F1		04F0
+04F3		04F2
+04F5		04F4
+04F7		04F6
+04F9		04F8
+0501		0500
+0503		0502
+0505		0504
+0507		0506
+0509		0508
+050B		050A
+050D		050C
+050F		050E
+0561		0531
+0562		0532
+0563		0533
+0564		0534
+0565		0535
+0566		0536
+0567		0537
+0568		0538
+0569		0539
+056A		053A
+056B		053B
+056C		053C
+056D		053D
+056E		053E
+056F		053F
+0570		0540
+0571		0541
+0572		0542
+0573		0543
+0574		0544
+0575		0545
+0576		0546
+0577		0547
+0578		0548
+0579		0549
+057A		054A
+057B		054B
+057C		054C
+057D		054D
+057E		054E
+057F		054F
+0580		0550
+0581		0551
+0582		0552
+0583		0553
+0584		0554
+0585		0555
+0586		0556
+1E01		1E00
+1E03		1E02
+1E05		1E04
+1E07		1E06
+1E09		1E08
+1E0B		1E0A
+1E0D		1E0C
+1E0F		1E0E
+1E11		1E10
+1E13		1E12
+1E15		1E14
+1E17		1E16
+1E19		1E18
+1E1B		1E1A
+1E1D		1E1C
+1E1F		1E1E
+1E21		1E20
+1E23		1E22
+1E25		1E24
+1E27		1E26
+1E29		1E28
+1E2B		1E2A
+1E2D		1E2C
+1E2F		1E2E
+1E31		1E30
+1E33		1E32
+1E35		1E34
+1E37		1E36
+1E39		1E38
+1E3B		1E3A
+1E3D		1E3C
+1E3F		1E3E
+1E41		1E40
+1E43		1E42
+1E45		1E44
+1E47		1E46
+1E49		1E48
+1E4B		1E4A
+1E4D		1E4C
+1E4F		1E4E
+1E51		1E50
+1E53		1E52
+1E55		1E54
+1E57		1E56
+1E59		1E58
+1E5B		1E5A
+1E5D		1E5C
+1E5F		1E5E
+1E61		1E60
+1E63		1E62
+1E65		1E64
+1E67		1E66
+1E69		1E68
+1E6B		1E6A
+1E6D		1E6C
+1E6F		1E6E
+1E71		1E70
+1E73		1E72
+1E75		1E74
+1E77		1E76
+1E79		1E78
+1E7B		1E7A
+1E7D		1E7C
+1E7F		1E7E
+1E81		1E80
+1E83		1E82
+1E85		1E84
+1E87		1E86
+1E89		1E88
+1E8B		1E8A
+1E8D		1E8C
+1E8F		1E8E
+1E91		1E90
+1E93		1E92
+1E95		1E94
+1E9B		1E60
+1EA1		1EA0
+1EA3		1EA2
+1EA5		1EA4
+1EA7		1EA6
+1EA9		1EA8
+1EAB		1EAA
+1EAD		1EAC
+1EAF		1EAE
+1EB1		1EB0
+1EB3		1EB2
+1EB5		1EB4
+1EB7		1EB6
+1EB9		1EB8
+1EBB		1EBA
+1EBD		1EBC
+1EBF		1EBE
+1EC1		1EC0
+1EC3		1EC2
+1EC5		1EC4
+1EC7		1EC6
+1EC9		1EC8
+1ECB		1ECA
+1ECD		1ECC
+1ECF		1ECE
+1ED1		1ED0
+1ED3		1ED2
+1ED5		1ED4
+1ED7		1ED6
+1ED9		1ED8
+1EDB		1EDA
+1EDD		1EDC
+1EDF		1EDE
+1EE1		1EE0
+1EE3		1EE2
+1EE5		1EE4
+1EE7		1EE6
+1EE9		1EE8
+1EEB		1EEA
+1EED		1EEC
+1EEF		1EEE
+1EF1		1EF0
+1EF3		1EF2
+1EF5		1EF4
+1EF7		1EF6
+1EF9		1EF8
+1F00		1F08
+1F01		1F09
+1F02		1F0A
+1F03		1F0B
+1F04		1F0C
+1F05		1F0D
+1F06		1F0E
+1F07		1F0F
+1F10		1F18
+1F11		1F19
+1F12		1F1A
+1F13		1F1B
+1F14		1F1C
+1F15		1F1D
+1F20		1F28
+1F21		1F29
+1F22		1F2A
+1F23		1F2B
+1F24		1F2C
+1F25		1F2D
+1F26		1F2E
+1F27		1F2F
+1F30		1F38
+1F31		1F39
+1F32		1F3A
+1F33		1F3B
+1F34		1F3C
+1F35		1F3D
+1F36		1F3E
+1F37		1F3F
+1F40		1F48
+1F41		1F49
+1F42		1F4A
+1F43		1F4B
+1F44		1F4C
+1F45		1F4D
+1F51		1F59
+1F53		1F5B
+1F55		1F5D
+1F57		1F5F
+1F60		1F68
+1F61		1F69
+1F62		1F6A
+1F63		1F6B
+1F64		1F6C
+1F65		1F6D
+1F66		1F6E
+1F67		1F6F
+1F70		1FBA
+1F71		1FBB
+1F72		1FC8
+1F73		1FC9
+1F74		1FCA
+1F75		1FCB
+1F76		1FDA
+1F77		1FDB
+1F78		1FF8
+1F79		1FF9
+1F7A		1FEA
+1F7B		1FEB
+1F7C		1FFA
+1F7D		1FFB
+1FB0		1FB8
+1FB1		1FB9
+1FBE		0399
+1FD0		1FD8
+1FD1		1FD9
+1FE0		1FE8
+1FE1		1FE9
+1FE5		1FEC
+2170		2160
+2171		2161
+2172		2162
+2173		2163
+2174		2164
+2175		2165
+2176		2166
+2177		2167
+2178		2168
+2179		2169
+217A		216A
+217B		216B
+217C		216C
+217D		216D
+217E		216E
+217F		216F
+24D0		24B6
+24D1		24B7
+24D2		24B8
+24D3		24B9
+24D4		24BA
+24D5		24BB
+24D6		24BC
+24D7		24BD
+24D8		24BE
+24D9		24BF
+24DA		24C0
+24DB		24C1
+24DC		24C2
+24DD		24C3
+24DE		24C4
+24DF		24C5
+24E0		24C6
+24E1		24C7
+24E2		24C8
+24E3		24C9
+24E4		24CA
+24E5		24CB
+24E6		24CC
+24E7		24CD
+24E8		24CE
+24E9		24CF
+2C30		2C00
+2C31		2C01
+2C32		2C02
+2C33		2C03
+2C34		2C04
+2C35		2C05
+2C36		2C06
+2C37		2C07
+2C38		2C08
+2C39		2C09
+2C3A		2C0A
+2C3B		2C0B
+2C3C		2C0C
+2C3D		2C0D
+2C3E		2C0E
+2C3F		2C0F
+2C40		2C10
+2C41		2C11
+2C42		2C12
+2C43		2C13
+2C44		2C14
+2C45		2C15
+2C46		2C16
+2C47		2C17
+2C48		2C18
+2C49		2C19
+2C4A		2C1A
+2C4B		2C1B
+2C4C		2C1C
+2C4D		2C1D
+2C4E		2C1E
+2C4F		2C1F
+2C50		2C20
+2C51		2C21
+2C52		2C22
+2C53		2C23
+2C54		2C24
+2C55		2C25
+2C56		2C26
+2C57		2C27
+2C58		2C28
+2C59		2C29
+2C5A		2C2A
+2C5B		2C2B
+2C5C		2C2C
+2C5D		2C2D
+2C5E		2C2E
+2C81		2C80
+2C83		2C82
+2C85		2C84
+2C87		2C86
+2C89		2C88
+2C8B		2C8A
+2C8D		2C8C
+2C8F		2C8E
+2C91		2C90
+2C93		2C92
+2C95		2C94
+2C97		2C96
+2C99		2C98
+2C9B		2C9A
+2C9D		2C9C
+2C9F		2C9E
+2CA1		2CA0
+2CA3		2CA2
+2CA5		2CA4
+2CA7		2CA6
+2CA9		2CA8
+2CAB		2CAA
+2CAD		2CAC
+2CAF		2CAE
+2CB1		2CB0
+2CB3		2CB2
+2CB5		2CB4
+2CB7		2CB6
+2CB9		2CB8
+2CBB		2CBA
+2CBD		2CBC
+2CBF		2CBE
+2CC1		2CC0
+2CC3		2CC2
+2CC5		2CC4
+2CC7		2CC6
+2CC9		2CC8
+2CCB		2CCA
+2CCD		2CCC
+2CCF		2CCE
+2CD1		2CD0
+2CD3		2CD2
+2CD5		2CD4
+2CD7		2CD6
+2CD9		2CD8
+2CDB		2CDA
+2CDD		2CDC
+2CDF		2CDE
+2CE1		2CE0
+2CE3		2CE2
+2D00		10A0
+2D01		10A1
+2D02		10A2
+2D03		10A3
+2D04		10A4
+2D05		10A5
+2D06		10A6
+2D07		10A7
+2D08		10A8
+2D09		10A9
+2D0A		10AA
+2D0B		10AB
+2D0C		10AC
+2D0D		10AD
+2D0E		10AE
+2D0F		10AF
+2D10		10B0
+2D11		10B1
+2D12		10B2
+2D13		10B3
+2D14		10B4
+2D15		10B5
+2D16		10B6
+2D17		10B7
+2D18		10B8
+2D19		10B9
+2D1A		10BA
+2D1B		10BB
+2D1C		10BC
+2D1D		10BD
+2D1E		10BE
+2D1F		10BF
+2D20		10C0
+2D21		10C1
+2D22		10C2
+2D23		10C3
+2D24		10C4
+2D25		10C5
+FF41		FF21
+FF42		FF22
+FF43		FF23
+FF44		FF24
+FF45		FF25
+FF46		FF26
+FF47		FF27
+FF48		FF28
+FF49		FF29
+FF4A		FF2A
+FF4B		FF2B
+FF4C		FF2C
+FF4D		FF2D
+FF4E		FF2E
+FF4F		FF2F
+FF50		FF30
+FF51		FF31
+FF52		FF32
+FF53		FF33
+FF54		FF34
+FF55		FF35
+FF56		FF36
+FF57		FF37
+FF58		FF38
+FF59		FF39
+FF5A		FF3A
+10428		10400
+10429		10401
+1042A		10402
+1042B		10403
+1042C		10404
+1042D		10405
+1042E		10406
+1042F		10407
+10430		10408
+10431		10409
+10432		1040A
+10433		1040B
+10434		1040C
+10435		1040D
+10436		1040E
+10437		1040F
+10438		10410
+10439		10411
+1043A		10412
+1043B		10413
+1043C		10414
+1043D		10415
+1043E		10416
+1043F		10417
+10440		10418
+10441		10419
+10442		1041A
+10443		1041B
+10444		1041C
+10445		1041D
+10446		1041E
+10447		1041F
+10448		10420
+10449		10421
+1044A		10422
+1044B		10423
+1044C		10424
+1044D		10425
+1044E		10426
+1044F		10427
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Upper.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Upper.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/To/Upper.pl	(revision 14489)
@@ -0,0 +1,989 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+
+# The key UTF-8 _bytes_, the value UTF-8 (speed hack)
+%utf8::ToSpecUpper =
+(
+"\xC3\x9F" => "\x{0053}\x{0053}",
+"\xC5\x89" => "\x{02BC}\x{004E}",
+"\xC7\xB0" => "\x{004A}\x{030C}",
+"\xCE\x90" => "\x{0399}\x{0308}\x{0301}",
+"\xCE\xB0" => "\x{03A5}\x{0308}\x{0301}",
+"\xD6\x87" => "\x{0535}\x{0552}",
+"\xE1\xBA\x96" => "\x{0048}\x{0331}",
+"\xE1\xBA\x97" => "\x{0054}\x{0308}",
+"\xE1\xBA\x98" => "\x{0057}\x{030A}",
+"\xE1\xBA\x99" => "\x{0059}\x{030A}",
+"\xE1\xBA\x9A" => "\x{0041}\x{02BE}",
+"\xE1\xBD\x90" => "\x{03A5}\x{0313}",
+"\xE1\xBD\x92" => "\x{03A5}\x{0313}\x{0300}",
+"\xE1\xBD\x94" => "\x{03A5}\x{0313}\x{0301}",
+"\xE1\xBD\x96" => "\x{03A5}\x{0313}\x{0342}",
+"\xE1\xBE\x80" => "\x{1F08}\x{0399}",
+"\xE1\xBE\x81" => "\x{1F09}\x{0399}",
+"\xE1\xBE\x82" => "\x{1F0A}\x{0399}",
+"\xE1\xBE\x83" => "\x{1F0B}\x{0399}",
+"\xE1\xBE\x84" => "\x{1F0C}\x{0399}",
+"\xE1\xBE\x85" => "\x{1F0D}\x{0399}",
+"\xE1\xBE\x86" => "\x{1F0E}\x{0399}",
+"\xE1\xBE\x87" => "\x{1F0F}\x{0399}",
+"\xE1\xBE\x88" => "\x{1F08}\x{0399}",
+"\xE1\xBE\x89" => "\x{1F09}\x{0399}",
+"\xE1\xBE\x8A" => "\x{1F0A}\x{0399}",
+"\xE1\xBE\x8B" => "\x{1F0B}\x{0399}",
+"\xE1\xBE\x8C" => "\x{1F0C}\x{0399}",
+"\xE1\xBE\x8D" => "\x{1F0D}\x{0399}",
+"\xE1\xBE\x8E" => "\x{1F0E}\x{0399}",
+"\xE1\xBE\x8F" => "\x{1F0F}\x{0399}",
+"\xE1\xBE\x90" => "\x{1F28}\x{0399}",
+"\xE1\xBE\x91" => "\x{1F29}\x{0399}",
+"\xE1\xBE\x92" => "\x{1F2A}\x{0399}",
+"\xE1\xBE\x93" => "\x{1F2B}\x{0399}",
+"\xE1\xBE\x94" => "\x{1F2C}\x{0399}",
+"\xE1\xBE\x95" => "\x{1F2D}\x{0399}",
+"\xE1\xBE\x96" => "\x{1F2E}\x{0399}",
+"\xE1\xBE\x97" => "\x{1F2F}\x{0399}",
+"\xE1\xBE\x98" => "\x{1F28}\x{0399}",
+"\xE1\xBE\x99" => "\x{1F29}\x{0399}",
+"\xE1\xBE\x9A" => "\x{1F2A}\x{0399}",
+"\xE1\xBE\x9B" => "\x{1F2B}\x{0399}",
+"\xE1\xBE\x9C" => "\x{1F2C}\x{0399}",
+"\xE1\xBE\x9D" => "\x{1F2D}\x{0399}",
+"\xE1\xBE\x9E" => "\x{1F2E}\x{0399}",
+"\xE1\xBE\x9F" => "\x{1F2F}\x{0399}",
+"\xE1\xBE\xA0" => "\x{1F68}\x{0399}",
+"\xE1\xBE\xA1" => "\x{1F69}\x{0399}",
+"\xE1\xBE\xA2" => "\x{1F6A}\x{0399}",
+"\xE1\xBE\xA3" => "\x{1F6B}\x{0399}",
+"\xE1\xBE\xA4" => "\x{1F6C}\x{0399}",
+"\xE1\xBE\xA5" => "\x{1F6D}\x{0399}",
+"\xE1\xBE\xA6" => "\x{1F6E}\x{0399}",
+"\xE1\xBE\xA7" => "\x{1F6F}\x{0399}",
+"\xE1\xBE\xA8" => "\x{1F68}\x{0399}",
+"\xE1\xBE\xA9" => "\x{1F69}\x{0399}",
+"\xE1\xBE\xAA" => "\x{1F6A}\x{0399}",
+"\xE1\xBE\xAB" => "\x{1F6B}\x{0399}",
+"\xE1\xBE\xAC" => "\x{1F6C}\x{0399}",
+"\xE1\xBE\xAD" => "\x{1F6D}\x{0399}",
+"\xE1\xBE\xAE" => "\x{1F6E}\x{0399}",
+"\xE1\xBE\xAF" => "\x{1F6F}\x{0399}",
+"\xE1\xBE\xB2" => "\x{1FBA}\x{0399}",
+"\xE1\xBE\xB3" => "\x{0391}\x{0399}",
+"\xE1\xBE\xB4" => "\x{0386}\x{0399}",
+"\xE1\xBE\xB6" => "\x{0391}\x{0342}",
+"\xE1\xBE\xB7" => "\x{0391}\x{0342}\x{0399}",
+"\xE1\xBE\xBC" => "\x{0391}\x{0399}",
+"\xE1\xBF\x82" => "\x{1FCA}\x{0399}",
+"\xE1\xBF\x83" => "\x{0397}\x{0399}",
+"\xE1\xBF\x84" => "\x{0389}\x{0399}",
+"\xE1\xBF\x86" => "\x{0397}\x{0342}",
+"\xE1\xBF\x87" => "\x{0397}\x{0342}\x{0399}",
+"\xE1\xBF\x8C" => "\x{0397}\x{0399}",
+"\xE1\xBF\x92" => "\x{0399}\x{0308}\x{0300}",
+"\xE1\xBF\x93" => "\x{0399}\x{0308}\x{0301}",
+"\xE1\xBF\x96" => "\x{0399}\x{0342}",
+"\xE1\xBF\x97" => "\x{0399}\x{0308}\x{0342}",
+"\xE1\xBF\xA2" => "\x{03A5}\x{0308}\x{0300}",
+"\xE1\xBF\xA3" => "\x{03A5}\x{0308}\x{0301}",
+"\xE1\xBF\xA4" => "\x{03A1}\x{0313}",
+"\xE1\xBF\xA6" => "\x{03A5}\x{0342}",
+"\xE1\xBF\xA7" => "\x{03A5}\x{0308}\x{0342}",
+"\xE1\xBF\xB2" => "\x{1FFA}\x{0399}",
+"\xE1\xBF\xB3" => "\x{03A9}\x{0399}",
+"\xE1\xBF\xB4" => "\x{038F}\x{0399}",
+"\xE1\xBF\xB6" => "\x{03A9}\x{0342}",
+"\xE1\xBF\xB7" => "\x{03A9}\x{0342}\x{0399}",
+"\xE1\xBF\xBC" => "\x{03A9}\x{0399}",
+"\xEF\xAC\x80" => "\x{0046}\x{0046}",
+"\xEF\xAC\x81" => "\x{0046}\x{0049}",
+"\xEF\xAC\x82" => "\x{0046}\x{004C}",
+"\xEF\xAC\x83" => "\x{0046}\x{0046}\x{0049}",
+"\xEF\xAC\x84" => "\x{0046}\x{0046}\x{004C}",
+"\xEF\xAC\x85" => "\x{0053}\x{0054}",
+"\xEF\xAC\x86" => "\x{0053}\x{0054}",
+"\xEF\xAC\x93" => "\x{0544}\x{0546}",
+"\xEF\xAC\x94" => "\x{0544}\x{0535}",
+"\xEF\xAC\x95" => "\x{0544}\x{053B}",
+"\xEF\xAC\x96" => "\x{054E}\x{0546}",
+"\xEF\xAC\x97" => "\x{0544}\x{053D}",
+);
+
+return <<'END';
+0061		0041
+0062		0042
+0063		0043
+0064		0044
+0065		0045
+0066		0046
+0067		0047
+0068		0048
+0069		0049
+006A		004A
+006B		004B
+006C		004C
+006D		004D
+006E		004E
+006F		004F
+0070		0050
+0071		0051
+0072		0052
+0073		0053
+0074		0054
+0075		0055
+0076		0056
+0077		0057
+0078		0058
+0079		0059
+007A		005A
+00B5		039C
+00E0		00C0
+00E1		00C1
+00E2		00C2
+00E3		00C3
+00E4		00C4
+00E5		00C5
+00E6		00C6
+00E7		00C7
+00E8		00C8
+00E9		00C9
+00EA		00CA
+00EB		00CB
+00EC		00CC
+00ED		00CD
+00EE		00CE
+00EF		00CF
+00F0		00D0
+00F1		00D1
+00F2		00D2
+00F3		00D3
+00F4		00D4
+00F5		00D5
+00F6		00D6
+00F8		00D8
+00F9		00D9
+00FA		00DA
+00FB		00DB
+00FC		00DC
+00FD		00DD
+00FE		00DE
+00FF		0178
+0101		0100
+0103		0102
+0105		0104
+0107		0106
+0109		0108
+010B		010A
+010D		010C
+010F		010E
+0111		0110
+0113		0112
+0115		0114
+0117		0116
+0119		0118
+011B		011A
+011D		011C
+011F		011E
+0121		0120
+0123		0122
+0125		0124
+0127		0126
+0129		0128
+012B		012A
+012D		012C
+012F		012E
+0131		0049
+0133		0132
+0135		0134
+0137		0136
+013A		0139
+013C		013B
+013E		013D
+0140		013F
+0142		0141
+0144		0143
+0146		0145
+0148		0147
+014B		014A
+014D		014C
+014F		014E
+0151		0150
+0153		0152
+0155		0154
+0157		0156
+0159		0158
+015B		015A
+015D		015C
+015F		015E
+0161		0160
+0163		0162
+0165		0164
+0167		0166
+0169		0168
+016B		016A
+016D		016C
+016F		016E
+0171		0170
+0173		0172
+0175		0174
+0177		0176
+017A		0179
+017C		017B
+017E		017D
+017F		0053
+0183		0182
+0185		0184
+0188		0187
+018C		018B
+0192		0191
+0195		01F6
+0199		0198
+019A		023D
+019E		0220
+01A1		01A0
+01A3		01A2
+01A5		01A4
+01A8		01A7
+01AD		01AC
+01B0		01AF
+01B4		01B3
+01B6		01B5
+01B9		01B8
+01BD		01BC
+01BF		01F7
+01C5		01C4
+01C6		01C4
+01C8		01C7
+01C9		01C7
+01CB		01CA
+01CC		01CA
+01CE		01CD
+01D0		01CF
+01D2		01D1
+01D4		01D3
+01D6		01D5
+01D8		01D7
+01DA		01D9
+01DC		01DB
+01DD		018E
+01DF		01DE
+01E1		01E0
+01E3		01E2
+01E5		01E4
+01E7		01E6
+01E9		01E8
+01EB		01EA
+01ED		01EC
+01EF		01EE
+01F2		01F1
+01F3		01F1
+01F5		01F4
+01F9		01F8
+01FB		01FA
+01FD		01FC
+01FF		01FE
+0201		0200
+0203		0202
+0205		0204
+0207		0206
+0209		0208
+020B		020A
+020D		020C
+020F		020E
+0211		0210
+0213		0212
+0215		0214
+0217		0216
+0219		0218
+021B		021A
+021D		021C
+021F		021E
+0223		0222
+0225		0224
+0227		0226
+0229		0228
+022B		022A
+022D		022C
+022F		022E
+0231		0230
+0233		0232
+023C		023B
+0253		0181
+0254		0186
+0256		0189
+0257		018A
+0259		018F
+025B		0190
+0260		0193
+0263		0194
+0268		0197
+0269		0196
+026F		019C
+0272		019D
+0275		019F
+0280		01A6
+0283		01A9
+0288		01AE
+028A		01B1
+028B		01B2
+0292		01B7
+0294		0241
+0345		0399
+03AC		0386
+03AD		0388
+03AE		0389
+03AF		038A
+03B1		0391
+03B2		0392
+03B3		0393
+03B4		0394
+03B5		0395
+03B6		0396
+03B7		0397
+03B8		0398
+03B9		0399
+03BA		039A
+03BB		039B
+03BC		039C
+03BD		039D
+03BE		039E
+03BF		039F
+03C0		03A0
+03C1		03A1
+03C2		03A3
+03C3		03A3
+03C4		03A4
+03C5		03A5
+03C6		03A6
+03C7		03A7
+03C8		03A8
+03C9		03A9
+03CA		03AA
+03CB		03AB
+03CC		038C
+03CD		038E
+03CE		038F
+03D0		0392
+03D1		0398
+03D5		03A6
+03D6		03A0
+03D9		03D8
+03DB		03DA
+03DD		03DC
+03DF		03DE
+03E1		03E0
+03E3		03E2
+03E5		03E4
+03E7		03E6
+03E9		03E8
+03EB		03EA
+03ED		03EC
+03EF		03EE
+03F0		039A
+03F1		03A1
+03F2		03F9
+03F5		0395
+03F8		03F7
+03FB		03FA
+0430		0410
+0431		0411
+0432		0412
+0433		0413
+0434		0414
+0435		0415
+0436		0416
+0437		0417
+0438		0418
+0439		0419
+043A		041A
+043B		041B
+043C		041C
+043D		041D
+043E		041E
+043F		041F
+0440		0420
+0441		0421
+0442		0422
+0443		0423
+0444		0424
+0445		0425
+0446		0426
+0447		0427
+0448		0428
+0449		0429
+044A		042A
+044B		042B
+044C		042C
+044D		042D
+044E		042E
+044F		042F
+0450		0400
+0451		0401
+0452		0402
+0453		0403
+0454		0404
+0455		0405
+0456		0406
+0457		0407
+0458		0408
+0459		0409
+045A		040A
+045B		040B
+045C		040C
+045D		040D
+045E		040E
+045F		040F
+0461		0460
+0463		0462
+0465		0464
+0467		0466
+0469		0468
+046B		046A
+046D		046C
+046F		046E
+0471		0470
+0473		0472
+0475		0474
+0477		0476
+0479		0478
+047B		047A
+047D		047C
+047F		047E
+0481		0480
+048B		048A
+048D		048C
+048F		048E
+0491		0490
+0493		0492
+0495		0494
+0497		0496
+0499		0498
+049B		049A
+049D		049C
+049F		049E
+04A1		04A0
+04A3		04A2
+04A5		04A4
+04A7		04A6
+04A9		04A8
+04AB		04AA
+04AD		04AC
+04AF		04AE
+04B1		04B0
+04B3		04B2
+04B5		04B4
+04B7		04B6
+04B9		04B8
+04BB		04BA
+04BD		04BC
+04BF		04BE
+04C2		04C1
+04C4		04C3
+04C6		04C5
+04C8		04C7
+04CA		04C9
+04CC		04CB
+04CE		04CD
+04D1		04D0
+04D3		04D2
+04D5		04D4
+04D7		04D6
+04D9		04D8
+04DB		04DA
+04DD		04DC
+04DF		04DE
+04E1		04E0
+04E3		04E2
+04E5		04E4
+04E7		04E6
+04E9		04E8
+04EB		04EA
+04ED		04EC
+04EF		04EE
+04F1		04F0
+04F3		04F2
+04F5		04F4
+04F7		04F6
+04F9		04F8
+0501		0500
+0503		0502
+0505		0504
+0507		0506
+0509		0508
+050B		050A
+050D		050C
+050F		050E
+0561		0531
+0562		0532
+0563		0533
+0564		0534
+0565		0535
+0566		0536
+0567		0537
+0568		0538
+0569		0539
+056A		053A
+056B		053B
+056C		053C
+056D		053D
+056E		053E
+056F		053F
+0570		0540
+0571		0541
+0572		0542
+0573		0543
+0574		0544
+0575		0545
+0576		0546
+0577		0547
+0578		0548
+0579		0549
+057A		054A
+057B		054B
+057C		054C
+057D		054D
+057E		054E
+057F		054F
+0580		0550
+0581		0551
+0582		0552
+0583		0553
+0584		0554
+0585		0555
+0586		0556
+1E01		1E00
+1E03		1E02
+1E05		1E04
+1E07		1E06
+1E09		1E08
+1E0B		1E0A
+1E0D		1E0C
+1E0F		1E0E
+1E11		1E10
+1E13		1E12
+1E15		1E14
+1E17		1E16
+1E19		1E18
+1E1B		1E1A
+1E1D		1E1C
+1E1F		1E1E
+1E21		1E20
+1E23		1E22
+1E25		1E24
+1E27		1E26
+1E29		1E28
+1E2B		1E2A
+1E2D		1E2C
+1E2F		1E2E
+1E31		1E30
+1E33		1E32
+1E35		1E34
+1E37		1E36
+1E39		1E38
+1E3B		1E3A
+1E3D		1E3C
+1E3F		1E3E
+1E41		1E40
+1E43		1E42
+1E45		1E44
+1E47		1E46
+1E49		1E48
+1E4B		1E4A
+1E4D		1E4C
+1E4F		1E4E
+1E51		1E50
+1E53		1E52
+1E55		1E54
+1E57		1E56
+1E59		1E58
+1E5B		1E5A
+1E5D		1E5C
+1E5F		1E5E
+1E61		1E60
+1E63		1E62
+1E65		1E64
+1E67		1E66
+1E69		1E68
+1E6B		1E6A
+1E6D		1E6C
+1E6F		1E6E
+1E71		1E70
+1E73		1E72
+1E75		1E74
+1E77		1E76
+1E79		1E78
+1E7B		1E7A
+1E7D		1E7C
+1E7F		1E7E
+1E81		1E80
+1E83		1E82
+1E85		1E84
+1E87		1E86
+1E89		1E88
+1E8B		1E8A
+1E8D		1E8C
+1E8F		1E8E
+1E91		1E90
+1E93		1E92
+1E95		1E94
+1E9B		1E60
+1EA1		1EA0
+1EA3		1EA2
+1EA5		1EA4
+1EA7		1EA6
+1EA9		1EA8
+1EAB		1EAA
+1EAD		1EAC
+1EAF		1EAE
+1EB1		1EB0
+1EB3		1EB2
+1EB5		1EB4
+1EB7		1EB6
+1EB9		1EB8
+1EBB		1EBA
+1EBD		1EBC
+1EBF		1EBE
+1EC1		1EC0
+1EC3		1EC2
+1EC5		1EC4
+1EC7		1EC6
+1EC9		1EC8
+1ECB		1ECA
+1ECD		1ECC
+1ECF		1ECE
+1ED1		1ED0
+1ED3		1ED2
+1ED5		1ED4
+1ED7		1ED6
+1ED9		1ED8
+1EDB		1EDA
+1EDD		1EDC
+1EDF		1EDE
+1EE1		1EE0
+1EE3		1EE2
+1EE5		1EE4
+1EE7		1EE6
+1EE9		1EE8
+1EEB		1EEA
+1EED		1EEC
+1EEF		1EEE
+1EF1		1EF0
+1EF3		1EF2
+1EF5		1EF4
+1EF7		1EF6
+1EF9		1EF8
+1F00		1F08
+1F01		1F09
+1F02		1F0A
+1F03		1F0B
+1F04		1F0C
+1F05		1F0D
+1F06		1F0E
+1F07		1F0F
+1F10		1F18
+1F11		1F19
+1F12		1F1A
+1F13		1F1B
+1F14		1F1C
+1F15		1F1D
+1F20		1F28
+1F21		1F29
+1F22		1F2A
+1F23		1F2B
+1F24		1F2C
+1F25		1F2D
+1F26		1F2E
+1F27		1F2F
+1F30		1F38
+1F31		1F39
+1F32		1F3A
+1F33		1F3B
+1F34		1F3C
+1F35		1F3D
+1F36		1F3E
+1F37		1F3F
+1F40		1F48
+1F41		1F49
+1F42		1F4A
+1F43		1F4B
+1F44		1F4C
+1F45		1F4D
+1F51		1F59
+1F53		1F5B
+1F55		1F5D
+1F57		1F5F
+1F60		1F68
+1F61		1F69
+1F62		1F6A
+1F63		1F6B
+1F64		1F6C
+1F65		1F6D
+1F66		1F6E
+1F67		1F6F
+1F70		1FBA
+1F71		1FBB
+1F72		1FC8
+1F73		1FC9
+1F74		1FCA
+1F75		1FCB
+1F76		1FDA
+1F77		1FDB
+1F78		1FF8
+1F79		1FF9
+1F7A		1FEA
+1F7B		1FEB
+1F7C		1FFA
+1F7D		1FFB
+1FB0		1FB8
+1FB1		1FB9
+1FBE		0399
+1FD0		1FD8
+1FD1		1FD9
+1FE0		1FE8
+1FE1		1FE9
+1FE5		1FEC
+2170		2160
+2171		2161
+2172		2162
+2173		2163
+2174		2164
+2175		2165
+2176		2166
+2177		2167
+2178		2168
+2179		2169
+217A		216A
+217B		216B
+217C		216C
+217D		216D
+217E		216E
+217F		216F
+24D0		24B6
+24D1		24B7
+24D2		24B8
+24D3		24B9
+24D4		24BA
+24D5		24BB
+24D6		24BC
+24D7		24BD
+24D8		24BE
+24D9		24BF
+24DA		24C0
+24DB		24C1
+24DC		24C2
+24DD		24C3
+24DE		24C4
+24DF		24C5
+24E0		24C6
+24E1		24C7
+24E2		24C8
+24E3		24C9
+24E4		24CA
+24E5		24CB
+24E6		24CC
+24E7		24CD
+24E8		24CE
+24E9		24CF
+2C30		2C00
+2C31		2C01
+2C32		2C02
+2C33		2C03
+2C34		2C04
+2C35		2C05
+2C36		2C06
+2C37		2C07
+2C38		2C08
+2C39		2C09
+2C3A		2C0A
+2C3B		2C0B
+2C3C		2C0C
+2C3D		2C0D
+2C3E		2C0E
+2C3F		2C0F
+2C40		2C10
+2C41		2C11
+2C42		2C12
+2C43		2C13
+2C44		2C14
+2C45		2C15
+2C46		2C16
+2C47		2C17
+2C48		2C18
+2C49		2C19
+2C4A		2C1A
+2C4B		2C1B
+2C4C		2C1C
+2C4D		2C1D
+2C4E		2C1E
+2C4F		2C1F
+2C50		2C20
+2C51		2C21
+2C52		2C22
+2C53		2C23
+2C54		2C24
+2C55		2C25
+2C56		2C26
+2C57		2C27
+2C58		2C28
+2C59		2C29
+2C5A		2C2A
+2C5B		2C2B
+2C5C		2C2C
+2C5D		2C2D
+2C5E		2C2E
+2C81		2C80
+2C83		2C82
+2C85		2C84
+2C87		2C86
+2C89		2C88
+2C8B		2C8A
+2C8D		2C8C
+2C8F		2C8E
+2C91		2C90
+2C93		2C92
+2C95		2C94
+2C97		2C96
+2C99		2C98
+2C9B		2C9A
+2C9D		2C9C
+2C9F		2C9E
+2CA1		2CA0
+2CA3		2CA2
+2CA5		2CA4
+2CA7		2CA6
+2CA9		2CA8
+2CAB		2CAA
+2CAD		2CAC
+2CAF		2CAE
+2CB1		2CB0
+2CB3		2CB2
+2CB5		2CB4
+2CB7		2CB6
+2CB9		2CB8
+2CBB		2CBA
+2CBD		2CBC
+2CBF		2CBE
+2CC1		2CC0
+2CC3		2CC2
+2CC5		2CC4
+2CC7		2CC6
+2CC9		2CC8
+2CCB		2CCA
+2CCD		2CCC
+2CCF		2CCE
+2CD1		2CD0
+2CD3		2CD2
+2CD5		2CD4
+2CD7		2CD6
+2CD9		2CD8
+2CDB		2CDA
+2CDD		2CDC
+2CDF		2CDE
+2CE1		2CE0
+2CE3		2CE2
+2D00		10A0
+2D01		10A1
+2D02		10A2
+2D03		10A3
+2D04		10A4
+2D05		10A5
+2D06		10A6
+2D07		10A7
+2D08		10A8
+2D09		10A9
+2D0A		10AA
+2D0B		10AB
+2D0C		10AC
+2D0D		10AD
+2D0E		10AE
+2D0F		10AF
+2D10		10B0
+2D11		10B1
+2D12		10B2
+2D13		10B3
+2D14		10B4
+2D15		10B5
+2D16		10B6
+2D17		10B7
+2D18		10B8
+2D19		10B9
+2D1A		10BA
+2D1B		10BB
+2D1C		10BC
+2D1D		10BD
+2D1E		10BE
+2D1F		10BF
+2D20		10C0
+2D21		10C1
+2D22		10C2
+2D23		10C3
+2D24		10C4
+2D25		10C5
+FF41		FF21
+FF42		FF22
+FF43		FF23
+FF44		FF24
+FF45		FF25
+FF46		FF26
+FF47		FF27
+FF48		FF28
+FF49		FF29
+FF4A		FF2A
+FF4B		FF2B
+FF4C		FF2C
+FF4D		FF2D
+FF4E		FF2E
+FF4F		FF2F
+FF50		FF30
+FF51		FF31
+FF52		FF32
+FF53		FF33
+FF54		FF34
+FF55		FF35
+FF56		FF36
+FF57		FF37
+FF58		FF38
+FF59		FF39
+FF5A		FF3A
+10428		10400
+10429		10401
+1042A		10402
+1042B		10403
+1042C		10404
+1042D		10405
+1042E		10406
+1042F		10407
+10430		10408
+10431		10409
+10432		1040A
+10433		1040B
+10434		1040C
+10435		1040D
+10436		1040E
+10437		1040F
+10438		10410
+10439		10411
+1043A		10412
+1043B		10413
+1043C		10414
+1043D		10415
+1043E		10416
+1043F		10417
+10440		10418
+10441		10419
+10442		1041A
+10443		1041B
+10444		1041C
+10445		1041D
+10446		1041E
+10447		1041F
+10448		10420
+10449		10421
+1044A		10422
+1044B		10423
+1044C		10424
+1044D		10425
+1044E		10426
+1044F		10427
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/UnicodeData.txt
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/UnicodeData.txt	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/UnicodeData.txt	(revision 14489)
@@ -0,0 +1,16351 @@
+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;;;;
+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;;;;;
+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;;;;;
+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;;;;0294;
+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;;;0241;;0241
+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;;;;
+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;;;;;
+03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;;
+03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;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;;;;;
+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;;;;
+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
+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
+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
+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;;;;;
+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;;;;;
+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;;;;;
+097D;DEVANAGARI LETTER GLOTTAL STOP;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;;;;;
+0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;;
+0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;;
+0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;;
+0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;;
+0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;;
+0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;;
+0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;;
+0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;;
+0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;;
+0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;;
+0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;;
+0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;;
+0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;;
+0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;;
+0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;;
+0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;;
+0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;;
+0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;;
+0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;;
+0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;;
+0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;;
+0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;;
+0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;;
+0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;;
+0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;;
+0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;;
+0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;;
+0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;;
+0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;;
+0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;;
+0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;;
+0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;;
+0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;;
+0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;;
+0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;;
+0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;;
+0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;;
+0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;;
+0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;;
+0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;;
+0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;;
+0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;;
+0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;;
+0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;;
+0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;;
+0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;;
+0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;;
+0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;;
+0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;;
+0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;;
+0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;;
+0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;;
+0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;;
+0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;;
+0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;;
+0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;;
+0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;;
+0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;;
+0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;;
+0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;;
+0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;;
+0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;;
+0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;;
+0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;;
+0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;;
+0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;;
+0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;;
+0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;;
+0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;;
+0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;;
+0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;;
+0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;;
+0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;;
+0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;;
+0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;;
+0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;;
+0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;;
+0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;;
+0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;;
+0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;;
+0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;;
+0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;;
+0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;;
+0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;;
+0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;;
+0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;;
+0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;;
+0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;;
+0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;;
+0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;;
+0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;;
+0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;;
+0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;;
+0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;;
+0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;;
+0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;;
+0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;;
+0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;;
+0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;;
+0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;;
+0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;;
+0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;;
+0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;;
+0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;;
+0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;;
+0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;;
+0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;;
+0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;;
+0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;;
+0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;;
+0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;;
+0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;;
+0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;;
+0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;;
+0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;;
+0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;;
+0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;;
+0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;;
+0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;;
+0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;;
+0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;;
+0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;;
+0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;;
+0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;;
+0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;;
+0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;;
+0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;;
+0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;;
+0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;;
+0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;;
+0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;;
+0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;;
+0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;;
+0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;;
+0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;;
+0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;;
+0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;;
+0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;;
+0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;;
+0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;;
+0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;;
+0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;;
+0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;;
+0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;;
+0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;;
+0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;;
+0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;;
+0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;;
+0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;;
+0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;;
+0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;;
+0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;;
+0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;;
+0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;;
+0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;;
+0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;;
+0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;;
+0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;;
+0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;;
+0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;;
+0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;;
+0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;;
+0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;;
+0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;;
+0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;;
+0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;;
+0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;;
+0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;;
+0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;;
+0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;;
+0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;;
+0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;;
+0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;;
+0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;;
+0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;;
+0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;;
+0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;;
+0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;;
+0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;;
+0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;;
+0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;;
+0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;;
+0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;;
+0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;;
+0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;;
+0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;;
+0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;;
+0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;;
+0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;;
+0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;;
+0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;;
+0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;;
+0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;;
+0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;;
+0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;;
+0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;;
+0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;;
+0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;;
+0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;;
+0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;;
+0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;;
+0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;;
+0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;;
+0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;;
+0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;;
+0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;;
+0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;;
+0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;;
+0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;;
+0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;;
+0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;;
+0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;;
+0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;;
+0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;tsek tar;;;
+0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;;
+0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;;
+0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;;
+0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;;
+0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;;
+0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;;
+0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;;
+0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;;
+0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;;
+0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;;
+0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;;
+0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;;
+0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;;
+0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;;
+0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;;
+0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;;
+0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;;
+0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;;
+0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;;
+0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;;
+0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;;
+0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;;
+0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;;
+0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;;
+0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;;
+0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;;
+0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;N;;gug ta yun;;;
+0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;N;;gug ta ye;;;
+0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;N;TIBETAN LEFT BRACE;ang kang yun;;;
+0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;N;TIBETAN RIGHT BRACE;ang kang ye;;;
+0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;;
+0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;;
+0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;;
+0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;;
+0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;;
+0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;;
+0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;;
+0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;;
+0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;;
+0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;;
+0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;;
+0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;;
+0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;;
+0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;;
+0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;;
+0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;;
+0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;;
+0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;;
+0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;;
+0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;;
+0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;;
+0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;;
+0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;;
+0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;;
+0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;;
+0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;;
+0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;;
+0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;;
+0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;;
+0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;;
+0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;;
+0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;;
+0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;;
+0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;;
+0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;;
+0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;;
+0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;;
+0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;;
+0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;;
+0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;;
+0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;;
+0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;;
+0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;;
+0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;;
+0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;;
+0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;;
+0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;;
+0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;;
+0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;;
+0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;;
+0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;;
+0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;;
+0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;;
+0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;;
+0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;;
+0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;;
+0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;;
+0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;;
+0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;;
+0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;;
+0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;;
+0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;;
+0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;;
+0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;;
+0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;;
+0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;;
+0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;;
+0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;;
+0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;;
+0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;;
+0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;;
+0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;;
+0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;;
+0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;;
+0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;;
+0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;;
+0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;;
+0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;;
+0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;;
+0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;;
+0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;;
+0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;;
+0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;;
+0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;;
+0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;;
+0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;;
+0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;;
+0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;;
+0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;;
+0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;;
+0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;;
+0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;;
+0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;;
+0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;;
+0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;;
+0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;;
+0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;;
+0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;;
+0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;;
+0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;;
+0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;;
+0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;;
+0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;;
+0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;;
+0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;;
+0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;;
+0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;;
+0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;;
+0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;;
+0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;;
+0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;;
+0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;;
+0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;;
+0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;;
+0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;;
+0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;;
+0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;;
+0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;;
+0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;;
+0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;;
+0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;;
+0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;;
+0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;;
+0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;;
+0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;;
+0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;;
+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;;;;;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;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;;;;;
+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;;;;;
+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;;;;;
+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;;;;;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;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;;;;;
+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;;;;;
+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;;;;;
+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;;;;;
+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;Ps;0;ON;;;;;N;;;;;
+23B5;BOTTOM SQUARE BRACKET;Pe;0;ON;;;;;N;;;;;
+23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;Po;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;;;;;
+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;;;;;
+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;;;;;
+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;;;;;
+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
+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;;;;;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;;;;;
+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;;;;;
+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;;;;;
+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;;;;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;ES;<small> 002B;;;;N;;;;;
+FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<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;;;;
+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;Lo;0;L;;;;;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;So;0;L;;;;;N;;;;;
+103D1;OLD PERSIAN NUMBER ONE;Nl;0;ON;;;;1;N;;;;;
+103D2;OLD PERSIAN NUMBER TWO;Nl;0;ON;;;;2;N;;;;;
+103D3;OLD PERSIAN NUMBER TEN;Nl;0;ON;;;;10;N;;;;;
+103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;ON;;;;20;N;;;;;
+103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;ON;;;;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;;;;;
+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;;;;;
+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;;;;;
+1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;;
+1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;;
+1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;;
+1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;;
+1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+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;;;;;
+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;;;;N;;;;;
+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;;;;N;;;;;
+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;;;;N;;;;;
+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;;;;N;;;;;
+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;;;;N;;;;;
+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;;;;;
+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;;;;;
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/AL.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/AL.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/AL.pl	(revision 14489)
@@ -0,0 +1,34 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Arabic_Letter'
+#
+return <<'END';
+0600	0603	
+060B		
+060D		
+061B		
+061E	061F	
+0621	063A	
+0640	064A	
+066D	066F	
+0671	06D5	
+06DD		
+06E5	06E6	
+06EE	06EF	
+06FA	070D	
+0710		
+0712	072F	
+074D	076D	
+0780	07A5	
+07B1		
+FB50	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFC	
+FE70	FE74	
+FE76	FEFC	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/AN.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/AN.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/AN.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Arabic_Number'
+#
+return <<'END';
+0660	0669	
+066B	066C	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/B.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/B.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/B.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Paragraph_Separator'
+#
+return <<'END';
+000A		
+000D		
+001C	001E	
+0085		
+2029		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/BN.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/BN.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/BN.pl	(revision 14489)
@@ -0,0 +1,22 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Boundary_Neutral'
+#
+return <<'END';
+0000	0008	
+000E	001B	
+007F	0084	
+0086	009F	
+00AD		
+070F		
+200B	200D	
+2060	2063	
+206A	206F	
+FEFF		
+1D173	1D17A	
+E0001		
+E0020	E007F	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/CS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/CS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/CS.pl	(revision 14489)
@@ -0,0 +1,22 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Common_Separator'
+#
+return <<'END';
+002C		
+002E	002F	
+003A		
+00A0		
+060C		
+202F		
+2044		
+FE50		
+FE52		
+FE55		
+FF0C		
+FF0E	FF0F	
+FF1A		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/EN.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/EN.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/EN.pl	(revision 14489)
@@ -0,0 +1,19 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'European_Number'
+#
+return <<'END';
+0030	0039	
+00B2	00B3	
+00B9		
+06F0	06F9	
+2070		
+2074	2079	
+2080	2089	
+2488	249B	
+FF10	FF19	
+1D7CE	1D7FF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/ES.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/ES.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/ES.pl	(revision 14489)
@@ -0,0 +1,18 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'European_Separator'
+#
+return <<'END';
+002B		
+002D		
+207A	207B	
+208A	208B	
+2212		
+FB29		
+FE62	FE63	
+FF0B		
+FF0D		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/ET.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/ET.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/ET.pl	(revision 14489)
@@ -0,0 +1,27 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'European_Terminator'
+#
+return <<'END';
+0023	0025	
+00A2	00A5	
+00B0	00B1	
+066A		
+09F2	09F3	
+0AF1		
+0BF9		
+0E3F		
+17DB		
+2030	2034	
+20A0	20B5	
+212E		
+2213		
+FE5F		
+FE69	FE6A	
+FF03	FF05	
+FFE0	FFE1	
+FFE5	FFE6	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/L.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/L.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/L.pl	(revision 14489)
@@ -0,0 +1,400 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Left_To_Right'
+#
+return <<'END';
+0041	005A	
+0061	007A	
+00AA		
+00B5		
+00BA		
+00C0	00D6	
+00D8	00F6	
+00F8	0241	
+0250	02B8	
+02BB	02C1	
+02D0	02D1	
+02E0	02E4	
+02EE		
+037A		
+0386		
+0388	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	03F5	
+03F7	0482	
+048A	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559	055F	
+0561	0587	
+0589		
+0903	0939	
+093D	0940	
+0949	094C	
+0950		
+0958	0961	
+0964	0970	
+097D		
+0982	0983	
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BD	09C0	
+09C7	09C8	
+09CB	09CC	
+09CE		
+09D7		
+09DC	09DD	
+09DF	09E1	
+09E6	09F1	
+09F4	09FA	
+0A03		
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A3E	0A40	
+0A59	0A5C	
+0A5E		
+0A66	0A6F	
+0A72	0A74	
+0A83		
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABD	0AC0	
+0AC9		
+0ACB	0ACC	
+0AD0		
+0AE0	0AE1	
+0AE6	0AEF	
+0B02	0B03	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3D	0B3E	
+0B40		
+0B47	0B48	
+0B4B	0B4C	
+0B57		
+0B5C	0B5D	
+0B5F	0B61	
+0B66	0B71	
+0B83		
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BBE	0BBF	
+0BC1	0BC2	
+0BC6	0BC8	
+0BCA	0BCC	
+0BD7		
+0BE6	0BF2	
+0C01	0C03	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C41	0C44	
+0C60	0C61	
+0C66	0C6F	
+0C82	0C83	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBD	0CC4	
+0CC6	0CC8	
+0CCA	0CCB	
+0CD5	0CD6	
+0CDE		
+0CE0	0CE1	
+0CE6	0CEF	
+0D02	0D03	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D3E	0D40	
+0D46	0D48	
+0D4A	0D4C	
+0D57		
+0D60	0D61	
+0D66	0D6F	
+0D82	0D83	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DCF	0DD1	
+0DD8	0DDF	
+0DF2	0DF4	
+0E01	0E30	
+0E32	0E33	
+0E40	0E46	
+0E4F	0E5B	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB0	
+0EB2	0EB3	
+0EBD		
+0EC0	0EC4	
+0EC6		
+0ED0	0ED9	
+0EDC	0EDD	
+0F00	0F17	
+0F1A	0F34	
+0F36		
+0F38		
+0F3E	0F47	
+0F49	0F6A	
+0F7F		
+0F85		
+0F88	0F8B	
+0FBE	0FC5	
+0FC7	0FCC	
+0FCF	0FD1	
+1000	1021	
+1023	1027	
+1029	102A	
+102C		
+1031		
+1038		
+1040	1057	
+10A0	10C5	
+10D0	10FC	
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+1360	137C	
+1380	138F	
+13A0	13F4	
+1401	1676	
+1681	169A	
+16A0	16F0	
+1700	170C	
+170E	1711	
+1720	1731	
+1735	1736	
+1740	1751	
+1760	176C	
+176E	1770	
+1780	17B6	
+17BE	17C5	
+17C7	17C8	
+17D4	17DA	
+17DC		
+17E0	17E9	
+1810	1819	
+1820	1877	
+1880	18A8	
+1900	191C	
+1923	1926	
+1930	1931	
+1933	1938	
+1946	196D	
+1970	1974	
+1980	19A9	
+19B0	19C9	
+19D0	19D9	
+1A00	1A16	
+1A19	1A1B	
+1A1E	1A1F	
+1D00	1DBF	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FBC	
+1FBE		
+1FC2	1FC4	
+1FC6	1FCC	
+1FD0	1FD3	
+1FD6	1FDB	
+1FE0	1FEC	
+1FF2	1FF4	
+1FF6	1FFC	
+200E		
+2071		
+207F		
+2090	2094	
+2102		
+2107		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+212F	2131	
+2133	2139	
+213C	213F	
+2145	2149	
+2160	2183	
+2336	237A	
+2395		
+249C	24E9	
+26AC		
+2800	28FF	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CE4	
+2D00	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+3005	3007	
+3021	3029	
+3031	3035	
+3038	303C	
+3041	3096	
+309D	309F	
+30A1	30FA	
+30FC	30FF	
+3105	312C	
+3131	318E	
+3190	31B7	
+31F0	321C	
+3220	3243	
+3260	327B	
+327F	32B0	
+32C0	32CB	
+32D0	32FE	
+3300	3376	
+337B	33DD	
+33E0	33FE	
+A000	A48C	
+A800	A801	
+A803	A805	
+A807	A80A	
+A80C	A824	
+A827		
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FF21	FF3A	
+FF41	FF5A	
+FF66	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10100		
+10102		
+10107	10133	
+10137	1013F	
+10300	1031E	
+10320	10323	
+10330	1034A	
+10380	1039D	
+1039F	103C3	
+103C8	103D0	
+10400	1049D	
+104A0	104A9	
+1D000	1D0F5	
+1D100	1D126	
+1D12A	1D166	
+1D16A	1D172	
+1D183	1D184	
+1D18C	1D1A9	
+1D1AE	1D1DD	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D7C9	
+2F800	2FA1D	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/LRE.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/LRE.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/LRE.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Left_To_Right_Embedding'
+#
+return <<'END';
+202A		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/LRO.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/LRO.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/LRO.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Left_To_Right_Override'
+#
+return <<'END';
+202D		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/NSM.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/NSM.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/NSM.pl	(revision 14489)
@@ -0,0 +1,131 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Nonspacing_Mark'
+#
+return <<'END';
+0300	036F	
+0483	0486	
+0488	0489	
+0591	05B9	
+05BB	05BD	
+05BF		
+05C1	05C2	
+05C4	05C5	
+05C7		
+0610	0615	
+064B	065E	
+0670		
+06D6	06DC	
+06DE	06E4	
+06E7	06E8	
+06EA	06ED	
+0711		
+0730	074A	
+07A6	07B0	
+0901	0902	
+093C		
+0941	0948	
+094D		
+0951	0954	
+0962	0963	
+0981		
+09BC		
+09C1	09C4	
+09CD		
+09E2	09E3	
+0A01	0A02	
+0A3C		
+0A41	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A70	0A71	
+0A81	0A82	
+0ABC		
+0AC1	0AC5	
+0AC7	0AC8	
+0ACD		
+0AE2	0AE3	
+0B01		
+0B3C		
+0B3F		
+0B41	0B43	
+0B4D		
+0B56		
+0B82		
+0BC0		
+0BCD		
+0C3E	0C40	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0CBC		
+0CCC	0CCD	
+0D41	0D43	
+0D4D		
+0DCA		
+0DD2	0DD4	
+0DD6		
+0E31		
+0E34	0E3A	
+0E47	0E4E	
+0EB1		
+0EB4	0EB9	
+0EBB	0EBC	
+0EC8	0ECD	
+0F18	0F19	
+0F35		
+0F37		
+0F39		
+0F71	0F7E	
+0F80	0F84	
+0F86	0F87	
+0F90	0F97	
+0F99	0FBC	
+0FC6		
+102D	1030	
+1032		
+1036	1037	
+1039		
+1058	1059	
+135F		
+1712	1714	
+1732	1734	
+1752	1753	
+1772	1773	
+17B7	17BD	
+17C6		
+17C9	17D3	
+17DD		
+180B	180D	
+18A9		
+1920	1922	
+1927	192B	
+1932		
+1939	193B	
+1A17	1A18	
+1DC0	1DC3	
+20D0	20EB	
+302A	302F	
+3099	309A	
+A802		
+A806		
+A80B		
+A825	A826	
+FB1E		
+FE00	FE0F	
+FE20	FE23	
+10A01	10A03	
+10A05	10A06	
+10A0C	10A0F	
+10A38	10A3A	
+10A3F		
+1D167	1D169	
+1D17B	1D182	
+1D185	1D18B	
+1D1AA	1D1AD	
+1D242	1D244	
+E0100	E01EF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/ON.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/ON.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/ON.pl	(revision 14489)
@@ -0,0 +1,150 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Other_Neutral'
+#
+return <<'END';
+0021	0022	
+0026	002A	
+003B	0040	
+005B	0060	
+007B	007E	
+00A1		
+00A6	00A9	
+00AB	00AC	
+00AE	00AF	
+00B4		
+00B6	00B8	
+00BB	00BF	
+00D7		
+00F7		
+02B9	02BA	
+02C2	02CF	
+02D2	02DF	
+02E5	02ED	
+02EF	02FF	
+0374	0375	
+037E		
+0384	0385	
+0387		
+03F6		
+058A		
+060E	060F	
+06E9		
+0BF3	0BF8	
+0BFA		
+0F3A	0F3D	
+1390	1399	
+169B	169C	
+17F0	17F9	
+1800	180A	
+1940		
+1944	1945	
+19DE	19FF	
+1FBD		
+1FBF	1FC1	
+1FCD	1FCF	
+1FDD	1FDF	
+1FED	1FEF	
+1FFD	1FFE	
+2010	2027	
+2035	2043	
+2045	205E	
+207C	207E	
+208C	208E	
+2100	2101	
+2103	2106	
+2108	2109	
+2114		
+2116	2118	
+211E	2123	
+2125		
+2127		
+2129		
+2132		
+213A	213B	
+2140	2144	
+214A	214C	
+2153	215F	
+2190	2211	
+2214	2335	
+237B	2394	
+2396	23DB	
+2400	2426	
+2440	244A	
+2460	2487	
+24EA	269C	
+26A0	26AB	
+26AD	26B1	
+2701	2704	
+2706	2709	
+270C	2727	
+2729	274B	
+274D		
+274F	2752	
+2756		
+2758	275E	
+2761	2794	
+2798	27AF	
+27B1	27BE	
+27C0	27C6	
+27D0	27EB	
+27F0	27FF	
+2900	2B13	
+2CE5	2CEA	
+2CF9	2CFF	
+2E00	2E17	
+2E1C	2E1D	
+2E80	2E99	
+2E9B	2EF3	
+2F00	2FD5	
+2FF0	2FFB	
+3001	3004	
+3008	3020	
+3030		
+3036	3037	
+303D	303F	
+309B	309C	
+30A0		
+30FB		
+31C0	31CF	
+321D	321E	
+3250	325F	
+327C	327E	
+32B1	32BF	
+32CC	32CF	
+3377	337A	
+33DE	33DF	
+33FF		
+4DC0	4DFF	
+A490	A4C6	
+A700	A716	
+A828	A82B	
+FD3E	FD3F	
+FDFD		
+FE10	FE19	
+FE30	FE4F	
+FE51		
+FE54		
+FE56	FE5E	
+FE60	FE61	
+FE64	FE66	
+FE68		
+FE6B		
+FF01	FF02	
+FF06	FF0A	
+FF1B	FF20	
+FF3B	FF40	
+FF5B	FF65	
+FFE2	FFE4	
+FFE8	FFEE	
+FFF9	FFFD	
+10101		
+10140	1018A	
+103D1	103D5	
+1D200	1D241	
+1D245		
+1D300	1D356	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/PDF.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/PDF.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/PDF.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Pop_Directional_Format'
+#
+return <<'END';
+202C		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/R.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/R.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/R.pl	(revision 14489)
@@ -0,0 +1,36 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Right_To_Left'
+#
+return <<'END';
+05BE		
+05C0		
+05C3		
+05C6		
+05D0	05EA	
+05F0	05F4	
+200F		
+FB1D		
+FB1F	FB28	
+FB2A	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FB4F	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00		
+10A10	10A13	
+10A15	10A17	
+10A19	10A33	
+10A40	10A47	
+10A50	10A58	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/RLE.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/RLE.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/RLE.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Right_To_Left_Embedding'
+#
+return <<'END';
+202B		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/RLO.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/RLO.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/RLO.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Right_To_Left_Override'
+#
+return <<'END';
+202E		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/S.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/S.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/S.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'Segment_Separator'
+#
+return <<'END';
+0009		
+000B		
+001F		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/WS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/WS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/bc/WS.pl	(revision 14489)
@@ -0,0 +1,17 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# BidiClass category 'White_Space'
+#
+return <<'END';
+000C		
+0020		
+1680		
+180E		
+2000	200A	
+2028		
+205F		
+3000		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/A.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/A.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/A.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Above'
+#
+return <<'END';
+00E6		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/AL.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/AL.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/AL.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Above_Left'
+#
+return <<'END';
+00E4		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/AR.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/AR.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/AR.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Above_Right'
+#
+return <<'END';
+00E8		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/ATAR.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/ATAR.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/ATAR.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Attached_Above_Right'
+#
+return <<'END';
+00D8		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/ATB.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/ATB.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/ATB.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Attached_Below'
+#
+return <<'END';
+00CA		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/ATBL.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/ATBL.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/ATBL.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Attached_Below_Left'
+#
+return <<'END';
+00C8		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/B.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/B.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/B.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Below'
+#
+return <<'END';
+00DC		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/BL.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/BL.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/BL.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Below_Left'
+#
+return <<'END';
+00DA		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/BR.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/BR.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/BR.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Below_Right'
+#
+return <<'END';
+00DE		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/DA.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/DA.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/DA.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Double_Above'
+#
+return <<'END';
+00EA		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/DB.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/DB.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/DB.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Double_Below'
+#
+return <<'END';
+00E9		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/IS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/IS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/IS.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Iota_Subscript'
+#
+return <<'END';
+00F0		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/KV.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/KV.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/KV.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Kana_Voicing'
+#
+return <<'END';
+0008		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/L.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/L.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/L.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Left'
+#
+return <<'END';
+00E0		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/NK.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/NK.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/NK.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Nukta'
+#
+return <<'END';
+0007		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/NR.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/NR.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/NR.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Not_Reordered'
+#
+return <<'END';
+0000		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/OV.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/OV.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/OV.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Overlay'
+#
+return <<'END';
+0001		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/R.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/R.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/R.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Right'
+#
+return <<'END';
+00E2		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/VR.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/VR.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ccc/VR.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# CombiningClass category 'Virama'
+#
+return <<'END';
+0009		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/can.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/can.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/can.pl	(revision 14489)
@@ -0,0 +1,222 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Canonical'
+#
+return <<'END';
+00C0	00C5	
+00C7	00CF	
+00D1	00D6	
+00D9	00DD	
+00E0	00E5	
+00E7	00EF	
+00F1	00F6	
+00F9	00FD	
+00FF	010F	
+0112	0125	
+0128	0130	
+0134	0137	
+0139	013E	
+0143	0148	
+014C	0151	
+0154	0165	
+0168	017E	
+01A0	01A1	
+01AF	01B0	
+01CD	01DC	
+01DE	01E3	
+01E6	01F0	
+01F4	01F5	
+01F8	021B	
+021E	021F	
+0226	0233	
+0340	0341	
+0343	0344	
+0374		
+037E		
+0385	038A	
+038C		
+038E	0390	
+03AA	03B0	
+03CA	03CE	
+03D3	03D4	
+0400	0401	
+0403		
+0407		
+040C	040E	
+0419		
+0439		
+0450	0451	
+0453		
+0457		
+045C	045E	
+0476	0477	
+04C1	04C2	
+04D0	04D3	
+04D6	04D7	
+04DA	04DF	
+04E2	04E7	
+04EA	04F5	
+04F8	04F9	
+0622	0626	
+06C0		
+06C2		
+06D3		
+0929		
+0931		
+0934		
+0958	095F	
+09CB	09CC	
+09DC	09DD	
+09DF		
+0A33		
+0A36		
+0A59	0A5B	
+0A5E		
+0B48		
+0B4B	0B4C	
+0B5C	0B5D	
+0B94		
+0BCA	0BCC	
+0C48		
+0CC0		
+0CC7	0CC8	
+0CCA	0CCB	
+0D4A	0D4C	
+0DDA		
+0DDC	0DDE	
+0F43		
+0F4D		
+0F52		
+0F57		
+0F5C		
+0F69		
+0F73		
+0F75	0F76	
+0F78		
+0F81		
+0F93		
+0F9D		
+0FA2		
+0FA7		
+0FAC		
+0FB9		
+1026		
+1E00	1E99	
+1E9B		
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FBC	
+1FBE		
+1FC1	1FC4	
+1FC6	1FD3	
+1FD6	1FDB	
+1FDD	1FEF	
+1FF2	1FF4	
+1FF6	1FFD	
+2000	2001	
+2126		
+212A	212B	
+219A	219B	
+21AE		
+21CD	21CF	
+2204		
+2209		
+220C		
+2224		
+2226		
+2241		
+2244		
+2247		
+2249		
+2260		
+2262		
+226D	2271	
+2274	2275	
+2278	2279	
+2280	2281	
+2284	2285	
+2288	2289	
+22AC	22AF	
+22E0	22E3	
+22EA	22ED	
+2329	232A	
+2ADC		
+304C		
+304E		
+3050		
+3052		
+3054		
+3056		
+3058		
+305A		
+305C		
+305E		
+3060		
+3062		
+3065		
+3067		
+3069		
+3070	3071	
+3073	3074	
+3076	3077	
+3079	307A	
+307C	307D	
+3094		
+309E		
+30AC		
+30AE		
+30B0		
+30B2		
+30B4		
+30B6		
+30B8		
+30BA		
+30BC		
+30BE		
+30C0		
+30C2		
+30C5		
+30C7		
+30C9		
+30D0	30D1	
+30D3	30D4	
+30D6	30D7	
+30D9	30DA	
+30DC	30DD	
+30F4		
+30F7	30FA	
+30FE		
+F900	FA0D	
+FA10		
+FA12		
+FA15	FA1E	
+FA20		
+FA22		
+FA25	FA26	
+FA2A	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB1D		
+FB1F		
+FB2A	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FB4E	
+1D15E	1D164	
+1D1BB	1D1C0	
+2F800	2FA1D	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/com.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/com.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/com.pl	(revision 14489)
@@ -0,0 +1,820 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Compat'
+#
+return <<'END';
+00A0		
+00A8		
+00A8		
+00AA		
+00AF		
+00AF		
+00B2	00B4	
+00B4	00B5	
+00B5		
+00B8		
+00B8	00BA	
+00BC	00BE	
+0132		
+0132	0133	
+0133		
+013F		
+013F	0140	
+0140		
+0149		
+0149		
+017F		
+017F		
+01C4		
+01C4	01C5	
+01C5	01C6	
+01C6	01C7	
+01C7	01C8	
+01C8	01C9	
+01C9	01CA	
+01CA	01CB	
+01CB	01CC	
+01CC		
+01F1		
+01F1	01F2	
+01F2	01F3	
+01F3		
+02B0	02B8	
+02D8		
+02D8	02D9	
+02D9	02DA	
+02DA	02DB	
+02DB	02DC	
+02DC	02DD	
+02DD		
+02E0	02E4	
+037A		
+037A		
+0384		
+0384		
+03D0		
+03D0	03D1	
+03D1	03D2	
+03D2		
+03D5		
+03D5	03D6	
+03D6		
+03F0		
+03F0	03F1	
+03F1	03F2	
+03F2		
+03F4		
+03F4	03F5	
+03F5		
+03F9		
+03F9		
+0587		
+0587		
+0675		
+0675	0676	
+0676	0677	
+0677	0678	
+0678		
+0E33		
+0E33		
+0EB3		
+0EB3		
+0EDC		
+0EDC	0EDD	
+0EDD		
+0F0C		
+0F77		
+0F77		
+0F79		
+0F79		
+10FC		
+1D2C	1D2E	
+1D30	1D3A	
+1D3C	1D4D	
+1D4F	1D6A	
+1D78		
+1D9B	1DBF	
+1E9A		
+1E9A		
+1FBD		
+1FBD		
+1FBF		
+1FBF	1FC0	
+1FC0		
+1FFE		
+1FFE		
+2002		
+2002	2003	
+2003	2004	
+2004	2005	
+2005	2006	
+2006	2008	
+2008	2009	
+2009	200A	
+200A		
+2011		
+2017		
+2017		
+2024		
+2024	2025	
+2025	2026	
+2026		
+202F		
+2033		
+2033	2034	
+2034		
+2036		
+2036	2037	
+2037		
+203C		
+203C		
+203E		
+203E		
+2047		
+2047	2048	
+2048	2049	
+2049		
+2057		
+2057		
+205F		
+205F		
+2070	2071	
+2074	208E	
+2090	2094	
+20A8		
+20A8		
+2100		
+2100	2101	
+2101	2103	
+2103		
+2105		
+2105	2106	
+2106	2107	
+2107		
+2109		
+2109	2113	
+2115	2116	
+2116		
+2119	211D	
+2120	2121	
+2121	2122	
+2124		
+2128		
+212C	212D	
+212F	2131	
+2133	2135	
+2135	2136	
+2136	2137	
+2137	2138	
+2138	2139	
+213B		
+213B	2140	
+2145	2149	
+2153	2160	
+2160	2161	
+2161	2162	
+2162	2163	
+2163	2164	
+2164	2165	
+2165	2166	
+2166	2167	
+2167	2168	
+2168	2169	
+2169	216A	
+216A	216B	
+216B	216C	
+216C	216D	
+216D	216E	
+216E	216F	
+216F	2170	
+2170	2171	
+2171	2172	
+2172	2173	
+2173	2174	
+2174	2175	
+2175	2176	
+2176	2177	
+2177	2178	
+2178	2179	
+2179	217A	
+217A	217B	
+217B	217C	
+217C	217D	
+217D	217E	
+217E	217F	
+217F		
+222C		
+222C	222D	
+222D		
+222F		
+222F	2230	
+2230		
+2460	2474	
+2474	2475	
+2475	2476	
+2476	2477	
+2477	2478	
+2478	2479	
+2479	247A	
+247A	247B	
+247B	247C	
+247C	247D	
+247D	247E	
+247E	247F	
+247F	2480	
+2480	2481	
+2481	2482	
+2482	2483	
+2483	2484	
+2484	2485	
+2485	2486	
+2486	2487	
+2487	2488	
+2488	2489	
+2489	248A	
+248A	248B	
+248B	248C	
+248C	248D	
+248D	248E	
+248E	248F	
+248F	2490	
+2490	2491	
+2491	2492	
+2492	2493	
+2493	2494	
+2494	2495	
+2495	2496	
+2496	2497	
+2497	2498	
+2498	2499	
+2499	249A	
+249A	249B	
+249B	249C	
+249C	249D	
+249D	249E	
+249E	249F	
+249F	24A0	
+24A0	24A1	
+24A1	24A2	
+24A2	24A3	
+24A3	24A4	
+24A4	24A5	
+24A5	24A6	
+24A6	24A7	
+24A7	24A8	
+24A8	24A9	
+24A9	24AA	
+24AA	24AB	
+24AB	24AC	
+24AC	24AD	
+24AD	24AE	
+24AE	24AF	
+24AF	24B0	
+24B0	24B1	
+24B1	24B2	
+24B2	24B3	
+24B3	24B4	
+24B4	24B5	
+24B5	24EA	
+2A0C		
+2A0C		
+2A74		
+2A74	2A75	
+2A75	2A76	
+2A76		
+2D6F		
+2E9F		
+2E9F		
+2EF3		
+2EF3		
+2F00		
+2F00	2F01	
+2F01	2F02	
+2F02	2F03	
+2F03	2F04	
+2F04	2F05	
+2F05	2F06	
+2F06	2F07	
+2F07	2F08	
+2F08	2F09	
+2F09	2F0A	
+2F0A	2F0B	
+2F0B	2F0C	
+2F0C	2F0D	
+2F0D	2F0E	
+2F0E	2F0F	
+2F0F	2F10	
+2F10	2F11	
+2F11	2F12	
+2F12	2F13	
+2F13	2F14	
+2F14	2F15	
+2F15	2F16	
+2F16	2F17	
+2F17	2F18	
+2F18	2F19	
+2F19	2F1A	
+2F1A	2F1B	
+2F1B	2F1C	
+2F1C	2F1D	
+2F1D	2F1E	
+2F1E	2F1F	
+2F1F	2F20	
+2F20	2F21	
+2F21	2F22	
+2F22	2F23	
+2F23	2F24	
+2F24	2F25	
+2F25	2F26	
+2F26	2F27	
+2F27	2F28	
+2F28	2F29	
+2F29	2F2A	
+2F2A	2F2B	
+2F2B	2F2C	
+2F2C	2F2D	
+2F2D	2F2E	
+2F2E	2F2F	
+2F2F	2F30	
+2F30	2F31	
+2F31	2F32	
+2F32	2F33	
+2F33	2F34	
+2F34	2F35	
+2F35	2F36	
+2F36	2F37	
+2F37	2F38	
+2F38	2F39	
+2F39	2F3A	
+2F3A	2F3B	
+2F3B	2F3C	
+2F3C	2F3D	
+2F3D	2F3E	
+2F3E	2F3F	
+2F3F	2F40	
+2F40	2F41	
+2F41	2F42	
+2F42	2F43	
+2F43	2F44	
+2F44	2F45	
+2F45	2F46	
+2F46	2F47	
+2F47	2F48	
+2F48	2F49	
+2F49	2F4A	
+2F4A	2F4B	
+2F4B	2F4C	
+2F4C	2F4D	
+2F4D	2F4E	
+2F4E	2F4F	
+2F4F	2F50	
+2F50	2F51	
+2F51	2F52	
+2F52	2F53	
+2F53	2F54	
+2F54	2F55	
+2F55	2F56	
+2F56	2F57	
+2F57	2F58	
+2F58	2F59	
+2F59	2F5A	
+2F5A	2F5B	
+2F5B	2F5C	
+2F5C	2F5D	
+2F5D	2F5E	
+2F5E	2F5F	
+2F5F	2F60	
+2F60	2F61	
+2F61	2F62	
+2F62	2F63	
+2F63	2F64	
+2F64	2F65	
+2F65	2F66	
+2F66	2F67	
+2F67	2F68	
+2F68	2F69	
+2F69	2F6A	
+2F6A	2F6B	
+2F6B	2F6C	
+2F6C	2F6D	
+2F6D	2F6E	
+2F6E	2F6F	
+2F6F	2F70	
+2F70	2F71	
+2F71	2F72	
+2F72	2F73	
+2F73	2F74	
+2F74	2F75	
+2F75	2F76	
+2F76	2F77	
+2F77	2F78	
+2F78	2F79	
+2F79	2F7A	
+2F7A	2F7B	
+2F7B	2F7C	
+2F7C	2F7D	
+2F7D	2F7E	
+2F7E	2F7F	
+2F7F	2F80	
+2F80	2F81	
+2F81	2F82	
+2F82	2F83	
+2F83	2F84	
+2F84	2F85	
+2F85	2F86	
+2F86	2F87	
+2F87	2F88	
+2F88	2F89	
+2F89	2F8A	
+2F8A	2F8B	
+2F8B	2F8C	
+2F8C	2F8D	
+2F8D	2F8E	
+2F8E	2F8F	
+2F8F	2F90	
+2F90	2F91	
+2F91	2F92	
+2F92	2F93	
+2F93	2F94	
+2F94	2F95	
+2F95	2F96	
+2F96	2F97	
+2F97	2F98	
+2F98	2F99	
+2F99	2F9A	
+2F9A	2F9B	
+2F9B	2F9C	
+2F9C	2F9D	
+2F9D	2F9E	
+2F9E	2F9F	
+2F9F	2FA0	
+2FA0	2FA1	
+2FA1	2FA2	
+2FA2	2FA3	
+2FA3	2FA4	
+2FA4	2FA5	
+2FA5	2FA6	
+2FA6	2FA7	
+2FA7	2FA8	
+2FA8	2FA9	
+2FA9	2FAA	
+2FAA	2FAB	
+2FAB	2FAC	
+2FAC	2FAD	
+2FAD	2FAE	
+2FAE	2FAF	
+2FAF	2FB0	
+2FB0	2FB1	
+2FB1	2FB2	
+2FB2	2FB3	
+2FB3	2FB4	
+2FB4	2FB5	
+2FB5	2FB6	
+2FB6	2FB7	
+2FB7	2FB8	
+2FB8	2FB9	
+2FB9	2FBA	
+2FBA	2FBB	
+2FBB	2FBC	
+2FBC	2FBD	
+2FBD	2FBE	
+2FBE	2FBF	
+2FBF	2FC0	
+2FC0	2FC1	
+2FC1	2FC2	
+2FC2	2FC3	
+2FC3	2FC4	
+2FC4	2FC5	
+2FC5	2FC6	
+2FC6	2FC7	
+2FC7	2FC8	
+2FC8	2FC9	
+2FC9	2FCA	
+2FCA	2FCB	
+2FCB	2FCC	
+2FCC	2FCD	
+2FCD	2FCE	
+2FCE	2FCF	
+2FCF	2FD0	
+2FD0	2FD1	
+2FD1	2FD2	
+2FD2	2FD3	
+2FD3	2FD4	
+2FD4	2FD5	
+2FD5		
+3000		
+3036		
+3036		
+3038		
+3038	3039	
+3039	303A	
+303A		
+309B		
+309B	309C	
+309C		
+309F		
+30FF		
+3131		
+3131	3132	
+3132	3133	
+3133	3134	
+3134	3135	
+3135	3136	
+3136	3137	
+3137	3138	
+3138	3139	
+3139	313A	
+313A	313B	
+313B	313C	
+313C	313D	
+313D	313E	
+313E	313F	
+313F	3140	
+3140	3141	
+3141	3142	
+3142	3143	
+3143	3144	
+3144	3145	
+3145	3146	
+3146	3147	
+3147	3148	
+3148	3149	
+3149	314A	
+314A	314B	
+314B	314C	
+314C	314D	
+314D	314E	
+314E	314F	
+314F	3150	
+3150	3151	
+3151	3152	
+3152	3153	
+3153	3154	
+3154	3155	
+3155	3156	
+3156	3157	
+3157	3158	
+3158	3159	
+3159	315A	
+315A	315B	
+315B	315C	
+315C	315D	
+315D	315E	
+315E	315F	
+315F	3160	
+3160	3161	
+3161	3162	
+3162	3163	
+3163	3164	
+3164	3165	
+3165	3166	
+3166	3167	
+3167	3168	
+3168	3169	
+3169	316A	
+316A	316B	
+316B	316C	
+316C	316D	
+316D	316E	
+316E	316F	
+316F	3170	
+3170	3171	
+3171	3172	
+3172	3173	
+3173	3174	
+3174	3175	
+3175	3176	
+3176	3177	
+3177	3178	
+3178	3179	
+3179	317A	
+317A	317B	
+317B	317C	
+317C	317D	
+317D	317E	
+317E	317F	
+317F	3180	
+3180	3181	
+3181	3182	
+3182	3183	
+3183	3184	
+3184	3185	
+3185	3186	
+3186	3187	
+3187	3188	
+3188	3189	
+3189	318A	
+318A	318B	
+318B	318C	
+318C	318D	
+318D	318E	
+318E		
+3192	319F	
+3200		
+3200	3201	
+3201	3202	
+3202	3203	
+3203	3204	
+3204	3205	
+3205	3206	
+3206	3207	
+3207	3208	
+3208	3209	
+3209	320A	
+320A	320B	
+320B	320C	
+320C	320D	
+320D	320E	
+320E	320F	
+320F	3210	
+3210	3211	
+3211	3212	
+3212	3213	
+3213	3214	
+3214	3215	
+3215	3216	
+3216	3217	
+3217	3218	
+3218	3219	
+3219	321A	
+321A	321B	
+321B	321C	
+321C	321D	
+321D	321E	
+321E		
+3220		
+3220	3221	
+3221	3222	
+3222	3223	
+3223	3224	
+3224	3225	
+3225	3226	
+3226	3227	
+3227	3228	
+3228	3229	
+3229	322A	
+322A	322B	
+322B	322C	
+322C	322D	
+322D	322E	
+322E	322F	
+322F	3230	
+3230	3231	
+3231	3232	
+3232	3233	
+3233	3234	
+3234	3235	
+3235	3236	
+3236	3237	
+3237	3238	
+3238	3239	
+3239	323A	
+323A	323B	
+323B	323C	
+323C	323D	
+323D	323E	
+323E	323F	
+323F	3240	
+3240	3241	
+3241	3242	
+3242	3243	
+3243		
+3250	327E	
+3280	32C0	
+32C0	32C1	
+32C1	32C2	
+32C2	32C3	
+32C3	32C4	
+32C4	32C5	
+32C5	32C6	
+32C6	32C7	
+32C7	32C8	
+32C8	32C9	
+32C9	32CA	
+32CA	32CB	
+32CB	32FE	
+3300	3358	
+3358	3359	
+3359	335A	
+335A	335B	
+335B	335C	
+335C	335D	
+335D	335E	
+335E	335F	
+335F	3360	
+3360	3361	
+3361	3362	
+3362	3363	
+3363	3364	
+3364	3365	
+3365	3366	
+3366	3367	
+3367	3368	
+3368	3369	
+3369	336A	
+336A	336B	
+336B	336C	
+336C	336D	
+336D	336E	
+336E	336F	
+336F	3370	
+3370	33E0	
+33E0	33E1	
+33E1	33E2	
+33E2	33E3	
+33E3	33E4	
+33E4	33E5	
+33E5	33E6	
+33E6	33E7	
+33E7	33E8	
+33E8	33E9	
+33E9	33EA	
+33EA	33EB	
+33EB	33EC	
+33EC	33ED	
+33ED	33EE	
+33EE	33EF	
+33EF	33F0	
+33F0	33F1	
+33F1	33F2	
+33F2	33F3	
+33F3	33F4	
+33F4	33F5	
+33F5	33F6	
+33F6	33F7	
+33F7	33F8	
+33F8	33F9	
+33F9	33FA	
+33FA	33FB	
+33FB	33FC	
+33FC	33FD	
+33FD	33FE	
+33FE	33FF	
+FB00		
+FB00	FB01	
+FB01	FB02	
+FB02	FB03	
+FB03	FB04	
+FB04	FB05	
+FB05	FB06	
+FB06		
+FB13		
+FB13	FB14	
+FB14	FB15	
+FB15	FB16	
+FB16	FB17	
+FB17		
+FB20	FB29	
+FB4F		
+FB4F	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFC	
+FE10	FE19	
+FE30	FE44	
+FE47	FE49	
+FE49	FE4A	
+FE4A	FE4B	
+FE4B	FE4C	
+FE4C	FE4D	
+FE4D	FE4E	
+FE4E	FE4F	
+FE4F	FE52	
+FE54	FE66	
+FE68	FE6B	
+FE70	FE72	
+FE74		
+FE76	FEFC	
+FF01	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+FFE0	FFE6	
+FFE8	FFEE	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D7C9	
+1D7CE	1D7FF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/enc.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/enc.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/enc.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Circle'
+#
+return <<'END';
+2460	2473	
+24B6	24EA	
+3251	327E	
+3280	32BF	
+32D0	32FE	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/fin.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/fin.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/fin.pl	(revision 14489)
@@ -0,0 +1,122 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Final'
+#
+return <<'END';
+FB51		
+FB53		
+FB57		
+FB5B		
+FB5F		
+FB63		
+FB67		
+FB6B		
+FB6F		
+FB73		
+FB77		
+FB7B		
+FB7F		
+FB83		
+FB85		
+FB87		
+FB89		
+FB8B		
+FB8D		
+FB8F		
+FB93		
+FB97		
+FB9B		
+FB9F		
+FBA1		
+FBA5		
+FBA7		
+FBAB		
+FBAF		
+FBB1		
+FBD4		
+FBD8		
+FBDA		
+FBDC		
+FBDF		
+FBE1		
+FBE3		
+FBE5		
+FBEB		
+FBED		
+FBEF		
+FBF1		
+FBF3		
+FBF5		
+FBF7		
+FBFA		
+FBFD		
+FC64	FC96	
+FD11	FD2C	
+FD3C		
+FD51		
+FD58		
+FD5A	FD5B	
+FD5E	FD5F	
+FD62		
+FD64		
+FD66	FD67	
+FD69	FD6A	
+FD6C		
+FD6E	FD6F	
+FD71		
+FD74	FD76	
+FD78	FD7C	
+FD7E	FD82	
+FD84	FD85	
+FD87		
+FD8B		
+FD96	FD97	
+FD99	FD9C	
+FD9E	FDB3	
+FDB6	FDB7	
+FDB9		
+FDBB	FDC2	
+FDC6	FDC7	
+FE82		
+FE84		
+FE86		
+FE88		
+FE8A		
+FE8E		
+FE90		
+FE94		
+FE96		
+FE9A		
+FE9E		
+FEA2		
+FEA6		
+FEAA		
+FEAC		
+FEAE		
+FEB0		
+FEB2		
+FEB6		
+FEBA		
+FEBE		
+FEC2		
+FEC6		
+FECA		
+FECE		
+FED2		
+FED6		
+FEDA		
+FEDE		
+FEE2		
+FEE6		
+FEEA		
+FEEE		
+FEF0		
+FEF2		
+FEF6		
+FEF8		
+FEFA		
+FEFC		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/font.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/font.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/font.pl	(revision 14489)
@@ -0,0 +1,43 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Font'
+#
+return <<'END';
+2102		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2128		
+212C	212D	
+212F	2131	
+2133	2134	
+2139		
+213C	2140	
+2145	2149	
+FB20	FB29	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D7C9	
+1D7CE	1D7FF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/fra.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/fra.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/fra.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Fraction'
+#
+return <<'END';
+00BC	00BE	
+2153	215F	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/init.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/init.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/init.pl	(revision 14489)
@@ -0,0 +1,84 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Initial'
+#
+return <<'END';
+FB54		
+FB58		
+FB5C		
+FB60		
+FB64		
+FB68		
+FB6C		
+FB70		
+FB74		
+FB78		
+FB7C		
+FB80		
+FB90		
+FB94		
+FB98		
+FB9C		
+FBA2		
+FBA8		
+FBAC		
+FBD5		
+FBE6		
+FBE8		
+FBF8		
+FBFB		
+FBFE		
+FC97	FCDE	
+FD2D	FD33	
+FD50		
+FD52	FD57	
+FD59		
+FD5C	FD5D	
+FD60	FD61	
+FD63		
+FD65		
+FD68		
+FD6B		
+FD6D		
+FD70		
+FD72	FD73	
+FD77		
+FD7D		
+FD83		
+FD86		
+FD88	FD8A	
+FD8C	FD8F	
+FD92	FD95	
+FD98		
+FD9D		
+FDB4	FDB5	
+FDB8		
+FDBA		
+FDC3	FDC5	
+FE8B		
+FE91		
+FE97		
+FE9B		
+FE9F		
+FEA3		
+FEA7		
+FEB3		
+FEB7		
+FEBB		
+FEBF		
+FEC3		
+FEC7		
+FECB		
+FECF		
+FED3		
+FED7		
+FEDB		
+FEDF		
+FEE3		
+FEE7		
+FEEB		
+FEF3		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/iso.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/iso.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/iso.pl	(revision 14489)
@@ -0,0 +1,107 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Isolated'
+#
+return <<'END';
+FB50		
+FB52		
+FB56		
+FB5A		
+FB5E		
+FB62		
+FB66		
+FB6A		
+FB6E		
+FB72		
+FB76		
+FB7A		
+FB7E		
+FB82		
+FB84		
+FB86		
+FB88		
+FB8A		
+FB8C		
+FB8E		
+FB92		
+FB96		
+FB9A		
+FB9E		
+FBA0		
+FBA4		
+FBA6		
+FBAA		
+FBAE		
+FBB0		
+FBD3		
+FBD7		
+FBD9		
+FBDB		
+FBDD	FBDE	
+FBE0		
+FBE2		
+FBE4		
+FBEA		
+FBEC		
+FBEE		
+FBF0		
+FBF2		
+FBF4		
+FBF6		
+FBF9		
+FBFC		
+FC00	FC63	
+FCF5	FD10	
+FD3D		
+FDF0	FDFC	
+FE70		
+FE72		
+FE74		
+FE76		
+FE78		
+FE7A		
+FE7C		
+FE7E		
+FE80	FE81	
+FE83		
+FE85		
+FE87		
+FE89		
+FE8D		
+FE8F		
+FE93		
+FE95		
+FE99		
+FE9D		
+FEA1		
+FEA5		
+FEA9		
+FEAB		
+FEAD		
+FEAF		
+FEB1		
+FEB5		
+FEB9		
+FEBD		
+FEC1		
+FEC5		
+FEC9		
+FECD		
+FED1		
+FED5		
+FED9		
+FEDD		
+FEE1		
+FEE5		
+FEE9		
+FEED		
+FEEF		
+FEF1		
+FEF5		
+FEF7		
+FEF9		
+FEFB		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/med.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/med.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/med.pl	(revision 14489)
@@ -0,0 +1,63 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Medial'
+#
+return <<'END';
+FB55		
+FB59		
+FB5D		
+FB61		
+FB65		
+FB69		
+FB6D		
+FB71		
+FB75		
+FB79		
+FB7D		
+FB81		
+FB91		
+FB95		
+FB99		
+FB9D		
+FBA3		
+FBA9		
+FBAD		
+FBD6		
+FBE7		
+FBE9		
+FBFF		
+FCDF	FCF4	
+FD34	FD3B	
+FE71		
+FE77		
+FE79		
+FE7B		
+FE7D		
+FE7F		
+FE8C		
+FE92		
+FE98		
+FE9C		
+FEA0		
+FEA4		
+FEA8		
+FEB4		
+FEB8		
+FEBC		
+FEC0		
+FEC4		
+FEC8		
+FECC		
+FED0		
+FED4		
+FED8		
+FEDC		
+FEE0		
+FEE4		
+FEE8		
+FEEC		
+FEF4		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/nar.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/nar.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/nar.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Narrow'
+#
+return <<'END';
+FF61	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+FFE8	FFEE	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/nb.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/nb.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/nb.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Nobreak'
+#
+return <<'END';
+00A0		
+0F0C		
+2007		
+2011		
+202F		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sml.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sml.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sml.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Small'
+#
+return <<'END';
+FE50	FE52	
+FE54	FE66	
+FE68	FE6B	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sqr.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sqr.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sqr.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Square'
+#
+return <<'END';
+3250		
+32CC	32CF	
+3300	3357	
+3371	33DF	
+33FF		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sub.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sub.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sub.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Sub'
+#
+return <<'END';
+1D62	1D6A	
+2080	208E	
+2090	2094	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sup.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sup.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/sup.pl	(revision 14489)
@@ -0,0 +1,27 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Super'
+#
+return <<'END';
+00AA		
+00B2	00B3	
+00B9	00BA	
+02B0	02B8	
+02E0	02E4	
+10FC		
+1D2C	1D2E	
+1D30	1D3A	
+1D3C	1D4D	
+1D4F	1D61	
+1D78		
+1D9B	1DBF	
+2070	2071	
+2074	207F	
+2120		
+2122		
+2D6F		
+3192	319F	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/vert.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/vert.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/vert.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Vertical'
+#
+return <<'END';
+309F		
+30FF		
+FE10	FE19	
+FE30	FE44	
+FE47	FE48	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/wide.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/wide.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/dt/wide.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# DecompositionType category 'Wide'
+#
+return <<'END';
+3000		
+FF01	FF60	
+FFE0	FFE6	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/A.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/A.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/A.pl	(revision 14489)
@@ -0,0 +1,168 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# EastAsianWidth category 'Ambiguous'
+#
+return <<'END';
+00A1		
+00A4		
+00A7	00A8	
+00AA		
+00AD	00AE	
+00B0	00B4	
+00B6	00BA	
+00BC	00BF	
+00C6		
+00D0		
+00D7	00D8	
+00DE	00E1	
+00E6		
+00E8	00EA	
+00EC	00ED	
+00F0		
+00F2	00F3	
+00F7	00FA	
+00FC		
+00FE		
+0101		
+0111		
+0113		
+011B		
+0126	0127	
+012B		
+0131	0133	
+0138		
+013F	0142	
+0144		
+0148	014B	
+014D		
+0152	0153	
+0166	0167	
+016B		
+01CE		
+01D0		
+01D2		
+01D4		
+01D6		
+01D8		
+01DA		
+01DC		
+0251		
+0261		
+02C4		
+02C7		
+02C9	02CB	
+02CD		
+02D0		
+02D8	02DB	
+02DD		
+02DF		
+0300	036F	
+0391	03A1	
+03A3	03A9	
+03B1	03C1	
+03C3	03C9	
+0401		
+0410	044F	
+0451		
+2010		
+2013	2016	
+2018	2019	
+201C	201D	
+2020	2022	
+2024	2027	
+2030		
+2032	2033	
+2035		
+203B		
+203E		
+2074		
+207F		
+2081	2084	
+20AC		
+2103		
+2105		
+2109		
+2113		
+2116		
+2121	2122	
+2126		
+212B		
+2153	2154	
+215B	215E	
+2160	216B	
+2170	2179	
+2190	2199	
+21B8	21B9	
+21D2		
+21D4		
+21E7		
+2200		
+2202	2203	
+2207	2208	
+220B		
+220F		
+2211		
+2215		
+221A		
+221D	2220	
+2223		
+2225		
+2227	222C	
+222E		
+2234	2237	
+223C	223D	
+2248		
+224C		
+2252		
+2260	2261	
+2264	2267	
+226A	226B	
+226E	226F	
+2282	2283	
+2286	2287	
+2295		
+2299		
+22A5		
+22BF		
+2312		
+2460	24E9	
+24EB	254B	
+2550	2573	
+2580	258F	
+2592	2595	
+25A0	25A1	
+25A3	25A9	
+25B2	25B3	
+25B6	25B7	
+25BC	25BD	
+25C0	25C1	
+25C6	25C8	
+25CB		
+25CE	25D1	
+25E2	25E5	
+25EF		
+2605	2606	
+2609		
+260E	260F	
+2614	2615	
+261C		
+261E		
+2640		
+2642		
+2660	2661	
+2663	2665	
+2667	266A	
+266C	266D	
+266F		
+273D		
+2776	277F	
+E000	F8FF	
+FE00	FE0F	
+FFFD		
+E0100	E01EF	
+F0000	FFFFD	
+100000	10FFFD	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/F.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/F.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/F.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# EastAsianWidth category 'Fullwidth'
+#
+return <<'END';
+3000		
+FF01	FF60	
+FFE0	FFE6	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/H.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/H.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/H.pl	(revision 14489)
@@ -0,0 +1,16 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# EastAsianWidth category 'Halfwidth'
+#
+return <<'END';
+20A9		
+FF61	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+FFE8	FFEE	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/N.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/N.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/N.pl	(revision 14489)
@@ -0,0 +1,540 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# EastAsianWidth category 'Neutral'
+#
+return <<'END';
+0000	001F	
+007F	00A0	
+00A9		
+00AB		
+00B5		
+00BB		
+00C0	00C5	
+00C7	00CF	
+00D1	00D6	
+00D9	00DD	
+00E2	00E5	
+00E7		
+00EB		
+00EE	00EF	
+00F1		
+00F4	00F6	
+00FB		
+00FD		
+00FF	0100	
+0102	0110	
+0112		
+0114	011A	
+011C	0125	
+0128	012A	
+012C	0130	
+0134	0137	
+0139	013E	
+0143		
+0145	0147	
+014C		
+014E	0151	
+0154	0165	
+0168	016A	
+016C	01CD	
+01CF		
+01D1		
+01D3		
+01D5		
+01D7		
+01D9		
+01DB		
+01DD	0241	
+0250		
+0252	0260	
+0262	02C3	
+02C5	02C6	
+02C8		
+02CC		
+02CE	02CF	
+02D1	02D7	
+02DC		
+02DE		
+02E0	02FF	
+0374	0375	
+037A		
+037E		
+0384	038A	
+038C		
+038E	0390	
+03AA	03B0	
+03C2		
+03CA	03CE	
+03D0	0400	
+0402	040F	
+0450		
+0452	0486	
+0488	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559	055F	
+0561	0587	
+0589	058A	
+0591	05B9	
+05BB	05C7	
+05D0	05EA	
+05F0	05F4	
+0600	0603	
+060B	0615	
+061B		
+061E	061F	
+0621	063A	
+0640	065E	
+0660	070D	
+070F	074A	
+074D	076D	
+0780	07B1	
+0901	0939	
+093C	094D	
+0950	0954	
+0958	0970	
+097D		
+0981	0983	
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BC	09C4	
+09C7	09C8	
+09CB	09CE	
+09D7		
+09DC	09DD	
+09DF	09E3	
+09E6	09FA	
+0A01	0A03	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A3C		
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A59	0A5C	
+0A5E		
+0A66	0A74	
+0A81	0A83	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABC	0AC5	
+0AC7	0AC9	
+0ACB	0ACD	
+0AD0		
+0AE0	0AE3	
+0AE6	0AEF	
+0AF1		
+0B01	0B03	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3C	0B43	
+0B47	0B48	
+0B4B	0B4D	
+0B56	0B57	
+0B5C	0B5D	
+0B5F	0B61	
+0B66	0B71	
+0B82	0B83	
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCD	
+0BD7		
+0BE6	0BFA	
+0C01	0C03	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0C60	0C61	
+0C66	0C6F	
+0C82	0C83	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBC	0CC4	
+0CC6	0CC8	
+0CCA	0CCD	
+0CD5	0CD6	
+0CDE		
+0CE0	0CE1	
+0CE6	0CEF	
+0D02	0D03	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4D	
+0D57		
+0D60	0D61	
+0D66	0D6F	
+0D82	0D83	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DCA		
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF4	
+0E01	0E3A	
+0E3F	0E5B	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB9	
+0EBB	0EBD	
+0EC0	0EC4	
+0EC6		
+0EC8	0ECD	
+0ED0	0ED9	
+0EDC	0EDD	
+0F00	0F47	
+0F49	0F6A	
+0F71	0F8B	
+0F90	0F97	
+0F99	0FBC	
+0FBE	0FCC	
+0FCF	0FD1	
+1000	1021	
+1023	1027	
+1029	102A	
+102C	1032	
+1036	1039	
+1040	1059	
+10A0	10C5	
+10D0	10FC	
+1160	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+135F	137C	
+1380	1399	
+13A0	13F4	
+1401	1676	
+1680	169C	
+16A0	16F0	
+1700	170C	
+170E	1714	
+1720	1736	
+1740	1753	
+1760	176C	
+176E	1770	
+1772	1773	
+1780	17DD	
+17E0	17E9	
+17F0	17F9	
+1800	180E	
+1810	1819	
+1820	1877	
+1880	18A9	
+1900	191C	
+1920	192B	
+1930	193B	
+1940		
+1944	196D	
+1970	1974	
+1980	19A9	
+19B0	19C9	
+19D0	19D9	
+19DE	1A1B	
+1A1E	1A1F	
+1D00	1DC3	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FC4	
+1FC6	1FD3	
+1FD6	1FDB	
+1FDD	1FEF	
+1FF2	1FF4	
+1FF6	1FFE	
+2000	200F	
+2011	2012	
+2017		
+201A	201B	
+201E	201F	
+2023		
+2028	202F	
+2031		
+2034		
+2036	203A	
+203C	203D	
+203F	2063	
+206A	2071	
+2075	207E	
+2080		
+2085	208E	
+2090	2094	
+20A0	20A8	
+20AA	20AB	
+20AD	20B5	
+20D0	20EB	
+2100	2102	
+2104		
+2106	2108	
+210A	2112	
+2114	2115	
+2117	2120	
+2123	2125	
+2127	212A	
+212C	214C	
+2155	215A	
+215F		
+216C	216F	
+217A	2183	
+219A	21B7	
+21BA	21D1	
+21D3		
+21D5	21E6	
+21E8	21FF	
+2201		
+2204	2206	
+2209	220A	
+220C	220E	
+2210		
+2212	2214	
+2216	2219	
+221B	221C	
+2221	2222	
+2224		
+2226		
+222D		
+222F	2233	
+2238	223B	
+223E	2247	
+2249	224B	
+224D	2251	
+2253	225F	
+2262	2263	
+2268	2269	
+226C	226D	
+2270	2281	
+2284	2285	
+2288	2294	
+2296	2298	
+229A	22A4	
+22A6	22BE	
+22C0	2311	
+2313	2328	
+232B	23DB	
+2400	2426	
+2440	244A	
+24EA		
+254C	254F	
+2574	257F	
+2590	2591	
+2596	259F	
+25A2		
+25AA	25B1	
+25B4	25B5	
+25B8	25BB	
+25BE	25BF	
+25C2	25C5	
+25C9	25CA	
+25CC	25CD	
+25D2	25E1	
+25E6	25EE	
+25F0	2604	
+2607	2608	
+260A	260D	
+2610	2613	
+2616	261B	
+261D		
+261F	263F	
+2641		
+2643	265F	
+2662		
+2666		
+266B		
+266E		
+2670	269C	
+26A0	26B1	
+2701	2704	
+2706	2709	
+270C	2727	
+2729	273C	
+273E	274B	
+274D		
+274F	2752	
+2756		
+2758	275E	
+2761	2775	
+2780	2794	
+2798	27AF	
+27B1	27BE	
+27C0	27C6	
+27D0	27E5	
+27F0	2984	
+2987	2B13	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CEA	
+2CF9	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+2E00	2E17	
+2E1C	2E1D	
+303F		
+4DC0	4DFF	
+A700	A716	
+A800	A82B	
+D800	DFFF	
+FB00	FB06	
+FB13	FB17	
+FB1D	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3F	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFD	
+FE20	FE23	
+FE70	FE74	
+FE76	FEFC	
+FEFF		
+FFF9	FFFC	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10100	10102	
+10107	10133	
+10137	1018A	
+10300	1031E	
+10320	10323	
+10330	1034A	
+10380	1039D	
+1039F	103C3	
+103C8	103D5	
+10400	1049D	
+104A0	104A9	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00	10A03	
+10A05	10A06	
+10A0C	10A13	
+10A15	10A17	
+10A19	10A33	
+10A38	10A3A	
+10A3F	10A47	
+10A50	10A58	
+1D000	1D0F5	
+1D100	1D126	
+1D12A	1D1DD	
+1D200	1D245	
+1D300	1D356	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D7C9	
+1D7CE	1D7FF	
+E0001		
+E0020	E007F	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/Na.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/Na.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/Na.pl	(revision 14489)
@@ -0,0 +1,16 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# EastAsianWidth category 'Narrow'
+#
+return <<'END';
+0020	007E	
+00A2	00A3	
+00A5	00A6	
+00AC		
+00AF		
+27E6	27EB	
+2985	2986	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/W.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/W.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/ea/W.pl	(revision 14489)
@@ -0,0 +1,40 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# EastAsianWidth category 'Wide'
+#
+return <<'END';
+1100	1159	
+115F		
+2329	232A	
+2E80	2E99	
+2E9B	2EF3	
+2F00	2FD5	
+2FF0	2FFB	
+3001	303E	
+3041	3096	
+3099	30FF	
+3105	312C	
+3131	318E	
+3190	31B7	
+31C0	31CF	
+31F0	321E	
+3220	3243	
+3250	32FE	
+3300	4DB5	
+4E00	9FBB	
+A000	A48C	
+A490	A4C6	
+AC00	D7A3	
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FE10	FE19	
+FE30	FE52	
+FE54	FE66	
+FE68	FE6B	
+20000	2FFFD	
+30000	3FFFD	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/AHex.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/AHex.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/AHex.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'ASCII_Hex_Digit'
+#
+return <<'END';
+0030	0039	ASCII_Hex_Digit
+0041	0046	ASCII_Hex_Digit
+0061	0066	ASCII_Hex_Digit
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/ASCII.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/ASCII.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/ASCII.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{ASCII}
+# 
+# Meaning: [[:ASCII:]]
+#
+return <<'END';
+0000	007F	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Alnum.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Alnum.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Alnum.pl	(revision 14489)
@@ -0,0 +1,448 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Alnum}
+# 
+# Meaning: [[:Alnum:]]
+#
+return <<'END';
+0030	0039	
+0041	005A	
+0061	007A	
+00AA		
+00B5		
+00BA		
+00C0	00D6	
+00D8	00F6	
+00F8	0241	
+0250	02C1	
+02C6	02D1	
+02E0	02E4	
+02EE		
+0300	036F	
+037A		
+0386		
+0388	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	03F5	
+03F7	0481	
+0483	0486	
+0488	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559		
+0561	0587	
+0591	05B9	
+05BB	05BD	
+05BF		
+05C1	05C2	
+05C4	05C5	
+05C7		
+05D0	05EA	
+05F0	05F2	
+0610	0615	
+0621	063A	
+0640	065E	
+0660	0669	
+066E	06D3	
+06D5	06DC	
+06DE	06E8	
+06EA	06FC	
+06FF		
+0710	074A	
+074D	076D	
+0780	07B1	
+0901	0939	
+093C	094D	
+0950	0954	
+0958	0963	
+0966	096F	
+097D		
+0981	0983	
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BC	09C4	
+09C7	09C8	
+09CB	09CE	
+09D7		
+09DC	09DD	
+09DF	09E3	
+09E6	09F1	
+0A01	0A03	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A3C		
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A59	0A5C	
+0A5E		
+0A66	0A74	
+0A81	0A83	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABC	0AC5	
+0AC7	0AC9	
+0ACB	0ACD	
+0AD0		
+0AE0	0AE3	
+0AE6	0AEF	
+0B01	0B03	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3C	0B43	
+0B47	0B48	
+0B4B	0B4D	
+0B56	0B57	
+0B5C	0B5D	
+0B5F	0B61	
+0B66	0B6F	
+0B71		
+0B82	0B83	
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCD	
+0BD7		
+0BE6	0BEF	
+0C01	0C03	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0C60	0C61	
+0C66	0C6F	
+0C82	0C83	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBC	0CC4	
+0CC6	0CC8	
+0CCA	0CCD	
+0CD5	0CD6	
+0CDE		
+0CE0	0CE1	
+0CE6	0CEF	
+0D02	0D03	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4D	
+0D57		
+0D60	0D61	
+0D66	0D6F	
+0D82	0D83	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DCA		
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF3	
+0E01	0E3A	
+0E40	0E4E	
+0E50	0E59	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB9	
+0EBB	0EBD	
+0EC0	0EC4	
+0EC6		
+0EC8	0ECD	
+0ED0	0ED9	
+0EDC	0EDD	
+0F00		
+0F18	0F19	
+0F20	0F29	
+0F35		
+0F37		
+0F39		
+0F3E	0F47	
+0F49	0F6A	
+0F71	0F84	
+0F86	0F8B	
+0F90	0F97	
+0F99	0FBC	
+0FC6		
+1000	1021	
+1023	1027	
+1029	102A	
+102C	1032	
+1036	1039	
+1040	1049	
+1050	1059	
+10A0	10C5	
+10D0	10FA	
+10FC		
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+135F		
+1380	138F	
+13A0	13F4	
+1401	166C	
+166F	1676	
+1681	169A	
+16A0	16EA	
+1700	170C	
+170E	1714	
+1720	1734	
+1740	1753	
+1760	176C	
+176E	1770	
+1772	1773	
+1780	17B3	
+17B6	17D3	
+17D7		
+17DC	17DD	
+17E0	17E9	
+180B	180D	
+1810	1819	
+1820	1877	
+1880	18A9	
+1900	191C	
+1920	192B	
+1930	193B	
+1946	196D	
+1970	1974	
+1980	19A9	
+19B0	19C9	
+19D0	19D9	
+1A00	1A1B	
+1D00	1DC3	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FBC	
+1FBE		
+1FC2	1FC4	
+1FC6	1FCC	
+1FD0	1FD3	
+1FD6	1FDB	
+1FE0	1FEC	
+1FF2	1FF4	
+1FF6	1FFC	
+2071		
+207F		
+2090	2094	
+20D0	20EB	
+2102		
+2107		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+212F	2131	
+2133	2139	
+213C	213F	
+2145	2149	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CE4	
+2D00	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+3005	3006	
+302A	302F	
+3031	3035	
+303B	303C	
+3041	3096	
+3099	309A	
+309D	309F	
+30A1	30FA	
+30FC	30FF	
+3105	312C	
+3131	318E	
+31A0	31B7	
+31F0	31FF	
+3400	4DB5	
+4E00	9FBB	
+A000	A48C	
+A800	A827	
+AC00	D7A3	
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FB1D	FB28	
+FB2A	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFB	
+FE00	FE0F	
+FE20	FE23	
+FE70	FE74	
+FE76	FEFC	
+FF10	FF19	
+FF21	FF3A	
+FF41	FF5A	
+FF66	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10300	1031E	
+10330	10349	
+10380	1039D	
+103A0	103C3	
+103C8	103CF	
+10400	1049D	
+104A0	104A9	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00	10A03	
+10A05	10A06	
+10A0C	10A13	
+10A15	10A17	
+10A19	10A33	
+10A38	10A3A	
+10A3F		
+1D165	1D169	
+1D16D	1D172	
+1D17B	1D182	
+1D185	1D18B	
+1D1AA	1D1AD	
+1D242	1D244	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D6C0	
+1D6C2	1D6DA	
+1D6DC	1D6FA	
+1D6FC	1D714	
+1D716	1D734	
+1D736	1D74E	
+1D750	1D76E	
+1D770	1D788	
+1D78A	1D7A8	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+1D7CE	1D7FF	
+20000	2A6D6	
+2F800	2FA1D	
+E0100	E01EF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Alpha.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Alpha.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Alpha.pl	(revision 14489)
@@ -0,0 +1,430 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Alpha}
+# 
+# Meaning: [[:Alpha:]]
+#
+return <<'END';
+0041	005A	
+0061	007A	
+00AA		
+00B5		
+00BA		
+00C0	00D6	
+00D8	00F6	
+00F8	0241	
+0250	02C1	
+02C6	02D1	
+02E0	02E4	
+02EE		
+0300	036F	
+037A		
+0386		
+0388	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	03F5	
+03F7	0481	
+0483	0486	
+0488	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559		
+0561	0587	
+0591	05B9	
+05BB	05BD	
+05BF		
+05C1	05C2	
+05C4	05C5	
+05C7		
+05D0	05EA	
+05F0	05F2	
+0610	0615	
+0621	063A	
+0640	065E	
+066E	06D3	
+06D5	06DC	
+06DE	06E8	
+06EA	06EF	
+06FA	06FC	
+06FF		
+0710	074A	
+074D	076D	
+0780	07B1	
+0901	0939	
+093C	094D	
+0950	0954	
+0958	0963	
+097D		
+0981	0983	
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BC	09C4	
+09C7	09C8	
+09CB	09CE	
+09D7		
+09DC	09DD	
+09DF	09E3	
+09F0	09F1	
+0A01	0A03	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A3C		
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A59	0A5C	
+0A5E		
+0A70	0A74	
+0A81	0A83	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABC	0AC5	
+0AC7	0AC9	
+0ACB	0ACD	
+0AD0		
+0AE0	0AE3	
+0B01	0B03	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3C	0B43	
+0B47	0B48	
+0B4B	0B4D	
+0B56	0B57	
+0B5C	0B5D	
+0B5F	0B61	
+0B71		
+0B82	0B83	
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCD	
+0BD7		
+0C01	0C03	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0C60	0C61	
+0C82	0C83	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBC	0CC4	
+0CC6	0CC8	
+0CCA	0CCD	
+0CD5	0CD6	
+0CDE		
+0CE0	0CE1	
+0D02	0D03	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4D	
+0D57		
+0D60	0D61	
+0D82	0D83	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DCA		
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF3	
+0E01	0E3A	
+0E40	0E4E	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB9	
+0EBB	0EBD	
+0EC0	0EC4	
+0EC6		
+0EC8	0ECD	
+0EDC	0EDD	
+0F00		
+0F18	0F19	
+0F35		
+0F37		
+0F39		
+0F3E	0F47	
+0F49	0F6A	
+0F71	0F84	
+0F86	0F8B	
+0F90	0F97	
+0F99	0FBC	
+0FC6		
+1000	1021	
+1023	1027	
+1029	102A	
+102C	1032	
+1036	1039	
+1050	1059	
+10A0	10C5	
+10D0	10FA	
+10FC		
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+135F		
+1380	138F	
+13A0	13F4	
+1401	166C	
+166F	1676	
+1681	169A	
+16A0	16EA	
+1700	170C	
+170E	1714	
+1720	1734	
+1740	1753	
+1760	176C	
+176E	1770	
+1772	1773	
+1780	17B3	
+17B6	17D3	
+17D7		
+17DC	17DD	
+180B	180D	
+1820	1877	
+1880	18A9	
+1900	191C	
+1920	192B	
+1930	193B	
+1950	196D	
+1970	1974	
+1980	19A9	
+19B0	19C9	
+1A00	1A1B	
+1D00	1DC3	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FBC	
+1FBE		
+1FC2	1FC4	
+1FC6	1FCC	
+1FD0	1FD3	
+1FD6	1FDB	
+1FE0	1FEC	
+1FF2	1FF4	
+1FF6	1FFC	
+2071		
+207F		
+2090	2094	
+20D0	20EB	
+2102		
+2107		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+212F	2131	
+2133	2139	
+213C	213F	
+2145	2149	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CE4	
+2D00	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+3005	3006	
+302A	302F	
+3031	3035	
+303B	303C	
+3041	3096	
+3099	309A	
+309D	309F	
+30A1	30FA	
+30FC	30FF	
+3105	312C	
+3131	318E	
+31A0	31B7	
+31F0	31FF	
+3400	4DB5	
+4E00	9FBB	
+A000	A48C	
+A800	A827	
+AC00	D7A3	
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FB1D	FB28	
+FB2A	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFB	
+FE00	FE0F	
+FE20	FE23	
+FE70	FE74	
+FE76	FEFC	
+FF21	FF3A	
+FF41	FF5A	
+FF66	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10300	1031E	
+10330	10349	
+10380	1039D	
+103A0	103C3	
+103C8	103CF	
+10400	1049D	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00	10A03	
+10A05	10A06	
+10A0C	10A13	
+10A15	10A17	
+10A19	10A33	
+10A38	10A3A	
+10A3F		
+1D165	1D169	
+1D16D	1D172	
+1D17B	1D182	
+1D185	1D18B	
+1D1AA	1D1AD	
+1D242	1D244	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D6C0	
+1D6C2	1D6DA	
+1D6DC	1D6FA	
+1D6FC	1D714	
+1D716	1D734	
+1D736	1D74E	
+1D750	1D76E	
+1D770	1D788	
+1D78A	1D7A8	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+20000	2A6D6	
+2F800	2FA1D	
+E0100	E01EF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Alphabet.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Alphabet.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Alphabet.pl	(revision 14489)
@@ -0,0 +1,415 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Alphabetic} (and fuzzy permutations)
+# 
+# Meaning: [\p{L}\p{OtherAlphabetic}]
+#
+return <<'END';
+0041	005A	
+0061	007A	
+00AA		
+00B5		
+00BA		
+00C0	00D6	
+00D8	00F6	
+00F8	0241	
+0250	02C1	
+02C6	02D1	
+02E0	02E4	
+02EE		
+0345		
+037A		
+0386		
+0388	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	03F5	
+03F7	0481	
+048A	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559		
+0561	0587	
+05B0	05B9	
+05BB	05BD	
+05BF		
+05C1	05C2	
+05C4	05C5	
+05C7		
+05D0	05EA	
+05F0	05F2	
+0610	0615	
+0621	063A	
+0640	0657	
+0659	065E	
+066E	06D3	
+06D5	06DC	
+06E1	06E8	
+06ED	06EF	
+06FA	06FC	
+06FF		
+0710	073F	
+074D	076D	
+0780	07B1	
+0901	0939	
+093D	094C	
+0950		
+0958	0963	
+097D		
+0981	0983	
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BD	09C4	
+09C7	09C8	
+09CB	09CC	
+09CE		
+09D7		
+09DC	09DD	
+09DF	09E3	
+09F0	09F1	
+0A01	0A03	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4C	
+0A59	0A5C	
+0A5E		
+0A70	0A74	
+0A81	0A83	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABD	0AC5	
+0AC7	0AC9	
+0ACB	0ACC	
+0AD0		
+0AE0	0AE3	
+0B01	0B03	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3D	0B43	
+0B47	0B48	
+0B4B	0B4C	
+0B56	0B57	
+0B5C	0B5D	
+0B5F	0B61	
+0B71		
+0B82	0B83	
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCC	
+0BD7		
+0C01	0C03	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4C	
+0C55	0C56	
+0C60	0C61	
+0C82	0C83	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBD	0CC4	
+0CC6	0CC8	
+0CCA	0CCC	
+0CD5	0CD6	
+0CDE		
+0CE0	0CE1	
+0D02	0D03	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4C	
+0D57		
+0D60	0D61	
+0D82	0D83	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF3	
+0E01	0E3A	
+0E40	0E46	
+0E4D		
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB9	
+0EBB	0EBD	
+0EC0	0EC4	
+0EC6		
+0ECD		
+0EDC	0EDD	
+0F00		
+0F40	0F47	
+0F49	0F6A	
+0F71	0F81	
+0F88	0F8B	
+0F90	0F97	
+0F99	0FBC	
+1000	1021	
+1023	1027	
+1029	102A	
+102C	1032	
+1036		
+1038		
+1050	1059	
+10A0	10C5	
+10D0	10FA	
+10FC		
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+135F		
+1380	138F	
+13A0	13F4	
+1401	166C	
+166F	1676	
+1681	169A	
+16A0	16EA	
+1700	170C	
+170E	1713	
+1720	1733	
+1740	1753	
+1760	176C	
+176E	1770	
+1772	1773	
+1780	17B3	
+17B6	17C8	
+17D7		
+17DC		
+1820	1877	
+1880	18A9	
+1900	191C	
+1920	192B	
+1930	1938	
+1950	196D	
+1970	1974	
+1980	19A9	
+19B0	19C9	
+1A00	1A1B	
+1D00	1DBF	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FBC	
+1FBE		
+1FC2	1FC4	
+1FC6	1FCC	
+1FD0	1FD3	
+1FD6	1FDB	
+1FE0	1FEC	
+1FF2	1FF4	
+1FF6	1FFC	
+2071		
+207F		
+2090	2094	
+2102		
+2107		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+212F	2131	
+2133	2139	
+213C	213F	
+2145	2149	
+24B6	24E9	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CE4	
+2D00	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+3005	3006	
+3031	3035	
+303B	303C	
+3041	3096	
+309D	309F	
+30A1	30FA	
+30FC	30FF	
+3105	312C	
+3131	318E	
+31A0	31B7	
+31F0	31FF	
+3400	4DB5	
+4E00	9FBB	
+A000	A48C	
+A800	A801	
+A803	A805	
+A807	A80A	
+A80C	A827	
+AC00	D7A3	
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FB1D	FB28	
+FB2A	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFB	
+FE70	FE74	
+FE76	FEFC	
+FF21	FF3A	
+FF41	FF5A	
+FF66	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10300	1031E	
+10330	10349	
+10380	1039D	
+103A0	103C3	
+103C8	103CF	
+10400	1049D	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00	10A03	
+10A05	10A06	
+10A0C	10A13	
+10A15	10A17	
+10A19	10A33	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D6C0	
+1D6C2	1D6DA	
+1D6DC	1D6FA	
+1D6FC	1D714	
+1D716	1D734	
+1D736	1D74E	
+1D750	1D76E	
+1D770	1D788	
+1D78A	1D7A8	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+20000	2A6D6	
+2F800	2FA1D	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Any.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Any.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Any.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Any}
+# 	\p{Any}
+# 
+# Meaning: [\x{0000}-\x{10FFFF}]
+#
+return <<'END';
+0000	10FFFF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Arab.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Arab.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Arab.pl	(revision 14489)
@@ -0,0 +1,29 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Arabic} (and fuzzy permutations)
+# 
+# Meaning: Script 'Arabic'
+#
+return <<'END';
+060B		Arabic
+060D	0615	Arabic
+061E		Arabic
+0621	063A	Arabic
+0641	064A	Arabic
+0656	065E	Arabic
+066A	066F	Arabic
+0671	06DC	Arabic
+06DE	06FF	Arabic
+0750	076D	Arabic
+FB50	FBB1	Arabic
+FBD3	FD3D	Arabic
+FD50	FD8F	Arabic
+FD92	FDC7	Arabic
+FDF0	FDFC	Arabic
+FE70	FE74	Arabic
+FE76	FEFC	Arabic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Armn.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Armn.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Armn.pl	(revision 14489)
@@ -0,0 +1,17 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Armenian} (and fuzzy permutations)
+# 
+# Meaning: Script 'Armenian'
+#
+return <<'END';
+0531	0556	Armenian
+0559	055F	Armenian
+0561	0587	Armenian
+058A		Armenian
+FB13	FB17	Armenian
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/AsciiHex.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/AsciiHex.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/AsciiHex.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{AsciiHexDigit} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'ASCII_Hex_Digit'
+#
+return <<'END';
+0030	0039	ASCII_Hex_Digit
+0041	0046	ASCII_Hex_Digit
+0061	0066	ASCII_Hex_Digit
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Assigned.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Assigned.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Assigned.pl	(revision 14489)
@@ -0,0 +1,432 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Assigned}
+# 
+# Meaning: All assigned code points
+#
+return <<'END';
+0000	0241	
+0250	036F	
+0374	0375	
+037A		
+037E		
+0384	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	0486	
+0488	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559	055F	
+0561	0587	
+0589	058A	
+0591	05B9	
+05BB	05C7	
+05D0	05EA	
+05F0	05F4	
+0600	0603	
+060B	0615	
+061B		
+061E	061F	
+0621	063A	
+0640	065E	
+0660	070D	
+070F	074A	
+074D	076D	
+0780	07B1	
+0901	0939	
+093C	094D	
+0950	0954	
+0958	0970	
+097D		
+0981	0983	
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BC	09C4	
+09C7	09C8	
+09CB	09CE	
+09D7		
+09DC	09DD	
+09DF	09E3	
+09E6	09FA	
+0A01	0A03	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A3C		
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A59	0A5C	
+0A5E		
+0A66	0A74	
+0A81	0A83	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABC	0AC5	
+0AC7	0AC9	
+0ACB	0ACD	
+0AD0		
+0AE0	0AE3	
+0AE6	0AEF	
+0AF1		
+0B01	0B03	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3C	0B43	
+0B47	0B48	
+0B4B	0B4D	
+0B56	0B57	
+0B5C	0B5D	
+0B5F	0B61	
+0B66	0B71	
+0B82	0B83	
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCD	
+0BD7		
+0BE6	0BFA	
+0C01	0C03	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0C60	0C61	
+0C66	0C6F	
+0C82	0C83	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBC	0CC4	
+0CC6	0CC8	
+0CCA	0CCD	
+0CD5	0CD6	
+0CDE		
+0CE0	0CE1	
+0CE6	0CEF	
+0D02	0D03	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4D	
+0D57		
+0D60	0D61	
+0D66	0D6F	
+0D82	0D83	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DCA		
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF4	
+0E01	0E3A	
+0E3F	0E5B	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB9	
+0EBB	0EBD	
+0EC0	0EC4	
+0EC6		
+0EC8	0ECD	
+0ED0	0ED9	
+0EDC	0EDD	
+0F00	0F47	
+0F49	0F6A	
+0F71	0F8B	
+0F90	0F97	
+0F99	0FBC	
+0FBE	0FCC	
+0FCF	0FD1	
+1000	1021	
+1023	1027	
+1029	102A	
+102C	1032	
+1036	1039	
+1040	1059	
+10A0	10C5	
+10D0	10FC	
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+135F	137C	
+1380	1399	
+13A0	13F4	
+1401	1676	
+1680	169C	
+16A0	16F0	
+1700	170C	
+170E	1714	
+1720	1736	
+1740	1753	
+1760	176C	
+176E	1770	
+1772	1773	
+1780	17DD	
+17E0	17E9	
+17F0	17F9	
+1800	180E	
+1810	1819	
+1820	1877	
+1880	18A9	
+1900	191C	
+1920	192B	
+1930	193B	
+1940		
+1944	196D	
+1970	1974	
+1980	19A9	
+19B0	19C9	
+19D0	19D9	
+19DE	1A1B	
+1A1E	1A1F	
+1D00	1DC3	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FC4	
+1FC6	1FD3	
+1FD6	1FDB	
+1FDD	1FEF	
+1FF2	1FF4	
+1FF6	1FFE	
+2000	2063	
+206A	2071	
+2074	208E	
+2090	2094	
+20A0	20B5	
+20D0	20EB	
+2100	214C	
+2153	2183	
+2190	23DB	
+2400	2426	
+2440	244A	
+2460	269C	
+26A0	26B1	
+2701	2704	
+2706	2709	
+270C	2727	
+2729	274B	
+274D		
+274F	2752	
+2756		
+2758	275E	
+2761	2794	
+2798	27AF	
+27B1	27BE	
+27C0	27C6	
+27D0	27EB	
+27F0	2B13	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CEA	
+2CF9	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+2E00	2E17	
+2E1C	2E1D	
+2E80	2E99	
+2E9B	2EF3	
+2F00	2FD5	
+2FF0	2FFB	
+3000	303F	
+3041	3096	
+3099	30FF	
+3105	312C	
+3131	318E	
+3190	31B7	
+31C0	31CF	
+31F0	321E	
+3220	3243	
+3250	32FE	
+3300	4DB5	
+4DC0	9FBB	
+A000	A48C	
+A490	A4C6	
+A700	A716	
+A800	A82B	
+AC00	D7A3	
+D800	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FB1D	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3F	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFD	
+FE00	FE19	
+FE20	FE23	
+FE30	FE52	
+FE54	FE66	
+FE68	FE6B	
+FE70	FE74	
+FE76	FEFC	
+FEFF		
+FF01	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+FFE0	FFE6	
+FFE8	FFEE	
+FFF9	FFFD	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10100	10102	
+10107	10133	
+10137	1018A	
+10300	1031E	
+10320	10323	
+10330	1034A	
+10380	1039D	
+1039F	103C3	
+103C8	103D5	
+10400	1049D	
+104A0	104A9	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00	10A03	
+10A05	10A06	
+10A0C	10A13	
+10A15	10A17	
+10A19	10A33	
+10A38	10A3A	
+10A3F	10A47	
+10A50	10A58	
+1D000	1D0F5	
+1D100	1D126	
+1D12A	1D1DD	
+1D200	1D245	
+1D300	1D356	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D7C9	
+1D7CE	1D7FF	
+20000	2A6D6	
+2F800	2FA1D	
+E0001		
+E0020	E007F	
+E0100	E01EF	
+F0000	FFFFD	
+100000	10FFFD	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Beng.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Beng.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Beng.pl	(revision 14489)
@@ -0,0 +1,26 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Bengali} (and fuzzy permutations)
+# 
+# Meaning: Script 'Bengali'
+#
+return <<'END';
+0981	0983	Bengali
+0985	098C	Bengali
+098F	0990	Bengali
+0993	09A8	Bengali
+09AA	09B0	Bengali
+09B2		Bengali
+09B6	09B9	Bengali
+09BC	09C4	Bengali
+09C7	09C8	Bengali
+09CB	09CE	Bengali
+09D7		Bengali
+09DC	09DD	Bengali
+09DF	09E3	Bengali
+09E6	09FA	Bengali
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/BidiC.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/BidiC.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/BidiC.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Bidi_Control'
+#
+return <<'END';
+200E	200F	Bidi_Control
+202A	202E	Bidi_Control
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/BidiCont.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/BidiCont.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/BidiCont.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{BidiControl} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Bidi_Control'
+#
+return <<'END';
+200E	200F	Bidi_Control
+202A	202E	Bidi_Control
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Blank.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Blank.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Blank.pl	(revision 14489)
@@ -0,0 +1,21 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Blank}
+# 
+# Meaning: [[:Blank:]]
+#
+return <<'END';
+0009		
+0020		
+00A0		
+1680		
+180E		
+2000	200A	
+202F		
+205F		
+3000		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Bopo.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Bopo.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Bopo.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Bopomofo} (and fuzzy permutations)
+# 
+# Meaning: Script 'Bopomofo'
+#
+return <<'END';
+3105	312C	Bopomofo
+31A0	31B7	Bopomofo
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Brai.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Brai.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Brai.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Braille} (and fuzzy permutations)
+# 
+# Meaning: Script 'Braille'
+#
+return <<'END';
+2800	28FF	Braille
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Bugi.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Bugi.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Bugi.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Buginese} (and fuzzy permutations)
+# 
+# Meaning: Script 'Buginese'
+#
+return <<'END';
+1A00	1A1B	Buginese
+1A1E	1A1F	Buginese
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Buhd.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Buhd.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Buhd.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Buhid} (and fuzzy permutations)
+# 
+# Meaning: Script 'Buhid'
+#
+return <<'END';
+1740	1753	Buhid
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/C.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/C.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/C.pl	(revision 14489)
@@ -0,0 +1,435 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{C}
+# 	\p{C} (and fuzzy permutations)
+# 
+# Meaning: Major Category 'C'
+#
+return <<'END';
+0000	001F	
+007F	009F	
+00AD		
+0242	024F	
+0370	0373	
+0376	0379	
+037B	037D	
+037F	0383	
+038B		
+038D		
+03A2		
+03CF		
+0487		
+04CF		
+04FA	04FF	
+0510	0530	
+0557	0558	
+0560		
+0588		
+058B	0590	
+05BA		
+05C8	05CF	
+05EB	05EF	
+05F5	060A	
+0616	061A	
+061C	061D	
+0620		
+063B	063F	
+065F		
+06DD		
+070E	070F	
+074B	074C	
+076E	077F	
+07B2	0900	
+093A	093B	
+094E	094F	
+0955	0957	
+0971	097C	
+097E	0980	
+0984		
+098D	098E	
+0991	0992	
+09A9		
+09B1		
+09B3	09B5	
+09BA	09BB	
+09C5	09C6	
+09C9	09CA	
+09CF	09D6	
+09D8	09DB	
+09DE		
+09E4	09E5	
+09FB	0A00	
+0A04		
+0A0B	0A0E	
+0A11	0A12	
+0A29		
+0A31		
+0A34		
+0A37		
+0A3A	0A3B	
+0A3D		
+0A43	0A46	
+0A49	0A4A	
+0A4E	0A58	
+0A5D		
+0A5F	0A65	
+0A75	0A80	
+0A84		
+0A8E		
+0A92		
+0AA9		
+0AB1		
+0AB4		
+0ABA	0ABB	
+0AC6		
+0ACA		
+0ACE	0ACF	
+0AD1	0ADF	
+0AE4	0AE5	
+0AF0		
+0AF2	0B00	
+0B04		
+0B0D	0B0E	
+0B11	0B12	
+0B29		
+0B31		
+0B34		
+0B3A	0B3B	
+0B44	0B46	
+0B49	0B4A	
+0B4E	0B55	
+0B58	0B5B	
+0B5E		
+0B62	0B65	
+0B72	0B81	
+0B84		
+0B8B	0B8D	
+0B91		
+0B96	0B98	
+0B9B		
+0B9D		
+0BA0	0BA2	
+0BA5	0BA7	
+0BAB	0BAD	
+0BBA	0BBD	
+0BC3	0BC5	
+0BC9		
+0BCE	0BD6	
+0BD8	0BE5	
+0BFB	0C00	
+0C04		
+0C0D		
+0C11		
+0C29		
+0C34		
+0C3A	0C3D	
+0C45		
+0C49		
+0C4E	0C54	
+0C57	0C5F	
+0C62	0C65	
+0C70	0C81	
+0C84		
+0C8D		
+0C91		
+0CA9		
+0CB4		
+0CBA	0CBB	
+0CC5		
+0CC9		
+0CCE	0CD4	
+0CD7	0CDD	
+0CDF		
+0CE2	0CE5	
+0CF0	0D01	
+0D04		
+0D0D		
+0D11		
+0D29		
+0D3A	0D3D	
+0D44	0D45	
+0D49		
+0D4E	0D56	
+0D58	0D5F	
+0D62	0D65	
+0D70	0D81	
+0D84		
+0D97	0D99	
+0DB2		
+0DBC		
+0DBE	0DBF	
+0DC7	0DC9	
+0DCB	0DCE	
+0DD5		
+0DD7		
+0DE0	0DF1	
+0DF5	0E00	
+0E3B	0E3E	
+0E5C	0E80	
+0E83		
+0E85	0E86	
+0E89		
+0E8B	0E8C	
+0E8E	0E93	
+0E98		
+0EA0		
+0EA4		
+0EA6		
+0EA8	0EA9	
+0EAC		
+0EBA		
+0EBE	0EBF	
+0EC5		
+0EC7		
+0ECE	0ECF	
+0EDA	0EDB	
+0EDE	0EFF	
+0F48		
+0F6B	0F70	
+0F8C	0F8F	
+0F98		
+0FBD		
+0FCD	0FCE	
+0FD2	0FFF	
+1022		
+1028		
+102B		
+1033	1035	
+103A	103F	
+105A	109F	
+10C6	10CF	
+10FD	10FF	
+115A	115E	
+11A3	11A7	
+11FA	11FF	
+1249		
+124E	124F	
+1257		
+1259		
+125E	125F	
+1289		
+128E	128F	
+12B1		
+12B6	12B7	
+12BF		
+12C1		
+12C6	12C7	
+12D7		
+1311		
+1316	1317	
+135B	135E	
+137D	137F	
+139A	139F	
+13F5	1400	
+1677	167F	
+169D	169F	
+16F1	16FF	
+170D		
+1715	171F	
+1737	173F	
+1754	175F	
+176D		
+1771		
+1774	177F	
+17B4	17B5	
+17DE	17DF	
+17EA	17EF	
+17FA	17FF	
+180F		
+181A	181F	
+1878	187F	
+18AA	18FF	
+191D	191F	
+192C	192F	
+193C	193F	
+1941	1943	
+196E	196F	
+1975	197F	
+19AA	19AF	
+19CA	19CF	
+19DA	19DD	
+1A1C	1A1D	
+1A20	1CFF	
+1DC4	1DFF	
+1E9C	1E9F	
+1EFA	1EFF	
+1F16	1F17	
+1F1E	1F1F	
+1F46	1F47	
+1F4E	1F4F	
+1F58		
+1F5A		
+1F5C		
+1F5E		
+1F7E	1F7F	
+1FB5		
+1FC5		
+1FD4	1FD5	
+1FDC		
+1FF0	1FF1	
+1FF5		
+1FFF		
+200B	200F	
+202A	202E	
+2060	206F	
+2072	2073	
+208F		
+2095	209F	
+20B6	20CF	
+20EC	20FF	
+214D	2152	
+2184	218F	
+23DC	23FF	
+2427	243F	
+244B	245F	
+269D	269F	
+26B2	2700	
+2705		
+270A	270B	
+2728		
+274C		
+274E		
+2753	2755	
+2757		
+275F	2760	
+2795	2797	
+27B0		
+27BF		
+27C7	27CF	
+27EC	27EF	
+2B14	2BFF	
+2C2F		
+2C5F	2C7F	
+2CEB	2CF8	
+2D26	2D2F	
+2D66	2D6E	
+2D70	2D7F	
+2D97	2D9F	
+2DA7		
+2DAF		
+2DB7		
+2DBF		
+2DC7		
+2DCF		
+2DD7		
+2DDF	2DFF	
+2E18	2E1B	
+2E1E	2E7F	
+2E9A		
+2EF4	2EFF	
+2FD6	2FEF	
+2FFC	2FFF	
+3040		
+3097	3098	
+3100	3104	
+312D	3130	
+318F		
+31B8	31BF	
+31D0	31EF	
+321F		
+3244	324F	
+32FF		
+4DB6	4DBF	
+9FBC	9FFF	
+A48D	A48F	
+A4C7	A6FF	
+A717	A7FF	
+A82C	ABFF	
+D7A4	F8FF	
+FA2E	FA2F	
+FA6B	FA6F	
+FADA	FAFF	
+FB07	FB12	
+FB18	FB1C	
+FB37		
+FB3D		
+FB3F		
+FB42		
+FB45		
+FBB2	FBD2	
+FD40	FD4F	
+FD90	FD91	
+FDC8	FDEF	
+FDFE	FDFF	
+FE1A	FE1F	
+FE24	FE2F	
+FE53		
+FE67		
+FE6C	FE6F	
+FE75		
+FEFD	FF00	
+FFBF	FFC1	
+FFC8	FFC9	
+FFD0	FFD1	
+FFD8	FFD9	
+FFDD	FFDF	
+FFE7		
+FFEF	FFFB	
+FFFE	FFFF	
+1000C		
+10027		
+1003B		
+1003E		
+1004E	1004F	
+1005E	1007F	
+100FB	100FF	
+10103	10106	
+10134	10136	
+1018B	102FF	
+1031F		
+10324	1032F	
+1034B	1037F	
+1039E		
+103C4	103C7	
+103D6	103FF	
+1049E	1049F	
+104AA	107FF	
+10806	10807	
+10809		
+10836		
+10839	1083B	
+1083D	1083E	
+10840	109FF	
+10A04		
+10A07	10A0B	
+10A14		
+10A18		
+10A34	10A37	
+10A3B	10A3E	
+10A48	10A4F	
+10A59	1CFFF	
+1D0F6	1D0FF	
+1D127	1D129	
+1D173	1D17A	
+1D1DE	1D1FF	
+1D246	1D2FF	
+1D357	1D3FF	
+1D455		
+1D49D		
+1D4A0	1D4A1	
+1D4A3	1D4A4	
+1D4A7	1D4A8	
+1D4AD		
+1D4BA		
+1D4BC		
+1D4C4		
+1D506		
+1D50B	1D50C	
+1D515		
+1D51D		
+1D53A		
+1D53F		
+1D545		
+1D547	1D549	
+1D551		
+1D6A6	1D6A7	
+1D7CA	1D7CD	
+1D800	1FFFF	
+2A6D7	2F7FF	
+2FA1E	E00FF	
+E01F0	10FFFF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Canadian.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Canadian.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Canadian.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{CanadianAboriginal} (and fuzzy permutations)
+# 
+# Meaning: Script 'Canadian_Aboriginal'
+#
+return <<'END';
+1401	1676	Canadian_Aboriginal
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cc.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cc.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cc.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Cc}
+# 	\p{Cc} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Cc'
+#
+return <<'END';
+0000	001F	
+007F	009F	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cf.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cf.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cf.pl	(revision 14489)
@@ -0,0 +1,27 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Cf}
+# 	\p{Cf} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Cf'
+#
+return <<'END';
+00AD		
+0600	0603	
+06DD		
+070F		
+17B4	17B5	
+200B	200F	
+202A	202E	
+2060	2063	
+206A	206F	
+FEFF		
+FFF9	FFFB	
+1D173	1D17A	
+E0001		
+E0020	E007F	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cher.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cher.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cher.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Cherokee} (and fuzzy permutations)
+# 
+# Meaning: Script 'Cherokee'
+#
+return <<'END';
+13A0	13F4	Cherokee
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cn.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cn.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cn.pl	(revision 14489)
@@ -0,0 +1,433 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Cn}
+# 	\p{Cn} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Cn' [not functional in Perl]
+#
+return <<'END';
+0242	024F	
+0370	0373	
+0376	0379	
+037B	037D	
+037F	0383	
+038B		
+038D		
+03A2		
+03CF		
+0487		
+04CF		
+04FA	04FF	
+0510	0530	
+0557	0558	
+0560		
+0588		
+058B	0590	
+05BA		
+05C8	05CF	
+05EB	05EF	
+05F5	05FF	
+0604	060A	
+0616	061A	
+061C	061D	
+0620		
+063B	063F	
+065F		
+070E		
+074B	074C	
+076E	077F	
+07B2	0900	
+093A	093B	
+094E	094F	
+0955	0957	
+0971	097C	
+097E	0980	
+0984		
+098D	098E	
+0991	0992	
+09A9		
+09B1		
+09B3	09B5	
+09BA	09BB	
+09C5	09C6	
+09C9	09CA	
+09CF	09D6	
+09D8	09DB	
+09DE		
+09E4	09E5	
+09FB	0A00	
+0A04		
+0A0B	0A0E	
+0A11	0A12	
+0A29		
+0A31		
+0A34		
+0A37		
+0A3A	0A3B	
+0A3D		
+0A43	0A46	
+0A49	0A4A	
+0A4E	0A58	
+0A5D		
+0A5F	0A65	
+0A75	0A80	
+0A84		
+0A8E		
+0A92		
+0AA9		
+0AB1		
+0AB4		
+0ABA	0ABB	
+0AC6		
+0ACA		
+0ACE	0ACF	
+0AD1	0ADF	
+0AE4	0AE5	
+0AF0		
+0AF2	0B00	
+0B04		
+0B0D	0B0E	
+0B11	0B12	
+0B29		
+0B31		
+0B34		
+0B3A	0B3B	
+0B44	0B46	
+0B49	0B4A	
+0B4E	0B55	
+0B58	0B5B	
+0B5E		
+0B62	0B65	
+0B72	0B81	
+0B84		
+0B8B	0B8D	
+0B91		
+0B96	0B98	
+0B9B		
+0B9D		
+0BA0	0BA2	
+0BA5	0BA7	
+0BAB	0BAD	
+0BBA	0BBD	
+0BC3	0BC5	
+0BC9		
+0BCE	0BD6	
+0BD8	0BE5	
+0BFB	0C00	
+0C04		
+0C0D		
+0C11		
+0C29		
+0C34		
+0C3A	0C3D	
+0C45		
+0C49		
+0C4E	0C54	
+0C57	0C5F	
+0C62	0C65	
+0C70	0C81	
+0C84		
+0C8D		
+0C91		
+0CA9		
+0CB4		
+0CBA	0CBB	
+0CC5		
+0CC9		
+0CCE	0CD4	
+0CD7	0CDD	
+0CDF		
+0CE2	0CE5	
+0CF0	0D01	
+0D04		
+0D0D		
+0D11		
+0D29		
+0D3A	0D3D	
+0D44	0D45	
+0D49		
+0D4E	0D56	
+0D58	0D5F	
+0D62	0D65	
+0D70	0D81	
+0D84		
+0D97	0D99	
+0DB2		
+0DBC		
+0DBE	0DBF	
+0DC7	0DC9	
+0DCB	0DCE	
+0DD5		
+0DD7		
+0DE0	0DF1	
+0DF5	0E00	
+0E3B	0E3E	
+0E5C	0E80	
+0E83		
+0E85	0E86	
+0E89		
+0E8B	0E8C	
+0E8E	0E93	
+0E98		
+0EA0		
+0EA4		
+0EA6		
+0EA8	0EA9	
+0EAC		
+0EBA		
+0EBE	0EBF	
+0EC5		
+0EC7		
+0ECE	0ECF	
+0EDA	0EDB	
+0EDE	0EFF	
+0F48		
+0F6B	0F70	
+0F8C	0F8F	
+0F98		
+0FBD		
+0FCD	0FCE	
+0FD2	0FFF	
+1022		
+1028		
+102B		
+1033	1035	
+103A	103F	
+105A	109F	
+10C6	10CF	
+10FD	10FF	
+115A	115E	
+11A3	11A7	
+11FA	11FF	
+1249		
+124E	124F	
+1257		
+1259		
+125E	125F	
+1289		
+128E	128F	
+12B1		
+12B6	12B7	
+12BF		
+12C1		
+12C6	12C7	
+12D7		
+1311		
+1316	1317	
+135B	135E	
+137D	137F	
+139A	139F	
+13F5	1400	
+1677	167F	
+169D	169F	
+16F1	16FF	
+170D		
+1715	171F	
+1737	173F	
+1754	175F	
+176D		
+1771		
+1774	177F	
+17DE	17DF	
+17EA	17EF	
+17FA	17FF	
+180F		
+181A	181F	
+1878	187F	
+18AA	18FF	
+191D	191F	
+192C	192F	
+193C	193F	
+1941	1943	
+196E	196F	
+1975	197F	
+19AA	19AF	
+19CA	19CF	
+19DA	19DD	
+1A1C	1A1D	
+1A20	1CFF	
+1DC4	1DFF	
+1E9C	1E9F	
+1EFA	1EFF	
+1F16	1F17	
+1F1E	1F1F	
+1F46	1F47	
+1F4E	1F4F	
+1F58		
+1F5A		
+1F5C		
+1F5E		
+1F7E	1F7F	
+1FB5		
+1FC5		
+1FD4	1FD5	
+1FDC		
+1FF0	1FF1	
+1FF5		
+1FFF		
+2064	2069	
+2072	2073	
+208F		
+2095	209F	
+20B6	20CF	
+20EC	20FF	
+214D	2152	
+2184	218F	
+23DC	23FF	
+2427	243F	
+244B	245F	
+269D	269F	
+26B2	2700	
+2705		
+270A	270B	
+2728		
+274C		
+274E		
+2753	2755	
+2757		
+275F	2760	
+2795	2797	
+27B0		
+27BF		
+27C7	27CF	
+27EC	27EF	
+2B14	2BFF	
+2C2F		
+2C5F	2C7F	
+2CEB	2CF8	
+2D26	2D2F	
+2D66	2D6E	
+2D70	2D7F	
+2D97	2D9F	
+2DA7		
+2DAF		
+2DB7		
+2DBF		
+2DC7		
+2DCF		
+2DD7		
+2DDF	2DFF	
+2E18	2E1B	
+2E1E	2E7F	
+2E9A		
+2EF4	2EFF	
+2FD6	2FEF	
+2FFC	2FFF	
+3040		
+3097	3098	
+3100	3104	
+312D	3130	
+318F		
+31B8	31BF	
+31D0	31EF	
+321F		
+3244	324F	
+32FF		
+4DB6	4DBF	
+9FBC	9FFF	
+A48D	A48F	
+A4C7	A6FF	
+A717	A7FF	
+A82C	ABFF	
+D7A4	D7FF	
+FA2E	FA2F	
+FA6B	FA6F	
+FADA	FAFF	
+FB07	FB12	
+FB18	FB1C	
+FB37		
+FB3D		
+FB3F		
+FB42		
+FB45		
+FBB2	FBD2	
+FD40	FD4F	
+FD90	FD91	
+FDC8	FDEF	
+FDFE	FDFF	
+FE1A	FE1F	
+FE24	FE2F	
+FE53		
+FE67		
+FE6C	FE6F	
+FE75		
+FEFD	FEFE	
+FF00		
+FFBF	FFC1	
+FFC8	FFC9	
+FFD0	FFD1	
+FFD8	FFD9	
+FFDD	FFDF	
+FFE7		
+FFEF	FFF8	
+FFFE	FFFF	
+1000C		
+10027		
+1003B		
+1003E		
+1004E	1004F	
+1005E	1007F	
+100FB	100FF	
+10103	10106	
+10134	10136	
+1018B	102FF	
+1031F		
+10324	1032F	
+1034B	1037F	
+1039E		
+103C4	103C7	
+103D6	103FF	
+1049E	1049F	
+104AA	107FF	
+10806	10807	
+10809		
+10836		
+10839	1083B	
+1083D	1083E	
+10840	109FF	
+10A04		
+10A07	10A0B	
+10A14		
+10A18		
+10A34	10A37	
+10A3B	10A3E	
+10A48	10A4F	
+10A59	1CFFF	
+1D0F6	1D0FF	
+1D127	1D129	
+1D1DE	1D1FF	
+1D246	1D2FF	
+1D357	1D3FF	
+1D455		
+1D49D		
+1D4A0	1D4A1	
+1D4A3	1D4A4	
+1D4A7	1D4A8	
+1D4AD		
+1D4BA		
+1D4BC		
+1D4C4		
+1D506		
+1D50B	1D50C	
+1D515		
+1D51D		
+1D53A		
+1D53F		
+1D545		
+1D547	1D549	
+1D551		
+1D6A6	1D6A7	
+1D7CA	1D7CD	
+1D800	1FFFF	
+2A6D7	2F7FF	
+2FA1E	E0000	
+E0002	E001F	
+E0080	E00FF	
+E01F0	EFFFF	
+FFFFE	FFFFF	
+10FFFE	10FFFF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cntrl.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cntrl.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cntrl.pl	(revision 14489)
@@ -0,0 +1,31 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Cntrl}
+# 
+# Meaning: [[:Cntrl:]]
+#
+return <<'END';
+0000	001F	
+007F	009F	
+00AD		
+0600	0603	
+06DD		
+070F		
+17B4	17B5	
+200B	200F	
+202A	202E	
+2060	2063	
+206A	206F	
+D800	F8FF	
+FEFF		
+FFF9	FFFB	
+1D173	1D17A	
+E0001		
+E0020	E007F	
+F0000	FFFFD	
+100000	10FFFD	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Co.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Co.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Co.pl	(revision 14489)
@@ -0,0 +1,16 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Co}
+# 	\p{Co} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Co'
+#
+return <<'END';
+E000	F8FF	
+F0000	FFFFD	
+100000	10FFFD	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Copt.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Copt.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Copt.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Coptic} (and fuzzy permutations)
+# 
+# Meaning: Script 'Coptic'
+#
+return <<'END';
+03E2	03EF	Coptic
+2C80	2CEA	Coptic
+2CF9	2CFF	Coptic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cprt.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cprt.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cprt.pl	(revision 14489)
@@ -0,0 +1,18 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Cypriot} (and fuzzy permutations)
+# 
+# Meaning: Script 'Cypriot'
+#
+return <<'END';
+10800	10805	Cypriot
+10808		Cypriot
+1080A	10835	Cypriot
+10837	10838	Cypriot
+1083C		Cypriot
+1083F		Cypriot
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cs.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cs.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cs.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Cs}
+# 	\p{Cs} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Cs'
+#
+return <<'END';
+D800	DFFF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cyrl.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cyrl.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Cyrl.pl	(revision 14489)
@@ -0,0 +1,18 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Cyrillic} (and fuzzy permutations)
+# 
+# Meaning: Script 'Cyrillic'
+#
+return <<'END';
+0400	0486	Cyrillic
+0488	04CE	Cyrillic
+04D0	04F9	Cyrillic
+0500	050F	Cyrillic
+1D2B		Cyrillic
+1D78		Cyrillic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dash.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dash.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dash.pl	(revision 14489)
@@ -0,0 +1,25 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Dash'
+#
+return <<'END';
+002D		Dash
+058A		Dash
+1806		Dash
+2010	2015	Dash
+2053		Dash
+207B		Dash
+208B		Dash
+2212		Dash
+2E17		Dash
+301C		Dash
+3030		Dash
+30A0		Dash
+FE31	FE32	Dash
+FE58		Dash
+FE63		Dash
+FF0D		Dash
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dash2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dash2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dash2.pl	(revision 14489)
@@ -0,0 +1,28 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Dash} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Dash'
+#
+return <<'END';
+002D		Dash
+058A		Dash
+1806		Dash
+2010	2015	Dash
+2053		Dash
+207B		Dash
+208B		Dash
+2212		Dash
+2E17		Dash
+301C		Dash
+3030		Dash
+30A0		Dash
+FE31	FE32	Dash
+FE58		Dash
+FE63		Dash
+FF0D		Dash
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dep.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dep.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dep.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Deprecated'
+#
+return <<'END';
+0340	0341	Deprecated
+17A3		Deprecated
+17D3		Deprecated
+206A	206F	Deprecated
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Deprecat.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Deprecat.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Deprecat.pl	(revision 14489)
@@ -0,0 +1,16 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Deprecated} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Deprecated'
+#
+return <<'END';
+0340	0341	Deprecated
+17A3		Deprecated
+17D3		Deprecated
+206A	206F	Deprecated
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Deva.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Deva.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Deva.pl	(revision 14489)
@@ -0,0 +1,18 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Devanagari} (and fuzzy permutations)
+# 
+# Meaning: Script 'Devanagari'
+#
+return <<'END';
+0901	0939	Devanagari
+093C	094D	Devanagari
+0950	0954	Devanagari
+0958	0963	Devanagari
+0966	096F	Devanagari
+097D		Devanagari
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dia.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dia.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dia.pl	(revision 14489)
@@ -0,0 +1,91 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Diacritic'
+#
+return <<'END';
+005E		Diacritic
+0060		Diacritic
+00A8		Diacritic
+00AF		Diacritic
+00B4		Diacritic
+00B7	00B8	Diacritic
+02B0	034E	Diacritic
+0350	0357	Diacritic
+035D	0362	Diacritic
+0374	0375	Diacritic
+037A		Diacritic
+0384	0385	Diacritic
+0483	0486	Diacritic
+0559		Diacritic
+0591	05A1	Diacritic
+05A3	05B9	Diacritic
+05BB	05BD	Diacritic
+05BF		Diacritic
+05C1	05C2	Diacritic
+05C4		Diacritic
+064B	0652	Diacritic
+0657	0658	Diacritic
+06DF	06E0	Diacritic
+06E5	06E6	Diacritic
+06EA	06EC	Diacritic
+0730	074A	Diacritic
+07A6	07B0	Diacritic
+093C		Diacritic
+094D		Diacritic
+0951	0954	Diacritic
+09BC		Diacritic
+09CD		Diacritic
+0A3C		Diacritic
+0A4D		Diacritic
+0ABC		Diacritic
+0ACD		Diacritic
+0B3C		Diacritic
+0B4D		Diacritic
+0BCD		Diacritic
+0C4D		Diacritic
+0CBC		Diacritic
+0CCD		Diacritic
+0D4D		Diacritic
+0DCA		Diacritic
+0E47	0E4C	Diacritic
+0E4E		Diacritic
+0EC8	0ECC	Diacritic
+0F18	0F19	Diacritic
+0F35		Diacritic
+0F37		Diacritic
+0F39		Diacritic
+0F3E	0F3F	Diacritic
+0F82	0F84	Diacritic
+0F86	0F87	Diacritic
+0FC6		Diacritic
+1037		Diacritic
+1039		Diacritic
+17C9	17D3	Diacritic
+17DD		Diacritic
+1939	193B	Diacritic
+1D2C	1D6A	Diacritic
+1FBD		Diacritic
+1FBF	1FC1	Diacritic
+1FCD	1FCF	Diacritic
+1FDD	1FDF	Diacritic
+1FED	1FEF	Diacritic
+1FFD	1FFE	Diacritic
+302A	302F	Diacritic
+3099	309C	Diacritic
+30FC		Diacritic
+FB1E		Diacritic
+FE20	FE23	Diacritic
+FF3E		Diacritic
+FF40		Diacritic
+FF70		Diacritic
+FF9E	FF9F	Diacritic
+FFE3		Diacritic
+1D167	1D169	Diacritic
+1D16D	1D172	Diacritic
+1D17B	1D182	Diacritic
+1D185	1D18B	Diacritic
+1D1AA	1D1AD	Diacritic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Diacriti.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Diacriti.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Diacriti.pl	(revision 14489)
@@ -0,0 +1,94 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Diacritic} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Diacritic'
+#
+return <<'END';
+005E		Diacritic
+0060		Diacritic
+00A8		Diacritic
+00AF		Diacritic
+00B4		Diacritic
+00B7	00B8	Diacritic
+02B0	034E	Diacritic
+0350	0357	Diacritic
+035D	0362	Diacritic
+0374	0375	Diacritic
+037A		Diacritic
+0384	0385	Diacritic
+0483	0486	Diacritic
+0559		Diacritic
+0591	05A1	Diacritic
+05A3	05B9	Diacritic
+05BB	05BD	Diacritic
+05BF		Diacritic
+05C1	05C2	Diacritic
+05C4		Diacritic
+064B	0652	Diacritic
+0657	0658	Diacritic
+06DF	06E0	Diacritic
+06E5	06E6	Diacritic
+06EA	06EC	Diacritic
+0730	074A	Diacritic
+07A6	07B0	Diacritic
+093C		Diacritic
+094D		Diacritic
+0951	0954	Diacritic
+09BC		Diacritic
+09CD		Diacritic
+0A3C		Diacritic
+0A4D		Diacritic
+0ABC		Diacritic
+0ACD		Diacritic
+0B3C		Diacritic
+0B4D		Diacritic
+0BCD		Diacritic
+0C4D		Diacritic
+0CBC		Diacritic
+0CCD		Diacritic
+0D4D		Diacritic
+0DCA		Diacritic
+0E47	0E4C	Diacritic
+0E4E		Diacritic
+0EC8	0ECC	Diacritic
+0F18	0F19	Diacritic
+0F35		Diacritic
+0F37		Diacritic
+0F39		Diacritic
+0F3E	0F3F	Diacritic
+0F82	0F84	Diacritic
+0F86	0F87	Diacritic
+0FC6		Diacritic
+1037		Diacritic
+1039		Diacritic
+17C9	17D3	Diacritic
+17DD		Diacritic
+1939	193B	Diacritic
+1D2C	1D6A	Diacritic
+1FBD		Diacritic
+1FBF	1FC1	Diacritic
+1FCD	1FCF	Diacritic
+1FDD	1FDF	Diacritic
+1FED	1FEF	Diacritic
+1FFD	1FFE	Diacritic
+302A	302F	Diacritic
+3099	309C	Diacritic
+30FC		Diacritic
+FB1E		Diacritic
+FE20	FE23	Diacritic
+FF3E		Diacritic
+FF40		Diacritic
+FF70		Diacritic
+FF9E	FF9F	Diacritic
+FFE3		Diacritic
+1D167	1D169	Diacritic
+1D16D	1D172	Diacritic
+1D17B	1D182	Diacritic
+1D185	1D18B	Diacritic
+1D1AA	1D1AD	Diacritic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Digit.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Digit.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Digit.pl	(revision 14489)
@@ -0,0 +1,35 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Digit}
+# 
+# Meaning: [[:Digit:]]
+#
+return <<'END';
+0030	0039	
+0660	0669	
+06F0	06F9	
+0966	096F	
+09E6	09EF	
+0A66	0A6F	
+0AE6	0AEF	
+0B66	0B6F	
+0BE6	0BEF	
+0C66	0C6F	
+0CE6	0CEF	
+0D66	0D6F	
+0E50	0E59	
+0ED0	0ED9	
+0F20	0F29	
+1040	1049	
+17E0	17E9	
+1810	1819	
+1946	194F	
+19D0	19D9	
+FF10	FF19	
+104A0	104A9	
+1D7CE	1D7FF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dsrt.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dsrt.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Dsrt.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Deseret} (and fuzzy permutations)
+# 
+# Meaning: Script 'Deseret'
+#
+return <<'END';
+10400	1044F	Deseret
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ethi.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ethi.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ethi.pl	(revision 14489)
@@ -0,0 +1,39 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Ethiopic} (and fuzzy permutations)
+# 
+# Meaning: Script 'Ethiopic'
+#
+return <<'END';
+1200	1248	Ethiopic
+124A	124D	Ethiopic
+1250	1256	Ethiopic
+1258		Ethiopic
+125A	125D	Ethiopic
+1260	1288	Ethiopic
+128A	128D	Ethiopic
+1290	12B0	Ethiopic
+12B2	12B5	Ethiopic
+12B8	12BE	Ethiopic
+12C0		Ethiopic
+12C2	12C5	Ethiopic
+12C8	12D6	Ethiopic
+12D8	1310	Ethiopic
+1312	1315	Ethiopic
+1318	135A	Ethiopic
+135F	137C	Ethiopic
+1380	1399	Ethiopic
+2D80	2D96	Ethiopic
+2DA0	2DA6	Ethiopic
+2DA8	2DAE	Ethiopic
+2DB0	2DB6	Ethiopic
+2DB8	2DBE	Ethiopic
+2DC0	2DC6	Ethiopic
+2DC8	2DCE	Ethiopic
+2DD0	2DD6	Ethiopic
+2DD8	2DDE	Ethiopic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ext.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ext.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ext.pl	(revision 14489)
@@ -0,0 +1,21 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Extender'
+#
+return <<'END';
+00B7		Extender
+02D0	02D1	Extender
+0640		Extender
+0E46		Extender
+0EC6		Extender
+1843		Extender
+3005		Extender
+3031	3035	Extender
+309D	309E	Extender
+30FC	30FE	Extender
+A015		Extender
+FF70		Extender
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Extender.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Extender.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Extender.pl	(revision 14489)
@@ -0,0 +1,24 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Extender} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Extender'
+#
+return <<'END';
+00B7		Extender
+02D0	02D1	Extender
+0640		Extender
+0E46		Extender
+0EC6		Extender
+1843		Extender
+3005		Extender
+3031	3035	Extender
+309D	309E	Extender
+30FC	30FE	Extender
+A015		Extender
+FF70		Extender
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Geor.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Geor.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Geor.pl	(revision 14489)
@@ -0,0 +1,16 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Georgian} (and fuzzy permutations)
+# 
+# Meaning: Script 'Georgian'
+#
+return <<'END';
+10A0	10C5	Georgian
+10D0	10FA	Georgian
+10FC		Georgian
+2D00	2D25	Georgian
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Glag.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Glag.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Glag.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Glagolitic} (and fuzzy permutations)
+# 
+# Meaning: Script 'Glagolitic'
+#
+return <<'END';
+2C00	2C2E	Glagolitic
+2C30	2C5E	Glagolitic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Goth.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Goth.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Goth.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Gothic} (and fuzzy permutations)
+# 
+# Meaning: Script 'Gothic'
+#
+return <<'END';
+10330	1034A	Gothic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/GrLink.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/GrLink.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/GrLink.pl	(revision 14489)
@@ -0,0 +1,25 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Grapheme_Link'
+#
+return <<'END';
+034F		Grapheme_Link
+094D		Grapheme_Link
+09CD		Grapheme_Link
+0A4D		Grapheme_Link
+0ACD		Grapheme_Link
+0B4D		Grapheme_Link
+0BCD		Grapheme_Link
+0C4D		Grapheme_Link
+0CCD		Grapheme_Link
+0D4D		Grapheme_Link
+0DCA		Grapheme_Link
+0E3A		Grapheme_Link
+1039		Grapheme_Link
+17D2		Grapheme_Link
+A806		Grapheme_Link
+10A3F		Grapheme_Link
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Graph.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Graph.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Graph.pl	(revision 14489)
@@ -0,0 +1,436 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Graph}
+# 
+# Meaning: [[:Graph:]]
+#
+return <<'END';
+0021	007E	
+00A1	0241	
+0250	036F	
+0374	0375	
+037A		
+037E		
+0384	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	0486	
+0488	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559	055F	
+0561	0587	
+0589	058A	
+0591	05B9	
+05BB	05C7	
+05D0	05EA	
+05F0	05F4	
+0600	0603	
+060B	0615	
+061B		
+061E	061F	
+0621	063A	
+0640	065E	
+0660	070D	
+070F	074A	
+074D	076D	
+0780	07B1	
+0901	0939	
+093C	094D	
+0950	0954	
+0958	0970	
+097D		
+0981	0983	
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BC	09C4	
+09C7	09C8	
+09CB	09CE	
+09D7		
+09DC	09DD	
+09DF	09E3	
+09E6	09FA	
+0A01	0A03	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A3C		
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A59	0A5C	
+0A5E		
+0A66	0A74	
+0A81	0A83	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABC	0AC5	
+0AC7	0AC9	
+0ACB	0ACD	
+0AD0		
+0AE0	0AE3	
+0AE6	0AEF	
+0AF1		
+0B01	0B03	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3C	0B43	
+0B47	0B48	
+0B4B	0B4D	
+0B56	0B57	
+0B5C	0B5D	
+0B5F	0B61	
+0B66	0B71	
+0B82	0B83	
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCD	
+0BD7		
+0BE6	0BFA	
+0C01	0C03	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0C60	0C61	
+0C66	0C6F	
+0C82	0C83	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBC	0CC4	
+0CC6	0CC8	
+0CCA	0CCD	
+0CD5	0CD6	
+0CDE		
+0CE0	0CE1	
+0CE6	0CEF	
+0D02	0D03	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4D	
+0D57		
+0D60	0D61	
+0D66	0D6F	
+0D82	0D83	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DCA		
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF4	
+0E01	0E3A	
+0E3F	0E5B	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB9	
+0EBB	0EBD	
+0EC0	0EC4	
+0EC6		
+0EC8	0ECD	
+0ED0	0ED9	
+0EDC	0EDD	
+0F00	0F47	
+0F49	0F6A	
+0F71	0F8B	
+0F90	0F97	
+0F99	0FBC	
+0FBE	0FCC	
+0FCF	0FD1	
+1000	1021	
+1023	1027	
+1029	102A	
+102C	1032	
+1036	1039	
+1040	1059	
+10A0	10C5	
+10D0	10FC	
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+135F	137C	
+1380	1399	
+13A0	13F4	
+1401	1676	
+1681	169C	
+16A0	16F0	
+1700	170C	
+170E	1714	
+1720	1736	
+1740	1753	
+1760	176C	
+176E	1770	
+1772	1773	
+1780	17DD	
+17E0	17E9	
+17F0	17F9	
+1800	180D	
+1810	1819	
+1820	1877	
+1880	18A9	
+1900	191C	
+1920	192B	
+1930	193B	
+1940		
+1944	196D	
+1970	1974	
+1980	19A9	
+19B0	19C9	
+19D0	19D9	
+19DE	1A1B	
+1A1E	1A1F	
+1D00	1DC3	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FC4	
+1FC6	1FD3	
+1FD6	1FDB	
+1FDD	1FEF	
+1FF2	1FF4	
+1FF6	1FFE	
+200B	2027	
+202A	202E	
+2030	205E	
+2060	2063	
+206A	2071	
+2074	208E	
+2090	2094	
+20A0	20B5	
+20D0	20EB	
+2100	214C	
+2153	2183	
+2190	23DB	
+2400	2426	
+2440	244A	
+2460	269C	
+26A0	26B1	
+2701	2704	
+2706	2709	
+270C	2727	
+2729	274B	
+274D		
+274F	2752	
+2756		
+2758	275E	
+2761	2794	
+2798	27AF	
+27B1	27BE	
+27C0	27C6	
+27D0	27EB	
+27F0	2B13	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CEA	
+2CF9	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+2E00	2E17	
+2E1C	2E1D	
+2E80	2E99	
+2E9B	2EF3	
+2F00	2FD5	
+2FF0	2FFB	
+3001	303F	
+3041	3096	
+3099	30FF	
+3105	312C	
+3131	318E	
+3190	31B7	
+31C0	31CF	
+31F0	321E	
+3220	3243	
+3250	32FE	
+3300	4DB5	
+4DC0	9FBB	
+A000	A48C	
+A490	A4C6	
+A700	A716	
+A800	A82B	
+AC00	D7A3	
+E000	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FB1D	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3F	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFD	
+FE00	FE19	
+FE20	FE23	
+FE30	FE52	
+FE54	FE66	
+FE68	FE6B	
+FE70	FE74	
+FE76	FEFC	
+FEFF		
+FF01	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+FFE0	FFE6	
+FFE8	FFEE	
+FFF9	FFFD	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10100	10102	
+10107	10133	
+10137	1018A	
+10300	1031E	
+10320	10323	
+10330	1034A	
+10380	1039D	
+1039F	103C3	
+103C8	103D5	
+10400	1049D	
+104A0	104A9	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00	10A03	
+10A05	10A06	
+10A0C	10A13	
+10A15	10A17	
+10A19	10A33	
+10A38	10A3A	
+10A3F	10A47	
+10A50	10A58	
+1D000	1D0F5	
+1D100	1D126	
+1D12A	1D1DD	
+1D200	1D245	
+1D300	1D356	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D7C9	
+1D7CE	1D7FF	
+20000	2A6D6	
+2F800	2FA1D	
+E0001		
+E0020	E007F	
+E0100	E01EF	
+F0000	FFFFD	
+100000	10FFFD	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Grapheme.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Grapheme.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Grapheme.pl	(revision 14489)
@@ -0,0 +1,28 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{GraphemeLink} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Grapheme_Link'
+#
+return <<'END';
+034F		Grapheme_Link
+094D		Grapheme_Link
+09CD		Grapheme_Link
+0A4D		Grapheme_Link
+0ACD		Grapheme_Link
+0B4D		Grapheme_Link
+0BCD		Grapheme_Link
+0C4D		Grapheme_Link
+0CCD		Grapheme_Link
+0D4D		Grapheme_Link
+0DCA		Grapheme_Link
+0E3A		Grapheme_Link
+1039		Grapheme_Link
+17D2		Grapheme_Link
+A806		Grapheme_Link
+10A3F		Grapheme_Link
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Grek.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Grek.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Grek.pl	(revision 14489)
@@ -0,0 +1,43 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Greek} (and fuzzy permutations)
+# 
+# Meaning: Script 'Greek'
+#
+return <<'END';
+0374	0375	Greek
+037A		Greek
+0384	0386	Greek
+0388	038A	Greek
+038C		Greek
+038E	03A1	Greek
+03A3	03CE	Greek
+03D0	03E1	Greek
+03F0	03FF	Greek
+1D26	1D2A	Greek
+1D5D	1D61	Greek
+1D66	1D6A	Greek
+1F00	1F15	Greek
+1F18	1F1D	Greek
+1F20	1F45	Greek
+1F48	1F4D	Greek
+1F50	1F57	Greek
+1F59		Greek
+1F5B		Greek
+1F5D		Greek
+1F5F	1F7D	Greek
+1F80	1FB4	Greek
+1FB6	1FC4	Greek
+1FC6	1FD3	Greek
+1FD6	1FDB	Greek
+1FDD	1FEF	Greek
+1FF2	1FF4	Greek
+1FF6	1FFE	Greek
+2126		Greek
+10140	1018A	Greek
+1D200	1D245	Greek
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Gujr.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Gujr.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Gujr.pl	(revision 14489)
@@ -0,0 +1,26 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Gujarati} (and fuzzy permutations)
+# 
+# Meaning: Script 'Gujarati'
+#
+return <<'END';
+0A81	0A83	Gujarati
+0A85	0A8D	Gujarati
+0A8F	0A91	Gujarati
+0A93	0AA8	Gujarati
+0AAA	0AB0	Gujarati
+0AB2	0AB3	Gujarati
+0AB5	0AB9	Gujarati
+0ABC	0AC5	Gujarati
+0AC7	0AC9	Gujarati
+0ACB	0ACD	Gujarati
+0AD0		Gujarati
+0AE0	0AE3	Gujarati
+0AE6	0AEF	Gujarati
+0AF1		Gujarati
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Guru.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Guru.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Guru.pl	(revision 14489)
@@ -0,0 +1,27 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Gurmukhi} (and fuzzy permutations)
+# 
+# Meaning: Script 'Gurmukhi'
+#
+return <<'END';
+0A01	0A03	Gurmukhi
+0A05	0A0A	Gurmukhi
+0A0F	0A10	Gurmukhi
+0A13	0A28	Gurmukhi
+0A2A	0A30	Gurmukhi
+0A32	0A33	Gurmukhi
+0A35	0A36	Gurmukhi
+0A38	0A39	Gurmukhi
+0A3C		Gurmukhi
+0A3E	0A42	Gurmukhi
+0A47	0A48	Gurmukhi
+0A4B	0A4D	Gurmukhi
+0A59	0A5C	Gurmukhi
+0A5E		Gurmukhi
+0A66	0A74	Gurmukhi
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hang.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hang.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hang.pl	(revision 14489)
@@ -0,0 +1,24 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Hangul} (and fuzzy permutations)
+# 
+# Meaning: Script 'Hangul'
+#
+return <<'END';
+1100	1159	Hangul
+115F	11A2	Hangul
+11A8	11F9	Hangul
+3131	318E	Hangul
+3200	321E	Hangul
+3260	327D	Hangul
+AC00	D7A3	Hangul
+FFA0	FFBE	Hangul
+FFC2	FFC7	Hangul
+FFCA	FFCF	Hangul
+FFD2	FFD7	Hangul
+FFDA	FFDC	Hangul
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hani.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hani.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hani.pl	(revision 14489)
@@ -0,0 +1,26 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Han} (and fuzzy permutations)
+# 
+# Meaning: Script 'Han'
+#
+return <<'END';
+2E80	2E99	Han
+2E9B	2EF3	Han
+2F00	2FD5	Han
+3005		Han
+3007		Han
+3021	3029	Han
+3038	303B	Han
+3400	4DB5	Han
+4E00	9FBB	Han
+F900	FA2D	Han
+FA30	FA6A	Han
+FA70	FAD9	Han
+20000	2A6D6	Han
+2F800	2FA1D	Han
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hano.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hano.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hano.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Hanunoo} (and fuzzy permutations)
+# 
+# Meaning: Script 'Hanunoo'
+#
+return <<'END';
+1720	1734	Hanunoo
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hebr.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hebr.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hebr.pl	(revision 14489)
@@ -0,0 +1,22 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Hebrew} (and fuzzy permutations)
+# 
+# Meaning: Script 'Hebrew'
+#
+return <<'END';
+0591	05B9	Hebrew
+05BB	05C7	Hebrew
+05D0	05EA	Hebrew
+05F0	05F4	Hebrew
+FB1D	FB36	Hebrew
+FB38	FB3C	Hebrew
+FB3E		Hebrew
+FB40	FB41	Hebrew
+FB43	FB44	Hebrew
+FB46	FB4F	Hebrew
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hex.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hex.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hex.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Hex_Digit'
+#
+return <<'END';
+0030	0039	Hex_Digit
+0041	0046	Hex_Digit
+0061	0066	Hex_Digit
+FF10	FF19	Hex_Digit
+FF21	FF26	Hex_Digit
+FF41	FF46	Hex_Digit
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/HexDigit.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/HexDigit.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/HexDigit.pl	(revision 14489)
@@ -0,0 +1,18 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{HexDigit} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Hex_Digit'
+#
+return <<'END';
+0030	0039	Hex_Digit
+0041	0046	Hex_Digit
+0061	0066	Hex_Digit
+FF10	FF19	Hex_Digit
+FF21	FF26	Hex_Digit
+FF41	FF46	Hex_Digit
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hira.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hira.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hira.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Hiragana} (and fuzzy permutations)
+# 
+# Meaning: Script 'Hiragana'
+#
+return <<'END';
+3041	3096	Hiragana
+309D	309F	Hiragana
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hyphen.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hyphen.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hyphen.pl	(revision 14489)
@@ -0,0 +1,19 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Hyphen'
+#
+return <<'END';
+002D		Hyphen
+00AD		Hyphen
+058A		Hyphen
+1806		Hyphen
+2010	2011	Hyphen
+2E17		Hyphen
+30FB		Hyphen
+FE63		Hyphen
+FF0D		Hyphen
+FF65		Hyphen
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hyphen2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hyphen2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Hyphen2.pl	(revision 14489)
@@ -0,0 +1,22 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Hyphen} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Hyphen'
+#
+return <<'END';
+002D		Hyphen
+00AD		Hyphen
+058A		Hyphen
+1806		Hyphen
+2010	2011	Hyphen
+2E17		Hyphen
+30FB		Hyphen
+FE63		Hyphen
+FF0D		Hyphen
+FF65		Hyphen
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IDSB.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IDSB.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IDSB.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'IDS_Binary_Operator'
+#
+return <<'END';
+2FF0	2FF1	IDS_Binary_Operator
+2FF4	2FFB	IDS_Binary_Operator
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IDST.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IDST.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IDST.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'IDS_Trinary_Operator'
+#
+return <<'END';
+2FF2	2FF3	IDS_Trinary_Operator
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdContin.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdContin.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdContin.pl	(revision 14489)
@@ -0,0 +1,460 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{IdContinue} (and fuzzy permutations)
+# 
+# Meaning: [\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}]
+#
+return <<'END';
+0030	0039	
+0041	005A	
+005F		
+0061	007A	
+00AA		
+00B5		
+00BA		
+00C0	00D6	
+00D8	00F6	
+00F8	0241	
+0250	02C1	
+02C6	02D1	
+02E0	02E4	
+02EE		
+0300	036F	
+037A		
+0386		
+0388	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	03F5	
+03F7	0481	
+0483	0486	
+048A	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559		
+0561	0587	
+0591	05B9	
+05BB	05BD	
+05BF		
+05C1	05C2	
+05C4	05C5	
+05C7		
+05D0	05EA	
+05F0	05F2	
+0610	0615	
+0621	063A	
+0640	065E	
+0660	0669	
+066E	06D3	
+06D5	06DC	
+06DF	06E8	
+06EA	06FC	
+06FF		
+0710	074A	
+074D	076D	
+0780	07B1	
+0901	0939	
+093C	094D	
+0950	0954	
+0958	0963	
+0966	096F	
+097D		
+0981	0983	
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BC	09C4	
+09C7	09C8	
+09CB	09CE	
+09D7		
+09DC	09DD	
+09DF	09E3	
+09E6	09F1	
+0A01	0A03	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A3C		
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A59	0A5C	
+0A5E		
+0A66	0A74	
+0A81	0A83	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABC	0AC5	
+0AC7	0AC9	
+0ACB	0ACD	
+0AD0		
+0AE0	0AE3	
+0AE6	0AEF	
+0B01	0B03	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3C	0B43	
+0B47	0B48	
+0B4B	0B4D	
+0B56	0B57	
+0B5C	0B5D	
+0B5F	0B61	
+0B66	0B6F	
+0B71		
+0B82	0B83	
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCD	
+0BD7		
+0BE6	0BEF	
+0C01	0C03	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0C60	0C61	
+0C66	0C6F	
+0C82	0C83	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBC	0CC4	
+0CC6	0CC8	
+0CCA	0CCD	
+0CD5	0CD6	
+0CDE		
+0CE0	0CE1	
+0CE6	0CEF	
+0D02	0D03	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4D	
+0D57		
+0D60	0D61	
+0D66	0D6F	
+0D82	0D83	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DCA		
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF3	
+0E01	0E3A	
+0E40	0E4E	
+0E50	0E59	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB9	
+0EBB	0EBD	
+0EC0	0EC4	
+0EC6		
+0EC8	0ECD	
+0ED0	0ED9	
+0EDC	0EDD	
+0F00		
+0F18	0F19	
+0F20	0F29	
+0F35		
+0F37		
+0F39		
+0F3E	0F47	
+0F49	0F6A	
+0F71	0F84	
+0F86	0F8B	
+0F90	0F97	
+0F99	0FBC	
+0FC6		
+1000	1021	
+1023	1027	
+1029	102A	
+102C	1032	
+1036	1039	
+1040	1049	
+1050	1059	
+10A0	10C5	
+10D0	10FA	
+10FC		
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+135F		
+1380	138F	
+13A0	13F4	
+1401	166C	
+166F	1676	
+1681	169A	
+16A0	16EA	
+16EE	16F0	
+1700	170C	
+170E	1714	
+1720	1734	
+1740	1753	
+1760	176C	
+176E	1770	
+1772	1773	
+1780	17B3	
+17B6	17D3	
+17D7		
+17DC	17DD	
+17E0	17E9	
+180B	180D	
+1810	1819	
+1820	1877	
+1880	18A9	
+1900	191C	
+1920	192B	
+1930	193B	
+1946	196D	
+1970	1974	
+1980	19A9	
+19B0	19C9	
+19D0	19D9	
+1A00	1A1B	
+1D00	1DC3	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FBC	
+1FBE		
+1FC2	1FC4	
+1FC6	1FCC	
+1FD0	1FD3	
+1FD6	1FDB	
+1FE0	1FEC	
+1FF2	1FF4	
+1FF6	1FFC	
+203F	2040	
+2054		
+2071		
+207F		
+2090	2094	
+20D0	20DC	
+20E1		
+20E5	20EB	
+2102		
+2107		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+212F	2131	
+2133	2139	
+213C	213F	
+2145	2149	
+2160	2183	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CE4	
+2D00	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+3005	3007	
+3021	302F	
+3031	3035	
+3038	303C	
+3041	3096	
+3099	309A	
+309D	309F	
+30A1	30FA	
+30FC	30FF	
+3105	312C	
+3131	318E	
+31A0	31B7	
+31F0	31FF	
+3400	4DB5	
+4E00	9FBB	
+A000	A48C	
+A800	A827	
+AC00	D7A3	
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FB1D	FB28	
+FB2A	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFB	
+FE00	FE0F	
+FE20	FE23	
+FE33	FE34	
+FE4D	FE4F	
+FE70	FE74	
+FE76	FEFC	
+FF10	FF19	
+FF21	FF3A	
+FF3F		
+FF41	FF5A	
+FF66	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10140	10174	
+10300	1031E	
+10330	1034A	
+10380	1039D	
+103A0	103C3	
+103C8	103CF	
+103D1	103D5	
+10400	1049D	
+104A0	104A9	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00	10A03	
+10A05	10A06	
+10A0C	10A13	
+10A15	10A17	
+10A19	10A33	
+10A38	10A3A	
+10A3F		
+1D165	1D169	
+1D16D	1D172	
+1D17B	1D182	
+1D185	1D18B	
+1D1AA	1D1AD	
+1D242	1D244	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D6C0	
+1D6C2	1D6DA	
+1D6DC	1D6FA	
+1D6FC	1D714	
+1D716	1D734	
+1D736	1D74E	
+1D750	1D76E	
+1D770	1D788	
+1D78A	1D7A8	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+1D7CE	1D7FF	
+20000	2A6D6	
+2F800	2FA1D	
+E0100	E01EF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdStart.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdStart.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdStart.pl	(revision 14489)
@@ -0,0 +1,364 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{IdStart} (and fuzzy permutations)
+# 
+# Meaning: [\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{Nl}]
+#
+return <<'END';
+0041	005A	
+0061	007A	
+00AA		
+00B5		
+00BA		
+00C0	00D6	
+00D8	00F6	
+00F8	0241	
+0250	02C1	
+02C6	02D1	
+02E0	02E4	
+02EE		
+037A		
+0386		
+0388	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	03F5	
+03F7	0481	
+048A	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559		
+0561	0587	
+05D0	05EA	
+05F0	05F2	
+0621	063A	
+0640	064A	
+066E	066F	
+0671	06D3	
+06D5		
+06E5	06E6	
+06EE	06EF	
+06FA	06FC	
+06FF		
+0710		
+0712	072F	
+074D	076D	
+0780	07A5	
+07B1		
+0904	0939	
+093D		
+0950		
+0958	0961	
+097D		
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BD		
+09CE		
+09DC	09DD	
+09DF	09E1	
+09F0	09F1	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A59	0A5C	
+0A5E		
+0A72	0A74	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABD		
+0AD0		
+0AE0	0AE1	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3D		
+0B5C	0B5D	
+0B5F	0B61	
+0B71		
+0B83		
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C60	0C61	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBD		
+0CDE		
+0CE0	0CE1	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D60	0D61	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0E01	0E30	
+0E32	0E33	
+0E40	0E46	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB0	
+0EB2	0EB3	
+0EBD		
+0EC0	0EC4	
+0EC6		
+0EDC	0EDD	
+0F00		
+0F40	0F47	
+0F49	0F6A	
+0F88	0F8B	
+1000	1021	
+1023	1027	
+1029	102A	
+1050	1055	
+10A0	10C5	
+10D0	10FA	
+10FC		
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+1380	138F	
+13A0	13F4	
+1401	166C	
+166F	1676	
+1681	169A	
+16A0	16EA	
+16EE	16F0	
+1700	170C	
+170E	1711	
+1720	1731	
+1740	1751	
+1760	176C	
+176E	1770	
+1780	17B3	
+17D7		
+17DC		
+1820	1877	
+1880	18A8	
+1900	191C	
+1950	196D	
+1970	1974	
+1980	19A9	
+19C1	19C7	
+1A00	1A16	
+1D00	1DBF	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FBC	
+1FBE		
+1FC2	1FC4	
+1FC6	1FCC	
+1FD0	1FD3	
+1FD6	1FDB	
+1FE0	1FEC	
+1FF2	1FF4	
+1FF6	1FFC	
+2071		
+207F		
+2090	2094	
+2102		
+2107		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+212F	2131	
+2133	2139	
+213C	213F	
+2145	2149	
+2160	2183	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CE4	
+2D00	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+3005	3007	
+3021	3029	
+3031	3035	
+3038	303C	
+3041	3096	
+309D	309F	
+30A1	30FA	
+30FC	30FF	
+3105	312C	
+3131	318E	
+31A0	31B7	
+31F0	31FF	
+3400	4DB5	
+4E00	9FBB	
+A000	A48C	
+A800	A801	
+A803	A805	
+A807	A80A	
+A80C	A822	
+AC00	D7A3	
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FB1D		
+FB1F	FB28	
+FB2A	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFB	
+FE70	FE74	
+FE76	FEFC	
+FF21	FF3A	
+FF41	FF5A	
+FF66	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10140	10174	
+10300	1031E	
+10330	1034A	
+10380	1039D	
+103A0	103C3	
+103C8	103CF	
+103D1	103D5	
+10400	1049D	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00		
+10A10	10A13	
+10A15	10A17	
+10A19	10A33	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D6C0	
+1D6C2	1D6DA	
+1D6DC	1D6FA	
+1D6FC	1D714	
+1D716	1D734	
+1D736	1D74E	
+1D750	1D76E	
+1D770	1D788	
+1D78A	1D7A8	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+20000	2A6D6	
+2F800	2FA1D	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ideo.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ideo.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ideo.pl	(revision 14489)
@@ -0,0 +1,18 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Ideographic'
+#
+return <<'END';
+3006	3007	Ideographic
+3021	3029	Ideographic
+3038	303A	Ideographic
+3400	4DB5	Ideographic
+4E00	9FBB	Ideographic
+F900	FA2D	Ideographic
+FA70	FAD9	Ideographic
+20000	2A6D6	Ideographic
+2F800	2FA1D	Ideographic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ideograp.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ideograp.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ideograp.pl	(revision 14489)
@@ -0,0 +1,21 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Ideographic} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Ideographic'
+#
+return <<'END';
+3006	3007	Ideographic
+3021	3029	Ideographic
+3038	303A	Ideographic
+3400	4DB5	Ideographic
+4E00	9FBB	Ideographic
+F900	FA2D	Ideographic
+FA70	FAD9	Ideographic
+20000	2A6D6	Ideographic
+2F800	2FA1D	Ideographic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdsBinar.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdsBinar.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdsBinar.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{IdsBinaryOperator} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'IDS_Binary_Operator'
+#
+return <<'END';
+2FF0	2FF1	IDS_Binary_Operator
+2FF4	2FFB	IDS_Binary_Operator
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdsTrina.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdsTrina.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/IdsTrina.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{IdsTrinaryOperator} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'IDS_Trinary_Operator'
+#
+return <<'END';
+2FF2	2FF3	IDS_Trinary_Operator
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAegean.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAegean.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAegean.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InAegeanNumbers} (and fuzzy permutations)
+# 
+# Meaning: Block 'Aegean Numbers'
+#
+return <<'END';
+10100	1013F	Aegean Numbers
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAlphab.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAlphab.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAlphab.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InAlphabeticPresentationForms} (and fuzzy permutations)
+# 
+# Meaning: Block 'Alphabetic Presentation Forms'
+#
+return <<'END';
+FB00	FB4F	Alphabetic Presentation Forms
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAncie2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAncie2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAncie2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InAncientGreekMusicalNotation} (and fuzzy permutations)
+# 
+# Meaning: Block 'Ancient Greek Musical Notation'
+#
+return <<'END';
+1D200	1D24F	Ancient Greek Musical Notation
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAncien.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAncien.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InAncien.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InAncientGreekNumbers} (and fuzzy permutations)
+# 
+# Meaning: Block 'Ancient Greek Numbers'
+#
+return <<'END';
+10140	1018F	Ancient Greek Numbers
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabi2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabi2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabi2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InArabicSupplement} (and fuzzy permutations)
+# 
+# Meaning: Block 'Arabic Supplement'
+#
+return <<'END';
+0750	077F	Arabic Supplement
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabi3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabi3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabi3.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InArabicPresentationFormsB} (and fuzzy permutations)
+# 
+# Meaning: Block 'Arabic Presentation Forms-B'
+#
+return <<'END';
+FE70	FEFF	Arabic Presentation Forms-B
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabi4.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabi4.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabi4.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InArabicPresentationFormsA} (and fuzzy permutations)
+# 
+# Meaning: Block 'Arabic Presentation Forms-A'
+#
+return <<'END';
+FB50	FDFF	Arabic Presentation Forms-A
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabic.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabic.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArabic.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InArabic} (and fuzzy permutations)
+# 
+# Meaning: Block 'Arabic'
+#
+return <<'END';
+0600	06FF	Arabic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArmeni.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArmeni.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArmeni.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InArmenian} (and fuzzy permutations)
+# 
+# Meaning: Block 'Armenian'
+#
+return <<'END';
+0530	058F	Armenian
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArrows.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArrows.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InArrows.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InArrows} (and fuzzy permutations)
+# 
+# Meaning: Block 'Arrows'
+#
+return <<'END';
+2190	21FF	Arrows
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBasicL.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBasicL.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBasicL.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InBasicLatin} (and fuzzy permutations)
+# 
+# Meaning: Block 'Basic Latin'
+#
+return <<'END';
+0000	007F	Basic Latin
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBengal.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBengal.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBengal.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InBengali} (and fuzzy permutations)
+# 
+# Meaning: Block 'Bengali'
+#
+return <<'END';
+0980	09FF	Bengali
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBlockE.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBlockE.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBlockE.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InBlockElements} (and fuzzy permutations)
+# 
+# Meaning: Block 'Block Elements'
+#
+return <<'END';
+2580	259F	Block Elements
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBopom2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBopom2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBopom2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InBopomofoExtended} (and fuzzy permutations)
+# 
+# Meaning: Block 'Bopomofo Extended'
+#
+return <<'END';
+31A0	31BF	Bopomofo Extended
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBopomo.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBopomo.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBopomo.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InBopomofo} (and fuzzy permutations)
+# 
+# Meaning: Block 'Bopomofo'
+#
+return <<'END';
+3100	312F	Bopomofo
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBoxDra.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBoxDra.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBoxDra.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InBoxDrawing} (and fuzzy permutations)
+# 
+# Meaning: Block 'Box Drawing'
+#
+return <<'END';
+2500	257F	Box Drawing
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBraill.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBraill.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBraill.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InBraillePatterns} (and fuzzy permutations)
+# 
+# Meaning: Block 'Braille Patterns'
+#
+return <<'END';
+2800	28FF	Braille Patterns
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBugine.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBugine.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBugine.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InBuginese} (and fuzzy permutations)
+# 
+# Meaning: Block 'Buginese'
+#
+return <<'END';
+1A00	1A1F	Buginese
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBuhid.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBuhid.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InBuhid.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InBuhid} (and fuzzy permutations)
+# 
+# Meaning: Block 'Buhid'
+#
+return <<'END';
+1740	175F	Buhid
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InByzant.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InByzant.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InByzant.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InByzantineMusicalSymbols} (and fuzzy permutations)
+# 
+# Meaning: Block 'Byzantine Musical Symbols'
+#
+return <<'END';
+1D000	1D0FF	Byzantine Musical Symbols
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCherok.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCherok.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCherok.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCherokee} (and fuzzy permutations)
+# 
+# Meaning: Block 'Cherokee'
+#
+return <<'END';
+13A0	13FF	Cherokee
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCo2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCo2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCo2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCjkCompatibilityForms} (and fuzzy permutations)
+# 
+# Meaning: Block 'CJK Compatibility Forms'
+#
+return <<'END';
+FE30	FE4F	CJK Compatibility Forms
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCo3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCo3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCo3.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCjkCompatibilityIdeographs} (and fuzzy permutations)
+# 
+# Meaning: Block 'CJK Compatibility Ideographs'
+#
+return <<'END';
+F900	FAFF	CJK Compatibility Ideographs
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCo4.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCo4.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCo4.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCjkCompatibilityIdeographsSupplement} (and fuzzy permutations)
+# 
+# Meaning: Block 'CJK Compatibility Ideographs Supplement'
+#
+return <<'END';
+2F800	2FA1F	CJK Compatibility Ideographs Supplement
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCom.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCom.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkCom.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCjkCompatibility} (and fuzzy permutations)
+# 
+# Meaning: Block 'CJK Compatibility'
+#
+return <<'END';
+3300	33FF	CJK Compatibility
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkRad.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkRad.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkRad.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCjkRadicalsSupplement} (and fuzzy permutations)
+# 
+# Meaning: Block 'CJK Radicals Supplement'
+#
+return <<'END';
+2E80	2EFF	CJK Radicals Supplement
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkStr.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkStr.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkStr.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCjkStrokes} (and fuzzy permutations)
+# 
+# Meaning: Block 'CJK Strokes'
+#
+return <<'END';
+31C0	31EF	CJK Strokes
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkSym.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkSym.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkSym.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCjkSymbolsAndPunctuation} (and fuzzy permutations)
+# 
+# Meaning: Block 'CJK Symbols and Punctuation'
+#
+return <<'END';
+3000	303F	CJK Symbols and Punctuation
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkUn2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkUn2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkUn2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCjkUnifiedIdeographsExtensionB} (and fuzzy permutations)
+# 
+# Meaning: Block 'CJK Unified Ideographs Extension B'
+#
+return <<'END';
+20000	2A6DF	CJK Unified Ideographs Extension B
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkUn3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkUn3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkUn3.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCjkUnifiedIdeographsExtensionA} (and fuzzy permutations)
+# 
+# Meaning: Block 'CJK Unified Ideographs Extension A'
+#
+return <<'END';
+3400	4DBF	CJK Unified Ideographs Extension A
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkUni.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkUni.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCjkUni.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCjkUnifiedIdeographs} (and fuzzy permutations)
+# 
+# Meaning: Block 'CJK Unified Ideographs'
+#
+return <<'END';
+4E00	9FFF	CJK Unified Ideographs
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombi2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombi2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombi2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCombiningDiacriticalMarks} (and fuzzy permutations)
+# 
+# Meaning: Block 'Combining Diacritical Marks'
+#
+return <<'END';
+0300	036F	Combining Diacritical Marks
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombi3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombi3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombi3.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCombiningDiacriticalMarksSupplement} (and fuzzy permutations)
+# 
+# Meaning: Block 'Combining Diacritical Marks Supplement'
+#
+return <<'END';
+1DC0	1DFF	Combining Diacritical Marks Supplement
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombi4.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombi4.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombi4.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCombiningDiacriticalMarksForSymbols} (and fuzzy permutations)
+# 
+# Meaning: Block 'Combining Diacritical Marks for Symbols'
+#
+return <<'END';
+20D0	20FF	Combining Diacritical Marks for Symbols
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombin.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombin.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCombin.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCombiningHalfMarks} (and fuzzy permutations)
+# 
+# Meaning: Block 'Combining Half Marks'
+#
+return <<'END';
+FE20	FE2F	Combining Half Marks
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InContro.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InContro.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InContro.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InControlPictures} (and fuzzy permutations)
+# 
+# Meaning: Block 'Control Pictures'
+#
+return <<'END';
+2400	243F	Control Pictures
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCoptic.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCoptic.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCoptic.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCoptic} (and fuzzy permutations)
+# 
+# Meaning: Block 'Coptic'
+#
+return <<'END';
+2C80	2CFF	Coptic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCurren.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCurren.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCurren.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCurrencySymbols} (and fuzzy permutations)
+# 
+# Meaning: Block 'Currency Symbols'
+#
+return <<'END';
+20A0	20CF	Currency Symbols
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCyprio.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCyprio.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCyprio.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCypriotSyllabary} (and fuzzy permutations)
+# 
+# Meaning: Block 'Cypriot Syllabary'
+#
+return <<'END';
+10800	1083F	Cypriot Syllabary
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCyril2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCyril2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCyril2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCyrillicSupplement} (and fuzzy permutations)
+# 
+# Meaning: Block 'Cyrillic Supplement'
+#
+return <<'END';
+0500	052F	Cyrillic Supplement
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCyrill.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCyrill.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InCyrill.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InCyrillic} (and fuzzy permutations)
+# 
+# Meaning: Block 'Cyrillic'
+#
+return <<'END';
+0400	04FF	Cyrillic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InDesere.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InDesere.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InDesere.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InDeseret} (and fuzzy permutations)
+# 
+# Meaning: Block 'Deseret'
+#
+return <<'END';
+10400	1044F	Deseret
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InDevana.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InDevana.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InDevana.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InDevanagari} (and fuzzy permutations)
+# 
+# Meaning: Block 'Devanagari'
+#
+return <<'END';
+0900	097F	Devanagari
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InDingba.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InDingba.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InDingba.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InDingbats} (and fuzzy permutations)
+# 
+# Meaning: Block 'Dingbats'
+#
+return <<'END';
+2700	27BF	Dingbats
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEnclo2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEnclo2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEnclo2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InEnclosedCjkLettersAndMonths} (and fuzzy permutations)
+# 
+# Meaning: Block 'Enclosed CJK Letters and Months'
+#
+return <<'END';
+3200	32FF	Enclosed CJK Letters and Months
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEnclos.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEnclos.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEnclos.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InEnclosedAlphanumerics} (and fuzzy permutations)
+# 
+# Meaning: Block 'Enclosed Alphanumerics'
+#
+return <<'END';
+2460	24FF	Enclosed Alphanumerics
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEthio2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEthio2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEthio2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InEthiopicExtended} (and fuzzy permutations)
+# 
+# Meaning: Block 'Ethiopic Extended'
+#
+return <<'END';
+2D80	2DDF	Ethiopic Extended
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEthio3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEthio3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEthio3.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InEthiopicSupplement} (and fuzzy permutations)
+# 
+# Meaning: Block 'Ethiopic Supplement'
+#
+return <<'END';
+1380	139F	Ethiopic Supplement
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEthiop.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEthiop.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InEthiop.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InEthiopic} (and fuzzy permutations)
+# 
+# Meaning: Block 'Ethiopic'
+#
+return <<'END';
+1200	137F	Ethiopic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGenera.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGenera.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGenera.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InGeneralPunctuation} (and fuzzy permutations)
+# 
+# Meaning: Block 'General Punctuation'
+#
+return <<'END';
+2000	206F	General Punctuation
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGeomet.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGeomet.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGeomet.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InGeometricShapes} (and fuzzy permutations)
+# 
+# Meaning: Block 'Geometric Shapes'
+#
+return <<'END';
+25A0	25FF	Geometric Shapes
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGeorg2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGeorg2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGeorg2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InGeorgianSupplement} (and fuzzy permutations)
+# 
+# Meaning: Block 'Georgian Supplement'
+#
+return <<'END';
+2D00	2D2F	Georgian Supplement
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGeorgi.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGeorgi.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGeorgi.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InGeorgian} (and fuzzy permutations)
+# 
+# Meaning: Block 'Georgian'
+#
+return <<'END';
+10A0	10FF	Georgian
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGlagol.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGlagol.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGlagol.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InGlagolitic} (and fuzzy permutations)
+# 
+# Meaning: Block 'Glagolitic'
+#
+return <<'END';
+2C00	2C5F	Glagolitic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGothic.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGothic.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGothic.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InGothic} (and fuzzy permutations)
+# 
+# Meaning: Block 'Gothic'
+#
+return <<'END';
+10330	1034F	Gothic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGreekA.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGreekA.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGreekA.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InGreekAndCoptic} (and fuzzy permutations)
+# 
+# Meaning: Block 'Greek and Coptic'
+#
+return <<'END';
+0370	03FF	Greek and Coptic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGreekE.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGreekE.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGreekE.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InGreekExtended} (and fuzzy permutations)
+# 
+# Meaning: Block 'Greek Extended'
+#
+return <<'END';
+1F00	1FFF	Greek Extended
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGujara.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGujara.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGujara.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InGujarati} (and fuzzy permutations)
+# 
+# Meaning: Block 'Gujarati'
+#
+return <<'END';
+0A80	0AFF	Gujarati
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGurmuk.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGurmuk.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InGurmuk.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InGurmukhi} (and fuzzy permutations)
+# 
+# Meaning: Block 'Gurmukhi'
+#
+return <<'END';
+0A00	0A7F	Gurmukhi
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHalfwi.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHalfwi.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHalfwi.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InHalfwidthAndFullwidthForms} (and fuzzy permutations)
+# 
+# Meaning: Block 'Halfwidth and Fullwidth Forms'
+#
+return <<'END';
+FF00	FFEF	Halfwidth and Fullwidth Forms
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHangu2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHangu2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHangu2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InHangulSyllables} (and fuzzy permutations)
+# 
+# Meaning: Block 'Hangul Syllables'
+#
+return <<'END';
+AC00	D7AF	Hangul Syllables
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHangu3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHangu3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHangu3.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InHangulCompatibilityJamo} (and fuzzy permutations)
+# 
+# Meaning: Block 'Hangul Compatibility Jamo'
+#
+return <<'END';
+3130	318F	Hangul Compatibility Jamo
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHangul.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHangul.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHangul.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InHangulJamo} (and fuzzy permutations)
+# 
+# Meaning: Block 'Hangul Jamo'
+#
+return <<'END';
+1100	11FF	Hangul Jamo
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHanuno.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHanuno.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHanuno.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InHanunoo} (and fuzzy permutations)
+# 
+# Meaning: Block 'Hanunoo'
+#
+return <<'END';
+1720	173F	Hanunoo
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHebrew.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHebrew.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHebrew.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InHebrew} (and fuzzy permutations)
+# 
+# Meaning: Block 'Hebrew'
+#
+return <<'END';
+0590	05FF	Hebrew
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHighPr.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHighPr.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHighPr.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InHighPrivateUseSurrogates} (and fuzzy permutations)
+# 
+# Meaning: Block 'High Private Use Surrogates'
+#
+return <<'END';
+DB80	DBFF	High Private Use Surrogates
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHighSu.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHighSu.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHighSu.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InHighSurrogates} (and fuzzy permutations)
+# 
+# Meaning: Block 'High Surrogates'
+#
+return <<'END';
+D800	DB7F	High Surrogates
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHiraga.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHiraga.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InHiraga.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InHiragana} (and fuzzy permutations)
+# 
+# Meaning: Block 'Hiragana'
+#
+return <<'END';
+3040	309F	Hiragana
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InIdeogr.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InIdeogr.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InIdeogr.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InIdeographicDescriptionCharacters} (and fuzzy permutations)
+# 
+# Meaning: Block 'Ideographic Description Characters'
+#
+return <<'END';
+2FF0	2FFF	Ideographic Description Characters
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InIpaExt.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InIpaExt.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InIpaExt.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InIpaExtensions} (and fuzzy permutations)
+# 
+# Meaning: Block 'IPA Extensions'
+#
+return <<'END';
+0250	02AF	IPA Extensions
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKanbun.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKanbun.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKanbun.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InKanbun} (and fuzzy permutations)
+# 
+# Meaning: Block 'Kanbun'
+#
+return <<'END';
+3190	319F	Kanbun
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKangxi.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKangxi.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKangxi.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InKangxiRadicals} (and fuzzy permutations)
+# 
+# Meaning: Block 'Kangxi Radicals'
+#
+return <<'END';
+2F00	2FDF	Kangxi Radicals
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKannad.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKannad.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKannad.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InKannada} (and fuzzy permutations)
+# 
+# Meaning: Block 'Kannada'
+#
+return <<'END';
+0C80	0CFF	Kannada
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKatak2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKatak2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKatak2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InKatakanaPhoneticExtensions} (and fuzzy permutations)
+# 
+# Meaning: Block 'Katakana Phonetic Extensions'
+#
+return <<'END';
+31F0	31FF	Katakana Phonetic Extensions
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKataka.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKataka.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKataka.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InKatakana} (and fuzzy permutations)
+# 
+# Meaning: Block 'Katakana'
+#
+return <<'END';
+30A0	30FF	Katakana
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKharos.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKharos.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKharos.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InKharoshthi} (and fuzzy permutations)
+# 
+# Meaning: Block 'Kharoshthi'
+#
+return <<'END';
+10A00	10A5F	Kharoshthi
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKhmer.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKhmer.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKhmer.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InKhmer} (and fuzzy permutations)
+# 
+# Meaning: Block 'Khmer'
+#
+return <<'END';
+1780	17FF	Khmer
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKhmerS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKhmerS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InKhmerS.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InKhmerSymbols} (and fuzzy permutations)
+# 
+# Meaning: Block 'Khmer Symbols'
+#
+return <<'END';
+19E0	19FF	Khmer Symbols
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLao.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLao.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLao.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InLao} (and fuzzy permutations)
+# 
+# Meaning: Block 'Lao'
+#
+return <<'END';
+0E80	0EFF	Lao
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatin1.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatin1.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatin1.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InLatin1Supplement} (and fuzzy permutations)
+# 
+# Meaning: Block 'Latin-1 Supplement'
+#
+return <<'END';
+0080	00FF	Latin-1 Supplement
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatin2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatin2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatin2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InLatinExtendedA} (and fuzzy permutations)
+# 
+# Meaning: Block 'Latin Extended-A'
+#
+return <<'END';
+0100	017F	Latin Extended-A
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatin3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatin3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatin3.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InLatinExtendedAdditional} (and fuzzy permutations)
+# 
+# Meaning: Block 'Latin Extended Additional'
+#
+return <<'END';
+1E00	1EFF	Latin Extended Additional
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatinE.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatinE.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLatinE.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InLatinExtendedB} (and fuzzy permutations)
+# 
+# Meaning: Block 'Latin Extended-B'
+#
+return <<'END';
+0180	024F	Latin Extended-B
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLetter.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLetter.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLetter.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InLetterlikeSymbols} (and fuzzy permutations)
+# 
+# Meaning: Block 'Letterlike Symbols'
+#
+return <<'END';
+2100	214F	Letterlike Symbols
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLimbu.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLimbu.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLimbu.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InLimbu} (and fuzzy permutations)
+# 
+# Meaning: Block 'Limbu'
+#
+return <<'END';
+1900	194F	Limbu
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLinea2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLinea2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLinea2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InLinearBSyllabary} (and fuzzy permutations)
+# 
+# Meaning: Block 'Linear B Syllabary'
+#
+return <<'END';
+10000	1007F	Linear B Syllabary
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLinear.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLinear.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLinear.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InLinearBIdeograms} (and fuzzy permutations)
+# 
+# Meaning: Block 'Linear B Ideograms'
+#
+return <<'END';
+10080	100FF	Linear B Ideograms
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLowSur.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLowSur.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InLowSur.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InLowSurrogates} (and fuzzy permutations)
+# 
+# Meaning: Block 'Low Surrogates'
+#
+return <<'END';
+DC00	DFFF	Low Surrogates
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMalaya.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMalaya.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMalaya.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMalayalam} (and fuzzy permutations)
+# 
+# Meaning: Block 'Malayalam'
+#
+return <<'END';
+0D00	0D7F	Malayalam
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMathe2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMathe2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMathe2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMathematicalAlphanumericSymbols} (and fuzzy permutations)
+# 
+# Meaning: Block 'Mathematical Alphanumeric Symbols'
+#
+return <<'END';
+1D400	1D7FF	Mathematical Alphanumeric Symbols
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMathem.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMathem.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMathem.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMathematicalOperators} (and fuzzy permutations)
+# 
+# Meaning: Block 'Mathematical Operators'
+#
+return <<'END';
+2200	22FF	Mathematical Operators
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMiscellaneousTechnical} (and fuzzy permutations)
+# 
+# Meaning: Block 'Miscellaneous Technical'
+#
+return <<'END';
+2300	23FF	Miscellaneous Technical
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce3.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMiscellaneousSymbolsAndArrows} (and fuzzy permutations)
+# 
+# Meaning: Block 'Miscellaneous Symbols and Arrows'
+#
+return <<'END';
+2B00	2BFF	Miscellaneous Symbols and Arrows
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce4.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce4.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce4.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMiscellaneousMathematicalSymbolsA} (and fuzzy permutations)
+# 
+# Meaning: Block 'Miscellaneous Mathematical Symbols-A'
+#
+return <<'END';
+27C0	27EF	Miscellaneous Mathematical Symbols-A
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce5.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce5.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMisce5.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMiscellaneousMathematicalSymbolsB} (and fuzzy permutations)
+# 
+# Meaning: Block 'Miscellaneous Mathematical Symbols-B'
+#
+return <<'END';
+2980	29FF	Miscellaneous Mathematical Symbols-B
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMiscel.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMiscel.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMiscel.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMiscellaneousSymbols} (and fuzzy permutations)
+# 
+# Meaning: Block 'Miscellaneous Symbols'
+#
+return <<'END';
+2600	26FF	Miscellaneous Symbols
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InModifi.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InModifi.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InModifi.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InModifierToneLetters} (and fuzzy permutations)
+# 
+# Meaning: Block 'Modifier Tone Letters'
+#
+return <<'END';
+A700	A71F	Modifier Tone Letters
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMongol.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMongol.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMongol.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMongolian} (and fuzzy permutations)
+# 
+# Meaning: Block 'Mongolian'
+#
+return <<'END';
+1800	18AF	Mongolian
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMusica.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMusica.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMusica.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMusicalSymbols} (and fuzzy permutations)
+# 
+# Meaning: Block 'Musical Symbols'
+#
+return <<'END';
+1D100	1D1FF	Musical Symbols
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMyanma.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMyanma.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InMyanma.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InMyanmar} (and fuzzy permutations)
+# 
+# Meaning: Block 'Myanmar'
+#
+return <<'END';
+1000	109F	Myanmar
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InNewTai.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InNewTai.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InNewTai.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InNewTaiLue} (and fuzzy permutations)
+# 
+# Meaning: Block 'New Tai Lue'
+#
+return <<'END';
+1980	19DF	New Tai Lue
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InNumber.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InNumber.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InNumber.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InNumberForms} (and fuzzy permutations)
+# 
+# Meaning: Block 'Number Forms'
+#
+return <<'END';
+2150	218F	Number Forms
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOgham.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOgham.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOgham.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InOgham} (and fuzzy permutations)
+# 
+# Meaning: Block 'Ogham'
+#
+return <<'END';
+1680	169F	Ogham
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOldIta.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOldIta.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOldIta.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InOldItalic} (and fuzzy permutations)
+# 
+# Meaning: Block 'Old Italic'
+#
+return <<'END';
+10300	1032F	Old Italic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOldPer.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOldPer.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOldPer.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InOldPersian} (and fuzzy permutations)
+# 
+# Meaning: Block 'Old Persian'
+#
+return <<'END';
+103A0	103DF	Old Persian
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOptica.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOptica.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOptica.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InOpticalCharacterRecognition} (and fuzzy permutations)
+# 
+# Meaning: Block 'Optical Character Recognition'
+#
+return <<'END';
+2440	245F	Optical Character Recognition
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOriya.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOriya.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOriya.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InOriya} (and fuzzy permutations)
+# 
+# Meaning: Block 'Oriya'
+#
+return <<'END';
+0B00	0B7F	Oriya
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOsmany.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOsmany.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InOsmany.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InOsmanya} (and fuzzy permutations)
+# 
+# Meaning: Block 'Osmanya'
+#
+return <<'END';
+10480	104AF	Osmanya
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InPhone2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InPhone2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InPhone2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InPhoneticExtensionsSupplement} (and fuzzy permutations)
+# 
+# Meaning: Block 'Phonetic Extensions Supplement'
+#
+return <<'END';
+1D80	1DBF	Phonetic Extensions Supplement
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InPhonet.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InPhonet.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InPhonet.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InPhoneticExtensions} (and fuzzy permutations)
+# 
+# Meaning: Block 'Phonetic Extensions'
+#
+return <<'END';
+1D00	1D7F	Phonetic Extensions
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InPrivat.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InPrivat.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InPrivat.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InPrivateUseArea} (and fuzzy permutations)
+# 
+# Meaning: Block 'Private Use Area'
+#
+return <<'END';
+E000	F8FF	Private Use Area
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InRunic.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InRunic.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InRunic.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InRunic} (and fuzzy permutations)
+# 
+# Meaning: Block 'Runic'
+#
+return <<'END';
+16A0	16FF	Runic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InShavia.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InShavia.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InShavia.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InShavian} (and fuzzy permutations)
+# 
+# Meaning: Block 'Shavian'
+#
+return <<'END';
+10450	1047F	Shavian
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSinhal.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSinhal.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSinhal.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSinhala} (and fuzzy permutations)
+# 
+# Meaning: Block 'Sinhala'
+#
+return <<'END';
+0D80	0DFF	Sinhala
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSmallF.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSmallF.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSmallF.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSmallFormVariants} (and fuzzy permutations)
+# 
+# Meaning: Block 'Small Form Variants'
+#
+return <<'END';
+FE50	FE6F	Small Form Variants
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSpacin.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSpacin.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSpacin.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSpacingModifierLetters} (and fuzzy permutations)
+# 
+# Meaning: Block 'Spacing Modifier Letters'
+#
+return <<'END';
+02B0	02FF	Spacing Modifier Letters
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSpecia.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSpecia.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSpecia.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSpecials} (and fuzzy permutations)
+# 
+# Meaning: Block 'Specials'
+#
+return <<'END';
+FFF0	FFFF	Specials
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSupers.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSupers.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSupers.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSuperscriptsAndSubscripts} (and fuzzy permutations)
+# 
+# Meaning: Block 'Superscripts and Subscripts'
+#
+return <<'END';
+2070	209F	Superscripts and Subscripts
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSupplementalArrowsA} (and fuzzy permutations)
+# 
+# Meaning: Block 'Supplemental Arrows-A'
+#
+return <<'END';
+27F0	27FF	Supplemental Arrows-A
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl3.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSupplementalPunctuation} (and fuzzy permutations)
+# 
+# Meaning: Block 'Supplemental Punctuation'
+#
+return <<'END';
+2E00	2E7F	Supplemental Punctuation
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl4.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl4.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl4.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSupplementaryPrivateUseAreaA} (and fuzzy permutations)
+# 
+# Meaning: Block 'Supplementary Private Use Area-A'
+#
+return <<'END';
+F0000	FFFFF	Supplementary Private Use Area-A
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl5.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl5.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl5.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSupplementaryPrivateUseAreaB} (and fuzzy permutations)
+# 
+# Meaning: Block 'Supplementary Private Use Area-B'
+#
+return <<'END';
+100000	10FFFF	Supplementary Private Use Area-B
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl6.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl6.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSuppl6.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSupplementalMathematicalOperators} (and fuzzy permutations)
+# 
+# Meaning: Block 'Supplemental Mathematical Operators'
+#
+return <<'END';
+2A00	2AFF	Supplemental Mathematical Operators
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSupple.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSupple.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSupple.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSupplementalArrowsB} (and fuzzy permutations)
+# 
+# Meaning: Block 'Supplemental Arrows-B'
+#
+return <<'END';
+2900	297F	Supplemental Arrows-B
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSyloti.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSyloti.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSyloti.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSylotiNagri} (and fuzzy permutations)
+# 
+# Meaning: Block 'Syloti Nagri'
+#
+return <<'END';
+A800	A82F	Syloti Nagri
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSyriac.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSyriac.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InSyriac.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InSyriac} (and fuzzy permutations)
+# 
+# Meaning: Block 'Syriac'
+#
+return <<'END';
+0700	074F	Syriac
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTagalo.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTagalo.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTagalo.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InTagalog} (and fuzzy permutations)
+# 
+# Meaning: Block 'Tagalog'
+#
+return <<'END';
+1700	171F	Tagalog
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTagban.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTagban.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTagban.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InTagbanwa} (and fuzzy permutations)
+# 
+# Meaning: Block 'Tagbanwa'
+#
+return <<'END';
+1760	177F	Tagbanwa
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTags.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTags.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTags.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InTags} (and fuzzy permutations)
+# 
+# Meaning: Block 'Tags'
+#
+return <<'END';
+E0000	E007F	Tags
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTaiLe.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTaiLe.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTaiLe.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InTaiLe} (and fuzzy permutations)
+# 
+# Meaning: Block 'Tai Le'
+#
+return <<'END';
+1950	197F	Tai Le
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTaiXua.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTaiXua.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTaiXua.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InTaiXuanJingSymbols} (and fuzzy permutations)
+# 
+# Meaning: Block 'Tai Xuan Jing Symbols'
+#
+return <<'END';
+1D300	1D35F	Tai Xuan Jing Symbols
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTamil.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTamil.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTamil.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InTamil} (and fuzzy permutations)
+# 
+# Meaning: Block 'Tamil'
+#
+return <<'END';
+0B80	0BFF	Tamil
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTelugu.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTelugu.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTelugu.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InTelugu} (and fuzzy permutations)
+# 
+# Meaning: Block 'Telugu'
+#
+return <<'END';
+0C00	0C7F	Telugu
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InThaana.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InThaana.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InThaana.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InThaana} (and fuzzy permutations)
+# 
+# Meaning: Block 'Thaana'
+#
+return <<'END';
+0780	07BF	Thaana
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InThai.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InThai.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InThai.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InThai} (and fuzzy permutations)
+# 
+# Meaning: Block 'Thai'
+#
+return <<'END';
+0E00	0E7F	Thai
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTibeta.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTibeta.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTibeta.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InTibetan} (and fuzzy permutations)
+# 
+# Meaning: Block 'Tibetan'
+#
+return <<'END';
+0F00	0FFF	Tibetan
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTifina.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTifina.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InTifina.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InTifinagh} (and fuzzy permutations)
+# 
+# Meaning: Block 'Tifinagh'
+#
+return <<'END';
+2D30	2D7F	Tifinagh
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InUgarit.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InUgarit.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InUgarit.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InUgaritic} (and fuzzy permutations)
+# 
+# Meaning: Block 'Ugaritic'
+#
+return <<'END';
+10380	1039F	Ugaritic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InUnifie.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InUnifie.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InUnifie.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InUnifiedCanadianAboriginalSyllabics} (and fuzzy permutations)
+# 
+# Meaning: Block 'Unified Canadian Aboriginal Syllabics'
+#
+return <<'END';
+1400	167F	Unified Canadian Aboriginal Syllabics
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InVaria2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InVaria2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InVaria2.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InVariationSelectorsSupplement} (and fuzzy permutations)
+# 
+# Meaning: Block 'Variation Selectors Supplement'
+#
+return <<'END';
+E0100	E01EF	Variation Selectors Supplement
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InVariat.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InVariat.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InVariat.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InVariationSelectors} (and fuzzy permutations)
+# 
+# Meaning: Block 'Variation Selectors'
+#
+return <<'END';
+FE00	FE0F	Variation Selectors
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InVertic.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InVertic.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InVertic.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InVerticalForms} (and fuzzy permutations)
+# 
+# Meaning: Block 'Vertical Forms'
+#
+return <<'END';
+FE10	FE1F	Vertical Forms
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InYiRadi.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InYiRadi.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InYiRadi.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InYiRadicals} (and fuzzy permutations)
+# 
+# Meaning: Block 'Yi Radicals'
+#
+return <<'END';
+A490	A4CF	Yi Radicals
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InYiSyll.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InYiSyll.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InYiSyll.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InYiSyllables} (and fuzzy permutations)
+# 
+# Meaning: Block 'Yi Syllables'
+#
+return <<'END';
+A000	A48F	Yi Syllables
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InYijing.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InYijing.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/InYijing.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{InYijingHexagramSymbols} (and fuzzy permutations)
+# 
+# Meaning: Block 'Yijing Hexagram Symbols'
+#
+return <<'END';
+4DC0	4DFF	Yijing Hexagram Symbols
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/JoinC.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/JoinC.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/JoinC.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Join_Control'
+#
+return <<'END';
+200C	200D	Join_Control
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/JoinCont.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/JoinCont.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/JoinCont.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{JoinControl} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Join_Control'
+#
+return <<'END';
+200C	200D	Join_Control
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Kana.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Kana.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Kana.pl	(revision 14489)
@@ -0,0 +1,17 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Katakana} (and fuzzy permutations)
+# 
+# Meaning: Script 'Katakana'
+#
+return <<'END';
+30A1	30FA	Katakana
+30FD	30FF	Katakana
+31F0	31FF	Katakana
+FF66	FF6F	Katakana
+FF71	FF9D	Katakana
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Khar.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Khar.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Khar.pl	(revision 14489)
@@ -0,0 +1,20 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Kharoshthi} (and fuzzy permutations)
+# 
+# Meaning: Script 'Kharoshthi'
+#
+return <<'END';
+10A00	10A03	Kharoshthi
+10A05	10A06	Kharoshthi
+10A0C	10A13	Kharoshthi
+10A15	10A17	Kharoshthi
+10A19	10A33	Kharoshthi
+10A38	10A3A	Kharoshthi
+10A3F	10A47	Kharoshthi
+10A50	10A58	Kharoshthi
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Khmr.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Khmr.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Khmr.pl	(revision 14489)
@@ -0,0 +1,16 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Khmer} (and fuzzy permutations)
+# 
+# Meaning: Script 'Khmer'
+#
+return <<'END';
+1780	17DD	Khmer
+17E0	17E9	Khmer
+17F0	17F9	Khmer
+19E0	19FF	Khmer
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Knda.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Knda.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Knda.pl	(revision 14489)
@@ -0,0 +1,25 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Kannada} (and fuzzy permutations)
+# 
+# Meaning: Script 'Kannada'
+#
+return <<'END';
+0C82	0C83	Kannada
+0C85	0C8C	Kannada
+0C8E	0C90	Kannada
+0C92	0CA8	Kannada
+0CAA	0CB3	Kannada
+0CB5	0CB9	Kannada
+0CBC	0CC4	Kannada
+0CC6	0CC8	Kannada
+0CCA	0CCD	Kannada
+0CD5	0CD6	Kannada
+0CDE		Kannada
+0CE0	0CE1	Kannada
+0CE6	0CEF	Kannada
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/L.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/L.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/L.pl	(revision 14489)
@@ -0,0 +1,360 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{L}
+# 	\p{L} (and fuzzy permutations)
+# 
+# Meaning: Major Category 'L'
+#
+return <<'END';
+0041	005A	
+0061	007A	
+00AA		
+00B5		
+00BA		
+00C0	00D6	
+00D8	00F6	
+00F8	0241	
+0250	02C1	
+02C6	02D1	
+02E0	02E4	
+02EE		
+037A		
+0386		
+0388	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	03F5	
+03F7	0481	
+048A	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559		
+0561	0587	
+05D0	05EA	
+05F0	05F2	
+0621	063A	
+0640	064A	
+066E	066F	
+0671	06D3	
+06D5		
+06E5	06E6	
+06EE	06EF	
+06FA	06FC	
+06FF		
+0710		
+0712	072F	
+074D	076D	
+0780	07A5	
+07B1		
+0904	0939	
+093D		
+0950		
+0958	0961	
+097D		
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BD		
+09CE		
+09DC	09DD	
+09DF	09E1	
+09F0	09F1	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A59	0A5C	
+0A5E		
+0A72	0A74	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABD		
+0AD0		
+0AE0	0AE1	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3D		
+0B5C	0B5D	
+0B5F	0B61	
+0B71		
+0B83		
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C60	0C61	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBD		
+0CDE		
+0CE0	0CE1	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D60	0D61	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0E01	0E30	
+0E32	0E33	
+0E40	0E46	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB0	
+0EB2	0EB3	
+0EBD		
+0EC0	0EC4	
+0EC6		
+0EDC	0EDD	
+0F00		
+0F40	0F47	
+0F49	0F6A	
+0F88	0F8B	
+1000	1021	
+1023	1027	
+1029	102A	
+1050	1055	
+10A0	10C5	
+10D0	10FA	
+10FC		
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+1380	138F	
+13A0	13F4	
+1401	166C	
+166F	1676	
+1681	169A	
+16A0	16EA	
+1700	170C	
+170E	1711	
+1720	1731	
+1740	1751	
+1760	176C	
+176E	1770	
+1780	17B3	
+17D7		
+17DC		
+1820	1877	
+1880	18A8	
+1900	191C	
+1950	196D	
+1970	1974	
+1980	19A9	
+19C1	19C7	
+1A00	1A16	
+1D00	1DBF	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FBC	
+1FBE		
+1FC2	1FC4	
+1FC6	1FCC	
+1FD0	1FD3	
+1FD6	1FDB	
+1FE0	1FEC	
+1FF2	1FF4	
+1FF6	1FFC	
+2071		
+207F		
+2090	2094	
+2102		
+2107		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+212F	2131	
+2133	2139	
+213C	213F	
+2145	2149	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CE4	
+2D00	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+3005	3006	
+3031	3035	
+303B	303C	
+3041	3096	
+309D	309F	
+30A1	30FA	
+30FC	30FF	
+3105	312C	
+3131	318E	
+31A0	31B7	
+31F0	31FF	
+3400	4DB5	
+4E00	9FBB	
+A000	A48C	
+A800	A801	
+A803	A805	
+A807	A80A	
+A80C	A822	
+AC00	D7A3	
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FB1D		
+FB1F	FB28	
+FB2A	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFB	
+FE70	FE74	
+FE76	FEFC	
+FF21	FF3A	
+FF41	FF5A	
+FF66	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10300	1031E	
+10330	10349	
+10380	1039D	
+103A0	103C3	
+103C8	103CF	
+10400	1049D	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00		
+10A10	10A13	
+10A15	10A17	
+10A19	10A33	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D6C0	
+1D6C2	1D6DA	
+1D6DC	1D6FA	
+1D6FC	1D714	
+1D716	1D734	
+1D736	1D74E	
+1D750	1D76E	
+1D770	1D788	
+1D78A	1D7A8	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+20000	2A6D6	
+2F800	2FA1D	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LC.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LC.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LC.pl	(revision 14489)
@@ -0,0 +1,116 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{LC}
+# 	\p{LC} (and fuzzy permutations)
+# 
+# Meaning: [\p{Ll}\p{Lu}\p{Lt}]
+#
+return <<'END';
+0041	005A	
+0061	007A	
+00AA		
+00B5		
+00BA		
+00C0	00D6	
+00D8	00F6	
+00F8	01BA	
+01BC	01BF	
+01C4	0241	
+0250	02AF	
+0386		
+0388	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	03F5	
+03F7	0481	
+048A	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0561	0587	
+10A0	10C5	
+1D00	1D2B	
+1D62	1D77	
+1D79	1D9A	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FBC	
+1FBE		
+1FC2	1FC4	
+1FC6	1FCC	
+1FD0	1FD3	
+1FD6	1FDB	
+1FE0	1FEC	
+1FF2	1FF4	
+1FF6	1FFC	
+2071		
+207F		
+2102		
+2107		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+212F	2131	
+2133	2134	
+2139		
+213C	213F	
+2145	2149	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CE4	
+2D00	2D25	
+FB00	FB06	
+FB13	FB17	
+FF21	FF3A	
+FF41	FF5A	
+10400	1044F	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D6C0	
+1D6C2	1D6DA	
+1D6DC	1D6FA	
+1D6FC	1D714	
+1D716	1D734	
+1D736	1D74E	
+1D750	1D76E	
+1D770	1D788	
+1D78A	1D7A8	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LOE.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LOE.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LOE.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Logical_Order_Exception'
+#
+return <<'END';
+0E40	0E44	Logical_Order_Exception
+0EC0	0EC4	Logical_Order_Exception
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Laoo.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Laoo.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Laoo.pl	(revision 14489)
@@ -0,0 +1,30 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Lao} (and fuzzy permutations)
+# 
+# Meaning: Script 'Lao'
+#
+return <<'END';
+0E81	0E82	Lao
+0E84		Lao
+0E87	0E88	Lao
+0E8A		Lao
+0E8D		Lao
+0E94	0E97	Lao
+0E99	0E9F	Lao
+0EA1	0EA3	Lao
+0EA5		Lao
+0EA7		Lao
+0EAA	0EAB	Lao
+0EAD	0EB9	Lao
+0EBB	0EBD	Lao
+0EC0	0EC4	Lao
+0EC6		Lao
+0EC8	0ECD	Lao
+0ED0	0ED9	Lao
+0EDC	0EDD	Lao
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Latn.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Latn.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Latn.pl	(revision 14489)
@@ -0,0 +1,35 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Latin} (and fuzzy permutations)
+# 
+# Meaning: Script 'Latin'
+#
+return <<'END';
+0041	005A	Latin
+0061	007A	Latin
+00AA		Latin
+00BA		Latin
+00C0	00D6	Latin
+00D8	00F6	Latin
+00F8	0241	Latin
+0250	02B8	Latin
+02E0	02E4	Latin
+1D00	1D25	Latin
+1D2C	1D5C	Latin
+1D62	1D65	Latin
+1D6B	1D77	Latin
+1D79	1DBF	Latin
+1E00	1E9B	Latin
+1EA0	1EF9	Latin
+2071		Latin
+207F		Latin
+2090	2094	Latin
+212A	212B	Latin
+FB00	FB06	Latin
+FF21	FF3A	Latin
+FF41	FF5A	Latin
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Limb.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Limb.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Limb.pl	(revision 14489)
@@ -0,0 +1,17 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Limbu} (and fuzzy permutations)
+# 
+# Meaning: Script 'Limbu'
+#
+return <<'END';
+1900	191C	Limbu
+1920	192B	Limbu
+1930	193B	Limbu
+1940		Limbu
+1944	194F	Limbu
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LinearB.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LinearB.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LinearB.pl	(revision 14489)
@@ -0,0 +1,19 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{LinearB} (and fuzzy permutations)
+# 
+# Meaning: Script 'Linear_B'
+#
+return <<'END';
+10000	1000B	Linear_B
+1000D	10026	Linear_B
+10028	1003A	Linear_B
+1003C	1003D	Linear_B
+1003F	1004D	Linear_B
+10050	1005D	Linear_B
+10080	100FA	Linear_B
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ll.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ll.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ll.pl	(revision 14489)
@@ -0,0 +1,493 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Ll}
+# 	\p{Ll} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Ll'
+#
+return <<'END';
+0061	007A	
+00AA		
+00B5		
+00BA		
+00DF	00F6	
+00F8	00FF	
+0101		
+0103		
+0105		
+0107		
+0109		
+010B		
+010D		
+010F		
+0111		
+0113		
+0115		
+0117		
+0119		
+011B		
+011D		
+011F		
+0121		
+0123		
+0125		
+0127		
+0129		
+012B		
+012D		
+012F		
+0131		
+0133		
+0135		
+0137	0138	
+013A		
+013C		
+013E		
+0140		
+0142		
+0144		
+0146		
+0148	0149	
+014B		
+014D		
+014F		
+0151		
+0153		
+0155		
+0157		
+0159		
+015B		
+015D		
+015F		
+0161		
+0163		
+0165		
+0167		
+0169		
+016B		
+016D		
+016F		
+0171		
+0173		
+0175		
+0177		
+017A		
+017C		
+017E	0180	
+0183		
+0185		
+0188		
+018C	018D	
+0192		
+0195		
+0199	019B	
+019E		
+01A1		
+01A3		
+01A5		
+01A8		
+01AA	01AB	
+01AD		
+01B0		
+01B4		
+01B6		
+01B9	01BA	
+01BD	01BF	
+01C6		
+01C9		
+01CC		
+01CE		
+01D0		
+01D2		
+01D4		
+01D6		
+01D8		
+01DA		
+01DC	01DD	
+01DF		
+01E1		
+01E3		
+01E5		
+01E7		
+01E9		
+01EB		
+01ED		
+01EF	01F0	
+01F3		
+01F5		
+01F9		
+01FB		
+01FD		
+01FF		
+0201		
+0203		
+0205		
+0207		
+0209		
+020B		
+020D		
+020F		
+0211		
+0213		
+0215		
+0217		
+0219		
+021B		
+021D		
+021F		
+0221		
+0223		
+0225		
+0227		
+0229		
+022B		
+022D		
+022F		
+0231		
+0233	0239	
+023C		
+023F	0240	
+0250	02AF	
+0390		
+03AC	03CE	
+03D0	03D1	
+03D5	03D7	
+03D9		
+03DB		
+03DD		
+03DF		
+03E1		
+03E3		
+03E5		
+03E7		
+03E9		
+03EB		
+03ED		
+03EF	03F3	
+03F5		
+03F8		
+03FB	03FC	
+0430	045F	
+0461		
+0463		
+0465		
+0467		
+0469		
+046B		
+046D		
+046F		
+0471		
+0473		
+0475		
+0477		
+0479		
+047B		
+047D		
+047F		
+0481		
+048B		
+048D		
+048F		
+0491		
+0493		
+0495		
+0497		
+0499		
+049B		
+049D		
+049F		
+04A1		
+04A3		
+04A5		
+04A7		
+04A9		
+04AB		
+04AD		
+04AF		
+04B1		
+04B3		
+04B5		
+04B7		
+04B9		
+04BB		
+04BD		
+04BF		
+04C2		
+04C4		
+04C6		
+04C8		
+04CA		
+04CC		
+04CE		
+04D1		
+04D3		
+04D5		
+04D7		
+04D9		
+04DB		
+04DD		
+04DF		
+04E1		
+04E3		
+04E5		
+04E7		
+04E9		
+04EB		
+04ED		
+04EF		
+04F1		
+04F3		
+04F5		
+04F7		
+04F9		
+0501		
+0503		
+0505		
+0507		
+0509		
+050B		
+050D		
+050F		
+0561	0587	
+1D00	1D2B	
+1D62	1D77	
+1D79	1D9A	
+1E01		
+1E03		
+1E05		
+1E07		
+1E09		
+1E0B		
+1E0D		
+1E0F		
+1E11		
+1E13		
+1E15		
+1E17		
+1E19		
+1E1B		
+1E1D		
+1E1F		
+1E21		
+1E23		
+1E25		
+1E27		
+1E29		
+1E2B		
+1E2D		
+1E2F		
+1E31		
+1E33		
+1E35		
+1E37		
+1E39		
+1E3B		
+1E3D		
+1E3F		
+1E41		
+1E43		
+1E45		
+1E47		
+1E49		
+1E4B		
+1E4D		
+1E4F		
+1E51		
+1E53		
+1E55		
+1E57		
+1E59		
+1E5B		
+1E5D		
+1E5F		
+1E61		
+1E63		
+1E65		
+1E67		
+1E69		
+1E6B		
+1E6D		
+1E6F		
+1E71		
+1E73		
+1E75		
+1E77		
+1E79		
+1E7B		
+1E7D		
+1E7F		
+1E81		
+1E83		
+1E85		
+1E87		
+1E89		
+1E8B		
+1E8D		
+1E8F		
+1E91		
+1E93		
+1E95	1E9B	
+1EA1		
+1EA3		
+1EA5		
+1EA7		
+1EA9		
+1EAB		
+1EAD		
+1EAF		
+1EB1		
+1EB3		
+1EB5		
+1EB7		
+1EB9		
+1EBB		
+1EBD		
+1EBF		
+1EC1		
+1EC3		
+1EC5		
+1EC7		
+1EC9		
+1ECB		
+1ECD		
+1ECF		
+1ED1		
+1ED3		
+1ED5		
+1ED7		
+1ED9		
+1EDB		
+1EDD		
+1EDF		
+1EE1		
+1EE3		
+1EE5		
+1EE7		
+1EE9		
+1EEB		
+1EED		
+1EEF		
+1EF1		
+1EF3		
+1EF5		
+1EF7		
+1EF9		
+1F00	1F07	
+1F10	1F15	
+1F20	1F27	
+1F30	1F37	
+1F40	1F45	
+1F50	1F57	
+1F60	1F67	
+1F70	1F7D	
+1F80	1F87	
+1F90	1F97	
+1FA0	1FA7	
+1FB0	1FB4	
+1FB6	1FB7	
+1FBE		
+1FC2	1FC4	
+1FC6	1FC7	
+1FD0	1FD3	
+1FD6	1FD7	
+1FE0	1FE7	
+1FF2	1FF4	
+1FF6	1FF7	
+2071		
+207F		
+210A		
+210E	210F	
+2113		
+212F		
+2134		
+2139		
+213C	213D	
+2146	2149	
+2C30	2C5E	
+2C81		
+2C83		
+2C85		
+2C87		
+2C89		
+2C8B		
+2C8D		
+2C8F		
+2C91		
+2C93		
+2C95		
+2C97		
+2C99		
+2C9B		
+2C9D		
+2C9F		
+2CA1		
+2CA3		
+2CA5		
+2CA7		
+2CA9		
+2CAB		
+2CAD		
+2CAF		
+2CB1		
+2CB3		
+2CB5		
+2CB7		
+2CB9		
+2CBB		
+2CBD		
+2CBF		
+2CC1		
+2CC3		
+2CC5		
+2CC7		
+2CC9		
+2CCB		
+2CCD		
+2CCF		
+2CD1		
+2CD3		
+2CD5		
+2CD7		
+2CD9		
+2CDB		
+2CDD		
+2CDF		
+2CE1		
+2CE3	2CE4	
+2D00	2D25	
+FB00	FB06	
+FB13	FB17	
+FF41	FF5A	
+10428	1044F	
+1D41A	1D433	
+1D44E	1D454	
+1D456	1D467	
+1D482	1D49B	
+1D4B6	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D4CF	
+1D4EA	1D503	
+1D51E	1D537	
+1D552	1D56B	
+1D586	1D59F	
+1D5BA	1D5D3	
+1D5EE	1D607	
+1D622	1D63B	
+1D656	1D66F	
+1D68A	1D6A5	
+1D6C2	1D6DA	
+1D6DC	1D6E1	
+1D6FC	1D714	
+1D716	1D71B	
+1D736	1D74E	
+1D750	1D755	
+1D770	1D788	
+1D78A	1D78F	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lm.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lm.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lm.pl	(revision 14489)
@@ -0,0 +1,39 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Lm}
+# 	\p{Lm} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Lm'
+#
+return <<'END';
+02B0	02C1	
+02C6	02D1	
+02E0	02E4	
+02EE		
+037A		
+0559		
+0640		
+06E5	06E6	
+0E46		
+0EC6		
+10FC		
+17D7		
+1843		
+1D2C	1D61	
+1D78		
+1D9B	1DBF	
+2090	2094	
+2D6F		
+3005		
+3031	3035	
+303B		
+309D	309E	
+30FC	30FE	
+A015		
+FF70		
+FF9E	FF9F	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lo.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lo.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lo.pl	(revision 14489)
@@ -0,0 +1,258 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Lo}
+# 	\p{Lo} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Lo'
+#
+return <<'END';
+01BB		
+01C0	01C3	
+05D0	05EA	
+05F0	05F2	
+0621	063A	
+0641	064A	
+066E	066F	
+0671	06D3	
+06D5		
+06EE	06EF	
+06FA	06FC	
+06FF		
+0710		
+0712	072F	
+074D	076D	
+0780	07A5	
+07B1		
+0904	0939	
+093D		
+0950		
+0958	0961	
+097D		
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BD		
+09CE		
+09DC	09DD	
+09DF	09E1	
+09F0	09F1	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A59	0A5C	
+0A5E		
+0A72	0A74	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABD		
+0AD0		
+0AE0	0AE1	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3D		
+0B5C	0B5D	
+0B5F	0B61	
+0B71		
+0B83		
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C60	0C61	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBD		
+0CDE		
+0CE0	0CE1	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D60	0D61	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0E01	0E30	
+0E32	0E33	
+0E40	0E45	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB0	
+0EB2	0EB3	
+0EBD		
+0EC0	0EC4	
+0EDC	0EDD	
+0F00		
+0F40	0F47	
+0F49	0F6A	
+0F88	0F8B	
+1000	1021	
+1023	1027	
+1029	102A	
+1050	1055	
+10D0	10FA	
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+1380	138F	
+13A0	13F4	
+1401	166C	
+166F	1676	
+1681	169A	
+16A0	16EA	
+1700	170C	
+170E	1711	
+1720	1731	
+1740	1751	
+1760	176C	
+176E	1770	
+1780	17B3	
+17DC		
+1820	1842	
+1844	1877	
+1880	18A8	
+1900	191C	
+1950	196D	
+1970	1974	
+1980	19A9	
+19C1	19C7	
+1A00	1A16	
+2135	2138	
+2D30	2D65	
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+3006		
+303C		
+3041	3096	
+309F		
+30A1	30FA	
+30FF		
+3105	312C	
+3131	318E	
+31A0	31B7	
+31F0	31FF	
+3400	4DB5	
+4E00	9FBB	
+A000	A014	
+A016	A48C	
+A800	A801	
+A803	A805	
+A807	A80A	
+A80C	A822	
+AC00	D7A3	
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB1D		
+FB1F	FB28	
+FB2A	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFB	
+FE70	FE74	
+FE76	FEFC	
+FF66	FF6F	
+FF71	FF9D	
+FFA0	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10300	1031E	
+10330	10349	
+10380	1039D	
+103A0	103C3	
+103C8	103CF	
+10450	1049D	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00		
+10A10	10A13	
+10A15	10A17	
+10A19	10A33	
+20000	2A6D6	
+2F800	2FA1D	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LogicalO.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LogicalO.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/LogicalO.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{LogicalOrderException} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Logical_Order_Exception'
+#
+return <<'END';
+0E40	0E44	Logical_Order_Exception
+0EC0	0EC4	Logical_Order_Exception
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lower.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lower.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lower.pl	(revision 14489)
@@ -0,0 +1,492 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Lower}
+# 
+# Meaning: [[:Lower:]]
+#
+return <<'END';
+0061	007A	
+00AA		
+00B5		
+00BA		
+00DF	00F6	
+00F8	00FF	
+0101		
+0103		
+0105		
+0107		
+0109		
+010B		
+010D		
+010F		
+0111		
+0113		
+0115		
+0117		
+0119		
+011B		
+011D		
+011F		
+0121		
+0123		
+0125		
+0127		
+0129		
+012B		
+012D		
+012F		
+0131		
+0133		
+0135		
+0137	0138	
+013A		
+013C		
+013E		
+0140		
+0142		
+0144		
+0146		
+0148	0149	
+014B		
+014D		
+014F		
+0151		
+0153		
+0155		
+0157		
+0159		
+015B		
+015D		
+015F		
+0161		
+0163		
+0165		
+0167		
+0169		
+016B		
+016D		
+016F		
+0171		
+0173		
+0175		
+0177		
+017A		
+017C		
+017E	0180	
+0183		
+0185		
+0188		
+018C	018D	
+0192		
+0195		
+0199	019B	
+019E		
+01A1		
+01A3		
+01A5		
+01A8		
+01AA	01AB	
+01AD		
+01B0		
+01B4		
+01B6		
+01B9	01BA	
+01BD	01BF	
+01C6		
+01C9		
+01CC		
+01CE		
+01D0		
+01D2		
+01D4		
+01D6		
+01D8		
+01DA		
+01DC	01DD	
+01DF		
+01E1		
+01E3		
+01E5		
+01E7		
+01E9		
+01EB		
+01ED		
+01EF	01F0	
+01F3		
+01F5		
+01F9		
+01FB		
+01FD		
+01FF		
+0201		
+0203		
+0205		
+0207		
+0209		
+020B		
+020D		
+020F		
+0211		
+0213		
+0215		
+0217		
+0219		
+021B		
+021D		
+021F		
+0221		
+0223		
+0225		
+0227		
+0229		
+022B		
+022D		
+022F		
+0231		
+0233	0239	
+023C		
+023F	0240	
+0250	02AF	
+0390		
+03AC	03CE	
+03D0	03D1	
+03D5	03D7	
+03D9		
+03DB		
+03DD		
+03DF		
+03E1		
+03E3		
+03E5		
+03E7		
+03E9		
+03EB		
+03ED		
+03EF	03F3	
+03F5		
+03F8		
+03FB	03FC	
+0430	045F	
+0461		
+0463		
+0465		
+0467		
+0469		
+046B		
+046D		
+046F		
+0471		
+0473		
+0475		
+0477		
+0479		
+047B		
+047D		
+047F		
+0481		
+048B		
+048D		
+048F		
+0491		
+0493		
+0495		
+0497		
+0499		
+049B		
+049D		
+049F		
+04A1		
+04A3		
+04A5		
+04A7		
+04A9		
+04AB		
+04AD		
+04AF		
+04B1		
+04B3		
+04B5		
+04B7		
+04B9		
+04BB		
+04BD		
+04BF		
+04C2		
+04C4		
+04C6		
+04C8		
+04CA		
+04CC		
+04CE		
+04D1		
+04D3		
+04D5		
+04D7		
+04D9		
+04DB		
+04DD		
+04DF		
+04E1		
+04E3		
+04E5		
+04E7		
+04E9		
+04EB		
+04ED		
+04EF		
+04F1		
+04F3		
+04F5		
+04F7		
+04F9		
+0501		
+0503		
+0505		
+0507		
+0509		
+050B		
+050D		
+050F		
+0561	0587	
+1D00	1D2B	
+1D62	1D77	
+1D79	1D9A	
+1E01		
+1E03		
+1E05		
+1E07		
+1E09		
+1E0B		
+1E0D		
+1E0F		
+1E11		
+1E13		
+1E15		
+1E17		
+1E19		
+1E1B		
+1E1D		
+1E1F		
+1E21		
+1E23		
+1E25		
+1E27		
+1E29		
+1E2B		
+1E2D		
+1E2F		
+1E31		
+1E33		
+1E35		
+1E37		
+1E39		
+1E3B		
+1E3D		
+1E3F		
+1E41		
+1E43		
+1E45		
+1E47		
+1E49		
+1E4B		
+1E4D		
+1E4F		
+1E51		
+1E53		
+1E55		
+1E57		
+1E59		
+1E5B		
+1E5D		
+1E5F		
+1E61		
+1E63		
+1E65		
+1E67		
+1E69		
+1E6B		
+1E6D		
+1E6F		
+1E71		
+1E73		
+1E75		
+1E77		
+1E79		
+1E7B		
+1E7D		
+1E7F		
+1E81		
+1E83		
+1E85		
+1E87		
+1E89		
+1E8B		
+1E8D		
+1E8F		
+1E91		
+1E93		
+1E95	1E9B	
+1EA1		
+1EA3		
+1EA5		
+1EA7		
+1EA9		
+1EAB		
+1EAD		
+1EAF		
+1EB1		
+1EB3		
+1EB5		
+1EB7		
+1EB9		
+1EBB		
+1EBD		
+1EBF		
+1EC1		
+1EC3		
+1EC5		
+1EC7		
+1EC9		
+1ECB		
+1ECD		
+1ECF		
+1ED1		
+1ED3		
+1ED5		
+1ED7		
+1ED9		
+1EDB		
+1EDD		
+1EDF		
+1EE1		
+1EE3		
+1EE5		
+1EE7		
+1EE9		
+1EEB		
+1EED		
+1EEF		
+1EF1		
+1EF3		
+1EF5		
+1EF7		
+1EF9		
+1F00	1F07	
+1F10	1F15	
+1F20	1F27	
+1F30	1F37	
+1F40	1F45	
+1F50	1F57	
+1F60	1F67	
+1F70	1F7D	
+1F80	1F87	
+1F90	1F97	
+1FA0	1FA7	
+1FB0	1FB4	
+1FB6	1FB7	
+1FBE		
+1FC2	1FC4	
+1FC6	1FC7	
+1FD0	1FD3	
+1FD6	1FD7	
+1FE0	1FE7	
+1FF2	1FF4	
+1FF6	1FF7	
+2071		
+207F		
+210A		
+210E	210F	
+2113		
+212F		
+2134		
+2139		
+213C	213D	
+2146	2149	
+2C30	2C5E	
+2C81		
+2C83		
+2C85		
+2C87		
+2C89		
+2C8B		
+2C8D		
+2C8F		
+2C91		
+2C93		
+2C95		
+2C97		
+2C99		
+2C9B		
+2C9D		
+2C9F		
+2CA1		
+2CA3		
+2CA5		
+2CA7		
+2CA9		
+2CAB		
+2CAD		
+2CAF		
+2CB1		
+2CB3		
+2CB5		
+2CB7		
+2CB9		
+2CBB		
+2CBD		
+2CBF		
+2CC1		
+2CC3		
+2CC5		
+2CC7		
+2CC9		
+2CCB		
+2CCD		
+2CCF		
+2CD1		
+2CD3		
+2CD5		
+2CD7		
+2CD9		
+2CDB		
+2CDD		
+2CDF		
+2CE1		
+2CE3	2CE4	
+2D00	2D25	
+FB00	FB06	
+FB13	FB17	
+FF41	FF5A	
+10428	1044F	
+1D41A	1D433	
+1D44E	1D454	
+1D456	1D467	
+1D482	1D49B	
+1D4B6	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D4CF	
+1D4EA	1D503	
+1D51E	1D537	
+1D552	1D56B	
+1D586	1D59F	
+1D5BA	1D5D3	
+1D5EE	1D607	
+1D622	1D63B	
+1D656	1D66F	
+1D68A	1D6A5	
+1D6C2	1D6DA	
+1D6DC	1D6E1	
+1D6FC	1D714	
+1D716	1D71B	
+1D736	1D74E	
+1D750	1D755	
+1D770	1D788	
+1D78A	1D78F	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lowercas.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lowercas.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lowercas.pl	(revision 14489)
@@ -0,0 +1,497 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Lowercase} (and fuzzy permutations)
+# 
+# Meaning: [\p{Ll}\p{OtherLowercase}]
+#
+return <<'END';
+0061	007A	
+00AA		
+00B5		
+00BA		
+00DF	00F6	
+00F8	00FF	
+0101		
+0103		
+0105		
+0107		
+0109		
+010B		
+010D		
+010F		
+0111		
+0113		
+0115		
+0117		
+0119		
+011B		
+011D		
+011F		
+0121		
+0123		
+0125		
+0127		
+0129		
+012B		
+012D		
+012F		
+0131		
+0133		
+0135		
+0137	0138	
+013A		
+013C		
+013E		
+0140		
+0142		
+0144		
+0146		
+0148	0149	
+014B		
+014D		
+014F		
+0151		
+0153		
+0155		
+0157		
+0159		
+015B		
+015D		
+015F		
+0161		
+0163		
+0165		
+0167		
+0169		
+016B		
+016D		
+016F		
+0171		
+0173		
+0175		
+0177		
+017A		
+017C		
+017E	0180	
+0183		
+0185		
+0188		
+018C	018D	
+0192		
+0195		
+0199	019B	
+019E		
+01A1		
+01A3		
+01A5		
+01A8		
+01AA	01AB	
+01AD		
+01B0		
+01B4		
+01B6		
+01B9	01BA	
+01BD	01BF	
+01C6		
+01C9		
+01CC		
+01CE		
+01D0		
+01D2		
+01D4		
+01D6		
+01D8		
+01DA		
+01DC	01DD	
+01DF		
+01E1		
+01E3		
+01E5		
+01E7		
+01E9		
+01EB		
+01ED		
+01EF	01F0	
+01F3		
+01F5		
+01F9		
+01FB		
+01FD		
+01FF		
+0201		
+0203		
+0205		
+0207		
+0209		
+020B		
+020D		
+020F		
+0211		
+0213		
+0215		
+0217		
+0219		
+021B		
+021D		
+021F		
+0221		
+0223		
+0225		
+0227		
+0229		
+022B		
+022D		
+022F		
+0231		
+0233	0239	
+023C		
+023F	0240	
+0250	02B8	
+02C0	02C1	
+02E0	02E4	
+0345		
+037A		
+0390		
+03AC	03CE	
+03D0	03D1	
+03D5	03D7	
+03D9		
+03DB		
+03DD		
+03DF		
+03E1		
+03E3		
+03E5		
+03E7		
+03E9		
+03EB		
+03ED		
+03EF	03F3	
+03F5		
+03F8		
+03FB	03FC	
+0430	045F	
+0461		
+0463		
+0465		
+0467		
+0469		
+046B		
+046D		
+046F		
+0471		
+0473		
+0475		
+0477		
+0479		
+047B		
+047D		
+047F		
+0481		
+048B		
+048D		
+048F		
+0491		
+0493		
+0495		
+0497		
+0499		
+049B		
+049D		
+049F		
+04A1		
+04A3		
+04A5		
+04A7		
+04A9		
+04AB		
+04AD		
+04AF		
+04B1		
+04B3		
+04B5		
+04B7		
+04B9		
+04BB		
+04BD		
+04BF		
+04C2		
+04C4		
+04C6		
+04C8		
+04CA		
+04CC		
+04CE		
+04D1		
+04D3		
+04D5		
+04D7		
+04D9		
+04DB		
+04DD		
+04DF		
+04E1		
+04E3		
+04E5		
+04E7		
+04E9		
+04EB		
+04ED		
+04EF		
+04F1		
+04F3		
+04F5		
+04F7		
+04F9		
+0501		
+0503		
+0505		
+0507		
+0509		
+050B		
+050D		
+050F		
+0561	0587	
+1D00	1DBF	
+1E01		
+1E03		
+1E05		
+1E07		
+1E09		
+1E0B		
+1E0D		
+1E0F		
+1E11		
+1E13		
+1E15		
+1E17		
+1E19		
+1E1B		
+1E1D		
+1E1F		
+1E21		
+1E23		
+1E25		
+1E27		
+1E29		
+1E2B		
+1E2D		
+1E2F		
+1E31		
+1E33		
+1E35		
+1E37		
+1E39		
+1E3B		
+1E3D		
+1E3F		
+1E41		
+1E43		
+1E45		
+1E47		
+1E49		
+1E4B		
+1E4D		
+1E4F		
+1E51		
+1E53		
+1E55		
+1E57		
+1E59		
+1E5B		
+1E5D		
+1E5F		
+1E61		
+1E63		
+1E65		
+1E67		
+1E69		
+1E6B		
+1E6D		
+1E6F		
+1E71		
+1E73		
+1E75		
+1E77		
+1E79		
+1E7B		
+1E7D		
+1E7F		
+1E81		
+1E83		
+1E85		
+1E87		
+1E89		
+1E8B		
+1E8D		
+1E8F		
+1E91		
+1E93		
+1E95	1E9B	
+1EA1		
+1EA3		
+1EA5		
+1EA7		
+1EA9		
+1EAB		
+1EAD		
+1EAF		
+1EB1		
+1EB3		
+1EB5		
+1EB7		
+1EB9		
+1EBB		
+1EBD		
+1EBF		
+1EC1		
+1EC3		
+1EC5		
+1EC7		
+1EC9		
+1ECB		
+1ECD		
+1ECF		
+1ED1		
+1ED3		
+1ED5		
+1ED7		
+1ED9		
+1EDB		
+1EDD		
+1EDF		
+1EE1		
+1EE3		
+1EE5		
+1EE7		
+1EE9		
+1EEB		
+1EED		
+1EEF		
+1EF1		
+1EF3		
+1EF5		
+1EF7		
+1EF9		
+1F00	1F07	
+1F10	1F15	
+1F20	1F27	
+1F30	1F37	
+1F40	1F45	
+1F50	1F57	
+1F60	1F67	
+1F70	1F7D	
+1F80	1F87	
+1F90	1F97	
+1FA0	1FA7	
+1FB0	1FB4	
+1FB6	1FB7	
+1FBE		
+1FC2	1FC4	
+1FC6	1FC7	
+1FD0	1FD3	
+1FD6	1FD7	
+1FE0	1FE7	
+1FF2	1FF4	
+1FF6	1FF7	
+2071		
+207F		
+2090	2094	
+210A		
+210E	210F	
+2113		
+212F		
+2134		
+2139		
+213C	213D	
+2146	2149	
+2170	217F	
+24D0	24E9	
+2C30	2C5E	
+2C81		
+2C83		
+2C85		
+2C87		
+2C89		
+2C8B		
+2C8D		
+2C8F		
+2C91		
+2C93		
+2C95		
+2C97		
+2C99		
+2C9B		
+2C9D		
+2C9F		
+2CA1		
+2CA3		
+2CA5		
+2CA7		
+2CA9		
+2CAB		
+2CAD		
+2CAF		
+2CB1		
+2CB3		
+2CB5		
+2CB7		
+2CB9		
+2CBB		
+2CBD		
+2CBF		
+2CC1		
+2CC3		
+2CC5		
+2CC7		
+2CC9		
+2CCB		
+2CCD		
+2CCF		
+2CD1		
+2CD3		
+2CD5		
+2CD7		
+2CD9		
+2CDB		
+2CDD		
+2CDF		
+2CE1		
+2CE3	2CE4	
+2D00	2D25	
+FB00	FB06	
+FB13	FB17	
+FF41	FF5A	
+10428	1044F	
+1D41A	1D433	
+1D44E	1D454	
+1D456	1D467	
+1D482	1D49B	
+1D4B6	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D4CF	
+1D4EA	1D503	
+1D51E	1D537	
+1D552	1D56B	
+1D586	1D59F	
+1D5BA	1D5D3	
+1D5EE	1D607	
+1D622	1D63B	
+1D656	1D66F	
+1D68A	1D6A5	
+1D6C2	1D6DA	
+1D6DC	1D6E1	
+1D6FC	1D714	
+1D716	1D71B	
+1D736	1D74E	
+1D750	1D755	
+1D770	1D788	
+1D78A	1D78F	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lt.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lt.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lt.pl	(revision 14489)
@@ -0,0 +1,23 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Lt}
+# 	\p{Lt} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Lt'
+#
+return <<'END';
+01C5		
+01C8		
+01CB		
+01F2		
+1F88	1F8F	
+1F98	1F9F	
+1FA8	1FAF	
+1FBC		
+1FCC		
+1FFC		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lu.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lu.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Lu.pl	(revision 14489)
@@ -0,0 +1,489 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Lu}
+# 	\p{Lu} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Lu'
+#
+return <<'END';
+0041	005A	
+00C0	00D6	
+00D8	00DE	
+0100		
+0102		
+0104		
+0106		
+0108		
+010A		
+010C		
+010E		
+0110		
+0112		
+0114		
+0116		
+0118		
+011A		
+011C		
+011E		
+0120		
+0122		
+0124		
+0126		
+0128		
+012A		
+012C		
+012E		
+0130		
+0132		
+0134		
+0136		
+0139		
+013B		
+013D		
+013F		
+0141		
+0143		
+0145		
+0147		
+014A		
+014C		
+014E		
+0150		
+0152		
+0154		
+0156		
+0158		
+015A		
+015C		
+015E		
+0160		
+0162		
+0164		
+0166		
+0168		
+016A		
+016C		
+016E		
+0170		
+0172		
+0174		
+0176		
+0178	0179	
+017B		
+017D		
+0181	0182	
+0184		
+0186	0187	
+0189	018B	
+018E	0191	
+0193	0194	
+0196	0198	
+019C	019D	
+019F	01A0	
+01A2		
+01A4		
+01A6	01A7	
+01A9		
+01AC		
+01AE	01AF	
+01B1	01B3	
+01B5		
+01B7	01B8	
+01BC		
+01C4		
+01C7		
+01CA		
+01CD		
+01CF		
+01D1		
+01D3		
+01D5		
+01D7		
+01D9		
+01DB		
+01DE		
+01E0		
+01E2		
+01E4		
+01E6		
+01E8		
+01EA		
+01EC		
+01EE		
+01F1		
+01F4		
+01F6	01F8	
+01FA		
+01FC		
+01FE		
+0200		
+0202		
+0204		
+0206		
+0208		
+020A		
+020C		
+020E		
+0210		
+0212		
+0214		
+0216		
+0218		
+021A		
+021C		
+021E		
+0220		
+0222		
+0224		
+0226		
+0228		
+022A		
+022C		
+022E		
+0230		
+0232		
+023A	023B	
+023D	023E	
+0241		
+0386		
+0388	038A	
+038C		
+038E	038F	
+0391	03A1	
+03A3	03AB	
+03D2	03D4	
+03D8		
+03DA		
+03DC		
+03DE		
+03E0		
+03E2		
+03E4		
+03E6		
+03E8		
+03EA		
+03EC		
+03EE		
+03F4		
+03F7		
+03F9	03FA	
+03FD	042F	
+0460		
+0462		
+0464		
+0466		
+0468		
+046A		
+046C		
+046E		
+0470		
+0472		
+0474		
+0476		
+0478		
+047A		
+047C		
+047E		
+0480		
+048A		
+048C		
+048E		
+0490		
+0492		
+0494		
+0496		
+0498		
+049A		
+049C		
+049E		
+04A0		
+04A2		
+04A4		
+04A6		
+04A8		
+04AA		
+04AC		
+04AE		
+04B0		
+04B2		
+04B4		
+04B6		
+04B8		
+04BA		
+04BC		
+04BE		
+04C0	04C1	
+04C3		
+04C5		
+04C7		
+04C9		
+04CB		
+04CD		
+04D0		
+04D2		
+04D4		
+04D6		
+04D8		
+04DA		
+04DC		
+04DE		
+04E0		
+04E2		
+04E4		
+04E6		
+04E8		
+04EA		
+04EC		
+04EE		
+04F0		
+04F2		
+04F4		
+04F6		
+04F8		
+0500		
+0502		
+0504		
+0506		
+0508		
+050A		
+050C		
+050E		
+0531	0556	
+10A0	10C5	
+1E00		
+1E02		
+1E04		
+1E06		
+1E08		
+1E0A		
+1E0C		
+1E0E		
+1E10		
+1E12		
+1E14		
+1E16		
+1E18		
+1E1A		
+1E1C		
+1E1E		
+1E20		
+1E22		
+1E24		
+1E26		
+1E28		
+1E2A		
+1E2C		
+1E2E		
+1E30		
+1E32		
+1E34		
+1E36		
+1E38		
+1E3A		
+1E3C		
+1E3E		
+1E40		
+1E42		
+1E44		
+1E46		
+1E48		
+1E4A		
+1E4C		
+1E4E		
+1E50		
+1E52		
+1E54		
+1E56		
+1E58		
+1E5A		
+1E5C		
+1E5E		
+1E60		
+1E62		
+1E64		
+1E66		
+1E68		
+1E6A		
+1E6C		
+1E6E		
+1E70		
+1E72		
+1E74		
+1E76		
+1E78		
+1E7A		
+1E7C		
+1E7E		
+1E80		
+1E82		
+1E84		
+1E86		
+1E88		
+1E8A		
+1E8C		
+1E8E		
+1E90		
+1E92		
+1E94		
+1EA0		
+1EA2		
+1EA4		
+1EA6		
+1EA8		
+1EAA		
+1EAC		
+1EAE		
+1EB0		
+1EB2		
+1EB4		
+1EB6		
+1EB8		
+1EBA		
+1EBC		
+1EBE		
+1EC0		
+1EC2		
+1EC4		
+1EC6		
+1EC8		
+1ECA		
+1ECC		
+1ECE		
+1ED0		
+1ED2		
+1ED4		
+1ED6		
+1ED8		
+1EDA		
+1EDC		
+1EDE		
+1EE0		
+1EE2		
+1EE4		
+1EE6		
+1EE8		
+1EEA		
+1EEC		
+1EEE		
+1EF0		
+1EF2		
+1EF4		
+1EF6		
+1EF8		
+1F08	1F0F	
+1F18	1F1D	
+1F28	1F2F	
+1F38	1F3F	
+1F48	1F4D	
+1F59		
+1F5B		
+1F5D		
+1F5F		
+1F68	1F6F	
+1FB8	1FBB	
+1FC8	1FCB	
+1FD8	1FDB	
+1FE8	1FEC	
+1FF8	1FFB	
+2102		
+2107		
+210B	210D	
+2110	2112	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+2130	2131	
+2133		
+213E	213F	
+2145		
+2C00	2C2E	
+2C80		
+2C82		
+2C84		
+2C86		
+2C88		
+2C8A		
+2C8C		
+2C8E		
+2C90		
+2C92		
+2C94		
+2C96		
+2C98		
+2C9A		
+2C9C		
+2C9E		
+2CA0		
+2CA2		
+2CA4		
+2CA6		
+2CA8		
+2CAA		
+2CAC		
+2CAE		
+2CB0		
+2CB2		
+2CB4		
+2CB6		
+2CB8		
+2CBA		
+2CBC		
+2CBE		
+2CC0		
+2CC2		
+2CC4		
+2CC6		
+2CC8		
+2CCA		
+2CCC		
+2CCE		
+2CD0		
+2CD2		
+2CD4		
+2CD6		
+2CD8		
+2CDA		
+2CDC		
+2CDE		
+2CE0		
+2CE2		
+FF21	FF3A	
+10400	10427	
+1D400	1D419	
+1D434	1D44D	
+1D468	1D481	
+1D49C		
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B5	
+1D4D0	1D4E9	
+1D504	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D538	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D56C	1D585	
+1D5A0	1D5B9	
+1D5D4	1D5ED	
+1D608	1D621	
+1D63C	1D655	
+1D670	1D689	
+1D6A8	1D6C0	
+1D6E2	1D6FA	
+1D71C	1D734	
+1D756	1D76E	
+1D790	1D7A8	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/M.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/M.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/M.pl	(revision 14489)
@@ -0,0 +1,146 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{M}
+# 	\p{M} (and fuzzy permutations)
+# 
+# Meaning: Major Category 'M'
+#
+return <<'END';
+0300	036F	
+0483	0486	
+0488	0489	
+0591	05B9	
+05BB	05BD	
+05BF		
+05C1	05C2	
+05C4	05C5	
+05C7		
+0610	0615	
+064B	065E	
+0670		
+06D6	06DC	
+06DE	06E4	
+06E7	06E8	
+06EA	06ED	
+0711		
+0730	074A	
+07A6	07B0	
+0901	0903	
+093C		
+093E	094D	
+0951	0954	
+0962	0963	
+0981	0983	
+09BC		
+09BE	09C4	
+09C7	09C8	
+09CB	09CD	
+09D7		
+09E2	09E3	
+0A01	0A03	
+0A3C		
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A70	0A71	
+0A81	0A83	
+0ABC		
+0ABE	0AC5	
+0AC7	0AC9	
+0ACB	0ACD	
+0AE2	0AE3	
+0B01	0B03	
+0B3C		
+0B3E	0B43	
+0B47	0B48	
+0B4B	0B4D	
+0B56	0B57	
+0B82		
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCD	
+0BD7		
+0C01	0C03	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0C82	0C83	
+0CBC		
+0CBE	0CC4	
+0CC6	0CC8	
+0CCA	0CCD	
+0CD5	0CD6	
+0D02	0D03	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4D	
+0D57		
+0D82	0D83	
+0DCA		
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF3	
+0E31		
+0E34	0E3A	
+0E47	0E4E	
+0EB1		
+0EB4	0EB9	
+0EBB	0EBC	
+0EC8	0ECD	
+0F18	0F19	
+0F35		
+0F37		
+0F39		
+0F3E	0F3F	
+0F71	0F84	
+0F86	0F87	
+0F90	0F97	
+0F99	0FBC	
+0FC6		
+102C	1032	
+1036	1039	
+1056	1059	
+135F		
+1712	1714	
+1732	1734	
+1752	1753	
+1772	1773	
+17B6	17D3	
+17DD		
+180B	180D	
+18A9		
+1920	192B	
+1930	193B	
+19B0	19C0	
+19C8	19C9	
+1A17	1A1B	
+1DC0	1DC3	
+20D0	20EB	
+302A	302F	
+3099	309A	
+A802		
+A806		
+A80B		
+A823	A827	
+FB1E		
+FE00	FE0F	
+FE20	FE23	
+10A01	10A03	
+10A05	10A06	
+10A0C	10A0F	
+10A38	10A3A	
+10A3F		
+1D165	1D169	
+1D16D	1D172	
+1D17B	1D182	
+1D185	1D18B	
+1D1AA	1D1AD	
+1D242	1D244	
+E0100	E01EF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Math.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Math.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Math.pl	(revision 14489)
@@ -0,0 +1,103 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Math} (and fuzzy permutations)
+# 
+# Meaning: [\p{Sm}\p{OtherMath}]
+#
+return <<'END';
+002B		
+003C	003E	
+005E		
+007C		
+007E		
+00AC		
+00B1		
+00D7		
+00F7		
+03D0	03D2	
+03D5		
+03F0	03F1	
+03F4	03F6	
+2016		
+2032	2034	
+2040		
+2044		
+2052		
+2061	2063	
+207A	207E	
+208A	208E	
+20D0	20DC	
+20E1		
+20E5	20E6	
+2102		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2128	2129	
+212C	212D	
+212F	2131	
+2133	2138	
+213C	2149	
+214B		
+2190	2194	
+219A	219B	
+21A0		
+21A3		
+21A6		
+21AE		
+21CE	21CF	
+21D2		
+21D4		
+21F4	22FF	
+2308	230B	
+2320	2321	
+237C		
+239B	23B3	
+23B7		
+23D0		
+25B7		
+25C1		
+25F8	25FF	
+266F		
+27C0	27C6	
+27D0	27EB	
+27F0	27FF	
+2900	2AFF	
+FB29		
+FE61	FE66	
+FE68		
+FF0B		
+FF1C	FF1E	
+FF3C		
+FF3E		
+FF5C		
+FF5E		
+FFE2		
+FFE9	FFEC	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A3	
+1D6A8	1D7C9	
+1D7CE	1D7FF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mc.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mc.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mc.pl	(revision 14489)
@@ -0,0 +1,76 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Mc}
+# 	\p{Mc} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Mc'
+#
+return <<'END';
+0903		
+093E	0940	
+0949	094C	
+0982	0983	
+09BE	09C0	
+09C7	09C8	
+09CB	09CC	
+09D7		
+0A03		
+0A3E	0A40	
+0A83		
+0ABE	0AC0	
+0AC9		
+0ACB	0ACC	
+0B02	0B03	
+0B3E		
+0B40		
+0B47	0B48	
+0B4B	0B4C	
+0B57		
+0BBE	0BBF	
+0BC1	0BC2	
+0BC6	0BC8	
+0BCA	0BCC	
+0BD7		
+0C01	0C03	
+0C41	0C44	
+0C82	0C83	
+0CBE		
+0CC0	0CC4	
+0CC7	0CC8	
+0CCA	0CCB	
+0CD5	0CD6	
+0D02	0D03	
+0D3E	0D40	
+0D46	0D48	
+0D4A	0D4C	
+0D57		
+0D82	0D83	
+0DCF	0DD1	
+0DD8	0DDF	
+0DF2	0DF3	
+0F3E	0F3F	
+0F7F		
+102C		
+1031		
+1038		
+1056	1057	
+17B6		
+17BE	17C5	
+17C7	17C8	
+1923	1926	
+1929	192B	
+1930	1931	
+1933	1938	
+19B0	19C0	
+19C8	19C9	
+1A19	1A1B	
+A802		
+A823	A824	
+A827		
+1D165	1D166	
+1D16D	1D172	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Me.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Me.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Me.pl	(revision 14489)
@@ -0,0 +1,17 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Me}
+# 	\p{Me} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Me'
+#
+return <<'END';
+0488	0489	
+06DE		
+20DD	20E0	
+20E2	20E4	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mlym.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mlym.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mlym.pl	(revision 14489)
@@ -0,0 +1,23 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Malayalam} (and fuzzy permutations)
+# 
+# Meaning: Script 'Malayalam'
+#
+return <<'END';
+0D02	0D03	Malayalam
+0D05	0D0C	Malayalam
+0D0E	0D10	Malayalam
+0D12	0D28	Malayalam
+0D2A	0D39	Malayalam
+0D3E	0D43	Malayalam
+0D46	0D48	Malayalam
+0D4A	0D4D	Malayalam
+0D57		Malayalam
+0D60	0D61	Malayalam
+0D66	0D6F	Malayalam
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mn.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mn.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mn.pl	(revision 14489)
@@ -0,0 +1,137 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Mn}
+# 	\p{Mn} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Mn'
+#
+return <<'END';
+0300	036F	
+0483	0486	
+0591	05B9	
+05BB	05BD	
+05BF		
+05C1	05C2	
+05C4	05C5	
+05C7		
+0610	0615	
+064B	065E	
+0670		
+06D6	06DC	
+06DF	06E4	
+06E7	06E8	
+06EA	06ED	
+0711		
+0730	074A	
+07A6	07B0	
+0901	0902	
+093C		
+0941	0948	
+094D		
+0951	0954	
+0962	0963	
+0981		
+09BC		
+09C1	09C4	
+09CD		
+09E2	09E3	
+0A01	0A02	
+0A3C		
+0A41	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A70	0A71	
+0A81	0A82	
+0ABC		
+0AC1	0AC5	
+0AC7	0AC8	
+0ACD		
+0AE2	0AE3	
+0B01		
+0B3C		
+0B3F		
+0B41	0B43	
+0B4D		
+0B56		
+0B82		
+0BC0		
+0BCD		
+0C3E	0C40	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0CBC		
+0CBF		
+0CC6		
+0CCC	0CCD	
+0D41	0D43	
+0D4D		
+0DCA		
+0DD2	0DD4	
+0DD6		
+0E31		
+0E34	0E3A	
+0E47	0E4E	
+0EB1		
+0EB4	0EB9	
+0EBB	0EBC	
+0EC8	0ECD	
+0F18	0F19	
+0F35		
+0F37		
+0F39		
+0F71	0F7E	
+0F80	0F84	
+0F86	0F87	
+0F90	0F97	
+0F99	0FBC	
+0FC6		
+102D	1030	
+1032		
+1036	1037	
+1039		
+1058	1059	
+135F		
+1712	1714	
+1732	1734	
+1752	1753	
+1772	1773	
+17B7	17BD	
+17C6		
+17C9	17D3	
+17DD		
+180B	180D	
+18A9		
+1920	1922	
+1927	1928	
+1932		
+1939	193B	
+1A17	1A18	
+1DC0	1DC3	
+20D0	20DC	
+20E1		
+20E5	20EB	
+302A	302F	
+3099	309A	
+A806		
+A80B		
+A825	A826	
+FB1E		
+FE00	FE0F	
+FE20	FE23	
+10A01	10A03	
+10A05	10A06	
+10A0C	10A0F	
+10A38	10A3A	
+10A3F		
+1D167	1D169	
+1D17B	1D182	
+1D185	1D18B	
+1D1AA	1D1AD	
+1D242	1D244	
+E0100	E01EF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mong.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mong.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mong.pl	(revision 14489)
@@ -0,0 +1,16 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Mongolian} (and fuzzy permutations)
+# 
+# Meaning: Script 'Mongolian'
+#
+return <<'END';
+1800	180E	Mongolian
+1810	1819	Mongolian
+1820	1877	Mongolian
+1880	18A9	Mongolian
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mymr.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mymr.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Mymr.pl	(revision 14489)
@@ -0,0 +1,18 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Myanmar} (and fuzzy permutations)
+# 
+# Meaning: Script 'Myanmar'
+#
+return <<'END';
+1000	1021	Myanmar
+1023	1027	Myanmar
+1029	102A	Myanmar
+102C	1032	Myanmar
+1036	1039	Myanmar
+1040	1059	Myanmar
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/N.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/N.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/N.pl	(revision 14489)
@@ -0,0 +1,66 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{N}
+# 	\p{N} (and fuzzy permutations)
+# 
+# Meaning: Major Category 'N'
+#
+return <<'END';
+0030	0039	
+00B2	00B3	
+00B9		
+00BC	00BE	
+0660	0669	
+06F0	06F9	
+0966	096F	
+09E6	09EF	
+09F4	09F9	
+0A66	0A6F	
+0AE6	0AEF	
+0B66	0B6F	
+0BE6	0BF2	
+0C66	0C6F	
+0CE6	0CEF	
+0D66	0D6F	
+0E50	0E59	
+0ED0	0ED9	
+0F20	0F33	
+1040	1049	
+1369	137C	
+16EE	16F0	
+17E0	17E9	
+17F0	17F9	
+1810	1819	
+1946	194F	
+19D0	19D9	
+2070		
+2074	2079	
+2080	2089	
+2153	2183	
+2460	249B	
+24EA	24FF	
+2776	2793	
+2CFD		
+3007		
+3021	3029	
+3038	303A	
+3192	3195	
+3220	3229	
+3251	325F	
+3280	3289	
+32B1	32BF	
+FF10	FF19	
+10107	10133	
+10140	10178	
+1018A		
+10320	10323	
+1034A		
+103D1	103D5	
+104A0	104A9	
+10A40	10A47	
+1D7CE	1D7FF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/NChar.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/NChar.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/NChar.pl	(revision 14489)
@@ -0,0 +1,27 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Noncharacter_Code_Point'
+#
+return <<'END';
+FDD0	FDEF	Noncharacter_Code_Point
+FFFE	FFFF	Noncharacter_Code_Point
+1FFFE	1FFFF	Noncharacter_Code_Point
+2FFFE	2FFFF	Noncharacter_Code_Point
+3FFFE	3FFFF	Noncharacter_Code_Point
+4FFFE	4FFFF	Noncharacter_Code_Point
+5FFFE	5FFFF	Noncharacter_Code_Point
+6FFFE	6FFFF	Noncharacter_Code_Point
+7FFFE	7FFFF	Noncharacter_Code_Point
+8FFFE	8FFFF	Noncharacter_Code_Point
+9FFFE	9FFFF	Noncharacter_Code_Point
+AFFFE	AFFFF	Noncharacter_Code_Point
+BFFFE	BFFFF	Noncharacter_Code_Point
+CFFFE	CFFFF	Noncharacter_Code_Point
+DFFFE	DFFFF	Noncharacter_Code_Point
+EFFFE	EFFFF	Noncharacter_Code_Point
+FFFFE	FFFFF	Noncharacter_Code_Point
+10FFFE	10FFFF	Noncharacter_Code_Point
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Nd.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Nd.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Nd.pl	(revision 14489)
@@ -0,0 +1,36 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Nd}
+# 	\p{Nd} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Nd'
+#
+return <<'END';
+0030	0039	
+0660	0669	
+06F0	06F9	
+0966	096F	
+09E6	09EF	
+0A66	0A6F	
+0AE6	0AEF	
+0B66	0B6F	
+0BE6	0BEF	
+0C66	0C6F	
+0CE6	0CEF	
+0D66	0D6F	
+0E50	0E59	
+0ED0	0ED9	
+0F20	0F29	
+1040	1049	
+17E0	17E9	
+1810	1819	
+1946	194F	
+19D0	19D9	
+FF10	FF19	
+104A0	104A9	
+1D7CE	1D7FF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/NewTaiLu.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/NewTaiLu.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/NewTaiLu.pl	(revision 14489)
@@ -0,0 +1,16 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{NewTaiLue} (and fuzzy permutations)
+# 
+# Meaning: Script 'New_Tai_Lue'
+#
+return <<'END';
+1980	19A9	New_Tai_Lue
+19B0	19C9	New_Tai_Lue
+19D0	19D9	New_Tai_Lue
+19DE	19DF	New_Tai_Lue
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Nl.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Nl.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Nl.pl	(revision 14489)
@@ -0,0 +1,21 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Nl}
+# 	\p{Nl} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Nl'
+#
+return <<'END';
+16EE	16F0	
+2160	2183	
+3007		
+3021	3029	
+3038	303A	
+10140	10174	
+1034A		
+103D1	103D5	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/No.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/No.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/No.pl	(revision 14489)
@@ -0,0 +1,39 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{No}
+# 	\p{No} (and fuzzy permutations)
+# 
+# Meaning: General Category 'No'
+#
+return <<'END';
+00B2	00B3	
+00B9		
+00BC	00BE	
+09F4	09F9	
+0BF0	0BF2	
+0F2A	0F33	
+1369	137C	
+17F0	17F9	
+2070		
+2074	2079	
+2080	2089	
+2153	215F	
+2460	249B	
+24EA	24FF	
+2776	2793	
+2CFD		
+3192	3195	
+3220	3229	
+3251	325F	
+3280	3289	
+32B1	32BF	
+10107	10133	
+10175	10178	
+1018A		
+10320	10323	
+10A40	10A47	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Nonchara.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Nonchara.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Nonchara.pl	(revision 14489)
@@ -0,0 +1,30 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{NoncharacterCodePoint} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Noncharacter_Code_Point'
+#
+return <<'END';
+FDD0	FDEF	Noncharacter_Code_Point
+FFFE	FFFF	Noncharacter_Code_Point
+1FFFE	1FFFF	Noncharacter_Code_Point
+2FFFE	2FFFF	Noncharacter_Code_Point
+3FFFE	3FFFF	Noncharacter_Code_Point
+4FFFE	4FFFF	Noncharacter_Code_Point
+5FFFE	5FFFF	Noncharacter_Code_Point
+6FFFE	6FFFF	Noncharacter_Code_Point
+7FFFE	7FFFF	Noncharacter_Code_Point
+8FFFE	8FFFF	Noncharacter_Code_Point
+9FFFE	9FFFF	Noncharacter_Code_Point
+AFFFE	AFFFF	Noncharacter_Code_Point
+BFFFE	BFFFF	Noncharacter_Code_Point
+CFFFE	CFFFF	Noncharacter_Code_Point
+DFFFE	DFFFF	Noncharacter_Code_Point
+EFFFE	EFFFF	Noncharacter_Code_Point
+FFFFE	FFFFF	Noncharacter_Code_Point
+10FFFE	10FFFF	Noncharacter_Code_Point
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OAlpha.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OAlpha.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OAlpha.pl	(revision 14489)
@@ -0,0 +1,108 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Other_Alphabetic'
+#
+return <<'END';
+0345		Other_Alphabetic
+05B0	05B9	Other_Alphabetic
+05BB	05BD	Other_Alphabetic
+05BF		Other_Alphabetic
+05C1	05C2	Other_Alphabetic
+05C4	05C5	Other_Alphabetic
+05C7		Other_Alphabetic
+0610	0615	Other_Alphabetic
+064B	0657	Other_Alphabetic
+0659	065E	Other_Alphabetic
+0670		Other_Alphabetic
+06D6	06DC	Other_Alphabetic
+06E1	06E4	Other_Alphabetic
+06E7	06E8	Other_Alphabetic
+06ED		Other_Alphabetic
+0711		Other_Alphabetic
+0730	073F	Other_Alphabetic
+07A6	07B0	Other_Alphabetic
+0901	0903	Other_Alphabetic
+093E	094C	Other_Alphabetic
+0962	0963	Other_Alphabetic
+0981	0983	Other_Alphabetic
+09BE	09C4	Other_Alphabetic
+09C7	09C8	Other_Alphabetic
+09CB	09CC	Other_Alphabetic
+09D7		Other_Alphabetic
+09E2	09E3	Other_Alphabetic
+0A01	0A03	Other_Alphabetic
+0A3E	0A42	Other_Alphabetic
+0A47	0A48	Other_Alphabetic
+0A4B	0A4C	Other_Alphabetic
+0A70	0A71	Other_Alphabetic
+0A81	0A83	Other_Alphabetic
+0ABE	0AC5	Other_Alphabetic
+0AC7	0AC9	Other_Alphabetic
+0ACB	0ACC	Other_Alphabetic
+0AE2	0AE3	Other_Alphabetic
+0B01	0B03	Other_Alphabetic
+0B3E	0B43	Other_Alphabetic
+0B47	0B48	Other_Alphabetic
+0B4B	0B4C	Other_Alphabetic
+0B56	0B57	Other_Alphabetic
+0B82		Other_Alphabetic
+0BBE	0BC2	Other_Alphabetic
+0BC6	0BC8	Other_Alphabetic
+0BCA	0BCC	Other_Alphabetic
+0BD7		Other_Alphabetic
+0C01	0C03	Other_Alphabetic
+0C3E	0C44	Other_Alphabetic
+0C46	0C48	Other_Alphabetic
+0C4A	0C4C	Other_Alphabetic
+0C55	0C56	Other_Alphabetic
+0C82	0C83	Other_Alphabetic
+0CBE	0CC4	Other_Alphabetic
+0CC6	0CC8	Other_Alphabetic
+0CCA	0CCC	Other_Alphabetic
+0CD5	0CD6	Other_Alphabetic
+0D02	0D03	Other_Alphabetic
+0D3E	0D43	Other_Alphabetic
+0D46	0D48	Other_Alphabetic
+0D4A	0D4C	Other_Alphabetic
+0D57		Other_Alphabetic
+0D82	0D83	Other_Alphabetic
+0DCF	0DD4	Other_Alphabetic
+0DD6		Other_Alphabetic
+0DD8	0DDF	Other_Alphabetic
+0DF2	0DF3	Other_Alphabetic
+0E31		Other_Alphabetic
+0E34	0E3A	Other_Alphabetic
+0E4D		Other_Alphabetic
+0EB1		Other_Alphabetic
+0EB4	0EB9	Other_Alphabetic
+0EBB	0EBC	Other_Alphabetic
+0ECD		Other_Alphabetic
+0F71	0F81	Other_Alphabetic
+0F90	0F97	Other_Alphabetic
+0F99	0FBC	Other_Alphabetic
+102C	1032	Other_Alphabetic
+1036		Other_Alphabetic
+1038		Other_Alphabetic
+1056	1059	Other_Alphabetic
+135F		Other_Alphabetic
+1712	1713	Other_Alphabetic
+1732	1733	Other_Alphabetic
+1752	1753	Other_Alphabetic
+1772	1773	Other_Alphabetic
+17B6	17C8	Other_Alphabetic
+18A9		Other_Alphabetic
+1920	192B	Other_Alphabetic
+1930	1938	Other_Alphabetic
+19B0	19C0	Other_Alphabetic
+19C8	19C9	Other_Alphabetic
+1A17	1A1B	Other_Alphabetic
+24B6	24E9	Other_Alphabetic
+A823	A827	Other_Alphabetic
+FB1E		Other_Alphabetic
+10A01	10A03	Other_Alphabetic
+10A05	10A06	Other_Alphabetic
+10A0C	10A0F	Other_Alphabetic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/ODI.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/ODI.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/ODI.pl	(revision 14489)
@@ -0,0 +1,19 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Other_Default_Ignorable_Code_Point'
+#
+return <<'END';
+034F		Other_Default_Ignorable_Code_Point
+115F	1160	Other_Default_Ignorable_Code_Point
+2064	2069	Other_Default_Ignorable_Code_Point
+3164		Other_Default_Ignorable_Code_Point
+FFA0		Other_Default_Ignorable_Code_Point
+FFF0	FFF8	Other_Default_Ignorable_Code_Point
+E0000		Other_Default_Ignorable_Code_Point
+E0002	E001F	Other_Default_Ignorable_Code_Point
+E0080	E00FF	Other_Default_Ignorable_Code_Point
+E01F0	E0FFF	Other_Default_Ignorable_Code_Point
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OGrExt.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OGrExt.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OGrExt.pl	(revision 14489)
@@ -0,0 +1,24 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Other_Grapheme_Extend'
+#
+return <<'END';
+09BE		Other_Grapheme_Extend
+09D7		Other_Grapheme_Extend
+0B3E		Other_Grapheme_Extend
+0B57		Other_Grapheme_Extend
+0BBE		Other_Grapheme_Extend
+0BD7		Other_Grapheme_Extend
+0CC2		Other_Grapheme_Extend
+0CD5	0CD6	Other_Grapheme_Extend
+0D3E		Other_Grapheme_Extend
+0D57		Other_Grapheme_Extend
+0DCF		Other_Grapheme_Extend
+0DDF		Other_Grapheme_Extend
+200C	200D	Other_Grapheme_Extend
+1D165		Other_Grapheme_Extend
+1D16E	1D172	Other_Grapheme_Extend
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OIDC.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OIDC.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OIDC.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Other_ID_Continue'
+#
+return <<'END';
+1369	1371	Other_ID_Continue
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OIDS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OIDS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OIDS.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Other_ID_Start'
+#
+return <<'END';
+2118		Other_ID_Start
+212E		Other_ID_Start
+309B	309C	Other_ID_Start
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OLower.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OLower.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OLower.pl	(revision 14489)
@@ -0,0 +1,20 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Other_Lowercase'
+#
+return <<'END';
+02B0	02B8	Other_Lowercase
+02C0	02C1	Other_Lowercase
+02E0	02E4	Other_Lowercase
+0345		Other_Lowercase
+037A		Other_Lowercase
+1D2C	1D61	Other_Lowercase
+1D78		Other_Lowercase
+1D9B	1DBF	Other_Lowercase
+2090	2094	Other_Lowercase
+2170	217F	Other_Lowercase
+24D0	24E9	Other_Lowercase
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OMath.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OMath.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OMath.pl	(revision 14489)
@@ -0,0 +1,77 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Other_Math'
+#
+return <<'END';
+005E		Other_Math
+03D0	03D2	Other_Math
+03D5		Other_Math
+03F0	03F1	Other_Math
+03F4	03F5	Other_Math
+2016		Other_Math
+2032	2034	Other_Math
+2040		Other_Math
+2061	2063	Other_Math
+207D	207E	Other_Math
+208D	208E	Other_Math
+20D0	20DC	Other_Math
+20E1		Other_Math
+20E5	20E6	Other_Math
+2102		Other_Math
+210A	2113	Other_Math
+2115		Other_Math
+2119	211D	Other_Math
+2124		Other_Math
+2128	2129	Other_Math
+212C	212D	Other_Math
+212F	2131	Other_Math
+2133	2138	Other_Math
+213C	213F	Other_Math
+2145	2149	Other_Math
+23B7		Other_Math
+23D0		Other_Math
+27C5	27C6	Other_Math
+27E6	27EB	Other_Math
+2983	2998	Other_Math
+29D8	29DB	Other_Math
+29FC	29FD	Other_Math
+FE61		Other_Math
+FE63		Other_Math
+FE68		Other_Math
+FF3C		Other_Math
+FF3E		Other_Math
+1D400	1D454	Other_Math
+1D456	1D49C	Other_Math
+1D49E	1D49F	Other_Math
+1D4A2		Other_Math
+1D4A5	1D4A6	Other_Math
+1D4A9	1D4AC	Other_Math
+1D4AE	1D4B9	Other_Math
+1D4BB		Other_Math
+1D4BD	1D4C3	Other_Math
+1D4C5	1D505	Other_Math
+1D507	1D50A	Other_Math
+1D50D	1D514	Other_Math
+1D516	1D51C	Other_Math
+1D51E	1D539	Other_Math
+1D53B	1D53E	Other_Math
+1D540	1D544	Other_Math
+1D546		Other_Math
+1D54A	1D550	Other_Math
+1D552	1D6A3	Other_Math
+1D6A8	1D6C0	Other_Math
+1D6C2	1D6DA	Other_Math
+1D6DC	1D6FA	Other_Math
+1D6FC	1D714	Other_Math
+1D716	1D734	Other_Math
+1D736	1D74E	Other_Math
+1D750	1D76E	Other_Math
+1D770	1D788	Other_Math
+1D78A	1D7A8	Other_Math
+1D7AA	1D7C2	Other_Math
+1D7C4	1D7C9	Other_Math
+1D7CE	1D7FF	Other_Math
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OUpper.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OUpper.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OUpper.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Other_Uppercase'
+#
+return <<'END';
+2160	216F	Other_Uppercase
+24B6	24CF	Other_Uppercase
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ogam.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ogam.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ogam.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Ogham} (and fuzzy permutations)
+# 
+# Meaning: Script 'Ogham'
+#
+return <<'END';
+1680	169C	Ogham
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OldItali.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OldItali.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OldItali.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{OldItalic} (and fuzzy permutations)
+# 
+# Meaning: Script 'Old_Italic'
+#
+return <<'END';
+10300	1031E	Old_Italic
+10320	10323	Old_Italic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OldPersi.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OldPersi.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OldPersi.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{OldPersian} (and fuzzy permutations)
+# 
+# Meaning: Script 'Old_Persian'
+#
+return <<'END';
+103A0	103C3	Old_Persian
+103C8	103D5	Old_Persian
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Orya.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Orya.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Orya.pl	(revision 14489)
@@ -0,0 +1,26 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Oriya} (and fuzzy permutations)
+# 
+# Meaning: Script 'Oriya'
+#
+return <<'END';
+0B01	0B03	Oriya
+0B05	0B0C	Oriya
+0B0F	0B10	Oriya
+0B13	0B28	Oriya
+0B2A	0B30	Oriya
+0B32	0B33	Oriya
+0B35	0B39	Oriya
+0B3C	0B43	Oriya
+0B47	0B48	Oriya
+0B4B	0B4D	Oriya
+0B56	0B57	Oriya
+0B5C	0B5D	Oriya
+0B5F	0B61	Oriya
+0B66	0B71	Oriya
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Osma.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Osma.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Osma.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Osmanya} (and fuzzy permutations)
+# 
+# Meaning: Script 'Osmanya'
+#
+return <<'END';
+10480	1049D	Osmanya
+104A0	104A9	Osmanya
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherAlp.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherAlp.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherAlp.pl	(revision 14489)
@@ -0,0 +1,111 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{OtherAlphabetic} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Other_Alphabetic'
+#
+return <<'END';
+0345		Other_Alphabetic
+05B0	05B9	Other_Alphabetic
+05BB	05BD	Other_Alphabetic
+05BF		Other_Alphabetic
+05C1	05C2	Other_Alphabetic
+05C4	05C5	Other_Alphabetic
+05C7		Other_Alphabetic
+0610	0615	Other_Alphabetic
+064B	0657	Other_Alphabetic
+0659	065E	Other_Alphabetic
+0670		Other_Alphabetic
+06D6	06DC	Other_Alphabetic
+06E1	06E4	Other_Alphabetic
+06E7	06E8	Other_Alphabetic
+06ED		Other_Alphabetic
+0711		Other_Alphabetic
+0730	073F	Other_Alphabetic
+07A6	07B0	Other_Alphabetic
+0901	0903	Other_Alphabetic
+093E	094C	Other_Alphabetic
+0962	0963	Other_Alphabetic
+0981	0983	Other_Alphabetic
+09BE	09C4	Other_Alphabetic
+09C7	09C8	Other_Alphabetic
+09CB	09CC	Other_Alphabetic
+09D7		Other_Alphabetic
+09E2	09E3	Other_Alphabetic
+0A01	0A03	Other_Alphabetic
+0A3E	0A42	Other_Alphabetic
+0A47	0A48	Other_Alphabetic
+0A4B	0A4C	Other_Alphabetic
+0A70	0A71	Other_Alphabetic
+0A81	0A83	Other_Alphabetic
+0ABE	0AC5	Other_Alphabetic
+0AC7	0AC9	Other_Alphabetic
+0ACB	0ACC	Other_Alphabetic
+0AE2	0AE3	Other_Alphabetic
+0B01	0B03	Other_Alphabetic
+0B3E	0B43	Other_Alphabetic
+0B47	0B48	Other_Alphabetic
+0B4B	0B4C	Other_Alphabetic
+0B56	0B57	Other_Alphabetic
+0B82		Other_Alphabetic
+0BBE	0BC2	Other_Alphabetic
+0BC6	0BC8	Other_Alphabetic
+0BCA	0BCC	Other_Alphabetic
+0BD7		Other_Alphabetic
+0C01	0C03	Other_Alphabetic
+0C3E	0C44	Other_Alphabetic
+0C46	0C48	Other_Alphabetic
+0C4A	0C4C	Other_Alphabetic
+0C55	0C56	Other_Alphabetic
+0C82	0C83	Other_Alphabetic
+0CBE	0CC4	Other_Alphabetic
+0CC6	0CC8	Other_Alphabetic
+0CCA	0CCC	Other_Alphabetic
+0CD5	0CD6	Other_Alphabetic
+0D02	0D03	Other_Alphabetic
+0D3E	0D43	Other_Alphabetic
+0D46	0D48	Other_Alphabetic
+0D4A	0D4C	Other_Alphabetic
+0D57		Other_Alphabetic
+0D82	0D83	Other_Alphabetic
+0DCF	0DD4	Other_Alphabetic
+0DD6		Other_Alphabetic
+0DD8	0DDF	Other_Alphabetic
+0DF2	0DF3	Other_Alphabetic
+0E31		Other_Alphabetic
+0E34	0E3A	Other_Alphabetic
+0E4D		Other_Alphabetic
+0EB1		Other_Alphabetic
+0EB4	0EB9	Other_Alphabetic
+0EBB	0EBC	Other_Alphabetic
+0ECD		Other_Alphabetic
+0F71	0F81	Other_Alphabetic
+0F90	0F97	Other_Alphabetic
+0F99	0FBC	Other_Alphabetic
+102C	1032	Other_Alphabetic
+1036		Other_Alphabetic
+1038		Other_Alphabetic
+1056	1059	Other_Alphabetic
+135F		Other_Alphabetic
+1712	1713	Other_Alphabetic
+1732	1733	Other_Alphabetic
+1752	1753	Other_Alphabetic
+1772	1773	Other_Alphabetic
+17B6	17C8	Other_Alphabetic
+18A9		Other_Alphabetic
+1920	192B	Other_Alphabetic
+1930	1938	Other_Alphabetic
+19B0	19C0	Other_Alphabetic
+19C8	19C9	Other_Alphabetic
+1A17	1A1B	Other_Alphabetic
+24B6	24E9	Other_Alphabetic
+A823	A827	Other_Alphabetic
+FB1E		Other_Alphabetic
+10A01	10A03	Other_Alphabetic
+10A05	10A06	Other_Alphabetic
+10A0C	10A0F	Other_Alphabetic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherDef.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherDef.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherDef.pl	(revision 14489)
@@ -0,0 +1,22 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{OtherDefaultIgnorableCodePoint} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Other_Default_Ignorable_Code_Point'
+#
+return <<'END';
+034F		Other_Default_Ignorable_Code_Point
+115F	1160	Other_Default_Ignorable_Code_Point
+2064	2069	Other_Default_Ignorable_Code_Point
+3164		Other_Default_Ignorable_Code_Point
+FFA0		Other_Default_Ignorable_Code_Point
+FFF0	FFF8	Other_Default_Ignorable_Code_Point
+E0000		Other_Default_Ignorable_Code_Point
+E0002	E001F	Other_Default_Ignorable_Code_Point
+E0080	E00FF	Other_Default_Ignorable_Code_Point
+E01F0	E0FFF	Other_Default_Ignorable_Code_Point
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherGra.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherGra.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherGra.pl	(revision 14489)
@@ -0,0 +1,27 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{OtherGraphemeExtend} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Other_Grapheme_Extend'
+#
+return <<'END';
+09BE		Other_Grapheme_Extend
+09D7		Other_Grapheme_Extend
+0B3E		Other_Grapheme_Extend
+0B57		Other_Grapheme_Extend
+0BBE		Other_Grapheme_Extend
+0BD7		Other_Grapheme_Extend
+0CC2		Other_Grapheme_Extend
+0CD5	0CD6	Other_Grapheme_Extend
+0D3E		Other_Grapheme_Extend
+0D57		Other_Grapheme_Extend
+0DCF		Other_Grapheme_Extend
+0DDF		Other_Grapheme_Extend
+200C	200D	Other_Grapheme_Extend
+1D165		Other_Grapheme_Extend
+1D16E	1D172	Other_Grapheme_Extend
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherIdC.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherIdC.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherIdC.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{OtherIdContinue} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Other_ID_Continue'
+#
+return <<'END';
+1369	1371	Other_ID_Continue
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherIdS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherIdS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherIdS.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{OtherIdStart} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Other_ID_Start'
+#
+return <<'END';
+2118		Other_ID_Start
+212E		Other_ID_Start
+309B	309C	Other_ID_Start
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherLow.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherLow.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherLow.pl	(revision 14489)
@@ -0,0 +1,23 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{OtherLowercase} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Other_Lowercase'
+#
+return <<'END';
+02B0	02B8	Other_Lowercase
+02C0	02C1	Other_Lowercase
+02E0	02E4	Other_Lowercase
+0345		Other_Lowercase
+037A		Other_Lowercase
+1D2C	1D61	Other_Lowercase
+1D78		Other_Lowercase
+1D9B	1DBF	Other_Lowercase
+2090	2094	Other_Lowercase
+2170	217F	Other_Lowercase
+24D0	24E9	Other_Lowercase
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherMat.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherMat.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherMat.pl	(revision 14489)
@@ -0,0 +1,80 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{OtherMath} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Other_Math'
+#
+return <<'END';
+005E		Other_Math
+03D0	03D2	Other_Math
+03D5		Other_Math
+03F0	03F1	Other_Math
+03F4	03F5	Other_Math
+2016		Other_Math
+2032	2034	Other_Math
+2040		Other_Math
+2061	2063	Other_Math
+207D	207E	Other_Math
+208D	208E	Other_Math
+20D0	20DC	Other_Math
+20E1		Other_Math
+20E5	20E6	Other_Math
+2102		Other_Math
+210A	2113	Other_Math
+2115		Other_Math
+2119	211D	Other_Math
+2124		Other_Math
+2128	2129	Other_Math
+212C	212D	Other_Math
+212F	2131	Other_Math
+2133	2138	Other_Math
+213C	213F	Other_Math
+2145	2149	Other_Math
+23B7		Other_Math
+23D0		Other_Math
+27C5	27C6	Other_Math
+27E6	27EB	Other_Math
+2983	2998	Other_Math
+29D8	29DB	Other_Math
+29FC	29FD	Other_Math
+FE61		Other_Math
+FE63		Other_Math
+FE68		Other_Math
+FF3C		Other_Math
+FF3E		Other_Math
+1D400	1D454	Other_Math
+1D456	1D49C	Other_Math
+1D49E	1D49F	Other_Math
+1D4A2		Other_Math
+1D4A5	1D4A6	Other_Math
+1D4A9	1D4AC	Other_Math
+1D4AE	1D4B9	Other_Math
+1D4BB		Other_Math
+1D4BD	1D4C3	Other_Math
+1D4C5	1D505	Other_Math
+1D507	1D50A	Other_Math
+1D50D	1D514	Other_Math
+1D516	1D51C	Other_Math
+1D51E	1D539	Other_Math
+1D53B	1D53E	Other_Math
+1D540	1D544	Other_Math
+1D546		Other_Math
+1D54A	1D550	Other_Math
+1D552	1D6A3	Other_Math
+1D6A8	1D6C0	Other_Math
+1D6C2	1D6DA	Other_Math
+1D6DC	1D6FA	Other_Math
+1D6FC	1D714	Other_Math
+1D716	1D734	Other_Math
+1D736	1D74E	Other_Math
+1D750	1D76E	Other_Math
+1D770	1D788	Other_Math
+1D78A	1D7A8	Other_Math
+1D7AA	1D7C2	Other_Math
+1D7C4	1D7C9	Other_Math
+1D7CE	1D7FF	Other_Math
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherUpp.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherUpp.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/OtherUpp.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{OtherUppercase} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Other_Uppercase'
+#
+return <<'END';
+2160	216F	Other_Uppercase
+24B6	24CF	Other_Uppercase
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/P.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/P.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/P.pl	(revision 14489)
@@ -0,0 +1,109 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{P}
+# 	\p{P} (and fuzzy permutations)
+# 
+# Meaning: Major Category 'P'
+#
+return <<'END';
+0021	0023	
+0025	002A	
+002C	002F	
+003A	003B	
+003F	0040	
+005B	005D	
+005F		
+007B		
+007D		
+00A1		
+00AB		
+00B7		
+00BB		
+00BF		
+037E		
+0387		
+055A	055F	
+0589	058A	
+05BE		
+05C0		
+05C3		
+05C6		
+05F3	05F4	
+060C	060D	
+061B		
+061E	061F	
+066A	066D	
+06D4		
+0700	070D	
+0964	0965	
+0970		
+0DF4		
+0E4F		
+0E5A	0E5B	
+0F04	0F12	
+0F3A	0F3D	
+0F85		
+0FD0	0FD1	
+104A	104F	
+10FB		
+1361	1368	
+166D	166E	
+169B	169C	
+16EB	16ED	
+1735	1736	
+17D4	17D6	
+17D8	17DA	
+1800	180A	
+1944	1945	
+19DE	19DF	
+1A1E	1A1F	
+2010	2027	
+2030	2043	
+2045	2051	
+2053	205E	
+207D	207E	
+208D	208E	
+2329	232A	
+23B4	23B6	
+2768	2775	
+27C5	27C6	
+27E6	27EB	
+2983	2998	
+29D8	29DB	
+29FC	29FD	
+2CF9	2CFC	
+2CFE	2CFF	
+2E00	2E17	
+2E1C	2E1D	
+3001	3003	
+3008	3011	
+3014	301F	
+3030		
+303D		
+30A0		
+30FB		
+FD3E	FD3F	
+FE10	FE19	
+FE30	FE52	
+FE54	FE61	
+FE63		
+FE68		
+FE6A	FE6B	
+FF01	FF03	
+FF05	FF0A	
+FF0C	FF0F	
+FF1A	FF1B	
+FF1F	FF20	
+FF3B	FF3D	
+FF3F		
+FF5B		
+FF5D		
+FF5F	FF65	
+10100	10101	
+1039F		
+10A50	10A58	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatSyn.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatSyn.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatSyn.pl	(revision 14489)
@@ -0,0 +1,37 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Pattern_Syntax'
+#
+return <<'END';
+0021	002F	Pattern_Syntax
+003A	0040	Pattern_Syntax
+005B	005E	Pattern_Syntax
+0060		Pattern_Syntax
+007B	007E	Pattern_Syntax
+00A1	00A7	Pattern_Syntax
+00A9		Pattern_Syntax
+00AB	00AC	Pattern_Syntax
+00AE		Pattern_Syntax
+00B0	00B1	Pattern_Syntax
+00B6		Pattern_Syntax
+00BB		Pattern_Syntax
+00BF		Pattern_Syntax
+00D7		Pattern_Syntax
+00F7		Pattern_Syntax
+2010	2027	Pattern_Syntax
+2030	203E	Pattern_Syntax
+2041	2053	Pattern_Syntax
+2055	205E	Pattern_Syntax
+2190	245F	Pattern_Syntax
+2500	2775	Pattern_Syntax
+2794	2BFF	Pattern_Syntax
+2E00	2E7F	Pattern_Syntax
+3001	3003	Pattern_Syntax
+3008	3020	Pattern_Syntax
+3030		Pattern_Syntax
+FD3E	FD3F	Pattern_Syntax
+FE45	FE46	Pattern_Syntax
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatWS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatWS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatWS.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Pattern_White_Space'
+#
+return <<'END';
+0009	000D	Pattern_White_Space
+0020		Pattern_White_Space
+0085		Pattern_White_Space
+200E	200F	Pattern_White_Space
+2028	2029	Pattern_White_Space
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatternS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatternS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatternS.pl	(revision 14489)
@@ -0,0 +1,40 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{PatternSyntax} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Pattern_Syntax'
+#
+return <<'END';
+0021	002F	Pattern_Syntax
+003A	0040	Pattern_Syntax
+005B	005E	Pattern_Syntax
+0060		Pattern_Syntax
+007B	007E	Pattern_Syntax
+00A1	00A7	Pattern_Syntax
+00A9		Pattern_Syntax
+00AB	00AC	Pattern_Syntax
+00AE		Pattern_Syntax
+00B0	00B1	Pattern_Syntax
+00B6		Pattern_Syntax
+00BB		Pattern_Syntax
+00BF		Pattern_Syntax
+00D7		Pattern_Syntax
+00F7		Pattern_Syntax
+2010	2027	Pattern_Syntax
+2030	203E	Pattern_Syntax
+2041	2053	Pattern_Syntax
+2055	205E	Pattern_Syntax
+2190	245F	Pattern_Syntax
+2500	2775	Pattern_Syntax
+2794	2BFF	Pattern_Syntax
+2E00	2E7F	Pattern_Syntax
+3001	3003	Pattern_Syntax
+3008	3020	Pattern_Syntax
+3030		Pattern_Syntax
+FD3E	FD3F	Pattern_Syntax
+FE45	FE46	Pattern_Syntax
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatternW.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatternW.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/PatternW.pl	(revision 14489)
@@ -0,0 +1,17 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{PatternWhiteSpace} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Pattern_White_Space'
+#
+return <<'END';
+0009	000D	Pattern_White_Space
+0020		Pattern_White_Space
+0085		Pattern_White_Space
+200E	200F	Pattern_White_Space
+2028	2029	Pattern_White_Space
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pc.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pc.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pc.pl	(revision 14489)
@@ -0,0 +1,19 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Pc}
+# 	\p{Pc} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Pc'
+#
+return <<'END';
+005F		
+203F	2040	
+2054		
+FE33	FE34	
+FE4D	FE4F	
+FF3F		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pd.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pd.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pd.pl	(revision 14489)
@@ -0,0 +1,25 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Pd}
+# 	\p{Pd} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Pd'
+#
+return <<'END';
+002D		
+058A		
+1806		
+2010	2015	
+2E17		
+301C		
+3030		
+30A0		
+FE31	FE32	
+FE58		
+FE63		
+FF0D		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pe.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pe.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pe.pl	(revision 14489)
@@ -0,0 +1,78 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Pe}
+# 	\p{Pe} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Pe'
+#
+return <<'END';
+0029		
+005D		
+007D		
+0F3B		
+0F3D		
+169C		
+2046		
+207E		
+208E		
+232A		
+23B5		
+2769		
+276B		
+276D		
+276F		
+2771		
+2773		
+2775		
+27C6		
+27E7		
+27E9		
+27EB		
+2984		
+2986		
+2988		
+298A		
+298C		
+298E		
+2990		
+2992		
+2994		
+2996		
+2998		
+29D9		
+29DB		
+29FD		
+3009		
+300B		
+300D		
+300F		
+3011		
+3015		
+3017		
+3019		
+301B		
+301E	301F	
+FD3F		
+FE18		
+FE36		
+FE38		
+FE3A		
+FE3C		
+FE3E		
+FE40		
+FE42		
+FE44		
+FE48		
+FE5A		
+FE5C		
+FE5E		
+FF09		
+FF3D		
+FF5D		
+FF60		
+FF63		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pf.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pf.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pf.pl	(revision 14489)
@@ -0,0 +1,22 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Pf}
+# 	\p{Pf} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Pf'
+#
+return <<'END';
+00BB		
+2019		
+201D		
+203A		
+2E03		
+2E05		
+2E0A		
+2E0D		
+2E1D		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pi.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pi.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Pi.pl	(revision 14489)
@@ -0,0 +1,23 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Pi}
+# 	\p{Pi} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Pi'
+#
+return <<'END';
+00AB		
+2018		
+201B	201C	
+201F		
+2039		
+2E02		
+2E04		
+2E09		
+2E0C		
+2E1C		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Po.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Po.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Po.pl	(revision 14489)
@@ -0,0 +1,101 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Po}
+# 	\p{Po} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Po'
+#
+return <<'END';
+0021	0023	
+0025	0027	
+002A		
+002C		
+002E	002F	
+003A	003B	
+003F	0040	
+005C		
+00A1		
+00B7		
+00BF		
+037E		
+0387		
+055A	055F	
+0589		
+05BE		
+05C0		
+05C3		
+05C6		
+05F3	05F4	
+060C	060D	
+061B		
+061E	061F	
+066A	066D	
+06D4		
+0700	070D	
+0964	0965	
+0970		
+0DF4		
+0E4F		
+0E5A	0E5B	
+0F04	0F12	
+0F85		
+0FD0	0FD1	
+104A	104F	
+10FB		
+1361	1368	
+166D	166E	
+16EB	16ED	
+1735	1736	
+17D4	17D6	
+17D8	17DA	
+1800	1805	
+1807	180A	
+1944	1945	
+19DE	19DF	
+1A1E	1A1F	
+2016	2017	
+2020	2027	
+2030	2038	
+203B	203E	
+2041	2043	
+2047	2051	
+2053		
+2055	205E	
+23B6		
+2CF9	2CFC	
+2CFE	2CFF	
+2E00	2E01	
+2E06	2E08	
+2E0B		
+2E0E	2E16	
+3001	3003	
+303D		
+30FB		
+FE10	FE16	
+FE19		
+FE30		
+FE45	FE46	
+FE49	FE4C	
+FE50	FE52	
+FE54	FE57	
+FE5F	FE61	
+FE68		
+FE6A	FE6B	
+FF01	FF03	
+FF05	FF07	
+FF0A		
+FF0C		
+FF0E	FF0F	
+FF1A	FF1B	
+FF1F	FF20	
+FF3C		
+FF61		
+FF64	FF65	
+10100	10101	
+1039F		
+10A50	10A58	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Print.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Print.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Print.pl	(revision 14489)
@@ -0,0 +1,435 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Print}
+# 
+# Meaning: [[:Print:]]
+#
+return <<'END';
+0009	000D	
+0020	007E	
+0085		
+00A0	0241	
+0250	036F	
+0374	0375	
+037A		
+037E		
+0384	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	0486	
+0488	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559	055F	
+0561	0587	
+0589	058A	
+0591	05B9	
+05BB	05C7	
+05D0	05EA	
+05F0	05F4	
+0600	0603	
+060B	0615	
+061B		
+061E	061F	
+0621	063A	
+0640	065E	
+0660	070D	
+070F	074A	
+074D	076D	
+0780	07B1	
+0901	0939	
+093C	094D	
+0950	0954	
+0958	0970	
+097D		
+0981	0983	
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BC	09C4	
+09C7	09C8	
+09CB	09CE	
+09D7		
+09DC	09DD	
+09DF	09E3	
+09E6	09FA	
+0A01	0A03	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A3C		
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A59	0A5C	
+0A5E		
+0A66	0A74	
+0A81	0A83	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABC	0AC5	
+0AC7	0AC9	
+0ACB	0ACD	
+0AD0		
+0AE0	0AE3	
+0AE6	0AEF	
+0AF1		
+0B01	0B03	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3C	0B43	
+0B47	0B48	
+0B4B	0B4D	
+0B56	0B57	
+0B5C	0B5D	
+0B5F	0B61	
+0B66	0B71	
+0B82	0B83	
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCD	
+0BD7		
+0BE6	0BFA	
+0C01	0C03	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0C60	0C61	
+0C66	0C6F	
+0C82	0C83	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBC	0CC4	
+0CC6	0CC8	
+0CCA	0CCD	
+0CD5	0CD6	
+0CDE		
+0CE0	0CE1	
+0CE6	0CEF	
+0D02	0D03	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4D	
+0D57		
+0D60	0D61	
+0D66	0D6F	
+0D82	0D83	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DCA		
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF4	
+0E01	0E3A	
+0E3F	0E5B	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB9	
+0EBB	0EBD	
+0EC0	0EC4	
+0EC6		
+0EC8	0ECD	
+0ED0	0ED9	
+0EDC	0EDD	
+0F00	0F47	
+0F49	0F6A	
+0F71	0F8B	
+0F90	0F97	
+0F99	0FBC	
+0FBE	0FCC	
+0FCF	0FD1	
+1000	1021	
+1023	1027	
+1029	102A	
+102C	1032	
+1036	1039	
+1040	1059	
+10A0	10C5	
+10D0	10FC	
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+135F	137C	
+1380	1399	
+13A0	13F4	
+1401	1676	
+1680	169C	
+16A0	16F0	
+1700	170C	
+170E	1714	
+1720	1736	
+1740	1753	
+1760	176C	
+176E	1770	
+1772	1773	
+1780	17DD	
+17E0	17E9	
+17F0	17F9	
+1800	180E	
+1810	1819	
+1820	1877	
+1880	18A9	
+1900	191C	
+1920	192B	
+1930	193B	
+1940		
+1944	196D	
+1970	1974	
+1980	19A9	
+19B0	19C9	
+19D0	19D9	
+19DE	1A1B	
+1A1E	1A1F	
+1D00	1DC3	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FC4	
+1FC6	1FD3	
+1FD6	1FDB	
+1FDD	1FEF	
+1FF2	1FF4	
+1FF6	1FFE	
+2000	2063	
+206A	2071	
+2074	208E	
+2090	2094	
+20A0	20B5	
+20D0	20EB	
+2100	214C	
+2153	2183	
+2190	23DB	
+2400	2426	
+2440	244A	
+2460	269C	
+26A0	26B1	
+2701	2704	
+2706	2709	
+270C	2727	
+2729	274B	
+274D		
+274F	2752	
+2756		
+2758	275E	
+2761	2794	
+2798	27AF	
+27B1	27BE	
+27C0	27C6	
+27D0	27EB	
+27F0	2B13	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CEA	
+2CF9	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+2E00	2E17	
+2E1C	2E1D	
+2E80	2E99	
+2E9B	2EF3	
+2F00	2FD5	
+2FF0	2FFB	
+3000	303F	
+3041	3096	
+3099	30FF	
+3105	312C	
+3131	318E	
+3190	31B7	
+31C0	31CF	
+31F0	321E	
+3220	3243	
+3250	32FE	
+3300	4DB5	
+4DC0	9FBB	
+A000	A48C	
+A490	A4C6	
+A700	A716	
+A800	A82B	
+AC00	D7A3	
+E000	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FB1D	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3F	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFD	
+FE00	FE19	
+FE20	FE23	
+FE30	FE52	
+FE54	FE66	
+FE68	FE6B	
+FE70	FE74	
+FE76	FEFC	
+FEFF		
+FF01	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+FFE0	FFE6	
+FFE8	FFEE	
+FFF9	FFFD	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10100	10102	
+10107	10133	
+10137	1018A	
+10300	1031E	
+10320	10323	
+10330	1034A	
+10380	1039D	
+1039F	103C3	
+103C8	103D5	
+10400	1049D	
+104A0	104A9	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00	10A03	
+10A05	10A06	
+10A0C	10A13	
+10A15	10A17	
+10A19	10A33	
+10A38	10A3A	
+10A3F	10A47	
+10A50	10A58	
+1D000	1D0F5	
+1D100	1D126	
+1D12A	1D1DD	
+1D200	1D245	
+1D300	1D356	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D7C9	
+1D7CE	1D7FF	
+20000	2A6D6	
+2F800	2FA1D	
+E0001		
+E0020	E007F	
+E0100	E01EF	
+F0000	FFFFD	
+100000	10FFFD	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ps.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ps.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ps.pl	(revision 14489)
@@ -0,0 +1,80 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Ps}
+# 	\p{Ps} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Ps'
+#
+return <<'END';
+0028		
+005B		
+007B		
+0F3A		
+0F3C		
+169B		
+201A		
+201E		
+2045		
+207D		
+208D		
+2329		
+23B4		
+2768		
+276A		
+276C		
+276E		
+2770		
+2772		
+2774		
+27C5		
+27E6		
+27E8		
+27EA		
+2983		
+2985		
+2987		
+2989		
+298B		
+298D		
+298F		
+2991		
+2993		
+2995		
+2997		
+29D8		
+29DA		
+29FC		
+3008		
+300A		
+300C		
+300E		
+3010		
+3014		
+3016		
+3018		
+301A		
+301D		
+FD3E		
+FE17		
+FE35		
+FE37		
+FE39		
+FE3B		
+FE3D		
+FE3F		
+FE41		
+FE43		
+FE47		
+FE59		
+FE5B		
+FE5D		
+FF08		
+FF3B		
+FF5B		
+FF5F		
+FF62		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Punct.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Punct.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Punct.pl	(revision 14489)
@@ -0,0 +1,108 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Punct}
+# 
+# Meaning: [[:Punct:]]
+#
+return <<'END';
+0021	0023	
+0025	002A	
+002C	002F	
+003A	003B	
+003F	0040	
+005B	005D	
+005F		
+007B		
+007D		
+00A1		
+00AB		
+00B7		
+00BB		
+00BF		
+037E		
+0387		
+055A	055F	
+0589	058A	
+05BE		
+05C0		
+05C3		
+05C6		
+05F3	05F4	
+060C	060D	
+061B		
+061E	061F	
+066A	066D	
+06D4		
+0700	070D	
+0964	0965	
+0970		
+0DF4		
+0E4F		
+0E5A	0E5B	
+0F04	0F12	
+0F3A	0F3D	
+0F85		
+0FD0	0FD1	
+104A	104F	
+10FB		
+1361	1368	
+166D	166E	
+169B	169C	
+16EB	16ED	
+1735	1736	
+17D4	17D6	
+17D8	17DA	
+1800	180A	
+1944	1945	
+19DE	19DF	
+1A1E	1A1F	
+2010	2027	
+2030	2043	
+2045	2051	
+2053	205E	
+207D	207E	
+208D	208E	
+2329	232A	
+23B4	23B6	
+2768	2775	
+27C5	27C6	
+27E6	27EB	
+2983	2998	
+29D8	29DB	
+29FC	29FD	
+2CF9	2CFC	
+2CFE	2CFF	
+2E00	2E17	
+2E1C	2E1D	
+3001	3003	
+3008	3011	
+3014	301F	
+3030		
+303D		
+30A0		
+30FB		
+FD3E	FD3F	
+FE10	FE19	
+FE30	FE52	
+FE54	FE61	
+FE63		
+FE68		
+FE6A	FE6B	
+FF01	FF03	
+FF05	FF0A	
+FF0C	FF0F	
+FF1A	FF1B	
+FF1F	FF20	
+FF3B	FF3D	
+FF3F		
+FF5B		
+FF5D		
+FF5F	FF65	
+10100	10101	
+1039F		
+10A50	10A58	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/QMark.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/QMark.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/QMark.pl	(revision 14489)
@@ -0,0 +1,21 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Quotation_Mark'
+#
+return <<'END';
+0022		Quotation_Mark
+0027		Quotation_Mark
+00AB		Quotation_Mark
+00BB		Quotation_Mark
+2018	201F	Quotation_Mark
+2039	203A	Quotation_Mark
+300C	300F	Quotation_Mark
+301D	301F	Quotation_Mark
+FE41	FE44	Quotation_Mark
+FF02		Quotation_Mark
+FF07		Quotation_Mark
+FF62	FF63	Quotation_Mark
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Qaai.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Qaai.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Qaai.pl	(revision 14489)
@@ -0,0 +1,27 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Inherited} (and fuzzy permutations)
+# 
+# Meaning: Script 'Inherited'
+#
+return <<'END';
+0300	036F	Inherited
+064B	0655	Inherited
+0670		Inherited
+1DC0	1DC3	Inherited
+200C	200D	Inherited
+20D0	20EB	Inherited
+302A	302F	Inherited
+3099	309A	Inherited
+FE00	FE0F	Inherited
+FE20	FE23	Inherited
+1D167	1D169	Inherited
+1D17B	1D182	Inherited
+1D185	1D18B	Inherited
+1D1AA	1D1AD	Inherited
+E0100	E01EF	Inherited
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Quotatio.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Quotatio.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Quotatio.pl	(revision 14489)
@@ -0,0 +1,24 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{QuotationMark} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Quotation_Mark'
+#
+return <<'END';
+0022		Quotation_Mark
+0027		Quotation_Mark
+00AB		Quotation_Mark
+00BB		Quotation_Mark
+2018	201F	Quotation_Mark
+2039	203A	Quotation_Mark
+300C	300F	Quotation_Mark
+301D	301F	Quotation_Mark
+FE41	FE44	Quotation_Mark
+FF02		Quotation_Mark
+FF07		Quotation_Mark
+FF62	FF63	Quotation_Mark
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Radical.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Radical.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Radical.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Radical'
+#
+return <<'END';
+2E80	2E99	Radical
+2E9B	2EF3	Radical
+2F00	2FD5	Radical
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Radical2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Radical2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Radical2.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Radical} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Radical'
+#
+return <<'END';
+2E80	2E99	Radical
+2E9B	2EF3	Radical
+2F00	2FD5	Radical
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Runr.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Runr.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Runr.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Runic} (and fuzzy permutations)
+# 
+# Meaning: Script 'Runic'
+#
+return <<'END';
+16A0	16EA	Runic
+16EE	16F0	Runic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/S.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/S.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/S.pl	(revision 14489)
@@ -0,0 +1,175 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{S}
+# 	\p{S} (and fuzzy permutations)
+# 
+# Meaning: Major Category 'S'
+#
+return <<'END';
+0024		
+002B		
+003C	003E	
+005E		
+0060		
+007C		
+007E		
+00A2	00A9	
+00AC		
+00AE	00B1	
+00B4		
+00B6		
+00B8		
+00D7		
+00F7		
+02C2	02C5	
+02D2	02DF	
+02E5	02ED	
+02EF	02FF	
+0374	0375	
+0384	0385	
+03F6		
+0482		
+060B		
+060E	060F	
+06E9		
+06FD	06FE	
+09F2	09F3	
+09FA		
+0AF1		
+0B70		
+0BF3	0BFA	
+0E3F		
+0F01	0F03	
+0F13	0F17	
+0F1A	0F1F	
+0F34		
+0F36		
+0F38		
+0FBE	0FC5	
+0FC7	0FCC	
+0FCF		
+1360		
+1390	1399	
+17DB		
+1940		
+19E0	19FF	
+1FBD		
+1FBF	1FC1	
+1FCD	1FCF	
+1FDD	1FDF	
+1FED	1FEF	
+1FFD	1FFE	
+2044		
+2052		
+207A	207C	
+208A	208C	
+20A0	20B5	
+2100	2101	
+2103	2106	
+2108	2109	
+2114		
+2116	2118	
+211E	2123	
+2125		
+2127		
+2129		
+212E		
+2132		
+213A	213B	
+2140	2144	
+214A	214C	
+2190	2328	
+232B	23B3	
+23B7	23DB	
+2400	2426	
+2440	244A	
+249C	24E9	
+2500	269C	
+26A0	26B1	
+2701	2704	
+2706	2709	
+270C	2727	
+2729	274B	
+274D		
+274F	2752	
+2756		
+2758	275E	
+2761	2767	
+2794		
+2798	27AF	
+27B1	27BE	
+27C0	27C4	
+27D0	27E5	
+27F0	2982	
+2999	29D7	
+29DC	29FB	
+29FE	2B13	
+2CE5	2CEA	
+2E80	2E99	
+2E9B	2EF3	
+2F00	2FD5	
+2FF0	2FFB	
+3004		
+3012	3013	
+3020		
+3036	3037	
+303E	303F	
+309B	309C	
+3190	3191	
+3196	319F	
+31C0	31CF	
+3200	321E	
+322A	3243	
+3250		
+3260	327F	
+328A	32B0	
+32C0	32FE	
+3300	33FF	
+4DC0	4DFF	
+A490	A4C6	
+A700	A716	
+A828	A82B	
+FB29		
+FDFC	FDFD	
+FE62		
+FE64	FE66	
+FE69		
+FF04		
+FF0B		
+FF1C	FF1E	
+FF3E		
+FF40		
+FF5C		
+FF5E		
+FFE0	FFE6	
+FFE8	FFEE	
+FFFC	FFFD	
+10102		
+10137	1013F	
+10179	10189	
+103D0		
+1D000	1D0F5	
+1D100	1D126	
+1D12A	1D164	
+1D16A	1D16C	
+1D183	1D184	
+1D18C	1D1A9	
+1D1AE	1D1DD	
+1D200	1D241	
+1D245		
+1D300	1D356	
+1D6C1		
+1D6DB		
+1D6FB		
+1D715		
+1D735		
+1D74F		
+1D76F		
+1D789		
+1D7A9		
+1D7C3		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SD.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SD.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SD.pl	(revision 14489)
@@ -0,0 +1,38 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Soft_Dotted'
+#
+return <<'END';
+0069	006A	Soft_Dotted
+012F		Soft_Dotted
+0268		Soft_Dotted
+029D		Soft_Dotted
+02B2		Soft_Dotted
+03F3		Soft_Dotted
+0456		Soft_Dotted
+0458		Soft_Dotted
+1D62		Soft_Dotted
+1D96		Soft_Dotted
+1DA4		Soft_Dotted
+1DA8		Soft_Dotted
+1E2D		Soft_Dotted
+1ECB		Soft_Dotted
+2071		Soft_Dotted
+2148	2149	Soft_Dotted
+1D422	1D423	Soft_Dotted
+1D456	1D457	Soft_Dotted
+1D48A	1D48B	Soft_Dotted
+1D4BE	1D4BF	Soft_Dotted
+1D4F2	1D4F3	Soft_Dotted
+1D526	1D527	Soft_Dotted
+1D55A	1D55B	Soft_Dotted
+1D58E	1D58F	Soft_Dotted
+1D5C2	1D5C3	Soft_Dotted
+1D5F6	1D5F7	Soft_Dotted
+1D62A	1D62B	Soft_Dotted
+1D65E	1D65F	Soft_Dotted
+1D692	1D693	Soft_Dotted
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/STerm.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/STerm.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/STerm.pl	(revision 14489)
@@ -0,0 +1,35 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'STerm'
+#
+return <<'END';
+0021		STerm
+002E		STerm
+003F		STerm
+055C		STerm
+055E		STerm
+0589		STerm
+061F		STerm
+06D4		STerm
+0700	0702	STerm
+0964	0965	STerm
+104A	104B	STerm
+1362		STerm
+1367	1368	STerm
+166E		STerm
+1803		STerm
+1809		STerm
+1944	1945	STerm
+203C	203D	STerm
+2047	2049	STerm
+3002		STerm
+FE52		STerm
+FE56	FE57	STerm
+FF01		STerm
+FF0E		STerm
+FF1F		STerm
+FF61		STerm
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sc.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sc.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sc.pl	(revision 14489)
@@ -0,0 +1,27 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Sc}
+# 	\p{Sc} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Sc'
+#
+return <<'END';
+0024		
+00A2	00A5	
+060B		
+09F2	09F3	
+0AF1		
+0BF9		
+0E3F		
+17DB		
+20A0	20B5	
+FDFC		
+FE69		
+FF04		
+FFE0	FFE1	
+FFE5	FFE6	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Shaw.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Shaw.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Shaw.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Shavian} (and fuzzy permutations)
+# 
+# Meaning: Script 'Shavian'
+#
+return <<'END';
+10450	1047F	Shavian
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sinh.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sinh.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sinh.pl	(revision 14489)
@@ -0,0 +1,23 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Sinhala} (and fuzzy permutations)
+# 
+# Meaning: Script 'Sinhala'
+#
+return <<'END';
+0D82	0D83	Sinhala
+0D85	0D96	Sinhala
+0D9A	0DB1	Sinhala
+0DB3	0DBB	Sinhala
+0DBD		Sinhala
+0DC0	0DC6	Sinhala
+0DCA		Sinhala
+0DCF	0DD4	Sinhala
+0DD6		Sinhala
+0DD8	0DDF	Sinhala
+0DF2	0DF4	Sinhala
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sk.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sk.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sk.pl	(revision 14489)
@@ -0,0 +1,36 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Sk}
+# 	\p{Sk} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Sk'
+#
+return <<'END';
+005E		
+0060		
+00A8		
+00AF		
+00B4		
+00B8		
+02C2	02C5	
+02D2	02DF	
+02E5	02ED	
+02EF	02FF	
+0374	0375	
+0384	0385	
+1FBD		
+1FBF	1FC1	
+1FCD	1FCF	
+1FDD	1FDF	
+1FED	1FEF	
+1FFD	1FFE	
+309B	309C	
+A700	A716	
+FF3E		
+FF40		
+FFE3		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sm.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sm.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sm.pl	(revision 14489)
@@ -0,0 +1,72 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Sm}
+# 	\p{Sm} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Sm'
+#
+return <<'END';
+002B		
+003C	003E	
+007C		
+007E		
+00AC		
+00B1		
+00D7		
+00F7		
+03F6		
+2044		
+2052		
+207A	207C	
+208A	208C	
+2140	2144	
+214B		
+2190	2194	
+219A	219B	
+21A0		
+21A3		
+21A6		
+21AE		
+21CE	21CF	
+21D2		
+21D4		
+21F4	22FF	
+2308	230B	
+2320	2321	
+237C		
+239B	23B3	
+25B7		
+25C1		
+25F8	25FF	
+266F		
+27C0	27C4	
+27D0	27E5	
+27F0	27FF	
+2900	2982	
+2999	29D7	
+29DC	29FB	
+29FE	2AFF	
+FB29		
+FE62		
+FE64	FE66	
+FF0B		
+FF1C	FF1E	
+FF5C		
+FF5E		
+FFE2		
+FFE9	FFEC	
+1D6C1		
+1D6DB		
+1D6FB		
+1D715		
+1D735		
+1D74F		
+1D76F		
+1D789		
+1D7A9		
+1D7C3		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/So.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/So.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/So.pl	(revision 14489)
@@ -0,0 +1,133 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{So}
+# 	\p{So} (and fuzzy permutations)
+# 
+# Meaning: General Category 'So'
+#
+return <<'END';
+00A6	00A7	
+00A9		
+00AE		
+00B0		
+00B6		
+0482		
+060E	060F	
+06E9		
+06FD	06FE	
+09FA		
+0B70		
+0BF3	0BF8	
+0BFA		
+0F01	0F03	
+0F13	0F17	
+0F1A	0F1F	
+0F34		
+0F36		
+0F38		
+0FBE	0FC5	
+0FC7	0FCC	
+0FCF		
+1360		
+1390	1399	
+1940		
+19E0	19FF	
+2100	2101	
+2103	2106	
+2108	2109	
+2114		
+2116	2118	
+211E	2123	
+2125		
+2127		
+2129		
+212E		
+2132		
+213A	213B	
+214A		
+214C		
+2195	2199	
+219C	219F	
+21A1	21A2	
+21A4	21A5	
+21A7	21AD	
+21AF	21CD	
+21D0	21D1	
+21D3		
+21D5	21F3	
+2300	2307	
+230C	231F	
+2322	2328	
+232B	237B	
+237D	239A	
+23B7	23DB	
+2400	2426	
+2440	244A	
+249C	24E9	
+2500	25B6	
+25B8	25C0	
+25C2	25F7	
+2600	266E	
+2670	269C	
+26A0	26B1	
+2701	2704	
+2706	2709	
+270C	2727	
+2729	274B	
+274D		
+274F	2752	
+2756		
+2758	275E	
+2761	2767	
+2794		
+2798	27AF	
+27B1	27BE	
+2800	28FF	
+2B00	2B13	
+2CE5	2CEA	
+2E80	2E99	
+2E9B	2EF3	
+2F00	2FD5	
+2FF0	2FFB	
+3004		
+3012	3013	
+3020		
+3036	3037	
+303E	303F	
+3190	3191	
+3196	319F	
+31C0	31CF	
+3200	321E	
+322A	3243	
+3250		
+3260	327F	
+328A	32B0	
+32C0	32FE	
+3300	33FF	
+4DC0	4DFF	
+A490	A4C6	
+A828	A82B	
+FDFD		
+FFE4		
+FFE8		
+FFED	FFEE	
+FFFC	FFFD	
+10102		
+10137	1013F	
+10179	10189	
+103D0		
+1D000	1D0F5	
+1D100	1D126	
+1D12A	1D164	
+1D16A	1D16C	
+1D183	1D184	
+1D18C	1D1A9	
+1D1AE	1D1DD	
+1D200	1D241	
+1D245		
+1D300	1D356	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SoftDott.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SoftDott.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SoftDott.pl	(revision 14489)
@@ -0,0 +1,41 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{SoftDotted} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Soft_Dotted'
+#
+return <<'END';
+0069	006A	Soft_Dotted
+012F		Soft_Dotted
+0268		Soft_Dotted
+029D		Soft_Dotted
+02B2		Soft_Dotted
+03F3		Soft_Dotted
+0456		Soft_Dotted
+0458		Soft_Dotted
+1D62		Soft_Dotted
+1D96		Soft_Dotted
+1DA4		Soft_Dotted
+1DA8		Soft_Dotted
+1E2D		Soft_Dotted
+1ECB		Soft_Dotted
+2071		Soft_Dotted
+2148	2149	Soft_Dotted
+1D422	1D423	Soft_Dotted
+1D456	1D457	Soft_Dotted
+1D48A	1D48B	Soft_Dotted
+1D4BE	1D4BF	Soft_Dotted
+1D4F2	1D4F3	Soft_Dotted
+1D526	1D527	Soft_Dotted
+1D55A	1D55B	Soft_Dotted
+1D58E	1D58F	Soft_Dotted
+1D5C2	1D5C3	Soft_Dotted
+1D5F6	1D5F7	Soft_Dotted
+1D62A	1D62B	Soft_Dotted
+1D65E	1D65F	Soft_Dotted
+1D692	1D693	Soft_Dotted
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Space.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Space.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Space.pl	(revision 14489)
@@ -0,0 +1,23 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Space}
+# 
+# Meaning: [[:Space:]]
+#
+return <<'END';
+0009	000D	
+0020		
+0085		
+00A0		
+1680		
+180E		
+2000	200A	
+2028	2029	
+202F		
+205F		
+3000		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SpacePer.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SpacePer.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SpacePer.pl	(revision 14489)
@@ -0,0 +1,24 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{SpacePerl}
+# 
+# Meaning: \s
+#
+return <<'END';
+0009	000A	
+000C	000D	
+0020		
+0085		
+00A0		
+1680		
+180E		
+2000	200A	
+2028	2029	
+202F		
+205F		
+3000		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sterm2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sterm2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Sterm2.pl	(revision 14489)
@@ -0,0 +1,38 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Sterm} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'STerm'
+#
+return <<'END';
+0021		STerm
+002E		STerm
+003F		STerm
+055C		STerm
+055E		STerm
+0589		STerm
+061F		STerm
+06D4		STerm
+0700	0702	STerm
+0964	0965	STerm
+104A	104B	STerm
+1362		STerm
+1367	1368	STerm
+166E		STerm
+1803		STerm
+1809		STerm
+1944	1945	STerm
+203C	203D	STerm
+2047	2049	STerm
+3002		STerm
+FE52		STerm
+FE56	FE57	STerm
+FF01		STerm
+FF0E		STerm
+FF1F		STerm
+FF61		STerm
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SylotiNa.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SylotiNa.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/SylotiNa.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{SylotiNagri} (and fuzzy permutations)
+# 
+# Meaning: Script 'Syloti_Nagri'
+#
+return <<'END';
+A800	A82B	Syloti_Nagri
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Syrc.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Syrc.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Syrc.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Syriac} (and fuzzy permutations)
+# 
+# Meaning: Script 'Syriac'
+#
+return <<'END';
+0700	070D	Syriac
+070F	074A	Syriac
+074D	074F	Syriac
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tagb.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tagb.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tagb.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Tagbanwa} (and fuzzy permutations)
+# 
+# Meaning: Script 'Tagbanwa'
+#
+return <<'END';
+1760	176C	Tagbanwa
+176E	1770	Tagbanwa
+1772	1773	Tagbanwa
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/TaiLe.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/TaiLe.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/TaiLe.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{TaiLe} (and fuzzy permutations)
+# 
+# Meaning: Script 'Tai_Le'
+#
+return <<'END';
+1950	196D	Tai_Le
+1970	1974	Tai_Le
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Taml.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Taml.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Taml.pl	(revision 14489)
@@ -0,0 +1,27 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Tamil} (and fuzzy permutations)
+# 
+# Meaning: Script 'Tamil'
+#
+return <<'END';
+0B82	0B83	Tamil
+0B85	0B8A	Tamil
+0B8E	0B90	Tamil
+0B92	0B95	Tamil
+0B99	0B9A	Tamil
+0B9C		Tamil
+0B9E	0B9F	Tamil
+0BA3	0BA4	Tamil
+0BA8	0BAA	Tamil
+0BAE	0BB9	Tamil
+0BBE	0BC2	Tamil
+0BC6	0BC8	Tamil
+0BCA	0BCD	Tamil
+0BD7		Tamil
+0BE6	0BFA	Tamil
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Telu.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Telu.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Telu.pl	(revision 14489)
@@ -0,0 +1,24 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Telugu} (and fuzzy permutations)
+# 
+# Meaning: Script 'Telugu'
+#
+return <<'END';
+0C01	0C03	Telugu
+0C05	0C0C	Telugu
+0C0E	0C10	Telugu
+0C12	0C28	Telugu
+0C2A	0C33	Telugu
+0C35	0C39	Telugu
+0C3E	0C44	Telugu
+0C46	0C48	Telugu
+0C4A	0C4D	Telugu
+0C55	0C56	Telugu
+0C60	0C61	Telugu
+0C66	0C6F	Telugu
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Term.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Term.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Term.pl	(revision 14489)
@@ -0,0 +1,49 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Terminal_Punctuation'
+#
+return <<'END';
+0021		Terminal_Punctuation
+002C		Terminal_Punctuation
+002E		Terminal_Punctuation
+003A	003B	Terminal_Punctuation
+003F		Terminal_Punctuation
+037E		Terminal_Punctuation
+0387		Terminal_Punctuation
+0589		Terminal_Punctuation
+05C3		Terminal_Punctuation
+060C		Terminal_Punctuation
+061B		Terminal_Punctuation
+061F		Terminal_Punctuation
+06D4		Terminal_Punctuation
+0700	070A	Terminal_Punctuation
+070C		Terminal_Punctuation
+0964	0965	Terminal_Punctuation
+0E5A	0E5B	Terminal_Punctuation
+0F08		Terminal_Punctuation
+0F0D	0F12	Terminal_Punctuation
+104A	104B	Terminal_Punctuation
+1361	1368	Terminal_Punctuation
+166D	166E	Terminal_Punctuation
+16EB	16ED	Terminal_Punctuation
+17D4	17D6	Terminal_Punctuation
+17DA		Terminal_Punctuation
+1802	1805	Terminal_Punctuation
+1808	1809	Terminal_Punctuation
+1944	1945	Terminal_Punctuation
+203C	203D	Terminal_Punctuation
+2047	2049	Terminal_Punctuation
+3001	3002	Terminal_Punctuation
+FE50	FE52	Terminal_Punctuation
+FE54	FE57	Terminal_Punctuation
+FF01		Terminal_Punctuation
+FF0C		Terminal_Punctuation
+FF0E		Terminal_Punctuation
+FF1A	FF1B	Terminal_Punctuation
+FF1F		Terminal_Punctuation
+FF61		Terminal_Punctuation
+FF64		Terminal_Punctuation
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Terminal.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Terminal.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Terminal.pl	(revision 14489)
@@ -0,0 +1,52 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{TerminalPunctuation} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Terminal_Punctuation'
+#
+return <<'END';
+0021		Terminal_Punctuation
+002C		Terminal_Punctuation
+002E		Terminal_Punctuation
+003A	003B	Terminal_Punctuation
+003F		Terminal_Punctuation
+037E		Terminal_Punctuation
+0387		Terminal_Punctuation
+0589		Terminal_Punctuation
+05C3		Terminal_Punctuation
+060C		Terminal_Punctuation
+061B		Terminal_Punctuation
+061F		Terminal_Punctuation
+06D4		Terminal_Punctuation
+0700	070A	Terminal_Punctuation
+070C		Terminal_Punctuation
+0964	0965	Terminal_Punctuation
+0E5A	0E5B	Terminal_Punctuation
+0F08		Terminal_Punctuation
+0F0D	0F12	Terminal_Punctuation
+104A	104B	Terminal_Punctuation
+1361	1368	Terminal_Punctuation
+166D	166E	Terminal_Punctuation
+16EB	16ED	Terminal_Punctuation
+17D4	17D6	Terminal_Punctuation
+17DA		Terminal_Punctuation
+1802	1805	Terminal_Punctuation
+1808	1809	Terminal_Punctuation
+1944	1945	Terminal_Punctuation
+203C	203D	Terminal_Punctuation
+2047	2049	Terminal_Punctuation
+3001	3002	Terminal_Punctuation
+FE50	FE52	Terminal_Punctuation
+FE54	FE57	Terminal_Punctuation
+FF01		Terminal_Punctuation
+FF0C		Terminal_Punctuation
+FF0E		Terminal_Punctuation
+FF1A	FF1B	Terminal_Punctuation
+FF1F		Terminal_Punctuation
+FF61		Terminal_Punctuation
+FF64		Terminal_Punctuation
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tfng.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tfng.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tfng.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Tifinagh} (and fuzzy permutations)
+# 
+# Meaning: Script 'Tifinagh'
+#
+return <<'END';
+2D30	2D65	Tifinagh
+2D6F		Tifinagh
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tglg.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tglg.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tglg.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Tagalog} (and fuzzy permutations)
+# 
+# Meaning: Script 'Tagalog'
+#
+return <<'END';
+1700	170C	Tagalog
+170E	1714	Tagalog
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Thaa.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Thaa.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Thaa.pl	(revision 14489)
@@ -0,0 +1,13 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Thaana} (and fuzzy permutations)
+# 
+# Meaning: Script 'Thaana'
+#
+return <<'END';
+0780	07B1	Thaana
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Thai.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Thai.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Thai.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Thai} (and fuzzy permutations)
+# 
+# Meaning: Script 'Thai'
+#
+return <<'END';
+0E01	0E3A	Thai
+0E40	0E5B	Thai
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tibt.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tibt.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Tibt.pl	(revision 14489)
@@ -0,0 +1,19 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Tibetan} (and fuzzy permutations)
+# 
+# Meaning: Script 'Tibetan'
+#
+return <<'END';
+0F00	0F47	Tibetan
+0F49	0F6A	Tibetan
+0F71	0F8B	Tibetan
+0F90	0F97	Tibetan
+0F99	0FBC	Tibetan
+0FBE	0FCC	Tibetan
+0FCF	0FD1	Tibetan
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Title.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Title.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Title.pl	(revision 14489)
@@ -0,0 +1,22 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Title}
+# 
+# Meaning: [[:Title:]]
+#
+return <<'END';
+01C5		
+01C8		
+01CB		
+01F2		
+1F88	1F8F	
+1F98	1F9F	
+1FA8	1FAF	
+1FBC		
+1FCC		
+1FFC		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/UIdeo.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/UIdeo.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/UIdeo.pl	(revision 14489)
@@ -0,0 +1,19 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Unified_Ideograph'
+#
+return <<'END';
+3400	4DB5	Unified_Ideograph
+4E00	9FBB	Unified_Ideograph
+FA0E	FA0F	Unified_Ideograph
+FA11		Unified_Ideograph
+FA13	FA14	Unified_Ideograph
+FA1F		Unified_Ideograph
+FA21		Unified_Ideograph
+FA23	FA24	Unified_Ideograph
+FA27	FA29	Unified_Ideograph
+20000	2A6D6	Unified_Ideograph
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ugar.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ugar.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Ugar.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Ugaritic} (and fuzzy permutations)
+# 
+# Meaning: Script 'Ugaritic'
+#
+return <<'END';
+10380	1039D	Ugaritic
+1039F		Ugaritic
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/UnifiedI.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/UnifiedI.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/UnifiedI.pl	(revision 14489)
@@ -0,0 +1,22 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{UnifiedIdeograph} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Unified_Ideograph'
+#
+return <<'END';
+3400	4DB5	Unified_Ideograph
+4E00	9FBB	Unified_Ideograph
+FA0E	FA0F	Unified_Ideograph
+FA11		Unified_Ideograph
+FA13	FA14	Unified_Ideograph
+FA1F		Unified_Ideograph
+FA21		Unified_Ideograph
+FA23	FA24	Unified_Ideograph
+FA27	FA29	Unified_Ideograph
+20000	2A6D6	Unified_Ideograph
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Upper.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Upper.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Upper.pl	(revision 14489)
@@ -0,0 +1,488 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Upper}
+# 
+# Meaning: [[:Upper:]]
+#
+return <<'END';
+0041	005A	
+00C0	00D6	
+00D8	00DE	
+0100		
+0102		
+0104		
+0106		
+0108		
+010A		
+010C		
+010E		
+0110		
+0112		
+0114		
+0116		
+0118		
+011A		
+011C		
+011E		
+0120		
+0122		
+0124		
+0126		
+0128		
+012A		
+012C		
+012E		
+0130		
+0132		
+0134		
+0136		
+0139		
+013B		
+013D		
+013F		
+0141		
+0143		
+0145		
+0147		
+014A		
+014C		
+014E		
+0150		
+0152		
+0154		
+0156		
+0158		
+015A		
+015C		
+015E		
+0160		
+0162		
+0164		
+0166		
+0168		
+016A		
+016C		
+016E		
+0170		
+0172		
+0174		
+0176		
+0178	0179	
+017B		
+017D		
+0181	0182	
+0184		
+0186	0187	
+0189	018B	
+018E	0191	
+0193	0194	
+0196	0198	
+019C	019D	
+019F	01A0	
+01A2		
+01A4		
+01A6	01A7	
+01A9		
+01AC		
+01AE	01AF	
+01B1	01B3	
+01B5		
+01B7	01B8	
+01BC		
+01C4		
+01C7		
+01CA		
+01CD		
+01CF		
+01D1		
+01D3		
+01D5		
+01D7		
+01D9		
+01DB		
+01DE		
+01E0		
+01E2		
+01E4		
+01E6		
+01E8		
+01EA		
+01EC		
+01EE		
+01F1		
+01F4		
+01F6	01F8	
+01FA		
+01FC		
+01FE		
+0200		
+0202		
+0204		
+0206		
+0208		
+020A		
+020C		
+020E		
+0210		
+0212		
+0214		
+0216		
+0218		
+021A		
+021C		
+021E		
+0220		
+0222		
+0224		
+0226		
+0228		
+022A		
+022C		
+022E		
+0230		
+0232		
+023A	023B	
+023D	023E	
+0241		
+0386		
+0388	038A	
+038C		
+038E	038F	
+0391	03A1	
+03A3	03AB	
+03D2	03D4	
+03D8		
+03DA		
+03DC		
+03DE		
+03E0		
+03E2		
+03E4		
+03E6		
+03E8		
+03EA		
+03EC		
+03EE		
+03F4		
+03F7		
+03F9	03FA	
+03FD	042F	
+0460		
+0462		
+0464		
+0466		
+0468		
+046A		
+046C		
+046E		
+0470		
+0472		
+0474		
+0476		
+0478		
+047A		
+047C		
+047E		
+0480		
+048A		
+048C		
+048E		
+0490		
+0492		
+0494		
+0496		
+0498		
+049A		
+049C		
+049E		
+04A0		
+04A2		
+04A4		
+04A6		
+04A8		
+04AA		
+04AC		
+04AE		
+04B0		
+04B2		
+04B4		
+04B6		
+04B8		
+04BA		
+04BC		
+04BE		
+04C0	04C1	
+04C3		
+04C5		
+04C7		
+04C9		
+04CB		
+04CD		
+04D0		
+04D2		
+04D4		
+04D6		
+04D8		
+04DA		
+04DC		
+04DE		
+04E0		
+04E2		
+04E4		
+04E6		
+04E8		
+04EA		
+04EC		
+04EE		
+04F0		
+04F2		
+04F4		
+04F6		
+04F8		
+0500		
+0502		
+0504		
+0506		
+0508		
+050A		
+050C		
+050E		
+0531	0556	
+10A0	10C5	
+1E00		
+1E02		
+1E04		
+1E06		
+1E08		
+1E0A		
+1E0C		
+1E0E		
+1E10		
+1E12		
+1E14		
+1E16		
+1E18		
+1E1A		
+1E1C		
+1E1E		
+1E20		
+1E22		
+1E24		
+1E26		
+1E28		
+1E2A		
+1E2C		
+1E2E		
+1E30		
+1E32		
+1E34		
+1E36		
+1E38		
+1E3A		
+1E3C		
+1E3E		
+1E40		
+1E42		
+1E44		
+1E46		
+1E48		
+1E4A		
+1E4C		
+1E4E		
+1E50		
+1E52		
+1E54		
+1E56		
+1E58		
+1E5A		
+1E5C		
+1E5E		
+1E60		
+1E62		
+1E64		
+1E66		
+1E68		
+1E6A		
+1E6C		
+1E6E		
+1E70		
+1E72		
+1E74		
+1E76		
+1E78		
+1E7A		
+1E7C		
+1E7E		
+1E80		
+1E82		
+1E84		
+1E86		
+1E88		
+1E8A		
+1E8C		
+1E8E		
+1E90		
+1E92		
+1E94		
+1EA0		
+1EA2		
+1EA4		
+1EA6		
+1EA8		
+1EAA		
+1EAC		
+1EAE		
+1EB0		
+1EB2		
+1EB4		
+1EB6		
+1EB8		
+1EBA		
+1EBC		
+1EBE		
+1EC0		
+1EC2		
+1EC4		
+1EC6		
+1EC8		
+1ECA		
+1ECC		
+1ECE		
+1ED0		
+1ED2		
+1ED4		
+1ED6		
+1ED8		
+1EDA		
+1EDC		
+1EDE		
+1EE0		
+1EE2		
+1EE4		
+1EE6		
+1EE8		
+1EEA		
+1EEC		
+1EEE		
+1EF0		
+1EF2		
+1EF4		
+1EF6		
+1EF8		
+1F08	1F0F	
+1F18	1F1D	
+1F28	1F2F	
+1F38	1F3F	
+1F48	1F4D	
+1F59		
+1F5B		
+1F5D		
+1F5F		
+1F68	1F6F	
+1FB8	1FBB	
+1FC8	1FCB	
+1FD8	1FDB	
+1FE8	1FEC	
+1FF8	1FFB	
+2102		
+2107		
+210B	210D	
+2110	2112	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+2130	2131	
+2133		
+213E	213F	
+2145		
+2C00	2C2E	
+2C80		
+2C82		
+2C84		
+2C86		
+2C88		
+2C8A		
+2C8C		
+2C8E		
+2C90		
+2C92		
+2C94		
+2C96		
+2C98		
+2C9A		
+2C9C		
+2C9E		
+2CA0		
+2CA2		
+2CA4		
+2CA6		
+2CA8		
+2CAA		
+2CAC		
+2CAE		
+2CB0		
+2CB2		
+2CB4		
+2CB6		
+2CB8		
+2CBA		
+2CBC		
+2CBE		
+2CC0		
+2CC2		
+2CC4		
+2CC6		
+2CC8		
+2CCA		
+2CCC		
+2CCE		
+2CD0		
+2CD2		
+2CD4		
+2CD6		
+2CD8		
+2CDA		
+2CDC		
+2CDE		
+2CE0		
+2CE2		
+FF21	FF3A	
+10400	10427	
+1D400	1D419	
+1D434	1D44D	
+1D468	1D481	
+1D49C		
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B5	
+1D4D0	1D4E9	
+1D504	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D538	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D56C	1D585	
+1D5A0	1D5B9	
+1D5D4	1D5ED	
+1D608	1D621	
+1D63C	1D655	
+1D670	1D689	
+1D6A8	1D6C0	
+1D6E2	1D6FA	
+1D71C	1D734	
+1D756	1D76E	
+1D790	1D7A8	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Uppercas.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Uppercas.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Uppercas.pl	(revision 14489)
@@ -0,0 +1,490 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Uppercase} (and fuzzy permutations)
+# 
+# Meaning: [\p{Lu}\p{Other_Uppercase}]
+#
+return <<'END';
+0041	005A	
+00C0	00D6	
+00D8	00DE	
+0100		
+0102		
+0104		
+0106		
+0108		
+010A		
+010C		
+010E		
+0110		
+0112		
+0114		
+0116		
+0118		
+011A		
+011C		
+011E		
+0120		
+0122		
+0124		
+0126		
+0128		
+012A		
+012C		
+012E		
+0130		
+0132		
+0134		
+0136		
+0139		
+013B		
+013D		
+013F		
+0141		
+0143		
+0145		
+0147		
+014A		
+014C		
+014E		
+0150		
+0152		
+0154		
+0156		
+0158		
+015A		
+015C		
+015E		
+0160		
+0162		
+0164		
+0166		
+0168		
+016A		
+016C		
+016E		
+0170		
+0172		
+0174		
+0176		
+0178	0179	
+017B		
+017D		
+0181	0182	
+0184		
+0186	0187	
+0189	018B	
+018E	0191	
+0193	0194	
+0196	0198	
+019C	019D	
+019F	01A0	
+01A2		
+01A4		
+01A6	01A7	
+01A9		
+01AC		
+01AE	01AF	
+01B1	01B3	
+01B5		
+01B7	01B8	
+01BC		
+01C4		
+01C7		
+01CA		
+01CD		
+01CF		
+01D1		
+01D3		
+01D5		
+01D7		
+01D9		
+01DB		
+01DE		
+01E0		
+01E2		
+01E4		
+01E6		
+01E8		
+01EA		
+01EC		
+01EE		
+01F1		
+01F4		
+01F6	01F8	
+01FA		
+01FC		
+01FE		
+0200		
+0202		
+0204		
+0206		
+0208		
+020A		
+020C		
+020E		
+0210		
+0212		
+0214		
+0216		
+0218		
+021A		
+021C		
+021E		
+0220		
+0222		
+0224		
+0226		
+0228		
+022A		
+022C		
+022E		
+0230		
+0232		
+023A	023B	
+023D	023E	
+0241		
+0386		
+0388	038A	
+038C		
+038E	038F	
+0391	03A1	
+03A3	03AB	
+03D2	03D4	
+03D8		
+03DA		
+03DC		
+03DE		
+03E0		
+03E2		
+03E4		
+03E6		
+03E8		
+03EA		
+03EC		
+03EE		
+03F4		
+03F7		
+03F9	03FA	
+03FD	042F	
+0460		
+0462		
+0464		
+0466		
+0468		
+046A		
+046C		
+046E		
+0470		
+0472		
+0474		
+0476		
+0478		
+047A		
+047C		
+047E		
+0480		
+048A		
+048C		
+048E		
+0490		
+0492		
+0494		
+0496		
+0498		
+049A		
+049C		
+049E		
+04A0		
+04A2		
+04A4		
+04A6		
+04A8		
+04AA		
+04AC		
+04AE		
+04B0		
+04B2		
+04B4		
+04B6		
+04B8		
+04BA		
+04BC		
+04BE		
+04C0	04C1	
+04C3		
+04C5		
+04C7		
+04C9		
+04CB		
+04CD		
+04D0		
+04D2		
+04D4		
+04D6		
+04D8		
+04DA		
+04DC		
+04DE		
+04E0		
+04E2		
+04E4		
+04E6		
+04E8		
+04EA		
+04EC		
+04EE		
+04F0		
+04F2		
+04F4		
+04F6		
+04F8		
+0500		
+0502		
+0504		
+0506		
+0508		
+050A		
+050C		
+050E		
+0531	0556	
+10A0	10C5	
+1E00		
+1E02		
+1E04		
+1E06		
+1E08		
+1E0A		
+1E0C		
+1E0E		
+1E10		
+1E12		
+1E14		
+1E16		
+1E18		
+1E1A		
+1E1C		
+1E1E		
+1E20		
+1E22		
+1E24		
+1E26		
+1E28		
+1E2A		
+1E2C		
+1E2E		
+1E30		
+1E32		
+1E34		
+1E36		
+1E38		
+1E3A		
+1E3C		
+1E3E		
+1E40		
+1E42		
+1E44		
+1E46		
+1E48		
+1E4A		
+1E4C		
+1E4E		
+1E50		
+1E52		
+1E54		
+1E56		
+1E58		
+1E5A		
+1E5C		
+1E5E		
+1E60		
+1E62		
+1E64		
+1E66		
+1E68		
+1E6A		
+1E6C		
+1E6E		
+1E70		
+1E72		
+1E74		
+1E76		
+1E78		
+1E7A		
+1E7C		
+1E7E		
+1E80		
+1E82		
+1E84		
+1E86		
+1E88		
+1E8A		
+1E8C		
+1E8E		
+1E90		
+1E92		
+1E94		
+1EA0		
+1EA2		
+1EA4		
+1EA6		
+1EA8		
+1EAA		
+1EAC		
+1EAE		
+1EB0		
+1EB2		
+1EB4		
+1EB6		
+1EB8		
+1EBA		
+1EBC		
+1EBE		
+1EC0		
+1EC2		
+1EC4		
+1EC6		
+1EC8		
+1ECA		
+1ECC		
+1ECE		
+1ED0		
+1ED2		
+1ED4		
+1ED6		
+1ED8		
+1EDA		
+1EDC		
+1EDE		
+1EE0		
+1EE2		
+1EE4		
+1EE6		
+1EE8		
+1EEA		
+1EEC		
+1EEE		
+1EF0		
+1EF2		
+1EF4		
+1EF6		
+1EF8		
+1F08	1F0F	
+1F18	1F1D	
+1F28	1F2F	
+1F38	1F3F	
+1F48	1F4D	
+1F59		
+1F5B		
+1F5D		
+1F5F		
+1F68	1F6F	
+1FB8	1FBB	
+1FC8	1FCB	
+1FD8	1FDB	
+1FE8	1FEC	
+1FF8	1FFB	
+2102		
+2107		
+210B	210D	
+2110	2112	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+2130	2131	
+2133		
+213E	213F	
+2145		
+2160	216F	
+24B6	24CF	
+2C00	2C2E	
+2C80		
+2C82		
+2C84		
+2C86		
+2C88		
+2C8A		
+2C8C		
+2C8E		
+2C90		
+2C92		
+2C94		
+2C96		
+2C98		
+2C9A		
+2C9C		
+2C9E		
+2CA0		
+2CA2		
+2CA4		
+2CA6		
+2CA8		
+2CAA		
+2CAC		
+2CAE		
+2CB0		
+2CB2		
+2CB4		
+2CB6		
+2CB8		
+2CBA		
+2CBC		
+2CBE		
+2CC0		
+2CC2		
+2CC4		
+2CC6		
+2CC8		
+2CCA		
+2CCC		
+2CCE		
+2CD0		
+2CD2		
+2CD4		
+2CD6		
+2CD8		
+2CDA		
+2CDC		
+2CDE		
+2CE0		
+2CE2		
+FF21	FF3A	
+10400	10427	
+1D400	1D419	
+1D434	1D44D	
+1D468	1D481	
+1D49C		
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B5	
+1D4D0	1D4E9	
+1D504	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D538	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D56C	1D585	
+1D5A0	1D5B9	
+1D5D4	1D5ED	
+1D608	1D621	
+1D63C	1D655	
+1D670	1D689	
+1D6A8	1D6C0	
+1D6E2	1D6FA	
+1D71C	1D734	
+1D756	1D76E	
+1D790	1D7A8	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/VS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/VS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/VS.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'Variation_Selector'
+#
+return <<'END';
+180B	180D	Variation_Selector
+FE00	FE0F	Variation_Selector
+E0100	E01EF	Variation_Selector
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Variatio.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Variatio.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Variatio.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{VariationSelector} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'Variation_Selector'
+#
+return <<'END';
+180B	180D	Variation_Selector
+FE00	FE0F	Variation_Selector
+E0100	E01EF	Variation_Selector
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/WSpace.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/WSpace.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/WSpace.pl	(revision 14489)
@@ -0,0 +1,20 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Binary property 'White_Space'
+#
+return <<'END';
+0009	000D	White_Space
+0020		White_Space
+0085		White_Space
+00A0		White_Space
+1680		White_Space
+180E		White_Space
+2000	200A	White_Space
+2028	2029	White_Space
+202F		White_Space
+205F		White_Space
+3000		White_Space
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/WhiteSpa.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/WhiteSpa.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/WhiteSpa.pl	(revision 14489)
@@ -0,0 +1,23 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{WhiteSpace} (and fuzzy permutations)
+# 
+# Meaning: Extended property 'White_Space'
+#
+return <<'END';
+0009	000D	White_Space
+0020		White_Space
+0085		White_Space
+00A0		White_Space
+1680		White_Space
+180E		White_Space
+2000	200A	White_Space
+2028	2029	White_Space
+202F		White_Space
+205F		White_Space
+3000		White_Space
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Word.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Word.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Word.pl	(revision 14489)
@@ -0,0 +1,476 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Word}
+# 
+# Meaning: [[:Word:]]
+#
+return <<'END';
+0030	0039	
+0041	005A	
+005F		
+0061	007A	
+00AA		
+00B2	00B3	
+00B5		
+00B9	00BA	
+00BC	00BE	
+00C0	00D6	
+00D8	00F6	
+00F8	0241	
+0250	02C1	
+02C6	02D1	
+02E0	02E4	
+02EE		
+0300	036F	
+037A		
+0386		
+0388	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	03F5	
+03F7	0481	
+0483	0486	
+0488	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559		
+0561	0587	
+0591	05B9	
+05BB	05BD	
+05BF		
+05C1	05C2	
+05C4	05C5	
+05C7		
+05D0	05EA	
+05F0	05F2	
+0610	0615	
+0621	063A	
+0640	065E	
+0660	0669	
+066E	06D3	
+06D5	06DC	
+06DE	06E8	
+06EA	06FC	
+06FF		
+0710	074A	
+074D	076D	
+0780	07B1	
+0901	0939	
+093C	094D	
+0950	0954	
+0958	0963	
+0966	096F	
+097D		
+0981	0983	
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BC	09C4	
+09C7	09C8	
+09CB	09CE	
+09D7		
+09DC	09DD	
+09DF	09E3	
+09E6	09F1	
+09F4	09F9	
+0A01	0A03	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A3C		
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A59	0A5C	
+0A5E		
+0A66	0A74	
+0A81	0A83	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABC	0AC5	
+0AC7	0AC9	
+0ACB	0ACD	
+0AD0		
+0AE0	0AE3	
+0AE6	0AEF	
+0B01	0B03	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3C	0B43	
+0B47	0B48	
+0B4B	0B4D	
+0B56	0B57	
+0B5C	0B5D	
+0B5F	0B61	
+0B66	0B6F	
+0B71		
+0B82	0B83	
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCD	
+0BD7		
+0BE6	0BF2	
+0C01	0C03	
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0C60	0C61	
+0C66	0C6F	
+0C82	0C83	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBC	0CC4	
+0CC6	0CC8	
+0CCA	0CCD	
+0CD5	0CD6	
+0CDE		
+0CE0	0CE1	
+0CE6	0CEF	
+0D02	0D03	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4D	
+0D57		
+0D60	0D61	
+0D66	0D6F	
+0D82	0D83	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DCA		
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF3	
+0E01	0E3A	
+0E40	0E4E	
+0E50	0E59	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB9	
+0EBB	0EBD	
+0EC0	0EC4	
+0EC6		
+0EC8	0ECD	
+0ED0	0ED9	
+0EDC	0EDD	
+0F00		
+0F18	0F19	
+0F20	0F33	
+0F35		
+0F37		
+0F39		
+0F3E	0F47	
+0F49	0F6A	
+0F71	0F84	
+0F86	0F8B	
+0F90	0F97	
+0F99	0FBC	
+0FC6		
+1000	1021	
+1023	1027	
+1029	102A	
+102C	1032	
+1036	1039	
+1040	1049	
+1050	1059	
+10A0	10C5	
+10D0	10FA	
+10FC		
+1100	1159	
+115F	11A2	
+11A8	11F9	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+135F		
+1369	137C	
+1380	138F	
+13A0	13F4	
+1401	166C	
+166F	1676	
+1681	169A	
+16A0	16EA	
+16EE	16F0	
+1700	170C	
+170E	1714	
+1720	1734	
+1740	1753	
+1760	176C	
+176E	1770	
+1772	1773	
+1780	17B3	
+17B6	17D3	
+17D7		
+17DC	17DD	
+17E0	17E9	
+17F0	17F9	
+180B	180D	
+1810	1819	
+1820	1877	
+1880	18A9	
+1900	191C	
+1920	192B	
+1930	193B	
+1946	196D	
+1970	1974	
+1980	19A9	
+19B0	19C9	
+19D0	19D9	
+1A00	1A1B	
+1D00	1DC3	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FBC	
+1FBE		
+1FC2	1FC4	
+1FC6	1FCC	
+1FD0	1FD3	
+1FD6	1FDB	
+1FE0	1FEC	
+1FF2	1FF4	
+1FF6	1FFC	
+203F	2040	
+2054		
+2070	2071	
+2074	2079	
+207F	2089	
+2090	2094	
+20D0	20EB	
+2102		
+2107		
+210A	2113	
+2115		
+2119	211D	
+2124		
+2126		
+2128		
+212A	212D	
+212F	2131	
+2133	2139	
+213C	213F	
+2145	2149	
+2153	2183	
+2460	249B	
+24EA	24FF	
+2776	2793	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CE4	
+2CFD		
+2D00	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+3005	3007	
+3021	302F	
+3031	3035	
+3038	303C	
+3041	3096	
+3099	309A	
+309D	309F	
+30A1	30FA	
+30FC	30FF	
+3105	312C	
+3131	318E	
+3192	3195	
+31A0	31B7	
+31F0	31FF	
+3220	3229	
+3251	325F	
+3280	3289	
+32B1	32BF	
+3400	4DB5	
+4E00	9FBB	
+A000	A48C	
+A800	A827	
+AC00	D7A3	
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FB00	FB06	
+FB13	FB17	
+FB1D	FB28	
+FB2A	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFB	
+FE00	FE0F	
+FE20	FE23	
+FE33	FE34	
+FE4D	FE4F	
+FE70	FE74	
+FE76	FEFC	
+FF10	FF19	
+FF21	FF3A	
+FF3F		
+FF41	FF5A	
+FF66	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10107	10133	
+10140	10178	
+1018A		
+10300	1031E	
+10320	10323	
+10330	1034A	
+10380	1039D	
+103A0	103C3	
+103C8	103CF	
+103D1	103D5	
+10400	1049D	
+104A0	104A9	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00	10A03	
+10A05	10A06	
+10A0C	10A13	
+10A15	10A17	
+10A19	10A33	
+10A38	10A3A	
+10A3F	10A47	
+1D165	1D169	
+1D16D	1D172	
+1D17B	1D182	
+1D185	1D18B	
+1D1AA	1D1AD	
+1D242	1D244	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D6C0	
+1D6C2	1D6DA	
+1D6DC	1D6FA	
+1D6FC	1D714	
+1D716	1D734	
+1D736	1D74E	
+1D750	1D76E	
+1D770	1D788	
+1D78A	1D7A8	
+1D7AA	1D7C2	
+1D7C4	1D7C9	
+1D7CE	1D7FF	
+20000	2A6D6	
+2F800	2FA1D	
+E0100	E01EF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/XDigit.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/XDigit.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/XDigit.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{XDigit}
+# 
+# Meaning: [[:XDigit:]]
+#
+return <<'END';
+0030	0039	
+0041	0046	
+0061	0066	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Yiii.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Yiii.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Yiii.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Yi} (and fuzzy permutations)
+# 
+# Meaning: Script 'Yi'
+#
+return <<'END';
+A000	A48C	Yi
+A490	A4C6	Yi
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Z.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Z.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Z.pl	(revision 14489)
@@ -0,0 +1,22 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Z}
+# 	\p{Z} (and fuzzy permutations)
+# 
+# Meaning: Major Category 'Z'
+#
+return <<'END';
+0020		
+00A0		
+1680		
+180E		
+2000	200A	
+2028	2029	
+202F		
+205F		
+3000		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zl.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zl.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zl.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Zl}
+# 	\p{Zl} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Zl'
+#
+return <<'END';
+2028		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zp.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zp.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zp.pl	(revision 14489)
@@ -0,0 +1,14 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Zp}
+# 	\p{Zp} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Zp'
+#
+return <<'END';
+2029		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zs.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zs.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zs.pl	(revision 14489)
@@ -0,0 +1,21 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Zs}
+# 	\p{Zs} (and fuzzy permutations)
+# 
+# Meaning: General Category 'Zs'
+#
+return <<'END';
+0020		
+00A0		
+1680		
+180E		
+2000	200A	
+202F		
+205F		
+3000		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zyyy.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zyyy.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/Zyyy.pl	(revision 14489)
@@ -0,0 +1,138 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{Common} (and fuzzy permutations)
+# 
+# Meaning: Script 'Common'
+#
+return <<'END';
+0000	0040	Common
+005B	0060	Common
+007B	00A9	Common
+00AB	00B9	Common
+00BB	00BF	Common
+00D7		Common
+00F7		Common
+02B9	02DF	Common
+02E5	02FF	Common
+037E		Common
+0387		Common
+0589		Common
+0600	0603	Common
+060C		Common
+061B		Common
+061F		Common
+0640		Common
+0660	0669	Common
+06DD		Common
+0964	0965	Common
+0970		Common
+0E3F		Common
+10FB		Common
+16EB	16ED	Common
+1735	1736	Common
+2000	200B	Common
+200E	2063	Common
+206A	2070	Common
+2074	207E	Common
+2080	208E	Common
+20A0	20B5	Common
+2100	2125	Common
+2127	2129	Common
+212C	214C	Common
+2153	2183	Common
+2190	23DB	Common
+2400	2426	Common
+2440	244A	Common
+2460	269C	Common
+26A0	26B1	Common
+2701	2704	Common
+2706	2709	Common
+270C	2727	Common
+2729	274B	Common
+274D		Common
+274F	2752	Common
+2756		Common
+2758	275E	Common
+2761	2794	Common
+2798	27AF	Common
+27B1	27BE	Common
+27C0	27C6	Common
+27D0	27EB	Common
+27F0	27FF	Common
+2900	2B13	Common
+2E00	2E17	Common
+2E1C	2E1D	Common
+2FF0	2FFB	Common
+3000	3004	Common
+3006		Common
+3008	3020	Common
+3030	3037	Common
+303C	303F	Common
+309B	309C	Common
+30A0		Common
+30FB	30FC	Common
+3190	319F	Common
+31C0	31CF	Common
+3220	3243	Common
+3250	325F	Common
+327E	32FE	Common
+3300	33FF	Common
+4DC0	4DFF	Common
+A700	A716	Common
+E000	F8FF	Common
+FD3E	FD3F	Common
+FDFD		Common
+FE10	FE19	Common
+FE30	FE52	Common
+FE54	FE66	Common
+FE68	FE6B	Common
+FEFF		Common
+FF01	FF20	Common
+FF3B	FF40	Common
+FF5B	FF65	Common
+FF70		Common
+FF9E	FF9F	Common
+FFE0	FFE6	Common
+FFE8	FFEE	Common
+FFF9	FFFD	Common
+10100	10102	Common
+10107	10133	Common
+10137	1013F	Common
+1D000	1D0F5	Common
+1D100	1D126	Common
+1D12A	1D166	Common
+1D16A	1D17A	Common
+1D183	1D184	Common
+1D18C	1D1A9	Common
+1D1AE	1D1DD	Common
+1D300	1D356	Common
+1D400	1D454	Common
+1D456	1D49C	Common
+1D49E	1D49F	Common
+1D4A2		Common
+1D4A5	1D4A6	Common
+1D4A9	1D4AC	Common
+1D4AE	1D4B9	Common
+1D4BB		Common
+1D4BD	1D4C3	Common
+1D4C5	1D505	Common
+1D507	1D50A	Common
+1D50D	1D514	Common
+1D516	1D51C	Common
+1D51E	1D539	Common
+1D53B	1D53E	Common
+1D540	1D544	Common
+1D546		Common
+1D54A	1D550	Common
+1D552	1D6A5	Common
+1D6A8	1D7C9	Common
+1D7CE	1D7FF	Common
+E0001		Common
+E0020	E007F	Common
+F0000	FFFFD	Common
+100000	10FFFD	Common
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/_CanonDC.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/_CanonDC.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/_CanonDC.pl	(revision 14489)
@@ -0,0 +1,16 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{_CanonDCIJ}
+# 
+# Meaning: (for internal casefolding use)
+#
+return <<'END';
+0069	006A	
+012F		
+1E2D		
+1ECB		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/_CaseIgn.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/_CaseIgn.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/_CaseIgn.pl	(revision 14489)
@@ -0,0 +1,138 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{_CaseIgnorable}
+# 
+# Meaning: (for internal casefolding use)
+#
+return <<'END';
+00AD		
+0300	036F	
+0483	0486	
+0591	05B9	
+05BB	05BD	
+05BF		
+05C1	05C2	
+05C4	05C5	
+05C7		
+0610	0615	
+064B	065E	
+0670		
+06D6	06DC	
+06DF	06E4	
+06E7	06E8	
+06EA	06ED	
+0711		
+0730	074A	
+07A6	07B0	
+0901	0902	
+093C		
+0941	0948	
+094D		
+0951	0954	
+0962	0963	
+0981		
+09BC		
+09C1	09C4	
+09CD		
+09E2	09E3	
+0A01	0A02	
+0A3C		
+0A41	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A70	0A71	
+0A81	0A82	
+0ABC		
+0AC1	0AC5	
+0AC7	0AC8	
+0ACD		
+0AE2	0AE3	
+0B01		
+0B3C		
+0B3F		
+0B41	0B43	
+0B4D		
+0B56		
+0B82		
+0BC0		
+0BCD		
+0C3E	0C40	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0CBC		
+0CBF		
+0CC6		
+0CCC	0CCD	
+0D41	0D43	
+0D4D		
+0DCA		
+0DD2	0DD4	
+0DD6		
+0E31		
+0E34	0E3A	
+0E47	0E4E	
+0EB1		
+0EB4	0EB9	
+0EBB	0EBC	
+0EC8	0ECD	
+0F18	0F19	
+0F35		
+0F37		
+0F39		
+0F71	0F7E	
+0F80	0F84	
+0F86	0F87	
+0F90	0F97	
+0F99	0FBC	
+0FC6		
+102D	1030	
+1032		
+1036	1037	
+1039		
+1058	1059	
+135F		
+1712	1714	
+1732	1734	
+1752	1753	
+1772	1773	
+17B7	17BD	
+17C6		
+17C9	17D3	
+17DD		
+180B	180D	
+18A9		
+1920	1922	
+1927	1928	
+1932		
+1939	193B	
+1A17	1A18	
+1DC0	1DC3	
+2010		
+20D0	20DC	
+20E1		
+20E5	20EB	
+302A	302F	
+3099	309A	
+A806		
+A80B		
+A825	A826	
+FB1E		
+FE00	FE0F	
+FE20	FE23	
+10A01	10A03	
+10A05	10A06	
+10A0C	10A0F	
+10A38	10A3A	
+10A3F		
+1D167	1D169	
+1D17B	1D182	
+1D185	1D18B	
+1D1AA	1D1AD	
+1D242	1D244	
+E0100	E01EF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/_CombAbo.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/_CombAbo.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/gc_sc/_CombAbo.pl	(revision 14489)
@@ -0,0 +1,69 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# 	\p{_CombAbove}
+# 
+# Meaning: (for internal casefolding use)
+#
+return <<'END';
+0300	0314	
+033D	0344	
+0346		
+034A	034C	
+0350	0352	
+0357		
+035B		
+0363	036F	
+0483	0486	
+0592	0595	
+0597	0599	
+059C	05A1	
+05A8	05A9	
+05AB	05AC	
+05AF		
+05C4		
+0610	0615	
+0653	0654	
+0657	065B	
+065D	065E	
+06D6	06DC	
+06DF	06E2	
+06E4		
+06E7	06E8	
+06EB	06EC	
+0730		
+0732	0733	
+0735	0736	
+073A		
+073D		
+073F	0741	
+0743		
+0745		
+0747		
+0749	074A	
+0951		
+0953	0954	
+0F82	0F83	
+0F86	0F87	
+135F		
+17DD		
+193A		
+1A17		
+1DC0	1DC1	
+1DC3		
+20D0	20D1	
+20D4	20D7	
+20DB	20DC	
+20E1		
+20E7		
+20E9		
+FE20	FE23	
+10A0F		
+10A38		
+1D185	1D189	
+1D1AA	1D1AD	
+1D242	1D244	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/L.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/L.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/L.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# HangulSyllableType category 'Leading_Jamo'
+#
+return <<'END';
+1100	1159	
+115F		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/LV.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/LV.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/LV.pl	(revision 14489)
@@ -0,0 +1,408 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# HangulSyllableType category 'LV_Syllable'
+#
+return <<'END';
+AC00		
+AC1C		
+AC38		
+AC54		
+AC70		
+AC8C		
+ACA8		
+ACC4		
+ACE0		
+ACFC		
+AD18		
+AD34		
+AD50		
+AD6C		
+AD88		
+ADA4		
+ADC0		
+ADDC		
+ADF8		
+AE14		
+AE30		
+AE4C		
+AE68		
+AE84		
+AEA0		
+AEBC		
+AED8		
+AEF4		
+AF10		
+AF2C		
+AF48		
+AF64		
+AF80		
+AF9C		
+AFB8		
+AFD4		
+AFF0		
+B00C		
+B028		
+B044		
+B060		
+B07C		
+B098		
+B0B4		
+B0D0		
+B0EC		
+B108		
+B124		
+B140		
+B15C		
+B178		
+B194		
+B1B0		
+B1CC		
+B1E8		
+B204		
+B220		
+B23C		
+B258		
+B274		
+B290		
+B2AC		
+B2C8		
+B2E4		
+B300		
+B31C		
+B338		
+B354		
+B370		
+B38C		
+B3A8		
+B3C4		
+B3E0		
+B3FC		
+B418		
+B434		
+B450		
+B46C		
+B488		
+B4A4		
+B4C0		
+B4DC		
+B4F8		
+B514		
+B530		
+B54C		
+B568		
+B584		
+B5A0		
+B5BC		
+B5D8		
+B5F4		
+B610		
+B62C		
+B648		
+B664		
+B680		
+B69C		
+B6B8		
+B6D4		
+B6F0		
+B70C		
+B728		
+B744		
+B760		
+B77C		
+B798		
+B7B4		
+B7D0		
+B7EC		
+B808		
+B824		
+B840		
+B85C		
+B878		
+B894		
+B8B0		
+B8CC		
+B8E8		
+B904		
+B920		
+B93C		
+B958		
+B974		
+B990		
+B9AC		
+B9C8		
+B9E4		
+BA00		
+BA1C		
+BA38		
+BA54		
+BA70		
+BA8C		
+BAA8		
+BAC4		
+BAE0		
+BAFC		
+BB18		
+BB34		
+BB50		
+BB6C		
+BB88		
+BBA4		
+BBC0		
+BBDC		
+BBF8		
+BC14		
+BC30		
+BC4C		
+BC68		
+BC84		
+BCA0		
+BCBC		
+BCD8		
+BCF4		
+BD10		
+BD2C		
+BD48		
+BD64		
+BD80		
+BD9C		
+BDB8		
+BDD4		
+BDF0		
+BE0C		
+BE28		
+BE44		
+BE60		
+BE7C		
+BE98		
+BEB4		
+BED0		
+BEEC		
+BF08		
+BF24		
+BF40		
+BF5C		
+BF78		
+BF94		
+BFB0		
+BFCC		
+BFE8		
+C004		
+C020		
+C03C		
+C058		
+C074		
+C090		
+C0AC		
+C0C8		
+C0E4		
+C100		
+C11C		
+C138		
+C154		
+C170		
+C18C		
+C1A8		
+C1C4		
+C1E0		
+C1FC		
+C218		
+C234		
+C250		
+C26C		
+C288		
+C2A4		
+C2C0		
+C2DC		
+C2F8		
+C314		
+C330		
+C34C		
+C368		
+C384		
+C3A0		
+C3BC		
+C3D8		
+C3F4		
+C410		
+C42C		
+C448		
+C464		
+C480		
+C49C		
+C4B8		
+C4D4		
+C4F0		
+C50C		
+C528		
+C544		
+C560		
+C57C		
+C598		
+C5B4		
+C5D0		
+C5EC		
+C608		
+C624		
+C640		
+C65C		
+C678		
+C694		
+C6B0		
+C6CC		
+C6E8		
+C704		
+C720		
+C73C		
+C758		
+C774		
+C790		
+C7AC		
+C7C8		
+C7E4		
+C800		
+C81C		
+C838		
+C854		
+C870		
+C88C		
+C8A8		
+C8C4		
+C8E0		
+C8FC		
+C918		
+C934		
+C950		
+C96C		
+C988		
+C9A4		
+C9C0		
+C9DC		
+C9F8		
+CA14		
+CA30		
+CA4C		
+CA68		
+CA84		
+CAA0		
+CABC		
+CAD8		
+CAF4		
+CB10		
+CB2C		
+CB48		
+CB64		
+CB80		
+CB9C		
+CBB8		
+CBD4		
+CBF0		
+CC0C		
+CC28		
+CC44		
+CC60		
+CC7C		
+CC98		
+CCB4		
+CCD0		
+CCEC		
+CD08		
+CD24		
+CD40		
+CD5C		
+CD78		
+CD94		
+CDB0		
+CDCC		
+CDE8		
+CE04		
+CE20		
+CE3C		
+CE58		
+CE74		
+CE90		
+CEAC		
+CEC8		
+CEE4		
+CF00		
+CF1C		
+CF38		
+CF54		
+CF70		
+CF8C		
+CFA8		
+CFC4		
+CFE0		
+CFFC		
+D018		
+D034		
+D050		
+D06C		
+D088		
+D0A4		
+D0C0		
+D0DC		
+D0F8		
+D114		
+D130		
+D14C		
+D168		
+D184		
+D1A0		
+D1BC		
+D1D8		
+D1F4		
+D210		
+D22C		
+D248		
+D264		
+D280		
+D29C		
+D2B8		
+D2D4		
+D2F0		
+D30C		
+D328		
+D344		
+D360		
+D37C		
+D398		
+D3B4		
+D3D0		
+D3EC		
+D408		
+D424		
+D440		
+D45C		
+D478		
+D494		
+D4B0		
+D4CC		
+D4E8		
+D504		
+D520		
+D53C		
+D558		
+D574		
+D590		
+D5AC		
+D5C8		
+D5E4		
+D600		
+D61C		
+D638		
+D654		
+D670		
+D68C		
+D6A8		
+D6C4		
+D6E0		
+D6FC		
+D718		
+D734		
+D750		
+D76C		
+D788		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/LVT.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/LVT.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/LVT.pl	(revision 14489)
@@ -0,0 +1,408 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# HangulSyllableType category 'LVT_Syllable'
+#
+return <<'END';
+AC01	AC1B	
+AC1D	AC37	
+AC39	AC53	
+AC55	AC6F	
+AC71	AC8B	
+AC8D	ACA7	
+ACA9	ACC3	
+ACC5	ACDF	
+ACE1	ACFB	
+ACFD	AD17	
+AD19	AD33	
+AD35	AD4F	
+AD51	AD6B	
+AD6D	AD87	
+AD89	ADA3	
+ADA5	ADBF	
+ADC1	ADDB	
+ADDD	ADF7	
+ADF9	AE13	
+AE15	AE2F	
+AE31	AE4B	
+AE4D	AE67	
+AE69	AE83	
+AE85	AE9F	
+AEA1	AEBB	
+AEBD	AED7	
+AED9	AEF3	
+AEF5	AF0F	
+AF11	AF2B	
+AF2D	AF47	
+AF49	AF63	
+AF65	AF7F	
+AF81	AF9B	
+AF9D	AFB7	
+AFB9	AFD3	
+AFD5	AFEF	
+AFF1	B00B	
+B00D	B027	
+B029	B043	
+B045	B05F	
+B061	B07B	
+B07D	B097	
+B099	B0B3	
+B0B5	B0CF	
+B0D1	B0EB	
+B0ED	B107	
+B109	B123	
+B125	B13F	
+B141	B15B	
+B15D	B177	
+B179	B193	
+B195	B1AF	
+B1B1	B1CB	
+B1CD	B1E7	
+B1E9	B203	
+B205	B21F	
+B221	B23B	
+B23D	B257	
+B259	B273	
+B275	B28F	
+B291	B2AB	
+B2AD	B2C7	
+B2C9	B2E3	
+B2E5	B2FF	
+B301	B31B	
+B31D	B337	
+B339	B353	
+B355	B36F	
+B371	B38B	
+B38D	B3A7	
+B3A9	B3C3	
+B3C5	B3DF	
+B3E1	B3FB	
+B3FD	B417	
+B419	B433	
+B435	B44F	
+B451	B46B	
+B46D	B487	
+B489	B4A3	
+B4A5	B4BF	
+B4C1	B4DB	
+B4DD	B4F7	
+B4F9	B513	
+B515	B52F	
+B531	B54B	
+B54D	B567	
+B569	B583	
+B585	B59F	
+B5A1	B5BB	
+B5BD	B5D7	
+B5D9	B5F3	
+B5F5	B60F	
+B611	B62B	
+B62D	B647	
+B649	B663	
+B665	B67F	
+B681	B69B	
+B69D	B6B7	
+B6B9	B6D3	
+B6D5	B6EF	
+B6F1	B70B	
+B70D	B727	
+B729	B743	
+B745	B75F	
+B761	B77B	
+B77D	B797	
+B799	B7B3	
+B7B5	B7CF	
+B7D1	B7EB	
+B7ED	B807	
+B809	B823	
+B825	B83F	
+B841	B85B	
+B85D	B877	
+B879	B893	
+B895	B8AF	
+B8B1	B8CB	
+B8CD	B8E7	
+B8E9	B903	
+B905	B91F	
+B921	B93B	
+B93D	B957	
+B959	B973	
+B975	B98F	
+B991	B9AB	
+B9AD	B9C7	
+B9C9	B9E3	
+B9E5	B9FF	
+BA01	BA1B	
+BA1D	BA37	
+BA39	BA53	
+BA55	BA6F	
+BA71	BA8B	
+BA8D	BAA7	
+BAA9	BAC3	
+BAC5	BADF	
+BAE1	BAFB	
+BAFD	BB17	
+BB19	BB33	
+BB35	BB4F	
+BB51	BB6B	
+BB6D	BB87	
+BB89	BBA3	
+BBA5	BBBF	
+BBC1	BBDB	
+BBDD	BBF7	
+BBF9	BC13	
+BC15	BC2F	
+BC31	BC4B	
+BC4D	BC67	
+BC69	BC83	
+BC85	BC9F	
+BCA1	BCBB	
+BCBD	BCD7	
+BCD9	BCF3	
+BCF5	BD0F	
+BD11	BD2B	
+BD2D	BD47	
+BD49	BD63	
+BD65	BD7F	
+BD81	BD9B	
+BD9D	BDB7	
+BDB9	BDD3	
+BDD5	BDEF	
+BDF1	BE0B	
+BE0D	BE27	
+BE29	BE43	
+BE45	BE5F	
+BE61	BE7B	
+BE7D	BE97	
+BE99	BEB3	
+BEB5	BECF	
+BED1	BEEB	
+BEED	BF07	
+BF09	BF23	
+BF25	BF3F	
+BF41	BF5B	
+BF5D	BF77	
+BF79	BF93	
+BF95	BFAF	
+BFB1	BFCB	
+BFCD	BFE7	
+BFE9	C003	
+C005	C01F	
+C021	C03B	
+C03D	C057	
+C059	C073	
+C075	C08F	
+C091	C0AB	
+C0AD	C0C7	
+C0C9	C0E3	
+C0E5	C0FF	
+C101	C11B	
+C11D	C137	
+C139	C153	
+C155	C16F	
+C171	C18B	
+C18D	C1A7	
+C1A9	C1C3	
+C1C5	C1DF	
+C1E1	C1FB	
+C1FD	C217	
+C219	C233	
+C235	C24F	
+C251	C26B	
+C26D	C287	
+C289	C2A3	
+C2A5	C2BF	
+C2C1	C2DB	
+C2DD	C2F7	
+C2F9	C313	
+C315	C32F	
+C331	C34B	
+C34D	C367	
+C369	C383	
+C385	C39F	
+C3A1	C3BB	
+C3BD	C3D7	
+C3D9	C3F3	
+C3F5	C40F	
+C411	C42B	
+C42D	C447	
+C449	C463	
+C465	C47F	
+C481	C49B	
+C49D	C4B7	
+C4B9	C4D3	
+C4D5	C4EF	
+C4F1	C50B	
+C50D	C527	
+C529	C543	
+C545	C55F	
+C561	C57B	
+C57D	C597	
+C599	C5B3	
+C5B5	C5CF	
+C5D1	C5EB	
+C5ED	C607	
+C609	C623	
+C625	C63F	
+C641	C65B	
+C65D	C677	
+C679	C693	
+C695	C6AF	
+C6B1	C6CB	
+C6CD	C6E7	
+C6E9	C703	
+C705	C71F	
+C721	C73B	
+C73D	C757	
+C759	C773	
+C775	C78F	
+C791	C7AB	
+C7AD	C7C7	
+C7C9	C7E3	
+C7E5	C7FF	
+C801	C81B	
+C81D	C837	
+C839	C853	
+C855	C86F	
+C871	C88B	
+C88D	C8A7	
+C8A9	C8C3	
+C8C5	C8DF	
+C8E1	C8FB	
+C8FD	C917	
+C919	C933	
+C935	C94F	
+C951	C96B	
+C96D	C987	
+C989	C9A3	
+C9A5	C9BF	
+C9C1	C9DB	
+C9DD	C9F7	
+C9F9	CA13	
+CA15	CA2F	
+CA31	CA4B	
+CA4D	CA67	
+CA69	CA83	
+CA85	CA9F	
+CAA1	CABB	
+CABD	CAD7	
+CAD9	CAF3	
+CAF5	CB0F	
+CB11	CB2B	
+CB2D	CB47	
+CB49	CB63	
+CB65	CB7F	
+CB81	CB9B	
+CB9D	CBB7	
+CBB9	CBD3	
+CBD5	CBEF	
+CBF1	CC0B	
+CC0D	CC27	
+CC29	CC43	
+CC45	CC5F	
+CC61	CC7B	
+CC7D	CC97	
+CC99	CCB3	
+CCB5	CCCF	
+CCD1	CCEB	
+CCED	CD07	
+CD09	CD23	
+CD25	CD3F	
+CD41	CD5B	
+CD5D	CD77	
+CD79	CD93	
+CD95	CDAF	
+CDB1	CDCB	
+CDCD	CDE7	
+CDE9	CE03	
+CE05	CE1F	
+CE21	CE3B	
+CE3D	CE57	
+CE59	CE73	
+CE75	CE8F	
+CE91	CEAB	
+CEAD	CEC7	
+CEC9	CEE3	
+CEE5	CEFF	
+CF01	CF1B	
+CF1D	CF37	
+CF39	CF53	
+CF55	CF6F	
+CF71	CF8B	
+CF8D	CFA7	
+CFA9	CFC3	
+CFC5	CFDF	
+CFE1	CFFB	
+CFFD	D017	
+D019	D033	
+D035	D04F	
+D051	D06B	
+D06D	D087	
+D089	D0A3	
+D0A5	D0BF	
+D0C1	D0DB	
+D0DD	D0F7	
+D0F9	D113	
+D115	D12F	
+D131	D14B	
+D14D	D167	
+D169	D183	
+D185	D19F	
+D1A1	D1BB	
+D1BD	D1D7	
+D1D9	D1F3	
+D1F5	D20F	
+D211	D22B	
+D22D	D247	
+D249	D263	
+D265	D27F	
+D281	D29B	
+D29D	D2B7	
+D2B9	D2D3	
+D2D5	D2EF	
+D2F1	D30B	
+D30D	D327	
+D329	D343	
+D345	D35F	
+D361	D37B	
+D37D	D397	
+D399	D3B3	
+D3B5	D3CF	
+D3D1	D3EB	
+D3ED	D407	
+D409	D423	
+D425	D43F	
+D441	D45B	
+D45D	D477	
+D479	D493	
+D495	D4AF	
+D4B1	D4CB	
+D4CD	D4E7	
+D4E9	D503	
+D505	D51F	
+D521	D53B	
+D53D	D557	
+D559	D573	
+D575	D58F	
+D591	D5AB	
+D5AD	D5C7	
+D5C9	D5E3	
+D5E5	D5FF	
+D601	D61B	
+D61D	D637	
+D639	D653	
+D655	D66F	
+D671	D68B	
+D68D	D6A7	
+D6A9	D6C3	
+D6C5	D6DF	
+D6E1	D6FB	
+D6FD	D717	
+D719	D733	
+D735	D74F	
+D751	D76B	
+D76D	D787	
+D789	D7A3	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/T.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/T.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/T.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# HangulSyllableType category 'Trailing_Jamo'
+#
+return <<'END';
+11A8	11F9	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/V.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/V.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/hst/V.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# HangulSyllableType category 'Vowel_Jamo'
+#
+return <<'END';
+1160	11A2	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/C.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/C.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/C.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# JoiningType category 'Join_Causing'
+#
+return <<'END';
+0640		
+200D		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/D.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/D.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/D.pl	(revision 14489)
@@ -0,0 +1,33 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# JoiningType category 'Dual_Joining'
+#
+return <<'END';
+0626		
+0628		
+062A	062E	
+0633	063A	
+0641	0647	
+0649	064A	
+066E	066F	
+0678	0687	
+069A	06BF	
+06C1	06C2	
+06CC		
+06CE		
+06D0	06D1	
+06FA	06FC	
+06FF		
+0712	0714	
+071A	071D	
+071F	0727	
+0729		
+072B		
+072D	072E	
+074E	0758	
+075C	076A	
+076D		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/R.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/R.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/R.pl	(revision 14489)
@@ -0,0 +1,34 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# JoiningType category 'Right_Joining'
+#
+return <<'END';
+0622	0625	
+0627		
+0629		
+062F	0632	
+0648		
+0671	0673	
+0675	0677	
+0688	0699	
+06C0		
+06C3	06CB	
+06CD		
+06CF		
+06D2	06D3	
+06D5		
+06EE	06EF	
+0710		
+0715	0719	
+071E		
+0728		
+072A		
+072C		
+072F		
+074D		
+0759	075B	
+076B	076C	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/U.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/U.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/jt/U.pl	(revision 14489)
@@ -0,0 +1,15 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# JoiningType category 'Non_Joining'
+#
+return <<'END';
+0600	0603	
+060B		
+0621		
+0674		
+06DD		
+200C		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/AI.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/AI.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/AI.pl	(revision 14489)
@@ -0,0 +1,101 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Ambiguous'
+#
+return <<'END';
+00A1		
+00A7	00A8	
+00AA		
+00B2	00B3	
+00B6	00BA	
+00BC	00BF	
+00D7		
+00F7		
+02C7		
+02C9	02CB	
+02CD		
+02D0		
+02D8	02DB	
+02DD		
+2015	2016	
+2020	2021	
+203B		
+2074		
+207F		
+2081	2084	
+2105		
+2113		
+2121	2122	
+212B		
+2154	2155	
+215B		
+215E		
+2160	216B	
+2170	2179	
+2190	2199	
+21D2		
+21D4		
+2200		
+2202	2203	
+2207	2208	
+220B		
+220F		
+2211		
+2215		
+221A		
+221D	2220	
+2223		
+2225		
+2227	222C	
+222E		
+2234	2237	
+223C	223D	
+2248		
+224C		
+2252		
+2260	2261	
+2264	2267	
+226A	226B	
+226E	226F	
+2282	2283	
+2286	2287	
+2295		
+2299		
+22A5		
+22BF		
+2312		
+2460	24FE	
+2500	254B	
+2550	2574	
+2580	258F	
+2592	2595	
+25A0	25A1	
+25A3	25A9	
+25B2	25B3	
+25B6	25B7	
+25BC	25BD	
+25C0	25C1	
+25C6	25C8	
+25CB		
+25CE	25D1	
+25E2	25E5	
+25EF		
+2605	2606	
+2609		
+260E	260F	
+2614	2617	
+261C		
+261E		
+2640		
+2642		
+2660	2661	
+2663	2665	
+2667	266A	
+266C	266D	
+266F		
+2776	2793	
+FFFD		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/AL.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/AL.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/AL.pl	(revision 14489)
@@ -0,0 +1,449 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Alphabetic'
+#
+return <<'END';
+0023		
+0026		
+002A		
+003C	003E	
+0040	005A	
+005E	007A	
+007E		
+00A6		
+00A9		
+00AC		
+00AE	00AF	
+00B5		
+00C0	00D6	
+00D8	00F6	
+00F8	0241	
+0250	02C6	
+02CE	02CF	
+02D1	02D7	
+02DC		
+02DE	02FF	
+0374	0375	
+037A		
+0384	038A	
+038C		
+038E	03A1	
+03A3	03CE	
+03D0	0482	
+048A	04CE	
+04D0	04F9	
+0500	050F	
+0531	0556	
+0559	055F	
+0561	0587	
+05BE		
+05C0		
+05C3		
+05D0	05EA	
+05F0	05F4	
+0600	0603	
+060E	060F	
+0621	063A	
+0640	064A	
+066D	066F	
+0671	06D3	
+06D5		
+06DD		
+06E5	06E6	
+06E9		
+06EE	06EF	
+06FA	070D	
+070F	0710	
+0712	072F	
+074D	076D	
+0780	07A5	
+07B1		
+0904	0939	
+093D		
+0950		
+0958	0961	
+0970		
+097D		
+0985	098C	
+098F	0990	
+0993	09A8	
+09AA	09B0	
+09B2		
+09B6	09B9	
+09BD		
+09CE		
+09DC	09DD	
+09DF	09E1	
+09F0	09F1	
+09F4	09FA	
+0A05	0A0A	
+0A0F	0A10	
+0A13	0A28	
+0A2A	0A30	
+0A32	0A33	
+0A35	0A36	
+0A38	0A39	
+0A59	0A5C	
+0A5E		
+0A72	0A74	
+0A85	0A8D	
+0A8F	0A91	
+0A93	0AA8	
+0AAA	0AB0	
+0AB2	0AB3	
+0AB5	0AB9	
+0ABD		
+0AD0		
+0AE0	0AE1	
+0B05	0B0C	
+0B0F	0B10	
+0B13	0B28	
+0B2A	0B30	
+0B32	0B33	
+0B35	0B39	
+0B3D		
+0B5C	0B5D	
+0B5F	0B61	
+0B70	0B71	
+0B83		
+0B85	0B8A	
+0B8E	0B90	
+0B92	0B95	
+0B99	0B9A	
+0B9C		
+0B9E	0B9F	
+0BA3	0BA4	
+0BA8	0BAA	
+0BAE	0BB9	
+0BF0	0BF8	
+0BFA		
+0C05	0C0C	
+0C0E	0C10	
+0C12	0C28	
+0C2A	0C33	
+0C35	0C39	
+0C60	0C61	
+0C85	0C8C	
+0C8E	0C90	
+0C92	0CA8	
+0CAA	0CB3	
+0CB5	0CB9	
+0CBD		
+0CDE		
+0CE0	0CE1	
+0D05	0D0C	
+0D0E	0D10	
+0D12	0D28	
+0D2A	0D39	
+0D60	0D61	
+0D85	0D96	
+0D9A	0DB1	
+0DB3	0DBB	
+0DBD		
+0DC0	0DC6	
+0DF4		
+0E4F		
+0F00		
+0F05		
+0F13		
+0F15	0F17	
+0F1A	0F1F	
+0F2A	0F33	
+0F36		
+0F38		
+0F40	0F47	
+0F49	0F6A	
+0F88	0F8B	
+0FC0	0FC5	
+0FC7	0FCC	
+0FCF		
+104C	104F	
+10A0	10C5	
+10D0	10FC	
+1200	1248	
+124A	124D	
+1250	1256	
+1258		
+125A	125D	
+1260	1288	
+128A	128D	
+1290	12B0	
+12B2	12B5	
+12B8	12BE	
+12C0		
+12C2	12C5	
+12C8	12D6	
+12D8	1310	
+1312	1315	
+1318	135A	
+1360		
+1362	137C	
+1380	1399	
+13A0	13F4	
+1401	1676	
+1681	169A	
+16A0	16EA	
+16EE	16F0	
+1700	170C	
+170E	1711	
+1720	1731	
+1735	1736	
+1740	1751	
+1760	176C	
+176E	1770	
+17DC		
+17F0	17F9	
+1800	1801	
+1807		
+180A		
+1820	1877	
+1880	18A8	
+1900	191C	
+1940		
+1950	196D	
+1970	1974	
+1980	19A9	
+19C1	19C7	
+19DE	1A16	
+1A1F		
+1D00	1DBF	
+1E00	1E9B	
+1EA0	1EF9	
+1F00	1F15	
+1F18	1F1D	
+1F20	1F45	
+1F48	1F4D	
+1F50	1F57	
+1F59		
+1F5B		
+1F5D		
+1F5F	1F7D	
+1F80	1FB4	
+1FB6	1FC4	
+1FC6	1FD3	
+1FD6	1FDB	
+1FDD	1FEF	
+1FF2	1FF4	
+1FF6	1FFE	
+2017		
+2022	2023	
+2038		
+203D	2043	
+2047	2055	
+2057		
+205C		
+2061	2063	
+2070	2071	
+2075	207C	
+2080		
+2085	208C	
+2090	2094	
+2100	2102	
+2104		
+2106	2108	
+210A	2112	
+2114	2115	
+2117	2120	
+2123	212A	
+212C	214C	
+2153		
+2156	215A	
+215C	215D	
+215F		
+216C	216F	
+217A	2183	
+219A	21D1	
+21D3		
+21D5	21FF	
+2201		
+2204	2206	
+2209	220A	
+220C	220E	
+2210		
+2214		
+2216	2219	
+221B	221C	
+2221	2222	
+2224		
+2226		
+222D		
+222F	2233	
+2238	223B	
+223E	2247	
+2249	224B	
+224D	2251	
+2253	225F	
+2262	2263	
+2268	2269	
+226C	226D	
+2270	2281	
+2284	2285	
+2288	2294	
+2296	2298	
+229A	22A4	
+22A6	22BE	
+22C0	2311	
+2313	2328	
+232B	23B3	
+23B7	23DB	
+2400	2426	
+2440	244A	
+24FF		
+254C	254F	
+2575	257F	
+2590	2591	
+2596	259F	
+25A2		
+25AA	25B1	
+25B4	25B5	
+25B8	25BB	
+25BE	25BF	
+25C2	25C5	
+25C9	25CA	
+25CC	25CD	
+25D2	25E1	
+25E6	25EE	
+25F0	2604	
+2607	2608	
+260A	260D	
+2610	2613	
+2618	261B	
+261D		
+261F	263F	
+2641		
+2643	265F	
+2662		
+2666		
+266B		
+266E		
+2670	269C	
+26A0	26B1	
+2701	2704	
+2706	2709	
+270C	2727	
+2729	274B	
+274D		
+274F	2752	
+2756		
+2758	275A	
+2761		
+2764	2767	
+2794		
+2798	27AF	
+27B1	27BE	
+27C0	27C4	
+27D0	27E5	
+27F0	2982	
+2999	29D7	
+29DC	29FB	
+29FE	2B13	
+2C00	2C2E	
+2C30	2C5E	
+2C80	2CEA	
+2CFD		
+2D00	2D25	
+2D30	2D65	
+2D6F		
+2D80	2D96	
+2DA0	2DA6	
+2DA8	2DAE	
+2DB0	2DB6	
+2DB8	2DBE	
+2DC0	2DC6	
+2DC8	2DCE	
+2DD0	2DD6	
+2DD8	2DDE	
+2E16		
+4DC0	4DFF	
+A700	A716	
+A800	A801	
+A803	A805	
+A807	A80A	
+A80C	A822	
+A828	A82B	
+FB00	FB06	
+FB13	FB17	
+FB1D		
+FB1F	FB36	
+FB38	FB3C	
+FB3E		
+FB40	FB41	
+FB43	FB44	
+FB46	FBB1	
+FBD3	FD3D	
+FD50	FD8F	
+FD92	FDC7	
+FDF0	FDFB	
+FDFD		
+FE70	FE74	
+FE76	FEFC	
+FF66		
+FF71	FF9D	
+FFA0	FFBE	
+FFC2	FFC7	
+FFCA	FFCF	
+FFD2	FFD7	
+FFDA	FFDC	
+FFE8	FFEE	
+10000	1000B	
+1000D	10026	
+10028	1003A	
+1003C	1003D	
+1003F	1004D	
+10050	1005D	
+10080	100FA	
+10107	10133	
+10137	1018A	
+10300	1031E	
+10320	10323	
+10330	1034A	
+10380	1039D	
+103A0	103C3	
+103C8	103D5	
+10400	1049D	
+10800	10805	
+10808		
+1080A	10835	
+10837	10838	
+1083C		
+1083F		
+10A00		
+10A10	10A13	
+10A15	10A17	
+10A19	10A33	
+10A40	10A47	
+10A58		
+1D000	1D0F5	
+1D100	1D126	
+1D12A	1D164	
+1D16A	1D16C	
+1D183	1D184	
+1D18C	1D1A9	
+1D1AE	1D1DD	
+1D200	1D241	
+1D245		
+1D300	1D356	
+1D400	1D454	
+1D456	1D49C	
+1D49E	1D49F	
+1D4A2		
+1D4A5	1D4A6	
+1D4A9	1D4AC	
+1D4AE	1D4B9	
+1D4BB		
+1D4BD	1D4C3	
+1D4C5	1D505	
+1D507	1D50A	
+1D50D	1D514	
+1D516	1D51C	
+1D51E	1D539	
+1D53B	1D53E	
+1D540	1D544	
+1D546		
+1D54A	1D550	
+1D552	1D6A5	
+1D6A8	1D7C9	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/B2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/B2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/B2.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Break_Both'
+#
+return <<'END';
+2014		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/BA.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/BA.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/BA.pl	(revision 14489)
@@ -0,0 +1,45 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Break_After'
+#
+return <<'END';
+0009		
+007C		
+00AD		
+058A		
+0964	0965	
+0E5A	0E5B	
+0F0B		
+0F34		
+0F7F		
+0F85		
+0FBE	0FBF	
+104A	104B	
+1361		
+1680		
+16EB	16ED	
+17D4	17D5	
+17D8		
+17DA		
+1802	1805	
+1808	1809	
+1A1E		
+2000	2006	
+2008	200A	
+2010		
+2012	2013	
+2027		
+2056		
+2058	205B	
+205D	205F	
+2CF9	2CFC	
+2CFE	2CFF	
+2E0E	2E15	
+2E17		
+10100	10102	
+1039F		
+10A50	10A57	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/BB.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/BB.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/BB.pl	(revision 14489)
@@ -0,0 +1,17 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Break_Before'
+#
+return <<'END';
+00B4		
+02C8		
+02CC		
+0F01	0F04	
+0F06	0F07	
+0F09	0F0A	
+0FD0	0FD1	
+1806		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/BK.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/BK.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/BK.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Mandatory_Break'
+#
+return <<'END';
+000C		
+2028	2029	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CB.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CB.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CB.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Contingent_Break'
+#
+return <<'END';
+FFFC		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CL.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CL.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CL.pl	(revision 14489)
@@ -0,0 +1,80 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Close_Punctuation'
+#
+return <<'END';
+0029		
+005D		
+007D		
+0F3B		
+0F3D		
+169C		
+2046		
+207E		
+208E		
+232A		
+23B5		
+2769		
+276B		
+276D		
+276F		
+2771		
+2773		
+2775		
+27C6		
+27E7		
+27E9		
+27EB		
+2984		
+2986		
+2988		
+298A		
+298C		
+298E		
+2990		
+2992		
+2994		
+2996		
+2998		
+29D9		
+29DB		
+29FD		
+3001	3002	
+3009		
+300B		
+300D		
+300F		
+3011		
+3015		
+3017		
+3019		
+301B		
+301E	301F	
+FD3F		
+FE11	FE12	
+FE18		
+FE36		
+FE38		
+FE3A		
+FE3C		
+FE3E		
+FE40		
+FE42		
+FE44		
+FE48		
+FE50		
+FE52		
+FE5A		
+FE5C		
+FE5E		
+FF09		
+FF0C		
+FF0E		
+FF3D		
+FF5D		
+FF60	FF61	
+FF63	FF64	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CM.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CM.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CM.pl	(revision 14489)
@@ -0,0 +1,155 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Combining_Mark'
+#
+return <<'END';
+0000	0008	
+000B		
+000E	001F	
+007F	0084	
+0086	009F	
+0300	034E	
+0350	035C	
+0363	036F	
+0483	0486	
+0488	0489	
+0591	05B9	
+05BB	05BD	
+05BF		
+05C1	05C2	
+05C4	05C5	
+05C7		
+0610	0615	
+064B	065E	
+0670		
+06D6	06DC	
+06DE	06E4	
+06E7	06E8	
+06EA	06ED	
+0711		
+0730	074A	
+07A6	07B0	
+0901	0903	
+093C		
+093E	094D	
+0951	0954	
+0962	0963	
+0981	0983	
+09BC		
+09BE	09C4	
+09C7	09C8	
+09CB	09CD	
+09D7		
+09E2	09E3	
+0A01	0A03	
+0A3C		
+0A3E	0A42	
+0A47	0A48	
+0A4B	0A4D	
+0A70	0A71	
+0A81	0A83	
+0ABC		
+0ABE	0AC5	
+0AC7	0AC9	
+0ACB	0ACD	
+0AE2	0AE3	
+0B01	0B03	
+0B3C		
+0B3E	0B43	
+0B47	0B48	
+0B4B	0B4D	
+0B56	0B57	
+0B82		
+0BBE	0BC2	
+0BC6	0BC8	
+0BCA	0BCD	
+0BD7		
+0C01	0C03	
+0C3E	0C44	
+0C46	0C48	
+0C4A	0C4D	
+0C55	0C56	
+0C82	0C83	
+0CBC		
+0CBE	0CC4	
+0CC6	0CC8	
+0CCA	0CCD	
+0CD5	0CD6	
+0D02	0D03	
+0D3E	0D43	
+0D46	0D48	
+0D4A	0D4D	
+0D57		
+0D82	0D83	
+0DCA		
+0DCF	0DD4	
+0DD6		
+0DD8	0DDF	
+0DF2	0DF3	
+0E31		
+0E34	0E3A	
+0E47	0E4E	
+0EB1		
+0EB4	0EB9	
+0EBB	0EBC	
+0EC8	0ECD	
+0F18	0F19	
+0F35		
+0F37		
+0F39		
+0F3E	0F3F	
+0F71	0F7E	
+0F80	0F84	
+0F86	0F87	
+0F90	0F97	
+0F99	0FBC	
+0FC6		
+102C	1032	
+1036	1039	
+1056	1059	
+135F		
+1712	1714	
+1732	1734	
+1752	1753	
+1772	1773	
+17B6	17D3	
+17DD		
+180B	180D	
+18A9		
+1920	192B	
+1930	193B	
+19B0	19C0	
+19C8	19C9	
+1A17	1A1B	
+1DC0	1DC3	
+200C	200F	
+202A	202E	
+206A	206F	
+20D0	20EB	
+302A	302F	
+3099	309A	
+A802		
+A806		
+A80B		
+A823	A827	
+FB1E		
+FE00	FE0F	
+FE20	FE23	
+FFF9	FFFB	
+10A01	10A03	
+10A05	10A06	
+10A0C	10A0F	
+10A38	10A3A	
+10A3F		
+1D165	1D169	
+1D16D	1D182	
+1D185	1D18B	
+1D1AA	1D1AD	
+1D242	1D244	
+E0001		
+E0020	E007F	
+E0100	E01EF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CR.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CR.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/CR.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Carriage_Return'
+#
+return <<'END';
+000D		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/EX.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/EX.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/EX.pl	(revision 14489)
@@ -0,0 +1,25 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Exclamation'
+#
+return <<'END';
+0021		
+003F		
+05C6		
+060C		
+061B		
+061E	061F	
+066A		
+06D4		
+0F0D	0F11	
+0F14		
+1944	1945	
+2762	2763	
+FE15	FE16	
+FE56	FE57	
+FF01		
+FF1F		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/GL.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/GL.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/GL.pl	(revision 14489)
@@ -0,0 +1,19 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Glue'
+#
+return <<'END';
+00A0		
+034F		
+035D	0362	
+0F08		
+0F0C		
+0F12		
+180E		
+2007		
+2011		
+202F		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/H2.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/H2.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/H2.pl	(revision 14489)
@@ -0,0 +1,408 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'H2'
+#
+return <<'END';
+AC00		
+AC1C		
+AC38		
+AC54		
+AC70		
+AC8C		
+ACA8		
+ACC4		
+ACE0		
+ACFC		
+AD18		
+AD34		
+AD50		
+AD6C		
+AD88		
+ADA4		
+ADC0		
+ADDC		
+ADF8		
+AE14		
+AE30		
+AE4C		
+AE68		
+AE84		
+AEA0		
+AEBC		
+AED8		
+AEF4		
+AF10		
+AF2C		
+AF48		
+AF64		
+AF80		
+AF9C		
+AFB8		
+AFD4		
+AFF0		
+B00C		
+B028		
+B044		
+B060		
+B07C		
+B098		
+B0B4		
+B0D0		
+B0EC		
+B108		
+B124		
+B140		
+B15C		
+B178		
+B194		
+B1B0		
+B1CC		
+B1E8		
+B204		
+B220		
+B23C		
+B258		
+B274		
+B290		
+B2AC		
+B2C8		
+B2E4		
+B300		
+B31C		
+B338		
+B354		
+B370		
+B38C		
+B3A8		
+B3C4		
+B3E0		
+B3FC		
+B418		
+B434		
+B450		
+B46C		
+B488		
+B4A4		
+B4C0		
+B4DC		
+B4F8		
+B514		
+B530		
+B54C		
+B568		
+B584		
+B5A0		
+B5BC		
+B5D8		
+B5F4		
+B610		
+B62C		
+B648		
+B664		
+B680		
+B69C		
+B6B8		
+B6D4		
+B6F0		
+B70C		
+B728		
+B744		
+B760		
+B77C		
+B798		
+B7B4		
+B7D0		
+B7EC		
+B808		
+B824		
+B840		
+B85C		
+B878		
+B894		
+B8B0		
+B8CC		
+B8E8		
+B904		
+B920		
+B93C		
+B958		
+B974		
+B990		
+B9AC		
+B9C8		
+B9E4		
+BA00		
+BA1C		
+BA38		
+BA54		
+BA70		
+BA8C		
+BAA8		
+BAC4		
+BAE0		
+BAFC		
+BB18		
+BB34		
+BB50		
+BB6C		
+BB88		
+BBA4		
+BBC0		
+BBDC		
+BBF8		
+BC14		
+BC30		
+BC4C		
+BC68		
+BC84		
+BCA0		
+BCBC		
+BCD8		
+BCF4		
+BD10		
+BD2C		
+BD48		
+BD64		
+BD80		
+BD9C		
+BDB8		
+BDD4		
+BDF0		
+BE0C		
+BE28		
+BE44		
+BE60		
+BE7C		
+BE98		
+BEB4		
+BED0		
+BEEC		
+BF08		
+BF24		
+BF40		
+BF5C		
+BF78		
+BF94		
+BFB0		
+BFCC		
+BFE8		
+C004		
+C020		
+C03C		
+C058		
+C074		
+C090		
+C0AC		
+C0C8		
+C0E4		
+C100		
+C11C		
+C138		
+C154		
+C170		
+C18C		
+C1A8		
+C1C4		
+C1E0		
+C1FC		
+C218		
+C234		
+C250		
+C26C		
+C288		
+C2A4		
+C2C0		
+C2DC		
+C2F8		
+C314		
+C330		
+C34C		
+C368		
+C384		
+C3A0		
+C3BC		
+C3D8		
+C3F4		
+C410		
+C42C		
+C448		
+C464		
+C480		
+C49C		
+C4B8		
+C4D4		
+C4F0		
+C50C		
+C528		
+C544		
+C560		
+C57C		
+C598		
+C5B4		
+C5D0		
+C5EC		
+C608		
+C624		
+C640		
+C65C		
+C678		
+C694		
+C6B0		
+C6CC		
+C6E8		
+C704		
+C720		
+C73C		
+C758		
+C774		
+C790		
+C7AC		
+C7C8		
+C7E4		
+C800		
+C81C		
+C838		
+C854		
+C870		
+C88C		
+C8A8		
+C8C4		
+C8E0		
+C8FC		
+C918		
+C934		
+C950		
+C96C		
+C988		
+C9A4		
+C9C0		
+C9DC		
+C9F8		
+CA14		
+CA30		
+CA4C		
+CA68		
+CA84		
+CAA0		
+CABC		
+CAD8		
+CAF4		
+CB10		
+CB2C		
+CB48		
+CB64		
+CB80		
+CB9C		
+CBB8		
+CBD4		
+CBF0		
+CC0C		
+CC28		
+CC44		
+CC60		
+CC7C		
+CC98		
+CCB4		
+CCD0		
+CCEC		
+CD08		
+CD24		
+CD40		
+CD5C		
+CD78		
+CD94		
+CDB0		
+CDCC		
+CDE8		
+CE04		
+CE20		
+CE3C		
+CE58		
+CE74		
+CE90		
+CEAC		
+CEC8		
+CEE4		
+CF00		
+CF1C		
+CF38		
+CF54		
+CF70		
+CF8C		
+CFA8		
+CFC4		
+CFE0		
+CFFC		
+D018		
+D034		
+D050		
+D06C		
+D088		
+D0A4		
+D0C0		
+D0DC		
+D0F8		
+D114		
+D130		
+D14C		
+D168		
+D184		
+D1A0		
+D1BC		
+D1D8		
+D1F4		
+D210		
+D22C		
+D248		
+D264		
+D280		
+D29C		
+D2B8		
+D2D4		
+D2F0		
+D30C		
+D328		
+D344		
+D360		
+D37C		
+D398		
+D3B4		
+D3D0		
+D3EC		
+D408		
+D424		
+D440		
+D45C		
+D478		
+D494		
+D4B0		
+D4CC		
+D4E8		
+D504		
+D520		
+D53C		
+D558		
+D574		
+D590		
+D5AC		
+D5C8		
+D5E4		
+D600		
+D61C		
+D638		
+D654		
+D670		
+D68C		
+D6A8		
+D6C4		
+D6E0		
+D6FC		
+D718		
+D734		
+D750		
+D76C		
+D788		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/H3.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/H3.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/H3.pl	(revision 14489)
@@ -0,0 +1,408 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'H3'
+#
+return <<'END';
+AC01	AC1B	
+AC1D	AC37	
+AC39	AC53	
+AC55	AC6F	
+AC71	AC8B	
+AC8D	ACA7	
+ACA9	ACC3	
+ACC5	ACDF	
+ACE1	ACFB	
+ACFD	AD17	
+AD19	AD33	
+AD35	AD4F	
+AD51	AD6B	
+AD6D	AD87	
+AD89	ADA3	
+ADA5	ADBF	
+ADC1	ADDB	
+ADDD	ADF7	
+ADF9	AE13	
+AE15	AE2F	
+AE31	AE4B	
+AE4D	AE67	
+AE69	AE83	
+AE85	AE9F	
+AEA1	AEBB	
+AEBD	AED7	
+AED9	AEF3	
+AEF5	AF0F	
+AF11	AF2B	
+AF2D	AF47	
+AF49	AF63	
+AF65	AF7F	
+AF81	AF9B	
+AF9D	AFB7	
+AFB9	AFD3	
+AFD5	AFEF	
+AFF1	B00B	
+B00D	B027	
+B029	B043	
+B045	B05F	
+B061	B07B	
+B07D	B097	
+B099	B0B3	
+B0B5	B0CF	
+B0D1	B0EB	
+B0ED	B107	
+B109	B123	
+B125	B13F	
+B141	B15B	
+B15D	B177	
+B179	B193	
+B195	B1AF	
+B1B1	B1CB	
+B1CD	B1E7	
+B1E9	B203	
+B205	B21F	
+B221	B23B	
+B23D	B257	
+B259	B273	
+B275	B28F	
+B291	B2AB	
+B2AD	B2C7	
+B2C9	B2E3	
+B2E5	B2FF	
+B301	B31B	
+B31D	B337	
+B339	B353	
+B355	B36F	
+B371	B38B	
+B38D	B3A7	
+B3A9	B3C3	
+B3C5	B3DF	
+B3E1	B3FB	
+B3FD	B417	
+B419	B433	
+B435	B44F	
+B451	B46B	
+B46D	B487	
+B489	B4A3	
+B4A5	B4BF	
+B4C1	B4DB	
+B4DD	B4F7	
+B4F9	B513	
+B515	B52F	
+B531	B54B	
+B54D	B567	
+B569	B583	
+B585	B59F	
+B5A1	B5BB	
+B5BD	B5D7	
+B5D9	B5F3	
+B5F5	B60F	
+B611	B62B	
+B62D	B647	
+B649	B663	
+B665	B67F	
+B681	B69B	
+B69D	B6B7	
+B6B9	B6D3	
+B6D5	B6EF	
+B6F1	B70B	
+B70D	B727	
+B729	B743	
+B745	B75F	
+B761	B77B	
+B77D	B797	
+B799	B7B3	
+B7B5	B7CF	
+B7D1	B7EB	
+B7ED	B807	
+B809	B823	
+B825	B83F	
+B841	B85B	
+B85D	B877	
+B879	B893	
+B895	B8AF	
+B8B1	B8CB	
+B8CD	B8E7	
+B8E9	B903	
+B905	B91F	
+B921	B93B	
+B93D	B957	
+B959	B973	
+B975	B98F	
+B991	B9AB	
+B9AD	B9C7	
+B9C9	B9E3	
+B9E5	B9FF	
+BA01	BA1B	
+BA1D	BA37	
+BA39	BA53	
+BA55	BA6F	
+BA71	BA8B	
+BA8D	BAA7	
+BAA9	BAC3	
+BAC5	BADF	
+BAE1	BAFB	
+BAFD	BB17	
+BB19	BB33	
+BB35	BB4F	
+BB51	BB6B	
+BB6D	BB87	
+BB89	BBA3	
+BBA5	BBBF	
+BBC1	BBDB	
+BBDD	BBF7	
+BBF9	BC13	
+BC15	BC2F	
+BC31	BC4B	
+BC4D	BC67	
+BC69	BC83	
+BC85	BC9F	
+BCA1	BCBB	
+BCBD	BCD7	
+BCD9	BCF3	
+BCF5	BD0F	
+BD11	BD2B	
+BD2D	BD47	
+BD49	BD63	
+BD65	BD7F	
+BD81	BD9B	
+BD9D	BDB7	
+BDB9	BDD3	
+BDD5	BDEF	
+BDF1	BE0B	
+BE0D	BE27	
+BE29	BE43	
+BE45	BE5F	
+BE61	BE7B	
+BE7D	BE97	
+BE99	BEB3	
+BEB5	BECF	
+BED1	BEEB	
+BEED	BF07	
+BF09	BF23	
+BF25	BF3F	
+BF41	BF5B	
+BF5D	BF77	
+BF79	BF93	
+BF95	BFAF	
+BFB1	BFCB	
+BFCD	BFE7	
+BFE9	C003	
+C005	C01F	
+C021	C03B	
+C03D	C057	
+C059	C073	
+C075	C08F	
+C091	C0AB	
+C0AD	C0C7	
+C0C9	C0E3	
+C0E5	C0FF	
+C101	C11B	
+C11D	C137	
+C139	C153	
+C155	C16F	
+C171	C18B	
+C18D	C1A7	
+C1A9	C1C3	
+C1C5	C1DF	
+C1E1	C1FB	
+C1FD	C217	
+C219	C233	
+C235	C24F	
+C251	C26B	
+C26D	C287	
+C289	C2A3	
+C2A5	C2BF	
+C2C1	C2DB	
+C2DD	C2F7	
+C2F9	C313	
+C315	C32F	
+C331	C34B	
+C34D	C367	
+C369	C383	
+C385	C39F	
+C3A1	C3BB	
+C3BD	C3D7	
+C3D9	C3F3	
+C3F5	C40F	
+C411	C42B	
+C42D	C447	
+C449	C463	
+C465	C47F	
+C481	C49B	
+C49D	C4B7	
+C4B9	C4D3	
+C4D5	C4EF	
+C4F1	C50B	
+C50D	C527	
+C529	C543	
+C545	C55F	
+C561	C57B	
+C57D	C597	
+C599	C5B3	
+C5B5	C5CF	
+C5D1	C5EB	
+C5ED	C607	
+C609	C623	
+C625	C63F	
+C641	C65B	
+C65D	C677	
+C679	C693	
+C695	C6AF	
+C6B1	C6CB	
+C6CD	C6E7	
+C6E9	C703	
+C705	C71F	
+C721	C73B	
+C73D	C757	
+C759	C773	
+C775	C78F	
+C791	C7AB	
+C7AD	C7C7	
+C7C9	C7E3	
+C7E5	C7FF	
+C801	C81B	
+C81D	C837	
+C839	C853	
+C855	C86F	
+C871	C88B	
+C88D	C8A7	
+C8A9	C8C3	
+C8C5	C8DF	
+C8E1	C8FB	
+C8FD	C917	
+C919	C933	
+C935	C94F	
+C951	C96B	
+C96D	C987	
+C989	C9A3	
+C9A5	C9BF	
+C9C1	C9DB	
+C9DD	C9F7	
+C9F9	CA13	
+CA15	CA2F	
+CA31	CA4B	
+CA4D	CA67	
+CA69	CA83	
+CA85	CA9F	
+CAA1	CABB	
+CABD	CAD7	
+CAD9	CAF3	
+CAF5	CB0F	
+CB11	CB2B	
+CB2D	CB47	
+CB49	CB63	
+CB65	CB7F	
+CB81	CB9B	
+CB9D	CBB7	
+CBB9	CBD3	
+CBD5	CBEF	
+CBF1	CC0B	
+CC0D	CC27	
+CC29	CC43	
+CC45	CC5F	
+CC61	CC7B	
+CC7D	CC97	
+CC99	CCB3	
+CCB5	CCCF	
+CCD1	CCEB	
+CCED	CD07	
+CD09	CD23	
+CD25	CD3F	
+CD41	CD5B	
+CD5D	CD77	
+CD79	CD93	
+CD95	CDAF	
+CDB1	CDCB	
+CDCD	CDE7	
+CDE9	CE03	
+CE05	CE1F	
+CE21	CE3B	
+CE3D	CE57	
+CE59	CE73	
+CE75	CE8F	
+CE91	CEAB	
+CEAD	CEC7	
+CEC9	CEE3	
+CEE5	CEFF	
+CF01	CF1B	
+CF1D	CF37	
+CF39	CF53	
+CF55	CF6F	
+CF71	CF8B	
+CF8D	CFA7	
+CFA9	CFC3	
+CFC5	CFDF	
+CFE1	CFFB	
+CFFD	D017	
+D019	D033	
+D035	D04F	
+D051	D06B	
+D06D	D087	
+D089	D0A3	
+D0A5	D0BF	
+D0C1	D0DB	
+D0DD	D0F7	
+D0F9	D113	
+D115	D12F	
+D131	D14B	
+D14D	D167	
+D169	D183	
+D185	D19F	
+D1A1	D1BB	
+D1BD	D1D7	
+D1D9	D1F3	
+D1F5	D20F	
+D211	D22B	
+D22D	D247	
+D249	D263	
+D265	D27F	
+D281	D29B	
+D29D	D2B7	
+D2B9	D2D3	
+D2D5	D2EF	
+D2F1	D30B	
+D30D	D327	
+D329	D343	
+D345	D35F	
+D361	D37B	
+D37D	D397	
+D399	D3B3	
+D3B5	D3CF	
+D3D1	D3EB	
+D3ED	D407	
+D409	D423	
+D425	D43F	
+D441	D45B	
+D45D	D477	
+D479	D493	
+D495	D4AF	
+D4B1	D4CB	
+D4CD	D4E7	
+D4E9	D503	
+D505	D51F	
+D521	D53B	
+D53D	D557	
+D559	D573	
+D575	D58F	
+D591	D5AB	
+D5AD	D5C7	
+D5C9	D5E3	
+D5E5	D5FF	
+D601	D61B	
+D61D	D637	
+D639	D653	
+D655	D66F	
+D671	D68B	
+D68D	D6A7	
+D6A9	D6C3	
+D6C5	D6DF	
+D6E1	D6FB	
+D6FD	D717	
+D719	D733	
+D735	D74F	
+D751	D76B	
+D76D	D787	
+D789	D7A3	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/HY.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/HY.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/HY.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Hyphen'
+#
+return <<'END';
+002D		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/ID.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/ID.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/ID.pl	(revision 14489)
@@ -0,0 +1,80 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Ideographic'
+#
+return <<'END';
+2E80	2E99	
+2E9B	2EF3	
+2F00	2FD5	
+2FF0	2FFB	
+3000		
+3003	3004	
+3006	3007	
+3012	3013	
+3020	3029	
+3030	303A	
+303D	303F	
+3042		
+3044		
+3046		
+3048		
+304A	3062	
+3064	3082	
+3084		
+3086		
+3088	308D	
+308F	3094	
+309F		
+30A2		
+30A4		
+30A6		
+30A8		
+30AA	30C2	
+30C4	30E2	
+30E4		
+30E6		
+30E8	30ED	
+30EF	30F4	
+30F7	30FA	
+30FF		
+3105	312C	
+3131	318E	
+3190	31B7	
+31C0	31CF	
+3200	321E	
+3220	3243	
+3250	32FE	
+3300	4DB5	
+4E00	9FBB	
+A000	A014	
+A016	A48C	
+A490	A4C6	
+F900	FA2D	
+FA30	FA6A	
+FA70	FAD9	
+FE30	FE34	
+FE45	FE46	
+FE49	FE4F	
+FE51		
+FE58		
+FE5F	FE66	
+FE68		
+FE6B		
+FF02	FF03	
+FF06	FF07	
+FF0A	FF0B	
+FF0D		
+FF0F	FF19	
+FF1C	FF1E	
+FF20	FF3A	
+FF3C		
+FF3E	FF5A	
+FF5C		
+FF5E		
+FFE2	FFE4	
+20000	2A6D6	
+2F800	2FA1D	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/IN.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/IN.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/IN.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Inseparable'
+#
+return <<'END';
+2024	2026	
+FE19		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/IS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/IS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/IS.pl	(revision 14489)
@@ -0,0 +1,18 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Infix_Numeric'
+#
+return <<'END';
+002C		
+002E		
+003A	003B	
+037E		
+0589		
+060D		
+2044		
+FE10		
+FE13	FE14	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/JL.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/JL.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/JL.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'JL'
+#
+return <<'END';
+1100	1159	
+115F		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/JT.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/JT.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/JT.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'JT'
+#
+return <<'END';
+11A8	11F9	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/JV.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/JV.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/JV.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'JV'
+#
+return <<'END';
+1160	11A2	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/LF.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/LF.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/LF.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Line_Feed'
+#
+return <<'END';
+000A		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/NL.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/NL.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/NL.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Next_Line'
+#
+return <<'END';
+0085		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/NS.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/NS.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/NS.pl	(revision 14489)
@@ -0,0 +1,46 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Nonstarter'
+#
+return <<'END';
+17D6	17D7	
+17D9		
+203C		
+3005		
+301C		
+303B	303C	
+3041		
+3043		
+3045		
+3047		
+3049		
+3063		
+3083		
+3085		
+3087		
+308E		
+3095	3096	
+309B	309E	
+30A0	30A1	
+30A3		
+30A5		
+30A7		
+30A9		
+30C3		
+30E3		
+30E5		
+30E7		
+30EE		
+30F5	30F6	
+30FB	30FE	
+31F0	31FF	
+A015		
+FE54	FE55	
+FF1A	FF1B	
+FF65		
+FF67	FF70	
+FF9E	FF9F	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/NU.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/NU.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/NU.pl	(revision 14489)
@@ -0,0 +1,32 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Numeric'
+#
+return <<'END';
+0030	0039	
+0660	0669	
+066B	066C	
+06F0	06F9	
+0966	096F	
+09E6	09EF	
+0A66	0A6F	
+0AE6	0AEF	
+0B66	0B6F	
+0BE6	0BEF	
+0C66	0C6F	
+0CE6	0CEF	
+0D66	0D6F	
+0E50	0E59	
+0ED0	0ED9	
+0F20	0F29	
+1040	1049	
+17E0	17E9	
+1810	1819	
+1946	194F	
+19D0	19D9	
+104A0	104A9	
+1D7CE	1D7FF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/OP.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/OP.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/OP.pl	(revision 14489)
@@ -0,0 +1,76 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Open_Punctuation'
+#
+return <<'END';
+0028		
+005B		
+007B		
+0F3A		
+0F3C		
+169B		
+201A		
+201E		
+2045		
+207D		
+208D		
+2329		
+23B4		
+2768		
+276A		
+276C		
+276E		
+2770		
+2772		
+2774		
+27C5		
+27E6		
+27E8		
+27EA		
+2983		
+2985		
+2987		
+2989		
+298B		
+298D		
+298F		
+2991		
+2993		
+2995		
+2997		
+29D8		
+29DA		
+29FC		
+3008		
+300A		
+300C		
+300E		
+3010		
+3014		
+3016		
+3018		
+301A		
+301D		
+FD3E		
+FE17		
+FE35		
+FE37		
+FE39		
+FE3B		
+FE3D		
+FE3F		
+FE41		
+FE43		
+FE47		
+FE59		
+FE5B		
+FE5D		
+FF08		
+FF3B		
+FF5B		
+FF5F		
+FF62		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/PO.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/PO.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/PO.pl	(revision 14489)
@@ -0,0 +1,21 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Postfix_Numeric'
+#
+return <<'END';
+0025		
+00A2		
+00B0		
+060B		
+2030	2037	
+20A7		
+2103		
+2109		
+FDFC		
+FE6A		
+FF05		
+FFE0		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/PR.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/PR.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/PR.pl	(revision 14489)
@@ -0,0 +1,27 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Prefix_Numeric'
+#
+return <<'END';
+0024		
+002B		
+005C		
+00A3	00A5	
+00B1		
+09F2	09F3	
+0AF1		
+0BF9		
+0E3F		
+17DB		
+20A0	20A6	
+20A8	20B5	
+2116		
+2212	2213	
+FE69		
+FF04		
+FFE1		
+FFE5	FFE6	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/QU.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/QU.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/QU.pl	(revision 14489)
@@ -0,0 +1,21 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Quotation'
+#
+return <<'END';
+0022		
+0027		
+00AB		
+00BB		
+2018	2019	
+201B	201D	
+201F		
+2039	203A	
+23B6		
+275B	275E	
+2E00	2E0D	
+2E1C	2E1D	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SA.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SA.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SA.pl	(revision 14489)
@@ -0,0 +1,34 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Complex_Context'
+#
+return <<'END';
+0E01	0E30	
+0E32	0E33	
+0E40	0E46	
+0E81	0E82	
+0E84		
+0E87	0E88	
+0E8A		
+0E8D		
+0E94	0E97	
+0E99	0E9F	
+0EA1	0EA3	
+0EA5		
+0EA7		
+0EAA	0EAB	
+0EAD	0EB0	
+0EB2	0EB3	
+0EBD		
+0EC0	0EC4	
+0EC6		
+0EDC	0EDD	
+1000	1021	
+1023	1027	
+1029	102A	
+1050	1055	
+1780	17B5	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SG.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SG.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SG.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Surrogate'
+#
+return <<'END';
+D800	DFFF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SP.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SP.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SP.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Space'
+#
+return <<'END';
+0020		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SY.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SY.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/SY.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Break_Symbols'
+#
+return <<'END';
+002F		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/WJ.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/WJ.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/WJ.pl	(revision 14489)
@@ -0,0 +1,11 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Word_Joiner'
+#
+return <<'END';
+2060		
+FEFF		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/XX.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/XX.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/XX.pl	(revision 14489)
@@ -0,0 +1,12 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'Unknown'
+#
+return <<'END';
+E000	F8FF	
+F0000	FFFFD	
+100000	10FFFD	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/ZW.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/ZW.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/lb/ZW.pl	(revision 14489)
@@ -0,0 +1,10 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# Linebreak category 'ZWSpace'
+#
+return <<'END';
+200B		
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/nt/De.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/nt/De.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/nt/De.pl	(revision 14489)
@@ -0,0 +1,32 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# NumericType category 'Decimal'
+#
+return <<'END';
+0030	0039	
+0660	0669	
+06F0	06F9	
+0966	096F	
+09E6	09EF	
+0A66	0A6F	
+0AE6	0AEF	
+0B66	0B6F	
+0BE6	0BEF	
+0C66	0C6F	
+0CE6	0CEF	
+0D66	0D6F	
+0E50	0E59	
+0ED0	0ED9	
+0F20	0F29	
+1040	1049	
+17E0	17E9	
+1810	1819	
+1946	194F	
+19D0	19D9	
+FF10	FF19	
+104A0	104A9	
+1D7CE	1D7FF	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/nt/Di.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/nt/Di.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/nt/Di.pl	(revision 14489)
@@ -0,0 +1,25 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# NumericType category 'Digit'
+#
+return <<'END';
+00B2	00B3	
+00B9		
+1369	1371	
+2070		
+2074	2079	
+2080	2089	
+2460	2468	
+2474	247C	
+2488	2490	
+24EA		
+24F5	24FD	
+24FF		
+2776	277E	
+2780	2788	
+278A	2792	
+10A40	10A43	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/nt/Nu.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/nt/Nu.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/lib/nt/Nu.pl	(revision 14489)
@@ -0,0 +1,42 @@
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# NumericType category 'Numeric'
+#
+return <<'END';
+00BC	00BE	
+09F4	09F7	
+09F9		
+0BF0	0BF2	
+0F2A	0F33	
+1372	137C	
+16EE	16F0	
+17F0	17F9	
+2153	2182	
+2469	2473	
+247D	2487	
+2491	249B	
+24EB	24F4	
+24FE		
+277F		
+2789		
+2793		
+2CFD		
+3007		
+3021	3029	
+3038	303A	
+3192	3195	
+3220	3229	
+3251	325F	
+3280	3289	
+32B1	32BF	
+10107	10133	
+10140	10178	
+1018A		
+10320	10323	
+1034A		
+103D1	103D5	
+10A44	10A47	
+END
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/mktables
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/mktables	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/mktables	(revision 14489)
@@ -0,0 +1,2197 @@
+## !!!!!!!!!!!!!!       IF YOU MODIFY THIS FILE       !!!!!!!!!!!!!!!!!!!!!!!!!
+## Any files created or read by this program should be listed in 'mktables.lst'
+
+#!/usr/bin/perl -w
+require 5.008;	# Needs pack "U". Probably safest to run on 5.8.x
+use strict;
+use Carp;
+use File::Spec;
+
+##
+## mktables -- create the runtime Perl Unicode files (lib/unicore/**/*.pl)
+## from the Unicode database files (lib/unicore/*.txt).
+##
+
+## "Fuzzy" means this section in Unicode TR18:
+##
+##    The recommended names for UCD properties and property values are in
+##    PropertyAliases.txt [Prop] and PropertyValueAliases.txt
+##    [PropValue]. There are both abbreviated names and longer, more
+##    descriptive names. It is strongly recommended that both names be
+##    recognized, and that loose matching of property names be used,
+##    whereby the case distinctions, whitespace, hyphens, and underbar
+##    are ignored.
+
+## Base names already used in lib/gc_sc (for avoiding 8.3 conflicts)
+my %BaseNames;
+
+##
+## Process any args.
+##
+my $Verbose        = 0;
+my $MakeTestScript = 0;
+my $AlwaysWrite    = 0;
+my $UseDir         = "";
+my $FileList       = "$0.lst";
+my $MakeList       = 0;
+
+while (@ARGV)
+{
+    my $arg = shift @ARGV;
+    if ($arg eq '-v') {
+        $Verbose = 1;
+    } elsif ($arg eq '-q') {
+        $Verbose = 0;
+    } elsif ($arg eq '-w') {
+        $AlwaysWrite = 1;	# update the files even if they havent changed
+        $FileList = "";
+    } elsif ($arg eq '-maketest') {
+        $MakeTestScript = 1;
+    } elsif ($arg eq '-makelist') {
+        $MakeList = 1;        
+    } elsif ($arg eq '-C' && defined ($UseDir = shift)) {
+	-d $UseDir or die "Unknown directory '$UseDir'";
+    } elsif ($arg eq '-L' && defined ($FileList = shift)) {
+        -e $FileList or die "Filelist '$FileList' doesn't appear to exist!";
+    } else {
+        die "usage: $0 [-v|-q|-w|-C dir|-L filelist] [-maketest] [-makelist]\n",
+            "  -v          : Verbose Mode\n",
+            "  -q          : Quiet Mode\n",
+            "  -w          : Write files regardless\n",
+            "  -maketest   : Make test script\n",
+            "  -makelist   : Rewrite the file list based on current setup\n",
+            "  -L filelist : Use this file list, (defaults to $0)\n",
+            "  -C dir      : Change to this directory before proceding\n";   
+    }
+}
+
+if ($FileList) {
+    print "Reading file list '$FileList'\n"
+        if $Verbose;
+    open my $fh,"<",$FileList or die "Failed to read '$FileList':$!";
+    my @input;
+    my @output;
+    for my $list ( \@input, \@output ) {
+        while (<$fh>) {
+            s/^ \s+ | \s+ $//xg;
+            next if /^ \s* (?: \# .* )? $/x;
+            last if /^ =+ $/x;
+            my ( $file ) = split /\t/, $_;
+            push @$list, $file;
+        }
+        my %dupe;
+        @$list = grep !$dupe{ $_ }++, @$list;
+    }
+    close $fh;
+    die "No input or output files in '$FileList'!"
+        if !@input or !@output;
+    if ( $MakeList ) {
+        foreach my $file (@output) {
+            unlink $file;
+        }
+    }            
+    if ( $Verbose ) {
+        print "Expecting ".scalar( @input )." input files. ",
+              "Checking ".scalar( @output )." output files.\n";
+    }
+    # we set maxtime to be the youngest input file, including $0 itself.
+    my $maxtime = -M $0; # do this before the chdir!
+    if ($UseDir) {
+        chdir $UseDir or die "Failed to chdir to '$UseDir':$!";
+    }
+    foreach my $in (@input) {
+        my $time = -M $in;
+        die "Missing input file '$in'" unless defined $time;
+        $maxtime = $time if $maxtime < $time;
+    }
+
+    # now we check to see if any output files are older than maxtime, if
+    # they are we need to continue on, otherwise we can presumably bail.
+    my $ok = 1;
+    foreach my $out (@output) {
+        if ( ! -e $out ) {
+            print "'$out' is missing.\n"
+                if $Verbose;
+            $ok = 0;
+            last;
+        }
+        if ( -M $out > $maxtime ) {
+            print "'$out' is too old.\n"
+                if $Verbose;
+            $ok = 0;
+            last;
+        }
+    }
+    if ($ok) {
+        print "Files seem to be ok, not bothering to rebuild.\n";
+        exit(0);
+    }
+    print "Must rebuild tables.\n"
+        if $Verbose;
+} else {
+    if ($Verbose) {
+        print "Not checking filelist.\n";
+    }
+    if ($UseDir) {
+        chdir $UseDir or die "Failed to chdir to '$UseDir':$!";
+    }
+}
+
+foreach my $lib ('To', 'lib',
+		 map {File::Spec->catdir("lib",$_)}
+		 qw(gc_sc dt bc hst ea jt lb nt ccc)) {
+  next if -d $lib;
+  mkdir $lib, 0755 or die "mkdir '$lib': $!";
+}
+
+my $LastUnicodeCodepoint = 0x10FFFF; # As of Unicode 3.1.1.
+
+my $HEADER=<<"EOF";
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+# This file is built by $0 from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+EOF
+
+sub force_unlink {
+    my $filename = shift;
+    return unless -e $filename;
+    return if CORE::unlink($filename);
+    # We might need write permission
+    chmod 0777, $filename;
+    CORE::unlink($filename) or die "Couldn't unlink $filename: $!\n";
+}
+
+##
+## Given a filename and a reference to an array of lines,
+## write the lines to the file only if the contents have not changed.
+## Filename can be given as an arrayref of directory names
+##
+sub WriteIfChanged($\@)
+{
+    my $file  = shift;
+    my $lines = shift;
+
+    $file = File::Spec->catfile(@$file) if ref $file;
+
+    my $TextToWrite = join '', @$lines;
+    if (open IN, $file) {
+        local($/) = undef;
+        my $PreviousText = <IN>;
+        close IN;
+        if ($PreviousText eq $TextToWrite) {
+            print "$file unchanged.\n" if $Verbose;
+            return unless $AlwaysWrite;
+        }
+    }
+    force_unlink ($file);
+    if (not open OUT, ">$file") {
+        die "$0: can't open $file for output: $!\n";
+    }
+    print "$file written.\n" if $Verbose;
+
+    print OUT $TextToWrite;
+    close OUT;
+}
+
+##
+## The main datastructure (a "Table") represents a set of code points that
+## are part of a particular quality (that are part of \pL, \p{InGreek},
+## etc.). They are kept as ranges of code points (starting and ending of
+## each range).
+##
+## For example, a range ASCII LETTERS would be represented as:
+##   [ [ 0x41 => 0x5A, 'UPPER' ],
+##     [ 0x61 => 0x7A, 'LOWER, ] ]
+##
+sub RANGE_START() { 0 } ## index into range element
+sub RANGE_END()   { 1 } ## index into range element
+sub RANGE_NAME()  { 2 } ## index into range element
+
+## Conceptually, these should really be folded into the 'Table' objects
+my %TableInfo;
+my %TableDesc;
+my %FuzzyNames;
+my %AliasInfo;
+my %CanonicalToOrig;
+
+##
+## Turn something like
+##    OLD-ITALIC
+## into
+##    OldItalic
+##
+sub CanonicalName($)
+{
+    my $orig = shift;
+    my $name = lc $orig;
+    $name =~ s/(?<![a-z])(\w)/\u$1/g;
+    $name =~ s/[-_\s]+//g;
+
+    $CanonicalToOrig{$name} = $orig if not $CanonicalToOrig{$name};
+    return $name;
+}
+
+
+##
+## Store the alias definitions for later use.
+##
+my %PropertyAlias;
+my %PropValueAlias;
+
+my %PA_reverse;
+my %PVA_reverse;
+
+sub Build_Aliases()
+{
+    ##
+    ## Most of the work with aliases doesn't occur here,
+    ## but rather in utf8_heavy.pl, which uses PVA.pl,
+
+    # Placate the warnings about used only once. (They are used again, but
+    # via a typeglob lookup)
+    %utf8::PropertyAlias = ();
+    %utf8::PA_reverse = ();
+    %utf8::PropValueAlias = ();
+    %utf8::PVA_reverse = ();
+    %utf8::PVA_abbr_map = ();
+
+    open PA, "< PropertyAliases.txt"
+	or confess "Can't open PropertyAliases.txt: $!";
+    while (<PA>) {
+	s/#.*//;
+	s/\s+$//;
+	next if /^$/;
+
+	my ($abbrev, $name) = split /\s*;\s*/;
+        next if $abbrev eq "n/a";
+	$PropertyAlias{$abbrev} = $name;
+        $PA_reverse{$name} = $abbrev;
+
+	# The %utf8::... versions use japhy's code originally from utf8_pva.pl
+	# However, it's moved here so that we build the tables at runtime.
+	tr/ _-//d for $abbrev, $name;
+	$utf8::PropertyAlias{lc $abbrev} = $name;
+	$utf8::PA_reverse{lc $name} = $abbrev;
+    }
+    close PA;
+
+    open PVA, "< PropValueAliases.txt"
+	or confess "Can't open PropValueAliases.txt: $!";
+    while (<PVA>) {
+	s/#.*//;
+	s/\s+$//;
+	next if /^$/;
+
+	my ($prop, @data) = split /\s*;\s*/;
+
+	if ($prop eq 'ccc') {
+	    $PropValueAlias{$prop}{$data[1]} = [ @data[0,2] ];
+	    $PVA_reverse{$prop}{$data[2]} = [ @data[0,1] ];
+	}
+	else {
+            next if $data[0] eq "n/a";
+	    $PropValueAlias{$prop}{$data[0]} = $data[1];
+            $PVA_reverse{$prop}{$data[1]} = $data[0];
+	}
+
+	shift @data if $prop eq 'ccc';
+	next if $data[0] eq "n/a";
+
+	$data[1] =~ tr/ _-//d;
+	$utf8::PropValueAlias{$prop}{lc $data[0]} = $data[1];
+	$utf8::PVA_reverse{$prop}{lc $data[1]} = $data[0];
+
+	my $abbr_class = ($prop eq 'gc' or $prop eq 'sc') ? 'gc_sc' : $prop;
+	$utf8::PVA_abbr_map{$abbr_class}{lc $data[0]} = $data[0];
+    }
+    close PVA;
+
+    # backwards compatibility for L& -> LC
+    $utf8::PropValueAlias{gc}{'l&'} = $utf8::PropValueAlias{gc}{lc};
+    $utf8::PVA_abbr_map{gc_sc}{'l&'} = $utf8::PVA_abbr_map{gc_sc}{lc};
+
+}
+
+
+##
+## Associates a property ("Greek", "Lu", "Assigned",...) with a Table.
+##
+## Called like:
+##       New_Prop(In => 'Greek', $Table, Desc => 'Greek Block', Fuzzy => 1);
+##
+## Normally, these parameters are set when the Table is created (when the
+## Table->New constructor is called), but there are times when it needs to
+## be done after-the-fact...)
+##
+sub New_Prop($$$@)
+{
+    my $Type = shift; ## "Is" or "In";
+    my $Name = shift;
+    my $Table = shift;
+
+    ## remaining args are optional key/val
+    my %Args = @_;
+
+    my $Fuzzy = delete $Args{Fuzzy};
+    my $Desc  = delete $Args{Desc}; # description
+
+    $Name = CanonicalName($Name) if $Fuzzy;
+
+    ## sanity check a few args
+    if (%Args or ($Type ne 'Is' and $Type ne 'In') or not ref $Table) {
+        confess "$0: bad args to New_Prop"
+    }
+
+    if (not $TableInfo{$Type}->{$Name})
+    {
+        $TableInfo{$Type}->{$Name} = $Table;
+        $TableDesc{$Type}->{$Name} = $Desc;
+        if ($Fuzzy) {
+            $FuzzyNames{$Type}->{$Name} = $Name;
+        }
+    }
+}
+
+
+##
+## Creates a new Table object.
+##
+## Args are key/value pairs:
+##    In => Name         -- Name of "In" property to be associated with
+##    Is => Name         -- Name of "Is" property to be associated with
+##    Fuzzy => Boolean   -- True if name can be accessed "fuzzily"
+##    Desc  => String    -- Description of the property
+##
+## No args are required.
+##
+sub Table::New
+{
+    my $class = shift;
+    my %Args = @_;
+
+    my $Table = bless [], $class;
+
+    my $Fuzzy = delete $Args{Fuzzy};
+    my $Desc  = delete $Args{Desc};
+
+    for my $Type ('Is', 'In')
+    {
+        if (my $Name = delete $Args{$Type}) {
+            New_Prop($Type => $Name, $Table, Desc => $Desc, Fuzzy => $Fuzzy);
+        }
+    }
+
+    ## shouldn't have any left over
+    if (%Args) {
+        confess "$0: bad args to Table->New"
+    }
+
+    return $Table;
+}
+
+
+##
+## Returns the maximum code point currently in the table.
+##
+sub Table::Max
+{
+    my $last = $_[0]->[-1];      ## last code point
+    confess "oops" unless $last; ## must have code points to have a max
+    return $last->[RANGE_END];
+}
+
+##
+## Replaces the codepoints in the Table with those in the Table given
+## as an arg. (NOTE: this is not a "deep copy").
+##
+sub Table::Replace($$)
+{
+    my $Table = shift; #self
+    my $New   = shift;
+
+    @$Table = @$New;
+}
+
+##
+## Given a new code point, make the last range of the Table extend to
+## include the new (and all intervening) code points.
+##
+## Takes the time to make sure that the extension is valid.
+##
+sub Table::Extend
+{
+    my $Table = shift; #self
+    my $codepoint = shift;
+
+    my $PrevMax = $Table->Max;
+
+    confess "oops ($codepoint <= $PrevMax)" if $codepoint <= $PrevMax;
+
+    $Table->ExtendNoCheck($codepoint);
+}
+
+
+##
+## Given a new code point, make the last range of the Table extend to
+## include the new (and all intervening) code points.
+##
+## Does NOT check that the extension is valid.  Assumes that the caller
+## has already made this check.
+##
+sub Table::ExtendNoCheck
+{
+    ## Optmized adding: Assumes $Table and $codepoint as parms
+    $_[0]->[-1]->[RANGE_END] = $_[1];
+}
+
+##
+## Given a code point range start and end (and optional name), blindly
+## append them to the list of ranges for the Table.
+##
+## NOTE: Code points must be added in strictly ascending numeric order.
+##
+sub Table::RawAppendRange
+{
+    my $Table = shift; #self
+    my $start = shift;
+    my $end   = shift;
+    my $name  = shift;
+    $name = "" if not defined $name; ## warning: $name can be "0"
+
+    push @$Table, [ $start,    # RANGE_START
+                    $end,      # RANGE_END
+                    $name   ]; # RANGE_NAME
+}
+
+##
+## Given a code point (and optional name), add it to the Table.
+##
+## NOTE: Code points must be added in strictly ascending numeric order.
+##
+sub Table::Append
+{
+    my $Table     = shift; #self
+    my $codepoint = shift;
+    my $name      = shift;
+    $name = "" if not defined $name; ## warning: $name can be "0"
+
+    ##
+    ## If we've already got a range working, and this code point is the next
+    ## one in line, and if the name is the same, just extend the current range.
+    ##
+    my $last = $Table->[-1];
+    if ($last
+        and
+        $last->[RANGE_END] == $codepoint - 1
+        and
+        $last->[RANGE_NAME] eq $name)
+    {
+        $Table->ExtendNoCheck($codepoint);
+    }
+    else
+    {
+        $Table->RawAppendRange($codepoint, $codepoint, $name);
+    }
+}
+
+##
+## Given a code point range starting value and ending value (and name),
+## Add the range to teh Table.
+##
+## NOTE: Code points must be added in strictly ascending numeric order.
+##
+sub Table::AppendRange
+{
+    my $Table = shift; #self
+    my $start = shift;
+    my $end   = shift;
+    my $name  = shift;
+    $name = "" if not defined $name; ## warning: $name can be "0"
+
+    $Table->Append($start, $name);
+    $Table->Extend($end) if $end > $start;
+}
+
+##
+## Return a new Table that represents all code points not in the Table.
+##
+sub Table::Invert
+{
+    my $Table = shift; #self
+
+    my $New = Table->New();
+    my $max = -1;
+    for my $range (@$Table)
+    {
+        my $start = $range->[RANGE_START];
+        my $end   = $range->[RANGE_END];
+        if ($start-1 >= $max+1) {
+            $New->AppendRange($max+1, $start-1, "");
+        }
+        $max = $end;
+    }
+    if ($max+1 < $LastUnicodeCodepoint) {
+        $New->AppendRange($max+1, $LastUnicodeCodepoint);
+    }
+    return $New;
+}
+
+##
+## Merges any number of other tables with $self, returning the new table.
+## (existing tables are not modified)
+##
+##
+## Args may be Tables, or individual code points (as integers).
+##
+## Can be called as either a constructor or a method.
+##
+sub Table::Merge
+{
+    shift(@_) if not ref $_[0]; ## if called as a constructor, lose the class
+    my @Tables = @_;
+
+    ## Accumulate all records from all tables
+    my @Records;
+    for my $Arg (@Tables)
+    {
+        if (ref $Arg) {
+            ## arg is a table -- get its ranges
+            push @Records, @$Arg;
+        } else {
+            ## arg is a codepoint, make a range
+            push @Records, [ $Arg, $Arg ]
+        }
+    }
+
+    ## sort by range start, with longer ranges coming first.
+    my ($first, @Rest) = sort {
+        ($a->[RANGE_START] <=> $b->[RANGE_START])
+          or
+        ($b->[RANGE_END]   <=> $b->[RANGE_END])
+    } @Records;
+
+    my $New = Table->New();
+
+    ## Ensuring the first range is there makes the subsequent loop easier
+    $New->AppendRange($first->[RANGE_START],
+                      $first->[RANGE_END]);
+
+    ## Fold in records so long as they add new information.
+    for my $set (@Rest)
+    {
+        my $start = $set->[RANGE_START];
+        my $end   = $set->[RANGE_END];
+        if ($start > $New->Max) {
+            $New->AppendRange($start, $end);
+        } elsif ($end > $New->Max) {
+            $New->ExtendNoCheck($end);
+        }
+    }
+
+    return $New;
+}
+
+##
+## Given a filename, write a representation of the Table to a file.
+## May have an optional comment as a 2nd arg.
+## Filename may actually be an arrayref of directories
+##
+sub Table::Write
+{
+    my $Table    = shift; #self
+    my $filename = shift;
+    my $comment  = shift;
+
+    my @OUT = $HEADER;
+    if (defined $comment) {
+        $comment =~ s/\s+\Z//;
+        $comment =~ s/^/# /gm;
+        push @OUT, "#\n$comment\n#\n";
+    }
+    push @OUT, "return <<'END';\n";
+
+    for my $set (@$Table)
+    {
+        my $start = $set->[RANGE_START];
+        my $end   = $set->[RANGE_END];
+        my $name  = $set->[RANGE_NAME];
+
+        if ($start == $end) {
+            push @OUT, sprintf "%04X\t\t%s\n", $start, $name;
+        } else {
+            push @OUT, sprintf "%04X\t%04X\t%s\n", $start, $end, $name;
+        }
+    }
+
+    push @OUT, "END\n";
+
+    WriteIfChanged($filename, @OUT);
+}
+
+## This used only for making the test script.
+## helper function
+sub IsUsable($)
+{
+    my $code = shift;
+    return 0 if $code <= 0x0000;                       ## don't use null
+    return 0 if $code >= $LastUnicodeCodepoint;        ## keep in range
+    return 0 if ($code >= 0xD800 and $code <= 0xDFFF); ## no surrogates
+    return 0 if ($code >= 0xFDD0 and $code <= 0xFDEF); ## utf8.c says no good
+    return 0 if (($code & 0xFFFF) == 0xFFFE);          ## utf8.c says no good
+    return 0 if (($code & 0xFFFF) == 0xFFFF);          ## utf8.c says no good
+    return 1;
+}
+
+## Return a code point that's part of the table.
+## Returns nothing if the table is empty (or covers only surrogates).
+## This used only for making the test script.
+sub Table::ValidCode
+{
+    my $Table = shift; #self
+    for my $set (@$Table) {
+        return $set->[RANGE_END] if IsUsable($set->[RANGE_END]);
+    }
+    return ();
+}
+
+## Return a code point that's not part of the table
+## Returns nothing if the table covers all code points.
+## This used only for making the test script.
+sub Table::InvalidCode
+{
+    my $Table = shift; #self
+
+    return 0x1234 if not @$Table;
+
+    for my $set (@$Table)
+    {
+        if (IsUsable($set->[RANGE_END] + 1))
+        {
+            return $set->[RANGE_END] + 1;
+        }
+
+        if (IsUsable($set->[RANGE_START] - 1))
+        {
+            return $set->[RANGE_START] - 1;
+        }
+    }
+    return ();
+}
+
+###########################################################################
+###########################################################################
+###########################################################################
+
+
+##
+## Called like:
+##     New_Alias(Is => 'All', SameAs => 'Any', Fuzzy => 1);
+##
+## The args must be in that order, although the Fuzzy pair may be omitted.
+##
+## This creates 'IsAll' as an alias for 'IsAny'
+##
+sub New_Alias($$$@)
+{
+    my $Type   = shift; ## "Is" or "In"
+    my $Alias  = shift;
+    my $SameAs = shift; # expecting "SameAs" -- just ignored
+    my $Name   = shift;
+
+    ## remaining args are optional key/val
+    my %Args = @_;
+
+    my $Fuzzy = delete $Args{Fuzzy};
+
+    ## sanity check a few args
+    if (%Args or ($Type ne 'Is' and $Type ne 'In') or $SameAs ne 'SameAs') {
+        confess "$0: bad args to New_Alias"
+    }
+
+    $Alias = CanonicalName($Alias) if $Fuzzy;
+
+    if (not $TableInfo{$Type}->{$Name})
+    {
+        my $CName = CanonicalName($Name);
+        if ($TableInfo{$Type}->{$CName}) {
+            confess "$0: Use canonical form '$CName' instead of '$Name' for alias.";
+        } else {
+            confess "$0: don't have original $Type => $Name to make alias\n";
+        }
+    }
+    if ($TableInfo{$Alias}) {
+        confess "$0: already have original $Type => $Alias; can't make alias";
+    }
+    $AliasInfo{$Type}->{$Name} = $Alias;
+    if ($Fuzzy) {
+        $FuzzyNames{$Type}->{$Alias} = $Name;
+    }
+
+}
+
+
+## All assigned code points
+my $Assigned = Table->New(Is    => 'Assigned',
+                          Desc  => "All assigned code points",
+                          Fuzzy => 0);
+
+my $Name     = Table->New(); ## all characters, individually by name
+my $General  = Table->New(); ## all characters, grouped by category
+my %General;
+my %Cat;
+
+## Simple Data::Dumper alike. Good enough for our needs. We can't use the real
+## thing as we have to run under miniperl
+sub simple_dumper {
+    my @lines;
+    my $item;
+    foreach $item (@_) {
+	if (ref $item) {
+	    if (ref $item eq 'ARRAY') {
+		push @lines, "[\n", simple_dumper (@$item), "],\n";
+	    } elsif (ref $item eq 'HASH') {
+		push @lines, "{\n", simple_dumper (%$item), "},\n";
+	    } else {
+		die "Can't cope with $item";
+	    }
+	} else {
+	    if (defined $item) {
+		my $copy = $item;
+		$copy =~ s/([\'\\])/\\$1/gs;
+		push @lines, "'$copy',\n";
+	    } else {
+		push @lines, "undef,\n";
+	    }
+	}
+    }
+    @lines;
+}
+
+##
+## Process UnicodeData.txt (Categories, etc.)
+##
+sub UnicodeData_Txt()
+{
+    my $Bidi     = Table->New();
+    my $Deco     = Table->New();
+    my $Comb     = Table->New();
+    my $Number   = Table->New();
+    my $Mirrored = Table->New();#Is    => 'Mirrored',
+                              #Desc  => "Mirrored in bidirectional text",
+                              #Fuzzy => 0);
+
+    my %DC;
+    my %Bidi;
+    my %Number;
+    $DC{can} = Table->New();
+    $DC{com} = Table->New();
+
+    ## Initialize Perl-generated categories
+    ## (Categories from UnicodeData.txt are auto-initialized in gencat)
+    $Cat{Alnum}  =
+	Table->New(Is => 'Alnum',  Desc => "[[:Alnum:]]",  Fuzzy => 0);
+    $Cat{Alpha}  =
+	Table->New(Is => 'Alpha',  Desc => "[[:Alpha:]]",  Fuzzy => 0);
+    $Cat{ASCII}  =
+	Table->New(Is => 'ASCII',  Desc => "[[:ASCII:]]",  Fuzzy => 0);
+    $Cat{Blank}  =
+	Table->New(Is => 'Blank',  Desc => "[[:Blank:]]",  Fuzzy => 0);
+    $Cat{Cntrl}  =
+	Table->New(Is => 'Cntrl',  Desc => "[[:Cntrl:]]",  Fuzzy => 0);
+    $Cat{Digit}  =
+	Table->New(Is => 'Digit',  Desc => "[[:Digit:]]",  Fuzzy => 0);
+    $Cat{Graph}  =
+	Table->New(Is => 'Graph',  Desc => "[[:Graph:]]",  Fuzzy => 0);
+    $Cat{Lower}  =
+	Table->New(Is => 'Lower',  Desc => "[[:Lower:]]",  Fuzzy => 0);
+    $Cat{Print}  =
+	Table->New(Is => 'Print',  Desc => "[[:Print:]]",  Fuzzy => 0);
+    $Cat{Punct}  =
+	Table->New(Is => 'Punct',  Desc => "[[:Punct:]]",  Fuzzy => 0);
+    $Cat{Space}  =
+	Table->New(Is => 'Space',  Desc => "[[:Space:]]",  Fuzzy => 0);
+    $Cat{Title}  =
+	Table->New(Is => 'Title',  Desc => "[[:Title:]]",  Fuzzy => 0);
+    $Cat{Upper}  =
+	Table->New(Is => 'Upper',  Desc => "[[:Upper:]]",  Fuzzy => 0);
+    $Cat{XDigit} =
+	Table->New(Is => 'XDigit', Desc => "[[:XDigit:]]", Fuzzy => 0);
+    $Cat{Word}   =
+	Table->New(Is => 'Word',   Desc => "[[:Word:]]",   Fuzzy => 0);
+    $Cat{SpacePerl} =
+	Table->New(Is => 'SpacePerl', Desc => '\s', Fuzzy => 0);
+
+    my %To;
+    $To{Upper} = Table->New();
+    $To{Lower} = Table->New();
+    $To{Title} = Table->New();
+    $To{Digit} = Table->New();
+
+    sub gencat($$$$)
+    {
+        my ($name, ## Name ("LATIN CAPITAL LETTER A")
+            $cat,  ## Category ("Lu", "Zp", "Nd", etc.)
+            $code, ## Code point (as an integer)
+            $op) = @_;
+
+        my $MajorCat = substr($cat, 0, 1); ## L, M, Z, S, etc
+
+        $Assigned->$op($code);
+        $Name->$op($code, $name);
+        $General->$op($code, $cat);
+
+        ## add to the sub category (e.g. "Lu", "Nd", "Cf", ..)
+        $Cat{$cat}      ||= Table->New(Is   => $cat,
+                                       Desc => "General Category '$cat'",
+                                       Fuzzy => 0);
+        $Cat{$cat}->$op($code);
+
+        ## add to the major category (e.g. "L", "N", "C", ...)
+        $Cat{$MajorCat} ||= Table->New(Is => $MajorCat,
+                                       Desc => "Major Category '$MajorCat'",
+                                       Fuzzy => 0);
+        $Cat{$MajorCat}->$op($code);
+
+        ($General{$name} ||= Table->New)->$op($code, $name);
+
+        # 005F: SPACING UNDERSCORE
+        $Cat{Word}->$op($code)  if $cat =~ /^[LMN]|Pc/;
+        $Cat{Alnum}->$op($code) if $cat =~ /^[LM]|Nd/;
+        $Cat{Alpha}->$op($code) if $cat =~ /^[LM]/;
+
+	my $isspace = 
+	    ($cat =~ /Zs|Zl|Zp/ &&
+	     $code != 0x200B) # 200B is ZWSP which is for line break control
+	     # and therefore it is not part of "space" even while it is "Zs".
+                                || $code == 0x0009  # 0009: HORIZONTAL TAB
+                                || $code == 0x000A  # 000A: LINE FEED
+                                || $code == 0x000B  # 000B: VERTICAL TAB
+                                || $code == 0x000C  # 000C: FORM FEED
+                                || $code == 0x000D  # 000D: CARRIAGE RETURN
+                                || $code == 0x0085  # 0085: NEL
+
+	    ;
+
+        $Cat{Space}->$op($code) if $isspace;
+
+        $Cat{SpacePerl}->$op($code) if $isspace
+	                               && $code != 0x000B; # Backward compat.
+
+        $Cat{Blank}->$op($code) if $isspace
+                                && !($code == 0x000A ||
+				     $code == 0x000B ||
+				     $code == 0x000C ||
+				     $code == 0x000D ||
+				     $code == 0x0085 ||
+				     $cat =~ /^Z[lp]/);
+
+        $Cat{Digit}->$op($code) if $cat eq "Nd";
+        $Cat{Upper}->$op($code) if $cat eq "Lu";
+        $Cat{Lower}->$op($code) if $cat eq "Ll";
+        $Cat{Title}->$op($code) if $cat eq "Lt";
+        $Cat{ASCII}->$op($code) if $code <= 0x007F;
+        $Cat{Cntrl}->$op($code) if $cat =~ /^C/;
+	my $isgraph = !$isspace && $cat !~ /Cc|Cs|Cn/;
+        $Cat{Graph}->$op($code) if $isgraph;
+        $Cat{Print}->$op($code) if $isgraph || $isspace;
+        $Cat{Punct}->$op($code) if $cat =~ /^P/;
+
+        $Cat{XDigit}->$op($code) if ($code >= 0x30 && $code <= 0x39)  ## 0..9
+                                 || ($code >= 0x41 && $code <= 0x46)  ## A..F
+                                 || ($code >= 0x61 && $code <= 0x66); ## a..f
+    }
+
+    ## open ane read file.....
+    if (not open IN, "UnicodeData.txt") {
+        die "$0: UnicodeData.txt: $!\n";
+    }
+
+    ##
+    ## For building \p{_CombAbove} and \p{_CanonDCIJ}
+    ##
+    my %_Above_HexCodes; ## Hexcodes for chars with $comb == 230 ("ABOVE")
+
+    my %CodeToDeco;      ## Maps code to decomp. list for chars with first
+                         ## decomp. char an "i" or "j" (for \p{_CanonDCIJ})
+
+    ## This is filled in as we go....
+    my $CombAbove = Table->New(Is   => '_CombAbove',
+                               Desc  => '(for internal casefolding use)',
+                               Fuzzy => 0);
+
+    while (<IN>)
+    {
+        next unless /^[0-9A-Fa-f]+;/;
+        s/\s+$//;
+
+        my ($hexcode,   ## code point in hex (e.g. "0041")
+            $name,      ## character name (e.g. "LATIN CAPITAL LETTER A")
+            $cat,       ## category (e.g. "Lu")
+            $comb,      ## Canonical combining class (e.t. "230")
+            $bidi,      ## directional category (e.g. "L")
+            $deco,      ## decomposition mapping
+            $decimal,   ## decimal digit value
+            $digit,     ## digit value
+            $number,    ## numeric value
+            $mirrored,  ## mirrored
+            $unicode10, ## name in Unicode 1.0
+            $comment,   ## comment field
+            $upper,     ## uppercase mapping
+            $lower,     ## lowercase mapping
+            $title,     ## titlecase mapping
+              ) = split(/\s*;\s*/);
+
+	# Note that in Unicode 3.2 there will be names like
+	# LINE FEED (LF), which probably means that \N{} needs
+	# to cope also with LINE FEED and LF.
+	$name = $unicode10 if $name eq '<control>' && $unicode10 ne '';
+
+        my $code = hex($hexcode);
+
+        if ($comb and $comb == 230) {
+            $CombAbove->Append($code);
+            $_Above_HexCodes{$hexcode} = 1;
+        }
+
+        ## Used in building \p{_CanonDCIJ}
+        if ($deco and $deco =~ m/^006[9A]\b/) {
+            $CodeToDeco{$code} = $deco;
+        }
+
+        ##
+        ## There are a few pairs of lines like:
+        ##   AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+        ##   D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+        ## that define ranges.
+        ##
+        if ($name =~ /^<(.+), (First|Last)>$/)
+        {
+            $name = $1;
+            gencat($name, $cat, $code, $2 eq 'First' ? 'Append' : 'Extend');
+            #New_Prop(In => $name, $General{$name}, Fuzzy => 1);
+        }
+        else
+        {
+            ## normal (single-character) lines
+            gencat($name, $cat, $code, 'Append');
+
+            # No Append() here since since several codes may map into one.
+            $To{Upper}->RawAppendRange($code, $code, $upper) if $upper;
+            $To{Lower}->RawAppendRange($code, $code, $lower) if $lower;
+            $To{Title}->RawAppendRange($code, $code, $title) if $title;
+            $To{Digit}->Append($code, $decimal) if length $decimal;
+
+            $Bidi->Append($code, $bidi);
+            $Comb->Append($code, $comb) if $comb;
+            $Number->Append($code, $number) if length $number;
+
+	    length($decimal) and ($Number{De} ||= Table->New())->Append($code)
+	      or
+	    length($digit)   and ($Number{Di} ||= Table->New())->Append($code)
+	      or
+	    length($number)  and ($Number{Nu} ||= Table->New())->Append($code);
+
+            $Mirrored->Append($code) if $mirrored eq "Y";
+
+            $Bidi{$bidi} ||= Table->New();#Is    => "bt/$bidi",
+                                        #Desc  => "Bi-directional category '$bidi'",
+                                        #Fuzzy => 0);
+            $Bidi{$bidi}->Append($code);
+
+            if ($deco)
+            {
+                $Deco->Append($code, $deco);
+                if ($deco =~/^<(\w+)>/)
+                {
+		    my $dshort = $PVA_reverse{dt}{ucfirst lc $1};
+                    $DC{com}->Append($code);
+
+                    $DC{$dshort} ||= Table->New();
+                    $DC{$dshort}->Append($code);
+                }
+                else
+                {
+                    $DC{can}->Append($code);
+                }
+            }
+        }
+    }
+    close IN;
+
+    ##
+    ## Tidy up a few special cases....
+    ##
+
+    $Cat{Cn} = $Assigned->Invert; ## Cn is everything that doesn't exist
+    New_Prop(Is => 'Cn',
+             $Cat{Cn},
+             Desc => "General Category 'Cn' [not functional in Perl]",
+             Fuzzy => 0);
+
+    ## Unassigned is the same as 'Cn'
+    New_Alias(Is => 'Unassigned', SameAs => 'Cn', Fuzzy => 0);
+
+    $Cat{C}->Replace($Cat{C}->Merge($Cat{Cn}));  ## Now merge in Cn into C
+
+
+    # LC is Ll, Lu, and Lt.
+    # (used to be L& or L_, but PropValueAliases.txt defines it as LC)
+    New_Prop(Is => 'LC',
+             Table->Merge(@Cat{qw[Ll Lu Lt]}),
+             Desc  => '[\p{Ll}\p{Lu}\p{Lt}]',
+             Fuzzy => 0);
+
+    ## Any and All are all code points.
+    my $Any = Table->New(Is    => 'Any',
+                         Desc  => sprintf("[\\x{0000}-\\x{%X}]",
+                                          $LastUnicodeCodepoint),
+                         Fuzzy => 0);
+    $Any->RawAppendRange(0, $LastUnicodeCodepoint);
+
+    New_Alias(Is => 'All', SameAs => 'Any', Fuzzy => 0);
+
+    ##
+    ## Build special properties for Perl's internal case-folding needs:
+    ##    \p{_CaseIgnorable}
+    ##    \p{_CanonDCIJ}
+    ##    \p{_CombAbove}
+    ## _CombAbove was built above. Others are built here....
+    ##
+
+    ## \p{_CaseIgnorable} is [\p{Mn}\0x00AD\x2010]
+    New_Prop(Is => '_CaseIgnorable',
+             Table->Merge($Cat{Mn},
+                          0x00AD,    #SOFT HYPHEN
+                          0x2010),   #HYPHEN
+             Desc  => '(for internal casefolding use)',
+             Fuzzy => 0);
+
+
+    ## \p{_CanonDCIJ} is fairly complex...
+    my $CanonCDIJ = Table->New(Is    => '_CanonDCIJ',
+                               Desc  => '(for internal casefolding use)',
+                               Fuzzy => 0);
+    ## It contains the ASCII 'i' and 'j'....
+    $CanonCDIJ->Append(0x0069); # ASCII ord("i")
+    $CanonCDIJ->Append(0x006A); # ASCII ord("j")
+    ## ...and any character with a decomposition that starts with either of
+    ## those code points, but only if the decomposition does not have any
+    ## combining character with the "ABOVE" canonical combining class.
+    for my $code (sort { $a <=> $b} keys %CodeToDeco)
+    {
+        ## Need to ensure that all decomposition characters do not have
+        ## a %HexCodeToComb in %AboveCombClasses.
+        my $want = 1;
+        for my $deco_hexcode (split / /, $CodeToDeco{$code})
+        {
+            if (exists $_Above_HexCodes{$deco_hexcode}) {
+                ## one of the decmposition chars has an ABOVE combination
+                ## class, so we're not interested in this one
+                $want = 0;
+                last;
+            }
+        }
+        if ($want) {
+            $CanonCDIJ->Append($code);
+        }
+    }
+
+
+
+    ##
+    ## Now dump the files.
+    ##
+    $Name->Write("Name.pl");
+
+    {
+	my @PVA = $HEADER;
+	foreach my $name (qw (PropertyAlias PA_reverse PropValueAlias
+			      PVA_reverse PVA_abbr_map)) {
+	    # Should I really jump through typeglob hoops just to avoid a
+	    # symbolic reference? (%{"utf8::$name})
+	    push @PVA, "\n", "\%utf8::$name = (\n",
+		simple_dumper (%{$utf8::{$name}}), ");\n";
+	}
+	push @PVA, "1;\n";
+	WriteIfChanged("PVA.pl", @PVA);
+    }
+
+    # $Bidi->Write("Bidirectional.pl");
+    for (keys %Bidi) {
+	$Bidi{$_}->Write(
+	    ["lib","bc","$_.pl"],
+	    "BidiClass category '$PropValueAlias{bc}{$_}'"
+	);
+    }
+
+    $Comb->Write("CombiningClass.pl");
+    for (keys %{ $PropValueAlias{ccc} }) {
+	my ($code, $name) = @{ $PropValueAlias{ccc}{$_} };
+	(my $c = Table->New())->Append($code);
+	$c->Write(
+	    ["lib","ccc","$_.pl"],
+	    "CombiningClass category '$name'"
+	);
+    }
+
+    $Deco->Write("Decomposition.pl");
+    for (keys %DC) {
+	$DC{$_}->Write(
+	    ["lib","dt","$_.pl"],
+	    "DecompositionType category '$PropValueAlias{dt}{$_}'"
+	);
+    }
+
+    # $Number->Write("Number.pl");
+    for (keys %Number) {
+	$Number{$_}->Write(
+	    ["lib","nt","$_.pl"],
+	    "NumericType category '$PropValueAlias{nt}{$_}'"
+	);
+    }
+
+    # $General->Write("Category.pl");
+
+    for my $to (sort keys %To) {
+        $To{$to}->Write(["To","$to.pl"]);
+    }
+
+    for (keys %{ $PropValueAlias{gc} }) {
+	New_Alias(Is => $PropValueAlias{gc}{$_}, SameAs => $_, Fuzzy => 1);
+    }
+}
+
+##
+## Process LineBreak.txt
+##
+sub LineBreak_Txt()
+{
+    if (not open IN, "LineBreak.txt") {
+        die "$0: LineBreak.txt: $!\n";
+    }
+
+    my $Lbrk = Table->New();
+    my %Lbrk;
+
+    while (<IN>)
+    {
+        next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(\w+)/;
+
+	my ($first, $last, $lbrk) = (hex($1), hex($2||""), $3);
+
+	$Lbrk->Append($first, $lbrk);
+
+        $Lbrk{$lbrk} ||= Table->New();
+        $Lbrk{$lbrk}->Append($first);
+
+	if ($last) {
+	    $Lbrk->Extend($last);
+	    $Lbrk{$lbrk}->Extend($last);
+	}
+    }
+    close IN;
+
+    # $Lbrk->Write("Lbrk.pl");
+
+
+    for (keys %Lbrk) {
+	$Lbrk{$_}->Write(
+	    ["lib","lb","$_.pl"],
+	    "Linebreak category '$PropValueAlias{lb}{$_}'"
+	);
+    }
+}
+
+##
+## Process ArabicShaping.txt.
+##
+sub ArabicShaping_txt()
+{
+    if (not open IN, "ArabicShaping.txt") {
+        die "$0: ArabicShaping.txt: $!\n";
+    }
+
+    my $ArabLink      = Table->New();
+    my $ArabLinkGroup = Table->New();
+
+    my %JoinType;
+
+    while (<IN>)
+    {
+	next unless /^[0-9A-Fa-f]+;/;
+	s/\s+$//;
+
+	my ($hexcode, $name, $link, $linkgroup) = split(/\s*;\s*/);
+        my $code = hex($hexcode);
+	$ArabLink->Append($code, $link);
+	$ArabLinkGroup->Append($code, $linkgroup);
+
+        $JoinType{$link} ||= Table->New(Is => "JoinType$link");
+        $JoinType{$link}->Append($code);
+    }
+    close IN;
+
+    # $ArabLink->Write("ArabLink.pl");
+    # $ArabLinkGroup->Write("ArabLnkGrp.pl");
+
+
+    for (keys %JoinType) {
+	$JoinType{$_}->Write(
+	    ["lib","jt","$_.pl"],
+	    "JoiningType category '$PropValueAlias{jt}{$_}'"
+	);
+    }
+}
+
+##
+## Process EastAsianWidth.txt.
+##
+sub EastAsianWidth_txt()
+{
+    if (not open IN, "EastAsianWidth.txt") {
+        die "$0: EastAsianWidth.txt: $!\n";
+    }
+
+    my %EAW;
+
+    while (<IN>)
+    {
+	next unless /^[0-9A-Fa-f]+(\.\.[0-9A-Fa-f]+)?;/;
+	s/#.*//;
+	s/\s+$//;
+
+	my ($hexcodes, $pv) = split(/\s*;\s*/);
+        $EAW{$pv} ||= Table->New(Is => "EastAsianWidth$pv");
+      my ($start, $end) = split(/\.\./, $hexcodes);
+      if (defined $end) {
+        $EAW{$pv}->AppendRange(hex($start), hex($end));
+      } else {
+        $EAW{$pv}->Append(hex($start));
+      }
+    }
+    close IN;
+
+
+    for (keys %EAW) {
+	$EAW{$_}->Write(
+	    ["lib","ea","$_.pl"],
+	    "EastAsianWidth category '$PropValueAlias{ea}{$_}'"
+	);
+    }
+}
+
+##
+## Process HangulSyllableType.txt.
+##
+sub HangulSyllableType_txt()
+{
+    if (not open IN, "HangulSyllableType.txt") {
+        die "$0: HangulSyllableType.txt: $!\n";
+    }
+
+    my %HST;
+
+    while (<IN>)
+    {
+        next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(\w+)/;
+	my ($first, $last, $pv) = (hex($1), hex($2||""), $3);
+
+        $HST{$pv} ||= Table->New(Is => "HangulSyllableType$pv");
+        $HST{$pv}->Append($first);
+
+	if ($last) { $HST{$pv}->Extend($last) }
+    }
+    close IN;
+
+    for (keys %HST) {
+	$HST{$_}->Write(
+	    ["lib","hst","$_.pl"],
+	    "HangulSyllableType category '$PropValueAlias{hst}{$_}'"
+	);
+    }
+}
+
+##
+## Process Jamo.txt.
+##
+sub Jamo_txt()
+{
+    if (not open IN, "Jamo.txt") {
+        die "$0: Jamo.txt: $!\n";
+    }
+    my $Short = Table->New();
+
+    while (<IN>)
+    {
+	next unless /^([0-9A-Fa-f]+)\s*;\s*(\w*)/;
+	my ($code, $short) = (hex($1), $2);
+
+	$Short->Append($code, $short);
+    }
+    close IN;
+    # $Short->Write("JamoShort.pl");
+}
+
+##
+## Process Scripts.txt.
+##
+sub Scripts_txt()
+{
+    my @ScriptInfo;
+
+    if (not open(IN, "Scripts.txt")) {
+        die "$0: Scripts.txt: $!\n";
+    }
+    while (<IN>) {
+        next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(.+?)\s*\#/;
+
+        # Wait until all the scripts have been read since
+        # they are not listed in numeric order.
+        push @ScriptInfo, [ hex($1), hex($2||""), $3 ];
+    }
+    close IN;
+
+    # Now append the scripts properties in their code point order.
+
+    my %Script;
+    my $Scripts = Table->New();
+
+    for my $script (sort { $a->[0] <=> $b->[0] } @ScriptInfo)
+    {
+        my ($first, $last, $name) = @$script;
+        $Scripts->Append($first, $name);
+
+        $Script{$name} ||= Table->New(Is    => $name,
+                                      Desc  => "Script '$name'",
+                                      Fuzzy => 1);
+        $Script{$name}->Append($first, $name);
+
+        if ($last) {
+            $Scripts->Extend($last);
+            $Script{$name}->Extend($last);
+        }
+    }
+
+    # $Scripts->Write("Scripts.pl");
+
+    ## Common is everything not explicitly assigned to a Script
+    ##
+    ##    ***shouldn't this be intersected with \p{Assigned}? ******
+    ##
+    New_Prop(Is => 'Common',
+             $Scripts->Invert,
+             Desc  => 'Pseudo-Script of codepoints not in other Unicode scripts',
+             Fuzzy => 1);
+}
+
+##
+## Given a name like "Close Punctuation", return a regex (that when applied
+## with /i) matches any valid form of that name (e.g. "ClosePunctuation",
+## "Close-Punctuation", etc.)
+##
+## Accept any space, dash, or underbar where in the official name there is
+## space or a dash (or underbar, but there never is).
+##
+##
+sub NameToRegex($)
+{
+    my $Name = shift;
+    $Name =~ s/[- _]/(?:[-_]|\\s+)?/g;
+    return $Name;
+}
+
+##
+## Process Blocks.txt.
+##
+sub Blocks_txt()
+{
+    my $Blocks = Table->New();
+    my %Blocks;
+
+    if (not open IN, "Blocks.txt") {
+        die "$0: Blocks.txt: $!\n";
+    }
+
+    while (<IN>)
+    {
+        #next if not /Private Use$/;
+	next if not /^([0-9A-Fa-f]+)\.\.([0-9A-Fa-f]+)\s*;\s*(.+?)\s*$/;
+
+	my ($first, $last, $name) = (hex($1), hex($2), $3);
+
+	$Blocks->Append($first, $name);
+
+        $Blocks{$name} ||= Table->New(In    => $name,
+                                      Desc  => "Block '$name'",
+                                      Fuzzy => 1);
+        $Blocks{$name}->Append($first, $name);
+
+	if ($last and $last != $first) {
+	    $Blocks->Extend($last);
+	    $Blocks{$name}->Extend($last);
+	}
+    }
+    close IN;
+
+    # $Blocks->Write("Blocks.pl");
+}
+
+##
+## Read in the PropList.txt.  It contains extended properties not
+## listed in the UnicodeData.txt, such as 'Other_Alphabetic':
+## alphabetic but not of the general category L; many modifiers
+## belong to this extended property category: while they are not
+## alphabets, they are alphabetic in nature.
+##
+sub PropList_txt()
+{
+    my @PropInfo;
+
+    if (not open IN, "PropList.txt") {
+        die "$0: PropList.txt: $!\n";
+    }
+
+    while (<IN>)
+    {
+	next unless /^([0-9A-Fa-f]+)(?:\.\.([0-9A-Fa-f]+))?\s*;\s*(.+?)\s*\#/;
+
+	# Wait until all the extended properties have been read since
+	# they are not listed in numeric order.
+	push @PropInfo, [ hex($1), hex($2||""), $3 ];
+    }
+    close IN;
+
+    # Now append the extended properties in their code point order.
+    my $Props = Table->New();
+    my %Prop;
+
+    for my $prop (sort { $a->[0] <=> $b->[0] } @PropInfo)
+    {
+        my ($first, $last, $name) = @$prop;
+        $Props->Append($first, $name);
+
+        $Prop{$name} ||= Table->New(Is    => $name,
+                                    Desc  => "Extended property '$name'",
+                                    Fuzzy => 1);
+        $Prop{$name}->Append($first, $name);
+
+        if ($last) {
+            $Props->Extend($last);
+            $Prop{$name}->Extend($last);
+        }
+    }
+
+    for (keys %Prop) {
+	(my $file = $PA_reverse{$_}) =~ tr/_//d;
+	# XXX I'm assuming that the names from %Prop don't suffer 8.3 clashes.
+	$BaseNames{lc $file}++;
+	$Prop{$_}->Write(
+	    ["lib","gc_sc","$file.pl"],
+	    "Binary property '$_'"
+	);
+    }
+
+    # Alphabetic is L and Other_Alphabetic.
+    New_Prop(Is    => 'Alphabetic',
+             Table->Merge($Cat{L}, $Prop{Other_Alphabetic}),
+             Desc  => '[\p{L}\p{OtherAlphabetic}]', # use canonical names here
+             Fuzzy => 1);
+
+    # Lowercase is Ll and Other_Lowercase.
+    New_Prop(Is    => 'Lowercase',
+             Table->Merge($Cat{Ll}, $Prop{Other_Lowercase}),
+             Desc  => '[\p{Ll}\p{OtherLowercase}]', # use canonical names here
+             Fuzzy => 1);
+
+    # Uppercase is Lu and Other_Uppercase.
+    New_Prop(Is => 'Uppercase',
+             Table->Merge($Cat{Lu}, $Prop{Other_Uppercase}),
+             Desc  => '[\p{Lu}\p{Other_Uppercase}]', # use canonical names here
+             Fuzzy => 1);
+
+    # Math is Sm and Other_Math.
+    New_Prop(Is => 'Math',
+             Table->Merge($Cat{Sm}, $Prop{Other_Math}),
+             Desc  => '[\p{Sm}\p{OtherMath}]', # use canonical names here
+             Fuzzy => 1);
+
+    # ID_Start is Ll, Lu, Lt, Lm, Lo, and Nl.
+    New_Prop(Is => 'ID_Start',
+             Table->Merge(@Cat{qw[Ll Lu Lt Lm Lo Nl]}),
+             Desc  => '[\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{Nl}]',
+             Fuzzy => 1);
+
+    # ID_Continue is ID_Start, Mn, Mc, Nd, and Pc.
+    New_Prop(Is => 'ID_Continue',
+             Table->Merge(@Cat{qw[Ll Lu Lt Lm Lo Nl Mn Mc Nd Pc ]}),
+             Desc  => '[\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}]',
+             Fuzzy => 1);
+}
+
+
+##
+## These are used in:
+##   MakePropTestScript()
+##   WriteAllMappings()
+## for making the test script.
+##
+my %FuzzyNameToTest;
+my %ExactNameToTest;
+
+
+## This used only for making the test script
+sub GenTests($$$$)
+{
+    my $FH = shift;
+    my $Prop = shift;
+    my $MatchCode = shift;
+    my $FailCode = shift;
+
+    if (defined $MatchCode) {
+        printf $FH qq/Expect(1, "\\x{%04X}", '\\p{$Prop}' );\n/, $MatchCode;
+        printf $FH qq/Expect(0, "\\x{%04X}", '\\p{^$Prop}');\n/, $MatchCode;
+        printf $FH qq/Expect(0, "\\x{%04X}", '\\P{$Prop}' );\n/, $MatchCode;
+        printf $FH qq/Expect(1, "\\x{%04X}", '\\P{^$Prop}');\n/, $MatchCode;
+    }
+    if (defined $FailCode) {
+        printf $FH qq/Expect(0, "\\x{%04X}", '\\p{$Prop}' );\n/, $FailCode;
+        printf $FH qq/Expect(1, "\\x{%04X}", '\\p{^$Prop}');\n/, $FailCode;
+        printf $FH qq/Expect(1, "\\x{%04X}", '\\P{$Prop}' );\n/, $FailCode;
+        printf $FH qq/Expect(0, "\\x{%04X}", '\\P{^$Prop}');\n/, $FailCode;
+    }
+}
+
+## This used only for making the test script
+sub ExpectError($$)
+{
+    my $FH = shift;
+    my $prop = shift;
+
+    print $FH qq/Error('\\p{$prop}');\n/;
+    print $FH qq/Error('\\P{$prop}');\n/;
+}
+
+## This used only for making the test script
+my @GoodSeps = (
+                " ",
+                "-",
+                " \t ",
+                "",
+                "",
+                "_",
+               );
+my @BadSeps = (
+               "--",
+               "__",
+               " _",
+               "/"
+              );
+
+## This used only for making the test script
+sub RandomlyFuzzifyName($;$)
+{
+    my $Name = shift;
+    my $WantError = shift;  ## if true, make an error
+
+    my @parts;
+    for my $part (split /[-\s_]+/, $Name)
+    {
+        if (@parts) {
+            if ($WantError and rand() < 0.3) {
+                push @parts, $BadSeps[rand(@BadSeps)];
+                $WantError = 0;
+            } else {
+                push @parts, $GoodSeps[rand(@GoodSeps)];
+            }
+        }
+        my $switch = int rand(4);
+        if ($switch == 0) {
+            push @parts, uc $part;
+        } elsif ($switch == 1) {
+            push @parts, lc $part;
+        } elsif ($switch == 2) {
+            push @parts, ucfirst $part;
+        } else {
+            push @parts, $part;
+        }
+    }
+    my $new = join('', @parts);
+
+    if ($WantError) {
+        if (rand() >= 0.5) {
+            $new .= $BadSeps[rand(@BadSeps)];
+        } else {
+            $new = $BadSeps[rand(@BadSeps)] . $new;
+        }
+    }
+    return $new;
+}
+
+## This used only for making the test script
+sub MakePropTestScript()
+{
+    ## this written directly -- it's huge.
+    force_unlink ("TestProp.pl");
+    if (not open OUT, ">TestProp.pl") {
+        die "$0: TestProp.pl: $!\n";
+    }
+    print OUT <DATA>;
+
+    while (my ($Name, $Table) = each %ExactNameToTest)
+    {
+        GenTests(*OUT, $Name, $Table->ValidCode, $Table->InvalidCode);
+        ExpectError(*OUT, uc $Name) if uc $Name ne $Name;
+        ExpectError(*OUT, lc $Name) if lc $Name ne $Name;
+    }
+
+
+    while (my ($Name, $Table) = each %FuzzyNameToTest)
+    {
+        my $Orig  = $CanonicalToOrig{$Name};
+        my %Names = (
+                     $Name => 1,
+                     $Orig => 1,
+                     RandomlyFuzzifyName($Orig) => 1
+                    );
+
+        for my $N (keys %Names) {
+            GenTests(*OUT, $N, $Table->ValidCode, $Table->InvalidCode);
+        }
+
+        ExpectError(*OUT, RandomlyFuzzifyName($Orig, 'ERROR'));
+    }
+
+    print OUT "Finished();\n";
+    close OUT;
+}
+
+
+##
+## These are used only in:
+##   RegisterFileForName()
+##   WriteAllMappings()
+##
+my %Exact;      ## will become %utf8::Exact;
+my %Canonical;  ## will become %utf8::Canonical;
+my %CaComment;  ## Comment for %Canonical entry of same key
+
+##
+## Given info about a name and a datafile that it should be associated with,
+## register that assocation in %Exact and %Canonical.
+sub RegisterFileForName($$$$)
+{
+    my $Type     = shift;
+    my $Name     = shift;
+    my $IsFuzzy  = shift;
+    my $filename = shift;
+
+    ##
+    ## Now in details for the mapping. $Type eq 'Is' has the
+    ## Is removed, as it will be removed in utf8_heavy when this
+    ## data is being checked. In keeps its "In", but a second
+    ## sans-In record is written if it doesn't conflict with
+    ## anything already there.
+    ##
+    if (not $IsFuzzy)
+    {
+        if ($Type eq 'Is') {
+            die "oops[$Name]" if $Exact{$Name};
+            $Exact{$Name} = $filename;
+        } else {
+            die "oops[$Type$Name]" if $Exact{"$Type$Name"};
+            $Exact{"$Type$Name"} = $filename;
+            $Exact{$Name} = $filename if not $Exact{$Name};
+        }
+    }
+    else
+    {
+        my $CName = lc $Name;
+        if ($Type eq 'Is') {
+            die "oops[$CName]" if $Canonical{$CName};
+            $Canonical{$CName} = $filename;
+            $CaComment{$CName} = $Name if $Name =~ tr/A-Z// >= 2;
+        } else {
+            die "oops[$Type$CName]" if $Canonical{lc "$Type$CName"};
+            $Canonical{lc "$Type$CName"} = $filename;
+            $CaComment{lc "$Type$CName"} = "$Type$Name";
+            if (not $Canonical{$CName}) {
+                $Canonical{$CName} = $filename;
+                $CaComment{$CName} = "$Type$Name";
+            }
+        }
+    }
+}
+
+##
+## Writes the info accumulated in
+##
+##       %TableInfo;
+##       %FuzzyNames;
+##       %AliasInfo;
+##
+##
+sub WriteAllMappings()
+{
+    my @MAP;
+
+    ## 'Is' *MUST* come first, so its names have precidence over 'In's
+    for my $Type ('Is', 'In')
+    {
+        my %RawNameToFile; ## a per-$Type cache
+
+        for my $Name (sort {length $a <=> length $b} keys %{$TableInfo{$Type}})
+        {
+            ## Note: $Name is already canonical
+            my $Table   = $TableInfo{$Type}->{$Name};
+            my $IsFuzzy = $FuzzyNames{$Type}->{$Name};
+
+            ## Need an 8.3 safe filename (which means "an 8 safe" $filename)
+            my $filename;
+            {
+                ## 'Is' items lose 'Is' from the basename.
+                $filename = $Type eq 'Is' ?
+		    ($PVA_reverse{sc}{$Name} || $Name) :
+		    "$Type$Name";
+
+                $filename =~ s/[^\w_]+/_/g; # "L&" -> "L_"
+                substr($filename, 8) = '' if length($filename) > 8;
+
+                ##
+                ## Make sure the basename doesn't conflict with something we
+                ## might have already written. If we have, say,
+                ##     InGreekExtended1
+                ##     InGreekExtended2
+                ## they become
+                ##     InGreekE
+                ##     InGreek2
+                ##
+                while (my $num = $BaseNames{lc $filename}++)
+                {
+                    $num++; ## so basenames with numbers start with '2', which
+                            ## just looks more natural.
+                    ## Want to append $num, but if it'll make the basename longer
+                    ## than 8 characters, pre-truncate $filename so that the result
+                    ## is acceptable.
+                    my $delta = length($filename) + length($num) - 8;
+                    if ($delta > 0) {
+                        substr($filename, -$delta) = $num;
+                    } else {
+                        $filename .= $num;
+                    }
+                }
+            };
+
+            ##
+            ## Construct a nice comment to add to the file, and build data
+            ## for the "./Properties" file along the way.
+            ##
+            my $Comment;
+            {
+                my $Desc = $TableDesc{$Type}->{$Name} || "";
+                ## get list of names this table is reference by
+                my @Supported = $Name;
+                while (my ($Orig, $Alias) = each %{ $AliasInfo{$Type} })
+                {
+                    if ($Orig eq $Name) {
+                        push @Supported, $Alias;
+                    }
+                }
+
+                my $TypeToShow = $Type eq 'Is' ? "" : $Type;
+                my $OrigProp;
+
+                $Comment = "This file supports:\n";
+                for my $N (@Supported)
+                {
+                    my $IsFuzzy = $FuzzyNames{$Type}->{$N};
+                    my $Prop    = "\\p{$TypeToShow$Name}";
+                    $OrigProp = $Prop if not $OrigProp; #cache for aliases
+                    if ($IsFuzzy) {
+                        $Comment .= "\t$Prop (and fuzzy permutations)\n";
+                    } else {
+                        $Comment .= "\t$Prop\n";
+                    }
+                    my $MyDesc = ($N eq $Name) ? $Desc : "Alias for $OrigProp ($Desc)";
+
+                    push @MAP, sprintf("%s %-42s %s\n",
+                                       $IsFuzzy ? '*' : ' ', $Prop, $MyDesc);
+                }
+                if ($Desc) {
+                    $Comment .= "\nMeaning: $Desc\n";
+                }
+
+            }
+            ##
+            ## Okay, write the file...
+            ##
+            $Table->Write(["lib","gc_sc","$filename.pl"], $Comment);
+
+            ## and register it
+            $RawNameToFile{$Name} = $filename;
+            RegisterFileForName($Type => $Name, $IsFuzzy, $filename);
+
+            if ($IsFuzzy)
+            {
+                my $CName = CanonicalName($Type . '_'. $Name);
+                $FuzzyNameToTest{$Name}  = $Table if !$FuzzyNameToTest{$Name};
+                $FuzzyNameToTest{$CName} = $Table if !$FuzzyNameToTest{$CName};
+            } else {
+                $ExactNameToTest{$Name} = $Table;
+            }
+
+        }
+
+        ## Register aliase info
+        for my $Name (sort {length $a <=> length $b} keys %{$AliasInfo{$Type}})
+        {
+            my $Alias    = $AliasInfo{$Type}->{$Name};
+            my $IsFuzzy  = $FuzzyNames{$Type}->{$Alias};
+            my $filename = $RawNameToFile{$Name};
+            die "oops [$Alias]->[$Name]" if not $filename;
+            RegisterFileForName($Type => $Alias, $IsFuzzy, $filename);
+
+            my $Table = $TableInfo{$Type}->{$Name};
+            die "oops" if not $Table;
+            if ($IsFuzzy)
+            {
+                my $CName = CanonicalName($Type .'_'. $Alias);
+                $FuzzyNameToTest{$Alias} = $Table if !$FuzzyNameToTest{$Alias};
+                $FuzzyNameToTest{$CName} = $Table if !$FuzzyNameToTest{$CName};
+            } else {
+                $ExactNameToTest{$Alias} = $Table;
+            }
+        }
+    }
+
+    ##
+    ## Write out the property list
+    ##
+    {
+        my @OUT = (
+                   "##\n",
+                   "## This file created by $0\n",
+                   "## List of built-in \\p{...}/\\P{...} properties.\n",
+                   "##\n",
+                   "## '*' means name may be 'fuzzy'\n",
+                   "##\n\n",
+                   sort { substr($a,2) cmp substr($b, 2) } @MAP,
+                  );
+        WriteIfChanged('Properties', @OUT);
+    }
+
+    use Text::Tabs ();  ## using this makes the files about half the size
+
+    ## Write Exact.pl
+    {
+        my @OUT = (
+                   $HEADER,
+                   "##\n",
+                   "## Data in this file used by ../utf8_heavy.pl\n",
+                   "##\n\n",
+                   "## Mapping from name to filename in ./lib/gc_sc\n",
+                   "%utf8::Exact = (\n",
+                  );
+
+	$Exact{InGreek} = 'InGreekA';  # this is evil kludge
+        for my $Name (sort keys %Exact)
+        {
+            my $File = $Exact{$Name};
+            $Name = $Name =~ m/\W/ ? qq/'$Name'/ : " $Name ";
+            my $Text = sprintf("%-15s => %s,\n", $Name, qq/'$File'/);
+            push @OUT, Text::Tabs::unexpand($Text);
+        }
+        push @OUT, ");\n1;\n";
+
+        WriteIfChanged('Exact.pl', @OUT);
+    }
+
+    ## Write Canonical.pl
+    {
+        my @OUT = (
+                   $HEADER,
+                   "##\n",
+                   "## Data in this file used by ../utf8_heavy.pl\n",
+                   "##\n\n",
+                   "## Mapping from lc(canonical name) to filename in ./lib\n",
+                   "%utf8::Canonical = (\n",
+                  );
+        my $Trail = ""; ## used just to keep the spacing pretty
+        for my $Name (sort keys %Canonical)
+        {
+            my $File = $Canonical{$Name};
+            if ($CaComment{$Name}) {
+                push @OUT, "\n" if not $Trail;
+                push @OUT, " # $CaComment{$Name}\n";
+                $Trail = "\n";
+            } else {
+                $Trail = "";
+            }
+            $Name = $Name =~ m/\W/ ? qq/'$Name'/ : " $Name ";
+            my $Text = sprintf("  %-41s => %s,\n$Trail", $Name, qq/'$File'/);
+            push @OUT, Text::Tabs::unexpand($Text);
+        }
+        push @OUT, ");\n1\n";
+        WriteIfChanged('Canonical.pl', @OUT);
+    }
+
+    MakePropTestScript() if $MakeTestScript;
+}
+
+
+sub SpecialCasing_txt()
+{
+    #
+    # Read in the special cases.
+    #
+
+    my %CaseInfo;
+
+    if (not open IN, "SpecialCasing.txt") {
+        die "$0: SpecialCasing.txt: $!\n";
+    }
+    while (<IN>) {
+        next unless /^[0-9A-Fa-f]+;/;
+        s/\#.*//;
+        s/\s+$//;
+
+        my ($code, $lower, $title, $upper, $condition) = split(/\s*;\s*/);
+
+        if ($condition) { # not implemented yet
+            print "# SKIPPING $_\n" if $Verbose;
+            next;
+        }
+
+        # Wait until all the special cases have been read since
+        # they are not listed in numeric order.
+        my $ix = hex($code);
+        push @{$CaseInfo{Lower}}, [ $ix, $code, $lower ]
+	    unless $code eq $lower;
+        push @{$CaseInfo{Title}}, [ $ix, $code, $title ]
+	    unless $code eq $title;
+        push @{$CaseInfo{Upper}}, [ $ix, $code, $upper ]
+	    unless $code eq $upper;
+    }
+    close IN;
+
+    # Now write out the special cases properties in their code point order.
+    # Prepend them to the To/{Upper,Lower,Title}.pl.
+
+    for my $case (qw(Lower Title Upper))
+    {
+        my $NormalCase = do "To/$case.pl" || die "$0: $@\n";
+
+        my @OUT =
+	    (
+	     $HEADER, "\n",
+	     "# The key UTF-8 _bytes_, the value UTF-8 (speed hack)\n",
+	     "%utf8::ToSpec$case =\n(\n",
+	    );
+
+        for my $prop (sort { $a->[0] <=> $b->[0] } @{$CaseInfo{$case}}) {
+            my ($ix, $code, $to) = @$prop;
+            my $tostr =
+              join "", map { sprintf "\\x{%s}", $_ } split ' ', $to;
+            push @OUT, sprintf qq["%s" => "$tostr",\n], join("", map { sprintf "\\x%02X", $_ } unpack("U0C*", pack("U", $ix)));
+	    # Remove any single-character mappings for
+	    # the same character since we are going for
+	    # the special casing rules.
+	    $NormalCase =~ s/^$code\t\t\w+\n//m;
+        }
+        push @OUT, (
+                    ");\n\n",
+                    "return <<'END';\n",
+                    $NormalCase,
+                    "END\n"
+                    );
+        WriteIfChanged(["To","$case.pl"], @OUT);
+    }
+}
+
+#
+# Read in the case foldings.
+#
+# We will do full case folding, C + F + I (see CaseFolding.txt).
+#
+sub CaseFolding_txt()
+{
+    if (not open IN, "CaseFolding.txt") {
+	die "$0: CaseFolding.txt: $!\n";
+    }
+
+    my $Fold = Table->New();
+    my %Fold;
+
+    while (<IN>) {
+	# Skip status 'S', simple case folding
+	next unless /^([0-9A-Fa-f]+)\s*;\s*([CFI])\s*;\s*([0-9A-Fa-f]+(?: [0-9A-Fa-f]+)*)\s*;/;
+
+	my ($code, $status, $fold) = (hex($1), $2, $3);
+
+	if ($status eq 'C') { # Common: one-to-one folding
+	    # No append() since several codes may fold into one.
+	    $Fold->RawAppendRange($code, $code, $fold);
+	} else { # F: full, or I: dotted uppercase I -> dotless lowercase I
+	    $Fold{$code} = $fold;
+	}
+    }
+    close IN;
+
+    $Fold->Write("To/Fold.pl");
+
+    #
+    # Prepend the special foldings to the common foldings.
+    #
+    my $CommonFold = do "To/Fold.pl" || die "$0: To/Fold.pl: $!\n";
+
+    my @OUT =
+	(
+	 $HEADER, "\n",
+	 "#  The ke UTF-8 _bytes_, the value UTF-8 (speed hack)\n",
+	 "%utf8::ToSpecFold =\n(\n",
+	);
+    for my $code (sort { $a <=> $b } keys %Fold) {
+        my $foldstr =
+          join "", map { sprintf "\\x{%s}", $_ } split ' ', $Fold{$code};
+        push @OUT, sprintf qq["%s" => "$foldstr",\n], join("", map { sprintf "\\x%02X", $_ } unpack("U0C*", pack("U", $code)));
+    }
+    push @OUT, (
+                ");\n\n",
+                "return <<'END';\n",
+                $CommonFold,
+                "END\n",
+               );
+
+    WriteIfChanged(["To","Fold.pl"], @OUT);
+}
+
+## Do it....
+
+Build_Aliases();
+UnicodeData_Txt();
+PropList_txt();
+
+Scripts_txt();
+Blocks_txt();
+
+WriteAllMappings();
+
+LineBreak_Txt();
+ArabicShaping_txt();
+EastAsianWidth_txt();
+HangulSyllableType_txt();
+Jamo_txt();
+SpecialCasing_txt();
+CaseFolding_txt();
+
+if ( $FileList and $MakeList ) {
+    
+    print "Updating '$FileList'\n"
+        if ($Verbose);
+        
+    open my $ofh,">",$FileList 
+        or die "Can't write to '$FileList':$!";
+    print $ofh <<"EOFHEADER";
+#
+# mktables.lst -- File list for mktables.
+#
+#   Autogenerated on @{[scalar localtime]}
+#
+# - First section is input files
+#   (mktables itself is automatically included)
+# - Section seperator is /^=+\$/
+# - Second section is a list of output files.
+# - Lines matching /^\\s*#/ are treated as comments
+#   which along with blank lines are ignored.
+#
+
+# Input files:
+
+EOFHEADER
+    my @input=("version",glob('*.txt'));
+    print $ofh "$_\n" for 
+        @input,
+        "\n=================================\n",
+        "# Output files:\n",
+        # special files
+        "Properties";
+        
+    
+    require File::Find;
+    my $count=0;
+    File::Find::find({
+        no_chdir=>1,
+        wanted=>sub {
+          if (/\.pl$/) {
+            s!^\./!!;
+            print $ofh "$_\n";
+            $count++;
+          }
+        },
+    },"."); 
+    
+    print $ofh "\n# ",scalar(@input)," input files\n",
+               "# ",scalar($count+1)," output files\n\n",
+               "# End list\n";  
+    close $ofh 
+        or warn "Failed to close $ofh: $!";
+    
+    print "Filelist has ",scalar(@input)," input files and ",
+          scalar($count+1)," output files\n"
+        if $Verbose;
+}
+print "All done\n" if $Verbose;
+exit(0);
+
+## TRAILING CODE IS USED BY MakePropTestScript()
+__DATA__
+use strict;
+use warnings;
+
+my $Tests = 0;
+my $Fails = 0;
+
+sub Expect($$$)
+{
+    my $Expect = shift;
+    my $String = shift;
+    my $Regex  = shift;
+    my $Line   = (caller)[2];
+
+    $Tests++;
+    my $RegObj;
+    my $result = eval {
+        $RegObj = qr/$Regex/;
+        $String =~ $RegObj ? 1 : 0
+    };
+    
+    if (not defined $result) {
+        print "couldn't compile /$Regex/ on $0 line $Line: $@\n";
+        $Fails++;
+    } elsif ($result ^ $Expect) {
+        print "bad result (expected $Expect) on $0 line $Line: $@\n";
+        $Fails++;
+    }
+}
+
+sub Error($)
+{
+    my $Regex  = shift;
+    $Tests++;
+    if (eval { 'x' =~ qr/$Regex/; 1 }) {
+        $Fails++;
+        my $Line = (caller)[2];
+        print "expected error for /$Regex/ on $0 line $Line: $@\n";
+    }
+}
+
+sub Finished()
+{
+   if ($Fails == 0) {
+      print "All $Tests tests passed.\n";
+      exit(0);
+   } else {
+      print "$Tests tests, $Fails failed!\n";
+      exit(-1);
+   }
+}
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/mktables.lst
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/mktables.lst	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/mktables.lst	(revision 14489)
@@ -0,0 +1,505 @@
+#
+# mktables.lst -- File list for mktables.
+#
+#   Autogenerated on Sun Apr 24 21:25:22 2005
+#
+# - First section is input files
+#   (mktables itself is automatically included)
+# - Section seperator is /^=+$/
+# - Second section is a list of output files.
+# - Lines matching /^\s*#/ are treated as comments
+#   which along with blank lines are ignored.
+#
+
+# Input files:
+
+version
+ArabicShaping.txt
+BidiMirroring.txt
+Blocks.txt
+CaseFolding.txt
+CompositionExclusions.txt
+EastAsianWidth.txt
+HangulSyllableType.txt
+Index.txt
+Jamo.txt
+LineBreak.txt
+NamedSequences.txt
+NamesList.txt
+NormalizationCorrections.txt
+PropertyAliases.txt
+PropList.txt
+PropValueAliases.txt
+ReadMe.txt
+Scripts.txt
+SpecialCasing.txt
+StandardizedVariants.txt
+UnicodeData.txt
+
+=================================
+
+# Output files:
+
+Properties
+Canonical.pl
+CombiningClass.pl
+Decomposition.pl
+Exact.pl
+Name.pl
+PVA.pl
+lib/bc/AL.pl
+lib/bc/AN.pl
+lib/bc/B.pl
+lib/bc/BN.pl
+lib/bc/CS.pl
+lib/bc/EN.pl
+lib/bc/ES.pl
+lib/bc/ET.pl
+lib/bc/L.pl
+lib/bc/LRE.pl
+lib/bc/LRO.pl
+lib/bc/NSM.pl
+lib/bc/ON.pl
+lib/bc/PDF.pl
+lib/bc/R.pl
+lib/bc/RLE.pl
+lib/bc/RLO.pl
+lib/bc/S.pl
+lib/bc/WS.pl
+lib/ccc/A.pl
+lib/ccc/AL.pl
+lib/ccc/AR.pl
+lib/ccc/ATAR.pl
+lib/ccc/ATB.pl
+lib/ccc/ATBL.pl
+lib/ccc/B.pl
+lib/ccc/BL.pl
+lib/ccc/BR.pl
+lib/ccc/DA.pl
+lib/ccc/DB.pl
+lib/ccc/IS.pl
+lib/ccc/KV.pl
+lib/ccc/L.pl
+lib/ccc/NK.pl
+lib/ccc/NR.pl
+lib/ccc/OV.pl
+lib/ccc/R.pl
+lib/ccc/VR.pl
+lib/dt/can.pl
+lib/dt/com.pl
+lib/dt/enc.pl
+lib/dt/fin.pl
+lib/dt/font.pl
+lib/dt/fra.pl
+lib/dt/init.pl
+lib/dt/iso.pl
+lib/dt/med.pl
+lib/dt/nar.pl
+lib/dt/nb.pl
+lib/dt/sml.pl
+lib/dt/sqr.pl
+lib/dt/sub.pl
+lib/dt/sup.pl
+lib/dt/vert.pl
+lib/dt/wide.pl
+lib/ea/A.pl
+lib/ea/F.pl
+lib/ea/H.pl
+lib/ea/N.pl
+lib/ea/Na.pl
+lib/ea/W.pl
+lib/gc_sc/AHex.pl
+lib/gc_sc/Alnum.pl
+lib/gc_sc/Alpha.pl
+lib/gc_sc/Alphabet.pl
+lib/gc_sc/Any.pl
+lib/gc_sc/Arab.pl
+lib/gc_sc/Armn.pl
+lib/gc_sc/ASCII.pl
+lib/gc_sc/AsciiHex.pl
+lib/gc_sc/Assigned.pl
+lib/gc_sc/Beng.pl
+lib/gc_sc/BidiC.pl
+lib/gc_sc/BidiCont.pl
+lib/gc_sc/Blank.pl
+lib/gc_sc/Bopo.pl
+lib/gc_sc/Brai.pl
+lib/gc_sc/Bugi.pl
+lib/gc_sc/Buhd.pl
+lib/gc_sc/C.pl
+lib/gc_sc/Canadian.pl
+lib/gc_sc/Cc.pl
+lib/gc_sc/Cf.pl
+lib/gc_sc/Cher.pl
+lib/gc_sc/Cn.pl
+lib/gc_sc/Cntrl.pl
+lib/gc_sc/Co.pl
+lib/gc_sc/Copt.pl
+lib/gc_sc/Cprt.pl
+lib/gc_sc/Cs.pl
+lib/gc_sc/Cyrl.pl
+lib/gc_sc/Dash.pl
+lib/gc_sc/Dash2.pl
+lib/gc_sc/Dep.pl
+lib/gc_sc/Deprecat.pl
+lib/gc_sc/Deva.pl
+lib/gc_sc/Dia.pl
+lib/gc_sc/Diacriti.pl
+lib/gc_sc/Digit.pl
+lib/gc_sc/Dsrt.pl
+lib/gc_sc/Ethi.pl
+lib/gc_sc/Ext.pl
+lib/gc_sc/Extender.pl
+lib/gc_sc/Geor.pl
+lib/gc_sc/Glag.pl
+lib/gc_sc/Goth.pl
+lib/gc_sc/Graph.pl
+lib/gc_sc/Grapheme.pl
+lib/gc_sc/Grek.pl
+lib/gc_sc/GrLink.pl
+lib/gc_sc/Gujr.pl
+lib/gc_sc/Guru.pl
+lib/gc_sc/Hang.pl
+lib/gc_sc/Hani.pl
+lib/gc_sc/Hano.pl
+lib/gc_sc/Hebr.pl
+lib/gc_sc/Hex.pl
+lib/gc_sc/HexDigit.pl
+lib/gc_sc/Hira.pl
+lib/gc_sc/Hyphen.pl
+lib/gc_sc/Hyphen2.pl
+lib/gc_sc/IdContin.pl
+lib/gc_sc/Ideo.pl
+lib/gc_sc/Ideograp.pl
+lib/gc_sc/IDSB.pl
+lib/gc_sc/IdsBinar.pl
+lib/gc_sc/IDST.pl
+lib/gc_sc/IdStart.pl
+lib/gc_sc/IdsTrina.pl
+lib/gc_sc/InAegean.pl
+lib/gc_sc/InAlphab.pl
+lib/gc_sc/InAncie2.pl
+lib/gc_sc/InAncien.pl
+lib/gc_sc/InArabi2.pl
+lib/gc_sc/InArabi3.pl
+lib/gc_sc/InArabi4.pl
+lib/gc_sc/InArabic.pl
+lib/gc_sc/InArmeni.pl
+lib/gc_sc/InArrows.pl
+lib/gc_sc/InBasicL.pl
+lib/gc_sc/InBengal.pl
+lib/gc_sc/InBlockE.pl
+lib/gc_sc/InBopom2.pl
+lib/gc_sc/InBopomo.pl
+lib/gc_sc/InBoxDra.pl
+lib/gc_sc/InBraill.pl
+lib/gc_sc/InBugine.pl
+lib/gc_sc/InBuhid.pl
+lib/gc_sc/InByzant.pl
+lib/gc_sc/InCherok.pl
+lib/gc_sc/InCjkCo2.pl
+lib/gc_sc/InCjkCo3.pl
+lib/gc_sc/InCjkCo4.pl
+lib/gc_sc/InCjkCom.pl
+lib/gc_sc/InCjkRad.pl
+lib/gc_sc/InCjkStr.pl
+lib/gc_sc/InCjkSym.pl
+lib/gc_sc/InCjkUn2.pl
+lib/gc_sc/InCjkUn3.pl
+lib/gc_sc/InCjkUni.pl
+lib/gc_sc/InCombi2.pl
+lib/gc_sc/InCombi3.pl
+lib/gc_sc/InCombi4.pl
+lib/gc_sc/InCombin.pl
+lib/gc_sc/InContro.pl
+lib/gc_sc/InCoptic.pl
+lib/gc_sc/InCurren.pl
+lib/gc_sc/InCyprio.pl
+lib/gc_sc/InCyril2.pl
+lib/gc_sc/InCyrill.pl
+lib/gc_sc/InDesere.pl
+lib/gc_sc/InDevana.pl
+lib/gc_sc/InDingba.pl
+lib/gc_sc/InEnclo2.pl
+lib/gc_sc/InEnclos.pl
+lib/gc_sc/InEthio2.pl
+lib/gc_sc/InEthio3.pl
+lib/gc_sc/InEthiop.pl
+lib/gc_sc/InGenera.pl
+lib/gc_sc/InGeomet.pl
+lib/gc_sc/InGeorg2.pl
+lib/gc_sc/InGeorgi.pl
+lib/gc_sc/InGlagol.pl
+lib/gc_sc/InGothic.pl
+lib/gc_sc/InGreekA.pl
+lib/gc_sc/InGreekE.pl
+lib/gc_sc/InGujara.pl
+lib/gc_sc/InGurmuk.pl
+lib/gc_sc/InHalfwi.pl
+lib/gc_sc/InHangu2.pl
+lib/gc_sc/InHangu3.pl
+lib/gc_sc/InHangul.pl
+lib/gc_sc/InHanuno.pl
+lib/gc_sc/InHebrew.pl
+lib/gc_sc/InHighPr.pl
+lib/gc_sc/InHighSu.pl
+lib/gc_sc/InHiraga.pl
+lib/gc_sc/InIdeogr.pl
+lib/gc_sc/InIpaExt.pl
+lib/gc_sc/InKanbun.pl
+lib/gc_sc/InKangxi.pl
+lib/gc_sc/InKannad.pl
+lib/gc_sc/InKatak2.pl
+lib/gc_sc/InKataka.pl
+lib/gc_sc/InKharos.pl
+lib/gc_sc/InKhmer.pl
+lib/gc_sc/InKhmerS.pl
+lib/gc_sc/InLao.pl
+lib/gc_sc/InLatin1.pl
+lib/gc_sc/InLatin2.pl
+lib/gc_sc/InLatin3.pl
+lib/gc_sc/InLatinE.pl
+lib/gc_sc/InLetter.pl
+lib/gc_sc/InLimbu.pl
+lib/gc_sc/InLinea2.pl
+lib/gc_sc/InLinear.pl
+lib/gc_sc/InLowSur.pl
+lib/gc_sc/InMalaya.pl
+lib/gc_sc/InMathe2.pl
+lib/gc_sc/InMathem.pl
+lib/gc_sc/InMisce2.pl
+lib/gc_sc/InMisce3.pl
+lib/gc_sc/InMisce4.pl
+lib/gc_sc/InMisce5.pl
+lib/gc_sc/InMiscel.pl
+lib/gc_sc/InModifi.pl
+lib/gc_sc/InMongol.pl
+lib/gc_sc/InMusica.pl
+lib/gc_sc/InMyanma.pl
+lib/gc_sc/InNewTai.pl
+lib/gc_sc/InNumber.pl
+lib/gc_sc/InOgham.pl
+lib/gc_sc/InOldIta.pl
+lib/gc_sc/InOldPer.pl
+lib/gc_sc/InOptica.pl
+lib/gc_sc/InOriya.pl
+lib/gc_sc/InOsmany.pl
+lib/gc_sc/InPhone2.pl
+lib/gc_sc/InPhonet.pl
+lib/gc_sc/InPrivat.pl
+lib/gc_sc/InRunic.pl
+lib/gc_sc/InShavia.pl
+lib/gc_sc/InSinhal.pl
+lib/gc_sc/InSmallF.pl
+lib/gc_sc/InSpacin.pl
+lib/gc_sc/InSpecia.pl
+lib/gc_sc/InSupers.pl
+lib/gc_sc/InSuppl2.pl
+lib/gc_sc/InSuppl3.pl
+lib/gc_sc/InSuppl4.pl
+lib/gc_sc/InSuppl5.pl
+lib/gc_sc/InSuppl6.pl
+lib/gc_sc/InSupple.pl
+lib/gc_sc/InSyloti.pl
+lib/gc_sc/InSyriac.pl
+lib/gc_sc/InTagalo.pl
+lib/gc_sc/InTagban.pl
+lib/gc_sc/InTags.pl
+lib/gc_sc/InTaiLe.pl
+lib/gc_sc/InTaiXua.pl
+lib/gc_sc/InTamil.pl
+lib/gc_sc/InTelugu.pl
+lib/gc_sc/InThaana.pl
+lib/gc_sc/InThai.pl
+lib/gc_sc/InTibeta.pl
+lib/gc_sc/InTifina.pl
+lib/gc_sc/InUgarit.pl
+lib/gc_sc/InUnifie.pl
+lib/gc_sc/InVaria2.pl
+lib/gc_sc/InVariat.pl
+lib/gc_sc/InVertic.pl
+lib/gc_sc/InYijing.pl
+lib/gc_sc/InYiRadi.pl
+lib/gc_sc/InYiSyll.pl
+lib/gc_sc/JoinC.pl
+lib/gc_sc/JoinCont.pl
+lib/gc_sc/Kana.pl
+lib/gc_sc/Khar.pl
+lib/gc_sc/Khmr.pl
+lib/gc_sc/Knda.pl
+lib/gc_sc/L.pl
+lib/gc_sc/Laoo.pl
+lib/gc_sc/Latn.pl
+lib/gc_sc/LC.pl
+lib/gc_sc/Limb.pl
+lib/gc_sc/LinearB.pl
+lib/gc_sc/Ll.pl
+lib/gc_sc/Lm.pl
+lib/gc_sc/Lo.pl
+lib/gc_sc/LOE.pl
+lib/gc_sc/LogicalO.pl
+lib/gc_sc/Lower.pl
+lib/gc_sc/Lowercas.pl
+lib/gc_sc/Lt.pl
+lib/gc_sc/Lu.pl
+lib/gc_sc/M.pl
+lib/gc_sc/Math.pl
+lib/gc_sc/Mc.pl
+lib/gc_sc/Me.pl
+lib/gc_sc/Mlym.pl
+lib/gc_sc/Mn.pl
+lib/gc_sc/Mong.pl
+lib/gc_sc/Mymr.pl
+lib/gc_sc/N.pl
+lib/gc_sc/NChar.pl
+lib/gc_sc/Nd.pl
+lib/gc_sc/NewTaiLu.pl
+lib/gc_sc/Nl.pl
+lib/gc_sc/No.pl
+lib/gc_sc/Nonchara.pl
+lib/gc_sc/OAlpha.pl
+lib/gc_sc/ODI.pl
+lib/gc_sc/Ogam.pl
+lib/gc_sc/OGrExt.pl
+lib/gc_sc/OIDC.pl
+lib/gc_sc/OIDS.pl
+lib/gc_sc/OldItali.pl
+lib/gc_sc/OldPersi.pl
+lib/gc_sc/OLower.pl
+lib/gc_sc/OMath.pl
+lib/gc_sc/Orya.pl
+lib/gc_sc/Osma.pl
+lib/gc_sc/OtherAlp.pl
+lib/gc_sc/OtherDef.pl
+lib/gc_sc/OtherGra.pl
+lib/gc_sc/OtherIdC.pl
+lib/gc_sc/OtherIdS.pl
+lib/gc_sc/OtherLow.pl
+lib/gc_sc/OtherMat.pl
+lib/gc_sc/OtherUpp.pl
+lib/gc_sc/OUpper.pl
+lib/gc_sc/P.pl
+lib/gc_sc/PatSyn.pl
+lib/gc_sc/PatternS.pl
+lib/gc_sc/PatternW.pl
+lib/gc_sc/PatWS.pl
+lib/gc_sc/Pc.pl
+lib/gc_sc/Pd.pl
+lib/gc_sc/Pe.pl
+lib/gc_sc/Pf.pl
+lib/gc_sc/Pi.pl
+lib/gc_sc/Po.pl
+lib/gc_sc/Print.pl
+lib/gc_sc/Ps.pl
+lib/gc_sc/Punct.pl
+lib/gc_sc/Qaai.pl
+lib/gc_sc/QMark.pl
+lib/gc_sc/Quotatio.pl
+lib/gc_sc/Radical.pl
+lib/gc_sc/Radical2.pl
+lib/gc_sc/Runr.pl
+lib/gc_sc/S.pl
+lib/gc_sc/Sc.pl
+lib/gc_sc/SD.pl
+lib/gc_sc/Shaw.pl
+lib/gc_sc/Sinh.pl
+lib/gc_sc/Sk.pl
+lib/gc_sc/Sm.pl
+lib/gc_sc/So.pl
+lib/gc_sc/SoftDott.pl
+lib/gc_sc/Space.pl
+lib/gc_sc/SpacePer.pl
+lib/gc_sc/STerm.pl
+lib/gc_sc/Sterm2.pl
+lib/gc_sc/SylotiNa.pl
+lib/gc_sc/Syrc.pl
+lib/gc_sc/Tagb.pl
+lib/gc_sc/TaiLe.pl
+lib/gc_sc/Taml.pl
+lib/gc_sc/Telu.pl
+lib/gc_sc/Term.pl
+lib/gc_sc/Terminal.pl
+lib/gc_sc/Tfng.pl
+lib/gc_sc/Tglg.pl
+lib/gc_sc/Thaa.pl
+lib/gc_sc/Thai.pl
+lib/gc_sc/Tibt.pl
+lib/gc_sc/Title.pl
+lib/gc_sc/Ugar.pl
+lib/gc_sc/UIdeo.pl
+lib/gc_sc/UnifiedI.pl
+lib/gc_sc/Upper.pl
+lib/gc_sc/Uppercas.pl
+lib/gc_sc/Variatio.pl
+lib/gc_sc/VS.pl
+lib/gc_sc/WhiteSpa.pl
+lib/gc_sc/Word.pl
+lib/gc_sc/WSpace.pl
+lib/gc_sc/XDigit.pl
+lib/gc_sc/Yiii.pl
+lib/gc_sc/Z.pl
+lib/gc_sc/Zl.pl
+lib/gc_sc/Zp.pl
+lib/gc_sc/Zs.pl
+lib/gc_sc/Zyyy.pl
+lib/gc_sc/_CanonDC.pl
+lib/gc_sc/_CaseIgn.pl
+lib/gc_sc/_CombAbo.pl
+lib/hst/L.pl
+lib/hst/LV.pl
+lib/hst/LVT.pl
+lib/hst/T.pl
+lib/hst/V.pl
+lib/jt/C.pl
+lib/jt/D.pl
+lib/jt/R.pl
+lib/jt/U.pl
+lib/lb/AI.pl
+lib/lb/AL.pl
+lib/lb/B2.pl
+lib/lb/BA.pl
+lib/lb/BB.pl
+lib/lb/BK.pl
+lib/lb/CB.pl
+lib/lb/CL.pl
+lib/lb/CM.pl
+lib/lb/CR.pl
+lib/lb/EX.pl
+lib/lb/GL.pl
+lib/lb/H2.pl
+lib/lb/H3.pl
+lib/lb/HY.pl
+lib/lb/ID.pl
+lib/lb/IN.pl
+lib/lb/IS.pl
+lib/lb/JL.pl
+lib/lb/JT.pl
+lib/lb/JV.pl
+lib/lb/LF.pl
+lib/lb/NL.pl
+lib/lb/NS.pl
+lib/lb/NU.pl
+lib/lb/OP.pl
+lib/lb/PO.pl
+lib/lb/PR.pl
+lib/lb/QU.pl
+lib/lb/SA.pl
+lib/lb/SG.pl
+lib/lb/SP.pl
+lib/lb/SY.pl
+lib/lb/WJ.pl
+lib/lb/XX.pl
+lib/lb/ZW.pl
+lib/nt/De.pl
+lib/nt/Di.pl
+lib/nt/Nu.pl
+To/Digit.pl
+To/Fold.pl
+To/Lower.pl
+To/Title.pl
+To/Upper.pl
+
+# 22 input files
+# 458 output files
+
+# End list
Index: /for-distributions/trunk/bin/windows/perl/lib/unicore/version
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/unicore/version	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/unicore/version	(revision 14489)
@@ -0,0 +1,1 @@
+4.1.0
Index: /for-distributions/trunk/bin/windows/perl/lib/utf8.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/utf8.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/utf8.pm	(revision 14489)
@@ -0,0 +1,214 @@
+package utf8;
+
+$utf8::hint_bits = 0x00800000;
+
+our $VERSION = '1.06';
+
+sub import {
+    $^H |= $utf8::hint_bits;
+    $enc{caller()} = $_[1] if $_[1];
+}
+
+sub unimport {
+    $^H &= ~$utf8::hint_bits;
+}
+
+sub AUTOLOAD {
+    require "utf8_heavy.pl";
+    goto &$AUTOLOAD if defined &$AUTOLOAD;
+    require Carp;
+    Carp::croak("Undefined subroutine $AUTOLOAD called");
+}
+
+1;
+__END__
+
+=head1 NAME
+
+utf8 - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) in source code
+
+=head1 SYNOPSIS
+
+    use utf8;
+    no utf8;
+
+    # Convert a Perl scalar to/from UTF-8.
+    $num_octets = utf8::upgrade($string);
+    $success    = utf8::downgrade($string[, FAIL_OK]);
+
+    # Change the native bytes of a Perl scalar to/from UTF-8 bytes.
+    utf8::encode($string);
+    utf8::decode($string);
+
+    $flag = utf8::is_utf8(STRING); # since Perl 5.8.1
+    $flag = utf8::valid(STRING);
+
+=head1 DESCRIPTION
+
+The C<use utf8> pragma tells the Perl parser to allow UTF-8 in the
+program text in the current lexical scope (allow UTF-EBCDIC on EBCDIC based
+platforms).  The C<no utf8> pragma tells Perl to switch back to treating
+the source text as literal bytes in the current lexical scope.
+
+This pragma is primarily a compatibility device.  Perl versions
+earlier than 5.6 allowed arbitrary bytes in source code, whereas
+in future we would like to standardize on the UTF-8 encoding for
+source text.
+
+B<Do not use this pragma for anything else than telling Perl that your
+script is written in UTF-8.> The utility functions described below are
+useful for their own purposes, but they are not really part of the
+"pragmatic" effect.
+
+Until UTF-8 becomes the default format for source text, either this
+pragma or the L<encoding> pragma should be used to recognize UTF-8
+in the source.  When UTF-8 becomes the standard source format, this
+pragma will effectively become a no-op.  For convenience in what
+follows the term I<UTF-X> is used to refer to UTF-8 on ASCII and ISO
+Latin based platforms and UTF-EBCDIC on EBCDIC based platforms.
+
+See also the effects of the C<-C> switch and its cousin, the
+C<$ENV{PERL_UNICODE}>, in L<perlrun>.
+
+Enabling the C<utf8> pragma has the following effect:
+
+=over 4
+
+=item *
+
+Bytes in the source text that have their high-bit set will be treated
+as being part of a literal UTF-8 character.  This includes most
+literals such as identifier names, string constants, and constant
+regular expression patterns.
+
+On EBCDIC platforms characters in the Latin 1 character set are
+treated as being part of a literal UTF-EBCDIC character.
+
+=back
+
+Note that if you have bytes with the eighth bit on in your script
+(for example embedded Latin-1 in your string literals), C<use utf8>
+will be unhappy since the bytes are most probably not well-formed
+UTF-8.  If you want to have such bytes and use utf8, you can disable
+utf8 until the end the block (or file, if at top level) by C<no utf8;>.
+
+If you want to automatically upgrade your 8-bit legacy bytes to UTF-8,
+use the L<encoding> pragma instead of this pragma.  For example, if
+you want to implicitly upgrade your ISO 8859-1 (Latin-1) bytes to UTF-8
+as used in e.g. C<chr()> and C<\x{...}>, try this:
+
+    use encoding "latin-1";
+    my $c = chr(0xc4);
+    my $x = "\x{c5}";
+
+In case you are wondering: yes, C<use encoding 'utf8';> works much
+the same as C<use utf8;>.
+
+=head2 Utility functions
+
+The following functions are defined in the C<utf8::> package by the
+Perl core.  You do not need to say C<use utf8> to use these and in fact
+you should not say that  unless you really want to have UTF-8 source code.
+
+=over 4
+
+=item * $num_octets = utf8::upgrade($string)
+
+Converts in-place the octet sequence in the native encoding
+(Latin-1 or EBCDIC) to the equivalent character sequence in I<UTF-X>.
+I<$string> already encoded as characters does no harm.
+Returns the number of octets necessary to represent the string as I<UTF-X>.
+Can be used to make sure that the UTF-8 flag is on,
+so that C<\w> or C<lc()> work as Unicode on strings
+containing characters in the range 0x80-0xFF (on ASCII and
+derivatives).
+
+B<Note that this function does not handle arbitrary encodings.>
+Therefore I<Encode.pm> is recommended for the general purposes.
+
+Affected by the encoding pragma.
+
+=item * $success = utf8::downgrade($string[, FAIL_OK])
+
+Converts in-place the character sequence in I<UTF-X>
+to the equivalent octet sequence in the native encoding (Latin-1 or EBCDIC).
+I<$string> already encoded as octets does no harm.
+Returns true on success. On failure dies or, if the value of
+C<FAIL_OK> is true, returns false.
+Can be used to make sure that the UTF-8 flag is off,
+e.g. when you want to make sure that the substr() or length() function
+works with the usually faster byte algorithm.
+
+B<Note that this function does not handle arbitrary encodings.>
+Therefore I<Encode.pm> is recommended for the general purposes.
+
+B<Not> affected by the encoding pragma.
+
+B<NOTE:> this function is experimental and may change
+or be removed without notice.
+
+=item * utf8::encode($string)
+
+Converts in-place the character sequence to the corresponding octet sequence
+in I<UTF-X>.  The UTF-8 flag is turned off.  Returns nothing.
+
+B<Note that this function does not handle arbitrary encodings.>
+Therefore I<Encode.pm> is recommended for the general purposes.
+
+=item * utf8::decode($string)
+
+Attempts to convert in-place the octet sequence in I<UTF-X>
+to the corresponding character sequence.  The UTF-8 flag is turned on
+only if the source string contains multiple-byte I<UTF-X> characters.
+If I<$string> is invalid as I<UTF-X>, returns false; otherwise returns true.
+
+B<Note that this function does not handle arbitrary encodings.>
+Therefore I<Encode.pm> is recommended for the general purposes.
+
+B<NOTE:> this function is experimental and may change
+or be removed without notice.
+
+=item * $flag = utf8::is_utf8(STRING)
+
+(Since Perl 5.8.1)  Test whether STRING is in UTF-8.  Functionally
+the same as Encode::is_utf8().
+
+=item * $flag = utf8::valid(STRING)
+
+[INTERNAL] Test whether STRING is in a consistent state regarding
+UTF-8.  Will return true is well-formed UTF-8 and has the UTF-8 flag
+on B<or> if string is held as bytes (both these states are 'consistent').
+Main reason for this routine is to allow Perl's testsuite to check
+that operations have left strings in a consistent state.  You most
+probably want to use utf8::is_utf8() instead.
+
+=back
+
+C<utf8::encode> is like C<utf8::upgrade>, but the UTF8 flag is
+cleared.  See L<perlunicode> for more on the UTF8 flag and the C API
+functions C<sv_utf8_upgrade>, C<sv_utf8_downgrade>, C<sv_utf8_encode>,
+and C<sv_utf8_decode>, which are wrapped by the Perl functions
+C<utf8::upgrade>, C<utf8::downgrade>, C<utf8::encode> and
+C<utf8::decode>.  Note that in the Perl 5.8.0 and 5.8.1 implementation
+the functions utf8::is_utf8, utf8::valid, utf8::encode, utf8::decode,
+utf8::upgrade, and utf8::downgrade are always available, without a
+C<require utf8> statement-- this may change in future releases.
+
+=head1 BUGS
+
+One can have Unicode in identifier names, but not in package/class or
+subroutine names.  While some limited functionality towards this does
+exist as of Perl 5.8.0, that is more accidental than designed; use of
+Unicode for the said purposes is unsupported.
+
+One reason of this unfinishedness is its (currently) inherent
+unportability: since both package names and subroutine names may need
+to be mapped to file and directory names, the Unicode capability of
+the filesystem becomes important-- and there unfortunately aren't
+portable answers.
+
+=head1 SEE ALSO
+
+L<perluniintro>, L<encoding>, L<perlrun>, L<bytes>, L<perlunicode>
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/utf8_heavy.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/utf8_heavy.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/utf8_heavy.pl	(revision 14489)
@@ -0,0 +1,412 @@
+package utf8;
+use strict;
+use warnings;
+
+sub DEBUG () { 0 }
+
+sub DESTROY {}
+
+my %Cache;
+
+our (%PropertyAlias, %PA_reverse, %PropValueAlias, %PVA_reverse, %PVA_abbr_map);
+
+sub croak { require Carp; Carp::croak(@_) }
+
+##
+## "SWASH" == "SWATCH HASH". A "swatch" is a swatch of the Unicode landscape.
+## It's a data structure that encodes a set of Unicode characters.
+##
+
+sub SWASHNEW {
+    my ($class, $type, $list, $minbits, $none) = @_;
+    local $^D = 0 if $^D;
+
+    print STDERR "SWASHNEW @_\n" if DEBUG;
+
+    ##
+    ## Get the list of codepoints for the type.
+    ## Called from utf8.c
+    ##
+    ## Given a $type, our goal is to fill $list with the set of codepoint
+    ## ranges.
+    ##
+    ## To make the parsing of $type clear, this code takes the a rather
+    ## unorthodox approach of last'ing out of the block once we have the
+    ## info we need. Were this to be a subroutine, the 'last' would just
+    ## be a 'return'.
+    ##
+    my $file; ## file to load data from, and also part of the %Cache key.
+    my $ListSorted = 0;
+
+    if ($type)
+    {
+        $type =~ s/^\s+//;
+        $type =~ s/\s+$//;
+
+        print "type = $type\n" if DEBUG;
+
+      GETFILE:
+        {
+	    ##
+	    ## It could be a user-defined property.
+	    ##
+
+	    my $caller1 = $type =~ s/(.+)::// ? $1 : caller(1);
+
+	    if (defined $caller1 && $type =~ /^(?:\w+)$/) {
+		my $prop = "${caller1}::$type";
+		if (exists &{$prop}) {
+		    no strict 'refs';
+		    
+		    $list = &{$prop};
+		    last GETFILE;
+		}
+	    }
+
+            my $wasIs;
+
+            ($wasIs = $type =~ s/^Is(?:\s+|[-_])?//i)
+              or
+            $type =~ s/^(?:(?:General(?:\s+|_)?)?Category|gc)\s*[:=]\s*//i
+              or
+            $type =~ s/^(?:Script|sc)\s*[:=]\s*//i
+              or
+            $type =~ s/^Block\s*[:=]\s*/In/i;
+
+
+	    ##
+	    ## See if it's in some enumeration.
+	    ##
+	    require "unicore/PVA.pl";
+	    if ($type =~ /^([\w\s]+)[:=]\s*(.*)/) {
+		my ($enum, $val) = (lc $1, lc $2);
+		$enum =~ tr/ _-//d;
+		$val =~ tr/ _-//d;
+
+		my $pa = $PropertyAlias{$enum} ? $enum : $PA_reverse{$enum};
+		my $f = $PropValueAlias{$pa}{$val} ? $val : $PVA_reverse{$pa}{lc $val};
+
+		if ($pa and $f) {
+		    $pa = "gc_sc" if $pa eq "gc" or $pa eq "sc";
+		    $file = "unicore/lib/$pa/$PVA_abbr_map{$pa}{lc $f}.pl";
+		    last GETFILE;
+		}
+	    }
+	    else {
+		my $t = lc $type;
+		$t =~ tr/ _-//d;
+
+		if ($PropValueAlias{gc}{$t} or $PropValueAlias{sc}{$t}) {
+		    $file = "unicore/lib/gc_sc/$PVA_abbr_map{gc_sc}{$t}.pl";
+		    last GETFILE;
+		}
+	    }
+
+            ##
+            ## See if it's in the direct mapping table.
+            ##
+            require "unicore/Exact.pl";
+            if (my $base = $utf8::Exact{$type}) {
+                $file = "unicore/lib/gc_sc/$base.pl";
+                last GETFILE;
+            }
+
+            ##
+            ## If not there exactly, try the canonical form. The canonical
+            ## form is lowercased, with any separators (\s+|[-_]) removed.
+            ##
+            my $canonical = lc $type;
+            $canonical =~ s/(?<=[a-z\d])(?:\s+|[-_])(?=[a-z\d])//g;
+            print "canonical = $canonical\n" if DEBUG;
+
+            require "unicore/Canonical.pl";
+            if (my $base = ($utf8::Canonical{$canonical} || $utf8::Canonical{ lc $utf8::PropertyAlias{$canonical} })) {
+                $file = "unicore/lib/gc_sc/$base.pl";
+                last GETFILE;
+            }
+
+	    ##
+	    ## See if it's a user-level "To".
+	    ##
+
+	    my $caller0 = caller(0);
+
+	    if (defined $caller0 && $type =~ /^To(?:\w+)$/) {
+		my $map = $caller0 . "::" . $type;
+
+		if (exists &{$map}) {
+		    no strict 'refs';
+		    
+		    $list = &{$map};
+		    last GETFILE;
+		}
+	    }
+
+            ##
+            ## Last attempt -- see if it's a standard "To" name
+	    ## (e.g. "ToLower")  ToTitle is used by ucfirst().
+	    ## The user-level way to access ToDigit() and ToFold()
+	    ## is to use Unicode::UCD.
+            ##
+            if ($type =~ /^To(Digit|Fold|Lower|Title|Upper)$/)
+            {
+                $file = "unicore/To/$1.pl";
+                ## would like to test to see if $file actually exists....
+                last GETFILE;
+            }
+
+            ##
+            ## If we reach this line, it's because we couldn't figure
+            ## out what to do with $type. Ouch.
+            ##
+
+            return $type;
+        }
+
+	if (defined $file) {
+	    print "found it (file='$file')\n" if DEBUG;
+
+	    ##
+	    ## If we reach here, it was due to a 'last GETFILE' above
+	    ## (exception: user-defined properties and mappings), so we
+	    ## have a filename, so now we load it if we haven't already.
+	    ## If we have, return the cached results. The cache key is the
+	    ## file to load.
+	    ##
+	    if ($Cache{$file} and ref($Cache{$file}) eq $class)
+	    {
+		print "Returning cached '$file' for \\p{$type}\n" if DEBUG;
+		return $Cache{$class, $file};
+	    }
+
+	    $list = do $file;
+	}
+
+        $ListSorted = 1; ## we know that these lists are sorted
+    }
+
+    my $extras;
+    my $bits = 0;
+
+    my $ORIG = $list;
+    if ($list) {
+	my @tmp = split(/^/m, $list);
+	my %seen;
+	no warnings;
+	$extras = join '', grep /^[^0-9a-fA-F]/, @tmp;
+	$list = join '',
+	    map  { $_->[1] }
+	    sort { $a->[0] <=> $b->[0] }
+	    map  { /^([0-9a-fA-F]+)/; [ hex($1), $_ ] }
+	    grep { /^([0-9a-fA-F]+)/ and not $seen{$1}++ } @tmp; # XXX doesn't do ranges right
+    }
+
+    if ($none) {
+	my $hextra = sprintf "%04x", $none + 1;
+	$list =~ s/\tXXXX$/\t$hextra/mg;
+    }
+
+    if ($minbits < 32) {
+	my $top = 0;
+	while ($list =~ /^([0-9a-fA-F]+)(?:[\t]([0-9a-fA-F]+)?)(?:[ \t]([0-9a-fA-F]+))?/mg) {
+	    my $min = hex $1;
+	    my $max = defined $2 ? hex $2 : $min;
+	    my $val = defined $3 ? hex $3 : 0;
+	    $val += $max - $min if defined $3;
+	    $top = $val if $val > $top;
+	}
+	$bits =
+	    $top > 0xffff ? 32 :
+	    $top > 0xff ? 16 :
+	    $top > 1 ? 8 : 1
+    }
+    $bits = $minbits if $bits < $minbits;
+
+    my @extras;
+    for my $x ($extras) {
+	pos $x = 0;
+	while ($x =~ /^([^0-9a-fA-F\n])(.*)/mg) {
+	    my $char = $1;
+	    my $name = $2;
+	    print STDERR "$1 => $2\n" if DEBUG;
+	    if ($char =~ /[-+!&]/) {
+		my ($c,$t) = split(/::/, $name, 2);	# bogus use of ::, really
+		my $subobj;
+		if ($c eq 'utf8') {
+		    $subobj = utf8->SWASHNEW($t, "", 0, 0, 0);
+		}
+		elsif (exists &$name) {
+		    $subobj = utf8->SWASHNEW($name, "", 0, 0, 0);
+		}
+		elsif ($c =~ /^([0-9a-fA-F]+)/) {
+		    $subobj = utf8->SWASHNEW("", $c, 0, 0, 0);
+		}
+		return $subobj unless ref $subobj;
+		push @extras, $name => $subobj;
+		$bits = $subobj->{BITS} if $bits < $subobj->{BITS};
+	    }
+	}
+    }
+
+    print STDERR "CLASS = $class, TYPE => $type, BITS => $bits, NONE => $none\nEXTRAS =>\n$extras\nLIST =>\n$list\n" if DEBUG;
+
+    my $SWASH = bless {
+	TYPE => $type,
+	BITS => $bits,
+	EXTRAS => $extras,
+	LIST => $list,
+	NONE => $none,
+	@extras,
+    } => $class;
+
+    if ($file) {
+        $Cache{$class, $file} = $SWASH;
+    }
+
+    return $SWASH;
+}
+
+# NOTE: utf8.c:swash_init() assumes entries are never modified once generated.
+
+sub SWASHGET {
+    # See utf8.c:Perl_swash_fetch for problems with this interface.
+    my ($self, $start, $len) = @_;
+    local $^D = 0 if $^D;
+    my $type = $self->{TYPE};
+    my $bits = $self->{BITS};
+    my $none = $self->{NONE};
+    print STDERR "SWASHGET @_ [$type/$bits/$none]\n" if DEBUG;
+    my $end = $start + $len;
+    my $swatch = "";
+    my $key;
+    vec($swatch, $len - 1, $bits) = 0;	# Extend to correct length.
+    if ($none) {
+	for $key (0 .. $len - 1) { vec($swatch, $key, $bits) = $none }
+    }
+
+    for ($self->{LIST}) {
+	pos $_ = 0;
+	if ($bits > 1) {
+	  LINE:
+	    while (/^([0-9a-fA-F]+)(?:[ \t]([0-9a-fA-F]+)?)?(?:[ \t]([0-9a-fA-F]+))?/mg) {
+		chomp;
+		my ($a, $b, $c) = ($1, $2, $3);
+		croak "$type: illegal mapping '$_'"
+		    if $type =~ /^To/ &&
+		       !(defined $a && defined $c);
+		my $min = hex $a;
+		my $max = defined $b ? hex $b : $min;
+		my $val = defined $c ? hex $c : 0;
+		next if $max < $start;
+		print "$min $max $val\n" if DEBUG;
+		if ($none) {
+		    if ($min < $start) {
+			$val += $start - $min if $val < $none;
+			$min = $start;
+		    }
+		    for ($key = $min; $key <= $max; $key++) {
+			last LINE if $key >= $end;
+			print STDERR "$key => $val\n" if DEBUG;
+			vec($swatch, $key - $start, $bits) = $val;
+			++$val if $val < $none;
+		    }
+		}
+		else {
+		    if ($min < $start) {
+			$val += $start - $min;
+			$min = $start;
+		    }
+		    for ($key = $min; $key <= $max; $key++, $val++) {
+			last LINE if $key >= $end;
+			print STDERR "$key => $val\n" if DEBUG;
+			vec($swatch, $key - $start, $bits) = $val;
+		    }
+		}
+	    }
+	}
+	else {
+	  LINE:
+	    while (/^([0-9a-fA-F]+)(?:[ \t]+([0-9a-fA-F]+))?/mg) {
+		chomp;
+		my $min = hex $1;
+		my $max = defined $2 ? hex $2 : $min;
+		next if $max < $start;
+		if ($min < $start) {
+		    $min = $start;
+		}
+		for ($key = $min; $key <= $max; $key++) {
+		    last LINE if $key >= $end;
+		    print STDERR "$key => 1\n" if DEBUG;
+		    vec($swatch, $key - $start, 1) = 1;
+		}
+	    }
+	}
+    }
+    for my $x ($self->{EXTRAS}) {
+	pos $x = 0;
+	while ($x =~ /^([-+!&])(.*)/mg) {
+	    my $char = $1;
+	    my $name = $2;
+	    print STDERR "INDIRECT $1 $2\n" if DEBUG;
+	    my $otherbits = $self->{$name}->{BITS};
+	    croak("SWASHGET size mismatch") if $bits < $otherbits;
+	    my $other = $self->{$name}->SWASHGET($start, $len);
+	    if ($char eq '+') {
+		if ($bits == 1 and $otherbits == 1) {
+		    $swatch |= $other;
+		}
+		else {
+		    for ($key = 0; $key < $len; $key++) {
+			vec($swatch, $key, $bits) = vec($other, $key, $otherbits);
+		    }
+		}
+	    }
+	    elsif ($char eq '!') {
+		if ($bits == 1 and $otherbits == 1) {
+		    $swatch |= ~$other;
+		}
+		else {
+		    for ($key = 0; $key < $len; $key++) {
+			if (!vec($other, $key, $otherbits)) {
+			    vec($swatch, $key, $bits) = 1;
+			}
+		    }
+		}
+	    }
+	    elsif ($char eq '-') {
+		if ($bits == 1 and $otherbits == 1) {
+		    $swatch &= ~$other;
+		}
+		else {
+		    for ($key = 0; $key < $len; $key++) {
+			if (vec($other, $key, $otherbits)) {
+			    vec($swatch, $key, $bits) = 0;
+			}
+		    }
+		}
+	    }
+	    elsif ($char eq '&') {
+		if ($bits == 1 and $otherbits == 1) {
+		    $swatch &= $other;
+		}
+		else {
+		    for ($key = 0; $key < $len; $key++) {
+			if (!vec($other, $key, $otherbits)) {
+			    vec($swatch, $key, $bits) = 0;
+			}
+		    }
+		}
+	    }
+	}
+    }
+    if (DEBUG) {
+	print STDERR "CELLS ";
+	for ($key = 0; $key < $len; $key++) {
+	    print STDERR vec($swatch, $key, $bits), " ";
+	}
+	print STDERR "\n";
+    }
+    $swatch;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/validate.pl
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/validate.pl	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/validate.pl	(revision 14489)
@@ -0,0 +1,104 @@
+;# $RCSfile: validate.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:24:19 $
+
+;# The validate routine takes a single multiline string consisting of
+;# lines containing a filename plus a file test to try on it.  (The
+;# file test may also be a 'cd', causing subsequent relative filenames
+;# to be interpreted relative to that directory.)  After the file test
+;# you may put '|| die' to make it a fatal error if the file test fails.
+;# The default is '|| warn'.  The file test may optionally have a ! prepended
+;# to test for the opposite condition.  If you do a cd and then list some
+;# relative filenames, you may want to indent them slightly for readability.
+;# If you supply your own "die" or "warn" message, you can use $file to
+;# interpolate the filename.
+
+;# Filetests may be bunched:  -rwx tests for all of -r, -w and -x.
+;# Only the first failed test of the bunch will produce a warning.
+
+;# The routine returns the number of warnings issued.
+
+;# Usage:
+;#	require "validate.pl";
+;#	$warnings += do validate('
+;#	/vmunix			-e || die
+;#	/boot			-e || die
+;#	/bin			cd
+;#	    csh			-ex
+;#	    csh			!-ug
+;#	    sh			-ex
+;#	    sh			!-ug
+;#	/usr			-d || warn "What happened to $file?\n"
+;#	');
+
+sub validate {
+    local($file,$test,$warnings,$oldwarnings);
+    foreach $check (split(/\n/,$_[0])) {
+	next if $check =~ /^#/;
+	next if $check =~ /^$/;
+	($file,$test) = split(' ',$check,2);
+	if ($test =~ s/^(!?-)(\w{2,}\b)/$1Z/) {
+	    $testlist = $2;
+	    @testlist = split(//,$testlist);
+	}
+	else {
+	    @testlist = ('Z');
+	}
+	$oldwarnings = $warnings;
+	foreach $one (@testlist) {
+	    $this = $test;
+	    $this =~ s/(-\w\b)/$1 \$file/g;
+	    $this =~ s/-Z/-$one/;
+	    $this .= ' || warn' unless $this =~ /\|\|/;
+	    $this =~ s/^(.*\S)\s*\|\|\s*(die|warn)$/$1 || do valmess('$2','$1')/;
+	    $this =~ s/\bcd\b/chdir (\$cwd = \$file)/g;
+	    eval $this;
+	    last if $warnings > $oldwarnings;
+	}
+    }
+    $warnings;
+}
+
+sub valmess {
+    local($disposition,$this) = @_;
+    $file = $cwd . '/' . $file unless $file =~ m|^/|;
+    if ($this =~ /^(!?)-(\w)\s+\$file\s*$/) {
+	$neg = $1;
+	$tmp = $2;
+	$tmp eq 'r' && ($mess = "$file is not readable by uid $>.");
+	$tmp eq 'w' && ($mess = "$file is not writable by uid $>.");
+	$tmp eq 'x' && ($mess = "$file is not executable by uid $>.");
+	$tmp eq 'o' && ($mess = "$file is not owned by uid $>.");
+	$tmp eq 'R' && ($mess = "$file is not readable by you.");
+	$tmp eq 'W' && ($mess = "$file is not writable by you.");
+	$tmp eq 'X' && ($mess = "$file is not executable by you.");
+	$tmp eq 'O' && ($mess = "$file is not owned by you.");
+	$tmp eq 'e' && ($mess = "$file does not exist.");
+	$tmp eq 'z' && ($mess = "$file does not have zero size.");
+	$tmp eq 's' && ($mess = "$file does not have non-zero size.");
+	$tmp eq 'f' && ($mess = "$file is not a plain file.");
+	$tmp eq 'd' && ($mess = "$file is not a directory.");
+	$tmp eq 'l' && ($mess = "$file is not a symbolic link.");
+	$tmp eq 'p' && ($mess = "$file is not a named pipe (FIFO).");
+	$tmp eq 'S' && ($mess = "$file is not a socket.");
+	$tmp eq 'b' && ($mess = "$file is not a block special file.");
+	$tmp eq 'c' && ($mess = "$file is not a character special file.");
+	$tmp eq 'u' && ($mess = "$file does not have the setuid bit set.");
+	$tmp eq 'g' && ($mess = "$file does not have the setgid bit set.");
+	$tmp eq 'k' && ($mess = "$file does not have the sticky bit set.");
+	$tmp eq 'T' && ($mess = "$file is not a text file.");
+	$tmp eq 'B' && ($mess = "$file is not a binary file.");
+	if ($neg eq '!') {
+	    $mess =~ s/ is not / should not be / ||
+	    $mess =~ s/ does not / should not / ||
+	    $mess =~ s/ not / /;
+	}
+	print STDERR $mess,"\n";
+    }
+    else {
+	$this =~ s/\$file/'$file'/g;
+	print STDERR "Can't do $this.\n";
+    }
+    if ($disposition eq 'die') { exit 1; }
+    ++$warnings;
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/vars.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/vars.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/vars.pm	(revision 14489)
@@ -0,0 +1,82 @@
+package vars;
+
+use 5.006;
+
+our $VERSION = '1.01';
+
+use warnings::register;
+use strict qw(vars subs);
+
+sub import {
+    my $callpack = caller;
+    my ($pack, @imports) = @_;
+    my ($sym, $ch);
+    foreach (@imports) {
+        if (($ch, $sym) = /^([\$\@\%\*\&])(.+)/) {
+	    if ($sym =~ /\W/) {
+		# time for a more-detailed check-up
+		if ($sym =~ /^\w+[[{].*[]}]$/) {
+		    require Carp;
+		    Carp::croak("Can't declare individual elements of hash or array");
+		} elsif (warnings::enabled() and length($sym) == 1 and $sym !~ tr/a-zA-Z//) {
+		    warnings::warn("No need to declare built-in vars");
+		} elsif  (($^H &= strict::bits('vars'))) {
+		    require Carp;
+		    Carp::croak("'$_' is not a valid variable name under strict vars");
+		}
+	    }
+	    $sym = "${callpack}::$sym" unless $sym =~ /::/;
+	    *$sym =
+		(  $ch eq "\$" ? \$$sym
+		 : $ch eq "\@" ? \@$sym
+		 : $ch eq "\%" ? \%$sym
+		 : $ch eq "\*" ? \*$sym
+		 : $ch eq "\&" ? \&$sym 
+		 : do {
+		     require Carp;
+		     Carp::croak("'$_' is not a valid variable name");
+		 });
+	} else {
+	    require Carp;
+	    Carp::croak("'$_' is not a valid variable name");
+	}
+    }
+};
+
+1;
+__END__
+
+=head1 NAME
+
+vars - Perl pragma to predeclare global variable names (obsolete)
+
+=head1 SYNOPSIS
+
+    use vars qw($frob @mung %seen);
+
+=head1 DESCRIPTION
+
+NOTE: For variables in the current package, the functionality provided
+by this pragma has been superseded by C<our> declarations, available
+in Perl v5.6.0 or later.  See L<perlfunc/our>.
+
+This will predeclare all the variables whose names are 
+in the list, allowing you to use them under "use strict", and
+disabling any typo warnings.
+
+Unlike pragmas that affect the C<$^H> hints variable, the C<use vars> and
+C<use subs> declarations are not BLOCK-scoped.  They are thus effective
+for the entire file in which they appear.  You may not rescind such
+declarations with C<no vars> or C<no subs>.
+
+Packages such as the B<AutoLoader> and B<SelfLoader> that delay
+loading of subroutines within packages can create problems with
+package lexicals defined using C<my()>. While the B<vars> pragma
+cannot duplicate the effect of package lexicals (total transparency
+outside of the package), it can act as an acceptable substitute by
+pre-declaring global symbols, ensuring their availability to the
+later-loaded routines.
+
+See L<perlmodlib/Pragmatic Modules>.
+
+=cut
Index: /for-distributions/trunk/bin/windows/perl/lib/vmsish.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/vmsish.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/vmsish.pm	(revision 14489)
@@ -0,0 +1,154 @@
+package vmsish;
+
+our $VERSION = '1.02';
+
+=head1 NAME
+
+vmsish - Perl pragma to control VMS-specific language features
+
+=head1 SYNOPSIS
+
+    use vmsish;
+
+    use vmsish 'status';	# or '$?'
+    use vmsish 'exit';
+    use vmsish 'time';
+
+    use vmsish 'hushed';
+    no vmsish 'hushed';
+    vmsish::hushed($hush);
+
+    use vmsish;
+    no vmsish 'time';
+
+=head1 DESCRIPTION
+
+If no import list is supplied, all possible VMS-specific features are
+assumed.  Currently, there are four VMS-specific features available:
+'status' (a.k.a '$?'), 'exit', 'time' and 'hushed'.
+
+If you're not running VMS, this module does nothing.
+
+=over 6
+
+=item C<vmsish status>
+
+This makes C<$?> and C<system> return the native VMS exit status
+instead of emulating the POSIX exit status.
+
+=item C<vmsish exit>
+
+This makes C<exit 1> produce a successful exit (with status SS$_NORMAL),
+instead of emulating UNIX exit(), which considers C<exit 1> to indicate
+an error.  As with the CRTL's exit() function, C<exit 0> is also mapped
+to an exit status of SS$_NORMAL, and any other argument to exit() is
+used directly as Perl's exit status.
+
+=item C<vmsish time>
+
+This makes all times relative to the local time zone, instead of the
+default of Universal Time (a.k.a Greenwich Mean Time, or GMT).
+
+=item C<vmsish hushed>
+
+This suppresses printing of VMS status messages to SYS$OUTPUT and
+SYS$ERROR if Perl terminates with an error status.  and allows
+programs that are expecting "unix-style" Perl to avoid having to parse
+VMS error messages.  It does not suppress any messages from Perl
+itself, just the messages generated by DCL after Perl exits.  The DCL
+symbol $STATUS will still have the termination status, but with a
+high-order bit set:
+
+EXAMPLE:
+    $ perl -e"exit 44;"                             Non-hushed error exit
+    %SYSTEM-F-ABORT, abort                          DCL message
+    $ show sym $STATUS
+      $STATUS == "%X0000002C"
+
+    $ perl -e"use vmsish qw(hushed); exit 44;"      Hushed error exit
+    $ show sym $STATUS
+      $STATUS == "%X1000002C"
+
+The 'hushed' flag has a global scope during compilation: the exit() or
+die() commands that are compiled after 'vmsish hushed' will be hushed
+when they are executed.  Doing a "no vmsish 'hushed'" turns off the
+hushed flag.
+
+The status of the hushed flag also affects output of VMS error
+messages from compilation errors.   Again, you still get the Perl
+error message (and the code in $STATUS)
+
+EXAMPLE:
+    use vmsish 'hushed';    # turn on hushed flag
+    use Carp;          # Carp compiled hushed
+    exit 44;           # will be hushed
+    croak('I die');    # will be hushed
+    no vmsish 'hushed';     # turn off hushed flag
+    exit 44;           # will not be hushed
+    croak('I die2'):   # WILL be hushed, croak was compiled hushed
+
+You can also control the 'hushed' flag at run-time, using the built-in
+routine vmsish::hushed().  Without argument, it returns the hushed status.
+Since vmsish::hushed is built-in, you do not need to "use vmsish" to call
+it.
+
+EXAMPLE:
+    if ($quiet_exit) {
+        vmsish::hushed(1);
+    } 
+    print "Sssshhhh...I'm hushed...\n" if vmsish::hushed();
+    exit 44;
+
+Note that an exit() or die() that is compiled 'hushed' because of "use
+vmsish" is not un-hushed by calling vmsish::hushed(0) at runtime.
+
+The messages from error exits from inside the Perl core are generally
+more serious, and are not suppressed.
+
+=back
+
+See L<perlmod/Pragmatic Modules>.
+
+=cut
+
+my $IsVMS = $^O eq 'VMS';
+
+sub bits {
+    my $bits = 0;
+    my $sememe;
+    foreach $sememe (@_) {
+	# Those hints are defined in vms/vmsish.h :
+	# HINT_M_VMSISH_STATUS and HINT_M_VMSISH_TIME
+        $bits |= 0x40000000, next if $sememe eq 'status' || $sememe eq '$?';
+	$bits |= 0x80000000, next if $sememe eq 'time';
+    }
+    $bits;
+}
+
+sub import {
+    return unless $IsVMS;
+
+    shift;
+    $^H |= bits(@_ ? @_ : qw(status time));
+    my $sememe;
+
+    foreach $sememe (@_ ? @_ : qw(exit hushed)) {
+        $^H{'vmsish_exit'}   = 1 if $sememe eq 'exit';
+        vmsish::hushed(1) if $sememe eq 'hushed';
+    }
+}
+
+sub unimport {
+    return unless $IsVMS;
+
+    shift;
+    $^H &= ~ bits(@_ ? @_ : qw(status time));
+    my $sememe;
+
+    foreach $sememe (@_ ? @_ : qw(exit hushed)) {
+        $^H{'vmsish_exit'}   = 0 if $sememe eq 'exit';
+        vmsish::hushed(0) if $sememe eq 'hushed';
+    }
+}
+
+1;
Index: /for-distributions/trunk/bin/windows/perl/lib/warnings.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/warnings.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/warnings.pm	(revision 14489)
@@ -0,0 +1,497 @@
+# -*- buffer-read-only: t -*-
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+# This file was created by warnings.pl
+# Any changes made here will be lost.
+#
+
+package warnings;
+
+our $VERSION = '1.05';
+
+=head1 NAME
+
+warnings - Perl pragma to control optional warnings
+
+=head1 SYNOPSIS
+
+    use warnings;
+    no warnings;
+
+    use warnings "all";
+    no warnings "all";
+
+    use warnings::register;
+    if (warnings::enabled()) {
+        warnings::warn("some warning");
+    }
+
+    if (warnings::enabled("void")) {
+        warnings::warn("void", "some warning");
+    }
+
+    if (warnings::enabled($object)) {
+        warnings::warn($object, "some warning");
+    }
+
+    warnings::warnif("some warning");
+    warnings::warnif("void", "some warning");
+    warnings::warnif($object, "some warning");
+
+=head1 DESCRIPTION
+
+The C<warnings> pragma is a replacement for the command line flag C<-w>,
+but the pragma is limited to the enclosing block, while the flag is global.
+See L<perllexwarn> for more information.
+
+If no import list is supplied, all possible warnings are either enabled
+or disabled.
+
+A number of functions are provided to assist module authors.
+
+=over 4
+
+=item use warnings::register
+
+Creates a new warnings category with the same name as the package where
+the call to the pragma is used.
+
+=item warnings::enabled()
+
+Use the warnings category with the same name as the current package.
+
+Return TRUE if that warnings category is enabled in the calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($category)
+
+Return TRUE if the warnings category, C<$category>, is enabled in the
+calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($object)
+
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
+
+Return TRUE if that warnings category is enabled in the first scope
+where the object is used.
+Otherwise returns FALSE.
+
+=item warnings::warn($message)
+
+Print C<$message> to STDERR.
+
+Use the warnings category with the same name as the current package.
+
+If that warnings category has been set to "FATAL" in the calling module
+then die. Otherwise return.
+
+=item warnings::warn($category, $message)
+
+Print C<$message> to STDERR.
+
+If the warnings category, C<$category>, has been set to "FATAL" in the
+calling module then die. Otherwise return.
+
+=item warnings::warn($object, $message)
+
+Print C<$message> to STDERR.
+
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
+
+If that warnings category has been set to "FATAL" in the scope where C<$object>
+is first used then die. Otherwise return.
+
+
+=item warnings::warnif($message)
+
+Equivalent to:
+
+    if (warnings::enabled())
+      { warnings::warn($message) }
+
+=item warnings::warnif($category, $message)
+
+Equivalent to:
+
+    if (warnings::enabled($category))
+      { warnings::warn($category, $message) }
+
+=item warnings::warnif($object, $message)
+
+Equivalent to:
+
+    if (warnings::enabled($object))
+      { warnings::warn($object, $message) }
+
+=back
+
+See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
+
+=cut
+
+use Carp ();
+
+our %Offsets = (
+
+    # Warnings Categories added in Perl 5.008
+
+    'all'		=> 0,
+    'closure'		=> 2,
+    'deprecated'	=> 4,
+    'exiting'		=> 6,
+    'glob'		=> 8,
+    'io'		=> 10,
+    'closed'		=> 12,
+    'exec'		=> 14,
+    'layer'		=> 16,
+    'newline'		=> 18,
+    'pipe'		=> 20,
+    'unopened'		=> 22,
+    'misc'		=> 24,
+    'numeric'		=> 26,
+    'once'		=> 28,
+    'overflow'		=> 30,
+    'pack'		=> 32,
+    'portable'		=> 34,
+    'recursion'		=> 36,
+    'redefine'		=> 38,
+    'regexp'		=> 40,
+    'severe'		=> 42,
+    'debugging'		=> 44,
+    'inplace'		=> 46,
+    'internal'		=> 48,
+    'malloc'		=> 50,
+    'signal'		=> 52,
+    'substr'		=> 54,
+    'syntax'		=> 56,
+    'ambiguous'		=> 58,
+    'bareword'		=> 60,
+    'digit'		=> 62,
+    'parenthesis'	=> 64,
+    'precedence'	=> 66,
+    'printf'		=> 68,
+    'prototype'		=> 70,
+    'qw'		=> 72,
+    'reserved'		=> 74,
+    'semicolon'		=> 76,
+    'taint'		=> 78,
+    'threads'		=> 80,
+    'uninitialized'	=> 82,
+    'unpack'		=> 84,
+    'untie'		=> 86,
+    'utf8'		=> 88,
+    'void'		=> 90,
+    'y2k'		=> 92,
+  );
+
+our %Bits = (
+    'all'		=> "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x15", # [0..46]
+    'ambiguous'		=> "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [29]
+    'bareword'		=> "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [30]
+    'closed'		=> "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
+    'closure'		=> "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
+    'debugging'		=> "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [22]
+    'deprecated'	=> "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
+    'digit'		=> "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [31]
+    'exec'		=> "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
+    'exiting'		=> "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
+    'glob'		=> "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
+    'inplace'		=> "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [23]
+    'internal'		=> "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [24]
+    'io'		=> "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..11]
+    'layer'		=> "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
+    'malloc'		=> "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [25]
+    'misc'		=> "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
+    'newline'		=> "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
+    'numeric'		=> "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
+    'once'		=> "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
+    'overflow'		=> "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
+    'pack'		=> "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [16]
+    'parenthesis'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [32]
+    'pipe'		=> "\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10]
+    'portable'		=> "\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [17]
+    'precedence'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [33]
+    'printf'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [34]
+    'prototype'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [35]
+    'qw'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [36]
+    'recursion'		=> "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [18]
+    'redefine'		=> "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [19]
+    'regexp'		=> "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [20]
+    'reserved'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [37]
+    'semicolon'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [38]
+    'severe'		=> "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00", # [21..25]
+    'signal'		=> "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [26]
+    'substr'		=> "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [27]
+    'syntax'		=> "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x00", # [28..38]
+    'taint'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [39]
+    'threads'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [40]
+    'uninitialized'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [41]
+    'unopened'		=> "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
+    'unpack'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [42]
+    'untie'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [43]
+    'utf8'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [44]
+    'void'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [45]
+    'y2k'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [46]
+  );
+
+our %DeadBits = (
+    'all'		=> "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x2a", # [0..46]
+    'ambiguous'		=> "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [29]
+    'bareword'		=> "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [30]
+    'closed'		=> "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
+    'closure'		=> "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
+    'debugging'		=> "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [22]
+    'deprecated'	=> "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
+    'digit'		=> "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [31]
+    'exec'		=> "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
+    'exiting'		=> "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
+    'glob'		=> "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
+    'inplace'		=> "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [23]
+    'internal'		=> "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [24]
+    'io'		=> "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..11]
+    'layer'		=> "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
+    'malloc'		=> "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [25]
+    'misc'		=> "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
+    'newline'		=> "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
+    'numeric'		=> "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
+    'once'		=> "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
+    'overflow'		=> "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
+    'pack'		=> "\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [16]
+    'parenthesis'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [32]
+    'pipe'		=> "\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10]
+    'portable'		=> "\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [17]
+    'precedence'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [33]
+    'printf'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [34]
+    'prototype'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [35]
+    'qw'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [36]
+    'recursion'		=> "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [18]
+    'redefine'		=> "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [19]
+    'regexp'		=> "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [20]
+    'reserved'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [37]
+    'semicolon'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [38]
+    'severe'		=> "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00", # [21..25]
+    'signal'		=> "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [26]
+    'substr'		=> "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [27]
+    'syntax'		=> "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x00", # [28..38]
+    'taint'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [39]
+    'threads'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [40]
+    'uninitialized'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [41]
+    'unopened'		=> "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
+    'unpack'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [42]
+    'untie'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [43]
+    'utf8'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [44]
+    'void'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [45]
+    'y2k'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [46]
+  );
+
+$NONE     = "\0\0\0\0\0\0\0\0\0\0\0\0";
+$LAST_BIT = 94 ;
+$BYTES    = 12 ;
+
+$All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
+
+sub Croaker
+{
+    local $Carp::CarpInternal{'warnings'};
+    delete $Carp::CarpInternal{'warnings'};
+    Carp::croak(@_);
+}
+
+sub bits
+{
+    # called from B::Deparse.pm
+
+    push @_, 'all' unless @_;
+
+    my $mask;
+    my $catmask ;
+    my $fatal = 0 ;
+    my $no_fatal = 0 ;
+
+    foreach my $word ( @_ ) {
+	if ($word eq 'FATAL') {
+	    $fatal = 1;
+	    $no_fatal = 0;
+	}
+	elsif ($word eq 'NONFATAL') {
+	    $fatal = 0;
+	    $no_fatal = 1;
+	}
+	elsif ($catmask = $Bits{$word}) {
+	    $mask |= $catmask ;
+	    $mask |= $DeadBits{$word} if $fatal ;
+	    $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
+	}
+	else
+          { Croaker("Unknown warnings category '$word'")}
+    }
+
+    return $mask ;
+}
+
+sub import 
+{
+    shift;
+
+    my $catmask ;
+    my $fatal = 0 ;
+    my $no_fatal = 0 ;
+
+    my $mask = ${^WARNING_BITS} ;
+
+    if (vec($mask, $Offsets{'all'}, 1)) {
+        $mask |= $Bits{'all'} ;
+        $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
+    }
+    
+    push @_, 'all' unless @_;
+
+    foreach my $word ( @_ ) {
+	if ($word eq 'FATAL') {
+	    $fatal = 1;
+	    $no_fatal = 0;
+	}
+	elsif ($word eq 'NONFATAL') {
+	    $fatal = 0;
+	    $no_fatal = 1;
+	}
+	elsif ($catmask = $Bits{$word}) {
+	    $mask |= $catmask ;
+	    $mask |= $DeadBits{$word} if $fatal ;
+	    $mask &= ~($DeadBits{$word}|$All) if $no_fatal ;
+	}
+	else
+          { Croaker("Unknown warnings category '$word'")}
+    }
+
+    ${^WARNING_BITS} = $mask ;
+}
+
+sub unimport 
+{
+    shift;
+
+    my $catmask ;
+    my $mask = ${^WARNING_BITS} ;
+
+    if (vec($mask, $Offsets{'all'}, 1)) {
+        $mask |= $Bits{'all'} ;
+        $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
+    }
+
+    push @_, 'all' unless @_;
+
+    foreach my $word ( @_ ) {
+	if ($word eq 'FATAL') {
+	    next; 
+	}
+	elsif ($catmask = $Bits{$word}) {
+	    $mask &= ~($catmask | $DeadBits{$word} | $All);
+	}
+	else
+          { Croaker("Unknown warnings category '$word'")}
+    }
+
+    ${^WARNING_BITS} = $mask ;
+}
+
+my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = ();
+
+sub __chk
+{
+    my $category ;
+    my $offset ;
+    my $isobj = 0 ;
+
+    if (@_) {
+        # check the category supplied.
+        $category = shift ;
+        if (my $type = ref $category) {
+            Croaker("not an object")
+                if exists $builtin_type{$type};
+	    $category = $type;
+            $isobj = 1 ;
+        }
+        $offset = $Offsets{$category};
+        Croaker("Unknown warnings category '$category'")
+	    unless defined $offset;
+    }
+    else {
+        $category = (caller(1))[0] ;
+        $offset = $Offsets{$category};
+        Croaker("package '$category' not registered for warnings")
+	    unless defined $offset ;
+    }
+
+    my $this_pkg = (caller(1))[0] ;
+    my $i = 2 ;
+    my $pkg ;
+
+    if ($isobj) {
+        while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
+            last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
+        }
+	$i -= 2 ;
+    }
+    else {
+        for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
+            last if $pkg ne $this_pkg ;
+        }
+        $i = 2
+            if !$pkg || $pkg eq $this_pkg ;
+    }
+
+    my $callers_bitmask = (caller($i))[9] ;
+    return ($callers_bitmask, $offset, $i) ;
+}
+
+sub enabled
+{
+    Croaker("Usage: warnings::enabled([category])")
+	unless @_ == 1 || @_ == 0 ;
+
+    my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+
+    return 0 unless defined $callers_bitmask ;
+    return vec($callers_bitmask, $offset, 1) ||
+           vec($callers_bitmask, $Offsets{'all'}, 1) ;
+}
+
+
+sub warn
+{
+    Croaker("Usage: warnings::warn([category,] 'message')")
+	unless @_ == 2 || @_ == 1 ;
+
+    my $message = pop ;
+    my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+    Carp::croak($message)
+	if vec($callers_bitmask, $offset+1, 1) ||
+	   vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+    Carp::carp($message) ;
+}
+
+sub warnif
+{
+    Croaker("Usage: warnings::warnif([category,] 'message')")
+	unless @_ == 2 || @_ == 1 ;
+
+    my $message = pop ;
+    my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+
+    return
+        unless defined $callers_bitmask &&
+            	(vec($callers_bitmask, $offset, 1) ||
+            	vec($callers_bitmask, $Offsets{'all'}, 1)) ;
+
+    Carp::croak($message)
+	if vec($callers_bitmask, $offset+1, 1) ||
+	   vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+
+    Carp::carp($message) ;
+}
+
+1;
+# ex: set ro:
Index: /for-distributions/trunk/bin/windows/perl/lib/warnings/register.pm
===================================================================
--- /for-distributions/trunk/bin/windows/perl/lib/warnings/register.pm	(revision 14489)
+++ /for-distributions/trunk/bin/windows/perl/lib/warnings/register.pm	(revision 14489)
@@ -0,0 +1,51 @@
+package warnings::register;
+
+our $VERSION = '1.01';
+
+=pod
+
+=head1 NAME
+
+warnings::register - warnings import function
+
+=head1 SYNOPSIS
+
+    use warnings::register;
+
+=head1 DESCRIPTION
+
+Creates a warnings category with the same name as the current package.
+
+See L<warnings> and L<perllexwarn> for more information on this module's
+usage.
+
+=cut
+
+require warnings;
+
+sub mkMask
+{
+    my ($bit) = @_;
+    my $mask = "";
+
+    vec($mask, $bit, 1) = 1;
+    return $mask;
+}
+
+sub import
+{
+    shift;
+    my $package = (caller(0))[0];
+    if (! defined $warnings::Bits{$package}) {
+        $warnings::Bits{$package}     = mkMask($warnings::LAST_BIT);
+        vec($warnings::Bits{'all'}, $warnings::LAST_BIT, 1) = 1;
+        $warnings::Offsets{$package}  = $warnings::LAST_BIT ++;
+	foreach my $k (keys %warnings::Bits) {
+	    vec($warnings::Bits{$k}, $warnings::LAST_BIT, 1) = 0;
+	}
+        $warnings::DeadBits{$package} = mkMask($warnings::LAST_BIT);
+        vec($warnings::DeadBits{'all'}, $warnings::LAST_BIT++, 1) = 1;
+    }
+}
+
+1;
